From c6e27383b0bfa94149b460170e2dcc59282a1b3b Mon Sep 17 00:00:00 2001 From: Nick Nellis Date: Sun, 10 Jun 2018 19:52:49 -0500 Subject: [PATCH] initial commit, vistio --- .circleci/config.yml | 57 + .gitignore | 2 + .vscode/launch.json | 21 + LICENSE | 20 + README.md | 81 + api/Dockerfile | 9 + api/Gopkg.lock | 184 + api/Gopkg.toml | 11 + api/Makefile | 20 + api/api/api.go | 234 + api/api/api_test.go | 1 + api/cache/cache.go | 160 + api/cache/cache_test.go | 1 + api/cache/cachemock/Cache.go | 47 + api/cmd/k8s-config-reloader/.gitignore | 1 + api/cmd/k8s-config-reloader/Dockerfile | 7 + api/cmd/k8s-config-reloader/Gopkg.lock | 69 + api/cmd/k8s-config-reloader/Gopkg.toml | 15 + api/cmd/k8s-config-reloader/Makefile | 12 + api/cmd/k8s-config-reloader/main.go | 168 + .../github.com/alecthomas/template/LICENSE | 27 + .../github.com/alecthomas/template/README.md | 25 + .../github.com/alecthomas/template/doc.go | 406 + .../alecthomas/template/example_test.go | 72 + .../alecthomas/template/examplefiles_test.go | 183 + .../alecthomas/template/examplefunc_test.go | 55 + .../github.com/alecthomas/template/exec.go | 845 + .../alecthomas/template/exec_test.go | 1044 + .../github.com/alecthomas/template/funcs.go | 598 + .../github.com/alecthomas/template/helper.go | 108 + .../alecthomas/template/multi_test.go | 293 + .../alecthomas/template/parse/lex.go | 556 + .../alecthomas/template/parse/lex_test.go | 468 + .../alecthomas/template/parse/node.go | 834 + .../alecthomas/template/parse/parse.go | 700 + .../alecthomas/template/parse/parse_test.go | 426 + .../alecthomas/template/template.go | 218 + .../alecthomas/template/testdata/file1.tmpl | 2 + .../alecthomas/template/testdata/file2.tmpl | 2 + .../alecthomas/template/testdata/tmpl1.tmpl | 3 + .../alecthomas/template/testdata/tmpl2.tmpl | 3 + .../github.com/alecthomas/units/COPYING | 19 + .../github.com/alecthomas/units/README.md | 11 + .../github.com/alecthomas/units/bytes.go | 83 + .../github.com/alecthomas/units/bytes_test.go | 49 + .../vendor/github.com/alecthomas/units/doc.go | 13 + .../vendor/github.com/alecthomas/units/si.go | 26 + .../github.com/alecthomas/units/util.go | 138 + .../github.com/cenkalti/backoff/.gitignore | 22 + .../github.com/cenkalti/backoff/.travis.yml | 9 + .../github.com/cenkalti/backoff/LICENSE | 20 + .../github.com/cenkalti/backoff/README.md | 30 + .../github.com/cenkalti/backoff/backoff.go | 66 + .../cenkalti/backoff/backoff_test.go | 27 + .../github.com/cenkalti/backoff/context.go | 60 + .../cenkalti/backoff/context_test.go | 26 + .../cenkalti/backoff/example_test.go | 73 + .../cenkalti/backoff/exponential.go | 156 + .../cenkalti/backoff/exponential_test.go | 108 + .../github.com/cenkalti/backoff/retry.go | 78 + .../github.com/cenkalti/backoff/retry_test.go | 99 + .../github.com/cenkalti/backoff/ticker.go | 81 + .../cenkalti/backoff/ticker_test.go | 94 + .../github.com/cenkalti/backoff/tries.go | 35 + .../github.com/cenkalti/backoff/tries_test.go | 55 + .../atomic/.github/PULL_REQUEST_TEMPLATE.md | 8 + .../vendor/go.uber.org/atomic/.gitignore | 11 + .../vendor/go.uber.org/atomic/.travis.yml | 21 + .../vendor/go.uber.org/atomic/LICENSE.txt | 19 + .../vendor/go.uber.org/atomic/Makefile | 64 + .../vendor/go.uber.org/atomic/README.md | 34 + .../vendor/go.uber.org/atomic/atomic.go | 304 + .../vendor/go.uber.org/atomic/atomic_test.go | 147 + .../vendor/go.uber.org/atomic/example_test.go | 43 + .../vendor/go.uber.org/atomic/glide.lock | 17 + .../vendor/go.uber.org/atomic/glide.yaml | 6 + .../go.uber.org/atomic/scripts/cover.sh | 40 + .../go.uber.org/atomic/scripts/test-ubergo.sh | 26 + .../vendor/go.uber.org/atomic/stress_test.go | 140 + .../vendor/go.uber.org/atomic/string.go | 51 + .../vendor/go.uber.org/atomic/string_test.go | 43 + .../vendor/go.uber.org/multierr/.codecov.yml | 15 + .../vendor/go.uber.org/multierr/.gitignore | 1 + .../vendor/go.uber.org/multierr/.travis.yml | 33 + .../vendor/go.uber.org/multierr/CHANGELOG.md | 28 + .../vendor/go.uber.org/multierr/LICENSE.txt | 19 + .../vendor/go.uber.org/multierr/Makefile | 74 + .../vendor/go.uber.org/multierr/README.md | 23 + .../go.uber.org/multierr/benchmarks_test.go | 62 + .../vendor/go.uber.org/multierr/error.go | 401 + .../vendor/go.uber.org/multierr/error_test.go | 511 + .../go.uber.org/multierr/example_test.go | 72 + .../vendor/go.uber.org/multierr/glide.lock | 19 + .../vendor/go.uber.org/multierr/glide.yaml | 8 + .../go.uber.org/multierr/scripts/cover.sh | 40 + .../vendor/go.uber.org/zap/.codecov.yml | 17 + .../vendor/go.uber.org/zap/.gitignore | 28 + .../vendor/go.uber.org/zap/.readme.tmpl | 108 + .../vendor/go.uber.org/zap/.travis.yml | 23 + .../vendor/go.uber.org/zap/CHANGELOG.md | 270 + .../vendor/go.uber.org/zap/CODE_OF_CONDUCT.md | 75 + .../vendor/go.uber.org/zap/CONTRIBUTING.md | 81 + .../vendor/go.uber.org/zap/FAQ.md | 140 + .../vendor/go.uber.org/zap/LICENSE.txt | 19 + .../vendor/go.uber.org/zap/Makefile | 76 + .../vendor/go.uber.org/zap/README.md | 136 + .../vendor/go.uber.org/zap/array.go | 320 + .../vendor/go.uber.org/zap/array_test.go | 107 + .../go.uber.org/zap/benchmarks/apex_test.go | 57 + .../vendor/go.uber.org/zap/benchmarks/doc.go | 23 + .../go.uber.org/zap/benchmarks/kit_test.go | 31 + .../go.uber.org/zap/benchmarks/lion_test.go | 31 + .../go.uber.org/zap/benchmarks/log15_test.go | 33 + .../go.uber.org/zap/benchmarks/logrus_test.go | 57 + .../zap/benchmarks/scenario_bench_test.go | 614 + .../go.uber.org/zap/benchmarks/zap_test.go | 172 + .../zap/benchmarks/zerolog_test.go | 63 + .../vendor/go.uber.org/zap/buffer/buffer.go | 106 + .../go.uber.org/zap/buffer/buffer_test.go | 91 + .../vendor/go.uber.org/zap/buffer/pool.go | 49 + .../go.uber.org/zap/buffer/pool_test.go | 52 + .../vendor/go.uber.org/zap/check_license.sh | 17 + .../vendor/go.uber.org/zap/common_test.go | 57 + .../vendor/go.uber.org/zap/config.go | 243 + .../vendor/go.uber.org/zap/config_test.go | 108 + .../vendor/go.uber.org/zap/doc.go | 113 + .../vendor/go.uber.org/zap/encoder.go | 75 + .../vendor/go.uber.org/zap/encoder_test.go | 88 + .../vendor/go.uber.org/zap/error.go | 80 + .../vendor/go.uber.org/zap/error_test.go | 99 + .../vendor/go.uber.org/zap/example_test.go | 327 + .../vendor/go.uber.org/zap/field.go | 306 + .../vendor/go.uber.org/zap/field_test.go | 159 + .../vendor/go.uber.org/zap/flag.go | 39 + .../vendor/go.uber.org/zap/flag_test.go | 102 + .../vendor/go.uber.org/zap/glide.lock | 76 + .../vendor/go.uber.org/zap/glide.yaml | 35 + .../vendor/go.uber.org/zap/global.go | 139 + .../vendor/go.uber.org/zap/global_test.go | 189 + .../vendor/go.uber.org/zap/http_handler.go | 81 + .../go.uber.org/zap/http_handler_test.go | 131 + .../zap/internal/bufferpool/bufferpool.go | 31 + .../go.uber.org/zap/internal/color/color.go | 44 + .../zap/internal/color/color_test.go | 36 + .../go.uber.org/zap/internal/exit/exit.go | 64 + .../zap/internal/exit/exit_test.go | 42 + .../go.uber.org/zap/internal/readme/readme.go | 212 + .../vendor/go.uber.org/zap/level.go | 132 + .../vendor/go.uber.org/zap/level_test.go | 117 + .../vendor/go.uber.org/zap/logger.go | 305 + .../go.uber.org/zap/logger_bench_test.go | 222 + .../vendor/go.uber.org/zap/logger_test.go | 432 + .../vendor/go.uber.org/zap/options.go | 109 + .../vendor/go.uber.org/zap/scripts/cover.sh | 12 + .../vendor/go.uber.org/zap/stacktrace.go | 126 + .../go.uber.org/zap/stacktrace_ext_test.go | 161 + .../vendor/go.uber.org/zap/stacktrace_test.go | 75 + .../vendor/go.uber.org/zap/sugar.go | 304 + .../vendor/go.uber.org/zap/sugar_test.go | 374 + .../vendor/go.uber.org/zap/time.go | 27 + .../vendor/go.uber.org/zap/time_test.go | 42 + .../vendor/go.uber.org/zap/writer.go | 96 + .../vendor/go.uber.org/zap/writer_test.go | 125 + .../zap/zapcore/console_encoder.go | 147 + .../zap/zapcore/console_encoder_bench_test.go | 49 + .../vendor/go.uber.org/zap/zapcore/core.go | 113 + .../go.uber.org/zap/zapcore/core_test.go | 163 + .../vendor/go.uber.org/zap/zapcore/doc.go | 24 + .../vendor/go.uber.org/zap/zapcore/encoder.go | 348 + .../go.uber.org/zap/zapcore/encoder_test.go | 636 + .../vendor/go.uber.org/zap/zapcore/entry.go | 257 + .../go.uber.org/zap/zapcore/entry_test.go | 107 + .../vendor/go.uber.org/zap/zapcore/error.go | 120 + .../go.uber.org/zap/zapcore/error_test.go | 177 + .../vendor/go.uber.org/zap/zapcore/field.go | 201 + .../go.uber.org/zap/zapcore/field_test.go | 231 + .../vendor/go.uber.org/zap/zapcore/hook.go | 68 + .../go.uber.org/zap/zapcore/hook_test.go | 73 + .../go.uber.org/zap/zapcore/json_encoder.go | 480 + .../zap/zapcore/json_encoder_bench_test.go | 91 + .../zap/zapcore/json_encoder_impl_test.go | 475 + .../vendor/go.uber.org/zap/zapcore/level.go | 175 + .../go.uber.org/zap/zapcore/level_strings.go | 46 + .../zap/zapcore/level_strings_test.go | 38 + .../go.uber.org/zap/zapcore/level_test.go | 177 + .../go.uber.org/zap/zapcore/marshaler.go | 53 + .../go.uber.org/zap/zapcore/memory_encoder.go | 179 + .../zap/zapcore/memory_encoder_test.go | 283 + .../vendor/go.uber.org/zap/zapcore/sampler.go | 134 + .../zap/zapcore/sampler_bench_test.go | 230 + .../go.uber.org/zap/zapcore/sampler_test.go | 225 + .../vendor/go.uber.org/zap/zapcore/tee.go | 81 + .../zap/zapcore/tee_logger_bench_test.go | 62 + .../go.uber.org/zap/zapcore/tee_test.go | 153 + .../go.uber.org/zap/zapcore/write_syncer.go | 123 + .../zap/zapcore/write_syncer_bench_test.go | 56 + .../zap/zapcore/write_syncer_test.go | 137 + .../vendor/go.uber.org/zap/zapgrpc/zapgrpc.go | 100 + .../go.uber.org/zap/zapgrpc/zapgrpc_test.go | 115 + .../vendor/go.uber.org/zap/zaptest/doc.go | 27 + .../zap/zaptest/observer/logged_entry.go | 39 + .../zap/zaptest/observer/logged_entry_test.go | 88 + .../zap/zaptest/observer/observer.go | 167 + .../zap/zaptest/observer/observer_test.go | 215 + .../vendor/go.uber.org/zap/zaptest/timeout.go | 51 + .../vendor/go.uber.org/zap/zaptest/writer.go | 96 + .../vendor/golang.org/x/net/.gitattributes | 10 + .../vendor/golang.org/x/net/.gitignore | 2 + .../vendor/golang.org/x/net/AUTHORS | 3 + .../vendor/golang.org/x/net/CONTRIBUTING.md | 31 + .../vendor/golang.org/x/net/CONTRIBUTORS | 3 + .../vendor/golang.org/x/net/LICENSE | 27 + .../vendor/golang.org/x/net/PATENTS | 22 + .../vendor/golang.org/x/net/README.md | 16 + .../vendor/golang.org/x/net/bpf/asm.go | 41 + .../vendor/golang.org/x/net/bpf/constants.go | 218 + .../vendor/golang.org/x/net/bpf/doc.go | 82 + .../golang.org/x/net/bpf/instructions.go | 704 + .../golang.org/x/net/bpf/instructions_test.go | 525 + .../vendor/golang.org/x/net/bpf/setter.go | 10 + .../x/net/bpf/testdata/all_instructions.bpf | 1 + .../x/net/bpf/testdata/all_instructions.txt | 79 + .../vendor/golang.org/x/net/bpf/vm.go | 140 + .../golang.org/x/net/bpf/vm_aluop_test.go | 512 + .../golang.org/x/net/bpf/vm_bpf_test.go | 192 + .../golang.org/x/net/bpf/vm_extension_test.go | 49 + .../golang.org/x/net/bpf/vm_instructions.go | 174 + .../golang.org/x/net/bpf/vm_jump_test.go | 380 + .../golang.org/x/net/bpf/vm_load_test.go | 246 + .../golang.org/x/net/bpf/vm_ret_test.go | 115 + .../golang.org/x/net/bpf/vm_scratch_test.go | 247 + .../vendor/golang.org/x/net/bpf/vm_test.go | 144 + .../vendor/golang.org/x/net/codereview.cfg | 1 + .../golang.org/x/net/context/context.go | 54 + .../golang.org/x/net/context/context_test.go | 583 + .../x/net/context/ctxhttp/ctxhttp.go | 74 + .../x/net/context/ctxhttp/ctxhttp_17_test.go | 29 + .../x/net/context/ctxhttp/ctxhttp_pre17.go | 147 + .../net/context/ctxhttp/ctxhttp_pre17_test.go | 79 + .../x/net/context/ctxhttp/ctxhttp_test.go | 105 + .../vendor/golang.org/x/net/context/go17.go | 72 + .../vendor/golang.org/x/net/context/go19.go | 20 + .../golang.org/x/net/context/pre_go17.go | 300 + .../golang.org/x/net/context/pre_go19.go | 109 + .../x/net/context/withtimeout_test.go | 31 + .../vendor/golang.org/x/net/dict/dict.go | 210 + .../x/net/dns/dnsmessage/example_test.go | 132 + .../x/net/dns/dnsmessage/message.go | 1997 ++ .../x/net/dns/dnsmessage/message_test.go | 1116 + .../vendor/golang.org/x/net/html/atom/atom.go | 78 + .../golang.org/x/net/html/atom/atom_test.go | 109 + .../vendor/golang.org/x/net/html/atom/gen.go | 709 + .../golang.org/x/net/html/atom/table.go | 777 + .../golang.org/x/net/html/atom/table_test.go | 373 + .../golang.org/x/net/html/charset/charset.go | 257 + .../x/net/html/charset/charset_test.go | 237 + .../html/charset/testdata/HTTP-charset.html | 48 + .../charset/testdata/HTTP-vs-UTF-8-BOM.html | 48 + .../testdata/HTTP-vs-meta-charset.html | 49 + .../testdata/HTTP-vs-meta-content.html | 49 + .../testdata/No-encoding-declaration.html | 47 + .../x/net/html/charset/testdata/README | 9 + .../html/charset/testdata/UTF-16BE-BOM.html | Bin 0 -> 2670 bytes .../html/charset/testdata/UTF-16LE-BOM.html | Bin 0 -> 2682 bytes .../testdata/UTF-8-BOM-vs-meta-charset.html | 49 + .../testdata/UTF-8-BOM-vs-meta-content.html | 48 + .../testdata/meta-charset-attribute.html | 48 + .../testdata/meta-content-attribute.html | 48 + .../vendor/golang.org/x/net/html/const.go | 104 + .../vendor/golang.org/x/net/html/doc.go | 106 + .../vendor/golang.org/x/net/html/doctype.go | 156 + .../vendor/golang.org/x/net/html/entity.go | 2253 ++ .../golang.org/x/net/html/entity_test.go | 29 + .../vendor/golang.org/x/net/html/escape.go | 258 + .../golang.org/x/net/html/escape_test.go | 97 + .../golang.org/x/net/html/example_test.go | 40 + .../vendor/golang.org/x/net/html/foreign.go | 226 + .../vendor/golang.org/x/net/html/node.go | 193 + .../vendor/golang.org/x/net/html/node_test.go | 146 + .../vendor/golang.org/x/net/html/parse.go | 2094 ++ .../golang.org/x/net/html/parse_test.go | 388 + .../vendor/golang.org/x/net/html/render.go | 271 + .../golang.org/x/net/html/render_test.go | 156 + .../golang.org/x/net/html/testdata/go1.html | 2237 ++ .../x/net/html/testdata/webkit/README | 28 + .../x/net/html/testdata/webkit/adoption01.dat | 194 + .../x/net/html/testdata/webkit/adoption02.dat | 31 + .../x/net/html/testdata/webkit/comments01.dat | 135 + .../x/net/html/testdata/webkit/doctype01.dat | 370 + .../x/net/html/testdata/webkit/entities01.dat | 603 + .../x/net/html/testdata/webkit/entities02.dat | 249 + .../html/testdata/webkit/html5test-com.dat | 246 + .../x/net/html/testdata/webkit/inbody01.dat | 43 + .../x/net/html/testdata/webkit/isindex.dat | 40 + ...pending-spec-changes-plain-text-unsafe.dat | Bin 0 -> 115 bytes .../testdata/webkit/pending-spec-changes.dat | 52 + .../testdata/webkit/plain-text-unsafe.dat | Bin 0 -> 4166 bytes .../net/html/testdata/webkit/scriptdata01.dat | 308 + .../testdata/webkit/scripted/adoption01.dat | 15 + .../testdata/webkit/scripted/webkit01.dat | 28 + .../x/net/html/testdata/webkit/tables01.dat | 212 + .../x/net/html/testdata/webkit/tests1.dat | 1952 ++ .../x/net/html/testdata/webkit/tests10.dat | 799 + .../x/net/html/testdata/webkit/tests11.dat | 482 + .../x/net/html/testdata/webkit/tests12.dat | 62 + .../x/net/html/testdata/webkit/tests14.dat | 74 + .../x/net/html/testdata/webkit/tests15.dat | 208 + .../x/net/html/testdata/webkit/tests16.dat | 2299 ++ .../x/net/html/testdata/webkit/tests17.dat | 153 + .../x/net/html/testdata/webkit/tests18.dat | 269 + .../x/net/html/testdata/webkit/tests19.dat | 1237 ++ .../x/net/html/testdata/webkit/tests2.dat | 763 + .../x/net/html/testdata/webkit/tests20.dat | 455 + .../x/net/html/testdata/webkit/tests21.dat | 221 + .../x/net/html/testdata/webkit/tests22.dat | 157 + .../x/net/html/testdata/webkit/tests23.dat | 155 + .../x/net/html/testdata/webkit/tests24.dat | 79 + .../x/net/html/testdata/webkit/tests25.dat | 219 + .../x/net/html/testdata/webkit/tests26.dat | 313 + .../x/net/html/testdata/webkit/tests3.dat | 305 + .../x/net/html/testdata/webkit/tests4.dat | 59 + .../x/net/html/testdata/webkit/tests5.dat | 191 + .../x/net/html/testdata/webkit/tests6.dat | 663 + .../x/net/html/testdata/webkit/tests7.dat | 390 + .../x/net/html/testdata/webkit/tests8.dat | 148 + .../x/net/html/testdata/webkit/tests9.dat | 457 + .../testdata/webkit/tests_innerHTML_1.dat | 741 + .../x/net/html/testdata/webkit/tricky01.dat | 261 + .../x/net/html/testdata/webkit/webkit01.dat | 610 + .../x/net/html/testdata/webkit/webkit02.dat | 159 + .../vendor/golang.org/x/net/html/token.go | 1219 ++ .../golang.org/x/net/html/token_test.go | 748 + .../vendor/golang.org/x/net/http2/.gitignore | 2 + .../vendor/golang.org/x/net/http2/Dockerfile | 51 + .../vendor/golang.org/x/net/http2/Makefile | 3 + .../vendor/golang.org/x/net/http2/README | 20 + .../vendor/golang.org/x/net/http2/ciphers.go | 641 + .../golang.org/x/net/http2/ciphers_test.go | 309 + .../x/net/http2/client_conn_pool.go | 256 + .../x/net/http2/configure_transport.go | 80 + .../golang.org/x/net/http2/databuffer.go | 146 + .../golang.org/x/net/http2/databuffer_test.go | 157 + .../vendor/golang.org/x/net/http2/errors.go | 133 + .../golang.org/x/net/http2/errors_test.go | 24 + .../vendor/golang.org/x/net/http2/flow.go | 50 + .../golang.org/x/net/http2/flow_test.go | 53 + .../vendor/golang.org/x/net/http2/frame.go | 1579 ++ .../golang.org/x/net/http2/frame_test.go | 1191 ++ .../vendor/golang.org/x/net/http2/go16.go | 16 + .../vendor/golang.org/x/net/http2/go17.go | 106 + .../golang.org/x/net/http2/go17_not18.go | 36 + .../vendor/golang.org/x/net/http2/go18.go | 56 + .../golang.org/x/net/http2/go18_test.go | 79 + .../vendor/golang.org/x/net/http2/go19.go | 16 + .../golang.org/x/net/http2/go19_test.go | 60 + .../vendor/golang.org/x/net/http2/gotrack.go | 170 + .../golang.org/x/net/http2/gotrack_test.go | 33 + .../golang.org/x/net/http2/h2demo/.gitignore | 5 + .../golang.org/x/net/http2/h2demo/Makefile | 8 + .../golang.org/x/net/http2/h2demo/README | 16 + .../golang.org/x/net/http2/h2demo/h2demo.go | 538 + .../golang.org/x/net/http2/h2demo/launch.go | 302 + .../golang.org/x/net/http2/h2demo/rootCA.key | 27 + .../golang.org/x/net/http2/h2demo/rootCA.pem | 26 + .../golang.org/x/net/http2/h2demo/rootCA.srl | 1 + .../golang.org/x/net/http2/h2demo/server.crt | 20 + .../golang.org/x/net/http2/h2demo/server.key | 27 + .../golang.org/x/net/http2/h2demo/tmpl.go | 1991 ++ .../golang.org/x/net/http2/h2i/README.md | 97 + .../vendor/golang.org/x/net/http2/h2i/h2i.go | 522 + .../golang.org/x/net/http2/headermap.go | 78 + .../golang.org/x/net/http2/hpack/encode.go | 240 + .../x/net/http2/hpack/encode_test.go | 386 + .../golang.org/x/net/http2/hpack/hpack.go | 490 + .../x/net/http2/hpack/hpack_test.go | 722 + .../golang.org/x/net/http2/hpack/huffman.go | 212 + .../golang.org/x/net/http2/hpack/tables.go | 479 + .../x/net/http2/hpack/tables_test.go | 214 + .../vendor/golang.org/x/net/http2/http2.go | 391 + .../golang.org/x/net/http2/http2_test.go | 199 + .../vendor/golang.org/x/net/http2/not_go16.go | 21 + .../vendor/golang.org/x/net/http2/not_go17.go | 87 + .../vendor/golang.org/x/net/http2/not_go18.go | 29 + .../vendor/golang.org/x/net/http2/not_go19.go | 16 + .../vendor/golang.org/x/net/http2/pipe.go | 163 + .../golang.org/x/net/http2/pipe_test.go | 130 + .../vendor/golang.org/x/net/http2/server.go | 2857 +++ .../x/net/http2/server_push_test.go | 521 + .../golang.org/x/net/http2/server_test.go | 3721 ++++ .../testdata/draft-ietf-httpbis-http2.xml | 5021 +++++ .../golang.org/x/net/http2/transport.go | 2275 ++ .../golang.org/x/net/http2/transport_test.go | 3686 ++++ .../vendor/golang.org/x/net/http2/write.go | 370 + .../golang.org/x/net/http2/writesched.go | 242 + .../x/net/http2/writesched_priority.go | 452 + .../x/net/http2/writesched_priority_test.go | 541 + .../x/net/http2/writesched_random.go | 72 + .../x/net/http2/writesched_random_test.go | 44 + .../golang.org/x/net/http2/writesched_test.go | 125 + .../golang.org/x/net/http2/z_spec_test.go | 356 + .../golang.org/x/net/icmp/dstunreach.go | 41 + .../vendor/golang.org/x/net/icmp/echo.go | 45 + .../vendor/golang.org/x/net/icmp/endpoint.go | 113 + .../golang.org/x/net/icmp/example_test.go | 63 + .../vendor/golang.org/x/net/icmp/extension.go | 89 + .../golang.org/x/net/icmp/extension_test.go | 259 + .../golang.org/x/net/icmp/helper_posix.go | 75 + .../vendor/golang.org/x/net/icmp/interface.go | 236 + .../vendor/golang.org/x/net/icmp/ipv4.go | 61 + .../vendor/golang.org/x/net/icmp/ipv4_test.go | 83 + .../vendor/golang.org/x/net/icmp/ipv6.go | 23 + .../golang.org/x/net/icmp/listen_posix.go | 100 + .../golang.org/x/net/icmp/listen_stub.go | 33 + .../vendor/golang.org/x/net/icmp/message.go | 152 + .../golang.org/x/net/icmp/message_test.go | 134 + .../golang.org/x/net/icmp/messagebody.go | 41 + .../vendor/golang.org/x/net/icmp/mpls.go | 77 + .../vendor/golang.org/x/net/icmp/multipart.go | 109 + .../golang.org/x/net/icmp/multipart_test.go | 442 + .../golang.org/x/net/icmp/packettoobig.go | 43 + .../vendor/golang.org/x/net/icmp/paramprob.go | 63 + .../vendor/golang.org/x/net/icmp/ping_test.go | 200 + .../golang.org/x/net/icmp/sys_freebsd.go | 11 + .../golang.org/x/net/icmp/timeexceeded.go | 39 + .../golang.org/x/net/idna/example_test.go | 70 + .../vendor/golang.org/x/net/idna/idna.go | 680 + .../vendor/golang.org/x/net/idna/idna_test.go | 108 + .../vendor/golang.org/x/net/idna/punycode.go | 203 + .../golang.org/x/net/idna/punycode_test.go | 198 + .../vendor/golang.org/x/net/idna/tables.go | 4477 ++++ .../vendor/golang.org/x/net/idna/trie.go | 72 + .../vendor/golang.org/x/net/idna/trieval.go | 114 + .../golang.org/x/net/internal/iana/const.go | 180 + .../golang.org/x/net/internal/iana/gen.go | 293 + .../x/net/internal/nettest/helper_bsd.go | 53 + .../x/net/internal/nettest/helper_nobsd.go | 15 + .../x/net/internal/nettest/helper_posix.go | 31 + .../x/net/internal/nettest/helper_stub.go | 32 + .../x/net/internal/nettest/helper_unix.go | 29 + .../x/net/internal/nettest/helper_windows.go | 42 + .../x/net/internal/nettest/interface.go | 94 + .../x/net/internal/nettest/rlimit.go | 11 + .../x/net/internal/nettest/stack.go | 147 + .../x/net/internal/socket/cmsghdr.go | 11 + .../x/net/internal/socket/cmsghdr_bsd.go | 13 + .../internal/socket/cmsghdr_linux_32bit.go | 14 + .../internal/socket/cmsghdr_linux_64bit.go | 14 + .../internal/socket/cmsghdr_solaris_64bit.go | 14 + .../x/net/internal/socket/cmsghdr_stub.go | 17 + .../x/net/internal/socket/defs_darwin.go | 44 + .../x/net/internal/socket/defs_dragonfly.go | 44 + .../x/net/internal/socket/defs_freebsd.go | 44 + .../x/net/internal/socket/defs_linux.go | 49 + .../x/net/internal/socket/defs_netbsd.go | 47 + .../x/net/internal/socket/defs_openbsd.go | 44 + .../x/net/internal/socket/defs_solaris.go | 44 + .../x/net/internal/socket/error_unix.go | 31 + .../x/net/internal/socket/error_windows.go | 26 + .../x/net/internal/socket/iovec_32bit.go | 19 + .../x/net/internal/socket/iovec_64bit.go | 19 + .../internal/socket/iovec_solaris_64bit.go | 19 + .../x/net/internal/socket/iovec_stub.go | 11 + .../x/net/internal/socket/mmsghdr_stub.go | 21 + .../x/net/internal/socket/mmsghdr_unix.go | 42 + .../x/net/internal/socket/msghdr_bsd.go | 39 + .../x/net/internal/socket/msghdr_bsdvar.go | 16 + .../x/net/internal/socket/msghdr_linux.go | 36 + .../net/internal/socket/msghdr_linux_32bit.go | 24 + .../net/internal/socket/msghdr_linux_64bit.go | 24 + .../x/net/internal/socket/msghdr_openbsd.go | 14 + .../internal/socket/msghdr_solaris_64bit.go | 36 + .../x/net/internal/socket/msghdr_stub.go | 14 + .../x/net/internal/socket/rawconn.go | 66 + .../x/net/internal/socket/rawconn_mmsg.go | 74 + .../x/net/internal/socket/rawconn_msg.go | 77 + .../x/net/internal/socket/rawconn_nommsg.go | 18 + .../x/net/internal/socket/rawconn_nomsg.go | 18 + .../x/net/internal/socket/rawconn_stub.go | 25 + .../x/net/internal/socket/reflect.go | 62 + .../x/net/internal/socket/socket.go | 285 + .../net/internal/socket/socket_go1_9_test.go | 259 + .../x/net/internal/socket/socket_test.go | 46 + .../golang.org/x/net/internal/socket/sys.go | 33 + .../x/net/internal/socket/sys_bsd.go | 17 + .../x/net/internal/socket/sys_bsdvar.go | 14 + .../x/net/internal/socket/sys_darwin.go | 7 + .../x/net/internal/socket/sys_dragonfly.go | 7 + .../x/net/internal/socket/sys_linux.go | 27 + .../x/net/internal/socket/sys_linux_386.go | 55 + .../x/net/internal/socket/sys_linux_386.s | 11 + .../x/net/internal/socket/sys_linux_amd64.go | 10 + .../x/net/internal/socket/sys_linux_arm.go | 10 + .../x/net/internal/socket/sys_linux_arm64.go | 10 + .../x/net/internal/socket/sys_linux_mips.go | 10 + .../x/net/internal/socket/sys_linux_mips64.go | 10 + .../net/internal/socket/sys_linux_mips64le.go | 10 + .../x/net/internal/socket/sys_linux_mipsle.go | 10 + .../x/net/internal/socket/sys_linux_ppc64.go | 10 + .../net/internal/socket/sys_linux_ppc64le.go | 10 + .../x/net/internal/socket/sys_linux_s390x.go | 55 + .../x/net/internal/socket/sys_linux_s390x.s | 11 + .../x/net/internal/socket/sys_netbsd.go | 25 + .../x/net/internal/socket/sys_posix.go | 168 + .../x/net/internal/socket/sys_solaris.go | 71 + .../x/net/internal/socket/sys_solaris_amd64.s | 11 + .../x/net/internal/socket/sys_stub.go | 64 + .../x/net/internal/socket/sys_unix.go | 33 + .../x/net/internal/socket/sys_windows.go | 70 + .../x/net/internal/socket/zsys_darwin_386.go | 59 + .../net/internal/socket/zsys_darwin_amd64.go | 61 + .../x/net/internal/socket/zsys_darwin_arm.go | 59 + .../internal/socket/zsys_dragonfly_amd64.go | 61 + .../x/net/internal/socket/zsys_freebsd_386.go | 59 + .../net/internal/socket/zsys_freebsd_amd64.go | 61 + .../x/net/internal/socket/zsys_freebsd_arm.go | 59 + .../x/net/internal/socket/zsys_linux_386.go | 63 + .../x/net/internal/socket/zsys_linux_amd64.go | 66 + .../x/net/internal/socket/zsys_linux_arm.go | 63 + .../x/net/internal/socket/zsys_linux_arm64.go | 66 + .../x/net/internal/socket/zsys_linux_mips.go | 63 + .../net/internal/socket/zsys_linux_mips64.go | 66 + .../internal/socket/zsys_linux_mips64le.go | 66 + .../net/internal/socket/zsys_linux_mipsle.go | 63 + .../x/net/internal/socket/zsys_linux_ppc64.go | 66 + .../net/internal/socket/zsys_linux_ppc64le.go | 66 + .../x/net/internal/socket/zsys_linux_s390x.go | 66 + .../x/net/internal/socket/zsys_netbsd_386.go | 65 + .../net/internal/socket/zsys_netbsd_amd64.go | 68 + .../x/net/internal/socket/zsys_netbsd_arm.go | 59 + .../x/net/internal/socket/zsys_openbsd_386.go | 59 + .../net/internal/socket/zsys_openbsd_amd64.go | 61 + .../x/net/internal/socket/zsys_openbsd_arm.go | 59 + .../net/internal/socket/zsys_solaris_amd64.go | 60 + .../x/net/internal/timeseries/timeseries.go | 525 + .../internal/timeseries/timeseries_test.go | 170 + .../vendor/golang.org/x/net/ipv4/batch.go | 191 + .../vendor/golang.org/x/net/ipv4/bpf_test.go | 93 + .../vendor/golang.org/x/net/ipv4/control.go | 144 + .../golang.org/x/net/ipv4/control_bsd.go | 40 + .../golang.org/x/net/ipv4/control_pktinfo.go | 39 + .../golang.org/x/net/ipv4/control_stub.go | 13 + .../golang.org/x/net/ipv4/control_test.go | 21 + .../golang.org/x/net/ipv4/control_unix.go | 73 + .../golang.org/x/net/ipv4/control_windows.go | 16 + .../golang.org/x/net/ipv4/defs_darwin.go | 77 + .../golang.org/x/net/ipv4/defs_dragonfly.go | 38 + .../golang.org/x/net/ipv4/defs_freebsd.go | 75 + .../golang.org/x/net/ipv4/defs_linux.go | 122 + .../golang.org/x/net/ipv4/defs_netbsd.go | 37 + .../golang.org/x/net/ipv4/defs_openbsd.go | 37 + .../golang.org/x/net/ipv4/defs_solaris.go | 84 + .../vendor/golang.org/x/net/ipv4/dgramopt.go | 265 + .../vendor/golang.org/x/net/ipv4/doc.go | 244 + .../vendor/golang.org/x/net/ipv4/endpoint.go | 187 + .../golang.org/x/net/ipv4/example_test.go | 224 + .../vendor/golang.org/x/net/ipv4/gen.go | 199 + .../golang.org/x/net/ipv4/genericopt.go | 57 + .../vendor/golang.org/x/net/ipv4/header.go | 159 + .../golang.org/x/net/ipv4/header_test.go | 228 + .../vendor/golang.org/x/net/ipv4/helper.go | 63 + .../vendor/golang.org/x/net/ipv4/iana.go | 34 + .../vendor/golang.org/x/net/ipv4/icmp.go | 57 + .../golang.org/x/net/ipv4/icmp_linux.go | 25 + .../vendor/golang.org/x/net/ipv4/icmp_stub.go | 25 + .../vendor/golang.org/x/net/ipv4/icmp_test.go | 95 + .../golang.org/x/net/ipv4/multicast_test.go | 334 + .../x/net/ipv4/multicastlistener_test.go | 265 + .../x/net/ipv4/multicastsockopt_test.go | 195 + .../vendor/golang.org/x/net/ipv4/packet.go | 69 + .../golang.org/x/net/ipv4/packet_go1_8.go | 56 + .../golang.org/x/net/ipv4/packet_go1_9.go | 67 + .../vendor/golang.org/x/net/ipv4/payload.go | 23 + .../golang.org/x/net/ipv4/payload_cmsg.go | 36 + .../x/net/ipv4/payload_cmsg_go1_8.go | 59 + .../x/net/ipv4/payload_cmsg_go1_9.go | 67 + .../golang.org/x/net/ipv4/payload_nocmsg.go | 42 + .../x/net/ipv4/readwrite_go1_8_test.go | 248 + .../x/net/ipv4/readwrite_go1_9_test.go | 388 + .../golang.org/x/net/ipv4/readwrite_test.go | 140 + .../vendor/golang.org/x/net/ipv4/sockopt.go | 44 + .../golang.org/x/net/ipv4/sockopt_posix.go | 71 + .../golang.org/x/net/ipv4/sockopt_stub.go | 42 + .../golang.org/x/net/ipv4/sys_asmreq.go | 119 + .../golang.org/x/net/ipv4/sys_asmreq_stub.go | 25 + .../golang.org/x/net/ipv4/sys_asmreqn.go | 42 + .../golang.org/x/net/ipv4/sys_asmreqn_stub.go | 21 + .../vendor/golang.org/x/net/ipv4/sys_bpf.go | 23 + .../golang.org/x/net/ipv4/sys_bpf_stub.go | 16 + .../vendor/golang.org/x/net/ipv4/sys_bsd.go | 37 + .../golang.org/x/net/ipv4/sys_darwin.go | 93 + .../golang.org/x/net/ipv4/sys_dragonfly.go | 35 + .../golang.org/x/net/ipv4/sys_freebsd.go | 76 + .../vendor/golang.org/x/net/ipv4/sys_linux.go | 59 + .../golang.org/x/net/ipv4/sys_solaris.go | 57 + .../golang.org/x/net/ipv4/sys_ssmreq.go | 54 + .../golang.org/x/net/ipv4/sys_ssmreq_stub.go | 21 + .../vendor/golang.org/x/net/ipv4/sys_stub.go | 13 + .../golang.org/x/net/ipv4/sys_windows.go | 67 + .../golang.org/x/net/ipv4/unicast_test.go | 247 + .../x/net/ipv4/unicastsockopt_test.go | 148 + .../golang.org/x/net/ipv4/zsys_darwin.go | 99 + .../golang.org/x/net/ipv4/zsys_dragonfly.go | 31 + .../golang.org/x/net/ipv4/zsys_freebsd_386.go | 93 + .../x/net/ipv4/zsys_freebsd_amd64.go | 95 + .../golang.org/x/net/ipv4/zsys_freebsd_arm.go | 95 + .../golang.org/x/net/ipv4/zsys_linux_386.go | 148 + .../golang.org/x/net/ipv4/zsys_linux_amd64.go | 150 + .../golang.org/x/net/ipv4/zsys_linux_arm.go | 148 + .../golang.org/x/net/ipv4/zsys_linux_arm64.go | 150 + .../golang.org/x/net/ipv4/zsys_linux_mips.go | 148 + .../x/net/ipv4/zsys_linux_mips64.go | 150 + .../x/net/ipv4/zsys_linux_mips64le.go | 150 + .../x/net/ipv4/zsys_linux_mipsle.go | 148 + .../golang.org/x/net/ipv4/zsys_linux_ppc.go | 148 + .../golang.org/x/net/ipv4/zsys_linux_ppc64.go | 150 + .../x/net/ipv4/zsys_linux_ppc64le.go | 150 + .../golang.org/x/net/ipv4/zsys_linux_s390x.go | 150 + .../golang.org/x/net/ipv4/zsys_netbsd.go | 30 + .../golang.org/x/net/ipv4/zsys_openbsd.go | 30 + .../golang.org/x/net/ipv4/zsys_solaris.go | 100 + .../vendor/golang.org/x/net/ipv6/batch.go | 119 + .../vendor/golang.org/x/net/ipv6/bpf_test.go | 96 + .../vendor/golang.org/x/net/ipv6/control.go | 187 + .../x/net/ipv6/control_rfc2292_unix.go | 48 + .../x/net/ipv6/control_rfc3542_unix.go | 94 + .../golang.org/x/net/ipv6/control_stub.go | 13 + .../golang.org/x/net/ipv6/control_test.go | 21 + .../golang.org/x/net/ipv6/control_unix.go | 55 + .../golang.org/x/net/ipv6/control_windows.go | 16 + .../golang.org/x/net/ipv6/defs_darwin.go | 112 + .../golang.org/x/net/ipv6/defs_dragonfly.go | 84 + .../golang.org/x/net/ipv6/defs_freebsd.go | 105 + .../golang.org/x/net/ipv6/defs_linux.go | 147 + .../golang.org/x/net/ipv6/defs_netbsd.go | 80 + .../golang.org/x/net/ipv6/defs_openbsd.go | 89 + .../golang.org/x/net/ipv6/defs_solaris.go | 114 + .../vendor/golang.org/x/net/ipv6/dgramopt.go | 302 + .../vendor/golang.org/x/net/ipv6/doc.go | 243 + .../vendor/golang.org/x/net/ipv6/endpoint.go | 128 + .../golang.org/x/net/ipv6/example_test.go | 216 + .../vendor/golang.org/x/net/ipv6/gen.go | 199 + .../golang.org/x/net/ipv6/genericopt.go | 58 + .../vendor/golang.org/x/net/ipv6/header.go | 55 + .../golang.org/x/net/ipv6/header_test.go | 55 + .../vendor/golang.org/x/net/ipv6/helper.go | 57 + .../vendor/golang.org/x/net/ipv6/iana.go | 82 + .../vendor/golang.org/x/net/ipv6/icmp.go | 60 + .../vendor/golang.org/x/net/ipv6/icmp_bsd.go | 29 + .../golang.org/x/net/ipv6/icmp_linux.go | 27 + .../golang.org/x/net/ipv6/icmp_solaris.go | 27 + .../vendor/golang.org/x/net/ipv6/icmp_stub.go | 23 + .../vendor/golang.org/x/net/ipv6/icmp_test.go | 96 + .../golang.org/x/net/ipv6/icmp_windows.go | 22 + .../x/net/ipv6/mocktransponder_test.go | 32 + .../golang.org/x/net/ipv6/multicast_test.go | 264 + .../x/net/ipv6/multicastlistener_test.go | 261 + .../x/net/ipv6/multicastsockopt_test.go | 157 + .../vendor/golang.org/x/net/ipv6/payload.go | 23 + .../golang.org/x/net/ipv6/payload_cmsg.go | 35 + .../x/net/ipv6/payload_cmsg_go1_8.go | 55 + .../x/net/ipv6/payload_cmsg_go1_9.go | 57 + .../golang.org/x/net/ipv6/payload_nocmsg.go | 41 + .../x/net/ipv6/readwrite_go1_8_test.go | 242 + .../x/net/ipv6/readwrite_go1_9_test.go | 373 + .../golang.org/x/net/ipv6/readwrite_test.go | 148 + .../vendor/golang.org/x/net/ipv6/sockopt.go | 43 + .../golang.org/x/net/ipv6/sockopt_posix.go | 87 + .../golang.org/x/net/ipv6/sockopt_stub.go | 46 + .../golang.org/x/net/ipv6/sockopt_test.go | 133 + .../golang.org/x/net/ipv6/sys_asmreq.go | 24 + .../golang.org/x/net/ipv6/sys_asmreq_stub.go | 17 + .../vendor/golang.org/x/net/ipv6/sys_bpf.go | 23 + .../golang.org/x/net/ipv6/sys_bpf_stub.go | 16 + .../vendor/golang.org/x/net/ipv6/sys_bsd.go | 57 + .../golang.org/x/net/ipv6/sys_darwin.go | 106 + .../golang.org/x/net/ipv6/sys_freebsd.go | 92 + .../vendor/golang.org/x/net/ipv6/sys_linux.go | 74 + .../golang.org/x/net/ipv6/sys_solaris.go | 74 + .../golang.org/x/net/ipv6/sys_ssmreq.go | 54 + .../golang.org/x/net/ipv6/sys_ssmreq_stub.go | 21 + .../vendor/golang.org/x/net/ipv6/sys_stub.go | 13 + .../golang.org/x/net/ipv6/sys_windows.go | 75 + .../golang.org/x/net/ipv6/unicast_test.go | 184 + .../x/net/ipv6/unicastsockopt_test.go | 120 + .../golang.org/x/net/ipv6/zsys_darwin.go | 131 + .../golang.org/x/net/ipv6/zsys_dragonfly.go | 88 + .../golang.org/x/net/ipv6/zsys_freebsd_386.go | 122 + .../x/net/ipv6/zsys_freebsd_amd64.go | 124 + .../golang.org/x/net/ipv6/zsys_freebsd_arm.go | 124 + .../golang.org/x/net/ipv6/zsys_linux_386.go | 170 + .../golang.org/x/net/ipv6/zsys_linux_amd64.go | 172 + .../golang.org/x/net/ipv6/zsys_linux_arm.go | 170 + .../golang.org/x/net/ipv6/zsys_linux_arm64.go | 172 + .../golang.org/x/net/ipv6/zsys_linux_mips.go | 170 + .../x/net/ipv6/zsys_linux_mips64.go | 172 + .../x/net/ipv6/zsys_linux_mips64le.go | 172 + .../x/net/ipv6/zsys_linux_mipsle.go | 170 + .../golang.org/x/net/ipv6/zsys_linux_ppc.go | 170 + .../golang.org/x/net/ipv6/zsys_linux_ppc64.go | 172 + .../x/net/ipv6/zsys_linux_ppc64le.go | 172 + .../golang.org/x/net/ipv6/zsys_linux_s390x.go | 172 + .../golang.org/x/net/ipv6/zsys_netbsd.go | 84 + .../golang.org/x/net/ipv6/zsys_openbsd.go | 93 + .../golang.org/x/net/ipv6/zsys_solaris.go | 131 + .../golang.org/x/net/lex/httplex/httplex.go | 351 + .../x/net/lex/httplex/httplex_test.go | 119 + .../vendor/golang.org/x/net/lif/address.go | 105 + .../golang.org/x/net/lif/address_test.go | 123 + .../vendor/golang.org/x/net/lif/binary.go | 115 + .../golang.org/x/net/lif/defs_solaris.go | 90 + .../vendor/golang.org/x/net/lif/lif.go | 43 + .../vendor/golang.org/x/net/lif/link.go | 126 + .../vendor/golang.org/x/net/lif/link_test.go | 63 + .../vendor/golang.org/x/net/lif/sys.go | 21 + .../golang.org/x/net/lif/sys_solaris_amd64.s | 8 + .../vendor/golang.org/x/net/lif/syscall.go | 28 + .../x/net/lif/zsys_solaris_amd64.go | 103 + .../golang.org/x/net/nettest/conntest.go | 456 + .../golang.org/x/net/nettest/conntest_go16.go | 24 + .../golang.org/x/net/nettest/conntest_go17.go | 24 + .../golang.org/x/net/nettest/conntest_test.go | 76 + .../vendor/golang.org/x/net/netutil/listen.go | 48 + .../golang.org/x/net/netutil/listen_test.go | 101 + .../vendor/golang.org/x/net/proxy/direct.go | 18 + .../vendor/golang.org/x/net/proxy/per_host.go | 140 + .../golang.org/x/net/proxy/per_host_test.go | 55 + .../vendor/golang.org/x/net/proxy/proxy.go | 134 + .../golang.org/x/net/proxy/proxy_test.go | 215 + .../vendor/golang.org/x/net/proxy/socks5.go | 214 + .../golang.org/x/net/publicsuffix/gen.go | 713 + .../golang.org/x/net/publicsuffix/list.go | 135 + .../x/net/publicsuffix/list_test.go | 416 + .../golang.org/x/net/publicsuffix/table.go | 9419 +++++++++ .../x/net/publicsuffix/table_test.go | 16756 +++++++++++++++ .../vendor/golang.org/x/net/route/address.go | 425 + .../x/net/route/address_darwin_test.go | 63 + .../golang.org/x/net/route/address_test.go | 103 + .../vendor/golang.org/x/net/route/binary.go | 90 + .../golang.org/x/net/route/defs_darwin.go | 114 + .../golang.org/x/net/route/defs_dragonfly.go | 113 + .../golang.org/x/net/route/defs_freebsd.go | 337 + .../golang.org/x/net/route/defs_netbsd.go | 112 + .../golang.org/x/net/route/defs_openbsd.go | 116 + .../golang.org/x/net/route/interface.go | 64 + .../x/net/route/interface_announce.go | 32 + .../x/net/route/interface_classic.go | 66 + .../x/net/route/interface_freebsd.go | 78 + .../x/net/route/interface_multicast.go | 30 + .../x/net/route/interface_openbsd.go | 90 + .../vendor/golang.org/x/net/route/message.go | 72 + .../x/net/route/message_darwin_test.go | 34 + .../x/net/route/message_freebsd_test.go | 92 + .../golang.org/x/net/route/message_test.go | 239 + .../vendor/golang.org/x/net/route/route.go | 123 + .../golang.org/x/net/route/route_classic.go | 67 + .../golang.org/x/net/route/route_openbsd.go | 65 + .../golang.org/x/net/route/route_test.go | 390 + .../vendor/golang.org/x/net/route/sys.go | 39 + .../golang.org/x/net/route/sys_darwin.go | 87 + .../golang.org/x/net/route/sys_dragonfly.go | 76 + .../golang.org/x/net/route/sys_freebsd.go | 155 + .../golang.org/x/net/route/sys_netbsd.go | 71 + .../golang.org/x/net/route/sys_openbsd.go | 80 + .../vendor/golang.org/x/net/route/syscall.go | 28 + .../golang.org/x/net/route/zsys_darwin.go | 99 + .../golang.org/x/net/route/zsys_dragonfly.go | 98 + .../x/net/route/zsys_freebsd_386.go | 126 + .../x/net/route/zsys_freebsd_amd64.go | 123 + .../x/net/route/zsys_freebsd_arm.go | 123 + .../golang.org/x/net/route/zsys_netbsd.go | 97 + .../golang.org/x/net/route/zsys_openbsd.go | 101 + .../vendor/golang.org/x/net/trace/events.go | 532 + .../golang.org/x/net/trace/histogram.go | 365 + .../golang.org/x/net/trace/histogram_test.go | 325 + .../vendor/golang.org/x/net/trace/trace.go | 1082 + .../golang.org/x/net/trace/trace_go16.go | 21 + .../golang.org/x/net/trace/trace_go17.go | 21 + .../golang.org/x/net/trace/trace_test.go | 178 + .../vendor/golang.org/x/net/webdav/file.go | 796 + .../golang.org/x/net/webdav/file_go1.6.go | 17 + .../golang.org/x/net/webdav/file_go1.7.go | 16 + .../golang.org/x/net/webdav/file_test.go | 1184 ++ .../vendor/golang.org/x/net/webdav/if.go | 173 + .../vendor/golang.org/x/net/webdav/if_test.go | 322 + .../x/net/webdav/internal/xml/README | 11 + .../x/net/webdav/internal/xml/atom_test.go | 56 + .../x/net/webdav/internal/xml/example_test.go | 151 + .../x/net/webdav/internal/xml/marshal.go | 1223 ++ .../x/net/webdav/internal/xml/marshal_test.go | 1939 ++ .../x/net/webdav/internal/xml/read.go | 692 + .../x/net/webdav/internal/xml/read_test.go | 744 + .../x/net/webdav/internal/xml/typeinfo.go | 371 + .../x/net/webdav/internal/xml/xml.go | 1998 ++ .../x/net/webdav/internal/xml/xml_test.go | 752 + .../x/net/webdav/litmus_test_server.go | 94 + .../vendor/golang.org/x/net/webdav/lock.go | 445 + .../golang.org/x/net/webdav/lock_test.go | 731 + .../vendor/golang.org/x/net/webdav/prop.go | 418 + .../golang.org/x/net/webdav/prop_test.go | 613 + .../vendor/golang.org/x/net/webdav/webdav.go | 702 + .../golang.org/x/net/webdav/webdav_test.go | 344 + .../vendor/golang.org/x/net/webdav/xml.go | 519 + .../golang.org/x/net/webdav/xml_test.go | 906 + .../golang.org/x/net/websocket/client.go | 106 + .../vendor/golang.org/x/net/websocket/dial.go | 24 + .../golang.org/x/net/websocket/dial_test.go | 43 + .../x/net/websocket/exampledial_test.go | 31 + .../x/net/websocket/examplehandler_test.go | 26 + .../vendor/golang.org/x/net/websocket/hybi.go | 583 + .../golang.org/x/net/websocket/hybi_test.go | 608 + .../golang.org/x/net/websocket/server.go | 113 + .../golang.org/x/net/websocket/websocket.go | 448 + .../x/net/websocket/websocket_test.go | 665 + .../vendor/golang.org/x/net/xsrftoken/xsrf.go | 94 + .../golang.org/x/net/xsrftoken/xsrf_test.go | 83 + .../vendor/golang.org/x/sys/.gitattributes | 10 + .../vendor/golang.org/x/sys/.gitignore | 2 + .../vendor/golang.org/x/sys/AUTHORS | 3 + .../vendor/golang.org/x/sys/CONTRIBUTING.md | 31 + .../vendor/golang.org/x/sys/CONTRIBUTORS | 3 + .../vendor/golang.org/x/sys/LICENSE | 27 + .../vendor/golang.org/x/sys/PATENTS | 22 + .../vendor/golang.org/x/sys/README.md | 18 + .../vendor/golang.org/x/sys/codereview.cfg | 1 + .../vendor/golang.org/x/sys/plan9/asm.s | 8 + .../golang.org/x/sys/plan9/asm_plan9_386.s | 30 + .../golang.org/x/sys/plan9/asm_plan9_amd64.s | 30 + .../golang.org/x/sys/plan9/const_plan9.go | 70 + .../golang.org/x/sys/plan9/dir_plan9.go | 212 + .../golang.org/x/sys/plan9/env_plan9.go | 27 + .../golang.org/x/sys/plan9/env_unset.go | 14 + .../golang.org/x/sys/plan9/errors_plan9.go | 50 + .../vendor/golang.org/x/sys/plan9/mkall.sh | 138 + .../vendor/golang.org/x/sys/plan9/mkerrors.sh | 246 + .../golang.org/x/sys/plan9/mksyscall.pl | 319 + .../golang.org/x/sys/plan9/mksysnum_plan9.sh | 23 + .../golang.org/x/sys/plan9/pwd_go15_plan9.go | 21 + .../golang.org/x/sys/plan9/pwd_plan9.go | 23 + .../vendor/golang.org/x/sys/plan9/race.go | 30 + .../vendor/golang.org/x/sys/plan9/race0.go | 25 + .../vendor/golang.org/x/sys/plan9/str.go | 22 + .../vendor/golang.org/x/sys/plan9/syscall.go | 74 + .../golang.org/x/sys/plan9/syscall_plan9.go | 349 + .../golang.org/x/sys/plan9/syscall_test.go | 33 + .../x/sys/plan9/zsyscall_plan9_386.go | 292 + .../x/sys/plan9/zsyscall_plan9_amd64.go | 292 + .../golang.org/x/sys/plan9/zsysnum_plan9.go | 49 + .../vendor/golang.org/x/sys/unix/.gitignore | 1 + .../vendor/golang.org/x/sys/unix/README.md | 173 + .../golang.org/x/sys/unix/asm_darwin_386.s | 29 + .../golang.org/x/sys/unix/asm_darwin_amd64.s | 29 + .../golang.org/x/sys/unix/asm_darwin_arm.s | 30 + .../golang.org/x/sys/unix/asm_darwin_arm64.s | 30 + .../x/sys/unix/asm_dragonfly_amd64.s | 29 + .../golang.org/x/sys/unix/asm_freebsd_386.s | 29 + .../golang.org/x/sys/unix/asm_freebsd_amd64.s | 29 + .../golang.org/x/sys/unix/asm_freebsd_arm.s | 29 + .../golang.org/x/sys/unix/asm_linux_386.s | 35 + .../golang.org/x/sys/unix/asm_linux_amd64.s | 29 + .../golang.org/x/sys/unix/asm_linux_arm.s | 29 + .../golang.org/x/sys/unix/asm_linux_arm64.s | 24 + .../golang.org/x/sys/unix/asm_linux_mips64x.s | 28 + .../golang.org/x/sys/unix/asm_linux_mipsx.s | 31 + .../golang.org/x/sys/unix/asm_linux_ppc64x.s | 28 + .../golang.org/x/sys/unix/asm_linux_s390x.s | 28 + .../golang.org/x/sys/unix/asm_netbsd_386.s | 29 + .../golang.org/x/sys/unix/asm_netbsd_amd64.s | 29 + .../golang.org/x/sys/unix/asm_netbsd_arm.s | 29 + .../golang.org/x/sys/unix/asm_openbsd_386.s | 29 + .../golang.org/x/sys/unix/asm_openbsd_amd64.s | 29 + .../golang.org/x/sys/unix/asm_openbsd_arm.s | 29 + .../golang.org/x/sys/unix/asm_solaris_amd64.s | 17 + .../golang.org/x/sys/unix/bluetooth_linux.go | 35 + .../golang.org/x/sys/unix/cap_freebsd.go | 195 + .../vendor/golang.org/x/sys/unix/constants.go | 13 + .../golang.org/x/sys/unix/creds_test.go | 136 + .../golang.org/x/sys/unix/dev_darwin.go | 24 + .../golang.org/x/sys/unix/dev_darwin_test.go | 49 + .../golang.org/x/sys/unix/dev_dragonfly.go | 30 + .../x/sys/unix/dev_dragonfly_test.go | 48 + .../golang.org/x/sys/unix/dev_freebsd.go | 30 + .../vendor/golang.org/x/sys/unix/dev_linux.go | 42 + .../golang.org/x/sys/unix/dev_linux_test.go | 51 + .../golang.org/x/sys/unix/dev_netbsd.go | 29 + .../golang.org/x/sys/unix/dev_netbsd_test.go | 50 + .../golang.org/x/sys/unix/dev_openbsd.go | 29 + .../golang.org/x/sys/unix/dev_openbsd_test.go | 52 + .../golang.org/x/sys/unix/dev_solaris_test.go | 49 + .../vendor/golang.org/x/sys/unix/dirent.go | 102 + .../golang.org/x/sys/unix/endian_big.go | 9 + .../golang.org/x/sys/unix/endian_little.go | 9 + .../vendor/golang.org/x/sys/unix/env_unix.go | 27 + .../vendor/golang.org/x/sys/unix/env_unset.go | 14 + .../x/sys/unix/errors_freebsd_386.go | 227 + .../x/sys/unix/errors_freebsd_amd64.go | 227 + .../x/sys/unix/errors_freebsd_arm.go | 226 + .../golang.org/x/sys/unix/export_test.go | 9 + .../vendor/golang.org/x/sys/unix/file_unix.go | 27 + .../vendor/golang.org/x/sys/unix/flock.go | 22 + .../x/sys/unix/flock_linux_32bit.go | 13 + .../vendor/golang.org/x/sys/unix/gccgo.go | 46 + .../vendor/golang.org/x/sys/unix/gccgo_c.c | 41 + .../x/sys/unix/gccgo_linux_amd64.go | 20 + .../golang.org/x/sys/unix/linux/Dockerfile | 51 + .../golang.org/x/sys/unix/linux/mkall.go | 379 + .../golang.org/x/sys/unix/linux/mksysnum.pl | 85 + .../golang.org/x/sys/unix/linux/types.go | 595 + .../vendor/golang.org/x/sys/unix/mkall.sh | 194 + .../vendor/golang.org/x/sys/unix/mkerrors.sh | 566 + .../vendor/golang.org/x/sys/unix/mkpost.go | 88 + .../vendor/golang.org/x/sys/unix/mksyscall.pl | 328 + .../x/sys/unix/mksyscall_solaris.pl | 289 + .../golang.org/x/sys/unix/mksysctl_openbsd.pl | 264 + .../golang.org/x/sys/unix/mksysnum_darwin.pl | 39 + .../x/sys/unix/mksysnum_dragonfly.pl | 50 + .../golang.org/x/sys/unix/mksysnum_freebsd.pl | 50 + .../golang.org/x/sys/unix/mksysnum_netbsd.pl | 58 + .../golang.org/x/sys/unix/mksysnum_openbsd.pl | 50 + .../golang.org/x/sys/unix/mmap_unix_test.go | 35 + .../golang.org/x/sys/unix/openbsd_pledge.go | 38 + .../golang.org/x/sys/unix/openbsd_test.go | 113 + .../golang.org/x/sys/unix/pagesize_unix.go | 15 + .../vendor/golang.org/x/sys/unix/race.go | 30 + .../vendor/golang.org/x/sys/unix/race0.go | 25 + .../golang.org/x/sys/unix/sockcmsg_linux.go | 36 + .../golang.org/x/sys/unix/sockcmsg_unix.go | 104 + .../vendor/golang.org/x/sys/unix/str.go | 26 + .../vendor/golang.org/x/sys/unix/syscall.go | 69 + .../golang.org/x/sys/unix/syscall_bsd.go | 635 + .../golang.org/x/sys/unix/syscall_bsd_test.go | 62 + .../golang.org/x/sys/unix/syscall_darwin.go | 536 + .../x/sys/unix/syscall_darwin_386.go | 75 + .../x/sys/unix/syscall_darwin_amd64.go | 75 + .../x/sys/unix/syscall_darwin_arm.go | 69 + .../x/sys/unix/syscall_darwin_arm64.go | 75 + .../x/sys/unix/syscall_dragonfly.go | 415 + .../x/sys/unix/syscall_dragonfly_amd64.go | 59 + .../golang.org/x/sys/unix/syscall_freebsd.go | 708 + .../x/sys/unix/syscall_freebsd_386.go | 59 + .../x/sys/unix/syscall_freebsd_amd64.go | 59 + .../x/sys/unix/syscall_freebsd_arm.go | 59 + .../x/sys/unix/syscall_freebsd_test.go | 297 + .../golang.org/x/sys/unix/syscall_linux.go | 1469 ++ .../x/sys/unix/syscall_linux_386.go | 397 + .../x/sys/unix/syscall_linux_amd64.go | 150 + .../x/sys/unix/syscall_linux_amd64_gc.go | 13 + .../x/sys/unix/syscall_linux_arm.go | 261 + .../x/sys/unix/syscall_linux_arm64.go | 188 + .../x/sys/unix/syscall_linux_mips64x.go | 207 + .../x/sys/unix/syscall_linux_mipsx.go | 237 + .../x/sys/unix/syscall_linux_ppc64x.go | 133 + .../x/sys/unix/syscall_linux_s390x.go | 326 + .../x/sys/unix/syscall_linux_sparc64.go | 149 + .../x/sys/unix/syscall_linux_test.go | 234 + .../golang.org/x/sys/unix/syscall_netbsd.go | 472 + .../x/sys/unix/syscall_netbsd_386.go | 40 + .../x/sys/unix/syscall_netbsd_amd64.go | 40 + .../x/sys/unix/syscall_netbsd_arm.go | 40 + .../golang.org/x/sys/unix/syscall_no_getwd.go | 11 + .../golang.org/x/sys/unix/syscall_openbsd.go | 282 + .../x/sys/unix/syscall_openbsd_386.go | 40 + .../x/sys/unix/syscall_openbsd_amd64.go | 40 + .../x/sys/unix/syscall_openbsd_arm.go | 40 + .../golang.org/x/sys/unix/syscall_solaris.go | 719 + .../x/sys/unix/syscall_solaris_amd64.go | 35 + .../x/sys/unix/syscall_solaris_test.go | 34 + .../golang.org/x/sys/unix/syscall_test.go | 50 + .../golang.org/x/sys/unix/syscall_unix.go | 293 + .../golang.org/x/sys/unix/syscall_unix_gc.go | 15 + .../x/sys/unix/syscall_unix_test.go | 345 + .../golang.org/x/sys/unix/types_darwin.go | 254 + .../golang.org/x/sys/unix/types_dragonfly.go | 249 + .../golang.org/x/sys/unix/types_freebsd.go | 372 + .../golang.org/x/sys/unix/types_netbsd.go | 239 + .../golang.org/x/sys/unix/types_openbsd.go | 251 + .../golang.org/x/sys/unix/types_solaris.go | 265 + .../x/sys/unix/zerrors_darwin_386.go | 1673 ++ .../x/sys/unix/zerrors_darwin_amd64.go | 1673 ++ .../x/sys/unix/zerrors_darwin_arm.go | 1673 ++ .../x/sys/unix/zerrors_darwin_arm64.go | 1673 ++ .../x/sys/unix/zerrors_dragonfly_amd64.go | 1568 ++ .../x/sys/unix/zerrors_freebsd_386.go | 1749 ++ .../x/sys/unix/zerrors_freebsd_amd64.go | 1750 ++ .../x/sys/unix/zerrors_freebsd_arm.go | 1758 ++ .../x/sys/unix/zerrors_linux_386.go | 2231 ++ .../x/sys/unix/zerrors_linux_amd64.go | 2232 ++ .../x/sys/unix/zerrors_linux_arm.go | 2236 ++ .../x/sys/unix/zerrors_linux_arm64.go | 2222 ++ .../x/sys/unix/zerrors_linux_mips.go | 2241 ++ .../x/sys/unix/zerrors_linux_mips64.go | 2241 ++ .../x/sys/unix/zerrors_linux_mips64le.go | 2241 ++ .../x/sys/unix/zerrors_linux_mipsle.go | 2241 ++ .../x/sys/unix/zerrors_linux_ppc64.go | 2294 ++ .../x/sys/unix/zerrors_linux_ppc64le.go | 2294 ++ .../x/sys/unix/zerrors_linux_s390x.go | 2293 ++ .../x/sys/unix/zerrors_linux_sparc64.go | 2142 ++ .../x/sys/unix/zerrors_netbsd_386.go | 1712 ++ .../x/sys/unix/zerrors_netbsd_amd64.go | 1702 ++ .../x/sys/unix/zerrors_netbsd_arm.go | 1691 ++ .../x/sys/unix/zerrors_openbsd_386.go | 1584 ++ .../x/sys/unix/zerrors_openbsd_amd64.go | 1583 ++ .../x/sys/unix/zerrors_openbsd_arm.go | 1586 ++ .../x/sys/unix/zerrors_solaris_amd64.go | 1489 ++ .../x/sys/unix/zsyscall_darwin_386.go | 1609 ++ .../x/sys/unix/zsyscall_darwin_amd64.go | 1609 ++ .../x/sys/unix/zsyscall_darwin_arm.go | 1609 ++ .../x/sys/unix/zsyscall_darwin_arm64.go | 1609 ++ .../x/sys/unix/zsyscall_dragonfly_amd64.go | 1440 ++ .../x/sys/unix/zsyscall_freebsd_386.go | 1877 ++ .../x/sys/unix/zsyscall_freebsd_amd64.go | 1877 ++ .../x/sys/unix/zsyscall_freebsd_arm.go | 1877 ++ .../x/sys/unix/zsyscall_linux_386.go | 1953 ++ .../x/sys/unix/zsyscall_linux_amd64.go | 2146 ++ .../x/sys/unix/zsyscall_linux_arm.go | 2055 ++ .../x/sys/unix/zsyscall_linux_arm64.go | 2029 ++ .../x/sys/unix/zsyscall_linux_mips.go | 2111 ++ .../x/sys/unix/zsyscall_linux_mips64.go | 2105 ++ .../x/sys/unix/zsyscall_linux_mips64le.go | 2105 ++ .../x/sys/unix/zsyscall_linux_mipsle.go | 2111 ++ .../x/sys/unix/zsyscall_linux_ppc64.go | 2157 ++ .../x/sys/unix/zsyscall_linux_ppc64le.go | 2157 ++ .../x/sys/unix/zsyscall_linux_s390x.go | 1937 ++ .../x/sys/unix/zsyscall_linux_sparc64.go | 1833 ++ .../x/sys/unix/zsyscall_netbsd_386.go | 1346 ++ .../x/sys/unix/zsyscall_netbsd_amd64.go | 1346 ++ .../x/sys/unix/zsyscall_netbsd_arm.go | 1346 ++ .../x/sys/unix/zsyscall_openbsd_386.go | 1404 ++ .../x/sys/unix/zsyscall_openbsd_amd64.go | 1404 ++ .../x/sys/unix/zsyscall_openbsd_arm.go | 1404 ++ .../x/sys/unix/zsyscall_solaris_amd64.go | 1630 ++ .../x/sys/unix/zsysctl_openbsd_386.go | 270 + .../x/sys/unix/zsysctl_openbsd_amd64.go | 270 + .../x/sys/unix/zsysctl_openbsd_arm.go | 270 + .../x/sys/unix/zsysnum_darwin_386.go | 398 + .../x/sys/unix/zsysnum_darwin_amd64.go | 398 + .../x/sys/unix/zsysnum_darwin_arm.go | 426 + .../x/sys/unix/zsysnum_darwin_arm64.go | 426 + .../x/sys/unix/zsysnum_dragonfly_amd64.go | 315 + .../x/sys/unix/zsysnum_freebsd_386.go | 353 + .../x/sys/unix/zsysnum_freebsd_amd64.go | 353 + .../x/sys/unix/zsysnum_freebsd_arm.go | 353 + .../x/sys/unix/zsysnum_linux_386.go | 390 + .../x/sys/unix/zsysnum_linux_amd64.go | 342 + .../x/sys/unix/zsysnum_linux_arm.go | 362 + .../x/sys/unix/zsysnum_linux_arm64.go | 286 + .../x/sys/unix/zsysnum_linux_mips.go | 375 + .../x/sys/unix/zsysnum_linux_mips64.go | 335 + .../x/sys/unix/zsysnum_linux_mips64le.go | 335 + .../x/sys/unix/zsysnum_linux_mipsle.go | 375 + .../x/sys/unix/zsysnum_linux_ppc64.go | 370 + .../x/sys/unix/zsysnum_linux_ppc64le.go | 370 + .../x/sys/unix/zsysnum_linux_s390x.go | 333 + .../x/sys/unix/zsysnum_linux_sparc64.go | 348 + .../x/sys/unix/zsysnum_netbsd_386.go | 274 + .../x/sys/unix/zsysnum_netbsd_amd64.go | 274 + .../x/sys/unix/zsysnum_netbsd_arm.go | 274 + .../x/sys/unix/zsysnum_openbsd_386.go | 207 + .../x/sys/unix/zsysnum_openbsd_amd64.go | 207 + .../x/sys/unix/zsysnum_openbsd_arm.go | 213 + .../x/sys/unix/zsysnum_solaris_amd64.go | 13 + .../x/sys/unix/ztypes_darwin_386.go | 462 + .../x/sys/unix/ztypes_darwin_amd64.go | 472 + .../x/sys/unix/ztypes_darwin_arm.go | 463 + .../x/sys/unix/ztypes_darwin_arm64.go | 471 + .../x/sys/unix/ztypes_dragonfly_amd64.go | 448 + .../x/sys/unix/ztypes_freebsd_386.go | 521 + .../x/sys/unix/ztypes_freebsd_amd64.go | 524 + .../x/sys/unix/ztypes_freebsd_arm.go | 524 + .../golang.org/x/sys/unix/ztypes_linux_386.go | 793 + .../x/sys/unix/ztypes_linux_amd64.go | 811 + .../golang.org/x/sys/unix/ztypes_linux_arm.go | 782 + .../x/sys/unix/ztypes_linux_arm64.go | 790 + .../x/sys/unix/ztypes_linux_mips.go | 787 + .../x/sys/unix/ztypes_linux_mips64.go | 792 + .../x/sys/unix/ztypes_linux_mips64le.go | 792 + .../x/sys/unix/ztypes_linux_mipsle.go | 787 + .../x/sys/unix/ztypes_linux_ppc64.go | 800 + .../x/sys/unix/ztypes_linux_ppc64le.go | 800 + .../x/sys/unix/ztypes_linux_s390x.go | 817 + .../x/sys/unix/ztypes_linux_sparc64.go | 666 + .../x/sys/unix/ztypes_netbsd_386.go | 401 + .../x/sys/unix/ztypes_netbsd_amd64.go | 408 + .../x/sys/unix/ztypes_netbsd_arm.go | 406 + .../x/sys/unix/ztypes_openbsd_386.go | 446 + .../x/sys/unix/ztypes_openbsd_amd64.go | 453 + .../x/sys/unix/ztypes_openbsd_arm.go | 439 + .../x/sys/unix/ztypes_solaris_amd64.go | 440 + .../x/sys/windows/asm_windows_386.s | 13 + .../x/sys/windows/asm_windows_amd64.s | 13 + .../golang.org/x/sys/windows/dll_windows.go | 377 + .../golang.org/x/sys/windows/env_unset.go | 15 + .../golang.org/x/sys/windows/env_windows.go | 25 + .../golang.org/x/sys/windows/eventlog.go | 20 + .../golang.org/x/sys/windows/exec_windows.go | 97 + .../x/sys/windows/memory_windows.go | 26 + .../golang.org/x/sys/windows/mksyscall.go | 7 + .../vendor/golang.org/x/sys/windows/race.go | 30 + .../vendor/golang.org/x/sys/windows/race0.go | 25 + .../x/sys/windows/registry/export_test.go | 11 + .../golang.org/x/sys/windows/registry/key.go | 200 + .../x/sys/windows/registry/mksyscall.go | 7 + .../x/sys/windows/registry/registry_test.go | 756 + .../x/sys/windows/registry/syscall.go | 32 + .../x/sys/windows/registry/value.go | 384 + .../sys/windows/registry/zsyscall_windows.go | 120 + .../x/sys/windows/security_windows.go | 435 + .../golang.org/x/sys/windows/service.go | 164 + .../vendor/golang.org/x/sys/windows/str.go | 22 + .../golang.org/x/sys/windows/svc/debug/log.go | 56 + .../x/sys/windows/svc/debug/service.go | 45 + .../golang.org/x/sys/windows/svc/event.go | 48 + .../x/sys/windows/svc/eventlog/install.go | 80 + .../x/sys/windows/svc/eventlog/log.go | 70 + .../x/sys/windows/svc/eventlog/log_test.go | 51 + .../x/sys/windows/svc/example/beep.go | 22 + .../x/sys/windows/svc/example/install.go | 92 + .../x/sys/windows/svc/example/main.go | 76 + .../x/sys/windows/svc/example/manage.go | 62 + .../x/sys/windows/svc/example/service.go | 82 + .../golang.org/x/sys/windows/svc/go12.c | 24 + .../golang.org/x/sys/windows/svc/go12.go | 11 + .../golang.org/x/sys/windows/svc/go13.go | 31 + .../x/sys/windows/svc/mgr/config.go | 139 + .../golang.org/x/sys/windows/svc/mgr/mgr.go | 162 + .../x/sys/windows/svc/mgr/mgr_test.go | 169 + .../x/sys/windows/svc/mgr/service.go | 72 + .../golang.org/x/sys/windows/svc/security.go | 62 + .../golang.org/x/sys/windows/svc/service.go | 363 + .../golang.org/x/sys/windows/svc/svc_test.go | 118 + .../golang.org/x/sys/windows/svc/sys_386.s | 68 + .../golang.org/x/sys/windows/svc/sys_amd64.s | 42 + .../golang.org/x/sys/windows/syscall.go | 71 + .../golang.org/x/sys/windows/syscall_test.go | 33 + .../x/sys/windows/syscall_windows.go | 1009 + .../x/sys/windows/syscall_windows_test.go | 107 + .../golang.org/x/sys/windows/types_windows.go | 1282 ++ .../x/sys/windows/types_windows_386.go | 22 + .../x/sys/windows/types_windows_amd64.go | 22 + .../x/sys/windows/zsyscall_windows.go | 2428 +++ .../alecthomas/kingpin.v2/.travis.yml | 4 + .../gopkg.in/alecthomas/kingpin.v2/COPYING | 19 + .../gopkg.in/alecthomas/kingpin.v2/README.md | 674 + .../kingpin.v2/_examples/chat1/main.go | 20 + .../kingpin.v2/_examples/chat2/main.go | 38 + .../kingpin.v2/_examples/completion/main.go | 96 + .../kingpin.v2/_examples/curl/main.go | 105 + .../kingpin.v2/_examples/modular/main.go | 30 + .../kingpin.v2/_examples/ping/main.go | 20 + .../gopkg.in/alecthomas/kingpin.v2/actions.go | 42 + .../gopkg.in/alecthomas/kingpin.v2/app.go | 685 + .../alecthomas/kingpin.v2/app_test.go | 404 + .../gopkg.in/alecthomas/kingpin.v2/args.go | 184 + .../alecthomas/kingpin.v2/args_test.go | 84 + .../gopkg.in/alecthomas/kingpin.v2/cmd.go | 274 + .../kingpin.v2/cmd/genvalues/main.go | 134 + .../alecthomas/kingpin.v2/cmd_test.go | 374 + .../alecthomas/kingpin.v2/completions.go | 33 + .../alecthomas/kingpin.v2/completions_test.go | 78 + .../gopkg.in/alecthomas/kingpin.v2/doc.go | 68 + .../gopkg.in/alecthomas/kingpin.v2/envar.go | 45 + .../alecthomas/kingpin.v2/examples_test.go | 46 + .../gopkg.in/alecthomas/kingpin.v2/flags.go | 308 + .../alecthomas/kingpin.v2/flags_test.go | 368 + .../gopkg.in/alecthomas/kingpin.v2/global.go | 94 + .../alecthomas/kingpin.v2/guesswidth.go | 9 + .../alecthomas/kingpin.v2/guesswidth_unix.go | 38 + .../gopkg.in/alecthomas/kingpin.v2/model.go | 227 + .../gopkg.in/alecthomas/kingpin.v2/parser.go | 382 + .../alecthomas/kingpin.v2/parser_test.go | 122 + .../gopkg.in/alecthomas/kingpin.v2/parsers.go | 212 + .../alecthomas/kingpin.v2/parsers_test.go | 98 + .../alecthomas/kingpin.v2/templates.go | 262 + .../gopkg.in/alecthomas/kingpin.v2/usage.go | 211 + .../alecthomas/kingpin.v2/usage_test.go | 65 + .../gopkg.in/alecthomas/kingpin.v2/values.go | 470 + .../alecthomas/kingpin.v2/values.json | 25 + .../alecthomas/kingpin.v2/values_generated.go | 821 + .../alecthomas/kingpin.v2/values_test.go | 98 + .../vendor/gopkg.in/fsnotify.v1/.editorconfig | 5 + .../fsnotify.v1/.github/ISSUE_TEMPLATE.md | 11 + .../.github/PULL_REQUEST_TEMPLATE.md | 8 + .../vendor/gopkg.in/fsnotify.v1/.gitignore | 6 + .../vendor/gopkg.in/fsnotify.v1/.travis.yml | 28 + .../vendor/gopkg.in/fsnotify.v1/AUTHORS | 46 + .../vendor/gopkg.in/fsnotify.v1/CHANGELOG.md | 307 + .../gopkg.in/fsnotify.v1/CONTRIBUTING.md | 77 + .../vendor/gopkg.in/fsnotify.v1/LICENSE | 28 + .../vendor/gopkg.in/fsnotify.v1/README.md | 50 + .../gopkg.in/fsnotify.v1/example_test.go | 42 + .../vendor/gopkg.in/fsnotify.v1/fen.go | 37 + .../vendor/gopkg.in/fsnotify.v1/fsnotify.go | 62 + .../gopkg.in/fsnotify.v1/fsnotify_test.go | 40 + .../vendor/gopkg.in/fsnotify.v1/inotify.go | 325 + .../gopkg.in/fsnotify.v1/inotify_poller.go | 187 + .../fsnotify.v1/inotify_poller_test.go | 229 + .../gopkg.in/fsnotify.v1/inotify_test.go | 360 + .../fsnotify.v1/integration_darwin_test.go | 147 + .../gopkg.in/fsnotify.v1/integration_test.go | 1237 ++ .../vendor/gopkg.in/fsnotify.v1/kqueue.go | 503 + .../gopkg.in/fsnotify.v1/open_mode_bsd.go | 11 + .../gopkg.in/fsnotify.v1/open_mode_darwin.go | 12 + .../vendor/gopkg.in/fsnotify.v1/windows.go | 561 + api/cmd/vistio/main.go | 195 + api/config/config.go | 177 + api/config/config_test.go | 26 + api/config/testdata/good_full.yaml | 92 + api/config/testdata/good_simple.yaml | 38 + api/model/snapshot.go | 10 + api/model/snapshot_test.go | 1 + api/model/vizceral.go | 61 + api/model/vizceral_test.go | 1 + api/retrieval/generator.go | 478 + api/retrieval/generator_test.go | 1 + api/retrieval/promquery.go | 78 + api/retrieval/promquery_test.go | 1 + api/retrieval/retriever.go | 212 + api/retrieval/retriever_test.go | 1 + api/storage/chunk.go | 117 + api/storage/chunk_test.go | 1 + api/storage/interface.go | 20 + api/storage/storage.go | 329 + api/storage/storage_test.go | 1 + api/storage/storagemock/Storage.go | 86 + .../github.com/alecthomas/template/LICENSE | 27 + .../github.com/alecthomas/template/README.md | 25 + .../github.com/alecthomas/template/doc.go | 406 + .../alecthomas/template/example_test.go | 72 + .../alecthomas/template/examplefiles_test.go | 183 + .../alecthomas/template/examplefunc_test.go | 55 + .../github.com/alecthomas/template/exec.go | 845 + .../alecthomas/template/exec_test.go | 1044 + .../github.com/alecthomas/template/funcs.go | 598 + .../github.com/alecthomas/template/helper.go | 108 + .../alecthomas/template/multi_test.go | 293 + .../alecthomas/template/parse/lex.go | 556 + .../alecthomas/template/parse/lex_test.go | 468 + .../alecthomas/template/parse/node.go | 834 + .../alecthomas/template/parse/parse.go | 700 + .../alecthomas/template/parse/parse_test.go | 426 + .../alecthomas/template/template.go | 218 + .../alecthomas/template/testdata/file1.tmpl | 2 + .../alecthomas/template/testdata/file2.tmpl | 2 + .../alecthomas/template/testdata/tmpl1.tmpl | 3 + .../alecthomas/template/testdata/tmpl2.tmpl | 3 + .../github.com/alecthomas/units/COPYING | 19 + .../github.com/alecthomas/units/README.md | 11 + .../github.com/alecthomas/units/bytes.go | 83 + .../github.com/alecthomas/units/bytes_test.go | 49 + api/vendor/github.com/alecthomas/units/doc.go | 13 + api/vendor/github.com/alecthomas/units/si.go | 26 + .../github.com/alecthomas/units/util.go | 138 + api/vendor/github.com/beorn7/perks/.gitignore | 2 + api/vendor/github.com/beorn7/perks/LICENSE | 20 + api/vendor/github.com/beorn7/perks/README.md | 31 + .../beorn7/perks/histogram/bench_test.go | 26 + .../beorn7/perks/histogram/histogram.go | 108 + .../beorn7/perks/histogram/histogram_test.go | 38 + .../beorn7/perks/quantile/bench_test.go | 63 + .../beorn7/perks/quantile/example_test.go | 121 + .../beorn7/perks/quantile/exampledata.txt | 2388 +++ .../beorn7/perks/quantile/stream.go | 316 + .../beorn7/perks/quantile/stream_test.go | 215 + .../github.com/beorn7/perks/topk/topk.go | 90 + .../github.com/beorn7/perks/topk/topk_test.go | 57 + .../github.com/cenkalti/backoff/.gitignore | 22 + .../github.com/cenkalti/backoff/.travis.yml | 10 + .../github.com/cenkalti/backoff/LICENSE | 20 + .../github.com/cenkalti/backoff/README.md | 30 + .../github.com/cenkalti/backoff/backoff.go | 66 + .../cenkalti/backoff/backoff_test.go | 27 + .../github.com/cenkalti/backoff/context.go | 60 + .../cenkalti/backoff/context_test.go | 26 + .../cenkalti/backoff/example_test.go | 73 + .../cenkalti/backoff/exponential.go | 158 + .../cenkalti/backoff/exponential_test.go | 108 + .../github.com/cenkalti/backoff/retry.go | 78 + .../github.com/cenkalti/backoff/retry_test.go | 99 + .../github.com/cenkalti/backoff/ticker.go | 84 + .../cenkalti/backoff/ticker_test.go | 98 + .../github.com/cenkalti/backoff/tries.go | 35 + .../github.com/cenkalti/backoff/tries_test.go | 55 + .../github.com/davecgh/go-spew/.gitignore | 22 + .../github.com/davecgh/go-spew/.travis.yml | 14 + api/vendor/github.com/davecgh/go-spew/LICENSE | 15 + .../github.com/davecgh/go-spew/README.md | 205 + .../github.com/davecgh/go-spew/cov_report.sh | 22 + .../github.com/davecgh/go-spew/spew/bypass.go | 152 + .../davecgh/go-spew/spew/bypasssafe.go | 38 + .../github.com/davecgh/go-spew/spew/common.go | 341 + .../davecgh/go-spew/spew/common_test.go | 298 + .../github.com/davecgh/go-spew/spew/config.go | 306 + .../github.com/davecgh/go-spew/spew/doc.go | 211 + .../github.com/davecgh/go-spew/spew/dump.go | 509 + .../davecgh/go-spew/spew/dump_test.go | 1042 + .../davecgh/go-spew/spew/dumpcgo_test.go | 99 + .../davecgh/go-spew/spew/dumpnocgo_test.go | 26 + .../davecgh/go-spew/spew/example_test.go | 226 + .../github.com/davecgh/go-spew/spew/format.go | 419 + .../davecgh/go-spew/spew/format_test.go | 1558 ++ .../davecgh/go-spew/spew/internal_test.go | 87 + .../go-spew/spew/internalunsafe_test.go | 102 + .../github.com/davecgh/go-spew/spew/spew.go | 148 + .../davecgh/go-spew/spew/spew_test.go | 320 + .../davecgh/go-spew/spew/testdata/dumpcgo.go | 82 + .../davecgh/go-spew/test_coverage.txt | 61 + .../github.com/golang/protobuf/.gitignore | 17 + .../github.com/golang/protobuf/.travis.yml | 30 + api/vendor/github.com/golang/protobuf/AUTHORS | 3 + .../github.com/golang/protobuf/CONTRIBUTORS | 3 + api/vendor/github.com/golang/protobuf/LICENSE | 31 + .../github.com/golang/protobuf/Makefile | 48 + .../github.com/golang/protobuf/README.md | 283 + .../golang/protobuf/conformance/Makefile | 49 + .../protobuf/conformance/conformance.go | 154 + .../protobuf/conformance/conformance.sh | 4 + .../protobuf/conformance/failure_list_go.txt | 61 + .../conformance_proto/conformance.pb.go | 1816 ++ .../conformance_proto/conformance.proto | 273 + .../golang/protobuf/conformance/test.sh | 26 + .../golang/protobuf/descriptor/descriptor.go | 93 + .../protobuf/descriptor/descriptor_test.go | 32 + .../golang/protobuf/jsonpb/jsonpb.go | 1241 ++ .../golang/protobuf/jsonpb/jsonpb_test.go | 1150 + .../jsonpb_test_proto/more_test_objects.pb.go | 368 + .../jsonpb_test_proto/more_test_objects.proto | 69 + .../jsonpb_test_proto/test_objects.pb.go | 1278 ++ .../jsonpb_test_proto/test_objects.proto | 171 + .../golang/protobuf/proto/all_test.go | 2410 +++ .../golang/protobuf/proto/any_test.go | 300 + .../github.com/golang/protobuf/proto/clone.go | 253 + .../golang/protobuf/proto/clone_test.go | 390 + .../golang/protobuf/proto/decode.go | 428 + .../golang/protobuf/proto/decode_test.go | 255 + .../golang/protobuf/proto/discard.go | 350 + .../golang/protobuf/proto/discard_test.go | 170 + .../golang/protobuf/proto/encode.go | 221 + .../golang/protobuf/proto/encode_test.go | 85 + .../github.com/golang/protobuf/proto/equal.go | 300 + .../golang/protobuf/proto/equal_test.go | 244 + .../golang/protobuf/proto/extensions.go | 543 + .../golang/protobuf/proto/extensions_test.go | 688 + .../github.com/golang/protobuf/proto/lib.go | 921 + .../golang/protobuf/proto/map_test.go | 70 + .../golang/protobuf/proto/message_set.go | 314 + .../golang/protobuf/proto/message_set_test.go | 77 + .../golang/protobuf/proto/pointer_reflect.go | 357 + .../golang/protobuf/proto/pointer_unsafe.go | 308 + .../golang/protobuf/proto/properties.go | 544 + .../protobuf/proto/proto3_proto/proto3.pb.go | 461 + .../protobuf/proto/proto3_proto/proto3.proto | 89 + .../golang/protobuf/proto/proto3_test.go | 151 + .../golang/protobuf/proto/size2_test.go | 63 + .../golang/protobuf/proto/size_test.go | 191 + .../golang/protobuf/proto/table_marshal.go | 2681 +++ .../golang/protobuf/proto/table_merge.go | 654 + .../golang/protobuf/proto/table_unmarshal.go | 1967 ++ .../protobuf/proto/test_proto/test.pb.go | 5118 +++++ .../protobuf/proto/test_proto/test.proto | 562 + .../github.com/golang/protobuf/proto/text.go | 843 + .../golang/protobuf/proto/text_parser.go | 880 + .../golang/protobuf/proto/text_parser_test.go | 706 + .../golang/protobuf/proto/text_test.go | 518 + .../protoc-gen-go/descriptor/descriptor.pb.go | 2812 +++ .../protoc-gen-go/descriptor/descriptor.proto | 872 + .../golang/protobuf/protoc-gen-go/doc.go | 51 + .../protoc-gen-go/generator/generator.go | 2928 +++ .../generator/internal/remap/remap.go | 117 + .../generator/internal/remap/remap_test.go | 82 + .../protoc-gen-go/generator/name_test.go | 115 + .../protobuf/protoc-gen-go/golden_test.go | 422 + .../protobuf/protoc-gen-go/grpc/grpc.go | 483 + .../protobuf/protoc-gen-go/link_grpc.go | 34 + .../golang/protobuf/protoc-gen-go/main.go | 98 + .../protoc-gen-go/plugin/plugin.pb.go | 369 + .../protoc-gen-go/plugin/plugin.pb.golden | 83 + .../protoc-gen-go/plugin/plugin.proto | 167 + .../testdata/deprecated/deprecated.pb.go | 232 + .../testdata/deprecated/deprecated.proto | 69 + .../extension_base/extension_base.pb.go | 139 + .../extension_base/extension_base.proto | 48 + .../extension_extra/extension_extra.pb.go | 78 + .../extension_extra/extension_extra.proto | 40 + .../protoc-gen-go/testdata/extension_test.go | 206 + .../extension_user/extension_user.pb.go | 401 + .../extension_user/extension_user.proto | 102 + .../protoc-gen-go/testdata/grpc/grpc.pb.go | 444 + .../protoc-gen-go/testdata/grpc/grpc.proto | 61 + .../testdata/import_public/a.pb.go | 110 + .../testdata/import_public/a.proto | 45 + .../testdata/import_public/b.pb.go | 87 + .../testdata/import_public/b.proto | 43 + .../testdata/import_public/sub/a.pb.go | 100 + .../testdata/import_public/sub/a.proto | 47 + .../testdata/import_public/sub/b.pb.go | 67 + .../testdata/import_public/sub/b.proto | 39 + .../testdata/import_public_test.go | 66 + .../testdata/imports/fmt/m.pb.go | 66 + .../testdata/imports/fmt/m.proto | 35 + .../testdata/imports/test_a_1/m1.pb.go | 130 + .../testdata/imports/test_a_1/m1.proto | 44 + .../testdata/imports/test_a_1/m2.pb.go | 67 + .../testdata/imports/test_a_1/m2.proto | 35 + .../testdata/imports/test_a_2/m3.pb.go | 67 + .../testdata/imports/test_a_2/m3.proto | 35 + .../testdata/imports/test_a_2/m4.pb.go | 67 + .../testdata/imports/test_a_2/m4.proto | 35 + .../testdata/imports/test_b_1/m1.pb.go | 67 + .../testdata/imports/test_b_1/m1.proto | 35 + .../testdata/imports/test_b_1/m2.pb.go | 67 + .../testdata/imports/test_b_1/m2.proto | 35 + .../testdata/imports/test_import_a1m1.pb.go | 80 + .../testdata/imports/test_import_a1m1.proto | 42 + .../testdata/imports/test_import_a1m2.pb.go | 80 + .../testdata/imports/test_import_a1m2.proto | 42 + .../testdata/imports/test_import_all.pb.go | 138 + .../testdata/imports/test_import_all.proto | 58 + .../protoc-gen-go/testdata/main_test.go | 48 + .../protoc-gen-go/testdata/multi/multi1.pb.go | 96 + .../protoc-gen-go/testdata/multi/multi1.proto | 46 + .../protoc-gen-go/testdata/multi/multi2.pb.go | 128 + .../protoc-gen-go/testdata/multi/multi2.proto | 48 + .../protoc-gen-go/testdata/multi/multi3.pb.go | 115 + .../protoc-gen-go/testdata/multi/multi3.proto | 45 + .../protoc-gen-go/testdata/my_test/test.pb.go | 1174 ++ .../protoc-gen-go/testdata/my_test/test.proto | 158 + .../testdata/proto3/proto3.pb.go | 196 + .../testdata/proto3/proto3.proto | 55 + .../github.com/golang/protobuf/ptypes/any.go | 139 + .../golang/protobuf/ptypes/any/any.pb.go | 191 + .../golang/protobuf/ptypes/any/any.proto | 149 + .../golang/protobuf/ptypes/any_test.go | 113 + .../github.com/golang/protobuf/ptypes/doc.go | 35 + .../golang/protobuf/ptypes/duration.go | 102 + .../protobuf/ptypes/duration/duration.pb.go | 159 + .../protobuf/ptypes/duration/duration.proto | 117 + .../golang/protobuf/ptypes/duration_test.go | 121 + .../golang/protobuf/ptypes/empty/empty.pb.go | 79 + .../golang/protobuf/ptypes/empty/empty.proto | 52 + .../protobuf/ptypes/struct/struct.pb.go | 440 + .../protobuf/ptypes/struct/struct.proto | 96 + .../golang/protobuf/ptypes/timestamp.go | 134 + .../protobuf/ptypes/timestamp/timestamp.pb.go | 175 + .../protobuf/ptypes/timestamp/timestamp.proto | 133 + .../golang/protobuf/ptypes/timestamp_test.go | 153 + .../protobuf/ptypes/wrappers/wrappers.pb.go | 443 + .../protobuf/ptypes/wrappers/wrappers.proto | 118 + .../github.com/golang/protobuf/regenerate.sh | 53 + .../golang_protobuf_extensions/.travis.yml | 8 + .../golang_protobuf_extensions/LICENSE | 201 + .../Makefile.TRAVIS | 15 + .../golang_protobuf_extensions/NOTICE | 1 + .../golang_protobuf_extensions/README.md | 20 + .../golang_protobuf_extensions/ext/moved.go | 2 + .../pbtest/deleted.go | 2 + .../pbutil/.gitignore | 1 + .../pbutil/Makefile | 7 + .../pbutil/all_test.go | 178 + .../pbutil/decode.go | 75 + .../pbutil/decode_test.go | 99 + .../golang_protobuf_extensions/pbutil/doc.go | 16 + .../pbutil/encode.go | 46 + .../pbutil/encode_test.go | 67 + .../testdata/README.THIRD_PARTY | 4 + .../testdata/test.pb.go | 4029 ++++ .../testdata/test.proto | 540 + .../github.com/pmezard/go-difflib/.travis.yml | 5 + .../github.com/pmezard/go-difflib/LICENSE | 27 + .../github.com/pmezard/go-difflib/README.md | 50 + .../pmezard/go-difflib/difflib/difflib.go | 772 + .../go-difflib/difflib/difflib_test.go | 426 + .../prometheus/client_golang/.gitignore | 26 + .../prometheus/client_golang/.travis.yml | 9 + .../prometheus/client_golang/AUTHORS.md | 18 + .../prometheus/client_golang/CHANGELOG.md | 109 + .../prometheus/client_golang/CONTRIBUTING.md | 18 + .../prometheus/client_golang/LICENSE | 201 + .../prometheus/client_golang/NOTICE | 23 + .../prometheus/client_golang/README.md | 45 + .../prometheus/client_golang/VERSION | 1 + .../client_golang/api/prometheus/api.go | 345 + .../client_golang/api/prometheus/api_test.go | 453 + .../client_golang/examples/random/main.go | 103 + .../client_golang/examples/simple/main.go | 30 + .../client_golang/prometheus/.gitignore | 1 + .../client_golang/prometheus/README.md | 1 + .../prometheus/benchmark_test.go | 183 + .../client_golang/prometheus/collector.go | 75 + .../client_golang/prometheus/counter.go | 172 + .../client_golang/prometheus/counter_test.go | 58 + .../client_golang/prometheus/desc.go | 205 + .../client_golang/prometheus/doc.go | 181 + .../prometheus/example_clustermanager_test.go | 118 + .../client_golang/prometheus/examples_test.go | 751 + .../prometheus/expvar_collector.go | 119 + .../prometheus/expvar_collector_test.go | 97 + .../client_golang/prometheus/fnv.go | 29 + .../client_golang/prometheus/gauge.go | 140 + .../client_golang/prometheus/gauge_test.go | 182 + .../client_golang/prometheus/go_collector.go | 263 + .../prometheus/go_collector_test.go | 123 + .../client_golang/prometheus/histogram.go | 444 + .../prometheus/histogram_test.go | 326 + .../client_golang/prometheus/http.go | 490 + .../client_golang/prometheus/http_test.go | 121 + .../client_golang/prometheus/metric.go | 166 + .../client_golang/prometheus/metric_test.go | 35 + .../prometheus/process_collector.go | 142 + .../prometheus/process_collector_test.go | 58 + .../client_golang/prometheus/promhttp/http.go | 201 + .../prometheus/promhttp/http_test.go | 137 + .../prometheus/push/examples_test.go | 56 + .../client_golang/prometheus/push/push.go | 172 + .../prometheus/push/push_test.go | 176 + .../client_golang/prometheus/registry.go | 806 + .../client_golang/prometheus/registry_test.go | 545 + .../client_golang/prometheus/summary.go | 534 + .../client_golang/prometheus/summary_test.go | 347 + .../client_golang/prometheus/untyped.go | 138 + .../client_golang/prometheus/value.go | 234 + .../client_golang/prometheus/vec.go | 404 + .../client_golang/prometheus/vec_test.go | 312 + .../prometheus/client_model/.gitignore | 1 + .../prometheus/client_model/CONTRIBUTING.md | 18 + .../prometheus/client_model/LICENSE | 201 + .../prometheus/client_model/MAINTAINERS.md | 1 + .../prometheus/client_model/Makefile | 62 + .../github.com/prometheus/client_model/NOTICE | 5 + .../prometheus/client_model/README.md | 26 + .../prometheus/client_model/cpp/metrics.pb.cc | 3380 +++ .../prometheus/client_model/cpp/metrics.pb.h | 2072 ++ .../prometheus/client_model/go/metrics.pb.go | 364 + .../prometheus/client_model/metrics.proto | 81 + .../prometheus/client_model/pom.xml | 130 + .../python/prometheus/__init__.py | 12 + .../python/prometheus/client/__init__.py | 12 + .../prometheus/client/model/__init__.py | 14 + .../prometheus/client/model/metrics_pb2.py | 575 + .../prometheus/client_model/ruby/.gitignore | 5 + .../prometheus/client_model/ruby/Gemfile | 4 + .../prometheus/client_model/ruby/LICENSE | 201 + .../prometheus/client_model/ruby/Makefile | 17 + .../prometheus/client_model/ruby/README.md | 31 + .../prometheus/client_model/ruby/Rakefile | 1 + .../ruby/lib/prometheus/client/model.rb | 2 + .../lib/prometheus/client/model/metrics.pb.rb | 111 + .../lib/prometheus/client/model/version.rb | 7 + .../ruby/prometheus-client-model.gemspec | 22 + .../prometheus/client_model/setup.py | 23 + .../java/io/prometheus/client/Metrics.java | 7683 +++++++ .../github.com/prometheus/common/.travis.yml | 6 + .../prometheus/common/CONTRIBUTING.md | 18 + .../github.com/prometheus/common/LICENSE | 201 + .../prometheus/common/MAINTAINERS.md | 1 + .../github.com/prometheus/common/NOTICE | 5 + .../github.com/prometheus/common/README.md | 12 + .../prometheus/common/config/config.go | 34 + .../prometheus/common/config/http_config.go | 317 + .../common/config/http_config_test.go | 618 + .../common/config/testdata/barney-no-pass.key | 27 + .../common/config/testdata/barney.crt | 96 + .../config/testdata/basic-auth-password | 1 + .../common/config/testdata/bearer.token | 1 + .../testdata/http.conf.basic-auth.good.yaml | 3 + .../http.conf.basic-auth.no-password.yaml | 2 + .../http.conf.basic-auth.no-username.yaml | 2 + .../http.conf.basic-auth.too-much.bad.yaml | 4 + ...ttp.conf.bearer-token-and-file-set.bad.yml | 5 + .../config/testdata/http.conf.empty.bad.yml | 4 + .../common/config/testdata/http.conf.good.yml | 4 + ...ttp.conf.invalid-bearer-token-file.bad.yml | 1 + .../common/config/testdata/server.crt | 96 + .../common/config/testdata/server.key | 28 + .../common/config/testdata/tls-ca-chain.pem | 172 + .../testdata/tls_config.cert_no_key.bad.yml | 1 + .../config/testdata/tls_config.empty.good.yml | 0 .../testdata/tls_config.insecure.good.yml | 1 + .../testdata/tls_config.invalid_field.bad.yml | 1 + .../testdata/tls_config.key_no_cert.bad.yml | 1 + .../common/config/tls_config_test.go | 62 + .../prometheus/common/expfmt/bench_test.go | 167 + .../prometheus/common/expfmt/decode.go | 429 + .../prometheus/common/expfmt/decode_test.go | 435 + .../prometheus/common/expfmt/encode.go | 88 + .../prometheus/common/expfmt/expfmt.go | 38 + .../prometheus/common/expfmt/fuzz.go | 36 + .../expfmt/fuzz/corpus/from_test_parse_0 | 2 + .../expfmt/fuzz/corpus/from_test_parse_1 | 6 + .../expfmt/fuzz/corpus/from_test_parse_2 | 12 + .../expfmt/fuzz/corpus/from_test_parse_3 | 22 + .../expfmt/fuzz/corpus/from_test_parse_4 | 10 + .../fuzz/corpus/from_test_parse_error_0 | 1 + .../fuzz/corpus/from_test_parse_error_1 | 1 + .../fuzz/corpus/from_test_parse_error_10 | 1 + .../fuzz/corpus/from_test_parse_error_11 | 1 + .../fuzz/corpus/from_test_parse_error_12 | 3 + .../fuzz/corpus/from_test_parse_error_13 | 3 + .../fuzz/corpus/from_test_parse_error_14 | 3 + .../fuzz/corpus/from_test_parse_error_15 | 2 + .../fuzz/corpus/from_test_parse_error_16 | 2 + .../fuzz/corpus/from_test_parse_error_17 | 1 + .../fuzz/corpus/from_test_parse_error_18 | 1 + .../fuzz/corpus/from_test_parse_error_19 | 3 + .../fuzz/corpus/from_test_parse_error_2 | 3 + .../fuzz/corpus/from_test_parse_error_3 | 1 + .../fuzz/corpus/from_test_parse_error_4 | 1 + .../fuzz/corpus/from_test_parse_error_5 | 1 + .../fuzz/corpus/from_test_parse_error_6 | 1 + .../fuzz/corpus/from_test_parse_error_7 | 3 + .../fuzz/corpus/from_test_parse_error_8 | 1 + .../fuzz/corpus/from_test_parse_error_9 | 1 + .../common/expfmt/fuzz/corpus/minimal | 1 + .../prometheus/common/expfmt/testdata/json2 | 46 + .../common/expfmt/testdata/json2_bad | 46 + .../common/expfmt/testdata/protobuf | Bin 0 -> 8239 bytes .../common/expfmt/testdata/protobuf.gz | Bin 0 -> 2097 bytes .../prometheus/common/expfmt/testdata/text | 322 + .../prometheus/common/expfmt/testdata/text.gz | Bin 0 -> 2598 bytes .../prometheus/common/expfmt/text_create.go | 303 + .../common/expfmt/text_create_test.go | 443 + .../prometheus/common/expfmt/text_parse.go | 757 + .../common/expfmt/text_parse_test.go | 593 + .../bitbucket.org/ww/goautoneg/README.txt | 67 + .../bitbucket.org/ww/goautoneg/autoneg.go | 162 + .../ww/goautoneg/autoneg_test.go | 33 + .../common/log/eventlog_formatter.go | 89 + .../github.com/prometheus/common/log/log.go | 364 + .../prometheus/common/log/log_test.go | 39 + .../prometheus/common/log/syslog_formatter.go | 126 + .../common/log/syslog_formatter_test.go | 52 + .../prometheus/common/model/alert.go | 136 + .../prometheus/common/model/alert_test.go | 118 + .../prometheus/common/model/fingerprinting.go | 105 + .../github.com/prometheus/common/model/fnv.go | 42 + .../prometheus/common/model/labels.go | 210 + .../prometheus/common/model/labels_test.go | 140 + .../prometheus/common/model/labelset.go | 169 + .../prometheus/common/model/metric.go | 103 + .../prometheus/common/model/metric_test.go | 132 + .../prometheus/common/model/model.go | 16 + .../prometheus/common/model/signature.go | 144 + .../prometheus/common/model/signature_test.go | 314 + .../prometheus/common/model/silence.go | 106 + .../prometheus/common/model/silence_test.go | 228 + .../prometheus/common/model/time.go | 264 + .../prometheus/common/model/time_test.go | 132 + .../prometheus/common/model/value.go | 416 + .../prometheus/common/model/value_test.go | 468 + .../prometheus/common/promlog/flag/flag.go | 33 + .../prometheus/common/promlog/log.go | 63 + .../prometheus/common/route/route.go | 110 + .../prometheus/common/route/route_test.go | 76 + .../prometheus/common/version/info.go | 89 + .../github.com/prometheus/procfs/.gitignore | 1 + .../github.com/prometheus/procfs/.travis.yml | 15 + .../prometheus/procfs/CONTRIBUTING.md | 18 + .../github.com/prometheus/procfs/LICENSE | 201 + .../prometheus/procfs/MAINTAINERS.md | 1 + .../github.com/prometheus/procfs/Makefile | 71 + .../github.com/prometheus/procfs/NOTICE | 7 + .../github.com/prometheus/procfs/README.md | 11 + .../prometheus/procfs/bcache/bcache.go | 84 + .../prometheus/procfs/bcache/get.go | 330 + .../prometheus/procfs/bcache/get_test.go | 114 + .../github.com/prometheus/procfs/buddyinfo.go | 95 + .../prometheus/procfs/buddyinfo_test.go | 64 + .../github.com/prometheus/procfs/doc.go | 45 + .../prometheus/procfs/fixtures.ttar | 446 + api/vendor/github.com/prometheus/procfs/fs.go | 82 + .../github.com/prometheus/procfs/fs_test.go | 39 + .../prometheus/procfs/internal/util/parse.go | 46 + .../github.com/prometheus/procfs/ipvs.go | 259 + .../github.com/prometheus/procfs/ipvs_test.go | 250 + .../github.com/prometheus/procfs/mdstat.go | 151 + .../prometheus/procfs/mdstat_test.go | 44 + .../prometheus/procfs/mountstats.go | 569 + .../prometheus/procfs/mountstats_test.go | 286 + .../github.com/prometheus/procfs/net_dev.go | 216 + .../prometheus/procfs/net_dev_test.go | 86 + .../github.com/prometheus/procfs/nfs/nfs.go | 263 + .../github.com/prometheus/procfs/nfs/parse.go | 317 + .../prometheus/procfs/nfs/parse_nfs.go | 67 + .../prometheus/procfs/nfs/parse_nfs_test.go | 305 + .../prometheus/procfs/nfs/parse_nfsd.go | 89 + .../prometheus/procfs/nfs/parse_nfsd_test.go | 196 + .../github.com/prometheus/procfs/proc.go | 238 + .../github.com/prometheus/procfs/proc_io.go | 65 + .../prometheus/procfs/proc_io_test.go | 46 + .../prometheus/procfs/proc_limits.go | 150 + .../prometheus/procfs/proc_limits_test.go | 44 + .../github.com/prometheus/procfs/proc_ns.go | 68 + .../prometheus/procfs/proc_ns_test.go | 44 + .../github.com/prometheus/procfs/proc_stat.go | 188 + .../prometheus/procfs/proc_stat_test.go | 123 + .../github.com/prometheus/procfs/proc_test.go | 174 + .../procfs/scripts/check_license.sh | 29 + .../github.com/prometheus/procfs/stat.go | 232 + .../github.com/prometheus/procfs/stat_test.go | 74 + .../prometheus/procfs/sysfs/.gitignore | 1 + .../github.com/prometheus/procfs/sysfs/doc.go | 16 + .../prometheus/procfs/sysfs/fixtures.ttar | 851 + .../github.com/prometheus/procfs/sysfs/fs.go | 108 + .../prometheus/procfs/sysfs/fs_test.go | 108 + .../prometheus/procfs/sysfs/net_class.go | 174 + .../prometheus/procfs/sysfs/net_class_test.go | 88 + api/vendor/github.com/prometheus/procfs/ttar | 389 + .../github.com/prometheus/procfs/xfrm.go | 187 + .../github.com/prometheus/procfs/xfrm_test.go | 66 + .../github.com/prometheus/procfs/xfs/parse.go | 330 + .../prometheus/procfs/xfs/parse_test.go | 442 + .../github.com/prometheus/procfs/xfs/xfs.go | 163 + api/vendor/github.com/rs/cors/.travis.yml | 8 + api/vendor/github.com/rs/cors/LICENSE | 19 + api/vendor/github.com/rs/cors/README.md | 105 + api/vendor/github.com/rs/cors/bench_test.go | 88 + api/vendor/github.com/rs/cors/cors.go | 407 + api/vendor/github.com/rs/cors/cors_test.go | 521 + .../rs/cors/examples/alice/server.go | 24 + .../rs/cors/examples/buffalo/server.go | 36 + .../rs/cors/examples/default/server.go | 19 + .../github.com/rs/cors/examples/gin/server.go | 19 + .../rs/cors/examples/goji/server.go | 22 + .../rs/cors/examples/gorilla/server.go | 20 + .../rs/cors/examples/httprouter/server.go | 22 + .../rs/cors/examples/martini/server.go | 23 + .../rs/cors/examples/negroni/server.go | 26 + .../rs/cors/examples/nethttp/server.go | 20 + .../rs/cors/examples/openbar/server.go | 22 + api/vendor/github.com/rs/cors/go.mod | 1 + api/vendor/github.com/rs/cors/utils.go | 70 + api/vendor/github.com/rs/cors/utils_test.go | 70 + .../github.com/rs/cors/wrapper/gin/gin.go | 50 + .../rs/cors/wrapper/gin/gin_test.go | 76 + .../github.com/stretchr/objx/.gitignore | 4 + .../github.com/stretchr/objx/.travis.yml | 13 + .../github.com/stretchr/objx/Gopkg.lock | 27 + .../github.com/stretchr/objx/Gopkg.toml | 3 + api/vendor/github.com/stretchr/objx/LICENSE | 22 + api/vendor/github.com/stretchr/objx/README.md | 78 + .../github.com/stretchr/objx/Taskfile.yml | 26 + .../github.com/stretchr/objx/accessors.go | 171 + .../stretchr/objx/accessors_test.go | 133 + .../stretchr/objx/codegen/array-access.txt | 14 + .../stretchr/objx/codegen/index.html | 86 + .../stretchr/objx/codegen/template.txt | 124 + .../stretchr/objx/codegen/template_test.txt | 121 + .../stretchr/objx/codegen/types_list.txt | 20 + .../github.com/stretchr/objx/constants.go | 13 + .../github.com/stretchr/objx/conversions.go | 108 + .../stretchr/objx/conversions_test.go | 80 + api/vendor/github.com/stretchr/objx/doc.go | 66 + .../github.com/stretchr/objx/fixture_test.go | 95 + api/vendor/github.com/stretchr/objx/map.go | 193 + .../github.com/stretchr/objx/map_for_test.go | 10 + .../github.com/stretchr/objx/map_test.go | 123 + .../github.com/stretchr/objx/mutations.go | 74 + .../stretchr/objx/mutations_test.go | 72 + .../github.com/stretchr/objx/security.go | 17 + .../github.com/stretchr/objx/security_test.go | 11 + .../stretchr/objx/simple_example_test.go | 40 + api/vendor/github.com/stretchr/objx/tests.go | 17 + .../github.com/stretchr/objx/tests_test.go | 24 + .../stretchr/objx/type_specific_codegen.go | 2501 +++ .../objx/type_specific_codegen_test.go | 2448 +++ api/vendor/github.com/stretchr/objx/value.go | 56 + .../github.com/stretchr/objx/value_test.go | 69 + .../github.com/stretchr/testify/.gitignore | 24 + .../stretchr/testify/.travis.gofmt.sh | 7 + .../stretchr/testify/.travis.gogenerate.sh | 13 + .../stretchr/testify/.travis.govet.sh | 10 + .../github.com/stretchr/testify/.travis.yml | 15 + .../github.com/stretchr/testify/Gopkg.lock | 27 + .../github.com/stretchr/testify/Gopkg.toml | 16 + .../github.com/stretchr/testify/LICENSE | 22 + .../github.com/stretchr/testify/README.md | 301 + .../stretchr/testify/_codegen/main.go | 316 + .../testify/assert/assertion_format.go | 349 + .../testify/assert/assertion_format.go.tmpl | 4 + .../testify/assert/assertion_forward.go | 686 + .../testify/assert/assertion_forward.go.tmpl | 4 + .../stretchr/testify/assert/assertions.go | 1256 ++ .../testify/assert/assertions_test.go | 1581 ++ .../github.com/stretchr/testify/assert/doc.go | 45 + .../stretchr/testify/assert/errors.go | 10 + .../testify/assert/forward_assertions.go | 16 + .../testify/assert/forward_assertions_test.go | 611 + .../testify/assert/http_assertions.go | 127 + .../testify/assert/http_assertions_test.go | 117 + api/vendor/github.com/stretchr/testify/doc.go | 22 + .../github.com/stretchr/testify/http/doc.go | 2 + .../testify/http/test_response_writer.go | 49 + .../testify/http/test_round_tripper.go | 17 + .../github.com/stretchr/testify/mock/doc.go | 44 + .../github.com/stretchr/testify/mock/mock.go | 815 + .../stretchr/testify/mock/mock_test.go | 1352 ++ .../stretchr/testify/package_test.go | 12 + .../stretchr/testify/require/doc.go | 28 + .../testify/require/forward_requirements.go | 16 + .../require/forward_requirements_test.go | 385 + .../stretchr/testify/require/require.go | 867 + .../stretchr/testify/require/require.go.tmpl | 6 + .../testify/require/require_forward.go | 687 + .../testify/require/require_forward.go.tmpl | 4 + .../stretchr/testify/require/requirements.go | 9 + .../testify/require/requirements_test.go | 369 + .../github.com/stretchr/testify/suite/doc.go | 65 + .../stretchr/testify/suite/interfaces.go | 46 + .../stretchr/testify/suite/suite.go | 136 + .../stretchr/testify/suite/suite_test.go | 294 + api/vendor/go.uber.org/atomic/.codecov.yml | 15 + .../atomic/.github/PULL_REQUEST_TEMPLATE.md | 8 + api/vendor/go.uber.org/atomic/.gitignore | 11 + api/vendor/go.uber.org/atomic/.travis.yml | 23 + api/vendor/go.uber.org/atomic/LICENSE.txt | 19 + api/vendor/go.uber.org/atomic/Makefile | 64 + api/vendor/go.uber.org/atomic/README.md | 36 + api/vendor/go.uber.org/atomic/atomic.go | 351 + api/vendor/go.uber.org/atomic/atomic_test.go | 172 + api/vendor/go.uber.org/atomic/example_test.go | 43 + api/vendor/go.uber.org/atomic/glide.lock | 17 + api/vendor/go.uber.org/atomic/glide.yaml | 6 + .../go.uber.org/atomic/scripts/cover.sh | 40 + .../go.uber.org/atomic/scripts/test-ubergo.sh | 26 + api/vendor/go.uber.org/atomic/stress_test.go | 258 + api/vendor/go.uber.org/atomic/string.go | 49 + api/vendor/go.uber.org/atomic/string_test.go | 43 + api/vendor/go.uber.org/multierr/.codecov.yml | 15 + api/vendor/go.uber.org/multierr/.gitignore | 1 + api/vendor/go.uber.org/multierr/.travis.yml | 33 + api/vendor/go.uber.org/multierr/CHANGELOG.md | 28 + api/vendor/go.uber.org/multierr/LICENSE.txt | 19 + api/vendor/go.uber.org/multierr/Makefile | 74 + api/vendor/go.uber.org/multierr/README.md | 23 + .../go.uber.org/multierr/benchmarks_test.go | 62 + api/vendor/go.uber.org/multierr/error.go | 401 + api/vendor/go.uber.org/multierr/error_test.go | 511 + .../go.uber.org/multierr/example_test.go | 72 + api/vendor/go.uber.org/multierr/glide.lock | 19 + api/vendor/go.uber.org/multierr/glide.yaml | 8 + .../go.uber.org/multierr/scripts/cover.sh | 40 + api/vendor/go.uber.org/zap/.codecov.yml | 17 + api/vendor/go.uber.org/zap/.gitignore | 28 + api/vendor/go.uber.org/zap/.readme.tmpl | 108 + api/vendor/go.uber.org/zap/.travis.yml | 21 + api/vendor/go.uber.org/zap/CHANGELOG.md | 286 + api/vendor/go.uber.org/zap/CODE_OF_CONDUCT.md | 75 + api/vendor/go.uber.org/zap/CONTRIBUTING.md | 81 + api/vendor/go.uber.org/zap/FAQ.md | 154 + api/vendor/go.uber.org/zap/LICENSE.txt | 19 + api/vendor/go.uber.org/zap/Makefile | 76 + api/vendor/go.uber.org/zap/README.md | 136 + api/vendor/go.uber.org/zap/array.go | 320 + api/vendor/go.uber.org/zap/array_test.go | 107 + .../go.uber.org/zap/benchmarks/apex_test.go | 57 + api/vendor/go.uber.org/zap/benchmarks/doc.go | 23 + .../go.uber.org/zap/benchmarks/kit_test.go | 31 + .../go.uber.org/zap/benchmarks/lion_test.go | 31 + .../go.uber.org/zap/benchmarks/log15_test.go | 33 + .../go.uber.org/zap/benchmarks/logrus_test.go | 57 + .../zap/benchmarks/scenario_bench_test.go | 614 + .../go.uber.org/zap/benchmarks/zap_test.go | 172 + .../zap/benchmarks/zerolog_test.go | 63 + api/vendor/go.uber.org/zap/buffer/buffer.go | 106 + .../go.uber.org/zap/buffer/buffer_test.go | 91 + api/vendor/go.uber.org/zap/buffer/pool.go | 49 + .../go.uber.org/zap/buffer/pool_test.go | 52 + api/vendor/go.uber.org/zap/check_license.sh | 17 + api/vendor/go.uber.org/zap/common_test.go | 57 + api/vendor/go.uber.org/zap/config.go | 243 + api/vendor/go.uber.org/zap/config_test.go | 108 + api/vendor/go.uber.org/zap/doc.go | 113 + api/vendor/go.uber.org/zap/encoder.go | 75 + api/vendor/go.uber.org/zap/encoder_test.go | 88 + api/vendor/go.uber.org/zap/error.go | 80 + api/vendor/go.uber.org/zap/error_test.go | 99 + api/vendor/go.uber.org/zap/example_test.go | 327 + api/vendor/go.uber.org/zap/field.go | 310 + api/vendor/go.uber.org/zap/field_test.go | 159 + api/vendor/go.uber.org/zap/flag.go | 39 + api/vendor/go.uber.org/zap/flag_test.go | 102 + api/vendor/go.uber.org/zap/glide.lock | 76 + api/vendor/go.uber.org/zap/glide.yaml | 35 + api/vendor/go.uber.org/zap/global.go | 169 + api/vendor/go.uber.org/zap/global_test.go | 280 + api/vendor/go.uber.org/zap/http_handler.go | 81 + .../go.uber.org/zap/http_handler_test.go | 131 + .../zap/internal/bufferpool/bufferpool.go | 31 + .../go.uber.org/zap/internal/color/color.go | 44 + .../zap/internal/color/color_test.go | 36 + .../go.uber.org/zap/internal/exit/exit.go | 64 + .../zap/internal/exit/exit_test.go | 42 + .../go.uber.org/zap/internal/readme/readme.go | 209 + .../go.uber.org/zap/internal/ztest/doc.go | 24 + .../go.uber.org/zap/internal/ztest/timeout.go | 59 + .../go.uber.org/zap/internal/ztest/writer.go | 96 + api/vendor/go.uber.org/zap/level.go | 132 + api/vendor/go.uber.org/zap/level_test.go | 117 + api/vendor/go.uber.org/zap/logger.go | 305 + .../go.uber.org/zap/logger_bench_test.go | 222 + api/vendor/go.uber.org/zap/logger_test.go | 432 + api/vendor/go.uber.org/zap/options.go | 109 + api/vendor/go.uber.org/zap/scripts/cover.sh | 12 + api/vendor/go.uber.org/zap/stacktrace.go | 126 + .../go.uber.org/zap/stacktrace_ext_test.go | 164 + api/vendor/go.uber.org/zap/stacktrace_test.go | 75 + api/vendor/go.uber.org/zap/sugar.go | 304 + api/vendor/go.uber.org/zap/sugar_test.go | 374 + api/vendor/go.uber.org/zap/time.go | 27 + api/vendor/go.uber.org/zap/time_test.go | 42 + api/vendor/go.uber.org/zap/writer.go | 96 + api/vendor/go.uber.org/zap/writer_test.go | 125 + .../zap/zapcore/console_encoder.go | 147 + .../zap/zapcore/console_encoder_bench_test.go | 49 + api/vendor/go.uber.org/zap/zapcore/core.go | 113 + .../go.uber.org/zap/zapcore/core_test.go | 163 + api/vendor/go.uber.org/zap/zapcore/doc.go | 24 + api/vendor/go.uber.org/zap/zapcore/encoder.go | 348 + .../go.uber.org/zap/zapcore/encoder_test.go | 636 + api/vendor/go.uber.org/zap/zapcore/entry.go | 257 + .../go.uber.org/zap/zapcore/entry_test.go | 107 + api/vendor/go.uber.org/zap/zapcore/error.go | 120 + .../go.uber.org/zap/zapcore/error_test.go | 177 + api/vendor/go.uber.org/zap/zapcore/field.go | 201 + .../go.uber.org/zap/zapcore/field_test.go | 231 + api/vendor/go.uber.org/zap/zapcore/hook.go | 68 + .../go.uber.org/zap/zapcore/hook_test.go | 73 + .../go.uber.org/zap/zapcore/json_encoder.go | 480 + .../zap/zapcore/json_encoder_bench_test.go | 91 + .../zap/zapcore/json_encoder_impl_test.go | 479 + api/vendor/go.uber.org/zap/zapcore/level.go | 175 + .../go.uber.org/zap/zapcore/level_strings.go | 46 + .../zap/zapcore/level_strings_test.go | 38 + .../go.uber.org/zap/zapcore/level_test.go | 177 + .../go.uber.org/zap/zapcore/marshaler.go | 53 + .../go.uber.org/zap/zapcore/memory_encoder.go | 179 + .../zap/zapcore/memory_encoder_test.go | 285 + api/vendor/go.uber.org/zap/zapcore/sampler.go | 134 + .../zap/zapcore/sampler_bench_test.go | 230 + .../go.uber.org/zap/zapcore/sampler_test.go | 225 + api/vendor/go.uber.org/zap/zapcore/tee.go | 81 + .../zap/zapcore/tee_logger_bench_test.go | 62 + .../go.uber.org/zap/zapcore/tee_test.go | 153 + .../go.uber.org/zap/zapcore/write_syncer.go | 123 + .../zap/zapcore/write_syncer_bench_test.go | 56 + .../zap/zapcore/write_syncer_test.go | 137 + api/vendor/go.uber.org/zap/zapgrpc/zapgrpc.go | 100 + .../go.uber.org/zap/zapgrpc/zapgrpc_test.go | 115 + api/vendor/go.uber.org/zap/zaptest/doc.go | 22 + api/vendor/go.uber.org/zap/zaptest/logger.go | 124 + .../go.uber.org/zap/zaptest/logger_test.go | 169 + .../zap/zaptest/observer/logged_entry.go | 39 + .../zap/zaptest/observer/logged_entry_test.go | 88 + .../zap/zaptest/observer/observer.go | 167 + .../zap/zaptest/observer/observer_test.go | 215 + .../go.uber.org/zap/zaptest/testingt.go | 47 + .../go.uber.org/zap/zaptest/testingt_test.go | 29 + api/vendor/go.uber.org/zap/zaptest/timeout.go | 45 + .../go.uber.org/zap/zaptest/timeout_test.go | 43 + api/vendor/go.uber.org/zap/zaptest/writer.go | 44 + .../go.uber.org/zap/zaptest/writer_test.go | 68 + api/vendor/golang.org/x/net/.gitattributes | 10 + api/vendor/golang.org/x/net/.gitignore | 2 + api/vendor/golang.org/x/net/AUTHORS | 3 + api/vendor/golang.org/x/net/CONTRIBUTING.md | 26 + api/vendor/golang.org/x/net/CONTRIBUTORS | 3 + api/vendor/golang.org/x/net/LICENSE | 27 + api/vendor/golang.org/x/net/PATENTS | 22 + api/vendor/golang.org/x/net/README.md | 16 + api/vendor/golang.org/x/net/bpf/asm.go | 41 + api/vendor/golang.org/x/net/bpf/constants.go | 218 + api/vendor/golang.org/x/net/bpf/doc.go | 82 + .../golang.org/x/net/bpf/instructions.go | 704 + .../golang.org/x/net/bpf/instructions_test.go | 525 + api/vendor/golang.org/x/net/bpf/setter.go | 10 + .../x/net/bpf/testdata/all_instructions.bpf | 1 + .../x/net/bpf/testdata/all_instructions.txt | 79 + api/vendor/golang.org/x/net/bpf/vm.go | 140 + .../golang.org/x/net/bpf/vm_aluop_test.go | 512 + .../golang.org/x/net/bpf/vm_bpf_test.go | 192 + .../golang.org/x/net/bpf/vm_extension_test.go | 49 + .../golang.org/x/net/bpf/vm_instructions.go | 174 + .../golang.org/x/net/bpf/vm_jump_test.go | 380 + .../golang.org/x/net/bpf/vm_load_test.go | 246 + .../golang.org/x/net/bpf/vm_ret_test.go | 115 + .../golang.org/x/net/bpf/vm_scratch_test.go | 247 + api/vendor/golang.org/x/net/bpf/vm_test.go | 144 + api/vendor/golang.org/x/net/codereview.cfg | 1 + .../golang.org/x/net/context/context.go | 56 + .../golang.org/x/net/context/context_test.go | 583 + .../x/net/context/ctxhttp/ctxhttp.go | 74 + .../x/net/context/ctxhttp/ctxhttp_17_test.go | 29 + .../x/net/context/ctxhttp/ctxhttp_pre17.go | 147 + .../net/context/ctxhttp/ctxhttp_pre17_test.go | 79 + .../x/net/context/ctxhttp/ctxhttp_test.go | 105 + api/vendor/golang.org/x/net/context/go17.go | 72 + api/vendor/golang.org/x/net/context/go19.go | 20 + .../golang.org/x/net/context/pre_go17.go | 300 + .../golang.org/x/net/context/pre_go19.go | 109 + .../x/net/context/withtimeout_test.go | 31 + api/vendor/golang.org/x/net/dict/dict.go | 210 + .../x/net/dns/dnsmessage/example_test.go | 132 + .../x/net/dns/dnsmessage/message.go | 2247 ++ .../x/net/dns/dnsmessage/message_test.go | 1316 ++ api/vendor/golang.org/x/net/html/atom/atom.go | 78 + .../golang.org/x/net/html/atom/atom_test.go | 109 + api/vendor/golang.org/x/net/html/atom/gen.go | 712 + .../golang.org/x/net/html/atom/table.go | 783 + .../golang.org/x/net/html/atom/table_test.go | 376 + .../golang.org/x/net/html/charset/charset.go | 257 + .../x/net/html/charset/charset_test.go | 237 + .../html/charset/testdata/HTTP-charset.html | 48 + .../charset/testdata/HTTP-vs-UTF-8-BOM.html | 48 + .../testdata/HTTP-vs-meta-charset.html | 49 + .../testdata/HTTP-vs-meta-content.html | 49 + .../testdata/No-encoding-declaration.html | 47 + .../x/net/html/charset/testdata/README | 9 + .../html/charset/testdata/UTF-16BE-BOM.html | Bin 0 -> 2670 bytes .../html/charset/testdata/UTF-16LE-BOM.html | Bin 0 -> 2682 bytes .../testdata/UTF-8-BOM-vs-meta-charset.html | 49 + .../testdata/UTF-8-BOM-vs-meta-content.html | 48 + .../testdata/meta-charset-attribute.html | 48 + .../testdata/meta-content-attribute.html | 48 + api/vendor/golang.org/x/net/html/const.go | 104 + api/vendor/golang.org/x/net/html/doc.go | 106 + api/vendor/golang.org/x/net/html/doctype.go | 156 + api/vendor/golang.org/x/net/html/entity.go | 2253 ++ .../golang.org/x/net/html/entity_test.go | 29 + api/vendor/golang.org/x/net/html/escape.go | 258 + .../golang.org/x/net/html/escape_test.go | 97 + .../golang.org/x/net/html/example_test.go | 40 + api/vendor/golang.org/x/net/html/foreign.go | 226 + api/vendor/golang.org/x/net/html/node.go | 220 + api/vendor/golang.org/x/net/html/node_test.go | 146 + api/vendor/golang.org/x/net/html/parse.go | 2305 ++ .../golang.org/x/net/html/parse_test.go | 400 + api/vendor/golang.org/x/net/html/render.go | 271 + .../golang.org/x/net/html/render_test.go | 156 + .../golang.org/x/net/html/testdata/go1.html | 2237 ++ .../x/net/html/testdata/webkit/README | 28 + .../x/net/html/testdata/webkit/adoption01.dat | 194 + .../x/net/html/testdata/webkit/adoption02.dat | 31 + .../x/net/html/testdata/webkit/comments01.dat | 135 + .../x/net/html/testdata/webkit/doctype01.dat | 370 + .../x/net/html/testdata/webkit/entities01.dat | 603 + .../x/net/html/testdata/webkit/entities02.dat | 249 + .../html/testdata/webkit/html5test-com.dat | 246 + .../x/net/html/testdata/webkit/inbody01.dat | 43 + .../x/net/html/testdata/webkit/isindex.dat | 40 + ...pending-spec-changes-plain-text-unsafe.dat | Bin 0 -> 115 bytes .../testdata/webkit/pending-spec-changes.dat | 52 + .../testdata/webkit/plain-text-unsafe.dat | Bin 0 -> 4166 bytes .../x/net/html/testdata/webkit/ruby.dat | 298 + .../net/html/testdata/webkit/scriptdata01.dat | 308 + .../testdata/webkit/scripted/adoption01.dat | 15 + .../testdata/webkit/scripted/webkit01.dat | 28 + .../x/net/html/testdata/webkit/tables01.dat | 212 + .../x/net/html/testdata/webkit/template.dat | 1117 + .../x/net/html/testdata/webkit/tests1.dat | 1952 ++ .../x/net/html/testdata/webkit/tests10.dat | 799 + .../x/net/html/testdata/webkit/tests11.dat | 482 + .../x/net/html/testdata/webkit/tests12.dat | 62 + .../x/net/html/testdata/webkit/tests14.dat | 74 + .../x/net/html/testdata/webkit/tests15.dat | 208 + .../x/net/html/testdata/webkit/tests16.dat | 2299 ++ .../x/net/html/testdata/webkit/tests17.dat | 153 + .../x/net/html/testdata/webkit/tests18.dat | 269 + .../x/net/html/testdata/webkit/tests19.dat | 1237 ++ .../x/net/html/testdata/webkit/tests2.dat | 763 + .../x/net/html/testdata/webkit/tests20.dat | 455 + .../x/net/html/testdata/webkit/tests21.dat | 221 + .../x/net/html/testdata/webkit/tests22.dat | 157 + .../x/net/html/testdata/webkit/tests23.dat | 155 + .../x/net/html/testdata/webkit/tests24.dat | 79 + .../x/net/html/testdata/webkit/tests25.dat | 219 + .../x/net/html/testdata/webkit/tests26.dat | 313 + .../x/net/html/testdata/webkit/tests3.dat | 305 + .../x/net/html/testdata/webkit/tests4.dat | 59 + .../x/net/html/testdata/webkit/tests5.dat | 191 + .../x/net/html/testdata/webkit/tests6.dat | 663 + .../x/net/html/testdata/webkit/tests7.dat | 390 + .../x/net/html/testdata/webkit/tests8.dat | 148 + .../x/net/html/testdata/webkit/tests9.dat | 457 + .../testdata/webkit/tests_innerHTML_1.dat | 741 + .../x/net/html/testdata/webkit/tricky01.dat | 261 + .../x/net/html/testdata/webkit/webkit01.dat | 610 + .../x/net/html/testdata/webkit/webkit02.dat | 159 + api/vendor/golang.org/x/net/html/token.go | 1219 ++ .../golang.org/x/net/html/token_test.go | 748 + .../golang.org/x/net/http/httpguts/guts.go | 65 + .../golang.org/x/net/http/httpguts/httplex.go | 346 + .../x/net/http/httpguts/httplex_test.go | 119 + .../x/net/http/httpproxy/export_test.go | 7 + .../x/net/http/httpproxy/go19_test.go | 13 + .../golang.org/x/net/http/httpproxy/proxy.go | 239 + .../x/net/http/httpproxy/proxy_test.go | 301 + api/vendor/golang.org/x/net/http2/.gitignore | 2 + api/vendor/golang.org/x/net/http2/Dockerfile | 51 + api/vendor/golang.org/x/net/http2/Makefile | 3 + api/vendor/golang.org/x/net/http2/README | 20 + api/vendor/golang.org/x/net/http2/ciphers.go | 641 + .../golang.org/x/net/http2/ciphers_test.go | 309 + .../x/net/http2/client_conn_pool.go | 256 + .../x/net/http2/configure_transport.go | 80 + .../golang.org/x/net/http2/databuffer.go | 146 + .../golang.org/x/net/http2/databuffer_test.go | 157 + api/vendor/golang.org/x/net/http2/errors.go | 133 + .../golang.org/x/net/http2/errors_test.go | 24 + api/vendor/golang.org/x/net/http2/flow.go | 50 + .../golang.org/x/net/http2/flow_test.go | 53 + api/vendor/golang.org/x/net/http2/frame.go | 1579 ++ .../golang.org/x/net/http2/frame_test.go | 1191 ++ api/vendor/golang.org/x/net/http2/go16.go | 16 + api/vendor/golang.org/x/net/http2/go17.go | 106 + .../golang.org/x/net/http2/go17_not18.go | 36 + api/vendor/golang.org/x/net/http2/go18.go | 56 + .../golang.org/x/net/http2/go18_test.go | 79 + api/vendor/golang.org/x/net/http2/go19.go | 16 + .../golang.org/x/net/http2/go19_test.go | 59 + api/vendor/golang.org/x/net/http2/gotrack.go | 170 + .../golang.org/x/net/http2/gotrack_test.go | 33 + .../golang.org/x/net/http2/h2demo/.gitignore | 6 + .../golang.org/x/net/http2/h2demo/Dockerfile | 11 + .../x/net/http2/h2demo/Dockerfile.0 | 134 + .../golang.org/x/net/http2/h2demo/Makefile | 55 + .../golang.org/x/net/http2/h2demo/README | 16 + .../x/net/http2/h2demo/deployment-prod.yaml | 28 + .../golang.org/x/net/http2/h2demo/h2demo.go | 543 + .../golang.org/x/net/http2/h2demo/launch.go | 302 + .../golang.org/x/net/http2/h2demo/rootCA.key | 27 + .../golang.org/x/net/http2/h2demo/rootCA.pem | 26 + .../golang.org/x/net/http2/h2demo/rootCA.srl | 1 + .../golang.org/x/net/http2/h2demo/server.crt | 20 + .../golang.org/x/net/http2/h2demo/server.key | 27 + .../x/net/http2/h2demo/service.yaml | 17 + .../golang.org/x/net/http2/h2demo/tmpl.go | 1991 ++ .../golang.org/x/net/http2/h2i/README.md | 97 + api/vendor/golang.org/x/net/http2/h2i/h2i.go | 522 + .../golang.org/x/net/http2/headermap.go | 78 + .../golang.org/x/net/http2/hpack/encode.go | 240 + .../x/net/http2/hpack/encode_test.go | 386 + .../golang.org/x/net/http2/hpack/hpack.go | 496 + .../x/net/http2/hpack/hpack_test.go | 741 + .../golang.org/x/net/http2/hpack/huffman.go | 212 + .../golang.org/x/net/http2/hpack/tables.go | 479 + .../x/net/http2/hpack/tables_test.go | 214 + api/vendor/golang.org/x/net/http2/http2.go | 391 + .../golang.org/x/net/http2/http2_test.go | 227 + api/vendor/golang.org/x/net/http2/not_go16.go | 21 + api/vendor/golang.org/x/net/http2/not_go17.go | 87 + api/vendor/golang.org/x/net/http2/not_go18.go | 29 + api/vendor/golang.org/x/net/http2/not_go19.go | 16 + api/vendor/golang.org/x/net/http2/pipe.go | 163 + .../golang.org/x/net/http2/pipe_test.go | 130 + api/vendor/golang.org/x/net/http2/server.go | 2882 +++ .../x/net/http2/server_push_test.go | 521 + .../golang.org/x/net/http2/server_test.go | 3785 ++++ .../testdata/draft-ietf-httpbis-http2.xml | 5021 +++++ .../golang.org/x/net/http2/transport.go | 2310 +++ .../golang.org/x/net/http2/transport_test.go | 3849 ++++ api/vendor/golang.org/x/net/http2/write.go | 369 + .../golang.org/x/net/http2/writesched.go | 242 + .../x/net/http2/writesched_priority.go | 452 + .../x/net/http2/writesched_priority_test.go | 541 + .../x/net/http2/writesched_random.go | 72 + .../x/net/http2/writesched_random_test.go | 44 + .../golang.org/x/net/http2/writesched_test.go | 125 + .../golang.org/x/net/http2/z_spec_test.go | 356 + api/vendor/golang.org/x/net/icmp/diag_test.go | 274 + .../golang.org/x/net/icmp/dstunreach.go | 41 + api/vendor/golang.org/x/net/icmp/echo.go | 157 + api/vendor/golang.org/x/net/icmp/endpoint.go | 113 + .../golang.org/x/net/icmp/example_test.go | 63 + api/vendor/golang.org/x/net/icmp/extension.go | 108 + .../golang.org/x/net/icmp/extension_test.go | 333 + .../golang.org/x/net/icmp/helper_posix.go | 75 + api/vendor/golang.org/x/net/icmp/interface.go | 322 + api/vendor/golang.org/x/net/icmp/ipv4.go | 61 + api/vendor/golang.org/x/net/icmp/ipv4_test.go | 75 + api/vendor/golang.org/x/net/icmp/ipv6.go | 23 + .../golang.org/x/net/icmp/listen_posix.go | 100 + .../golang.org/x/net/icmp/listen_stub.go | 33 + api/vendor/golang.org/x/net/icmp/message.go | 157 + .../golang.org/x/net/icmp/message_test.go | 155 + .../golang.org/x/net/icmp/messagebody.go | 41 + api/vendor/golang.org/x/net/icmp/mpls.go | 77 + api/vendor/golang.org/x/net/icmp/multipart.go | 121 + .../golang.org/x/net/icmp/multipart_test.go | 575 + .../golang.org/x/net/icmp/packettoobig.go | 43 + api/vendor/golang.org/x/net/icmp/paramprob.go | 63 + .../golang.org/x/net/icmp/sys_freebsd.go | 11 + .../golang.org/x/net/icmp/timeexceeded.go | 39 + .../golang.org/x/net/idna/example_test.go | 70 + api/vendor/golang.org/x/net/idna/idna.go | 732 + api/vendor/golang.org/x/net/idna/idna_test.go | 108 + api/vendor/golang.org/x/net/idna/punycode.go | 203 + .../golang.org/x/net/idna/punycode_test.go | 198 + api/vendor/golang.org/x/net/idna/tables.go | 4557 ++++ api/vendor/golang.org/x/net/idna/trie.go | 72 + api/vendor/golang.org/x/net/idna/trieval.go | 119 + .../golang.org/x/net/internal/iana/const.go | 223 + .../golang.org/x/net/internal/iana/gen.go | 383 + .../x/net/internal/nettest/helper_bsd.go | 53 + .../x/net/internal/nettest/helper_nobsd.go | 15 + .../x/net/internal/nettest/helper_posix.go | 31 + .../x/net/internal/nettest/helper_stub.go | 32 + .../x/net/internal/nettest/helper_unix.go | 29 + .../x/net/internal/nettest/helper_windows.go | 42 + .../x/net/internal/nettest/interface.go | 94 + .../x/net/internal/nettest/rlimit.go | 11 + .../x/net/internal/nettest/stack.go | 152 + .../x/net/internal/socket/cmsghdr.go | 11 + .../x/net/internal/socket/cmsghdr_bsd.go | 13 + .../internal/socket/cmsghdr_linux_32bit.go | 14 + .../internal/socket/cmsghdr_linux_64bit.go | 14 + .../internal/socket/cmsghdr_solaris_64bit.go | 14 + .../x/net/internal/socket/cmsghdr_stub.go | 17 + .../x/net/internal/socket/defs_darwin.go | 44 + .../x/net/internal/socket/defs_dragonfly.go | 44 + .../x/net/internal/socket/defs_freebsd.go | 44 + .../x/net/internal/socket/defs_linux.go | 49 + .../x/net/internal/socket/defs_netbsd.go | 47 + .../x/net/internal/socket/defs_openbsd.go | 44 + .../x/net/internal/socket/defs_solaris.go | 44 + .../x/net/internal/socket/error_unix.go | 31 + .../x/net/internal/socket/error_windows.go | 26 + .../x/net/internal/socket/iovec_32bit.go | 19 + .../x/net/internal/socket/iovec_64bit.go | 19 + .../internal/socket/iovec_solaris_64bit.go | 19 + .../x/net/internal/socket/iovec_stub.go | 11 + .../x/net/internal/socket/mmsghdr_stub.go | 21 + .../x/net/internal/socket/mmsghdr_unix.go | 42 + .../x/net/internal/socket/msghdr_bsd.go | 39 + .../x/net/internal/socket/msghdr_bsdvar.go | 16 + .../x/net/internal/socket/msghdr_linux.go | 36 + .../net/internal/socket/msghdr_linux_32bit.go | 24 + .../net/internal/socket/msghdr_linux_64bit.go | 24 + .../x/net/internal/socket/msghdr_openbsd.go | 14 + .../internal/socket/msghdr_solaris_64bit.go | 36 + .../x/net/internal/socket/msghdr_stub.go | 14 + .../x/net/internal/socket/rawconn.go | 66 + .../x/net/internal/socket/rawconn_mmsg.go | 74 + .../x/net/internal/socket/rawconn_msg.go | 77 + .../x/net/internal/socket/rawconn_nommsg.go | 18 + .../x/net/internal/socket/rawconn_nomsg.go | 18 + .../x/net/internal/socket/rawconn_stub.go | 25 + .../x/net/internal/socket/reflect.go | 62 + .../x/net/internal/socket/socket.go | 285 + .../net/internal/socket/socket_go1_9_test.go | 259 + .../x/net/internal/socket/socket_test.go | 46 + .../golang.org/x/net/internal/socket/sys.go | 33 + .../x/net/internal/socket/sys_bsd.go | 17 + .../x/net/internal/socket/sys_bsdvar.go | 14 + .../x/net/internal/socket/sys_darwin.go | 7 + .../x/net/internal/socket/sys_dragonfly.go | 7 + .../x/net/internal/socket/sys_linux.go | 27 + .../x/net/internal/socket/sys_linux_386.go | 55 + .../x/net/internal/socket/sys_linux_386.s | 11 + .../x/net/internal/socket/sys_linux_amd64.go | 10 + .../x/net/internal/socket/sys_linux_arm.go | 10 + .../x/net/internal/socket/sys_linux_arm64.go | 10 + .../x/net/internal/socket/sys_linux_mips.go | 10 + .../x/net/internal/socket/sys_linux_mips64.go | 10 + .../net/internal/socket/sys_linux_mips64le.go | 10 + .../x/net/internal/socket/sys_linux_mipsle.go | 10 + .../x/net/internal/socket/sys_linux_ppc64.go | 10 + .../net/internal/socket/sys_linux_ppc64le.go | 10 + .../x/net/internal/socket/sys_linux_s390x.go | 55 + .../x/net/internal/socket/sys_linux_s390x.s | 11 + .../x/net/internal/socket/sys_netbsd.go | 25 + .../x/net/internal/socket/sys_posix.go | 168 + .../x/net/internal/socket/sys_solaris.go | 71 + .../x/net/internal/socket/sys_solaris_amd64.s | 11 + .../x/net/internal/socket/sys_stub.go | 64 + .../x/net/internal/socket/sys_unix.go | 33 + .../x/net/internal/socket/sys_windows.go | 70 + .../x/net/internal/socket/zsys_darwin_386.go | 59 + .../net/internal/socket/zsys_darwin_amd64.go | 61 + .../x/net/internal/socket/zsys_darwin_arm.go | 59 + .../net/internal/socket/zsys_darwin_arm64.go | 61 + .../internal/socket/zsys_dragonfly_amd64.go | 61 + .../x/net/internal/socket/zsys_freebsd_386.go | 59 + .../net/internal/socket/zsys_freebsd_amd64.go | 61 + .../x/net/internal/socket/zsys_freebsd_arm.go | 59 + .../x/net/internal/socket/zsys_linux_386.go | 63 + .../x/net/internal/socket/zsys_linux_amd64.go | 66 + .../x/net/internal/socket/zsys_linux_arm.go | 63 + .../x/net/internal/socket/zsys_linux_arm64.go | 66 + .../x/net/internal/socket/zsys_linux_mips.go | 63 + .../net/internal/socket/zsys_linux_mips64.go | 66 + .../internal/socket/zsys_linux_mips64le.go | 66 + .../net/internal/socket/zsys_linux_mipsle.go | 63 + .../x/net/internal/socket/zsys_linux_ppc64.go | 66 + .../net/internal/socket/zsys_linux_ppc64le.go | 66 + .../x/net/internal/socket/zsys_linux_s390x.go | 66 + .../x/net/internal/socket/zsys_netbsd_386.go | 65 + .../net/internal/socket/zsys_netbsd_amd64.go | 68 + .../x/net/internal/socket/zsys_netbsd_arm.go | 65 + .../x/net/internal/socket/zsys_openbsd_386.go | 59 + .../net/internal/socket/zsys_openbsd_amd64.go | 61 + .../x/net/internal/socket/zsys_openbsd_arm.go | 59 + .../net/internal/socket/zsys_solaris_amd64.go | 60 + .../golang.org/x/net/internal/socks/client.go | 168 + .../x/net/internal/socks/dial_test.go | 170 + .../golang.org/x/net/internal/socks/socks.go | 316 + .../x/net/internal/sockstest/server.go | 241 + .../x/net/internal/sockstest/server_test.go | 103 + .../x/net/internal/timeseries/timeseries.go | 525 + .../internal/timeseries/timeseries_test.go | 170 + api/vendor/golang.org/x/net/ipv4/batch.go | 191 + api/vendor/golang.org/x/net/ipv4/bpf_test.go | 93 + api/vendor/golang.org/x/net/ipv4/control.go | 144 + .../golang.org/x/net/ipv4/control_bsd.go | 40 + .../golang.org/x/net/ipv4/control_pktinfo.go | 39 + .../golang.org/x/net/ipv4/control_stub.go | 13 + .../golang.org/x/net/ipv4/control_test.go | 21 + .../golang.org/x/net/ipv4/control_unix.go | 73 + .../golang.org/x/net/ipv4/control_windows.go | 16 + .../golang.org/x/net/ipv4/defs_darwin.go | 77 + .../golang.org/x/net/ipv4/defs_dragonfly.go | 38 + .../golang.org/x/net/ipv4/defs_freebsd.go | 75 + .../golang.org/x/net/ipv4/defs_linux.go | 122 + .../golang.org/x/net/ipv4/defs_netbsd.go | 37 + .../golang.org/x/net/ipv4/defs_openbsd.go | 37 + .../golang.org/x/net/ipv4/defs_solaris.go | 84 + api/vendor/golang.org/x/net/ipv4/dgramopt.go | 265 + api/vendor/golang.org/x/net/ipv4/doc.go | 244 + api/vendor/golang.org/x/net/ipv4/endpoint.go | 187 + .../golang.org/x/net/ipv4/example_test.go | 224 + api/vendor/golang.org/x/net/ipv4/gen.go | 199 + .../golang.org/x/net/ipv4/genericopt.go | 57 + api/vendor/golang.org/x/net/ipv4/header.go | 159 + .../golang.org/x/net/ipv4/header_test.go | 228 + api/vendor/golang.org/x/net/ipv4/helper.go | 63 + api/vendor/golang.org/x/net/ipv4/iana.go | 38 + api/vendor/golang.org/x/net/ipv4/icmp.go | 57 + .../golang.org/x/net/ipv4/icmp_linux.go | 25 + api/vendor/golang.org/x/net/ipv4/icmp_stub.go | 25 + api/vendor/golang.org/x/net/ipv4/icmp_test.go | 95 + .../golang.org/x/net/ipv4/multicast_test.go | 334 + .../x/net/ipv4/multicastlistener_test.go | 265 + .../x/net/ipv4/multicastsockopt_test.go | 195 + api/vendor/golang.org/x/net/ipv4/packet.go | 69 + .../golang.org/x/net/ipv4/packet_go1_8.go | 56 + .../golang.org/x/net/ipv4/packet_go1_9.go | 67 + api/vendor/golang.org/x/net/ipv4/payload.go | 23 + .../golang.org/x/net/ipv4/payload_cmsg.go | 36 + .../x/net/ipv4/payload_cmsg_go1_8.go | 59 + .../x/net/ipv4/payload_cmsg_go1_9.go | 67 + .../golang.org/x/net/ipv4/payload_nocmsg.go | 42 + .../x/net/ipv4/readwrite_go1_8_test.go | 248 + .../x/net/ipv4/readwrite_go1_9_test.go | 388 + .../golang.org/x/net/ipv4/readwrite_test.go | 140 + api/vendor/golang.org/x/net/ipv4/sockopt.go | 44 + .../golang.org/x/net/ipv4/sockopt_posix.go | 71 + .../golang.org/x/net/ipv4/sockopt_stub.go | 42 + .../golang.org/x/net/ipv4/sys_asmreq.go | 119 + .../golang.org/x/net/ipv4/sys_asmreq_stub.go | 25 + .../golang.org/x/net/ipv4/sys_asmreqn.go | 42 + .../golang.org/x/net/ipv4/sys_asmreqn_stub.go | 21 + api/vendor/golang.org/x/net/ipv4/sys_bpf.go | 23 + .../golang.org/x/net/ipv4/sys_bpf_stub.go | 16 + api/vendor/golang.org/x/net/ipv4/sys_bsd.go | 37 + .../golang.org/x/net/ipv4/sys_darwin.go | 93 + .../golang.org/x/net/ipv4/sys_dragonfly.go | 35 + .../golang.org/x/net/ipv4/sys_freebsd.go | 76 + api/vendor/golang.org/x/net/ipv4/sys_linux.go | 59 + .../golang.org/x/net/ipv4/sys_solaris.go | 57 + .../golang.org/x/net/ipv4/sys_ssmreq.go | 54 + .../golang.org/x/net/ipv4/sys_ssmreq_stub.go | 21 + api/vendor/golang.org/x/net/ipv4/sys_stub.go | 13 + .../golang.org/x/net/ipv4/sys_windows.go | 67 + .../golang.org/x/net/ipv4/unicast_test.go | 247 + .../x/net/ipv4/unicastsockopt_test.go | 148 + .../golang.org/x/net/ipv4/zsys_darwin.go | 99 + .../golang.org/x/net/ipv4/zsys_dragonfly.go | 31 + .../golang.org/x/net/ipv4/zsys_freebsd_386.go | 93 + .../x/net/ipv4/zsys_freebsd_amd64.go | 95 + .../golang.org/x/net/ipv4/zsys_freebsd_arm.go | 95 + .../golang.org/x/net/ipv4/zsys_linux_386.go | 148 + .../golang.org/x/net/ipv4/zsys_linux_amd64.go | 150 + .../golang.org/x/net/ipv4/zsys_linux_arm.go | 148 + .../golang.org/x/net/ipv4/zsys_linux_arm64.go | 150 + .../golang.org/x/net/ipv4/zsys_linux_mips.go | 148 + .../x/net/ipv4/zsys_linux_mips64.go | 150 + .../x/net/ipv4/zsys_linux_mips64le.go | 150 + .../x/net/ipv4/zsys_linux_mipsle.go | 148 + .../golang.org/x/net/ipv4/zsys_linux_ppc.go | 148 + .../golang.org/x/net/ipv4/zsys_linux_ppc64.go | 150 + .../x/net/ipv4/zsys_linux_ppc64le.go | 150 + .../golang.org/x/net/ipv4/zsys_linux_s390x.go | 150 + .../golang.org/x/net/ipv4/zsys_netbsd.go | 30 + .../golang.org/x/net/ipv4/zsys_openbsd.go | 30 + .../golang.org/x/net/ipv4/zsys_solaris.go | 100 + api/vendor/golang.org/x/net/ipv6/batch.go | 119 + api/vendor/golang.org/x/net/ipv6/bpf_test.go | 96 + api/vendor/golang.org/x/net/ipv6/control.go | 187 + .../x/net/ipv6/control_rfc2292_unix.go | 48 + .../x/net/ipv6/control_rfc3542_unix.go | 94 + .../golang.org/x/net/ipv6/control_stub.go | 13 + .../golang.org/x/net/ipv6/control_test.go | 21 + .../golang.org/x/net/ipv6/control_unix.go | 55 + .../golang.org/x/net/ipv6/control_windows.go | 16 + .../golang.org/x/net/ipv6/defs_darwin.go | 112 + .../golang.org/x/net/ipv6/defs_dragonfly.go | 84 + .../golang.org/x/net/ipv6/defs_freebsd.go | 105 + .../golang.org/x/net/ipv6/defs_linux.go | 147 + .../golang.org/x/net/ipv6/defs_netbsd.go | 80 + .../golang.org/x/net/ipv6/defs_openbsd.go | 89 + .../golang.org/x/net/ipv6/defs_solaris.go | 114 + api/vendor/golang.org/x/net/ipv6/dgramopt.go | 302 + api/vendor/golang.org/x/net/ipv6/doc.go | 243 + api/vendor/golang.org/x/net/ipv6/endpoint.go | 128 + .../golang.org/x/net/ipv6/example_test.go | 216 + api/vendor/golang.org/x/net/ipv6/gen.go | 199 + .../golang.org/x/net/ipv6/genericopt.go | 58 + api/vendor/golang.org/x/net/ipv6/header.go | 55 + .../golang.org/x/net/ipv6/header_test.go | 55 + api/vendor/golang.org/x/net/ipv6/helper.go | 57 + api/vendor/golang.org/x/net/ipv6/iana.go | 86 + api/vendor/golang.org/x/net/ipv6/icmp.go | 60 + api/vendor/golang.org/x/net/ipv6/icmp_bsd.go | 29 + .../golang.org/x/net/ipv6/icmp_linux.go | 27 + .../golang.org/x/net/ipv6/icmp_solaris.go | 27 + api/vendor/golang.org/x/net/ipv6/icmp_stub.go | 23 + api/vendor/golang.org/x/net/ipv6/icmp_test.go | 96 + .../golang.org/x/net/ipv6/icmp_windows.go | 22 + .../x/net/ipv6/mocktransponder_test.go | 32 + .../golang.org/x/net/ipv6/multicast_test.go | 264 + .../x/net/ipv6/multicastlistener_test.go | 261 + .../x/net/ipv6/multicastsockopt_test.go | 157 + api/vendor/golang.org/x/net/ipv6/payload.go | 23 + .../golang.org/x/net/ipv6/payload_cmsg.go | 35 + .../x/net/ipv6/payload_cmsg_go1_8.go | 55 + .../x/net/ipv6/payload_cmsg_go1_9.go | 57 + .../golang.org/x/net/ipv6/payload_nocmsg.go | 41 + .../x/net/ipv6/readwrite_go1_8_test.go | 242 + .../x/net/ipv6/readwrite_go1_9_test.go | 373 + .../golang.org/x/net/ipv6/readwrite_test.go | 148 + api/vendor/golang.org/x/net/ipv6/sockopt.go | 43 + .../golang.org/x/net/ipv6/sockopt_posix.go | 87 + .../golang.org/x/net/ipv6/sockopt_stub.go | 46 + .../golang.org/x/net/ipv6/sockopt_test.go | 133 + .../golang.org/x/net/ipv6/sys_asmreq.go | 24 + .../golang.org/x/net/ipv6/sys_asmreq_stub.go | 17 + api/vendor/golang.org/x/net/ipv6/sys_bpf.go | 23 + .../golang.org/x/net/ipv6/sys_bpf_stub.go | 16 + api/vendor/golang.org/x/net/ipv6/sys_bsd.go | 57 + .../golang.org/x/net/ipv6/sys_darwin.go | 106 + .../golang.org/x/net/ipv6/sys_freebsd.go | 92 + api/vendor/golang.org/x/net/ipv6/sys_linux.go | 74 + .../golang.org/x/net/ipv6/sys_solaris.go | 74 + .../golang.org/x/net/ipv6/sys_ssmreq.go | 54 + .../golang.org/x/net/ipv6/sys_ssmreq_stub.go | 21 + api/vendor/golang.org/x/net/ipv6/sys_stub.go | 13 + .../golang.org/x/net/ipv6/sys_windows.go | 75 + .../golang.org/x/net/ipv6/unicast_test.go | 184 + .../x/net/ipv6/unicastsockopt_test.go | 120 + .../golang.org/x/net/ipv6/zsys_darwin.go | 131 + .../golang.org/x/net/ipv6/zsys_dragonfly.go | 88 + .../golang.org/x/net/ipv6/zsys_freebsd_386.go | 122 + .../x/net/ipv6/zsys_freebsd_amd64.go | 124 + .../golang.org/x/net/ipv6/zsys_freebsd_arm.go | 124 + .../golang.org/x/net/ipv6/zsys_linux_386.go | 170 + .../golang.org/x/net/ipv6/zsys_linux_amd64.go | 172 + .../golang.org/x/net/ipv6/zsys_linux_arm.go | 170 + .../golang.org/x/net/ipv6/zsys_linux_arm64.go | 172 + .../golang.org/x/net/ipv6/zsys_linux_mips.go | 170 + .../x/net/ipv6/zsys_linux_mips64.go | 172 + .../x/net/ipv6/zsys_linux_mips64le.go | 172 + .../x/net/ipv6/zsys_linux_mipsle.go | 170 + .../golang.org/x/net/ipv6/zsys_linux_ppc.go | 170 + .../golang.org/x/net/ipv6/zsys_linux_ppc64.go | 172 + .../x/net/ipv6/zsys_linux_ppc64le.go | 172 + .../golang.org/x/net/ipv6/zsys_linux_s390x.go | 172 + .../golang.org/x/net/ipv6/zsys_netbsd.go | 84 + .../golang.org/x/net/ipv6/zsys_openbsd.go | 93 + .../golang.org/x/net/ipv6/zsys_solaris.go | 131 + api/vendor/golang.org/x/net/lif/address.go | 105 + .../golang.org/x/net/lif/address_test.go | 123 + api/vendor/golang.org/x/net/lif/binary.go | 115 + .../golang.org/x/net/lif/defs_solaris.go | 90 + api/vendor/golang.org/x/net/lif/lif.go | 43 + api/vendor/golang.org/x/net/lif/link.go | 126 + api/vendor/golang.org/x/net/lif/link_test.go | 63 + api/vendor/golang.org/x/net/lif/sys.go | 21 + .../golang.org/x/net/lif/sys_solaris_amd64.s | 8 + api/vendor/golang.org/x/net/lif/syscall.go | 28 + .../x/net/lif/zsys_solaris_amd64.go | 103 + .../golang.org/x/net/nettest/conntest.go | 456 + .../golang.org/x/net/nettest/conntest_go16.go | 24 + .../golang.org/x/net/nettest/conntest_go17.go | 24 + .../golang.org/x/net/nettest/conntest_test.go | 76 + api/vendor/golang.org/x/net/netutil/listen.go | 74 + .../golang.org/x/net/netutil/listen_test.go | 147 + api/vendor/golang.org/x/net/proxy/direct.go | 18 + api/vendor/golang.org/x/net/proxy/per_host.go | 140 + .../golang.org/x/net/proxy/per_host_test.go | 55 + api/vendor/golang.org/x/net/proxy/proxy.go | 134 + .../golang.org/x/net/proxy/proxy_test.go | 123 + api/vendor/golang.org/x/net/proxy/socks5.go | 36 + .../golang.org/x/net/publicsuffix/gen.go | 713 + .../golang.org/x/net/publicsuffix/list.go | 135 + .../x/net/publicsuffix/list_test.go | 416 + .../golang.org/x/net/publicsuffix/table.go | 9745 +++++++++ .../x/net/publicsuffix/table_test.go | 17308 ++++++++++++++++ api/vendor/golang.org/x/net/route/address.go | 425 + .../x/net/route/address_darwin_test.go | 63 + .../golang.org/x/net/route/address_test.go | 103 + api/vendor/golang.org/x/net/route/binary.go | 90 + .../golang.org/x/net/route/defs_darwin.go | 114 + .../golang.org/x/net/route/defs_dragonfly.go | 113 + .../golang.org/x/net/route/defs_freebsd.go | 337 + .../golang.org/x/net/route/defs_netbsd.go | 112 + .../golang.org/x/net/route/defs_openbsd.go | 116 + .../golang.org/x/net/route/interface.go | 64 + .../x/net/route/interface_announce.go | 32 + .../x/net/route/interface_classic.go | 66 + .../x/net/route/interface_freebsd.go | 78 + .../x/net/route/interface_multicast.go | 30 + .../x/net/route/interface_openbsd.go | 90 + api/vendor/golang.org/x/net/route/message.go | 72 + .../x/net/route/message_darwin_test.go | 34 + .../x/net/route/message_freebsd_test.go | 92 + .../golang.org/x/net/route/message_test.go | 239 + api/vendor/golang.org/x/net/route/route.go | 123 + .../golang.org/x/net/route/route_classic.go | 75 + .../golang.org/x/net/route/route_openbsd.go | 65 + .../golang.org/x/net/route/route_test.go | 390 + api/vendor/golang.org/x/net/route/sys.go | 39 + .../golang.org/x/net/route/sys_darwin.go | 87 + .../golang.org/x/net/route/sys_dragonfly.go | 76 + .../golang.org/x/net/route/sys_freebsd.go | 155 + .../golang.org/x/net/route/sys_netbsd.go | 71 + .../golang.org/x/net/route/sys_openbsd.go | 80 + api/vendor/golang.org/x/net/route/syscall.go | 28 + .../golang.org/x/net/route/zsys_darwin.go | 99 + .../golang.org/x/net/route/zsys_dragonfly.go | 98 + .../x/net/route/zsys_freebsd_386.go | 126 + .../x/net/route/zsys_freebsd_amd64.go | 123 + .../x/net/route/zsys_freebsd_arm.go | 123 + .../golang.org/x/net/route/zsys_netbsd.go | 97 + .../golang.org/x/net/route/zsys_openbsd.go | 101 + api/vendor/golang.org/x/net/trace/events.go | 532 + .../golang.org/x/net/trace/histogram.go | 365 + .../golang.org/x/net/trace/histogram_test.go | 325 + api/vendor/golang.org/x/net/trace/trace.go | 1103 + .../golang.org/x/net/trace/trace_go16.go | 21 + .../golang.org/x/net/trace/trace_go17.go | 21 + .../golang.org/x/net/trace/trace_test.go | 178 + api/vendor/golang.org/x/net/webdav/file.go | 796 + .../golang.org/x/net/webdav/file_go1.6.go | 17 + .../golang.org/x/net/webdav/file_go1.7.go | 16 + .../golang.org/x/net/webdav/file_test.go | 1184 ++ api/vendor/golang.org/x/net/webdav/if.go | 173 + api/vendor/golang.org/x/net/webdav/if_test.go | 322 + .../x/net/webdav/internal/xml/README | 11 + .../x/net/webdav/internal/xml/atom_test.go | 56 + .../x/net/webdav/internal/xml/example_test.go | 151 + .../x/net/webdav/internal/xml/marshal.go | 1223 ++ .../x/net/webdav/internal/xml/marshal_test.go | 1939 ++ .../x/net/webdav/internal/xml/read.go | 692 + .../x/net/webdav/internal/xml/read_test.go | 744 + .../x/net/webdav/internal/xml/typeinfo.go | 371 + .../x/net/webdav/internal/xml/xml.go | 1998 ++ .../x/net/webdav/internal/xml/xml_test.go | 752 + .../x/net/webdav/litmus_test_server.go | 94 + api/vendor/golang.org/x/net/webdav/lock.go | 445 + .../golang.org/x/net/webdav/lock_test.go | 731 + api/vendor/golang.org/x/net/webdav/prop.go | 470 + .../golang.org/x/net/webdav/prop_test.go | 717 + api/vendor/golang.org/x/net/webdav/webdav.go | 702 + .../golang.org/x/net/webdav/webdav_test.go | 344 + api/vendor/golang.org/x/net/webdav/xml.go | 519 + .../golang.org/x/net/webdav/xml_test.go | 906 + .../golang.org/x/net/websocket/client.go | 106 + api/vendor/golang.org/x/net/websocket/dial.go | 24 + .../golang.org/x/net/websocket/dial_test.go | 43 + .../x/net/websocket/exampledial_test.go | 31 + .../x/net/websocket/examplehandler_test.go | 26 + api/vendor/golang.org/x/net/websocket/hybi.go | 583 + .../golang.org/x/net/websocket/hybi_test.go | 608 + .../golang.org/x/net/websocket/server.go | 113 + .../golang.org/x/net/websocket/websocket.go | 448 + .../x/net/websocket/websocket_test.go | 665 + api/vendor/golang.org/x/net/xsrftoken/xsrf.go | 94 + .../golang.org/x/net/xsrftoken/xsrf_test.go | 83 + api/vendor/golang.org/x/sync/AUTHORS | 3 + api/vendor/golang.org/x/sync/CONTRIBUTING.md | 26 + api/vendor/golang.org/x/sync/CONTRIBUTORS | 3 + api/vendor/golang.org/x/sync/LICENSE | 27 + api/vendor/golang.org/x/sync/PATENTS | 22 + api/vendor/golang.org/x/sync/README.md | 18 + api/vendor/golang.org/x/sync/codereview.cfg | 1 + .../golang.org/x/sync/errgroup/errgroup.go | 67 + .../errgroup/errgroup_example_md5all_test.go | 101 + .../x/sync/errgroup/errgroup_test.go | 176 + .../golang.org/x/sync/semaphore/semaphore.go | 131 + .../x/sync/semaphore/semaphore_bench_test.go | 131 + .../sync/semaphore/semaphore_example_test.go | 84 + .../x/sync/semaphore/semaphore_test.go | 171 + .../x/sync/singleflight/singleflight.go | 111 + .../x/sync/singleflight/singleflight_test.go | 87 + api/vendor/golang.org/x/sync/syncmap/map.go | 372 + .../x/sync/syncmap/map_bench_test.go | 216 + .../x/sync/syncmap/map_reference_test.go | 151 + .../golang.org/x/sync/syncmap/map_test.go | 172 + api/vendor/golang.org/x/sys/.gitattributes | 10 + api/vendor/golang.org/x/sys/.gitignore | 2 + api/vendor/golang.org/x/sys/AUTHORS | 3 + api/vendor/golang.org/x/sys/CONTRIBUTING.md | 26 + api/vendor/golang.org/x/sys/CONTRIBUTORS | 3 + api/vendor/golang.org/x/sys/LICENSE | 27 + api/vendor/golang.org/x/sys/PATENTS | 22 + api/vendor/golang.org/x/sys/README.md | 18 + api/vendor/golang.org/x/sys/codereview.cfg | 1 + api/vendor/golang.org/x/sys/cpu/cpu.go | 35 + api/vendor/golang.org/x/sys/cpu/cpu_arm.go | 7 + api/vendor/golang.org/x/sys/cpu/cpu_arm64.go | 7 + .../golang.org/x/sys/cpu/cpu_mips64x.go | 9 + api/vendor/golang.org/x/sys/cpu/cpu_mipsx.go | 9 + api/vendor/golang.org/x/sys/cpu/cpu_ppc64x.go | 9 + api/vendor/golang.org/x/sys/cpu/cpu_s390x.go | 7 + api/vendor/golang.org/x/sys/cpu/cpu_test.go | 28 + api/vendor/golang.org/x/sys/cpu/cpu_x86.go | 61 + api/vendor/golang.org/x/sys/cpu/cpu_x86.s | 26 + api/vendor/golang.org/x/sys/plan9/asm.s | 8 + .../golang.org/x/sys/plan9/asm_plan9_386.s | 30 + .../golang.org/x/sys/plan9/asm_plan9_amd64.s | 30 + .../golang.org/x/sys/plan9/asm_plan9_arm.s | 25 + .../golang.org/x/sys/plan9/const_plan9.go | 70 + .../golang.org/x/sys/plan9/dir_plan9.go | 212 + .../golang.org/x/sys/plan9/env_plan9.go | 31 + .../golang.org/x/sys/plan9/errors_plan9.go | 50 + api/vendor/golang.org/x/sys/plan9/mkall.sh | 138 + api/vendor/golang.org/x/sys/plan9/mkerrors.sh | 246 + .../golang.org/x/sys/plan9/mksyscall.pl | 319 + .../golang.org/x/sys/plan9/mksysnum_plan9.sh | 23 + .../golang.org/x/sys/plan9/pwd_go15_plan9.go | 21 + .../golang.org/x/sys/plan9/pwd_plan9.go | 23 + api/vendor/golang.org/x/sys/plan9/race.go | 30 + api/vendor/golang.org/x/sys/plan9/race0.go | 25 + api/vendor/golang.org/x/sys/plan9/str.go | 22 + api/vendor/golang.org/x/sys/plan9/syscall.go | 77 + .../golang.org/x/sys/plan9/syscall_plan9.go | 349 + .../golang.org/x/sys/plan9/syscall_test.go | 33 + .../x/sys/plan9/zsyscall_plan9_386.go | 292 + .../x/sys/plan9/zsyscall_plan9_amd64.go | 292 + .../x/sys/plan9/zsyscall_plan9_arm.go | 284 + .../golang.org/x/sys/plan9/zsysnum_plan9.go | 49 + api/vendor/golang.org/x/sys/unix/.gitignore | 2 + api/vendor/golang.org/x/sys/unix/README.md | 173 + .../golang.org/x/sys/unix/affinity_linux.go | 124 + .../golang.org/x/sys/unix/asm_darwin_386.s | 29 + .../golang.org/x/sys/unix/asm_darwin_amd64.s | 29 + .../golang.org/x/sys/unix/asm_darwin_arm.s | 30 + .../golang.org/x/sys/unix/asm_darwin_arm64.s | 30 + .../x/sys/unix/asm_dragonfly_amd64.s | 29 + .../golang.org/x/sys/unix/asm_freebsd_386.s | 29 + .../golang.org/x/sys/unix/asm_freebsd_amd64.s | 29 + .../golang.org/x/sys/unix/asm_freebsd_arm.s | 29 + .../golang.org/x/sys/unix/asm_linux_386.s | 65 + .../golang.org/x/sys/unix/asm_linux_amd64.s | 57 + .../golang.org/x/sys/unix/asm_linux_arm.s | 56 + .../golang.org/x/sys/unix/asm_linux_arm64.s | 52 + .../golang.org/x/sys/unix/asm_linux_mips64x.s | 56 + .../golang.org/x/sys/unix/asm_linux_mipsx.s | 54 + .../golang.org/x/sys/unix/asm_linux_ppc64x.s | 56 + .../golang.org/x/sys/unix/asm_linux_s390x.s | 56 + .../golang.org/x/sys/unix/asm_netbsd_386.s | 29 + .../golang.org/x/sys/unix/asm_netbsd_amd64.s | 29 + .../golang.org/x/sys/unix/asm_netbsd_arm.s | 29 + .../golang.org/x/sys/unix/asm_openbsd_386.s | 29 + .../golang.org/x/sys/unix/asm_openbsd_amd64.s | 29 + .../golang.org/x/sys/unix/asm_openbsd_arm.s | 29 + .../golang.org/x/sys/unix/asm_solaris_amd64.s | 17 + .../golang.org/x/sys/unix/bluetooth_linux.go | 35 + .../golang.org/x/sys/unix/cap_freebsd.go | 195 + api/vendor/golang.org/x/sys/unix/constants.go | 13 + .../golang.org/x/sys/unix/creds_test.go | 134 + .../golang.org/x/sys/unix/dev_darwin.go | 24 + .../golang.org/x/sys/unix/dev_dragonfly.go | 30 + .../golang.org/x/sys/unix/dev_freebsd.go | 30 + api/vendor/golang.org/x/sys/unix/dev_linux.go | 42 + .../golang.org/x/sys/unix/dev_linux_test.go | 56 + .../golang.org/x/sys/unix/dev_netbsd.go | 29 + .../golang.org/x/sys/unix/dev_openbsd.go | 29 + api/vendor/golang.org/x/sys/unix/dirent.go | 17 + .../golang.org/x/sys/unix/endian_big.go | 9 + .../golang.org/x/sys/unix/endian_little.go | 9 + api/vendor/golang.org/x/sys/unix/env_unix.go | 31 + .../x/sys/unix/errors_freebsd_386.go | 227 + .../x/sys/unix/errors_freebsd_amd64.go | 227 + .../x/sys/unix/errors_freebsd_arm.go | 226 + .../golang.org/x/sys/unix/example_test.go | 19 + .../golang.org/x/sys/unix/export_test.go | 9 + api/vendor/golang.org/x/sys/unix/fcntl.go | 28 + .../x/sys/unix/fcntl_linux_32bit.go | 13 + api/vendor/golang.org/x/sys/unix/gccgo.go | 61 + api/vendor/golang.org/x/sys/unix/gccgo_c.c | 47 + .../x/sys/unix/gccgo_linux_amd64.go | 20 + .../golang.org/x/sys/unix/linux/Dockerfile | 52 + .../golang.org/x/sys/unix/linux/mkall.go | 750 + .../golang.org/x/sys/unix/linux/mksysnum.pl | 85 + .../golang.org/x/sys/unix/linux/types.go | 1487 ++ api/vendor/golang.org/x/sys/unix/mkall.sh | 188 + api/vendor/golang.org/x/sys/unix/mkerrors.sh | 603 + api/vendor/golang.org/x/sys/unix/mkpost.go | 98 + api/vendor/golang.org/x/sys/unix/mksyscall.pl | 341 + .../x/sys/unix/mksyscall_solaris.pl | 289 + .../golang.org/x/sys/unix/mksysctl_openbsd.pl | 264 + .../golang.org/x/sys/unix/mksysnum_darwin.pl | 39 + .../x/sys/unix/mksysnum_dragonfly.pl | 50 + .../golang.org/x/sys/unix/mksysnum_freebsd.pl | 50 + .../golang.org/x/sys/unix/mksysnum_netbsd.pl | 58 + .../golang.org/x/sys/unix/mksysnum_openbsd.pl | 50 + .../golang.org/x/sys/unix/mmap_unix_test.go | 35 + .../golang.org/x/sys/unix/openbsd_pledge.go | 38 + .../golang.org/x/sys/unix/openbsd_test.go | 113 + .../golang.org/x/sys/unix/pagesize_unix.go | 15 + api/vendor/golang.org/x/sys/unix/race.go | 30 + api/vendor/golang.org/x/sys/unix/race0.go | 25 + .../golang.org/x/sys/unix/sockcmsg_linux.go | 36 + .../golang.org/x/sys/unix/sockcmsg_unix.go | 104 + api/vendor/golang.org/x/sys/unix/str.go | 26 + api/vendor/golang.org/x/sys/unix/syscall.go | 54 + .../golang.org/x/sys/unix/syscall_bsd.go | 624 + .../golang.org/x/sys/unix/syscall_bsd_test.go | 93 + .../golang.org/x/sys/unix/syscall_darwin.go | 680 + .../x/sys/unix/syscall_darwin_386.go | 68 + .../x/sys/unix/syscall_darwin_amd64.go | 68 + .../x/sys/unix/syscall_darwin_arm.go | 66 + .../x/sys/unix/syscall_darwin_arm64.go | 68 + .../x/sys/unix/syscall_darwin_test.go | 19 + .../x/sys/unix/syscall_dragonfly.go | 523 + .../x/sys/unix/syscall_dragonfly_amd64.go | 52 + .../golang.org/x/sys/unix/syscall_freebsd.go | 756 + .../x/sys/unix/syscall_freebsd_386.go | 52 + .../x/sys/unix/syscall_freebsd_amd64.go | 52 + .../x/sys/unix/syscall_freebsd_arm.go | 52 + .../x/sys/unix/syscall_freebsd_test.go | 312 + .../golang.org/x/sys/unix/syscall_linux.go | 1474 ++ .../x/sys/unix/syscall_linux_386.go | 391 + .../x/sys/unix/syscall_linux_amd64.go | 157 + .../x/sys/unix/syscall_linux_amd64_gc.go | 13 + .../x/sys/unix/syscall_linux_arm.go | 255 + .../x/sys/unix/syscall_linux_arm64.go | 190 + .../golang.org/x/sys/unix/syscall_linux_gc.go | 14 + .../x/sys/unix/syscall_linux_gccgo.go | 21 + .../x/sys/unix/syscall_linux_mips64x.go | 210 + .../x/sys/unix/syscall_linux_mipsx.go | 232 + .../x/sys/unix/syscall_linux_ppc64x.go | 128 + .../x/sys/unix/syscall_linux_s390x.go | 320 + .../x/sys/unix/syscall_linux_sparc64.go | 144 + .../x/sys/unix/syscall_linux_test.go | 386 + .../golang.org/x/sys/unix/syscall_netbsd.go | 567 + .../x/sys/unix/syscall_netbsd_386.go | 33 + .../x/sys/unix/syscall_netbsd_amd64.go | 33 + .../x/sys/unix/syscall_netbsd_arm.go | 33 + .../golang.org/x/sys/unix/syscall_openbsd.go | 367 + .../x/sys/unix/syscall_openbsd_386.go | 33 + .../x/sys/unix/syscall_openbsd_amd64.go | 37 + .../x/sys/unix/syscall_openbsd_arm.go | 33 + .../golang.org/x/sys/unix/syscall_solaris.go | 725 + .../x/sys/unix/syscall_solaris_amd64.go | 23 + .../x/sys/unix/syscall_solaris_test.go | 55 + .../golang.org/x/sys/unix/syscall_test.go | 60 + .../golang.org/x/sys/unix/syscall_unix.go | 394 + .../golang.org/x/sys/unix/syscall_unix_gc.go | 15 + .../x/sys/unix/syscall_unix_test.go | 639 + .../golang.org/x/sys/unix/timestruct.go | 82 + .../golang.org/x/sys/unix/timestruct_test.go | 54 + .../golang.org/x/sys/unix/types_darwin.go | 277 + .../golang.org/x/sys/unix/types_dragonfly.go | 280 + .../golang.org/x/sys/unix/types_freebsd.go | 402 + .../golang.org/x/sys/unix/types_netbsd.go | 281 + .../golang.org/x/sys/unix/types_openbsd.go | 282 + .../golang.org/x/sys/unix/types_solaris.go | 283 + .../golang.org/x/sys/unix/xattr_test.go | 119 + .../x/sys/unix/zerrors_darwin_386.go | 1783 ++ .../x/sys/unix/zerrors_darwin_amd64.go | 1783 ++ .../x/sys/unix/zerrors_darwin_arm.go | 1783 ++ .../x/sys/unix/zerrors_darwin_arm64.go | 1783 ++ .../x/sys/unix/zerrors_dragonfly_amd64.go | 1586 ++ .../x/sys/unix/zerrors_freebsd_386.go | 1764 ++ .../x/sys/unix/zerrors_freebsd_amd64.go | 1765 ++ .../x/sys/unix/zerrors_freebsd_arm.go | 1773 ++ .../x/sys/unix/zerrors_linux_386.go | 2565 +++ .../x/sys/unix/zerrors_linux_amd64.go | 2565 +++ .../x/sys/unix/zerrors_linux_arm.go | 2571 +++ .../x/sys/unix/zerrors_linux_arm64.go | 2556 +++ .../x/sys/unix/zerrors_linux_mips.go | 2573 +++ .../x/sys/unix/zerrors_linux_mips64.go | 2573 +++ .../x/sys/unix/zerrors_linux_mips64le.go | 2573 +++ .../x/sys/unix/zerrors_linux_mipsle.go | 2573 +++ .../x/sys/unix/zerrors_linux_ppc64.go | 2626 +++ .../x/sys/unix/zerrors_linux_ppc64le.go | 2626 +++ .../x/sys/unix/zerrors_linux_s390x.go | 2625 +++ .../x/sys/unix/zerrors_linux_sparc64.go | 2142 ++ .../x/sys/unix/zerrors_netbsd_386.go | 1728 ++ .../x/sys/unix/zerrors_netbsd_amd64.go | 1718 ++ .../x/sys/unix/zerrors_netbsd_arm.go | 1707 ++ .../x/sys/unix/zerrors_openbsd_386.go | 1600 ++ .../x/sys/unix/zerrors_openbsd_amd64.go | 1706 ++ .../x/sys/unix/zerrors_openbsd_arm.go | 1602 ++ .../x/sys/unix/zerrors_solaris_amd64.go | 1497 ++ .../golang.org/x/sys/unix/zptrace386_linux.go | 80 + .../golang.org/x/sys/unix/zptracearm_linux.go | 41 + .../x/sys/unix/zptracemips_linux.go | 50 + .../x/sys/unix/zptracemipsle_linux.go | 50 + .../x/sys/unix/zsyscall_darwin_386.go | 1712 ++ .../x/sys/unix/zsyscall_darwin_amd64.go | 1712 ++ .../x/sys/unix/zsyscall_darwin_arm.go | 1712 ++ .../x/sys/unix/zsyscall_darwin_arm64.go | 1712 ++ .../x/sys/unix/zsyscall_dragonfly_amd64.go | 1508 ++ .../x/sys/unix/zsyscall_freebsd_386.go | 1937 ++ .../x/sys/unix/zsyscall_freebsd_amd64.go | 1937 ++ .../x/sys/unix/zsyscall_freebsd_arm.go | 1937 ++ .../x/sys/unix/zsyscall_linux_386.go | 2005 ++ .../x/sys/unix/zsyscall_linux_amd64.go | 2172 ++ .../x/sys/unix/zsyscall_linux_arm.go | 2107 ++ .../x/sys/unix/zsyscall_linux_arm64.go | 2065 ++ .../x/sys/unix/zsyscall_linux_mips.go | 2173 ++ .../x/sys/unix/zsyscall_linux_mips64.go | 2156 ++ .../x/sys/unix/zsyscall_linux_mips64le.go | 2156 ++ .../x/sys/unix/zsyscall_linux_mipsle.go | 2173 ++ .../x/sys/unix/zsyscall_linux_ppc64.go | 2219 ++ .../x/sys/unix/zsyscall_linux_ppc64le.go | 2219 ++ .../x/sys/unix/zsyscall_linux_s390x.go | 1989 ++ .../x/sys/unix/zsyscall_linux_sparc64.go | 1843 ++ .../x/sys/unix/zsyscall_netbsd_386.go | 1424 ++ .../x/sys/unix/zsyscall_netbsd_amd64.go | 1424 ++ .../x/sys/unix/zsyscall_netbsd_arm.go | 1424 ++ .../x/sys/unix/zsyscall_openbsd_386.go | 1493 ++ .../x/sys/unix/zsyscall_openbsd_amd64.go | 1493 ++ .../x/sys/unix/zsyscall_openbsd_arm.go | 1493 ++ .../x/sys/unix/zsyscall_solaris_amd64.go | 1681 ++ .../x/sys/unix/zsysctl_openbsd_386.go | 270 + .../x/sys/unix/zsysctl_openbsd_amd64.go | 257 + .../x/sys/unix/zsysctl_openbsd_arm.go | 270 + .../x/sys/unix/zsysnum_darwin_386.go | 436 + .../x/sys/unix/zsysnum_darwin_amd64.go | 436 + .../x/sys/unix/zsysnum_darwin_arm.go | 436 + .../x/sys/unix/zsysnum_darwin_arm64.go | 436 + .../x/sys/unix/zsysnum_dragonfly_amd64.go | 315 + .../x/sys/unix/zsysnum_freebsd_386.go | 353 + .../x/sys/unix/zsysnum_freebsd_amd64.go | 353 + .../x/sys/unix/zsysnum_freebsd_arm.go | 353 + .../x/sys/unix/zsysnum_linux_386.go | 390 + .../x/sys/unix/zsysnum_linux_amd64.go | 342 + .../x/sys/unix/zsysnum_linux_arm.go | 362 + .../x/sys/unix/zsysnum_linux_arm64.go | 286 + .../x/sys/unix/zsysnum_linux_mips.go | 375 + .../x/sys/unix/zsysnum_linux_mips64.go | 335 + .../x/sys/unix/zsysnum_linux_mips64le.go | 335 + .../x/sys/unix/zsysnum_linux_mipsle.go | 375 + .../x/sys/unix/zsysnum_linux_ppc64.go | 373 + .../x/sys/unix/zsysnum_linux_ppc64le.go | 373 + .../x/sys/unix/zsysnum_linux_s390x.go | 334 + .../x/sys/unix/zsysnum_linux_sparc64.go | 348 + .../x/sys/unix/zsysnum_netbsd_386.go | 274 + .../x/sys/unix/zsysnum_netbsd_amd64.go | 274 + .../x/sys/unix/zsysnum_netbsd_arm.go | 274 + .../x/sys/unix/zsysnum_openbsd_386.go | 207 + .../x/sys/unix/zsysnum_openbsd_amd64.go | 217 + .../x/sys/unix/zsysnum_openbsd_arm.go | 213 + .../x/sys/unix/ztypes_darwin_386.go | 489 + .../x/sys/unix/ztypes_darwin_amd64.go | 499 + .../x/sys/unix/ztypes_darwin_arm.go | 490 + .../x/sys/unix/ztypes_darwin_arm64.go | 499 + .../x/sys/unix/ztypes_dragonfly_amd64.go | 486 + .../x/sys/unix/ztypes_freebsd_386.go | 553 + .../x/sys/unix/ztypes_freebsd_amd64.go | 556 + .../x/sys/unix/ztypes_freebsd_arm.go | 556 + .../golang.org/x/sys/unix/ztypes_linux_386.go | 1815 ++ .../x/sys/unix/ztypes_linux_amd64.go | 1835 ++ .../golang.org/x/sys/unix/ztypes_linux_arm.go | 1804 ++ .../x/sys/unix/ztypes_linux_arm64.go | 1814 ++ .../x/sys/unix/ztypes_linux_mips.go | 1809 ++ .../x/sys/unix/ztypes_linux_mips64.go | 1816 ++ .../x/sys/unix/ztypes_linux_mips64le.go | 1816 ++ .../x/sys/unix/ztypes_linux_mipsle.go | 1809 ++ .../x/sys/unix/ztypes_linux_ppc64.go | 1824 ++ .../x/sys/unix/ztypes_linux_ppc64le.go | 1824 ++ .../x/sys/unix/ztypes_linux_s390x.go | 1841 ++ .../x/sys/unix/ztypes_linux_sparc64.go | 690 + .../x/sys/unix/ztypes_netbsd_386.go | 448 + .../x/sys/unix/ztypes_netbsd_amd64.go | 455 + .../x/sys/unix/ztypes_netbsd_arm.go | 453 + .../x/sys/unix/ztypes_openbsd_386.go | 484 + .../x/sys/unix/ztypes_openbsd_amd64.go | 484 + .../x/sys/unix/ztypes_openbsd_arm.go | 477 + .../x/sys/unix/ztypes_solaris_amd64.go | 459 + .../x/sys/windows/asm_windows_386.s | 13 + .../x/sys/windows/asm_windows_amd64.s | 13 + .../golang.org/x/sys/windows/dll_windows.go | 378 + .../golang.org/x/sys/windows/env_windows.go | 29 + .../golang.org/x/sys/windows/eventlog.go | 20 + .../golang.org/x/sys/windows/exec_windows.go | 97 + .../x/sys/windows/memory_windows.go | 26 + .../golang.org/x/sys/windows/mksyscall.go | 7 + api/vendor/golang.org/x/sys/windows/race.go | 30 + api/vendor/golang.org/x/sys/windows/race0.go | 25 + .../x/sys/windows/registry/export_test.go | 11 + .../golang.org/x/sys/windows/registry/key.go | 198 + .../x/sys/windows/registry/mksyscall.go | 7 + .../x/sys/windows/registry/registry_test.go | 756 + .../x/sys/windows/registry/syscall.go | 32 + .../x/sys/windows/registry/value.go | 384 + .../sys/windows/registry/zsyscall_windows.go | 120 + .../x/sys/windows/security_windows.go | 476 + .../golang.org/x/sys/windows/service.go | 165 + api/vendor/golang.org/x/sys/windows/str.go | 22 + .../golang.org/x/sys/windows/svc/debug/log.go | 56 + .../x/sys/windows/svc/debug/service.go | 45 + .../golang.org/x/sys/windows/svc/event.go | 48 + .../x/sys/windows/svc/eventlog/install.go | 80 + .../x/sys/windows/svc/eventlog/log.go | 70 + .../x/sys/windows/svc/eventlog/log_test.go | 51 + .../x/sys/windows/svc/example/beep.go | 22 + .../x/sys/windows/svc/example/install.go | 92 + .../x/sys/windows/svc/example/main.go | 76 + .../x/sys/windows/svc/example/manage.go | 62 + .../x/sys/windows/svc/example/service.go | 84 + .../golang.org/x/sys/windows/svc/go12.c | 24 + .../golang.org/x/sys/windows/svc/go12.go | 11 + .../golang.org/x/sys/windows/svc/go13.go | 31 + .../x/sys/windows/svc/mgr/config.go | 139 + .../golang.org/x/sys/windows/svc/mgr/mgr.go | 162 + .../x/sys/windows/svc/mgr/mgr_test.go | 169 + .../x/sys/windows/svc/mgr/service.go | 72 + .../golang.org/x/sys/windows/svc/security.go | 62 + .../golang.org/x/sys/windows/svc/service.go | 363 + .../golang.org/x/sys/windows/svc/svc_test.go | 135 + .../golang.org/x/sys/windows/svc/sys_386.s | 68 + .../golang.org/x/sys/windows/svc/sys_amd64.s | 42 + .../golang.org/x/sys/windows/syscall.go | 74 + .../golang.org/x/sys/windows/syscall_test.go | 53 + .../x/sys/windows/syscall_windows.go | 1153 + .../x/sys/windows/syscall_windows_test.go | 107 + .../golang.org/x/sys/windows/types_windows.go | 1333 ++ .../x/sys/windows/types_windows_386.go | 22 + .../x/sys/windows/types_windows_amd64.go | 22 + .../x/sys/windows/zsyscall_windows.go | 2700 +++ .../alecthomas/kingpin.v2/.travis.yml | 4 + .../gopkg.in/alecthomas/kingpin.v2/COPYING | 19 + .../gopkg.in/alecthomas/kingpin.v2/README.md | 674 + .../kingpin.v2/_examples/chat1/main.go | 20 + .../kingpin.v2/_examples/chat2/main.go | 38 + .../kingpin.v2/_examples/completion/main.go | 96 + .../kingpin.v2/_examples/curl/main.go | 105 + .../kingpin.v2/_examples/modular/main.go | 30 + .../kingpin.v2/_examples/ping/main.go | 20 + .../gopkg.in/alecthomas/kingpin.v2/actions.go | 42 + .../gopkg.in/alecthomas/kingpin.v2/app.go | 688 + .../alecthomas/kingpin.v2/app_test.go | 404 + .../gopkg.in/alecthomas/kingpin.v2/args.go | 184 + .../alecthomas/kingpin.v2/args_test.go | 84 + .../gopkg.in/alecthomas/kingpin.v2/cmd.go | 274 + .../kingpin.v2/cmd/genvalues/main.go | 134 + .../alecthomas/kingpin.v2/cmd_test.go | 374 + .../alecthomas/kingpin.v2/completions.go | 33 + .../alecthomas/kingpin.v2/completions_test.go | 78 + .../gopkg.in/alecthomas/kingpin.v2/doc.go | 68 + .../gopkg.in/alecthomas/kingpin.v2/envar.go | 45 + .../alecthomas/kingpin.v2/examples_test.go | 46 + .../gopkg.in/alecthomas/kingpin.v2/flags.go | 308 + .../alecthomas/kingpin.v2/flags_test.go | 368 + .../gopkg.in/alecthomas/kingpin.v2/global.go | 94 + .../alecthomas/kingpin.v2/guesswidth.go | 9 + .../alecthomas/kingpin.v2/guesswidth_unix.go | 38 + .../gopkg.in/alecthomas/kingpin.v2/model.go | 227 + .../gopkg.in/alecthomas/kingpin.v2/parser.go | 396 + .../alecthomas/kingpin.v2/parser_test.go | 122 + .../gopkg.in/alecthomas/kingpin.v2/parsers.go | 212 + .../alecthomas/kingpin.v2/parsers_test.go | 98 + .../alecthomas/kingpin.v2/templates.go | 262 + .../gopkg.in/alecthomas/kingpin.v2/usage.go | 211 + .../alecthomas/kingpin.v2/usage_test.go | 65 + .../gopkg.in/alecthomas/kingpin.v2/values.go | 470 + .../alecthomas/kingpin.v2/values.json | 25 + .../alecthomas/kingpin.v2/values_generated.go | 821 + .../alecthomas/kingpin.v2/values_test.go | 98 + api/vendor/gopkg.in/fsnotify.v1/.editorconfig | 5 + .../fsnotify.v1/.github/ISSUE_TEMPLATE.md | 11 + .../.github/PULL_REQUEST_TEMPLATE.md | 8 + api/vendor/gopkg.in/fsnotify.v1/.gitignore | 6 + api/vendor/gopkg.in/fsnotify.v1/.travis.yml | 30 + api/vendor/gopkg.in/fsnotify.v1/AUTHORS | 52 + api/vendor/gopkg.in/fsnotify.v1/CHANGELOG.md | 317 + .../gopkg.in/fsnotify.v1/CONTRIBUTING.md | 77 + api/vendor/gopkg.in/fsnotify.v1/LICENSE | 28 + api/vendor/gopkg.in/fsnotify.v1/README.md | 79 + .../gopkg.in/fsnotify.v1/example_test.go | 42 + api/vendor/gopkg.in/fsnotify.v1/fen.go | 37 + api/vendor/gopkg.in/fsnotify.v1/fsnotify.go | 66 + .../gopkg.in/fsnotify.v1/fsnotify_test.go | 70 + api/vendor/gopkg.in/fsnotify.v1/inotify.go | 337 + .../gopkg.in/fsnotify.v1/inotify_poller.go | 187 + .../fsnotify.v1/inotify_poller_test.go | 229 + .../gopkg.in/fsnotify.v1/inotify_test.go | 449 + .../fsnotify.v1/integration_darwin_test.go | 147 + .../gopkg.in/fsnotify.v1/integration_test.go | 1237 ++ api/vendor/gopkg.in/fsnotify.v1/kqueue.go | 521 + .../gopkg.in/fsnotify.v1/open_mode_bsd.go | 11 + .../gopkg.in/fsnotify.v1/open_mode_darwin.go | 12 + api/vendor/gopkg.in/fsnotify.v1/windows.go | 561 + api/vendor/gopkg.in/yaml.v2/.travis.yml | 12 + api/vendor/gopkg.in/yaml.v2/LICENSE | 201 + api/vendor/gopkg.in/yaml.v2/LICENSE.libyaml | 31 + api/vendor/gopkg.in/yaml.v2/NOTICE | 13 + api/vendor/gopkg.in/yaml.v2/README.md | 133 + api/vendor/gopkg.in/yaml.v2/apic.go | 739 + api/vendor/gopkg.in/yaml.v2/decode.go | 775 + api/vendor/gopkg.in/yaml.v2/decode_test.go | 1326 ++ api/vendor/gopkg.in/yaml.v2/emitterc.go | 1685 ++ api/vendor/gopkg.in/yaml.v2/encode.go | 362 + api/vendor/gopkg.in/yaml.v2/encode_test.go | 595 + .../gopkg.in/yaml.v2/example_embedded_test.go | 41 + api/vendor/gopkg.in/yaml.v2/go.mod | 5 + api/vendor/gopkg.in/yaml.v2/parserc.go | 1095 + api/vendor/gopkg.in/yaml.v2/readerc.go | 412 + api/vendor/gopkg.in/yaml.v2/resolve.go | 258 + api/vendor/gopkg.in/yaml.v2/scannerc.go | 2696 +++ api/vendor/gopkg.in/yaml.v2/sorter.go | 113 + api/vendor/gopkg.in/yaml.v2/suite_test.go | 12 + api/vendor/gopkg.in/yaml.v2/writerc.go | 26 + api/vendor/gopkg.in/yaml.v2/yaml.go | 466 + api/vendor/gopkg.in/yaml.v2/yamlh.go | 738 + api/vendor/gopkg.in/yaml.v2/yamlprivateh.go | 173 + api/version/version.go | 21 + api/version/version_test.go | 1 + documentation/architecture.png | Bin 0 -> 93732 bytes documentation/configuration.md | 226 + documentation/sample.png | Bin 0 -> 740384 bytes documentation/sample_filter.png | Bin 0 -> 807915 bytes example/README.md | 11 + example/docker-compose.yaml | 30 + example/prometheus-mock/Dockerfile | 18 + example/prometheus-mock/Gopkg.lock | 51 + example/prometheus-mock/Gopkg.toml | 3 + example/prometheus-mock/debug | Bin 0 -> 9544412 bytes example/prometheus-mock/main.go | 316 + example/prometheus-mock/prometheus-mock | Bin 0 -> 8225100 bytes .../vendor/github.com/beorn7/perks/.gitignore | 2 + .../vendor/github.com/beorn7/perks/LICENSE | 20 + .../vendor/github.com/beorn7/perks/README.md | 31 + .../beorn7/perks/histogram/bench_test.go | 26 + .../beorn7/perks/histogram/histogram.go | 108 + .../beorn7/perks/histogram/histogram_test.go | 38 + .../beorn7/perks/quantile/bench_test.go | 63 + .../beorn7/perks/quantile/example_test.go | 121 + .../beorn7/perks/quantile/exampledata.txt | 2388 +++ .../beorn7/perks/quantile/stream.go | 292 + .../beorn7/perks/quantile/stream_test.go | 215 + .../github.com/beorn7/perks/topk/topk.go | 90 + .../github.com/beorn7/perks/topk/topk_test.go | 57 + .../github.com/golang/protobuf/.gitignore | 16 + .../github.com/golang/protobuf/.travis.yml | 18 + .../vendor/github.com/golang/protobuf/AUTHORS | 3 + .../github.com/golang/protobuf/CONTRIBUTORS | 3 + .../vendor/github.com/golang/protobuf/LICENSE | 31 + .../github.com/golang/protobuf/Make.protobuf | 40 + .../github.com/golang/protobuf/Makefile | 55 + .../github.com/golang/protobuf/README.md | 243 + .../golang/protobuf/_conformance/Makefile | 33 + .../protobuf/_conformance/conformance.go | 161 + .../conformance_proto/conformance.pb.go | 1885 ++ .../conformance_proto/conformance.proto | 285 + .../golang/protobuf/descriptor/descriptor.go | 93 + .../protobuf/descriptor/descriptor_test.go | 32 + .../golang/protobuf/jsonpb/jsonpb.go | 1083 + .../golang/protobuf/jsonpb/jsonpb_test.go | 896 + .../jsonpb/jsonpb_test_proto/Makefile | 33 + .../jsonpb_test_proto/more_test_objects.pb.go | 266 + .../jsonpb_test_proto/more_test_objects.proto | 69 + .../jsonpb_test_proto/test_objects.pb.go | 852 + .../jsonpb_test_proto/test_objects.proto | 147 + .../github.com/golang/protobuf/proto/Makefile | 43 + .../golang/protobuf/proto/all_test.go | 2278 ++ .../golang/protobuf/proto/any_test.go | 300 + .../github.com/golang/protobuf/proto/clone.go | 229 + .../golang/protobuf/proto/clone_test.go | 300 + .../golang/protobuf/proto/decode.go | 970 + .../golang/protobuf/proto/decode_test.go | 258 + .../golang/protobuf/proto/encode.go | 1362 ++ .../golang/protobuf/proto/encode_test.go | 85 + .../github.com/golang/protobuf/proto/equal.go | 300 + .../golang/protobuf/proto/equal_test.go | 224 + .../golang/protobuf/proto/extensions.go | 587 + .../golang/protobuf/proto/extensions_test.go | 536 + .../github.com/golang/protobuf/proto/lib.go | 897 + .../golang/protobuf/proto/map_test.go | 46 + .../golang/protobuf/proto/message_set.go | 311 + .../golang/protobuf/proto/message_set_test.go | 66 + .../golang/protobuf/proto/pointer_reflect.go | 484 + .../golang/protobuf/proto/pointer_unsafe.go | 270 + .../golang/protobuf/proto/properties.go | 872 + .../protobuf/proto/proto3_proto/proto3.pb.go | 347 + .../protobuf/proto/proto3_proto/proto3.proto | 87 + .../golang/protobuf/proto/proto3_test.go | 135 + .../golang/protobuf/proto/size2_test.go | 63 + .../golang/protobuf/proto/size_test.go | 164 + .../golang/protobuf/proto/testdata/Makefile | 50 + .../protobuf/proto/testdata/golden_test.go | 86 + .../golang/protobuf/proto/testdata/test.pb.go | 4147 ++++ .../golang/protobuf/proto/testdata/test.proto | 548 + .../github.com/golang/protobuf/proto/text.go | 854 + .../golang/protobuf/proto/text_parser.go | 895 + .../golang/protobuf/proto/text_parser_test.go | 673 + .../golang/protobuf/proto/text_test.go | 474 + .../golang/protobuf/protoc-gen-go/Makefile | 33 + .../protoc-gen-go/descriptor/Makefile | 37 + .../protoc-gen-go/descriptor/descriptor.pb.go | 2215 ++ .../protoc-gen-go/descriptor/descriptor.proto | 849 + .../golang/protobuf/protoc-gen-go/doc.go | 51 + .../protobuf/protoc-gen-go/generator/Makefile | 40 + .../protoc-gen-go/generator/generator.go | 2866 +++ .../protoc-gen-go/generator/name_test.go | 114 + .../protobuf/protoc-gen-go/grpc/grpc.go | 463 + .../protobuf/protoc-gen-go/link_grpc.go | 34 + .../golang/protobuf/protoc-gen-go/main.go | 98 + .../protobuf/protoc-gen-go/plugin/Makefile | 45 + .../protoc-gen-go/plugin/plugin.pb.go | 293 + .../protoc-gen-go/plugin/plugin.pb.golden | 83 + .../protoc-gen-go/plugin/plugin.proto | 167 + .../protobuf/protoc-gen-go/testdata/Makefile | 73 + .../testdata/extension_base.proto | 46 + .../testdata/extension_extra.proto | 38 + .../protoc-gen-go/testdata/extension_test.go | 210 + .../testdata/extension_user.proto | 100 + .../protoc-gen-go/testdata/grpc.proto | 59 + .../protoc-gen-go/testdata/imp.pb.go.golden | 113 + .../protobuf/protoc-gen-go/testdata/imp.proto | 70 + .../protoc-gen-go/testdata/imp2.proto | 43 + .../protoc-gen-go/testdata/imp3.proto | 38 + .../protoc-gen-go/testdata/main_test.go | 46 + .../protoc-gen-go/testdata/multi/multi1.proto | 44 + .../protoc-gen-go/testdata/multi/multi2.proto | 46 + .../protoc-gen-go/testdata/multi/multi3.proto | 43 + .../protoc-gen-go/testdata/my_test/test.pb.go | 870 + .../testdata/my_test/test.pb.go.golden | 870 + .../protoc-gen-go/testdata/my_test/test.proto | 156 + .../protoc-gen-go/testdata/proto3.proto | 53 + .../github.com/golang/protobuf/ptypes/any.go | 139 + .../golang/protobuf/ptypes/any/any.pb.go | 178 + .../golang/protobuf/ptypes/any/any.proto | 149 + .../golang/protobuf/ptypes/any_test.go | 113 + .../github.com/golang/protobuf/ptypes/doc.go | 35 + .../golang/protobuf/ptypes/duration.go | 102 + .../protobuf/ptypes/duration/duration.pb.go | 144 + .../protobuf/ptypes/duration/duration.proto | 117 + .../golang/protobuf/ptypes/duration_test.go | 121 + .../golang/protobuf/ptypes/empty/empty.pb.go | 66 + .../golang/protobuf/ptypes/empty/empty.proto | 52 + .../golang/protobuf/ptypes/regen.sh | 43 + .../protobuf/ptypes/struct/struct.pb.go | 380 + .../protobuf/ptypes/struct/struct.proto | 96 + .../golang/protobuf/ptypes/timestamp.go | 134 + .../protobuf/ptypes/timestamp/timestamp.pb.go | 160 + .../protobuf/ptypes/timestamp/timestamp.proto | 133 + .../golang/protobuf/ptypes/timestamp_test.go | 153 + .../protobuf/ptypes/wrappers/wrappers.pb.go | 260 + .../protobuf/ptypes/wrappers/wrappers.proto | 118 + .../golang_protobuf_extensions/.travis.yml | 2 + .../golang_protobuf_extensions/LICENSE | 201 + .../golang_protobuf_extensions/NOTICE | 1 + .../golang_protobuf_extensions/README.md | 20 + .../golang_protobuf_extensions/ext/moved.go | 2 + .../pbtest/deleted.go | 2 + .../pbutil/all_test.go | 177 + .../pbutil/decode.go | 75 + .../pbutil/decode_test.go | 99 + .../golang_protobuf_extensions/pbutil/doc.go | 16 + .../pbutil/encode.go | 46 + .../pbutil/encode_test.go | 67 + .../pbutil/fixtures_test.go | 103 + .../prometheus/client_golang/.gitignore | 26 + .../prometheus/client_golang/.travis.yml | 9 + .../prometheus/client_golang/AUTHORS.md | 18 + .../prometheus/client_golang/CHANGELOG.md | 109 + .../prometheus/client_golang/CONTRIBUTING.md | 18 + .../prometheus/client_golang/LICENSE | 201 + .../prometheus/client_golang/NOTICE | 23 + .../prometheus/client_golang/README.md | 45 + .../prometheus/client_golang/VERSION | 1 + .../client_golang/api/prometheus/api.go | 345 + .../client_golang/api/prometheus/api_test.go | 453 + .../client_golang/examples/random/main.go | 103 + .../client_golang/examples/simple/main.go | 30 + .../client_golang/prometheus/.gitignore | 1 + .../client_golang/prometheus/README.md | 1 + .../prometheus/benchmark_test.go | 183 + .../client_golang/prometheus/collector.go | 75 + .../client_golang/prometheus/counter.go | 172 + .../client_golang/prometheus/counter_test.go | 58 + .../client_golang/prometheus/desc.go | 205 + .../client_golang/prometheus/doc.go | 181 + .../prometheus/example_clustermanager_test.go | 118 + .../client_golang/prometheus/examples_test.go | 751 + .../prometheus/expvar_collector.go | 119 + .../prometheus/expvar_collector_test.go | 97 + .../client_golang/prometheus/fnv.go | 29 + .../client_golang/prometheus/gauge.go | 140 + .../client_golang/prometheus/gauge_test.go | 182 + .../client_golang/prometheus/go_collector.go | 263 + .../prometheus/go_collector_test.go | 123 + .../client_golang/prometheus/histogram.go | 444 + .../prometheus/histogram_test.go | 326 + .../client_golang/prometheus/http.go | 490 + .../client_golang/prometheus/http_test.go | 121 + .../client_golang/prometheus/metric.go | 166 + .../client_golang/prometheus/metric_test.go | 35 + .../prometheus/process_collector.go | 142 + .../prometheus/process_collector_test.go | 58 + .../client_golang/prometheus/promhttp/http.go | 201 + .../prometheus/promhttp/http_test.go | 137 + .../prometheus/push/examples_test.go | 56 + .../client_golang/prometheus/push/push.go | 172 + .../prometheus/push/push_test.go | 176 + .../client_golang/prometheus/registry.go | 806 + .../client_golang/prometheus/registry_test.go | 545 + .../client_golang/prometheus/summary.go | 534 + .../client_golang/prometheus/summary_test.go | 347 + .../client_golang/prometheus/untyped.go | 138 + .../client_golang/prometheus/value.go | 234 + .../client_golang/prometheus/vec.go | 404 + .../client_golang/prometheus/vec_test.go | 312 + .../prometheus/client_model/.gitignore | 1 + .../prometheus/client_model/CONTRIBUTING.md | 18 + .../prometheus/client_model/LICENSE | 201 + .../prometheus/client_model/MAINTAINERS.md | 1 + .../prometheus/client_model/Makefile | 61 + .../github.com/prometheus/client_model/NOTICE | 5 + .../prometheus/client_model/README.md | 26 + .../prometheus/client_model/cpp/metrics.pb.cc | 3380 +++ .../prometheus/client_model/cpp/metrics.pb.h | 2072 ++ .../prometheus/client_model/go/metrics.pb.go | 364 + .../prometheus/client_model/metrics.proto | 81 + .../prometheus/client_model/pom.xml | 130 + .../python/prometheus/__init__.py | 12 + .../python/prometheus/client/__init__.py | 12 + .../prometheus/client/model/__init__.py | 14 + .../prometheus/client/model/metrics_pb2.py | 575 + .../prometheus/client_model/ruby/.gitignore | 5 + .../prometheus/client_model/ruby/Gemfile | 4 + .../prometheus/client_model/ruby/LICENSE | 201 + .../prometheus/client_model/ruby/Makefile | 17 + .../prometheus/client_model/ruby/README.md | 31 + .../prometheus/client_model/ruby/Rakefile | 1 + .../ruby/lib/prometheus/client/model.rb | 2 + .../lib/prometheus/client/model/metrics.pb.rb | 111 + .../lib/prometheus/client/model/version.rb | 7 + .../ruby/prometheus-client-model.gemspec | 22 + .../prometheus/client_model/setup.py | 23 + .../java/io/prometheus/client/Metrics.java | 7683 +++++++ .../github.com/prometheus/common/.travis.yml | 6 + .../prometheus/common/CONTRIBUTING.md | 18 + .../github.com/prometheus/common/LICENSE | 201 + .../prometheus/common/MAINTAINERS.md | 1 + .../github.com/prometheus/common/NOTICE | 5 + .../github.com/prometheus/common/README.md | 12 + .../prometheus/common/config/config.go | 47 + .../prometheus/common/config/http_config.go | 279 + .../common/config/http_config_test.go | 157 + ...ttp.conf.bearer-token-and-file-set.bad.yml | 5 + .../config/testdata/http.conf.empty.bad.yml | 4 + .../common/config/testdata/http.conf.good.yml | 4 + ...ttp.conf.invalid-bearer-token-file.bad.yml | 1 + .../testdata/tls_config.cert_no_key.bad.yml | 1 + .../config/testdata/tls_config.empty.good.yml | 0 .../testdata/tls_config.insecure.good.yml | 1 + .../testdata/tls_config.invalid_field.bad.yml | 1 + .../testdata/tls_config.key_no_cert.bad.yml | 1 + .../common/config/tls_config_test.go | 92 + .../prometheus/common/expfmt/bench_test.go | 167 + .../prometheus/common/expfmt/decode.go | 429 + .../prometheus/common/expfmt/decode_test.go | 435 + .../prometheus/common/expfmt/encode.go | 88 + .../prometheus/common/expfmt/expfmt.go | 38 + .../prometheus/common/expfmt/fuzz.go | 36 + .../expfmt/fuzz/corpus/from_test_parse_0 | 2 + .../expfmt/fuzz/corpus/from_test_parse_1 | 6 + .../expfmt/fuzz/corpus/from_test_parse_2 | 12 + .../expfmt/fuzz/corpus/from_test_parse_3 | 22 + .../expfmt/fuzz/corpus/from_test_parse_4 | 10 + .../fuzz/corpus/from_test_parse_error_0 | 1 + .../fuzz/corpus/from_test_parse_error_1 | 1 + .../fuzz/corpus/from_test_parse_error_10 | 1 + .../fuzz/corpus/from_test_parse_error_11 | 1 + .../fuzz/corpus/from_test_parse_error_12 | 3 + .../fuzz/corpus/from_test_parse_error_13 | 3 + .../fuzz/corpus/from_test_parse_error_14 | 3 + .../fuzz/corpus/from_test_parse_error_15 | 2 + .../fuzz/corpus/from_test_parse_error_16 | 2 + .../fuzz/corpus/from_test_parse_error_17 | 1 + .../fuzz/corpus/from_test_parse_error_18 | 1 + .../fuzz/corpus/from_test_parse_error_19 | 3 + .../fuzz/corpus/from_test_parse_error_2 | 3 + .../fuzz/corpus/from_test_parse_error_3 | 1 + .../fuzz/corpus/from_test_parse_error_4 | 1 + .../fuzz/corpus/from_test_parse_error_5 | 1 + .../fuzz/corpus/from_test_parse_error_6 | 1 + .../fuzz/corpus/from_test_parse_error_7 | 3 + .../fuzz/corpus/from_test_parse_error_8 | 1 + .../fuzz/corpus/from_test_parse_error_9 | 1 + .../common/expfmt/fuzz/corpus/minimal | 1 + .../prometheus/common/expfmt/testdata/json2 | 46 + .../common/expfmt/testdata/json2_bad | 46 + .../common/expfmt/testdata/protobuf | Bin 0 -> 8239 bytes .../common/expfmt/testdata/protobuf.gz | Bin 0 -> 2097 bytes .../prometheus/common/expfmt/testdata/text | 322 + .../prometheus/common/expfmt/testdata/text.gz | Bin 0 -> 2598 bytes .../prometheus/common/expfmt/text_create.go | 303 + .../common/expfmt/text_create_test.go | 443 + .../prometheus/common/expfmt/text_parse.go | 757 + .../common/expfmt/text_parse_test.go | 593 + .../bitbucket.org/ww/goautoneg/README.txt | 67 + .../bitbucket.org/ww/goautoneg/autoneg.go | 162 + .../ww/goautoneg/autoneg_test.go | 33 + .../common/log/eventlog_formatter.go | 89 + .../github.com/prometheus/common/log/log.go | 364 + .../prometheus/common/log/log_test.go | 39 + .../prometheus/common/log/syslog_formatter.go | 126 + .../common/log/syslog_formatter_test.go | 52 + .../prometheus/common/model/alert.go | 136 + .../prometheus/common/model/alert_test.go | 118 + .../prometheus/common/model/fingerprinting.go | 105 + .../github.com/prometheus/common/model/fnv.go | 42 + .../prometheus/common/model/labels.go | 210 + .../prometheus/common/model/labels_test.go | 140 + .../prometheus/common/model/labelset.go | 169 + .../prometheus/common/model/metric.go | 103 + .../prometheus/common/model/metric_test.go | 132 + .../prometheus/common/model/model.go | 16 + .../prometheus/common/model/signature.go | 144 + .../prometheus/common/model/signature_test.go | 314 + .../prometheus/common/model/silence.go | 106 + .../prometheus/common/model/silence_test.go | 228 + .../prometheus/common/model/time.go | 261 + .../prometheus/common/model/time_test.go | 129 + .../prometheus/common/model/value.go | 416 + .../prometheus/common/model/value_test.go | 468 + .../prometheus/common/promlog/flag/flag.go | 33 + .../prometheus/common/promlog/log.go | 63 + .../prometheus/common/route/route.go | 100 + .../prometheus/common/route/route_test.go | 44 + .../prometheus/common/version/info.go | 89 + .../github.com/prometheus/procfs/.travis.yml | 5 + .../prometheus/procfs/CONTRIBUTING.md | 18 + .../github.com/prometheus/procfs/LICENSE | 201 + .../prometheus/procfs/MAINTAINERS.md | 1 + .../github.com/prometheus/procfs/Makefile | 18 + .../github.com/prometheus/procfs/NOTICE | 7 + .../github.com/prometheus/procfs/README.md | 11 + .../prometheus/procfs/bcache/bcache.go | 84 + .../prometheus/procfs/bcache/get.go | 330 + .../prometheus/procfs/bcache/get_test.go | 114 + .../github.com/prometheus/procfs/buddyinfo.go | 95 + .../prometheus/procfs/buddyinfo_test.go | 64 + .../github.com/prometheus/procfs/doc.go | 45 + .../prometheus/procfs/fixtures/26231/cmdline | Bin 0 -> 16 bytes .../prometheus/procfs/fixtures/26231/comm | 1 + .../prometheus/procfs/fixtures/26231/exe | 1 + .../prometheus/procfs/fixtures/26231/fd/0 | 1 + .../prometheus/procfs/fixtures/26231/fd/1 | 1 + .../prometheus/procfs/fixtures/26231/fd/10 | 1 + .../prometheus/procfs/fixtures/26231/fd/2 | 1 + .../prometheus/procfs/fixtures/26231/fd/3 | 1 + .../prometheus/procfs/fixtures/26231/io | 7 + .../prometheus/procfs/fixtures/26231/limits | 17 + .../procfs/fixtures/26231/mountstats | 19 + .../prometheus/procfs/fixtures/26231/stat | 1 + .../prometheus/procfs/fixtures/26232/cmdline | 0 .../prometheus/procfs/fixtures/26232/comm | 1 + .../prometheus/procfs/fixtures/26232/fd/0 | 1 + .../prometheus/procfs/fixtures/26232/fd/1 | 1 + .../prometheus/procfs/fixtures/26232/fd/2 | 1 + .../prometheus/procfs/fixtures/26232/fd/3 | 1 + .../prometheus/procfs/fixtures/26232/fd/4 | 1 + .../prometheus/procfs/fixtures/26232/limits | 17 + .../prometheus/procfs/fixtures/26232/stat | 1 + .../prometheus/procfs/fixtures/584/stat | 2 + .../procfs/fixtures/buddyinfo/short/buddyinfo | 3 + .../fixtures/buddyinfo/sizemismatch/buddyinfo | 3 + .../procfs/fixtures/buddyinfo/valid/buddyinfo | 3 + .../prometheus/procfs/fixtures/fs/xfs/stat | 23 + .../prometheus/procfs/fixtures/mdstat | 26 + .../prometheus/procfs/fixtures/net/ip_vs | 21 + .../procfs/fixtures/net/ip_vs_stats | 6 + .../prometheus/procfs/fixtures/net/xfrm_stat | 28 + .../prometheus/procfs/fixtures/self | 1 + .../prometheus/procfs/fixtures/stat | 16 + .../procfs/fixtures/symlinktargets/README | 2 + .../procfs/fixtures/symlinktargets/abc | 0 .../procfs/fixtures/symlinktargets/def | 0 .../procfs/fixtures/symlinktargets/ghi | 0 .../procfs/fixtures/symlinktargets/uvw | 0 .../procfs/fixtures/symlinktargets/xyz | 0 .../vendor/github.com/prometheus/procfs/fs.go | 46 + .../github.com/prometheus/procfs/fs_test.go | 26 + .../github.com/prometheus/procfs/ipvs.go | 246 + .../github.com/prometheus/procfs/ipvs_test.go | 237 + .../github.com/prometheus/procfs/mdstat.go | 138 + .../prometheus/procfs/mdstat_test.go | 31 + .../prometheus/procfs/mountstats.go | 556 + .../prometheus/procfs/mountstats_test.go | 273 + .../github.com/prometheus/procfs/proc.go | 224 + .../github.com/prometheus/procfs/proc_io.go | 55 + .../prometheus/procfs/proc_io_test.go | 33 + .../prometheus/procfs/proc_limits.go | 137 + .../prometheus/procfs/proc_limits_test.go | 31 + .../github.com/prometheus/procfs/proc_stat.go | 175 + .../prometheus/procfs/proc_stat_test.go | 110 + .../github.com/prometheus/procfs/proc_test.go | 160 + .../github.com/prometheus/procfs/stat.go | 219 + .../github.com/prometheus/procfs/stat_test.go | 61 + .../prometheus/procfs/sysfs/.gitignore | 1 + .../github.com/prometheus/procfs/sysfs/doc.go | 16 + .../prometheus/procfs/sysfs/fixtures.ttar | 721 + .../github.com/prometheus/procfs/sysfs/fs.go | 108 + .../prometheus/procfs/sysfs/fs_test.go | 108 + .../vendor/github.com/prometheus/procfs/ttar | 264 + .../github.com/prometheus/procfs/xfrm.go | 187 + .../github.com/prometheus/procfs/xfrm_test.go | 66 + .../github.com/prometheus/procfs/xfs/parse.go | 359 + .../prometheus/procfs/xfs/parse_test.go | 442 + .../github.com/prometheus/procfs/xfs/xfs.go | 163 + example/prometheus.yml | 8 + example/vistio.yaml | 96 + helm/vistio/.helmignore | 21 + helm/vistio/Chart.yaml | 4 + helm/vistio/templates/NOTES.txt | 3 + helm/vistio/templates/_helpers.tpl | 20 + helm/vistio/templates/configmap.yaml | 12 + helm/vistio/templates/deployment.yaml | 32 + helm/vistio/templates/service.yaml | 39 + helm/vistio/templates/statefulset.yaml | 80 + helm/vistio/values-mesh-only.yaml | 49 + helm/vistio/values-with-ingress.yaml | 47 + helm/vistio/values.yaml | 77 + web/.babelrc | 3 + web/.circleci/config.yml | 29 + web/.env | 3 + web/.eslintrc | 42 + web/.gitignore | 19 + web/Dockerfile | 15 + web/LICENSE | 202 + web/README.md | 45 + web/package-lock.json | 7722 +++++++ web/package.json | 82 + web/server.js | 13 + web/src/app.css | 380 + web/src/app.jsx | 36 + web/src/appConstants.js | 25 + web/src/appDispatcher.js | 16 + web/src/components/breadcrumbs.css | 29 + web/src/components/breadcrumbs.jsx | 60 + web/src/components/connectionChart.jsx | 190 + web/src/components/connectionList.jsx | 154 + web/src/components/controls.css | 41 + web/src/components/customVizceral.jsx | 55 + web/src/components/detailsPanel.css | 115 + web/src/components/detailsPanelConnection.jsx | 69 + web/src/components/detailsPanelNode.jsx | 81 + web/src/components/detailsSubpanel.jsx | 60 + web/src/components/displayOptions.jsx | 50 + web/src/components/filterActions.js | 29 + web/src/components/filterControls.jsx | 126 + web/src/components/filterStore.js | 228 + web/src/components/istio.png | Bin 0 -> 7632 bytes web/src/components/loadingCover.css | 88 + web/src/components/loadingCover.jsx | 86 + web/src/components/locator.css | 8 + web/src/components/locator.jsx | 68 + web/src/components/notices.jsx | 40 + web/src/components/optionsPanel.css | 27 + web/src/components/optionsPanel.jsx | 98 + web/src/components/physicsOptions.css | 14 + web/src/components/physicsOptions.jsx | 76 + web/src/components/replayClock.css | 65 + web/src/components/replayClock.jsx | 126 + web/src/components/serverStatus.css | 38 + web/src/components/serverStatus.jsx | 72 + web/src/components/stepper.jsx | 43 + web/src/components/trafficActions.js | 24 + web/src/components/trafficFlow.css | 20 + web/src/components/trafficFlow.jsx | 421 + web/src/components/trafficStore.js | 192 + web/src/favicon.ico | Bin 0 -> 440 bytes web/src/index.html | 28 + web/webpack.config.js | 61 + 3490 files changed, 973305 insertions(+) create mode 100644 .circleci/config.yml create mode 100644 .gitignore create mode 100644 .vscode/launch.json create mode 100644 LICENSE create mode 100644 README.md create mode 100644 api/Dockerfile create mode 100644 api/Gopkg.lock create mode 100644 api/Gopkg.toml create mode 100644 api/Makefile create mode 100644 api/api/api.go create mode 100644 api/api/api_test.go create mode 100644 api/cache/cache.go create mode 100644 api/cache/cache_test.go create mode 100644 api/cache/cachemock/Cache.go create mode 100644 api/cmd/k8s-config-reloader/.gitignore create mode 100644 api/cmd/k8s-config-reloader/Dockerfile create mode 100644 api/cmd/k8s-config-reloader/Gopkg.lock create mode 100644 api/cmd/k8s-config-reloader/Gopkg.toml create mode 100644 api/cmd/k8s-config-reloader/Makefile create mode 100644 api/cmd/k8s-config-reloader/main.go create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/LICENSE create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/README.md create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/doc.go create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/example_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/examplefiles_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/examplefunc_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/exec.go create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/exec_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/funcs.go create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/helper.go create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/multi_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/parse/lex.go create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/parse/lex_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/parse/node.go create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/parse/parse.go create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/parse/parse_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/template.go create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/testdata/file1.tmpl create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/testdata/file2.tmpl create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/testdata/tmpl1.tmpl create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/testdata/tmpl2.tmpl create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/units/COPYING create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/units/README.md create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/units/bytes.go create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/units/bytes_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/units/doc.go create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/units/si.go create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/units/util.go create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/.gitignore create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/.travis.yml create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/LICENSE create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/README.md create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/backoff.go create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/backoff_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/context.go create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/context_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/example_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/exponential.go create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/exponential_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/retry.go create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/retry_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/ticker.go create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/ticker_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/tries.go create mode 100644 api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/tries_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/.gitignore create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/.travis.yml create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/LICENSE.txt create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/Makefile create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/README.md create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/atomic.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/atomic_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/example_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/glide.lock create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/glide.yaml create mode 100755 api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/scripts/cover.sh create mode 100755 api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/scripts/test-ubergo.sh create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/stress_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/string.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/string_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/.codecov.yml create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/.gitignore create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/.travis.yml create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/CHANGELOG.md create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/LICENSE.txt create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/Makefile create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/README.md create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/benchmarks_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/error.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/error_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/example_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/glide.lock create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/glide.yaml create mode 100755 api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/scripts/cover.sh create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/.codecov.yml create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/.gitignore create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/.readme.tmpl create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/.travis.yml create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/CHANGELOG.md create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/CODE_OF_CONDUCT.md create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/CONTRIBUTING.md create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/FAQ.md create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/LICENSE.txt create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/Makefile create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/README.md create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/array.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/array_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/benchmarks/apex_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/benchmarks/doc.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/benchmarks/kit_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/benchmarks/lion_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/benchmarks/log15_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/benchmarks/logrus_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/benchmarks/scenario_bench_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/benchmarks/zap_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/benchmarks/zerolog_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/buffer/buffer.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/buffer/buffer_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/buffer/pool.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/buffer/pool_test.go create mode 100755 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/check_license.sh create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/common_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/config.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/config_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/doc.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/encoder.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/encoder_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/error.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/error_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/example_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/field.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/field_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/flag.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/flag_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/glide.lock create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/glide.yaml create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/global.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/global_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/http_handler.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/http_handler_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/internal/bufferpool/bufferpool.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/internal/color/color.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/internal/color/color_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/internal/exit/exit.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/internal/exit/exit_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/internal/readme/readme.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/level.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/level_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/logger.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/logger_bench_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/logger_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/options.go create mode 100755 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/scripts/cover.sh create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/stacktrace.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/stacktrace_ext_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/stacktrace_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/sugar.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/sugar_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/time.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/time_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/writer.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/writer_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/console_encoder.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/console_encoder_bench_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/core.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/core_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/doc.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/encoder.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/encoder_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/entry.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/entry_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/error.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/error_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/field.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/field_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/hook.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/hook_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/json_encoder.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/json_encoder_bench_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/json_encoder_impl_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/level.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/level_strings.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/level_strings_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/level_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/marshaler.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/memory_encoder.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/memory_encoder_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/sampler.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/sampler_bench_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/sampler_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/tee.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/tee_logger_bench_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/tee_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/write_syncer.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/write_syncer_bench_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/write_syncer_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapgrpc/zapgrpc.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapgrpc/zapgrpc_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zaptest/doc.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zaptest/observer/logged_entry.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zaptest/observer/logged_entry_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zaptest/observer/observer.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zaptest/observer/observer_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zaptest/timeout.go create mode 100644 api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zaptest/writer.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/.gitattributes create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/.gitignore create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/AUTHORS create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/CONTRIBUTING.md create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/CONTRIBUTORS create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/LICENSE create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/PATENTS create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/README.md create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/asm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/constants.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/doc.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/instructions.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/instructions_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/setter.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/testdata/all_instructions.bpf create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/testdata/all_instructions.txt create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm_aluop_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm_bpf_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm_extension_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm_instructions.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm_jump_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm_load_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm_ret_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm_scratch_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/codereview.cfg create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/context.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/context_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_17_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_pre17.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_pre17_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/go17.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/go19.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/pre_go17.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/pre_go19.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/withtimeout_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/dict/dict.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/dns/dnsmessage/example_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/dns/dnsmessage/message.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/dns/dnsmessage/message_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/atom/atom.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/atom/atom_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/atom/gen.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/atom/table.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/atom/table_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/charset.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/charset_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/HTTP-charset.html create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-UTF-8-BOM.html create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-charset.html create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-content.html create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/No-encoding-declaration.html create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/README create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/UTF-16BE-BOM.html create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/UTF-16LE-BOM.html create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-charset.html create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-content.html create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/meta-charset-attribute.html create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/meta-content-attribute.html create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/const.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/doc.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/doctype.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/entity.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/entity_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/escape.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/escape_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/example_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/foreign.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/node.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/node_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/parse.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/parse_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/render.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/render_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/go1.html create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/README create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/adoption01.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/adoption02.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/comments01.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/doctype01.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/entities01.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/entities02.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/html5test-com.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/inbody01.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/isindex.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/pending-spec-changes-plain-text-unsafe.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/pending-spec-changes.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/plain-text-unsafe.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/scriptdata01.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/scripted/adoption01.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/scripted/webkit01.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tables01.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests1.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests10.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests11.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests12.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests14.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests15.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests16.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests17.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests18.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests19.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests2.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests20.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests21.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests22.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests23.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests24.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests25.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests26.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests3.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests4.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests5.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests6.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests7.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests8.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests9.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests_innerHTML_1.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tricky01.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/webkit01.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/webkit02.dat create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/token.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/token_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/.gitignore create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/Dockerfile create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/Makefile create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/README create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/ciphers.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/ciphers_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/client_conn_pool.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/configure_transport.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/databuffer.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/databuffer_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/errors.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/errors_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/flow.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/flow_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/frame.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/frame_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/go16.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/go17.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/go17_not18.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/go18.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/go18_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/go19.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/go19_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/gotrack.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/gotrack_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2demo/.gitignore create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2demo/Makefile create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2demo/README create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2demo/h2demo.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2demo/launch.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2demo/rootCA.key create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2demo/rootCA.pem create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2demo/rootCA.srl create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2demo/server.crt create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2demo/server.key create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2demo/tmpl.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2i/README.md create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2i/h2i.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/headermap.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/hpack/encode.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/hpack/encode_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/hpack/hpack.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/hpack/hpack_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/hpack/huffman.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/hpack/tables.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/hpack/tables_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/http2.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/http2_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/not_go16.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/not_go17.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/not_go18.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/not_go19.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/pipe.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/pipe_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/server.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/server_push_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/server_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/testdata/draft-ietf-httpbis-http2.xml create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/transport.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/transport_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/write.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/writesched.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/writesched_priority.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/writesched_priority_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/writesched_random.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/writesched_random_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/writesched_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/z_spec_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/dstunreach.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/echo.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/endpoint.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/example_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/extension.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/extension_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/helper_posix.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/interface.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/ipv4.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/ipv4_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/ipv6.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/listen_posix.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/listen_stub.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/message.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/message_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/messagebody.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/mpls.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/multipart.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/multipart_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/packettoobig.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/paramprob.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/ping_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/sys_freebsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/timeexceeded.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/idna/example_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/idna/idna.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/idna/idna_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/idna/punycode.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/idna/punycode_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/idna/tables.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/idna/trie.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/idna/trieval.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/iana/const.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/iana/gen.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/nettest/helper_bsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/nettest/helper_nobsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/nettest/helper_posix.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/nettest/helper_stub.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/nettest/helper_unix.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/nettest/helper_windows.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/nettest/interface.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/nettest/rlimit.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/nettest/stack.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/cmsghdr.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/cmsghdr_bsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_32bit.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_64bit.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/cmsghdr_solaris_64bit.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/cmsghdr_stub.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/defs_darwin.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/defs_dragonfly.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/defs_freebsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/defs_linux.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/defs_netbsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/defs_openbsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/defs_solaris.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/error_unix.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/error_windows.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/iovec_32bit.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/iovec_64bit.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/iovec_solaris_64bit.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/iovec_stub.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/mmsghdr_stub.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/mmsghdr_unix.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/msghdr_bsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/msghdr_bsdvar.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/msghdr_linux.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/msghdr_linux_32bit.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/msghdr_linux_64bit.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/msghdr_openbsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/msghdr_solaris_64bit.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/msghdr_stub.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/rawconn.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/rawconn_mmsg.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/rawconn_msg.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/rawconn_nommsg.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/rawconn_nomsg.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/rawconn_stub.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/reflect.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/socket.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/socket_go1_9_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/socket_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_bsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_bsdvar.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_darwin.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_dragonfly.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_386.s create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_arm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_arm64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_mips.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_mips64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_mips64le.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_mipsle.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_ppc64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_ppc64le.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_s390x.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_s390x.s create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_netbsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_posix.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_solaris.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_solaris_amd64.s create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_stub.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_unix.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_windows.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_darwin_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_darwin_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_dragonfly_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_freebsd_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_freebsd_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_arm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_arm64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_mips.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64le.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_mipsle.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64le.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_s390x.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_netbsd_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_netbsd_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_openbsd_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_openbsd_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_solaris_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/timeseries/timeseries.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/timeseries/timeseries_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/batch.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/bpf_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/control.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/control_bsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/control_pktinfo.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/control_stub.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/control_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/control_unix.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/control_windows.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/defs_darwin.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/defs_dragonfly.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/defs_freebsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/defs_linux.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/defs_netbsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/defs_openbsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/defs_solaris.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/dgramopt.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/doc.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/endpoint.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/example_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/gen.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/genericopt.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/header.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/header_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/helper.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/iana.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/icmp.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/icmp_linux.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/icmp_stub.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/icmp_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/multicast_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/multicastlistener_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/multicastsockopt_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/packet.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/packet_go1_8.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/packet_go1_9.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/payload.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/payload_cmsg.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/payload_cmsg_go1_8.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/payload_cmsg_go1_9.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/payload_nocmsg.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/readwrite_go1_8_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/readwrite_go1_9_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/readwrite_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sockopt.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sockopt_posix.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sockopt_stub.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_asmreq.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_asmreq_stub.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_asmreqn.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_asmreqn_stub.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_bpf.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_bpf_stub.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_bsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_darwin.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_dragonfly.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_freebsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_linux.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_solaris.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_ssmreq.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_ssmreq_stub.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_stub.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_windows.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/unicast_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/unicastsockopt_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_darwin.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_dragonfly.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_freebsd_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_freebsd_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_freebsd_arm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_arm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_arm64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_mips.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_mips64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_mips64le.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_mipsle.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_ppc.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64le.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_s390x.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_netbsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_openbsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_solaris.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/batch.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/bpf_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/control.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/control_rfc2292_unix.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/control_rfc3542_unix.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/control_stub.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/control_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/control_unix.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/control_windows.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/defs_darwin.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/defs_dragonfly.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/defs_freebsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/defs_linux.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/defs_netbsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/defs_openbsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/defs_solaris.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/dgramopt.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/doc.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/endpoint.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/example_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/gen.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/genericopt.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/header.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/header_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/helper.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/iana.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/icmp.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/icmp_bsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/icmp_linux.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/icmp_solaris.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/icmp_stub.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/icmp_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/icmp_windows.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/mocktransponder_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/multicast_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/multicastlistener_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/multicastsockopt_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/payload.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/payload_cmsg.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/payload_cmsg_go1_8.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/payload_cmsg_go1_9.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/payload_nocmsg.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/readwrite_go1_8_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/readwrite_go1_9_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/readwrite_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sockopt.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sockopt_posix.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sockopt_stub.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sockopt_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_asmreq.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_asmreq_stub.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_bpf.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_bpf_stub.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_bsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_darwin.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_freebsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_linux.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_solaris.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_ssmreq.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_ssmreq_stub.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_stub.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_windows.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/unicast_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/unicastsockopt_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_darwin.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_dragonfly.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_freebsd_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_freebsd_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_freebsd_arm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_arm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_arm64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_mips.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_mips64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_mips64le.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_mipsle.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_ppc.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64le.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_s390x.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_netbsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_openbsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_solaris.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lex/httplex/httplex.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lex/httplex/httplex_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/address.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/address_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/binary.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/defs_solaris.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/lif.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/link.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/link_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/sys.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/sys_solaris_amd64.s create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/syscall.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/zsys_solaris_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/nettest/conntest.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/nettest/conntest_go16.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/nettest/conntest_go17.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/nettest/conntest_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/netutil/listen.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/netutil/listen_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/proxy/direct.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/proxy/per_host.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/proxy/per_host_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/proxy/proxy.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/proxy/proxy_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/proxy/socks5.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/publicsuffix/gen.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/publicsuffix/list.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/publicsuffix/list_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/publicsuffix/table.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/publicsuffix/table_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/address.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/address_darwin_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/address_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/binary.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/defs_darwin.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/defs_dragonfly.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/defs_freebsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/defs_netbsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/defs_openbsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/interface.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/interface_announce.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/interface_classic.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/interface_freebsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/interface_multicast.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/interface_openbsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/message.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/message_darwin_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/message_freebsd_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/message_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/route.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/route_classic.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/route_openbsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/route_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/sys.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/sys_darwin.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/sys_dragonfly.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/sys_freebsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/sys_netbsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/sys_openbsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/syscall.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/zsys_darwin.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/zsys_dragonfly.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/zsys_freebsd_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/zsys_freebsd_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/zsys_freebsd_arm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/zsys_netbsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/zsys_openbsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/trace/events.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/trace/histogram.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/trace/histogram_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/trace/trace.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/trace/trace_go16.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/trace/trace_go17.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/trace/trace_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/file.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/file_go1.6.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/file_go1.7.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/file_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/if.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/if_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/internal/xml/README create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/internal/xml/atom_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/internal/xml/example_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/internal/xml/marshal.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/internal/xml/marshal_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/internal/xml/read.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/internal/xml/read_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/internal/xml/typeinfo.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/internal/xml/xml.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/internal/xml/xml_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/litmus_test_server.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/lock.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/lock_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/prop.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/prop_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/webdav.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/webdav_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/xml.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/xml_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/client.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/dial.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/dial_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/exampledial_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/examplehandler_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/hybi.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/hybi_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/server.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/websocket.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/websocket_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/xsrftoken/xsrf.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/net/xsrftoken/xsrf_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/.gitattributes create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/.gitignore create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/AUTHORS create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/CONTRIBUTING.md create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/CONTRIBUTORS create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/LICENSE create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/PATENTS create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/README.md create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/codereview.cfg create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/asm.s create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/asm_plan9_386.s create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/asm_plan9_amd64.s create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/const_plan9.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/dir_plan9.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/env_plan9.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/env_unset.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/errors_plan9.go create mode 100755 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/mkall.sh create mode 100755 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/mkerrors.sh create mode 100755 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/mksyscall.pl create mode 100755 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/mksysnum_plan9.sh create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/pwd_go15_plan9.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/pwd_plan9.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/race.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/race0.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/str.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/syscall.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/syscall_plan9.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/syscall_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/zsyscall_plan9_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/zsyscall_plan9_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/zsysnum_plan9.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/.gitignore create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/README.md create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_darwin_386.s create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_darwin_amd64.s create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_darwin_arm.s create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_darwin_arm64.s create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_dragonfly_amd64.s create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_freebsd_386.s create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_freebsd_amd64.s create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_freebsd_arm.s create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_linux_386.s create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_linux_amd64.s create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_linux_arm.s create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_linux_arm64.s create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_linux_mips64x.s create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_linux_mipsx.s create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_linux_s390x.s create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_netbsd_386.s create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_netbsd_amd64.s create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_netbsd_arm.s create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_openbsd_386.s create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_openbsd_amd64.s create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_openbsd_arm.s create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_solaris_amd64.s create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/bluetooth_linux.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/cap_freebsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/constants.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/creds_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_darwin.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_darwin_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_dragonfly.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_dragonfly_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_freebsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_linux.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_linux_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_netbsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_netbsd_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_openbsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_openbsd_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_solaris_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dirent.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/endian_big.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/endian_little.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/env_unix.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/env_unset.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/errors_freebsd_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/errors_freebsd_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/errors_freebsd_arm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/export_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/file_unix.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/flock.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/flock_linux_32bit.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/gccgo.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/gccgo_c.c create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/linux/Dockerfile create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/linux/mkall.go create mode 100755 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/linux/mksysnum.pl create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/linux/types.go create mode 100755 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/mkall.sh create mode 100755 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/mkerrors.sh create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/mkpost.go create mode 100755 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/mksyscall.pl create mode 100755 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/mksyscall_solaris.pl create mode 100755 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/mksysctl_openbsd.pl create mode 100755 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/mksysnum_darwin.pl create mode 100755 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/mksysnum_dragonfly.pl create mode 100755 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/mksysnum_freebsd.pl create mode 100755 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/mksysnum_netbsd.pl create mode 100755 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/mksysnum_openbsd.pl create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/mmap_unix_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/openbsd_pledge.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/openbsd_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/pagesize_unix.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/race.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/race0.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/sockcmsg_linux.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/sockcmsg_unix.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/str.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_bsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_bsd_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_darwin.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_darwin_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_darwin_arm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_dragonfly.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_freebsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_freebsd_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_arm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_netbsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_no_getwd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_openbsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_solaris.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_solaris_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_unix.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_unix_gc.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_unix_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/types_darwin.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/types_dragonfly.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/types_freebsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/types_netbsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/types_openbsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/types_solaris.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_darwin_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_darwin_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_solaris_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_darwin_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/asm_windows_386.s create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/asm_windows_amd64.s create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/dll_windows.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/env_unset.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/env_windows.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/eventlog.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/exec_windows.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/memory_windows.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/mksyscall.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/race.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/race0.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/registry/export_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/registry/key.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/registry/mksyscall.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/registry/registry_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/registry/syscall.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/registry/value.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/registry/zsyscall_windows.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/security_windows.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/service.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/str.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/debug/log.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/debug/service.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/event.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/eventlog/install.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/eventlog/log.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/eventlog/log_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/example/beep.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/example/install.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/example/main.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/example/manage.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/example/service.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/go12.c create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/go12.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/go13.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/mgr/config.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/mgr/mgr.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/mgr/mgr_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/mgr/service.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/security.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/service.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/svc_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/sys_386.s create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/sys_amd64.s create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/syscall.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/syscall_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/syscall_windows.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/syscall_windows_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/types_windows.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/types_windows_386.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/types_windows_amd64.go create mode 100644 api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/zsyscall_windows.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/.travis.yml create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/COPYING create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/README.md create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/chat1/main.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/chat2/main.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/completion/main.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/curl/main.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/modular/main.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/ping/main.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/actions.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/app.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/app_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/args.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/args_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/cmd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/cmd/genvalues/main.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/cmd_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/completions.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/completions_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/doc.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/envar.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/examples_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/flags.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/flags_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/global.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/guesswidth.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/guesswidth_unix.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/model.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/parser.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/parser_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/parsers.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/parsers_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/templates.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/usage.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/usage_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/values.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/values.json create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/values_generated.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/values_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/.editorconfig create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/.github/ISSUE_TEMPLATE.md create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/.gitignore create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/.travis.yml create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/AUTHORS create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/CHANGELOG.md create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/CONTRIBUTING.md create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/LICENSE create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/README.md create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/example_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/fen.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/fsnotify.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/fsnotify_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/inotify.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/inotify_poller.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/inotify_poller_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/inotify_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/integration_darwin_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/integration_test.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/kqueue.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/open_mode_bsd.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/open_mode_darwin.go create mode 100644 api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/windows.go create mode 100644 api/cmd/vistio/main.go create mode 100644 api/config/config.go create mode 100644 api/config/config_test.go create mode 100644 api/config/testdata/good_full.yaml create mode 100644 api/config/testdata/good_simple.yaml create mode 100644 api/model/snapshot.go create mode 100644 api/model/snapshot_test.go create mode 100644 api/model/vizceral.go create mode 100644 api/model/vizceral_test.go create mode 100644 api/retrieval/generator.go create mode 100644 api/retrieval/generator_test.go create mode 100644 api/retrieval/promquery.go create mode 100644 api/retrieval/promquery_test.go create mode 100644 api/retrieval/retriever.go create mode 100644 api/retrieval/retriever_test.go create mode 100644 api/storage/chunk.go create mode 100644 api/storage/chunk_test.go create mode 100644 api/storage/interface.go create mode 100644 api/storage/storage.go create mode 100644 api/storage/storage_test.go create mode 100644 api/storage/storagemock/Storage.go create mode 100644 api/vendor/github.com/alecthomas/template/LICENSE create mode 100644 api/vendor/github.com/alecthomas/template/README.md create mode 100644 api/vendor/github.com/alecthomas/template/doc.go create mode 100644 api/vendor/github.com/alecthomas/template/example_test.go create mode 100644 api/vendor/github.com/alecthomas/template/examplefiles_test.go create mode 100644 api/vendor/github.com/alecthomas/template/examplefunc_test.go create mode 100644 api/vendor/github.com/alecthomas/template/exec.go create mode 100644 api/vendor/github.com/alecthomas/template/exec_test.go create mode 100644 api/vendor/github.com/alecthomas/template/funcs.go create mode 100644 api/vendor/github.com/alecthomas/template/helper.go create mode 100644 api/vendor/github.com/alecthomas/template/multi_test.go create mode 100644 api/vendor/github.com/alecthomas/template/parse/lex.go create mode 100644 api/vendor/github.com/alecthomas/template/parse/lex_test.go create mode 100644 api/vendor/github.com/alecthomas/template/parse/node.go create mode 100644 api/vendor/github.com/alecthomas/template/parse/parse.go create mode 100644 api/vendor/github.com/alecthomas/template/parse/parse_test.go create mode 100644 api/vendor/github.com/alecthomas/template/template.go create mode 100644 api/vendor/github.com/alecthomas/template/testdata/file1.tmpl create mode 100644 api/vendor/github.com/alecthomas/template/testdata/file2.tmpl create mode 100644 api/vendor/github.com/alecthomas/template/testdata/tmpl1.tmpl create mode 100644 api/vendor/github.com/alecthomas/template/testdata/tmpl2.tmpl create mode 100644 api/vendor/github.com/alecthomas/units/COPYING create mode 100644 api/vendor/github.com/alecthomas/units/README.md create mode 100644 api/vendor/github.com/alecthomas/units/bytes.go create mode 100644 api/vendor/github.com/alecthomas/units/bytes_test.go create mode 100644 api/vendor/github.com/alecthomas/units/doc.go create mode 100644 api/vendor/github.com/alecthomas/units/si.go create mode 100644 api/vendor/github.com/alecthomas/units/util.go create mode 100644 api/vendor/github.com/beorn7/perks/.gitignore create mode 100644 api/vendor/github.com/beorn7/perks/LICENSE create mode 100644 api/vendor/github.com/beorn7/perks/README.md create mode 100644 api/vendor/github.com/beorn7/perks/histogram/bench_test.go create mode 100644 api/vendor/github.com/beorn7/perks/histogram/histogram.go create mode 100644 api/vendor/github.com/beorn7/perks/histogram/histogram_test.go create mode 100644 api/vendor/github.com/beorn7/perks/quantile/bench_test.go create mode 100644 api/vendor/github.com/beorn7/perks/quantile/example_test.go create mode 100644 api/vendor/github.com/beorn7/perks/quantile/exampledata.txt create mode 100644 api/vendor/github.com/beorn7/perks/quantile/stream.go create mode 100644 api/vendor/github.com/beorn7/perks/quantile/stream_test.go create mode 100644 api/vendor/github.com/beorn7/perks/topk/topk.go create mode 100644 api/vendor/github.com/beorn7/perks/topk/topk_test.go create mode 100644 api/vendor/github.com/cenkalti/backoff/.gitignore create mode 100644 api/vendor/github.com/cenkalti/backoff/.travis.yml create mode 100644 api/vendor/github.com/cenkalti/backoff/LICENSE create mode 100644 api/vendor/github.com/cenkalti/backoff/README.md create mode 100644 api/vendor/github.com/cenkalti/backoff/backoff.go create mode 100644 api/vendor/github.com/cenkalti/backoff/backoff_test.go create mode 100644 api/vendor/github.com/cenkalti/backoff/context.go create mode 100644 api/vendor/github.com/cenkalti/backoff/context_test.go create mode 100644 api/vendor/github.com/cenkalti/backoff/example_test.go create mode 100644 api/vendor/github.com/cenkalti/backoff/exponential.go create mode 100644 api/vendor/github.com/cenkalti/backoff/exponential_test.go create mode 100644 api/vendor/github.com/cenkalti/backoff/retry.go create mode 100644 api/vendor/github.com/cenkalti/backoff/retry_test.go create mode 100644 api/vendor/github.com/cenkalti/backoff/ticker.go create mode 100644 api/vendor/github.com/cenkalti/backoff/ticker_test.go create mode 100644 api/vendor/github.com/cenkalti/backoff/tries.go create mode 100644 api/vendor/github.com/cenkalti/backoff/tries_test.go create mode 100644 api/vendor/github.com/davecgh/go-spew/.gitignore create mode 100644 api/vendor/github.com/davecgh/go-spew/.travis.yml create mode 100644 api/vendor/github.com/davecgh/go-spew/LICENSE create mode 100644 api/vendor/github.com/davecgh/go-spew/README.md create mode 100644 api/vendor/github.com/davecgh/go-spew/cov_report.sh create mode 100644 api/vendor/github.com/davecgh/go-spew/spew/bypass.go create mode 100644 api/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go create mode 100644 api/vendor/github.com/davecgh/go-spew/spew/common.go create mode 100644 api/vendor/github.com/davecgh/go-spew/spew/common_test.go create mode 100644 api/vendor/github.com/davecgh/go-spew/spew/config.go create mode 100644 api/vendor/github.com/davecgh/go-spew/spew/doc.go create mode 100644 api/vendor/github.com/davecgh/go-spew/spew/dump.go create mode 100644 api/vendor/github.com/davecgh/go-spew/spew/dump_test.go create mode 100644 api/vendor/github.com/davecgh/go-spew/spew/dumpcgo_test.go create mode 100644 api/vendor/github.com/davecgh/go-spew/spew/dumpnocgo_test.go create mode 100644 api/vendor/github.com/davecgh/go-spew/spew/example_test.go create mode 100644 api/vendor/github.com/davecgh/go-spew/spew/format.go create mode 100644 api/vendor/github.com/davecgh/go-spew/spew/format_test.go create mode 100644 api/vendor/github.com/davecgh/go-spew/spew/internal_test.go create mode 100644 api/vendor/github.com/davecgh/go-spew/spew/internalunsafe_test.go create mode 100644 api/vendor/github.com/davecgh/go-spew/spew/spew.go create mode 100644 api/vendor/github.com/davecgh/go-spew/spew/spew_test.go create mode 100644 api/vendor/github.com/davecgh/go-spew/spew/testdata/dumpcgo.go create mode 100644 api/vendor/github.com/davecgh/go-spew/test_coverage.txt create mode 100644 api/vendor/github.com/golang/protobuf/.gitignore create mode 100644 api/vendor/github.com/golang/protobuf/.travis.yml create mode 100644 api/vendor/github.com/golang/protobuf/AUTHORS create mode 100644 api/vendor/github.com/golang/protobuf/CONTRIBUTORS create mode 100644 api/vendor/github.com/golang/protobuf/LICENSE create mode 100644 api/vendor/github.com/golang/protobuf/Makefile create mode 100644 api/vendor/github.com/golang/protobuf/README.md create mode 100644 api/vendor/github.com/golang/protobuf/conformance/Makefile create mode 100644 api/vendor/github.com/golang/protobuf/conformance/conformance.go create mode 100755 api/vendor/github.com/golang/protobuf/conformance/conformance.sh create mode 100644 api/vendor/github.com/golang/protobuf/conformance/failure_list_go.txt create mode 100644 api/vendor/github.com/golang/protobuf/conformance/internal/conformance_proto/conformance.pb.go create mode 100644 api/vendor/github.com/golang/protobuf/conformance/internal/conformance_proto/conformance.proto create mode 100755 api/vendor/github.com/golang/protobuf/conformance/test.sh create mode 100644 api/vendor/github.com/golang/protobuf/descriptor/descriptor.go create mode 100644 api/vendor/github.com/golang/protobuf/descriptor/descriptor_test.go create mode 100644 api/vendor/github.com/golang/protobuf/jsonpb/jsonpb.go create mode 100644 api/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test.go create mode 100644 api/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/more_test_objects.pb.go create mode 100644 api/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/more_test_objects.proto create mode 100644 api/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/test_objects.pb.go create mode 100644 api/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/test_objects.proto create mode 100644 api/vendor/github.com/golang/protobuf/proto/all_test.go create mode 100644 api/vendor/github.com/golang/protobuf/proto/any_test.go create mode 100644 api/vendor/github.com/golang/protobuf/proto/clone.go create mode 100644 api/vendor/github.com/golang/protobuf/proto/clone_test.go create mode 100644 api/vendor/github.com/golang/protobuf/proto/decode.go create mode 100644 api/vendor/github.com/golang/protobuf/proto/decode_test.go create mode 100644 api/vendor/github.com/golang/protobuf/proto/discard.go create mode 100644 api/vendor/github.com/golang/protobuf/proto/discard_test.go create mode 100644 api/vendor/github.com/golang/protobuf/proto/encode.go create mode 100644 api/vendor/github.com/golang/protobuf/proto/encode_test.go create mode 100644 api/vendor/github.com/golang/protobuf/proto/equal.go create mode 100644 api/vendor/github.com/golang/protobuf/proto/equal_test.go create mode 100644 api/vendor/github.com/golang/protobuf/proto/extensions.go create mode 100644 api/vendor/github.com/golang/protobuf/proto/extensions_test.go create mode 100644 api/vendor/github.com/golang/protobuf/proto/lib.go create mode 100644 api/vendor/github.com/golang/protobuf/proto/map_test.go create mode 100644 api/vendor/github.com/golang/protobuf/proto/message_set.go create mode 100644 api/vendor/github.com/golang/protobuf/proto/message_set_test.go create mode 100644 api/vendor/github.com/golang/protobuf/proto/pointer_reflect.go create mode 100644 api/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go create mode 100644 api/vendor/github.com/golang/protobuf/proto/properties.go create mode 100644 api/vendor/github.com/golang/protobuf/proto/proto3_proto/proto3.pb.go create mode 100644 api/vendor/github.com/golang/protobuf/proto/proto3_proto/proto3.proto create mode 100644 api/vendor/github.com/golang/protobuf/proto/proto3_test.go create mode 100644 api/vendor/github.com/golang/protobuf/proto/size2_test.go create mode 100644 api/vendor/github.com/golang/protobuf/proto/size_test.go create mode 100644 api/vendor/github.com/golang/protobuf/proto/table_marshal.go create mode 100644 api/vendor/github.com/golang/protobuf/proto/table_merge.go create mode 100644 api/vendor/github.com/golang/protobuf/proto/table_unmarshal.go create mode 100644 api/vendor/github.com/golang/protobuf/proto/test_proto/test.pb.go create mode 100644 api/vendor/github.com/golang/protobuf/proto/test_proto/test.proto create mode 100644 api/vendor/github.com/golang/protobuf/proto/text.go create mode 100644 api/vendor/github.com/golang/protobuf/proto/text_parser.go create mode 100644 api/vendor/github.com/golang/protobuf/proto/text_parser_test.go create mode 100644 api/vendor/github.com/golang/protobuf/proto/text_test.go create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.pb.go create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.proto create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/doc.go create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/generator/generator.go create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/generator/internal/remap/remap.go create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/generator/internal/remap/remap_test.go create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/generator/name_test.go create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/golden_test.go create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/grpc/grpc.go create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/link_grpc.go create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/main.go create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.pb.go create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.pb.golden create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.proto create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/deprecated/deprecated.pb.go create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/deprecated/deprecated.proto create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_base/extension_base.pb.go create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_base/extension_base.proto create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_extra/extension_extra.pb.go create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_extra/extension_extra.proto create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_test.go create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_user/extension_user.pb.go create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_user/extension_user.proto create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/grpc/grpc.pb.go create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/grpc/grpc.proto create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/import_public/a.pb.go create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/import_public/a.proto create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/import_public/b.pb.go create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/import_public/b.proto create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/import_public/sub/a.pb.go create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/import_public/sub/a.proto create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/import_public/sub/b.pb.go create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/import_public/sub/b.proto create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/import_public_test.go create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/fmt/m.pb.go create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/fmt/m.proto create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_1/m1.pb.go create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_1/m1.proto create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_1/m2.pb.go create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_1/m2.proto create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_2/m3.pb.go create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_2/m3.proto create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_2/m4.pb.go create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_2/m4.proto create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_b_1/m1.pb.go create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_b_1/m1.proto create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_b_1/m2.pb.go create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_b_1/m2.proto create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_import_a1m1.pb.go create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_import_a1m1.proto create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_import_a1m2.pb.go create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_import_a1m2.proto create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_import_all.pb.go create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_import_all.proto create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/main_test.go create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi1.pb.go create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi1.proto create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi2.pb.go create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi2.proto create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi3.pb.go create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi3.proto create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/my_test/test.pb.go create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/my_test/test.proto create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/proto3/proto3.pb.go create mode 100644 api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/proto3/proto3.proto create mode 100644 api/vendor/github.com/golang/protobuf/ptypes/any.go create mode 100644 api/vendor/github.com/golang/protobuf/ptypes/any/any.pb.go create mode 100644 api/vendor/github.com/golang/protobuf/ptypes/any/any.proto create mode 100644 api/vendor/github.com/golang/protobuf/ptypes/any_test.go create mode 100644 api/vendor/github.com/golang/protobuf/ptypes/doc.go create mode 100644 api/vendor/github.com/golang/protobuf/ptypes/duration.go create mode 100644 api/vendor/github.com/golang/protobuf/ptypes/duration/duration.pb.go create mode 100644 api/vendor/github.com/golang/protobuf/ptypes/duration/duration.proto create mode 100644 api/vendor/github.com/golang/protobuf/ptypes/duration_test.go create mode 100644 api/vendor/github.com/golang/protobuf/ptypes/empty/empty.pb.go create mode 100644 api/vendor/github.com/golang/protobuf/ptypes/empty/empty.proto create mode 100644 api/vendor/github.com/golang/protobuf/ptypes/struct/struct.pb.go create mode 100644 api/vendor/github.com/golang/protobuf/ptypes/struct/struct.proto create mode 100644 api/vendor/github.com/golang/protobuf/ptypes/timestamp.go create mode 100644 api/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go create mode 100644 api/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.proto create mode 100644 api/vendor/github.com/golang/protobuf/ptypes/timestamp_test.go create mode 100644 api/vendor/github.com/golang/protobuf/ptypes/wrappers/wrappers.pb.go create mode 100644 api/vendor/github.com/golang/protobuf/ptypes/wrappers/wrappers.proto create mode 100755 api/vendor/github.com/golang/protobuf/regenerate.sh create mode 100644 api/vendor/github.com/matttproud/golang_protobuf_extensions/.travis.yml create mode 100644 api/vendor/github.com/matttproud/golang_protobuf_extensions/LICENSE create mode 100644 api/vendor/github.com/matttproud/golang_protobuf_extensions/Makefile.TRAVIS create mode 100644 api/vendor/github.com/matttproud/golang_protobuf_extensions/NOTICE create mode 100644 api/vendor/github.com/matttproud/golang_protobuf_extensions/README.md create mode 100644 api/vendor/github.com/matttproud/golang_protobuf_extensions/ext/moved.go create mode 100644 api/vendor/github.com/matttproud/golang_protobuf_extensions/pbtest/deleted.go create mode 100644 api/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/.gitignore create mode 100644 api/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/Makefile create mode 100644 api/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/all_test.go create mode 100644 api/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode.go create mode 100644 api/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode_test.go create mode 100644 api/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/doc.go create mode 100644 api/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode.go create mode 100644 api/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode_test.go create mode 100644 api/vendor/github.com/matttproud/golang_protobuf_extensions/testdata/README.THIRD_PARTY create mode 100644 api/vendor/github.com/matttproud/golang_protobuf_extensions/testdata/test.pb.go create mode 100644 api/vendor/github.com/matttproud/golang_protobuf_extensions/testdata/test.proto create mode 100644 api/vendor/github.com/pmezard/go-difflib/.travis.yml create mode 100644 api/vendor/github.com/pmezard/go-difflib/LICENSE create mode 100644 api/vendor/github.com/pmezard/go-difflib/README.md create mode 100644 api/vendor/github.com/pmezard/go-difflib/difflib/difflib.go create mode 100644 api/vendor/github.com/pmezard/go-difflib/difflib/difflib_test.go create mode 100644 api/vendor/github.com/prometheus/client_golang/.gitignore create mode 100644 api/vendor/github.com/prometheus/client_golang/.travis.yml create mode 100644 api/vendor/github.com/prometheus/client_golang/AUTHORS.md create mode 100644 api/vendor/github.com/prometheus/client_golang/CHANGELOG.md create mode 100644 api/vendor/github.com/prometheus/client_golang/CONTRIBUTING.md create mode 100644 api/vendor/github.com/prometheus/client_golang/LICENSE create mode 100644 api/vendor/github.com/prometheus/client_golang/NOTICE create mode 100644 api/vendor/github.com/prometheus/client_golang/README.md create mode 100644 api/vendor/github.com/prometheus/client_golang/VERSION create mode 100644 api/vendor/github.com/prometheus/client_golang/api/prometheus/api.go create mode 100644 api/vendor/github.com/prometheus/client_golang/api/prometheus/api_test.go create mode 100644 api/vendor/github.com/prometheus/client_golang/examples/random/main.go create mode 100644 api/vendor/github.com/prometheus/client_golang/examples/simple/main.go create mode 100644 api/vendor/github.com/prometheus/client_golang/prometheus/.gitignore create mode 100644 api/vendor/github.com/prometheus/client_golang/prometheus/README.md create mode 100644 api/vendor/github.com/prometheus/client_golang/prometheus/benchmark_test.go create mode 100644 api/vendor/github.com/prometheus/client_golang/prometheus/collector.go create mode 100644 api/vendor/github.com/prometheus/client_golang/prometheus/counter.go create mode 100644 api/vendor/github.com/prometheus/client_golang/prometheus/counter_test.go create mode 100644 api/vendor/github.com/prometheus/client_golang/prometheus/desc.go create mode 100644 api/vendor/github.com/prometheus/client_golang/prometheus/doc.go create mode 100644 api/vendor/github.com/prometheus/client_golang/prometheus/example_clustermanager_test.go create mode 100644 api/vendor/github.com/prometheus/client_golang/prometheus/examples_test.go create mode 100644 api/vendor/github.com/prometheus/client_golang/prometheus/expvar_collector.go create mode 100644 api/vendor/github.com/prometheus/client_golang/prometheus/expvar_collector_test.go create mode 100644 api/vendor/github.com/prometheus/client_golang/prometheus/fnv.go create mode 100644 api/vendor/github.com/prometheus/client_golang/prometheus/gauge.go create mode 100644 api/vendor/github.com/prometheus/client_golang/prometheus/gauge_test.go create mode 100644 api/vendor/github.com/prometheus/client_golang/prometheus/go_collector.go create mode 100644 api/vendor/github.com/prometheus/client_golang/prometheus/go_collector_test.go create mode 100644 api/vendor/github.com/prometheus/client_golang/prometheus/histogram.go create mode 100644 api/vendor/github.com/prometheus/client_golang/prometheus/histogram_test.go create mode 100644 api/vendor/github.com/prometheus/client_golang/prometheus/http.go create mode 100644 api/vendor/github.com/prometheus/client_golang/prometheus/http_test.go create mode 100644 api/vendor/github.com/prometheus/client_golang/prometheus/metric.go create mode 100644 api/vendor/github.com/prometheus/client_golang/prometheus/metric_test.go create mode 100644 api/vendor/github.com/prometheus/client_golang/prometheus/process_collector.go create mode 100644 api/vendor/github.com/prometheus/client_golang/prometheus/process_collector_test.go create mode 100644 api/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go create mode 100644 api/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http_test.go create mode 100644 api/vendor/github.com/prometheus/client_golang/prometheus/push/examples_test.go create mode 100644 api/vendor/github.com/prometheus/client_golang/prometheus/push/push.go create mode 100644 api/vendor/github.com/prometheus/client_golang/prometheus/push/push_test.go create mode 100644 api/vendor/github.com/prometheus/client_golang/prometheus/registry.go create mode 100644 api/vendor/github.com/prometheus/client_golang/prometheus/registry_test.go create mode 100644 api/vendor/github.com/prometheus/client_golang/prometheus/summary.go create mode 100644 api/vendor/github.com/prometheus/client_golang/prometheus/summary_test.go create mode 100644 api/vendor/github.com/prometheus/client_golang/prometheus/untyped.go create mode 100644 api/vendor/github.com/prometheus/client_golang/prometheus/value.go create mode 100644 api/vendor/github.com/prometheus/client_golang/prometheus/vec.go create mode 100644 api/vendor/github.com/prometheus/client_golang/prometheus/vec_test.go create mode 100644 api/vendor/github.com/prometheus/client_model/.gitignore create mode 100644 api/vendor/github.com/prometheus/client_model/CONTRIBUTING.md create mode 100644 api/vendor/github.com/prometheus/client_model/LICENSE create mode 100644 api/vendor/github.com/prometheus/client_model/MAINTAINERS.md create mode 100644 api/vendor/github.com/prometheus/client_model/Makefile create mode 100644 api/vendor/github.com/prometheus/client_model/NOTICE create mode 100644 api/vendor/github.com/prometheus/client_model/README.md create mode 100644 api/vendor/github.com/prometheus/client_model/cpp/metrics.pb.cc create mode 100644 api/vendor/github.com/prometheus/client_model/cpp/metrics.pb.h create mode 100644 api/vendor/github.com/prometheus/client_model/go/metrics.pb.go create mode 100644 api/vendor/github.com/prometheus/client_model/metrics.proto create mode 100644 api/vendor/github.com/prometheus/client_model/pom.xml create mode 100644 api/vendor/github.com/prometheus/client_model/python/prometheus/__init__.py create mode 100644 api/vendor/github.com/prometheus/client_model/python/prometheus/client/__init__.py create mode 100644 api/vendor/github.com/prometheus/client_model/python/prometheus/client/model/__init__.py create mode 100644 api/vendor/github.com/prometheus/client_model/python/prometheus/client/model/metrics_pb2.py create mode 100644 api/vendor/github.com/prometheus/client_model/ruby/.gitignore create mode 100644 api/vendor/github.com/prometheus/client_model/ruby/Gemfile create mode 100644 api/vendor/github.com/prometheus/client_model/ruby/LICENSE create mode 100644 api/vendor/github.com/prometheus/client_model/ruby/Makefile create mode 100644 api/vendor/github.com/prometheus/client_model/ruby/README.md create mode 100644 api/vendor/github.com/prometheus/client_model/ruby/Rakefile create mode 100644 api/vendor/github.com/prometheus/client_model/ruby/lib/prometheus/client/model.rb create mode 100644 api/vendor/github.com/prometheus/client_model/ruby/lib/prometheus/client/model/metrics.pb.rb create mode 100644 api/vendor/github.com/prometheus/client_model/ruby/lib/prometheus/client/model/version.rb create mode 100644 api/vendor/github.com/prometheus/client_model/ruby/prometheus-client-model.gemspec create mode 100644 api/vendor/github.com/prometheus/client_model/setup.py create mode 100644 api/vendor/github.com/prometheus/client_model/src/main/java/io/prometheus/client/Metrics.java create mode 100644 api/vendor/github.com/prometheus/common/.travis.yml create mode 100644 api/vendor/github.com/prometheus/common/CONTRIBUTING.md create mode 100644 api/vendor/github.com/prometheus/common/LICENSE create mode 100644 api/vendor/github.com/prometheus/common/MAINTAINERS.md create mode 100644 api/vendor/github.com/prometheus/common/NOTICE create mode 100644 api/vendor/github.com/prometheus/common/README.md create mode 100644 api/vendor/github.com/prometheus/common/config/config.go create mode 100644 api/vendor/github.com/prometheus/common/config/http_config.go create mode 100644 api/vendor/github.com/prometheus/common/config/http_config_test.go create mode 100644 api/vendor/github.com/prometheus/common/config/testdata/barney-no-pass.key create mode 100644 api/vendor/github.com/prometheus/common/config/testdata/barney.crt create mode 100644 api/vendor/github.com/prometheus/common/config/testdata/basic-auth-password create mode 100644 api/vendor/github.com/prometheus/common/config/testdata/bearer.token create mode 100644 api/vendor/github.com/prometheus/common/config/testdata/http.conf.basic-auth.good.yaml create mode 100644 api/vendor/github.com/prometheus/common/config/testdata/http.conf.basic-auth.no-password.yaml create mode 100644 api/vendor/github.com/prometheus/common/config/testdata/http.conf.basic-auth.no-username.yaml create mode 100644 api/vendor/github.com/prometheus/common/config/testdata/http.conf.basic-auth.too-much.bad.yaml create mode 100644 api/vendor/github.com/prometheus/common/config/testdata/http.conf.bearer-token-and-file-set.bad.yml create mode 100644 api/vendor/github.com/prometheus/common/config/testdata/http.conf.empty.bad.yml create mode 100644 api/vendor/github.com/prometheus/common/config/testdata/http.conf.good.yml create mode 100644 api/vendor/github.com/prometheus/common/config/testdata/http.conf.invalid-bearer-token-file.bad.yml create mode 100644 api/vendor/github.com/prometheus/common/config/testdata/server.crt create mode 100644 api/vendor/github.com/prometheus/common/config/testdata/server.key create mode 100644 api/vendor/github.com/prometheus/common/config/testdata/tls-ca-chain.pem create mode 100644 api/vendor/github.com/prometheus/common/config/testdata/tls_config.cert_no_key.bad.yml create mode 100644 api/vendor/github.com/prometheus/common/config/testdata/tls_config.empty.good.yml create mode 100644 api/vendor/github.com/prometheus/common/config/testdata/tls_config.insecure.good.yml create mode 100644 api/vendor/github.com/prometheus/common/config/testdata/tls_config.invalid_field.bad.yml create mode 100644 api/vendor/github.com/prometheus/common/config/testdata/tls_config.key_no_cert.bad.yml create mode 100644 api/vendor/github.com/prometheus/common/config/tls_config_test.go create mode 100644 api/vendor/github.com/prometheus/common/expfmt/bench_test.go create mode 100644 api/vendor/github.com/prometheus/common/expfmt/decode.go create mode 100644 api/vendor/github.com/prometheus/common/expfmt/decode_test.go create mode 100644 api/vendor/github.com/prometheus/common/expfmt/encode.go create mode 100644 api/vendor/github.com/prometheus/common/expfmt/expfmt.go create mode 100644 api/vendor/github.com/prometheus/common/expfmt/fuzz.go create mode 100644 api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_0 create mode 100644 api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_1 create mode 100644 api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_2 create mode 100644 api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_3 create mode 100644 api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_4 create mode 100644 api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_0 create mode 100644 api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_1 create mode 100644 api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_10 create mode 100644 api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_11 create mode 100644 api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_12 create mode 100644 api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_13 create mode 100644 api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_14 create mode 100644 api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_15 create mode 100644 api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_16 create mode 100644 api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_17 create mode 100644 api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_18 create mode 100644 api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_19 create mode 100644 api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_2 create mode 100644 api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_3 create mode 100644 api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_4 create mode 100644 api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_5 create mode 100644 api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_6 create mode 100644 api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_7 create mode 100644 api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_8 create mode 100644 api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_9 create mode 100644 api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/minimal create mode 100644 api/vendor/github.com/prometheus/common/expfmt/testdata/json2 create mode 100644 api/vendor/github.com/prometheus/common/expfmt/testdata/json2_bad create mode 100644 api/vendor/github.com/prometheus/common/expfmt/testdata/protobuf create mode 100644 api/vendor/github.com/prometheus/common/expfmt/testdata/protobuf.gz create mode 100644 api/vendor/github.com/prometheus/common/expfmt/testdata/text create mode 100644 api/vendor/github.com/prometheus/common/expfmt/testdata/text.gz create mode 100644 api/vendor/github.com/prometheus/common/expfmt/text_create.go create mode 100644 api/vendor/github.com/prometheus/common/expfmt/text_create_test.go create mode 100644 api/vendor/github.com/prometheus/common/expfmt/text_parse.go create mode 100644 api/vendor/github.com/prometheus/common/expfmt/text_parse_test.go create mode 100644 api/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/README.txt create mode 100644 api/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg.go create mode 100644 api/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg_test.go create mode 100644 api/vendor/github.com/prometheus/common/log/eventlog_formatter.go create mode 100644 api/vendor/github.com/prometheus/common/log/log.go create mode 100644 api/vendor/github.com/prometheus/common/log/log_test.go create mode 100644 api/vendor/github.com/prometheus/common/log/syslog_formatter.go create mode 100644 api/vendor/github.com/prometheus/common/log/syslog_formatter_test.go create mode 100644 api/vendor/github.com/prometheus/common/model/alert.go create mode 100644 api/vendor/github.com/prometheus/common/model/alert_test.go create mode 100644 api/vendor/github.com/prometheus/common/model/fingerprinting.go create mode 100644 api/vendor/github.com/prometheus/common/model/fnv.go create mode 100644 api/vendor/github.com/prometheus/common/model/labels.go create mode 100644 api/vendor/github.com/prometheus/common/model/labels_test.go create mode 100644 api/vendor/github.com/prometheus/common/model/labelset.go create mode 100644 api/vendor/github.com/prometheus/common/model/metric.go create mode 100644 api/vendor/github.com/prometheus/common/model/metric_test.go create mode 100644 api/vendor/github.com/prometheus/common/model/model.go create mode 100644 api/vendor/github.com/prometheus/common/model/signature.go create mode 100644 api/vendor/github.com/prometheus/common/model/signature_test.go create mode 100644 api/vendor/github.com/prometheus/common/model/silence.go create mode 100644 api/vendor/github.com/prometheus/common/model/silence_test.go create mode 100644 api/vendor/github.com/prometheus/common/model/time.go create mode 100644 api/vendor/github.com/prometheus/common/model/time_test.go create mode 100644 api/vendor/github.com/prometheus/common/model/value.go create mode 100644 api/vendor/github.com/prometheus/common/model/value_test.go create mode 100644 api/vendor/github.com/prometheus/common/promlog/flag/flag.go create mode 100644 api/vendor/github.com/prometheus/common/promlog/log.go create mode 100644 api/vendor/github.com/prometheus/common/route/route.go create mode 100644 api/vendor/github.com/prometheus/common/route/route_test.go create mode 100644 api/vendor/github.com/prometheus/common/version/info.go create mode 100644 api/vendor/github.com/prometheus/procfs/.gitignore create mode 100644 api/vendor/github.com/prometheus/procfs/.travis.yml create mode 100644 api/vendor/github.com/prometheus/procfs/CONTRIBUTING.md create mode 100644 api/vendor/github.com/prometheus/procfs/LICENSE create mode 100644 api/vendor/github.com/prometheus/procfs/MAINTAINERS.md create mode 100644 api/vendor/github.com/prometheus/procfs/Makefile create mode 100644 api/vendor/github.com/prometheus/procfs/NOTICE create mode 100644 api/vendor/github.com/prometheus/procfs/README.md create mode 100644 api/vendor/github.com/prometheus/procfs/bcache/bcache.go create mode 100644 api/vendor/github.com/prometheus/procfs/bcache/get.go create mode 100644 api/vendor/github.com/prometheus/procfs/bcache/get_test.go create mode 100644 api/vendor/github.com/prometheus/procfs/buddyinfo.go create mode 100644 api/vendor/github.com/prometheus/procfs/buddyinfo_test.go create mode 100644 api/vendor/github.com/prometheus/procfs/doc.go create mode 100644 api/vendor/github.com/prometheus/procfs/fixtures.ttar create mode 100644 api/vendor/github.com/prometheus/procfs/fs.go create mode 100644 api/vendor/github.com/prometheus/procfs/fs_test.go create mode 100644 api/vendor/github.com/prometheus/procfs/internal/util/parse.go create mode 100644 api/vendor/github.com/prometheus/procfs/ipvs.go create mode 100644 api/vendor/github.com/prometheus/procfs/ipvs_test.go create mode 100644 api/vendor/github.com/prometheus/procfs/mdstat.go create mode 100644 api/vendor/github.com/prometheus/procfs/mdstat_test.go create mode 100644 api/vendor/github.com/prometheus/procfs/mountstats.go create mode 100644 api/vendor/github.com/prometheus/procfs/mountstats_test.go create mode 100644 api/vendor/github.com/prometheus/procfs/net_dev.go create mode 100644 api/vendor/github.com/prometheus/procfs/net_dev_test.go create mode 100644 api/vendor/github.com/prometheus/procfs/nfs/nfs.go create mode 100644 api/vendor/github.com/prometheus/procfs/nfs/parse.go create mode 100644 api/vendor/github.com/prometheus/procfs/nfs/parse_nfs.go create mode 100644 api/vendor/github.com/prometheus/procfs/nfs/parse_nfs_test.go create mode 100644 api/vendor/github.com/prometheus/procfs/nfs/parse_nfsd.go create mode 100644 api/vendor/github.com/prometheus/procfs/nfs/parse_nfsd_test.go create mode 100644 api/vendor/github.com/prometheus/procfs/proc.go create mode 100644 api/vendor/github.com/prometheus/procfs/proc_io.go create mode 100644 api/vendor/github.com/prometheus/procfs/proc_io_test.go create mode 100644 api/vendor/github.com/prometheus/procfs/proc_limits.go create mode 100644 api/vendor/github.com/prometheus/procfs/proc_limits_test.go create mode 100644 api/vendor/github.com/prometheus/procfs/proc_ns.go create mode 100644 api/vendor/github.com/prometheus/procfs/proc_ns_test.go create mode 100644 api/vendor/github.com/prometheus/procfs/proc_stat.go create mode 100644 api/vendor/github.com/prometheus/procfs/proc_stat_test.go create mode 100644 api/vendor/github.com/prometheus/procfs/proc_test.go create mode 100755 api/vendor/github.com/prometheus/procfs/scripts/check_license.sh create mode 100644 api/vendor/github.com/prometheus/procfs/stat.go create mode 100644 api/vendor/github.com/prometheus/procfs/stat_test.go create mode 100644 api/vendor/github.com/prometheus/procfs/sysfs/.gitignore create mode 100644 api/vendor/github.com/prometheus/procfs/sysfs/doc.go create mode 100644 api/vendor/github.com/prometheus/procfs/sysfs/fixtures.ttar create mode 100644 api/vendor/github.com/prometheus/procfs/sysfs/fs.go create mode 100644 api/vendor/github.com/prometheus/procfs/sysfs/fs_test.go create mode 100644 api/vendor/github.com/prometheus/procfs/sysfs/net_class.go create mode 100644 api/vendor/github.com/prometheus/procfs/sysfs/net_class_test.go create mode 100755 api/vendor/github.com/prometheus/procfs/ttar create mode 100644 api/vendor/github.com/prometheus/procfs/xfrm.go create mode 100644 api/vendor/github.com/prometheus/procfs/xfrm_test.go create mode 100644 api/vendor/github.com/prometheus/procfs/xfs/parse.go create mode 100644 api/vendor/github.com/prometheus/procfs/xfs/parse_test.go create mode 100644 api/vendor/github.com/prometheus/procfs/xfs/xfs.go create mode 100644 api/vendor/github.com/rs/cors/.travis.yml create mode 100644 api/vendor/github.com/rs/cors/LICENSE create mode 100644 api/vendor/github.com/rs/cors/README.md create mode 100644 api/vendor/github.com/rs/cors/bench_test.go create mode 100644 api/vendor/github.com/rs/cors/cors.go create mode 100644 api/vendor/github.com/rs/cors/cors_test.go create mode 100644 api/vendor/github.com/rs/cors/examples/alice/server.go create mode 100644 api/vendor/github.com/rs/cors/examples/buffalo/server.go create mode 100644 api/vendor/github.com/rs/cors/examples/default/server.go create mode 100644 api/vendor/github.com/rs/cors/examples/gin/server.go create mode 100644 api/vendor/github.com/rs/cors/examples/goji/server.go create mode 100644 api/vendor/github.com/rs/cors/examples/gorilla/server.go create mode 100644 api/vendor/github.com/rs/cors/examples/httprouter/server.go create mode 100644 api/vendor/github.com/rs/cors/examples/martini/server.go create mode 100644 api/vendor/github.com/rs/cors/examples/negroni/server.go create mode 100644 api/vendor/github.com/rs/cors/examples/nethttp/server.go create mode 100644 api/vendor/github.com/rs/cors/examples/openbar/server.go create mode 100644 api/vendor/github.com/rs/cors/go.mod create mode 100644 api/vendor/github.com/rs/cors/utils.go create mode 100644 api/vendor/github.com/rs/cors/utils_test.go create mode 100644 api/vendor/github.com/rs/cors/wrapper/gin/gin.go create mode 100644 api/vendor/github.com/rs/cors/wrapper/gin/gin_test.go create mode 100644 api/vendor/github.com/stretchr/objx/.gitignore create mode 100644 api/vendor/github.com/stretchr/objx/.travis.yml create mode 100644 api/vendor/github.com/stretchr/objx/Gopkg.lock create mode 100644 api/vendor/github.com/stretchr/objx/Gopkg.toml create mode 100644 api/vendor/github.com/stretchr/objx/LICENSE create mode 100644 api/vendor/github.com/stretchr/objx/README.md create mode 100644 api/vendor/github.com/stretchr/objx/Taskfile.yml create mode 100644 api/vendor/github.com/stretchr/objx/accessors.go create mode 100644 api/vendor/github.com/stretchr/objx/accessors_test.go create mode 100644 api/vendor/github.com/stretchr/objx/codegen/array-access.txt create mode 100644 api/vendor/github.com/stretchr/objx/codegen/index.html create mode 100644 api/vendor/github.com/stretchr/objx/codegen/template.txt create mode 100644 api/vendor/github.com/stretchr/objx/codegen/template_test.txt create mode 100644 api/vendor/github.com/stretchr/objx/codegen/types_list.txt create mode 100644 api/vendor/github.com/stretchr/objx/constants.go create mode 100644 api/vendor/github.com/stretchr/objx/conversions.go create mode 100644 api/vendor/github.com/stretchr/objx/conversions_test.go create mode 100644 api/vendor/github.com/stretchr/objx/doc.go create mode 100644 api/vendor/github.com/stretchr/objx/fixture_test.go create mode 100644 api/vendor/github.com/stretchr/objx/map.go create mode 100644 api/vendor/github.com/stretchr/objx/map_for_test.go create mode 100644 api/vendor/github.com/stretchr/objx/map_test.go create mode 100644 api/vendor/github.com/stretchr/objx/mutations.go create mode 100644 api/vendor/github.com/stretchr/objx/mutations_test.go create mode 100644 api/vendor/github.com/stretchr/objx/security.go create mode 100644 api/vendor/github.com/stretchr/objx/security_test.go create mode 100644 api/vendor/github.com/stretchr/objx/simple_example_test.go create mode 100644 api/vendor/github.com/stretchr/objx/tests.go create mode 100644 api/vendor/github.com/stretchr/objx/tests_test.go create mode 100644 api/vendor/github.com/stretchr/objx/type_specific_codegen.go create mode 100644 api/vendor/github.com/stretchr/objx/type_specific_codegen_test.go create mode 100644 api/vendor/github.com/stretchr/objx/value.go create mode 100644 api/vendor/github.com/stretchr/objx/value_test.go create mode 100644 api/vendor/github.com/stretchr/testify/.gitignore create mode 100755 api/vendor/github.com/stretchr/testify/.travis.gofmt.sh create mode 100755 api/vendor/github.com/stretchr/testify/.travis.gogenerate.sh create mode 100755 api/vendor/github.com/stretchr/testify/.travis.govet.sh create mode 100644 api/vendor/github.com/stretchr/testify/.travis.yml create mode 100644 api/vendor/github.com/stretchr/testify/Gopkg.lock create mode 100644 api/vendor/github.com/stretchr/testify/Gopkg.toml create mode 100644 api/vendor/github.com/stretchr/testify/LICENSE create mode 100644 api/vendor/github.com/stretchr/testify/README.md create mode 100644 api/vendor/github.com/stretchr/testify/_codegen/main.go create mode 100644 api/vendor/github.com/stretchr/testify/assert/assertion_format.go create mode 100644 api/vendor/github.com/stretchr/testify/assert/assertion_format.go.tmpl create mode 100644 api/vendor/github.com/stretchr/testify/assert/assertion_forward.go create mode 100644 api/vendor/github.com/stretchr/testify/assert/assertion_forward.go.tmpl create mode 100644 api/vendor/github.com/stretchr/testify/assert/assertions.go create mode 100644 api/vendor/github.com/stretchr/testify/assert/assertions_test.go create mode 100644 api/vendor/github.com/stretchr/testify/assert/doc.go create mode 100644 api/vendor/github.com/stretchr/testify/assert/errors.go create mode 100644 api/vendor/github.com/stretchr/testify/assert/forward_assertions.go create mode 100644 api/vendor/github.com/stretchr/testify/assert/forward_assertions_test.go create mode 100644 api/vendor/github.com/stretchr/testify/assert/http_assertions.go create mode 100644 api/vendor/github.com/stretchr/testify/assert/http_assertions_test.go create mode 100644 api/vendor/github.com/stretchr/testify/doc.go create mode 100644 api/vendor/github.com/stretchr/testify/http/doc.go create mode 100644 api/vendor/github.com/stretchr/testify/http/test_response_writer.go create mode 100644 api/vendor/github.com/stretchr/testify/http/test_round_tripper.go create mode 100644 api/vendor/github.com/stretchr/testify/mock/doc.go create mode 100644 api/vendor/github.com/stretchr/testify/mock/mock.go create mode 100644 api/vendor/github.com/stretchr/testify/mock/mock_test.go create mode 100644 api/vendor/github.com/stretchr/testify/package_test.go create mode 100644 api/vendor/github.com/stretchr/testify/require/doc.go create mode 100644 api/vendor/github.com/stretchr/testify/require/forward_requirements.go create mode 100644 api/vendor/github.com/stretchr/testify/require/forward_requirements_test.go create mode 100644 api/vendor/github.com/stretchr/testify/require/require.go create mode 100644 api/vendor/github.com/stretchr/testify/require/require.go.tmpl create mode 100644 api/vendor/github.com/stretchr/testify/require/require_forward.go create mode 100644 api/vendor/github.com/stretchr/testify/require/require_forward.go.tmpl create mode 100644 api/vendor/github.com/stretchr/testify/require/requirements.go create mode 100644 api/vendor/github.com/stretchr/testify/require/requirements_test.go create mode 100644 api/vendor/github.com/stretchr/testify/suite/doc.go create mode 100644 api/vendor/github.com/stretchr/testify/suite/interfaces.go create mode 100644 api/vendor/github.com/stretchr/testify/suite/suite.go create mode 100644 api/vendor/github.com/stretchr/testify/suite/suite_test.go create mode 100644 api/vendor/go.uber.org/atomic/.codecov.yml create mode 100644 api/vendor/go.uber.org/atomic/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 api/vendor/go.uber.org/atomic/.gitignore create mode 100644 api/vendor/go.uber.org/atomic/.travis.yml create mode 100644 api/vendor/go.uber.org/atomic/LICENSE.txt create mode 100644 api/vendor/go.uber.org/atomic/Makefile create mode 100644 api/vendor/go.uber.org/atomic/README.md create mode 100644 api/vendor/go.uber.org/atomic/atomic.go create mode 100644 api/vendor/go.uber.org/atomic/atomic_test.go create mode 100644 api/vendor/go.uber.org/atomic/example_test.go create mode 100644 api/vendor/go.uber.org/atomic/glide.lock create mode 100644 api/vendor/go.uber.org/atomic/glide.yaml create mode 100755 api/vendor/go.uber.org/atomic/scripts/cover.sh create mode 100755 api/vendor/go.uber.org/atomic/scripts/test-ubergo.sh create mode 100644 api/vendor/go.uber.org/atomic/stress_test.go create mode 100644 api/vendor/go.uber.org/atomic/string.go create mode 100644 api/vendor/go.uber.org/atomic/string_test.go create mode 100644 api/vendor/go.uber.org/multierr/.codecov.yml create mode 100644 api/vendor/go.uber.org/multierr/.gitignore create mode 100644 api/vendor/go.uber.org/multierr/.travis.yml create mode 100644 api/vendor/go.uber.org/multierr/CHANGELOG.md create mode 100644 api/vendor/go.uber.org/multierr/LICENSE.txt create mode 100644 api/vendor/go.uber.org/multierr/Makefile create mode 100644 api/vendor/go.uber.org/multierr/README.md create mode 100644 api/vendor/go.uber.org/multierr/benchmarks_test.go create mode 100644 api/vendor/go.uber.org/multierr/error.go create mode 100644 api/vendor/go.uber.org/multierr/error_test.go create mode 100644 api/vendor/go.uber.org/multierr/example_test.go create mode 100644 api/vendor/go.uber.org/multierr/glide.lock create mode 100644 api/vendor/go.uber.org/multierr/glide.yaml create mode 100755 api/vendor/go.uber.org/multierr/scripts/cover.sh create mode 100644 api/vendor/go.uber.org/zap/.codecov.yml create mode 100644 api/vendor/go.uber.org/zap/.gitignore create mode 100644 api/vendor/go.uber.org/zap/.readme.tmpl create mode 100644 api/vendor/go.uber.org/zap/.travis.yml create mode 100644 api/vendor/go.uber.org/zap/CHANGELOG.md create mode 100644 api/vendor/go.uber.org/zap/CODE_OF_CONDUCT.md create mode 100644 api/vendor/go.uber.org/zap/CONTRIBUTING.md create mode 100644 api/vendor/go.uber.org/zap/FAQ.md create mode 100644 api/vendor/go.uber.org/zap/LICENSE.txt create mode 100644 api/vendor/go.uber.org/zap/Makefile create mode 100644 api/vendor/go.uber.org/zap/README.md create mode 100644 api/vendor/go.uber.org/zap/array.go create mode 100644 api/vendor/go.uber.org/zap/array_test.go create mode 100644 api/vendor/go.uber.org/zap/benchmarks/apex_test.go create mode 100644 api/vendor/go.uber.org/zap/benchmarks/doc.go create mode 100644 api/vendor/go.uber.org/zap/benchmarks/kit_test.go create mode 100644 api/vendor/go.uber.org/zap/benchmarks/lion_test.go create mode 100644 api/vendor/go.uber.org/zap/benchmarks/log15_test.go create mode 100644 api/vendor/go.uber.org/zap/benchmarks/logrus_test.go create mode 100644 api/vendor/go.uber.org/zap/benchmarks/scenario_bench_test.go create mode 100644 api/vendor/go.uber.org/zap/benchmarks/zap_test.go create mode 100644 api/vendor/go.uber.org/zap/benchmarks/zerolog_test.go create mode 100644 api/vendor/go.uber.org/zap/buffer/buffer.go create mode 100644 api/vendor/go.uber.org/zap/buffer/buffer_test.go create mode 100644 api/vendor/go.uber.org/zap/buffer/pool.go create mode 100644 api/vendor/go.uber.org/zap/buffer/pool_test.go create mode 100755 api/vendor/go.uber.org/zap/check_license.sh create mode 100644 api/vendor/go.uber.org/zap/common_test.go create mode 100644 api/vendor/go.uber.org/zap/config.go create mode 100644 api/vendor/go.uber.org/zap/config_test.go create mode 100644 api/vendor/go.uber.org/zap/doc.go create mode 100644 api/vendor/go.uber.org/zap/encoder.go create mode 100644 api/vendor/go.uber.org/zap/encoder_test.go create mode 100644 api/vendor/go.uber.org/zap/error.go create mode 100644 api/vendor/go.uber.org/zap/error_test.go create mode 100644 api/vendor/go.uber.org/zap/example_test.go create mode 100644 api/vendor/go.uber.org/zap/field.go create mode 100644 api/vendor/go.uber.org/zap/field_test.go create mode 100644 api/vendor/go.uber.org/zap/flag.go create mode 100644 api/vendor/go.uber.org/zap/flag_test.go create mode 100644 api/vendor/go.uber.org/zap/glide.lock create mode 100644 api/vendor/go.uber.org/zap/glide.yaml create mode 100644 api/vendor/go.uber.org/zap/global.go create mode 100644 api/vendor/go.uber.org/zap/global_test.go create mode 100644 api/vendor/go.uber.org/zap/http_handler.go create mode 100644 api/vendor/go.uber.org/zap/http_handler_test.go create mode 100644 api/vendor/go.uber.org/zap/internal/bufferpool/bufferpool.go create mode 100644 api/vendor/go.uber.org/zap/internal/color/color.go create mode 100644 api/vendor/go.uber.org/zap/internal/color/color_test.go create mode 100644 api/vendor/go.uber.org/zap/internal/exit/exit.go create mode 100644 api/vendor/go.uber.org/zap/internal/exit/exit_test.go create mode 100644 api/vendor/go.uber.org/zap/internal/readme/readme.go create mode 100644 api/vendor/go.uber.org/zap/internal/ztest/doc.go create mode 100644 api/vendor/go.uber.org/zap/internal/ztest/timeout.go create mode 100644 api/vendor/go.uber.org/zap/internal/ztest/writer.go create mode 100644 api/vendor/go.uber.org/zap/level.go create mode 100644 api/vendor/go.uber.org/zap/level_test.go create mode 100644 api/vendor/go.uber.org/zap/logger.go create mode 100644 api/vendor/go.uber.org/zap/logger_bench_test.go create mode 100644 api/vendor/go.uber.org/zap/logger_test.go create mode 100644 api/vendor/go.uber.org/zap/options.go create mode 100755 api/vendor/go.uber.org/zap/scripts/cover.sh create mode 100644 api/vendor/go.uber.org/zap/stacktrace.go create mode 100644 api/vendor/go.uber.org/zap/stacktrace_ext_test.go create mode 100644 api/vendor/go.uber.org/zap/stacktrace_test.go create mode 100644 api/vendor/go.uber.org/zap/sugar.go create mode 100644 api/vendor/go.uber.org/zap/sugar_test.go create mode 100644 api/vendor/go.uber.org/zap/time.go create mode 100644 api/vendor/go.uber.org/zap/time_test.go create mode 100644 api/vendor/go.uber.org/zap/writer.go create mode 100644 api/vendor/go.uber.org/zap/writer_test.go create mode 100644 api/vendor/go.uber.org/zap/zapcore/console_encoder.go create mode 100644 api/vendor/go.uber.org/zap/zapcore/console_encoder_bench_test.go create mode 100644 api/vendor/go.uber.org/zap/zapcore/core.go create mode 100644 api/vendor/go.uber.org/zap/zapcore/core_test.go create mode 100644 api/vendor/go.uber.org/zap/zapcore/doc.go create mode 100644 api/vendor/go.uber.org/zap/zapcore/encoder.go create mode 100644 api/vendor/go.uber.org/zap/zapcore/encoder_test.go create mode 100644 api/vendor/go.uber.org/zap/zapcore/entry.go create mode 100644 api/vendor/go.uber.org/zap/zapcore/entry_test.go create mode 100644 api/vendor/go.uber.org/zap/zapcore/error.go create mode 100644 api/vendor/go.uber.org/zap/zapcore/error_test.go create mode 100644 api/vendor/go.uber.org/zap/zapcore/field.go create mode 100644 api/vendor/go.uber.org/zap/zapcore/field_test.go create mode 100644 api/vendor/go.uber.org/zap/zapcore/hook.go create mode 100644 api/vendor/go.uber.org/zap/zapcore/hook_test.go create mode 100644 api/vendor/go.uber.org/zap/zapcore/json_encoder.go create mode 100644 api/vendor/go.uber.org/zap/zapcore/json_encoder_bench_test.go create mode 100644 api/vendor/go.uber.org/zap/zapcore/json_encoder_impl_test.go create mode 100644 api/vendor/go.uber.org/zap/zapcore/level.go create mode 100644 api/vendor/go.uber.org/zap/zapcore/level_strings.go create mode 100644 api/vendor/go.uber.org/zap/zapcore/level_strings_test.go create mode 100644 api/vendor/go.uber.org/zap/zapcore/level_test.go create mode 100644 api/vendor/go.uber.org/zap/zapcore/marshaler.go create mode 100644 api/vendor/go.uber.org/zap/zapcore/memory_encoder.go create mode 100644 api/vendor/go.uber.org/zap/zapcore/memory_encoder_test.go create mode 100644 api/vendor/go.uber.org/zap/zapcore/sampler.go create mode 100644 api/vendor/go.uber.org/zap/zapcore/sampler_bench_test.go create mode 100644 api/vendor/go.uber.org/zap/zapcore/sampler_test.go create mode 100644 api/vendor/go.uber.org/zap/zapcore/tee.go create mode 100644 api/vendor/go.uber.org/zap/zapcore/tee_logger_bench_test.go create mode 100644 api/vendor/go.uber.org/zap/zapcore/tee_test.go create mode 100644 api/vendor/go.uber.org/zap/zapcore/write_syncer.go create mode 100644 api/vendor/go.uber.org/zap/zapcore/write_syncer_bench_test.go create mode 100644 api/vendor/go.uber.org/zap/zapcore/write_syncer_test.go create mode 100644 api/vendor/go.uber.org/zap/zapgrpc/zapgrpc.go create mode 100644 api/vendor/go.uber.org/zap/zapgrpc/zapgrpc_test.go create mode 100644 api/vendor/go.uber.org/zap/zaptest/doc.go create mode 100644 api/vendor/go.uber.org/zap/zaptest/logger.go create mode 100644 api/vendor/go.uber.org/zap/zaptest/logger_test.go create mode 100644 api/vendor/go.uber.org/zap/zaptest/observer/logged_entry.go create mode 100644 api/vendor/go.uber.org/zap/zaptest/observer/logged_entry_test.go create mode 100644 api/vendor/go.uber.org/zap/zaptest/observer/observer.go create mode 100644 api/vendor/go.uber.org/zap/zaptest/observer/observer_test.go create mode 100644 api/vendor/go.uber.org/zap/zaptest/testingt.go create mode 100644 api/vendor/go.uber.org/zap/zaptest/testingt_test.go create mode 100644 api/vendor/go.uber.org/zap/zaptest/timeout.go create mode 100644 api/vendor/go.uber.org/zap/zaptest/timeout_test.go create mode 100644 api/vendor/go.uber.org/zap/zaptest/writer.go create mode 100644 api/vendor/go.uber.org/zap/zaptest/writer_test.go create mode 100644 api/vendor/golang.org/x/net/.gitattributes create mode 100644 api/vendor/golang.org/x/net/.gitignore create mode 100644 api/vendor/golang.org/x/net/AUTHORS create mode 100644 api/vendor/golang.org/x/net/CONTRIBUTING.md create mode 100644 api/vendor/golang.org/x/net/CONTRIBUTORS create mode 100644 api/vendor/golang.org/x/net/LICENSE create mode 100644 api/vendor/golang.org/x/net/PATENTS create mode 100644 api/vendor/golang.org/x/net/README.md create mode 100644 api/vendor/golang.org/x/net/bpf/asm.go create mode 100644 api/vendor/golang.org/x/net/bpf/constants.go create mode 100644 api/vendor/golang.org/x/net/bpf/doc.go create mode 100644 api/vendor/golang.org/x/net/bpf/instructions.go create mode 100644 api/vendor/golang.org/x/net/bpf/instructions_test.go create mode 100644 api/vendor/golang.org/x/net/bpf/setter.go create mode 100644 api/vendor/golang.org/x/net/bpf/testdata/all_instructions.bpf create mode 100644 api/vendor/golang.org/x/net/bpf/testdata/all_instructions.txt create mode 100644 api/vendor/golang.org/x/net/bpf/vm.go create mode 100644 api/vendor/golang.org/x/net/bpf/vm_aluop_test.go create mode 100644 api/vendor/golang.org/x/net/bpf/vm_bpf_test.go create mode 100644 api/vendor/golang.org/x/net/bpf/vm_extension_test.go create mode 100644 api/vendor/golang.org/x/net/bpf/vm_instructions.go create mode 100644 api/vendor/golang.org/x/net/bpf/vm_jump_test.go create mode 100644 api/vendor/golang.org/x/net/bpf/vm_load_test.go create mode 100644 api/vendor/golang.org/x/net/bpf/vm_ret_test.go create mode 100644 api/vendor/golang.org/x/net/bpf/vm_scratch_test.go create mode 100644 api/vendor/golang.org/x/net/bpf/vm_test.go create mode 100644 api/vendor/golang.org/x/net/codereview.cfg create mode 100644 api/vendor/golang.org/x/net/context/context.go create mode 100644 api/vendor/golang.org/x/net/context/context_test.go create mode 100644 api/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go create mode 100644 api/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_17_test.go create mode 100644 api/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_pre17.go create mode 100644 api/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_pre17_test.go create mode 100644 api/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_test.go create mode 100644 api/vendor/golang.org/x/net/context/go17.go create mode 100644 api/vendor/golang.org/x/net/context/go19.go create mode 100644 api/vendor/golang.org/x/net/context/pre_go17.go create mode 100644 api/vendor/golang.org/x/net/context/pre_go19.go create mode 100644 api/vendor/golang.org/x/net/context/withtimeout_test.go create mode 100644 api/vendor/golang.org/x/net/dict/dict.go create mode 100644 api/vendor/golang.org/x/net/dns/dnsmessage/example_test.go create mode 100644 api/vendor/golang.org/x/net/dns/dnsmessage/message.go create mode 100644 api/vendor/golang.org/x/net/dns/dnsmessage/message_test.go create mode 100644 api/vendor/golang.org/x/net/html/atom/atom.go create mode 100644 api/vendor/golang.org/x/net/html/atom/atom_test.go create mode 100644 api/vendor/golang.org/x/net/html/atom/gen.go create mode 100644 api/vendor/golang.org/x/net/html/atom/table.go create mode 100644 api/vendor/golang.org/x/net/html/atom/table_test.go create mode 100644 api/vendor/golang.org/x/net/html/charset/charset.go create mode 100644 api/vendor/golang.org/x/net/html/charset/charset_test.go create mode 100644 api/vendor/golang.org/x/net/html/charset/testdata/HTTP-charset.html create mode 100644 api/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-UTF-8-BOM.html create mode 100644 api/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-charset.html create mode 100644 api/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-content.html create mode 100644 api/vendor/golang.org/x/net/html/charset/testdata/No-encoding-declaration.html create mode 100644 api/vendor/golang.org/x/net/html/charset/testdata/README create mode 100644 api/vendor/golang.org/x/net/html/charset/testdata/UTF-16BE-BOM.html create mode 100644 api/vendor/golang.org/x/net/html/charset/testdata/UTF-16LE-BOM.html create mode 100644 api/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-charset.html create mode 100644 api/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-content.html create mode 100644 api/vendor/golang.org/x/net/html/charset/testdata/meta-charset-attribute.html create mode 100644 api/vendor/golang.org/x/net/html/charset/testdata/meta-content-attribute.html create mode 100644 api/vendor/golang.org/x/net/html/const.go create mode 100644 api/vendor/golang.org/x/net/html/doc.go create mode 100644 api/vendor/golang.org/x/net/html/doctype.go create mode 100644 api/vendor/golang.org/x/net/html/entity.go create mode 100644 api/vendor/golang.org/x/net/html/entity_test.go create mode 100644 api/vendor/golang.org/x/net/html/escape.go create mode 100644 api/vendor/golang.org/x/net/html/escape_test.go create mode 100644 api/vendor/golang.org/x/net/html/example_test.go create mode 100644 api/vendor/golang.org/x/net/html/foreign.go create mode 100644 api/vendor/golang.org/x/net/html/node.go create mode 100644 api/vendor/golang.org/x/net/html/node_test.go create mode 100644 api/vendor/golang.org/x/net/html/parse.go create mode 100644 api/vendor/golang.org/x/net/html/parse_test.go create mode 100644 api/vendor/golang.org/x/net/html/render.go create mode 100644 api/vendor/golang.org/x/net/html/render_test.go create mode 100644 api/vendor/golang.org/x/net/html/testdata/go1.html create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/README create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/adoption01.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/adoption02.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/comments01.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/doctype01.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/entities01.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/entities02.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/html5test-com.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/inbody01.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/isindex.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/pending-spec-changes-plain-text-unsafe.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/pending-spec-changes.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/plain-text-unsafe.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/ruby.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/scriptdata01.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/scripted/adoption01.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/scripted/webkit01.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/tables01.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/template.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/tests1.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/tests10.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/tests11.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/tests12.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/tests14.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/tests15.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/tests16.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/tests17.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/tests18.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/tests19.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/tests2.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/tests20.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/tests21.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/tests22.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/tests23.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/tests24.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/tests25.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/tests26.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/tests3.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/tests4.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/tests5.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/tests6.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/tests7.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/tests8.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/tests9.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/tests_innerHTML_1.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/tricky01.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/webkit01.dat create mode 100644 api/vendor/golang.org/x/net/html/testdata/webkit/webkit02.dat create mode 100644 api/vendor/golang.org/x/net/html/token.go create mode 100644 api/vendor/golang.org/x/net/html/token_test.go create mode 100644 api/vendor/golang.org/x/net/http/httpguts/guts.go create mode 100644 api/vendor/golang.org/x/net/http/httpguts/httplex.go create mode 100644 api/vendor/golang.org/x/net/http/httpguts/httplex_test.go create mode 100644 api/vendor/golang.org/x/net/http/httpproxy/export_test.go create mode 100644 api/vendor/golang.org/x/net/http/httpproxy/go19_test.go create mode 100644 api/vendor/golang.org/x/net/http/httpproxy/proxy.go create mode 100644 api/vendor/golang.org/x/net/http/httpproxy/proxy_test.go create mode 100644 api/vendor/golang.org/x/net/http2/.gitignore create mode 100644 api/vendor/golang.org/x/net/http2/Dockerfile create mode 100644 api/vendor/golang.org/x/net/http2/Makefile create mode 100644 api/vendor/golang.org/x/net/http2/README create mode 100644 api/vendor/golang.org/x/net/http2/ciphers.go create mode 100644 api/vendor/golang.org/x/net/http2/ciphers_test.go create mode 100644 api/vendor/golang.org/x/net/http2/client_conn_pool.go create mode 100644 api/vendor/golang.org/x/net/http2/configure_transport.go create mode 100644 api/vendor/golang.org/x/net/http2/databuffer.go create mode 100644 api/vendor/golang.org/x/net/http2/databuffer_test.go create mode 100644 api/vendor/golang.org/x/net/http2/errors.go create mode 100644 api/vendor/golang.org/x/net/http2/errors_test.go create mode 100644 api/vendor/golang.org/x/net/http2/flow.go create mode 100644 api/vendor/golang.org/x/net/http2/flow_test.go create mode 100644 api/vendor/golang.org/x/net/http2/frame.go create mode 100644 api/vendor/golang.org/x/net/http2/frame_test.go create mode 100644 api/vendor/golang.org/x/net/http2/go16.go create mode 100644 api/vendor/golang.org/x/net/http2/go17.go create mode 100644 api/vendor/golang.org/x/net/http2/go17_not18.go create mode 100644 api/vendor/golang.org/x/net/http2/go18.go create mode 100644 api/vendor/golang.org/x/net/http2/go18_test.go create mode 100644 api/vendor/golang.org/x/net/http2/go19.go create mode 100644 api/vendor/golang.org/x/net/http2/go19_test.go create mode 100644 api/vendor/golang.org/x/net/http2/gotrack.go create mode 100644 api/vendor/golang.org/x/net/http2/gotrack_test.go create mode 100644 api/vendor/golang.org/x/net/http2/h2demo/.gitignore create mode 100644 api/vendor/golang.org/x/net/http2/h2demo/Dockerfile create mode 100644 api/vendor/golang.org/x/net/http2/h2demo/Dockerfile.0 create mode 100644 api/vendor/golang.org/x/net/http2/h2demo/Makefile create mode 100644 api/vendor/golang.org/x/net/http2/h2demo/README create mode 100644 api/vendor/golang.org/x/net/http2/h2demo/deployment-prod.yaml create mode 100644 api/vendor/golang.org/x/net/http2/h2demo/h2demo.go create mode 100644 api/vendor/golang.org/x/net/http2/h2demo/launch.go create mode 100644 api/vendor/golang.org/x/net/http2/h2demo/rootCA.key create mode 100644 api/vendor/golang.org/x/net/http2/h2demo/rootCA.pem create mode 100644 api/vendor/golang.org/x/net/http2/h2demo/rootCA.srl create mode 100644 api/vendor/golang.org/x/net/http2/h2demo/server.crt create mode 100644 api/vendor/golang.org/x/net/http2/h2demo/server.key create mode 100644 api/vendor/golang.org/x/net/http2/h2demo/service.yaml create mode 100644 api/vendor/golang.org/x/net/http2/h2demo/tmpl.go create mode 100644 api/vendor/golang.org/x/net/http2/h2i/README.md create mode 100644 api/vendor/golang.org/x/net/http2/h2i/h2i.go create mode 100644 api/vendor/golang.org/x/net/http2/headermap.go create mode 100644 api/vendor/golang.org/x/net/http2/hpack/encode.go create mode 100644 api/vendor/golang.org/x/net/http2/hpack/encode_test.go create mode 100644 api/vendor/golang.org/x/net/http2/hpack/hpack.go create mode 100644 api/vendor/golang.org/x/net/http2/hpack/hpack_test.go create mode 100644 api/vendor/golang.org/x/net/http2/hpack/huffman.go create mode 100644 api/vendor/golang.org/x/net/http2/hpack/tables.go create mode 100644 api/vendor/golang.org/x/net/http2/hpack/tables_test.go create mode 100644 api/vendor/golang.org/x/net/http2/http2.go create mode 100644 api/vendor/golang.org/x/net/http2/http2_test.go create mode 100644 api/vendor/golang.org/x/net/http2/not_go16.go create mode 100644 api/vendor/golang.org/x/net/http2/not_go17.go create mode 100644 api/vendor/golang.org/x/net/http2/not_go18.go create mode 100644 api/vendor/golang.org/x/net/http2/not_go19.go create mode 100644 api/vendor/golang.org/x/net/http2/pipe.go create mode 100644 api/vendor/golang.org/x/net/http2/pipe_test.go create mode 100644 api/vendor/golang.org/x/net/http2/server.go create mode 100644 api/vendor/golang.org/x/net/http2/server_push_test.go create mode 100644 api/vendor/golang.org/x/net/http2/server_test.go create mode 100644 api/vendor/golang.org/x/net/http2/testdata/draft-ietf-httpbis-http2.xml create mode 100644 api/vendor/golang.org/x/net/http2/transport.go create mode 100644 api/vendor/golang.org/x/net/http2/transport_test.go create mode 100644 api/vendor/golang.org/x/net/http2/write.go create mode 100644 api/vendor/golang.org/x/net/http2/writesched.go create mode 100644 api/vendor/golang.org/x/net/http2/writesched_priority.go create mode 100644 api/vendor/golang.org/x/net/http2/writesched_priority_test.go create mode 100644 api/vendor/golang.org/x/net/http2/writesched_random.go create mode 100644 api/vendor/golang.org/x/net/http2/writesched_random_test.go create mode 100644 api/vendor/golang.org/x/net/http2/writesched_test.go create mode 100644 api/vendor/golang.org/x/net/http2/z_spec_test.go create mode 100644 api/vendor/golang.org/x/net/icmp/diag_test.go create mode 100644 api/vendor/golang.org/x/net/icmp/dstunreach.go create mode 100644 api/vendor/golang.org/x/net/icmp/echo.go create mode 100644 api/vendor/golang.org/x/net/icmp/endpoint.go create mode 100644 api/vendor/golang.org/x/net/icmp/example_test.go create mode 100644 api/vendor/golang.org/x/net/icmp/extension.go create mode 100644 api/vendor/golang.org/x/net/icmp/extension_test.go create mode 100644 api/vendor/golang.org/x/net/icmp/helper_posix.go create mode 100644 api/vendor/golang.org/x/net/icmp/interface.go create mode 100644 api/vendor/golang.org/x/net/icmp/ipv4.go create mode 100644 api/vendor/golang.org/x/net/icmp/ipv4_test.go create mode 100644 api/vendor/golang.org/x/net/icmp/ipv6.go create mode 100644 api/vendor/golang.org/x/net/icmp/listen_posix.go create mode 100644 api/vendor/golang.org/x/net/icmp/listen_stub.go create mode 100644 api/vendor/golang.org/x/net/icmp/message.go create mode 100644 api/vendor/golang.org/x/net/icmp/message_test.go create mode 100644 api/vendor/golang.org/x/net/icmp/messagebody.go create mode 100644 api/vendor/golang.org/x/net/icmp/mpls.go create mode 100644 api/vendor/golang.org/x/net/icmp/multipart.go create mode 100644 api/vendor/golang.org/x/net/icmp/multipart_test.go create mode 100644 api/vendor/golang.org/x/net/icmp/packettoobig.go create mode 100644 api/vendor/golang.org/x/net/icmp/paramprob.go create mode 100644 api/vendor/golang.org/x/net/icmp/sys_freebsd.go create mode 100644 api/vendor/golang.org/x/net/icmp/timeexceeded.go create mode 100644 api/vendor/golang.org/x/net/idna/example_test.go create mode 100644 api/vendor/golang.org/x/net/idna/idna.go create mode 100644 api/vendor/golang.org/x/net/idna/idna_test.go create mode 100644 api/vendor/golang.org/x/net/idna/punycode.go create mode 100644 api/vendor/golang.org/x/net/idna/punycode_test.go create mode 100644 api/vendor/golang.org/x/net/idna/tables.go create mode 100644 api/vendor/golang.org/x/net/idna/trie.go create mode 100644 api/vendor/golang.org/x/net/idna/trieval.go create mode 100644 api/vendor/golang.org/x/net/internal/iana/const.go create mode 100644 api/vendor/golang.org/x/net/internal/iana/gen.go create mode 100644 api/vendor/golang.org/x/net/internal/nettest/helper_bsd.go create mode 100644 api/vendor/golang.org/x/net/internal/nettest/helper_nobsd.go create mode 100644 api/vendor/golang.org/x/net/internal/nettest/helper_posix.go create mode 100644 api/vendor/golang.org/x/net/internal/nettest/helper_stub.go create mode 100644 api/vendor/golang.org/x/net/internal/nettest/helper_unix.go create mode 100644 api/vendor/golang.org/x/net/internal/nettest/helper_windows.go create mode 100644 api/vendor/golang.org/x/net/internal/nettest/interface.go create mode 100644 api/vendor/golang.org/x/net/internal/nettest/rlimit.go create mode 100644 api/vendor/golang.org/x/net/internal/nettest/stack.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/cmsghdr.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/cmsghdr_bsd.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_32bit.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_64bit.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/cmsghdr_solaris_64bit.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/cmsghdr_stub.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/defs_darwin.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/defs_dragonfly.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/defs_freebsd.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/defs_linux.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/defs_netbsd.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/defs_openbsd.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/defs_solaris.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/error_unix.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/error_windows.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/iovec_32bit.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/iovec_64bit.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/iovec_solaris_64bit.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/iovec_stub.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/mmsghdr_stub.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/mmsghdr_unix.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/msghdr_bsd.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/msghdr_bsdvar.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/msghdr_linux.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/msghdr_linux_32bit.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/msghdr_linux_64bit.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/msghdr_openbsd.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/msghdr_solaris_64bit.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/msghdr_stub.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/rawconn.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/rawconn_mmsg.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/rawconn_msg.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/rawconn_nommsg.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/rawconn_nomsg.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/rawconn_stub.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/reflect.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/socket.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/socket_go1_9_test.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/socket_test.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/sys.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/sys_bsd.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/sys_bsdvar.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/sys_darwin.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/sys_dragonfly.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/sys_linux.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/sys_linux_386.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/sys_linux_386.s create mode 100644 api/vendor/golang.org/x/net/internal/socket/sys_linux_amd64.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/sys_linux_arm.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/sys_linux_arm64.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/sys_linux_mips.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/sys_linux_mips64.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/sys_linux_mips64le.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/sys_linux_mipsle.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/sys_linux_ppc64.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/sys_linux_ppc64le.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/sys_linux_s390x.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/sys_linux_s390x.s create mode 100644 api/vendor/golang.org/x/net/internal/socket/sys_netbsd.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/sys_posix.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/sys_solaris.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/sys_solaris_amd64.s create mode 100644 api/vendor/golang.org/x/net/internal/socket/sys_stub.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/sys_unix.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/sys_windows.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/zsys_darwin_386.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/zsys_darwin_amd64.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm64.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/zsys_dragonfly_amd64.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/zsys_freebsd_386.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/zsys_freebsd_amd64.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/zsys_linux_386.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/zsys_linux_amd64.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/zsys_linux_arm.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/zsys_linux_arm64.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/zsys_linux_mips.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64le.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/zsys_linux_mipsle.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64le.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/zsys_linux_s390x.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/zsys_netbsd_386.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/zsys_netbsd_amd64.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/zsys_openbsd_386.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/zsys_openbsd_amd64.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm.go create mode 100644 api/vendor/golang.org/x/net/internal/socket/zsys_solaris_amd64.go create mode 100644 api/vendor/golang.org/x/net/internal/socks/client.go create mode 100644 api/vendor/golang.org/x/net/internal/socks/dial_test.go create mode 100644 api/vendor/golang.org/x/net/internal/socks/socks.go create mode 100644 api/vendor/golang.org/x/net/internal/sockstest/server.go create mode 100644 api/vendor/golang.org/x/net/internal/sockstest/server_test.go create mode 100644 api/vendor/golang.org/x/net/internal/timeseries/timeseries.go create mode 100644 api/vendor/golang.org/x/net/internal/timeseries/timeseries_test.go create mode 100644 api/vendor/golang.org/x/net/ipv4/batch.go create mode 100644 api/vendor/golang.org/x/net/ipv4/bpf_test.go create mode 100644 api/vendor/golang.org/x/net/ipv4/control.go create mode 100644 api/vendor/golang.org/x/net/ipv4/control_bsd.go create mode 100644 api/vendor/golang.org/x/net/ipv4/control_pktinfo.go create mode 100644 api/vendor/golang.org/x/net/ipv4/control_stub.go create mode 100644 api/vendor/golang.org/x/net/ipv4/control_test.go create mode 100644 api/vendor/golang.org/x/net/ipv4/control_unix.go create mode 100644 api/vendor/golang.org/x/net/ipv4/control_windows.go create mode 100644 api/vendor/golang.org/x/net/ipv4/defs_darwin.go create mode 100644 api/vendor/golang.org/x/net/ipv4/defs_dragonfly.go create mode 100644 api/vendor/golang.org/x/net/ipv4/defs_freebsd.go create mode 100644 api/vendor/golang.org/x/net/ipv4/defs_linux.go create mode 100644 api/vendor/golang.org/x/net/ipv4/defs_netbsd.go create mode 100644 api/vendor/golang.org/x/net/ipv4/defs_openbsd.go create mode 100644 api/vendor/golang.org/x/net/ipv4/defs_solaris.go create mode 100644 api/vendor/golang.org/x/net/ipv4/dgramopt.go create mode 100644 api/vendor/golang.org/x/net/ipv4/doc.go create mode 100644 api/vendor/golang.org/x/net/ipv4/endpoint.go create mode 100644 api/vendor/golang.org/x/net/ipv4/example_test.go create mode 100644 api/vendor/golang.org/x/net/ipv4/gen.go create mode 100644 api/vendor/golang.org/x/net/ipv4/genericopt.go create mode 100644 api/vendor/golang.org/x/net/ipv4/header.go create mode 100644 api/vendor/golang.org/x/net/ipv4/header_test.go create mode 100644 api/vendor/golang.org/x/net/ipv4/helper.go create mode 100644 api/vendor/golang.org/x/net/ipv4/iana.go create mode 100644 api/vendor/golang.org/x/net/ipv4/icmp.go create mode 100644 api/vendor/golang.org/x/net/ipv4/icmp_linux.go create mode 100644 api/vendor/golang.org/x/net/ipv4/icmp_stub.go create mode 100644 api/vendor/golang.org/x/net/ipv4/icmp_test.go create mode 100644 api/vendor/golang.org/x/net/ipv4/multicast_test.go create mode 100644 api/vendor/golang.org/x/net/ipv4/multicastlistener_test.go create mode 100644 api/vendor/golang.org/x/net/ipv4/multicastsockopt_test.go create mode 100644 api/vendor/golang.org/x/net/ipv4/packet.go create mode 100644 api/vendor/golang.org/x/net/ipv4/packet_go1_8.go create mode 100644 api/vendor/golang.org/x/net/ipv4/packet_go1_9.go create mode 100644 api/vendor/golang.org/x/net/ipv4/payload.go create mode 100644 api/vendor/golang.org/x/net/ipv4/payload_cmsg.go create mode 100644 api/vendor/golang.org/x/net/ipv4/payload_cmsg_go1_8.go create mode 100644 api/vendor/golang.org/x/net/ipv4/payload_cmsg_go1_9.go create mode 100644 api/vendor/golang.org/x/net/ipv4/payload_nocmsg.go create mode 100644 api/vendor/golang.org/x/net/ipv4/readwrite_go1_8_test.go create mode 100644 api/vendor/golang.org/x/net/ipv4/readwrite_go1_9_test.go create mode 100644 api/vendor/golang.org/x/net/ipv4/readwrite_test.go create mode 100644 api/vendor/golang.org/x/net/ipv4/sockopt.go create mode 100644 api/vendor/golang.org/x/net/ipv4/sockopt_posix.go create mode 100644 api/vendor/golang.org/x/net/ipv4/sockopt_stub.go create mode 100644 api/vendor/golang.org/x/net/ipv4/sys_asmreq.go create mode 100644 api/vendor/golang.org/x/net/ipv4/sys_asmreq_stub.go create mode 100644 api/vendor/golang.org/x/net/ipv4/sys_asmreqn.go create mode 100644 api/vendor/golang.org/x/net/ipv4/sys_asmreqn_stub.go create mode 100644 api/vendor/golang.org/x/net/ipv4/sys_bpf.go create mode 100644 api/vendor/golang.org/x/net/ipv4/sys_bpf_stub.go create mode 100644 api/vendor/golang.org/x/net/ipv4/sys_bsd.go create mode 100644 api/vendor/golang.org/x/net/ipv4/sys_darwin.go create mode 100644 api/vendor/golang.org/x/net/ipv4/sys_dragonfly.go create mode 100644 api/vendor/golang.org/x/net/ipv4/sys_freebsd.go create mode 100644 api/vendor/golang.org/x/net/ipv4/sys_linux.go create mode 100644 api/vendor/golang.org/x/net/ipv4/sys_solaris.go create mode 100644 api/vendor/golang.org/x/net/ipv4/sys_ssmreq.go create mode 100644 api/vendor/golang.org/x/net/ipv4/sys_ssmreq_stub.go create mode 100644 api/vendor/golang.org/x/net/ipv4/sys_stub.go create mode 100644 api/vendor/golang.org/x/net/ipv4/sys_windows.go create mode 100644 api/vendor/golang.org/x/net/ipv4/unicast_test.go create mode 100644 api/vendor/golang.org/x/net/ipv4/unicastsockopt_test.go create mode 100644 api/vendor/golang.org/x/net/ipv4/zsys_darwin.go create mode 100644 api/vendor/golang.org/x/net/ipv4/zsys_dragonfly.go create mode 100644 api/vendor/golang.org/x/net/ipv4/zsys_freebsd_386.go create mode 100644 api/vendor/golang.org/x/net/ipv4/zsys_freebsd_amd64.go create mode 100644 api/vendor/golang.org/x/net/ipv4/zsys_freebsd_arm.go create mode 100644 api/vendor/golang.org/x/net/ipv4/zsys_linux_386.go create mode 100644 api/vendor/golang.org/x/net/ipv4/zsys_linux_amd64.go create mode 100644 api/vendor/golang.org/x/net/ipv4/zsys_linux_arm.go create mode 100644 api/vendor/golang.org/x/net/ipv4/zsys_linux_arm64.go create mode 100644 api/vendor/golang.org/x/net/ipv4/zsys_linux_mips.go create mode 100644 api/vendor/golang.org/x/net/ipv4/zsys_linux_mips64.go create mode 100644 api/vendor/golang.org/x/net/ipv4/zsys_linux_mips64le.go create mode 100644 api/vendor/golang.org/x/net/ipv4/zsys_linux_mipsle.go create mode 100644 api/vendor/golang.org/x/net/ipv4/zsys_linux_ppc.go create mode 100644 api/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64.go create mode 100644 api/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64le.go create mode 100644 api/vendor/golang.org/x/net/ipv4/zsys_linux_s390x.go create mode 100644 api/vendor/golang.org/x/net/ipv4/zsys_netbsd.go create mode 100644 api/vendor/golang.org/x/net/ipv4/zsys_openbsd.go create mode 100644 api/vendor/golang.org/x/net/ipv4/zsys_solaris.go create mode 100644 api/vendor/golang.org/x/net/ipv6/batch.go create mode 100644 api/vendor/golang.org/x/net/ipv6/bpf_test.go create mode 100644 api/vendor/golang.org/x/net/ipv6/control.go create mode 100644 api/vendor/golang.org/x/net/ipv6/control_rfc2292_unix.go create mode 100644 api/vendor/golang.org/x/net/ipv6/control_rfc3542_unix.go create mode 100644 api/vendor/golang.org/x/net/ipv6/control_stub.go create mode 100644 api/vendor/golang.org/x/net/ipv6/control_test.go create mode 100644 api/vendor/golang.org/x/net/ipv6/control_unix.go create mode 100644 api/vendor/golang.org/x/net/ipv6/control_windows.go create mode 100644 api/vendor/golang.org/x/net/ipv6/defs_darwin.go create mode 100644 api/vendor/golang.org/x/net/ipv6/defs_dragonfly.go create mode 100644 api/vendor/golang.org/x/net/ipv6/defs_freebsd.go create mode 100644 api/vendor/golang.org/x/net/ipv6/defs_linux.go create mode 100644 api/vendor/golang.org/x/net/ipv6/defs_netbsd.go create mode 100644 api/vendor/golang.org/x/net/ipv6/defs_openbsd.go create mode 100644 api/vendor/golang.org/x/net/ipv6/defs_solaris.go create mode 100644 api/vendor/golang.org/x/net/ipv6/dgramopt.go create mode 100644 api/vendor/golang.org/x/net/ipv6/doc.go create mode 100644 api/vendor/golang.org/x/net/ipv6/endpoint.go create mode 100644 api/vendor/golang.org/x/net/ipv6/example_test.go create mode 100644 api/vendor/golang.org/x/net/ipv6/gen.go create mode 100644 api/vendor/golang.org/x/net/ipv6/genericopt.go create mode 100644 api/vendor/golang.org/x/net/ipv6/header.go create mode 100644 api/vendor/golang.org/x/net/ipv6/header_test.go create mode 100644 api/vendor/golang.org/x/net/ipv6/helper.go create mode 100644 api/vendor/golang.org/x/net/ipv6/iana.go create mode 100644 api/vendor/golang.org/x/net/ipv6/icmp.go create mode 100644 api/vendor/golang.org/x/net/ipv6/icmp_bsd.go create mode 100644 api/vendor/golang.org/x/net/ipv6/icmp_linux.go create mode 100644 api/vendor/golang.org/x/net/ipv6/icmp_solaris.go create mode 100644 api/vendor/golang.org/x/net/ipv6/icmp_stub.go create mode 100644 api/vendor/golang.org/x/net/ipv6/icmp_test.go create mode 100644 api/vendor/golang.org/x/net/ipv6/icmp_windows.go create mode 100644 api/vendor/golang.org/x/net/ipv6/mocktransponder_test.go create mode 100644 api/vendor/golang.org/x/net/ipv6/multicast_test.go create mode 100644 api/vendor/golang.org/x/net/ipv6/multicastlistener_test.go create mode 100644 api/vendor/golang.org/x/net/ipv6/multicastsockopt_test.go create mode 100644 api/vendor/golang.org/x/net/ipv6/payload.go create mode 100644 api/vendor/golang.org/x/net/ipv6/payload_cmsg.go create mode 100644 api/vendor/golang.org/x/net/ipv6/payload_cmsg_go1_8.go create mode 100644 api/vendor/golang.org/x/net/ipv6/payload_cmsg_go1_9.go create mode 100644 api/vendor/golang.org/x/net/ipv6/payload_nocmsg.go create mode 100644 api/vendor/golang.org/x/net/ipv6/readwrite_go1_8_test.go create mode 100644 api/vendor/golang.org/x/net/ipv6/readwrite_go1_9_test.go create mode 100644 api/vendor/golang.org/x/net/ipv6/readwrite_test.go create mode 100644 api/vendor/golang.org/x/net/ipv6/sockopt.go create mode 100644 api/vendor/golang.org/x/net/ipv6/sockopt_posix.go create mode 100644 api/vendor/golang.org/x/net/ipv6/sockopt_stub.go create mode 100644 api/vendor/golang.org/x/net/ipv6/sockopt_test.go create mode 100644 api/vendor/golang.org/x/net/ipv6/sys_asmreq.go create mode 100644 api/vendor/golang.org/x/net/ipv6/sys_asmreq_stub.go create mode 100644 api/vendor/golang.org/x/net/ipv6/sys_bpf.go create mode 100644 api/vendor/golang.org/x/net/ipv6/sys_bpf_stub.go create mode 100644 api/vendor/golang.org/x/net/ipv6/sys_bsd.go create mode 100644 api/vendor/golang.org/x/net/ipv6/sys_darwin.go create mode 100644 api/vendor/golang.org/x/net/ipv6/sys_freebsd.go create mode 100644 api/vendor/golang.org/x/net/ipv6/sys_linux.go create mode 100644 api/vendor/golang.org/x/net/ipv6/sys_solaris.go create mode 100644 api/vendor/golang.org/x/net/ipv6/sys_ssmreq.go create mode 100644 api/vendor/golang.org/x/net/ipv6/sys_ssmreq_stub.go create mode 100644 api/vendor/golang.org/x/net/ipv6/sys_stub.go create mode 100644 api/vendor/golang.org/x/net/ipv6/sys_windows.go create mode 100644 api/vendor/golang.org/x/net/ipv6/unicast_test.go create mode 100644 api/vendor/golang.org/x/net/ipv6/unicastsockopt_test.go create mode 100644 api/vendor/golang.org/x/net/ipv6/zsys_darwin.go create mode 100644 api/vendor/golang.org/x/net/ipv6/zsys_dragonfly.go create mode 100644 api/vendor/golang.org/x/net/ipv6/zsys_freebsd_386.go create mode 100644 api/vendor/golang.org/x/net/ipv6/zsys_freebsd_amd64.go create mode 100644 api/vendor/golang.org/x/net/ipv6/zsys_freebsd_arm.go create mode 100644 api/vendor/golang.org/x/net/ipv6/zsys_linux_386.go create mode 100644 api/vendor/golang.org/x/net/ipv6/zsys_linux_amd64.go create mode 100644 api/vendor/golang.org/x/net/ipv6/zsys_linux_arm.go create mode 100644 api/vendor/golang.org/x/net/ipv6/zsys_linux_arm64.go create mode 100644 api/vendor/golang.org/x/net/ipv6/zsys_linux_mips.go create mode 100644 api/vendor/golang.org/x/net/ipv6/zsys_linux_mips64.go create mode 100644 api/vendor/golang.org/x/net/ipv6/zsys_linux_mips64le.go create mode 100644 api/vendor/golang.org/x/net/ipv6/zsys_linux_mipsle.go create mode 100644 api/vendor/golang.org/x/net/ipv6/zsys_linux_ppc.go create mode 100644 api/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64.go create mode 100644 api/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64le.go create mode 100644 api/vendor/golang.org/x/net/ipv6/zsys_linux_s390x.go create mode 100644 api/vendor/golang.org/x/net/ipv6/zsys_netbsd.go create mode 100644 api/vendor/golang.org/x/net/ipv6/zsys_openbsd.go create mode 100644 api/vendor/golang.org/x/net/ipv6/zsys_solaris.go create mode 100644 api/vendor/golang.org/x/net/lif/address.go create mode 100644 api/vendor/golang.org/x/net/lif/address_test.go create mode 100644 api/vendor/golang.org/x/net/lif/binary.go create mode 100644 api/vendor/golang.org/x/net/lif/defs_solaris.go create mode 100644 api/vendor/golang.org/x/net/lif/lif.go create mode 100644 api/vendor/golang.org/x/net/lif/link.go create mode 100644 api/vendor/golang.org/x/net/lif/link_test.go create mode 100644 api/vendor/golang.org/x/net/lif/sys.go create mode 100644 api/vendor/golang.org/x/net/lif/sys_solaris_amd64.s create mode 100644 api/vendor/golang.org/x/net/lif/syscall.go create mode 100644 api/vendor/golang.org/x/net/lif/zsys_solaris_amd64.go create mode 100644 api/vendor/golang.org/x/net/nettest/conntest.go create mode 100644 api/vendor/golang.org/x/net/nettest/conntest_go16.go create mode 100644 api/vendor/golang.org/x/net/nettest/conntest_go17.go create mode 100644 api/vendor/golang.org/x/net/nettest/conntest_test.go create mode 100644 api/vendor/golang.org/x/net/netutil/listen.go create mode 100644 api/vendor/golang.org/x/net/netutil/listen_test.go create mode 100644 api/vendor/golang.org/x/net/proxy/direct.go create mode 100644 api/vendor/golang.org/x/net/proxy/per_host.go create mode 100644 api/vendor/golang.org/x/net/proxy/per_host_test.go create mode 100644 api/vendor/golang.org/x/net/proxy/proxy.go create mode 100644 api/vendor/golang.org/x/net/proxy/proxy_test.go create mode 100644 api/vendor/golang.org/x/net/proxy/socks5.go create mode 100644 api/vendor/golang.org/x/net/publicsuffix/gen.go create mode 100644 api/vendor/golang.org/x/net/publicsuffix/list.go create mode 100644 api/vendor/golang.org/x/net/publicsuffix/list_test.go create mode 100644 api/vendor/golang.org/x/net/publicsuffix/table.go create mode 100644 api/vendor/golang.org/x/net/publicsuffix/table_test.go create mode 100644 api/vendor/golang.org/x/net/route/address.go create mode 100644 api/vendor/golang.org/x/net/route/address_darwin_test.go create mode 100644 api/vendor/golang.org/x/net/route/address_test.go create mode 100644 api/vendor/golang.org/x/net/route/binary.go create mode 100644 api/vendor/golang.org/x/net/route/defs_darwin.go create mode 100644 api/vendor/golang.org/x/net/route/defs_dragonfly.go create mode 100644 api/vendor/golang.org/x/net/route/defs_freebsd.go create mode 100644 api/vendor/golang.org/x/net/route/defs_netbsd.go create mode 100644 api/vendor/golang.org/x/net/route/defs_openbsd.go create mode 100644 api/vendor/golang.org/x/net/route/interface.go create mode 100644 api/vendor/golang.org/x/net/route/interface_announce.go create mode 100644 api/vendor/golang.org/x/net/route/interface_classic.go create mode 100644 api/vendor/golang.org/x/net/route/interface_freebsd.go create mode 100644 api/vendor/golang.org/x/net/route/interface_multicast.go create mode 100644 api/vendor/golang.org/x/net/route/interface_openbsd.go create mode 100644 api/vendor/golang.org/x/net/route/message.go create mode 100644 api/vendor/golang.org/x/net/route/message_darwin_test.go create mode 100644 api/vendor/golang.org/x/net/route/message_freebsd_test.go create mode 100644 api/vendor/golang.org/x/net/route/message_test.go create mode 100644 api/vendor/golang.org/x/net/route/route.go create mode 100644 api/vendor/golang.org/x/net/route/route_classic.go create mode 100644 api/vendor/golang.org/x/net/route/route_openbsd.go create mode 100644 api/vendor/golang.org/x/net/route/route_test.go create mode 100644 api/vendor/golang.org/x/net/route/sys.go create mode 100644 api/vendor/golang.org/x/net/route/sys_darwin.go create mode 100644 api/vendor/golang.org/x/net/route/sys_dragonfly.go create mode 100644 api/vendor/golang.org/x/net/route/sys_freebsd.go create mode 100644 api/vendor/golang.org/x/net/route/sys_netbsd.go create mode 100644 api/vendor/golang.org/x/net/route/sys_openbsd.go create mode 100644 api/vendor/golang.org/x/net/route/syscall.go create mode 100644 api/vendor/golang.org/x/net/route/zsys_darwin.go create mode 100644 api/vendor/golang.org/x/net/route/zsys_dragonfly.go create mode 100644 api/vendor/golang.org/x/net/route/zsys_freebsd_386.go create mode 100644 api/vendor/golang.org/x/net/route/zsys_freebsd_amd64.go create mode 100644 api/vendor/golang.org/x/net/route/zsys_freebsd_arm.go create mode 100644 api/vendor/golang.org/x/net/route/zsys_netbsd.go create mode 100644 api/vendor/golang.org/x/net/route/zsys_openbsd.go create mode 100644 api/vendor/golang.org/x/net/trace/events.go create mode 100644 api/vendor/golang.org/x/net/trace/histogram.go create mode 100644 api/vendor/golang.org/x/net/trace/histogram_test.go create mode 100644 api/vendor/golang.org/x/net/trace/trace.go create mode 100644 api/vendor/golang.org/x/net/trace/trace_go16.go create mode 100644 api/vendor/golang.org/x/net/trace/trace_go17.go create mode 100644 api/vendor/golang.org/x/net/trace/trace_test.go create mode 100644 api/vendor/golang.org/x/net/webdav/file.go create mode 100644 api/vendor/golang.org/x/net/webdav/file_go1.6.go create mode 100644 api/vendor/golang.org/x/net/webdav/file_go1.7.go create mode 100644 api/vendor/golang.org/x/net/webdav/file_test.go create mode 100644 api/vendor/golang.org/x/net/webdav/if.go create mode 100644 api/vendor/golang.org/x/net/webdav/if_test.go create mode 100644 api/vendor/golang.org/x/net/webdav/internal/xml/README create mode 100644 api/vendor/golang.org/x/net/webdav/internal/xml/atom_test.go create mode 100644 api/vendor/golang.org/x/net/webdav/internal/xml/example_test.go create mode 100644 api/vendor/golang.org/x/net/webdav/internal/xml/marshal.go create mode 100644 api/vendor/golang.org/x/net/webdav/internal/xml/marshal_test.go create mode 100644 api/vendor/golang.org/x/net/webdav/internal/xml/read.go create mode 100644 api/vendor/golang.org/x/net/webdav/internal/xml/read_test.go create mode 100644 api/vendor/golang.org/x/net/webdav/internal/xml/typeinfo.go create mode 100644 api/vendor/golang.org/x/net/webdav/internal/xml/xml.go create mode 100644 api/vendor/golang.org/x/net/webdav/internal/xml/xml_test.go create mode 100644 api/vendor/golang.org/x/net/webdav/litmus_test_server.go create mode 100644 api/vendor/golang.org/x/net/webdav/lock.go create mode 100644 api/vendor/golang.org/x/net/webdav/lock_test.go create mode 100644 api/vendor/golang.org/x/net/webdav/prop.go create mode 100644 api/vendor/golang.org/x/net/webdav/prop_test.go create mode 100644 api/vendor/golang.org/x/net/webdav/webdav.go create mode 100644 api/vendor/golang.org/x/net/webdav/webdav_test.go create mode 100644 api/vendor/golang.org/x/net/webdav/xml.go create mode 100644 api/vendor/golang.org/x/net/webdav/xml_test.go create mode 100644 api/vendor/golang.org/x/net/websocket/client.go create mode 100644 api/vendor/golang.org/x/net/websocket/dial.go create mode 100644 api/vendor/golang.org/x/net/websocket/dial_test.go create mode 100644 api/vendor/golang.org/x/net/websocket/exampledial_test.go create mode 100644 api/vendor/golang.org/x/net/websocket/examplehandler_test.go create mode 100644 api/vendor/golang.org/x/net/websocket/hybi.go create mode 100644 api/vendor/golang.org/x/net/websocket/hybi_test.go create mode 100644 api/vendor/golang.org/x/net/websocket/server.go create mode 100644 api/vendor/golang.org/x/net/websocket/websocket.go create mode 100644 api/vendor/golang.org/x/net/websocket/websocket_test.go create mode 100644 api/vendor/golang.org/x/net/xsrftoken/xsrf.go create mode 100644 api/vendor/golang.org/x/net/xsrftoken/xsrf_test.go create mode 100644 api/vendor/golang.org/x/sync/AUTHORS create mode 100644 api/vendor/golang.org/x/sync/CONTRIBUTING.md create mode 100644 api/vendor/golang.org/x/sync/CONTRIBUTORS create mode 100644 api/vendor/golang.org/x/sync/LICENSE create mode 100644 api/vendor/golang.org/x/sync/PATENTS create mode 100644 api/vendor/golang.org/x/sync/README.md create mode 100644 api/vendor/golang.org/x/sync/codereview.cfg create mode 100644 api/vendor/golang.org/x/sync/errgroup/errgroup.go create mode 100644 api/vendor/golang.org/x/sync/errgroup/errgroup_example_md5all_test.go create mode 100644 api/vendor/golang.org/x/sync/errgroup/errgroup_test.go create mode 100644 api/vendor/golang.org/x/sync/semaphore/semaphore.go create mode 100644 api/vendor/golang.org/x/sync/semaphore/semaphore_bench_test.go create mode 100644 api/vendor/golang.org/x/sync/semaphore/semaphore_example_test.go create mode 100644 api/vendor/golang.org/x/sync/semaphore/semaphore_test.go create mode 100644 api/vendor/golang.org/x/sync/singleflight/singleflight.go create mode 100644 api/vendor/golang.org/x/sync/singleflight/singleflight_test.go create mode 100644 api/vendor/golang.org/x/sync/syncmap/map.go create mode 100644 api/vendor/golang.org/x/sync/syncmap/map_bench_test.go create mode 100644 api/vendor/golang.org/x/sync/syncmap/map_reference_test.go create mode 100644 api/vendor/golang.org/x/sync/syncmap/map_test.go create mode 100644 api/vendor/golang.org/x/sys/.gitattributes create mode 100644 api/vendor/golang.org/x/sys/.gitignore create mode 100644 api/vendor/golang.org/x/sys/AUTHORS create mode 100644 api/vendor/golang.org/x/sys/CONTRIBUTING.md create mode 100644 api/vendor/golang.org/x/sys/CONTRIBUTORS create mode 100644 api/vendor/golang.org/x/sys/LICENSE create mode 100644 api/vendor/golang.org/x/sys/PATENTS create mode 100644 api/vendor/golang.org/x/sys/README.md create mode 100644 api/vendor/golang.org/x/sys/codereview.cfg create mode 100644 api/vendor/golang.org/x/sys/cpu/cpu.go create mode 100644 api/vendor/golang.org/x/sys/cpu/cpu_arm.go create mode 100644 api/vendor/golang.org/x/sys/cpu/cpu_arm64.go create mode 100644 api/vendor/golang.org/x/sys/cpu/cpu_mips64x.go create mode 100644 api/vendor/golang.org/x/sys/cpu/cpu_mipsx.go create mode 100644 api/vendor/golang.org/x/sys/cpu/cpu_ppc64x.go create mode 100644 api/vendor/golang.org/x/sys/cpu/cpu_s390x.go create mode 100644 api/vendor/golang.org/x/sys/cpu/cpu_test.go create mode 100644 api/vendor/golang.org/x/sys/cpu/cpu_x86.go create mode 100644 api/vendor/golang.org/x/sys/cpu/cpu_x86.s create mode 100644 api/vendor/golang.org/x/sys/plan9/asm.s create mode 100644 api/vendor/golang.org/x/sys/plan9/asm_plan9_386.s create mode 100644 api/vendor/golang.org/x/sys/plan9/asm_plan9_amd64.s create mode 100644 api/vendor/golang.org/x/sys/plan9/asm_plan9_arm.s create mode 100644 api/vendor/golang.org/x/sys/plan9/const_plan9.go create mode 100644 api/vendor/golang.org/x/sys/plan9/dir_plan9.go create mode 100644 api/vendor/golang.org/x/sys/plan9/env_plan9.go create mode 100644 api/vendor/golang.org/x/sys/plan9/errors_plan9.go create mode 100755 api/vendor/golang.org/x/sys/plan9/mkall.sh create mode 100755 api/vendor/golang.org/x/sys/plan9/mkerrors.sh create mode 100755 api/vendor/golang.org/x/sys/plan9/mksyscall.pl create mode 100755 api/vendor/golang.org/x/sys/plan9/mksysnum_plan9.sh create mode 100644 api/vendor/golang.org/x/sys/plan9/pwd_go15_plan9.go create mode 100644 api/vendor/golang.org/x/sys/plan9/pwd_plan9.go create mode 100644 api/vendor/golang.org/x/sys/plan9/race.go create mode 100644 api/vendor/golang.org/x/sys/plan9/race0.go create mode 100644 api/vendor/golang.org/x/sys/plan9/str.go create mode 100644 api/vendor/golang.org/x/sys/plan9/syscall.go create mode 100644 api/vendor/golang.org/x/sys/plan9/syscall_plan9.go create mode 100644 api/vendor/golang.org/x/sys/plan9/syscall_test.go create mode 100644 api/vendor/golang.org/x/sys/plan9/zsyscall_plan9_386.go create mode 100644 api/vendor/golang.org/x/sys/plan9/zsyscall_plan9_amd64.go create mode 100644 api/vendor/golang.org/x/sys/plan9/zsyscall_plan9_arm.go create mode 100644 api/vendor/golang.org/x/sys/plan9/zsysnum_plan9.go create mode 100644 api/vendor/golang.org/x/sys/unix/.gitignore create mode 100644 api/vendor/golang.org/x/sys/unix/README.md create mode 100644 api/vendor/golang.org/x/sys/unix/affinity_linux.go create mode 100644 api/vendor/golang.org/x/sys/unix/asm_darwin_386.s create mode 100644 api/vendor/golang.org/x/sys/unix/asm_darwin_amd64.s create mode 100644 api/vendor/golang.org/x/sys/unix/asm_darwin_arm.s create mode 100644 api/vendor/golang.org/x/sys/unix/asm_darwin_arm64.s create mode 100644 api/vendor/golang.org/x/sys/unix/asm_dragonfly_amd64.s create mode 100644 api/vendor/golang.org/x/sys/unix/asm_freebsd_386.s create mode 100644 api/vendor/golang.org/x/sys/unix/asm_freebsd_amd64.s create mode 100644 api/vendor/golang.org/x/sys/unix/asm_freebsd_arm.s create mode 100644 api/vendor/golang.org/x/sys/unix/asm_linux_386.s create mode 100644 api/vendor/golang.org/x/sys/unix/asm_linux_amd64.s create mode 100644 api/vendor/golang.org/x/sys/unix/asm_linux_arm.s create mode 100644 api/vendor/golang.org/x/sys/unix/asm_linux_arm64.s create mode 100644 api/vendor/golang.org/x/sys/unix/asm_linux_mips64x.s create mode 100644 api/vendor/golang.org/x/sys/unix/asm_linux_mipsx.s create mode 100644 api/vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s create mode 100644 api/vendor/golang.org/x/sys/unix/asm_linux_s390x.s create mode 100644 api/vendor/golang.org/x/sys/unix/asm_netbsd_386.s create mode 100644 api/vendor/golang.org/x/sys/unix/asm_netbsd_amd64.s create mode 100644 api/vendor/golang.org/x/sys/unix/asm_netbsd_arm.s create mode 100644 api/vendor/golang.org/x/sys/unix/asm_openbsd_386.s create mode 100644 api/vendor/golang.org/x/sys/unix/asm_openbsd_amd64.s create mode 100644 api/vendor/golang.org/x/sys/unix/asm_openbsd_arm.s create mode 100644 api/vendor/golang.org/x/sys/unix/asm_solaris_amd64.s create mode 100644 api/vendor/golang.org/x/sys/unix/bluetooth_linux.go create mode 100644 api/vendor/golang.org/x/sys/unix/cap_freebsd.go create mode 100644 api/vendor/golang.org/x/sys/unix/constants.go create mode 100644 api/vendor/golang.org/x/sys/unix/creds_test.go create mode 100644 api/vendor/golang.org/x/sys/unix/dev_darwin.go create mode 100644 api/vendor/golang.org/x/sys/unix/dev_dragonfly.go create mode 100644 api/vendor/golang.org/x/sys/unix/dev_freebsd.go create mode 100644 api/vendor/golang.org/x/sys/unix/dev_linux.go create mode 100644 api/vendor/golang.org/x/sys/unix/dev_linux_test.go create mode 100644 api/vendor/golang.org/x/sys/unix/dev_netbsd.go create mode 100644 api/vendor/golang.org/x/sys/unix/dev_openbsd.go create mode 100644 api/vendor/golang.org/x/sys/unix/dirent.go create mode 100644 api/vendor/golang.org/x/sys/unix/endian_big.go create mode 100644 api/vendor/golang.org/x/sys/unix/endian_little.go create mode 100644 api/vendor/golang.org/x/sys/unix/env_unix.go create mode 100644 api/vendor/golang.org/x/sys/unix/errors_freebsd_386.go create mode 100644 api/vendor/golang.org/x/sys/unix/errors_freebsd_amd64.go create mode 100644 api/vendor/golang.org/x/sys/unix/errors_freebsd_arm.go create mode 100644 api/vendor/golang.org/x/sys/unix/example_test.go create mode 100644 api/vendor/golang.org/x/sys/unix/export_test.go create mode 100644 api/vendor/golang.org/x/sys/unix/fcntl.go create mode 100644 api/vendor/golang.org/x/sys/unix/fcntl_linux_32bit.go create mode 100644 api/vendor/golang.org/x/sys/unix/gccgo.go create mode 100644 api/vendor/golang.org/x/sys/unix/gccgo_c.c create mode 100644 api/vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go create mode 100644 api/vendor/golang.org/x/sys/unix/linux/Dockerfile create mode 100644 api/vendor/golang.org/x/sys/unix/linux/mkall.go create mode 100755 api/vendor/golang.org/x/sys/unix/linux/mksysnum.pl create mode 100644 api/vendor/golang.org/x/sys/unix/linux/types.go create mode 100755 api/vendor/golang.org/x/sys/unix/mkall.sh create mode 100755 api/vendor/golang.org/x/sys/unix/mkerrors.sh create mode 100644 api/vendor/golang.org/x/sys/unix/mkpost.go create mode 100755 api/vendor/golang.org/x/sys/unix/mksyscall.pl create mode 100755 api/vendor/golang.org/x/sys/unix/mksyscall_solaris.pl create mode 100755 api/vendor/golang.org/x/sys/unix/mksysctl_openbsd.pl create mode 100755 api/vendor/golang.org/x/sys/unix/mksysnum_darwin.pl create mode 100755 api/vendor/golang.org/x/sys/unix/mksysnum_dragonfly.pl create mode 100755 api/vendor/golang.org/x/sys/unix/mksysnum_freebsd.pl create mode 100755 api/vendor/golang.org/x/sys/unix/mksysnum_netbsd.pl create mode 100755 api/vendor/golang.org/x/sys/unix/mksysnum_openbsd.pl create mode 100644 api/vendor/golang.org/x/sys/unix/mmap_unix_test.go create mode 100644 api/vendor/golang.org/x/sys/unix/openbsd_pledge.go create mode 100644 api/vendor/golang.org/x/sys/unix/openbsd_test.go create mode 100644 api/vendor/golang.org/x/sys/unix/pagesize_unix.go create mode 100644 api/vendor/golang.org/x/sys/unix/race.go create mode 100644 api/vendor/golang.org/x/sys/unix/race0.go create mode 100644 api/vendor/golang.org/x/sys/unix/sockcmsg_linux.go create mode 100644 api/vendor/golang.org/x/sys/unix/sockcmsg_unix.go create mode 100644 api/vendor/golang.org/x/sys/unix/str.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_bsd.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_bsd_test.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_darwin.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_darwin_386.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_darwin_arm.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_darwin_test.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_dragonfly.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_freebsd.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_freebsd_test.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_linux.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_linux_386.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_linux_arm.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_linux_gc.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_linux_gccgo.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_linux_test.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_netbsd.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_openbsd.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_solaris.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_solaris_test.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_test.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_unix.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_unix_gc.go create mode 100644 api/vendor/golang.org/x/sys/unix/syscall_unix_test.go create mode 100644 api/vendor/golang.org/x/sys/unix/timestruct.go create mode 100644 api/vendor/golang.org/x/sys/unix/timestruct_test.go create mode 100644 api/vendor/golang.org/x/sys/unix/types_darwin.go create mode 100644 api/vendor/golang.org/x/sys/unix/types_dragonfly.go create mode 100644 api/vendor/golang.org/x/sys/unix/types_freebsd.go create mode 100644 api/vendor/golang.org/x/sys/unix/types_netbsd.go create mode 100644 api/vendor/golang.org/x/sys/unix/types_openbsd.go create mode 100644 api/vendor/golang.org/x/sys/unix/types_solaris.go create mode 100644 api/vendor/golang.org/x/sys/unix/xattr_test.go create mode 100644 api/vendor/golang.org/x/sys/unix/zerrors_darwin_386.go create mode 100644 api/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go create mode 100644 api/vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go create mode 100644 api/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go create mode 100644 api/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go create mode 100644 api/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go create mode 100644 api/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go create mode 100644 api/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go create mode 100644 api/vendor/golang.org/x/sys/unix/zerrors_linux_386.go create mode 100644 api/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go create mode 100644 api/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go create mode 100644 api/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go create mode 100644 api/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go create mode 100644 api/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go create mode 100644 api/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go create mode 100644 api/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go create mode 100644 api/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go create mode 100644 api/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go create mode 100644 api/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go create mode 100644 api/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go create mode 100644 api/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go create mode 100644 api/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go create mode 100644 api/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go create mode 100644 api/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go create mode 100644 api/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go create mode 100644 api/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go create mode 100644 api/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go create mode 100644 api/vendor/golang.org/x/sys/unix/zptrace386_linux.go create mode 100644 api/vendor/golang.org/x/sys/unix/zptracearm_linux.go create mode 100644 api/vendor/golang.org/x/sys/unix/zptracemips_linux.go create mode 100644 api/vendor/golang.org/x/sys/unix/zptracemipsle_linux.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsysnum_darwin_386.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go create mode 100644 api/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go create mode 100644 api/vendor/golang.org/x/sys/unix/ztypes_darwin_386.go create mode 100644 api/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go create mode 100644 api/vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go create mode 100644 api/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go create mode 100644 api/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go create mode 100644 api/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go create mode 100644 api/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go create mode 100644 api/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go create mode 100644 api/vendor/golang.org/x/sys/unix/ztypes_linux_386.go create mode 100644 api/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go create mode 100644 api/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go create mode 100644 api/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go create mode 100644 api/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go create mode 100644 api/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go create mode 100644 api/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go create mode 100644 api/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go create mode 100644 api/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go create mode 100644 api/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go create mode 100644 api/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go create mode 100644 api/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go create mode 100644 api/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go create mode 100644 api/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go create mode 100644 api/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go create mode 100644 api/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go create mode 100644 api/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go create mode 100644 api/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go create mode 100644 api/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go create mode 100644 api/vendor/golang.org/x/sys/windows/asm_windows_386.s create mode 100644 api/vendor/golang.org/x/sys/windows/asm_windows_amd64.s create mode 100644 api/vendor/golang.org/x/sys/windows/dll_windows.go create mode 100644 api/vendor/golang.org/x/sys/windows/env_windows.go create mode 100644 api/vendor/golang.org/x/sys/windows/eventlog.go create mode 100644 api/vendor/golang.org/x/sys/windows/exec_windows.go create mode 100644 api/vendor/golang.org/x/sys/windows/memory_windows.go create mode 100644 api/vendor/golang.org/x/sys/windows/mksyscall.go create mode 100644 api/vendor/golang.org/x/sys/windows/race.go create mode 100644 api/vendor/golang.org/x/sys/windows/race0.go create mode 100644 api/vendor/golang.org/x/sys/windows/registry/export_test.go create mode 100644 api/vendor/golang.org/x/sys/windows/registry/key.go create mode 100644 api/vendor/golang.org/x/sys/windows/registry/mksyscall.go create mode 100644 api/vendor/golang.org/x/sys/windows/registry/registry_test.go create mode 100644 api/vendor/golang.org/x/sys/windows/registry/syscall.go create mode 100644 api/vendor/golang.org/x/sys/windows/registry/value.go create mode 100644 api/vendor/golang.org/x/sys/windows/registry/zsyscall_windows.go create mode 100644 api/vendor/golang.org/x/sys/windows/security_windows.go create mode 100644 api/vendor/golang.org/x/sys/windows/service.go create mode 100644 api/vendor/golang.org/x/sys/windows/str.go create mode 100644 api/vendor/golang.org/x/sys/windows/svc/debug/log.go create mode 100644 api/vendor/golang.org/x/sys/windows/svc/debug/service.go create mode 100644 api/vendor/golang.org/x/sys/windows/svc/event.go create mode 100644 api/vendor/golang.org/x/sys/windows/svc/eventlog/install.go create mode 100644 api/vendor/golang.org/x/sys/windows/svc/eventlog/log.go create mode 100644 api/vendor/golang.org/x/sys/windows/svc/eventlog/log_test.go create mode 100644 api/vendor/golang.org/x/sys/windows/svc/example/beep.go create mode 100644 api/vendor/golang.org/x/sys/windows/svc/example/install.go create mode 100644 api/vendor/golang.org/x/sys/windows/svc/example/main.go create mode 100644 api/vendor/golang.org/x/sys/windows/svc/example/manage.go create mode 100644 api/vendor/golang.org/x/sys/windows/svc/example/service.go create mode 100644 api/vendor/golang.org/x/sys/windows/svc/go12.c create mode 100644 api/vendor/golang.org/x/sys/windows/svc/go12.go create mode 100644 api/vendor/golang.org/x/sys/windows/svc/go13.go create mode 100644 api/vendor/golang.org/x/sys/windows/svc/mgr/config.go create mode 100644 api/vendor/golang.org/x/sys/windows/svc/mgr/mgr.go create mode 100644 api/vendor/golang.org/x/sys/windows/svc/mgr/mgr_test.go create mode 100644 api/vendor/golang.org/x/sys/windows/svc/mgr/service.go create mode 100644 api/vendor/golang.org/x/sys/windows/svc/security.go create mode 100644 api/vendor/golang.org/x/sys/windows/svc/service.go create mode 100644 api/vendor/golang.org/x/sys/windows/svc/svc_test.go create mode 100644 api/vendor/golang.org/x/sys/windows/svc/sys_386.s create mode 100644 api/vendor/golang.org/x/sys/windows/svc/sys_amd64.s create mode 100644 api/vendor/golang.org/x/sys/windows/syscall.go create mode 100644 api/vendor/golang.org/x/sys/windows/syscall_test.go create mode 100644 api/vendor/golang.org/x/sys/windows/syscall_windows.go create mode 100644 api/vendor/golang.org/x/sys/windows/syscall_windows_test.go create mode 100644 api/vendor/golang.org/x/sys/windows/types_windows.go create mode 100644 api/vendor/golang.org/x/sys/windows/types_windows_386.go create mode 100644 api/vendor/golang.org/x/sys/windows/types_windows_amd64.go create mode 100644 api/vendor/golang.org/x/sys/windows/zsyscall_windows.go create mode 100644 api/vendor/gopkg.in/alecthomas/kingpin.v2/.travis.yml create mode 100644 api/vendor/gopkg.in/alecthomas/kingpin.v2/COPYING create mode 100644 api/vendor/gopkg.in/alecthomas/kingpin.v2/README.md create mode 100644 api/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/chat1/main.go create mode 100644 api/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/chat2/main.go create mode 100644 api/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/completion/main.go create mode 100644 api/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/curl/main.go create mode 100644 api/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/modular/main.go create mode 100644 api/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/ping/main.go create mode 100644 api/vendor/gopkg.in/alecthomas/kingpin.v2/actions.go create mode 100644 api/vendor/gopkg.in/alecthomas/kingpin.v2/app.go create mode 100644 api/vendor/gopkg.in/alecthomas/kingpin.v2/app_test.go create mode 100644 api/vendor/gopkg.in/alecthomas/kingpin.v2/args.go create mode 100644 api/vendor/gopkg.in/alecthomas/kingpin.v2/args_test.go create mode 100644 api/vendor/gopkg.in/alecthomas/kingpin.v2/cmd.go create mode 100644 api/vendor/gopkg.in/alecthomas/kingpin.v2/cmd/genvalues/main.go create mode 100644 api/vendor/gopkg.in/alecthomas/kingpin.v2/cmd_test.go create mode 100644 api/vendor/gopkg.in/alecthomas/kingpin.v2/completions.go create mode 100644 api/vendor/gopkg.in/alecthomas/kingpin.v2/completions_test.go create mode 100644 api/vendor/gopkg.in/alecthomas/kingpin.v2/doc.go create mode 100644 api/vendor/gopkg.in/alecthomas/kingpin.v2/envar.go create mode 100644 api/vendor/gopkg.in/alecthomas/kingpin.v2/examples_test.go create mode 100644 api/vendor/gopkg.in/alecthomas/kingpin.v2/flags.go create mode 100644 api/vendor/gopkg.in/alecthomas/kingpin.v2/flags_test.go create mode 100644 api/vendor/gopkg.in/alecthomas/kingpin.v2/global.go create mode 100644 api/vendor/gopkg.in/alecthomas/kingpin.v2/guesswidth.go create mode 100644 api/vendor/gopkg.in/alecthomas/kingpin.v2/guesswidth_unix.go create mode 100644 api/vendor/gopkg.in/alecthomas/kingpin.v2/model.go create mode 100644 api/vendor/gopkg.in/alecthomas/kingpin.v2/parser.go create mode 100644 api/vendor/gopkg.in/alecthomas/kingpin.v2/parser_test.go create mode 100644 api/vendor/gopkg.in/alecthomas/kingpin.v2/parsers.go create mode 100644 api/vendor/gopkg.in/alecthomas/kingpin.v2/parsers_test.go create mode 100644 api/vendor/gopkg.in/alecthomas/kingpin.v2/templates.go create mode 100644 api/vendor/gopkg.in/alecthomas/kingpin.v2/usage.go create mode 100644 api/vendor/gopkg.in/alecthomas/kingpin.v2/usage_test.go create mode 100644 api/vendor/gopkg.in/alecthomas/kingpin.v2/values.go create mode 100644 api/vendor/gopkg.in/alecthomas/kingpin.v2/values.json create mode 100644 api/vendor/gopkg.in/alecthomas/kingpin.v2/values_generated.go create mode 100644 api/vendor/gopkg.in/alecthomas/kingpin.v2/values_test.go create mode 100644 api/vendor/gopkg.in/fsnotify.v1/.editorconfig create mode 100644 api/vendor/gopkg.in/fsnotify.v1/.github/ISSUE_TEMPLATE.md create mode 100644 api/vendor/gopkg.in/fsnotify.v1/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 api/vendor/gopkg.in/fsnotify.v1/.gitignore create mode 100644 api/vendor/gopkg.in/fsnotify.v1/.travis.yml create mode 100644 api/vendor/gopkg.in/fsnotify.v1/AUTHORS create mode 100644 api/vendor/gopkg.in/fsnotify.v1/CHANGELOG.md create mode 100644 api/vendor/gopkg.in/fsnotify.v1/CONTRIBUTING.md create mode 100644 api/vendor/gopkg.in/fsnotify.v1/LICENSE create mode 100644 api/vendor/gopkg.in/fsnotify.v1/README.md create mode 100644 api/vendor/gopkg.in/fsnotify.v1/example_test.go create mode 100644 api/vendor/gopkg.in/fsnotify.v1/fen.go create mode 100644 api/vendor/gopkg.in/fsnotify.v1/fsnotify.go create mode 100644 api/vendor/gopkg.in/fsnotify.v1/fsnotify_test.go create mode 100644 api/vendor/gopkg.in/fsnotify.v1/inotify.go create mode 100644 api/vendor/gopkg.in/fsnotify.v1/inotify_poller.go create mode 100644 api/vendor/gopkg.in/fsnotify.v1/inotify_poller_test.go create mode 100644 api/vendor/gopkg.in/fsnotify.v1/inotify_test.go create mode 100644 api/vendor/gopkg.in/fsnotify.v1/integration_darwin_test.go create mode 100644 api/vendor/gopkg.in/fsnotify.v1/integration_test.go create mode 100644 api/vendor/gopkg.in/fsnotify.v1/kqueue.go create mode 100644 api/vendor/gopkg.in/fsnotify.v1/open_mode_bsd.go create mode 100644 api/vendor/gopkg.in/fsnotify.v1/open_mode_darwin.go create mode 100644 api/vendor/gopkg.in/fsnotify.v1/windows.go create mode 100644 api/vendor/gopkg.in/yaml.v2/.travis.yml create mode 100644 api/vendor/gopkg.in/yaml.v2/LICENSE create mode 100644 api/vendor/gopkg.in/yaml.v2/LICENSE.libyaml create mode 100644 api/vendor/gopkg.in/yaml.v2/NOTICE create mode 100644 api/vendor/gopkg.in/yaml.v2/README.md create mode 100644 api/vendor/gopkg.in/yaml.v2/apic.go create mode 100644 api/vendor/gopkg.in/yaml.v2/decode.go create mode 100644 api/vendor/gopkg.in/yaml.v2/decode_test.go create mode 100644 api/vendor/gopkg.in/yaml.v2/emitterc.go create mode 100644 api/vendor/gopkg.in/yaml.v2/encode.go create mode 100644 api/vendor/gopkg.in/yaml.v2/encode_test.go create mode 100644 api/vendor/gopkg.in/yaml.v2/example_embedded_test.go create mode 100644 api/vendor/gopkg.in/yaml.v2/go.mod create mode 100644 api/vendor/gopkg.in/yaml.v2/parserc.go create mode 100644 api/vendor/gopkg.in/yaml.v2/readerc.go create mode 100644 api/vendor/gopkg.in/yaml.v2/resolve.go create mode 100644 api/vendor/gopkg.in/yaml.v2/scannerc.go create mode 100644 api/vendor/gopkg.in/yaml.v2/sorter.go create mode 100644 api/vendor/gopkg.in/yaml.v2/suite_test.go create mode 100644 api/vendor/gopkg.in/yaml.v2/writerc.go create mode 100644 api/vendor/gopkg.in/yaml.v2/yaml.go create mode 100644 api/vendor/gopkg.in/yaml.v2/yamlh.go create mode 100644 api/vendor/gopkg.in/yaml.v2/yamlprivateh.go create mode 100644 api/version/version.go create mode 100644 api/version/version_test.go create mode 100644 documentation/architecture.png create mode 100644 documentation/configuration.md create mode 100644 documentation/sample.png create mode 100644 documentation/sample_filter.png create mode 100644 example/README.md create mode 100644 example/docker-compose.yaml create mode 100644 example/prometheus-mock/Dockerfile create mode 100644 example/prometheus-mock/Gopkg.lock create mode 100644 example/prometheus-mock/Gopkg.toml create mode 100755 example/prometheus-mock/debug create mode 100644 example/prometheus-mock/main.go create mode 100755 example/prometheus-mock/prometheus-mock create mode 100644 example/prometheus-mock/vendor/github.com/beorn7/perks/.gitignore create mode 100644 example/prometheus-mock/vendor/github.com/beorn7/perks/LICENSE create mode 100644 example/prometheus-mock/vendor/github.com/beorn7/perks/README.md create mode 100644 example/prometheus-mock/vendor/github.com/beorn7/perks/histogram/bench_test.go create mode 100644 example/prometheus-mock/vendor/github.com/beorn7/perks/histogram/histogram.go create mode 100644 example/prometheus-mock/vendor/github.com/beorn7/perks/histogram/histogram_test.go create mode 100644 example/prometheus-mock/vendor/github.com/beorn7/perks/quantile/bench_test.go create mode 100644 example/prometheus-mock/vendor/github.com/beorn7/perks/quantile/example_test.go create mode 100644 example/prometheus-mock/vendor/github.com/beorn7/perks/quantile/exampledata.txt create mode 100644 example/prometheus-mock/vendor/github.com/beorn7/perks/quantile/stream.go create mode 100644 example/prometheus-mock/vendor/github.com/beorn7/perks/quantile/stream_test.go create mode 100644 example/prometheus-mock/vendor/github.com/beorn7/perks/topk/topk.go create mode 100644 example/prometheus-mock/vendor/github.com/beorn7/perks/topk/topk_test.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/.gitignore create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/.travis.yml create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/AUTHORS create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/CONTRIBUTORS create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/LICENSE create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/Make.protobuf create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/Makefile create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/README.md create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/_conformance/Makefile create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/_conformance/conformance.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/_conformance/conformance_proto/conformance.pb.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/_conformance/conformance_proto/conformance.proto create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/descriptor/descriptor.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/descriptor/descriptor_test.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/jsonpb/jsonpb.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/Makefile create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/more_test_objects.pb.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/more_test_objects.proto create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/test_objects.pb.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/test_objects.proto create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/proto/Makefile create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/proto/all_test.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/proto/any_test.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/proto/clone.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/proto/clone_test.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/proto/decode.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/proto/decode_test.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/proto/encode.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/proto/encode_test.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/proto/equal.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/proto/equal_test.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/proto/extensions.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/proto/extensions_test.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/proto/lib.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/proto/map_test.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/proto/message_set.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/proto/message_set_test.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/proto/pointer_reflect.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/proto/properties.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/proto/proto3_proto/proto3.pb.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/proto/proto3_proto/proto3.proto create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/proto/proto3_test.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/proto/size2_test.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/proto/size_test.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/proto/testdata/Makefile create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/proto/testdata/golden_test.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/proto/testdata/test.pb.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/proto/testdata/test.proto create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/proto/text.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/proto/text_parser.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/proto/text_parser_test.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/proto/text_test.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/Makefile create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/Makefile create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.pb.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.proto create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/doc.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/generator/Makefile create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/generator/generator.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/generator/name_test.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/grpc/grpc.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/link_grpc.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/main.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/plugin/Makefile create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.pb.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.pb.golden create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.proto create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/Makefile create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_base.proto create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_extra.proto create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_test.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_user.proto create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/grpc.proto create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imp.pb.go.golden create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imp.proto create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imp2.proto create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imp3.proto create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/main_test.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi1.proto create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi2.proto create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi3.proto create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/my_test/test.pb.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/my_test/test.pb.go.golden create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/my_test/test.proto create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/proto3.proto create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/any.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/any/any.pb.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/any/any.proto create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/any_test.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/doc.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/duration.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/duration/duration.pb.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/duration/duration.proto create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/duration_test.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/empty/empty.pb.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/empty/empty.proto create mode 100755 example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/regen.sh create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/struct/struct.pb.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/struct/struct.proto create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/timestamp.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.proto create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/timestamp_test.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/wrappers/wrappers.pb.go create mode 100644 example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/wrappers/wrappers.proto create mode 100644 example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/.travis.yml create mode 100644 example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/LICENSE create mode 100644 example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/NOTICE create mode 100644 example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/README.md create mode 100644 example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/ext/moved.go create mode 100644 example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/pbtest/deleted.go create mode 100644 example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/all_test.go create mode 100644 example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode.go create mode 100644 example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode_test.go create mode 100644 example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/doc.go create mode 100644 example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode.go create mode 100644 example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode_test.go create mode 100644 example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/fixtures_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/.gitignore create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/.travis.yml create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/AUTHORS.md create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/CHANGELOG.md create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/CONTRIBUTING.md create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/LICENSE create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/NOTICE create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/README.md create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/VERSION create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/api/prometheus/api.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/api/prometheus/api_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/examples/random/main.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/examples/simple/main.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/.gitignore create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/README.md create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/benchmark_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/collector.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/counter.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/counter_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/desc.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/doc.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/example_clustermanager_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/examples_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/expvar_collector.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/expvar_collector_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/fnv.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/gauge.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/gauge_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/go_collector.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/go_collector_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/histogram.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/histogram_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/http.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/http_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/metric.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/metric_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/process_collector.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/process_collector_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/push/examples_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/push/push.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/push/push_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/registry.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/registry_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/summary.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/summary_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/untyped.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/value.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/vec.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/vec_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_model/.gitignore create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_model/CONTRIBUTING.md create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_model/LICENSE create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_model/MAINTAINERS.md create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_model/Makefile create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_model/NOTICE create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_model/README.md create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_model/cpp/metrics.pb.cc create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_model/cpp/metrics.pb.h create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_model/go/metrics.pb.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_model/metrics.proto create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_model/pom.xml create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_model/python/prometheus/__init__.py create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_model/python/prometheus/client/__init__.py create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_model/python/prometheus/client/model/__init__.py create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_model/python/prometheus/client/model/metrics_pb2.py create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/.gitignore create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/Gemfile create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/LICENSE create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/Makefile create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/README.md create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/Rakefile create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/lib/prometheus/client/model.rb create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/lib/prometheus/client/model/metrics.pb.rb create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/lib/prometheus/client/model/version.rb create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/prometheus-client-model.gemspec create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_model/setup.py create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/client_model/src/main/java/io/prometheus/client/Metrics.java create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/.travis.yml create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/CONTRIBUTING.md create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/LICENSE create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/MAINTAINERS.md create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/NOTICE create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/README.md create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/config/config.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/config/http_config.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/config/http_config_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/config/testdata/http.conf.bearer-token-and-file-set.bad.yml create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/config/testdata/http.conf.empty.bad.yml create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/config/testdata/http.conf.good.yml create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/config/testdata/http.conf.invalid-bearer-token-file.bad.yml create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/config/testdata/tls_config.cert_no_key.bad.yml create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/config/testdata/tls_config.empty.good.yml create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/config/testdata/tls_config.insecure.good.yml create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/config/testdata/tls_config.invalid_field.bad.yml create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/config/testdata/tls_config.key_no_cert.bad.yml create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/config/tls_config_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/bench_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/decode.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/decode_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/encode.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/expfmt.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_0 create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_1 create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_2 create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_3 create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_4 create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_0 create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_1 create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_10 create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_11 create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_12 create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_13 create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_14 create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_15 create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_16 create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_17 create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_18 create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_19 create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_2 create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_3 create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_4 create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_5 create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_6 create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_7 create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_8 create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_9 create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/minimal create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/testdata/json2 create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/testdata/json2_bad create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/testdata/protobuf create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/testdata/protobuf.gz create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/testdata/text create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/testdata/text.gz create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/text_create.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/text_create_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/text_parse.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/text_parse_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/README.txt create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/log/eventlog_formatter.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/log/log.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/log/log_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/log/syslog_formatter.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/log/syslog_formatter_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/model/alert.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/model/alert_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/model/fingerprinting.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/model/fnv.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/model/labels.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/model/labels_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/model/labelset.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/model/metric.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/model/metric_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/model/model.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/model/signature.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/model/signature_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/model/silence.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/model/silence_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/model/time.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/model/time_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/model/value.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/model/value_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/promlog/flag/flag.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/promlog/log.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/route/route.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/route/route_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/common/version/info.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/.travis.yml create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/CONTRIBUTING.md create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/LICENSE create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/MAINTAINERS.md create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/Makefile create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/NOTICE create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/README.md create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/bcache/bcache.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/bcache/get.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/bcache/get_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/buddyinfo.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/buddyinfo_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/doc.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/cmdline create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/comm create mode 120000 example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/exe create mode 120000 example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/fd/0 create mode 120000 example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/fd/1 create mode 120000 example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/fd/10 create mode 120000 example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/fd/2 create mode 120000 example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/fd/3 create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/io create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/limits create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/mountstats create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/stat create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26232/cmdline create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26232/comm create mode 120000 example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26232/fd/0 create mode 120000 example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26232/fd/1 create mode 120000 example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26232/fd/2 create mode 120000 example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26232/fd/3 create mode 120000 example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26232/fd/4 create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26232/limits create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26232/stat create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/584/stat create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/buddyinfo/short/buddyinfo create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/buddyinfo/sizemismatch/buddyinfo create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/buddyinfo/valid/buddyinfo create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/fs/xfs/stat create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/mdstat create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/net/ip_vs create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/net/ip_vs_stats create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/net/xfrm_stat create mode 120000 example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/self create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/stat create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/symlinktargets/README create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/symlinktargets/abc create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/symlinktargets/def create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/symlinktargets/ghi create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/symlinktargets/uvw create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/symlinktargets/xyz create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/fs.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/fs_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/ipvs.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/ipvs_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/mdstat.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/mdstat_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/mountstats.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/mountstats_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/proc.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/proc_io.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/proc_io_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/proc_limits.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/proc_limits_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/proc_stat.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/proc_stat_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/proc_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/stat.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/stat_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/sysfs/.gitignore create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/sysfs/doc.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/sysfs/fixtures.ttar create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/sysfs/fs.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/sysfs/fs_test.go create mode 100755 example/prometheus-mock/vendor/github.com/prometheus/procfs/ttar create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/xfrm.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/xfrm_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/xfs/parse.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/xfs/parse_test.go create mode 100644 example/prometheus-mock/vendor/github.com/prometheus/procfs/xfs/xfs.go create mode 100644 example/prometheus.yml create mode 100644 example/vistio.yaml create mode 100644 helm/vistio/.helmignore create mode 100644 helm/vistio/Chart.yaml create mode 100644 helm/vistio/templates/NOTES.txt create mode 100644 helm/vistio/templates/_helpers.tpl create mode 100644 helm/vistio/templates/configmap.yaml create mode 100644 helm/vistio/templates/deployment.yaml create mode 100644 helm/vistio/templates/service.yaml create mode 100644 helm/vistio/templates/statefulset.yaml create mode 100644 helm/vistio/values-mesh-only.yaml create mode 100644 helm/vistio/values-with-ingress.yaml create mode 100644 helm/vistio/values.yaml create mode 100644 web/.babelrc create mode 100644 web/.circleci/config.yml create mode 100644 web/.env create mode 100644 web/.eslintrc create mode 100644 web/.gitignore create mode 100644 web/Dockerfile create mode 100644 web/LICENSE create mode 100644 web/README.md create mode 100644 web/package-lock.json create mode 100644 web/package.json create mode 100644 web/server.js create mode 100644 web/src/app.css create mode 100644 web/src/app.jsx create mode 100644 web/src/appConstants.js create mode 100644 web/src/appDispatcher.js create mode 100644 web/src/components/breadcrumbs.css create mode 100644 web/src/components/breadcrumbs.jsx create mode 100644 web/src/components/connectionChart.jsx create mode 100644 web/src/components/connectionList.jsx create mode 100644 web/src/components/controls.css create mode 100644 web/src/components/customVizceral.jsx create mode 100644 web/src/components/detailsPanel.css create mode 100644 web/src/components/detailsPanelConnection.jsx create mode 100644 web/src/components/detailsPanelNode.jsx create mode 100644 web/src/components/detailsSubpanel.jsx create mode 100644 web/src/components/displayOptions.jsx create mode 100644 web/src/components/filterActions.js create mode 100644 web/src/components/filterControls.jsx create mode 100644 web/src/components/filterStore.js create mode 100644 web/src/components/istio.png create mode 100644 web/src/components/loadingCover.css create mode 100644 web/src/components/loadingCover.jsx create mode 100644 web/src/components/locator.css create mode 100644 web/src/components/locator.jsx create mode 100644 web/src/components/notices.jsx create mode 100644 web/src/components/optionsPanel.css create mode 100644 web/src/components/optionsPanel.jsx create mode 100644 web/src/components/physicsOptions.css create mode 100644 web/src/components/physicsOptions.jsx create mode 100644 web/src/components/replayClock.css create mode 100644 web/src/components/replayClock.jsx create mode 100644 web/src/components/serverStatus.css create mode 100644 web/src/components/serverStatus.jsx create mode 100644 web/src/components/stepper.jsx create mode 100644 web/src/components/trafficActions.js create mode 100644 web/src/components/trafficFlow.css create mode 100644 web/src/components/trafficFlow.jsx create mode 100644 web/src/components/trafficStore.js create mode 100644 web/src/favicon.ico create mode 100644 web/src/index.html create mode 100644 web/webpack.config.js diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 0000000..e9ebc9a --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,57 @@ +version: 2 +jobs: + build-api: + docker: + - image: circleci/golang:1.10.2 + environment: + DOCKER_IMAGE_NAME: nmnellis/vistio-api + + working_directory: /go/src/github.com/nmnellis/vistio + steps: + - checkout + - run: cd api && make test + - run: cd api && make build + - setup_remote_docker: + docker_layer_caching: true + - run: | + cd api + if [ "${CIRCLE_BRANCH}" == "master" ]; then + docker build -t $DOCKER_IMAGE_NAME . + docker login -u $DOCKER_USER -p $DOCKER_PASS + docker push $DOCKER_IMAGE_NAME + fi + if [[ "$CIRCLE_TAG" =~ ^v[0-9]+(?:\.[0-9]+){2}$ ]]; then + docker build -t "$DOCKER_IMAGE_NAME:$CIRCLE_TAG" . + docker login -u $DOCKER_USER -p $DOCKER_PASS + docker push "$DOCKER_IMAGE_NAME:$CIRCLE_TAG" + fi + build-web: + docker: + - image: circleci/node:10.3.0 + environment: + DOCKER_IMAGE_NAME: nmnellis/vistio-web + + working_directory: ~/vistio + steps: + - checkout + - run: cd web && npm install + - setup_remote_docker: + docker_layer_caching: true + - run: | + cd web + if [ "${CIRCLE_BRANCH}" == "master" ]; then + docker build -t $DOCKER_IMAGE_NAME . + docker login -u $DOCKER_USER -p $DOCKER_PASS + docker push $DOCKER_IMAGE_NAME + fi + if [[ "$CIRCLE_TAG" =~ ^v[0-9]+(?:\.[0-9]+){2}$ ]]; then + docker build -t "$DOCKER_IMAGE_NAME:$CIRCLE_TAG" . + docker login -u $DOCKER_USER -p $DOCKER_PASS + docker push "$DOCKER_IMAGE_NAME:$CIRCLE_TAG" + fi +workflows: + version: 2 + build_project: + jobs: + - build-api + - build-web diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..880ac59 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +build/ +.DS_Store diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..275d6ae --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,21 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Launch", + "type": "go", + "request": "launch", + "mode": "debug", + "remotePath": "", + "port": 2345, + "host": "127.0.0.1", + "program": "${workspaceRoot}/example/prometheus-mock", + "env": {}, + "args": [], + "showLog": true + } + ] +} \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..9a630b9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2017 Le Van Nghia + +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. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..3ccc3d4 --- /dev/null +++ b/README.md @@ -0,0 +1,81 @@ +# Vistio [![CircleCI Build Status](https://circleci.com/gh/nmnellis/vistio.svg?style=shield)](https://circleci.com/gh/nmnellis/vistio) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat)](http://makeapullrequest.com) [![MIT Licensed](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/nmnellis/vistio/blob/master/LICENSE) + +* Forked from - https://github.com/nghialv/promviz and https://github.com/mjhd-devlion/promviz-front + +Vistio is an application that helps you visualize the traffic of your cluster from Prometheus data. + +It has 2 components: + +- Vistio-API: retrieves data from Prometheus servers, aggregates them and provides an API to get the graph data. + +- Vistio-Web: Forked from [Promviz-front](https://github.com/mjhd-devlion/promviz-front): based on Netflix's [vizceral](https://github.com/Netflix/vizceral) to render traffic graph. + +#### Features: +- Generates and renders traffic graph in realtime +- Able to replay from any time in the past +- Able to generate notices on node and connection from prom query +- Provides a sidecar application for k8s that watches config changes and reload Vistio server in runtime +- Fits with [Istio](https://istio.io)'s metrics + +![](https://github.com/nmnellis/vistio/blob/master/documentation/sample_filter.png) + +## Architecture + +![](https://github.com/nmnellis/vistio/blob/master/documentation/architecture.png) + +## Install + +#### Helm chart + +If you are using [Helm](https://helm.sh), the simplest way to install is using the charts in `helm` directory with + +``` +helm install --name vistio ./helm/vistio +``` + +#### Docker images + +Docker images of both `vistio-api` and `vistio-web` are available on Docker Hub. + +- [nmnellis/vistio-api](https://hub.docker.com/r/nmnellis/vistio-api) +- [nmnellis/vistio-web](https://hub.docker.com/r/nmnellis/vistio-web) + +## Example + +An Istio example is in the `/example` directory + +You can try it by going to that directory and run + +``` +docker-compose up --build +``` + +Then checkout each service at: +- promviz-front: [http://localhost:8080/graph](http://localhost:8080/) +- vistio: [http://localhost:9091/graph](http://localhost:9091/graph) +- prometheus: [http://localhost:9090/graph](http://localhost:9090/graph) +- mock-metric: [http://localhost:30001/metrics](http://localhost:30001/metrics) + +## Configuration + +See [configuration.md](https://github.com/nmnellis/vistio/blob/master/documentation/configuration.md) in documentation directory. + +## Deploy with Istio Bookinfo + +1. Deploy Vistio + +2. Get Vistio host and port. +```sh +export VISTIO_HOST=$(kubectl get po -l app=vistio-web -n default -o 'jsonpath={.items[0].status.hostIP}') +export VISTIO_PORT=$(kubectl get service vistio-web -o jsonpath='{.spec.ports[?(@.name=="http")].nodePort}') +export VISTIO_URL=$VISTIO_HOST:$VISTIO_PORT +``` +3. + +## Contributing + +Please feel free to create an issue or pull request. + +## LICENSE + +Vistio is released under the MIT license. See LICENSE file for details. diff --git a/api/Dockerfile b/api/Dockerfile new file mode 100644 index 0000000..7573f02 --- /dev/null +++ b/api/Dockerfile @@ -0,0 +1,9 @@ +FROM alpine:3.5 + +RUN apk --update add ca-certificates atop + +ADD build/vistio /bin + +EXPOSE 9091 + +ENTRYPOINT ["/bin/vistio"] \ No newline at end of file diff --git a/api/Gopkg.lock b/api/Gopkg.lock new file mode 100644 index 0000000..9fe9426 --- /dev/null +++ b/api/Gopkg.lock @@ -0,0 +1,184 @@ +# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. + + +[[projects]] + branch = "master" + name = "github.com/alecthomas/template" + packages = [ + ".", + "parse" + ] + revision = "a0175ee3bccc567396460bf5acd36800cb10c49c" + +[[projects]] + branch = "master" + name = "github.com/alecthomas/units" + packages = ["."] + revision = "2efee857e7cfd4f3d0138cc3cbb1b4966962b93a" + +[[projects]] + branch = "master" + name = "github.com/beorn7/perks" + packages = ["quantile"] + revision = "3a771d992973f24aa725d07868b467d1ddfceafb" + +[[projects]] + name = "github.com/cenkalti/backoff" + packages = ["."] + revision = "2ea60e5f094469f9e65adb9cd103795b73ae743e" + version = "v2.0.0" + +[[projects]] + name = "github.com/davecgh/go-spew" + packages = ["spew"] + revision = "346938d642f2ec3594ed81d874461961cd0faa76" + version = "v1.1.0" + +[[projects]] + name = "github.com/golang/protobuf" + packages = ["proto"] + revision = "b4deda0973fb4c70b50d226b1af49f3da59f5265" + version = "v1.1.0" + +[[projects]] + name = "github.com/matttproud/golang_protobuf_extensions" + packages = ["pbutil"] + revision = "c12348ce28de40eed0136aa2b644d0ee0650e56c" + version = "v1.0.1" + +[[projects]] + name = "github.com/pmezard/go-difflib" + packages = ["difflib"] + revision = "792786c7400a136282c1664665ae0a8db921c6c2" + version = "v1.0.0" + +[[projects]] + name = "github.com/prometheus/client_golang" + packages = [ + "api/prometheus", + "prometheus", + "prometheus/promhttp" + ] + revision = "c5b7fccd204277076155f10851dad72b76a49317" + version = "v0.8.0" + +[[projects]] + branch = "master" + name = "github.com/prometheus/client_model" + packages = ["go"] + revision = "99fa1f4be8e564e8a6b613da7fa6f46c9edafc6c" + +[[projects]] + branch = "master" + name = "github.com/prometheus/common" + packages = [ + "expfmt", + "internal/bitbucket.org/ww/goautoneg", + "model" + ] + revision = "7600349dcfe1abd18d72d3a1770870d9800a7801" + +[[projects]] + branch = "master" + name = "github.com/prometheus/procfs" + packages = [ + ".", + "internal/util", + "nfs", + "xfs" + ] + revision = "94663424ae5ae9856b40a9f170762b4197024661" + +[[projects]] + name = "github.com/rs/cors" + packages = ["."] + revision = "ca016a06a5753f8ba03029c0aa5e54afb1bf713f" + version = "v1.4.0" + +[[projects]] + name = "github.com/stretchr/objx" + packages = ["."] + revision = "facf9a85c22f48d2f52f2380e4efce1768749a89" + version = "v0.1" + +[[projects]] + name = "github.com/stretchr/testify" + packages = [ + "assert", + "mock", + "require" + ] + revision = "12b6f73e6084dad08a7c6e575284b177ecafbc71" + version = "v1.2.1" + +[[projects]] + name = "go.uber.org/atomic" + packages = ["."] + revision = "1ea20fb1cbb1cc08cbd0d913a96dead89aa18289" + version = "v1.3.2" + +[[projects]] + name = "go.uber.org/multierr" + packages = ["."] + revision = "3c4937480c32f4c13a875a1829af76c98ca3d40a" + version = "v1.1.0" + +[[projects]] + name = "go.uber.org/zap" + packages = [ + ".", + "buffer", + "internal/bufferpool", + "internal/color", + "internal/exit", + "zapcore" + ] + revision = "eeedf312bc6c57391d84767a4cd413f02a917974" + version = "v1.8.0" + +[[projects]] + branch = "master" + name = "golang.org/x/net" + packages = [ + "context", + "context/ctxhttp" + ] + revision = "1e491301e022f8f977054da4c2d852decd59571f" + +[[projects]] + branch = "master" + name = "golang.org/x/sync" + packages = ["errgroup"] + revision = "1d60e4601c6fd243af51cc01ddf169918a5407ca" + +[[projects]] + branch = "master" + name = "golang.org/x/sys" + packages = ["unix"] + revision = "c11f84a56e43e20a78cee75a7c034031ecf57d1f" + +[[projects]] + name = "gopkg.in/alecthomas/kingpin.v2" + packages = ["."] + revision = "947dcec5ba9c011838740e680966fd7087a71d0d" + version = "v2.2.6" + +[[projects]] + name = "gopkg.in/fsnotify.v1" + packages = ["."] + revision = "c2828203cd70a50dcccfb2761f8b1f8ceef9a8e9" + source = "https://github.com/fsnotify/fsnotify/archive/v1.4.7.tar.gz" + version = "v1.4.7" + +[[projects]] + name = "gopkg.in/yaml.v2" + packages = ["."] + revision = "5420a8b6744d3b0345ab293f6fcba19c978f1183" + version = "v2.2.1" + +[solve-meta] + analyzer-name = "dep" + analyzer-version = 1 + inputs-digest = "b580bf6626d2ddc33ce79ee7e68f92a7f54f80a3a54ee060dfa030c997555e2b" + solver-name = "gps-cdcl" + solver-version = 1 diff --git a/api/Gopkg.toml b/api/Gopkg.toml new file mode 100644 index 0000000..bb0b140 --- /dev/null +++ b/api/Gopkg.toml @@ -0,0 +1,11 @@ +[[constraint]] + name = "github.com/prometheus/client_golang" + version = "0.8.0" + +[[constraint]] + name = "github.com/uber-go/zap" + version = "1.7.1" + +[[constraint]] + source = "https://github.com/fsnotify/fsnotify/archive/v1.4.7.tar.gz" + name = "gopkg.in/fsnotify.v1" \ No newline at end of file diff --git a/api/Makefile b/api/Makefile new file mode 100644 index 0000000..4663a1e --- /dev/null +++ b/api/Makefile @@ -0,0 +1,20 @@ +NAME := vistio + +GO_ENV ?= CGO_ENABLED=0 +GO_PKGS := $(shell go list ./... | grep -vE "(vendor|example)") + +BUILD_VERSION ?= $(shell git describe --tags) +BUILD_BRANCH ?= $(shell git rev-parse --abbrev-ref @) +BUILD_TIMESTAMP ?= $(shell date -u +%Y-%m-%dT%H:%M:%SZ) +LDFLAGS_PREFIX := -X github.com/nghialv/vistio/version +BUILD_OPTS ?= -ldflags "$(LDFLAGS_PREFIX).Version=$(BUILD_VERSION) $(LDFLAGS_PREFIX).Branch=$(BUILD_BRANCH) $(LDFLAGS_PREFIX).BuildTimestamp=$(BUILD_TIMESTAMP) -w" + +.PHONY: build +build: BUILD_DIR ?= ./build +build: BUILD_ENV ?= GOOS=linux GOARCH=amd64 +build: + $(BUILD_ENV) $(GO_ENV) go build $(BUILD_OPTS) -o $(BUILD_DIR)/$(NAME) ./cmd/vistio/main.go + +PHONY: test +test: + $(GO_ENV) go test $(GO_PKGS) diff --git a/api/api/api.go b/api/api/api.go new file mode 100644 index 0000000..09b41dc --- /dev/null +++ b/api/api/api.go @@ -0,0 +1,234 @@ +package api + +import ( + "fmt" + "io/ioutil" + "net/http" + "strconv" + "time" + + "github.com/nmnellis/vistio/api/cache" + "github.com/nmnellis/vistio/api/model" + "github.com/nmnellis/vistio/api/storage" + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promhttp" + "github.com/rs/cors" + "go.uber.org/zap" +) + +var ( + namespace = "vistio" + subsystem = "api" +) + +type Handler interface { + Run(prometheus.Gatherer) error + Stop() error + Reload() <-chan chan error +} + +type Options struct { + ListenPort int + ConfigFile string + Cache cache.Cache + Querier storage.Querier +} + +type apiMetrics struct { + requests *prometheus.CounterVec + latency *prometheus.SummaryVec + snapshotNotFound prometheus.Counter +} + +func newApiMetrics(r prometheus.Registerer) *apiMetrics { + m := &apiMetrics{ + requests: prometheus.NewCounterVec(prometheus.CounterOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "requests_total", + Help: "Total number of handled requests.", + }, + []string{"handler", "status"}, + ), + latency: prometheus.NewSummaryVec(prometheus.SummaryOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "latency_seconds", + Help: "Latency for handling request.", + }, + []string{"handler", "status"}, + ), + snapshotNotFound: prometheus.NewCounter(prometheus.CounterOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "snapshot_not_found", + Help: "Total number of times unabled to find snapshot.", + }), + } + if r != nil { + r.MustRegister( + m.requests, + m.latency, + m.snapshotNotFound, + ) + } + return m +} + +type handler struct { + logger *zap.Logger + metrics *apiMetrics + + options *Options + reloadCh chan chan error + + cache cache.Cache + querier storage.Querier +} + +func NewHandler(logger *zap.Logger, r prometheus.Registerer, opts *Options) Handler { + return &handler{ + logger: logger, + metrics: newApiMetrics(r), + + options: opts, + reloadCh: make(chan chan error), + + cache: opts.Cache, + querier: opts.Querier, + } +} + +func (h *handler) Run(g prometheus.Gatherer) error { + addr := fmt.Sprintf(":%d", h.options.ListenPort) + h.logger.Info("Start listening for incoming connections", zap.String("address", addr)) + + c := cors.New(cors.Options{ + AllowedOrigins: []string{"*"}, + }) + + mux := http.NewServeMux() + mux.HandleFunc("/graph", h.getGraphHandler) + mux.HandleFunc("/reload", h.reloadHandler) + mux.HandleFunc("/config", h.getConfigHandler) + mux.Handle("/metrics", promhttp.HandlerFor(g, promhttp.HandlerOpts{})) + mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + w.Write([]byte("Alive")) + }) + + return http.ListenAndServe(addr, c.Handler(mux)) +} + +func (h *handler) Reload() <-chan chan error { + return h.reloadCh +} + +func (h *handler) Stop() error { + h.logger.Info("Stopping api server...") + return nil +} + +func (h *handler) reloadHandler(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + http.Error(w, fmt.Sprintf("Invalid request method"), http.StatusNotImplemented) + return + } + + status := http.StatusOK + defer track(h.metrics, "Reload")(&status) + + rc := make(chan error) + h.reloadCh <- rc + if err := <-rc; err != nil { + status = http.StatusInternalServerError + http.Error(w, fmt.Sprintf("Failed to reload config: %s", err), status) + return + } + w.WriteHeader(status) +} + +func (h *handler) getGraphHandler(w http.ResponseWriter, req *http.Request) { + status := http.StatusOK + defer track(h.metrics, "GetGraph")(&status) + + getSnapshot := h.querier.GetLatestSnapshot + query := req.URL.Query() + offsets := query["offset"] + + if len(offsets) != 0 { + offset, err := strconv.Atoi(offsets[0]) + if err != nil { + status = http.StatusBadRequest + http.Error(w, fmt.Sprintf("Invalid offset (%s): %s", offsets[0], err), status) + return + } + + if offset > 0 { + ts := time.Now().Add(time.Duration(-offset) * time.Second) + chunkID := storage.ChunkID(ts) + + getSnapshot = func() (*model.Snapshot, error) { + chunk := h.cache.Get(chunkID) + if chunk == nil { + h.logger.Warn("Cache miss", + zap.Time("ts", ts), + zap.Int64("chunkID", chunkID)) + + chunk, err = h.querier.GetChunk(chunkID) + if err != nil { + return nil, err + } + if chunk.IsCompleted() { + h.cache.Put(chunkID, chunk) + } + } + + snapshot := chunk.Iterator().FindBestSnapshot(ts) + if snapshot != nil { + return snapshot, nil + } + + h.metrics.snapshotNotFound.Inc() + h.logger.Warn("Unabled to find snapshot in chunk", + zap.Time("ts", ts), + zap.Int("chunkLength", chunk.Len()), + zap.Any("chunk", chunk)) + + return nil, fmt.Errorf("Not found snapshot") + } + } + } + + snapshot, err := getSnapshot() + if err != nil { + status = http.StatusNotFound + http.Error(w, fmt.Sprintf("Failed to get snapshot: %s", err), status) + return + } + + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(status) + w.Write([]byte(snapshot.GraphJSON)) +} + +func (h *handler) getConfigHandler(w http.ResponseWriter, req *http.Request) { + status := http.StatusOK + defer track(h.metrics, "GetConfig")(&status) + + content, err := ioutil.ReadFile(h.options.ConfigFile) + if err != nil { + status = http.StatusInternalServerError + http.Error(w, err.Error(), status) + } + + w.Write(content) +} + +func track(metrics *apiMetrics, handler string) func(*int) { + start := time.Now() + return func(status *int) { + s := fmt.Sprintf("%d", *status) + metrics.requests.WithLabelValues(handler, s).Inc() + metrics.latency.WithLabelValues(handler, s).Observe(time.Since(start).Seconds()) + } +} diff --git a/api/api/api_test.go b/api/api/api_test.go new file mode 100644 index 0000000..778f64e --- /dev/null +++ b/api/api/api_test.go @@ -0,0 +1 @@ +package api diff --git a/api/cache/cache.go b/api/cache/cache.go new file mode 100644 index 0000000..985307d --- /dev/null +++ b/api/cache/cache.go @@ -0,0 +1,160 @@ +package cache + +import ( + "container/list" + "strconv" + "sync" + + "github.com/nmnellis/vistio/api/storage" + "github.com/prometheus/client_golang/prometheus" + "go.uber.org/zap" +) + +var ( + namespace = "vistio" + subsystem = "cache" +) + +type Cache interface { + Get(int64) storage.Chunk + Put(int64, storage.Chunk) bool + Reset() +} + +type Options struct { + Size int +} + +type cacheMetrics struct { + get *prometheus.CounterVec + put *prometheus.CounterVec + length prometheus.Gauge +} + +func newCacheMetrics(r prometheus.Registerer) *cacheMetrics { + m := &cacheMetrics{ + get: prometheus.NewCounterVec(prometheus.CounterOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "get", + Help: "Total number of Get requests.", + }, + []string{"status"}, + ), + put: prometheus.NewCounterVec(prometheus.CounterOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "put", + Help: "Total number of Put requests.", + }, + []string{"status"}, + ), + length: prometheus.NewGauge(prometheus.GaugeOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "length", + Help: "Number of items exist in cache.", + }), + } + if r != nil { + r.MustRegister( + m.get, + m.put, + m.length, + ) + } + return m +} + +type cache struct { + logger *zap.Logger + metrics *cacheMetrics + + options *Options + mtx sync.Mutex + + linkedList *list.List + items map[int64]*list.Element +} + +type item struct { + key int64 + value storage.Chunk +} + +func NewCache(logger *zap.Logger, r prometheus.Registerer, opts *Options) Cache { + c := &cache{ + logger: logger, + metrics: newCacheMetrics(r), + options: opts, + } + c.Reset() + return c +} + +func (c *cache) Get(chunkID int64) (chunk storage.Chunk) { + defer func() { + if chunk == nil { + c.metrics.get.WithLabelValues("miss").Inc() + } else { + c.metrics.get.WithLabelValues("hit").Inc() + } + }() + + c.mtx.Lock() + defer c.mtx.Unlock() + + if e, ok := c.items[chunkID]; ok { + c.linkedList.MoveToFront(e) + chunk = e.Value.(item).value + return + } + return +} + +func (c *cache) Put(chunkID int64, chunk storage.Chunk) (ok bool) { + if chunk == nil { + return false + } + length := 0 + + defer func() { + c.metrics.put.WithLabelValues(strconv.FormatBool(ok)).Inc() + c.metrics.length.Set(float64(length)) + }() + + c.mtx.Lock() + defer c.mtx.Unlock() + + if e, ok := c.items[chunkID]; ok { + c.linkedList.MoveToFront(e) + return true + } + + element := c.linkedList.PushFront(item{ + key: chunkID, + value: chunk, + }) + c.items[chunkID] = element + + evict := c.linkedList.Len() > c.options.Size + if evict { + e := c.linkedList.Back() + if e != nil { + c.linkedList.Remove(e) + k := e.Value.(item).key + delete(c.items, k) + } + } + length = len(c.items) + return true +} + +func (c *cache) Reset() { + c.mtx.Lock() + defer c.mtx.Unlock() + + c.items = make(map[int64]*list.Element) + c.linkedList = list.New() + c.metrics.length.Set(0) +} diff --git a/api/cache/cache_test.go b/api/cache/cache_test.go new file mode 100644 index 0000000..08bf029 --- /dev/null +++ b/api/cache/cache_test.go @@ -0,0 +1 @@ +package cache diff --git a/api/cache/cachemock/Cache.go b/api/cache/cachemock/Cache.go new file mode 100644 index 0000000..4d1f7f7 --- /dev/null +++ b/api/cache/cachemock/Cache.go @@ -0,0 +1,47 @@ +package cachemock + +import cache "github.com/nmnellis/vistio/api/cache" +import mock "github.com/stretchr/testify/mock" +import storage "github.com/nmnellis/vistio/api/storage" + +// Cache is an autogenerated mock type for the Cache type +type Cache struct { + mock.Mock +} + +// Get provides a mock function with given fields: _a0 +func (_m *Cache) Get(_a0 int64) storage.Chunk { + ret := _m.Called(_a0) + + var r0 storage.Chunk + if rf, ok := ret.Get(0).(func(int64) storage.Chunk); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(storage.Chunk) + } + } + + return r0 +} + +// Put provides a mock function with given fields: _a0, _a1 +func (_m *Cache) Put(_a0 int64, _a1 storage.Chunk) bool { + ret := _m.Called(_a0, _a1) + + var r0 bool + if rf, ok := ret.Get(0).(func(int64, storage.Chunk) bool); ok { + r0 = rf(_a0, _a1) + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +// Reset provides a mock function with given fields: +func (_m *Cache) Reset() { + _m.Called() +} + +var _ cache.Cache = (*Cache)(nil) diff --git a/api/cmd/k8s-config-reloader/.gitignore b/api/cmd/k8s-config-reloader/.gitignore new file mode 100644 index 0000000..567609b --- /dev/null +++ b/api/cmd/k8s-config-reloader/.gitignore @@ -0,0 +1 @@ +build/ diff --git a/api/cmd/k8s-config-reloader/Dockerfile b/api/cmd/k8s-config-reloader/Dockerfile new file mode 100644 index 0000000..072dc00 --- /dev/null +++ b/api/cmd/k8s-config-reloader/Dockerfile @@ -0,0 +1,7 @@ +FROM alpine:3.5 + +RUN apk --update add ca-certificates atop + +ADD build/k8s-config-reloader / + +ENTRYPOINT ["/k8s-config-reloader"] \ No newline at end of file diff --git a/api/cmd/k8s-config-reloader/Gopkg.lock b/api/cmd/k8s-config-reloader/Gopkg.lock new file mode 100644 index 0000000..3f1efb5 --- /dev/null +++ b/api/cmd/k8s-config-reloader/Gopkg.lock @@ -0,0 +1,69 @@ +# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. + + +[[projects]] + branch = "master" + name = "github.com/alecthomas/template" + packages = [".","parse"] + revision = "a0175ee3bccc567396460bf5acd36800cb10c49c" + +[[projects]] + branch = "master" + name = "github.com/alecthomas/units" + packages = ["."] + revision = "2efee857e7cfd4f3d0138cc3cbb1b4966962b93a" + +[[projects]] + name = "github.com/cenkalti/backoff" + packages = ["."] + revision = "61153c768f31ee5f130071d08fc82b85208528de" + version = "v1.1.0" + +[[projects]] + name = "go.uber.org/atomic" + packages = ["."] + revision = "4e336646b2ef9fc6e47be8e21594178f98e5ebcf" + version = "v1.2.0" + +[[projects]] + name = "go.uber.org/multierr" + packages = ["."] + revision = "3c4937480c32f4c13a875a1829af76c98ca3d40a" + version = "v1.1.0" + +[[projects]] + name = "go.uber.org/zap" + packages = [".","buffer","internal/bufferpool","internal/color","internal/exit","zapcore"] + revision = "35aad584952c3e7020db7b839f6b102de6271f89" + version = "v1.7.1" + +[[projects]] + branch = "master" + name = "golang.org/x/net" + packages = ["context"] + revision = "a04bdaca5b32abe1c069418fb7088ae607de5bd0" + +[[projects]] + branch = "master" + name = "golang.org/x/sys" + packages = ["unix"] + revision = "43eea11bc92608addb41b8a406b0407495c106f6" + +[[projects]] + name = "gopkg.in/alecthomas/kingpin.v2" + packages = ["."] + revision = "1087e65c9441605df944fb12c33f0fe7072d18ca" + version = "v2.2.5" + +[[projects]] + name = "gopkg.in/fsnotify.v1" + packages = ["."] + revision = "629574ca2a5df945712d3079857300b5e4da0236" + version = "v1.4.2" + +[solve-meta] + analyzer-name = "dep" + analyzer-version = 1 + inputs-digest = "9f9dbe4f2b3dc0358ff3baa3e34fccf73e0e3c237c3e857ad46384414586fcc1" + solver-name = "gps-cdcl" + solver-version = 1 diff --git a/api/cmd/k8s-config-reloader/Gopkg.toml b/api/cmd/k8s-config-reloader/Gopkg.toml new file mode 100644 index 0000000..0ac6372 --- /dev/null +++ b/api/cmd/k8s-config-reloader/Gopkg.toml @@ -0,0 +1,15 @@ +[[constraint]] + name = "github.com/cenkalti/backoff" + version = "1.1.0" + +[[constraint]] + name = "go.uber.org/zap" + version = "1.7.1" + +[[constraint]] + name = "gopkg.in/alecthomas/kingpin.v2" + version = "2.2.5" + +[[constraint]] + name = "gopkg.in/fsnotify.v1" + version = "1.4.2" diff --git a/api/cmd/k8s-config-reloader/Makefile b/api/cmd/k8s-config-reloader/Makefile new file mode 100644 index 0000000..865f8b8 --- /dev/null +++ b/api/cmd/k8s-config-reloader/Makefile @@ -0,0 +1,12 @@ +NAME := k8s-config-reloader + +GO_ENV ?= CGO_ENABLED=0 +BUILD_VERSION ?= $(shell git describe --tags) +LDFLAGS_PREFIX := -X main.Version=$(BUILD_VERSION) +BUILD_OPTS ?= -ldflags "$(LDFLAGS_PREFIX)" + +.PHONY: build +build: BUILD_DIR ?= ./build +build: BUILD_ENV ?= GOOS=linux GOARCH=amd64 +build: + $(BUILD_ENV) $(GO_ENV) go build $(BUILD_OPTS) -o $(BUILD_DIR)/$(NAME) ./main.go diff --git a/api/cmd/k8s-config-reloader/main.go b/api/cmd/k8s-config-reloader/main.go new file mode 100644 index 0000000..5da7872 --- /dev/null +++ b/api/cmd/k8s-config-reloader/main.go @@ -0,0 +1,168 @@ +package main + +import ( + "context" + "fmt" + "net/http" + "os" + "os/signal" + "path/filepath" + "syscall" + "time" + + "github.com/cenkalti/backoff" + "go.uber.org/zap" + "gopkg.in/alecthomas/kingpin.v2" + fsnotify "gopkg.in/fsnotify.v1" +) + +var ( + Version = "" +) + +type Config struct { + vistioConfigDir string + vistioReloadURL string + logLevel string +} + +func main() { + cfg := Config{} + + a := kingpin.New(filepath.Base(os.Args[0]), "The vistio config reloader for k8s") + a.Version(Version) + a.HelpFlag.Short('h') + + a.Flag("config.vistio-config-dir", "The directory contains Vistio configuration file."). + StringVar(&cfg.vistioConfigDir) + + a.Flag("config.vistio-reload-url", "The url to send reloading request."). + StringVar(&cfg.vistioReloadURL) + + a.Flag("config.log-level", "The level of logging."). + Default("info").StringVar(&cfg.logLevel) + + _, err := a.Parse(os.Args[1:]) + if err != nil { + fmt.Printf("Failed to parse arguments: %v\n", err) + a.Usage(os.Args[1:]) + os.Exit(2) + } + + // TODO: log lever + logger, err := zap.NewProduction() + if err != nil { + os.Exit(2) + } + defer logger.Sync() + + rl := newReloader(&cfg, logger.With(zap.String("component", "reloader"))) + go func() { + if err := rl.Run(); err != nil { + os.Exit(1) + } + }() + + sigCh := make(chan os.Signal, 1) + signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM) + + select { + case <-sigCh: + logger.Warn("Received SIGTERM, exiting gracefully...") + rl.Stop() + } +} + +type reloader struct { + cfg *Config + logger *zap.Logger + + ctx context.Context + cancel func() + doneCh chan struct{} +} + +func newReloader(cfg *Config, logger *zap.Logger) *reloader { + ctx, cancel := context.WithCancel(context.Background()) + return &reloader{ + cfg: cfg, + logger: logger, + ctx: ctx, + cancel: cancel, + doneCh: make(chan struct{}), + } +} + +func (r *reloader) Run() error { + defer close(r.doneCh) + + watcher, err := fsnotify.NewWatcher() + if err != nil { + r.logger.Error("Failed to create a new file watcher.", zap.Error(err)) + return err + } + defer watcher.Close() + + r.logger.Info("Starting reloader...") + r.Reload() + + err = watcher.Add(r.cfg.vistioConfigDir) + if err != nil { + r.logger.Error("Failed to add config volume to be watched", zap.Error(err)) + return err + } + + for { + select { + case event := <-watcher.Events: + if event.Op&fsnotify.Create == fsnotify.Create { + if filepath.Base(event.Name) == "..data" { + r.logger.Info("ConfigMap modified") + r.Reload() + } + } + case err := <-watcher.Errors: + r.logger.Error("Got an error from watcher", zap.Error(err)) + + case <-r.ctx.Done(): + return nil + } + } +} + +func (r *reloader) Stop() { + r.cancel() + <-r.doneCh +} + +func (r *reloader) Reload() { + cb := backoff.WithContext(backoff.NewExponentialBackOff(), r.ctx) + err := backoff.RetryNotify(r.reload, cb, func(err error, next time.Duration) { + r.logger.Warn("Failed to reload vistio configuration", + zap.Error(err), + zap.Duration("next retry", next), + ) + }) + + if err != nil { + r.logger.Error("Failed to reload vistio configuration", zap.Error(err)) + } else { + r.logger.Info("Reloaded successfully") + } +} + +func (r *reloader) reload() error { + req, err := http.NewRequest("POST", r.cfg.vistioReloadURL, nil) + if err != nil { + return err + } + resp, err := http.DefaultClient.Do(req) + if err != nil { + return err + } + resp.Body.Close() + if resp.StatusCode != 200 { + return fmt.Errorf("Received response code %v, expected 200", resp.StatusCode) + } + return nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/LICENSE b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/LICENSE new file mode 100644 index 0000000..7448756 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2012 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/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/README.md b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/README.md new file mode 100644 index 0000000..ef6a8ee --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/README.md @@ -0,0 +1,25 @@ +# Go's `text/template` package with newline elision + +This is a fork of Go 1.4's [text/template](http://golang.org/pkg/text/template/) package with one addition: a backslash immediately after a closing delimiter will delete all subsequent newlines until a non-newline. + +eg. + +``` +{{if true}}\ +hello +{{end}}\ +``` + +Will result in: + +``` +hello\n +``` + +Rather than: + +``` +\n +hello\n +\n +``` diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/doc.go b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/doc.go new file mode 100644 index 0000000..223c595 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/doc.go @@ -0,0 +1,406 @@ +// 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 template implements data-driven templates for generating textual output. + +To generate HTML output, see package html/template, which has the same interface +as this package but automatically secures HTML output against certain attacks. + +Templates are executed by applying them to a data structure. Annotations in the +template refer to elements of the data structure (typically a field of a struct +or a key in a map) to control execution and derive values to be displayed. +Execution of the template walks the structure and sets the cursor, represented +by a period '.' and called "dot", to the value at the current location in the +structure as execution proceeds. + +The input text for a template is UTF-8-encoded text in any format. +"Actions"--data evaluations or control structures--are delimited by +"{{" and "}}"; all text outside actions is copied to the output unchanged. +Actions may not span newlines, although comments can. + +Once parsed, a template may be executed safely in parallel. + +Here is a trivial example that prints "17 items are made of wool". + + type Inventory struct { + Material string + Count uint + } + sweaters := Inventory{"wool", 17} + tmpl, err := template.New("test").Parse("{{.Count}} items are made of {{.Material}}") + if err != nil { panic(err) } + err = tmpl.Execute(os.Stdout, sweaters) + if err != nil { panic(err) } + +More intricate examples appear below. + +Actions + +Here is the list of actions. "Arguments" and "pipelines" are evaluations of +data, defined in detail below. + +*/ +// {{/* a comment */}} +// A comment; discarded. May contain newlines. +// Comments do not nest and must start and end at the +// delimiters, as shown here. +/* + + {{pipeline}} + The default textual representation of the value of the pipeline + is copied to the output. + + {{if pipeline}} T1 {{end}} + If the value of the pipeline is empty, no output is generated; + otherwise, T1 is executed. The empty values are false, 0, any + nil pointer or interface value, and any array, slice, map, or + string of length zero. + Dot is unaffected. + + {{if pipeline}} T1 {{else}} T0 {{end}} + If the value of the pipeline is empty, T0 is executed; + otherwise, T1 is executed. Dot is unaffected. + + {{if pipeline}} T1 {{else if pipeline}} T0 {{end}} + To simplify the appearance of if-else chains, the else action + of an if may include another if directly; the effect is exactly + the same as writing + {{if pipeline}} T1 {{else}}{{if pipeline}} T0 {{end}}{{end}} + + {{range pipeline}} T1 {{end}} + The value of the pipeline must be an array, slice, map, or channel. + If the value of the pipeline has length zero, nothing is output; + otherwise, dot is set to the successive elements of the array, + slice, or map and T1 is executed. If the value is a map and the + keys are of basic type with a defined order ("comparable"), the + elements will be visited in sorted key order. + + {{range pipeline}} T1 {{else}} T0 {{end}} + The value of the pipeline must be an array, slice, map, or channel. + If the value of the pipeline has length zero, dot is unaffected and + T0 is executed; otherwise, dot is set to the successive elements + of the array, slice, or map and T1 is executed. + + {{template "name"}} + The template with the specified name is executed with nil data. + + {{template "name" pipeline}} + The template with the specified name is executed with dot set + to the value of the pipeline. + + {{with pipeline}} T1 {{end}} + If the value of the pipeline is empty, no output is generated; + otherwise, dot is set to the value of the pipeline and T1 is + executed. + + {{with pipeline}} T1 {{else}} T0 {{end}} + If the value of the pipeline is empty, dot is unaffected and T0 + is executed; otherwise, dot is set to the value of the pipeline + and T1 is executed. + +Arguments + +An argument is a simple value, denoted by one of the following. + + - A boolean, string, character, integer, floating-point, imaginary + or complex constant in Go syntax. These behave like Go's untyped + constants, although raw strings may not span newlines. + - The keyword nil, representing an untyped Go nil. + - The character '.' (period): + . + The result is the value of dot. + - A variable name, which is a (possibly empty) alphanumeric string + preceded by a dollar sign, such as + $piOver2 + or + $ + The result is the value of the variable. + Variables are described below. + - The name of a field of the data, which must be a struct, preceded + by a period, such as + .Field + The result is the value of the field. Field invocations may be + chained: + .Field1.Field2 + Fields can also be evaluated on variables, including chaining: + $x.Field1.Field2 + - The name of a key of the data, which must be a map, preceded + by a period, such as + .Key + The result is the map element value indexed by the key. + Key invocations may be chained and combined with fields to any + depth: + .Field1.Key1.Field2.Key2 + Although the key must be an alphanumeric identifier, unlike with + field names they do not need to start with an upper case letter. + Keys can also be evaluated on variables, including chaining: + $x.key1.key2 + - The name of a niladic method of the data, preceded by a period, + such as + .Method + The result is the value of invoking the method with dot as the + receiver, dot.Method(). Such a method must have one return value (of + any type) or two return values, the second of which is an error. + If it has two and the returned error is non-nil, execution terminates + and an error is returned to the caller as the value of Execute. + Method invocations may be chained and combined with fields and keys + to any depth: + .Field1.Key1.Method1.Field2.Key2.Method2 + Methods can also be evaluated on variables, including chaining: + $x.Method1.Field + - The name of a niladic function, such as + fun + The result is the value of invoking the function, fun(). The return + types and values behave as in methods. Functions and function + names are described below. + - A parenthesized instance of one the above, for grouping. The result + may be accessed by a field or map key invocation. + print (.F1 arg1) (.F2 arg2) + (.StructValuedMethod "arg").Field + +Arguments may evaluate to any type; if they are pointers the implementation +automatically indirects to the base type when required. +If an evaluation yields a function value, such as a function-valued +field of a struct, the function is not invoked automatically, but it +can be used as a truth value for an if action and the like. To invoke +it, use the call function, defined below. + +A pipeline is a possibly chained sequence of "commands". A command is a simple +value (argument) or a function or method call, possibly with multiple arguments: + + Argument + The result is the value of evaluating the argument. + .Method [Argument...] + The method can be alone or the last element of a chain but, + unlike methods in the middle of a chain, it can take arguments. + The result is the value of calling the method with the + arguments: + dot.Method(Argument1, etc.) + functionName [Argument...] + The result is the value of calling the function associated + with the name: + function(Argument1, etc.) + Functions and function names are described below. + +Pipelines + +A pipeline may be "chained" by separating a sequence of commands with pipeline +characters '|'. In a chained pipeline, the result of the each command is +passed as the last argument of the following command. The output of the final +command in the pipeline is the value of the pipeline. + +The output of a command will be either one value or two values, the second of +which has type error. If that second value is present and evaluates to +non-nil, execution terminates and the error is returned to the caller of +Execute. + +Variables + +A pipeline inside an action may initialize a variable to capture the result. +The initialization has syntax + + $variable := pipeline + +where $variable is the name of the variable. An action that declares a +variable produces no output. + +If a "range" action initializes a variable, the variable is set to the +successive elements of the iteration. Also, a "range" may declare two +variables, separated by a comma: + + range $index, $element := pipeline + +in which case $index and $element are set to the successive values of the +array/slice index or map key and element, respectively. Note that if there is +only one variable, it is assigned the element; this is opposite to the +convention in Go range clauses. + +A variable's scope extends to the "end" action of the control structure ("if", +"with", or "range") in which it is declared, or to the end of the template if +there is no such control structure. A template invocation does not inherit +variables from the point of its invocation. + +When execution begins, $ is set to the data argument passed to Execute, that is, +to the starting value of dot. + +Examples + +Here are some example one-line templates demonstrating pipelines and variables. +All produce the quoted word "output": + + {{"\"output\""}} + A string constant. + {{`"output"`}} + A raw string constant. + {{printf "%q" "output"}} + A function call. + {{"output" | printf "%q"}} + A function call whose final argument comes from the previous + command. + {{printf "%q" (print "out" "put")}} + A parenthesized argument. + {{"put" | printf "%s%s" "out" | printf "%q"}} + A more elaborate call. + {{"output" | printf "%s" | printf "%q"}} + A longer chain. + {{with "output"}}{{printf "%q" .}}{{end}} + A with action using dot. + {{with $x := "output" | printf "%q"}}{{$x}}{{end}} + A with action that creates and uses a variable. + {{with $x := "output"}}{{printf "%q" $x}}{{end}} + A with action that uses the variable in another action. + {{with $x := "output"}}{{$x | printf "%q"}}{{end}} + The same, but pipelined. + +Functions + +During execution functions are found in two function maps: first in the +template, then in the global function map. By default, no functions are defined +in the template but the Funcs method can be used to add them. + +Predefined global functions are named as follows. + + and + Returns the boolean AND of its arguments by returning the + first empty argument or the last argument, that is, + "and x y" behaves as "if x then y else x". All the + arguments are evaluated. + call + Returns the result of calling the first argument, which + must be a function, with the remaining arguments as parameters. + Thus "call .X.Y 1 2" is, in Go notation, dot.X.Y(1, 2) where + Y is a func-valued field, map entry, or the like. + The first argument must be the result of an evaluation + that yields a value of function type (as distinct from + a predefined function such as print). The function must + return either one or two result values, the second of which + is of type error. If the arguments don't match the function + or the returned error value is non-nil, execution stops. + html + Returns the escaped HTML equivalent of the textual + representation of its arguments. + index + Returns the result of indexing its first argument by the + following arguments. Thus "index x 1 2 3" is, in Go syntax, + x[1][2][3]. Each indexed item must be a map, slice, or array. + js + Returns the escaped JavaScript equivalent of the textual + representation of its arguments. + len + Returns the integer length of its argument. + not + Returns the boolean negation of its single argument. + or + Returns the boolean OR of its arguments by returning the + first non-empty argument or the last argument, that is, + "or x y" behaves as "if x then x else y". All the + arguments are evaluated. + print + An alias for fmt.Sprint + printf + An alias for fmt.Sprintf + println + An alias for fmt.Sprintln + urlquery + Returns the escaped value of the textual representation of + its arguments in a form suitable for embedding in a URL query. + +The boolean functions take any zero value to be false and a non-zero +value to be true. + +There is also a set of binary comparison operators defined as +functions: + + eq + Returns the boolean truth of arg1 == arg2 + ne + Returns the boolean truth of arg1 != arg2 + lt + Returns the boolean truth of arg1 < arg2 + le + Returns the boolean truth of arg1 <= arg2 + gt + Returns the boolean truth of arg1 > arg2 + ge + Returns the boolean truth of arg1 >= arg2 + +For simpler multi-way equality tests, eq (only) accepts two or more +arguments and compares the second and subsequent to the first, +returning in effect + + arg1==arg2 || arg1==arg3 || arg1==arg4 ... + +(Unlike with || in Go, however, eq is a function call and all the +arguments will be evaluated.) + +The comparison functions work on basic types only (or named basic +types, such as "type Celsius float32"). They implement the Go rules +for comparison of values, except that size and exact type are +ignored, so any integer value, signed or unsigned, may be compared +with any other integer value. (The arithmetic value is compared, +not the bit pattern, so all negative integers are less than all +unsigned integers.) However, as usual, one may not compare an int +with a float32 and so on. + +Associated templates + +Each template is named by a string specified when it is created. Also, each +template is associated with zero or more other templates that it may invoke by +name; such associations are transitive and form a name space of templates. + +A template may use a template invocation to instantiate another associated +template; see the explanation of the "template" action above. The name must be +that of a template associated with the template that contains the invocation. + +Nested template definitions + +When parsing a template, another template may be defined and associated with the +template being parsed. Template definitions must appear at the top level of the +template, much like global variables in a Go program. + +The syntax of such definitions is to surround each template declaration with a +"define" and "end" action. + +The define action names the template being created by providing a string +constant. Here is a simple example: + + `{{define "T1"}}ONE{{end}} + {{define "T2"}}TWO{{end}} + {{define "T3"}}{{template "T1"}} {{template "T2"}}{{end}} + {{template "T3"}}` + +This defines two templates, T1 and T2, and a third T3 that invokes the other two +when it is executed. Finally it invokes T3. If executed this template will +produce the text + + ONE TWO + +By construction, a template may reside in only one association. If it's +necessary to have a template addressable from multiple associations, the +template definition must be parsed multiple times to create distinct *Template +values, or must be copied with the Clone or AddParseTree method. + +Parse may be called multiple times to assemble the various associated templates; +see the ParseFiles and ParseGlob functions and methods for simple ways to parse +related templates stored in files. + +A template may be executed directly or through ExecuteTemplate, which executes +an associated template identified by name. To invoke our example above, we +might write, + + err := tmpl.Execute(os.Stdout, "no data needed") + if err != nil { + log.Fatalf("execution failed: %s", err) + } + +or to invoke a particular template explicitly by name, + + err := tmpl.ExecuteTemplate(os.Stdout, "T2", "no data needed") + if err != nil { + log.Fatalf("execution failed: %s", err) + } + +*/ +package template diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/example_test.go b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/example_test.go new file mode 100644 index 0000000..461ec05 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/example_test.go @@ -0,0 +1,72 @@ +// 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 template_test + +import ( + "log" + "os" + + "github.com/alecthomas/template" +) + +func ExampleTemplate() { + // Define a template. + const letter = ` +Dear {{.Name}}, +{{if .Attended}} +It was a pleasure to see you at the wedding.{{else}} +It is a shame you couldn't make it to the wedding.{{end}} +{{with .Gift}}Thank you for the lovely {{.}}. +{{end}} +Best wishes, +Josie +` + + // Prepare some data to insert into the template. + type Recipient struct { + Name, Gift string + Attended bool + } + var recipients = []Recipient{ + {"Aunt Mildred", "bone china tea set", true}, + {"Uncle John", "moleskin pants", false}, + {"Cousin Rodney", "", false}, + } + + // Create a new template and parse the letter into it. + t := template.Must(template.New("letter").Parse(letter)) + + // Execute the template for each recipient. + for _, r := range recipients { + err := t.Execute(os.Stdout, r) + if err != nil { + log.Println("executing template:", err) + } + } + + // Output: + // Dear Aunt Mildred, + // + // It was a pleasure to see you at the wedding. + // Thank you for the lovely bone china tea set. + // + // Best wishes, + // Josie + // + // Dear Uncle John, + // + // It is a shame you couldn't make it to the wedding. + // Thank you for the lovely moleskin pants. + // + // Best wishes, + // Josie + // + // Dear Cousin Rodney, + // + // It is a shame you couldn't make it to the wedding. + // + // Best wishes, + // Josie +} diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/examplefiles_test.go b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/examplefiles_test.go new file mode 100644 index 0000000..0c7181d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/examplefiles_test.go @@ -0,0 +1,183 @@ +// 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 template_test + +import ( + "io" + "io/ioutil" + "log" + "os" + "path/filepath" + + "github.com/alecthomas/template" +) + +// templateFile defines the contents of a template to be stored in a file, for testing. +type templateFile struct { + name string + contents string +} + +func createTestDir(files []templateFile) string { + dir, err := ioutil.TempDir("", "template") + if err != nil { + log.Fatal(err) + } + for _, file := range files { + f, err := os.Create(filepath.Join(dir, file.name)) + if err != nil { + log.Fatal(err) + } + defer f.Close() + _, err = io.WriteString(f, file.contents) + if err != nil { + log.Fatal(err) + } + } + return dir +} + +// Here we demonstrate loading a set of templates from a directory. +func ExampleTemplate_glob() { + // Here we create a temporary directory and populate it with our sample + // template definition files; usually the template files would already + // exist in some location known to the program. + dir := createTestDir([]templateFile{ + // T0.tmpl is a plain template file that just invokes T1. + {"T0.tmpl", `T0 invokes T1: ({{template "T1"}})`}, + // T1.tmpl defines a template, T1 that invokes T2. + {"T1.tmpl", `{{define "T1"}}T1 invokes T2: ({{template "T2"}}){{end}}`}, + // T2.tmpl defines a template T2. + {"T2.tmpl", `{{define "T2"}}This is T2{{end}}`}, + }) + // Clean up after the test; another quirk of running as an example. + defer os.RemoveAll(dir) + + // pattern is the glob pattern used to find all the template files. + pattern := filepath.Join(dir, "*.tmpl") + + // Here starts the example proper. + // T0.tmpl is the first name matched, so it becomes the starting template, + // the value returned by ParseGlob. + tmpl := template.Must(template.ParseGlob(pattern)) + + err := tmpl.Execute(os.Stdout, nil) + if err != nil { + log.Fatalf("template execution: %s", err) + } + // Output: + // T0 invokes T1: (T1 invokes T2: (This is T2)) +} + +// This example demonstrates one way to share some templates +// and use them in different contexts. In this variant we add multiple driver +// templates by hand to an existing bundle of templates. +func ExampleTemplate_helpers() { + // Here we create a temporary directory and populate it with our sample + // template definition files; usually the template files would already + // exist in some location known to the program. + dir := createTestDir([]templateFile{ + // T1.tmpl defines a template, T1 that invokes T2. + {"T1.tmpl", `{{define "T1"}}T1 invokes T2: ({{template "T2"}}){{end}}`}, + // T2.tmpl defines a template T2. + {"T2.tmpl", `{{define "T2"}}This is T2{{end}}`}, + }) + // Clean up after the test; another quirk of running as an example. + defer os.RemoveAll(dir) + + // pattern is the glob pattern used to find all the template files. + pattern := filepath.Join(dir, "*.tmpl") + + // Here starts the example proper. + // Load the helpers. + templates := template.Must(template.ParseGlob(pattern)) + // Add one driver template to the bunch; we do this with an explicit template definition. + _, err := templates.Parse("{{define `driver1`}}Driver 1 calls T1: ({{template `T1`}})\n{{end}}") + if err != nil { + log.Fatal("parsing driver1: ", err) + } + // Add another driver template. + _, err = templates.Parse("{{define `driver2`}}Driver 2 calls T2: ({{template `T2`}})\n{{end}}") + if err != nil { + log.Fatal("parsing driver2: ", err) + } + // We load all the templates before execution. This package does not require + // that behavior but html/template's escaping does, so it's a good habit. + err = templates.ExecuteTemplate(os.Stdout, "driver1", nil) + if err != nil { + log.Fatalf("driver1 execution: %s", err) + } + err = templates.ExecuteTemplate(os.Stdout, "driver2", nil) + if err != nil { + log.Fatalf("driver2 execution: %s", err) + } + // Output: + // Driver 1 calls T1: (T1 invokes T2: (This is T2)) + // Driver 2 calls T2: (This is T2) +} + +// This example demonstrates how to use one group of driver +// templates with distinct sets of helper templates. +func ExampleTemplate_share() { + // Here we create a temporary directory and populate it with our sample + // template definition files; usually the template files would already + // exist in some location known to the program. + dir := createTestDir([]templateFile{ + // T0.tmpl is a plain template file that just invokes T1. + {"T0.tmpl", "T0 ({{.}} version) invokes T1: ({{template `T1`}})\n"}, + // T1.tmpl defines a template, T1 that invokes T2. Note T2 is not defined + {"T1.tmpl", `{{define "T1"}}T1 invokes T2: ({{template "T2"}}){{end}}`}, + }) + // Clean up after the test; another quirk of running as an example. + defer os.RemoveAll(dir) + + // pattern is the glob pattern used to find all the template files. + pattern := filepath.Join(dir, "*.tmpl") + + // Here starts the example proper. + // Load the drivers. + drivers := template.Must(template.ParseGlob(pattern)) + + // We must define an implementation of the T2 template. First we clone + // the drivers, then add a definition of T2 to the template name space. + + // 1. Clone the helper set to create a new name space from which to run them. + first, err := drivers.Clone() + if err != nil { + log.Fatal("cloning helpers: ", err) + } + // 2. Define T2, version A, and parse it. + _, err = first.Parse("{{define `T2`}}T2, version A{{end}}") + if err != nil { + log.Fatal("parsing T2: ", err) + } + + // Now repeat the whole thing, using a different version of T2. + // 1. Clone the drivers. + second, err := drivers.Clone() + if err != nil { + log.Fatal("cloning drivers: ", err) + } + // 2. Define T2, version B, and parse it. + _, err = second.Parse("{{define `T2`}}T2, version B{{end}}") + if err != nil { + log.Fatal("parsing T2: ", err) + } + + // Execute the templates in the reverse order to verify the + // first is unaffected by the second. + err = second.ExecuteTemplate(os.Stdout, "T0.tmpl", "second") + if err != nil { + log.Fatalf("second execution: %s", err) + } + err = first.ExecuteTemplate(os.Stdout, "T0.tmpl", "first") + if err != nil { + log.Fatalf("first: execution: %s", err) + } + + // Output: + // T0 (second version) invokes T1: (T1 invokes T2: (T2, version B)) + // T0 (first version) invokes T1: (T1 invokes T2: (T2, version A)) +} diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/examplefunc_test.go b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/examplefunc_test.go new file mode 100644 index 0000000..8767cfd --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/examplefunc_test.go @@ -0,0 +1,55 @@ +// 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 template_test + +import ( + "log" + "os" + "strings" + + "github.com/alecthomas/template" +) + +// This example demonstrates a custom function to process template text. +// It installs the strings.Title function and uses it to +// Make Title Text Look Good In Our Template's Output. +func ExampleTemplate_func() { + // First we create a FuncMap with which to register the function. + funcMap := template.FuncMap{ + // The name "title" is what the function will be called in the template text. + "title": strings.Title, + } + + // A simple template definition to test our function. + // We print the input text several ways: + // - the original + // - title-cased + // - title-cased and then printed with %q + // - printed with %q and then title-cased. + const templateText = ` +Input: {{printf "%q" .}} +Output 0: {{title .}} +Output 1: {{title . | printf "%q"}} +Output 2: {{printf "%q" . | title}} +` + + // Create a template, add the function map, and parse the text. + tmpl, err := template.New("titleTest").Funcs(funcMap).Parse(templateText) + if err != nil { + log.Fatalf("parsing: %s", err) + } + + // Run the template to verify the output. + err = tmpl.Execute(os.Stdout, "the go programming language") + if err != nil { + log.Fatalf("execution: %s", err) + } + + // Output: + // Input: "the go programming language" + // Output 0: The Go Programming Language + // Output 1: "The Go Programming Language" + // Output 2: "The Go Programming Language" +} diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/exec.go b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/exec.go new file mode 100644 index 0000000..c3078e5 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/exec.go @@ -0,0 +1,845 @@ +// 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 template + +import ( + "bytes" + "fmt" + "io" + "reflect" + "runtime" + "sort" + "strings" + + "github.com/alecthomas/template/parse" +) + +// state represents the state of an execution. It's not part of the +// template so that multiple executions of the same template +// can execute in parallel. +type state struct { + tmpl *Template + wr io.Writer + node parse.Node // current node, for errors + vars []variable // push-down stack of variable values. +} + +// variable holds the dynamic value of a variable such as $, $x etc. +type variable struct { + name string + value reflect.Value +} + +// push pushes a new variable on the stack. +func (s *state) push(name string, value reflect.Value) { + s.vars = append(s.vars, variable{name, value}) +} + +// mark returns the length of the variable stack. +func (s *state) mark() int { + return len(s.vars) +} + +// pop pops the variable stack up to the mark. +func (s *state) pop(mark int) { + s.vars = s.vars[0:mark] +} + +// setVar overwrites the top-nth variable on the stack. Used by range iterations. +func (s *state) setVar(n int, value reflect.Value) { + s.vars[len(s.vars)-n].value = value +} + +// varValue returns the value of the named variable. +func (s *state) varValue(name string) reflect.Value { + for i := s.mark() - 1; i >= 0; i-- { + if s.vars[i].name == name { + return s.vars[i].value + } + } + s.errorf("undefined variable: %s", name) + return zero +} + +var zero reflect.Value + +// at marks the state to be on node n, for error reporting. +func (s *state) at(node parse.Node) { + s.node = node +} + +// doublePercent returns the string with %'s replaced by %%, if necessary, +// so it can be used safely inside a Printf format string. +func doublePercent(str string) string { + if strings.Contains(str, "%") { + str = strings.Replace(str, "%", "%%", -1) + } + return str +} + +// errorf formats the error and terminates processing. +func (s *state) errorf(format string, args ...interface{}) { + name := doublePercent(s.tmpl.Name()) + if s.node == nil { + format = fmt.Sprintf("template: %s: %s", name, format) + } else { + location, context := s.tmpl.ErrorContext(s.node) + format = fmt.Sprintf("template: %s: executing %q at <%s>: %s", location, name, doublePercent(context), format) + } + panic(fmt.Errorf(format, args...)) +} + +// errRecover is the handler that turns panics into returns from the top +// level of Parse. +func errRecover(errp *error) { + e := recover() + if e != nil { + switch err := e.(type) { + case runtime.Error: + panic(e) + case error: + *errp = err + default: + panic(e) + } + } +} + +// ExecuteTemplate applies the template associated with t that has the given name +// to the specified data object and writes the output to wr. +// If an error occurs executing the template or writing its output, +// execution stops, but partial results may already have been written to +// the output writer. +// A template may be executed safely in parallel. +func (t *Template) ExecuteTemplate(wr io.Writer, name string, data interface{}) error { + tmpl := t.tmpl[name] + if tmpl == nil { + return fmt.Errorf("template: no template %q associated with template %q", name, t.name) + } + return tmpl.Execute(wr, data) +} + +// Execute applies a parsed template to the specified data object, +// and writes the output to wr. +// If an error occurs executing the template or writing its output, +// execution stops, but partial results may already have been written to +// the output writer. +// A template may be executed safely in parallel. +func (t *Template) Execute(wr io.Writer, data interface{}) (err error) { + defer errRecover(&err) + value := reflect.ValueOf(data) + state := &state{ + tmpl: t, + wr: wr, + vars: []variable{{"$", value}}, + } + t.init() + if t.Tree == nil || t.Root == nil { + var b bytes.Buffer + for name, tmpl := range t.tmpl { + if tmpl.Tree == nil || tmpl.Root == nil { + continue + } + if b.Len() > 0 { + b.WriteString(", ") + } + fmt.Fprintf(&b, "%q", name) + } + var s string + if b.Len() > 0 { + s = "; defined templates are: " + b.String() + } + state.errorf("%q is an incomplete or empty template%s", t.Name(), s) + } + state.walk(value, t.Root) + return +} + +// Walk functions step through the major pieces of the template structure, +// generating output as they go. +func (s *state) walk(dot reflect.Value, node parse.Node) { + s.at(node) + switch node := node.(type) { + case *parse.ActionNode: + // Do not pop variables so they persist until next end. + // Also, if the action declares variables, don't print the result. + val := s.evalPipeline(dot, node.Pipe) + if len(node.Pipe.Decl) == 0 { + s.printValue(node, val) + } + case *parse.IfNode: + s.walkIfOrWith(parse.NodeIf, dot, node.Pipe, node.List, node.ElseList) + case *parse.ListNode: + for _, node := range node.Nodes { + s.walk(dot, node) + } + case *parse.RangeNode: + s.walkRange(dot, node) + case *parse.TemplateNode: + s.walkTemplate(dot, node) + case *parse.TextNode: + if _, err := s.wr.Write(node.Text); err != nil { + s.errorf("%s", err) + } + case *parse.WithNode: + s.walkIfOrWith(parse.NodeWith, dot, node.Pipe, node.List, node.ElseList) + default: + s.errorf("unknown node: %s", node) + } +} + +// walkIfOrWith walks an 'if' or 'with' node. The two control structures +// are identical in behavior except that 'with' sets dot. +func (s *state) walkIfOrWith(typ parse.NodeType, dot reflect.Value, pipe *parse.PipeNode, list, elseList *parse.ListNode) { + defer s.pop(s.mark()) + val := s.evalPipeline(dot, pipe) + truth, ok := isTrue(val) + if !ok { + s.errorf("if/with can't use %v", val) + } + if truth { + if typ == parse.NodeWith { + s.walk(val, list) + } else { + s.walk(dot, list) + } + } else if elseList != nil { + s.walk(dot, elseList) + } +} + +// isTrue reports whether the value is 'true', in the sense of not the zero of its type, +// and whether the value has a meaningful truth value. +func isTrue(val reflect.Value) (truth, ok bool) { + if !val.IsValid() { + // Something like var x interface{}, never set. It's a form of nil. + return false, true + } + switch val.Kind() { + case reflect.Array, reflect.Map, reflect.Slice, reflect.String: + truth = val.Len() > 0 + case reflect.Bool: + truth = val.Bool() + case reflect.Complex64, reflect.Complex128: + truth = val.Complex() != 0 + case reflect.Chan, reflect.Func, reflect.Ptr, reflect.Interface: + truth = !val.IsNil() + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + truth = val.Int() != 0 + case reflect.Float32, reflect.Float64: + truth = val.Float() != 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + truth = val.Uint() != 0 + case reflect.Struct: + truth = true // Struct values are always true. + default: + return + } + return truth, true +} + +func (s *state) walkRange(dot reflect.Value, r *parse.RangeNode) { + s.at(r) + defer s.pop(s.mark()) + val, _ := indirect(s.evalPipeline(dot, r.Pipe)) + // mark top of stack before any variables in the body are pushed. + mark := s.mark() + oneIteration := func(index, elem reflect.Value) { + // Set top var (lexically the second if there are two) to the element. + if len(r.Pipe.Decl) > 0 { + s.setVar(1, elem) + } + // Set next var (lexically the first if there are two) to the index. + if len(r.Pipe.Decl) > 1 { + s.setVar(2, index) + } + s.walk(elem, r.List) + s.pop(mark) + } + switch val.Kind() { + case reflect.Array, reflect.Slice: + if val.Len() == 0 { + break + } + for i := 0; i < val.Len(); i++ { + oneIteration(reflect.ValueOf(i), val.Index(i)) + } + return + case reflect.Map: + if val.Len() == 0 { + break + } + for _, key := range sortKeys(val.MapKeys()) { + oneIteration(key, val.MapIndex(key)) + } + return + case reflect.Chan: + if val.IsNil() { + break + } + i := 0 + for ; ; i++ { + elem, ok := val.Recv() + if !ok { + break + } + oneIteration(reflect.ValueOf(i), elem) + } + if i == 0 { + break + } + return + case reflect.Invalid: + break // An invalid value is likely a nil map, etc. and acts like an empty map. + default: + s.errorf("range can't iterate over %v", val) + } + if r.ElseList != nil { + s.walk(dot, r.ElseList) + } +} + +func (s *state) walkTemplate(dot reflect.Value, t *parse.TemplateNode) { + s.at(t) + tmpl := s.tmpl.tmpl[t.Name] + if tmpl == nil { + s.errorf("template %q not defined", t.Name) + } + // Variables declared by the pipeline persist. + dot = s.evalPipeline(dot, t.Pipe) + newState := *s + newState.tmpl = tmpl + // No dynamic scoping: template invocations inherit no variables. + newState.vars = []variable{{"$", dot}} + newState.walk(dot, tmpl.Root) +} + +// Eval functions evaluate pipelines, commands, and their elements and extract +// values from the data structure by examining fields, calling methods, and so on. +// The printing of those values happens only through walk functions. + +// evalPipeline returns the value acquired by evaluating a pipeline. If the +// pipeline has a variable declaration, the variable will be pushed on the +// stack. Callers should therefore pop the stack after they are finished +// executing commands depending on the pipeline value. +func (s *state) evalPipeline(dot reflect.Value, pipe *parse.PipeNode) (value reflect.Value) { + if pipe == nil { + return + } + s.at(pipe) + for _, cmd := range pipe.Cmds { + value = s.evalCommand(dot, cmd, value) // previous value is this one's final arg. + // If the object has type interface{}, dig down one level to the thing inside. + if value.Kind() == reflect.Interface && value.Type().NumMethod() == 0 { + value = reflect.ValueOf(value.Interface()) // lovely! + } + } + for _, variable := range pipe.Decl { + s.push(variable.Ident[0], value) + } + return value +} + +func (s *state) notAFunction(args []parse.Node, final reflect.Value) { + if len(args) > 1 || final.IsValid() { + s.errorf("can't give argument to non-function %s", args[0]) + } +} + +func (s *state) evalCommand(dot reflect.Value, cmd *parse.CommandNode, final reflect.Value) reflect.Value { + firstWord := cmd.Args[0] + switch n := firstWord.(type) { + case *parse.FieldNode: + return s.evalFieldNode(dot, n, cmd.Args, final) + case *parse.ChainNode: + return s.evalChainNode(dot, n, cmd.Args, final) + case *parse.IdentifierNode: + // Must be a function. + return s.evalFunction(dot, n, cmd, cmd.Args, final) + case *parse.PipeNode: + // Parenthesized pipeline. The arguments are all inside the pipeline; final is ignored. + return s.evalPipeline(dot, n) + case *parse.VariableNode: + return s.evalVariableNode(dot, n, cmd.Args, final) + } + s.at(firstWord) + s.notAFunction(cmd.Args, final) + switch word := firstWord.(type) { + case *parse.BoolNode: + return reflect.ValueOf(word.True) + case *parse.DotNode: + return dot + case *parse.NilNode: + s.errorf("nil is not a command") + case *parse.NumberNode: + return s.idealConstant(word) + case *parse.StringNode: + return reflect.ValueOf(word.Text) + } + s.errorf("can't evaluate command %q", firstWord) + panic("not reached") +} + +// idealConstant is called to return the value of a number in a context where +// we don't know the type. In that case, the syntax of the number tells us +// its type, and we use Go rules to resolve. Note there is no such thing as +// a uint ideal constant in this situation - the value must be of int type. +func (s *state) idealConstant(constant *parse.NumberNode) reflect.Value { + // These are ideal constants but we don't know the type + // and we have no context. (If it was a method argument, + // we'd know what we need.) The syntax guides us to some extent. + s.at(constant) + switch { + case constant.IsComplex: + return reflect.ValueOf(constant.Complex128) // incontrovertible. + case constant.IsFloat && !isHexConstant(constant.Text) && strings.IndexAny(constant.Text, ".eE") >= 0: + return reflect.ValueOf(constant.Float64) + case constant.IsInt: + n := int(constant.Int64) + if int64(n) != constant.Int64 { + s.errorf("%s overflows int", constant.Text) + } + return reflect.ValueOf(n) + case constant.IsUint: + s.errorf("%s overflows int", constant.Text) + } + return zero +} + +func isHexConstant(s string) bool { + return len(s) > 2 && s[0] == '0' && (s[1] == 'x' || s[1] == 'X') +} + +func (s *state) evalFieldNode(dot reflect.Value, field *parse.FieldNode, args []parse.Node, final reflect.Value) reflect.Value { + s.at(field) + return s.evalFieldChain(dot, dot, field, field.Ident, args, final) +} + +func (s *state) evalChainNode(dot reflect.Value, chain *parse.ChainNode, args []parse.Node, final reflect.Value) reflect.Value { + s.at(chain) + // (pipe).Field1.Field2 has pipe as .Node, fields as .Field. Eval the pipeline, then the fields. + pipe := s.evalArg(dot, nil, chain.Node) + if len(chain.Field) == 0 { + s.errorf("internal error: no fields in evalChainNode") + } + return s.evalFieldChain(dot, pipe, chain, chain.Field, args, final) +} + +func (s *state) evalVariableNode(dot reflect.Value, variable *parse.VariableNode, args []parse.Node, final reflect.Value) reflect.Value { + // $x.Field has $x as the first ident, Field as the second. Eval the var, then the fields. + s.at(variable) + value := s.varValue(variable.Ident[0]) + if len(variable.Ident) == 1 { + s.notAFunction(args, final) + return value + } + return s.evalFieldChain(dot, value, variable, variable.Ident[1:], args, final) +} + +// evalFieldChain evaluates .X.Y.Z possibly followed by arguments. +// dot is the environment in which to evaluate arguments, while +// receiver is the value being walked along the chain. +func (s *state) evalFieldChain(dot, receiver reflect.Value, node parse.Node, ident []string, args []parse.Node, final reflect.Value) reflect.Value { + n := len(ident) + for i := 0; i < n-1; i++ { + receiver = s.evalField(dot, ident[i], node, nil, zero, receiver) + } + // Now if it's a method, it gets the arguments. + return s.evalField(dot, ident[n-1], node, args, final, receiver) +} + +func (s *state) evalFunction(dot reflect.Value, node *parse.IdentifierNode, cmd parse.Node, args []parse.Node, final reflect.Value) reflect.Value { + s.at(node) + name := node.Ident + function, ok := findFunction(name, s.tmpl) + if !ok { + s.errorf("%q is not a defined function", name) + } + return s.evalCall(dot, function, cmd, name, args, final) +} + +// evalField evaluates an expression like (.Field) or (.Field arg1 arg2). +// The 'final' argument represents the return value from the preceding +// value of the pipeline, if any. +func (s *state) evalField(dot reflect.Value, fieldName string, node parse.Node, args []parse.Node, final, receiver reflect.Value) reflect.Value { + if !receiver.IsValid() { + return zero + } + typ := receiver.Type() + receiver, _ = indirect(receiver) + // Unless it's an interface, need to get to a value of type *T to guarantee + // we see all methods of T and *T. + ptr := receiver + if ptr.Kind() != reflect.Interface && ptr.CanAddr() { + ptr = ptr.Addr() + } + if method := ptr.MethodByName(fieldName); method.IsValid() { + return s.evalCall(dot, method, node, fieldName, args, final) + } + hasArgs := len(args) > 1 || final.IsValid() + // It's not a method; must be a field of a struct or an element of a map. The receiver must not be nil. + receiver, isNil := indirect(receiver) + if isNil { + s.errorf("nil pointer evaluating %s.%s", typ, fieldName) + } + switch receiver.Kind() { + case reflect.Struct: + tField, ok := receiver.Type().FieldByName(fieldName) + if ok { + field := receiver.FieldByIndex(tField.Index) + if tField.PkgPath != "" { // field is unexported + s.errorf("%s is an unexported field of struct type %s", fieldName, typ) + } + // If it's a function, we must call it. + if hasArgs { + s.errorf("%s has arguments but cannot be invoked as function", fieldName) + } + return field + } + s.errorf("%s is not a field of struct type %s", fieldName, typ) + case reflect.Map: + // If it's a map, attempt to use the field name as a key. + nameVal := reflect.ValueOf(fieldName) + if nameVal.Type().AssignableTo(receiver.Type().Key()) { + if hasArgs { + s.errorf("%s is not a method but has arguments", fieldName) + } + return receiver.MapIndex(nameVal) + } + } + s.errorf("can't evaluate field %s in type %s", fieldName, typ) + panic("not reached") +} + +var ( + errorType = reflect.TypeOf((*error)(nil)).Elem() + fmtStringerType = reflect.TypeOf((*fmt.Stringer)(nil)).Elem() +) + +// evalCall executes a function or method call. If it's a method, fun already has the receiver bound, so +// it looks just like a function call. The arg list, if non-nil, includes (in the manner of the shell), arg[0] +// as the function itself. +func (s *state) evalCall(dot, fun reflect.Value, node parse.Node, name string, args []parse.Node, final reflect.Value) reflect.Value { + if args != nil { + args = args[1:] // Zeroth arg is function name/node; not passed to function. + } + typ := fun.Type() + numIn := len(args) + if final.IsValid() { + numIn++ + } + numFixed := len(args) + if typ.IsVariadic() { + numFixed = typ.NumIn() - 1 // last arg is the variadic one. + if numIn < numFixed { + s.errorf("wrong number of args for %s: want at least %d got %d", name, typ.NumIn()-1, len(args)) + } + } else if numIn < typ.NumIn()-1 || !typ.IsVariadic() && numIn != typ.NumIn() { + s.errorf("wrong number of args for %s: want %d got %d", name, typ.NumIn(), len(args)) + } + if !goodFunc(typ) { + // TODO: This could still be a confusing error; maybe goodFunc should provide info. + s.errorf("can't call method/function %q with %d results", name, typ.NumOut()) + } + // Build the arg list. + argv := make([]reflect.Value, numIn) + // Args must be evaluated. Fixed args first. + i := 0 + for ; i < numFixed && i < len(args); i++ { + argv[i] = s.evalArg(dot, typ.In(i), args[i]) + } + // Now the ... args. + if typ.IsVariadic() { + argType := typ.In(typ.NumIn() - 1).Elem() // Argument is a slice. + for ; i < len(args); i++ { + argv[i] = s.evalArg(dot, argType, args[i]) + } + } + // Add final value if necessary. + if final.IsValid() { + t := typ.In(typ.NumIn() - 1) + if typ.IsVariadic() { + t = t.Elem() + } + argv[i] = s.validateType(final, t) + } + result := fun.Call(argv) + // If we have an error that is not nil, stop execution and return that error to the caller. + if len(result) == 2 && !result[1].IsNil() { + s.at(node) + s.errorf("error calling %s: %s", name, result[1].Interface().(error)) + } + return result[0] +} + +// canBeNil reports whether an untyped nil can be assigned to the type. See reflect.Zero. +func canBeNil(typ reflect.Type) bool { + switch typ.Kind() { + case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: + return true + } + return false +} + +// validateType guarantees that the value is valid and assignable to the type. +func (s *state) validateType(value reflect.Value, typ reflect.Type) reflect.Value { + if !value.IsValid() { + if typ == nil || canBeNil(typ) { + // An untyped nil interface{}. Accept as a proper nil value. + return reflect.Zero(typ) + } + s.errorf("invalid value; expected %s", typ) + } + if typ != nil && !value.Type().AssignableTo(typ) { + if value.Kind() == reflect.Interface && !value.IsNil() { + value = value.Elem() + if value.Type().AssignableTo(typ) { + return value + } + // fallthrough + } + // Does one dereference or indirection work? We could do more, as we + // do with method receivers, but that gets messy and method receivers + // are much more constrained, so it makes more sense there than here. + // Besides, one is almost always all you need. + switch { + case value.Kind() == reflect.Ptr && value.Type().Elem().AssignableTo(typ): + value = value.Elem() + if !value.IsValid() { + s.errorf("dereference of nil pointer of type %s", typ) + } + case reflect.PtrTo(value.Type()).AssignableTo(typ) && value.CanAddr(): + value = value.Addr() + default: + s.errorf("wrong type for value; expected %s; got %s", typ, value.Type()) + } + } + return value +} + +func (s *state) evalArg(dot reflect.Value, typ reflect.Type, n parse.Node) reflect.Value { + s.at(n) + switch arg := n.(type) { + case *parse.DotNode: + return s.validateType(dot, typ) + case *parse.NilNode: + if canBeNil(typ) { + return reflect.Zero(typ) + } + s.errorf("cannot assign nil to %s", typ) + case *parse.FieldNode: + return s.validateType(s.evalFieldNode(dot, arg, []parse.Node{n}, zero), typ) + case *parse.VariableNode: + return s.validateType(s.evalVariableNode(dot, arg, nil, zero), typ) + case *parse.PipeNode: + return s.validateType(s.evalPipeline(dot, arg), typ) + case *parse.IdentifierNode: + return s.evalFunction(dot, arg, arg, nil, zero) + case *parse.ChainNode: + return s.validateType(s.evalChainNode(dot, arg, nil, zero), typ) + } + switch typ.Kind() { + case reflect.Bool: + return s.evalBool(typ, n) + case reflect.Complex64, reflect.Complex128: + return s.evalComplex(typ, n) + case reflect.Float32, reflect.Float64: + return s.evalFloat(typ, n) + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return s.evalInteger(typ, n) + case reflect.Interface: + if typ.NumMethod() == 0 { + return s.evalEmptyInterface(dot, n) + } + case reflect.String: + return s.evalString(typ, n) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return s.evalUnsignedInteger(typ, n) + } + s.errorf("can't handle %s for arg of type %s", n, typ) + panic("not reached") +} + +func (s *state) evalBool(typ reflect.Type, n parse.Node) reflect.Value { + s.at(n) + if n, ok := n.(*parse.BoolNode); ok { + value := reflect.New(typ).Elem() + value.SetBool(n.True) + return value + } + s.errorf("expected bool; found %s", n) + panic("not reached") +} + +func (s *state) evalString(typ reflect.Type, n parse.Node) reflect.Value { + s.at(n) + if n, ok := n.(*parse.StringNode); ok { + value := reflect.New(typ).Elem() + value.SetString(n.Text) + return value + } + s.errorf("expected string; found %s", n) + panic("not reached") +} + +func (s *state) evalInteger(typ reflect.Type, n parse.Node) reflect.Value { + s.at(n) + if n, ok := n.(*parse.NumberNode); ok && n.IsInt { + value := reflect.New(typ).Elem() + value.SetInt(n.Int64) + return value + } + s.errorf("expected integer; found %s", n) + panic("not reached") +} + +func (s *state) evalUnsignedInteger(typ reflect.Type, n parse.Node) reflect.Value { + s.at(n) + if n, ok := n.(*parse.NumberNode); ok && n.IsUint { + value := reflect.New(typ).Elem() + value.SetUint(n.Uint64) + return value + } + s.errorf("expected unsigned integer; found %s", n) + panic("not reached") +} + +func (s *state) evalFloat(typ reflect.Type, n parse.Node) reflect.Value { + s.at(n) + if n, ok := n.(*parse.NumberNode); ok && n.IsFloat { + value := reflect.New(typ).Elem() + value.SetFloat(n.Float64) + return value + } + s.errorf("expected float; found %s", n) + panic("not reached") +} + +func (s *state) evalComplex(typ reflect.Type, n parse.Node) reflect.Value { + if n, ok := n.(*parse.NumberNode); ok && n.IsComplex { + value := reflect.New(typ).Elem() + value.SetComplex(n.Complex128) + return value + } + s.errorf("expected complex; found %s", n) + panic("not reached") +} + +func (s *state) evalEmptyInterface(dot reflect.Value, n parse.Node) reflect.Value { + s.at(n) + switch n := n.(type) { + case *parse.BoolNode: + return reflect.ValueOf(n.True) + case *parse.DotNode: + return dot + case *parse.FieldNode: + return s.evalFieldNode(dot, n, nil, zero) + case *parse.IdentifierNode: + return s.evalFunction(dot, n, n, nil, zero) + case *parse.NilNode: + // NilNode is handled in evalArg, the only place that calls here. + s.errorf("evalEmptyInterface: nil (can't happen)") + case *parse.NumberNode: + return s.idealConstant(n) + case *parse.StringNode: + return reflect.ValueOf(n.Text) + case *parse.VariableNode: + return s.evalVariableNode(dot, n, nil, zero) + case *parse.PipeNode: + return s.evalPipeline(dot, n) + } + s.errorf("can't handle assignment of %s to empty interface argument", n) + panic("not reached") +} + +// indirect returns the item at the end of indirection, and a bool to indicate if it's nil. +// We indirect through pointers and empty interfaces (only) because +// non-empty interfaces have methods we might need. +func indirect(v reflect.Value) (rv reflect.Value, isNil bool) { + for ; v.Kind() == reflect.Ptr || v.Kind() == reflect.Interface; v = v.Elem() { + if v.IsNil() { + return v, true + } + if v.Kind() == reflect.Interface && v.NumMethod() > 0 { + break + } + } + return v, false +} + +// printValue writes the textual representation of the value to the output of +// the template. +func (s *state) printValue(n parse.Node, v reflect.Value) { + s.at(n) + iface, ok := printableValue(v) + if !ok { + s.errorf("can't print %s of type %s", n, v.Type()) + } + fmt.Fprint(s.wr, iface) +} + +// printableValue returns the, possibly indirected, interface value inside v that +// is best for a call to formatted printer. +func printableValue(v reflect.Value) (interface{}, bool) { + if v.Kind() == reflect.Ptr { + v, _ = indirect(v) // fmt.Fprint handles nil. + } + if !v.IsValid() { + return "", true + } + + if !v.Type().Implements(errorType) && !v.Type().Implements(fmtStringerType) { + if v.CanAddr() && (reflect.PtrTo(v.Type()).Implements(errorType) || reflect.PtrTo(v.Type()).Implements(fmtStringerType)) { + v = v.Addr() + } else { + switch v.Kind() { + case reflect.Chan, reflect.Func: + return nil, false + } + } + } + return v.Interface(), true +} + +// Types to help sort the keys in a map for reproducible output. + +type rvs []reflect.Value + +func (x rvs) Len() int { return len(x) } +func (x rvs) Swap(i, j int) { x[i], x[j] = x[j], x[i] } + +type rvInts struct{ rvs } + +func (x rvInts) Less(i, j int) bool { return x.rvs[i].Int() < x.rvs[j].Int() } + +type rvUints struct{ rvs } + +func (x rvUints) Less(i, j int) bool { return x.rvs[i].Uint() < x.rvs[j].Uint() } + +type rvFloats struct{ rvs } + +func (x rvFloats) Less(i, j int) bool { return x.rvs[i].Float() < x.rvs[j].Float() } + +type rvStrings struct{ rvs } + +func (x rvStrings) Less(i, j int) bool { return x.rvs[i].String() < x.rvs[j].String() } + +// sortKeys sorts (if it can) the slice of reflect.Values, which is a slice of map keys. +func sortKeys(v []reflect.Value) []reflect.Value { + if len(v) <= 1 { + return v + } + switch v[0].Kind() { + case reflect.Float32, reflect.Float64: + sort.Sort(rvFloats{v}) + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + sort.Sort(rvInts{v}) + case reflect.String: + sort.Sort(rvStrings{v}) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + sort.Sort(rvUints{v}) + } + return v +} diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/exec_test.go b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/exec_test.go new file mode 100644 index 0000000..69c213e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/exec_test.go @@ -0,0 +1,1044 @@ +// 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 template + +import ( + "bytes" + "errors" + "flag" + "fmt" + "reflect" + "strings" + "testing" +) + +var debug = flag.Bool("debug", false, "show the errors produced by the tests") + +// T has lots of interesting pieces to use to test execution. +type T struct { + // Basics + True bool + I int + U16 uint16 + X string + FloatZero float64 + ComplexZero complex128 + // Nested structs. + U *U + // Struct with String method. + V0 V + V1, V2 *V + // Struct with Error method. + W0 W + W1, W2 *W + // Slices + SI []int + SIEmpty []int + SB []bool + // Maps + MSI map[string]int + MSIone map[string]int // one element, for deterministic output + MSIEmpty map[string]int + MXI map[interface{}]int + MII map[int]int + SMSI []map[string]int + // Empty interfaces; used to see if we can dig inside one. + Empty0 interface{} // nil + Empty1 interface{} + Empty2 interface{} + Empty3 interface{} + Empty4 interface{} + // Non-empty interface. + NonEmptyInterface I + // Stringer. + Str fmt.Stringer + Err error + // Pointers + PI *int + PS *string + PSI *[]int + NIL *int + // Function (not method) + BinaryFunc func(string, string) string + VariadicFunc func(...string) string + VariadicFuncInt func(int, ...string) string + NilOKFunc func(*int) bool + ErrFunc func() (string, error) + // Template to test evaluation of templates. + Tmpl *Template + // Unexported field; cannot be accessed by template. + unexported int +} + +type U struct { + V string +} + +type V struct { + j int +} + +func (v *V) String() string { + if v == nil { + return "nilV" + } + return fmt.Sprintf("<%d>", v.j) +} + +type W struct { + k int +} + +func (w *W) Error() string { + if w == nil { + return "nilW" + } + return fmt.Sprintf("[%d]", w.k) +} + +var tVal = &T{ + True: true, + I: 17, + U16: 16, + X: "x", + U: &U{"v"}, + V0: V{6666}, + V1: &V{7777}, // leave V2 as nil + W0: W{888}, + W1: &W{999}, // leave W2 as nil + SI: []int{3, 4, 5}, + SB: []bool{true, false}, + MSI: map[string]int{"one": 1, "two": 2, "three": 3}, + MSIone: map[string]int{"one": 1}, + MXI: map[interface{}]int{"one": 1}, + MII: map[int]int{1: 1}, + SMSI: []map[string]int{ + {"one": 1, "two": 2}, + {"eleven": 11, "twelve": 12}, + }, + Empty1: 3, + Empty2: "empty2", + Empty3: []int{7, 8}, + Empty4: &U{"UinEmpty"}, + NonEmptyInterface: new(T), + Str: bytes.NewBuffer([]byte("foozle")), + Err: errors.New("erroozle"), + PI: newInt(23), + PS: newString("a string"), + PSI: newIntSlice(21, 22, 23), + BinaryFunc: func(a, b string) string { return fmt.Sprintf("[%s=%s]", a, b) }, + VariadicFunc: func(s ...string) string { return fmt.Sprint("<", strings.Join(s, "+"), ">") }, + VariadicFuncInt: func(a int, s ...string) string { return fmt.Sprint(a, "=<", strings.Join(s, "+"), ">") }, + NilOKFunc: func(s *int) bool { return s == nil }, + ErrFunc: func() (string, error) { return "bla", nil }, + Tmpl: Must(New("x").Parse("test template")), // "x" is the value of .X +} + +// A non-empty interface. +type I interface { + Method0() string +} + +var iVal I = tVal + +// Helpers for creation. +func newInt(n int) *int { + return &n +} + +func newString(s string) *string { + return &s +} + +func newIntSlice(n ...int) *[]int { + p := new([]int) + *p = make([]int, len(n)) + copy(*p, n) + return p +} + +// Simple methods with and without arguments. +func (t *T) Method0() string { + return "M0" +} + +func (t *T) Method1(a int) int { + return a +} + +func (t *T) Method2(a uint16, b string) string { + return fmt.Sprintf("Method2: %d %s", a, b) +} + +func (t *T) Method3(v interface{}) string { + return fmt.Sprintf("Method3: %v", v) +} + +func (t *T) Copy() *T { + n := new(T) + *n = *t + return n +} + +func (t *T) MAdd(a int, b []int) []int { + v := make([]int, len(b)) + for i, x := range b { + v[i] = x + a + } + return v +} + +var myError = errors.New("my error") + +// MyError returns a value and an error according to its argument. +func (t *T) MyError(error bool) (bool, error) { + if error { + return true, myError + } + return false, nil +} + +// A few methods to test chaining. +func (t *T) GetU() *U { + return t.U +} + +func (u *U) TrueFalse(b bool) string { + if b { + return "true" + } + return "" +} + +func typeOf(arg interface{}) string { + return fmt.Sprintf("%T", arg) +} + +type execTest struct { + name string + input string + output string + data interface{} + ok bool +} + +// bigInt and bigUint are hex string representing numbers either side +// of the max int boundary. +// We do it this way so the test doesn't depend on ints being 32 bits. +var ( + bigInt = fmt.Sprintf("0x%x", int(1<", tVal, true}, + {"map .one interface", "{{.MXI.one}}", "1", tVal, true}, + {"map .WRONG args", "{{.MSI.one 1}}", "", tVal, false}, + {"map .WRONG type", "{{.MII.one}}", "", tVal, false}, + + // Dots of all kinds to test basic evaluation. + {"dot int", "<{{.}}>", "<13>", 13, true}, + {"dot uint", "<{{.}}>", "<14>", uint(14), true}, + {"dot float", "<{{.}}>", "<15.1>", 15.1, true}, + {"dot bool", "<{{.}}>", "", true, true}, + {"dot complex", "<{{.}}>", "<(16.2-17i)>", 16.2 - 17i, true}, + {"dot string", "<{{.}}>", "", "hello", true}, + {"dot slice", "<{{.}}>", "<[-1 -2 -3]>", []int{-1, -2, -3}, true}, + {"dot map", "<{{.}}>", "", map[string]int{"two": 22}, true}, + {"dot struct", "<{{.}}>", "<{7 seven}>", struct { + a int + b string + }{7, "seven"}, true}, + + // Variables. + {"$ int", "{{$}}", "123", 123, true}, + {"$.I", "{{$.I}}", "17", tVal, true}, + {"$.U.V", "{{$.U.V}}", "v", tVal, true}, + {"declare in action", "{{$x := $.U.V}}{{$x}}", "v", tVal, true}, + + // Type with String method. + {"V{6666}.String()", "-{{.V0}}-", "-<6666>-", tVal, true}, + {"&V{7777}.String()", "-{{.V1}}-", "-<7777>-", tVal, true}, + {"(*V)(nil).String()", "-{{.V2}}-", "-nilV-", tVal, true}, + + // Type with Error method. + {"W{888}.Error()", "-{{.W0}}-", "-[888]-", tVal, true}, + {"&W{999}.Error()", "-{{.W1}}-", "-[999]-", tVal, true}, + {"(*W)(nil).Error()", "-{{.W2}}-", "-nilW-", tVal, true}, + + // Pointers. + {"*int", "{{.PI}}", "23", tVal, true}, + {"*string", "{{.PS}}", "a string", tVal, true}, + {"*[]int", "{{.PSI}}", "[21 22 23]", tVal, true}, + {"*[]int[1]", "{{index .PSI 1}}", "22", tVal, true}, + {"NIL", "{{.NIL}}", "", tVal, true}, + + // Empty interfaces holding values. + {"empty nil", "{{.Empty0}}", "", tVal, true}, + {"empty with int", "{{.Empty1}}", "3", tVal, true}, + {"empty with string", "{{.Empty2}}", "empty2", tVal, true}, + {"empty with slice", "{{.Empty3}}", "[7 8]", tVal, true}, + {"empty with struct", "{{.Empty4}}", "{UinEmpty}", tVal, true}, + {"empty with struct, field", "{{.Empty4.V}}", "UinEmpty", tVal, true}, + + // Method calls. + {".Method0", "-{{.Method0}}-", "-M0-", tVal, true}, + {".Method1(1234)", "-{{.Method1 1234}}-", "-1234-", tVal, true}, + {".Method1(.I)", "-{{.Method1 .I}}-", "-17-", tVal, true}, + {".Method2(3, .X)", "-{{.Method2 3 .X}}-", "-Method2: 3 x-", tVal, true}, + {".Method2(.U16, `str`)", "-{{.Method2 .U16 `str`}}-", "-Method2: 16 str-", tVal, true}, + {".Method2(.U16, $x)", "{{if $x := .X}}-{{.Method2 .U16 $x}}{{end}}-", "-Method2: 16 x-", tVal, true}, + {".Method3(nil constant)", "-{{.Method3 nil}}-", "-Method3: -", tVal, true}, + {".Method3(nil value)", "-{{.Method3 .MXI.unset}}-", "-Method3: -", tVal, true}, + {"method on var", "{{if $x := .}}-{{$x.Method2 .U16 $x.X}}{{end}}-", "-Method2: 16 x-", tVal, true}, + {"method on chained var", + "{{range .MSIone}}{{if $.U.TrueFalse $.True}}{{$.U.TrueFalse $.True}}{{else}}WRONG{{end}}{{end}}", + "true", tVal, true}, + {"chained method", + "{{range .MSIone}}{{if $.GetU.TrueFalse $.True}}{{$.U.TrueFalse $.True}}{{else}}WRONG{{end}}{{end}}", + "true", tVal, true}, + {"chained method on variable", + "{{with $x := .}}{{with .SI}}{{$.GetU.TrueFalse $.True}}{{end}}{{end}}", + "true", tVal, true}, + {".NilOKFunc not nil", "{{call .NilOKFunc .PI}}", "false", tVal, true}, + {".NilOKFunc nil", "{{call .NilOKFunc nil}}", "true", tVal, true}, + + // Function call builtin. + {".BinaryFunc", "{{call .BinaryFunc `1` `2`}}", "[1=2]", tVal, true}, + {".VariadicFunc0", "{{call .VariadicFunc}}", "<>", tVal, true}, + {".VariadicFunc2", "{{call .VariadicFunc `he` `llo`}}", "", tVal, true}, + {".VariadicFuncInt", "{{call .VariadicFuncInt 33 `he` `llo`}}", "33=", tVal, true}, + {"if .BinaryFunc call", "{{ if .BinaryFunc}}{{call .BinaryFunc `1` `2`}}{{end}}", "[1=2]", tVal, true}, + {"if not .BinaryFunc call", "{{ if not .BinaryFunc}}{{call .BinaryFunc `1` `2`}}{{else}}No{{end}}", "No", tVal, true}, + {"Interface Call", `{{stringer .S}}`, "foozle", map[string]interface{}{"S": bytes.NewBufferString("foozle")}, true}, + {".ErrFunc", "{{call .ErrFunc}}", "bla", tVal, true}, + + // Erroneous function calls (check args). + {".BinaryFuncTooFew", "{{call .BinaryFunc `1`}}", "", tVal, false}, + {".BinaryFuncTooMany", "{{call .BinaryFunc `1` `2` `3`}}", "", tVal, false}, + {".BinaryFuncBad0", "{{call .BinaryFunc 1 3}}", "", tVal, false}, + {".BinaryFuncBad1", "{{call .BinaryFunc `1` 3}}", "", tVal, false}, + {".VariadicFuncBad0", "{{call .VariadicFunc 3}}", "", tVal, false}, + {".VariadicFuncIntBad0", "{{call .VariadicFuncInt}}", "", tVal, false}, + {".VariadicFuncIntBad`", "{{call .VariadicFuncInt `x`}}", "", tVal, false}, + {".VariadicFuncNilBad", "{{call .VariadicFunc nil}}", "", tVal, false}, + + // Pipelines. + {"pipeline", "-{{.Method0 | .Method2 .U16}}-", "-Method2: 16 M0-", tVal, true}, + {"pipeline func", "-{{call .VariadicFunc `llo` | call .VariadicFunc `he` }}-", "->-", tVal, true}, + + // Parenthesized expressions + {"parens in pipeline", "{{printf `%d %d %d` (1) (2 | add 3) (add 4 (add 5 6))}}", "1 5 15", tVal, true}, + + // Parenthesized expressions with field accesses + {"parens: $ in paren", "{{($).X}}", "x", tVal, true}, + {"parens: $.GetU in paren", "{{($.GetU).V}}", "v", tVal, true}, + {"parens: $ in paren in pipe", "{{($ | echo).X}}", "x", tVal, true}, + {"parens: spaces and args", `{{(makemap "up" "down" "left" "right").left}}`, "right", tVal, true}, + + // If. + {"if true", "{{if true}}TRUE{{end}}", "TRUE", tVal, true}, + {"if false", "{{if false}}TRUE{{else}}FALSE{{end}}", "FALSE", tVal, true}, + {"if nil", "{{if nil}}TRUE{{end}}", "", tVal, false}, + {"if 1", "{{if 1}}NON-ZERO{{else}}ZERO{{end}}", "NON-ZERO", tVal, true}, + {"if 0", "{{if 0}}NON-ZERO{{else}}ZERO{{end}}", "ZERO", tVal, true}, + {"if 1.5", "{{if 1.5}}NON-ZERO{{else}}ZERO{{end}}", "NON-ZERO", tVal, true}, + {"if 0.0", "{{if .FloatZero}}NON-ZERO{{else}}ZERO{{end}}", "ZERO", tVal, true}, + {"if 1.5i", "{{if 1.5i}}NON-ZERO{{else}}ZERO{{end}}", "NON-ZERO", tVal, true}, + {"if 0.0i", "{{if .ComplexZero}}NON-ZERO{{else}}ZERO{{end}}", "ZERO", tVal, true}, + {"if emptystring", "{{if ``}}NON-EMPTY{{else}}EMPTY{{end}}", "EMPTY", tVal, true}, + {"if string", "{{if `notempty`}}NON-EMPTY{{else}}EMPTY{{end}}", "NON-EMPTY", tVal, true}, + {"if emptyslice", "{{if .SIEmpty}}NON-EMPTY{{else}}EMPTY{{end}}", "EMPTY", tVal, true}, + {"if slice", "{{if .SI}}NON-EMPTY{{else}}EMPTY{{end}}", "NON-EMPTY", tVal, true}, + {"if emptymap", "{{if .MSIEmpty}}NON-EMPTY{{else}}EMPTY{{end}}", "EMPTY", tVal, true}, + {"if map", "{{if .MSI}}NON-EMPTY{{else}}EMPTY{{end}}", "NON-EMPTY", tVal, true}, + {"if map unset", "{{if .MXI.none}}NON-ZERO{{else}}ZERO{{end}}", "ZERO", tVal, true}, + {"if map not unset", "{{if not .MXI.none}}ZERO{{else}}NON-ZERO{{end}}", "ZERO", tVal, true}, + {"if $x with $y int", "{{if $x := true}}{{with $y := .I}}{{$x}},{{$y}}{{end}}{{end}}", "true,17", tVal, true}, + {"if $x with $x int", "{{if $x := true}}{{with $x := .I}}{{$x}},{{end}}{{$x}}{{end}}", "17,true", tVal, true}, + {"if else if", "{{if false}}FALSE{{else if true}}TRUE{{end}}", "TRUE", tVal, true}, + {"if else chain", "{{if eq 1 3}}1{{else if eq 2 3}}2{{else if eq 3 3}}3{{end}}", "3", tVal, true}, + + // Print etc. + {"print", `{{print "hello, print"}}`, "hello, print", tVal, true}, + {"print 123", `{{print 1 2 3}}`, "1 2 3", tVal, true}, + {"print nil", `{{print nil}}`, "", tVal, true}, + {"println", `{{println 1 2 3}}`, "1 2 3\n", tVal, true}, + {"printf int", `{{printf "%04x" 127}}`, "007f", tVal, true}, + {"printf float", `{{printf "%g" 3.5}}`, "3.5", tVal, true}, + {"printf complex", `{{printf "%g" 1+7i}}`, "(1+7i)", tVal, true}, + {"printf string", `{{printf "%s" "hello"}}`, "hello", tVal, true}, + {"printf function", `{{printf "%#q" zeroArgs}}`, "`zeroArgs`", tVal, true}, + {"printf field", `{{printf "%s" .U.V}}`, "v", tVal, true}, + {"printf method", `{{printf "%s" .Method0}}`, "M0", tVal, true}, + {"printf dot", `{{with .I}}{{printf "%d" .}}{{end}}`, "17", tVal, true}, + {"printf var", `{{with $x := .I}}{{printf "%d" $x}}{{end}}`, "17", tVal, true}, + {"printf lots", `{{printf "%d %s %g %s" 127 "hello" 7-3i .Method0}}`, "127 hello (7-3i) M0", tVal, true}, + + // HTML. + {"html", `{{html ""}}`, + "<script>alert("XSS");</script>", nil, true}, + {"html pipeline", `{{printf "" | html}}`, + "<script>alert("XSS");</script>", nil, true}, + {"html", `{{html .PS}}`, "a string", tVal, true}, + + // JavaScript. + {"js", `{{js .}}`, `It\'d be nice.`, `It'd be nice.`, true}, + + // URL query. + {"urlquery", `{{"http://www.example.org/"|urlquery}}`, "http%3A%2F%2Fwww.example.org%2F", nil, true}, + + // Booleans + {"not", "{{not true}} {{not false}}", "false true", nil, true}, + {"and", "{{and false 0}} {{and 1 0}} {{and 0 true}} {{and 1 1}}", "false 0 0 1", nil, true}, + {"or", "{{or 0 0}} {{or 1 0}} {{or 0 true}} {{or 1 1}}", "0 1 true 1", nil, true}, + {"boolean if", "{{if and true 1 `hi`}}TRUE{{else}}FALSE{{end}}", "TRUE", tVal, true}, + {"boolean if not", "{{if and true 1 `hi` | not}}TRUE{{else}}FALSE{{end}}", "FALSE", nil, true}, + + // Indexing. + {"slice[0]", "{{index .SI 0}}", "3", tVal, true}, + {"slice[1]", "{{index .SI 1}}", "4", tVal, true}, + {"slice[HUGE]", "{{index .SI 10}}", "", tVal, false}, + {"slice[WRONG]", "{{index .SI `hello`}}", "", tVal, false}, + {"map[one]", "{{index .MSI `one`}}", "1", tVal, true}, + {"map[two]", "{{index .MSI `two`}}", "2", tVal, true}, + {"map[NO]", "{{index .MSI `XXX`}}", "0", tVal, true}, + {"map[nil]", "{{index .MSI nil}}", "0", tVal, true}, + {"map[WRONG]", "{{index .MSI 10}}", "", tVal, false}, + {"double index", "{{index .SMSI 1 `eleven`}}", "11", tVal, true}, + + // Len. + {"slice", "{{len .SI}}", "3", tVal, true}, + {"map", "{{len .MSI }}", "3", tVal, true}, + {"len of int", "{{len 3}}", "", tVal, false}, + {"len of nothing", "{{len .Empty0}}", "", tVal, false}, + + // With. + {"with true", "{{with true}}{{.}}{{end}}", "true", tVal, true}, + {"with false", "{{with false}}{{.}}{{else}}FALSE{{end}}", "FALSE", tVal, true}, + {"with 1", "{{with 1}}{{.}}{{else}}ZERO{{end}}", "1", tVal, true}, + {"with 0", "{{with 0}}{{.}}{{else}}ZERO{{end}}", "ZERO", tVal, true}, + {"with 1.5", "{{with 1.5}}{{.}}{{else}}ZERO{{end}}", "1.5", tVal, true}, + {"with 0.0", "{{with .FloatZero}}{{.}}{{else}}ZERO{{end}}", "ZERO", tVal, true}, + {"with 1.5i", "{{with 1.5i}}{{.}}{{else}}ZERO{{end}}", "(0+1.5i)", tVal, true}, + {"with 0.0i", "{{with .ComplexZero}}{{.}}{{else}}ZERO{{end}}", "ZERO", tVal, true}, + {"with emptystring", "{{with ``}}{{.}}{{else}}EMPTY{{end}}", "EMPTY", tVal, true}, + {"with string", "{{with `notempty`}}{{.}}{{else}}EMPTY{{end}}", "notempty", tVal, true}, + {"with emptyslice", "{{with .SIEmpty}}{{.}}{{else}}EMPTY{{end}}", "EMPTY", tVal, true}, + {"with slice", "{{with .SI}}{{.}}{{else}}EMPTY{{end}}", "[3 4 5]", tVal, true}, + {"with emptymap", "{{with .MSIEmpty}}{{.}}{{else}}EMPTY{{end}}", "EMPTY", tVal, true}, + {"with map", "{{with .MSIone}}{{.}}{{else}}EMPTY{{end}}", "map[one:1]", tVal, true}, + {"with empty interface, struct field", "{{with .Empty4}}{{.V}}{{end}}", "UinEmpty", tVal, true}, + {"with $x int", "{{with $x := .I}}{{$x}}{{end}}", "17", tVal, true}, + {"with $x struct.U.V", "{{with $x := $}}{{$x.U.V}}{{end}}", "v", tVal, true}, + {"with variable and action", "{{with $x := $}}{{$y := $.U.V}}{{$y}}{{end}}", "v", tVal, true}, + + // Range. + {"range []int", "{{range .SI}}-{{.}}-{{end}}", "-3--4--5-", tVal, true}, + {"range empty no else", "{{range .SIEmpty}}-{{.}}-{{end}}", "", tVal, true}, + {"range []int else", "{{range .SI}}-{{.}}-{{else}}EMPTY{{end}}", "-3--4--5-", tVal, true}, + {"range empty else", "{{range .SIEmpty}}-{{.}}-{{else}}EMPTY{{end}}", "EMPTY", tVal, true}, + {"range []bool", "{{range .SB}}-{{.}}-{{end}}", "-true--false-", tVal, true}, + {"range []int method", "{{range .SI | .MAdd .I}}-{{.}}-{{end}}", "-20--21--22-", tVal, true}, + {"range map", "{{range .MSI}}-{{.}}-{{end}}", "-1--3--2-", tVal, true}, + {"range empty map no else", "{{range .MSIEmpty}}-{{.}}-{{end}}", "", tVal, true}, + {"range map else", "{{range .MSI}}-{{.}}-{{else}}EMPTY{{end}}", "-1--3--2-", tVal, true}, + {"range empty map else", "{{range .MSIEmpty}}-{{.}}-{{else}}EMPTY{{end}}", "EMPTY", tVal, true}, + {"range empty interface", "{{range .Empty3}}-{{.}}-{{else}}EMPTY{{end}}", "-7--8-", tVal, true}, + {"range empty nil", "{{range .Empty0}}-{{.}}-{{end}}", "", tVal, true}, + {"range $x SI", "{{range $x := .SI}}<{{$x}}>{{end}}", "<3><4><5>", tVal, true}, + {"range $x $y SI", "{{range $x, $y := .SI}}<{{$x}}={{$y}}>{{end}}", "<0=3><1=4><2=5>", tVal, true}, + {"range $x MSIone", "{{range $x := .MSIone}}<{{$x}}>{{end}}", "<1>", tVal, true}, + {"range $x $y MSIone", "{{range $x, $y := .MSIone}}<{{$x}}={{$y}}>{{end}}", "", tVal, true}, + {"range $x PSI", "{{range $x := .PSI}}<{{$x}}>{{end}}", "<21><22><23>", tVal, true}, + {"declare in range", "{{range $x := .PSI}}<{{$foo:=$x}}{{$x}}>{{end}}", "<21><22><23>", tVal, true}, + {"range count", `{{range $i, $x := count 5}}[{{$i}}]{{$x}}{{end}}`, "[0]a[1]b[2]c[3]d[4]e", tVal, true}, + {"range nil count", `{{range $i, $x := count 0}}{{else}}empty{{end}}`, "empty", tVal, true}, + + // Cute examples. + {"or as if true", `{{or .SI "slice is empty"}}`, "[3 4 5]", tVal, true}, + {"or as if false", `{{or .SIEmpty "slice is empty"}}`, "slice is empty", tVal, true}, + + // Error handling. + {"error method, error", "{{.MyError true}}", "", tVal, false}, + {"error method, no error", "{{.MyError false}}", "false", tVal, true}, + + // Fixed bugs. + // Must separate dot and receiver; otherwise args are evaluated with dot set to variable. + {"bug0", "{{range .MSIone}}{{if $.Method1 .}}X{{end}}{{end}}", "X", tVal, true}, + // Do not loop endlessly in indirect for non-empty interfaces. + // The bug appears with *interface only; looped forever. + {"bug1", "{{.Method0}}", "M0", &iVal, true}, + // Was taking address of interface field, so method set was empty. + {"bug2", "{{$.NonEmptyInterface.Method0}}", "M0", tVal, true}, + // Struct values were not legal in with - mere oversight. + {"bug3", "{{with $}}{{.Method0}}{{end}}", "M0", tVal, true}, + // Nil interface values in if. + {"bug4", "{{if .Empty0}}non-nil{{else}}nil{{end}}", "nil", tVal, true}, + // Stringer. + {"bug5", "{{.Str}}", "foozle", tVal, true}, + {"bug5a", "{{.Err}}", "erroozle", tVal, true}, + // Args need to be indirected and dereferenced sometimes. + {"bug6a", "{{vfunc .V0 .V1}}", "vfunc", tVal, true}, + {"bug6b", "{{vfunc .V0 .V0}}", "vfunc", tVal, true}, + {"bug6c", "{{vfunc .V1 .V0}}", "vfunc", tVal, true}, + {"bug6d", "{{vfunc .V1 .V1}}", "vfunc", tVal, true}, + // Legal parse but illegal execution: non-function should have no arguments. + {"bug7a", "{{3 2}}", "", tVal, false}, + {"bug7b", "{{$x := 1}}{{$x 2}}", "", tVal, false}, + {"bug7c", "{{$x := 1}}{{3 | $x}}", "", tVal, false}, + // Pipelined arg was not being type-checked. + {"bug8a", "{{3|oneArg}}", "", tVal, false}, + {"bug8b", "{{4|dddArg 3}}", "", tVal, false}, + // A bug was introduced that broke map lookups for lower-case names. + {"bug9", "{{.cause}}", "neglect", map[string]string{"cause": "neglect"}, true}, + // Field chain starting with function did not work. + {"bug10", "{{mapOfThree.three}}-{{(mapOfThree).three}}", "3-3", 0, true}, + // Dereferencing nil pointer while evaluating function arguments should not panic. Issue 7333. + {"bug11", "{{valueString .PS}}", "", T{}, false}, + // 0xef gave constant type float64. Issue 8622. + {"bug12xe", "{{printf `%T` 0xef}}", "int", T{}, true}, + {"bug12xE", "{{printf `%T` 0xEE}}", "int", T{}, true}, + {"bug12Xe", "{{printf `%T` 0Xef}}", "int", T{}, true}, + {"bug12XE", "{{printf `%T` 0XEE}}", "int", T{}, true}, + // Chained nodes did not work as arguments. Issue 8473. + {"bug13", "{{print (.Copy).I}}", "17", tVal, true}, +} + +func zeroArgs() string { + return "zeroArgs" +} + +func oneArg(a string) string { + return "oneArg=" + a +} + +func dddArg(a int, b ...string) string { + return fmt.Sprintln(a, b) +} + +// count returns a channel that will deliver n sequential 1-letter strings starting at "a" +func count(n int) chan string { + if n == 0 { + return nil + } + c := make(chan string) + go func() { + for i := 0; i < n; i++ { + c <- "abcdefghijklmnop"[i : i+1] + } + close(c) + }() + return c +} + +// vfunc takes a *V and a V +func vfunc(V, *V) string { + return "vfunc" +} + +// valueString takes a string, not a pointer. +func valueString(v string) string { + return "value is ignored" +} + +func add(args ...int) int { + sum := 0 + for _, x := range args { + sum += x + } + return sum +} + +func echo(arg interface{}) interface{} { + return arg +} + +func makemap(arg ...string) map[string]string { + if len(arg)%2 != 0 { + panic("bad makemap") + } + m := make(map[string]string) + for i := 0; i < len(arg); i += 2 { + m[arg[i]] = arg[i+1] + } + return m +} + +func stringer(s fmt.Stringer) string { + return s.String() +} + +func mapOfThree() interface{} { + return map[string]int{"three": 3} +} + +func testExecute(execTests []execTest, template *Template, t *testing.T) { + b := new(bytes.Buffer) + funcs := FuncMap{ + "add": add, + "count": count, + "dddArg": dddArg, + "echo": echo, + "makemap": makemap, + "mapOfThree": mapOfThree, + "oneArg": oneArg, + "stringer": stringer, + "typeOf": typeOf, + "valueString": valueString, + "vfunc": vfunc, + "zeroArgs": zeroArgs, + } + for _, test := range execTests { + var tmpl *Template + var err error + if template == nil { + tmpl, err = New(test.name).Funcs(funcs).Parse(test.input) + } else { + tmpl, err = template.New(test.name).Funcs(funcs).Parse(test.input) + } + if err != nil { + t.Errorf("%s: parse error: %s", test.name, err) + continue + } + b.Reset() + err = tmpl.Execute(b, test.data) + switch { + case !test.ok && err == nil: + t.Errorf("%s: expected error; got none", test.name) + continue + case test.ok && err != nil: + t.Errorf("%s: unexpected execute error: %s", test.name, err) + continue + case !test.ok && err != nil: + // expected error, got one + if *debug { + fmt.Printf("%s: %s\n\t%s\n", test.name, test.input, err) + } + } + result := b.String() + if result != test.output { + t.Errorf("%s: expected\n\t%q\ngot\n\t%q", test.name, test.output, result) + } + } +} + +func TestExecute(t *testing.T) { + testExecute(execTests, nil, t) +} + +var delimPairs = []string{ + "", "", // default + "{{", "}}", // same as default + "<<", ">>", // distinct + "|", "|", // same + "(日)", "(本)", // peculiar +} + +func TestDelims(t *testing.T) { + const hello = "Hello, world" + var value = struct{ Str string }{hello} + for i := 0; i < len(delimPairs); i += 2 { + text := ".Str" + left := delimPairs[i+0] + trueLeft := left + right := delimPairs[i+1] + trueRight := right + if left == "" { // default case + trueLeft = "{{" + } + if right == "" { // default case + trueRight = "}}" + } + text = trueLeft + text + trueRight + // Now add a comment + text += trueLeft + "/*comment*/" + trueRight + // Now add an action containing a string. + text += trueLeft + `"` + trueLeft + `"` + trueRight + // At this point text looks like `{{.Str}}{{/*comment*/}}{{"{{"}}`. + tmpl, err := New("delims").Delims(left, right).Parse(text) + if err != nil { + t.Fatalf("delim %q text %q parse err %s", left, text, err) + } + var b = new(bytes.Buffer) + err = tmpl.Execute(b, value) + if err != nil { + t.Fatalf("delim %q exec err %s", left, err) + } + if b.String() != hello+trueLeft { + t.Errorf("expected %q got %q", hello+trueLeft, b.String()) + } + } +} + +// Check that an error from a method flows back to the top. +func TestExecuteError(t *testing.T) { + b := new(bytes.Buffer) + tmpl := New("error") + _, err := tmpl.Parse("{{.MyError true}}") + if err != nil { + t.Fatalf("parse error: %s", err) + } + err = tmpl.Execute(b, tVal) + if err == nil { + t.Errorf("expected error; got none") + } else if !strings.Contains(err.Error(), myError.Error()) { + if *debug { + fmt.Printf("test execute error: %s\n", err) + } + t.Errorf("expected myError; got %s", err) + } +} + +const execErrorText = `line 1 +line 2 +line 3 +{{template "one" .}} +{{define "one"}}{{template "two" .}}{{end}} +{{define "two"}}{{template "three" .}}{{end}} +{{define "three"}}{{index "hi" $}}{{end}}` + +// Check that an error from a nested template contains all the relevant information. +func TestExecError(t *testing.T) { + tmpl, err := New("top").Parse(execErrorText) + if err != nil { + t.Fatal("parse error:", err) + } + var b bytes.Buffer + err = tmpl.Execute(&b, 5) // 5 is out of range indexing "hi" + if err == nil { + t.Fatal("expected error") + } + const want = `template: top:7:20: executing "three" at : error calling index: index out of range: 5` + got := err.Error() + if got != want { + t.Errorf("expected\n%q\ngot\n%q", want, got) + } +} + +func TestJSEscaping(t *testing.T) { + testCases := []struct { + in, exp string + }{ + {`a`, `a`}, + {`'foo`, `\'foo`}, + {`Go "jump" \`, `Go \"jump\" \\`}, + {`Yukihiro says "今日は世界"`, `Yukihiro says \"今日は世界\"`}, + {"unprintable \uFDFF", `unprintable \uFDFF`}, + {``, `\x3Chtml\x3E`}, + } + for _, tc := range testCases { + s := JSEscapeString(tc.in) + if s != tc.exp { + t.Errorf("JS escaping [%s] got [%s] want [%s]", tc.in, s, tc.exp) + } + } +} + +// A nice example: walk a binary tree. + +type Tree struct { + Val int + Left, Right *Tree +} + +// Use different delimiters to test Set.Delims. +const treeTemplate = ` + (define "tree") + [ + (.Val) + (with .Left) + (template "tree" .) + (end) + (with .Right) + (template "tree" .) + (end) + ] + (end) +` + +func TestTree(t *testing.T) { + var tree = &Tree{ + 1, + &Tree{ + 2, &Tree{ + 3, + &Tree{ + 4, nil, nil, + }, + nil, + }, + &Tree{ + 5, + &Tree{ + 6, nil, nil, + }, + nil, + }, + }, + &Tree{ + 7, + &Tree{ + 8, + &Tree{ + 9, nil, nil, + }, + nil, + }, + &Tree{ + 10, + &Tree{ + 11, nil, nil, + }, + nil, + }, + }, + } + tmpl, err := New("root").Delims("(", ")").Parse(treeTemplate) + if err != nil { + t.Fatal("parse error:", err) + } + var b bytes.Buffer + stripSpace := func(r rune) rune { + if r == '\t' || r == '\n' { + return -1 + } + return r + } + const expect = "[1[2[3[4]][5[6]]][7[8[9]][10[11]]]]" + // First by looking up the template. + err = tmpl.Lookup("tree").Execute(&b, tree) + if err != nil { + t.Fatal("exec error:", err) + } + result := strings.Map(stripSpace, b.String()) + if result != expect { + t.Errorf("expected %q got %q", expect, result) + } + // Then direct to execution. + b.Reset() + err = tmpl.ExecuteTemplate(&b, "tree", tree) + if err != nil { + t.Fatal("exec error:", err) + } + result = strings.Map(stripSpace, b.String()) + if result != expect { + t.Errorf("expected %q got %q", expect, result) + } +} + +func TestExecuteOnNewTemplate(t *testing.T) { + // This is issue 3872. + _ = New("Name").Templates() +} + +const testTemplates = `{{define "one"}}one{{end}}{{define "two"}}two{{end}}` + +func TestMessageForExecuteEmpty(t *testing.T) { + // Test a truly empty template. + tmpl := New("empty") + var b bytes.Buffer + err := tmpl.Execute(&b, 0) + if err == nil { + t.Fatal("expected initial error") + } + got := err.Error() + want := `template: empty: "empty" is an incomplete or empty template` + if got != want { + t.Errorf("expected error %s got %s", want, got) + } + // Add a non-empty template to check that the error is helpful. + tests, err := New("").Parse(testTemplates) + if err != nil { + t.Fatal(err) + } + tmpl.AddParseTree("secondary", tests.Tree) + err = tmpl.Execute(&b, 0) + if err == nil { + t.Fatal("expected second error") + } + got = err.Error() + want = `template: empty: "empty" is an incomplete or empty template; defined templates are: "secondary"` + if got != want { + t.Errorf("expected error %s got %s", want, got) + } + // Make sure we can execute the secondary. + err = tmpl.ExecuteTemplate(&b, "secondary", 0) + if err != nil { + t.Fatal(err) + } +} + +func TestFinalForPrintf(t *testing.T) { + tmpl, err := New("").Parse(`{{"x" | printf}}`) + if err != nil { + t.Fatal(err) + } + var b bytes.Buffer + err = tmpl.Execute(&b, 0) + if err != nil { + t.Fatal(err) + } +} + +type cmpTest struct { + expr string + truth string + ok bool +} + +var cmpTests = []cmpTest{ + {"eq true true", "true", true}, + {"eq true false", "false", true}, + {"eq 1+2i 1+2i", "true", true}, + {"eq 1+2i 1+3i", "false", true}, + {"eq 1.5 1.5", "true", true}, + {"eq 1.5 2.5", "false", true}, + {"eq 1 1", "true", true}, + {"eq 1 2", "false", true}, + {"eq `xy` `xy`", "true", true}, + {"eq `xy` `xyz`", "false", true}, + {"eq .Uthree .Uthree", "true", true}, + {"eq .Uthree .Ufour", "false", true}, + {"eq 3 4 5 6 3", "true", true}, + {"eq 3 4 5 6 7", "false", true}, + {"ne true true", "false", true}, + {"ne true false", "true", true}, + {"ne 1+2i 1+2i", "false", true}, + {"ne 1+2i 1+3i", "true", true}, + {"ne 1.5 1.5", "false", true}, + {"ne 1.5 2.5", "true", true}, + {"ne 1 1", "false", true}, + {"ne 1 2", "true", true}, + {"ne `xy` `xy`", "false", true}, + {"ne `xy` `xyz`", "true", true}, + {"ne .Uthree .Uthree", "false", true}, + {"ne .Uthree .Ufour", "true", true}, + {"lt 1.5 1.5", "false", true}, + {"lt 1.5 2.5", "true", true}, + {"lt 1 1", "false", true}, + {"lt 1 2", "true", true}, + {"lt `xy` `xy`", "false", true}, + {"lt `xy` `xyz`", "true", true}, + {"lt .Uthree .Uthree", "false", true}, + {"lt .Uthree .Ufour", "true", true}, + {"le 1.5 1.5", "true", true}, + {"le 1.5 2.5", "true", true}, + {"le 2.5 1.5", "false", true}, + {"le 1 1", "true", true}, + {"le 1 2", "true", true}, + {"le 2 1", "false", true}, + {"le `xy` `xy`", "true", true}, + {"le `xy` `xyz`", "true", true}, + {"le `xyz` `xy`", "false", true}, + {"le .Uthree .Uthree", "true", true}, + {"le .Uthree .Ufour", "true", true}, + {"le .Ufour .Uthree", "false", true}, + {"gt 1.5 1.5", "false", true}, + {"gt 1.5 2.5", "false", true}, + {"gt 1 1", "false", true}, + {"gt 2 1", "true", true}, + {"gt 1 2", "false", true}, + {"gt `xy` `xy`", "false", true}, + {"gt `xy` `xyz`", "false", true}, + {"gt .Uthree .Uthree", "false", true}, + {"gt .Uthree .Ufour", "false", true}, + {"gt .Ufour .Uthree", "true", true}, + {"ge 1.5 1.5", "true", true}, + {"ge 1.5 2.5", "false", true}, + {"ge 2.5 1.5", "true", true}, + {"ge 1 1", "true", true}, + {"ge 1 2", "false", true}, + {"ge 2 1", "true", true}, + {"ge `xy` `xy`", "true", true}, + {"ge `xy` `xyz`", "false", true}, + {"ge `xyz` `xy`", "true", true}, + {"ge .Uthree .Uthree", "true", true}, + {"ge .Uthree .Ufour", "false", true}, + {"ge .Ufour .Uthree", "true", true}, + // Mixing signed and unsigned integers. + {"eq .Uthree .Three", "true", true}, + {"eq .Three .Uthree", "true", true}, + {"le .Uthree .Three", "true", true}, + {"le .Three .Uthree", "true", true}, + {"ge .Uthree .Three", "true", true}, + {"ge .Three .Uthree", "true", true}, + {"lt .Uthree .Three", "false", true}, + {"lt .Three .Uthree", "false", true}, + {"gt .Uthree .Three", "false", true}, + {"gt .Three .Uthree", "false", true}, + {"eq .Ufour .Three", "false", true}, + {"lt .Ufour .Three", "false", true}, + {"gt .Ufour .Three", "true", true}, + {"eq .NegOne .Uthree", "false", true}, + {"eq .Uthree .NegOne", "false", true}, + {"ne .NegOne .Uthree", "true", true}, + {"ne .Uthree .NegOne", "true", true}, + {"lt .NegOne .Uthree", "true", true}, + {"lt .Uthree .NegOne", "false", true}, + {"le .NegOne .Uthree", "true", true}, + {"le .Uthree .NegOne", "false", true}, + {"gt .NegOne .Uthree", "false", true}, + {"gt .Uthree .NegOne", "true", true}, + {"ge .NegOne .Uthree", "false", true}, + {"ge .Uthree .NegOne", "true", true}, + {"eq (index `x` 0) 'x'", "true", true}, // The example that triggered this rule. + {"eq (index `x` 0) 'y'", "false", true}, + // Errors + {"eq `xy` 1", "", false}, // Different types. + {"eq 2 2.0", "", false}, // Different types. + {"lt true true", "", false}, // Unordered types. + {"lt 1+0i 1+0i", "", false}, // Unordered types. +} + +func TestComparison(t *testing.T) { + b := new(bytes.Buffer) + var cmpStruct = struct { + Uthree, Ufour uint + NegOne, Three int + }{3, 4, -1, 3} + for _, test := range cmpTests { + text := fmt.Sprintf("{{if %s}}true{{else}}false{{end}}", test.expr) + tmpl, err := New("empty").Parse(text) + if err != nil { + t.Fatalf("%q: %s", test.expr, err) + } + b.Reset() + err = tmpl.Execute(b, &cmpStruct) + if test.ok && err != nil { + t.Errorf("%s errored incorrectly: %s", test.expr, err) + continue + } + if !test.ok && err == nil { + t.Errorf("%s did not error", test.expr) + continue + } + if b.String() != test.truth { + t.Errorf("%s: want %s; got %s", test.expr, test.truth, b.String()) + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/funcs.go b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/funcs.go new file mode 100644 index 0000000..39ee5ed --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/funcs.go @@ -0,0 +1,598 @@ +// 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 template + +import ( + "bytes" + "errors" + "fmt" + "io" + "net/url" + "reflect" + "strings" + "unicode" + "unicode/utf8" +) + +// FuncMap is the type of the map defining the mapping from names to functions. +// Each function must have either a single return value, or two return values of +// which the second has type error. In that case, if the second (error) +// return value evaluates to non-nil during execution, execution terminates and +// Execute returns that error. +type FuncMap map[string]interface{} + +var builtins = FuncMap{ + "and": and, + "call": call, + "html": HTMLEscaper, + "index": index, + "js": JSEscaper, + "len": length, + "not": not, + "or": or, + "print": fmt.Sprint, + "printf": fmt.Sprintf, + "println": fmt.Sprintln, + "urlquery": URLQueryEscaper, + + // Comparisons + "eq": eq, // == + "ge": ge, // >= + "gt": gt, // > + "le": le, // <= + "lt": lt, // < + "ne": ne, // != +} + +var builtinFuncs = createValueFuncs(builtins) + +// createValueFuncs turns a FuncMap into a map[string]reflect.Value +func createValueFuncs(funcMap FuncMap) map[string]reflect.Value { + m := make(map[string]reflect.Value) + addValueFuncs(m, funcMap) + return m +} + +// addValueFuncs adds to values the functions in funcs, converting them to reflect.Values. +func addValueFuncs(out map[string]reflect.Value, in FuncMap) { + for name, fn := range in { + v := reflect.ValueOf(fn) + if v.Kind() != reflect.Func { + panic("value for " + name + " not a function") + } + if !goodFunc(v.Type()) { + panic(fmt.Errorf("can't install method/function %q with %d results", name, v.Type().NumOut())) + } + out[name] = v + } +} + +// addFuncs adds to values the functions in funcs. It does no checking of the input - +// call addValueFuncs first. +func addFuncs(out, in FuncMap) { + for name, fn := range in { + out[name] = fn + } +} + +// goodFunc checks that the function or method has the right result signature. +func goodFunc(typ reflect.Type) bool { + // We allow functions with 1 result or 2 results where the second is an error. + switch { + case typ.NumOut() == 1: + return true + case typ.NumOut() == 2 && typ.Out(1) == errorType: + return true + } + return false +} + +// findFunction looks for a function in the template, and global map. +func findFunction(name string, tmpl *Template) (reflect.Value, bool) { + if tmpl != nil && tmpl.common != nil { + if fn := tmpl.execFuncs[name]; fn.IsValid() { + return fn, true + } + } + if fn := builtinFuncs[name]; fn.IsValid() { + return fn, true + } + return reflect.Value{}, false +} + +// Indexing. + +// index returns the result of indexing its first argument by the following +// arguments. Thus "index x 1 2 3" is, in Go syntax, x[1][2][3]. Each +// indexed item must be a map, slice, or array. +func index(item interface{}, indices ...interface{}) (interface{}, error) { + v := reflect.ValueOf(item) + for _, i := range indices { + index := reflect.ValueOf(i) + var isNil bool + if v, isNil = indirect(v); isNil { + return nil, fmt.Errorf("index of nil pointer") + } + switch v.Kind() { + case reflect.Array, reflect.Slice, reflect.String: + var x int64 + switch index.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + x = index.Int() + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + x = int64(index.Uint()) + default: + return nil, fmt.Errorf("cannot index slice/array with type %s", index.Type()) + } + if x < 0 || x >= int64(v.Len()) { + return nil, fmt.Errorf("index out of range: %d", x) + } + v = v.Index(int(x)) + case reflect.Map: + if !index.IsValid() { + index = reflect.Zero(v.Type().Key()) + } + if !index.Type().AssignableTo(v.Type().Key()) { + return nil, fmt.Errorf("%s is not index type for %s", index.Type(), v.Type()) + } + if x := v.MapIndex(index); x.IsValid() { + v = x + } else { + v = reflect.Zero(v.Type().Elem()) + } + default: + return nil, fmt.Errorf("can't index item of type %s", v.Type()) + } + } + return v.Interface(), nil +} + +// Length + +// length returns the length of the item, with an error if it has no defined length. +func length(item interface{}) (int, error) { + v, isNil := indirect(reflect.ValueOf(item)) + if isNil { + return 0, fmt.Errorf("len of nil pointer") + } + switch v.Kind() { + case reflect.Array, reflect.Chan, reflect.Map, reflect.Slice, reflect.String: + return v.Len(), nil + } + return 0, fmt.Errorf("len of type %s", v.Type()) +} + +// Function invocation + +// call returns the result of evaluating the first argument as a function. +// The function must return 1 result, or 2 results, the second of which is an error. +func call(fn interface{}, args ...interface{}) (interface{}, error) { + v := reflect.ValueOf(fn) + typ := v.Type() + if typ.Kind() != reflect.Func { + return nil, fmt.Errorf("non-function of type %s", typ) + } + if !goodFunc(typ) { + return nil, fmt.Errorf("function called with %d args; should be 1 or 2", typ.NumOut()) + } + numIn := typ.NumIn() + var dddType reflect.Type + if typ.IsVariadic() { + if len(args) < numIn-1 { + return nil, fmt.Errorf("wrong number of args: got %d want at least %d", len(args), numIn-1) + } + dddType = typ.In(numIn - 1).Elem() + } else { + if len(args) != numIn { + return nil, fmt.Errorf("wrong number of args: got %d want %d", len(args), numIn) + } + } + argv := make([]reflect.Value, len(args)) + for i, arg := range args { + value := reflect.ValueOf(arg) + // Compute the expected type. Clumsy because of variadics. + var argType reflect.Type + if !typ.IsVariadic() || i < numIn-1 { + argType = typ.In(i) + } else { + argType = dddType + } + if !value.IsValid() && canBeNil(argType) { + value = reflect.Zero(argType) + } + if !value.Type().AssignableTo(argType) { + return nil, fmt.Errorf("arg %d has type %s; should be %s", i, value.Type(), argType) + } + argv[i] = value + } + result := v.Call(argv) + if len(result) == 2 && !result[1].IsNil() { + return result[0].Interface(), result[1].Interface().(error) + } + return result[0].Interface(), nil +} + +// Boolean logic. + +func truth(a interface{}) bool { + t, _ := isTrue(reflect.ValueOf(a)) + return t +} + +// and computes the Boolean AND of its arguments, returning +// the first false argument it encounters, or the last argument. +func and(arg0 interface{}, args ...interface{}) interface{} { + if !truth(arg0) { + return arg0 + } + for i := range args { + arg0 = args[i] + if !truth(arg0) { + break + } + } + return arg0 +} + +// or computes the Boolean OR of its arguments, returning +// the first true argument it encounters, or the last argument. +func or(arg0 interface{}, args ...interface{}) interface{} { + if truth(arg0) { + return arg0 + } + for i := range args { + arg0 = args[i] + if truth(arg0) { + break + } + } + return arg0 +} + +// not returns the Boolean negation of its argument. +func not(arg interface{}) (truth bool) { + truth, _ = isTrue(reflect.ValueOf(arg)) + return !truth +} + +// Comparison. + +// TODO: Perhaps allow comparison between signed and unsigned integers. + +var ( + errBadComparisonType = errors.New("invalid type for comparison") + errBadComparison = errors.New("incompatible types for comparison") + errNoComparison = errors.New("missing argument for comparison") +) + +type kind int + +const ( + invalidKind kind = iota + boolKind + complexKind + intKind + floatKind + integerKind + stringKind + uintKind +) + +func basicKind(v reflect.Value) (kind, error) { + switch v.Kind() { + case reflect.Bool: + return boolKind, nil + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return intKind, nil + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return uintKind, nil + case reflect.Float32, reflect.Float64: + return floatKind, nil + case reflect.Complex64, reflect.Complex128: + return complexKind, nil + case reflect.String: + return stringKind, nil + } + return invalidKind, errBadComparisonType +} + +// eq evaluates the comparison a == b || a == c || ... +func eq(arg1 interface{}, arg2 ...interface{}) (bool, error) { + v1 := reflect.ValueOf(arg1) + k1, err := basicKind(v1) + if err != nil { + return false, err + } + if len(arg2) == 0 { + return false, errNoComparison + } + for _, arg := range arg2 { + v2 := reflect.ValueOf(arg) + k2, err := basicKind(v2) + if err != nil { + return false, err + } + truth := false + if k1 != k2 { + // Special case: Can compare integer values regardless of type's sign. + switch { + case k1 == intKind && k2 == uintKind: + truth = v1.Int() >= 0 && uint64(v1.Int()) == v2.Uint() + case k1 == uintKind && k2 == intKind: + truth = v2.Int() >= 0 && v1.Uint() == uint64(v2.Int()) + default: + return false, errBadComparison + } + } else { + switch k1 { + case boolKind: + truth = v1.Bool() == v2.Bool() + case complexKind: + truth = v1.Complex() == v2.Complex() + case floatKind: + truth = v1.Float() == v2.Float() + case intKind: + truth = v1.Int() == v2.Int() + case stringKind: + truth = v1.String() == v2.String() + case uintKind: + truth = v1.Uint() == v2.Uint() + default: + panic("invalid kind") + } + } + if truth { + return true, nil + } + } + return false, nil +} + +// ne evaluates the comparison a != b. +func ne(arg1, arg2 interface{}) (bool, error) { + // != is the inverse of ==. + equal, err := eq(arg1, arg2) + return !equal, err +} + +// lt evaluates the comparison a < b. +func lt(arg1, arg2 interface{}) (bool, error) { + v1 := reflect.ValueOf(arg1) + k1, err := basicKind(v1) + if err != nil { + return false, err + } + v2 := reflect.ValueOf(arg2) + k2, err := basicKind(v2) + if err != nil { + return false, err + } + truth := false + if k1 != k2 { + // Special case: Can compare integer values regardless of type's sign. + switch { + case k1 == intKind && k2 == uintKind: + truth = v1.Int() < 0 || uint64(v1.Int()) < v2.Uint() + case k1 == uintKind && k2 == intKind: + truth = v2.Int() >= 0 && v1.Uint() < uint64(v2.Int()) + default: + return false, errBadComparison + } + } else { + switch k1 { + case boolKind, complexKind: + return false, errBadComparisonType + case floatKind: + truth = v1.Float() < v2.Float() + case intKind: + truth = v1.Int() < v2.Int() + case stringKind: + truth = v1.String() < v2.String() + case uintKind: + truth = v1.Uint() < v2.Uint() + default: + panic("invalid kind") + } + } + return truth, nil +} + +// le evaluates the comparison <= b. +func le(arg1, arg2 interface{}) (bool, error) { + // <= is < or ==. + lessThan, err := lt(arg1, arg2) + if lessThan || err != nil { + return lessThan, err + } + return eq(arg1, arg2) +} + +// gt evaluates the comparison a > b. +func gt(arg1, arg2 interface{}) (bool, error) { + // > is the inverse of <=. + lessOrEqual, err := le(arg1, arg2) + if err != nil { + return false, err + } + return !lessOrEqual, nil +} + +// ge evaluates the comparison a >= b. +func ge(arg1, arg2 interface{}) (bool, error) { + // >= is the inverse of <. + lessThan, err := lt(arg1, arg2) + if err != nil { + return false, err + } + return !lessThan, nil +} + +// HTML escaping. + +var ( + htmlQuot = []byte(""") // shorter than """ + htmlApos = []byte("'") // shorter than "'" and apos was not in HTML until HTML5 + htmlAmp = []byte("&") + htmlLt = []byte("<") + htmlGt = []byte(">") +) + +// HTMLEscape writes to w the escaped HTML equivalent of the plain text data b. +func HTMLEscape(w io.Writer, b []byte) { + last := 0 + for i, c := range b { + var html []byte + switch c { + case '"': + html = htmlQuot + case '\'': + html = htmlApos + case '&': + html = htmlAmp + case '<': + html = htmlLt + case '>': + html = htmlGt + default: + continue + } + w.Write(b[last:i]) + w.Write(html) + last = i + 1 + } + w.Write(b[last:]) +} + +// HTMLEscapeString returns the escaped HTML equivalent of the plain text data s. +func HTMLEscapeString(s string) string { + // Avoid allocation if we can. + if strings.IndexAny(s, `'"&<>`) < 0 { + return s + } + var b bytes.Buffer + HTMLEscape(&b, []byte(s)) + return b.String() +} + +// HTMLEscaper returns the escaped HTML equivalent of the textual +// representation of its arguments. +func HTMLEscaper(args ...interface{}) string { + return HTMLEscapeString(evalArgs(args)) +} + +// JavaScript escaping. + +var ( + jsLowUni = []byte(`\u00`) + hex = []byte("0123456789ABCDEF") + + jsBackslash = []byte(`\\`) + jsApos = []byte(`\'`) + jsQuot = []byte(`\"`) + jsLt = []byte(`\x3C`) + jsGt = []byte(`\x3E`) +) + +// JSEscape writes to w the escaped JavaScript equivalent of the plain text data b. +func JSEscape(w io.Writer, b []byte) { + last := 0 + for i := 0; i < len(b); i++ { + c := b[i] + + if !jsIsSpecial(rune(c)) { + // fast path: nothing to do + continue + } + w.Write(b[last:i]) + + if c < utf8.RuneSelf { + // Quotes, slashes and angle brackets get quoted. + // Control characters get written as \u00XX. + switch c { + case '\\': + w.Write(jsBackslash) + case '\'': + w.Write(jsApos) + case '"': + w.Write(jsQuot) + case '<': + w.Write(jsLt) + case '>': + w.Write(jsGt) + default: + w.Write(jsLowUni) + t, b := c>>4, c&0x0f + w.Write(hex[t : t+1]) + w.Write(hex[b : b+1]) + } + } else { + // Unicode rune. + r, size := utf8.DecodeRune(b[i:]) + if unicode.IsPrint(r) { + w.Write(b[i : i+size]) + } else { + fmt.Fprintf(w, "\\u%04X", r) + } + i += size - 1 + } + last = i + 1 + } + w.Write(b[last:]) +} + +// JSEscapeString returns the escaped JavaScript equivalent of the plain text data s. +func JSEscapeString(s string) string { + // Avoid allocation if we can. + if strings.IndexFunc(s, jsIsSpecial) < 0 { + return s + } + var b bytes.Buffer + JSEscape(&b, []byte(s)) + return b.String() +} + +func jsIsSpecial(r rune) bool { + switch r { + case '\\', '\'', '"', '<', '>': + return true + } + return r < ' ' || utf8.RuneSelf <= r +} + +// JSEscaper returns the escaped JavaScript equivalent of the textual +// representation of its arguments. +func JSEscaper(args ...interface{}) string { + return JSEscapeString(evalArgs(args)) +} + +// URLQueryEscaper returns the escaped value of the textual representation of +// its arguments in a form suitable for embedding in a URL query. +func URLQueryEscaper(args ...interface{}) string { + return url.QueryEscape(evalArgs(args)) +} + +// evalArgs formats the list of arguments into a string. It is therefore equivalent to +// fmt.Sprint(args...) +// except that each argument is indirected (if a pointer), as required, +// using the same rules as the default string evaluation during template +// execution. +func evalArgs(args []interface{}) string { + ok := false + var s string + // Fast path for simple common case. + if len(args) == 1 { + s, ok = args[0].(string) + } + if !ok { + for i, arg := range args { + a, ok := printableValue(reflect.ValueOf(arg)) + if ok { + args[i] = a + } // else left fmt do its thing + } + s = fmt.Sprint(args...) + } + return s +} diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/helper.go b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/helper.go new file mode 100644 index 0000000..3636fb5 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/helper.go @@ -0,0 +1,108 @@ +// 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. + +// Helper functions to make constructing templates easier. + +package template + +import ( + "fmt" + "io/ioutil" + "path/filepath" +) + +// Functions and methods to parse templates. + +// Must is a helper that wraps a call to a function returning (*Template, error) +// and panics if the error is non-nil. It is intended for use in variable +// initializations such as +// var t = template.Must(template.New("name").Parse("text")) +func Must(t *Template, err error) *Template { + if err != nil { + panic(err) + } + return t +} + +// ParseFiles creates a new Template and parses the template definitions from +// the named files. The returned template's name will have the (base) name and +// (parsed) contents of the first file. There must be at least one file. +// If an error occurs, parsing stops and the returned *Template is nil. +func ParseFiles(filenames ...string) (*Template, error) { + return parseFiles(nil, filenames...) +} + +// ParseFiles parses the named files and associates the resulting templates with +// t. If an error occurs, parsing stops and the returned template is nil; +// otherwise it is t. There must be at least one file. +func (t *Template) ParseFiles(filenames ...string) (*Template, error) { + return parseFiles(t, filenames...) +} + +// parseFiles is the helper for the method and function. If the argument +// template is nil, it is created from the first file. +func parseFiles(t *Template, filenames ...string) (*Template, error) { + if len(filenames) == 0 { + // Not really a problem, but be consistent. + return nil, fmt.Errorf("template: no files named in call to ParseFiles") + } + for _, filename := range filenames { + b, err := ioutil.ReadFile(filename) + if err != nil { + return nil, err + } + s := string(b) + name := filepath.Base(filename) + // First template becomes return value if not already defined, + // and we use that one for subsequent New calls to associate + // all the templates together. Also, if this file has the same name + // as t, this file becomes the contents of t, so + // t, err := New(name).Funcs(xxx).ParseFiles(name) + // works. Otherwise we create a new template associated with t. + var tmpl *Template + if t == nil { + t = New(name) + } + if name == t.Name() { + tmpl = t + } else { + tmpl = t.New(name) + } + _, err = tmpl.Parse(s) + if err != nil { + return nil, err + } + } + return t, nil +} + +// ParseGlob creates a new Template and parses the template definitions from the +// files identified by the pattern, which must match at least one file. The +// returned template will have the (base) name and (parsed) contents of the +// first file matched by the pattern. ParseGlob is equivalent to calling +// ParseFiles with the list of files matched by the pattern. +func ParseGlob(pattern string) (*Template, error) { + return parseGlob(nil, pattern) +} + +// ParseGlob parses the template definitions in the files identified by the +// pattern and associates the resulting templates with t. The pattern is +// processed by filepath.Glob and must match at least one file. ParseGlob is +// equivalent to calling t.ParseFiles with the list of files matched by the +// pattern. +func (t *Template) ParseGlob(pattern string) (*Template, error) { + return parseGlob(t, pattern) +} + +// parseGlob is the implementation of the function and method ParseGlob. +func parseGlob(t *Template, pattern string) (*Template, error) { + filenames, err := filepath.Glob(pattern) + if err != nil { + return nil, err + } + if len(filenames) == 0 { + return nil, fmt.Errorf("template: pattern matches no files: %#q", pattern) + } + return parseFiles(t, filenames...) +} diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/multi_test.go b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/multi_test.go new file mode 100644 index 0000000..8d10362 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/multi_test.go @@ -0,0 +1,293 @@ +// 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 template + +// Tests for mulitple-template parsing and execution. + +import ( + "bytes" + "fmt" + "strings" + "testing" + + "github.com/alecthomas/template/parse" +) + +const ( + noError = true + hasError = false +) + +type multiParseTest struct { + name string + input string + ok bool + names []string + results []string +} + +var multiParseTests = []multiParseTest{ + {"empty", "", noError, + nil, + nil}, + {"one", `{{define "foo"}} FOO {{end}}`, noError, + []string{"foo"}, + []string{" FOO "}}, + {"two", `{{define "foo"}} FOO {{end}}{{define "bar"}} BAR {{end}}`, noError, + []string{"foo", "bar"}, + []string{" FOO ", " BAR "}}, + // errors + {"missing end", `{{define "foo"}} FOO `, hasError, + nil, + nil}, + {"malformed name", `{{define "foo}} FOO `, hasError, + nil, + nil}, +} + +func TestMultiParse(t *testing.T) { + for _, test := range multiParseTests { + template, err := New("root").Parse(test.input) + switch { + case err == nil && !test.ok: + t.Errorf("%q: expected error; got none", test.name) + continue + case err != nil && test.ok: + t.Errorf("%q: unexpected error: %v", test.name, err) + continue + case err != nil && !test.ok: + // expected error, got one + if *debug { + fmt.Printf("%s: %s\n\t%s\n", test.name, test.input, err) + } + continue + } + if template == nil { + continue + } + if len(template.tmpl) != len(test.names)+1 { // +1 for root + t.Errorf("%s: wrong number of templates; wanted %d got %d", test.name, len(test.names), len(template.tmpl)) + continue + } + for i, name := range test.names { + tmpl, ok := template.tmpl[name] + if !ok { + t.Errorf("%s: can't find template %q", test.name, name) + continue + } + result := tmpl.Root.String() + if result != test.results[i] { + t.Errorf("%s=(%q): got\n\t%v\nexpected\n\t%v", test.name, test.input, result, test.results[i]) + } + } + } +} + +var multiExecTests = []execTest{ + {"empty", "", "", nil, true}, + {"text", "some text", "some text", nil, true}, + {"invoke x", `{{template "x" .SI}}`, "TEXT", tVal, true}, + {"invoke x no args", `{{template "x"}}`, "TEXT", tVal, true}, + {"invoke dot int", `{{template "dot" .I}}`, "17", tVal, true}, + {"invoke dot []int", `{{template "dot" .SI}}`, "[3 4 5]", tVal, true}, + {"invoke dotV", `{{template "dotV" .U}}`, "v", tVal, true}, + {"invoke nested int", `{{template "nested" .I}}`, "17", tVal, true}, + {"variable declared by template", `{{template "nested" $x:=.SI}},{{index $x 1}}`, "[3 4 5],4", tVal, true}, + + // User-defined function: test argument evaluator. + {"testFunc literal", `{{oneArg "joe"}}`, "oneArg=joe", tVal, true}, + {"testFunc .", `{{oneArg .}}`, "oneArg=joe", "joe", true}, +} + +// These strings are also in testdata/*. +const multiText1 = ` + {{define "x"}}TEXT{{end}} + {{define "dotV"}}{{.V}}{{end}} +` + +const multiText2 = ` + {{define "dot"}}{{.}}{{end}} + {{define "nested"}}{{template "dot" .}}{{end}} +` + +func TestMultiExecute(t *testing.T) { + // Declare a couple of templates first. + template, err := New("root").Parse(multiText1) + if err != nil { + t.Fatalf("parse error for 1: %s", err) + } + _, err = template.Parse(multiText2) + if err != nil { + t.Fatalf("parse error for 2: %s", err) + } + testExecute(multiExecTests, template, t) +} + +func TestParseFiles(t *testing.T) { + _, err := ParseFiles("DOES NOT EXIST") + if err == nil { + t.Error("expected error for non-existent file; got none") + } + template := New("root") + _, err = template.ParseFiles("testdata/file1.tmpl", "testdata/file2.tmpl") + if err != nil { + t.Fatalf("error parsing files: %v", err) + } + testExecute(multiExecTests, template, t) +} + +func TestParseGlob(t *testing.T) { + _, err := ParseGlob("DOES NOT EXIST") + if err == nil { + t.Error("expected error for non-existent file; got none") + } + _, err = New("error").ParseGlob("[x") + if err == nil { + t.Error("expected error for bad pattern; got none") + } + template := New("root") + _, err = template.ParseGlob("testdata/file*.tmpl") + if err != nil { + t.Fatalf("error parsing files: %v", err) + } + testExecute(multiExecTests, template, t) +} + +// In these tests, actual content (not just template definitions) comes from the parsed files. + +var templateFileExecTests = []execTest{ + {"test", `{{template "tmpl1.tmpl"}}{{template "tmpl2.tmpl"}}`, "template1\n\ny\ntemplate2\n\nx\n", 0, true}, +} + +func TestParseFilesWithData(t *testing.T) { + template, err := New("root").ParseFiles("testdata/tmpl1.tmpl", "testdata/tmpl2.tmpl") + if err != nil { + t.Fatalf("error parsing files: %v", err) + } + testExecute(templateFileExecTests, template, t) +} + +func TestParseGlobWithData(t *testing.T) { + template, err := New("root").ParseGlob("testdata/tmpl*.tmpl") + if err != nil { + t.Fatalf("error parsing files: %v", err) + } + testExecute(templateFileExecTests, template, t) +} + +const ( + cloneText1 = `{{define "a"}}{{template "b"}}{{template "c"}}{{end}}` + cloneText2 = `{{define "b"}}b{{end}}` + cloneText3 = `{{define "c"}}root{{end}}` + cloneText4 = `{{define "c"}}clone{{end}}` +) + +func TestClone(t *testing.T) { + // Create some templates and clone the root. + root, err := New("root").Parse(cloneText1) + if err != nil { + t.Fatal(err) + } + _, err = root.Parse(cloneText2) + if err != nil { + t.Fatal(err) + } + clone := Must(root.Clone()) + // Add variants to both. + _, err = root.Parse(cloneText3) + if err != nil { + t.Fatal(err) + } + _, err = clone.Parse(cloneText4) + if err != nil { + t.Fatal(err) + } + // Verify that the clone is self-consistent. + for k, v := range clone.tmpl { + if k == clone.name && v.tmpl[k] != clone { + t.Error("clone does not contain root") + } + if v != v.tmpl[v.name] { + t.Errorf("clone does not contain self for %q", k) + } + } + // Execute root. + var b bytes.Buffer + err = root.ExecuteTemplate(&b, "a", 0) + if err != nil { + t.Fatal(err) + } + if b.String() != "broot" { + t.Errorf("expected %q got %q", "broot", b.String()) + } + // Execute copy. + b.Reset() + err = clone.ExecuteTemplate(&b, "a", 0) + if err != nil { + t.Fatal(err) + } + if b.String() != "bclone" { + t.Errorf("expected %q got %q", "bclone", b.String()) + } +} + +func TestAddParseTree(t *testing.T) { + // Create some templates. + root, err := New("root").Parse(cloneText1) + if err != nil { + t.Fatal(err) + } + _, err = root.Parse(cloneText2) + if err != nil { + t.Fatal(err) + } + // Add a new parse tree. + tree, err := parse.Parse("cloneText3", cloneText3, "", "", nil, builtins) + if err != nil { + t.Fatal(err) + } + added, err := root.AddParseTree("c", tree["c"]) + // Execute. + var b bytes.Buffer + err = added.ExecuteTemplate(&b, "a", 0) + if err != nil { + t.Fatal(err) + } + if b.String() != "broot" { + t.Errorf("expected %q got %q", "broot", b.String()) + } +} + +// Issue 7032 +func TestAddParseTreeToUnparsedTemplate(t *testing.T) { + master := "{{define \"master\"}}{{end}}" + tmpl := New("master") + tree, err := parse.Parse("master", master, "", "", nil) + if err != nil { + t.Fatalf("unexpected parse err: %v", err) + } + masterTree := tree["master"] + tmpl.AddParseTree("master", masterTree) // used to panic +} + +func TestRedefinition(t *testing.T) { + var tmpl *Template + var err error + if tmpl, err = New("tmpl1").Parse(`{{define "test"}}foo{{end}}`); err != nil { + t.Fatalf("parse 1: %v", err) + } + if _, err = tmpl.Parse(`{{define "test"}}bar{{end}}`); err == nil { + t.Fatal("expected error") + } + if !strings.Contains(err.Error(), "redefinition") { + t.Fatalf("expected redefinition error; got %v", err) + } + if _, err = tmpl.New("tmpl2").Parse(`{{define "test"}}bar{{end}}`); err == nil { + t.Fatal("expected error") + } + if !strings.Contains(err.Error(), "redefinition") { + t.Fatalf("expected redefinition error; got %v", err) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/parse/lex.go b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/parse/lex.go new file mode 100644 index 0000000..55f1c05 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/parse/lex.go @@ -0,0 +1,556 @@ +// 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 parse + +import ( + "fmt" + "strings" + "unicode" + "unicode/utf8" +) + +// item represents a token or text string returned from the scanner. +type item struct { + typ itemType // The type of this item. + pos Pos // The starting position, in bytes, of this item in the input string. + val string // The value of this item. +} + +func (i item) String() string { + switch { + case i.typ == itemEOF: + return "EOF" + case i.typ == itemError: + return i.val + case i.typ > itemKeyword: + return fmt.Sprintf("<%s>", i.val) + case len(i.val) > 10: + return fmt.Sprintf("%.10q...", i.val) + } + return fmt.Sprintf("%q", i.val) +} + +// itemType identifies the type of lex items. +type itemType int + +const ( + itemError itemType = iota // error occurred; value is text of error + itemBool // boolean constant + itemChar // printable ASCII character; grab bag for comma etc. + itemCharConstant // character constant + itemComplex // complex constant (1+2i); imaginary is just a number + itemColonEquals // colon-equals (':=') introducing a declaration + itemEOF + itemField // alphanumeric identifier starting with '.' + itemIdentifier // alphanumeric identifier not starting with '.' + itemLeftDelim // left action delimiter + itemLeftParen // '(' inside action + itemNumber // simple number, including imaginary + itemPipe // pipe symbol + itemRawString // raw quoted string (includes quotes) + itemRightDelim // right action delimiter + itemElideNewline // elide newline after right delim + itemRightParen // ')' inside action + itemSpace // run of spaces separating arguments + itemString // quoted string (includes quotes) + itemText // plain text + itemVariable // variable starting with '$', such as '$' or '$1' or '$hello' + // Keywords appear after all the rest. + itemKeyword // used only to delimit the keywords + itemDot // the cursor, spelled '.' + itemDefine // define keyword + itemElse // else keyword + itemEnd // end keyword + itemIf // if keyword + itemNil // the untyped nil constant, easiest to treat as a keyword + itemRange // range keyword + itemTemplate // template keyword + itemWith // with keyword +) + +var key = map[string]itemType{ + ".": itemDot, + "define": itemDefine, + "else": itemElse, + "end": itemEnd, + "if": itemIf, + "range": itemRange, + "nil": itemNil, + "template": itemTemplate, + "with": itemWith, +} + +const eof = -1 + +// stateFn represents the state of the scanner as a function that returns the next state. +type stateFn func(*lexer) stateFn + +// lexer holds the state of the scanner. +type lexer struct { + name string // the name of the input; used only for error reports + input string // the string being scanned + leftDelim string // start of action + rightDelim string // end of action + state stateFn // the next lexing function to enter + pos Pos // current position in the input + start Pos // start position of this item + width Pos // width of last rune read from input + lastPos Pos // position of most recent item returned by nextItem + items chan item // channel of scanned items + parenDepth int // nesting depth of ( ) exprs +} + +// next returns the next rune in the input. +func (l *lexer) next() rune { + if int(l.pos) >= len(l.input) { + l.width = 0 + return eof + } + r, w := utf8.DecodeRuneInString(l.input[l.pos:]) + l.width = Pos(w) + l.pos += l.width + return r +} + +// peek returns but does not consume the next rune in the input. +func (l *lexer) peek() rune { + r := l.next() + l.backup() + return r +} + +// backup steps back one rune. Can only be called once per call of next. +func (l *lexer) backup() { + l.pos -= l.width +} + +// emit passes an item back to the client. +func (l *lexer) emit(t itemType) { + l.items <- item{t, l.start, l.input[l.start:l.pos]} + l.start = l.pos +} + +// ignore skips over the pending input before this point. +func (l *lexer) ignore() { + l.start = l.pos +} + +// accept consumes the next rune if it's from the valid set. +func (l *lexer) accept(valid string) bool { + if strings.IndexRune(valid, l.next()) >= 0 { + return true + } + l.backup() + return false +} + +// acceptRun consumes a run of runes from the valid set. +func (l *lexer) acceptRun(valid string) { + for strings.IndexRune(valid, l.next()) >= 0 { + } + l.backup() +} + +// lineNumber reports which line we're on, based on the position of +// the previous item returned by nextItem. Doing it this way +// means we don't have to worry about peek double counting. +func (l *lexer) lineNumber() int { + return 1 + strings.Count(l.input[:l.lastPos], "\n") +} + +// errorf returns an error token and terminates the scan by passing +// back a nil pointer that will be the next state, terminating l.nextItem. +func (l *lexer) errorf(format string, args ...interface{}) stateFn { + l.items <- item{itemError, l.start, fmt.Sprintf(format, args...)} + return nil +} + +// nextItem returns the next item from the input. +func (l *lexer) nextItem() item { + item := <-l.items + l.lastPos = item.pos + return item +} + +// lex creates a new scanner for the input string. +func lex(name, input, left, right string) *lexer { + if left == "" { + left = leftDelim + } + if right == "" { + right = rightDelim + } + l := &lexer{ + name: name, + input: input, + leftDelim: left, + rightDelim: right, + items: make(chan item), + } + go l.run() + return l +} + +// run runs the state machine for the lexer. +func (l *lexer) run() { + for l.state = lexText; l.state != nil; { + l.state = l.state(l) + } +} + +// state functions + +const ( + leftDelim = "{{" + rightDelim = "}}" + leftComment = "/*" + rightComment = "*/" +) + +// lexText scans until an opening action delimiter, "{{". +func lexText(l *lexer) stateFn { + for { + if strings.HasPrefix(l.input[l.pos:], l.leftDelim) { + if l.pos > l.start { + l.emit(itemText) + } + return lexLeftDelim + } + if l.next() == eof { + break + } + } + // Correctly reached EOF. + if l.pos > l.start { + l.emit(itemText) + } + l.emit(itemEOF) + return nil +} + +// lexLeftDelim scans the left delimiter, which is known to be present. +func lexLeftDelim(l *lexer) stateFn { + l.pos += Pos(len(l.leftDelim)) + if strings.HasPrefix(l.input[l.pos:], leftComment) { + return lexComment + } + l.emit(itemLeftDelim) + l.parenDepth = 0 + return lexInsideAction +} + +// lexComment scans a comment. The left comment marker is known to be present. +func lexComment(l *lexer) stateFn { + l.pos += Pos(len(leftComment)) + i := strings.Index(l.input[l.pos:], rightComment) + if i < 0 { + return l.errorf("unclosed comment") + } + l.pos += Pos(i + len(rightComment)) + if !strings.HasPrefix(l.input[l.pos:], l.rightDelim) { + return l.errorf("comment ends before closing delimiter") + + } + l.pos += Pos(len(l.rightDelim)) + l.ignore() + return lexText +} + +// lexRightDelim scans the right delimiter, which is known to be present. +func lexRightDelim(l *lexer) stateFn { + l.pos += Pos(len(l.rightDelim)) + l.emit(itemRightDelim) + if l.peek() == '\\' { + l.pos++ + l.emit(itemElideNewline) + } + return lexText +} + +// lexInsideAction scans the elements inside action delimiters. +func lexInsideAction(l *lexer) stateFn { + // Either number, quoted string, or identifier. + // Spaces separate arguments; runs of spaces turn into itemSpace. + // Pipe symbols separate and are emitted. + if strings.HasPrefix(l.input[l.pos:], l.rightDelim+"\\") || strings.HasPrefix(l.input[l.pos:], l.rightDelim) { + if l.parenDepth == 0 { + return lexRightDelim + } + return l.errorf("unclosed left paren") + } + switch r := l.next(); { + case r == eof || isEndOfLine(r): + return l.errorf("unclosed action") + case isSpace(r): + return lexSpace + case r == ':': + if l.next() != '=' { + return l.errorf("expected :=") + } + l.emit(itemColonEquals) + case r == '|': + l.emit(itemPipe) + case r == '"': + return lexQuote + case r == '`': + return lexRawQuote + case r == '$': + return lexVariable + case r == '\'': + return lexChar + case r == '.': + // special look-ahead for ".field" so we don't break l.backup(). + if l.pos < Pos(len(l.input)) { + r := l.input[l.pos] + if r < '0' || '9' < r { + return lexField + } + } + fallthrough // '.' can start a number. + case r == '+' || r == '-' || ('0' <= r && r <= '9'): + l.backup() + return lexNumber + case isAlphaNumeric(r): + l.backup() + return lexIdentifier + case r == '(': + l.emit(itemLeftParen) + l.parenDepth++ + return lexInsideAction + case r == ')': + l.emit(itemRightParen) + l.parenDepth-- + if l.parenDepth < 0 { + return l.errorf("unexpected right paren %#U", r) + } + return lexInsideAction + case r <= unicode.MaxASCII && unicode.IsPrint(r): + l.emit(itemChar) + return lexInsideAction + default: + return l.errorf("unrecognized character in action: %#U", r) + } + return lexInsideAction +} + +// lexSpace scans a run of space characters. +// One space has already been seen. +func lexSpace(l *lexer) stateFn { + for isSpace(l.peek()) { + l.next() + } + l.emit(itemSpace) + return lexInsideAction +} + +// lexIdentifier scans an alphanumeric. +func lexIdentifier(l *lexer) stateFn { +Loop: + for { + switch r := l.next(); { + case isAlphaNumeric(r): + // absorb. + default: + l.backup() + word := l.input[l.start:l.pos] + if !l.atTerminator() { + return l.errorf("bad character %#U", r) + } + switch { + case key[word] > itemKeyword: + l.emit(key[word]) + case word[0] == '.': + l.emit(itemField) + case word == "true", word == "false": + l.emit(itemBool) + default: + l.emit(itemIdentifier) + } + break Loop + } + } + return lexInsideAction +} + +// lexField scans a field: .Alphanumeric. +// The . has been scanned. +func lexField(l *lexer) stateFn { + return lexFieldOrVariable(l, itemField) +} + +// lexVariable scans a Variable: $Alphanumeric. +// The $ has been scanned. +func lexVariable(l *lexer) stateFn { + if l.atTerminator() { // Nothing interesting follows -> "$". + l.emit(itemVariable) + return lexInsideAction + } + return lexFieldOrVariable(l, itemVariable) +} + +// lexVariable scans a field or variable: [.$]Alphanumeric. +// The . or $ has been scanned. +func lexFieldOrVariable(l *lexer, typ itemType) stateFn { + if l.atTerminator() { // Nothing interesting follows -> "." or "$". + if typ == itemVariable { + l.emit(itemVariable) + } else { + l.emit(itemDot) + } + return lexInsideAction + } + var r rune + for { + r = l.next() + if !isAlphaNumeric(r) { + l.backup() + break + } + } + if !l.atTerminator() { + return l.errorf("bad character %#U", r) + } + l.emit(typ) + return lexInsideAction +} + +// atTerminator reports whether the input is at valid termination character to +// appear after an identifier. Breaks .X.Y into two pieces. Also catches cases +// like "$x+2" not being acceptable without a space, in case we decide one +// day to implement arithmetic. +func (l *lexer) atTerminator() bool { + r := l.peek() + if isSpace(r) || isEndOfLine(r) { + return true + } + switch r { + case eof, '.', ',', '|', ':', ')', '(': + return true + } + // Does r start the delimiter? This can be ambiguous (with delim=="//", $x/2 will + // succeed but should fail) but only in extremely rare cases caused by willfully + // bad choice of delimiter. + if rd, _ := utf8.DecodeRuneInString(l.rightDelim); rd == r { + return true + } + return false +} + +// lexChar scans a character constant. The initial quote is already +// scanned. Syntax checking is done by the parser. +func lexChar(l *lexer) stateFn { +Loop: + for { + switch l.next() { + case '\\': + if r := l.next(); r != eof && r != '\n' { + break + } + fallthrough + case eof, '\n': + return l.errorf("unterminated character constant") + case '\'': + break Loop + } + } + l.emit(itemCharConstant) + return lexInsideAction +} + +// lexNumber scans a number: decimal, octal, hex, float, or imaginary. This +// isn't a perfect number scanner - for instance it accepts "." and "0x0.2" +// and "089" - but when it's wrong the input is invalid and the parser (via +// strconv) will notice. +func lexNumber(l *lexer) stateFn { + if !l.scanNumber() { + return l.errorf("bad number syntax: %q", l.input[l.start:l.pos]) + } + if sign := l.peek(); sign == '+' || sign == '-' { + // Complex: 1+2i. No spaces, must end in 'i'. + if !l.scanNumber() || l.input[l.pos-1] != 'i' { + return l.errorf("bad number syntax: %q", l.input[l.start:l.pos]) + } + l.emit(itemComplex) + } else { + l.emit(itemNumber) + } + return lexInsideAction +} + +func (l *lexer) scanNumber() bool { + // Optional leading sign. + l.accept("+-") + // Is it hex? + digits := "0123456789" + if l.accept("0") && l.accept("xX") { + digits = "0123456789abcdefABCDEF" + } + l.acceptRun(digits) + if l.accept(".") { + l.acceptRun(digits) + } + if l.accept("eE") { + l.accept("+-") + l.acceptRun("0123456789") + } + // Is it imaginary? + l.accept("i") + // Next thing mustn't be alphanumeric. + if isAlphaNumeric(l.peek()) { + l.next() + return false + } + return true +} + +// lexQuote scans a quoted string. +func lexQuote(l *lexer) stateFn { +Loop: + for { + switch l.next() { + case '\\': + if r := l.next(); r != eof && r != '\n' { + break + } + fallthrough + case eof, '\n': + return l.errorf("unterminated quoted string") + case '"': + break Loop + } + } + l.emit(itemString) + return lexInsideAction +} + +// lexRawQuote scans a raw quoted string. +func lexRawQuote(l *lexer) stateFn { +Loop: + for { + switch l.next() { + case eof, '\n': + return l.errorf("unterminated raw quoted string") + case '`': + break Loop + } + } + l.emit(itemRawString) + return lexInsideAction +} + +// isSpace reports whether r is a space character. +func isSpace(r rune) bool { + return r == ' ' || r == '\t' +} + +// isEndOfLine reports whether r is an end-of-line character. +func isEndOfLine(r rune) bool { + return r == '\r' || r == '\n' +} + +// isAlphaNumeric reports whether r is an alphabetic, digit, or underscore. +func isAlphaNumeric(r rune) bool { + return r == '_' || unicode.IsLetter(r) || unicode.IsDigit(r) +} diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/parse/lex_test.go b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/parse/lex_test.go new file mode 100644 index 0000000..3b92107 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/parse/lex_test.go @@ -0,0 +1,468 @@ +// 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 parse + +import ( + "fmt" + "testing" +) + +// Make the types prettyprint. +var itemName = map[itemType]string{ + itemError: "error", + itemBool: "bool", + itemChar: "char", + itemCharConstant: "charconst", + itemComplex: "complex", + itemColonEquals: ":=", + itemEOF: "EOF", + itemField: "field", + itemIdentifier: "identifier", + itemLeftDelim: "left delim", + itemLeftParen: "(", + itemNumber: "number", + itemPipe: "pipe", + itemRawString: "raw string", + itemRightDelim: "right delim", + itemElideNewline: "elide newline", + itemRightParen: ")", + itemSpace: "space", + itemString: "string", + itemVariable: "variable", + + // keywords + itemDot: ".", + itemDefine: "define", + itemElse: "else", + itemIf: "if", + itemEnd: "end", + itemNil: "nil", + itemRange: "range", + itemTemplate: "template", + itemWith: "with", +} + +func (i itemType) String() string { + s := itemName[i] + if s == "" { + return fmt.Sprintf("item%d", int(i)) + } + return s +} + +type lexTest struct { + name string + input string + items []item +} + +var ( + tEOF = item{itemEOF, 0, ""} + tFor = item{itemIdentifier, 0, "for"} + tLeft = item{itemLeftDelim, 0, "{{"} + tLpar = item{itemLeftParen, 0, "("} + tPipe = item{itemPipe, 0, "|"} + tQuote = item{itemString, 0, `"abc \n\t\" "`} + tRange = item{itemRange, 0, "range"} + tRight = item{itemRightDelim, 0, "}}"} + tElideNewline = item{itemElideNewline, 0, "\\"} + tRpar = item{itemRightParen, 0, ")"} + tSpace = item{itemSpace, 0, " "} + raw = "`" + `abc\n\t\" ` + "`" + tRawQuote = item{itemRawString, 0, raw} +) + +var lexTests = []lexTest{ + {"empty", "", []item{tEOF}}, + {"spaces", " \t\n", []item{{itemText, 0, " \t\n"}, tEOF}}, + {"text", `now is the time`, []item{{itemText, 0, "now is the time"}, tEOF}}, + {"elide newline", "{{}}\\", []item{tLeft, tRight, tElideNewline, tEOF}}, + {"text with comment", "hello-{{/* this is a comment */}}-world", []item{ + {itemText, 0, "hello-"}, + {itemText, 0, "-world"}, + tEOF, + }}, + {"punctuation", "{{,@% }}", []item{ + tLeft, + {itemChar, 0, ","}, + {itemChar, 0, "@"}, + {itemChar, 0, "%"}, + tSpace, + tRight, + tEOF, + }}, + {"parens", "{{((3))}}", []item{ + tLeft, + tLpar, + tLpar, + {itemNumber, 0, "3"}, + tRpar, + tRpar, + tRight, + tEOF, + }}, + {"empty action", `{{}}`, []item{tLeft, tRight, tEOF}}, + {"for", `{{for}}`, []item{tLeft, tFor, tRight, tEOF}}, + {"quote", `{{"abc \n\t\" "}}`, []item{tLeft, tQuote, tRight, tEOF}}, + {"raw quote", "{{" + raw + "}}", []item{tLeft, tRawQuote, tRight, tEOF}}, + {"numbers", "{{1 02 0x14 -7.2i 1e3 +1.2e-4 4.2i 1+2i}}", []item{ + tLeft, + {itemNumber, 0, "1"}, + tSpace, + {itemNumber, 0, "02"}, + tSpace, + {itemNumber, 0, "0x14"}, + tSpace, + {itemNumber, 0, "-7.2i"}, + tSpace, + {itemNumber, 0, "1e3"}, + tSpace, + {itemNumber, 0, "+1.2e-4"}, + tSpace, + {itemNumber, 0, "4.2i"}, + tSpace, + {itemComplex, 0, "1+2i"}, + tRight, + tEOF, + }}, + {"characters", `{{'a' '\n' '\'' '\\' '\u00FF' '\xFF' '本'}}`, []item{ + tLeft, + {itemCharConstant, 0, `'a'`}, + tSpace, + {itemCharConstant, 0, `'\n'`}, + tSpace, + {itemCharConstant, 0, `'\''`}, + tSpace, + {itemCharConstant, 0, `'\\'`}, + tSpace, + {itemCharConstant, 0, `'\u00FF'`}, + tSpace, + {itemCharConstant, 0, `'\xFF'`}, + tSpace, + {itemCharConstant, 0, `'本'`}, + tRight, + tEOF, + }}, + {"bools", "{{true false}}", []item{ + tLeft, + {itemBool, 0, "true"}, + tSpace, + {itemBool, 0, "false"}, + tRight, + tEOF, + }}, + {"dot", "{{.}}", []item{ + tLeft, + {itemDot, 0, "."}, + tRight, + tEOF, + }}, + {"nil", "{{nil}}", []item{ + tLeft, + {itemNil, 0, "nil"}, + tRight, + tEOF, + }}, + {"dots", "{{.x . .2 .x.y.z}}", []item{ + tLeft, + {itemField, 0, ".x"}, + tSpace, + {itemDot, 0, "."}, + tSpace, + {itemNumber, 0, ".2"}, + tSpace, + {itemField, 0, ".x"}, + {itemField, 0, ".y"}, + {itemField, 0, ".z"}, + tRight, + tEOF, + }}, + {"keywords", "{{range if else end with}}", []item{ + tLeft, + {itemRange, 0, "range"}, + tSpace, + {itemIf, 0, "if"}, + tSpace, + {itemElse, 0, "else"}, + tSpace, + {itemEnd, 0, "end"}, + tSpace, + {itemWith, 0, "with"}, + tRight, + tEOF, + }}, + {"variables", "{{$c := printf $ $hello $23 $ $var.Field .Method}}", []item{ + tLeft, + {itemVariable, 0, "$c"}, + tSpace, + {itemColonEquals, 0, ":="}, + tSpace, + {itemIdentifier, 0, "printf"}, + tSpace, + {itemVariable, 0, "$"}, + tSpace, + {itemVariable, 0, "$hello"}, + tSpace, + {itemVariable, 0, "$23"}, + tSpace, + {itemVariable, 0, "$"}, + tSpace, + {itemVariable, 0, "$var"}, + {itemField, 0, ".Field"}, + tSpace, + {itemField, 0, ".Method"}, + tRight, + tEOF, + }}, + {"variable invocation", "{{$x 23}}", []item{ + tLeft, + {itemVariable, 0, "$x"}, + tSpace, + {itemNumber, 0, "23"}, + tRight, + tEOF, + }}, + {"pipeline", `intro {{echo hi 1.2 |noargs|args 1 "hi"}} outro`, []item{ + {itemText, 0, "intro "}, + tLeft, + {itemIdentifier, 0, "echo"}, + tSpace, + {itemIdentifier, 0, "hi"}, + tSpace, + {itemNumber, 0, "1.2"}, + tSpace, + tPipe, + {itemIdentifier, 0, "noargs"}, + tPipe, + {itemIdentifier, 0, "args"}, + tSpace, + {itemNumber, 0, "1"}, + tSpace, + {itemString, 0, `"hi"`}, + tRight, + {itemText, 0, " outro"}, + tEOF, + }}, + {"declaration", "{{$v := 3}}", []item{ + tLeft, + {itemVariable, 0, "$v"}, + tSpace, + {itemColonEquals, 0, ":="}, + tSpace, + {itemNumber, 0, "3"}, + tRight, + tEOF, + }}, + {"2 declarations", "{{$v , $w := 3}}", []item{ + tLeft, + {itemVariable, 0, "$v"}, + tSpace, + {itemChar, 0, ","}, + tSpace, + {itemVariable, 0, "$w"}, + tSpace, + {itemColonEquals, 0, ":="}, + tSpace, + {itemNumber, 0, "3"}, + tRight, + tEOF, + }}, + {"field of parenthesized expression", "{{(.X).Y}}", []item{ + tLeft, + tLpar, + {itemField, 0, ".X"}, + tRpar, + {itemField, 0, ".Y"}, + tRight, + tEOF, + }}, + // errors + {"badchar", "#{{\x01}}", []item{ + {itemText, 0, "#"}, + tLeft, + {itemError, 0, "unrecognized character in action: U+0001"}, + }}, + {"unclosed action", "{{\n}}", []item{ + tLeft, + {itemError, 0, "unclosed action"}, + }}, + {"EOF in action", "{{range", []item{ + tLeft, + tRange, + {itemError, 0, "unclosed action"}, + }}, + {"unclosed quote", "{{\"\n\"}}", []item{ + tLeft, + {itemError, 0, "unterminated quoted string"}, + }}, + {"unclosed raw quote", "{{`xx\n`}}", []item{ + tLeft, + {itemError, 0, "unterminated raw quoted string"}, + }}, + {"unclosed char constant", "{{'\n}}", []item{ + tLeft, + {itemError, 0, "unterminated character constant"}, + }}, + {"bad number", "{{3k}}", []item{ + tLeft, + {itemError, 0, `bad number syntax: "3k"`}, + }}, + {"unclosed paren", "{{(3}}", []item{ + tLeft, + tLpar, + {itemNumber, 0, "3"}, + {itemError, 0, `unclosed left paren`}, + }}, + {"extra right paren", "{{3)}}", []item{ + tLeft, + {itemNumber, 0, "3"}, + tRpar, + {itemError, 0, `unexpected right paren U+0029 ')'`}, + }}, + + // Fixed bugs + // Many elements in an action blew the lookahead until + // we made lexInsideAction not loop. + {"long pipeline deadlock", "{{|||||}}", []item{ + tLeft, + tPipe, + tPipe, + tPipe, + tPipe, + tPipe, + tRight, + tEOF, + }}, + {"text with bad comment", "hello-{{/*/}}-world", []item{ + {itemText, 0, "hello-"}, + {itemError, 0, `unclosed comment`}, + }}, + {"text with comment close separted from delim", "hello-{{/* */ }}-world", []item{ + {itemText, 0, "hello-"}, + {itemError, 0, `comment ends before closing delimiter`}, + }}, + // This one is an error that we can't catch because it breaks templates with + // minimized JavaScript. Should have fixed it before Go 1.1. + {"unmatched right delimiter", "hello-{.}}-world", []item{ + {itemText, 0, "hello-{.}}-world"}, + tEOF, + }}, +} + +// collect gathers the emitted items into a slice. +func collect(t *lexTest, left, right string) (items []item) { + l := lex(t.name, t.input, left, right) + for { + item := l.nextItem() + items = append(items, item) + if item.typ == itemEOF || item.typ == itemError { + break + } + } + return +} + +func equal(i1, i2 []item, checkPos bool) bool { + if len(i1) != len(i2) { + return false + } + for k := range i1 { + if i1[k].typ != i2[k].typ { + return false + } + if i1[k].val != i2[k].val { + return false + } + if checkPos && i1[k].pos != i2[k].pos { + return false + } + } + return true +} + +func TestLex(t *testing.T) { + for _, test := range lexTests { + items := collect(&test, "", "") + if !equal(items, test.items, false) { + t.Errorf("%s: got\n\t%+v\nexpected\n\t%v", test.name, items, test.items) + } + } +} + +// Some easy cases from above, but with delimiters $$ and @@ +var lexDelimTests = []lexTest{ + {"punctuation", "$$,@%{{}}@@", []item{ + tLeftDelim, + {itemChar, 0, ","}, + {itemChar, 0, "@"}, + {itemChar, 0, "%"}, + {itemChar, 0, "{"}, + {itemChar, 0, "{"}, + {itemChar, 0, "}"}, + {itemChar, 0, "}"}, + tRightDelim, + tEOF, + }}, + {"empty action", `$$@@`, []item{tLeftDelim, tRightDelim, tEOF}}, + {"for", `$$for@@`, []item{tLeftDelim, tFor, tRightDelim, tEOF}}, + {"quote", `$$"abc \n\t\" "@@`, []item{tLeftDelim, tQuote, tRightDelim, tEOF}}, + {"raw quote", "$$" + raw + "@@", []item{tLeftDelim, tRawQuote, tRightDelim, tEOF}}, +} + +var ( + tLeftDelim = item{itemLeftDelim, 0, "$$"} + tRightDelim = item{itemRightDelim, 0, "@@"} +) + +func TestDelims(t *testing.T) { + for _, test := range lexDelimTests { + items := collect(&test, "$$", "@@") + if !equal(items, test.items, false) { + t.Errorf("%s: got\n\t%v\nexpected\n\t%v", test.name, items, test.items) + } + } +} + +var lexPosTests = []lexTest{ + {"empty", "", []item{tEOF}}, + {"punctuation", "{{,@%#}}", []item{ + {itemLeftDelim, 0, "{{"}, + {itemChar, 2, ","}, + {itemChar, 3, "@"}, + {itemChar, 4, "%"}, + {itemChar, 5, "#"}, + {itemRightDelim, 6, "}}"}, + {itemEOF, 8, ""}, + }}, + {"sample", "0123{{hello}}xyz", []item{ + {itemText, 0, "0123"}, + {itemLeftDelim, 4, "{{"}, + {itemIdentifier, 6, "hello"}, + {itemRightDelim, 11, "}}"}, + {itemText, 13, "xyz"}, + {itemEOF, 16, ""}, + }}, +} + +// The other tests don't check position, to make the test cases easier to construct. +// This one does. +func TestPos(t *testing.T) { + for _, test := range lexPosTests { + items := collect(&test, "", "") + if !equal(items, test.items, true) { + t.Errorf("%s: got\n\t%v\nexpected\n\t%v", test.name, items, test.items) + if len(items) == len(test.items) { + // Detailed print; avoid item.String() to expose the position value. + for i := range items { + if !equal(items[i:i+1], test.items[i:i+1], true) { + i1 := items[i] + i2 := test.items[i] + t.Errorf("\t#%d: got {%v %d %q} expected {%v %d %q}", i, i1.typ, i1.pos, i1.val, i2.typ, i2.pos, i2.val) + } + } + } + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/parse/node.go b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/parse/node.go new file mode 100644 index 0000000..55c37f6 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/parse/node.go @@ -0,0 +1,834 @@ +// 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. + +// Parse nodes. + +package parse + +import ( + "bytes" + "fmt" + "strconv" + "strings" +) + +var textFormat = "%s" // Changed to "%q" in tests for better error messages. + +// A Node is an element in the parse tree. The interface is trivial. +// The interface contains an unexported method so that only +// types local to this package can satisfy it. +type Node interface { + Type() NodeType + String() string + // Copy does a deep copy of the Node and all its components. + // To avoid type assertions, some XxxNodes also have specialized + // CopyXxx methods that return *XxxNode. + Copy() Node + Position() Pos // byte position of start of node in full original input string + // tree returns the containing *Tree. + // It is unexported so all implementations of Node are in this package. + tree() *Tree +} + +// NodeType identifies the type of a parse tree node. +type NodeType int + +// Pos represents a byte position in the original input text from which +// this template was parsed. +type Pos int + +func (p Pos) Position() Pos { + return p +} + +// Type returns itself and provides an easy default implementation +// for embedding in a Node. Embedded in all non-trivial Nodes. +func (t NodeType) Type() NodeType { + return t +} + +const ( + NodeText NodeType = iota // Plain text. + NodeAction // A non-control action such as a field evaluation. + NodeBool // A boolean constant. + NodeChain // A sequence of field accesses. + NodeCommand // An element of a pipeline. + NodeDot // The cursor, dot. + nodeElse // An else action. Not added to tree. + nodeEnd // An end action. Not added to tree. + NodeField // A field or method name. + NodeIdentifier // An identifier; always a function name. + NodeIf // An if action. + NodeList // A list of Nodes. + NodeNil // An untyped nil constant. + NodeNumber // A numerical constant. + NodePipe // A pipeline of commands. + NodeRange // A range action. + NodeString // A string constant. + NodeTemplate // A template invocation action. + NodeVariable // A $ variable. + NodeWith // A with action. +) + +// Nodes. + +// ListNode holds a sequence of nodes. +type ListNode struct { + NodeType + Pos + tr *Tree + Nodes []Node // The element nodes in lexical order. +} + +func (t *Tree) newList(pos Pos) *ListNode { + return &ListNode{tr: t, NodeType: NodeList, Pos: pos} +} + +func (l *ListNode) append(n Node) { + l.Nodes = append(l.Nodes, n) +} + +func (l *ListNode) tree() *Tree { + return l.tr +} + +func (l *ListNode) String() string { + b := new(bytes.Buffer) + for _, n := range l.Nodes { + fmt.Fprint(b, n) + } + return b.String() +} + +func (l *ListNode) CopyList() *ListNode { + if l == nil { + return l + } + n := l.tr.newList(l.Pos) + for _, elem := range l.Nodes { + n.append(elem.Copy()) + } + return n +} + +func (l *ListNode) Copy() Node { + return l.CopyList() +} + +// TextNode holds plain text. +type TextNode struct { + NodeType + Pos + tr *Tree + Text []byte // The text; may span newlines. +} + +func (t *Tree) newText(pos Pos, text string) *TextNode { + return &TextNode{tr: t, NodeType: NodeText, Pos: pos, Text: []byte(text)} +} + +func (t *TextNode) String() string { + return fmt.Sprintf(textFormat, t.Text) +} + +func (t *TextNode) tree() *Tree { + return t.tr +} + +func (t *TextNode) Copy() Node { + return &TextNode{tr: t.tr, NodeType: NodeText, Pos: t.Pos, Text: append([]byte{}, t.Text...)} +} + +// PipeNode holds a pipeline with optional declaration +type PipeNode struct { + NodeType + Pos + tr *Tree + Line int // The line number in the input (deprecated; kept for compatibility) + Decl []*VariableNode // Variable declarations in lexical order. + Cmds []*CommandNode // The commands in lexical order. +} + +func (t *Tree) newPipeline(pos Pos, line int, decl []*VariableNode) *PipeNode { + return &PipeNode{tr: t, NodeType: NodePipe, Pos: pos, Line: line, Decl: decl} +} + +func (p *PipeNode) append(command *CommandNode) { + p.Cmds = append(p.Cmds, command) +} + +func (p *PipeNode) String() string { + s := "" + if len(p.Decl) > 0 { + for i, v := range p.Decl { + if i > 0 { + s += ", " + } + s += v.String() + } + s += " := " + } + for i, c := range p.Cmds { + if i > 0 { + s += " | " + } + s += c.String() + } + return s +} + +func (p *PipeNode) tree() *Tree { + return p.tr +} + +func (p *PipeNode) CopyPipe() *PipeNode { + if p == nil { + return p + } + var decl []*VariableNode + for _, d := range p.Decl { + decl = append(decl, d.Copy().(*VariableNode)) + } + n := p.tr.newPipeline(p.Pos, p.Line, decl) + for _, c := range p.Cmds { + n.append(c.Copy().(*CommandNode)) + } + return n +} + +func (p *PipeNode) Copy() Node { + return p.CopyPipe() +} + +// ActionNode holds an action (something bounded by delimiters). +// Control actions have their own nodes; ActionNode represents simple +// ones such as field evaluations and parenthesized pipelines. +type ActionNode struct { + NodeType + Pos + tr *Tree + Line int // The line number in the input (deprecated; kept for compatibility) + Pipe *PipeNode // The pipeline in the action. +} + +func (t *Tree) newAction(pos Pos, line int, pipe *PipeNode) *ActionNode { + return &ActionNode{tr: t, NodeType: NodeAction, Pos: pos, Line: line, Pipe: pipe} +} + +func (a *ActionNode) String() string { + return fmt.Sprintf("{{%s}}", a.Pipe) + +} + +func (a *ActionNode) tree() *Tree { + return a.tr +} + +func (a *ActionNode) Copy() Node { + return a.tr.newAction(a.Pos, a.Line, a.Pipe.CopyPipe()) + +} + +// CommandNode holds a command (a pipeline inside an evaluating action). +type CommandNode struct { + NodeType + Pos + tr *Tree + Args []Node // Arguments in lexical order: Identifier, field, or constant. +} + +func (t *Tree) newCommand(pos Pos) *CommandNode { + return &CommandNode{tr: t, NodeType: NodeCommand, Pos: pos} +} + +func (c *CommandNode) append(arg Node) { + c.Args = append(c.Args, arg) +} + +func (c *CommandNode) String() string { + s := "" + for i, arg := range c.Args { + if i > 0 { + s += " " + } + if arg, ok := arg.(*PipeNode); ok { + s += "(" + arg.String() + ")" + continue + } + s += arg.String() + } + return s +} + +func (c *CommandNode) tree() *Tree { + return c.tr +} + +func (c *CommandNode) Copy() Node { + if c == nil { + return c + } + n := c.tr.newCommand(c.Pos) + for _, c := range c.Args { + n.append(c.Copy()) + } + return n +} + +// IdentifierNode holds an identifier. +type IdentifierNode struct { + NodeType + Pos + tr *Tree + Ident string // The identifier's name. +} + +// NewIdentifier returns a new IdentifierNode with the given identifier name. +func NewIdentifier(ident string) *IdentifierNode { + return &IdentifierNode{NodeType: NodeIdentifier, Ident: ident} +} + +// SetPos sets the position. NewIdentifier is a public method so we can't modify its signature. +// Chained for convenience. +// TODO: fix one day? +func (i *IdentifierNode) SetPos(pos Pos) *IdentifierNode { + i.Pos = pos + return i +} + +// SetTree sets the parent tree for the node. NewIdentifier is a public method so we can't modify its signature. +// Chained for convenience. +// TODO: fix one day? +func (i *IdentifierNode) SetTree(t *Tree) *IdentifierNode { + i.tr = t + return i +} + +func (i *IdentifierNode) String() string { + return i.Ident +} + +func (i *IdentifierNode) tree() *Tree { + return i.tr +} + +func (i *IdentifierNode) Copy() Node { + return NewIdentifier(i.Ident).SetTree(i.tr).SetPos(i.Pos) +} + +// VariableNode holds a list of variable names, possibly with chained field +// accesses. The dollar sign is part of the (first) name. +type VariableNode struct { + NodeType + Pos + tr *Tree + Ident []string // Variable name and fields in lexical order. +} + +func (t *Tree) newVariable(pos Pos, ident string) *VariableNode { + return &VariableNode{tr: t, NodeType: NodeVariable, Pos: pos, Ident: strings.Split(ident, ".")} +} + +func (v *VariableNode) String() string { + s := "" + for i, id := range v.Ident { + if i > 0 { + s += "." + } + s += id + } + return s +} + +func (v *VariableNode) tree() *Tree { + return v.tr +} + +func (v *VariableNode) Copy() Node { + return &VariableNode{tr: v.tr, NodeType: NodeVariable, Pos: v.Pos, Ident: append([]string{}, v.Ident...)} +} + +// DotNode holds the special identifier '.'. +type DotNode struct { + NodeType + Pos + tr *Tree +} + +func (t *Tree) newDot(pos Pos) *DotNode { + return &DotNode{tr: t, NodeType: NodeDot, Pos: pos} +} + +func (d *DotNode) Type() NodeType { + // Override method on embedded NodeType for API compatibility. + // TODO: Not really a problem; could change API without effect but + // api tool complains. + return NodeDot +} + +func (d *DotNode) String() string { + return "." +} + +func (d *DotNode) tree() *Tree { + return d.tr +} + +func (d *DotNode) Copy() Node { + return d.tr.newDot(d.Pos) +} + +// NilNode holds the special identifier 'nil' representing an untyped nil constant. +type NilNode struct { + NodeType + Pos + tr *Tree +} + +func (t *Tree) newNil(pos Pos) *NilNode { + return &NilNode{tr: t, NodeType: NodeNil, Pos: pos} +} + +func (n *NilNode) Type() NodeType { + // Override method on embedded NodeType for API compatibility. + // TODO: Not really a problem; could change API without effect but + // api tool complains. + return NodeNil +} + +func (n *NilNode) String() string { + return "nil" +} + +func (n *NilNode) tree() *Tree { + return n.tr +} + +func (n *NilNode) Copy() Node { + return n.tr.newNil(n.Pos) +} + +// FieldNode holds a field (identifier starting with '.'). +// The names may be chained ('.x.y'). +// The period is dropped from each ident. +type FieldNode struct { + NodeType + Pos + tr *Tree + Ident []string // The identifiers in lexical order. +} + +func (t *Tree) newField(pos Pos, ident string) *FieldNode { + return &FieldNode{tr: t, NodeType: NodeField, Pos: pos, Ident: strings.Split(ident[1:], ".")} // [1:] to drop leading period +} + +func (f *FieldNode) String() string { + s := "" + for _, id := range f.Ident { + s += "." + id + } + return s +} + +func (f *FieldNode) tree() *Tree { + return f.tr +} + +func (f *FieldNode) Copy() Node { + return &FieldNode{tr: f.tr, NodeType: NodeField, Pos: f.Pos, Ident: append([]string{}, f.Ident...)} +} + +// ChainNode holds a term followed by a chain of field accesses (identifier starting with '.'). +// The names may be chained ('.x.y'). +// The periods are dropped from each ident. +type ChainNode struct { + NodeType + Pos + tr *Tree + Node Node + Field []string // The identifiers in lexical order. +} + +func (t *Tree) newChain(pos Pos, node Node) *ChainNode { + return &ChainNode{tr: t, NodeType: NodeChain, Pos: pos, Node: node} +} + +// Add adds the named field (which should start with a period) to the end of the chain. +func (c *ChainNode) Add(field string) { + if len(field) == 0 || field[0] != '.' { + panic("no dot in field") + } + field = field[1:] // Remove leading dot. + if field == "" { + panic("empty field") + } + c.Field = append(c.Field, field) +} + +func (c *ChainNode) String() string { + s := c.Node.String() + if _, ok := c.Node.(*PipeNode); ok { + s = "(" + s + ")" + } + for _, field := range c.Field { + s += "." + field + } + return s +} + +func (c *ChainNode) tree() *Tree { + return c.tr +} + +func (c *ChainNode) Copy() Node { + return &ChainNode{tr: c.tr, NodeType: NodeChain, Pos: c.Pos, Node: c.Node, Field: append([]string{}, c.Field...)} +} + +// BoolNode holds a boolean constant. +type BoolNode struct { + NodeType + Pos + tr *Tree + True bool // The value of the boolean constant. +} + +func (t *Tree) newBool(pos Pos, true bool) *BoolNode { + return &BoolNode{tr: t, NodeType: NodeBool, Pos: pos, True: true} +} + +func (b *BoolNode) String() string { + if b.True { + return "true" + } + return "false" +} + +func (b *BoolNode) tree() *Tree { + return b.tr +} + +func (b *BoolNode) Copy() Node { + return b.tr.newBool(b.Pos, b.True) +} + +// NumberNode holds a number: signed or unsigned integer, float, or complex. +// The value is parsed and stored under all the types that can represent the value. +// This simulates in a small amount of code the behavior of Go's ideal constants. +type NumberNode struct { + NodeType + Pos + tr *Tree + IsInt bool // Number has an integral value. + IsUint bool // Number has an unsigned integral value. + IsFloat bool // Number has a floating-point value. + IsComplex bool // Number is complex. + Int64 int64 // The signed integer value. + Uint64 uint64 // The unsigned integer value. + Float64 float64 // The floating-point value. + Complex128 complex128 // The complex value. + Text string // The original textual representation from the input. +} + +func (t *Tree) newNumber(pos Pos, text string, typ itemType) (*NumberNode, error) { + n := &NumberNode{tr: t, NodeType: NodeNumber, Pos: pos, Text: text} + switch typ { + case itemCharConstant: + rune, _, tail, err := strconv.UnquoteChar(text[1:], text[0]) + if err != nil { + return nil, err + } + if tail != "'" { + return nil, fmt.Errorf("malformed character constant: %s", text) + } + n.Int64 = int64(rune) + n.IsInt = true + n.Uint64 = uint64(rune) + n.IsUint = true + n.Float64 = float64(rune) // odd but those are the rules. + n.IsFloat = true + return n, nil + case itemComplex: + // fmt.Sscan can parse the pair, so let it do the work. + if _, err := fmt.Sscan(text, &n.Complex128); err != nil { + return nil, err + } + n.IsComplex = true + n.simplifyComplex() + return n, nil + } + // Imaginary constants can only be complex unless they are zero. + if len(text) > 0 && text[len(text)-1] == 'i' { + f, err := strconv.ParseFloat(text[:len(text)-1], 64) + if err == nil { + n.IsComplex = true + n.Complex128 = complex(0, f) + n.simplifyComplex() + return n, nil + } + } + // Do integer test first so we get 0x123 etc. + u, err := strconv.ParseUint(text, 0, 64) // will fail for -0; fixed below. + if err == nil { + n.IsUint = true + n.Uint64 = u + } + i, err := strconv.ParseInt(text, 0, 64) + if err == nil { + n.IsInt = true + n.Int64 = i + if i == 0 { + n.IsUint = true // in case of -0. + n.Uint64 = u + } + } + // If an integer extraction succeeded, promote the float. + if n.IsInt { + n.IsFloat = true + n.Float64 = float64(n.Int64) + } else if n.IsUint { + n.IsFloat = true + n.Float64 = float64(n.Uint64) + } else { + f, err := strconv.ParseFloat(text, 64) + if err == nil { + n.IsFloat = true + n.Float64 = f + // If a floating-point extraction succeeded, extract the int if needed. + if !n.IsInt && float64(int64(f)) == f { + n.IsInt = true + n.Int64 = int64(f) + } + if !n.IsUint && float64(uint64(f)) == f { + n.IsUint = true + n.Uint64 = uint64(f) + } + } + } + if !n.IsInt && !n.IsUint && !n.IsFloat { + return nil, fmt.Errorf("illegal number syntax: %q", text) + } + return n, nil +} + +// simplifyComplex pulls out any other types that are represented by the complex number. +// These all require that the imaginary part be zero. +func (n *NumberNode) simplifyComplex() { + n.IsFloat = imag(n.Complex128) == 0 + if n.IsFloat { + n.Float64 = real(n.Complex128) + n.IsInt = float64(int64(n.Float64)) == n.Float64 + if n.IsInt { + n.Int64 = int64(n.Float64) + } + n.IsUint = float64(uint64(n.Float64)) == n.Float64 + if n.IsUint { + n.Uint64 = uint64(n.Float64) + } + } +} + +func (n *NumberNode) String() string { + return n.Text +} + +func (n *NumberNode) tree() *Tree { + return n.tr +} + +func (n *NumberNode) Copy() Node { + nn := new(NumberNode) + *nn = *n // Easy, fast, correct. + return nn +} + +// StringNode holds a string constant. The value has been "unquoted". +type StringNode struct { + NodeType + Pos + tr *Tree + Quoted string // The original text of the string, with quotes. + Text string // The string, after quote processing. +} + +func (t *Tree) newString(pos Pos, orig, text string) *StringNode { + return &StringNode{tr: t, NodeType: NodeString, Pos: pos, Quoted: orig, Text: text} +} + +func (s *StringNode) String() string { + return s.Quoted +} + +func (s *StringNode) tree() *Tree { + return s.tr +} + +func (s *StringNode) Copy() Node { + return s.tr.newString(s.Pos, s.Quoted, s.Text) +} + +// endNode represents an {{end}} action. +// It does not appear in the final parse tree. +type endNode struct { + NodeType + Pos + tr *Tree +} + +func (t *Tree) newEnd(pos Pos) *endNode { + return &endNode{tr: t, NodeType: nodeEnd, Pos: pos} +} + +func (e *endNode) String() string { + return "{{end}}" +} + +func (e *endNode) tree() *Tree { + return e.tr +} + +func (e *endNode) Copy() Node { + return e.tr.newEnd(e.Pos) +} + +// elseNode represents an {{else}} action. Does not appear in the final tree. +type elseNode struct { + NodeType + Pos + tr *Tree + Line int // The line number in the input (deprecated; kept for compatibility) +} + +func (t *Tree) newElse(pos Pos, line int) *elseNode { + return &elseNode{tr: t, NodeType: nodeElse, Pos: pos, Line: line} +} + +func (e *elseNode) Type() NodeType { + return nodeElse +} + +func (e *elseNode) String() string { + return "{{else}}" +} + +func (e *elseNode) tree() *Tree { + return e.tr +} + +func (e *elseNode) Copy() Node { + return e.tr.newElse(e.Pos, e.Line) +} + +// BranchNode is the common representation of if, range, and with. +type BranchNode struct { + NodeType + Pos + tr *Tree + Line int // The line number in the input (deprecated; kept for compatibility) + Pipe *PipeNode // The pipeline to be evaluated. + List *ListNode // What to execute if the value is non-empty. + ElseList *ListNode // What to execute if the value is empty (nil if absent). +} + +func (b *BranchNode) String() string { + name := "" + switch b.NodeType { + case NodeIf: + name = "if" + case NodeRange: + name = "range" + case NodeWith: + name = "with" + default: + panic("unknown branch type") + } + if b.ElseList != nil { + return fmt.Sprintf("{{%s %s}}%s{{else}}%s{{end}}", name, b.Pipe, b.List, b.ElseList) + } + return fmt.Sprintf("{{%s %s}}%s{{end}}", name, b.Pipe, b.List) +} + +func (b *BranchNode) tree() *Tree { + return b.tr +} + +func (b *BranchNode) Copy() Node { + switch b.NodeType { + case NodeIf: + return b.tr.newIf(b.Pos, b.Line, b.Pipe, b.List, b.ElseList) + case NodeRange: + return b.tr.newRange(b.Pos, b.Line, b.Pipe, b.List, b.ElseList) + case NodeWith: + return b.tr.newWith(b.Pos, b.Line, b.Pipe, b.List, b.ElseList) + default: + panic("unknown branch type") + } +} + +// IfNode represents an {{if}} action and its commands. +type IfNode struct { + BranchNode +} + +func (t *Tree) newIf(pos Pos, line int, pipe *PipeNode, list, elseList *ListNode) *IfNode { + return &IfNode{BranchNode{tr: t, NodeType: NodeIf, Pos: pos, Line: line, Pipe: pipe, List: list, ElseList: elseList}} +} + +func (i *IfNode) Copy() Node { + return i.tr.newIf(i.Pos, i.Line, i.Pipe.CopyPipe(), i.List.CopyList(), i.ElseList.CopyList()) +} + +// RangeNode represents a {{range}} action and its commands. +type RangeNode struct { + BranchNode +} + +func (t *Tree) newRange(pos Pos, line int, pipe *PipeNode, list, elseList *ListNode) *RangeNode { + return &RangeNode{BranchNode{tr: t, NodeType: NodeRange, Pos: pos, Line: line, Pipe: pipe, List: list, ElseList: elseList}} +} + +func (r *RangeNode) Copy() Node { + return r.tr.newRange(r.Pos, r.Line, r.Pipe.CopyPipe(), r.List.CopyList(), r.ElseList.CopyList()) +} + +// WithNode represents a {{with}} action and its commands. +type WithNode struct { + BranchNode +} + +func (t *Tree) newWith(pos Pos, line int, pipe *PipeNode, list, elseList *ListNode) *WithNode { + return &WithNode{BranchNode{tr: t, NodeType: NodeWith, Pos: pos, Line: line, Pipe: pipe, List: list, ElseList: elseList}} +} + +func (w *WithNode) Copy() Node { + return w.tr.newWith(w.Pos, w.Line, w.Pipe.CopyPipe(), w.List.CopyList(), w.ElseList.CopyList()) +} + +// TemplateNode represents a {{template}} action. +type TemplateNode struct { + NodeType + Pos + tr *Tree + Line int // The line number in the input (deprecated; kept for compatibility) + Name string // The name of the template (unquoted). + Pipe *PipeNode // The command to evaluate as dot for the template. +} + +func (t *Tree) newTemplate(pos Pos, line int, name string, pipe *PipeNode) *TemplateNode { + return &TemplateNode{tr: t, NodeType: NodeTemplate, Pos: pos, Line: line, Name: name, Pipe: pipe} +} + +func (t *TemplateNode) String() string { + if t.Pipe == nil { + return fmt.Sprintf("{{template %q}}", t.Name) + } + return fmt.Sprintf("{{template %q %s}}", t.Name, t.Pipe) +} + +func (t *TemplateNode) tree() *Tree { + return t.tr +} + +func (t *TemplateNode) Copy() Node { + return t.tr.newTemplate(t.Pos, t.Line, t.Name, t.Pipe.CopyPipe()) +} diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/parse/parse.go b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/parse/parse.go new file mode 100644 index 0000000..0d77ade --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/parse/parse.go @@ -0,0 +1,700 @@ +// 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 parse builds parse trees for templates as defined by text/template +// and html/template. Clients should use those packages to construct templates +// rather than this one, which provides shared internal data structures not +// intended for general use. +package parse + +import ( + "bytes" + "fmt" + "runtime" + "strconv" + "strings" +) + +// Tree is the representation of a single parsed template. +type Tree struct { + Name string // name of the template represented by the tree. + ParseName string // name of the top-level template during parsing, for error messages. + Root *ListNode // top-level root of the tree. + text string // text parsed to create the template (or its parent) + // Parsing only; cleared after parse. + funcs []map[string]interface{} + lex *lexer + token [3]item // three-token lookahead for parser. + peekCount int + vars []string // variables defined at the moment. +} + +// Copy returns a copy of the Tree. Any parsing state is discarded. +func (t *Tree) Copy() *Tree { + if t == nil { + return nil + } + return &Tree{ + Name: t.Name, + ParseName: t.ParseName, + Root: t.Root.CopyList(), + text: t.text, + } +} + +// Parse returns a map from template name to parse.Tree, created by parsing the +// templates described in the argument string. The top-level template will be +// given the specified name. If an error is encountered, parsing stops and an +// empty map is returned with the error. +func Parse(name, text, leftDelim, rightDelim string, funcs ...map[string]interface{}) (treeSet map[string]*Tree, err error) { + treeSet = make(map[string]*Tree) + t := New(name) + t.text = text + _, err = t.Parse(text, leftDelim, rightDelim, treeSet, funcs...) + return +} + +// next returns the next token. +func (t *Tree) next() item { + if t.peekCount > 0 { + t.peekCount-- + } else { + t.token[0] = t.lex.nextItem() + } + return t.token[t.peekCount] +} + +// backup backs the input stream up one token. +func (t *Tree) backup() { + t.peekCount++ +} + +// backup2 backs the input stream up two tokens. +// The zeroth token is already there. +func (t *Tree) backup2(t1 item) { + t.token[1] = t1 + t.peekCount = 2 +} + +// backup3 backs the input stream up three tokens +// The zeroth token is already there. +func (t *Tree) backup3(t2, t1 item) { // Reverse order: we're pushing back. + t.token[1] = t1 + t.token[2] = t2 + t.peekCount = 3 +} + +// peek returns but does not consume the next token. +func (t *Tree) peek() item { + if t.peekCount > 0 { + return t.token[t.peekCount-1] + } + t.peekCount = 1 + t.token[0] = t.lex.nextItem() + return t.token[0] +} + +// nextNonSpace returns the next non-space token. +func (t *Tree) nextNonSpace() (token item) { + for { + token = t.next() + if token.typ != itemSpace { + break + } + } + return token +} + +// peekNonSpace returns but does not consume the next non-space token. +func (t *Tree) peekNonSpace() (token item) { + for { + token = t.next() + if token.typ != itemSpace { + break + } + } + t.backup() + return token +} + +// Parsing. + +// New allocates a new parse tree with the given name. +func New(name string, funcs ...map[string]interface{}) *Tree { + return &Tree{ + Name: name, + funcs: funcs, + } +} + +// ErrorContext returns a textual representation of the location of the node in the input text. +// The receiver is only used when the node does not have a pointer to the tree inside, +// which can occur in old code. +func (t *Tree) ErrorContext(n Node) (location, context string) { + pos := int(n.Position()) + tree := n.tree() + if tree == nil { + tree = t + } + text := tree.text[:pos] + byteNum := strings.LastIndex(text, "\n") + if byteNum == -1 { + byteNum = pos // On first line. + } else { + byteNum++ // After the newline. + byteNum = pos - byteNum + } + lineNum := 1 + strings.Count(text, "\n") + context = n.String() + if len(context) > 20 { + context = fmt.Sprintf("%.20s...", context) + } + return fmt.Sprintf("%s:%d:%d", tree.ParseName, lineNum, byteNum), context +} + +// errorf formats the error and terminates processing. +func (t *Tree) errorf(format string, args ...interface{}) { + t.Root = nil + format = fmt.Sprintf("template: %s:%d: %s", t.ParseName, t.lex.lineNumber(), format) + panic(fmt.Errorf(format, args...)) +} + +// error terminates processing. +func (t *Tree) error(err error) { + t.errorf("%s", err) +} + +// expect consumes the next token and guarantees it has the required type. +func (t *Tree) expect(expected itemType, context string) item { + token := t.nextNonSpace() + if token.typ != expected { + t.unexpected(token, context) + } + return token +} + +// expectOneOf consumes the next token and guarantees it has one of the required types. +func (t *Tree) expectOneOf(expected1, expected2 itemType, context string) item { + token := t.nextNonSpace() + if token.typ != expected1 && token.typ != expected2 { + t.unexpected(token, context) + } + return token +} + +// unexpected complains about the token and terminates processing. +func (t *Tree) unexpected(token item, context string) { + t.errorf("unexpected %s in %s", token, context) +} + +// recover is the handler that turns panics into returns from the top level of Parse. +func (t *Tree) recover(errp *error) { + e := recover() + if e != nil { + if _, ok := e.(runtime.Error); ok { + panic(e) + } + if t != nil { + t.stopParse() + } + *errp = e.(error) + } + return +} + +// startParse initializes the parser, using the lexer. +func (t *Tree) startParse(funcs []map[string]interface{}, lex *lexer) { + t.Root = nil + t.lex = lex + t.vars = []string{"$"} + t.funcs = funcs +} + +// stopParse terminates parsing. +func (t *Tree) stopParse() { + t.lex = nil + t.vars = nil + t.funcs = nil +} + +// Parse parses the template definition string to construct a representation of +// the template for execution. If either action delimiter string is empty, the +// default ("{{" or "}}") is used. Embedded template definitions are added to +// the treeSet map. +func (t *Tree) Parse(text, leftDelim, rightDelim string, treeSet map[string]*Tree, funcs ...map[string]interface{}) (tree *Tree, err error) { + defer t.recover(&err) + t.ParseName = t.Name + t.startParse(funcs, lex(t.Name, text, leftDelim, rightDelim)) + t.text = text + t.parse(treeSet) + t.add(treeSet) + t.stopParse() + return t, nil +} + +// add adds tree to the treeSet. +func (t *Tree) add(treeSet map[string]*Tree) { + tree := treeSet[t.Name] + if tree == nil || IsEmptyTree(tree.Root) { + treeSet[t.Name] = t + return + } + if !IsEmptyTree(t.Root) { + t.errorf("template: multiple definition of template %q", t.Name) + } +} + +// IsEmptyTree reports whether this tree (node) is empty of everything but space. +func IsEmptyTree(n Node) bool { + switch n := n.(type) { + case nil: + return true + case *ActionNode: + case *IfNode: + case *ListNode: + for _, node := range n.Nodes { + if !IsEmptyTree(node) { + return false + } + } + return true + case *RangeNode: + case *TemplateNode: + case *TextNode: + return len(bytes.TrimSpace(n.Text)) == 0 + case *WithNode: + default: + panic("unknown node: " + n.String()) + } + return false +} + +// parse is the top-level parser for a template, essentially the same +// as itemList except it also parses {{define}} actions. +// It runs to EOF. +func (t *Tree) parse(treeSet map[string]*Tree) (next Node) { + t.Root = t.newList(t.peek().pos) + for t.peek().typ != itemEOF { + if t.peek().typ == itemLeftDelim { + delim := t.next() + if t.nextNonSpace().typ == itemDefine { + newT := New("definition") // name will be updated once we know it. + newT.text = t.text + newT.ParseName = t.ParseName + newT.startParse(t.funcs, t.lex) + newT.parseDefinition(treeSet) + continue + } + t.backup2(delim) + } + n := t.textOrAction() + if n.Type() == nodeEnd { + t.errorf("unexpected %s", n) + } + t.Root.append(n) + } + return nil +} + +// parseDefinition parses a {{define}} ... {{end}} template definition and +// installs the definition in the treeSet map. The "define" keyword has already +// been scanned. +func (t *Tree) parseDefinition(treeSet map[string]*Tree) { + const context = "define clause" + name := t.expectOneOf(itemString, itemRawString, context) + var err error + t.Name, err = strconv.Unquote(name.val) + if err != nil { + t.error(err) + } + t.expect(itemRightDelim, context) + var end Node + t.Root, end = t.itemList() + if end.Type() != nodeEnd { + t.errorf("unexpected %s in %s", end, context) + } + t.add(treeSet) + t.stopParse() +} + +// itemList: +// textOrAction* +// Terminates at {{end}} or {{else}}, returned separately. +func (t *Tree) itemList() (list *ListNode, next Node) { + list = t.newList(t.peekNonSpace().pos) + for t.peekNonSpace().typ != itemEOF { + n := t.textOrAction() + switch n.Type() { + case nodeEnd, nodeElse: + return list, n + } + list.append(n) + } + t.errorf("unexpected EOF") + return +} + +// textOrAction: +// text | action +func (t *Tree) textOrAction() Node { + switch token := t.nextNonSpace(); token.typ { + case itemElideNewline: + return t.elideNewline() + case itemText: + return t.newText(token.pos, token.val) + case itemLeftDelim: + return t.action() + default: + t.unexpected(token, "input") + } + return nil +} + +// elideNewline: +// Remove newlines trailing rightDelim if \\ is present. +func (t *Tree) elideNewline() Node { + token := t.peek() + if token.typ != itemText { + t.unexpected(token, "input") + return nil + } + + t.next() + stripped := strings.TrimLeft(token.val, "\n\r") + diff := len(token.val) - len(stripped) + if diff > 0 { + // This is a bit nasty. We mutate the token in-place to remove + // preceding newlines. + token.pos += Pos(diff) + token.val = stripped + } + return t.newText(token.pos, token.val) +} + +// Action: +// control +// command ("|" command)* +// Left delim is past. Now get actions. +// First word could be a keyword such as range. +func (t *Tree) action() (n Node) { + switch token := t.nextNonSpace(); token.typ { + case itemElse: + return t.elseControl() + case itemEnd: + return t.endControl() + case itemIf: + return t.ifControl() + case itemRange: + return t.rangeControl() + case itemTemplate: + return t.templateControl() + case itemWith: + return t.withControl() + } + t.backup() + // Do not pop variables; they persist until "end". + return t.newAction(t.peek().pos, t.lex.lineNumber(), t.pipeline("command")) +} + +// Pipeline: +// declarations? command ('|' command)* +func (t *Tree) pipeline(context string) (pipe *PipeNode) { + var decl []*VariableNode + pos := t.peekNonSpace().pos + // Are there declarations? + for { + if v := t.peekNonSpace(); v.typ == itemVariable { + t.next() + // Since space is a token, we need 3-token look-ahead here in the worst case: + // in "$x foo" we need to read "foo" (as opposed to ":=") to know that $x is an + // argument variable rather than a declaration. So remember the token + // adjacent to the variable so we can push it back if necessary. + tokenAfterVariable := t.peek() + if next := t.peekNonSpace(); next.typ == itemColonEquals || (next.typ == itemChar && next.val == ",") { + t.nextNonSpace() + variable := t.newVariable(v.pos, v.val) + decl = append(decl, variable) + t.vars = append(t.vars, v.val) + if next.typ == itemChar && next.val == "," { + if context == "range" && len(decl) < 2 { + continue + } + t.errorf("too many declarations in %s", context) + } + } else if tokenAfterVariable.typ == itemSpace { + t.backup3(v, tokenAfterVariable) + } else { + t.backup2(v) + } + } + break + } + pipe = t.newPipeline(pos, t.lex.lineNumber(), decl) + for { + switch token := t.nextNonSpace(); token.typ { + case itemRightDelim, itemRightParen: + if len(pipe.Cmds) == 0 { + t.errorf("missing value for %s", context) + } + if token.typ == itemRightParen { + t.backup() + } + return + case itemBool, itemCharConstant, itemComplex, itemDot, itemField, itemIdentifier, + itemNumber, itemNil, itemRawString, itemString, itemVariable, itemLeftParen: + t.backup() + pipe.append(t.command()) + default: + t.unexpected(token, context) + } + } +} + +func (t *Tree) parseControl(allowElseIf bool, context string) (pos Pos, line int, pipe *PipeNode, list, elseList *ListNode) { + defer t.popVars(len(t.vars)) + line = t.lex.lineNumber() + pipe = t.pipeline(context) + var next Node + list, next = t.itemList() + switch next.Type() { + case nodeEnd: //done + case nodeElse: + if allowElseIf { + // Special case for "else if". If the "else" is followed immediately by an "if", + // the elseControl will have left the "if" token pending. Treat + // {{if a}}_{{else if b}}_{{end}} + // as + // {{if a}}_{{else}}{{if b}}_{{end}}{{end}}. + // To do this, parse the if as usual and stop at it {{end}}; the subsequent{{end}} + // is assumed. This technique works even for long if-else-if chains. + // TODO: Should we allow else-if in with and range? + if t.peek().typ == itemIf { + t.next() // Consume the "if" token. + elseList = t.newList(next.Position()) + elseList.append(t.ifControl()) + // Do not consume the next item - only one {{end}} required. + break + } + } + elseList, next = t.itemList() + if next.Type() != nodeEnd { + t.errorf("expected end; found %s", next) + } + } + return pipe.Position(), line, pipe, list, elseList +} + +// If: +// {{if pipeline}} itemList {{end}} +// {{if pipeline}} itemList {{else}} itemList {{end}} +// If keyword is past. +func (t *Tree) ifControl() Node { + return t.newIf(t.parseControl(true, "if")) +} + +// Range: +// {{range pipeline}} itemList {{end}} +// {{range pipeline}} itemList {{else}} itemList {{end}} +// Range keyword is past. +func (t *Tree) rangeControl() Node { + return t.newRange(t.parseControl(false, "range")) +} + +// With: +// {{with pipeline}} itemList {{end}} +// {{with pipeline}} itemList {{else}} itemList {{end}} +// If keyword is past. +func (t *Tree) withControl() Node { + return t.newWith(t.parseControl(false, "with")) +} + +// End: +// {{end}} +// End keyword is past. +func (t *Tree) endControl() Node { + return t.newEnd(t.expect(itemRightDelim, "end").pos) +} + +// Else: +// {{else}} +// Else keyword is past. +func (t *Tree) elseControl() Node { + // Special case for "else if". + peek := t.peekNonSpace() + if peek.typ == itemIf { + // We see "{{else if ... " but in effect rewrite it to {{else}}{{if ... ". + return t.newElse(peek.pos, t.lex.lineNumber()) + } + return t.newElse(t.expect(itemRightDelim, "else").pos, t.lex.lineNumber()) +} + +// Template: +// {{template stringValue pipeline}} +// Template keyword is past. The name must be something that can evaluate +// to a string. +func (t *Tree) templateControl() Node { + var name string + token := t.nextNonSpace() + switch token.typ { + case itemString, itemRawString: + s, err := strconv.Unquote(token.val) + if err != nil { + t.error(err) + } + name = s + default: + t.unexpected(token, "template invocation") + } + var pipe *PipeNode + if t.nextNonSpace().typ != itemRightDelim { + t.backup() + // Do not pop variables; they persist until "end". + pipe = t.pipeline("template") + } + return t.newTemplate(token.pos, t.lex.lineNumber(), name, pipe) +} + +// command: +// operand (space operand)* +// space-separated arguments up to a pipeline character or right delimiter. +// we consume the pipe character but leave the right delim to terminate the action. +func (t *Tree) command() *CommandNode { + cmd := t.newCommand(t.peekNonSpace().pos) + for { + t.peekNonSpace() // skip leading spaces. + operand := t.operand() + if operand != nil { + cmd.append(operand) + } + switch token := t.next(); token.typ { + case itemSpace: + continue + case itemError: + t.errorf("%s", token.val) + case itemRightDelim, itemRightParen: + t.backup() + case itemPipe: + default: + t.errorf("unexpected %s in operand; missing space?", token) + } + break + } + if len(cmd.Args) == 0 { + t.errorf("empty command") + } + return cmd +} + +// operand: +// term .Field* +// An operand is a space-separated component of a command, +// a term possibly followed by field accesses. +// A nil return means the next item is not an operand. +func (t *Tree) operand() Node { + node := t.term() + if node == nil { + return nil + } + if t.peek().typ == itemField { + chain := t.newChain(t.peek().pos, node) + for t.peek().typ == itemField { + chain.Add(t.next().val) + } + // Compatibility with original API: If the term is of type NodeField + // or NodeVariable, just put more fields on the original. + // Otherwise, keep the Chain node. + // TODO: Switch to Chains always when we can. + switch node.Type() { + case NodeField: + node = t.newField(chain.Position(), chain.String()) + case NodeVariable: + node = t.newVariable(chain.Position(), chain.String()) + default: + node = chain + } + } + return node +} + +// term: +// literal (number, string, nil, boolean) +// function (identifier) +// . +// .Field +// $ +// '(' pipeline ')' +// A term is a simple "expression". +// A nil return means the next item is not a term. +func (t *Tree) term() Node { + switch token := t.nextNonSpace(); token.typ { + case itemError: + t.errorf("%s", token.val) + case itemIdentifier: + if !t.hasFunction(token.val) { + t.errorf("function %q not defined", token.val) + } + return NewIdentifier(token.val).SetTree(t).SetPos(token.pos) + case itemDot: + return t.newDot(token.pos) + case itemNil: + return t.newNil(token.pos) + case itemVariable: + return t.useVar(token.pos, token.val) + case itemField: + return t.newField(token.pos, token.val) + case itemBool: + return t.newBool(token.pos, token.val == "true") + case itemCharConstant, itemComplex, itemNumber: + number, err := t.newNumber(token.pos, token.val, token.typ) + if err != nil { + t.error(err) + } + return number + case itemLeftParen: + pipe := t.pipeline("parenthesized pipeline") + if token := t.next(); token.typ != itemRightParen { + t.errorf("unclosed right paren: unexpected %s", token) + } + return pipe + case itemString, itemRawString: + s, err := strconv.Unquote(token.val) + if err != nil { + t.error(err) + } + return t.newString(token.pos, token.val, s) + } + t.backup() + return nil +} + +// hasFunction reports if a function name exists in the Tree's maps. +func (t *Tree) hasFunction(name string) bool { + for _, funcMap := range t.funcs { + if funcMap == nil { + continue + } + if funcMap[name] != nil { + return true + } + } + return false +} + +// popVars trims the variable list to the specified length +func (t *Tree) popVars(n int) { + t.vars = t.vars[:n] +} + +// useVar returns a node for a variable reference. It errors if the +// variable is not defined. +func (t *Tree) useVar(pos Pos, name string) Node { + v := t.newVariable(pos, name) + for _, varName := range t.vars { + if varName == v.Ident[0] { + return v + } + } + t.errorf("undefined variable %q", v.Ident[0]) + return nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/parse/parse_test.go b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/parse/parse_test.go new file mode 100644 index 0000000..c73640f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/parse/parse_test.go @@ -0,0 +1,426 @@ +// 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 parse + +import ( + "flag" + "fmt" + "strings" + "testing" +) + +var debug = flag.Bool("debug", false, "show the errors produced by the main tests") + +type numberTest struct { + text string + isInt bool + isUint bool + isFloat bool + isComplex bool + int64 + uint64 + float64 + complex128 +} + +var numberTests = []numberTest{ + // basics + {"0", true, true, true, false, 0, 0, 0, 0}, + {"-0", true, true, true, false, 0, 0, 0, 0}, // check that -0 is a uint. + {"73", true, true, true, false, 73, 73, 73, 0}, + {"073", true, true, true, false, 073, 073, 073, 0}, + {"0x73", true, true, true, false, 0x73, 0x73, 0x73, 0}, + {"-73", true, false, true, false, -73, 0, -73, 0}, + {"+73", true, false, true, false, 73, 0, 73, 0}, + {"100", true, true, true, false, 100, 100, 100, 0}, + {"1e9", true, true, true, false, 1e9, 1e9, 1e9, 0}, + {"-1e9", true, false, true, false, -1e9, 0, -1e9, 0}, + {"-1.2", false, false, true, false, 0, 0, -1.2, 0}, + {"1e19", false, true, true, false, 0, 1e19, 1e19, 0}, + {"-1e19", false, false, true, false, 0, 0, -1e19, 0}, + {"4i", false, false, false, true, 0, 0, 0, 4i}, + {"-1.2+4.2i", false, false, false, true, 0, 0, 0, -1.2 + 4.2i}, + {"073i", false, false, false, true, 0, 0, 0, 73i}, // not octal! + // complex with 0 imaginary are float (and maybe integer) + {"0i", true, true, true, true, 0, 0, 0, 0}, + {"-1.2+0i", false, false, true, true, 0, 0, -1.2, -1.2}, + {"-12+0i", true, false, true, true, -12, 0, -12, -12}, + {"13+0i", true, true, true, true, 13, 13, 13, 13}, + // funny bases + {"0123", true, true, true, false, 0123, 0123, 0123, 0}, + {"-0x0", true, true, true, false, 0, 0, 0, 0}, + {"0xdeadbeef", true, true, true, false, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0}, + // character constants + {`'a'`, true, true, true, false, 'a', 'a', 'a', 0}, + {`'\n'`, true, true, true, false, '\n', '\n', '\n', 0}, + {`'\\'`, true, true, true, false, '\\', '\\', '\\', 0}, + {`'\''`, true, true, true, false, '\'', '\'', '\'', 0}, + {`'\xFF'`, true, true, true, false, 0xFF, 0xFF, 0xFF, 0}, + {`'パ'`, true, true, true, false, 0x30d1, 0x30d1, 0x30d1, 0}, + {`'\u30d1'`, true, true, true, false, 0x30d1, 0x30d1, 0x30d1, 0}, + {`'\U000030d1'`, true, true, true, false, 0x30d1, 0x30d1, 0x30d1, 0}, + // some broken syntax + {text: "+-2"}, + {text: "0x123."}, + {text: "1e."}, + {text: "0xi."}, + {text: "1+2."}, + {text: "'x"}, + {text: "'xx'"}, + // Issue 8622 - 0xe parsed as floating point. Very embarrassing. + {"0xef", true, true, true, false, 0xef, 0xef, 0xef, 0}, +} + +func TestNumberParse(t *testing.T) { + for _, test := range numberTests { + // If fmt.Sscan thinks it's complex, it's complex. We can't trust the output + // because imaginary comes out as a number. + var c complex128 + typ := itemNumber + var tree *Tree + if test.text[0] == '\'' { + typ = itemCharConstant + } else { + _, err := fmt.Sscan(test.text, &c) + if err == nil { + typ = itemComplex + } + } + n, err := tree.newNumber(0, test.text, typ) + ok := test.isInt || test.isUint || test.isFloat || test.isComplex + if ok && err != nil { + t.Errorf("unexpected error for %q: %s", test.text, err) + continue + } + if !ok && err == nil { + t.Errorf("expected error for %q", test.text) + continue + } + if !ok { + if *debug { + fmt.Printf("%s\n\t%s\n", test.text, err) + } + continue + } + if n.IsComplex != test.isComplex { + t.Errorf("complex incorrect for %q; should be %t", test.text, test.isComplex) + } + if test.isInt { + if !n.IsInt { + t.Errorf("expected integer for %q", test.text) + } + if n.Int64 != test.int64 { + t.Errorf("int64 for %q should be %d Is %d", test.text, test.int64, n.Int64) + } + } else if n.IsInt { + t.Errorf("did not expect integer for %q", test.text) + } + if test.isUint { + if !n.IsUint { + t.Errorf("expected unsigned integer for %q", test.text) + } + if n.Uint64 != test.uint64 { + t.Errorf("uint64 for %q should be %d Is %d", test.text, test.uint64, n.Uint64) + } + } else if n.IsUint { + t.Errorf("did not expect unsigned integer for %q", test.text) + } + if test.isFloat { + if !n.IsFloat { + t.Errorf("expected float for %q", test.text) + } + if n.Float64 != test.float64 { + t.Errorf("float64 for %q should be %g Is %g", test.text, test.float64, n.Float64) + } + } else if n.IsFloat { + t.Errorf("did not expect float for %q", test.text) + } + if test.isComplex { + if !n.IsComplex { + t.Errorf("expected complex for %q", test.text) + } + if n.Complex128 != test.complex128 { + t.Errorf("complex128 for %q should be %g Is %g", test.text, test.complex128, n.Complex128) + } + } else if n.IsComplex { + t.Errorf("did not expect complex for %q", test.text) + } + } +} + +type parseTest struct { + name string + input string + ok bool + result string // what the user would see in an error message. +} + +const ( + noError = true + hasError = false +) + +var parseTests = []parseTest{ + {"empty", "", noError, + ``}, + {"comment", "{{/*\n\n\n*/}}", noError, + ``}, + {"spaces", " \t\n", noError, + `" \t\n"`}, + {"text", "some text", noError, + `"some text"`}, + {"emptyAction", "{{}}", hasError, + `{{}}`}, + {"field", "{{.X}}", noError, + `{{.X}}`}, + {"simple command", "{{printf}}", noError, + `{{printf}}`}, + {"$ invocation", "{{$}}", noError, + "{{$}}"}, + {"variable invocation", "{{with $x := 3}}{{$x 23}}{{end}}", noError, + "{{with $x := 3}}{{$x 23}}{{end}}"}, + {"variable with fields", "{{$.I}}", noError, + "{{$.I}}"}, + {"multi-word command", "{{printf `%d` 23}}", noError, + "{{printf `%d` 23}}"}, + {"pipeline", "{{.X|.Y}}", noError, + `{{.X | .Y}}`}, + {"pipeline with decl", "{{$x := .X|.Y}}", noError, + `{{$x := .X | .Y}}`}, + {"nested pipeline", "{{.X (.Y .Z) (.A | .B .C) (.E)}}", noError, + `{{.X (.Y .Z) (.A | .B .C) (.E)}}`}, + {"field applied to parentheses", "{{(.Y .Z).Field}}", noError, + `{{(.Y .Z).Field}}`}, + {"simple if", "{{if .X}}hello{{end}}", noError, + `{{if .X}}"hello"{{end}}`}, + {"if with else", "{{if .X}}true{{else}}false{{end}}", noError, + `{{if .X}}"true"{{else}}"false"{{end}}`}, + {"if with else if", "{{if .X}}true{{else if .Y}}false{{end}}", noError, + `{{if .X}}"true"{{else}}{{if .Y}}"false"{{end}}{{end}}`}, + {"if else chain", "+{{if .X}}X{{else if .Y}}Y{{else if .Z}}Z{{end}}+", noError, + `"+"{{if .X}}"X"{{else}}{{if .Y}}"Y"{{else}}{{if .Z}}"Z"{{end}}{{end}}{{end}}"+"`}, + {"simple range", "{{range .X}}hello{{end}}", noError, + `{{range .X}}"hello"{{end}}`}, + {"chained field range", "{{range .X.Y.Z}}hello{{end}}", noError, + `{{range .X.Y.Z}}"hello"{{end}}`}, + {"nested range", "{{range .X}}hello{{range .Y}}goodbye{{end}}{{end}}", noError, + `{{range .X}}"hello"{{range .Y}}"goodbye"{{end}}{{end}}`}, + {"range with else", "{{range .X}}true{{else}}false{{end}}", noError, + `{{range .X}}"true"{{else}}"false"{{end}}`}, + {"range over pipeline", "{{range .X|.M}}true{{else}}false{{end}}", noError, + `{{range .X | .M}}"true"{{else}}"false"{{end}}`}, + {"range []int", "{{range .SI}}{{.}}{{end}}", noError, + `{{range .SI}}{{.}}{{end}}`}, + {"range 1 var", "{{range $x := .SI}}{{.}}{{end}}", noError, + `{{range $x := .SI}}{{.}}{{end}}`}, + {"range 2 vars", "{{range $x, $y := .SI}}{{.}}{{end}}", noError, + `{{range $x, $y := .SI}}{{.}}{{end}}`}, + {"constants", "{{range .SI 1 -3.2i true false 'a' nil}}{{end}}", noError, + `{{range .SI 1 -3.2i true false 'a' nil}}{{end}}`}, + {"template", "{{template `x`}}", noError, + `{{template "x"}}`}, + {"template with arg", "{{template `x` .Y}}", noError, + `{{template "x" .Y}}`}, + {"with", "{{with .X}}hello{{end}}", noError, + `{{with .X}}"hello"{{end}}`}, + {"with with else", "{{with .X}}hello{{else}}goodbye{{end}}", noError, + `{{with .X}}"hello"{{else}}"goodbye"{{end}}`}, + {"elide newline", "{{true}}\\\n ", noError, + `{{true}}" "`}, + // Errors. + {"unclosed action", "hello{{range", hasError, ""}, + {"unmatched end", "{{end}}", hasError, ""}, + {"missing end", "hello{{range .x}}", hasError, ""}, + {"missing end after else", "hello{{range .x}}{{else}}", hasError, ""}, + {"undefined function", "hello{{undefined}}", hasError, ""}, + {"undefined variable", "{{$x}}", hasError, ""}, + {"variable undefined after end", "{{with $x := 4}}{{end}}{{$x}}", hasError, ""}, + {"variable undefined in template", "{{template $v}}", hasError, ""}, + {"declare with field", "{{with $x.Y := 4}}{{end}}", hasError, ""}, + {"template with field ref", "{{template .X}}", hasError, ""}, + {"template with var", "{{template $v}}", hasError, ""}, + {"invalid punctuation", "{{printf 3, 4}}", hasError, ""}, + {"multidecl outside range", "{{with $v, $u := 3}}{{end}}", hasError, ""}, + {"too many decls in range", "{{range $u, $v, $w := 3}}{{end}}", hasError, ""}, + {"dot applied to parentheses", "{{printf (printf .).}}", hasError, ""}, + {"adjacent args", "{{printf 3`x`}}", hasError, ""}, + {"adjacent args with .", "{{printf `x`.}}", hasError, ""}, + {"extra end after if", "{{if .X}}a{{else if .Y}}b{{end}}{{end}}", hasError, ""}, + {"invalid newline elision", "{{true}}\\{{true}}", hasError, ""}, + // Equals (and other chars) do not assignments make (yet). + {"bug0a", "{{$x := 0}}{{$x}}", noError, "{{$x := 0}}{{$x}}"}, + {"bug0b", "{{$x = 1}}{{$x}}", hasError, ""}, + {"bug0c", "{{$x ! 2}}{{$x}}", hasError, ""}, + {"bug0d", "{{$x % 3}}{{$x}}", hasError, ""}, + // Check the parse fails for := rather than comma. + {"bug0e", "{{range $x := $y := 3}}{{end}}", hasError, ""}, + // Another bug: variable read must ignore following punctuation. + {"bug1a", "{{$x:=.}}{{$x!2}}", hasError, ""}, // ! is just illegal here. + {"bug1b", "{{$x:=.}}{{$x+2}}", hasError, ""}, // $x+2 should not parse as ($x) (+2). + {"bug1c", "{{$x:=.}}{{$x +2}}", noError, "{{$x := .}}{{$x +2}}"}, // It's OK with a space. +} + +var builtins = map[string]interface{}{ + "printf": fmt.Sprintf, +} + +func testParse(doCopy bool, t *testing.T) { + textFormat = "%q" + defer func() { textFormat = "%s" }() + for _, test := range parseTests { + tmpl, err := New(test.name).Parse(test.input, "", "", make(map[string]*Tree), builtins) + switch { + case err == nil && !test.ok: + t.Errorf("%q: expected error; got none", test.name) + continue + case err != nil && test.ok: + t.Errorf("%q: unexpected error: %v", test.name, err) + continue + case err != nil && !test.ok: + // expected error, got one + if *debug { + fmt.Printf("%s: %s\n\t%s\n", test.name, test.input, err) + } + continue + } + var result string + if doCopy { + result = tmpl.Root.Copy().String() + } else { + result = tmpl.Root.String() + } + if result != test.result { + t.Errorf("%s=(%q): got\n\t%v\nexpected\n\t%v", test.name, test.input, result, test.result) + } + } +} + +func TestParse(t *testing.T) { + testParse(false, t) +} + +// Same as TestParse, but we copy the node first +func TestParseCopy(t *testing.T) { + testParse(true, t) +} + +type isEmptyTest struct { + name string + input string + empty bool +} + +var isEmptyTests = []isEmptyTest{ + {"empty", ``, true}, + {"nonempty", `hello`, false}, + {"spaces only", " \t\n \t\n", true}, + {"definition", `{{define "x"}}something{{end}}`, true}, + {"definitions and space", "{{define `x`}}something{{end}}\n\n{{define `y`}}something{{end}}\n\n", true}, + {"definitions and text", "{{define `x`}}something{{end}}\nx\n{{define `y`}}something{{end}}\ny\n", false}, + {"definition and action", "{{define `x`}}something{{end}}{{if 3}}foo{{end}}", false}, +} + +func TestIsEmpty(t *testing.T) { + if !IsEmptyTree(nil) { + t.Errorf("nil tree is not empty") + } + for _, test := range isEmptyTests { + tree, err := New("root").Parse(test.input, "", "", make(map[string]*Tree), nil) + if err != nil { + t.Errorf("%q: unexpected error: %v", test.name, err) + continue + } + if empty := IsEmptyTree(tree.Root); empty != test.empty { + t.Errorf("%q: expected %t got %t", test.name, test.empty, empty) + } + } +} + +func TestErrorContextWithTreeCopy(t *testing.T) { + tree, err := New("root").Parse("{{if true}}{{end}}", "", "", make(map[string]*Tree), nil) + if err != nil { + t.Fatalf("unexpected tree parse failure: %v", err) + } + treeCopy := tree.Copy() + wantLocation, wantContext := tree.ErrorContext(tree.Root.Nodes[0]) + gotLocation, gotContext := treeCopy.ErrorContext(treeCopy.Root.Nodes[0]) + if wantLocation != gotLocation { + t.Errorf("wrong error location want %q got %q", wantLocation, gotLocation) + } + if wantContext != gotContext { + t.Errorf("wrong error location want %q got %q", wantContext, gotContext) + } +} + +// All failures, and the result is a string that must appear in the error message. +var errorTests = []parseTest{ + // Check line numbers are accurate. + {"unclosed1", + "line1\n{{", + hasError, `unclosed1:2: unexpected unclosed action in command`}, + {"unclosed2", + "line1\n{{define `x`}}line2\n{{", + hasError, `unclosed2:3: unexpected unclosed action in command`}, + // Specific errors. + {"function", + "{{foo}}", + hasError, `function "foo" not defined`}, + {"comment", + "{{/*}}", + hasError, `unclosed comment`}, + {"lparen", + "{{.X (1 2 3}}", + hasError, `unclosed left paren`}, + {"rparen", + "{{.X 1 2 3)}}", + hasError, `unexpected ")"`}, + {"space", + "{{`x`3}}", + hasError, `missing space?`}, + {"idchar", + "{{a#}}", + hasError, `'#'`}, + {"charconst", + "{{'a}}", + hasError, `unterminated character constant`}, + {"stringconst", + `{{"a}}`, + hasError, `unterminated quoted string`}, + {"rawstringconst", + "{{`a}}", + hasError, `unterminated raw quoted string`}, + {"number", + "{{0xi}}", + hasError, `number syntax`}, + {"multidefine", + "{{define `a`}}a{{end}}{{define `a`}}b{{end}}", + hasError, `multiple definition of template`}, + {"eof", + "{{range .X}}", + hasError, `unexpected EOF`}, + {"variable", + // Declare $x so it's defined, to avoid that error, and then check we don't parse a declaration. + "{{$x := 23}}{{with $x.y := 3}}{{$x 23}}{{end}}", + hasError, `unexpected ":="`}, + {"multidecl", + "{{$a,$b,$c := 23}}", + hasError, `too many declarations`}, + {"undefvar", + "{{$a}}", + hasError, `undefined variable`}, +} + +func TestErrors(t *testing.T) { + for _, test := range errorTests { + _, err := New(test.name).Parse(test.input, "", "", make(map[string]*Tree)) + if err == nil { + t.Errorf("%q: expected error", test.name) + continue + } + if !strings.Contains(err.Error(), test.result) { + t.Errorf("%q: error %q does not contain %q", test.name, err, test.result) + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/template.go b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/template.go new file mode 100644 index 0000000..447ed2a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/template.go @@ -0,0 +1,218 @@ +// 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 template + +import ( + "fmt" + "reflect" + + "github.com/alecthomas/template/parse" +) + +// common holds the information shared by related templates. +type common struct { + tmpl map[string]*Template + // We use two maps, one for parsing and one for execution. + // This separation makes the API cleaner since it doesn't + // expose reflection to the client. + parseFuncs FuncMap + execFuncs map[string]reflect.Value +} + +// Template is the representation of a parsed template. The *parse.Tree +// field is exported only for use by html/template and should be treated +// as unexported by all other clients. +type Template struct { + name string + *parse.Tree + *common + leftDelim string + rightDelim string +} + +// New allocates a new template with the given name. +func New(name string) *Template { + return &Template{ + name: name, + } +} + +// Name returns the name of the template. +func (t *Template) Name() string { + return t.name +} + +// New allocates a new template associated with the given one and with the same +// delimiters. The association, which is transitive, allows one template to +// invoke another with a {{template}} action. +func (t *Template) New(name string) *Template { + t.init() + return &Template{ + name: name, + common: t.common, + leftDelim: t.leftDelim, + rightDelim: t.rightDelim, + } +} + +func (t *Template) init() { + if t.common == nil { + t.common = new(common) + t.tmpl = make(map[string]*Template) + t.parseFuncs = make(FuncMap) + t.execFuncs = make(map[string]reflect.Value) + } +} + +// Clone returns a duplicate of the template, including all associated +// templates. The actual representation is not copied, but the name space of +// associated templates is, so further calls to Parse in the copy will add +// templates to the copy but not to the original. Clone can be used to prepare +// common templates and use them with variant definitions for other templates +// by adding the variants after the clone is made. +func (t *Template) Clone() (*Template, error) { + nt := t.copy(nil) + nt.init() + nt.tmpl[t.name] = nt + for k, v := range t.tmpl { + if k == t.name { // Already installed. + continue + } + // The associated templates share nt's common structure. + tmpl := v.copy(nt.common) + nt.tmpl[k] = tmpl + } + for k, v := range t.parseFuncs { + nt.parseFuncs[k] = v + } + for k, v := range t.execFuncs { + nt.execFuncs[k] = v + } + return nt, nil +} + +// copy returns a shallow copy of t, with common set to the argument. +func (t *Template) copy(c *common) *Template { + nt := New(t.name) + nt.Tree = t.Tree + nt.common = c + nt.leftDelim = t.leftDelim + nt.rightDelim = t.rightDelim + return nt +} + +// AddParseTree creates a new template with the name and parse tree +// and associates it with t. +func (t *Template) AddParseTree(name string, tree *parse.Tree) (*Template, error) { + if t.common != nil && t.tmpl[name] != nil { + return nil, fmt.Errorf("template: redefinition of template %q", name) + } + nt := t.New(name) + nt.Tree = tree + t.tmpl[name] = nt + return nt, nil +} + +// Templates returns a slice of the templates associated with t, including t +// itself. +func (t *Template) Templates() []*Template { + if t.common == nil { + return nil + } + // Return a slice so we don't expose the map. + m := make([]*Template, 0, len(t.tmpl)) + for _, v := range t.tmpl { + m = append(m, v) + } + return m +} + +// Delims sets the action delimiters to the specified strings, to be used in +// subsequent calls to Parse, ParseFiles, or ParseGlob. Nested template +// definitions will inherit the settings. An empty delimiter stands for the +// corresponding default: {{ or }}. +// The return value is the template, so calls can be chained. +func (t *Template) Delims(left, right string) *Template { + t.leftDelim = left + t.rightDelim = right + return t +} + +// Funcs adds the elements of the argument map to the template's function map. +// It panics if a value in the map is not a function with appropriate return +// type. However, it is legal to overwrite elements of the map. The return +// value is the template, so calls can be chained. +func (t *Template) Funcs(funcMap FuncMap) *Template { + t.init() + addValueFuncs(t.execFuncs, funcMap) + addFuncs(t.parseFuncs, funcMap) + return t +} + +// Lookup returns the template with the given name that is associated with t, +// or nil if there is no such template. +func (t *Template) Lookup(name string) *Template { + if t.common == nil { + return nil + } + return t.tmpl[name] +} + +// Parse parses a string into a template. Nested template definitions will be +// associated with the top-level template t. Parse may be called multiple times +// to parse definitions of templates to associate with t. It is an error if a +// resulting template is non-empty (contains content other than template +// definitions) and would replace a non-empty template with the same name. +// (In multiple calls to Parse with the same receiver template, only one call +// can contain text other than space, comments, and template definitions.) +func (t *Template) Parse(text string) (*Template, error) { + t.init() + trees, err := parse.Parse(t.name, text, t.leftDelim, t.rightDelim, t.parseFuncs, builtins) + if err != nil { + return nil, err + } + // Add the newly parsed trees, including the one for t, into our common structure. + for name, tree := range trees { + // If the name we parsed is the name of this template, overwrite this template. + // The associate method checks it's not a redefinition. + tmpl := t + if name != t.name { + tmpl = t.New(name) + } + // Even if t == tmpl, we need to install it in the common.tmpl map. + if replace, err := t.associate(tmpl, tree); err != nil { + return nil, err + } else if replace { + tmpl.Tree = tree + } + tmpl.leftDelim = t.leftDelim + tmpl.rightDelim = t.rightDelim + } + return t, nil +} + +// associate installs the new template into the group of templates associated +// with t. It is an error to reuse a name except to overwrite an empty +// template. The two are already known to share the common structure. +// The boolean return value reports wither to store this tree as t.Tree. +func (t *Template) associate(new *Template, tree *parse.Tree) (bool, error) { + if new.common != t.common { + panic("internal error: associate not common") + } + name := new.name + if old := t.tmpl[name]; old != nil { + oldIsEmpty := parse.IsEmptyTree(old.Root) + newIsEmpty := parse.IsEmptyTree(tree.Root) + if newIsEmpty { + // Whether old is empty or not, new is empty; no reason to replace old. + return false, nil + } + if !oldIsEmpty { + return false, fmt.Errorf("template: redefinition of template %q", name) + } + } + t.tmpl[name] = new + return true, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/testdata/file1.tmpl b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/testdata/file1.tmpl new file mode 100644 index 0000000..febf9d9 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/testdata/file1.tmpl @@ -0,0 +1,2 @@ +{{define "x"}}TEXT{{end}} +{{define "dotV"}}{{.V}}{{end}} diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/testdata/file2.tmpl b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/testdata/file2.tmpl new file mode 100644 index 0000000..39bf6fb --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/testdata/file2.tmpl @@ -0,0 +1,2 @@ +{{define "dot"}}{{.}}{{end}} +{{define "nested"}}{{template "dot" .}}{{end}} diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/testdata/tmpl1.tmpl b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/testdata/tmpl1.tmpl new file mode 100644 index 0000000..b72b3a3 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/testdata/tmpl1.tmpl @@ -0,0 +1,3 @@ +template1 +{{define "x"}}x{{end}} +{{template "y"}} diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/testdata/tmpl2.tmpl b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/testdata/tmpl2.tmpl new file mode 100644 index 0000000..16beba6 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/template/testdata/tmpl2.tmpl @@ -0,0 +1,3 @@ +template2 +{{define "y"}}y{{end}} +{{template "x"}} diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/units/COPYING b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/units/COPYING new file mode 100644 index 0000000..2993ec0 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/units/COPYING @@ -0,0 +1,19 @@ +Copyright (C) 2014 Alec Thomas + +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/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/units/README.md b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/units/README.md new file mode 100644 index 0000000..bee884e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/units/README.md @@ -0,0 +1,11 @@ +# Units - Helpful unit multipliers and functions for Go + +The goal of this package is to have functionality similar to the [time](http://golang.org/pkg/time/) package. + +It allows for code like this: + +```go +n, err := ParseBase2Bytes("1KB") +// n == 1024 +n = units.Mebibyte * 512 +``` diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/units/bytes.go b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/units/bytes.go new file mode 100644 index 0000000..eaadeb8 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/units/bytes.go @@ -0,0 +1,83 @@ +package units + +// Base2Bytes is the old non-SI power-of-2 byte scale (1024 bytes in a kilobyte, +// etc.). +type Base2Bytes int64 + +// Base-2 byte units. +const ( + Kibibyte Base2Bytes = 1024 + KiB = Kibibyte + Mebibyte = Kibibyte * 1024 + MiB = Mebibyte + Gibibyte = Mebibyte * 1024 + GiB = Gibibyte + Tebibyte = Gibibyte * 1024 + TiB = Tebibyte + Pebibyte = Tebibyte * 1024 + PiB = Pebibyte + Exbibyte = Pebibyte * 1024 + EiB = Exbibyte +) + +var ( + bytesUnitMap = MakeUnitMap("iB", "B", 1024) + oldBytesUnitMap = MakeUnitMap("B", "B", 1024) +) + +// ParseBase2Bytes supports both iB and B in base-2 multipliers. That is, KB +// and KiB are both 1024. +func ParseBase2Bytes(s string) (Base2Bytes, error) { + n, err := ParseUnit(s, bytesUnitMap) + if err != nil { + n, err = ParseUnit(s, oldBytesUnitMap) + } + return Base2Bytes(n), err +} + +func (b Base2Bytes) String() string { + return ToString(int64(b), 1024, "iB", "B") +} + +var ( + metricBytesUnitMap = MakeUnitMap("B", "B", 1000) +) + +// MetricBytes are SI byte units (1000 bytes in a kilobyte). +type MetricBytes SI + +// SI base-10 byte units. +const ( + Kilobyte MetricBytes = 1000 + KB = Kilobyte + Megabyte = Kilobyte * 1000 + MB = Megabyte + Gigabyte = Megabyte * 1000 + GB = Gigabyte + Terabyte = Gigabyte * 1000 + TB = Terabyte + Petabyte = Terabyte * 1000 + PB = Petabyte + Exabyte = Petabyte * 1000 + EB = Exabyte +) + +// ParseMetricBytes parses base-10 metric byte units. That is, KB is 1000 bytes. +func ParseMetricBytes(s string) (MetricBytes, error) { + n, err := ParseUnit(s, metricBytesUnitMap) + return MetricBytes(n), err +} + +func (m MetricBytes) String() string { + return ToString(int64(m), 1000, "B", "B") +} + +// ParseStrictBytes supports both iB and B suffixes for base 2 and metric, +// respectively. That is, KiB represents 1024 and KB represents 1000. +func ParseStrictBytes(s string) (int64, error) { + n, err := ParseUnit(s, bytesUnitMap) + if err != nil { + n, err = ParseUnit(s, metricBytesUnitMap) + } + return int64(n), err +} diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/units/bytes_test.go b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/units/bytes_test.go new file mode 100644 index 0000000..6cbc79d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/units/bytes_test.go @@ -0,0 +1,49 @@ +package units + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestBase2BytesString(t *testing.T) { + assert.Equal(t, Base2Bytes(0).String(), "0B") + assert.Equal(t, Base2Bytes(1025).String(), "1KiB1B") + assert.Equal(t, Base2Bytes(1048577).String(), "1MiB1B") +} + +func TestParseBase2Bytes(t *testing.T) { + n, err := ParseBase2Bytes("0B") + assert.NoError(t, err) + assert.Equal(t, 0, int(n)) + n, err = ParseBase2Bytes("1KB") + assert.NoError(t, err) + assert.Equal(t, 1024, int(n)) + n, err = ParseBase2Bytes("1MB1KB25B") + assert.NoError(t, err) + assert.Equal(t, 1049625, int(n)) + n, err = ParseBase2Bytes("1.5MB") + assert.NoError(t, err) + assert.Equal(t, 1572864, int(n)) +} + +func TestMetricBytesString(t *testing.T) { + assert.Equal(t, MetricBytes(0).String(), "0B") + assert.Equal(t, MetricBytes(1001).String(), "1KB1B") + assert.Equal(t, MetricBytes(1001025).String(), "1MB1KB25B") +} + +func TestParseMetricBytes(t *testing.T) { + n, err := ParseMetricBytes("0B") + assert.NoError(t, err) + assert.Equal(t, 0, int(n)) + n, err = ParseMetricBytes("1KB1B") + assert.NoError(t, err) + assert.Equal(t, 1001, int(n)) + n, err = ParseMetricBytes("1MB1KB25B") + assert.NoError(t, err) + assert.Equal(t, 1001025, int(n)) + n, err = ParseMetricBytes("1.5MB") + assert.NoError(t, err) + assert.Equal(t, 1500000, int(n)) +} diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/units/doc.go b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/units/doc.go new file mode 100644 index 0000000..156ae38 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/units/doc.go @@ -0,0 +1,13 @@ +// Package units provides helpful unit multipliers and functions for Go. +// +// The goal of this package is to have functionality similar to the time [1] package. +// +// +// [1] http://golang.org/pkg/time/ +// +// It allows for code like this: +// +// n, err := ParseBase2Bytes("1KB") +// // n == 1024 +// n = units.Mebibyte * 512 +package units diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/units/si.go b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/units/si.go new file mode 100644 index 0000000..8234a9d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/units/si.go @@ -0,0 +1,26 @@ +package units + +// SI units. +type SI int64 + +// SI unit multiples. +const ( + Kilo SI = 1000 + Mega = Kilo * 1000 + Giga = Mega * 1000 + Tera = Giga * 1000 + Peta = Tera * 1000 + Exa = Peta * 1000 +) + +func MakeUnitMap(suffix, shortSuffix string, scale int64) map[string]float64 { + return map[string]float64{ + shortSuffix: 1, + "K" + suffix: float64(scale), + "M" + suffix: float64(scale * scale), + "G" + suffix: float64(scale * scale * scale), + "T" + suffix: float64(scale * scale * scale * scale), + "P" + suffix: float64(scale * scale * scale * scale * scale), + "E" + suffix: float64(scale * scale * scale * scale * scale * scale), + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/units/util.go b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/units/util.go new file mode 100644 index 0000000..6527e92 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/alecthomas/units/util.go @@ -0,0 +1,138 @@ +package units + +import ( + "errors" + "fmt" + "strings" +) + +var ( + siUnits = []string{"", "K", "M", "G", "T", "P", "E"} +) + +func ToString(n int64, scale int64, suffix, baseSuffix string) string { + mn := len(siUnits) + out := make([]string, mn) + for i, m := range siUnits { + if n%scale != 0 || i == 0 && n == 0 { + s := suffix + if i == 0 { + s = baseSuffix + } + out[mn-1-i] = fmt.Sprintf("%d%s%s", n%scale, m, s) + } + n /= scale + if n == 0 { + break + } + } + return strings.Join(out, "") +} + +// Below code ripped straight from http://golang.org/src/pkg/time/format.go?s=33392:33438#L1123 +var errLeadingInt = errors.New("units: bad [0-9]*") // never printed + +// leadingInt consumes the leading [0-9]* from s. +func leadingInt(s string) (x int64, rem string, err error) { + i := 0 + for ; i < len(s); i++ { + c := s[i] + if c < '0' || c > '9' { + break + } + if x >= (1<<63-10)/10 { + // overflow + return 0, "", errLeadingInt + } + x = x*10 + int64(c) - '0' + } + return x, s[i:], nil +} + +func ParseUnit(s string, unitMap map[string]float64) (int64, error) { + // [-+]?([0-9]*(\.[0-9]*)?[a-z]+)+ + orig := s + f := float64(0) + neg := false + + // Consume [-+]? + if s != "" { + c := s[0] + if c == '-' || c == '+' { + neg = c == '-' + s = s[1:] + } + } + // Special case: if all that is left is "0", this is zero. + if s == "0" { + return 0, nil + } + if s == "" { + return 0, errors.New("units: invalid " + orig) + } + for s != "" { + g := float64(0) // this element of the sequence + + var x int64 + var err error + + // The next character must be [0-9.] + if !(s[0] == '.' || ('0' <= s[0] && s[0] <= '9')) { + return 0, errors.New("units: invalid " + orig) + } + // Consume [0-9]* + pl := len(s) + x, s, err = leadingInt(s) + if err != nil { + return 0, errors.New("units: invalid " + orig) + } + g = float64(x) + pre := pl != len(s) // whether we consumed anything before a period + + // Consume (\.[0-9]*)? + post := false + if s != "" && s[0] == '.' { + s = s[1:] + pl := len(s) + x, s, err = leadingInt(s) + if err != nil { + return 0, errors.New("units: invalid " + orig) + } + scale := 1.0 + for n := pl - len(s); n > 0; n-- { + scale *= 10 + } + g += float64(x) / scale + post = pl != len(s) + } + if !pre && !post { + // no digits (e.g. ".s" or "-.s") + return 0, errors.New("units: invalid " + orig) + } + + // Consume unit. + i := 0 + for ; i < len(s); i++ { + c := s[i] + if c == '.' || ('0' <= c && c <= '9') { + break + } + } + u := s[:i] + s = s[i:] + unit, ok := unitMap[u] + if !ok { + return 0, errors.New("units: unknown unit " + u + " in " + orig) + } + + f += g * unit + } + + if neg { + f = -f + } + if f < float64(-1<<63) || f > float64(1<<63-1) { + return 0, errors.New("units: overflow parsing unit") + } + return int64(f), nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/.gitignore b/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/.gitignore new file mode 100644 index 0000000..0026861 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/.gitignore @@ -0,0 +1,22 @@ +# 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 diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/.travis.yml b/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/.travis.yml new file mode 100644 index 0000000..1040404 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/.travis.yml @@ -0,0 +1,9 @@ +language: go +go: + - 1.3.3 + - tip +before_install: + - go get github.com/mattn/goveralls + - go get golang.org/x/tools/cmd/cover +script: + - $HOME/gopath/bin/goveralls -service=travis-ci diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/LICENSE b/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/LICENSE new file mode 100644 index 0000000..89b8179 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2014 Cenk Altı + +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/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/README.md b/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/README.md new file mode 100644 index 0000000..13b347f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/README.md @@ -0,0 +1,30 @@ +# Exponential Backoff [![GoDoc][godoc image]][godoc] [![Build Status][travis image]][travis] [![Coverage Status][coveralls image]][coveralls] + +This is a Go port of the exponential backoff algorithm from [Google's HTTP Client Library for Java][google-http-java-client]. + +[Exponential backoff][exponential backoff wiki] +is an algorithm that uses feedback to multiplicatively decrease the rate of some process, +in order to gradually find an acceptable rate. +The retries exponentially increase and stop increasing when a certain threshold is met. + +## Usage + +See https://godoc.org/github.com/cenkalti/backoff#pkg-examples + +## Contributing + +* I would like to keep this library as small as possible. +* Please don't send a PR without opening an issue and discussing it first. +* If proposed change is not a common use case, I will probably not accept it. + +[godoc]: https://godoc.org/github.com/cenkalti/backoff +[godoc image]: https://godoc.org/github.com/cenkalti/backoff?status.png +[travis]: https://travis-ci.org/cenkalti/backoff +[travis image]: https://travis-ci.org/cenkalti/backoff.png?branch=master +[coveralls]: https://coveralls.io/github/cenkalti/backoff?branch=master +[coveralls image]: https://coveralls.io/repos/github/cenkalti/backoff/badge.svg?branch=master + +[google-http-java-client]: https://github.com/google/google-http-java-client +[exponential backoff wiki]: http://en.wikipedia.org/wiki/Exponential_backoff + +[advanced example]: https://godoc.org/github.com/cenkalti/backoff#example_ diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/backoff.go b/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/backoff.go new file mode 100644 index 0000000..2102c5f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/backoff.go @@ -0,0 +1,66 @@ +// Package backoff implements backoff algorithms for retrying operations. +// +// Use Retry function for retrying operations that may fail. +// If Retry does not meet your needs, +// copy/paste the function into your project and modify as you wish. +// +// There is also Ticker type similar to time.Ticker. +// You can use it if you need to work with channels. +// +// See Examples section below for usage examples. +package backoff + +import "time" + +// BackOff is a backoff policy for retrying an operation. +type BackOff interface { + // NextBackOff returns the duration to wait before retrying the operation, + // or backoff.Stop to indicate that no more retries should be made. + // + // Example usage: + // + // duration := backoff.NextBackOff(); + // if (duration == backoff.Stop) { + // // Do not retry operation. + // } else { + // // Sleep for duration and retry operation. + // } + // + NextBackOff() time.Duration + + // Reset to initial state. + Reset() +} + +// Stop indicates that no more retries should be made for use in NextBackOff(). +const Stop time.Duration = -1 + +// ZeroBackOff is a fixed backoff policy whose backoff time is always zero, +// meaning that the operation is retried immediately without waiting, indefinitely. +type ZeroBackOff struct{} + +func (b *ZeroBackOff) Reset() {} + +func (b *ZeroBackOff) NextBackOff() time.Duration { return 0 } + +// StopBackOff is a fixed backoff policy that always returns backoff.Stop for +// NextBackOff(), meaning that the operation should never be retried. +type StopBackOff struct{} + +func (b *StopBackOff) Reset() {} + +func (b *StopBackOff) NextBackOff() time.Duration { return Stop } + +// ConstantBackOff is a backoff policy that always returns the same backoff delay. +// This is in contrast to an exponential backoff policy, +// which returns a delay that grows longer as you call NextBackOff() over and over again. +type ConstantBackOff struct { + Interval time.Duration +} + +func (b *ConstantBackOff) Reset() {} +func (b *ConstantBackOff) NextBackOff() time.Duration { return b.Interval } + +func NewConstantBackOff(d time.Duration) *ConstantBackOff { + return &ConstantBackOff{Interval: d} +} diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/backoff_test.go b/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/backoff_test.go new file mode 100644 index 0000000..91f27c4 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/backoff_test.go @@ -0,0 +1,27 @@ +package backoff + +import ( + "testing" + "time" +) + +func TestNextBackOffMillis(t *testing.T) { + subtestNextBackOff(t, 0, new(ZeroBackOff)) + subtestNextBackOff(t, Stop, new(StopBackOff)) +} + +func subtestNextBackOff(t *testing.T, expectedValue time.Duration, backOffPolicy BackOff) { + for i := 0; i < 10; i++ { + next := backOffPolicy.NextBackOff() + if next != expectedValue { + t.Errorf("got: %d expected: %d", next, expectedValue) + } + } +} + +func TestConstantBackOff(t *testing.T) { + backoff := NewConstantBackOff(time.Second) + if backoff.NextBackOff() != time.Second { + t.Error("invalid interval") + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/context.go b/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/context.go new file mode 100644 index 0000000..5d15709 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/context.go @@ -0,0 +1,60 @@ +package backoff + +import ( + "time" + + "golang.org/x/net/context" +) + +// BackOffContext is a backoff policy that stops retrying after the context +// is canceled. +type BackOffContext interface { + BackOff + Context() context.Context +} + +type backOffContext struct { + BackOff + ctx context.Context +} + +// WithContext returns a BackOffContext with context ctx +// +// ctx must not be nil +func WithContext(b BackOff, ctx context.Context) BackOffContext { + if ctx == nil { + panic("nil context") + } + + if b, ok := b.(*backOffContext); ok { + return &backOffContext{ + BackOff: b.BackOff, + ctx: ctx, + } + } + + return &backOffContext{ + BackOff: b, + ctx: ctx, + } +} + +func ensureContext(b BackOff) BackOffContext { + if cb, ok := b.(BackOffContext); ok { + return cb + } + return WithContext(b, context.Background()) +} + +func (b *backOffContext) Context() context.Context { + return b.ctx +} + +func (b *backOffContext) NextBackOff() time.Duration { + select { + case <-b.Context().Done(): + return Stop + default: + return b.BackOff.NextBackOff() + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/context_test.go b/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/context_test.go new file mode 100644 index 0000000..993fa61 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/context_test.go @@ -0,0 +1,26 @@ +package backoff + +import ( + "testing" + "time" + + "golang.org/x/net/context" +) + +func TestContext(t *testing.T) { + b := NewConstantBackOff(time.Millisecond) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + cb := WithContext(b, ctx) + + if cb.Context() != ctx { + t.Error("invalid context") + } + + cancel() + + if cb.NextBackOff() != Stop { + t.Error("invalid next back off") + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/example_test.go b/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/example_test.go new file mode 100644 index 0000000..d97a8db --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/example_test.go @@ -0,0 +1,73 @@ +package backoff + +import ( + "log" + + "golang.org/x/net/context" +) + +func ExampleRetry() { + // An operation that may fail. + operation := func() error { + return nil // or an error + } + + err := Retry(operation, NewExponentialBackOff()) + if err != nil { + // Handle error. + return + } + + // Operation is successful. +} + +func ExampleRetryContext() { + // A context + ctx := context.Background() + + // An operation that may fail. + operation := func() error { + return nil // or an error + } + + b := WithContext(NewExponentialBackOff(), ctx) + + err := Retry(operation, b) + if err != nil { + // Handle error. + return + } + + // Operation is successful. +} + +func ExampleTicker() { + // An operation that may fail. + operation := func() error { + return nil // or an error + } + + ticker := NewTicker(NewExponentialBackOff()) + + var err error + + // Ticks will continue to arrive when the previous operation is still running, + // so operations that take a while to fail could run in quick succession. + for _ = range ticker.C { + if err = operation(); err != nil { + log.Println(err, "will retry...") + continue + } + + ticker.Stop() + break + } + + if err != nil { + // Operation has failed. + return + } + + // Operation is successful. + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/exponential.go b/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/exponential.go new file mode 100644 index 0000000..9a6addf --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/exponential.go @@ -0,0 +1,156 @@ +package backoff + +import ( + "math/rand" + "time" +) + +/* +ExponentialBackOff is a backoff implementation that increases the backoff +period for each retry attempt using a randomization function that grows exponentially. + +NextBackOff() is calculated using the following formula: + + randomized interval = + RetryInterval * (random value in range [1 - RandomizationFactor, 1 + RandomizationFactor]) + +In other words NextBackOff() will range between the randomization factor +percentage below and above the retry interval. + +For example, given the following parameters: + + RetryInterval = 2 + RandomizationFactor = 0.5 + Multiplier = 2 + +the actual backoff period used in the next retry attempt will range between 1 and 3 seconds, +multiplied by the exponential, that is, between 2 and 6 seconds. + +Note: MaxInterval caps the RetryInterval and not the randomized interval. + +If the time elapsed since an ExponentialBackOff instance is created goes past the +MaxElapsedTime, then the method NextBackOff() starts returning backoff.Stop. + +The elapsed time can be reset by calling Reset(). + +Example: Given the following default arguments, for 10 tries the sequence will be, +and assuming we go over the MaxElapsedTime on the 10th try: + + Request # RetryInterval (seconds) Randomized Interval (seconds) + + 1 0.5 [0.25, 0.75] + 2 0.75 [0.375, 1.125] + 3 1.125 [0.562, 1.687] + 4 1.687 [0.8435, 2.53] + 5 2.53 [1.265, 3.795] + 6 3.795 [1.897, 5.692] + 7 5.692 [2.846, 8.538] + 8 8.538 [4.269, 12.807] + 9 12.807 [6.403, 19.210] + 10 19.210 backoff.Stop + +Note: Implementation is not thread-safe. +*/ +type ExponentialBackOff struct { + InitialInterval time.Duration + RandomizationFactor float64 + Multiplier float64 + MaxInterval time.Duration + // After MaxElapsedTime the ExponentialBackOff stops. + // It never stops if MaxElapsedTime == 0. + MaxElapsedTime time.Duration + Clock Clock + + currentInterval time.Duration + startTime time.Time + random *rand.Rand +} + +// Clock is an interface that returns current time for BackOff. +type Clock interface { + Now() time.Time +} + +// Default values for ExponentialBackOff. +const ( + DefaultInitialInterval = 500 * time.Millisecond + DefaultRandomizationFactor = 0.5 + DefaultMultiplier = 1.5 + DefaultMaxInterval = 60 * time.Second + DefaultMaxElapsedTime = 15 * time.Minute +) + +// NewExponentialBackOff creates an instance of ExponentialBackOff using default values. +func NewExponentialBackOff() *ExponentialBackOff { + b := &ExponentialBackOff{ + InitialInterval: DefaultInitialInterval, + RandomizationFactor: DefaultRandomizationFactor, + Multiplier: DefaultMultiplier, + MaxInterval: DefaultMaxInterval, + MaxElapsedTime: DefaultMaxElapsedTime, + Clock: SystemClock, + random: rand.New(rand.NewSource(time.Now().UnixNano())), + } + b.Reset() + return b +} + +type systemClock struct{} + +func (t systemClock) Now() time.Time { + return time.Now() +} + +// SystemClock implements Clock interface that uses time.Now(). +var SystemClock = systemClock{} + +// Reset the interval back to the initial retry interval and restarts the timer. +func (b *ExponentialBackOff) Reset() { + b.currentInterval = b.InitialInterval + b.startTime = b.Clock.Now() +} + +// NextBackOff calculates the next backoff interval using the formula: +// Randomized interval = RetryInterval +/- (RandomizationFactor * RetryInterval) +func (b *ExponentialBackOff) NextBackOff() time.Duration { + // Make sure we have not gone over the maximum elapsed time. + if b.MaxElapsedTime != 0 && b.GetElapsedTime() > b.MaxElapsedTime { + return Stop + } + defer b.incrementCurrentInterval() + if b.random == nil { + b.random = rand.New(rand.NewSource(time.Now().UnixNano())) + } + return getRandomValueFromInterval(b.RandomizationFactor, b.random.Float64(), b.currentInterval) +} + +// GetElapsedTime returns the elapsed time since an ExponentialBackOff instance +// is created and is reset when Reset() is called. +// +// The elapsed time is computed using time.Now().UnixNano(). +func (b *ExponentialBackOff) GetElapsedTime() time.Duration { + return b.Clock.Now().Sub(b.startTime) +} + +// Increments the current interval by multiplying it with the multiplier. +func (b *ExponentialBackOff) incrementCurrentInterval() { + // Check for overflow, if overflow is detected set the current interval to the max interval. + if float64(b.currentInterval) >= float64(b.MaxInterval)/b.Multiplier { + b.currentInterval = b.MaxInterval + } else { + b.currentInterval = time.Duration(float64(b.currentInterval) * b.Multiplier) + } +} + +// Returns a random value from the following interval: +// [randomizationFactor * currentInterval, randomizationFactor * currentInterval]. +func getRandomValueFromInterval(randomizationFactor, random float64, currentInterval time.Duration) time.Duration { + var delta = randomizationFactor * float64(currentInterval) + var minInterval = float64(currentInterval) - delta + var maxInterval = float64(currentInterval) + delta + + // Get a random value from the range [minInterval, maxInterval]. + // The formula used below has a +1 because if the minInterval is 1 and the maxInterval is 3 then + // we want a 33% chance for selecting either 1, 2 or 3. + return time.Duration(minInterval + (random * (maxInterval - minInterval + 1))) +} diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/exponential_test.go b/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/exponential_test.go new file mode 100644 index 0000000..11b95e4 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/exponential_test.go @@ -0,0 +1,108 @@ +package backoff + +import ( + "math" + "testing" + "time" +) + +func TestBackOff(t *testing.T) { + var ( + testInitialInterval = 500 * time.Millisecond + testRandomizationFactor = 0.1 + testMultiplier = 2.0 + testMaxInterval = 5 * time.Second + testMaxElapsedTime = 15 * time.Minute + ) + + exp := NewExponentialBackOff() + exp.InitialInterval = testInitialInterval + exp.RandomizationFactor = testRandomizationFactor + exp.Multiplier = testMultiplier + exp.MaxInterval = testMaxInterval + exp.MaxElapsedTime = testMaxElapsedTime + exp.Reset() + + var expectedResults = []time.Duration{500, 1000, 2000, 4000, 5000, 5000, 5000, 5000, 5000, 5000} + for i, d := range expectedResults { + expectedResults[i] = d * time.Millisecond + } + + for _, expected := range expectedResults { + assertEquals(t, expected, exp.currentInterval) + // Assert that the next backoff falls in the expected range. + var minInterval = expected - time.Duration(testRandomizationFactor*float64(expected)) + var maxInterval = expected + time.Duration(testRandomizationFactor*float64(expected)) + var actualInterval = exp.NextBackOff() + if !(minInterval <= actualInterval && actualInterval <= maxInterval) { + t.Error("error") + } + } +} + +func TestGetRandomizedInterval(t *testing.T) { + // 33% chance of being 1. + assertEquals(t, 1, getRandomValueFromInterval(0.5, 0, 2)) + assertEquals(t, 1, getRandomValueFromInterval(0.5, 0.33, 2)) + // 33% chance of being 2. + assertEquals(t, 2, getRandomValueFromInterval(0.5, 0.34, 2)) + assertEquals(t, 2, getRandomValueFromInterval(0.5, 0.66, 2)) + // 33% chance of being 3. + assertEquals(t, 3, getRandomValueFromInterval(0.5, 0.67, 2)) + assertEquals(t, 3, getRandomValueFromInterval(0.5, 0.99, 2)) +} + +type TestClock struct { + i time.Duration + start time.Time +} + +func (c *TestClock) Now() time.Time { + t := c.start.Add(c.i) + c.i += time.Second + return t +} + +func TestGetElapsedTime(t *testing.T) { + var exp = NewExponentialBackOff() + exp.Clock = &TestClock{} + exp.Reset() + + var elapsedTime = exp.GetElapsedTime() + if elapsedTime != time.Second { + t.Errorf("elapsedTime=%d", elapsedTime) + } +} + +func TestMaxElapsedTime(t *testing.T) { + var exp = NewExponentialBackOff() + exp.Clock = &TestClock{start: time.Time{}.Add(10000 * time.Second)} + // Change the currentElapsedTime to be 0 ensuring that the elapsed time will be greater + // than the max elapsed time. + exp.startTime = time.Time{} + assertEquals(t, Stop, exp.NextBackOff()) +} + +func TestBackOffOverflow(t *testing.T) { + var ( + testInitialInterval time.Duration = math.MaxInt64 / 2 + testMaxInterval time.Duration = math.MaxInt64 + testMultiplier = 2.1 + ) + + exp := NewExponentialBackOff() + exp.InitialInterval = testInitialInterval + exp.Multiplier = testMultiplier + exp.MaxInterval = testMaxInterval + exp.Reset() + + exp.NextBackOff() + // Assert that when an overflow is possible the current varerval time.Duration is set to the max varerval time.Duration . + assertEquals(t, testMaxInterval, exp.currentInterval) +} + +func assertEquals(t *testing.T, expected, value time.Duration) { + if expected != value { + t.Errorf("got: %d, expected: %d", value, expected) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/retry.go b/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/retry.go new file mode 100644 index 0000000..5dbd825 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/retry.go @@ -0,0 +1,78 @@ +package backoff + +import "time" + +// An Operation is executing by Retry() or RetryNotify(). +// The operation will be retried using a backoff policy if it returns an error. +type Operation func() error + +// Notify is a notify-on-error function. It receives an operation error and +// backoff delay if the operation failed (with an error). +// +// NOTE that if the backoff policy stated to stop retrying, +// the notify function isn't called. +type Notify func(error, time.Duration) + +// Retry the operation o until it does not return error or BackOff stops. +// o is guaranteed to be run at least once. +// It is the caller's responsibility to reset b after Retry returns. +// +// If o returns a *PermanentError, the operation is not retried, and the +// wrapped error is returned. +// +// Retry sleeps the goroutine for the duration returned by BackOff after a +// failed operation returns. +func Retry(o Operation, b BackOff) error { return RetryNotify(o, b, nil) } + +// RetryNotify calls notify function with the error and wait duration +// for each failed attempt before sleep. +func RetryNotify(operation Operation, b BackOff, notify Notify) error { + var err error + var next time.Duration + + cb := ensureContext(b) + + b.Reset() + for { + if err = operation(); err == nil { + return nil + } + + if permanent, ok := err.(*PermanentError); ok { + return permanent.Err + } + + if next = b.NextBackOff(); next == Stop { + return err + } + + if notify != nil { + notify(err, next) + } + + t := time.NewTimer(next) + + select { + case <-cb.Context().Done(): + t.Stop() + return err + case <-t.C: + } + } +} + +// PermanentError signals that the operation should not be retried. +type PermanentError struct { + Err error +} + +func (e *PermanentError) Error() string { + return e.Err.Error() +} + +// Permanent wraps the given err in a *PermanentError. +func Permanent(err error) *PermanentError { + return &PermanentError{ + Err: err, + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/retry_test.go b/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/retry_test.go new file mode 100644 index 0000000..5af2888 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/retry_test.go @@ -0,0 +1,99 @@ +package backoff + +import ( + "errors" + "fmt" + "log" + "testing" + "time" + + "golang.org/x/net/context" +) + +func TestRetry(t *testing.T) { + const successOn = 3 + var i = 0 + + // This function is successful on "successOn" calls. + f := func() error { + i++ + log.Printf("function is called %d. time\n", i) + + if i == successOn { + log.Println("OK") + return nil + } + + log.Println("error") + return errors.New("error") + } + + err := Retry(f, NewExponentialBackOff()) + if err != nil { + t.Errorf("unexpected error: %s", err.Error()) + } + if i != successOn { + t.Errorf("invalid number of retries: %d", i) + } +} + +func TestRetryContext(t *testing.T) { + var cancelOn = 3 + var i = 0 + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + // This function cancels context on "cancelOn" calls. + f := func() error { + i++ + log.Printf("function is called %d. time\n", i) + + // cancelling the context in the operation function is not a typical + // use-case, however it allows to get predictable test results. + if i == cancelOn { + cancel() + } + + log.Println("error") + return fmt.Errorf("error (%d)", i) + } + + err := Retry(f, WithContext(NewConstantBackOff(time.Millisecond), ctx)) + if err == nil { + t.Errorf("error is unexpectedly nil") + } + if err.Error() != "error (3)" { + t.Errorf("unexpected error: %s", err.Error()) + } + if i != cancelOn { + t.Errorf("invalid number of retries: %d", i) + } +} + +func TestRetryPermenent(t *testing.T) { + const permanentOn = 3 + var i = 0 + + // This function fails permanently after permanentOn tries + f := func() error { + i++ + log.Printf("function is called %d. time\n", i) + + if i == permanentOn { + log.Println("permanent error") + return Permanent(errors.New("permanent error")) + } + + log.Println("error") + return errors.New("error") + } + + err := Retry(f, NewExponentialBackOff()) + if err == nil || err.Error() != "permanent error" { + t.Errorf("unexpected error: %s", err) + } + if i != permanentOn { + t.Errorf("invalid number of retries: %d", i) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/ticker.go b/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/ticker.go new file mode 100644 index 0000000..49a9971 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/ticker.go @@ -0,0 +1,81 @@ +package backoff + +import ( + "runtime" + "sync" + "time" +) + +// Ticker holds a channel that delivers `ticks' of a clock at times reported by a BackOff. +// +// Ticks will continue to arrive when the previous operation is still running, +// so operations that take a while to fail could run in quick succession. +type Ticker struct { + C <-chan time.Time + c chan time.Time + b BackOffContext + stop chan struct{} + stopOnce sync.Once +} + +// NewTicker returns a new Ticker containing a channel that will send the time at times +// specified by the BackOff argument. Ticker is guaranteed to tick at least once. +// The channel is closed when Stop method is called or BackOff stops. +func NewTicker(b BackOff) *Ticker { + c := make(chan time.Time) + t := &Ticker{ + C: c, + c: c, + b: ensureContext(b), + stop: make(chan struct{}), + } + go t.run() + runtime.SetFinalizer(t, (*Ticker).Stop) + return t +} + +// Stop turns off a ticker. After Stop, no more ticks will be sent. +func (t *Ticker) Stop() { + t.stopOnce.Do(func() { close(t.stop) }) +} + +func (t *Ticker) run() { + c := t.c + defer close(c) + t.b.Reset() + + // Ticker is guaranteed to tick at least once. + afterC := t.send(time.Now()) + + for { + if afterC == nil { + return + } + + select { + case tick := <-afterC: + afterC = t.send(tick) + case <-t.stop: + t.c = nil // Prevent future ticks from being sent to the channel. + return + case <-t.b.Context().Done(): + return + } + } +} + +func (t *Ticker) send(tick time.Time) <-chan time.Time { + select { + case t.c <- tick: + case <-t.stop: + return nil + } + + next := t.b.NextBackOff() + if next == Stop { + t.Stop() + return nil + } + + return time.After(next) +} diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/ticker_test.go b/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/ticker_test.go new file mode 100644 index 0000000..085828c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/ticker_test.go @@ -0,0 +1,94 @@ +package backoff + +import ( + "errors" + "fmt" + "log" + "testing" + "time" + + "golang.org/x/net/context" +) + +func TestTicker(t *testing.T) { + const successOn = 3 + var i = 0 + + // This function is successful on "successOn" calls. + f := func() error { + i++ + log.Printf("function is called %d. time\n", i) + + if i == successOn { + log.Println("OK") + return nil + } + + log.Println("error") + return errors.New("error") + } + + b := NewExponentialBackOff() + ticker := NewTicker(b) + + var err error + for _ = range ticker.C { + if err = f(); err != nil { + t.Log(err) + continue + } + + break + } + if err != nil { + t.Errorf("unexpected error: %s", err.Error()) + } + if i != successOn { + t.Errorf("invalid number of retries: %d", i) + } +} + +func TestTickerContext(t *testing.T) { + const cancelOn = 3 + var i = 0 + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + // This function cancels context on "cancelOn" calls. + f := func() error { + i++ + log.Printf("function is called %d. time\n", i) + + // cancelling the context in the operation function is not a typical + // use-case, however it allows to get predictable test results. + if i == cancelOn { + cancel() + } + + log.Println("error") + return fmt.Errorf("error (%d)", i) + } + + b := WithContext(NewConstantBackOff(time.Millisecond), ctx) + ticker := NewTicker(b) + + var err error + for _ = range ticker.C { + if err = f(); err != nil { + t.Log(err) + continue + } + + break + } + if err == nil { + t.Errorf("error is unexpectedly nil") + } + if err.Error() != "error (3)" { + t.Errorf("unexpected error: %s", err.Error()) + } + if i != cancelOn { + t.Errorf("invalid number of retries: %d", i) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/tries.go b/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/tries.go new file mode 100644 index 0000000..d2da730 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/tries.go @@ -0,0 +1,35 @@ +package backoff + +import "time" + +/* +WithMaxTries creates a wrapper around another BackOff, which will +return Stop if NextBackOff() has been called too many times since +the last time Reset() was called + +Note: Implementation is not thread-safe. +*/ +func WithMaxTries(b BackOff, max uint64) BackOff { + return &backOffTries{delegate: b, maxTries: max} +} + +type backOffTries struct { + delegate BackOff + maxTries uint64 + numTries uint64 +} + +func (b *backOffTries) NextBackOff() time.Duration { + if b.maxTries > 0 { + if b.maxTries <= b.numTries { + return Stop + } + b.numTries++ + } + return b.delegate.NextBackOff() +} + +func (b *backOffTries) Reset() { + b.numTries = 0 + b.delegate.Reset() +} diff --git a/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/tries_test.go b/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/tries_test.go new file mode 100644 index 0000000..bd10211 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/github.com/cenkalti/backoff/tries_test.go @@ -0,0 +1,55 @@ +package backoff + +import ( + "math/rand" + "testing" + "time" +) + +func TestMaxTriesHappy(t *testing.T) { + r := rand.New(rand.NewSource(time.Now().UnixNano())) + max := 17 + r.Intn(13) + bo := WithMaxTries(&ZeroBackOff{}, uint64(max)) + + // Load up the tries count, but reset should clear the record + for ix := 0; ix < max/2; ix++ { + bo.NextBackOff() + } + bo.Reset() + + // Now fill the tries count all the way up + for ix := 0; ix < max; ix++ { + d := bo.NextBackOff() + if d == Stop { + t.Errorf("returned Stop on try %d", ix) + } + } + + // We have now called the BackOff max number of times, we expect + // the next result to be Stop, even if we try it multiple times + for ix := 0; ix < 7; ix++ { + d := bo.NextBackOff() + if d != Stop { + t.Error("invalid next back off") + } + } + + // Reset makes it all work again + bo.Reset() + d := bo.NextBackOff() + if d == Stop { + t.Error("returned Stop after reset") + } + +} + +func TestMaxTriesZero(t *testing.T) { + // It might not make sense, but its okay to send a zero + bo := WithMaxTries(&ZeroBackOff{}, uint64(0)) + for ix := 0; ix < 11; ix++ { + d := bo.NextBackOff() + if d == Stop { + t.Errorf("returned Stop on try %d", ix) + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/.github/PULL_REQUEST_TEMPLATE.md b/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..8ef55f8 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,8 @@ +Before opening your pull request, please make sure that you've: + +- [ ] [signed Uber's Contributor License Agreement](https://docs.google.com/a/uber.com/forms/d/1pAwS_-dA1KhPlfxzYLBqK6rsSWwRwH95OCCZrcsY5rk/viewform); +- [ ] added tests to cover your changes; +- [ ] run the test suite locally (`make test`); and finally, +- [ ] run the linters locally (`make lint`). + +Thanks for your contribution! diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/.gitignore b/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/.gitignore new file mode 100644 index 0000000..0a4504f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/.gitignore @@ -0,0 +1,11 @@ +.DS_Store +/vendor +/cover +cover.out +lint.log + +# Binaries +*.test + +# Profiling output +*.prof diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/.travis.yml b/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/.travis.yml new file mode 100644 index 0000000..f1ce95a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/.travis.yml @@ -0,0 +1,21 @@ +sudo: false +language: go +go_import_path: go.uber.org/atomic + +go: + - 1.5 + - 1.6 + - tip + +cache: + directories: + - vendor + +install: + - make install_ci + +script: + - make test_ci + - scripts/test-ubergo.sh + - make lint + - travis_retry goveralls -coverprofile=cover.out -service=travis-ci diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/LICENSE.txt b/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/LICENSE.txt new file mode 100644 index 0000000..8765c9f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/LICENSE.txt @@ -0,0 +1,19 @@ +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 +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/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/Makefile b/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/Makefile new file mode 100644 index 0000000..dfc63d9 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/Makefile @@ -0,0 +1,64 @@ +PACKAGES := $(shell glide nv) +# Many Go tools take file globs or directories as arguments instead of packages. +PACKAGE_FILES ?= *.go + + +# The linting tools evolve with each Go version, so run them only on the latest +# stable release. +GO_VERSION := $(shell go version | cut -d " " -f 3) +GO_MINOR_VERSION := $(word 2,$(subst ., ,$(GO_VERSION))) +LINTABLE_MINOR_VERSIONS := 7 8 +ifneq ($(filter $(LINTABLE_MINOR_VERSIONS),$(GO_MINOR_VERSION)),) +SHOULD_LINT := true +endif + + +export GO15VENDOREXPERIMENT=1 + + +.PHONY: build +build: + go build -i $(PACKAGES) + + +.PHONY: install +install: + glide --version || go get github.com/Masterminds/glide + glide install + + +.PHONY: test +test: + go test -cover -race $(PACKAGES) + + +.PHONY: install_ci +install_ci: install + go get github.com/wadey/gocovmerge + go get github.com/mattn/goveralls + go get golang.org/x/tools/cmd/cover +ifdef SHOULD_LINT + go get github.com/golang/lint/golint +endif + +.PHONY: lint +lint: +ifdef SHOULD_LINT + @rm -rf lint.log + @echo "Checking formatting..." + @gofmt -d -s $(PACKAGE_FILES) 2>&1 | tee lint.log + @echo "Checking vet..." + @$(foreach dir,$(PACKAGE_FILES),go tool vet $(dir) 2>&1 | tee -a lint.log;) + @echo "Checking lint..." + @$(foreach dir,$(PKGS),golint $(dir) 2>&1 | tee -a lint.log;) + @echo "Checking for unresolved FIXMEs..." + @git grep -i fixme | grep -v -e vendor -e Makefile | tee -a lint.log + @[ ! -s lint.log ] +else + @echo "Skipping linters on" $(GO_VERSION) +endif + + +.PHONY: test_ci +test_ci: install_ci build + ./scripts/cover.sh $(shell go list $(PACKAGES)) diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/README.md b/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/README.md new file mode 100644 index 0000000..bb4a12c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/README.md @@ -0,0 +1,34 @@ +# atomic [![GoDoc][doc-img]][doc] [![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov] + +Simple wrappers for primitive types to enforce atomic access. + +## Installation +`go get -u go.uber.org/atomic` + +## Usage +The standard library's `sync/atomic` is powerful, but it's easy to forget which +variables must be accessed atomically. `go.uber.org/atomic` preserves all the +functionality of the standard library, but wraps the primitive types to +provide a safer, more convenient API. + +```go +var atom atomic.Uint32 +atom.Store(42) +atom.Sub(2) +atom.CAS(40, 11) +``` + +See the [documentation][doc] for a complete API specification. + +## Development Status +Stable. + +
+Released under the [MIT License](LICENSE.txt). + +[doc-img]: https://godoc.org/github.com/uber-go/atomic?status.svg +[doc]: https://godoc.org/go.uber.org/atomic +[ci-img]: https://travis-ci.org/uber-go/atomic.svg?branch=master +[ci]: https://travis-ci.org/uber-go/atomic +[cov-img]: https://coveralls.io/repos/github/uber-go/atomic/badge.svg?branch=master +[cov]: https://coveralls.io/github/uber-go/atomic?branch=master diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/atomic.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/atomic.go new file mode 100644 index 0000000..290b884 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/atomic.go @@ -0,0 +1,304 @@ +// 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 +// 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. + +// Package atomic provides simple wrappers around numerics to enforce atomic +// access. +package atomic + +import ( + "math" + "sync/atomic" +) + +// Int32 is an atomic wrapper around an int32. +type Int32 struct{ v int32 } + +// NewInt32 creates an Int32. +func NewInt32(i int32) *Int32 { + return &Int32{i} +} + +// Load atomically loads the wrapped value. +func (i *Int32) Load() int32 { + return atomic.LoadInt32(&i.v) +} + +// Add atomically adds to the wrapped int32 and returns the new value. +func (i *Int32) Add(n int32) int32 { + return atomic.AddInt32(&i.v, n) +} + +// Sub atomically subtracts from the wrapped int32 and returns the new value. +func (i *Int32) Sub(n int32) int32 { + return atomic.AddInt32(&i.v, -n) +} + +// Inc atomically increments the wrapped int32 and returns the new value. +func (i *Int32) Inc() int32 { + return i.Add(1) +} + +// Dec atomically decrements the wrapped int32 and returns the new value. +func (i *Int32) Dec() int32 { + return i.Sub(1) +} + +// CAS is an atomic compare-and-swap. +func (i *Int32) CAS(old, new int32) bool { + return atomic.CompareAndSwapInt32(&i.v, old, new) +} + +// Store atomically stores the passed value. +func (i *Int32) Store(n int32) { + atomic.StoreInt32(&i.v, n) +} + +// Swap atomically swaps the wrapped int32 and returns the old value. +func (i *Int32) Swap(n int32) int32 { + return atomic.SwapInt32(&i.v, n) +} + +// Int64 is an atomic wrapper around an int64. +type Int64 struct{ v int64 } + +// NewInt64 creates an Int64. +func NewInt64(i int64) *Int64 { + return &Int64{i} +} + +// Load atomically loads the wrapped value. +func (i *Int64) Load() int64 { + return atomic.LoadInt64(&i.v) +} + +// Add atomically adds to the wrapped int64 and returns the new value. +func (i *Int64) Add(n int64) int64 { + return atomic.AddInt64(&i.v, n) +} + +// Sub atomically subtracts from the wrapped int64 and returns the new value. +func (i *Int64) Sub(n int64) int64 { + return atomic.AddInt64(&i.v, -n) +} + +// Inc atomically increments the wrapped int64 and returns the new value. +func (i *Int64) Inc() int64 { + return i.Add(1) +} + +// Dec atomically decrements the wrapped int64 and returns the new value. +func (i *Int64) Dec() int64 { + return i.Sub(1) +} + +// CAS is an atomic compare-and-swap. +func (i *Int64) CAS(old, new int64) bool { + return atomic.CompareAndSwapInt64(&i.v, old, new) +} + +// Store atomically stores the passed value. +func (i *Int64) Store(n int64) { + atomic.StoreInt64(&i.v, n) +} + +// Swap atomically swaps the wrapped int64 and returns the old value. +func (i *Int64) Swap(n int64) int64 { + return atomic.SwapInt64(&i.v, n) +} + +// Uint32 is an atomic wrapper around an uint32. +type Uint32 struct{ v uint32 } + +// NewUint32 creates a Uint32. +func NewUint32(i uint32) *Uint32 { + return &Uint32{i} +} + +// Load atomically loads the wrapped value. +func (i *Uint32) Load() uint32 { + return atomic.LoadUint32(&i.v) +} + +// Add atomically adds to the wrapped uint32 and returns the new value. +func (i *Uint32) Add(n uint32) uint32 { + return atomic.AddUint32(&i.v, n) +} + +// Sub atomically subtracts from the wrapped uint32 and returns the new value. +func (i *Uint32) Sub(n uint32) uint32 { + return atomic.AddUint32(&i.v, ^(n - 1)) +} + +// Inc atomically increments the wrapped uint32 and returns the new value. +func (i *Uint32) Inc() uint32 { + return i.Add(1) +} + +// Dec atomically decrements the wrapped int32 and returns the new value. +func (i *Uint32) Dec() uint32 { + return i.Sub(1) +} + +// CAS is an atomic compare-and-swap. +func (i *Uint32) CAS(old, new uint32) bool { + return atomic.CompareAndSwapUint32(&i.v, old, new) +} + +// Store atomically stores the passed value. +func (i *Uint32) Store(n uint32) { + atomic.StoreUint32(&i.v, n) +} + +// Swap atomically swaps the wrapped uint32 and returns the old value. +func (i *Uint32) Swap(n uint32) uint32 { + return atomic.SwapUint32(&i.v, n) +} + +// Uint64 is an atomic wrapper around a uint64. +type Uint64 struct{ v uint64 } + +// NewUint64 creates a Uint64. +func NewUint64(i uint64) *Uint64 { + return &Uint64{i} +} + +// Load atomically loads the wrapped value. +func (i *Uint64) Load() uint64 { + return atomic.LoadUint64(&i.v) +} + +// Add atomically adds to the wrapped uint64 and returns the new value. +func (i *Uint64) Add(n uint64) uint64 { + return atomic.AddUint64(&i.v, n) +} + +// Sub atomically subtracts from the wrapped uint64 and returns the new value. +func (i *Uint64) Sub(n uint64) uint64 { + return atomic.AddUint64(&i.v, ^(n - 1)) +} + +// Inc atomically increments the wrapped uint64 and returns the new value. +func (i *Uint64) Inc() uint64 { + return i.Add(1) +} + +// Dec atomically decrements the wrapped uint64 and returns the new value. +func (i *Uint64) Dec() uint64 { + return i.Sub(1) +} + +// CAS is an atomic compare-and-swap. +func (i *Uint64) CAS(old, new uint64) bool { + return atomic.CompareAndSwapUint64(&i.v, old, new) +} + +// Store atomically stores the passed value. +func (i *Uint64) Store(n uint64) { + atomic.StoreUint64(&i.v, n) +} + +// Swap atomically swaps the wrapped uint64 and returns the old value. +func (i *Uint64) Swap(n uint64) uint64 { + return atomic.SwapUint64(&i.v, n) +} + +// Bool is an atomic Boolean. +type Bool struct{ v uint32 } + +// NewBool creates a Bool. +func NewBool(initial bool) *Bool { + return &Bool{boolToInt(initial)} +} + +// Load atomically loads the Boolean. +func (b *Bool) Load() bool { + return truthy(atomic.LoadUint32(&b.v)) +} + +// Store atomically stores the passed value. +func (b *Bool) Store(new bool) { + atomic.StoreUint32(&b.v, boolToInt(new)) +} + +// Swap sets the given value and returns the previous value. +func (b *Bool) Swap(new bool) bool { + return truthy(atomic.SwapUint32(&b.v, boolToInt(new))) +} + +// Toggle atomically negates the Boolean and returns the previous value. +func (b *Bool) Toggle() bool { + return truthy(atomic.AddUint32(&b.v, 1) - 1) +} + +func truthy(n uint32) bool { + return n&1 == 1 +} + +func boolToInt(b bool) uint32 { + if b { + return 1 + } + return 0 +} + +// Float64 is an atomic wrapper around float64. +type Float64 struct { + v uint64 +} + +// NewFloat64 creates a Float64. +func NewFloat64(f float64) *Float64 { + return &Float64{math.Float64bits(f)} +} + +// Load atomically loads the wrapped value. +func (f *Float64) Load() float64 { + return math.Float64frombits(atomic.LoadUint64(&f.v)) +} + +// Store atomically stores the passed value. +func (f *Float64) Store(s float64) { + atomic.StoreUint64(&f.v, math.Float64bits(s)) +} + +// Add atomically adds to the wrapped float64 and returns the new value. +func (f *Float64) Add(s float64) float64 { + for { + old := f.Load() + new := old + s + if f.CAS(old, new) { + return new + } + } +} + +// Sub atomically subtracts from the wrapped float64 and returns the new value. +func (f *Float64) Sub(s float64) float64 { + return f.Add(-s) +} + +// CAS is an atomic compare-and-swap. +func (f *Float64) CAS(old, new float64) bool { + return atomic.CompareAndSwapUint64(&f.v, math.Float64bits(old), math.Float64bits(new)) +} + +// Value shadows the type of the same name from sync/atomic +// https://godoc.org/sync/atomic#Value +type Value struct{ atomic.Value } diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/atomic_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/atomic_test.go new file mode 100644 index 0000000..284f786 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/atomic_test.go @@ -0,0 +1,147 @@ +// 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 +// 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. + +package atomic + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestInt32(t *testing.T) { + atom := NewInt32(42) + + require.Equal(t, int32(42), atom.Load(), "Load didn't work.") + require.Equal(t, int32(46), atom.Add(4), "Add didn't work.") + require.Equal(t, int32(44), atom.Sub(2), "Sub didn't work.") + require.Equal(t, int32(45), atom.Inc(), "Inc didn't work.") + require.Equal(t, int32(44), atom.Dec(), "Dec didn't work.") + + require.True(t, atom.CAS(44, 0), "CAS didn't report a swap.") + require.Equal(t, int32(0), atom.Load(), "CAS didn't set the correct value.") + + require.Equal(t, int32(0), atom.Swap(1), "Swap didn't return the old value.") + require.Equal(t, int32(1), atom.Load(), "Swap didn't set the correct value.") + + atom.Store(42) + require.Equal(t, int32(42), atom.Load(), "Store didn't set the correct value.") +} + +func TestInt64(t *testing.T) { + atom := NewInt64(42) + + require.Equal(t, int64(42), atom.Load(), "Load didn't work.") + require.Equal(t, int64(46), atom.Add(4), "Add didn't work.") + require.Equal(t, int64(44), atom.Sub(2), "Sub didn't work.") + require.Equal(t, int64(45), atom.Inc(), "Inc didn't work.") + require.Equal(t, int64(44), atom.Dec(), "Dec didn't work.") + + require.True(t, atom.CAS(44, 0), "CAS didn't report a swap.") + require.Equal(t, int64(0), atom.Load(), "CAS didn't set the correct value.") + + require.Equal(t, int64(0), atom.Swap(1), "Swap didn't return the old value.") + require.Equal(t, int64(1), atom.Load(), "Swap didn't set the correct value.") + + atom.Store(42) + require.Equal(t, int64(42), atom.Load(), "Store didn't set the correct value.") +} + +func TestUint32(t *testing.T) { + atom := NewUint32(42) + + require.Equal(t, uint32(42), atom.Load(), "Load didn't work.") + require.Equal(t, uint32(46), atom.Add(4), "Add didn't work.") + require.Equal(t, uint32(44), atom.Sub(2), "Sub didn't work.") + require.Equal(t, uint32(45), atom.Inc(), "Inc didn't work.") + require.Equal(t, uint32(44), atom.Dec(), "Dec didn't work.") + + require.True(t, atom.CAS(44, 0), "CAS didn't report a swap.") + require.Equal(t, uint32(0), atom.Load(), "CAS didn't set the correct value.") + + require.Equal(t, uint32(0), atom.Swap(1), "Swap didn't return the old value.") + require.Equal(t, uint32(1), atom.Load(), "Swap didn't set the correct value.") + + atom.Store(42) + require.Equal(t, uint32(42), atom.Load(), "Store didn't set the correct value.") +} + +func TestUint64(t *testing.T) { + atom := NewUint64(42) + + require.Equal(t, uint64(42), atom.Load(), "Load didn't work.") + require.Equal(t, uint64(46), atom.Add(4), "Add didn't work.") + require.Equal(t, uint64(44), atom.Sub(2), "Sub didn't work.") + require.Equal(t, uint64(45), atom.Inc(), "Inc didn't work.") + require.Equal(t, uint64(44), atom.Dec(), "Dec didn't work.") + + require.True(t, atom.CAS(44, 0), "CAS didn't report a swap.") + require.Equal(t, uint64(0), atom.Load(), "CAS didn't set the correct value.") + + require.Equal(t, uint64(0), atom.Swap(1), "Swap didn't return the old value.") + require.Equal(t, uint64(1), atom.Load(), "Swap didn't set the correct value.") + + atom.Store(42) + require.Equal(t, uint64(42), atom.Load(), "Store didn't set the correct value.") +} + +func TestBool(t *testing.T) { + atom := NewBool(false) + require.False(t, atom.Toggle(), "Expected swap to return previous value.") + require.True(t, atom.Load(), "Unexpected state after swap.") + + atom.Store(false) + require.False(t, atom.Load(), "Unexpected state after store.") + + prev := atom.Swap(false) + require.False(t, prev, "Expected Swap to return previous value.") + + prev = atom.Swap(true) + require.False(t, prev, "Expected Swap to return previous value.") +} + +func TestFloat64(t *testing.T) { + atom := NewFloat64(4.2) + + require.Equal(t, float64(4.2), atom.Load(), "Load didn't work.") + + require.True(t, atom.CAS(4.2, 0.5), "CAS didn't report a swap.") + require.Equal(t, float64(0.5), atom.Load(), "CAS didn't set the correct value.") + require.False(t, atom.CAS(0.0, 1.5), "CAS reported a swap.") + + atom.Store(42.0) + require.Equal(t, float64(42.0), atom.Load(), "Store didn't set the correct value.") + require.Equal(t, float64(42.5), atom.Add(0.5), "Add didn't work.") + require.Equal(t, float64(42.0), atom.Sub(0.5), "Sub didn't work.") +} + +func TestValue(t *testing.T) { + var v Value + assert.Nil(t, v.Load(), "initial Value is not nil") + + v.Store(42) + assert.Equal(t, 42, v.Load()) + + v.Store(84) + assert.Equal(t, 84, v.Load()) + + assert.Panics(t, func() { v.Store("foo") }) +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/example_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/example_test.go new file mode 100644 index 0000000..806e11c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/example_test.go @@ -0,0 +1,43 @@ +// 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 +// 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. + +package atomic_test + +import ( + "fmt" + + "go.uber.org/atomic" +) + +func Example() { + // Uint32 is a thin wrapper around the primitive uint32 type. + var atom atomic.Uint32 + + // The wrapper ensures that all operations are atomic. + atom.Store(42) + fmt.Println(atom.Inc()) + fmt.Println(atom.CAS(43, 0)) + fmt.Println(atom.Load()) + + // Output: + // 43 + // true + // 0 +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/glide.lock b/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/glide.lock new file mode 100644 index 0000000..3c72c59 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/glide.lock @@ -0,0 +1,17 @@ +hash: f14d51408e3e0e4f73b34e4039484c78059cd7fc5f4996fdd73db20dc8d24f53 +updated: 2016-10-27T00:10:51.16960137-07:00 +imports: [] +testImports: +- name: github.com/davecgh/go-spew + version: 5215b55f46b2b919f50a1df0eaa5886afe4e3b3d + subpackages: + - spew +- name: github.com/pmezard/go-difflib + version: d8ed2627bdf02c080bf22230dbb337003b7aba2d + subpackages: + - difflib +- name: github.com/stretchr/testify + version: d77da356e56a7428ad25149ca77381849a6a5232 + subpackages: + - assert + - require diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/glide.yaml b/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/glide.yaml new file mode 100644 index 0000000..4cf608e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/glide.yaml @@ -0,0 +1,6 @@ +package: go.uber.org/atomic +testImport: +- package: github.com/stretchr/testify + subpackages: + - assert + - require diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/scripts/cover.sh b/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/scripts/cover.sh new file mode 100755 index 0000000..5dfb65e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/scripts/cover.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +set -e + +COVER=cover +ROOT_PKG=go.uber.org/atomic + +if [[ -d "$COVER" ]]; then + rm -rf "$COVER" +fi +mkdir -p "$COVER" + +i=0 +for pkg in "$@"; do + i=$((i + 1)) + + extracoverpkg="" + if [[ -f "$GOPATH/src/$pkg/.extra-coverpkg" ]]; then + extracoverpkg=$( \ + sed -e "s|^|$pkg/|g" < "$GOPATH/src/$pkg/.extra-coverpkg" \ + | tr '\n' ',') + fi + + coverpkg=$(go list -json "$pkg" | jq -r ' + .Deps + | map(select(startswith("'"$ROOT_PKG"'"))) + | map(select(contains("/vendor/") | not)) + | . + ["'"$pkg"'"] + | join(",") + ') + if [[ -n "$extracoverpkg" ]]; then + coverpkg="$extracoverpkg$coverpkg" + fi + + go test \ + -coverprofile "$COVER/cover.${i}.out" -coverpkg "$coverpkg" \ + -v "$pkg" +done + +gocovmerge "$COVER"/*.out > cover.out diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/scripts/test-ubergo.sh b/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/scripts/test-ubergo.sh new file mode 100755 index 0000000..9bc526d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/scripts/test-ubergo.sh @@ -0,0 +1,26 @@ +#!/bin/bash +set -euox pipefail +IFS=$'\n\t' + +# This script creates a fake GOPATH, symlinks in the current +# directory as uber-go/atomic and verifies that tests still pass. + +WORK_DIR=`mktemp -d` +function cleanup { + rm -rf "$WORK_DIR" +} +trap cleanup EXIT + + +export GOPATH="$WORK_DIR" +PKG_PARENT="$WORK_DIR/src/github.com/uber-go" +PKG_DIR="$PKG_PARENT/atomic" + +mkdir -p "$PKG_PARENT" +cp -R `pwd` "$PKG_DIR" +cd "$PKG_DIR" + +# The example imports go.uber.org, fix the import. +sed -e 's/go.uber.org\/atomic/github.com\/uber-go\/atomic/' -i="" example_test.go + +make test diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/stress_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/stress_test.go new file mode 100644 index 0000000..4cf1e16 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/stress_test.go @@ -0,0 +1,140 @@ +// 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 +// 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. + +package atomic + +import ( + "runtime" + "sync" + "testing" +) + +const ( + _parallelism = 4 + _iterations = 1000 +) + +func runStress(f func()) { + defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(_parallelism)) + + var wg sync.WaitGroup + wg.Add(_parallelism) + for i := 0; i < _parallelism; i++ { + go func() { + defer wg.Done() + for j := 0; j < _iterations; j++ { + f() + } + }() + } + + wg.Wait() +} + +func TestStressInt32(t *testing.T) { + var atom Int32 + runStress(func() { + atom.Load() + atom.Add(1) + atom.Sub(2) + atom.Inc() + atom.Dec() + atom.CAS(1, 0) + atom.Swap(5) + atom.Store(1) + }) +} + +func TestStressInt64(t *testing.T) { + var atom Int64 + runStress(func() { + atom.Load() + atom.Add(1) + atom.Sub(2) + atom.Inc() + atom.Dec() + atom.CAS(1, 0) + atom.Swap(5) + atom.Store(1) + + }) +} + +func TestStressUint32(t *testing.T) { + var atom Uint32 + runStress(func() { + atom.Load() + atom.Add(1) + atom.Sub(2) + atom.Inc() + atom.Dec() + atom.CAS(1, 0) + atom.Swap(5) + atom.Store(1) + }) +} + +func TestStressUint64(t *testing.T) { + var atom Uint64 + runStress(func() { + atom.Load() + atom.Add(1) + atom.Sub(2) + atom.Inc() + atom.Dec() + atom.CAS(1, 0) + atom.Swap(5) + atom.Store(1) + }) +} + +func TestStressFloat64(t *testing.T) { + var atom Float64 + runStress(func() { + atom.Load() + atom.CAS(1.0, 0.1) + atom.Add(1.1) + atom.Sub(0.2) + atom.Store(1.0) + }) +} + +func TestStressBool(t *testing.T) { + var atom Bool + runStress(func() { + atom.Load() + atom.Store(false) + atom.Swap(true) + atom.Load() + atom.Toggle() + atom.Toggle() + }) +} + +func TestStressString(t *testing.T) { + var atom String + runStress(func() { + atom.Load() + atom.Store("abc") + atom.Load() + atom.Store("def") + + }) +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/string.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/string.go new file mode 100644 index 0000000..acf0f5b --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/string.go @@ -0,0 +1,51 @@ +// 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 +// 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. + +package atomic + +import "sync/atomic" + +// String is an atomic type-safe wrapper around atomic.Value for strings. +type String struct{ v atomic.Value } + +// NewString creates a String. +func NewString(str string) *String { + s := &String{} + if str != "" { + s.Store(str) + } + return s +} + +// Load atomically loads the wrapped string. +func (s *String) Load() string { + v := s.v.Load() + if v == nil { + return "" + } + return v.(string) +} + +// Store atomically stores the passed string. +// Note: Converting the string to an interface{} to store in the atomic.Value +// requires an allocation. +func (s *String) Store(str string) { + s.v.Store(str) +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/string_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/string_test.go new file mode 100644 index 0000000..91b793e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/atomic/string_test.go @@ -0,0 +1,43 @@ +// 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 +// 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. + +package atomic + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestStringNoInitialValue(t *testing.T) { + atom := &String{} + require.Equal(t, "", atom.Load(), "Initial value should be blank string") +} + +func TestString(t *testing.T) { + atom := NewString("") + require.Equal(t, "", atom.Load(), "Expected Load to return initialized value") + + atom.Store("abc") + require.Equal(t, "abc", atom.Load(), "Unexpected value after Store") + + atom = NewString("bcd") + require.Equal(t, "bcd", atom.Load(), "Expected Load to return initialized value") +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/.codecov.yml b/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/.codecov.yml new file mode 100644 index 0000000..6d4d1be --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/.codecov.yml @@ -0,0 +1,15 @@ +coverage: + range: 80..100 + round: down + precision: 2 + + status: + project: # measuring the overall project coverage + default: # context, you can create multiple ones with custom titles + enabled: yes # must be yes|true to enable this status + target: 100 # specify the target coverage for each commit status + # option: "auto" (must increase from parent commit or pull request base) + # option: "X%" a static target percentage to hit + if_not_found: success # if parent is not found report status as success, error, or failure + if_ci_failed: error # if ci fails report status as success, error, or failure + diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/.gitignore b/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/.gitignore new file mode 100644 index 0000000..61ead86 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/.gitignore @@ -0,0 +1 @@ +/vendor diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/.travis.yml b/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/.travis.yml new file mode 100644 index 0000000..5ffa8fe --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/.travis.yml @@ -0,0 +1,33 @@ +sudo: false +language: go +go_import_path: go.uber.org/multierr + +env: + global: + - GO15VENDOREXPERIMENT=1 + +go: + - 1.7 + - 1.8 + - tip + +cache: + directories: + - vendor + +before_install: +- go version + +install: +- | + set -e + make install_ci + +script: +- | + set -e + make lint + make test_ci + +after_success: +- bash <(curl -s https://codecov.io/bash) diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/CHANGELOG.md b/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/CHANGELOG.md new file mode 100644 index 0000000..898445d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/CHANGELOG.md @@ -0,0 +1,28 @@ +Releases +======== + +v1.1.0 (2017-06-30) +=================== + +- Added an `Errors(error) []error` function to extract the underlying list of + errors for a multierr error. + + +v1.0.0 (2017-05-31) +=================== + +No changes since v0.2.0. This release is committing to making no breaking +changes to the current API in the 1.X series. + + +v0.2.0 (2017-04-11) +=================== + +- Repeatedly appending to the same error is now faster due to fewer + allocations. + + +v0.1.0 (2017-31-03) +=================== + +- Initial release diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/LICENSE.txt b/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/LICENSE.txt new file mode 100644 index 0000000..858e024 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/LICENSE.txt @@ -0,0 +1,19 @@ +Copyright (c) 2017 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. diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/Makefile b/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/Makefile new file mode 100644 index 0000000..a7437d0 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/Makefile @@ -0,0 +1,74 @@ +export GO15VENDOREXPERIMENT=1 + +PACKAGES := $(shell glide nv) + +GO_FILES := $(shell \ + find . '(' -path '*/.*' -o -path './vendor' ')' -prune \ + -o -name '*.go' -print | cut -b3-) + +.PHONY: install +install: + glide --version || go get github.com/Masterminds/glide + glide install + +.PHONY: build +build: + go build -i $(PACKAGES) + +.PHONY: test +test: + go test -cover -race $(PACKAGES) + +.PHONY: gofmt +gofmt: + $(eval FMT_LOG := $(shell mktemp -t gofmt.XXXXX)) + @gofmt -e -s -l $(GO_FILES) > $(FMT_LOG) || true + @[ ! -s "$(FMT_LOG)" ] || (echo "gofmt failed:" | cat - $(FMT_LOG) && false) + +.PHONY: govet +govet: + $(eval VET_LOG := $(shell mktemp -t govet.XXXXX)) + @go vet $(PACKAGES) 2>&1 \ + | grep -v '^exit status' > $(VET_LOG) || true + @[ ! -s "$(VET_LOG)" ] || (echo "govet failed:" | cat - $(VET_LOG) && false) + +.PHONY: golint +golint: + @go get github.com/golang/lint/golint + $(eval LINT_LOG := $(shell mktemp -t golint.XXXXX)) + @cat /dev/null > $(LINT_LOG) + @$(foreach pkg, $(PACKAGES), golint $(pkg) >> $(LINT_LOG) || true;) + @[ ! -s "$(LINT_LOG)" ] || (echo "golint failed:" | cat - $(LINT_LOG) && false) + +.PHONY: staticcheck +staticcheck: + @go get honnef.co/go/tools/cmd/staticcheck + $(eval STATICCHECK_LOG := $(shell mktemp -t staticcheck.XXXXX)) + @staticcheck $(PACKAGES) 2>&1 > $(STATICCHECK_LOG) || true + @[ ! -s "$(STATICCHECK_LOG)" ] || (echo "staticcheck failed:" | cat - $(STATICCHECK_LOG) && false) + +.PHONY: lint +lint: gofmt govet golint staticcheck + +.PHONY: cover +cover: + ./scripts/cover.sh $(shell go list $(PACKAGES)) + go tool cover -html=cover.out -o cover.html + +update-license: + @go get go.uber.org/tools/update-license + @update-license \ + $(shell go list -json $(PACKAGES) | \ + jq -r '.Dir + "/" + (.GoFiles | .[])') + +############################################################################## + +.PHONY: install_ci +install_ci: install + go get github.com/wadey/gocovmerge + go get github.com/mattn/goveralls + go get golang.org/x/tools/cmd/cover + +.PHONY: test_ci +test_ci: install_ci + ./scripts/cover.sh $(shell go list $(PACKAGES)) diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/README.md b/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/README.md new file mode 100644 index 0000000..065088f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/README.md @@ -0,0 +1,23 @@ +# multierr [![GoDoc][doc-img]][doc] [![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov] + +`multierr` allows combining one or more Go `error`s together. + +## Installation + + go get -u go.uber.org/multierr + +## Status + +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.org/uber-go/multierr.svg?branch=master +[cov-img]: https://codecov.io/gh/uber-go/multierr/branch/master/graph/badge.svg +[ci]: https://travis-ci.org/uber-go/multierr +[cov]: https://codecov.io/gh/uber-go/multierr diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/benchmarks_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/benchmarks_test.go new file mode 100644 index 0000000..797f5a0 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/benchmarks_test.go @@ -0,0 +1,62 @@ +// Copyright (c) 2017 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. + +package multierr + +import ( + "errors" + "fmt" + "testing" +) + +func BenchmarkAppend(b *testing.B) { + errorTypes := []struct { + name string + err error + }{ + { + name: "nil", + err: nil, + }, + { + name: "single error", + err: errors.New("test"), + }, + { + name: "multiple errors", + err: appendN(nil, errors.New("err"), 10), + }, + } + + for _, initial := range errorTypes { + for _, v := range errorTypes { + msg := fmt.Sprintf("append %v to %v", v.name, initial.name) + b.Run(msg, func(b *testing.B) { + for _, appends := range []int{1, 2, 10} { + b.Run(fmt.Sprint(appends), func(b *testing.B) { + for i := 0; i < b.N; i++ { + appendN(initial.err, v.err, appends) + } + }) + } + }) + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/error.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/error.go new file mode 100644 index 0000000..de6ce47 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/error.go @@ -0,0 +1,401 @@ +// Copyright (c) 2017 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. + +// Package multierr allows combining one or more errors together. +// +// Overview +// +// Errors can be combined with the use of the Combine function. +// +// multierr.Combine( +// reader.Close(), +// writer.Close(), +// conn.Close(), +// ) +// +// If only two errors are being combined, the Append function may be used +// instead. +// +// err = multierr.Combine(reader.Close(), writer.Close()) +// +// This makes it possible to record resource cleanup failures from deferred +// blocks with the help of named return values. +// +// func sendRequest(req Request) (err error) { +// conn, err := openConnection() +// if err != nil { +// return err +// } +// defer func() { +// err = multierr.Append(err, conn.Close()) +// }() +// // ... +// } +// +// 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:") +// } +// +// Advanced Usage +// +// Errors returned by Combine and Append MAY implement the following +// interface. +// +// type errorGroup interface { +// // Returns a slice containing the underlying list of errors. +// // +// // This slice MUST NOT be modified by the caller. +// Errors() []error +// } +// +// Note that if you need access to list of errors behind a multierr error, you +// should prefer using the Errors function. That said, if you need cheap +// read-only access to the underlying errors slice, you can attempt to cast +// the error to this interface. You MUST handle the failure case gracefully +// because errors returned by Combine and Append are not guaranteed to +// implement this interface. +// +// var errors []error +// group, ok := err.(errorGroup) +// if ok { +// errors = group.Errors() +// } else { +// errors = []error{err} +// } +package multierr // import "go.uber.org/multierr" + +import ( + "bytes" + "fmt" + "io" + "strings" + "sync" + + "go.uber.org/atomic" +) + +var ( + // Separator for single-line error messages. + _singlelineSeparator = []byte("; ") + + _newline = []byte("\n") + + // Prefix for multi-line messages + _multilinePrefix = []byte("the following errors occurred:") + + // Prefix for the first and following lines of an item in a list of + // multi-line error messages. + // + // For example, if a single item is: + // + // foo + // bar + // + // It will become, + // + // - foo + // bar + _multilineSeparator = []byte("\n - ") + _multilineIndent = []byte(" ") +) + +// _bufferPool is a pool of bytes.Buffers. +var _bufferPool = sync.Pool{ + New: func() interface{} { + return &bytes.Buffer{} + }, +} + +type errorGroup interface { + Errors() []error +} + +// Errors returns a slice containing zero or more errors that the supplied +// error is composed of. If the error is nil, the returned slice is empty. +// +// err := multierr.Append(r.Close(), w.Close()) +// errors := multierr.Errors(err) +// +// If the error is not composed of other errors, the returned slice contains +// just the error that was passed in. +// +// Callers of this function are free to modify the returned slice. +func Errors(err error) []error { + if err == nil { + return nil + } + + // Note that we're casting to multiError, not errorGroup. Our contract is + // that returned errors MAY implement errorGroup. Errors, however, only + // has special behavior for multierr-specific error objects. + // + // This behavior can be expanded in the future but I think it's prudent to + // start with as little as possible in terms of contract and possibility + // of misuse. + eg, ok := err.(*multiError) + if !ok { + return []error{err} + } + + errors := eg.Errors() + result := make([]error, len(errors)) + copy(result, errors) + return result +} + +// multiError is an error that holds one or more errors. +// +// An instance of this is guaranteed to be non-empty and flattened. That is, +// none of the errors inside multiError are other multiErrors. +// +// multiError formats to a semi-colon delimited list of error messages with +// %v and with a more readable multi-line format with %+v. +type multiError struct { + copyNeeded atomic.Bool + errors []error +} + +var _ errorGroup = (*multiError)(nil) + +// Errors returns the list of underlying errors. +// +// This slice MUST NOT be modified. +func (merr *multiError) Errors() []error { + if merr == nil { + return nil + } + return merr.errors +} + +func (merr *multiError) Error() string { + if merr == nil { + return "" + } + + buff := _bufferPool.Get().(*bytes.Buffer) + buff.Reset() + + merr.writeSingleline(buff) + + result := buff.String() + _bufferPool.Put(buff) + return result +} + +func (merr *multiError) Format(f fmt.State, c rune) { + if c == 'v' && f.Flag('+') { + merr.writeMultiline(f) + } else { + merr.writeSingleline(f) + } +} + +func (merr *multiError) writeSingleline(w io.Writer) { + first := true + for _, item := range merr.errors { + if first { + first = false + } else { + w.Write(_singlelineSeparator) + } + io.WriteString(w, item.Error()) + } +} + +func (merr *multiError) writeMultiline(w io.Writer) { + w.Write(_multilinePrefix) + for _, item := range merr.errors { + w.Write(_multilineSeparator) + writePrefixLine(w, _multilineIndent, fmt.Sprintf("%+v", item)) + } +} + +// Writes s to the writer with the given prefix added before each line after +// the first. +func writePrefixLine(w io.Writer, prefix []byte, s string) { + first := true + for len(s) > 0 { + if first { + first = false + } else { + w.Write(prefix) + } + + idx := strings.IndexByte(s, '\n') + if idx < 0 { + idx = len(s) - 1 + } + + io.WriteString(w, s[:idx+1]) + s = s[idx+1:] + } +} + +type inspectResult struct { + // Number of top-level non-nil errors + Count int + + // Total number of errors including multiErrors + Capacity int + + // Index of the first non-nil error in the list. Value is meaningless if + // Count is zero. + FirstErrorIdx int + + // Whether the list contains at least one multiError + ContainsMultiError bool +} + +// Inspects the given slice of errors so that we can efficiently allocate +// space for it. +func inspect(errors []error) (res inspectResult) { + first := true + for i, err := range errors { + if err == nil { + continue + } + + res.Count++ + if first { + first = false + res.FirstErrorIdx = i + } + + if merr, ok := err.(*multiError); ok { + res.Capacity += len(merr.errors) + res.ContainsMultiError = true + } else { + res.Capacity++ + } + } + return +} + +// fromSlice converts the given list of errors into a single error. +func fromSlice(errors []error) error { + res := inspect(errors) + switch res.Count { + case 0: + return nil + case 1: + // only one non-nil entry + return errors[res.FirstErrorIdx] + case len(errors): + if !res.ContainsMultiError { + // already flat + return &multiError{errors: errors} + } + } + + nonNilErrs := make([]error, 0, res.Capacity) + for _, err := range errors[res.FirstErrorIdx:] { + if err == nil { + continue + } + + if nested, ok := err.(*multiError); ok { + nonNilErrs = append(nonNilErrs, nested.errors...) + } else { + nonNilErrs = append(nonNilErrs, err) + } + } + + return &multiError{errors: nonNilErrs} +} + +// Combine combines the passed errors into a single error. +// +// If zero arguments were passed or if all items are nil, a nil error is +// returned. +// +// Combine(nil, nil) // == nil +// +// If only a single error was passed, it is returned as-is. +// +// Combine(err) // == err +// +// Combine skips over nil arguments so this function may be used to combine +// together errors from operations that fail independently of each other. +// +// multierr.Combine( +// reader.Close(), +// writer.Close(), +// pipe.Close(), +// ) +// +// If any of the passed errors is a multierr error, it will be flattened along +// with the other errors. +// +// multierr.Combine(multierr.Combine(err1, err2), err3) +// // is the same as +// multierr.Combine(err1, err2, err3) +// +// The returned error formats into a readable multi-line error message if +// formatted with %+v. +// +// fmt.Sprintf("%+v", multierr.Combine(err1, err2)) +func Combine(errors ...error) error { + return fromSlice(errors) +} + +// Append appends the given errors together. Either value may be nil. +// +// This function is a specialization of Combine for the common case where +// there are only two errors. +// +// err = multierr.Append(reader.Close(), writer.Close()) +// +// The following pattern may also be used to record failure of deferred +// operations without losing information about the original error. +// +// func doSomething(..) (err error) { +// f := acquireResource() +// defer func() { +// err = multierr.Append(err, f.Close()) +// }() +func Append(left error, right error) error { + switch { + case left == nil: + return right + case right == nil: + return left + } + + if _, ok := right.(*multiError); !ok { + if l, ok := left.(*multiError); ok && !l.copyNeeded.Swap(true) { + // Common case where the error on the left is constantly being + // appended to. + errs := append(l.errors, right) + return &multiError{errors: errs} + } else if !ok { + // Both errors are single errors. + return &multiError{errors: []error{left, right}} + } + } + + // Either right or both, left and right, are multiErrors. Rely on usual + // expensive logic. + errors := [2]error{left, right} + return fromSlice(errors[0:]) +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/error_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/error_test.go new file mode 100644 index 0000000..9384ff5 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/error_test.go @@ -0,0 +1,511 @@ +// Copyright (c) 2017 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. + +package multierr + +import ( + "errors" + "fmt" + "io" + "sync" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +// richFormatError is an error that prints a different output depending on +// whether %v or %+v was used. +type richFormatError struct{} + +func (r richFormatError) Error() string { + return fmt.Sprint(r) +} + +func (richFormatError) Format(f fmt.State, c rune) { + if c == 'v' && f.Flag('+') { + io.WriteString(f, "multiline\nmessage\nwith plus") + } else { + io.WriteString(f, "without plus") + } +} + +func appendN(initial, err error, n int) error { + errs := initial + for i := 0; i < n; i++ { + errs = Append(errs, err) + } + return errs +} + +func newMultiErr(errors ...error) error { + return &multiError{errors: errors} +} + +func TestCombine(t *testing.T) { + tests := []struct { + // Input + giveErrors []error + + // Resulting error + wantError error + + // %+v and %v string representations + wantMultiline string + wantSingleline string + }{ + { + giveErrors: nil, + wantError: nil, + }, + { + giveErrors: []error{}, + wantError: nil, + }, + { + giveErrors: []error{ + errors.New("foo"), + nil, + newMultiErr( + errors.New("bar"), + ), + nil, + }, + wantError: newMultiErr( + errors.New("foo"), + errors.New("bar"), + ), + wantMultiline: "the following errors occurred:\n" + + " - foo\n" + + " - bar", + wantSingleline: "foo; bar", + }, + { + giveErrors: []error{ + errors.New("foo"), + newMultiErr( + errors.New("bar"), + ), + }, + wantError: newMultiErr( + errors.New("foo"), + errors.New("bar"), + ), + wantMultiline: "the following errors occurred:\n" + + " - foo\n" + + " - bar", + wantSingleline: "foo; bar", + }, + { + giveErrors: []error{errors.New("great sadness")}, + wantError: errors.New("great sadness"), + wantMultiline: "great sadness", + wantSingleline: "great sadness", + }, + { + giveErrors: []error{ + errors.New("foo"), + errors.New("bar"), + }, + wantError: newMultiErr( + errors.New("foo"), + errors.New("bar"), + ), + wantMultiline: "the following errors occurred:\n" + + " - foo\n" + + " - bar", + wantSingleline: "foo; bar", + }, + { + giveErrors: []error{ + errors.New("great sadness"), + errors.New("multi\n line\nerror message"), + errors.New("single line error message"), + }, + wantError: newMultiErr( + errors.New("great sadness"), + errors.New("multi\n line\nerror message"), + errors.New("single line error message"), + ), + wantMultiline: "the following errors occurred:\n" + + " - great sadness\n" + + " - multi\n" + + " line\n" + + " error message\n" + + " - single line error message", + wantSingleline: "great sadness; " + + "multi\n line\nerror message; " + + "single line error message", + }, + { + giveErrors: []error{ + errors.New("foo"), + newMultiErr( + errors.New("bar"), + errors.New("baz"), + ), + errors.New("qux"), + }, + wantError: newMultiErr( + errors.New("foo"), + errors.New("bar"), + errors.New("baz"), + errors.New("qux"), + ), + wantMultiline: "the following errors occurred:\n" + + " - foo\n" + + " - bar\n" + + " - baz\n" + + " - qux", + wantSingleline: "foo; bar; baz; qux", + }, + { + giveErrors: []error{ + errors.New("foo"), + nil, + newMultiErr( + errors.New("bar"), + ), + nil, + }, + wantError: newMultiErr( + errors.New("foo"), + errors.New("bar"), + ), + wantMultiline: "the following errors occurred:\n" + + " - foo\n" + + " - bar", + wantSingleline: "foo; bar", + }, + { + giveErrors: []error{ + errors.New("foo"), + newMultiErr( + errors.New("bar"), + ), + }, + wantError: newMultiErr( + errors.New("foo"), + errors.New("bar"), + ), + wantMultiline: "the following errors occurred:\n" + + " - foo\n" + + " - bar", + wantSingleline: "foo; bar", + }, + { + giveErrors: []error{ + errors.New("foo"), + richFormatError{}, + errors.New("bar"), + }, + wantError: newMultiErr( + errors.New("foo"), + richFormatError{}, + errors.New("bar"), + ), + wantMultiline: "the following errors occurred:\n" + + " - foo\n" + + " - multiline\n" + + " message\n" + + " with plus\n" + + " - bar", + wantSingleline: "foo; without plus; bar", + }, + } + + for i, tt := range tests { + t.Run(fmt.Sprint(i), func(t *testing.T) { + err := Combine(tt.giveErrors...) + require.Equal(t, tt.wantError, err) + + if tt.wantMultiline != "" { + t.Run("Sprintf/multiline", func(t *testing.T) { + assert.Equal(t, tt.wantMultiline, fmt.Sprintf("%+v", err)) + }) + } + + if tt.wantSingleline != "" { + t.Run("Sprintf/singleline", func(t *testing.T) { + assert.Equal(t, tt.wantSingleline, fmt.Sprintf("%v", err)) + }) + + t.Run("Error()", func(t *testing.T) { + assert.Equal(t, tt.wantSingleline, err.Error()) + }) + + if s, ok := err.(fmt.Stringer); ok { + t.Run("String()", func(t *testing.T) { + assert.Equal(t, tt.wantSingleline, s.String()) + }) + } + } + }) + } +} + +func TestCombineDoesNotModifySlice(t *testing.T) { + errors := []error{ + errors.New("foo"), + nil, + errors.New("bar"), + } + + assert.NotNil(t, Combine(errors...)) + assert.Len(t, errors, 3) + assert.Nil(t, errors[1], 3) +} + +func TestAppend(t *testing.T) { + tests := []struct { + left error + right error + want error + }{ + { + left: nil, + right: nil, + want: nil, + }, + { + left: nil, + right: errors.New("great sadness"), + want: errors.New("great sadness"), + }, + { + left: errors.New("great sadness"), + right: nil, + want: errors.New("great sadness"), + }, + { + left: errors.New("foo"), + right: errors.New("bar"), + want: newMultiErr( + errors.New("foo"), + errors.New("bar"), + ), + }, + { + left: newMultiErr( + errors.New("foo"), + errors.New("bar"), + ), + right: errors.New("baz"), + want: newMultiErr( + errors.New("foo"), + errors.New("bar"), + errors.New("baz"), + ), + }, + { + left: errors.New("baz"), + right: newMultiErr( + errors.New("foo"), + errors.New("bar"), + ), + want: newMultiErr( + errors.New("baz"), + errors.New("foo"), + errors.New("bar"), + ), + }, + { + left: newMultiErr( + errors.New("foo"), + ), + right: newMultiErr( + errors.New("bar"), + ), + want: newMultiErr( + errors.New("foo"), + errors.New("bar"), + ), + }, + } + + for _, tt := range tests { + assert.Equal(t, tt.want, Append(tt.left, tt.right)) + } +} + +type notMultiErr struct{} + +var _ errorGroup = notMultiErr{} + +func (notMultiErr) Error() string { + return "great sadness" +} + +func (notMultiErr) Errors() []error { + return []error{errors.New("great sadness")} +} + +func TestErrors(t *testing.T) { + tests := []struct { + give error + want []error + + // Don't attempt to cast to errorGroup or *multiError + dontCast bool + }{ + {dontCast: true}, // nil + { + give: errors.New("hi"), + want: []error{errors.New("hi")}, + dontCast: true, + }, + { + // We don't yet support non-multierr errors. + give: notMultiErr{}, + want: []error{notMultiErr{}}, + dontCast: true, + }, + { + give: Combine( + errors.New("foo"), + errors.New("bar"), + ), + want: []error{ + errors.New("foo"), + errors.New("bar"), + }, + }, + { + give: Append( + errors.New("foo"), + errors.New("bar"), + ), + want: []error{ + errors.New("foo"), + errors.New("bar"), + }, + }, + { + give: Append( + errors.New("foo"), + Combine( + errors.New("bar"), + ), + ), + want: []error{ + errors.New("foo"), + errors.New("bar"), + }, + }, + { + give: Combine( + errors.New("foo"), + Append( + errors.New("bar"), + errors.New("baz"), + ), + errors.New("qux"), + ), + want: []error{ + errors.New("foo"), + errors.New("bar"), + errors.New("baz"), + errors.New("qux"), + }, + }, + } + + for i, tt := range tests { + t.Run(fmt.Sprint(i), func(t *testing.T) { + t.Run("Errors()", func(t *testing.T) { + require.Equal(t, tt.want, Errors(tt.give)) + }) + + if tt.dontCast { + return + } + + t.Run("multiError", func(t *testing.T) { + require.Equal(t, tt.want, tt.give.(*multiError).Errors()) + }) + + t.Run("errorGroup", func(t *testing.T) { + require.Equal(t, tt.want, tt.give.(errorGroup).Errors()) + }) + }) + } +} + +func createMultiErrWithCapacity() error { + // Create a multiError that has capacity for more errors so Append will + // modify the underlying array that may be shared. + return appendN(nil, errors.New("append"), 50) +} + +func TestAppendDoesNotModify(t *testing.T) { + initial := createMultiErrWithCapacity() + err1 := Append(initial, errors.New("err1")) + err2 := Append(initial, errors.New("err2")) + + // Make sure the error messages match, since we do modify the copyNeeded + // atomic, the values cannot be compared. + assert.EqualError(t, initial, createMultiErrWithCapacity().Error(), "Initial should not be modified") + + assert.EqualError(t, err1, Append(createMultiErrWithCapacity(), errors.New("err1")).Error()) + assert.EqualError(t, err2, Append(createMultiErrWithCapacity(), errors.New("err2")).Error()) +} + +func TestAppendRace(t *testing.T) { + initial := createMultiErrWithCapacity() + + var wg sync.WaitGroup + for i := 0; i < 10; i++ { + wg.Add(1) + go func() { + defer wg.Done() + + err := initial + for j := 0; j < 10; j++ { + err = Append(err, errors.New("err")) + } + }() + } + + wg.Wait() +} + +func TestErrorsSliceIsImmutable(t *testing.T) { + err1 := errors.New("err1") + err2 := errors.New("err2") + + err := Append(err1, err2) + gotErrors := Errors(err) + require.Equal(t, []error{err1, err2}, gotErrors, "errors must match") + + gotErrors[0] = nil + gotErrors[1] = errors.New("err3") + + require.Equal(t, []error{err1, err2}, Errors(err), + "errors must match after modification") +} + +func TestNilMultierror(t *testing.T) { + // For safety, all operations on multiError should be safe even if it is + // nil. + var err *multiError + + require.Empty(t, err.Error()) + require.Empty(t, err.Errors()) +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/example_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/example_test.go new file mode 100644 index 0000000..da4d914 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/example_test.go @@ -0,0 +1,72 @@ +// Copyright (c) 2017 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. + +package multierr_test + +import ( + "errors" + "fmt" + + "go.uber.org/multierr" +) + +func ExampleCombine() { + err := multierr.Combine( + errors.New("call 1 failed"), + nil, // successful request + errors.New("call 3 failed"), + nil, // successful request + errors.New("call 5 failed"), + ) + fmt.Printf("%+v", err) + // Output: + // the following errors occurred: + // - call 1 failed + // - call 3 failed + // - call 5 failed +} + +func ExampleAppend() { + var err error + err = multierr.Append(err, errors.New("call 1 failed")) + err = multierr.Append(err, errors.New("call 2 failed")) + fmt.Println(err) + // Output: + // call 1 failed; call 2 failed +} + +func ExampleErrors() { + err := multierr.Combine( + nil, // successful request + errors.New("call 2 failed"), + errors.New("call 3 failed"), + ) + err = multierr.Append(err, nil) // successful request + err = multierr.Append(err, errors.New("call 5 failed")) + + errors := multierr.Errors(err) + for _, err := range errors { + fmt.Println(err) + } + // Output: + // call 2 failed + // call 3 failed + // call 5 failed +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/glide.lock b/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/glide.lock new file mode 100644 index 0000000..f9ea94c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/glide.lock @@ -0,0 +1,19 @@ +hash: b53b5e9a84b9cb3cc4b2d0499e23da2feca1eec318ce9bb717ecf35bf24bf221 +updated: 2017-04-10T13:34:45.671678062-07:00 +imports: +- name: go.uber.org/atomic + version: 3b8db5e93c4c02efbc313e17b2e796b0914a01fb +testImports: +- name: github.com/davecgh/go-spew + version: 6d212800a42e8ab5c146b8ace3490ee17e5225f9 + subpackages: + - spew +- name: github.com/pmezard/go-difflib + version: d8ed2627bdf02c080bf22230dbb337003b7aba2d + subpackages: + - difflib +- name: github.com/stretchr/testify + version: 69483b4bd14f5845b5a1e55bca19e954e827f1d0 + subpackages: + - assert + - require diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/glide.yaml b/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/glide.yaml new file mode 100644 index 0000000..6ef084e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/glide.yaml @@ -0,0 +1,8 @@ +package: go.uber.org/multierr +import: +- package: go.uber.org/atomic + version: ^1 +testImport: +- package: github.com/stretchr/testify + subpackages: + - assert diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/scripts/cover.sh b/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/scripts/cover.sh new file mode 100755 index 0000000..e7f2b88 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/multierr/scripts/cover.sh @@ -0,0 +1,40 @@ +#!/bin/bash -e + +COVER=cover +ROOT_PKG=go.uber.org/multierr + +if [[ -d "$COVER" ]]; then + rm -rf "$COVER" +fi +mkdir -p "$COVER" + +i=0 +for pkg in "$@"; do + i=$((i + 1)) + + extracoverpkg="" + if [[ -f "$GOPATH/src/$pkg/.extra-coverpkg" ]]; then + extracoverpkg=$( \ + sed -e "s|^|$pkg/|g" < "$GOPATH/src/$pkg/.extra-coverpkg" \ + | tr '\n' ',') + fi + + coverpkg=$(go list -json "$pkg" | jq -r ' + .Deps + | . + ["'"$pkg"'"] + | map + ( select(startswith("'"$ROOT_PKG"'")) + | select(contains("/vendor/") | not) + ) + | join(",") + ') + if [[ -n "$extracoverpkg" ]]; then + coverpkg="$extracoverpkg$coverpkg" + fi + + go test \ + -coverprofile "$COVER/cover.${i}.out" -coverpkg "$coverpkg" \ + -v "$pkg" +done + +gocovmerge "$COVER"/*.out > cover.out diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/.codecov.yml b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/.codecov.yml new file mode 100644 index 0000000..8e5ca7d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/.codecov.yml @@ -0,0 +1,17 @@ +coverage: + range: 80..100 + round: down + precision: 2 + + status: + project: # measuring the overall project coverage + default: # context, you can create multiple ones with custom titles + enabled: yes # must be yes|true to enable this status + target: 95% # specify the target coverage for each commit status + # option: "auto" (must increase from parent commit or pull request base) + # option: "X%" a static target percentage to hit + if_not_found: success # if parent is not found report status as success, error, or failure + if_ci_failed: error # if ci fails report status as success, error, or failure +ignore: + - internal/readme/readme.go + diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/.gitignore b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/.gitignore new file mode 100644 index 0000000..08fbde6 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/.gitignore @@ -0,0 +1,28 @@ +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test +vendor + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe +*.test +*.prof +*.pprof +*.out +*.log diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/.readme.tmpl b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/.readme.tmpl new file mode 100644 index 0000000..550dcda --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/.readme.tmpl @@ -0,0 +1,108 @@ +# :zap: zap [![GoDoc][doc-img]][doc] [![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov] + +Blazing fast, structured, leveled logging in Go. + +## Installation + +`go get -u go.uber.org/zap` + +Note that zap only supports the two most recent minor versions of Go. + +## Quick Start + +In contexts where performance is nice, but not critical, use the +`SugaredLogger`. It's 4-10x faster than than other structured logging +packages and includes both structured and `printf`-style APIs. + +```go +logger, _ := zap.NewProduction() +defer logger.Sync() // flushes buffer, if any +sugar := logger.Sugar() +sugar.Infow("failed to fetch URL", + // Structured context as loosely typed key-value pairs. + "url", url, + "attempt", 3, + "backoff", time.Second, +) +sugar.Infof("Failed to fetch URL: %s", url) +``` + +When performance and type safety are critical, use the `Logger`. It's even +faster than the `SugaredLogger` and allocates far less, but it only supports +structured logging. + +```go +logger, _ := zap.NewProduction() +defer logger.Sync() +logger.Info("failed to fetch URL", + // Structured context as strongly typed Field values. + zap.String("url", url), + zap.Int("attempt", 3), + zap.Duration("backoff", time.Second), +) +``` + +See the [documentation][doc] and [FAQ](FAQ.md) for more details. + +## Performance + +For applications that log in the hot path, reflection-based serialization and +string formatting are prohibitively expensive — they're CPU-intensive +and make many small allocations. Put differently, using `encoding/json` and +`fmt.Fprintf` to log tons of `interface{}`s makes your application slow. + +Zap takes a different approach. It includes a reflection-free, zero-allocation +JSON encoder, and the base `Logger` strives to avoid serialization overhead +and allocations wherever possible. By building the high-level `SugaredLogger` +on that foundation, zap lets users *choose* when they need to count every +allocation and when they'd prefer a more familiar, loosely typed API. + +As measured by its own [benchmarking suite][], not only is zap more performant +than comparable structured logging packages — it's also faster than the +standard library. Like all benchmarks, take these with a grain of salt.[1](#footnote-versions) + +Log a message and 10 fields: + +{{.BenchmarkAddingFields}} + +Log a message with a logger that already has 10 fields of context: + +{{.BenchmarkAccumulatedContext}} + +Log a static string, without any context or `printf`-style templating: + +{{.BenchmarkWithoutFields}} + +## Development Status: Stable + +All APIs are finalized, and no breaking changes will be made in the 1.x series +of releases. Users of semver-aware dependency management systems should pin +zap to `^1`. + +## Contributing + +We encourage and support an active, healthy community of contributors — +including you! Details are in the [contribution guide](CONTRIBUTING.md) and +the [code of conduct](CODE_OF_CONDUCT.md). The zap maintainers keep an eye on +issues and pull requests, but you can also report any negative conduct to +oss-conduct@uber.com. That email list is a private, safe space; even the zap +maintainers don't have access, so don't hesitate to hold us to a high +standard. + +
+ +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) + +[doc-img]: https://godoc.org/go.uber.org/zap?status.svg +[doc]: https://godoc.org/go.uber.org/zap +[ci-img]: https://travis-ci.org/uber-go/zap.svg?branch=master +[ci]: https://travis-ci.org/uber-go/zap +[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 diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/.travis.yml b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/.travis.yml new file mode 100644 index 0000000..fc92e2f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/.travis.yml @@ -0,0 +1,23 @@ +language: go +sudo: false +go: + - 1.7 + - 1.8 + - 1.9 +go_import_path: go.uber.org/zap +env: + global: + - GO15VENDOREXPERIMENT=1 + - TEST_TIMEOUT_SCALE=10 +cache: + directories: + - vendor +install: + - make dependencies +script: + - make lint + - make test + - make bench +after_success: + - make cover + - bash <(curl -s https://codecov.io/bash) diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/CHANGELOG.md b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/CHANGELOG.md new file mode 100644 index 0000000..6a1609a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/CHANGELOG.md @@ -0,0 +1,270 @@ +# Changelog + +## v1.7.1 (25 Sep 2017) + +Bugfixes: +* [#504][]: Store strings when using AddByteString with the map encoder. + +## v1.7.0 (21 Sep 2017) + +Enhancements: + +* [#487][]: Add `NewStdLogAt`, which extends `NewStdLog` by allowing the user + to specify the level of the logged messages. + +## v1.6.0 (30 Aug 2017) + +Enhancements: + +* [#491][]: Omit zap stack frames from stacktraces. +* [#490][]: Add a `ContextMap` method to observer logs for simpler + field validation in tests. + +## v1.5.0 (22 Jul 2017) + +Enhancements: + +* [#460][] and [#470][]: Support errors produced by `go.uber.org/multierr`. +* [#465][]: Support user-supplied encoders for logger names. + +Bugfixes: + +* [#477][]: Fix a bug that incorrectly truncated deep stacktraces. + +Thanks to @richard-tunein and @pavius for their contributions to this release. + +## v1.4.1 (08 Jun 2017) + +This release fixes two bugs. + +Bugfixes: + +* [#435][]: Support a variety of case conventions when unmarshaling levels. +* [#444][]: Fix a panic in the observer. + +## v1.4.0 (12 May 2017) + +This release adds a few small features and is fully backward-compatible. + +Enhancements: + +* [#424][]: Add a `LineEnding` field to `EncoderConfig`, allowing users to + override the Unix-style default. +* [#425][]: Preserve time zones when logging times. +* [#431][]: Make `zap.AtomicLevel` implement `fmt.Stringer`, which makes a + variety of operations a bit simpler. + +## v1.3.0 (25 Apr 2017) + +This release adds an enhancement to zap's testing helpers as well as the +ability to marshal an AtomicLevel. It is fully backward-compatible. + +Enhancements: + +* [#415][]: Add a substring-filtering helper to zap's observer. This is + particularly useful when testing the `SugaredLogger`. +* [#416][]: Make `AtomicLevel` implement `encoding.TextMarshaler`. + +## v1.2.0 (13 Apr 2017) + +This release adds a gRPC compatibility wrapper. It is fully backward-compatible. + +Enhancements: + +* [#402][]: Add a `zapgrpc` package that wraps zap's Logger and implements + `grpclog.Logger`. + +## v1.1.0 (31 Mar 2017) + +This release fixes two bugs and adds some enhancements to zap's testing helpers. +It is fully backward-compatible. + +Bugfixes: + +* [#385][]: Fix caller path trimming on Windows. +* [#396][]: Fix a panic when attempting to use non-existent directories with + zap's configuration struct. + +Enhancements: + +* [#386][]: Add filtering helpers to zaptest's observing logger. + +Thanks to @moitias for contributing to this release. + +## v1.0.0 (14 Mar 2017) + +This is zap's first stable release. All exported APIs are now final, and no +further breaking changes will be made in the 1.x release series. Anyone using a +semver-aware dependency manager should now pin to `^1`. + +Breaking changes: + +* [#366][]: Add byte-oriented APIs to encoders to log UTF-8 encoded text without + casting from `[]byte` to `string`. +* [#364][]: To support buffering outputs, add `Sync` methods to `zapcore.Core`, + `zap.Logger`, and `zap.SugaredLogger`. +* [#371][]: Rename the `testutils` package to `zaptest`, which is less likely to + clash with other testing helpers. + +Bugfixes: + +* [#362][]: Make the ISO8601 time formatters fixed-width, which is friendlier + for tab-separated console output. +* [#369][]: Remove the automatic locks in `zapcore.NewCore`, which allows zap to + work with concurrency-safe `WriteSyncer` implementations. +* [#347][]: Stop reporting errors when trying to `fsync` standard out on Linux + systems. +* [#373][]: Report the correct caller from zap's standard library + interoperability wrappers. + +Enhancements: + +* [#348][]: Add a registry allowing third-party encodings to work with zap's + built-in `Config`. +* [#327][]: Make the representation of logger callers configurable (like times, + levels, and durations). +* [#376][]: Allow third-party encoders to use their own buffer pools, which + removes the last performance advantage that zap's encoders have over plugins. +* [#346][]: Add `CombineWriteSyncers`, a convenience function to tee multiple + `WriteSyncer`s and lock the result. +* [#365][]: Make zap's stacktraces compatible with mid-stack inlining (coming in + Go 1.9). +* [#372][]: Export zap's observing logger as `zaptest/observer`. This makes it + easier for particularly punctilious users to unit test their application's + logging. + +Thanks to @suyash, @htrendev, @flisky, @Ulexus, and @skipor for their +contributions to this release. + +## v1.0.0-rc.3 (7 Mar 2017) + +This is the third release candidate for zap's stable release. There are no +breaking changes. + +Bugfixes: + +* [#339][]: Byte slices passed to `zap.Any` are now correctly treated as binary blobs + rather than `[]uint8`. + +Enhancements: + +* [#307][]: Users can opt into colored output for log levels. +* [#353][]: In addition to hijacking the output of the standard library's + package-global logging functions, users can now construct a zap-backed + `log.Logger` instance. +* [#311][]: Frames from common runtime functions and some of zap's internal + machinery are now omitted from stacktraces. + +Thanks to @ansel1 and @suyash for their contributions to this release. + +## v1.0.0-rc.2 (21 Feb 2017) + +This is the second release candidate for zap's stable release. It includes two +breaking changes. + +Breaking changes: + +* [#316][]: Zap's global loggers are now fully concurrency-safe + (previously, users had to ensure that `ReplaceGlobals` was called before the + loggers were in use). However, they must now be accessed via the `L()` and + `S()` functions. Users can update their projects with + + ``` + gofmt -r "zap.L -> zap.L()" -w . + gofmt -r "zap.S -> zap.S()" -w . + ``` +* [#309][] and [#317][]: RC1 was mistakenly shipped with invalid + JSON and YAML struct tags on all config structs. This release fixes the tags + and adds static analysis to prevent similar bugs in the future. + +Bugfixes: + +* [#321][]: Redirecting the standard library's `log` output now + correctly reports the logger's caller. + +Enhancements: + +* [#325][] and [#333][]: Zap now transparently supports non-standard, rich + errors like those produced by `github.com/pkg/errors`. +* [#326][]: Though `New(nil)` continues to return a no-op logger, `NewNop()` is + now preferred. Users can update their projects with `gofmt -r 'zap.New(nil) -> + zap.NewNop()' -w .`. +* [#300][]: Incorrectly importing zap as `github.com/uber-go/zap` now returns a + more informative error. + +Thanks to @skipor and @chapsuk for their contributions to this release. + +## v1.0.0-rc.1 (14 Feb 2017) + +This is the first release candidate for zap's stable release. There are multiple +breaking changes and improvements from the pre-release version. Most notably: + +* **Zap's import path is now "go.uber.org/zap"** — all users will + need to update their code. +* User-facing types and functions remain in the `zap` package. Code relevant + largely to extension authors is now in the `zapcore` package. +* The `zapcore.Core` type makes it easy for third-party packages to use zap's + internals but provide a different user-facing API. +* `Logger` is now a concrete type instead of an interface. +* A less verbose (though slower) logging API is included by default. +* Package-global loggers `L` and `S` are included. +* A human-friendly console encoder is included. +* A declarative config struct allows common logger configurations to be managed + as configuration instead of code. +* Sampling is more accurate, and doesn't depend on the standard library's shared + timer heap. + +## v0.1.0-beta.1 (6 Feb 2017) + +This is a minor version, tagged to allow users to pin to the pre-1.0 APIs and +upgrade at their leisure. Since this is the first tagged release, there are no +backward compatibility concerns and all functionality is new. + +Early zap adopters should pin to the 0.1.x minor version until they're ready to +upgrade to the upcoming stable release. + +[#316]: https://github.com/uber-go/zap/pull/316 +[#309]: https://github.com/uber-go/zap/pull/309 +[#317]: https://github.com/uber-go/zap/pull/317 +[#321]: https://github.com/uber-go/zap/pull/321 +[#325]: https://github.com/uber-go/zap/pull/325 +[#333]: https://github.com/uber-go/zap/pull/333 +[#326]: https://github.com/uber-go/zap/pull/326 +[#300]: https://github.com/uber-go/zap/pull/300 +[#339]: https://github.com/uber-go/zap/pull/339 +[#307]: https://github.com/uber-go/zap/pull/307 +[#353]: https://github.com/uber-go/zap/pull/353 +[#311]: https://github.com/uber-go/zap/pull/311 +[#366]: https://github.com/uber-go/zap/pull/366 +[#364]: https://github.com/uber-go/zap/pull/364 +[#371]: https://github.com/uber-go/zap/pull/371 +[#362]: https://github.com/uber-go/zap/pull/362 +[#369]: https://github.com/uber-go/zap/pull/369 +[#347]: https://github.com/uber-go/zap/pull/347 +[#373]: https://github.com/uber-go/zap/pull/373 +[#348]: https://github.com/uber-go/zap/pull/348 +[#327]: https://github.com/uber-go/zap/pull/327 +[#376]: https://github.com/uber-go/zap/pull/376 +[#346]: https://github.com/uber-go/zap/pull/346 +[#365]: https://github.com/uber-go/zap/pull/365 +[#372]: https://github.com/uber-go/zap/pull/372 +[#385]: https://github.com/uber-go/zap/pull/385 +[#396]: https://github.com/uber-go/zap/pull/396 +[#386]: https://github.com/uber-go/zap/pull/386 +[#402]: https://github.com/uber-go/zap/pull/402 +[#415]: https://github.com/uber-go/zap/pull/415 +[#416]: https://github.com/uber-go/zap/pull/416 +[#424]: https://github.com/uber-go/zap/pull/424 +[#425]: https://github.com/uber-go/zap/pull/425 +[#431]: https://github.com/uber-go/zap/pull/431 +[#435]: https://github.com/uber-go/zap/pull/435 +[#444]: https://github.com/uber-go/zap/pull/444 +[#477]: https://github.com/uber-go/zap/pull/477 +[#465]: https://github.com/uber-go/zap/pull/465 +[#460]: https://github.com/uber-go/zap/pull/460 +[#470]: https://github.com/uber-go/zap/pull/470 +[#487]: https://github.com/uber-go/zap/pull/487 +[#490]: https://github.com/uber-go/zap/pull/490 +[#491]: https://github.com/uber-go/zap/pull/491 +[#491]: https://github.com/uber-go/zap/pull/439 +[#504]: https://github.com/uber-go/zap/pull/504 diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/CODE_OF_CONDUCT.md b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..e327d9a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/CODE_OF_CONDUCT.md @@ -0,0 +1,75 @@ +# 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, 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 oss-conduct@uber.com. The project +team will review and investigate all complaints, and will respond in a way +that it deems 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 +[http://contributor-covenant.org/version/1/4][version]. + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/CONTRIBUTING.md b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/CONTRIBUTING.md new file mode 100644 index 0000000..9454bba --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/CONTRIBUTING.md @@ -0,0 +1,81 @@ +# Contributing + +We'd love your help making zap the very best structured logging library in Go! + +If you'd like to add new exported APIs, please [open an issue][open-issue] +describing your proposal — discussing API changes ahead of time makes +pull request review much smoother. In your issue, pull request, and any other +communications, please remember to treat your fellow contributors with +respect! We take our [code of conduct](CODE_OF_CONDUCT.md) seriously. + +Note that you'll need to sign [Uber's Contributor License Agreement][cla] +before we can accept any of your contributions. If necessary, a bot will remind +you to accept the CLA when you open your pull request. + +## Setup + +[Fork][fork], then clone the repository: + +``` +mkdir -p $GOPATH/src/go.uber.org +cd $GOPATH/src/go.uber.org +git clone git@github.com:your_github_username/zap.git +cd zap +git remote add upstream https://github.com/uber-go/zap.git +git fetch upstream +``` + +Install zap's dependencies: + +``` +make dependencies +``` + +Make sure that the tests and the linters pass: + +``` +make test +make lint +``` + +If you're not using the minor version of Go specified in the Makefile's +`LINTABLE_MINOR_VERSIONS` variable, `make lint` doesn't do anything. This is +fine, but it means that you'll only discover lint failures after you open your +pull request. + +## Making Changes + +Start by creating a new branch for your changes: + +``` +cd $GOPATH/src/go.uber.org/zap +git checkout master +git fetch upstream +git rebase upstream/master +git checkout -b cool_new_feature +``` + +Make your changes, then ensure that `make lint` and `make test` still pass. If +you're satisfied with your changes, push them to your fork. + +``` +git push origin cool_new_feature +``` + +Then use the GitHub UI to open a pull request. + +At this point, you're waiting on us to review your changes. We *try* to respond +to issues and pull requests within a few business days, and we may suggest some +improvements or alternatives. Once your changes are approved, one of the +project maintainers will merge them. + +We're much more likely to approve your changes if you: + +* Add tests for new functionality. +* Write a [good commit message][commit-message]. +* Maintain backward compatibility. + +[fork]: https://github.com/uber-go/zap/fork +[open-issue]: https://github.com/uber-go/zap/issues/new +[cla]: https://cla-assistant.io/uber-go/zap +[commit-message]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/FAQ.md b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/FAQ.md new file mode 100644 index 0000000..96e1012 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/FAQ.md @@ -0,0 +1,140 @@ +# Frequently Asked Questions + +## Design + +### Why spend so much effort on logger performance? + +Of course, most applications won't notice the impact of a slow logger: they +already take tens or hundreds of milliseconds for each operation, so an extra +millisecond doesn't matter. + +On the other hand, why *not* make structured logging fast? The `SugaredLogger` +isn't any harder to use than other logging packages, and the `Logger` makes +structured logging possible in performance-sensitive contexts. Across a fleet +of Go microservices, making each application even slightly more efficient adds +up quickly. + +### Why aren't `Logger` and `SugaredLogger` interfaces? + +Unlike the familiar `io.Writer` and `http.Handler`, `Logger` and +`SugaredLogger` interfaces would include *many* methods. As [Rob Pike points +out][go-proverbs], "The bigger the interface, the weaker the abstraction." +Interfaces are also rigid — *any* change requires releasing a new major +version, since it breaks all third-party implementations. + +Making the `Logger` and `SugaredLogger` concrete types doesn't sacrifice much +abstraction, and it lets us add methods without introducing breaking changes. +Your applications should define and depend upon an interface that includes +just the methods you use. + +### Why sample application logs? + +Applications often experience runs of errors, either because of a bug or +because of a misbehaving user. Logging errors is usually a good idea, but it +can easily make this bad situation worse: not only is your application coping +with a flood of errors, it's also spending extra CPU cycles and I/O logging +those errors. Since writes are typically serialized, logging limits throughput +when you need it most. + +Sampling fixes this problem by dropping repetitive log entries. Under normal +conditions, your application writes out every entry. When similar entries are +logged hundreds or thousands of times each second, though, zap begins dropping +duplicates to preserve throughput. + +### Why do the structured logging APIs take a message in addition to fields? + +Subjectively, we find it helpful to accompany structured context with a brief +description. This isn't critical during development, but it makes debugging +and operating unfamiliar systems much easier. + +More concretely, zap's sampling algorithm uses the message to identify +duplicate entries. In our experience, this is a practical middle ground +between random sampling (which often drops the exact entry that you need while +debugging) and hashing the complete entry (which is prohibitively expensive). + +### Why include package-global loggers? + +Since so many other logging packages include a global logger, many +applications aren't designed to accept loggers as explicit parameters. +Changing function signatures is often a breaking change, so zap includes +global loggers to simplify migration. + +Avoid them where possible. + +### Why include dedicated Panic and Fatal log levels? + +In general, application code should handle errors gracefully instead of using +`panic` or `os.Exit`. However, every rule has exceptions, and it's common to +crash when an error is truly unrecoverable. To avoid losing any information +— especially the reason for the crash — the logger must flush any +buffered entries before the process exits. + +Zap makes this easy by offering `Panic` and `Fatal` logging methods that +automatically flush before exiting. Of course, this doesn't guarantee that +logs will never be lost, but it eliminates a common error. + +See the discussion in uber-go/zap#207 for more details. + +### What's `DPanic`? + +`DPanic` stands for "panic in development." In development, it logs at +`PanicLevel`; otherwise, it logs at `ErrorLevel`. `DPanic` makes it easier to +catch errors that are theoretically possible, but shouldn't actually happen, +*without* crashing in production. + +If you've ever written code like this, you need `DPanic`: + +```go +if err != nil { + panic(fmt.Sprintf("shouldn't ever get here: %v", err)) +} +``` + +## Installation + +### What does the error `expects import "go.uber.org/zap"` mean? + +Either zap was installed incorrectly or you're referencing the wrong package +name in your code. + +Zap's source code happens to be hosted on GitHub, but the [import +path][import-path] is `go.uber.org/zap`. This gives us, the project +maintainers, the freedom to move the source code if necessary. However, it +means that you need to take a little care when installing and using the +package. + +If you follow two simple rules, everything should work: install zap with `go +get -u go.uber.org/zap`, and always import it in your code with `import +"go.uber.org/zap"`. Your code shouldn't contain *any* references to +`github.com/uber-go/zap`. + +## Usage + +### Does zap support log rotation? + +Zap doesn't natively support rotating log files, since we prefer to leave this +to an external program like `logrotate`. + +However, it's easy to integrate a log rotation package like +[`gopkg.in/natefinch/lumberjack.v2`][lumberjack] as a `zapcore.WriteSyncer`. + +```go +// lumberjack.Logger is already safe for concurrent use, so we don't need to +// lock it. +w := zapcore.AddSync(&lumberjack.Logger{ + Filename: "/var/log/myapp/foo.log", + MaxSize: 500, // megabytes + MaxBackups: 3, + MaxAge: 28, // days +}) +core := zapcore.NewCore( + zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()), + w, + zap.InfoLevel, +) +logger := zap.New(core) +``` + +[go-proverbs]: https://go-proverbs.github.io/ +[import-path]: https://golang.org/cmd/go/#hdr-Remote_import_paths +[lumberjack]: https://godoc.org/gopkg.in/natefinch/lumberjack.v2 diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/LICENSE.txt b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/LICENSE.txt new file mode 100644 index 0000000..6652bed --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/LICENSE.txt @@ -0,0 +1,19 @@ +Copyright (c) 2016-2017 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. diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/Makefile b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/Makefile new file mode 100644 index 0000000..8706cd1 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/Makefile @@ -0,0 +1,76 @@ +export GO15VENDOREXPERIMENT=1 + +BENCH_FLAGS ?= -cpuprofile=cpu.pprof -memprofile=mem.pprof -benchmem +PKGS ?= $(shell glide novendor) +# Many Go tools take file globs or directories as arguments instead of packages. +PKG_FILES ?= *.go zapcore benchmarks buffer zapgrpc zaptest zaptest/observer internal/bufferpool internal/exit internal/color + +# The linting tools evolve with each Go version, so run them only on the latest +# stable release. +GO_VERSION := $(shell go version | cut -d " " -f 3) +GO_MINOR_VERSION := $(word 2,$(subst ., ,$(GO_VERSION))) +LINTABLE_MINOR_VERSIONS := 8 +ifneq ($(filter $(LINTABLE_MINOR_VERSIONS),$(GO_MINOR_VERSION)),) +SHOULD_LINT := true +endif + + +.PHONY: all +all: lint test + +.PHONY: dependencies +dependencies: + @echo "Installing Glide and locked dependencies..." + glide --version || go get -u -f github.com/Masterminds/glide + glide install + @echo "Installing test dependencies..." + go install ./vendor/github.com/axw/gocov/gocov + go install ./vendor/github.com/mattn/goveralls +ifdef SHOULD_LINT + @echo "Installing golint..." + go install ./vendor/github.com/golang/lint/golint +else + @echo "Not installing golint, since we don't expect to lint on" $(GO_VERSION) +endif + +# Disable printf-like invocation checking due to testify.assert.Error() +VET_RULES := -printf=false + +.PHONY: lint +lint: +ifdef SHOULD_LINT + @rm -rf lint.log + @echo "Checking formatting..." + @gofmt -d -s $(PKG_FILES) 2>&1 | tee lint.log + @echo "Installing test dependencies for vet..." + @go test -i $(PKGS) + @echo "Checking vet..." + @$(foreach dir,$(PKG_FILES),go tool vet $(VET_RULES) $(dir) 2>&1 | tee -a lint.log;) + @echo "Checking lint..." + @$(foreach dir,$(PKGS),golint $(dir) 2>&1 | tee -a lint.log;) + @echo "Checking for unresolved FIXMEs..." + @git grep -i fixme | grep -v -e vendor -e Makefile | tee -a lint.log + @echo "Checking for license headers..." + @./check_license.sh | tee -a lint.log + @[ ! -s lint.log ] +else + @echo "Skipping linters on" $(GO_VERSION) +endif + +.PHONY: test +test: + go test -race $(PKGS) + +.PHONY: cover +cover: + ./scripts/cover.sh $(PKGS) + +.PHONY: bench +BENCH ?= . +bench: + @$(foreach pkg,$(PKGS),go test -bench=$(BENCH) -run="^$$" $(BENCH_FLAGS) $(pkg);) + +.PHONY: updatereadme +updatereadme: + rm -f README.md + cat .readme.tmpl | go run internal/readme/readme.go > README.md diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/README.md b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/README.md new file mode 100644 index 0000000..4b2bb9d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/README.md @@ -0,0 +1,136 @@ +# :zap: zap [![GoDoc][doc-img]][doc] [![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov] + +Blazing fast, structured, leveled logging in Go. + +## Installation + +`go get -u go.uber.org/zap` + +Note that zap only supports the two most recent minor versions of Go. + +## Quick Start + +In contexts where performance is nice, but not critical, use the +`SugaredLogger`. It's 4-10x faster than than other structured logging +packages and includes both structured and `printf`-style APIs. + +```go +logger, _ := zap.NewProduction() +defer logger.Sync() // flushes buffer, if any +sugar := logger.Sugar() +sugar.Infow("failed to fetch URL", + // Structured context as loosely typed key-value pairs. + "url", url, + "attempt", 3, + "backoff", time.Second, +) +sugar.Infof("Failed to fetch URL: %s", url) +``` + +When performance and type safety are critical, use the `Logger`. It's even +faster than the `SugaredLogger` and allocates far less, but it only supports +structured logging. + +```go +logger, _ := zap.NewProduction() +defer logger.Sync() +logger.Info("failed to fetch URL", + // Structured context as strongly typed Field values. + zap.String("url", url), + zap.Int("attempt", 3), + zap.Duration("backoff", time.Second), +) +``` + +See the [documentation][doc] and [FAQ](FAQ.md) for more details. + +## Performance + +For applications that log in the hot path, reflection-based serialization and +string formatting are prohibitively expensive — they're CPU-intensive +and make many small allocations. Put differently, using `encoding/json` and +`fmt.Fprintf` to log tons of `interface{}`s makes your application slow. + +Zap takes a different approach. It includes a reflection-free, zero-allocation +JSON encoder, and the base `Logger` strives to avoid serialization overhead +and allocations wherever possible. By building the high-level `SugaredLogger` +on that foundation, zap lets users *choose* when they need to count every +allocation and when they'd prefer a more familiar, loosely typed API. + +As measured by its own [benchmarking suite][], not only is zap more performant +than comparable structured logging packages — it's also faster than the +standard library. Like all benchmarks, take these with a grain of salt.[1](#footnote-versions) + +Log a message and 10 fields: + +| Package | Time | Objects Allocated | +| :--- | :---: | :---: | +| :zap: zap | 3131 ns/op | 5 allocs/op | +| :zap: zap (sugared) | 4173 ns/op | 21 allocs/op | +| zerolog | 16154 ns/op | 90 allocs/op | +| lion | 16341 ns/op | 111 allocs/op | +| go-kit | 17049 ns/op | 126 allocs/op | +| logrus | 23662 ns/op | 142 allocs/op | +| log15 | 36351 ns/op | 149 allocs/op | +| apex/log | 42530 ns/op | 126 allocs/op | + +Log a message with a logger that already has 10 fields of context: + +| Package | Time | Objects Allocated | +| :--- | :---: | :---: | +| :zap: zap | 380 ns/op | 0 allocs/op | +| :zap: zap (sugared) | 564 ns/op | 2 allocs/op | +| zerolog | 321 ns/op | 0 allocs/op | +| lion | 7092 ns/op | 39 allocs/op | +| go-kit | 20226 ns/op | 115 allocs/op | +| logrus | 22312 ns/op | 130 allocs/op | +| log15 | 28788 ns/op | 79 allocs/op | +| apex/log | 42063 ns/op | 115 allocs/op | + +Log a static string, without any context or `printf`-style templating: + +| Package | Time | Objects Allocated | +| :--- | :---: | :---: | +| :zap: zap | 361 ns/op | 0 allocs/op | +| :zap: zap (sugared) | 534 ns/op | 2 allocs/op | +| zerolog | 323 ns/op | 0 allocs/op | +| standard library | 575 ns/op | 2 allocs/op | +| go-kit | 922 ns/op | 13 allocs/op | +| lion | 1413 ns/op | 10 allocs/op | +| logrus | 2291 ns/op | 27 allocs/op | +| apex/log | 3690 ns/op | 11 allocs/op | +| log15 | 5954 ns/op | 26 allocs/op | + +## Development Status: Stable + +All APIs are finalized, and no breaking changes will be made in the 1.x series +of releases. Users of semver-aware dependency management systems should pin +zap to `^1`. + +## Contributing + +We encourage and support an active, healthy community of contributors — +including you! Details are in the [contribution guide](CONTRIBUTING.md) and +the [code of conduct](CODE_OF_CONDUCT.md). The zap maintainers keep an eye on +issues and pull requests, but you can also report any negative conduct to +oss-conduct@uber.com. That email list is a private, safe space; even the zap +maintainers don't have access, so don't hesitate to hold us to a high +standard. + +
+ +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) + +[doc-img]: https://godoc.org/go.uber.org/zap?status.svg +[doc]: https://godoc.org/go.uber.org/zap +[ci-img]: https://travis-ci.org/uber-go/zap.svg?branch=master +[ci]: https://travis-ci.org/uber-go/zap +[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 diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/array.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/array.go new file mode 100644 index 0000000..3d4d49f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/array.go @@ -0,0 +1,320 @@ +// 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 +// 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. + +package zap + +import ( + "time" + + "go.uber.org/zap/zapcore" +) + +// Array constructs a field with the given key and ArrayMarshaler. It provides +// a flexible, but still type-safe and efficient, way to add array-like types +// to the logging context. The struct's MarshalLogArray method is called lazily. +func Array(key string, val zapcore.ArrayMarshaler) zapcore.Field { + return zapcore.Field{Key: key, Type: zapcore.ArrayMarshalerType, Interface: val} +} + +// Bools constructs a field that carries a slice of bools. +func Bools(key string, bs []bool) zapcore.Field { + return Array(key, bools(bs)) +} + +// ByteStrings constructs a field that carries a slice of []byte, each of which +// must be UTF-8 encoded text. +func ByteStrings(key string, bss [][]byte) zapcore.Field { + return Array(key, byteStringsArray(bss)) +} + +// Complex128s constructs a field that carries a slice of complex numbers. +func Complex128s(key string, nums []complex128) zapcore.Field { + return Array(key, complex128s(nums)) +} + +// Complex64s constructs a field that carries a slice of complex numbers. +func Complex64s(key string, nums []complex64) zapcore.Field { + return Array(key, complex64s(nums)) +} + +// Durations constructs a field that carries a slice of time.Durations. +func Durations(key string, ds []time.Duration) zapcore.Field { + return Array(key, durations(ds)) +} + +// Float64s constructs a field that carries a slice of floats. +func Float64s(key string, nums []float64) zapcore.Field { + return Array(key, float64s(nums)) +} + +// Float32s constructs a field that carries a slice of floats. +func Float32s(key string, nums []float32) zapcore.Field { + return Array(key, float32s(nums)) +} + +// Ints constructs a field that carries a slice of integers. +func Ints(key string, nums []int) zapcore.Field { + return Array(key, ints(nums)) +} + +// Int64s constructs a field that carries a slice of integers. +func Int64s(key string, nums []int64) zapcore.Field { + return Array(key, int64s(nums)) +} + +// Int32s constructs a field that carries a slice of integers. +func Int32s(key string, nums []int32) zapcore.Field { + return Array(key, int32s(nums)) +} + +// Int16s constructs a field that carries a slice of integers. +func Int16s(key string, nums []int16) zapcore.Field { + return Array(key, int16s(nums)) +} + +// Int8s constructs a field that carries a slice of integers. +func Int8s(key string, nums []int8) zapcore.Field { + return Array(key, int8s(nums)) +} + +// Strings constructs a field that carries a slice of strings. +func Strings(key string, ss []string) zapcore.Field { + return Array(key, stringArray(ss)) +} + +// Times constructs a field that carries a slice of time.Times. +func Times(key string, ts []time.Time) zapcore.Field { + return Array(key, times(ts)) +} + +// Uints constructs a field that carries a slice of unsigned integers. +func Uints(key string, nums []uint) zapcore.Field { + return Array(key, uints(nums)) +} + +// Uint64s constructs a field that carries a slice of unsigned integers. +func Uint64s(key string, nums []uint64) zapcore.Field { + return Array(key, uint64s(nums)) +} + +// Uint32s constructs a field that carries a slice of unsigned integers. +func Uint32s(key string, nums []uint32) zapcore.Field { + return Array(key, uint32s(nums)) +} + +// Uint16s constructs a field that carries a slice of unsigned integers. +func Uint16s(key string, nums []uint16) zapcore.Field { + return Array(key, uint16s(nums)) +} + +// Uint8s constructs a field that carries a slice of unsigned integers. +func Uint8s(key string, nums []uint8) zapcore.Field { + return Array(key, uint8s(nums)) +} + +// Uintptrs constructs a field that carries a slice of pointer addresses. +func Uintptrs(key string, us []uintptr) zapcore.Field { + return Array(key, uintptrs(us)) +} + +// Errors constructs a field that carries a slice of errors. +func Errors(key string, errs []error) zapcore.Field { + return Array(key, errArray(errs)) +} + +type bools []bool + +func (bs bools) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range bs { + arr.AppendBool(bs[i]) + } + return nil +} + +type byteStringsArray [][]byte + +func (bss byteStringsArray) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range bss { + arr.AppendByteString(bss[i]) + } + return nil +} + +type complex128s []complex128 + +func (nums complex128s) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendComplex128(nums[i]) + } + return nil +} + +type complex64s []complex64 + +func (nums complex64s) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendComplex64(nums[i]) + } + return nil +} + +type durations []time.Duration + +func (ds durations) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range ds { + arr.AppendDuration(ds[i]) + } + return nil +} + +type float64s []float64 + +func (nums float64s) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendFloat64(nums[i]) + } + return nil +} + +type float32s []float32 + +func (nums float32s) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendFloat32(nums[i]) + } + return nil +} + +type ints []int + +func (nums ints) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendInt(nums[i]) + } + return nil +} + +type int64s []int64 + +func (nums int64s) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendInt64(nums[i]) + } + return nil +} + +type int32s []int32 + +func (nums int32s) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendInt32(nums[i]) + } + return nil +} + +type int16s []int16 + +func (nums int16s) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendInt16(nums[i]) + } + return nil +} + +type int8s []int8 + +func (nums int8s) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendInt8(nums[i]) + } + return nil +} + +type stringArray []string + +func (ss stringArray) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range ss { + arr.AppendString(ss[i]) + } + return nil +} + +type times []time.Time + +func (ts times) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range ts { + arr.AppendTime(ts[i]) + } + return nil +} + +type uints []uint + +func (nums uints) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendUint(nums[i]) + } + return nil +} + +type uint64s []uint64 + +func (nums uint64s) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendUint64(nums[i]) + } + return nil +} + +type uint32s []uint32 + +func (nums uint32s) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendUint32(nums[i]) + } + return nil +} + +type uint16s []uint16 + +func (nums uint16s) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendUint16(nums[i]) + } + return nil +} + +type uint8s []uint8 + +func (nums uint8s) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendUint8(nums[i]) + } + return nil +} + +type uintptrs []uintptr + +func (nums uintptrs) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendUintptr(nums[i]) + } + return nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/array_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/array_test.go new file mode 100644 index 0000000..df84d92 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/array_test.go @@ -0,0 +1,107 @@ +// 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 +// 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. + +package zap + +import ( + "testing" + "time" + + "go.uber.org/zap/zapcore" + + "github.com/stretchr/testify/assert" +) + +func BenchmarkBoolsArrayMarshaler(b *testing.B) { + // Keep this benchmark here to capture the overhead of the ArrayMarshaler + // wrapper. + bs := make([]bool, 50) + enc := zapcore.NewJSONEncoder(zapcore.EncoderConfig{}) + b.ResetTimer() + for i := 0; i < b.N; i++ { + Bools("array", bs).AddTo(enc.Clone()) + } +} + +func BenchmarkBoolsReflect(b *testing.B) { + bs := make([]bool, 50) + enc := zapcore.NewJSONEncoder(zapcore.EncoderConfig{}) + b.ResetTimer() + for i := 0; i < b.N; i++ { + Reflect("array", bs).AddTo(enc.Clone()) + } +} + +func TestArrayWrappers(t *testing.T) { + tests := []struct { + desc string + field zapcore.Field + expected []interface{} + }{ + {"empty bools", Bools("", []bool{}), []interface{}(nil)}, + {"empty byte strings", ByteStrings("", [][]byte{}), []interface{}(nil)}, + {"empty complex128s", Complex128s("", []complex128{}), []interface{}(nil)}, + {"empty complex64s", Complex64s("", []complex64{}), []interface{}(nil)}, + {"empty durations", Durations("", []time.Duration{}), []interface{}(nil)}, + {"empty float64s", Float64s("", []float64{}), []interface{}(nil)}, + {"empty float32s", Float32s("", []float32{}), []interface{}(nil)}, + {"empty ints", Ints("", []int{}), []interface{}(nil)}, + {"empty int64s", Int64s("", []int64{}), []interface{}(nil)}, + {"empty int32s", Int32s("", []int32{}), []interface{}(nil)}, + {"empty int16s", Int16s("", []int16{}), []interface{}(nil)}, + {"empty int8s", Int8s("", []int8{}), []interface{}(nil)}, + {"empty strings", Strings("", []string{}), []interface{}(nil)}, + {"empty times", Times("", []time.Time{}), []interface{}(nil)}, + {"empty uints", Uints("", []uint{}), []interface{}(nil)}, + {"empty uint64s", Uint64s("", []uint64{}), []interface{}(nil)}, + {"empty uint32s", Uint32s("", []uint32{}), []interface{}(nil)}, + {"empty uint16s", Uint16s("", []uint16{}), []interface{}(nil)}, + {"empty uint8s", Uint8s("", []uint8{}), []interface{}(nil)}, + {"empty uintptrs", Uintptrs("", []uintptr{}), []interface{}(nil)}, + {"bools", Bools("", []bool{true, false}), []interface{}{true, false}}, + {"byte strings", ByteStrings("", [][]byte{{1, 2}, {3, 4}}), []interface{}{[]byte{1, 2}, []byte{3, 4}}}, + {"complex128s", Complex128s("", []complex128{1 + 2i, 3 + 4i}), []interface{}{1 + 2i, 3 + 4i}}, + {"complex64s", Complex64s("", []complex64{1 + 2i, 3 + 4i}), []interface{}{complex64(1 + 2i), complex64(3 + 4i)}}, + {"durations", Durations("", []time.Duration{1, 2}), []interface{}{time.Nanosecond, 2 * time.Nanosecond}}, + {"float64s", Float64s("", []float64{1.2, 3.4}), []interface{}{1.2, 3.4}}, + {"float32s", Float32s("", []float32{1.2, 3.4}), []interface{}{float32(1.2), float32(3.4)}}, + {"ints", Ints("", []int{1, 2}), []interface{}{1, 2}}, + {"int64s", Int64s("", []int64{1, 2}), []interface{}{int64(1), int64(2)}}, + {"int32s", Int32s("", []int32{1, 2}), []interface{}{int32(1), int32(2)}}, + {"int16s", Int16s("", []int16{1, 2}), []interface{}{int16(1), int16(2)}}, + {"int8s", Int8s("", []int8{1, 2}), []interface{}{int8(1), int8(2)}}, + {"strings", Strings("", []string{"foo", "bar"}), []interface{}{"foo", "bar"}}, + {"times", Times("", []time.Time{time.Unix(0, 0), time.Unix(0, 0)}), []interface{}{time.Unix(0, 0), time.Unix(0, 0)}}, + {"uints", Uints("", []uint{1, 2}), []interface{}{uint(1), uint(2)}}, + {"uint64s", Uint64s("", []uint64{1, 2}), []interface{}{uint64(1), uint64(2)}}, + {"uint32s", Uint32s("", []uint32{1, 2}), []interface{}{uint32(1), uint32(2)}}, + {"uint16s", Uint16s("", []uint16{1, 2}), []interface{}{uint16(1), uint16(2)}}, + {"uint8s", Uint8s("", []uint8{1, 2}), []interface{}{uint8(1), uint8(2)}}, + {"uintptrs", Uintptrs("", []uintptr{1, 2}), []interface{}{uintptr(1), uintptr(2)}}, + } + + for _, tt := range tests { + enc := zapcore.NewMapObjectEncoder() + tt.field.Key = "k" + tt.field.AddTo(enc) + assert.Equal(t, tt.expected, enc.Fields["k"], "%s: unexpected map contents.", tt.desc) + assert.Equal(t, 1, len(enc.Fields), "%s: found extra keys in map: %v", tt.desc, enc.Fields) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/benchmarks/apex_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/benchmarks/apex_test.go new file mode 100644 index 0000000..67d7646 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/benchmarks/apex_test.go @@ -0,0 +1,57 @@ +// 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 +// 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. + +package benchmarks + +import ( + "io/ioutil" + + "github.com/apex/log" + "github.com/apex/log/handlers/json" +) + +func newDisabledApexLog() *log.Logger { + return &log.Logger{ + Handler: json.New(ioutil.Discard), + Level: log.ErrorLevel, + } +} + +func newApexLog() *log.Logger { + return &log.Logger{ + Handler: json.New(ioutil.Discard), + Level: log.DebugLevel, + } +} + +func fakeApexFields() log.Fields { + return log.Fields{ + "int": _tenInts[0], + "ints": _tenInts, + "string": _tenStrings[0], + "strings": _tenStrings, + "time": _tenTimes[0], + "times": _tenTimes, + "user1": _oneUser, + "user2": _oneUser, + "users": _tenUsers, + "error": errExample, + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/benchmarks/doc.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/benchmarks/doc.go new file mode 100644 index 0000000..b79f79f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/benchmarks/doc.go @@ -0,0 +1,23 @@ +// 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 +// 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. + +// Package benchmarks contains only benchmarks comparing zap to other +// structured logging libraries. +package benchmarks diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/benchmarks/kit_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/benchmarks/kit_test.go new file mode 100644 index 0000000..b9da293 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/benchmarks/kit_test.go @@ -0,0 +1,31 @@ +// 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 +// 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. + +package benchmarks + +import ( + "io/ioutil" + + "github.com/go-kit/kit/log" +) + +func newKitLog(fields ...interface{}) log.Logger { + return log.With(log.NewJSONLogger(ioutil.Discard), fields...) +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/benchmarks/lion_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/benchmarks/lion_test.go new file mode 100644 index 0000000..6c41cb1 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/benchmarks/lion_test.go @@ -0,0 +1,31 @@ +// 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 +// 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. + +package benchmarks + +import ( + "io/ioutil" + + "go.pedge.io/lion" +) + +func newLion() lion.Logger { + return lion.NewLogger(lion.NewJSONWritePusher(ioutil.Discard)) +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/benchmarks/log15_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/benchmarks/log15_test.go new file mode 100644 index 0000000..70a60b3 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/benchmarks/log15_test.go @@ -0,0 +1,33 @@ +// 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 +// 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. + +package benchmarks + +import ( + "io/ioutil" + + "gopkg.in/inconshreveable/log15.v2" +) + +func newLog15() log15.Logger { + logger := log15.New() + logger.SetHandler(log15.StreamHandler(ioutil.Discard, log15.JsonFormat())) + return logger +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/benchmarks/logrus_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/benchmarks/logrus_test.go new file mode 100644 index 0000000..ee684a6 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/benchmarks/logrus_test.go @@ -0,0 +1,57 @@ +// 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 +// 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. + +package benchmarks + +import ( + "io/ioutil" + + "github.com/sirupsen/logrus" +) + +func newDisabledLogrus() *logrus.Logger { + logger := newLogrus() + logger.Level = logrus.ErrorLevel + return logger +} + +func newLogrus() *logrus.Logger { + return &logrus.Logger{ + Out: ioutil.Discard, + Formatter: new(logrus.JSONFormatter), + Hooks: make(logrus.LevelHooks), + Level: logrus.DebugLevel, + } +} + +func fakeLogrusFields() logrus.Fields { + return logrus.Fields{ + "int": _tenInts[0], + "ints": _tenInts, + "string": _tenStrings[0], + "strings": _tenStrings, + "time": _tenTimes[0], + "times": _tenTimes, + "user1": _oneUser, + "user2": _oneUser, + "users": _tenUsers, + "error": errExample, + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/benchmarks/scenario_bench_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/benchmarks/scenario_bench_test.go new file mode 100644 index 0000000..4e307d2 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/benchmarks/scenario_bench_test.go @@ -0,0 +1,614 @@ +// 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 +// 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. + +package benchmarks + +import ( + "io/ioutil" + "log" + "testing" + + "go.uber.org/zap" +) + +func BenchmarkDisabledWithoutFields(b *testing.B) { + b.Logf("Logging at a disabled level without any structured context.") + b.Run("Zap", func(b *testing.B) { + logger := newZapLogger(zap.ErrorLevel) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0)) + } + }) + }) + b.Run("Zap.Check", func(b *testing.B) { + logger := newZapLogger(zap.ErrorLevel) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + if m := logger.Check(zap.InfoLevel, getMessage(0)); m != nil { + m.Write() + } + } + }) + }) + b.Run("Zap.Sugar", func(b *testing.B) { + logger := newZapLogger(zap.ErrorLevel).Sugar() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0)) + } + }) + }) + b.Run("Zap.SugarFormatting", func(b *testing.B) { + logger := newZapLogger(zap.ErrorLevel).Sugar() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Infof("%v %v %v %s %v %v %v %v %v %s\n", fakeFmtArgs()...) + } + }) + }) + b.Run("apex/log", func(b *testing.B) { + logger := newDisabledApexLog() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0)) + } + }) + }) + b.Run("sirupsen/logrus", func(b *testing.B) { + logger := newDisabledLogrus() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0)) + } + }) + }) + b.Run("rs/zerolog", func(b *testing.B) { + logger := newDisabledZerolog() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info().Msg(getMessage(0)) + } + }) + }) +} + +func BenchmarkDisabledAccumulatedContext(b *testing.B) { + b.Logf("Logging at a disabled level with some accumulated context.") + b.Run("Zap", func(b *testing.B) { + logger := newZapLogger(zap.ErrorLevel).With(fakeFields()...) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0)) + } + }) + }) + b.Run("Zap.Check", func(b *testing.B) { + logger := newZapLogger(zap.ErrorLevel).With(fakeFields()...) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + if m := logger.Check(zap.InfoLevel, getMessage(0)); m != nil { + m.Write() + } + } + }) + }) + b.Run("Zap.Sugar", func(b *testing.B) { + logger := newZapLogger(zap.ErrorLevel).With(fakeFields()...).Sugar() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0)) + } + }) + }) + b.Run("Zap.SugarFormatting", func(b *testing.B) { + logger := newZapLogger(zap.ErrorLevel).With(fakeFields()...).Sugar() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Infof("%v %v %v %s %v %v %v %v %v %s\n", fakeFmtArgs()...) + } + }) + }) + b.Run("apex/log", func(b *testing.B) { + logger := newDisabledApexLog().WithFields(fakeApexFields()) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0)) + } + }) + }) + b.Run("sirupsen/logrus", func(b *testing.B) { + logger := newDisabledLogrus().WithFields(fakeLogrusFields()) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0)) + } + }) + }) + b.Run("rs/zerolog", func(b *testing.B) { + logger := fakeZerologContext(newDisabledZerolog().With()).Logger() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info().Msg(getMessage(0)) + } + }) + }) +} + +func BenchmarkDisabledAddingFields(b *testing.B) { + b.Logf("Logging at a disabled level, adding context at each log site.") + b.Run("Zap", func(b *testing.B) { + logger := newZapLogger(zap.ErrorLevel) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0), fakeFields()...) + } + }) + }) + b.Run("Zap.Check", func(b *testing.B) { + logger := newZapLogger(zap.ErrorLevel) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + if m := logger.Check(zap.InfoLevel, getMessage(0)); m != nil { + m.Write(fakeFields()...) + } + } + }) + }) + b.Run("Zap.Sugar", func(b *testing.B) { + logger := newZapLogger(zap.ErrorLevel).Sugar() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Infow(getMessage(0), fakeSugarFields()...) + } + }) + }) + b.Run("apex/log", func(b *testing.B) { + logger := newDisabledApexLog() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.WithFields(fakeApexFields()).Info(getMessage(0)) + } + }) + }) + b.Run("sirupsen/logrus", func(b *testing.B) { + logger := newDisabledLogrus() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.WithFields(fakeLogrusFields()).Info(getMessage(0)) + } + }) + }) + b.Run("rs/zerolog", func(b *testing.B) { + logger := newDisabledZerolog() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + fakeZerologFields(logger.Info()).Msg(getMessage(0)) + } + }) + }) +} + +func BenchmarkWithoutFields(b *testing.B) { + b.Logf("Logging without any structured context.") + b.Run("Zap", func(b *testing.B) { + logger := newZapLogger(zap.DebugLevel) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0)) + } + }) + }) + b.Run("Zap.Check", func(b *testing.B) { + logger := newZapLogger(zap.DebugLevel) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + if ce := logger.Check(zap.InfoLevel, getMessage(0)); ce != nil { + ce.Write() + } + } + }) + }) + b.Run("Zap.CheckSampled", func(b *testing.B) { + logger := newSampledLogger(zap.DebugLevel) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + i := 0 + for pb.Next() { + i++ + if ce := logger.Check(zap.InfoLevel, getMessage(i)); ce != nil { + ce.Write() + } + } + }) + }) + b.Run("Zap.Sugar", func(b *testing.B) { + logger := newZapLogger(zap.DebugLevel).Sugar() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0)) + } + }) + }) + b.Run("Zap.SugarFormatting", func(b *testing.B) { + logger := newZapLogger(zap.DebugLevel).Sugar() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Infof("%v %v %v %s %v %v %v %v %v %s\n", fakeFmtArgs()...) + } + }) + }) + b.Run("apex/log", func(b *testing.B) { + logger := newApexLog() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0)) + } + }) + }) + b.Run("go-kit/kit/log", func(b *testing.B) { + logger := newKitLog() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Log(getMessage(0), getMessage(1)) + } + }) + }) + b.Run("inconshreveable/log15", func(b *testing.B) { + logger := newLog15() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0)) + } + }) + }) + b.Run("sirupsen/logrus", func(b *testing.B) { + logger := newLogrus() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0)) + } + }) + }) + b.Run("go.pedge.io/lion", func(b *testing.B) { + logger := newLion() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Printf(getMessage(0)) + } + }) + }) + b.Run("stdlib.Println", func(b *testing.B) { + logger := log.New(ioutil.Discard, "", log.LstdFlags) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Println(getMessage(0)) + } + }) + }) + b.Run("stdlib.Printf", func(b *testing.B) { + logger := log.New(ioutil.Discard, "", log.LstdFlags) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Printf("%v %v %v %s %v %v %v %v %v %s\n", fakeFmtArgs()...) + } + }) + }) + b.Run("rs/zerolog", func(b *testing.B) { + logger := newZerolog() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info().Msg(getMessage(0)) + } + }) + }) + b.Run("rs/zerolog.Formatting", func(b *testing.B) { + logger := newZerolog() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info().Msgf("%v %v %v %s %v %v %v %v %v %s\n", fakeFmtArgs()...) + } + }) + }) + b.Run("rs/zerolog.Check", func(b *testing.B) { + logger := newZerolog() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + if e := logger.Info(); e.Enabled() { + e.Msg(getMessage(0)) + } + } + }) + }) +} + +func BenchmarkAccumulatedContext(b *testing.B) { + b.Logf("Logging with some accumulated context.") + b.Run("Zap", func(b *testing.B) { + logger := newZapLogger(zap.DebugLevel).With(fakeFields()...) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0)) + } + }) + }) + b.Run("Zap.Check", func(b *testing.B) { + logger := newZapLogger(zap.DebugLevel).With(fakeFields()...) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + if ce := logger.Check(zap.InfoLevel, getMessage(0)); ce != nil { + ce.Write() + } + } + }) + }) + b.Run("Zap.CheckSampled", func(b *testing.B) { + logger := newSampledLogger(zap.DebugLevel).With(fakeFields()...) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + i := 0 + for pb.Next() { + i++ + if ce := logger.Check(zap.InfoLevel, getMessage(i)); ce != nil { + ce.Write() + } + } + }) + }) + b.Run("Zap.Sugar", func(b *testing.B) { + logger := newZapLogger(zap.DebugLevel).With(fakeFields()...).Sugar() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0)) + } + }) + }) + b.Run("Zap.SugarFormatting", func(b *testing.B) { + logger := newZapLogger(zap.DebugLevel).With(fakeFields()...).Sugar() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Infof("%v %v %v %s %v %v %v %v %v %s\n", fakeFmtArgs()...) + } + }) + }) + b.Run("apex/log", func(b *testing.B) { + logger := newApexLog().WithFields(fakeApexFields()) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0)) + } + }) + }) + b.Run("go-kit/kit/log", func(b *testing.B) { + logger := newKitLog(fakeSugarFields()...) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Log(getMessage(0), getMessage(1)) + } + }) + }) + b.Run("inconshreveable/log15", func(b *testing.B) { + logger := newLog15().New(fakeSugarFields()) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0)) + } + }) + }) + b.Run("sirupsen/logrus", func(b *testing.B) { + logger := newLogrus().WithFields(fakeLogrusFields()) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0)) + } + }) + }) + b.Run("go.pedge.io/lion", func(b *testing.B) { + logger := newLion().WithFields(fakeLogrusFields()) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Infof(getMessage(0)) + } + }) + }) + b.Run("rs/zerolog", func(b *testing.B) { + logger := fakeZerologContext(newZerolog().With()).Logger() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info().Msg(getMessage(0)) + } + }) + }) + b.Run("rs/zerolog.Check", func(b *testing.B) { + logger := fakeZerologContext(newZerolog().With()).Logger() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + if e := logger.Info(); e.Enabled() { + e.Msg(getMessage(0)) + } + } + }) + }) + b.Run("rs/zerolog.Formatting", func(b *testing.B) { + logger := fakeZerologContext(newZerolog().With()).Logger() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info().Msgf("%v %v %v %s %v %v %v %v %v %s\n", fakeFmtArgs()...) + } + }) + }) +} + +func BenchmarkAddingFields(b *testing.B) { + b.Logf("Logging with additional context at each log site.") + b.Run("Zap", func(b *testing.B) { + logger := newZapLogger(zap.DebugLevel) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0), fakeFields()...) + } + }) + }) + b.Run("Zap.Check", func(b *testing.B) { + logger := newZapLogger(zap.DebugLevel) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + if ce := logger.Check(zap.InfoLevel, getMessage(0)); ce != nil { + ce.Write(fakeFields()...) + } + } + }) + }) + b.Run("Zap.CheckSampled", func(b *testing.B) { + logger := newSampledLogger(zap.DebugLevel) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + i := 0 + for pb.Next() { + i++ + if ce := logger.Check(zap.InfoLevel, getMessage(i)); ce != nil { + ce.Write(fakeFields()...) + } + } + }) + }) + b.Run("Zap.Sugar", func(b *testing.B) { + logger := newZapLogger(zap.DebugLevel).Sugar() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Infow(getMessage(0), fakeSugarFields()...) + } + }) + }) + b.Run("apex/log", func(b *testing.B) { + logger := newApexLog() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.WithFields(fakeApexFields()).Info(getMessage(0)) + } + }) + }) + b.Run("go-kit/kit/log", func(b *testing.B) { + logger := newKitLog() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Log(fakeSugarFields()...) + } + }) + }) + b.Run("inconshreveable/log15", func(b *testing.B) { + logger := newLog15() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0), fakeSugarFields()...) + } + }) + }) + b.Run("sirupsen/logrus", func(b *testing.B) { + logger := newLogrus() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.WithFields(fakeLogrusFields()).Info(getMessage(0)) + } + }) + }) + b.Run("go.pedge.io/lion", func(b *testing.B) { + logger := newLion() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.WithFields(fakeLogrusFields()).Infof(getMessage(0)) + } + }) + }) + b.Run("rs/zerolog", func(b *testing.B) { + logger := newZerolog() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + fakeZerologFields(logger.Info()).Msg(getMessage(0)) + } + }) + }) + b.Run("rs/zerolog.Check", func(b *testing.B) { + logger := newZerolog() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + if e := logger.Info(); e.Enabled() { + fakeZerologFields(e).Msg(getMessage(0)) + } + } + }) + }) +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/benchmarks/zap_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/benchmarks/zap_test.go new file mode 100644 index 0000000..294260b --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/benchmarks/zap_test.go @@ -0,0 +1,172 @@ +// 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 +// 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. + +package benchmarks + +import ( + "errors" + "fmt" + "time" + + "go.uber.org/multierr" + "go.uber.org/zap" + "go.uber.org/zap/zapcore" + "go.uber.org/zap/zaptest" +) + +var ( + errExample = errors.New("fail") + + _messages = fakeMessages(1000) + _tenInts = []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0} + _tenStrings = []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j"} + _tenTimes = []time.Time{ + time.Unix(0, 0), + time.Unix(1, 0), + time.Unix(2, 0), + time.Unix(3, 0), + time.Unix(4, 0), + time.Unix(5, 0), + time.Unix(6, 0), + time.Unix(7, 0), + time.Unix(8, 0), + time.Unix(9, 0), + } + _oneUser = &user{ + Name: "Jane Doe", + Email: "jane@test.com", + CreatedAt: time.Date(1980, 1, 1, 12, 0, 0, 0, time.UTC), + } + _tenUsers = users{ + _oneUser, + _oneUser, + _oneUser, + _oneUser, + _oneUser, + _oneUser, + _oneUser, + _oneUser, + _oneUser, + _oneUser, + } +) + +func fakeMessages(n int) []string { + messages := make([]string, n) + for i := range messages { + messages[i] = fmt.Sprintf("Test logging, but use a somewhat realistic message length. (#%v)", i) + } + return messages +} + +func getMessage(iter int) string { + return _messages[iter%1000] +} + +type users []*user + +func (uu users) MarshalLogArray(arr zapcore.ArrayEncoder) error { + var err error + for i := range uu { + err = multierr.Append(err, arr.AppendObject(uu[i])) + } + return err +} + +type user struct { + Name string `json:"name"` + Email string `json:"email"` + CreatedAt time.Time `json:"created_at"` +} + +func (u *user) MarshalLogObject(enc zapcore.ObjectEncoder) error { + enc.AddString("name", u.Name) + enc.AddString("email", u.Email) + enc.AddInt64("createdAt", u.CreatedAt.UnixNano()) + return nil +} + +func newZapLogger(lvl zapcore.Level) *zap.Logger { + ec := zap.NewProductionEncoderConfig() + ec.EncodeDuration = zapcore.NanosDurationEncoder + ec.EncodeTime = zapcore.EpochNanosTimeEncoder + enc := zapcore.NewJSONEncoder(ec) + return zap.New(zapcore.NewCore( + enc, + &zaptest.Discarder{}, + lvl, + )) +} + +func newSampledLogger(lvl zapcore.Level) *zap.Logger { + return zap.New(zapcore.NewSampler( + newZapLogger(zap.DebugLevel).Core(), + 100*time.Millisecond, + 10, // first + 10, // thereafter + )) +} + +func fakeFields() []zapcore.Field { + return []zapcore.Field{ + zap.Int("int", _tenInts[0]), + zap.Ints("ints", _tenInts), + zap.String("string", _tenStrings[0]), + zap.Strings("strings", _tenStrings), + zap.Time("time", _tenTimes[0]), + zap.Times("times", _tenTimes), + zap.Object("user1", _oneUser), + zap.Object("user2", _oneUser), + zap.Array("users", _tenUsers), + zap.Error(errExample), + } +} + +func fakeSugarFields() []interface{} { + return []interface{}{ + "int", _tenInts[0], + "ints", _tenInts, + "string", _tenStrings[0], + "strings", _tenStrings, + "time", _tenTimes[0], + "times", _tenTimes, + "user1", _oneUser, + "user2", _oneUser, + "users", _tenUsers, + "error", errExample, + } +} + +func fakeFmtArgs() []interface{} { + // Need to keep this a function instead of a package-global var so that we + // pay the cast-to-interface{} penalty on each call. + return []interface{}{ + _tenInts[0], + _tenInts, + _tenStrings[0], + _tenStrings, + _tenTimes[0], + _tenTimes, + _oneUser, + _oneUser, + _tenUsers, + errExample, + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/benchmarks/zerolog_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/benchmarks/zerolog_test.go new file mode 100644 index 0000000..b14cd9d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/benchmarks/zerolog_test.go @@ -0,0 +1,63 @@ +// 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 +// 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. + +package benchmarks + +import ( + "io/ioutil" + + "github.com/rs/zerolog" +) + +func newZerolog() zerolog.Logger { + return zerolog.New(ioutil.Discard).With().Timestamp().Logger() +} + +func newDisabledZerolog() zerolog.Logger { + return newZerolog().Level(zerolog.Disabled) +} + +func fakeZerologFields(e *zerolog.Event) *zerolog.Event { + return e. + Int("int", _tenInts[0]). + Interface("ints", _tenInts). + Str("string", _tenStrings[0]). + Interface("strings", _tenStrings). + Time("time", _tenTimes[0]). + Interface("times", _tenTimes). + Interface("user1", _oneUser). + Interface("user2", _oneUser). + Interface("users", _tenUsers). + Err(errExample) +} + +func fakeZerologContext(c zerolog.Context) zerolog.Context { + return c. + Int("int", _tenInts[0]). + Interface("ints", _tenInts). + Str("string", _tenStrings[0]). + Interface("strings", _tenStrings). + Time("time", _tenTimes[0]). + Interface("times", _tenTimes). + Interface("user1", _oneUser). + Interface("user2", _oneUser). + Interface("users", _tenUsers). + Err(errExample) +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/buffer/buffer.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/buffer/buffer.go new file mode 100644 index 0000000..ea6fdc8 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/buffer/buffer.go @@ -0,0 +1,106 @@ +// 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 +// 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. + +// Package buffer provides a thin wrapper around a byte slice. Unlike the +// standard library's bytes.Buffer, it supports a portion of the strconv +// package's zero-allocation formatters. +package buffer + +import "strconv" + +const _size = 1024 // by default, create 1 KiB buffers + +// Buffer is a thin wrapper around a byte slice. It's intended to be pooled, so +// the only way to construct one is via a Pool. +type Buffer struct { + bs []byte + pool Pool +} + +// AppendByte writes a single byte to the Buffer. +func (b *Buffer) AppendByte(v byte) { + b.bs = append(b.bs, v) +} + +// AppendString writes a string to the Buffer. +func (b *Buffer) AppendString(s string) { + b.bs = append(b.bs, s...) +} + +// AppendInt appends an integer to the underlying buffer (assuming base 10). +func (b *Buffer) AppendInt(i int64) { + b.bs = strconv.AppendInt(b.bs, i, 10) +} + +// AppendUint appends an unsigned integer to the underlying buffer (assuming +// base 10). +func (b *Buffer) AppendUint(i uint64) { + b.bs = strconv.AppendUint(b.bs, i, 10) +} + +// AppendBool appends a bool to the underlying buffer. +func (b *Buffer) AppendBool(v bool) { + b.bs = strconv.AppendBool(b.bs, v) +} + +// AppendFloat appends a float to the underlying buffer. It doesn't quote NaN +// or +/- Inf. +func (b *Buffer) AppendFloat(f float64, bitSize int) { + b.bs = strconv.AppendFloat(b.bs, f, 'f', -1, bitSize) +} + +// Len returns the length of the underlying byte slice. +func (b *Buffer) Len() int { + return len(b.bs) +} + +// Cap returns the capacity of the underlying byte slice. +func (b *Buffer) Cap() int { + return cap(b.bs) +} + +// Bytes returns a mutable reference to the underlying byte slice. +func (b *Buffer) Bytes() []byte { + return b.bs +} + +// String returns a string copy of the underlying byte slice. +func (b *Buffer) String() string { + return string(b.bs) +} + +// Reset resets the underlying byte slice. Subsequent writes re-use the slice's +// backing array. +func (b *Buffer) Reset() { + b.bs = b.bs[:0] +} + +// Write implements io.Writer. +func (b *Buffer) Write(bs []byte) (int, error) { + b.bs = append(b.bs, bs...) + return len(bs), nil +} + +// Free returns the Buffer to its Pool. +// +// Callers must not retain references to the Buffer after calling Free. +func (b *Buffer) Free() { + b.pool.put(b) +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/buffer/buffer_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/buffer/buffer_test.go new file mode 100644 index 0000000..59bc08a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/buffer/buffer_test.go @@ -0,0 +1,91 @@ +// 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 +// 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. + +package buffer + +import ( + "bytes" + "strings" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestBufferWrites(t *testing.T) { + buf := NewPool().Get() + + tests := []struct { + desc string + f func() + want string + }{ + {"AppendByte", func() { buf.AppendByte('v') }, "v"}, + {"AppendString", func() { buf.AppendString("foo") }, "foo"}, + {"AppendIntPositive", func() { buf.AppendInt(42) }, "42"}, + {"AppendIntNegative", func() { buf.AppendInt(-42) }, "-42"}, + {"AppendUint", func() { buf.AppendUint(42) }, "42"}, + {"AppendBool", func() { buf.AppendBool(true) }, "true"}, + {"AppendFloat64", func() { buf.AppendFloat(3.14, 64) }, "3.14"}, + // Intenationally introduce some floating-point error. + {"AppendFloat32", func() { buf.AppendFloat(float64(float32(3.14)), 32) }, "3.14"}, + {"AppendWrite", func() { buf.Write([]byte("foo")) }, "foo"}, + } + + for _, tt := range tests { + t.Run(tt.desc, func(t *testing.T) { + buf.Reset() + tt.f() + assert.Equal(t, tt.want, buf.String(), "Unexpected buffer.String().") + assert.Equal(t, tt.want, string(buf.Bytes()), "Unexpected string(buffer.Bytes()).") + assert.Equal(t, len(tt.want), buf.Len(), "Unexpected buffer length.") + // We're not writing more than a kibibyte in tests. + assert.Equal(t, _size, buf.Cap(), "Expected buffer capacity to remain constant.") + }) + } +} + +func BenchmarkBuffers(b *testing.B) { + // Because we use the strconv.AppendFoo functions so liberally, we can't + // use the standard library's bytes.Buffer anyways (without incurring a + // bunch of extra allocations). Nevertheless, let's make sure that we're + // not losing any precious nanoseconds. + str := strings.Repeat("a", 1024) + slice := make([]byte, 1024) + buf := bytes.NewBuffer(slice) + custom := NewPool().Get() + b.Run("ByteSlice", func(b *testing.B) { + for i := 0; i < b.N; i++ { + slice = append(slice, str...) + slice = slice[:0] + } + }) + b.Run("BytesBuffer", func(b *testing.B) { + for i := 0; i < b.N; i++ { + buf.WriteString(str) + buf.Reset() + } + }) + b.Run("CustomBuffer", func(b *testing.B) { + for i := 0; i < b.N; i++ { + custom.AppendString(str) + custom.Reset() + } + }) +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/buffer/pool.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/buffer/pool.go new file mode 100644 index 0000000..8fb3e20 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/buffer/pool.go @@ -0,0 +1,49 @@ +// 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 +// 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. + +package buffer + +import "sync" + +// A Pool is a type-safe wrapper around a sync.Pool. +type Pool struct { + p *sync.Pool +} + +// NewPool constructs a new Pool. +func NewPool() Pool { + return Pool{p: &sync.Pool{ + New: func() interface{} { + return &Buffer{bs: make([]byte, 0, _size)} + }, + }} +} + +// Get retrieves a Buffer from the pool, creating one if necessary. +func (p Pool) Get() *Buffer { + buf := p.p.Get().(*Buffer) + buf.Reset() + buf.pool = p + return buf +} + +func (p Pool) put(buf *Buffer) { + p.p.Put(buf) +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/buffer/pool_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/buffer/pool_test.go new file mode 100644 index 0000000..a219815 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/buffer/pool_test.go @@ -0,0 +1,52 @@ +// 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 +// 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. + +package buffer + +import ( + "sync" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestBuffers(t *testing.T) { + const dummyData = "dummy data" + p := NewPool() + + var wg sync.WaitGroup + for g := 0; g < 10; g++ { + wg.Add(1) + go func() { + for i := 0; i < 100; i++ { + buf := p.Get() + assert.Zero(t, buf.Len(), "Expected truncated buffer") + assert.NotZero(t, buf.Cap(), "Expected non-zero capacity") + + buf.AppendString(dummyData) + assert.Equal(t, buf.Len(), len(dummyData), "Expected buffer to contain dummy data") + + buf.Free() + } + wg.Done() + }() + } + wg.Wait() +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/check_license.sh b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/check_license.sh new file mode 100755 index 0000000..345ac8b --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/check_license.sh @@ -0,0 +1,17 @@ +#!/bin/bash -e + +ERROR_COUNT=0 +while read -r file +do + case "$(head -1 "${file}")" in + *"Copyright (c) "*" Uber Technologies, Inc.") + # everything's cool + ;; + *) + echo "$file is missing license header." + (( ERROR_COUNT++ )) + ;; + esac +done < <(git ls-files "*\.go") + +exit $ERROR_COUNT diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/common_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/common_test.go new file mode 100644 index 0000000..b0a4a2e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/common_test.go @@ -0,0 +1,57 @@ +// 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 +// 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. + +package zap + +import ( + "sync" + "testing" + + "go.uber.org/zap/zapcore" + "go.uber.org/zap/zaptest/observer" +) + +func opts(opts ...Option) []Option { + return opts +} + +// Here specifically to introduce an easily-identifiable filename for testing +// stacktraces and caller skips. +func withLogger(t testing.TB, e zapcore.LevelEnabler, opts []Option, f func(*Logger, *observer.ObservedLogs)) { + fac, logs := observer.New(e) + log := New(fac, opts...) + f(log, logs) +} + +func withSugar(t testing.TB, e zapcore.LevelEnabler, opts []Option, f func(*SugaredLogger, *observer.ObservedLogs)) { + withLogger(t, e, opts, func(logger *Logger, logs *observer.ObservedLogs) { f(logger.Sugar(), logs) }) +} + +func runConcurrently(goroutines, iterations int, wg *sync.WaitGroup, f func()) { + wg.Add(goroutines) + for g := 0; g < goroutines; g++ { + go func() { + defer wg.Done() + for i := 0; i < iterations; i++ { + f() + } + }() + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/config.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/config.go new file mode 100644 index 0000000..b0658ed --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/config.go @@ -0,0 +1,243 @@ +// 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 +// 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. + +package zap + +import ( + "sort" + "time" + + "go.uber.org/zap/zapcore" +) + +// SamplingConfig sets a sampling strategy for the logger. Sampling caps the +// global CPU and I/O load that logging puts on your process while attempting +// to preserve a representative subset of your logs. +// +// Values configured here are per-second. See zapcore.NewSampler for details. +type SamplingConfig struct { + Initial int `json:"initial" yaml:"initial"` + Thereafter int `json:"thereafter" yaml:"thereafter"` +} + +// Config offers a declarative way to construct a logger. It doesn't do +// anything that can't be done with New, Options, and the various +// zapcore.WriteSyncer and zapcore.Core wrappers, but it's a simpler way to +// toggle common options. +// +// Note that Config intentionally supports only the most common options. More +// unusual logging setups (logging to network connections or message queues, +// splitting output between multiple files, etc.) are possible, but require +// direct use of the zapcore package. For sample code, see the package-level +// BasicConfiguration and AdvancedConfiguration examples. +// +// For an example showing runtime log level changes, see the documentation for +// AtomicLevel. +type Config struct { + // Level is the minimum enabled logging level. Note that this is a dynamic + // level, so calling Config.Level.SetLevel will atomically change the log + // level of all loggers descended from this config. + Level AtomicLevel `json:"level" yaml:"level"` + // Development puts the logger in development mode, which changes the + // behavior of DPanicLevel and takes stacktraces more liberally. + Development bool `json:"development" yaml:"development"` + // DisableCaller stops annotating logs with the calling function's file + // name and line number. By default, all logs are annotated. + DisableCaller bool `json:"disableCaller" yaml:"disableCaller"` + // DisableStacktrace completely disables automatic stacktrace capturing. By + // default, stacktraces are captured for WarnLevel and above logs in + // development and ErrorLevel and above in production. + DisableStacktrace bool `json:"disableStacktrace" yaml:"disableStacktrace"` + // Sampling sets a sampling policy. A nil SamplingConfig disables sampling. + Sampling *SamplingConfig `json:"sampling" yaml:"sampling"` + // Encoding sets the logger's encoding. Valid values are "json" and + // "console", as well as any third-party encodings registered via + // RegisterEncoder. + Encoding string `json:"encoding" yaml:"encoding"` + // EncoderConfig sets options for the chosen encoder. See + // zapcore.EncoderConfig for details. + EncoderConfig zapcore.EncoderConfig `json:"encoderConfig" yaml:"encoderConfig"` + // OutputPaths is a list of paths to write logging output to. See Open for + // details. + OutputPaths []string `json:"outputPaths" yaml:"outputPaths"` + // ErrorOutputPaths is a list of paths to write internal logger errors to. + // The default is standard error. + // + // Note that this setting only affects internal errors; for sample code that + // sends error-level logs to a different location from info- and debug-level + // logs, see the package-level AdvancedConfiguration example. + ErrorOutputPaths []string `json:"errorOutputPaths" yaml:"errorOutputPaths"` + // InitialFields is a collection of fields to add to the root logger. + InitialFields map[string]interface{} `json:"initialFields" yaml:"initialFields"` +} + +// NewProductionEncoderConfig returns an opinionated EncoderConfig for +// production environments. +func NewProductionEncoderConfig() zapcore.EncoderConfig { + return zapcore.EncoderConfig{ + TimeKey: "ts", + LevelKey: "level", + NameKey: "logger", + CallerKey: "caller", + MessageKey: "msg", + StacktraceKey: "stacktrace", + LineEnding: zapcore.DefaultLineEnding, + EncodeLevel: zapcore.LowercaseLevelEncoder, + EncodeTime: zapcore.EpochTimeEncoder, + EncodeDuration: zapcore.SecondsDurationEncoder, + EncodeCaller: zapcore.ShortCallerEncoder, + } +} + +// NewProductionConfig is a reasonable production logging configuration. +// Logging is enabled at InfoLevel and above. +// +// It uses a JSON encoder, writes to standard error, and enables sampling. +// Stacktraces are automatically included on logs of ErrorLevel and above. +func NewProductionConfig() Config { + return Config{ + Level: NewAtomicLevelAt(InfoLevel), + Development: false, + Sampling: &SamplingConfig{ + Initial: 100, + Thereafter: 100, + }, + Encoding: "json", + EncoderConfig: NewProductionEncoderConfig(), + OutputPaths: []string{"stderr"}, + ErrorOutputPaths: []string{"stderr"}, + } +} + +// NewDevelopmentEncoderConfig returns an opinionated EncoderConfig for +// development environments. +func NewDevelopmentEncoderConfig() zapcore.EncoderConfig { + return zapcore.EncoderConfig{ + // Keys can be anything except the empty string. + TimeKey: "T", + LevelKey: "L", + NameKey: "N", + CallerKey: "C", + MessageKey: "M", + StacktraceKey: "S", + LineEnding: zapcore.DefaultLineEnding, + EncodeLevel: zapcore.CapitalLevelEncoder, + EncodeTime: zapcore.ISO8601TimeEncoder, + EncodeDuration: zapcore.StringDurationEncoder, + EncodeCaller: zapcore.ShortCallerEncoder, + } +} + +// NewDevelopmentConfig is a reasonable development logging configuration. +// Logging is enabled at DebugLevel and above. +// +// It enables development mode (which makes DPanicLevel logs panic), uses a +// console encoder, writes to standard error, and disables sampling. +// Stacktraces are automatically included on logs of WarnLevel and above. +func NewDevelopmentConfig() Config { + return Config{ + Level: NewAtomicLevelAt(DebugLevel), + Development: true, + Encoding: "console", + EncoderConfig: NewDevelopmentEncoderConfig(), + OutputPaths: []string{"stderr"}, + ErrorOutputPaths: []string{"stderr"}, + } +} + +// Build constructs a logger from the Config and Options. +func (cfg Config) Build(opts ...Option) (*Logger, error) { + enc, err := cfg.buildEncoder() + if err != nil { + return nil, err + } + + sink, errSink, err := cfg.openSinks() + if err != nil { + return nil, err + } + + log := New( + zapcore.NewCore(enc, sink, cfg.Level), + cfg.buildOptions(errSink)..., + ) + if len(opts) > 0 { + log = log.WithOptions(opts...) + } + return log, nil +} + +func (cfg Config) buildOptions(errSink zapcore.WriteSyncer) []Option { + opts := []Option{ErrorOutput(errSink)} + + if cfg.Development { + opts = append(opts, Development()) + } + + if !cfg.DisableCaller { + opts = append(opts, AddCaller()) + } + + stackLevel := ErrorLevel + if cfg.Development { + stackLevel = WarnLevel + } + if !cfg.DisableStacktrace { + opts = append(opts, AddStacktrace(stackLevel)) + } + + if cfg.Sampling != nil { + opts = append(opts, WrapCore(func(core zapcore.Core) zapcore.Core { + return zapcore.NewSampler(core, time.Second, int(cfg.Sampling.Initial), int(cfg.Sampling.Thereafter)) + })) + } + + if len(cfg.InitialFields) > 0 { + fs := make([]zapcore.Field, 0, len(cfg.InitialFields)) + keys := make([]string, 0, len(cfg.InitialFields)) + for k := range cfg.InitialFields { + keys = append(keys, k) + } + sort.Strings(keys) + for _, k := range keys { + fs = append(fs, Any(k, cfg.InitialFields[k])) + } + opts = append(opts, Fields(fs...)) + } + + return opts +} + +func (cfg Config) openSinks() (zapcore.WriteSyncer, zapcore.WriteSyncer, error) { + sink, closeOut, err := Open(cfg.OutputPaths...) + if err != nil { + return nil, nil, err + } + errSink, _, err := Open(cfg.ErrorOutputPaths...) + if err != nil { + closeOut() + return nil, nil, err + } + return sink, errSink, nil +} + +func (cfg Config) buildEncoder() (zapcore.Encoder, error) { + return newEncoder(cfg.Encoding, cfg.EncoderConfig) +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/config_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/config_test.go new file mode 100644 index 0000000..7a87570 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/config_test.go @@ -0,0 +1,108 @@ +// 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 +// 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. + +package zap + +import ( + "io/ioutil" + "os" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestConfig(t *testing.T) { + tests := []struct { + desc string + cfg Config + expectN int64 + expectRe string + }{ + { + desc: "production", + cfg: NewProductionConfig(), + expectN: 2 + 100 + 1, // 2 from initial logs, 100 initial sampled logs, 1 from off-by-one in sampler + expectRe: `{"level":"info","caller":"zap/config_test.go:\d+","msg":"info","k":"v","z":"zz"}` + "\n" + + `{"level":"warn","caller":"zap/config_test.go:\d+","msg":"warn","k":"v","z":"zz"}` + "\n", + }, + { + desc: "development", + cfg: NewDevelopmentConfig(), + expectN: 3 + 200, // 3 initial logs, all 200 subsequent logs + expectRe: "DEBUG\tzap/config_test.go:" + `\d+` + "\tdebug\t" + `{"k": "v", "z": "zz"}` + "\n" + + "INFO\tzap/config_test.go:" + `\d+` + "\tinfo\t" + `{"k": "v", "z": "zz"}` + "\n" + + "WARN\tzap/config_test.go:" + `\d+` + "\twarn\t" + `{"k": "v", "z": "zz"}` + "\n" + + `testing.\w+`, + }, + } + + for _, tt := range tests { + t.Run(tt.desc, func(t *testing.T) { + temp, err := ioutil.TempFile("", "zap-prod-config-test") + require.NoError(t, err, "Failed to create temp file.") + defer os.Remove(temp.Name()) + + tt.cfg.OutputPaths = []string{temp.Name()} + tt.cfg.EncoderConfig.TimeKey = "" // no timestamps in tests + tt.cfg.InitialFields = map[string]interface{}{"z": "zz", "k": "v"} + + hook, count := makeCountingHook() + logger, err := tt.cfg.Build(Hooks(hook)) + require.NoError(t, err, "Unexpected error constructing logger.") + + logger.Debug("debug") + logger.Info("info") + logger.Warn("warn") + + byteContents, err := ioutil.ReadAll(temp) + require.NoError(t, err, "Couldn't read log contents from temp file.") + logs := string(byteContents) + assert.Regexp(t, tt.expectRe, logs, "Unexpected log output.") + + for i := 0; i < 200; i++ { + logger.Info("sampling") + } + assert.Equal(t, tt.expectN, count.Load(), "Hook called an unexpected number of times.") + }) + } +} + +func TestConfigWithInvalidPaths(t *testing.T) { + tests := []struct { + desc string + output string + errOutput string + }{ + {"output directory doesn't exist", "/tmp/not-there/foo.log", "stderr"}, + {"error output directory doesn't exist", "stdout", "/tmp/not-there/foo-errors.log"}, + {"neither output directory exists", "/tmp/not-there/foo.log", "/tmp/not-there/foo-errors.log"}, + } + + for _, tt := range tests { + t.Run(tt.desc, func(t *testing.T) { + cfg := NewProductionConfig() + cfg.OutputPaths = []string{tt.output} + cfg.ErrorOutputPaths = []string{tt.errOutput} + _, err := cfg.Build() + assert.Error(t, err, "Expected an error opening a non-existent directory.") + }) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/doc.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/doc.go new file mode 100644 index 0000000..3f16a8d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/doc.go @@ -0,0 +1,113 @@ +// 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 +// 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. + +// Package zap provides fast, structured, leveled logging. +// +// For applications that log in the hot path, reflection-based serialization +// and string formatting are prohibitively expensive - they're CPU-intensive +// and make many small allocations. Put differently, using json.Marshal and +// fmt.Fprintf to log tons of interface{} makes your application slow. +// +// Zap takes a different approach. It includes a reflection-free, +// zero-allocation JSON encoder, and the base Logger strives to avoid +// serialization overhead and allocations wherever possible. By building the +// high-level SugaredLogger on that foundation, zap lets users choose when +// they need to count every allocation and when they'd prefer a more familiar, +// loosely typed API. +// +// Choosing a Logger +// +// In contexts where performance is nice, but not critical, use the +// SugaredLogger. It's 4-10x faster than other structured logging packages and +// supports both structured and printf-style logging. Like log15 and go-kit, +// the SugaredLogger's structured logging APIs are loosely typed and accept a +// variadic number of key-value pairs. (For more advanced use cases, they also +// accept strongly typed fields - see the SugaredLogger.With documentation for +// details.) +// sugar := zap.NewExample().Sugar() +// defer sugar.Sync() +// sugar.Infow("failed to fetch URL", +// "url", "http://example.com", +// "attempt", 3, +// "backoff", time.Second, +// ) +// sugar.Printf("failed to fetch URL: %s", "http://example.com") +// +// By default, loggers are unbuffered. However, since zap's low-level APIs +// allow buffering, calling Sync before letting your process exit is a good +// habit. +// +// In the rare contexts where every microsecond and every allocation matter, +// use the Logger. It's even faster than the SugaredLogger and allocates far +// less, but it only supports strongly-typed, structured logging. +// logger := zap.NewExample() +// defer logger.Sync() +// logger.Info("failed to fetch URL", +// zap.String("url", "http://example.com"), +// zap.Int("attempt", 3), +// zap.Duration("backoff", time.Second), +// ) +// +// Choosing between the Logger and SugaredLogger doesn't need to be an +// application-wide decision: converting between the two is simple and +// inexpensive. +// logger := zap.NewExample() +// defer logger.Sync() +// sugar := logger.Sugar() +// plain := sugar.Desugar() +// +// Configuring Zap +// +// The simplest way to build a Logger is to use zap's opinionated presets: +// NewExample, NewProduction, and NewDevelopment. These presets build a logger +// with a single function call: +// logger, err := zap.NewProduction() +// if err != nil { +// log.Fatalf("can't initialize zap logger: %v", err) +// } +// defer logger.Sync() +// +// Presets are fine for small projects, but larger projects and organizations +// naturally require a bit more customization. For most users, zap's Config +// struct strikes the right balance between flexibility and convenience. See +// the package-level BasicConfiguration example for sample code. +// +// More unusual configurations (splitting output between files, sending logs +// to a message queue, etc.) are possible, but require direct use of +// go.uber.org/zap/zapcore. See the package-level AdvancedConfiguration +// example for sample code. +// +// Extending Zap +// +// The zap package itself is a relatively thin wrapper around the interfaces +// in go.uber.org/zap/zapcore. Extending zap to support a new encoding (e.g., +// BSON), a new log sink (e.g., Kafka), or something more exotic (perhaps an +// exception aggregation service, like Sentry or Rollbar) typically requires +// implementing the zapcore.Encoder, zapcore.WriteSyncer, or zapcore.Core +// interfaces. See the zapcore documentation for details. +// +// Similarly, package authors can use the high-performance Encoder and Core +// implementations in the zapcore package to build their own loggers. +// +// Frequently Asked Questions +// +// An FAQ covering everything from installation errors to design decisions is +// available at https://github.com/uber-go/zap/blob/master/FAQ.md. +package zap // import "go.uber.org/zap" diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/encoder.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/encoder.go new file mode 100644 index 0000000..2e9d3c3 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/encoder.go @@ -0,0 +1,75 @@ +// 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 +// 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. + +package zap + +import ( + "errors" + "fmt" + "sync" + + "go.uber.org/zap/zapcore" +) + +var ( + errNoEncoderNameSpecified = errors.New("no encoder name specified") + + _encoderNameToConstructor = map[string]func(zapcore.EncoderConfig) (zapcore.Encoder, error){ + "console": func(encoderConfig zapcore.EncoderConfig) (zapcore.Encoder, error) { + return zapcore.NewConsoleEncoder(encoderConfig), nil + }, + "json": func(encoderConfig zapcore.EncoderConfig) (zapcore.Encoder, error) { + return zapcore.NewJSONEncoder(encoderConfig), nil + }, + } + _encoderMutex sync.RWMutex +) + +// RegisterEncoder registers an encoder constructor, which the Config struct +// can then reference. By default, the "json" and "console" encoders are +// registered. +// +// Attempting to register an encoder whose name is already taken returns an +// error. +func RegisterEncoder(name string, constructor func(zapcore.EncoderConfig) (zapcore.Encoder, error)) error { + _encoderMutex.Lock() + defer _encoderMutex.Unlock() + if name == "" { + return errNoEncoderNameSpecified + } + if _, ok := _encoderNameToConstructor[name]; ok { + return fmt.Errorf("encoder already registered for name %q", name) + } + _encoderNameToConstructor[name] = constructor + return nil +} + +func newEncoder(name string, encoderConfig zapcore.EncoderConfig) (zapcore.Encoder, error) { + _encoderMutex.RLock() + defer _encoderMutex.RUnlock() + if name == "" { + return nil, errNoEncoderNameSpecified + } + constructor, ok := _encoderNameToConstructor[name] + if !ok { + return nil, fmt.Errorf("no encoder registered for name %q", name) + } + return constructor(encoderConfig) +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/encoder_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/encoder_test.go new file mode 100644 index 0000000..f6be665 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/encoder_test.go @@ -0,0 +1,88 @@ +// 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 +// 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. + +package zap + +import ( + "testing" + + "go.uber.org/zap/zapcore" + + "github.com/stretchr/testify/assert" +) + +func TestRegisterDefaultEncoders(t *testing.T) { + testEncodersRegistered(t, "console", "json") +} + +func TestRegisterEncoder(t *testing.T) { + testEncoders(func() { + assert.NoError(t, RegisterEncoder("foo", newNilEncoder), "expected to be able to register the encoder foo") + testEncodersRegistered(t, "foo") + }) +} + +func TestDuplicateRegisterEncoder(t *testing.T) { + testEncoders(func() { + RegisterEncoder("foo", newNilEncoder) + assert.Error(t, RegisterEncoder("foo", newNilEncoder), "expected an error when registering an encoder with the same name twice") + }) +} + +func TestRegisterEncoderNoName(t *testing.T) { + assert.Equal(t, errNoEncoderNameSpecified, RegisterEncoder("", newNilEncoder), "expected an error when registering an encoder with no name") +} + +func TestNewEncoder(t *testing.T) { + testEncoders(func() { + RegisterEncoder("foo", newNilEncoder) + encoder, err := newEncoder("foo", zapcore.EncoderConfig{}) + assert.NoError(t, err, "could not create an encoder for the registered name foo") + assert.Nil(t, encoder, "the encoder from newNilEncoder is not nil") + }) +} + +func TestNewEncoderNotRegistered(t *testing.T) { + _, err := newEncoder("foo", zapcore.EncoderConfig{}) + assert.Error(t, err, "expected an error when trying to create an encoder of an unregistered name") +} + +func TestNewEncoderNoName(t *testing.T) { + _, err := newEncoder("", zapcore.EncoderConfig{}) + assert.Equal(t, errNoEncoderNameSpecified, err, "expected an error when creating an encoder with no name") +} + +func testEncoders(f func()) { + existing := _encoderNameToConstructor + _encoderNameToConstructor = make(map[string]func(zapcore.EncoderConfig) (zapcore.Encoder, error)) + defer func() { _encoderNameToConstructor = existing }() + f() +} + +func testEncodersRegistered(t *testing.T, names ...string) { + assert.Len(t, _encoderNameToConstructor, len(names), "the expected number of registered encoders does not match the actual number") + for _, name := range names { + assert.NotNil(t, _encoderNameToConstructor[name], "no encoder is registered for name %s", name) + } +} + +func newNilEncoder(_ zapcore.EncoderConfig) (zapcore.Encoder, error) { + return nil, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/error.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/error.go new file mode 100644 index 0000000..2bff30d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/error.go @@ -0,0 +1,80 @@ +// Copyright (c) 2017 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. + +package zap + +import ( + "sync" + + "go.uber.org/zap/zapcore" +) + +var _errArrayElemPool = sync.Pool{New: func() interface{} { + return &errArrayElem{} +}} + +// Error is shorthand for the common idiom NamedError("error", err). +func Error(err error) zapcore.Field { + return NamedError("error", err) +} + +// NamedError constructs a field that lazily stores err.Error() under the +// provided key. Errors which also implement fmt.Formatter (like those produced +// by github.com/pkg/errors) will also have their verbose representation stored +// under key+"Verbose". If passed a nil error, the field is a no-op. +// +// For the common case in which the key is simply "error", the Error function +// is shorter and less repetitive. +func NamedError(key string, err error) zapcore.Field { + if err == nil { + return Skip() + } + return zapcore.Field{Key: key, Type: zapcore.ErrorType, Interface: err} +} + +type errArray []error + +func (errs errArray) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range errs { + if errs[i] == nil { + continue + } + // To represent each error as an object with an "error" attribute and + // potentially an "errorVerbose" attribute, we need to wrap it in a + // type that implements LogObjectMarshaler. To prevent this from + // allocating, pool the wrapper type. + elem := _errArrayElemPool.Get().(*errArrayElem) + elem.error = errs[i] + arr.AppendObject(elem) + elem.error = nil + _errArrayElemPool.Put(elem) + } + return nil +} + +type errArrayElem struct { + error +} + +func (e *errArrayElem) MarshalLogObject(enc zapcore.ObjectEncoder) error { + // Re-use the error field's logic, which supports non-standard error types. + Error(e.error).AddTo(enc) + return nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/error_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/error_test.go new file mode 100644 index 0000000..54ce4bb --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/error_test.go @@ -0,0 +1,99 @@ +// Copyright (c) 2017 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. + +package zap + +import ( + "errors" + "testing" + + "go.uber.org/zap/zapcore" + + richErrors "github.com/pkg/errors" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestErrorConstructors(t *testing.T) { + fail := errors.New("fail") + + tests := []struct { + name string + field zapcore.Field + expect zapcore.Field + }{ + {"Error", Skip(), Error(nil)}, + {"Error", zapcore.Field{Key: "error", Type: zapcore.ErrorType, Interface: fail}, Error(fail)}, + {"NamedError", Skip(), NamedError("foo", nil)}, + {"NamedError", zapcore.Field{Key: "foo", Type: zapcore.ErrorType, Interface: fail}, NamedError("foo", fail)}, + {"Any:Error", Any("k", errors.New("v")), NamedError("k", errors.New("v"))}, + {"Any:Errors", Any("k", []error{errors.New("v")}), Errors("k", []error{errors.New("v")})}, + } + + for _, tt := range tests { + if !assert.Equal(t, tt.expect, tt.field, "Unexpected output from convenience field constructor %s.", tt.name) { + t.Logf("type expected: %T\nGot: %T", tt.expect.Interface, tt.field.Interface) + } + assertCanBeReused(t, tt.field) + } +} + +func TestErrorArrayConstructor(t *testing.T) { + tests := []struct { + desc string + field zapcore.Field + expected []interface{} + }{ + {"empty errors", Errors("", []error{}), []interface{}(nil)}, + { + "errors", + Errors("", []error{nil, errors.New("foo"), nil, errors.New("bar")}), + []interface{}{map[string]interface{}{"error": "foo"}, map[string]interface{}{"error": "bar"}}, + }, + } + + for _, tt := range tests { + enc := zapcore.NewMapObjectEncoder() + tt.field.Key = "k" + tt.field.AddTo(enc) + assert.Equal(t, tt.expected, enc.Fields["k"], "%s: unexpected map contents.", tt.desc) + assert.Equal(t, 1, len(enc.Fields), "%s: found extra keys in map: %v", tt.desc, enc.Fields) + } +} + +func TestErrorsArraysHandleRichErrors(t *testing.T) { + errs := []error{richErrors.New("egad")} + + enc := zapcore.NewMapObjectEncoder() + Errors("k", errs).AddTo(enc) + assert.Equal(t, 1, len(enc.Fields), "Expected only top-level field.") + + val := enc.Fields["k"] + arr, ok := val.([]interface{}) + require.True(t, ok, "Expected top-level field to be an array.") + require.Equal(t, 1, len(arr), "Expected only one error object in array.") + + serialized := arr[0] + errMap, ok := serialized.(map[string]interface{}) + require.True(t, ok, "Expected serialized error to be a map, got %T.", serialized) + assert.Equal(t, "egad", errMap["error"], "Unexpected standard error string.") + assert.Contains(t, errMap["errorVerbose"], "egad", "Verbose error string should be a superset of standard error.") + assert.Contains(t, errMap["errorVerbose"], "TestErrorsArraysHandleRichErrors", "Verbose error string should contain a stacktrace.") +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/example_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/example_test.go new file mode 100644 index 0000000..b61f153 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/example_test.go @@ -0,0 +1,327 @@ +// 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 +// 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. + +package zap_test + +import ( + "encoding/json" + "io/ioutil" + "log" + "os" + "time" + + "go.uber.org/zap" + "go.uber.org/zap/zapcore" +) + +func Example_presets() { + // Using zap's preset constructors is the simplest way to get a feel for the + // package, but they don't allow much customization. + logger := zap.NewExample() // or NewProduction, or NewDevelopment + defer logger.Sync() + + const url = "http://example.com" + + // In most circumstances, use the SugaredLogger. It's 4-10x faster than most + // other structured logging packages and has a familiar, loosely-typed API. + sugar := logger.Sugar() + sugar.Infow("Failed to fetch URL.", + // Structured context as loosely typed key-value pairs. + "url", url, + "attempt", 3, + "backoff", time.Second, + ) + sugar.Infof("Failed to fetch URL: %s", url) + + // In the unusual situations where every microsecond matters, use the + // Logger. It's even faster than the SugaredLogger, but only supports + // structured logging. + logger.Info("Failed to fetch URL.", + // Structured context as strongly typed fields. + zap.String("url", url), + zap.Int("attempt", 3), + zap.Duration("backoff", time.Second), + ) + // Output: + // {"level":"info","msg":"Failed to fetch URL.","url":"http://example.com","attempt":3,"backoff":"1s"} + // {"level":"info","msg":"Failed to fetch URL: http://example.com"} + // {"level":"info","msg":"Failed to fetch URL.","url":"http://example.com","attempt":3,"backoff":"1s"} +} + +func Example_basicConfiguration() { + // For some users, the presets offered by the NewProduction, NewDevelopment, + // and NewExample constructors won't be appropriate. For most of those + // users, the bundled Config struct offers the right balance of flexibility + // and convenience. (For more complex needs, see the AdvancedConfiguration + // example.) + // + // See the documentation for Config and zapcore.EncoderConfig for all the + // available options. + rawJSON := []byte(`{ + "level": "debug", + "encoding": "json", + "outputPaths": ["stdout", "/tmp/logs"], + "errorOutputPaths": ["stderr"], + "initialFields": {"foo": "bar"}, + "encoderConfig": { + "messageKey": "message", + "levelKey": "level", + "levelEncoder": "lowercase" + } + }`) + + var cfg zap.Config + if err := json.Unmarshal(rawJSON, &cfg); err != nil { + panic(err) + } + logger, err := cfg.Build() + if err != nil { + panic(err) + } + defer logger.Sync() + + logger.Info("logger construction succeeded") + // Output: + // {"level":"info","message":"logger construction succeeded","foo":"bar"} +} + +func Example_advancedConfiguration() { + // The bundled Config struct only supports the most common configuration + // options. More complex needs, like splitting logs between multiple files + // or writing to non-file outputs, require use of the zapcore package. + // + // In this example, imagine we're both sending our logs to Kafka and writing + // them to the console. We'd like to encode the console output and the Kafka + // topics differently, and we'd also like special treatment for + // high-priority logs. + + // First, define our level-handling logic. + highPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool { + return lvl >= zapcore.ErrorLevel + }) + lowPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool { + return lvl < zapcore.ErrorLevel + }) + + // Assume that we have clients for two Kafka topics. The clients implement + // zapcore.WriteSyncer and are safe for concurrent use. (If they only + // implement io.Writer, we can use zapcore.AddSync to add a no-op Sync + // method. If they're not safe for concurrent use, we can add a protecting + // mutex with zapcore.Lock.) + topicDebugging := zapcore.AddSync(ioutil.Discard) + topicErrors := zapcore.AddSync(ioutil.Discard) + + // High-priority output should also go to standard error, and low-priority + // output should also go to standard out. + consoleDebugging := zapcore.Lock(os.Stdout) + consoleErrors := zapcore.Lock(os.Stderr) + + // Optimize the Kafka output for machine consumption and the console output + // for human operators. + kafkaEncoder := zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()) + consoleEncoder := zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig()) + + // Join the outputs, encoders, and level-handling functions into + // zapcore.Cores, then tee the four cores together. + core := zapcore.NewTee( + zapcore.NewCore(kafkaEncoder, topicErrors, highPriority), + zapcore.NewCore(consoleEncoder, consoleErrors, highPriority), + zapcore.NewCore(kafkaEncoder, topicDebugging, lowPriority), + zapcore.NewCore(consoleEncoder, consoleDebugging, lowPriority), + ) + + // From a zapcore.Core, it's easy to construct a Logger. + logger := zap.New(core) + defer logger.Sync() + logger.Info("constructed a logger") +} + +func ExampleNamespace() { + logger := zap.NewExample() + defer logger.Sync() + + logger.With( + zap.Namespace("metrics"), + zap.Int("counter", 1), + ).Info("tracked some metrics") + // Output: + // {"level":"info","msg":"tracked some metrics","metrics":{"counter":1}} +} + +func ExampleNewStdLog() { + logger := zap.NewExample() + defer logger.Sync() + + std := zap.NewStdLog(logger) + std.Print("standard logger wrapper") + // Output: + // {"level":"info","msg":"standard logger wrapper"} +} + +func ExampleRedirectStdLog() { + logger := zap.NewExample() + defer logger.Sync() + + undo := zap.RedirectStdLog(logger) + defer undo() + + log.Print("redirected standard library") + // Output: + // {"level":"info","msg":"redirected standard library"} +} + +func ExampleReplaceGlobals() { + logger := zap.NewExample() + defer logger.Sync() + + undo := zap.ReplaceGlobals(logger) + defer undo() + + zap.L().Info("replaced zap's global loggers") + // Output: + // {"level":"info","msg":"replaced zap's global loggers"} +} + +func ExampleAtomicLevel() { + atom := zap.NewAtomicLevel() + + // To keep the example deterministic, disable timestamps in the output. + encoderCfg := zap.NewProductionEncoderConfig() + encoderCfg.TimeKey = "" + + logger := zap.New(zapcore.NewCore( + zapcore.NewJSONEncoder(encoderCfg), + zapcore.Lock(os.Stdout), + atom, + )) + defer logger.Sync() + + logger.Info("info logging enabled") + + atom.SetLevel(zap.ErrorLevel) + logger.Info("info logging disabled") + // Output: + // {"level":"info","msg":"info logging enabled"} +} + +func ExampleAtomicLevel_config() { + // The zap.Config struct includes an AtomicLevel. To use it, keep a + // reference to the Config. + rawJSON := []byte(`{ + "level": "info", + "outputPaths": ["stdout"], + "errorOutputPaths": ["stderr"], + "encoding": "json", + "encoderConfig": { + "messageKey": "message", + "levelKey": "level", + "levelEncoder": "lowercase" + } + }`) + var cfg zap.Config + if err := json.Unmarshal(rawJSON, &cfg); err != nil { + panic(err) + } + logger, err := cfg.Build() + if err != nil { + panic(err) + } + defer logger.Sync() + + logger.Info("info logging enabled") + + cfg.Level.SetLevel(zap.ErrorLevel) + logger.Info("info logging disabled") + // Output: + // {"level":"info","message":"info logging enabled"} +} + +func ExampleLogger_Check() { + logger := zap.NewExample() + defer logger.Sync() + + if ce := logger.Check(zap.DebugLevel, "debugging"); ce != nil { + // If debug-level log output isn't enabled or if zap's sampling would have + // dropped this log entry, we don't allocate the slice that holds these + // fields. + ce.Write( + zap.String("foo", "bar"), + zap.String("baz", "quux"), + ) + } + + // Output: + // {"level":"debug","msg":"debugging","foo":"bar","baz":"quux"} +} + +func ExampleLogger_Named() { + logger := zap.NewExample() + defer logger.Sync() + + // By default, Loggers are unnamed. + logger.Info("no name") + + // The first call to Named sets the Logger name. + main := logger.Named("main") + main.Info("main logger") + + // Additional calls to Named create a period-separated path. + main.Named("subpackage").Info("sub-logger") + // Output: + // {"level":"info","msg":"no name"} + // {"level":"info","logger":"main","msg":"main logger"} + // {"level":"info","logger":"main.subpackage","msg":"sub-logger"} +} + +func ExampleWrapCore_replace() { + // Replacing a Logger's core can alter fundamental behaviors. For example, + // example, it can convert a Logger to a no-op. + nop := zap.WrapCore(func(zapcore.Core) zapcore.Core { + return zapcore.NewNopCore() + }) + + logger := zap.NewExample() + defer logger.Sync() + + logger.Info("working") + logger.WithOptions(nop).Info("no-op") + logger.Info("original logger still works") + // Output: + // {"level":"info","msg":"working"} + // {"level":"info","msg":"original logger still works"} +} + +func ExampleWrapCore_wrap() { + // Wrapping a Logger's core can extend its functionality. As a trivial + // example, it can double-write all logs. + doubled := zap.WrapCore(func(c zapcore.Core) zapcore.Core { + return zapcore.NewTee(c, c) + }) + + logger := zap.NewExample() + defer logger.Sync() + + logger.Info("single") + logger.WithOptions(doubled).Info("doubled") + // Output: + // {"level":"info","msg":"single"} + // {"level":"info","msg":"doubled"} + // {"level":"info","msg":"doubled"} +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/field.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/field.go new file mode 100644 index 0000000..20eb487 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/field.go @@ -0,0 +1,306 @@ +// 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 +// 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. + +package zap + +import ( + "fmt" + "math" + "time" + + "go.uber.org/zap/zapcore" +) + +// Skip constructs a no-op field, which is often useful when handling invalid +// inputs in other Field constructors. +func Skip() zapcore.Field { + return zapcore.Field{Type: zapcore.SkipType} +} + +// Binary constructs a field that carries an opaque binary blob. +// +// Binary data is serialized in an encoding-appropriate format. For example, +// zap's JSON encoder base64-encodes binary blobs. To log UTF-8 encoded text, +// use ByteString. +func Binary(key string, val []byte) zapcore.Field { + return zapcore.Field{Key: key, Type: zapcore.BinaryType, Interface: val} +} + +// Bool constructs a field that carries a bool. +func Bool(key string, val bool) zapcore.Field { + var ival int64 + if val { + ival = 1 + } + return zapcore.Field{Key: key, Type: zapcore.BoolType, Integer: ival} +} + +// ByteString constructs a field that carries UTF-8 encoded text as a []byte. +// To log opaque binary blobs (which aren't necessarily valid UTF-8), use +// Binary. +func ByteString(key string, val []byte) zapcore.Field { + return zapcore.Field{Key: key, Type: zapcore.ByteStringType, Interface: val} +} + +// Complex128 constructs a field that carries a complex number. Unlike most +// numeric fields, this costs an allocation (to convert the complex128 to +// interface{}). +func Complex128(key string, val complex128) zapcore.Field { + return zapcore.Field{Key: key, Type: zapcore.Complex128Type, Interface: val} +} + +// Complex64 constructs a field that carries a complex number. Unlike most +// numeric fields, this costs an allocation (to convert the complex64 to +// interface{}). +func Complex64(key string, val complex64) zapcore.Field { + return zapcore.Field{Key: key, Type: zapcore.Complex64Type, Interface: val} +} + +// Float64 constructs a field that carries a float64. The way the +// floating-point value is represented is encoder-dependent, so marshaling is +// necessarily lazy. +func Float64(key string, val float64) zapcore.Field { + return zapcore.Field{Key: key, Type: zapcore.Float64Type, Integer: int64(math.Float64bits(val))} +} + +// Float32 constructs a field that carries a float32. The way the +// floating-point value is represented is encoder-dependent, so marshaling is +// necessarily lazy. +func Float32(key string, val float32) zapcore.Field { + return zapcore.Field{Key: key, Type: zapcore.Float32Type, Integer: int64(math.Float32bits(val))} +} + +// Int constructs a field with the given key and value. +func Int(key string, val int) zapcore.Field { + return Int64(key, int64(val)) +} + +// Int64 constructs a field with the given key and value. +func Int64(key string, val int64) zapcore.Field { + return zapcore.Field{Key: key, Type: zapcore.Int64Type, Integer: val} +} + +// Int32 constructs a field with the given key and value. +func Int32(key string, val int32) zapcore.Field { + return zapcore.Field{Key: key, Type: zapcore.Int32Type, Integer: int64(val)} +} + +// Int16 constructs a field with the given key and value. +func Int16(key string, val int16) zapcore.Field { + return zapcore.Field{Key: key, Type: zapcore.Int16Type, Integer: int64(val)} +} + +// Int8 constructs a field with the given key and value. +func Int8(key string, val int8) zapcore.Field { + return zapcore.Field{Key: key, Type: zapcore.Int8Type, Integer: int64(val)} +} + +// String constructs a field with the given key and value. +func String(key string, val string) zapcore.Field { + return zapcore.Field{Key: key, Type: zapcore.StringType, String: val} +} + +// Uint constructs a field with the given key and value. +func Uint(key string, val uint) zapcore.Field { + return Uint64(key, uint64(val)) +} + +// Uint64 constructs a field with the given key and value. +func Uint64(key string, val uint64) zapcore.Field { + return zapcore.Field{Key: key, Type: zapcore.Uint64Type, Integer: int64(val)} +} + +// Uint32 constructs a field with the given key and value. +func Uint32(key string, val uint32) zapcore.Field { + return zapcore.Field{Key: key, Type: zapcore.Uint32Type, Integer: int64(val)} +} + +// Uint16 constructs a field with the given key and value. +func Uint16(key string, val uint16) zapcore.Field { + return zapcore.Field{Key: key, Type: zapcore.Uint16Type, Integer: int64(val)} +} + +// Uint8 constructs a field with the given key and value. +func Uint8(key string, val uint8) zapcore.Field { + return zapcore.Field{Key: key, Type: zapcore.Uint8Type, Integer: int64(val)} +} + +// Uintptr constructs a field with the given key and value. +func Uintptr(key string, val uintptr) zapcore.Field { + return zapcore.Field{Key: key, Type: zapcore.UintptrType, Integer: int64(val)} +} + +// Reflect constructs a field with the given key and an arbitrary object. It uses +// an encoding-appropriate, reflection-based function to lazily serialize nearly +// any object into the logging context, but it's relatively slow and +// allocation-heavy. Outside tests, Any is always a better choice. +// +// If encoding fails (e.g., trying to serialize a map[int]string to JSON), Reflect +// includes the error message in the final log output. +func Reflect(key string, val interface{}) zapcore.Field { + return zapcore.Field{Key: key, Type: zapcore.ReflectType, Interface: val} +} + +// Namespace creates a named, isolated scope within the logger's context. All +// subsequent fields will be added to the new namespace. +// +// This helps prevent key collisions when injecting loggers into sub-components +// or third-party libraries. +func Namespace(key string) zapcore.Field { + return zapcore.Field{Key: key, Type: zapcore.NamespaceType} +} + +// Stringer constructs a field with the given key and the output of the value's +// String method. The Stringer's String method is called lazily. +func Stringer(key string, val fmt.Stringer) zapcore.Field { + return zapcore.Field{Key: key, Type: zapcore.StringerType, Interface: val} +} + +// Time constructs a zapcore.Field with the given key and value. The encoder +// controls how the time is serialized. +func Time(key string, val time.Time) zapcore.Field { + return zapcore.Field{Key: key, Type: zapcore.TimeType, Integer: val.UnixNano(), Interface: val.Location()} +} + +// Stack constructs a field that stores a stacktrace of the current goroutine +// under provided key. Keep in mind that taking a stacktrace is eager and +// expensive (relatively speaking); this function both makes an allocation and +// takes about two microseconds. +func Stack(key string) zapcore.Field { + // Returning the stacktrace as a string costs an allocation, but saves us + // from expanding the zapcore.Field union struct to include a byte slice. Since + // taking a stacktrace is already so expensive (~10us), the extra allocation + // is okay. + return String(key, takeStacktrace()) +} + +// Duration constructs a field with the given key and value. The encoder +// controls how the duration is serialized. +func Duration(key string, val time.Duration) zapcore.Field { + return zapcore.Field{Key: key, Type: zapcore.DurationType, Integer: int64(val)} +} + +// Object constructs a field with the given key and ObjectMarshaler. It +// provides a flexible, but still type-safe and efficient, way to add map- or +// struct-like user-defined types to the logging context. The struct's +// MarshalLogObject method is called lazily. +func Object(key string, val zapcore.ObjectMarshaler) zapcore.Field { + return zapcore.Field{Key: key, Type: zapcore.ObjectMarshalerType, Interface: val} +} + +// Any takes a key and an arbitrary value and chooses the best way to represent +// them as a field, falling back to a reflection-based approach only if +// necessary. +// +// Since byte/uint8 and rune/int32 are aliases, Any can't differentiate between +// them. To minimize suprise, []byte values are treated as binary blobs, byte +// values are treated as uint8, and runes are always treated as integers. +func Any(key string, value interface{}) zapcore.Field { + switch val := value.(type) { + case zapcore.ObjectMarshaler: + return Object(key, val) + case zapcore.ArrayMarshaler: + return Array(key, val) + case bool: + return Bool(key, val) + case []bool: + return Bools(key, val) + case complex128: + return Complex128(key, val) + case []complex128: + return Complex128s(key, val) + case complex64: + return Complex64(key, val) + case []complex64: + return Complex64s(key, val) + case float64: + return Float64(key, val) + case []float64: + return Float64s(key, val) + case float32: + return Float32(key, val) + case []float32: + return Float32s(key, val) + case int: + return Int(key, val) + case []int: + return Ints(key, val) + case int64: + return Int64(key, val) + case []int64: + return Int64s(key, val) + case int32: + return Int32(key, val) + case []int32: + return Int32s(key, val) + case int16: + return Int16(key, val) + case []int16: + return Int16s(key, val) + case int8: + return Int8(key, val) + case []int8: + return Int8s(key, val) + case string: + return String(key, val) + case []string: + return Strings(key, val) + case uint: + return Uint(key, val) + case []uint: + return Uints(key, val) + case uint64: + return Uint64(key, val) + case []uint64: + return Uint64s(key, val) + case uint32: + return Uint32(key, val) + case []uint32: + return Uint32s(key, val) + case uint16: + return Uint16(key, val) + case []uint16: + return Uint16s(key, val) + case uint8: + return Uint8(key, val) + case []byte: + return Binary(key, val) + case uintptr: + return Uintptr(key, val) + case []uintptr: + return Uintptrs(key, val) + case time.Time: + return Time(key, val) + case []time.Time: + return Times(key, val) + case time.Duration: + return Duration(key, val) + case []time.Duration: + return Durations(key, val) + case error: + return NamedError(key, val) + case []error: + return Errors(key, val) + case fmt.Stringer: + return Stringer(key, val) + default: + return Reflect(key, val) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/field_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/field_test.go new file mode 100644 index 0000000..c13922c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/field_test.go @@ -0,0 +1,159 @@ +// 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 +// 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. + +package zap + +import ( + "net" + "sync" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "go.uber.org/zap/zapcore" +) + +type username string + +func (n username) MarshalLogObject(enc zapcore.ObjectEncoder) error { + enc.AddString("username", string(n)) + return nil +} + +func assertCanBeReused(t testing.TB, field zapcore.Field) { + var wg sync.WaitGroup + + for i := 0; i < 100; i++ { + enc := zapcore.NewMapObjectEncoder() + + // Ensure using the field in multiple encoders in separate goroutines + // does not cause any races or panics. + wg.Add(1) + go func() { + defer wg.Done() + assert.NotPanics(t, func() { + field.AddTo(enc) + }, "Reusing a field should not cause issues") + }() + } + + wg.Wait() +} + +func TestFieldConstructors(t *testing.T) { + // Interface types. + addr := net.ParseIP("1.2.3.4") + name := username("phil") + ints := []int{5, 6} + + tests := []struct { + name string + field zapcore.Field + expect zapcore.Field + }{ + {"Skip", zapcore.Field{Type: zapcore.SkipType}, Skip()}, + {"Binary", zapcore.Field{Key: "k", Type: zapcore.BinaryType, Interface: []byte("ab12")}, Binary("k", []byte("ab12"))}, + {"Bool", zapcore.Field{Key: "k", Type: zapcore.BoolType, Integer: 1}, Bool("k", true)}, + {"Bool", zapcore.Field{Key: "k", Type: zapcore.BoolType, Integer: 1}, Bool("k", true)}, + {"ByteString", zapcore.Field{Key: "k", Type: zapcore.ByteStringType, Interface: []byte("ab12")}, ByteString("k", []byte("ab12"))}, + {"Complex128", zapcore.Field{Key: "k", Type: zapcore.Complex128Type, Interface: 1 + 2i}, Complex128("k", 1+2i)}, + {"Complex64", zapcore.Field{Key: "k", Type: zapcore.Complex64Type, Interface: complex64(1 + 2i)}, Complex64("k", 1+2i)}, + {"Duration", zapcore.Field{Key: "k", Type: zapcore.DurationType, Integer: 1}, Duration("k", 1)}, + {"Int", zapcore.Field{Key: "k", Type: zapcore.Int64Type, Integer: 1}, Int("k", 1)}, + {"Int64", zapcore.Field{Key: "k", Type: zapcore.Int64Type, Integer: 1}, Int64("k", 1)}, + {"Int32", zapcore.Field{Key: "k", Type: zapcore.Int32Type, Integer: 1}, Int32("k", 1)}, + {"Int16", zapcore.Field{Key: "k", Type: zapcore.Int16Type, Integer: 1}, Int16("k", 1)}, + {"Int8", zapcore.Field{Key: "k", Type: zapcore.Int8Type, Integer: 1}, Int8("k", 1)}, + {"String", zapcore.Field{Key: "k", Type: zapcore.StringType, String: "foo"}, String("k", "foo")}, + {"Time", zapcore.Field{Key: "k", Type: zapcore.TimeType, Integer: 0, Interface: time.UTC}, Time("k", time.Unix(0, 0).In(time.UTC))}, + {"Time", zapcore.Field{Key: "k", Type: zapcore.TimeType, Integer: 1000, Interface: time.UTC}, Time("k", time.Unix(0, 1000).In(time.UTC))}, + {"Uint", zapcore.Field{Key: "k", Type: zapcore.Uint64Type, Integer: 1}, Uint("k", 1)}, + {"Uint64", zapcore.Field{Key: "k", Type: zapcore.Uint64Type, Integer: 1}, Uint64("k", 1)}, + {"Uint32", zapcore.Field{Key: "k", Type: zapcore.Uint32Type, Integer: 1}, Uint32("k", 1)}, + {"Uint16", zapcore.Field{Key: "k", Type: zapcore.Uint16Type, Integer: 1}, Uint16("k", 1)}, + {"Uint8", zapcore.Field{Key: "k", Type: zapcore.Uint8Type, Integer: 1}, Uint8("k", 1)}, + {"Uintptr", zapcore.Field{Key: "k", Type: zapcore.UintptrType, Integer: 10}, Uintptr("k", 0xa)}, + {"Reflect", zapcore.Field{Key: "k", Type: zapcore.ReflectType, Interface: ints}, Reflect("k", ints)}, + {"Stringer", zapcore.Field{Key: "k", Type: zapcore.StringerType, Interface: addr}, Stringer("k", addr)}, + {"Object", zapcore.Field{Key: "k", Type: zapcore.ObjectMarshalerType, Interface: name}, Object("k", name)}, + {"Any:ObjectMarshaler", Any("k", name), Object("k", name)}, + {"Any:ArrayMarshaler", Any("k", bools([]bool{true})), Array("k", bools([]bool{true}))}, + {"Any:Stringer", Any("k", addr), Stringer("k", addr)}, + {"Any:Bool", Any("k", true), Bool("k", true)}, + {"Any:Bools", Any("k", []bool{true}), Bools("k", []bool{true})}, + {"Any:Byte", Any("k", byte(1)), Uint8("k", 1)}, + {"Any:Bytes", Any("k", []byte{1}), Binary("k", []byte{1})}, + {"Any:Complex128", Any("k", 1+2i), Complex128("k", 1+2i)}, + {"Any:Complex128s", Any("k", []complex128{1 + 2i}), Complex128s("k", []complex128{1 + 2i})}, + {"Any:Complex64", Any("k", complex64(1+2i)), Complex64("k", 1+2i)}, + {"Any:Complex64s", Any("k", []complex64{1 + 2i}), Complex64s("k", []complex64{1 + 2i})}, + {"Any:Float64", Any("k", 3.14), Float64("k", 3.14)}, + {"Any:Float64s", Any("k", []float64{3.14}), Float64s("k", []float64{3.14})}, + {"Any:Float32", Any("k", float32(3.14)), Float32("k", 3.14)}, + {"Any:Float32s", Any("k", []float32{3.14}), Float32s("k", []float32{3.14})}, + {"Any:Int", Any("k", 1), Int("k", 1)}, + {"Any:Ints", Any("k", []int{1}), Ints("k", []int{1})}, + {"Any:Int64", Any("k", int64(1)), Int64("k", 1)}, + {"Any:Int64s", Any("k", []int64{1}), Int64s("k", []int64{1})}, + {"Any:Int32", Any("k", int32(1)), Int32("k", 1)}, + {"Any:Int32s", Any("k", []int32{1}), Int32s("k", []int32{1})}, + {"Any:Int16", Any("k", int16(1)), Int16("k", 1)}, + {"Any:Int16s", Any("k", []int16{1}), Int16s("k", []int16{1})}, + {"Any:Int8", Any("k", int8(1)), Int8("k", 1)}, + {"Any:Int8s", Any("k", []int8{1}), Int8s("k", []int8{1})}, + {"Any:Rune", Any("k", rune(1)), Int32("k", 1)}, + {"Any:Runes", Any("k", []rune{1}), Int32s("k", []int32{1})}, + {"Any:String", Any("k", "v"), String("k", "v")}, + {"Any:Strings", Any("k", []string{"v"}), Strings("k", []string{"v"})}, + {"Any:Uint", Any("k", uint(1)), Uint("k", 1)}, + {"Any:Uints", Any("k", []uint{1}), Uints("k", []uint{1})}, + {"Any:Uint64", Any("k", uint64(1)), Uint64("k", 1)}, + {"Any:Uint64s", Any("k", []uint64{1}), Uint64s("k", []uint64{1})}, + {"Any:Uint32", Any("k", uint32(1)), Uint32("k", 1)}, + {"Any:Uint32s", Any("k", []uint32{1}), Uint32s("k", []uint32{1})}, + {"Any:Uint16", Any("k", uint16(1)), Uint16("k", 1)}, + {"Any:Uint16s", Any("k", []uint16{1}), Uint16s("k", []uint16{1})}, + {"Any:Uint8", Any("k", uint8(1)), Uint8("k", 1)}, + {"Any:Uint8s", Any("k", []uint8{1}), Binary("k", []uint8{1})}, + {"Any:Uintptr", Any("k", uintptr(1)), Uintptr("k", 1)}, + {"Any:Uintptrs", Any("k", []uintptr{1}), Uintptrs("k", []uintptr{1})}, + {"Any:Time", Any("k", time.Unix(0, 0)), Time("k", time.Unix(0, 0))}, + {"Any:Times", Any("k", []time.Time{time.Unix(0, 0)}), Times("k", []time.Time{time.Unix(0, 0)})}, + {"Any:Duration", Any("k", time.Second), Duration("k", time.Second)}, + {"Any:Durations", Any("k", []time.Duration{time.Second}), Durations("k", []time.Duration{time.Second})}, + {"Any:Fallback", Any("k", struct{}{}), Reflect("k", struct{}{})}, + {"Namespace", Namespace("k"), zapcore.Field{Key: "k", Type: zapcore.NamespaceType}}, + } + + for _, tt := range tests { + if !assert.Equal(t, tt.expect, tt.field, "Unexpected output from convenience field constructor %s.", tt.name) { + t.Logf("type expected: %T\nGot: %T", tt.expect.Interface, tt.field.Interface) + } + assertCanBeReused(t, tt.field) + } +} + +func TestStackField(t *testing.T) { + f := Stack("stacktrace") + assert.Equal(t, "stacktrace", f.Key, "Unexpected field key.") + assert.Equal(t, zapcore.StringType, f.Type, "Unexpected field type.") + assert.Equal(t, takeStacktrace(), f.String, "Unexpected stack trace") + assertCanBeReused(t, f) +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/flag.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/flag.go new file mode 100644 index 0000000..1312875 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/flag.go @@ -0,0 +1,39 @@ +// 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 +// 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. + +package zap + +import ( + "flag" + + "go.uber.org/zap/zapcore" +) + +// LevelFlag uses the standard library's flag.Var to declare a global flag +// with the specified name, default, and usage guidance. The returned value is +// a pointer to the value of the flag. +// +// If you don't want to use the flag package's global state, you can use any +// non-nil *Level as a flag.Value with your own *flag.FlagSet. +func LevelFlag(name string, defaultLevel zapcore.Level, usage string) *zapcore.Level { + lvl := defaultLevel + flag.Var(&lvl, name, usage) + return &lvl +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/flag_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/flag_test.go new file mode 100644 index 0000000..b169894 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/flag_test.go @@ -0,0 +1,102 @@ +// 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 +// 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. + +package zap + +import ( + "flag" + "io/ioutil" + "testing" + + "go.uber.org/zap/zapcore" + + "github.com/stretchr/testify/assert" +) + +type flagTestCase struct { + args []string + wantLevel zapcore.Level + wantErr bool +} + +func (tc flagTestCase) runImplicitSet(t testing.TB) { + origCommandLine := flag.CommandLine + flag.CommandLine = flag.NewFlagSet("test", flag.ContinueOnError) + flag.CommandLine.SetOutput(ioutil.Discard) + defer func() { flag.CommandLine = origCommandLine }() + + level := LevelFlag("level", InfoLevel, "") + tc.run(t, flag.CommandLine, level) +} + +func (tc flagTestCase) runExplicitSet(t testing.TB) { + var lvl zapcore.Level + set := flag.NewFlagSet("test", flag.ContinueOnError) + set.Var(&lvl, "level", "minimum enabled logging level") + tc.run(t, set, &lvl) +} + +func (tc flagTestCase) run(t testing.TB, set *flag.FlagSet, actual *zapcore.Level) { + err := set.Parse(tc.args) + if tc.wantErr { + assert.Error(t, err, "Parse(%v) should fail.", tc.args) + return + } + if assert.NoError(t, err, "Parse(%v) should succeed.", tc.args) { + assert.Equal(t, tc.wantLevel, *actual, "Level mismatch.") + } +} + +func TestLevelFlag(t *testing.T) { + tests := []flagTestCase{ + { + args: nil, + wantLevel: zapcore.InfoLevel, + }, + { + args: []string{"--level", "unknown"}, + wantErr: true, + }, + { + args: []string{"--level", "error"}, + wantLevel: zapcore.ErrorLevel, + }, + } + + for _, tt := range tests { + tt.runExplicitSet(t) + tt.runImplicitSet(t) + } +} + +func TestLevelFlagsAreIndependent(t *testing.T) { + origCommandLine := flag.CommandLine + flag.CommandLine = flag.NewFlagSet("test", flag.ContinueOnError) + flag.CommandLine.SetOutput(ioutil.Discard) + defer func() { flag.CommandLine = origCommandLine }() + + // Make sure that these two flags are independent. + fileLevel := LevelFlag("file-level", InfoLevel, "") + consoleLevel := LevelFlag("console-level", InfoLevel, "") + + assert.NoError(t, flag.CommandLine.Parse([]string{"-file-level", "debug"}), "Unexpected flag-parsing error.") + assert.Equal(t, InfoLevel, *consoleLevel, "Expected file logging level to remain unchanged.") + assert.Equal(t, DebugLevel, *fileLevel, "Expected console logging level to have changed.") +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/glide.lock b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/glide.lock new file mode 100644 index 0000000..881b462 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/glide.lock @@ -0,0 +1,76 @@ +hash: f073ba522c06c88ea3075bde32a8aaf0969a840a66cab6318a0897d141ffee92 +updated: 2017-07-22T18:06:49.598185334-07:00 +imports: +- name: go.uber.org/atomic + version: 4e336646b2ef9fc6e47be8e21594178f98e5ebcf +- name: go.uber.org/multierr + version: 3c4937480c32f4c13a875a1829af76c98ca3d40a +testImports: +- name: github.com/apex/log + version: d9b960447bfa720077b2da653cc79e533455b499 + subpackages: + - handlers/json +- name: github.com/axw/gocov + version: 3a69a0d2a4ef1f263e2d92b041a69593d6964fe8 + subpackages: + - gocov +- name: github.com/davecgh/go-spew + version: 04cdfd42973bb9c8589fd6a731800cf222fde1a9 + subpackages: + - spew +- name: github.com/fatih/color + version: 62e9147c64a1ed519147b62a56a14e83e2be02c1 +- name: github.com/go-kit/kit + version: e10f5bf035be9af21fd5b2fb4469d5716c6ab07d + subpackages: + - log +- name: github.com/go-logfmt/logfmt + version: 390ab7935ee28ec6b286364bba9b4dd6410cb3d5 +- name: github.com/go-stack/stack + version: 54be5f394ed2c3e19dac9134a40a95ba5a017f7b +- name: github.com/golang/lint + version: c5fb716d6688a859aae56d26d3e6070808df29f7 + subpackages: + - golint +- name: github.com/kr/logfmt + version: b84e30acd515aadc4b783ad4ff83aff3299bdfe0 +- name: github.com/mattn/go-colorable + version: 3fa8c76f9daed4067e4a806fb7e4dc86455c6d6a +- name: github.com/mattn/go-isatty + version: fc9e8d8ef48496124e79ae0df75490096eccf6fe +- name: github.com/mattn/goveralls + version: 6efce81852ad1b7567c17ad71b03aeccc9dd9ae0 +- name: github.com/pborman/uuid + version: e790cca94e6cc75c7064b1332e63811d4aae1a53 +- name: github.com/pkg/errors + version: 645ef00459ed84a119197bfb8d8205042c6df63d +- name: github.com/pmezard/go-difflib + version: d8ed2627bdf02c080bf22230dbb337003b7aba2d + subpackages: + - difflib +- name: github.com/rs/zerolog + version: eed4c2b94d945e0b2456ad6aa518a443986b5f22 +- name: github.com/satori/go.uuid + version: 5bf94b69c6b68ee1b541973bb8e1144db23a194b +- name: github.com/sirupsen/logrus + version: 7dd06bf38e1e13df288d471a57d5adbac106be9e +- name: github.com/stretchr/testify + version: f6abca593680b2315d2075e0f5e2a9751e3f431a + subpackages: + - assert + - require +- name: go.pedge.io/lion + version: 87958e8713f1fa138d993087133b97e976642159 +- name: golang.org/x/sys + version: c4489faa6e5ab84c0ef40d6ee878f7a030281f0f + subpackages: + - unix +- name: golang.org/x/tools + version: 496819729719f9d07692195e0a94d6edd2251389 + subpackages: + - cover +- name: gopkg.in/inconshreveable/log15.v2 + version: b105bd37f74e5d9dc7b6ad7806715c7a2b83fd3f + subpackages: + - stack + - term diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/glide.yaml b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/glide.yaml new file mode 100644 index 0000000..9441259 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/glide.yaml @@ -0,0 +1,35 @@ +package: go.uber.org/zap +license: MIT +import: +- package: go.uber.org/atomic + version: ^1 +- package: go.uber.org/multierr + version: ^1 +testImport: +- package: github.com/satori/go.uuid +- package: github.com/sirupsen/logrus +- package: github.com/apex/log + subpackages: + - handlers/json +- package: github.com/go-kit/kit + subpackages: + - log +- package: github.com/stretchr/testify + subpackages: + - assert + - require +- package: gopkg.in/inconshreveable/log15.v2 +- package: github.com/mattn/goveralls +- package: github.com/pborman/uuid +- package: github.com/pkg/errors +- package: go.pedge.io/lion +- package: github.com/rs/zerolog +- package: golang.org/x/tools + subpackages: + - cover +- package: github.com/golang/lint + subpackages: + - golint +- package: github.com/axw/gocov + subpackages: + - gocov diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/global.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/global.go new file mode 100644 index 0000000..d345455 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/global.go @@ -0,0 +1,139 @@ +// 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 +// 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. + +package zap + +import ( + "bytes" + "fmt" + "log" + "os" + "sync" + + "go.uber.org/zap/zapcore" +) + +const ( + _stdLogDefaultDepth = 2 + _loggerWriterDepth = 2 +) + +var ( + _globalMu sync.RWMutex + _globalL = NewNop() + _globalS = _globalL.Sugar() +) + +// L returns the global Logger, which can be reconfigured with ReplaceGlobals. +// It's safe for concurrent use. +func L() *Logger { + _globalMu.RLock() + l := _globalL + _globalMu.RUnlock() + return l +} + +// S returns the global SugaredLogger, which can be reconfigured with +// ReplaceGlobals. It's safe for concurrent use. +func S() *SugaredLogger { + _globalMu.RLock() + s := _globalS + _globalMu.RUnlock() + return s +} + +// ReplaceGlobals replaces the global Logger and SugaredLogger, and returns a +// function to restore the original values. It's safe for concurrent use. +func ReplaceGlobals(logger *Logger) func() { + _globalMu.Lock() + prev := _globalL + _globalL = logger + _globalS = logger.Sugar() + _globalMu.Unlock() + return func() { ReplaceGlobals(prev) } +} + +// NewStdLog returns a *log.Logger which writes to the supplied zap Logger at +// InfoLevel. To redirect the standard library's package-global logging +// functions, use RedirectStdLog instead. +func NewStdLog(l *Logger) *log.Logger { + logger := l.WithOptions(AddCallerSkip(_stdLogDefaultDepth + _loggerWriterDepth)) + f := logger.Info + return log.New(&loggerWriter{f}, "" /* prefix */, 0 /* flags */) +} + +// NewStdLogAt returns *log.Logger which writes to supplied zap logger at +// required level. +func NewStdLogAt(l *Logger, level zapcore.Level) (*log.Logger, error) { + logger := l.WithOptions(AddCallerSkip(_stdLogDefaultDepth + _loggerWriterDepth)) + var logFunc func(string, ...zapcore.Field) + switch level { + case DebugLevel: + logFunc = logger.Debug + case InfoLevel: + logFunc = logger.Info + case WarnLevel: + logFunc = logger.Warn + case ErrorLevel: + logFunc = logger.Error + case DPanicLevel: + logFunc = logger.DPanic + case PanicLevel: + logFunc = logger.Panic + case FatalLevel: + logFunc = logger.Fatal + default: + return nil, fmt.Errorf("unrecognized level: %q", level) + } + return log.New(&loggerWriter{logFunc}, "" /* prefix */, 0 /* flags */), nil +} + +// RedirectStdLog redirects output from the standard library's package-global +// logger to the supplied logger at InfoLevel. Since zap already handles caller +// annotations, timestamps, etc., it automatically disables the standard +// library's annotations and prefixing. +// +// It returns a function to restore the original prefix and flags and reset the +// standard library's output to os.Stdout. +func RedirectStdLog(l *Logger) func() { + flags := log.Flags() + prefix := log.Prefix() + log.SetFlags(0) + log.SetPrefix("") + logFunc := l.WithOptions( + AddCallerSkip(_stdLogDefaultDepth + _loggerWriterDepth), + ).Info + log.SetOutput(&loggerWriter{logFunc}) + return func() { + log.SetFlags(flags) + log.SetPrefix(prefix) + log.SetOutput(os.Stderr) + } +} + +type loggerWriter struct { + logFunc func(msg string, fields ...zapcore.Field) +} + +func (l *loggerWriter) Write(p []byte) (int, error) { + p = bytes.TrimSpace(p) + l.logFunc(string(p)) + return len(p), nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/global_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/global_test.go new file mode 100644 index 0000000..7da3b94 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/global_test.go @@ -0,0 +1,189 @@ +// 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 +// 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. + +package zap + +import ( + "log" + "sync" + "testing" + "time" + + "go.uber.org/zap/internal/exit" + + "go.uber.org/zap/zapcore" + "go.uber.org/zap/zaptest" + "go.uber.org/zap/zaptest/observer" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.uber.org/atomic" +) + +func TestReplaceGlobals(t *testing.T) { + initialL := *L() + initialS := *S() + + withLogger(t, DebugLevel, nil, func(l *Logger, logs *observer.ObservedLogs) { + L().Info("no-op") + S().Info("no-op") + assert.Equal(t, 0, logs.Len(), "Expected initial logs to go to default no-op global.") + + defer ReplaceGlobals(l)() + + L().Info("captured") + S().Info("captured") + expected := observer.LoggedEntry{ + Entry: zapcore.Entry{Message: "captured"}, + Context: []zapcore.Field{}, + } + assert.Equal( + t, + []observer.LoggedEntry{expected, expected}, + logs.AllUntimed(), + "Unexpected global log output.", + ) + }) + + assert.Equal(t, initialL, *L(), "Expected func returned from ReplaceGlobals to restore initial L.") + assert.Equal(t, initialS, *S(), "Expected func returned from ReplaceGlobals to restore initial S.") +} + +func TestGlobalsConcurrentUse(t *testing.T) { + var ( + stop atomic.Bool + wg sync.WaitGroup + ) + + for i := 0; i < 100; i++ { + wg.Add(2) + go func() { + for !stop.Load() { + ReplaceGlobals(NewNop()) + } + wg.Done() + }() + go func() { + for !stop.Load() { + L().With(Int("foo", 42)).Named("main").WithOptions(Development()).Info("") + S().Info("") + } + wg.Done() + }() + } + + zaptest.Sleep(100 * time.Millisecond) + stop.Toggle() + wg.Wait() +} + +func TestNewStdLog(t *testing.T) { + withLogger(t, DebugLevel, []Option{AddCaller()}, func(l *Logger, logs *observer.ObservedLogs) { + std := NewStdLog(l) + std.Print("redirected") + checkStdLogMessage(t, "redirected", logs) + }) +} + +func TestNewStdLogAt(t *testing.T) { + // include DPanicLevel here, but do not include Development in options + levels := []zapcore.Level{DebugLevel, InfoLevel, WarnLevel, ErrorLevel, DPanicLevel} + for _, level := range levels { + withLogger(t, DebugLevel, []Option{AddCaller()}, func(l *Logger, logs *observer.ObservedLogs) { + std, err := NewStdLogAt(l, level) + require.NoError(t, err, "Unexpected error.") + std.Print("redirected") + checkStdLogMessage(t, "redirected", logs) + }) + } +} + +func TestNewStdLogAtPanics(t *testing.T) { + // include DPanicLevel here and enable Development in options + levels := []zapcore.Level{DPanicLevel, PanicLevel} + for _, level := range levels { + withLogger(t, DebugLevel, []Option{AddCaller(), Development()}, func(l *Logger, logs *observer.ObservedLogs) { + std, err := NewStdLogAt(l, level) + require.NoError(t, err, "Unexpected error") + assert.Panics(t, func() { std.Print("redirected") }, "Expected log to panic.") + checkStdLogMessage(t, "redirected", logs) + }) + } +} + +func TestNewStdLogAtFatal(t *testing.T) { + withLogger(t, DebugLevel, []Option{AddCaller()}, func(l *Logger, logs *observer.ObservedLogs) { + stub := exit.WithStub(func() { + std, err := NewStdLogAt(l, FatalLevel) + require.NoError(t, err, "Unexpected error.") + std.Print("redirected") + checkStdLogMessage(t, "redirected", logs) + }) + assert.True(t, true, stub.Exited, "Expected Fatal logger call to terminate process.") + stub.Unstub() + }) +} + +func TestNewStdLogAtInvalid(t *testing.T) { + _, err := NewStdLogAt(NewNop(), zapcore.Level(99)) + assert.Error(t, err, "Expected to get error.") + assert.Contains(t, err.Error(), "99", "Expected level code in error message") +} + +func TestRedirectStdLog(t *testing.T) { + initialFlags := log.Flags() + initialPrefix := log.Prefix() + + withLogger(t, DebugLevel, nil, func(l *Logger, logs *observer.ObservedLogs) { + defer RedirectStdLog(l)() + log.Print("redirected") + + assert.Equal(t, []observer.LoggedEntry{{ + Entry: zapcore.Entry{Message: "redirected"}, + Context: []zapcore.Field{}, + }}, logs.AllUntimed(), "Unexpected global log output.") + }) + + assert.Equal(t, initialFlags, log.Flags(), "Expected to reset initial flags.") + assert.Equal(t, initialPrefix, log.Prefix(), "Expected to reset initial prefix.") +} + +func TestRedirectStdLogCaller(t *testing.T) { + withLogger(t, DebugLevel, []Option{AddCaller()}, func(l *Logger, logs *observer.ObservedLogs) { + defer RedirectStdLog(l)() + log.Print("redirected") + entries := logs.All() + require.Len(t, entries, 1, "Unexpected number of logs.") + assert.Contains(t, entries[0].Entry.Caller.File, "global_test.go", "Unexpected caller annotation.") + }) +} + +func checkStdLogMessage(t *testing.T, msg string, logs *observer.ObservedLogs) { + require.Equal(t, 1, logs.Len(), "Expected exactly one entry to be logged") + entry := logs.AllUntimed()[0] + assert.Equal(t, []zapcore.Field{}, entry.Context, "Unexpected entry context.") + assert.Equal(t, "redirected", entry.Entry.Message, "Unexpected entry message.") + assert.Regexp( + t, + `go.uber.org/zap/global_test.go:\d+$`, + entry.Entry.Caller.String(), + "Unexpected caller annotation.", + ) +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/http_handler.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/http_handler.go new file mode 100644 index 0000000..f171c38 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/http_handler.go @@ -0,0 +1,81 @@ +// 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 +// 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. + +package zap + +import ( + "encoding/json" + "fmt" + "net/http" + + "go.uber.org/zap/zapcore" +) + +// ServeHTTP is a simple JSON endpoint that can report on or change the current +// logging level. +// +// GET requests return a JSON description of the current logging level. PUT +// requests change the logging level and expect a payload like: +// {"level":"info"} +// +// It's perfectly safe to change the logging level while a program is running. +func (lvl AtomicLevel) ServeHTTP(w http.ResponseWriter, r *http.Request) { + type errorResponse struct { + Error string `json:"error"` + } + type payload struct { + Level *zapcore.Level `json:"level"` + } + + enc := json.NewEncoder(w) + + switch r.Method { + + case "GET": + current := lvl.Level() + enc.Encode(payload{Level: ¤t}) + + case "PUT": + var req payload + + if errmess := func() string { + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + return fmt.Sprintf("Request body must be well-formed JSON: %v", err) + } + if req.Level == nil { + return "Must specify a logging level." + } + return "" + }(); errmess != "" { + w.WriteHeader(http.StatusBadRequest) + enc.Encode(errorResponse{Error: errmess}) + return + } + + lvl.SetLevel(*req.Level) + enc.Encode(req) + + default: + w.WriteHeader(http.StatusMethodNotAllowed) + enc.Encode(errorResponse{ + Error: "Only GET and PUT are supported.", + }) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/http_handler_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/http_handler_test.go new file mode 100644 index 0000000..474b3c7 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/http_handler_test.go @@ -0,0 +1,131 @@ +// 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 +// 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. + +package zap_test + +import ( + "encoding/json" + "fmt" + "io" + "io/ioutil" + "net/http" + "net/http/httptest" + "strings" + "testing" + + . "go.uber.org/zap" + "go.uber.org/zap/zapcore" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func newHandler() (AtomicLevel, *Logger) { + lvl := NewAtomicLevel() + logger := New(zapcore.NewNopCore()) + return lvl, logger +} + +func assertCodeOK(t testing.TB, code int) { + assert.Equal(t, http.StatusOK, code, "Unexpected response status code.") +} + +func assertCodeBadRequest(t testing.TB, code int) { + assert.Equal(t, http.StatusBadRequest, code, "Unexpected response status code.") +} + +func assertCodeMethodNotAllowed(t testing.TB, code int) { + assert.Equal(t, http.StatusMethodNotAllowed, code, "Unexpected response status code.") +} + +func assertResponse(t testing.TB, expectedLevel zapcore.Level, actualBody string) { + assert.Equal(t, fmt.Sprintf(`{"level":"%s"}`, expectedLevel)+"\n", actualBody, "Unexpected response body.") +} + +func assertJSONError(t testing.TB, body string) { + // Don't need to test exact error message, but one should be present. + var payload map[string]interface{} + require.NoError(t, json.Unmarshal([]byte(body), &payload), "Expected error response to be JSON.") + + msg, ok := payload["error"] + require.True(t, ok, "Error message is an unexpected type.") + assert.NotEqual(t, "", msg, "Expected an error message in response.") +} + +func makeRequest(t testing.TB, method string, handler http.Handler, reader io.Reader) (int, string) { + ts := httptest.NewServer(handler) + defer ts.Close() + + req, err := http.NewRequest(method, ts.URL, reader) + require.NoError(t, err, "Error constructing %s request.", method) + + res, err := http.DefaultClient.Do(req) + require.NoError(t, err, "Error making %s request.", method) + defer res.Body.Close() + + body, err := ioutil.ReadAll(res.Body) + require.NoError(t, err, "Error reading request body.") + + return res.StatusCode, string(body) +} + +func TestHTTPHandlerGetLevel(t *testing.T) { + lvl, _ := newHandler() + code, body := makeRequest(t, "GET", lvl, nil) + assertCodeOK(t, code) + assertResponse(t, lvl.Level(), body) +} + +func TestHTTPHandlerPutLevel(t *testing.T) { + lvl, _ := newHandler() + + code, body := makeRequest(t, "PUT", lvl, strings.NewReader(`{"level":"warn"}`)) + + assertCodeOK(t, code) + assertResponse(t, lvl.Level(), body) +} + +func TestHTTPHandlerPutUnrecognizedLevel(t *testing.T) { + lvl, _ := newHandler() + code, body := makeRequest(t, "PUT", lvl, strings.NewReader(`{"level":"unrecognized-level"}`)) + assertCodeBadRequest(t, code) + assertJSONError(t, body) +} + +func TestHTTPHandlerNotJSON(t *testing.T) { + lvl, _ := newHandler() + code, body := makeRequest(t, "PUT", lvl, strings.NewReader(`{`)) + assertCodeBadRequest(t, code) + assertJSONError(t, body) +} + +func TestHTTPHandlerNoLevelSpecified(t *testing.T) { + lvl, _ := newHandler() + code, body := makeRequest(t, "PUT", lvl, strings.NewReader(`{}`)) + assertCodeBadRequest(t, code) + assertJSONError(t, body) +} + +func TestHTTPHandlerMethodNotAllowed(t *testing.T) { + lvl, _ := newHandler() + code, body := makeRequest(t, "POST", lvl, strings.NewReader(`{`)) + assertCodeMethodNotAllowed(t, code) + assertJSONError(t, body) +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/internal/bufferpool/bufferpool.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/internal/bufferpool/bufferpool.go new file mode 100644 index 0000000..dad583a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/internal/bufferpool/bufferpool.go @@ -0,0 +1,31 @@ +// 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 +// 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. + +// Package bufferpool houses zap's shared internal buffer pool. Third-party +// packages can recreate the same functionality with buffers.NewPool. +package bufferpool + +import "go.uber.org/zap/buffer" + +var ( + _pool = buffer.NewPool() + // Get retrieves a buffer from the pool, creating one if necessary. + Get = _pool.Get +) diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/internal/color/color.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/internal/color/color.go new file mode 100644 index 0000000..c4d5d02 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/internal/color/color.go @@ -0,0 +1,44 @@ +// 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 +// 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. + +// Package color adds coloring functionality for TTY output. +package color + +import "fmt" + +// Foreground colors. +const ( + Black Color = iota + 30 + Red + Green + Yellow + Blue + Magenta + Cyan + White +) + +// Color represents a text color. +type Color uint8 + +// Add adds the coloring to the given string. +func (c Color) Add(s string) string { + return fmt.Sprintf("\x1b[%dm%s\x1b[0m", uint8(c), s) +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/internal/color/color_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/internal/color/color_test.go new file mode 100644 index 0000000..4982903 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/internal/color/color_test.go @@ -0,0 +1,36 @@ +// 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 +// 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. + +package color + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestColorFormatting(t *testing.T) { + assert.Equal( + t, + "\x1b[31mfoo\x1b[0m", + Red.Add("foo"), + "Unexpected colored output.", + ) +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/internal/exit/exit.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/internal/exit/exit.go new file mode 100644 index 0000000..dfc5b05 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/internal/exit/exit.go @@ -0,0 +1,64 @@ +// 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 +// 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. + +// Package exit provides stubs so that unit tests can exercise code that calls +// os.Exit(1). +package exit + +import "os" + +var real = func() { os.Exit(1) } + +// Exit normally terminates the process by calling os.Exit(1). If the package +// is stubbed, it instead records a call in the testing spy. +func Exit() { + real() +} + +// A StubbedExit is a testing fake for os.Exit. +type StubbedExit struct { + Exited bool + prev func() +} + +// Stub substitutes a fake for the call to os.Exit(1). +func Stub() *StubbedExit { + s := &StubbedExit{prev: real} + real = s.exit + return s +} + +// WithStub runs the supplied function with Exit stubbed. It returns the stub +// used, so that users can test whether the process would have crashed. +func WithStub(f func()) *StubbedExit { + s := Stub() + defer s.Unstub() + f() + return s +} + +// Unstub restores the previous exit function. +func (se *StubbedExit) Unstub() { + real = se.prev +} + +func (se *StubbedExit) exit() { + se.Exited = true +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/internal/exit/exit_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/internal/exit/exit_test.go new file mode 100644 index 0000000..300cdc3 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/internal/exit/exit_test.go @@ -0,0 +1,42 @@ +// 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 +// 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. + +package exit + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestStub(t *testing.T) { + tests := []struct { + f func() + want bool + }{ + {Exit, true}, + {func() {}, false}, + } + + for _, tt := range tests { + s := WithStub(tt.f) + assert.Equal(t, tt.want, s.Exited, "Stub captured unexpected exit value.") + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/internal/readme/readme.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/internal/readme/readme.go new file mode 100644 index 0000000..903a4e1 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/internal/readme/readme.go @@ -0,0 +1,212 @@ +// 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 +// 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. + +package main + +import ( + "flag" + "fmt" + "io/ioutil" + "log" + "os" + "os/exec" + "sort" + "strconv" + "strings" + "text/template" + "time" +) + +var ( + libraryNameToMarkdownName = map[string]string{ + "Zap": ":zap: zap", + "Zap.Sugar": ":zap: zap (sugared)", + "stdlib.Println": "standard library", + "sirupsen/logrus": "logrus", + "go-kit/kit/log": "go-kit", + "inconshreveable/log15": "log15", + "apex/log": "apex/log", + "go.pedge.io/lion": "lion", + "rs/zerolog": "zerolog", + } +) + +func main() { + flag.Parse() + if err := do(); err != nil { + log.Fatal(err) + } +} + +func do() error { + tmplData, err := getTmplData() + if err != nil { + return err + } + data, err := ioutil.ReadAll(os.Stdin) + if err != nil { + return err + } + t, err := template.New("tmpl").Parse(string(data)) + if err != nil { + return err + } + if err := t.Execute(os.Stdout, tmplData); err != nil { + return err + } + return nil +} + +func getTmplData() (*tmplData, error) { + tmplData := &tmplData{} + rows, err := getBenchmarkRows("BenchmarkAddingFields") + if err != nil { + return nil, err + } + tmplData.BenchmarkAddingFields = rows + rows, err = getBenchmarkRows("BenchmarkAccumulatedContext") + if err != nil { + return nil, err + } + tmplData.BenchmarkAccumulatedContext = rows + rows, err = getBenchmarkRows("BenchmarkWithoutFields") + if err != nil { + return nil, err + } + tmplData.BenchmarkWithoutFields = rows + return tmplData, nil +} + +func getBenchmarkRows(benchmarkName string) (string, error) { + benchmarkOutput, err := getBenchmarkOutput(benchmarkName) + if err != nil { + return "", err + } + var benchmarkRows []*benchmarkRow + for libraryName := range libraryNameToMarkdownName { + benchmarkRow, err := getBenchmarkRow(benchmarkOutput, benchmarkName, libraryName) + if err != nil { + return "", err + } + if benchmarkRow == nil { + continue + } + benchmarkRows = append(benchmarkRows, benchmarkRow) + } + sort.Sort(benchmarkRowsByTime(benchmarkRows)) + rows := []string{ + "| Package | Time | Objects Allocated |", + "| :--- | :---: | :---: |", + } + for _, benchmarkRow := range benchmarkRows { + rows = append(rows, benchmarkRow.String()) + } + return strings.Join(rows, "\n"), nil +} + +func getBenchmarkRow(input []string, benchmarkName string, libraryName string) (*benchmarkRow, error) { + line, err := findUniqueSubstring(input, fmt.Sprintf("%s/%s-", benchmarkName, libraryName)) + if err != nil { + return nil, err + } + if line == "" { + return nil, nil + } + split := strings.Split(line, "\t") + if len(split) < 5 { + return nil, fmt.Errorf("unknown benchmark line: %s", line) + } + duration, err := time.ParseDuration(strings.Replace(strings.TrimSuffix(strings.TrimSpace(split[2]), "/op"), " ", "", -1)) + if err != nil { + return nil, err + } + allocatedBytes, err := strconv.Atoi(strings.TrimSuffix(strings.TrimSpace(split[3]), " B/op")) + if err != nil { + return nil, err + } + allocatedObjects, err := strconv.Atoi(strings.TrimSuffix(strings.TrimSpace(split[4]), " allocs/op")) + if err != nil { + return nil, err + } + return &benchmarkRow{ + libraryNameToMarkdownName[libraryName], + duration, + allocatedBytes, + allocatedObjects, + }, nil +} + +func findUniqueSubstring(input []string, substring string) (string, error) { + var output string + for _, line := range input { + if strings.Contains(line, substring) { + if output != "" { + return "", fmt.Errorf("input has duplicate substring %s", substring) + } + output = line + } + } + return output, nil +} + +func getBenchmarkOutput(benchmarkName string) ([]string, error) { + return getOutput("go", "test", fmt.Sprintf("-bench=%s", benchmarkName), "-benchmem", "./benchmarks") +} + +func getOutput(name string, arg ...string) ([]string, error) { + output, err := exec.Command(name, arg...).CombinedOutput() + if err != nil { + return nil, fmt.Errorf("error running %s %s: %v\n%s", name, strings.Join(arg, " "), err, string(output)) + } + return strings.Split(string(output), "\n"), nil +} + +type tmplData struct { + BenchmarkAddingFields string + BenchmarkAccumulatedContext string + BenchmarkWithoutFields string +} + +type benchmarkRow struct { + Name string + Time time.Duration + AllocatedBytes int + AllocatedObjects int +} + +func (b *benchmarkRow) String() string { + return fmt.Sprintf("| %s | %d ns/op | %d allocs/op |", b.Name, b.Time.Nanoseconds(), b.AllocatedObjects) +} + +type benchmarkRowsByTime []*benchmarkRow + +func (b benchmarkRowsByTime) Len() int { return len(b) } +func (b benchmarkRowsByTime) Swap(i, j int) { b[i], b[j] = b[j], b[i] } +func (b benchmarkRowsByTime) Less(i, j int) bool { + left, right := b[i], b[j] + leftZap, rightZap := strings.Contains(left.Name, "zap"), strings.Contains(right.Name, "zap") + + // If neither benchmark is for zap or both are, sort by time. + if !(leftZap || rightZap) || (leftZap && rightZap) { + return left.Time.Nanoseconds() < right.Time.Nanoseconds() + } + // Sort zap benchmark first. + return leftZap +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/level.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/level.go new file mode 100644 index 0000000..166101f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/level.go @@ -0,0 +1,132 @@ +// 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 +// 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. + +package zap + +import ( + "go.uber.org/atomic" + "go.uber.org/zap/zapcore" +) + +const ( + // DebugLevel logs are typically voluminous, and are usually disabled in + // production. + DebugLevel = zapcore.DebugLevel + // InfoLevel is the default logging priority. + InfoLevel = zapcore.InfoLevel + // WarnLevel logs are more important than Info, but don't need individual + // human review. + WarnLevel = zapcore.WarnLevel + // ErrorLevel logs are high-priority. If an application is running smoothly, + // it shouldn't generate any error-level logs. + ErrorLevel = zapcore.ErrorLevel + // DPanicLevel logs are particularly important errors. In development the + // logger panics after writing the message. + DPanicLevel = zapcore.DPanicLevel + // PanicLevel logs a message, then panics. + PanicLevel = zapcore.PanicLevel + // FatalLevel logs a message, then calls os.Exit(1). + FatalLevel = zapcore.FatalLevel +) + +// LevelEnablerFunc is a convenient way to implement zapcore.LevelEnabler with +// an anonymous function. +// +// It's particularly useful when splitting log output between different +// outputs (e.g., standard error and standard out). For sample code, see the +// package-level AdvancedConfiguration example. +type LevelEnablerFunc func(zapcore.Level) bool + +// Enabled calls the wrapped function. +func (f LevelEnablerFunc) Enabled(lvl zapcore.Level) bool { return f(lvl) } + +// An AtomicLevel is an atomically changeable, dynamic logging level. It lets +// you safely change the log level of a tree of loggers (the root logger and +// any children created by adding context) at runtime. +// +// The AtomicLevel itself is an http.Handler that serves a JSON endpoint to +// alter its level. +// +// AtomicLevels must be created with the NewAtomicLevel constructor to allocate +// their internal atomic pointer. +type AtomicLevel struct { + l *atomic.Int32 +} + +// NewAtomicLevel creates an AtomicLevel with InfoLevel and above logging +// enabled. +func NewAtomicLevel() AtomicLevel { + return AtomicLevel{ + l: atomic.NewInt32(int32(InfoLevel)), + } +} + +// NewAtomicLevelAt is a convienence function that creates an AtomicLevel +// and then calls SetLevel with the given level. +func NewAtomicLevelAt(l zapcore.Level) AtomicLevel { + a := NewAtomicLevel() + a.SetLevel(l) + return a +} + +// Enabled implements the zapcore.LevelEnabler interface, which allows the +// AtomicLevel to be used in place of traditional static levels. +func (lvl AtomicLevel) Enabled(l zapcore.Level) bool { + return lvl.Level().Enabled(l) +} + +// Level returns the minimum enabled log level. +func (lvl AtomicLevel) Level() zapcore.Level { + return zapcore.Level(int8(lvl.l.Load())) +} + +// SetLevel alters the logging level. +func (lvl AtomicLevel) SetLevel(l zapcore.Level) { + lvl.l.Store(int32(l)) +} + +// String returns the string representation of the underlying Level. +func (lvl AtomicLevel) String() string { + return lvl.Level().String() +} + +// UnmarshalText unmarshals the text to an AtomicLevel. It uses the same text +// representations as the static zapcore.Levels ("debug", "info", "warn", +// "error", "dpanic", "panic", and "fatal"). +func (lvl *AtomicLevel) UnmarshalText(text []byte) error { + if lvl.l == nil { + lvl.l = &atomic.Int32{} + } + + var l zapcore.Level + if err := l.UnmarshalText(text); err != nil { + return err + } + + lvl.SetLevel(l) + return nil +} + +// MarshalText marshals the AtomicLevel to a byte slice. It uses the same +// text representation as the static zapcore.Levels ("debug", "info", "warn", +// "error", "dpanic", "panic", and "fatal"). +func (lvl AtomicLevel) MarshalText() (text []byte, err error) { + return lvl.Level().MarshalText() +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/level_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/level_test.go new file mode 100644 index 0000000..a8fb650 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/level_test.go @@ -0,0 +1,117 @@ +// 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 +// 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. + +package zap + +import ( + "sync" + "testing" + + "go.uber.org/zap/zapcore" + + "github.com/stretchr/testify/assert" +) + +func TestLevelEnablerFunc(t *testing.T) { + enab := LevelEnablerFunc(func(l zapcore.Level) bool { return l == zapcore.InfoLevel }) + tests := []struct { + level zapcore.Level + enabled bool + }{ + {DebugLevel, false}, + {InfoLevel, true}, + {WarnLevel, false}, + {ErrorLevel, false}, + {DPanicLevel, false}, + {PanicLevel, false}, + {FatalLevel, false}, + } + for _, tt := range tests { + assert.Equal(t, tt.enabled, enab.Enabled(tt.level), "Unexpected result applying LevelEnablerFunc to %s", tt.level) + } +} + +func TestNewAtomicLevel(t *testing.T) { + lvl := NewAtomicLevel() + assert.Equal(t, InfoLevel, lvl.Level(), "Unexpected initial level.") + lvl.SetLevel(ErrorLevel) + assert.Equal(t, ErrorLevel, lvl.Level(), "Unexpected level after SetLevel.") + lvl = NewAtomicLevelAt(WarnLevel) + assert.Equal(t, WarnLevel, lvl.Level(), "Unexpected level after SetLevel.") +} + +func TestAtomicLevelMutation(t *testing.T) { + lvl := NewAtomicLevel() + lvl.SetLevel(WarnLevel) + // Trigger races for non-atomic level mutations. + proceed := make(chan struct{}) + wg := &sync.WaitGroup{} + runConcurrently(10, 100, wg, func() { + <-proceed + assert.Equal(t, WarnLevel, lvl.Level()) + }) + runConcurrently(10, 100, wg, func() { + <-proceed + lvl.SetLevel(WarnLevel) + }) + close(proceed) + wg.Wait() +} + +func TestAtomicLevelText(t *testing.T) { + tests := []struct { + text string + expect zapcore.Level + err bool + }{ + {"debug", DebugLevel, false}, + {"info", InfoLevel, false}, + {"", InfoLevel, false}, + {"warn", WarnLevel, false}, + {"error", ErrorLevel, false}, + {"dpanic", DPanicLevel, false}, + {"panic", PanicLevel, false}, + {"fatal", FatalLevel, false}, + {"foobar", InfoLevel, true}, + } + + for _, tt := range tests { + var lvl AtomicLevel + // Test both initial unmarshaling and overwriting existing value. + for i := 0; i < 2; i++ { + if tt.err { + assert.Error(t, lvl.UnmarshalText([]byte(tt.text)), "Expected unmarshaling %q to fail.", tt.text) + } else { + assert.NoError(t, lvl.UnmarshalText([]byte(tt.text)), "Expected unmarshaling %q to succeed.", tt.text) + } + assert.Equal(t, tt.expect, lvl.Level(), "Unexpected level after unmarshaling.") + lvl.SetLevel(InfoLevel) + } + + // Test marshalling + if tt.text != "" && !tt.err { + lvl.SetLevel(tt.expect) + marshaled, err := lvl.MarshalText() + assert.NoError(t, err, `Unexpected error marshalling level "%v" to text.`, tt.expect) + assert.Equal(t, tt.text, string(marshaled), "Expected marshaled text to match") + assert.Equal(t, tt.text, lvl.String(), "Expected Stringer call to match") + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/logger.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/logger.go new file mode 100644 index 0000000..7d8824b --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/logger.go @@ -0,0 +1,305 @@ +// 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 +// 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. + +package zap + +import ( + "fmt" + "io/ioutil" + "os" + "runtime" + "strings" + "time" + + "go.uber.org/zap/zapcore" +) + +// A Logger provides fast, leveled, structured logging. All methods are safe +// for concurrent use. +// +// The Logger is designed for contexts in which every microsecond and every +// allocation matters, so its API intentionally favors performance and type +// safety over brevity. For most applications, the SugaredLogger strikes a +// better balance between performance and ergonomics. +type Logger struct { + core zapcore.Core + + development bool + name string + errorOutput zapcore.WriteSyncer + + addCaller bool + addStack zapcore.LevelEnabler + + callerSkip int +} + +// New constructs a new Logger from the provided zapcore.Core and Options. If +// the passed zapcore.Core is nil, it falls back to using a no-op +// implementation. +// +// This is the most flexible way to construct a Logger, but also the most +// verbose. For typical use cases, the highly-opinionated presets +// (NewProduction, NewDevelopment, and NewExample) or the Config struct are +// more convenient. +// +// For sample code, see the package-level AdvancedConfiguration example. +func New(core zapcore.Core, options ...Option) *Logger { + if core == nil { + return NewNop() + } + log := &Logger{ + core: core, + errorOutput: zapcore.Lock(os.Stderr), + addStack: zapcore.FatalLevel + 1, + } + return log.WithOptions(options...) +} + +// NewNop returns a no-op Logger. It never writes out logs or internal errors, +// and it never runs user-defined hooks. +// +// Using WithOptions to replace the Core or error output of a no-op Logger can +// re-enable logging. +func NewNop() *Logger { + return &Logger{ + core: zapcore.NewNopCore(), + errorOutput: zapcore.AddSync(ioutil.Discard), + addStack: zapcore.FatalLevel + 1, + } +} + +// NewProduction builds a sensible production Logger that writes InfoLevel and +// above logs to standard error as JSON. +// +// It's a shortcut for NewProductionConfig().Build(...Option). +func NewProduction(options ...Option) (*Logger, error) { + return NewProductionConfig().Build(options...) +} + +// NewDevelopment builds a development Logger that writes DebugLevel and above +// logs to standard error in a human-friendly format. +// +// It's a shortcut for NewDevelopmentConfig().Build(...Option). +func NewDevelopment(options ...Option) (*Logger, error) { + return NewDevelopmentConfig().Build(options...) +} + +// NewExample builds a Logger that's designed for use in zap's testable +// examples. It writes DebugLevel and above logs to standard out as JSON, but +// omits the timestamp and calling function to keep example output +// short and deterministic. +func NewExample(options ...Option) *Logger { + encoderCfg := zapcore.EncoderConfig{ + MessageKey: "msg", + LevelKey: "level", + NameKey: "logger", + EncodeLevel: zapcore.LowercaseLevelEncoder, + EncodeTime: zapcore.ISO8601TimeEncoder, + EncodeDuration: zapcore.StringDurationEncoder, + } + core := zapcore.NewCore(zapcore.NewJSONEncoder(encoderCfg), os.Stdout, DebugLevel) + return New(core).WithOptions(options...) +} + +// Sugar wraps the Logger to provide a more ergonomic, but slightly slower, +// API. Sugaring a Logger is quite inexpensive, so it's reasonable for a +// single application to use both Loggers and SugaredLoggers, converting +// between them on the boundaries of performance-sensitive code. +func (log *Logger) Sugar() *SugaredLogger { + core := log.clone() + core.callerSkip += 2 + return &SugaredLogger{core} +} + +// Named adds a new path segment to the logger's name. Segments are joined by +// periods. By default, Loggers are unnamed. +func (log *Logger) Named(s string) *Logger { + if s == "" { + return log + } + l := log.clone() + if log.name == "" { + l.name = s + } else { + l.name = strings.Join([]string{l.name, s}, ".") + } + return l +} + +// WithOptions clones the current Logger, applies the supplied Options, and +// returns the resulting Logger. It's safe to use concurrently. +func (log *Logger) WithOptions(opts ...Option) *Logger { + c := log.clone() + for _, opt := range opts { + opt.apply(c) + } + return c +} + +// With creates a child logger and adds structured context to it. Fields added +// to the child don't affect the parent, and vice versa. +func (log *Logger) With(fields ...zapcore.Field) *Logger { + if len(fields) == 0 { + return log + } + l := log.clone() + l.core = l.core.With(fields) + return l +} + +// Check returns a CheckedEntry if logging a message at the specified level +// is enabled. It's a completely optional optimization; in high-performance +// applications, Check can help avoid allocating a slice to hold fields. +func (log *Logger) Check(lvl zapcore.Level, msg string) *zapcore.CheckedEntry { + return log.check(lvl, msg) +} + +// Debug logs a message at DebugLevel. The message includes any fields passed +// at the log site, as well as any fields accumulated on the logger. +func (log *Logger) Debug(msg string, fields ...zapcore.Field) { + if ce := log.check(DebugLevel, msg); ce != nil { + ce.Write(fields...) + } +} + +// Info logs a message at InfoLevel. The message includes any fields passed +// at the log site, as well as any fields accumulated on the logger. +func (log *Logger) Info(msg string, fields ...zapcore.Field) { + if ce := log.check(InfoLevel, msg); ce != nil { + ce.Write(fields...) + } +} + +// Warn logs a message at WarnLevel. The message includes any fields passed +// at the log site, as well as any fields accumulated on the logger. +func (log *Logger) Warn(msg string, fields ...zapcore.Field) { + if ce := log.check(WarnLevel, msg); ce != nil { + ce.Write(fields...) + } +} + +// Error logs a message at ErrorLevel. The message includes any fields passed +// at the log site, as well as any fields accumulated on the logger. +func (log *Logger) Error(msg string, fields ...zapcore.Field) { + if ce := log.check(ErrorLevel, msg); ce != nil { + ce.Write(fields...) + } +} + +// DPanic logs a message at DPanicLevel. The message includes any fields +// passed at the log site, as well as any fields accumulated on the logger. +// +// If the logger is in development mode, it then panics (DPanic means +// "development panic"). This is useful for catching errors that are +// recoverable, but shouldn't ever happen. +func (log *Logger) DPanic(msg string, fields ...zapcore.Field) { + if ce := log.check(DPanicLevel, msg); ce != nil { + ce.Write(fields...) + } +} + +// Panic logs a message at PanicLevel. The message includes any fields passed +// at the log site, as well as any fields accumulated on the logger. +// +// The logger then panics, even if logging at PanicLevel is disabled. +func (log *Logger) Panic(msg string, fields ...zapcore.Field) { + if ce := log.check(PanicLevel, msg); ce != nil { + ce.Write(fields...) + } +} + +// Fatal logs a message at FatalLevel. The message includes any fields passed +// at the log site, as well as any fields accumulated on the logger. +// +// The logger then calls os.Exit(1), even if logging at FatalLevel is +// disabled. +func (log *Logger) Fatal(msg string, fields ...zapcore.Field) { + if ce := log.check(FatalLevel, msg); ce != nil { + ce.Write(fields...) + } +} + +// Sync calls the underlying Core's Sync method, flushing any buffered log +// entries. Applications should take care to call Sync before exiting. +func (log *Logger) Sync() error { + return log.core.Sync() +} + +// Core returns the Logger's underlying zapcore.Core. +func (log *Logger) Core() zapcore.Core { + return log.core +} + +func (log *Logger) clone() *Logger { + copy := *log + return © +} + +func (log *Logger) check(lvl zapcore.Level, msg string) *zapcore.CheckedEntry { + // check must always be called directly by a method in the Logger interface + // (e.g., Check, Info, Fatal). + const callerSkipOffset = 2 + + // Create basic checked entry thru the core; this will be non-nil if the + // log message will actually be written somewhere. + ent := zapcore.Entry{ + LoggerName: log.name, + Time: time.Now(), + Level: lvl, + Message: msg, + } + ce := log.core.Check(ent, nil) + willWrite := ce != nil + + // Set up any required terminal behavior. + switch ent.Level { + case zapcore.PanicLevel: + ce = ce.Should(ent, zapcore.WriteThenPanic) + case zapcore.FatalLevel: + ce = ce.Should(ent, zapcore.WriteThenFatal) + case zapcore.DPanicLevel: + if log.development { + ce = ce.Should(ent, zapcore.WriteThenPanic) + } + } + + // Only do further annotation if we're going to write this message; checked + // entries that exist only for terminal behavior don't benefit from + // annotation. + if !willWrite { + return ce + } + + // Thread the error output through to the CheckedEntry. + ce.ErrorOutput = log.errorOutput + if log.addCaller { + ce.Entry.Caller = zapcore.NewEntryCaller(runtime.Caller(log.callerSkip + callerSkipOffset)) + if !ce.Entry.Caller.Defined { + fmt.Fprintf(log.errorOutput, "%v Logger.check error: failed to get caller\n", time.Now().UTC()) + log.errorOutput.Sync() + } + } + if log.addStack.Enabled(ce.Entry.Level) { + ce.Entry.Stack = Stack("").String + } + + return ce +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/logger_bench_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/logger_bench_test.go new file mode 100644 index 0000000..1ba7c75 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/logger_bench_test.go @@ -0,0 +1,222 @@ +// 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 +// 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. + +package zap + +import ( + "errors" + "testing" + "time" + + "go.uber.org/zap/zapcore" + "go.uber.org/zap/zaptest" +) + +type user struct { + Name string + Email string + CreatedAt time.Time +} + +func (u *user) MarshalLogObject(enc zapcore.ObjectEncoder) error { + enc.AddString("name", u.Name) + enc.AddString("email", u.Email) + enc.AddInt64("created_at", u.CreatedAt.UnixNano()) + return nil +} + +var _jane = &user{ + Name: "Jane Doe", + Email: "jane@test.com", + CreatedAt: time.Date(1980, 1, 1, 12, 0, 0, 0, time.UTC), +} + +func withBenchedLogger(b *testing.B, f func(*Logger)) { + logger := New( + zapcore.NewCore( + zapcore.NewJSONEncoder(NewProductionConfig().EncoderConfig), + &zaptest.Discarder{}, + DebugLevel, + )) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + f(logger) + } + }) +} + +func BenchmarkNoContext(b *testing.B) { + withBenchedLogger(b, func(log *Logger) { + log.Info("No context.") + }) +} + +func BenchmarkBoolField(b *testing.B) { + withBenchedLogger(b, func(log *Logger) { + log.Info("Boolean.", Bool("foo", true)) + }) +} + +func BenchmarkByteStringField(b *testing.B) { + val := []byte("bar") + withBenchedLogger(b, func(log *Logger) { + log.Info("ByteString.", ByteString("foo", val)) + }) +} + +func BenchmarkFloat64Field(b *testing.B) { + withBenchedLogger(b, func(log *Logger) { + log.Info("Floating point.", Float64("foo", 3.14)) + }) +} + +func BenchmarkIntField(b *testing.B) { + withBenchedLogger(b, func(log *Logger) { + log.Info("Integer.", Int("foo", 42)) + }) +} + +func BenchmarkInt64Field(b *testing.B) { + withBenchedLogger(b, func(log *Logger) { + log.Info("64-bit integer.", Int64("foo", 42)) + }) +} + +func BenchmarkStringField(b *testing.B) { + withBenchedLogger(b, func(log *Logger) { + log.Info("Strings.", String("foo", "bar")) + }) +} + +func BenchmarkStringerField(b *testing.B) { + withBenchedLogger(b, func(log *Logger) { + log.Info("Level.", Stringer("foo", InfoLevel)) + }) +} + +func BenchmarkTimeField(b *testing.B) { + t := time.Unix(0, 0) + withBenchedLogger(b, func(log *Logger) { + log.Info("Time.", Time("foo", t)) + }) +} + +func BenchmarkDurationField(b *testing.B) { + withBenchedLogger(b, func(log *Logger) { + log.Info("Duration", Duration("foo", time.Second)) + }) +} + +func BenchmarkErrorField(b *testing.B) { + err := errors.New("egad") + withBenchedLogger(b, func(log *Logger) { + log.Info("Error.", Error(err)) + }) +} + +func BenchmarkErrorsField(b *testing.B) { + errs := []error{ + errors.New("egad"), + errors.New("oh no"), + errors.New("dear me"), + errors.New("such fail"), + } + withBenchedLogger(b, func(log *Logger) { + log.Info("Errors.", Errors("errors", errs)) + }) +} + +func BenchmarkStackField(b *testing.B) { + withBenchedLogger(b, func(log *Logger) { + log.Info("Error.", Stack("stacktrace")) + }) +} + +func BenchmarkObjectField(b *testing.B) { + withBenchedLogger(b, func(log *Logger) { + log.Info("Arbitrary ObjectMarshaler.", Object("user", _jane)) + }) +} + +func BenchmarkReflectField(b *testing.B) { + withBenchedLogger(b, func(log *Logger) { + log.Info("Reflection-based serialization.", Reflect("user", _jane)) + }) +} + +func BenchmarkAddCallerHook(b *testing.B) { + logger := New( + zapcore.NewCore( + zapcore.NewJSONEncoder(NewProductionConfig().EncoderConfig), + &zaptest.Discarder{}, + InfoLevel, + ), + AddCaller(), + ) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info("Caller.") + } + }) +} + +func Benchmark10Fields(b *testing.B) { + withBenchedLogger(b, func(log *Logger) { + log.Info("Ten fields, passed at the log site.", + Int("one", 1), + Int("two", 2), + Int("three", 3), + Int("four", 4), + Int("five", 5), + Int("six", 6), + Int("seven", 7), + Int("eight", 8), + Int("nine", 9), + Int("ten", 10), + ) + }) +} + +func Benchmark100Fields(b *testing.B) { + const batchSize = 50 + logger := New(zapcore.NewCore( + zapcore.NewJSONEncoder(NewProductionConfig().EncoderConfig), + &zaptest.Discarder{}, + DebugLevel, + )) + + // Don't include allocating these helper slices in the benchmark. Since + // access to them isn't synchronized, we can't run the benchmark in + // parallel. + first := make([]zapcore.Field, batchSize) + second := make([]zapcore.Field, batchSize) + b.ResetTimer() + + for i := 0; i < b.N; i++ { + for i := 0; i < batchSize; i++ { + // We're duplicating keys, but that doesn't affect performance. + first[i] = Int("foo", i) + second[i] = Int("foo", i+batchSize) + } + logger.With(first...).Info("Child loggers with lots of context.", second...) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/logger_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/logger_test.go new file mode 100644 index 0000000..0b0cf62 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/logger_test.go @@ -0,0 +1,432 @@ +// 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 +// 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. + +package zap + +import ( + "errors" + "sync" + "testing" + + "go.uber.org/zap/internal/exit" + "go.uber.org/zap/zapcore" + "go.uber.org/zap/zaptest" + "go.uber.org/zap/zaptest/observer" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.uber.org/atomic" +) + +func makeCountingHook() (func(zapcore.Entry) error, *atomic.Int64) { + count := &atomic.Int64{} + h := func(zapcore.Entry) error { + count.Inc() + return nil + } + return h, count +} + +func TestLoggerAtomicLevel(t *testing.T) { + // Test that the dynamic level applies to all ancestors and descendants. + dl := NewAtomicLevel() + + withLogger(t, dl, nil, func(grandparent *Logger, _ *observer.ObservedLogs) { + parent := grandparent.With(Int("generation", 1)) + child := parent.With(Int("generation", 2)) + + tests := []struct { + setLevel zapcore.Level + testLevel zapcore.Level + enabled bool + }{ + {DebugLevel, DebugLevel, true}, + {InfoLevel, DebugLevel, false}, + {WarnLevel, PanicLevel, true}, + } + + for _, tt := range tests { + dl.SetLevel(tt.setLevel) + for _, logger := range []*Logger{grandparent, parent, child} { + if tt.enabled { + assert.NotNil( + t, + logger.Check(tt.testLevel, ""), + "Expected level %s to be enabled after setting level %s.", tt.testLevel, tt.setLevel, + ) + } else { + assert.Nil( + t, + logger.Check(tt.testLevel, ""), + "Expected level %s to be enabled after setting level %s.", tt.testLevel, tt.setLevel, + ) + } + } + } + }) +} + +func TestLoggerInitialFields(t *testing.T) { + fieldOpts := opts(Fields(Int("foo", 42), String("bar", "baz"))) + withLogger(t, DebugLevel, fieldOpts, func(logger *Logger, logs *observer.ObservedLogs) { + logger.Info("") + assert.Equal( + t, + observer.LoggedEntry{Context: []zapcore.Field{Int("foo", 42), String("bar", "baz")}}, + logs.AllUntimed()[0], + "Unexpected output with initial fields set.", + ) + }) +} + +func TestLoggerWith(t *testing.T) { + fieldOpts := opts(Fields(Int("foo", 42))) + withLogger(t, DebugLevel, fieldOpts, func(logger *Logger, logs *observer.ObservedLogs) { + // Child loggers should have copy-on-write semantics, so two children + // shouldn't stomp on each other's fields or affect the parent's fields. + logger.With(String("one", "two")).Info("") + logger.With(String("three", "four")).Info("") + logger.Info("") + + assert.Equal(t, []observer.LoggedEntry{ + {Context: []zapcore.Field{Int("foo", 42), String("one", "two")}}, + {Context: []zapcore.Field{Int("foo", 42), String("three", "four")}}, + {Context: []zapcore.Field{Int("foo", 42)}}, + }, logs.AllUntimed(), "Unexpected cross-talk between child loggers.") + }) +} + +func TestLoggerLogPanic(t *testing.T) { + for _, tt := range []struct { + do func(*Logger) + should bool + expected string + }{ + {func(logger *Logger) { logger.Check(PanicLevel, "bar").Write() }, true, "bar"}, + {func(logger *Logger) { logger.Panic("baz") }, true, "baz"}, + } { + withLogger(t, DebugLevel, nil, func(logger *Logger, logs *observer.ObservedLogs) { + if tt.should { + assert.Panics(t, func() { tt.do(logger) }, "Expected panic") + } else { + assert.NotPanics(t, func() { tt.do(logger) }, "Expected no panic") + } + + output := logs.AllUntimed() + assert.Equal(t, 1, len(output), "Unexpected number of logs.") + assert.Equal(t, 0, len(output[0].Context), "Unexpected context on first log.") + assert.Equal( + t, + zapcore.Entry{Message: tt.expected, Level: PanicLevel}, + output[0].Entry, + "Unexpected output from panic-level Log.", + ) + }) + } +} + +func TestLoggerLogFatal(t *testing.T) { + for _, tt := range []struct { + do func(*Logger) + expected string + }{ + {func(logger *Logger) { logger.Check(FatalLevel, "bar").Write() }, "bar"}, + {func(logger *Logger) { logger.Fatal("baz") }, "baz"}, + } { + withLogger(t, DebugLevel, nil, func(logger *Logger, logs *observer.ObservedLogs) { + stub := exit.WithStub(func() { + tt.do(logger) + }) + assert.True(t, stub.Exited, "Expected Fatal logger call to terminate process.") + output := logs.AllUntimed() + assert.Equal(t, 1, len(output), "Unexpected number of logs.") + assert.Equal(t, 0, len(output[0].Context), "Unexpected context on first log.") + assert.Equal( + t, + zapcore.Entry{Message: tt.expected, Level: FatalLevel}, + output[0].Entry, + "Unexpected output from fatal-level Log.", + ) + }) + } +} + +func TestLoggerLeveledMethods(t *testing.T) { + withLogger(t, DebugLevel, nil, func(logger *Logger, logs *observer.ObservedLogs) { + tests := []struct { + method func(string, ...zapcore.Field) + expectedLevel zapcore.Level + }{ + {logger.Debug, DebugLevel}, + {logger.Info, InfoLevel}, + {logger.Warn, WarnLevel}, + {logger.Error, ErrorLevel}, + {logger.DPanic, DPanicLevel}, + } + for i, tt := range tests { + tt.method("") + output := logs.AllUntimed() + assert.Equal(t, i+1, len(output), "Unexpected number of logs.") + assert.Equal(t, 0, len(output[i].Context), "Unexpected context on first log.") + assert.Equal( + t, + zapcore.Entry{Level: tt.expectedLevel}, + output[i].Entry, + "Unexpected output from %s-level logger method.", tt.expectedLevel) + } + }) +} + +func TestLoggerAlwaysPanics(t *testing.T) { + // Users can disable writing out panic-level logs, but calls to logger.Panic() + // should still call panic(). + withLogger(t, FatalLevel, nil, func(logger *Logger, logs *observer.ObservedLogs) { + msg := "Even if output is disabled, logger.Panic should always panic." + assert.Panics(t, func() { logger.Panic("foo") }, msg) + assert.Panics(t, func() { + if ce := logger.Check(PanicLevel, "foo"); ce != nil { + ce.Write() + } + }, msg) + assert.Equal(t, 0, logs.Len(), "Panics shouldn't be written out if PanicLevel is disabled.") + }) +} + +func TestLoggerAlwaysFatals(t *testing.T) { + // Users can disable writing out fatal-level logs, but calls to logger.Fatal() + // should still terminate the process. + withLogger(t, FatalLevel+1, nil, func(logger *Logger, logs *observer.ObservedLogs) { + stub := exit.WithStub(func() { logger.Fatal("") }) + assert.True(t, stub.Exited, "Expected calls to logger.Fatal to terminate process.") + + stub = exit.WithStub(func() { + if ce := logger.Check(FatalLevel, ""); ce != nil { + ce.Write() + } + }) + assert.True(t, stub.Exited, "Expected calls to logger.Check(FatalLevel, ...) to terminate process.") + + assert.Equal(t, 0, logs.Len(), "Shouldn't write out logs when fatal-level logging is disabled.") + }) +} + +func TestLoggerDPanic(t *testing.T) { + withLogger(t, DebugLevel, nil, func(logger *Logger, logs *observer.ObservedLogs) { + assert.NotPanics(t, func() { logger.DPanic("") }) + assert.Equal( + t, + []observer.LoggedEntry{{Entry: zapcore.Entry{Level: DPanicLevel}, Context: []zapcore.Field{}}}, + logs.AllUntimed(), + "Unexpected log output from DPanic in production mode.", + ) + }) + withLogger(t, DebugLevel, opts(Development()), func(logger *Logger, logs *observer.ObservedLogs) { + assert.Panics(t, func() { logger.DPanic("") }) + assert.Equal( + t, + []observer.LoggedEntry{{Entry: zapcore.Entry{Level: DPanicLevel}, Context: []zapcore.Field{}}}, + logs.AllUntimed(), + "Unexpected log output from DPanic in development mode.", + ) + }) +} + +func TestLoggerNoOpsDisabledLevels(t *testing.T) { + withLogger(t, WarnLevel, nil, func(logger *Logger, logs *observer.ObservedLogs) { + logger.Info("silence!") + assert.Equal( + t, + []observer.LoggedEntry{}, + logs.AllUntimed(), + "Expected logging at a disabled level to produce no output.", + ) + }) +} + +func TestLoggerNames(t *testing.T) { + tests := []struct { + names []string + expected string + }{ + {nil, ""}, + {[]string{""}, ""}, + {[]string{"foo"}, "foo"}, + {[]string{"foo", ""}, "foo"}, + {[]string{"foo", "bar"}, "foo.bar"}, + {[]string{"foo.bar", "baz"}, "foo.bar.baz"}, + // Garbage in, garbage out. + {[]string{"foo.", "bar"}, "foo..bar"}, + {[]string{"foo", ".bar"}, "foo..bar"}, + {[]string{"foo.", ".bar"}, "foo...bar"}, + } + + for _, tt := range tests { + withLogger(t, DebugLevel, nil, func(log *Logger, logs *observer.ObservedLogs) { + for _, n := range tt.names { + log = log.Named(n) + } + log.Info("") + require.Equal(t, 1, logs.Len(), "Expected only one log entry to be written.") + assert.Equal(t, tt.expected, logs.AllUntimed()[0].Entry.LoggerName, "Unexpected logger name.") + }) + withSugar(t, DebugLevel, nil, func(log *SugaredLogger, logs *observer.ObservedLogs) { + for _, n := range tt.names { + log = log.Named(n) + } + log.Infow("") + require.Equal(t, 1, logs.Len(), "Expected only one log entry to be written.") + assert.Equal(t, tt.expected, logs.AllUntimed()[0].Entry.LoggerName, "Unexpected logger name.") + }) + } +} + +func TestLoggerWriteFailure(t *testing.T) { + errSink := &zaptest.Buffer{} + logger := New( + zapcore.NewCore( + zapcore.NewJSONEncoder(NewProductionConfig().EncoderConfig), + zapcore.Lock(zapcore.AddSync(zaptest.FailWriter{})), + DebugLevel, + ), + ErrorOutput(errSink), + ) + + logger.Info("foo") + // Should log the error. + assert.Regexp(t, `write error: failed`, errSink.Stripped(), "Expected to log the error to the error output.") + assert.True(t, errSink.Called(), "Expected logging an internal error to call Sync the error sink.") +} + +func TestLoggerSync(t *testing.T) { + withLogger(t, DebugLevel, nil, func(logger *Logger, _ *observer.ObservedLogs) { + assert.NoError(t, logger.Sync(), "Expected syncing a test logger to succeed.") + assert.NoError(t, logger.Sugar().Sync(), "Expected syncing a sugared logger to succeed.") + }) +} + +func TestLoggerSyncFail(t *testing.T) { + noSync := &zaptest.Buffer{} + err := errors.New("fail") + noSync.SetError(err) + logger := New(zapcore.NewCore( + zapcore.NewJSONEncoder(zapcore.EncoderConfig{}), + noSync, + DebugLevel, + )) + assert.Equal(t, err, logger.Sync(), "Expected Logger.Sync to propagate errors.") + assert.Equal(t, err, logger.Sugar().Sync(), "Expected SugaredLogger.Sync to propagate errors.") +} + +func TestLoggerAddCaller(t *testing.T) { + tests := []struct { + options []Option + pat string + }{ + {opts(AddCaller()), `.+/logger_test.go:[\d]+$`}, + {opts(AddCaller(), AddCallerSkip(1), AddCallerSkip(-1)), `.+/zap/logger_test.go:[\d]+$`}, + {opts(AddCaller(), AddCallerSkip(1)), `.+/zap/common_test.go:[\d]+$`}, + {opts(AddCaller(), AddCallerSkip(1), AddCallerSkip(3)), `.+/src/runtime/.*:[\d]+$`}, + } + for _, tt := range tests { + withLogger(t, DebugLevel, tt.options, func(logger *Logger, logs *observer.ObservedLogs) { + // Make sure that sugaring and desugaring resets caller skip properly. + logger = logger.Sugar().Desugar() + logger.Info("") + output := logs.AllUntimed() + assert.Equal(t, 1, len(output), "Unexpected number of logs written out.") + assert.Regexp( + t, + tt.pat, + output[0].Entry.Caller, + "Expected to find package name and file name in output.", + ) + }) + } +} + +func TestLoggerAddCallerFail(t *testing.T) { + errBuf := &zaptest.Buffer{} + withLogger(t, DebugLevel, opts(AddCaller(), ErrorOutput(errBuf)), func(log *Logger, logs *observer.ObservedLogs) { + log.callerSkip = 1e3 + log.Info("Failure.") + assert.Regexp( + t, + `Logger.check error: failed to get caller`, + errBuf.String(), + "Didn't find expected failure message.", + ) + assert.Equal( + t, + logs.AllUntimed()[0].Entry.Message, + "Failure.", + "Expected original message to survive failures in runtime.Caller.") + }) +} + +func TestLoggerReplaceCore(t *testing.T) { + replace := WrapCore(func(zapcore.Core) zapcore.Core { + return zapcore.NewNopCore() + }) + withLogger(t, DebugLevel, opts(replace), func(logger *Logger, logs *observer.ObservedLogs) { + logger.Debug("") + logger.Info("") + logger.Warn("") + assert.Equal(t, 0, logs.Len(), "Expected no-op core to write no logs.") + }) +} + +func TestLoggerHooks(t *testing.T) { + hook, seen := makeCountingHook() + withLogger(t, DebugLevel, opts(Hooks(hook)), func(logger *Logger, logs *observer.ObservedLogs) { + logger.Debug("") + logger.Info("") + }) + assert.Equal(t, int64(2), seen.Load(), "Hook saw an unexpected number of logs.") +} + +func TestLoggerConcurrent(t *testing.T) { + withLogger(t, DebugLevel, nil, func(logger *Logger, logs *observer.ObservedLogs) { + child := logger.With(String("foo", "bar")) + + wg := &sync.WaitGroup{} + runConcurrently(5, 10, wg, func() { + logger.Info("", String("foo", "bar")) + }) + runConcurrently(5, 10, wg, func() { + child.Info("") + }) + + wg.Wait() + + // Make sure the output doesn't contain interspersed entries. + assert.Equal(t, 100, logs.Len(), "Unexpected number of logs written out.") + for _, obs := range logs.AllUntimed() { + assert.Equal( + t, + observer.LoggedEntry{ + Entry: zapcore.Entry{Level: InfoLevel}, + Context: []zapcore.Field{String("foo", "bar")}, + }, + obs, + "Unexpected log output.", + ) + } + }) +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/options.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/options.go new file mode 100644 index 0000000..d0f9422 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/options.go @@ -0,0 +1,109 @@ +// 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 +// 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. + +package zap + +import "go.uber.org/zap/zapcore" + +// An Option configures a Logger. +type Option interface { + apply(*Logger) +} + +// optionFunc wraps a func so it satisfies the Option interface. +type optionFunc func(*Logger) + +func (f optionFunc) apply(log *Logger) { + f(log) +} + +// WrapCore wraps or replaces the Logger's underlying zapcore.Core. +func WrapCore(f func(zapcore.Core) zapcore.Core) Option { + return optionFunc(func(log *Logger) { + log.core = f(log.core) + }) +} + +// Hooks registers functions which will be called each time the Logger writes +// out an Entry. Repeated use of Hooks is additive. +// +// Hooks are useful for simple side effects, like capturing metrics for the +// number of emitted logs. More complex side effects, including anything that +// requires access to the Entry's structured fields, should be implemented as +// a zapcore.Core instead. See zapcore.RegisterHooks for details. +func Hooks(hooks ...func(zapcore.Entry) error) Option { + return optionFunc(func(log *Logger) { + log.core = zapcore.RegisterHooks(log.core, hooks...) + }) +} + +// Fields adds fields to the Logger. +func Fields(fs ...zapcore.Field) Option { + return optionFunc(func(log *Logger) { + log.core = log.core.With(fs) + }) +} + +// ErrorOutput sets the destination for errors generated by the Logger. Note +// that this option only affects internal errors; for sample code that sends +// error-level logs to a different location from info- and debug-level logs, +// see the package-level AdvancedConfiguration example. +// +// The supplied WriteSyncer must be safe for concurrent use. The Open and +// zapcore.Lock functions are the simplest ways to protect files with a mutex. +func ErrorOutput(w zapcore.WriteSyncer) Option { + return optionFunc(func(log *Logger) { + log.errorOutput = w + }) +} + +// Development puts the logger in development mode, which makes DPanic-level +// logs panic instead of simply logging an error. +func Development() Option { + return optionFunc(func(log *Logger) { + log.development = true + }) +} + +// AddCaller configures the Logger to annotate each message with the filename +// and line number of zap's caller. +func AddCaller() Option { + return optionFunc(func(log *Logger) { + log.addCaller = true + }) +} + +// AddCallerSkip increases the number of callers skipped by caller annotation +// (as enabled by the AddCaller option). When building wrappers around the +// Logger and SugaredLogger, supplying this Option prevents zap from always +// reporting the wrapper code as the caller. +func AddCallerSkip(skip int) Option { + return optionFunc(func(log *Logger) { + log.callerSkip += skip + }) +} + +// AddStacktrace configures the Logger to record a stack trace for all messages at +// or above a given level. +func AddStacktrace(lvl zapcore.LevelEnabler) Option { + return optionFunc(func(log *Logger) { + log.addStack = lvl + }) +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/scripts/cover.sh b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/scripts/cover.sh new file mode 100755 index 0000000..0da503c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/scripts/cover.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +set -e +echo "" > cover.out + +for d in $(go list $@); do + go test -race -coverprofile=profile.out $d + if [ -f profile.out ]; then + cat profile.out >> cover.out + rm profile.out + fi +done diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/stacktrace.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/stacktrace.go new file mode 100644 index 0000000..100fac2 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/stacktrace.go @@ -0,0 +1,126 @@ +// 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 +// 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. + +package zap + +import ( + "runtime" + "strings" + "sync" + + "go.uber.org/zap/internal/bufferpool" +) + +const _zapPackage = "go.uber.org/zap" + +var ( + _stacktracePool = sync.Pool{ + New: func() interface{} { + return newProgramCounters(64) + }, + } + + // We add "." and "/" suffixes to the package name to ensure we only match + // the exact package and not any package with the same prefix. + _zapStacktracePrefixes = addPrefix(_zapPackage, ".", "/") + _zapStacktraceVendorContains = addPrefix("/vendor/", _zapStacktracePrefixes...) +) + +func takeStacktrace() string { + buffer := bufferpool.Get() + defer buffer.Free() + programCounters := _stacktracePool.Get().(*programCounters) + defer _stacktracePool.Put(programCounters) + + var numFrames int + for { + // Skip the call to runtime.Counters and takeStacktrace so that the + // program counters start at the caller of takeStacktrace. + numFrames = runtime.Callers(2, programCounters.pcs) + if numFrames < len(programCounters.pcs) { + break + } + // Don't put the too-short counter slice back into the pool; this lets + // the pool adjust if we consistently take deep stacktraces. + programCounters = newProgramCounters(len(programCounters.pcs) * 2) + } + + i := 0 + skipZapFrames := true // skip all consecutive zap frames at the beginning. + frames := runtime.CallersFrames(programCounters.pcs[:numFrames]) + + // Note: On the last iteration, frames.Next() returns false, with a valid + // frame, but we ignore this frame. The last frame is a a runtime frame which + // adds noise, since it's only either runtime.main or runtime.goexit. + for frame, more := frames.Next(); more; frame, more = frames.Next() { + if skipZapFrames && isZapFrame(frame.Function) { + continue + } else { + skipZapFrames = false + } + + if i != 0 { + buffer.AppendByte('\n') + } + i++ + buffer.AppendString(frame.Function) + buffer.AppendByte('\n') + buffer.AppendByte('\t') + buffer.AppendString(frame.File) + buffer.AppendByte(':') + buffer.AppendInt(int64(frame.Line)) + } + + return buffer.String() +} + +func isZapFrame(function string) bool { + for _, prefix := range _zapStacktracePrefixes { + if strings.HasPrefix(function, prefix) { + return true + } + } + + // We can't use a prefix match here since the location of the vendor + // directory affects the prefix. Instead we do a contains match. + for _, contains := range _zapStacktraceVendorContains { + if strings.Contains(function, contains) { + return true + } + } + + return false +} + +type programCounters struct { + pcs []uintptr +} + +func newProgramCounters(size int) *programCounters { + return &programCounters{make([]uintptr, size)} +} + +func addPrefix(prefix string, ss ...string) []string { + withPrefix := make([]string, len(ss)) + for i, s := range ss { + withPrefix[i] = prefix + s + } + return withPrefix +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/stacktrace_ext_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/stacktrace_ext_test.go new file mode 100644 index 0000000..0edf5e1 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/stacktrace_ext_test.go @@ -0,0 +1,161 @@ +// Copyright (c) 2016, 2017 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. + +package zap_test + +import ( + "bytes" + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "runtime" + "strings" + "testing" + + "go.uber.org/zap" + "go.uber.org/zap/zapcore" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +// _zapPackages are packages that we search for in the logging output to match a +// zap stack frame. It is different from _zapStacktracePrefixes which is only +// intended to match on the function name, while this is on the full output +// which includes filenames. +var _zapPackages = []string{ + "go.uber.org/zap.", + "go.uber.org/zap/zapcore.", +} + +func TestStacktraceFiltersZapLog(t *testing.T) { + withLogger(t, func(logger *zap.Logger, out *bytes.Buffer) { + logger.Error("test log") + logger.Sugar().Error("sugar test log") + + require.Contains(t, out.String(), "TestStacktraceFiltersZapLog", "Should not strip out non-zap import") + verifyNoZap(t, out.String()) + }) +} + +func TestStacktraceFiltersZapMarshal(t *testing.T) { + withLogger(t, func(logger *zap.Logger, out *bytes.Buffer) { + marshal := func(enc zapcore.ObjectEncoder) error { + logger.Warn("marshal caused warn") + enc.AddString("f", "v") + return nil + } + logger.Error("test log", zap.Object("obj", zapcore.ObjectMarshalerFunc(marshal))) + + logs := out.String() + + // The marshal function (which will be under the test function) should not be stripped. + const marshalFnPrefix = "TestStacktraceFiltersZapMarshal." + require.Contains(t, logs, marshalFnPrefix, "Should not strip out marshal call") + + // There should be no zap stack traces before that point. + marshalIndex := strings.Index(logs, marshalFnPrefix) + verifyNoZap(t, logs[:marshalIndex]) + + // After that point, there should be zap stack traces - we don't want to strip out + // the Marshal caller information. + for _, fnPrefix := range _zapPackages { + require.Contains(t, logs[marshalIndex:], fnPrefix, "Missing zap caller stack for Marshal") + } + }) +} + +func TestStacktraceFiltersVendorZap(t *testing.T) { + // We need to simulate a zap as a vendor library, so we're going to create a fake GOPATH + // and run the above test which will contain zap in the vendor directory. + withGoPath(t, func(goPath string) { + curDir, err := os.Getwd() + require.NoError(t, err, "Failed to get current directory") + + testDir := filepath.Join(goPath, "src/go.uber.org/zap_test/") + vendorDir := filepath.Join(testDir, "vendor") + require.NoError(t, os.MkdirAll(testDir, 0777), "Failed to create source director") + + curFile := getSelfFilename(t) + //copyFile(t, curFile, filepath.Join(testDir, curFile)) + setupSymlink(t, curFile, filepath.Join(testDir, curFile)) + + // Set up symlinks for zap, and for any test dependencies. + setupSymlink(t, curDir, filepath.Join(vendorDir, "go.uber.org/zap")) + for _, testDep := range []string{"github.com/stretchr/testify"} { + setupSymlink(t, filepath.Join(curDir, "vendor", testDep), filepath.Join(vendorDir, testDep)) + } + + // Now run the above test which ensures we filter out zap stacktraces, but this time + // zap is in a vendor + cmd := exec.Command("go", "test", "-v", "-run", "TestStacktraceFiltersZap") + cmd.Dir = testDir + out, err := cmd.CombinedOutput() + require.NoError(t, err, "Failed to run test in vendor directory, output: %s", out) + assert.Contains(t, string(out), "PASS") + }) +} + +// withLogger sets up a logger with a real encoder set up, so that any marshal functions are called. +// The inbuilt observer does not call Marshal for objects/arrays, which we need for some tests. +func withLogger(t *testing.T, fn func(logger *zap.Logger, out *bytes.Buffer)) { + buf := &bytes.Buffer{} + encoder := zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig()) + core := zapcore.NewCore(encoder, zapcore.AddSync(buf), zapcore.DebugLevel) + logger := zap.New(core, zap.AddStacktrace(zap.DebugLevel)) + fn(logger, buf) +} + +func verifyNoZap(t *testing.T, logs string) { + for _, fnPrefix := range _zapPackages { + require.NotContains(t, logs, fnPrefix, "Should not strip out marshal call") + } +} + +func withGoPath(t *testing.T, f func(goPath string)) { + goPath, err := ioutil.TempDir("", "gopath") + require.NoError(t, err, "Failed to create temporary directory for GOPATH") + //defer os.RemoveAll(goPath) + + os.Setenv("GOPATH", goPath) + defer os.Setenv("GOPATH", os.Getenv("GOPATH")) + + f(goPath) +} + +func getSelfFilename(t *testing.T) string { + _, file, _, ok := runtime.Caller(0) + require.True(t, ok, "Failed to get caller information to identify local file") + + return filepath.Base(file) +} + +func setupSymlink(t *testing.T, src, dst string) { + // Make sure the destination directory exists. + os.MkdirAll(filepath.Dir(dst), 0777) + + // Get absolute path of the source for the symlink, otherwise we can create a symlink + // that uses relative paths. + srcAbs, err := filepath.Abs(src) + require.NoError(t, err, "Failed to get absolute path") + + require.NoError(t, os.Symlink(srcAbs, dst), "Failed to set up symlink") +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/stacktrace_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/stacktrace_test.go new file mode 100644 index 0000000..3c9a41c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/stacktrace_test.go @@ -0,0 +1,75 @@ +// 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 +// 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. + +package zap + +import ( + "strings" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestTakeStacktrace(t *testing.T) { + trace := takeStacktrace() + lines := strings.Split(trace, "\n") + require.True(t, len(lines) > 0, "Expected stacktrace to have at least one frame.") + assert.Contains( + t, + lines[0], + "testing.", + "Expected stacktrace to start with the test runner (zap frames are filtered out) %s.", lines[0], + ) +} + +func TestIsZapFrame(t *testing.T) { + zapFrames := []string{ + "go.uber.org/zap.Stack", + "go.uber.org/zap.(*SugaredLogger).log", + "go.uber.org/zap/zapcore.(ArrayMarshalerFunc).MarshalLogArray", + "github.com/uber/tchannel-go/vendor/go.uber.org/zap.Stack", + "github.com/uber/tchannel-go/vendor/go.uber.org/zap.(*SugaredLogger).log", + "github.com/uber/tchannel-go/vendor/go.uber.org/zap/zapcore.(ArrayMarshalerFunc).MarshalLogArray", + } + nonZapFrames := []string{ + "github.com/uber/tchannel-go.NewChannel", + "go.uber.org/not-zap.New", + "go.uber.org/zapext.ctx", + "go.uber.org/zap_ext/ctx.New", + } + + t.Run("zap frames", func(t *testing.T) { + for _, f := range zapFrames { + require.True(t, isZapFrame(f), f) + } + }) + t.Run("non-zap frames", func(t *testing.T) { + for _, f := range nonZapFrames { + require.False(t, isZapFrame(f), f) + } + }) +} + +func BenchmarkTakeStacktrace(b *testing.B) { + for i := 0; i < b.N; i++ { + takeStacktrace() + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/sugar.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/sugar.go new file mode 100644 index 0000000..9cda009 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/sugar.go @@ -0,0 +1,304 @@ +// 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 +// 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. + +package zap + +import ( + "fmt" + + "go.uber.org/zap/zapcore" + + "go.uber.org/multierr" +) + +const ( + _oddNumberErrMsg = "Ignored key without a value." + _nonStringKeyErrMsg = "Ignored key-value pairs with non-string keys." +) + +// A SugaredLogger wraps the base Logger functionality in a slower, but less +// verbose, API. Any Logger can be converted to a SugaredLogger with its Sugar +// method. +// +// Unlike the Logger, the SugaredLogger doesn't insist on structured logging. +// For each log level, it exposes three methods: one for loosely-typed +// structured logging, one for println-style formatting, and one for +// printf-style formatting. For example, SugaredLoggers can produce InfoLevel +// output with Infow ("info with" structured context), Info, or Infof. +type SugaredLogger struct { + base *Logger +} + +// Desugar unwraps a SugaredLogger, exposing the original Logger. Desugaring +// is quite inexpensive, so it's reasonable for a single application to use +// both Loggers and SugaredLoggers, converting between them on the boundaries +// of performance-sensitive code. +func (s *SugaredLogger) Desugar() *Logger { + base := s.base.clone() + base.callerSkip -= 2 + return base +} + +// Named adds a sub-scope to the logger's name. See Logger.Named for details. +func (s *SugaredLogger) Named(name string) *SugaredLogger { + return &SugaredLogger{base: s.base.Named(name)} +} + +// With adds a variadic number of fields to the logging context. It accepts a +// mix of strongly-typed zapcore.Field objects and loosely-typed key-value +// pairs. When processing pairs, the first element of the pair is used as the +// field key and the second as the field value. +// +// For example, +// sugaredLogger.With( +// "hello", "world", +// "failure", errors.New("oh no"), +// Stack(), +// "count", 42, +// "user", User{Name: "alice"}, +// ) +// is the equivalent of +// unsugared.With( +// String("hello", "world"), +// String("failure", "oh no"), +// Stack(), +// Int("count", 42), +// Object("user", User{Name: "alice"}), +// ) +// +// Note that the keys in key-value pairs should be strings. In development, +// passing a non-string key panics. In production, the logger is more +// forgiving: a separate error is logged, but the key-value pair is skipped +// and execution continues. Passing an orphaned key triggers similar behavior: +// panics in development and errors in production. +func (s *SugaredLogger) With(args ...interface{}) *SugaredLogger { + return &SugaredLogger{base: s.base.With(s.sweetenFields(args)...)} +} + +// Debug uses fmt.Sprint to construct and log a message. +func (s *SugaredLogger) Debug(args ...interface{}) { + s.log(DebugLevel, "", args, nil) +} + +// Info uses fmt.Sprint to construct and log a message. +func (s *SugaredLogger) Info(args ...interface{}) { + s.log(InfoLevel, "", args, nil) +} + +// Warn uses fmt.Sprint to construct and log a message. +func (s *SugaredLogger) Warn(args ...interface{}) { + s.log(WarnLevel, "", args, nil) +} + +// Error uses fmt.Sprint to construct and log a message. +func (s *SugaredLogger) Error(args ...interface{}) { + s.log(ErrorLevel, "", args, nil) +} + +// DPanic uses fmt.Sprint to construct and log a message. In development, the +// logger then panics. (See DPanicLevel for details.) +func (s *SugaredLogger) DPanic(args ...interface{}) { + s.log(DPanicLevel, "", args, nil) +} + +// Panic uses fmt.Sprint to construct and log a message, then panics. +func (s *SugaredLogger) Panic(args ...interface{}) { + s.log(PanicLevel, "", args, nil) +} + +// Fatal uses fmt.Sprint to construct and log a message, then calls os.Exit. +func (s *SugaredLogger) Fatal(args ...interface{}) { + s.log(FatalLevel, "", args, nil) +} + +// Debugf uses fmt.Sprintf to log a templated message. +func (s *SugaredLogger) Debugf(template string, args ...interface{}) { + s.log(DebugLevel, template, args, nil) +} + +// Infof uses fmt.Sprintf to log a templated message. +func (s *SugaredLogger) Infof(template string, args ...interface{}) { + s.log(InfoLevel, template, args, nil) +} + +// Warnf uses fmt.Sprintf to log a templated message. +func (s *SugaredLogger) Warnf(template string, args ...interface{}) { + s.log(WarnLevel, template, args, nil) +} + +// Errorf uses fmt.Sprintf to log a templated message. +func (s *SugaredLogger) Errorf(template string, args ...interface{}) { + s.log(ErrorLevel, template, args, nil) +} + +// DPanicf uses fmt.Sprintf to log a templated message. In development, the +// logger then panics. (See DPanicLevel for details.) +func (s *SugaredLogger) DPanicf(template string, args ...interface{}) { + s.log(DPanicLevel, template, args, nil) +} + +// Panicf uses fmt.Sprintf to log a templated message, then panics. +func (s *SugaredLogger) Panicf(template string, args ...interface{}) { + s.log(PanicLevel, template, args, nil) +} + +// Fatalf uses fmt.Sprintf to log a templated message, then calls os.Exit. +func (s *SugaredLogger) Fatalf(template string, args ...interface{}) { + s.log(FatalLevel, template, args, nil) +} + +// Debugw logs a message with some additional context. The variadic key-value +// pairs are treated as they are in With. +// +// When debug-level logging is disabled, this is much faster than +// s.With(keysAndValues).Debug(msg) +func (s *SugaredLogger) Debugw(msg string, keysAndValues ...interface{}) { + s.log(DebugLevel, msg, nil, keysAndValues) +} + +// Infow logs a message with some additional context. The variadic key-value +// pairs are treated as they are in With. +func (s *SugaredLogger) Infow(msg string, keysAndValues ...interface{}) { + s.log(InfoLevel, msg, nil, keysAndValues) +} + +// Warnw logs a message with some additional context. The variadic key-value +// pairs are treated as they are in With. +func (s *SugaredLogger) Warnw(msg string, keysAndValues ...interface{}) { + s.log(WarnLevel, msg, nil, keysAndValues) +} + +// Errorw logs a message with some additional context. The variadic key-value +// pairs are treated as they are in With. +func (s *SugaredLogger) Errorw(msg string, keysAndValues ...interface{}) { + s.log(ErrorLevel, msg, nil, keysAndValues) +} + +// DPanicw logs a message with some additional context. In development, the +// logger then panics. (See DPanicLevel for details.) The variadic key-value +// pairs are treated as they are in With. +func (s *SugaredLogger) DPanicw(msg string, keysAndValues ...interface{}) { + s.log(DPanicLevel, msg, nil, keysAndValues) +} + +// Panicw logs a message with some additional context, then panics. The +// variadic key-value pairs are treated as they are in With. +func (s *SugaredLogger) Panicw(msg string, keysAndValues ...interface{}) { + s.log(PanicLevel, msg, nil, keysAndValues) +} + +// Fatalw logs a message with some additional context, then calls os.Exit. The +// variadic key-value pairs are treated as they are in With. +func (s *SugaredLogger) Fatalw(msg string, keysAndValues ...interface{}) { + s.log(FatalLevel, msg, nil, keysAndValues) +} + +// Sync flushes any buffered log entries. +func (s *SugaredLogger) Sync() error { + return s.base.Sync() +} + +func (s *SugaredLogger) log(lvl zapcore.Level, template string, fmtArgs []interface{}, context []interface{}) { + // If logging at this level is completely disabled, skip the overhead of + // string formatting. + if lvl < DPanicLevel && !s.base.Core().Enabled(lvl) { + return + } + + // Format with Sprint, Sprintf, or neither. + msg := template + if msg == "" && len(fmtArgs) > 0 { + msg = fmt.Sprint(fmtArgs...) + } else if msg != "" && len(fmtArgs) > 0 { + msg = fmt.Sprintf(template, fmtArgs...) + } + + if ce := s.base.Check(lvl, msg); ce != nil { + ce.Write(s.sweetenFields(context)...) + } +} + +func (s *SugaredLogger) sweetenFields(args []interface{}) []zapcore.Field { + if len(args) == 0 { + return nil + } + + // Allocate enough space for the worst case; if users pass only structured + // fields, we shouldn't penalize them with extra allocations. + fields := make([]zapcore.Field, 0, len(args)) + var invalid invalidPairs + + for i := 0; i < len(args); { + // This is a strongly-typed field. Consume it and move on. + if f, ok := args[i].(zapcore.Field); ok { + fields = append(fields, f) + i++ + continue + } + + // Make sure this element isn't a dangling key. + if i == len(args)-1 { + s.base.DPanic(_oddNumberErrMsg, Any("ignored", args[i])) + break + } + + // Consume this value and the next, treating them as a key-value pair. If the + // key isn't a string, add this pair to the slice of invalid pairs. + key, val := args[i], args[i+1] + if keyStr, ok := key.(string); !ok { + // Subsequent errors are likely, so allocate once up front. + if cap(invalid) == 0 { + invalid = make(invalidPairs, 0, len(args)/2) + } + invalid = append(invalid, invalidPair{i, key, val}) + } else { + fields = append(fields, Any(keyStr, val)) + } + i += 2 + } + + // If we encountered any invalid key-value pairs, log an error. + if len(invalid) > 0 { + s.base.DPanic(_nonStringKeyErrMsg, Array("invalid", invalid)) + } + return fields +} + +type invalidPair struct { + position int + key, value interface{} +} + +func (p invalidPair) MarshalLogObject(enc zapcore.ObjectEncoder) error { + enc.AddInt64("position", int64(p.position)) + Any("key", p.key).AddTo(enc) + Any("value", p.value).AddTo(enc) + return nil +} + +type invalidPairs []invalidPair + +func (ps invalidPairs) MarshalLogArray(enc zapcore.ArrayEncoder) error { + var err error + for i := range ps { + err = multierr.Append(err, enc.AppendObject(ps[i])) + } + return err +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/sugar_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/sugar_test.go new file mode 100644 index 0000000..69eb1fa --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/sugar_test.go @@ -0,0 +1,374 @@ +// 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 +// 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. + +package zap + +import ( + "testing" + + "go.uber.org/zap/internal/exit" + "go.uber.org/zap/zapcore" + "go.uber.org/zap/zaptest" + "go.uber.org/zap/zaptest/observer" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestSugarWith(t *testing.T) { + // Convenience functions to create expected error logs. + ignored := func(msg interface{}) observer.LoggedEntry { + return observer.LoggedEntry{ + Entry: zapcore.Entry{Level: DPanicLevel, Message: _oddNumberErrMsg}, + Context: []zapcore.Field{Any("ignored", msg)}, + } + } + nonString := func(pairs ...invalidPair) observer.LoggedEntry { + return observer.LoggedEntry{ + Entry: zapcore.Entry{Level: DPanicLevel, Message: _nonStringKeyErrMsg}, + Context: []zapcore.Field{Array("invalid", invalidPairs(pairs))}, + } + } + + tests := []struct { + desc string + args []interface{} + expected []zapcore.Field + errLogs []observer.LoggedEntry + }{ + { + desc: "nil args", + args: nil, + expected: []zapcore.Field{}, + errLogs: nil, + }, + { + desc: "empty slice of args", + args: []interface{}{}, + expected: []zapcore.Field{}, + errLogs: nil, + }, + { + desc: "just a dangling key", + args: []interface{}{"should ignore"}, + expected: []zapcore.Field{}, + errLogs: []observer.LoggedEntry{ignored("should ignore")}, + }, + { + desc: "well-formed key-value pairs", + args: []interface{}{"foo", 42, "true", "bar"}, + expected: []zapcore.Field{Int("foo", 42), String("true", "bar")}, + errLogs: nil, + }, + { + desc: "just a structured field", + args: []interface{}{Int("foo", 42)}, + expected: []zapcore.Field{Int("foo", 42)}, + errLogs: nil, + }, + { + desc: "structured field and a dangling key", + args: []interface{}{Int("foo", 42), "dangling"}, + expected: []zapcore.Field{Int("foo", 42)}, + errLogs: []observer.LoggedEntry{ignored("dangling")}, + }, + { + desc: "structured field and a dangling non-string key", + args: []interface{}{Int("foo", 42), 13}, + expected: []zapcore.Field{Int("foo", 42)}, + errLogs: []observer.LoggedEntry{ignored(13)}, + }, + { + desc: "key-value pair and a dangling key", + args: []interface{}{"foo", 42, "dangling"}, + expected: []zapcore.Field{Int("foo", 42)}, + errLogs: []observer.LoggedEntry{ignored("dangling")}, + }, + { + desc: "pairs, a structured field, and a dangling key", + args: []interface{}{"first", "field", Int("foo", 42), "baz", "quux", "dangling"}, + expected: []zapcore.Field{String("first", "field"), Int("foo", 42), String("baz", "quux")}, + errLogs: []observer.LoggedEntry{ignored("dangling")}, + }, + { + desc: "one non-string key", + args: []interface{}{"foo", 42, true, "bar"}, + expected: []zapcore.Field{Int("foo", 42)}, + errLogs: []observer.LoggedEntry{nonString(invalidPair{2, true, "bar"})}, + }, + { + desc: "pairs, structured fields, non-string keys, and a dangling key", + args: []interface{}{"foo", 42, true, "bar", Int("structure", 11), 42, "reversed", "baz", "quux", "dangling"}, + expected: []zapcore.Field{Int("foo", 42), Int("structure", 11), String("baz", "quux")}, + errLogs: []observer.LoggedEntry{ + ignored("dangling"), + nonString(invalidPair{2, true, "bar"}, invalidPair{5, 42, "reversed"}), + }, + }, + } + + for _, tt := range tests { + withSugar(t, DebugLevel, nil, func(logger *SugaredLogger, logs *observer.ObservedLogs) { + logger.With(tt.args...).Info("") + output := logs.AllUntimed() + if len(tt.errLogs) > 0 { + for i := range tt.errLogs { + assert.Equal(t, tt.errLogs[i], output[i], "Unexpected error log at position %d for scenario %s.", i, tt.desc) + } + } + assert.Equal(t, len(tt.errLogs)+1, len(output), "Expected only one non-error message to be logged in scenario %s.", tt.desc) + assert.Equal(t, tt.expected, output[len(tt.errLogs)].Context, "Unexpected message context in scenario %s.", tt.desc) + }) + } +} + +func TestSugarFieldsInvalidPairs(t *testing.T) { + withSugar(t, DebugLevel, nil, func(logger *SugaredLogger, logs *observer.ObservedLogs) { + logger.With(42, "foo", []string{"bar"}, "baz").Info("") + output := logs.AllUntimed() + + // Double-check that the actual message was logged. + require.Equal(t, 2, len(output), "Unexpected number of entries logged.") + require.Equal(t, observer.LoggedEntry{Context: []zapcore.Field{}}, output[1], "Unexpected non-error log entry.") + + // Assert that the error message's structured fields serialize properly. + require.Equal(t, 1, len(output[0].Context), "Expected one field in error entry context.") + enc := zapcore.NewMapObjectEncoder() + output[0].Context[0].AddTo(enc) + assert.Equal(t, []interface{}{ + map[string]interface{}{"position": int64(0), "key": int64(42), "value": "foo"}, + map[string]interface{}{"position": int64(2), "key": []interface{}{"bar"}, "value": "baz"}, + }, enc.Fields["invalid"], "Unexpected output when logging invalid key-value pairs.") + }) +} + +type stringerF func() string + +func (f stringerF) String() string { return f() } + +func TestSugarStructuredLogging(t *testing.T) { + tests := []struct { + msg string + expectMsg string + }{ + {"foo", "foo"}, + {"", ""}, + } + + // Common to all test cases. + context := []interface{}{"foo", "bar"} + extra := []interface{}{"baz", false} + expectedFields := []zapcore.Field{String("foo", "bar"), Bool("baz", false)} + + for _, tt := range tests { + withSugar(t, DebugLevel, nil, func(logger *SugaredLogger, logs *observer.ObservedLogs) { + logger.With(context...).Debugw(tt.msg, extra...) + logger.With(context...).Infow(tt.msg, extra...) + logger.With(context...).Warnw(tt.msg, extra...) + logger.With(context...).Errorw(tt.msg, extra...) + logger.With(context...).DPanicw(tt.msg, extra...) + + expected := make([]observer.LoggedEntry, 5) + for i, lvl := range []zapcore.Level{DebugLevel, InfoLevel, WarnLevel, ErrorLevel, DPanicLevel} { + expected[i] = observer.LoggedEntry{ + Entry: zapcore.Entry{Message: tt.expectMsg, Level: lvl}, + Context: expectedFields, + } + } + assert.Equal(t, expected, logs.AllUntimed(), "Unexpected log output.") + }) + } +} + +func TestSugarConcatenatingLogging(t *testing.T) { + tests := []struct { + args []interface{} + expect string + }{ + {[]interface{}{nil}, ""}, + } + + // Common to all test cases. + context := []interface{}{"foo", "bar"} + expectedFields := []zapcore.Field{String("foo", "bar")} + + for _, tt := range tests { + withSugar(t, DebugLevel, nil, func(logger *SugaredLogger, logs *observer.ObservedLogs) { + logger.With(context...).Debug(tt.args...) + logger.With(context...).Info(tt.args...) + logger.With(context...).Warn(tt.args...) + logger.With(context...).Error(tt.args...) + logger.With(context...).DPanic(tt.args...) + + expected := make([]observer.LoggedEntry, 5) + for i, lvl := range []zapcore.Level{DebugLevel, InfoLevel, WarnLevel, ErrorLevel, DPanicLevel} { + expected[i] = observer.LoggedEntry{ + Entry: zapcore.Entry{Message: tt.expect, Level: lvl}, + Context: expectedFields, + } + } + assert.Equal(t, expected, logs.AllUntimed(), "Unexpected log output.") + }) + } +} + +func TestSugarTemplatedLogging(t *testing.T) { + tests := []struct { + format string + args []interface{} + expect string + }{ + {"", nil, ""}, + {"foo", nil, "foo"}, + // If the user fails to pass a template, degrade to fmt.Sprint. + {"", []interface{}{"foo"}, "foo"}, + } + + // Common to all test cases. + context := []interface{}{"foo", "bar"} + expectedFields := []zapcore.Field{String("foo", "bar")} + + for _, tt := range tests { + withSugar(t, DebugLevel, nil, func(logger *SugaredLogger, logs *observer.ObservedLogs) { + logger.With(context...).Debugf(tt.format, tt.args...) + logger.With(context...).Infof(tt.format, tt.args...) + logger.With(context...).Warnf(tt.format, tt.args...) + logger.With(context...).Errorf(tt.format, tt.args...) + logger.With(context...).DPanicf(tt.format, tt.args...) + + expected := make([]observer.LoggedEntry, 5) + for i, lvl := range []zapcore.Level{DebugLevel, InfoLevel, WarnLevel, ErrorLevel, DPanicLevel} { + expected[i] = observer.LoggedEntry{ + Entry: zapcore.Entry{Message: tt.expect, Level: lvl}, + Context: expectedFields, + } + } + assert.Equal(t, expected, logs.AllUntimed(), "Unexpected log output.") + }) + } +} + +func TestSugarPanicLogging(t *testing.T) { + tests := []struct { + loggerLevel zapcore.Level + f func(*SugaredLogger) + expectedMsg string + }{ + {FatalLevel, func(s *SugaredLogger) { s.Panic("foo") }, ""}, + {PanicLevel, func(s *SugaredLogger) { s.Panic("foo") }, "foo"}, + {DebugLevel, func(s *SugaredLogger) { s.Panic("foo") }, "foo"}, + {FatalLevel, func(s *SugaredLogger) { s.Panicf("%s", "foo") }, ""}, + {PanicLevel, func(s *SugaredLogger) { s.Panicf("%s", "foo") }, "foo"}, + {DebugLevel, func(s *SugaredLogger) { s.Panicf("%s", "foo") }, "foo"}, + {FatalLevel, func(s *SugaredLogger) { s.Panicw("foo") }, ""}, + {PanicLevel, func(s *SugaredLogger) { s.Panicw("foo") }, "foo"}, + {DebugLevel, func(s *SugaredLogger) { s.Panicw("foo") }, "foo"}, + } + + for _, tt := range tests { + withSugar(t, tt.loggerLevel, nil, func(sugar *SugaredLogger, logs *observer.ObservedLogs) { + assert.Panics(t, func() { tt.f(sugar) }, "Expected panic-level logger calls to panic.") + if tt.expectedMsg != "" { + assert.Equal(t, []observer.LoggedEntry{{ + Context: []zapcore.Field{}, + Entry: zapcore.Entry{Message: tt.expectedMsg, Level: PanicLevel}, + }}, logs.AllUntimed(), "Unexpected log output.") + } else { + assert.Equal(t, 0, logs.Len(), "Didn't expect any log output.") + } + }) + } +} + +func TestSugarFatalLogging(t *testing.T) { + tests := []struct { + loggerLevel zapcore.Level + f func(*SugaredLogger) + expectedMsg string + }{ + {FatalLevel + 1, func(s *SugaredLogger) { s.Fatal("foo") }, ""}, + {FatalLevel, func(s *SugaredLogger) { s.Fatal("foo") }, "foo"}, + {DebugLevel, func(s *SugaredLogger) { s.Fatal("foo") }, "foo"}, + {FatalLevel + 1, func(s *SugaredLogger) { s.Fatalf("%s", "foo") }, ""}, + {FatalLevel, func(s *SugaredLogger) { s.Fatalf("%s", "foo") }, "foo"}, + {DebugLevel, func(s *SugaredLogger) { s.Fatalf("%s", "foo") }, "foo"}, + {FatalLevel + 1, func(s *SugaredLogger) { s.Fatalw("foo") }, ""}, + {FatalLevel, func(s *SugaredLogger) { s.Fatalw("foo") }, "foo"}, + {DebugLevel, func(s *SugaredLogger) { s.Fatalw("foo") }, "foo"}, + } + + for _, tt := range tests { + withSugar(t, tt.loggerLevel, nil, func(sugar *SugaredLogger, logs *observer.ObservedLogs) { + stub := exit.WithStub(func() { tt.f(sugar) }) + assert.True(t, stub.Exited, "Expected all calls to fatal logger methods to exit process.") + if tt.expectedMsg != "" { + assert.Equal(t, []observer.LoggedEntry{{ + Context: []zapcore.Field{}, + Entry: zapcore.Entry{Message: tt.expectedMsg, Level: FatalLevel}, + }}, logs.AllUntimed(), "Unexpected log output.") + } else { + assert.Equal(t, 0, logs.Len(), "Didn't expect any log output.") + } + }) + } +} + +func TestSugarAddCaller(t *testing.T) { + tests := []struct { + options []Option + pat string + }{ + {opts(AddCaller()), `.+/sugar_test.go:[\d]+$`}, + {opts(AddCaller(), AddCallerSkip(1), AddCallerSkip(-1)), `.+/zap/sugar_test.go:[\d]+$`}, + {opts(AddCaller(), AddCallerSkip(1)), `.+/zap/common_test.go:[\d]+$`}, + {opts(AddCaller(), AddCallerSkip(1), AddCallerSkip(5)), `.+/src/runtime/.*:[\d]+$`}, + } + for _, tt := range tests { + withSugar(t, DebugLevel, tt.options, func(logger *SugaredLogger, logs *observer.ObservedLogs) { + logger.Info("") + output := logs.AllUntimed() + assert.Equal(t, 1, len(output), "Unexpected number of logs written out.") + assert.Regexp( + t, + tt.pat, + output[0].Entry.Caller, + "Expected to find package name and file name in output.", + ) + }) + } +} + +func TestSugarAddCallerFail(t *testing.T) { + errBuf := &zaptest.Buffer{} + withSugar(t, DebugLevel, opts(AddCaller(), AddCallerSkip(1e3), ErrorOutput(errBuf)), func(log *SugaredLogger, logs *observer.ObservedLogs) { + log.Info("Failure.") + assert.Regexp( + t, + `Logger.check error: failed to get caller`, + errBuf.String(), + "Didn't find expected failure message.", + ) + assert.Equal( + t, + logs.AllUntimed()[0].Entry.Message, + "Failure.", + "Expected original message to survive failures in runtime.Caller.") + }) +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/time.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/time.go new file mode 100644 index 0000000..c5a1f16 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/time.go @@ -0,0 +1,27 @@ +// 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 +// 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. + +package zap + +import "time" + +func timeToMillis(t time.Time) int64 { + return t.UnixNano() / int64(time.Millisecond) +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/time_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/time_test.go new file mode 100644 index 0000000..cb993ab --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/time_test.go @@ -0,0 +1,42 @@ +// 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 +// 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. + +package zap + +import ( + "testing" + "time" + + "github.com/stretchr/testify/assert" +) + +func TestTimeToMillis(t *testing.T) { + tests := []struct { + t time.Time + stamp int64 + }{ + {t: time.Unix(0, 0), stamp: 0}, + {t: time.Unix(1, 0), stamp: 1000}, + {t: time.Unix(1, int64(500*time.Millisecond)), stamp: 1500}, + } + for _, tt := range tests { + assert.Equal(t, tt.stamp, timeToMillis(tt.t), "Unexpected timestamp for time %v.", tt.t) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/writer.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/writer.go new file mode 100644 index 0000000..16f55ce --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/writer.go @@ -0,0 +1,96 @@ +// 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 +// 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. + +package zap + +import ( + "io/ioutil" + "os" + + "go.uber.org/zap/zapcore" + + "go.uber.org/multierr" +) + +// Open is a high-level wrapper that takes a variadic number of paths, opens or +// creates each of the specified files, and combines them into a locked +// WriteSyncer. It also returns any error encountered and a function to close +// any opened files. +// +// Passing no paths returns a no-op WriteSyncer. The special paths "stdout" and +// "stderr" are interpreted as os.Stdout and os.Stderr, respectively. +func Open(paths ...string) (zapcore.WriteSyncer, func(), error) { + writers, close, err := open(paths) + if err != nil { + return nil, nil, err + } + + writer := CombineWriteSyncers(writers...) + return writer, close, nil +} + +func open(paths []string) ([]zapcore.WriteSyncer, func(), error) { + var openErr error + writers := make([]zapcore.WriteSyncer, 0, len(paths)) + files := make([]*os.File, 0, len(paths)) + close := func() { + for _, f := range files { + f.Close() + } + } + for _, path := range paths { + switch path { + case "stdout": + writers = append(writers, os.Stdout) + // Don't close standard out. + continue + case "stderr": + writers = append(writers, os.Stderr) + // Don't close standard error. + continue + } + f, err := os.OpenFile(path, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644) + openErr = multierr.Append(openErr, err) + if err == nil { + writers = append(writers, f) + files = append(files, f) + } + } + + if openErr != nil { + close() + return writers, nil, openErr + } + + return writers, close, nil +} + +// CombineWriteSyncers is a utility that combines multiple WriteSyncers into a +// single, locked WriteSyncer. If no inputs are supplied, it returns a no-op +// WriteSyncer. +// +// It's provided purely as a convenience; the result is no different from +// using zapcore.NewMultiWriteSyncer and zapcore.Lock individually. +func CombineWriteSyncers(writers ...zapcore.WriteSyncer) zapcore.WriteSyncer { + if len(writers) == 0 { + return zapcore.AddSync(ioutil.Discard) + } + return zapcore.Lock(zapcore.NewMultiWriteSyncer(writers...)) +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/writer_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/writer_test.go new file mode 100644 index 0000000..1293832 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/writer_test.go @@ -0,0 +1,125 @@ +// 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 +// 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. + +package zap + +import ( + "io/ioutil" + "os" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.uber.org/zap/zapcore" +) + +func TestOpenNoPaths(t *testing.T) { + ws, cleanup, err := Open() + defer cleanup() + + assert.NoError(t, err, "Expected opening no paths to succeed.") + assert.Equal( + t, + zapcore.AddSync(ioutil.Discard), + ws, + "Expected opening no paths to return a no-op WriteSyncer.", + ) +} + +func TestOpen(t *testing.T) { + temp, err := ioutil.TempFile("", "zap-open-test") + require.NoError(t, err, "Couldn't create a temporary file for test.") + defer os.Remove(temp.Name()) + + tests := []struct { + paths []string + filenames []string + error string + }{ + {[]string{"stdout"}, []string{os.Stdout.Name()}, ""}, + {[]string{"stderr"}, []string{os.Stderr.Name()}, ""}, + {[]string{temp.Name()}, []string{temp.Name()}, ""}, + {[]string{"/foo/bar/baz"}, []string{}, "open /foo/bar/baz: no such file or directory"}, + { + paths: []string{"stdout", "/foo/bar/baz", temp.Name(), "/baz/quux"}, + filenames: []string{os.Stdout.Name(), temp.Name()}, + error: "open /foo/bar/baz: no such file or directory; open /baz/quux: no such file or directory", + }, + } + + for _, tt := range tests { + wss, cleanup, err := open(tt.paths) + if err == nil { + defer cleanup() + } + + if tt.error == "" { + assert.NoError(t, err, "Unexpected error opening paths %v.", tt.paths) + } else { + assert.Equal(t, tt.error, err.Error(), "Unexpected error opening paths %v.", tt.paths) + } + names := make([]string, len(wss)) + for i, ws := range wss { + f, ok := ws.(*os.File) + require.True(t, ok, "Expected all WriteSyncers returned from open() to be files.") + names[i] = f.Name() + } + assert.Equal(t, tt.filenames, names, "Opened unexpected files given paths %v.", tt.paths) + } +} + +func TestOpenFails(t *testing.T) { + tests := []struct { + paths []string + }{ + { + paths: []string{"./non-existent-dir/file"}, + }, + { + paths: []string{"stdout", "./non-existent-dir/file"}, + }, + } + + for _, tt := range tests { + _, cleanup, err := Open(tt.paths...) + require.Nil(t, cleanup, "Cleanup function should never be nil") + assert.Error(t, err, "Open with non-existent directory should fail") + } +} + +type testWriter struct { + expected string + t testing.TB +} + +func (w *testWriter) Write(actual []byte) (int, error) { + assert.Equal(w.t, []byte(w.expected), actual, "Unexpected write error.") + return len(actual), nil +} + +func (w *testWriter) Sync() error { + return nil +} + +func TestCombineWriteSyncers(t *testing.T) { + tw := &testWriter{"test", t} + w := CombineWriteSyncers(tw) + w.Write([]byte("test")) +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/console_encoder.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/console_encoder.go new file mode 100644 index 0000000..b787596 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/console_encoder.go @@ -0,0 +1,147 @@ +// 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 +// 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. + +package zapcore + +import ( + "fmt" + "sync" + + "go.uber.org/zap/buffer" + "go.uber.org/zap/internal/bufferpool" +) + +var _sliceEncoderPool = sync.Pool{ + New: func() interface{} { + return &sliceArrayEncoder{elems: make([]interface{}, 0, 2)} + }, +} + +func getSliceEncoder() *sliceArrayEncoder { + return _sliceEncoderPool.Get().(*sliceArrayEncoder) +} + +func putSliceEncoder(e *sliceArrayEncoder) { + e.elems = e.elems[:0] + _sliceEncoderPool.Put(e) +} + +type consoleEncoder struct { + *jsonEncoder +} + +// NewConsoleEncoder creates an encoder whose output is designed for human - +// rather than machine - consumption. It serializes the core log entry data +// (message, level, timestamp, etc.) in a plain-text format and leaves the +// structured context as JSON. +// +// Note that although the console encoder doesn't use the keys specified in the +// encoder configuration, it will omit any element whose key is set to the empty +// string. +func NewConsoleEncoder(cfg EncoderConfig) Encoder { + return consoleEncoder{newJSONEncoder(cfg, true)} +} + +func (c consoleEncoder) Clone() Encoder { + return consoleEncoder{c.jsonEncoder.Clone().(*jsonEncoder)} +} + +func (c consoleEncoder) EncodeEntry(ent Entry, fields []Field) (*buffer.Buffer, error) { + line := bufferpool.Get() + + // We don't want the entry's metadata to be quoted and escaped (if it's + // encoded as strings), which means that we can't use the JSON encoder. The + // simplest option is to use the memory encoder and fmt.Fprint. + // + // If this ever becomes a performance bottleneck, we can implement + // ArrayEncoder for our plain-text format. + arr := getSliceEncoder() + if c.TimeKey != "" && c.EncodeTime != nil { + c.EncodeTime(ent.Time, arr) + } + if c.LevelKey != "" && c.EncodeLevel != nil { + c.EncodeLevel(ent.Level, arr) + } + if ent.LoggerName != "" && c.NameKey != "" { + nameEncoder := c.EncodeName + + if nameEncoder == nil { + // Fall back to FullNameEncoder for backward compatibility. + nameEncoder = FullNameEncoder + } + + nameEncoder(ent.LoggerName, arr) + } + if ent.Caller.Defined && c.CallerKey != "" && c.EncodeCaller != nil { + c.EncodeCaller(ent.Caller, arr) + } + for i := range arr.elems { + if i > 0 { + line.AppendByte('\t') + } + fmt.Fprint(line, arr.elems[i]) + } + putSliceEncoder(arr) + + // Add the message itself. + if c.MessageKey != "" { + c.addTabIfNecessary(line) + line.AppendString(ent.Message) + } + + // Add any structured context. + c.writeContext(line, fields) + + // If there's no stacktrace key, honor that; this allows users to force + // single-line output. + if ent.Stack != "" && c.StacktraceKey != "" { + line.AppendByte('\n') + line.AppendString(ent.Stack) + } + + if c.LineEnding != "" { + line.AppendString(c.LineEnding) + } else { + line.AppendString(DefaultLineEnding) + } + return line, nil +} + +func (c consoleEncoder) writeContext(line *buffer.Buffer, extra []Field) { + context := c.jsonEncoder.Clone().(*jsonEncoder) + defer context.buf.Free() + + addFields(context, extra) + context.closeOpenNamespaces() + if context.buf.Len() == 0 { + return + } + + c.addTabIfNecessary(line) + line.AppendByte('{') + line.Write(context.buf.Bytes()) + line.AppendByte('}') +} + +func (c consoleEncoder) addTabIfNecessary(line *buffer.Buffer) { + if line.Len() > 0 { + line.AppendByte('\t') + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/console_encoder_bench_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/console_encoder_bench_test.go new file mode 100644 index 0000000..62feaea --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/console_encoder_bench_test.go @@ -0,0 +1,49 @@ +// 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 +// 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. + +package zapcore_test + +import ( + "testing" + + . "go.uber.org/zap/zapcore" +) + +func BenchmarkZapConsole(b *testing.B) { + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + enc := NewConsoleEncoder(humanEncoderConfig()) + enc.AddString("str", "foo") + enc.AddInt64("int64-1", 1) + enc.AddInt64("int64-2", 2) + enc.AddFloat64("float64", 1.0) + enc.AddString("string1", "\n") + enc.AddString("string2", "💩") + enc.AddString("string3", "🤔") + enc.AddString("string4", "🙊") + enc.AddBool("bool", true) + buf, _ := enc.EncodeEntry(Entry{ + Message: "fake", + Level: DebugLevel, + }, nil) + buf.Free() + } + }) +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/core.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/core.go new file mode 100644 index 0000000..a1ef8b0 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/core.go @@ -0,0 +1,113 @@ +// 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 +// 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. + +package zapcore + +// Core is a minimal, fast logger interface. It's designed for library authors +// to wrap in a more user-friendly API. +type Core interface { + LevelEnabler + + // With adds structured context to the Core. + With([]Field) Core + // Check determines whether the supplied Entry should be logged (using the + // embedded LevelEnabler and possibly some extra logic). If the entry + // should be logged, the Core adds itself to the CheckedEntry and returns + // the result. + // + // Callers must use Check before calling Write. + Check(Entry, *CheckedEntry) *CheckedEntry + // Write serializes the Entry and any Fields supplied at the log site and + // writes them to their destination. + // + // If called, Write should always log the Entry and Fields; it should not + // replicate the logic of Check. + Write(Entry, []Field) error + // Sync flushes buffered logs (if any). + Sync() error +} + +type nopCore struct{} + +// NewNopCore returns a no-op Core. +func NewNopCore() Core { return nopCore{} } +func (nopCore) Enabled(Level) bool { return false } +func (n nopCore) With([]Field) Core { return n } +func (nopCore) Check(_ Entry, ce *CheckedEntry) *CheckedEntry { return ce } +func (nopCore) Write(Entry, []Field) error { return nil } +func (nopCore) Sync() error { return nil } + +// NewCore creates a Core that writes logs to a WriteSyncer. +func NewCore(enc Encoder, ws WriteSyncer, enab LevelEnabler) Core { + return &ioCore{ + LevelEnabler: enab, + enc: enc, + out: ws, + } +} + +type ioCore struct { + LevelEnabler + enc Encoder + out WriteSyncer +} + +func (c *ioCore) With(fields []Field) Core { + clone := c.clone() + addFields(clone.enc, fields) + return clone +} + +func (c *ioCore) Check(ent Entry, ce *CheckedEntry) *CheckedEntry { + if c.Enabled(ent.Level) { + return ce.AddCore(ent, c) + } + return ce +} + +func (c *ioCore) Write(ent Entry, fields []Field) error { + buf, err := c.enc.EncodeEntry(ent, fields) + if err != nil { + return err + } + _, err = c.out.Write(buf.Bytes()) + buf.Free() + if err != nil { + return err + } + if ent.Level > ErrorLevel { + // Since we may be crashing the program, sync the output. Ignore Sync + // errors, pending a clean solution to issue #370. + c.Sync() + } + return nil +} + +func (c *ioCore) Sync() error { + return c.out.Sync() +} + +func (c *ioCore) clone() *ioCore { + return &ioCore{ + LevelEnabler: c.LevelEnabler, + enc: c.enc.Clone(), + out: c.out, + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/core_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/core_test.go new file mode 100644 index 0000000..20a4720 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/core_test.go @@ -0,0 +1,163 @@ +// 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 +// 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. + +package zapcore_test + +import ( + "errors" + "io/ioutil" + "os" + "testing" + "time" + + . "go.uber.org/zap/zapcore" + "go.uber.org/zap/zaptest" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func makeInt64Field(key string, val int) Field { + return Field{Type: Int64Type, Integer: int64(val), Key: key} +} + +func TestNopCore(t *testing.T) { + entry := Entry{ + Message: "test", + Level: InfoLevel, + Time: time.Now(), + LoggerName: "main", + Stack: "fake-stack", + } + ce := &CheckedEntry{} + + allLevels := []Level{ + DebugLevel, + InfoLevel, + WarnLevel, + ErrorLevel, + DPanicLevel, + PanicLevel, + FatalLevel, + } + core := NewNopCore() + assert.Equal(t, core, core.With([]Field{makeInt64Field("k", 42)}), "Expected no-op With.") + for _, level := range allLevels { + assert.False(t, core.Enabled(level), "Expected all levels to be disabled in no-op core.") + assert.Equal(t, ce, core.Check(entry, ce), "Expected no-op Check to return checked entry unchanged.") + assert.NoError(t, core.Write(entry, nil), "Expected no-op Writes to always succeed.") + assert.NoError(t, core.Sync(), "Expected no-op Syncs to always succeed.") + } +} + +func TestIOCore(t *testing.T) { + temp, err := ioutil.TempFile("", "zapcore-test-iocore") + require.NoError(t, err, "Failed to create temp file.") + defer os.Remove(temp.Name()) + + // Drop timestamps for simpler assertions (timestamp encoding is tested + // elsewhere). + cfg := testEncoderConfig() + cfg.TimeKey = "" + + core := NewCore( + NewJSONEncoder(cfg), + temp, + InfoLevel, + ).With([]Field{makeInt64Field("k", 1)}) + defer assert.NoError(t, core.Sync(), "Expected Syncing a temp file to succeed.") + + if ce := core.Check(Entry{Level: DebugLevel, Message: "debug"}, nil); ce != nil { + ce.Write(makeInt64Field("k", 2)) + } + if ce := core.Check(Entry{Level: InfoLevel, Message: "info"}, nil); ce != nil { + ce.Write(makeInt64Field("k", 3)) + } + if ce := core.Check(Entry{Level: WarnLevel, Message: "warn"}, nil); ce != nil { + ce.Write(makeInt64Field("k", 4)) + } + + logged, err := ioutil.ReadFile(temp.Name()) + require.NoError(t, err, "Failed to read from temp file.") + require.Equal( + t, + `{"level":"info","msg":"info","k":1,"k":3}`+"\n"+ + `{"level":"warn","msg":"warn","k":1,"k":4}`+"\n", + string(logged), + "Unexpected log output.", + ) +} + +func TestIOCoreSyncFail(t *testing.T) { + sink := &zaptest.Discarder{} + err := errors.New("failed") + sink.SetError(err) + + core := NewCore( + NewJSONEncoder(testEncoderConfig()), + sink, + DebugLevel, + ) + + assert.Equal( + t, + err, + core.Sync(), + "Expected core.Sync to return errors from underlying WriteSyncer.", + ) +} + +func TestIOCoreSyncsOutput(t *testing.T) { + tests := []struct { + entry Entry + shouldSync bool + }{ + {Entry{Level: DebugLevel}, false}, + {Entry{Level: InfoLevel}, false}, + {Entry{Level: WarnLevel}, false}, + {Entry{Level: ErrorLevel}, false}, + {Entry{Level: DPanicLevel}, true}, + {Entry{Level: PanicLevel}, true}, + {Entry{Level: FatalLevel}, true}, + } + + for _, tt := range tests { + sink := &zaptest.Discarder{} + core := NewCore( + NewJSONEncoder(testEncoderConfig()), + sink, + DebugLevel, + ) + + core.Write(tt.entry, nil) + assert.Equal(t, tt.shouldSync, sink.Called(), "Incorrect Sync behavior.") + } +} + +func TestIOCoreWriteFailure(t *testing.T) { + core := NewCore( + NewJSONEncoder(testEncoderConfig()), + Lock(&zaptest.FailWriter{}), + DebugLevel, + ) + err := core.Write(Entry{}, nil) + // Should log the error. + assert.Error(t, err, "Expected writing Entry to fail.") +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/doc.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/doc.go new file mode 100644 index 0000000..31000e9 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/doc.go @@ -0,0 +1,24 @@ +// 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 +// 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. + +// Package zapcore defines and implements the low-level interfaces upon which +// zap is built. By providing alternate implementations of these interfaces, +// external packages can extend zap's capabilities. +package zapcore // import "go.uber.org/zap/zapcore" diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/encoder.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/encoder.go new file mode 100644 index 0000000..f050952 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/encoder.go @@ -0,0 +1,348 @@ +// 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 +// 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. + +package zapcore + +import ( + "time" + + "go.uber.org/zap/buffer" +) + +// DefaultLineEnding defines the default line ending when writing logs. +// Alternate line endings specified in EncoderConfig can override this +// behavior. +const DefaultLineEnding = "\n" + +// A LevelEncoder serializes a Level to a primitive type. +type LevelEncoder func(Level, PrimitiveArrayEncoder) + +// LowercaseLevelEncoder serializes a Level to a lowercase string. For example, +// InfoLevel is serialized to "info". +func LowercaseLevelEncoder(l Level, enc PrimitiveArrayEncoder) { + enc.AppendString(l.String()) +} + +// LowercaseColorLevelEncoder serializes a Level to a lowercase string and adds coloring. +// For example, InfoLevel is serialized to "info" and colored blue. +func LowercaseColorLevelEncoder(l Level, enc PrimitiveArrayEncoder) { + s, ok := _levelToLowercaseColorString[l] + if !ok { + s = _unknownLevelColor.Add(l.String()) + } + enc.AppendString(s) +} + +// CapitalLevelEncoder serializes a Level to an all-caps string. For example, +// InfoLevel is serialized to "INFO". +func CapitalLevelEncoder(l Level, enc PrimitiveArrayEncoder) { + enc.AppendString(l.CapitalString()) +} + +// CapitalColorLevelEncoder serializes a Level to an all-caps string and adds color. +// For example, InfoLevel is serialized to "INFO" and colored blue. +func CapitalColorLevelEncoder(l Level, enc PrimitiveArrayEncoder) { + s, ok := _levelToCapitalColorString[l] + if !ok { + s = _unknownLevelColor.Add(l.CapitalString()) + } + enc.AppendString(s) +} + +// UnmarshalText unmarshals text to a LevelEncoder. "capital" is unmarshaled to +// CapitalLevelEncoder, "coloredCapital" is unmarshaled to CapitalColorLevelEncoder, +// "colored" is unmarshaled to LowercaseColorLevelEncoder, and anything else +// is unmarshaled to LowercaseLevelEncoder. +func (e *LevelEncoder) UnmarshalText(text []byte) error { + switch string(text) { + case "capital": + *e = CapitalLevelEncoder + case "capitalColor": + *e = CapitalColorLevelEncoder + case "color": + *e = LowercaseColorLevelEncoder + default: + *e = LowercaseLevelEncoder + } + return nil +} + +// A TimeEncoder serializes a time.Time to a primitive type. +type TimeEncoder func(time.Time, PrimitiveArrayEncoder) + +// EpochTimeEncoder serializes a time.Time to a floating-point number of seconds +// since the Unix epoch. +func EpochTimeEncoder(t time.Time, enc PrimitiveArrayEncoder) { + nanos := t.UnixNano() + sec := float64(nanos) / float64(time.Second) + enc.AppendFloat64(sec) +} + +// EpochMillisTimeEncoder serializes a time.Time to a floating-point number of +// milliseconds since the Unix epoch. +func EpochMillisTimeEncoder(t time.Time, enc PrimitiveArrayEncoder) { + nanos := t.UnixNano() + millis := float64(nanos) / float64(time.Millisecond) + enc.AppendFloat64(millis) +} + +// EpochNanosTimeEncoder serializes a time.Time to an integer number of +// nanoseconds since the Unix epoch. +func EpochNanosTimeEncoder(t time.Time, enc PrimitiveArrayEncoder) { + enc.AppendInt64(t.UnixNano()) +} + +// ISO8601TimeEncoder serializes a time.Time to an ISO8601-formatted string +// with millisecond precision. +func ISO8601TimeEncoder(t time.Time, enc PrimitiveArrayEncoder) { + enc.AppendString(t.Format("2006-01-02T15:04:05.000Z0700")) +} + +// UnmarshalText unmarshals text to a TimeEncoder. "iso8601" and "ISO8601" are +// unmarshaled to ISO8601TimeEncoder, "millis" is unmarshaled to +// EpochMillisTimeEncoder, and anything else is unmarshaled to EpochTimeEncoder. +func (e *TimeEncoder) UnmarshalText(text []byte) error { + switch string(text) { + case "iso8601", "ISO8601": + *e = ISO8601TimeEncoder + case "millis": + *e = EpochMillisTimeEncoder + case "nanos": + *e = EpochNanosTimeEncoder + default: + *e = EpochTimeEncoder + } + return nil +} + +// A DurationEncoder serializes a time.Duration to a primitive type. +type DurationEncoder func(time.Duration, PrimitiveArrayEncoder) + +// SecondsDurationEncoder serializes a time.Duration to a floating-point number of seconds elapsed. +func SecondsDurationEncoder(d time.Duration, enc PrimitiveArrayEncoder) { + enc.AppendFloat64(float64(d) / float64(time.Second)) +} + +// NanosDurationEncoder serializes a time.Duration to an integer number of +// nanoseconds elapsed. +func NanosDurationEncoder(d time.Duration, enc PrimitiveArrayEncoder) { + enc.AppendInt64(int64(d)) +} + +// StringDurationEncoder serializes a time.Duration using its built-in String +// method. +func StringDurationEncoder(d time.Duration, enc PrimitiveArrayEncoder) { + enc.AppendString(d.String()) +} + +// UnmarshalText unmarshals text to a DurationEncoder. "string" is unmarshaled +// to StringDurationEncoder, and anything else is unmarshaled to +// NanosDurationEncoder. +func (e *DurationEncoder) UnmarshalText(text []byte) error { + switch string(text) { + case "string": + *e = StringDurationEncoder + case "nanos": + *e = NanosDurationEncoder + default: + *e = SecondsDurationEncoder + } + return nil +} + +// A CallerEncoder serializes an EntryCaller to a primitive type. +type CallerEncoder func(EntryCaller, PrimitiveArrayEncoder) + +// FullCallerEncoder serializes a caller in /full/path/to/package/file:line +// format. +func FullCallerEncoder(caller EntryCaller, enc PrimitiveArrayEncoder) { + // TODO: consider using a byte-oriented API to save an allocation. + enc.AppendString(caller.String()) +} + +// ShortCallerEncoder serializes a caller in package/file:line format, trimming +// all but the final directory from the full path. +func ShortCallerEncoder(caller EntryCaller, enc PrimitiveArrayEncoder) { + // TODO: consider using a byte-oriented API to save an allocation. + enc.AppendString(caller.TrimmedPath()) +} + +// UnmarshalText unmarshals text to a CallerEncoder. "full" is unmarshaled to +// FullCallerEncoder and anything else is unmarshaled to ShortCallerEncoder. +func (e *CallerEncoder) UnmarshalText(text []byte) error { + switch string(text) { + case "full": + *e = FullCallerEncoder + default: + *e = ShortCallerEncoder + } + return nil +} + +// A NameEncoder serializes a period-separated logger name to a primitive +// type. +type NameEncoder func(string, PrimitiveArrayEncoder) + +// FullNameEncoder serializes the logger name as-is. +func FullNameEncoder(loggerName string, enc PrimitiveArrayEncoder) { + enc.AppendString(loggerName) +} + +// UnmarshalText unmarshals text to a NameEncoder. Currently, everything is +// unmarshaled to FullNameEncoder. +func (e *NameEncoder) UnmarshalText(text []byte) error { + switch string(text) { + case "full": + *e = FullNameEncoder + default: + *e = FullNameEncoder + } + return nil +} + +// An EncoderConfig allows users to configure the concrete encoders supplied by +// zapcore. +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"` + StacktraceKey string `json:"stacktraceKey" yaml:"stacktraceKey"` + 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. + EncodeLevel LevelEncoder `json:"levelEncoder" yaml:"levelEncoder"` + EncodeTime TimeEncoder `json:"timeEncoder" yaml:"timeEncoder"` + EncodeDuration DurationEncoder `json:"durationEncoder" yaml:"durationEncoder"` + EncodeCaller CallerEncoder `json:"callerEncoder" yaml:"callerEncoder"` + // Unlike the other primitive type encoders, EncodeName is optional. The + // zero value falls back to FullNameEncoder. + EncodeName NameEncoder `json:"nameEncoder" yaml:"nameEncoder"` +} + +// ObjectEncoder is a strongly-typed, encoding-agnostic interface for adding a +// map- or struct-like object to the logging context. Like maps, ObjectEncoders +// aren't safe for concurrent use (though typical use shouldn't require locks). +type ObjectEncoder interface { + // Logging-specific marshalers. + AddArray(key string, marshaler ArrayMarshaler) error + AddObject(key string, marshaler ObjectMarshaler) error + + // Built-in types. + AddBinary(key string, value []byte) // for arbitrary bytes + AddByteString(key string, value []byte) // for UTF-8 encoded bytes + AddBool(key string, value bool) + AddComplex128(key string, value complex128) + AddComplex64(key string, value complex64) + AddDuration(key string, value time.Duration) + AddFloat64(key string, value float64) + AddFloat32(key string, value float32) + AddInt(key string, value int) + AddInt64(key string, value int64) + AddInt32(key string, value int32) + AddInt16(key string, value int16) + AddInt8(key string, value int8) + AddString(key, value string) + AddTime(key string, value time.Time) + AddUint(key string, value uint) + AddUint64(key string, value uint64) + AddUint32(key string, value uint32) + AddUint16(key string, value uint16) + AddUint8(key string, value uint8) + AddUintptr(key string, value uintptr) + + // AddReflected uses reflection to serialize arbitrary objects, so it's slow + // and allocation-heavy. + AddReflected(key string, value interface{}) error + // OpenNamespace opens an isolated namespace where all subsequent fields will + // be added. Applications can use namespaces to prevent key collisions when + // injecting loggers into sub-components or third-party libraries. + OpenNamespace(key string) +} + +// ArrayEncoder is a strongly-typed, encoding-agnostic interface for adding +// array-like objects to the logging context. Of note, it supports mixed-type +// arrays even though they aren't typical in Go. Like slices, ArrayEncoders +// aren't safe for concurrent use (though typical use shouldn't require locks). +type ArrayEncoder interface { + // Built-in types. + PrimitiveArrayEncoder + + // Time-related types. + AppendDuration(time.Duration) + AppendTime(time.Time) + + // Logging-specific marshalers. + AppendArray(ArrayMarshaler) error + AppendObject(ObjectMarshaler) error + + // AppendReflected uses reflection to serialize arbitrary objects, so it's + // slow and allocation-heavy. + AppendReflected(value interface{}) error +} + +// PrimitiveArrayEncoder is the subset of the ArrayEncoder interface that deals +// only in Go's built-in types. It's included only so that Duration- and +// TimeEncoders cannot trigger infinite recursion. +type PrimitiveArrayEncoder interface { + // Built-in types. + AppendBool(bool) + AppendByteString([]byte) // for UTF-8 encoded bytes + AppendComplex128(complex128) + AppendComplex64(complex64) + AppendFloat64(float64) + AppendFloat32(float32) + AppendInt(int) + AppendInt64(int64) + AppendInt32(int32) + AppendInt16(int16) + AppendInt8(int8) + AppendString(string) + AppendUint(uint) + AppendUint64(uint64) + AppendUint32(uint32) + AppendUint16(uint16) + AppendUint8(uint8) + AppendUintptr(uintptr) +} + +// Encoder is a format-agnostic interface for all log entry marshalers. Since +// log encoders don't need to support the same wide range of use cases as +// general-purpose marshalers, it's possible to make them faster and +// lower-allocation. +// +// Implementations of the ObjectEncoder interface's methods can, of course, +// freely modify the receiver. However, the Clone and EncodeEntry methods will +// be called concurrently and shouldn't modify the receiver. +type Encoder interface { + ObjectEncoder + + // Clone copies the encoder, ensuring that adding fields to the copy doesn't + // affect the original. + Clone() Encoder + + // EncodeEntry encodes an entry and fields, along with any accumulated + // context, into a byte buffer and returns it. + EncodeEntry(Entry, []Field) (*buffer.Buffer, error) +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/encoder_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/encoder_test.go new file mode 100644 index 0000000..0464167 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/encoder_test.go @@ -0,0 +1,636 @@ +// 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 +// 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. + +package zapcore_test + +import ( + "strings" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + . "go.uber.org/zap/zapcore" +) + +var ( + _epoch = time.Date(1970, time.January, 1, 0, 0, 0, 0, time.UTC) + _testEntry = Entry{ + LoggerName: "main", + Level: InfoLevel, + Message: `hello`, + Time: _epoch, + Stack: "fake-stack", + Caller: EntryCaller{Defined: true, File: "foo.go", Line: 42}, + } +) + +func testEncoderConfig() EncoderConfig { + return EncoderConfig{ + MessageKey: "msg", + LevelKey: "level", + NameKey: "name", + TimeKey: "ts", + CallerKey: "caller", + StacktraceKey: "stacktrace", + LineEnding: "\n", + EncodeTime: EpochTimeEncoder, + EncodeLevel: LowercaseLevelEncoder, + EncodeDuration: SecondsDurationEncoder, + EncodeCaller: ShortCallerEncoder, + } +} + +func humanEncoderConfig() EncoderConfig { + cfg := testEncoderConfig() + cfg.EncodeTime = ISO8601TimeEncoder + cfg.EncodeLevel = CapitalLevelEncoder + cfg.EncodeDuration = StringDurationEncoder + return cfg +} + +func withJSONEncoder(f func(Encoder)) { + f(NewJSONEncoder(testEncoderConfig())) +} + +func withConsoleEncoder(f func(Encoder)) { + f(NewConsoleEncoder(humanEncoderConfig())) +} + +func capitalNameEncoder(loggerName string, enc PrimitiveArrayEncoder) { + enc.AppendString(strings.ToUpper(loggerName)) +} + +func TestEncoderConfiguration(t *testing.T) { + base := testEncoderConfig() + + tests := []struct { + desc string + cfg EncoderConfig + amendEntry func(Entry) Entry + extra func(Encoder) + expectedJSON string + expectedConsole string + }{ + { + desc: "messages to be escaped", + cfg: base, + amendEntry: func(ent Entry) Entry { + ent.Message = `hello\` + return ent + }, + expectedJSON: `{"level":"info","ts":0,"name":"main","caller":"foo.go:42","msg":"hello\\","stacktrace":"fake-stack"}` + "\n", + expectedConsole: "0\tinfo\tmain\tfoo.go:42\thello\\\nfake-stack\n", + }, + { + desc: "use custom entry keys in JSON output and ignore them in console output", + cfg: EncoderConfig{ + LevelKey: "L", + TimeKey: "T", + MessageKey: "M", + NameKey: "N", + CallerKey: "C", + StacktraceKey: "S", + LineEnding: base.LineEnding, + EncodeTime: base.EncodeTime, + EncodeDuration: base.EncodeDuration, + EncodeLevel: base.EncodeLevel, + EncodeCaller: base.EncodeCaller, + }, + expectedJSON: `{"L":"info","T":0,"N":"main","C":"foo.go:42","M":"hello","S":"fake-stack"}` + "\n", + expectedConsole: "0\tinfo\tmain\tfoo.go:42\thello\nfake-stack\n", + }, + { + desc: "skip level if LevelKey is omitted", + cfg: EncoderConfig{ + LevelKey: "", + TimeKey: "T", + MessageKey: "M", + NameKey: "N", + CallerKey: "C", + StacktraceKey: "S", + LineEnding: base.LineEnding, + EncodeTime: base.EncodeTime, + EncodeDuration: base.EncodeDuration, + EncodeLevel: base.EncodeLevel, + EncodeCaller: base.EncodeCaller, + }, + expectedJSON: `{"T":0,"N":"main","C":"foo.go:42","M":"hello","S":"fake-stack"}` + "\n", + expectedConsole: "0\tmain\tfoo.go:42\thello\nfake-stack\n", + }, + { + desc: "skip timestamp if TimeKey is omitted", + cfg: EncoderConfig{ + LevelKey: "L", + TimeKey: "", + MessageKey: "M", + NameKey: "N", + CallerKey: "C", + StacktraceKey: "S", + LineEnding: base.LineEnding, + EncodeTime: base.EncodeTime, + EncodeDuration: base.EncodeDuration, + EncodeLevel: base.EncodeLevel, + EncodeCaller: base.EncodeCaller, + }, + expectedJSON: `{"L":"info","N":"main","C":"foo.go:42","M":"hello","S":"fake-stack"}` + "\n", + expectedConsole: "info\tmain\tfoo.go:42\thello\nfake-stack\n", + }, + { + desc: "skip message if MessageKey is omitted", + cfg: EncoderConfig{ + LevelKey: "L", + TimeKey: "T", + MessageKey: "", + NameKey: "N", + CallerKey: "C", + StacktraceKey: "S", + LineEnding: base.LineEnding, + EncodeTime: base.EncodeTime, + EncodeDuration: base.EncodeDuration, + EncodeLevel: base.EncodeLevel, + EncodeCaller: base.EncodeCaller, + }, + expectedJSON: `{"L":"info","T":0,"N":"main","C":"foo.go:42","S":"fake-stack"}` + "\n", + expectedConsole: "0\tinfo\tmain\tfoo.go:42\nfake-stack\n", + }, + { + desc: "skip name if NameKey is omitted", + cfg: EncoderConfig{ + LevelKey: "L", + TimeKey: "T", + MessageKey: "M", + NameKey: "", + CallerKey: "C", + StacktraceKey: "S", + LineEnding: base.LineEnding, + EncodeTime: base.EncodeTime, + EncodeDuration: base.EncodeDuration, + EncodeLevel: base.EncodeLevel, + EncodeCaller: base.EncodeCaller, + }, + expectedJSON: `{"L":"info","T":0,"C":"foo.go:42","M":"hello","S":"fake-stack"}` + "\n", + expectedConsole: "0\tinfo\tfoo.go:42\thello\nfake-stack\n", + }, + { + desc: "skip caller if CallerKey is omitted", + cfg: EncoderConfig{ + LevelKey: "L", + TimeKey: "T", + MessageKey: "M", + NameKey: "N", + CallerKey: "", + StacktraceKey: "S", + LineEnding: base.LineEnding, + EncodeTime: base.EncodeTime, + EncodeDuration: base.EncodeDuration, + EncodeLevel: base.EncodeLevel, + EncodeCaller: base.EncodeCaller, + }, + expectedJSON: `{"L":"info","T":0,"N":"main","M":"hello","S":"fake-stack"}` + "\n", + expectedConsole: "0\tinfo\tmain\thello\nfake-stack\n", + }, + { + desc: "skip stacktrace if StacktraceKey is omitted", + cfg: EncoderConfig{ + LevelKey: "L", + TimeKey: "T", + MessageKey: "M", + NameKey: "N", + CallerKey: "C", + StacktraceKey: "", + LineEnding: base.LineEnding, + EncodeTime: base.EncodeTime, + EncodeDuration: base.EncodeDuration, + EncodeLevel: base.EncodeLevel, + EncodeCaller: base.EncodeCaller, + }, + expectedJSON: `{"L":"info","T":0,"N":"main","C":"foo.go:42","M":"hello"}` + "\n", + expectedConsole: "0\tinfo\tmain\tfoo.go:42\thello\n", + }, + { + desc: "use the supplied EncodeTime, for both the entry and any times added", + cfg: EncoderConfig{ + LevelKey: "L", + TimeKey: "T", + MessageKey: "M", + NameKey: "N", + CallerKey: "C", + StacktraceKey: "S", + LineEnding: base.LineEnding, + EncodeTime: func(t time.Time, enc PrimitiveArrayEncoder) { enc.AppendString(t.String()) }, + EncodeDuration: base.EncodeDuration, + EncodeLevel: base.EncodeLevel, + EncodeCaller: base.EncodeCaller, + }, + extra: func(enc Encoder) { + enc.AddTime("extra", _epoch) + enc.AddArray("extras", ArrayMarshalerFunc(func(enc ArrayEncoder) error { + enc.AppendTime(_epoch) + return nil + })) + }, + expectedJSON: `{"L":"info","T":"1970-01-01 00:00:00 +0000 UTC","N":"main","C":"foo.go:42","M":"hello","extra":"1970-01-01 00:00:00 +0000 UTC","extras":["1970-01-01 00:00:00 +0000 UTC"],"S":"fake-stack"}` + "\n", + expectedConsole: "1970-01-01 00:00:00 +0000 UTC\tinfo\tmain\tfoo.go:42\thello\t" + // plain-text preamble + `{"extra": "1970-01-01 00:00:00 +0000 UTC", "extras": ["1970-01-01 00:00:00 +0000 UTC"]}` + // JSON context + "\nfake-stack\n", // stacktrace after newline + }, + { + desc: "use the supplied EncodeDuration for any durations added", + cfg: EncoderConfig{ + LevelKey: "L", + TimeKey: "T", + MessageKey: "M", + NameKey: "N", + CallerKey: "C", + StacktraceKey: "S", + LineEnding: base.LineEnding, + EncodeTime: base.EncodeTime, + EncodeDuration: StringDurationEncoder, + EncodeLevel: base.EncodeLevel, + EncodeCaller: base.EncodeCaller, + }, + extra: func(enc Encoder) { + enc.AddDuration("extra", time.Second) + enc.AddArray("extras", ArrayMarshalerFunc(func(enc ArrayEncoder) error { + enc.AppendDuration(time.Minute) + return nil + })) + }, + expectedJSON: `{"L":"info","T":0,"N":"main","C":"foo.go:42","M":"hello","extra":"1s","extras":["1m0s"],"S":"fake-stack"}` + "\n", + expectedConsole: "0\tinfo\tmain\tfoo.go:42\thello\t" + // preamble + `{"extra": "1s", "extras": ["1m0s"]}` + // context + "\nfake-stack\n", // stacktrace + }, + { + desc: "use the supplied EncodeLevel", + cfg: EncoderConfig{ + LevelKey: "L", + TimeKey: "T", + MessageKey: "M", + NameKey: "N", + CallerKey: "C", + StacktraceKey: "S", + LineEnding: base.LineEnding, + EncodeTime: base.EncodeTime, + EncodeDuration: base.EncodeDuration, + EncodeLevel: CapitalLevelEncoder, + EncodeCaller: base.EncodeCaller, + }, + expectedJSON: `{"L":"INFO","T":0,"N":"main","C":"foo.go:42","M":"hello","S":"fake-stack"}` + "\n", + expectedConsole: "0\tINFO\tmain\tfoo.go:42\thello\nfake-stack\n", + }, + { + desc: "use the supplied EncodeName", + cfg: EncoderConfig{ + LevelKey: "L", + TimeKey: "T", + MessageKey: "M", + NameKey: "N", + CallerKey: "C", + StacktraceKey: "S", + LineEnding: base.LineEnding, + EncodeTime: base.EncodeTime, + EncodeDuration: base.EncodeDuration, + EncodeLevel: base.EncodeLevel, + EncodeCaller: base.EncodeCaller, + EncodeName: capitalNameEncoder, + }, + expectedJSON: `{"L":"info","T":0,"N":"MAIN","C":"foo.go:42","M":"hello","S":"fake-stack"}` + "\n", + expectedConsole: "0\tinfo\tMAIN\tfoo.go:42\thello\nfake-stack\n", + }, + { + desc: "close all open namespaces", + cfg: EncoderConfig{ + LevelKey: "L", + TimeKey: "T", + MessageKey: "M", + NameKey: "N", + CallerKey: "C", + StacktraceKey: "S", + LineEnding: base.LineEnding, + EncodeTime: base.EncodeTime, + EncodeDuration: base.EncodeDuration, + EncodeLevel: base.EncodeLevel, + EncodeCaller: base.EncodeCaller, + }, + extra: func(enc Encoder) { + enc.OpenNamespace("outer") + enc.OpenNamespace("inner") + enc.AddString("foo", "bar") + enc.OpenNamespace("innermost") + }, + expectedJSON: `{"L":"info","T":0,"N":"main","C":"foo.go:42","M":"hello","outer":{"inner":{"foo":"bar","innermost":{}}},"S":"fake-stack"}` + "\n", + expectedConsole: "0\tinfo\tmain\tfoo.go:42\thello\t" + + `{"outer": {"inner": {"foo": "bar", "innermost": {}}}}` + + "\nfake-stack\n", + }, + { + desc: "handle no-op EncodeTime", + cfg: EncoderConfig{ + LevelKey: "L", + TimeKey: "T", + MessageKey: "M", + NameKey: "N", + CallerKey: "C", + StacktraceKey: "S", + LineEnding: base.LineEnding, + EncodeTime: func(time.Time, PrimitiveArrayEncoder) {}, + EncodeDuration: base.EncodeDuration, + EncodeLevel: base.EncodeLevel, + EncodeCaller: base.EncodeCaller, + }, + extra: func(enc Encoder) { enc.AddTime("sometime", time.Unix(0, 100)) }, + expectedJSON: `{"L":"info","T":0,"N":"main","C":"foo.go:42","M":"hello","sometime":100,"S":"fake-stack"}` + "\n", + expectedConsole: "info\tmain\tfoo.go:42\thello\t" + `{"sometime": 100}` + "\nfake-stack\n", + }, + { + desc: "handle no-op EncodeDuration", + cfg: EncoderConfig{ + LevelKey: "L", + TimeKey: "T", + MessageKey: "M", + NameKey: "N", + CallerKey: "C", + StacktraceKey: "S", + LineEnding: base.LineEnding, + EncodeTime: base.EncodeTime, + EncodeDuration: func(time.Duration, PrimitiveArrayEncoder) {}, + EncodeLevel: base.EncodeLevel, + EncodeCaller: base.EncodeCaller, + }, + extra: func(enc Encoder) { enc.AddDuration("someduration", time.Microsecond) }, + expectedJSON: `{"L":"info","T":0,"N":"main","C":"foo.go:42","M":"hello","someduration":1000,"S":"fake-stack"}` + "\n", + expectedConsole: "0\tinfo\tmain\tfoo.go:42\thello\t" + `{"someduration": 1000}` + "\nfake-stack\n", + }, + { + desc: "handle no-op EncodeLevel", + cfg: EncoderConfig{ + LevelKey: "L", + TimeKey: "T", + MessageKey: "M", + NameKey: "N", + CallerKey: "C", + StacktraceKey: "S", + LineEnding: base.LineEnding, + EncodeTime: base.EncodeTime, + EncodeDuration: base.EncodeDuration, + EncodeLevel: func(Level, PrimitiveArrayEncoder) {}, + EncodeCaller: base.EncodeCaller, + }, + expectedJSON: `{"L":"info","T":0,"N":"main","C":"foo.go:42","M":"hello","S":"fake-stack"}` + "\n", + expectedConsole: "0\tmain\tfoo.go:42\thello\nfake-stack\n", + }, + { + desc: "handle no-op EncodeCaller", + cfg: EncoderConfig{ + LevelKey: "L", + TimeKey: "T", + MessageKey: "M", + NameKey: "N", + CallerKey: "C", + StacktraceKey: "S", + LineEnding: base.LineEnding, + EncodeTime: base.EncodeTime, + EncodeDuration: base.EncodeDuration, + EncodeLevel: base.EncodeLevel, + EncodeCaller: func(EntryCaller, PrimitiveArrayEncoder) {}, + }, + expectedJSON: `{"L":"info","T":0,"N":"main","C":"foo.go:42","M":"hello","S":"fake-stack"}` + "\n", + expectedConsole: "0\tinfo\tmain\thello\nfake-stack\n", + }, + { + desc: "handle no-op EncodeName", + cfg: EncoderConfig{ + LevelKey: "L", + TimeKey: "T", + MessageKey: "M", + NameKey: "N", + CallerKey: "C", + StacktraceKey: "S", + LineEnding: base.LineEnding, + EncodeTime: base.EncodeTime, + EncodeDuration: base.EncodeDuration, + EncodeLevel: base.EncodeLevel, + EncodeCaller: base.EncodeCaller, + EncodeName: func(string, PrimitiveArrayEncoder) {}, + }, + expectedJSON: `{"L":"info","T":0,"N":"main","C":"foo.go:42","M":"hello","S":"fake-stack"}` + "\n", + expectedConsole: "0\tinfo\tfoo.go:42\thello\nfake-stack\n", + }, + { + desc: "use custom line separator", + cfg: EncoderConfig{ + LevelKey: "L", + TimeKey: "T", + MessageKey: "M", + NameKey: "N", + CallerKey: "C", + StacktraceKey: "S", + LineEnding: "\r\n", + EncodeTime: base.EncodeTime, + EncodeDuration: base.EncodeDuration, + EncodeLevel: base.EncodeLevel, + EncodeCaller: base.EncodeCaller, + }, + expectedJSON: `{"L":"info","T":0,"N":"main","C":"foo.go:42","M":"hello","S":"fake-stack"}` + "\r\n", + expectedConsole: "0\tinfo\tmain\tfoo.go:42\thello\nfake-stack\r\n", + }, + { + desc: "omit line separator definition - fall back to default", + cfg: EncoderConfig{ + LevelKey: "L", + TimeKey: "T", + MessageKey: "M", + NameKey: "N", + CallerKey: "C", + StacktraceKey: "S", + EncodeTime: base.EncodeTime, + EncodeDuration: base.EncodeDuration, + EncodeLevel: base.EncodeLevel, + EncodeCaller: base.EncodeCaller, + }, + expectedJSON: `{"L":"info","T":0,"N":"main","C":"foo.go:42","M":"hello","S":"fake-stack"}` + DefaultLineEnding, + expectedConsole: "0\tinfo\tmain\tfoo.go:42\thello\nfake-stack" + DefaultLineEnding, + }, + } + + for i, tt := range tests { + json := NewJSONEncoder(tt.cfg) + console := NewConsoleEncoder(tt.cfg) + if tt.extra != nil { + tt.extra(json) + tt.extra(console) + } + entry := _testEntry + if tt.amendEntry != nil { + entry = tt.amendEntry(_testEntry) + } + jsonOut, jsonErr := json.EncodeEntry(entry, nil) + if assert.NoError(t, jsonErr, "Unexpected error JSON-encoding entry in case #%d.", i) { + assert.Equal( + t, + tt.expectedJSON, + jsonOut.String(), + "Unexpected JSON output: expected to %v.", tt.desc, + ) + } + consoleOut, consoleErr := console.EncodeEntry(entry, nil) + if assert.NoError(t, consoleErr, "Unexpected error console-encoding entry in case #%d.", i) { + assert.Equal( + t, + tt.expectedConsole, + consoleOut.String(), + "Unexpected console output: expected to %v.", tt.desc, + ) + } + } +} + +func TestLevelEncoders(t *testing.T) { + tests := []struct { + name string + expected interface{} // output of encoding InfoLevel + }{ + {"capital", "INFO"}, + {"lower", "info"}, + {"", "info"}, + {"something-random", "info"}, + } + + for _, tt := range tests { + var le LevelEncoder + require.NoError(t, le.UnmarshalText([]byte(tt.name)), "Unexpected error unmarshaling %q.", tt.name) + assertAppended( + t, + tt.expected, + func(arr ArrayEncoder) { le(InfoLevel, arr) }, + "Unexpected output serializing InfoLevel with %q.", tt.name, + ) + } +} + +func TestTimeEncoders(t *testing.T) { + moment := time.Unix(100, 50005000).UTC() + tests := []struct { + name string + expected interface{} // output of serializing moment + }{ + {"iso8601", "1970-01-01T00:01:40.050Z"}, + {"ISO8601", "1970-01-01T00:01:40.050Z"}, + {"millis", 100050.005}, + {"nanos", int64(100050005000)}, + {"", 100.050005}, + {"something-random", 100.050005}, + } + + for _, tt := range tests { + var te TimeEncoder + require.NoError(t, te.UnmarshalText([]byte(tt.name)), "Unexpected error unmarshaling %q.", tt.name) + assertAppended( + t, + tt.expected, + func(arr ArrayEncoder) { te(moment, arr) }, + "Unexpected output serializing %v with %q.", moment, tt.name, + ) + } +} + +func TestDurationEncoders(t *testing.T) { + elapsed := time.Second + 500*time.Nanosecond + tests := []struct { + name string + expected interface{} // output of serializing elapsed + }{ + {"string", "1.0000005s"}, + {"nanos", int64(1000000500)}, + {"", 1.0000005}, + {"something-random", 1.0000005}, + } + + for _, tt := range tests { + var de DurationEncoder + require.NoError(t, de.UnmarshalText([]byte(tt.name)), "Unexpected error unmarshaling %q.", tt.name) + assertAppended( + t, + tt.expected, + func(arr ArrayEncoder) { de(elapsed, arr) }, + "Unexpected output serializing %v with %q.", elapsed, tt.name, + ) + } +} + +func TestCallerEncoders(t *testing.T) { + caller := EntryCaller{Defined: true, File: "/home/jack/src/github.com/foo/foo.go", Line: 42} + tests := []struct { + name string + expected interface{} // output of serializing caller + }{ + {"", "foo/foo.go:42"}, + {"something-random", "foo/foo.go:42"}, + {"short", "foo/foo.go:42"}, + {"full", "/home/jack/src/github.com/foo/foo.go:42"}, + } + + for _, tt := range tests { + var ce CallerEncoder + require.NoError(t, ce.UnmarshalText([]byte(tt.name)), "Unexpected error unmarshaling %q.", tt.name) + assertAppended( + t, + tt.expected, + func(arr ArrayEncoder) { ce(caller, arr) }, + "Unexpected output serializing file name as %v with %q.", tt.expected, tt.name, + ) + } +} + +func TestNameEncoders(t *testing.T) { + tests := []struct { + name string + expected interface{} // output of encoding InfoLevel + }{ + {"", "main"}, + {"full", "main"}, + {"something-random", "main"}, + } + + for _, tt := range tests { + var ne NameEncoder + require.NoError(t, ne.UnmarshalText([]byte(tt.name)), "Unexpected error unmarshaling %q.", tt.name) + assertAppended( + t, + tt.expected, + func(arr ArrayEncoder) { ne("main", arr) }, + "Unexpected output serializing logger name with %q.", tt.name, + ) + } +} + +func assertAppended(t testing.TB, expected interface{}, f func(ArrayEncoder), msgAndArgs ...interface{}) { + mem := NewMapObjectEncoder() + mem.AddArray("k", ArrayMarshalerFunc(func(arr ArrayEncoder) error { + f(arr) + return nil + })) + arr := mem.Fields["k"].([]interface{}) + require.Equal(t, 1, len(arr), "Expected to append exactly one element to array.") + assert.Equal(t, expected, arr[0], msgAndArgs...) +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/entry.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/entry.go new file mode 100644 index 0000000..7d9893f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/entry.go @@ -0,0 +1,257 @@ +// 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 +// 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. + +package zapcore + +import ( + "fmt" + "strings" + "sync" + "time" + + "go.uber.org/zap/internal/bufferpool" + "go.uber.org/zap/internal/exit" + + "go.uber.org/multierr" +) + +var ( + _cePool = sync.Pool{New: func() interface{} { + // Pre-allocate some space for cores. + return &CheckedEntry{ + cores: make([]Core, 4), + } + }} +) + +func getCheckedEntry() *CheckedEntry { + ce := _cePool.Get().(*CheckedEntry) + ce.reset() + return ce +} + +func putCheckedEntry(ce *CheckedEntry) { + if ce == nil { + return + } + _cePool.Put(ce) +} + +// NewEntryCaller makes an EntryCaller from the return signature of +// runtime.Caller. +func NewEntryCaller(pc uintptr, file string, line int, ok bool) EntryCaller { + if !ok { + return EntryCaller{} + } + return EntryCaller{ + PC: pc, + File: file, + Line: line, + Defined: true, + } +} + +// EntryCaller represents the caller of a logging function. +type EntryCaller struct { + Defined bool + PC uintptr + File string + Line int +} + +// String returns the full path and line number of the caller. +func (ec EntryCaller) String() string { + return ec.FullPath() +} + +// FullPath returns a /full/path/to/package/file:line description of the +// caller. +func (ec EntryCaller) FullPath() string { + if !ec.Defined { + return "undefined" + } + buf := bufferpool.Get() + buf.AppendString(ec.File) + buf.AppendByte(':') + buf.AppendInt(int64(ec.Line)) + caller := buf.String() + buf.Free() + return caller +} + +// TrimmedPath returns a package/file:line description of the caller, +// preserving only the leaf directory name and file name. +func (ec EntryCaller) TrimmedPath() string { + if !ec.Defined { + return "undefined" + } + // nb. To make sure we trim the path correctly on Windows too, we + // counter-intuitively need to use '/' and *not* os.PathSeparator here, + // because the path given originates from Go stdlib, specifically + // runtime.Caller() which (as of Mar/17) returns forward slashes even on + // Windows. + // + // See https://github.com/golang/go/issues/3335 + // and https://github.com/golang/go/issues/18151 + // + // for discussion on the issue on Go side. + // + // Find the last separator. + // + idx := strings.LastIndexByte(ec.File, '/') + if idx == -1 { + return ec.FullPath() + } + // Find the penultimate separator. + idx = strings.LastIndexByte(ec.File[:idx], '/') + if idx == -1 { + return ec.FullPath() + } + buf := bufferpool.Get() + // Keep everything after the penultimate separator. + buf.AppendString(ec.File[idx+1:]) + buf.AppendByte(':') + buf.AppendInt(int64(ec.Line)) + caller := buf.String() + buf.Free() + return caller +} + +// An Entry represents a complete log message. The entry's structured context +// is already serialized, but the log level, time, message, and call site +// information are available for inspection and modification. +// +// Entries are pooled, so any functions that accept them MUST be careful not to +// retain references to them. +type Entry struct { + Level Level + Time time.Time + LoggerName string + Message string + Caller EntryCaller + Stack string +} + +// CheckWriteAction indicates what action to take after a log entry is +// processed. Actions are ordered in increasing severity. +type CheckWriteAction uint8 + +const ( + // WriteThenNoop indicates that nothing special needs to be done. It's the + // default behavior. + WriteThenNoop CheckWriteAction = iota + // WriteThenPanic causes a panic after Write. + WriteThenPanic + // WriteThenFatal causes a fatal os.Exit after Write. + WriteThenFatal +) + +// CheckedEntry is an Entry together with a collection of Cores that have +// already agreed to log it. +// +// CheckedEntry references should be created by calling AddCore or Should on a +// nil *CheckedEntry. References are returned to a pool after Write, and MUST +// NOT be retained after calling their Write method. +type CheckedEntry struct { + Entry + ErrorOutput WriteSyncer + dirty bool // best-effort detection of pool misuse + should CheckWriteAction + cores []Core +} + +func (ce *CheckedEntry) reset() { + ce.Entry = Entry{} + ce.ErrorOutput = nil + ce.dirty = false + ce.should = WriteThenNoop + for i := range ce.cores { + // don't keep references to cores + ce.cores[i] = nil + } + ce.cores = ce.cores[:0] +} + +// Write writes the entry to the stored Cores, returns any errors, and returns +// the CheckedEntry reference to a pool for immediate re-use. Finally, it +// executes any required CheckWriteAction. +func (ce *CheckedEntry) Write(fields ...Field) { + if ce == nil { + return + } + + if ce.dirty { + if ce.ErrorOutput != nil { + // Make a best effort to detect unsafe re-use of this CheckedEntry. + // If the entry is dirty, log an internal error; because the + // CheckedEntry is being used after it was returned to the pool, + // the message may be an amalgamation from multiple call sites. + fmt.Fprintf(ce.ErrorOutput, "%v Unsafe CheckedEntry re-use near Entry %+v.\n", time.Now(), ce.Entry) + ce.ErrorOutput.Sync() + } + return + } + ce.dirty = true + + var err error + for i := range ce.cores { + err = multierr.Append(err, ce.cores[i].Write(ce.Entry, fields)) + } + if ce.ErrorOutput != nil { + if err != nil { + fmt.Fprintf(ce.ErrorOutput, "%v write error: %v\n", time.Now(), err) + ce.ErrorOutput.Sync() + } + } + + should, msg := ce.should, ce.Message + putCheckedEntry(ce) + + switch should { + case WriteThenPanic: + panic(msg) + case WriteThenFatal: + exit.Exit() + } +} + +// AddCore adds a Core that has agreed to log this CheckedEntry. It's intended to be +// used by Core.Check implementations, and is safe to call on nil CheckedEntry +// references. +func (ce *CheckedEntry) AddCore(ent Entry, core Core) *CheckedEntry { + if ce == nil { + ce = getCheckedEntry() + ce.Entry = ent + } + ce.cores = append(ce.cores, core) + return ce +} + +// Should sets this CheckedEntry's CheckWriteAction, which controls whether a +// Core will panic or fatal after writing this log entry. Like AddCore, it's +// safe to call on nil CheckedEntry references. +func (ce *CheckedEntry) Should(ent Entry, should CheckWriteAction) *CheckedEntry { + if ce == nil { + ce = getCheckedEntry() + ce.Entry = ent + } + ce.should = should + return ce +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/entry_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/entry_test.go new file mode 100644 index 0000000..569c4e1 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/entry_test.go @@ -0,0 +1,107 @@ +// 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 +// 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. + +package zapcore + +import ( + "sync" + "testing" + + "go.uber.org/zap/internal/exit" + + "github.com/stretchr/testify/assert" +) + +func TestPutNilEntry(t *testing.T) { + // Pooling nil entries defeats the purpose. + var wg sync.WaitGroup + wg.Add(2) + + go func() { + defer wg.Done() + for i := 0; i < 1000; i++ { + putCheckedEntry(nil) + } + }() + + go func() { + defer wg.Done() + for i := 0; i < 1000; i++ { + ce := getCheckedEntry() + assert.NotNil(t, ce, "Expected only non-nil CheckedEntries in pool.") + assert.False(t, ce.dirty, "Unexpected dirty bit set.") + assert.Nil(t, ce.ErrorOutput, "Non-nil ErrorOutput.") + assert.Equal(t, WriteThenNoop, ce.should, "Unexpected terminal behavior.") + assert.Equal(t, 0, len(ce.cores), "Expected empty slice of cores.") + assert.True(t, cap(ce.cores) > 0, "Expected pooled CheckedEntries to pre-allocate slice of Cores.") + } + }() + + wg.Wait() +} + +func TestEntryCaller(t *testing.T) { + tests := []struct { + caller EntryCaller + full string + short string + }{ + { + caller: NewEntryCaller(100, "/path/to/foo.go", 42, false), + full: "undefined", + short: "undefined", + }, + { + caller: NewEntryCaller(100, "/path/to/foo.go", 42, true), + full: "/path/to/foo.go:42", + short: "to/foo.go:42", + }, + { + caller: NewEntryCaller(100, "to/foo.go", 42, true), + full: "to/foo.go:42", + short: "to/foo.go:42", + }, + } + + for _, tt := range tests { + assert.Equal(t, tt.full, tt.caller.String(), "Unexpected string from EntryCaller.") + assert.Equal(t, tt.full, tt.caller.FullPath(), "Unexpected FullPath from EntryCaller.") + assert.Equal(t, tt.short, tt.caller.TrimmedPath(), "Unexpected TrimmedPath from EntryCaller.") + } +} + +func TestCheckedEntryWrite(t *testing.T) { + // Nil checked entries are safe. + var ce *CheckedEntry + assert.NotPanics(t, func() { ce.Write() }, "Unexpected panic writing nil CheckedEntry.") + + // WriteThenPanic + ce = ce.Should(Entry{}, WriteThenPanic) + assert.Panics(t, func() { ce.Write() }, "Expected to panic when WriteThenPanic is set.") + ce.reset() + + // WriteThenFatal + ce = ce.Should(Entry{}, WriteThenFatal) + stub := exit.WithStub(func() { + ce.Write() + }) + assert.True(t, stub.Exited, "Expected to exit when WriteThenFatal is set.") + ce.reset() +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/error.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/error.go new file mode 100644 index 0000000..a67c7ba --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/error.go @@ -0,0 +1,120 @@ +// Copyright (c) 2017 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. + +package zapcore + +import ( + "fmt" + "sync" +) + +// Encodes the given error into fields of an object. A field with the given +// name is added for the error message. +// +// If the error implements fmt.Formatter, a field with the name ${key}Verbose +// is also added with the full verbose error message. +// +// Finally, if the error implements errorGroup (from go.uber.org/multierr) or +// causer (from github.com/pkg/errors), a ${key}Causes field is added with an +// array of objects containing the errors this error was comprised of. +// +// { +// "error": err.Error(), +// "errorVerbose": fmt.Sprintf("%+v", err), +// "errorCauses": [ +// ... +// ], +// } +func encodeError(key string, err error, enc ObjectEncoder) error { + basic := err.Error() + enc.AddString(key, basic) + + switch e := err.(type) { + case errorGroup: + return enc.AddArray(key+"Causes", errArray(e.Errors())) + case fmt.Formatter: + verbose := fmt.Sprintf("%+v", e) + if verbose != basic { + // This is a rich error type, like those produced by + // github.com/pkg/errors. + enc.AddString(key+"Verbose", verbose) + } + } + return nil +} + +type errorGroup interface { + // Provides read-only access to the underlying list of errors, preferably + // without causing any allocs. + Errors() []error +} + +type causer interface { + // Provides access to the error that caused this error. + Cause() error +} + +// Note that errArry and errArrayElem are very similar to the version +// implemented in the top-level error.go file. We can't re-use this because +// that would require exporting errArray as part of the zapcore API. + +// Encodes a list of errors using the standard error encoding logic. +type errArray []error + +func (errs errArray) MarshalLogArray(arr ArrayEncoder) error { + for i := range errs { + if errs[i] == nil { + continue + } + + el := newErrArrayElem(errs[i]) + arr.AppendObject(el) + el.Free() + } + return nil +} + +var _errArrayElemPool = sync.Pool{New: func() interface{} { + return &errArrayElem{} +}} + +// Encodes any error into a {"error": ...} re-using the same errors logic. +// +// May be passed in place of an array to build a single-element array. +type errArrayElem struct{ err error } + +func newErrArrayElem(err error) *errArrayElem { + e := _errArrayElemPool.Get().(*errArrayElem) + e.err = err + return e +} + +func (e *errArrayElem) MarshalLogArray(arr ArrayEncoder) error { + return arr.AppendObject(e) +} + +func (e *errArrayElem) MarshalLogObject(enc ObjectEncoder) error { + return encodeError("error", e.err, enc) +} + +func (e *errArrayElem) Free() { + e.err = nil + _errArrayElemPool.Put(e) +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/error_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/error_test.go new file mode 100644 index 0000000..900f520 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/error_test.go @@ -0,0 +1,177 @@ +// Copyright (c) 2017 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. + +package zapcore_test + +import ( + "errors" + "fmt" + "io" + "testing" + + richErrors "github.com/pkg/errors" + "github.com/stretchr/testify/assert" + + "go.uber.org/multierr" + . "go.uber.org/zap/zapcore" +) + +type errTooManyUsers int + +func (e errTooManyUsers) Error() string { + return fmt.Sprintf("%d too many users", int(e)) +} + +func (e errTooManyUsers) Format(s fmt.State, verb rune) { + // Implement fmt.Formatter, but don't add any information beyond the basic + // Error method. + if verb == 'v' && s.Flag('+') { + io.WriteString(s, e.Error()) + } +} + +type customMultierr struct{} + +func (e customMultierr) Error() string { + return "great sadness" +} + +func (e customMultierr) Errors() []error { + return []error{ + errors.New("foo"), + nil, + multierr.Append( + errors.New("bar"), + errors.New("baz"), + ), + } +} + +func TestErrorEncoding(t *testing.T) { + tests := []struct { + k string + t FieldType // defaults to ErrorType + iface interface{} + want map[string]interface{} + }{ + { + k: "k", + iface: errTooManyUsers(2), + want: map[string]interface{}{ + "k": "2 too many users", + }, + }, + { + k: "err", + iface: multierr.Combine( + errors.New("foo"), + errors.New("bar"), + errors.New("baz"), + ), + want: map[string]interface{}{ + "err": "foo; bar; baz", + "errCauses": []interface{}{ + map[string]interface{}{"error": "foo"}, + map[string]interface{}{"error": "bar"}, + map[string]interface{}{"error": "baz"}, + }, + }, + }, + { + k: "e", + iface: customMultierr{}, + want: map[string]interface{}{ + "e": "great sadness", + "eCauses": []interface{}{ + map[string]interface{}{"error": "foo"}, + map[string]interface{}{ + "error": "bar; baz", + "errorCauses": []interface{}{ + map[string]interface{}{"error": "bar"}, + map[string]interface{}{"error": "baz"}, + }, + }, + }, + }, + }, + { + k: "k", + iface: richErrors.WithMessage(errors.New("egad"), "failed"), + want: map[string]interface{}{ + "k": "failed: egad", + "kVerbose": "egad\nfailed", + }, + }, + { + k: "error", + iface: multierr.Combine( + richErrors.WithMessage( + multierr.Combine(errors.New("foo"), errors.New("bar")), + "hello", + ), + errors.New("baz"), + richErrors.WithMessage(errors.New("qux"), "world"), + ), + want: map[string]interface{}{ + "error": "hello: foo; bar; baz; world: qux", + "errorCauses": []interface{}{ + map[string]interface{}{ + "error": "hello: foo; bar", + "errorVerbose": "the following errors occurred:\n" + + " - foo\n" + + " - bar\n" + + "hello", + }, + map[string]interface{}{"error": "baz"}, + map[string]interface{}{"error": "world: qux", "errorVerbose": "qux\nworld"}, + }, + }, + }, + } + + for _, tt := range tests { + if tt.t == UnknownType { + tt.t = ErrorType + } + + enc := NewMapObjectEncoder() + f := Field{Key: tt.k, Type: tt.t, Interface: tt.iface} + f.AddTo(enc) + assert.Equal(t, tt.want, enc.Fields, "Unexpected output from field %+v.", f) + } +} + +func TestRichErrorSupport(t *testing.T) { + f := Field{ + Type: ErrorType, + Interface: richErrors.WithMessage(richErrors.New("egad"), "failed"), + Key: "k", + } + enc := NewMapObjectEncoder() + f.AddTo(enc) + assert.Equal(t, "failed: egad", enc.Fields["k"], "Unexpected basic error message.") + + serialized := enc.Fields["kVerbose"] + // Don't assert the exact format used by a third-party package, but ensure + // that some critical elements are present. + assert.Regexp(t, `egad`, serialized, "Expected original error message to be present.") + assert.Regexp(t, `failed`, serialized, "Expected error annotation to be present.") + assert.Regexp(t, `TestRichErrorSupport`, serialized, "Expected calling function to be present in stacktrace.") +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/field.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/field.go new file mode 100644 index 0000000..6a5e33e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/field.go @@ -0,0 +1,201 @@ +// 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 +// 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. + +package zapcore + +import ( + "bytes" + "fmt" + "math" + "reflect" + "time" +) + +// A FieldType indicates which member of the Field union struct should be used +// and how it should be serialized. +type FieldType uint8 + +const ( + // UnknownType is the default field type. Attempting to add it to an encoder will panic. + UnknownType FieldType = iota + // ArrayMarshalerType indicates that the field carries an ArrayMarshaler. + ArrayMarshalerType + // ObjectMarshalerType indicates that the field carries an ObjectMarshaler. + ObjectMarshalerType + // BinaryType indicates that the field carries an opaque binary blob. + BinaryType + // BoolType indicates that the field carries a bool. + BoolType + // ByteStringType indicates that the field carries UTF-8 encoded bytes. + ByteStringType + // Complex128Type indicates that the field carries a complex128. + Complex128Type + // Complex64Type indicates that the field carries a complex128. + Complex64Type + // DurationType indicates that the field carries a time.Duration. + DurationType + // Float64Type indicates that the field carries a float64. + Float64Type + // Float32Type indicates that the field carries a float32. + Float32Type + // Int64Type indicates that the field carries an int64. + Int64Type + // Int32Type indicates that the field carries an int32. + Int32Type + // Int16Type indicates that the field carries an int16. + Int16Type + // Int8Type indicates that the field carries an int8. + Int8Type + // StringType indicates that the field carries a string. + StringType + // TimeType indicates that the field carries a time.Time. + TimeType + // Uint64Type indicates that the field carries a uint64. + Uint64Type + // Uint32Type indicates that the field carries a uint32. + Uint32Type + // Uint16Type indicates that the field carries a uint16. + Uint16Type + // Uint8Type indicates that the field carries a uint8. + Uint8Type + // UintptrType indicates that the field carries a uintptr. + UintptrType + // ReflectType indicates that the field carries an interface{}, which should + // be serialized using reflection. + ReflectType + // NamespaceType signals the beginning of an isolated namespace. All + // subsequent fields should be added to the new namespace. + NamespaceType + // StringerType indicates that the field carries a fmt.Stringer. + StringerType + // ErrorType indicates that the field carries an error. + ErrorType + // SkipType indicates that the field is a no-op. + SkipType +) + +// A Field is a marshaling operation used to add a key-value pair to a logger's +// context. Most fields are lazily marshaled, so it's inexpensive to add fields +// to disabled debug-level log statements. +type Field struct { + Key string + Type FieldType + Integer int64 + String string + Interface interface{} +} + +// AddTo exports a field through the ObjectEncoder interface. It's primarily +// useful to library authors, and shouldn't be necessary in most applications. +func (f Field) AddTo(enc ObjectEncoder) { + var err error + + switch f.Type { + case ArrayMarshalerType: + err = enc.AddArray(f.Key, f.Interface.(ArrayMarshaler)) + case ObjectMarshalerType: + err = enc.AddObject(f.Key, f.Interface.(ObjectMarshaler)) + case BinaryType: + enc.AddBinary(f.Key, f.Interface.([]byte)) + case BoolType: + enc.AddBool(f.Key, f.Integer == 1) + case ByteStringType: + enc.AddByteString(f.Key, f.Interface.([]byte)) + case Complex128Type: + enc.AddComplex128(f.Key, f.Interface.(complex128)) + case Complex64Type: + enc.AddComplex64(f.Key, f.Interface.(complex64)) + case DurationType: + enc.AddDuration(f.Key, time.Duration(f.Integer)) + case Float64Type: + enc.AddFloat64(f.Key, math.Float64frombits(uint64(f.Integer))) + case Float32Type: + enc.AddFloat32(f.Key, math.Float32frombits(uint32(f.Integer))) + case Int64Type: + enc.AddInt64(f.Key, f.Integer) + case Int32Type: + enc.AddInt32(f.Key, int32(f.Integer)) + case Int16Type: + enc.AddInt16(f.Key, int16(f.Integer)) + case Int8Type: + enc.AddInt8(f.Key, int8(f.Integer)) + case StringType: + enc.AddString(f.Key, f.String) + case TimeType: + if f.Interface != nil { + enc.AddTime(f.Key, time.Unix(0, f.Integer).In(f.Interface.(*time.Location))) + } else { + // Fall back to UTC if location is nil. + enc.AddTime(f.Key, time.Unix(0, f.Integer)) + } + case Uint64Type: + enc.AddUint64(f.Key, uint64(f.Integer)) + case Uint32Type: + enc.AddUint32(f.Key, uint32(f.Integer)) + case Uint16Type: + enc.AddUint16(f.Key, uint16(f.Integer)) + case Uint8Type: + enc.AddUint8(f.Key, uint8(f.Integer)) + case UintptrType: + enc.AddUintptr(f.Key, uintptr(f.Integer)) + case ReflectType: + err = enc.AddReflected(f.Key, f.Interface) + case NamespaceType: + enc.OpenNamespace(f.Key) + case StringerType: + enc.AddString(f.Key, f.Interface.(fmt.Stringer).String()) + case ErrorType: + encodeError(f.Key, f.Interface.(error), enc) + case SkipType: + break + default: + panic(fmt.Sprintf("unknown field type: %v", f)) + } + + if err != nil { + enc.AddString(fmt.Sprintf("%sError", f.Key), err.Error()) + } +} + +// Equals returns whether two fields are equal. For non-primitive types such as +// errors, marshalers, or reflect types, it uses reflect.DeepEqual. +func (f Field) Equals(other Field) bool { + if f.Type != other.Type { + return false + } + if f.Key != other.Key { + return false + } + + switch f.Type { + case BinaryType, ByteStringType: + return bytes.Equal(f.Interface.([]byte), other.Interface.([]byte)) + case ArrayMarshalerType, ObjectMarshalerType, ErrorType, ReflectType: + return reflect.DeepEqual(f.Interface, other.Interface) + default: + return f == other + } +} + +func addFields(enc ObjectEncoder, fields []Field) { + for i := range fields { + fields[i].AddTo(enc) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/field_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/field_test.go new file mode 100644 index 0000000..fb722b4 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/field_test.go @@ -0,0 +1,231 @@ +// 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 +// 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. + +package zapcore_test + +import ( + "errors" + "fmt" + "math" + "testing" + "time" + + "go.uber.org/zap" + + "github.com/stretchr/testify/assert" + + . "go.uber.org/zap/zapcore" +) + +type users int + +func (u users) String() string { + return fmt.Sprintf("%d users", int(u)) +} + +func (u users) MarshalLogObject(enc ObjectEncoder) error { + if int(u) < 0 { + return errors.New("too few users") + } + enc.AddInt("users", int(u)) + return nil +} + +func (u users) MarshalLogArray(enc ArrayEncoder) error { + if int(u) < 0 { + return errors.New("too few users") + } + for i := 0; i < int(u); i++ { + enc.AppendString("user") + } + return nil +} + +func TestUnknownFieldType(t *testing.T) { + unknown := Field{Key: "k", String: "foo"} + assert.Equal(t, UnknownType, unknown.Type, "Expected zero value of FieldType to be UnknownType.") + assert.Panics(t, func() { + unknown.AddTo(NewMapObjectEncoder()) + }, "Expected using a field with unknown type to panic.") +} + +func TestFieldAddingError(t *testing.T) { + tests := []struct { + t FieldType + want interface{} + }{ + {ArrayMarshalerType, []interface{}(nil)}, + {ObjectMarshalerType, map[string]interface{}{}}, + } + for _, tt := range tests { + f := Field{Key: "k", Interface: users(-1), Type: tt.t} + enc := NewMapObjectEncoder() + assert.NotPanics(t, func() { f.AddTo(enc) }, "Unexpected panic when adding fields returns an error.") + assert.Equal(t, tt.want, enc.Fields["k"], "On error, expected zero value in field.Key.") + assert.Equal(t, "too few users", enc.Fields["kError"], "Expected error message in log context.") + } +} + +func TestFields(t *testing.T) { + tests := []struct { + t FieldType + i int64 + s string + iface interface{} + want interface{} + }{ + {t: ArrayMarshalerType, iface: users(2), want: []interface{}{"user", "user"}}, + {t: ObjectMarshalerType, iface: users(2), want: map[string]interface{}{"users": 2}}, + {t: BinaryType, iface: []byte("foo"), want: []byte("foo")}, + {t: BoolType, i: 0, want: false}, + {t: ByteStringType, iface: []byte("foo"), want: "foo"}, + {t: Complex128Type, iface: 1 + 2i, want: 1 + 2i}, + {t: Complex64Type, iface: complex64(1 + 2i), want: complex64(1 + 2i)}, + {t: DurationType, i: 1000, want: time.Microsecond}, + {t: Float64Type, i: int64(math.Float64bits(3.14)), want: 3.14}, + {t: Float32Type, i: int64(math.Float32bits(3.14)), want: float32(3.14)}, + {t: Int64Type, i: 42, want: int64(42)}, + {t: Int32Type, i: 42, want: int32(42)}, + {t: Int16Type, i: 42, want: int16(42)}, + {t: Int8Type, i: 42, want: int8(42)}, + {t: StringType, s: "foo", want: "foo"}, + {t: TimeType, i: 1000, iface: time.UTC, want: time.Unix(0, 1000).In(time.UTC)}, + {t: TimeType, i: 1000, want: time.Unix(0, 1000)}, + {t: Uint64Type, i: 42, want: uint64(42)}, + {t: Uint32Type, i: 42, want: uint32(42)}, + {t: Uint16Type, i: 42, want: uint16(42)}, + {t: Uint8Type, i: 42, want: uint8(42)}, + {t: UintptrType, i: 42, want: uintptr(42)}, + {t: ReflectType, iface: users(2), want: users(2)}, + {t: NamespaceType, want: map[string]interface{}{}}, + {t: StringerType, iface: users(2), want: "2 users"}, + {t: SkipType, want: interface{}(nil)}, + } + + for _, tt := range tests { + enc := NewMapObjectEncoder() + f := Field{Key: "k", Type: tt.t, Integer: tt.i, Interface: tt.iface, String: tt.s} + f.AddTo(enc) + assert.Equal(t, tt.want, enc.Fields["k"], "Unexpected output from field %+v.", f) + + delete(enc.Fields, "k") + assert.Equal(t, 0, len(enc.Fields), "Unexpected extra fields present.") + + assert.True(t, f.Equals(f), "Field does not equal itself") + } +} + +func TestEquals(t *testing.T) { + tests := []struct { + a, b Field + want bool + }{ + { + a: zap.Int16("a", 1), + b: zap.Int32("a", 1), + want: false, + }, + { + a: zap.String("k", "a"), + b: zap.String("k", "a"), + want: true, + }, + { + a: zap.String("k", "a"), + b: zap.String("k2", "a"), + want: false, + }, + { + a: zap.String("k", "a"), + b: zap.String("k", "b"), + want: false, + }, + { + a: zap.Time("k", time.Unix(1000, 1000)), + b: zap.Time("k", time.Unix(1000, 1000)), + want: true, + }, + { + a: zap.Time("k", time.Unix(1000, 1000).In(time.UTC)), + b: zap.Time("k", time.Unix(1000, 1000).In(time.FixedZone("TEST", -8))), + want: false, + }, + { + a: zap.Time("k", time.Unix(1000, 1000)), + b: zap.Time("k", time.Unix(1000, 2000)), + want: false, + }, + { + a: zap.Binary("k", []byte{1, 2}), + b: zap.Binary("k", []byte{1, 2}), + want: true, + }, + { + a: zap.Binary("k", []byte{1, 2}), + b: zap.Binary("k", []byte{1, 3}), + want: false, + }, + { + a: zap.ByteString("k", []byte("abc")), + b: zap.ByteString("k", []byte("abc")), + want: true, + }, + { + a: zap.ByteString("k", []byte("abc")), + b: zap.ByteString("k", []byte("abd")), + want: false, + }, + { + a: zap.Ints("k", []int{1, 2}), + b: zap.Ints("k", []int{1, 2}), + want: true, + }, + { + a: zap.Ints("k", []int{1, 2}), + b: zap.Ints("k", []int{1, 3}), + want: false, + }, + { + a: zap.Object("k", users(10)), + b: zap.Object("k", users(10)), + want: true, + }, + { + a: zap.Object("k", users(10)), + b: zap.Object("k", users(20)), + want: false, + }, + { + a: zap.Any("k", map[string]string{"a": "b"}), + b: zap.Any("k", map[string]string{"a": "b"}), + want: true, + }, + { + a: zap.Any("k", map[string]string{"a": "b"}), + b: zap.Any("k", map[string]string{"a": "d"}), + want: false, + }, + } + + for _, tt := range tests { + assert.Equal(t, tt.want, tt.a.Equals(tt.b), "a.Equals(b) a: %#v b: %#v", tt.a, tt.b) + assert.Equal(t, tt.want, tt.b.Equals(tt.a), "b.Equals(a) a: %#v b: %#v", tt.a, tt.b) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/hook.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/hook.go new file mode 100644 index 0000000..5db4afb --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/hook.go @@ -0,0 +1,68 @@ +// 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 +// 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. + +package zapcore + +import "go.uber.org/multierr" + +type hooked struct { + Core + funcs []func(Entry) error +} + +// RegisterHooks wraps a Core and runs a collection of user-defined callback +// hooks each time a message is logged. Execution of the callbacks is blocking. +// +// This offers users an easy way to register simple callbacks (e.g., metrics +// collection) without implementing the full Core interface. +func RegisterHooks(core Core, hooks ...func(Entry) error) Core { + funcs := append([]func(Entry) error{}, hooks...) + return &hooked{ + Core: core, + funcs: funcs, + } +} + +func (h *hooked) Check(ent Entry, ce *CheckedEntry) *CheckedEntry { + // Let the wrapped Core decide whether to log this message or not. This + // also gives the downstream a chance to register itself directly with the + // CheckedEntry. + if downstream := h.Core.Check(ent, ce); downstream != nil { + return downstream.AddCore(ent, h) + } + return ce +} + +func (h *hooked) With(fields []Field) Core { + return &hooked{ + Core: h.Core.With(fields), + funcs: h.funcs, + } +} + +func (h *hooked) Write(ent Entry, _ []Field) error { + // Since our downstream had a chance to register itself directly with the + // CheckedMessage, we don't need to call it here. + var err error + for i := range h.funcs { + err = multierr.Append(err, h.funcs[i](ent)) + } + return err +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/hook_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/hook_test.go new file mode 100644 index 0000000..0764888 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/hook_test.go @@ -0,0 +1,73 @@ +// 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 +// 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. + +package zapcore_test + +import ( + "testing" + + . "go.uber.org/zap/zapcore" + "go.uber.org/zap/zaptest/observer" + + "github.com/stretchr/testify/assert" +) + +func TestHooks(t *testing.T) { + tests := []struct { + entryLevel Level + coreLevel Level + expectCall bool + }{ + {DebugLevel, InfoLevel, false}, + {InfoLevel, InfoLevel, true}, + {WarnLevel, InfoLevel, true}, + } + + for _, tt := range tests { + fac, logs := observer.New(tt.coreLevel) + intField := makeInt64Field("foo", 42) + ent := Entry{Message: "bar", Level: tt.entryLevel} + + var called int + f := func(e Entry) error { + called++ + assert.Equal(t, ent, e, "Hook called with unexpected Entry.") + return nil + } + + h := RegisterHooks(fac, f) + if ce := h.With([]Field{intField}).Check(ent, nil); ce != nil { + ce.Write() + } + + if tt.expectCall { + assert.Equal(t, 1, called, "Expected to call hook once.") + assert.Equal( + t, + []observer.LoggedEntry{{Entry: ent, Context: []Field{intField}}}, + logs.AllUntimed(), + "Unexpected logs written out.", + ) + } else { + assert.Equal(t, 0, called, "Didn't expect to call hook.") + assert.Equal(t, 0, logs.Len(), "Unexpected logs written out.") + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/json_encoder.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/json_encoder.go new file mode 100644 index 0000000..1006ba2 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/json_encoder.go @@ -0,0 +1,480 @@ +// 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 +// 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. + +package zapcore + +import ( + "encoding/base64" + "encoding/json" + "math" + "sync" + "time" + "unicode/utf8" + + "go.uber.org/zap/buffer" + "go.uber.org/zap/internal/bufferpool" +) + +// For JSON-escaping; see jsonEncoder.safeAddString below. +const _hex = "0123456789abcdef" + +var _jsonPool = sync.Pool{New: func() interface{} { + return &jsonEncoder{} +}} + +func getJSONEncoder() *jsonEncoder { + return _jsonPool.Get().(*jsonEncoder) +} + +func putJSONEncoder(enc *jsonEncoder) { + enc.EncoderConfig = nil + enc.buf = nil + enc.spaced = false + enc.openNamespaces = 0 + _jsonPool.Put(enc) +} + +type jsonEncoder struct { + *EncoderConfig + buf *buffer.Buffer + spaced bool // include spaces after colons and commas + openNamespaces int +} + +// NewJSONEncoder creates a fast, low-allocation JSON encoder. The encoder +// appropriately escapes all field keys and values. +// +// Note that the encoder doesn't deduplicate keys, so it's possible to produce +// a message like +// {"foo":"bar","foo":"baz"} +// This is permitted by the JSON specification, but not encouraged. Many +// libraries will ignore duplicate key-value pairs (typically keeping the last +// pair) when unmarshaling, but users should attempt to avoid adding duplicate +// keys. +func NewJSONEncoder(cfg EncoderConfig) Encoder { + return newJSONEncoder(cfg, false) +} + +func newJSONEncoder(cfg EncoderConfig, spaced bool) *jsonEncoder { + return &jsonEncoder{ + EncoderConfig: &cfg, + buf: bufferpool.Get(), + spaced: spaced, + } +} + +func (enc *jsonEncoder) AddArray(key string, arr ArrayMarshaler) error { + enc.addKey(key) + return enc.AppendArray(arr) +} + +func (enc *jsonEncoder) AddObject(key string, obj ObjectMarshaler) error { + enc.addKey(key) + return enc.AppendObject(obj) +} + +func (enc *jsonEncoder) AddBinary(key string, val []byte) { + enc.AddString(key, base64.StdEncoding.EncodeToString(val)) +} + +func (enc *jsonEncoder) AddByteString(key string, val []byte) { + enc.addKey(key) + enc.AppendByteString(val) +} + +func (enc *jsonEncoder) AddBool(key string, val bool) { + enc.addKey(key) + enc.AppendBool(val) +} + +func (enc *jsonEncoder) AddComplex128(key string, val complex128) { + enc.addKey(key) + enc.AppendComplex128(val) +} + +func (enc *jsonEncoder) AddDuration(key string, val time.Duration) { + enc.addKey(key) + enc.AppendDuration(val) +} + +func (enc *jsonEncoder) AddFloat64(key string, val float64) { + enc.addKey(key) + enc.AppendFloat64(val) +} + +func (enc *jsonEncoder) AddInt64(key string, val int64) { + enc.addKey(key) + enc.AppendInt64(val) +} + +func (enc *jsonEncoder) AddReflected(key string, obj interface{}) error { + marshaled, err := json.Marshal(obj) + if err != nil { + return err + } + enc.addKey(key) + _, err = enc.buf.Write(marshaled) + return err +} + +func (enc *jsonEncoder) OpenNamespace(key string) { + enc.addKey(key) + enc.buf.AppendByte('{') + enc.openNamespaces++ +} + +func (enc *jsonEncoder) AddString(key, val string) { + enc.addKey(key) + enc.AppendString(val) +} + +func (enc *jsonEncoder) AddTime(key string, val time.Time) { + enc.addKey(key) + enc.AppendTime(val) +} + +func (enc *jsonEncoder) AddUint64(key string, val uint64) { + enc.addKey(key) + enc.AppendUint64(val) +} + +func (enc *jsonEncoder) AppendArray(arr ArrayMarshaler) error { + enc.addElementSeparator() + enc.buf.AppendByte('[') + err := arr.MarshalLogArray(enc) + enc.buf.AppendByte(']') + return err +} + +func (enc *jsonEncoder) AppendObject(obj ObjectMarshaler) error { + enc.addElementSeparator() + enc.buf.AppendByte('{') + err := obj.MarshalLogObject(enc) + enc.buf.AppendByte('}') + return err +} + +func (enc *jsonEncoder) AppendBool(val bool) { + enc.addElementSeparator() + enc.buf.AppendBool(val) +} + +func (enc *jsonEncoder) AppendByteString(val []byte) { + enc.addElementSeparator() + enc.buf.AppendByte('"') + enc.safeAddByteString(val) + enc.buf.AppendByte('"') +} + +func (enc *jsonEncoder) AppendComplex128(val complex128) { + 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.AppendByte('+') + enc.buf.AppendFloat(i, 64) + enc.buf.AppendByte('i') + enc.buf.AppendByte('"') +} + +func (enc *jsonEncoder) AppendDuration(val time.Duration) { + cur := enc.buf.Len() + enc.EncodeDuration(val, enc) + if cur == enc.buf.Len() { + // User-supplied EncodeDuration is a no-op. Fall back to nanoseconds to keep + // JSON valid. + enc.AppendInt64(int64(val)) + } +} + +func (enc *jsonEncoder) AppendInt64(val int64) { + enc.addElementSeparator() + enc.buf.AppendInt(val) +} + +func (enc *jsonEncoder) AppendReflected(val interface{}) error { + marshaled, err := json.Marshal(val) + if err != nil { + return err + } + enc.addElementSeparator() + _, err = enc.buf.Write(marshaled) + return err +} + +func (enc *jsonEncoder) AppendString(val string) { + enc.addElementSeparator() + enc.buf.AppendByte('"') + enc.safeAddString(val) + enc.buf.AppendByte('"') +} + +func (enc *jsonEncoder) AppendTime(val time.Time) { + cur := enc.buf.Len() + enc.EncodeTime(val, enc) + if cur == enc.buf.Len() { + // User-supplied EncodeTime is a no-op. Fall back to nanos since epoch to keep + // output JSON valid. + enc.AppendInt64(val.UnixNano()) + } +} + +func (enc *jsonEncoder) AppendUint64(val uint64) { + enc.addElementSeparator() + enc.buf.AppendUint(val) +} + +func (enc *jsonEncoder) AddComplex64(k string, v complex64) { enc.AddComplex128(k, complex128(v)) } +func (enc *jsonEncoder) AddFloat32(k string, v float32) { enc.AddFloat64(k, float64(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) Clone() Encoder { + clone := enc.clone() + clone.buf.Write(enc.buf.Bytes()) + return clone +} + +func (enc *jsonEncoder) clone() *jsonEncoder { + clone := getJSONEncoder() + clone.EncoderConfig = enc.EncoderConfig + clone.spaced = enc.spaced + clone.openNamespaces = enc.openNamespaces + clone.buf = bufferpool.Get() + return clone +} + +func (enc *jsonEncoder) EncodeEntry(ent Entry, fields []Field) (*buffer.Buffer, error) { + final := enc.clone() + final.buf.AppendByte('{') + + if final.LevelKey != "" { + final.addKey(final.LevelKey) + cur := final.buf.Len() + final.EncodeLevel(ent.Level, final) + if cur == final.buf.Len() { + // User-supplied EncodeLevel was a no-op. Fall back to strings to keep + // output JSON valid. + final.AppendString(ent.Level.String()) + } + } + if final.TimeKey != "" { + final.AddTime(final.TimeKey, ent.Time) + } + if ent.LoggerName != "" && final.NameKey != "" { + final.addKey(final.NameKey) + cur := final.buf.Len() + nameEncoder := final.EncodeName + + // if no name encoder provided, fall back to FullNameEncoder for backwards + // compatibility + if nameEncoder == nil { + nameEncoder = FullNameEncoder + } + + nameEncoder(ent.LoggerName, final) + if cur == final.buf.Len() { + // User-supplied EncodeName was a no-op. Fall back to strings to + // keep output JSON valid. + final.AppendString(ent.LoggerName) + } + } + if ent.Caller.Defined && final.CallerKey != "" { + final.addKey(final.CallerKey) + cur := final.buf.Len() + final.EncodeCaller(ent.Caller, final) + if cur == final.buf.Len() { + // User-supplied EncodeCaller was a no-op. Fall back to strings to + // keep output JSON valid. + final.AppendString(ent.Caller.String()) + } + } + if final.MessageKey != "" { + final.addKey(enc.MessageKey) + final.AppendString(ent.Message) + } + if enc.buf.Len() > 0 { + final.addElementSeparator() + final.buf.Write(enc.buf.Bytes()) + } + addFields(final, fields) + final.closeOpenNamespaces() + if ent.Stack != "" && final.StacktraceKey != "" { + final.AddString(final.StacktraceKey, ent.Stack) + } + final.buf.AppendByte('}') + if final.LineEnding != "" { + final.buf.AppendString(final.LineEnding) + } else { + final.buf.AppendString(DefaultLineEnding) + } + + ret := final.buf + putJSONEncoder(final) + return ret, nil +} + +func (enc *jsonEncoder) truncate() { + enc.buf.Reset() +} + +func (enc *jsonEncoder) closeOpenNamespaces() { + for i := 0; i < enc.openNamespaces; i++ { + enc.buf.AppendByte('}') + } +} + +func (enc *jsonEncoder) addKey(key string) { + enc.addElementSeparator() + enc.buf.AppendByte('"') + enc.safeAddString(key) + enc.buf.AppendByte('"') + enc.buf.AppendByte(':') + if enc.spaced { + enc.buf.AppendByte(' ') + } +} + +func (enc *jsonEncoder) addElementSeparator() { + last := enc.buf.Len() - 1 + if last < 0 { + return + } + switch enc.buf.Bytes()[last] { + case '{', '[', ':', ',', ' ': + return + default: + enc.buf.AppendByte(',') + if enc.spaced { + enc.buf.AppendByte(' ') + } + } +} + +func (enc *jsonEncoder) appendFloat(val float64, bitSize int) { + enc.addElementSeparator() + switch { + case math.IsNaN(val): + enc.buf.AppendString(`"NaN"`) + case math.IsInf(val, 1): + enc.buf.AppendString(`"+Inf"`) + case math.IsInf(val, -1): + enc.buf.AppendString(`"-Inf"`) + default: + enc.buf.AppendFloat(val, bitSize) + } +} + +// safeAddString JSON-escapes a string and appends it to the internal buffer. +// Unlike the standard library's encoder, it doesn't attempt to protect the +// user from browser vulnerabilities or JSONP-related problems. +func (enc *jsonEncoder) safeAddString(s string) { + for i := 0; i < len(s); { + if enc.tryAddRuneSelf(s[i]) { + i++ + continue + } + r, size := utf8.DecodeRuneInString(s[i:]) + if enc.tryAddRuneError(r, size) { + i++ + continue + } + enc.buf.AppendString(s[i : i+size]) + i += size + } +} + +// safeAddByteString is no-alloc equivalent of safeAddString(string(s)) for s []byte. +func (enc *jsonEncoder) safeAddByteString(s []byte) { + for i := 0; i < len(s); { + if enc.tryAddRuneSelf(s[i]) { + i++ + continue + } + r, size := utf8.DecodeRune(s[i:]) + if enc.tryAddRuneError(r, size) { + i++ + continue + } + enc.buf.Write(s[i : i+size]) + i += size + } +} + +// tryAddRuneSelf appends b if it is valid UTF-8 character represented in a single byte. +func (enc *jsonEncoder) tryAddRuneSelf(b byte) bool { + if b >= utf8.RuneSelf { + return false + } + if 0x20 <= b && b != '\\' && b != '"' { + enc.buf.AppendByte(b) + return true + } + switch b { + case '\\', '"': + enc.buf.AppendByte('\\') + enc.buf.AppendByte(b) + case '\n': + enc.buf.AppendByte('\\') + enc.buf.AppendByte('n') + case '\r': + enc.buf.AppendByte('\\') + enc.buf.AppendByte('r') + case '\t': + enc.buf.AppendByte('\\') + enc.buf.AppendByte('t') + default: + // Encode bytes < 0x20, except for the escape sequences above. + enc.buf.AppendString(`\u00`) + enc.buf.AppendByte(_hex[b>>4]) + enc.buf.AppendByte(_hex[b&0xF]) + } + return true +} + +func (enc *jsonEncoder) tryAddRuneError(r rune, size int) bool { + if r == utf8.RuneError && size == 1 { + enc.buf.AppendString(`\ufffd`) + return true + } + return false +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/json_encoder_bench_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/json_encoder_bench_test.go new file mode 100644 index 0000000..4bd5033 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/json_encoder_bench_test.go @@ -0,0 +1,91 @@ +// 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 +// 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. + +package zapcore_test + +import ( + "encoding/json" + "testing" + "time" + + . "go.uber.org/zap/zapcore" +) + +func BenchmarkJSONLogMarshalerFunc(b *testing.B) { + for i := 0; i < b.N; i++ { + enc := NewJSONEncoder(testEncoderConfig()) + enc.AddObject("nested", ObjectMarshalerFunc(func(enc ObjectEncoder) error { + enc.AddInt64("i", int64(i)) + return nil + })) + } +} + +func BenchmarkZapJSON(b *testing.B) { + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + enc := NewJSONEncoder(testEncoderConfig()) + enc.AddString("str", "foo") + enc.AddInt64("int64-1", 1) + enc.AddInt64("int64-2", 2) + enc.AddFloat64("float64", 1.0) + enc.AddString("string1", "\n") + enc.AddString("string2", "💩") + enc.AddString("string3", "🤔") + enc.AddString("string4", "🙊") + enc.AddBool("bool", true) + buf, _ := enc.EncodeEntry(Entry{ + Message: "fake", + Level: DebugLevel, + }, nil) + buf.Free() + } + }) +} + +func BenchmarkStandardJSON(b *testing.B) { + record := struct { + Level string `json:"level"` + Message string `json:"msg"` + Time time.Time `json:"ts"` + Fields map[string]interface{} `json:"fields"` + }{ + Level: "debug", + Message: "fake", + Time: time.Unix(0, 0), + Fields: map[string]interface{}{ + "str": "foo", + "int64-1": int64(1), + "int64-2": int64(1), + "float64": float64(1.0), + "string1": "\n", + "string2": "💩", + "string3": "🤔", + "string4": "🙊", + "bool": true, + }, + } + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + json.Marshal(record) + } + }) +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/json_encoder_impl_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/json_encoder_impl_test.go new file mode 100644 index 0000000..a2dd722 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/json_encoder_impl_test.go @@ -0,0 +1,475 @@ +// 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 +// 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. + +package zapcore + +import ( + "encoding/json" + "errors" + "math" + "math/rand" + "reflect" + "testing" + "testing/quick" + "time" + + "go.uber.org/zap/internal/bufferpool" + + "github.com/stretchr/testify/assert" + "go.uber.org/multierr" +) + +func TestJSONClone(t *testing.T) { + // The parent encoder is created with plenty of excess capacity. + parent := &jsonEncoder{buf: bufferpool.Get()} + clone := parent.Clone() + + // Adding to the parent shouldn't affect the clone, and vice versa. + parent.AddString("foo", "bar") + clone.AddString("baz", "bing") + + assertJSON(t, `"foo":"bar"`, parent) + assertJSON(t, `"baz":"bing"`, clone.(*jsonEncoder)) +} + +func TestJSONEscaping(t *testing.T) { + enc := &jsonEncoder{buf: bufferpool.Get()} + // Test all the edge cases of JSON escaping directly. + cases := map[string]string{ + // ASCII. + `foo`: `foo`, + // Special-cased characters. + `"`: `\"`, + `\`: `\\`, + // Special-cased characters within everyday ASCII. + `foo"foo`: `foo\"foo`, + "foo\n": `foo\n`, + // Special-cased control characters. + "\n": `\n`, + "\r": `\r`, + "\t": `\t`, + // \b and \f are sometimes backslash-escaped, but this representation is also + // conformant. + "\b": `\u0008`, + "\f": `\u000c`, + // The standard lib special-cases angle brackets and ampersands by default, + // because it wants to protect users from browser exploits. In a logging + // context, we shouldn't special-case these characters. + "<": "<", + ">": ">", + "&": "&", + // ASCII bell - not special-cased. + string(byte(0x07)): `\u0007`, + // Astral-plane unicode. + `☃`: `☃`, + // Decodes to (RuneError, 1) + "\xed\xa0\x80": `\ufffd\ufffd\ufffd`, + "foo\xed\xa0\x80": `foo\ufffd\ufffd\ufffd`, + } + + t.Run("String", func(t *testing.T) { + for input, output := range cases { + enc.truncate() + enc.safeAddString(input) + assertJSON(t, output, enc) + } + }) + + t.Run("ByteString", func(t *testing.T) { + for input, output := range cases { + enc.truncate() + enc.safeAddByteString([]byte(input)) + assertJSON(t, output, enc) + } + }) +} + +func TestJSONEncoderObjectFields(t *testing.T) { + tests := []struct { + desc string + expected string + f func(Encoder) + }{ + {"binary", `"k":"YWIxMg=="`, func(e Encoder) { e.AddBinary("k", []byte("ab12")) }}, + {"bool", `"k\\":true`, func(e Encoder) { e.AddBool(`k\`, true) }}, // test key escaping once + {"bool", `"k":true`, func(e Encoder) { e.AddBool("k", true) }}, + {"bool", `"k":false`, func(e Encoder) { e.AddBool("k", false) }}, + {"byteString", `"k":"v\\"`, func(e Encoder) { e.AddByteString(`k`, []byte(`v\`)) }}, + {"byteString", `"k":"v"`, func(e Encoder) { e.AddByteString("k", []byte("v")) }}, + {"byteString", `"k":""`, func(e Encoder) { e.AddByteString("k", []byte{}) }}, + {"byteString", `"k":""`, func(e Encoder) { e.AddByteString("k", nil) }}, + {"complex128", `"k":"1+2i"`, func(e Encoder) { e.AddComplex128("k", 1+2i) }}, + {"complex64", `"k":"1+2i"`, func(e Encoder) { e.AddComplex64("k", 1+2i) }}, + {"duration", `"k":0.000000001`, func(e Encoder) { e.AddDuration("k", 1) }}, + {"float64", `"k":1`, func(e Encoder) { e.AddFloat64("k", 1.0) }}, + {"float64", `"k":10000000000`, func(e Encoder) { e.AddFloat64("k", 1e10) }}, + {"float64", `"k":"NaN"`, func(e Encoder) { e.AddFloat64("k", math.NaN()) }}, + {"float64", `"k":"+Inf"`, func(e Encoder) { e.AddFloat64("k", math.Inf(1)) }}, + {"float64", `"k":"-Inf"`, func(e Encoder) { e.AddFloat64("k", math.Inf(-1)) }}, + {"float32", `"k":1`, func(e Encoder) { e.AddFloat32("k", 1.0) }}, + {"float32", `"k":10000000000`, func(e Encoder) { e.AddFloat32("k", 1e10) }}, + {"float32", `"k":"NaN"`, func(e Encoder) { e.AddFloat32("k", float32(math.NaN())) }}, + {"float32", `"k":"+Inf"`, func(e Encoder) { e.AddFloat32("k", float32(math.Inf(1))) }}, + {"float32", `"k":"-Inf"`, func(e Encoder) { e.AddFloat32("k", float32(math.Inf(-1))) }}, + {"int", `"k":42`, func(e Encoder) { e.AddInt("k", 42) }}, + {"int64", `"k":42`, func(e Encoder) { e.AddInt64("k", 42) }}, + {"int32", `"k":42`, func(e Encoder) { e.AddInt32("k", 42) }}, + {"int16", `"k":42`, func(e Encoder) { e.AddInt16("k", 42) }}, + {"int8", `"k":42`, func(e Encoder) { e.AddInt8("k", 42) }}, + {"string", `"k":"v\\"`, func(e Encoder) { e.AddString(`k`, `v\`) }}, + {"string", `"k":"v"`, func(e Encoder) { e.AddString("k", "v") }}, + {"string", `"k":""`, func(e Encoder) { e.AddString("k", "") }}, + {"time", `"k":1`, func(e Encoder) { e.AddTime("k", time.Unix(1, 0)) }}, + {"uint", `"k":42`, func(e Encoder) { e.AddUint("k", 42) }}, + {"uint64", `"k":42`, func(e Encoder) { e.AddUint64("k", 42) }}, + {"uint32", `"k":42`, func(e Encoder) { e.AddUint32("k", 42) }}, + {"uint16", `"k":42`, func(e Encoder) { e.AddUint16("k", 42) }}, + {"uint8", `"k":42`, func(e Encoder) { e.AddUint8("k", 42) }}, + {"uintptr", `"k":42`, func(e Encoder) { e.AddUintptr("k", 42) }}, + { + desc: "object (success)", + expected: `"k":{"loggable":"yes"}`, + f: func(e Encoder) { + assert.NoError(t, e.AddObject("k", loggable{true}), "Unexpected error calling MarshalLogObject.") + }, + }, + { + desc: "object (error)", + expected: `"k":{}`, + f: func(e Encoder) { + assert.Error(t, e.AddObject("k", loggable{false}), "Expected an error calling MarshalLogObject.") + }, + }, + { + desc: "object (with nested array)", + expected: `"turducken":{"ducks":[{"in":"chicken"},{"in":"chicken"}]}`, + f: func(e Encoder) { + assert.NoError( + t, + e.AddObject("turducken", turducken{}), + "Unexpected error calling MarshalLogObject with nested ObjectMarshalers and ArrayMarshalers.", + ) + }, + }, + { + desc: "array (with nested object)", + expected: `"turduckens":[{"ducks":[{"in":"chicken"},{"in":"chicken"}]},{"ducks":[{"in":"chicken"},{"in":"chicken"}]}]`, + f: func(e Encoder) { + assert.NoError( + t, + e.AddArray("turduckens", turduckens(2)), + "Unexpected error calling MarshalLogObject with nested ObjectMarshalers and ArrayMarshalers.", + ) + }, + }, + { + desc: "array (success)", + expected: `"k":[true]`, + f: func(e Encoder) { + assert.NoError(t, e.AddArray(`k`, loggable{true}), "Unexpected error calling MarshalLogArray.") + }, + }, + { + desc: "array (error)", + expected: `"k":[]`, + f: func(e Encoder) { + assert.Error(t, e.AddArray("k", loggable{false}), "Expected an error calling MarshalLogArray.") + }, + }, + { + desc: "reflect (success)", + expected: `"k":{"loggable":"yes"}`, + f: func(e Encoder) { + assert.NoError(t, e.AddReflected("k", map[string]string{"loggable": "yes"}), "Unexpected error JSON-serializing a map.") + }, + }, + { + desc: "reflect (failure)", + expected: "", + f: func(e Encoder) { + assert.Error(t, e.AddReflected("k", noJSON{}), "Unexpected success JSON-serializing a noJSON.") + }, + }, + { + desc: "namespace", + // EncodeEntry is responsible for closing all open namespaces. + expected: `"outermost":{"outer":{"foo":1,"inner":{"foo":2,"innermost":{`, + f: func(e Encoder) { + e.OpenNamespace("outermost") + e.OpenNamespace("outer") + e.AddInt("foo", 1) + e.OpenNamespace("inner") + e.AddInt("foo", 2) + e.OpenNamespace("innermost") + }, + }, + } + + for _, tt := range tests { + assertOutput(t, tt.desc, tt.expected, tt.f) + } +} + +func TestJSONEncoderArrays(t *testing.T) { + tests := []struct { + desc string + expected string // expect f to be called twice + f func(ArrayEncoder) + }{ + {"bool", `[true,true]`, func(e ArrayEncoder) { e.AppendBool(true) }}, + {"byteString", `["k","k"]`, func(e ArrayEncoder) { e.AppendByteString([]byte("k")) }}, + {"byteString", `["k\\","k\\"]`, func(e ArrayEncoder) { e.AppendByteString([]byte(`k\`)) }}, + {"complex128", `["1+2i","1+2i"]`, func(e ArrayEncoder) { e.AppendComplex128(1 + 2i) }}, + {"complex64", `["1+2i","1+2i"]`, func(e ArrayEncoder) { e.AppendComplex64(1 + 2i) }}, + {"durations", `[0.000000002,0.000000002]`, func(e ArrayEncoder) { e.AppendDuration(2) }}, + {"float64", `[3.14,3.14]`, func(e ArrayEncoder) { e.AppendFloat64(3.14) }}, + {"float32", `[3.14,3.14]`, func(e ArrayEncoder) { e.AppendFloat32(3.14) }}, + {"int", `[42,42]`, func(e ArrayEncoder) { e.AppendInt(42) }}, + {"int64", `[42,42]`, func(e ArrayEncoder) { e.AppendInt64(42) }}, + {"int32", `[42,42]`, func(e ArrayEncoder) { e.AppendInt32(42) }}, + {"int16", `[42,42]`, func(e ArrayEncoder) { e.AppendInt16(42) }}, + {"int8", `[42,42]`, func(e ArrayEncoder) { e.AppendInt8(42) }}, + {"string", `["k","k"]`, func(e ArrayEncoder) { e.AppendString("k") }}, + {"string", `["k\\","k\\"]`, func(e ArrayEncoder) { e.AppendString(`k\`) }}, + {"times", `[1,1]`, func(e ArrayEncoder) { e.AppendTime(time.Unix(1, 0)) }}, + {"uint", `[42,42]`, func(e ArrayEncoder) { e.AppendUint(42) }}, + {"uint64", `[42,42]`, func(e ArrayEncoder) { e.AppendUint64(42) }}, + {"uint32", `[42,42]`, func(e ArrayEncoder) { e.AppendUint32(42) }}, + {"uint16", `[42,42]`, func(e ArrayEncoder) { e.AppendUint16(42) }}, + {"uint8", `[42,42]`, func(e ArrayEncoder) { e.AppendUint8(42) }}, + {"uintptr", `[42,42]`, func(e ArrayEncoder) { e.AppendUintptr(42) }}, + { + desc: "arrays (success)", + expected: `[[true],[true]]`, + f: func(arr ArrayEncoder) { + assert.NoError(t, arr.AppendArray(ArrayMarshalerFunc(func(inner ArrayEncoder) error { + inner.AppendBool(true) + return nil + })), "Unexpected error appending an array.") + }, + }, + { + desc: "arrays (error)", + expected: `[[true],[true]]`, + f: func(arr ArrayEncoder) { + assert.Error(t, arr.AppendArray(ArrayMarshalerFunc(func(inner ArrayEncoder) error { + inner.AppendBool(true) + return errors.New("fail") + })), "Expected an error appending an array.") + }, + }, + { + desc: "objects (success)", + expected: `[{"loggable":"yes"},{"loggable":"yes"}]`, + f: func(arr ArrayEncoder) { + assert.NoError(t, arr.AppendObject(loggable{true}), "Unexpected error appending an object.") + }, + }, + { + desc: "objects (error)", + expected: `[{},{}]`, + f: func(arr ArrayEncoder) { + assert.Error(t, arr.AppendObject(loggable{false}), "Expected an error appending an object.") + }, + }, + { + desc: "reflect (success)", + expected: `[{"foo":5},{"foo":5}]`, + f: func(arr ArrayEncoder) { + assert.NoError( + t, + arr.AppendReflected(map[string]int{"foo": 5}), + "Unexpected an error appending an object with reflection.", + ) + }, + }, + { + desc: "reflect (error)", + expected: `[]`, + f: func(arr ArrayEncoder) { + assert.Error( + t, + arr.AppendReflected(noJSON{}), + "Unexpected an error appending an object with reflection.", + ) + }, + }, + } + + for _, tt := range tests { + f := func(enc Encoder) error { + return enc.AddArray("array", ArrayMarshalerFunc(func(arr ArrayEncoder) error { + tt.f(arr) + tt.f(arr) + return nil + })) + } + assertOutput(t, tt.desc, `"array":`+tt.expected, func(enc Encoder) { + err := f(enc) + assert.NoError(t, err, "Unexpected error adding array to JSON encoder.") + }) + } +} + +func assertJSON(t *testing.T, expected string, enc *jsonEncoder) { + assert.Equal(t, expected, enc.buf.String(), "Encoded JSON didn't match expectations.") +} + +func assertOutput(t testing.TB, desc string, expected string, f func(Encoder)) { + enc := &jsonEncoder{buf: bufferpool.Get(), EncoderConfig: &EncoderConfig{ + EncodeTime: EpochTimeEncoder, + EncodeDuration: SecondsDurationEncoder, + }} + f(enc) + assert.Equal(t, expected, enc.buf.String(), "Unexpected encoder output after adding a %s.", desc) + + enc.truncate() + enc.AddString("foo", "bar") + f(enc) + expectedPrefix := `"foo":"bar"` + if expected != "" { + // If we expect output, it should be comma-separated from the previous + // field. + expectedPrefix += "," + } + assert.Equal(t, expectedPrefix+expected, enc.buf.String(), "Unexpected encoder output after adding a %s as a second field.", desc) +} + +// Nested Array- and ObjectMarshalers. +type turducken struct{} + +func (t turducken) MarshalLogObject(enc ObjectEncoder) error { + return enc.AddArray("ducks", ArrayMarshalerFunc(func(arr ArrayEncoder) error { + for i := 0; i < 2; i++ { + arr.AppendObject(ObjectMarshalerFunc(func(inner ObjectEncoder) error { + inner.AddString("in", "chicken") + return nil + })) + } + return nil + })) +} + +type turduckens int + +func (t turduckens) MarshalLogArray(enc ArrayEncoder) error { + var err error + tur := turducken{} + for i := 0; i < int(t); i++ { + err = multierr.Append(err, enc.AppendObject(tur)) + } + return err +} + +type loggable struct{ bool } + +func (l loggable) MarshalLogObject(enc ObjectEncoder) error { + if !l.bool { + return errors.New("can't marshal") + } + enc.AddString("loggable", "yes") + return nil +} + +func (l loggable) MarshalLogArray(enc ArrayEncoder) error { + if !l.bool { + return errors.New("can't marshal") + } + enc.AppendBool(true) + return nil +} + +type noJSON struct{} + +func (nj noJSON) MarshalJSON() ([]byte, error) { + return nil, errors.New("no") +} + +func zapEncode(encode func(*jsonEncoder, string)) func(s string) []byte { + return func(s string) []byte { + enc := &jsonEncoder{buf: bufferpool.Get()} + // Escape and quote a string using our encoder. + var ret []byte + encode(enc, s) + ret = make([]byte, 0, enc.buf.Len()+2) + ret = append(ret, '"') + ret = append(ret, enc.buf.Bytes()...) + ret = append(ret, '"') + return ret + } +} + +func roundTripsCorrectly(encode func(string) []byte, original string) bool { + // Encode using our encoder, decode using the standard library, and assert + // that we haven't lost any information. + encoded := encode(original) + + var decoded string + err := json.Unmarshal(encoded, &decoded) + if err != nil { + return false + } + return original == decoded +} + +func roundTripsCorrectlyString(original string) bool { + return roundTripsCorrectly(zapEncode((*jsonEncoder).safeAddString), original) +} + +func roundTripsCorrectlyByteString(original string) bool { + return roundTripsCorrectly( + zapEncode(func(enc *jsonEncoder, s string) { + enc.safeAddByteString([]byte(s)) + }), + original) +} + +type ASCII string + +func (s ASCII) Generate(r *rand.Rand, size int) reflect.Value { + bs := make([]byte, size) + for i := range bs { + bs[i] = byte(r.Intn(128)) + } + a := ASCII(bs) + return reflect.ValueOf(a) +} + +func asciiRoundTripsCorrectlyString(s ASCII) bool { + return roundTripsCorrectlyString(string(s)) +} + +func asciiRoundTripsCorrectlyByteString(s ASCII) bool { + return roundTripsCorrectlyByteString(string(s)) +} + +func TestJSONQuick(t *testing.T) { + check := func(f interface{}) { + err := quick.Check(f, &quick.Config{MaxCountScale: 100.0}) + assert.NoError(t, err) + } + // Test the full range of UTF-8 strings. + check(roundTripsCorrectlyString) + check(roundTripsCorrectlyByteString) + + // Focus on ASCII strings. + check(asciiRoundTripsCorrectlyString) + check(asciiRoundTripsCorrectlyByteString) +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/level.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/level.go new file mode 100644 index 0000000..e575c9f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/level.go @@ -0,0 +1,175 @@ +// 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 +// 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. + +package zapcore + +import ( + "bytes" + "errors" + "fmt" +) + +var errUnmarshalNilLevel = errors.New("can't unmarshal a nil *Level") + +// A Level is a logging priority. Higher levels are more important. +type Level int8 + +const ( + // DebugLevel logs are typically voluminous, and are usually disabled in + // production. + DebugLevel Level = iota - 1 + // InfoLevel is the default logging priority. + InfoLevel + // WarnLevel logs are more important than Info, but don't need individual + // human review. + WarnLevel + // ErrorLevel logs are high-priority. If an application is running smoothly, + // it shouldn't generate any error-level logs. + ErrorLevel + // DPanicLevel logs are particularly important errors. In development the + // logger panics after writing the message. + DPanicLevel + // PanicLevel logs a message, then panics. + PanicLevel + // FatalLevel logs a message, then calls os.Exit(1). + FatalLevel + + _minLevel = DebugLevel + _maxLevel = FatalLevel +) + +// String returns a lower-case ASCII representation of the log level. +func (l Level) String() string { + switch l { + case DebugLevel: + return "debug" + case InfoLevel: + return "info" + case WarnLevel: + return "warn" + case ErrorLevel: + return "error" + case DPanicLevel: + return "dpanic" + case PanicLevel: + return "panic" + case FatalLevel: + return "fatal" + default: + return fmt.Sprintf("Level(%d)", l) + } +} + +// CapitalString returns an all-caps ASCII representation of the log level. +func (l Level) CapitalString() string { + // Printing levels in all-caps is common enough that we should export this + // functionality. + switch l { + case DebugLevel: + return "DEBUG" + case InfoLevel: + return "INFO" + case WarnLevel: + return "WARN" + case ErrorLevel: + return "ERROR" + case DPanicLevel: + return "DPANIC" + case PanicLevel: + return "PANIC" + case FatalLevel: + return "FATAL" + default: + return fmt.Sprintf("LEVEL(%d)", l) + } +} + +// MarshalText marshals the Level to text. Note that the text representation +// drops the -Level suffix (see example). +func (l Level) MarshalText() ([]byte, error) { + return []byte(l.String()), nil +} + +// UnmarshalText unmarshals text to a level. Like MarshalText, UnmarshalText +// expects the text representation of a Level to drop the -Level suffix (see +// example). +// +// In particular, this makes it easy to configure logging levels using YAML, +// TOML, or JSON files. +func (l *Level) UnmarshalText(text []byte) error { + if l == nil { + return errUnmarshalNilLevel + } + if !l.unmarshalText(text) && !l.unmarshalText(bytes.ToLower(text)) { + return fmt.Errorf("unrecognized level: %q", text) + } + return nil +} + +func (l *Level) unmarshalText(text []byte) bool { + switch string(text) { + case "debug", "DEBUG": + *l = DebugLevel + case "info", "INFO", "": // make the zero value useful + *l = InfoLevel + case "warn", "WARN": + *l = WarnLevel + case "error", "ERROR": + *l = ErrorLevel + case "dpanic", "DPANIC": + *l = DPanicLevel + case "panic", "PANIC": + *l = PanicLevel + case "fatal", "FATAL": + *l = FatalLevel + default: + return false + } + return true +} + +// Set sets the level for the flag.Value interface. +func (l *Level) Set(s string) error { + return l.UnmarshalText([]byte(s)) +} + +// Get gets the level for the flag.Getter interface. +func (l *Level) Get() interface{} { + return *l +} + +// Enabled returns true if the given level is at or above this level. +func (l Level) Enabled(lvl Level) bool { + return lvl >= l +} + +// LevelEnabler decides whether a given logging level is enabled when logging a +// message. +// +// Enablers are intended to be used to implement deterministic filters; +// concerns like sampling are better implemented as a Core. +// +// Each concrete Level value implements a static LevelEnabler which returns +// true for itself and all higher logging levels. For example WarnLevel.Enabled() +// will return true for WarnLevel, ErrorLevel, DPanicLevel, PanicLevel, and +// FatalLevel, but return false for InfoLevel and DebugLevel. +type LevelEnabler interface { + Enabled(Level) bool +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/level_strings.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/level_strings.go new file mode 100644 index 0000000..7af8dad --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/level_strings.go @@ -0,0 +1,46 @@ +// 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 +// 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. + +package zapcore + +import "go.uber.org/zap/internal/color" + +var ( + _levelToColor = map[Level]color.Color{ + DebugLevel: color.Magenta, + InfoLevel: color.Blue, + WarnLevel: color.Yellow, + ErrorLevel: color.Red, + DPanicLevel: color.Red, + PanicLevel: color.Red, + FatalLevel: color.Red, + } + _unknownLevelColor = color.Red + + _levelToLowercaseColorString = make(map[Level]string, len(_levelToColor)) + _levelToCapitalColorString = make(map[Level]string, len(_levelToColor)) +) + +func init() { + for level, color := range _levelToColor { + _levelToLowercaseColorString[level] = color.Add(level.String()) + _levelToCapitalColorString[level] = color.Add(level.CapitalString()) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/level_strings_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/level_strings_test.go new file mode 100644 index 0000000..14b0bac --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/level_strings_test.go @@ -0,0 +1,38 @@ +// 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 +// 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. + +package zapcore + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestAllLevelsCoveredByLevelString(t *testing.T) { + numLevels := int((_maxLevel - _minLevel) + 1) + + isComplete := func(m map[Level]string) bool { + return len(m) == numLevels + } + + assert.True(t, isComplete(_levelToLowercaseColorString), "Colored lowercase strings don't cover all levels.") + assert.True(t, isComplete(_levelToCapitalColorString), "Colored capital strings don't cover all levels.") +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/level_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/level_test.go new file mode 100644 index 0000000..28b75b3 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/level_test.go @@ -0,0 +1,177 @@ +// 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 +// 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. + +package zapcore + +import ( + "bytes" + "flag" + "strings" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestLevelString(t *testing.T) { + tests := map[Level]string{ + DebugLevel: "debug", + InfoLevel: "info", + WarnLevel: "warn", + ErrorLevel: "error", + DPanicLevel: "dpanic", + PanicLevel: "panic", + FatalLevel: "fatal", + Level(-42): "Level(-42)", + } + + for lvl, stringLevel := range tests { + assert.Equal(t, stringLevel, lvl.String(), "Unexpected lowercase level string.") + assert.Equal(t, strings.ToUpper(stringLevel), lvl.CapitalString(), "Unexpected all-caps level string.") + } +} + +func TestLevelText(t *testing.T) { + tests := []struct { + text string + level Level + }{ + {"debug", DebugLevel}, + {"info", InfoLevel}, + {"", InfoLevel}, // make the zero value useful + {"warn", WarnLevel}, + {"error", ErrorLevel}, + {"dpanic", DPanicLevel}, + {"panic", PanicLevel}, + {"fatal", FatalLevel}, + } + for _, tt := range tests { + if tt.text != "" { + lvl := tt.level + marshaled, err := lvl.MarshalText() + assert.NoError(t, err, "Unexpected error marshaling level %v to text.", &lvl) + assert.Equal(t, tt.text, string(marshaled), "Marshaling level %v to text yielded unexpected result.", &lvl) + } + + var unmarshaled Level + err := unmarshaled.UnmarshalText([]byte(tt.text)) + assert.NoError(t, err, `Unexpected error unmarshaling text %q to level.`, tt.text) + assert.Equal(t, tt.level, unmarshaled, `Text %q unmarshaled to an unexpected level.`, tt.text) + } +} + +func TestCapitalLevelsParse(t *testing.T) { + tests := []struct { + text string + level Level + }{ + {"DEBUG", DebugLevel}, + {"INFO", InfoLevel}, + {"WARN", WarnLevel}, + {"ERROR", ErrorLevel}, + {"DPANIC", DPanicLevel}, + {"PANIC", PanicLevel}, + {"FATAL", FatalLevel}, + } + for _, tt := range tests { + var unmarshaled Level + err := unmarshaled.UnmarshalText([]byte(tt.text)) + assert.NoError(t, err, `Unexpected error unmarshaling text %q to level.`, tt.text) + assert.Equal(t, tt.level, unmarshaled, `Text %q unmarshaled to an unexpected level.`, tt.text) + } +} + +func TestWeirdLevelsParse(t *testing.T) { + tests := []struct { + text string + level Level + }{ + // I guess... + {"Debug", DebugLevel}, + {"Info", InfoLevel}, + {"Warn", WarnLevel}, + {"Error", ErrorLevel}, + {"Dpanic", DPanicLevel}, + {"Panic", PanicLevel}, + {"Fatal", FatalLevel}, + + // What even is... + {"DeBuG", DebugLevel}, + {"InFo", InfoLevel}, + {"WaRn", WarnLevel}, + {"ErRor", ErrorLevel}, + {"DpAnIc", DPanicLevel}, + {"PaNiC", PanicLevel}, + {"FaTaL", FatalLevel}, + } + for _, tt := range tests { + var unmarshaled Level + err := unmarshaled.UnmarshalText([]byte(tt.text)) + assert.NoError(t, err, `Unexpected error unmarshaling text %q to level.`, tt.text) + assert.Equal(t, tt.level, unmarshaled, `Text %q unmarshaled to an unexpected level.`, tt.text) + } +} + +func TestLevelNils(t *testing.T) { + var l *Level + + // The String() method will not handle nil level properly. + assert.Panics(t, func() { + assert.Equal(t, "Level(nil)", l.String(), "Unexpected result stringifying nil *Level.") + }, "Level(nil).String() should panic") + + assert.Panics(t, func() { + l.MarshalText() + }, "Expected to panic when marshalling a nil level.") + + err := l.UnmarshalText([]byte("debug")) + assert.Equal(t, errUnmarshalNilLevel, err, "Expected to error unmarshalling into a nil Level.") +} + +func TestLevelUnmarshalUnknownText(t *testing.T) { + var l Level + err := l.UnmarshalText([]byte("foo")) + assert.Contains(t, err.Error(), "unrecognized level", "Expected unmarshaling arbitrary text to fail.") +} + +func TestLevelAsFlagValue(t *testing.T) { + var ( + buf bytes.Buffer + lvl Level + ) + fs := flag.NewFlagSet("levelTest", flag.ContinueOnError) + fs.SetOutput(&buf) + fs.Var(&lvl, "level", "log level") + + for _, expected := range []Level{DebugLevel, InfoLevel, WarnLevel, ErrorLevel, DPanicLevel, PanicLevel, FatalLevel} { + assert.NoError(t, fs.Parse([]string{"-level", expected.String()})) + assert.Equal(t, expected, lvl, "Unexpected level after parsing flag.") + assert.Equal(t, expected, lvl.Get(), "Unexpected output using flag.Getter API.") + assert.Empty(t, buf.String(), "Unexpected error output parsing level flag.") + buf.Reset() + } + + assert.Error(t, fs.Parse([]string{"-level", "nope"})) + assert.Equal( + t, + `invalid value "nope" for flag -level: unrecognized level: "nope"`, + strings.Split(buf.String(), "\n")[0], // second line is help message + "Unexpected error output from invalid flag input.", + ) +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/marshaler.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/marshaler.go new file mode 100644 index 0000000..2627a65 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/marshaler.go @@ -0,0 +1,53 @@ +// 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 +// 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. + +package zapcore + +// ObjectMarshaler allows user-defined types to efficiently add themselves to the +// logging context, and to selectively omit information which shouldn't be +// included in logs (e.g., passwords). +type ObjectMarshaler interface { + MarshalLogObject(ObjectEncoder) error +} + +// ObjectMarshalerFunc is a type adapter that turns a function into an +// ObjectMarshaler. +type ObjectMarshalerFunc func(ObjectEncoder) error + +// MarshalLogObject calls the underlying function. +func (f ObjectMarshalerFunc) MarshalLogObject(enc ObjectEncoder) error { + return f(enc) +} + +// ArrayMarshaler allows user-defined types to efficiently add themselves to the +// logging context, and to selectively omit information which shouldn't be +// included in logs (e.g., passwords). +type ArrayMarshaler interface { + MarshalLogArray(ArrayEncoder) error +} + +// ArrayMarshalerFunc is a type adapter that turns a function into an +// ArrayMarshaler. +type ArrayMarshalerFunc func(ArrayEncoder) error + +// MarshalLogArray calls the underlying function. +func (f ArrayMarshalerFunc) MarshalLogArray(enc ArrayEncoder) error { + return f(enc) +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/memory_encoder.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/memory_encoder.go new file mode 100644 index 0000000..5c46bc1 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/memory_encoder.go @@ -0,0 +1,179 @@ +// 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 +// 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. + +package zapcore + +import "time" + +// MapObjectEncoder is an ObjectEncoder backed by a simple +// map[string]interface{}. It's not fast enough for production use, but it's +// helpful in tests. +type MapObjectEncoder struct { + // Fields contains the entire encoded log context. + Fields map[string]interface{} + // cur is a pointer to the namespace we're currently writing to. + cur map[string]interface{} +} + +// NewMapObjectEncoder creates a new map-backed ObjectEncoder. +func NewMapObjectEncoder() *MapObjectEncoder { + m := make(map[string]interface{}) + return &MapObjectEncoder{ + Fields: m, + cur: m, + } +} + +// AddArray implements ObjectEncoder. +func (m *MapObjectEncoder) AddArray(key string, v ArrayMarshaler) error { + arr := &sliceArrayEncoder{} + err := v.MarshalLogArray(arr) + m.cur[key] = arr.elems + return err +} + +// AddObject implements ObjectEncoder. +func (m *MapObjectEncoder) AddObject(k string, v ObjectMarshaler) error { + newMap := NewMapObjectEncoder() + m.cur[k] = newMap.Fields + return v.MarshalLogObject(newMap) +} + +// AddBinary implements ObjectEncoder. +func (m *MapObjectEncoder) AddBinary(k string, v []byte) { m.cur[k] = v } + +// AddByteString implements ObjectEncoder. +func (m *MapObjectEncoder) AddByteString(k string, v []byte) { m.cur[k] = string(v) } + +// AddBool implements ObjectEncoder. +func (m *MapObjectEncoder) AddBool(k string, v bool) { m.cur[k] = v } + +// AddDuration implements ObjectEncoder. +func (m MapObjectEncoder) AddDuration(k string, v time.Duration) { m.cur[k] = v } + +// AddComplex128 implements ObjectEncoder. +func (m *MapObjectEncoder) AddComplex128(k string, v complex128) { m.cur[k] = v } + +// AddComplex64 implements ObjectEncoder. +func (m *MapObjectEncoder) AddComplex64(k string, v complex64) { m.cur[k] = v } + +// AddFloat64 implements ObjectEncoder. +func (m *MapObjectEncoder) AddFloat64(k string, v float64) { m.cur[k] = v } + +// AddFloat32 implements ObjectEncoder. +func (m *MapObjectEncoder) AddFloat32(k string, v float32) { m.cur[k] = v } + +// AddInt implements ObjectEncoder. +func (m *MapObjectEncoder) AddInt(k string, v int) { m.cur[k] = v } + +// AddInt64 implements ObjectEncoder. +func (m *MapObjectEncoder) AddInt64(k string, v int64) { m.cur[k] = v } + +// AddInt32 implements ObjectEncoder. +func (m *MapObjectEncoder) AddInt32(k string, v int32) { m.cur[k] = v } + +// AddInt16 implements ObjectEncoder. +func (m *MapObjectEncoder) AddInt16(k string, v int16) { m.cur[k] = v } + +// AddInt8 implements ObjectEncoder. +func (m *MapObjectEncoder) AddInt8(k string, v int8) { m.cur[k] = v } + +// AddString implements ObjectEncoder. +func (m *MapObjectEncoder) AddString(k string, v string) { m.cur[k] = v } + +// AddTime implements ObjectEncoder. +func (m MapObjectEncoder) AddTime(k string, v time.Time) { m.cur[k] = v } + +// AddUint implements ObjectEncoder. +func (m *MapObjectEncoder) AddUint(k string, v uint) { m.cur[k] = v } + +// AddUint64 implements ObjectEncoder. +func (m *MapObjectEncoder) AddUint64(k string, v uint64) { m.cur[k] = v } + +// AddUint32 implements ObjectEncoder. +func (m *MapObjectEncoder) AddUint32(k string, v uint32) { m.cur[k] = v } + +// AddUint16 implements ObjectEncoder. +func (m *MapObjectEncoder) AddUint16(k string, v uint16) { m.cur[k] = v } + +// AddUint8 implements ObjectEncoder. +func (m *MapObjectEncoder) AddUint8(k string, v uint8) { m.cur[k] = v } + +// AddUintptr implements ObjectEncoder. +func (m *MapObjectEncoder) AddUintptr(k string, v uintptr) { m.cur[k] = v } + +// AddReflected implements ObjectEncoder. +func (m *MapObjectEncoder) AddReflected(k string, v interface{}) error { + m.cur[k] = v + return nil +} + +// OpenNamespace implements ObjectEncoder. +func (m *MapObjectEncoder) OpenNamespace(k string) { + ns := make(map[string]interface{}) + m.cur[k] = ns + m.cur = ns +} + +// sliceArrayEncoder is an ArrayEncoder backed by a simple []interface{}. Like +// the MapObjectEncoder, it's not designed for production use. +type sliceArrayEncoder struct { + elems []interface{} +} + +func (s *sliceArrayEncoder) AppendArray(v ArrayMarshaler) error { + enc := &sliceArrayEncoder{} + err := v.MarshalLogArray(enc) + s.elems = append(s.elems, enc.elems) + return err +} + +func (s *sliceArrayEncoder) AppendObject(v ObjectMarshaler) error { + m := NewMapObjectEncoder() + err := v.MarshalLogObject(m) + s.elems = append(s.elems, m.Fields) + return err +} + +func (s *sliceArrayEncoder) AppendReflected(v interface{}) error { + s.elems = append(s.elems, v) + return nil +} + +func (s *sliceArrayEncoder) AppendBool(v bool) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendByteString(v []byte) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendComplex128(v complex128) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendComplex64(v complex64) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendDuration(v time.Duration) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendFloat64(v float64) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendFloat32(v float32) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendInt(v int) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendInt64(v int64) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendInt32(v int32) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendInt16(v int16) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendInt8(v int8) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendString(v string) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendTime(v time.Time) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendUint(v uint) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendUint64(v uint64) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendUint32(v uint32) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendUint16(v uint16) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendUint8(v uint8) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendUintptr(v uintptr) { s.elems = append(s.elems, v) } diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/memory_encoder_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/memory_encoder_test.go new file mode 100644 index 0000000..e63454a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/memory_encoder_test.go @@ -0,0 +1,283 @@ +// 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 +// 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. + +package zapcore + +import ( + "testing" + "time" + + "github.com/stretchr/testify/assert" +) + +func TestMapObjectEncoderAdd(t *testing.T) { + // Expected output of a turducken. + wantTurducken := map[string]interface{}{ + "ducks": []interface{}{ + map[string]interface{}{"in": "chicken"}, + map[string]interface{}{"in": "chicken"}, + }, + } + + tests := []struct { + desc string + f func(ObjectEncoder) + expected interface{} + }{ + { + desc: "AddObject", + f: func(e ObjectEncoder) { + assert.NoError(t, e.AddObject("k", loggable{true}), "Expected AddObject to succeed.") + }, + expected: map[string]interface{}{"loggable": "yes"}, + }, + { + desc: "AddObject (nested)", + f: func(e ObjectEncoder) { + assert.NoError(t, e.AddObject("k", turducken{}), "Expected AddObject to succeed.") + }, + expected: wantTurducken, + }, + { + desc: "AddArray", + f: func(e ObjectEncoder) { + assert.NoError(t, e.AddArray("k", ArrayMarshalerFunc(func(arr ArrayEncoder) error { + arr.AppendBool(true) + arr.AppendBool(false) + arr.AppendBool(true) + return nil + })), "Expected AddArray to succeed.") + }, + expected: []interface{}{true, false, true}, + }, + { + desc: "AddArray (nested)", + f: func(e ObjectEncoder) { + assert.NoError(t, e.AddArray("k", turduckens(2)), "Expected AddArray to succeed.") + }, + expected: []interface{}{wantTurducken, wantTurducken}, + }, + { + desc: "AddBinary", + f: func(e ObjectEncoder) { e.AddBinary("k", []byte("foo")) }, + expected: []byte("foo"), + }, + { + desc: "AddBool", + f: func(e ObjectEncoder) { e.AddBool("k", true) }, + expected: true, + }, + { + desc: "AddComplex128", + f: func(e ObjectEncoder) { e.AddComplex128("k", 1+2i) }, + expected: 1 + 2i, + }, + { + desc: "AddComplex64", + f: func(e ObjectEncoder) { e.AddComplex64("k", 1+2i) }, + expected: complex64(1 + 2i), + }, + { + desc: "AddDuration", + f: func(e ObjectEncoder) { e.AddDuration("k", time.Millisecond) }, + expected: time.Millisecond, + }, + { + desc: "AddFloat64", + f: func(e ObjectEncoder) { e.AddFloat64("k", 3.14) }, + expected: 3.14, + }, + { + desc: "AddFloat32", + f: func(e ObjectEncoder) { e.AddFloat32("k", 3.14) }, + expected: float32(3.14), + }, + { + desc: "AddInt", + f: func(e ObjectEncoder) { e.AddInt("k", 42) }, + expected: 42, + }, + { + desc: "AddInt64", + f: func(e ObjectEncoder) { e.AddInt64("k", 42) }, + expected: int64(42), + }, + { + desc: "AddInt32", + f: func(e ObjectEncoder) { e.AddInt32("k", 42) }, + expected: int32(42), + }, + { + desc: "AddInt16", + f: func(e ObjectEncoder) { e.AddInt16("k", 42) }, + expected: int16(42), + }, + { + desc: "AddInt8", + f: func(e ObjectEncoder) { e.AddInt8("k", 42) }, + expected: int8(42), + }, + { + desc: "AddString", + f: func(e ObjectEncoder) { e.AddString("k", "v") }, + expected: "v", + }, + { + desc: "AddTime", + f: func(e ObjectEncoder) { e.AddTime("k", time.Unix(0, 100)) }, + expected: time.Unix(0, 100), + }, + { + desc: "AddUint", + f: func(e ObjectEncoder) { e.AddUint("k", 42) }, + expected: uint(42), + }, + { + desc: "AddUint64", + f: func(e ObjectEncoder) { e.AddUint64("k", 42) }, + expected: uint64(42), + }, + { + desc: "AddUint32", + f: func(e ObjectEncoder) { e.AddUint32("k", 42) }, + expected: uint32(42), + }, + { + desc: "AddUint16", + f: func(e ObjectEncoder) { e.AddUint16("k", 42) }, + expected: uint16(42), + }, + { + desc: "AddUint8", + f: func(e ObjectEncoder) { e.AddUint8("k", 42) }, + expected: uint8(42), + }, + { + desc: "AddUintptr", + f: func(e ObjectEncoder) { e.AddUintptr("k", 42) }, + expected: uintptr(42), + }, + { + desc: "AddReflected", + f: func(e ObjectEncoder) { + assert.NoError(t, e.AddReflected("k", map[string]interface{}{"foo": 5}), "Expected AddReflected to succeed.") + }, + expected: map[string]interface{}{"foo": 5}, + }, + { + desc: "OpenNamespace", + f: func(e ObjectEncoder) { + e.OpenNamespace("k") + e.AddInt("foo", 1) + e.OpenNamespace("middle") + e.AddInt("foo", 2) + e.OpenNamespace("inner") + e.AddInt("foo", 3) + }, + expected: map[string]interface{}{ + "foo": 1, + "middle": map[string]interface{}{ + "foo": 2, + "inner": map[string]interface{}{ + "foo": 3, + }, + }, + }, + }, + } + + for _, tt := range tests { + enc := NewMapObjectEncoder() + tt.f(enc) + assert.Equal(t, tt.expected, enc.Fields["k"], "Unexpected encoder output.") + } +} +func TestSliceArrayEncoderAppend(t *testing.T) { + tests := []struct { + desc string + f func(ArrayEncoder) + expected interface{} + }{ + // AppendObject and AppendArray are covered by the AddObject (nested) and + // AddArray (nested) cases above. + {"AppendBool", func(e ArrayEncoder) { e.AppendBool(true) }, true}, + {"AppendComplex128", func(e ArrayEncoder) { e.AppendComplex128(1 + 2i) }, 1 + 2i}, + {"AppendComplex64", func(e ArrayEncoder) { e.AppendComplex64(1 + 2i) }, complex64(1 + 2i)}, + {"AppendDuration", func(e ArrayEncoder) { e.AppendDuration(time.Second) }, time.Second}, + {"AppendFloat64", func(e ArrayEncoder) { e.AppendFloat64(3.14) }, 3.14}, + {"AppendFloat32", func(e ArrayEncoder) { e.AppendFloat32(3.14) }, float32(3.14)}, + {"AppendInt", func(e ArrayEncoder) { e.AppendInt(42) }, 42}, + {"AppendInt64", func(e ArrayEncoder) { e.AppendInt64(42) }, int64(42)}, + {"AppendInt32", func(e ArrayEncoder) { e.AppendInt32(42) }, int32(42)}, + {"AppendInt16", func(e ArrayEncoder) { e.AppendInt16(42) }, int16(42)}, + {"AppendInt8", func(e ArrayEncoder) { e.AppendInt8(42) }, int8(42)}, + {"AppendString", func(e ArrayEncoder) { e.AppendString("foo") }, "foo"}, + {"AppendTime", func(e ArrayEncoder) { e.AppendTime(time.Unix(0, 100)) }, time.Unix(0, 100)}, + {"AppendUint", func(e ArrayEncoder) { e.AppendUint(42) }, uint(42)}, + {"AppendUint64", func(e ArrayEncoder) { e.AppendUint64(42) }, uint64(42)}, + {"AppendUint32", func(e ArrayEncoder) { e.AppendUint32(42) }, uint32(42)}, + {"AppendUint16", func(e ArrayEncoder) { e.AppendUint16(42) }, uint16(42)}, + {"AppendUint8", func(e ArrayEncoder) { e.AppendUint8(42) }, uint8(42)}, + {"AppendUintptr", func(e ArrayEncoder) { e.AppendUintptr(42) }, uintptr(42)}, + { + desc: "AppendReflected", + f: func(e ArrayEncoder) { e.AppendReflected(map[string]interface{}{"foo": 5}) }, + expected: map[string]interface{}{"foo": 5}, + }, + { + desc: "AppendArray (arrays of arrays)", + f: func(e ArrayEncoder) { + e.AppendArray(ArrayMarshalerFunc(func(inner ArrayEncoder) error { + inner.AppendBool(true) + inner.AppendBool(false) + return nil + })) + }, + expected: []interface{}{true, false}, + }, + } + + for _, tt := range tests { + enc := NewMapObjectEncoder() + assert.NoError(t, enc.AddArray("k", ArrayMarshalerFunc(func(arr ArrayEncoder) error { + tt.f(arr) + tt.f(arr) + return nil + })), "Expected AddArray to succeed.") + + arr, ok := enc.Fields["k"].([]interface{}) + if !ok { + t.Errorf("Test case %s didn't encode an array.", tt.desc) + continue + } + assert.Equal(t, []interface{}{tt.expected, tt.expected}, arr, "Unexpected encoder output.") + } +} + +func TestMapObjectEncoderReflectionFailures(t *testing.T) { + enc := NewMapObjectEncoder() + assert.Error(t, enc.AddObject("object", loggable{false}), "Expected AddObject to fail.") + assert.Equal( + t, + map[string]interface{}{"object": map[string]interface{}{}}, + enc.Fields, + "Expected encoder to use empty values on errors.", + ) +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/sampler.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/sampler.go new file mode 100644 index 0000000..e316418 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/sampler.go @@ -0,0 +1,134 @@ +// 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 +// 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. + +package zapcore + +import ( + "time" + + "go.uber.org/atomic" +) + +const ( + _numLevels = _maxLevel - _minLevel + 1 + _countersPerLevel = 4096 +) + +type counter struct { + resetAt atomic.Int64 + counter atomic.Uint64 +} + +type counters [_numLevels][_countersPerLevel]counter + +func newCounters() *counters { + return &counters{} +} + +func (cs *counters) get(lvl Level, key string) *counter { + i := lvl - _minLevel + j := fnv32a(key) % _countersPerLevel + return &cs[i][j] +} + +// fnv32a, adapted from "hash/fnv", but without a []byte(string) alloc +func fnv32a(s string) uint32 { + const ( + offset32 = 2166136261 + prime32 = 16777619 + ) + hash := uint32(offset32) + for i := 0; i < len(s); i++ { + hash ^= uint32(s[i]) + hash *= prime32 + } + return hash +} + +func (c *counter) IncCheckReset(t time.Time, tick time.Duration) uint64 { + tn := t.UnixNano() + resetAfter := c.resetAt.Load() + if resetAfter > tn { + return c.counter.Inc() + } + + c.counter.Store(1) + + newResetAfter := tn + tick.Nanoseconds() + if !c.resetAt.CAS(resetAfter, newResetAfter) { + // We raced with another goroutine trying to reset, and it also reset + // the counter to 1, so we need to reincrement the counter. + return c.counter.Inc() + } + + return 1 +} + +type sampler struct { + Core + + counts *counters + tick time.Duration + first, thereafter uint64 +} + +// NewSampler creates a Core that samples incoming entries, which caps the CPU +// and I/O load of logging while attempting to preserve a representative subset +// of your logs. +// +// Zap samples by logging the first N entries with a given level and message +// 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. +// +// 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 NewSampler(core Core, tick time.Duration, first, thereafter int) Core { + return &sampler{ + Core: core, + tick: tick, + counts: newCounters(), + first: uint64(first), + thereafter: uint64(thereafter), + } +} + +func (s *sampler) With(fields []Field) Core { + return &sampler{ + Core: s.Core.With(fields), + tick: s.tick, + counts: s.counts, + first: s.first, + thereafter: s.thereafter, + } +} + +func (s *sampler) Check(ent Entry, ce *CheckedEntry) *CheckedEntry { + if !s.Enabled(ent.Level) { + return ce + } + + 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 { + return ce + } + return s.Core.Check(ent, ce) +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/sampler_bench_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/sampler_bench_test.go new file mode 100644 index 0000000..3c79932 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/sampler_bench_test.go @@ -0,0 +1,230 @@ +// 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 +// 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. + +package zapcore_test + +import ( + "fmt" + "testing" + "time" + + . "go.uber.org/zap/zapcore" + "go.uber.org/zap/zaptest" +) + +var counterTestCases = [][]string{ + // some stuff I made up + { + "foo", + "bar", + "baz", + "alpha", + "bravo", + "charlie", + "delta", + }, + + // shuf -n50 /usr/share/dict/words + { + "unbracing", + "stereotomy", + "supranervian", + "moaning", + "exchangeability", + "gunyang", + "sulcation", + "dariole", + "archheresy", + "synchronistically", + "clips", + "unsanctioned", + "Argoan", + "liparomphalus", + "layship", + "Fregatae", + "microzoology", + "glaciaria", + "Frugivora", + "patterist", + "Grossulariaceae", + "lithotint", + "bargander", + "opisthographical", + "cacography", + "chalkstone", + "nonsubstantialism", + "sardonicism", + "calamiform", + "lodginghouse", + "predisposedly", + "topotypic", + "broideress", + "outrange", + "gingivolabial", + "monoazo", + "sparlike", + "concameration", + "untoothed", + "Camorrism", + "reissuer", + "soap", + "palaiotype", + "countercharm", + "yellowbird", + "palterly", + "writinger", + "boatfalls", + "tuglike", + "underbitten", + }, + + // shuf -n100 /usr/share/dict/words + { + "rooty", + "malcultivation", + "degrade", + "pseudoindependent", + "stillatory", + "antiseptize", + "protoamphibian", + "antiar", + "Esther", + "pseudelminth", + "superfluitance", + "teallite", + "disunity", + "spirignathous", + "vergency", + "myliobatid", + "inosic", + "overabstemious", + "patriarchally", + "foreimagine", + "coetaneity", + "hemimellitene", + "hyperspatial", + "aulophyte", + "electropoion", + "antitrope", + "Amarantus", + "smaltine", + "lighthead", + "syntonically", + "incubous", + "versation", + "cirsophthalmia", + "Ulidian", + "homoeography", + "Velella", + "Hecatean", + "serfage", + "Spermaphyta", + "palatoplasty", + "electroextraction", + "aconite", + "avirulence", + "initiator", + "besmear", + "unrecognizably", + "euphoniousness", + "balbuties", + "pascuage", + "quebracho", + "Yakala", + "auriform", + "sevenbark", + "superorganism", + "telesterion", + "ensand", + "nagaika", + "anisuria", + "etching", + "soundingly", + "grumpish", + "drillmaster", + "perfumed", + "dealkylate", + "anthracitiferous", + "predefiance", + "sulphoxylate", + "freeness", + "untucking", + "misworshiper", + "Nestorianize", + "nonegoistical", + "construe", + "upstroke", + "teated", + "nasolachrymal", + "Mastodontidae", + "gallows", + "radioluminescent", + "uncourtierlike", + "phasmatrope", + "Clunisian", + "drainage", + "sootless", + "brachyfacial", + "antiheroism", + "irreligionize", + "ked", + "unfact", + "nonprofessed", + "milady", + "conjecture", + "Arctomys", + "guapilla", + "Sassenach", + "emmetrope", + "rosewort", + "raphidiferous", + "pooh", + "Tyndallize", + }, +} + +func BenchmarkSampler_Check(b *testing.B) { + for _, keys := range counterTestCases { + b.Run(fmt.Sprintf("%v keys", len(keys)), func(b *testing.B) { + fac := NewSampler( + NewCore( + NewJSONEncoder(testEncoderConfig()), + &zaptest.Discarder{}, + DebugLevel, + ), + time.Millisecond, 1, 1000) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + i := 0 + for pb.Next() { + ent := Entry{ + Level: DebugLevel + Level(i%4), + Message: keys[i], + } + _ = fac.Check(ent, nil) + i++ + if n := len(keys); i >= n { + i -= n + } + } + }) + }) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/sampler_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/sampler_test.go new file mode 100644 index 0000000..82588c9 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/sampler_test.go @@ -0,0 +1,225 @@ +// 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 +// 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. + +package zapcore_test + +import ( + "fmt" + "sync" + "testing" + "time" + + "go.uber.org/atomic" + . "go.uber.org/zap/zapcore" + "go.uber.org/zap/zaptest" + "go.uber.org/zap/zaptest/observer" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func fakeSampler(lvl LevelEnabler, tick time.Duration, first, thereafter int) (Core, *observer.ObservedLogs) { + core, logs := observer.New(lvl) + core = NewSampler(core, tick, first, thereafter) + return core, logs +} + +func assertSequence(t testing.TB, logs []observer.LoggedEntry, lvl Level, seq ...int64) { + seen := make([]int64, len(logs)) + for i, entry := range logs { + require.Equal(t, "", entry.Message, "Message wasn't created by writeSequence.") + require.Equal(t, 1, len(entry.Context), "Unexpected number of fields.") + require.Equal(t, lvl, entry.Level, "Unexpected level.") + f := entry.Context[0] + require.Equal(t, "iter", f.Key, "Unexpected field key.") + require.Equal(t, Int64Type, f.Type, "Unexpected field type") + seen[i] = f.Integer + } + assert.Equal(t, seq, seen, "Unexpected sequence logged at level %v.", lvl) +} + +func writeSequence(core Core, n int, lvl Level) { + // All tests using writeSequence verify that counters are shared between + // parent and child cores. + core = core.With([]Field{makeInt64Field("iter", n)}) + if ce := core.Check(Entry{Level: lvl, Time: time.Now()}, nil); ce != nil { + ce.Write() + } +} + +func TestSampler(t *testing.T) { + for _, lvl := range []Level{DebugLevel, InfoLevel, WarnLevel, ErrorLevel, DPanicLevel, PanicLevel, FatalLevel} { + sampler, logs := fakeSampler(DebugLevel, time.Minute, 2, 3) + + // Ensure that counts aren't shared between levels. + probeLevel := DebugLevel + if lvl == DebugLevel { + probeLevel = InfoLevel + } + for i := 0; i < 10; i++ { + writeSequence(sampler, 1, probeLevel) + } + // Clear any output. + logs.TakeAll() + + for i := 1; i < 10; i++ { + writeSequence(sampler, i, lvl) + } + assertSequence(t, logs.TakeAll(), lvl, 1, 2, 5, 8) + } +} + +func TestSamplerDisabledLevels(t *testing.T) { + sampler, logs := fakeSampler(InfoLevel, time.Minute, 1, 100) + + // Shouldn't be counted, because debug logging isn't enabled. + writeSequence(sampler, 1, DebugLevel) + writeSequence(sampler, 2, InfoLevel) + assertSequence(t, logs.TakeAll(), InfoLevel, 2) +} + +func TestSamplerTicking(t *testing.T) { + // Ensure that we're resetting the sampler's counter every tick. + sampler, logs := fakeSampler(DebugLevel, 10*time.Millisecond, 5, 10) + + // If we log five or fewer messages every tick, none of them should be + // dropped. + for tick := 0; tick < 2; tick++ { + for i := 1; i <= 5; i++ { + writeSequence(sampler, i, InfoLevel) + } + zaptest.Sleep(15 * time.Millisecond) + } + assertSequence( + t, + logs.TakeAll(), + InfoLevel, + 1, 2, 3, 4, 5, // first tick + 1, 2, 3, 4, 5, // second tick + ) + + // If we log quickly, we should drop some logs. The first five statements + // each tick should be logged, then every tenth. + for tick := 0; tick < 3; tick++ { + for i := 1; i < 18; i++ { + writeSequence(sampler, i, InfoLevel) + } + zaptest.Sleep(10 * time.Millisecond) + } + + assertSequence( + t, + logs.TakeAll(), + InfoLevel, + 1, 2, 3, 4, 5, 15, // first tick + 1, 2, 3, 4, 5, 15, // second tick + 1, 2, 3, 4, 5, 15, // third tick + ) +} + +type countingCore struct { + logs atomic.Uint32 +} + +func (c *countingCore) Check(ent Entry, ce *CheckedEntry) *CheckedEntry { + return ce.AddCore(ent, c) +} + +func (c *countingCore) Write(Entry, []Field) error { + c.logs.Inc() + return nil +} + +func (c *countingCore) With([]Field) Core { return c } +func (*countingCore) Enabled(Level) bool { return true } +func (*countingCore) Sync() error { return nil } + +func TestSamplerConcurrent(t *testing.T) { + const ( + logsPerTick = 10 + numMessages = 5 + numTicks = 25 + numGoroutines = 10 + expectedCount = numMessages * logsPerTick * numTicks + ) + + tick := zaptest.Timeout(10 * time.Millisecond) + cc := &countingCore{} + sampler := NewSampler(cc, tick, logsPerTick, 100000) + + var ( + done atomic.Bool + wg sync.WaitGroup + ) + for i := 0; i < numGoroutines; i++ { + wg.Add(1) + go func(i int) { + defer wg.Done() + + for { + if done.Load() { + return + } + msg := fmt.Sprintf("msg%v", i%numMessages) + ent := Entry{Level: DebugLevel, Message: msg, Time: time.Now()} + if ce := sampler.Check(ent, nil); ce != nil { + ce.Write() + } + + // Give a chance for other goroutines to run. + time.Sleep(time.Microsecond) + } + }(i) + } + + time.AfterFunc(numTicks*tick, func() { + done.Store(true) + }) + wg.Wait() + + assert.InDelta( + t, + expectedCount, + cc.logs.Load(), + expectedCount/10, + "Unexpected number of logs", + ) +} + +func TestSamplerRaces(t *testing.T) { + sampler, _ := fakeSampler(DebugLevel, time.Minute, 1, 1000) + + var wg sync.WaitGroup + start := make(chan struct{}) + + for i := 0; i < 100; i++ { + wg.Add(1) + go func() { + <-start + for j := 0; j < 100; j++ { + writeSequence(sampler, j, InfoLevel) + } + wg.Done() + }() + } + + close(start) + wg.Wait() +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/tee.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/tee.go new file mode 100644 index 0000000..07a32ee --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/tee.go @@ -0,0 +1,81 @@ +// 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 +// 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. + +package zapcore + +import "go.uber.org/multierr" + +type multiCore []Core + +// NewTee creates a Core that duplicates log entries into two or more +// underlying Cores. +// +// Calling it with a single Core returns the input unchanged, and calling +// it with no input returns a no-op Core. +func NewTee(cores ...Core) Core { + switch len(cores) { + case 0: + return NewNopCore() + case 1: + return cores[0] + default: + return multiCore(cores) + } +} + +func (mc multiCore) With(fields []Field) Core { + clone := make(multiCore, len(mc)) + for i := range mc { + clone[i] = mc[i].With(fields) + } + return clone +} + +func (mc multiCore) Enabled(lvl Level) bool { + for i := range mc { + if mc[i].Enabled(lvl) { + return true + } + } + return false +} + +func (mc multiCore) Check(ent Entry, ce *CheckedEntry) *CheckedEntry { + for i := range mc { + ce = mc[i].Check(ent, ce) + } + return ce +} + +func (mc multiCore) Write(ent Entry, fields []Field) error { + var err error + for i := range mc { + err = multierr.Append(err, mc[i].Write(ent, fields)) + } + return err +} + +func (mc multiCore) Sync() error { + var err error + for i := range mc { + err = multierr.Append(err, mc[i].Sync()) + } + return err +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/tee_logger_bench_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/tee_logger_bench_test.go new file mode 100644 index 0000000..041f10a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/tee_logger_bench_test.go @@ -0,0 +1,62 @@ +// 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 +// 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. + +package zapcore_test + +import ( + "testing" + + . "go.uber.org/zap/zapcore" + "go.uber.org/zap/zaptest" +) + +func withBenchedTee(b *testing.B, f func(Core)) { + fac := NewTee( + NewCore(NewJSONEncoder(testEncoderConfig()), &zaptest.Discarder{}, DebugLevel), + NewCore(NewJSONEncoder(testEncoderConfig()), &zaptest.Discarder{}, InfoLevel), + ) + b.ResetTimer() + f(fac) +} + +func BenchmarkTeeCheck(b *testing.B) { + cases := []struct { + lvl Level + msg string + }{ + {DebugLevel, "foo"}, + {InfoLevel, "bar"}, + {WarnLevel, "baz"}, + {ErrorLevel, "babble"}, + } + withBenchedTee(b, func(core Core) { + b.RunParallel(func(pb *testing.PB) { + i := 0 + for pb.Next() { + tt := cases[i] + entry := Entry{Level: tt.lvl, Message: tt.msg} + if cm := core.Check(entry, nil); cm != nil { + cm.Write(Field{Key: "i", Integer: int64(i), Type: Int64Type}) + } + i = (i + 1) % len(cases) + } + }) + }) +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/tee_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/tee_test.go new file mode 100644 index 0000000..754abbb --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/tee_test.go @@ -0,0 +1,153 @@ +// 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 +// 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. + +package zapcore_test + +import ( + "errors" + "testing" + + . "go.uber.org/zap/zapcore" + "go.uber.org/zap/zaptest" + "go.uber.org/zap/zaptest/observer" + + "github.com/stretchr/testify/assert" +) + +func withTee(f func(core Core, debugLogs, warnLogs *observer.ObservedLogs)) { + debugLogger, debugLogs := observer.New(DebugLevel) + warnLogger, warnLogs := observer.New(WarnLevel) + tee := NewTee(debugLogger, warnLogger) + f(tee, debugLogs, warnLogs) +} + +func TestTeeUnusualInput(t *testing.T) { + // Verify that Tee handles receiving one and no inputs correctly. + t.Run("one input", func(t *testing.T) { + obs, _ := observer.New(DebugLevel) + assert.Equal(t, obs, NewTee(obs), "Expected to return single inputs unchanged.") + }) + t.Run("no input", func(t *testing.T) { + assert.Equal(t, NewNopCore(), NewTee(), "Expected to return NopCore.") + }) +} + +func TestTeeCheck(t *testing.T) { + withTee(func(tee Core, debugLogs, warnLogs *observer.ObservedLogs) { + debugEntry := Entry{Level: DebugLevel, Message: "log-at-debug"} + infoEntry := Entry{Level: InfoLevel, Message: "log-at-info"} + warnEntry := Entry{Level: WarnLevel, Message: "log-at-warn"} + errorEntry := Entry{Level: ErrorLevel, Message: "log-at-error"} + for _, ent := range []Entry{debugEntry, infoEntry, warnEntry, errorEntry} { + if ce := tee.Check(ent, nil); ce != nil { + ce.Write() + } + } + + assert.Equal(t, []observer.LoggedEntry{ + {Entry: debugEntry, Context: []Field{}}, + {Entry: infoEntry, Context: []Field{}}, + {Entry: warnEntry, Context: []Field{}}, + {Entry: errorEntry, Context: []Field{}}, + }, debugLogs.All()) + + assert.Equal(t, []observer.LoggedEntry{ + {Entry: warnEntry, Context: []Field{}}, + {Entry: errorEntry, Context: []Field{}}, + }, warnLogs.All()) + }) +} + +func TestTeeWrite(t *testing.T) { + // Calling the tee's Write method directly should always log, regardless of + // the configured level. + withTee(func(tee Core, debugLogs, warnLogs *observer.ObservedLogs) { + debugEntry := Entry{Level: DebugLevel, Message: "log-at-debug"} + warnEntry := Entry{Level: WarnLevel, Message: "log-at-warn"} + for _, ent := range []Entry{debugEntry, warnEntry} { + tee.Write(ent, nil) + } + + for _, logs := range []*observer.ObservedLogs{debugLogs, warnLogs} { + assert.Equal(t, []observer.LoggedEntry{ + {Entry: debugEntry, Context: []Field{}}, + {Entry: warnEntry, Context: []Field{}}, + }, logs.All()) + } + }) +} + +func TestTeeWith(t *testing.T) { + withTee(func(tee Core, debugLogs, warnLogs *observer.ObservedLogs) { + f := makeInt64Field("k", 42) + tee = tee.With([]Field{f}) + ent := Entry{Level: WarnLevel, Message: "log-at-warn"} + if ce := tee.Check(ent, nil); ce != nil { + ce.Write() + } + + for _, logs := range []*observer.ObservedLogs{debugLogs, warnLogs} { + assert.Equal(t, []observer.LoggedEntry{ + {Entry: ent, Context: []Field{f}}, + }, logs.All()) + } + }) +} + +func TestTeeEnabled(t *testing.T) { + infoLogger, _ := observer.New(InfoLevel) + warnLogger, _ := observer.New(WarnLevel) + tee := NewTee(infoLogger, warnLogger) + tests := []struct { + lvl Level + enabled bool + }{ + {DebugLevel, false}, + {InfoLevel, true}, + {WarnLevel, true}, + {ErrorLevel, true}, + {DPanicLevel, true}, + {PanicLevel, true}, + {FatalLevel, true}, + } + + for _, tt := range tests { + assert.Equal(t, tt.enabled, tee.Enabled(tt.lvl), "Unexpected Enabled result for level %s.", tt.lvl) + } +} + +func TestTeeSync(t *testing.T) { + infoLogger, _ := observer.New(InfoLevel) + warnLogger, _ := observer.New(WarnLevel) + tee := NewTee(infoLogger, warnLogger) + assert.NoError(t, tee.Sync(), "Unexpected error from Syncing a tee.") + + sink := &zaptest.Discarder{} + err := errors.New("failed") + sink.SetError(err) + + noSync := NewCore( + NewJSONEncoder(testEncoderConfig()), + sink, + DebugLevel, + ) + tee = NewTee(tee, noSync) + assert.Equal(t, err, tee.Sync(), "Expected an error when part of tee can't Sync.") +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/write_syncer.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/write_syncer.go new file mode 100644 index 0000000..209e25f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/write_syncer.go @@ -0,0 +1,123 @@ +// 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 +// 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. + +package zapcore + +import ( + "io" + "sync" + + "go.uber.org/multierr" +) + +// A WriteSyncer is an io.Writer that can also flush any buffered data. Note +// that *os.File (and thus, os.Stderr and os.Stdout) implement WriteSyncer. +type WriteSyncer interface { + io.Writer + Sync() error +} + +// AddSync converts an io.Writer to a WriteSyncer. It attempts to be +// intelligent: if the concrete type of the io.Writer implements WriteSyncer, +// we'll use the existing Sync method. If it doesn't, we'll add a no-op Sync. +func AddSync(w io.Writer) WriteSyncer { + switch w := w.(type) { + case WriteSyncer: + return w + default: + return writerWrapper{w} + } +} + +type lockedWriteSyncer struct { + sync.Mutex + ws WriteSyncer +} + +// Lock wraps a WriteSyncer in a mutex to make it safe for concurrent use. In +// particular, *os.Files must be locked before use. +func Lock(ws WriteSyncer) WriteSyncer { + if _, ok := ws.(*lockedWriteSyncer); ok { + // no need to layer on another lock + return ws + } + return &lockedWriteSyncer{ws: ws} +} + +func (s *lockedWriteSyncer) Write(bs []byte) (int, error) { + s.Lock() + n, err := s.ws.Write(bs) + s.Unlock() + return n, err +} + +func (s *lockedWriteSyncer) Sync() error { + s.Lock() + err := s.ws.Sync() + s.Unlock() + return err +} + +type writerWrapper struct { + io.Writer +} + +func (w writerWrapper) Sync() error { + return nil +} + +type multiWriteSyncer []WriteSyncer + +// NewMultiWriteSyncer creates a WriteSyncer that duplicates its writes +// and sync calls, much like io.MultiWriter. +func NewMultiWriteSyncer(ws ...WriteSyncer) WriteSyncer { + if len(ws) == 1 { + return ws[0] + } + // Copy to protect against https://github.com/golang/go/issues/7809 + return multiWriteSyncer(append([]WriteSyncer(nil), ws...)) +} + +// See https://golang.org/src/io/multi.go +// When not all underlying syncers write the same number of bytes, +// the smallest number is returned even though Write() is called on +// all of them. +func (ws multiWriteSyncer) Write(p []byte) (int, error) { + var writeErr error + nWritten := 0 + for _, w := range ws { + n, err := w.Write(p) + writeErr = multierr.Append(writeErr, err) + if nWritten == 0 && n != 0 { + nWritten = n + } else if n < nWritten { + nWritten = n + } + } + return nWritten, writeErr +} + +func (ws multiWriteSyncer) Sync() error { + var err error + for _, w := range ws { + err = multierr.Append(err, w.Sync()) + } + return err +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/write_syncer_bench_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/write_syncer_bench_test.go new file mode 100644 index 0000000..0adcad8 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/write_syncer_bench_test.go @@ -0,0 +1,56 @@ +// 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 +// 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. + +package zapcore + +import ( + "testing" + + "go.uber.org/zap/zaptest" +) + +func BenchmarkMultiWriteSyncer(b *testing.B) { + b.Run("2", func(b *testing.B) { + w := NewMultiWriteSyncer( + &zaptest.Discarder{}, + &zaptest.Discarder{}, + ) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + w.Write([]byte("foobarbazbabble")) + } + }) + }) + b.Run("4", func(b *testing.B) { + w := NewMultiWriteSyncer( + &zaptest.Discarder{}, + &zaptest.Discarder{}, + &zaptest.Discarder{}, + &zaptest.Discarder{}, + ) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + w.Write([]byte("foobarbazbabble")) + } + }) + }) +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/write_syncer_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/write_syncer_test.go new file mode 100644 index 0000000..084b94a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapcore/write_syncer_test.go @@ -0,0 +1,137 @@ +// 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 +// 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. + +package zapcore + +import ( + "bytes" + "errors" + "testing" + + "io" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.uber.org/zap/zaptest" +) + +type writeSyncSpy struct { + io.Writer + zaptest.Syncer +} + +func requireWriteWorks(t testing.TB, ws WriteSyncer) { + n, err := ws.Write([]byte("foo")) + require.NoError(t, err, "Unexpected error writing to WriteSyncer.") + require.Equal(t, 3, n, "Wrote an unexpected number of bytes.") +} + +func TestAddSyncWriteSyncer(t *testing.T) { + buf := &bytes.Buffer{} + concrete := &writeSyncSpy{Writer: buf} + ws := AddSync(concrete) + requireWriteWorks(t, ws) + + require.NoError(t, ws.Sync(), "Unexpected error syncing a WriteSyncer.") + require.True(t, concrete.Called(), "Expected to dispatch to concrete type's Sync method.") + + concrete.SetError(errors.New("fail")) + assert.Error(t, ws.Sync(), "Expected to propagate errors from concrete type's Sync method.") +} + +func TestAddSyncWriter(t *testing.T) { + // If we pass a plain io.Writer, make sure that we still get a WriteSyncer + // with a no-op Sync. + buf := &bytes.Buffer{} + ws := AddSync(buf) + requireWriteWorks(t, ws) + assert.NoError(t, ws.Sync(), "Unexpected error calling a no-op Sync method.") +} + +func TestNewMultiWriteSyncerWorksForSingleWriter(t *testing.T) { + w := &zaptest.Buffer{} + + ws := NewMultiWriteSyncer(w) + assert.Equal(t, w, ws, "Expected NewMultiWriteSyncer to return the same WriteSyncer object for a single argument.") + + ws.Sync() + assert.True(t, w.Called(), "Expected Sync to be called on the created WriteSyncer") +} + +func TestMultiWriteSyncerWritesBoth(t *testing.T) { + first := &bytes.Buffer{} + second := &bytes.Buffer{} + ws := NewMultiWriteSyncer(AddSync(first), AddSync(second)) + + msg := []byte("dumbledore") + n, err := ws.Write(msg) + require.NoError(t, err, "Expected successful buffer write") + assert.Equal(t, len(msg), n) + + assert.Equal(t, msg, first.Bytes()) + assert.Equal(t, msg, second.Bytes()) +} + +func TestMultiWriteSyncerFailsWrite(t *testing.T) { + ws := NewMultiWriteSyncer(AddSync(&zaptest.FailWriter{})) + _, err := ws.Write([]byte("test")) + assert.Error(t, err, "Write error should propagate") +} + +func TestMultiWriteSyncerFailsShortWrite(t *testing.T) { + ws := NewMultiWriteSyncer(AddSync(&zaptest.ShortWriter{})) + n, err := ws.Write([]byte("test")) + assert.NoError(t, err, "Expected fake-success from short write") + assert.Equal(t, 3, n, "Expected byte count to return from underlying writer") +} + +func TestWritestoAllSyncs_EvenIfFirstErrors(t *testing.T) { + failer := &zaptest.FailWriter{} + second := &bytes.Buffer{} + ws := NewMultiWriteSyncer(AddSync(failer), AddSync(second)) + + _, err := ws.Write([]byte("fail")) + assert.Error(t, err, "Expected error from call to a writer that failed") + assert.Equal(t, []byte("fail"), second.Bytes(), "Expected second sink to be written after first error") +} + +func TestMultiWriteSyncerSync_PropagatesErrors(t *testing.T) { + badsink := &zaptest.Buffer{} + badsink.SetError(errors.New("sink is full")) + ws := NewMultiWriteSyncer(&zaptest.Discarder{}, badsink) + + assert.Error(t, ws.Sync(), "Expected sync error to propagate") +} + +func TestMultiWriteSyncerSync_NoErrorsOnDiscard(t *testing.T) { + ws := NewMultiWriteSyncer(&zaptest.Discarder{}) + assert.NoError(t, ws.Sync(), "Expected error-free sync to /dev/null") +} + +func TestMultiWriteSyncerSync_AllCalled(t *testing.T) { + failed, second := &zaptest.Buffer{}, &zaptest.Buffer{} + + failed.SetError(errors.New("disposal broken")) + ws := NewMultiWriteSyncer(failed, second) + + assert.Error(t, ws.Sync(), "Expected first sink to fail") + assert.True(t, failed.Called(), "Expected first sink to have Sync method called.") + assert.True(t, second.Called(), "Expected call to Sync even with first failure.") +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapgrpc/zapgrpc.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapgrpc/zapgrpc.go new file mode 100644 index 0000000..1181e6a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapgrpc/zapgrpc.go @@ -0,0 +1,100 @@ +// 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 +// 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. + +// Package zapgrpc provides a logger that is compatible with grpclog. +package zapgrpc // import "go.uber.org/zap/zapgrpc" + +import "go.uber.org/zap" + +// An Option overrides a Logger's default configuration. +type Option interface { + apply(*Logger) +} + +type optionFunc func(*Logger) + +func (f optionFunc) apply(log *Logger) { + f(log) +} + +// WithDebug configures a Logger to print at zap's DebugLevel instead of +// InfoLevel. +func WithDebug() Option { + return optionFunc(func(logger *Logger) { + logger.print = (*zap.SugaredLogger).Debug + logger.printf = (*zap.SugaredLogger).Debugf + }) +} + +// NewLogger returns a new Logger. +// +// By default, Loggers print at zap's InfoLevel. +func NewLogger(l *zap.Logger, options ...Option) *Logger { + logger := &Logger{ + log: l.Sugar(), + fatal: (*zap.SugaredLogger).Fatal, + fatalf: (*zap.SugaredLogger).Fatalf, + print: (*zap.SugaredLogger).Info, + printf: (*zap.SugaredLogger).Infof, + } + for _, option := range options { + option.apply(logger) + } + return logger +} + +// Logger adapts zap's Logger to be compatible with grpclog.Logger. +type Logger struct { + log *zap.SugaredLogger + fatal func(*zap.SugaredLogger, ...interface{}) + fatalf func(*zap.SugaredLogger, string, ...interface{}) + print func(*zap.SugaredLogger, ...interface{}) + printf func(*zap.SugaredLogger, string, ...interface{}) +} + +// Fatal implements grpclog.Logger. +func (l *Logger) Fatal(args ...interface{}) { + l.fatal(l.log, args...) +} + +// Fatalf implements grpclog.Logger. +func (l *Logger) Fatalf(format string, args ...interface{}) { + l.fatalf(l.log, format, args...) +} + +// Fatalln implements grpclog.Logger. +func (l *Logger) Fatalln(args ...interface{}) { + l.fatal(l.log, args...) +} + +// Print implements grpclog.Logger. +func (l *Logger) Print(args ...interface{}) { + l.print(l.log, args...) +} + +// Printf implements grpclog.Logger. +func (l *Logger) Printf(format string, args ...interface{}) { + l.printf(l.log, format, args...) +} + +// Println implements grpclog.Logger. +func (l *Logger) Println(args ...interface{}) { + l.print(l.log, args...) +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapgrpc/zapgrpc_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapgrpc/zapgrpc_test.go new file mode 100644 index 0000000..036f3d7 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zapgrpc/zapgrpc_test.go @@ -0,0 +1,115 @@ +// 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 +// 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. + +package zapgrpc + +import ( + "testing" + + "go.uber.org/zap" + "go.uber.org/zap/zapcore" + "go.uber.org/zap/zaptest/observer" + + "github.com/stretchr/testify/require" +) + +func TestLoggerInfoExpected(t *testing.T) { + checkMessages(t, zapcore.DebugLevel, nil, zapcore.InfoLevel, []string{ + "hello", + "world", + "foo", + }, func(logger *Logger) { + logger.Print("hello") + logger.Printf("world") + logger.Println("foo") + }) +} + +func TestLoggerDebugExpected(t *testing.T) { + checkMessages(t, zapcore.DebugLevel, []Option{WithDebug()}, zapcore.DebugLevel, []string{ + "hello", + "world", + "foo", + }, func(logger *Logger) { + logger.Print("hello") + logger.Printf("world") + logger.Println("foo") + }) +} + +func TestLoggerDebugSuppressed(t *testing.T) { + checkMessages(t, zapcore.InfoLevel, []Option{WithDebug()}, zapcore.DebugLevel, nil, func(logger *Logger) { + logger.Print("hello") + logger.Printf("world") + logger.Println("foo") + }) +} + +func TestLoggerFatalExpected(t *testing.T) { + checkMessages(t, zapcore.DebugLevel, nil, zapcore.FatalLevel, []string{ + "hello", + "world", + "foo", + }, func(logger *Logger) { + logger.Fatal("hello") + logger.Fatalf("world") + logger.Fatalln("foo") + }) +} + +func checkMessages( + t testing.TB, + enab zapcore.LevelEnabler, + opts []Option, + expectedLevel zapcore.Level, + expectedMessages []string, + f func(*Logger), +) { + if expectedLevel == zapcore.FatalLevel { + expectedLevel = zapcore.WarnLevel + } + withLogger(enab, opts, func(logger *Logger, observedLogs *observer.ObservedLogs) { + f(logger) + logEntries := observedLogs.All() + require.Equal(t, len(expectedMessages), len(logEntries)) + for i, logEntry := range logEntries { + require.Equal(t, expectedLevel, logEntry.Level) + require.Equal(t, expectedMessages[i], logEntry.Message) + } + }) +} + +func withLogger( + enab zapcore.LevelEnabler, + opts []Option, + f func(*Logger, *observer.ObservedLogs), +) { + core, observedLogs := observer.New(enab) + f(NewLogger(zap.New(core), append(opts, withWarn())...), observedLogs) +} + +// withWarn redirects the fatal level to the warn level, which makes testing +// easier. +func withWarn() Option { + return optionFunc(func(logger *Logger) { + logger.fatal = (*zap.SugaredLogger).Warn + logger.fatalf = (*zap.SugaredLogger).Warnf + }) +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zaptest/doc.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zaptest/doc.go new file mode 100644 index 0000000..464f589 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zaptest/doc.go @@ -0,0 +1,27 @@ +// 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 +// 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. + +// Package zaptest provides low-level helpers for testing log output. These +// utilities are helpful in zap's own unit tests, but any assertions using +// them are strongly coupled to a single encoding. +// +// Most users should use go.uber.org/zap/zaptest/observer instead of this +// package. +package zaptest // import "go.uber.org/zap/zaptest" diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zaptest/observer/logged_entry.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zaptest/observer/logged_entry.go new file mode 100644 index 0000000..a4ea7ec --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zaptest/observer/logged_entry.go @@ -0,0 +1,39 @@ +// Copyright (c) 2017 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. + +package observer + +import "go.uber.org/zap/zapcore" + +// An LoggedEntry is an encoding-agnostic representation of a log message. +// Field availability is context dependant. +type LoggedEntry struct { + zapcore.Entry + Context []zapcore.Field +} + +// ContextMap returns a map for all fields in Context. +func (e LoggedEntry) ContextMap() map[string]interface{} { + encoder := zapcore.NewMapObjectEncoder() + for _, f := range e.Context { + f.AddTo(encoder) + } + return encoder.Fields +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zaptest/observer/logged_entry_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zaptest/observer/logged_entry_test.go new file mode 100644 index 0000000..50f6123 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zaptest/observer/logged_entry_test.go @@ -0,0 +1,88 @@ +// Copyright (c) 2017 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. + +package observer + +import ( + "testing" + + "go.uber.org/zap" + "go.uber.org/zap/zapcore" + + "github.com/stretchr/testify/assert" +) + +func TestLoggedEntryContextMap(t *testing.T) { + tests := []struct { + msg string + fields []zapcore.Field + want map[string]interface{} + }{ + { + msg: "no fields", + fields: nil, + want: map[string]interface{}{}, + }, + { + msg: "simple", + fields: []zapcore.Field{ + zap.String("k1", "v"), + zap.Int64("k2", 10), + }, + want: map[string]interface{}{ + "k1": "v", + "k2": int64(10), + }, + }, + { + msg: "overwrite", + fields: []zapcore.Field{ + zap.String("k1", "v1"), + zap.String("k1", "v2"), + }, + want: map[string]interface{}{ + "k1": "v2", + }, + }, + { + msg: "nested", + fields: []zapcore.Field{ + zap.String("k1", "v1"), + zap.Namespace("nested"), + zap.String("k2", "v2"), + }, + want: map[string]interface{}{ + "k1": "v1", + "nested": map[string]interface{}{ + "k2": "v2", + }, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.msg, func(t *testing.T) { + entry := LoggedEntry{ + Context: tt.fields, + } + assert.Equal(t, tt.want, entry.ContextMap()) + }) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zaptest/observer/observer.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zaptest/observer/observer.go new file mode 100644 index 0000000..78f5be4 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zaptest/observer/observer.go @@ -0,0 +1,167 @@ +// 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 +// 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. + +// Package observer provides a zapcore.Core that keeps an in-memory, +// encoding-agnostic repesentation of log entries. It's useful for +// applications that want to unit test their log output without tying their +// tests to a particular output encoding. +package observer // import "go.uber.org/zap/zaptest/observer" + +import ( + "strings" + "sync" + "time" + + "go.uber.org/zap/zapcore" +) + +// ObservedLogs is a concurrency-safe, ordered collection of observed logs. +type ObservedLogs struct { + mu sync.RWMutex + logs []LoggedEntry +} + +// Len returns the number of items in the collection. +func (o *ObservedLogs) Len() int { + o.mu.RLock() + n := len(o.logs) + o.mu.RUnlock() + return n +} + +// All returns a copy of all the observed logs. +func (o *ObservedLogs) All() []LoggedEntry { + o.mu.RLock() + ret := make([]LoggedEntry, len(o.logs)) + for i := range o.logs { + ret[i] = o.logs[i] + } + o.mu.RUnlock() + return ret +} + +// TakeAll returns a copy of all the observed logs, and truncates the observed +// slice. +func (o *ObservedLogs) TakeAll() []LoggedEntry { + o.mu.Lock() + ret := o.logs + o.logs = nil + o.mu.Unlock() + return ret +} + +// AllUntimed returns a copy of all the observed logs, but overwrites the +// observed timestamps with time.Time's zero value. This is useful when making +// assertions in tests. +func (o *ObservedLogs) AllUntimed() []LoggedEntry { + ret := o.All() + for i := range ret { + ret[i].Time = time.Time{} + } + return ret +} + +// FilterMessage filters entries to those that have the specified message. +func (o *ObservedLogs) FilterMessage(msg string) *ObservedLogs { + return o.filter(func(e LoggedEntry) bool { + return e.Message == msg + }) +} + +// FilterMessageSnippet filters entries to those that have a message containing the specified snippet. +func (o *ObservedLogs) FilterMessageSnippet(snippet string) *ObservedLogs { + return o.filter(func(e LoggedEntry) bool { + return strings.Contains(e.Message, snippet) + }) +} + +// FilterField filters entries to those that have the specified field. +func (o *ObservedLogs) FilterField(field zapcore.Field) *ObservedLogs { + return o.filter(func(e LoggedEntry) bool { + for _, ctxField := range e.Context { + if ctxField.Equals(field) { + return true + } + } + return false + }) +} + +func (o *ObservedLogs) filter(match func(LoggedEntry) bool) *ObservedLogs { + o.mu.RLock() + defer o.mu.RUnlock() + + var filtered []LoggedEntry + for _, entry := range o.logs { + if match(entry) { + filtered = append(filtered, entry) + } + } + return &ObservedLogs{logs: filtered} +} + +func (o *ObservedLogs) add(log LoggedEntry) { + o.mu.Lock() + o.logs = append(o.logs, log) + o.mu.Unlock() +} + +// New creates a new Core that buffers logs in memory (without any encoding). +// It's particularly useful in tests. +func New(enab zapcore.LevelEnabler) (zapcore.Core, *ObservedLogs) { + ol := &ObservedLogs{} + return &contextObserver{ + LevelEnabler: enab, + logs: ol, + }, ol +} + +type contextObserver struct { + zapcore.LevelEnabler + logs *ObservedLogs + context []zapcore.Field +} + +func (co *contextObserver) Check(ent zapcore.Entry, ce *zapcore.CheckedEntry) *zapcore.CheckedEntry { + if co.Enabled(ent.Level) { + return ce.AddCore(ent, co) + } + return ce +} + +func (co *contextObserver) With(fields []zapcore.Field) zapcore.Core { + return &contextObserver{ + LevelEnabler: co.LevelEnabler, + logs: co.logs, + context: append(co.context[:len(co.context):len(co.context)], fields...), + } +} + +func (co *contextObserver) Write(ent zapcore.Entry, fields []zapcore.Field) error { + all := make([]zapcore.Field, 0, len(fields)+len(co.context)) + all = append(all, co.context...) + all = append(all, fields...) + co.logs.add(LoggedEntry{ent, all}) + return nil +} + +func (co *contextObserver) Sync() error { + return nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zaptest/observer/observer_test.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zaptest/observer/observer_test.go new file mode 100644 index 0000000..e1a0da7 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zaptest/observer/observer_test.go @@ -0,0 +1,215 @@ +// 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 +// 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. + +package observer_test + +import ( + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "go.uber.org/zap" + "go.uber.org/zap/zapcore" + . "go.uber.org/zap/zaptest/observer" +) + +func assertEmpty(t testing.TB, logs *ObservedLogs) { + assert.Equal(t, 0, logs.Len(), "Expected empty ObservedLogs to have zero length.") + assert.Equal(t, []LoggedEntry{}, logs.All(), "Unexpected LoggedEntries in empty ObservedLogs.") +} + +func TestObserver(t *testing.T) { + observer, logs := New(zap.InfoLevel) + assertEmpty(t, logs) + + assert.NoError(t, observer.Sync(), "Unexpected failure in no-op Sync") + + obs := zap.New(observer).With(zap.Int("i", 1)) + obs.Info("foo") + obs.Debug("bar") + want := []LoggedEntry{{ + Entry: zapcore.Entry{Level: zap.InfoLevel, Message: "foo"}, + Context: []zapcore.Field{zap.Int("i", 1)}, + }} + + assert.Equal(t, 1, logs.Len(), "Unexpected observed logs Len.") + assert.Equal(t, want, logs.AllUntimed(), "Unexpected contents from AllUntimed.") + + all := logs.All() + require.Equal(t, 1, len(all), "Unexpected numbed of LoggedEntries returned from All.") + assert.NotEqual(t, time.Time{}, all[0].Time, "Expected non-zero time on LoggedEntry.") + + // copy & zero time for stable assertions + untimed := append([]LoggedEntry{}, all...) + untimed[0].Time = time.Time{} + assert.Equal(t, want, untimed, "Unexpected LoggedEntries from All.") + + assert.Equal(t, all, logs.TakeAll(), "Expected All and TakeAll to return identical results.") + assertEmpty(t, logs) +} + +func TestObserverWith(t *testing.T) { + sf1, logs := New(zap.InfoLevel) + + // need to pad out enough initial fields so that the underlying slice cap() + // gets ahead of its len() so that the sf3/4 With append's could choose + // not to copy (if the implementation doesn't force them) + sf1 = sf1.With([]zapcore.Field{zap.Int("a", 1), zap.Int("b", 2)}) + + sf2 := sf1.With([]zapcore.Field{zap.Int("c", 3)}) + sf3 := sf2.With([]zapcore.Field{zap.Int("d", 4)}) + sf4 := sf2.With([]zapcore.Field{zap.Int("e", 5)}) + ent := zapcore.Entry{Level: zap.InfoLevel, Message: "hello"} + + for i, core := range []zapcore.Core{sf2, sf3, sf4} { + if ce := core.Check(ent, nil); ce != nil { + ce.Write(zap.Int("i", i)) + } + } + + assert.Equal(t, []LoggedEntry{ + { + Entry: ent, + Context: []zapcore.Field{ + zap.Int("a", 1), + zap.Int("b", 2), + zap.Int("c", 3), + zap.Int("i", 0), + }, + }, + { + Entry: ent, + Context: []zapcore.Field{ + zap.Int("a", 1), + zap.Int("b", 2), + zap.Int("c", 3), + zap.Int("d", 4), + zap.Int("i", 1), + }, + }, + { + Entry: ent, + Context: []zapcore.Field{ + zap.Int("a", 1), + zap.Int("b", 2), + zap.Int("c", 3), + zap.Int("e", 5), + zap.Int("i", 2), + }, + }, + }, logs.All(), "expected no field sharing between With siblings") +} + +func TestFilters(t *testing.T) { + logs := []LoggedEntry{ + { + Entry: zapcore.Entry{Level: zap.InfoLevel, Message: "log a"}, + Context: []zapcore.Field{zap.String("fStr", "1"), zap.Int("a", 1)}, + }, + { + Entry: zapcore.Entry{Level: zap.InfoLevel, Message: "log a"}, + Context: []zapcore.Field{zap.String("fStr", "2"), zap.Int("b", 2)}, + }, + { + Entry: zapcore.Entry{Level: zap.InfoLevel, Message: "log b"}, + Context: []zapcore.Field{zap.Int("a", 1), zap.Int("b", 2)}, + }, + { + Entry: zapcore.Entry{Level: zap.InfoLevel, Message: "log c"}, + Context: []zapcore.Field{zap.Int("a", 1), zap.Namespace("ns"), zap.Int("a", 2)}, + }, + { + Entry: zapcore.Entry{Level: zap.InfoLevel, Message: "msg 1"}, + Context: []zapcore.Field{zap.Int("a", 1), zap.Namespace("ns")}, + }, + { + Entry: zapcore.Entry{Level: zap.InfoLevel, Message: "any map"}, + Context: []zapcore.Field{zap.Any("map", map[string]string{"a": "b"})}, + }, + { + Entry: zapcore.Entry{Level: zap.InfoLevel, Message: "any slice"}, + Context: []zapcore.Field{zap.Any("slice", []string{"a"})}, + }, + } + + logger, sink := New(zap.InfoLevel) + for _, log := range logs { + logger.Write(log.Entry, log.Context) + } + + tests := []struct { + msg string + filtered *ObservedLogs + want []LoggedEntry + }{ + { + msg: "filter by message", + filtered: sink.FilterMessage("log a"), + want: logs[0:2], + }, + { + msg: "filter by field", + filtered: sink.FilterField(zap.String("fStr", "1")), + want: logs[0:1], + }, + { + msg: "filter by message and field", + filtered: sink.FilterMessage("log a").FilterField(zap.Int("b", 2)), + want: logs[1:2], + }, + { + msg: "filter by field with duplicate fields", + filtered: sink.FilterField(zap.Int("a", 2)), + want: logs[3:4], + }, + { + msg: "filter doesn't match any messages", + filtered: sink.FilterMessage("no match"), + want: []LoggedEntry{}, + }, + { + msg: "filter by snippet", + filtered: sink.FilterMessageSnippet("log"), + want: logs[0:4], + }, + { + msg: "filter by snippet and field", + filtered: sink.FilterMessageSnippet("a").FilterField(zap.Int("b", 2)), + want: logs[1:2], + }, + { + msg: "filter for map", + filtered: sink.FilterField(zap.Any("map", map[string]string{"a": "b"})), + want: logs[5:6], + }, + { + msg: "filter for slice", + filtered: sink.FilterField(zap.Any("slice", []string{"a"})), + want: logs[6:7], + }, + } + + for _, tt := range tests { + got := tt.filtered.AllUntimed() + assert.Equal(t, tt.want, got, tt.msg) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zaptest/timeout.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zaptest/timeout.go new file mode 100644 index 0000000..ed24c98 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zaptest/timeout.go @@ -0,0 +1,51 @@ +// 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 +// 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. + +package zaptest + +import ( + "log" + "os" + "strconv" + "time" +) + +var _timeoutScale = 1.0 + +// Timeout scales the provided duration by $TEST_TIMEOUT_SCALE. +func Timeout(base time.Duration) time.Duration { + return time.Duration(float64(base) * _timeoutScale) +} + +// Sleep scales the sleep duration by $TEST_TIMEOUT_SCALE. +func Sleep(base time.Duration) { + time.Sleep(Timeout(base)) +} + +func init() { + if v := os.Getenv("TEST_TIMEOUT_SCALE"); v != "" { + fv, err := strconv.ParseFloat(v, 64) + if err != nil { + panic(err) + } + _timeoutScale = fv + log.Printf("Scaling timeouts by %vx.\n", _timeoutScale) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zaptest/writer.go b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zaptest/writer.go new file mode 100644 index 0000000..0b8b254 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/go.uber.org/zap/zaptest/writer.go @@ -0,0 +1,96 @@ +// 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 +// 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. + +package zaptest + +import ( + "bytes" + "errors" + "io/ioutil" + "strings" +) + +// A Syncer is a spy for the Sync portion of zapcore.WriteSyncer. +type Syncer struct { + err error + called bool +} + +// SetError sets the error that the Sync method will return. +func (s *Syncer) SetError(err error) { + s.err = err +} + +// Sync records that it was called, then returns the user-supplied error (if +// any). +func (s *Syncer) Sync() error { + s.called = true + return s.err +} + +// Called reports whether the Sync method was called. +func (s *Syncer) Called() bool { + return s.called +} + +// A Discarder sends all writes to ioutil.Discard. +type Discarder struct{ Syncer } + +// Write implements io.Writer. +func (d *Discarder) Write(b []byte) (int, error) { + return ioutil.Discard.Write(b) +} + +// FailWriter is a WriteSyncer that always returns an error on writes. +type FailWriter struct{ Syncer } + +// Write implements io.Writer. +func (w FailWriter) Write(b []byte) (int, error) { + return len(b), errors.New("failed") +} + +// ShortWriter is a WriteSyncer whose write method never fails, but +// nevertheless fails to the last byte of the input. +type ShortWriter struct{ Syncer } + +// Write implements io.Writer. +func (w ShortWriter) Write(b []byte) (int, error) { + return len(b) - 1, nil +} + +// Buffer is an implementation of zapcore.WriteSyncer that sends all writes to +// a bytes.Buffer. It has convenience methods to split the accumulated buffer +// on newlines. +type Buffer struct { + bytes.Buffer + Syncer +} + +// Lines returns the current buffer contents, split on newlines. +func (b *Buffer) Lines() []string { + output := strings.Split(b.String(), "\n") + return output[:len(output)-1] +} + +// Stripped returns the current buffer contents with the last trailing newline +// stripped. +func (b *Buffer) Stripped() string { + return strings.TrimRight(b.String(), "\n") +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/.gitattributes b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/.gitattributes new file mode 100644 index 0000000..d2f212e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/.gitattributes @@ -0,0 +1,10 @@ +# Treat all files in this repo as binary, with no git magic updating +# line endings. Windows users contributing to Go will need to use a +# modern version of git and editors capable of LF line endings. +# +# We'll prevent accidental CRLF line endings from entering the repo +# via the git-review gofmt checks. +# +# See golang.org/issue/9281 + +* -text diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/.gitignore b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/.gitignore new file mode 100644 index 0000000..8339fd6 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/.gitignore @@ -0,0 +1,2 @@ +# Add no patterns to .hgignore except for files generated by the build. +last-change diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/AUTHORS b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/AUTHORS new file mode 100644 index 0000000..15167cd --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/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 http://tip.golang.org/AUTHORS. diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/CONTRIBUTING.md b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/CONTRIBUTING.md new file mode 100644 index 0000000..88dff59 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/CONTRIBUTING.md @@ -0,0 +1,31 @@ +# Contributing to Go + +Go is an open source project. + +It is the work of hundreds of contributors. We appreciate your help! + + +## Filing issues + +When [filing an issue](https://golang.org/issue/new), make sure to answer these five questions: + +1. What version of Go are you using (`go version`)? +2. What operating system and processor architecture are you using? +3. What did you do? +4. What did you expect to see? +5. What did you see instead? + +General questions should go to the [golang-nuts mailing list](https://groups.google.com/group/golang-nuts) instead of the issue tracker. +The gophers there will answer or ask you to file an issue if you've tripped over a bug. + +## Contributing code + +Please read the [Contribution Guidelines](https://golang.org/doc/contribute.html) +before sending patches. + +**We do not accept GitHub pull requests** +(we use [Gerrit](https://code.google.com/p/gerrit/) instead for code review). + +Unless otherwise noted, the Go source files are distributed under +the BSD-style license found in the LICENSE file. + diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/CONTRIBUTORS b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/CONTRIBUTORS new file mode 100644 index 0000000..1c4577e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/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 http://tip.golang.org/CONTRIBUTORS. diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/LICENSE b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/LICENSE new file mode 100644 index 0000000..6a66aea --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/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/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/PATENTS b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/PATENTS new file mode 100644 index 0000000..7330990 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/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/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/README.md b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/README.md new file mode 100644 index 0000000..00a9b6e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/README.md @@ -0,0 +1,16 @@ +# Go Networking + +This repository holds supplementary Go networking libraries. + +## Download/Install + +The easiest way to install is to run `go get -u golang.org/x/net`. You can +also manually git clone the repository to `$GOPATH/src/golang.org/x/net`. + +## Report Issues / Send Patches + +This repository uses Gerrit for code changes. To learn how to submit +changes to this repository, see https://golang.org/doc/contribute.html. +The main issue tracker for the net repository is located at +https://github.com/golang/go/issues. Prefix your issue with "x/net:" in the +subject line, so it is easy to find. diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/asm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/asm.go new file mode 100644 index 0000000..15e21b1 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/asm.go @@ -0,0 +1,41 @@ +// 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 bpf + +import "fmt" + +// Assemble converts insts into raw instructions suitable for loading +// into a BPF virtual machine. +// +// Currently, no optimization is attempted, the assembled program flow +// is exactly as provided. +func Assemble(insts []Instruction) ([]RawInstruction, error) { + ret := make([]RawInstruction, len(insts)) + var err error + for i, inst := range insts { + ret[i], err = inst.Assemble() + if err != nil { + return nil, fmt.Errorf("assembling instruction %d: %s", i+1, err) + } + } + return ret, nil +} + +// Disassemble attempts to parse raw back into +// Instructions. Unrecognized RawInstructions are assumed to be an +// extension not implemented by this package, and are passed through +// unchanged to the output. The allDecoded value reports whether insts +// contains no RawInstructions. +func Disassemble(raw []RawInstruction) (insts []Instruction, allDecoded bool) { + insts = make([]Instruction, len(raw)) + allDecoded = true + for i, r := range raw { + insts[i] = r.Disassemble() + if _, ok := insts[i].(RawInstruction); ok { + allDecoded = false + } + } + return insts, allDecoded +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/constants.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/constants.go new file mode 100644 index 0000000..b89ca35 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/constants.go @@ -0,0 +1,218 @@ +// 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 bpf + +// A Register is a register of the BPF virtual machine. +type Register uint16 + +const ( + // RegA is the accumulator register. RegA is always the + // destination register of ALU operations. + RegA Register = iota + // RegX is the indirection register, used by LoadIndirect + // operations. + RegX +) + +// An ALUOp is an arithmetic or logic operation. +type ALUOp uint16 + +// ALU binary operation types. +const ( + ALUOpAdd ALUOp = iota << 4 + ALUOpSub + ALUOpMul + ALUOpDiv + ALUOpOr + ALUOpAnd + ALUOpShiftLeft + ALUOpShiftRight + aluOpNeg // Not exported because it's the only unary ALU operation, and gets its own instruction type. + ALUOpMod + ALUOpXor +) + +// A JumpTest is a comparison operator used in conditional jumps. +type JumpTest uint16 + +// Supported operators for conditional jumps. +const ( + // K == A + JumpEqual JumpTest = iota + // K != A + JumpNotEqual + // K > A + JumpGreaterThan + // K < A + JumpLessThan + // K >= A + JumpGreaterOrEqual + // K <= A + JumpLessOrEqual + // K & A != 0 + JumpBitsSet + // K & A == 0 + JumpBitsNotSet +) + +// An Extension is a function call provided by the kernel that +// performs advanced operations that are expensive or impossible +// within the BPF virtual machine. +// +// Extensions are only implemented by the Linux kernel. +// +// TODO: should we prune this list? Some of these extensions seem +// either broken or near-impossible to use correctly, whereas other +// (len, random, ifindex) are quite useful. +type Extension int + +// Extension functions available in the Linux kernel. +const ( + // extOffset is the negative maximum number of instructions used + // to load instructions by overloading the K argument. + extOffset = -0x1000 + // ExtLen returns the length of the packet. + ExtLen Extension = 1 + // ExtProto returns the packet's L3 protocol type. + ExtProto Extension = 0 + // ExtType returns the packet's type (skb->pkt_type in the kernel) + // + // TODO: better documentation. How nice an API do we want to + // provide for these esoteric extensions? + ExtType Extension = 4 + // ExtPayloadOffset returns the offset of the packet payload, or + // the first protocol header that the kernel does not know how to + // parse. + ExtPayloadOffset Extension = 52 + // ExtInterfaceIndex returns the index of the interface on which + // the packet was received. + ExtInterfaceIndex Extension = 8 + // ExtNetlinkAttr returns the netlink attribute of type X at + // offset A. + ExtNetlinkAttr Extension = 12 + // ExtNetlinkAttrNested returns the nested netlink attribute of + // type X at offset A. + ExtNetlinkAttrNested Extension = 16 + // ExtMark returns the packet's mark value. + ExtMark Extension = 20 + // ExtQueue returns the packet's assigned hardware queue. + ExtQueue Extension = 24 + // ExtLinkLayerType returns the packet's hardware address type + // (e.g. Ethernet, Infiniband). + ExtLinkLayerType Extension = 28 + // ExtRXHash returns the packets receive hash. + // + // TODO: figure out what this rxhash actually is. + ExtRXHash Extension = 32 + // ExtCPUID returns the ID of the CPU processing the current + // packet. + ExtCPUID Extension = 36 + // ExtVLANTag returns the packet's VLAN tag. + ExtVLANTag Extension = 44 + // ExtVLANTagPresent returns non-zero if the packet has a VLAN + // tag. + // + // TODO: I think this might be a lie: it reads bit 0x1000 of the + // VLAN header, which changed meaning in recent revisions of the + // spec - this extension may now return meaningless information. + ExtVLANTagPresent Extension = 48 + // ExtVLANProto returns 0x8100 if the frame has a VLAN header, + // 0x88a8 if the frame has a "Q-in-Q" double VLAN header, or some + // other value if no VLAN information is present. + ExtVLANProto Extension = 60 + // ExtRand returns a uniformly random uint32. + ExtRand Extension = 56 +) + +// The following gives names to various bit patterns used in opcode construction. + +const ( + opMaskCls uint16 = 0x7 + // opClsLoad masks + opMaskLoadDest = 0x01 + opMaskLoadWidth = 0x18 + opMaskLoadMode = 0xe0 + // opClsALU + opMaskOperandSrc = 0x08 + opMaskOperator = 0xf0 + // opClsJump + opMaskJumpConst = 0x0f + opMaskJumpCond = 0xf0 +) + +const ( + // +---------------+-----------------+---+---+---+ + // | AddrMode (3b) | LoadWidth (2b) | 0 | 0 | 0 | + // +---------------+-----------------+---+---+---+ + opClsLoadA uint16 = iota + // +---------------+-----------------+---+---+---+ + // | AddrMode (3b) | LoadWidth (2b) | 0 | 0 | 1 | + // +---------------+-----------------+---+---+---+ + opClsLoadX + // +---+---+---+---+---+---+---+---+ + // | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | + // +---+---+---+---+---+---+---+---+ + opClsStoreA + // +---+---+---+---+---+---+---+---+ + // | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | + // +---+---+---+---+---+---+---+---+ + opClsStoreX + // +---------------+-----------------+---+---+---+ + // | Operator (4b) | OperandSrc (1b) | 1 | 0 | 0 | + // +---------------+-----------------+---+---+---+ + opClsALU + // +-----------------------------+---+---+---+---+ + // | TestOperator (4b) | 0 | 1 | 0 | 1 | + // +-----------------------------+---+---+---+---+ + opClsJump + // +---+-------------------------+---+---+---+---+ + // | 0 | 0 | 0 | RetSrc (1b) | 0 | 1 | 1 | 0 | + // +---+-------------------------+---+---+---+---+ + opClsReturn + // +---+-------------------------+---+---+---+---+ + // | 0 | 0 | 0 | TXAorTAX (1b) | 0 | 1 | 1 | 1 | + // +---+-------------------------+---+---+---+---+ + opClsMisc +) + +const ( + opAddrModeImmediate uint16 = iota << 5 + opAddrModeAbsolute + opAddrModeIndirect + opAddrModeScratch + opAddrModePacketLen // actually an extension, not an addressing mode. + opAddrModeMemShift +) + +const ( + opLoadWidth4 uint16 = iota << 3 + opLoadWidth2 + opLoadWidth1 +) + +// Operator defined by ALUOp* + +const ( + opALUSrcConstant uint16 = iota << 3 + opALUSrcX +) + +const ( + opJumpAlways = iota << 4 + opJumpEqual + opJumpGT + opJumpGE + opJumpSet +) + +const ( + opRetSrcConstant uint16 = iota << 4 + opRetSrcA +) + +const ( + opMiscTAX = 0x00 + opMiscTXA = 0x80 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/doc.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/doc.go new file mode 100644 index 0000000..ae62feb --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/doc.go @@ -0,0 +1,82 @@ +// 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 bpf implements marshaling and unmarshaling of programs for the +Berkeley Packet Filter virtual machine, and provides a Go implementation +of the virtual machine. + +BPF's main use is to specify a packet filter for network taps, so that +the kernel doesn't have to expensively copy every packet it sees to +userspace. However, it's been repurposed to other areas where running +user code in-kernel is needed. For example, Linux's seccomp uses BPF +to apply security policies to system calls. For simplicity, this +documentation refers only to packets, but other uses of BPF have their +own data payloads. + +BPF programs run in a restricted virtual machine. It has almost no +access to kernel functions, and while conditional branches are +allowed, they can only jump forwards, to guarantee that there are no +infinite loops. + +The virtual machine + +The BPF VM is an accumulator machine. Its main register, called +register A, is an implicit source and destination in all arithmetic +and logic operations. The machine also has 16 scratch registers for +temporary storage, and an indirection register (register X) for +indirect memory access. All registers are 32 bits wide. + +Each run of a BPF program is given one packet, which is placed in the +VM's read-only "main memory". LoadAbsolute and LoadIndirect +instructions can fetch up to 32 bits at a time into register A for +examination. + +The goal of a BPF program is to produce and return a verdict (uint32), +which tells the kernel what to do with the packet. In the context of +packet filtering, the returned value is the number of bytes of the +packet to forward to userspace, or 0 to ignore the packet. Other +contexts like seccomp define their own return values. + +In order to simplify programs, attempts to read past the end of the +packet terminate the program execution with a verdict of 0 (ignore +packet). This means that the vast majority of BPF programs don't need +to do any explicit bounds checking. + +In addition to the bytes of the packet, some BPF programs have access +to extensions, which are essentially calls to kernel utility +functions. Currently, the only extensions supported by this package +are the Linux packet filter extensions. + +Examples + +This packet filter selects all ARP packets. + + bpf.Assemble([]bpf.Instruction{ + // Load "EtherType" field from the ethernet header. + bpf.LoadAbsolute{Off: 12, Size: 2}, + // Skip over the next instruction if EtherType is not ARP. + bpf.JumpIf{Cond: bpf.JumpNotEqual, Val: 0x0806, SkipTrue: 1}, + // Verdict is "send up to 4k of the packet to userspace." + bpf.RetConstant{Val: 4096}, + // Verdict is "ignore packet." + bpf.RetConstant{Val: 0}, + }) + +This packet filter captures a random 1% sample of traffic. + + bpf.Assemble([]bpf.Instruction{ + // Get a 32-bit random number from the Linux kernel. + bpf.LoadExtension{Num: bpf.ExtRand}, + // 1% dice roll? + bpf.JumpIf{Cond: bpf.JumpLessThan, Val: 2^32/100, SkipFalse: 1}, + // Capture. + bpf.RetConstant{Val: 4096}, + // Ignore. + bpf.RetConstant{Val: 0}, + }) + +*/ +package bpf // import "golang.org/x/net/bpf" diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/instructions.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/instructions.go new file mode 100644 index 0000000..3b4fd08 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/instructions.go @@ -0,0 +1,704 @@ +// 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 bpf + +import "fmt" + +// An Instruction is one instruction executed by the BPF virtual +// machine. +type Instruction interface { + // Assemble assembles the Instruction into a RawInstruction. + Assemble() (RawInstruction, error) +} + +// A RawInstruction is a raw BPF virtual machine instruction. +type RawInstruction struct { + // Operation to execute. + Op uint16 + // For conditional jump instructions, the number of instructions + // to skip if the condition is true/false. + Jt uint8 + Jf uint8 + // Constant parameter. The meaning depends on the Op. + K uint32 +} + +// Assemble implements the Instruction Assemble method. +func (ri RawInstruction) Assemble() (RawInstruction, error) { return ri, nil } + +// Disassemble parses ri into an Instruction and returns it. If ri is +// not recognized by this package, ri itself is returned. +func (ri RawInstruction) Disassemble() Instruction { + switch ri.Op & opMaskCls { + case opClsLoadA, opClsLoadX: + reg := Register(ri.Op & opMaskLoadDest) + sz := 0 + switch ri.Op & opMaskLoadWidth { + case opLoadWidth4: + sz = 4 + case opLoadWidth2: + sz = 2 + case opLoadWidth1: + sz = 1 + default: + return ri + } + switch ri.Op & opMaskLoadMode { + case opAddrModeImmediate: + if sz != 4 { + return ri + } + return LoadConstant{Dst: reg, Val: ri.K} + case opAddrModeScratch: + if sz != 4 || ri.K > 15 { + return ri + } + return LoadScratch{Dst: reg, N: int(ri.K)} + case opAddrModeAbsolute: + if ri.K > extOffset+0xffffffff { + return LoadExtension{Num: Extension(-extOffset + ri.K)} + } + return LoadAbsolute{Size: sz, Off: ri.K} + case opAddrModeIndirect: + return LoadIndirect{Size: sz, Off: ri.K} + case opAddrModePacketLen: + if sz != 4 { + return ri + } + return LoadExtension{Num: ExtLen} + case opAddrModeMemShift: + return LoadMemShift{Off: ri.K} + default: + return ri + } + + case opClsStoreA: + if ri.Op != opClsStoreA || ri.K > 15 { + return ri + } + return StoreScratch{Src: RegA, N: int(ri.K)} + + case opClsStoreX: + if ri.Op != opClsStoreX || ri.K > 15 { + return ri + } + return StoreScratch{Src: RegX, N: int(ri.K)} + + case opClsALU: + switch op := ALUOp(ri.Op & opMaskOperator); op { + case ALUOpAdd, ALUOpSub, ALUOpMul, ALUOpDiv, ALUOpOr, ALUOpAnd, ALUOpShiftLeft, ALUOpShiftRight, ALUOpMod, ALUOpXor: + if ri.Op&opMaskOperandSrc != 0 { + return ALUOpX{Op: op} + } + return ALUOpConstant{Op: op, Val: ri.K} + case aluOpNeg: + return NegateA{} + default: + return ri + } + + case opClsJump: + if ri.Op&opMaskJumpConst != opClsJump { + return ri + } + switch ri.Op & opMaskJumpCond { + case opJumpAlways: + return Jump{Skip: ri.K} + case opJumpEqual: + if ri.Jt == 0 { + return JumpIf{ + Cond: JumpNotEqual, + Val: ri.K, + SkipTrue: ri.Jf, + SkipFalse: 0, + } + } + return JumpIf{ + Cond: JumpEqual, + Val: ri.K, + SkipTrue: ri.Jt, + SkipFalse: ri.Jf, + } + case opJumpGT: + if ri.Jt == 0 { + return JumpIf{ + Cond: JumpLessOrEqual, + Val: ri.K, + SkipTrue: ri.Jf, + SkipFalse: 0, + } + } + return JumpIf{ + Cond: JumpGreaterThan, + Val: ri.K, + SkipTrue: ri.Jt, + SkipFalse: ri.Jf, + } + case opJumpGE: + if ri.Jt == 0 { + return JumpIf{ + Cond: JumpLessThan, + Val: ri.K, + SkipTrue: ri.Jf, + SkipFalse: 0, + } + } + return JumpIf{ + Cond: JumpGreaterOrEqual, + Val: ri.K, + SkipTrue: ri.Jt, + SkipFalse: ri.Jf, + } + case opJumpSet: + return JumpIf{ + Cond: JumpBitsSet, + Val: ri.K, + SkipTrue: ri.Jt, + SkipFalse: ri.Jf, + } + default: + return ri + } + + case opClsReturn: + switch ri.Op { + case opClsReturn | opRetSrcA: + return RetA{} + case opClsReturn | opRetSrcConstant: + return RetConstant{Val: ri.K} + default: + return ri + } + + case opClsMisc: + switch ri.Op { + case opClsMisc | opMiscTAX: + return TAX{} + case opClsMisc | opMiscTXA: + return TXA{} + default: + return ri + } + + default: + panic("unreachable") // switch is exhaustive on the bit pattern + } +} + +// LoadConstant loads Val into register Dst. +type LoadConstant struct { + Dst Register + Val uint32 +} + +// Assemble implements the Instruction Assemble method. +func (a LoadConstant) Assemble() (RawInstruction, error) { + return assembleLoad(a.Dst, 4, opAddrModeImmediate, a.Val) +} + +// String returns the the instruction in assembler notation. +func (a LoadConstant) String() string { + switch a.Dst { + case RegA: + return fmt.Sprintf("ld #%d", a.Val) + case RegX: + return fmt.Sprintf("ldx #%d", a.Val) + default: + return fmt.Sprintf("unknown instruction: %#v", a) + } +} + +// LoadScratch loads scratch[N] into register Dst. +type LoadScratch struct { + Dst Register + N int // 0-15 +} + +// Assemble implements the Instruction Assemble method. +func (a LoadScratch) Assemble() (RawInstruction, error) { + if a.N < 0 || a.N > 15 { + return RawInstruction{}, fmt.Errorf("invalid scratch slot %d", a.N) + } + return assembleLoad(a.Dst, 4, opAddrModeScratch, uint32(a.N)) +} + +// String returns the the instruction in assembler notation. +func (a LoadScratch) String() string { + switch a.Dst { + case RegA: + return fmt.Sprintf("ld M[%d]", a.N) + case RegX: + return fmt.Sprintf("ldx M[%d]", a.N) + default: + return fmt.Sprintf("unknown instruction: %#v", a) + } +} + +// LoadAbsolute loads packet[Off:Off+Size] as an integer value into +// register A. +type LoadAbsolute struct { + Off uint32 + Size int // 1, 2 or 4 +} + +// Assemble implements the Instruction Assemble method. +func (a LoadAbsolute) Assemble() (RawInstruction, error) { + return assembleLoad(RegA, a.Size, opAddrModeAbsolute, a.Off) +} + +// String returns the the instruction in assembler notation. +func (a LoadAbsolute) String() string { + switch a.Size { + case 1: // byte + return fmt.Sprintf("ldb [%d]", a.Off) + case 2: // half word + return fmt.Sprintf("ldh [%d]", a.Off) + case 4: // word + if a.Off > extOffset+0xffffffff { + return LoadExtension{Num: Extension(a.Off + 0x1000)}.String() + } + return fmt.Sprintf("ld [%d]", a.Off) + default: + return fmt.Sprintf("unknown instruction: %#v", a) + } +} + +// LoadIndirect loads packet[X+Off:X+Off+Size] as an integer value +// into register A. +type LoadIndirect struct { + Off uint32 + Size int // 1, 2 or 4 +} + +// Assemble implements the Instruction Assemble method. +func (a LoadIndirect) Assemble() (RawInstruction, error) { + return assembleLoad(RegA, a.Size, opAddrModeIndirect, a.Off) +} + +// String returns the the instruction in assembler notation. +func (a LoadIndirect) String() string { + switch a.Size { + case 1: // byte + return fmt.Sprintf("ldb [x + %d]", a.Off) + case 2: // half word + return fmt.Sprintf("ldh [x + %d]", a.Off) + case 4: // word + return fmt.Sprintf("ld [x + %d]", a.Off) + default: + return fmt.Sprintf("unknown instruction: %#v", a) + } +} + +// LoadMemShift multiplies the first 4 bits of the byte at packet[Off] +// by 4 and stores the result in register X. +// +// This instruction is mainly useful to load into X the length of an +// IPv4 packet header in a single instruction, rather than have to do +// the arithmetic on the header's first byte by hand. +type LoadMemShift struct { + Off uint32 +} + +// Assemble implements the Instruction Assemble method. +func (a LoadMemShift) Assemble() (RawInstruction, error) { + return assembleLoad(RegX, 1, opAddrModeMemShift, a.Off) +} + +// String returns the the instruction in assembler notation. +func (a LoadMemShift) String() string { + return fmt.Sprintf("ldx 4*([%d]&0xf)", a.Off) +} + +// LoadExtension invokes a linux-specific extension and stores the +// result in register A. +type LoadExtension struct { + Num Extension +} + +// Assemble implements the Instruction Assemble method. +func (a LoadExtension) Assemble() (RawInstruction, error) { + if a.Num == ExtLen { + return assembleLoad(RegA, 4, opAddrModePacketLen, 0) + } + return assembleLoad(RegA, 4, opAddrModeAbsolute, uint32(extOffset+a.Num)) +} + +// String returns the the instruction in assembler notation. +func (a LoadExtension) String() string { + switch a.Num { + case ExtLen: + return "ld #len" + case ExtProto: + return "ld #proto" + case ExtType: + return "ld #type" + case ExtPayloadOffset: + return "ld #poff" + case ExtInterfaceIndex: + return "ld #ifidx" + case ExtNetlinkAttr: + return "ld #nla" + case ExtNetlinkAttrNested: + return "ld #nlan" + case ExtMark: + return "ld #mark" + case ExtQueue: + return "ld #queue" + case ExtLinkLayerType: + return "ld #hatype" + case ExtRXHash: + return "ld #rxhash" + case ExtCPUID: + return "ld #cpu" + case ExtVLANTag: + return "ld #vlan_tci" + case ExtVLANTagPresent: + return "ld #vlan_avail" + case ExtVLANProto: + return "ld #vlan_tpid" + case ExtRand: + return "ld #rand" + default: + return fmt.Sprintf("unknown instruction: %#v", a) + } +} + +// StoreScratch stores register Src into scratch[N]. +type StoreScratch struct { + Src Register + N int // 0-15 +} + +// Assemble implements the Instruction Assemble method. +func (a StoreScratch) Assemble() (RawInstruction, error) { + if a.N < 0 || a.N > 15 { + return RawInstruction{}, fmt.Errorf("invalid scratch slot %d", a.N) + } + var op uint16 + switch a.Src { + case RegA: + op = opClsStoreA + case RegX: + op = opClsStoreX + default: + return RawInstruction{}, fmt.Errorf("invalid source register %v", a.Src) + } + + return RawInstruction{ + Op: op, + K: uint32(a.N), + }, nil +} + +// String returns the the instruction in assembler notation. +func (a StoreScratch) String() string { + switch a.Src { + case RegA: + return fmt.Sprintf("st M[%d]", a.N) + case RegX: + return fmt.Sprintf("stx M[%d]", a.N) + default: + return fmt.Sprintf("unknown instruction: %#v", a) + } +} + +// ALUOpConstant executes A = A Val. +type ALUOpConstant struct { + Op ALUOp + Val uint32 +} + +// Assemble implements the Instruction Assemble method. +func (a ALUOpConstant) Assemble() (RawInstruction, error) { + return RawInstruction{ + Op: opClsALU | opALUSrcConstant | uint16(a.Op), + K: a.Val, + }, nil +} + +// String returns the the instruction in assembler notation. +func (a ALUOpConstant) String() string { + switch a.Op { + case ALUOpAdd: + return fmt.Sprintf("add #%d", a.Val) + case ALUOpSub: + return fmt.Sprintf("sub #%d", a.Val) + case ALUOpMul: + return fmt.Sprintf("mul #%d", a.Val) + case ALUOpDiv: + return fmt.Sprintf("div #%d", a.Val) + case ALUOpMod: + return fmt.Sprintf("mod #%d", a.Val) + case ALUOpAnd: + return fmt.Sprintf("and #%d", a.Val) + case ALUOpOr: + return fmt.Sprintf("or #%d", a.Val) + case ALUOpXor: + return fmt.Sprintf("xor #%d", a.Val) + case ALUOpShiftLeft: + return fmt.Sprintf("lsh #%d", a.Val) + case ALUOpShiftRight: + return fmt.Sprintf("rsh #%d", a.Val) + default: + return fmt.Sprintf("unknown instruction: %#v", a) + } +} + +// ALUOpX executes A = A X +type ALUOpX struct { + Op ALUOp +} + +// Assemble implements the Instruction Assemble method. +func (a ALUOpX) Assemble() (RawInstruction, error) { + return RawInstruction{ + Op: opClsALU | opALUSrcX | uint16(a.Op), + }, nil +} + +// String returns the the instruction in assembler notation. +func (a ALUOpX) String() string { + switch a.Op { + case ALUOpAdd: + return "add x" + case ALUOpSub: + return "sub x" + case ALUOpMul: + return "mul x" + case ALUOpDiv: + return "div x" + case ALUOpMod: + return "mod x" + case ALUOpAnd: + return "and x" + case ALUOpOr: + return "or x" + case ALUOpXor: + return "xor x" + case ALUOpShiftLeft: + return "lsh x" + case ALUOpShiftRight: + return "rsh x" + default: + return fmt.Sprintf("unknown instruction: %#v", a) + } +} + +// NegateA executes A = -A. +type NegateA struct{} + +// Assemble implements the Instruction Assemble method. +func (a NegateA) Assemble() (RawInstruction, error) { + return RawInstruction{ + Op: opClsALU | uint16(aluOpNeg), + }, nil +} + +// String returns the the instruction in assembler notation. +func (a NegateA) String() string { + return fmt.Sprintf("neg") +} + +// Jump skips the following Skip instructions in the program. +type Jump struct { + Skip uint32 +} + +// Assemble implements the Instruction Assemble method. +func (a Jump) Assemble() (RawInstruction, error) { + return RawInstruction{ + Op: opClsJump | opJumpAlways, + K: a.Skip, + }, nil +} + +// String returns the the instruction in assembler notation. +func (a Jump) String() string { + return fmt.Sprintf("ja %d", a.Skip) +} + +// JumpIf skips the following Skip instructions in the program if A +// Val is true. +type JumpIf struct { + Cond JumpTest + Val uint32 + SkipTrue uint8 + SkipFalse uint8 +} + +// Assemble implements the Instruction Assemble method. +func (a JumpIf) Assemble() (RawInstruction, error) { + var ( + cond uint16 + flip bool + ) + switch a.Cond { + case JumpEqual: + cond = opJumpEqual + case JumpNotEqual: + cond, flip = opJumpEqual, true + case JumpGreaterThan: + cond = opJumpGT + case JumpLessThan: + cond, flip = opJumpGE, true + case JumpGreaterOrEqual: + cond = opJumpGE + case JumpLessOrEqual: + cond, flip = opJumpGT, true + case JumpBitsSet: + cond = opJumpSet + case JumpBitsNotSet: + cond, flip = opJumpSet, true + default: + return RawInstruction{}, fmt.Errorf("unknown JumpTest %v", a.Cond) + } + jt, jf := a.SkipTrue, a.SkipFalse + if flip { + jt, jf = jf, jt + } + return RawInstruction{ + Op: opClsJump | cond, + Jt: jt, + Jf: jf, + K: a.Val, + }, nil +} + +// String returns the the instruction in assembler notation. +func (a JumpIf) String() string { + switch a.Cond { + // K == A + case JumpEqual: + return conditionalJump(a, "jeq", "jneq") + // K != A + case JumpNotEqual: + return fmt.Sprintf("jneq #%d,%d", a.Val, a.SkipTrue) + // K > A + case JumpGreaterThan: + return conditionalJump(a, "jgt", "jle") + // K < A + case JumpLessThan: + return fmt.Sprintf("jlt #%d,%d", a.Val, a.SkipTrue) + // K >= A + case JumpGreaterOrEqual: + return conditionalJump(a, "jge", "jlt") + // K <= A + case JumpLessOrEqual: + return fmt.Sprintf("jle #%d,%d", a.Val, a.SkipTrue) + // K & A != 0 + case JumpBitsSet: + if a.SkipFalse > 0 { + return fmt.Sprintf("jset #%d,%d,%d", a.Val, a.SkipTrue, a.SkipFalse) + } + return fmt.Sprintf("jset #%d,%d", a.Val, a.SkipTrue) + // K & A == 0, there is no assembler instruction for JumpBitNotSet, use JumpBitSet and invert skips + case JumpBitsNotSet: + return JumpIf{Cond: JumpBitsSet, SkipTrue: a.SkipFalse, SkipFalse: a.SkipTrue, Val: a.Val}.String() + default: + return fmt.Sprintf("unknown instruction: %#v", a) + } +} + +func conditionalJump(inst JumpIf, positiveJump, negativeJump string) string { + if inst.SkipTrue > 0 { + if inst.SkipFalse > 0 { + return fmt.Sprintf("%s #%d,%d,%d", positiveJump, inst.Val, inst.SkipTrue, inst.SkipFalse) + } + return fmt.Sprintf("%s #%d,%d", positiveJump, inst.Val, inst.SkipTrue) + } + return fmt.Sprintf("%s #%d,%d", negativeJump, inst.Val, inst.SkipFalse) +} + +// RetA exits the BPF program, returning the value of register A. +type RetA struct{} + +// Assemble implements the Instruction Assemble method. +func (a RetA) Assemble() (RawInstruction, error) { + return RawInstruction{ + Op: opClsReturn | opRetSrcA, + }, nil +} + +// String returns the the instruction in assembler notation. +func (a RetA) String() string { + return fmt.Sprintf("ret a") +} + +// RetConstant exits the BPF program, returning a constant value. +type RetConstant struct { + Val uint32 +} + +// Assemble implements the Instruction Assemble method. +func (a RetConstant) Assemble() (RawInstruction, error) { + return RawInstruction{ + Op: opClsReturn | opRetSrcConstant, + K: a.Val, + }, nil +} + +// String returns the the instruction in assembler notation. +func (a RetConstant) String() string { + return fmt.Sprintf("ret #%d", a.Val) +} + +// TXA copies the value of register X to register A. +type TXA struct{} + +// Assemble implements the Instruction Assemble method. +func (a TXA) Assemble() (RawInstruction, error) { + return RawInstruction{ + Op: opClsMisc | opMiscTXA, + }, nil +} + +// String returns the the instruction in assembler notation. +func (a TXA) String() string { + return fmt.Sprintf("txa") +} + +// TAX copies the value of register A to register X. +type TAX struct{} + +// Assemble implements the Instruction Assemble method. +func (a TAX) Assemble() (RawInstruction, error) { + return RawInstruction{ + Op: opClsMisc | opMiscTAX, + }, nil +} + +// String returns the the instruction in assembler notation. +func (a TAX) String() string { + return fmt.Sprintf("tax") +} + +func assembleLoad(dst Register, loadSize int, mode uint16, k uint32) (RawInstruction, error) { + var ( + cls uint16 + sz uint16 + ) + switch dst { + case RegA: + cls = opClsLoadA + case RegX: + cls = opClsLoadX + default: + return RawInstruction{}, fmt.Errorf("invalid target register %v", dst) + } + switch loadSize { + case 1: + sz = opLoadWidth1 + case 2: + sz = opLoadWidth2 + case 4: + sz = opLoadWidth4 + default: + return RawInstruction{}, fmt.Errorf("invalid load byte length %d", sz) + } + return RawInstruction{ + Op: cls | sz | mode, + K: k, + }, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/instructions_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/instructions_test.go new file mode 100644 index 0000000..dde474a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/instructions_test.go @@ -0,0 +1,525 @@ +// 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 bpf + +import ( + "fmt" + "io/ioutil" + "reflect" + "strconv" + "strings" + "testing" +) + +// This is a direct translation of the program in +// testdata/all_instructions.txt. +var allInstructions = []Instruction{ + LoadConstant{Dst: RegA, Val: 42}, + LoadConstant{Dst: RegX, Val: 42}, + + LoadScratch{Dst: RegA, N: 3}, + LoadScratch{Dst: RegX, N: 3}, + + LoadAbsolute{Off: 42, Size: 1}, + LoadAbsolute{Off: 42, Size: 2}, + LoadAbsolute{Off: 42, Size: 4}, + + LoadIndirect{Off: 42, Size: 1}, + LoadIndirect{Off: 42, Size: 2}, + LoadIndirect{Off: 42, Size: 4}, + + LoadMemShift{Off: 42}, + + LoadExtension{Num: ExtLen}, + LoadExtension{Num: ExtProto}, + LoadExtension{Num: ExtType}, + LoadExtension{Num: ExtRand}, + + StoreScratch{Src: RegA, N: 3}, + StoreScratch{Src: RegX, N: 3}, + + ALUOpConstant{Op: ALUOpAdd, Val: 42}, + ALUOpConstant{Op: ALUOpSub, Val: 42}, + ALUOpConstant{Op: ALUOpMul, Val: 42}, + ALUOpConstant{Op: ALUOpDiv, Val: 42}, + ALUOpConstant{Op: ALUOpOr, Val: 42}, + ALUOpConstant{Op: ALUOpAnd, Val: 42}, + ALUOpConstant{Op: ALUOpShiftLeft, Val: 42}, + ALUOpConstant{Op: ALUOpShiftRight, Val: 42}, + ALUOpConstant{Op: ALUOpMod, Val: 42}, + ALUOpConstant{Op: ALUOpXor, Val: 42}, + + ALUOpX{Op: ALUOpAdd}, + ALUOpX{Op: ALUOpSub}, + ALUOpX{Op: ALUOpMul}, + ALUOpX{Op: ALUOpDiv}, + ALUOpX{Op: ALUOpOr}, + ALUOpX{Op: ALUOpAnd}, + ALUOpX{Op: ALUOpShiftLeft}, + ALUOpX{Op: ALUOpShiftRight}, + ALUOpX{Op: ALUOpMod}, + ALUOpX{Op: ALUOpXor}, + + NegateA{}, + + Jump{Skip: 10}, + JumpIf{Cond: JumpEqual, Val: 42, SkipTrue: 8, SkipFalse: 9}, + JumpIf{Cond: JumpNotEqual, Val: 42, SkipTrue: 8}, + JumpIf{Cond: JumpLessThan, Val: 42, SkipTrue: 7}, + JumpIf{Cond: JumpLessOrEqual, Val: 42, SkipTrue: 6}, + JumpIf{Cond: JumpGreaterThan, Val: 42, SkipTrue: 4, SkipFalse: 5}, + JumpIf{Cond: JumpGreaterOrEqual, Val: 42, SkipTrue: 3, SkipFalse: 4}, + JumpIf{Cond: JumpBitsSet, Val: 42, SkipTrue: 2, SkipFalse: 3}, + + TAX{}, + TXA{}, + + RetA{}, + RetConstant{Val: 42}, +} +var allInstructionsExpected = "testdata/all_instructions.bpf" + +// Check that we produce the same output as the canonical bpf_asm +// linux kernel tool. +func TestInterop(t *testing.T) { + out, err := Assemble(allInstructions) + if err != nil { + t.Fatalf("assembly of allInstructions program failed: %s", err) + } + t.Logf("Assembled program is %d instructions long", len(out)) + + bs, err := ioutil.ReadFile(allInstructionsExpected) + if err != nil { + t.Fatalf("reading %s: %s", allInstructionsExpected, err) + } + // First statement is the number of statements, last statement is + // empty. We just ignore both and rely on slice length. + stmts := strings.Split(string(bs), ",") + if len(stmts)-2 != len(out) { + t.Fatalf("test program lengths don't match: %s has %d, Go implementation has %d", allInstructionsExpected, len(stmts)-2, len(allInstructions)) + } + + for i, stmt := range stmts[1 : len(stmts)-2] { + nums := strings.Split(stmt, " ") + if len(nums) != 4 { + t.Fatalf("malformed instruction %d in %s: %s", i+1, allInstructionsExpected, stmt) + } + + actual := out[i] + + op, err := strconv.ParseUint(nums[0], 10, 16) + if err != nil { + t.Fatalf("malformed opcode %s in instruction %d of %s", nums[0], i+1, allInstructionsExpected) + } + if actual.Op != uint16(op) { + t.Errorf("opcode mismatch on instruction %d (%#v): got 0x%02x, want 0x%02x", i+1, allInstructions[i], actual.Op, op) + } + + jt, err := strconv.ParseUint(nums[1], 10, 8) + if err != nil { + t.Fatalf("malformed jt offset %s in instruction %d of %s", nums[1], i+1, allInstructionsExpected) + } + if actual.Jt != uint8(jt) { + t.Errorf("jt mismatch on instruction %d (%#v): got %d, want %d", i+1, allInstructions[i], actual.Jt, jt) + } + + jf, err := strconv.ParseUint(nums[2], 10, 8) + if err != nil { + t.Fatalf("malformed jf offset %s in instruction %d of %s", nums[2], i+1, allInstructionsExpected) + } + if actual.Jf != uint8(jf) { + t.Errorf("jf mismatch on instruction %d (%#v): got %d, want %d", i+1, allInstructions[i], actual.Jf, jf) + } + + k, err := strconv.ParseUint(nums[3], 10, 32) + if err != nil { + t.Fatalf("malformed constant %s in instruction %d of %s", nums[3], i+1, allInstructionsExpected) + } + if actual.K != uint32(k) { + t.Errorf("constant mismatch on instruction %d (%#v): got %d, want %d", i+1, allInstructions[i], actual.K, k) + } + } +} + +// Check that assembly and disassembly match each other. +func TestAsmDisasm(t *testing.T) { + prog1, err := Assemble(allInstructions) + if err != nil { + t.Fatalf("assembly of allInstructions program failed: %s", err) + } + t.Logf("Assembled program is %d instructions long", len(prog1)) + + got, allDecoded := Disassemble(prog1) + if !allDecoded { + t.Errorf("Disassemble(Assemble(allInstructions)) produced unrecognized instructions:") + for i, inst := range got { + if r, ok := inst.(RawInstruction); ok { + t.Logf(" insn %d, %#v --> %#v", i+1, allInstructions[i], r) + } + } + } + + if len(allInstructions) != len(got) { + t.Fatalf("disassembly changed program size: %d insns before, %d insns after", len(allInstructions), len(got)) + } + if !reflect.DeepEqual(allInstructions, got) { + t.Errorf("program mutated by disassembly:") + for i := range got { + if !reflect.DeepEqual(allInstructions[i], got[i]) { + t.Logf(" insn %d, s: %#v, p1: %#v, got: %#v", i+1, allInstructions[i], prog1[i], got[i]) + } + } + } +} + +type InvalidInstruction struct{} + +func (a InvalidInstruction) Assemble() (RawInstruction, error) { + return RawInstruction{}, fmt.Errorf("Invalid Instruction") +} + +func (a InvalidInstruction) String() string { + return fmt.Sprintf("unknown instruction: %#v", a) +} + +func TestString(t *testing.T) { + testCases := []struct { + instruction Instruction + assembler string + }{ + { + instruction: LoadConstant{Dst: RegA, Val: 42}, + assembler: "ld #42", + }, + { + instruction: LoadConstant{Dst: RegX, Val: 42}, + assembler: "ldx #42", + }, + { + instruction: LoadConstant{Dst: 0xffff, Val: 42}, + assembler: "unknown instruction: bpf.LoadConstant{Dst:0xffff, Val:0x2a}", + }, + { + instruction: LoadScratch{Dst: RegA, N: 3}, + assembler: "ld M[3]", + }, + { + instruction: LoadScratch{Dst: RegX, N: 3}, + assembler: "ldx M[3]", + }, + { + instruction: LoadScratch{Dst: 0xffff, N: 3}, + assembler: "unknown instruction: bpf.LoadScratch{Dst:0xffff, N:3}", + }, + { + instruction: LoadAbsolute{Off: 42, Size: 1}, + assembler: "ldb [42]", + }, + { + instruction: LoadAbsolute{Off: 42, Size: 2}, + assembler: "ldh [42]", + }, + { + instruction: LoadAbsolute{Off: 42, Size: 4}, + assembler: "ld [42]", + }, + { + instruction: LoadAbsolute{Off: 42, Size: -1}, + assembler: "unknown instruction: bpf.LoadAbsolute{Off:0x2a, Size:-1}", + }, + { + instruction: LoadIndirect{Off: 42, Size: 1}, + assembler: "ldb [x + 42]", + }, + { + instruction: LoadIndirect{Off: 42, Size: 2}, + assembler: "ldh [x + 42]", + }, + { + instruction: LoadIndirect{Off: 42, Size: 4}, + assembler: "ld [x + 42]", + }, + { + instruction: LoadIndirect{Off: 42, Size: -1}, + assembler: "unknown instruction: bpf.LoadIndirect{Off:0x2a, Size:-1}", + }, + { + instruction: LoadMemShift{Off: 42}, + assembler: "ldx 4*([42]&0xf)", + }, + { + instruction: LoadExtension{Num: ExtLen}, + assembler: "ld #len", + }, + { + instruction: LoadExtension{Num: ExtProto}, + assembler: "ld #proto", + }, + { + instruction: LoadExtension{Num: ExtType}, + assembler: "ld #type", + }, + { + instruction: LoadExtension{Num: ExtPayloadOffset}, + assembler: "ld #poff", + }, + { + instruction: LoadExtension{Num: ExtInterfaceIndex}, + assembler: "ld #ifidx", + }, + { + instruction: LoadExtension{Num: ExtNetlinkAttr}, + assembler: "ld #nla", + }, + { + instruction: LoadExtension{Num: ExtNetlinkAttrNested}, + assembler: "ld #nlan", + }, + { + instruction: LoadExtension{Num: ExtMark}, + assembler: "ld #mark", + }, + { + instruction: LoadExtension{Num: ExtQueue}, + assembler: "ld #queue", + }, + { + instruction: LoadExtension{Num: ExtLinkLayerType}, + assembler: "ld #hatype", + }, + { + instruction: LoadExtension{Num: ExtRXHash}, + assembler: "ld #rxhash", + }, + { + instruction: LoadExtension{Num: ExtCPUID}, + assembler: "ld #cpu", + }, + { + instruction: LoadExtension{Num: ExtVLANTag}, + assembler: "ld #vlan_tci", + }, + { + instruction: LoadExtension{Num: ExtVLANTagPresent}, + assembler: "ld #vlan_avail", + }, + { + instruction: LoadExtension{Num: ExtVLANProto}, + assembler: "ld #vlan_tpid", + }, + { + instruction: LoadExtension{Num: ExtRand}, + assembler: "ld #rand", + }, + { + instruction: LoadAbsolute{Off: 0xfffff038, Size: 4}, + assembler: "ld #rand", + }, + { + instruction: LoadExtension{Num: 0xfff}, + assembler: "unknown instruction: bpf.LoadExtension{Num:4095}", + }, + { + instruction: StoreScratch{Src: RegA, N: 3}, + assembler: "st M[3]", + }, + { + instruction: StoreScratch{Src: RegX, N: 3}, + assembler: "stx M[3]", + }, + { + instruction: StoreScratch{Src: 0xffff, N: 3}, + assembler: "unknown instruction: bpf.StoreScratch{Src:0xffff, N:3}", + }, + { + instruction: ALUOpConstant{Op: ALUOpAdd, Val: 42}, + assembler: "add #42", + }, + { + instruction: ALUOpConstant{Op: ALUOpSub, Val: 42}, + assembler: "sub #42", + }, + { + instruction: ALUOpConstant{Op: ALUOpMul, Val: 42}, + assembler: "mul #42", + }, + { + instruction: ALUOpConstant{Op: ALUOpDiv, Val: 42}, + assembler: "div #42", + }, + { + instruction: ALUOpConstant{Op: ALUOpOr, Val: 42}, + assembler: "or #42", + }, + { + instruction: ALUOpConstant{Op: ALUOpAnd, Val: 42}, + assembler: "and #42", + }, + { + instruction: ALUOpConstant{Op: ALUOpShiftLeft, Val: 42}, + assembler: "lsh #42", + }, + { + instruction: ALUOpConstant{Op: ALUOpShiftRight, Val: 42}, + assembler: "rsh #42", + }, + { + instruction: ALUOpConstant{Op: ALUOpMod, Val: 42}, + assembler: "mod #42", + }, + { + instruction: ALUOpConstant{Op: ALUOpXor, Val: 42}, + assembler: "xor #42", + }, + { + instruction: ALUOpConstant{Op: 0xffff, Val: 42}, + assembler: "unknown instruction: bpf.ALUOpConstant{Op:0xffff, Val:0x2a}", + }, + { + instruction: ALUOpX{Op: ALUOpAdd}, + assembler: "add x", + }, + { + instruction: ALUOpX{Op: ALUOpSub}, + assembler: "sub x", + }, + { + instruction: ALUOpX{Op: ALUOpMul}, + assembler: "mul x", + }, + { + instruction: ALUOpX{Op: ALUOpDiv}, + assembler: "div x", + }, + { + instruction: ALUOpX{Op: ALUOpOr}, + assembler: "or x", + }, + { + instruction: ALUOpX{Op: ALUOpAnd}, + assembler: "and x", + }, + { + instruction: ALUOpX{Op: ALUOpShiftLeft}, + assembler: "lsh x", + }, + { + instruction: ALUOpX{Op: ALUOpShiftRight}, + assembler: "rsh x", + }, + { + instruction: ALUOpX{Op: ALUOpMod}, + assembler: "mod x", + }, + { + instruction: ALUOpX{Op: ALUOpXor}, + assembler: "xor x", + }, + { + instruction: ALUOpX{Op: 0xffff}, + assembler: "unknown instruction: bpf.ALUOpX{Op:0xffff}", + }, + { + instruction: NegateA{}, + assembler: "neg", + }, + { + instruction: Jump{Skip: 10}, + assembler: "ja 10", + }, + { + instruction: JumpIf{Cond: JumpEqual, Val: 42, SkipTrue: 8, SkipFalse: 9}, + assembler: "jeq #42,8,9", + }, + { + instruction: JumpIf{Cond: JumpEqual, Val: 42, SkipTrue: 8}, + assembler: "jeq #42,8", + }, + { + instruction: JumpIf{Cond: JumpEqual, Val: 42, SkipFalse: 8}, + assembler: "jneq #42,8", + }, + { + instruction: JumpIf{Cond: JumpNotEqual, Val: 42, SkipTrue: 8}, + assembler: "jneq #42,8", + }, + { + instruction: JumpIf{Cond: JumpLessThan, Val: 42, SkipTrue: 7}, + assembler: "jlt #42,7", + }, + { + instruction: JumpIf{Cond: JumpLessOrEqual, Val: 42, SkipTrue: 6}, + assembler: "jle #42,6", + }, + { + instruction: JumpIf{Cond: JumpGreaterThan, Val: 42, SkipTrue: 4, SkipFalse: 5}, + assembler: "jgt #42,4,5", + }, + { + instruction: JumpIf{Cond: JumpGreaterThan, Val: 42, SkipTrue: 4}, + assembler: "jgt #42,4", + }, + { + instruction: JumpIf{Cond: JumpGreaterOrEqual, Val: 42, SkipTrue: 3, SkipFalse: 4}, + assembler: "jge #42,3,4", + }, + { + instruction: JumpIf{Cond: JumpGreaterOrEqual, Val: 42, SkipTrue: 3}, + assembler: "jge #42,3", + }, + { + instruction: JumpIf{Cond: JumpBitsSet, Val: 42, SkipTrue: 2, SkipFalse: 3}, + assembler: "jset #42,2,3", + }, + { + instruction: JumpIf{Cond: JumpBitsSet, Val: 42, SkipTrue: 2}, + assembler: "jset #42,2", + }, + { + instruction: JumpIf{Cond: JumpBitsNotSet, Val: 42, SkipTrue: 2, SkipFalse: 3}, + assembler: "jset #42,3,2", + }, + { + instruction: JumpIf{Cond: JumpBitsNotSet, Val: 42, SkipTrue: 2}, + assembler: "jset #42,0,2", + }, + { + instruction: JumpIf{Cond: 0xffff, Val: 42, SkipTrue: 1, SkipFalse: 2}, + assembler: "unknown instruction: bpf.JumpIf{Cond:0xffff, Val:0x2a, SkipTrue:0x1, SkipFalse:0x2}", + }, + { + instruction: TAX{}, + assembler: "tax", + }, + { + instruction: TXA{}, + assembler: "txa", + }, + { + instruction: RetA{}, + assembler: "ret a", + }, + { + instruction: RetConstant{Val: 42}, + assembler: "ret #42", + }, + // Invalid instruction + { + instruction: InvalidInstruction{}, + assembler: "unknown instruction: bpf.InvalidInstruction{}", + }, + } + + for _, testCase := range testCases { + if input, ok := testCase.instruction.(fmt.Stringer); ok { + got := input.String() + if got != testCase.assembler { + t.Errorf("String did not return expected assembler notation, expected: %s, got: %s", testCase.assembler, got) + } + } else { + t.Errorf("Instruction %#v is not a fmt.Stringer", testCase.instruction) + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/setter.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/setter.go new file mode 100644 index 0000000..43e35f0 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/setter.go @@ -0,0 +1,10 @@ +// 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 bpf + +// A Setter is a type which can attach a compiled BPF filter to itself. +type Setter interface { + SetBPF(filter []RawInstruction) error +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/testdata/all_instructions.bpf b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/testdata/all_instructions.bpf new file mode 100644 index 0000000..f871440 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/testdata/all_instructions.bpf @@ -0,0 +1 @@ +50,0 0 0 42,1 0 0 42,96 0 0 3,97 0 0 3,48 0 0 42,40 0 0 42,32 0 0 42,80 0 0 42,72 0 0 42,64 0 0 42,177 0 0 42,128 0 0 0,32 0 0 4294963200,32 0 0 4294963204,32 0 0 4294963256,2 0 0 3,3 0 0 3,4 0 0 42,20 0 0 42,36 0 0 42,52 0 0 42,68 0 0 42,84 0 0 42,100 0 0 42,116 0 0 42,148 0 0 42,164 0 0 42,12 0 0 0,28 0 0 0,44 0 0 0,60 0 0 0,76 0 0 0,92 0 0 0,108 0 0 0,124 0 0 0,156 0 0 0,172 0 0 0,132 0 0 0,5 0 0 10,21 8 9 42,21 0 8 42,53 0 7 42,37 0 6 42,37 4 5 42,53 3 4 42,69 2 3 42,7 0 0 0,135 0 0 0,22 0 0 0,6 0 0 0, diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/testdata/all_instructions.txt b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/testdata/all_instructions.txt new file mode 100644 index 0000000..3045501 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/testdata/all_instructions.txt @@ -0,0 +1,79 @@ +# This filter is compiled to all_instructions.bpf by the `bpf_asm` +# tool, which can be found in the linux kernel source tree under +# tools/net. + +# Load immediate +ld #42 +ldx #42 + +# Load scratch +ld M[3] +ldx M[3] + +# Load absolute +ldb [42] +ldh [42] +ld [42] + +# Load indirect +ldb [x + 42] +ldh [x + 42] +ld [x + 42] + +# Load IPv4 header length +ldx 4*([42]&0xf) + +# Run extension function +ld #len +ld #proto +ld #type +ld #rand + +# Store scratch +st M[3] +stx M[3] + +# A constant +add #42 +sub #42 +mul #42 +div #42 +or #42 +and #42 +lsh #42 +rsh #42 +mod #42 +xor #42 + +# A X +add x +sub x +mul x +div x +or x +and x +lsh x +rsh x +mod x +xor x + +# !A +neg + +# Jumps +ja end +jeq #42,prev,end +jne #42,end +jlt #42,end +jle #42,end +jgt #42,prev,end +jge #42,prev,end +jset #42,prev,end + +# Register transfers +tax +txa + +# Returns +prev: ret a +end: ret #42 diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm.go new file mode 100644 index 0000000..4c656f1 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm.go @@ -0,0 +1,140 @@ +// 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 bpf + +import ( + "errors" + "fmt" +) + +// A VM is an emulated BPF virtual machine. +type VM struct { + filter []Instruction +} + +// NewVM returns a new VM using the input BPF program. +func NewVM(filter []Instruction) (*VM, error) { + if len(filter) == 0 { + return nil, errors.New("one or more Instructions must be specified") + } + + for i, ins := range filter { + check := len(filter) - (i + 1) + switch ins := ins.(type) { + // Check for out-of-bounds jumps in instructions + case Jump: + if check <= int(ins.Skip) { + return nil, fmt.Errorf("cannot jump %d instructions; jumping past program bounds", ins.Skip) + } + case JumpIf: + if check <= int(ins.SkipTrue) { + return nil, fmt.Errorf("cannot jump %d instructions in true case; jumping past program bounds", ins.SkipTrue) + } + if check <= int(ins.SkipFalse) { + return nil, fmt.Errorf("cannot jump %d instructions in false case; jumping past program bounds", ins.SkipFalse) + } + // Check for division or modulus by zero + case ALUOpConstant: + if ins.Val != 0 { + break + } + + switch ins.Op { + case ALUOpDiv, ALUOpMod: + return nil, errors.New("cannot divide by zero using ALUOpConstant") + } + // Check for unknown extensions + case LoadExtension: + switch ins.Num { + case ExtLen: + default: + return nil, fmt.Errorf("extension %d not implemented", ins.Num) + } + } + } + + // Make sure last instruction is a return instruction + switch filter[len(filter)-1].(type) { + case RetA, RetConstant: + default: + return nil, errors.New("BPF program must end with RetA or RetConstant") + } + + // Though our VM works using disassembled instructions, we + // attempt to assemble the input filter anyway to ensure it is compatible + // with an operating system VM. + _, err := Assemble(filter) + + return &VM{ + filter: filter, + }, err +} + +// Run runs the VM's BPF program against the input bytes. +// Run returns the number of bytes accepted by the BPF program, and any errors +// which occurred while processing the program. +func (v *VM) Run(in []byte) (int, error) { + var ( + // Registers of the virtual machine + regA uint32 + regX uint32 + regScratch [16]uint32 + + // OK is true if the program should continue processing the next + // instruction, or false if not, causing the loop to break + ok = true + ) + + // TODO(mdlayher): implement: + // - NegateA: + // - would require a change from uint32 registers to int32 + // registers + + // TODO(mdlayher): add interop tests that check signedness of ALU + // operations against kernel implementation, and make sure Go + // implementation matches behavior + + for i := 0; i < len(v.filter) && ok; i++ { + ins := v.filter[i] + + switch ins := ins.(type) { + case ALUOpConstant: + regA = aluOpConstant(ins, regA) + case ALUOpX: + regA, ok = aluOpX(ins, regA, regX) + case Jump: + i += int(ins.Skip) + case JumpIf: + jump := jumpIf(ins, regA) + i += jump + case LoadAbsolute: + regA, ok = loadAbsolute(ins, in) + case LoadConstant: + regA, regX = loadConstant(ins, regA, regX) + case LoadExtension: + regA = loadExtension(ins, in) + case LoadIndirect: + regA, ok = loadIndirect(ins, in, regX) + case LoadMemShift: + regX, ok = loadMemShift(ins, in) + case LoadScratch: + regA, regX = loadScratch(ins, regScratch, regA, regX) + case RetA: + return int(regA), nil + case RetConstant: + return int(ins.Val), nil + case StoreScratch: + regScratch = storeScratch(ins, regScratch, regA, regX) + case TAX: + regX = regA + case TXA: + regA = regX + default: + return 0, fmt.Errorf("unknown Instruction at index %d: %T", i, ins) + } + } + + return 0, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm_aluop_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm_aluop_test.go new file mode 100644 index 0000000..1667824 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm_aluop_test.go @@ -0,0 +1,512 @@ +// 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 bpf_test + +import ( + "testing" + + "golang.org/x/net/bpf" +) + +func TestVMALUOpAdd(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 1, + }, + bpf.ALUOpConstant{ + Op: bpf.ALUOpAdd, + Val: 3, + }, + bpf.RetA{}, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 8, 2, 3, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 3, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMALUOpSub(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 1, + }, + bpf.TAX{}, + bpf.ALUOpX{ + Op: bpf.ALUOpSub, + }, + bpf.RetA{}, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 1, 2, 3, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 0, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMALUOpMul(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 1, + }, + bpf.ALUOpConstant{ + Op: bpf.ALUOpMul, + Val: 2, + }, + bpf.RetA{}, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 6, 2, 3, 4, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 4, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMALUOpDiv(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 1, + }, + bpf.ALUOpConstant{ + Op: bpf.ALUOpDiv, + Val: 2, + }, + bpf.RetA{}, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 20, 2, 3, 4, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 2, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMALUOpDivByZeroALUOpConstant(t *testing.T) { + _, _, err := testVM(t, []bpf.Instruction{ + bpf.ALUOpConstant{ + Op: bpf.ALUOpDiv, + Val: 0, + }, + bpf.RetA{}, + }) + if errStr(err) != "cannot divide by zero using ALUOpConstant" { + t.Fatalf("unexpected error: %v", err) + } +} + +func TestVMALUOpDivByZeroALUOpX(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + // Load byte 0 into X + bpf.LoadAbsolute{ + Off: 8, + Size: 1, + }, + bpf.TAX{}, + // Load byte 1 into A + bpf.LoadAbsolute{ + Off: 9, + Size: 1, + }, + // Attempt to perform 1/0 + bpf.ALUOpX{ + Op: bpf.ALUOpDiv, + }, + // Return 4 bytes if program does not terminate + bpf.LoadConstant{ + Val: 12, + }, + bpf.RetA{}, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0, 1, 3, 4, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 0, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMALUOpOr(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 2, + }, + bpf.ALUOpConstant{ + Op: bpf.ALUOpOr, + Val: 0x01, + }, + bpf.RetA{}, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0x00, 0x10, 0x03, 0x04, + 0x05, 0x06, 0x07, 0x08, + 0x09, 0xff, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 9, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMALUOpAnd(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 2, + }, + bpf.ALUOpConstant{ + Op: bpf.ALUOpAnd, + Val: 0x0019, + }, + bpf.RetA{}, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0xaa, 0x09, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 1, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMALUOpShiftLeft(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 1, + }, + bpf.ALUOpConstant{ + Op: bpf.ALUOpShiftLeft, + Val: 0x01, + }, + bpf.JumpIf{ + Cond: bpf.JumpEqual, + Val: 0x02, + SkipTrue: 1, + }, + bpf.RetConstant{ + Val: 0, + }, + bpf.RetConstant{ + Val: 9, + }, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0x01, 0xaa, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 1, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMALUOpShiftRight(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 1, + }, + bpf.ALUOpConstant{ + Op: bpf.ALUOpShiftRight, + Val: 0x01, + }, + bpf.JumpIf{ + Cond: bpf.JumpEqual, + Val: 0x04, + SkipTrue: 1, + }, + bpf.RetConstant{ + Val: 0, + }, + bpf.RetConstant{ + Val: 9, + }, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0x08, 0xff, 0xff, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 1, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMALUOpMod(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 1, + }, + bpf.ALUOpConstant{ + Op: bpf.ALUOpMod, + Val: 20, + }, + bpf.RetA{}, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 30, 0, 0, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 2, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMALUOpModByZeroALUOpConstant(t *testing.T) { + _, _, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 1, + }, + bpf.ALUOpConstant{ + Op: bpf.ALUOpMod, + Val: 0, + }, + bpf.RetA{}, + }) + if errStr(err) != "cannot divide by zero using ALUOpConstant" { + t.Fatalf("unexpected error: %v", err) + } +} + +func TestVMALUOpModByZeroALUOpX(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + // Load byte 0 into X + bpf.LoadAbsolute{ + Off: 8, + Size: 1, + }, + bpf.TAX{}, + // Load byte 1 into A + bpf.LoadAbsolute{ + Off: 9, + Size: 1, + }, + // Attempt to perform 1%0 + bpf.ALUOpX{ + Op: bpf.ALUOpMod, + }, + // Return 4 bytes if program does not terminate + bpf.LoadConstant{ + Val: 12, + }, + bpf.RetA{}, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0, 1, 3, 4, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 0, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMALUOpXor(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 1, + }, + bpf.ALUOpConstant{ + Op: bpf.ALUOpXor, + Val: 0x0a, + }, + bpf.JumpIf{ + Cond: bpf.JumpEqual, + Val: 0x01, + SkipTrue: 1, + }, + bpf.RetConstant{ + Val: 0, + }, + bpf.RetConstant{ + Val: 9, + }, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0x0b, 0x00, 0x00, 0x00, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 1, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMALUOpUnknown(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 1, + }, + bpf.ALUOpConstant{ + Op: bpf.ALUOpAdd, + Val: 1, + }, + // Verify that an unknown operation is a no-op + bpf.ALUOpConstant{ + Op: 100, + }, + bpf.JumpIf{ + Cond: bpf.JumpEqual, + Val: 0x02, + SkipTrue: 1, + }, + bpf.RetConstant{ + Val: 0, + }, + bpf.RetConstant{ + Val: 9, + }, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 1, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 1, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm_bpf_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm_bpf_test.go new file mode 100644 index 0000000..77fa8fe --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm_bpf_test.go @@ -0,0 +1,192 @@ +// 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 bpf_test + +import ( + "net" + "runtime" + "testing" + "time" + + "golang.org/x/net/bpf" + "golang.org/x/net/ipv4" +) + +// A virtualMachine is a BPF virtual machine which can process an +// input packet against a BPF program and render a verdict. +type virtualMachine interface { + Run(in []byte) (int, error) +} + +// canUseOSVM indicates if the OS BPF VM is available on this platform. +func canUseOSVM() bool { + // OS BPF VM can only be used on platforms where x/net/ipv4 supports + // attaching a BPF program to a socket. + switch runtime.GOOS { + case "linux": + return true + } + + return false +} + +// All BPF tests against both the Go VM and OS VM are assumed to +// be used with a UDP socket. As a result, the entire contents +// of a UDP datagram is sent through the BPF program, but only +// the body after the UDP header will ever be returned in output. + +// testVM sets up a Go BPF VM, and if available, a native OS BPF VM +// for integration testing. +func testVM(t *testing.T, filter []bpf.Instruction) (virtualMachine, func(), error) { + goVM, err := bpf.NewVM(filter) + if err != nil { + // Some tests expect an error, so this error must be returned + // instead of fatally exiting the test + return nil, nil, err + } + + mvm := &multiVirtualMachine{ + goVM: goVM, + + t: t, + } + + // If available, add the OS VM for tests which verify that both the Go + // VM and OS VM have exactly the same output for the same input program + // and packet. + done := func() {} + if canUseOSVM() { + osVM, osVMDone := testOSVM(t, filter) + done = func() { osVMDone() } + mvm.osVM = osVM + } + + return mvm, done, nil +} + +// udpHeaderLen is the length of a UDP header. +const udpHeaderLen = 8 + +// A multiVirtualMachine is a virtualMachine which can call out to both the Go VM +// and the native OS VM, if the OS VM is available. +type multiVirtualMachine struct { + goVM virtualMachine + osVM virtualMachine + + t *testing.T +} + +func (mvm *multiVirtualMachine) Run(in []byte) (int, error) { + if len(in) < udpHeaderLen { + mvm.t.Fatalf("input must be at least length of UDP header (%d), got: %d", + udpHeaderLen, len(in)) + } + + // All tests have a UDP header as part of input, because the OS VM + // packets always will. For the Go VM, this output is trimmed before + // being sent back to tests. + goOut, goErr := mvm.goVM.Run(in) + if goOut >= udpHeaderLen { + goOut -= udpHeaderLen + } + + // If Go output is larger than the size of the packet, packet filtering + // interop tests must trim the output bytes to the length of the packet. + // The BPF VM should not do this on its own, as other uses of it do + // not trim the output byte count. + trim := len(in) - udpHeaderLen + if goOut > trim { + goOut = trim + } + + // When the OS VM is not available, process using the Go VM alone + if mvm.osVM == nil { + return goOut, goErr + } + + // The OS VM will apply its own UDP header, so remove the pseudo header + // that the Go VM needs. + osOut, err := mvm.osVM.Run(in[udpHeaderLen:]) + if err != nil { + mvm.t.Fatalf("error while running OS VM: %v", err) + } + + // Verify both VMs return same number of bytes + var mismatch bool + if goOut != osOut { + mismatch = true + mvm.t.Logf("output byte count does not match:\n- go: %v\n- os: %v", goOut, osOut) + } + + if mismatch { + mvm.t.Fatal("Go BPF and OS BPF packet outputs do not match") + } + + return goOut, goErr +} + +// An osVirtualMachine is a virtualMachine which uses the OS's BPF VM for +// processing BPF programs. +type osVirtualMachine struct { + l net.PacketConn + s net.Conn +} + +// testOSVM creates a virtualMachine which uses the OS's BPF VM by injecting +// packets into a UDP listener with a BPF program attached to it. +func testOSVM(t *testing.T, filter []bpf.Instruction) (virtualMachine, func()) { + l, err := net.ListenPacket("udp4", "127.0.0.1:0") + if err != nil { + t.Fatalf("failed to open OS VM UDP listener: %v", err) + } + + prog, err := bpf.Assemble(filter) + if err != nil { + t.Fatalf("failed to compile BPF program: %v", err) + } + + p := ipv4.NewPacketConn(l) + if err = p.SetBPF(prog); err != nil { + t.Fatalf("failed to attach BPF program to listener: %v", err) + } + + s, err := net.Dial("udp4", l.LocalAddr().String()) + if err != nil { + t.Fatalf("failed to dial connection to listener: %v", err) + } + + done := func() { + _ = s.Close() + _ = l.Close() + } + + return &osVirtualMachine{ + l: l, + s: s, + }, done +} + +// Run sends the input bytes into the OS's BPF VM and returns its verdict. +func (vm *osVirtualMachine) Run(in []byte) (int, error) { + go func() { + _, _ = vm.s.Write(in) + }() + + vm.l.SetDeadline(time.Now().Add(50 * time.Millisecond)) + + var b [512]byte + n, _, err := vm.l.ReadFrom(b[:]) + if err != nil { + // A timeout indicates that BPF filtered out the packet, and thus, + // no input should be returned. + if nerr, ok := err.(net.Error); ok && nerr.Timeout() { + return n, nil + } + + return n, err + } + + return n, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm_extension_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm_extension_test.go new file mode 100644 index 0000000..7a48c82 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm_extension_test.go @@ -0,0 +1,49 @@ +// 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 bpf_test + +import ( + "testing" + + "golang.org/x/net/bpf" +) + +func TestVMLoadExtensionNotImplemented(t *testing.T) { + _, _, err := testVM(t, []bpf.Instruction{ + bpf.LoadExtension{ + Num: 100, + }, + bpf.RetA{}, + }) + if errStr(err) != "extension 100 not implemented" { + t.Fatalf("unexpected error: %v", err) + } +} + +func TestVMLoadExtensionExtLen(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadExtension{ + Num: bpf.ExtLen, + }, + bpf.RetA{}, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0, 1, 2, 3, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 4, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm_instructions.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm_instructions.go new file mode 100644 index 0000000..516f946 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm_instructions.go @@ -0,0 +1,174 @@ +// 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 bpf + +import ( + "encoding/binary" + "fmt" +) + +func aluOpConstant(ins ALUOpConstant, regA uint32) uint32 { + return aluOpCommon(ins.Op, regA, ins.Val) +} + +func aluOpX(ins ALUOpX, regA uint32, regX uint32) (uint32, bool) { + // Guard against division or modulus by zero by terminating + // the program, as the OS BPF VM does + if regX == 0 { + switch ins.Op { + case ALUOpDiv, ALUOpMod: + return 0, false + } + } + + return aluOpCommon(ins.Op, regA, regX), true +} + +func aluOpCommon(op ALUOp, regA uint32, value uint32) uint32 { + switch op { + case ALUOpAdd: + return regA + value + case ALUOpSub: + return regA - value + case ALUOpMul: + return regA * value + case ALUOpDiv: + // Division by zero not permitted by NewVM and aluOpX checks + return regA / value + case ALUOpOr: + return regA | value + case ALUOpAnd: + return regA & value + case ALUOpShiftLeft: + return regA << value + case ALUOpShiftRight: + return regA >> value + case ALUOpMod: + // Modulus by zero not permitted by NewVM and aluOpX checks + return regA % value + case ALUOpXor: + return regA ^ value + default: + return regA + } +} + +func jumpIf(ins JumpIf, value uint32) int { + var ok bool + inV := uint32(ins.Val) + + switch ins.Cond { + case JumpEqual: + ok = value == inV + case JumpNotEqual: + ok = value != inV + case JumpGreaterThan: + ok = value > inV + case JumpLessThan: + ok = value < inV + case JumpGreaterOrEqual: + ok = value >= inV + case JumpLessOrEqual: + ok = value <= inV + case JumpBitsSet: + ok = (value & inV) != 0 + case JumpBitsNotSet: + ok = (value & inV) == 0 + } + + if ok { + return int(ins.SkipTrue) + } + + return int(ins.SkipFalse) +} + +func loadAbsolute(ins LoadAbsolute, in []byte) (uint32, bool) { + offset := int(ins.Off) + size := int(ins.Size) + + return loadCommon(in, offset, size) +} + +func loadConstant(ins LoadConstant, regA uint32, regX uint32) (uint32, uint32) { + switch ins.Dst { + case RegA: + regA = ins.Val + case RegX: + regX = ins.Val + } + + return regA, regX +} + +func loadExtension(ins LoadExtension, in []byte) uint32 { + switch ins.Num { + case ExtLen: + return uint32(len(in)) + default: + panic(fmt.Sprintf("unimplemented extension: %d", ins.Num)) + } +} + +func loadIndirect(ins LoadIndirect, in []byte, regX uint32) (uint32, bool) { + offset := int(ins.Off) + int(regX) + size := int(ins.Size) + + return loadCommon(in, offset, size) +} + +func loadMemShift(ins LoadMemShift, in []byte) (uint32, bool) { + offset := int(ins.Off) + + if !inBounds(len(in), offset, 0) { + return 0, false + } + + // Mask off high 4 bits and multiply low 4 bits by 4 + return uint32(in[offset]&0x0f) * 4, true +} + +func inBounds(inLen int, offset int, size int) bool { + return offset+size <= inLen +} + +func loadCommon(in []byte, offset int, size int) (uint32, bool) { + if !inBounds(len(in), offset, size) { + return 0, false + } + + switch size { + case 1: + return uint32(in[offset]), true + case 2: + return uint32(binary.BigEndian.Uint16(in[offset : offset+size])), true + case 4: + return uint32(binary.BigEndian.Uint32(in[offset : offset+size])), true + default: + panic(fmt.Sprintf("invalid load size: %d", size)) + } +} + +func loadScratch(ins LoadScratch, regScratch [16]uint32, regA uint32, regX uint32) (uint32, uint32) { + switch ins.Dst { + case RegA: + regA = regScratch[ins.N] + case RegX: + regX = regScratch[ins.N] + } + + return regA, regX +} + +func storeScratch(ins StoreScratch, regScratch [16]uint32, regA uint32, regX uint32) [16]uint32 { + switch ins.Src { + case RegA: + regScratch[ins.N] = regA + case RegX: + regScratch[ins.N] = regX + } + + return regScratch +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm_jump_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm_jump_test.go new file mode 100644 index 0000000..e0a3a98 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm_jump_test.go @@ -0,0 +1,380 @@ +// 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 bpf_test + +import ( + "testing" + + "golang.org/x/net/bpf" +) + +func TestVMJumpOne(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 1, + }, + bpf.Jump{ + Skip: 1, + }, + bpf.RetConstant{ + Val: 0, + }, + bpf.RetConstant{ + Val: 9, + }, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 1, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 1, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMJumpOutOfProgram(t *testing.T) { + _, _, err := testVM(t, []bpf.Instruction{ + bpf.Jump{ + Skip: 1, + }, + bpf.RetA{}, + }) + if errStr(err) != "cannot jump 1 instructions; jumping past program bounds" { + t.Fatalf("unexpected error: %v", err) + } +} + +func TestVMJumpIfTrueOutOfProgram(t *testing.T) { + _, _, err := testVM(t, []bpf.Instruction{ + bpf.JumpIf{ + Cond: bpf.JumpEqual, + SkipTrue: 2, + }, + bpf.RetA{}, + }) + if errStr(err) != "cannot jump 2 instructions in true case; jumping past program bounds" { + t.Fatalf("unexpected error: %v", err) + } +} + +func TestVMJumpIfFalseOutOfProgram(t *testing.T) { + _, _, err := testVM(t, []bpf.Instruction{ + bpf.JumpIf{ + Cond: bpf.JumpEqual, + SkipFalse: 3, + }, + bpf.RetA{}, + }) + if errStr(err) != "cannot jump 3 instructions in false case; jumping past program bounds" { + t.Fatalf("unexpected error: %v", err) + } +} + +func TestVMJumpIfEqual(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 1, + }, + bpf.JumpIf{ + Cond: bpf.JumpEqual, + Val: 1, + SkipTrue: 1, + }, + bpf.RetConstant{ + Val: 0, + }, + bpf.RetConstant{ + Val: 9, + }, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 1, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 1, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMJumpIfNotEqual(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 1, + }, + bpf.JumpIf{ + Cond: bpf.JumpNotEqual, + Val: 1, + SkipFalse: 1, + }, + bpf.RetConstant{ + Val: 0, + }, + bpf.RetConstant{ + Val: 9, + }, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 1, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 1, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMJumpIfGreaterThan(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 4, + }, + bpf.JumpIf{ + Cond: bpf.JumpGreaterThan, + Val: 0x00010202, + SkipTrue: 1, + }, + bpf.RetConstant{ + Val: 0, + }, + bpf.RetConstant{ + Val: 12, + }, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0, 1, 2, 3, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 4, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMJumpIfLessThan(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 4, + }, + bpf.JumpIf{ + Cond: bpf.JumpLessThan, + Val: 0xff010203, + SkipTrue: 1, + }, + bpf.RetConstant{ + Val: 0, + }, + bpf.RetConstant{ + Val: 12, + }, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0, 1, 2, 3, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 4, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMJumpIfGreaterOrEqual(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 4, + }, + bpf.JumpIf{ + Cond: bpf.JumpGreaterOrEqual, + Val: 0x00010203, + SkipTrue: 1, + }, + bpf.RetConstant{ + Val: 0, + }, + bpf.RetConstant{ + Val: 12, + }, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0, 1, 2, 3, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 4, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMJumpIfLessOrEqual(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 4, + }, + bpf.JumpIf{ + Cond: bpf.JumpLessOrEqual, + Val: 0xff010203, + SkipTrue: 1, + }, + bpf.RetConstant{ + Val: 0, + }, + bpf.RetConstant{ + Val: 12, + }, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0, 1, 2, 3, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 4, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMJumpIfBitsSet(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 2, + }, + bpf.JumpIf{ + Cond: bpf.JumpBitsSet, + Val: 0x1122, + SkipTrue: 1, + }, + bpf.RetConstant{ + Val: 0, + }, + bpf.RetConstant{ + Val: 10, + }, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0x01, 0x02, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 2, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMJumpIfBitsNotSet(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 2, + }, + bpf.JumpIf{ + Cond: bpf.JumpBitsNotSet, + Val: 0x1221, + SkipTrue: 1, + }, + bpf.RetConstant{ + Val: 0, + }, + bpf.RetConstant{ + Val: 10, + }, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0x01, 0x02, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 2, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm_load_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm_load_test.go new file mode 100644 index 0000000..04578b6 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm_load_test.go @@ -0,0 +1,246 @@ +// 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 bpf_test + +import ( + "net" + "testing" + + "golang.org/x/net/bpf" + "golang.org/x/net/ipv4" +) + +func TestVMLoadAbsoluteOffsetOutOfBounds(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 100, + Size: 2, + }, + bpf.RetA{}, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0, 1, 2, 3, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 0, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMLoadAbsoluteOffsetPlusSizeOutOfBounds(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 2, + }, + bpf.RetA{}, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 0, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMLoadAbsoluteBadInstructionSize(t *testing.T) { + _, _, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Size: 5, + }, + bpf.RetA{}, + }) + if errStr(err) != "assembling instruction 1: invalid load byte length 0" { + t.Fatalf("unexpected error: %v", err) + } +} + +func TestVMLoadConstantOK(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadConstant{ + Dst: bpf.RegX, + Val: 9, + }, + bpf.TXA{}, + bpf.RetA{}, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 1, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMLoadIndirectOutOfBounds(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadIndirect{ + Off: 100, + Size: 1, + }, + bpf.RetA{}, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 0, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMLoadMemShiftOutOfBounds(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadMemShift{ + Off: 100, + }, + bpf.RetA{}, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 0, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +const ( + dhcp4Port = 53 +) + +func TestVMLoadMemShiftLoadIndirectNoResult(t *testing.T) { + vm, in, done := testDHCPv4(t) + defer done() + + // Append mostly empty UDP header with incorrect DHCPv4 port + in = append(in, []byte{ + 0, 0, + 0, dhcp4Port + 1, + 0, 0, + 0, 0, + }...) + + out, err := vm.Run(in) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 0, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMLoadMemShiftLoadIndirectOK(t *testing.T) { + vm, in, done := testDHCPv4(t) + defer done() + + // Append mostly empty UDP header with correct DHCPv4 port + in = append(in, []byte{ + 0, 0, + 0, dhcp4Port, + 0, 0, + 0, 0, + }...) + + out, err := vm.Run(in) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := len(in)-8, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func testDHCPv4(t *testing.T) (virtualMachine, []byte, func()) { + // DHCPv4 test data courtesy of David Anderson: + // https://github.com/google/netboot/blob/master/dhcp4/conn_linux.go#L59-L70 + vm, done, err := testVM(t, []bpf.Instruction{ + // Load IPv4 packet length + bpf.LoadMemShift{Off: 8}, + // Get UDP dport + bpf.LoadIndirect{Off: 8 + 2, Size: 2}, + // Correct dport? + bpf.JumpIf{Cond: bpf.JumpEqual, Val: dhcp4Port, SkipFalse: 1}, + // Accept + bpf.RetConstant{Val: 1500}, + // Ignore + bpf.RetConstant{Val: 0}, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + + // Minimal requirements to make a valid IPv4 header + h := &ipv4.Header{ + Len: ipv4.HeaderLen, + Src: net.IPv4(192, 168, 1, 1), + Dst: net.IPv4(192, 168, 1, 2), + } + hb, err := h.Marshal() + if err != nil { + t.Fatalf("failed to marshal IPv4 header: %v", err) + } + + hb = append([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + }, hb...) + + return vm, hb, done +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm_ret_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm_ret_test.go new file mode 100644 index 0000000..2d86eae --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm_ret_test.go @@ -0,0 +1,115 @@ +// 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 bpf_test + +import ( + "testing" + + "golang.org/x/net/bpf" +) + +func TestVMRetA(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 1, + }, + bpf.RetA{}, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 9, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 1, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMRetALargerThanInput(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 2, + }, + bpf.RetA{}, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0, 255, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 2, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMRetConstant(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.RetConstant{ + Val: 9, + }, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0, 1, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 1, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMRetConstantLargerThanInput(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.RetConstant{ + Val: 16, + }, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0, 1, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 2, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm_scratch_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm_scratch_test.go new file mode 100644 index 0000000..e600e3c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm_scratch_test.go @@ -0,0 +1,247 @@ +// 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 bpf_test + +import ( + "testing" + + "golang.org/x/net/bpf" +) + +func TestVMStoreScratchInvalidScratchRegisterTooSmall(t *testing.T) { + _, _, err := testVM(t, []bpf.Instruction{ + bpf.StoreScratch{ + Src: bpf.RegA, + N: -1, + }, + bpf.RetA{}, + }) + if errStr(err) != "assembling instruction 1: invalid scratch slot -1" { + t.Fatalf("unexpected error: %v", err) + } +} + +func TestVMStoreScratchInvalidScratchRegisterTooLarge(t *testing.T) { + _, _, err := testVM(t, []bpf.Instruction{ + bpf.StoreScratch{ + Src: bpf.RegA, + N: 16, + }, + bpf.RetA{}, + }) + if errStr(err) != "assembling instruction 1: invalid scratch slot 16" { + t.Fatalf("unexpected error: %v", err) + } +} + +func TestVMStoreScratchUnknownSourceRegister(t *testing.T) { + _, _, err := testVM(t, []bpf.Instruction{ + bpf.StoreScratch{ + Src: 100, + N: 0, + }, + bpf.RetA{}, + }) + if errStr(err) != "assembling instruction 1: invalid source register 100" { + t.Fatalf("unexpected error: %v", err) + } +} + +func TestVMLoadScratchInvalidScratchRegisterTooSmall(t *testing.T) { + _, _, err := testVM(t, []bpf.Instruction{ + bpf.LoadScratch{ + Dst: bpf.RegX, + N: -1, + }, + bpf.RetA{}, + }) + if errStr(err) != "assembling instruction 1: invalid scratch slot -1" { + t.Fatalf("unexpected error: %v", err) + } +} + +func TestVMLoadScratchInvalidScratchRegisterTooLarge(t *testing.T) { + _, _, err := testVM(t, []bpf.Instruction{ + bpf.LoadScratch{ + Dst: bpf.RegX, + N: 16, + }, + bpf.RetA{}, + }) + if errStr(err) != "assembling instruction 1: invalid scratch slot 16" { + t.Fatalf("unexpected error: %v", err) + } +} + +func TestVMLoadScratchUnknownDestinationRegister(t *testing.T) { + _, _, err := testVM(t, []bpf.Instruction{ + bpf.LoadScratch{ + Dst: 100, + N: 0, + }, + bpf.RetA{}, + }) + if errStr(err) != "assembling instruction 1: invalid target register 100" { + t.Fatalf("unexpected error: %v", err) + } +} + +func TestVMStoreScratchLoadScratchOneValue(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + // Load byte 255 + bpf.LoadAbsolute{ + Off: 8, + Size: 1, + }, + // Copy to X and store in scratch[0] + bpf.TAX{}, + bpf.StoreScratch{ + Src: bpf.RegX, + N: 0, + }, + // Load byte 1 + bpf.LoadAbsolute{ + Off: 9, + Size: 1, + }, + // Overwrite 1 with 255 from scratch[0] + bpf.LoadScratch{ + Dst: bpf.RegA, + N: 0, + }, + // Return 255 + bpf.RetA{}, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 255, 1, 2, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 3, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMStoreScratchLoadScratchMultipleValues(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + // Load byte 10 + bpf.LoadAbsolute{ + Off: 8, + Size: 1, + }, + // Store in scratch[0] + bpf.StoreScratch{ + Src: bpf.RegA, + N: 0, + }, + // Load byte 20 + bpf.LoadAbsolute{ + Off: 9, + Size: 1, + }, + // Store in scratch[1] + bpf.StoreScratch{ + Src: bpf.RegA, + N: 1, + }, + // Load byte 30 + bpf.LoadAbsolute{ + Off: 10, + Size: 1, + }, + // Store in scratch[2] + bpf.StoreScratch{ + Src: bpf.RegA, + N: 2, + }, + // Load byte 1 + bpf.LoadAbsolute{ + Off: 11, + Size: 1, + }, + // Store in scratch[3] + bpf.StoreScratch{ + Src: bpf.RegA, + N: 3, + }, + // Load in byte 10 to X + bpf.LoadScratch{ + Dst: bpf.RegX, + N: 0, + }, + // Copy X -> A + bpf.TXA{}, + // Verify value is 10 + bpf.JumpIf{ + Cond: bpf.JumpEqual, + Val: 10, + SkipTrue: 1, + }, + // Fail test if incorrect + bpf.RetConstant{ + Val: 0, + }, + // Load in byte 20 to A + bpf.LoadScratch{ + Dst: bpf.RegA, + N: 1, + }, + // Verify value is 20 + bpf.JumpIf{ + Cond: bpf.JumpEqual, + Val: 20, + SkipTrue: 1, + }, + // Fail test if incorrect + bpf.RetConstant{ + Val: 0, + }, + // Load in byte 30 to A + bpf.LoadScratch{ + Dst: bpf.RegA, + N: 2, + }, + // Verify value is 30 + bpf.JumpIf{ + Cond: bpf.JumpEqual, + Val: 30, + SkipTrue: 1, + }, + // Fail test if incorrect + bpf.RetConstant{ + Val: 0, + }, + // Return first two bytes on success + bpf.RetConstant{ + Val: 10, + }, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 10, 20, 30, 1, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 2, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm_test.go new file mode 100644 index 0000000..6bd4dd5 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/bpf/vm_test.go @@ -0,0 +1,144 @@ +// 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 bpf_test + +import ( + "fmt" + "testing" + + "golang.org/x/net/bpf" +) + +var _ bpf.Instruction = unknown{} + +type unknown struct{} + +func (unknown) Assemble() (bpf.RawInstruction, error) { + return bpf.RawInstruction{}, nil +} + +func TestVMUnknownInstruction(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadConstant{ + Dst: bpf.RegA, + Val: 100, + }, + // Should terminate the program with an error immediately + unknown{}, + bpf.RetA{}, + }) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + defer done() + + _, err = vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, + }) + if errStr(err) != "unknown Instruction at index 1: bpf_test.unknown" { + t.Fatalf("unexpected error while running program: %v", err) + } +} + +func TestVMNoReturnInstruction(t *testing.T) { + _, _, err := testVM(t, []bpf.Instruction{ + bpf.LoadConstant{ + Dst: bpf.RegA, + Val: 1, + }, + }) + if errStr(err) != "BPF program must end with RetA or RetConstant" { + t.Fatalf("unexpected error: %v", err) + } +} + +func TestVMNoInputInstructions(t *testing.T) { + _, _, err := testVM(t, []bpf.Instruction{}) + if errStr(err) != "one or more Instructions must be specified" { + t.Fatalf("unexpected error: %v", err) + } +} + +// ExampleNewVM demonstrates usage of a VM, using an Ethernet frame +// as input and checking its EtherType to determine if it should be accepted. +func ExampleNewVM() { + // Offset | Length | Comment + // ------------------------- + // 00 | 06 | Ethernet destination MAC address + // 06 | 06 | Ethernet source MAC address + // 12 | 02 | Ethernet EtherType + const ( + etOff = 12 + etLen = 2 + + etARP = 0x0806 + ) + + // Set up a VM to filter traffic based on if its EtherType + // matches the ARP EtherType. + vm, err := bpf.NewVM([]bpf.Instruction{ + // Load EtherType value from Ethernet header + bpf.LoadAbsolute{ + Off: etOff, + Size: etLen, + }, + // If EtherType is equal to the ARP EtherType, jump to allow + // packet to be accepted + bpf.JumpIf{ + Cond: bpf.JumpEqual, + Val: etARP, + SkipTrue: 1, + }, + // EtherType does not match the ARP EtherType + bpf.RetConstant{ + Val: 0, + }, + // EtherType matches the ARP EtherType, accept up to 1500 + // bytes of packet + bpf.RetConstant{ + Val: 1500, + }, + }) + if err != nil { + panic(fmt.Sprintf("failed to load BPF program: %v", err)) + } + + // Create an Ethernet frame with the ARP EtherType for testing + frame := []byte{ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, + 0x08, 0x06, + // Payload omitted for brevity + } + + // Run our VM's BPF program using the Ethernet frame as input + out, err := vm.Run(frame) + if err != nil { + panic(fmt.Sprintf("failed to accept Ethernet frame: %v", err)) + } + + // BPF VM can return a byte count greater than the number of input + // bytes, so trim the output to match the input byte length + if out > len(frame) { + out = len(frame) + } + + fmt.Printf("out: %d bytes", out) + + // Output: + // out: 14 bytes +} + +// errStr returns the string representation of an error, or +// "" if it is nil. +func errStr(err error) string { + if err == nil { + return "" + } + + return err.Error() +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/codereview.cfg b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/codereview.cfg new file mode 100644 index 0000000..3f8b14b --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/codereview.cfg @@ -0,0 +1 @@ +issuerepo: golang/go diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/context.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/context.go new file mode 100644 index 0000000..d3681ab --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/context.go @@ -0,0 +1,54 @@ +// 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 context defines the Context type, which carries deadlines, +// cancelation signals, and other request-scoped values across API boundaries +// and between processes. +// +// Incoming requests to a server should create a Context, and outgoing calls to +// servers should accept a Context. The chain of function calls between must +// propagate the Context, optionally replacing it with a modified copy created +// using WithDeadline, WithTimeout, WithCancel, or WithValue. +// +// Programs that use Contexts should follow these rules to keep interfaces +// consistent across packages and enable static analysis tools to check context +// propagation: +// +// Do not store Contexts inside a struct type; instead, pass a Context +// explicitly to each function that needs it. The Context should be the first +// parameter, typically named ctx: +// +// func DoSomething(ctx context.Context, arg Arg) error { +// // ... use ctx ... +// } +// +// Do not pass a nil Context, even if a function permits it. Pass context.TODO +// if you are unsure about which Context to use. +// +// Use context Values only for request-scoped data that transits processes and +// APIs, not for passing optional parameters to functions. +// +// The same Context may be passed to functions running in different goroutines; +// Contexts are safe for simultaneous use by multiple goroutines. +// +// See http://blog.golang.org/context for example code for a server that uses +// Contexts. +package context // import "golang.org/x/net/context" + +// Background returns a non-nil, empty Context. It is never canceled, has no +// values, and has no deadline. It is typically used by the main function, +// initialization, and tests, and as the top-level Context for incoming +// requests. +func Background() Context { + return background +} + +// TODO returns a non-nil, empty Context. Code should use context.TODO when +// it's unclear which Context to use or it is not yet available (because the +// surrounding function has not yet been extended to accept a Context +// parameter). TODO is recognized by static analysis tools that determine +// whether Contexts are propagated correctly in a program. +func TODO() Context { + return todo +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/context_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/context_test.go new file mode 100644 index 0000000..6284413 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/context_test.go @@ -0,0 +1,583 @@ +// 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. + +// +build !go1.7 + +package context + +import ( + "fmt" + "math/rand" + "runtime" + "strings" + "sync" + "testing" + "time" +) + +// otherContext is a Context that's not one of the types defined in context.go. +// This lets us test code paths that differ based on the underlying type of the +// Context. +type otherContext struct { + Context +} + +func TestBackground(t *testing.T) { + c := Background() + if c == nil { + t.Fatalf("Background returned nil") + } + select { + case x := <-c.Done(): + t.Errorf("<-c.Done() == %v want nothing (it should block)", x) + default: + } + if got, want := fmt.Sprint(c), "context.Background"; got != want { + t.Errorf("Background().String() = %q want %q", got, want) + } +} + +func TestTODO(t *testing.T) { + c := TODO() + if c == nil { + t.Fatalf("TODO returned nil") + } + select { + case x := <-c.Done(): + t.Errorf("<-c.Done() == %v want nothing (it should block)", x) + default: + } + if got, want := fmt.Sprint(c), "context.TODO"; got != want { + t.Errorf("TODO().String() = %q want %q", got, want) + } +} + +func TestWithCancel(t *testing.T) { + c1, cancel := WithCancel(Background()) + + if got, want := fmt.Sprint(c1), "context.Background.WithCancel"; got != want { + t.Errorf("c1.String() = %q want %q", got, want) + } + + o := otherContext{c1} + c2, _ := WithCancel(o) + contexts := []Context{c1, o, c2} + + for i, c := range contexts { + if d := c.Done(); d == nil { + t.Errorf("c[%d].Done() == %v want non-nil", i, d) + } + if e := c.Err(); e != nil { + t.Errorf("c[%d].Err() == %v want nil", i, e) + } + + select { + case x := <-c.Done(): + t.Errorf("<-c.Done() == %v want nothing (it should block)", x) + default: + } + } + + cancel() + time.Sleep(100 * time.Millisecond) // let cancelation propagate + + for i, c := range contexts { + select { + case <-c.Done(): + default: + t.Errorf("<-c[%d].Done() blocked, but shouldn't have", i) + } + if e := c.Err(); e != Canceled { + t.Errorf("c[%d].Err() == %v want %v", i, e, Canceled) + } + } +} + +func TestParentFinishesChild(t *testing.T) { + // Context tree: + // parent -> cancelChild + // parent -> valueChild -> timerChild + parent, cancel := WithCancel(Background()) + cancelChild, stop := WithCancel(parent) + defer stop() + valueChild := WithValue(parent, "key", "value") + timerChild, stop := WithTimeout(valueChild, 10000*time.Hour) + defer stop() + + select { + case x := <-parent.Done(): + t.Errorf("<-parent.Done() == %v want nothing (it should block)", x) + case x := <-cancelChild.Done(): + t.Errorf("<-cancelChild.Done() == %v want nothing (it should block)", x) + case x := <-timerChild.Done(): + t.Errorf("<-timerChild.Done() == %v want nothing (it should block)", x) + case x := <-valueChild.Done(): + t.Errorf("<-valueChild.Done() == %v want nothing (it should block)", x) + default: + } + + // The parent's children should contain the two cancelable children. + pc := parent.(*cancelCtx) + cc := cancelChild.(*cancelCtx) + tc := timerChild.(*timerCtx) + pc.mu.Lock() + if len(pc.children) != 2 || !pc.children[cc] || !pc.children[tc] { + t.Errorf("bad linkage: pc.children = %v, want %v and %v", + pc.children, cc, tc) + } + pc.mu.Unlock() + + if p, ok := parentCancelCtx(cc.Context); !ok || p != pc { + t.Errorf("bad linkage: parentCancelCtx(cancelChild.Context) = %v, %v want %v, true", p, ok, pc) + } + if p, ok := parentCancelCtx(tc.Context); !ok || p != pc { + t.Errorf("bad linkage: parentCancelCtx(timerChild.Context) = %v, %v want %v, true", p, ok, pc) + } + + cancel() + + pc.mu.Lock() + if len(pc.children) != 0 { + t.Errorf("pc.cancel didn't clear pc.children = %v", pc.children) + } + pc.mu.Unlock() + + // parent and children should all be finished. + check := func(ctx Context, name string) { + select { + case <-ctx.Done(): + default: + t.Errorf("<-%s.Done() blocked, but shouldn't have", name) + } + if e := ctx.Err(); e != Canceled { + t.Errorf("%s.Err() == %v want %v", name, e, Canceled) + } + } + check(parent, "parent") + check(cancelChild, "cancelChild") + check(valueChild, "valueChild") + check(timerChild, "timerChild") + + // WithCancel should return a canceled context on a canceled parent. + precanceledChild := WithValue(parent, "key", "value") + select { + case <-precanceledChild.Done(): + default: + t.Errorf("<-precanceledChild.Done() blocked, but shouldn't have") + } + if e := precanceledChild.Err(); e != Canceled { + t.Errorf("precanceledChild.Err() == %v want %v", e, Canceled) + } +} + +func TestChildFinishesFirst(t *testing.T) { + cancelable, stop := WithCancel(Background()) + defer stop() + for _, parent := range []Context{Background(), cancelable} { + child, cancel := WithCancel(parent) + + select { + case x := <-parent.Done(): + t.Errorf("<-parent.Done() == %v want nothing (it should block)", x) + case x := <-child.Done(): + t.Errorf("<-child.Done() == %v want nothing (it should block)", x) + default: + } + + cc := child.(*cancelCtx) + pc, pcok := parent.(*cancelCtx) // pcok == false when parent == Background() + if p, ok := parentCancelCtx(cc.Context); ok != pcok || (ok && pc != p) { + t.Errorf("bad linkage: parentCancelCtx(cc.Context) = %v, %v want %v, %v", p, ok, pc, pcok) + } + + if pcok { + pc.mu.Lock() + if len(pc.children) != 1 || !pc.children[cc] { + t.Errorf("bad linkage: pc.children = %v, cc = %v", pc.children, cc) + } + pc.mu.Unlock() + } + + cancel() + + if pcok { + pc.mu.Lock() + if len(pc.children) != 0 { + t.Errorf("child's cancel didn't remove self from pc.children = %v", pc.children) + } + pc.mu.Unlock() + } + + // child should be finished. + select { + case <-child.Done(): + default: + t.Errorf("<-child.Done() blocked, but shouldn't have") + } + if e := child.Err(); e != Canceled { + t.Errorf("child.Err() == %v want %v", e, Canceled) + } + + // parent should not be finished. + select { + case x := <-parent.Done(): + t.Errorf("<-parent.Done() == %v want nothing (it should block)", x) + default: + } + if e := parent.Err(); e != nil { + t.Errorf("parent.Err() == %v want nil", e) + } + } +} + +func testDeadline(c Context, wait time.Duration, t *testing.T) { + select { + case <-time.After(wait): + t.Fatalf("context should have timed out") + case <-c.Done(): + } + if e := c.Err(); e != DeadlineExceeded { + t.Errorf("c.Err() == %v want %v", e, DeadlineExceeded) + } +} + +func TestDeadline(t *testing.T) { + t.Parallel() + const timeUnit = 500 * time.Millisecond + c, _ := WithDeadline(Background(), time.Now().Add(1*timeUnit)) + if got, prefix := fmt.Sprint(c), "context.Background.WithDeadline("; !strings.HasPrefix(got, prefix) { + t.Errorf("c.String() = %q want prefix %q", got, prefix) + } + testDeadline(c, 2*timeUnit, t) + + c, _ = WithDeadline(Background(), time.Now().Add(1*timeUnit)) + o := otherContext{c} + testDeadline(o, 2*timeUnit, t) + + c, _ = WithDeadline(Background(), time.Now().Add(1*timeUnit)) + o = otherContext{c} + c, _ = WithDeadline(o, time.Now().Add(3*timeUnit)) + testDeadline(c, 2*timeUnit, t) +} + +func TestTimeout(t *testing.T) { + t.Parallel() + const timeUnit = 500 * time.Millisecond + c, _ := WithTimeout(Background(), 1*timeUnit) + if got, prefix := fmt.Sprint(c), "context.Background.WithDeadline("; !strings.HasPrefix(got, prefix) { + t.Errorf("c.String() = %q want prefix %q", got, prefix) + } + testDeadline(c, 2*timeUnit, t) + + c, _ = WithTimeout(Background(), 1*timeUnit) + o := otherContext{c} + testDeadline(o, 2*timeUnit, t) + + c, _ = WithTimeout(Background(), 1*timeUnit) + o = otherContext{c} + c, _ = WithTimeout(o, 3*timeUnit) + testDeadline(c, 2*timeUnit, t) +} + +func TestCanceledTimeout(t *testing.T) { + t.Parallel() + const timeUnit = 500 * time.Millisecond + c, _ := WithTimeout(Background(), 2*timeUnit) + o := otherContext{c} + c, cancel := WithTimeout(o, 4*timeUnit) + cancel() + time.Sleep(1 * timeUnit) // let cancelation propagate + select { + case <-c.Done(): + default: + t.Errorf("<-c.Done() blocked, but shouldn't have") + } + if e := c.Err(); e != Canceled { + t.Errorf("c.Err() == %v want %v", e, Canceled) + } +} + +type key1 int +type key2 int + +var k1 = key1(1) +var k2 = key2(1) // same int as k1, different type +var k3 = key2(3) // same type as k2, different int + +func TestValues(t *testing.T) { + check := func(c Context, nm, v1, v2, v3 string) { + if v, ok := c.Value(k1).(string); ok == (len(v1) == 0) || v != v1 { + t.Errorf(`%s.Value(k1).(string) = %q, %t want %q, %t`, nm, v, ok, v1, len(v1) != 0) + } + if v, ok := c.Value(k2).(string); ok == (len(v2) == 0) || v != v2 { + t.Errorf(`%s.Value(k2).(string) = %q, %t want %q, %t`, nm, v, ok, v2, len(v2) != 0) + } + if v, ok := c.Value(k3).(string); ok == (len(v3) == 0) || v != v3 { + t.Errorf(`%s.Value(k3).(string) = %q, %t want %q, %t`, nm, v, ok, v3, len(v3) != 0) + } + } + + c0 := Background() + check(c0, "c0", "", "", "") + + c1 := WithValue(Background(), k1, "c1k1") + check(c1, "c1", "c1k1", "", "") + + if got, want := fmt.Sprint(c1), `context.Background.WithValue(1, "c1k1")`; got != want { + t.Errorf("c.String() = %q want %q", got, want) + } + + c2 := WithValue(c1, k2, "c2k2") + check(c2, "c2", "c1k1", "c2k2", "") + + c3 := WithValue(c2, k3, "c3k3") + check(c3, "c2", "c1k1", "c2k2", "c3k3") + + c4 := WithValue(c3, k1, nil) + check(c4, "c4", "", "c2k2", "c3k3") + + o0 := otherContext{Background()} + check(o0, "o0", "", "", "") + + o1 := otherContext{WithValue(Background(), k1, "c1k1")} + check(o1, "o1", "c1k1", "", "") + + o2 := WithValue(o1, k2, "o2k2") + check(o2, "o2", "c1k1", "o2k2", "") + + o3 := otherContext{c4} + check(o3, "o3", "", "c2k2", "c3k3") + + o4 := WithValue(o3, k3, nil) + check(o4, "o4", "", "c2k2", "") +} + +func TestAllocs(t *testing.T) { + bg := Background() + for _, test := range []struct { + desc string + f func() + limit float64 + gccgoLimit float64 + }{ + { + desc: "Background()", + f: func() { Background() }, + limit: 0, + gccgoLimit: 0, + }, + { + desc: fmt.Sprintf("WithValue(bg, %v, nil)", k1), + f: func() { + c := WithValue(bg, k1, nil) + c.Value(k1) + }, + limit: 3, + gccgoLimit: 3, + }, + { + desc: "WithTimeout(bg, 15*time.Millisecond)", + f: func() { + c, _ := WithTimeout(bg, 15*time.Millisecond) + <-c.Done() + }, + limit: 8, + gccgoLimit: 16, + }, + { + desc: "WithCancel(bg)", + f: func() { + c, cancel := WithCancel(bg) + cancel() + <-c.Done() + }, + limit: 5, + gccgoLimit: 8, + }, + { + desc: "WithTimeout(bg, 100*time.Millisecond)", + f: func() { + c, cancel := WithTimeout(bg, 100*time.Millisecond) + cancel() + <-c.Done() + }, + limit: 8, + gccgoLimit: 25, + }, + } { + limit := test.limit + if runtime.Compiler == "gccgo" { + // gccgo does not yet do escape analysis. + // TODO(iant): Remove this when gccgo does do escape analysis. + limit = test.gccgoLimit + } + if n := testing.AllocsPerRun(100, test.f); n > limit { + t.Errorf("%s allocs = %f want %d", test.desc, n, int(limit)) + } + } +} + +func TestSimultaneousCancels(t *testing.T) { + root, cancel := WithCancel(Background()) + m := map[Context]CancelFunc{root: cancel} + q := []Context{root} + // Create a tree of contexts. + for len(q) != 0 && len(m) < 100 { + parent := q[0] + q = q[1:] + for i := 0; i < 4; i++ { + ctx, cancel := WithCancel(parent) + m[ctx] = cancel + q = append(q, ctx) + } + } + // Start all the cancels in a random order. + var wg sync.WaitGroup + wg.Add(len(m)) + for _, cancel := range m { + go func(cancel CancelFunc) { + cancel() + wg.Done() + }(cancel) + } + // Wait on all the contexts in a random order. + for ctx := range m { + select { + case <-ctx.Done(): + case <-time.After(1 * time.Second): + buf := make([]byte, 10<<10) + n := runtime.Stack(buf, true) + t.Fatalf("timed out waiting for <-ctx.Done(); stacks:\n%s", buf[:n]) + } + } + // Wait for all the cancel functions to return. + done := make(chan struct{}) + go func() { + wg.Wait() + close(done) + }() + select { + case <-done: + case <-time.After(1 * time.Second): + buf := make([]byte, 10<<10) + n := runtime.Stack(buf, true) + t.Fatalf("timed out waiting for cancel functions; stacks:\n%s", buf[:n]) + } +} + +func TestInterlockedCancels(t *testing.T) { + parent, cancelParent := WithCancel(Background()) + child, cancelChild := WithCancel(parent) + go func() { + parent.Done() + cancelChild() + }() + cancelParent() + select { + case <-child.Done(): + case <-time.After(1 * time.Second): + buf := make([]byte, 10<<10) + n := runtime.Stack(buf, true) + t.Fatalf("timed out waiting for child.Done(); stacks:\n%s", buf[:n]) + } +} + +func TestLayersCancel(t *testing.T) { + testLayers(t, time.Now().UnixNano(), false) +} + +func TestLayersTimeout(t *testing.T) { + testLayers(t, time.Now().UnixNano(), true) +} + +func testLayers(t *testing.T, seed int64, testTimeout bool) { + rand.Seed(seed) + errorf := func(format string, a ...interface{}) { + t.Errorf(fmt.Sprintf("seed=%d: %s", seed, format), a...) + } + const ( + timeout = 200 * time.Millisecond + minLayers = 30 + ) + type value int + var ( + vals []*value + cancels []CancelFunc + numTimers int + ctx = Background() + ) + for i := 0; i < minLayers || numTimers == 0 || len(cancels) == 0 || len(vals) == 0; i++ { + switch rand.Intn(3) { + case 0: + v := new(value) + ctx = WithValue(ctx, v, v) + vals = append(vals, v) + case 1: + var cancel CancelFunc + ctx, cancel = WithCancel(ctx) + cancels = append(cancels, cancel) + case 2: + var cancel CancelFunc + ctx, cancel = WithTimeout(ctx, timeout) + cancels = append(cancels, cancel) + numTimers++ + } + } + checkValues := func(when string) { + for _, key := range vals { + if val := ctx.Value(key).(*value); key != val { + errorf("%s: ctx.Value(%p) = %p want %p", when, key, val, key) + } + } + } + select { + case <-ctx.Done(): + errorf("ctx should not be canceled yet") + default: + } + if s, prefix := fmt.Sprint(ctx), "context.Background."; !strings.HasPrefix(s, prefix) { + t.Errorf("ctx.String() = %q want prefix %q", s, prefix) + } + t.Log(ctx) + checkValues("before cancel") + if testTimeout { + select { + case <-ctx.Done(): + case <-time.After(timeout + 100*time.Millisecond): + errorf("ctx should have timed out") + } + checkValues("after timeout") + } else { + cancel := cancels[rand.Intn(len(cancels))] + cancel() + select { + case <-ctx.Done(): + default: + errorf("ctx should be canceled") + } + checkValues("after cancel") + } +} + +func TestCancelRemoves(t *testing.T) { + checkChildren := func(when string, ctx Context, want int) { + if got := len(ctx.(*cancelCtx).children); got != want { + t.Errorf("%s: context has %d children, want %d", when, got, want) + } + } + + ctx, _ := WithCancel(Background()) + checkChildren("after creation", ctx, 0) + _, cancel := WithCancel(ctx) + checkChildren("with WithCancel child ", ctx, 1) + cancel() + checkChildren("after cancelling WithCancel child", ctx, 0) + + ctx, _ = WithCancel(Background()) + checkChildren("after creation", ctx, 0) + _, cancel = WithTimeout(ctx, 60*time.Minute) + checkChildren("with WithTimeout child ", ctx, 1) + cancel() + checkChildren("after cancelling WithTimeout child", ctx, 0) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go new file mode 100644 index 0000000..606cf1f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go @@ -0,0 +1,74 @@ +// 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. + +// +build go1.7 + +// Package ctxhttp provides helper functions for performing context-aware HTTP requests. +package ctxhttp // import "golang.org/x/net/context/ctxhttp" + +import ( + "io" + "net/http" + "net/url" + "strings" + + "golang.org/x/net/context" +) + +// Do sends an HTTP request with the provided http.Client and returns +// an HTTP response. +// +// If the client is nil, http.DefaultClient is used. +// +// The provided ctx must be non-nil. If it is canceled or times out, +// ctx.Err() will be returned. +func Do(ctx context.Context, client *http.Client, req *http.Request) (*http.Response, error) { + if client == nil { + client = http.DefaultClient + } + resp, err := client.Do(req.WithContext(ctx)) + // If we got an error, and the context has been canceled, + // the context's error is probably more useful. + if err != nil { + select { + case <-ctx.Done(): + err = ctx.Err() + default: + } + } + return resp, err +} + +// Get issues a GET request via the Do function. +func Get(ctx context.Context, client *http.Client, url string) (*http.Response, error) { + req, err := http.NewRequest("GET", url, nil) + if err != nil { + return nil, err + } + return Do(ctx, client, req) +} + +// Head issues a HEAD request via the Do function. +func Head(ctx context.Context, client *http.Client, url string) (*http.Response, error) { + req, err := http.NewRequest("HEAD", url, nil) + if err != nil { + return nil, err + } + return Do(ctx, client, req) +} + +// Post issues a POST request via the Do function. +func Post(ctx context.Context, client *http.Client, url string, bodyType string, body io.Reader) (*http.Response, error) { + req, err := http.NewRequest("POST", url, body) + if err != nil { + return nil, err + } + req.Header.Set("Content-Type", bodyType) + return Do(ctx, client, req) +} + +// PostForm issues a POST request via the Do function. +func PostForm(ctx context.Context, client *http.Client, url string, data url.Values) (*http.Response, error) { + return Post(ctx, client, url, "application/x-www-form-urlencoded", strings.NewReader(data.Encode())) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_17_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_17_test.go new file mode 100644 index 0000000..72411b1 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_17_test.go @@ -0,0 +1,29 @@ +// Copyright 2015 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 !plan9,go1.7 + +package ctxhttp + +import ( + "io" + "net/http" + "net/http/httptest" + "testing" + + "context" +) + +func TestGo17Context(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + io.WriteString(w, "ok") + })) + defer ts.Close() + ctx := context.Background() + resp, err := Get(ctx, http.DefaultClient, ts.URL) + if resp == nil || err != nil { + t.Fatalf("error received from client: %v %v", err, resp) + } + resp.Body.Close() +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_pre17.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_pre17.go new file mode 100644 index 0000000..926870c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_pre17.go @@ -0,0 +1,147 @@ +// Copyright 2015 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 !go1.7 + +package ctxhttp // import "golang.org/x/net/context/ctxhttp" + +import ( + "io" + "net/http" + "net/url" + "strings" + + "golang.org/x/net/context" +) + +func nop() {} + +var ( + testHookContextDoneBeforeHeaders = nop + testHookDoReturned = nop + testHookDidBodyClose = nop +) + +// Do sends an HTTP request with the provided http.Client and returns an HTTP response. +// If the client is nil, http.DefaultClient is used. +// If the context is canceled or times out, ctx.Err() will be returned. +func Do(ctx context.Context, client *http.Client, req *http.Request) (*http.Response, error) { + if client == nil { + client = http.DefaultClient + } + + // TODO(djd): Respect any existing value of req.Cancel. + cancel := make(chan struct{}) + req.Cancel = cancel + + type responseAndError struct { + resp *http.Response + err error + } + result := make(chan responseAndError, 1) + + // Make local copies of test hooks closed over by goroutines below. + // Prevents data races in tests. + testHookDoReturned := testHookDoReturned + testHookDidBodyClose := testHookDidBodyClose + + go func() { + resp, err := client.Do(req) + testHookDoReturned() + result <- responseAndError{resp, err} + }() + + var resp *http.Response + + select { + case <-ctx.Done(): + testHookContextDoneBeforeHeaders() + close(cancel) + // Clean up after the goroutine calling client.Do: + go func() { + if r := <-result; r.resp != nil { + testHookDidBodyClose() + r.resp.Body.Close() + } + }() + return nil, ctx.Err() + case r := <-result: + var err error + resp, err = r.resp, r.err + if err != nil { + return resp, err + } + } + + c := make(chan struct{}) + go func() { + select { + case <-ctx.Done(): + close(cancel) + case <-c: + // The response's Body is closed. + } + }() + resp.Body = ¬ifyingReader{resp.Body, c} + + return resp, nil +} + +// Get issues a GET request via the Do function. +func Get(ctx context.Context, client *http.Client, url string) (*http.Response, error) { + req, err := http.NewRequest("GET", url, nil) + if err != nil { + return nil, err + } + return Do(ctx, client, req) +} + +// Head issues a HEAD request via the Do function. +func Head(ctx context.Context, client *http.Client, url string) (*http.Response, error) { + req, err := http.NewRequest("HEAD", url, nil) + if err != nil { + return nil, err + } + return Do(ctx, client, req) +} + +// Post issues a POST request via the Do function. +func Post(ctx context.Context, client *http.Client, url string, bodyType string, body io.Reader) (*http.Response, error) { + req, err := http.NewRequest("POST", url, body) + if err != nil { + return nil, err + } + req.Header.Set("Content-Type", bodyType) + return Do(ctx, client, req) +} + +// PostForm issues a POST request via the Do function. +func PostForm(ctx context.Context, client *http.Client, url string, data url.Values) (*http.Response, error) { + return Post(ctx, client, url, "application/x-www-form-urlencoded", strings.NewReader(data.Encode())) +} + +// notifyingReader is an io.ReadCloser that closes the notify channel after +// Close is called or a Read fails on the underlying ReadCloser. +type notifyingReader struct { + io.ReadCloser + notify chan<- struct{} +} + +func (r *notifyingReader) Read(p []byte) (int, error) { + n, err := r.ReadCloser.Read(p) + if err != nil && r.notify != nil { + close(r.notify) + r.notify = nil + } + return n, err +} + +func (r *notifyingReader) Close() error { + err := r.ReadCloser.Close() + if r.notify != nil { + close(r.notify) + r.notify = nil + } + return err +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_pre17_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_pre17_test.go new file mode 100644 index 0000000..9159cf0 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_pre17_test.go @@ -0,0 +1,79 @@ +// Copyright 2015 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 !plan9,!go1.7 + +package ctxhttp + +import ( + "net" + "net/http" + "net/http/httptest" + "sync" + "testing" + "time" + + "golang.org/x/net/context" +) + +// golang.org/issue/14065 +func TestClosesResponseBodyOnCancel(t *testing.T) { + defer func() { testHookContextDoneBeforeHeaders = nop }() + defer func() { testHookDoReturned = nop }() + defer func() { testHookDidBodyClose = nop }() + + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {})) + defer ts.Close() + + ctx, cancel := context.WithCancel(context.Background()) + + // closed when Do enters select case <-ctx.Done() + enteredDonePath := make(chan struct{}) + + testHookContextDoneBeforeHeaders = func() { + close(enteredDonePath) + } + + testHookDoReturned = func() { + // We now have the result (the Flush'd headers) at least, + // so we can cancel the request. + cancel() + + // But block the client.Do goroutine from sending + // until Do enters into the <-ctx.Done() path, since + // otherwise if both channels are readable, select + // picks a random one. + <-enteredDonePath + } + + sawBodyClose := make(chan struct{}) + testHookDidBodyClose = func() { close(sawBodyClose) } + + tr := &http.Transport{} + defer tr.CloseIdleConnections() + c := &http.Client{Transport: tr} + req, _ := http.NewRequest("GET", ts.URL, nil) + _, doErr := Do(ctx, c, req) + + select { + case <-sawBodyClose: + case <-time.After(5 * time.Second): + t.Fatal("timeout waiting for body to close") + } + + if doErr != ctx.Err() { + t.Errorf("Do error = %v; want %v", doErr, ctx.Err()) + } +} + +type noteCloseConn struct { + net.Conn + onceClose sync.Once + closefn func() +} + +func (c *noteCloseConn) Close() error { + c.onceClose.Do(c.closefn) + return c.Conn.Close() +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_test.go new file mode 100644 index 0000000..1e41551 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_test.go @@ -0,0 +1,105 @@ +// Copyright 2015 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 !plan9 + +package ctxhttp + +import ( + "io" + "io/ioutil" + "net/http" + "net/http/httptest" + "testing" + "time" + + "golang.org/x/net/context" +) + +const ( + requestDuration = 100 * time.Millisecond + requestBody = "ok" +) + +func okHandler(w http.ResponseWriter, r *http.Request) { + time.Sleep(requestDuration) + io.WriteString(w, requestBody) +} + +func TestNoTimeout(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(okHandler)) + defer ts.Close() + + ctx := context.Background() + res, err := Get(ctx, nil, ts.URL) + if err != nil { + t.Fatal(err) + } + defer res.Body.Close() + slurp, err := ioutil.ReadAll(res.Body) + if err != nil { + t.Fatal(err) + } + if string(slurp) != requestBody { + t.Errorf("body = %q; want %q", slurp, requestBody) + } +} + +func TestCancelBeforeHeaders(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + + blockServer := make(chan struct{}) + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + cancel() + <-blockServer + io.WriteString(w, requestBody) + })) + defer ts.Close() + defer close(blockServer) + + res, err := Get(ctx, nil, ts.URL) + if err == nil { + res.Body.Close() + t.Fatal("Get returned unexpected nil error") + } + if err != context.Canceled { + t.Errorf("err = %v; want %v", err, context.Canceled) + } +} + +func TestCancelAfterHangingRequest(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) + w.(http.Flusher).Flush() + <-w.(http.CloseNotifier).CloseNotify() + })) + defer ts.Close() + + ctx, cancel := context.WithCancel(context.Background()) + resp, err := Get(ctx, nil, ts.URL) + if err != nil { + t.Fatalf("unexpected error in Get: %v", err) + } + + // Cancel befer reading the body. + // Reading Request.Body should fail, since the request was + // canceled before anything was written. + cancel() + + done := make(chan struct{}) + + go func() { + b, err := ioutil.ReadAll(resp.Body) + if len(b) != 0 || err == nil { + t.Errorf(`Read got (%q, %v); want ("", error)`, b, err) + } + close(done) + }() + + select { + case <-time.After(1 * time.Second): + t.Errorf("Test timed out") + case <-done: + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/go17.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/go17.go new file mode 100644 index 0000000..d20f52b --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/go17.go @@ -0,0 +1,72 @@ +// 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. + +// +build go1.7 + +package context + +import ( + "context" // standard library's context, as of Go 1.7 + "time" +) + +var ( + todo = context.TODO() + background = context.Background() +) + +// Canceled is the error returned by Context.Err when the context is canceled. +var Canceled = context.Canceled + +// DeadlineExceeded is the error returned by Context.Err when the context's +// deadline passes. +var DeadlineExceeded = context.DeadlineExceeded + +// WithCancel returns a copy of parent with a new Done channel. The returned +// context's Done channel is closed when the returned cancel function is called +// or when the parent context's Done channel is closed, whichever happens first. +// +// Canceling this context releases resources associated with it, so code should +// call cancel as soon as the operations running in this Context complete. +func WithCancel(parent Context) (ctx Context, cancel CancelFunc) { + ctx, f := context.WithCancel(parent) + return ctx, CancelFunc(f) +} + +// WithDeadline returns a copy of the parent context with the deadline adjusted +// to be no later than d. If the parent's deadline is already earlier than d, +// WithDeadline(parent, d) is semantically equivalent to parent. The returned +// context's Done channel is closed when the deadline expires, when the returned +// cancel function is called, or when the parent context's Done channel is +// closed, whichever happens first. +// +// Canceling this context releases resources associated with it, so code should +// call cancel as soon as the operations running in this Context complete. +func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc) { + ctx, f := context.WithDeadline(parent, deadline) + return ctx, CancelFunc(f) +} + +// WithTimeout returns WithDeadline(parent, time.Now().Add(timeout)). +// +// Canceling this context releases resources associated with it, so code should +// call cancel as soon as the operations running in this Context complete: +// +// func slowOperationWithTimeout(ctx context.Context) (Result, error) { +// ctx, cancel := context.WithTimeout(ctx, 100*time.Millisecond) +// defer cancel() // releases resources if slowOperation completes before timeout elapses +// return slowOperation(ctx) +// } +func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) { + return WithDeadline(parent, time.Now().Add(timeout)) +} + +// WithValue returns a copy of parent in which the value associated with key is +// val. +// +// Use context Values only for request-scoped data that transits processes and +// APIs, not for passing optional parameters to functions. +func WithValue(parent Context, key interface{}, val interface{}) Context { + return context.WithValue(parent, key, val) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/go19.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/go19.go new file mode 100644 index 0000000..d88bd1d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/go19.go @@ -0,0 +1,20 @@ +// 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. + +// +build go1.9 + +package context + +import "context" // standard library's context, as of Go 1.7 + +// A Context carries a deadline, a cancelation signal, and other values across +// API boundaries. +// +// Context's methods may be called by multiple goroutines simultaneously. +type Context = context.Context + +// A CancelFunc tells an operation to abandon its work. +// A CancelFunc does not wait for the work to stop. +// After the first call, subsequent calls to a CancelFunc do nothing. +type CancelFunc = context.CancelFunc diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/pre_go17.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/pre_go17.go new file mode 100644 index 0000000..0f35592 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/pre_go17.go @@ -0,0 +1,300 @@ +// 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. + +// +build !go1.7 + +package context + +import ( + "errors" + "fmt" + "sync" + "time" +) + +// An emptyCtx is never canceled, has no values, and has no deadline. It is not +// struct{}, since vars of this type must have distinct addresses. +type emptyCtx int + +func (*emptyCtx) Deadline() (deadline time.Time, ok bool) { + return +} + +func (*emptyCtx) Done() <-chan struct{} { + return nil +} + +func (*emptyCtx) Err() error { + return nil +} + +func (*emptyCtx) Value(key interface{}) interface{} { + return nil +} + +func (e *emptyCtx) String() string { + switch e { + case background: + return "context.Background" + case todo: + return "context.TODO" + } + return "unknown empty Context" +} + +var ( + background = new(emptyCtx) + todo = new(emptyCtx) +) + +// Canceled is the error returned by Context.Err when the context is canceled. +var Canceled = errors.New("context canceled") + +// DeadlineExceeded is the error returned by Context.Err when the context's +// deadline passes. +var DeadlineExceeded = errors.New("context deadline exceeded") + +// WithCancel returns a copy of parent with a new Done channel. The returned +// context's Done channel is closed when the returned cancel function is called +// or when the parent context's Done channel is closed, whichever happens first. +// +// Canceling this context releases resources associated with it, so code should +// call cancel as soon as the operations running in this Context complete. +func WithCancel(parent Context) (ctx Context, cancel CancelFunc) { + c := newCancelCtx(parent) + propagateCancel(parent, c) + return c, func() { c.cancel(true, Canceled) } +} + +// newCancelCtx returns an initialized cancelCtx. +func newCancelCtx(parent Context) *cancelCtx { + return &cancelCtx{ + Context: parent, + done: make(chan struct{}), + } +} + +// propagateCancel arranges for child to be canceled when parent is. +func propagateCancel(parent Context, child canceler) { + if parent.Done() == nil { + return // parent is never canceled + } + if p, ok := parentCancelCtx(parent); ok { + p.mu.Lock() + if p.err != nil { + // parent has already been canceled + child.cancel(false, p.err) + } else { + if p.children == nil { + p.children = make(map[canceler]bool) + } + p.children[child] = true + } + p.mu.Unlock() + } else { + go func() { + select { + case <-parent.Done(): + child.cancel(false, parent.Err()) + case <-child.Done(): + } + }() + } +} + +// parentCancelCtx follows a chain of parent references until it finds a +// *cancelCtx. This function understands how each of the concrete types in this +// package represents its parent. +func parentCancelCtx(parent Context) (*cancelCtx, bool) { + for { + switch c := parent.(type) { + case *cancelCtx: + return c, true + case *timerCtx: + return c.cancelCtx, true + case *valueCtx: + parent = c.Context + default: + return nil, false + } + } +} + +// removeChild removes a context from its parent. +func removeChild(parent Context, child canceler) { + p, ok := parentCancelCtx(parent) + if !ok { + return + } + p.mu.Lock() + if p.children != nil { + delete(p.children, child) + } + p.mu.Unlock() +} + +// A canceler is a context type that can be canceled directly. The +// implementations are *cancelCtx and *timerCtx. +type canceler interface { + cancel(removeFromParent bool, err error) + Done() <-chan struct{} +} + +// A cancelCtx can be canceled. When canceled, it also cancels any children +// that implement canceler. +type cancelCtx struct { + Context + + done chan struct{} // closed by the first cancel call. + + mu sync.Mutex + children map[canceler]bool // set to nil by the first cancel call + err error // set to non-nil by the first cancel call +} + +func (c *cancelCtx) Done() <-chan struct{} { + return c.done +} + +func (c *cancelCtx) Err() error { + c.mu.Lock() + defer c.mu.Unlock() + return c.err +} + +func (c *cancelCtx) String() string { + return fmt.Sprintf("%v.WithCancel", c.Context) +} + +// cancel closes c.done, cancels each of c's children, and, if +// removeFromParent is true, removes c from its parent's children. +func (c *cancelCtx) cancel(removeFromParent bool, err error) { + if err == nil { + panic("context: internal error: missing cancel error") + } + c.mu.Lock() + if c.err != nil { + c.mu.Unlock() + return // already canceled + } + c.err = err + close(c.done) + for child := range c.children { + // NOTE: acquiring the child's lock while holding parent's lock. + child.cancel(false, err) + } + c.children = nil + c.mu.Unlock() + + if removeFromParent { + removeChild(c.Context, c) + } +} + +// WithDeadline returns a copy of the parent context with the deadline adjusted +// to be no later than d. If the parent's deadline is already earlier than d, +// WithDeadline(parent, d) is semantically equivalent to parent. The returned +// context's Done channel is closed when the deadline expires, when the returned +// cancel function is called, or when the parent context's Done channel is +// closed, whichever happens first. +// +// Canceling this context releases resources associated with it, so code should +// call cancel as soon as the operations running in this Context complete. +func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc) { + if cur, ok := parent.Deadline(); ok && cur.Before(deadline) { + // The current deadline is already sooner than the new one. + return WithCancel(parent) + } + c := &timerCtx{ + cancelCtx: newCancelCtx(parent), + deadline: deadline, + } + propagateCancel(parent, c) + d := deadline.Sub(time.Now()) + if d <= 0 { + c.cancel(true, DeadlineExceeded) // deadline has already passed + return c, func() { c.cancel(true, Canceled) } + } + c.mu.Lock() + defer c.mu.Unlock() + if c.err == nil { + c.timer = time.AfterFunc(d, func() { + c.cancel(true, DeadlineExceeded) + }) + } + return c, func() { c.cancel(true, Canceled) } +} + +// A timerCtx carries a timer and a deadline. It embeds a cancelCtx to +// implement Done and Err. It implements cancel by stopping its timer then +// delegating to cancelCtx.cancel. +type timerCtx struct { + *cancelCtx + timer *time.Timer // Under cancelCtx.mu. + + deadline time.Time +} + +func (c *timerCtx) Deadline() (deadline time.Time, ok bool) { + return c.deadline, true +} + +func (c *timerCtx) String() string { + return fmt.Sprintf("%v.WithDeadline(%s [%s])", c.cancelCtx.Context, c.deadline, c.deadline.Sub(time.Now())) +} + +func (c *timerCtx) cancel(removeFromParent bool, err error) { + c.cancelCtx.cancel(false, err) + if removeFromParent { + // Remove this timerCtx from its parent cancelCtx's children. + removeChild(c.cancelCtx.Context, c) + } + c.mu.Lock() + if c.timer != nil { + c.timer.Stop() + c.timer = nil + } + c.mu.Unlock() +} + +// WithTimeout returns WithDeadline(parent, time.Now().Add(timeout)). +// +// Canceling this context releases resources associated with it, so code should +// call cancel as soon as the operations running in this Context complete: +// +// func slowOperationWithTimeout(ctx context.Context) (Result, error) { +// ctx, cancel := context.WithTimeout(ctx, 100*time.Millisecond) +// defer cancel() // releases resources if slowOperation completes before timeout elapses +// return slowOperation(ctx) +// } +func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) { + return WithDeadline(parent, time.Now().Add(timeout)) +} + +// WithValue returns a copy of parent in which the value associated with key is +// val. +// +// Use context Values only for request-scoped data that transits processes and +// APIs, not for passing optional parameters to functions. +func WithValue(parent Context, key interface{}, val interface{}) Context { + return &valueCtx{parent, key, val} +} + +// A valueCtx carries a key-value pair. It implements Value for that key and +// delegates all other calls to the embedded Context. +type valueCtx struct { + Context + key, val interface{} +} + +func (c *valueCtx) String() string { + return fmt.Sprintf("%v.WithValue(%#v, %#v)", c.Context, c.key, c.val) +} + +func (c *valueCtx) Value(key interface{}) interface{} { + if c.key == key { + return c.val + } + return c.Context.Value(key) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/pre_go19.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/pre_go19.go new file mode 100644 index 0000000..b105f80 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/pre_go19.go @@ -0,0 +1,109 @@ +// 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. + +// +build !go1.9 + +package context + +import "time" + +// A Context carries a deadline, a cancelation signal, and other values across +// API boundaries. +// +// Context's methods may be called by multiple goroutines simultaneously. +type Context interface { + // Deadline returns the time when work done on behalf of this context + // should be canceled. Deadline returns ok==false when no deadline is + // set. Successive calls to Deadline return the same results. + Deadline() (deadline time.Time, ok bool) + + // Done returns a channel that's closed when work done on behalf of this + // context should be canceled. Done may return nil if this context can + // never be canceled. Successive calls to Done return the same value. + // + // WithCancel arranges for Done to be closed when cancel is called; + // WithDeadline arranges for Done to be closed when the deadline + // expires; WithTimeout arranges for Done to be closed when the timeout + // elapses. + // + // Done is provided for use in select statements: + // + // // Stream generates values with DoSomething and sends them to out + // // until DoSomething returns an error or ctx.Done is closed. + // func Stream(ctx context.Context, out chan<- Value) error { + // for { + // v, err := DoSomething(ctx) + // if err != nil { + // return err + // } + // select { + // case <-ctx.Done(): + // return ctx.Err() + // case out <- v: + // } + // } + // } + // + // See http://blog.golang.org/pipelines for more examples of how to use + // a Done channel for cancelation. + Done() <-chan struct{} + + // Err returns a non-nil error value after Done is closed. Err returns + // Canceled if the context was canceled or DeadlineExceeded if the + // context's deadline passed. No other values for Err are defined. + // After Done is closed, successive calls to Err return the same value. + Err() error + + // Value returns the value associated with this context for key, or nil + // if no value is associated with key. Successive calls to Value with + // the same key returns the same result. + // + // Use context values only for request-scoped data that transits + // processes and API boundaries, not for passing optional parameters to + // functions. + // + // A key identifies a specific value in a Context. Functions that wish + // to store values in Context typically allocate a key in a global + // variable then use that key as the argument to context.WithValue and + // Context.Value. A key can be any type that supports equality; + // packages should define keys as an unexported type to avoid + // collisions. + // + // Packages that define a Context key should provide type-safe accessors + // for the values stores using that key: + // + // // Package user defines a User type that's stored in Contexts. + // package user + // + // import "golang.org/x/net/context" + // + // // User is the type of value stored in the Contexts. + // type User struct {...} + // + // // key is an unexported type for keys defined in this package. + // // This prevents collisions with keys defined in other packages. + // type key int + // + // // userKey is the key for user.User values in Contexts. It is + // // unexported; clients use user.NewContext and user.FromContext + // // instead of using this key directly. + // var userKey key = 0 + // + // // NewContext returns a new Context that carries value u. + // func NewContext(ctx context.Context, u *User) context.Context { + // return context.WithValue(ctx, userKey, u) + // } + // + // // FromContext returns the User value stored in ctx, if any. + // func FromContext(ctx context.Context) (*User, bool) { + // u, ok := ctx.Value(userKey).(*User) + // return u, ok + // } + Value(key interface{}) interface{} +} + +// A CancelFunc tells an operation to abandon its work. +// A CancelFunc does not wait for the work to stop. +// After the first call, subsequent calls to a CancelFunc do nothing. +type CancelFunc func() diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/withtimeout_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/withtimeout_test.go new file mode 100644 index 0000000..e6f5669 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/context/withtimeout_test.go @@ -0,0 +1,31 @@ +// 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 context_test + +import ( + "fmt" + "time" + + "golang.org/x/net/context" +) + +// This example passes a context with a timeout to tell a blocking function that +// it should abandon its work after the timeout elapses. +func ExampleWithTimeout() { + // Pass a context with a timeout to tell a blocking function that it + // should abandon its work after the timeout elapses. + ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond) + defer cancel() + + select { + case <-time.After(1 * time.Second): + fmt.Println("overslept") + case <-ctx.Done(): + fmt.Println(ctx.Err()) // prints "context deadline exceeded" + } + + // Output: + // context deadline exceeded +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/dict/dict.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/dict/dict.go new file mode 100644 index 0000000..93e65c0 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/dict/dict.go @@ -0,0 +1,210 @@ +// 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 dict implements the Dictionary Server Protocol +// as defined in RFC 2229. +package dict // import "golang.org/x/net/dict" + +import ( + "net/textproto" + "strconv" + "strings" +) + +// A Client represents a client connection to a dictionary server. +type Client struct { + text *textproto.Conn +} + +// Dial returns a new client connected to a dictionary server at +// addr on the given network. +func Dial(network, addr string) (*Client, error) { + text, err := textproto.Dial(network, addr) + if err != nil { + return nil, err + } + _, _, err = text.ReadCodeLine(220) + if err != nil { + text.Close() + return nil, err + } + return &Client{text: text}, nil +} + +// Close closes the connection to the dictionary server. +func (c *Client) Close() error { + return c.text.Close() +} + +// A Dict represents a dictionary available on the server. +type Dict struct { + Name string // short name of dictionary + Desc string // long description +} + +// Dicts returns a list of the dictionaries available on the server. +func (c *Client) Dicts() ([]Dict, error) { + id, err := c.text.Cmd("SHOW DB") + if err != nil { + return nil, err + } + + c.text.StartResponse(id) + defer c.text.EndResponse(id) + + _, _, err = c.text.ReadCodeLine(110) + if err != nil { + return nil, err + } + lines, err := c.text.ReadDotLines() + if err != nil { + return nil, err + } + _, _, err = c.text.ReadCodeLine(250) + + dicts := make([]Dict, len(lines)) + for i := range dicts { + d := &dicts[i] + a, _ := fields(lines[i]) + if len(a) < 2 { + return nil, textproto.ProtocolError("invalid dictionary: " + lines[i]) + } + d.Name = a[0] + d.Desc = a[1] + } + return dicts, err +} + +// A Defn represents a definition. +type Defn struct { + Dict Dict // Dict where definition was found + Word string // Word being defined + Text []byte // Definition text, typically multiple lines +} + +// Define requests the definition of the given word. +// The argument dict names the dictionary to use, +// the Name field of a Dict returned by Dicts. +// +// The special dictionary name "*" means to look in all the +// server's dictionaries. +// The special dictionary name "!" means to look in all the +// server's dictionaries in turn, stopping after finding the word +// in one of them. +func (c *Client) Define(dict, word string) ([]*Defn, error) { + id, err := c.text.Cmd("DEFINE %s %q", dict, word) + if err != nil { + return nil, err + } + + c.text.StartResponse(id) + defer c.text.EndResponse(id) + + _, line, err := c.text.ReadCodeLine(150) + if err != nil { + return nil, err + } + a, _ := fields(line) + if len(a) < 1 { + return nil, textproto.ProtocolError("malformed response: " + line) + } + n, err := strconv.Atoi(a[0]) + if err != nil { + return nil, textproto.ProtocolError("invalid definition count: " + a[0]) + } + def := make([]*Defn, n) + for i := 0; i < n; i++ { + _, line, err = c.text.ReadCodeLine(151) + if err != nil { + return nil, err + } + a, _ := fields(line) + if len(a) < 3 { + // skip it, to keep protocol in sync + i-- + n-- + def = def[0:n] + continue + } + d := &Defn{Word: a[0], Dict: Dict{a[1], a[2]}} + d.Text, err = c.text.ReadDotBytes() + if err != nil { + return nil, err + } + def[i] = d + } + _, _, err = c.text.ReadCodeLine(250) + return def, err +} + +// Fields returns the fields in s. +// Fields are space separated unquoted words +// or quoted with single or double quote. +func fields(s string) ([]string, error) { + var v []string + i := 0 + for { + for i < len(s) && (s[i] == ' ' || s[i] == '\t') { + i++ + } + if i >= len(s) { + break + } + if s[i] == '"' || s[i] == '\'' { + q := s[i] + // quoted string + var j int + for j = i + 1; ; j++ { + if j >= len(s) { + return nil, textproto.ProtocolError("malformed quoted string") + } + if s[j] == '\\' { + j++ + continue + } + if s[j] == q { + j++ + break + } + } + v = append(v, unquote(s[i+1:j-1])) + i = j + } else { + // atom + var j int + for j = i; j < len(s); j++ { + if s[j] == ' ' || s[j] == '\t' || s[j] == '\\' || s[j] == '"' || s[j] == '\'' { + break + } + } + v = append(v, s[i:j]) + i = j + } + if i < len(s) { + c := s[i] + if c != ' ' && c != '\t' { + return nil, textproto.ProtocolError("quotes not on word boundaries") + } + } + } + return v, nil +} + +func unquote(s string) string { + if strings.Index(s, "\\") < 0 { + return s + } + b := []byte(s) + w := 0 + for r := 0; r < len(b); r++ { + c := b[r] + if c == '\\' { + r++ + c = b[r] + } + b[w] = c + w++ + } + return string(b[0:w]) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/dns/dnsmessage/example_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/dns/dnsmessage/example_test.go new file mode 100644 index 0000000..5415c2d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/dns/dnsmessage/example_test.go @@ -0,0 +1,132 @@ +// 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 dnsmessage_test + +import ( + "fmt" + "net" + "strings" + + "golang.org/x/net/dns/dnsmessage" +) + +func mustNewName(name string) dnsmessage.Name { + n, err := dnsmessage.NewName(name) + if err != nil { + panic(err) + } + return n +} + +func ExampleParser() { + msg := dnsmessage.Message{ + Header: dnsmessage.Header{Response: true, Authoritative: true}, + Questions: []dnsmessage.Question{ + { + Name: mustNewName("foo.bar.example.com."), + Type: dnsmessage.TypeA, + Class: dnsmessage.ClassINET, + }, + { + Name: mustNewName("bar.example.com."), + Type: dnsmessage.TypeA, + Class: dnsmessage.ClassINET, + }, + }, + Answers: []dnsmessage.Resource{ + { + dnsmessage.ResourceHeader{ + Name: mustNewName("foo.bar.example.com."), + Type: dnsmessage.TypeA, + Class: dnsmessage.ClassINET, + }, + &dnsmessage.AResource{[4]byte{127, 0, 0, 1}}, + }, + { + dnsmessage.ResourceHeader{ + Name: mustNewName("bar.example.com."), + Type: dnsmessage.TypeA, + Class: dnsmessage.ClassINET, + }, + &dnsmessage.AResource{[4]byte{127, 0, 0, 2}}, + }, + }, + } + + buf, err := msg.Pack() + if err != nil { + panic(err) + } + + wantName := "bar.example.com." + + var p dnsmessage.Parser + if _, err := p.Start(buf); err != nil { + panic(err) + } + + for { + q, err := p.Question() + if err == dnsmessage.ErrSectionDone { + break + } + if err != nil { + panic(err) + } + + if q.Name.String() != wantName { + continue + } + + fmt.Println("Found question for name", wantName) + if err := p.SkipAllQuestions(); err != nil { + panic(err) + } + break + } + + var gotIPs []net.IP + for { + h, err := p.AnswerHeader() + if err == dnsmessage.ErrSectionDone { + break + } + if err != nil { + panic(err) + } + + if (h.Type != dnsmessage.TypeA && h.Type != dnsmessage.TypeAAAA) || h.Class != dnsmessage.ClassINET { + continue + } + + if !strings.EqualFold(h.Name.String(), wantName) { + if err := p.SkipAnswer(); err != nil { + panic(err) + } + continue + } + + switch h.Type { + case dnsmessage.TypeA: + r, err := p.AResource() + if err != nil { + panic(err) + } + gotIPs = append(gotIPs, r.A[:]) + case dnsmessage.TypeAAAA: + r, err := p.AAAAResource() + if err != nil { + panic(err) + } + gotIPs = append(gotIPs, r.AAAA[:]) + } + } + + fmt.Printf("Found A/AAAA records for name %s: %v\n", wantName, gotIPs) + + // Output: + // Found question for name bar.example.com. + // Found A/AAAA records for name bar.example.com.: [127.0.0.2] +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/dns/dnsmessage/message.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/dns/dnsmessage/message.go new file mode 100644 index 0000000..19b260d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/dns/dnsmessage/message.go @@ -0,0 +1,1997 @@ +// 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 dnsmessage provides a mostly RFC 1035 compliant implementation of +// DNS message packing and unpacking. +// +// This implementation is designed to minimize heap allocations and avoid +// unnecessary packing and unpacking as much as possible. +package dnsmessage + +import ( + "errors" +) + +// Packet formats + +// A Type is a type of DNS request and response. +type Type uint16 + +// A Class is a type of network. +type Class uint16 + +// An OpCode is a DNS operation code. +type OpCode uint16 + +// An RCode is a DNS response status code. +type RCode uint16 + +// Wire constants. +const ( + // ResourceHeader.Type and Question.Type + TypeA Type = 1 + TypeNS Type = 2 + TypeCNAME Type = 5 + TypeSOA Type = 6 + TypePTR Type = 12 + TypeMX Type = 15 + TypeTXT Type = 16 + TypeAAAA Type = 28 + TypeSRV Type = 33 + + // Question.Type + TypeWKS Type = 11 + TypeHINFO Type = 13 + TypeMINFO Type = 14 + TypeAXFR Type = 252 + TypeALL Type = 255 + + // ResourceHeader.Class and Question.Class + ClassINET Class = 1 + ClassCSNET Class = 2 + ClassCHAOS Class = 3 + ClassHESIOD Class = 4 + + // Question.Class + ClassANY Class = 255 + + // Message.Rcode + RCodeSuccess RCode = 0 + RCodeFormatError RCode = 1 + RCodeServerFailure RCode = 2 + RCodeNameError RCode = 3 + RCodeNotImplemented RCode = 4 + RCodeRefused RCode = 5 +) + +var ( + // ErrNotStarted indicates that the prerequisite information isn't + // available yet because the previous records haven't been appropriately + // parsed, skipped or finished. + ErrNotStarted = errors.New("parsing/packing of this type isn't available yet") + + // ErrSectionDone indicated that all records in the section have been + // parsed or finished. + ErrSectionDone = errors.New("parsing/packing of this section has completed") + + errBaseLen = errors.New("insufficient data for base length type") + errCalcLen = errors.New("insufficient data for calculated length type") + errReserved = errors.New("segment prefix is reserved") + errTooManyPtr = errors.New("too many pointers (>10)") + errInvalidPtr = errors.New("invalid pointer") + errNilResouceBody = errors.New("nil resource body") + errResourceLen = errors.New("insufficient data for resource body length") + errSegTooLong = errors.New("segment length too long") + errZeroSegLen = errors.New("zero length segment") + errResTooLong = errors.New("resource length too long") + errTooManyQuestions = errors.New("too many Questions to pack (>65535)") + errTooManyAnswers = errors.New("too many Answers to pack (>65535)") + errTooManyAuthorities = errors.New("too many Authorities to pack (>65535)") + errTooManyAdditionals = errors.New("too many Additionals to pack (>65535)") + errNonCanonicalName = errors.New("name is not in canonical format (it must end with a .)") +) + +// Internal constants. +const ( + // packStartingCap is the default initial buffer size allocated during + // packing. + // + // The starting capacity doesn't matter too much, but most DNS responses + // Will be <= 512 bytes as it is the limit for DNS over UDP. + packStartingCap = 512 + + // uint16Len is the length (in bytes) of a uint16. + uint16Len = 2 + + // uint32Len is the length (in bytes) of a uint32. + uint32Len = 4 + + // headerLen is the length (in bytes) of a DNS header. + // + // A header is comprised of 6 uint16s and no padding. + headerLen = 6 * uint16Len +) + +type nestedError struct { + // s is the current level's error message. + s string + + // err is the nested error. + err error +} + +// nestedError implements error.Error. +func (e *nestedError) Error() string { + return e.s + ": " + e.err.Error() +} + +// Header is a representation of a DNS message header. +type Header struct { + ID uint16 + Response bool + OpCode OpCode + Authoritative bool + Truncated bool + RecursionDesired bool + RecursionAvailable bool + RCode RCode +} + +func (m *Header) pack() (id uint16, bits uint16) { + id = m.ID + bits = uint16(m.OpCode)<<11 | uint16(m.RCode) + if m.RecursionAvailable { + bits |= headerBitRA + } + if m.RecursionDesired { + bits |= headerBitRD + } + if m.Truncated { + bits |= headerBitTC + } + if m.Authoritative { + bits |= headerBitAA + } + if m.Response { + bits |= headerBitQR + } + return +} + +// Message is a representation of a DNS message. +type Message struct { + Header + Questions []Question + Answers []Resource + Authorities []Resource + Additionals []Resource +} + +type section uint8 + +const ( + sectionNotStarted section = iota + sectionHeader + sectionQuestions + sectionAnswers + sectionAuthorities + sectionAdditionals + sectionDone + + headerBitQR = 1 << 15 // query/response (response=1) + headerBitAA = 1 << 10 // authoritative + headerBitTC = 1 << 9 // truncated + headerBitRD = 1 << 8 // recursion desired + headerBitRA = 1 << 7 // recursion available +) + +var sectionNames = map[section]string{ + sectionHeader: "header", + sectionQuestions: "Question", + sectionAnswers: "Answer", + sectionAuthorities: "Authority", + sectionAdditionals: "Additional", +} + +// header is the wire format for a DNS message header. +type header struct { + id uint16 + bits uint16 + questions uint16 + answers uint16 + authorities uint16 + additionals uint16 +} + +func (h *header) count(sec section) uint16 { + switch sec { + case sectionQuestions: + return h.questions + case sectionAnswers: + return h.answers + case sectionAuthorities: + return h.authorities + case sectionAdditionals: + return h.additionals + } + return 0 +} + +func (h *header) pack(msg []byte) []byte { + msg = packUint16(msg, h.id) + msg = packUint16(msg, h.bits) + msg = packUint16(msg, h.questions) + msg = packUint16(msg, h.answers) + msg = packUint16(msg, h.authorities) + return packUint16(msg, h.additionals) +} + +func (h *header) unpack(msg []byte, off int) (int, error) { + newOff := off + var err error + if h.id, newOff, err = unpackUint16(msg, newOff); err != nil { + return off, &nestedError{"id", err} + } + if h.bits, newOff, err = unpackUint16(msg, newOff); err != nil { + return off, &nestedError{"bits", err} + } + if h.questions, newOff, err = unpackUint16(msg, newOff); err != nil { + return off, &nestedError{"questions", err} + } + if h.answers, newOff, err = unpackUint16(msg, newOff); err != nil { + return off, &nestedError{"answers", err} + } + if h.authorities, newOff, err = unpackUint16(msg, newOff); err != nil { + return off, &nestedError{"authorities", err} + } + if h.additionals, newOff, err = unpackUint16(msg, newOff); err != nil { + return off, &nestedError{"additionals", err} + } + return newOff, nil +} + +func (h *header) header() Header { + return Header{ + ID: h.id, + Response: (h.bits & headerBitQR) != 0, + OpCode: OpCode(h.bits>>11) & 0xF, + Authoritative: (h.bits & headerBitAA) != 0, + Truncated: (h.bits & headerBitTC) != 0, + RecursionDesired: (h.bits & headerBitRD) != 0, + RecursionAvailable: (h.bits & headerBitRA) != 0, + RCode: RCode(h.bits & 0xF), + } +} + +// A Resource is a DNS resource record. +type Resource struct { + Header ResourceHeader + Body ResourceBody +} + +// A ResourceBody is a DNS resource record minus the header. +type ResourceBody interface { + // pack packs a Resource except for its header. + pack(msg []byte, compression map[string]int) ([]byte, error) + + // realType returns the actual type of the Resource. This is used to + // fill in the header Type field. + realType() Type +} + +func (r *Resource) pack(msg []byte, compression map[string]int) ([]byte, error) { + if r.Body == nil { + return msg, errNilResouceBody + } + oldMsg := msg + r.Header.Type = r.Body.realType() + msg, length, err := r.Header.pack(msg, compression) + if err != nil { + return msg, &nestedError{"ResourceHeader", err} + } + preLen := len(msg) + msg, err = r.Body.pack(msg, compression) + if err != nil { + return msg, &nestedError{"content", err} + } + if err := r.Header.fixLen(msg, length, preLen); err != nil { + return oldMsg, err + } + return msg, nil +} + +// A Parser allows incrementally parsing a DNS message. +// +// When parsing is started, the Header is parsed. Next, each Question can be +// either parsed or skipped. Alternatively, all Questions can be skipped at +// once. When all Questions have been parsed, attempting to parse Questions +// will return (nil, nil) and attempting to skip Questions will return +// (true, nil). After all Questions have been either parsed or skipped, all +// Answers, Authorities and Additionals can be either parsed or skipped in the +// same way, and each type of Resource must be fully parsed or skipped before +// proceeding to the next type of Resource. +// +// Note that there is no requirement to fully skip or parse the message. +type Parser struct { + msg []byte + header header + + section section + off int + index int + resHeaderValid bool + resHeader ResourceHeader +} + +// Start parses the header and enables the parsing of Questions. +func (p *Parser) Start(msg []byte) (Header, error) { + if p.msg != nil { + *p = Parser{} + } + p.msg = msg + var err error + if p.off, err = p.header.unpack(msg, 0); err != nil { + return Header{}, &nestedError{"unpacking header", err} + } + p.section = sectionQuestions + return p.header.header(), nil +} + +func (p *Parser) checkAdvance(sec section) error { + if p.section < sec { + return ErrNotStarted + } + if p.section > sec { + return ErrSectionDone + } + p.resHeaderValid = false + if p.index == int(p.header.count(sec)) { + p.index = 0 + p.section++ + return ErrSectionDone + } + return nil +} + +func (p *Parser) resource(sec section) (Resource, error) { + var r Resource + var err error + r.Header, err = p.resourceHeader(sec) + if err != nil { + return r, err + } + p.resHeaderValid = false + r.Body, p.off, err = unpackResourceBody(p.msg, p.off, r.Header) + if err != nil { + return Resource{}, &nestedError{"unpacking " + sectionNames[sec], err} + } + p.index++ + return r, nil +} + +func (p *Parser) resourceHeader(sec section) (ResourceHeader, error) { + if p.resHeaderValid { + return p.resHeader, nil + } + if err := p.checkAdvance(sec); err != nil { + return ResourceHeader{}, err + } + var hdr ResourceHeader + off, err := hdr.unpack(p.msg, p.off) + if err != nil { + return ResourceHeader{}, err + } + p.resHeaderValid = true + p.resHeader = hdr + p.off = off + return hdr, nil +} + +func (p *Parser) skipResource(sec section) error { + if p.resHeaderValid { + newOff := p.off + int(p.resHeader.Length) + if newOff > len(p.msg) { + return errResourceLen + } + p.off = newOff + p.resHeaderValid = false + p.index++ + return nil + } + if err := p.checkAdvance(sec); err != nil { + return err + } + var err error + p.off, err = skipResource(p.msg, p.off) + if err != nil { + return &nestedError{"skipping: " + sectionNames[sec], err} + } + p.index++ + return nil +} + +// Question parses a single Question. +func (p *Parser) Question() (Question, error) { + if err := p.checkAdvance(sectionQuestions); err != nil { + return Question{}, err + } + var name Name + off, err := name.unpack(p.msg, p.off) + if err != nil { + return Question{}, &nestedError{"unpacking Question.Name", err} + } + typ, off, err := unpackType(p.msg, off) + if err != nil { + return Question{}, &nestedError{"unpacking Question.Type", err} + } + class, off, err := unpackClass(p.msg, off) + if err != nil { + return Question{}, &nestedError{"unpacking Question.Class", err} + } + p.off = off + p.index++ + return Question{name, typ, class}, nil +} + +// AllQuestions parses all Questions. +func (p *Parser) AllQuestions() ([]Question, error) { + qs := make([]Question, 0, p.header.questions) + for { + q, err := p.Question() + if err == ErrSectionDone { + return qs, nil + } + if err != nil { + return nil, err + } + qs = append(qs, q) + } +} + +// SkipQuestion skips a single Question. +func (p *Parser) SkipQuestion() error { + if err := p.checkAdvance(sectionQuestions); err != nil { + return err + } + off, err := skipName(p.msg, p.off) + if err != nil { + return &nestedError{"skipping Question Name", err} + } + if off, err = skipType(p.msg, off); err != nil { + return &nestedError{"skipping Question Type", err} + } + if off, err = skipClass(p.msg, off); err != nil { + return &nestedError{"skipping Question Class", err} + } + p.off = off + p.index++ + return nil +} + +// SkipAllQuestions skips all Questions. +func (p *Parser) SkipAllQuestions() error { + for { + if err := p.SkipQuestion(); err == ErrSectionDone { + return nil + } else if err != nil { + return err + } + } +} + +// AnswerHeader parses a single Answer ResourceHeader. +func (p *Parser) AnswerHeader() (ResourceHeader, error) { + return p.resourceHeader(sectionAnswers) +} + +// Answer parses a single Answer Resource. +func (p *Parser) Answer() (Resource, error) { + return p.resource(sectionAnswers) +} + +// AllAnswers parses all Answer Resources. +func (p *Parser) AllAnswers() ([]Resource, error) { + as := make([]Resource, 0, p.header.answers) + for { + a, err := p.Answer() + if err == ErrSectionDone { + return as, nil + } + if err != nil { + return nil, err + } + as = append(as, a) + } +} + +// SkipAnswer skips a single Answer Resource. +func (p *Parser) SkipAnswer() error { + return p.skipResource(sectionAnswers) +} + +// SkipAllAnswers skips all Answer Resources. +func (p *Parser) SkipAllAnswers() error { + for { + if err := p.SkipAnswer(); err == ErrSectionDone { + return nil + } else if err != nil { + return err + } + } +} + +// AuthorityHeader parses a single Authority ResourceHeader. +func (p *Parser) AuthorityHeader() (ResourceHeader, error) { + return p.resourceHeader(sectionAuthorities) +} + +// Authority parses a single Authority Resource. +func (p *Parser) Authority() (Resource, error) { + return p.resource(sectionAuthorities) +} + +// AllAuthorities parses all Authority Resources. +func (p *Parser) AllAuthorities() ([]Resource, error) { + as := make([]Resource, 0, p.header.authorities) + for { + a, err := p.Authority() + if err == ErrSectionDone { + return as, nil + } + if err != nil { + return nil, err + } + as = append(as, a) + } +} + +// SkipAuthority skips a single Authority Resource. +func (p *Parser) SkipAuthority() error { + return p.skipResource(sectionAuthorities) +} + +// SkipAllAuthorities skips all Authority Resources. +func (p *Parser) SkipAllAuthorities() error { + for { + if err := p.SkipAuthority(); err == ErrSectionDone { + return nil + } else if err != nil { + return err + } + } +} + +// AdditionalHeader parses a single Additional ResourceHeader. +func (p *Parser) AdditionalHeader() (ResourceHeader, error) { + return p.resourceHeader(sectionAdditionals) +} + +// Additional parses a single Additional Resource. +func (p *Parser) Additional() (Resource, error) { + return p.resource(sectionAdditionals) +} + +// AllAdditionals parses all Additional Resources. +func (p *Parser) AllAdditionals() ([]Resource, error) { + as := make([]Resource, 0, p.header.additionals) + for { + a, err := p.Additional() + if err == ErrSectionDone { + return as, nil + } + if err != nil { + return nil, err + } + as = append(as, a) + } +} + +// SkipAdditional skips a single Additional Resource. +func (p *Parser) SkipAdditional() error { + return p.skipResource(sectionAdditionals) +} + +// SkipAllAdditionals skips all Additional Resources. +func (p *Parser) SkipAllAdditionals() error { + for { + if err := p.SkipAdditional(); err == ErrSectionDone { + return nil + } else if err != nil { + return err + } + } +} + +// CNAMEResource parses a single CNAMEResource. +// +// One of the XXXHeader methods must have been called before calling this +// method. +func (p *Parser) CNAMEResource() (CNAMEResource, error) { + if !p.resHeaderValid || p.resHeader.Type != TypeCNAME { + return CNAMEResource{}, ErrNotStarted + } + r, err := unpackCNAMEResource(p.msg, p.off) + if err != nil { + return CNAMEResource{}, err + } + p.off += int(p.resHeader.Length) + p.resHeaderValid = false + p.index++ + return r, nil +} + +// MXResource parses a single MXResource. +// +// One of the XXXHeader methods must have been called before calling this +// method. +func (p *Parser) MXResource() (MXResource, error) { + if !p.resHeaderValid || p.resHeader.Type != TypeMX { + return MXResource{}, ErrNotStarted + } + r, err := unpackMXResource(p.msg, p.off) + if err != nil { + return MXResource{}, err + } + p.off += int(p.resHeader.Length) + p.resHeaderValid = false + p.index++ + return r, nil +} + +// NSResource parses a single NSResource. +// +// One of the XXXHeader methods must have been called before calling this +// method. +func (p *Parser) NSResource() (NSResource, error) { + if !p.resHeaderValid || p.resHeader.Type != TypeNS { + return NSResource{}, ErrNotStarted + } + r, err := unpackNSResource(p.msg, p.off) + if err != nil { + return NSResource{}, err + } + p.off += int(p.resHeader.Length) + p.resHeaderValid = false + p.index++ + return r, nil +} + +// PTRResource parses a single PTRResource. +// +// One of the XXXHeader methods must have been called before calling this +// method. +func (p *Parser) PTRResource() (PTRResource, error) { + if !p.resHeaderValid || p.resHeader.Type != TypePTR { + return PTRResource{}, ErrNotStarted + } + r, err := unpackPTRResource(p.msg, p.off) + if err != nil { + return PTRResource{}, err + } + p.off += int(p.resHeader.Length) + p.resHeaderValid = false + p.index++ + return r, nil +} + +// SOAResource parses a single SOAResource. +// +// One of the XXXHeader methods must have been called before calling this +// method. +func (p *Parser) SOAResource() (SOAResource, error) { + if !p.resHeaderValid || p.resHeader.Type != TypeSOA { + return SOAResource{}, ErrNotStarted + } + r, err := unpackSOAResource(p.msg, p.off) + if err != nil { + return SOAResource{}, err + } + p.off += int(p.resHeader.Length) + p.resHeaderValid = false + p.index++ + return r, nil +} + +// TXTResource parses a single TXTResource. +// +// One of the XXXHeader methods must have been called before calling this +// method. +func (p *Parser) TXTResource() (TXTResource, error) { + if !p.resHeaderValid || p.resHeader.Type != TypeTXT { + return TXTResource{}, ErrNotStarted + } + r, err := unpackTXTResource(p.msg, p.off, p.resHeader.Length) + if err != nil { + return TXTResource{}, err + } + p.off += int(p.resHeader.Length) + p.resHeaderValid = false + p.index++ + return r, nil +} + +// SRVResource parses a single SRVResource. +// +// One of the XXXHeader methods must have been called before calling this +// method. +func (p *Parser) SRVResource() (SRVResource, error) { + if !p.resHeaderValid || p.resHeader.Type != TypeSRV { + return SRVResource{}, ErrNotStarted + } + r, err := unpackSRVResource(p.msg, p.off) + if err != nil { + return SRVResource{}, err + } + p.off += int(p.resHeader.Length) + p.resHeaderValid = false + p.index++ + return r, nil +} + +// AResource parses a single AResource. +// +// One of the XXXHeader methods must have been called before calling this +// method. +func (p *Parser) AResource() (AResource, error) { + if !p.resHeaderValid || p.resHeader.Type != TypeA { + return AResource{}, ErrNotStarted + } + r, err := unpackAResource(p.msg, p.off) + if err != nil { + return AResource{}, err + } + p.off += int(p.resHeader.Length) + p.resHeaderValid = false + p.index++ + return r, nil +} + +// AAAAResource parses a single AAAAResource. +// +// One of the XXXHeader methods must have been called before calling this +// method. +func (p *Parser) AAAAResource() (AAAAResource, error) { + if !p.resHeaderValid || p.resHeader.Type != TypeAAAA { + return AAAAResource{}, ErrNotStarted + } + r, err := unpackAAAAResource(p.msg, p.off) + if err != nil { + return AAAAResource{}, err + } + p.off += int(p.resHeader.Length) + p.resHeaderValid = false + p.index++ + return r, nil +} + +// Unpack parses a full Message. +func (m *Message) Unpack(msg []byte) error { + var p Parser + var err error + if m.Header, err = p.Start(msg); err != nil { + return err + } + if m.Questions, err = p.AllQuestions(); err != nil { + return err + } + if m.Answers, err = p.AllAnswers(); err != nil { + return err + } + if m.Authorities, err = p.AllAuthorities(); err != nil { + return err + } + if m.Additionals, err = p.AllAdditionals(); err != nil { + return err + } + return nil +} + +// Pack packs a full Message. +func (m *Message) Pack() ([]byte, error) { + // Validate the lengths. It is very unlikely that anyone will try to + // pack more than 65535 of any particular type, but it is possible and + // we should fail gracefully. + if len(m.Questions) > int(^uint16(0)) { + return nil, errTooManyQuestions + } + if len(m.Answers) > int(^uint16(0)) { + return nil, errTooManyAnswers + } + if len(m.Authorities) > int(^uint16(0)) { + return nil, errTooManyAuthorities + } + if len(m.Additionals) > int(^uint16(0)) { + return nil, errTooManyAdditionals + } + + var h header + h.id, h.bits = m.Header.pack() + + h.questions = uint16(len(m.Questions)) + h.answers = uint16(len(m.Answers)) + h.authorities = uint16(len(m.Authorities)) + h.additionals = uint16(len(m.Additionals)) + + msg := make([]byte, 0, packStartingCap) + + msg = h.pack(msg) + + // RFC 1035 allows (but does not require) compression for packing. RFC + // 1035 requires unpacking implementations to support compression, so + // unconditionally enabling it is fine. + // + // DNS lookups are typically done over UDP, and RFC 1035 states that UDP + // DNS packets can be a maximum of 512 bytes long. Without compression, + // many DNS response packets are over this limit, so enabling + // compression will help ensure compliance. + compression := map[string]int{} + + for i := range m.Questions { + var err error + if msg, err = m.Questions[i].pack(msg, compression); err != nil { + return nil, &nestedError{"packing Question", err} + } + } + for i := range m.Answers { + var err error + if msg, err = m.Answers[i].pack(msg, compression); err != nil { + return nil, &nestedError{"packing Answer", err} + } + } + for i := range m.Authorities { + var err error + if msg, err = m.Authorities[i].pack(msg, compression); err != nil { + return nil, &nestedError{"packing Authority", err} + } + } + for i := range m.Additionals { + var err error + if msg, err = m.Additionals[i].pack(msg, compression); err != nil { + return nil, &nestedError{"packing Additional", err} + } + } + + return msg, nil +} + +// A Builder allows incrementally packing a DNS message. +type Builder struct { + msg []byte + header header + section section + compression map[string]int +} + +// Start initializes the builder. +// +// buf is optional (nil is fine), but if provided, Start takes ownership of buf. +func (b *Builder) Start(buf []byte, h Header) { + b.StartWithoutCompression(buf, h) + b.compression = map[string]int{} +} + +// StartWithoutCompression initializes the builder with compression disabled. +// +// This avoids compression related allocations, but can result in larger message +// sizes. Be careful with this mode as it can cause messages to exceed the UDP +// size limit. +// +// buf is optional (nil is fine), but if provided, Start takes ownership of buf. +func (b *Builder) StartWithoutCompression(buf []byte, h Header) { + *b = Builder{msg: buf} + b.header.id, b.header.bits = h.pack() + if cap(b.msg) < headerLen { + b.msg = make([]byte, 0, packStartingCap) + } + b.msg = b.msg[:headerLen] + b.section = sectionHeader +} + +func (b *Builder) startCheck(s section) error { + if b.section <= sectionNotStarted { + return ErrNotStarted + } + if b.section > s { + return ErrSectionDone + } + return nil +} + +// StartQuestions prepares the builder for packing Questions. +func (b *Builder) StartQuestions() error { + if err := b.startCheck(sectionQuestions); err != nil { + return err + } + b.section = sectionQuestions + return nil +} + +// StartAnswers prepares the builder for packing Answers. +func (b *Builder) StartAnswers() error { + if err := b.startCheck(sectionAnswers); err != nil { + return err + } + b.section = sectionAnswers + return nil +} + +// StartAuthorities prepares the builder for packing Authorities. +func (b *Builder) StartAuthorities() error { + if err := b.startCheck(sectionAuthorities); err != nil { + return err + } + b.section = sectionAuthorities + return nil +} + +// StartAdditionals prepares the builder for packing Additionals. +func (b *Builder) StartAdditionals() error { + if err := b.startCheck(sectionAdditionals); err != nil { + return err + } + b.section = sectionAdditionals + return nil +} + +func (b *Builder) incrementSectionCount() error { + var count *uint16 + var err error + switch b.section { + case sectionQuestions: + count = &b.header.questions + err = errTooManyQuestions + case sectionAnswers: + count = &b.header.answers + err = errTooManyAnswers + case sectionAuthorities: + count = &b.header.authorities + err = errTooManyAuthorities + case sectionAdditionals: + count = &b.header.additionals + err = errTooManyAdditionals + } + if *count == ^uint16(0) { + return err + } + *count++ + return nil +} + +// Question adds a single Question. +func (b *Builder) Question(q Question) error { + if b.section < sectionQuestions { + return ErrNotStarted + } + if b.section > sectionQuestions { + return ErrSectionDone + } + msg, err := q.pack(b.msg, b.compression) + if err != nil { + return err + } + if err := b.incrementSectionCount(); err != nil { + return err + } + b.msg = msg + return nil +} + +func (b *Builder) checkResourceSection() error { + if b.section < sectionAnswers { + return ErrNotStarted + } + if b.section > sectionAdditionals { + return ErrSectionDone + } + return nil +} + +// CNAMEResource adds a single CNAMEResource. +func (b *Builder) CNAMEResource(h ResourceHeader, r CNAMEResource) error { + if err := b.checkResourceSection(); err != nil { + return err + } + h.Type = r.realType() + msg, length, err := h.pack(b.msg, b.compression) + if err != nil { + return &nestedError{"ResourceHeader", err} + } + preLen := len(msg) + if msg, err = r.pack(msg, b.compression); err != nil { + return &nestedError{"CNAMEResource body", err} + } + if err := h.fixLen(msg, length, preLen); err != nil { + return err + } + if err := b.incrementSectionCount(); err != nil { + return err + } + b.msg = msg + return nil +} + +// MXResource adds a single MXResource. +func (b *Builder) MXResource(h ResourceHeader, r MXResource) error { + if err := b.checkResourceSection(); err != nil { + return err + } + h.Type = r.realType() + msg, length, err := h.pack(b.msg, b.compression) + if err != nil { + return &nestedError{"ResourceHeader", err} + } + preLen := len(msg) + if msg, err = r.pack(msg, b.compression); err != nil { + return &nestedError{"MXResource body", err} + } + if err := h.fixLen(msg, length, preLen); err != nil { + return err + } + if err := b.incrementSectionCount(); err != nil { + return err + } + b.msg = msg + return nil +} + +// NSResource adds a single NSResource. +func (b *Builder) NSResource(h ResourceHeader, r NSResource) error { + if err := b.checkResourceSection(); err != nil { + return err + } + h.Type = r.realType() + msg, length, err := h.pack(b.msg, b.compression) + if err != nil { + return &nestedError{"ResourceHeader", err} + } + preLen := len(msg) + if msg, err = r.pack(msg, b.compression); err != nil { + return &nestedError{"NSResource body", err} + } + if err := h.fixLen(msg, length, preLen); err != nil { + return err + } + if err := b.incrementSectionCount(); err != nil { + return err + } + b.msg = msg + return nil +} + +// PTRResource adds a single PTRResource. +func (b *Builder) PTRResource(h ResourceHeader, r PTRResource) error { + if err := b.checkResourceSection(); err != nil { + return err + } + h.Type = r.realType() + msg, length, err := h.pack(b.msg, b.compression) + if err != nil { + return &nestedError{"ResourceHeader", err} + } + preLen := len(msg) + if msg, err = r.pack(msg, b.compression); err != nil { + return &nestedError{"PTRResource body", err} + } + if err := h.fixLen(msg, length, preLen); err != nil { + return err + } + if err := b.incrementSectionCount(); err != nil { + return err + } + b.msg = msg + return nil +} + +// SOAResource adds a single SOAResource. +func (b *Builder) SOAResource(h ResourceHeader, r SOAResource) error { + if err := b.checkResourceSection(); err != nil { + return err + } + h.Type = r.realType() + msg, length, err := h.pack(b.msg, b.compression) + if err != nil { + return &nestedError{"ResourceHeader", err} + } + preLen := len(msg) + if msg, err = r.pack(msg, b.compression); err != nil { + return &nestedError{"SOAResource body", err} + } + if err := h.fixLen(msg, length, preLen); err != nil { + return err + } + if err := b.incrementSectionCount(); err != nil { + return err + } + b.msg = msg + return nil +} + +// TXTResource adds a single TXTResource. +func (b *Builder) TXTResource(h ResourceHeader, r TXTResource) error { + if err := b.checkResourceSection(); err != nil { + return err + } + h.Type = r.realType() + msg, length, err := h.pack(b.msg, b.compression) + if err != nil { + return &nestedError{"ResourceHeader", err} + } + preLen := len(msg) + if msg, err = r.pack(msg, b.compression); err != nil { + return &nestedError{"TXTResource body", err} + } + if err := h.fixLen(msg, length, preLen); err != nil { + return err + } + if err := b.incrementSectionCount(); err != nil { + return err + } + b.msg = msg + return nil +} + +// SRVResource adds a single SRVResource. +func (b *Builder) SRVResource(h ResourceHeader, r SRVResource) error { + if err := b.checkResourceSection(); err != nil { + return err + } + h.Type = r.realType() + msg, length, err := h.pack(b.msg, b.compression) + if err != nil { + return &nestedError{"ResourceHeader", err} + } + preLen := len(msg) + if msg, err = r.pack(msg, b.compression); err != nil { + return &nestedError{"SRVResource body", err} + } + if err := h.fixLen(msg, length, preLen); err != nil { + return err + } + if err := b.incrementSectionCount(); err != nil { + return err + } + b.msg = msg + return nil +} + +// AResource adds a single AResource. +func (b *Builder) AResource(h ResourceHeader, r AResource) error { + if err := b.checkResourceSection(); err != nil { + return err + } + h.Type = r.realType() + msg, length, err := h.pack(b.msg, b.compression) + if err != nil { + return &nestedError{"ResourceHeader", err} + } + preLen := len(msg) + if msg, err = r.pack(msg, b.compression); err != nil { + return &nestedError{"AResource body", err} + } + if err := h.fixLen(msg, length, preLen); err != nil { + return err + } + if err := b.incrementSectionCount(); err != nil { + return err + } + b.msg = msg + return nil +} + +// AAAAResource adds a single AAAAResource. +func (b *Builder) AAAAResource(h ResourceHeader, r AAAAResource) error { + if err := b.checkResourceSection(); err != nil { + return err + } + h.Type = r.realType() + msg, length, err := h.pack(b.msg, b.compression) + if err != nil { + return &nestedError{"ResourceHeader", err} + } + preLen := len(msg) + if msg, err = r.pack(msg, b.compression); err != nil { + return &nestedError{"AAAAResource body", err} + } + if err := h.fixLen(msg, length, preLen); err != nil { + return err + } + if err := b.incrementSectionCount(); err != nil { + return err + } + b.msg = msg + return nil +} + +// Finish ends message building and generates a binary packet. +func (b *Builder) Finish() ([]byte, error) { + if b.section < sectionHeader { + return nil, ErrNotStarted + } + b.section = sectionDone + b.header.pack(b.msg[:0]) + return b.msg, nil +} + +// A ResourceHeader is the header of a DNS resource record. There are +// many types of DNS resource records, but they all share the same header. +type ResourceHeader struct { + // Name is the domain name for which this resource record pertains. + Name Name + + // Type is the type of DNS resource record. + // + // This field will be set automatically during packing. + Type Type + + // Class is the class of network to which this DNS resource record + // pertains. + Class Class + + // TTL is the length of time (measured in seconds) which this resource + // record is valid for (time to live). All Resources in a set should + // have the same TTL (RFC 2181 Section 5.2). + TTL uint32 + + // Length is the length of data in the resource record after the header. + // + // This field will be set automatically during packing. + Length uint16 +} + +// pack packs all of the fields in a ResourceHeader except for the length. The +// length bytes are returned as a slice so they can be filled in after the rest +// of the Resource has been packed. +func (h *ResourceHeader) pack(oldMsg []byte, compression map[string]int) (msg []byte, length []byte, err error) { + msg = oldMsg + if msg, err = h.Name.pack(msg, compression); err != nil { + return oldMsg, nil, &nestedError{"Name", err} + } + msg = packType(msg, h.Type) + msg = packClass(msg, h.Class) + msg = packUint32(msg, h.TTL) + lenBegin := len(msg) + msg = packUint16(msg, h.Length) + return msg, msg[lenBegin : lenBegin+uint16Len], nil +} + +func (h *ResourceHeader) unpack(msg []byte, off int) (int, error) { + newOff := off + var err error + if newOff, err = h.Name.unpack(msg, newOff); err != nil { + return off, &nestedError{"Name", err} + } + if h.Type, newOff, err = unpackType(msg, newOff); err != nil { + return off, &nestedError{"Type", err} + } + if h.Class, newOff, err = unpackClass(msg, newOff); err != nil { + return off, &nestedError{"Class", err} + } + if h.TTL, newOff, err = unpackUint32(msg, newOff); err != nil { + return off, &nestedError{"TTL", err} + } + if h.Length, newOff, err = unpackUint16(msg, newOff); err != nil { + return off, &nestedError{"Length", err} + } + return newOff, nil +} + +func (h *ResourceHeader) fixLen(msg []byte, length []byte, preLen int) error { + conLen := len(msg) - preLen + if conLen > int(^uint16(0)) { + return errResTooLong + } + + // Fill in the length now that we know how long the content is. + packUint16(length[:0], uint16(conLen)) + h.Length = uint16(conLen) + + return nil +} + +func skipResource(msg []byte, off int) (int, error) { + newOff, err := skipName(msg, off) + if err != nil { + return off, &nestedError{"Name", err} + } + if newOff, err = skipType(msg, newOff); err != nil { + return off, &nestedError{"Type", err} + } + if newOff, err = skipClass(msg, newOff); err != nil { + return off, &nestedError{"Class", err} + } + if newOff, err = skipUint32(msg, newOff); err != nil { + return off, &nestedError{"TTL", err} + } + length, newOff, err := unpackUint16(msg, newOff) + if err != nil { + return off, &nestedError{"Length", err} + } + if newOff += int(length); newOff > len(msg) { + return off, errResourceLen + } + return newOff, nil +} + +func packUint16(msg []byte, field uint16) []byte { + return append(msg, byte(field>>8), byte(field)) +} + +func unpackUint16(msg []byte, off int) (uint16, int, error) { + if off+uint16Len > len(msg) { + return 0, off, errBaseLen + } + return uint16(msg[off])<<8 | uint16(msg[off+1]), off + uint16Len, nil +} + +func skipUint16(msg []byte, off int) (int, error) { + if off+uint16Len > len(msg) { + return off, errBaseLen + } + return off + uint16Len, nil +} + +func packType(msg []byte, field Type) []byte { + return packUint16(msg, uint16(field)) +} + +func unpackType(msg []byte, off int) (Type, int, error) { + t, o, err := unpackUint16(msg, off) + return Type(t), o, err +} + +func skipType(msg []byte, off int) (int, error) { + return skipUint16(msg, off) +} + +func packClass(msg []byte, field Class) []byte { + return packUint16(msg, uint16(field)) +} + +func unpackClass(msg []byte, off int) (Class, int, error) { + c, o, err := unpackUint16(msg, off) + return Class(c), o, err +} + +func skipClass(msg []byte, off int) (int, error) { + return skipUint16(msg, off) +} + +func packUint32(msg []byte, field uint32) []byte { + return append( + msg, + byte(field>>24), + byte(field>>16), + byte(field>>8), + byte(field), + ) +} + +func unpackUint32(msg []byte, off int) (uint32, int, error) { + if off+uint32Len > len(msg) { + return 0, off, errBaseLen + } + v := uint32(msg[off])<<24 | uint32(msg[off+1])<<16 | uint32(msg[off+2])<<8 | uint32(msg[off+3]) + return v, off + uint32Len, nil +} + +func skipUint32(msg []byte, off int) (int, error) { + if off+uint32Len > len(msg) { + return off, errBaseLen + } + return off + uint32Len, nil +} + +func packText(msg []byte, field string) []byte { + for len(field) > 0 { + l := len(field) + if l > 255 { + l = 255 + } + msg = append(msg, byte(l)) + msg = append(msg, field[:l]...) + field = field[l:] + } + return msg +} + +func unpackText(msg []byte, off int) (string, int, error) { + if off >= len(msg) { + return "", off, errBaseLen + } + beginOff := off + 1 + endOff := beginOff + int(msg[off]) + if endOff > len(msg) { + return "", off, errCalcLen + } + return string(msg[beginOff:endOff]), endOff, nil +} + +func skipText(msg []byte, off int) (int, error) { + if off >= len(msg) { + return off, errBaseLen + } + endOff := off + 1 + int(msg[off]) + if endOff > len(msg) { + return off, errCalcLen + } + return endOff, nil +} + +func packBytes(msg []byte, field []byte) []byte { + return append(msg, field...) +} + +func unpackBytes(msg []byte, off int, field []byte) (int, error) { + newOff := off + len(field) + if newOff > len(msg) { + return off, errBaseLen + } + copy(field, msg[off:newOff]) + return newOff, nil +} + +func skipBytes(msg []byte, off int, field []byte) (int, error) { + newOff := off + len(field) + if newOff > len(msg) { + return off, errBaseLen + } + return newOff, nil +} + +const nameLen = 255 + +// A Name is a non-encoded domain name. It is used instead of strings to avoid +// allocations. +type Name struct { + Data [nameLen]byte + Length uint8 +} + +// NewName creates a new Name from a string. +func NewName(name string) (Name, error) { + if len([]byte(name)) > nameLen { + return Name{}, errCalcLen + } + n := Name{Length: uint8(len(name))} + copy(n.Data[:], []byte(name)) + return n, nil +} + +func (n Name) String() string { + return string(n.Data[:n.Length]) +} + +// pack packs a domain name. +// +// Domain names are a sequence of counted strings split at the dots. They end +// with a zero-length string. Compression can be used to reuse domain suffixes. +// +// The compression map will be updated with new domain suffixes. If compression +// is nil, compression will not be used. +func (n *Name) pack(msg []byte, compression map[string]int) ([]byte, error) { + oldMsg := msg + + // Add a trailing dot to canonicalize name. + if n.Length == 0 || n.Data[n.Length-1] != '.' { + return oldMsg, errNonCanonicalName + } + + // Allow root domain. + if n.Data[0] == '.' && n.Length == 1 { + return append(msg, 0), nil + } + + // Emit sequence of counted strings, chopping at dots. + for i, begin := 0, 0; i < int(n.Length); i++ { + // Check for the end of the segment. + if n.Data[i] == '.' { + // The two most significant bits have special meaning. + // It isn't allowed for segments to be long enough to + // need them. + if i-begin >= 1<<6 { + return oldMsg, errSegTooLong + } + + // Segments must have a non-zero length. + if i-begin == 0 { + return oldMsg, errZeroSegLen + } + + msg = append(msg, byte(i-begin)) + + for j := begin; j < i; j++ { + msg = append(msg, n.Data[j]) + } + + begin = i + 1 + continue + } + + // We can only compress domain suffixes starting with a new + // segment. A pointer is two bytes with the two most significant + // bits set to 1 to indicate that it is a pointer. + if (i == 0 || n.Data[i-1] == '.') && compression != nil { + if ptr, ok := compression[string(n.Data[i:])]; ok { + // Hit. Emit a pointer instead of the rest of + // the domain. + return append(msg, byte(ptr>>8|0xC0), byte(ptr)), nil + } + + // Miss. Add the suffix to the compression table if the + // offset can be stored in the available 14 bytes. + if len(msg) <= int(^uint16(0)>>2) { + compression[string(n.Data[i:])] = len(msg) + } + } + } + return append(msg, 0), nil +} + +// unpack unpacks a domain name. +func (n *Name) unpack(msg []byte, off int) (int, error) { + // currOff is the current working offset. + currOff := off + + // newOff is the offset where the next record will start. Pointers lead + // to data that belongs to other names and thus doesn't count towards to + // the usage of this name. + newOff := off + + // ptr is the number of pointers followed. + var ptr int + + // Name is a slice representation of the name data. + name := n.Data[:0] + +Loop: + for { + if currOff >= len(msg) { + return off, errBaseLen + } + c := int(msg[currOff]) + currOff++ + switch c & 0xC0 { + case 0x00: // String segment + if c == 0x00 { + // A zero length signals the end of the name. + break Loop + } + endOff := currOff + c + if endOff > len(msg) { + return off, errCalcLen + } + name = append(name, msg[currOff:endOff]...) + name = append(name, '.') + currOff = endOff + case 0xC0: // Pointer + if currOff >= len(msg) { + return off, errInvalidPtr + } + c1 := msg[currOff] + currOff++ + if ptr == 0 { + newOff = currOff + } + // Don't follow too many pointers, maybe there's a loop. + if ptr++; ptr > 10 { + return off, errTooManyPtr + } + currOff = (c^0xC0)<<8 | int(c1) + default: + // Prefixes 0x80 and 0x40 are reserved. + return off, errReserved + } + } + if len(name) == 0 { + name = append(name, '.') + } + if len(name) > len(n.Data) { + return off, errCalcLen + } + n.Length = uint8(len(name)) + if ptr == 0 { + newOff = currOff + } + return newOff, nil +} + +func skipName(msg []byte, off int) (int, error) { + // newOff is the offset where the next record will start. Pointers lead + // to data that belongs to other names and thus doesn't count towards to + // the usage of this name. + newOff := off + +Loop: + for { + if newOff >= len(msg) { + return off, errBaseLen + } + c := int(msg[newOff]) + newOff++ + switch c & 0xC0 { + case 0x00: + if c == 0x00 { + // A zero length signals the end of the name. + break Loop + } + // literal string + newOff += c + if newOff > len(msg) { + return off, errCalcLen + } + case 0xC0: + // Pointer to somewhere else in msg. + + // Pointers are two bytes. + newOff++ + + // Don't follow the pointer as the data here has ended. + break Loop + default: + // Prefixes 0x80 and 0x40 are reserved. + return off, errReserved + } + } + + return newOff, nil +} + +// A Question is a DNS query. +type Question struct { + Name Name + Type Type + Class Class +} + +func (q *Question) pack(msg []byte, compression map[string]int) ([]byte, error) { + msg, err := q.Name.pack(msg, compression) + if err != nil { + return msg, &nestedError{"Name", err} + } + msg = packType(msg, q.Type) + return packClass(msg, q.Class), nil +} + +func unpackResourceBody(msg []byte, off int, hdr ResourceHeader) (ResourceBody, int, error) { + var ( + r ResourceBody + err error + name string + ) + switch hdr.Type { + case TypeA: + var rb AResource + rb, err = unpackAResource(msg, off) + r = &rb + name = "A" + case TypeNS: + var rb NSResource + rb, err = unpackNSResource(msg, off) + r = &rb + name = "NS" + case TypeCNAME: + var rb CNAMEResource + rb, err = unpackCNAMEResource(msg, off) + r = &rb + name = "CNAME" + case TypeSOA: + var rb SOAResource + rb, err = unpackSOAResource(msg, off) + r = &rb + name = "SOA" + case TypePTR: + var rb PTRResource + rb, err = unpackPTRResource(msg, off) + r = &rb + name = "PTR" + case TypeMX: + var rb MXResource + rb, err = unpackMXResource(msg, off) + r = &rb + name = "MX" + case TypeTXT: + var rb TXTResource + rb, err = unpackTXTResource(msg, off, hdr.Length) + r = &rb + name = "TXT" + case TypeAAAA: + var rb AAAAResource + rb, err = unpackAAAAResource(msg, off) + r = &rb + name = "AAAA" + case TypeSRV: + var rb SRVResource + rb, err = unpackSRVResource(msg, off) + r = &rb + name = "SRV" + } + if err != nil { + return nil, off, &nestedError{name + " record", err} + } + if r == nil { + return nil, off, errors.New("invalid resource type: " + string(hdr.Type+'0')) + } + return r, off + int(hdr.Length), nil +} + +// A CNAMEResource is a CNAME Resource record. +type CNAMEResource struct { + CNAME Name +} + +func (r *CNAMEResource) realType() Type { + return TypeCNAME +} + +func (r *CNAMEResource) pack(msg []byte, compression map[string]int) ([]byte, error) { + return r.CNAME.pack(msg, compression) +} + +func unpackCNAMEResource(msg []byte, off int) (CNAMEResource, error) { + var cname Name + if _, err := cname.unpack(msg, off); err != nil { + return CNAMEResource{}, err + } + return CNAMEResource{cname}, nil +} + +// An MXResource is an MX Resource record. +type MXResource struct { + Pref uint16 + MX Name +} + +func (r *MXResource) realType() Type { + return TypeMX +} + +func (r *MXResource) pack(msg []byte, compression map[string]int) ([]byte, error) { + oldMsg := msg + msg = packUint16(msg, r.Pref) + msg, err := r.MX.pack(msg, compression) + if err != nil { + return oldMsg, &nestedError{"MXResource.MX", err} + } + return msg, nil +} + +func unpackMXResource(msg []byte, off int) (MXResource, error) { + pref, off, err := unpackUint16(msg, off) + if err != nil { + return MXResource{}, &nestedError{"Pref", err} + } + var mx Name + if _, err := mx.unpack(msg, off); err != nil { + return MXResource{}, &nestedError{"MX", err} + } + return MXResource{pref, mx}, nil +} + +// An NSResource is an NS Resource record. +type NSResource struct { + NS Name +} + +func (r *NSResource) realType() Type { + return TypeNS +} + +func (r *NSResource) pack(msg []byte, compression map[string]int) ([]byte, error) { + return r.NS.pack(msg, compression) +} + +func unpackNSResource(msg []byte, off int) (NSResource, error) { + var ns Name + if _, err := ns.unpack(msg, off); err != nil { + return NSResource{}, err + } + return NSResource{ns}, nil +} + +// A PTRResource is a PTR Resource record. +type PTRResource struct { + PTR Name +} + +func (r *PTRResource) realType() Type { + return TypePTR +} + +func (r *PTRResource) pack(msg []byte, compression map[string]int) ([]byte, error) { + return r.PTR.pack(msg, compression) +} + +func unpackPTRResource(msg []byte, off int) (PTRResource, error) { + var ptr Name + if _, err := ptr.unpack(msg, off); err != nil { + return PTRResource{}, err + } + return PTRResource{ptr}, nil +} + +// An SOAResource is an SOA Resource record. +type SOAResource struct { + NS Name + MBox Name + Serial uint32 + Refresh uint32 + Retry uint32 + Expire uint32 + + // MinTTL the is the default TTL of Resources records which did not + // contain a TTL value and the TTL of negative responses. (RFC 2308 + // Section 4) + MinTTL uint32 +} + +func (r *SOAResource) realType() Type { + return TypeSOA +} + +func (r *SOAResource) pack(msg []byte, compression map[string]int) ([]byte, error) { + oldMsg := msg + msg, err := r.NS.pack(msg, compression) + if err != nil { + return oldMsg, &nestedError{"SOAResource.NS", err} + } + msg, err = r.MBox.pack(msg, compression) + if err != nil { + return oldMsg, &nestedError{"SOAResource.MBox", err} + } + msg = packUint32(msg, r.Serial) + msg = packUint32(msg, r.Refresh) + msg = packUint32(msg, r.Retry) + msg = packUint32(msg, r.Expire) + return packUint32(msg, r.MinTTL), nil +} + +func unpackSOAResource(msg []byte, off int) (SOAResource, error) { + var ns Name + off, err := ns.unpack(msg, off) + if err != nil { + return SOAResource{}, &nestedError{"NS", err} + } + var mbox Name + if off, err = mbox.unpack(msg, off); err != nil { + return SOAResource{}, &nestedError{"MBox", err} + } + serial, off, err := unpackUint32(msg, off) + if err != nil { + return SOAResource{}, &nestedError{"Serial", err} + } + refresh, off, err := unpackUint32(msg, off) + if err != nil { + return SOAResource{}, &nestedError{"Refresh", err} + } + retry, off, err := unpackUint32(msg, off) + if err != nil { + return SOAResource{}, &nestedError{"Retry", err} + } + expire, off, err := unpackUint32(msg, off) + if err != nil { + return SOAResource{}, &nestedError{"Expire", err} + } + minTTL, _, err := unpackUint32(msg, off) + if err != nil { + return SOAResource{}, &nestedError{"MinTTL", err} + } + return SOAResource{ns, mbox, serial, refresh, retry, expire, minTTL}, nil +} + +// A TXTResource is a TXT Resource record. +type TXTResource struct { + Txt string // Not a domain name. +} + +func (r *TXTResource) realType() Type { + return TypeTXT +} + +func (r *TXTResource) pack(msg []byte, compression map[string]int) ([]byte, error) { + return packText(msg, r.Txt), nil +} + +func unpackTXTResource(msg []byte, off int, length uint16) (TXTResource, error) { + var txt string + for n := uint16(0); n < length; { + var t string + var err error + if t, off, err = unpackText(msg, off); err != nil { + return TXTResource{}, &nestedError{"text", err} + } + // Check if we got too many bytes. + if length-n < uint16(len(t))+1 { + return TXTResource{}, errCalcLen + } + n += uint16(len(t)) + 1 + txt += t + } + return TXTResource{txt}, nil +} + +// An SRVResource is an SRV Resource record. +type SRVResource struct { + Priority uint16 + Weight uint16 + Port uint16 + Target Name // Not compressed as per RFC 2782. +} + +func (r *SRVResource) realType() Type { + return TypeSRV +} + +func (r *SRVResource) pack(msg []byte, compression map[string]int) ([]byte, error) { + oldMsg := msg + msg = packUint16(msg, r.Priority) + msg = packUint16(msg, r.Weight) + msg = packUint16(msg, r.Port) + msg, err := r.Target.pack(msg, nil) + if err != nil { + return oldMsg, &nestedError{"SRVResource.Target", err} + } + return msg, nil +} + +func unpackSRVResource(msg []byte, off int) (SRVResource, error) { + priority, off, err := unpackUint16(msg, off) + if err != nil { + return SRVResource{}, &nestedError{"Priority", err} + } + weight, off, err := unpackUint16(msg, off) + if err != nil { + return SRVResource{}, &nestedError{"Weight", err} + } + port, off, err := unpackUint16(msg, off) + if err != nil { + return SRVResource{}, &nestedError{"Port", err} + } + var target Name + if _, err := target.unpack(msg, off); err != nil { + return SRVResource{}, &nestedError{"Target", err} + } + return SRVResource{priority, weight, port, target}, nil +} + +// An AResource is an A Resource record. +type AResource struct { + A [4]byte +} + +func (r *AResource) realType() Type { + return TypeA +} + +func (r *AResource) pack(msg []byte, compression map[string]int) ([]byte, error) { + return packBytes(msg, r.A[:]), nil +} + +func unpackAResource(msg []byte, off int) (AResource, error) { + var a [4]byte + if _, err := unpackBytes(msg, off, a[:]); err != nil { + return AResource{}, err + } + return AResource{a}, nil +} + +// An AAAAResource is an AAAA Resource record. +type AAAAResource struct { + AAAA [16]byte +} + +func (r *AAAAResource) realType() Type { + return TypeAAAA +} + +func (r *AAAAResource) pack(msg []byte, compression map[string]int) ([]byte, error) { + return packBytes(msg, r.AAAA[:]), nil +} + +func unpackAAAAResource(msg []byte, off int) (AAAAResource, error) { + var aaaa [16]byte + if _, err := unpackBytes(msg, off, aaaa[:]); err != nil { + return AAAAResource{}, err + } + return AAAAResource{aaaa}, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/dns/dnsmessage/message_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/dns/dnsmessage/message_test.go new file mode 100644 index 0000000..9295d36 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/dns/dnsmessage/message_test.go @@ -0,0 +1,1116 @@ +// 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 dnsmessage + +import ( + "bytes" + "fmt" + "reflect" + "testing" +) + +func mustNewName(name string) Name { + n, err := NewName(name) + if err != nil { + panic(err) + } + return n +} + +func (m *Message) String() string { + s := fmt.Sprintf("Message: %#v\n", &m.Header) + if len(m.Questions) > 0 { + s += "-- Questions\n" + for _, q := range m.Questions { + s += fmt.Sprintf("%#v\n", q) + } + } + if len(m.Answers) > 0 { + s += "-- Answers\n" + for _, a := range m.Answers { + s += fmt.Sprintf("%#v\n", a) + } + } + if len(m.Authorities) > 0 { + s += "-- Authorities\n" + for _, ns := range m.Authorities { + s += fmt.Sprintf("%#v\n", ns) + } + } + if len(m.Additionals) > 0 { + s += "-- Additionals\n" + for _, e := range m.Additionals { + s += fmt.Sprintf("%#v\n", e) + } + } + return s +} + +func TestNameString(t *testing.T) { + want := "foo" + name := mustNewName(want) + if got := fmt.Sprint(name); got != want { + t.Errorf("got fmt.Sprint(%#v) = %s, want = %s", name, got, want) + } +} + +func TestQuestionPackUnpack(t *testing.T) { + want := Question{ + Name: mustNewName("."), + Type: TypeA, + Class: ClassINET, + } + buf, err := want.pack(make([]byte, 1, 50), map[string]int{}) + if err != nil { + t.Fatal("Packing failed:", err) + } + var p Parser + p.msg = buf + p.header.questions = 1 + p.section = sectionQuestions + p.off = 1 + got, err := p.Question() + if err != nil { + t.Fatalf("Unpacking failed: %v\n%s", err, string(buf[1:])) + } + if p.off != len(buf) { + t.Errorf("Unpacked different amount than packed: got n = %d, want = %d", p.off, len(buf)) + } + if !reflect.DeepEqual(got, want) { + t.Errorf("Got = %+v, want = %+v", got, want) + } +} + +func TestName(t *testing.T) { + tests := []string{ + "", + ".", + "google..com", + "google.com", + "google..com.", + "google.com.", + ".google.com.", + "www..google.com.", + "www.google.com.", + } + + for _, test := range tests { + n, err := NewName(test) + if err != nil { + t.Errorf("Creating name for %q: %v", test, err) + continue + } + if ns := n.String(); ns != test { + t.Errorf("Got %#v.String() = %q, want = %q", n, ns, test) + continue + } + } +} + +func TestNamePackUnpack(t *testing.T) { + tests := []struct { + in string + want string + err error + }{ + {"", "", errNonCanonicalName}, + {".", ".", nil}, + {"google..com", "", errNonCanonicalName}, + {"google.com", "", errNonCanonicalName}, + {"google..com.", "", errZeroSegLen}, + {"google.com.", "google.com.", nil}, + {".google.com.", "", errZeroSegLen}, + {"www..google.com.", "", errZeroSegLen}, + {"www.google.com.", "www.google.com.", nil}, + } + + for _, test := range tests { + in := mustNewName(test.in) + want := mustNewName(test.want) + buf, err := in.pack(make([]byte, 0, 30), map[string]int{}) + if err != test.err { + t.Errorf("Packing of %q: got err = %v, want err = %v", test.in, err, test.err) + continue + } + if test.err != nil { + continue + } + var got Name + n, err := got.unpack(buf, 0) + if err != nil { + t.Errorf("Unpacking for %q failed: %v", test.in, err) + continue + } + if n != len(buf) { + t.Errorf( + "Unpacked different amount than packed for %q: got n = %d, want = %d", + test.in, + n, + len(buf), + ) + } + if got != want { + t.Errorf("Unpacking packing of %q: got = %#v, want = %#v", test.in, got, want) + } + } +} + +func checkErrorPrefix(err error, prefix string) bool { + e, ok := err.(*nestedError) + return ok && e.s == prefix +} + +func TestHeaderUnpackError(t *testing.T) { + wants := []string{ + "id", + "bits", + "questions", + "answers", + "authorities", + "additionals", + } + var buf []byte + var h header + for _, want := range wants { + n, err := h.unpack(buf, 0) + if n != 0 || !checkErrorPrefix(err, want) { + t.Errorf("got h.unpack([%d]byte, 0) = %d, %v, want = 0, %s", len(buf), n, err, want) + } + buf = append(buf, 0, 0) + } +} + +func TestParserStart(t *testing.T) { + const want = "unpacking header" + var p Parser + for i := 0; i <= 1; i++ { + _, err := p.Start([]byte{}) + if !checkErrorPrefix(err, want) { + t.Errorf("got p.Start(nil) = _, %v, want = _, %s", err, want) + } + } +} + +func TestResourceNotStarted(t *testing.T) { + tests := []struct { + name string + fn func(*Parser) error + }{ + {"CNAMEResource", func(p *Parser) error { _, err := p.CNAMEResource(); return err }}, + {"MXResource", func(p *Parser) error { _, err := p.MXResource(); return err }}, + {"NSResource", func(p *Parser) error { _, err := p.NSResource(); return err }}, + {"PTRResource", func(p *Parser) error { _, err := p.PTRResource(); return err }}, + {"SOAResource", func(p *Parser) error { _, err := p.SOAResource(); return err }}, + {"TXTResource", func(p *Parser) error { _, err := p.TXTResource(); return err }}, + {"SRVResource", func(p *Parser) error { _, err := p.SRVResource(); return err }}, + {"AResource", func(p *Parser) error { _, err := p.AResource(); return err }}, + {"AAAAResource", func(p *Parser) error { _, err := p.AAAAResource(); return err }}, + } + + for _, test := range tests { + if err := test.fn(&Parser{}); err != ErrNotStarted { + t.Errorf("got _, %v = p.%s(), want = _, %v", err, test.name, ErrNotStarted) + } + } +} + +func TestDNSPackUnpack(t *testing.T) { + wants := []Message{ + { + Questions: []Question{ + { + Name: mustNewName("."), + Type: TypeAAAA, + Class: ClassINET, + }, + }, + Answers: []Resource{}, + Authorities: []Resource{}, + Additionals: []Resource{}, + }, + largeTestMsg(), + } + for i, want := range wants { + b, err := want.Pack() + if err != nil { + t.Fatalf("%d: packing failed: %v", i, err) + } + var got Message + err = got.Unpack(b) + if err != nil { + t.Fatalf("%d: unpacking failed: %v", i, err) + } + if !reflect.DeepEqual(got, want) { + t.Errorf("%d: got = %+v, want = %+v", i, &got, &want) + } + } +} + +func TestSkipAll(t *testing.T) { + msg := largeTestMsg() + buf, err := msg.Pack() + if err != nil { + t.Fatal("Packing large test message:", err) + } + var p Parser + if _, err := p.Start(buf); err != nil { + t.Fatal(err) + } + + tests := []struct { + name string + f func() error + }{ + {"SkipAllQuestions", p.SkipAllQuestions}, + {"SkipAllAnswers", p.SkipAllAnswers}, + {"SkipAllAuthorities", p.SkipAllAuthorities}, + {"SkipAllAdditionals", p.SkipAllAdditionals}, + } + for _, test := range tests { + for i := 1; i <= 3; i++ { + if err := test.f(); err != nil { + t.Errorf("Call #%d to %s(): %v", i, test.name, err) + } + } + } +} + +func TestSkipEach(t *testing.T) { + msg := smallTestMsg() + + buf, err := msg.Pack() + if err != nil { + t.Fatal("Packing test message:", err) + } + var p Parser + if _, err := p.Start(buf); err != nil { + t.Fatal(err) + } + + tests := []struct { + name string + f func() error + }{ + {"SkipQuestion", p.SkipQuestion}, + {"SkipAnswer", p.SkipAnswer}, + {"SkipAuthority", p.SkipAuthority}, + {"SkipAdditional", p.SkipAdditional}, + } + for _, test := range tests { + if err := test.f(); err != nil { + t.Errorf("First call: got %s() = %v, want = %v", test.name, err, nil) + } + if err := test.f(); err != ErrSectionDone { + t.Errorf("Second call: got %s() = %v, want = %v", test.name, err, ErrSectionDone) + } + } +} + +func TestSkipAfterRead(t *testing.T) { + msg := smallTestMsg() + + buf, err := msg.Pack() + if err != nil { + t.Fatal("Packing test message:", err) + } + var p Parser + if _, err := p.Start(buf); err != nil { + t.Fatal(err) + } + + tests := []struct { + name string + skip func() error + read func() error + }{ + {"Question", p.SkipQuestion, func() error { _, err := p.Question(); return err }}, + {"Answer", p.SkipAnswer, func() error { _, err := p.Answer(); return err }}, + {"Authority", p.SkipAuthority, func() error { _, err := p.Authority(); return err }}, + {"Additional", p.SkipAdditional, func() error { _, err := p.Additional(); return err }}, + } + for _, test := range tests { + if err := test.read(); err != nil { + t.Errorf("Got %s() = _, %v, want = _, %v", test.name, err, nil) + } + if err := test.skip(); err != ErrSectionDone { + t.Errorf("Got Skip%s() = %v, want = %v", test.name, err, ErrSectionDone) + } + } +} + +func TestSkipNotStarted(t *testing.T) { + var p Parser + + tests := []struct { + name string + f func() error + }{ + {"SkipAllQuestions", p.SkipAllQuestions}, + {"SkipAllAnswers", p.SkipAllAnswers}, + {"SkipAllAuthorities", p.SkipAllAuthorities}, + {"SkipAllAdditionals", p.SkipAllAdditionals}, + } + for _, test := range tests { + if err := test.f(); err != ErrNotStarted { + t.Errorf("Got %s() = %v, want = %v", test.name, err, ErrNotStarted) + } + } +} + +func TestTooManyRecords(t *testing.T) { + const recs = int(^uint16(0)) + 1 + tests := []struct { + name string + msg Message + want error + }{ + { + "Questions", + Message{ + Questions: make([]Question, recs), + }, + errTooManyQuestions, + }, + { + "Answers", + Message{ + Answers: make([]Resource, recs), + }, + errTooManyAnswers, + }, + { + "Authorities", + Message{ + Authorities: make([]Resource, recs), + }, + errTooManyAuthorities, + }, + { + "Additionals", + Message{ + Additionals: make([]Resource, recs), + }, + errTooManyAdditionals, + }, + } + + for _, test := range tests { + if _, got := test.msg.Pack(); got != test.want { + t.Errorf("Packing %d %s: got = %v, want = %v", recs, test.name, got, test.want) + } + } +} + +func TestVeryLongTxt(t *testing.T) { + want := Resource{ + ResourceHeader{ + Name: mustNewName("foo.bar.example.com."), + Type: TypeTXT, + Class: ClassINET, + }, + &TXTResource{loremIpsum}, + } + buf, err := want.pack(make([]byte, 0, 8000), map[string]int{}) + if err != nil { + t.Fatal("Packing failed:", err) + } + var got Resource + off, err := got.Header.unpack(buf, 0) + if err != nil { + t.Fatal("Unpacking ResourceHeader failed:", err) + } + body, n, err := unpackResourceBody(buf, off, got.Header) + if err != nil { + t.Fatal("Unpacking failed:", err) + } + got.Body = body + if n != len(buf) { + t.Errorf("Unpacked different amount than packed: got n = %d, want = %d", n, len(buf)) + } + if !reflect.DeepEqual(got, want) { + t.Errorf("Got = %#v, want = %#v", got, want) + } +} + +func TestStartError(t *testing.T) { + tests := []struct { + name string + fn func(*Builder) error + }{ + {"Questions", func(b *Builder) error { return b.StartQuestions() }}, + {"Answers", func(b *Builder) error { return b.StartAnswers() }}, + {"Authorities", func(b *Builder) error { return b.StartAuthorities() }}, + {"Additionals", func(b *Builder) error { return b.StartAdditionals() }}, + } + + envs := []struct { + name string + fn func() *Builder + want error + }{ + {"sectionNotStarted", func() *Builder { return &Builder{section: sectionNotStarted} }, ErrNotStarted}, + {"sectionDone", func() *Builder { return &Builder{section: sectionDone} }, ErrSectionDone}, + } + + for _, env := range envs { + for _, test := range tests { + if got := test.fn(env.fn()); got != env.want { + t.Errorf("got Builder{%s}.Start%s = %v, want = %v", env.name, test.name, got, env.want) + } + } + } +} + +func TestBuilderResourceError(t *testing.T) { + tests := []struct { + name string + fn func(*Builder) error + }{ + {"CNAMEResource", func(b *Builder) error { return b.CNAMEResource(ResourceHeader{}, CNAMEResource{}) }}, + {"MXResource", func(b *Builder) error { return b.MXResource(ResourceHeader{}, MXResource{}) }}, + {"NSResource", func(b *Builder) error { return b.NSResource(ResourceHeader{}, NSResource{}) }}, + {"PTRResource", func(b *Builder) error { return b.PTRResource(ResourceHeader{}, PTRResource{}) }}, + {"SOAResource", func(b *Builder) error { return b.SOAResource(ResourceHeader{}, SOAResource{}) }}, + {"TXTResource", func(b *Builder) error { return b.TXTResource(ResourceHeader{}, TXTResource{}) }}, + {"SRVResource", func(b *Builder) error { return b.SRVResource(ResourceHeader{}, SRVResource{}) }}, + {"AResource", func(b *Builder) error { return b.AResource(ResourceHeader{}, AResource{}) }}, + {"AAAAResource", func(b *Builder) error { return b.AAAAResource(ResourceHeader{}, AAAAResource{}) }}, + } + + envs := []struct { + name string + fn func() *Builder + want error + }{ + {"sectionNotStarted", func() *Builder { return &Builder{section: sectionNotStarted} }, ErrNotStarted}, + {"sectionHeader", func() *Builder { return &Builder{section: sectionHeader} }, ErrNotStarted}, + {"sectionQuestions", func() *Builder { return &Builder{section: sectionQuestions} }, ErrNotStarted}, + {"sectionDone", func() *Builder { return &Builder{section: sectionDone} }, ErrSectionDone}, + } + + for _, env := range envs { + for _, test := range tests { + if got := test.fn(env.fn()); got != env.want { + t.Errorf("got Builder{%s}.%s = %v, want = %v", env.name, test.name, got, env.want) + } + } + } +} + +func TestFinishError(t *testing.T) { + var b Builder + want := ErrNotStarted + if _, got := b.Finish(); got != want { + t.Errorf("got Builder{}.Finish() = %v, want = %v", got, want) + } +} + +func TestBuilder(t *testing.T) { + msg := largeTestMsg() + want, err := msg.Pack() + if err != nil { + t.Fatal("Packing without builder:", err) + } + + var b Builder + b.Start(nil, msg.Header) + + if err := b.StartQuestions(); err != nil { + t.Fatal("b.StartQuestions():", err) + } + for _, q := range msg.Questions { + if err := b.Question(q); err != nil { + t.Fatalf("b.Question(%#v): %v", q, err) + } + } + + if err := b.StartAnswers(); err != nil { + t.Fatal("b.StartAnswers():", err) + } + for _, a := range msg.Answers { + switch a.Header.Type { + case TypeA: + if err := b.AResource(a.Header, *a.Body.(*AResource)); err != nil { + t.Fatalf("b.AResource(%#v): %v", a, err) + } + case TypeNS: + if err := b.NSResource(a.Header, *a.Body.(*NSResource)); err != nil { + t.Fatalf("b.NSResource(%#v): %v", a, err) + } + case TypeCNAME: + if err := b.CNAMEResource(a.Header, *a.Body.(*CNAMEResource)); err != nil { + t.Fatalf("b.CNAMEResource(%#v): %v", a, err) + } + case TypeSOA: + if err := b.SOAResource(a.Header, *a.Body.(*SOAResource)); err != nil { + t.Fatalf("b.SOAResource(%#v): %v", a, err) + } + case TypePTR: + if err := b.PTRResource(a.Header, *a.Body.(*PTRResource)); err != nil { + t.Fatalf("b.PTRResource(%#v): %v", a, err) + } + case TypeMX: + if err := b.MXResource(a.Header, *a.Body.(*MXResource)); err != nil { + t.Fatalf("b.MXResource(%#v): %v", a, err) + } + case TypeTXT: + if err := b.TXTResource(a.Header, *a.Body.(*TXTResource)); err != nil { + t.Fatalf("b.TXTResource(%#v): %v", a, err) + } + case TypeAAAA: + if err := b.AAAAResource(a.Header, *a.Body.(*AAAAResource)); err != nil { + t.Fatalf("b.AAAAResource(%#v): %v", a, err) + } + case TypeSRV: + if err := b.SRVResource(a.Header, *a.Body.(*SRVResource)); err != nil { + t.Fatalf("b.SRVResource(%#v): %v", a, err) + } + } + } + + if err := b.StartAuthorities(); err != nil { + t.Fatal("b.StartAuthorities():", err) + } + for _, a := range msg.Authorities { + if err := b.NSResource(a.Header, *a.Body.(*NSResource)); err != nil { + t.Fatalf("b.NSResource(%#v): %v", a, err) + } + } + + if err := b.StartAdditionals(); err != nil { + t.Fatal("b.StartAdditionals():", err) + } + for _, a := range msg.Additionals { + if err := b.TXTResource(a.Header, *a.Body.(*TXTResource)); err != nil { + t.Fatalf("b.TXTResource(%#v): %v", a, err) + } + } + + got, err := b.Finish() + if err != nil { + t.Fatal("b.Finish():", err) + } + if !bytes.Equal(got, want) { + t.Fatalf("Got from Builder: %#v\nwant = %#v", got, want) + } +} + +func TestResourcePack(t *testing.T) { + for _, tt := range []struct { + m Message + err error + }{ + { + Message{ + Questions: []Question{ + { + Name: mustNewName("."), + Type: TypeAAAA, + Class: ClassINET, + }, + }, + Answers: []Resource{{ResourceHeader{}, nil}}, + }, + &nestedError{"packing Answer", errNilResouceBody}, + }, + { + Message{ + Questions: []Question{ + { + Name: mustNewName("."), + Type: TypeAAAA, + Class: ClassINET, + }, + }, + Authorities: []Resource{{ResourceHeader{}, (*NSResource)(nil)}}, + }, + &nestedError{"packing Authority", + &nestedError{"ResourceHeader", + &nestedError{"Name", errNonCanonicalName}, + }, + }, + }, + { + Message{ + Questions: []Question{ + { + Name: mustNewName("."), + Type: TypeA, + Class: ClassINET, + }, + }, + Additionals: []Resource{{ResourceHeader{}, nil}}, + }, + &nestedError{"packing Additional", errNilResouceBody}, + }, + } { + _, err := tt.m.Pack() + if !reflect.DeepEqual(err, tt.err) { + t.Errorf("got %v for %v; want %v", err, tt.m, tt.err) + } + } +} + +func BenchmarkParsing(b *testing.B) { + b.ReportAllocs() + + name := mustNewName("foo.bar.example.com.") + msg := Message{ + Header: Header{Response: true, Authoritative: true}, + Questions: []Question{ + { + Name: name, + Type: TypeA, + Class: ClassINET, + }, + }, + Answers: []Resource{ + { + ResourceHeader{ + Name: name, + Class: ClassINET, + }, + &AResource{[4]byte{}}, + }, + { + ResourceHeader{ + Name: name, + Class: ClassINET, + }, + &AAAAResource{[16]byte{}}, + }, + { + ResourceHeader{ + Name: name, + Class: ClassINET, + }, + &CNAMEResource{name}, + }, + { + ResourceHeader{ + Name: name, + Class: ClassINET, + }, + &NSResource{name}, + }, + }, + } + + buf, err := msg.Pack() + if err != nil { + b.Fatal("msg.Pack():", err) + } + + for i := 0; i < b.N; i++ { + var p Parser + if _, err := p.Start(buf); err != nil { + b.Fatal("p.Start(buf):", err) + } + + for { + _, err := p.Question() + if err == ErrSectionDone { + break + } + if err != nil { + b.Fatal("p.Question():", err) + } + } + + for { + h, err := p.AnswerHeader() + if err == ErrSectionDone { + break + } + if err != nil { + panic(err) + } + + switch h.Type { + case TypeA: + if _, err := p.AResource(); err != nil { + b.Fatal("p.AResource():", err) + } + case TypeAAAA: + if _, err := p.AAAAResource(); err != nil { + b.Fatal("p.AAAAResource():", err) + } + case TypeCNAME: + if _, err := p.CNAMEResource(); err != nil { + b.Fatal("p.CNAMEResource():", err) + } + case TypeNS: + if _, err := p.NSResource(); err != nil { + b.Fatal("p.NSResource():", err) + } + default: + b.Fatalf("unknown type: %T", h) + } + } + } +} + +func BenchmarkBuilding(b *testing.B) { + b.ReportAllocs() + + name := mustNewName("foo.bar.example.com.") + buf := make([]byte, 0, packStartingCap) + + for i := 0; i < b.N; i++ { + var bld Builder + bld.StartWithoutCompression(buf, Header{Response: true, Authoritative: true}) + + if err := bld.StartQuestions(); err != nil { + b.Fatal("bld.StartQuestions():", err) + } + q := Question{ + Name: name, + Type: TypeA, + Class: ClassINET, + } + if err := bld.Question(q); err != nil { + b.Fatalf("bld.Question(%+v): %v", q, err) + } + + hdr := ResourceHeader{ + Name: name, + Class: ClassINET, + } + if err := bld.StartAnswers(); err != nil { + b.Fatal("bld.StartQuestions():", err) + } + + ar := AResource{[4]byte{}} + if err := bld.AResource(hdr, ar); err != nil { + b.Fatalf("bld.AResource(%+v, %+v): %v", hdr, ar, err) + } + + aaar := AAAAResource{[16]byte{}} + if err := bld.AAAAResource(hdr, aaar); err != nil { + b.Fatalf("bld.AAAAResource(%+v, %+v): %v", hdr, aaar, err) + } + + cnr := CNAMEResource{name} + if err := bld.CNAMEResource(hdr, cnr); err != nil { + b.Fatalf("bld.CNAMEResource(%+v, %+v): %v", hdr, cnr, err) + } + + nsr := NSResource{name} + if err := bld.NSResource(hdr, nsr); err != nil { + b.Fatalf("bld.NSResource(%+v, %+v): %v", hdr, nsr, err) + } + + if _, err := bld.Finish(); err != nil { + b.Fatal("bld.Finish():", err) + } + } +} + +func smallTestMsg() Message { + name := mustNewName("example.com.") + return Message{ + Header: Header{Response: true, Authoritative: true}, + Questions: []Question{ + { + Name: name, + Type: TypeA, + Class: ClassINET, + }, + }, + Answers: []Resource{ + { + ResourceHeader{ + Name: name, + Type: TypeA, + Class: ClassINET, + }, + &AResource{[4]byte{127, 0, 0, 1}}, + }, + }, + Authorities: []Resource{ + { + ResourceHeader{ + Name: name, + Type: TypeA, + Class: ClassINET, + }, + &AResource{[4]byte{127, 0, 0, 1}}, + }, + }, + Additionals: []Resource{ + { + ResourceHeader{ + Name: name, + Type: TypeA, + Class: ClassINET, + }, + &AResource{[4]byte{127, 0, 0, 1}}, + }, + }, + } +} + +func largeTestMsg() Message { + name := mustNewName("foo.bar.example.com.") + return Message{ + Header: Header{Response: true, Authoritative: true}, + Questions: []Question{ + { + Name: name, + Type: TypeA, + Class: ClassINET, + }, + }, + Answers: []Resource{ + { + ResourceHeader{ + Name: name, + Type: TypeA, + Class: ClassINET, + }, + &AResource{[4]byte{127, 0, 0, 1}}, + }, + { + ResourceHeader{ + Name: name, + Type: TypeA, + Class: ClassINET, + }, + &AResource{[4]byte{127, 0, 0, 2}}, + }, + { + ResourceHeader{ + Name: name, + Type: TypeAAAA, + Class: ClassINET, + }, + &AAAAResource{[16]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}}, + }, + { + ResourceHeader{ + Name: name, + Type: TypeCNAME, + Class: ClassINET, + }, + &CNAMEResource{mustNewName("alias.example.com.")}, + }, + { + ResourceHeader{ + Name: name, + Type: TypeSOA, + Class: ClassINET, + }, + &SOAResource{ + NS: mustNewName("ns1.example.com."), + MBox: mustNewName("mb.example.com."), + Serial: 1, + Refresh: 2, + Retry: 3, + Expire: 4, + MinTTL: 5, + }, + }, + { + ResourceHeader{ + Name: name, + Type: TypePTR, + Class: ClassINET, + }, + &PTRResource{mustNewName("ptr.example.com.")}, + }, + { + ResourceHeader{ + Name: name, + Type: TypeMX, + Class: ClassINET, + }, + &MXResource{ + 7, + mustNewName("mx.example.com."), + }, + }, + { + ResourceHeader{ + Name: name, + Type: TypeSRV, + Class: ClassINET, + }, + &SRVResource{ + 8, + 9, + 11, + mustNewName("srv.example.com."), + }, + }, + }, + Authorities: []Resource{ + { + ResourceHeader{ + Name: name, + Type: TypeNS, + Class: ClassINET, + }, + &NSResource{mustNewName("ns1.example.com.")}, + }, + { + ResourceHeader{ + Name: name, + Type: TypeNS, + Class: ClassINET, + }, + &NSResource{mustNewName("ns2.example.com.")}, + }, + }, + Additionals: []Resource{ + { + ResourceHeader{ + Name: name, + Type: TypeTXT, + Class: ClassINET, + }, + &TXTResource{"So Long, and Thanks for All the Fish"}, + }, + { + ResourceHeader{ + Name: name, + Type: TypeTXT, + Class: ClassINET, + }, + &TXTResource{"Hamster Huey and the Gooey Kablooie"}, + }, + }, + } +} + +const loremIpsum = ` +Lorem ipsum dolor sit amet, nec enim antiopam id, an ullum choro +nonumes qui, pro eu debet honestatis mediocritatem. No alia enim eos, +magna signiferumque ex vis. Mei no aperiri dissentias, cu vel quas +regione. Malorum quaeque vim ut, eum cu semper aliquid invidunt, ei +nam ipsum assentior. + +Nostrum appellantur usu no, vis ex probatus adipiscing. Cu usu illum +facilis eleifend. Iusto conceptam complectitur vim id. Tale omnesque +no usu, ei oblique sadipscing vim. At nullam voluptua usu, mei laudem +reformidans et. Qui ei eros porro reformidans, ius suas veritus +torquatos ex. Mea te facer alterum consequat. + +Soleat torquatos democritum sed et, no mea congue appareat, facer +aliquam nec in. Has te ipsum tritani. At justo dicta option nec, movet +phaedrum ad nam. Ea detracto verterem liberavisse has, delectus +suscipiantur in mei. Ex nam meliore complectitur. Ut nam omnis +honestatis quaerendum, ea mea nihil affert detracto, ad vix rebum +mollis. + +Ut epicurei praesent neglegentur pri, prima fuisset intellegebat ad +vim. An habemus comprehensam usu, at enim dignissim pro. Eam reque +vivendum adipisci ea. Vel ne odio choro minimum. Sea admodum +dissentiet ex. Mundi tamquam evertitur ius cu. Homero postea iisque ut +pro, vel ne saepe senserit consetetur. + +Nulla utamur facilisis ius ea, in viderer diceret pertinax eum. Mei no +enim quodsi facilisi, ex sed aeterno appareat mediocritatem, eum +sententiae deterruisset ut. At suas timeam euismod cum, offendit +appareat interpretaris ne vix. Vel ea civibus albucius, ex vim quidam +accusata intellegebat, noluisse instructior sea id. Nec te nonumes +habemus appellantur, quis dignissim vituperata eu nam. + +At vix apeirian patrioque vituperatoribus, an usu agam assum. Debet +iisque an mea. Per eu dicant ponderum accommodare. Pri alienum +placerat senserit an, ne eum ferri abhorreant vituperatoribus. Ut mea +eligendi disputationi. Ius no tation everti impedit, ei magna quidam +mediocritatem pri. + +Legendos perpetua iracundia ne usu, no ius ullum epicurei intellegam, +ad modus epicuri lucilius eam. In unum quaerendum usu. Ne diam paulo +has, ea veri virtute sed. Alia honestatis conclusionemque mea eu, ut +iudico albucius his. + +Usu essent probatus eu, sed omnis dolor delicatissimi ex. No qui augue +dissentias dissentiet. Laudem recteque no usu, vel an velit noluisse, +an sed utinam eirmod appetere. Ne mea fuisset inimicus ocurreret. At +vis dicant abhorreant, utinam forensibus nec ne, mei te docendi +consequat. Brute inermis persecuti cum id. Ut ipsum munere propriae +usu, dicit graeco disputando id has. + +Eros dolore quaerendum nam ei. Timeam ornatus inciderint pro id. Nec +torquatos sadipscing ei, ancillae molestie per in. Malis principes duo +ea, usu liber postulant ei. + +Graece timeam voluptatibus eu eam. Alia probatus quo no, ea scripta +feugiat duo. Congue option meliore ex qui, noster invenire appellantur +ea vel. Eu exerci legendos vel. Consetetur repudiandae vim ut. Vix an +probo minimum, et nam illud falli tempor. + +Cum dico signiferumque eu. Sed ut regione maiorum, id veritus insolens +tacimates vix. Eu mel sint tamquam lucilius, duo no oporteat +tacimates. Atqui augue concludaturque vix ei, id mel utroque menandri. + +Ad oratio blandit aliquando pro. Vis et dolorum rationibus +philosophia, ad cum nulla molestie. Hinc fuisset adversarium eum et, +ne qui nisl verear saperet, vel te quaestio forensibus. Per odio +option delenit an. Alii placerat has no, in pri nihil platonem +cotidieque. Est ut elit copiosae scaevola, debet tollit maluisset sea +an. + +Te sea hinc debet pericula, liber ridens fabulas cu sed, quem mutat +accusam mea et. Elitr labitur albucius et pri, an labore feugait mel. +Velit zril melius usu ea. Ad stet putent interpretaris qui. Mel no +error volumus scripserit. In pro paulo iudico, quo ei dolorem +verterem, affert fabellas dissentiet ea vix. + +Vis quot deserunt te. Error aliquid detraxit eu usu, vis alia eruditi +salutatus cu. Est nostrud bonorum an, ei usu alii salutatus. Vel at +nisl primis, eum ex aperiri noluisse reformidans. Ad veri velit +utroque vis, ex equidem detraxit temporibus has. + +Inermis appareat usu ne. Eros placerat periculis mea ad, in dictas +pericula pro. Errem postulant at usu, ea nec amet ornatus mentitum. Ad +mazim graeco eum, vel ex percipit volutpat iudicabit, sit ne delicata +interesset. Mel sapientem prodesset abhorreant et, oblique suscipit +eam id. + +An maluisset disputando mea, vidit mnesarchum pri et. Malis insolens +inciderint no sea. Ea persius maluisset vix, ne vim appellantur +instructior, consul quidam definiebas pri id. Cum integre feugiat +pericula in, ex sed persius similique, mel ne natum dicit percipitur. + +Primis discere ne pri, errem putent definitionem at vis. Ei mel dolore +neglegentur, mei tincidunt percipitur ei. Pro ad simul integre +rationibus. Eu vel alii honestatis definitiones, mea no nonumy +reprehendunt. + +Dicta appareat legendos est cu. Eu vel congue dicunt omittam, no vix +adhuc minimum constituam, quot noluisse id mel. Eu quot sale mutat +duo, ex nisl munere invenire duo. Ne nec ullum utamur. Pro alterum +debitis nostrum no, ut vel aliquid vivendo. + +Aliquip fierent praesent quo ne, id sit audiam recusabo delicatissimi. +Usu postulant incorrupte cu. At pro dicit tibique intellegam, cibo +dolore impedit id eam, et aeque feugait assentior has. Quando sensibus +nec ex. Possit sensibus pri ad, unum mutat periculis cu vix. + +Mundi tibique vix te, duo simul partiendo qualisque id, est at vidit +sonet tempor. No per solet aeterno deseruisse. Petentium salutandi +definiebas pri cu. Munere vivendum est in. Ei justo congue eligendi +vis, modus offendit omittantur te mel. + +Integre voluptaria in qui, sit habemus tractatos constituam no. Utinam +melius conceptam est ne, quo in minimum apeirian delicata, ut ius +porro recusabo. Dicant expetenda vix no, ludus scripserit sed ex, eu +his modo nostro. Ut etiam sonet his, quodsi inciderint philosophia te +per. Nullam lobortis eu cum, vix an sonet efficiendi repudiandae. Vis +ad idque fabellas intellegebat. + +Eum commodo senserit conclusionemque ex. Sed forensibus sadipscing ut, +mei in facer delicata periculis, sea ne hinc putent cetero. Nec ne +alia corpora invenire, alia prima soleat te cum. Eleifend posidonium +nam at. + +Dolorum indoctum cu quo, ex dolor legendos recteque eam, cu pri zril +discere. Nec civibus officiis dissentiunt ex, est te liber ludus +elaboraret. Cum ea fabellas invenire. Ex vim nostrud eripuit +comprehensam, nam te inermis delectus, saepe inermis senserit. +` diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/atom/atom.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/atom/atom.go new file mode 100644 index 0000000..cd0a8ac --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/atom/atom.go @@ -0,0 +1,78 @@ +// 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 atom provides integer codes (also known as atoms) for a fixed set of +// frequently occurring HTML strings: tag names and attribute keys such as "p" +// and "id". +// +// Sharing an atom's name between all elements with the same tag can result in +// fewer string allocations when tokenizing and parsing HTML. Integer +// comparisons are also generally faster than string comparisons. +// +// The value of an atom's particular code is not guaranteed to stay the same +// between versions of this package. Neither is any ordering guaranteed: +// whether atom.H1 < atom.H2 may also change. The codes are not guaranteed to +// be dense. The only guarantees are that e.g. looking up "div" will yield +// atom.Div, calling atom.Div.String will return "div", and atom.Div != 0. +package atom // import "golang.org/x/net/html/atom" + +// Atom is an integer code for a string. The zero value maps to "". +type Atom uint32 + +// String returns the atom's name. +func (a Atom) String() string { + start := uint32(a >> 8) + n := uint32(a & 0xff) + if start+n > uint32(len(atomText)) { + return "" + } + return atomText[start : start+n] +} + +func (a Atom) string() string { + return atomText[a>>8 : a>>8+a&0xff] +} + +// fnv computes the FNV hash with an arbitrary starting value h. +func fnv(h uint32, s []byte) uint32 { + for i := range s { + h ^= uint32(s[i]) + h *= 16777619 + } + return h +} + +func match(s string, t []byte) bool { + for i, c := range t { + if s[i] != c { + return false + } + } + return true +} + +// Lookup returns the atom whose name is s. It returns zero if there is no +// such atom. The lookup is case sensitive. +func Lookup(s []byte) Atom { + if len(s) == 0 || len(s) > maxAtomLen { + return 0 + } + h := fnv(hash0, s) + if a := table[h&uint32(len(table)-1)]; int(a&0xff) == len(s) && match(a.string(), s) { + return a + } + if a := table[(h>>16)&uint32(len(table)-1)]; int(a&0xff) == len(s) && match(a.string(), s) { + return a + } + return 0 +} + +// String returns a string whose contents are equal to s. In that sense, it is +// equivalent to string(s) but may be more efficient. +func String(s []byte) string { + if a := Lookup(s); a != 0 { + return a.String() + } + return string(s) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/atom/atom_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/atom/atom_test.go new file mode 100644 index 0000000..6e33704 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/atom/atom_test.go @@ -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. + +package atom + +import ( + "sort" + "testing" +) + +func TestKnown(t *testing.T) { + for _, s := range testAtomList { + if atom := Lookup([]byte(s)); atom.String() != s { + t.Errorf("Lookup(%q) = %#x (%q)", s, uint32(atom), atom.String()) + } + } +} + +func TestHits(t *testing.T) { + for _, a := range table { + if a == 0 { + continue + } + got := Lookup([]byte(a.String())) + if got != a { + t.Errorf("Lookup(%q) = %#x, want %#x", a.String(), uint32(got), uint32(a)) + } + } +} + +func TestMisses(t *testing.T) { + testCases := []string{ + "", + "\x00", + "\xff", + "A", + "DIV", + "Div", + "dIV", + "aa", + "a\x00", + "ab", + "abb", + "abbr0", + "abbr ", + " abbr", + " a", + "acceptcharset", + "acceptCharset", + "accept_charset", + "h0", + "h1h2", + "h7", + "onClick", + "λ", + // The following string has the same hash (0xa1d7fab7) as "onmouseover". + "\x00\x00\x00\x00\x00\x50\x18\xae\x38\xd0\xb7", + } + for _, tc := range testCases { + got := Lookup([]byte(tc)) + if got != 0 { + t.Errorf("Lookup(%q): got %d, want 0", tc, got) + } + } +} + +func TestForeignObject(t *testing.T) { + const ( + afo = Foreignobject + afO = ForeignObject + sfo = "foreignobject" + sfO = "foreignObject" + ) + if got := Lookup([]byte(sfo)); got != afo { + t.Errorf("Lookup(%q): got %#v, want %#v", sfo, got, afo) + } + if got := Lookup([]byte(sfO)); got != afO { + t.Errorf("Lookup(%q): got %#v, want %#v", sfO, got, afO) + } + if got := afo.String(); got != sfo { + t.Errorf("Atom(%#v).String(): got %q, want %q", afo, got, sfo) + } + if got := afO.String(); got != sfO { + t.Errorf("Atom(%#v).String(): got %q, want %q", afO, got, sfO) + } +} + +func BenchmarkLookup(b *testing.B) { + sortedTable := make([]string, 0, len(table)) + for _, a := range table { + if a != 0 { + sortedTable = append(sortedTable, a.String()) + } + } + sort.Strings(sortedTable) + + x := make([][]byte, 1000) + for i := range x { + x[i] = []byte(sortedTable[i%len(sortedTable)]) + } + + b.ResetTimer() + for i := 0; i < b.N; i++ { + for _, s := range x { + Lookup(s) + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/atom/gen.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/atom/gen.go new file mode 100644 index 0000000..cc5dc5d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/atom/gen.go @@ -0,0 +1,709 @@ +// 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. + +// +build ignore + +//go:generate go run gen.go +//go:generate go run gen.go -test + +package main + +import ( + "bytes" + "flag" + "fmt" + "go/format" + "io/ioutil" + "math/rand" + "os" + "sort" + "strings" +) + +// identifier converts s to a Go exported identifier. +// It converts "div" to "Div" and "accept-charset" to "AcceptCharset". +func identifier(s string) string { + b := make([]byte, 0, len(s)) + cap := true + for _, c := range s { + if c == '-' { + cap = true + continue + } + if cap && 'a' <= c && c <= 'z' { + c -= 'a' - 'A' + } + cap = false + b = append(b, byte(c)) + } + return string(b) +} + +var test = flag.Bool("test", false, "generate table_test.go") + +func genFile(name string, buf *bytes.Buffer) { + b, err := format.Source(buf.Bytes()) + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + if err := ioutil.WriteFile(name, b, 0644); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} + +func main() { + flag.Parse() + + var all []string + all = append(all, elements...) + all = append(all, attributes...) + all = append(all, eventHandlers...) + all = append(all, extra...) + sort.Strings(all) + + // uniq - lists have dups + w := 0 + for _, s := range all { + if w == 0 || all[w-1] != s { + all[w] = s + w++ + } + } + all = all[:w] + + if *test { + var buf bytes.Buffer + fmt.Fprintln(&buf, "// Code generated by go generate gen.go; DO NOT EDIT.\n") + fmt.Fprintln(&buf, "//go:generate go run gen.go -test\n") + fmt.Fprintln(&buf, "package atom\n") + fmt.Fprintln(&buf, "var testAtomList = []string{") + for _, s := range all { + fmt.Fprintf(&buf, "\t%q,\n", s) + } + fmt.Fprintln(&buf, "}") + + genFile("table_test.go", &buf) + return + } + + // Find hash that minimizes table size. + var best *table + for i := 0; i < 1000000; i++ { + if best != nil && 1<<(best.k-1) < len(all) { + break + } + h := rand.Uint32() + for k := uint(0); k <= 16; k++ { + if best != nil && k >= best.k { + break + } + var t table + if t.init(h, k, all) { + best = &t + break + } + } + } + if best == nil { + fmt.Fprintf(os.Stderr, "failed to construct string table\n") + os.Exit(1) + } + + // Lay out strings, using overlaps when possible. + layout := append([]string{}, all...) + + // Remove strings that are substrings of other strings + for changed := true; changed; { + changed = false + for i, s := range layout { + if s == "" { + continue + } + for j, t := range layout { + if i != j && t != "" && strings.Contains(s, t) { + changed = true + layout[j] = "" + } + } + } + } + + // Join strings where one suffix matches another prefix. + for { + // Find best i, j, k such that layout[i][len-k:] == layout[j][:k], + // maximizing overlap length k. + besti := -1 + bestj := -1 + bestk := 0 + for i, s := range layout { + if s == "" { + continue + } + for j, t := range layout { + if i == j { + continue + } + for k := bestk + 1; k <= len(s) && k <= len(t); k++ { + if s[len(s)-k:] == t[:k] { + besti = i + bestj = j + bestk = k + } + } + } + } + if bestk > 0 { + layout[besti] += layout[bestj][bestk:] + layout[bestj] = "" + continue + } + break + } + + text := strings.Join(layout, "") + + atom := map[string]uint32{} + for _, s := range all { + off := strings.Index(text, s) + if off < 0 { + panic("lost string " + s) + } + atom[s] = uint32(off<<8 | len(s)) + } + + var buf bytes.Buffer + // Generate the Go code. + fmt.Fprintln(&buf, "// Code generated by go generate gen.go; DO NOT EDIT.\n") + fmt.Fprintln(&buf, "//go:generate go run gen.go\n") + fmt.Fprintln(&buf, "package atom\n\nconst (") + + // compute max len + maxLen := 0 + for _, s := range all { + if maxLen < len(s) { + maxLen = len(s) + } + fmt.Fprintf(&buf, "\t%s Atom = %#x\n", identifier(s), atom[s]) + } + fmt.Fprintln(&buf, ")\n") + + fmt.Fprintf(&buf, "const hash0 = %#x\n\n", best.h0) + fmt.Fprintf(&buf, "const maxAtomLen = %d\n\n", maxLen) + + fmt.Fprintf(&buf, "var table = [1<<%d]Atom{\n", best.k) + for i, s := range best.tab { + if s == "" { + continue + } + fmt.Fprintf(&buf, "\t%#x: %#x, // %s\n", i, atom[s], s) + } + fmt.Fprintf(&buf, "}\n") + datasize := (1 << best.k) * 4 + + fmt.Fprintln(&buf, "const atomText =") + textsize := len(text) + for len(text) > 60 { + fmt.Fprintf(&buf, "\t%q +\n", text[:60]) + text = text[60:] + } + fmt.Fprintf(&buf, "\t%q\n\n", text) + + genFile("table.go", &buf) + + fmt.Fprintf(os.Stdout, "%d atoms; %d string bytes + %d tables = %d total data\n", len(all), textsize, datasize, textsize+datasize) +} + +type byLen []string + +func (x byLen) Less(i, j int) bool { return len(x[i]) > len(x[j]) } +func (x byLen) Swap(i, j int) { x[i], x[j] = x[j], x[i] } +func (x byLen) Len() int { return len(x) } + +// fnv computes the FNV hash with an arbitrary starting value h. +func fnv(h uint32, s string) uint32 { + for i := 0; i < len(s); i++ { + h ^= uint32(s[i]) + h *= 16777619 + } + return h +} + +// A table represents an attempt at constructing the lookup table. +// The lookup table uses cuckoo hashing, meaning that each string +// can be found in one of two positions. +type table struct { + h0 uint32 + k uint + mask uint32 + tab []string +} + +// hash returns the two hashes for s. +func (t *table) hash(s string) (h1, h2 uint32) { + h := fnv(t.h0, s) + h1 = h & t.mask + h2 = (h >> 16) & t.mask + return +} + +// init initializes the table with the given parameters. +// h0 is the initial hash value, +// k is the number of bits of hash value to use, and +// x is the list of strings to store in the table. +// init returns false if the table cannot be constructed. +func (t *table) init(h0 uint32, k uint, x []string) bool { + t.h0 = h0 + t.k = k + t.tab = make([]string, 1< len(t.tab) { + return false + } + s := t.tab[i] + h1, h2 := t.hash(s) + j := h1 + h2 - i + if t.tab[j] != "" && !t.push(j, depth+1) { + return false + } + t.tab[j] = s + return true +} + +// The lists of element names and attribute keys were taken from +// https://html.spec.whatwg.org/multipage/indices.html#index +// as of the "HTML Living Standard - Last Updated 18 September 2017" version. + +// "command", "keygen" and "menuitem" have been removed from the spec, +// but are kept here for backwards compatibility. +var elements = []string{ + "a", + "abbr", + "address", + "area", + "article", + "aside", + "audio", + "b", + "base", + "bdi", + "bdo", + "blockquote", + "body", + "br", + "button", + "canvas", + "caption", + "cite", + "code", + "col", + "colgroup", + "command", + "data", + "datalist", + "dd", + "del", + "details", + "dfn", + "dialog", + "div", + "dl", + "dt", + "em", + "embed", + "fieldset", + "figcaption", + "figure", + "footer", + "form", + "h1", + "h2", + "h3", + "h4", + "h5", + "h6", + "head", + "header", + "hgroup", + "hr", + "html", + "i", + "iframe", + "img", + "input", + "ins", + "kbd", + "keygen", + "label", + "legend", + "li", + "link", + "main", + "map", + "mark", + "menu", + "menuitem", + "meta", + "meter", + "nav", + "noscript", + "object", + "ol", + "optgroup", + "option", + "output", + "p", + "param", + "picture", + "pre", + "progress", + "q", + "rp", + "rt", + "ruby", + "s", + "samp", + "script", + "section", + "select", + "slot", + "small", + "source", + "span", + "strong", + "style", + "sub", + "summary", + "sup", + "table", + "tbody", + "td", + "template", + "textarea", + "tfoot", + "th", + "thead", + "time", + "title", + "tr", + "track", + "u", + "ul", + "var", + "video", + "wbr", +} + +// https://html.spec.whatwg.org/multipage/indices.html#attributes-3 +// +// "challenge", "command", "contextmenu", "dropzone", "icon", "keytype", "mediagroup", +// "radiogroup", "spellcheck", "scoped", "seamless", "sortable" and "sorted" have been removed from the spec, +// but are kept here for backwards compatibility. +var attributes = []string{ + "abbr", + "accept", + "accept-charset", + "accesskey", + "action", + "allowfullscreen", + "allowpaymentrequest", + "allowusermedia", + "alt", + "as", + "async", + "autocomplete", + "autofocus", + "autoplay", + "challenge", + "charset", + "checked", + "cite", + "class", + "color", + "cols", + "colspan", + "command", + "content", + "contenteditable", + "contextmenu", + "controls", + "coords", + "crossorigin", + "data", + "datetime", + "default", + "defer", + "dir", + "dirname", + "disabled", + "download", + "draggable", + "dropzone", + "enctype", + "for", + "form", + "formaction", + "formenctype", + "formmethod", + "formnovalidate", + "formtarget", + "headers", + "height", + "hidden", + "high", + "href", + "hreflang", + "http-equiv", + "icon", + "id", + "inputmode", + "integrity", + "is", + "ismap", + "itemid", + "itemprop", + "itemref", + "itemscope", + "itemtype", + "keytype", + "kind", + "label", + "lang", + "list", + "loop", + "low", + "manifest", + "max", + "maxlength", + "media", + "mediagroup", + "method", + "min", + "minlength", + "multiple", + "muted", + "name", + "nomodule", + "nonce", + "novalidate", + "open", + "optimum", + "pattern", + "ping", + "placeholder", + "playsinline", + "poster", + "preload", + "radiogroup", + "readonly", + "referrerpolicy", + "rel", + "required", + "reversed", + "rows", + "rowspan", + "sandbox", + "spellcheck", + "scope", + "scoped", + "seamless", + "selected", + "shape", + "size", + "sizes", + "sortable", + "sorted", + "slot", + "span", + "spellcheck", + "src", + "srcdoc", + "srclang", + "srcset", + "start", + "step", + "style", + "tabindex", + "target", + "title", + "translate", + "type", + "typemustmatch", + "updateviacache", + "usemap", + "value", + "width", + "workertype", + "wrap", +} + +// "onautocomplete", "onautocompleteerror", "onmousewheel", +// "onshow" and "onsort" have been removed from the spec, +// but are kept here for backwards compatibility. +var eventHandlers = []string{ + "onabort", + "onautocomplete", + "onautocompleteerror", + "onauxclick", + "onafterprint", + "onbeforeprint", + "onbeforeunload", + "onblur", + "oncancel", + "oncanplay", + "oncanplaythrough", + "onchange", + "onclick", + "onclose", + "oncontextmenu", + "oncopy", + "oncuechange", + "oncut", + "ondblclick", + "ondrag", + "ondragend", + "ondragenter", + "ondragexit", + "ondragleave", + "ondragover", + "ondragstart", + "ondrop", + "ondurationchange", + "onemptied", + "onended", + "onerror", + "onfocus", + "onhashchange", + "oninput", + "oninvalid", + "onkeydown", + "onkeypress", + "onkeyup", + "onlanguagechange", + "onload", + "onloadeddata", + "onloadedmetadata", + "onloadend", + "onloadstart", + "onmessage", + "onmessageerror", + "onmousedown", + "onmouseenter", + "onmouseleave", + "onmousemove", + "onmouseout", + "onmouseover", + "onmouseup", + "onmousewheel", + "onwheel", + "onoffline", + "ononline", + "onpagehide", + "onpageshow", + "onpaste", + "onpause", + "onplay", + "onplaying", + "onpopstate", + "onprogress", + "onratechange", + "onreset", + "onresize", + "onrejectionhandled", + "onscroll", + "onsecuritypolicyviolation", + "onseeked", + "onseeking", + "onselect", + "onshow", + "onsort", + "onstalled", + "onstorage", + "onsubmit", + "onsuspend", + "ontimeupdate", + "ontoggle", + "onunhandledrejection", + "onunload", + "onvolumechange", + "onwaiting", +} + +// extra are ad-hoc values not covered by any of the lists above. +var extra = []string{ + "align", + "annotation", + "annotation-xml", + "applet", + "basefont", + "bgsound", + "big", + "blink", + "center", + "color", + "desc", + "face", + "font", + "foreignObject", // HTML is case-insensitive, but SVG-embedded-in-HTML is case-sensitive. + "foreignobject", + "frame", + "frameset", + "image", + "isindex", + "listing", + "malignmark", + "marquee", + "math", + "mglyph", + "mi", + "mn", + "mo", + "ms", + "mtext", + "nobr", + "noembed", + "noframes", + "plaintext", + "prompt", + "public", + "spacer", + "strike", + "svg", + "system", + "tt", + "xmp", +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/atom/table.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/atom/table.go new file mode 100644 index 0000000..f74018e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/atom/table.go @@ -0,0 +1,777 @@ +// Code generated by go generate gen.go; DO NOT EDIT. + +//go:generate go run gen.go + +package atom + +const ( + A Atom = 0x1 + Abbr Atom = 0x4 + Accept Atom = 0x1a06 + AcceptCharset Atom = 0x1a0e + Accesskey Atom = 0x2c09 + Action Atom = 0x25a06 + Address Atom = 0x6ed07 + Align Atom = 0x6d405 + Allowfullscreen Atom = 0x1f00f + Allowpaymentrequest Atom = 0x6913 + Allowusermedia Atom = 0x850e + Alt Atom = 0xb003 + Annotation Atom = 0x1b90a + AnnotationXml Atom = 0x1b90e + Applet Atom = 0x30106 + Area Atom = 0x34a04 + Article Atom = 0x3f007 + As Atom = 0xb902 + Aside Atom = 0xc105 + Async Atom = 0xb905 + Audio Atom = 0xcf05 + Autocomplete Atom = 0x2600c + Autofocus Atom = 0xeb09 + Autoplay Atom = 0x10608 + B Atom = 0x101 + Base Atom = 0x11504 + Basefont Atom = 0x11508 + Bdi Atom = 0x16103 + Bdo Atom = 0x13403 + Bgsound Atom = 0x14707 + Big Atom = 0x15903 + Blink Atom = 0x15c05 + Blockquote Atom = 0x1680a + Body Atom = 0x2804 + Br Atom = 0x202 + Button Atom = 0x17206 + Canvas Atom = 0xbd06 + Caption Atom = 0x21907 + Center Atom = 0x20806 + Challenge Atom = 0x28309 + Charset Atom = 0x2107 + Checked Atom = 0x46d07 + Cite Atom = 0x55804 + Class Atom = 0x5b905 + Code Atom = 0x19004 + Col Atom = 0x19703 + Colgroup Atom = 0x19708 + Color Atom = 0x1af05 + Cols Atom = 0x1b404 + Colspan Atom = 0x1b407 + Command Atom = 0x1c707 + Content Atom = 0x57f07 + Contenteditable Atom = 0x57f0f + Contextmenu Atom = 0x3740b + Controls Atom = 0x1ce08 + Coords Atom = 0x1da06 + Crossorigin Atom = 0x1e30b + Data Atom = 0x49904 + Datalist Atom = 0x49908 + Datetime Atom = 0x2a008 + Dd Atom = 0x2bf02 + Default Atom = 0xc407 + Defer Atom = 0x19205 + Del Atom = 0x44603 + Desc Atom = 0x55504 + Details Atom = 0x4607 + Dfn Atom = 0x5f03 + Dialog Atom = 0x16206 + Dir Atom = 0xa303 + Dirname Atom = 0xa307 + Disabled Atom = 0x14d08 + Div Atom = 0x15403 + Dl Atom = 0x5e202 + Download Atom = 0x45708 + Draggable Atom = 0x18309 + Dropzone Atom = 0x3f908 + Dt Atom = 0x64702 + Em Atom = 0x4202 + Embed Atom = 0x4205 + Enctype Atom = 0x27507 + Face Atom = 0x20604 + Fieldset Atom = 0x20e08 + Figcaption Atom = 0x2160a + Figure Atom = 0x23006 + Font Atom = 0x11904 + Footer Atom = 0xb306 + For Atom = 0x23c03 + ForeignObject Atom = 0x23c0d + Foreignobject Atom = 0x2490d + Form Atom = 0x25604 + Formaction Atom = 0x2560a + Formenctype Atom = 0x2710b + Formmethod Atom = 0x28c0a + Formnovalidate Atom = 0x2960e + Formtarget Atom = 0x2a80a + Frame Atom = 0x5705 + Frameset Atom = 0x5708 + H1 Atom = 0x14502 + H2 Atom = 0x2c602 + H3 Atom = 0x2f502 + H4 Atom = 0x33902 + H5 Atom = 0x34302 + H6 Atom = 0x64902 + Head Atom = 0x32504 + Header Atom = 0x32506 + Headers Atom = 0x32507 + Height Atom = 0x12c06 + Hgroup Atom = 0x2b206 + Hidden Atom = 0x2bd06 + High Atom = 0x2c304 + Hr Atom = 0x14002 + Href Atom = 0x2c804 + Hreflang Atom = 0x2c808 + Html Atom = 0x13004 + HttpEquiv Atom = 0x2d00a + I Atom = 0x601 + Icon Atom = 0x57e04 + Id Atom = 0xc302 + Iframe Atom = 0x2e406 + Image Atom = 0x2ea05 + Img Atom = 0x2ef03 + Input Atom = 0x43f05 + Inputmode Atom = 0x43f09 + Ins Atom = 0x1ec03 + Integrity Atom = 0x22709 + Is Atom = 0x14e02 + Isindex Atom = 0x2f707 + Ismap Atom = 0x2fe05 + Itemid Atom = 0x37f06 + Itemprop Atom = 0x55908 + Itemref Atom = 0x3c107 + Itemscope Atom = 0x66d09 + Itemtype Atom = 0x30708 + Kbd Atom = 0x16003 + Keygen Atom = 0x3206 + Keytype Atom = 0x7e07 + Kind Atom = 0x18004 + Label Atom = 0xda05 + Lang Atom = 0x2cc04 + Legend Atom = 0x18a06 + Li Atom = 0x11102 + Link Atom = 0x15d04 + List Atom = 0x49d04 + Listing Atom = 0x49d07 + Loop Atom = 0xde04 + Low Atom = 0x6b03 + Main Atom = 0x1004 + Malignmark Atom = 0x6d30a + Manifest Atom = 0x30f08 + Map Atom = 0x30003 + Mark Atom = 0x6d904 + Marquee Atom = 0x31b07 + Math Atom = 0x32204 + Max Atom = 0x33103 + Maxlength Atom = 0x33109 + Media Atom = 0x8e05 + Mediagroup Atom = 0x8e0a + Menu Atom = 0x37b04 + Menuitem Atom = 0x37b08 + Meta Atom = 0x4ac04 + Meter Atom = 0xa805 + Method Atom = 0x29006 + Mglyph Atom = 0x2f006 + Mi Atom = 0x33b02 + Min Atom = 0x33b03 + Minlength Atom = 0x33b09 + Mn Atom = 0x29902 + Mo Atom = 0x6302 + Ms Atom = 0x67002 + Mtext Atom = 0x34505 + Multiple Atom = 0x35308 + Muted Atom = 0x35b05 + Name Atom = 0xa604 + Nav Atom = 0x1303 + Nobr Atom = 0x3704 + Noembed Atom = 0x4007 + Noframes Atom = 0x5508 + Nomodule Atom = 0x6108 + Nonce Atom = 0x56205 + Noscript Atom = 0x1fe08 + Novalidate Atom = 0x29a0a + Object Atom = 0x25006 + Ol Atom = 0x10102 + Onabort Atom = 0x17607 + Onafterprint Atom = 0x21e0c + Onautocomplete Atom = 0x25e0e + Onautocompleteerror Atom = 0x25e13 + Onauxclick Atom = 0x61b0a + Onbeforeprint Atom = 0x69a0d + Onbeforeunload Atom = 0x6e10e + Onblur Atom = 0x5c206 + Oncancel Atom = 0xd308 + Oncanplay Atom = 0x13609 + Oncanplaythrough Atom = 0x13610 + Onchange Atom = 0x40f08 + Onclick Atom = 0x2dd07 + Onclose Atom = 0x36007 + Oncontextmenu Atom = 0x3720d + Oncopy Atom = 0x38506 + Oncuechange Atom = 0x38b0b + Oncut Atom = 0x39605 + Ondblclick Atom = 0x39b0a + Ondrag Atom = 0x3a506 + Ondragend Atom = 0x3a509 + Ondragenter Atom = 0x3ae0b + Ondragexit Atom = 0x3b90a + Ondragleave Atom = 0x3d30b + Ondragover Atom = 0x3de0a + Ondragstart Atom = 0x3e80b + Ondrop Atom = 0x3f706 + Ondurationchange Atom = 0x40710 + Onemptied Atom = 0x3fe09 + Onended Atom = 0x41707 + Onerror Atom = 0x41e07 + Onfocus Atom = 0x42507 + Onhashchange Atom = 0x4310c + Oninput Atom = 0x43d07 + Oninvalid Atom = 0x44909 + Onkeydown Atom = 0x45209 + Onkeypress Atom = 0x45f0a + Onkeyup Atom = 0x47407 + Onlanguagechange Atom = 0x48110 + Onload Atom = 0x49106 + Onloadeddata Atom = 0x4910c + Onloadedmetadata Atom = 0x4a410 + Onloadend Atom = 0x4ba09 + Onloadstart Atom = 0x4c30b + Onmessage Atom = 0x4ce09 + Onmessageerror Atom = 0x4ce0e + Onmousedown Atom = 0x4dc0b + Onmouseenter Atom = 0x4e70c + Onmouseleave Atom = 0x4f30c + Onmousemove Atom = 0x4ff0b + Onmouseout Atom = 0x50a0a + Onmouseover Atom = 0x5170b + Onmouseup Atom = 0x52209 + Onmousewheel Atom = 0x5300c + Onoffline Atom = 0x53c09 + Ononline Atom = 0x54508 + Onpagehide Atom = 0x54d0a + Onpageshow Atom = 0x5670a + Onpaste Atom = 0x57307 + Onpause Atom = 0x58e07 + Onplay Atom = 0x59806 + Onplaying Atom = 0x59809 + Onpopstate Atom = 0x5a10a + Onprogress Atom = 0x5ab0a + Onratechange Atom = 0x5c80c + Onrejectionhandled Atom = 0x5d412 + Onreset Atom = 0x5e607 + Onresize Atom = 0x5ed08 + Onscroll Atom = 0x5fc08 + Onsecuritypolicyviolation Atom = 0x60419 + Onseeked Atom = 0x62508 + Onseeking Atom = 0x62d09 + Onselect Atom = 0x63608 + Onshow Atom = 0x64006 + Onsort Atom = 0x64b06 + Onstalled Atom = 0x65509 + Onstorage Atom = 0x65e09 + Onsubmit Atom = 0x66708 + Onsuspend Atom = 0x67709 + Ontimeupdate Atom = 0x11a0c + Ontoggle Atom = 0x68008 + Onunhandledrejection Atom = 0x68814 + Onunload Atom = 0x6a708 + Onvolumechange Atom = 0x6af0e + Onwaiting Atom = 0x6bd09 + Onwheel Atom = 0x6c607 + Open Atom = 0x55f04 + Optgroup Atom = 0xe008 + Optimum Atom = 0x6cd07 + Option Atom = 0x6dd06 + Output Atom = 0x51106 + P Atom = 0xc01 + Param Atom = 0xc05 + Pattern Atom = 0x4f07 + Picture Atom = 0x9707 + Ping Atom = 0xe704 + Placeholder Atom = 0xfb0b + Plaintext Atom = 0x19e09 + Playsinline Atom = 0x10a0b + Poster Atom = 0x2b706 + Pre Atom = 0x46403 + Preload Atom = 0x47a07 + Progress Atom = 0x5ad08 + Prompt Atom = 0x52a06 + Public Atom = 0x57a06 + Q Atom = 0x7701 + Radiogroup Atom = 0x30a + Readonly Atom = 0x34b08 + Referrerpolicy Atom = 0x3c50e + Rel Atom = 0x47b03 + Required Atom = 0x23408 + Reversed Atom = 0x9c08 + Rows Atom = 0x3a04 + Rowspan Atom = 0x3a07 + Rp Atom = 0x22402 + Rt Atom = 0x17b02 + Ruby Atom = 0xac04 + S Atom = 0x2501 + Samp Atom = 0x4c04 + Sandbox Atom = 0xf307 + Scope Atom = 0x67105 + Scoped Atom = 0x67106 + Script Atom = 0x20006 + Seamless Atom = 0x36508 + Section Atom = 0x5bd07 + Select Atom = 0x63806 + Selected Atom = 0x63808 + Shape Atom = 0x1d505 + Size Atom = 0x5f104 + Sizes Atom = 0x5f105 + Slot Atom = 0x1df04 + Small Atom = 0x1ee05 + Sortable Atom = 0x64d08 + Sorted Atom = 0x32b06 + Source Atom = 0x36c06 + Spacer Atom = 0x42b06 + Span Atom = 0x3d04 + Spellcheck Atom = 0x4680a + Src Atom = 0x5b403 + Srcdoc Atom = 0x5b406 + Srclang Atom = 0x5f507 + Srcset Atom = 0x6f306 + Start Atom = 0x3ee05 + Step Atom = 0x57704 + Strike Atom = 0x7a06 + Strong Atom = 0x31506 + Style Atom = 0x6f905 + Sub Atom = 0x66903 + Summary Atom = 0x6fe07 + Sup Atom = 0x70503 + Svg Atom = 0x70803 + System Atom = 0x70b06 + Tabindex Atom = 0x4b208 + Table Atom = 0x58905 + Target Atom = 0x2ac06 + Tbody Atom = 0x2705 + Td Atom = 0x5e02 + Template Atom = 0x70e08 + Textarea Atom = 0x34608 + Tfoot Atom = 0xb205 + Th Atom = 0x13f02 + Thead Atom = 0x32405 + Time Atom = 0x11c04 + Title Atom = 0xca05 + Tr Atom = 0x7402 + Track Atom = 0x17c05 + Translate Atom = 0x1a609 + Tt Atom = 0x5102 + Type Atom = 0x8104 + Typemustmatch Atom = 0x2780d + U Atom = 0xb01 + Ul Atom = 0x6602 + Updateviacache Atom = 0x1200e + Usemap Atom = 0x59206 + Value Atom = 0x1505 + Var Atom = 0x15603 + Video Atom = 0x2d905 + Wbr Atom = 0x57003 + Width Atom = 0x64505 + Workertype Atom = 0x7160a + Wrap Atom = 0x72004 + Xmp Atom = 0xf903 +) + +const hash0 = 0x81cdf10e + +const maxAtomLen = 25 + +var table = [1 << 9]Atom{ + 0x1: 0x8e0a, // mediagroup + 0x2: 0x2cc04, // lang + 0x4: 0x2c09, // accesskey + 0x5: 0x5708, // frameset + 0x7: 0x63608, // onselect + 0x8: 0x70b06, // system + 0xa: 0x64505, // width + 0xc: 0x2710b, // formenctype + 0xd: 0x10102, // ol + 0xe: 0x38b0b, // oncuechange + 0x10: 0x13403, // bdo + 0x11: 0xcf05, // audio + 0x12: 0x18309, // draggable + 0x14: 0x2d905, // video + 0x15: 0x29902, // mn + 0x16: 0x37b04, // menu + 0x17: 0x2b706, // poster + 0x19: 0xb306, // footer + 0x1a: 0x29006, // method + 0x1b: 0x2a008, // datetime + 0x1c: 0x17607, // onabort + 0x1d: 0x1200e, // updateviacache + 0x1e: 0xb905, // async + 0x1f: 0x49106, // onload + 0x21: 0xd308, // oncancel + 0x22: 0x62508, // onseeked + 0x23: 0x2ea05, // image + 0x24: 0x5d412, // onrejectionhandled + 0x26: 0x15d04, // link + 0x27: 0x51106, // output + 0x28: 0x32504, // head + 0x29: 0x4f30c, // onmouseleave + 0x2a: 0x57307, // onpaste + 0x2b: 0x59809, // onplaying + 0x2c: 0x1b407, // colspan + 0x2f: 0x1af05, // color + 0x30: 0x5f104, // size + 0x31: 0x2d00a, // http-equiv + 0x33: 0x601, // i + 0x34: 0x54d0a, // onpagehide + 0x35: 0x68814, // onunhandledrejection + 0x37: 0x41e07, // onerror + 0x3a: 0x11508, // basefont + 0x3f: 0x1303, // nav + 0x40: 0x18004, // kind + 0x41: 0x34b08, // readonly + 0x42: 0x2f006, // mglyph + 0x44: 0x11102, // li + 0x46: 0x2bd06, // hidden + 0x47: 0x70803, // svg + 0x48: 0x57704, // step + 0x49: 0x22709, // integrity + 0x4a: 0x57a06, // public + 0x4c: 0x19703, // col + 0x4d: 0x1680a, // blockquote + 0x4e: 0x34302, // h5 + 0x50: 0x5ad08, // progress + 0x51: 0x5f105, // sizes + 0x52: 0x33902, // h4 + 0x56: 0x32405, // thead + 0x57: 0x7e07, // keytype + 0x58: 0x5ab0a, // onprogress + 0x59: 0x43f09, // inputmode + 0x5a: 0x3a509, // ondragend + 0x5d: 0x39605, // oncut + 0x5e: 0x42b06, // spacer + 0x5f: 0x19708, // colgroup + 0x62: 0x14e02, // is + 0x65: 0xb902, // as + 0x66: 0x53c09, // onoffline + 0x67: 0x32b06, // sorted + 0x69: 0x48110, // onlanguagechange + 0x6c: 0x4310c, // onhashchange + 0x6d: 0xa604, // name + 0x6e: 0xb205, // tfoot + 0x6f: 0x55504, // desc + 0x70: 0x33103, // max + 0x72: 0x1da06, // coords + 0x73: 0x2f502, // h3 + 0x74: 0x6e10e, // onbeforeunload + 0x75: 0x3a04, // rows + 0x76: 0x63806, // select + 0x77: 0xa805, // meter + 0x78: 0x37f06, // itemid + 0x79: 0x5300c, // onmousewheel + 0x7a: 0x5b406, // srcdoc + 0x7d: 0x17c05, // track + 0x7f: 0x30708, // itemtype + 0x82: 0x6302, // mo + 0x83: 0x40f08, // onchange + 0x84: 0x32507, // headers + 0x85: 0x5c80c, // onratechange + 0x86: 0x60419, // onsecuritypolicyviolation + 0x88: 0x49908, // datalist + 0x89: 0x4dc0b, // onmousedown + 0x8a: 0x1df04, // slot + 0x8b: 0x4a410, // onloadedmetadata + 0x8c: 0x1a06, // accept + 0x8d: 0x25006, // object + 0x91: 0x6af0e, // onvolumechange + 0x92: 0x2107, // charset + 0x93: 0x25e13, // onautocompleteerror + 0x94: 0x6913, // allowpaymentrequest + 0x95: 0x2804, // body + 0x96: 0xc407, // default + 0x97: 0x63808, // selected + 0x98: 0x20604, // face + 0x99: 0x1d505, // shape + 0x9b: 0x68008, // ontoggle + 0x9e: 0x64702, // dt + 0x9f: 0x6d904, // mark + 0xa1: 0xb01, // u + 0xa4: 0x6a708, // onunload + 0xa5: 0xde04, // loop + 0xa6: 0x14d08, // disabled + 0xaa: 0x41707, // onended + 0xab: 0x6d30a, // malignmark + 0xad: 0x67709, // onsuspend + 0xae: 0x34505, // mtext + 0xaf: 0x64b06, // onsort + 0xb0: 0x55908, // itemprop + 0xb3: 0x66d09, // itemscope + 0xb4: 0x15c05, // blink + 0xb6: 0x3a506, // ondrag + 0xb7: 0x6602, // ul + 0xb8: 0x25604, // form + 0xb9: 0xf307, // sandbox + 0xba: 0x5705, // frame + 0xbb: 0x1505, // value + 0xbc: 0x65e09, // onstorage + 0xc0: 0x17b02, // rt + 0xc2: 0x202, // br + 0xc3: 0x20e08, // fieldset + 0xc4: 0x2780d, // typemustmatch + 0xc5: 0x6108, // nomodule + 0xc6: 0x4007, // noembed + 0xc7: 0x69a0d, // onbeforeprint + 0xc8: 0x17206, // button + 0xc9: 0x2dd07, // onclick + 0xca: 0x6fe07, // summary + 0xcd: 0xac04, // ruby + 0xce: 0x5b905, // class + 0xcf: 0x3e80b, // ondragstart + 0xd0: 0x21907, // caption + 0xd4: 0x850e, // allowusermedia + 0xd5: 0x4c30b, // onloadstart + 0xd9: 0x15403, // div + 0xda: 0x49d04, // list + 0xdb: 0x32204, // math + 0xdc: 0x43f05, // input + 0xdf: 0x3de0a, // ondragover + 0xe0: 0x2c602, // h2 + 0xe2: 0x19e09, // plaintext + 0xe4: 0x4e70c, // onmouseenter + 0xe7: 0x46d07, // checked + 0xe8: 0x46403, // pre + 0xea: 0x35308, // multiple + 0xeb: 0x16103, // bdi + 0xec: 0x33109, // maxlength + 0xed: 0x7701, // q + 0xee: 0x61b0a, // onauxclick + 0xf0: 0x57003, // wbr + 0xf2: 0x11504, // base + 0xf3: 0x6dd06, // option + 0xf5: 0x40710, // ondurationchange + 0xf7: 0x5508, // noframes + 0xf9: 0x3f908, // dropzone + 0xfb: 0x67105, // scope + 0xfc: 0x9c08, // reversed + 0xfd: 0x3ae0b, // ondragenter + 0xfe: 0x3ee05, // start + 0xff: 0xf903, // xmp + 0x100: 0x5f507, // srclang + 0x101: 0x2ef03, // img + 0x104: 0x101, // b + 0x105: 0x23c03, // for + 0x106: 0xc105, // aside + 0x107: 0x43d07, // oninput + 0x108: 0x34a04, // area + 0x109: 0x28c0a, // formmethod + 0x10a: 0x72004, // wrap + 0x10c: 0x22402, // rp + 0x10d: 0x45f0a, // onkeypress + 0x10e: 0x5102, // tt + 0x110: 0x33b02, // mi + 0x111: 0x35b05, // muted + 0x112: 0xb003, // alt + 0x113: 0x19004, // code + 0x114: 0x4202, // em + 0x115: 0x3b90a, // ondragexit + 0x117: 0x3d04, // span + 0x119: 0x30f08, // manifest + 0x11a: 0x37b08, // menuitem + 0x11b: 0x57f07, // content + 0x11d: 0x6bd09, // onwaiting + 0x11f: 0x4ba09, // onloadend + 0x121: 0x3720d, // oncontextmenu + 0x123: 0x5c206, // onblur + 0x124: 0x3f007, // article + 0x125: 0xa303, // dir + 0x126: 0xe704, // ping + 0x127: 0x23408, // required + 0x128: 0x44909, // oninvalid + 0x129: 0x6d405, // align + 0x12b: 0x57e04, // icon + 0x12c: 0x64902, // h6 + 0x12d: 0x1b404, // cols + 0x12e: 0x2160a, // figcaption + 0x12f: 0x45209, // onkeydown + 0x130: 0x66708, // onsubmit + 0x131: 0x13609, // oncanplay + 0x132: 0x70503, // sup + 0x133: 0xc01, // p + 0x135: 0x3fe09, // onemptied + 0x136: 0x38506, // oncopy + 0x137: 0x55804, // cite + 0x138: 0x39b0a, // ondblclick + 0x13a: 0x4ff0b, // onmousemove + 0x13c: 0x66903, // sub + 0x13d: 0x47b03, // rel + 0x13e: 0xe008, // optgroup + 0x142: 0x3a07, // rowspan + 0x143: 0x36c06, // source + 0x144: 0x1fe08, // noscript + 0x145: 0x55f04, // open + 0x146: 0x1ec03, // ins + 0x147: 0x23c0d, // foreignObject + 0x148: 0x5a10a, // onpopstate + 0x14a: 0x27507, // enctype + 0x14b: 0x25e0e, // onautocomplete + 0x14c: 0x34608, // textarea + 0x14e: 0x2600c, // autocomplete + 0x14f: 0x14002, // hr + 0x150: 0x1ce08, // controls + 0x151: 0xc302, // id + 0x153: 0x21e0c, // onafterprint + 0x155: 0x2490d, // foreignobject + 0x156: 0x31b07, // marquee + 0x157: 0x58e07, // onpause + 0x158: 0x5e202, // dl + 0x159: 0x12c06, // height + 0x15a: 0x33b03, // min + 0x15b: 0xa307, // dirname + 0x15c: 0x1a609, // translate + 0x15d: 0x13004, // html + 0x15e: 0x33b09, // minlength + 0x15f: 0x47a07, // preload + 0x160: 0x70e08, // template + 0x161: 0x3d30b, // ondragleave + 0x164: 0x5b403, // src + 0x165: 0x31506, // strong + 0x167: 0x4c04, // samp + 0x168: 0x6ed07, // address + 0x169: 0x54508, // ononline + 0x16b: 0xfb0b, // placeholder + 0x16c: 0x2ac06, // target + 0x16d: 0x1ee05, // small + 0x16e: 0x6c607, // onwheel + 0x16f: 0x1b90a, // annotation + 0x170: 0x4680a, // spellcheck + 0x171: 0x4607, // details + 0x172: 0xbd06, // canvas + 0x173: 0xeb09, // autofocus + 0x174: 0xc05, // param + 0x176: 0x45708, // download + 0x177: 0x44603, // del + 0x178: 0x36007, // onclose + 0x179: 0x16003, // kbd + 0x17a: 0x30106, // applet + 0x17b: 0x2c804, // href + 0x17c: 0x5ed08, // onresize + 0x17e: 0x4910c, // onloadeddata + 0x180: 0x7402, // tr + 0x181: 0x2a80a, // formtarget + 0x182: 0xca05, // title + 0x183: 0x6f905, // style + 0x184: 0x7a06, // strike + 0x185: 0x59206, // usemap + 0x186: 0x2e406, // iframe + 0x187: 0x1004, // main + 0x189: 0x9707, // picture + 0x18c: 0x2fe05, // ismap + 0x18e: 0x49904, // data + 0x18f: 0xda05, // label + 0x191: 0x3c50e, // referrerpolicy + 0x192: 0x13f02, // th + 0x194: 0x52a06, // prompt + 0x195: 0x5bd07, // section + 0x197: 0x6cd07, // optimum + 0x198: 0x2c304, // high + 0x199: 0x14502, // h1 + 0x19a: 0x65509, // onstalled + 0x19b: 0x15603, // var + 0x19c: 0x11c04, // time + 0x19e: 0x67002, // ms + 0x19f: 0x32506, // header + 0x1a0: 0x4ce09, // onmessage + 0x1a1: 0x56205, // nonce + 0x1a2: 0x2560a, // formaction + 0x1a3: 0x20806, // center + 0x1a4: 0x3704, // nobr + 0x1a5: 0x58905, // table + 0x1a6: 0x49d07, // listing + 0x1a7: 0x18a06, // legend + 0x1a9: 0x28309, // challenge + 0x1aa: 0x23006, // figure + 0x1ab: 0x8e05, // media + 0x1ae: 0x8104, // type + 0x1af: 0x11904, // font + 0x1b0: 0x4ce0e, // onmessageerror + 0x1b1: 0x36508, // seamless + 0x1b2: 0x5f03, // dfn + 0x1b3: 0x19205, // defer + 0x1b4: 0x6b03, // low + 0x1b5: 0x62d09, // onseeking + 0x1b6: 0x5170b, // onmouseover + 0x1b7: 0x29a0a, // novalidate + 0x1b8: 0x7160a, // workertype + 0x1ba: 0x3c107, // itemref + 0x1bd: 0x1, // a + 0x1be: 0x30003, // map + 0x1bf: 0x11a0c, // ontimeupdate + 0x1c0: 0x14707, // bgsound + 0x1c1: 0x3206, // keygen + 0x1c2: 0x2705, // tbody + 0x1c5: 0x64006, // onshow + 0x1c7: 0x2501, // s + 0x1c8: 0x4f07, // pattern + 0x1cc: 0x13610, // oncanplaythrough + 0x1ce: 0x2bf02, // dd + 0x1cf: 0x6f306, // srcset + 0x1d0: 0x15903, // big + 0x1d2: 0x64d08, // sortable + 0x1d3: 0x47407, // onkeyup + 0x1d5: 0x59806, // onplay + 0x1d7: 0x4ac04, // meta + 0x1d8: 0x3f706, // ondrop + 0x1da: 0x5fc08, // onscroll + 0x1db: 0x1e30b, // crossorigin + 0x1dc: 0x5670a, // onpageshow + 0x1dd: 0x4, // abbr + 0x1de: 0x5e02, // td + 0x1df: 0x57f0f, // contenteditable + 0x1e0: 0x25a06, // action + 0x1e1: 0x10a0b, // playsinline + 0x1e2: 0x42507, // onfocus + 0x1e3: 0x2c808, // hreflang + 0x1e5: 0x50a0a, // onmouseout + 0x1e6: 0x5e607, // onreset + 0x1e7: 0x10608, // autoplay + 0x1ea: 0x67106, // scoped + 0x1ec: 0x30a, // radiogroup + 0x1ee: 0x3740b, // contextmenu + 0x1ef: 0x52209, // onmouseup + 0x1f1: 0x2b206, // hgroup + 0x1f2: 0x1f00f, // allowfullscreen + 0x1f3: 0x4b208, // tabindex + 0x1f6: 0x2f707, // isindex + 0x1f7: 0x1a0e, // accept-charset + 0x1f8: 0x2960e, // formnovalidate + 0x1fb: 0x1b90e, // annotation-xml + 0x1fc: 0x4205, // embed + 0x1fd: 0x20006, // script + 0x1fe: 0x16206, // dialog + 0x1ff: 0x1c707, // command +} + +const atomText = "abbradiogrouparamainavalueaccept-charsetbodyaccesskeygenobro" + + "wspanoembedetailsampatternoframesetdfnomoduleallowpaymentreq" + + "uestrikeytypeallowusermediagroupictureversedirnameterubyaltf" + + "ooterasyncanvasidefaultitleaudioncancelabelooptgroupingautof" + + "ocusandboxmplaceholderautoplaysinlinebasefontimeupdateviacac" + + "heightmlbdoncanplaythrough1bgsoundisabledivarbigblinkbdialog" + + "blockquotebuttonabortrackindraggablegendcodefercolgrouplaint" + + "extranslatecolorcolspannotation-xmlcommandcontrolshapecoords" + + "lotcrossoriginsmallowfullscreenoscriptfacenterfieldsetfigcap" + + "tionafterprintegrityfigurequiredforeignObjectforeignobjectfo" + + "rmactionautocompleteerrorformenctypemustmatchallengeformmeth" + + "odformnovalidatetimeformtargethgrouposterhiddenhigh2hreflang" + + "http-equivideonclickiframeimageimglyph3isindexismappletitemt" + + "ypemanifestrongmarqueematheadersortedmaxlength4minlength5mte" + + "xtareadonlymultiplemutedoncloseamlessourceoncontextmenuitemi" + + "doncopyoncuechangeoncutondblclickondragendondragenterondrage" + + "xitemreferrerpolicyondragleaveondragoverondragstarticleondro" + + "pzonemptiedondurationchangeonendedonerroronfocuspaceronhashc" + + "hangeoninputmodeloninvalidonkeydownloadonkeypresspellchecked" + + "onkeyupreloadonlanguagechangeonloadeddatalistingonloadedmeta" + + "databindexonloadendonloadstartonmessageerroronmousedownonmou" + + "seenteronmouseleaveonmousemoveonmouseoutputonmouseoveronmous" + + "eupromptonmousewheelonofflineononlineonpagehidescitempropeno" + + "nceonpageshowbronpastepublicontenteditableonpausemaponplayin" + + "gonpopstateonprogressrcdoclassectionbluronratechangeonreject" + + "ionhandledonresetonresizesrclangonscrollonsecuritypolicyviol" + + "ationauxclickonseekedonseekingonselectedonshowidth6onsortabl" + + "eonstalledonstorageonsubmitemscopedonsuspendontoggleonunhand" + + "ledrejectionbeforeprintonunloadonvolumechangeonwaitingonwhee" + + "loptimumalignmarkoptionbeforeunloaddressrcsetstylesummarysup" + + "svgsystemplateworkertypewrap" diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/atom/table_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/atom/table_test.go new file mode 100644 index 0000000..1689105 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/atom/table_test.go @@ -0,0 +1,373 @@ +// Code generated by go generate gen.go; DO NOT EDIT. + +//go:generate go run gen.go -test + +package atom + +var testAtomList = []string{ + "a", + "abbr", + "accept", + "accept-charset", + "accesskey", + "action", + "address", + "align", + "allowfullscreen", + "allowpaymentrequest", + "allowusermedia", + "alt", + "annotation", + "annotation-xml", + "applet", + "area", + "article", + "as", + "aside", + "async", + "audio", + "autocomplete", + "autofocus", + "autoplay", + "b", + "base", + "basefont", + "bdi", + "bdo", + "bgsound", + "big", + "blink", + "blockquote", + "body", + "br", + "button", + "canvas", + "caption", + "center", + "challenge", + "charset", + "checked", + "cite", + "class", + "code", + "col", + "colgroup", + "color", + "cols", + "colspan", + "command", + "content", + "contenteditable", + "contextmenu", + "controls", + "coords", + "crossorigin", + "data", + "datalist", + "datetime", + "dd", + "default", + "defer", + "del", + "desc", + "details", + "dfn", + "dialog", + "dir", + "dirname", + "disabled", + "div", + "dl", + "download", + "draggable", + "dropzone", + "dt", + "em", + "embed", + "enctype", + "face", + "fieldset", + "figcaption", + "figure", + "font", + "footer", + "for", + "foreignObject", + "foreignobject", + "form", + "formaction", + "formenctype", + "formmethod", + "formnovalidate", + "formtarget", + "frame", + "frameset", + "h1", + "h2", + "h3", + "h4", + "h5", + "h6", + "head", + "header", + "headers", + "height", + "hgroup", + "hidden", + "high", + "hr", + "href", + "hreflang", + "html", + "http-equiv", + "i", + "icon", + "id", + "iframe", + "image", + "img", + "input", + "inputmode", + "ins", + "integrity", + "is", + "isindex", + "ismap", + "itemid", + "itemprop", + "itemref", + "itemscope", + "itemtype", + "kbd", + "keygen", + "keytype", + "kind", + "label", + "lang", + "legend", + "li", + "link", + "list", + "listing", + "loop", + "low", + "main", + "malignmark", + "manifest", + "map", + "mark", + "marquee", + "math", + "max", + "maxlength", + "media", + "mediagroup", + "menu", + "menuitem", + "meta", + "meter", + "method", + "mglyph", + "mi", + "min", + "minlength", + "mn", + "mo", + "ms", + "mtext", + "multiple", + "muted", + "name", + "nav", + "nobr", + "noembed", + "noframes", + "nomodule", + "nonce", + "noscript", + "novalidate", + "object", + "ol", + "onabort", + "onafterprint", + "onautocomplete", + "onautocompleteerror", + "onauxclick", + "onbeforeprint", + "onbeforeunload", + "onblur", + "oncancel", + "oncanplay", + "oncanplaythrough", + "onchange", + "onclick", + "onclose", + "oncontextmenu", + "oncopy", + "oncuechange", + "oncut", + "ondblclick", + "ondrag", + "ondragend", + "ondragenter", + "ondragexit", + "ondragleave", + "ondragover", + "ondragstart", + "ondrop", + "ondurationchange", + "onemptied", + "onended", + "onerror", + "onfocus", + "onhashchange", + "oninput", + "oninvalid", + "onkeydown", + "onkeypress", + "onkeyup", + "onlanguagechange", + "onload", + "onloadeddata", + "onloadedmetadata", + "onloadend", + "onloadstart", + "onmessage", + "onmessageerror", + "onmousedown", + "onmouseenter", + "onmouseleave", + "onmousemove", + "onmouseout", + "onmouseover", + "onmouseup", + "onmousewheel", + "onoffline", + "ononline", + "onpagehide", + "onpageshow", + "onpaste", + "onpause", + "onplay", + "onplaying", + "onpopstate", + "onprogress", + "onratechange", + "onrejectionhandled", + "onreset", + "onresize", + "onscroll", + "onsecuritypolicyviolation", + "onseeked", + "onseeking", + "onselect", + "onshow", + "onsort", + "onstalled", + "onstorage", + "onsubmit", + "onsuspend", + "ontimeupdate", + "ontoggle", + "onunhandledrejection", + "onunload", + "onvolumechange", + "onwaiting", + "onwheel", + "open", + "optgroup", + "optimum", + "option", + "output", + "p", + "param", + "pattern", + "picture", + "ping", + "placeholder", + "plaintext", + "playsinline", + "poster", + "pre", + "preload", + "progress", + "prompt", + "public", + "q", + "radiogroup", + "readonly", + "referrerpolicy", + "rel", + "required", + "reversed", + "rows", + "rowspan", + "rp", + "rt", + "ruby", + "s", + "samp", + "sandbox", + "scope", + "scoped", + "script", + "seamless", + "section", + "select", + "selected", + "shape", + "size", + "sizes", + "slot", + "small", + "sortable", + "sorted", + "source", + "spacer", + "span", + "spellcheck", + "src", + "srcdoc", + "srclang", + "srcset", + "start", + "step", + "strike", + "strong", + "style", + "sub", + "summary", + "sup", + "svg", + "system", + "tabindex", + "table", + "target", + "tbody", + "td", + "template", + "textarea", + "tfoot", + "th", + "thead", + "time", + "title", + "tr", + "track", + "translate", + "tt", + "type", + "typemustmatch", + "u", + "ul", + "updateviacache", + "usemap", + "value", + "var", + "video", + "wbr", + "width", + "workertype", + "wrap", + "xmp", +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/charset.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/charset.go new file mode 100644 index 0000000..13bed15 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/charset.go @@ -0,0 +1,257 @@ +// 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 charset provides common text encodings for HTML documents. +// +// The mapping from encoding labels to encodings is defined at +// https://encoding.spec.whatwg.org/. +package charset // import "golang.org/x/net/html/charset" + +import ( + "bytes" + "fmt" + "io" + "mime" + "strings" + "unicode/utf8" + + "golang.org/x/net/html" + "golang.org/x/text/encoding" + "golang.org/x/text/encoding/charmap" + "golang.org/x/text/encoding/htmlindex" + "golang.org/x/text/transform" +) + +// Lookup returns the encoding with the specified label, and its canonical +// name. It returns nil and the empty string if label is not one of the +// standard encodings for HTML. Matching is case-insensitive and ignores +// leading and trailing whitespace. Encoders will use HTML escape sequences for +// runes that are not supported by the character set. +func Lookup(label string) (e encoding.Encoding, name string) { + e, err := htmlindex.Get(label) + if err != nil { + return nil, "" + } + name, _ = htmlindex.Name(e) + return &htmlEncoding{e}, name +} + +type htmlEncoding struct{ encoding.Encoding } + +func (h *htmlEncoding) NewEncoder() *encoding.Encoder { + // HTML requires a non-terminating legacy encoder. We use HTML escapes to + // substitute unsupported code points. + return encoding.HTMLEscapeUnsupported(h.Encoding.NewEncoder()) +} + +// DetermineEncoding determines the encoding of an HTML document by examining +// up to the first 1024 bytes of content and the declared Content-Type. +// +// See http://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html#determining-the-character-encoding +func DetermineEncoding(content []byte, contentType string) (e encoding.Encoding, name string, certain bool) { + if len(content) > 1024 { + content = content[:1024] + } + + for _, b := range boms { + if bytes.HasPrefix(content, b.bom) { + e, name = Lookup(b.enc) + return e, name, true + } + } + + if _, params, err := mime.ParseMediaType(contentType); err == nil { + if cs, ok := params["charset"]; ok { + if e, name = Lookup(cs); e != nil { + return e, name, true + } + } + } + + if len(content) > 0 { + e, name = prescan(content) + if e != nil { + return e, name, false + } + } + + // Try to detect UTF-8. + // First eliminate any partial rune at the end. + for i := len(content) - 1; i >= 0 && i > len(content)-4; i-- { + b := content[i] + if b < 0x80 { + break + } + if utf8.RuneStart(b) { + content = content[:i] + break + } + } + hasHighBit := false + for _, c := range content { + if c >= 0x80 { + hasHighBit = true + break + } + } + if hasHighBit && utf8.Valid(content) { + return encoding.Nop, "utf-8", false + } + + // TODO: change default depending on user's locale? + return charmap.Windows1252, "windows-1252", false +} + +// NewReader returns an io.Reader that converts the content of r to UTF-8. +// It calls DetermineEncoding to find out what r's encoding is. +func NewReader(r io.Reader, contentType string) (io.Reader, error) { + preview := make([]byte, 1024) + n, err := io.ReadFull(r, preview) + switch { + case err == io.ErrUnexpectedEOF: + preview = preview[:n] + r = bytes.NewReader(preview) + case err != nil: + return nil, err + default: + r = io.MultiReader(bytes.NewReader(preview), r) + } + + if e, _, _ := DetermineEncoding(preview, contentType); e != encoding.Nop { + r = transform.NewReader(r, e.NewDecoder()) + } + return r, nil +} + +// NewReaderLabel returns a reader that converts from the specified charset to +// UTF-8. It uses Lookup to find the encoding that corresponds to label, and +// returns an error if Lookup returns nil. It is suitable for use as +// encoding/xml.Decoder's CharsetReader function. +func NewReaderLabel(label string, input io.Reader) (io.Reader, error) { + e, _ := Lookup(label) + if e == nil { + return nil, fmt.Errorf("unsupported charset: %q", label) + } + return transform.NewReader(input, e.NewDecoder()), nil +} + +func prescan(content []byte) (e encoding.Encoding, name string) { + z := html.NewTokenizer(bytes.NewReader(content)) + for { + switch z.Next() { + case html.ErrorToken: + return nil, "" + + case html.StartTagToken, html.SelfClosingTagToken: + tagName, hasAttr := z.TagName() + if !bytes.Equal(tagName, []byte("meta")) { + continue + } + attrList := make(map[string]bool) + gotPragma := false + + const ( + dontKnow = iota + doNeedPragma + doNotNeedPragma + ) + needPragma := dontKnow + + name = "" + e = nil + for hasAttr { + var key, val []byte + key, val, hasAttr = z.TagAttr() + ks := string(key) + if attrList[ks] { + continue + } + attrList[ks] = true + for i, c := range val { + if 'A' <= c && c <= 'Z' { + val[i] = c + 0x20 + } + } + + switch ks { + case "http-equiv": + if bytes.Equal(val, []byte("content-type")) { + gotPragma = true + } + + case "content": + if e == nil { + name = fromMetaElement(string(val)) + if name != "" { + e, name = Lookup(name) + if e != nil { + needPragma = doNeedPragma + } + } + } + + case "charset": + e, name = Lookup(string(val)) + needPragma = doNotNeedPragma + } + } + + if needPragma == dontKnow || needPragma == doNeedPragma && !gotPragma { + continue + } + + if strings.HasPrefix(name, "utf-16") { + name = "utf-8" + e = encoding.Nop + } + + if e != nil { + return e, name + } + } + } +} + +func fromMetaElement(s string) string { + for s != "" { + csLoc := strings.Index(s, "charset") + if csLoc == -1 { + return "" + } + s = s[csLoc+len("charset"):] + s = strings.TrimLeft(s, " \t\n\f\r") + if !strings.HasPrefix(s, "=") { + continue + } + s = s[1:] + s = strings.TrimLeft(s, " \t\n\f\r") + if s == "" { + return "" + } + if q := s[0]; q == '"' || q == '\'' { + s = s[1:] + closeQuote := strings.IndexRune(s, rune(q)) + if closeQuote == -1 { + return "" + } + return s[:closeQuote] + } + + end := strings.IndexAny(s, "; \t\n\f\r") + if end == -1 { + end = len(s) + } + return s[:end] + } + return "" +} + +var boms = []struct { + bom []byte + enc string +}{ + {[]byte{0xfe, 0xff}, "utf-16be"}, + {[]byte{0xff, 0xfe}, "utf-16le"}, + {[]byte{0xef, 0xbb, 0xbf}, "utf-8"}, +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/charset_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/charset_test.go new file mode 100644 index 0000000..e4e7d86 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/charset_test.go @@ -0,0 +1,237 @@ +// 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 charset + +import ( + "bytes" + "encoding/xml" + "io/ioutil" + "runtime" + "strings" + "testing" + + "golang.org/x/text/transform" +) + +func transformString(t transform.Transformer, s string) (string, error) { + r := transform.NewReader(strings.NewReader(s), t) + b, err := ioutil.ReadAll(r) + return string(b), err +} + +type testCase struct { + utf8, other, otherEncoding string +} + +// testCases for encoding and decoding. +var testCases = []testCase{ + {"Résumé", "Résumé", "utf8"}, + {"Résumé", "R\xe9sum\xe9", "latin1"}, + {"これは漢字です。", "S0\x8c0o0\"oW[g0Y0\x020", "UTF-16LE"}, + {"これは漢字です。", "0S0\x8c0oo\"[W0g0Y0\x02", "UTF-16BE"}, + {"Hello, world", "Hello, world", "ASCII"}, + {"Gdańsk", "Gda\xf1sk", "ISO-8859-2"}, + {"Ââ Čč Đđ Ŋŋ Õõ Šš Žž Åå Ää", "\xc2\xe2 \xc8\xe8 \xa9\xb9 \xaf\xbf \xd5\xf5 \xaa\xba \xac\xbc \xc5\xe5 \xc4\xe4", "ISO-8859-10"}, + {"สำหรับ", "\xca\xd3\xcb\xc3\u047a", "ISO-8859-11"}, + {"latviešu", "latvie\xf0u", "ISO-8859-13"}, + {"Seònaid", "Se\xf2naid", "ISO-8859-14"}, + {"€1 is cheap", "\xa41 is cheap", "ISO-8859-15"}, + {"românește", "rom\xe2ne\xbate", "ISO-8859-16"}, + {"nutraĵo", "nutra\xbco", "ISO-8859-3"}, + {"Kalâdlit", "Kal\xe2dlit", "ISO-8859-4"}, + {"русский", "\xe0\xe3\xe1\xe1\xda\xd8\xd9", "ISO-8859-5"}, + {"ελληνικά", "\xe5\xeb\xeb\xe7\xed\xe9\xea\xdc", "ISO-8859-7"}, + {"Kağan", "Ka\xf0an", "ISO-8859-9"}, + {"Résumé", "R\x8esum\x8e", "macintosh"}, + {"Gdańsk", "Gda\xf1sk", "windows-1250"}, + {"русский", "\xf0\xf3\xf1\xf1\xea\xe8\xe9", "windows-1251"}, + {"Résumé", "R\xe9sum\xe9", "windows-1252"}, + {"ελληνικά", "\xe5\xeb\xeb\xe7\xed\xe9\xea\xdc", "windows-1253"}, + {"Kağan", "Ka\xf0an", "windows-1254"}, + {"עִבְרִית", "\xf2\xc4\xe1\xc0\xf8\xc4\xe9\xfa", "windows-1255"}, + {"العربية", "\xc7\xe1\xda\xd1\xc8\xed\xc9", "windows-1256"}, + {"latviešu", "latvie\xf0u", "windows-1257"}, + {"Việt", "Vi\xea\xf2t", "windows-1258"}, + {"สำหรับ", "\xca\xd3\xcb\xc3\u047a", "windows-874"}, + {"русский", "\xd2\xd5\xd3\xd3\xcb\xc9\xca", "KOI8-R"}, + {"українська", "\xd5\xcb\xd2\xc1\xa7\xce\xd3\xd8\xcb\xc1", "KOI8-U"}, + {"Hello 常用國字標準字體表", "Hello \xb1`\xa5\u03b0\xea\xa6r\xbc\u0437\u01e6r\xc5\xe9\xaa\xed", "big5"}, + {"Hello 常用國字標準字體表", "Hello \xb3\xa3\xd3\xc3\x87\xf8\xd7\xd6\x98\xcb\x9c\xca\xd7\xd6\xf3\x77\xb1\xed", "gbk"}, + {"Hello 常用國字標準字體表", "Hello \xb3\xa3\xd3\xc3\x87\xf8\xd7\xd6\x98\xcb\x9c\xca\xd7\xd6\xf3\x77\xb1\xed", "gb18030"}, + {"עִבְרִית", "\x81\x30\xfb\x30\x81\x30\xf6\x34\x81\x30\xf9\x33\x81\x30\xf6\x30\x81\x30\xfb\x36\x81\x30\xf6\x34\x81\x30\xfa\x31\x81\x30\xfb\x38", "gb18030"}, + {"㧯", "\x82\x31\x89\x38", "gb18030"}, + {"これは漢字です。", "\x82\xb1\x82\xea\x82\xcd\x8a\xbf\x8e\x9a\x82\xc5\x82\xb7\x81B", "SJIS"}, + {"Hello, 世界!", "Hello, \x90\xa2\x8aE!", "SJIS"}, + {"イウエオカ", "\xb2\xb3\xb4\xb5\xb6", "SJIS"}, + {"これは漢字です。", "\xa4\xb3\xa4\xec\xa4\u03f4\xc1\xbb\xfa\xa4\u01e4\xb9\xa1\xa3", "EUC-JP"}, + {"Hello, 世界!", "Hello, \x1b$B@$3&\x1b(B!", "ISO-2022-JP"}, + {"다음과 같은 조건을 따라야 합니다: 저작자표시", "\xb4\xd9\xc0\xbd\xb0\xfa \xb0\xb0\xc0\xba \xc1\xb6\xb0\xc7\xc0\xbb \xb5\xfb\xb6\xf3\xbe\xdf \xc7մϴ\xd9: \xc0\xfa\xc0\xdb\xc0\xdaǥ\xbd\xc3", "EUC-KR"}, +} + +func TestDecode(t *testing.T) { + testCases := append(testCases, []testCase{ + // Replace multi-byte maximum subpart of ill-formed subsequence with + // single replacement character (WhatWG requirement). + {"Rés\ufffdumé", "Rés\xe1\x80umé", "utf8"}, + }...) + for _, tc := range testCases { + e, _ := Lookup(tc.otherEncoding) + if e == nil { + t.Errorf("%s: not found", tc.otherEncoding) + continue + } + s, err := transformString(e.NewDecoder(), tc.other) + if err != nil { + t.Errorf("%s: decode %q: %v", tc.otherEncoding, tc.other, err) + continue + } + if s != tc.utf8 { + t.Errorf("%s: got %q, want %q", tc.otherEncoding, s, tc.utf8) + } + } +} + +func TestEncode(t *testing.T) { + testCases := append(testCases, []testCase{ + // Use Go-style replacement. + {"Rés\xe1\x80umé", "Rés\ufffd\ufffdumé", "utf8"}, + // U+0144 LATIN SMALL LETTER N WITH ACUTE not supported by encoding. + {"Gdańsk", "Gdańsk", "ISO-8859-11"}, + {"\ufffd", "�", "ISO-8859-11"}, + {"a\xe1\x80b", "a��b", "ISO-8859-11"}, + }...) + for _, tc := range testCases { + e, _ := Lookup(tc.otherEncoding) + if e == nil { + t.Errorf("%s: not found", tc.otherEncoding) + continue + } + s, err := transformString(e.NewEncoder(), tc.utf8) + if err != nil { + t.Errorf("%s: encode %q: %s", tc.otherEncoding, tc.utf8, err) + continue + } + if s != tc.other { + t.Errorf("%s: got %q, want %q", tc.otherEncoding, s, tc.other) + } + } +} + +var sniffTestCases = []struct { + filename, declared, want string +}{ + {"HTTP-charset.html", "text/html; charset=iso-8859-15", "iso-8859-15"}, + {"UTF-16LE-BOM.html", "", "utf-16le"}, + {"UTF-16BE-BOM.html", "", "utf-16be"}, + {"meta-content-attribute.html", "text/html", "iso-8859-15"}, + {"meta-charset-attribute.html", "text/html", "iso-8859-15"}, + {"No-encoding-declaration.html", "text/html", "utf-8"}, + {"HTTP-vs-UTF-8-BOM.html", "text/html; charset=iso-8859-15", "utf-8"}, + {"HTTP-vs-meta-content.html", "text/html; charset=iso-8859-15", "iso-8859-15"}, + {"HTTP-vs-meta-charset.html", "text/html; charset=iso-8859-15", "iso-8859-15"}, + {"UTF-8-BOM-vs-meta-content.html", "text/html", "utf-8"}, + {"UTF-8-BOM-vs-meta-charset.html", "text/html", "utf-8"}, +} + +func TestSniff(t *testing.T) { + switch runtime.GOOS { + case "nacl": // platforms that don't permit direct file system access + t.Skipf("not supported on %q", runtime.GOOS) + } + + for _, tc := range sniffTestCases { + content, err := ioutil.ReadFile("testdata/" + tc.filename) + if err != nil { + t.Errorf("%s: error reading file: %v", tc.filename, err) + continue + } + + _, name, _ := DetermineEncoding(content, tc.declared) + if name != tc.want { + t.Errorf("%s: got %q, want %q", tc.filename, name, tc.want) + continue + } + } +} + +func TestReader(t *testing.T) { + switch runtime.GOOS { + case "nacl": // platforms that don't permit direct file system access + t.Skipf("not supported on %q", runtime.GOOS) + } + + for _, tc := range sniffTestCases { + content, err := ioutil.ReadFile("testdata/" + tc.filename) + if err != nil { + t.Errorf("%s: error reading file: %v", tc.filename, err) + continue + } + + r, err := NewReader(bytes.NewReader(content), tc.declared) + if err != nil { + t.Errorf("%s: error creating reader: %v", tc.filename, err) + continue + } + + got, err := ioutil.ReadAll(r) + if err != nil { + t.Errorf("%s: error reading from charset.NewReader: %v", tc.filename, err) + continue + } + + e, _ := Lookup(tc.want) + want, err := ioutil.ReadAll(transform.NewReader(bytes.NewReader(content), e.NewDecoder())) + if err != nil { + t.Errorf("%s: error decoding with hard-coded charset name: %v", tc.filename, err) + continue + } + + if !bytes.Equal(got, want) { + t.Errorf("%s: got %q, want %q", tc.filename, got, want) + continue + } + } +} + +var metaTestCases = []struct { + meta, want string +}{ + {"", ""}, + {"text/html", ""}, + {"text/html; charset utf-8", ""}, + {"text/html; charset=latin-2", "latin-2"}, + {"text/html; charset; charset = utf-8", "utf-8"}, + {`charset="big5"`, "big5"}, + {"charset='shift_jis'", "shift_jis"}, +} + +func TestFromMeta(t *testing.T) { + for _, tc := range metaTestCases { + got := fromMetaElement(tc.meta) + if got != tc.want { + t.Errorf("%q: got %q, want %q", tc.meta, got, tc.want) + } + } +} + +func TestXML(t *testing.T) { + const s = "r\xe9sum\xe9" + + d := xml.NewDecoder(strings.NewReader(s)) + d.CharsetReader = NewReaderLabel + + var a struct { + Word string + } + err := d.Decode(&a) + if err != nil { + t.Fatalf("Decode: %v", err) + } + + want := "résumé" + if a.Word != want { + t.Errorf("got %q, want %q", a.Word, want) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/HTTP-charset.html b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/HTTP-charset.html new file mode 100644 index 0000000..9915fa0 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/HTTP-charset.html @@ -0,0 +1,48 @@ + + + + HTTP charset + + + + + + + + + + + +

HTTP charset

+ + +
+ + +
 
+ + + + + +
+

The character encoding of a page can be set using the HTTP header charset declaration.

+

The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ÜÀÚ. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.

The only character encoding declaration for this HTML file is in the HTTP header, which sets the encoding to ISO 8859-15.

+
+
+
HTML5
+

the-input-byte-stream-001
Result summary & related tests
Detailed results for this test
Link to spec

+
Assumptions:
  • The default encoding for the browser you are testing is not set to ISO 8859-15.
  • +
  • The test is read from a server that supports HTTP.
+
+ + + + + + diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-UTF-8-BOM.html b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-UTF-8-BOM.html new file mode 100644 index 0000000..26e5d8b --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-UTF-8-BOM.html @@ -0,0 +1,48 @@ + + + + HTTP vs UTF-8 BOM + + + + + + + + + + + +

HTTP vs UTF-8 BOM

+ + +
+ + +
 
+ + + + + +
+

A character encoding set in the HTTP header has lower precedence than the UTF-8 signature.

+

The HTTP header attempts to set the character encoding to ISO 8859-15. The page starts with a UTF-8 signature.

The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ýäè. This matches the sequence of bytes above when they are interpreted as UTF-8. If the class name matches the selector then the test will pass.

If the test is unsuccessful, the characters  should appear at the top of the page. These represent the bytes that make up the UTF-8 signature when encountered in the ISO 8859-15 encoding.

+
+
+
HTML5
+

the-input-byte-stream-034
Result summary & related tests
Detailed results for this test
Link to spec

+
Assumptions:
  • The default encoding for the browser you are testing is not set to ISO 8859-15.
  • +
  • The test is read from a server that supports HTTP.
+
+ + + + + + diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-charset.html b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-charset.html new file mode 100644 index 0000000..2f07e95 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-charset.html @@ -0,0 +1,49 @@ + + + + HTTP vs meta charset + + + + + + + + + + + +

HTTP vs meta charset

+ + +
+ + +
 
+ + + + + +
+

The HTTP header has a higher precedence than an encoding declaration in a meta charset attribute.

+

The HTTP header attempts to set the character encoding to ISO 8859-15. The page contains an encoding declaration in a meta charset attribute that attempts to set the character encoding to ISO 8859-1.

The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ÜÀÚ. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.

+
+
+
HTML5
+

the-input-byte-stream-018
Result summary & related tests
Detailed results for this test
Link to spec

+
Assumptions:
  • The default encoding for the browser you are testing is not set to ISO 8859-15.
  • +
  • The test is read from a server that supports HTTP.
+
+ + + + + + diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-content.html b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-content.html new file mode 100644 index 0000000..6853cdd --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-content.html @@ -0,0 +1,49 @@ + + + + HTTP vs meta content + + + + + + + + + + + +

HTTP vs meta content

+ + +
+ + +
 
+ + + + + +
+

The HTTP header has a higher precedence than an encoding declaration in a meta content attribute.

+

The HTTP header attempts to set the character encoding to ISO 8859-15. The page contains an encoding declaration in a meta content attribute that attempts to set the character encoding to ISO 8859-1.

The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ÜÀÚ. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.

+
+
+
HTML5
+

the-input-byte-stream-016
Result summary & related tests
Detailed results for this test
Link to spec

+
Assumptions:
  • The default encoding for the browser you are testing is not set to ISO 8859-15.
  • +
  • The test is read from a server that supports HTTP.
+
+ + + + + + diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/No-encoding-declaration.html b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/No-encoding-declaration.html new file mode 100644 index 0000000..612e26c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/No-encoding-declaration.html @@ -0,0 +1,47 @@ + + + + No encoding declaration + + + + + + + + + + + +

No encoding declaration

+ + +
+ + +
 
+ + + + + +
+

A page with no encoding information in HTTP, BOM, XML declaration or meta element will be treated as UTF-8.

+

The test on this page contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ýäè. This matches the sequence of bytes above when they are interpreted as UTF-8. If the class name matches the selector then the test will pass.

+
+
+
HTML5
+

the-input-byte-stream-015
Result summary & related tests
Detailed results for this test
Link to spec

+
Assumptions:
  • The test is read from a server that supports HTTP.
+
+ + + + + + diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/README b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/README new file mode 100644 index 0000000..38ef0f9 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/README @@ -0,0 +1,9 @@ +These test cases come from +http://www.w3.org/International/tests/repository/html5/the-input-byte-stream/results-basics + +Distributed under both the W3C Test Suite License +(http://www.w3.org/Consortium/Legal/2008/04-testsuite-license) +and the W3C 3-clause BSD License +(http://www.w3.org/Consortium/Legal/2008/03-bsd-license). +To contribute to a W3C Test Suite, see the policies and contribution +forms (http://www.w3.org/2004/10/27-testcases). diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/UTF-16BE-BOM.html b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/UTF-16BE-BOM.html new file mode 100644 index 0000000000000000000000000000000000000000..3abf7a9343c20518e57dfea58b374fb0f4fb58a1 GIT binary patch literal 2670 zcmcJR?QRoS5Qc}JAoU&=BQ-(7b^;2j8i*i3RV1JlO@;VXIsPurV!WHiDdLW}i`*CO z^UnC>tih=KsVr;H&Y7?C&O3AV(?534uG?e##U9y_y|!QNi4``n+D>d{2lky^LnFNx z?9HrarH$>rwQR_$g)Hk0*&STI*EYq|47~&U9sfUB+ji})9eR{QqCUra7oDsZ5obtB zdxP%<)-$4Q;rSHJiM>U(#ZI=;?n^BC?Dp6lu=~_1-lnX3u03&2BlmQIY>L+!Uq7XoytKw^Q#oZSM?3*J?)&ojG&yzQRkC!Ml5JE?ax;lp_NYEcdUht`ZswOviB~L5hmJ|pXI71nn20w;>vG! zQGB$EE9&wC``&J#_Ym~PgRu-Bd>1!pOp0||k`kr=VJ zfH6I6rmRaeHA7U-A^OTsT+|d2a^i(>DePzZ{)ibXoCBvJnuYrd-3kkN$uy{qQK;=*Y;S87ro12aTgu^i*%f8zC3>a}9DIe4cfxOzsCw&(cqvP9{ud{N6f` z#TNDY(B6@Gpr|uN+%&x^XZjBHdc@2vsM(Tyc2=vshHQ5w+obmp>tuWT(t4BTUGAQw zxeI$UGSLUBg=WFbF;4f@4=^P2AgY@CFn8A`bcC=_&~)fiDe)#cUARRBzJ^k|%X)69 z+{Cb`wq}Rsg%B62CC_tK!AV(W{(MV?#mndR46CU#BUN<{8e?*oT+!pE5wF#O#TR#a z$9qRT)tpbw8zAI~QQJg2C3|6$I%(T(;`zOMy6SO+&;pG=c#2P|P-WZn$$DpWJlC3U z3*nvmz zwP{u~r$L?-m3uqp9I1+#3yE|3M$(s-BEtih=LQ>`qYoiktOop(wi%!;yh%+Rm z{e|xntY<{q!1F1Z6MKtngPm-p-4|H&+3m4AVE3_AyiHm6Tzlf4M(*ht*%YrezJ6kr zHGj45pc?64*$Cm%-zseWMA`x;)v*~jA=i}szqts9xmQkS`M11|(H7bTXAycsXU53+ zJ?120SRZeyiFjW7enPN`bxk$IaWV3o48oJF7D&2ysoY;6(s6%6vVfaYd&mC=erK!) zNGI^7upQgN)53OHe_VE<@J+G8*Y|p*)zB2Thdi}+YR<5QWHm!|a_*AoZXuv7)$xe| zm3Q$D7{|#}{m4X&UY!6(ZhyYi2(5JLzGE$H)W6BQklnjPMwn<Yvv7Z*TVWwD*=E3QpH37* z#lqXJA0A~J9T_<^W5smspmDg2p6ac5Bjn+~LAoow%1TCdZ*$K8`O zw_$HaCi+0N&@7la#_7KL5r$+QL{)Pi=I&aDjt~|Knht#`CEi4*3%97i_fSfASlwUz0=3V0GCxY}z81UC-nP=CGt2OqYV$ zoRCo+qM9YX*3FFORLC=E3B~S@+KROyk4r5 yX7?DaslDfIebqXgC!KKp4IYy+W~X?ddE6o=`A+x#x0AK&6MF#W&AXxbRrv+SX}PNa literal 0 HcmV?d00001 diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-charset.html b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-charset.html new file mode 100644 index 0000000..83de433 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-charset.html @@ -0,0 +1,49 @@ + + + + UTF-8 BOM vs meta charset + + + + + + + + + + + +

UTF-8 BOM vs meta charset

+ + +
+ + +
 
+ + + + + +
+

A page with a UTF-8 BOM will be recognized as UTF-8 even if the meta charset attribute declares a different encoding.

+

The page contains an encoding declaration in a meta charset attribute that attempts to set the character encoding to ISO 8859-15, but the file starts with a UTF-8 signature.

The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ýäè. This matches the sequence of bytes above when they are interpreted as UTF-8. If the class name matches the selector then the test will pass.

+
+
+
HTML5
+

the-input-byte-stream-038
Result summary & related tests
Detailed results for this test
Link to spec

+
Assumptions:
  • The default encoding for the browser you are testing is not set to ISO 8859-15.
  • +
  • The test is read from a server that supports HTTP.
+
+ + + + + + diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-content.html b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-content.html new file mode 100644 index 0000000..501aac2 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-content.html @@ -0,0 +1,48 @@ + + + + UTF-8 BOM vs meta content + + + + + + + + + + + +

UTF-8 BOM vs meta content

+ + +
+ + +
 
+ + + + + +
+

A page with a UTF-8 BOM will be recognized as UTF-8 even if the meta content attribute declares a different encoding.

+

The page contains an encoding declaration in a meta content attribute that attempts to set the character encoding to ISO 8859-15, but the file starts with a UTF-8 signature.

The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ýäè. This matches the sequence of bytes above when they are interpreted as UTF-8. If the class name matches the selector then the test will pass.

+
+
+
HTML5
+

the-input-byte-stream-037
Result summary & related tests
Detailed results for this test
Link to spec

+
Assumptions:
  • The default encoding for the browser you are testing is not set to ISO 8859-15.
  • +
  • The test is read from a server that supports HTTP.
+
+ + + + + + diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/meta-charset-attribute.html b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/meta-charset-attribute.html new file mode 100644 index 0000000..2d7d25a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/meta-charset-attribute.html @@ -0,0 +1,48 @@ + + + + meta charset attribute + + + + + + + + + + + +

meta charset attribute

+ + +
+ + +
 
+ + + + + +
+

The character encoding of the page can be set by a meta element with charset attribute.

+

The only character encoding declaration for this HTML file is in the charset attribute of the meta element, which declares the encoding to be ISO 8859-15.

The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ÜÀÚ. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.

+
+
+
HTML5
+

the-input-byte-stream-009
Result summary & related tests
Detailed results for this test
Link to spec

+
Assumptions:
  • The default encoding for the browser you are testing is not set to ISO 8859-15.
  • +
  • The test is read from a server that supports HTTP.
+
+ + + + + + diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/meta-content-attribute.html b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/meta-content-attribute.html new file mode 100644 index 0000000..1c3f228 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/charset/testdata/meta-content-attribute.html @@ -0,0 +1,48 @@ + + + + meta content attribute + + + + + + + + + + + +

meta content attribute

+ + +
+ + +
 
+ + + + + +
+

The character encoding of the page can be set by a meta element with http-equiv and content attributes.

+

The only character encoding declaration for this HTML file is in the content attribute of the meta element, which declares the encoding to be ISO 8859-15.

The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ÜÀÚ. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.

+
+
+
HTML5
+

the-input-byte-stream-007
Result summary & related tests
Detailed results for this test
Link to spec

+
Assumptions:
  • The default encoding for the browser you are testing is not set to ISO 8859-15.
  • +
  • The test is read from a server that supports HTTP.
+
+ + + + + + diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/const.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/const.go new file mode 100644 index 0000000..b37e621 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/const.go @@ -0,0 +1,104 @@ +// 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 html + +// Section 12.2.3.2 of the HTML5 specification says "The following elements +// have varying levels of special parsing rules". +// https://html.spec.whatwg.org/multipage/syntax.html#the-stack-of-open-elements +var isSpecialElementMap = map[string]bool{ + "address": true, + "applet": true, + "area": true, + "article": true, + "aside": true, + "base": true, + "basefont": true, + "bgsound": true, + "blockquote": true, + "body": true, + "br": true, + "button": true, + "caption": true, + "center": true, + "col": true, + "colgroup": true, + "dd": true, + "details": true, + "dir": true, + "div": true, + "dl": true, + "dt": true, + "embed": true, + "fieldset": true, + "figcaption": true, + "figure": true, + "footer": true, + "form": true, + "frame": true, + "frameset": true, + "h1": true, + "h2": true, + "h3": true, + "h4": true, + "h5": true, + "h6": true, + "head": true, + "header": true, + "hgroup": true, + "hr": true, + "html": true, + "iframe": true, + "img": true, + "input": true, + "isindex": true, // The 'isindex' element has been removed, but keep it for backwards compatibility. + "keygen": true, + "li": true, + "link": true, + "listing": true, + "main": true, + "marquee": true, + "menu": true, + "meta": true, + "nav": true, + "noembed": true, + "noframes": true, + "noscript": true, + "object": true, + "ol": true, + "p": true, + "param": true, + "plaintext": true, + "pre": true, + "script": true, + "section": true, + "select": true, + "source": true, + "style": true, + "summary": true, + "table": true, + "tbody": true, + "td": true, + "template": true, + "textarea": true, + "tfoot": true, + "th": true, + "thead": true, + "title": true, + "tr": true, + "track": true, + "ul": true, + "wbr": true, + "xmp": true, +} + +func isSpecialElement(element *Node) bool { + switch element.Namespace { + case "", "html": + return isSpecialElementMap[element.Data] + case "svg": + return element.Data == "foreignObject" + } + return false +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/doc.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/doc.go new file mode 100644 index 0000000..94f4968 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/doc.go @@ -0,0 +1,106 @@ +// 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 html implements an HTML5-compliant tokenizer and parser. + +Tokenization is done by creating a Tokenizer for an io.Reader r. It is the +caller's responsibility to ensure that r provides UTF-8 encoded HTML. + + z := html.NewTokenizer(r) + +Given a Tokenizer z, the HTML is tokenized by repeatedly calling z.Next(), +which parses the next token and returns its type, or an error: + + for { + tt := z.Next() + if tt == html.ErrorToken { + // ... + return ... + } + // Process the current token. + } + +There are two APIs for retrieving the current token. The high-level API is to +call Token; the low-level API is to call Text or TagName / TagAttr. Both APIs +allow optionally calling Raw after Next but before Token, Text, TagName, or +TagAttr. In EBNF notation, the valid call sequence per token is: + + Next {Raw} [ Token | Text | TagName {TagAttr} ] + +Token returns an independent data structure that completely describes a token. +Entities (such as "<") are unescaped, tag names and attribute keys are +lower-cased, and attributes are collected into a []Attribute. For example: + + for { + if z.Next() == html.ErrorToken { + // Returning io.EOF indicates success. + return z.Err() + } + emitToken(z.Token()) + } + +The low-level API performs fewer allocations and copies, but the contents of +the []byte values returned by Text, TagName and TagAttr may change on the next +call to Next. For example, to extract an HTML page's anchor text: + + depth := 0 + for { + tt := z.Next() + switch tt { + case ErrorToken: + return z.Err() + case TextToken: + if depth > 0 { + // emitBytes should copy the []byte it receives, + // if it doesn't process it immediately. + emitBytes(z.Text()) + } + case StartTagToken, EndTagToken: + tn, _ := z.TagName() + if len(tn) == 1 && tn[0] == 'a' { + if tt == StartTagToken { + depth++ + } else { + depth-- + } + } + } + } + +Parsing is done by calling Parse with an io.Reader, which returns the root of +the parse tree (the document element) as a *Node. It is the caller's +responsibility to ensure that the Reader provides UTF-8 encoded HTML. For +example, to process each anchor node in depth-first order: + + doc, err := html.Parse(r) + if err != nil { + // ... + } + var f func(*html.Node) + f = func(n *html.Node) { + if n.Type == html.ElementNode && n.Data == "a" { + // Do something with n... + } + for c := n.FirstChild; c != nil; c = c.NextSibling { + f(c) + } + } + f(doc) + +The relevant specifications include: +https://html.spec.whatwg.org/multipage/syntax.html and +https://html.spec.whatwg.org/multipage/syntax.html#tokenization +*/ +package html // import "golang.org/x/net/html" + +// The tokenization algorithm implemented by this package is not a line-by-line +// transliteration of the relatively verbose state-machine in the WHATWG +// specification. A more direct approach is used instead, where the program +// counter implies the state, such as whether it is tokenizing a tag or a text +// node. Specification compliance is verified by checking expected and actual +// outputs over a test suite rather than aiming for algorithmic fidelity. + +// TODO(nigeltao): Does a DOM API belong in this package or a separate one? +// TODO(nigeltao): How does parsing interact with a JavaScript engine? diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/doctype.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/doctype.go new file mode 100644 index 0000000..c484e5a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/doctype.go @@ -0,0 +1,156 @@ +// 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 html + +import ( + "strings" +) + +// parseDoctype parses the data from a DoctypeToken into a name, +// public identifier, and system identifier. It returns a Node whose Type +// is DoctypeNode, whose Data is the name, and which has attributes +// named "system" and "public" for the two identifiers if they were present. +// quirks is whether the document should be parsed in "quirks mode". +func parseDoctype(s string) (n *Node, quirks bool) { + n = &Node{Type: DoctypeNode} + + // Find the name. + space := strings.IndexAny(s, whitespace) + if space == -1 { + space = len(s) + } + n.Data = s[:space] + // The comparison to "html" is case-sensitive. + if n.Data != "html" { + quirks = true + } + n.Data = strings.ToLower(n.Data) + s = strings.TrimLeft(s[space:], whitespace) + + if len(s) < 6 { + // It can't start with "PUBLIC" or "SYSTEM". + // Ignore the rest of the string. + return n, quirks || s != "" + } + + key := strings.ToLower(s[:6]) + s = s[6:] + for key == "public" || key == "system" { + s = strings.TrimLeft(s, whitespace) + if s == "" { + break + } + quote := s[0] + if quote != '"' && quote != '\'' { + break + } + s = s[1:] + q := strings.IndexRune(s, rune(quote)) + var id string + if q == -1 { + id = s + s = "" + } else { + id = s[:q] + s = s[q+1:] + } + n.Attr = append(n.Attr, Attribute{Key: key, Val: id}) + if key == "public" { + key = "system" + } else { + key = "" + } + } + + if key != "" || s != "" { + quirks = true + } else if len(n.Attr) > 0 { + if n.Attr[0].Key == "public" { + public := strings.ToLower(n.Attr[0].Val) + switch public { + case "-//w3o//dtd w3 html strict 3.0//en//", "-/w3d/dtd html 4.0 transitional/en", "html": + quirks = true + default: + for _, q := range quirkyIDs { + if strings.HasPrefix(public, q) { + quirks = true + break + } + } + } + // The following two public IDs only cause quirks mode if there is no system ID. + if len(n.Attr) == 1 && (strings.HasPrefix(public, "-//w3c//dtd html 4.01 frameset//") || + strings.HasPrefix(public, "-//w3c//dtd html 4.01 transitional//")) { + quirks = true + } + } + if lastAttr := n.Attr[len(n.Attr)-1]; lastAttr.Key == "system" && + strings.ToLower(lastAttr.Val) == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd" { + quirks = true + } + } + + return n, quirks +} + +// quirkyIDs is a list of public doctype identifiers that cause a document +// to be interpreted in quirks mode. The identifiers should be in lower case. +var quirkyIDs = []string{ + "+//silmaril//dtd html pro v0r11 19970101//", + "-//advasoft ltd//dtd html 3.0 aswedit + extensions//", + "-//as//dtd html 3.0 aswedit + extensions//", + "-//ietf//dtd html 2.0 level 1//", + "-//ietf//dtd html 2.0 level 2//", + "-//ietf//dtd html 2.0 strict level 1//", + "-//ietf//dtd html 2.0 strict level 2//", + "-//ietf//dtd html 2.0 strict//", + "-//ietf//dtd html 2.0//", + "-//ietf//dtd html 2.1e//", + "-//ietf//dtd html 3.0//", + "-//ietf//dtd html 3.2 final//", + "-//ietf//dtd html 3.2//", + "-//ietf//dtd html 3//", + "-//ietf//dtd html level 0//", + "-//ietf//dtd html level 1//", + "-//ietf//dtd html level 2//", + "-//ietf//dtd html level 3//", + "-//ietf//dtd html strict level 0//", + "-//ietf//dtd html strict level 1//", + "-//ietf//dtd html strict level 2//", + "-//ietf//dtd html strict level 3//", + "-//ietf//dtd html strict//", + "-//ietf//dtd html//", + "-//metrius//dtd metrius presentational//", + "-//microsoft//dtd internet explorer 2.0 html strict//", + "-//microsoft//dtd internet explorer 2.0 html//", + "-//microsoft//dtd internet explorer 2.0 tables//", + "-//microsoft//dtd internet explorer 3.0 html strict//", + "-//microsoft//dtd internet explorer 3.0 html//", + "-//microsoft//dtd internet explorer 3.0 tables//", + "-//netscape comm. corp.//dtd html//", + "-//netscape comm. corp.//dtd strict html//", + "-//o'reilly and associates//dtd html 2.0//", + "-//o'reilly and associates//dtd html extended 1.0//", + "-//o'reilly and associates//dtd html extended relaxed 1.0//", + "-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//", + "-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//", + "-//spyglass//dtd html 2.0 extended//", + "-//sq//dtd html 2.0 hotmetal + extensions//", + "-//sun microsystems corp.//dtd hotjava html//", + "-//sun microsystems corp.//dtd hotjava strict html//", + "-//w3c//dtd html 3 1995-03-24//", + "-//w3c//dtd html 3.2 draft//", + "-//w3c//dtd html 3.2 final//", + "-//w3c//dtd html 3.2//", + "-//w3c//dtd html 3.2s draft//", + "-//w3c//dtd html 4.0 frameset//", + "-//w3c//dtd html 4.0 transitional//", + "-//w3c//dtd html experimental 19960712//", + "-//w3c//dtd html experimental 970421//", + "-//w3c//dtd w3 html//", + "-//w3o//dtd w3 html 3.0//", + "-//webtechs//dtd mozilla html 2.0//", + "-//webtechs//dtd mozilla html//", +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/entity.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/entity.go new file mode 100644 index 0000000..a50c04c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/entity.go @@ -0,0 +1,2253 @@ +// 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 html + +// All entities that do not end with ';' are 6 or fewer bytes long. +const longestEntityWithoutSemicolon = 6 + +// entity is a map from HTML entity names to their values. The semicolon matters: +// https://html.spec.whatwg.org/multipage/syntax.html#named-character-references +// lists both "amp" and "amp;" as two separate entries. +// +// Note that the HTML5 list is larger than the HTML4 list at +// http://www.w3.org/TR/html4/sgml/entities.html +var entity = map[string]rune{ + "AElig;": '\U000000C6', + "AMP;": '\U00000026', + "Aacute;": '\U000000C1', + "Abreve;": '\U00000102', + "Acirc;": '\U000000C2', + "Acy;": '\U00000410', + "Afr;": '\U0001D504', + "Agrave;": '\U000000C0', + "Alpha;": '\U00000391', + "Amacr;": '\U00000100', + "And;": '\U00002A53', + "Aogon;": '\U00000104', + "Aopf;": '\U0001D538', + "ApplyFunction;": '\U00002061', + "Aring;": '\U000000C5', + "Ascr;": '\U0001D49C', + "Assign;": '\U00002254', + "Atilde;": '\U000000C3', + "Auml;": '\U000000C4', + "Backslash;": '\U00002216', + "Barv;": '\U00002AE7', + "Barwed;": '\U00002306', + "Bcy;": '\U00000411', + "Because;": '\U00002235', + "Bernoullis;": '\U0000212C', + "Beta;": '\U00000392', + "Bfr;": '\U0001D505', + "Bopf;": '\U0001D539', + "Breve;": '\U000002D8', + "Bscr;": '\U0000212C', + "Bumpeq;": '\U0000224E', + "CHcy;": '\U00000427', + "COPY;": '\U000000A9', + "Cacute;": '\U00000106', + "Cap;": '\U000022D2', + "CapitalDifferentialD;": '\U00002145', + "Cayleys;": '\U0000212D', + "Ccaron;": '\U0000010C', + "Ccedil;": '\U000000C7', + "Ccirc;": '\U00000108', + "Cconint;": '\U00002230', + "Cdot;": '\U0000010A', + "Cedilla;": '\U000000B8', + "CenterDot;": '\U000000B7', + "Cfr;": '\U0000212D', + "Chi;": '\U000003A7', + "CircleDot;": '\U00002299', + "CircleMinus;": '\U00002296', + "CirclePlus;": '\U00002295', + "CircleTimes;": '\U00002297', + "ClockwiseContourIntegral;": '\U00002232', + "CloseCurlyDoubleQuote;": '\U0000201D', + "CloseCurlyQuote;": '\U00002019', + "Colon;": '\U00002237', + "Colone;": '\U00002A74', + "Congruent;": '\U00002261', + "Conint;": '\U0000222F', + "ContourIntegral;": '\U0000222E', + "Copf;": '\U00002102', + "Coproduct;": '\U00002210', + "CounterClockwiseContourIntegral;": '\U00002233', + "Cross;": '\U00002A2F', + "Cscr;": '\U0001D49E', + "Cup;": '\U000022D3', + "CupCap;": '\U0000224D', + "DD;": '\U00002145', + "DDotrahd;": '\U00002911', + "DJcy;": '\U00000402', + "DScy;": '\U00000405', + "DZcy;": '\U0000040F', + "Dagger;": '\U00002021', + "Darr;": '\U000021A1', + "Dashv;": '\U00002AE4', + "Dcaron;": '\U0000010E', + "Dcy;": '\U00000414', + "Del;": '\U00002207', + "Delta;": '\U00000394', + "Dfr;": '\U0001D507', + "DiacriticalAcute;": '\U000000B4', + "DiacriticalDot;": '\U000002D9', + "DiacriticalDoubleAcute;": '\U000002DD', + "DiacriticalGrave;": '\U00000060', + "DiacriticalTilde;": '\U000002DC', + "Diamond;": '\U000022C4', + "DifferentialD;": '\U00002146', + "Dopf;": '\U0001D53B', + "Dot;": '\U000000A8', + "DotDot;": '\U000020DC', + "DotEqual;": '\U00002250', + "DoubleContourIntegral;": '\U0000222F', + "DoubleDot;": '\U000000A8', + "DoubleDownArrow;": '\U000021D3', + "DoubleLeftArrow;": '\U000021D0', + "DoubleLeftRightArrow;": '\U000021D4', + "DoubleLeftTee;": '\U00002AE4', + "DoubleLongLeftArrow;": '\U000027F8', + "DoubleLongLeftRightArrow;": '\U000027FA', + "DoubleLongRightArrow;": '\U000027F9', + "DoubleRightArrow;": '\U000021D2', + "DoubleRightTee;": '\U000022A8', + "DoubleUpArrow;": '\U000021D1', + "DoubleUpDownArrow;": '\U000021D5', + "DoubleVerticalBar;": '\U00002225', + "DownArrow;": '\U00002193', + "DownArrowBar;": '\U00002913', + "DownArrowUpArrow;": '\U000021F5', + "DownBreve;": '\U00000311', + "DownLeftRightVector;": '\U00002950', + "DownLeftTeeVector;": '\U0000295E', + "DownLeftVector;": '\U000021BD', + "DownLeftVectorBar;": '\U00002956', + "DownRightTeeVector;": '\U0000295F', + "DownRightVector;": '\U000021C1', + "DownRightVectorBar;": '\U00002957', + "DownTee;": '\U000022A4', + "DownTeeArrow;": '\U000021A7', + "Downarrow;": '\U000021D3', + "Dscr;": '\U0001D49F', + "Dstrok;": '\U00000110', + "ENG;": '\U0000014A', + "ETH;": '\U000000D0', + "Eacute;": '\U000000C9', + "Ecaron;": '\U0000011A', + "Ecirc;": '\U000000CA', + "Ecy;": '\U0000042D', + "Edot;": '\U00000116', + "Efr;": '\U0001D508', + "Egrave;": '\U000000C8', + "Element;": '\U00002208', + "Emacr;": '\U00000112', + "EmptySmallSquare;": '\U000025FB', + "EmptyVerySmallSquare;": '\U000025AB', + "Eogon;": '\U00000118', + "Eopf;": '\U0001D53C', + "Epsilon;": '\U00000395', + "Equal;": '\U00002A75', + "EqualTilde;": '\U00002242', + "Equilibrium;": '\U000021CC', + "Escr;": '\U00002130', + "Esim;": '\U00002A73', + "Eta;": '\U00000397', + "Euml;": '\U000000CB', + "Exists;": '\U00002203', + "ExponentialE;": '\U00002147', + "Fcy;": '\U00000424', + "Ffr;": '\U0001D509', + "FilledSmallSquare;": '\U000025FC', + "FilledVerySmallSquare;": '\U000025AA', + "Fopf;": '\U0001D53D', + "ForAll;": '\U00002200', + "Fouriertrf;": '\U00002131', + "Fscr;": '\U00002131', + "GJcy;": '\U00000403', + "GT;": '\U0000003E', + "Gamma;": '\U00000393', + "Gammad;": '\U000003DC', + "Gbreve;": '\U0000011E', + "Gcedil;": '\U00000122', + "Gcirc;": '\U0000011C', + "Gcy;": '\U00000413', + "Gdot;": '\U00000120', + "Gfr;": '\U0001D50A', + "Gg;": '\U000022D9', + "Gopf;": '\U0001D53E', + "GreaterEqual;": '\U00002265', + "GreaterEqualLess;": '\U000022DB', + "GreaterFullEqual;": '\U00002267', + "GreaterGreater;": '\U00002AA2', + "GreaterLess;": '\U00002277', + "GreaterSlantEqual;": '\U00002A7E', + "GreaterTilde;": '\U00002273', + "Gscr;": '\U0001D4A2', + "Gt;": '\U0000226B', + "HARDcy;": '\U0000042A', + "Hacek;": '\U000002C7', + "Hat;": '\U0000005E', + "Hcirc;": '\U00000124', + "Hfr;": '\U0000210C', + "HilbertSpace;": '\U0000210B', + "Hopf;": '\U0000210D', + "HorizontalLine;": '\U00002500', + "Hscr;": '\U0000210B', + "Hstrok;": '\U00000126', + "HumpDownHump;": '\U0000224E', + "HumpEqual;": '\U0000224F', + "IEcy;": '\U00000415', + "IJlig;": '\U00000132', + "IOcy;": '\U00000401', + "Iacute;": '\U000000CD', + "Icirc;": '\U000000CE', + "Icy;": '\U00000418', + "Idot;": '\U00000130', + "Ifr;": '\U00002111', + "Igrave;": '\U000000CC', + "Im;": '\U00002111', + "Imacr;": '\U0000012A', + "ImaginaryI;": '\U00002148', + "Implies;": '\U000021D2', + "Int;": '\U0000222C', + "Integral;": '\U0000222B', + "Intersection;": '\U000022C2', + "InvisibleComma;": '\U00002063', + "InvisibleTimes;": '\U00002062', + "Iogon;": '\U0000012E', + "Iopf;": '\U0001D540', + "Iota;": '\U00000399', + "Iscr;": '\U00002110', + "Itilde;": '\U00000128', + "Iukcy;": '\U00000406', + "Iuml;": '\U000000CF', + "Jcirc;": '\U00000134', + "Jcy;": '\U00000419', + "Jfr;": '\U0001D50D', + "Jopf;": '\U0001D541', + "Jscr;": '\U0001D4A5', + "Jsercy;": '\U00000408', + "Jukcy;": '\U00000404', + "KHcy;": '\U00000425', + "KJcy;": '\U0000040C', + "Kappa;": '\U0000039A', + "Kcedil;": '\U00000136', + "Kcy;": '\U0000041A', + "Kfr;": '\U0001D50E', + "Kopf;": '\U0001D542', + "Kscr;": '\U0001D4A6', + "LJcy;": '\U00000409', + "LT;": '\U0000003C', + "Lacute;": '\U00000139', + "Lambda;": '\U0000039B', + "Lang;": '\U000027EA', + "Laplacetrf;": '\U00002112', + "Larr;": '\U0000219E', + "Lcaron;": '\U0000013D', + "Lcedil;": '\U0000013B', + "Lcy;": '\U0000041B', + "LeftAngleBracket;": '\U000027E8', + "LeftArrow;": '\U00002190', + "LeftArrowBar;": '\U000021E4', + "LeftArrowRightArrow;": '\U000021C6', + "LeftCeiling;": '\U00002308', + "LeftDoubleBracket;": '\U000027E6', + "LeftDownTeeVector;": '\U00002961', + "LeftDownVector;": '\U000021C3', + "LeftDownVectorBar;": '\U00002959', + "LeftFloor;": '\U0000230A', + "LeftRightArrow;": '\U00002194', + "LeftRightVector;": '\U0000294E', + "LeftTee;": '\U000022A3', + "LeftTeeArrow;": '\U000021A4', + "LeftTeeVector;": '\U0000295A', + "LeftTriangle;": '\U000022B2', + "LeftTriangleBar;": '\U000029CF', + "LeftTriangleEqual;": '\U000022B4', + "LeftUpDownVector;": '\U00002951', + "LeftUpTeeVector;": '\U00002960', + "LeftUpVector;": '\U000021BF', + "LeftUpVectorBar;": '\U00002958', + "LeftVector;": '\U000021BC', + "LeftVectorBar;": '\U00002952', + "Leftarrow;": '\U000021D0', + "Leftrightarrow;": '\U000021D4', + "LessEqualGreater;": '\U000022DA', + "LessFullEqual;": '\U00002266', + "LessGreater;": '\U00002276', + "LessLess;": '\U00002AA1', + "LessSlantEqual;": '\U00002A7D', + "LessTilde;": '\U00002272', + "Lfr;": '\U0001D50F', + "Ll;": '\U000022D8', + "Lleftarrow;": '\U000021DA', + "Lmidot;": '\U0000013F', + "LongLeftArrow;": '\U000027F5', + "LongLeftRightArrow;": '\U000027F7', + "LongRightArrow;": '\U000027F6', + "Longleftarrow;": '\U000027F8', + "Longleftrightarrow;": '\U000027FA', + "Longrightarrow;": '\U000027F9', + "Lopf;": '\U0001D543', + "LowerLeftArrow;": '\U00002199', + "LowerRightArrow;": '\U00002198', + "Lscr;": '\U00002112', + "Lsh;": '\U000021B0', + "Lstrok;": '\U00000141', + "Lt;": '\U0000226A', + "Map;": '\U00002905', + "Mcy;": '\U0000041C', + "MediumSpace;": '\U0000205F', + "Mellintrf;": '\U00002133', + "Mfr;": '\U0001D510', + "MinusPlus;": '\U00002213', + "Mopf;": '\U0001D544', + "Mscr;": '\U00002133', + "Mu;": '\U0000039C', + "NJcy;": '\U0000040A', + "Nacute;": '\U00000143', + "Ncaron;": '\U00000147', + "Ncedil;": '\U00000145', + "Ncy;": '\U0000041D', + "NegativeMediumSpace;": '\U0000200B', + "NegativeThickSpace;": '\U0000200B', + "NegativeThinSpace;": '\U0000200B', + "NegativeVeryThinSpace;": '\U0000200B', + "NestedGreaterGreater;": '\U0000226B', + "NestedLessLess;": '\U0000226A', + "NewLine;": '\U0000000A', + "Nfr;": '\U0001D511', + "NoBreak;": '\U00002060', + "NonBreakingSpace;": '\U000000A0', + "Nopf;": '\U00002115', + "Not;": '\U00002AEC', + "NotCongruent;": '\U00002262', + "NotCupCap;": '\U0000226D', + "NotDoubleVerticalBar;": '\U00002226', + "NotElement;": '\U00002209', + "NotEqual;": '\U00002260', + "NotExists;": '\U00002204', + "NotGreater;": '\U0000226F', + "NotGreaterEqual;": '\U00002271', + "NotGreaterLess;": '\U00002279', + "NotGreaterTilde;": '\U00002275', + "NotLeftTriangle;": '\U000022EA', + "NotLeftTriangleEqual;": '\U000022EC', + "NotLess;": '\U0000226E', + "NotLessEqual;": '\U00002270', + "NotLessGreater;": '\U00002278', + "NotLessTilde;": '\U00002274', + "NotPrecedes;": '\U00002280', + "NotPrecedesSlantEqual;": '\U000022E0', + "NotReverseElement;": '\U0000220C', + "NotRightTriangle;": '\U000022EB', + "NotRightTriangleEqual;": '\U000022ED', + "NotSquareSubsetEqual;": '\U000022E2', + "NotSquareSupersetEqual;": '\U000022E3', + "NotSubsetEqual;": '\U00002288', + "NotSucceeds;": '\U00002281', + "NotSucceedsSlantEqual;": '\U000022E1', + "NotSupersetEqual;": '\U00002289', + "NotTilde;": '\U00002241', + "NotTildeEqual;": '\U00002244', + "NotTildeFullEqual;": '\U00002247', + "NotTildeTilde;": '\U00002249', + "NotVerticalBar;": '\U00002224', + "Nscr;": '\U0001D4A9', + "Ntilde;": '\U000000D1', + "Nu;": '\U0000039D', + "OElig;": '\U00000152', + "Oacute;": '\U000000D3', + "Ocirc;": '\U000000D4', + "Ocy;": '\U0000041E', + "Odblac;": '\U00000150', + "Ofr;": '\U0001D512', + "Ograve;": '\U000000D2', + "Omacr;": '\U0000014C', + "Omega;": '\U000003A9', + "Omicron;": '\U0000039F', + "Oopf;": '\U0001D546', + "OpenCurlyDoubleQuote;": '\U0000201C', + "OpenCurlyQuote;": '\U00002018', + "Or;": '\U00002A54', + "Oscr;": '\U0001D4AA', + "Oslash;": '\U000000D8', + "Otilde;": '\U000000D5', + "Otimes;": '\U00002A37', + "Ouml;": '\U000000D6', + "OverBar;": '\U0000203E', + "OverBrace;": '\U000023DE', + "OverBracket;": '\U000023B4', + "OverParenthesis;": '\U000023DC', + "PartialD;": '\U00002202', + "Pcy;": '\U0000041F', + "Pfr;": '\U0001D513', + "Phi;": '\U000003A6', + "Pi;": '\U000003A0', + "PlusMinus;": '\U000000B1', + "Poincareplane;": '\U0000210C', + "Popf;": '\U00002119', + "Pr;": '\U00002ABB', + "Precedes;": '\U0000227A', + "PrecedesEqual;": '\U00002AAF', + "PrecedesSlantEqual;": '\U0000227C', + "PrecedesTilde;": '\U0000227E', + "Prime;": '\U00002033', + "Product;": '\U0000220F', + "Proportion;": '\U00002237', + "Proportional;": '\U0000221D', + "Pscr;": '\U0001D4AB', + "Psi;": '\U000003A8', + "QUOT;": '\U00000022', + "Qfr;": '\U0001D514', + "Qopf;": '\U0000211A', + "Qscr;": '\U0001D4AC', + "RBarr;": '\U00002910', + "REG;": '\U000000AE', + "Racute;": '\U00000154', + "Rang;": '\U000027EB', + "Rarr;": '\U000021A0', + "Rarrtl;": '\U00002916', + "Rcaron;": '\U00000158', + "Rcedil;": '\U00000156', + "Rcy;": '\U00000420', + "Re;": '\U0000211C', + "ReverseElement;": '\U0000220B', + "ReverseEquilibrium;": '\U000021CB', + "ReverseUpEquilibrium;": '\U0000296F', + "Rfr;": '\U0000211C', + "Rho;": '\U000003A1', + "RightAngleBracket;": '\U000027E9', + "RightArrow;": '\U00002192', + "RightArrowBar;": '\U000021E5', + "RightArrowLeftArrow;": '\U000021C4', + "RightCeiling;": '\U00002309', + "RightDoubleBracket;": '\U000027E7', + "RightDownTeeVector;": '\U0000295D', + "RightDownVector;": '\U000021C2', + "RightDownVectorBar;": '\U00002955', + "RightFloor;": '\U0000230B', + "RightTee;": '\U000022A2', + "RightTeeArrow;": '\U000021A6', + "RightTeeVector;": '\U0000295B', + "RightTriangle;": '\U000022B3', + "RightTriangleBar;": '\U000029D0', + "RightTriangleEqual;": '\U000022B5', + "RightUpDownVector;": '\U0000294F', + "RightUpTeeVector;": '\U0000295C', + "RightUpVector;": '\U000021BE', + "RightUpVectorBar;": '\U00002954', + "RightVector;": '\U000021C0', + "RightVectorBar;": '\U00002953', + "Rightarrow;": '\U000021D2', + "Ropf;": '\U0000211D', + "RoundImplies;": '\U00002970', + "Rrightarrow;": '\U000021DB', + "Rscr;": '\U0000211B', + "Rsh;": '\U000021B1', + "RuleDelayed;": '\U000029F4', + "SHCHcy;": '\U00000429', + "SHcy;": '\U00000428', + "SOFTcy;": '\U0000042C', + "Sacute;": '\U0000015A', + "Sc;": '\U00002ABC', + "Scaron;": '\U00000160', + "Scedil;": '\U0000015E', + "Scirc;": '\U0000015C', + "Scy;": '\U00000421', + "Sfr;": '\U0001D516', + "ShortDownArrow;": '\U00002193', + "ShortLeftArrow;": '\U00002190', + "ShortRightArrow;": '\U00002192', + "ShortUpArrow;": '\U00002191', + "Sigma;": '\U000003A3', + "SmallCircle;": '\U00002218', + "Sopf;": '\U0001D54A', + "Sqrt;": '\U0000221A', + "Square;": '\U000025A1', + "SquareIntersection;": '\U00002293', + "SquareSubset;": '\U0000228F', + "SquareSubsetEqual;": '\U00002291', + "SquareSuperset;": '\U00002290', + "SquareSupersetEqual;": '\U00002292', + "SquareUnion;": '\U00002294', + "Sscr;": '\U0001D4AE', + "Star;": '\U000022C6', + "Sub;": '\U000022D0', + "Subset;": '\U000022D0', + "SubsetEqual;": '\U00002286', + "Succeeds;": '\U0000227B', + "SucceedsEqual;": '\U00002AB0', + "SucceedsSlantEqual;": '\U0000227D', + "SucceedsTilde;": '\U0000227F', + "SuchThat;": '\U0000220B', + "Sum;": '\U00002211', + "Sup;": '\U000022D1', + "Superset;": '\U00002283', + "SupersetEqual;": '\U00002287', + "Supset;": '\U000022D1', + "THORN;": '\U000000DE', + "TRADE;": '\U00002122', + "TSHcy;": '\U0000040B', + "TScy;": '\U00000426', + "Tab;": '\U00000009', + "Tau;": '\U000003A4', + "Tcaron;": '\U00000164', + "Tcedil;": '\U00000162', + "Tcy;": '\U00000422', + "Tfr;": '\U0001D517', + "Therefore;": '\U00002234', + "Theta;": '\U00000398', + "ThinSpace;": '\U00002009', + "Tilde;": '\U0000223C', + "TildeEqual;": '\U00002243', + "TildeFullEqual;": '\U00002245', + "TildeTilde;": '\U00002248', + "Topf;": '\U0001D54B', + "TripleDot;": '\U000020DB', + "Tscr;": '\U0001D4AF', + "Tstrok;": '\U00000166', + "Uacute;": '\U000000DA', + "Uarr;": '\U0000219F', + "Uarrocir;": '\U00002949', + "Ubrcy;": '\U0000040E', + "Ubreve;": '\U0000016C', + "Ucirc;": '\U000000DB', + "Ucy;": '\U00000423', + "Udblac;": '\U00000170', + "Ufr;": '\U0001D518', + "Ugrave;": '\U000000D9', + "Umacr;": '\U0000016A', + "UnderBar;": '\U0000005F', + "UnderBrace;": '\U000023DF', + "UnderBracket;": '\U000023B5', + "UnderParenthesis;": '\U000023DD', + "Union;": '\U000022C3', + "UnionPlus;": '\U0000228E', + "Uogon;": '\U00000172', + "Uopf;": '\U0001D54C', + "UpArrow;": '\U00002191', + "UpArrowBar;": '\U00002912', + "UpArrowDownArrow;": '\U000021C5', + "UpDownArrow;": '\U00002195', + "UpEquilibrium;": '\U0000296E', + "UpTee;": '\U000022A5', + "UpTeeArrow;": '\U000021A5', + "Uparrow;": '\U000021D1', + "Updownarrow;": '\U000021D5', + "UpperLeftArrow;": '\U00002196', + "UpperRightArrow;": '\U00002197', + "Upsi;": '\U000003D2', + "Upsilon;": '\U000003A5', + "Uring;": '\U0000016E', + "Uscr;": '\U0001D4B0', + "Utilde;": '\U00000168', + "Uuml;": '\U000000DC', + "VDash;": '\U000022AB', + "Vbar;": '\U00002AEB', + "Vcy;": '\U00000412', + "Vdash;": '\U000022A9', + "Vdashl;": '\U00002AE6', + "Vee;": '\U000022C1', + "Verbar;": '\U00002016', + "Vert;": '\U00002016', + "VerticalBar;": '\U00002223', + "VerticalLine;": '\U0000007C', + "VerticalSeparator;": '\U00002758', + "VerticalTilde;": '\U00002240', + "VeryThinSpace;": '\U0000200A', + "Vfr;": '\U0001D519', + "Vopf;": '\U0001D54D', + "Vscr;": '\U0001D4B1', + "Vvdash;": '\U000022AA', + "Wcirc;": '\U00000174', + "Wedge;": '\U000022C0', + "Wfr;": '\U0001D51A', + "Wopf;": '\U0001D54E', + "Wscr;": '\U0001D4B2', + "Xfr;": '\U0001D51B', + "Xi;": '\U0000039E', + "Xopf;": '\U0001D54F', + "Xscr;": '\U0001D4B3', + "YAcy;": '\U0000042F', + "YIcy;": '\U00000407', + "YUcy;": '\U0000042E', + "Yacute;": '\U000000DD', + "Ycirc;": '\U00000176', + "Ycy;": '\U0000042B', + "Yfr;": '\U0001D51C', + "Yopf;": '\U0001D550', + "Yscr;": '\U0001D4B4', + "Yuml;": '\U00000178', + "ZHcy;": '\U00000416', + "Zacute;": '\U00000179', + "Zcaron;": '\U0000017D', + "Zcy;": '\U00000417', + "Zdot;": '\U0000017B', + "ZeroWidthSpace;": '\U0000200B', + "Zeta;": '\U00000396', + "Zfr;": '\U00002128', + "Zopf;": '\U00002124', + "Zscr;": '\U0001D4B5', + "aacute;": '\U000000E1', + "abreve;": '\U00000103', + "ac;": '\U0000223E', + "acd;": '\U0000223F', + "acirc;": '\U000000E2', + "acute;": '\U000000B4', + "acy;": '\U00000430', + "aelig;": '\U000000E6', + "af;": '\U00002061', + "afr;": '\U0001D51E', + "agrave;": '\U000000E0', + "alefsym;": '\U00002135', + "aleph;": '\U00002135', + "alpha;": '\U000003B1', + "amacr;": '\U00000101', + "amalg;": '\U00002A3F', + "amp;": '\U00000026', + "and;": '\U00002227', + "andand;": '\U00002A55', + "andd;": '\U00002A5C', + "andslope;": '\U00002A58', + "andv;": '\U00002A5A', + "ang;": '\U00002220', + "ange;": '\U000029A4', + "angle;": '\U00002220', + "angmsd;": '\U00002221', + "angmsdaa;": '\U000029A8', + "angmsdab;": '\U000029A9', + "angmsdac;": '\U000029AA', + "angmsdad;": '\U000029AB', + "angmsdae;": '\U000029AC', + "angmsdaf;": '\U000029AD', + "angmsdag;": '\U000029AE', + "angmsdah;": '\U000029AF', + "angrt;": '\U0000221F', + "angrtvb;": '\U000022BE', + "angrtvbd;": '\U0000299D', + "angsph;": '\U00002222', + "angst;": '\U000000C5', + "angzarr;": '\U0000237C', + "aogon;": '\U00000105', + "aopf;": '\U0001D552', + "ap;": '\U00002248', + "apE;": '\U00002A70', + "apacir;": '\U00002A6F', + "ape;": '\U0000224A', + "apid;": '\U0000224B', + "apos;": '\U00000027', + "approx;": '\U00002248', + "approxeq;": '\U0000224A', + "aring;": '\U000000E5', + "ascr;": '\U0001D4B6', + "ast;": '\U0000002A', + "asymp;": '\U00002248', + "asympeq;": '\U0000224D', + "atilde;": '\U000000E3', + "auml;": '\U000000E4', + "awconint;": '\U00002233', + "awint;": '\U00002A11', + "bNot;": '\U00002AED', + "backcong;": '\U0000224C', + "backepsilon;": '\U000003F6', + "backprime;": '\U00002035', + "backsim;": '\U0000223D', + "backsimeq;": '\U000022CD', + "barvee;": '\U000022BD', + "barwed;": '\U00002305', + "barwedge;": '\U00002305', + "bbrk;": '\U000023B5', + "bbrktbrk;": '\U000023B6', + "bcong;": '\U0000224C', + "bcy;": '\U00000431', + "bdquo;": '\U0000201E', + "becaus;": '\U00002235', + "because;": '\U00002235', + "bemptyv;": '\U000029B0', + "bepsi;": '\U000003F6', + "bernou;": '\U0000212C', + "beta;": '\U000003B2', + "beth;": '\U00002136', + "between;": '\U0000226C', + "bfr;": '\U0001D51F', + "bigcap;": '\U000022C2', + "bigcirc;": '\U000025EF', + "bigcup;": '\U000022C3', + "bigodot;": '\U00002A00', + "bigoplus;": '\U00002A01', + "bigotimes;": '\U00002A02', + "bigsqcup;": '\U00002A06', + "bigstar;": '\U00002605', + "bigtriangledown;": '\U000025BD', + "bigtriangleup;": '\U000025B3', + "biguplus;": '\U00002A04', + "bigvee;": '\U000022C1', + "bigwedge;": '\U000022C0', + "bkarow;": '\U0000290D', + "blacklozenge;": '\U000029EB', + "blacksquare;": '\U000025AA', + "blacktriangle;": '\U000025B4', + "blacktriangledown;": '\U000025BE', + "blacktriangleleft;": '\U000025C2', + "blacktriangleright;": '\U000025B8', + "blank;": '\U00002423', + "blk12;": '\U00002592', + "blk14;": '\U00002591', + "blk34;": '\U00002593', + "block;": '\U00002588', + "bnot;": '\U00002310', + "bopf;": '\U0001D553', + "bot;": '\U000022A5', + "bottom;": '\U000022A5', + "bowtie;": '\U000022C8', + "boxDL;": '\U00002557', + "boxDR;": '\U00002554', + "boxDl;": '\U00002556', + "boxDr;": '\U00002553', + "boxH;": '\U00002550', + "boxHD;": '\U00002566', + "boxHU;": '\U00002569', + "boxHd;": '\U00002564', + "boxHu;": '\U00002567', + "boxUL;": '\U0000255D', + "boxUR;": '\U0000255A', + "boxUl;": '\U0000255C', + "boxUr;": '\U00002559', + "boxV;": '\U00002551', + "boxVH;": '\U0000256C', + "boxVL;": '\U00002563', + "boxVR;": '\U00002560', + "boxVh;": '\U0000256B', + "boxVl;": '\U00002562', + "boxVr;": '\U0000255F', + "boxbox;": '\U000029C9', + "boxdL;": '\U00002555', + "boxdR;": '\U00002552', + "boxdl;": '\U00002510', + "boxdr;": '\U0000250C', + "boxh;": '\U00002500', + "boxhD;": '\U00002565', + "boxhU;": '\U00002568', + "boxhd;": '\U0000252C', + "boxhu;": '\U00002534', + "boxminus;": '\U0000229F', + "boxplus;": '\U0000229E', + "boxtimes;": '\U000022A0', + "boxuL;": '\U0000255B', + "boxuR;": '\U00002558', + "boxul;": '\U00002518', + "boxur;": '\U00002514', + "boxv;": '\U00002502', + "boxvH;": '\U0000256A', + "boxvL;": '\U00002561', + "boxvR;": '\U0000255E', + "boxvh;": '\U0000253C', + "boxvl;": '\U00002524', + "boxvr;": '\U0000251C', + "bprime;": '\U00002035', + "breve;": '\U000002D8', + "brvbar;": '\U000000A6', + "bscr;": '\U0001D4B7', + "bsemi;": '\U0000204F', + "bsim;": '\U0000223D', + "bsime;": '\U000022CD', + "bsol;": '\U0000005C', + "bsolb;": '\U000029C5', + "bsolhsub;": '\U000027C8', + "bull;": '\U00002022', + "bullet;": '\U00002022', + "bump;": '\U0000224E', + "bumpE;": '\U00002AAE', + "bumpe;": '\U0000224F', + "bumpeq;": '\U0000224F', + "cacute;": '\U00000107', + "cap;": '\U00002229', + "capand;": '\U00002A44', + "capbrcup;": '\U00002A49', + "capcap;": '\U00002A4B', + "capcup;": '\U00002A47', + "capdot;": '\U00002A40', + "caret;": '\U00002041', + "caron;": '\U000002C7', + "ccaps;": '\U00002A4D', + "ccaron;": '\U0000010D', + "ccedil;": '\U000000E7', + "ccirc;": '\U00000109', + "ccups;": '\U00002A4C', + "ccupssm;": '\U00002A50', + "cdot;": '\U0000010B', + "cedil;": '\U000000B8', + "cemptyv;": '\U000029B2', + "cent;": '\U000000A2', + "centerdot;": '\U000000B7', + "cfr;": '\U0001D520', + "chcy;": '\U00000447', + "check;": '\U00002713', + "checkmark;": '\U00002713', + "chi;": '\U000003C7', + "cir;": '\U000025CB', + "cirE;": '\U000029C3', + "circ;": '\U000002C6', + "circeq;": '\U00002257', + "circlearrowleft;": '\U000021BA', + "circlearrowright;": '\U000021BB', + "circledR;": '\U000000AE', + "circledS;": '\U000024C8', + "circledast;": '\U0000229B', + "circledcirc;": '\U0000229A', + "circleddash;": '\U0000229D', + "cire;": '\U00002257', + "cirfnint;": '\U00002A10', + "cirmid;": '\U00002AEF', + "cirscir;": '\U000029C2', + "clubs;": '\U00002663', + "clubsuit;": '\U00002663', + "colon;": '\U0000003A', + "colone;": '\U00002254', + "coloneq;": '\U00002254', + "comma;": '\U0000002C', + "commat;": '\U00000040', + "comp;": '\U00002201', + "compfn;": '\U00002218', + "complement;": '\U00002201', + "complexes;": '\U00002102', + "cong;": '\U00002245', + "congdot;": '\U00002A6D', + "conint;": '\U0000222E', + "copf;": '\U0001D554', + "coprod;": '\U00002210', + "copy;": '\U000000A9', + "copysr;": '\U00002117', + "crarr;": '\U000021B5', + "cross;": '\U00002717', + "cscr;": '\U0001D4B8', + "csub;": '\U00002ACF', + "csube;": '\U00002AD1', + "csup;": '\U00002AD0', + "csupe;": '\U00002AD2', + "ctdot;": '\U000022EF', + "cudarrl;": '\U00002938', + "cudarrr;": '\U00002935', + "cuepr;": '\U000022DE', + "cuesc;": '\U000022DF', + "cularr;": '\U000021B6', + "cularrp;": '\U0000293D', + "cup;": '\U0000222A', + "cupbrcap;": '\U00002A48', + "cupcap;": '\U00002A46', + "cupcup;": '\U00002A4A', + "cupdot;": '\U0000228D', + "cupor;": '\U00002A45', + "curarr;": '\U000021B7', + "curarrm;": '\U0000293C', + "curlyeqprec;": '\U000022DE', + "curlyeqsucc;": '\U000022DF', + "curlyvee;": '\U000022CE', + "curlywedge;": '\U000022CF', + "curren;": '\U000000A4', + "curvearrowleft;": '\U000021B6', + "curvearrowright;": '\U000021B7', + "cuvee;": '\U000022CE', + "cuwed;": '\U000022CF', + "cwconint;": '\U00002232', + "cwint;": '\U00002231', + "cylcty;": '\U0000232D', + "dArr;": '\U000021D3', + "dHar;": '\U00002965', + "dagger;": '\U00002020', + "daleth;": '\U00002138', + "darr;": '\U00002193', + "dash;": '\U00002010', + "dashv;": '\U000022A3', + "dbkarow;": '\U0000290F', + "dblac;": '\U000002DD', + "dcaron;": '\U0000010F', + "dcy;": '\U00000434', + "dd;": '\U00002146', + "ddagger;": '\U00002021', + "ddarr;": '\U000021CA', + "ddotseq;": '\U00002A77', + "deg;": '\U000000B0', + "delta;": '\U000003B4', + "demptyv;": '\U000029B1', + "dfisht;": '\U0000297F', + "dfr;": '\U0001D521', + "dharl;": '\U000021C3', + "dharr;": '\U000021C2', + "diam;": '\U000022C4', + "diamond;": '\U000022C4', + "diamondsuit;": '\U00002666', + "diams;": '\U00002666', + "die;": '\U000000A8', + "digamma;": '\U000003DD', + "disin;": '\U000022F2', + "div;": '\U000000F7', + "divide;": '\U000000F7', + "divideontimes;": '\U000022C7', + "divonx;": '\U000022C7', + "djcy;": '\U00000452', + "dlcorn;": '\U0000231E', + "dlcrop;": '\U0000230D', + "dollar;": '\U00000024', + "dopf;": '\U0001D555', + "dot;": '\U000002D9', + "doteq;": '\U00002250', + "doteqdot;": '\U00002251', + "dotminus;": '\U00002238', + "dotplus;": '\U00002214', + "dotsquare;": '\U000022A1', + "doublebarwedge;": '\U00002306', + "downarrow;": '\U00002193', + "downdownarrows;": '\U000021CA', + "downharpoonleft;": '\U000021C3', + "downharpoonright;": '\U000021C2', + "drbkarow;": '\U00002910', + "drcorn;": '\U0000231F', + "drcrop;": '\U0000230C', + "dscr;": '\U0001D4B9', + "dscy;": '\U00000455', + "dsol;": '\U000029F6', + "dstrok;": '\U00000111', + "dtdot;": '\U000022F1', + "dtri;": '\U000025BF', + "dtrif;": '\U000025BE', + "duarr;": '\U000021F5', + "duhar;": '\U0000296F', + "dwangle;": '\U000029A6', + "dzcy;": '\U0000045F', + "dzigrarr;": '\U000027FF', + "eDDot;": '\U00002A77', + "eDot;": '\U00002251', + "eacute;": '\U000000E9', + "easter;": '\U00002A6E', + "ecaron;": '\U0000011B', + "ecir;": '\U00002256', + "ecirc;": '\U000000EA', + "ecolon;": '\U00002255', + "ecy;": '\U0000044D', + "edot;": '\U00000117', + "ee;": '\U00002147', + "efDot;": '\U00002252', + "efr;": '\U0001D522', + "eg;": '\U00002A9A', + "egrave;": '\U000000E8', + "egs;": '\U00002A96', + "egsdot;": '\U00002A98', + "el;": '\U00002A99', + "elinters;": '\U000023E7', + "ell;": '\U00002113', + "els;": '\U00002A95', + "elsdot;": '\U00002A97', + "emacr;": '\U00000113', + "empty;": '\U00002205', + "emptyset;": '\U00002205', + "emptyv;": '\U00002205', + "emsp;": '\U00002003', + "emsp13;": '\U00002004', + "emsp14;": '\U00002005', + "eng;": '\U0000014B', + "ensp;": '\U00002002', + "eogon;": '\U00000119', + "eopf;": '\U0001D556', + "epar;": '\U000022D5', + "eparsl;": '\U000029E3', + "eplus;": '\U00002A71', + "epsi;": '\U000003B5', + "epsilon;": '\U000003B5', + "epsiv;": '\U000003F5', + "eqcirc;": '\U00002256', + "eqcolon;": '\U00002255', + "eqsim;": '\U00002242', + "eqslantgtr;": '\U00002A96', + "eqslantless;": '\U00002A95', + "equals;": '\U0000003D', + "equest;": '\U0000225F', + "equiv;": '\U00002261', + "equivDD;": '\U00002A78', + "eqvparsl;": '\U000029E5', + "erDot;": '\U00002253', + "erarr;": '\U00002971', + "escr;": '\U0000212F', + "esdot;": '\U00002250', + "esim;": '\U00002242', + "eta;": '\U000003B7', + "eth;": '\U000000F0', + "euml;": '\U000000EB', + "euro;": '\U000020AC', + "excl;": '\U00000021', + "exist;": '\U00002203', + "expectation;": '\U00002130', + "exponentiale;": '\U00002147', + "fallingdotseq;": '\U00002252', + "fcy;": '\U00000444', + "female;": '\U00002640', + "ffilig;": '\U0000FB03', + "fflig;": '\U0000FB00', + "ffllig;": '\U0000FB04', + "ffr;": '\U0001D523', + "filig;": '\U0000FB01', + "flat;": '\U0000266D', + "fllig;": '\U0000FB02', + "fltns;": '\U000025B1', + "fnof;": '\U00000192', + "fopf;": '\U0001D557', + "forall;": '\U00002200', + "fork;": '\U000022D4', + "forkv;": '\U00002AD9', + "fpartint;": '\U00002A0D', + "frac12;": '\U000000BD', + "frac13;": '\U00002153', + "frac14;": '\U000000BC', + "frac15;": '\U00002155', + "frac16;": '\U00002159', + "frac18;": '\U0000215B', + "frac23;": '\U00002154', + "frac25;": '\U00002156', + "frac34;": '\U000000BE', + "frac35;": '\U00002157', + "frac38;": '\U0000215C', + "frac45;": '\U00002158', + "frac56;": '\U0000215A', + "frac58;": '\U0000215D', + "frac78;": '\U0000215E', + "frasl;": '\U00002044', + "frown;": '\U00002322', + "fscr;": '\U0001D4BB', + "gE;": '\U00002267', + "gEl;": '\U00002A8C', + "gacute;": '\U000001F5', + "gamma;": '\U000003B3', + "gammad;": '\U000003DD', + "gap;": '\U00002A86', + "gbreve;": '\U0000011F', + "gcirc;": '\U0000011D', + "gcy;": '\U00000433', + "gdot;": '\U00000121', + "ge;": '\U00002265', + "gel;": '\U000022DB', + "geq;": '\U00002265', + "geqq;": '\U00002267', + "geqslant;": '\U00002A7E', + "ges;": '\U00002A7E', + "gescc;": '\U00002AA9', + "gesdot;": '\U00002A80', + "gesdoto;": '\U00002A82', + "gesdotol;": '\U00002A84', + "gesles;": '\U00002A94', + "gfr;": '\U0001D524', + "gg;": '\U0000226B', + "ggg;": '\U000022D9', + "gimel;": '\U00002137', + "gjcy;": '\U00000453', + "gl;": '\U00002277', + "glE;": '\U00002A92', + "gla;": '\U00002AA5', + "glj;": '\U00002AA4', + "gnE;": '\U00002269', + "gnap;": '\U00002A8A', + "gnapprox;": '\U00002A8A', + "gne;": '\U00002A88', + "gneq;": '\U00002A88', + "gneqq;": '\U00002269', + "gnsim;": '\U000022E7', + "gopf;": '\U0001D558', + "grave;": '\U00000060', + "gscr;": '\U0000210A', + "gsim;": '\U00002273', + "gsime;": '\U00002A8E', + "gsiml;": '\U00002A90', + "gt;": '\U0000003E', + "gtcc;": '\U00002AA7', + "gtcir;": '\U00002A7A', + "gtdot;": '\U000022D7', + "gtlPar;": '\U00002995', + "gtquest;": '\U00002A7C', + "gtrapprox;": '\U00002A86', + "gtrarr;": '\U00002978', + "gtrdot;": '\U000022D7', + "gtreqless;": '\U000022DB', + "gtreqqless;": '\U00002A8C', + "gtrless;": '\U00002277', + "gtrsim;": '\U00002273', + "hArr;": '\U000021D4', + "hairsp;": '\U0000200A', + "half;": '\U000000BD', + "hamilt;": '\U0000210B', + "hardcy;": '\U0000044A', + "harr;": '\U00002194', + "harrcir;": '\U00002948', + "harrw;": '\U000021AD', + "hbar;": '\U0000210F', + "hcirc;": '\U00000125', + "hearts;": '\U00002665', + "heartsuit;": '\U00002665', + "hellip;": '\U00002026', + "hercon;": '\U000022B9', + "hfr;": '\U0001D525', + "hksearow;": '\U00002925', + "hkswarow;": '\U00002926', + "hoarr;": '\U000021FF', + "homtht;": '\U0000223B', + "hookleftarrow;": '\U000021A9', + "hookrightarrow;": '\U000021AA', + "hopf;": '\U0001D559', + "horbar;": '\U00002015', + "hscr;": '\U0001D4BD', + "hslash;": '\U0000210F', + "hstrok;": '\U00000127', + "hybull;": '\U00002043', + "hyphen;": '\U00002010', + "iacute;": '\U000000ED', + "ic;": '\U00002063', + "icirc;": '\U000000EE', + "icy;": '\U00000438', + "iecy;": '\U00000435', + "iexcl;": '\U000000A1', + "iff;": '\U000021D4', + "ifr;": '\U0001D526', + "igrave;": '\U000000EC', + "ii;": '\U00002148', + "iiiint;": '\U00002A0C', + "iiint;": '\U0000222D', + "iinfin;": '\U000029DC', + "iiota;": '\U00002129', + "ijlig;": '\U00000133', + "imacr;": '\U0000012B', + "image;": '\U00002111', + "imagline;": '\U00002110', + "imagpart;": '\U00002111', + "imath;": '\U00000131', + "imof;": '\U000022B7', + "imped;": '\U000001B5', + "in;": '\U00002208', + "incare;": '\U00002105', + "infin;": '\U0000221E', + "infintie;": '\U000029DD', + "inodot;": '\U00000131', + "int;": '\U0000222B', + "intcal;": '\U000022BA', + "integers;": '\U00002124', + "intercal;": '\U000022BA', + "intlarhk;": '\U00002A17', + "intprod;": '\U00002A3C', + "iocy;": '\U00000451', + "iogon;": '\U0000012F', + "iopf;": '\U0001D55A', + "iota;": '\U000003B9', + "iprod;": '\U00002A3C', + "iquest;": '\U000000BF', + "iscr;": '\U0001D4BE', + "isin;": '\U00002208', + "isinE;": '\U000022F9', + "isindot;": '\U000022F5', + "isins;": '\U000022F4', + "isinsv;": '\U000022F3', + "isinv;": '\U00002208', + "it;": '\U00002062', + "itilde;": '\U00000129', + "iukcy;": '\U00000456', + "iuml;": '\U000000EF', + "jcirc;": '\U00000135', + "jcy;": '\U00000439', + "jfr;": '\U0001D527', + "jmath;": '\U00000237', + "jopf;": '\U0001D55B', + "jscr;": '\U0001D4BF', + "jsercy;": '\U00000458', + "jukcy;": '\U00000454', + "kappa;": '\U000003BA', + "kappav;": '\U000003F0', + "kcedil;": '\U00000137', + "kcy;": '\U0000043A', + "kfr;": '\U0001D528', + "kgreen;": '\U00000138', + "khcy;": '\U00000445', + "kjcy;": '\U0000045C', + "kopf;": '\U0001D55C', + "kscr;": '\U0001D4C0', + "lAarr;": '\U000021DA', + "lArr;": '\U000021D0', + "lAtail;": '\U0000291B', + "lBarr;": '\U0000290E', + "lE;": '\U00002266', + "lEg;": '\U00002A8B', + "lHar;": '\U00002962', + "lacute;": '\U0000013A', + "laemptyv;": '\U000029B4', + "lagran;": '\U00002112', + "lambda;": '\U000003BB', + "lang;": '\U000027E8', + "langd;": '\U00002991', + "langle;": '\U000027E8', + "lap;": '\U00002A85', + "laquo;": '\U000000AB', + "larr;": '\U00002190', + "larrb;": '\U000021E4', + "larrbfs;": '\U0000291F', + "larrfs;": '\U0000291D', + "larrhk;": '\U000021A9', + "larrlp;": '\U000021AB', + "larrpl;": '\U00002939', + "larrsim;": '\U00002973', + "larrtl;": '\U000021A2', + "lat;": '\U00002AAB', + "latail;": '\U00002919', + "late;": '\U00002AAD', + "lbarr;": '\U0000290C', + "lbbrk;": '\U00002772', + "lbrace;": '\U0000007B', + "lbrack;": '\U0000005B', + "lbrke;": '\U0000298B', + "lbrksld;": '\U0000298F', + "lbrkslu;": '\U0000298D', + "lcaron;": '\U0000013E', + "lcedil;": '\U0000013C', + "lceil;": '\U00002308', + "lcub;": '\U0000007B', + "lcy;": '\U0000043B', + "ldca;": '\U00002936', + "ldquo;": '\U0000201C', + "ldquor;": '\U0000201E', + "ldrdhar;": '\U00002967', + "ldrushar;": '\U0000294B', + "ldsh;": '\U000021B2', + "le;": '\U00002264', + "leftarrow;": '\U00002190', + "leftarrowtail;": '\U000021A2', + "leftharpoondown;": '\U000021BD', + "leftharpoonup;": '\U000021BC', + "leftleftarrows;": '\U000021C7', + "leftrightarrow;": '\U00002194', + "leftrightarrows;": '\U000021C6', + "leftrightharpoons;": '\U000021CB', + "leftrightsquigarrow;": '\U000021AD', + "leftthreetimes;": '\U000022CB', + "leg;": '\U000022DA', + "leq;": '\U00002264', + "leqq;": '\U00002266', + "leqslant;": '\U00002A7D', + "les;": '\U00002A7D', + "lescc;": '\U00002AA8', + "lesdot;": '\U00002A7F', + "lesdoto;": '\U00002A81', + "lesdotor;": '\U00002A83', + "lesges;": '\U00002A93', + "lessapprox;": '\U00002A85', + "lessdot;": '\U000022D6', + "lesseqgtr;": '\U000022DA', + "lesseqqgtr;": '\U00002A8B', + "lessgtr;": '\U00002276', + "lesssim;": '\U00002272', + "lfisht;": '\U0000297C', + "lfloor;": '\U0000230A', + "lfr;": '\U0001D529', + "lg;": '\U00002276', + "lgE;": '\U00002A91', + "lhard;": '\U000021BD', + "lharu;": '\U000021BC', + "lharul;": '\U0000296A', + "lhblk;": '\U00002584', + "ljcy;": '\U00000459', + "ll;": '\U0000226A', + "llarr;": '\U000021C7', + "llcorner;": '\U0000231E', + "llhard;": '\U0000296B', + "lltri;": '\U000025FA', + "lmidot;": '\U00000140', + "lmoust;": '\U000023B0', + "lmoustache;": '\U000023B0', + "lnE;": '\U00002268', + "lnap;": '\U00002A89', + "lnapprox;": '\U00002A89', + "lne;": '\U00002A87', + "lneq;": '\U00002A87', + "lneqq;": '\U00002268', + "lnsim;": '\U000022E6', + "loang;": '\U000027EC', + "loarr;": '\U000021FD', + "lobrk;": '\U000027E6', + "longleftarrow;": '\U000027F5', + "longleftrightarrow;": '\U000027F7', + "longmapsto;": '\U000027FC', + "longrightarrow;": '\U000027F6', + "looparrowleft;": '\U000021AB', + "looparrowright;": '\U000021AC', + "lopar;": '\U00002985', + "lopf;": '\U0001D55D', + "loplus;": '\U00002A2D', + "lotimes;": '\U00002A34', + "lowast;": '\U00002217', + "lowbar;": '\U0000005F', + "loz;": '\U000025CA', + "lozenge;": '\U000025CA', + "lozf;": '\U000029EB', + "lpar;": '\U00000028', + "lparlt;": '\U00002993', + "lrarr;": '\U000021C6', + "lrcorner;": '\U0000231F', + "lrhar;": '\U000021CB', + "lrhard;": '\U0000296D', + "lrm;": '\U0000200E', + "lrtri;": '\U000022BF', + "lsaquo;": '\U00002039', + "lscr;": '\U0001D4C1', + "lsh;": '\U000021B0', + "lsim;": '\U00002272', + "lsime;": '\U00002A8D', + "lsimg;": '\U00002A8F', + "lsqb;": '\U0000005B', + "lsquo;": '\U00002018', + "lsquor;": '\U0000201A', + "lstrok;": '\U00000142', + "lt;": '\U0000003C', + "ltcc;": '\U00002AA6', + "ltcir;": '\U00002A79', + "ltdot;": '\U000022D6', + "lthree;": '\U000022CB', + "ltimes;": '\U000022C9', + "ltlarr;": '\U00002976', + "ltquest;": '\U00002A7B', + "ltrPar;": '\U00002996', + "ltri;": '\U000025C3', + "ltrie;": '\U000022B4', + "ltrif;": '\U000025C2', + "lurdshar;": '\U0000294A', + "luruhar;": '\U00002966', + "mDDot;": '\U0000223A', + "macr;": '\U000000AF', + "male;": '\U00002642', + "malt;": '\U00002720', + "maltese;": '\U00002720', + "map;": '\U000021A6', + "mapsto;": '\U000021A6', + "mapstodown;": '\U000021A7', + "mapstoleft;": '\U000021A4', + "mapstoup;": '\U000021A5', + "marker;": '\U000025AE', + "mcomma;": '\U00002A29', + "mcy;": '\U0000043C', + "mdash;": '\U00002014', + "measuredangle;": '\U00002221', + "mfr;": '\U0001D52A', + "mho;": '\U00002127', + "micro;": '\U000000B5', + "mid;": '\U00002223', + "midast;": '\U0000002A', + "midcir;": '\U00002AF0', + "middot;": '\U000000B7', + "minus;": '\U00002212', + "minusb;": '\U0000229F', + "minusd;": '\U00002238', + "minusdu;": '\U00002A2A', + "mlcp;": '\U00002ADB', + "mldr;": '\U00002026', + "mnplus;": '\U00002213', + "models;": '\U000022A7', + "mopf;": '\U0001D55E', + "mp;": '\U00002213', + "mscr;": '\U0001D4C2', + "mstpos;": '\U0000223E', + "mu;": '\U000003BC', + "multimap;": '\U000022B8', + "mumap;": '\U000022B8', + "nLeftarrow;": '\U000021CD', + "nLeftrightarrow;": '\U000021CE', + "nRightarrow;": '\U000021CF', + "nVDash;": '\U000022AF', + "nVdash;": '\U000022AE', + "nabla;": '\U00002207', + "nacute;": '\U00000144', + "nap;": '\U00002249', + "napos;": '\U00000149', + "napprox;": '\U00002249', + "natur;": '\U0000266E', + "natural;": '\U0000266E', + "naturals;": '\U00002115', + "nbsp;": '\U000000A0', + "ncap;": '\U00002A43', + "ncaron;": '\U00000148', + "ncedil;": '\U00000146', + "ncong;": '\U00002247', + "ncup;": '\U00002A42', + "ncy;": '\U0000043D', + "ndash;": '\U00002013', + "ne;": '\U00002260', + "neArr;": '\U000021D7', + "nearhk;": '\U00002924', + "nearr;": '\U00002197', + "nearrow;": '\U00002197', + "nequiv;": '\U00002262', + "nesear;": '\U00002928', + "nexist;": '\U00002204', + "nexists;": '\U00002204', + "nfr;": '\U0001D52B', + "nge;": '\U00002271', + "ngeq;": '\U00002271', + "ngsim;": '\U00002275', + "ngt;": '\U0000226F', + "ngtr;": '\U0000226F', + "nhArr;": '\U000021CE', + "nharr;": '\U000021AE', + "nhpar;": '\U00002AF2', + "ni;": '\U0000220B', + "nis;": '\U000022FC', + "nisd;": '\U000022FA', + "niv;": '\U0000220B', + "njcy;": '\U0000045A', + "nlArr;": '\U000021CD', + "nlarr;": '\U0000219A', + "nldr;": '\U00002025', + "nle;": '\U00002270', + "nleftarrow;": '\U0000219A', + "nleftrightarrow;": '\U000021AE', + "nleq;": '\U00002270', + "nless;": '\U0000226E', + "nlsim;": '\U00002274', + "nlt;": '\U0000226E', + "nltri;": '\U000022EA', + "nltrie;": '\U000022EC', + "nmid;": '\U00002224', + "nopf;": '\U0001D55F', + "not;": '\U000000AC', + "notin;": '\U00002209', + "notinva;": '\U00002209', + "notinvb;": '\U000022F7', + "notinvc;": '\U000022F6', + "notni;": '\U0000220C', + "notniva;": '\U0000220C', + "notnivb;": '\U000022FE', + "notnivc;": '\U000022FD', + "npar;": '\U00002226', + "nparallel;": '\U00002226', + "npolint;": '\U00002A14', + "npr;": '\U00002280', + "nprcue;": '\U000022E0', + "nprec;": '\U00002280', + "nrArr;": '\U000021CF', + "nrarr;": '\U0000219B', + "nrightarrow;": '\U0000219B', + "nrtri;": '\U000022EB', + "nrtrie;": '\U000022ED', + "nsc;": '\U00002281', + "nsccue;": '\U000022E1', + "nscr;": '\U0001D4C3', + "nshortmid;": '\U00002224', + "nshortparallel;": '\U00002226', + "nsim;": '\U00002241', + "nsime;": '\U00002244', + "nsimeq;": '\U00002244', + "nsmid;": '\U00002224', + "nspar;": '\U00002226', + "nsqsube;": '\U000022E2', + "nsqsupe;": '\U000022E3', + "nsub;": '\U00002284', + "nsube;": '\U00002288', + "nsubseteq;": '\U00002288', + "nsucc;": '\U00002281', + "nsup;": '\U00002285', + "nsupe;": '\U00002289', + "nsupseteq;": '\U00002289', + "ntgl;": '\U00002279', + "ntilde;": '\U000000F1', + "ntlg;": '\U00002278', + "ntriangleleft;": '\U000022EA', + "ntrianglelefteq;": '\U000022EC', + "ntriangleright;": '\U000022EB', + "ntrianglerighteq;": '\U000022ED', + "nu;": '\U000003BD', + "num;": '\U00000023', + "numero;": '\U00002116', + "numsp;": '\U00002007', + "nvDash;": '\U000022AD', + "nvHarr;": '\U00002904', + "nvdash;": '\U000022AC', + "nvinfin;": '\U000029DE', + "nvlArr;": '\U00002902', + "nvrArr;": '\U00002903', + "nwArr;": '\U000021D6', + "nwarhk;": '\U00002923', + "nwarr;": '\U00002196', + "nwarrow;": '\U00002196', + "nwnear;": '\U00002927', + "oS;": '\U000024C8', + "oacute;": '\U000000F3', + "oast;": '\U0000229B', + "ocir;": '\U0000229A', + "ocirc;": '\U000000F4', + "ocy;": '\U0000043E', + "odash;": '\U0000229D', + "odblac;": '\U00000151', + "odiv;": '\U00002A38', + "odot;": '\U00002299', + "odsold;": '\U000029BC', + "oelig;": '\U00000153', + "ofcir;": '\U000029BF', + "ofr;": '\U0001D52C', + "ogon;": '\U000002DB', + "ograve;": '\U000000F2', + "ogt;": '\U000029C1', + "ohbar;": '\U000029B5', + "ohm;": '\U000003A9', + "oint;": '\U0000222E', + "olarr;": '\U000021BA', + "olcir;": '\U000029BE', + "olcross;": '\U000029BB', + "oline;": '\U0000203E', + "olt;": '\U000029C0', + "omacr;": '\U0000014D', + "omega;": '\U000003C9', + "omicron;": '\U000003BF', + "omid;": '\U000029B6', + "ominus;": '\U00002296', + "oopf;": '\U0001D560', + "opar;": '\U000029B7', + "operp;": '\U000029B9', + "oplus;": '\U00002295', + "or;": '\U00002228', + "orarr;": '\U000021BB', + "ord;": '\U00002A5D', + "order;": '\U00002134', + "orderof;": '\U00002134', + "ordf;": '\U000000AA', + "ordm;": '\U000000BA', + "origof;": '\U000022B6', + "oror;": '\U00002A56', + "orslope;": '\U00002A57', + "orv;": '\U00002A5B', + "oscr;": '\U00002134', + "oslash;": '\U000000F8', + "osol;": '\U00002298', + "otilde;": '\U000000F5', + "otimes;": '\U00002297', + "otimesas;": '\U00002A36', + "ouml;": '\U000000F6', + "ovbar;": '\U0000233D', + "par;": '\U00002225', + "para;": '\U000000B6', + "parallel;": '\U00002225', + "parsim;": '\U00002AF3', + "parsl;": '\U00002AFD', + "part;": '\U00002202', + "pcy;": '\U0000043F', + "percnt;": '\U00000025', + "period;": '\U0000002E', + "permil;": '\U00002030', + "perp;": '\U000022A5', + "pertenk;": '\U00002031', + "pfr;": '\U0001D52D', + "phi;": '\U000003C6', + "phiv;": '\U000003D5', + "phmmat;": '\U00002133', + "phone;": '\U0000260E', + "pi;": '\U000003C0', + "pitchfork;": '\U000022D4', + "piv;": '\U000003D6', + "planck;": '\U0000210F', + "planckh;": '\U0000210E', + "plankv;": '\U0000210F', + "plus;": '\U0000002B', + "plusacir;": '\U00002A23', + "plusb;": '\U0000229E', + "pluscir;": '\U00002A22', + "plusdo;": '\U00002214', + "plusdu;": '\U00002A25', + "pluse;": '\U00002A72', + "plusmn;": '\U000000B1', + "plussim;": '\U00002A26', + "plustwo;": '\U00002A27', + "pm;": '\U000000B1', + "pointint;": '\U00002A15', + "popf;": '\U0001D561', + "pound;": '\U000000A3', + "pr;": '\U0000227A', + "prE;": '\U00002AB3', + "prap;": '\U00002AB7', + "prcue;": '\U0000227C', + "pre;": '\U00002AAF', + "prec;": '\U0000227A', + "precapprox;": '\U00002AB7', + "preccurlyeq;": '\U0000227C', + "preceq;": '\U00002AAF', + "precnapprox;": '\U00002AB9', + "precneqq;": '\U00002AB5', + "precnsim;": '\U000022E8', + "precsim;": '\U0000227E', + "prime;": '\U00002032', + "primes;": '\U00002119', + "prnE;": '\U00002AB5', + "prnap;": '\U00002AB9', + "prnsim;": '\U000022E8', + "prod;": '\U0000220F', + "profalar;": '\U0000232E', + "profline;": '\U00002312', + "profsurf;": '\U00002313', + "prop;": '\U0000221D', + "propto;": '\U0000221D', + "prsim;": '\U0000227E', + "prurel;": '\U000022B0', + "pscr;": '\U0001D4C5', + "psi;": '\U000003C8', + "puncsp;": '\U00002008', + "qfr;": '\U0001D52E', + "qint;": '\U00002A0C', + "qopf;": '\U0001D562', + "qprime;": '\U00002057', + "qscr;": '\U0001D4C6', + "quaternions;": '\U0000210D', + "quatint;": '\U00002A16', + "quest;": '\U0000003F', + "questeq;": '\U0000225F', + "quot;": '\U00000022', + "rAarr;": '\U000021DB', + "rArr;": '\U000021D2', + "rAtail;": '\U0000291C', + "rBarr;": '\U0000290F', + "rHar;": '\U00002964', + "racute;": '\U00000155', + "radic;": '\U0000221A', + "raemptyv;": '\U000029B3', + "rang;": '\U000027E9', + "rangd;": '\U00002992', + "range;": '\U000029A5', + "rangle;": '\U000027E9', + "raquo;": '\U000000BB', + "rarr;": '\U00002192', + "rarrap;": '\U00002975', + "rarrb;": '\U000021E5', + "rarrbfs;": '\U00002920', + "rarrc;": '\U00002933', + "rarrfs;": '\U0000291E', + "rarrhk;": '\U000021AA', + "rarrlp;": '\U000021AC', + "rarrpl;": '\U00002945', + "rarrsim;": '\U00002974', + "rarrtl;": '\U000021A3', + "rarrw;": '\U0000219D', + "ratail;": '\U0000291A', + "ratio;": '\U00002236', + "rationals;": '\U0000211A', + "rbarr;": '\U0000290D', + "rbbrk;": '\U00002773', + "rbrace;": '\U0000007D', + "rbrack;": '\U0000005D', + "rbrke;": '\U0000298C', + "rbrksld;": '\U0000298E', + "rbrkslu;": '\U00002990', + "rcaron;": '\U00000159', + "rcedil;": '\U00000157', + "rceil;": '\U00002309', + "rcub;": '\U0000007D', + "rcy;": '\U00000440', + "rdca;": '\U00002937', + "rdldhar;": '\U00002969', + "rdquo;": '\U0000201D', + "rdquor;": '\U0000201D', + "rdsh;": '\U000021B3', + "real;": '\U0000211C', + "realine;": '\U0000211B', + "realpart;": '\U0000211C', + "reals;": '\U0000211D', + "rect;": '\U000025AD', + "reg;": '\U000000AE', + "rfisht;": '\U0000297D', + "rfloor;": '\U0000230B', + "rfr;": '\U0001D52F', + "rhard;": '\U000021C1', + "rharu;": '\U000021C0', + "rharul;": '\U0000296C', + "rho;": '\U000003C1', + "rhov;": '\U000003F1', + "rightarrow;": '\U00002192', + "rightarrowtail;": '\U000021A3', + "rightharpoondown;": '\U000021C1', + "rightharpoonup;": '\U000021C0', + "rightleftarrows;": '\U000021C4', + "rightleftharpoons;": '\U000021CC', + "rightrightarrows;": '\U000021C9', + "rightsquigarrow;": '\U0000219D', + "rightthreetimes;": '\U000022CC', + "ring;": '\U000002DA', + "risingdotseq;": '\U00002253', + "rlarr;": '\U000021C4', + "rlhar;": '\U000021CC', + "rlm;": '\U0000200F', + "rmoust;": '\U000023B1', + "rmoustache;": '\U000023B1', + "rnmid;": '\U00002AEE', + "roang;": '\U000027ED', + "roarr;": '\U000021FE', + "robrk;": '\U000027E7', + "ropar;": '\U00002986', + "ropf;": '\U0001D563', + "roplus;": '\U00002A2E', + "rotimes;": '\U00002A35', + "rpar;": '\U00000029', + "rpargt;": '\U00002994', + "rppolint;": '\U00002A12', + "rrarr;": '\U000021C9', + "rsaquo;": '\U0000203A', + "rscr;": '\U0001D4C7', + "rsh;": '\U000021B1', + "rsqb;": '\U0000005D', + "rsquo;": '\U00002019', + "rsquor;": '\U00002019', + "rthree;": '\U000022CC', + "rtimes;": '\U000022CA', + "rtri;": '\U000025B9', + "rtrie;": '\U000022B5', + "rtrif;": '\U000025B8', + "rtriltri;": '\U000029CE', + "ruluhar;": '\U00002968', + "rx;": '\U0000211E', + "sacute;": '\U0000015B', + "sbquo;": '\U0000201A', + "sc;": '\U0000227B', + "scE;": '\U00002AB4', + "scap;": '\U00002AB8', + "scaron;": '\U00000161', + "sccue;": '\U0000227D', + "sce;": '\U00002AB0', + "scedil;": '\U0000015F', + "scirc;": '\U0000015D', + "scnE;": '\U00002AB6', + "scnap;": '\U00002ABA', + "scnsim;": '\U000022E9', + "scpolint;": '\U00002A13', + "scsim;": '\U0000227F', + "scy;": '\U00000441', + "sdot;": '\U000022C5', + "sdotb;": '\U000022A1', + "sdote;": '\U00002A66', + "seArr;": '\U000021D8', + "searhk;": '\U00002925', + "searr;": '\U00002198', + "searrow;": '\U00002198', + "sect;": '\U000000A7', + "semi;": '\U0000003B', + "seswar;": '\U00002929', + "setminus;": '\U00002216', + "setmn;": '\U00002216', + "sext;": '\U00002736', + "sfr;": '\U0001D530', + "sfrown;": '\U00002322', + "sharp;": '\U0000266F', + "shchcy;": '\U00000449', + "shcy;": '\U00000448', + "shortmid;": '\U00002223', + "shortparallel;": '\U00002225', + "shy;": '\U000000AD', + "sigma;": '\U000003C3', + "sigmaf;": '\U000003C2', + "sigmav;": '\U000003C2', + "sim;": '\U0000223C', + "simdot;": '\U00002A6A', + "sime;": '\U00002243', + "simeq;": '\U00002243', + "simg;": '\U00002A9E', + "simgE;": '\U00002AA0', + "siml;": '\U00002A9D', + "simlE;": '\U00002A9F', + "simne;": '\U00002246', + "simplus;": '\U00002A24', + "simrarr;": '\U00002972', + "slarr;": '\U00002190', + "smallsetminus;": '\U00002216', + "smashp;": '\U00002A33', + "smeparsl;": '\U000029E4', + "smid;": '\U00002223', + "smile;": '\U00002323', + "smt;": '\U00002AAA', + "smte;": '\U00002AAC', + "softcy;": '\U0000044C', + "sol;": '\U0000002F', + "solb;": '\U000029C4', + "solbar;": '\U0000233F', + "sopf;": '\U0001D564', + "spades;": '\U00002660', + "spadesuit;": '\U00002660', + "spar;": '\U00002225', + "sqcap;": '\U00002293', + "sqcup;": '\U00002294', + "sqsub;": '\U0000228F', + "sqsube;": '\U00002291', + "sqsubset;": '\U0000228F', + "sqsubseteq;": '\U00002291', + "sqsup;": '\U00002290', + "sqsupe;": '\U00002292', + "sqsupset;": '\U00002290', + "sqsupseteq;": '\U00002292', + "squ;": '\U000025A1', + "square;": '\U000025A1', + "squarf;": '\U000025AA', + "squf;": '\U000025AA', + "srarr;": '\U00002192', + "sscr;": '\U0001D4C8', + "ssetmn;": '\U00002216', + "ssmile;": '\U00002323', + "sstarf;": '\U000022C6', + "star;": '\U00002606', + "starf;": '\U00002605', + "straightepsilon;": '\U000003F5', + "straightphi;": '\U000003D5', + "strns;": '\U000000AF', + "sub;": '\U00002282', + "subE;": '\U00002AC5', + "subdot;": '\U00002ABD', + "sube;": '\U00002286', + "subedot;": '\U00002AC3', + "submult;": '\U00002AC1', + "subnE;": '\U00002ACB', + "subne;": '\U0000228A', + "subplus;": '\U00002ABF', + "subrarr;": '\U00002979', + "subset;": '\U00002282', + "subseteq;": '\U00002286', + "subseteqq;": '\U00002AC5', + "subsetneq;": '\U0000228A', + "subsetneqq;": '\U00002ACB', + "subsim;": '\U00002AC7', + "subsub;": '\U00002AD5', + "subsup;": '\U00002AD3', + "succ;": '\U0000227B', + "succapprox;": '\U00002AB8', + "succcurlyeq;": '\U0000227D', + "succeq;": '\U00002AB0', + "succnapprox;": '\U00002ABA', + "succneqq;": '\U00002AB6', + "succnsim;": '\U000022E9', + "succsim;": '\U0000227F', + "sum;": '\U00002211', + "sung;": '\U0000266A', + "sup;": '\U00002283', + "sup1;": '\U000000B9', + "sup2;": '\U000000B2', + "sup3;": '\U000000B3', + "supE;": '\U00002AC6', + "supdot;": '\U00002ABE', + "supdsub;": '\U00002AD8', + "supe;": '\U00002287', + "supedot;": '\U00002AC4', + "suphsol;": '\U000027C9', + "suphsub;": '\U00002AD7', + "suplarr;": '\U0000297B', + "supmult;": '\U00002AC2', + "supnE;": '\U00002ACC', + "supne;": '\U0000228B', + "supplus;": '\U00002AC0', + "supset;": '\U00002283', + "supseteq;": '\U00002287', + "supseteqq;": '\U00002AC6', + "supsetneq;": '\U0000228B', + "supsetneqq;": '\U00002ACC', + "supsim;": '\U00002AC8', + "supsub;": '\U00002AD4', + "supsup;": '\U00002AD6', + "swArr;": '\U000021D9', + "swarhk;": '\U00002926', + "swarr;": '\U00002199', + "swarrow;": '\U00002199', + "swnwar;": '\U0000292A', + "szlig;": '\U000000DF', + "target;": '\U00002316', + "tau;": '\U000003C4', + "tbrk;": '\U000023B4', + "tcaron;": '\U00000165', + "tcedil;": '\U00000163', + "tcy;": '\U00000442', + "tdot;": '\U000020DB', + "telrec;": '\U00002315', + "tfr;": '\U0001D531', + "there4;": '\U00002234', + "therefore;": '\U00002234', + "theta;": '\U000003B8', + "thetasym;": '\U000003D1', + "thetav;": '\U000003D1', + "thickapprox;": '\U00002248', + "thicksim;": '\U0000223C', + "thinsp;": '\U00002009', + "thkap;": '\U00002248', + "thksim;": '\U0000223C', + "thorn;": '\U000000FE', + "tilde;": '\U000002DC', + "times;": '\U000000D7', + "timesb;": '\U000022A0', + "timesbar;": '\U00002A31', + "timesd;": '\U00002A30', + "tint;": '\U0000222D', + "toea;": '\U00002928', + "top;": '\U000022A4', + "topbot;": '\U00002336', + "topcir;": '\U00002AF1', + "topf;": '\U0001D565', + "topfork;": '\U00002ADA', + "tosa;": '\U00002929', + "tprime;": '\U00002034', + "trade;": '\U00002122', + "triangle;": '\U000025B5', + "triangledown;": '\U000025BF', + "triangleleft;": '\U000025C3', + "trianglelefteq;": '\U000022B4', + "triangleq;": '\U0000225C', + "triangleright;": '\U000025B9', + "trianglerighteq;": '\U000022B5', + "tridot;": '\U000025EC', + "trie;": '\U0000225C', + "triminus;": '\U00002A3A', + "triplus;": '\U00002A39', + "trisb;": '\U000029CD', + "tritime;": '\U00002A3B', + "trpezium;": '\U000023E2', + "tscr;": '\U0001D4C9', + "tscy;": '\U00000446', + "tshcy;": '\U0000045B', + "tstrok;": '\U00000167', + "twixt;": '\U0000226C', + "twoheadleftarrow;": '\U0000219E', + "twoheadrightarrow;": '\U000021A0', + "uArr;": '\U000021D1', + "uHar;": '\U00002963', + "uacute;": '\U000000FA', + "uarr;": '\U00002191', + "ubrcy;": '\U0000045E', + "ubreve;": '\U0000016D', + "ucirc;": '\U000000FB', + "ucy;": '\U00000443', + "udarr;": '\U000021C5', + "udblac;": '\U00000171', + "udhar;": '\U0000296E', + "ufisht;": '\U0000297E', + "ufr;": '\U0001D532', + "ugrave;": '\U000000F9', + "uharl;": '\U000021BF', + "uharr;": '\U000021BE', + "uhblk;": '\U00002580', + "ulcorn;": '\U0000231C', + "ulcorner;": '\U0000231C', + "ulcrop;": '\U0000230F', + "ultri;": '\U000025F8', + "umacr;": '\U0000016B', + "uml;": '\U000000A8', + "uogon;": '\U00000173', + "uopf;": '\U0001D566', + "uparrow;": '\U00002191', + "updownarrow;": '\U00002195', + "upharpoonleft;": '\U000021BF', + "upharpoonright;": '\U000021BE', + "uplus;": '\U0000228E', + "upsi;": '\U000003C5', + "upsih;": '\U000003D2', + "upsilon;": '\U000003C5', + "upuparrows;": '\U000021C8', + "urcorn;": '\U0000231D', + "urcorner;": '\U0000231D', + "urcrop;": '\U0000230E', + "uring;": '\U0000016F', + "urtri;": '\U000025F9', + "uscr;": '\U0001D4CA', + "utdot;": '\U000022F0', + "utilde;": '\U00000169', + "utri;": '\U000025B5', + "utrif;": '\U000025B4', + "uuarr;": '\U000021C8', + "uuml;": '\U000000FC', + "uwangle;": '\U000029A7', + "vArr;": '\U000021D5', + "vBar;": '\U00002AE8', + "vBarv;": '\U00002AE9', + "vDash;": '\U000022A8', + "vangrt;": '\U0000299C', + "varepsilon;": '\U000003F5', + "varkappa;": '\U000003F0', + "varnothing;": '\U00002205', + "varphi;": '\U000003D5', + "varpi;": '\U000003D6', + "varpropto;": '\U0000221D', + "varr;": '\U00002195', + "varrho;": '\U000003F1', + "varsigma;": '\U000003C2', + "vartheta;": '\U000003D1', + "vartriangleleft;": '\U000022B2', + "vartriangleright;": '\U000022B3', + "vcy;": '\U00000432', + "vdash;": '\U000022A2', + "vee;": '\U00002228', + "veebar;": '\U000022BB', + "veeeq;": '\U0000225A', + "vellip;": '\U000022EE', + "verbar;": '\U0000007C', + "vert;": '\U0000007C', + "vfr;": '\U0001D533', + "vltri;": '\U000022B2', + "vopf;": '\U0001D567', + "vprop;": '\U0000221D', + "vrtri;": '\U000022B3', + "vscr;": '\U0001D4CB', + "vzigzag;": '\U0000299A', + "wcirc;": '\U00000175', + "wedbar;": '\U00002A5F', + "wedge;": '\U00002227', + "wedgeq;": '\U00002259', + "weierp;": '\U00002118', + "wfr;": '\U0001D534', + "wopf;": '\U0001D568', + "wp;": '\U00002118', + "wr;": '\U00002240', + "wreath;": '\U00002240', + "wscr;": '\U0001D4CC', + "xcap;": '\U000022C2', + "xcirc;": '\U000025EF', + "xcup;": '\U000022C3', + "xdtri;": '\U000025BD', + "xfr;": '\U0001D535', + "xhArr;": '\U000027FA', + "xharr;": '\U000027F7', + "xi;": '\U000003BE', + "xlArr;": '\U000027F8', + "xlarr;": '\U000027F5', + "xmap;": '\U000027FC', + "xnis;": '\U000022FB', + "xodot;": '\U00002A00', + "xopf;": '\U0001D569', + "xoplus;": '\U00002A01', + "xotime;": '\U00002A02', + "xrArr;": '\U000027F9', + "xrarr;": '\U000027F6', + "xscr;": '\U0001D4CD', + "xsqcup;": '\U00002A06', + "xuplus;": '\U00002A04', + "xutri;": '\U000025B3', + "xvee;": '\U000022C1', + "xwedge;": '\U000022C0', + "yacute;": '\U000000FD', + "yacy;": '\U0000044F', + "ycirc;": '\U00000177', + "ycy;": '\U0000044B', + "yen;": '\U000000A5', + "yfr;": '\U0001D536', + "yicy;": '\U00000457', + "yopf;": '\U0001D56A', + "yscr;": '\U0001D4CE', + "yucy;": '\U0000044E', + "yuml;": '\U000000FF', + "zacute;": '\U0000017A', + "zcaron;": '\U0000017E', + "zcy;": '\U00000437', + "zdot;": '\U0000017C', + "zeetrf;": '\U00002128', + "zeta;": '\U000003B6', + "zfr;": '\U0001D537', + "zhcy;": '\U00000436', + "zigrarr;": '\U000021DD', + "zopf;": '\U0001D56B', + "zscr;": '\U0001D4CF', + "zwj;": '\U0000200D', + "zwnj;": '\U0000200C', + "AElig": '\U000000C6', + "AMP": '\U00000026', + "Aacute": '\U000000C1', + "Acirc": '\U000000C2', + "Agrave": '\U000000C0', + "Aring": '\U000000C5', + "Atilde": '\U000000C3', + "Auml": '\U000000C4', + "COPY": '\U000000A9', + "Ccedil": '\U000000C7', + "ETH": '\U000000D0', + "Eacute": '\U000000C9', + "Ecirc": '\U000000CA', + "Egrave": '\U000000C8', + "Euml": '\U000000CB', + "GT": '\U0000003E', + "Iacute": '\U000000CD', + "Icirc": '\U000000CE', + "Igrave": '\U000000CC', + "Iuml": '\U000000CF', + "LT": '\U0000003C', + "Ntilde": '\U000000D1', + "Oacute": '\U000000D3', + "Ocirc": '\U000000D4', + "Ograve": '\U000000D2', + "Oslash": '\U000000D8', + "Otilde": '\U000000D5', + "Ouml": '\U000000D6', + "QUOT": '\U00000022', + "REG": '\U000000AE', + "THORN": '\U000000DE', + "Uacute": '\U000000DA', + "Ucirc": '\U000000DB', + "Ugrave": '\U000000D9', + "Uuml": '\U000000DC', + "Yacute": '\U000000DD', + "aacute": '\U000000E1', + "acirc": '\U000000E2', + "acute": '\U000000B4', + "aelig": '\U000000E6', + "agrave": '\U000000E0', + "amp": '\U00000026', + "aring": '\U000000E5', + "atilde": '\U000000E3', + "auml": '\U000000E4', + "brvbar": '\U000000A6', + "ccedil": '\U000000E7', + "cedil": '\U000000B8', + "cent": '\U000000A2', + "copy": '\U000000A9', + "curren": '\U000000A4', + "deg": '\U000000B0', + "divide": '\U000000F7', + "eacute": '\U000000E9', + "ecirc": '\U000000EA', + "egrave": '\U000000E8', + "eth": '\U000000F0', + "euml": '\U000000EB', + "frac12": '\U000000BD', + "frac14": '\U000000BC', + "frac34": '\U000000BE', + "gt": '\U0000003E', + "iacute": '\U000000ED', + "icirc": '\U000000EE', + "iexcl": '\U000000A1', + "igrave": '\U000000EC', + "iquest": '\U000000BF', + "iuml": '\U000000EF', + "laquo": '\U000000AB', + "lt": '\U0000003C', + "macr": '\U000000AF', + "micro": '\U000000B5', + "middot": '\U000000B7', + "nbsp": '\U000000A0', + "not": '\U000000AC', + "ntilde": '\U000000F1', + "oacute": '\U000000F3', + "ocirc": '\U000000F4', + "ograve": '\U000000F2', + "ordf": '\U000000AA', + "ordm": '\U000000BA', + "oslash": '\U000000F8', + "otilde": '\U000000F5', + "ouml": '\U000000F6', + "para": '\U000000B6', + "plusmn": '\U000000B1', + "pound": '\U000000A3', + "quot": '\U00000022', + "raquo": '\U000000BB', + "reg": '\U000000AE', + "sect": '\U000000A7', + "shy": '\U000000AD', + "sup1": '\U000000B9', + "sup2": '\U000000B2', + "sup3": '\U000000B3', + "szlig": '\U000000DF', + "thorn": '\U000000FE', + "times": '\U000000D7', + "uacute": '\U000000FA', + "ucirc": '\U000000FB', + "ugrave": '\U000000F9', + "uml": '\U000000A8', + "uuml": '\U000000FC', + "yacute": '\U000000FD', + "yen": '\U000000A5', + "yuml": '\U000000FF', +} + +// HTML entities that are two unicode codepoints. +var entity2 = map[string][2]rune{ + // TODO(nigeltao): Handle replacements that are wider than their names. + // "nLt;": {'\u226A', '\u20D2'}, + // "nGt;": {'\u226B', '\u20D2'}, + "NotEqualTilde;": {'\u2242', '\u0338'}, + "NotGreaterFullEqual;": {'\u2267', '\u0338'}, + "NotGreaterGreater;": {'\u226B', '\u0338'}, + "NotGreaterSlantEqual;": {'\u2A7E', '\u0338'}, + "NotHumpDownHump;": {'\u224E', '\u0338'}, + "NotHumpEqual;": {'\u224F', '\u0338'}, + "NotLeftTriangleBar;": {'\u29CF', '\u0338'}, + "NotLessLess;": {'\u226A', '\u0338'}, + "NotLessSlantEqual;": {'\u2A7D', '\u0338'}, + "NotNestedGreaterGreater;": {'\u2AA2', '\u0338'}, + "NotNestedLessLess;": {'\u2AA1', '\u0338'}, + "NotPrecedesEqual;": {'\u2AAF', '\u0338'}, + "NotRightTriangleBar;": {'\u29D0', '\u0338'}, + "NotSquareSubset;": {'\u228F', '\u0338'}, + "NotSquareSuperset;": {'\u2290', '\u0338'}, + "NotSubset;": {'\u2282', '\u20D2'}, + "NotSucceedsEqual;": {'\u2AB0', '\u0338'}, + "NotSucceedsTilde;": {'\u227F', '\u0338'}, + "NotSuperset;": {'\u2283', '\u20D2'}, + "ThickSpace;": {'\u205F', '\u200A'}, + "acE;": {'\u223E', '\u0333'}, + "bne;": {'\u003D', '\u20E5'}, + "bnequiv;": {'\u2261', '\u20E5'}, + "caps;": {'\u2229', '\uFE00'}, + "cups;": {'\u222A', '\uFE00'}, + "fjlig;": {'\u0066', '\u006A'}, + "gesl;": {'\u22DB', '\uFE00'}, + "gvertneqq;": {'\u2269', '\uFE00'}, + "gvnE;": {'\u2269', '\uFE00'}, + "lates;": {'\u2AAD', '\uFE00'}, + "lesg;": {'\u22DA', '\uFE00'}, + "lvertneqq;": {'\u2268', '\uFE00'}, + "lvnE;": {'\u2268', '\uFE00'}, + "nGg;": {'\u22D9', '\u0338'}, + "nGtv;": {'\u226B', '\u0338'}, + "nLl;": {'\u22D8', '\u0338'}, + "nLtv;": {'\u226A', '\u0338'}, + "nang;": {'\u2220', '\u20D2'}, + "napE;": {'\u2A70', '\u0338'}, + "napid;": {'\u224B', '\u0338'}, + "nbump;": {'\u224E', '\u0338'}, + "nbumpe;": {'\u224F', '\u0338'}, + "ncongdot;": {'\u2A6D', '\u0338'}, + "nedot;": {'\u2250', '\u0338'}, + "nesim;": {'\u2242', '\u0338'}, + "ngE;": {'\u2267', '\u0338'}, + "ngeqq;": {'\u2267', '\u0338'}, + "ngeqslant;": {'\u2A7E', '\u0338'}, + "nges;": {'\u2A7E', '\u0338'}, + "nlE;": {'\u2266', '\u0338'}, + "nleqq;": {'\u2266', '\u0338'}, + "nleqslant;": {'\u2A7D', '\u0338'}, + "nles;": {'\u2A7D', '\u0338'}, + "notinE;": {'\u22F9', '\u0338'}, + "notindot;": {'\u22F5', '\u0338'}, + "nparsl;": {'\u2AFD', '\u20E5'}, + "npart;": {'\u2202', '\u0338'}, + "npre;": {'\u2AAF', '\u0338'}, + "npreceq;": {'\u2AAF', '\u0338'}, + "nrarrc;": {'\u2933', '\u0338'}, + "nrarrw;": {'\u219D', '\u0338'}, + "nsce;": {'\u2AB0', '\u0338'}, + "nsubE;": {'\u2AC5', '\u0338'}, + "nsubset;": {'\u2282', '\u20D2'}, + "nsubseteqq;": {'\u2AC5', '\u0338'}, + "nsucceq;": {'\u2AB0', '\u0338'}, + "nsupE;": {'\u2AC6', '\u0338'}, + "nsupset;": {'\u2283', '\u20D2'}, + "nsupseteqq;": {'\u2AC6', '\u0338'}, + "nvap;": {'\u224D', '\u20D2'}, + "nvge;": {'\u2265', '\u20D2'}, + "nvgt;": {'\u003E', '\u20D2'}, + "nvle;": {'\u2264', '\u20D2'}, + "nvlt;": {'\u003C', '\u20D2'}, + "nvltrie;": {'\u22B4', '\u20D2'}, + "nvrtrie;": {'\u22B5', '\u20D2'}, + "nvsim;": {'\u223C', '\u20D2'}, + "race;": {'\u223D', '\u0331'}, + "smtes;": {'\u2AAC', '\uFE00'}, + "sqcaps;": {'\u2293', '\uFE00'}, + "sqcups;": {'\u2294', '\uFE00'}, + "varsubsetneq;": {'\u228A', '\uFE00'}, + "varsubsetneqq;": {'\u2ACB', '\uFE00'}, + "varsupsetneq;": {'\u228B', '\uFE00'}, + "varsupsetneqq;": {'\u2ACC', '\uFE00'}, + "vnsub;": {'\u2282', '\u20D2'}, + "vnsup;": {'\u2283', '\u20D2'}, + "vsubnE;": {'\u2ACB', '\uFE00'}, + "vsubne;": {'\u228A', '\uFE00'}, + "vsupnE;": {'\u2ACC', '\uFE00'}, + "vsupne;": {'\u228B', '\uFE00'}, +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/entity_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/entity_test.go new file mode 100644 index 0000000..b53f866 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/entity_test.go @@ -0,0 +1,29 @@ +// 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 html + +import ( + "testing" + "unicode/utf8" +) + +func TestEntityLength(t *testing.T) { + // We verify that the length of UTF-8 encoding of each value is <= 1 + len(key). + // The +1 comes from the leading "&". This property implies that the length of + // unescaped text is <= the length of escaped text. + for k, v := range entity { + if 1+len(k) < utf8.RuneLen(v) { + t.Error("escaped entity &" + k + " is shorter than its UTF-8 encoding " + string(v)) + } + if len(k) > longestEntityWithoutSemicolon && k[len(k)-1] != ';' { + t.Errorf("entity name %s is %d characters, but longestEntityWithoutSemicolon=%d", k, len(k), longestEntityWithoutSemicolon) + } + } + for k, v := range entity2 { + if 1+len(k) < utf8.RuneLen(v[0])+utf8.RuneLen(v[1]) { + t.Error("escaped entity &" + k + " is shorter than its UTF-8 encoding " + string(v[0]) + string(v[1])) + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/escape.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/escape.go new file mode 100644 index 0000000..d856139 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/escape.go @@ -0,0 +1,258 @@ +// 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 html + +import ( + "bytes" + "strings" + "unicode/utf8" +) + +// These replacements permit compatibility with old numeric entities that +// assumed Windows-1252 encoding. +// https://html.spec.whatwg.org/multipage/syntax.html#consume-a-character-reference +var replacementTable = [...]rune{ + '\u20AC', // First entry is what 0x80 should be replaced with. + '\u0081', + '\u201A', + '\u0192', + '\u201E', + '\u2026', + '\u2020', + '\u2021', + '\u02C6', + '\u2030', + '\u0160', + '\u2039', + '\u0152', + '\u008D', + '\u017D', + '\u008F', + '\u0090', + '\u2018', + '\u2019', + '\u201C', + '\u201D', + '\u2022', + '\u2013', + '\u2014', + '\u02DC', + '\u2122', + '\u0161', + '\u203A', + '\u0153', + '\u009D', + '\u017E', + '\u0178', // Last entry is 0x9F. + // 0x00->'\uFFFD' is handled programmatically. + // 0x0D->'\u000D' is a no-op. +} + +// unescapeEntity reads an entity like "<" from b[src:] and writes the +// corresponding "<" to b[dst:], returning the incremented dst and src cursors. +// Precondition: b[src] == '&' && dst <= src. +// attribute should be true if parsing an attribute value. +func unescapeEntity(b []byte, dst, src int, attribute bool) (dst1, src1 int) { + // https://html.spec.whatwg.org/multipage/syntax.html#consume-a-character-reference + + // i starts at 1 because we already know that s[0] == '&'. + i, s := 1, b[src:] + + if len(s) <= 1 { + b[dst] = b[src] + return dst + 1, src + 1 + } + + if s[i] == '#' { + if len(s) <= 3 { // We need to have at least "&#.". + b[dst] = b[src] + return dst + 1, src + 1 + } + i++ + c := s[i] + hex := false + if c == 'x' || c == 'X' { + hex = true + i++ + } + + x := '\x00' + for i < len(s) { + c = s[i] + i++ + if hex { + if '0' <= c && c <= '9' { + x = 16*x + rune(c) - '0' + continue + } else if 'a' <= c && c <= 'f' { + x = 16*x + rune(c) - 'a' + 10 + continue + } else if 'A' <= c && c <= 'F' { + x = 16*x + rune(c) - 'A' + 10 + continue + } + } else if '0' <= c && c <= '9' { + x = 10*x + rune(c) - '0' + continue + } + if c != ';' { + i-- + } + break + } + + if i <= 3 { // No characters matched. + b[dst] = b[src] + return dst + 1, src + 1 + } + + if 0x80 <= x && x <= 0x9F { + // Replace characters from Windows-1252 with UTF-8 equivalents. + x = replacementTable[x-0x80] + } else if x == 0 || (0xD800 <= x && x <= 0xDFFF) || x > 0x10FFFF { + // Replace invalid characters with the replacement character. + x = '\uFFFD' + } + + return dst + utf8.EncodeRune(b[dst:], x), src + i + } + + // Consume the maximum number of characters possible, with the + // consumed characters matching one of the named references. + + for i < len(s) { + c := s[i] + i++ + // Lower-cased characters are more common in entities, so we check for them first. + if 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || '0' <= c && c <= '9' { + continue + } + if c != ';' { + i-- + } + break + } + + entityName := string(s[1:i]) + if entityName == "" { + // No-op. + } else if attribute && entityName[len(entityName)-1] != ';' && len(s) > i && s[i] == '=' { + // No-op. + } else if x := entity[entityName]; x != 0 { + return dst + utf8.EncodeRune(b[dst:], x), src + i + } else if x := entity2[entityName]; x[0] != 0 { + dst1 := dst + utf8.EncodeRune(b[dst:], x[0]) + return dst1 + utf8.EncodeRune(b[dst1:], x[1]), src + i + } else if !attribute { + maxLen := len(entityName) - 1 + if maxLen > longestEntityWithoutSemicolon { + maxLen = longestEntityWithoutSemicolon + } + for j := maxLen; j > 1; j-- { + if x := entity[entityName[:j]]; x != 0 { + return dst + utf8.EncodeRune(b[dst:], x), src + j + 1 + } + } + } + + dst1, src1 = dst+i, src+i + copy(b[dst:dst1], b[src:src1]) + return dst1, src1 +} + +// unescape unescapes b's entities in-place, so that "a<b" becomes "a': + esc = ">" + case '"': + // """ is shorter than """. + esc = """ + case '\r': + esc = " " + default: + panic("unrecognized escape character") + } + s = s[i+1:] + if _, err := w.WriteString(esc); err != nil { + return err + } + i = strings.IndexAny(s, escapedChars) + } + _, err := w.WriteString(s) + return err +} + +// EscapeString escapes special characters like "<" to become "<". It +// escapes only five such characters: <, >, &, ' and ". +// UnescapeString(EscapeString(s)) == s always holds, but the converse isn't +// always true. +func EscapeString(s string) string { + if strings.IndexAny(s, escapedChars) == -1 { + return s + } + var buf bytes.Buffer + escape(&buf, s) + return buf.String() +} + +// UnescapeString unescapes entities like "<" to become "<". It unescapes a +// larger range of entities than EscapeString escapes. For example, "á" +// unescapes to "á", as does "á" and "&xE1;". +// UnescapeString(EscapeString(s)) == s always holds, but the converse isn't +// always true. +func UnescapeString(s string) string { + for _, c := range s { + if c == '&' { + return string(unescape([]byte(s), false)) + } + } + return s +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/escape_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/escape_test.go new file mode 100644 index 0000000..b405d4b --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/escape_test.go @@ -0,0 +1,97 @@ +// 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 html + +import "testing" + +type unescapeTest struct { + // A short description of the test case. + desc string + // The HTML text. + html string + // The unescaped text. + unescaped string +} + +var unescapeTests = []unescapeTest{ + // Handle no entities. + { + "copy", + "A\ttext\nstring", + "A\ttext\nstring", + }, + // Handle simple named entities. + { + "simple", + "& > <", + "& > <", + }, + // Handle hitting the end of the string. + { + "stringEnd", + "& &", + "& &", + }, + // Handle entities with two codepoints. + { + "multiCodepoint", + "text ⋛︀ blah", + "text \u22db\ufe00 blah", + }, + // Handle decimal numeric entities. + { + "decimalEntity", + "Delta = Δ ", + "Delta = Δ ", + }, + // Handle hexadecimal numeric entities. + { + "hexadecimalEntity", + "Lambda = λ = λ ", + "Lambda = λ = λ ", + }, + // Handle numeric early termination. + { + "numericEnds", + "&# &#x €43 © = ©f = ©", + "&# &#x €43 © = ©f = ©", + }, + // Handle numeric ISO-8859-1 entity replacements. + { + "numericReplacements", + "Footnote‡", + "Footnote‡", + }, +} + +func TestUnescape(t *testing.T) { + for _, tt := range unescapeTests { + unescaped := UnescapeString(tt.html) + if unescaped != tt.unescaped { + t.Errorf("TestUnescape %s: want %q, got %q", tt.desc, tt.unescaped, unescaped) + } + } +} + +func TestUnescapeEscape(t *testing.T) { + ss := []string{ + ``, + `abc def`, + `a & b`, + `a&b`, + `a & b`, + `"`, + `"`, + `"<&>"`, + `"<&>"`, + `3&5==1 && 0<1, "0<1", a+acute=á`, + `The special characters are: <, >, &, ' and "`, + } + for _, s := range ss { + if got := UnescapeString(EscapeString(s)); got != s { + t.Errorf("got %q want %q", got, s) + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/example_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/example_test.go new file mode 100644 index 0000000..0b06ed7 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/example_test.go @@ -0,0 +1,40 @@ +// 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. + +// This example demonstrates parsing HTML data and walking the resulting tree. +package html_test + +import ( + "fmt" + "log" + "strings" + + "golang.org/x/net/html" +) + +func ExampleParse() { + s := `

Links:

` + doc, err := html.Parse(strings.NewReader(s)) + if err != nil { + log.Fatal(err) + } + var f func(*html.Node) + f = func(n *html.Node) { + if n.Type == html.ElementNode && n.Data == "a" { + for _, a := range n.Attr { + if a.Key == "href" { + fmt.Println(a.Val) + break + } + } + } + for c := n.FirstChild; c != nil; c = c.NextSibling { + f(c) + } + } + f(doc) + // Output: + // foo + // /bar/baz +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/foreign.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/foreign.go new file mode 100644 index 0000000..d3b3844 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/foreign.go @@ -0,0 +1,226 @@ +// 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 html + +import ( + "strings" +) + +func adjustAttributeNames(aa []Attribute, nameMap map[string]string) { + for i := range aa { + if newName, ok := nameMap[aa[i].Key]; ok { + aa[i].Key = newName + } + } +} + +func adjustForeignAttributes(aa []Attribute) { + for i, a := range aa { + if a.Key == "" || a.Key[0] != 'x' { + continue + } + switch a.Key { + case "xlink:actuate", "xlink:arcrole", "xlink:href", "xlink:role", "xlink:show", + "xlink:title", "xlink:type", "xml:base", "xml:lang", "xml:space", "xmlns:xlink": + j := strings.Index(a.Key, ":") + aa[i].Namespace = a.Key[:j] + aa[i].Key = a.Key[j+1:] + } + } +} + +func htmlIntegrationPoint(n *Node) bool { + if n.Type != ElementNode { + return false + } + switch n.Namespace { + case "math": + if n.Data == "annotation-xml" { + for _, a := range n.Attr { + if a.Key == "encoding" { + val := strings.ToLower(a.Val) + if val == "text/html" || val == "application/xhtml+xml" { + return true + } + } + } + } + case "svg": + switch n.Data { + case "desc", "foreignObject", "title": + return true + } + } + return false +} + +func mathMLTextIntegrationPoint(n *Node) bool { + if n.Namespace != "math" { + return false + } + switch n.Data { + case "mi", "mo", "mn", "ms", "mtext": + return true + } + return false +} + +// Section 12.2.5.5. +var breakout = map[string]bool{ + "b": true, + "big": true, + "blockquote": true, + "body": true, + "br": true, + "center": true, + "code": true, + "dd": true, + "div": true, + "dl": true, + "dt": true, + "em": true, + "embed": true, + "h1": true, + "h2": true, + "h3": true, + "h4": true, + "h5": true, + "h6": true, + "head": true, + "hr": true, + "i": true, + "img": true, + "li": true, + "listing": true, + "menu": true, + "meta": true, + "nobr": true, + "ol": true, + "p": true, + "pre": true, + "ruby": true, + "s": true, + "small": true, + "span": true, + "strong": true, + "strike": true, + "sub": true, + "sup": true, + "table": true, + "tt": true, + "u": true, + "ul": true, + "var": true, +} + +// Section 12.2.5.5. +var svgTagNameAdjustments = map[string]string{ + "altglyph": "altGlyph", + "altglyphdef": "altGlyphDef", + "altglyphitem": "altGlyphItem", + "animatecolor": "animateColor", + "animatemotion": "animateMotion", + "animatetransform": "animateTransform", + "clippath": "clipPath", + "feblend": "feBlend", + "fecolormatrix": "feColorMatrix", + "fecomponenttransfer": "feComponentTransfer", + "fecomposite": "feComposite", + "feconvolvematrix": "feConvolveMatrix", + "fediffuselighting": "feDiffuseLighting", + "fedisplacementmap": "feDisplacementMap", + "fedistantlight": "feDistantLight", + "feflood": "feFlood", + "fefunca": "feFuncA", + "fefuncb": "feFuncB", + "fefuncg": "feFuncG", + "fefuncr": "feFuncR", + "fegaussianblur": "feGaussianBlur", + "feimage": "feImage", + "femerge": "feMerge", + "femergenode": "feMergeNode", + "femorphology": "feMorphology", + "feoffset": "feOffset", + "fepointlight": "fePointLight", + "fespecularlighting": "feSpecularLighting", + "fespotlight": "feSpotLight", + "fetile": "feTile", + "feturbulence": "feTurbulence", + "foreignobject": "foreignObject", + "glyphref": "glyphRef", + "lineargradient": "linearGradient", + "radialgradient": "radialGradient", + "textpath": "textPath", +} + +// Section 12.2.5.1 +var mathMLAttributeAdjustments = map[string]string{ + "definitionurl": "definitionURL", +} + +var svgAttributeAdjustments = map[string]string{ + "attributename": "attributeName", + "attributetype": "attributeType", + "basefrequency": "baseFrequency", + "baseprofile": "baseProfile", + "calcmode": "calcMode", + "clippathunits": "clipPathUnits", + "contentscripttype": "contentScriptType", + "contentstyletype": "contentStyleType", + "diffuseconstant": "diffuseConstant", + "edgemode": "edgeMode", + "externalresourcesrequired": "externalResourcesRequired", + "filterres": "filterRes", + "filterunits": "filterUnits", + "glyphref": "glyphRef", + "gradienttransform": "gradientTransform", + "gradientunits": "gradientUnits", + "kernelmatrix": "kernelMatrix", + "kernelunitlength": "kernelUnitLength", + "keypoints": "keyPoints", + "keysplines": "keySplines", + "keytimes": "keyTimes", + "lengthadjust": "lengthAdjust", + "limitingconeangle": "limitingConeAngle", + "markerheight": "markerHeight", + "markerunits": "markerUnits", + "markerwidth": "markerWidth", + "maskcontentunits": "maskContentUnits", + "maskunits": "maskUnits", + "numoctaves": "numOctaves", + "pathlength": "pathLength", + "patterncontentunits": "patternContentUnits", + "patterntransform": "patternTransform", + "patternunits": "patternUnits", + "pointsatx": "pointsAtX", + "pointsaty": "pointsAtY", + "pointsatz": "pointsAtZ", + "preservealpha": "preserveAlpha", + "preserveaspectratio": "preserveAspectRatio", + "primitiveunits": "primitiveUnits", + "refx": "refX", + "refy": "refY", + "repeatcount": "repeatCount", + "repeatdur": "repeatDur", + "requiredextensions": "requiredExtensions", + "requiredfeatures": "requiredFeatures", + "specularconstant": "specularConstant", + "specularexponent": "specularExponent", + "spreadmethod": "spreadMethod", + "startoffset": "startOffset", + "stddeviation": "stdDeviation", + "stitchtiles": "stitchTiles", + "surfacescale": "surfaceScale", + "systemlanguage": "systemLanguage", + "tablevalues": "tableValues", + "targetx": "targetX", + "targety": "targetY", + "textlength": "textLength", + "viewbox": "viewBox", + "viewtarget": "viewTarget", + "xchannelselector": "xChannelSelector", + "ychannelselector": "yChannelSelector", + "zoomandpan": "zoomAndPan", +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/node.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/node.go new file mode 100644 index 0000000..26b657a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/node.go @@ -0,0 +1,193 @@ +// 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 html + +import ( + "golang.org/x/net/html/atom" +) + +// A NodeType is the type of a Node. +type NodeType uint32 + +const ( + ErrorNode NodeType = iota + TextNode + DocumentNode + ElementNode + CommentNode + DoctypeNode + scopeMarkerNode +) + +// Section 12.2.3.3 says "scope markers are inserted when entering applet +// elements, buttons, object elements, marquees, table cells, and table +// captions, and are used to prevent formatting from 'leaking'". +var scopeMarker = Node{Type: scopeMarkerNode} + +// A Node consists of a NodeType and some Data (tag name for element nodes, +// content for text) and are part of a tree of Nodes. Element nodes may also +// have a Namespace and contain a slice of Attributes. Data is unescaped, so +// that it looks like "a 0 { + return (*s)[i-1] + } + return nil +} + +// index returns the index of the top-most occurrence of n in the stack, or -1 +// if n is not present. +func (s *nodeStack) index(n *Node) int { + for i := len(*s) - 1; i >= 0; i-- { + if (*s)[i] == n { + return i + } + } + return -1 +} + +// insert inserts a node at the given index. +func (s *nodeStack) insert(i int, n *Node) { + (*s) = append(*s, nil) + copy((*s)[i+1:], (*s)[i:]) + (*s)[i] = n +} + +// remove removes a node from the stack. It is a no-op if n is not present. +func (s *nodeStack) remove(n *Node) { + i := s.index(n) + if i == -1 { + return + } + copy((*s)[i:], (*s)[i+1:]) + j := len(*s) - 1 + (*s)[j] = nil + *s = (*s)[:j] +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/node_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/node_test.go new file mode 100644 index 0000000..471102f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/node_test.go @@ -0,0 +1,146 @@ +// 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 html + +import ( + "fmt" +) + +// checkTreeConsistency checks that a node and its descendants are all +// consistent in their parent/child/sibling relationships. +func checkTreeConsistency(n *Node) error { + return checkTreeConsistency1(n, 0) +} + +func checkTreeConsistency1(n *Node, depth int) error { + if depth == 1e4 { + return fmt.Errorf("html: tree looks like it contains a cycle") + } + if err := checkNodeConsistency(n); err != nil { + return err + } + for c := n.FirstChild; c != nil; c = c.NextSibling { + if err := checkTreeConsistency1(c, depth+1); err != nil { + return err + } + } + return nil +} + +// checkNodeConsistency checks that a node's parent/child/sibling relationships +// are consistent. +func checkNodeConsistency(n *Node) error { + if n == nil { + return nil + } + + nParent := 0 + for p := n.Parent; p != nil; p = p.Parent { + nParent++ + if nParent == 1e4 { + return fmt.Errorf("html: parent list looks like an infinite loop") + } + } + + nForward := 0 + for c := n.FirstChild; c != nil; c = c.NextSibling { + nForward++ + if nForward == 1e6 { + return fmt.Errorf("html: forward list of children looks like an infinite loop") + } + if c.Parent != n { + return fmt.Errorf("html: inconsistent child/parent relationship") + } + } + + nBackward := 0 + for c := n.LastChild; c != nil; c = c.PrevSibling { + nBackward++ + if nBackward == 1e6 { + return fmt.Errorf("html: backward list of children looks like an infinite loop") + } + if c.Parent != n { + return fmt.Errorf("html: inconsistent child/parent relationship") + } + } + + if n.Parent != nil { + if n.Parent == n { + return fmt.Errorf("html: inconsistent parent relationship") + } + if n.Parent == n.FirstChild { + return fmt.Errorf("html: inconsistent parent/first relationship") + } + if n.Parent == n.LastChild { + return fmt.Errorf("html: inconsistent parent/last relationship") + } + if n.Parent == n.PrevSibling { + return fmt.Errorf("html: inconsistent parent/prev relationship") + } + if n.Parent == n.NextSibling { + return fmt.Errorf("html: inconsistent parent/next relationship") + } + + parentHasNAsAChild := false + for c := n.Parent.FirstChild; c != nil; c = c.NextSibling { + if c == n { + parentHasNAsAChild = true + break + } + } + if !parentHasNAsAChild { + return fmt.Errorf("html: inconsistent parent/child relationship") + } + } + + if n.PrevSibling != nil && n.PrevSibling.NextSibling != n { + return fmt.Errorf("html: inconsistent prev/next relationship") + } + if n.NextSibling != nil && n.NextSibling.PrevSibling != n { + return fmt.Errorf("html: inconsistent next/prev relationship") + } + + if (n.FirstChild == nil) != (n.LastChild == nil) { + return fmt.Errorf("html: inconsistent first/last relationship") + } + if n.FirstChild != nil && n.FirstChild == n.LastChild { + // We have a sole child. + if n.FirstChild.PrevSibling != nil || n.FirstChild.NextSibling != nil { + return fmt.Errorf("html: inconsistent sole child's sibling relationship") + } + } + + seen := map[*Node]bool{} + + var last *Node + for c := n.FirstChild; c != nil; c = c.NextSibling { + if seen[c] { + return fmt.Errorf("html: inconsistent repeated child") + } + seen[c] = true + last = c + } + if last != n.LastChild { + return fmt.Errorf("html: inconsistent last relationship") + } + + var first *Node + for c := n.LastChild; c != nil; c = c.PrevSibling { + if !seen[c] { + return fmt.Errorf("html: inconsistent missing child") + } + delete(seen, c) + first = c + } + if first != n.FirstChild { + return fmt.Errorf("html: inconsistent first relationship") + } + + if len(seen) != 0 { + return fmt.Errorf("html: inconsistent forwards/backwards child list") + } + + return nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/parse.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/parse.go new file mode 100644 index 0000000..be4b2bf --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/parse.go @@ -0,0 +1,2094 @@ +// 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 html + +import ( + "errors" + "fmt" + "io" + "strings" + + a "golang.org/x/net/html/atom" +) + +// A parser implements the HTML5 parsing algorithm: +// https://html.spec.whatwg.org/multipage/syntax.html#tree-construction +type parser struct { + // tokenizer provides the tokens for the parser. + tokenizer *Tokenizer + // tok is the most recently read token. + tok Token + // Self-closing tags like
are treated as start tags, except that + // hasSelfClosingToken is set while they are being processed. + hasSelfClosingToken bool + // doc is the document root element. + doc *Node + // The stack of open elements (section 12.2.3.2) and active formatting + // elements (section 12.2.3.3). + oe, afe nodeStack + // Element pointers (section 12.2.3.4). + head, form *Node + // Other parsing state flags (section 12.2.3.5). + scripting, framesetOK bool + // im is the current insertion mode. + im insertionMode + // originalIM is the insertion mode to go back to after completing a text + // or inTableText insertion mode. + originalIM insertionMode + // fosterParenting is whether new elements should be inserted according to + // the foster parenting rules (section 12.2.5.3). + fosterParenting bool + // quirks is whether the parser is operating in "quirks mode." + quirks bool + // fragment is whether the parser is parsing an HTML fragment. + fragment bool + // context is the context element when parsing an HTML fragment + // (section 12.4). + context *Node +} + +func (p *parser) top() *Node { + if n := p.oe.top(); n != nil { + return n + } + return p.doc +} + +// Stop tags for use in popUntil. These come from section 12.2.3.2. +var ( + defaultScopeStopTags = map[string][]a.Atom{ + "": {a.Applet, a.Caption, a.Html, a.Table, a.Td, a.Th, a.Marquee, a.Object, a.Template}, + "math": {a.AnnotationXml, a.Mi, a.Mn, a.Mo, a.Ms, a.Mtext}, + "svg": {a.Desc, a.ForeignObject, a.Title}, + } +) + +type scope int + +const ( + defaultScope scope = iota + listItemScope + buttonScope + tableScope + tableRowScope + tableBodyScope + selectScope +) + +// popUntil pops the stack of open elements at the highest element whose tag +// is in matchTags, provided there is no higher element in the scope's stop +// tags (as defined in section 12.2.3.2). It returns whether or not there was +// such an element. If there was not, popUntil leaves the stack unchanged. +// +// For example, the set of stop tags for table scope is: "html", "table". If +// the stack was: +// ["html", "body", "font", "table", "b", "i", "u"] +// then popUntil(tableScope, "font") would return false, but +// popUntil(tableScope, "i") would return true and the stack would become: +// ["html", "body", "font", "table", "b"] +// +// If an element's tag is in both the stop tags and matchTags, then the stack +// will be popped and the function returns true (provided, of course, there was +// no higher element in the stack that was also in the stop tags). For example, +// popUntil(tableScope, "table") returns true and leaves: +// ["html", "body", "font"] +func (p *parser) popUntil(s scope, matchTags ...a.Atom) bool { + if i := p.indexOfElementInScope(s, matchTags...); i != -1 { + p.oe = p.oe[:i] + return true + } + return false +} + +// indexOfElementInScope returns the index in p.oe of the highest element whose +// tag is in matchTags that is in scope. If no matching element is in scope, it +// returns -1. +func (p *parser) indexOfElementInScope(s scope, matchTags ...a.Atom) int { + for i := len(p.oe) - 1; i >= 0; i-- { + tagAtom := p.oe[i].DataAtom + if p.oe[i].Namespace == "" { + for _, t := range matchTags { + if t == tagAtom { + return i + } + } + switch s { + case defaultScope: + // No-op. + case listItemScope: + if tagAtom == a.Ol || tagAtom == a.Ul { + return -1 + } + case buttonScope: + if tagAtom == a.Button { + return -1 + } + case tableScope: + if tagAtom == a.Html || tagAtom == a.Table { + return -1 + } + case selectScope: + if tagAtom != a.Optgroup && tagAtom != a.Option { + return -1 + } + default: + panic("unreachable") + } + } + switch s { + case defaultScope, listItemScope, buttonScope: + for _, t := range defaultScopeStopTags[p.oe[i].Namespace] { + if t == tagAtom { + return -1 + } + } + } + } + return -1 +} + +// elementInScope is like popUntil, except that it doesn't modify the stack of +// open elements. +func (p *parser) elementInScope(s scope, matchTags ...a.Atom) bool { + return p.indexOfElementInScope(s, matchTags...) != -1 +} + +// clearStackToContext pops elements off the stack of open elements until a +// scope-defined element is found. +func (p *parser) clearStackToContext(s scope) { + for i := len(p.oe) - 1; i >= 0; i-- { + tagAtom := p.oe[i].DataAtom + switch s { + case tableScope: + if tagAtom == a.Html || tagAtom == a.Table { + p.oe = p.oe[:i+1] + return + } + case tableRowScope: + if tagAtom == a.Html || tagAtom == a.Tr { + p.oe = p.oe[:i+1] + return + } + case tableBodyScope: + if tagAtom == a.Html || tagAtom == a.Tbody || tagAtom == a.Tfoot || tagAtom == a.Thead { + p.oe = p.oe[:i+1] + return + } + default: + panic("unreachable") + } + } +} + +// generateImpliedEndTags pops nodes off the stack of open elements as long as +// the top node has a tag name of dd, dt, li, option, optgroup, p, rp, or rt. +// If exceptions are specified, nodes with that name will not be popped off. +func (p *parser) generateImpliedEndTags(exceptions ...string) { + var i int +loop: + for i = len(p.oe) - 1; i >= 0; i-- { + n := p.oe[i] + if n.Type == ElementNode { + switch n.DataAtom { + case a.Dd, a.Dt, a.Li, a.Option, a.Optgroup, a.P, a.Rp, a.Rt: + for _, except := range exceptions { + if n.Data == except { + break loop + } + } + continue + } + } + break + } + + p.oe = p.oe[:i+1] +} + +// addChild adds a child node n to the top element, and pushes n onto the stack +// of open elements if it is an element node. +func (p *parser) addChild(n *Node) { + if p.shouldFosterParent() { + p.fosterParent(n) + } else { + p.top().AppendChild(n) + } + + if n.Type == ElementNode { + p.oe = append(p.oe, n) + } +} + +// shouldFosterParent returns whether the next node to be added should be +// foster parented. +func (p *parser) shouldFosterParent() bool { + if p.fosterParenting { + switch p.top().DataAtom { + case a.Table, a.Tbody, a.Tfoot, a.Thead, a.Tr: + return true + } + } + return false +} + +// fosterParent adds a child node according to the foster parenting rules. +// Section 12.2.5.3, "foster parenting". +func (p *parser) fosterParent(n *Node) { + var table, parent, prev *Node + var i int + for i = len(p.oe) - 1; i >= 0; i-- { + if p.oe[i].DataAtom == a.Table { + table = p.oe[i] + break + } + } + + if table == nil { + // The foster parent is the html element. + parent = p.oe[0] + } else { + parent = table.Parent + } + if parent == nil { + parent = p.oe[i-1] + } + + if table != nil { + prev = table.PrevSibling + } else { + prev = parent.LastChild + } + if prev != nil && prev.Type == TextNode && n.Type == TextNode { + prev.Data += n.Data + return + } + + parent.InsertBefore(n, table) +} + +// addText adds text to the preceding node if it is a text node, or else it +// calls addChild with a new text node. +func (p *parser) addText(text string) { + if text == "" { + return + } + + if p.shouldFosterParent() { + p.fosterParent(&Node{ + Type: TextNode, + Data: text, + }) + return + } + + t := p.top() + if n := t.LastChild; n != nil && n.Type == TextNode { + n.Data += text + return + } + p.addChild(&Node{ + Type: TextNode, + Data: text, + }) +} + +// addElement adds a child element based on the current token. +func (p *parser) addElement() { + p.addChild(&Node{ + Type: ElementNode, + DataAtom: p.tok.DataAtom, + Data: p.tok.Data, + Attr: p.tok.Attr, + }) +} + +// Section 12.2.3.3. +func (p *parser) addFormattingElement() { + tagAtom, attr := p.tok.DataAtom, p.tok.Attr + p.addElement() + + // Implement the Noah's Ark clause, but with three per family instead of two. + identicalElements := 0 +findIdenticalElements: + for i := len(p.afe) - 1; i >= 0; i-- { + n := p.afe[i] + if n.Type == scopeMarkerNode { + break + } + if n.Type != ElementNode { + continue + } + if n.Namespace != "" { + continue + } + if n.DataAtom != tagAtom { + continue + } + if len(n.Attr) != len(attr) { + continue + } + compareAttributes: + for _, t0 := range n.Attr { + for _, t1 := range attr { + if t0.Key == t1.Key && t0.Namespace == t1.Namespace && t0.Val == t1.Val { + // Found a match for this attribute, continue with the next attribute. + continue compareAttributes + } + } + // If we get here, there is no attribute that matches a. + // Therefore the element is not identical to the new one. + continue findIdenticalElements + } + + identicalElements++ + if identicalElements >= 3 { + p.afe.remove(n) + } + } + + p.afe = append(p.afe, p.top()) +} + +// Section 12.2.3.3. +func (p *parser) clearActiveFormattingElements() { + for { + n := p.afe.pop() + if len(p.afe) == 0 || n.Type == scopeMarkerNode { + return + } + } +} + +// Section 12.2.3.3. +func (p *parser) reconstructActiveFormattingElements() { + n := p.afe.top() + if n == nil { + return + } + if n.Type == scopeMarkerNode || p.oe.index(n) != -1 { + return + } + i := len(p.afe) - 1 + for n.Type != scopeMarkerNode && p.oe.index(n) == -1 { + if i == 0 { + i = -1 + break + } + i-- + n = p.afe[i] + } + for { + i++ + clone := p.afe[i].clone() + p.addChild(clone) + p.afe[i] = clone + if i == len(p.afe)-1 { + break + } + } +} + +// Section 12.2.4. +func (p *parser) acknowledgeSelfClosingTag() { + p.hasSelfClosingToken = false +} + +// An insertion mode (section 12.2.3.1) is the state transition function from +// a particular state in the HTML5 parser's state machine. It updates the +// parser's fields depending on parser.tok (where ErrorToken means EOF). +// It returns whether the token was consumed. +type insertionMode func(*parser) bool + +// setOriginalIM sets the insertion mode to return to after completing a text or +// inTableText insertion mode. +// Section 12.2.3.1, "using the rules for". +func (p *parser) setOriginalIM() { + if p.originalIM != nil { + panic("html: bad parser state: originalIM was set twice") + } + p.originalIM = p.im +} + +// Section 12.2.3.1, "reset the insertion mode". +func (p *parser) resetInsertionMode() { + for i := len(p.oe) - 1; i >= 0; i-- { + n := p.oe[i] + if i == 0 && p.context != nil { + n = p.context + } + + switch n.DataAtom { + case a.Select: + p.im = inSelectIM + case a.Td, a.Th: + p.im = inCellIM + case a.Tr: + p.im = inRowIM + case a.Tbody, a.Thead, a.Tfoot: + p.im = inTableBodyIM + case a.Caption: + p.im = inCaptionIM + case a.Colgroup: + p.im = inColumnGroupIM + case a.Table: + p.im = inTableIM + case a.Head: + p.im = inBodyIM + case a.Body: + p.im = inBodyIM + case a.Frameset: + p.im = inFramesetIM + case a.Html: + p.im = beforeHeadIM + default: + continue + } + return + } + p.im = inBodyIM +} + +const whitespace = " \t\r\n\f" + +// Section 12.2.5.4.1. +func initialIM(p *parser) bool { + switch p.tok.Type { + case TextToken: + p.tok.Data = strings.TrimLeft(p.tok.Data, whitespace) + if len(p.tok.Data) == 0 { + // It was all whitespace, so ignore it. + return true + } + case CommentToken: + p.doc.AppendChild(&Node{ + Type: CommentNode, + Data: p.tok.Data, + }) + return true + case DoctypeToken: + n, quirks := parseDoctype(p.tok.Data) + p.doc.AppendChild(n) + p.quirks = quirks + p.im = beforeHTMLIM + return true + } + p.quirks = true + p.im = beforeHTMLIM + return false +} + +// Section 12.2.5.4.2. +func beforeHTMLIM(p *parser) bool { + switch p.tok.Type { + case DoctypeToken: + // Ignore the token. + return true + case TextToken: + p.tok.Data = strings.TrimLeft(p.tok.Data, whitespace) + if len(p.tok.Data) == 0 { + // It was all whitespace, so ignore it. + return true + } + case StartTagToken: + if p.tok.DataAtom == a.Html { + p.addElement() + p.im = beforeHeadIM + return true + } + case EndTagToken: + switch p.tok.DataAtom { + case a.Head, a.Body, a.Html, a.Br: + p.parseImpliedToken(StartTagToken, a.Html, a.Html.String()) + return false + default: + // Ignore the token. + return true + } + case CommentToken: + p.doc.AppendChild(&Node{ + Type: CommentNode, + Data: p.tok.Data, + }) + return true + } + p.parseImpliedToken(StartTagToken, a.Html, a.Html.String()) + return false +} + +// Section 12.2.5.4.3. +func beforeHeadIM(p *parser) bool { + switch p.tok.Type { + case TextToken: + p.tok.Data = strings.TrimLeft(p.tok.Data, whitespace) + if len(p.tok.Data) == 0 { + // It was all whitespace, so ignore it. + return true + } + case StartTagToken: + switch p.tok.DataAtom { + case a.Head: + p.addElement() + p.head = p.top() + p.im = inHeadIM + return true + case a.Html: + return inBodyIM(p) + } + case EndTagToken: + switch p.tok.DataAtom { + case a.Head, a.Body, a.Html, a.Br: + p.parseImpliedToken(StartTagToken, a.Head, a.Head.String()) + return false + default: + // Ignore the token. + return true + } + case CommentToken: + p.addChild(&Node{ + Type: CommentNode, + Data: p.tok.Data, + }) + return true + case DoctypeToken: + // Ignore the token. + return true + } + + p.parseImpliedToken(StartTagToken, a.Head, a.Head.String()) + return false +} + +// Section 12.2.5.4.4. +func inHeadIM(p *parser) bool { + switch p.tok.Type { + case TextToken: + s := strings.TrimLeft(p.tok.Data, whitespace) + if len(s) < len(p.tok.Data) { + // Add the initial whitespace to the current node. + p.addText(p.tok.Data[:len(p.tok.Data)-len(s)]) + if s == "" { + return true + } + p.tok.Data = s + } + case StartTagToken: + switch p.tok.DataAtom { + case a.Html: + return inBodyIM(p) + case a.Base, a.Basefont, a.Bgsound, a.Command, a.Link, a.Meta: + p.addElement() + p.oe.pop() + p.acknowledgeSelfClosingTag() + return true + case a.Script, a.Title, a.Noscript, a.Noframes, a.Style: + p.addElement() + p.setOriginalIM() + p.im = textIM + return true + case a.Head: + // Ignore the token. + return true + } + case EndTagToken: + switch p.tok.DataAtom { + case a.Head: + n := p.oe.pop() + if n.DataAtom != a.Head { + panic("html: bad parser state: element not found, in the in-head insertion mode") + } + p.im = afterHeadIM + return true + case a.Body, a.Html, a.Br: + p.parseImpliedToken(EndTagToken, a.Head, a.Head.String()) + return false + default: + // Ignore the token. + return true + } + case CommentToken: + p.addChild(&Node{ + Type: CommentNode, + Data: p.tok.Data, + }) + return true + case DoctypeToken: + // Ignore the token. + return true + } + + p.parseImpliedToken(EndTagToken, a.Head, a.Head.String()) + return false +} + +// Section 12.2.5.4.6. +func afterHeadIM(p *parser) bool { + switch p.tok.Type { + case TextToken: + s := strings.TrimLeft(p.tok.Data, whitespace) + if len(s) < len(p.tok.Data) { + // Add the initial whitespace to the current node. + p.addText(p.tok.Data[:len(p.tok.Data)-len(s)]) + if s == "" { + return true + } + p.tok.Data = s + } + case StartTagToken: + switch p.tok.DataAtom { + case a.Html: + return inBodyIM(p) + case a.Body: + p.addElement() + p.framesetOK = false + p.im = inBodyIM + return true + case a.Frameset: + p.addElement() + p.im = inFramesetIM + return true + case a.Base, a.Basefont, a.Bgsound, a.Link, a.Meta, a.Noframes, a.Script, a.Style, a.Title: + p.oe = append(p.oe, p.head) + defer p.oe.remove(p.head) + return inHeadIM(p) + case a.Head: + // Ignore the token. + return true + } + case EndTagToken: + switch p.tok.DataAtom { + case a.Body, a.Html, a.Br: + // Drop down to creating an implied tag. + default: + // Ignore the token. + return true + } + case CommentToken: + p.addChild(&Node{ + Type: CommentNode, + Data: p.tok.Data, + }) + return true + case DoctypeToken: + // Ignore the token. + return true + } + + p.parseImpliedToken(StartTagToken, a.Body, a.Body.String()) + p.framesetOK = true + return false +} + +// copyAttributes copies attributes of src not found on dst to dst. +func copyAttributes(dst *Node, src Token) { + if len(src.Attr) == 0 { + return + } + attr := map[string]string{} + for _, t := range dst.Attr { + attr[t.Key] = t.Val + } + for _, t := range src.Attr { + if _, ok := attr[t.Key]; !ok { + dst.Attr = append(dst.Attr, t) + attr[t.Key] = t.Val + } + } +} + +// Section 12.2.5.4.7. +func inBodyIM(p *parser) bool { + switch p.tok.Type { + case TextToken: + d := p.tok.Data + switch n := p.oe.top(); n.DataAtom { + case a.Pre, a.Listing: + if n.FirstChild == nil { + // Ignore a newline at the start of a
 block.
+				if d != "" && d[0] == '\r' {
+					d = d[1:]
+				}
+				if d != "" && d[0] == '\n' {
+					d = d[1:]
+				}
+			}
+		}
+		d = strings.Replace(d, "\x00", "", -1)
+		if d == "" {
+			return true
+		}
+		p.reconstructActiveFormattingElements()
+		p.addText(d)
+		if p.framesetOK && strings.TrimLeft(d, whitespace) != "" {
+			// There were non-whitespace characters inserted.
+			p.framesetOK = false
+		}
+	case StartTagToken:
+		switch p.tok.DataAtom {
+		case a.Html:
+			copyAttributes(p.oe[0], p.tok)
+		case a.Base, a.Basefont, a.Bgsound, a.Command, a.Link, a.Meta, a.Noframes, a.Script, a.Style, a.Title:
+			return inHeadIM(p)
+		case a.Body:
+			if len(p.oe) >= 2 {
+				body := p.oe[1]
+				if body.Type == ElementNode && body.DataAtom == a.Body {
+					p.framesetOK = false
+					copyAttributes(body, p.tok)
+				}
+			}
+		case a.Frameset:
+			if !p.framesetOK || len(p.oe) < 2 || p.oe[1].DataAtom != a.Body {
+				// Ignore the token.
+				return true
+			}
+			body := p.oe[1]
+			if body.Parent != nil {
+				body.Parent.RemoveChild(body)
+			}
+			p.oe = p.oe[:1]
+			p.addElement()
+			p.im = inFramesetIM
+			return true
+		case a.Address, a.Article, a.Aside, a.Blockquote, a.Center, a.Details, a.Dir, a.Div, a.Dl, a.Fieldset, a.Figcaption, a.Figure, a.Footer, a.Header, a.Hgroup, a.Menu, a.Nav, a.Ol, a.P, a.Section, a.Summary, a.Ul:
+			p.popUntil(buttonScope, a.P)
+			p.addElement()
+		case a.H1, a.H2, a.H3, a.H4, a.H5, a.H6:
+			p.popUntil(buttonScope, a.P)
+			switch n := p.top(); n.DataAtom {
+			case a.H1, a.H2, a.H3, a.H4, a.H5, a.H6:
+				p.oe.pop()
+			}
+			p.addElement()
+		case a.Pre, a.Listing:
+			p.popUntil(buttonScope, a.P)
+			p.addElement()
+			// The newline, if any, will be dealt with by the TextToken case.
+			p.framesetOK = false
+		case a.Form:
+			if p.form == nil {
+				p.popUntil(buttonScope, a.P)
+				p.addElement()
+				p.form = p.top()
+			}
+		case a.Li:
+			p.framesetOK = false
+			for i := len(p.oe) - 1; i >= 0; i-- {
+				node := p.oe[i]
+				switch node.DataAtom {
+				case a.Li:
+					p.oe = p.oe[:i]
+				case a.Address, a.Div, a.P:
+					continue
+				default:
+					if !isSpecialElement(node) {
+						continue
+					}
+				}
+				break
+			}
+			p.popUntil(buttonScope, a.P)
+			p.addElement()
+		case a.Dd, a.Dt:
+			p.framesetOK = false
+			for i := len(p.oe) - 1; i >= 0; i-- {
+				node := p.oe[i]
+				switch node.DataAtom {
+				case a.Dd, a.Dt:
+					p.oe = p.oe[:i]
+				case a.Address, a.Div, a.P:
+					continue
+				default:
+					if !isSpecialElement(node) {
+						continue
+					}
+				}
+				break
+			}
+			p.popUntil(buttonScope, a.P)
+			p.addElement()
+		case a.Plaintext:
+			p.popUntil(buttonScope, a.P)
+			p.addElement()
+		case a.Button:
+			p.popUntil(defaultScope, a.Button)
+			p.reconstructActiveFormattingElements()
+			p.addElement()
+			p.framesetOK = false
+		case a.A:
+			for i := len(p.afe) - 1; i >= 0 && p.afe[i].Type != scopeMarkerNode; i-- {
+				if n := p.afe[i]; n.Type == ElementNode && n.DataAtom == a.A {
+					p.inBodyEndTagFormatting(a.A)
+					p.oe.remove(n)
+					p.afe.remove(n)
+					break
+				}
+			}
+			p.reconstructActiveFormattingElements()
+			p.addFormattingElement()
+		case a.B, a.Big, a.Code, a.Em, a.Font, a.I, a.S, a.Small, a.Strike, a.Strong, a.Tt, a.U:
+			p.reconstructActiveFormattingElements()
+			p.addFormattingElement()
+		case a.Nobr:
+			p.reconstructActiveFormattingElements()
+			if p.elementInScope(defaultScope, a.Nobr) {
+				p.inBodyEndTagFormatting(a.Nobr)
+				p.reconstructActiveFormattingElements()
+			}
+			p.addFormattingElement()
+		case a.Applet, a.Marquee, a.Object:
+			p.reconstructActiveFormattingElements()
+			p.addElement()
+			p.afe = append(p.afe, &scopeMarker)
+			p.framesetOK = false
+		case a.Table:
+			if !p.quirks {
+				p.popUntil(buttonScope, a.P)
+			}
+			p.addElement()
+			p.framesetOK = false
+			p.im = inTableIM
+			return true
+		case a.Area, a.Br, a.Embed, a.Img, a.Input, a.Keygen, a.Wbr:
+			p.reconstructActiveFormattingElements()
+			p.addElement()
+			p.oe.pop()
+			p.acknowledgeSelfClosingTag()
+			if p.tok.DataAtom == a.Input {
+				for _, t := range p.tok.Attr {
+					if t.Key == "type" {
+						if strings.ToLower(t.Val) == "hidden" {
+							// Skip setting framesetOK = false
+							return true
+						}
+					}
+				}
+			}
+			p.framesetOK = false
+		case a.Param, a.Source, a.Track:
+			p.addElement()
+			p.oe.pop()
+			p.acknowledgeSelfClosingTag()
+		case a.Hr:
+			p.popUntil(buttonScope, a.P)
+			p.addElement()
+			p.oe.pop()
+			p.acknowledgeSelfClosingTag()
+			p.framesetOK = false
+		case a.Image:
+			p.tok.DataAtom = a.Img
+			p.tok.Data = a.Img.String()
+			return false
+		case a.Isindex:
+			if p.form != nil {
+				// Ignore the token.
+				return true
+			}
+			action := ""
+			prompt := "This is a searchable index. Enter search keywords: "
+			attr := []Attribute{{Key: "name", Val: "isindex"}}
+			for _, t := range p.tok.Attr {
+				switch t.Key {
+				case "action":
+					action = t.Val
+				case "name":
+					// Ignore the attribute.
+				case "prompt":
+					prompt = t.Val
+				default:
+					attr = append(attr, t)
+				}
+			}
+			p.acknowledgeSelfClosingTag()
+			p.popUntil(buttonScope, a.P)
+			p.parseImpliedToken(StartTagToken, a.Form, a.Form.String())
+			if action != "" {
+				p.form.Attr = []Attribute{{Key: "action", Val: action}}
+			}
+			p.parseImpliedToken(StartTagToken, a.Hr, a.Hr.String())
+			p.parseImpliedToken(StartTagToken, a.Label, a.Label.String())
+			p.addText(prompt)
+			p.addChild(&Node{
+				Type:     ElementNode,
+				DataAtom: a.Input,
+				Data:     a.Input.String(),
+				Attr:     attr,
+			})
+			p.oe.pop()
+			p.parseImpliedToken(EndTagToken, a.Label, a.Label.String())
+			p.parseImpliedToken(StartTagToken, a.Hr, a.Hr.String())
+			p.parseImpliedToken(EndTagToken, a.Form, a.Form.String())
+		case a.Textarea:
+			p.addElement()
+			p.setOriginalIM()
+			p.framesetOK = false
+			p.im = textIM
+		case a.Xmp:
+			p.popUntil(buttonScope, a.P)
+			p.reconstructActiveFormattingElements()
+			p.framesetOK = false
+			p.addElement()
+			p.setOriginalIM()
+			p.im = textIM
+		case a.Iframe:
+			p.framesetOK = false
+			p.addElement()
+			p.setOriginalIM()
+			p.im = textIM
+		case a.Noembed, a.Noscript:
+			p.addElement()
+			p.setOriginalIM()
+			p.im = textIM
+		case a.Select:
+			p.reconstructActiveFormattingElements()
+			p.addElement()
+			p.framesetOK = false
+			p.im = inSelectIM
+			return true
+		case a.Optgroup, a.Option:
+			if p.top().DataAtom == a.Option {
+				p.oe.pop()
+			}
+			p.reconstructActiveFormattingElements()
+			p.addElement()
+		case a.Rp, a.Rt:
+			if p.elementInScope(defaultScope, a.Ruby) {
+				p.generateImpliedEndTags()
+			}
+			p.addElement()
+		case a.Math, a.Svg:
+			p.reconstructActiveFormattingElements()
+			if p.tok.DataAtom == a.Math {
+				adjustAttributeNames(p.tok.Attr, mathMLAttributeAdjustments)
+			} else {
+				adjustAttributeNames(p.tok.Attr, svgAttributeAdjustments)
+			}
+			adjustForeignAttributes(p.tok.Attr)
+			p.addElement()
+			p.top().Namespace = p.tok.Data
+			if p.hasSelfClosingToken {
+				p.oe.pop()
+				p.acknowledgeSelfClosingTag()
+			}
+			return true
+		case a.Caption, a.Col, a.Colgroup, a.Frame, a.Head, a.Tbody, a.Td, a.Tfoot, a.Th, a.Thead, a.Tr:
+			// Ignore the token.
+		default:
+			p.reconstructActiveFormattingElements()
+			p.addElement()
+		}
+	case EndTagToken:
+		switch p.tok.DataAtom {
+		case a.Body:
+			if p.elementInScope(defaultScope, a.Body) {
+				p.im = afterBodyIM
+			}
+		case a.Html:
+			if p.elementInScope(defaultScope, a.Body) {
+				p.parseImpliedToken(EndTagToken, a.Body, a.Body.String())
+				return false
+			}
+			return true
+		case a.Address, a.Article, a.Aside, a.Blockquote, a.Button, a.Center, a.Details, a.Dir, a.Div, a.Dl, a.Fieldset, a.Figcaption, a.Figure, a.Footer, a.Header, a.Hgroup, a.Listing, a.Menu, a.Nav, a.Ol, a.Pre, a.Section, a.Summary, a.Ul:
+			p.popUntil(defaultScope, p.tok.DataAtom)
+		case a.Form:
+			node := p.form
+			p.form = nil
+			i := p.indexOfElementInScope(defaultScope, a.Form)
+			if node == nil || i == -1 || p.oe[i] != node {
+				// Ignore the token.
+				return true
+			}
+			p.generateImpliedEndTags()
+			p.oe.remove(node)
+		case a.P:
+			if !p.elementInScope(buttonScope, a.P) {
+				p.parseImpliedToken(StartTagToken, a.P, a.P.String())
+			}
+			p.popUntil(buttonScope, a.P)
+		case a.Li:
+			p.popUntil(listItemScope, a.Li)
+		case a.Dd, a.Dt:
+			p.popUntil(defaultScope, p.tok.DataAtom)
+		case a.H1, a.H2, a.H3, a.H4, a.H5, a.H6:
+			p.popUntil(defaultScope, a.H1, a.H2, a.H3, a.H4, a.H5, a.H6)
+		case a.A, a.B, a.Big, a.Code, a.Em, a.Font, a.I, a.Nobr, a.S, a.Small, a.Strike, a.Strong, a.Tt, a.U:
+			p.inBodyEndTagFormatting(p.tok.DataAtom)
+		case a.Applet, a.Marquee, a.Object:
+			if p.popUntil(defaultScope, p.tok.DataAtom) {
+				p.clearActiveFormattingElements()
+			}
+		case a.Br:
+			p.tok.Type = StartTagToken
+			return false
+		default:
+			p.inBodyEndTagOther(p.tok.DataAtom)
+		}
+	case CommentToken:
+		p.addChild(&Node{
+			Type: CommentNode,
+			Data: p.tok.Data,
+		})
+	}
+
+	return true
+}
+
+func (p *parser) inBodyEndTagFormatting(tagAtom a.Atom) {
+	// This is the "adoption agency" algorithm, described at
+	// https://html.spec.whatwg.org/multipage/syntax.html#adoptionAgency
+
+	// TODO: this is a fairly literal line-by-line translation of that algorithm.
+	// Once the code successfully parses the comprehensive test suite, we should
+	// refactor this code to be more idiomatic.
+
+	// Steps 1-4. The outer loop.
+	for i := 0; i < 8; i++ {
+		// Step 5. Find the formatting element.
+		var formattingElement *Node
+		for j := len(p.afe) - 1; j >= 0; j-- {
+			if p.afe[j].Type == scopeMarkerNode {
+				break
+			}
+			if p.afe[j].DataAtom == tagAtom {
+				formattingElement = p.afe[j]
+				break
+			}
+		}
+		if formattingElement == nil {
+			p.inBodyEndTagOther(tagAtom)
+			return
+		}
+		feIndex := p.oe.index(formattingElement)
+		if feIndex == -1 {
+			p.afe.remove(formattingElement)
+			return
+		}
+		if !p.elementInScope(defaultScope, tagAtom) {
+			// Ignore the tag.
+			return
+		}
+
+		// Steps 9-10. Find the furthest block.
+		var furthestBlock *Node
+		for _, e := range p.oe[feIndex:] {
+			if isSpecialElement(e) {
+				furthestBlock = e
+				break
+			}
+		}
+		if furthestBlock == nil {
+			e := p.oe.pop()
+			for e != formattingElement {
+				e = p.oe.pop()
+			}
+			p.afe.remove(e)
+			return
+		}
+
+		// Steps 11-12. Find the common ancestor and bookmark node.
+		commonAncestor := p.oe[feIndex-1]
+		bookmark := p.afe.index(formattingElement)
+
+		// Step 13. The inner loop. Find the lastNode to reparent.
+		lastNode := furthestBlock
+		node := furthestBlock
+		x := p.oe.index(node)
+		// Steps 13.1-13.2
+		for j := 0; j < 3; j++ {
+			// Step 13.3.
+			x--
+			node = p.oe[x]
+			// Step 13.4 - 13.5.
+			if p.afe.index(node) == -1 {
+				p.oe.remove(node)
+				continue
+			}
+			// Step 13.6.
+			if node == formattingElement {
+				break
+			}
+			// Step 13.7.
+			clone := node.clone()
+			p.afe[p.afe.index(node)] = clone
+			p.oe[p.oe.index(node)] = clone
+			node = clone
+			// Step 13.8.
+			if lastNode == furthestBlock {
+				bookmark = p.afe.index(node) + 1
+			}
+			// Step 13.9.
+			if lastNode.Parent != nil {
+				lastNode.Parent.RemoveChild(lastNode)
+			}
+			node.AppendChild(lastNode)
+			// Step 13.10.
+			lastNode = node
+		}
+
+		// Step 14. Reparent lastNode to the common ancestor,
+		// or for misnested table nodes, to the foster parent.
+		if lastNode.Parent != nil {
+			lastNode.Parent.RemoveChild(lastNode)
+		}
+		switch commonAncestor.DataAtom {
+		case a.Table, a.Tbody, a.Tfoot, a.Thead, a.Tr:
+			p.fosterParent(lastNode)
+		default:
+			commonAncestor.AppendChild(lastNode)
+		}
+
+		// Steps 15-17. Reparent nodes from the furthest block's children
+		// to a clone of the formatting element.
+		clone := formattingElement.clone()
+		reparentChildren(clone, furthestBlock)
+		furthestBlock.AppendChild(clone)
+
+		// Step 18. Fix up the list of active formatting elements.
+		if oldLoc := p.afe.index(formattingElement); oldLoc != -1 && oldLoc < bookmark {
+			// Move the bookmark with the rest of the list.
+			bookmark--
+		}
+		p.afe.remove(formattingElement)
+		p.afe.insert(bookmark, clone)
+
+		// Step 19. Fix up the stack of open elements.
+		p.oe.remove(formattingElement)
+		p.oe.insert(p.oe.index(furthestBlock)+1, clone)
+	}
+}
+
+// inBodyEndTagOther performs the "any other end tag" algorithm for inBodyIM.
+// "Any other end tag" handling from 12.2.5.5 The rules for parsing tokens in foreign content
+// https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inforeign
+func (p *parser) inBodyEndTagOther(tagAtom a.Atom) {
+	for i := len(p.oe) - 1; i >= 0; i-- {
+		if p.oe[i].DataAtom == tagAtom {
+			p.oe = p.oe[:i]
+			break
+		}
+		if isSpecialElement(p.oe[i]) {
+			break
+		}
+	}
+}
+
+// Section 12.2.5.4.8.
+func textIM(p *parser) bool {
+	switch p.tok.Type {
+	case ErrorToken:
+		p.oe.pop()
+	case TextToken:
+		d := p.tok.Data
+		if n := p.oe.top(); n.DataAtom == a.Textarea && n.FirstChild == nil {
+			// Ignore a newline at the start of a -->
+#errors
+#document
+| 
+|   
+|   
+|     -->
+#errors
+#document
+| 
+|   
+|   
+|     
+#errors
+Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE.
+#document
+| 
+|   
+|   
+|     
+#errors
+Line: 1 Col: 9 Unexpected end tag (strong). Expected DOCTYPE.
+Line: 1 Col: 9 Unexpected end tag (strong) after the (implied) root element.
+Line: 1 Col: 13 Unexpected end tag (b) after the (implied) root element.
+Line: 1 Col: 18 Unexpected end tag (em) after the (implied) root element.
+Line: 1 Col: 22 Unexpected end tag (i) after the (implied) root element.
+Line: 1 Col: 26 Unexpected end tag (u) after the (implied) root element.
+Line: 1 Col: 35 Unexpected end tag (strike) after the (implied) root element.
+Line: 1 Col: 39 Unexpected end tag (s) after the (implied) root element.
+Line: 1 Col: 47 Unexpected end tag (blink) after the (implied) root element.
+Line: 1 Col: 52 Unexpected end tag (tt) after the (implied) root element.
+Line: 1 Col: 58 Unexpected end tag (pre) after the (implied) root element.
+Line: 1 Col: 64 Unexpected end tag (big) after the (implied) root element.
+Line: 1 Col: 72 Unexpected end tag (small) after the (implied) root element.
+Line: 1 Col: 79 Unexpected end tag (font) after the (implied) root element.
+Line: 1 Col: 88 Unexpected end tag (select) after the (implied) root element.
+Line: 1 Col: 93 Unexpected end tag (h1) after the (implied) root element.
+Line: 1 Col: 98 Unexpected end tag (h2) after the (implied) root element.
+Line: 1 Col: 103 Unexpected end tag (h3) after the (implied) root element.
+Line: 1 Col: 108 Unexpected end tag (h4) after the (implied) root element.
+Line: 1 Col: 113 Unexpected end tag (h5) after the (implied) root element.
+Line: 1 Col: 118 Unexpected end tag (h6) after the (implied) root element.
+Line: 1 Col: 125 Unexpected end tag (body) after the (implied) root element.
+Line: 1 Col: 130 Unexpected end tag (br). Treated as br element.
+Line: 1 Col: 134 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm.
+Line: 1 Col: 140 This element (img) has no end tag.
+Line: 1 Col: 148 Unexpected end tag (title). Ignored.
+Line: 1 Col: 155 Unexpected end tag (span). Ignored.
+Line: 1 Col: 163 Unexpected end tag (style). Ignored.
+Line: 1 Col: 172 Unexpected end tag (script). Ignored.
+Line: 1 Col: 180 Unexpected end tag (table). Ignored.
+Line: 1 Col: 185 Unexpected end tag (th). Ignored.
+Line: 1 Col: 190 Unexpected end tag (td). Ignored.
+Line: 1 Col: 195 Unexpected end tag (tr). Ignored.
+Line: 1 Col: 203 This element (frame) has no end tag.
+Line: 1 Col: 210 This element (area) has no end tag.
+Line: 1 Col: 217 Unexpected end tag (link). Ignored.
+Line: 1 Col: 225 This element (param) has no end tag.
+Line: 1 Col: 230 This element (hr) has no end tag.
+Line: 1 Col: 238 This element (input) has no end tag.
+Line: 1 Col: 244 Unexpected end tag (col). Ignored.
+Line: 1 Col: 251 Unexpected end tag (base). Ignored.
+Line: 1 Col: 258 Unexpected end tag (meta). Ignored.
+Line: 1 Col: 269 This element (basefont) has no end tag.
+Line: 1 Col: 279 This element (bgsound) has no end tag.
+Line: 1 Col: 287 This element (embed) has no end tag.
+Line: 1 Col: 296 This element (spacer) has no end tag.
+Line: 1 Col: 300 Unexpected end tag (p). Ignored.
+Line: 1 Col: 305 End tag (dd) seen too early. Expected other end tag.
+Line: 1 Col: 310 End tag (dt) seen too early. Expected other end tag.
+Line: 1 Col: 320 Unexpected end tag (caption). Ignored.
+Line: 1 Col: 331 Unexpected end tag (colgroup). Ignored.
+Line: 1 Col: 339 Unexpected end tag (tbody). Ignored.
+Line: 1 Col: 347 Unexpected end tag (tfoot). Ignored.
+Line: 1 Col: 355 Unexpected end tag (thead). Ignored.
+Line: 1 Col: 365 End tag (address) seen too early. Expected other end tag.
+Line: 1 Col: 378 End tag (blockquote) seen too early. Expected other end tag.
+Line: 1 Col: 387 End tag (center) seen too early. Expected other end tag.
+Line: 1 Col: 393 Unexpected end tag (dir). Ignored.
+Line: 1 Col: 399 End tag (div) seen too early. Expected other end tag.
+Line: 1 Col: 404 End tag (dl) seen too early. Expected other end tag.
+Line: 1 Col: 415 End tag (fieldset) seen too early. Expected other end tag.
+Line: 1 Col: 425 End tag (listing) seen too early. Expected other end tag.
+Line: 1 Col: 432 End tag (menu) seen too early. Expected other end tag.
+Line: 1 Col: 437 End tag (ol) seen too early. Expected other end tag.
+Line: 1 Col: 442 End tag (ul) seen too early. Expected other end tag.
+Line: 1 Col: 447 End tag (li) seen too early. Expected other end tag.
+Line: 1 Col: 454 End tag (nobr) violates step 1, paragraph 1 of the adoption agency algorithm.
+Line: 1 Col: 460 This element (wbr) has no end tag.
+Line: 1 Col: 476 End tag (button) seen too early. Expected other end tag.
+Line: 1 Col: 486 End tag (marquee) seen too early. Expected other end tag.
+Line: 1 Col: 495 End tag (object) seen too early. Expected other end tag.
+Line: 1 Col: 513 Unexpected end tag (html). Ignored.
+Line: 1 Col: 513 Unexpected end tag (frameset). Ignored.
+Line: 1 Col: 520 Unexpected end tag (head). Ignored.
+Line: 1 Col: 529 Unexpected end tag (iframe). Ignored.
+Line: 1 Col: 537 This element (image) has no end tag.
+Line: 1 Col: 547 This element (isindex) has no end tag.
+Line: 1 Col: 557 Unexpected end tag (noembed). Ignored.
+Line: 1 Col: 568 Unexpected end tag (noframes). Ignored.
+Line: 1 Col: 579 Unexpected end tag (noscript). Ignored.
+Line: 1 Col: 590 Unexpected end tag (optgroup). Ignored.
+Line: 1 Col: 599 Unexpected end tag (option). Ignored.
+Line: 1 Col: 611 Unexpected end tag (plaintext). Ignored.
+Line: 1 Col: 622 Unexpected end tag (textarea). Ignored.
+#document
+| 
+|   
+|   
+|     
+|

+ +#data +

+#errors +Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. +Line: 1 Col: 20 Unexpected end tag (strong) in table context caused voodoo mode. +Line: 1 Col: 20 End tag (strong) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 24 Unexpected end tag (b) in table context caused voodoo mode. +Line: 1 Col: 24 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 29 Unexpected end tag (em) in table context caused voodoo mode. +Line: 1 Col: 29 End tag (em) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 33 Unexpected end tag (i) in table context caused voodoo mode. +Line: 1 Col: 33 End tag (i) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 37 Unexpected end tag (u) in table context caused voodoo mode. +Line: 1 Col: 37 End tag (u) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 46 Unexpected end tag (strike) in table context caused voodoo mode. +Line: 1 Col: 46 End tag (strike) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 50 Unexpected end tag (s) in table context caused voodoo mode. +Line: 1 Col: 50 End tag (s) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 58 Unexpected end tag (blink) in table context caused voodoo mode. +Line: 1 Col: 58 Unexpected end tag (blink). Ignored. +Line: 1 Col: 63 Unexpected end tag (tt) in table context caused voodoo mode. +Line: 1 Col: 63 End tag (tt) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 69 Unexpected end tag (pre) in table context caused voodoo mode. +Line: 1 Col: 69 End tag (pre) seen too early. Expected other end tag. +Line: 1 Col: 75 Unexpected end tag (big) in table context caused voodoo mode. +Line: 1 Col: 75 End tag (big) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 83 Unexpected end tag (small) in table context caused voodoo mode. +Line: 1 Col: 83 End tag (small) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 90 Unexpected end tag (font) in table context caused voodoo mode. +Line: 1 Col: 90 End tag (font) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 99 Unexpected end tag (select) in table context caused voodoo mode. +Line: 1 Col: 99 Unexpected end tag (select). Ignored. +Line: 1 Col: 104 Unexpected end tag (h1) in table context caused voodoo mode. +Line: 1 Col: 104 End tag (h1) seen too early. Expected other end tag. +Line: 1 Col: 109 Unexpected end tag (h2) in table context caused voodoo mode. +Line: 1 Col: 109 End tag (h2) seen too early. Expected other end tag. +Line: 1 Col: 114 Unexpected end tag (h3) in table context caused voodoo mode. +Line: 1 Col: 114 End tag (h3) seen too early. Expected other end tag. +Line: 1 Col: 119 Unexpected end tag (h4) in table context caused voodoo mode. +Line: 1 Col: 119 End tag (h4) seen too early. Expected other end tag. +Line: 1 Col: 124 Unexpected end tag (h5) in table context caused voodoo mode. +Line: 1 Col: 124 End tag (h5) seen too early. Expected other end tag. +Line: 1 Col: 129 Unexpected end tag (h6) in table context caused voodoo mode. +Line: 1 Col: 129 End tag (h6) seen too early. Expected other end tag. +Line: 1 Col: 136 Unexpected end tag (body) in the table row phase. Ignored. +Line: 1 Col: 141 Unexpected end tag (br) in table context caused voodoo mode. +Line: 1 Col: 141 Unexpected end tag (br). Treated as br element. +Line: 1 Col: 145 Unexpected end tag (a) in table context caused voodoo mode. +Line: 1 Col: 145 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 151 Unexpected end tag (img) in table context caused voodoo mode. +Line: 1 Col: 151 This element (img) has no end tag. +Line: 1 Col: 159 Unexpected end tag (title) in table context caused voodoo mode. +Line: 1 Col: 159 Unexpected end tag (title). Ignored. +Line: 1 Col: 166 Unexpected end tag (span) in table context caused voodoo mode. +Line: 1 Col: 166 Unexpected end tag (span). Ignored. +Line: 1 Col: 174 Unexpected end tag (style) in table context caused voodoo mode. +Line: 1 Col: 174 Unexpected end tag (style). Ignored. +Line: 1 Col: 183 Unexpected end tag (script) in table context caused voodoo mode. +Line: 1 Col: 183 Unexpected end tag (script). Ignored. +Line: 1 Col: 196 Unexpected end tag (th). Ignored. +Line: 1 Col: 201 Unexpected end tag (td). Ignored. +Line: 1 Col: 206 Unexpected end tag (tr). Ignored. +Line: 1 Col: 214 This element (frame) has no end tag. +Line: 1 Col: 221 This element (area) has no end tag. +Line: 1 Col: 228 Unexpected end tag (link). Ignored. +Line: 1 Col: 236 This element (param) has no end tag. +Line: 1 Col: 241 This element (hr) has no end tag. +Line: 1 Col: 249 This element (input) has no end tag. +Line: 1 Col: 255 Unexpected end tag (col). Ignored. +Line: 1 Col: 262 Unexpected end tag (base). Ignored. +Line: 1 Col: 269 Unexpected end tag (meta). Ignored. +Line: 1 Col: 280 This element (basefont) has no end tag. +Line: 1 Col: 290 This element (bgsound) has no end tag. +Line: 1 Col: 298 This element (embed) has no end tag. +Line: 1 Col: 307 This element (spacer) has no end tag. +Line: 1 Col: 311 Unexpected end tag (p). Ignored. +Line: 1 Col: 316 End tag (dd) seen too early. Expected other end tag. +Line: 1 Col: 321 End tag (dt) seen too early. Expected other end tag. +Line: 1 Col: 331 Unexpected end tag (caption). Ignored. +Line: 1 Col: 342 Unexpected end tag (colgroup). Ignored. +Line: 1 Col: 350 Unexpected end tag (tbody). Ignored. +Line: 1 Col: 358 Unexpected end tag (tfoot). Ignored. +Line: 1 Col: 366 Unexpected end tag (thead). Ignored. +Line: 1 Col: 376 End tag (address) seen too early. Expected other end tag. +Line: 1 Col: 389 End tag (blockquote) seen too early. Expected other end tag. +Line: 1 Col: 398 End tag (center) seen too early. Expected other end tag. +Line: 1 Col: 404 Unexpected end tag (dir). Ignored. +Line: 1 Col: 410 End tag (div) seen too early. Expected other end tag. +Line: 1 Col: 415 End tag (dl) seen too early. Expected other end tag. +Line: 1 Col: 426 End tag (fieldset) seen too early. Expected other end tag. +Line: 1 Col: 436 End tag (listing) seen too early. Expected other end tag. +Line: 1 Col: 443 End tag (menu) seen too early. Expected other end tag. +Line: 1 Col: 448 End tag (ol) seen too early. Expected other end tag. +Line: 1 Col: 453 End tag (ul) seen too early. Expected other end tag. +Line: 1 Col: 458 End tag (li) seen too early. Expected other end tag. +Line: 1 Col: 465 End tag (nobr) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 471 This element (wbr) has no end tag. +Line: 1 Col: 487 End tag (button) seen too early. Expected other end tag. +Line: 1 Col: 497 End tag (marquee) seen too early. Expected other end tag. +Line: 1 Col: 506 End tag (object) seen too early. Expected other end tag. +Line: 1 Col: 524 Unexpected end tag (html). Ignored. +Line: 1 Col: 524 Unexpected end tag (frameset). Ignored. +Line: 1 Col: 531 Unexpected end tag (head). Ignored. +Line: 1 Col: 540 Unexpected end tag (iframe). Ignored. +Line: 1 Col: 548 This element (image) has no end tag. +Line: 1 Col: 558 This element (isindex) has no end tag. +Line: 1 Col: 568 Unexpected end tag (noembed). Ignored. +Line: 1 Col: 579 Unexpected end tag (noframes). Ignored. +Line: 1 Col: 590 Unexpected end tag (noscript). Ignored. +Line: 1 Col: 601 Unexpected end tag (optgroup). Ignored. +Line: 1 Col: 610 Unexpected end tag (option). Ignored. +Line: 1 Col: 622 Unexpected end tag (plaintext). Ignored. +Line: 1 Col: 633 Unexpected end tag (textarea). Ignored. +#document +| +| +| +|
+| +| +| +|

+ +#data + +#errors +Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. +Line: 1 Col: 10 Expected closing tag. Unexpected end of file. +#document +| +| +| diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests10.dat b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests10.dat new file mode 100644 index 0000000..4f8df86 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests10.dat @@ -0,0 +1,799 @@ +#data + +#errors +#document +| +| +| +| +| + +#data +a +#errors +29: Bogus comment +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| + +#data + +#errors +35: Stray “svg” start tag. +42: Stray end tag “svg” +#document +| +| +| +| +| +#errors +43: Stray “svg” start tag. +50: Stray end tag “svg” +#document +| +| +| +| +|

+#errors +34: Start tag “svg” seen in “table”. +41: Stray end tag “svg”. +#document +| +| +| +| +| +| + +#data +
foo
+#errors +34: Start tag “svg” seen in “table”. +46: Stray end tag “g”. +53: Stray end tag “svg”. +#document +| +| +| +| +| +| +| "foo" +| + +#data +
foobar
+#errors +34: Start tag “svg” seen in “table”. +46: Stray end tag “g”. +58: Stray end tag “g”. +65: Stray end tag “svg”. +#document +| +| +| +| +| +| +| "foo" +| +| "bar" +| + +#data +
foobar
+#errors +41: Start tag “svg” seen in “table”. +53: Stray end tag “g”. +65: Stray end tag “g”. +72: Stray end tag “svg”. +#document +| +| +| +| +| +| +| "foo" +| +| "bar" +| +| + +#data +
foobar
+#errors +45: Start tag “svg” seen in “table”. +57: Stray end tag “g”. +69: Stray end tag “g”. +76: Stray end tag “svg”. +#document +| +| +| +| +| +| +| "foo" +| +| "bar" +| +| +| + +#data +
foobar
+#errors +#document +| +| +| +| +| +| +| +|
+| +| +| "foo" +| +| "bar" + +#data +
foobar

baz

+#errors +#document +| +| +| +| +| +| +| +|
+| +| +| "foo" +| +| "bar" +|

+| "baz" + +#data +
foobar

baz

+#errors +#document +| +| +| +| +| +|
+| +| +| "foo" +| +| "bar" +|

+| "baz" + +#data +
foobar

baz

quux +#errors +70: HTML start tag “p” in a foreign namespace context. +81: “table” closed but “caption” was still open. +#document +| +| +| +| +| +|
+| +| +| "foo" +| +| "bar" +|

+| "baz" +|

+| "quux" + +#data +
foobarbaz

quux +#errors +78: “table” closed but “caption” was still open. +78: Unclosed elements on stack. +#document +| +| +| +| +| +|
+| +| +| "foo" +| +| "bar" +| "baz" +|

+| "quux" + +#data +foobar

baz

quux +#errors +44: Start tag “svg” seen in “table”. +56: Stray end tag “g”. +68: Stray end tag “g”. +71: HTML start tag “p” in a foreign namespace context. +71: Start tag “p” seen in “table”. +#document +| +| +| +| +| +| +| "foo" +| +| "bar" +|

+| "baz" +| +| +|

+| "quux" + +#data +

quux +#errors +50: Stray “svg” start tag. +54: Stray “g” start tag. +62: Stray end tag “g” +66: Stray “g” start tag. +74: Stray end tag “g” +77: Stray “p” start tag. +88: “table” end tag with “select” open. +#document +| +| +| +| +| +| +| +|
+|

quux +#errors +36: Start tag “select” seen in “table”. +42: Stray “svg” start tag. +46: Stray “g” start tag. +54: Stray end tag “g” +58: Stray “g” start tag. +66: Stray end tag “g” +69: Stray “p” start tag. +80: “table” end tag with “select” open. +#document +| +| +| +| +| +|

+| "quux" + +#data +foobar

baz +#errors +41: Stray “svg” start tag. +68: HTML start tag “p” in a foreign namespace context. +#document +| +| +| +| +| +| +| "foo" +| +| "bar" +|

+| "baz" + +#data +foobar

baz +#errors +34: Stray “svg” start tag. +61: HTML start tag “p” in a foreign namespace context. +#document +| +| +| +| +| +| +| "foo" +| +| "bar" +|

+| "baz" + +#data +

+#errors +31: Stray “svg” start tag. +35: Stray “g” start tag. +40: Stray end tag “g” +44: Stray “g” start tag. +49: Stray end tag “g” +52: Stray “p” start tag. +58: Stray “span” start tag. +58: End of file seen and there were open elements. +#document +| +| +| +| + +#data +

+#errors +42: Stray “svg” start tag. +46: Stray “g” start tag. +51: Stray end tag “g” +55: Stray “g” start tag. +60: Stray end tag “g” +63: Stray “p” start tag. +69: Stray “span” start tag. +#document +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| xlink:href="foo" +| +| xlink href="foo" + +#data + +#errors +#document +| +| +| +| +| xlink:href="foo" +| xml:lang="en" +| +| +| xlink href="foo" +| xml lang="en" + +#data + +#errors +#document +| +| +| +| +| xlink:href="foo" +| xml:lang="en" +| +| +| xlink href="foo" +| xml lang="en" + +#data +bar +#errors +#document +| +| +| +| +| xlink:href="foo" +| xml:lang="en" +| +| +| xlink href="foo" +| xml lang="en" +| "bar" + +#data + +#errors +#document +| +| +| +| + +#data +

a +#errors +#document +| +| +| +|
+| +| "a" + +#data +
a +#errors +#document +| +| +| +|
+| +| +| "a" + +#data +
+#errors +#document +| +| +| +|
+| +| +| + +#data +
a +#errors +#document +| +| +| +|
+| +| +| +| +| "a" + +#data +

a +#errors +#document +| +| +| +|

+| +| +| +|

+| "a" + +#data +
    a +#errors +40: HTML start tag “ul” in a foreign namespace context. +41: End of file in a foreign namespace context. +#document +| +| +| +| +| +| +|
    +| +|
      +| "a" + +#data +
        a +#errors +35: HTML start tag “ul” in a foreign namespace context. +36: End of file in a foreign namespace context. +#document +| +| +| +| +| +| +| +|
          +| "a" + +#data +

          +#errors +#document +| +| +| +| +|

          +| +| +|

          + +#data +

          +#errors +#document +| +| +| +| +|

          +| +| +|

          + +#data +

          +#errors +#document +| +| +| +|

          +| +| +| +|

          +|

          + +#data +
          +#errors +#document +| +| +| +| +| +|
          +| +|
          +| +| + +#data +
          +#errors +#document +| +| +| +| +| +| +| +|
          +|
          +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data +

+#errors +#document +| +| +| +| +|
+| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| +| + +#data +
+#errors +#document +| +| +| +| +| +| +| +|
+| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| +| +| +| +| +| +| +| +| diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests11.dat b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests11.dat new file mode 100644 index 0000000..638cde4 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests11.dat @@ -0,0 +1,482 @@ +#data + +#errors +#document +| +| +| +| +| +| attributeName="" +| attributeType="" +| baseFrequency="" +| baseProfile="" +| calcMode="" +| clipPathUnits="" +| contentScriptType="" +| contentStyleType="" +| diffuseConstant="" +| edgeMode="" +| externalResourcesRequired="" +| filterRes="" +| filterUnits="" +| glyphRef="" +| gradientTransform="" +| gradientUnits="" +| kernelMatrix="" +| kernelUnitLength="" +| keyPoints="" +| keySplines="" +| keyTimes="" +| lengthAdjust="" +| limitingConeAngle="" +| markerHeight="" +| markerUnits="" +| markerWidth="" +| maskContentUnits="" +| maskUnits="" +| numOctaves="" +| pathLength="" +| patternContentUnits="" +| patternTransform="" +| patternUnits="" +| pointsAtX="" +| pointsAtY="" +| pointsAtZ="" +| preserveAlpha="" +| preserveAspectRatio="" +| primitiveUnits="" +| refX="" +| refY="" +| repeatCount="" +| repeatDur="" +| requiredExtensions="" +| requiredFeatures="" +| specularConstant="" +| specularExponent="" +| spreadMethod="" +| startOffset="" +| stdDeviation="" +| stitchTiles="" +| surfaceScale="" +| systemLanguage="" +| tableValues="" +| targetX="" +| targetY="" +| textLength="" +| viewBox="" +| viewTarget="" +| xChannelSelector="" +| yChannelSelector="" +| zoomAndPan="" + +#data + +#errors +#document +| +| +| +| +| +| attributeName="" +| attributeType="" +| baseFrequency="" +| baseProfile="" +| calcMode="" +| clipPathUnits="" +| contentScriptType="" +| contentStyleType="" +| diffuseConstant="" +| edgeMode="" +| externalResourcesRequired="" +| filterRes="" +| filterUnits="" +| glyphRef="" +| gradientTransform="" +| gradientUnits="" +| kernelMatrix="" +| kernelUnitLength="" +| keyPoints="" +| keySplines="" +| keyTimes="" +| lengthAdjust="" +| limitingConeAngle="" +| markerHeight="" +| markerUnits="" +| markerWidth="" +| maskContentUnits="" +| maskUnits="" +| numOctaves="" +| pathLength="" +| patternContentUnits="" +| patternTransform="" +| patternUnits="" +| pointsAtX="" +| pointsAtY="" +| pointsAtZ="" +| preserveAlpha="" +| preserveAspectRatio="" +| primitiveUnits="" +| refX="" +| refY="" +| repeatCount="" +| repeatDur="" +| requiredExtensions="" +| requiredFeatures="" +| specularConstant="" +| specularExponent="" +| spreadMethod="" +| startOffset="" +| stdDeviation="" +| stitchTiles="" +| surfaceScale="" +| systemLanguage="" +| tableValues="" +| targetX="" +| targetY="" +| textLength="" +| viewBox="" +| viewTarget="" +| xChannelSelector="" +| yChannelSelector="" +| zoomAndPan="" + +#data + +#errors +#document +| +| +| +| +| +| attributeName="" +| attributeType="" +| baseFrequency="" +| baseProfile="" +| calcMode="" +| clipPathUnits="" +| contentScriptType="" +| contentStyleType="" +| diffuseConstant="" +| edgeMode="" +| externalResourcesRequired="" +| filterRes="" +| filterUnits="" +| glyphRef="" +| gradientTransform="" +| gradientUnits="" +| kernelMatrix="" +| kernelUnitLength="" +| keyPoints="" +| keySplines="" +| keyTimes="" +| lengthAdjust="" +| limitingConeAngle="" +| markerHeight="" +| markerUnits="" +| markerWidth="" +| maskContentUnits="" +| maskUnits="" +| numOctaves="" +| pathLength="" +| patternContentUnits="" +| patternTransform="" +| patternUnits="" +| pointsAtX="" +| pointsAtY="" +| pointsAtZ="" +| preserveAlpha="" +| preserveAspectRatio="" +| primitiveUnits="" +| refX="" +| refY="" +| repeatCount="" +| repeatDur="" +| requiredExtensions="" +| requiredFeatures="" +| specularConstant="" +| specularExponent="" +| spreadMethod="" +| startOffset="" +| stdDeviation="" +| stitchTiles="" +| surfaceScale="" +| systemLanguage="" +| tableValues="" +| targetX="" +| targetY="" +| textLength="" +| viewBox="" +| viewTarget="" +| xChannelSelector="" +| yChannelSelector="" +| zoomAndPan="" + +#data + +#errors +#document +| +| +| +| +| +| attributename="" +| attributetype="" +| basefrequency="" +| baseprofile="" +| calcmode="" +| clippathunits="" +| contentscripttype="" +| contentstyletype="" +| diffuseconstant="" +| edgemode="" +| externalresourcesrequired="" +| filterres="" +| filterunits="" +| glyphref="" +| gradienttransform="" +| gradientunits="" +| kernelmatrix="" +| kernelunitlength="" +| keypoints="" +| keysplines="" +| keytimes="" +| lengthadjust="" +| limitingconeangle="" +| markerheight="" +| markerunits="" +| markerwidth="" +| maskcontentunits="" +| maskunits="" +| numoctaves="" +| pathlength="" +| patterncontentunits="" +| patterntransform="" +| patternunits="" +| pointsatx="" +| pointsaty="" +| pointsatz="" +| preservealpha="" +| preserveaspectratio="" +| primitiveunits="" +| refx="" +| refy="" +| repeatcount="" +| repeatdur="" +| requiredextensions="" +| requiredfeatures="" +| specularconstant="" +| specularexponent="" +| spreadmethod="" +| startoffset="" +| stddeviation="" +| stitchtiles="" +| surfacescale="" +| systemlanguage="" +| tablevalues="" +| targetx="" +| targety="" +| textlength="" +| viewbox="" +| viewtarget="" +| xchannelselector="" +| ychannelselector="" +| zoomandpan="" + +#data + +#errors +#document +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests12.dat b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests12.dat new file mode 100644 index 0000000..63107d2 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests12.dat @@ -0,0 +1,62 @@ +#data +

foobazeggs

spam

quuxbar +#errors +#document +| +| +| +| +|

+| "foo" +| +| +| +| "baz" +| +| +| +| +| "eggs" +| +| +|

+| "spam" +| +| +| +|

+#errors +Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. +Line: 1 Col: 20 Unexpected end tag (strong) in table context caused voodoo mode. +Line: 1 Col: 20 End tag (strong) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 24 Unexpected end tag (b) in table context caused voodoo mode. +Line: 1 Col: 24 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 29 Unexpected end tag (em) in table context caused voodoo mode. +Line: 1 Col: 29 End tag (em) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 33 Unexpected end tag (i) in table context caused voodoo mode. +Line: 1 Col: 33 End tag (i) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 37 Unexpected end tag (u) in table context caused voodoo mode. +Line: 1 Col: 37 End tag (u) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 46 Unexpected end tag (strike) in table context caused voodoo mode. +Line: 1 Col: 46 End tag (strike) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 50 Unexpected end tag (s) in table context caused voodoo mode. +Line: 1 Col: 50 End tag (s) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 58 Unexpected end tag (blink) in table context caused voodoo mode. +Line: 1 Col: 58 Unexpected end tag (blink). Ignored. +Line: 1 Col: 63 Unexpected end tag (tt) in table context caused voodoo mode. +Line: 1 Col: 63 End tag (tt) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 69 Unexpected end tag (pre) in table context caused voodoo mode. +Line: 1 Col: 69 End tag (pre) seen too early. Expected other end tag. +Line: 1 Col: 75 Unexpected end tag (big) in table context caused voodoo mode. +Line: 1 Col: 75 End tag (big) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 83 Unexpected end tag (small) in table context caused voodoo mode. +Line: 1 Col: 83 End tag (small) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 90 Unexpected end tag (font) in table context caused voodoo mode. +Line: 1 Col: 90 End tag (font) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 99 Unexpected end tag (select) in table context caused voodoo mode. +Line: 1 Col: 99 Unexpected end tag (select). Ignored. +Line: 1 Col: 104 Unexpected end tag (h1) in table context caused voodoo mode. +Line: 1 Col: 104 End tag (h1) seen too early. Expected other end tag. +Line: 1 Col: 109 Unexpected end tag (h2) in table context caused voodoo mode. +Line: 1 Col: 109 End tag (h2) seen too early. Expected other end tag. +Line: 1 Col: 114 Unexpected end tag (h3) in table context caused voodoo mode. +Line: 1 Col: 114 End tag (h3) seen too early. Expected other end tag. +Line: 1 Col: 119 Unexpected end tag (h4) in table context caused voodoo mode. +Line: 1 Col: 119 End tag (h4) seen too early. Expected other end tag. +Line: 1 Col: 124 Unexpected end tag (h5) in table context caused voodoo mode. +Line: 1 Col: 124 End tag (h5) seen too early. Expected other end tag. +Line: 1 Col: 129 Unexpected end tag (h6) in table context caused voodoo mode. +Line: 1 Col: 129 End tag (h6) seen too early. Expected other end tag. +Line: 1 Col: 136 Unexpected end tag (body) in the table row phase. Ignored. +Line: 1 Col: 141 Unexpected end tag (br) in table context caused voodoo mode. +Line: 1 Col: 141 Unexpected end tag (br). Treated as br element. +Line: 1 Col: 145 Unexpected end tag (a) in table context caused voodoo mode. +Line: 1 Col: 145 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 151 Unexpected end tag (img) in table context caused voodoo mode. +Line: 1 Col: 151 This element (img) has no end tag. +Line: 1 Col: 159 Unexpected end tag (title) in table context caused voodoo mode. +Line: 1 Col: 159 Unexpected end tag (title). Ignored. +Line: 1 Col: 166 Unexpected end tag (span) in table context caused voodoo mode. +Line: 1 Col: 166 Unexpected end tag (span). Ignored. +Line: 1 Col: 174 Unexpected end tag (style) in table context caused voodoo mode. +Line: 1 Col: 174 Unexpected end tag (style). Ignored. +Line: 1 Col: 183 Unexpected end tag (script) in table context caused voodoo mode. +Line: 1 Col: 183 Unexpected end tag (script). Ignored. +Line: 1 Col: 196 Unexpected end tag (th). Ignored. +Line: 1 Col: 201 Unexpected end tag (td). Ignored. +Line: 1 Col: 206 Unexpected end tag (tr). Ignored. +Line: 1 Col: 214 This element (frame) has no end tag. +Line: 1 Col: 221 This element (area) has no end tag. +Line: 1 Col: 228 Unexpected end tag (link). Ignored. +Line: 1 Col: 236 This element (param) has no end tag. +Line: 1 Col: 241 This element (hr) has no end tag. +Line: 1 Col: 249 This element (input) has no end tag. +Line: 1 Col: 255 Unexpected end tag (col). Ignored. +Line: 1 Col: 262 Unexpected end tag (base). Ignored. +Line: 1 Col: 269 Unexpected end tag (meta). Ignored. +Line: 1 Col: 280 This element (basefont) has no end tag. +Line: 1 Col: 290 This element (bgsound) has no end tag. +Line: 1 Col: 298 This element (embed) has no end tag. +Line: 1 Col: 307 This element (spacer) has no end tag. +Line: 1 Col: 311 Unexpected end tag (p). Ignored. +Line: 1 Col: 316 End tag (dd) seen too early. Expected other end tag. +Line: 1 Col: 321 End tag (dt) seen too early. Expected other end tag. +Line: 1 Col: 331 Unexpected end tag (caption). Ignored. +Line: 1 Col: 342 Unexpected end tag (colgroup). Ignored. +Line: 1 Col: 350 Unexpected end tag (tbody). Ignored. +Line: 1 Col: 358 Unexpected end tag (tfoot). Ignored. +Line: 1 Col: 366 Unexpected end tag (thead). Ignored. +Line: 1 Col: 376 End tag (address) seen too early. Expected other end tag. +Line: 1 Col: 389 End tag (blockquote) seen too early. Expected other end tag. +Line: 1 Col: 398 End tag (center) seen too early. Expected other end tag. +Line: 1 Col: 404 Unexpected end tag (dir). Ignored. +Line: 1 Col: 410 End tag (div) seen too early. Expected other end tag. +Line: 1 Col: 415 End tag (dl) seen too early. Expected other end tag. +Line: 1 Col: 426 End tag (fieldset) seen too early. Expected other end tag. +Line: 1 Col: 436 End tag (listing) seen too early. Expected other end tag. +Line: 1 Col: 443 End tag (menu) seen too early. Expected other end tag. +Line: 1 Col: 448 End tag (ol) seen too early. Expected other end tag. +Line: 1 Col: 453 End tag (ul) seen too early. Expected other end tag. +Line: 1 Col: 458 End tag (li) seen too early. Expected other end tag. +Line: 1 Col: 465 End tag (nobr) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 471 This element (wbr) has no end tag. +Line: 1 Col: 487 End tag (button) seen too early. Expected other end tag. +Line: 1 Col: 497 End tag (marquee) seen too early. Expected other end tag. +Line: 1 Col: 506 End tag (object) seen too early. Expected other end tag. +Line: 1 Col: 524 Unexpected end tag (html). Ignored. +Line: 1 Col: 524 Unexpected end tag (frameset). Ignored. +Line: 1 Col: 531 Unexpected end tag (head). Ignored. +Line: 1 Col: 540 Unexpected end tag (iframe). Ignored. +Line: 1 Col: 548 This element (image) has no end tag. +Line: 1 Col: 558 This element (isindex) has no end tag. +Line: 1 Col: 568 Unexpected end tag (noembed). Ignored. +Line: 1 Col: 579 Unexpected end tag (noframes). Ignored. +Line: 1 Col: 590 Unexpected end tag (noscript). Ignored. +Line: 1 Col: 601 Unexpected end tag (optgroup). Ignored. +Line: 1 Col: 610 Unexpected end tag (option). Ignored. +Line: 1 Col: 622 Unexpected end tag (plaintext). Ignored. +Line: 1 Col: 633 Unexpected end tag (textarea). Ignored. +#document +| +| +| +|
+|
+| +| +| "quux" +| "bar" + +#data +foobazeggs

spam
quuxbar +#errors +#document +| +| +| +| +| "foo" +| +| +| +| "baz" +| +| +| +| +| "eggs" +| +| +|

+| "spam" +| +| +| +|
+| +| +| "quux" +| "bar" diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests14.dat b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests14.dat new file mode 100644 index 0000000..b8713f8 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests14.dat @@ -0,0 +1,74 @@ +#data + +#errors +#document +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +15: Unexpected start tag html +#document +| +| +| abc:def="gh" +| +| +| + +#data + +#errors +15: Unexpected start tag html +#document +| +| +| xml:lang="bar" +| +| + +#data + +#errors +#document +| +| +| 123="456" +| +| + +#data + +#errors +#document +| +| +| 123="456" +| 789="012" +| +| + +#data + +#errors +#document +| +| +| +| +| 789="012" diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests15.dat b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests15.dat new file mode 100644 index 0000000..6ce1c0d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests15.dat @@ -0,0 +1,208 @@ +#data +

X +#errors +Line: 1 Col: 31 Unexpected end tag (p). Ignored. +Line: 1 Col: 36 Expected closing tag. Unexpected end of file. +#document +| +| +| +| +|

+| +| +| +| +| +| +| " " +|

+| "X" + +#data +

+

X +#errors +Line: 1 Col: 3 Unexpected start tag (p). Expected DOCTYPE. +Line: 1 Col: 16 Unexpected end tag (p). Ignored. +Line: 2 Col: 4 Expected closing tag. Unexpected end of file. +#document +| +| +| +|

+| +| +| +| +| +| +| " +" +|

+| "X" + +#data + +#errors +Line: 1 Col: 22 Unexpected end tag (html) after the (implied) root element. +#document +| +| +| +| +| " " + +#data + +#errors +Line: 1 Col: 22 Unexpected end tag (body) after the (implied) root element. +#document +| +| +| +| +| + +#data + +#errors +Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. +Line: 1 Col: 13 Unexpected end tag (html) after the (implied) root element. +#document +| +| +| +| + +#data +X +#errors +Line: 1 Col: 22 Unexpected end tag (body) after the (implied) root element. +#document +| +| +| +| +| +| "X" + +#data +<!doctype html><table> X<meta></table> +#errors +Line: 1 Col: 24 Unexpected non-space characters in table context caused voodoo mode. +Line: 1 Col: 30 Unexpected start tag (meta) in table context caused voodoo mode. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| " X" +| <meta> +| <table> + +#data +<!doctype html><table> x</table> +#errors +Line: 1 Col: 24 Unexpected non-space characters in table context caused voodoo mode. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| " x" +| <table> + +#data +<!doctype html><table> x </table> +#errors +Line: 1 Col: 25 Unexpected non-space characters in table context caused voodoo mode. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| " x " +| <table> + +#data +<!doctype html><table><tr> x</table> +#errors +Line: 1 Col: 28 Unexpected non-space characters in table context caused voodoo mode. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| " x" +| <table> +| <tbody> +| <tr> + +#data +<!doctype html><table>X<style> <tr>x </style> </table> +#errors +Line: 1 Col: 23 Unexpected non-space characters in table context caused voodoo mode. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "X" +| <table> +| <style> +| " <tr>x " +| " " + +#data +<!doctype html><div><table><a>foo</a> <tr><td>bar</td> </tr></table></div> +#errors +Line: 1 Col: 30 Unexpected start tag (a) in table context caused voodoo mode. +Line: 1 Col: 37 Unexpected end tag (a) in table context caused voodoo mode. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <div> +| <a> +| "foo" +| <table> +| " " +| <tbody> +| <tr> +| <td> +| "bar" +| " " + +#data +<frame></frame></frame><frameset><frame><frameset><frame></frameset><noframes></frameset><noframes> +#errors +6: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”. +13: Stray start tag “frame”. +21: Stray end tag “frame”. +29: Stray end tag “frame”. +39: “frameset” start tag after “body” already open. +105: End of file seen inside an [R]CDATA element. +105: End of file seen and there were open elements. +XXX: These errors are wrong, please fix me! +#document +| <html> +| <head> +| <frameset> +| <frame> +| <frameset> +| <frame> +| <noframes> +| "</frameset><noframes>" + +#data +<!DOCTYPE html><object></html> +#errors +1: Expected closing tag. Unexpected end of file +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <object> diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests16.dat b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests16.dat new file mode 100644 index 0000000..c8ef66f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests16.dat @@ -0,0 +1,2299 @@ +#data +<!doctype html><script> +#errors +Line: 1 Col: 23 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| <body> + +#data +<!doctype html><script>a +#errors +Line: 1 Col: 24 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "a" +| <body> + +#data +<!doctype html><script>< +#errors +Line: 1 Col: 24 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<" +| <body> + +#data +<!doctype html><script></ +#errors +Line: 1 Col: 25 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</" +| <body> + +#data +<!doctype html><script></S +#errors +Line: 1 Col: 26 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</S" +| <body> + +#data +<!doctype html><script></SC +#errors +Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</SC" +| <body> + +#data +<!doctype html><script></SCR +#errors +Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</SCR" +| <body> + +#data +<!doctype html><script></SCRI +#errors +Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</SCRI" +| <body> + +#data +<!doctype html><script></SCRIP +#errors +Line: 1 Col: 30 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</SCRIP" +| <body> + +#data +<!doctype html><script></SCRIPT +#errors +Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</SCRIPT" +| <body> + +#data +<!doctype html><script></SCRIPT +#errors +Line: 1 Col: 32 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| <body> + +#data +<!doctype html><script></s +#errors +Line: 1 Col: 26 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</s" +| <body> + +#data +<!doctype html><script></sc +#errors +Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</sc" +| <body> + +#data +<!doctype html><script></scr +#errors +Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</scr" +| <body> + +#data +<!doctype html><script></scri +#errors +Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</scri" +| <body> + +#data +<!doctype html><script></scrip +#errors +Line: 1 Col: 30 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</scrip" +| <body> + +#data +<!doctype html><script></script +#errors +Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</script" +| <body> + +#data +<!doctype html><script></script +#errors +Line: 1 Col: 32 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| <body> + +#data +<!doctype html><script><! +#errors +Line: 1 Col: 25 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!" +| <body> + +#data +<!doctype html><script><!a +#errors +Line: 1 Col: 26 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!a" +| <body> + +#data +<!doctype html><script><!- +#errors +Line: 1 Col: 26 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!-" +| <body> + +#data +<!doctype html><script><!-a +#errors +Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!-a" +| <body> + +#data +<!doctype html><script><!-- +#errors +Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--" +| <body> + +#data +<!doctype html><script><!--a +#errors +Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--a" +| <body> + +#data +<!doctype html><script><!--< +#errors +Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<" +| <body> + +#data +<!doctype html><script><!--<a +#errors +Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<a" +| <body> + +#data +<!doctype html><script><!--</ +#errors +Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--</" +| <body> + +#data +<!doctype html><script><!--</script +#errors +Line: 1 Col: 35 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--</script" +| <body> + +#data +<!doctype html><script><!--</script +#errors +Line: 1 Col: 36 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--" +| <body> + +#data +<!doctype html><script><!--<s +#errors +Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<s" +| <body> + +#data +<!doctype html><script><!--<script +#errors +Line: 1 Col: 34 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script" +| <body> + +#data +<!doctype html><script><!--<script +#errors +Line: 1 Col: 35 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script " +| <body> + +#data +<!doctype html><script><!--<script < +#errors +Line: 1 Col: 36 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script <" +| <body> + +#data +<!doctype html><script><!--<script <a +#errors +Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script <a" +| <body> + +#data +<!doctype html><script><!--<script </ +#errors +Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </" +| <body> + +#data +<!doctype html><script><!--<script </s +#errors +Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </s" +| <body> + +#data +<!doctype html><script><!--<script </script +#errors +Line: 1 Col: 43 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script" +| <body> + +#data +<!doctype html><script><!--<script </scripta +#errors +Line: 1 Col: 44 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </scripta" +| <body> + +#data +<!doctype html><script><!--<script </script +#errors +Line: 1 Col: 44 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<!doctype html><script><!--<script </script> +#errors +Line: 1 Col: 44 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script>" +| <body> + +#data +<!doctype html><script><!--<script </script/ +#errors +Line: 1 Col: 44 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script/" +| <body> + +#data +<!doctype html><script><!--<script </script < +#errors +Line: 1 Col: 45 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script <" +| <body> + +#data +<!doctype html><script><!--<script </script <a +#errors +Line: 1 Col: 46 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script <a" +| <body> + +#data +<!doctype html><script><!--<script </script </ +#errors +Line: 1 Col: 46 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script </" +| <body> + +#data +<!doctype html><script><!--<script </script </script +#errors +Line: 1 Col: 52 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script </script" +| <body> + +#data +<!doctype html><script><!--<script </script </script +#errors +Line: 1 Col: 53 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<!doctype html><script><!--<script </script </script/ +#errors +Line: 1 Col: 53 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<!doctype html><script><!--<script </script </script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<!doctype html><script><!--<script - +#errors +Line: 1 Col: 36 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script -" +| <body> + +#data +<!doctype html><script><!--<script -a +#errors +Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script -a" +| <body> + +#data +<!doctype html><script><!--<script -< +#errors +Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script -<" +| <body> + +#data +<!doctype html><script><!--<script -- +#errors +Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script --" +| <body> + +#data +<!doctype html><script><!--<script --a +#errors +Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script --a" +| <body> + +#data +<!doctype html><script><!--<script --< +#errors +Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script --<" +| <body> + +#data +<!doctype html><script><!--<script --> +#errors +Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<!doctype html><script><!--<script -->< +#errors +Line: 1 Col: 39 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script --><" +| <body> + +#data +<!doctype html><script><!--<script --></ +#errors +Line: 1 Col: 40 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script --></" +| <body> + +#data +<!doctype html><script><!--<script --></script +#errors +Line: 1 Col: 46 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script --></script" +| <body> + +#data +<!doctype html><script><!--<script --></script +#errors +Line: 1 Col: 47 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<!doctype html><script><!--<script --></script/ +#errors +Line: 1 Col: 47 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<!doctype html><script><!--<script --></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<!doctype html><script><!--<script><\/script>--></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script><\/script>-->" +| <body> + +#data +<!doctype html><script><!--<script></scr'+'ipt>--></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></scr'+'ipt>-->" +| <body> + +#data +<!doctype html><script><!--<script></script><script></script></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>" +| <body> + +#data +<!doctype html><script><!--<script></script><script></script>--><!--</script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>--><!--" +| <body> + +#data +<!doctype html><script><!--<script></script><script></script>-- ></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>-- >" +| <body> + +#data +<!doctype html><script><!--<script></script><script></script>- -></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>- ->" +| <body> + +#data +<!doctype html><script><!--<script></script><script></script>- - ></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>- - >" +| <body> + +#data +<!doctype html><script><!--<script></script><script></script>-></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>->" +| <body> + +#data +<!doctype html><script><!--<script>--!></script>X +#errors +Line: 1 Col: 49 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script>--!></script>X" +| <body> + +#data +<!doctype html><script><!--<scr'+'ipt></script>--></script> +#errors +Line: 1 Col: 59 Unexpected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<scr'+'ipt>" +| <body> +| "-->" + +#data +<!doctype html><script><!--<script></scr'+'ipt></script>X +#errors +Line: 1 Col: 57 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></scr'+'ipt></script>X" +| <body> + +#data +<!doctype html><style><!--<style></style>--></style> +#errors +Line: 1 Col: 52 Unexpected end tag (style). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "<!--<style>" +| <body> +| "-->" + +#data +<!doctype html><style><!--</style>X +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "<!--" +| <body> +| "X" + +#data +<!doctype html><style><!--...</style>...--></style> +#errors +Line: 1 Col: 51 Unexpected end tag (style). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "<!--..." +| <body> +| "...-->" + +#data +<!doctype html><style><!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style></style>X +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "<!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style>" +| <body> +| "X" + +#data +<!doctype html><style><!--...<style><!--...--!></style>--></style> +#errors +Line: 1 Col: 66 Unexpected end tag (style). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "<!--...<style><!--...--!>" +| <body> +| "-->" + +#data +<!doctype html><style><!--...</style><!-- --><style>@import ...</style> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "<!--..." +| <!-- --> +| <style> +| "@import ..." +| <body> + +#data +<!doctype html><style>...<style><!--...</style><!-- --></style> +#errors +Line: 1 Col: 63 Unexpected end tag (style). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "...<style><!--..." +| <!-- --> +| <body> + +#data +<!doctype html><style>...<!--[if IE]><style>...</style>X +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "...<!--[if IE]><style>..." +| <body> +| "X" + +#data +<!doctype html><title><!--<title>--> +#errors +Line: 1 Col: 52 Unexpected end tag (title). +#document +| +| +| +| +| "<!--<title>" +| <body> +| "-->" + +#data +<!doctype html><title></title> +#errors +#document +| +| +| +| +| "" +| + +#data +foo/title><link></head><body>X +#errors +Line: 1 Col: 52 Unexpected end of file. Expected end tag (title). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <title> +| "foo/title><link></head><body>X" +| <body> + +#data +<!doctype html><noscript><!--<noscript></noscript>--></noscript> +#errors +Line: 1 Col: 64 Unexpected end tag (noscript). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <noscript> +| "<!--<noscript>" +| <body> +| "-->" + +#data +<!doctype html><noscript><!--</noscript>X<noscript>--></noscript> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <noscript> +| "<!--" +| <body> +| "X" +| <noscript> +| "-->" + +#data +<!doctype html><noscript><iframe></noscript>X +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <noscript> +| "<iframe>" +| <body> +| "X" + +#data +<!doctype html><noframes><!--<noframes></noframes>--></noframes> +#errors +Line: 1 Col: 64 Unexpected end tag (noframes). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <noframes> +| "<!--<noframes>" +| <body> +| "-->" + +#data +<!doctype html><noframes><body><script><!--...</script></body></noframes></html> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <noframes> +| "<body><script><!--...</script></body>" +| <body> + +#data +<!doctype html><textarea><!--<textarea></textarea>--></textarea> +#errors +Line: 1 Col: 64 Unexpected end tag (textarea). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <textarea> +| "<!--<textarea>" +| "-->" + +#data +<!doctype html><textarea></textarea></textarea> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <textarea> +| "</textarea>" + +#data +<!doctype html><textarea><</textarea> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <textarea> +| "<" + +#data +<!doctype html><textarea>a<b</textarea> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <textarea> +| "a<b" + +#data +<!doctype html><iframe><!--<iframe></iframe>--></iframe> +#errors +Line: 1 Col: 56 Unexpected end tag (iframe). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <iframe> +| "<!--<iframe>" +| "-->" + +#data +<!doctype html><iframe>...<!--X->...<!--/X->...</iframe> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <iframe> +| "...<!--X->...<!--/X->..." + +#data +<!doctype html><xmp><!--<xmp></xmp>--></xmp> +#errors +Line: 1 Col: 44 Unexpected end tag (xmp). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <xmp> +| "<!--<xmp>" +| "-->" + +#data +<!doctype html><noembed><!--<noembed></noembed>--></noembed> +#errors +Line: 1 Col: 60 Unexpected end tag (noembed). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <noembed> +| "<!--<noembed>" +| "-->" + +#data +<script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 8 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| <body> + +#data +<script>a +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 9 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "a" +| <body> + +#data +<script>< +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 9 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<" +| <body> + +#data +<script></ +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 10 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</" +| <body> + +#data +<script></S +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</S" +| <body> + +#data +<script></SC +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 12 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</SC" +| <body> + +#data +<script></SCR +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 13 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</SCR" +| <body> + +#data +<script></SCRI +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</SCRI" +| <body> + +#data +<script></SCRIP +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 15 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</SCRIP" +| <body> + +#data +<script></SCRIPT +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 16 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</SCRIPT" +| <body> + +#data +<script></SCRIPT +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 17 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| <body> + +#data +<script></s +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</s" +| <body> + +#data +<script></sc +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 12 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</sc" +| <body> + +#data +<script></scr +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 13 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</scr" +| <body> + +#data +<script></scri +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</scri" +| <body> + +#data +<script></scrip +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 15 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</scrip" +| <body> + +#data +<script></script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 16 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</script" +| <body> + +#data +<script></script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 17 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| <body> + +#data +<script><! +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 10 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!" +| <body> + +#data +<script><!a +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!a" +| <body> + +#data +<script><!- +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!-" +| <body> + +#data +<script><!-a +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 12 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!-a" +| <body> + +#data +<script><!-- +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 12 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--" +| <body> + +#data +<script><!--a +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 13 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--a" +| <body> + +#data +<script><!--< +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 13 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<" +| <body> + +#data +<script><!--<a +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<a" +| <body> + +#data +<script><!--</ +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--</" +| <body> + +#data +<script><!--</script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 20 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--</script" +| <body> + +#data +<script><!--</script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 21 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--" +| <body> + +#data +<script><!--<s +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<s" +| <body> + +#data +<script><!--<script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 19 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script" +| <body> + +#data +<script><!--<script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 20 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script " +| <body> + +#data +<script><!--<script < +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 21 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script <" +| <body> + +#data +<script><!--<script <a +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 22 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script <a" +| <body> + +#data +<script><!--<script </ +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 22 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </" +| <body> + +#data +<script><!--<script </s +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 23 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </s" +| <body> + +#data +<script><!--<script </script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script" +| <body> + +#data +<script><!--<script </scripta +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </scripta" +| <body> + +#data +<script><!--<script </script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<script><!--<script </script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script>" +| <body> + +#data +<script><!--<script </script/ +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script/" +| <body> + +#data +<script><!--<script </script < +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 30 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script <" +| <body> + +#data +<script><!--<script </script <a +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script <a" +| <body> + +#data +<script><!--<script </script </ +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script </" +| <body> + +#data +<script><!--<script </script </script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script </script" +| <body> + +#data +<script><!--<script </script </script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<script><!--<script </script </script/ +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<script><!--<script </script </script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<script><!--<script - +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 21 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script -" +| <body> + +#data +<script><!--<script -a +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 22 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script -a" +| <body> + +#data +<script><!--<script -- +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 22 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script --" +| <body> + +#data +<script><!--<script --a +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 23 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script --a" +| <body> + +#data +<script><!--<script --> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 23 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<script><!--<script -->< +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 24 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script --><" +| <body> + +#data +<script><!--<script --></ +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 25 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script --></" +| <body> + +#data +<script><!--<script --></script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script --></script" +| <body> + +#data +<script><!--<script --></script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 32 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<script><!--<script --></script/ +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 32 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<script><!--<script --></script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<script><!--<script><\/script>--></script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script><\/script>-->" +| <body> + +#data +<script><!--<script></scr'+'ipt>--></script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script></scr'+'ipt>-->" +| <body> + +#data +<script><!--<script></script><script></script></script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>" +| <body> + +#data +<script><!--<script></script><script></script>--><!--</script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>--><!--" +| <body> + +#data +<script><!--<script></script><script></script>-- ></script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>-- >" +| <body> + +#data +<script><!--<script></script><script></script>- -></script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>- ->" +| <body> + +#data +<script><!--<script></script><script></script>- - ></script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>- - >" +| <body> + +#data +<script><!--<script></script><script></script>-></script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>->" +| <body> + +#data +<script><!--<script>--!></script>X +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 34 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script>--!></script>X" +| <body> + +#data +<script><!--<scr'+'ipt></script>--></script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 44 Unexpected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<scr'+'ipt>" +| <body> +| "-->" + +#data +<script><!--<script></scr'+'ipt></script>X +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 42 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script></scr'+'ipt></script>X" +| <body> + +#data +<style><!--<style></style>--></style> +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +Line: 1 Col: 37 Unexpected end tag (style). +#document +| <html> +| <head> +| <style> +| "<!--<style>" +| <body> +| "-->" + +#data +<style><!--</style>X +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +#document +| <html> +| <head> +| <style> +| "<!--" +| <body> +| "X" + +#data +<style><!--...</style>...--></style> +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +Line: 1 Col: 36 Unexpected end tag (style). +#document +| <html> +| <head> +| <style> +| "<!--..." +| <body> +| "...-->" + +#data +<style><!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style></style>X +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +#document +| <html> +| <head> +| <style> +| "<!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style>" +| <body> +| "X" + +#data +<style><!--...<style><!--...--!></style>--></style> +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +Line: 1 Col: 51 Unexpected end tag (style). +#document +| <html> +| <head> +| <style> +| "<!--...<style><!--...--!>" +| <body> +| "-->" + +#data +<style><!--...</style><!-- --><style>@import ...</style> +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +#document +| <html> +| <head> +| <style> +| "<!--..." +| <!-- --> +| <style> +| "@import ..." +| <body> + +#data +<style>...<style><!--...</style><!-- --></style> +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +Line: 1 Col: 48 Unexpected end tag (style). +#document +| <html> +| <head> +| <style> +| "...<style><!--..." +| <!-- --> +| <body> + +#data +<style>...<!--[if IE]><style>...</style>X +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +#document +| <html> +| <head> +| <style> +| "...<!--[if IE]><style>..." +| <body> +| "X" + +#data +<title><!--<title>--> +#errors +Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. +Line: 1 Col: 37 Unexpected end tag (title). +#document +| +| +| +| "<!--<title>" +| <body> +| "-->" + +#data +<title></title> +#errors +Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. +#document +| +| +| +| "" +| + +#data +foo/title><link></head><body>X +#errors +Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. +Line: 1 Col: 37 Unexpected end of file. Expected end tag (title). +#document +| <html> +| <head> +| <title> +| "foo/title><link></head><body>X" +| <body> + +#data +<noscript><!--<noscript></noscript>--></noscript> +#errors +Line: 1 Col: 10 Unexpected start tag (noscript). Expected DOCTYPE. +Line: 1 Col: 49 Unexpected end tag (noscript). +#document +| <html> +| <head> +| <noscript> +| "<!--<noscript>" +| <body> +| "-->" + +#data +<noscript><!--</noscript>X<noscript>--></noscript> +#errors +Line: 1 Col: 10 Unexpected start tag (noscript). Expected DOCTYPE. +#document +| <html> +| <head> +| <noscript> +| "<!--" +| <body> +| "X" +| <noscript> +| "-->" + +#data +<noscript><iframe></noscript>X +#errors +Line: 1 Col: 10 Unexpected start tag (noscript). Expected DOCTYPE. +#document +| <html> +| <head> +| <noscript> +| "<iframe>" +| <body> +| "X" + +#data +<noframes><!--<noframes></noframes>--></noframes> +#errors +Line: 1 Col: 10 Unexpected start tag (noframes). Expected DOCTYPE. +Line: 1 Col: 49 Unexpected end tag (noframes). +#document +| <html> +| <head> +| <noframes> +| "<!--<noframes>" +| <body> +| "-->" + +#data +<noframes><body><script><!--...</script></body></noframes></html> +#errors +Line: 1 Col: 10 Unexpected start tag (noframes). Expected DOCTYPE. +#document +| <html> +| <head> +| <noframes> +| "<body><script><!--...</script></body>" +| <body> + +#data +<textarea><!--<textarea></textarea>--></textarea> +#errors +Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. +Line: 1 Col: 49 Unexpected end tag (textarea). +#document +| <html> +| <head> +| <body> +| <textarea> +| "<!--<textarea>" +| "-->" + +#data +<textarea></textarea></textarea> +#errors +Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| <textarea> +| "</textarea>" + +#data +<iframe><!--<iframe></iframe>--></iframe> +#errors +Line: 1 Col: 8 Unexpected start tag (iframe). Expected DOCTYPE. +Line: 1 Col: 41 Unexpected end tag (iframe). +#document +| <html> +| <head> +| <body> +| <iframe> +| "<!--<iframe>" +| "-->" + +#data +<iframe>...<!--X->...<!--/X->...</iframe> +#errors +Line: 1 Col: 8 Unexpected start tag (iframe). Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| <iframe> +| "...<!--X->...<!--/X->..." + +#data +<xmp><!--<xmp></xmp>--></xmp> +#errors +Line: 1 Col: 5 Unexpected start tag (xmp). Expected DOCTYPE. +Line: 1 Col: 29 Unexpected end tag (xmp). +#document +| <html> +| <head> +| <body> +| <xmp> +| "<!--<xmp>" +| "-->" + +#data +<noembed><!--<noembed></noembed>--></noembed> +#errors +Line: 1 Col: 9 Unexpected start tag (noembed). Expected DOCTYPE. +Line: 1 Col: 45 Unexpected end tag (noembed). +#document +| <html> +| <head> +| <body> +| <noembed> +| "<!--<noembed>" +| "-->" + +#data +<!doctype html><table> + +#errors +Line 2 Col 0 Unexpected end of file. Expected table content. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| " +" + +#data +<!doctype html><table><td><span><font></span><span> +#errors +Line 1 Col 26 Unexpected table cell start tag (td) in the table body phase. +Line 1 Col 45 Unexpected end tag (span). +Line 1 Col 51 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <span> +| <font> +| <font> +| <span> + +#data +<!doctype html><form><table></form><form></table></form> +#errors +35: Stray end tag “form”. +41: Start tag “form” seen in “table”. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <form> +| <table> +| <form> diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests17.dat b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests17.dat new file mode 100644 index 0000000..7b555f8 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests17.dat @@ -0,0 +1,153 @@ +#data +<!doctype html><table><tbody><select><tr> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <table> +| <tbody> +| <tr> + +#data +<!doctype html><table><tr><select><td> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <table> +| <tbody> +| <tr> +| <td> + +#data +<!doctype html><table><tr><td><select><td> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <select> +| <td> + +#data +<!doctype html><table><tr><th><select><td> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <th> +| <select> +| <td> + +#data +<!doctype html><table><caption><select><tr> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <caption> +| <select> +| <tbody> +| <tr> + +#data +<!doctype html><select><tr> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><select><td> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><select><th> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><select><tbody> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><select><thead> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><select><tfoot> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><select><caption> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><table><tr></table>a +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| "a" diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests18.dat b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests18.dat new file mode 100644 index 0000000..680e1f0 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests18.dat @@ -0,0 +1,269 @@ +#data +<!doctype html><plaintext></plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <plaintext> +| "</plaintext>" + +#data +<!doctype html><table><plaintext></plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <plaintext> +| "</plaintext>" +| <table> + +#data +<!doctype html><table><tbody><plaintext></plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <plaintext> +| "</plaintext>" +| <table> +| <tbody> + +#data +<!doctype html><table><tbody><tr><plaintext></plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <plaintext> +| "</plaintext>" +| <table> +| <tbody> +| <tr> + +#data +<!doctype html><table><tbody><tr><plaintext></plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <plaintext> +| "</plaintext>" +| <table> +| <tbody> +| <tr> + +#data +<!doctype html><table><td><plaintext></plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <plaintext> +| "</plaintext>" + +#data +<!doctype html><table><caption><plaintext></plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <caption> +| <plaintext> +| "</plaintext>" + +#data +<!doctype html><table><tr><style></script></style>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "abc" +| <table> +| <tbody> +| <tr> +| <style> +| "</script>" + +#data +<!doctype html><table><tr><script></style></script>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "abc" +| <table> +| <tbody> +| <tr> +| <script> +| "</style>" + +#data +<!doctype html><table><caption><style></script></style>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <caption> +| <style> +| "</script>" +| "abc" + +#data +<!doctype html><table><td><style></script></style>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <style> +| "</script>" +| "abc" + +#data +<!doctype html><select><script></style></script>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <script> +| "</style>" +| "abc" + +#data +<!doctype html><table><select><script></style></script>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <script> +| "</style>" +| "abc" +| <table> + +#data +<!doctype html><table><tr><select><script></style></script>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <script> +| "</style>" +| "abc" +| <table> +| <tbody> +| <tr> + +#data +<!doctype html><frameset></frameset><noframes>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <noframes> +| "abc" + +#data +<!doctype html><frameset></frameset><noframes>abc</noframes><!--abc--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <noframes> +| "abc" +| <!-- abc --> + +#data +<!doctype html><frameset></frameset></html><noframes>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <noframes> +| "abc" + +#data +<!doctype html><frameset></frameset></html><noframes>abc</noframes><!--abc--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <noframes> +| "abc" +| <!-- abc --> + +#data +<!doctype html><table><tr></tbody><tfoot> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <tfoot> + +#data +<!doctype html><table><td><svg></svg>abc<td> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <svg svg> +| "abc" +| <td> diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests19.dat b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests19.dat new file mode 100644 index 0000000..0d62f5a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests19.dat @@ -0,0 +1,1237 @@ +#data +<!doctype html><math><mn DefinitionUrl="foo"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <math math> +| <math mn> +| definitionURL="foo" + +#data +<!doctype html><html></p><!--foo--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <!-- foo --> +| <head> +| <body> + +#data +<!doctype html><head></head></p><!--foo--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <!-- foo --> +| <body> + +#data +<!doctype html><body><p><pre> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <pre> + +#data +<!doctype html><body><p><listing> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <listing> + +#data +<!doctype html><p><plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <plaintext> + +#data +<!doctype html><p><h1> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <h1> + +#data +<!doctype html><form><isindex> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <form> + +#data +<!doctype html><isindex action="POST"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <form> +| action="POST" +| <hr> +| <label> +| "This is a searchable index. Enter search keywords: " +| <input> +| name="isindex" +| <hr> + +#data +<!doctype html><isindex prompt="this is isindex"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <form> +| <hr> +| <label> +| "this is isindex" +| <input> +| name="isindex" +| <hr> + +#data +<!doctype html><isindex type="hidden"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <form> +| <hr> +| <label> +| "This is a searchable index. Enter search keywords: " +| <input> +| name="isindex" +| type="hidden" +| <hr> + +#data +<!doctype html><isindex name="foo"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <form> +| <hr> +| <label> +| "This is a searchable index. Enter search keywords: " +| <input> +| name="isindex" +| <hr> + +#data +<!doctype html><ruby><p><rp> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <ruby> +| <p> +| <rp> + +#data +<!doctype html><ruby><div><span><rp> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <ruby> +| <div> +| <span> +| <rp> + +#data +<!doctype html><ruby><div><p><rp> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <ruby> +| <div> +| <p> +| <rp> + +#data +<!doctype html><ruby><p><rt> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <ruby> +| <p> +| <rt> + +#data +<!doctype html><ruby><div><span><rt> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <ruby> +| <div> +| <span> +| <rt> + +#data +<!doctype html><ruby><div><p><rt> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <ruby> +| <div> +| <p> +| <rt> + +#data +<!doctype html><math/><foo> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <math math> +| <foo> + +#data +<!doctype html><svg/><foo> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <svg svg> +| <foo> + +#data +<!doctype html><div></body><!--foo--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <div> +| <!-- foo --> + +#data +<!doctype html><h1><div><h3><span></h1>foo +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <h1> +| <div> +| <h3> +| <span> +| "foo" + +#data +<!doctype html><p></h3>foo +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| "foo" + +#data +<!doctype html><h3><li>abc</h2>foo +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <h3> +| <li> +| "abc" +| "foo" + +#data +<!doctype html><table>abc<!--foo--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "abc" +| <table> +| <!-- foo --> + +#data +<!doctype html><table> <!--foo--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| " " +| <!-- foo --> + +#data +<!doctype html><table> b <!--foo--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| " b " +| <table> +| <!-- foo --> + +#data +<!doctype html><select><option><option> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <option> +| <option> + +#data +<!doctype html><select><option></optgroup> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <option> + +#data +<!doctype html><select><option></optgroup> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <option> + +#data +<!doctype html><p><math><mi><p><h1> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| <math mi> +| <p> +| <h1> + +#data +<!doctype html><p><math><mo><p><h1> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| <math mo> +| <p> +| <h1> + +#data +<!doctype html><p><math><mn><p><h1> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| <math mn> +| <p> +| <h1> + +#data +<!doctype html><p><math><ms><p><h1> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| <math ms> +| <p> +| <h1> + +#data +<!doctype html><p><math><mtext><p><h1> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| <math mtext> +| <p> +| <h1> + +#data +<!doctype html><frameset></noframes> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!doctype html><html c=d><body></html><html a=b> +#errors +#document +| <!DOCTYPE html> +| <html> +| a="b" +| c="d" +| <head> +| <body> + +#data +<!doctype html><html c=d><frameset></frameset></html><html a=b> +#errors +#document +| <!DOCTYPE html> +| <html> +| a="b" +| c="d" +| <head> +| <frameset> + +#data +<!doctype html><html><frameset></frameset></html><!--foo--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <!-- foo --> + +#data +<!doctype html><html><frameset></frameset></html> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| " " + +#data +<!doctype html><html><frameset></frameset></html>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!doctype html><html><frameset></frameset></html><p> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!doctype html><html><frameset></frameset></html></p> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<html><frameset></frameset></html><!doctype html> +#errors +#document +| <html> +| <head> +| <frameset> + +#data +<!doctype html><body><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> + +#data +<!doctype html><p><frameset><frame> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <frame> + +#data +<!doctype html><p>a<frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| "a" + +#data +<!doctype html><p> <frameset><frame> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <frame> + +#data +<!doctype html><pre><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <pre> + +#data +<!doctype html><listing><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <listing> + +#data +<!doctype html><li><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <li> + +#data +<!doctype html><dd><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <dd> + +#data +<!doctype html><dt><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <dt> + +#data +<!doctype html><button><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <button> + +#data +<!doctype html><applet><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <applet> + +#data +<!doctype html><marquee><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <marquee> + +#data +<!doctype html><object><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <object> + +#data +<!doctype html><table><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> + +#data +<!doctype html><area><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <area> + +#data +<!doctype html><basefont><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <basefont> +| <frameset> + +#data +<!doctype html><bgsound><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <bgsound> +| <frameset> + +#data +<!doctype html><br><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <br> + +#data +<!doctype html><embed><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <embed> + +#data +<!doctype html><img><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <img> + +#data +<!doctype html><input><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <input> + +#data +<!doctype html><keygen><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <keygen> + +#data +<!doctype html><wbr><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <wbr> + +#data +<!doctype html><hr><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <hr> + +#data +<!doctype html><textarea></textarea><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <textarea> + +#data +<!doctype html><xmp></xmp><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <xmp> + +#data +<!doctype html><iframe></iframe><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <iframe> + +#data +<!doctype html><select></select><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><svg></svg><frameset><frame> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <frame> + +#data +<!doctype html><math></math><frameset><frame> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <frame> + +#data +<!doctype html><svg><foreignObject><div> <frameset><frame> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <frame> + +#data +<!doctype html><svg>a</svg><frameset><frame> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <svg svg> +| "a" + +#data +<!doctype html><svg> </svg><frameset><frame> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <frame> + +#data +<html>aaa<frameset></frameset> +#errors +#document +| <html> +| <head> +| <body> +| "aaa" + +#data +<html> a <frameset></frameset> +#errors +#document +| <html> +| <head> +| <body> +| "a " + +#data +<!doctype html><div><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!doctype html><div><body><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <div> + +#data +<!doctype html><p><math></p>a +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| "a" + +#data +<!doctype html><p><math><mn><span></p>a +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| <math mn> +| <span> +| <p> +| "a" + +#data +<!doctype html><math></html> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <math math> + +#data +<!doctype html><meta charset="ascii"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <meta> +| charset="ascii" +| <body> + +#data +<!doctype html><meta http-equiv="content-type" content="text/html;charset=ascii"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <meta> +| content="text/html;charset=ascii" +| http-equiv="content-type" +| <body> + +#data +<!doctype html><head><!--aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa--><meta charset="utf8"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <!-- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa --> +| <meta> +| charset="utf8" +| <body> + +#data +<!doctype html><html a=b><head></head><html c=d> +#errors +#document +| <!DOCTYPE html> +| <html> +| a="b" +| c="d" +| <head> +| <body> + +#data +<!doctype html><image/> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <img> + +#data +<!doctype html>a<i>b<table>c<b>d</i>e</b>f +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "a" +| <i> +| "bc" +| <b> +| "de" +| "f" +| <table> + +#data +<!doctype html><table><i>a<b>b<div>c<a>d</i>e</b>f +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <i> +| "a" +| <b> +| "b" +| <b> +| <div> +| <b> +| <i> +| "c" +| <a> +| "d" +| <a> +| "e" +| <a> +| "f" +| <table> + +#data +<!doctype html><i>a<b>b<div>c<a>d</i>e</b>f +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <i> +| "a" +| <b> +| "b" +| <b> +| <div> +| <b> +| <i> +| "c" +| <a> +| "d" +| <a> +| "e" +| <a> +| "f" + +#data +<!doctype html><table><i>a<b>b<div>c</i> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <i> +| "a" +| <b> +| "b" +| <b> +| <div> +| <i> +| "c" +| <table> + +#data +<!doctype html><table><i>a<b>b<div>c<a>d</i>e</b>f +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <i> +| "a" +| <b> +| "b" +| <b> +| <div> +| <b> +| <i> +| "c" +| <a> +| "d" +| <a> +| "e" +| <a> +| "f" +| <table> + +#data +<!doctype html><table><i>a<div>b<tr>c<b>d</i>e +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <i> +| "a" +| <div> +| "b" +| <i> +| "c" +| <b> +| "d" +| <b> +| "e" +| <table> +| <tbody> +| <tr> + +#data +<!doctype html><table><td><table><i>a<div>b<b>c</i>d +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <i> +| "a" +| <div> +| <i> +| "b" +| <b> +| "c" +| <b> +| "d" +| <table> + +#data +<!doctype html><body><bgsound> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <bgsound> + +#data +<!doctype html><body><basefont> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <basefont> + +#data +<!doctype html><a><b></a><basefont> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <a> +| <b> +| <basefont> + +#data +<!doctype html><a><b></a><bgsound> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <a> +| <b> +| <bgsound> + +#data +<!doctype html><figcaption><article></figcaption>a +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <figcaption> +| <article> +| "a" + +#data +<!doctype html><summary><article></summary>a +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <summary> +| <article> +| "a" + +#data +<!doctype html><p><a><plaintext>b +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <a> +| <plaintext> +| <a> +| "b" + +#data +<!DOCTYPE html><div>a<a></div>b<p>c</p>d +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <div> +| "a" +| <a> +| <a> +| "b" +| <p> +| "c" +| "d" diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests2.dat b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests2.dat new file mode 100644 index 0000000..60d8592 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/html/testdata/webkit/tests2.dat @@ -0,0 +1,763 @@ +#data +<!DOCTYPE html>Test +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "Test" + +#data +<textarea>test</div>test +#errors +Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. +Line: 1 Col: 24 Expected closing tag. Unexpected end of file. +#document +| <html> +| <head> +| <body> +| <textarea> +| "test</div>test" + +#data +<table><td> +#errors +Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. +Line: 1 Col: 11 Unexpected table cell start tag (td) in the table body phase. +Line: 1 Col: 11 Expected closing tag. Unexpected end of file. +#document +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> + +#data +<table><td>test</tbody></table> +#errors +Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. +Line: 1 Col: 11 Unexpected table cell start tag (td) in the table body phase. +#document +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| "test" + +#data +<frame>test +#errors +Line: 1 Col: 7 Unexpected start tag (frame). Expected DOCTYPE. +Line: 1 Col: 7 Unexpected start tag frame. Ignored. +#document +| <html> +| <head> +| <body> +| "test" + +#data +<!DOCTYPE html><frameset>test +#errors +Line: 1 Col: 29 Unepxected characters in the frameset phase. Characters ignored. +Line: 1 Col: 29 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!DOCTYPE html><frameset><!DOCTYPE html> +#errors +Line: 1 Col: 40 Unexpected DOCTYPE. Ignored. +Line: 1 Col: 40 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!DOCTYPE html><font><p><b>test</font> +#errors +Line: 1 Col: 38 End tag (font) violates step 1, paragraph 3 of the adoption agency algorithm. +Line: 1 Col: 38 End tag (font) violates step 1, paragraph 3 of the adoption agency algorithm. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <font> +| <p> +| <font> +| <b> +| "test" + +#data +<!DOCTYPE html><dt><div><dd> +#errors +Line: 1 Col: 28 Missing end tag (div, dt). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <dt> +| <div> +| <dd> + +#data +<script></x +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</x" +| <body> + +#data +<table><plaintext><td> +#errors +Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. +Line: 1 Col: 18 Unexpected start tag (plaintext) in table context caused voodoo mode. +Line: 1 Col: 22 Unexpected end of file. Expected table content. +#document +| <html> +| <head> +| <body> +| <plaintext> +| "<td>" +| <table> + +#data +<plaintext></plaintext> +#errors +Line: 1 Col: 11 Unexpected start tag (plaintext). Expected DOCTYPE. +Line: 1 Col: 23 Expected closing tag. Unexpected end of file. +#document +| <html> +| <head> +| <body> +| <plaintext> +| "</plaintext>" + +#data +<!DOCTYPE html><table><tr>TEST +#errors +Line: 1 Col: 30 Unexpected non-space characters in table context caused voodoo mode. +Line: 1 Col: 30 Unexpected end of file. Expected table content. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "TEST" +| <table> +| <tbody> +| <tr> + +#data +<!DOCTYPE html><body t1=1><body t2=2><body t3=3 t4=4> +#errors +Line: 1 Col: 37 Unexpected start tag (body). +Line: 1 Col: 53 Unexpected start tag (body). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| t1="1" +| t2="2" +| t3="3" +| t4="4" + +#data +</b test +#errors +Line: 1 Col: 8 Unexpected end of file in attribute name. +Line: 1 Col: 8 End tag contains unexpected attributes. +Line: 1 Col: 8 Unexpected end tag (b). Expected DOCTYPE. +Line: 1 Col: 8 Unexpected end tag (b) after the (implied) root element. +#document +| <html> +| <head> +| <body> + +#data +<!DOCTYPE html></b test<b &=&>X +#errors +Line: 1 Col: 32 Named entity didn't end with ';'. +Line: 1 Col: 33 End tag contains unexpected attributes. +Line: 1 Col: 33 Unexpected end tag (b) after the (implied) root element. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "X" + +#data +<!doctypehtml><scrIPt type=text/x-foobar;baz>X</SCRipt +#errors +Line: 1 Col: 9 No space after literal string 'DOCTYPE'. +Line: 1 Col: 54 Unexpected end of file in the tag name. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| type="text/x-foobar;baz" +| "X</SCRipt" +| <body> + +#data +& +#errors +Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "&" + +#data +&# +#errors +Line: 1 Col: 1 Numeric entity expected. Got end of file instead. +Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "&#" + +#data +&#X +#errors +Line: 1 Col: 3 Numeric entity expected but none found. +Line: 1 Col: 3 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "&#X" + +#data +&#x +#errors +Line: 1 Col: 3 Numeric entity expected but none found. +Line: 1 Col: 3 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "&#x" + +#data +- +#errors +Line: 1 Col: 4 Numeric entity didn't end with ';'. +Line: 1 Col: 4 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "-" + +#data +&x-test +#errors +Line: 1 Col: 1 Named entity expected. Got none. +Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "&x-test" + +#data +<!doctypehtml><p><li> +#errors +Line: 1 Col: 9 No space after literal string 'DOCTYPE'. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <li> + +#data +<!doctypehtml><p><dt> +#errors +Line: 1 Col: 9 No space after literal string 'DOCTYPE'. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <dt> + +#data +<!doctypehtml><p><dd> +#errors +Line: 1 Col: 9 No space after literal string 'DOCTYPE'. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <dd> + +#data +<!doctypehtml><p><form> +#errors +Line: 1 Col: 9 No space after literal string 'DOCTYPE'. +Line: 1 Col: 23 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <form> + +#data +<!DOCTYPE html><p></P>X +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| "X" + +#data +& +#errors +Line: 1 Col: 4 Named entity didn't end with ';'. +Line: 1 Col: 4 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "&" + +#data +&AMp; +#errors +Line: 1 Col: 1 Named entity expected. Got none. +Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "&AMp;" + +#data +<!DOCTYPE html><html><head></head><body><thisISasillyTESTelementNameToMakeSureCrazyTagNamesArePARSEDcorrectLY> +#errors +Line: 1 Col: 110 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <thisisasillytestelementnametomakesurecrazytagnamesareparsedcorrectly> + +#data +<!DOCTYPE html>X</body>X +#errors +Line: 1 Col: 24 Unexpected non-space characters in the after body phase. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "XX" + +#data +<!DOCTYPE html><!-- X +#errors +Line: 1 Col: 21 Unexpected end of file in comment. +#document +| <!DOCTYPE html> +| <!-- X --> +| <html> +| <head> +| <body> + +#data +<!DOCTYPE html><table><caption>test TEST</caption><td>test +#errors +Line: 1 Col: 54 Unexpected table cell start tag (td) in the table body phase. +Line: 1 Col: 58 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <caption> +| "test TEST" +| <tbody> +| <tr> +| <td> +| "test" + +#data +<!DOCTYPE html><select><option><optgroup> +#errors +Line: 1 Col: 41 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <option> +| <optgroup> + +#data +<!DOCTYPE html><select><optgroup><option></optgroup><option><select><option> +#errors +Line: 1 Col: 68 Unexpected select start tag in the select phase treated as select end tag. +Line: 1 Col: 76 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <optgroup> +| <option> +| <option> +| <option> + +#data +<!DOCTYPE html><select><optgroup><option><optgroup> +#errors +Line: 1 Col: 51 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <optgroup> +| <option> +| <optgroup> + +#data +<!DOCTYPE html><datalist><option>foo</datalist>bar +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <datalist> +| <option> +| "foo" +| "bar" + +#data +<!DOCTYPE html><font><input><input></font> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <font> +| <input> +| <input> + +#data +<!DOCTYPE html><!-- XXX - XXX --> +#errors +#document +| <!DOCTYPE html> +| <!-- XXX - XXX --> +| <html> +| <head> +| <body> + +#data +<!DOCTYPE html><!-- XXX - XXX +#errors +Line: 1 Col: 29 Unexpected end of file in comment (-) +#document +| <!DOCTYPE html> +| <!-- XXX - XXX --> +| <html> +| <head> +| <body> + +#data +<!DOCTYPE html><!-- XXX - XXX - XXX --> +#errors +#document +| <!DOCTYPE html> +| <!-- XXX - XXX - XXX --> +| <html> +| <head> +| <body> + +#data +<isindex test=x name=x> +#errors +Line: 1 Col: 23 Unexpected start tag (isindex). Expected DOCTYPE. +Line: 1 Col: 23 Unexpected start tag isindex. Don't use it! +#document +| <html> +| <head> +| <body> +| <form> +| <hr> +| <label> +| "This is a searchable index. Enter search keywords: " +| <input> +| name="isindex" +| test="x" +| <hr> + +#data +test +test +#errors +Line: 2 Col: 4 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "test +test" + +#data +<!DOCTYPE html><body><title>test</body> +#errors +#document +| +| +| +| +| +| "test</body>" + +#data +<!DOCTYPE html><body><title>X +#errors +#document +| +| +| +| +| +| "X" +| <meta> +| name="z" +| <link> +| rel="foo" +| <style> +| " +x { content:"</style" } " + +#data +<!DOCTYPE html><select><optgroup></optgroup></select> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <optgroup> + +#data + + +#errors +Line: 2 Col: 1 Unexpected End of file. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> + +#data +<!DOCTYPE html> <html> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> + +#data +<!DOCTYPE html><script> +</script> <title>x +#errors +#document +| +| +| +| +#errors +Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. +Line: 1 Col: 21 Unexpected start tag (script) that can be in head. Moved. +#document +| +| +| +#errors +Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. +Line: 1 Col: 28 Unexpected start tag (style) that can be in head. Moved. +#document +| +| +| +#errors +Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. +#document +| +| +| +| +| "x" +| x +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +Line: 1 Col: 22 Unexpected end of file. Expected end tag (style). +#document +| +| +| --> x +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +#document +| +| +| x +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +#document +| +| +| x +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +#document +| +| +| x +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +#document +| +| +|

+#errors +#document +| +| +| +| +| +| ddd +#errors +#document +| +| +| +#errors +#document +| +| +| +| +|
  • +| +| ", + " +
    << Back to Go HTTP/2 demo server`) + }) +} + +func httpsHost() string { + if *hostHTTPS != "" { + return *hostHTTPS + } + if v := *httpsAddr; strings.HasPrefix(v, ":") { + return "localhost" + v + } else { + return v + } +} + +func httpHost() string { + if *hostHTTP != "" { + return *hostHTTP + } + if v := *httpAddr; strings.HasPrefix(v, ":") { + return "localhost" + v + } else { + return v + } +} + +func serveProdTLS() error { + const cacheDir = "/var/cache/autocert" + if err := os.MkdirAll(cacheDir, 0700); err != nil { + return err + } + m := autocert.Manager{ + Cache: autocert.DirCache(cacheDir), + Prompt: autocert.AcceptTOS, + HostPolicy: autocert.HostWhitelist("http2.golang.org"), + } + srv := &http.Server{ + TLSConfig: &tls.Config{ + GetCertificate: m.GetCertificate, + }, + } + http2.ConfigureServer(srv, &http2.Server{ + NewWriteScheduler: func() http2.WriteScheduler { + return http2.NewPriorityWriteScheduler(nil) + }, + }) + ln, err := net.Listen("tcp", ":443") + if err != nil { + return err + } + return srv.Serve(tls.NewListener(tcpKeepAliveListener{ln.(*net.TCPListener)}, srv.TLSConfig)) +} + +type tcpKeepAliveListener struct { + *net.TCPListener +} + +func (ln tcpKeepAliveListener) Accept() (c net.Conn, err error) { + tc, err := ln.AcceptTCP() + if err != nil { + return + } + tc.SetKeepAlive(true) + tc.SetKeepAlivePeriod(3 * time.Minute) + return tc, nil +} + +func serveProd() error { + errc := make(chan error, 2) + go func() { errc <- http.ListenAndServe(":80", nil) }() + go func() { errc <- serveProdTLS() }() + return <-errc +} + +const idleTimeout = 5 * time.Minute +const activeTimeout = 10 * time.Minute + +// TODO: put this into the standard library and actually send +// PING frames and GOAWAY, etc: golang.org/issue/14204 +func idleTimeoutHook() func(net.Conn, http.ConnState) { + var mu sync.Mutex + m := map[net.Conn]*time.Timer{} + return func(c net.Conn, cs http.ConnState) { + mu.Lock() + defer mu.Unlock() + if t, ok := m[c]; ok { + delete(m, c) + t.Stop() + } + var d time.Duration + switch cs { + case http.StateNew, http.StateIdle: + d = idleTimeout + case http.StateActive: + d = activeTimeout + default: + return + } + m[c] = time.AfterFunc(d, func() { + log.Printf("closing idle conn %v after %v", c.RemoteAddr(), d) + go c.Close() + }) + } +} + +func main() { + var srv http.Server + flag.BoolVar(&http2.VerboseLogs, "verbose", false, "Verbose HTTP/2 debugging.") + flag.Parse() + srv.Addr = *httpsAddr + srv.ConnState = idleTimeoutHook() + + registerHandlers() + + if *prod { + *hostHTTP = "http2.golang.org" + *hostHTTPS = "http2.golang.org" + log.Fatal(serveProd()) + } + + url := "https://" + httpsHost() + "/" + log.Printf("Listening on " + url) + http2.ConfigureServer(&srv, &http2.Server{}) + + if *httpAddr != "" { + go func() { + log.Printf("Listening on http://" + httpHost() + "/ (for unencrypted HTTP/1)") + log.Fatal(http.ListenAndServe(*httpAddr, nil)) + }() + } + + go func() { + log.Fatal(srv.ListenAndServeTLS("server.crt", "server.key")) + }() + select {} +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2demo/launch.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2demo/launch.go new file mode 100644 index 0000000..df0866a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2demo/launch.go @@ -0,0 +1,302 @@ +// 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. + +// +build ignore + +package main + +import ( + "bufio" + "bytes" + "encoding/json" + "flag" + "fmt" + "io" + "io/ioutil" + "log" + "net/http" + "os" + "strings" + "time" + + "golang.org/x/oauth2" + "golang.org/x/oauth2/google" + compute "google.golang.org/api/compute/v1" +) + +var ( + proj = flag.String("project", "symbolic-datum-552", "name of Project") + zone = flag.String("zone", "us-central1-a", "GCE zone") + mach = flag.String("machinetype", "n1-standard-1", "Machine type") + instName = flag.String("instance_name", "http2-demo", "Name of VM instance.") + sshPub = flag.String("ssh_public_key", "", "ssh public key file to authorize. Can modify later in Google's web UI anyway.") + staticIP = flag.String("static_ip", "130.211.116.44", "Static IP to use. If empty, automatic.") + + writeObject = flag.String("write_object", "", "If non-empty, a VM isn't created and the flag value is Google Cloud Storage bucket/object to write. The contents from stdin.") + publicObject = flag.Bool("write_object_is_public", false, "Whether the object created by --write_object should be public.") +) + +func readFile(v string) string { + slurp, err := ioutil.ReadFile(v) + if err != nil { + log.Fatalf("Error reading %s: %v", v, err) + } + return strings.TrimSpace(string(slurp)) +} + +var config = &oauth2.Config{ + // The client-id and secret should be for an "Installed Application" when using + // the CLI. Later we'll use a web application with a callback. + ClientID: readFile("client-id.dat"), + ClientSecret: readFile("client-secret.dat"), + Endpoint: google.Endpoint, + Scopes: []string{ + compute.DevstorageFullControlScope, + compute.ComputeScope, + "https://www.googleapis.com/auth/sqlservice", + "https://www.googleapis.com/auth/sqlservice.admin", + }, + RedirectURL: "urn:ietf:wg:oauth:2.0:oob", +} + +const baseConfig = `#cloud-config +coreos: + units: + - name: h2demo.service + command: start + content: | + [Unit] + Description=HTTP2 Demo + + [Service] + ExecStartPre=/bin/bash -c 'mkdir -p /opt/bin && curl -s -o /opt/bin/h2demo http://storage.googleapis.com/http2-demo-server-tls/h2demo && chmod +x /opt/bin/h2demo' + ExecStart=/opt/bin/h2demo --prod + RestartSec=5s + Restart=always + Type=simple + + [Install] + WantedBy=multi-user.target +` + +func main() { + flag.Parse() + if *proj == "" { + log.Fatalf("Missing --project flag") + } + prefix := "https://www.googleapis.com/compute/v1/projects/" + *proj + machType := prefix + "/zones/" + *zone + "/machineTypes/" + *mach + + const tokenFileName = "token.dat" + tokenFile := tokenCacheFile(tokenFileName) + tokenSource := oauth2.ReuseTokenSource(nil, tokenFile) + token, err := tokenSource.Token() + if err != nil { + if *writeObject != "" { + log.Fatalf("Can't use --write_object without a valid token.dat file already cached.") + } + log.Printf("Error getting token from %s: %v", tokenFileName, err) + log.Printf("Get auth code from %v", config.AuthCodeURL("my-state")) + fmt.Print("\nEnter auth code: ") + sc := bufio.NewScanner(os.Stdin) + sc.Scan() + authCode := strings.TrimSpace(sc.Text()) + token, err = config.Exchange(oauth2.NoContext, authCode) + if err != nil { + log.Fatalf("Error exchanging auth code for a token: %v", err) + } + if err := tokenFile.WriteToken(token); err != nil { + log.Fatalf("Error writing to %s: %v", tokenFileName, err) + } + tokenSource = oauth2.ReuseTokenSource(token, nil) + } + + oauthClient := oauth2.NewClient(oauth2.NoContext, tokenSource) + + if *writeObject != "" { + writeCloudStorageObject(oauthClient) + return + } + + computeService, _ := compute.New(oauthClient) + + natIP := *staticIP + if natIP == "" { + // Try to find it by name. + aggAddrList, err := computeService.Addresses.AggregatedList(*proj).Do() + if err != nil { + log.Fatal(err) + } + // http://godoc.org/code.google.com/p/google-api-go-client/compute/v1#AddressAggregatedList + IPLoop: + for _, asl := range aggAddrList.Items { + for _, addr := range asl.Addresses { + if addr.Name == *instName+"-ip" && addr.Status == "RESERVED" { + natIP = addr.Address + break IPLoop + } + } + } + } + + cloudConfig := baseConfig + if *sshPub != "" { + key := strings.TrimSpace(readFile(*sshPub)) + cloudConfig += fmt.Sprintf("\nssh_authorized_keys:\n - %s\n", key) + } + if os.Getenv("USER") == "bradfitz" { + cloudConfig += fmt.Sprintf("\nssh_authorized_keys:\n - %s\n", "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAwks9dwWKlRC+73gRbvYtVg0vdCwDSuIlyt4z6xa/YU/jTDynM4R4W10hm2tPjy8iR1k8XhDv4/qdxe6m07NjG/By1tkmGpm1mGwho4Pr5kbAAy/Qg+NLCSdAYnnE00FQEcFOC15GFVMOW2AzDGKisReohwH9eIzHPzdYQNPRWXE= bradfitz@papag.bradfitz.com") + } + const maxCloudConfig = 32 << 10 // per compute API docs + if len(cloudConfig) > maxCloudConfig { + log.Fatalf("cloud config length of %d bytes is over %d byte limit", len(cloudConfig), maxCloudConfig) + } + + instance := &compute.Instance{ + Name: *instName, + Description: "Go Builder", + MachineType: machType, + Disks: []*compute.AttachedDisk{instanceDisk(computeService)}, + Tags: &compute.Tags{ + Items: []string{"http-server", "https-server"}, + }, + Metadata: &compute.Metadata{ + Items: []*compute.MetadataItems{ + { + Key: "user-data", + Value: &cloudConfig, + }, + }, + }, + NetworkInterfaces: []*compute.NetworkInterface{ + { + AccessConfigs: []*compute.AccessConfig{ + { + Type: "ONE_TO_ONE_NAT", + Name: "External NAT", + NatIP: natIP, + }, + }, + Network: prefix + "/global/networks/default", + }, + }, + ServiceAccounts: []*compute.ServiceAccount{ + { + Email: "default", + Scopes: []string{ + compute.DevstorageFullControlScope, + compute.ComputeScope, + }, + }, + }, + } + + log.Printf("Creating instance...") + op, err := computeService.Instances.Insert(*proj, *zone, instance).Do() + if err != nil { + log.Fatalf("Failed to create instance: %v", err) + } + opName := op.Name + log.Printf("Created. Waiting on operation %v", opName) +OpLoop: + for { + time.Sleep(2 * time.Second) + op, err := computeService.ZoneOperations.Get(*proj, *zone, opName).Do() + if err != nil { + log.Fatalf("Failed to get op %s: %v", opName, err) + } + switch op.Status { + case "PENDING", "RUNNING": + log.Printf("Waiting on operation %v", opName) + continue + case "DONE": + if op.Error != nil { + for _, operr := range op.Error.Errors { + log.Printf("Error: %+v", operr) + } + log.Fatalf("Failed to start.") + } + log.Printf("Success. %+v", op) + break OpLoop + default: + log.Fatalf("Unknown status %q: %+v", op.Status, op) + } + } + + inst, err := computeService.Instances.Get(*proj, *zone, *instName).Do() + if err != nil { + log.Fatalf("Error getting instance after creation: %v", err) + } + ij, _ := json.MarshalIndent(inst, "", " ") + log.Printf("Instance: %s", ij) +} + +func instanceDisk(svc *compute.Service) *compute.AttachedDisk { + const imageURL = "https://www.googleapis.com/compute/v1/projects/coreos-cloud/global/images/coreos-stable-444-5-0-v20141016" + diskName := *instName + "-disk" + + return &compute.AttachedDisk{ + AutoDelete: true, + Boot: true, + Type: "PERSISTENT", + InitializeParams: &compute.AttachedDiskInitializeParams{ + DiskName: diskName, + SourceImage: imageURL, + DiskSizeGb: 50, + }, + } +} + +func writeCloudStorageObject(httpClient *http.Client) { + content := os.Stdin + const maxSlurp = 1 << 20 + var buf bytes.Buffer + n, err := io.CopyN(&buf, content, maxSlurp) + if err != nil && err != io.EOF { + log.Fatalf("Error reading from stdin: %v, %v", n, err) + } + contentType := http.DetectContentType(buf.Bytes()) + + req, err := http.NewRequest("PUT", "https://storage.googleapis.com/"+*writeObject, io.MultiReader(&buf, content)) + if err != nil { + log.Fatal(err) + } + req.Header.Set("x-goog-api-version", "2") + if *publicObject { + req.Header.Set("x-goog-acl", "public-read") + } + req.Header.Set("Content-Type", contentType) + res, err := httpClient.Do(req) + if err != nil { + log.Fatal(err) + } + if res.StatusCode != 200 { + res.Write(os.Stderr) + log.Fatalf("Failed.") + } + log.Printf("Success.") + os.Exit(0) +} + +type tokenCacheFile string + +func (f tokenCacheFile) Token() (*oauth2.Token, error) { + slurp, err := ioutil.ReadFile(string(f)) + if err != nil { + return nil, err + } + t := new(oauth2.Token) + if err := json.Unmarshal(slurp, t); err != nil { + return nil, err + } + return t, nil +} + +func (f tokenCacheFile) WriteToken(t *oauth2.Token) error { + jt, err := json.Marshal(t) + if err != nil { + return err + } + return ioutil.WriteFile(string(f), jt, 0600) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2demo/rootCA.key b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2demo/rootCA.key new file mode 100644 index 0000000..a15a6ab --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2demo/rootCA.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAt5fAjp4fTcekWUTfzsp0kyih1OYbsGL0KX1eRbSSR8Od0+9Q +62Hyny+GFwMTb4A/KU8mssoHvcceSAAbwfbxFK/+s51TobqUnORZrOoTZjkUygby +XDSK99YBbcR1Pip8vwMTm4XKuLtCigeBBdjjAQdgUO28LENGlsMnmeYkJfODVGnV +mr5Ltb9ANA8IKyTfsnHJ4iOCS/PlPbUj2q7YnoVLposUBMlgUb/CykX3mOoLb4yJ +JQyA/iST6ZxiIEj36D4yWZ5lg7YJl+UiiBQHGCnPdGyipqV06ex0heYWcaiW8LWZ +SUQ93jQ+WVCH8hT7DQO1dmsvUmXlq/JeAlwQ/QIDAQABAoIBAFFHV7JMAqPWnMYA +nezY6J81v9+XN+7xABNWM2Q8uv4WdksbigGLTXR3/680Z2hXqJ7LMeC5XJACFT/e +/Gr0vmpgOCygnCPfjGehGKpavtfksXV3edikUlnCXsOP1C//c1bFL+sMYmFCVgTx +qYdDK8yKzXNGrKYT6q5YG7IglyRNV1rsQa8lM/5taFYiD1Ck/3tQi3YIq8Lcuser +hrxsMABcQ6mi+EIvG6Xr4mfJug0dGJMHG4RG1UGFQn6RXrQq2+q53fC8ZbVUSi0j +NQ918aKFzktwv+DouKU0ME4I9toks03gM860bAL7zCbKGmwR3hfgX/TqzVCWpG9E +LDVfvekCgYEA8fk9N53jbBRmULUGEf4qWypcLGiZnNU0OeXWpbPV9aa3H0VDytA7 +8fCN2dPAVDPqlthMDdVe983NCNwp2Yo8ZimDgowyIAKhdC25s1kejuaiH9OAPj3c +0f8KbriYX4n8zNHxFwK6Ae3pQ6EqOLJVCUsziUaZX9nyKY5aZlyX6xcCgYEAwjws +K62PjC64U5wYddNLp+kNdJ4edx+a7qBb3mEgPvSFT2RO3/xafJyG8kQB30Mfstjd +bRxyUV6N0vtX1zA7VQtRUAvfGCecpMo+VQZzcHXKzoRTnQ7eZg4Lmj5fQ9tOAKAo +QCVBoSW/DI4PZL26CAMDcAba4Pa22ooLapoRIQsCgYA6pIfkkbxLNkpxpt2YwLtt +Kr/590O7UaR9n6k8sW/aQBRDXNsILR1KDl2ifAIxpf9lnXgZJiwE7HiTfCAcW7c1 +nzwDCI0hWuHcMTS/NYsFYPnLsstyyjVZI3FY0h4DkYKV9Q9z3zJLQ2hz/nwoD3gy +b2pHC7giFcTts1VPV4Nt8wKBgHeFn4ihHJweg76vZz3Z78w7VNRWGFklUalVdDK7 +gaQ7w2y/ROn/146mo0OhJaXFIFRlrpvdzVrU3GDf2YXJYDlM5ZRkObwbZADjksev +WInzcgDy3KDg7WnPasRXbTfMU4t/AkW2p1QKbi3DnSVYuokDkbH2Beo45vxDxhKr +C69RAoGBAIyo3+OJenoZmoNzNJl2WPW5MeBUzSh8T/bgyjFTdqFHF5WiYRD/lfHj +x9Glyw2nutuT4hlOqHvKhgTYdDMsF2oQ72fe3v8Q5FU7FuKndNPEAyvKNXZaShVA +hnlhv5DjXKb0wFWnt5PCCiQLtzG0yyHaITrrEme7FikkIcTxaX/Y +-----END RSA PRIVATE KEY----- diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2demo/rootCA.pem b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2demo/rootCA.pem new file mode 100644 index 0000000..3a323e7 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2demo/rootCA.pem @@ -0,0 +1,26 @@ +-----BEGIN CERTIFICATE----- +MIIEWjCCA0KgAwIBAgIJALfRlWsI8YQHMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNV +BAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzEUMBIG +A1UEChMLQnJhZGZpdHppbmMxEjAQBgNVBAMTCWxvY2FsaG9zdDEdMBsGCSqGSIb3 +DQEJARYOYnJhZEBkYW5nYS5jb20wHhcNMTQwNzE1MjA0NjA1WhcNMTcwNTA0MjA0 +NjA1WjB7MQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDVNhbiBG +cmFuY2lzY28xFDASBgNVBAoTC0JyYWRmaXR6aW5jMRIwEAYDVQQDEwlsb2NhbGhv +c3QxHTAbBgkqhkiG9w0BCQEWDmJyYWRAZGFuZ2EuY29tMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEAt5fAjp4fTcekWUTfzsp0kyih1OYbsGL0KX1eRbSS +R8Od0+9Q62Hyny+GFwMTb4A/KU8mssoHvcceSAAbwfbxFK/+s51TobqUnORZrOoT +ZjkUygbyXDSK99YBbcR1Pip8vwMTm4XKuLtCigeBBdjjAQdgUO28LENGlsMnmeYk +JfODVGnVmr5Ltb9ANA8IKyTfsnHJ4iOCS/PlPbUj2q7YnoVLposUBMlgUb/CykX3 +mOoLb4yJJQyA/iST6ZxiIEj36D4yWZ5lg7YJl+UiiBQHGCnPdGyipqV06ex0heYW +caiW8LWZSUQ93jQ+WVCH8hT7DQO1dmsvUmXlq/JeAlwQ/QIDAQABo4HgMIHdMB0G +A1UdDgQWBBRcAROthS4P4U7vTfjByC569R7E6DCBrQYDVR0jBIGlMIGigBRcAROt +hS4P4U7vTfjByC569R7E6KF/pH0wezELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNB +MRYwFAYDVQQHEw1TYW4gRnJhbmNpc2NvMRQwEgYDVQQKEwtCcmFkZml0emluYzES +MBAGA1UEAxMJbG9jYWxob3N0MR0wGwYJKoZIhvcNAQkBFg5icmFkQGRhbmdhLmNv +bYIJALfRlWsI8YQHMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAG6h +U9f9sNH0/6oBbGGy2EVU0UgITUQIrFWo9rFkrW5k/XkDjQm+3lzjT0iGR4IxE/Ao +eU6sQhua7wrWeFEn47GL98lnCsJdD7oZNhFmQ95Tb/LnDUjs5Yj9brP0NWzXfYU4 +UK2ZnINJRcJpB8iRCaCxE8DdcUF0XqIEq6pA272snoLmiXLMvNl3kYEdm+je6voD +58SNVEUsztzQyXmJEhCpwVI0A6QCjzXj+qvpmw3ZZHi8JwXei8ZZBLTSFBki8Z7n +sH9BBH38/SzUmAN4QHSPy1gjqm00OAE8NaYDkh/bzE4d7mLGGMWp/WE3KPSu82HF +kPe6XoSbiLm/kxk32T0= +-----END CERTIFICATE----- diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2demo/rootCA.srl b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2demo/rootCA.srl new file mode 100644 index 0000000..6db3891 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2demo/rootCA.srl @@ -0,0 +1 @@ +E2CE26BF3285059C diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2demo/server.crt b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2demo/server.crt new file mode 100644 index 0000000..c59059b --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2demo/server.crt @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDPjCCAiYCCQDizia/MoUFnDANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJV +UzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28xFDASBgNVBAoT +C0JyYWRmaXR6aW5jMRIwEAYDVQQDEwlsb2NhbGhvc3QxHTAbBgkqhkiG9w0BCQEW +DmJyYWRAZGFuZ2EuY29tMB4XDTE0MDcxNTIwNTAyN1oXDTE1MTEyNzIwNTAyN1ow +RzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMQswCQYDVQQHEwJTRjEeMBwGA1UE +ChMVYnJhZGZpdHogaHR0cDIgc2VydmVyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAs1Y9CyLFrdL8VQWN1WaifDqaZFnoqjHhCMlc1TfG2zA+InDifx2l +gZD3o8FeNnAcfM2sPlk3+ZleOYw9P/CklFVDlvqmpCv9ss/BEp/dDaWvy1LmJ4c2 +dbQJfmTxn7CV1H3TsVJvKdwFmdoABb41NoBp6+NNO7OtDyhbIMiCI0pL3Nefb3HL +A7hIMo3DYbORTtJLTIH9W8YKrEWL0lwHLrYFx/UdutZnv+HjdmO6vCN4na55mjws +/vjKQUmc7xeY7Xe20xDEG2oDKVkL2eD7FfyrYMS3rO1ExP2KSqlXYG/1S9I/fz88 +F0GK7HX55b5WjZCl2J3ERVdnv/0MQv+sYQIDAQABMA0GCSqGSIb3DQEBBQUAA4IB +AQC0zL+n/YpRZOdulSu9tS8FxrstXqGWoxfe+vIUgqfMZ5+0MkjJ/vW0FqlLDl2R +rn4XaR3e7FmWkwdDVbq/UB6lPmoAaFkCgh9/5oapMaclNVNnfF3fjCJfRr+qj/iD +EmJStTIN0ZuUjAlpiACmfnpEU55PafT5Zx+i1yE4FGjw8bJpFoyD4Hnm54nGjX19 +KeCuvcYFUPnBm3lcL0FalF2AjqV02WTHYNQk7YF/oeO7NKBoEgvGvKG3x+xaOeBI +dwvdq175ZsGul30h+QjrRlXhH/twcuaT3GSdoysDl9cCYE8f1Mk8PD6gan3uBCJU +90p6/CbU71bGbfpM2PHot2fm +-----END CERTIFICATE----- diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2demo/server.key b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2demo/server.key new file mode 100644 index 0000000..f329c14 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2demo/server.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAs1Y9CyLFrdL8VQWN1WaifDqaZFnoqjHhCMlc1TfG2zA+InDi +fx2lgZD3o8FeNnAcfM2sPlk3+ZleOYw9P/CklFVDlvqmpCv9ss/BEp/dDaWvy1Lm +J4c2dbQJfmTxn7CV1H3TsVJvKdwFmdoABb41NoBp6+NNO7OtDyhbIMiCI0pL3Nef +b3HLA7hIMo3DYbORTtJLTIH9W8YKrEWL0lwHLrYFx/UdutZnv+HjdmO6vCN4na55 +mjws/vjKQUmc7xeY7Xe20xDEG2oDKVkL2eD7FfyrYMS3rO1ExP2KSqlXYG/1S9I/ +fz88F0GK7HX55b5WjZCl2J3ERVdnv/0MQv+sYQIDAQABAoIBADQ2spUwbY+bcz4p +3M66ECrNQTBggP40gYl2XyHxGGOu2xhZ94f9ELf1hjRWU2DUKWco1rJcdZClV6q3 +qwmXvcM2Q/SMS8JW0ImkNVl/0/NqPxGatEnj8zY30d/L8hGFb0orzFu/XYA5gCP4 +NbN2WrXgk3ZLeqwcNxHHtSiJWGJ/fPyeDWAu/apy75u9Xf2GlzBZmV6HYD9EfK80 +LTlI60f5FO487CrJnboL7ovPJrIHn+k05xRQqwma4orpz932rTXnTjs9Lg6KtbQN +a7PrqfAntIISgr11a66Mng3IYH1lYqJsWJJwX/xHT4WLEy0EH4/0+PfYemJekz2+ +Co62drECgYEA6O9zVJZXrLSDsIi54cfxA7nEZWm5CAtkYWeAHa4EJ+IlZ7gIf9sL +W8oFcEfFGpvwVqWZ+AsQ70dsjXAv3zXaG0tmg9FtqWp7pzRSMPidifZcQwWkKeTO +gJnFmnVyed8h6GfjTEu4gxo1/S5U0V+mYSha01z5NTnN6ltKx1Or3b0CgYEAxRgm +S30nZxnyg/V7ys61AZhst1DG2tkZXEMcA7dYhabMoXPJAP/EfhlWwpWYYUs/u0gS +Wwmf5IivX5TlYScgmkvb/NYz0u4ZmOXkLTnLPtdKKFXhjXJcHjUP67jYmOxNlJLp +V4vLRnFxTpffAV+OszzRxsXX6fvruwZBANYJeXUCgYBVouLFsFgfWGYp2rpr9XP4 +KK25kvrBqF6JKOIDB1zjxNJ3pUMKrl8oqccCFoCyXa4oTM2kUX0yWxHfleUjrMq4 +yimwQKiOZmV7fVLSSjSw6e/VfBd0h3gb82ygcplZkN0IclkwTY5SNKqwn/3y07V5 +drqdhkrgdJXtmQ6O5YYECQKBgATERcDToQ1USlI4sKrB/wyv1AlG8dg/IebiVJ4e +ZAyvcQmClFzq0qS+FiQUnB/WQw9TeeYrwGs1hxBHuJh16srwhLyDrbMvQP06qh8R +48F8UXXSRec22dV9MQphaROhu2qZdv1AC0WD3tqov6L33aqmEOi+xi8JgbT/PLk5 +c/c1AoGBAI1A/02ryksW6/wc7/6SP2M2rTy4m1sD/GnrTc67EHnRcVBdKO6qH2RY +nqC8YcveC2ZghgPTDsA3VGuzuBXpwY6wTyV99q6jxQJ6/xcrD9/NUG6Uwv/xfCxl +IJLeBYEqQundSSny3VtaAUK8Ul1nxpTvVRNwtcyWTo8RHAAyNPWd +-----END RSA PRIVATE KEY----- diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2demo/tmpl.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2demo/tmpl.go new file mode 100644 index 0000000..504d6a7 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2demo/tmpl.go @@ -0,0 +1,1991 @@ +// 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. + +// +build h2demo + +package main + +import "html/template" + +var pushTmpl = template.Must(template.New("serverpush").Parse(` + + + + + + + + + HTTP/2 Server Push Demo + + + + + + + + + +
    +Note: This page exists for demonstration purposes. For the actual cmd/go docs, go to golang.org/cmd/go. +
    + + + +
    +... +
    + + + + +
    +
    +
    +
    + Run + Format + + + +
    +
    + + +
    +
    + + +

    Command go

    + + + + + + + + + + + + + + +

    +Go is a tool for managing Go source code. +

    +

    +Usage: +

    +
    go command [arguments]
    +
    +

    +The commands are: +

    +
    build       compile packages and dependencies
    +clean       remove object files
    +doc         show documentation for package or symbol
    +env         print Go environment information
    +bug         start a bug report
    +fix         run go tool fix on packages
    +fmt         run gofmt on package sources
    +generate    generate Go files by processing source
    +get         download and install packages and dependencies
    +install     compile and install packages and dependencies
    +list        list packages
    +run         compile and run Go program
    +test        test packages
    +tool        run specified go tool
    +version     print Go version
    +vet         run go tool vet on packages
    +
    +

    +Use "go help [command]" for more information about a command. +

    +

    +Additional help topics: +

    +
    c           calling between Go and C
    +buildmode   description of build modes
    +filetype    file types
    +gopath      GOPATH environment variable
    +environment environment variables
    +importpath  import path syntax
    +packages    description of package lists
    +testflag    description of testing flags
    +testfunc    description of testing functions
    +
    +

    +Use "go help [topic]" for more information about that topic. +

    +

    Compile packages and dependencies

    +

    +Usage: +

    +
    go build [-o output] [-i] [build flags] [packages]
    +
    +

    +Build compiles the packages named by the import paths, +along with their dependencies, but it does not install the results. +

    +

    +If the arguments to build are a list of .go files, build treats +them as a list of source files specifying a single package. +

    +

    +When compiling a single main package, build writes +the resulting executable to an output file named after +the first source file ('go build ed.go rx.go' writes 'ed' or 'ed.exe') +or the source code directory ('go build unix/sam' writes 'sam' or 'sam.exe'). +The '.exe' suffix is added when writing a Windows executable. +

    +

    +When compiling multiple packages or a single non-main package, +build compiles the packages but discards the resulting object, +serving only as a check that the packages can be built. +

    +

    +When compiling packages, build ignores files that end in '_test.go'. +

    +

    +The -o flag, only allowed when compiling a single package, +forces build to write the resulting executable or object +to the named output file, instead of the default behavior described +in the last two paragraphs. +

    +

    +The -i flag installs the packages that are dependencies of the target. +

    +

    +The build flags are shared by the build, clean, get, install, list, run, +and test commands: +

    +
    -a
    +	force rebuilding of packages that are already up-to-date.
    +-n
    +	print the commands but do not run them.
    +-p n
    +	the number of programs, such as build commands or
    +	test binaries, that can be run in parallel.
    +	The default is the number of CPUs available.
    +-race
    +	enable data race detection.
    +	Supported only on linux/amd64, freebsd/amd64, darwin/amd64 and windows/amd64.
    +-msan
    +	enable interoperation with memory sanitizer.
    +	Supported only on linux/amd64,
    +	and only with Clang/LLVM as the host C compiler.
    +-v
    +	print the names of packages as they are compiled.
    +-work
    +	print the name of the temporary work directory and
    +	do not delete it when exiting.
    +-x
    +	print the commands.
    +
    +-asmflags 'flag list'
    +	arguments to pass on each go tool asm invocation.
    +-buildmode mode
    +	build mode to use. See 'go help buildmode' for more.
    +-compiler name
    +	name of compiler to use, as in runtime.Compiler (gccgo or gc).
    +-gccgoflags 'arg list'
    +	arguments to pass on each gccgo compiler/linker invocation.
    +-gcflags 'arg list'
    +	arguments to pass on each go tool compile invocation.
    +-installsuffix suffix
    +	a suffix to use in the name of the package installation directory,
    +	in order to keep output separate from default builds.
    +	If using the -race flag, the install suffix is automatically set to race
    +	or, if set explicitly, has _race appended to it.  Likewise for the -msan
    +	flag.  Using a -buildmode option that requires non-default compile flags
    +	has a similar effect.
    +-ldflags 'flag list'
    +	arguments to pass on each go tool link invocation.
    +-linkshared
    +	link against shared libraries previously created with
    +	-buildmode=shared.
    +-pkgdir dir
    +	install and load all packages from dir instead of the usual locations.
    +	For example, when building with a non-standard configuration,
    +	use -pkgdir to keep generated packages in a separate location.
    +-tags 'tag list'
    +	a list of build tags to consider satisfied during the build.
    +	For more information about build tags, see the description of
    +	build constraints in the documentation for the go/build package.
    +-toolexec 'cmd args'
    +	a program to use to invoke toolchain programs like vet and asm.
    +	For example, instead of running asm, the go command will run
    +	'cmd args /path/to/asm <arguments for asm>'.
    +
    +

    +The list flags accept a space-separated list of strings. To embed spaces +in an element in the list, surround it with either single or double quotes. +

    +

    +For more about specifying packages, see 'go help packages'. +For more about where packages and binaries are installed, +run 'go help gopath'. +For more about calling between Go and C/C++, run 'go help c'. +

    +

    +Note: Build adheres to certain conventions such as those described +by 'go help gopath'. Not all projects can follow these conventions, +however. Installations that have their own conventions or that use +a separate software build system may choose to use lower-level +invocations such as 'go tool compile' and 'go tool link' to avoid +some of the overheads and design decisions of the build tool. +

    +

    +See also: go install, go get, go clean. +

    +

    Remove object files

    +

    +Usage: +

    +
    go clean [-i] [-r] [-n] [-x] [build flags] [packages]
    +
    +

    +Clean removes object files from package source directories. +The go command builds most objects in a temporary directory, +so go clean is mainly concerned with object files left by other +tools or by manual invocations of go build. +

    +

    +Specifically, clean removes the following files from each of the +source directories corresponding to the import paths: +

    +
    _obj/            old object directory, left from Makefiles
    +_test/           old test directory, left from Makefiles
    +_testmain.go     old gotest file, left from Makefiles
    +test.out         old test log, left from Makefiles
    +build.out        old test log, left from Makefiles
    +*.[568ao]        object files, left from Makefiles
    +
    +DIR(.exe)        from go build
    +DIR.test(.exe)   from go test -c
    +MAINFILE(.exe)   from go build MAINFILE.go
    +*.so             from SWIG
    +
    +

    +In the list, DIR represents the final path element of the +directory, and MAINFILE is the base name of any Go source +file in the directory that is not included when building +the package. +

    +

    +The -i flag causes clean to remove the corresponding installed +archive or binary (what 'go install' would create). +

    +

    +The -n flag causes clean to print the remove commands it would execute, +but not run them. +

    +

    +The -r flag causes clean to be applied recursively to all the +dependencies of the packages named by the import paths. +

    +

    +The -x flag causes clean to print remove commands as it executes them. +

    +

    +For more about build flags, see 'go help build'. +

    +

    +For more about specifying packages, see 'go help packages'. +

    +

    Show documentation for package or symbol

    +

    +Usage: +

    +
    go doc [-u] [-c] [package|[package.]symbol[.method]]
    +
    +

    +Doc prints the documentation comments associated with the item identified by its +arguments (a package, const, func, type, var, or method) followed by a one-line +summary of each of the first-level items "under" that item (package-level +declarations for a package, methods for a type, etc.). +

    +

    +Doc accepts zero, one, or two arguments. +

    +

    +Given no arguments, that is, when run as +

    +
    go doc
    +
    +

    +it prints the package documentation for the package in the current directory. +If the package is a command (package main), the exported symbols of the package +are elided from the presentation unless the -cmd flag is provided. +

    +

    +When run with one argument, the argument is treated as a Go-syntax-like +representation of the item to be documented. What the argument selects depends +on what is installed in GOROOT and GOPATH, as well as the form of the argument, +which is schematically one of these: +

    +
    go doc <pkg>
    +go doc <sym>[.<method>]
    +go doc [<pkg>.]<sym>[.<method>]
    +go doc [<pkg>.][<sym>.]<method>
    +
    +

    +The first item in this list matched by the argument is the one whose documentation +is printed. (See the examples below.) However, if the argument starts with a capital +letter it is assumed to identify a symbol or method in the current directory. +

    +

    +For packages, the order of scanning is determined lexically in breadth-first order. +That is, the package presented is the one that matches the search and is nearest +the root and lexically first at its level of the hierarchy. The GOROOT tree is +always scanned in its entirety before GOPATH. +

    +

    +If there is no package specified or matched, the package in the current +directory is selected, so "go doc Foo" shows the documentation for symbol Foo in +the current package. +

    +

    +The package path must be either a qualified path or a proper suffix of a +path. The go tool's usual package mechanism does not apply: package path +elements like . and ... are not implemented by go doc. +

    +

    +When run with two arguments, the first must be a full package path (not just a +suffix), and the second is a symbol or symbol and method; this is similar to the +syntax accepted by godoc: +

    +
    go doc <pkg> <sym>[.<method>]
    +
    +

    +In all forms, when matching symbols, lower-case letters in the argument match +either case but upper-case letters match exactly. This means that there may be +multiple matches of a lower-case argument in a package if different symbols have +different cases. If this occurs, documentation for all matches is printed. +

    +

    +Examples: +

    +
    go doc
    +	Show documentation for current package.
    +go doc Foo
    +	Show documentation for Foo in the current package.
    +	(Foo starts with a capital letter so it cannot match
    +	a package path.)
    +go doc encoding/json
    +	Show documentation for the encoding/json package.
    +go doc json
    +	Shorthand for encoding/json.
    +go doc json.Number (or go doc json.number)
    +	Show documentation and method summary for json.Number.
    +go doc json.Number.Int64 (or go doc json.number.int64)
    +	Show documentation for json.Number's Int64 method.
    +go doc cmd/doc
    +	Show package docs for the doc command.
    +go doc -cmd cmd/doc
    +	Show package docs and exported symbols within the doc command.
    +go doc template.new
    +	Show documentation for html/template's New function.
    +	(html/template is lexically before text/template)
    +go doc text/template.new # One argument
    +	Show documentation for text/template's New function.
    +go doc text/template new # Two arguments
    +	Show documentation for text/template's New function.
    +
    +At least in the current tree, these invocations all print the
    +documentation for json.Decoder's Decode method:
    +
    +go doc json.Decoder.Decode
    +go doc json.decoder.decode
    +go doc json.decode
    +cd go/src/encoding/json; go doc decode
    +
    +

    +Flags: +

    +
    -c
    +	Respect case when matching symbols.
    +-cmd
    +	Treat a command (package main) like a regular package.
    +	Otherwise package main's exported symbols are hidden
    +	when showing the package's top-level documentation.
    +-u
    +	Show documentation for unexported as well as exported
    +	symbols and methods.
    +
    +

    Print Go environment information

    +

    +Usage: +

    +
    go env [var ...]
    +
    +

    +Env prints Go environment information. +

    +

    +By default env prints information as a shell script +(on Windows, a batch file). If one or more variable +names is given as arguments, env prints the value of +each named variable on its own line. +

    +

    Start a bug report

    +

    +Usage: +

    +
    go bug
    +
    +

    +Bug opens the default browser and starts a new bug report. +The report includes useful system information. +

    +

    Run go tool fix on packages

    +

    +Usage: +

    +
    go fix [packages]
    +
    +

    +Fix runs the Go fix command on the packages named by the import paths. +

    +

    +For more about fix, see 'go doc cmd/fix'. +For more about specifying packages, see 'go help packages'. +

    +

    +To run fix with specific options, run 'go tool fix'. +

    +

    +See also: go fmt, go vet. +

    +

    Run gofmt on package sources

    +

    +Usage: +

    +
    go fmt [-n] [-x] [packages]
    +
    +

    +Fmt runs the command 'gofmt -l -w' on the packages named +by the import paths. It prints the names of the files that are modified. +

    +

    +For more about gofmt, see 'go doc cmd/gofmt'. +For more about specifying packages, see 'go help packages'. +

    +

    +The -n flag prints commands that would be executed. +The -x flag prints commands as they are executed. +

    +

    +To run gofmt with specific options, run gofmt itself. +

    +

    +See also: go fix, go vet. +

    +

    Generate Go files by processing source

    +

    +Usage: +

    +
    go generate [-run regexp] [-n] [-v] [-x] [build flags] [file.go... | packages]
    +
    +

    +Generate runs commands described by directives within existing +files. Those commands can run any process but the intent is to +create or update Go source files. +

    +

    +Go generate is never run automatically by go build, go get, go test, +and so on. It must be run explicitly. +

    +

    +Go generate scans the file for directives, which are lines of +the form, +

    +
    //go:generate command argument...
    +
    +

    +(note: no leading spaces and no space in "//go") where command +is the generator to be run, corresponding to an executable file +that can be run locally. It must either be in the shell path +(gofmt), a fully qualified path (/usr/you/bin/mytool), or a +command alias, described below. +

    +

    +Note that go generate does not parse the file, so lines that look +like directives in comments or multiline strings will be treated +as directives. +

    +

    +The arguments to the directive are space-separated tokens or +double-quoted strings passed to the generator as individual +arguments when it is run. +

    +

    +Quoted strings use Go syntax and are evaluated before execution; a +quoted string appears as a single argument to the generator. +

    +

    +Go generate sets several variables when it runs the generator: +

    +
    $GOARCH
    +	The execution architecture (arm, amd64, etc.)
    +$GOOS
    +	The execution operating system (linux, windows, etc.)
    +$GOFILE
    +	The base name of the file.
    +$GOLINE
    +	The line number of the directive in the source file.
    +$GOPACKAGE
    +	The name of the package of the file containing the directive.
    +$DOLLAR
    +	A dollar sign.
    +
    +

    +Other than variable substitution and quoted-string evaluation, no +special processing such as "globbing" is performed on the command +line. +

    +

    +As a last step before running the command, any invocations of any +environment variables with alphanumeric names, such as $GOFILE or +$HOME, are expanded throughout the command line. The syntax for +variable expansion is $NAME on all operating systems. Due to the +order of evaluation, variables are expanded even inside quoted +strings. If the variable NAME is not set, $NAME expands to the +empty string. +

    +

    +A directive of the form, +

    +
    //go:generate -command xxx args...
    +
    +

    +specifies, for the remainder of this source file only, that the +string xxx represents the command identified by the arguments. This +can be used to create aliases or to handle multiword generators. +For example, +

    +
    //go:generate -command foo go tool foo
    +
    +

    +specifies that the command "foo" represents the generator +"go tool foo". +

    +

    +Generate processes packages in the order given on the command line, +one at a time. If the command line lists .go files, they are treated +as a single package. Within a package, generate processes the +source files in a package in file name order, one at a time. Within +a source file, generate runs generators in the order they appear +in the file, one at a time. +

    +

    +If any generator returns an error exit status, "go generate" skips +all further processing for that package. +

    +

    +The generator is run in the package's source directory. +

    +

    +Go generate accepts one specific flag: +

    +
    -run=""
    +	if non-empty, specifies a regular expression to select
    +	directives whose full original source text (excluding
    +	any trailing spaces and final newline) matches the
    +	expression.
    +
    +

    +It also accepts the standard build flags including -v, -n, and -x. +The -v flag prints the names of packages and files as they are +processed. +The -n flag prints commands that would be executed. +The -x flag prints commands as they are executed. +

    +

    +For more about build flags, see 'go help build'. +

    +

    +For more about specifying packages, see 'go help packages'. +

    +

    Download and install packages and dependencies

    +

    +Usage: +

    +
    go get [-d] [-f] [-fix] [-insecure] [-t] [-u] [build flags] [packages]
    +
    +

    +Get downloads the packages named by the import paths, along with their +dependencies. It then installs the named packages, like 'go install'. +

    +

    +The -d flag instructs get to stop after downloading the packages; that is, +it instructs get not to install the packages. +

    +

    +The -f flag, valid only when -u is set, forces get -u not to verify that +each package has been checked out from the source control repository +implied by its import path. This can be useful if the source is a local fork +of the original. +

    +

    +The -fix flag instructs get to run the fix tool on the downloaded packages +before resolving dependencies or building the code. +

    +

    +The -insecure flag permits fetching from repositories and resolving +custom domains using insecure schemes such as HTTP. Use with caution. +

    +

    +The -t flag instructs get to also download the packages required to build +the tests for the specified packages. +

    +

    +The -u flag instructs get to use the network to update the named packages +and their dependencies. By default, get uses the network to check out +missing packages but does not use it to look for updates to existing packages. +

    +

    +The -v flag enables verbose progress and debug output. +

    +

    +Get also accepts build flags to control the installation. See 'go help build'. +

    +

    +When checking out a new package, get creates the target directory +GOPATH/src/<import-path>. If the GOPATH contains multiple entries, +get uses the first one. For more details see: 'go help gopath'. +

    +

    +When checking out or updating a package, get looks for a branch or tag +that matches the locally installed version of Go. The most important +rule is that if the local installation is running version "go1", get +searches for a branch or tag named "go1". If no such version exists it +retrieves the most recent version of the package. +

    +

    +When go get checks out or updates a Git repository, +it also updates any git submodules referenced by the repository. +

    +

    +Get never checks out or updates code stored in vendor directories. +

    +

    +For more about specifying packages, see 'go help packages'. +

    +

    +For more about how 'go get' finds source code to +download, see 'go help importpath'. +

    +

    +See also: go build, go install, go clean. +

    +

    Compile and install packages and dependencies

    +

    +Usage: +

    +
    go install [build flags] [packages]
    +
    +

    +Install compiles and installs the packages named by the import paths, +along with their dependencies. +

    +

    +For more about the build flags, see 'go help build'. +For more about specifying packages, see 'go help packages'. +

    +

    +See also: go build, go get, go clean. +

    +

    List packages

    +

    +Usage: +

    +
    go list [-e] [-f format] [-json] [build flags] [packages]
    +
    +

    +List lists the packages named by the import paths, one per line. +

    +

    +The default output shows the package import path: +

    +
    bytes
    +encoding/json
    +github.com/gorilla/mux
    +golang.org/x/net/html
    +
    +

    +The -f flag specifies an alternate format for the list, using the +syntax of package template. The default output is equivalent to -f +''. The struct being passed to the template is: +

    +
    type Package struct {
    +    Dir           string // directory containing package sources
    +    ImportPath    string // import path of package in dir
    +    ImportComment string // path in import comment on package statement
    +    Name          string // package name
    +    Doc           string // package documentation string
    +    Target        string // install path
    +    Shlib         string // the shared library that contains this package (only set when -linkshared)
    +    Goroot        bool   // is this package in the Go root?
    +    Standard      bool   // is this package part of the standard Go library?
    +    Stale         bool   // would 'go install' do anything for this package?
    +    StaleReason   string // explanation for Stale==true
    +    Root          string // Go root or Go path dir containing this package
    +    ConflictDir   string // this directory shadows Dir in $GOPATH
    +    BinaryOnly    bool   // binary-only package: cannot be recompiled from sources
    +
    +    // Source files
    +    GoFiles        []string // .go source files (excluding CgoFiles, TestGoFiles, XTestGoFiles)
    +    CgoFiles       []string // .go sources files that import "C"
    +    IgnoredGoFiles []string // .go sources ignored due to build constraints
    +    CFiles         []string // .c source files
    +    CXXFiles       []string // .cc, .cxx and .cpp source files
    +    MFiles         []string // .m source files
    +    HFiles         []string // .h, .hh, .hpp and .hxx source files
    +    FFiles         []string // .f, .F, .for and .f90 Fortran source files
    +    SFiles         []string // .s source files
    +    SwigFiles      []string // .swig files
    +    SwigCXXFiles   []string // .swigcxx files
    +    SysoFiles      []string // .syso object files to add to archive
    +    TestGoFiles    []string // _test.go files in package
    +    XTestGoFiles   []string // _test.go files outside package
    +
    +    // Cgo directives
    +    CgoCFLAGS    []string // cgo: flags for C compiler
    +    CgoCPPFLAGS  []string // cgo: flags for C preprocessor
    +    CgoCXXFLAGS  []string // cgo: flags for C++ compiler
    +    CgoFFLAGS    []string // cgo: flags for Fortran compiler
    +    CgoLDFLAGS   []string // cgo: flags for linker
    +    CgoPkgConfig []string // cgo: pkg-config names
    +
    +    // Dependency information
    +    Imports      []string // import paths used by this package
    +    Deps         []string // all (recursively) imported dependencies
    +    TestImports  []string // imports from TestGoFiles
    +    XTestImports []string // imports from XTestGoFiles
    +
    +    // Error information
    +    Incomplete bool            // this package or a dependency has an error
    +    Error      *PackageError   // error loading package
    +    DepsErrors []*PackageError // errors loading dependencies
    +}
    +
    +

    +Packages stored in vendor directories report an ImportPath that includes the +path to the vendor directory (for example, "d/vendor/p" instead of "p"), +so that the ImportPath uniquely identifies a given copy of a package. +The Imports, Deps, TestImports, and XTestImports lists also contain these +expanded imports paths. See golang.org/s/go15vendor for more about vendoring. +

    +

    +The error information, if any, is +

    +
    type PackageError struct {
    +    ImportStack   []string // shortest path from package named on command line to this one
    +    Pos           string   // position of error (if present, file:line:col)
    +    Err           string   // the error itself
    +}
    +
    +

    +The template function "join" calls strings.Join. +

    +

    +The template function "context" returns the build context, defined as: +

    +
    type Context struct {
    +	GOARCH        string   // target architecture
    +	GOOS          string   // target operating system
    +	GOROOT        string   // Go root
    +	GOPATH        string   // Go path
    +	CgoEnabled    bool     // whether cgo can be used
    +	UseAllFiles   bool     // use files regardless of +build lines, file names
    +	Compiler      string   // compiler to assume when computing target paths
    +	BuildTags     []string // build constraints to match in +build lines
    +	ReleaseTags   []string // releases the current release is compatible with
    +	InstallSuffix string   // suffix to use in the name of the install dir
    +}
    +
    +

    +For more information about the meaning of these fields see the documentation +for the go/build package's Context type. +

    +

    +The -json flag causes the package data to be printed in JSON format +instead of using the template format. +

    +

    +The -e flag changes the handling of erroneous packages, those that +cannot be found or are malformed. By default, the list command +prints an error to standard error for each erroneous package and +omits the packages from consideration during the usual printing. +With the -e flag, the list command never prints errors to standard +error and instead processes the erroneous packages with the usual +printing. Erroneous packages will have a non-empty ImportPath and +a non-nil Error field; other information may or may not be missing +(zeroed). +

    +

    +For more about build flags, see 'go help build'. +

    +

    +For more about specifying packages, see 'go help packages'. +

    +

    Compile and run Go program

    +

    +Usage: +

    +
    go run [build flags] [-exec xprog] gofiles... [arguments...]
    +
    +

    +Run compiles and runs the main package comprising the named Go source files. +A Go source file is defined to be a file ending in a literal ".go" suffix. +

    +

    +By default, 'go run' runs the compiled binary directly: 'a.out arguments...'. +If the -exec flag is given, 'go run' invokes the binary using xprog: +

    +
    'xprog a.out arguments...'.
    +
    +

    +If the -exec flag is not given, GOOS or GOARCH is different from the system +default, and a program named go_$GOOS_$GOARCH_exec can be found +on the current search path, 'go run' invokes the binary using that program, +for example 'go_nacl_386_exec a.out arguments...'. This allows execution of +cross-compiled programs when a simulator or other execution method is +available. +

    +

    +For more about build flags, see 'go help build'. +

    +

    +See also: go build. +

    +

    Test packages

    +

    +Usage: +

    +
    go test [build/test flags] [packages] [build/test flags & test binary flags]
    +
    +

    +'Go test' automates testing the packages named by the import paths. +It prints a summary of the test results in the format: +

    +
    ok   archive/tar   0.011s
    +FAIL archive/zip   0.022s
    +ok   compress/gzip 0.033s
    +...
    +
    +

    +followed by detailed output for each failed package. +

    +

    +'Go test' recompiles each package along with any files with names matching +the file pattern "*_test.go". +Files whose names begin with "_" (including "_test.go") or "." are ignored. +These additional files can contain test functions, benchmark functions, and +example functions. See 'go help testfunc' for more. +Each listed package causes the execution of a separate test binary. +

    +

    +Test files that declare a package with the suffix "_test" will be compiled as a +separate package, and then linked and run with the main test binary. +

    +

    +The go tool will ignore a directory named "testdata", making it available +to hold ancillary data needed by the tests. +

    +

    +By default, go test needs no arguments. It compiles and tests the package +with source in the current directory, including tests, and runs the tests. +

    +

    +The package is built in a temporary directory so it does not interfere with the +non-test installation. +

    +

    +In addition to the build flags, the flags handled by 'go test' itself are: +

    +
    -args
    +    Pass the remainder of the command line (everything after -args)
    +    to the test binary, uninterpreted and unchanged.
    +    Because this flag consumes the remainder of the command line,
    +    the package list (if present) must appear before this flag.
    +
    +-c
    +    Compile the test binary to pkg.test but do not run it
    +    (where pkg is the last element of the package's import path).
    +    The file name can be changed with the -o flag.
    +
    +-exec xprog
    +    Run the test binary using xprog. The behavior is the same as
    +    in 'go run'. See 'go help run' for details.
    +
    +-i
    +    Install packages that are dependencies of the test.
    +    Do not run the test.
    +
    +-o file
    +    Compile the test binary to the named file.
    +    The test still runs (unless -c or -i is specified).
    +
    +

    +The test binary also accepts flags that control execution of the test; these +flags are also accessible by 'go test'. See 'go help testflag' for details. +

    +

    +For more about build flags, see 'go help build'. +For more about specifying packages, see 'go help packages'. +

    +

    +See also: go build, go vet. +

    +

    Run specified go tool

    +

    +Usage: +

    +
    go tool [-n] command [args...]
    +
    +

    +Tool runs the go tool command identified by the arguments. +With no arguments it prints the list of known tools. +

    +

    +The -n flag causes tool to print the command that would be +executed but not execute it. +

    +

    +For more about each tool command, see 'go tool command -h'. +

    +

    Print Go version

    +

    +Usage: +

    +
    go version
    +
    +

    +Version prints the Go version, as reported by runtime.Version. +

    +

    Run go tool vet on packages

    +

    +Usage: +

    +
    go vet [-n] [-x] [build flags] [packages]
    +
    +

    +Vet runs the Go vet command on the packages named by the import paths. +

    +

    +For more about vet, see 'go doc cmd/vet'. +For more about specifying packages, see 'go help packages'. +

    +

    +To run the vet tool with specific options, run 'go tool vet'. +

    +

    +The -n flag prints commands that would be executed. +The -x flag prints commands as they are executed. +

    +

    +For more about build flags, see 'go help build'. +

    +

    +See also: go fmt, go fix. +

    +

    Calling between Go and C

    +

    +There are two different ways to call between Go and C/C++ code. +

    +

    +The first is the cgo tool, which is part of the Go distribution. For +information on how to use it see the cgo documentation (go doc cmd/cgo). +

    +

    +The second is the SWIG program, which is a general tool for +interfacing between languages. For information on SWIG see +http://swig.org/. When running go build, any file with a .swig +extension will be passed to SWIG. Any file with a .swigcxx extension +will be passed to SWIG with the -c++ option. +

    +

    +When either cgo or SWIG is used, go build will pass any .c, .m, .s, +or .S files to the C compiler, and any .cc, .cpp, .cxx files to the C++ +compiler. The CC or CXX environment variables may be set to determine +the C or C++ compiler, respectively, to use. +

    +

    Description of build modes

    +

    +The 'go build' and 'go install' commands take a -buildmode argument which +indicates which kind of object file is to be built. Currently supported values +are: +

    +
    -buildmode=archive
    +	Build the listed non-main packages into .a files. Packages named
    +	main are ignored.
    +
    +-buildmode=c-archive
    +	Build the listed main package, plus all packages it imports,
    +	into a C archive file. The only callable symbols will be those
    +	functions exported using a cgo //export comment. Requires
    +	exactly one main package to be listed.
    +
    +-buildmode=c-shared
    +	Build the listed main packages, plus all packages that they
    +	import, into C shared libraries. The only callable symbols will
    +	be those functions exported using a cgo //export comment.
    +	Non-main packages are ignored.
    +
    +-buildmode=default
    +	Listed main packages are built into executables and listed
    +	non-main packages are built into .a files (the default
    +	behavior).
    +
    +-buildmode=shared
    +	Combine all the listed non-main packages into a single shared
    +	library that will be used when building with the -linkshared
    +	option. Packages named main are ignored.
    +
    +-buildmode=exe
    +	Build the listed main packages and everything they import into
    +	executables. Packages not named main are ignored.
    +
    +-buildmode=pie
    +	Build the listed main packages and everything they import into
    +	position independent executables (PIE). Packages not named
    +	main are ignored.
    +
    +-buildmode=plugin
    +	Build the listed main packages, plus all packages that they
    +	import, into a Go plugin. Packages not named main are ignored.
    +
    +

    File types

    +

    +The go command examines the contents of a restricted set of files +in each directory. It identifies which files to examine based on +the extension of the file name. These extensions are: +

    +
    .go
    +	Go source files.
    +.c, .h
    +	C source files.
    +	If the package uses cgo or SWIG, these will be compiled with the
    +	OS-native compiler (typically gcc); otherwise they will
    +	trigger an error.
    +.cc, .cpp, .cxx, .hh, .hpp, .hxx
    +	C++ source files. Only useful with cgo or SWIG, and always
    +	compiled with the OS-native compiler.
    +.m
    +	Objective-C source files. Only useful with cgo, and always
    +	compiled with the OS-native compiler.
    +.s, .S
    +	Assembler source files.
    +	If the package uses cgo or SWIG, these will be assembled with the
    +	OS-native assembler (typically gcc (sic)); otherwise they
    +	will be assembled with the Go assembler.
    +.swig, .swigcxx
    +	SWIG definition files.
    +.syso
    +	System object files.
    +
    +

    +Files of each of these types except .syso may contain build +constraints, but the go command stops scanning for build constraints +at the first item in the file that is not a blank line or //-style +line comment. See the go/build package documentation for +more details. +

    +

    +Non-test Go source files can also include a //go:binary-only-package +comment, indicating that the package sources are included +for documentation only and must not be used to build the +package binary. This enables distribution of Go packages in +their compiled form alone. See the go/build package documentation +for more details. +

    +

    GOPATH environment variable

    +

    +The Go path is used to resolve import statements. +It is implemented by and documented in the go/build package. +

    +

    +The GOPATH environment variable lists places to look for Go code. +On Unix, the value is a colon-separated string. +On Windows, the value is a semicolon-separated string. +On Plan 9, the value is a list. +

    +

    +If the environment variable is unset, GOPATH defaults +to a subdirectory named "go" in the user's home directory +($HOME/go on Unix, %USERPROFILE%\go on Windows), +unless that directory holds a Go distribution. +Run "go env GOPATH" to see the current GOPATH. +

    +

    +See https://golang.org/wiki/SettingGOPATH to set a custom GOPATH. +

    +

    +Each directory listed in GOPATH must have a prescribed structure: +

    +

    +The src directory holds source code. The path below src +determines the import path or executable name. +

    +

    +The pkg directory holds installed package objects. +As in the Go tree, each target operating system and +architecture pair has its own subdirectory of pkg +(pkg/GOOS_GOARCH). +

    +

    +If DIR is a directory listed in the GOPATH, a package with +source in DIR/src/foo/bar can be imported as "foo/bar" and +has its compiled form installed to "DIR/pkg/GOOS_GOARCH/foo/bar.a". +

    +

    +The bin directory holds compiled commands. +Each command is named for its source directory, but only +the final element, not the entire path. That is, the +command with source in DIR/src/foo/quux is installed into +DIR/bin/quux, not DIR/bin/foo/quux. The "foo/" prefix is stripped +so that you can add DIR/bin to your PATH to get at the +installed commands. If the GOBIN environment variable is +set, commands are installed to the directory it names instead +of DIR/bin. GOBIN must be an absolute path. +

    +

    +Here's an example directory layout: +

    +
    GOPATH=/home/user/go
    +
    +/home/user/go/
    +    src/
    +        foo/
    +            bar/               (go code in package bar)
    +                x.go
    +            quux/              (go code in package main)
    +                y.go
    +    bin/
    +        quux                   (installed command)
    +    pkg/
    +        linux_amd64/
    +            foo/
    +                bar.a          (installed package object)
    +
    +

    +Go searches each directory listed in GOPATH to find source code, +but new packages are always downloaded into the first directory +in the list. +

    +

    +See https://golang.org/doc/code.html for an example. +

    +

    Internal Directories

    +

    +Code in or below a directory named "internal" is importable only +by code in the directory tree rooted at the parent of "internal". +Here's an extended version of the directory layout above: +

    +
    /home/user/go/
    +    src/
    +        crash/
    +            bang/              (go code in package bang)
    +                b.go
    +        foo/                   (go code in package foo)
    +            f.go
    +            bar/               (go code in package bar)
    +                x.go
    +            internal/
    +                baz/           (go code in package baz)
    +                    z.go
    +            quux/              (go code in package main)
    +                y.go
    +
    +

    +The code in z.go is imported as "foo/internal/baz", but that +import statement can only appear in source files in the subtree +rooted at foo. The source files foo/f.go, foo/bar/x.go, and +foo/quux/y.go can all import "foo/internal/baz", but the source file +crash/bang/b.go cannot. +

    +

    +See https://golang.org/s/go14internal for details. +

    +

    Vendor Directories

    +

    +Go 1.6 includes support for using local copies of external dependencies +to satisfy imports of those dependencies, often referred to as vendoring. +

    +

    +Code below a directory named "vendor" is importable only +by code in the directory tree rooted at the parent of "vendor", +and only using an import path that omits the prefix up to and +including the vendor element. +

    +

    +Here's the example from the previous section, +but with the "internal" directory renamed to "vendor" +and a new foo/vendor/crash/bang directory added: +

    +
    /home/user/go/
    +    src/
    +        crash/
    +            bang/              (go code in package bang)
    +                b.go
    +        foo/                   (go code in package foo)
    +            f.go
    +            bar/               (go code in package bar)
    +                x.go
    +            vendor/
    +                crash/
    +                    bang/      (go code in package bang)
    +                        b.go
    +                baz/           (go code in package baz)
    +                    z.go
    +            quux/              (go code in package main)
    +                y.go
    +
    +

    +The same visibility rules apply as for internal, but the code +in z.go is imported as "baz", not as "foo/vendor/baz". +

    +

    +Code in vendor directories deeper in the source tree shadows +code in higher directories. Within the subtree rooted at foo, an import +of "crash/bang" resolves to "foo/vendor/crash/bang", not the +top-level "crash/bang". +

    +

    +Code in vendor directories is not subject to import path +checking (see 'go help importpath'). +

    +

    +When 'go get' checks out or updates a git repository, it now also +updates submodules. +

    +

    +Vendor directories do not affect the placement of new repositories +being checked out for the first time by 'go get': those are always +placed in the main GOPATH, never in a vendor subtree. +

    +

    +See https://golang.org/s/go15vendor for details. +

    +

    Environment variables

    +

    +The go command, and the tools it invokes, examine a few different +environment variables. For many of these, you can see the default +value of on your system by running 'go env NAME', where NAME is the +name of the variable. +

    +

    +General-purpose environment variables: +

    +
    GCCGO
    +	The gccgo command to run for 'go build -compiler=gccgo'.
    +GOARCH
    +	The architecture, or processor, for which to compile code.
    +	Examples are amd64, 386, arm, ppc64.
    +GOBIN
    +	The directory where 'go install' will install a command.
    +GOOS
    +	The operating system for which to compile code.
    +	Examples are linux, darwin, windows, netbsd.
    +GOPATH
    +	For more details see: 'go help gopath'.
    +GORACE
    +	Options for the race detector.
    +	See https://golang.org/doc/articles/race_detector.html.
    +GOROOT
    +	The root of the go tree.
    +
    +

    +Environment variables for use with cgo: +

    +
    CC
    +	The command to use to compile C code.
    +CGO_ENABLED
    +	Whether the cgo command is supported.  Either 0 or 1.
    +CGO_CFLAGS
    +	Flags that cgo will pass to the compiler when compiling
    +	C code.
    +CGO_CPPFLAGS
    +	Flags that cgo will pass to the compiler when compiling
    +	C or C++ code.
    +CGO_CXXFLAGS
    +	Flags that cgo will pass to the compiler when compiling
    +	C++ code.
    +CGO_FFLAGS
    +	Flags that cgo will pass to the compiler when compiling
    +	Fortran code.
    +CGO_LDFLAGS
    +	Flags that cgo will pass to the compiler when linking.
    +CXX
    +	The command to use to compile C++ code.
    +PKG_CONFIG
    +	Path to pkg-config tool.
    +
    +

    +Architecture-specific environment variables: +

    +
    GOARM
    +	For GOARCH=arm, the ARM architecture for which to compile.
    +	Valid values are 5, 6, 7.
    +GO386
    +	For GOARCH=386, the floating point instruction set.
    +	Valid values are 387, sse2.
    +
    +

    +Special-purpose environment variables: +

    +
    GOROOT_FINAL
    +	The root of the installed Go tree, when it is
    +	installed in a location other than where it is built.
    +	File names in stack traces are rewritten from GOROOT to
    +	GOROOT_FINAL.
    +GO_EXTLINK_ENABLED
    +	Whether the linker should use external linking mode
    +	when using -linkmode=auto with code that uses cgo.
    +	Set to 0 to disable external linking mode, 1 to enable it.
    +GIT_ALLOW_PROTOCOL
    +	Defined by Git. A colon-separated list of schemes that are allowed to be used
    +	with git fetch/clone. If set, any scheme not explicitly mentioned will be
    +	considered insecure by 'go get'.
    +
    +

    Import path syntax

    +

    +An import path (see 'go help packages') denotes a package stored in the local +file system. In general, an import path denotes either a standard package (such +as "unicode/utf8") or a package found in one of the work spaces (For more +details see: 'go help gopath'). +

    +

    Relative import paths

    +

    +An import path beginning with ./ or ../ is called a relative path. +The toolchain supports relative import paths as a shortcut in two ways. +

    +

    +First, a relative path can be used as a shorthand on the command line. +If you are working in the directory containing the code imported as +"unicode" and want to run the tests for "unicode/utf8", you can type +"go test ./utf8" instead of needing to specify the full path. +Similarly, in the reverse situation, "go test .." will test "unicode" from +the "unicode/utf8" directory. Relative patterns are also allowed, like +"go test ./..." to test all subdirectories. See 'go help packages' for details +on the pattern syntax. +

    +

    +Second, if you are compiling a Go program not in a work space, +you can use a relative path in an import statement in that program +to refer to nearby code also not in a work space. +This makes it easy to experiment with small multipackage programs +outside of the usual work spaces, but such programs cannot be +installed with "go install" (there is no work space in which to install them), +so they are rebuilt from scratch each time they are built. +To avoid ambiguity, Go programs cannot use relative import paths +within a work space. +

    +

    Remote import paths

    +

    +Certain import paths also +describe how to obtain the source code for the package using +a revision control system. +

    +

    +A few common code hosting sites have special syntax: +

    +
    Bitbucket (Git, Mercurial)
    +
    +	import "bitbucket.org/user/project"
    +	import "bitbucket.org/user/project/sub/directory"
    +
    +GitHub (Git)
    +
    +	import "github.com/user/project"
    +	import "github.com/user/project/sub/directory"
    +
    +Launchpad (Bazaar)
    +
    +	import "launchpad.net/project"
    +	import "launchpad.net/project/series"
    +	import "launchpad.net/project/series/sub/directory"
    +
    +	import "launchpad.net/~user/project/branch"
    +	import "launchpad.net/~user/project/branch/sub/directory"
    +
    +IBM DevOps Services (Git)
    +
    +	import "hub.jazz.net/git/user/project"
    +	import "hub.jazz.net/git/user/project/sub/directory"
    +
    +

    +For code hosted on other servers, import paths may either be qualified +with the version control type, or the go tool can dynamically fetch +the import path over https/http and discover where the code resides +from a <meta> tag in the HTML. +

    +

    +To declare the code location, an import path of the form +

    +
    repository.vcs/path
    +
    +

    +specifies the given repository, with or without the .vcs suffix, +using the named version control system, and then the path inside +that repository. The supported version control systems are: +

    +
    Bazaar      .bzr
    +Git         .git
    +Mercurial   .hg
    +Subversion  .svn
    +
    +

    +For example, +

    +
    import "example.org/user/foo.hg"
    +
    +

    +denotes the root directory of the Mercurial repository at +example.org/user/foo or foo.hg, and +

    +
    import "example.org/repo.git/foo/bar"
    +
    +

    +denotes the foo/bar directory of the Git repository at +example.org/repo or repo.git. +

    +

    +When a version control system supports multiple protocols, +each is tried in turn when downloading. For example, a Git +download tries https://, then git+ssh://. +

    +

    +By default, downloads are restricted to known secure protocols +(e.g. https, ssh). To override this setting for Git downloads, the +GIT_ALLOW_PROTOCOL environment variable can be set (For more details see: +'go help environment'). +

    +

    +If the import path is not a known code hosting site and also lacks a +version control qualifier, the go tool attempts to fetch the import +over https/http and looks for a <meta> tag in the document's HTML +<head>. +

    +

    +The meta tag has the form: +

    +
    <meta name="go-import" content="import-prefix vcs repo-root">
    +
    +

    +The import-prefix is the import path corresponding to the repository +root. It must be a prefix or an exact match of the package being +fetched with "go get". If it's not an exact match, another http +request is made at the prefix to verify the <meta> tags match. +

    +

    +The meta tag should appear as early in the file as possible. +In particular, it should appear before any raw JavaScript or CSS, +to avoid confusing the go command's restricted parser. +

    +

    +The vcs is one of "git", "hg", "svn", etc, +

    +

    +The repo-root is the root of the version control system +containing a scheme and not containing a .vcs qualifier. +

    +

    +For example, +

    +
    import "example.org/pkg/foo"
    +
    +

    +will result in the following requests: +

    +
    https://example.org/pkg/foo?go-get=1 (preferred)
    +http://example.org/pkg/foo?go-get=1  (fallback, only with -insecure)
    +
    +

    +If that page contains the meta tag +

    +
    <meta name="go-import" content="example.org git https://code.org/r/p/exproj">
    +
    +

    +the go tool will verify that https://example.org/?go-get=1 contains the +same meta tag and then git clone https://code.org/r/p/exproj into +GOPATH/src/example.org. +

    +

    +New downloaded packages are written to the first directory listed in the GOPATH +environment variable (For more details see: 'go help gopath'). +

    +

    +The go command attempts to download the version of the +package appropriate for the Go release being used. +Run 'go help get' for more. +

    +

    Import path checking

    +

    +When the custom import path feature described above redirects to a +known code hosting site, each of the resulting packages has two possible +import paths, using the custom domain or the known hosting site. +

    +

    +A package statement is said to have an "import comment" if it is immediately +followed (before the next newline) by a comment of one of these two forms: +

    +
    package math // import "path"
    +package math /* import "path" */
    +
    +

    +The go command will refuse to install a package with an import comment +unless it is being referred to by that import path. In this way, import comments +let package authors make sure the custom import path is used and not a +direct path to the underlying code hosting site. +

    +

    +Import path checking is disabled for code found within vendor trees. +This makes it possible to copy code into alternate locations in vendor trees +without needing to update import comments. +

    +

    +See https://golang.org/s/go14customimport for details. +

    +

    Description of package lists

    +

    +Many commands apply to a set of packages: +

    +
    go action [packages]
    +
    +

    +Usually, [packages] is a list of import paths. +

    +

    +An import path that is a rooted path or that begins with +a . or .. element is interpreted as a file system path and +denotes the package in that directory. +

    +

    +Otherwise, the import path P denotes the package found in +the directory DIR/src/P for some DIR listed in the GOPATH +environment variable (For more details see: 'go help gopath'). +

    +

    +If no import paths are given, the action applies to the +package in the current directory. +

    +

    +There are four reserved names for paths that should not be used +for packages to be built with the go tool: +

    +

    +- "main" denotes the top-level package in a stand-alone executable. +

    +

    +- "all" expands to all package directories found in all the GOPATH +trees. For example, 'go list all' lists all the packages on the local +system. +

    +

    +- "std" is like all but expands to just the packages in the standard +Go library. +

    +

    +- "cmd" expands to the Go repository's commands and their +internal libraries. +

    +

    +Import paths beginning with "cmd/" only match source code in +the Go repository. +

    +

    +An import path is a pattern if it includes one or more "..." wildcards, +each of which can match any string, including the empty string and +strings containing slashes. Such a pattern expands to all package +directories found in the GOPATH trees with names matching the +patterns. As a special case, x/... matches x as well as x's subdirectories. +For example, net/... expands to net and packages in its subdirectories. +

    +

    +An import path can also name a package to be downloaded from +a remote repository. Run 'go help importpath' for details. +

    +

    +Every package in a program must have a unique import path. +By convention, this is arranged by starting each path with a +unique prefix that belongs to you. For example, paths used +internally at Google all begin with 'google', and paths +denoting remote repositories begin with the path to the code, +such as 'github.com/user/repo'. +

    +

    +Packages in a program need not have unique package names, +but there are two reserved package names with special meaning. +The name main indicates a command, not a library. +Commands are built into binaries and cannot be imported. +The name documentation indicates documentation for +a non-Go program in the directory. Files in package documentation +are ignored by the go command. +

    +

    +As a special case, if the package list is a list of .go files from a +single directory, the command is applied to a single synthesized +package made up of exactly those files, ignoring any build constraints +in those files and ignoring any other files in the directory. +

    +

    +Directory and file names that begin with "." or "_" are ignored +by the go tool, as are directories named "testdata". +

    +

    Description of testing flags

    +

    +The 'go test' command takes both flags that apply to 'go test' itself +and flags that apply to the resulting test binary. +

    +

    +Several of the flags control profiling and write an execution profile +suitable for "go tool pprof"; run "go tool pprof -h" for more +information. The --alloc_space, --alloc_objects, and --show_bytes +options of pprof control how the information is presented. +

    +

    +The following flags are recognized by the 'go test' command and +control the execution of any test: +

    +
    -bench regexp
    +    Run (sub)benchmarks matching a regular expression.
    +    The given regular expression is split into smaller ones by
    +    top-level '/', where each must match the corresponding part of a
    +    benchmark's identifier.
    +    By default, no benchmarks run. To run all benchmarks,
    +    use '-bench .' or '-bench=.'.
    +
    +-benchtime t
    +    Run enough iterations of each benchmark to take t, specified
    +    as a time.Duration (for example, -benchtime 1h30s).
    +    The default is 1 second (1s).
    +
    +-count n
    +    Run each test and benchmark n times (default 1).
    +    If -cpu is set, run n times for each GOMAXPROCS value.
    +    Examples are always run once.
    +
    +-cover
    +    Enable coverage analysis.
    +
    +-covermode set,count,atomic
    +    Set the mode for coverage analysis for the package[s]
    +    being tested. The default is "set" unless -race is enabled,
    +    in which case it is "atomic".
    +    The values:
    +	set: bool: does this statement run?
    +	count: int: how many times does this statement run?
    +	atomic: int: count, but correct in multithreaded tests;
    +		significantly more expensive.
    +    Sets -cover.
    +
    +-coverpkg pkg1,pkg2,pkg3
    +    Apply coverage analysis in each test to the given list of packages.
    +    The default is for each test to analyze only the package being tested.
    +    Packages are specified as import paths.
    +    Sets -cover.
    +
    +-cpu 1,2,4
    +    Specify a list of GOMAXPROCS values for which the tests or
    +    benchmarks should be executed.  The default is the current value
    +    of GOMAXPROCS.
    +
    +-parallel n
    +    Allow parallel execution of test functions that call t.Parallel.
    +    The value of this flag is the maximum number of tests to run
    +    simultaneously; by default, it is set to the value of GOMAXPROCS.
    +    Note that -parallel only applies within a single test binary.
    +    The 'go test' command may run tests for different packages
    +    in parallel as well, according to the setting of the -p flag
    +    (see 'go help build').
    +
    +-run regexp
    +    Run only those tests and examples matching the regular expression.
    +    For tests the regular expression is split into smaller ones by
    +    top-level '/', where each must match the corresponding part of a
    +    test's identifier.
    +
    +-short
    +    Tell long-running tests to shorten their run time.
    +    It is off by default but set during all.bash so that installing
    +    the Go tree can run a sanity check but not spend time running
    +    exhaustive tests.
    +
    +-timeout t
    +    If a test runs longer than t, panic.
    +    The default is 10 minutes (10m).
    +
    +-v
    +    Verbose output: log all tests as they are run. Also print all
    +    text from Log and Logf calls even if the test succeeds.
    +
    +

    +The following flags are also recognized by 'go test' and can be used to +profile the tests during execution: +

    +
    -benchmem
    +    Print memory allocation statistics for benchmarks.
    +
    +-blockprofile block.out
    +    Write a goroutine blocking profile to the specified file
    +    when all tests are complete.
    +    Writes test binary as -c would.
    +
    +-blockprofilerate n
    +    Control the detail provided in goroutine blocking profiles by
    +    calling runtime.SetBlockProfileRate with n.
    +    See 'go doc runtime.SetBlockProfileRate'.
    +    The profiler aims to sample, on average, one blocking event every
    +    n nanoseconds the program spends blocked.  By default,
    +    if -test.blockprofile is set without this flag, all blocking events
    +    are recorded, equivalent to -test.blockprofilerate=1.
    +
    +-coverprofile cover.out
    +    Write a coverage profile to the file after all tests have passed.
    +    Sets -cover.
    +
    +-cpuprofile cpu.out
    +    Write a CPU profile to the specified file before exiting.
    +    Writes test binary as -c would.
    +
    +-memprofile mem.out
    +    Write a memory profile to the file after all tests have passed.
    +    Writes test binary as -c would.
    +
    +-memprofilerate n
    +    Enable more precise (and expensive) memory profiles by setting
    +    runtime.MemProfileRate.  See 'go doc runtime.MemProfileRate'.
    +    To profile all memory allocations, use -test.memprofilerate=1
    +    and pass --alloc_space flag to the pprof tool.
    +
    +-mutexprofile mutex.out
    +    Write a mutex contention profile to the specified file
    +    when all tests are complete.
    +    Writes test binary as -c would.
    +
    +-mutexprofilefraction n
    +    Sample 1 in n stack traces of goroutines holding a
    +    contended mutex.
    +
    +-outputdir directory
    +    Place output files from profiling in the specified directory,
    +    by default the directory in which "go test" is running.
    +
    +-trace trace.out
    +    Write an execution trace to the specified file before exiting.
    +
    +

    +Each of these flags is also recognized with an optional 'test.' prefix, +as in -test.v. When invoking the generated test binary (the result of +'go test -c') directly, however, the prefix is mandatory. +

    +

    +The 'go test' command rewrites or removes recognized flags, +as appropriate, both before and after the optional package list, +before invoking the test binary. +

    +

    +For instance, the command +

    +
    go test -v -myflag testdata -cpuprofile=prof.out -x
    +
    +

    +will compile the test binary and then run it as +

    +
    pkg.test -test.v -myflag testdata -test.cpuprofile=prof.out
    +
    +

    +(The -x flag is removed because it applies only to the go command's +execution, not to the test itself.) +

    +

    +The test flags that generate profiles (other than for coverage) also +leave the test binary in pkg.test for use when analyzing the profiles. +

    +

    +When 'go test' runs a test binary, it does so from within the +corresponding package's source code directory. Depending on the test, +it may be necessary to do the same when invoking a generated test +binary directly. +

    +

    +The command-line package list, if present, must appear before any +flag not known to the go test command. Continuing the example above, +the package list would have to appear before -myflag, but could appear +on either side of -v. +

    +

    +To keep an argument for a test binary from being interpreted as a +known flag or a package name, use -args (see 'go help test') which +passes the remainder of the command line through to the test binary +uninterpreted and unaltered. +

    +

    +For instance, the command +

    +
    go test -v -args -x -v
    +
    +

    +will compile the test binary and then run it as +

    +
    pkg.test -test.v -x -v
    +
    +

    +Similarly, +

    +
    go test -args math
    +
    +

    +will compile the test binary and then run it as +

    +
    pkg.test math
    +
    +

    +In the first example, the -x and the second -v are passed through to the +test binary unchanged and with no effect on the go command itself. +In the second example, the argument math is passed through to the test +binary, instead of being interpreted as the package list. +

    +

    Description of testing functions

    +

    +The 'go test' command expects to find test, benchmark, and example functions +in the "*_test.go" files corresponding to the package under test. +

    +

    +A test function is one named TestXXX (where XXX is any alphanumeric string +not starting with a lower case letter) and should have the signature, +

    +
    func TestXXX(t *testing.T) { ... }
    +
    +

    +A benchmark function is one named BenchmarkXXX and should have the signature, +

    +
    func BenchmarkXXX(b *testing.B) { ... }
    +
    +

    +An example function is similar to a test function but, instead of using +*testing.T to report success or failure, prints output to os.Stdout. +If the last comment in the function starts with "Output:" then the output +is compared exactly against the comment (see examples below). If the last +comment begins with "Unordered output:" then the output is compared to the +comment, however the order of the lines is ignored. An example with no such +comment is compiled but not executed. An example with no text after +"Output:" is compiled, executed, and expected to produce no output. +

    +

    +Godoc displays the body of ExampleXXX to demonstrate the use +of the function, constant, or variable XXX. An example of a method M with +receiver type T or *T is named ExampleT_M. There may be multiple examples +for a given function, constant, or variable, distinguished by a trailing _xxx, +where xxx is a suffix not beginning with an upper case letter. +

    +

    +Here is an example of an example: +

    +
    func ExamplePrintln() {
    +	Println("The output of\nthis example.")
    +	// Output: The output of
    +	// this example.
    +}
    +
    +

    +Here is another example where the ordering of the output is ignored: +

    +
    func ExamplePerm() {
    +	for _, value := range Perm(4) {
    +		fmt.Println(value)
    +	}
    +
    +	// Unordered output: 4
    +	// 2
    +	// 1
    +	// 3
    +	// 0
    +}
    +
    +

    +The entire test file is presented as the example when it contains a single +example function, at least one other function, type, variable, or constant +declaration, and no test or benchmark functions. +

    +

    +See the documentation of the testing package for more information. +

    + + + +
    +
    + + + + + + + + +`)) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2i/README.md b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2i/README.md new file mode 100644 index 0000000..fb5c5ef --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2i/README.md @@ -0,0 +1,97 @@ +# h2i + +**h2i** is an interactive HTTP/2 ("h2") console debugger. Miss the good ol' +days of telnetting to your HTTP/1.n servers? We're bringing you +back. + +Features: +- send raw HTTP/2 frames + - PING + - SETTINGS + - HEADERS + - etc +- type in HTTP/1.n and have it auto-HPACK/frame-ify it for HTTP/2 +- pretty print all received HTTP/2 frames from the peer (including HPACK decoding) +- tab completion of commands, options + +Not yet features, but soon: +- unnecessary CONTINUATION frames on short boundaries, to test peer implementations +- request bodies (DATA frames) +- send invalid frames for testing server implementations (supported by underlying Framer) + +Later: +- act like a server + +## Installation + +``` +$ go get golang.org/x/net/http2/h2i +$ h2i +``` + +## Demo + +``` +$ h2i +Usage: h2i + + -insecure + Whether to skip TLS cert validation + -nextproto string + Comma-separated list of NPN/ALPN protocol names to negotiate. (default "h2,h2-14") + +$ h2i google.com +Connecting to google.com:443 ... +Connected to 74.125.224.41:443 +Negotiated protocol "h2-14" +[FrameHeader SETTINGS len=18] + [MAX_CONCURRENT_STREAMS = 100] + [INITIAL_WINDOW_SIZE = 1048576] + [MAX_FRAME_SIZE = 16384] +[FrameHeader WINDOW_UPDATE len=4] + Window-Increment = 983041 + +h2i> PING h2iSayHI +[FrameHeader PING flags=ACK len=8] + Data = "h2iSayHI" +h2i> headers +(as HTTP/1.1)> GET / HTTP/1.1 +(as HTTP/1.1)> Host: ip.appspot.com +(as HTTP/1.1)> User-Agent: h2i/brad-n-blake +(as HTTP/1.1)> +Opening Stream-ID 1: + :authority = ip.appspot.com + :method = GET + :path = / + :scheme = https + user-agent = h2i/brad-n-blake +[FrameHeader HEADERS flags=END_HEADERS stream=1 len=77] + :status = "200" + alternate-protocol = "443:quic,p=1" + content-length = "15" + content-type = "text/html" + date = "Fri, 01 May 2015 23:06:56 GMT" + server = "Google Frontend" +[FrameHeader DATA flags=END_STREAM stream=1 len=15] + "173.164.155.78\n" +[FrameHeader PING len=8] + Data = "\x00\x00\x00\x00\x00\x00\x00\x00" +h2i> ping +[FrameHeader PING flags=ACK len=8] + Data = "h2i_ping" +h2i> ping +[FrameHeader PING flags=ACK len=8] + Data = "h2i_ping" +h2i> ping +[FrameHeader GOAWAY len=22] + Last-Stream-ID = 1; Error-Code = PROTOCOL_ERROR (1) + +ReadFrame: EOF +``` + +## Status + +Quick few hour hack. So much yet to do. Feel free to file issues for +bugs or wishlist items, but [@bmizerany](https://github.com/bmizerany/) +and I aren't yet accepting pull requests until things settle down. + diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2i/h2i.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2i/h2i.go new file mode 100644 index 0000000..62e5752 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/h2i/h2i.go @@ -0,0 +1,522 @@ +// Copyright 2015 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 !plan9,!solaris + +/* +The h2i command is an interactive HTTP/2 console. + +Usage: + $ h2i [flags] + +Interactive commands in the console: (all parts case-insensitive) + + ping [data] + settings ack + settings FOO=n BAR=z + headers (open a new stream by typing HTTP/1.1) +*/ +package main + +import ( + "bufio" + "bytes" + "crypto/tls" + "errors" + "flag" + "fmt" + "io" + "log" + "net" + "net/http" + "os" + "regexp" + "strconv" + "strings" + + "golang.org/x/crypto/ssh/terminal" + "golang.org/x/net/http2" + "golang.org/x/net/http2/hpack" +) + +// Flags +var ( + flagNextProto = flag.String("nextproto", "h2,h2-14", "Comma-separated list of NPN/ALPN protocol names to negotiate.") + flagInsecure = flag.Bool("insecure", false, "Whether to skip TLS cert validation") + flagSettings = flag.String("settings", "empty", "comma-separated list of KEY=value settings for the initial SETTINGS frame. The magic value 'empty' sends an empty initial settings frame, and the magic value 'omit' causes no initial settings frame to be sent.") + flagDial = flag.String("dial", "", "optional ip:port to dial, to connect to a host:port but use a different SNI name (including a SNI name without DNS)") +) + +type command struct { + run func(*h2i, []string) error // required + + // complete optionally specifies tokens (case-insensitive) which are + // valid for this subcommand. + complete func() []string +} + +var commands = map[string]command{ + "ping": {run: (*h2i).cmdPing}, + "settings": { + run: (*h2i).cmdSettings, + complete: func() []string { + return []string{ + "ACK", + http2.SettingHeaderTableSize.String(), + http2.SettingEnablePush.String(), + http2.SettingMaxConcurrentStreams.String(), + http2.SettingInitialWindowSize.String(), + http2.SettingMaxFrameSize.String(), + http2.SettingMaxHeaderListSize.String(), + } + }, + }, + "quit": {run: (*h2i).cmdQuit}, + "headers": {run: (*h2i).cmdHeaders}, +} + +func usage() { + fmt.Fprintf(os.Stderr, "Usage: h2i \n\n") + flag.PrintDefaults() +} + +// withPort adds ":443" if another port isn't already present. +func withPort(host string) string { + if _, _, err := net.SplitHostPort(host); err != nil { + return net.JoinHostPort(host, "443") + } + return host +} + +// withoutPort strips the port from addr if present. +func withoutPort(addr string) string { + if h, _, err := net.SplitHostPort(addr); err == nil { + return h + } + return addr +} + +// h2i is the app's state. +type h2i struct { + host string + tc *tls.Conn + framer *http2.Framer + term *terminal.Terminal + + // owned by the command loop: + streamID uint32 + hbuf bytes.Buffer + henc *hpack.Encoder + + // owned by the readFrames loop: + peerSetting map[http2.SettingID]uint32 + hdec *hpack.Decoder +} + +func main() { + flag.Usage = usage + flag.Parse() + if flag.NArg() != 1 { + usage() + os.Exit(2) + } + log.SetFlags(0) + + host := flag.Arg(0) + app := &h2i{ + host: host, + peerSetting: make(map[http2.SettingID]uint32), + } + app.henc = hpack.NewEncoder(&app.hbuf) + + if err := app.Main(); err != nil { + if app.term != nil { + app.logf("%v\n", err) + } else { + fmt.Fprintf(os.Stderr, "%v\n", err) + } + os.Exit(1) + } + fmt.Fprintf(os.Stdout, "\n") +} + +func (app *h2i) Main() error { + cfg := &tls.Config{ + ServerName: withoutPort(app.host), + NextProtos: strings.Split(*flagNextProto, ","), + InsecureSkipVerify: *flagInsecure, + } + + hostAndPort := *flagDial + if hostAndPort == "" { + hostAndPort = withPort(app.host) + } + log.Printf("Connecting to %s ...", hostAndPort) + tc, err := tls.Dial("tcp", hostAndPort, cfg) + if err != nil { + return fmt.Errorf("Error dialing %s: %v", hostAndPort, err) + } + log.Printf("Connected to %v", tc.RemoteAddr()) + defer tc.Close() + + if err := tc.Handshake(); err != nil { + return fmt.Errorf("TLS handshake: %v", err) + } + if !*flagInsecure { + if err := tc.VerifyHostname(app.host); err != nil { + return fmt.Errorf("VerifyHostname: %v", err) + } + } + state := tc.ConnectionState() + log.Printf("Negotiated protocol %q", state.NegotiatedProtocol) + if !state.NegotiatedProtocolIsMutual || state.NegotiatedProtocol == "" { + return fmt.Errorf("Could not negotiate protocol mutually") + } + + if _, err := io.WriteString(tc, http2.ClientPreface); err != nil { + return err + } + + app.framer = http2.NewFramer(tc, tc) + + oldState, err := terminal.MakeRaw(int(os.Stdin.Fd())) + if err != nil { + return err + } + defer terminal.Restore(0, oldState) + + var screen = struct { + io.Reader + io.Writer + }{os.Stdin, os.Stdout} + + app.term = terminal.NewTerminal(screen, "h2i> ") + lastWord := regexp.MustCompile(`.+\W(\w+)$`) + app.term.AutoCompleteCallback = func(line string, pos int, key rune) (newLine string, newPos int, ok bool) { + if key != '\t' { + return + } + if pos != len(line) { + // TODO: we're being lazy for now, only supporting tab completion at the end. + return + } + // Auto-complete for the command itself. + if !strings.Contains(line, " ") { + var name string + name, _, ok = lookupCommand(line) + if !ok { + return + } + return name, len(name), true + } + _, c, ok := lookupCommand(line[:strings.IndexByte(line, ' ')]) + if !ok || c.complete == nil { + return + } + if strings.HasSuffix(line, " ") { + app.logf("%s", strings.Join(c.complete(), " ")) + return line, pos, true + } + m := lastWord.FindStringSubmatch(line) + if m == nil { + return line, len(line), true + } + soFar := m[1] + var match []string + for _, cand := range c.complete() { + if len(soFar) > len(cand) || !strings.EqualFold(cand[:len(soFar)], soFar) { + continue + } + match = append(match, cand) + } + if len(match) == 0 { + return + } + if len(match) > 1 { + // TODO: auto-complete any common prefix + app.logf("%s", strings.Join(match, " ")) + return line, pos, true + } + newLine = line[:len(line)-len(soFar)] + match[0] + return newLine, len(newLine), true + + } + + errc := make(chan error, 2) + go func() { errc <- app.readFrames() }() + go func() { errc <- app.readConsole() }() + return <-errc +} + +func (app *h2i) logf(format string, args ...interface{}) { + fmt.Fprintf(app.term, format+"\r\n", args...) +} + +func (app *h2i) readConsole() error { + if s := *flagSettings; s != "omit" { + var args []string + if s != "empty" { + args = strings.Split(s, ",") + } + _, c, ok := lookupCommand("settings") + if !ok { + panic("settings command not found") + } + c.run(app, args) + } + + for { + line, err := app.term.ReadLine() + if err == io.EOF { + return nil + } + if err != nil { + return fmt.Errorf("terminal.ReadLine: %v", err) + } + f := strings.Fields(line) + if len(f) == 0 { + continue + } + cmd, args := f[0], f[1:] + if _, c, ok := lookupCommand(cmd); ok { + err = c.run(app, args) + } else { + app.logf("Unknown command %q", line) + } + if err == errExitApp { + return nil + } + if err != nil { + return err + } + } +} + +func lookupCommand(prefix string) (name string, c command, ok bool) { + prefix = strings.ToLower(prefix) + if c, ok = commands[prefix]; ok { + return prefix, c, ok + } + + for full, candidate := range commands { + if strings.HasPrefix(full, prefix) { + if c.run != nil { + return "", command{}, false // ambiguous + } + c = candidate + name = full + } + } + return name, c, c.run != nil +} + +var errExitApp = errors.New("internal sentinel error value to quit the console reading loop") + +func (a *h2i) cmdQuit(args []string) error { + if len(args) > 0 { + a.logf("the QUIT command takes no argument") + return nil + } + return errExitApp +} + +func (a *h2i) cmdSettings(args []string) error { + if len(args) == 1 && strings.EqualFold(args[0], "ACK") { + return a.framer.WriteSettingsAck() + } + var settings []http2.Setting + for _, arg := range args { + if strings.EqualFold(arg, "ACK") { + a.logf("Error: ACK must be only argument with the SETTINGS command") + return nil + } + eq := strings.Index(arg, "=") + if eq == -1 { + a.logf("Error: invalid argument %q (expected SETTING_NAME=nnnn)", arg) + return nil + } + sid, ok := settingByName(arg[:eq]) + if !ok { + a.logf("Error: unknown setting name %q", arg[:eq]) + return nil + } + val, err := strconv.ParseUint(arg[eq+1:], 10, 32) + if err != nil { + a.logf("Error: invalid argument %q (expected SETTING_NAME=nnnn)", arg) + return nil + } + settings = append(settings, http2.Setting{ + ID: sid, + Val: uint32(val), + }) + } + a.logf("Sending: %v", settings) + return a.framer.WriteSettings(settings...) +} + +func settingByName(name string) (http2.SettingID, bool) { + for _, sid := range [...]http2.SettingID{ + http2.SettingHeaderTableSize, + http2.SettingEnablePush, + http2.SettingMaxConcurrentStreams, + http2.SettingInitialWindowSize, + http2.SettingMaxFrameSize, + http2.SettingMaxHeaderListSize, + } { + if strings.EqualFold(sid.String(), name) { + return sid, true + } + } + return 0, false +} + +func (app *h2i) cmdPing(args []string) error { + if len(args) > 1 { + app.logf("invalid PING usage: only accepts 0 or 1 args") + return nil // nil means don't end the program + } + var data [8]byte + if len(args) == 1 { + copy(data[:], args[0]) + } else { + copy(data[:], "h2i_ping") + } + return app.framer.WritePing(false, data) +} + +func (app *h2i) cmdHeaders(args []string) error { + if len(args) > 0 { + app.logf("Error: HEADERS doesn't yet take arguments.") + // TODO: flags for restricting window size, to force CONTINUATION + // frames. + return nil + } + var h1req bytes.Buffer + app.term.SetPrompt("(as HTTP/1.1)> ") + defer app.term.SetPrompt("h2i> ") + for { + line, err := app.term.ReadLine() + if err != nil { + return err + } + h1req.WriteString(line) + h1req.WriteString("\r\n") + if line == "" { + break + } + } + req, err := http.ReadRequest(bufio.NewReader(&h1req)) + if err != nil { + app.logf("Invalid HTTP/1.1 request: %v", err) + return nil + } + if app.streamID == 0 { + app.streamID = 1 + } else { + app.streamID += 2 + } + app.logf("Opening Stream-ID %d:", app.streamID) + hbf := app.encodeHeaders(req) + if len(hbf) > 16<<10 { + app.logf("TODO: h2i doesn't yet write CONTINUATION frames. Copy it from transport.go") + return nil + } + return app.framer.WriteHeaders(http2.HeadersFrameParam{ + StreamID: app.streamID, + BlockFragment: hbf, + EndStream: req.Method == "GET" || req.Method == "HEAD", // good enough for now + EndHeaders: true, // for now + }) +} + +func (app *h2i) readFrames() error { + for { + f, err := app.framer.ReadFrame() + if err != nil { + return fmt.Errorf("ReadFrame: %v", err) + } + app.logf("%v", f) + switch f := f.(type) { + case *http2.PingFrame: + app.logf(" Data = %q", f.Data) + case *http2.SettingsFrame: + f.ForeachSetting(func(s http2.Setting) error { + app.logf(" %v", s) + app.peerSetting[s.ID] = s.Val + return nil + }) + case *http2.WindowUpdateFrame: + app.logf(" Window-Increment = %v", f.Increment) + case *http2.GoAwayFrame: + app.logf(" Last-Stream-ID = %d; Error-Code = %v (%d)", f.LastStreamID, f.ErrCode, f.ErrCode) + case *http2.DataFrame: + app.logf(" %q", f.Data()) + case *http2.HeadersFrame: + if f.HasPriority() { + app.logf(" PRIORITY = %v", f.Priority) + } + if app.hdec == nil { + // TODO: if the user uses h2i to send a SETTINGS frame advertising + // something larger, we'll need to respect SETTINGS_HEADER_TABLE_SIZE + // and stuff here instead of using the 4k default. But for now: + tableSize := uint32(4 << 10) + app.hdec = hpack.NewDecoder(tableSize, app.onNewHeaderField) + } + app.hdec.Write(f.HeaderBlockFragment()) + case *http2.PushPromiseFrame: + if app.hdec == nil { + // TODO: if the user uses h2i to send a SETTINGS frame advertising + // something larger, we'll need to respect SETTINGS_HEADER_TABLE_SIZE + // and stuff here instead of using the 4k default. But for now: + tableSize := uint32(4 << 10) + app.hdec = hpack.NewDecoder(tableSize, app.onNewHeaderField) + } + app.hdec.Write(f.HeaderBlockFragment()) + } + } +} + +// called from readLoop +func (app *h2i) onNewHeaderField(f hpack.HeaderField) { + if f.Sensitive { + app.logf(" %s = %q (SENSITIVE)", f.Name, f.Value) + } + app.logf(" %s = %q", f.Name, f.Value) +} + +func (app *h2i) encodeHeaders(req *http.Request) []byte { + app.hbuf.Reset() + + // TODO(bradfitz): figure out :authority-vs-Host stuff between http2 and Go + host := req.Host + if host == "" { + host = req.URL.Host + } + + path := req.RequestURI + if path == "" { + path = "/" + } + + app.writeHeader(":authority", host) // probably not right for all sites + app.writeHeader(":method", req.Method) + app.writeHeader(":path", path) + app.writeHeader(":scheme", "https") + + for k, vv := range req.Header { + lowKey := strings.ToLower(k) + if lowKey == "host" { + continue + } + for _, v := range vv { + app.writeHeader(lowKey, v) + } + } + return app.hbuf.Bytes() +} + +func (app *h2i) writeHeader(name, value string) { + app.henc.WriteField(hpack.HeaderField{Name: name, Value: value}) + app.logf(" %s = %s", name, value) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/headermap.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/headermap.go new file mode 100644 index 0000000..c2805f6 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/headermap.go @@ -0,0 +1,78 @@ +// 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 http2 + +import ( + "net/http" + "strings" +) + +var ( + commonLowerHeader = map[string]string{} // Go-Canonical-Case -> lower-case + commonCanonHeader = map[string]string{} // lower-case -> Go-Canonical-Case +) + +func init() { + for _, v := range []string{ + "accept", + "accept-charset", + "accept-encoding", + "accept-language", + "accept-ranges", + "age", + "access-control-allow-origin", + "allow", + "authorization", + "cache-control", + "content-disposition", + "content-encoding", + "content-language", + "content-length", + "content-location", + "content-range", + "content-type", + "cookie", + "date", + "etag", + "expect", + "expires", + "from", + "host", + "if-match", + "if-modified-since", + "if-none-match", + "if-unmodified-since", + "last-modified", + "link", + "location", + "max-forwards", + "proxy-authenticate", + "proxy-authorization", + "range", + "referer", + "refresh", + "retry-after", + "server", + "set-cookie", + "strict-transport-security", + "trailer", + "transfer-encoding", + "user-agent", + "vary", + "via", + "www-authenticate", + } { + chk := http.CanonicalHeaderKey(v) + commonLowerHeader[chk] = v + commonCanonHeader[v] = chk + } +} + +func lowerHeader(v string) string { + if s, ok := commonLowerHeader[v]; ok { + return s + } + return strings.ToLower(v) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/hpack/encode.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/hpack/encode.go new file mode 100644 index 0000000..54726c2 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/hpack/encode.go @@ -0,0 +1,240 @@ +// 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 hpack + +import ( + "io" +) + +const ( + uint32Max = ^uint32(0) + initialHeaderTableSize = 4096 +) + +type Encoder struct { + dynTab dynamicTable + // minSize is the minimum table size set by + // SetMaxDynamicTableSize after the previous Header Table Size + // Update. + minSize uint32 + // maxSizeLimit is the maximum table size this encoder + // supports. This will protect the encoder from too large + // size. + maxSizeLimit uint32 + // tableSizeUpdate indicates whether "Header Table Size + // Update" is required. + tableSizeUpdate bool + w io.Writer + buf []byte +} + +// NewEncoder returns a new Encoder which performs HPACK encoding. An +// encoded data is written to w. +func NewEncoder(w io.Writer) *Encoder { + e := &Encoder{ + minSize: uint32Max, + maxSizeLimit: initialHeaderTableSize, + tableSizeUpdate: false, + w: w, + } + e.dynTab.table.init() + e.dynTab.setMaxSize(initialHeaderTableSize) + return e +} + +// WriteField encodes f into a single Write to e's underlying Writer. +// This function may also produce bytes for "Header Table Size Update" +// if necessary. If produced, it is done before encoding f. +func (e *Encoder) WriteField(f HeaderField) error { + e.buf = e.buf[:0] + + if e.tableSizeUpdate { + e.tableSizeUpdate = false + if e.minSize < e.dynTab.maxSize { + e.buf = appendTableSize(e.buf, e.minSize) + } + e.minSize = uint32Max + e.buf = appendTableSize(e.buf, e.dynTab.maxSize) + } + + idx, nameValueMatch := e.searchTable(f) + if nameValueMatch { + e.buf = appendIndexed(e.buf, idx) + } else { + indexing := e.shouldIndex(f) + if indexing { + e.dynTab.add(f) + } + + if idx == 0 { + e.buf = appendNewName(e.buf, f, indexing) + } else { + e.buf = appendIndexedName(e.buf, f, idx, indexing) + } + } + n, err := e.w.Write(e.buf) + if err == nil && n != len(e.buf) { + err = io.ErrShortWrite + } + return err +} + +// searchTable searches f in both stable and dynamic header tables. +// The static header table is searched first. Only when there is no +// exact match for both name and value, the dynamic header table is +// then searched. If there is no match, i is 0. If both name and value +// match, i is the matched index and nameValueMatch becomes true. If +// only name matches, i points to that index and nameValueMatch +// becomes false. +func (e *Encoder) searchTable(f HeaderField) (i uint64, nameValueMatch bool) { + i, nameValueMatch = staticTable.search(f) + if nameValueMatch { + return i, true + } + + j, nameValueMatch := e.dynTab.table.search(f) + if nameValueMatch || (i == 0 && j != 0) { + return j + uint64(staticTable.len()), nameValueMatch + } + + return i, false +} + +// SetMaxDynamicTableSize changes the dynamic header table size to v. +// The actual size is bounded by the value passed to +// SetMaxDynamicTableSizeLimit. +func (e *Encoder) SetMaxDynamicTableSize(v uint32) { + if v > e.maxSizeLimit { + v = e.maxSizeLimit + } + if v < e.minSize { + e.minSize = v + } + e.tableSizeUpdate = true + e.dynTab.setMaxSize(v) +} + +// SetMaxDynamicTableSizeLimit changes the maximum value that can be +// specified in SetMaxDynamicTableSize to v. By default, it is set to +// 4096, which is the same size of the default dynamic header table +// size described in HPACK specification. If the current maximum +// dynamic header table size is strictly greater than v, "Header Table +// Size Update" will be done in the next WriteField call and the +// maximum dynamic header table size is truncated to v. +func (e *Encoder) SetMaxDynamicTableSizeLimit(v uint32) { + e.maxSizeLimit = v + if e.dynTab.maxSize > v { + e.tableSizeUpdate = true + e.dynTab.setMaxSize(v) + } +} + +// shouldIndex reports whether f should be indexed. +func (e *Encoder) shouldIndex(f HeaderField) bool { + return !f.Sensitive && f.Size() <= e.dynTab.maxSize +} + +// appendIndexed appends index i, as encoded in "Indexed Header Field" +// representation, to dst and returns the extended buffer. +func appendIndexed(dst []byte, i uint64) []byte { + first := len(dst) + dst = appendVarInt(dst, 7, i) + dst[first] |= 0x80 + return dst +} + +// appendNewName appends f, as encoded in one of "Literal Header field +// - New Name" representation variants, to dst and returns the +// extended buffer. +// +// If f.Sensitive is true, "Never Indexed" representation is used. If +// f.Sensitive is false and indexing is true, "Inremental Indexing" +// representation is used. +func appendNewName(dst []byte, f HeaderField, indexing bool) []byte { + dst = append(dst, encodeTypeByte(indexing, f.Sensitive)) + dst = appendHpackString(dst, f.Name) + return appendHpackString(dst, f.Value) +} + +// appendIndexedName appends f and index i referring indexed name +// entry, as encoded in one of "Literal Header field - Indexed Name" +// representation variants, to dst and returns the extended buffer. +// +// If f.Sensitive is true, "Never Indexed" representation is used. If +// f.Sensitive is false and indexing is true, "Incremental Indexing" +// representation is used. +func appendIndexedName(dst []byte, f HeaderField, i uint64, indexing bool) []byte { + first := len(dst) + var n byte + if indexing { + n = 6 + } else { + n = 4 + } + dst = appendVarInt(dst, n, i) + dst[first] |= encodeTypeByte(indexing, f.Sensitive) + return appendHpackString(dst, f.Value) +} + +// appendTableSize appends v, as encoded in "Header Table Size Update" +// representation, to dst and returns the extended buffer. +func appendTableSize(dst []byte, v uint32) []byte { + first := len(dst) + dst = appendVarInt(dst, 5, uint64(v)) + dst[first] |= 0x20 + return dst +} + +// appendVarInt appends i, as encoded in variable integer form using n +// bit prefix, to dst and returns the extended buffer. +// +// See +// http://http2.github.io/http2-spec/compression.html#integer.representation +func appendVarInt(dst []byte, n byte, i uint64) []byte { + k := uint64((1 << n) - 1) + if i < k { + return append(dst, byte(i)) + } + dst = append(dst, byte(k)) + i -= k + for ; i >= 128; i >>= 7 { + dst = append(dst, byte(0x80|(i&0x7f))) + } + return append(dst, byte(i)) +} + +// appendHpackString appends s, as encoded in "String Literal" +// representation, to dst and returns the the extended buffer. +// +// s will be encoded in Huffman codes only when it produces strictly +// shorter byte string. +func appendHpackString(dst []byte, s string) []byte { + huffmanLength := HuffmanEncodeLength(s) + if huffmanLength < uint64(len(s)) { + first := len(dst) + dst = appendVarInt(dst, 7, huffmanLength) + dst = AppendHuffmanString(dst, s) + dst[first] |= 0x80 + } else { + dst = appendVarInt(dst, 7, uint64(len(s))) + dst = append(dst, s...) + } + return dst +} + +// encodeTypeByte returns type byte. If sensitive is true, type byte +// for "Never Indexed" representation is returned. If sensitive is +// false and indexing is true, type byte for "Incremental Indexing" +// representation is returned. Otherwise, type byte for "Without +// Indexing" is returned. +func encodeTypeByte(indexing, sensitive bool) byte { + if sensitive { + return 0x10 + } + if indexing { + return 0x40 + } + return 0 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/hpack/encode_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/hpack/encode_test.go new file mode 100644 index 0000000..05f12db --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/hpack/encode_test.go @@ -0,0 +1,386 @@ +// 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 hpack + +import ( + "bytes" + "encoding/hex" + "fmt" + "math/rand" + "reflect" + "strings" + "testing" +) + +func TestEncoderTableSizeUpdate(t *testing.T) { + tests := []struct { + size1, size2 uint32 + wantHex string + }{ + // Should emit 2 table size updates (2048 and 4096) + {2048, 4096, "3fe10f 3fe11f 82"}, + + // Should emit 1 table size update (2048) + {16384, 2048, "3fe10f 82"}, + } + for _, tt := range tests { + var buf bytes.Buffer + e := NewEncoder(&buf) + e.SetMaxDynamicTableSize(tt.size1) + e.SetMaxDynamicTableSize(tt.size2) + if err := e.WriteField(pair(":method", "GET")); err != nil { + t.Fatal(err) + } + want := removeSpace(tt.wantHex) + if got := hex.EncodeToString(buf.Bytes()); got != want { + t.Errorf("e.SetDynamicTableSize %v, %v = %q; want %q", tt.size1, tt.size2, got, want) + } + } +} + +func TestEncoderWriteField(t *testing.T) { + var buf bytes.Buffer + e := NewEncoder(&buf) + var got []HeaderField + d := NewDecoder(4<<10, func(f HeaderField) { + got = append(got, f) + }) + + tests := []struct { + hdrs []HeaderField + }{ + {[]HeaderField{ + pair(":method", "GET"), + pair(":scheme", "http"), + pair(":path", "/"), + pair(":authority", "www.example.com"), + }}, + {[]HeaderField{ + pair(":method", "GET"), + pair(":scheme", "http"), + pair(":path", "/"), + pair(":authority", "www.example.com"), + pair("cache-control", "no-cache"), + }}, + {[]HeaderField{ + pair(":method", "GET"), + pair(":scheme", "https"), + pair(":path", "/index.html"), + pair(":authority", "www.example.com"), + pair("custom-key", "custom-value"), + }}, + } + for i, tt := range tests { + buf.Reset() + got = got[:0] + for _, hf := range tt.hdrs { + if err := e.WriteField(hf); err != nil { + t.Fatal(err) + } + } + _, err := d.Write(buf.Bytes()) + if err != nil { + t.Errorf("%d. Decoder Write = %v", i, err) + } + if !reflect.DeepEqual(got, tt.hdrs) { + t.Errorf("%d. Decoded %+v; want %+v", i, got, tt.hdrs) + } + } +} + +func TestEncoderSearchTable(t *testing.T) { + e := NewEncoder(nil) + + e.dynTab.add(pair("foo", "bar")) + e.dynTab.add(pair("blake", "miz")) + e.dynTab.add(pair(":method", "GET")) + + tests := []struct { + hf HeaderField + wantI uint64 + wantMatch bool + }{ + // Name and Value match + {pair("foo", "bar"), uint64(staticTable.len()) + 3, true}, + {pair("blake", "miz"), uint64(staticTable.len()) + 2, true}, + {pair(":method", "GET"), 2, true}, + + // Only name match because Sensitive == true. This is allowed to match + // any ":method" entry. The current implementation uses the last entry + // added in newStaticTable. + {HeaderField{":method", "GET", true}, 3, false}, + + // Only Name matches + {pair("foo", "..."), uint64(staticTable.len()) + 3, false}, + {pair("blake", "..."), uint64(staticTable.len()) + 2, false}, + // As before, this is allowed to match any ":method" entry. + {pair(":method", "..."), 3, false}, + + // None match + {pair("foo-", "bar"), 0, false}, + } + for _, tt := range tests { + if gotI, gotMatch := e.searchTable(tt.hf); gotI != tt.wantI || gotMatch != tt.wantMatch { + t.Errorf("d.search(%+v) = %v, %v; want %v, %v", tt.hf, gotI, gotMatch, tt.wantI, tt.wantMatch) + } + } +} + +func TestAppendVarInt(t *testing.T) { + tests := []struct { + n byte + i uint64 + want []byte + }{ + // Fits in a byte: + {1, 0, []byte{0}}, + {2, 2, []byte{2}}, + {3, 6, []byte{6}}, + {4, 14, []byte{14}}, + {5, 30, []byte{30}}, + {6, 62, []byte{62}}, + {7, 126, []byte{126}}, + {8, 254, []byte{254}}, + + // Multiple bytes: + {5, 1337, []byte{31, 154, 10}}, + } + for _, tt := range tests { + got := appendVarInt(nil, tt.n, tt.i) + if !bytes.Equal(got, tt.want) { + t.Errorf("appendVarInt(nil, %v, %v) = %v; want %v", tt.n, tt.i, got, tt.want) + } + } +} + +func TestAppendHpackString(t *testing.T) { + tests := []struct { + s, wantHex string + }{ + // Huffman encoded + {"www.example.com", "8c f1e3 c2e5 f23a 6ba0 ab90 f4ff"}, + + // Not Huffman encoded + {"a", "01 61"}, + + // zero length + {"", "00"}, + } + for _, tt := range tests { + want := removeSpace(tt.wantHex) + buf := appendHpackString(nil, tt.s) + if got := hex.EncodeToString(buf); want != got { + t.Errorf("appendHpackString(nil, %q) = %q; want %q", tt.s, got, want) + } + } +} + +func TestAppendIndexed(t *testing.T) { + tests := []struct { + i uint64 + wantHex string + }{ + // 1 byte + {1, "81"}, + {126, "fe"}, + + // 2 bytes + {127, "ff00"}, + {128, "ff01"}, + } + for _, tt := range tests { + want := removeSpace(tt.wantHex) + buf := appendIndexed(nil, tt.i) + if got := hex.EncodeToString(buf); want != got { + t.Errorf("appendIndex(nil, %v) = %q; want %q", tt.i, got, want) + } + } +} + +func TestAppendNewName(t *testing.T) { + tests := []struct { + f HeaderField + indexing bool + wantHex string + }{ + // Incremental indexing + {HeaderField{"custom-key", "custom-value", false}, true, "40 88 25a8 49e9 5ba9 7d7f 89 25a8 49e9 5bb8 e8b4 bf"}, + + // Without indexing + {HeaderField{"custom-key", "custom-value", false}, false, "00 88 25a8 49e9 5ba9 7d7f 89 25a8 49e9 5bb8 e8b4 bf"}, + + // Never indexed + {HeaderField{"custom-key", "custom-value", true}, true, "10 88 25a8 49e9 5ba9 7d7f 89 25a8 49e9 5bb8 e8b4 bf"}, + {HeaderField{"custom-key", "custom-value", true}, false, "10 88 25a8 49e9 5ba9 7d7f 89 25a8 49e9 5bb8 e8b4 bf"}, + } + for _, tt := range tests { + want := removeSpace(tt.wantHex) + buf := appendNewName(nil, tt.f, tt.indexing) + if got := hex.EncodeToString(buf); want != got { + t.Errorf("appendNewName(nil, %+v, %v) = %q; want %q", tt.f, tt.indexing, got, want) + } + } +} + +func TestAppendIndexedName(t *testing.T) { + tests := []struct { + f HeaderField + i uint64 + indexing bool + wantHex string + }{ + // Incremental indexing + {HeaderField{":status", "302", false}, 8, true, "48 82 6402"}, + + // Without indexing + {HeaderField{":status", "302", false}, 8, false, "08 82 6402"}, + + // Never indexed + {HeaderField{":status", "302", true}, 8, true, "18 82 6402"}, + {HeaderField{":status", "302", true}, 8, false, "18 82 6402"}, + } + for _, tt := range tests { + want := removeSpace(tt.wantHex) + buf := appendIndexedName(nil, tt.f, tt.i, tt.indexing) + if got := hex.EncodeToString(buf); want != got { + t.Errorf("appendIndexedName(nil, %+v, %v) = %q; want %q", tt.f, tt.indexing, got, want) + } + } +} + +func TestAppendTableSize(t *testing.T) { + tests := []struct { + i uint32 + wantHex string + }{ + // Fits into 1 byte + {30, "3e"}, + + // Extra byte + {31, "3f00"}, + {32, "3f01"}, + } + for _, tt := range tests { + want := removeSpace(tt.wantHex) + buf := appendTableSize(nil, tt.i) + if got := hex.EncodeToString(buf); want != got { + t.Errorf("appendTableSize(nil, %v) = %q; want %q", tt.i, got, want) + } + } +} + +func TestEncoderSetMaxDynamicTableSize(t *testing.T) { + var buf bytes.Buffer + e := NewEncoder(&buf) + tests := []struct { + v uint32 + wantUpdate bool + wantMinSize uint32 + wantMaxSize uint32 + }{ + // Set new table size to 2048 + {2048, true, 2048, 2048}, + + // Set new table size to 16384, but still limited to + // 4096 + {16384, true, 2048, 4096}, + } + for _, tt := range tests { + e.SetMaxDynamicTableSize(tt.v) + if got := e.tableSizeUpdate; tt.wantUpdate != got { + t.Errorf("e.tableSizeUpdate = %v; want %v", got, tt.wantUpdate) + } + if got := e.minSize; tt.wantMinSize != got { + t.Errorf("e.minSize = %v; want %v", got, tt.wantMinSize) + } + if got := e.dynTab.maxSize; tt.wantMaxSize != got { + t.Errorf("e.maxSize = %v; want %v", got, tt.wantMaxSize) + } + } +} + +func TestEncoderSetMaxDynamicTableSizeLimit(t *testing.T) { + e := NewEncoder(nil) + // 4095 < initialHeaderTableSize means maxSize is truncated to + // 4095. + e.SetMaxDynamicTableSizeLimit(4095) + if got, want := e.dynTab.maxSize, uint32(4095); got != want { + t.Errorf("e.dynTab.maxSize = %v; want %v", got, want) + } + if got, want := e.maxSizeLimit, uint32(4095); got != want { + t.Errorf("e.maxSizeLimit = %v; want %v", got, want) + } + if got, want := e.tableSizeUpdate, true; got != want { + t.Errorf("e.tableSizeUpdate = %v; want %v", got, want) + } + // maxSize will be truncated to maxSizeLimit + e.SetMaxDynamicTableSize(16384) + if got, want := e.dynTab.maxSize, uint32(4095); got != want { + t.Errorf("e.dynTab.maxSize = %v; want %v", got, want) + } + // 8192 > current maxSizeLimit, so maxSize does not change. + e.SetMaxDynamicTableSizeLimit(8192) + if got, want := e.dynTab.maxSize, uint32(4095); got != want { + t.Errorf("e.dynTab.maxSize = %v; want %v", got, want) + } + if got, want := e.maxSizeLimit, uint32(8192); got != want { + t.Errorf("e.maxSizeLimit = %v; want %v", got, want) + } +} + +func removeSpace(s string) string { + return strings.Replace(s, " ", "", -1) +} + +func BenchmarkEncoderSearchTable(b *testing.B) { + e := NewEncoder(nil) + + // A sample of possible header fields. + // This is not based on any actual data from HTTP/2 traces. + var possible []HeaderField + for _, f := range staticTable.ents { + if f.Value == "" { + possible = append(possible, f) + continue + } + // Generate 5 random values, except for cookie and set-cookie, + // which we know can have many values in practice. + num := 5 + if f.Name == "cookie" || f.Name == "set-cookie" { + num = 25 + } + for i := 0; i < num; i++ { + f.Value = fmt.Sprintf("%s-%d", f.Name, i) + possible = append(possible, f) + } + } + for k := 0; k < 10; k++ { + f := HeaderField{ + Name: fmt.Sprintf("x-header-%d", k), + Sensitive: rand.Int()%2 == 0, + } + for i := 0; i < 5; i++ { + f.Value = fmt.Sprintf("%s-%d", f.Name, i) + possible = append(possible, f) + } + } + + // Add a random sample to the dynamic table. This very loosely simulates + // a history of 100 requests with 20 header fields per request. + for r := 0; r < 100*20; r++ { + f := possible[rand.Int31n(int32(len(possible)))] + // Skip if this is in the staticTable verbatim. + if _, has := staticTable.search(f); !has { + e.dynTab.add(f) + } + } + + b.ResetTimer() + for n := 0; n < b.N; n++ { + for _, f := range possible { + e.searchTable(f) + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/hpack/hpack.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/hpack/hpack.go new file mode 100644 index 0000000..176644a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/hpack/hpack.go @@ -0,0 +1,490 @@ +// 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 hpack implements HPACK, a compression format for +// efficiently representing HTTP header fields in the context of HTTP/2. +// +// See http://tools.ietf.org/html/draft-ietf-httpbis-header-compression-09 +package hpack + +import ( + "bytes" + "errors" + "fmt" +) + +// A DecodingError is something the spec defines as a decoding error. +type DecodingError struct { + Err error +} + +func (de DecodingError) Error() string { + return fmt.Sprintf("decoding error: %v", de.Err) +} + +// An InvalidIndexError is returned when an encoder references a table +// entry before the static table or after the end of the dynamic table. +type InvalidIndexError int + +func (e InvalidIndexError) Error() string { + return fmt.Sprintf("invalid indexed representation index %d", int(e)) +} + +// A HeaderField is a name-value pair. Both the name and value are +// treated as opaque sequences of octets. +type HeaderField struct { + Name, Value string + + // Sensitive means that this header field should never be + // indexed. + Sensitive bool +} + +// IsPseudo reports whether the header field is an http2 pseudo header. +// That is, it reports whether it starts with a colon. +// It is not otherwise guaranteed to be a valid pseudo header field, +// though. +func (hf HeaderField) IsPseudo() bool { + return len(hf.Name) != 0 && hf.Name[0] == ':' +} + +func (hf HeaderField) String() string { + var suffix string + if hf.Sensitive { + suffix = " (sensitive)" + } + return fmt.Sprintf("header field %q = %q%s", hf.Name, hf.Value, suffix) +} + +// Size returns the size of an entry per RFC 7541 section 4.1. +func (hf HeaderField) Size() uint32 { + // http://http2.github.io/http2-spec/compression.html#rfc.section.4.1 + // "The size of the dynamic table is the sum of the size of + // its entries. The size of an entry is the sum of its name's + // length in octets (as defined in Section 5.2), its value's + // length in octets (see Section 5.2), plus 32. The size of + // an entry is calculated using the length of the name and + // value without any Huffman encoding applied." + + // This can overflow if somebody makes a large HeaderField + // Name and/or Value by hand, but we don't care, because that + // won't happen on the wire because the encoding doesn't allow + // it. + return uint32(len(hf.Name) + len(hf.Value) + 32) +} + +// A Decoder is the decoding context for incremental processing of +// header blocks. +type Decoder struct { + dynTab dynamicTable + emit func(f HeaderField) + + emitEnabled bool // whether calls to emit are enabled + maxStrLen int // 0 means unlimited + + // buf is the unparsed buffer. It's only written to + // saveBuf if it was truncated in the middle of a header + // block. Because it's usually not owned, we can only + // process it under Write. + buf []byte // not owned; only valid during Write + + // saveBuf is previous data passed to Write which we weren't able + // to fully parse before. Unlike buf, we own this data. + saveBuf bytes.Buffer +} + +// NewDecoder returns a new decoder with the provided maximum dynamic +// table size. The emitFunc will be called for each valid field +// parsed, in the same goroutine as calls to Write, before Write returns. +func NewDecoder(maxDynamicTableSize uint32, emitFunc func(f HeaderField)) *Decoder { + d := &Decoder{ + emit: emitFunc, + emitEnabled: true, + } + d.dynTab.table.init() + d.dynTab.allowedMaxSize = maxDynamicTableSize + d.dynTab.setMaxSize(maxDynamicTableSize) + return d +} + +// ErrStringLength is returned by Decoder.Write when the max string length +// (as configured by Decoder.SetMaxStringLength) would be violated. +var ErrStringLength = errors.New("hpack: string too long") + +// SetMaxStringLength sets the maximum size of a HeaderField name or +// value string. If a string exceeds this length (even after any +// decompression), Write will return ErrStringLength. +// A value of 0 means unlimited and is the default from NewDecoder. +func (d *Decoder) SetMaxStringLength(n int) { + d.maxStrLen = n +} + +// SetEmitFunc changes the callback used when new header fields +// are decoded. +// It must be non-nil. It does not affect EmitEnabled. +func (d *Decoder) SetEmitFunc(emitFunc func(f HeaderField)) { + d.emit = emitFunc +} + +// SetEmitEnabled controls whether the emitFunc provided to NewDecoder +// should be called. The default is true. +// +// This facility exists to let servers enforce MAX_HEADER_LIST_SIZE +// while still decoding and keeping in-sync with decoder state, but +// without doing unnecessary decompression or generating unnecessary +// garbage for header fields past the limit. +func (d *Decoder) SetEmitEnabled(v bool) { d.emitEnabled = v } + +// EmitEnabled reports whether calls to the emitFunc provided to NewDecoder +// are currently enabled. The default is true. +func (d *Decoder) EmitEnabled() bool { return d.emitEnabled } + +// TODO: add method *Decoder.Reset(maxSize, emitFunc) to let callers re-use Decoders and their +// underlying buffers for garbage reasons. + +func (d *Decoder) SetMaxDynamicTableSize(v uint32) { + d.dynTab.setMaxSize(v) +} + +// SetAllowedMaxDynamicTableSize sets the upper bound that the encoded +// stream (via dynamic table size updates) may set the maximum size +// to. +func (d *Decoder) SetAllowedMaxDynamicTableSize(v uint32) { + d.dynTab.allowedMaxSize = v +} + +type dynamicTable struct { + // http://http2.github.io/http2-spec/compression.html#rfc.section.2.3.2 + table headerFieldTable + size uint32 // in bytes + maxSize uint32 // current maxSize + allowedMaxSize uint32 // maxSize may go up to this, inclusive +} + +func (dt *dynamicTable) setMaxSize(v uint32) { + dt.maxSize = v + dt.evict() +} + +func (dt *dynamicTable) add(f HeaderField) { + dt.table.addEntry(f) + dt.size += f.Size() + dt.evict() +} + +// If we're too big, evict old stuff. +func (dt *dynamicTable) evict() { + var n int + for dt.size > dt.maxSize && n < dt.table.len() { + dt.size -= dt.table.ents[n].Size() + n++ + } + dt.table.evictOldest(n) +} + +func (d *Decoder) maxTableIndex() int { + // This should never overflow. RFC 7540 Section 6.5.2 limits the size of + // the dynamic table to 2^32 bytes, where each entry will occupy more than + // one byte. Further, the staticTable has a fixed, small length. + return d.dynTab.table.len() + staticTable.len() +} + +func (d *Decoder) at(i uint64) (hf HeaderField, ok bool) { + // See Section 2.3.3. + if i == 0 { + return + } + if i <= uint64(staticTable.len()) { + return staticTable.ents[i-1], true + } + if i > uint64(d.maxTableIndex()) { + return + } + // In the dynamic table, newer entries have lower indices. + // However, dt.ents[0] is the oldest entry. Hence, dt.ents is + // the reversed dynamic table. + dt := d.dynTab.table + return dt.ents[dt.len()-(int(i)-staticTable.len())], true +} + +// Decode decodes an entire block. +// +// TODO: remove this method and make it incremental later? This is +// easier for debugging now. +func (d *Decoder) DecodeFull(p []byte) ([]HeaderField, error) { + var hf []HeaderField + saveFunc := d.emit + defer func() { d.emit = saveFunc }() + d.emit = func(f HeaderField) { hf = append(hf, f) } + if _, err := d.Write(p); err != nil { + return nil, err + } + if err := d.Close(); err != nil { + return nil, err + } + return hf, nil +} + +func (d *Decoder) Close() error { + if d.saveBuf.Len() > 0 { + d.saveBuf.Reset() + return DecodingError{errors.New("truncated headers")} + } + return nil +} + +func (d *Decoder) Write(p []byte) (n int, err error) { + if len(p) == 0 { + // Prevent state machine CPU attacks (making us redo + // work up to the point of finding out we don't have + // enough data) + return + } + // Only copy the data if we have to. Optimistically assume + // that p will contain a complete header block. + if d.saveBuf.Len() == 0 { + d.buf = p + } else { + d.saveBuf.Write(p) + d.buf = d.saveBuf.Bytes() + d.saveBuf.Reset() + } + + for len(d.buf) > 0 { + err = d.parseHeaderFieldRepr() + if err == errNeedMore { + // Extra paranoia, making sure saveBuf won't + // get too large. All the varint and string + // reading code earlier should already catch + // overlong things and return ErrStringLength, + // but keep this as a last resort. + const varIntOverhead = 8 // conservative + if d.maxStrLen != 0 && int64(len(d.buf)) > 2*(int64(d.maxStrLen)+varIntOverhead) { + return 0, ErrStringLength + } + d.saveBuf.Write(d.buf) + return len(p), nil + } + if err != nil { + break + } + } + return len(p), err +} + +// errNeedMore is an internal sentinel error value that means the +// buffer is truncated and we need to read more data before we can +// continue parsing. +var errNeedMore = errors.New("need more data") + +type indexType int + +const ( + indexedTrue indexType = iota + indexedFalse + indexedNever +) + +func (v indexType) indexed() bool { return v == indexedTrue } +func (v indexType) sensitive() bool { return v == indexedNever } + +// returns errNeedMore if there isn't enough data available. +// any other error is fatal. +// consumes d.buf iff it returns nil. +// precondition: must be called with len(d.buf) > 0 +func (d *Decoder) parseHeaderFieldRepr() error { + b := d.buf[0] + switch { + case b&128 != 0: + // Indexed representation. + // High bit set? + // http://http2.github.io/http2-spec/compression.html#rfc.section.6.1 + return d.parseFieldIndexed() + case b&192 == 64: + // 6.2.1 Literal Header Field with Incremental Indexing + // 0b10xxxxxx: top two bits are 10 + // http://http2.github.io/http2-spec/compression.html#rfc.section.6.2.1 + return d.parseFieldLiteral(6, indexedTrue) + case b&240 == 0: + // 6.2.2 Literal Header Field without Indexing + // 0b0000xxxx: top four bits are 0000 + // http://http2.github.io/http2-spec/compression.html#rfc.section.6.2.2 + return d.parseFieldLiteral(4, indexedFalse) + case b&240 == 16: + // 6.2.3 Literal Header Field never Indexed + // 0b0001xxxx: top four bits are 0001 + // http://http2.github.io/http2-spec/compression.html#rfc.section.6.2.3 + return d.parseFieldLiteral(4, indexedNever) + case b&224 == 32: + // 6.3 Dynamic Table Size Update + // Top three bits are '001'. + // http://http2.github.io/http2-spec/compression.html#rfc.section.6.3 + return d.parseDynamicTableSizeUpdate() + } + + return DecodingError{errors.New("invalid encoding")} +} + +// (same invariants and behavior as parseHeaderFieldRepr) +func (d *Decoder) parseFieldIndexed() error { + buf := d.buf + idx, buf, err := readVarInt(7, buf) + if err != nil { + return err + } + hf, ok := d.at(idx) + if !ok { + return DecodingError{InvalidIndexError(idx)} + } + d.buf = buf + return d.callEmit(HeaderField{Name: hf.Name, Value: hf.Value}) +} + +// (same invariants and behavior as parseHeaderFieldRepr) +func (d *Decoder) parseFieldLiteral(n uint8, it indexType) error { + buf := d.buf + nameIdx, buf, err := readVarInt(n, buf) + if err != nil { + return err + } + + var hf HeaderField + wantStr := d.emitEnabled || it.indexed() + if nameIdx > 0 { + ihf, ok := d.at(nameIdx) + if !ok { + return DecodingError{InvalidIndexError(nameIdx)} + } + hf.Name = ihf.Name + } else { + hf.Name, buf, err = d.readString(buf, wantStr) + if err != nil { + return err + } + } + hf.Value, buf, err = d.readString(buf, wantStr) + if err != nil { + return err + } + d.buf = buf + if it.indexed() { + d.dynTab.add(hf) + } + hf.Sensitive = it.sensitive() + return d.callEmit(hf) +} + +func (d *Decoder) callEmit(hf HeaderField) error { + if d.maxStrLen != 0 { + if len(hf.Name) > d.maxStrLen || len(hf.Value) > d.maxStrLen { + return ErrStringLength + } + } + if d.emitEnabled { + d.emit(hf) + } + return nil +} + +// (same invariants and behavior as parseHeaderFieldRepr) +func (d *Decoder) parseDynamicTableSizeUpdate() error { + buf := d.buf + size, buf, err := readVarInt(5, buf) + if err != nil { + return err + } + if size > uint64(d.dynTab.allowedMaxSize) { + return DecodingError{errors.New("dynamic table size update too large")} + } + d.dynTab.setMaxSize(uint32(size)) + d.buf = buf + return nil +} + +var errVarintOverflow = DecodingError{errors.New("varint integer overflow")} + +// readVarInt reads an unsigned variable length integer off the +// beginning of p. n is the parameter as described in +// http://http2.github.io/http2-spec/compression.html#rfc.section.5.1. +// +// n must always be between 1 and 8. +// +// The returned remain buffer is either a smaller suffix of p, or err != nil. +// The error is errNeedMore if p doesn't contain a complete integer. +func readVarInt(n byte, p []byte) (i uint64, remain []byte, err error) { + if n < 1 || n > 8 { + panic("bad n") + } + if len(p) == 0 { + return 0, p, errNeedMore + } + i = uint64(p[0]) + if n < 8 { + i &= (1 << uint64(n)) - 1 + } + if i < (1< 0 { + b := p[0] + p = p[1:] + i += uint64(b&127) << m + if b&128 == 0 { + return i, p, nil + } + m += 7 + if m >= 63 { // TODO: proper overflow check. making this up. + return 0, origP, errVarintOverflow + } + } + return 0, origP, errNeedMore +} + +// readString decodes an hpack string from p. +// +// wantStr is whether s will be used. If false, decompression and +// []byte->string garbage are skipped if s will be ignored +// anyway. This does mean that huffman decoding errors for non-indexed +// strings past the MAX_HEADER_LIST_SIZE are ignored, but the server +// is returning an error anyway, and because they're not indexed, the error +// won't affect the decoding state. +func (d *Decoder) readString(p []byte, wantStr bool) (s string, remain []byte, err error) { + if len(p) == 0 { + return "", p, errNeedMore + } + isHuff := p[0]&128 != 0 + strLen, p, err := readVarInt(7, p) + if err != nil { + return "", p, err + } + if d.maxStrLen != 0 && strLen > uint64(d.maxStrLen) { + return "", nil, ErrStringLength + } + if uint64(len(p)) < strLen { + return "", p, errNeedMore + } + if !isHuff { + if wantStr { + s = string(p[:strLen]) + } + return s, p[strLen:], nil + } + + if wantStr { + buf := bufPool.Get().(*bytes.Buffer) + buf.Reset() // don't trust others + defer bufPool.Put(buf) + if err := huffmanDecode(buf, d.maxStrLen, p[:strLen]); err != nil { + buf.Reset() + return "", nil, err + } + s = buf.String() + buf.Reset() // be nice to GC + } + return s, p[strLen:], nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/hpack/hpack_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/hpack/hpack_test.go new file mode 100644 index 0000000..bc7f476 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/hpack/hpack_test.go @@ -0,0 +1,722 @@ +// 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 hpack + +import ( + "bytes" + "encoding/hex" + "fmt" + "math/rand" + "reflect" + "strings" + "testing" + "time" +) + +func (d *Decoder) mustAt(idx int) HeaderField { + if hf, ok := d.at(uint64(idx)); !ok { + panic(fmt.Sprintf("bogus index %d", idx)) + } else { + return hf + } +} + +func TestDynamicTableAt(t *testing.T) { + d := NewDecoder(4096, nil) + at := d.mustAt + if got, want := at(2), (pair(":method", "GET")); got != want { + t.Errorf("at(2) = %v; want %v", got, want) + } + d.dynTab.add(pair("foo", "bar")) + d.dynTab.add(pair("blake", "miz")) + if got, want := at(staticTable.len()+1), (pair("blake", "miz")); got != want { + t.Errorf("at(dyn 1) = %v; want %v", got, want) + } + if got, want := at(staticTable.len()+2), (pair("foo", "bar")); got != want { + t.Errorf("at(dyn 2) = %v; want %v", got, want) + } + if got, want := at(3), (pair(":method", "POST")); got != want { + t.Errorf("at(3) = %v; want %v", got, want) + } +} + +func TestDynamicTableSizeEvict(t *testing.T) { + d := NewDecoder(4096, nil) + if want := uint32(0); d.dynTab.size != want { + t.Fatalf("size = %d; want %d", d.dynTab.size, want) + } + add := d.dynTab.add + add(pair("blake", "eats pizza")) + if want := uint32(15 + 32); d.dynTab.size != want { + t.Fatalf("after pizza, size = %d; want %d", d.dynTab.size, want) + } + add(pair("foo", "bar")) + if want := uint32(15 + 32 + 6 + 32); d.dynTab.size != want { + t.Fatalf("after foo bar, size = %d; want %d", d.dynTab.size, want) + } + d.dynTab.setMaxSize(15 + 32 + 1 /* slop */) + if want := uint32(6 + 32); d.dynTab.size != want { + t.Fatalf("after setMaxSize, size = %d; want %d", d.dynTab.size, want) + } + if got, want := d.mustAt(staticTable.len()+1), (pair("foo", "bar")); got != want { + t.Errorf("at(dyn 1) = %v; want %v", got, want) + } + add(pair("long", strings.Repeat("x", 500))) + if want := uint32(0); d.dynTab.size != want { + t.Fatalf("after big one, size = %d; want %d", d.dynTab.size, want) + } +} + +func TestDecoderDecode(t *testing.T) { + tests := []struct { + name string + in []byte + want []HeaderField + wantDynTab []HeaderField // newest entry first + }{ + // C.2.1 Literal Header Field with Indexing + // http://http2.github.io/http2-spec/compression.html#rfc.section.C.2.1 + {"C.2.1", dehex("400a 6375 7374 6f6d 2d6b 6579 0d63 7573 746f 6d2d 6865 6164 6572"), + []HeaderField{pair("custom-key", "custom-header")}, + []HeaderField{pair("custom-key", "custom-header")}, + }, + + // C.2.2 Literal Header Field without Indexing + // http://http2.github.io/http2-spec/compression.html#rfc.section.C.2.2 + {"C.2.2", dehex("040c 2f73 616d 706c 652f 7061 7468"), + []HeaderField{pair(":path", "/sample/path")}, + []HeaderField{}}, + + // C.2.3 Literal Header Field never Indexed + // http://http2.github.io/http2-spec/compression.html#rfc.section.C.2.3 + {"C.2.3", dehex("1008 7061 7373 776f 7264 0673 6563 7265 74"), + []HeaderField{{"password", "secret", true}}, + []HeaderField{}}, + + // C.2.4 Indexed Header Field + // http://http2.github.io/http2-spec/compression.html#rfc.section.C.2.4 + {"C.2.4", []byte("\x82"), + []HeaderField{pair(":method", "GET")}, + []HeaderField{}}, + } + for _, tt := range tests { + d := NewDecoder(4096, nil) + hf, err := d.DecodeFull(tt.in) + if err != nil { + t.Errorf("%s: %v", tt.name, err) + continue + } + if !reflect.DeepEqual(hf, tt.want) { + t.Errorf("%s: Got %v; want %v", tt.name, hf, tt.want) + } + gotDynTab := d.dynTab.reverseCopy() + if !reflect.DeepEqual(gotDynTab, tt.wantDynTab) { + t.Errorf("%s: dynamic table after = %v; want %v", tt.name, gotDynTab, tt.wantDynTab) + } + } +} + +func (dt *dynamicTable) reverseCopy() (hf []HeaderField) { + hf = make([]HeaderField, len(dt.table.ents)) + for i := range hf { + hf[i] = dt.table.ents[len(dt.table.ents)-1-i] + } + return +} + +type encAndWant struct { + enc []byte + want []HeaderField + wantDynTab []HeaderField + wantDynSize uint32 +} + +// C.3 Request Examples without Huffman Coding +// http://http2.github.io/http2-spec/compression.html#rfc.section.C.3 +func TestDecodeC3_NoHuffman(t *testing.T) { + testDecodeSeries(t, 4096, []encAndWant{ + {dehex("8286 8441 0f77 7777 2e65 7861 6d70 6c65 2e63 6f6d"), + []HeaderField{ + pair(":method", "GET"), + pair(":scheme", "http"), + pair(":path", "/"), + pair(":authority", "www.example.com"), + }, + []HeaderField{ + pair(":authority", "www.example.com"), + }, + 57, + }, + {dehex("8286 84be 5808 6e6f 2d63 6163 6865"), + []HeaderField{ + pair(":method", "GET"), + pair(":scheme", "http"), + pair(":path", "/"), + pair(":authority", "www.example.com"), + pair("cache-control", "no-cache"), + }, + []HeaderField{ + pair("cache-control", "no-cache"), + pair(":authority", "www.example.com"), + }, + 110, + }, + {dehex("8287 85bf 400a 6375 7374 6f6d 2d6b 6579 0c63 7573 746f 6d2d 7661 6c75 65"), + []HeaderField{ + pair(":method", "GET"), + pair(":scheme", "https"), + pair(":path", "/index.html"), + pair(":authority", "www.example.com"), + pair("custom-key", "custom-value"), + }, + []HeaderField{ + pair("custom-key", "custom-value"), + pair("cache-control", "no-cache"), + pair(":authority", "www.example.com"), + }, + 164, + }, + }) +} + +// C.4 Request Examples with Huffman Coding +// http://http2.github.io/http2-spec/compression.html#rfc.section.C.4 +func TestDecodeC4_Huffman(t *testing.T) { + testDecodeSeries(t, 4096, []encAndWant{ + {dehex("8286 8441 8cf1 e3c2 e5f2 3a6b a0ab 90f4 ff"), + []HeaderField{ + pair(":method", "GET"), + pair(":scheme", "http"), + pair(":path", "/"), + pair(":authority", "www.example.com"), + }, + []HeaderField{ + pair(":authority", "www.example.com"), + }, + 57, + }, + {dehex("8286 84be 5886 a8eb 1064 9cbf"), + []HeaderField{ + pair(":method", "GET"), + pair(":scheme", "http"), + pair(":path", "/"), + pair(":authority", "www.example.com"), + pair("cache-control", "no-cache"), + }, + []HeaderField{ + pair("cache-control", "no-cache"), + pair(":authority", "www.example.com"), + }, + 110, + }, + {dehex("8287 85bf 4088 25a8 49e9 5ba9 7d7f 8925 a849 e95b b8e8 b4bf"), + []HeaderField{ + pair(":method", "GET"), + pair(":scheme", "https"), + pair(":path", "/index.html"), + pair(":authority", "www.example.com"), + pair("custom-key", "custom-value"), + }, + []HeaderField{ + pair("custom-key", "custom-value"), + pair("cache-control", "no-cache"), + pair(":authority", "www.example.com"), + }, + 164, + }, + }) +} + +// http://http2.github.io/http2-spec/compression.html#rfc.section.C.5 +// "This section shows several consecutive header lists, corresponding +// to HTTP responses, on the same connection. The HTTP/2 setting +// parameter SETTINGS_HEADER_TABLE_SIZE is set to the value of 256 +// octets, causing some evictions to occur." +func TestDecodeC5_ResponsesNoHuff(t *testing.T) { + testDecodeSeries(t, 256, []encAndWant{ + {dehex(` +4803 3330 3258 0770 7269 7661 7465 611d +4d6f 6e2c 2032 3120 4f63 7420 3230 3133 +2032 303a 3133 3a32 3120 474d 546e 1768 +7474 7073 3a2f 2f77 7777 2e65 7861 6d70 +6c65 2e63 6f6d +`), + []HeaderField{ + pair(":status", "302"), + pair("cache-control", "private"), + pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"), + pair("location", "https://www.example.com"), + }, + []HeaderField{ + pair("location", "https://www.example.com"), + pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"), + pair("cache-control", "private"), + pair(":status", "302"), + }, + 222, + }, + {dehex("4803 3330 37c1 c0bf"), + []HeaderField{ + pair(":status", "307"), + pair("cache-control", "private"), + pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"), + pair("location", "https://www.example.com"), + }, + []HeaderField{ + pair(":status", "307"), + pair("location", "https://www.example.com"), + pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"), + pair("cache-control", "private"), + }, + 222, + }, + {dehex(` +88c1 611d 4d6f 6e2c 2032 3120 4f63 7420 +3230 3133 2032 303a 3133 3a32 3220 474d +54c0 5a04 677a 6970 7738 666f 6f3d 4153 +444a 4b48 514b 425a 584f 5157 454f 5049 +5541 5851 5745 4f49 553b 206d 6178 2d61 +6765 3d33 3630 303b 2076 6572 7369 6f6e +3d31 +`), + []HeaderField{ + pair(":status", "200"), + pair("cache-control", "private"), + pair("date", "Mon, 21 Oct 2013 20:13:22 GMT"), + pair("location", "https://www.example.com"), + pair("content-encoding", "gzip"), + pair("set-cookie", "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1"), + }, + []HeaderField{ + pair("set-cookie", "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1"), + pair("content-encoding", "gzip"), + pair("date", "Mon, 21 Oct 2013 20:13:22 GMT"), + }, + 215, + }, + }) +} + +// http://http2.github.io/http2-spec/compression.html#rfc.section.C.6 +// "This section shows the same examples as the previous section, but +// using Huffman encoding for the literal values. The HTTP/2 setting +// parameter SETTINGS_HEADER_TABLE_SIZE is set to the value of 256 +// octets, causing some evictions to occur. The eviction mechanism +// uses the length of the decoded literal values, so the same +// evictions occurs as in the previous section." +func TestDecodeC6_ResponsesHuffman(t *testing.T) { + testDecodeSeries(t, 256, []encAndWant{ + {dehex(` +4882 6402 5885 aec3 771a 4b61 96d0 7abe +9410 54d4 44a8 2005 9504 0b81 66e0 82a6 +2d1b ff6e 919d 29ad 1718 63c7 8f0b 97c8 +e9ae 82ae 43d3 +`), + []HeaderField{ + pair(":status", "302"), + pair("cache-control", "private"), + pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"), + pair("location", "https://www.example.com"), + }, + []HeaderField{ + pair("location", "https://www.example.com"), + pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"), + pair("cache-control", "private"), + pair(":status", "302"), + }, + 222, + }, + {dehex("4883 640e ffc1 c0bf"), + []HeaderField{ + pair(":status", "307"), + pair("cache-control", "private"), + pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"), + pair("location", "https://www.example.com"), + }, + []HeaderField{ + pair(":status", "307"), + pair("location", "https://www.example.com"), + pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"), + pair("cache-control", "private"), + }, + 222, + }, + {dehex(` +88c1 6196 d07a be94 1054 d444 a820 0595 +040b 8166 e084 a62d 1bff c05a 839b d9ab +77ad 94e7 821d d7f2 e6c7 b335 dfdf cd5b +3960 d5af 2708 7f36 72c1 ab27 0fb5 291f +9587 3160 65c0 03ed 4ee5 b106 3d50 07 +`), + []HeaderField{ + pair(":status", "200"), + pair("cache-control", "private"), + pair("date", "Mon, 21 Oct 2013 20:13:22 GMT"), + pair("location", "https://www.example.com"), + pair("content-encoding", "gzip"), + pair("set-cookie", "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1"), + }, + []HeaderField{ + pair("set-cookie", "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1"), + pair("content-encoding", "gzip"), + pair("date", "Mon, 21 Oct 2013 20:13:22 GMT"), + }, + 215, + }, + }) +} + +func testDecodeSeries(t *testing.T, size uint32, steps []encAndWant) { + d := NewDecoder(size, nil) + for i, step := range steps { + hf, err := d.DecodeFull(step.enc) + if err != nil { + t.Fatalf("Error at step index %d: %v", i, err) + } + if !reflect.DeepEqual(hf, step.want) { + t.Fatalf("At step index %d: Got headers %v; want %v", i, hf, step.want) + } + gotDynTab := d.dynTab.reverseCopy() + if !reflect.DeepEqual(gotDynTab, step.wantDynTab) { + t.Errorf("After step index %d, dynamic table = %v; want %v", i, gotDynTab, step.wantDynTab) + } + if d.dynTab.size != step.wantDynSize { + t.Errorf("After step index %d, dynamic table size = %v; want %v", i, d.dynTab.size, step.wantDynSize) + } + } +} + +func TestHuffmanDecodeExcessPadding(t *testing.T) { + tests := [][]byte{ + {0xff}, // Padding Exceeds 7 bits + {0x1f, 0xff}, // {"a", 1 byte excess padding} + {0x1f, 0xff, 0xff}, // {"a", 2 byte excess padding} + {0x1f, 0xff, 0xff, 0xff}, // {"a", 3 byte excess padding} + {0xff, 0x9f, 0xff, 0xff, 0xff}, // {"a", 29 bit excess padding} + {'R', 0xbc, '0', 0xff, 0xff, 0xff, 0xff}, // Padding ends on partial symbol. + } + for i, in := range tests { + var buf bytes.Buffer + if _, err := HuffmanDecode(&buf, in); err != ErrInvalidHuffman { + t.Errorf("test-%d: decode(%q) = %v; want ErrInvalidHuffman", i, in, err) + } + } +} + +func TestHuffmanDecodeEOS(t *testing.T) { + in := []byte{0xff, 0xff, 0xff, 0xff, 0xfc} // {EOS, "?"} + var buf bytes.Buffer + if _, err := HuffmanDecode(&buf, in); err != ErrInvalidHuffman { + t.Errorf("error = %v; want ErrInvalidHuffman", err) + } +} + +func TestHuffmanDecodeMaxLengthOnTrailingByte(t *testing.T) { + in := []byte{0x00, 0x01} // {"0", "0", "0"} + var buf bytes.Buffer + if err := huffmanDecode(&buf, 2, in); err != ErrStringLength { + t.Errorf("error = %v; want ErrStringLength", err) + } +} + +func TestHuffmanDecodeCorruptPadding(t *testing.T) { + in := []byte{0x00} + var buf bytes.Buffer + if _, err := HuffmanDecode(&buf, in); err != ErrInvalidHuffman { + t.Errorf("error = %v; want ErrInvalidHuffman", err) + } +} + +func TestHuffmanDecode(t *testing.T) { + tests := []struct { + inHex, want string + }{ + {"f1e3 c2e5 f23a 6ba0 ab90 f4ff", "www.example.com"}, + {"a8eb 1064 9cbf", "no-cache"}, + {"25a8 49e9 5ba9 7d7f", "custom-key"}, + {"25a8 49e9 5bb8 e8b4 bf", "custom-value"}, + {"6402", "302"}, + {"aec3 771a 4b", "private"}, + {"d07a be94 1054 d444 a820 0595 040b 8166 e082 a62d 1bff", "Mon, 21 Oct 2013 20:13:21 GMT"}, + {"9d29 ad17 1863 c78f 0b97 c8e9 ae82 ae43 d3", "https://www.example.com"}, + {"9bd9 ab", "gzip"}, + {"94e7 821d d7f2 e6c7 b335 dfdf cd5b 3960 d5af 2708 7f36 72c1 ab27 0fb5 291f 9587 3160 65c0 03ed 4ee5 b106 3d50 07", + "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1"}, + } + for i, tt := range tests { + var buf bytes.Buffer + in, err := hex.DecodeString(strings.Replace(tt.inHex, " ", "", -1)) + if err != nil { + t.Errorf("%d. hex input error: %v", i, err) + continue + } + if _, err := HuffmanDecode(&buf, in); err != nil { + t.Errorf("%d. decode error: %v", i, err) + continue + } + if got := buf.String(); tt.want != got { + t.Errorf("%d. decode = %q; want %q", i, got, tt.want) + } + } +} + +func TestAppendHuffmanString(t *testing.T) { + tests := []struct { + in, want string + }{ + {"www.example.com", "f1e3 c2e5 f23a 6ba0 ab90 f4ff"}, + {"no-cache", "a8eb 1064 9cbf"}, + {"custom-key", "25a8 49e9 5ba9 7d7f"}, + {"custom-value", "25a8 49e9 5bb8 e8b4 bf"}, + {"302", "6402"}, + {"private", "aec3 771a 4b"}, + {"Mon, 21 Oct 2013 20:13:21 GMT", "d07a be94 1054 d444 a820 0595 040b 8166 e082 a62d 1bff"}, + {"https://www.example.com", "9d29 ad17 1863 c78f 0b97 c8e9 ae82 ae43 d3"}, + {"gzip", "9bd9 ab"}, + {"foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1", + "94e7 821d d7f2 e6c7 b335 dfdf cd5b 3960 d5af 2708 7f36 72c1 ab27 0fb5 291f 9587 3160 65c0 03ed 4ee5 b106 3d50 07"}, + } + for i, tt := range tests { + buf := []byte{} + want := strings.Replace(tt.want, " ", "", -1) + buf = AppendHuffmanString(buf, tt.in) + if got := hex.EncodeToString(buf); want != got { + t.Errorf("%d. encode = %q; want %q", i, got, want) + } + } +} + +func TestHuffmanMaxStrLen(t *testing.T) { + const msg = "Some string" + huff := AppendHuffmanString(nil, msg) + + testGood := func(max int) { + var out bytes.Buffer + if err := huffmanDecode(&out, max, huff); err != nil { + t.Errorf("For maxLen=%d, unexpected error: %v", max, err) + } + if out.String() != msg { + t.Errorf("For maxLen=%d, out = %q; want %q", max, out.String(), msg) + } + } + testGood(0) + testGood(len(msg)) + testGood(len(msg) + 1) + + var out bytes.Buffer + if err := huffmanDecode(&out, len(msg)-1, huff); err != ErrStringLength { + t.Errorf("err = %v; want ErrStringLength", err) + } +} + +func TestHuffmanRoundtripStress(t *testing.T) { + const Len = 50 // of uncompressed string + input := make([]byte, Len) + var output bytes.Buffer + var huff []byte + + n := 5000 + if testing.Short() { + n = 100 + } + seed := time.Now().UnixNano() + t.Logf("Seed = %v", seed) + src := rand.New(rand.NewSource(seed)) + var encSize int64 + for i := 0; i < n; i++ { + for l := range input { + input[l] = byte(src.Intn(256)) + } + huff = AppendHuffmanString(huff[:0], string(input)) + encSize += int64(len(huff)) + output.Reset() + if err := huffmanDecode(&output, 0, huff); err != nil { + t.Errorf("Failed to decode %q -> %q -> error %v", input, huff, err) + continue + } + if !bytes.Equal(output.Bytes(), input) { + t.Errorf("Roundtrip failure on %q -> %q -> %q", input, huff, output.Bytes()) + } + } + t.Logf("Compressed size of original: %0.02f%% (%v -> %v)", 100*(float64(encSize)/(Len*float64(n))), Len*n, encSize) +} + +func TestHuffmanDecodeFuzz(t *testing.T) { + const Len = 50 // of compressed + var buf, zbuf bytes.Buffer + + n := 5000 + if testing.Short() { + n = 100 + } + seed := time.Now().UnixNano() + t.Logf("Seed = %v", seed) + src := rand.New(rand.NewSource(seed)) + numFail := 0 + for i := 0; i < n; i++ { + zbuf.Reset() + if i == 0 { + // Start with at least one invalid one. + zbuf.WriteString("00\x91\xff\xff\xff\xff\xc8") + } else { + for l := 0; l < Len; l++ { + zbuf.WriteByte(byte(src.Intn(256))) + } + } + + buf.Reset() + if err := huffmanDecode(&buf, 0, zbuf.Bytes()); err != nil { + if err == ErrInvalidHuffman { + numFail++ + continue + } + t.Errorf("Failed to decode %q: %v", zbuf.Bytes(), err) + continue + } + } + t.Logf("%0.02f%% are invalid (%d / %d)", 100*float64(numFail)/float64(n), numFail, n) + if numFail < 1 { + t.Error("expected at least one invalid huffman encoding (test starts with one)") + } +} + +func TestReadVarInt(t *testing.T) { + type res struct { + i uint64 + consumed int + err error + } + tests := []struct { + n byte + p []byte + want res + }{ + // Fits in a byte: + {1, []byte{0}, res{0, 1, nil}}, + {2, []byte{2}, res{2, 1, nil}}, + {3, []byte{6}, res{6, 1, nil}}, + {4, []byte{14}, res{14, 1, nil}}, + {5, []byte{30}, res{30, 1, nil}}, + {6, []byte{62}, res{62, 1, nil}}, + {7, []byte{126}, res{126, 1, nil}}, + {8, []byte{254}, res{254, 1, nil}}, + + // Doesn't fit in a byte: + {1, []byte{1}, res{0, 0, errNeedMore}}, + {2, []byte{3}, res{0, 0, errNeedMore}}, + {3, []byte{7}, res{0, 0, errNeedMore}}, + {4, []byte{15}, res{0, 0, errNeedMore}}, + {5, []byte{31}, res{0, 0, errNeedMore}}, + {6, []byte{63}, res{0, 0, errNeedMore}}, + {7, []byte{127}, res{0, 0, errNeedMore}}, + {8, []byte{255}, res{0, 0, errNeedMore}}, + + // Ignoring top bits: + {5, []byte{255, 154, 10}, res{1337, 3, nil}}, // high dummy three bits: 111 + {5, []byte{159, 154, 10}, res{1337, 3, nil}}, // high dummy three bits: 100 + {5, []byte{191, 154, 10}, res{1337, 3, nil}}, // high dummy three bits: 101 + + // Extra byte: + {5, []byte{191, 154, 10, 2}, res{1337, 3, nil}}, // extra byte + + // Short a byte: + {5, []byte{191, 154}, res{0, 0, errNeedMore}}, + + // integer overflow: + {1, []byte{255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128}, res{0, 0, errVarintOverflow}}, + } + for _, tt := range tests { + i, remain, err := readVarInt(tt.n, tt.p) + consumed := len(tt.p) - len(remain) + got := res{i, consumed, err} + if got != tt.want { + t.Errorf("readVarInt(%d, %v ~ %x) = %+v; want %+v", tt.n, tt.p, tt.p, got, tt.want) + } + } +} + +// Fuzz crash, originally reported at https://github.com/bradfitz/http2/issues/56 +func TestHuffmanFuzzCrash(t *testing.T) { + got, err := HuffmanDecodeToString([]byte("00\x91\xff\xff\xff\xff\xc8")) + if got != "" { + t.Errorf("Got %q; want empty string", got) + } + if err != ErrInvalidHuffman { + t.Errorf("Err = %v; want ErrInvalidHuffman", err) + } +} + +func pair(name, value string) HeaderField { + return HeaderField{Name: name, Value: value} +} + +func dehex(s string) []byte { + s = strings.Replace(s, " ", "", -1) + s = strings.Replace(s, "\n", "", -1) + b, err := hex.DecodeString(s) + if err != nil { + panic(err) + } + return b +} + +func TestEmitEnabled(t *testing.T) { + var buf bytes.Buffer + enc := NewEncoder(&buf) + enc.WriteField(HeaderField{Name: "foo", Value: "bar"}) + enc.WriteField(HeaderField{Name: "foo", Value: "bar"}) + + numCallback := 0 + var dec *Decoder + dec = NewDecoder(8<<20, func(HeaderField) { + numCallback++ + dec.SetEmitEnabled(false) + }) + if !dec.EmitEnabled() { + t.Errorf("initial emit enabled = false; want true") + } + if _, err := dec.Write(buf.Bytes()); err != nil { + t.Error(err) + } + if numCallback != 1 { + t.Errorf("num callbacks = %d; want 1", numCallback) + } + if dec.EmitEnabled() { + t.Errorf("emit enabled = true; want false") + } +} + +func TestSaveBufLimit(t *testing.T) { + const maxStr = 1 << 10 + var got []HeaderField + dec := NewDecoder(initialHeaderTableSize, func(hf HeaderField) { + got = append(got, hf) + }) + dec.SetMaxStringLength(maxStr) + var frag []byte + frag = append(frag[:0], encodeTypeByte(false, false)) + frag = appendVarInt(frag, 7, 3) + frag = append(frag, "foo"...) + frag = appendVarInt(frag, 7, 3) + frag = append(frag, "bar"...) + + if _, err := dec.Write(frag); err != nil { + t.Fatal(err) + } + + want := []HeaderField{{Name: "foo", Value: "bar"}} + if !reflect.DeepEqual(got, want) { + t.Errorf("After small writes, got %v; want %v", got, want) + } + + frag = append(frag[:0], encodeTypeByte(false, false)) + frag = appendVarInt(frag, 7, maxStr*3) + frag = append(frag, make([]byte, maxStr*3)...) + + _, err := dec.Write(frag) + if err != ErrStringLength { + t.Fatalf("Write error = %v; want ErrStringLength", err) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/hpack/huffman.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/hpack/huffman.go new file mode 100644 index 0000000..8850e39 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/hpack/huffman.go @@ -0,0 +1,212 @@ +// 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 hpack + +import ( + "bytes" + "errors" + "io" + "sync" +) + +var bufPool = sync.Pool{ + New: func() interface{} { return new(bytes.Buffer) }, +} + +// HuffmanDecode decodes the string in v and writes the expanded +// result to w, returning the number of bytes written to w and the +// Write call's return value. At most one Write call is made. +func HuffmanDecode(w io.Writer, v []byte) (int, error) { + buf := bufPool.Get().(*bytes.Buffer) + buf.Reset() + defer bufPool.Put(buf) + if err := huffmanDecode(buf, 0, v); err != nil { + return 0, err + } + return w.Write(buf.Bytes()) +} + +// HuffmanDecodeToString decodes the string in v. +func HuffmanDecodeToString(v []byte) (string, error) { + buf := bufPool.Get().(*bytes.Buffer) + buf.Reset() + defer bufPool.Put(buf) + if err := huffmanDecode(buf, 0, v); err != nil { + return "", err + } + return buf.String(), nil +} + +// ErrInvalidHuffman is returned for errors found decoding +// Huffman-encoded strings. +var ErrInvalidHuffman = errors.New("hpack: invalid Huffman-encoded data") + +// huffmanDecode decodes v to buf. +// If maxLen is greater than 0, attempts to write more to buf than +// maxLen bytes will return ErrStringLength. +func huffmanDecode(buf *bytes.Buffer, maxLen int, v []byte) error { + n := rootHuffmanNode + // cur is the bit buffer that has not been fed into n. + // cbits is the number of low order bits in cur that are valid. + // sbits is the number of bits of the symbol prefix being decoded. + cur, cbits, sbits := uint(0), uint8(0), uint8(0) + for _, b := range v { + cur = cur<<8 | uint(b) + cbits += 8 + sbits += 8 + for cbits >= 8 { + idx := byte(cur >> (cbits - 8)) + n = n.children[idx] + if n == nil { + return ErrInvalidHuffman + } + if n.children == nil { + if maxLen != 0 && buf.Len() == maxLen { + return ErrStringLength + } + buf.WriteByte(n.sym) + cbits -= n.codeLen + n = rootHuffmanNode + sbits = cbits + } else { + cbits -= 8 + } + } + } + for cbits > 0 { + n = n.children[byte(cur<<(8-cbits))] + if n == nil { + return ErrInvalidHuffman + } + if n.children != nil || n.codeLen > cbits { + break + } + if maxLen != 0 && buf.Len() == maxLen { + return ErrStringLength + } + buf.WriteByte(n.sym) + cbits -= n.codeLen + n = rootHuffmanNode + sbits = cbits + } + if sbits > 7 { + // Either there was an incomplete symbol, or overlong padding. + // Both are decoding errors per RFC 7541 section 5.2. + return ErrInvalidHuffman + } + if mask := uint(1< 8 { + codeLen -= 8 + i := uint8(code >> codeLen) + if cur.children[i] == nil { + cur.children[i] = newInternalNode() + } + cur = cur.children[i] + } + shift := 8 - codeLen + start, end := int(uint8(code<> (nbits - rembits)) + dst[len(dst)-1] |= t + } + + return dst +} + +// HuffmanEncodeLength returns the number of bytes required to encode +// s in Huffman codes. The result is round up to byte boundary. +func HuffmanEncodeLength(s string) uint64 { + n := uint64(0) + for i := 0; i < len(s); i++ { + n += uint64(huffmanCodeLen[s[i]]) + } + return (n + 7) / 8 +} + +// appendByteToHuffmanCode appends Huffman code for c to dst and +// returns the extended buffer and the remaining bits in the last +// element. The appending is not byte aligned and the remaining bits +// in the last element of dst is given in rembits. +func appendByteToHuffmanCode(dst []byte, rembits uint8, c byte) ([]byte, uint8) { + code := huffmanCodes[c] + nbits := huffmanCodeLen[c] + + for { + if rembits > nbits { + t := uint8(code << (rembits - nbits)) + dst[len(dst)-1] |= t + rembits -= nbits + break + } + + t := uint8(code >> (nbits - rembits)) + dst[len(dst)-1] |= t + + nbits -= rembits + rembits = 8 + + if nbits == 0 { + break + } + + dst = append(dst, 0) + } + + return dst, rembits +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/hpack/tables.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/hpack/tables.go new file mode 100644 index 0000000..a66cfbe --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/hpack/tables.go @@ -0,0 +1,479 @@ +// 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 hpack + +import ( + "fmt" +) + +// headerFieldTable implements a list of HeaderFields. +// This is used to implement the static and dynamic tables. +type headerFieldTable struct { + // For static tables, entries are never evicted. + // + // For dynamic tables, entries are evicted from ents[0] and added to the end. + // Each entry has a unique id that starts at one and increments for each + // entry that is added. This unique id is stable across evictions, meaning + // it can be used as a pointer to a specific entry. As in hpack, unique ids + // are 1-based. The unique id for ents[k] is k + evictCount + 1. + // + // Zero is not a valid unique id. + // + // evictCount should not overflow in any remotely practical situation. In + // practice, we will have one dynamic table per HTTP/2 connection. If we + // assume a very powerful server that handles 1M QPS per connection and each + // request adds (then evicts) 100 entries from the table, it would still take + // 2M years for evictCount to overflow. + ents []HeaderField + evictCount uint64 + + // byName maps a HeaderField name to the unique id of the newest entry with + // the same name. See above for a definition of "unique id". + byName map[string]uint64 + + // byNameValue maps a HeaderField name/value pair to the unique id of the newest + // entry with the same name and value. See above for a definition of "unique id". + byNameValue map[pairNameValue]uint64 +} + +type pairNameValue struct { + name, value string +} + +func (t *headerFieldTable) init() { + t.byName = make(map[string]uint64) + t.byNameValue = make(map[pairNameValue]uint64) +} + +// len reports the number of entries in the table. +func (t *headerFieldTable) len() int { + return len(t.ents) +} + +// addEntry adds a new entry. +func (t *headerFieldTable) addEntry(f HeaderField) { + id := uint64(t.len()) + t.evictCount + 1 + t.byName[f.Name] = id + t.byNameValue[pairNameValue{f.Name, f.Value}] = id + t.ents = append(t.ents, f) +} + +// evictOldest evicts the n oldest entries in the table. +func (t *headerFieldTable) evictOldest(n int) { + if n > t.len() { + panic(fmt.Sprintf("evictOldest(%v) on table with %v entries", n, t.len())) + } + for k := 0; k < n; k++ { + f := t.ents[k] + id := t.evictCount + uint64(k) + 1 + if t.byName[f.Name] == id { + delete(t.byName, f.Name) + } + if p := (pairNameValue{f.Name, f.Value}); t.byNameValue[p] == id { + delete(t.byNameValue, p) + } + } + copy(t.ents, t.ents[n:]) + for k := t.len() - n; k < t.len(); k++ { + t.ents[k] = HeaderField{} // so strings can be garbage collected + } + t.ents = t.ents[:t.len()-n] + if t.evictCount+uint64(n) < t.evictCount { + panic("evictCount overflow") + } + t.evictCount += uint64(n) +} + +// search finds f in the table. If there is no match, i is 0. +// If both name and value match, i is the matched index and nameValueMatch +// becomes true. If only name matches, i points to that index and +// nameValueMatch becomes false. +// +// The returned index is a 1-based HPACK index. For dynamic tables, HPACK says +// that index 1 should be the newest entry, but t.ents[0] is the oldest entry, +// meaning t.ents is reversed for dynamic tables. Hence, when t is a dynamic +// table, the return value i actually refers to the entry t.ents[t.len()-i]. +// +// All tables are assumed to be a dynamic tables except for the global +// staticTable pointer. +// +// See Section 2.3.3. +func (t *headerFieldTable) search(f HeaderField) (i uint64, nameValueMatch bool) { + if !f.Sensitive { + if id := t.byNameValue[pairNameValue{f.Name, f.Value}]; id != 0 { + return t.idToIndex(id), true + } + } + if id := t.byName[f.Name]; id != 0 { + return t.idToIndex(id), false + } + return 0, false +} + +// idToIndex converts a unique id to an HPACK index. +// See Section 2.3.3. +func (t *headerFieldTable) idToIndex(id uint64) uint64 { + if id <= t.evictCount { + panic(fmt.Sprintf("id (%v) <= evictCount (%v)", id, t.evictCount)) + } + k := id - t.evictCount - 1 // convert id to an index t.ents[k] + if t != staticTable { + return uint64(t.len()) - k // dynamic table + } + return k + 1 +} + +// http://tools.ietf.org/html/draft-ietf-httpbis-header-compression-07#appendix-B +var staticTable = newStaticTable() +var staticTableEntries = [...]HeaderField{ + {Name: ":authority"}, + {Name: ":method", Value: "GET"}, + {Name: ":method", Value: "POST"}, + {Name: ":path", Value: "/"}, + {Name: ":path", Value: "/index.html"}, + {Name: ":scheme", Value: "http"}, + {Name: ":scheme", Value: "https"}, + {Name: ":status", Value: "200"}, + {Name: ":status", Value: "204"}, + {Name: ":status", Value: "206"}, + {Name: ":status", Value: "304"}, + {Name: ":status", Value: "400"}, + {Name: ":status", Value: "404"}, + {Name: ":status", Value: "500"}, + {Name: "accept-charset"}, + {Name: "accept-encoding", Value: "gzip, deflate"}, + {Name: "accept-language"}, + {Name: "accept-ranges"}, + {Name: "accept"}, + {Name: "access-control-allow-origin"}, + {Name: "age"}, + {Name: "allow"}, + {Name: "authorization"}, + {Name: "cache-control"}, + {Name: "content-disposition"}, + {Name: "content-encoding"}, + {Name: "content-language"}, + {Name: "content-length"}, + {Name: "content-location"}, + {Name: "content-range"}, + {Name: "content-type"}, + {Name: "cookie"}, + {Name: "date"}, + {Name: "etag"}, + {Name: "expect"}, + {Name: "expires"}, + {Name: "from"}, + {Name: "host"}, + {Name: "if-match"}, + {Name: "if-modified-since"}, + {Name: "if-none-match"}, + {Name: "if-range"}, + {Name: "if-unmodified-since"}, + {Name: "last-modified"}, + {Name: "link"}, + {Name: "location"}, + {Name: "max-forwards"}, + {Name: "proxy-authenticate"}, + {Name: "proxy-authorization"}, + {Name: "range"}, + {Name: "referer"}, + {Name: "refresh"}, + {Name: "retry-after"}, + {Name: "server"}, + {Name: "set-cookie"}, + {Name: "strict-transport-security"}, + {Name: "transfer-encoding"}, + {Name: "user-agent"}, + {Name: "vary"}, + {Name: "via"}, + {Name: "www-authenticate"}, +} + +func newStaticTable() *headerFieldTable { + t := &headerFieldTable{} + t.init() + for _, e := range staticTableEntries[:] { + t.addEntry(e) + } + return t +} + +var huffmanCodes = [256]uint32{ + 0x1ff8, + 0x7fffd8, + 0xfffffe2, + 0xfffffe3, + 0xfffffe4, + 0xfffffe5, + 0xfffffe6, + 0xfffffe7, + 0xfffffe8, + 0xffffea, + 0x3ffffffc, + 0xfffffe9, + 0xfffffea, + 0x3ffffffd, + 0xfffffeb, + 0xfffffec, + 0xfffffed, + 0xfffffee, + 0xfffffef, + 0xffffff0, + 0xffffff1, + 0xffffff2, + 0x3ffffffe, + 0xffffff3, + 0xffffff4, + 0xffffff5, + 0xffffff6, + 0xffffff7, + 0xffffff8, + 0xffffff9, + 0xffffffa, + 0xffffffb, + 0x14, + 0x3f8, + 0x3f9, + 0xffa, + 0x1ff9, + 0x15, + 0xf8, + 0x7fa, + 0x3fa, + 0x3fb, + 0xf9, + 0x7fb, + 0xfa, + 0x16, + 0x17, + 0x18, + 0x0, + 0x1, + 0x2, + 0x19, + 0x1a, + 0x1b, + 0x1c, + 0x1d, + 0x1e, + 0x1f, + 0x5c, + 0xfb, + 0x7ffc, + 0x20, + 0xffb, + 0x3fc, + 0x1ffa, + 0x21, + 0x5d, + 0x5e, + 0x5f, + 0x60, + 0x61, + 0x62, + 0x63, + 0x64, + 0x65, + 0x66, + 0x67, + 0x68, + 0x69, + 0x6a, + 0x6b, + 0x6c, + 0x6d, + 0x6e, + 0x6f, + 0x70, + 0x71, + 0x72, + 0xfc, + 0x73, + 0xfd, + 0x1ffb, + 0x7fff0, + 0x1ffc, + 0x3ffc, + 0x22, + 0x7ffd, + 0x3, + 0x23, + 0x4, + 0x24, + 0x5, + 0x25, + 0x26, + 0x27, + 0x6, + 0x74, + 0x75, + 0x28, + 0x29, + 0x2a, + 0x7, + 0x2b, + 0x76, + 0x2c, + 0x8, + 0x9, + 0x2d, + 0x77, + 0x78, + 0x79, + 0x7a, + 0x7b, + 0x7ffe, + 0x7fc, + 0x3ffd, + 0x1ffd, + 0xffffffc, + 0xfffe6, + 0x3fffd2, + 0xfffe7, + 0xfffe8, + 0x3fffd3, + 0x3fffd4, + 0x3fffd5, + 0x7fffd9, + 0x3fffd6, + 0x7fffda, + 0x7fffdb, + 0x7fffdc, + 0x7fffdd, + 0x7fffde, + 0xffffeb, + 0x7fffdf, + 0xffffec, + 0xffffed, + 0x3fffd7, + 0x7fffe0, + 0xffffee, + 0x7fffe1, + 0x7fffe2, + 0x7fffe3, + 0x7fffe4, + 0x1fffdc, + 0x3fffd8, + 0x7fffe5, + 0x3fffd9, + 0x7fffe6, + 0x7fffe7, + 0xffffef, + 0x3fffda, + 0x1fffdd, + 0xfffe9, + 0x3fffdb, + 0x3fffdc, + 0x7fffe8, + 0x7fffe9, + 0x1fffde, + 0x7fffea, + 0x3fffdd, + 0x3fffde, + 0xfffff0, + 0x1fffdf, + 0x3fffdf, + 0x7fffeb, + 0x7fffec, + 0x1fffe0, + 0x1fffe1, + 0x3fffe0, + 0x1fffe2, + 0x7fffed, + 0x3fffe1, + 0x7fffee, + 0x7fffef, + 0xfffea, + 0x3fffe2, + 0x3fffe3, + 0x3fffe4, + 0x7ffff0, + 0x3fffe5, + 0x3fffe6, + 0x7ffff1, + 0x3ffffe0, + 0x3ffffe1, + 0xfffeb, + 0x7fff1, + 0x3fffe7, + 0x7ffff2, + 0x3fffe8, + 0x1ffffec, + 0x3ffffe2, + 0x3ffffe3, + 0x3ffffe4, + 0x7ffffde, + 0x7ffffdf, + 0x3ffffe5, + 0xfffff1, + 0x1ffffed, + 0x7fff2, + 0x1fffe3, + 0x3ffffe6, + 0x7ffffe0, + 0x7ffffe1, + 0x3ffffe7, + 0x7ffffe2, + 0xfffff2, + 0x1fffe4, + 0x1fffe5, + 0x3ffffe8, + 0x3ffffe9, + 0xffffffd, + 0x7ffffe3, + 0x7ffffe4, + 0x7ffffe5, + 0xfffec, + 0xfffff3, + 0xfffed, + 0x1fffe6, + 0x3fffe9, + 0x1fffe7, + 0x1fffe8, + 0x7ffff3, + 0x3fffea, + 0x3fffeb, + 0x1ffffee, + 0x1ffffef, + 0xfffff4, + 0xfffff5, + 0x3ffffea, + 0x7ffff4, + 0x3ffffeb, + 0x7ffffe6, + 0x3ffffec, + 0x3ffffed, + 0x7ffffe7, + 0x7ffffe8, + 0x7ffffe9, + 0x7ffffea, + 0x7ffffeb, + 0xffffffe, + 0x7ffffec, + 0x7ffffed, + 0x7ffffee, + 0x7ffffef, + 0x7fffff0, + 0x3ffffee, +} + +var huffmanCodeLen = [256]uint8{ + 13, 23, 28, 28, 28, 28, 28, 28, 28, 24, 30, 28, 28, 30, 28, 28, + 28, 28, 28, 28, 28, 28, 30, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 6, 10, 10, 12, 13, 6, 8, 11, 10, 10, 8, 11, 8, 6, 6, 6, + 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 8, 15, 6, 12, 10, + 13, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 8, 7, 8, 13, 19, 13, 14, 6, + 15, 5, 6, 5, 6, 5, 6, 6, 6, 5, 7, 7, 6, 6, 6, 5, + 6, 7, 6, 5, 5, 6, 7, 7, 7, 7, 7, 15, 11, 14, 13, 28, + 20, 22, 20, 20, 22, 22, 22, 23, 22, 23, 23, 23, 23, 23, 24, 23, + 24, 24, 22, 23, 24, 23, 23, 23, 23, 21, 22, 23, 22, 23, 23, 24, + 22, 21, 20, 22, 22, 23, 23, 21, 23, 22, 22, 24, 21, 22, 23, 23, + 21, 21, 22, 21, 23, 22, 23, 23, 20, 22, 22, 22, 23, 22, 22, 23, + 26, 26, 20, 19, 22, 23, 22, 25, 26, 26, 26, 27, 27, 26, 24, 25, + 19, 21, 26, 27, 27, 26, 27, 24, 21, 21, 26, 26, 28, 27, 27, 27, + 20, 24, 20, 21, 22, 21, 21, 23, 22, 22, 25, 25, 24, 24, 26, 23, + 26, 27, 26, 26, 27, 27, 27, 27, 27, 28, 27, 27, 27, 27, 27, 26, +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/hpack/tables_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/hpack/tables_test.go new file mode 100644 index 0000000..d963f36 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/hpack/tables_test.go @@ -0,0 +1,214 @@ +// 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 hpack + +import ( + "bufio" + "regexp" + "strconv" + "strings" + "testing" +) + +func TestHeaderFieldTable(t *testing.T) { + table := &headerFieldTable{} + table.init() + table.addEntry(pair("key1", "value1-1")) + table.addEntry(pair("key2", "value2-1")) + table.addEntry(pair("key1", "value1-2")) + table.addEntry(pair("key3", "value3-1")) + table.addEntry(pair("key4", "value4-1")) + table.addEntry(pair("key2", "value2-2")) + + // Tests will be run twice: once before evicting anything, and + // again after evicting the three oldest entries. + tests := []struct { + f HeaderField + beforeWantStaticI uint64 + beforeWantMatch bool + afterWantStaticI uint64 + afterWantMatch bool + }{ + {HeaderField{"key1", "value1-1", false}, 1, true, 0, false}, + {HeaderField{"key1", "value1-2", false}, 3, true, 0, false}, + {HeaderField{"key1", "value1-3", false}, 3, false, 0, false}, + {HeaderField{"key2", "value2-1", false}, 2, true, 3, false}, + {HeaderField{"key2", "value2-2", false}, 6, true, 3, true}, + {HeaderField{"key2", "value2-3", false}, 6, false, 3, false}, + {HeaderField{"key4", "value4-1", false}, 5, true, 2, true}, + // Name match only, because sensitive. + {HeaderField{"key4", "value4-1", true}, 5, false, 2, false}, + // Key not found. + {HeaderField{"key5", "value5-x", false}, 0, false, 0, false}, + } + + staticToDynamic := func(i uint64) uint64 { + if i == 0 { + return 0 + } + return uint64(table.len()) - i + 1 // dynamic is the reversed table + } + + searchStatic := func(f HeaderField) (uint64, bool) { + old := staticTable + staticTable = table + defer func() { staticTable = old }() + return staticTable.search(f) + } + + searchDynamic := func(f HeaderField) (uint64, bool) { + return table.search(f) + } + + for _, test := range tests { + gotI, gotMatch := searchStatic(test.f) + if wantI, wantMatch := test.beforeWantStaticI, test.beforeWantMatch; gotI != wantI || gotMatch != wantMatch { + t.Errorf("before evictions: searchStatic(%+v)=%v,%v want %v,%v", test.f, gotI, gotMatch, wantI, wantMatch) + } + gotI, gotMatch = searchDynamic(test.f) + wantDynamicI := staticToDynamic(test.beforeWantStaticI) + if wantI, wantMatch := wantDynamicI, test.beforeWantMatch; gotI != wantI || gotMatch != wantMatch { + t.Errorf("before evictions: searchDynamic(%+v)=%v,%v want %v,%v", test.f, gotI, gotMatch, wantI, wantMatch) + } + } + + table.evictOldest(3) + + for _, test := range tests { + gotI, gotMatch := searchStatic(test.f) + if wantI, wantMatch := test.afterWantStaticI, test.afterWantMatch; gotI != wantI || gotMatch != wantMatch { + t.Errorf("after evictions: searchStatic(%+v)=%v,%v want %v,%v", test.f, gotI, gotMatch, wantI, wantMatch) + } + gotI, gotMatch = searchDynamic(test.f) + wantDynamicI := staticToDynamic(test.afterWantStaticI) + if wantI, wantMatch := wantDynamicI, test.afterWantMatch; gotI != wantI || gotMatch != wantMatch { + t.Errorf("after evictions: searchDynamic(%+v)=%v,%v want %v,%v", test.f, gotI, gotMatch, wantI, wantMatch) + } + } +} + +func TestHeaderFieldTable_LookupMapEviction(t *testing.T) { + table := &headerFieldTable{} + table.init() + table.addEntry(pair("key1", "value1-1")) + table.addEntry(pair("key2", "value2-1")) + table.addEntry(pair("key1", "value1-2")) + table.addEntry(pair("key3", "value3-1")) + table.addEntry(pair("key4", "value4-1")) + table.addEntry(pair("key2", "value2-2")) + + // evict all pairs + table.evictOldest(table.len()) + + if l := table.len(); l > 0 { + t.Errorf("table.len() = %d, want 0", l) + } + + if l := len(table.byName); l > 0 { + t.Errorf("len(table.byName) = %d, want 0", l) + } + + if l := len(table.byNameValue); l > 0 { + t.Errorf("len(table.byNameValue) = %d, want 0", l) + } +} + +func TestStaticTable(t *testing.T) { + fromSpec := ` + +-------+-----------------------------+---------------+ + | 1 | :authority | | + | 2 | :method | GET | + | 3 | :method | POST | + | 4 | :path | / | + | 5 | :path | /index.html | + | 6 | :scheme | http | + | 7 | :scheme | https | + | 8 | :status | 200 | + | 9 | :status | 204 | + | 10 | :status | 206 | + | 11 | :status | 304 | + | 12 | :status | 400 | + | 13 | :status | 404 | + | 14 | :status | 500 | + | 15 | accept-charset | | + | 16 | accept-encoding | gzip, deflate | + | 17 | accept-language | | + | 18 | accept-ranges | | + | 19 | accept | | + | 20 | access-control-allow-origin | | + | 21 | age | | + | 22 | allow | | + | 23 | authorization | | + | 24 | cache-control | | + | 25 | content-disposition | | + | 26 | content-encoding | | + | 27 | content-language | | + | 28 | content-length | | + | 29 | content-location | | + | 30 | content-range | | + | 31 | content-type | | + | 32 | cookie | | + | 33 | date | | + | 34 | etag | | + | 35 | expect | | + | 36 | expires | | + | 37 | from | | + | 38 | host | | + | 39 | if-match | | + | 40 | if-modified-since | | + | 41 | if-none-match | | + | 42 | if-range | | + | 43 | if-unmodified-since | | + | 44 | last-modified | | + | 45 | link | | + | 46 | location | | + | 47 | max-forwards | | + | 48 | proxy-authenticate | | + | 49 | proxy-authorization | | + | 50 | range | | + | 51 | referer | | + | 52 | refresh | | + | 53 | retry-after | | + | 54 | server | | + | 55 | set-cookie | | + | 56 | strict-transport-security | | + | 57 | transfer-encoding | | + | 58 | user-agent | | + | 59 | vary | | + | 60 | via | | + | 61 | www-authenticate | | + +-------+-----------------------------+---------------+ +` + bs := bufio.NewScanner(strings.NewReader(fromSpec)) + re := regexp.MustCompile(`\| (\d+)\s+\| (\S+)\s*\| (\S(.*\S)?)?\s+\|`) + for bs.Scan() { + l := bs.Text() + if !strings.Contains(l, "|") { + continue + } + m := re.FindStringSubmatch(l) + if m == nil { + continue + } + i, err := strconv.Atoi(m[1]) + if err != nil { + t.Errorf("Bogus integer on line %q", l) + continue + } + if i < 1 || i > staticTable.len() { + t.Errorf("Bogus index %d on line %q", i, l) + continue + } + if got, want := staticTable.ents[i-1].Name, m[2]; got != want { + t.Errorf("header index %d name = %q; want %q", i, got, want) + } + if got, want := staticTable.ents[i-1].Value, m[3]; got != want { + t.Errorf("header index %d value = %q; want %q", i, got, want) + } + } + if err := bs.Err(); err != nil { + t.Error(err) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/http2.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/http2.go new file mode 100644 index 0000000..d565f40 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/http2.go @@ -0,0 +1,391 @@ +// 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 http2 implements the HTTP/2 protocol. +// +// This package is low-level and intended to be used directly by very +// few people. Most users will use it indirectly through the automatic +// use by the net/http package (from Go 1.6 and later). +// For use in earlier Go versions see ConfigureServer. (Transport support +// requires Go 1.6 or later) +// +// See https://http2.github.io/ for more information on HTTP/2. +// +// See https://http2.golang.org/ for a test server running this code. +// +package http2 // import "golang.org/x/net/http2" + +import ( + "bufio" + "crypto/tls" + "errors" + "fmt" + "io" + "net/http" + "os" + "sort" + "strconv" + "strings" + "sync" + + "golang.org/x/net/lex/httplex" +) + +var ( + VerboseLogs bool + logFrameWrites bool + logFrameReads bool + inTests bool +) + +func init() { + e := os.Getenv("GODEBUG") + if strings.Contains(e, "http2debug=1") { + VerboseLogs = true + } + if strings.Contains(e, "http2debug=2") { + VerboseLogs = true + logFrameWrites = true + logFrameReads = true + } +} + +const ( + // ClientPreface is the string that must be sent by new + // connections from clients. + ClientPreface = "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n" + + // SETTINGS_MAX_FRAME_SIZE default + // http://http2.github.io/http2-spec/#rfc.section.6.5.2 + initialMaxFrameSize = 16384 + + // NextProtoTLS is the NPN/ALPN protocol negotiated during + // HTTP/2's TLS setup. + NextProtoTLS = "h2" + + // http://http2.github.io/http2-spec/#SettingValues + initialHeaderTableSize = 4096 + + initialWindowSize = 65535 // 6.9.2 Initial Flow Control Window Size + + defaultMaxReadFrameSize = 1 << 20 +) + +var ( + clientPreface = []byte(ClientPreface) +) + +type streamState int + +// HTTP/2 stream states. +// +// See http://tools.ietf.org/html/rfc7540#section-5.1. +// +// For simplicity, the server code merges "reserved (local)" into +// "half-closed (remote)". This is one less state transition to track. +// The only downside is that we send PUSH_PROMISEs slightly less +// liberally than allowable. More discussion here: +// https://lists.w3.org/Archives/Public/ietf-http-wg/2016JulSep/0599.html +// +// "reserved (remote)" is omitted since the client code does not +// support server push. +const ( + stateIdle streamState = iota + stateOpen + stateHalfClosedLocal + stateHalfClosedRemote + stateClosed +) + +var stateName = [...]string{ + stateIdle: "Idle", + stateOpen: "Open", + stateHalfClosedLocal: "HalfClosedLocal", + stateHalfClosedRemote: "HalfClosedRemote", + stateClosed: "Closed", +} + +func (st streamState) String() string { + return stateName[st] +} + +// Setting is a setting parameter: which setting it is, and its value. +type Setting struct { + // ID is which setting is being set. + // See http://http2.github.io/http2-spec/#SettingValues + ID SettingID + + // Val is the value. + Val uint32 +} + +func (s Setting) String() string { + return fmt.Sprintf("[%v = %d]", s.ID, s.Val) +} + +// Valid reports whether the setting is valid. +func (s Setting) Valid() error { + // Limits and error codes from 6.5.2 Defined SETTINGS Parameters + switch s.ID { + case SettingEnablePush: + if s.Val != 1 && s.Val != 0 { + return ConnectionError(ErrCodeProtocol) + } + case SettingInitialWindowSize: + if s.Val > 1<<31-1 { + return ConnectionError(ErrCodeFlowControl) + } + case SettingMaxFrameSize: + if s.Val < 16384 || s.Val > 1<<24-1 { + return ConnectionError(ErrCodeProtocol) + } + } + return nil +} + +// A SettingID is an HTTP/2 setting as defined in +// http://http2.github.io/http2-spec/#iana-settings +type SettingID uint16 + +const ( + SettingHeaderTableSize SettingID = 0x1 + SettingEnablePush SettingID = 0x2 + SettingMaxConcurrentStreams SettingID = 0x3 + SettingInitialWindowSize SettingID = 0x4 + SettingMaxFrameSize SettingID = 0x5 + SettingMaxHeaderListSize SettingID = 0x6 +) + +var settingName = map[SettingID]string{ + SettingHeaderTableSize: "HEADER_TABLE_SIZE", + SettingEnablePush: "ENABLE_PUSH", + SettingMaxConcurrentStreams: "MAX_CONCURRENT_STREAMS", + SettingInitialWindowSize: "INITIAL_WINDOW_SIZE", + SettingMaxFrameSize: "MAX_FRAME_SIZE", + SettingMaxHeaderListSize: "MAX_HEADER_LIST_SIZE", +} + +func (s SettingID) String() string { + if v, ok := settingName[s]; ok { + return v + } + return fmt.Sprintf("UNKNOWN_SETTING_%d", uint16(s)) +} + +var ( + errInvalidHeaderFieldName = errors.New("http2: invalid header field name") + errInvalidHeaderFieldValue = errors.New("http2: invalid header field value") +) + +// validWireHeaderFieldName reports whether v is a valid header field +// name (key). See httplex.ValidHeaderName for the base rules. +// +// Further, http2 says: +// "Just as in HTTP/1.x, header field names are strings of ASCII +// characters that are compared in a case-insensitive +// fashion. However, header field names MUST be converted to +// lowercase prior to their encoding in HTTP/2. " +func validWireHeaderFieldName(v string) bool { + if len(v) == 0 { + return false + } + for _, r := range v { + if !httplex.IsTokenRune(r) { + return false + } + if 'A' <= r && r <= 'Z' { + return false + } + } + return true +} + +var httpCodeStringCommon = map[int]string{} // n -> strconv.Itoa(n) + +func init() { + for i := 100; i <= 999; i++ { + if v := http.StatusText(i); v != "" { + httpCodeStringCommon[i] = strconv.Itoa(i) + } + } +} + +func httpCodeString(code int) string { + if s, ok := httpCodeStringCommon[code]; ok { + return s + } + return strconv.Itoa(code) +} + +// from pkg io +type stringWriter interface { + WriteString(s string) (n int, err error) +} + +// A gate lets two goroutines coordinate their activities. +type gate chan struct{} + +func (g gate) Done() { g <- struct{}{} } +func (g gate) Wait() { <-g } + +// A closeWaiter is like a sync.WaitGroup but only goes 1 to 0 (open to closed). +type closeWaiter chan struct{} + +// Init makes a closeWaiter usable. +// It exists because so a closeWaiter value can be placed inside a +// larger struct and have the Mutex and Cond's memory in the same +// allocation. +func (cw *closeWaiter) Init() { + *cw = make(chan struct{}) +} + +// Close marks the closeWaiter as closed and unblocks any waiters. +func (cw closeWaiter) Close() { + close(cw) +} + +// Wait waits for the closeWaiter to become closed. +func (cw closeWaiter) Wait() { + <-cw +} + +// bufferedWriter is a buffered writer that writes to w. +// Its buffered writer is lazily allocated as needed, to minimize +// idle memory usage with many connections. +type bufferedWriter struct { + w io.Writer // immutable + bw *bufio.Writer // non-nil when data is buffered +} + +func newBufferedWriter(w io.Writer) *bufferedWriter { + return &bufferedWriter{w: w} +} + +// bufWriterPoolBufferSize is the size of bufio.Writer's +// buffers created using bufWriterPool. +// +// TODO: pick a less arbitrary value? this is a bit under +// (3 x typical 1500 byte MTU) at least. Other than that, +// not much thought went into it. +const bufWriterPoolBufferSize = 4 << 10 + +var bufWriterPool = sync.Pool{ + New: func() interface{} { + return bufio.NewWriterSize(nil, bufWriterPoolBufferSize) + }, +} + +func (w *bufferedWriter) Available() int { + if w.bw == nil { + return bufWriterPoolBufferSize + } + return w.bw.Available() +} + +func (w *bufferedWriter) Write(p []byte) (n int, err error) { + if w.bw == nil { + bw := bufWriterPool.Get().(*bufio.Writer) + bw.Reset(w.w) + w.bw = bw + } + return w.bw.Write(p) +} + +func (w *bufferedWriter) Flush() error { + bw := w.bw + if bw == nil { + return nil + } + err := bw.Flush() + bw.Reset(nil) + bufWriterPool.Put(bw) + w.bw = nil + return err +} + +func mustUint31(v int32) uint32 { + if v < 0 || v > 2147483647 { + panic("out of range") + } + return uint32(v) +} + +// bodyAllowedForStatus reports whether a given response status code +// permits a body. See RFC 2616, section 4.4. +func bodyAllowedForStatus(status int) bool { + switch { + case status >= 100 && status <= 199: + return false + case status == 204: + return false + case status == 304: + return false + } + return true +} + +type httpError struct { + msg string + timeout bool +} + +func (e *httpError) Error() string { return e.msg } +func (e *httpError) Timeout() bool { return e.timeout } +func (e *httpError) Temporary() bool { return true } + +var errTimeout error = &httpError{msg: "http2: timeout awaiting response headers", timeout: true} + +type connectionStater interface { + ConnectionState() tls.ConnectionState +} + +var sorterPool = sync.Pool{New: func() interface{} { return new(sorter) }} + +type sorter struct { + v []string // owned by sorter +} + +func (s *sorter) Len() int { return len(s.v) } +func (s *sorter) Swap(i, j int) { s.v[i], s.v[j] = s.v[j], s.v[i] } +func (s *sorter) Less(i, j int) bool { return s.v[i] < s.v[j] } + +// Keys returns the sorted keys of h. +// +// The returned slice is only valid until s used again or returned to +// its pool. +func (s *sorter) Keys(h http.Header) []string { + keys := s.v[:0] + for k := range h { + keys = append(keys, k) + } + s.v = keys + sort.Sort(s) + return keys +} + +func (s *sorter) SortStrings(ss []string) { + // Our sorter works on s.v, which sorter owns, so + // stash it away while we sort the user's buffer. + save := s.v + s.v = ss + sort.Sort(s) + s.v = save +} + +// validPseudoPath reports whether v is a valid :path pseudo-header +// value. It must be either: +// +// *) a non-empty string starting with '/' +// *) the string '*', for OPTIONS requests. +// +// For now this is only used a quick check for deciding when to clean +// up Opaque URLs before sending requests from the Transport. +// See golang.org/issue/16847 +// +// We used to enforce that the path also didn't start with "//", but +// Google's GFE accepts such paths and Chrome sends them, so ignore +// that part of the spec. See golang.org/issue/19103. +func validPseudoPath(v string) bool { + return (len(v) > 0 && v[0] == '/') || v == "*" +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/http2_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/http2_test.go new file mode 100644 index 0000000..5248776 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/http2_test.go @@ -0,0 +1,199 @@ +// 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 http2 + +import ( + "bytes" + "errors" + "flag" + "fmt" + "net/http" + "os/exec" + "strconv" + "strings" + "testing" + + "golang.org/x/net/http2/hpack" +) + +var knownFailing = flag.Bool("known_failing", false, "Run known-failing tests.") + +func condSkipFailingTest(t *testing.T) { + if !*knownFailing { + t.Skip("Skipping known-failing test without --known_failing") + } +} + +func init() { + inTests = true + DebugGoroutines = true + flag.BoolVar(&VerboseLogs, "verboseh2", VerboseLogs, "Verbose HTTP/2 debug logging") +} + +func TestSettingString(t *testing.T) { + tests := []struct { + s Setting + want string + }{ + {Setting{SettingMaxFrameSize, 123}, "[MAX_FRAME_SIZE = 123]"}, + {Setting{1<<16 - 1, 123}, "[UNKNOWN_SETTING_65535 = 123]"}, + } + for i, tt := range tests { + got := fmt.Sprint(tt.s) + if got != tt.want { + t.Errorf("%d. for %#v, string = %q; want %q", i, tt.s, got, tt.want) + } + } +} + +type twriter struct { + t testing.TB + st *serverTester // optional +} + +func (w twriter) Write(p []byte) (n int, err error) { + if w.st != nil { + ps := string(p) + for _, phrase := range w.st.logFilter { + if strings.Contains(ps, phrase) { + return len(p), nil // no logging + } + } + } + w.t.Logf("%s", p) + return len(p), nil +} + +// like encodeHeader, but don't add implicit pseudo headers. +func encodeHeaderNoImplicit(t *testing.T, headers ...string) []byte { + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + for len(headers) > 0 { + k, v := headers[0], headers[1] + headers = headers[2:] + if err := enc.WriteField(hpack.HeaderField{Name: k, Value: v}); err != nil { + t.Fatalf("HPACK encoding error for %q/%q: %v", k, v, err) + } + } + return buf.Bytes() +} + +// Verify that curl has http2. +func requireCurl(t *testing.T) { + out, err := dockerLogs(curl(t, "--version")) + if err != nil { + t.Skipf("failed to determine curl features; skipping test") + } + if !strings.Contains(string(out), "HTTP2") { + t.Skip("curl doesn't support HTTP2; skipping test") + } +} + +func curl(t *testing.T, args ...string) (container string) { + out, err := exec.Command("docker", append([]string{"run", "-d", "--net=host", "gohttp2/curl"}, args...)...).Output() + if err != nil { + t.Skipf("Failed to run curl in docker: %v, %s", err, out) + } + return strings.TrimSpace(string(out)) +} + +// Verify that h2load exists. +func requireH2load(t *testing.T) { + out, err := dockerLogs(h2load(t, "--version")) + if err != nil { + t.Skipf("failed to probe h2load; skipping test: %s", out) + } + if !strings.Contains(string(out), "h2load nghttp2/") { + t.Skipf("h2load not present; skipping test. (Output=%q)", out) + } +} + +func h2load(t *testing.T, args ...string) (container string) { + out, err := exec.Command("docker", append([]string{"run", "-d", "--net=host", "--entrypoint=/usr/local/bin/h2load", "gohttp2/curl"}, args...)...).Output() + if err != nil { + t.Skipf("Failed to run h2load in docker: %v, %s", err, out) + } + return strings.TrimSpace(string(out)) +} + +type puppetCommand struct { + fn func(w http.ResponseWriter, r *http.Request) + done chan<- bool +} + +type handlerPuppet struct { + ch chan puppetCommand +} + +func newHandlerPuppet() *handlerPuppet { + return &handlerPuppet{ + ch: make(chan puppetCommand), + } +} + +func (p *handlerPuppet) act(w http.ResponseWriter, r *http.Request) { + for cmd := range p.ch { + cmd.fn(w, r) + cmd.done <- true + } +} + +func (p *handlerPuppet) done() { close(p.ch) } +func (p *handlerPuppet) do(fn func(http.ResponseWriter, *http.Request)) { + done := make(chan bool) + p.ch <- puppetCommand{fn, done} + <-done +} +func dockerLogs(container string) ([]byte, error) { + out, err := exec.Command("docker", "wait", container).CombinedOutput() + if err != nil { + return out, err + } + exitStatus, err := strconv.Atoi(strings.TrimSpace(string(out))) + if err != nil { + return out, errors.New("unexpected exit status from docker wait") + } + out, err = exec.Command("docker", "logs", container).CombinedOutput() + exec.Command("docker", "rm", container).Run() + if err == nil && exitStatus != 0 { + err = fmt.Errorf("exit status %d: %s", exitStatus, out) + } + return out, err +} + +func kill(container string) { + exec.Command("docker", "kill", container).Run() + exec.Command("docker", "rm", container).Run() +} + +func cleanDate(res *http.Response) { + if d := res.Header["Date"]; len(d) == 1 { + d[0] = "XXX" + } +} + +func TestSorterPoolAllocs(t *testing.T) { + ss := []string{"a", "b", "c"} + h := http.Header{ + "a": nil, + "b": nil, + "c": nil, + } + sorter := new(sorter) + + if allocs := testing.AllocsPerRun(100, func() { + sorter.SortStrings(ss) + }); allocs >= 1 { + t.Logf("SortStrings allocs = %v; want <1", allocs) + } + + if allocs := testing.AllocsPerRun(5, func() { + if len(sorter.Keys(h)) != 3 { + t.Fatal("wrong result") + } + }); allocs > 0 { + t.Logf("Keys allocs = %v; want <1", allocs) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/not_go16.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/not_go16.go new file mode 100644 index 0000000..508cebc --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/not_go16.go @@ -0,0 +1,21 @@ +// Copyright 2015 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 !go1.6 + +package http2 + +import ( + "net/http" + "time" +) + +func configureTransport(t1 *http.Transport) (*Transport, error) { + return nil, errTransportVersion +} + +func transportExpectContinueTimeout(t1 *http.Transport) time.Duration { + return 0 + +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/not_go17.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/not_go17.go new file mode 100644 index 0000000..140434a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/not_go17.go @@ -0,0 +1,87 @@ +// 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. + +// +build !go1.7 + +package http2 + +import ( + "crypto/tls" + "net" + "net/http" + "time" +) + +type contextContext interface { + Done() <-chan struct{} + Err() error +} + +type fakeContext struct{} + +func (fakeContext) Done() <-chan struct{} { return nil } +func (fakeContext) Err() error { panic("should not be called") } + +func reqContext(r *http.Request) fakeContext { + return fakeContext{} +} + +func setResponseUncompressed(res *http.Response) { + // Nothing. +} + +type clientTrace struct{} + +func requestTrace(*http.Request) *clientTrace { return nil } +func traceGotConn(*http.Request, *ClientConn) {} +func traceFirstResponseByte(*clientTrace) {} +func traceWroteHeaders(*clientTrace) {} +func traceWroteRequest(*clientTrace, error) {} +func traceGot100Continue(trace *clientTrace) {} +func traceWait100Continue(trace *clientTrace) {} + +func nop() {} + +func serverConnBaseContext(c net.Conn, opts *ServeConnOpts) (ctx contextContext, cancel func()) { + return nil, nop +} + +func contextWithCancel(ctx contextContext) (_ contextContext, cancel func()) { + return ctx, nop +} + +func requestWithContext(req *http.Request, ctx contextContext) *http.Request { + return req +} + +// temporary copy of Go 1.6's private tls.Config.clone: +func cloneTLSConfig(c *tls.Config) *tls.Config { + return &tls.Config{ + Rand: c.Rand, + Time: c.Time, + Certificates: c.Certificates, + NameToCertificate: c.NameToCertificate, + GetCertificate: c.GetCertificate, + RootCAs: c.RootCAs, + NextProtos: c.NextProtos, + ServerName: c.ServerName, + ClientAuth: c.ClientAuth, + ClientCAs: c.ClientCAs, + InsecureSkipVerify: c.InsecureSkipVerify, + CipherSuites: c.CipherSuites, + PreferServerCipherSuites: c.PreferServerCipherSuites, + SessionTicketsDisabled: c.SessionTicketsDisabled, + SessionTicketKey: c.SessionTicketKey, + ClientSessionCache: c.ClientSessionCache, + MinVersion: c.MinVersion, + MaxVersion: c.MaxVersion, + CurvePreferences: c.CurvePreferences, + } +} + +func (cc *ClientConn) Ping(ctx contextContext) error { + return cc.ping(ctx) +} + +func (t *Transport) idleConnTimeout() time.Duration { return 0 } diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/not_go18.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/not_go18.go new file mode 100644 index 0000000..6f8d3f8 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/not_go18.go @@ -0,0 +1,29 @@ +// 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. + +// +build !go1.8 + +package http2 + +import ( + "io" + "net/http" +) + +func configureServer18(h1 *http.Server, h2 *Server) error { + // No IdleTimeout to sync prior to Go 1.8. + return nil +} + +func shouldLogPanic(panicValue interface{}) bool { + return panicValue != nil +} + +func reqGetBody(req *http.Request) func() (io.ReadCloser, error) { + return nil +} + +func reqBodyIsNoBody(io.ReadCloser) bool { return false } + +func go18httpNoBody() io.ReadCloser { return nil } // for tests only diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/not_go19.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/not_go19.go new file mode 100644 index 0000000..5ae0772 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/not_go19.go @@ -0,0 +1,16 @@ +// 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. + +// +build !go1.9 + +package http2 + +import ( + "net/http" +) + +func configureServer19(s *http.Server, conf *Server) error { + // not supported prior to go1.9 + return nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/pipe.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/pipe.go new file mode 100644 index 0000000..a614009 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/pipe.go @@ -0,0 +1,163 @@ +// 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 http2 + +import ( + "errors" + "io" + "sync" +) + +// pipe is a goroutine-safe io.Reader/io.Writer pair. It's like +// io.Pipe except there are no PipeReader/PipeWriter halves, and the +// underlying buffer is an interface. (io.Pipe is always unbuffered) +type pipe struct { + mu sync.Mutex + c sync.Cond // c.L lazily initialized to &p.mu + b pipeBuffer // nil when done reading + err error // read error once empty. non-nil means closed. + breakErr error // immediate read error (caller doesn't see rest of b) + donec chan struct{} // closed on error + readFn func() // optional code to run in Read before error +} + +type pipeBuffer interface { + Len() int + io.Writer + io.Reader +} + +func (p *pipe) Len() int { + p.mu.Lock() + defer p.mu.Unlock() + if p.b == nil { + return 0 + } + return p.b.Len() +} + +// Read waits until data is available and copies bytes +// from the buffer into p. +func (p *pipe) Read(d []byte) (n int, err error) { + p.mu.Lock() + defer p.mu.Unlock() + if p.c.L == nil { + p.c.L = &p.mu + } + for { + if p.breakErr != nil { + return 0, p.breakErr + } + if p.b != nil && p.b.Len() > 0 { + return p.b.Read(d) + } + if p.err != nil { + if p.readFn != nil { + p.readFn() // e.g. copy trailers + p.readFn = nil // not sticky like p.err + } + p.b = nil + return 0, p.err + } + p.c.Wait() + } +} + +var errClosedPipeWrite = errors.New("write on closed buffer") + +// Write copies bytes from p into the buffer and wakes a reader. +// It is an error to write more data than the buffer can hold. +func (p *pipe) Write(d []byte) (n int, err error) { + p.mu.Lock() + defer p.mu.Unlock() + if p.c.L == nil { + p.c.L = &p.mu + } + defer p.c.Signal() + if p.err != nil { + return 0, errClosedPipeWrite + } + if p.breakErr != nil { + return len(d), nil // discard when there is no reader + } + return p.b.Write(d) +} + +// CloseWithError causes the next Read (waking up a current blocked +// Read if needed) to return the provided err after all data has been +// read. +// +// The error must be non-nil. +func (p *pipe) CloseWithError(err error) { p.closeWithError(&p.err, err, nil) } + +// BreakWithError causes the next Read (waking up a current blocked +// Read if needed) to return the provided err immediately, without +// waiting for unread data. +func (p *pipe) BreakWithError(err error) { p.closeWithError(&p.breakErr, err, nil) } + +// closeWithErrorAndCode is like CloseWithError but also sets some code to run +// in the caller's goroutine before returning the error. +func (p *pipe) closeWithErrorAndCode(err error, fn func()) { p.closeWithError(&p.err, err, fn) } + +func (p *pipe) closeWithError(dst *error, err error, fn func()) { + if err == nil { + panic("err must be non-nil") + } + p.mu.Lock() + defer p.mu.Unlock() + if p.c.L == nil { + p.c.L = &p.mu + } + defer p.c.Signal() + if *dst != nil { + // Already been done. + return + } + p.readFn = fn + if dst == &p.breakErr { + p.b = nil + } + *dst = err + p.closeDoneLocked() +} + +// requires p.mu be held. +func (p *pipe) closeDoneLocked() { + if p.donec == nil { + return + } + // Close if unclosed. This isn't racy since we always + // hold p.mu while closing. + select { + case <-p.donec: + default: + close(p.donec) + } +} + +// Err returns the error (if any) first set by BreakWithError or CloseWithError. +func (p *pipe) Err() error { + p.mu.Lock() + defer p.mu.Unlock() + if p.breakErr != nil { + return p.breakErr + } + return p.err +} + +// Done returns a channel which is closed if and when this pipe is closed +// with CloseWithError. +func (p *pipe) Done() <-chan struct{} { + p.mu.Lock() + defer p.mu.Unlock() + if p.donec == nil { + p.donec = make(chan struct{}) + if p.err != nil || p.breakErr != nil { + // Already hit an error. + p.closeDoneLocked() + } + } + return p.donec +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/pipe_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/pipe_test.go new file mode 100644 index 0000000..1bf351f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/pipe_test.go @@ -0,0 +1,130 @@ +// 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 http2 + +import ( + "bytes" + "errors" + "io" + "io/ioutil" + "testing" +) + +func TestPipeClose(t *testing.T) { + var p pipe + p.b = new(bytes.Buffer) + a := errors.New("a") + b := errors.New("b") + p.CloseWithError(a) + p.CloseWithError(b) + _, err := p.Read(make([]byte, 1)) + if err != a { + t.Errorf("err = %v want %v", err, a) + } +} + +func TestPipeDoneChan(t *testing.T) { + var p pipe + done := p.Done() + select { + case <-done: + t.Fatal("done too soon") + default: + } + p.CloseWithError(io.EOF) + select { + case <-done: + default: + t.Fatal("should be done") + } +} + +func TestPipeDoneChan_ErrFirst(t *testing.T) { + var p pipe + p.CloseWithError(io.EOF) + done := p.Done() + select { + case <-done: + default: + t.Fatal("should be done") + } +} + +func TestPipeDoneChan_Break(t *testing.T) { + var p pipe + done := p.Done() + select { + case <-done: + t.Fatal("done too soon") + default: + } + p.BreakWithError(io.EOF) + select { + case <-done: + default: + t.Fatal("should be done") + } +} + +func TestPipeDoneChan_Break_ErrFirst(t *testing.T) { + var p pipe + p.BreakWithError(io.EOF) + done := p.Done() + select { + case <-done: + default: + t.Fatal("should be done") + } +} + +func TestPipeCloseWithError(t *testing.T) { + p := &pipe{b: new(bytes.Buffer)} + const body = "foo" + io.WriteString(p, body) + a := errors.New("test error") + p.CloseWithError(a) + all, err := ioutil.ReadAll(p) + if string(all) != body { + t.Errorf("read bytes = %q; want %q", all, body) + } + if err != a { + t.Logf("read error = %v, %v", err, a) + } + // Read and Write should fail. + if n, err := p.Write([]byte("abc")); err != errClosedPipeWrite || n != 0 { + t.Errorf("Write(abc) after close\ngot %v, %v\nwant 0, %v", n, err, errClosedPipeWrite) + } + if n, err := p.Read(make([]byte, 1)); err == nil || n != 0 { + t.Errorf("Read() after close\ngot %v, nil\nwant 0, %v", n, errClosedPipeWrite) + } +} + +func TestPipeBreakWithError(t *testing.T) { + p := &pipe{b: new(bytes.Buffer)} + io.WriteString(p, "foo") + a := errors.New("test err") + p.BreakWithError(a) + all, err := ioutil.ReadAll(p) + if string(all) != "" { + t.Errorf("read bytes = %q; want empty string", all) + } + if err != a { + t.Logf("read error = %v, %v", err, a) + } + if p.b != nil { + t.Errorf("buffer should be nil after BreakWithError") + } + // Write should succeed silently. + if n, err := p.Write([]byte("abc")); err != nil || n != 3 { + t.Errorf("Write(abc) after break\ngot %v, %v\nwant 0, nil", n, err) + } + if p.b != nil { + t.Errorf("buffer should be nil after Write") + } + // Read should fail. + if n, err := p.Read(make([]byte, 1)); err == nil || n != 0 { + t.Errorf("Read() after close\ngot %v, nil\nwant 0, not nil", n) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/server.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/server.go new file mode 100644 index 0000000..eae143d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/server.go @@ -0,0 +1,2857 @@ +// 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. + +// TODO: turn off the serve goroutine when idle, so +// an idle conn only has the readFrames goroutine active. (which could +// also be optimized probably to pin less memory in crypto/tls). This +// would involve tracking when the serve goroutine is active (atomic +// int32 read/CAS probably?) and starting it up when frames arrive, +// and shutting it down when all handlers exit. the occasional PING +// packets could use time.AfterFunc to call sc.wakeStartServeLoop() +// (which is a no-op if already running) and then queue the PING write +// as normal. The serve loop would then exit in most cases (if no +// Handlers running) and not be woken up again until the PING packet +// returns. + +// TODO (maybe): add a mechanism for Handlers to going into +// half-closed-local mode (rw.(io.Closer) test?) but not exit their +// handler, and continue to be able to read from the +// Request.Body. This would be a somewhat semantic change from HTTP/1 +// (or at least what we expose in net/http), so I'd probably want to +// add it there too. For now, this package says that returning from +// the Handler ServeHTTP function means you're both done reading and +// done writing, without a way to stop just one or the other. + +package http2 + +import ( + "bufio" + "bytes" + "crypto/tls" + "errors" + "fmt" + "io" + "log" + "math" + "net" + "net/http" + "net/textproto" + "net/url" + "os" + "reflect" + "runtime" + "strconv" + "strings" + "sync" + "time" + + "golang.org/x/net/http2/hpack" +) + +const ( + prefaceTimeout = 10 * time.Second + firstSettingsTimeout = 2 * time.Second // should be in-flight with preface anyway + handlerChunkWriteSize = 4 << 10 + defaultMaxStreams = 250 // TODO: make this 100 as the GFE seems to? +) + +var ( + errClientDisconnected = errors.New("client disconnected") + errClosedBody = errors.New("body closed by handler") + errHandlerComplete = errors.New("http2: request body closed due to handler exiting") + errStreamClosed = errors.New("http2: stream closed") +) + +var responseWriterStatePool = sync.Pool{ + New: func() interface{} { + rws := &responseWriterState{} + rws.bw = bufio.NewWriterSize(chunkWriter{rws}, handlerChunkWriteSize) + return rws + }, +} + +// Test hooks. +var ( + testHookOnConn func() + testHookGetServerConn func(*serverConn) + testHookOnPanicMu *sync.Mutex // nil except in tests + testHookOnPanic func(sc *serverConn, panicVal interface{}) (rePanic bool) +) + +// Server is an HTTP/2 server. +type Server struct { + // MaxHandlers limits the number of http.Handler ServeHTTP goroutines + // which may run at a time over all connections. + // Negative or zero no limit. + // TODO: implement + MaxHandlers int + + // MaxConcurrentStreams optionally specifies the number of + // concurrent streams that each client may have open at a + // time. This is unrelated to the number of http.Handler goroutines + // which may be active globally, which is MaxHandlers. + // If zero, MaxConcurrentStreams defaults to at least 100, per + // the HTTP/2 spec's recommendations. + MaxConcurrentStreams uint32 + + // MaxReadFrameSize optionally specifies the largest frame + // this server is willing to read. A valid value is between + // 16k and 16M, inclusive. If zero or otherwise invalid, a + // default value is used. + MaxReadFrameSize uint32 + + // PermitProhibitedCipherSuites, if true, permits the use of + // cipher suites prohibited by the HTTP/2 spec. + PermitProhibitedCipherSuites bool + + // IdleTimeout specifies how long until idle clients should be + // closed with a GOAWAY frame. PING frames are not considered + // activity for the purposes of IdleTimeout. + IdleTimeout time.Duration + + // MaxUploadBufferPerConnection is the size of the initial flow + // control window for each connections. The HTTP/2 spec does not + // allow this to be smaller than 65535 or larger than 2^32-1. + // If the value is outside this range, a default value will be + // used instead. + MaxUploadBufferPerConnection int32 + + // MaxUploadBufferPerStream is the size of the initial flow control + // window for each stream. The HTTP/2 spec does not allow this to + // be larger than 2^32-1. If the value is zero or larger than the + // maximum, a default value will be used instead. + MaxUploadBufferPerStream int32 + + // NewWriteScheduler constructs a write scheduler for a connection. + // If nil, a default scheduler is chosen. + NewWriteScheduler func() WriteScheduler + + // Internal state. This is a pointer (rather than embedded directly) + // so that we don't embed a Mutex in this struct, which will make the + // struct non-copyable, which might break some callers. + state *serverInternalState +} + +func (s *Server) initialConnRecvWindowSize() int32 { + if s.MaxUploadBufferPerConnection > initialWindowSize { + return s.MaxUploadBufferPerConnection + } + return 1 << 20 +} + +func (s *Server) initialStreamRecvWindowSize() int32 { + if s.MaxUploadBufferPerStream > 0 { + return s.MaxUploadBufferPerStream + } + return 1 << 20 +} + +func (s *Server) maxReadFrameSize() uint32 { + if v := s.MaxReadFrameSize; v >= minMaxFrameSize && v <= maxFrameSize { + return v + } + return defaultMaxReadFrameSize +} + +func (s *Server) maxConcurrentStreams() uint32 { + if v := s.MaxConcurrentStreams; v > 0 { + return v + } + return defaultMaxStreams +} + +type serverInternalState struct { + mu sync.Mutex + activeConns map[*serverConn]struct{} +} + +func (s *serverInternalState) registerConn(sc *serverConn) { + if s == nil { + return // if the Server was used without calling ConfigureServer + } + s.mu.Lock() + s.activeConns[sc] = struct{}{} + s.mu.Unlock() +} + +func (s *serverInternalState) unregisterConn(sc *serverConn) { + if s == nil { + return // if the Server was used without calling ConfigureServer + } + s.mu.Lock() + delete(s.activeConns, sc) + s.mu.Unlock() +} + +func (s *serverInternalState) startGracefulShutdown() { + if s == nil { + return // if the Server was used without calling ConfigureServer + } + s.mu.Lock() + for sc := range s.activeConns { + sc.startGracefulShutdown() + } + s.mu.Unlock() +} + +// ConfigureServer adds HTTP/2 support to a net/http Server. +// +// The configuration conf may be nil. +// +// ConfigureServer must be called before s begins serving. +func ConfigureServer(s *http.Server, conf *Server) error { + if s == nil { + panic("nil *http.Server") + } + if conf == nil { + conf = new(Server) + } + conf.state = &serverInternalState{activeConns: make(map[*serverConn]struct{})} + if err := configureServer18(s, conf); err != nil { + return err + } + if err := configureServer19(s, conf); err != nil { + return err + } + + if s.TLSConfig == nil { + s.TLSConfig = new(tls.Config) + } else if s.TLSConfig.CipherSuites != nil { + // If they already provided a CipherSuite list, return + // an error if it has a bad order or is missing + // ECDHE_RSA_WITH_AES_128_GCM_SHA256. + const requiredCipher = tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 + haveRequired := false + sawBad := false + for i, cs := range s.TLSConfig.CipherSuites { + if cs == requiredCipher { + haveRequired = true + } + if isBadCipher(cs) { + sawBad = true + } else if sawBad { + return fmt.Errorf("http2: TLSConfig.CipherSuites index %d contains an HTTP/2-approved cipher suite (%#04x), but it comes after unapproved cipher suites. With this configuration, clients that don't support previous, approved cipher suites may be given an unapproved one and reject the connection.", i, cs) + } + } + if !haveRequired { + return fmt.Errorf("http2: TLSConfig.CipherSuites is missing HTTP/2-required TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256") + } + } + + // Note: not setting MinVersion to tls.VersionTLS12, + // as we don't want to interfere with HTTP/1.1 traffic + // on the user's server. We enforce TLS 1.2 later once + // we accept a connection. Ideally this should be done + // during next-proto selection, but using TLS <1.2 with + // HTTP/2 is still the client's bug. + + s.TLSConfig.PreferServerCipherSuites = true + + haveNPN := false + for _, p := range s.TLSConfig.NextProtos { + if p == NextProtoTLS { + haveNPN = true + break + } + } + if !haveNPN { + s.TLSConfig.NextProtos = append(s.TLSConfig.NextProtos, NextProtoTLS) + } + + if s.TLSNextProto == nil { + s.TLSNextProto = map[string]func(*http.Server, *tls.Conn, http.Handler){} + } + protoHandler := func(hs *http.Server, c *tls.Conn, h http.Handler) { + if testHookOnConn != nil { + testHookOnConn() + } + conf.ServeConn(c, &ServeConnOpts{ + Handler: h, + BaseConfig: hs, + }) + } + s.TLSNextProto[NextProtoTLS] = protoHandler + return nil +} + +// ServeConnOpts are options for the Server.ServeConn method. +type ServeConnOpts struct { + // BaseConfig optionally sets the base configuration + // for values. If nil, defaults are used. + BaseConfig *http.Server + + // Handler specifies which handler to use for processing + // requests. If nil, BaseConfig.Handler is used. If BaseConfig + // or BaseConfig.Handler is nil, http.DefaultServeMux is used. + Handler http.Handler +} + +func (o *ServeConnOpts) baseConfig() *http.Server { + if o != nil && o.BaseConfig != nil { + return o.BaseConfig + } + return new(http.Server) +} + +func (o *ServeConnOpts) handler() http.Handler { + if o != nil { + if o.Handler != nil { + return o.Handler + } + if o.BaseConfig != nil && o.BaseConfig.Handler != nil { + return o.BaseConfig.Handler + } + } + return http.DefaultServeMux +} + +// ServeConn serves HTTP/2 requests on the provided connection and +// blocks until the connection is no longer readable. +// +// ServeConn starts speaking HTTP/2 assuming that c has not had any +// reads or writes. It writes its initial settings frame and expects +// to be able to read the preface and settings frame from the +// client. If c has a ConnectionState method like a *tls.Conn, the +// ConnectionState is used to verify the TLS ciphersuite and to set +// the Request.TLS field in Handlers. +// +// ServeConn does not support h2c by itself. Any h2c support must be +// implemented in terms of providing a suitably-behaving net.Conn. +// +// The opts parameter is optional. If nil, default values are used. +func (s *Server) ServeConn(c net.Conn, opts *ServeConnOpts) { + baseCtx, cancel := serverConnBaseContext(c, opts) + defer cancel() + + sc := &serverConn{ + srv: s, + hs: opts.baseConfig(), + conn: c, + baseCtx: baseCtx, + remoteAddrStr: c.RemoteAddr().String(), + bw: newBufferedWriter(c), + handler: opts.handler(), + streams: make(map[uint32]*stream), + readFrameCh: make(chan readFrameResult), + wantWriteFrameCh: make(chan FrameWriteRequest, 8), + serveMsgCh: make(chan interface{}, 8), + wroteFrameCh: make(chan frameWriteResult, 1), // buffered; one send in writeFrameAsync + bodyReadCh: make(chan bodyReadMsg), // buffering doesn't matter either way + doneServing: make(chan struct{}), + clientMaxStreams: math.MaxUint32, // Section 6.5.2: "Initially, there is no limit to this value" + advMaxStreams: s.maxConcurrentStreams(), + initialStreamSendWindowSize: initialWindowSize, + maxFrameSize: initialMaxFrameSize, + headerTableSize: initialHeaderTableSize, + serveG: newGoroutineLock(), + pushEnabled: true, + } + + s.state.registerConn(sc) + defer s.state.unregisterConn(sc) + + // The net/http package sets the write deadline from the + // http.Server.WriteTimeout during the TLS handshake, but then + // passes the connection off to us with the deadline already set. + // Write deadlines are set per stream in serverConn.newStream. + // Disarm the net.Conn write deadline here. + if sc.hs.WriteTimeout != 0 { + sc.conn.SetWriteDeadline(time.Time{}) + } + + if s.NewWriteScheduler != nil { + sc.writeSched = s.NewWriteScheduler() + } else { + sc.writeSched = NewRandomWriteScheduler() + } + + // These start at the RFC-specified defaults. If there is a higher + // configured value for inflow, that will be updated when we send a + // WINDOW_UPDATE shortly after sending SETTINGS. + sc.flow.add(initialWindowSize) + sc.inflow.add(initialWindowSize) + sc.hpackEncoder = hpack.NewEncoder(&sc.headerWriteBuf) + + fr := NewFramer(sc.bw, c) + fr.ReadMetaHeaders = hpack.NewDecoder(initialHeaderTableSize, nil) + fr.MaxHeaderListSize = sc.maxHeaderListSize() + fr.SetMaxReadFrameSize(s.maxReadFrameSize()) + sc.framer = fr + + if tc, ok := c.(connectionStater); ok { + sc.tlsState = new(tls.ConnectionState) + *sc.tlsState = tc.ConnectionState() + // 9.2 Use of TLS Features + // An implementation of HTTP/2 over TLS MUST use TLS + // 1.2 or higher with the restrictions on feature set + // and cipher suite described in this section. Due to + // implementation limitations, it might not be + // possible to fail TLS negotiation. An endpoint MUST + // immediately terminate an HTTP/2 connection that + // does not meet the TLS requirements described in + // this section with a connection error (Section + // 5.4.1) of type INADEQUATE_SECURITY. + if sc.tlsState.Version < tls.VersionTLS12 { + sc.rejectConn(ErrCodeInadequateSecurity, "TLS version too low") + return + } + + if sc.tlsState.ServerName == "" { + // Client must use SNI, but we don't enforce that anymore, + // since it was causing problems when connecting to bare IP + // addresses during development. + // + // TODO: optionally enforce? Or enforce at the time we receive + // a new request, and verify the the ServerName matches the :authority? + // But that precludes proxy situations, perhaps. + // + // So for now, do nothing here again. + } + + if !s.PermitProhibitedCipherSuites && isBadCipher(sc.tlsState.CipherSuite) { + // "Endpoints MAY choose to generate a connection error + // (Section 5.4.1) of type INADEQUATE_SECURITY if one of + // the prohibited cipher suites are negotiated." + // + // We choose that. In my opinion, the spec is weak + // here. It also says both parties must support at least + // TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 so there's no + // excuses here. If we really must, we could allow an + // "AllowInsecureWeakCiphers" option on the server later. + // Let's see how it plays out first. + sc.rejectConn(ErrCodeInadequateSecurity, fmt.Sprintf("Prohibited TLS 1.2 Cipher Suite: %x", sc.tlsState.CipherSuite)) + return + } + } + + if hook := testHookGetServerConn; hook != nil { + hook(sc) + } + sc.serve() +} + +func (sc *serverConn) rejectConn(err ErrCode, debug string) { + sc.vlogf("http2: server rejecting conn: %v, %s", err, debug) + // ignoring errors. hanging up anyway. + sc.framer.WriteGoAway(0, err, []byte(debug)) + sc.bw.Flush() + sc.conn.Close() +} + +type serverConn struct { + // Immutable: + srv *Server + hs *http.Server + conn net.Conn + bw *bufferedWriter // writing to conn + handler http.Handler + baseCtx contextContext + framer *Framer + doneServing chan struct{} // closed when serverConn.serve ends + readFrameCh chan readFrameResult // written by serverConn.readFrames + wantWriteFrameCh chan FrameWriteRequest // from handlers -> serve + wroteFrameCh chan frameWriteResult // from writeFrameAsync -> serve, tickles more frame writes + bodyReadCh chan bodyReadMsg // from handlers -> serve + serveMsgCh chan interface{} // misc messages & code to send to / run on the serve loop + flow flow // conn-wide (not stream-specific) outbound flow control + inflow flow // conn-wide inbound flow control + tlsState *tls.ConnectionState // shared by all handlers, like net/http + remoteAddrStr string + writeSched WriteScheduler + + // Everything following is owned by the serve loop; use serveG.check(): + serveG goroutineLock // used to verify funcs are on serve() + pushEnabled bool + sawFirstSettings bool // got the initial SETTINGS frame after the preface + needToSendSettingsAck bool + unackedSettings int // how many SETTINGS have we sent without ACKs? + clientMaxStreams uint32 // SETTINGS_MAX_CONCURRENT_STREAMS from client (our PUSH_PROMISE limit) + advMaxStreams uint32 // our SETTINGS_MAX_CONCURRENT_STREAMS advertised the client + curClientStreams uint32 // number of open streams initiated by the client + curPushedStreams uint32 // number of open streams initiated by server push + maxClientStreamID uint32 // max ever seen from client (odd), or 0 if there have been no client requests + maxPushPromiseID uint32 // ID of the last push promise (even), or 0 if there have been no pushes + streams map[uint32]*stream + initialStreamSendWindowSize int32 + maxFrameSize int32 + headerTableSize uint32 + peerMaxHeaderListSize uint32 // zero means unknown (default) + canonHeader map[string]string // http2-lower-case -> Go-Canonical-Case + writingFrame bool // started writing a frame (on serve goroutine or separate) + writingFrameAsync bool // started a frame on its own goroutine but haven't heard back on wroteFrameCh + needsFrameFlush bool // last frame write wasn't a flush + inGoAway bool // we've started to or sent GOAWAY + inFrameScheduleLoop bool // whether we're in the scheduleFrameWrite loop + needToSendGoAway bool // we need to schedule a GOAWAY frame write + goAwayCode ErrCode + shutdownTimer *time.Timer // nil until used + idleTimer *time.Timer // nil if unused + + // Owned by the writeFrameAsync goroutine: + headerWriteBuf bytes.Buffer + hpackEncoder *hpack.Encoder + + // Used by startGracefulShutdown. + shutdownOnce sync.Once +} + +func (sc *serverConn) maxHeaderListSize() uint32 { + n := sc.hs.MaxHeaderBytes + if n <= 0 { + n = http.DefaultMaxHeaderBytes + } + // http2's count is in a slightly different unit and includes 32 bytes per pair. + // So, take the net/http.Server value and pad it up a bit, assuming 10 headers. + const perFieldOverhead = 32 // per http2 spec + const typicalHeaders = 10 // conservative + return uint32(n + typicalHeaders*perFieldOverhead) +} + +func (sc *serverConn) curOpenStreams() uint32 { + sc.serveG.check() + return sc.curClientStreams + sc.curPushedStreams +} + +// stream represents a stream. This is the minimal metadata needed by +// the serve goroutine. Most of the actual stream state is owned by +// the http.Handler's goroutine in the responseWriter. Because the +// responseWriter's responseWriterState is recycled at the end of a +// handler, this struct intentionally has no pointer to the +// *responseWriter{,State} itself, as the Handler ending nils out the +// responseWriter's state field. +type stream struct { + // immutable: + sc *serverConn + id uint32 + body *pipe // non-nil if expecting DATA frames + cw closeWaiter // closed wait stream transitions to closed state + ctx contextContext + cancelCtx func() + + // owned by serverConn's serve loop: + bodyBytes int64 // body bytes seen so far + declBodyBytes int64 // or -1 if undeclared + flow flow // limits writing from Handler to client + inflow flow // what the client is allowed to POST/etc to us + parent *stream // or nil + numTrailerValues int64 + weight uint8 + state streamState + resetQueued bool // RST_STREAM queued for write; set by sc.resetStream + gotTrailerHeader bool // HEADER frame for trailers was seen + wroteHeaders bool // whether we wrote headers (not status 100) + writeDeadline *time.Timer // nil if unused + + trailer http.Header // accumulated trailers + reqTrailer http.Header // handler's Request.Trailer +} + +func (sc *serverConn) Framer() *Framer { return sc.framer } +func (sc *serverConn) CloseConn() error { return sc.conn.Close() } +func (sc *serverConn) Flush() error { return sc.bw.Flush() } +func (sc *serverConn) HeaderEncoder() (*hpack.Encoder, *bytes.Buffer) { + return sc.hpackEncoder, &sc.headerWriteBuf +} + +func (sc *serverConn) state(streamID uint32) (streamState, *stream) { + sc.serveG.check() + // http://tools.ietf.org/html/rfc7540#section-5.1 + if st, ok := sc.streams[streamID]; ok { + return st.state, st + } + // "The first use of a new stream identifier implicitly closes all + // streams in the "idle" state that might have been initiated by + // that peer with a lower-valued stream identifier. For example, if + // a client sends a HEADERS frame on stream 7 without ever sending a + // frame on stream 5, then stream 5 transitions to the "closed" + // state when the first frame for stream 7 is sent or received." + if streamID%2 == 1 { + if streamID <= sc.maxClientStreamID { + return stateClosed, nil + } + } else { + if streamID <= sc.maxPushPromiseID { + return stateClosed, nil + } + } + return stateIdle, nil +} + +// setConnState calls the net/http ConnState hook for this connection, if configured. +// Note that the net/http package does StateNew and StateClosed for us. +// There is currently no plan for StateHijacked or hijacking HTTP/2 connections. +func (sc *serverConn) setConnState(state http.ConnState) { + if sc.hs.ConnState != nil { + sc.hs.ConnState(sc.conn, state) + } +} + +func (sc *serverConn) vlogf(format string, args ...interface{}) { + if VerboseLogs { + sc.logf(format, args...) + } +} + +func (sc *serverConn) logf(format string, args ...interface{}) { + if lg := sc.hs.ErrorLog; lg != nil { + lg.Printf(format, args...) + } else { + log.Printf(format, args...) + } +} + +// errno returns v's underlying uintptr, else 0. +// +// TODO: remove this helper function once http2 can use build +// tags. See comment in isClosedConnError. +func errno(v error) uintptr { + if rv := reflect.ValueOf(v); rv.Kind() == reflect.Uintptr { + return uintptr(rv.Uint()) + } + return 0 +} + +// isClosedConnError reports whether err is an error from use of a closed +// network connection. +func isClosedConnError(err error) bool { + if err == nil { + return false + } + + // TODO: remove this string search and be more like the Windows + // case below. That might involve modifying the standard library + // to return better error types. + str := err.Error() + if strings.Contains(str, "use of closed network connection") { + return true + } + + // TODO(bradfitz): x/tools/cmd/bundle doesn't really support + // build tags, so I can't make an http2_windows.go file with + // Windows-specific stuff. Fix that and move this, once we + // have a way to bundle this into std's net/http somehow. + if runtime.GOOS == "windows" { + if oe, ok := err.(*net.OpError); ok && oe.Op == "read" { + if se, ok := oe.Err.(*os.SyscallError); ok && se.Syscall == "wsarecv" { + const WSAECONNABORTED = 10053 + const WSAECONNRESET = 10054 + if n := errno(se.Err); n == WSAECONNRESET || n == WSAECONNABORTED { + return true + } + } + } + } + return false +} + +func (sc *serverConn) condlogf(err error, format string, args ...interface{}) { + if err == nil { + return + } + if err == io.EOF || err == io.ErrUnexpectedEOF || isClosedConnError(err) { + // Boring, expected errors. + sc.vlogf(format, args...) + } else { + sc.logf(format, args...) + } +} + +func (sc *serverConn) canonicalHeader(v string) string { + sc.serveG.check() + cv, ok := commonCanonHeader[v] + if ok { + return cv + } + cv, ok = sc.canonHeader[v] + if ok { + return cv + } + if sc.canonHeader == nil { + sc.canonHeader = make(map[string]string) + } + cv = http.CanonicalHeaderKey(v) + sc.canonHeader[v] = cv + return cv +} + +type readFrameResult struct { + f Frame // valid until readMore is called + err error + + // readMore should be called once the consumer no longer needs or + // retains f. After readMore, f is invalid and more frames can be + // read. + readMore func() +} + +// readFrames is the loop that reads incoming frames. +// It takes care to only read one frame at a time, blocking until the +// consumer is done with the frame. +// It's run on its own goroutine. +func (sc *serverConn) readFrames() { + gate := make(gate) + gateDone := gate.Done + for { + f, err := sc.framer.ReadFrame() + select { + case sc.readFrameCh <- readFrameResult{f, err, gateDone}: + case <-sc.doneServing: + return + } + select { + case <-gate: + case <-sc.doneServing: + return + } + if terminalReadFrameError(err) { + return + } + } +} + +// frameWriteResult is the message passed from writeFrameAsync to the serve goroutine. +type frameWriteResult struct { + wr FrameWriteRequest // what was written (or attempted) + err error // result of the writeFrame call +} + +// writeFrameAsync runs in its own goroutine and writes a single frame +// and then reports when it's done. +// At most one goroutine can be running writeFrameAsync at a time per +// serverConn. +func (sc *serverConn) writeFrameAsync(wr FrameWriteRequest) { + err := wr.write.writeFrame(sc) + sc.wroteFrameCh <- frameWriteResult{wr, err} +} + +func (sc *serverConn) closeAllStreamsOnConnClose() { + sc.serveG.check() + for _, st := range sc.streams { + sc.closeStream(st, errClientDisconnected) + } +} + +func (sc *serverConn) stopShutdownTimer() { + sc.serveG.check() + if t := sc.shutdownTimer; t != nil { + t.Stop() + } +} + +func (sc *serverConn) notePanic() { + // Note: this is for serverConn.serve panicking, not http.Handler code. + if testHookOnPanicMu != nil { + testHookOnPanicMu.Lock() + defer testHookOnPanicMu.Unlock() + } + if testHookOnPanic != nil { + if e := recover(); e != nil { + if testHookOnPanic(sc, e) { + panic(e) + } + } + } +} + +func (sc *serverConn) serve() { + sc.serveG.check() + defer sc.notePanic() + defer sc.conn.Close() + defer sc.closeAllStreamsOnConnClose() + defer sc.stopShutdownTimer() + defer close(sc.doneServing) // unblocks handlers trying to send + + if VerboseLogs { + sc.vlogf("http2: server connection from %v on %p", sc.conn.RemoteAddr(), sc.hs) + } + + sc.writeFrame(FrameWriteRequest{ + write: writeSettings{ + {SettingMaxFrameSize, sc.srv.maxReadFrameSize()}, + {SettingMaxConcurrentStreams, sc.advMaxStreams}, + {SettingMaxHeaderListSize, sc.maxHeaderListSize()}, + {SettingInitialWindowSize, uint32(sc.srv.initialStreamRecvWindowSize())}, + }, + }) + sc.unackedSettings++ + + // Each connection starts with intialWindowSize inflow tokens. + // If a higher value is configured, we add more tokens. + if diff := sc.srv.initialConnRecvWindowSize() - initialWindowSize; diff > 0 { + sc.sendWindowUpdate(nil, int(diff)) + } + + if err := sc.readPreface(); err != nil { + sc.condlogf(err, "http2: server: error reading preface from client %v: %v", sc.conn.RemoteAddr(), err) + return + } + // Now that we've got the preface, get us out of the + // "StateNew" state. We can't go directly to idle, though. + // Active means we read some data and anticipate a request. We'll + // do another Active when we get a HEADERS frame. + sc.setConnState(http.StateActive) + sc.setConnState(http.StateIdle) + + if sc.srv.IdleTimeout != 0 { + sc.idleTimer = time.AfterFunc(sc.srv.IdleTimeout, sc.onIdleTimer) + defer sc.idleTimer.Stop() + } + + go sc.readFrames() // closed by defer sc.conn.Close above + + settingsTimer := time.AfterFunc(firstSettingsTimeout, sc.onSettingsTimer) + defer settingsTimer.Stop() + + loopNum := 0 + for { + loopNum++ + select { + case wr := <-sc.wantWriteFrameCh: + if se, ok := wr.write.(StreamError); ok { + sc.resetStream(se) + break + } + sc.writeFrame(wr) + case res := <-sc.wroteFrameCh: + sc.wroteFrame(res) + case res := <-sc.readFrameCh: + if !sc.processFrameFromReader(res) { + return + } + res.readMore() + if settingsTimer != nil { + settingsTimer.Stop() + settingsTimer = nil + } + case m := <-sc.bodyReadCh: + sc.noteBodyRead(m.st, m.n) + case msg := <-sc.serveMsgCh: + switch v := msg.(type) { + case func(int): + v(loopNum) // for testing + case *serverMessage: + switch v { + case settingsTimerMsg: + sc.logf("timeout waiting for SETTINGS frames from %v", sc.conn.RemoteAddr()) + return + case idleTimerMsg: + sc.vlogf("connection is idle") + sc.goAway(ErrCodeNo) + case shutdownTimerMsg: + sc.vlogf("GOAWAY close timer fired; closing conn from %v", sc.conn.RemoteAddr()) + return + case gracefulShutdownMsg: + sc.startGracefulShutdownInternal() + default: + panic("unknown timer") + } + case *startPushRequest: + sc.startPush(v) + default: + panic(fmt.Sprintf("unexpected type %T", v)) + } + } + + if sc.inGoAway && sc.curOpenStreams() == 0 && !sc.needToSendGoAway && !sc.writingFrame { + return + } + } +} + +func (sc *serverConn) awaitGracefulShutdown(sharedCh <-chan struct{}, privateCh chan struct{}) { + select { + case <-sc.doneServing: + case <-sharedCh: + close(privateCh) + } +} + +type serverMessage int + +// Message values sent to serveMsgCh. +var ( + settingsTimerMsg = new(serverMessage) + idleTimerMsg = new(serverMessage) + shutdownTimerMsg = new(serverMessage) + gracefulShutdownMsg = new(serverMessage) +) + +func (sc *serverConn) onSettingsTimer() { sc.sendServeMsg(settingsTimerMsg) } +func (sc *serverConn) onIdleTimer() { sc.sendServeMsg(idleTimerMsg) } +func (sc *serverConn) onShutdownTimer() { sc.sendServeMsg(shutdownTimerMsg) } + +func (sc *serverConn) sendServeMsg(msg interface{}) { + sc.serveG.checkNotOn() // NOT + select { + case sc.serveMsgCh <- msg: + case <-sc.doneServing: + } +} + +// readPreface reads the ClientPreface greeting from the peer +// or returns an error on timeout or an invalid greeting. +func (sc *serverConn) readPreface() error { + errc := make(chan error, 1) + go func() { + // Read the client preface + buf := make([]byte, len(ClientPreface)) + if _, err := io.ReadFull(sc.conn, buf); err != nil { + errc <- err + } else if !bytes.Equal(buf, clientPreface) { + errc <- fmt.Errorf("bogus greeting %q", buf) + } else { + errc <- nil + } + }() + timer := time.NewTimer(prefaceTimeout) // TODO: configurable on *Server? + defer timer.Stop() + select { + case <-timer.C: + return errors.New("timeout waiting for client preface") + case err := <-errc: + if err == nil { + if VerboseLogs { + sc.vlogf("http2: server: client %v said hello", sc.conn.RemoteAddr()) + } + } + return err + } +} + +var errChanPool = sync.Pool{ + New: func() interface{} { return make(chan error, 1) }, +} + +var writeDataPool = sync.Pool{ + New: func() interface{} { return new(writeData) }, +} + +// writeDataFromHandler writes DATA response frames from a handler on +// the given stream. +func (sc *serverConn) writeDataFromHandler(stream *stream, data []byte, endStream bool) error { + ch := errChanPool.Get().(chan error) + writeArg := writeDataPool.Get().(*writeData) + *writeArg = writeData{stream.id, data, endStream} + err := sc.writeFrameFromHandler(FrameWriteRequest{ + write: writeArg, + stream: stream, + done: ch, + }) + if err != nil { + return err + } + var frameWriteDone bool // the frame write is done (successfully or not) + select { + case err = <-ch: + frameWriteDone = true + case <-sc.doneServing: + return errClientDisconnected + case <-stream.cw: + // If both ch and stream.cw were ready (as might + // happen on the final Write after an http.Handler + // ends), prefer the write result. Otherwise this + // might just be us successfully closing the stream. + // The writeFrameAsync and serve goroutines guarantee + // that the ch send will happen before the stream.cw + // close. + select { + case err = <-ch: + frameWriteDone = true + default: + return errStreamClosed + } + } + errChanPool.Put(ch) + if frameWriteDone { + writeDataPool.Put(writeArg) + } + return err +} + +// writeFrameFromHandler sends wr to sc.wantWriteFrameCh, but aborts +// if the connection has gone away. +// +// This must not be run from the serve goroutine itself, else it might +// deadlock writing to sc.wantWriteFrameCh (which is only mildly +// buffered and is read by serve itself). If you're on the serve +// goroutine, call writeFrame instead. +func (sc *serverConn) writeFrameFromHandler(wr FrameWriteRequest) error { + sc.serveG.checkNotOn() // NOT + select { + case sc.wantWriteFrameCh <- wr: + return nil + case <-sc.doneServing: + // Serve loop is gone. + // Client has closed their connection to the server. + return errClientDisconnected + } +} + +// writeFrame schedules a frame to write and sends it if there's nothing +// already being written. +// +// There is no pushback here (the serve goroutine never blocks). It's +// the http.Handlers that block, waiting for their previous frames to +// make it onto the wire +// +// If you're not on the serve goroutine, use writeFrameFromHandler instead. +func (sc *serverConn) writeFrame(wr FrameWriteRequest) { + sc.serveG.check() + + // If true, wr will not be written and wr.done will not be signaled. + var ignoreWrite bool + + // We are not allowed to write frames on closed streams. RFC 7540 Section + // 5.1.1 says: "An endpoint MUST NOT send frames other than PRIORITY on + // a closed stream." Our server never sends PRIORITY, so that exception + // does not apply. + // + // The serverConn might close an open stream while the stream's handler + // is still running. For example, the server might close a stream when it + // receives bad data from the client. If this happens, the handler might + // attempt to write a frame after the stream has been closed (since the + // handler hasn't yet been notified of the close). In this case, we simply + // ignore the frame. The handler will notice that the stream is closed when + // it waits for the frame to be written. + // + // As an exception to this rule, we allow sending RST_STREAM after close. + // This allows us to immediately reject new streams without tracking any + // state for those streams (except for the queued RST_STREAM frame). This + // may result in duplicate RST_STREAMs in some cases, but the client should + // ignore those. + if wr.StreamID() != 0 { + _, isReset := wr.write.(StreamError) + if state, _ := sc.state(wr.StreamID()); state == stateClosed && !isReset { + ignoreWrite = true + } + } + + // Don't send a 100-continue response if we've already sent headers. + // See golang.org/issue/14030. + switch wr.write.(type) { + case *writeResHeaders: + wr.stream.wroteHeaders = true + case write100ContinueHeadersFrame: + if wr.stream.wroteHeaders { + // We do not need to notify wr.done because this frame is + // never written with wr.done != nil. + if wr.done != nil { + panic("wr.done != nil for write100ContinueHeadersFrame") + } + ignoreWrite = true + } + } + + if !ignoreWrite { + sc.writeSched.Push(wr) + } + sc.scheduleFrameWrite() +} + +// startFrameWrite starts a goroutine to write wr (in a separate +// goroutine since that might block on the network), and updates the +// serve goroutine's state about the world, updated from info in wr. +func (sc *serverConn) startFrameWrite(wr FrameWriteRequest) { + sc.serveG.check() + if sc.writingFrame { + panic("internal error: can only be writing one frame at a time") + } + + st := wr.stream + if st != nil { + switch st.state { + case stateHalfClosedLocal: + switch wr.write.(type) { + case StreamError, handlerPanicRST, writeWindowUpdate: + // RFC 7540 Section 5.1 allows sending RST_STREAM, PRIORITY, and WINDOW_UPDATE + // in this state. (We never send PRIORITY from the server, so that is not checked.) + default: + panic(fmt.Sprintf("internal error: attempt to send frame on a half-closed-local stream: %v", wr)) + } + case stateClosed: + panic(fmt.Sprintf("internal error: attempt to send frame on a closed stream: %v", wr)) + } + } + if wpp, ok := wr.write.(*writePushPromise); ok { + var err error + wpp.promisedID, err = wpp.allocatePromisedID() + if err != nil { + sc.writingFrameAsync = false + wr.replyToWriter(err) + return + } + } + + sc.writingFrame = true + sc.needsFrameFlush = true + if wr.write.staysWithinBuffer(sc.bw.Available()) { + sc.writingFrameAsync = false + err := wr.write.writeFrame(sc) + sc.wroteFrame(frameWriteResult{wr, err}) + } else { + sc.writingFrameAsync = true + go sc.writeFrameAsync(wr) + } +} + +// errHandlerPanicked is the error given to any callers blocked in a read from +// Request.Body when the main goroutine panics. Since most handlers read in the +// the main ServeHTTP goroutine, this will show up rarely. +var errHandlerPanicked = errors.New("http2: handler panicked") + +// wroteFrame is called on the serve goroutine with the result of +// whatever happened on writeFrameAsync. +func (sc *serverConn) wroteFrame(res frameWriteResult) { + sc.serveG.check() + if !sc.writingFrame { + panic("internal error: expected to be already writing a frame") + } + sc.writingFrame = false + sc.writingFrameAsync = false + + wr := res.wr + + if writeEndsStream(wr.write) { + st := wr.stream + if st == nil { + panic("internal error: expecting non-nil stream") + } + switch st.state { + case stateOpen: + // Here we would go to stateHalfClosedLocal in + // theory, but since our handler is done and + // the net/http package provides no mechanism + // for closing a ResponseWriter while still + // reading data (see possible TODO at top of + // this file), we go into closed state here + // anyway, after telling the peer we're + // hanging up on them. We'll transition to + // stateClosed after the RST_STREAM frame is + // written. + st.state = stateHalfClosedLocal + // Section 8.1: a server MAY request that the client abort + // transmission of a request without error by sending a + // RST_STREAM with an error code of NO_ERROR after sending + // a complete response. + sc.resetStream(streamError(st.id, ErrCodeNo)) + case stateHalfClosedRemote: + sc.closeStream(st, errHandlerComplete) + } + } else { + switch v := wr.write.(type) { + case StreamError: + // st may be unknown if the RST_STREAM was generated to reject bad input. + if st, ok := sc.streams[v.StreamID]; ok { + sc.closeStream(st, v) + } + case handlerPanicRST: + sc.closeStream(wr.stream, errHandlerPanicked) + } + } + + // Reply (if requested) to unblock the ServeHTTP goroutine. + wr.replyToWriter(res.err) + + sc.scheduleFrameWrite() +} + +// scheduleFrameWrite tickles the frame writing scheduler. +// +// If a frame is already being written, nothing happens. This will be called again +// when the frame is done being written. +// +// If a frame isn't being written we need to send one, the best frame +// to send is selected, preferring first things that aren't +// stream-specific (e.g. ACKing settings), and then finding the +// highest priority stream. +// +// If a frame isn't being written and there's nothing else to send, we +// flush the write buffer. +func (sc *serverConn) scheduleFrameWrite() { + sc.serveG.check() + if sc.writingFrame || sc.inFrameScheduleLoop { + return + } + sc.inFrameScheduleLoop = true + for !sc.writingFrameAsync { + if sc.needToSendGoAway { + sc.needToSendGoAway = false + sc.startFrameWrite(FrameWriteRequest{ + write: &writeGoAway{ + maxStreamID: sc.maxClientStreamID, + code: sc.goAwayCode, + }, + }) + continue + } + if sc.needToSendSettingsAck { + sc.needToSendSettingsAck = false + sc.startFrameWrite(FrameWriteRequest{write: writeSettingsAck{}}) + continue + } + if !sc.inGoAway || sc.goAwayCode == ErrCodeNo { + if wr, ok := sc.writeSched.Pop(); ok { + sc.startFrameWrite(wr) + continue + } + } + if sc.needsFrameFlush { + sc.startFrameWrite(FrameWriteRequest{write: flushFrameWriter{}}) + sc.needsFrameFlush = false // after startFrameWrite, since it sets this true + continue + } + break + } + sc.inFrameScheduleLoop = false +} + +// startGracefulShutdown gracefully shuts down a connection. This +// sends GOAWAY with ErrCodeNo to tell the client we're gracefully +// shutting down. The connection isn't closed until all current +// streams are done. +// +// startGracefulShutdown returns immediately; it does not wait until +// the connection has shut down. +func (sc *serverConn) startGracefulShutdown() { + sc.serveG.checkNotOn() // NOT + sc.shutdownOnce.Do(func() { sc.sendServeMsg(gracefulShutdownMsg) }) +} + +func (sc *serverConn) startGracefulShutdownInternal() { + sc.goAwayIn(ErrCodeNo, 0) +} + +func (sc *serverConn) goAway(code ErrCode) { + sc.serveG.check() + var forceCloseIn time.Duration + if code != ErrCodeNo { + forceCloseIn = 250 * time.Millisecond + } else { + // TODO: configurable + forceCloseIn = 1 * time.Second + } + sc.goAwayIn(code, forceCloseIn) +} + +func (sc *serverConn) goAwayIn(code ErrCode, forceCloseIn time.Duration) { + sc.serveG.check() + if sc.inGoAway { + return + } + if forceCloseIn != 0 { + sc.shutDownIn(forceCloseIn) + } + sc.inGoAway = true + sc.needToSendGoAway = true + sc.goAwayCode = code + sc.scheduleFrameWrite() +} + +func (sc *serverConn) shutDownIn(d time.Duration) { + sc.serveG.check() + sc.shutdownTimer = time.AfterFunc(d, sc.onShutdownTimer) +} + +func (sc *serverConn) resetStream(se StreamError) { + sc.serveG.check() + sc.writeFrame(FrameWriteRequest{write: se}) + if st, ok := sc.streams[se.StreamID]; ok { + st.resetQueued = true + } +} + +// processFrameFromReader processes the serve loop's read from readFrameCh from the +// frame-reading goroutine. +// processFrameFromReader returns whether the connection should be kept open. +func (sc *serverConn) processFrameFromReader(res readFrameResult) bool { + sc.serveG.check() + err := res.err + if err != nil { + if err == ErrFrameTooLarge { + sc.goAway(ErrCodeFrameSize) + return true // goAway will close the loop + } + clientGone := err == io.EOF || err == io.ErrUnexpectedEOF || isClosedConnError(err) + if clientGone { + // TODO: could we also get into this state if + // the peer does a half close + // (e.g. CloseWrite) because they're done + // sending frames but they're still wanting + // our open replies? Investigate. + // TODO: add CloseWrite to crypto/tls.Conn first + // so we have a way to test this? I suppose + // just for testing we could have a non-TLS mode. + return false + } + } else { + f := res.f + if VerboseLogs { + sc.vlogf("http2: server read frame %v", summarizeFrame(f)) + } + err = sc.processFrame(f) + if err == nil { + return true + } + } + + switch ev := err.(type) { + case StreamError: + sc.resetStream(ev) + return true + case goAwayFlowError: + sc.goAway(ErrCodeFlowControl) + return true + case ConnectionError: + sc.logf("http2: server connection error from %v: %v", sc.conn.RemoteAddr(), ev) + sc.goAway(ErrCode(ev)) + return true // goAway will handle shutdown + default: + if res.err != nil { + sc.vlogf("http2: server closing client connection; error reading frame from client %s: %v", sc.conn.RemoteAddr(), err) + } else { + sc.logf("http2: server closing client connection: %v", err) + } + return false + } +} + +func (sc *serverConn) processFrame(f Frame) error { + sc.serveG.check() + + // First frame received must be SETTINGS. + if !sc.sawFirstSettings { + if _, ok := f.(*SettingsFrame); !ok { + return ConnectionError(ErrCodeProtocol) + } + sc.sawFirstSettings = true + } + + switch f := f.(type) { + case *SettingsFrame: + return sc.processSettings(f) + case *MetaHeadersFrame: + return sc.processHeaders(f) + case *WindowUpdateFrame: + return sc.processWindowUpdate(f) + case *PingFrame: + return sc.processPing(f) + case *DataFrame: + return sc.processData(f) + case *RSTStreamFrame: + return sc.processResetStream(f) + case *PriorityFrame: + return sc.processPriority(f) + case *GoAwayFrame: + return sc.processGoAway(f) + case *PushPromiseFrame: + // A client cannot push. Thus, servers MUST treat the receipt of a PUSH_PROMISE + // frame as a connection error (Section 5.4.1) of type PROTOCOL_ERROR. + return ConnectionError(ErrCodeProtocol) + default: + sc.vlogf("http2: server ignoring frame: %v", f.Header()) + return nil + } +} + +func (sc *serverConn) processPing(f *PingFrame) error { + sc.serveG.check() + if f.IsAck() { + // 6.7 PING: " An endpoint MUST NOT respond to PING frames + // containing this flag." + return nil + } + if f.StreamID != 0 { + // "PING frames are not associated with any individual + // stream. If a PING frame is received with a stream + // identifier field value other than 0x0, the recipient MUST + // respond with a connection error (Section 5.4.1) of type + // PROTOCOL_ERROR." + return ConnectionError(ErrCodeProtocol) + } + if sc.inGoAway && sc.goAwayCode != ErrCodeNo { + return nil + } + sc.writeFrame(FrameWriteRequest{write: writePingAck{f}}) + return nil +} + +func (sc *serverConn) processWindowUpdate(f *WindowUpdateFrame) error { + sc.serveG.check() + switch { + case f.StreamID != 0: // stream-level flow control + state, st := sc.state(f.StreamID) + if state == stateIdle { + // Section 5.1: "Receiving any frame other than HEADERS + // or PRIORITY on a stream in this state MUST be + // treated as a connection error (Section 5.4.1) of + // type PROTOCOL_ERROR." + return ConnectionError(ErrCodeProtocol) + } + if st == nil { + // "WINDOW_UPDATE can be sent by a peer that has sent a + // frame bearing the END_STREAM flag. This means that a + // receiver could receive a WINDOW_UPDATE frame on a "half + // closed (remote)" or "closed" stream. A receiver MUST + // NOT treat this as an error, see Section 5.1." + return nil + } + if !st.flow.add(int32(f.Increment)) { + return streamError(f.StreamID, ErrCodeFlowControl) + } + default: // connection-level flow control + if !sc.flow.add(int32(f.Increment)) { + return goAwayFlowError{} + } + } + sc.scheduleFrameWrite() + return nil +} + +func (sc *serverConn) processResetStream(f *RSTStreamFrame) error { + sc.serveG.check() + + state, st := sc.state(f.StreamID) + if state == stateIdle { + // 6.4 "RST_STREAM frames MUST NOT be sent for a + // stream in the "idle" state. If a RST_STREAM frame + // identifying an idle stream is received, the + // recipient MUST treat this as a connection error + // (Section 5.4.1) of type PROTOCOL_ERROR. + return ConnectionError(ErrCodeProtocol) + } + if st != nil { + st.cancelCtx() + sc.closeStream(st, streamError(f.StreamID, f.ErrCode)) + } + return nil +} + +func (sc *serverConn) closeStream(st *stream, err error) { + sc.serveG.check() + if st.state == stateIdle || st.state == stateClosed { + panic(fmt.Sprintf("invariant; can't close stream in state %v", st.state)) + } + st.state = stateClosed + if st.writeDeadline != nil { + st.writeDeadline.Stop() + } + if st.isPushed() { + sc.curPushedStreams-- + } else { + sc.curClientStreams-- + } + delete(sc.streams, st.id) + if len(sc.streams) == 0 { + sc.setConnState(http.StateIdle) + if sc.srv.IdleTimeout != 0 { + sc.idleTimer.Reset(sc.srv.IdleTimeout) + } + if h1ServerKeepAlivesDisabled(sc.hs) { + sc.startGracefulShutdownInternal() + } + } + if p := st.body; p != nil { + // Return any buffered unread bytes worth of conn-level flow control. + // See golang.org/issue/16481 + sc.sendWindowUpdate(nil, p.Len()) + + p.CloseWithError(err) + } + st.cw.Close() // signals Handler's CloseNotifier, unblocks writes, etc + sc.writeSched.CloseStream(st.id) +} + +func (sc *serverConn) processSettings(f *SettingsFrame) error { + sc.serveG.check() + if f.IsAck() { + sc.unackedSettings-- + if sc.unackedSettings < 0 { + // Why is the peer ACKing settings we never sent? + // The spec doesn't mention this case, but + // hang up on them anyway. + return ConnectionError(ErrCodeProtocol) + } + return nil + } + if err := f.ForeachSetting(sc.processSetting); err != nil { + return err + } + sc.needToSendSettingsAck = true + sc.scheduleFrameWrite() + return nil +} + +func (sc *serverConn) processSetting(s Setting) error { + sc.serveG.check() + if err := s.Valid(); err != nil { + return err + } + if VerboseLogs { + sc.vlogf("http2: server processing setting %v", s) + } + switch s.ID { + case SettingHeaderTableSize: + sc.headerTableSize = s.Val + sc.hpackEncoder.SetMaxDynamicTableSize(s.Val) + case SettingEnablePush: + sc.pushEnabled = s.Val != 0 + case SettingMaxConcurrentStreams: + sc.clientMaxStreams = s.Val + case SettingInitialWindowSize: + return sc.processSettingInitialWindowSize(s.Val) + case SettingMaxFrameSize: + sc.maxFrameSize = int32(s.Val) // the maximum valid s.Val is < 2^31 + case SettingMaxHeaderListSize: + sc.peerMaxHeaderListSize = s.Val + default: + // Unknown setting: "An endpoint that receives a SETTINGS + // frame with any unknown or unsupported identifier MUST + // ignore that setting." + if VerboseLogs { + sc.vlogf("http2: server ignoring unknown setting %v", s) + } + } + return nil +} + +func (sc *serverConn) processSettingInitialWindowSize(val uint32) error { + sc.serveG.check() + // Note: val already validated to be within range by + // processSetting's Valid call. + + // "A SETTINGS frame can alter the initial flow control window + // size for all current streams. When the value of + // SETTINGS_INITIAL_WINDOW_SIZE changes, a receiver MUST + // adjust the size of all stream flow control windows that it + // maintains by the difference between the new value and the + // old value." + old := sc.initialStreamSendWindowSize + sc.initialStreamSendWindowSize = int32(val) + growth := int32(val) - old // may be negative + for _, st := range sc.streams { + if !st.flow.add(growth) { + // 6.9.2 Initial Flow Control Window Size + // "An endpoint MUST treat a change to + // SETTINGS_INITIAL_WINDOW_SIZE that causes any flow + // control window to exceed the maximum size as a + // connection error (Section 5.4.1) of type + // FLOW_CONTROL_ERROR." + return ConnectionError(ErrCodeFlowControl) + } + } + return nil +} + +func (sc *serverConn) processData(f *DataFrame) error { + sc.serveG.check() + if sc.inGoAway && sc.goAwayCode != ErrCodeNo { + return nil + } + data := f.Data() + + // "If a DATA frame is received whose stream is not in "open" + // or "half closed (local)" state, the recipient MUST respond + // with a stream error (Section 5.4.2) of type STREAM_CLOSED." + id := f.Header().StreamID + state, st := sc.state(id) + if id == 0 || state == stateIdle { + // Section 5.1: "Receiving any frame other than HEADERS + // or PRIORITY on a stream in this state MUST be + // treated as a connection error (Section 5.4.1) of + // type PROTOCOL_ERROR." + return ConnectionError(ErrCodeProtocol) + } + if st == nil || state != stateOpen || st.gotTrailerHeader || st.resetQueued { + // This includes sending a RST_STREAM if the stream is + // in stateHalfClosedLocal (which currently means that + // the http.Handler returned, so it's done reading & + // done writing). Try to stop the client from sending + // more DATA. + + // But still enforce their connection-level flow control, + // and return any flow control bytes since we're not going + // to consume them. + if sc.inflow.available() < int32(f.Length) { + return streamError(id, ErrCodeFlowControl) + } + // Deduct the flow control from inflow, since we're + // going to immediately add it back in + // sendWindowUpdate, which also schedules sending the + // frames. + sc.inflow.take(int32(f.Length)) + sc.sendWindowUpdate(nil, int(f.Length)) // conn-level + + if st != nil && st.resetQueued { + // Already have a stream error in flight. Don't send another. + return nil + } + return streamError(id, ErrCodeStreamClosed) + } + if st.body == nil { + panic("internal error: should have a body in this state") + } + + // Sender sending more than they'd declared? + if st.declBodyBytes != -1 && st.bodyBytes+int64(len(data)) > st.declBodyBytes { + st.body.CloseWithError(fmt.Errorf("sender tried to send more than declared Content-Length of %d bytes", st.declBodyBytes)) + return streamError(id, ErrCodeStreamClosed) + } + if f.Length > 0 { + // Check whether the client has flow control quota. + if st.inflow.available() < int32(f.Length) { + return streamError(id, ErrCodeFlowControl) + } + st.inflow.take(int32(f.Length)) + + if len(data) > 0 { + wrote, err := st.body.Write(data) + if err != nil { + return streamError(id, ErrCodeStreamClosed) + } + if wrote != len(data) { + panic("internal error: bad Writer") + } + st.bodyBytes += int64(len(data)) + } + + // Return any padded flow control now, since we won't + // refund it later on body reads. + if pad := int32(f.Length) - int32(len(data)); pad > 0 { + sc.sendWindowUpdate32(nil, pad) + sc.sendWindowUpdate32(st, pad) + } + } + if f.StreamEnded() { + st.endStream() + } + return nil +} + +func (sc *serverConn) processGoAway(f *GoAwayFrame) error { + sc.serveG.check() + if f.ErrCode != ErrCodeNo { + sc.logf("http2: received GOAWAY %+v, starting graceful shutdown", f) + } else { + sc.vlogf("http2: received GOAWAY %+v, starting graceful shutdown", f) + } + sc.startGracefulShutdownInternal() + // http://tools.ietf.org/html/rfc7540#section-6.8 + // We should not create any new streams, which means we should disable push. + sc.pushEnabled = false + return nil +} + +// isPushed reports whether the stream is server-initiated. +func (st *stream) isPushed() bool { + return st.id%2 == 0 +} + +// endStream closes a Request.Body's pipe. It is called when a DATA +// frame says a request body is over (or after trailers). +func (st *stream) endStream() { + sc := st.sc + sc.serveG.check() + + if st.declBodyBytes != -1 && st.declBodyBytes != st.bodyBytes { + st.body.CloseWithError(fmt.Errorf("request declared a Content-Length of %d but only wrote %d bytes", + st.declBodyBytes, st.bodyBytes)) + } else { + st.body.closeWithErrorAndCode(io.EOF, st.copyTrailersToHandlerRequest) + st.body.CloseWithError(io.EOF) + } + st.state = stateHalfClosedRemote +} + +// copyTrailersToHandlerRequest is run in the Handler's goroutine in +// its Request.Body.Read just before it gets io.EOF. +func (st *stream) copyTrailersToHandlerRequest() { + for k, vv := range st.trailer { + if _, ok := st.reqTrailer[k]; ok { + // Only copy it over it was pre-declared. + st.reqTrailer[k] = vv + } + } +} + +// onWriteTimeout is run on its own goroutine (from time.AfterFunc) +// when the stream's WriteTimeout has fired. +func (st *stream) onWriteTimeout() { + st.sc.writeFrameFromHandler(FrameWriteRequest{write: streamError(st.id, ErrCodeInternal)}) +} + +func (sc *serverConn) processHeaders(f *MetaHeadersFrame) error { + sc.serveG.check() + id := f.StreamID + if sc.inGoAway { + // Ignore. + return nil + } + // http://tools.ietf.org/html/rfc7540#section-5.1.1 + // Streams initiated by a client MUST use odd-numbered stream + // identifiers. [...] An endpoint that receives an unexpected + // stream identifier MUST respond with a connection error + // (Section 5.4.1) of type PROTOCOL_ERROR. + if id%2 != 1 { + return ConnectionError(ErrCodeProtocol) + } + // A HEADERS frame can be used to create a new stream or + // send a trailer for an open one. If we already have a stream + // open, let it process its own HEADERS frame (trailers at this + // point, if it's valid). + if st := sc.streams[f.StreamID]; st != nil { + if st.resetQueued { + // We're sending RST_STREAM to close the stream, so don't bother + // processing this frame. + return nil + } + return st.processTrailerHeaders(f) + } + + // [...] The identifier of a newly established stream MUST be + // numerically greater than all streams that the initiating + // endpoint has opened or reserved. [...] An endpoint that + // receives an unexpected stream identifier MUST respond with + // a connection error (Section 5.4.1) of type PROTOCOL_ERROR. + if id <= sc.maxClientStreamID { + return ConnectionError(ErrCodeProtocol) + } + sc.maxClientStreamID = id + + if sc.idleTimer != nil { + sc.idleTimer.Stop() + } + + // http://tools.ietf.org/html/rfc7540#section-5.1.2 + // [...] Endpoints MUST NOT exceed the limit set by their peer. An + // endpoint that receives a HEADERS frame that causes their + // advertised concurrent stream limit to be exceeded MUST treat + // this as a stream error (Section 5.4.2) of type PROTOCOL_ERROR + // or REFUSED_STREAM. + if sc.curClientStreams+1 > sc.advMaxStreams { + if sc.unackedSettings == 0 { + // They should know better. + return streamError(id, ErrCodeProtocol) + } + // Assume it's a network race, where they just haven't + // received our last SETTINGS update. But actually + // this can't happen yet, because we don't yet provide + // a way for users to adjust server parameters at + // runtime. + return streamError(id, ErrCodeRefusedStream) + } + + initialState := stateOpen + if f.StreamEnded() { + initialState = stateHalfClosedRemote + } + st := sc.newStream(id, 0, initialState) + + if f.HasPriority() { + if err := checkPriority(f.StreamID, f.Priority); err != nil { + return err + } + sc.writeSched.AdjustStream(st.id, f.Priority) + } + + rw, req, err := sc.newWriterAndRequest(st, f) + if err != nil { + return err + } + st.reqTrailer = req.Trailer + if st.reqTrailer != nil { + st.trailer = make(http.Header) + } + st.body = req.Body.(*requestBody).pipe // may be nil + st.declBodyBytes = req.ContentLength + + handler := sc.handler.ServeHTTP + if f.Truncated { + // Their header list was too long. Send a 431 error. + handler = handleHeaderListTooLong + } else if err := checkValidHTTP2RequestHeaders(req.Header); err != nil { + handler = new400Handler(err) + } + + // The net/http package sets the read deadline from the + // http.Server.ReadTimeout during the TLS handshake, but then + // passes the connection off to us with the deadline already + // set. Disarm it here after the request headers are read, + // similar to how the http1 server works. Here it's + // technically more like the http1 Server's ReadHeaderTimeout + // (in Go 1.8), though. That's a more sane option anyway. + if sc.hs.ReadTimeout != 0 { + sc.conn.SetReadDeadline(time.Time{}) + } + + go sc.runHandler(rw, req, handler) + return nil +} + +func (st *stream) processTrailerHeaders(f *MetaHeadersFrame) error { + sc := st.sc + sc.serveG.check() + if st.gotTrailerHeader { + return ConnectionError(ErrCodeProtocol) + } + st.gotTrailerHeader = true + if !f.StreamEnded() { + return streamError(st.id, ErrCodeProtocol) + } + + if len(f.PseudoFields()) > 0 { + return streamError(st.id, ErrCodeProtocol) + } + if st.trailer != nil { + for _, hf := range f.RegularFields() { + key := sc.canonicalHeader(hf.Name) + if !ValidTrailerHeader(key) { + // TODO: send more details to the peer somehow. But http2 has + // no way to send debug data at a stream level. Discuss with + // HTTP folk. + return streamError(st.id, ErrCodeProtocol) + } + st.trailer[key] = append(st.trailer[key], hf.Value) + } + } + st.endStream() + return nil +} + +func checkPriority(streamID uint32, p PriorityParam) error { + if streamID == p.StreamDep { + // Section 5.3.1: "A stream cannot depend on itself. An endpoint MUST treat + // this as a stream error (Section 5.4.2) of type PROTOCOL_ERROR." + // Section 5.3.3 says that a stream can depend on one of its dependencies, + // so it's only self-dependencies that are forbidden. + return streamError(streamID, ErrCodeProtocol) + } + return nil +} + +func (sc *serverConn) processPriority(f *PriorityFrame) error { + if sc.inGoAway { + return nil + } + if err := checkPriority(f.StreamID, f.PriorityParam); err != nil { + return err + } + sc.writeSched.AdjustStream(f.StreamID, f.PriorityParam) + return nil +} + +func (sc *serverConn) newStream(id, pusherID uint32, state streamState) *stream { + sc.serveG.check() + if id == 0 { + panic("internal error: cannot create stream with id 0") + } + + ctx, cancelCtx := contextWithCancel(sc.baseCtx) + st := &stream{ + sc: sc, + id: id, + state: state, + ctx: ctx, + cancelCtx: cancelCtx, + } + st.cw.Init() + st.flow.conn = &sc.flow // link to conn-level counter + st.flow.add(sc.initialStreamSendWindowSize) + st.inflow.conn = &sc.inflow // link to conn-level counter + st.inflow.add(sc.srv.initialStreamRecvWindowSize()) + if sc.hs.WriteTimeout != 0 { + st.writeDeadline = time.AfterFunc(sc.hs.WriteTimeout, st.onWriteTimeout) + } + + sc.streams[id] = st + sc.writeSched.OpenStream(st.id, OpenStreamOptions{PusherID: pusherID}) + if st.isPushed() { + sc.curPushedStreams++ + } else { + sc.curClientStreams++ + } + if sc.curOpenStreams() == 1 { + sc.setConnState(http.StateActive) + } + + return st +} + +func (sc *serverConn) newWriterAndRequest(st *stream, f *MetaHeadersFrame) (*responseWriter, *http.Request, error) { + sc.serveG.check() + + rp := requestParam{ + method: f.PseudoValue("method"), + scheme: f.PseudoValue("scheme"), + authority: f.PseudoValue("authority"), + path: f.PseudoValue("path"), + } + + isConnect := rp.method == "CONNECT" + if isConnect { + if rp.path != "" || rp.scheme != "" || rp.authority == "" { + return nil, nil, streamError(f.StreamID, ErrCodeProtocol) + } + } else if rp.method == "" || rp.path == "" || (rp.scheme != "https" && rp.scheme != "http") { + // See 8.1.2.6 Malformed Requests and Responses: + // + // Malformed requests or responses that are detected + // MUST be treated as a stream error (Section 5.4.2) + // of type PROTOCOL_ERROR." + // + // 8.1.2.3 Request Pseudo-Header Fields + // "All HTTP/2 requests MUST include exactly one valid + // value for the :method, :scheme, and :path + // pseudo-header fields" + return nil, nil, streamError(f.StreamID, ErrCodeProtocol) + } + + bodyOpen := !f.StreamEnded() + if rp.method == "HEAD" && bodyOpen { + // HEAD requests can't have bodies + return nil, nil, streamError(f.StreamID, ErrCodeProtocol) + } + + rp.header = make(http.Header) + for _, hf := range f.RegularFields() { + rp.header.Add(sc.canonicalHeader(hf.Name), hf.Value) + } + if rp.authority == "" { + rp.authority = rp.header.Get("Host") + } + + rw, req, err := sc.newWriterAndRequestNoBody(st, rp) + if err != nil { + return nil, nil, err + } + if bodyOpen { + if vv, ok := rp.header["Content-Length"]; ok { + req.ContentLength, _ = strconv.ParseInt(vv[0], 10, 64) + } else { + req.ContentLength = -1 + } + req.Body.(*requestBody).pipe = &pipe{ + b: &dataBuffer{expected: req.ContentLength}, + } + } + return rw, req, nil +} + +type requestParam struct { + method string + scheme, authority, path string + header http.Header +} + +func (sc *serverConn) newWriterAndRequestNoBody(st *stream, rp requestParam) (*responseWriter, *http.Request, error) { + sc.serveG.check() + + var tlsState *tls.ConnectionState // nil if not scheme https + if rp.scheme == "https" { + tlsState = sc.tlsState + } + + needsContinue := rp.header.Get("Expect") == "100-continue" + if needsContinue { + rp.header.Del("Expect") + } + // Merge Cookie headers into one "; "-delimited value. + if cookies := rp.header["Cookie"]; len(cookies) > 1 { + rp.header.Set("Cookie", strings.Join(cookies, "; ")) + } + + // Setup Trailers + var trailer http.Header + for _, v := range rp.header["Trailer"] { + for _, key := range strings.Split(v, ",") { + key = http.CanonicalHeaderKey(strings.TrimSpace(key)) + switch key { + case "Transfer-Encoding", "Trailer", "Content-Length": + // Bogus. (copy of http1 rules) + // Ignore. + default: + if trailer == nil { + trailer = make(http.Header) + } + trailer[key] = nil + } + } + } + delete(rp.header, "Trailer") + + var url_ *url.URL + var requestURI string + if rp.method == "CONNECT" { + url_ = &url.URL{Host: rp.authority} + requestURI = rp.authority // mimic HTTP/1 server behavior + } else { + var err error + url_, err = url.ParseRequestURI(rp.path) + if err != nil { + return nil, nil, streamError(st.id, ErrCodeProtocol) + } + requestURI = rp.path + } + + body := &requestBody{ + conn: sc, + stream: st, + needsContinue: needsContinue, + } + req := &http.Request{ + Method: rp.method, + URL: url_, + RemoteAddr: sc.remoteAddrStr, + Header: rp.header, + RequestURI: requestURI, + Proto: "HTTP/2.0", + ProtoMajor: 2, + ProtoMinor: 0, + TLS: tlsState, + Host: rp.authority, + Body: body, + Trailer: trailer, + } + req = requestWithContext(req, st.ctx) + + rws := responseWriterStatePool.Get().(*responseWriterState) + bwSave := rws.bw + *rws = responseWriterState{} // zero all the fields + rws.conn = sc + rws.bw = bwSave + rws.bw.Reset(chunkWriter{rws}) + rws.stream = st + rws.req = req + rws.body = body + + rw := &responseWriter{rws: rws} + return rw, req, nil +} + +// Run on its own goroutine. +func (sc *serverConn) runHandler(rw *responseWriter, req *http.Request, handler func(http.ResponseWriter, *http.Request)) { + didPanic := true + defer func() { + rw.rws.stream.cancelCtx() + if didPanic { + e := recover() + sc.writeFrameFromHandler(FrameWriteRequest{ + write: handlerPanicRST{rw.rws.stream.id}, + stream: rw.rws.stream, + }) + // Same as net/http: + if shouldLogPanic(e) { + const size = 64 << 10 + buf := make([]byte, size) + buf = buf[:runtime.Stack(buf, false)] + sc.logf("http2: panic serving %v: %v\n%s", sc.conn.RemoteAddr(), e, buf) + } + return + } + rw.handlerDone() + }() + handler(rw, req) + didPanic = false +} + +func handleHeaderListTooLong(w http.ResponseWriter, r *http.Request) { + // 10.5.1 Limits on Header Block Size: + // .. "A server that receives a larger header block than it is + // willing to handle can send an HTTP 431 (Request Header Fields Too + // Large) status code" + const statusRequestHeaderFieldsTooLarge = 431 // only in Go 1.6+ + w.WriteHeader(statusRequestHeaderFieldsTooLarge) + io.WriteString(w, "

    HTTP Error 431

    Request Header Field(s) Too Large

    ") +} + +// called from handler goroutines. +// h may be nil. +func (sc *serverConn) writeHeaders(st *stream, headerData *writeResHeaders) error { + sc.serveG.checkNotOn() // NOT on + var errc chan error + if headerData.h != nil { + // If there's a header map (which we don't own), so we have to block on + // waiting for this frame to be written, so an http.Flush mid-handler + // writes out the correct value of keys, before a handler later potentially + // mutates it. + errc = errChanPool.Get().(chan error) + } + if err := sc.writeFrameFromHandler(FrameWriteRequest{ + write: headerData, + stream: st, + done: errc, + }); err != nil { + return err + } + if errc != nil { + select { + case err := <-errc: + errChanPool.Put(errc) + return err + case <-sc.doneServing: + return errClientDisconnected + case <-st.cw: + return errStreamClosed + } + } + return nil +} + +// called from handler goroutines. +func (sc *serverConn) write100ContinueHeaders(st *stream) { + sc.writeFrameFromHandler(FrameWriteRequest{ + write: write100ContinueHeadersFrame{st.id}, + stream: st, + }) +} + +// A bodyReadMsg tells the server loop that the http.Handler read n +// bytes of the DATA from the client on the given stream. +type bodyReadMsg struct { + st *stream + n int +} + +// called from handler goroutines. +// Notes that the handler for the given stream ID read n bytes of its body +// and schedules flow control tokens to be sent. +func (sc *serverConn) noteBodyReadFromHandler(st *stream, n int, err error) { + sc.serveG.checkNotOn() // NOT on + if n > 0 { + select { + case sc.bodyReadCh <- bodyReadMsg{st, n}: + case <-sc.doneServing: + } + } +} + +func (sc *serverConn) noteBodyRead(st *stream, n int) { + sc.serveG.check() + sc.sendWindowUpdate(nil, n) // conn-level + if st.state != stateHalfClosedRemote && st.state != stateClosed { + // Don't send this WINDOW_UPDATE if the stream is closed + // remotely. + sc.sendWindowUpdate(st, n) + } +} + +// st may be nil for conn-level +func (sc *serverConn) sendWindowUpdate(st *stream, n int) { + sc.serveG.check() + // "The legal range for the increment to the flow control + // window is 1 to 2^31-1 (2,147,483,647) octets." + // A Go Read call on 64-bit machines could in theory read + // a larger Read than this. Very unlikely, but we handle it here + // rather than elsewhere for now. + const maxUint31 = 1<<31 - 1 + for n >= maxUint31 { + sc.sendWindowUpdate32(st, maxUint31) + n -= maxUint31 + } + sc.sendWindowUpdate32(st, int32(n)) +} + +// st may be nil for conn-level +func (sc *serverConn) sendWindowUpdate32(st *stream, n int32) { + sc.serveG.check() + if n == 0 { + return + } + if n < 0 { + panic("negative update") + } + var streamID uint32 + if st != nil { + streamID = st.id + } + sc.writeFrame(FrameWriteRequest{ + write: writeWindowUpdate{streamID: streamID, n: uint32(n)}, + stream: st, + }) + var ok bool + if st == nil { + ok = sc.inflow.add(n) + } else { + ok = st.inflow.add(n) + } + if !ok { + panic("internal error; sent too many window updates without decrements?") + } +} + +// requestBody is the Handler's Request.Body type. +// Read and Close may be called concurrently. +type requestBody struct { + stream *stream + conn *serverConn + closed bool // for use by Close only + sawEOF bool // for use by Read only + pipe *pipe // non-nil if we have a HTTP entity message body + needsContinue bool // need to send a 100-continue +} + +func (b *requestBody) Close() error { + if b.pipe != nil && !b.closed { + b.pipe.BreakWithError(errClosedBody) + } + b.closed = true + return nil +} + +func (b *requestBody) Read(p []byte) (n int, err error) { + if b.needsContinue { + b.needsContinue = false + b.conn.write100ContinueHeaders(b.stream) + } + if b.pipe == nil || b.sawEOF { + return 0, io.EOF + } + n, err = b.pipe.Read(p) + if err == io.EOF { + b.sawEOF = true + } + if b.conn == nil && inTests { + return + } + b.conn.noteBodyReadFromHandler(b.stream, n, err) + return +} + +// responseWriter is the http.ResponseWriter implementation. It's +// intentionally small (1 pointer wide) to minimize garbage. The +// responseWriterState pointer inside is zeroed at the end of a +// request (in handlerDone) and calls on the responseWriter thereafter +// simply crash (caller's mistake), but the much larger responseWriterState +// and buffers are reused between multiple requests. +type responseWriter struct { + rws *responseWriterState +} + +// Optional http.ResponseWriter interfaces implemented. +var ( + _ http.CloseNotifier = (*responseWriter)(nil) + _ http.Flusher = (*responseWriter)(nil) + _ stringWriter = (*responseWriter)(nil) +) + +type responseWriterState struct { + // immutable within a request: + stream *stream + req *http.Request + body *requestBody // to close at end of request, if DATA frames didn't + conn *serverConn + + // TODO: adjust buffer writing sizes based on server config, frame size updates from peer, etc + bw *bufio.Writer // writing to a chunkWriter{this *responseWriterState} + + // mutated by http.Handler goroutine: + handlerHeader http.Header // nil until called + snapHeader http.Header // snapshot of handlerHeader at WriteHeader time + trailers []string // set in writeChunk + status int // status code passed to WriteHeader + wroteHeader bool // WriteHeader called (explicitly or implicitly). Not necessarily sent to user yet. + sentHeader bool // have we sent the header frame? + handlerDone bool // handler has finished + dirty bool // a Write failed; don't reuse this responseWriterState + + sentContentLen int64 // non-zero if handler set a Content-Length header + wroteBytes int64 + + closeNotifierMu sync.Mutex // guards closeNotifierCh + closeNotifierCh chan bool // nil until first used +} + +type chunkWriter struct{ rws *responseWriterState } + +func (cw chunkWriter) Write(p []byte) (n int, err error) { return cw.rws.writeChunk(p) } + +func (rws *responseWriterState) hasTrailers() bool { return len(rws.trailers) != 0 } + +// declareTrailer is called for each Trailer header when the +// response header is written. It notes that a header will need to be +// written in the trailers at the end of the response. +func (rws *responseWriterState) declareTrailer(k string) { + k = http.CanonicalHeaderKey(k) + if !ValidTrailerHeader(k) { + // Forbidden by RFC 2616 14.40. + rws.conn.logf("ignoring invalid trailer %q", k) + return + } + if !strSliceContains(rws.trailers, k) { + rws.trailers = append(rws.trailers, k) + } +} + +// writeChunk writes chunks from the bufio.Writer. But because +// bufio.Writer may bypass its chunking, sometimes p may be +// arbitrarily large. +// +// writeChunk is also responsible (on the first chunk) for sending the +// HEADER response. +func (rws *responseWriterState) writeChunk(p []byte) (n int, err error) { + if !rws.wroteHeader { + rws.writeHeader(200) + } + + isHeadResp := rws.req.Method == "HEAD" + if !rws.sentHeader { + rws.sentHeader = true + var ctype, clen string + if clen = rws.snapHeader.Get("Content-Length"); clen != "" { + rws.snapHeader.Del("Content-Length") + clen64, err := strconv.ParseInt(clen, 10, 64) + if err == nil && clen64 >= 0 { + rws.sentContentLen = clen64 + } else { + clen = "" + } + } + if clen == "" && rws.handlerDone && bodyAllowedForStatus(rws.status) && (len(p) > 0 || !isHeadResp) { + clen = strconv.Itoa(len(p)) + } + _, hasContentType := rws.snapHeader["Content-Type"] + if !hasContentType && bodyAllowedForStatus(rws.status) { + ctype = http.DetectContentType(p) + } + var date string + if _, ok := rws.snapHeader["Date"]; !ok { + // TODO(bradfitz): be faster here, like net/http? measure. + date = time.Now().UTC().Format(http.TimeFormat) + } + + for _, v := range rws.snapHeader["Trailer"] { + foreachHeaderElement(v, rws.declareTrailer) + } + + endStream := (rws.handlerDone && !rws.hasTrailers() && len(p) == 0) || isHeadResp + err = rws.conn.writeHeaders(rws.stream, &writeResHeaders{ + streamID: rws.stream.id, + httpResCode: rws.status, + h: rws.snapHeader, + endStream: endStream, + contentType: ctype, + contentLength: clen, + date: date, + }) + if err != nil { + rws.dirty = true + return 0, err + } + if endStream { + return 0, nil + } + } + if isHeadResp { + return len(p), nil + } + if len(p) == 0 && !rws.handlerDone { + return 0, nil + } + + if rws.handlerDone { + rws.promoteUndeclaredTrailers() + } + + endStream := rws.handlerDone && !rws.hasTrailers() + if len(p) > 0 || endStream { + // only send a 0 byte DATA frame if we're ending the stream. + if err := rws.conn.writeDataFromHandler(rws.stream, p, endStream); err != nil { + rws.dirty = true + return 0, err + } + } + + if rws.handlerDone && rws.hasTrailers() { + err = rws.conn.writeHeaders(rws.stream, &writeResHeaders{ + streamID: rws.stream.id, + h: rws.handlerHeader, + trailers: rws.trailers, + endStream: true, + }) + if err != nil { + rws.dirty = true + } + return len(p), err + } + return len(p), nil +} + +// TrailerPrefix is a magic prefix for ResponseWriter.Header map keys +// that, if present, signals that the map entry is actually for +// the response trailers, and not the response headers. The prefix +// is stripped after the ServeHTTP call finishes and the values are +// sent in the trailers. +// +// This mechanism is intended only for trailers that are not known +// prior to the headers being written. If the set of trailers is fixed +// or known before the header is written, the normal Go trailers mechanism +// is preferred: +// https://golang.org/pkg/net/http/#ResponseWriter +// https://golang.org/pkg/net/http/#example_ResponseWriter_trailers +const TrailerPrefix = "Trailer:" + +// promoteUndeclaredTrailers permits http.Handlers to set trailers +// after the header has already been flushed. Because the Go +// ResponseWriter interface has no way to set Trailers (only the +// Header), and because we didn't want to expand the ResponseWriter +// interface, and because nobody used trailers, and because RFC 2616 +// says you SHOULD (but not must) predeclare any trailers in the +// header, the official ResponseWriter rules said trailers in Go must +// be predeclared, and then we reuse the same ResponseWriter.Header() +// map to mean both Headers and Trailers. When it's time to write the +// Trailers, we pick out the fields of Headers that were declared as +// trailers. That worked for a while, until we found the first major +// user of Trailers in the wild: gRPC (using them only over http2), +// and gRPC libraries permit setting trailers mid-stream without +// predeclarnig them. So: change of plans. We still permit the old +// way, but we also permit this hack: if a Header() key begins with +// "Trailer:", the suffix of that key is a Trailer. Because ':' is an +// invalid token byte anyway, there is no ambiguity. (And it's already +// filtered out) It's mildly hacky, but not terrible. +// +// This method runs after the Handler is done and promotes any Header +// fields to be trailers. +func (rws *responseWriterState) promoteUndeclaredTrailers() { + for k, vv := range rws.handlerHeader { + if !strings.HasPrefix(k, TrailerPrefix) { + continue + } + trailerKey := strings.TrimPrefix(k, TrailerPrefix) + rws.declareTrailer(trailerKey) + rws.handlerHeader[http.CanonicalHeaderKey(trailerKey)] = vv + } + + if len(rws.trailers) > 1 { + sorter := sorterPool.Get().(*sorter) + sorter.SortStrings(rws.trailers) + sorterPool.Put(sorter) + } +} + +func (w *responseWriter) Flush() { + rws := w.rws + if rws == nil { + panic("Header called after Handler finished") + } + if rws.bw.Buffered() > 0 { + if err := rws.bw.Flush(); err != nil { + // Ignore the error. The frame writer already knows. + return + } + } else { + // The bufio.Writer won't call chunkWriter.Write + // (writeChunk with zero bytes, so we have to do it + // ourselves to force the HTTP response header and/or + // final DATA frame (with END_STREAM) to be sent. + rws.writeChunk(nil) + } +} + +func (w *responseWriter) CloseNotify() <-chan bool { + rws := w.rws + if rws == nil { + panic("CloseNotify called after Handler finished") + } + rws.closeNotifierMu.Lock() + ch := rws.closeNotifierCh + if ch == nil { + ch = make(chan bool, 1) + rws.closeNotifierCh = ch + cw := rws.stream.cw + go func() { + cw.Wait() // wait for close + ch <- true + }() + } + rws.closeNotifierMu.Unlock() + return ch +} + +func (w *responseWriter) Header() http.Header { + rws := w.rws + if rws == nil { + panic("Header called after Handler finished") + } + if rws.handlerHeader == nil { + rws.handlerHeader = make(http.Header) + } + return rws.handlerHeader +} + +func (w *responseWriter) WriteHeader(code int) { + rws := w.rws + if rws == nil { + panic("WriteHeader called after Handler finished") + } + rws.writeHeader(code) +} + +func (rws *responseWriterState) writeHeader(code int) { + if !rws.wroteHeader { + rws.wroteHeader = true + rws.status = code + if len(rws.handlerHeader) > 0 { + rws.snapHeader = cloneHeader(rws.handlerHeader) + } + } +} + +func cloneHeader(h http.Header) http.Header { + h2 := make(http.Header, len(h)) + for k, vv := range h { + vv2 := make([]string, len(vv)) + copy(vv2, vv) + h2[k] = vv2 + } + return h2 +} + +// The Life Of A Write is like this: +// +// * Handler calls w.Write or w.WriteString -> +// * -> rws.bw (*bufio.Writer) -> +// * (Handler might call Flush) +// * -> chunkWriter{rws} +// * -> responseWriterState.writeChunk(p []byte) +// * -> responseWriterState.writeChunk (most of the magic; see comment there) +func (w *responseWriter) Write(p []byte) (n int, err error) { + return w.write(len(p), p, "") +} + +func (w *responseWriter) WriteString(s string) (n int, err error) { + return w.write(len(s), nil, s) +} + +// either dataB or dataS is non-zero. +func (w *responseWriter) write(lenData int, dataB []byte, dataS string) (n int, err error) { + rws := w.rws + if rws == nil { + panic("Write called after Handler finished") + } + if !rws.wroteHeader { + w.WriteHeader(200) + } + if !bodyAllowedForStatus(rws.status) { + return 0, http.ErrBodyNotAllowed + } + rws.wroteBytes += int64(len(dataB)) + int64(len(dataS)) // only one can be set + if rws.sentContentLen != 0 && rws.wroteBytes > rws.sentContentLen { + // TODO: send a RST_STREAM + return 0, errors.New("http2: handler wrote more than declared Content-Length") + } + + if dataB != nil { + return rws.bw.Write(dataB) + } else { + return rws.bw.WriteString(dataS) + } +} + +func (w *responseWriter) handlerDone() { + rws := w.rws + dirty := rws.dirty + rws.handlerDone = true + w.Flush() + w.rws = nil + if !dirty { + // Only recycle the pool if all prior Write calls to + // the serverConn goroutine completed successfully. If + // they returned earlier due to resets from the peer + // there might still be write goroutines outstanding + // from the serverConn referencing the rws memory. See + // issue 20704. + responseWriterStatePool.Put(rws) + } +} + +// Push errors. +var ( + ErrRecursivePush = errors.New("http2: recursive push not allowed") + ErrPushLimitReached = errors.New("http2: push would exceed peer's SETTINGS_MAX_CONCURRENT_STREAMS") +) + +// pushOptions is the internal version of http.PushOptions, which we +// cannot include here because it's only defined in Go 1.8 and later. +type pushOptions struct { + Method string + Header http.Header +} + +func (w *responseWriter) push(target string, opts pushOptions) error { + st := w.rws.stream + sc := st.sc + sc.serveG.checkNotOn() + + // No recursive pushes: "PUSH_PROMISE frames MUST only be sent on a peer-initiated stream." + // http://tools.ietf.org/html/rfc7540#section-6.6 + if st.isPushed() { + return ErrRecursivePush + } + + // Default options. + if opts.Method == "" { + opts.Method = "GET" + } + if opts.Header == nil { + opts.Header = http.Header{} + } + wantScheme := "http" + if w.rws.req.TLS != nil { + wantScheme = "https" + } + + // Validate the request. + u, err := url.Parse(target) + if err != nil { + return err + } + if u.Scheme == "" { + if !strings.HasPrefix(target, "/") { + return fmt.Errorf("target must be an absolute URL or an absolute path: %q", target) + } + u.Scheme = wantScheme + u.Host = w.rws.req.Host + } else { + if u.Scheme != wantScheme { + return fmt.Errorf("cannot push URL with scheme %q from request with scheme %q", u.Scheme, wantScheme) + } + if u.Host == "" { + return errors.New("URL must have a host") + } + } + for k := range opts.Header { + if strings.HasPrefix(k, ":") { + return fmt.Errorf("promised request headers cannot include pseudo header %q", k) + } + // These headers are meaningful only if the request has a body, + // but PUSH_PROMISE requests cannot have a body. + // http://tools.ietf.org/html/rfc7540#section-8.2 + // Also disallow Host, since the promised URL must be absolute. + switch strings.ToLower(k) { + case "content-length", "content-encoding", "trailer", "te", "expect", "host": + return fmt.Errorf("promised request headers cannot include %q", k) + } + } + if err := checkValidHTTP2RequestHeaders(opts.Header); err != nil { + return err + } + + // The RFC effectively limits promised requests to GET and HEAD: + // "Promised requests MUST be cacheable [GET, HEAD, or POST], and MUST be safe [GET or HEAD]" + // http://tools.ietf.org/html/rfc7540#section-8.2 + if opts.Method != "GET" && opts.Method != "HEAD" { + return fmt.Errorf("method %q must be GET or HEAD", opts.Method) + } + + msg := &startPushRequest{ + parent: st, + method: opts.Method, + url: u, + header: cloneHeader(opts.Header), + done: errChanPool.Get().(chan error), + } + + select { + case <-sc.doneServing: + return errClientDisconnected + case <-st.cw: + return errStreamClosed + case sc.serveMsgCh <- msg: + } + + select { + case <-sc.doneServing: + return errClientDisconnected + case <-st.cw: + return errStreamClosed + case err := <-msg.done: + errChanPool.Put(msg.done) + return err + } +} + +type startPushRequest struct { + parent *stream + method string + url *url.URL + header http.Header + done chan error +} + +func (sc *serverConn) startPush(msg *startPushRequest) { + sc.serveG.check() + + // http://tools.ietf.org/html/rfc7540#section-6.6. + // PUSH_PROMISE frames MUST only be sent on a peer-initiated stream that + // is in either the "open" or "half-closed (remote)" state. + if msg.parent.state != stateOpen && msg.parent.state != stateHalfClosedRemote { + // responseWriter.Push checks that the stream is peer-initiaed. + msg.done <- errStreamClosed + return + } + + // http://tools.ietf.org/html/rfc7540#section-6.6. + if !sc.pushEnabled { + msg.done <- http.ErrNotSupported + return + } + + // PUSH_PROMISE frames must be sent in increasing order by stream ID, so + // we allocate an ID for the promised stream lazily, when the PUSH_PROMISE + // is written. Once the ID is allocated, we start the request handler. + allocatePromisedID := func() (uint32, error) { + sc.serveG.check() + + // Check this again, just in case. Technically, we might have received + // an updated SETTINGS by the time we got around to writing this frame. + if !sc.pushEnabled { + return 0, http.ErrNotSupported + } + // http://tools.ietf.org/html/rfc7540#section-6.5.2. + if sc.curPushedStreams+1 > sc.clientMaxStreams { + return 0, ErrPushLimitReached + } + + // http://tools.ietf.org/html/rfc7540#section-5.1.1. + // Streams initiated by the server MUST use even-numbered identifiers. + // A server that is unable to establish a new stream identifier can send a GOAWAY + // frame so that the client is forced to open a new connection for new streams. + if sc.maxPushPromiseID+2 >= 1<<31 { + sc.startGracefulShutdownInternal() + return 0, ErrPushLimitReached + } + sc.maxPushPromiseID += 2 + promisedID := sc.maxPushPromiseID + + // http://tools.ietf.org/html/rfc7540#section-8.2. + // Strictly speaking, the new stream should start in "reserved (local)", then + // transition to "half closed (remote)" after sending the initial HEADERS, but + // we start in "half closed (remote)" for simplicity. + // See further comments at the definition of stateHalfClosedRemote. + promised := sc.newStream(promisedID, msg.parent.id, stateHalfClosedRemote) + rw, req, err := sc.newWriterAndRequestNoBody(promised, requestParam{ + method: msg.method, + scheme: msg.url.Scheme, + authority: msg.url.Host, + path: msg.url.RequestURI(), + header: cloneHeader(msg.header), // clone since handler runs concurrently with writing the PUSH_PROMISE + }) + if err != nil { + // Should not happen, since we've already validated msg.url. + panic(fmt.Sprintf("newWriterAndRequestNoBody(%+v): %v", msg.url, err)) + } + + go sc.runHandler(rw, req, sc.handler.ServeHTTP) + return promisedID, nil + } + + sc.writeFrame(FrameWriteRequest{ + write: &writePushPromise{ + streamID: msg.parent.id, + method: msg.method, + url: msg.url, + h: msg.header, + allocatePromisedID: allocatePromisedID, + }, + stream: msg.parent, + done: msg.done, + }) +} + +// foreachHeaderElement splits v according to the "#rule" construction +// in RFC 2616 section 2.1 and calls fn for each non-empty element. +func foreachHeaderElement(v string, fn func(string)) { + v = textproto.TrimString(v) + if v == "" { + return + } + if !strings.Contains(v, ",") { + fn(v) + return + } + for _, f := range strings.Split(v, ",") { + if f = textproto.TrimString(f); f != "" { + fn(f) + } + } +} + +// From http://httpwg.org/specs/rfc7540.html#rfc.section.8.1.2.2 +var connHeaders = []string{ + "Connection", + "Keep-Alive", + "Proxy-Connection", + "Transfer-Encoding", + "Upgrade", +} + +// checkValidHTTP2RequestHeaders checks whether h is a valid HTTP/2 request, +// per RFC 7540 Section 8.1.2.2. +// The returned error is reported to users. +func checkValidHTTP2RequestHeaders(h http.Header) error { + for _, k := range connHeaders { + if _, ok := h[k]; ok { + return fmt.Errorf("request header %q is not valid in HTTP/2", k) + } + } + te := h["Te"] + if len(te) > 0 && (len(te) > 1 || (te[0] != "trailers" && te[0] != "")) { + return errors.New(`request header "TE" may only be "trailers" in HTTP/2`) + } + return nil +} + +func new400Handler(err error) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + http.Error(w, err.Error(), http.StatusBadRequest) + } +} + +// ValidTrailerHeader reports whether name is a valid header field name to appear +// in trailers. +// See: http://tools.ietf.org/html/rfc7230#section-4.1.2 +func ValidTrailerHeader(name string) bool { + name = http.CanonicalHeaderKey(name) + if strings.HasPrefix(name, "If-") || badTrailer[name] { + return false + } + return true +} + +var badTrailer = map[string]bool{ + "Authorization": true, + "Cache-Control": true, + "Connection": true, + "Content-Encoding": true, + "Content-Length": true, + "Content-Range": true, + "Content-Type": true, + "Expect": true, + "Host": true, + "Keep-Alive": true, + "Max-Forwards": true, + "Pragma": true, + "Proxy-Authenticate": true, + "Proxy-Authorization": true, + "Proxy-Connection": true, + "Range": true, + "Realm": true, + "Te": true, + "Trailer": true, + "Transfer-Encoding": true, + "Www-Authenticate": true, +} + +// h1ServerKeepAlivesDisabled reports whether hs has its keep-alives +// disabled. See comments on h1ServerShutdownChan above for why +// the code is written this way. +func h1ServerKeepAlivesDisabled(hs *http.Server) bool { + var x interface{} = hs + type I interface { + doKeepAlives() bool + } + if hs, ok := x.(I); ok { + return !hs.doKeepAlives() + } + return false +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/server_push_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/server_push_test.go new file mode 100644 index 0000000..918fd30 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/server_push_test.go @@ -0,0 +1,521 @@ +// 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. + +// +build go1.8 + +package http2 + +import ( + "errors" + "fmt" + "io" + "io/ioutil" + "net/http" + "reflect" + "strconv" + "sync" + "testing" + "time" +) + +func TestServer_Push_Success(t *testing.T) { + const ( + mainBody = "index page" + pushedBody = "pushed page" + userAgent = "testagent" + cookie = "testcookie" + ) + + var stURL string + checkPromisedReq := func(r *http.Request, wantMethod string, wantH http.Header) error { + if got, want := r.Method, wantMethod; got != want { + return fmt.Errorf("promised Req.Method=%q, want %q", got, want) + } + if got, want := r.Header, wantH; !reflect.DeepEqual(got, want) { + return fmt.Errorf("promised Req.Header=%q, want %q", got, want) + } + if got, want := "https://"+r.Host, stURL; got != want { + return fmt.Errorf("promised Req.Host=%q, want %q", got, want) + } + if r.Body == nil { + return fmt.Errorf("nil Body") + } + if buf, err := ioutil.ReadAll(r.Body); err != nil || len(buf) != 0 { + return fmt.Errorf("ReadAll(Body)=%q,%v, want '',nil", buf, err) + } + return nil + } + + errc := make(chan error, 3) + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + switch r.URL.RequestURI() { + case "/": + // Push "/pushed?get" as a GET request, using an absolute URL. + opt := &http.PushOptions{ + Header: http.Header{ + "User-Agent": {userAgent}, + }, + } + if err := w.(http.Pusher).Push(stURL+"/pushed?get", opt); err != nil { + errc <- fmt.Errorf("error pushing /pushed?get: %v", err) + return + } + // Push "/pushed?head" as a HEAD request, using a path. + opt = &http.PushOptions{ + Method: "HEAD", + Header: http.Header{ + "User-Agent": {userAgent}, + "Cookie": {cookie}, + }, + } + if err := w.(http.Pusher).Push("/pushed?head", opt); err != nil { + errc <- fmt.Errorf("error pushing /pushed?head: %v", err) + return + } + w.Header().Set("Content-Type", "text/html") + w.Header().Set("Content-Length", strconv.Itoa(len(mainBody))) + w.WriteHeader(200) + io.WriteString(w, mainBody) + errc <- nil + + case "/pushed?get": + wantH := http.Header{} + wantH.Set("User-Agent", userAgent) + if err := checkPromisedReq(r, "GET", wantH); err != nil { + errc <- fmt.Errorf("/pushed?get: %v", err) + return + } + w.Header().Set("Content-Type", "text/html") + w.Header().Set("Content-Length", strconv.Itoa(len(pushedBody))) + w.WriteHeader(200) + io.WriteString(w, pushedBody) + errc <- nil + + case "/pushed?head": + wantH := http.Header{} + wantH.Set("User-Agent", userAgent) + wantH.Set("Cookie", cookie) + if err := checkPromisedReq(r, "HEAD", wantH); err != nil { + errc <- fmt.Errorf("/pushed?head: %v", err) + return + } + w.WriteHeader(204) + errc <- nil + + default: + errc <- fmt.Errorf("unknown RequestURL %q", r.URL.RequestURI()) + } + }) + stURL = st.ts.URL + + // Send one request, which should push two responses. + st.greet() + getSlash(st) + for k := 0; k < 3; k++ { + select { + case <-time.After(2 * time.Second): + t.Errorf("timeout waiting for handler %d to finish", k) + case err := <-errc: + if err != nil { + t.Fatal(err) + } + } + } + + checkPushPromise := func(f Frame, promiseID uint32, wantH [][2]string) error { + pp, ok := f.(*PushPromiseFrame) + if !ok { + return fmt.Errorf("got a %T; want *PushPromiseFrame", f) + } + if !pp.HeadersEnded() { + return fmt.Errorf("want END_HEADERS flag in PushPromiseFrame") + } + if got, want := pp.PromiseID, promiseID; got != want { + return fmt.Errorf("got PromiseID %v; want %v", got, want) + } + gotH := st.decodeHeader(pp.HeaderBlockFragment()) + if !reflect.DeepEqual(gotH, wantH) { + return fmt.Errorf("got promised headers %v; want %v", gotH, wantH) + } + return nil + } + checkHeaders := func(f Frame, wantH [][2]string) error { + hf, ok := f.(*HeadersFrame) + if !ok { + return fmt.Errorf("got a %T; want *HeadersFrame", f) + } + gotH := st.decodeHeader(hf.HeaderBlockFragment()) + if !reflect.DeepEqual(gotH, wantH) { + return fmt.Errorf("got response headers %v; want %v", gotH, wantH) + } + return nil + } + checkData := func(f Frame, wantData string) error { + df, ok := f.(*DataFrame) + if !ok { + return fmt.Errorf("got a %T; want *DataFrame", f) + } + if gotData := string(df.Data()); gotData != wantData { + return fmt.Errorf("got response data %q; want %q", gotData, wantData) + } + return nil + } + + // Stream 1 has 2 PUSH_PROMISE + HEADERS + DATA + // Stream 2 has HEADERS + DATA + // Stream 4 has HEADERS + expected := map[uint32][]func(Frame) error{ + 1: { + func(f Frame) error { + return checkPushPromise(f, 2, [][2]string{ + {":method", "GET"}, + {":scheme", "https"}, + {":authority", st.ts.Listener.Addr().String()}, + {":path", "/pushed?get"}, + {"user-agent", userAgent}, + }) + }, + func(f Frame) error { + return checkPushPromise(f, 4, [][2]string{ + {":method", "HEAD"}, + {":scheme", "https"}, + {":authority", st.ts.Listener.Addr().String()}, + {":path", "/pushed?head"}, + {"cookie", cookie}, + {"user-agent", userAgent}, + }) + }, + func(f Frame) error { + return checkHeaders(f, [][2]string{ + {":status", "200"}, + {"content-type", "text/html"}, + {"content-length", strconv.Itoa(len(mainBody))}, + }) + }, + func(f Frame) error { + return checkData(f, mainBody) + }, + }, + 2: { + func(f Frame) error { + return checkHeaders(f, [][2]string{ + {":status", "200"}, + {"content-type", "text/html"}, + {"content-length", strconv.Itoa(len(pushedBody))}, + }) + }, + func(f Frame) error { + return checkData(f, pushedBody) + }, + }, + 4: { + func(f Frame) error { + return checkHeaders(f, [][2]string{ + {":status", "204"}, + }) + }, + }, + } + + consumed := map[uint32]int{} + for k := 0; len(expected) > 0; k++ { + f, err := st.readFrame() + if err != nil { + for id, left := range expected { + t.Errorf("stream %d: missing %d frames", id, len(left)) + } + t.Fatalf("readFrame %d: %v", k, err) + } + id := f.Header().StreamID + label := fmt.Sprintf("stream %d, frame %d", id, consumed[id]) + if len(expected[id]) == 0 { + t.Fatalf("%s: unexpected frame %#+v", label, f) + } + check := expected[id][0] + expected[id] = expected[id][1:] + if len(expected[id]) == 0 { + delete(expected, id) + } + if err := check(f); err != nil { + t.Fatalf("%s: %v", label, err) + } + consumed[id]++ + } +} + +func TestServer_Push_SuccessNoRace(t *testing.T) { + // Regression test for issue #18326. Ensure the request handler can mutate + // pushed request headers without racing with the PUSH_PROMISE write. + errc := make(chan error, 2) + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + switch r.URL.RequestURI() { + case "/": + opt := &http.PushOptions{ + Header: http.Header{"User-Agent": {"testagent"}}, + } + if err := w.(http.Pusher).Push("/pushed", opt); err != nil { + errc <- fmt.Errorf("error pushing: %v", err) + return + } + w.WriteHeader(200) + errc <- nil + + case "/pushed": + // Update request header, ensure there is no race. + r.Header.Set("User-Agent", "newagent") + r.Header.Set("Cookie", "cookie") + w.WriteHeader(200) + errc <- nil + + default: + errc <- fmt.Errorf("unknown RequestURL %q", r.URL.RequestURI()) + } + }) + + // Send one request, which should push one response. + st.greet() + getSlash(st) + for k := 0; k < 2; k++ { + select { + case <-time.After(2 * time.Second): + t.Errorf("timeout waiting for handler %d to finish", k) + case err := <-errc: + if err != nil { + t.Fatal(err) + } + } + } +} + +func TestServer_Push_RejectRecursivePush(t *testing.T) { + // Expect two requests, but might get three if there's a bug and the second push succeeds. + errc := make(chan error, 3) + handler := func(w http.ResponseWriter, r *http.Request) error { + baseURL := "https://" + r.Host + switch r.URL.Path { + case "/": + if err := w.(http.Pusher).Push(baseURL+"/push1", nil); err != nil { + return fmt.Errorf("first Push()=%v, want nil", err) + } + return nil + + case "/push1": + if got, want := w.(http.Pusher).Push(baseURL+"/push2", nil), ErrRecursivePush; got != want { + return fmt.Errorf("Push()=%v, want %v", got, want) + } + return nil + + default: + return fmt.Errorf("unexpected path: %q", r.URL.Path) + } + } + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + errc <- handler(w, r) + }) + defer st.Close() + st.greet() + getSlash(st) + if err := <-errc; err != nil { + t.Errorf("First request failed: %v", err) + } + if err := <-errc; err != nil { + t.Errorf("Second request failed: %v", err) + } +} + +func testServer_Push_RejectSingleRequest(t *testing.T, doPush func(http.Pusher, *http.Request) error, settings ...Setting) { + // Expect one request, but might get two if there's a bug and the push succeeds. + errc := make(chan error, 2) + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + errc <- doPush(w.(http.Pusher), r) + }) + defer st.Close() + st.greet() + if err := st.fr.WriteSettings(settings...); err != nil { + st.t.Fatalf("WriteSettings: %v", err) + } + st.wantSettingsAck() + getSlash(st) + if err := <-errc; err != nil { + t.Error(err) + } + // Should not get a PUSH_PROMISE frame. + hf := st.wantHeaders() + if !hf.StreamEnded() { + t.Error("stream should end after headers") + } +} + +func TestServer_Push_RejectIfDisabled(t *testing.T) { + testServer_Push_RejectSingleRequest(t, + func(p http.Pusher, r *http.Request) error { + if got, want := p.Push("https://"+r.Host+"/pushed", nil), http.ErrNotSupported; got != want { + return fmt.Errorf("Push()=%v, want %v", got, want) + } + return nil + }, + Setting{SettingEnablePush, 0}) +} + +func TestServer_Push_RejectWhenNoConcurrentStreams(t *testing.T) { + testServer_Push_RejectSingleRequest(t, + func(p http.Pusher, r *http.Request) error { + if got, want := p.Push("https://"+r.Host+"/pushed", nil), ErrPushLimitReached; got != want { + return fmt.Errorf("Push()=%v, want %v", got, want) + } + return nil + }, + Setting{SettingMaxConcurrentStreams, 0}) +} + +func TestServer_Push_RejectWrongScheme(t *testing.T) { + testServer_Push_RejectSingleRequest(t, + func(p http.Pusher, r *http.Request) error { + if err := p.Push("http://"+r.Host+"/pushed", nil); err == nil { + return errors.New("Push() should have failed (push target URL is http)") + } + return nil + }) +} + +func TestServer_Push_RejectMissingHost(t *testing.T) { + testServer_Push_RejectSingleRequest(t, + func(p http.Pusher, r *http.Request) error { + if err := p.Push("https:pushed", nil); err == nil { + return errors.New("Push() should have failed (push target URL missing host)") + } + return nil + }) +} + +func TestServer_Push_RejectRelativePath(t *testing.T) { + testServer_Push_RejectSingleRequest(t, + func(p http.Pusher, r *http.Request) error { + if err := p.Push("../test", nil); err == nil { + return errors.New("Push() should have failed (push target is a relative path)") + } + return nil + }) +} + +func TestServer_Push_RejectForbiddenMethod(t *testing.T) { + testServer_Push_RejectSingleRequest(t, + func(p http.Pusher, r *http.Request) error { + if err := p.Push("https://"+r.Host+"/pushed", &http.PushOptions{Method: "POST"}); err == nil { + return errors.New("Push() should have failed (cannot promise a POST)") + } + return nil + }) +} + +func TestServer_Push_RejectForbiddenHeader(t *testing.T) { + testServer_Push_RejectSingleRequest(t, + func(p http.Pusher, r *http.Request) error { + header := http.Header{ + "Content-Length": {"10"}, + "Content-Encoding": {"gzip"}, + "Trailer": {"Foo"}, + "Te": {"trailers"}, + "Host": {"test.com"}, + ":authority": {"test.com"}, + } + if err := p.Push("https://"+r.Host+"/pushed", &http.PushOptions{Header: header}); err == nil { + return errors.New("Push() should have failed (forbidden headers)") + } + return nil + }) +} + +func TestServer_Push_StateTransitions(t *testing.T) { + const body = "foo" + + gotPromise := make(chan bool) + finishedPush := make(chan bool) + + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + switch r.URL.RequestURI() { + case "/": + if err := w.(http.Pusher).Push("/pushed", nil); err != nil { + t.Errorf("Push error: %v", err) + } + // Don't finish this request until the push finishes so we don't + // nondeterministically interleave output frames with the push. + <-finishedPush + case "/pushed": + <-gotPromise + } + w.Header().Set("Content-Type", "text/html") + w.Header().Set("Content-Length", strconv.Itoa(len(body))) + w.WriteHeader(200) + io.WriteString(w, body) + }) + defer st.Close() + + st.greet() + if st.stream(2) != nil { + t.Fatal("stream 2 should be empty") + } + if got, want := st.streamState(2), stateIdle; got != want { + t.Fatalf("streamState(2)=%v, want %v", got, want) + } + getSlash(st) + // After the PUSH_PROMISE is sent, the stream should be stateHalfClosedRemote. + st.wantPushPromise() + if got, want := st.streamState(2), stateHalfClosedRemote; got != want { + t.Fatalf("streamState(2)=%v, want %v", got, want) + } + // We stall the HTTP handler for "/pushed" until the above check. If we don't + // stall the handler, then the handler might write HEADERS and DATA and finish + // the stream before we check st.streamState(2) -- should that happen, we'll + // see stateClosed and fail the above check. + close(gotPromise) + st.wantHeaders() + if df := st.wantData(); !df.StreamEnded() { + t.Fatal("expected END_STREAM flag on DATA") + } + if got, want := st.streamState(2), stateClosed; got != want { + t.Fatalf("streamState(2)=%v, want %v", got, want) + } + close(finishedPush) +} + +func TestServer_Push_RejectAfterGoAway(t *testing.T) { + var readyOnce sync.Once + ready := make(chan struct{}) + errc := make(chan error, 2) + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + select { + case <-ready: + case <-time.After(5 * time.Second): + errc <- fmt.Errorf("timeout waiting for GOAWAY to be processed") + } + if got, want := w.(http.Pusher).Push("https://"+r.Host+"/pushed", nil), http.ErrNotSupported; got != want { + errc <- fmt.Errorf("Push()=%v, want %v", got, want) + } + errc <- nil + }) + defer st.Close() + st.greet() + getSlash(st) + + // Send GOAWAY and wait for it to be processed. + st.fr.WriteGoAway(1, ErrCodeNo, nil) + go func() { + for { + select { + case <-ready: + return + default: + } + st.sc.serveMsgCh <- func(loopNum int) { + if !st.sc.pushEnabled { + readyOnce.Do(func() { close(ready) }) + } + } + } + }() + if err := <-errc; err != nil { + t.Error(err) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/server_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/server_test.go new file mode 100644 index 0000000..b4e8328 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/server_test.go @@ -0,0 +1,3721 @@ +// 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 http2 + +import ( + "bytes" + "crypto/tls" + "errors" + "flag" + "fmt" + "io" + "io/ioutil" + "log" + "net" + "net/http" + "net/http/httptest" + "os" + "os/exec" + "reflect" + "runtime" + "strconv" + "strings" + "sync" + "sync/atomic" + "testing" + "time" + + "golang.org/x/net/http2/hpack" +) + +var stderrVerbose = flag.Bool("stderr_verbose", false, "Mirror verbosity to stderr, unbuffered") + +func stderrv() io.Writer { + if *stderrVerbose { + return os.Stderr + } + + return ioutil.Discard +} + +type serverTester struct { + cc net.Conn // client conn + t testing.TB + ts *httptest.Server + fr *Framer + serverLogBuf bytes.Buffer // logger for httptest.Server + logFilter []string // substrings to filter out + scMu sync.Mutex // guards sc + sc *serverConn + hpackDec *hpack.Decoder + decodedHeaders [][2]string + + // If http2debug!=2, then we capture Frame debug logs that will be written + // to t.Log after a test fails. The read and write logs use separate locks + // and buffers so we don't accidentally introduce synchronization between + // the read and write goroutines, which may hide data races. + frameReadLogMu sync.Mutex + frameReadLogBuf bytes.Buffer + frameWriteLogMu sync.Mutex + frameWriteLogBuf bytes.Buffer + + // writing headers: + headerBuf bytes.Buffer + hpackEnc *hpack.Encoder +} + +func init() { + testHookOnPanicMu = new(sync.Mutex) +} + +func resetHooks() { + testHookOnPanicMu.Lock() + testHookOnPanic = nil + testHookOnPanicMu.Unlock() +} + +type serverTesterOpt string + +var optOnlyServer = serverTesterOpt("only_server") +var optQuiet = serverTesterOpt("quiet_logging") +var optFramerReuseFrames = serverTesterOpt("frame_reuse_frames") + +func newServerTester(t testing.TB, handler http.HandlerFunc, opts ...interface{}) *serverTester { + resetHooks() + + ts := httptest.NewUnstartedServer(handler) + + tlsConfig := &tls.Config{ + InsecureSkipVerify: true, + NextProtos: []string{NextProtoTLS}, + } + + var onlyServer, quiet, framerReuseFrames bool + h2server := new(Server) + for _, opt := range opts { + switch v := opt.(type) { + case func(*tls.Config): + v(tlsConfig) + case func(*httptest.Server): + v(ts) + case func(*Server): + v(h2server) + case serverTesterOpt: + switch v { + case optOnlyServer: + onlyServer = true + case optQuiet: + quiet = true + case optFramerReuseFrames: + framerReuseFrames = true + } + case func(net.Conn, http.ConnState): + ts.Config.ConnState = v + default: + t.Fatalf("unknown newServerTester option type %T", v) + } + } + + ConfigureServer(ts.Config, h2server) + + st := &serverTester{ + t: t, + ts: ts, + } + st.hpackEnc = hpack.NewEncoder(&st.headerBuf) + st.hpackDec = hpack.NewDecoder(initialHeaderTableSize, st.onHeaderField) + + ts.TLS = ts.Config.TLSConfig // the httptest.Server has its own copy of this TLS config + if quiet { + ts.Config.ErrorLog = log.New(ioutil.Discard, "", 0) + } else { + ts.Config.ErrorLog = log.New(io.MultiWriter(stderrv(), twriter{t: t, st: st}, &st.serverLogBuf), "", log.LstdFlags) + } + ts.StartTLS() + + if VerboseLogs { + t.Logf("Running test server at: %s", ts.URL) + } + testHookGetServerConn = func(v *serverConn) { + st.scMu.Lock() + defer st.scMu.Unlock() + st.sc = v + } + log.SetOutput(io.MultiWriter(stderrv(), twriter{t: t, st: st})) + if !onlyServer { + cc, err := tls.Dial("tcp", ts.Listener.Addr().String(), tlsConfig) + if err != nil { + t.Fatal(err) + } + st.cc = cc + st.fr = NewFramer(cc, cc) + if framerReuseFrames { + st.fr.SetReuseFrames() + } + if !logFrameReads && !logFrameWrites { + st.fr.debugReadLoggerf = func(m string, v ...interface{}) { + m = time.Now().Format("2006-01-02 15:04:05.999999999 ") + strings.TrimPrefix(m, "http2: ") + "\n" + st.frameReadLogMu.Lock() + fmt.Fprintf(&st.frameReadLogBuf, m, v...) + st.frameReadLogMu.Unlock() + } + st.fr.debugWriteLoggerf = func(m string, v ...interface{}) { + m = time.Now().Format("2006-01-02 15:04:05.999999999 ") + strings.TrimPrefix(m, "http2: ") + "\n" + st.frameWriteLogMu.Lock() + fmt.Fprintf(&st.frameWriteLogBuf, m, v...) + st.frameWriteLogMu.Unlock() + } + st.fr.logReads = true + st.fr.logWrites = true + } + } + return st +} + +func (st *serverTester) closeConn() { + st.scMu.Lock() + defer st.scMu.Unlock() + st.sc.conn.Close() +} + +func (st *serverTester) addLogFilter(phrase string) { + st.logFilter = append(st.logFilter, phrase) +} + +func (st *serverTester) stream(id uint32) *stream { + ch := make(chan *stream, 1) + st.sc.serveMsgCh <- func(int) { + ch <- st.sc.streams[id] + } + return <-ch +} + +func (st *serverTester) streamState(id uint32) streamState { + ch := make(chan streamState, 1) + st.sc.serveMsgCh <- func(int) { + state, _ := st.sc.state(id) + ch <- state + } + return <-ch +} + +// loopNum reports how many times this conn's select loop has gone around. +func (st *serverTester) loopNum() int { + lastc := make(chan int, 1) + st.sc.serveMsgCh <- func(loopNum int) { + lastc <- loopNum + } + return <-lastc +} + +// awaitIdle heuristically awaits for the server conn's select loop to be idle. +// The heuristic is that the server connection's serve loop must schedule +// 50 times in a row without any channel sends or receives occurring. +func (st *serverTester) awaitIdle() { + remain := 50 + last := st.loopNum() + for remain > 0 { + n := st.loopNum() + if n == last+1 { + remain-- + } else { + remain = 50 + } + last = n + } +} + +func (st *serverTester) Close() { + if st.t.Failed() { + st.frameReadLogMu.Lock() + if st.frameReadLogBuf.Len() > 0 { + st.t.Logf("Framer read log:\n%s", st.frameReadLogBuf.String()) + } + st.frameReadLogMu.Unlock() + + st.frameWriteLogMu.Lock() + if st.frameWriteLogBuf.Len() > 0 { + st.t.Logf("Framer write log:\n%s", st.frameWriteLogBuf.String()) + } + st.frameWriteLogMu.Unlock() + + // If we failed already (and are likely in a Fatal, + // unwindowing), force close the connection, so the + // httptest.Server doesn't wait forever for the conn + // to close. + if st.cc != nil { + st.cc.Close() + } + } + st.ts.Close() + if st.cc != nil { + st.cc.Close() + } + log.SetOutput(os.Stderr) +} + +// greet initiates the client's HTTP/2 connection into a state where +// frames may be sent. +func (st *serverTester) greet() { + st.greetAndCheckSettings(func(Setting) error { return nil }) +} + +func (st *serverTester) greetAndCheckSettings(checkSetting func(s Setting) error) { + st.writePreface() + st.writeInitialSettings() + st.wantSettings().ForeachSetting(checkSetting) + st.writeSettingsAck() + + // The initial WINDOW_UPDATE and SETTINGS ACK can come in any order. + var gotSettingsAck bool + var gotWindowUpdate bool + + for i := 0; i < 2; i++ { + f, err := st.readFrame() + if err != nil { + st.t.Fatal(err) + } + switch f := f.(type) { + case *SettingsFrame: + if !f.Header().Flags.Has(FlagSettingsAck) { + st.t.Fatal("Settings Frame didn't have ACK set") + } + gotSettingsAck = true + + case *WindowUpdateFrame: + if f.FrameHeader.StreamID != 0 { + st.t.Fatalf("WindowUpdate StreamID = %d; want 0", f.FrameHeader.StreamID) + } + incr := uint32((&Server{}).initialConnRecvWindowSize() - initialWindowSize) + if f.Increment != incr { + st.t.Fatalf("WindowUpdate increment = %d; want %d", f.Increment, incr) + } + gotWindowUpdate = true + + default: + st.t.Fatalf("Wanting a settings ACK or window update, received a %T", f) + } + } + + if !gotSettingsAck { + st.t.Fatalf("Didn't get a settings ACK") + } + if !gotWindowUpdate { + st.t.Fatalf("Didn't get a window update") + } +} + +func (st *serverTester) writePreface() { + n, err := st.cc.Write(clientPreface) + if err != nil { + st.t.Fatalf("Error writing client preface: %v", err) + } + if n != len(clientPreface) { + st.t.Fatalf("Writing client preface, wrote %d bytes; want %d", n, len(clientPreface)) + } +} + +func (st *serverTester) writeInitialSettings() { + if err := st.fr.WriteSettings(); err != nil { + st.t.Fatalf("Error writing initial SETTINGS frame from client to server: %v", err) + } +} + +func (st *serverTester) writeSettingsAck() { + if err := st.fr.WriteSettingsAck(); err != nil { + st.t.Fatalf("Error writing ACK of server's SETTINGS: %v", err) + } +} + +func (st *serverTester) writeHeaders(p HeadersFrameParam) { + if err := st.fr.WriteHeaders(p); err != nil { + st.t.Fatalf("Error writing HEADERS: %v", err) + } +} + +func (st *serverTester) writePriority(id uint32, p PriorityParam) { + if err := st.fr.WritePriority(id, p); err != nil { + st.t.Fatalf("Error writing PRIORITY: %v", err) + } +} + +func (st *serverTester) encodeHeaderField(k, v string) { + err := st.hpackEnc.WriteField(hpack.HeaderField{Name: k, Value: v}) + if err != nil { + st.t.Fatalf("HPACK encoding error for %q/%q: %v", k, v, err) + } +} + +// encodeHeaderRaw is the magic-free version of encodeHeader. +// It takes 0 or more (k, v) pairs and encodes them. +func (st *serverTester) encodeHeaderRaw(headers ...string) []byte { + if len(headers)%2 == 1 { + panic("odd number of kv args") + } + st.headerBuf.Reset() + for len(headers) > 0 { + k, v := headers[0], headers[1] + st.encodeHeaderField(k, v) + headers = headers[2:] + } + return st.headerBuf.Bytes() +} + +// encodeHeader encodes headers and returns their HPACK bytes. headers +// must contain an even number of key/value pairs. There may be +// multiple pairs for keys (e.g. "cookie"). The :method, :path, and +// :scheme headers default to GET, / and https. The :authority header +// defaults to st.ts.Listener.Addr(). +func (st *serverTester) encodeHeader(headers ...string) []byte { + if len(headers)%2 == 1 { + panic("odd number of kv args") + } + + st.headerBuf.Reset() + defaultAuthority := st.ts.Listener.Addr().String() + + if len(headers) == 0 { + // Fast path, mostly for benchmarks, so test code doesn't pollute + // profiles when we're looking to improve server allocations. + st.encodeHeaderField(":method", "GET") + st.encodeHeaderField(":scheme", "https") + st.encodeHeaderField(":authority", defaultAuthority) + st.encodeHeaderField(":path", "/") + return st.headerBuf.Bytes() + } + + if len(headers) == 2 && headers[0] == ":method" { + // Another fast path for benchmarks. + st.encodeHeaderField(":method", headers[1]) + st.encodeHeaderField(":scheme", "https") + st.encodeHeaderField(":authority", defaultAuthority) + st.encodeHeaderField(":path", "/") + return st.headerBuf.Bytes() + } + + pseudoCount := map[string]int{} + keys := []string{":method", ":scheme", ":authority", ":path"} + vals := map[string][]string{ + ":method": {"GET"}, + ":scheme": {"https"}, + ":authority": {defaultAuthority}, + ":path": {"/"}, + } + for len(headers) > 0 { + k, v := headers[0], headers[1] + headers = headers[2:] + if _, ok := vals[k]; !ok { + keys = append(keys, k) + } + if strings.HasPrefix(k, ":") { + pseudoCount[k]++ + if pseudoCount[k] == 1 { + vals[k] = []string{v} + } else { + // Allows testing of invalid headers w/ dup pseudo fields. + vals[k] = append(vals[k], v) + } + } else { + vals[k] = append(vals[k], v) + } + } + for _, k := range keys { + for _, v := range vals[k] { + st.encodeHeaderField(k, v) + } + } + return st.headerBuf.Bytes() +} + +// bodylessReq1 writes a HEADERS frames with StreamID 1 and EndStream and EndHeaders set. +func (st *serverTester) bodylessReq1(headers ...string) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader(headers...), + EndStream: true, + EndHeaders: true, + }) +} + +func (st *serverTester) writeData(streamID uint32, endStream bool, data []byte) { + if err := st.fr.WriteData(streamID, endStream, data); err != nil { + st.t.Fatalf("Error writing DATA: %v", err) + } +} + +func (st *serverTester) writeDataPadded(streamID uint32, endStream bool, data, pad []byte) { + if err := st.fr.WriteDataPadded(streamID, endStream, data, pad); err != nil { + st.t.Fatalf("Error writing DATA: %v", err) + } +} + +func readFrameTimeout(fr *Framer, wait time.Duration) (Frame, error) { + ch := make(chan interface{}, 1) + go func() { + fr, err := fr.ReadFrame() + if err != nil { + ch <- err + } else { + ch <- fr + } + }() + t := time.NewTimer(wait) + select { + case v := <-ch: + t.Stop() + if fr, ok := v.(Frame); ok { + return fr, nil + } + return nil, v.(error) + case <-t.C: + return nil, errors.New("timeout waiting for frame") + } +} + +func (st *serverTester) readFrame() (Frame, error) { + return readFrameTimeout(st.fr, 2*time.Second) +} + +func (st *serverTester) wantHeaders() *HeadersFrame { + f, err := st.readFrame() + if err != nil { + st.t.Fatalf("Error while expecting a HEADERS frame: %v", err) + } + hf, ok := f.(*HeadersFrame) + if !ok { + st.t.Fatalf("got a %T; want *HeadersFrame", f) + } + return hf +} + +func (st *serverTester) wantContinuation() *ContinuationFrame { + f, err := st.readFrame() + if err != nil { + st.t.Fatalf("Error while expecting a CONTINUATION frame: %v", err) + } + cf, ok := f.(*ContinuationFrame) + if !ok { + st.t.Fatalf("got a %T; want *ContinuationFrame", f) + } + return cf +} + +func (st *serverTester) wantData() *DataFrame { + f, err := st.readFrame() + if err != nil { + st.t.Fatalf("Error while expecting a DATA frame: %v", err) + } + df, ok := f.(*DataFrame) + if !ok { + st.t.Fatalf("got a %T; want *DataFrame", f) + } + return df +} + +func (st *serverTester) wantSettings() *SettingsFrame { + f, err := st.readFrame() + if err != nil { + st.t.Fatalf("Error while expecting a SETTINGS frame: %v", err) + } + sf, ok := f.(*SettingsFrame) + if !ok { + st.t.Fatalf("got a %T; want *SettingsFrame", f) + } + return sf +} + +func (st *serverTester) wantPing() *PingFrame { + f, err := st.readFrame() + if err != nil { + st.t.Fatalf("Error while expecting a PING frame: %v", err) + } + pf, ok := f.(*PingFrame) + if !ok { + st.t.Fatalf("got a %T; want *PingFrame", f) + } + return pf +} + +func (st *serverTester) wantGoAway() *GoAwayFrame { + f, err := st.readFrame() + if err != nil { + st.t.Fatalf("Error while expecting a GOAWAY frame: %v", err) + } + gf, ok := f.(*GoAwayFrame) + if !ok { + st.t.Fatalf("got a %T; want *GoAwayFrame", f) + } + return gf +} + +func (st *serverTester) wantRSTStream(streamID uint32, errCode ErrCode) { + f, err := st.readFrame() + if err != nil { + st.t.Fatalf("Error while expecting an RSTStream frame: %v", err) + } + rs, ok := f.(*RSTStreamFrame) + if !ok { + st.t.Fatalf("got a %T; want *RSTStreamFrame", f) + } + if rs.FrameHeader.StreamID != streamID { + st.t.Fatalf("RSTStream StreamID = %d; want %d", rs.FrameHeader.StreamID, streamID) + } + if rs.ErrCode != errCode { + st.t.Fatalf("RSTStream ErrCode = %d (%s); want %d (%s)", rs.ErrCode, rs.ErrCode, errCode, errCode) + } +} + +func (st *serverTester) wantWindowUpdate(streamID, incr uint32) { + f, err := st.readFrame() + if err != nil { + st.t.Fatalf("Error while expecting a WINDOW_UPDATE frame: %v", err) + } + wu, ok := f.(*WindowUpdateFrame) + if !ok { + st.t.Fatalf("got a %T; want *WindowUpdateFrame", f) + } + if wu.FrameHeader.StreamID != streamID { + st.t.Fatalf("WindowUpdate StreamID = %d; want %d", wu.FrameHeader.StreamID, streamID) + } + if wu.Increment != incr { + st.t.Fatalf("WindowUpdate increment = %d; want %d", wu.Increment, incr) + } +} + +func (st *serverTester) wantSettingsAck() { + f, err := st.readFrame() + if err != nil { + st.t.Fatal(err) + } + sf, ok := f.(*SettingsFrame) + if !ok { + st.t.Fatalf("Wanting a settings ACK, received a %T", f) + } + if !sf.Header().Flags.Has(FlagSettingsAck) { + st.t.Fatal("Settings Frame didn't have ACK set") + } +} + +func (st *serverTester) wantPushPromise() *PushPromiseFrame { + f, err := st.readFrame() + if err != nil { + st.t.Fatal(err) + } + ppf, ok := f.(*PushPromiseFrame) + if !ok { + st.t.Fatalf("Wanted PushPromise, received %T", ppf) + } + return ppf +} + +func TestServer(t *testing.T) { + gotReq := make(chan bool, 1) + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Foo", "Bar") + gotReq <- true + }) + defer st.Close() + + covers("3.5", ` + The server connection preface consists of a potentially empty + SETTINGS frame ([SETTINGS]) that MUST be the first frame the + server sends in the HTTP/2 connection. + `) + + st.greet() + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader(), + EndStream: true, // no DATA frames + EndHeaders: true, + }) + + select { + case <-gotReq: + case <-time.After(2 * time.Second): + t.Error("timeout waiting for request") + } +} + +func TestServer_Request_Get(t *testing.T) { + testServerRequest(t, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader("foo-bar", "some-value"), + EndStream: true, // no DATA frames + EndHeaders: true, + }) + }, func(r *http.Request) { + if r.Method != "GET" { + t.Errorf("Method = %q; want GET", r.Method) + } + if r.URL.Path != "/" { + t.Errorf("URL.Path = %q; want /", r.URL.Path) + } + if r.ContentLength != 0 { + t.Errorf("ContentLength = %v; want 0", r.ContentLength) + } + if r.Close { + t.Error("Close = true; want false") + } + if !strings.Contains(r.RemoteAddr, ":") { + t.Errorf("RemoteAddr = %q; want something with a colon", r.RemoteAddr) + } + if r.Proto != "HTTP/2.0" || r.ProtoMajor != 2 || r.ProtoMinor != 0 { + t.Errorf("Proto = %q Major=%v,Minor=%v; want HTTP/2.0", r.Proto, r.ProtoMajor, r.ProtoMinor) + } + wantHeader := http.Header{ + "Foo-Bar": []string{"some-value"}, + } + if !reflect.DeepEqual(r.Header, wantHeader) { + t.Errorf("Header = %#v; want %#v", r.Header, wantHeader) + } + if n, err := r.Body.Read([]byte(" ")); err != io.EOF || n != 0 { + t.Errorf("Read = %d, %v; want 0, EOF", n, err) + } + }) +} + +func TestServer_Request_Get_PathSlashes(t *testing.T) { + testServerRequest(t, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader(":path", "/%2f/"), + EndStream: true, // no DATA frames + EndHeaders: true, + }) + }, func(r *http.Request) { + if r.RequestURI != "/%2f/" { + t.Errorf("RequestURI = %q; want /%%2f/", r.RequestURI) + } + if r.URL.Path != "///" { + t.Errorf("URL.Path = %q; want ///", r.URL.Path) + } + }) +} + +// TODO: add a test with EndStream=true on the HEADERS but setting a +// Content-Length anyway. Should we just omit it and force it to +// zero? + +func TestServer_Request_Post_NoContentLength_EndStream(t *testing.T) { + testServerRequest(t, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader(":method", "POST"), + EndStream: true, + EndHeaders: true, + }) + }, func(r *http.Request) { + if r.Method != "POST" { + t.Errorf("Method = %q; want POST", r.Method) + } + if r.ContentLength != 0 { + t.Errorf("ContentLength = %v; want 0", r.ContentLength) + } + if n, err := r.Body.Read([]byte(" ")); err != io.EOF || n != 0 { + t.Errorf("Read = %d, %v; want 0, EOF", n, err) + } + }) +} + +func TestServer_Request_Post_Body_ImmediateEOF(t *testing.T) { + testBodyContents(t, -1, "", func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader(":method", "POST"), + EndStream: false, // to say DATA frames are coming + EndHeaders: true, + }) + st.writeData(1, true, nil) // just kidding. empty body. + }) +} + +func TestServer_Request_Post_Body_OneData(t *testing.T) { + const content = "Some content" + testBodyContents(t, -1, content, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader(":method", "POST"), + EndStream: false, // to say DATA frames are coming + EndHeaders: true, + }) + st.writeData(1, true, []byte(content)) + }) +} + +func TestServer_Request_Post_Body_TwoData(t *testing.T) { + const content = "Some content" + testBodyContents(t, -1, content, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader(":method", "POST"), + EndStream: false, // to say DATA frames are coming + EndHeaders: true, + }) + st.writeData(1, false, []byte(content[:5])) + st.writeData(1, true, []byte(content[5:])) + }) +} + +func TestServer_Request_Post_Body_ContentLength_Correct(t *testing.T) { + const content = "Some content" + testBodyContents(t, int64(len(content)), content, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader( + ":method", "POST", + "content-length", strconv.Itoa(len(content)), + ), + EndStream: false, // to say DATA frames are coming + EndHeaders: true, + }) + st.writeData(1, true, []byte(content)) + }) +} + +func TestServer_Request_Post_Body_ContentLength_TooLarge(t *testing.T) { + testBodyContentsFail(t, 3, "request declared a Content-Length of 3 but only wrote 2 bytes", + func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader( + ":method", "POST", + "content-length", "3", + ), + EndStream: false, // to say DATA frames are coming + EndHeaders: true, + }) + st.writeData(1, true, []byte("12")) + }) +} + +func TestServer_Request_Post_Body_ContentLength_TooSmall(t *testing.T) { + testBodyContentsFail(t, 4, "sender tried to send more than declared Content-Length of 4 bytes", + func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader( + ":method", "POST", + "content-length", "4", + ), + EndStream: false, // to say DATA frames are coming + EndHeaders: true, + }) + st.writeData(1, true, []byte("12345")) + }) +} + +func testBodyContents(t *testing.T, wantContentLength int64, wantBody string, write func(st *serverTester)) { + testServerRequest(t, write, func(r *http.Request) { + if r.Method != "POST" { + t.Errorf("Method = %q; want POST", r.Method) + } + if r.ContentLength != wantContentLength { + t.Errorf("ContentLength = %v; want %d", r.ContentLength, wantContentLength) + } + all, err := ioutil.ReadAll(r.Body) + if err != nil { + t.Fatal(err) + } + if string(all) != wantBody { + t.Errorf("Read = %q; want %q", all, wantBody) + } + if err := r.Body.Close(); err != nil { + t.Fatalf("Close: %v", err) + } + }) +} + +func testBodyContentsFail(t *testing.T, wantContentLength int64, wantReadError string, write func(st *serverTester)) { + testServerRequest(t, write, func(r *http.Request) { + if r.Method != "POST" { + t.Errorf("Method = %q; want POST", r.Method) + } + if r.ContentLength != wantContentLength { + t.Errorf("ContentLength = %v; want %d", r.ContentLength, wantContentLength) + } + all, err := ioutil.ReadAll(r.Body) + if err == nil { + t.Fatalf("expected an error (%q) reading from the body. Successfully read %q instead.", + wantReadError, all) + } + if !strings.Contains(err.Error(), wantReadError) { + t.Fatalf("Body.Read = %v; want substring %q", err, wantReadError) + } + if err := r.Body.Close(); err != nil { + t.Fatalf("Close: %v", err) + } + }) +} + +// Using a Host header, instead of :authority +func TestServer_Request_Get_Host(t *testing.T) { + const host = "example.com" + testServerRequest(t, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader(":authority", "", "host", host), + EndStream: true, + EndHeaders: true, + }) + }, func(r *http.Request) { + if r.Host != host { + t.Errorf("Host = %q; want %q", r.Host, host) + } + }) +} + +// Using an :authority pseudo-header, instead of Host +func TestServer_Request_Get_Authority(t *testing.T) { + const host = "example.com" + testServerRequest(t, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader(":authority", host), + EndStream: true, + EndHeaders: true, + }) + }, func(r *http.Request) { + if r.Host != host { + t.Errorf("Host = %q; want %q", r.Host, host) + } + }) +} + +func TestServer_Request_WithContinuation(t *testing.T) { + wantHeader := http.Header{ + "Foo-One": []string{"value-one"}, + "Foo-Two": []string{"value-two"}, + "Foo-Three": []string{"value-three"}, + } + testServerRequest(t, func(st *serverTester) { + fullHeaders := st.encodeHeader( + "foo-one", "value-one", + "foo-two", "value-two", + "foo-three", "value-three", + ) + remain := fullHeaders + chunks := 0 + for len(remain) > 0 { + const maxChunkSize = 5 + chunk := remain + if len(chunk) > maxChunkSize { + chunk = chunk[:maxChunkSize] + } + remain = remain[len(chunk):] + + if chunks == 0 { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: chunk, + EndStream: true, // no DATA frames + EndHeaders: false, // we'll have continuation frames + }) + } else { + err := st.fr.WriteContinuation(1, len(remain) == 0, chunk) + if err != nil { + t.Fatal(err) + } + } + chunks++ + } + if chunks < 2 { + t.Fatal("too few chunks") + } + }, func(r *http.Request) { + if !reflect.DeepEqual(r.Header, wantHeader) { + t.Errorf("Header = %#v; want %#v", r.Header, wantHeader) + } + }) +} + +// Concatenated cookie headers. ("8.1.2.5 Compressing the Cookie Header Field") +func TestServer_Request_CookieConcat(t *testing.T) { + const host = "example.com" + testServerRequest(t, func(st *serverTester) { + st.bodylessReq1( + ":authority", host, + "cookie", "a=b", + "cookie", "c=d", + "cookie", "e=f", + ) + }, func(r *http.Request) { + const want = "a=b; c=d; e=f" + if got := r.Header.Get("Cookie"); got != want { + t.Errorf("Cookie = %q; want %q", got, want) + } + }) +} + +func TestServer_Request_Reject_CapitalHeader(t *testing.T) { + testRejectRequest(t, func(st *serverTester) { st.bodylessReq1("UPPER", "v") }) +} + +func TestServer_Request_Reject_HeaderFieldNameColon(t *testing.T) { + testRejectRequest(t, func(st *serverTester) { st.bodylessReq1("has:colon", "v") }) +} + +func TestServer_Request_Reject_HeaderFieldNameNULL(t *testing.T) { + testRejectRequest(t, func(st *serverTester) { st.bodylessReq1("has\x00null", "v") }) +} + +func TestServer_Request_Reject_HeaderFieldNameEmpty(t *testing.T) { + testRejectRequest(t, func(st *serverTester) { st.bodylessReq1("", "v") }) +} + +func TestServer_Request_Reject_HeaderFieldValueNewline(t *testing.T) { + testRejectRequest(t, func(st *serverTester) { st.bodylessReq1("foo", "has\nnewline") }) +} + +func TestServer_Request_Reject_HeaderFieldValueCR(t *testing.T) { + testRejectRequest(t, func(st *serverTester) { st.bodylessReq1("foo", "has\rcarriage") }) +} + +func TestServer_Request_Reject_HeaderFieldValueDEL(t *testing.T) { + testRejectRequest(t, func(st *serverTester) { st.bodylessReq1("foo", "has\x7fdel") }) +} + +func TestServer_Request_Reject_Pseudo_Missing_method(t *testing.T) { + testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":method", "") }) +} + +func TestServer_Request_Reject_Pseudo_ExactlyOne(t *testing.T) { + // 8.1.2.3 Request Pseudo-Header Fields + // "All HTTP/2 requests MUST include exactly one valid value" ... + testRejectRequest(t, func(st *serverTester) { + st.addLogFilter("duplicate pseudo-header") + st.bodylessReq1(":method", "GET", ":method", "POST") + }) +} + +func TestServer_Request_Reject_Pseudo_AfterRegular(t *testing.T) { + // 8.1.2.3 Request Pseudo-Header Fields + // "All pseudo-header fields MUST appear in the header block + // before regular header fields. Any request or response that + // contains a pseudo-header field that appears in a header + // block after a regular header field MUST be treated as + // malformed (Section 8.1.2.6)." + testRejectRequest(t, func(st *serverTester) { + st.addLogFilter("pseudo-header after regular header") + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + enc.WriteField(hpack.HeaderField{Name: ":method", Value: "GET"}) + enc.WriteField(hpack.HeaderField{Name: "regular", Value: "foobar"}) + enc.WriteField(hpack.HeaderField{Name: ":path", Value: "/"}) + enc.WriteField(hpack.HeaderField{Name: ":scheme", Value: "https"}) + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: buf.Bytes(), + EndStream: true, + EndHeaders: true, + }) + }) +} + +func TestServer_Request_Reject_Pseudo_Missing_path(t *testing.T) { + testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":path", "") }) +} + +func TestServer_Request_Reject_Pseudo_Missing_scheme(t *testing.T) { + testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":scheme", "") }) +} + +func TestServer_Request_Reject_Pseudo_scheme_invalid(t *testing.T) { + testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":scheme", "bogus") }) +} + +func TestServer_Request_Reject_Pseudo_Unknown(t *testing.T) { + testRejectRequest(t, func(st *serverTester) { + st.addLogFilter(`invalid pseudo-header ":unknown_thing"`) + st.bodylessReq1(":unknown_thing", "") + }) +} + +func testRejectRequest(t *testing.T, send func(*serverTester)) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + t.Error("server request made it to handler; should've been rejected") + }) + defer st.Close() + + st.greet() + send(st) + st.wantRSTStream(1, ErrCodeProtocol) +} + +func testRejectRequestWithProtocolError(t *testing.T, send func(*serverTester)) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + t.Error("server request made it to handler; should've been rejected") + }, optQuiet) + defer st.Close() + + st.greet() + send(st) + gf := st.wantGoAway() + if gf.ErrCode != ErrCodeProtocol { + t.Errorf("err code = %v; want %v", gf.ErrCode, ErrCodeProtocol) + } +} + +// Section 5.1, on idle connections: "Receiving any frame other than +// HEADERS or PRIORITY on a stream in this state MUST be treated as a +// connection error (Section 5.4.1) of type PROTOCOL_ERROR." +func TestRejectFrameOnIdle_WindowUpdate(t *testing.T) { + testRejectRequestWithProtocolError(t, func(st *serverTester) { + st.fr.WriteWindowUpdate(123, 456) + }) +} +func TestRejectFrameOnIdle_Data(t *testing.T) { + testRejectRequestWithProtocolError(t, func(st *serverTester) { + st.fr.WriteData(123, true, nil) + }) +} +func TestRejectFrameOnIdle_RSTStream(t *testing.T) { + testRejectRequestWithProtocolError(t, func(st *serverTester) { + st.fr.WriteRSTStream(123, ErrCodeCancel) + }) +} + +func TestServer_Request_Connect(t *testing.T) { + testServerRequest(t, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeaderRaw( + ":method", "CONNECT", + ":authority", "example.com:123", + ), + EndStream: true, + EndHeaders: true, + }) + }, func(r *http.Request) { + if g, w := r.Method, "CONNECT"; g != w { + t.Errorf("Method = %q; want %q", g, w) + } + if g, w := r.RequestURI, "example.com:123"; g != w { + t.Errorf("RequestURI = %q; want %q", g, w) + } + if g, w := r.URL.Host, "example.com:123"; g != w { + t.Errorf("URL.Host = %q; want %q", g, w) + } + }) +} + +func TestServer_Request_Connect_InvalidPath(t *testing.T) { + testServerRejectsStream(t, ErrCodeProtocol, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeaderRaw( + ":method", "CONNECT", + ":authority", "example.com:123", + ":path", "/bogus", + ), + EndStream: true, + EndHeaders: true, + }) + }) +} + +func TestServer_Request_Connect_InvalidScheme(t *testing.T) { + testServerRejectsStream(t, ErrCodeProtocol, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeaderRaw( + ":method", "CONNECT", + ":authority", "example.com:123", + ":scheme", "https", + ), + EndStream: true, + EndHeaders: true, + }) + }) +} + +func TestServer_Ping(t *testing.T) { + st := newServerTester(t, nil) + defer st.Close() + st.greet() + + // Server should ignore this one, since it has ACK set. + ackPingData := [8]byte{1, 2, 4, 8, 16, 32, 64, 128} + if err := st.fr.WritePing(true, ackPingData); err != nil { + t.Fatal(err) + } + + // But the server should reply to this one, since ACK is false. + pingData := [8]byte{1, 2, 3, 4, 5, 6, 7, 8} + if err := st.fr.WritePing(false, pingData); err != nil { + t.Fatal(err) + } + + pf := st.wantPing() + if !pf.Flags.Has(FlagPingAck) { + t.Error("response ping doesn't have ACK set") + } + if pf.Data != pingData { + t.Errorf("response ping has data %q; want %q", pf.Data, pingData) + } +} + +func TestServer_RejectsLargeFrames(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("see golang.org/issue/13434") + } + + st := newServerTester(t, nil) + defer st.Close() + st.greet() + + // Write too large of a frame (too large by one byte) + // We ignore the return value because it's expected that the server + // will only read the first 9 bytes (the headre) and then disconnect. + st.fr.WriteRawFrame(0xff, 0, 0, make([]byte, defaultMaxReadFrameSize+1)) + + gf := st.wantGoAway() + if gf.ErrCode != ErrCodeFrameSize { + t.Errorf("GOAWAY err = %v; want %v", gf.ErrCode, ErrCodeFrameSize) + } + if st.serverLogBuf.Len() != 0 { + // Previously we spun here for a bit until the GOAWAY disconnect + // timer fired, logging while we fired. + t.Errorf("unexpected server output: %.500s\n", st.serverLogBuf.Bytes()) + } +} + +func TestServer_Handler_Sends_WindowUpdate(t *testing.T) { + puppet := newHandlerPuppet() + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + puppet.act(w, r) + }) + defer st.Close() + defer puppet.done() + + st.greet() + + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader(":method", "POST"), + EndStream: false, // data coming + EndHeaders: true, + }) + st.writeData(1, false, []byte("abcdef")) + puppet.do(readBodyHandler(t, "abc")) + st.wantWindowUpdate(0, 3) + st.wantWindowUpdate(1, 3) + + puppet.do(readBodyHandler(t, "def")) + st.wantWindowUpdate(0, 3) + st.wantWindowUpdate(1, 3) + + st.writeData(1, true, []byte("ghijkl")) // END_STREAM here + puppet.do(readBodyHandler(t, "ghi")) + puppet.do(readBodyHandler(t, "jkl")) + st.wantWindowUpdate(0, 3) + st.wantWindowUpdate(0, 3) // no more stream-level, since END_STREAM +} + +// the version of the TestServer_Handler_Sends_WindowUpdate with padding. +// See golang.org/issue/16556 +func TestServer_Handler_Sends_WindowUpdate_Padding(t *testing.T) { + puppet := newHandlerPuppet() + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + puppet.act(w, r) + }) + defer st.Close() + defer puppet.done() + + st.greet() + + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeader(":method", "POST"), + EndStream: false, + EndHeaders: true, + }) + st.writeDataPadded(1, false, []byte("abcdef"), []byte{0, 0, 0, 0}) + + // Expect to immediately get our 5 bytes of padding back for + // both the connection and stream (4 bytes of padding + 1 byte of length) + st.wantWindowUpdate(0, 5) + st.wantWindowUpdate(1, 5) + + puppet.do(readBodyHandler(t, "abc")) + st.wantWindowUpdate(0, 3) + st.wantWindowUpdate(1, 3) + + puppet.do(readBodyHandler(t, "def")) + st.wantWindowUpdate(0, 3) + st.wantWindowUpdate(1, 3) +} + +func TestServer_Send_GoAway_After_Bogus_WindowUpdate(t *testing.T) { + st := newServerTester(t, nil) + defer st.Close() + st.greet() + if err := st.fr.WriteWindowUpdate(0, 1<<31-1); err != nil { + t.Fatal(err) + } + gf := st.wantGoAway() + if gf.ErrCode != ErrCodeFlowControl { + t.Errorf("GOAWAY err = %v; want %v", gf.ErrCode, ErrCodeFlowControl) + } + if gf.LastStreamID != 0 { + t.Errorf("GOAWAY last stream ID = %v; want %v", gf.LastStreamID, 0) + } +} + +func TestServer_Send_RstStream_After_Bogus_WindowUpdate(t *testing.T) { + inHandler := make(chan bool) + blockHandler := make(chan bool) + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + inHandler <- true + <-blockHandler + }) + defer st.Close() + defer close(blockHandler) + st.greet() + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeader(":method", "POST"), + EndStream: false, // keep it open + EndHeaders: true, + }) + <-inHandler + // Send a bogus window update: + if err := st.fr.WriteWindowUpdate(1, 1<<31-1); err != nil { + t.Fatal(err) + } + st.wantRSTStream(1, ErrCodeFlowControl) +} + +// testServerPostUnblock sends a hanging POST with unsent data to handler, +// then runs fn once in the handler, and verifies that the error returned from +// handler is acceptable. It fails if takes over 5 seconds for handler to exit. +func testServerPostUnblock(t *testing.T, + handler func(http.ResponseWriter, *http.Request) error, + fn func(*serverTester), + checkErr func(error), + otherHeaders ...string) { + inHandler := make(chan bool) + errc := make(chan error, 1) + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + inHandler <- true + errc <- handler(w, r) + }) + defer st.Close() + st.greet() + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeader(append([]string{":method", "POST"}, otherHeaders...)...), + EndStream: false, // keep it open + EndHeaders: true, + }) + <-inHandler + fn(st) + select { + case err := <-errc: + if checkErr != nil { + checkErr(err) + } + case <-time.After(5 * time.Second): + t.Fatal("timeout waiting for Handler to return") + } +} + +func TestServer_RSTStream_Unblocks_Read(t *testing.T) { + testServerPostUnblock(t, + func(w http.ResponseWriter, r *http.Request) (err error) { + _, err = r.Body.Read(make([]byte, 1)) + return + }, + func(st *serverTester) { + if err := st.fr.WriteRSTStream(1, ErrCodeCancel); err != nil { + t.Fatal(err) + } + }, + func(err error) { + want := StreamError{StreamID: 0x1, Code: 0x8} + if !reflect.DeepEqual(err, want) { + t.Errorf("Read error = %v; want %v", err, want) + } + }, + ) +} + +func TestServer_RSTStream_Unblocks_Header_Write(t *testing.T) { + // Run this test a bunch, because it doesn't always + // deadlock. But with a bunch, it did. + n := 50 + if testing.Short() { + n = 5 + } + for i := 0; i < n; i++ { + testServer_RSTStream_Unblocks_Header_Write(t) + } +} + +func testServer_RSTStream_Unblocks_Header_Write(t *testing.T) { + inHandler := make(chan bool, 1) + unblockHandler := make(chan bool, 1) + headerWritten := make(chan bool, 1) + wroteRST := make(chan bool, 1) + + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + inHandler <- true + <-wroteRST + w.Header().Set("foo", "bar") + w.WriteHeader(200) + w.(http.Flusher).Flush() + headerWritten <- true + <-unblockHandler + }) + defer st.Close() + + st.greet() + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeader(":method", "POST"), + EndStream: false, // keep it open + EndHeaders: true, + }) + <-inHandler + if err := st.fr.WriteRSTStream(1, ErrCodeCancel); err != nil { + t.Fatal(err) + } + wroteRST <- true + st.awaitIdle() + select { + case <-headerWritten: + case <-time.After(2 * time.Second): + t.Error("timeout waiting for header write") + } + unblockHandler <- true +} + +func TestServer_DeadConn_Unblocks_Read(t *testing.T) { + testServerPostUnblock(t, + func(w http.ResponseWriter, r *http.Request) (err error) { + _, err = r.Body.Read(make([]byte, 1)) + return + }, + func(st *serverTester) { st.cc.Close() }, + func(err error) { + if err == nil { + t.Error("unexpected nil error from Request.Body.Read") + } + }, + ) +} + +var blockUntilClosed = func(w http.ResponseWriter, r *http.Request) error { + <-w.(http.CloseNotifier).CloseNotify() + return nil +} + +func TestServer_CloseNotify_After_RSTStream(t *testing.T) { + testServerPostUnblock(t, blockUntilClosed, func(st *serverTester) { + if err := st.fr.WriteRSTStream(1, ErrCodeCancel); err != nil { + t.Fatal(err) + } + }, nil) +} + +func TestServer_CloseNotify_After_ConnClose(t *testing.T) { + testServerPostUnblock(t, blockUntilClosed, func(st *serverTester) { st.cc.Close() }, nil) +} + +// that CloseNotify unblocks after a stream error due to the client's +// problem that's unrelated to them explicitly canceling it (which is +// TestServer_CloseNotify_After_RSTStream above) +func TestServer_CloseNotify_After_StreamError(t *testing.T) { + testServerPostUnblock(t, blockUntilClosed, func(st *serverTester) { + // data longer than declared Content-Length => stream error + st.writeData(1, true, []byte("1234")) + }, nil, "content-length", "3") +} + +func TestServer_StateTransitions(t *testing.T) { + var st *serverTester + inHandler := make(chan bool) + writeData := make(chan bool) + leaveHandler := make(chan bool) + st = newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + inHandler <- true + if st.stream(1) == nil { + t.Errorf("nil stream 1 in handler") + } + if got, want := st.streamState(1), stateOpen; got != want { + t.Errorf("in handler, state is %v; want %v", got, want) + } + writeData <- true + if n, err := r.Body.Read(make([]byte, 1)); n != 0 || err != io.EOF { + t.Errorf("body read = %d, %v; want 0, EOF", n, err) + } + if got, want := st.streamState(1), stateHalfClosedRemote; got != want { + t.Errorf("in handler, state is %v; want %v", got, want) + } + + <-leaveHandler + }) + st.greet() + if st.stream(1) != nil { + t.Fatal("stream 1 should be empty") + } + if got := st.streamState(1); got != stateIdle { + t.Fatalf("stream 1 should be idle; got %v", got) + } + + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeader(":method", "POST"), + EndStream: false, // keep it open + EndHeaders: true, + }) + <-inHandler + <-writeData + st.writeData(1, true, nil) + + leaveHandler <- true + hf := st.wantHeaders() + if !hf.StreamEnded() { + t.Fatal("expected END_STREAM flag") + } + + if got, want := st.streamState(1), stateClosed; got != want { + t.Errorf("at end, state is %v; want %v", got, want) + } + if st.stream(1) != nil { + t.Fatal("at end, stream 1 should be gone") + } +} + +// test HEADERS w/o EndHeaders + another HEADERS (should get rejected) +func TestServer_Rejects_HeadersNoEnd_Then_Headers(t *testing.T) { + testServerRejectsConn(t, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeader(), + EndStream: true, + EndHeaders: false, + }) + st.writeHeaders(HeadersFrameParam{ // Not a continuation. + StreamID: 3, // different stream. + BlockFragment: st.encodeHeader(), + EndStream: true, + EndHeaders: true, + }) + }) +} + +// test HEADERS w/o EndHeaders + PING (should get rejected) +func TestServer_Rejects_HeadersNoEnd_Then_Ping(t *testing.T) { + testServerRejectsConn(t, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeader(), + EndStream: true, + EndHeaders: false, + }) + if err := st.fr.WritePing(false, [8]byte{}); err != nil { + t.Fatal(err) + } + }) +} + +// test HEADERS w/ EndHeaders + a continuation HEADERS (should get rejected) +func TestServer_Rejects_HeadersEnd_Then_Continuation(t *testing.T) { + testServerRejectsConn(t, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeader(), + EndStream: true, + EndHeaders: true, + }) + st.wantHeaders() + if err := st.fr.WriteContinuation(1, true, encodeHeaderNoImplicit(t, "foo", "bar")); err != nil { + t.Fatal(err) + } + }) +} + +// test HEADERS w/o EndHeaders + a continuation HEADERS on wrong stream ID +func TestServer_Rejects_HeadersNoEnd_Then_ContinuationWrongStream(t *testing.T) { + testServerRejectsConn(t, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeader(), + EndStream: true, + EndHeaders: false, + }) + if err := st.fr.WriteContinuation(3, true, encodeHeaderNoImplicit(t, "foo", "bar")); err != nil { + t.Fatal(err) + } + }) +} + +// No HEADERS on stream 0. +func TestServer_Rejects_Headers0(t *testing.T) { + testServerRejectsConn(t, func(st *serverTester) { + st.fr.AllowIllegalWrites = true + st.writeHeaders(HeadersFrameParam{ + StreamID: 0, + BlockFragment: st.encodeHeader(), + EndStream: true, + EndHeaders: true, + }) + }) +} + +// No CONTINUATION on stream 0. +func TestServer_Rejects_Continuation0(t *testing.T) { + testServerRejectsConn(t, func(st *serverTester) { + st.fr.AllowIllegalWrites = true + if err := st.fr.WriteContinuation(0, true, st.encodeHeader()); err != nil { + t.Fatal(err) + } + }) +} + +// No PRIORITY on stream 0. +func TestServer_Rejects_Priority0(t *testing.T) { + testServerRejectsConn(t, func(st *serverTester) { + st.fr.AllowIllegalWrites = true + st.writePriority(0, PriorityParam{StreamDep: 1}) + }) +} + +// No HEADERS frame with a self-dependence. +func TestServer_Rejects_HeadersSelfDependence(t *testing.T) { + testServerRejectsStream(t, ErrCodeProtocol, func(st *serverTester) { + st.fr.AllowIllegalWrites = true + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeader(), + EndStream: true, + EndHeaders: true, + Priority: PriorityParam{StreamDep: 1}, + }) + }) +} + +// No PRIORTY frame with a self-dependence. +func TestServer_Rejects_PrioritySelfDependence(t *testing.T) { + testServerRejectsStream(t, ErrCodeProtocol, func(st *serverTester) { + st.fr.AllowIllegalWrites = true + st.writePriority(1, PriorityParam{StreamDep: 1}) + }) +} + +func TestServer_Rejects_PushPromise(t *testing.T) { + testServerRejectsConn(t, func(st *serverTester) { + pp := PushPromiseParam{ + StreamID: 1, + PromiseID: 3, + } + if err := st.fr.WritePushPromise(pp); err != nil { + t.Fatal(err) + } + }) +} + +// testServerRejectsConn tests that the server hangs up with a GOAWAY +// frame and a server close after the client does something +// deserving a CONNECTION_ERROR. +func testServerRejectsConn(t *testing.T, writeReq func(*serverTester)) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {}) + st.addLogFilter("connection error: PROTOCOL_ERROR") + defer st.Close() + st.greet() + writeReq(st) + + st.wantGoAway() + errc := make(chan error, 1) + go func() { + fr, err := st.fr.ReadFrame() + if err == nil { + err = fmt.Errorf("got frame of type %T", fr) + } + errc <- err + }() + select { + case err := <-errc: + if err != io.EOF { + t.Errorf("ReadFrame = %v; want io.EOF", err) + } + case <-time.After(2 * time.Second): + t.Error("timeout waiting for disconnect") + } +} + +// testServerRejectsStream tests that the server sends a RST_STREAM with the provided +// error code after a client sends a bogus request. +func testServerRejectsStream(t *testing.T, code ErrCode, writeReq func(*serverTester)) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {}) + defer st.Close() + st.greet() + writeReq(st) + st.wantRSTStream(1, code) +} + +// testServerRequest sets up an idle HTTP/2 connection and lets you +// write a single request with writeReq, and then verify that the +// *http.Request is built correctly in checkReq. +func testServerRequest(t *testing.T, writeReq func(*serverTester), checkReq func(*http.Request)) { + gotReq := make(chan bool, 1) + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + if r.Body == nil { + t.Fatal("nil Body") + } + checkReq(r) + gotReq <- true + }) + defer st.Close() + + st.greet() + writeReq(st) + + select { + case <-gotReq: + case <-time.After(2 * time.Second): + t.Error("timeout waiting for request") + } +} + +func getSlash(st *serverTester) { st.bodylessReq1() } + +func TestServer_Response_NoData(t *testing.T) { + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + // Nothing. + return nil + }, func(st *serverTester) { + getSlash(st) + hf := st.wantHeaders() + if !hf.StreamEnded() { + t.Fatal("want END_STREAM flag") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + }) +} + +func TestServer_Response_NoData_Header_FooBar(t *testing.T) { + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + w.Header().Set("Foo-Bar", "some-value") + return nil + }, func(st *serverTester) { + getSlash(st) + hf := st.wantHeaders() + if !hf.StreamEnded() { + t.Fatal("want END_STREAM flag") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + goth := st.decodeHeader(hf.HeaderBlockFragment()) + wanth := [][2]string{ + {":status", "200"}, + {"foo-bar", "some-value"}, + {"content-type", "text/plain; charset=utf-8"}, + {"content-length", "0"}, + } + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Got headers %v; want %v", goth, wanth) + } + }) +} + +func TestServer_Response_Data_Sniff_DoesntOverride(t *testing.T) { + const msg = "this is HTML." + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + w.Header().Set("Content-Type", "foo/bar") + io.WriteString(w, msg) + return nil + }, func(st *serverTester) { + getSlash(st) + hf := st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("don't want END_STREAM, expecting data") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + goth := st.decodeHeader(hf.HeaderBlockFragment()) + wanth := [][2]string{ + {":status", "200"}, + {"content-type", "foo/bar"}, + {"content-length", strconv.Itoa(len(msg))}, + } + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Got headers %v; want %v", goth, wanth) + } + df := st.wantData() + if !df.StreamEnded() { + t.Error("expected DATA to have END_STREAM flag") + } + if got := string(df.Data()); got != msg { + t.Errorf("got DATA %q; want %q", got, msg) + } + }) +} + +func TestServer_Response_TransferEncoding_chunked(t *testing.T) { + const msg = "hi" + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + w.Header().Set("Transfer-Encoding", "chunked") // should be stripped + io.WriteString(w, msg) + return nil + }, func(st *serverTester) { + getSlash(st) + hf := st.wantHeaders() + goth := st.decodeHeader(hf.HeaderBlockFragment()) + wanth := [][2]string{ + {":status", "200"}, + {"content-type", "text/plain; charset=utf-8"}, + {"content-length", strconv.Itoa(len(msg))}, + } + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Got headers %v; want %v", goth, wanth) + } + }) +} + +// Header accessed only after the initial write. +func TestServer_Response_Data_IgnoreHeaderAfterWrite_After(t *testing.T) { + const msg = "this is HTML." + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + io.WriteString(w, msg) + w.Header().Set("foo", "should be ignored") + return nil + }, func(st *serverTester) { + getSlash(st) + hf := st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("unexpected END_STREAM") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + goth := st.decodeHeader(hf.HeaderBlockFragment()) + wanth := [][2]string{ + {":status", "200"}, + {"content-type", "text/html; charset=utf-8"}, + {"content-length", strconv.Itoa(len(msg))}, + } + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Got headers %v; want %v", goth, wanth) + } + }) +} + +// Header accessed before the initial write and later mutated. +func TestServer_Response_Data_IgnoreHeaderAfterWrite_Overwrite(t *testing.T) { + const msg = "this is HTML." + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + w.Header().Set("foo", "proper value") + io.WriteString(w, msg) + w.Header().Set("foo", "should be ignored") + return nil + }, func(st *serverTester) { + getSlash(st) + hf := st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("unexpected END_STREAM") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + goth := st.decodeHeader(hf.HeaderBlockFragment()) + wanth := [][2]string{ + {":status", "200"}, + {"foo", "proper value"}, + {"content-type", "text/html; charset=utf-8"}, + {"content-length", strconv.Itoa(len(msg))}, + } + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Got headers %v; want %v", goth, wanth) + } + }) +} + +func TestServer_Response_Data_SniffLenType(t *testing.T) { + const msg = "this is HTML." + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + io.WriteString(w, msg) + return nil + }, func(st *serverTester) { + getSlash(st) + hf := st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("don't want END_STREAM, expecting data") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + goth := st.decodeHeader(hf.HeaderBlockFragment()) + wanth := [][2]string{ + {":status", "200"}, + {"content-type", "text/html; charset=utf-8"}, + {"content-length", strconv.Itoa(len(msg))}, + } + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Got headers %v; want %v", goth, wanth) + } + df := st.wantData() + if !df.StreamEnded() { + t.Error("expected DATA to have END_STREAM flag") + } + if got := string(df.Data()); got != msg { + t.Errorf("got DATA %q; want %q", got, msg) + } + }) +} + +func TestServer_Response_Header_Flush_MidWrite(t *testing.T) { + const msg = "this is HTML" + const msg2 = ", and this is the next chunk" + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + io.WriteString(w, msg) + w.(http.Flusher).Flush() + io.WriteString(w, msg2) + return nil + }, func(st *serverTester) { + getSlash(st) + hf := st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("unexpected END_STREAM flag") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + goth := st.decodeHeader(hf.HeaderBlockFragment()) + wanth := [][2]string{ + {":status", "200"}, + {"content-type", "text/html; charset=utf-8"}, // sniffed + // and no content-length + } + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Got headers %v; want %v", goth, wanth) + } + { + df := st.wantData() + if df.StreamEnded() { + t.Error("unexpected END_STREAM flag") + } + if got := string(df.Data()); got != msg { + t.Errorf("got DATA %q; want %q", got, msg) + } + } + { + df := st.wantData() + if !df.StreamEnded() { + t.Error("wanted END_STREAM flag on last data chunk") + } + if got := string(df.Data()); got != msg2 { + t.Errorf("got DATA %q; want %q", got, msg2) + } + } + }) +} + +func TestServer_Response_LargeWrite(t *testing.T) { + const size = 1 << 20 + const maxFrameSize = 16 << 10 + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + n, err := w.Write(bytes.Repeat([]byte("a"), size)) + if err != nil { + return fmt.Errorf("Write error: %v", err) + } + if n != size { + return fmt.Errorf("wrong size %d from Write", n) + } + return nil + }, func(st *serverTester) { + if err := st.fr.WriteSettings( + Setting{SettingInitialWindowSize, 0}, + Setting{SettingMaxFrameSize, maxFrameSize}, + ); err != nil { + t.Fatal(err) + } + st.wantSettingsAck() + + getSlash(st) // make the single request + + // Give the handler quota to write: + if err := st.fr.WriteWindowUpdate(1, size); err != nil { + t.Fatal(err) + } + // Give the handler quota to write to connection-level + // window as well + if err := st.fr.WriteWindowUpdate(0, size); err != nil { + t.Fatal(err) + } + hf := st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("unexpected END_STREAM flag") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + goth := st.decodeHeader(hf.HeaderBlockFragment()) + wanth := [][2]string{ + {":status", "200"}, + {"content-type", "text/plain; charset=utf-8"}, // sniffed + // and no content-length + } + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Got headers %v; want %v", goth, wanth) + } + var bytes, frames int + for { + df := st.wantData() + bytes += len(df.Data()) + frames++ + for _, b := range df.Data() { + if b != 'a' { + t.Fatal("non-'a' byte seen in DATA") + } + } + if df.StreamEnded() { + break + } + } + if bytes != size { + t.Errorf("Got %d bytes; want %d", bytes, size) + } + if want := int(size / maxFrameSize); frames < want || frames > want*2 { + t.Errorf("Got %d frames; want %d", frames, size) + } + }) +} + +// Test that the handler can't write more than the client allows +func TestServer_Response_LargeWrite_FlowControlled(t *testing.T) { + // Make these reads. Before each read, the client adds exactly enough + // flow-control to satisfy the read. Numbers chosen arbitrarily. + reads := []int{123, 1, 13, 127} + size := 0 + for _, n := range reads { + size += n + } + + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + w.(http.Flusher).Flush() + n, err := w.Write(bytes.Repeat([]byte("a"), size)) + if err != nil { + return fmt.Errorf("Write error: %v", err) + } + if n != size { + return fmt.Errorf("wrong size %d from Write", n) + } + return nil + }, func(st *serverTester) { + // Set the window size to something explicit for this test. + // It's also how much initial data we expect. + if err := st.fr.WriteSettings(Setting{SettingInitialWindowSize, uint32(reads[0])}); err != nil { + t.Fatal(err) + } + st.wantSettingsAck() + + getSlash(st) // make the single request + + hf := st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("unexpected END_STREAM flag") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + + df := st.wantData() + if got := len(df.Data()); got != reads[0] { + t.Fatalf("Initial window size = %d but got DATA with %d bytes", reads[0], got) + } + + for _, quota := range reads[1:] { + if err := st.fr.WriteWindowUpdate(1, uint32(quota)); err != nil { + t.Fatal(err) + } + df := st.wantData() + if int(quota) != len(df.Data()) { + t.Fatalf("read %d bytes after giving %d quota", len(df.Data()), quota) + } + } + }) +} + +// Test that the handler blocked in a Write is unblocked if the server sends a RST_STREAM. +func TestServer_Response_RST_Unblocks_LargeWrite(t *testing.T) { + const size = 1 << 20 + const maxFrameSize = 16 << 10 + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + w.(http.Flusher).Flush() + errc := make(chan error, 1) + go func() { + _, err := w.Write(bytes.Repeat([]byte("a"), size)) + errc <- err + }() + select { + case err := <-errc: + if err == nil { + return errors.New("unexpected nil error from Write in handler") + } + return nil + case <-time.After(2 * time.Second): + return errors.New("timeout waiting for Write in handler") + } + }, func(st *serverTester) { + if err := st.fr.WriteSettings( + Setting{SettingInitialWindowSize, 0}, + Setting{SettingMaxFrameSize, maxFrameSize}, + ); err != nil { + t.Fatal(err) + } + st.wantSettingsAck() + + getSlash(st) // make the single request + + hf := st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("unexpected END_STREAM flag") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + + if err := st.fr.WriteRSTStream(1, ErrCodeCancel); err != nil { + t.Fatal(err) + } + }) +} + +func TestServer_Response_Empty_Data_Not_FlowControlled(t *testing.T) { + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + w.(http.Flusher).Flush() + // Nothing; send empty DATA + return nil + }, func(st *serverTester) { + // Handler gets no data quota: + if err := st.fr.WriteSettings(Setting{SettingInitialWindowSize, 0}); err != nil { + t.Fatal(err) + } + st.wantSettingsAck() + + getSlash(st) // make the single request + + hf := st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("unexpected END_STREAM flag") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + + df := st.wantData() + if got := len(df.Data()); got != 0 { + t.Fatalf("unexpected %d DATA bytes; want 0", got) + } + if !df.StreamEnded() { + t.Fatal("DATA didn't have END_STREAM") + } + }) +} + +func TestServer_Response_Automatic100Continue(t *testing.T) { + const msg = "foo" + const reply = "bar" + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + if v := r.Header.Get("Expect"); v != "" { + t.Errorf("Expect header = %q; want empty", v) + } + buf := make([]byte, len(msg)) + // This read should trigger the 100-continue being sent. + if n, err := io.ReadFull(r.Body, buf); err != nil || n != len(msg) || string(buf) != msg { + return fmt.Errorf("ReadFull = %q, %v; want %q, nil", buf[:n], err, msg) + } + _, err := io.WriteString(w, reply) + return err + }, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader(":method", "POST", "expect", "100-continue"), + EndStream: false, + EndHeaders: true, + }) + hf := st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("unexpected END_STREAM flag") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + goth := st.decodeHeader(hf.HeaderBlockFragment()) + wanth := [][2]string{ + {":status", "100"}, + } + if !reflect.DeepEqual(goth, wanth) { + t.Fatalf("Got headers %v; want %v", goth, wanth) + } + + // Okay, they sent status 100, so we can send our + // gigantic and/or sensitive "foo" payload now. + st.writeData(1, true, []byte(msg)) + + st.wantWindowUpdate(0, uint32(len(msg))) + + hf = st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("expected data to follow") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + goth = st.decodeHeader(hf.HeaderBlockFragment()) + wanth = [][2]string{ + {":status", "200"}, + {"content-type", "text/plain; charset=utf-8"}, + {"content-length", strconv.Itoa(len(reply))}, + } + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Got headers %v; want %v", goth, wanth) + } + + df := st.wantData() + if string(df.Data()) != reply { + t.Errorf("Client read %q; want %q", df.Data(), reply) + } + if !df.StreamEnded() { + t.Errorf("expect data stream end") + } + }) +} + +func TestServer_HandlerWriteErrorOnDisconnect(t *testing.T) { + errc := make(chan error, 1) + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + p := []byte("some data.\n") + for { + _, err := w.Write(p) + if err != nil { + errc <- err + return nil + } + } + }, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeader(), + EndStream: false, + EndHeaders: true, + }) + hf := st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("unexpected END_STREAM flag") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + // Close the connection and wait for the handler to (hopefully) notice. + st.cc.Close() + select { + case <-errc: + case <-time.After(5 * time.Second): + t.Error("timeout") + } + }) +} + +func TestServer_Rejects_Too_Many_Streams(t *testing.T) { + const testPath = "/some/path" + + inHandler := make(chan uint32) + leaveHandler := make(chan bool) + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + id := w.(*responseWriter).rws.stream.id + inHandler <- id + if id == 1+(defaultMaxStreams+1)*2 && r.URL.Path != testPath { + t.Errorf("decoded final path as %q; want %q", r.URL.Path, testPath) + } + <-leaveHandler + }) + defer st.Close() + st.greet() + nextStreamID := uint32(1) + streamID := func() uint32 { + defer func() { nextStreamID += 2 }() + return nextStreamID + } + sendReq := func(id uint32, headers ...string) { + st.writeHeaders(HeadersFrameParam{ + StreamID: id, + BlockFragment: st.encodeHeader(headers...), + EndStream: true, + EndHeaders: true, + }) + } + for i := 0; i < defaultMaxStreams; i++ { + sendReq(streamID()) + <-inHandler + } + defer func() { + for i := 0; i < defaultMaxStreams; i++ { + leaveHandler <- true + } + }() + + // And this one should cross the limit: + // (It's also sent as a CONTINUATION, to verify we still track the decoder context, + // even if we're rejecting it) + rejectID := streamID() + headerBlock := st.encodeHeader(":path", testPath) + frag1, frag2 := headerBlock[:3], headerBlock[3:] + st.writeHeaders(HeadersFrameParam{ + StreamID: rejectID, + BlockFragment: frag1, + EndStream: true, + EndHeaders: false, // CONTINUATION coming + }) + if err := st.fr.WriteContinuation(rejectID, true, frag2); err != nil { + t.Fatal(err) + } + st.wantRSTStream(rejectID, ErrCodeProtocol) + + // But let a handler finish: + leaveHandler <- true + st.wantHeaders() + + // And now another stream should be able to start: + goodID := streamID() + sendReq(goodID, ":path", testPath) + select { + case got := <-inHandler: + if got != goodID { + t.Errorf("Got stream %d; want %d", got, goodID) + } + case <-time.After(3 * time.Second): + t.Error("timeout waiting for handler") + } +} + +// So many response headers that the server needs to use CONTINUATION frames: +func TestServer_Response_ManyHeaders_With_Continuation(t *testing.T) { + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + h := w.Header() + for i := 0; i < 5000; i++ { + h.Set(fmt.Sprintf("x-header-%d", i), fmt.Sprintf("x-value-%d", i)) + } + return nil + }, func(st *serverTester) { + getSlash(st) + hf := st.wantHeaders() + if hf.HeadersEnded() { + t.Fatal("got unwanted END_HEADERS flag") + } + n := 0 + for { + n++ + cf := st.wantContinuation() + if cf.HeadersEnded() { + break + } + } + if n < 5 { + t.Errorf("Only got %d CONTINUATION frames; expected 5+ (currently 6)", n) + } + }) +} + +// This previously crashed (reported by Mathieu Lonjaret as observed +// while using Camlistore) because we got a DATA frame from the client +// after the handler exited and our logic at the time was wrong, +// keeping a stream in the map in stateClosed, which tickled an +// invariant check later when we tried to remove that stream (via +// defer sc.closeAllStreamsOnConnClose) when the serverConn serve loop +// ended. +func TestServer_NoCrash_HandlerClose_Then_ClientClose(t *testing.T) { + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + // nothing + return nil + }, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeader(), + EndStream: false, // DATA is coming + EndHeaders: true, + }) + hf := st.wantHeaders() + if !hf.HeadersEnded() || !hf.StreamEnded() { + t.Fatalf("want END_HEADERS+END_STREAM, got %v", hf) + } + + // Sent when the a Handler closes while a client has + // indicated it's still sending DATA: + st.wantRSTStream(1, ErrCodeNo) + + // Now the handler has ended, so it's ended its + // stream, but the client hasn't closed its side + // (stateClosedLocal). So send more data and verify + // it doesn't crash with an internal invariant panic, like + // it did before. + st.writeData(1, true, []byte("foo")) + + // Get our flow control bytes back, since the handler didn't get them. + st.wantWindowUpdate(0, uint32(len("foo"))) + + // Sent after a peer sends data anyway (admittedly the + // previous RST_STREAM might've still been in-flight), + // but they'll get the more friendly 'cancel' code + // first. + st.wantRSTStream(1, ErrCodeStreamClosed) + + // Set up a bunch of machinery to record the panic we saw + // previously. + var ( + panMu sync.Mutex + panicVal interface{} + ) + + testHookOnPanicMu.Lock() + testHookOnPanic = func(sc *serverConn, pv interface{}) bool { + panMu.Lock() + panicVal = pv + panMu.Unlock() + return true + } + testHookOnPanicMu.Unlock() + + // Now force the serve loop to end, via closing the connection. + st.cc.Close() + select { + case <-st.sc.doneServing: + // Loop has exited. + panMu.Lock() + got := panicVal + panMu.Unlock() + if got != nil { + t.Errorf("Got panic: %v", got) + } + case <-time.After(5 * time.Second): + t.Error("timeout") + } + }) +} + +func TestServer_Rejects_TLS10(t *testing.T) { testRejectTLS(t, tls.VersionTLS10) } +func TestServer_Rejects_TLS11(t *testing.T) { testRejectTLS(t, tls.VersionTLS11) } + +func testRejectTLS(t *testing.T, max uint16) { + st := newServerTester(t, nil, func(c *tls.Config) { + c.MaxVersion = max + }) + defer st.Close() + gf := st.wantGoAway() + if got, want := gf.ErrCode, ErrCodeInadequateSecurity; got != want { + t.Errorf("Got error code %v; want %v", got, want) + } +} + +func TestServer_Rejects_TLSBadCipher(t *testing.T) { + st := newServerTester(t, nil, func(c *tls.Config) { + // Only list bad ones: + c.CipherSuites = []uint16{ + tls.TLS_RSA_WITH_RC4_128_SHA, + tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA, + tls.TLS_RSA_WITH_AES_128_CBC_SHA, + tls.TLS_RSA_WITH_AES_256_CBC_SHA, + tls.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, + tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, + tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, + tls.TLS_ECDHE_RSA_WITH_RC4_128_SHA, + tls.TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, + tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, + tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, + cipher_TLS_RSA_WITH_AES_128_CBC_SHA256, + } + }) + defer st.Close() + gf := st.wantGoAway() + if got, want := gf.ErrCode, ErrCodeInadequateSecurity; got != want { + t.Errorf("Got error code %v; want %v", got, want) + } +} + +func TestServer_Advertises_Common_Cipher(t *testing.T) { + const requiredSuite = tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 + st := newServerTester(t, nil, func(c *tls.Config) { + // Have the client only support the one required by the spec. + c.CipherSuites = []uint16{requiredSuite} + }, func(ts *httptest.Server) { + var srv *http.Server = ts.Config + // Have the server configured with no specific cipher suites. + // This tests that Go's defaults include the required one. + srv.TLSConfig = nil + }) + defer st.Close() + st.greet() +} + +func (st *serverTester) onHeaderField(f hpack.HeaderField) { + if f.Name == "date" { + return + } + st.decodedHeaders = append(st.decodedHeaders, [2]string{f.Name, f.Value}) +} + +func (st *serverTester) decodeHeader(headerBlock []byte) (pairs [][2]string) { + st.decodedHeaders = nil + if _, err := st.hpackDec.Write(headerBlock); err != nil { + st.t.Fatalf("hpack decoding error: %v", err) + } + if err := st.hpackDec.Close(); err != nil { + st.t.Fatalf("hpack decoding error: %v", err) + } + return st.decodedHeaders +} + +// testServerResponse sets up an idle HTTP/2 connection. The client function should +// write a single request that must be handled by the handler. This waits up to 5s +// for client to return, then up to an additional 2s for the handler to return. +func testServerResponse(t testing.TB, + handler func(http.ResponseWriter, *http.Request) error, + client func(*serverTester), +) { + errc := make(chan error, 1) + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + if r.Body == nil { + t.Fatal("nil Body") + } + errc <- handler(w, r) + }) + defer st.Close() + + donec := make(chan bool) + go func() { + defer close(donec) + st.greet() + client(st) + }() + + select { + case <-donec: + case <-time.After(5 * time.Second): + t.Fatal("timeout in client") + } + + select { + case err := <-errc: + if err != nil { + t.Fatalf("Error in handler: %v", err) + } + case <-time.After(2 * time.Second): + t.Fatal("timeout in handler") + } +} + +// readBodyHandler returns an http Handler func that reads len(want) +// bytes from r.Body and fails t if the contents read were not +// the value of want. +func readBodyHandler(t *testing.T, want string) func(w http.ResponseWriter, r *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + buf := make([]byte, len(want)) + _, err := io.ReadFull(r.Body, buf) + if err != nil { + t.Error(err) + return + } + if string(buf) != want { + t.Errorf("read %q; want %q", buf, want) + } + } +} + +// TestServerWithCurl currently fails, hence the LenientCipherSuites test. See: +// https://github.com/tatsuhiro-t/nghttp2/issues/140 & +// http://sourceforge.net/p/curl/bugs/1472/ +func TestServerWithCurl(t *testing.T) { testServerWithCurl(t, false) } +func TestServerWithCurl_LenientCipherSuites(t *testing.T) { testServerWithCurl(t, true) } + +func testServerWithCurl(t *testing.T, permitProhibitedCipherSuites bool) { + if runtime.GOOS != "linux" { + t.Skip("skipping Docker test when not on Linux; requires --net which won't work with boot2docker anyway") + } + if testing.Short() { + t.Skip("skipping curl test in short mode") + } + requireCurl(t) + var gotConn int32 + testHookOnConn = func() { atomic.StoreInt32(&gotConn, 1) } + + const msg = "Hello from curl!\n" + ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Foo", "Bar") + w.Header().Set("Client-Proto", r.Proto) + io.WriteString(w, msg) + })) + ConfigureServer(ts.Config, &Server{ + PermitProhibitedCipherSuites: permitProhibitedCipherSuites, + }) + ts.TLS = ts.Config.TLSConfig // the httptest.Server has its own copy of this TLS config + ts.StartTLS() + defer ts.Close() + + t.Logf("Running test server for curl to hit at: %s", ts.URL) + container := curl(t, "--silent", "--http2", "--insecure", "-v", ts.URL) + defer kill(container) + resc := make(chan interface{}, 1) + go func() { + res, err := dockerLogs(container) + if err != nil { + resc <- err + } else { + resc <- res + } + }() + select { + case res := <-resc: + if err, ok := res.(error); ok { + t.Fatal(err) + } + body := string(res.([]byte)) + // Search for both "key: value" and "key:value", since curl changed their format + // Our Dockerfile contains the latest version (no space), but just in case people + // didn't rebuild, check both. + if !strings.Contains(body, "foo: Bar") && !strings.Contains(body, "foo:Bar") { + t.Errorf("didn't see foo: Bar header") + t.Logf("Got: %s", body) + } + if !strings.Contains(body, "client-proto: HTTP/2") && !strings.Contains(body, "client-proto:HTTP/2") { + t.Errorf("didn't see client-proto: HTTP/2 header") + t.Logf("Got: %s", res) + } + if !strings.Contains(string(res.([]byte)), msg) { + t.Errorf("didn't see %q content", msg) + t.Logf("Got: %s", res) + } + case <-time.After(3 * time.Second): + t.Errorf("timeout waiting for curl") + } + + if atomic.LoadInt32(&gotConn) == 0 { + t.Error("never saw an http2 connection") + } +} + +var doh2load = flag.Bool("h2load", false, "Run h2load test") + +func TestServerWithH2Load(t *testing.T) { + if !*doh2load { + t.Skip("Skipping without --h2load flag.") + } + if runtime.GOOS != "linux" { + t.Skip("skipping Docker test when not on Linux; requires --net which won't work with boot2docker anyway") + } + requireH2load(t) + + msg := strings.Repeat("Hello, h2load!\n", 5000) + ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + io.WriteString(w, msg) + w.(http.Flusher).Flush() + io.WriteString(w, msg) + })) + ts.StartTLS() + defer ts.Close() + + cmd := exec.Command("docker", "run", "--net=host", "--entrypoint=/usr/local/bin/h2load", "gohttp2/curl", + "-n100000", "-c100", "-m100", ts.URL) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + if err := cmd.Run(); err != nil { + t.Fatal(err) + } +} + +// Issue 12843 +func TestServerDoS_MaxHeaderListSize(t *testing.T) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {}) + defer st.Close() + + // shake hands + frameSize := defaultMaxReadFrameSize + var advHeaderListSize *uint32 + st.greetAndCheckSettings(func(s Setting) error { + switch s.ID { + case SettingMaxFrameSize: + if s.Val < minMaxFrameSize { + frameSize = minMaxFrameSize + } else if s.Val > maxFrameSize { + frameSize = maxFrameSize + } else { + frameSize = int(s.Val) + } + case SettingMaxHeaderListSize: + advHeaderListSize = &s.Val + } + return nil + }) + + if advHeaderListSize == nil { + t.Errorf("server didn't advertise a max header list size") + } else if *advHeaderListSize == 0 { + t.Errorf("server advertised a max header list size of 0") + } + + st.encodeHeaderField(":method", "GET") + st.encodeHeaderField(":path", "/") + st.encodeHeaderField(":scheme", "https") + cookie := strings.Repeat("*", 4058) + st.encodeHeaderField("cookie", cookie) + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.headerBuf.Bytes(), + EndStream: true, + EndHeaders: false, + }) + + // Capture the short encoding of a duplicate ~4K cookie, now + // that we've already sent it once. + st.headerBuf.Reset() + st.encodeHeaderField("cookie", cookie) + + // Now send 1MB of it. + const size = 1 << 20 + b := bytes.Repeat(st.headerBuf.Bytes(), size/st.headerBuf.Len()) + for len(b) > 0 { + chunk := b + if len(chunk) > frameSize { + chunk = chunk[:frameSize] + } + b = b[len(chunk):] + st.fr.WriteContinuation(1, len(b) == 0, chunk) + } + + h := st.wantHeaders() + if !h.HeadersEnded() { + t.Fatalf("Got HEADERS without END_HEADERS set: %v", h) + } + headers := st.decodeHeader(h.HeaderBlockFragment()) + want := [][2]string{ + {":status", "431"}, + {"content-type", "text/html; charset=utf-8"}, + {"content-length", "63"}, + } + if !reflect.DeepEqual(headers, want) { + t.Errorf("Headers mismatch.\n got: %q\nwant: %q\n", headers, want) + } +} + +func TestCompressionErrorOnWrite(t *testing.T) { + const maxStrLen = 8 << 10 + var serverConfig *http.Server + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + // No response body. + }, func(ts *httptest.Server) { + serverConfig = ts.Config + serverConfig.MaxHeaderBytes = maxStrLen + }) + st.addLogFilter("connection error: COMPRESSION_ERROR") + defer st.Close() + st.greet() + + maxAllowed := st.sc.framer.maxHeaderStringLen() + + // Crank this up, now that we have a conn connected with the + // hpack.Decoder's max string length set has been initialized + // from the earlier low ~8K value. We want this higher so don't + // hit the max header list size. We only want to test hitting + // the max string size. + serverConfig.MaxHeaderBytes = 1 << 20 + + // First a request with a header that's exactly the max allowed size + // for the hpack compression. It's still too long for the header list + // size, so we'll get the 431 error, but that keeps the compression + // context still valid. + hbf := st.encodeHeader("foo", strings.Repeat("a", maxAllowed)) + + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: hbf, + EndStream: true, + EndHeaders: true, + }) + h := st.wantHeaders() + if !h.HeadersEnded() { + t.Fatalf("Got HEADERS without END_HEADERS set: %v", h) + } + headers := st.decodeHeader(h.HeaderBlockFragment()) + want := [][2]string{ + {":status", "431"}, + {"content-type", "text/html; charset=utf-8"}, + {"content-length", "63"}, + } + if !reflect.DeepEqual(headers, want) { + t.Errorf("Headers mismatch.\n got: %q\nwant: %q\n", headers, want) + } + df := st.wantData() + if !strings.Contains(string(df.Data()), "HTTP Error 431") { + t.Errorf("Unexpected data body: %q", df.Data()) + } + if !df.StreamEnded() { + t.Fatalf("expect data stream end") + } + + // And now send one that's just one byte too big. + hbf = st.encodeHeader("bar", strings.Repeat("b", maxAllowed+1)) + st.writeHeaders(HeadersFrameParam{ + StreamID: 3, + BlockFragment: hbf, + EndStream: true, + EndHeaders: true, + }) + ga := st.wantGoAway() + if ga.ErrCode != ErrCodeCompression { + t.Errorf("GOAWAY err = %v; want ErrCodeCompression", ga.ErrCode) + } +} + +func TestCompressionErrorOnClose(t *testing.T) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + // No response body. + }) + st.addLogFilter("connection error: COMPRESSION_ERROR") + defer st.Close() + st.greet() + + hbf := st.encodeHeader("foo", "bar") + hbf = hbf[:len(hbf)-1] // truncate one byte from the end, so hpack.Decoder.Close fails. + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: hbf, + EndStream: true, + EndHeaders: true, + }) + ga := st.wantGoAway() + if ga.ErrCode != ErrCodeCompression { + t.Errorf("GOAWAY err = %v; want ErrCodeCompression", ga.ErrCode) + } +} + +// test that a server handler can read trailers from a client +func TestServerReadsTrailers(t *testing.T) { + const testBody = "some test body" + writeReq := func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader("trailer", "Foo, Bar", "trailer", "Baz"), + EndStream: false, + EndHeaders: true, + }) + st.writeData(1, false, []byte(testBody)) + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeaderRaw( + "foo", "foov", + "bar", "barv", + "baz", "bazv", + "surprise", "wasn't declared; shouldn't show up", + ), + EndStream: true, + EndHeaders: true, + }) + } + checkReq := func(r *http.Request) { + wantTrailer := http.Header{ + "Foo": nil, + "Bar": nil, + "Baz": nil, + } + if !reflect.DeepEqual(r.Trailer, wantTrailer) { + t.Errorf("initial Trailer = %v; want %v", r.Trailer, wantTrailer) + } + slurp, err := ioutil.ReadAll(r.Body) + if string(slurp) != testBody { + t.Errorf("read body %q; want %q", slurp, testBody) + } + if err != nil { + t.Fatalf("Body slurp: %v", err) + } + wantTrailerAfter := http.Header{ + "Foo": {"foov"}, + "Bar": {"barv"}, + "Baz": {"bazv"}, + } + if !reflect.DeepEqual(r.Trailer, wantTrailerAfter) { + t.Errorf("final Trailer = %v; want %v", r.Trailer, wantTrailerAfter) + } + } + testServerRequest(t, writeReq, checkReq) +} + +// test that a server handler can send trailers +func TestServerWritesTrailers_WithFlush(t *testing.T) { testServerWritesTrailers(t, true) } +func TestServerWritesTrailers_WithoutFlush(t *testing.T) { testServerWritesTrailers(t, false) } + +func testServerWritesTrailers(t *testing.T, withFlush bool) { + // See https://httpwg.github.io/specs/rfc7540.html#rfc.section.8.1.3 + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + w.Header().Set("Trailer", "Server-Trailer-A, Server-Trailer-B") + w.Header().Add("Trailer", "Server-Trailer-C") + w.Header().Add("Trailer", "Transfer-Encoding, Content-Length, Trailer") // filtered + + // Regular headers: + w.Header().Set("Foo", "Bar") + w.Header().Set("Content-Length", "5") // len("Hello") + + io.WriteString(w, "Hello") + if withFlush { + w.(http.Flusher).Flush() + } + w.Header().Set("Server-Trailer-A", "valuea") + w.Header().Set("Server-Trailer-C", "valuec") // skipping B + // After a flush, random keys like Server-Surprise shouldn't show up: + w.Header().Set("Server-Surpise", "surprise! this isn't predeclared!") + // But we do permit promoting keys to trailers after a + // flush if they start with the magic + // otherwise-invalid "Trailer:" prefix: + w.Header().Set("Trailer:Post-Header-Trailer", "hi1") + w.Header().Set("Trailer:post-header-trailer2", "hi2") + w.Header().Set("Trailer:Range", "invalid") + w.Header().Set("Trailer:Foo\x01Bogus", "invalid") + w.Header().Set("Transfer-Encoding", "should not be included; Forbidden by RFC 2616 14.40") + w.Header().Set("Content-Length", "should not be included; Forbidden by RFC 2616 14.40") + w.Header().Set("Trailer", "should not be included; Forbidden by RFC 2616 14.40") + return nil + }, func(st *serverTester) { + getSlash(st) + hf := st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("response HEADERS had END_STREAM") + } + if !hf.HeadersEnded() { + t.Fatal("response HEADERS didn't have END_HEADERS") + } + goth := st.decodeHeader(hf.HeaderBlockFragment()) + wanth := [][2]string{ + {":status", "200"}, + {"foo", "Bar"}, + {"trailer", "Server-Trailer-A, Server-Trailer-B"}, + {"trailer", "Server-Trailer-C"}, + {"trailer", "Transfer-Encoding, Content-Length, Trailer"}, + {"content-type", "text/plain; charset=utf-8"}, + {"content-length", "5"}, + } + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Header mismatch.\n got: %v\nwant: %v", goth, wanth) + } + df := st.wantData() + if string(df.Data()) != "Hello" { + t.Fatalf("Client read %q; want Hello", df.Data()) + } + if df.StreamEnded() { + t.Fatalf("data frame had STREAM_ENDED") + } + tf := st.wantHeaders() // for the trailers + if !tf.StreamEnded() { + t.Fatalf("trailers HEADERS lacked END_STREAM") + } + if !tf.HeadersEnded() { + t.Fatalf("trailers HEADERS lacked END_HEADERS") + } + wanth = [][2]string{ + {"post-header-trailer", "hi1"}, + {"post-header-trailer2", "hi2"}, + {"server-trailer-a", "valuea"}, + {"server-trailer-c", "valuec"}, + } + goth = st.decodeHeader(tf.HeaderBlockFragment()) + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Header mismatch.\n got: %v\nwant: %v", goth, wanth) + } + }) +} + +// validate transmitted header field names & values +// golang.org/issue/14048 +func TestServerDoesntWriteInvalidHeaders(t *testing.T) { + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + w.Header().Add("OK1", "x") + w.Header().Add("Bad:Colon", "x") // colon (non-token byte) in key + w.Header().Add("Bad1\x00", "x") // null in key + w.Header().Add("Bad2", "x\x00y") // null in value + return nil + }, func(st *serverTester) { + getSlash(st) + hf := st.wantHeaders() + if !hf.StreamEnded() { + t.Error("response HEADERS lacked END_STREAM") + } + if !hf.HeadersEnded() { + t.Fatal("response HEADERS didn't have END_HEADERS") + } + goth := st.decodeHeader(hf.HeaderBlockFragment()) + wanth := [][2]string{ + {":status", "200"}, + {"ok1", "x"}, + {"content-type", "text/plain; charset=utf-8"}, + {"content-length", "0"}, + } + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Header mismatch.\n got: %v\nwant: %v", goth, wanth) + } + }) +} + +func BenchmarkServerGets(b *testing.B) { + defer disableGoroutineTracking()() + b.ReportAllocs() + + const msg = "Hello, world" + st := newServerTester(b, func(w http.ResponseWriter, r *http.Request) { + io.WriteString(w, msg) + }) + defer st.Close() + st.greet() + + // Give the server quota to reply. (plus it has the the 64KB) + if err := st.fr.WriteWindowUpdate(0, uint32(b.N*len(msg))); err != nil { + b.Fatal(err) + } + + for i := 0; i < b.N; i++ { + id := 1 + uint32(i)*2 + st.writeHeaders(HeadersFrameParam{ + StreamID: id, + BlockFragment: st.encodeHeader(), + EndStream: true, + EndHeaders: true, + }) + st.wantHeaders() + df := st.wantData() + if !df.StreamEnded() { + b.Fatalf("DATA didn't have END_STREAM; got %v", df) + } + } +} + +func BenchmarkServerPosts(b *testing.B) { + defer disableGoroutineTracking()() + b.ReportAllocs() + + const msg = "Hello, world" + st := newServerTester(b, func(w http.ResponseWriter, r *http.Request) { + // Consume the (empty) body from th peer before replying, otherwise + // the server will sometimes (depending on scheduling) send the peer a + // a RST_STREAM with the CANCEL error code. + if n, err := io.Copy(ioutil.Discard, r.Body); n != 0 || err != nil { + b.Errorf("Copy error; got %v, %v; want 0, nil", n, err) + } + io.WriteString(w, msg) + }) + defer st.Close() + st.greet() + + // Give the server quota to reply. (plus it has the the 64KB) + if err := st.fr.WriteWindowUpdate(0, uint32(b.N*len(msg))); err != nil { + b.Fatal(err) + } + + for i := 0; i < b.N; i++ { + id := 1 + uint32(i)*2 + st.writeHeaders(HeadersFrameParam{ + StreamID: id, + BlockFragment: st.encodeHeader(":method", "POST"), + EndStream: false, + EndHeaders: true, + }) + st.writeData(id, true, nil) + st.wantHeaders() + df := st.wantData() + if !df.StreamEnded() { + b.Fatalf("DATA didn't have END_STREAM; got %v", df) + } + } +} + +// Send a stream of messages from server to client in separate data frames. +// Brings up performance issues seen in long streams. +// Created to show problem in go issue #18502 +func BenchmarkServerToClientStreamDefaultOptions(b *testing.B) { + benchmarkServerToClientStream(b) +} + +// Justification for Change-Id: Iad93420ef6c3918f54249d867098f1dadfa324d8 +// Expect to see memory/alloc reduction by opting in to Frame reuse with the Framer. +func BenchmarkServerToClientStreamReuseFrames(b *testing.B) { + benchmarkServerToClientStream(b, optFramerReuseFrames) +} + +func benchmarkServerToClientStream(b *testing.B, newServerOpts ...interface{}) { + defer disableGoroutineTracking()() + b.ReportAllocs() + const msgLen = 1 + // default window size + const windowSize = 1<<16 - 1 + + // next message to send from the server and for the client to expect + nextMsg := func(i int) []byte { + msg := make([]byte, msgLen) + msg[0] = byte(i) + if len(msg) != msgLen { + panic("invalid test setup msg length") + } + return msg + } + + st := newServerTester(b, func(w http.ResponseWriter, r *http.Request) { + // Consume the (empty) body from th peer before replying, otherwise + // the server will sometimes (depending on scheduling) send the peer a + // a RST_STREAM with the CANCEL error code. + if n, err := io.Copy(ioutil.Discard, r.Body); n != 0 || err != nil { + b.Errorf("Copy error; got %v, %v; want 0, nil", n, err) + } + for i := 0; i < b.N; i += 1 { + w.Write(nextMsg(i)) + w.(http.Flusher).Flush() + } + }, newServerOpts...) + defer st.Close() + st.greet() + + const id = uint32(1) + + st.writeHeaders(HeadersFrameParam{ + StreamID: id, + BlockFragment: st.encodeHeader(":method", "POST"), + EndStream: false, + EndHeaders: true, + }) + + st.writeData(id, true, nil) + st.wantHeaders() + + var pendingWindowUpdate = uint32(0) + + for i := 0; i < b.N; i += 1 { + expected := nextMsg(i) + df := st.wantData() + if bytes.Compare(expected, df.data) != 0 { + b.Fatalf("Bad message received; want %v; got %v", expected, df.data) + } + // try to send infrequent but large window updates so they don't overwhelm the test + pendingWindowUpdate += uint32(len(df.data)) + if pendingWindowUpdate >= windowSize/2 { + if err := st.fr.WriteWindowUpdate(0, pendingWindowUpdate); err != nil { + b.Fatal(err) + } + if err := st.fr.WriteWindowUpdate(id, pendingWindowUpdate); err != nil { + b.Fatal(err) + } + pendingWindowUpdate = 0 + } + } + df := st.wantData() + if !df.StreamEnded() { + b.Fatalf("DATA didn't have END_STREAM; got %v", df) + } +} + +// go-fuzz bug, originally reported at https://github.com/bradfitz/http2/issues/53 +// Verify we don't hang. +func TestIssue53(t *testing.T) { + const data = "PRI * HTTP/2.0\r\n\r\nSM" + + "\r\n\r\n\x00\x00\x00\x01\ainfinfin\ad" + s := &http.Server{ + ErrorLog: log.New(io.MultiWriter(stderrv(), twriter{t: t}), "", log.LstdFlags), + Handler: http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + w.Write([]byte("hello")) + }), + } + s2 := &Server{ + MaxReadFrameSize: 1 << 16, + PermitProhibitedCipherSuites: true, + } + c := &issue53Conn{[]byte(data), false, false} + s2.ServeConn(c, &ServeConnOpts{BaseConfig: s}) + if !c.closed { + t.Fatal("connection is not closed") + } +} + +type issue53Conn struct { + data []byte + closed bool + written bool +} + +func (c *issue53Conn) Read(b []byte) (n int, err error) { + if len(c.data) == 0 { + return 0, io.EOF + } + n = copy(b, c.data) + c.data = c.data[n:] + return +} + +func (c *issue53Conn) Write(b []byte) (n int, err error) { + c.written = true + return len(b), nil +} + +func (c *issue53Conn) Close() error { + c.closed = true + return nil +} + +func (c *issue53Conn) LocalAddr() net.Addr { + return &net.TCPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 49706} +} +func (c *issue53Conn) RemoteAddr() net.Addr { + return &net.TCPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 49706} +} +func (c *issue53Conn) SetDeadline(t time.Time) error { return nil } +func (c *issue53Conn) SetReadDeadline(t time.Time) error { return nil } +func (c *issue53Conn) SetWriteDeadline(t time.Time) error { return nil } + +// golang.org/issue/12895 +func TestConfigureServer(t *testing.T) { + tests := []struct { + name string + tlsConfig *tls.Config + wantErr string + }{ + { + name: "empty server", + }, + { + name: "just the required cipher suite", + tlsConfig: &tls.Config{ + CipherSuites: []uint16{tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256}, + }, + }, + { + name: "missing required cipher suite", + tlsConfig: &tls.Config{ + CipherSuites: []uint16{tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384}, + }, + wantErr: "is missing HTTP/2-required TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", + }, + { + name: "required after bad", + tlsConfig: &tls.Config{ + CipherSuites: []uint16{tls.TLS_RSA_WITH_RC4_128_SHA, tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256}, + }, + wantErr: "contains an HTTP/2-approved cipher suite (0xc02f), but it comes after", + }, + { + name: "bad after required", + tlsConfig: &tls.Config{ + CipherSuites: []uint16{tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, tls.TLS_RSA_WITH_RC4_128_SHA}, + }, + }, + } + for _, tt := range tests { + srv := &http.Server{TLSConfig: tt.tlsConfig} + err := ConfigureServer(srv, nil) + if (err != nil) != (tt.wantErr != "") { + if tt.wantErr != "" { + t.Errorf("%s: success, but want error", tt.name) + } else { + t.Errorf("%s: unexpected error: %v", tt.name, err) + } + } + if err != nil && tt.wantErr != "" && !strings.Contains(err.Error(), tt.wantErr) { + t.Errorf("%s: err = %v; want substring %q", tt.name, err, tt.wantErr) + } + if err == nil && !srv.TLSConfig.PreferServerCipherSuites { + t.Errorf("%s: PreferServerCipherSuite is false; want true", tt.name) + } + } +} + +func TestServerRejectHeadWithBody(t *testing.T) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + // No response body. + }) + defer st.Close() + st.greet() + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader(":method", "HEAD"), + EndStream: false, // what we're testing, a bogus HEAD request with body + EndHeaders: true, + }) + st.wantRSTStream(1, ErrCodeProtocol) +} + +func TestServerNoAutoContentLengthOnHead(t *testing.T) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + // No response body. (or smaller than one frame) + }) + defer st.Close() + st.greet() + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader(":method", "HEAD"), + EndStream: true, + EndHeaders: true, + }) + h := st.wantHeaders() + headers := st.decodeHeader(h.HeaderBlockFragment()) + want := [][2]string{ + {":status", "200"}, + {"content-type", "text/plain; charset=utf-8"}, + } + if !reflect.DeepEqual(headers, want) { + t.Errorf("Headers mismatch.\n got: %q\nwant: %q\n", headers, want) + } +} + +// golang.org/issue/13495 +func TestServerNoDuplicateContentType(t *testing.T) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + w.Header()["Content-Type"] = []string{""} + fmt.Fprintf(w, "hi") + }) + defer st.Close() + st.greet() + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeader(), + EndStream: true, + EndHeaders: true, + }) + h := st.wantHeaders() + headers := st.decodeHeader(h.HeaderBlockFragment()) + want := [][2]string{ + {":status", "200"}, + {"content-type", ""}, + {"content-length", "41"}, + } + if !reflect.DeepEqual(headers, want) { + t.Errorf("Headers mismatch.\n got: %q\nwant: %q\n", headers, want) + } +} + +func disableGoroutineTracking() (restore func()) { + old := DebugGoroutines + DebugGoroutines = false + return func() { DebugGoroutines = old } +} + +func BenchmarkServer_GetRequest(b *testing.B) { + defer disableGoroutineTracking()() + b.ReportAllocs() + const msg = "Hello, world." + st := newServerTester(b, func(w http.ResponseWriter, r *http.Request) { + n, err := io.Copy(ioutil.Discard, r.Body) + if err != nil || n > 0 { + b.Errorf("Read %d bytes, error %v; want 0 bytes.", n, err) + } + io.WriteString(w, msg) + }) + defer st.Close() + + st.greet() + // Give the server quota to reply. (plus it has the the 64KB) + if err := st.fr.WriteWindowUpdate(0, uint32(b.N*len(msg))); err != nil { + b.Fatal(err) + } + hbf := st.encodeHeader(":method", "GET") + for i := 0; i < b.N; i++ { + streamID := uint32(1 + 2*i) + st.writeHeaders(HeadersFrameParam{ + StreamID: streamID, + BlockFragment: hbf, + EndStream: true, + EndHeaders: true, + }) + st.wantHeaders() + st.wantData() + } +} + +func BenchmarkServer_PostRequest(b *testing.B) { + defer disableGoroutineTracking()() + b.ReportAllocs() + const msg = "Hello, world." + st := newServerTester(b, func(w http.ResponseWriter, r *http.Request) { + n, err := io.Copy(ioutil.Discard, r.Body) + if err != nil || n > 0 { + b.Errorf("Read %d bytes, error %v; want 0 bytes.", n, err) + } + io.WriteString(w, msg) + }) + defer st.Close() + st.greet() + // Give the server quota to reply. (plus it has the the 64KB) + if err := st.fr.WriteWindowUpdate(0, uint32(b.N*len(msg))); err != nil { + b.Fatal(err) + } + hbf := st.encodeHeader(":method", "POST") + for i := 0; i < b.N; i++ { + streamID := uint32(1 + 2*i) + st.writeHeaders(HeadersFrameParam{ + StreamID: streamID, + BlockFragment: hbf, + EndStream: false, + EndHeaders: true, + }) + st.writeData(streamID, true, nil) + st.wantHeaders() + st.wantData() + } +} + +type connStateConn struct { + net.Conn + cs tls.ConnectionState +} + +func (c connStateConn) ConnectionState() tls.ConnectionState { return c.cs } + +// golang.org/issue/12737 -- handle any net.Conn, not just +// *tls.Conn. +func TestServerHandleCustomConn(t *testing.T) { + var s Server + c1, c2 := net.Pipe() + clientDone := make(chan struct{}) + handlerDone := make(chan struct{}) + var req *http.Request + go func() { + defer close(clientDone) + defer c2.Close() + fr := NewFramer(c2, c2) + io.WriteString(c2, ClientPreface) + fr.WriteSettings() + fr.WriteSettingsAck() + f, err := fr.ReadFrame() + if err != nil { + t.Error(err) + return + } + if sf, ok := f.(*SettingsFrame); !ok || sf.IsAck() { + t.Errorf("Got %v; want non-ACK SettingsFrame", summarizeFrame(f)) + return + } + f, err = fr.ReadFrame() + if err != nil { + t.Error(err) + return + } + if sf, ok := f.(*SettingsFrame); !ok || !sf.IsAck() { + t.Errorf("Got %v; want ACK SettingsFrame", summarizeFrame(f)) + return + } + var henc hpackEncoder + fr.WriteHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: henc.encodeHeaderRaw(t, ":method", "GET", ":path", "/", ":scheme", "https", ":authority", "foo.com"), + EndStream: true, + EndHeaders: true, + }) + go io.Copy(ioutil.Discard, c2) + <-handlerDone + }() + const testString = "my custom ConnectionState" + fakeConnState := tls.ConnectionState{ + ServerName: testString, + Version: tls.VersionTLS12, + CipherSuite: cipher_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, + } + go s.ServeConn(connStateConn{c1, fakeConnState}, &ServeConnOpts{ + BaseConfig: &http.Server{ + Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + defer close(handlerDone) + req = r + }), + }}) + select { + case <-clientDone: + case <-time.After(5 * time.Second): + t.Fatal("timeout waiting for handler") + } + if req.TLS == nil { + t.Fatalf("Request.TLS is nil. Got: %#v", req) + } + if req.TLS.ServerName != testString { + t.Fatalf("Request.TLS = %+v; want ServerName of %q", req.TLS, testString) + } +} + +// golang.org/issue/14214 +func TestServer_Rejects_ConnHeaders(t *testing.T) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + t.Error("should not get to Handler") + }) + defer st.Close() + st.greet() + st.bodylessReq1("connection", "foo") + hf := st.wantHeaders() + goth := st.decodeHeader(hf.HeaderBlockFragment()) + wanth := [][2]string{ + {":status", "400"}, + {"content-type", "text/plain; charset=utf-8"}, + {"x-content-type-options", "nosniff"}, + {"content-length", "51"}, + } + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Got headers %v; want %v", goth, wanth) + } +} + +type hpackEncoder struct { + enc *hpack.Encoder + buf bytes.Buffer +} + +func (he *hpackEncoder) encodeHeaderRaw(t *testing.T, headers ...string) []byte { + if len(headers)%2 == 1 { + panic("odd number of kv args") + } + he.buf.Reset() + if he.enc == nil { + he.enc = hpack.NewEncoder(&he.buf) + } + for len(headers) > 0 { + k, v := headers[0], headers[1] + err := he.enc.WriteField(hpack.HeaderField{Name: k, Value: v}) + if err != nil { + t.Fatalf("HPACK encoding error for %q/%q: %v", k, v, err) + } + headers = headers[2:] + } + return he.buf.Bytes() +} + +func TestCheckValidHTTP2Request(t *testing.T) { + tests := []struct { + h http.Header + want error + }{ + { + h: http.Header{"Te": {"trailers"}}, + want: nil, + }, + { + h: http.Header{"Te": {"trailers", "bogus"}}, + want: errors.New(`request header "TE" may only be "trailers" in HTTP/2`), + }, + { + h: http.Header{"Foo": {""}}, + want: nil, + }, + { + h: http.Header{"Connection": {""}}, + want: errors.New(`request header "Connection" is not valid in HTTP/2`), + }, + { + h: http.Header{"Proxy-Connection": {""}}, + want: errors.New(`request header "Proxy-Connection" is not valid in HTTP/2`), + }, + { + h: http.Header{"Keep-Alive": {""}}, + want: errors.New(`request header "Keep-Alive" is not valid in HTTP/2`), + }, + { + h: http.Header{"Upgrade": {""}}, + want: errors.New(`request header "Upgrade" is not valid in HTTP/2`), + }, + } + for i, tt := range tests { + got := checkValidHTTP2RequestHeaders(tt.h) + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("%d. checkValidHTTP2Request = %v; want %v", i, got, tt.want) + } + } +} + +// golang.org/issue/14030 +func TestExpect100ContinueAfterHandlerWrites(t *testing.T) { + const msg = "Hello" + const msg2 = "World" + + doRead := make(chan bool, 1) + defer close(doRead) // fallback cleanup + + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + io.WriteString(w, msg) + w.(http.Flusher).Flush() + + // Do a read, which might force a 100-continue status to be sent. + <-doRead + r.Body.Read(make([]byte, 10)) + + io.WriteString(w, msg2) + + }, optOnlyServer) + defer st.Close() + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + + req, _ := http.NewRequest("POST", st.ts.URL, io.LimitReader(neverEnding('A'), 2<<20)) + req.Header.Set("Expect", "100-continue") + + res, err := tr.RoundTrip(req) + if err != nil { + t.Fatal(err) + } + defer res.Body.Close() + + buf := make([]byte, len(msg)) + if _, err := io.ReadFull(res.Body, buf); err != nil { + t.Fatal(err) + } + if string(buf) != msg { + t.Fatalf("msg = %q; want %q", buf, msg) + } + + doRead <- true + + if _, err := io.ReadFull(res.Body, buf); err != nil { + t.Fatal(err) + } + if string(buf) != msg2 { + t.Fatalf("second msg = %q; want %q", buf, msg2) + } +} + +type funcReader func([]byte) (n int, err error) + +func (f funcReader) Read(p []byte) (n int, err error) { return f(p) } + +// golang.org/issue/16481 -- return flow control when streams close with unread data. +// (The Server version of the bug. See also TestUnreadFlowControlReturned_Transport) +func TestUnreadFlowControlReturned_Server(t *testing.T) { + unblock := make(chan bool, 1) + defer close(unblock) + + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + // Don't read the 16KB request body. Wait until the client's + // done sending it and then return. This should cause the Server + // to then return those 16KB of flow control to the client. + <-unblock + }, optOnlyServer) + defer st.Close() + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + + // This previously hung on the 4th iteration. + for i := 0; i < 6; i++ { + body := io.MultiReader( + io.LimitReader(neverEnding('A'), 16<<10), + funcReader(func([]byte) (n int, err error) { + unblock <- true + return 0, io.EOF + }), + ) + req, _ := http.NewRequest("POST", st.ts.URL, body) + res, err := tr.RoundTrip(req) + if err != nil { + t.Fatal(err) + } + res.Body.Close() + } + +} + +func TestServerIdleTimeout(t *testing.T) { + if testing.Short() { + t.Skip("skipping in short mode") + } + + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + }, func(h2s *Server) { + h2s.IdleTimeout = 500 * time.Millisecond + }) + defer st.Close() + + st.greet() + ga := st.wantGoAway() + if ga.ErrCode != ErrCodeNo { + t.Errorf("GOAWAY error = %v; want ErrCodeNo", ga.ErrCode) + } +} + +func TestServerIdleTimeout_AfterRequest(t *testing.T) { + if testing.Short() { + t.Skip("skipping in short mode") + } + const timeout = 250 * time.Millisecond + + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + time.Sleep(timeout * 2) + }, func(h2s *Server) { + h2s.IdleTimeout = timeout + }) + defer st.Close() + + st.greet() + + // Send a request which takes twice the timeout. Verifies the + // idle timeout doesn't fire while we're in a request: + st.bodylessReq1() + st.wantHeaders() + + // But the idle timeout should be rearmed after the request + // is done: + ga := st.wantGoAway() + if ga.ErrCode != ErrCodeNo { + t.Errorf("GOAWAY error = %v; want ErrCodeNo", ga.ErrCode) + } +} + +// grpc-go closes the Request.Body currently with a Read. +// Verify that it doesn't race. +// See https://github.com/grpc/grpc-go/pull/938 +func TestRequestBodyReadCloseRace(t *testing.T) { + for i := 0; i < 100; i++ { + body := &requestBody{ + pipe: &pipe{ + b: new(bytes.Buffer), + }, + } + body.pipe.CloseWithError(io.EOF) + + done := make(chan bool, 1) + buf := make([]byte, 10) + go func() { + time.Sleep(1 * time.Millisecond) + body.Close() + done <- true + }() + body.Read(buf) + <-done + } +} + +func TestIssue20704Race(t *testing.T) { + if testing.Short() && os.Getenv("GO_BUILDER_NAME") == "" { + t.Skip("skipping in short mode") + } + const ( + itemSize = 1 << 10 + itemCount = 100 + ) + + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + for i := 0; i < itemCount; i++ { + _, err := w.Write(make([]byte, itemSize)) + if err != nil { + return + } + } + }, optOnlyServer) + defer st.Close() + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + cl := &http.Client{Transport: tr} + + for i := 0; i < 1000; i++ { + resp, err := cl.Get(st.ts.URL) + if err != nil { + t.Fatal(err) + } + // Force a RST stream to the server by closing without + // reading the body: + resp.Body.Close() + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/testdata/draft-ietf-httpbis-http2.xml b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/testdata/draft-ietf-httpbis-http2.xml new file mode 100644 index 0000000..31a84be --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/testdata/draft-ietf-httpbis-http2.xml @@ -0,0 +1,5021 @@ + + + + + + + + + + + + + + + + + + + Hypertext Transfer Protocol version 2 + + + Twist +
    + mbelshe@chromium.org +
    +
    + + + Google, Inc +
    + fenix@google.com +
    +
    + + + Mozilla +
    + + 331 E Evelyn Street + Mountain View + CA + 94041 + US + + martin.thomson@gmail.com +
    +
    + + + Applications + HTTPbis + HTTP + SPDY + Web + + + + This specification describes an optimized expression of the semantics of the Hypertext + Transfer Protocol (HTTP). HTTP/2 enables a more efficient use of network resources and a + reduced perception of latency by introducing header field compression and allowing multiple + concurrent messages on the same connection. It also introduces unsolicited push of + representations from servers to clients. + + + This specification is an alternative to, but does not obsolete, the HTTP/1.1 message syntax. + HTTP's existing semantics remain unchanged. + + + + + + Discussion of this draft takes place on the HTTPBIS working group mailing list + (ietf-http-wg@w3.org), which is archived at . + + + Working Group information can be found at ; that specific to HTTP/2 are at . + + + The changes in this draft are summarized in . + + + +
    + + +
    + + + The Hypertext Transfer Protocol (HTTP) is a wildly successful protocol. However, the + HTTP/1.1 message format () has + several characteristics that have a negative overall effect on application performance + today. + + + In particular, HTTP/1.0 allowed only one request to be outstanding at a time on a given + TCP connection. HTTP/1.1 added request pipelining, but this only partially addressed + request concurrency and still suffers from head-of-line blocking. Therefore, HTTP/1.1 + clients that need to make many requests typically use multiple connections to a server in + order to achieve concurrency and thereby reduce latency. + + + Furthermore, HTTP header fields are often repetitive and verbose, causing unnecessary + network traffic, as well as causing the initial TCP congestion + window to quickly fill. This can result in excessive latency when multiple requests are + made on a new TCP connection. + + + HTTP/2 addresses these issues by defining an optimized mapping of HTTP's semantics to an + underlying connection. Specifically, it allows interleaving of request and response + messages on the same connection and uses an efficient coding for HTTP header fields. It + also allows prioritization of requests, letting more important requests complete more + quickly, further improving performance. + + + The resulting protocol is more friendly to the network, because fewer TCP connections can + be used in comparison to HTTP/1.x. This means less competition with other flows, and + longer-lived connections, which in turn leads to better utilization of available network + capacity. + + + Finally, HTTP/2 also enables more efficient processing of messages through use of binary + message framing. + +
    + +
    + + HTTP/2 provides an optimized transport for HTTP semantics. HTTP/2 supports all of the core + features of HTTP/1.1, but aims to be more efficient in several ways. + + + The basic protocol unit in HTTP/2 is a frame. Each frame + type serves a different purpose. For example, HEADERS and + DATA frames form the basis of HTTP requests and + responses; other frame types like SETTINGS, + WINDOW_UPDATE, and PUSH_PROMISE are used in support of other + HTTP/2 features. + + + Multiplexing of requests is achieved by having each HTTP request-response exchange + associated with its own stream. Streams are largely + independent of each other, so a blocked or stalled request or response does not prevent + progress on other streams. + + + Flow control and prioritization ensure that it is possible to efficiently use multiplexed + streams. Flow control helps to ensure that only data that + can be used by a receiver is transmitted. Prioritization ensures that limited resources can be directed + to the most important streams first. + + + HTTP/2 adds a new interaction mode, whereby a server can push + responses to a client. Server push allows a server to speculatively send a client + data that the server anticipates the client will need, trading off some network usage + against a potential latency gain. The server does this by synthesizing a request, which it + sends as a PUSH_PROMISE frame. The server is then able to send a response to + the synthetic request on a separate stream. + + + Frames that contain HTTP header fields are compressed. + HTTP requests can be highly redundant, so compression can reduce the size of requests and + responses significantly. + + +
    + + The HTTP/2 specification is split into four parts: + + + Starting HTTP/2 covers how an HTTP/2 connection is + initiated. + + + The framing and streams layers describe the way HTTP/2 frames are + structured and formed into multiplexed streams. + + + Frame and error + definitions include details of the frame and error types used in HTTP/2. + + + HTTP mappings and additional + requirements describe how HTTP semantics are expressed using frames and + streams. + + + + + While some of the frame and stream layer concepts are isolated from HTTP, this + specification does not define a completely generic framing layer. The framing and streams + layers are tailored to the needs of the HTTP protocol and server push. + +
    + +
    + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD + NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as + described in RFC 2119. + + + All numeric values are in network byte order. Values are unsigned unless otherwise + indicated. Literal values are provided in decimal or hexadecimal as appropriate. + Hexadecimal literals are prefixed with 0x to distinguish them + from decimal literals. + + + The following terms are used: + + + The endpoint initiating the HTTP/2 connection. + + + A transport-layer connection between two endpoints. + + + An error that affects the entire HTTP/2 connection. + + + Either the client or server of the connection. + + + The smallest unit of communication within an HTTP/2 connection, consisting of a header + and a variable-length sequence of octets structured according to the frame type. + + + An endpoint. When discussing a particular endpoint, "peer" refers to the endpoint + that is remote to the primary subject of discussion. + + + An endpoint that is receiving frames. + + + An endpoint that is transmitting frames. + + + The endpoint which did not initiate the HTTP/2 connection. + + + A bi-directional flow of frames across a virtual channel within the HTTP/2 connection. + + + An error on the individual HTTP/2 stream. + + + + + Finally, the terms "gateway", "intermediary", "proxy", and "tunnel" are defined + in . + +
    +
    + +
    + + An HTTP/2 connection is an application layer protocol running on top of a TCP connection + (). The client is the TCP connection initiator. + + + HTTP/2 uses the same "http" and "https" URI schemes used by HTTP/1.1. HTTP/2 shares the same + default port numbers: 80 for "http" URIs and 443 for "https" URIs. As a result, + implementations processing requests for target resource URIs like http://example.org/foo or https://example.com/bar are required to first discover whether the + upstream server (the immediate peer to which the client wishes to establish a connection) + supports HTTP/2. + + + + The means by which support for HTTP/2 is determined is different for "http" and "https" + URIs. Discovery for "http" URIs is described in . Discovery + for "https" URIs is described in . + + +
    + + The protocol defined in this document has two identifiers. + + + + The string "h2" identifies the protocol where HTTP/2 uses TLS. This identifier is used in the TLS application layer protocol negotiation extension (ALPN) + field and any place that HTTP/2 over TLS is identified. + + + The "h2" string is serialized into an ALPN protocol identifier as the two octet + sequence: 0x68, 0x32. + + + + + The string "h2c" identifies the protocol where HTTP/2 is run over cleartext TCP. + This identifier is used in the HTTP/1.1 Upgrade header field and any place that + HTTP/2 over TCP is identified. + + + + + + Negotiating "h2" or "h2c" implies the use of the transport, security, framing and message + semantics described in this document. + + + RFC Editor's Note: please remove the remainder of this section prior to the + publication of a final version of this document. + + + Only implementations of the final, published RFC can identify themselves as "h2" or "h2c". + Until such an RFC exists, implementations MUST NOT identify themselves using these + strings. + + + Examples and text throughout the rest of this document use "h2" as a matter of + editorial convenience only. Implementations of draft versions MUST NOT identify using + this string. + + + Implementations of draft versions of the protocol MUST add the string "-" and the + corresponding draft number to the identifier. For example, draft-ietf-httpbis-http2-11 + over TLS is identified using the string "h2-11". + + + Non-compatible experiments that are based on these draft versions MUST append the string + "-" and an experiment name to the identifier. For example, an experimental implementation + of packet mood-based encoding based on draft-ietf-httpbis-http2-09 might identify itself + as "h2-09-emo". Note that any label MUST conform to the "token" syntax defined in + . Experimenters are + encouraged to coordinate their experiments on the ietf-http-wg@w3.org mailing list. + +
    + +
    + + A client that makes a request for an "http" URI without prior knowledge about support for + HTTP/2 uses the HTTP Upgrade mechanism (). The client makes an HTTP/1.1 request that includes an Upgrade + header field identifying HTTP/2 with the "h2c" token. The HTTP/1.1 request MUST include + exactly one HTTP2-Settings header field. + +
    + For example: + + +]]> +
    + + Requests that contain an entity body MUST be sent in their entirety before the client can + send HTTP/2 frames. This means that a large request entity can block the use of the + connection until it is completely sent. + + + If concurrency of an initial request with subsequent requests is important, an OPTIONS + request can be used to perform the upgrade to HTTP/2, at the cost of an additional + round-trip. + + + A server that does not support HTTP/2 can respond to the request as though the Upgrade + header field were absent: + +
    + +HTTP/1.1 200 OK +Content-Length: 243 +Content-Type: text/html + +... + +
    + + A server MUST ignore a "h2" token in an Upgrade header field. Presence of a token with + "h2" implies HTTP/2 over TLS, which is instead negotiated as described in . + + + A server that supports HTTP/2 can accept the upgrade with a 101 (Switching Protocols) + response. After the empty line that terminates the 101 response, the server can begin + sending HTTP/2 frames. These frames MUST include a response to the request that initiated + the Upgrade. + + +
    + + For example: + + +HTTP/1.1 101 Switching Protocols +Connection: Upgrade +Upgrade: h2c + +[ HTTP/2 connection ... + +
    + + The first HTTP/2 frame sent by the server is a SETTINGS frame () as the server connection preface (). Upon receiving the 101 response, the client sends a connection preface, which includes a + SETTINGS frame. + + + The HTTP/1.1 request that is sent prior to upgrade is assigned stream identifier 1 and is + assigned default priority values. Stream 1 is + implicitly half closed from the client toward the server, since the request is completed + as an HTTP/1.1 request. After commencing the HTTP/2 connection, stream 1 is used for the + response. + + +
    + + A request that upgrades from HTTP/1.1 to HTTP/2 MUST include exactly one HTTP2-Settings header field. The HTTP2-Settings header field is a connection-specific header field + that includes parameters that govern the HTTP/2 connection, provided in anticipation of + the server accepting the request to upgrade. + +
    + +
    + + A server MUST NOT upgrade the connection to HTTP/2 if this header field is not present, + or if more than one is present. A server MUST NOT send this header field. + + + + The content of the HTTP2-Settings header field is the + payload of a SETTINGS frame (), encoded as a + base64url string (that is, the URL- and filename-safe Base64 encoding described in , with any trailing '=' characters omitted). The + ABNF production for token68 is + defined in . + + + Since the upgrade is only intended to apply to the immediate connection, a client + sending HTTP2-Settings MUST also send HTTP2-Settings as a connection option in the Connection header field to prevent it from being forwarded + downstream. + + + A server decodes and interprets these values as it would any other + SETTINGS frame. Acknowledgement of the + SETTINGS parameters is not necessary, since a 101 response serves as implicit + acknowledgment. Providing these values in the Upgrade request gives a client an + opportunity to provide parameters prior to receiving any frames from the server. + +
    +
    + +
    + + A client that makes a request to an "https" URI uses TLS + with the application layer protocol negotiation extension. + + + HTTP/2 over TLS uses the "h2" application token. The "h2c" token MUST NOT be sent by a + client or selected by a server. + + + Once TLS negotiation is complete, both the client and the server send a connection preface. + +
    + +
    + + A client can learn that a particular server supports HTTP/2 by other means. For example, + describes a mechanism for advertising this capability. + + + A client MAY immediately send HTTP/2 frames to a server that is known to support HTTP/2, + after the connection preface; a server can + identify such a connection by the presence of the connection preface. This only affects + the establishment of HTTP/2 connections over cleartext TCP; implementations that support + HTTP/2 over TLS MUST use protocol negotiation in TLS. + + + Without additional information, prior support for HTTP/2 is not a strong signal that a + given server will support HTTP/2 for future connections. For example, it is possible for + server configurations to change, for configurations to differ between instances in + clustered servers, or for network conditions to change. + +
    + +
    + + Upon establishment of a TCP connection and determination that HTTP/2 will be used by both + peers, each endpoint MUST send a connection preface as a final confirmation and to + establish the initial SETTINGS parameters for the HTTP/2 connection. The client and + server each send a different connection preface. + + + The client connection preface starts with a sequence of 24 octets, which in hex notation + are: + +
    + +
    + + (the string PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n). This sequence + is followed by a SETTINGS frame (). The + SETTINGS frame MAY be empty. The client sends the client connection + preface immediately upon receipt of a 101 Switching Protocols response (indicating a + successful upgrade), or as the first application data octets of a TLS connection. If + starting an HTTP/2 connection with prior knowledge of server support for the protocol, the + client connection preface is sent upon connection establishment. + + + + + The client connection preface is selected so that a large proportion of HTTP/1.1 or + HTTP/1.0 servers and intermediaries do not attempt to process further frames. Note + that this does not address the concerns raised in . + + + + + The server connection preface consists of a potentially empty SETTINGS + frame () that MUST be the first frame the server sends in the + HTTP/2 connection. + + + The SETTINGS frames received from a peer as part of the connection preface + MUST be acknowledged (see ) after sending the connection + preface. + + + To avoid unnecessary latency, clients are permitted to send additional frames to the + server immediately after sending the client connection preface, without waiting to receive + the server connection preface. It is important to note, however, that the server + connection preface SETTINGS frame might include parameters that necessarily + alter how a client is expected to communicate with the server. Upon receiving the + SETTINGS frame, the client is expected to honor any parameters established. + In some configurations, it is possible for the server to transmit SETTINGS + before the client sends additional frames, providing an opportunity to avoid this issue. + + + Clients and servers MUST treat an invalid connection preface as a connection error of type + PROTOCOL_ERROR. A GOAWAY frame () + MAY be omitted in this case, since an invalid preface indicates that the peer is not using + HTTP/2. + +
    +
    + +
    + + Once the HTTP/2 connection is established, endpoints can begin exchanging frames. + + +
    + + All frames begin with a fixed 9-octet header followed by a variable-length payload. + +
    + +
    + + The fields of the frame header are defined as: + + + + The length of the frame payload expressed as an unsigned 24-bit integer. Values + greater than 214 (16,384) MUST NOT be sent unless the receiver has + set a larger value for SETTINGS_MAX_FRAME_SIZE. + + + The 9 octets of the frame header are not included in this value. + + + + + The 8-bit type of the frame. The frame type determines the format and semantics of + the frame. Implementations MUST ignore and discard any frame that has a type that + is unknown. + + + + + An 8-bit field reserved for frame-type specific boolean flags. + + + Flags are assigned semantics specific to the indicated frame type. Flags that have + no defined semantics for a particular frame type MUST be ignored, and MUST be left + unset (0) when sending. + + + + + A reserved 1-bit field. The semantics of this bit are undefined and the bit MUST + remain unset (0) when sending and MUST be ignored when receiving. + + + + + A 31-bit stream identifier (see ). The value 0 is + reserved for frames that are associated with the connection as a whole as opposed to + an individual stream. + + + + + + The structure and content of the frame payload is dependent entirely on the frame type. + +
    + +
    + + The size of a frame payload is limited by the maximum size that a receiver advertises in + the SETTINGS_MAX_FRAME_SIZE setting. This setting can have any value + between 214 (16,384) and 224-1 (16,777,215) octets, + inclusive. + + + All implementations MUST be capable of receiving and minimally processing frames up to + 214 octets in length, plus the 9 octet frame + header. The size of the frame header is not included when describing frame sizes. + + + Certain frame types, such as PING, impose additional limits + on the amount of payload data allowed. + + + + + If a frame size exceeds any defined limit, or is too small to contain mandatory frame + data, the endpoint MUST send a FRAME_SIZE_ERROR error. A frame size error + in a frame that could alter the state of the entire connection MUST be treated as a connection error; this includes any frame carrying + a header block (that is, HEADERS, + PUSH_PROMISE, and CONTINUATION), SETTINGS, + and any WINDOW_UPDATE frame with a stream identifier of 0. + + + Endpoints are not obligated to use all available space in a frame. Responsiveness can be + improved by using frames that are smaller than the permitted maximum size. Sending large + frames can result in delays in sending time-sensitive frames (such + RST_STREAM, WINDOW_UPDATE, or PRIORITY) + which if blocked by the transmission of a large frame, could affect performance. + +
    + +
    + + Just as in HTTP/1, a header field in HTTP/2 is a name with one or more associated values. + They are used within HTTP request and response messages as well as server push operations + (see ). + + + Header lists are collections of zero or more header fields. When transmitted over a + connection, a header list is serialized into a header block using HTTP Header Compression. The serialized header block is then + divided into one or more octet sequences, called header block fragments, and transmitted + within the payload of HEADERS, PUSH_PROMISE or CONTINUATION frames. + + + The Cookie header field is treated specially by the HTTP + mapping (see ). + + + A receiving endpoint reassembles the header block by concatenating its fragments, then + decompresses the block to reconstruct the header list. + + + A complete header block consists of either: + + + a single HEADERS or PUSH_PROMISE frame, + with the END_HEADERS flag set, or + + + a HEADERS or PUSH_PROMISE frame with the END_HEADERS + flag cleared and one or more CONTINUATION frames, + where the last CONTINUATION frame has the END_HEADERS flag set. + + + + + Header compression is stateful. One compression context and one decompression context is + used for the entire connection. Each header block is processed as a discrete unit. + Header blocks MUST be transmitted as a contiguous sequence of frames, with no interleaved + frames of any other type or from any other stream. The last frame in a sequence of + HEADERS or CONTINUATION frames MUST have the END_HEADERS + flag set. The last frame in a sequence of PUSH_PROMISE or + CONTINUATION frames MUST have the END_HEADERS flag set. This allows a + header block to be logically equivalent to a single frame. + + + Header block fragments can only be sent as the payload of HEADERS, + PUSH_PROMISE or CONTINUATION frames, because these frames + carry data that can modify the compression context maintained by a receiver. An endpoint + receiving HEADERS, PUSH_PROMISE or + CONTINUATION frames MUST reassemble header blocks and perform decompression + even if the frames are to be discarded. A receiver MUST terminate the connection with a + connection error of type + COMPRESSION_ERROR if it does not decompress a header block. + +
    +
    + +
    + + A "stream" is an independent, bi-directional sequence of frames exchanged between the client + and server within an HTTP/2 connection. Streams have several important characteristics: + + + A single HTTP/2 connection can contain multiple concurrently open streams, with either + endpoint interleaving frames from multiple streams. + + + Streams can be established and used unilaterally or shared by either the client or + server. + + + Streams can be closed by either endpoint. + + + The order in which frames are sent on a stream is significant. Recipients process frames + in the order they are received. In particular, the order of HEADERS, + and DATA frames is semantically significant. + + + Streams are identified by an integer. Stream identifiers are assigned to streams by the + endpoint initiating the stream. + + + + +
    + + The lifecycle of a stream is shown in . + + +
    + + | |<-----------' | + | R | closed | R | + `-------------------->| |<--------------------' + +--------+ + + H: HEADERS frame (with implied CONTINUATIONs) + PP: PUSH_PROMISE frame (with implied CONTINUATIONs) + ES: END_STREAM flag + R: RST_STREAM frame +]]> + +
    + + + Note that this diagram shows stream state transitions and the frames and flags that affect + those transitions only. In this regard, CONTINUATION frames do not result + in state transitions; they are effectively part of the HEADERS or + PUSH_PROMISE that they follow. For this purpose, the END_STREAM flag is + processed as a separate event to the frame that bears it; a HEADERS frame + with the END_STREAM flag set can cause two state transitions. + + + Both endpoints have a subjective view of the state of a stream that could be different + when frames are in transit. Endpoints do not coordinate the creation of streams; they are + created unilaterally by either endpoint. The negative consequences of a mismatch in + states are limited to the "closed" state after sending RST_STREAM, where + frames might be received for some time after closing. + + + Streams have the following states: + + + + + + All streams start in the "idle" state. In this state, no frames have been + exchanged. + + + The following transitions are valid from this state: + + + Sending or receiving a HEADERS frame causes the stream to become + "open". The stream identifier is selected as described in . The same HEADERS frame can also + cause a stream to immediately become "half closed". + + + Sending a PUSH_PROMISE frame marks the associated stream for + later use. The stream state for the reserved stream transitions to "reserved + (local)". + + + Receiving a PUSH_PROMISE frame marks the associated stream as + reserved by the remote peer. The state of the stream becomes "reserved + (remote)". + + + + + Receiving any frames other than HEADERS or + PUSH_PROMISE on a stream in this state MUST be treated as a connection error of type + PROTOCOL_ERROR. + + + + + + + A stream in the "reserved (local)" state is one that has been promised by sending a + PUSH_PROMISE frame. A PUSH_PROMISE frame reserves an + idle stream by associating the stream with an open stream that was initiated by the + remote peer (see ). + + + In this state, only the following transitions are possible: + + + The endpoint can send a HEADERS frame. This causes the stream to + open in a "half closed (remote)" state. + + + Either endpoint can send a RST_STREAM frame to cause the stream + to become "closed". This releases the stream reservation. + + + + + An endpoint MUST NOT send any type of frame other than HEADERS or + RST_STREAM in this state. + + + A PRIORITY frame MAY be received in this state. Receiving any type + of frame other than RST_STREAM or PRIORITY on a stream + in this state MUST be treated as a connection + error of type PROTOCOL_ERROR. + + + + + + + A stream in the "reserved (remote)" state has been reserved by a remote peer. + + + In this state, only the following transitions are possible: + + + Receiving a HEADERS frame causes the stream to transition to + "half closed (local)". + + + Either endpoint can send a RST_STREAM frame to cause the stream + to become "closed". This releases the stream reservation. + + + + + An endpoint MAY send a PRIORITY frame in this state to reprioritize + the reserved stream. An endpoint MUST NOT send any type of frame other than + RST_STREAM, WINDOW_UPDATE, or PRIORITY + in this state. + + + Receiving any type of frame other than HEADERS or + RST_STREAM on a stream in this state MUST be treated as a connection error of type + PROTOCOL_ERROR. + + + + + + + A stream in the "open" state may be used by both peers to send frames of any type. + In this state, sending peers observe advertised stream + level flow control limits. + + + From this state either endpoint can send a frame with an END_STREAM flag set, which + causes the stream to transition into one of the "half closed" states: an endpoint + sending an END_STREAM flag causes the stream state to become "half closed (local)"; + an endpoint receiving an END_STREAM flag causes the stream state to become "half + closed (remote)". + + + Either endpoint can send a RST_STREAM frame from this state, causing + it to transition immediately to "closed". + + + + + + + A stream that is in the "half closed (local)" state cannot be used for sending + frames. Only WINDOW_UPDATE, PRIORITY and + RST_STREAM frames can be sent in this state. + + + A stream transitions from this state to "closed" when a frame that contains an + END_STREAM flag is received, or when either peer sends a RST_STREAM + frame. + + + A receiver can ignore WINDOW_UPDATE frames in this state, which might + arrive for a short period after a frame bearing the END_STREAM flag is sent. + + + PRIORITY frames received in this state are used to reprioritize + streams that depend on the current stream. + + + + + + + A stream that is "half closed (remote)" is no longer being used by the peer to send + frames. In this state, an endpoint is no longer obligated to maintain a receiver + flow control window if it performs flow control. + + + If an endpoint receives additional frames for a stream that is in this state, other + than WINDOW_UPDATE, PRIORITY or + RST_STREAM, it MUST respond with a stream error of type + STREAM_CLOSED. + + + A stream that is "half closed (remote)" can be used by the endpoint to send frames + of any type. In this state, the endpoint continues to observe advertised stream level flow control limits. + + + A stream can transition from this state to "closed" by sending a frame that contains + an END_STREAM flag, or when either peer sends a RST_STREAM frame. + + + + + + + The "closed" state is the terminal state. + + + An endpoint MUST NOT send frames other than PRIORITY on a closed + stream. An endpoint that receives any frame other than PRIORITY + after receiving a RST_STREAM MUST treat that as a stream error of type + STREAM_CLOSED. Similarly, an endpoint that receives any frames after + receiving a frame with the END_STREAM flag set MUST treat that as a connection error of type + STREAM_CLOSED, unless the frame is permitted as described below. + + + WINDOW_UPDATE or RST_STREAM frames can be received in + this state for a short period after a DATA or HEADERS + frame containing an END_STREAM flag is sent. Until the remote peer receives and + processes RST_STREAM or the frame bearing the END_STREAM flag, it + might send frames of these types. Endpoints MUST ignore + WINDOW_UPDATE or RST_STREAM frames received in this + state, though endpoints MAY choose to treat frames that arrive a significant time + after sending END_STREAM as a connection + error of type PROTOCOL_ERROR. + + + PRIORITY frames can be sent on closed streams to prioritize streams + that are dependent on the closed stream. Endpoints SHOULD process + PRIORITY frame, though they can be ignored if the stream has been + removed from the dependency tree (see ). + + + If this state is reached as a result of sending a RST_STREAM frame, + the peer that receives the RST_STREAM might have already sent - or + enqueued for sending - frames on the stream that cannot be withdrawn. An endpoint + MUST ignore frames that it receives on closed streams after it has sent a + RST_STREAM frame. An endpoint MAY choose to limit the period over + which it ignores frames and treat frames that arrive after this time as being in + error. + + + Flow controlled frames (i.e., DATA) received after sending + RST_STREAM are counted toward the connection flow control window. + Even though these frames might be ignored, because they are sent before the sender + receives the RST_STREAM, the sender will consider the frames to count + against the flow control window. + + + An endpoint might receive a PUSH_PROMISE frame after it sends + RST_STREAM. PUSH_PROMISE causes a stream to become + "reserved" even if the associated stream has been reset. Therefore, a + RST_STREAM is needed to close an unwanted promised stream. + + + + + + In the absence of more specific guidance elsewhere in this document, implementations + SHOULD treat the receipt of a frame that is not expressly permitted in the description of + a state as a connection error of type + PROTOCOL_ERROR. Frame of unknown types are ignored. + + + An example of the state transitions for an HTTP request/response exchange can be found in + . An example of the state transitions for server push can be + found in and . + + +
    + + Streams are identified with an unsigned 31-bit integer. Streams initiated by a client + MUST use odd-numbered stream identifiers; those initiated by the server MUST use + even-numbered stream identifiers. A stream identifier of zero (0x0) is used for + connection control messages; the stream identifier zero cannot be used to establish a + new stream. + + + HTTP/1.1 requests that are upgraded to HTTP/2 (see ) are + responded to with a stream identifier of one (0x1). After the upgrade + completes, stream 0x1 is "half closed (local)" to the client. Therefore, stream 0x1 + cannot be selected as a new stream identifier by a client that upgrades from HTTP/1.1. + + + The identifier of a newly established stream MUST be numerically greater than all + streams that the initiating endpoint has opened or reserved. This governs streams that + are opened using a HEADERS frame and streams that are reserved using + PUSH_PROMISE. An endpoint that receives an unexpected stream identifier + MUST respond with a connection error of + type PROTOCOL_ERROR. + + + The first use of a new stream identifier implicitly closes all streams in the "idle" + state that might have been initiated by that peer with a lower-valued stream identifier. + For example, if a client sends a HEADERS frame on stream 7 without ever + sending a frame on stream 5, then stream 5 transitions to the "closed" state when the + first frame for stream 7 is sent or received. + + + Stream identifiers cannot be reused. Long-lived connections can result in an endpoint + exhausting the available range of stream identifiers. A client that is unable to + establish a new stream identifier can establish a new connection for new streams. A + server that is unable to establish a new stream identifier can send a + GOAWAY frame so that the client is forced to open a new connection for + new streams. + +
    + +
    + + A peer can limit the number of concurrently active streams using the + SETTINGS_MAX_CONCURRENT_STREAMS parameter (see ) within a SETTINGS frame. The maximum concurrent + streams setting is specific to each endpoint and applies only to the peer that receives + the setting. That is, clients specify the maximum number of concurrent streams the + server can initiate, and servers specify the maximum number of concurrent streams the + client can initiate. + + + Streams that are in the "open" state, or either of the "half closed" states count toward + the maximum number of streams that an endpoint is permitted to open. Streams in any of + these three states count toward the limit advertised in the + SETTINGS_MAX_CONCURRENT_STREAMS setting. Streams in either of the + "reserved" states do not count toward the stream limit. + + + Endpoints MUST NOT exceed the limit set by their peer. An endpoint that receives a + HEADERS frame that causes their advertised concurrent stream limit to be + exceeded MUST treat this as a stream error. An + endpoint that wishes to reduce the value of + SETTINGS_MAX_CONCURRENT_STREAMS to a value that is below the current + number of open streams can either close streams that exceed the new value or allow + streams to complete. + +
    +
    + +
    + + Using streams for multiplexing introduces contention over use of the TCP connection, + resulting in blocked streams. A flow control scheme ensures that streams on the same + connection do not destructively interfere with each other. Flow control is used for both + individual streams and for the connection as a whole. + + + HTTP/2 provides for flow control through use of the WINDOW_UPDATE frame. + + +
    + + HTTP/2 stream flow control aims to allow a variety of flow control algorithms to be + used without requiring protocol changes. Flow control in HTTP/2 has the following + characteristics: + + + Flow control is specific to a connection; i.e., it is "hop-by-hop", not + "end-to-end". + + + Flow control is based on window update frames. Receivers advertise how many octets + they are prepared to receive on a stream and for the entire connection. This is a + credit-based scheme. + + + Flow control is directional with overall control provided by the receiver. A + receiver MAY choose to set any window size that it desires for each stream and for + the entire connection. A sender MUST respect flow control limits imposed by a + receiver. Clients, servers and intermediaries all independently advertise their + flow control window as a receiver and abide by the flow control limits set by + their peer when sending. + + + The initial value for the flow control window is 65,535 octets for both new streams + and the overall connection. + + + The frame type determines whether flow control applies to a frame. Of the frames + specified in this document, only DATA frames are subject to flow + control; all other frame types do not consume space in the advertised flow control + window. This ensures that important control frames are not blocked by flow control. + + + Flow control cannot be disabled. + + + HTTP/2 defines only the format and semantics of the WINDOW_UPDATE + frame (). This document does not stipulate how a + receiver decides when to send this frame or the value that it sends, nor does it + specify how a sender chooses to send packets. Implementations are able to select + any algorithm that suits their needs. + + + + + Implementations are also responsible for managing how requests and responses are sent + based on priority; choosing how to avoid head of line blocking for requests; and + managing the creation of new streams. Algorithm choices for these could interact with + any flow control algorithm. + +
    + +
    + + Flow control is defined to protect endpoints that are operating under resource + constraints. For example, a proxy needs to share memory between many connections, and + also might have a slow upstream connection and a fast downstream one. Flow control + addresses cases where the receiver is unable process data on one stream, yet wants to + continue to process other streams in the same connection. + + + Deployments that do not require this capability can advertise a flow control window of + the maximum size, incrementing the available space when new data is received. This + effectively disables flow control for that receiver. Conversely, a sender is always + subject to the flow control window advertised by the receiver. + + + Deployments with constrained resources (for example, memory) can employ flow control to + limit the amount of memory a peer can consume. Note, however, that this can lead to + suboptimal use of available network resources if flow control is enabled without + knowledge of the bandwidth-delay product (see ). + + + Even with full awareness of the current bandwidth-delay product, implementation of flow + control can be difficult. When using flow control, the receiver MUST read from the TCP + receive buffer in a timely fashion. Failure to do so could lead to a deadlock when + critical frames, such as WINDOW_UPDATE, are not read and acted upon. + +
    +
    + +
    + + A client can assign a priority for a new stream by including prioritization information in + the HEADERS frame that opens the stream. For an existing + stream, the PRIORITY frame can be used to change the + priority. + + + The purpose of prioritization is to allow an endpoint to express how it would prefer its + peer allocate resources when managing concurrent streams. Most importantly, priority can + be used to select streams for transmitting frames when there is limited capacity for + sending. + + + Streams can be prioritized by marking them as dependent on the completion of other streams + (). Each dependency is assigned a relative weight, a number + that is used to determine the relative proportion of available resources that are assigned + to streams dependent on the same stream. + + + + Explicitly setting the priority for a stream is input to a prioritization process. It + does not guarantee any particular processing or transmission order for the stream relative + to any other stream. An endpoint cannot force a peer to process concurrent streams in a + particular order using priority. Expressing priority is therefore only ever a suggestion. + + + Providing prioritization information is optional, so default values are used if no + explicit indicator is provided (). + + +
    + + Each stream can be given an explicit dependency on another stream. Including a + dependency expresses a preference to allocate resources to the identified stream rather + than to the dependent stream. + + + A stream that is not dependent on any other stream is given a stream dependency of 0x0. + In other words, the non-existent stream 0 forms the root of the tree. + + + A stream that depends on another stream is a dependent stream. The stream upon which a + stream is dependent is a parent stream. A dependency on a stream that is not currently + in the tree - such as a stream in the "idle" state - results in that stream being given + a default priority. + + + When assigning a dependency on another stream, the stream is added as a new dependency + of the parent stream. Dependent streams that share the same parent are not ordered with + respect to each other. For example, if streams B and C are dependent on stream A, and + if stream D is created with a dependency on stream A, this results in a dependency order + of A followed by B, C, and D in any order. + +
    + /|\ + B C B D C +]]> +
    + + An exclusive flag allows for the insertion of a new level of dependencies. The + exclusive flag causes the stream to become the sole dependency of its parent stream, + causing other dependencies to become dependent on the exclusive stream. In the + previous example, if stream D is created with an exclusive dependency on stream A, this + results in D becoming the dependency parent of B and C. + +
    + D + B C / \ + B C +]]> +
    + + Inside the dependency tree, a dependent stream SHOULD only be allocated resources if all + of the streams that it depends on (the chain of parent streams up to 0x0) are either + closed, or it is not possible to make progress on them. + + + A stream cannot depend on itself. An endpoint MUST treat this as a stream error of type PROTOCOL_ERROR. + +
    + +
    + + All dependent streams are allocated an integer weight between 1 and 256 (inclusive). + + + Streams with the same parent SHOULD be allocated resources proportionally based on their + weight. Thus, if stream B depends on stream A with weight 4, and C depends on stream A + with weight 12, and if no progress can be made on A, stream B ideally receives one third + of the resources allocated to stream C. + +
    + +
    + + Stream priorities are changed using the PRIORITY frame. Setting a + dependency causes a stream to become dependent on the identified parent stream. + + + Dependent streams move with their parent stream if the parent is reprioritized. Setting + a dependency with the exclusive flag for a reprioritized stream moves all the + dependencies of the new parent stream to become dependent on the reprioritized stream. + + + If a stream is made dependent on one of its own dependencies, the formerly dependent + stream is first moved to be dependent on the reprioritized stream's previous parent. + The moved dependency retains its weight. + +
    + + For example, consider an original dependency tree where B and C depend on A, D and E + depend on C, and F depends on D. If A is made dependent on D, then D takes the place + of A. All other dependency relationships stay the same, except for F, which becomes + dependent on A if the reprioritization is exclusive. + + F B C ==> F A OR A + / \ | / \ /|\ + D E E B C B C F + | | | + F E E + (intermediate) (non-exclusive) (exclusive) +]]> +
    +
    + +
    + + When a stream is removed from the dependency tree, its dependencies can be moved to + become dependent on the parent of the closed stream. The weights of new dependencies + are recalculated by distributing the weight of the dependency of the closed stream + proportionally based on the weights of its dependencies. + + + Streams that are removed from the dependency tree cause some prioritization information + to be lost. Resources are shared between streams with the same parent stream, which + means that if a stream in that set closes or becomes blocked, any spare capacity + allocated to a stream is distributed to the immediate neighbors of the stream. However, + if the common dependency is removed from the tree, those streams share resources with + streams at the next highest level. + + + For example, assume streams A and B share a parent, and streams C and D both depend on + stream A. Prior to the removal of stream A, if streams A and D are unable to proceed, + then stream C receives all the resources dedicated to stream A. If stream A is removed + from the tree, the weight of stream A is divided between streams C and D. If stream D + is still unable to proceed, this results in stream C receiving a reduced proportion of + resources. For equal starting weights, C receives one third, rather than one half, of + available resources. + + + It is possible for a stream to become closed while prioritization information that + creates a dependency on that stream is in transit. If a stream identified in a + dependency has no associated priority information, then the dependent stream is instead + assigned a default priority. This potentially creates + suboptimal prioritization, since the stream could be given a priority that is different + to what is intended. + + + To avoid these problems, an endpoint SHOULD retain stream prioritization state for a + period after streams become closed. The longer state is retained, the lower the chance + that streams are assigned incorrect or default priority values. + + + This could create a large state burden for an endpoint, so this state MAY be limited. + An endpoint MAY apply a fixed upper limit on the number of closed streams for which + prioritization state is tracked to limit state exposure. The amount of additional state + an endpoint maintains could be dependent on load; under high load, prioritization state + can be discarded to limit resource commitments. In extreme cases, an endpoint could + even discard prioritization state for active or reserved streams. If a fixed limit is + applied, endpoints SHOULD maintain state for at least as many streams as allowed by + their setting for SETTINGS_MAX_CONCURRENT_STREAMS. + + + An endpoint receiving a PRIORITY frame that changes the priority of a + closed stream SHOULD alter the dependencies of the streams that depend on it, if it has + retained enough state to do so. + +
    + +
    + + Providing priority information is optional. Streams are assigned a non-exclusive + dependency on stream 0x0 by default. Pushed streams + initially depend on their associated stream. In both cases, streams are assigned a + default weight of 16. + +
    +
    + +
    + + HTTP/2 framing permits two classes of error: + + + An error condition that renders the entire connection unusable is a connection error. + + + An error in an individual stream is a stream error. + + + + + A list of error codes is included in . + + +
    + + A connection error is any error which prevents further processing of the framing layer, + or which corrupts any connection state. + + + An endpoint that encounters a connection error SHOULD first send a GOAWAY + frame () with the stream identifier of the last stream that it + successfully received from its peer. The GOAWAY frame includes an error + code that indicates why the connection is terminating. After sending the + GOAWAY frame, the endpoint MUST close the TCP connection. + + + It is possible that the GOAWAY will not be reliably received by the + receiving endpoint (see ). In the event of a connection error, + GOAWAY only provides a best effort attempt to communicate with the peer + about why the connection is being terminated. + + + An endpoint can end a connection at any time. In particular, an endpoint MAY choose to + treat a stream error as a connection error. Endpoints SHOULD send a + GOAWAY frame when ending a connection, providing that circumstances + permit it. + +
    + +
    + + A stream error is an error related to a specific stream that does not affect processing + of other streams. + + + An endpoint that detects a stream error sends a RST_STREAM frame () that contains the stream identifier of the stream where the error + occurred. The RST_STREAM frame includes an error code that indicates the + type of error. + + + A RST_STREAM is the last frame that an endpoint can send on a stream. + The peer that sends the RST_STREAM frame MUST be prepared to receive any + frames that were sent or enqueued for sending by the remote peer. These frames can be + ignored, except where they modify connection state (such as the state maintained for + header compression, or flow control). + + + Normally, an endpoint SHOULD NOT send more than one RST_STREAM frame for + any stream. However, an endpoint MAY send additional RST_STREAM frames if + it receives frames on a closed stream after more than a round-trip time. This behavior + is permitted to deal with misbehaving implementations. + + + An endpoint MUST NOT send a RST_STREAM in response to an + RST_STREAM frame, to avoid looping. + +
    + +
    + + If the TCP connection is closed or reset while streams remain in open or half closed + states, then the endpoint MUST assume that those streams were abnormally interrupted and + could be incomplete. + +
    +
    + +
    + + HTTP/2 permits extension of the protocol. Protocol extensions can be used to provide + additional services or alter any aspect of the protocol, within the limitations described + in this section. Extensions are effective only within the scope of a single HTTP/2 + connection. + + + Extensions are permitted to use new frame types, new + settings, or new error + codes. Registries are established for managing these extension points: frame types, settings and + error codes. + + + Implementations MUST ignore unknown or unsupported values in all extensible protocol + elements. Implementations MUST discard frames that have unknown or unsupported types. + This means that any of these extension points can be safely used by extensions without + prior arrangement or negotiation. However, extension frames that appear in the middle of + a header block are not permitted; these MUST be treated + as a connection error of type + PROTOCOL_ERROR. + + + However, extensions that could change the semantics of existing protocol components MUST + be negotiated before being used. For example, an extension that changes the layout of the + HEADERS frame cannot be used until the peer has given a positive signal + that this is acceptable. In this case, it could also be necessary to coordinate when the + revised layout comes into effect. Note that treating any frame other than + DATA frames as flow controlled is such a change in semantics, and can only + be done through negotiation. + + + This document doesn't mandate a specific method for negotiating the use of an extension, + but notes that a setting could be used for that + purpose. If both peers set a value that indicates willingness to use the extension, then + the extension can be used. If a setting is used for extension negotiation, the initial + value MUST be defined so that the extension is initially disabled. + +
    +
    + +
    + + This specification defines a number of frame types, each identified by a unique 8-bit type + code. Each frame type serves a distinct purpose either in the establishment and management + of the connection as a whole, or of individual streams. + + + The transmission of specific frame types can alter the state of a connection. If endpoints + fail to maintain a synchronized view of the connection state, successful communication + within the connection will no longer be possible. Therefore, it is important that endpoints + have a shared comprehension of how the state is affected by the use any given frame. + + +
    + + DATA frames (type=0x0) convey arbitrary, variable-length sequences of octets associated + with a stream. One or more DATA frames are used, for instance, to carry HTTP request or + response payloads. + + + DATA frames MAY also contain arbitrary padding. Padding can be added to DATA frames to + obscure the size of messages. + +
    + +
    + + The DATA frame contains the following fields: + + + An 8-bit field containing the length of the frame padding in units of octets. This + field is optional and is only present if the PADDED flag is set. + + + Application data. The amount of data is the remainder of the frame payload after + subtracting the length of the other fields that are present. + + + Padding octets that contain no application semantic value. Padding octets MUST be set + to zero when sending and ignored when receiving. + + + + + + The DATA frame defines the following flags: + + + Bit 1 being set indicates that this frame is the last that the endpoint will send for + the identified stream. Setting this flag causes the stream to enter one of the "half closed" states or the "closed" state. + + + Bit 4 being set indicates that the Pad Length field and any padding that it describes + is present. + + + + + DATA frames MUST be associated with a stream. If a DATA frame is received whose stream + identifier field is 0x0, the recipient MUST respond with a connection error of type + PROTOCOL_ERROR. + + + DATA frames are subject to flow control and can only be sent when a stream is in the + "open" or "half closed (remote)" states. The entire DATA frame payload is included in flow + control, including Pad Length and Padding fields if present. If a DATA frame is received + whose stream is not in "open" or "half closed (local)" state, the recipient MUST respond + with a stream error of type + STREAM_CLOSED. + + + The total number of padding octets is determined by the value of the Pad Length field. If + the length of the padding is greater than the length of the frame payload, the recipient + MUST treat this as a connection error of + type PROTOCOL_ERROR. + + + A frame can be increased in size by one octet by including a Pad Length field with a + value of zero. + + + + + Padding is a security feature; see . + +
    + +
    + + The HEADERS frame (type=0x1) is used to open a stream, + and additionally carries a header block fragment. HEADERS frames can be sent on a stream + in the "open" or "half closed (remote)" states. + +
    + +
    + + The HEADERS frame payload has the following fields: + + + An 8-bit field containing the length of the frame padding in units of octets. This + field is only present if the PADDED flag is set. + + + A single bit flag indicates that the stream dependency is exclusive, see . This field is only present if the PRIORITY flag is set. + + + A 31-bit stream identifier for the stream that this stream depends on, see . This field is only present if the PRIORITY flag is set. + + + An 8-bit weight for the stream, see . Add one to the + value to obtain a weight between 1 and 256. This field is only present if the + PRIORITY flag is set. + + + A header block fragment. + + + Padding octets that contain no application semantic value. Padding octets MUST be set + to zero when sending and ignored when receiving. + + + + + + The HEADERS frame defines the following flags: + + + + Bit 1 being set indicates that the header block is + the last that the endpoint will send for the identified stream. Setting this flag + causes the stream to enter one of "half closed" + states. + + + A HEADERS frame carries the END_STREAM flag that signals the end of a stream. + However, a HEADERS frame with the END_STREAM flag set can be followed by + CONTINUATION frames on the same stream. Logically, the + CONTINUATION frames are part of the HEADERS frame. + + + + + Bit 3 being set indicates that this frame contains an entire header block and is not followed by any + CONTINUATION frames. + + + A HEADERS frame without the END_HEADERS flag set MUST be followed by a + CONTINUATION frame for the same stream. A receiver MUST treat the + receipt of any other type of frame or a frame on a different stream as a connection error of type + PROTOCOL_ERROR. + + + + + Bit 4 being set indicates that the Pad Length field and any padding that it + describes is present. + + + + + Bit 6 being set indicates that the Exclusive Flag (E), Stream Dependency, and Weight + fields are present; see . + + + + + + + The payload of a HEADERS frame contains a header block + fragment. A header block that does not fit within a HEADERS frame is continued in + a CONTINUATION frame. + + + + HEADERS frames MUST be associated with a stream. If a HEADERS frame is received whose + stream identifier field is 0x0, the recipient MUST respond with a connection error of type + PROTOCOL_ERROR. + + + + The HEADERS frame changes the connection state as described in . + + + + The HEADERS frame includes optional padding. Padding fields and flags are identical to + those defined for DATA frames. + + + Prioritization information in a HEADERS frame is logically equivalent to a separate + PRIORITY frame, but inclusion in HEADERS avoids the potential for churn in + stream prioritization when new streams are created. Priorization fields in HEADERS frames + subsequent to the first on a stream reprioritize the + stream. + +
    + +
    + + The PRIORITY frame (type=0x2) specifies the sender-advised + priority of a stream. It can be sent at any time for an existing stream, including + closed streams. This enables reprioritization of existing streams. + +
    + +
    + + The payload of a PRIORITY frame contains the following fields: + + + A single bit flag indicates that the stream dependency is exclusive, see . + + + A 31-bit stream identifier for the stream that this stream depends on, see . + + + An 8-bit weight for the identified stream dependency, see . Add one to the value to obtain a weight between 1 and 256. + + + + + + The PRIORITY frame does not define any flags. + + + + The PRIORITY frame is associated with an existing stream. If a PRIORITY frame is received + with a stream identifier of 0x0, the recipient MUST respond with a connection error of type + PROTOCOL_ERROR. + + + The PRIORITY frame can be sent on a stream in any of the "reserved (remote)", "open", + "half closed (local)", "half closed (remote)", or "closed" states, though it cannot be + sent between consecutive frames that comprise a single header + block. Note that this frame could arrive after processing or frame sending has + completed, which would cause it to have no effect on the current stream. For a stream + that is in the "half closed (remote)" or "closed" - state, this frame can only affect + processing of the current stream and not frame transmission. + + + The PRIORITY frame is the only frame that can be sent for a stream in the "closed" state. + This allows for the reprioritization of a group of dependent streams by altering the + priority of a parent stream, which might be closed. However, a PRIORITY frame sent on a + closed stream risks being ignored due to the peer having discarded priority state + information for that stream. + +
    + +
    + + The RST_STREAM frame (type=0x3) allows for abnormal termination of a stream. When sent by + the initiator of a stream, it indicates that they wish to cancel the stream or that an + error condition has occurred. When sent by the receiver of a stream, it indicates that + either the receiver is rejecting the stream, requesting that the stream be cancelled, or + that an error condition has occurred. + +
    + +
    + + + The RST_STREAM frame contains a single unsigned, 32-bit integer identifying the error code. The error code indicates why the stream is being + terminated. + + + + The RST_STREAM frame does not define any flags. + + + + The RST_STREAM frame fully terminates the referenced stream and causes it to enter the + closed state. After receiving a RST_STREAM on a stream, the receiver MUST NOT send + additional frames for that stream, with the exception of PRIORITY. However, + after sending the RST_STREAM, the sending endpoint MUST be prepared to receive and process + additional frames sent on the stream that might have been sent by the peer prior to the + arrival of the RST_STREAM. + + + + RST_STREAM frames MUST be associated with a stream. If a RST_STREAM frame is received + with a stream identifier of 0x0, the recipient MUST treat this as a connection error of type + PROTOCOL_ERROR. + + + + RST_STREAM frames MUST NOT be sent for a stream in the "idle" state. If a RST_STREAM + frame identifying an idle stream is received, the recipient MUST treat this as a connection error of type + PROTOCOL_ERROR. + + +
    + +
    + + The SETTINGS frame (type=0x4) conveys configuration parameters that affect how endpoints + communicate, such as preferences and constraints on peer behavior. The SETTINGS frame is + also used to acknowledge the receipt of those parameters. Individually, a SETTINGS + parameter can also be referred to as a "setting". + + + SETTINGS parameters are not negotiated; they describe characteristics of the sending peer, + which are used by the receiving peer. Different values for the same parameter can be + advertised by each peer. For example, a client might set a high initial flow control + window, whereas a server might set a lower value to conserve resources. + + + + A SETTINGS frame MUST be sent by both endpoints at the start of a connection, and MAY be + sent at any other time by either endpoint over the lifetime of the connection. + Implementations MUST support all of the parameters defined by this specification. + + + + Each parameter in a SETTINGS frame replaces any existing value for that parameter. + Parameters are processed in the order in which they appear, and a receiver of a SETTINGS + frame does not need to maintain any state other than the current value of its + parameters. Therefore, the value of a SETTINGS parameter is the last value that is seen by + a receiver. + + + SETTINGS parameters are acknowledged by the receiving peer. To enable this, the SETTINGS + frame defines the following flag: + + + Bit 1 being set indicates that this frame acknowledges receipt and application of the + peer's SETTINGS frame. When this bit is set, the payload of the SETTINGS frame MUST + be empty. Receipt of a SETTINGS frame with the ACK flag set and a length field value + other than 0 MUST be treated as a connection + error of type FRAME_SIZE_ERROR. For more info, see Settings Synchronization. + + + + + SETTINGS frames always apply to a connection, never a single stream. The stream + identifier for a SETTINGS frame MUST be zero (0x0). If an endpoint receives a SETTINGS + frame whose stream identifier field is anything other than 0x0, the endpoint MUST respond + with a connection error of type + PROTOCOL_ERROR. + + + The SETTINGS frame affects connection state. A badly formed or incomplete SETTINGS frame + MUST be treated as a connection error of type + PROTOCOL_ERROR. + + +
    + + The payload of a SETTINGS frame consists of zero or more parameters, each consisting of + an unsigned 16-bit setting identifier and an unsigned 32-bit value. + + +
    + +
    +
    + +
    + + The following parameters are defined: + + + + Allows the sender to inform the remote endpoint of the maximum size of the header + compression table used to decode header blocks, in octets. The encoder can select + any size equal to or less than this value by using signaling specific to the + header compression format inside a header block. The initial value is 4,096 + octets. + + + + + This setting can be use to disable server + push. An endpoint MUST NOT send a PUSH_PROMISE frame if it + receives this parameter set to a value of 0. An endpoint that has both set this + parameter to 0 and had it acknowledged MUST treat the receipt of a + PUSH_PROMISE frame as a connection error of type + PROTOCOL_ERROR. + + + The initial value is 1, which indicates that server push is permitted. Any value + other than 0 or 1 MUST be treated as a connection error of type + PROTOCOL_ERROR. + + + + + Indicates the maximum number of concurrent streams that the sender will allow. + This limit is directional: it applies to the number of streams that the sender + permits the receiver to create. Initially there is no limit to this value. It is + recommended that this value be no smaller than 100, so as to not unnecessarily + limit parallelism. + + + A value of 0 for SETTINGS_MAX_CONCURRENT_STREAMS SHOULD NOT be treated as special + by endpoints. A zero value does prevent the creation of new streams, however this + can also happen for any limit that is exhausted with active streams. Servers + SHOULD only set a zero value for short durations; if a server does not wish to + accept requests, closing the connection could be preferable. + + + + + Indicates the sender's initial window size (in octets) for stream level flow + control. The initial value is 216-1 (65,535) octets. + + + This setting affects the window size of all streams, including existing streams, + see . + + + Values above the maximum flow control window size of 231-1 MUST + be treated as a connection error of + type FLOW_CONTROL_ERROR. + + + + + Indicates the size of the largest frame payload that the sender is willing to + receive, in octets. + + + The initial value is 214 (16,384) octets. The value advertised by + an endpoint MUST be between this initial value and the maximum allowed frame size + (224-1 or 16,777,215 octets), inclusive. Values outside this range + MUST be treated as a connection error + of type PROTOCOL_ERROR. + + + + + This advisory setting informs a peer of the maximum size of header list that the + sender is prepared to accept, in octets. The value is based on the uncompressed + size of header fields, including the length of the name and value in octets plus + an overhead of 32 octets for each header field. + + + For any given request, a lower limit than what is advertised MAY be enforced. The + initial value of this setting is unlimited. + + + + + + An endpoint that receives a SETTINGS frame with any unknown or unsupported identifier + MUST ignore that setting. + +
    + +
    + + Most values in SETTINGS benefit from or require an understanding of when the peer has + received and applied the changed parameter values. In order to provide + such synchronization timepoints, the recipient of a SETTINGS frame in which the ACK flag + is not set MUST apply the updated parameters as soon as possible upon receipt. + + + The values in the SETTINGS frame MUST be processed in the order they appear, with no + other frame processing between values. Unsupported parameters MUST be ignored. Once + all values have been processed, the recipient MUST immediately emit a SETTINGS frame + with the ACK flag set. Upon receiving a SETTINGS frame with the ACK flag set, the sender + of the altered parameters can rely on the setting having been applied. + + + If the sender of a SETTINGS frame does not receive an acknowledgement within a + reasonable amount of time, it MAY issue a connection error of type + SETTINGS_TIMEOUT. + +
    +
    + +
    + + The PUSH_PROMISE frame (type=0x5) is used to notify the peer endpoint in advance of + streams the sender intends to initiate. The PUSH_PROMISE frame includes the unsigned + 31-bit identifier of the stream the endpoint plans to create along with a set of headers + that provide additional context for the stream. contains a + thorough description of the use of PUSH_PROMISE frames. + + +
    + +
    + + The PUSH_PROMISE frame payload has the following fields: + + + An 8-bit field containing the length of the frame padding in units of octets. This + field is only present if the PADDED flag is set. + + + A single reserved bit. + + + An unsigned 31-bit integer that identifies the stream that is reserved by the + PUSH_PROMISE. The promised stream identifier MUST be a valid choice for the next + stream sent by the sender (see new stream + identifier). + + + A header block fragment containing request header + fields. + + + Padding octets. + + + + + + The PUSH_PROMISE frame defines the following flags: + + + + Bit 3 being set indicates that this frame contains an entire header block and is not followed by any + CONTINUATION frames. + + + A PUSH_PROMISE frame without the END_HEADERS flag set MUST be followed by a + CONTINUATION frame for the same stream. A receiver MUST treat the receipt of any + other type of frame or a frame on a different stream as a connection error of type + PROTOCOL_ERROR. + + + + + Bit 4 being set indicates that the Pad Length field and any padding that it + describes is present. + + + + + + + PUSH_PROMISE frames MUST be associated with an existing, peer-initiated stream. The stream + identifier of a PUSH_PROMISE frame indicates the stream it is associated with. If the + stream identifier field specifies the value 0x0, a recipient MUST respond with a connection error of type + PROTOCOL_ERROR. + + + + Promised streams are not required to be used in the order they are promised. The + PUSH_PROMISE only reserves stream identifiers for later use. + + + + PUSH_PROMISE MUST NOT be sent if the SETTINGS_ENABLE_PUSH setting of the + peer endpoint is set to 0. An endpoint that has set this setting and has received + acknowledgement MUST treat the receipt of a PUSH_PROMISE frame as a connection error of type + PROTOCOL_ERROR. + + + Recipients of PUSH_PROMISE frames can choose to reject promised streams by returning a + RST_STREAM referencing the promised stream identifier back to the sender of + the PUSH_PROMISE. + + + + A PUSH_PROMISE frame modifies the connection state in two ways. The inclusion of a header block potentially modifies the state maintained for + header compression. PUSH_PROMISE also reserves a stream for later use, causing the + promised stream to enter the "reserved" state. A sender MUST NOT send a PUSH_PROMISE on a + stream unless that stream is either "open" or "half closed (remote)"; the sender MUST + ensure that the promised stream is a valid choice for a new stream identifier (that is, the promised stream MUST + be in the "idle" state). + + + Since PUSH_PROMISE reserves a stream, ignoring a PUSH_PROMISE frame causes the stream + state to become indeterminate. A receiver MUST treat the receipt of a PUSH_PROMISE on a + stream that is neither "open" nor "half closed (local)" as a connection error of type + PROTOCOL_ERROR. However, an endpoint that has sent + RST_STREAM on the associated stream MUST handle PUSH_PROMISE frames that + might have been created before the RST_STREAM frame is received and + processed. + + + A receiver MUST treat the receipt of a PUSH_PROMISE that promises an illegal stream identifier (that is, an identifier for a + stream that is not currently in the "idle" state) as a connection error of type + PROTOCOL_ERROR. + + + + The PUSH_PROMISE frame includes optional padding. Padding fields and flags are identical + to those defined for DATA frames. + +
    + +
    + + The PING frame (type=0x6) is a mechanism for measuring a minimal round trip time from the + sender, as well as determining whether an idle connection is still functional. PING + frames can be sent from any endpoint. + +
    + +
    + + + In addition to the frame header, PING frames MUST contain 8 octets of data in the payload. + A sender can include any value it chooses and use those bytes in any fashion. + + + Receivers of a PING frame that does not include an ACK flag MUST send a PING frame with + the ACK flag set in response, with an identical payload. PING responses SHOULD be given + higher priority than any other frame. + + + + The PING frame defines the following flags: + + + Bit 1 being set indicates that this PING frame is a PING response. An endpoint MUST + set this flag in PING responses. An endpoint MUST NOT respond to PING frames + containing this flag. + + + + + PING frames are not associated with any individual stream. If a PING frame is received + with a stream identifier field value other than 0x0, the recipient MUST respond with a + connection error of type + PROTOCOL_ERROR. + + + Receipt of a PING frame with a length field value other than 8 MUST be treated as a connection error of type + FRAME_SIZE_ERROR. + + +
    + +
    + + The GOAWAY frame (type=0x7) informs the remote peer to stop creating streams on this + connection. GOAWAY can be sent by either the client or the server. Once sent, the sender + will ignore frames sent on any new streams with identifiers higher than the included last + stream identifier. Receivers of a GOAWAY frame MUST NOT open additional streams on the + connection, although a new connection can be established for new streams. + + + The purpose of this frame is to allow an endpoint to gracefully stop accepting new + streams, while still finishing processing of previously established streams. This enables + administrative actions, like server maintainance. + + + There is an inherent race condition between an endpoint starting new streams and the + remote sending a GOAWAY frame. To deal with this case, the GOAWAY contains the stream + identifier of the last peer-initiated stream which was or might be processed on the + sending endpoint in this connection. For instance, if the server sends a GOAWAY frame, + the identified stream is the highest numbered stream initiated by the client. + + + If the receiver of the GOAWAY has sent data on streams with a higher stream identifier + than what is indicated in the GOAWAY frame, those streams are not or will not be + processed. The receiver of the GOAWAY frame can treat the streams as though they had + never been created at all, thereby allowing those streams to be retried later on a new + connection. + + + Endpoints SHOULD always send a GOAWAY frame before closing a connection so that the remote + can know whether a stream has been partially processed or not. For example, if an HTTP + client sends a POST at the same time that a server closes a connection, the client cannot + know if the server started to process that POST request if the server does not send a + GOAWAY frame to indicate what streams it might have acted on. + + + An endpoint might choose to close a connection without sending GOAWAY for misbehaving + peers. + + +
    + +
    + + The GOAWAY frame does not define any flags. + + + The GOAWAY frame applies to the connection, not a specific stream. An endpoint MUST treat + a GOAWAY frame with a stream identifier other than 0x0 as a connection error of type + PROTOCOL_ERROR. + + + The last stream identifier in the GOAWAY frame contains the highest numbered stream + identifier for which the sender of the GOAWAY frame might have taken some action on, or + might yet take action on. All streams up to and including the identified stream might + have been processed in some way. The last stream identifier can be set to 0 if no streams + were processed. + + + In this context, "processed" means that some data from the stream was passed to some + higher layer of software that might have taken some action as a result. + + + If a connection terminates without a GOAWAY frame, the last stream identifier is + effectively the highest possible stream identifier. + + + On streams with lower or equal numbered identifiers that were not closed completely prior + to the connection being closed, re-attempting requests, transactions, or any protocol + activity is not possible, with the exception of idempotent actions like HTTP GET, PUT, or + DELETE. Any protocol activity that uses higher numbered streams can be safely retried + using a new connection. + + + Activity on streams numbered lower or equal to the last stream identifier might still + complete successfully. The sender of a GOAWAY frame might gracefully shut down a + connection by sending a GOAWAY frame, maintaining the connection in an open state until + all in-progress streams complete. + + + An endpoint MAY send multiple GOAWAY frames if circumstances change. For instance, an + endpoint that sends GOAWAY with NO_ERROR during graceful shutdown could + subsequently encounter an condition that requires immediate termination of the connection. + The last stream identifier from the last GOAWAY frame received indicates which streams + could have been acted upon. Endpoints MUST NOT increase the value they send in the last + stream identifier, since the peers might already have retried unprocessed requests on + another connection. + + + A client that is unable to retry requests loses all requests that are in flight when the + server closes the connection. This is especially true for intermediaries that might + not be serving clients using HTTP/2. A server that is attempting to gracefully shut down + a connection SHOULD send an initial GOAWAY frame with the last stream identifier set to + 231-1 and a NO_ERROR code. This signals to the client that + a shutdown is imminent and that no further requests can be initiated. After waiting at + least one round trip time, the server can send another GOAWAY frame with an updated last + stream identifier. This ensures that a connection can be cleanly shut down without losing + requests. + + + + After sending a GOAWAY frame, the sender can discard frames for streams with identifiers + higher than the identified last stream. However, any frames that alter connection state + cannot be completely ignored. For instance, HEADERS, + PUSH_PROMISE and CONTINUATION frames MUST be minimally + processed to ensure the state maintained for header compression is consistent (see ); similarly DATA frames MUST be counted toward the connection flow + control window. Failure to process these frames can cause flow control or header + compression state to become unsynchronized. + + + + The GOAWAY frame also contains a 32-bit error code that + contains the reason for closing the connection. + + + Endpoints MAY append opaque data to the payload of any GOAWAY frame. Additional debug + data is intended for diagnostic purposes only and carries no semantic value. Debug + information could contain security- or privacy-sensitive data. Logged or otherwise + persistently stored debug data MUST have adequate safeguards to prevent unauthorized + access. + +
    + +
    + + The WINDOW_UPDATE frame (type=0x8) is used to implement flow control; see for an overview. + + + Flow control operates at two levels: on each individual stream and on the entire + connection. + + + Both types of flow control are hop-by-hop; that is, only between the two endpoints. + Intermediaries do not forward WINDOW_UPDATE frames between dependent connections. + However, throttling of data transfer by any receiver can indirectly cause the propagation + of flow control information toward the original sender. + + + Flow control only applies to frames that are identified as being subject to flow control. + Of the frame types defined in this document, this includes only DATA frames. + Frames that are exempt from flow control MUST be accepted and processed, unless the + receiver is unable to assign resources to handling the frame. A receiver MAY respond with + a stream error or connection error of type + FLOW_CONTROL_ERROR if it is unable to accept a frame. + +
    + +
    + + The payload of a WINDOW_UPDATE frame is one reserved bit, plus an unsigned 31-bit integer + indicating the number of octets that the sender can transmit in addition to the existing + flow control window. The legal range for the increment to the flow control window is 1 to + 231-1 (0x7fffffff) octets. + + + The WINDOW_UPDATE frame does not define any flags. + + + The WINDOW_UPDATE frame can be specific to a stream or to the entire connection. In the + former case, the frame's stream identifier indicates the affected stream; in the latter, + the value "0" indicates that the entire connection is the subject of the frame. + + + A receiver MUST treat the receipt of a WINDOW_UPDATE frame with an flow control window + increment of 0 as a stream error of type + PROTOCOL_ERROR; errors on the connection flow control window MUST be + treated as a connection error. + + + WINDOW_UPDATE can be sent by a peer that has sent a frame bearing the END_STREAM flag. + This means that a receiver could receive a WINDOW_UPDATE frame on a "half closed (remote)" + or "closed" stream. A receiver MUST NOT treat this as an error, see . + + + A receiver that receives a flow controlled frame MUST always account for its contribution + against the connection flow control window, unless the receiver treats this as a connection error. This is necessary even if the + frame is in error. Since the sender counts the frame toward the flow control window, if + the receiver does not, the flow control window at sender and receiver can become + different. + + +
    + + Flow control in HTTP/2 is implemented using a window kept by each sender on every + stream. The flow control window is a simple integer value that indicates how many octets + of data the sender is permitted to transmit; as such, its size is a measure of the + buffering capacity of the receiver. + + + Two flow control windows are applicable: the stream flow control window and the + connection flow control window. The sender MUST NOT send a flow controlled frame with a + length that exceeds the space available in either of the flow control windows advertised + by the receiver. Frames with zero length with the END_STREAM flag set (that is, an + empty DATA frame) MAY be sent if there is no available space in either + flow control window. + + + For flow control calculations, the 9 octet frame header is not counted. + + + After sending a flow controlled frame, the sender reduces the space available in both + windows by the length of the transmitted frame. + + + The receiver of a frame sends a WINDOW_UPDATE frame as it consumes data and frees up + space in flow control windows. Separate WINDOW_UPDATE frames are sent for the stream + and connection level flow control windows. + + + A sender that receives a WINDOW_UPDATE frame updates the corresponding window by the + amount specified in the frame. + + + A sender MUST NOT allow a flow control window to exceed 231-1 octets. + If a sender receives a WINDOW_UPDATE that causes a flow control window to exceed this + maximum it MUST terminate either the stream or the connection, as appropriate. For + streams, the sender sends a RST_STREAM with the error code of + FLOW_CONTROL_ERROR code; for the connection, a GOAWAY + frame with a FLOW_CONTROL_ERROR code. + + + Flow controlled frames from the sender and WINDOW_UPDATE frames from the receiver are + completely asynchronous with respect to each other. This property allows a receiver to + aggressively update the window size kept by the sender to prevent streams from stalling. + +
    + +
    + + When an HTTP/2 connection is first established, new streams are created with an initial + flow control window size of 65,535 octets. The connection flow control window is 65,535 + octets. Both endpoints can adjust the initial window size for new streams by including + a value for SETTINGS_INITIAL_WINDOW_SIZE in the SETTINGS + frame that forms part of the connection preface. The connection flow control window can + only be changed using WINDOW_UPDATE frames. + + + Prior to receiving a SETTINGS frame that sets a value for + SETTINGS_INITIAL_WINDOW_SIZE, an endpoint can only use the default + initial window size when sending flow controlled frames. Similarly, the connection flow + control window is set to the default initial window size until a WINDOW_UPDATE frame is + received. + + + A SETTINGS frame can alter the initial flow control window size for all + current streams. When the value of SETTINGS_INITIAL_WINDOW_SIZE changes, + a receiver MUST adjust the size of all stream flow control windows that it maintains by + the difference between the new value and the old value. + + + A change to SETTINGS_INITIAL_WINDOW_SIZE can cause the available space in + a flow control window to become negative. A sender MUST track the negative flow control + window, and MUST NOT send new flow controlled frames until it receives WINDOW_UPDATE + frames that cause the flow control window to become positive. + + + For example, if the client sends 60KB immediately on connection establishment, and the + server sets the initial window size to be 16KB, the client will recalculate the + available flow control window to be -44KB on receipt of the SETTINGS + frame. The client retains a negative flow control window until WINDOW_UPDATE frames + restore the window to being positive, after which the client can resume sending. + + + A SETTINGS frame cannot alter the connection flow control window. + + + An endpoint MUST treat a change to SETTINGS_INITIAL_WINDOW_SIZE that + causes any flow control window to exceed the maximum size as a connection error of type + FLOW_CONTROL_ERROR. + +
    + +
    + + A receiver that wishes to use a smaller flow control window than the current size can + send a new SETTINGS frame. However, the receiver MUST be prepared to + receive data that exceeds this window size, since the sender might send data that + exceeds the lower limit prior to processing the SETTINGS frame. + + + After sending a SETTINGS frame that reduces the initial flow control window size, a + receiver has two options for handling streams that exceed flow control limits: + + + The receiver can immediately send RST_STREAM with + FLOW_CONTROL_ERROR error code for the affected streams. + + + The receiver can accept the streams and tolerate the resulting head of line + blocking, sending WINDOW_UPDATE frames as it consumes data. + + + +
    +
    + +
    + + The CONTINUATION frame (type=0x9) is used to continue a sequence of header block fragments. Any number of CONTINUATION frames can + be sent on an existing stream, as long as the preceding frame is on the same stream and is + a HEADERS, PUSH_PROMISE or CONTINUATION frame without the + END_HEADERS flag set. + + +
    + +
    + + The CONTINUATION frame payload contains a header block + fragment. + + + + The CONTINUATION frame defines the following flag: + + + + Bit 3 being set indicates that this frame ends a header + block. + + + If the END_HEADERS bit is not set, this frame MUST be followed by another + CONTINUATION frame. A receiver MUST treat the receipt of any other type of frame or + a frame on a different stream as a connection + error of type PROTOCOL_ERROR. + + + + + + + The CONTINUATION frame changes the connection state as defined in . + + + + CONTINUATION frames MUST be associated with a stream. If a CONTINUATION frame is received + whose stream identifier field is 0x0, the recipient MUST respond with a connection error of type PROTOCOL_ERROR. + + + + A CONTINUATION frame MUST be preceded by a HEADERS, + PUSH_PROMISE or CONTINUATION frame without the END_HEADERS flag set. A + recipient that observes violation of this rule MUST respond with a connection error of type + PROTOCOL_ERROR. + +
    +
    + +
    + + Error codes are 32-bit fields that are used in RST_STREAM and + GOAWAY frames to convey the reasons for the stream or connection error. + + + + Error codes share a common code space. Some error codes apply only to either streams or the + entire connection and have no defined semantics in the other context. + + + + The following error codes are defined: + + + The associated condition is not as a result of an error. For example, a + GOAWAY might include this code to indicate graceful shutdown of a + connection. + + + The endpoint detected an unspecific protocol error. This error is for use when a more + specific error code is not available. + + + The endpoint encountered an unexpected internal error. + + + The endpoint detected that its peer violated the flow control protocol. + + + The endpoint sent a SETTINGS frame, but did not receive a response in a + timely manner. See Settings Synchronization. + + + The endpoint received a frame after a stream was half closed. + + + The endpoint received a frame with an invalid size. + + + The endpoint refuses the stream prior to performing any application processing, see + for details. + + + Used by the endpoint to indicate that the stream is no longer needed. + + + The endpoint is unable to maintain the header compression context for the connection. + + + The connection established in response to a CONNECT + request was reset or abnormally closed. + + + The endpoint detected that its peer is exhibiting a behavior that might be generating + excessive load. + + + The underlying transport has properties that do not meet minimum security + requirements (see ). + + + + + Unknown or unsupported error codes MUST NOT trigger any special behavior. These MAY be + treated by an implementation as being equivalent to INTERNAL_ERROR. + +
    + +
    + + HTTP/2 is intended to be as compatible as possible with current uses of HTTP. This means + that, from the application perspective, the features of the protocol are largely + unchanged. To achieve this, all request and response semantics are preserved, although the + syntax of conveying those semantics has changed. + + + Thus, the specification and requirements of HTTP/1.1 Semantics and Content , Conditional Requests , Range Requests , Caching and Authentication are applicable to HTTP/2. Selected portions of HTTP/1.1 Message Syntax + and Routing , such as the HTTP and HTTPS URI schemes, are also + applicable in HTTP/2, but the expression of those semantics for this protocol are defined + in the sections below. + + +
    + + A client sends an HTTP request on a new stream, using a previously unused stream identifier. A server sends an HTTP response on + the same stream as the request. + + + An HTTP message (request or response) consists of: + + + for a response only, zero or more HEADERS frames (each followed by zero + or more CONTINUATION frames) containing the message headers of + informational (1xx) HTTP responses (see and ), + and + + + one HEADERS frame (followed by zero or more CONTINUATION + frames) containing the message headers (see ), and + + + zero or more DATA frames containing the message payload (see ), and + + + optionally, one HEADERS frame, followed by zero or more + CONTINUATION frames containing the trailer-part, if present (see ). + + + The last frame in the sequence bears an END_STREAM flag, noting that a + HEADERS frame bearing the END_STREAM flag can be followed by + CONTINUATION frames that carry any remaining portions of the header block. + + + Other frames (from any stream) MUST NOT occur between either HEADERS frame + and any CONTINUATION frames that might follow. + + + + Trailing header fields are carried in a header block that also terminates the stream. + That is, a sequence starting with a HEADERS frame, followed by zero or more + CONTINUATION frames, where the HEADERS frame bears an + END_STREAM flag. Header blocks after the first that do not terminate the stream are not + part of an HTTP request or response. + + + A HEADERS frame (and associated CONTINUATION frames) can + only appear at the start or end of a stream. An endpoint that receives a + HEADERS frame without the END_STREAM flag set after receiving a final + (non-informational) status code MUST treat the corresponding request or response as malformed. + + + + An HTTP request/response exchange fully consumes a single stream. A request starts with + the HEADERS frame that puts the stream into an "open" state. The request + ends with a frame bearing END_STREAM, which causes the stream to become "half closed + (local)" for the client and "half closed (remote)" for the server. A response starts with + a HEADERS frame and ends with a frame bearing END_STREAM, which places the + stream in the "closed" state. + + + +
    + + HTTP/2 removes support for the 101 (Switching Protocols) informational status code + (). + + + The semantics of 101 (Switching Protocols) aren't applicable to a multiplexed protocol. + Alternative protocols are able to use the same mechanisms that HTTP/2 uses to negotiate + their use (see ). + +
    + +
    + + HTTP header fields carry information as a series of key-value pairs. For a listing of + registered HTTP headers, see the Message Header Field Registry maintained at . + + +
    + + While HTTP/1.x used the message start-line (see ) to convey the target URI and method of the request, and the + status code for the response, HTTP/2 uses special pseudo-header fields beginning with + ':' character (ASCII 0x3a) for this purpose. + + + Pseudo-header fields are not HTTP header fields. Endpoints MUST NOT generate + pseudo-header fields other than those defined in this document. + + + Pseudo-header fields are only valid in the context in which they are defined. + Pseudo-header fields defined for requests MUST NOT appear in responses; pseudo-header + fields defined for responses MUST NOT appear in requests. Pseudo-header fields MUST + NOT appear in trailers. Endpoints MUST treat a request or response that contains + undefined or invalid pseudo-header fields as malformed. + + + Just as in HTTP/1.x, header field names are strings of ASCII characters that are + compared in a case-insensitive fashion. However, header field names MUST be converted + to lowercase prior to their encoding in HTTP/2. A request or response containing + uppercase header field names MUST be treated as malformed. + + + All pseudo-header fields MUST appear in the header block before regular header fields. + Any request or response that contains a pseudo-header field that appears in a header + block after a regular header field MUST be treated as malformed. + +
    + +
    + + HTTP/2 does not use the Connection header field to + indicate connection-specific header fields; in this protocol, connection-specific + metadata is conveyed by other means. An endpoint MUST NOT generate a HTTP/2 message + containing connection-specific header fields; any message containing + connection-specific header fields MUST be treated as malformed. + + + This means that an intermediary transforming an HTTP/1.x message to HTTP/2 will need + to remove any header fields nominated by the Connection header field, along with the + Connection header field itself. Such intermediaries SHOULD also remove other + connection-specific header fields, such as Keep-Alive, Proxy-Connection, + Transfer-Encoding and Upgrade, even if they are not nominated by Connection. + + + One exception to this is the TE header field, which MAY be present in an HTTP/2 + request, but when it is MUST NOT contain any value other than "trailers". + + + + + HTTP/2 purposefully does not support upgrade to another protocol. The handshake + methods described in are believed sufficient to + negotiate the use of alternative protocols. + + + +
    + +
    + + The following pseudo-header fields are defined for HTTP/2 requests: + + + + The :method pseudo-header field includes the HTTP + method (). + + + + + The :scheme pseudo-header field includes the scheme + portion of the target URI (). + + + :scheme is not restricted to http and https schemed URIs. A + proxy or gateway can translate requests for non-HTTP schemes, enabling the use + of HTTP to interact with non-HTTP services. + + + + + The :authority pseudo-header field includes the + authority portion of the target URI (). The authority MUST NOT include the deprecated userinfo subcomponent for http + or https schemed URIs. + + + To ensure that the HTTP/1.1 request line can be reproduced accurately, this + pseudo-header field MUST be omitted when translating from an HTTP/1.1 request + that has a request target in origin or asterisk form (see ). Clients that generate + HTTP/2 requests directly SHOULD use the :authority pseudo-header + field instead of the Host header field. An + intermediary that converts an HTTP/2 request to HTTP/1.1 MUST create a Host header field if one is not present in a request by + copying the value of the :authority pseudo-header + field. + + + + + The :path pseudo-header field includes the path and + query parts of the target URI (the path-absolute + production from and optionally a '?' character + followed by the query production, see and ). A request in asterisk form includes the value '*' for the + :path pseudo-header field. + + + This pseudo-header field MUST NOT be empty for http + or https URIs; http or + https URIs that do not contain a path component + MUST include a value of '/'. The exception to this rule is an OPTIONS request + for an http or https + URI that does not include a path component; these MUST include a :path pseudo-header field with a value of '*' (see ). + + + + + + All HTTP/2 requests MUST include exactly one valid value for the :method, :scheme, and :path pseudo-header fields, unless it is a CONNECT request. An HTTP request that omits mandatory + pseudo-header fields is malformed. + + + HTTP/2 does not define a way to carry the version identifier that is included in the + HTTP/1.1 request line. + +
    + +
    + + For HTTP/2 responses, a single :status pseudo-header + field is defined that carries the HTTP status code field (see ). This pseudo-header field MUST be included in all + responses, otherwise the response is malformed. + + + HTTP/2 does not define a way to carry the version or reason phrase that is included in + an HTTP/1.1 status line. + +
    + +
    + + The Cookie header field can carry a significant amount of + redundant data. + + + The Cookie header field uses a semi-colon (";") to delimit cookie-pairs (or "crumbs"). + This header field doesn't follow the list construction rules in HTTP (see ), which prevents cookie-pairs from + being separated into different name-value pairs. This can significantly reduce + compression efficiency as individual cookie-pairs are updated. + + + To allow for better compression efficiency, the Cookie header field MAY be split into + separate header fields, each with one or more cookie-pairs. If there are multiple + Cookie header fields after decompression, these MUST be concatenated into a single + octet string using the two octet delimiter of 0x3B, 0x20 (the ASCII string "; ") + before being passed into a non-HTTP/2 context, such as an HTTP/1.1 connection, or a + generic HTTP server application. + +
    + + Therefore, the following two lists of Cookie header fields are semantically + equivalent. + + +
    +
    + +
    + + A malformed request or response is one that is an otherwise valid sequence of HTTP/2 + frames, but is otherwise invalid due to the presence of extraneous frames, prohibited + header fields, the absence of mandatory header fields, or the inclusion of uppercase + header field names. + + + A request or response that includes an entity body can include a content-length header field. A request or response is also + malformed if the value of a content-length header field + does not equal the sum of the DATA frame payload lengths that form the + body. A response that is defined to have no payload, as described in , can have a non-zero + content-length header field, even though no content is + included in DATA frames. + + + Intermediaries that process HTTP requests or responses (i.e., any intermediary not + acting as a tunnel) MUST NOT forward a malformed request or response. Malformed + requests or responses that are detected MUST be treated as a stream error of type PROTOCOL_ERROR. + + + For malformed requests, a server MAY send an HTTP response prior to closing or + resetting the stream. Clients MUST NOT accept a malformed response. Note that these + requirements are intended to protect against several types of common attacks against + HTTP; they are deliberately strict, because being permissive can expose + implementations to these vulnerabilities. + +
    +
    + +
    + + This section shows HTTP/1.1 requests and responses, with illustrations of equivalent + HTTP/2 requests and responses. + + + An HTTP GET request includes request header fields and no body and is therefore + transmitted as a single HEADERS frame, followed by zero or more + CONTINUATION frames containing the serialized block of request header + fields. The HEADERS frame in the following has both the END_HEADERS and + END_STREAM flags set; no CONTINUATION frames are sent: + + +
    + + END_STREAM + Accept: image/jpeg + END_HEADERS + :method = GET + :scheme = https + :path = /resource + host = example.org + accept = image/jpeg +]]> +
    + + + Similarly, a response that includes only response header fields is transmitted as a + HEADERS frame (again, followed by zero or more + CONTINUATION frames) containing the serialized block of response header + fields. + + +
    + + END_STREAM + Expires: Thu, 23 Jan ... + END_HEADERS + :status = 304 + etag = "xyzzy" + expires = Thu, 23 Jan ... +]]> +
    + + + An HTTP POST request that includes request header fields and payload data is transmitted + as one HEADERS frame, followed by zero or more + CONTINUATION frames containing the request header fields, followed by one + or more DATA frames, with the last CONTINUATION (or + HEADERS) frame having the END_HEADERS flag set and the final + DATA frame having the END_STREAM flag set: + + +
    + - END_STREAM + Content-Type: image/jpeg - END_HEADERS + Content-Length: 123 :method = POST + :path = /resource + {binary data} :scheme = https + + CONTINUATION + + END_HEADERS + content-type = image/jpeg + host = example.org + content-length = 123 + + DATA + + END_STREAM + {binary data} +]]> + + Note that data contributing to any given header field could be spread between header + block fragments. The allocation of header fields to frames in this example is + illustrative only. + +
    + + + A response that includes header fields and payload data is transmitted as a + HEADERS frame, followed by zero or more CONTINUATION + frames, followed by one or more DATA frames, with the last + DATA frame in the sequence having the END_STREAM flag set: + + +
    + - END_STREAM + Content-Length: 123 + END_HEADERS + :status = 200 + {binary data} content-type = image/jpeg + content-length = 123 + + DATA + + END_STREAM + {binary data} +]]> +
    + + + Trailing header fields are sent as a header block after both the request or response + header block and all the DATA frames have been sent. The + HEADERS frame starting the trailers header block has the END_STREAM flag + set. + + +
    + - END_STREAM + Transfer-Encoding: chunked + END_HEADERS + Trailer: Foo :status = 200 + content-length = 123 + 123 content-type = image/jpeg + {binary data} trailer = Foo + 0 + Foo: bar DATA + - END_STREAM + {binary data} + + HEADERS + + END_STREAM + + END_HEADERS + foo = bar +]]> +
    + + +
    + + An informational response using a 1xx status code other than 101 is transmitted as a + HEADERS frame, followed by zero or more CONTINUATION + frames: + + - END_STREAM + + END_HEADERS + :status = 103 + extension-field = bar +]]> +
    +
    + +
    + + In HTTP/1.1, an HTTP client is unable to retry a non-idempotent request when an error + occurs, because there is no means to determine the nature of the error. It is possible + that some server processing occurred prior to the error, which could result in + undesirable effects if the request were reattempted. + + + HTTP/2 provides two mechanisms for providing a guarantee to a client that a request has + not been processed: + + + The GOAWAY frame indicates the highest stream number that might have + been processed. Requests on streams with higher numbers are therefore guaranteed to + be safe to retry. + + + The REFUSED_STREAM error code can be included in a + RST_STREAM frame to indicate that the stream is being closed prior to + any processing having occurred. Any request that was sent on the reset stream can + be safely retried. + + + + + Requests that have not been processed have not failed; clients MAY automatically retry + them, even those with non-idempotent methods. + + + A server MUST NOT indicate that a stream has not been processed unless it can guarantee + that fact. If frames that are on a stream are passed to the application layer for any + stream, then REFUSED_STREAM MUST NOT be used for that stream, and a + GOAWAY frame MUST include a stream identifier that is greater than or + equal to the given stream identifier. + + + In addition to these mechanisms, the PING frame provides a way for a + client to easily test a connection. Connections that remain idle can become broken as + some middleboxes (for instance, network address translators, or load balancers) silently + discard connection bindings. The PING frame allows a client to safely + test whether a connection is still active without sending a request. + +
    +
    + +
    + + HTTP/2 allows a server to pre-emptively send (or "push") responses (along with + corresponding "promised" requests) to a client in association with a previous + client-initiated request. This can be useful when the server knows the client will need + to have those responses available in order to fully process the response to the original + request. + + + + Pushing additional message exchanges in this fashion is optional, and is negotiated + between individual endpoints. The SETTINGS_ENABLE_PUSH setting can be set + to 0 to indicate that server push is disabled. + + + Promised requests MUST be cacheable (see ), MUST be safe (see ) and MUST NOT include a request body. Clients that receive a + promised request that is not cacheable, unsafe or that includes a request body MUST + reset the stream with a stream error of type + PROTOCOL_ERROR. + + + Pushed responses that are cacheable (see ) can be stored by the client, if it implements a HTTP + cache. Pushed responses are considered successfully validated on the origin server (e.g., + if the "no-cache" cache response directive is present) while the stream identified by the + promised stream ID is still open. + + + Pushed responses that are not cacheable MUST NOT be stored by any HTTP cache. They MAY + be made available to the application separately. + + + An intermediary can receive pushes from the server and choose not to forward them on to + the client. In other words, how to make use of the pushed information is up to that + intermediary. Equally, the intermediary might choose to make additional pushes to the + client, without any action taken by the server. + + + A client cannot push. Thus, servers MUST treat the receipt of a + PUSH_PROMISE frame as a connection + error of type PROTOCOL_ERROR. Clients MUST reject any attempt to + change the SETTINGS_ENABLE_PUSH setting to a value other than 0 by treating + the message as a connection error of type + PROTOCOL_ERROR. + + +
    + + Server push is semantically equivalent to a server responding to a request; however, in + this case that request is also sent by the server, as a PUSH_PROMISE + frame. + + + The PUSH_PROMISE frame includes a header block that contains a complete + set of request header fields that the server attributes to the request. It is not + possible to push a response to a request that includes a request body. + + + + Pushed responses are always associated with an explicit request from the client. The + PUSH_PROMISE frames sent by the server are sent on that explicit + request's stream. The PUSH_PROMISE frame also includes a promised stream + identifier, chosen from the stream identifiers available to the server (see ). + + + + The header fields in PUSH_PROMISE and any subsequent + CONTINUATION frames MUST be a valid and complete set of request header fields. The server MUST include a method in + the :method header field that is safe and cacheable. If a + client receives a PUSH_PROMISE that does not include a complete and valid + set of header fields, or the :method header field identifies + a method that is not safe, it MUST respond with a stream error of type PROTOCOL_ERROR. + + + + The server SHOULD send PUSH_PROMISE () + frames prior to sending any frames that reference the promised responses. This avoids a + race where clients issue requests prior to receiving any PUSH_PROMISE + frames. + + + For example, if the server receives a request for a document containing embedded links + to multiple image files, and the server chooses to push those additional images to the + client, sending push promises before the DATA frames that contain the + image links ensures that the client is able to see the promises before discovering + embedded links. Similarly, if the server pushes responses referenced by the header block + (for instance, in Link header fields), sending the push promises before sending the + header block ensures that clients do not request them. + + + + PUSH_PROMISE frames MUST NOT be sent by the client. + + + PUSH_PROMISE frames can be sent by the server in response to any + client-initiated stream, but the stream MUST be in either the "open" or "half closed + (remote)" state with respect to the server. PUSH_PROMISE frames are + interspersed with the frames that comprise a response, though they cannot be + interspersed with HEADERS and CONTINUATION frames that + comprise a single header block. + + + Sending a PUSH_PROMISE frame creates a new stream and puts the stream + into the “reserved (local)” state for the server and the “reserved (remote)” state for + the client. + +
    + +
    + + After sending the PUSH_PROMISE frame, the server can begin delivering the + pushed response as a response on a server-initiated + stream that uses the promised stream identifier. The server uses this stream to + transmit an HTTP response, using the same sequence of frames as defined in . This stream becomes "half closed" + to the client after the initial HEADERS frame is sent. + + + + Once a client receives a PUSH_PROMISE frame and chooses to accept the + pushed response, the client SHOULD NOT issue any requests for the promised response + until after the promised stream has closed. + + + + If the client determines, for any reason, that it does not wish to receive the pushed + response from the server, or if the server takes too long to begin sending the promised + response, the client can send an RST_STREAM frame, using either the + CANCEL or REFUSED_STREAM codes, and referencing the pushed + stream's identifier. + + + A client can use the SETTINGS_MAX_CONCURRENT_STREAMS setting to limit the + number of responses that can be concurrently pushed by a server. Advertising a + SETTINGS_MAX_CONCURRENT_STREAMS value of zero disables server push by + preventing the server from creating the necessary streams. This does not prohibit a + server from sending PUSH_PROMISE frames; clients need to reset any + promised streams that are not wanted. + + + + Clients receiving a pushed response MUST validate that either the server is + authoritative (see ), or the proxy that provided the pushed + response is configured for the corresponding request. For example, a server that offers + a certificate for only the example.com DNS-ID or Common Name + is not permitted to push a response for https://www.example.org/doc. + + + The response for a PUSH_PROMISE stream begins with a + HEADERS frame, which immediately puts the stream into the “half closed + (remote)” state for the server and “half closed (local)” state for the client, and ends + with a frame bearing END_STREAM, which places the stream in the "closed" state. + + + The client never sends a frame with the END_STREAM flag for a server push. + + + +
    + +
    + +
    + + In HTTP/1.x, the pseudo-method CONNECT () is used to convert an HTTP connection into a tunnel to a remote host. + CONNECT is primarily used with HTTP proxies to establish a TLS session with an origin + server for the purposes of interacting with https resources. + + + In HTTP/2, the CONNECT method is used to establish a tunnel over a single HTTP/2 stream to + a remote host, for similar purposes. The HTTP header field mapping works as defined in + Request Header Fields, with a few + differences. Specifically: + + + The :method header field is set to CONNECT. + + + The :scheme and :path header + fields MUST be omitted. + + + The :authority header field contains the host and port to + connect to (equivalent to the authority-form of the request-target of CONNECT + requests, see ). + + + + + A proxy that supports CONNECT establishes a TCP connection to + the server identified in the :authority header field. Once + this connection is successfully established, the proxy sends a HEADERS + frame containing a 2xx series status code to the client, as defined in . + + + After the initial HEADERS frame sent by each peer, all subsequent + DATA frames correspond to data sent on the TCP connection. The payload of + any DATA frames sent by the client is transmitted by the proxy to the TCP + server; data received from the TCP server is assembled into DATA frames by + the proxy. Frame types other than DATA or stream management frames + (RST_STREAM, WINDOW_UPDATE, and PRIORITY) + MUST NOT be sent on a connected stream, and MUST be treated as a stream error if received. + + + The TCP connection can be closed by either peer. The END_STREAM flag on a + DATA frame is treated as being equivalent to the TCP FIN bit. A client is + expected to send a DATA frame with the END_STREAM flag set after receiving + a frame bearing the END_STREAM flag. A proxy that receives a DATA frame + with the END_STREAM flag set sends the attached data with the FIN bit set on the last TCP + segment. A proxy that receives a TCP segment with the FIN bit set sends a + DATA frame with the END_STREAM flag set. Note that the final TCP segment + or DATA frame could be empty. + + + A TCP connection error is signaled with RST_STREAM. A proxy treats any + error in the TCP connection, which includes receiving a TCP segment with the RST bit set, + as a stream error of type + CONNECT_ERROR. Correspondingly, a proxy MUST send a TCP segment with the + RST bit set if it detects an error with the stream or the HTTP/2 connection. + +
    +
    + +
    + + This section outlines attributes of the HTTP protocol that improve interoperability, reduce + exposure to known security vulnerabilities, or reduce the potential for implementation + variation. + + +
    + + HTTP/2 connections are persistent. For best performance, it is expected clients will not + close connections until it is determined that no further communication with a server is + necessary (for example, when a user navigates away from a particular web page), or until + the server closes the connection. + + + Clients SHOULD NOT open more than one HTTP/2 connection to a given host and port pair, + where host is derived from a URI, a selected alternative + service, or a configured proxy. + + + A client can create additional connections as replacements, either to replace connections + that are near to exhausting the available stream + identifier space, to refresh the keying material for a TLS connection, or to + replace connections that have encountered errors. + + + A client MAY open multiple connections to the same IP address and TCP port using different + Server Name Indication values or to provide different TLS + client certificates, but SHOULD avoid creating multiple connections with the same + configuration. + + + Servers are encouraged to maintain open connections for as long as possible, but are + permitted to terminate idle connections if necessary. When either endpoint chooses to + close the transport-layer TCP connection, the terminating endpoint SHOULD first send a + GOAWAY () frame so that both endpoints can reliably + determine whether previously sent frames have been processed and gracefully complete or + terminate any necessary remaining tasks. + + +
    + + Connections that are made to an origin servers, either directly or through a tunnel + created using the CONNECT method MAY be reused for + requests with multiple different URI authority components. A connection can be reused + as long as the origin server is authoritative. For + http resources, this depends on the host having resolved to + the same IP address. + + + For https resources, connection reuse additionally depends + on having a certificate that is valid for the host in the URI. An origin server might + offer a certificate with multiple subjectAltName attributes, + or names with wildcards, one of which is valid for the authority in the URI. For + example, a certificate with a subjectAltName of *.example.com might permit the use of the same connection for + requests to URIs starting with https://a.example.com/ and + https://b.example.com/. + + + In some deployments, reusing a connection for multiple origins can result in requests + being directed to the wrong origin server. For example, TLS termination might be + performed by a middlebox that uses the TLS Server Name Indication + (SNI) extension to select an origin server. This means that it is possible + for clients to send confidential information to servers that might not be the intended + target for the request, even though the server is otherwise authoritative. + + + A server that does not wish clients to reuse connections can indicate that it is not + authoritative for a request by sending a 421 (Misdirected Request) status code in response + to the request (see ). + + + A client that is configured to use a proxy over HTTP/2 directs requests to that proxy + through a single connection. That is, all requests sent via a proxy reuse the + connection to the proxy. + +
    + +
    + + The 421 (Misdirected Request) status code indicates that the request was directed at a + server that is not able to produce a response. This can be sent by a server that is not + configured to produce responses for the combination of scheme and authority that are + included in the request URI. + + + Clients receiving a 421 (Misdirected Request) response from a server MAY retry the + request - whether the request method is idempotent or not - over a different connection. + This is possible if a connection is reused () or if an alternative + service is selected (). + + + This status code MUST NOT be generated by proxies. + + + A 421 response is cacheable by default; i.e., unless otherwise indicated by the method + definition or explicit cache controls (see ). + +
    +
    + +
    + + Implementations of HTTP/2 MUST support TLS 1.2 for HTTP/2 over + TLS. The general TLS usage guidance in SHOULD be followed, with + some additional restrictions that are specific to HTTP/2. + + + + An implementation of HTTP/2 over TLS MUST use TLS 1.2 or higher with the restrictions on + feature set and cipher suite described in this section. Due to implementation + limitations, it might not be possible to fail TLS negotiation. An endpoint MUST + immediately terminate an HTTP/2 connection that does not meet these minimum requirements + with a connection error of type + INADEQUATE_SECURITY. + + +
    + + The TLS implementation MUST support the Server Name Indication + (SNI) extension to TLS. HTTP/2 clients MUST indicate the target domain name when + negotiating TLS. + + + The TLS implementation MUST disable compression. TLS compression can lead to the + exposure of information that would not otherwise be revealed . + Generic compression is unnecessary since HTTP/2 provides compression features that are + more aware of context and therefore likely to be more appropriate for use for + performance, security or other reasons. + + + The TLS implementation MUST disable renegotiation. An endpoint MUST treat a TLS + renegotiation as a connection error of type + PROTOCOL_ERROR. Note that disabling renegotiation can result in + long-lived connections becoming unusable due to limits on the number of messages the + underlying cipher suite can encipher. + + + A client MAY use renegotiation to provide confidentiality protection for client + credentials offered in the handshake, but any renegotiation MUST occur prior to sending + the connection preface. A server SHOULD request a client certificate if it sees a + renegotiation request immediately after establishing a connection. + + + This effectively prevents the use of renegotiation in response to a request for a + specific protected resource. A future specification might provide a way to support this + use case. + +
    + +
    + + The set of TLS cipher suites that are permitted in HTTP/2 is restricted. HTTP/2 MUST + only be used with cipher suites that have ephemeral key exchange, such as the ephemeral Diffie-Hellman (DHE) or the elliptic curve variant (ECDHE). Ephemeral key exchange MUST + have a minimum size of 2048 bits for DHE or security level of 128 bits for ECDHE. + Clients MUST accept DHE sizes of up to 4096 bits. HTTP MUST NOT be used with cipher + suites that use stream or block ciphers. Authenticated Encryption with Additional Data + (AEAD) modes, such as the Galois Counter Model (GCM) mode for + AES are acceptable. + + + The effect of these restrictions is that TLS 1.2 implementations could have + non-intersecting sets of available cipher suites, since these prevent the use of the + cipher suite that TLS 1.2 makes mandatory. To avoid this problem, implementations of + HTTP/2 that use TLS 1.2 MUST support TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 with P256 . + + + Clients MAY advertise support of cipher suites that are prohibited by the above + restrictions in order to allow for connection to servers that do not support HTTP/2. + This enables a fallback to protocols without these constraints without the additional + latency imposed by using a separate connection for fallback. + +
    +
    +
    + +
    +
    + + HTTP/2 relies on the HTTP/1.1 definition of authority for determining whether a server is + authoritative in providing a given response, see . This relies on local name resolution for the "http" + URI scheme, and the authenticated server identity for the "https" scheme (see ). + +
    + +
    + + In a cross-protocol attack, an attacker causes a client to initiate a transaction in one + protocol toward a server that understands a different protocol. An attacker might be able + to cause the transaction to appear as valid transaction in the second protocol. In + combination with the capabilities of the web context, this can be used to interact with + poorly protected servers in private networks. + + + Completing a TLS handshake with an ALPN identifier for HTTP/2 can be considered sufficient + protection against cross protocol attacks. ALPN provides a positive indication that a + server is willing to proceed with HTTP/2, which prevents attacks on other TLS-based + protocols. + + + The encryption in TLS makes it difficult for attackers to control the data which could be + used in a cross-protocol attack on a cleartext protocol. + + + The cleartext version of HTTP/2 has minimal protection against cross-protocol attacks. + The connection preface contains a string that is + designed to confuse HTTP/1.1 servers, but no special protection is offered for other + protocols. A server that is willing to ignore parts of an HTTP/1.1 request containing an + Upgrade header field in addition to the client connection preface could be exposed to a + cross-protocol attack. + +
    + +
    + + HTTP/2 header field names and values are encoded as sequences of octets with a length + prefix. This enables HTTP/2 to carry any string of octets as the name or value of a + header field. An intermediary that translates HTTP/2 requests or responses into HTTP/1.1 + directly could permit the creation of corrupted HTTP/1.1 messages. An attacker might + exploit this behavior to cause the intermediary to create HTTP/1.1 messages with illegal + header fields, extra header fields, or even new messages that are entirely falsified. + + + Header field names or values that contain characters not permitted by HTTP/1.1, including + carriage return (ASCII 0xd) or line feed (ASCII 0xa) MUST NOT be translated verbatim by an + intermediary, as stipulated in . + + + Translation from HTTP/1.x to HTTP/2 does not produce the same opportunity to an attacker. + Intermediaries that perform translation to HTTP/2 MUST remove any instances of the obs-fold production from header field values. + +
    + +
    + + Pushed responses do not have an explicit request from the client; the request + is provided by the server in the PUSH_PROMISE frame. + + + Caching responses that are pushed is possible based on the guidance provided by the origin + server in the Cache-Control header field. However, this can cause issues if a single + server hosts more than one tenant. For example, a server might offer multiple users each + a small portion of its URI space. + + + Where multiple tenants share space on the same server, that server MUST ensure that + tenants are not able to push representations of resources that they do not have authority + over. Failure to enforce this would allow a tenant to provide a representation that would + be served out of cache, overriding the actual representation that the authoritative tenant + provides. + + + Pushed responses for which an origin server is not authoritative (see + ) are never cached or used. + +
    + +
    + + An HTTP/2 connection can demand a greater commitment of resources to operate than a + HTTP/1.1 connection. The use of header compression and flow control depend on a + commitment of resources for storing a greater amount of state. Settings for these + features ensure that memory commitments for these features are strictly bounded. + + + The number of PUSH_PROMISE frames is not constrained in the same fashion. + A client that accepts server push SHOULD limit the number of streams it allows to be in + the "reserved (remote)" state. Excessive number of server push streams can be treated as + a stream error of type + ENHANCE_YOUR_CALM. + + + Processing capacity cannot be guarded as effectively as state capacity. + + + The SETTINGS frame can be abused to cause a peer to expend additional + processing time. This might be done by pointlessly changing SETTINGS parameters, setting + multiple undefined parameters, or changing the same setting multiple times in the same + frame. WINDOW_UPDATE or PRIORITY frames can be abused to + cause an unnecessary waste of resources. + + + Large numbers of small or empty frames can be abused to cause a peer to expend time + processing frame headers. Note however that some uses are entirely legitimate, such as + the sending of an empty DATA frame to end a stream. + + + Header compression also offers some opportunities to waste processing resources; see for more details on potential abuses. + + + Limits in SETTINGS parameters cannot be reduced instantaneously, which + leaves an endpoint exposed to behavior from a peer that could exceed the new limits. In + particular, immediately after establishing a connection, limits set by a server are not + known to clients and could be exceeded without being an obvious protocol violation. + + + All these features - i.e., SETTINGS changes, small frames, header + compression - have legitimate uses. These features become a burden only when they are + used unnecessarily or to excess. + + + An endpoint that doesn't monitor this behavior exposes itself to a risk of denial of + service attack. Implementations SHOULD track the use of these features and set limits on + their use. An endpoint MAY treat activity that is suspicious as a connection error of type + ENHANCE_YOUR_CALM. + + +
    + + A large header block can cause an implementation to + commit a large amount of state. Header fields that are critical for routing can appear + toward the end of a header block, which prevents streaming of header fields to their + ultimate destination. For this an other reasons, such as ensuring cache correctness, + means that an endpoint might need to buffer the entire header block. Since there is no + hard limit to the size of a header block, some endpoints could be forced commit a large + amount of available memory for header fields. + + + An endpoint can use the SETTINGS_MAX_HEADER_LIST_SIZE to advise peers of + limits that might apply on the size of header blocks. This setting is only advisory, so + endpoints MAY choose to send header blocks that exceed this limit and risk having the + request or response being treated as malformed. This setting specific to a connection, + so any request or response could encounter a hop with a lower, unknown limit. An + intermediary can attempt to avoid this problem by passing on values presented by + different peers, but they are not obligated to do so. + + + A server that receives a larger header block than it is willing to handle can send an + HTTP 431 (Request Header Fields Too Large) status code . A + client can discard responses that it cannot process. The header block MUST be processed + to ensure a consistent connection state, unless the connection is closed. + +
    +
    + +
    + + HTTP/2 enables greater use of compression for both header fields () and entity bodies. Compression can allow an attacker to recover + secret data when it is compressed in the same context as data under attacker control. + + + There are demonstrable attacks on compression that exploit the characteristics of the web + (e.g., ). The attacker induces multiple requests containing + varying plaintext, observing the length of the resulting ciphertext in each, which + reveals a shorter length when a guess about the secret is correct. + + + Implementations communicating on a secure channel MUST NOT compress content that includes + both confidential and attacker-controlled data unless separate compression dictionaries + are used for each source of data. Compression MUST NOT be used if the source of data + cannot be reliably determined. Generic stream compression, such as that provided by TLS + MUST NOT be used with HTTP/2 (). + + + Further considerations regarding the compression of header fields are described in . + +
    + +
    + + Padding within HTTP/2 is not intended as a replacement for general purpose padding, such + as might be provided by TLS. Redundant padding could even be + counterproductive. Correct application can depend on having specific knowledge of the + data that is being padded. + + + To mitigate attacks that rely on compression, disabling or limiting compression might be + preferable to padding as a countermeasure. + + + Padding can be used to obscure the exact size of frame content, and is provided to + mitigate specific attacks within HTTP. For example, attacks where compressed content + includes both attacker-controlled plaintext and secret data (see for example, ). + + + Use of padding can result in less protection than might seem immediately obvious. At + best, padding only makes it more difficult for an attacker to infer length information by + increasing the number of frames an attacker has to observe. Incorrectly implemented + padding schemes can be easily defeated. In particular, randomized padding with a + predictable distribution provides very little protection; similarly, padding payloads to a + fixed size exposes information as payload sizes cross the fixed size boundary, which could + be possible if an attacker can control plaintext. + + + Intermediaries SHOULD retain padding for DATA frames, but MAY drop padding + for HEADERS and PUSH_PROMISE frames. A valid reason for an + intermediary to change the amount of padding of frames is to improve the protections that + padding provides. + +
    + +
    + + Several characteristics of HTTP/2 provide an observer an opportunity to correlate actions + of a single client or server over time. This includes the value of settings, the manner + in which flow control windows are managed, the way priorities are allocated to streams, + timing of reactions to stimulus, and handling of any optional features. + + + As far as this creates observable differences in behavior, they could be used as a basis + for fingerprinting a specific client, as defined in . + +
    +
    + +
    + + A string for identifying HTTP/2 is entered into the "Application Layer Protocol Negotiation + (ALPN) Protocol IDs" registry established in . + + + This document establishes a registry for frame types, settings, and error codes. These new + registries are entered into a new "Hypertext Transfer Protocol (HTTP) 2 Parameters" section. + + + This document registers the HTTP2-Settings header field for + use in HTTP; and the 421 (Misdirected Request) status code. + + + This document registers the PRI method for use in HTTP, to avoid + collisions with the connection preface. + + +
    + + This document creates two registrations for the identification of HTTP/2 in the + "Application Layer Protocol Negotiation (ALPN) Protocol IDs" registry established in . + + + The "h2" string identifies HTTP/2 when used over TLS: + + HTTP/2 over TLS + 0x68 0x32 ("h2") + This document + + + + The "h2c" string identifies HTTP/2 when used over cleartext TCP: + + HTTP/2 over TCP + 0x68 0x32 0x63 ("h2c") + This document + + +
    + +
    + + This document establishes a registry for HTTP/2 frame type codes. The "HTTP/2 Frame + Type" registry manages an 8-bit space. The "HTTP/2 Frame Type" registry operates under + either of the "IETF Review" or "IESG Approval" policies for + values between 0x00 and 0xef, with values between 0xf0 and 0xff being reserved for + experimental use. + + + New entries in this registry require the following information: + + + A name or label for the frame type. + + + The 8-bit code assigned to the frame type. + + + A reference to a specification that includes a description of the frame layout, + it's semantics and flags that the frame type uses, including any parts of the frame + that are conditionally present based on the value of flags. + + + + + The entries in the following table are registered by this document. + + + Frame Type + Code + Section + DATA0x0 + HEADERS0x1 + PRIORITY0x2 + RST_STREAM0x3 + SETTINGS0x4 + PUSH_PROMISE0x5 + PING0x6 + GOAWAY0x7 + WINDOW_UPDATE0x8 + CONTINUATION0x9 + +
    + +
    + + This document establishes a registry for HTTP/2 settings. The "HTTP/2 Settings" registry + manages a 16-bit space. The "HTTP/2 Settings" registry operates under the "Expert Review" policy for values in the range from 0x0000 to + 0xefff, with values between and 0xf000 and 0xffff being reserved for experimental use. + + + New registrations are advised to provide the following information: + + + A symbolic name for the setting. Specifying a setting name is optional. + + + The 16-bit code assigned to the setting. + + + An initial value for the setting. + + + An optional reference to a specification that describes the use of the setting. + + + + + An initial set of setting registrations can be found in . + + + Name + Code + Initial Value + Specification + HEADER_TABLE_SIZE + 0x14096 + ENABLE_PUSH + 0x21 + MAX_CONCURRENT_STREAMS + 0x3(infinite) + INITIAL_WINDOW_SIZE + 0x465535 + MAX_FRAME_SIZE + 0x516384 + MAX_HEADER_LIST_SIZE + 0x6(infinite) + + +
    + +
    + + This document establishes a registry for HTTP/2 error codes. The "HTTP/2 Error Code" + registry manages a 32-bit space. The "HTTP/2 Error Code" registry operates under the + "Expert Review" policy. + + + Registrations for error codes are required to include a description of the error code. An + expert reviewer is advised to examine new registrations for possible duplication with + existing error codes. Use of existing registrations is to be encouraged, but not + mandated. + + + New registrations are advised to provide the following information: + + + A name for the error code. Specifying an error code name is optional. + + + The 32-bit error code value. + + + A brief description of the error code semantics, longer if no detailed specification + is provided. + + + An optional reference for a specification that defines the error code. + + + + + The entries in the following table are registered by this document. + + + Name + Code + Description + Specification + NO_ERROR0x0 + Graceful shutdown + + PROTOCOL_ERROR0x1 + Protocol error detected + + INTERNAL_ERROR0x2 + Implementation fault + + FLOW_CONTROL_ERROR0x3 + Flow control limits exceeded + + SETTINGS_TIMEOUT0x4 + Settings not acknowledged + + STREAM_CLOSED0x5 + Frame received for closed stream + + FRAME_SIZE_ERROR0x6 + Frame size incorrect + + REFUSED_STREAM0x7 + Stream not processed + + CANCEL0x8 + Stream cancelled + + COMPRESSION_ERROR0x9 + Compression state not updated + + CONNECT_ERROR0xa + TCP connection error for CONNECT method + + ENHANCE_YOUR_CALM0xb + Processing capacity exceeded + + INADEQUATE_SECURITY0xc + Negotiated TLS parameters not acceptable + + + +
    + +
    + + This section registers the HTTP2-Settings header field in the + Permanent Message Header Field Registry. + + + HTTP2-Settings + + + http + + + standard + + + IETF + + + of this document + + + This header field is only used by an HTTP/2 client for Upgrade-based negotiation. + + + +
    + +
    + + This section registers the PRI method in the HTTP Method + Registry (). + + + PRI + + + No + + + No + + + of this document + + + This method is never used by an actual client. This method will appear to be used + when an HTTP/1.1 server or intermediary attempts to parse an HTTP/2 connection + preface. + + + +
    + +
    + + This document registers the 421 (Misdirected Request) HTTP Status code in the Hypertext + Transfer Protocol (HTTP) Status Code Registry (). + + + + + 421 + + + Misdirected Request + + + of this document + + + +
    + +
    + +
    + + This document includes substantial input from the following individuals: + + + Adam Langley, Wan-Teh Chang, Jim Morrison, Mark Nottingham, Alyssa Wilk, Costin + Manolache, William Chan, Vitaliy Lvin, Joe Chan, Adam Barth, Ryan Hamilton, Gavin + Peters, Kent Alstad, Kevin Lindsay, Paul Amer, Fan Yang, Jonathan Leighton (SPDY + contributors). + + + Gabriel Montenegro and Willy Tarreau (Upgrade mechanism). + + + William Chan, Salvatore Loreto, Osama Mazahir, Gabriel Montenegro, Jitu Padhye, Roberto + Peon, Rob Trace (Flow control). + + + Mike Bishop (Extensibility). + + + Mark Nottingham, Julian Reschke, James Snell, Jeff Pinner, Mike Bishop, Herve Ruellan + (Substantial editorial contributions). + + + Kari Hurtta, Tatsuhiro Tsujikawa, Greg Wilkins, Poul-Henning Kamp. + + + Alexey Melnikov was an editor of this document during 2013. + + + A substantial proportion of Martin's contribution was supported by Microsoft during his + employment there. + + + +
    +
    + + + + + + HPACK - Header Compression for HTTP/2 + + + + + + + + + + + + Transmission Control Protocol + + + University of Southern California (USC)/Information Sciences + Institute + + + + + + + + + + + Key words for use in RFCs to Indicate Requirement Levels + + + Harvard University +
    sob@harvard.edu
    +
    + +
    + + +
    + + + + + HTTP Over TLS + + + + + + + + + + Uniform Resource Identifier (URI): Generic + Syntax + + + + + + + + + + + + The Base16, Base32, and Base64 Data Encodings + + + + + + + + + Guidelines for Writing an IANA Considerations Section in RFCs + + + + + + + + + + + Augmented BNF for Syntax Specifications: ABNF + + + + + + + + + + + The Transport Layer Security (TLS) Protocol Version 1.2 + + + + + + + + + + + Transport Layer Security (TLS) Extensions: Extension Definitions + + + + + + + + + + Transport Layer Security (TLS) Application-Layer Protocol Negotiation Extension + + + + + + + + + + + + + TLS Elliptic Curve Cipher Suites with SHA-256/384 and AES Galois + Counter Mode (GCM) + + + + + + + + + + + Digital Signature Standard (DSS) + + NIST + + + + + + + + + Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing + + Adobe Systems Incorporated +
    fielding@gbiv.com
    +
    + + greenbytes GmbH +
    julian.reschke@greenbytes.de
    +
    + +
    + + +
    + + + + Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content + + Adobe Systems Incorporated +
    fielding@gbiv.com
    +
    + + greenbytes GmbH +
    julian.reschke@greenbytes.de
    +
    + +
    + + +
    + + + Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests + + Adobe Systems Incorporated +
    fielding@gbiv.com
    +
    + + greenbytes GmbH +
    julian.reschke@greenbytes.de
    +
    + +
    + +
    + + + Hypertext Transfer Protocol (HTTP/1.1): Range Requests + + Adobe Systems Incorporated +
    fielding@gbiv.com
    +
    + + World Wide Web Consortium +
    ylafon@w3.org
    +
    + + greenbytes GmbH +
    julian.reschke@greenbytes.de
    +
    + +
    + +
    + + + Hypertext Transfer Protocol (HTTP/1.1): Caching + + Adobe Systems Incorporated +
    fielding@gbiv.com
    +
    + + Akamai +
    mnot@mnot.net
    +
    + + greenbytes GmbH +
    julian.reschke@greenbytes.de
    +
    + +
    + + +
    + + + Hypertext Transfer Protocol (HTTP/1.1): Authentication + + Adobe Systems Incorporated +
    fielding@gbiv.com
    +
    + + greenbytes GmbH +
    julian.reschke@greenbytes.de
    +
    + +
    + + +
    + + + + HTTP State Management Mechanism + + + + + +
    + + + + + + TCP Extensions for High Performance + + + + + + + + + + + + Transport Layer Security Protocol Compression Methods + + + + + + + + + Additional HTTP Status Codes + + + + + + + + + + + Elliptic Curve Cryptography (ECC) Cipher Suites for Transport Layer Security (TLS) + + + + + + + + + + + + + + + AES Galois Counter Mode (GCM) Cipher Suites for TLS + + + + + + + + + + + + HTML5 + + + + + + + + + + + Latest version available at + . + + + + + + + Talking to Yourself for Fun and Profit + + + + + + + + + + + + + + BREACH: Reviving the CRIME Attack + + + + + + + + + + + Registration Procedures for Message Header Fields + + Nine by Nine +
    GK-IETF@ninebynine.org
    +
    + + BEA Systems +
    mnot@pobox.com
    +
    + + HP Labs +
    JeffMogul@acm.org
    +
    + +
    + + +
    + + + + Recommendations for Secure Use of TLS and DTLS + + + + + + + + + + + + + + + + + + HTTP Alternative Services + + + Akamai + + + Mozilla + + + greenbytes + + + + + + +
    + +
    + + This section is to be removed by RFC Editor before publication. + + +
    + + Renamed Not Authoritative status code to Misdirected Request. + +
    + +
    + + Pseudo-header fields are now required to appear strictly before regular ones. + + + Restored 1xx series status codes, except 101. + + + Changed frame length field 24-bits. Expanded frame header to 9 octets. Added a setting + to limit the damage. + + + Added a setting to advise peers of header set size limits. + + + Removed segments. + + + Made non-semantic-bearing HEADERS frames illegal in the HTTP mapping. + +
    + +
    + + Restored extensibility options. + + + Restricting TLS cipher suites to AEAD only. + + + Removing Content-Encoding requirements. + + + Permitting the use of PRIORITY after stream close. + + + Removed ALTSVC frame. + + + Removed BLOCKED frame. + + + Reducing the maximum padding size to 256 octets; removing padding from + CONTINUATION frames. + + + Removed per-frame GZIP compression. + +
    + +
    + + Added BLOCKED frame (at risk). + + + Simplified priority scheme. + + + Added DATA per-frame GZIP compression. + +
    + +
    + + Changed "connection header" to "connection preface" to avoid confusion. + + + Added dependency-based stream prioritization. + + + Added "h2c" identifier to distinguish between cleartext and secured HTTP/2. + + + Adding missing padding to PUSH_PROMISE. + + + Integrate ALTSVC frame and supporting text. + + + Dropping requirement on "deflate" Content-Encoding. + + + Improving security considerations around use of compression. + +
    + +
    + + Adding padding for data frames. + + + Renumbering frame types, error codes, and settings. + + + Adding INADEQUATE_SECURITY error code. + + + Updating TLS usage requirements to 1.2; forbidding TLS compression. + + + Removing extensibility for frames and settings. + + + Changing setting identifier size. + + + Removing the ability to disable flow control. + + + Changing the protocol identification token to "h2". + + + Changing the use of :authority to make it optional and to allow userinfo in non-HTTP + cases. + + + Allowing split on 0x0 for Cookie. + + + Reserved PRI method in HTTP/1.1 to avoid possible future collisions. + +
    + +
    + + Added cookie crumbling for more efficient header compression. + + + Added header field ordering with the value-concatenation mechanism. + +
    + +
    + + Marked draft for implementation. + +
    + +
    + + Adding definition for CONNECT method. + + + Constraining the use of push to safe, cacheable methods with no request body. + + + Changing from :host to :authority to remove any potential confusion. + + + Adding setting for header compression table size. + + + Adding settings acknowledgement. + + + Removing unnecessary and potentially problematic flags from CONTINUATION. + + + Added denial of service considerations. + +
    +
    + + Marking the draft ready for implementation. + + + Renumbering END_PUSH_PROMISE flag. + + + Editorial clarifications and changes. + +
    + +
    + + Added CONTINUATION frame for HEADERS and PUSH_PROMISE. + + + PUSH_PROMISE is no longer implicitly prohibited if SETTINGS_MAX_CONCURRENT_STREAMS is + zero. + + + Push expanded to allow all safe methods without a request body. + + + Clarified the use of HTTP header fields in requests and responses. Prohibited HTTP/1.1 + hop-by-hop header fields. + + + Requiring that intermediaries not forward requests with missing or illegal routing + :-headers. + + + Clarified requirements around handling different frames after stream close, stream reset + and GOAWAY. + + + Added more specific prohibitions for sending of different frame types in various stream + states. + + + Making the last received setting value the effective value. + + + Clarified requirements on TLS version, extension and ciphers. + +
    + +
    + + Committed major restructuring atrocities. + + + Added reference to first header compression draft. + + + Added more formal description of frame lifecycle. + + + Moved END_STREAM (renamed from FINAL) back to HEADERS/DATA. + + + Removed HEADERS+PRIORITY, added optional priority to HEADERS frame. + + + Added PRIORITY frame. + +
    + +
    + + Added continuations to frames carrying header blocks. + + + Replaced use of "session" with "connection" to avoid confusion with other HTTP stateful + concepts, like cookies. + + + Removed "message". + + + Switched to TLS ALPN from NPN. + + + Editorial changes. + +
    + +
    + + Added IANA considerations section for frame types, error codes and settings. + + + Removed data frame compression. + + + Added PUSH_PROMISE. + + + Added globally applicable flags to framing. + + + Removed zlib-based header compression mechanism. + + + Updated references. + + + Clarified stream identifier reuse. + + + Removed CREDENTIALS frame and associated mechanisms. + + + Added advice against naive implementation of flow control. + + + Added session header section. + + + Restructured frame header. Removed distinction between data and control frames. + + + Altered flow control properties to include session-level limits. + + + Added note on cacheability of pushed resources and multiple tenant servers. + + + Changed protocol label form based on discussions. + +
    + +
    + + Changed title throughout. + + + Removed section on Incompatibilities with SPDY draft#2. + + + Changed INTERNAL_ERROR on GOAWAY to have a value of 2 . + + + Replaced abstract and introduction. + + + Added section on starting HTTP/2.0, including upgrade mechanism. + + + Removed unused references. + + + Added flow control principles based on . + +
    + +
    + + Adopted as base for draft-ietf-httpbis-http2. + + + Updated authors/editors list. + + + Added status note. + +
    +
    + +
    +
    + diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/transport.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/transport.go new file mode 100644 index 0000000..adb77ff --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/transport.go @@ -0,0 +1,2275 @@ +// Copyright 2015 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. + +// Transport code. + +package http2 + +import ( + "bufio" + "bytes" + "compress/gzip" + "crypto/rand" + "crypto/tls" + "errors" + "fmt" + "io" + "io/ioutil" + "log" + "math" + mathrand "math/rand" + "net" + "net/http" + "sort" + "strconv" + "strings" + "sync" + "time" + + "golang.org/x/net/http2/hpack" + "golang.org/x/net/idna" + "golang.org/x/net/lex/httplex" +) + +const ( + // transportDefaultConnFlow is how many connection-level flow control + // tokens we give the server at start-up, past the default 64k. + transportDefaultConnFlow = 1 << 30 + + // transportDefaultStreamFlow is how many stream-level flow + // control tokens we announce to the peer, and how many bytes + // we buffer per stream. + transportDefaultStreamFlow = 4 << 20 + + // transportDefaultStreamMinRefresh is the minimum number of bytes we'll send + // a stream-level WINDOW_UPDATE for at a time. + transportDefaultStreamMinRefresh = 4 << 10 + + defaultUserAgent = "Go-http-client/2.0" +) + +// Transport is an HTTP/2 Transport. +// +// A Transport internally caches connections to servers. It is safe +// for concurrent use by multiple goroutines. +type Transport struct { + // DialTLS specifies an optional dial function for creating + // TLS connections for requests. + // + // If DialTLS is nil, tls.Dial is used. + // + // If the returned net.Conn has a ConnectionState method like tls.Conn, + // it will be used to set http.Response.TLS. + DialTLS func(network, addr string, cfg *tls.Config) (net.Conn, error) + + // TLSClientConfig specifies the TLS configuration to use with + // tls.Client. If nil, the default configuration is used. + TLSClientConfig *tls.Config + + // ConnPool optionally specifies an alternate connection pool to use. + // If nil, the default is used. + ConnPool ClientConnPool + + // DisableCompression, if true, prevents the Transport from + // requesting compression with an "Accept-Encoding: gzip" + // request header when the Request contains no existing + // Accept-Encoding value. If the Transport requests gzip on + // its own and gets a gzipped response, it's transparently + // decoded in the Response.Body. However, if the user + // explicitly requested gzip it is not automatically + // uncompressed. + DisableCompression bool + + // AllowHTTP, if true, permits HTTP/2 requests using the insecure, + // plain-text "http" scheme. Note that this does not enable h2c support. + AllowHTTP bool + + // MaxHeaderListSize is the http2 SETTINGS_MAX_HEADER_LIST_SIZE to + // send in the initial settings frame. It is how many bytes + // of response headers are allowed. Unlike the http2 spec, zero here + // means to use a default limit (currently 10MB). If you actually + // want to advertise an ulimited value to the peer, Transport + // interprets the highest possible value here (0xffffffff or 1<<32-1) + // to mean no limit. + MaxHeaderListSize uint32 + + // t1, if non-nil, is the standard library Transport using + // this transport. Its settings are used (but not its + // RoundTrip method, etc). + t1 *http.Transport + + connPoolOnce sync.Once + connPoolOrDef ClientConnPool // non-nil version of ConnPool +} + +func (t *Transport) maxHeaderListSize() uint32 { + if t.MaxHeaderListSize == 0 { + return 10 << 20 + } + if t.MaxHeaderListSize == 0xffffffff { + return 0 + } + return t.MaxHeaderListSize +} + +func (t *Transport) disableCompression() bool { + return t.DisableCompression || (t.t1 != nil && t.t1.DisableCompression) +} + +var errTransportVersion = errors.New("http2: ConfigureTransport is only supported starting at Go 1.6") + +// ConfigureTransport configures a net/http HTTP/1 Transport to use HTTP/2. +// It requires Go 1.6 or later and returns an error if the net/http package is too old +// or if t1 has already been HTTP/2-enabled. +func ConfigureTransport(t1 *http.Transport) error { + _, err := configureTransport(t1) // in configure_transport.go (go1.6) or not_go16.go + return err +} + +func (t *Transport) connPool() ClientConnPool { + t.connPoolOnce.Do(t.initConnPool) + return t.connPoolOrDef +} + +func (t *Transport) initConnPool() { + if t.ConnPool != nil { + t.connPoolOrDef = t.ConnPool + } else { + t.connPoolOrDef = &clientConnPool{t: t} + } +} + +// ClientConn is the state of a single HTTP/2 client connection to an +// HTTP/2 server. +type ClientConn struct { + t *Transport + tconn net.Conn // usually *tls.Conn, except specialized impls + tlsState *tls.ConnectionState // nil only for specialized impls + singleUse bool // whether being used for a single http.Request + + // readLoop goroutine fields: + readerDone chan struct{} // closed on error + readerErr error // set before readerDone is closed + + idleTimeout time.Duration // or 0 for never + idleTimer *time.Timer + + mu sync.Mutex // guards following + cond *sync.Cond // hold mu; broadcast on flow/closed changes + flow flow // our conn-level flow control quota (cs.flow is per stream) + inflow flow // peer's conn-level flow control + closed bool + wantSettingsAck bool // we sent a SETTINGS frame and haven't heard back + goAway *GoAwayFrame // if non-nil, the GoAwayFrame we received + goAwayDebug string // goAway frame's debug data, retained as a string + streams map[uint32]*clientStream // client-initiated + nextStreamID uint32 + pendingRequests int // requests blocked and waiting to be sent because len(streams) == maxConcurrentStreams + pings map[[8]byte]chan struct{} // in flight ping data to notification channel + bw *bufio.Writer + br *bufio.Reader + fr *Framer + lastActive time.Time + // Settings from peer: (also guarded by mu) + maxFrameSize uint32 + maxConcurrentStreams uint32 + peerMaxHeaderListSize uint64 + initialWindowSize uint32 + + hbuf bytes.Buffer // HPACK encoder writes into this + henc *hpack.Encoder + freeBuf [][]byte + + wmu sync.Mutex // held while writing; acquire AFTER mu if holding both + werr error // first write error that has occurred +} + +// clientStream is the state for a single HTTP/2 stream. One of these +// is created for each Transport.RoundTrip call. +type clientStream struct { + cc *ClientConn + req *http.Request + trace *clientTrace // or nil + ID uint32 + resc chan resAndError + bufPipe pipe // buffered pipe with the flow-controlled response payload + startedWrite bool // started request body write; guarded by cc.mu + requestedGzip bool + on100 func() // optional code to run if get a 100 continue response + + flow flow // guarded by cc.mu + inflow flow // guarded by cc.mu + bytesRemain int64 // -1 means unknown; owned by transportResponseBody.Read + readErr error // sticky read error; owned by transportResponseBody.Read + stopReqBody error // if non-nil, stop writing req body; guarded by cc.mu + didReset bool // whether we sent a RST_STREAM to the server; guarded by cc.mu + + peerReset chan struct{} // closed on peer reset + resetErr error // populated before peerReset is closed + + done chan struct{} // closed when stream remove from cc.streams map; close calls guarded by cc.mu + + // owned by clientConnReadLoop: + firstByte bool // got the first response byte + pastHeaders bool // got first MetaHeadersFrame (actual headers) + pastTrailers bool // got optional second MetaHeadersFrame (trailers) + + trailer http.Header // accumulated trailers + resTrailer *http.Header // client's Response.Trailer +} + +// awaitRequestCancel waits for the user to cancel a request or for the done +// channel to be signaled. A non-nil error is returned only if the request was +// canceled. +func awaitRequestCancel(req *http.Request, done <-chan struct{}) error { + ctx := reqContext(req) + if req.Cancel == nil && ctx.Done() == nil { + return nil + } + select { + case <-req.Cancel: + return errRequestCanceled + case <-ctx.Done(): + return ctx.Err() + case <-done: + return nil + } +} + +// awaitRequestCancel waits for the user to cancel a request, its context to +// expire, or for the request to be done (any way it might be removed from the +// cc.streams map: peer reset, successful completion, TCP connection breakage, +// etc). If the request is canceled, then cs will be canceled and closed. +func (cs *clientStream) awaitRequestCancel(req *http.Request) { + if err := awaitRequestCancel(req, cs.done); err != nil { + cs.cancelStream() + cs.bufPipe.CloseWithError(err) + } +} + +func (cs *clientStream) cancelStream() { + cc := cs.cc + cc.mu.Lock() + didReset := cs.didReset + cs.didReset = true + cc.mu.Unlock() + + if !didReset { + cc.writeStreamReset(cs.ID, ErrCodeCancel, nil) + cc.forgetStreamID(cs.ID) + } +} + +// checkResetOrDone reports any error sent in a RST_STREAM frame by the +// server, or errStreamClosed if the stream is complete. +func (cs *clientStream) checkResetOrDone() error { + select { + case <-cs.peerReset: + return cs.resetErr + case <-cs.done: + return errStreamClosed + default: + return nil + } +} + +func (cs *clientStream) abortRequestBodyWrite(err error) { + if err == nil { + panic("nil error") + } + cc := cs.cc + cc.mu.Lock() + cs.stopReqBody = err + cc.cond.Broadcast() + cc.mu.Unlock() +} + +type stickyErrWriter struct { + w io.Writer + err *error +} + +func (sew stickyErrWriter) Write(p []byte) (n int, err error) { + if *sew.err != nil { + return 0, *sew.err + } + n, err = sew.w.Write(p) + *sew.err = err + return +} + +var ErrNoCachedConn = errors.New("http2: no cached connection was available") + +// RoundTripOpt are options for the Transport.RoundTripOpt method. +type RoundTripOpt struct { + // OnlyCachedConn controls whether RoundTripOpt may + // create a new TCP connection. If set true and + // no cached connection is available, RoundTripOpt + // will return ErrNoCachedConn. + OnlyCachedConn bool +} + +func (t *Transport) RoundTrip(req *http.Request) (*http.Response, error) { + return t.RoundTripOpt(req, RoundTripOpt{}) +} + +// authorityAddr returns a given authority (a host/IP, or host:port / ip:port) +// and returns a host:port. The port 443 is added if needed. +func authorityAddr(scheme string, authority string) (addr string) { + host, port, err := net.SplitHostPort(authority) + if err != nil { // authority didn't have a port + port = "443" + if scheme == "http" { + port = "80" + } + host = authority + } + if a, err := idna.ToASCII(host); err == nil { + host = a + } + // IPv6 address literal, without a port: + if strings.HasPrefix(host, "[") && strings.HasSuffix(host, "]") { + return host + ":" + port + } + return net.JoinHostPort(host, port) +} + +// RoundTripOpt is like RoundTrip, but takes options. +func (t *Transport) RoundTripOpt(req *http.Request, opt RoundTripOpt) (*http.Response, error) { + if !(req.URL.Scheme == "https" || (req.URL.Scheme == "http" && t.AllowHTTP)) { + return nil, errors.New("http2: unsupported scheme") + } + + addr := authorityAddr(req.URL.Scheme, req.URL.Host) + for retry := 0; ; retry++ { + cc, err := t.connPool().GetClientConn(req, addr) + if err != nil { + t.vlogf("http2: Transport failed to get client conn for %s: %v", addr, err) + return nil, err + } + traceGotConn(req, cc) + res, err := cc.RoundTrip(req) + if err != nil && retry <= 6 { + afterBodyWrite := false + if e, ok := err.(afterReqBodyWriteError); ok { + err = e + afterBodyWrite = true + } + if req, err = shouldRetryRequest(req, err, afterBodyWrite); err == nil { + // After the first retry, do exponential backoff with 10% jitter. + if retry == 0 { + continue + } + backoff := float64(uint(1) << (uint(retry) - 1)) + backoff += backoff * (0.1 * mathrand.Float64()) + select { + case <-time.After(time.Second * time.Duration(backoff)): + continue + case <-reqContext(req).Done(): + return nil, reqContext(req).Err() + } + } + } + if err != nil { + t.vlogf("RoundTrip failure: %v", err) + return nil, err + } + return res, nil + } +} + +// CloseIdleConnections closes any connections which were previously +// connected from previous requests but are now sitting idle. +// It does not interrupt any connections currently in use. +func (t *Transport) CloseIdleConnections() { + if cp, ok := t.connPool().(clientConnPoolIdleCloser); ok { + cp.closeIdleConnections() + } +} + +var ( + errClientConnClosed = errors.New("http2: client conn is closed") + errClientConnUnusable = errors.New("http2: client conn not usable") + errClientConnGotGoAway = errors.New("http2: Transport received Server's graceful shutdown GOAWAY") +) + +// afterReqBodyWriteError is a wrapper around errors returned by ClientConn.RoundTrip. +// It is used to signal that err happened after part of Request.Body was sent to the server. +type afterReqBodyWriteError struct { + err error +} + +func (e afterReqBodyWriteError) Error() string { + return e.err.Error() + "; some request body already written" +} + +// shouldRetryRequest is called by RoundTrip when a request fails to get +// response headers. It is always called with a non-nil error. +// It returns either a request to retry (either the same request, or a +// modified clone), or an error if the request can't be replayed. +func shouldRetryRequest(req *http.Request, err error, afterBodyWrite bool) (*http.Request, error) { + if !canRetryError(err) { + return nil, err + } + if !afterBodyWrite { + return req, nil + } + // If the Body is nil (or http.NoBody), it's safe to reuse + // this request and its Body. + if req.Body == nil || reqBodyIsNoBody(req.Body) { + return req, nil + } + // Otherwise we depend on the Request having its GetBody + // func defined. + getBody := reqGetBody(req) // Go 1.8: getBody = req.GetBody + if getBody == nil { + return nil, fmt.Errorf("http2: Transport: cannot retry err [%v] after Request.Body was written; define Request.GetBody to avoid this error", err) + } + body, err := getBody() + if err != nil { + return nil, err + } + newReq := *req + newReq.Body = body + return &newReq, nil +} + +func canRetryError(err error) bool { + if err == errClientConnUnusable || err == errClientConnGotGoAway { + return true + } + if se, ok := err.(StreamError); ok { + return se.Code == ErrCodeRefusedStream + } + return false +} + +func (t *Transport) dialClientConn(addr string, singleUse bool) (*ClientConn, error) { + host, _, err := net.SplitHostPort(addr) + if err != nil { + return nil, err + } + tconn, err := t.dialTLS()("tcp", addr, t.newTLSConfig(host)) + if err != nil { + return nil, err + } + return t.newClientConn(tconn, singleUse) +} + +func (t *Transport) newTLSConfig(host string) *tls.Config { + cfg := new(tls.Config) + if t.TLSClientConfig != nil { + *cfg = *cloneTLSConfig(t.TLSClientConfig) + } + if !strSliceContains(cfg.NextProtos, NextProtoTLS) { + cfg.NextProtos = append([]string{NextProtoTLS}, cfg.NextProtos...) + } + if cfg.ServerName == "" { + cfg.ServerName = host + } + return cfg +} + +func (t *Transport) dialTLS() func(string, string, *tls.Config) (net.Conn, error) { + if t.DialTLS != nil { + return t.DialTLS + } + return t.dialTLSDefault +} + +func (t *Transport) dialTLSDefault(network, addr string, cfg *tls.Config) (net.Conn, error) { + cn, err := tls.Dial(network, addr, cfg) + if err != nil { + return nil, err + } + if err := cn.Handshake(); err != nil { + return nil, err + } + if !cfg.InsecureSkipVerify { + if err := cn.VerifyHostname(cfg.ServerName); err != nil { + return nil, err + } + } + state := cn.ConnectionState() + if p := state.NegotiatedProtocol; p != NextProtoTLS { + return nil, fmt.Errorf("http2: unexpected ALPN protocol %q; want %q", p, NextProtoTLS) + } + if !state.NegotiatedProtocolIsMutual { + return nil, errors.New("http2: could not negotiate protocol mutually") + } + return cn, nil +} + +// disableKeepAlives reports whether connections should be closed as +// soon as possible after handling the first request. +func (t *Transport) disableKeepAlives() bool { + return t.t1 != nil && t.t1.DisableKeepAlives +} + +func (t *Transport) expectContinueTimeout() time.Duration { + if t.t1 == nil { + return 0 + } + return transportExpectContinueTimeout(t.t1) +} + +func (t *Transport) NewClientConn(c net.Conn) (*ClientConn, error) { + return t.newClientConn(c, false) +} + +func (t *Transport) newClientConn(c net.Conn, singleUse bool) (*ClientConn, error) { + cc := &ClientConn{ + t: t, + tconn: c, + readerDone: make(chan struct{}), + nextStreamID: 1, + maxFrameSize: 16 << 10, // spec default + initialWindowSize: 65535, // spec default + maxConcurrentStreams: 1000, // "infinite", per spec. 1000 seems good enough. + peerMaxHeaderListSize: 0xffffffffffffffff, // "infinite", per spec. Use 2^64-1 instead. + streams: make(map[uint32]*clientStream), + singleUse: singleUse, + wantSettingsAck: true, + pings: make(map[[8]byte]chan struct{}), + } + if d := t.idleConnTimeout(); d != 0 { + cc.idleTimeout = d + cc.idleTimer = time.AfterFunc(d, cc.onIdleTimeout) + } + if VerboseLogs { + t.vlogf("http2: Transport creating client conn %p to %v", cc, c.RemoteAddr()) + } + + cc.cond = sync.NewCond(&cc.mu) + cc.flow.add(int32(initialWindowSize)) + + // TODO: adjust this writer size to account for frame size + + // MTU + crypto/tls record padding. + cc.bw = bufio.NewWriter(stickyErrWriter{c, &cc.werr}) + cc.br = bufio.NewReader(c) + cc.fr = NewFramer(cc.bw, cc.br) + cc.fr.ReadMetaHeaders = hpack.NewDecoder(initialHeaderTableSize, nil) + cc.fr.MaxHeaderListSize = t.maxHeaderListSize() + + // TODO: SetMaxDynamicTableSize, SetMaxDynamicTableSizeLimit on + // henc in response to SETTINGS frames? + cc.henc = hpack.NewEncoder(&cc.hbuf) + + if cs, ok := c.(connectionStater); ok { + state := cs.ConnectionState() + cc.tlsState = &state + } + + initialSettings := []Setting{ + {ID: SettingEnablePush, Val: 0}, + {ID: SettingInitialWindowSize, Val: transportDefaultStreamFlow}, + } + if max := t.maxHeaderListSize(); max != 0 { + initialSettings = append(initialSettings, Setting{ID: SettingMaxHeaderListSize, Val: max}) + } + + cc.bw.Write(clientPreface) + cc.fr.WriteSettings(initialSettings...) + cc.fr.WriteWindowUpdate(0, transportDefaultConnFlow) + cc.inflow.add(transportDefaultConnFlow + initialWindowSize) + cc.bw.Flush() + if cc.werr != nil { + return nil, cc.werr + } + + go cc.readLoop() + return cc, nil +} + +func (cc *ClientConn) setGoAway(f *GoAwayFrame) { + cc.mu.Lock() + defer cc.mu.Unlock() + + old := cc.goAway + cc.goAway = f + + // Merge the previous and current GoAway error frames. + if cc.goAwayDebug == "" { + cc.goAwayDebug = string(f.DebugData()) + } + if old != nil && old.ErrCode != ErrCodeNo { + cc.goAway.ErrCode = old.ErrCode + } + last := f.LastStreamID + for streamID, cs := range cc.streams { + if streamID > last { + select { + case cs.resc <- resAndError{err: errClientConnGotGoAway}: + default: + } + } + } +} + +// CanTakeNewRequest reports whether the connection can take a new request, +// meaning it has not been closed or received or sent a GOAWAY. +func (cc *ClientConn) CanTakeNewRequest() bool { + cc.mu.Lock() + defer cc.mu.Unlock() + return cc.canTakeNewRequestLocked() +} + +func (cc *ClientConn) canTakeNewRequestLocked() bool { + if cc.singleUse && cc.nextStreamID > 1 { + return false + } + return cc.goAway == nil && !cc.closed && + int64(cc.nextStreamID)+int64(cc.pendingRequests) < math.MaxInt32 +} + +// onIdleTimeout is called from a time.AfterFunc goroutine. It will +// only be called when we're idle, but because we're coming from a new +// goroutine, there could be a new request coming in at the same time, +// so this simply calls the synchronized closeIfIdle to shut down this +// connection. The timer could just call closeIfIdle, but this is more +// clear. +func (cc *ClientConn) onIdleTimeout() { + cc.closeIfIdle() +} + +func (cc *ClientConn) closeIfIdle() { + cc.mu.Lock() + if len(cc.streams) > 0 { + cc.mu.Unlock() + return + } + cc.closed = true + nextID := cc.nextStreamID + // TODO: do clients send GOAWAY too? maybe? Just Close: + cc.mu.Unlock() + + if VerboseLogs { + cc.vlogf("http2: Transport closing idle conn %p (forSingleUse=%v, maxStream=%v)", cc, cc.singleUse, nextID-2) + } + cc.tconn.Close() +} + +const maxAllocFrameSize = 512 << 10 + +// frameBuffer returns a scratch buffer suitable for writing DATA frames. +// They're capped at the min of the peer's max frame size or 512KB +// (kinda arbitrarily), but definitely capped so we don't allocate 4GB +// bufers. +func (cc *ClientConn) frameScratchBuffer() []byte { + cc.mu.Lock() + size := cc.maxFrameSize + if size > maxAllocFrameSize { + size = maxAllocFrameSize + } + for i, buf := range cc.freeBuf { + if len(buf) >= int(size) { + cc.freeBuf[i] = nil + cc.mu.Unlock() + return buf[:size] + } + } + cc.mu.Unlock() + return make([]byte, size) +} + +func (cc *ClientConn) putFrameScratchBuffer(buf []byte) { + cc.mu.Lock() + defer cc.mu.Unlock() + const maxBufs = 4 // arbitrary; 4 concurrent requests per conn? investigate. + if len(cc.freeBuf) < maxBufs { + cc.freeBuf = append(cc.freeBuf, buf) + return + } + for i, old := range cc.freeBuf { + if old == nil { + cc.freeBuf[i] = buf + return + } + } + // forget about it. +} + +// errRequestCanceled is a copy of net/http's errRequestCanceled because it's not +// exported. At least they'll be DeepEqual for h1-vs-h2 comparisons tests. +var errRequestCanceled = errors.New("net/http: request canceled") + +func commaSeparatedTrailers(req *http.Request) (string, error) { + keys := make([]string, 0, len(req.Trailer)) + for k := range req.Trailer { + k = http.CanonicalHeaderKey(k) + switch k { + case "Transfer-Encoding", "Trailer", "Content-Length": + return "", &badStringError{"invalid Trailer key", k} + } + keys = append(keys, k) + } + if len(keys) > 0 { + sort.Strings(keys) + return strings.Join(keys, ","), nil + } + return "", nil +} + +func (cc *ClientConn) responseHeaderTimeout() time.Duration { + if cc.t.t1 != nil { + return cc.t.t1.ResponseHeaderTimeout + } + // No way to do this (yet?) with just an http2.Transport. Probably + // no need. Request.Cancel this is the new way. We only need to support + // this for compatibility with the old http.Transport fields when + // we're doing transparent http2. + return 0 +} + +// checkConnHeaders checks whether req has any invalid connection-level headers. +// per RFC 7540 section 8.1.2.2: Connection-Specific Header Fields. +// Certain headers are special-cased as okay but not transmitted later. +func checkConnHeaders(req *http.Request) error { + if v := req.Header.Get("Upgrade"); v != "" { + return fmt.Errorf("http2: invalid Upgrade request header: %q", req.Header["Upgrade"]) + } + if vv := req.Header["Transfer-Encoding"]; len(vv) > 0 && (len(vv) > 1 || vv[0] != "" && vv[0] != "chunked") { + return fmt.Errorf("http2: invalid Transfer-Encoding request header: %q", vv) + } + if vv := req.Header["Connection"]; len(vv) > 0 && (len(vv) > 1 || vv[0] != "" && vv[0] != "close" && vv[0] != "keep-alive") { + return fmt.Errorf("http2: invalid Connection request header: %q", vv) + } + return nil +} + +// actualContentLength returns a sanitized version of +// req.ContentLength, where 0 actually means zero (not unknown) and -1 +// means unknown. +func actualContentLength(req *http.Request) int64 { + if req.Body == nil || reqBodyIsNoBody(req.Body) { + return 0 + } + if req.ContentLength != 0 { + return req.ContentLength + } + return -1 +} + +func (cc *ClientConn) RoundTrip(req *http.Request) (*http.Response, error) { + if err := checkConnHeaders(req); err != nil { + return nil, err + } + if cc.idleTimer != nil { + cc.idleTimer.Stop() + } + + trailers, err := commaSeparatedTrailers(req) + if err != nil { + return nil, err + } + hasTrailers := trailers != "" + + cc.mu.Lock() + if err := cc.awaitOpenSlotForRequest(req); err != nil { + cc.mu.Unlock() + return nil, err + } + + body := req.Body + contentLen := actualContentLength(req) + hasBody := contentLen != 0 + + // TODO(bradfitz): this is a copy of the logic in net/http. Unify somewhere? + var requestedGzip bool + if !cc.t.disableCompression() && + req.Header.Get("Accept-Encoding") == "" && + req.Header.Get("Range") == "" && + req.Method != "HEAD" { + // Request gzip only, not deflate. Deflate is ambiguous and + // not as universally supported anyway. + // See: http://www.gzip.org/zlib/zlib_faq.html#faq38 + // + // Note that we don't request this for HEAD requests, + // due to a bug in nginx: + // http://trac.nginx.org/nginx/ticket/358 + // https://golang.org/issue/5522 + // + // We don't request gzip if the request is for a range, since + // auto-decoding a portion of a gzipped document will just fail + // anyway. See https://golang.org/issue/8923 + requestedGzip = true + } + + // we send: HEADERS{1}, CONTINUATION{0,} + DATA{0,} (DATA is + // sent by writeRequestBody below, along with any Trailers, + // again in form HEADERS{1}, CONTINUATION{0,}) + hdrs, err := cc.encodeHeaders(req, requestedGzip, trailers, contentLen) + if err != nil { + cc.mu.Unlock() + return nil, err + } + + cs := cc.newStream() + cs.req = req + cs.trace = requestTrace(req) + cs.requestedGzip = requestedGzip + bodyWriter := cc.t.getBodyWriterState(cs, body) + cs.on100 = bodyWriter.on100 + + cc.wmu.Lock() + endStream := !hasBody && !hasTrailers + werr := cc.writeHeaders(cs.ID, endStream, hdrs) + cc.wmu.Unlock() + traceWroteHeaders(cs.trace) + cc.mu.Unlock() + + if werr != nil { + if hasBody { + req.Body.Close() // per RoundTripper contract + bodyWriter.cancel() + } + cc.forgetStreamID(cs.ID) + // Don't bother sending a RST_STREAM (our write already failed; + // no need to keep writing) + traceWroteRequest(cs.trace, werr) + return nil, werr + } + + var respHeaderTimer <-chan time.Time + if hasBody { + bodyWriter.scheduleBodyWrite() + } else { + traceWroteRequest(cs.trace, nil) + if d := cc.responseHeaderTimeout(); d != 0 { + timer := time.NewTimer(d) + defer timer.Stop() + respHeaderTimer = timer.C + } + } + + readLoopResCh := cs.resc + bodyWritten := false + ctx := reqContext(req) + + handleReadLoopResponse := func(re resAndError) (*http.Response, error) { + res := re.res + if re.err != nil || res.StatusCode > 299 { + // On error or status code 3xx, 4xx, 5xx, etc abort any + // ongoing write, assuming that the server doesn't care + // about our request body. If the server replied with 1xx or + // 2xx, however, then assume the server DOES potentially + // want our body (e.g. full-duplex streaming: + // golang.org/issue/13444). If it turns out the server + // doesn't, they'll RST_STREAM us soon enough. This is a + // heuristic to avoid adding knobs to Transport. Hopefully + // we can keep it. + bodyWriter.cancel() + cs.abortRequestBodyWrite(errStopReqBodyWrite) + } + if re.err != nil { + cc.mu.Lock() + afterBodyWrite := cs.startedWrite + cc.mu.Unlock() + cc.forgetStreamID(cs.ID) + if afterBodyWrite { + return nil, afterReqBodyWriteError{re.err} + } + return nil, re.err + } + res.Request = req + res.TLS = cc.tlsState + return res, nil + } + + for { + select { + case re := <-readLoopResCh: + return handleReadLoopResponse(re) + case <-respHeaderTimer: + if !hasBody || bodyWritten { + cc.writeStreamReset(cs.ID, ErrCodeCancel, nil) + } else { + bodyWriter.cancel() + cs.abortRequestBodyWrite(errStopReqBodyWriteAndCancel) + } + cc.forgetStreamID(cs.ID) + return nil, errTimeout + case <-ctx.Done(): + if !hasBody || bodyWritten { + cc.writeStreamReset(cs.ID, ErrCodeCancel, nil) + } else { + bodyWriter.cancel() + cs.abortRequestBodyWrite(errStopReqBodyWriteAndCancel) + } + cc.forgetStreamID(cs.ID) + return nil, ctx.Err() + case <-req.Cancel: + if !hasBody || bodyWritten { + cc.writeStreamReset(cs.ID, ErrCodeCancel, nil) + } else { + bodyWriter.cancel() + cs.abortRequestBodyWrite(errStopReqBodyWriteAndCancel) + } + cc.forgetStreamID(cs.ID) + return nil, errRequestCanceled + case <-cs.peerReset: + // processResetStream already removed the + // stream from the streams map; no need for + // forgetStreamID. + return nil, cs.resetErr + case err := <-bodyWriter.resc: + // Prefer the read loop's response, if available. Issue 16102. + select { + case re := <-readLoopResCh: + return handleReadLoopResponse(re) + default: + } + if err != nil { + return nil, err + } + bodyWritten = true + if d := cc.responseHeaderTimeout(); d != 0 { + timer := time.NewTimer(d) + defer timer.Stop() + respHeaderTimer = timer.C + } + } + } +} + +// awaitOpenSlotForRequest waits until len(streams) < maxConcurrentStreams. +// Must hold cc.mu. +func (cc *ClientConn) awaitOpenSlotForRequest(req *http.Request) error { + var waitingForConn chan struct{} + var waitingForConnErr error // guarded by cc.mu + for { + cc.lastActive = time.Now() + if cc.closed || !cc.canTakeNewRequestLocked() { + return errClientConnUnusable + } + if int64(len(cc.streams))+1 <= int64(cc.maxConcurrentStreams) { + if waitingForConn != nil { + close(waitingForConn) + } + return nil + } + // Unfortunately, we cannot wait on a condition variable and channel at + // the same time, so instead, we spin up a goroutine to check if the + // request is canceled while we wait for a slot to open in the connection. + if waitingForConn == nil { + waitingForConn = make(chan struct{}) + go func() { + if err := awaitRequestCancel(req, waitingForConn); err != nil { + cc.mu.Lock() + waitingForConnErr = err + cc.cond.Broadcast() + cc.mu.Unlock() + } + }() + } + cc.pendingRequests++ + cc.cond.Wait() + cc.pendingRequests-- + if waitingForConnErr != nil { + return waitingForConnErr + } + } +} + +// requires cc.wmu be held +func (cc *ClientConn) writeHeaders(streamID uint32, endStream bool, hdrs []byte) error { + first := true // first frame written (HEADERS is first, then CONTINUATION) + frameSize := int(cc.maxFrameSize) + for len(hdrs) > 0 && cc.werr == nil { + chunk := hdrs + if len(chunk) > frameSize { + chunk = chunk[:frameSize] + } + hdrs = hdrs[len(chunk):] + endHeaders := len(hdrs) == 0 + if first { + cc.fr.WriteHeaders(HeadersFrameParam{ + StreamID: streamID, + BlockFragment: chunk, + EndStream: endStream, + EndHeaders: endHeaders, + }) + first = false + } else { + cc.fr.WriteContinuation(streamID, endHeaders, chunk) + } + } + // TODO(bradfitz): this Flush could potentially block (as + // could the WriteHeaders call(s) above), which means they + // wouldn't respond to Request.Cancel being readable. That's + // rare, but this should probably be in a goroutine. + cc.bw.Flush() + return cc.werr +} + +// internal error values; they don't escape to callers +var ( + // abort request body write; don't send cancel + errStopReqBodyWrite = errors.New("http2: aborting request body write") + + // abort request body write, but send stream reset of cancel. + errStopReqBodyWriteAndCancel = errors.New("http2: canceling request") +) + +func (cs *clientStream) writeRequestBody(body io.Reader, bodyCloser io.Closer) (err error) { + cc := cs.cc + sentEnd := false // whether we sent the final DATA frame w/ END_STREAM + buf := cc.frameScratchBuffer() + defer cc.putFrameScratchBuffer(buf) + + defer func() { + traceWroteRequest(cs.trace, err) + // TODO: write h12Compare test showing whether + // Request.Body is closed by the Transport, + // and in multiple cases: server replies <=299 and >299 + // while still writing request body + cerr := bodyCloser.Close() + if err == nil { + err = cerr + } + }() + + req := cs.req + hasTrailers := req.Trailer != nil + + var sawEOF bool + for !sawEOF { + n, err := body.Read(buf) + if err == io.EOF { + sawEOF = true + err = nil + } else if err != nil { + return err + } + + remain := buf[:n] + for len(remain) > 0 && err == nil { + var allowed int32 + allowed, err = cs.awaitFlowControl(len(remain)) + switch { + case err == errStopReqBodyWrite: + return err + case err == errStopReqBodyWriteAndCancel: + cc.writeStreamReset(cs.ID, ErrCodeCancel, nil) + return err + case err != nil: + return err + } + cc.wmu.Lock() + data := remain[:allowed] + remain = remain[allowed:] + sentEnd = sawEOF && len(remain) == 0 && !hasTrailers + err = cc.fr.WriteData(cs.ID, sentEnd, data) + if err == nil { + // TODO(bradfitz): this flush is for latency, not bandwidth. + // Most requests won't need this. Make this opt-in or + // opt-out? Use some heuristic on the body type? Nagel-like + // timers? Based on 'n'? Only last chunk of this for loop, + // unless flow control tokens are low? For now, always. + // If we change this, see comment below. + err = cc.bw.Flush() + } + cc.wmu.Unlock() + } + if err != nil { + return err + } + } + + if sentEnd { + // Already sent END_STREAM (which implies we have no + // trailers) and flushed, because currently all + // WriteData frames above get a flush. So we're done. + return nil + } + + var trls []byte + if hasTrailers { + cc.mu.Lock() + trls, err = cc.encodeTrailers(req) + cc.mu.Unlock() + if err != nil { + cc.writeStreamReset(cs.ID, ErrCodeInternal, err) + cc.forgetStreamID(cs.ID) + return err + } + } + + cc.wmu.Lock() + defer cc.wmu.Unlock() + + // Two ways to send END_STREAM: either with trailers, or + // with an empty DATA frame. + if len(trls) > 0 { + err = cc.writeHeaders(cs.ID, true, trls) + } else { + err = cc.fr.WriteData(cs.ID, true, nil) + } + if ferr := cc.bw.Flush(); ferr != nil && err == nil { + err = ferr + } + return err +} + +// awaitFlowControl waits for [1, min(maxBytes, cc.cs.maxFrameSize)] flow +// control tokens from the server. +// It returns either the non-zero number of tokens taken or an error +// if the stream is dead. +func (cs *clientStream) awaitFlowControl(maxBytes int) (taken int32, err error) { + cc := cs.cc + cc.mu.Lock() + defer cc.mu.Unlock() + for { + if cc.closed { + return 0, errClientConnClosed + } + if cs.stopReqBody != nil { + return 0, cs.stopReqBody + } + if err := cs.checkResetOrDone(); err != nil { + return 0, err + } + if a := cs.flow.available(); a > 0 { + take := a + if int(take) > maxBytes { + + take = int32(maxBytes) // can't truncate int; take is int32 + } + if take > int32(cc.maxFrameSize) { + take = int32(cc.maxFrameSize) + } + cs.flow.take(take) + return take, nil + } + cc.cond.Wait() + } +} + +type badStringError struct { + what string + str string +} + +func (e *badStringError) Error() string { return fmt.Sprintf("%s %q", e.what, e.str) } + +// requires cc.mu be held. +func (cc *ClientConn) encodeHeaders(req *http.Request, addGzipHeader bool, trailers string, contentLength int64) ([]byte, error) { + cc.hbuf.Reset() + + host := req.Host + if host == "" { + host = req.URL.Host + } + host, err := httplex.PunycodeHostPort(host) + if err != nil { + return nil, err + } + + var path string + if req.Method != "CONNECT" { + path = req.URL.RequestURI() + if !validPseudoPath(path) { + orig := path + path = strings.TrimPrefix(path, req.URL.Scheme+"://"+host) + if !validPseudoPath(path) { + if req.URL.Opaque != "" { + return nil, fmt.Errorf("invalid request :path %q from URL.Opaque = %q", orig, req.URL.Opaque) + } else { + return nil, fmt.Errorf("invalid request :path %q", orig) + } + } + } + } + + // Check for any invalid headers and return an error before we + // potentially pollute our hpack state. (We want to be able to + // continue to reuse the hpack encoder for future requests) + for k, vv := range req.Header { + if !httplex.ValidHeaderFieldName(k) { + return nil, fmt.Errorf("invalid HTTP header name %q", k) + } + for _, v := range vv { + if !httplex.ValidHeaderFieldValue(v) { + return nil, fmt.Errorf("invalid HTTP header value %q for header %q", v, k) + } + } + } + + enumerateHeaders := func(f func(name, value string)) { + // 8.1.2.3 Request Pseudo-Header Fields + // The :path pseudo-header field includes the path and query parts of the + // target URI (the path-absolute production and optionally a '?' character + // followed by the query production (see Sections 3.3 and 3.4 of + // [RFC3986]). + f(":authority", host) + f(":method", req.Method) + if req.Method != "CONNECT" { + f(":path", path) + f(":scheme", req.URL.Scheme) + } + if trailers != "" { + f("trailer", trailers) + } + + var didUA bool + for k, vv := range req.Header { + if strings.EqualFold(k, "host") || strings.EqualFold(k, "content-length") { + // Host is :authority, already sent. + // Content-Length is automatic, set below. + continue + } else if strings.EqualFold(k, "connection") || strings.EqualFold(k, "proxy-connection") || + strings.EqualFold(k, "transfer-encoding") || strings.EqualFold(k, "upgrade") || + strings.EqualFold(k, "keep-alive") { + // Per 8.1.2.2 Connection-Specific Header + // Fields, don't send connection-specific + // fields. We have already checked if any + // are error-worthy so just ignore the rest. + continue + } else if strings.EqualFold(k, "user-agent") { + // Match Go's http1 behavior: at most one + // User-Agent. If set to nil or empty string, + // then omit it. Otherwise if not mentioned, + // include the default (below). + didUA = true + if len(vv) < 1 { + continue + } + vv = vv[:1] + if vv[0] == "" { + continue + } + + } + + for _, v := range vv { + f(k, v) + } + } + if shouldSendReqContentLength(req.Method, contentLength) { + f("content-length", strconv.FormatInt(contentLength, 10)) + } + if addGzipHeader { + f("accept-encoding", "gzip") + } + if !didUA { + f("user-agent", defaultUserAgent) + } + } + + // Do a first pass over the headers counting bytes to ensure + // we don't exceed cc.peerMaxHeaderListSize. This is done as a + // separate pass before encoding the headers to prevent + // modifying the hpack state. + hlSize := uint64(0) + enumerateHeaders(func(name, value string) { + hf := hpack.HeaderField{Name: name, Value: value} + hlSize += uint64(hf.Size()) + }) + + if hlSize > cc.peerMaxHeaderListSize { + return nil, errRequestHeaderListSize + } + + // Header list size is ok. Write the headers. + enumerateHeaders(func(name, value string) { + cc.writeHeader(strings.ToLower(name), value) + }) + + return cc.hbuf.Bytes(), nil +} + +// shouldSendReqContentLength reports whether the http2.Transport should send +// a "content-length" request header. This logic is basically a copy of the net/http +// transferWriter.shouldSendContentLength. +// The contentLength is the corrected contentLength (so 0 means actually 0, not unknown). +// -1 means unknown. +func shouldSendReqContentLength(method string, contentLength int64) bool { + if contentLength > 0 { + return true + } + if contentLength < 0 { + return false + } + // For zero bodies, whether we send a content-length depends on the method. + // It also kinda doesn't matter for http2 either way, with END_STREAM. + switch method { + case "POST", "PUT", "PATCH": + return true + default: + return false + } +} + +// requires cc.mu be held. +func (cc *ClientConn) encodeTrailers(req *http.Request) ([]byte, error) { + cc.hbuf.Reset() + + hlSize := uint64(0) + for k, vv := range req.Trailer { + for _, v := range vv { + hf := hpack.HeaderField{Name: k, Value: v} + hlSize += uint64(hf.Size()) + } + } + if hlSize > cc.peerMaxHeaderListSize { + return nil, errRequestHeaderListSize + } + + for k, vv := range req.Trailer { + // Transfer-Encoding, etc.. have already been filtered at the + // start of RoundTrip + lowKey := strings.ToLower(k) + for _, v := range vv { + cc.writeHeader(lowKey, v) + } + } + return cc.hbuf.Bytes(), nil +} + +func (cc *ClientConn) writeHeader(name, value string) { + if VerboseLogs { + log.Printf("http2: Transport encoding header %q = %q", name, value) + } + cc.henc.WriteField(hpack.HeaderField{Name: name, Value: value}) +} + +type resAndError struct { + res *http.Response + err error +} + +// requires cc.mu be held. +func (cc *ClientConn) newStream() *clientStream { + cs := &clientStream{ + cc: cc, + ID: cc.nextStreamID, + resc: make(chan resAndError, 1), + peerReset: make(chan struct{}), + done: make(chan struct{}), + } + cs.flow.add(int32(cc.initialWindowSize)) + cs.flow.setConnFlow(&cc.flow) + cs.inflow.add(transportDefaultStreamFlow) + cs.inflow.setConnFlow(&cc.inflow) + cc.nextStreamID += 2 + cc.streams[cs.ID] = cs + return cs +} + +func (cc *ClientConn) forgetStreamID(id uint32) { + cc.streamByID(id, true) +} + +func (cc *ClientConn) streamByID(id uint32, andRemove bool) *clientStream { + cc.mu.Lock() + defer cc.mu.Unlock() + cs := cc.streams[id] + if andRemove && cs != nil && !cc.closed { + cc.lastActive = time.Now() + delete(cc.streams, id) + if len(cc.streams) == 0 && cc.idleTimer != nil { + cc.idleTimer.Reset(cc.idleTimeout) + } + close(cs.done) + // Wake up checkResetOrDone via clientStream.awaitFlowControl and + // wake up RoundTrip if there is a pending request. + cc.cond.Broadcast() + } + return cs +} + +// clientConnReadLoop is the state owned by the clientConn's frame-reading readLoop. +type clientConnReadLoop struct { + cc *ClientConn + activeRes map[uint32]*clientStream // keyed by streamID + closeWhenIdle bool +} + +// readLoop runs in its own goroutine and reads and dispatches frames. +func (cc *ClientConn) readLoop() { + rl := &clientConnReadLoop{ + cc: cc, + activeRes: make(map[uint32]*clientStream), + } + + defer rl.cleanup() + cc.readerErr = rl.run() + if ce, ok := cc.readerErr.(ConnectionError); ok { + cc.wmu.Lock() + cc.fr.WriteGoAway(0, ErrCode(ce), nil) + cc.wmu.Unlock() + } +} + +// GoAwayError is returned by the Transport when the server closes the +// TCP connection after sending a GOAWAY frame. +type GoAwayError struct { + LastStreamID uint32 + ErrCode ErrCode + DebugData string +} + +func (e GoAwayError) Error() string { + return fmt.Sprintf("http2: server sent GOAWAY and closed the connection; LastStreamID=%v, ErrCode=%v, debug=%q", + e.LastStreamID, e.ErrCode, e.DebugData) +} + +func isEOFOrNetReadError(err error) bool { + if err == io.EOF { + return true + } + ne, ok := err.(*net.OpError) + return ok && ne.Op == "read" +} + +func (rl *clientConnReadLoop) cleanup() { + cc := rl.cc + defer cc.tconn.Close() + defer cc.t.connPool().MarkDead(cc) + defer close(cc.readerDone) + + if cc.idleTimer != nil { + cc.idleTimer.Stop() + } + + // Close any response bodies if the server closes prematurely. + // TODO: also do this if we've written the headers but not + // gotten a response yet. + err := cc.readerErr + cc.mu.Lock() + if cc.goAway != nil && isEOFOrNetReadError(err) { + err = GoAwayError{ + LastStreamID: cc.goAway.LastStreamID, + ErrCode: cc.goAway.ErrCode, + DebugData: cc.goAwayDebug, + } + } else if err == io.EOF { + err = io.ErrUnexpectedEOF + } + for _, cs := range rl.activeRes { + cs.bufPipe.CloseWithError(err) + } + for _, cs := range cc.streams { + select { + case cs.resc <- resAndError{err: err}: + default: + } + close(cs.done) + } + cc.closed = true + cc.cond.Broadcast() + cc.mu.Unlock() +} + +func (rl *clientConnReadLoop) run() error { + cc := rl.cc + rl.closeWhenIdle = cc.t.disableKeepAlives() || cc.singleUse + gotReply := false // ever saw a HEADERS reply + gotSettings := false + for { + f, err := cc.fr.ReadFrame() + if err != nil { + cc.vlogf("http2: Transport readFrame error on conn %p: (%T) %v", cc, err, err) + } + if se, ok := err.(StreamError); ok { + if cs := cc.streamByID(se.StreamID, false); cs != nil { + cs.cc.writeStreamReset(cs.ID, se.Code, err) + cs.cc.forgetStreamID(cs.ID) + if se.Cause == nil { + se.Cause = cc.fr.errDetail + } + rl.endStreamError(cs, se) + } + continue + } else if err != nil { + return err + } + if VerboseLogs { + cc.vlogf("http2: Transport received %s", summarizeFrame(f)) + } + if !gotSettings { + if _, ok := f.(*SettingsFrame); !ok { + cc.logf("protocol error: received %T before a SETTINGS frame", f) + return ConnectionError(ErrCodeProtocol) + } + gotSettings = true + } + maybeIdle := false // whether frame might transition us to idle + + switch f := f.(type) { + case *MetaHeadersFrame: + err = rl.processHeaders(f) + maybeIdle = true + gotReply = true + case *DataFrame: + err = rl.processData(f) + maybeIdle = true + case *GoAwayFrame: + err = rl.processGoAway(f) + maybeIdle = true + case *RSTStreamFrame: + err = rl.processResetStream(f) + maybeIdle = true + case *SettingsFrame: + err = rl.processSettings(f) + case *PushPromiseFrame: + err = rl.processPushPromise(f) + case *WindowUpdateFrame: + err = rl.processWindowUpdate(f) + case *PingFrame: + err = rl.processPing(f) + default: + cc.logf("Transport: unhandled response frame type %T", f) + } + if err != nil { + if VerboseLogs { + cc.vlogf("http2: Transport conn %p received error from processing frame %v: %v", cc, summarizeFrame(f), err) + } + return err + } + if rl.closeWhenIdle && gotReply && maybeIdle && len(rl.activeRes) == 0 { + cc.closeIfIdle() + } + } +} + +func (rl *clientConnReadLoop) processHeaders(f *MetaHeadersFrame) error { + cc := rl.cc + cs := cc.streamByID(f.StreamID, f.StreamEnded()) + if cs == nil { + // We'd get here if we canceled a request while the + // server had its response still in flight. So if this + // was just something we canceled, ignore it. + return nil + } + if !cs.firstByte { + if cs.trace != nil { + // TODO(bradfitz): move first response byte earlier, + // when we first read the 9 byte header, not waiting + // until all the HEADERS+CONTINUATION frames have been + // merged. This works for now. + traceFirstResponseByte(cs.trace) + } + cs.firstByte = true + } + if !cs.pastHeaders { + cs.pastHeaders = true + } else { + return rl.processTrailers(cs, f) + } + + res, err := rl.handleResponse(cs, f) + if err != nil { + if _, ok := err.(ConnectionError); ok { + return err + } + // Any other error type is a stream error. + cs.cc.writeStreamReset(f.StreamID, ErrCodeProtocol, err) + cs.resc <- resAndError{err: err} + return nil // return nil from process* funcs to keep conn alive + } + if res == nil { + // (nil, nil) special case. See handleResponse docs. + return nil + } + if res.Body != noBody { + rl.activeRes[cs.ID] = cs + } + cs.resTrailer = &res.Trailer + cs.resc <- resAndError{res: res} + return nil +} + +// may return error types nil, or ConnectionError. Any other error value +// is a StreamError of type ErrCodeProtocol. The returned error in that case +// is the detail. +// +// As a special case, handleResponse may return (nil, nil) to skip the +// frame (currently only used for 100 expect continue). This special +// case is going away after Issue 13851 is fixed. +func (rl *clientConnReadLoop) handleResponse(cs *clientStream, f *MetaHeadersFrame) (*http.Response, error) { + if f.Truncated { + return nil, errResponseHeaderListSize + } + + status := f.PseudoValue("status") + if status == "" { + return nil, errors.New("missing status pseudo header") + } + statusCode, err := strconv.Atoi(status) + if err != nil { + return nil, errors.New("malformed non-numeric status pseudo header") + } + + if statusCode == 100 { + traceGot100Continue(cs.trace) + if cs.on100 != nil { + cs.on100() // forces any write delay timer to fire + } + cs.pastHeaders = false // do it all again + return nil, nil + } + + header := make(http.Header) + res := &http.Response{ + Proto: "HTTP/2.0", + ProtoMajor: 2, + Header: header, + StatusCode: statusCode, + Status: status + " " + http.StatusText(statusCode), + } + for _, hf := range f.RegularFields() { + key := http.CanonicalHeaderKey(hf.Name) + if key == "Trailer" { + t := res.Trailer + if t == nil { + t = make(http.Header) + res.Trailer = t + } + foreachHeaderElement(hf.Value, func(v string) { + t[http.CanonicalHeaderKey(v)] = nil + }) + } else { + header[key] = append(header[key], hf.Value) + } + } + + streamEnded := f.StreamEnded() + isHead := cs.req.Method == "HEAD" + if !streamEnded || isHead { + res.ContentLength = -1 + if clens := res.Header["Content-Length"]; len(clens) == 1 { + if clen64, err := strconv.ParseInt(clens[0], 10, 64); err == nil { + res.ContentLength = clen64 + } else { + // TODO: care? unlike http/1, it won't mess up our framing, so it's + // more safe smuggling-wise to ignore. + } + } else if len(clens) > 1 { + // TODO: care? unlike http/1, it won't mess up our framing, so it's + // more safe smuggling-wise to ignore. + } + } + + if streamEnded || isHead { + res.Body = noBody + return res, nil + } + + cs.bufPipe = pipe{b: &dataBuffer{expected: res.ContentLength}} + cs.bytesRemain = res.ContentLength + res.Body = transportResponseBody{cs} + go cs.awaitRequestCancel(cs.req) + + if cs.requestedGzip && res.Header.Get("Content-Encoding") == "gzip" { + res.Header.Del("Content-Encoding") + res.Header.Del("Content-Length") + res.ContentLength = -1 + res.Body = &gzipReader{body: res.Body} + setResponseUncompressed(res) + } + return res, nil +} + +func (rl *clientConnReadLoop) processTrailers(cs *clientStream, f *MetaHeadersFrame) error { + if cs.pastTrailers { + // Too many HEADERS frames for this stream. + return ConnectionError(ErrCodeProtocol) + } + cs.pastTrailers = true + if !f.StreamEnded() { + // We expect that any headers for trailers also + // has END_STREAM. + return ConnectionError(ErrCodeProtocol) + } + if len(f.PseudoFields()) > 0 { + // No pseudo header fields are defined for trailers. + // TODO: ConnectionError might be overly harsh? Check. + return ConnectionError(ErrCodeProtocol) + } + + trailer := make(http.Header) + for _, hf := range f.RegularFields() { + key := http.CanonicalHeaderKey(hf.Name) + trailer[key] = append(trailer[key], hf.Value) + } + cs.trailer = trailer + + rl.endStream(cs) + return nil +} + +// transportResponseBody is the concrete type of Transport.RoundTrip's +// Response.Body. It is an io.ReadCloser. On Read, it reads from cs.body. +// On Close it sends RST_STREAM if EOF wasn't already seen. +type transportResponseBody struct { + cs *clientStream +} + +func (b transportResponseBody) Read(p []byte) (n int, err error) { + cs := b.cs + cc := cs.cc + + if cs.readErr != nil { + return 0, cs.readErr + } + n, err = b.cs.bufPipe.Read(p) + if cs.bytesRemain != -1 { + if int64(n) > cs.bytesRemain { + n = int(cs.bytesRemain) + if err == nil { + err = errors.New("net/http: server replied with more than declared Content-Length; truncated") + cc.writeStreamReset(cs.ID, ErrCodeProtocol, err) + } + cs.readErr = err + return int(cs.bytesRemain), err + } + cs.bytesRemain -= int64(n) + if err == io.EOF && cs.bytesRemain > 0 { + err = io.ErrUnexpectedEOF + cs.readErr = err + return n, err + } + } + if n == 0 { + // No flow control tokens to send back. + return + } + + cc.mu.Lock() + defer cc.mu.Unlock() + + var connAdd, streamAdd int32 + // Check the conn-level first, before the stream-level. + if v := cc.inflow.available(); v < transportDefaultConnFlow/2 { + connAdd = transportDefaultConnFlow - v + cc.inflow.add(connAdd) + } + if err == nil { // No need to refresh if the stream is over or failed. + // Consider any buffered body data (read from the conn but not + // consumed by the client) when computing flow control for this + // stream. + v := int(cs.inflow.available()) + cs.bufPipe.Len() + if v < transportDefaultStreamFlow-transportDefaultStreamMinRefresh { + streamAdd = int32(transportDefaultStreamFlow - v) + cs.inflow.add(streamAdd) + } + } + if connAdd != 0 || streamAdd != 0 { + cc.wmu.Lock() + defer cc.wmu.Unlock() + if connAdd != 0 { + cc.fr.WriteWindowUpdate(0, mustUint31(connAdd)) + } + if streamAdd != 0 { + cc.fr.WriteWindowUpdate(cs.ID, mustUint31(streamAdd)) + } + cc.bw.Flush() + } + return +} + +var errClosedResponseBody = errors.New("http2: response body closed") + +func (b transportResponseBody) Close() error { + cs := b.cs + cc := cs.cc + + serverSentStreamEnd := cs.bufPipe.Err() == io.EOF + unread := cs.bufPipe.Len() + + if unread > 0 || !serverSentStreamEnd { + cc.mu.Lock() + cc.wmu.Lock() + if !serverSentStreamEnd { + cc.fr.WriteRSTStream(cs.ID, ErrCodeCancel) + cs.didReset = true + } + // Return connection-level flow control. + if unread > 0 { + cc.inflow.add(int32(unread)) + cc.fr.WriteWindowUpdate(0, uint32(unread)) + } + cc.bw.Flush() + cc.wmu.Unlock() + cc.mu.Unlock() + } + + cs.bufPipe.BreakWithError(errClosedResponseBody) + cc.forgetStreamID(cs.ID) + return nil +} + +func (rl *clientConnReadLoop) processData(f *DataFrame) error { + cc := rl.cc + cs := cc.streamByID(f.StreamID, f.StreamEnded()) + data := f.Data() + if cs == nil { + cc.mu.Lock() + neverSent := cc.nextStreamID + cc.mu.Unlock() + if f.StreamID >= neverSent { + // We never asked for this. + cc.logf("http2: Transport received unsolicited DATA frame; closing connection") + return ConnectionError(ErrCodeProtocol) + } + // We probably did ask for this, but canceled. Just ignore it. + // TODO: be stricter here? only silently ignore things which + // we canceled, but not things which were closed normally + // by the peer? Tough without accumulating too much state. + + // But at least return their flow control: + if f.Length > 0 { + cc.mu.Lock() + cc.inflow.add(int32(f.Length)) + cc.mu.Unlock() + + cc.wmu.Lock() + cc.fr.WriteWindowUpdate(0, uint32(f.Length)) + cc.bw.Flush() + cc.wmu.Unlock() + } + return nil + } + if !cs.firstByte { + cc.logf("protocol error: received DATA before a HEADERS frame") + rl.endStreamError(cs, StreamError{ + StreamID: f.StreamID, + Code: ErrCodeProtocol, + }) + return nil + } + if f.Length > 0 { + // Check connection-level flow control. + cc.mu.Lock() + if cs.inflow.available() >= int32(f.Length) { + cs.inflow.take(int32(f.Length)) + } else { + cc.mu.Unlock() + return ConnectionError(ErrCodeFlowControl) + } + // Return any padded flow control now, since we won't + // refund it later on body reads. + var refund int + if pad := int(f.Length) - len(data); pad > 0 { + refund += pad + } + // Return len(data) now if the stream is already closed, + // since data will never be read. + didReset := cs.didReset + if didReset { + refund += len(data) + } + if refund > 0 { + cc.inflow.add(int32(refund)) + cc.wmu.Lock() + cc.fr.WriteWindowUpdate(0, uint32(refund)) + if !didReset { + cs.inflow.add(int32(refund)) + cc.fr.WriteWindowUpdate(cs.ID, uint32(refund)) + } + cc.bw.Flush() + cc.wmu.Unlock() + } + cc.mu.Unlock() + + if len(data) > 0 && !didReset { + if _, err := cs.bufPipe.Write(data); err != nil { + rl.endStreamError(cs, err) + return err + } + } + } + + if f.StreamEnded() { + rl.endStream(cs) + } + return nil +} + +var errInvalidTrailers = errors.New("http2: invalid trailers") + +func (rl *clientConnReadLoop) endStream(cs *clientStream) { + // TODO: check that any declared content-length matches, like + // server.go's (*stream).endStream method. + rl.endStreamError(cs, nil) +} + +func (rl *clientConnReadLoop) endStreamError(cs *clientStream, err error) { + var code func() + if err == nil { + err = io.EOF + code = cs.copyTrailers + } + cs.bufPipe.closeWithErrorAndCode(err, code) + delete(rl.activeRes, cs.ID) + if isConnectionCloseRequest(cs.req) { + rl.closeWhenIdle = true + } + + select { + case cs.resc <- resAndError{err: err}: + default: + } +} + +func (cs *clientStream) copyTrailers() { + for k, vv := range cs.trailer { + t := cs.resTrailer + if *t == nil { + *t = make(http.Header) + } + (*t)[k] = vv + } +} + +func (rl *clientConnReadLoop) processGoAway(f *GoAwayFrame) error { + cc := rl.cc + cc.t.connPool().MarkDead(cc) + if f.ErrCode != 0 { + // TODO: deal with GOAWAY more. particularly the error code + cc.vlogf("transport got GOAWAY with error code = %v", f.ErrCode) + } + cc.setGoAway(f) + return nil +} + +func (rl *clientConnReadLoop) processSettings(f *SettingsFrame) error { + cc := rl.cc + cc.mu.Lock() + defer cc.mu.Unlock() + + if f.IsAck() { + if cc.wantSettingsAck { + cc.wantSettingsAck = false + return nil + } + return ConnectionError(ErrCodeProtocol) + } + + err := f.ForeachSetting(func(s Setting) error { + switch s.ID { + case SettingMaxFrameSize: + cc.maxFrameSize = s.Val + case SettingMaxConcurrentStreams: + cc.maxConcurrentStreams = s.Val + case SettingMaxHeaderListSize: + cc.peerMaxHeaderListSize = uint64(s.Val) + case SettingInitialWindowSize: + // Values above the maximum flow-control + // window size of 2^31-1 MUST be treated as a + // connection error (Section 5.4.1) of type + // FLOW_CONTROL_ERROR. + if s.Val > math.MaxInt32 { + return ConnectionError(ErrCodeFlowControl) + } + + // Adjust flow control of currently-open + // frames by the difference of the old initial + // window size and this one. + delta := int32(s.Val) - int32(cc.initialWindowSize) + for _, cs := range cc.streams { + cs.flow.add(delta) + } + cc.cond.Broadcast() + + cc.initialWindowSize = s.Val + default: + // TODO(bradfitz): handle more settings? SETTINGS_HEADER_TABLE_SIZE probably. + cc.vlogf("Unhandled Setting: %v", s) + } + return nil + }) + if err != nil { + return err + } + + cc.wmu.Lock() + defer cc.wmu.Unlock() + + cc.fr.WriteSettingsAck() + cc.bw.Flush() + return cc.werr +} + +func (rl *clientConnReadLoop) processWindowUpdate(f *WindowUpdateFrame) error { + cc := rl.cc + cs := cc.streamByID(f.StreamID, false) + if f.StreamID != 0 && cs == nil { + return nil + } + + cc.mu.Lock() + defer cc.mu.Unlock() + + fl := &cc.flow + if cs != nil { + fl = &cs.flow + } + if !fl.add(int32(f.Increment)) { + return ConnectionError(ErrCodeFlowControl) + } + cc.cond.Broadcast() + return nil +} + +func (rl *clientConnReadLoop) processResetStream(f *RSTStreamFrame) error { + cs := rl.cc.streamByID(f.StreamID, true) + if cs == nil { + // TODO: return error if server tries to RST_STEAM an idle stream + return nil + } + select { + case <-cs.peerReset: + // Already reset. + // This is the only goroutine + // which closes this, so there + // isn't a race. + default: + err := streamError(cs.ID, f.ErrCode) + cs.resetErr = err + close(cs.peerReset) + cs.bufPipe.CloseWithError(err) + cs.cc.cond.Broadcast() // wake up checkResetOrDone via clientStream.awaitFlowControl + } + delete(rl.activeRes, cs.ID) + return nil +} + +// Ping sends a PING frame to the server and waits for the ack. +// Public implementation is in go17.go and not_go17.go +func (cc *ClientConn) ping(ctx contextContext) error { + c := make(chan struct{}) + // Generate a random payload + var p [8]byte + for { + if _, err := rand.Read(p[:]); err != nil { + return err + } + cc.mu.Lock() + // check for dup before insert + if _, found := cc.pings[p]; !found { + cc.pings[p] = c + cc.mu.Unlock() + break + } + cc.mu.Unlock() + } + cc.wmu.Lock() + if err := cc.fr.WritePing(false, p); err != nil { + cc.wmu.Unlock() + return err + } + if err := cc.bw.Flush(); err != nil { + cc.wmu.Unlock() + return err + } + cc.wmu.Unlock() + select { + case <-c: + return nil + case <-ctx.Done(): + return ctx.Err() + case <-cc.readerDone: + // connection closed + return cc.readerErr + } +} + +func (rl *clientConnReadLoop) processPing(f *PingFrame) error { + if f.IsAck() { + cc := rl.cc + cc.mu.Lock() + defer cc.mu.Unlock() + // If ack, notify listener if any + if c, ok := cc.pings[f.Data]; ok { + close(c) + delete(cc.pings, f.Data) + } + return nil + } + cc := rl.cc + cc.wmu.Lock() + defer cc.wmu.Unlock() + if err := cc.fr.WritePing(true, f.Data); err != nil { + return err + } + return cc.bw.Flush() +} + +func (rl *clientConnReadLoop) processPushPromise(f *PushPromiseFrame) error { + // We told the peer we don't want them. + // Spec says: + // "PUSH_PROMISE MUST NOT be sent if the SETTINGS_ENABLE_PUSH + // setting of the peer endpoint is set to 0. An endpoint that + // has set this setting and has received acknowledgement MUST + // treat the receipt of a PUSH_PROMISE frame as a connection + // error (Section 5.4.1) of type PROTOCOL_ERROR." + return ConnectionError(ErrCodeProtocol) +} + +func (cc *ClientConn) writeStreamReset(streamID uint32, code ErrCode, err error) { + // TODO: map err to more interesting error codes, once the + // HTTP community comes up with some. But currently for + // RST_STREAM there's no equivalent to GOAWAY frame's debug + // data, and the error codes are all pretty vague ("cancel"). + cc.wmu.Lock() + cc.fr.WriteRSTStream(streamID, code) + cc.bw.Flush() + cc.wmu.Unlock() +} + +var ( + errResponseHeaderListSize = errors.New("http2: response header list larger than advertised limit") + errRequestHeaderListSize = errors.New("http2: request header list larger than peer's advertised limit") + errPseudoTrailers = errors.New("http2: invalid pseudo header in trailers") +) + +func (cc *ClientConn) logf(format string, args ...interface{}) { + cc.t.logf(format, args...) +} + +func (cc *ClientConn) vlogf(format string, args ...interface{}) { + cc.t.vlogf(format, args...) +} + +func (t *Transport) vlogf(format string, args ...interface{}) { + if VerboseLogs { + t.logf(format, args...) + } +} + +func (t *Transport) logf(format string, args ...interface{}) { + log.Printf(format, args...) +} + +var noBody io.ReadCloser = ioutil.NopCloser(bytes.NewReader(nil)) + +func strSliceContains(ss []string, s string) bool { + for _, v := range ss { + if v == s { + return true + } + } + return false +} + +type erringRoundTripper struct{ err error } + +func (rt erringRoundTripper) RoundTrip(*http.Request) (*http.Response, error) { return nil, rt.err } + +// gzipReader wraps a response body so it can lazily +// call gzip.NewReader on the first call to Read +type gzipReader struct { + body io.ReadCloser // underlying Response.Body + zr *gzip.Reader // lazily-initialized gzip reader + zerr error // sticky error +} + +func (gz *gzipReader) Read(p []byte) (n int, err error) { + if gz.zerr != nil { + return 0, gz.zerr + } + if gz.zr == nil { + gz.zr, err = gzip.NewReader(gz.body) + if err != nil { + gz.zerr = err + return 0, err + } + } + return gz.zr.Read(p) +} + +func (gz *gzipReader) Close() error { + return gz.body.Close() +} + +type errorReader struct{ err error } + +func (r errorReader) Read(p []byte) (int, error) { return 0, r.err } + +// bodyWriterState encapsulates various state around the Transport's writing +// of the request body, particularly regarding doing delayed writes of the body +// when the request contains "Expect: 100-continue". +type bodyWriterState struct { + cs *clientStream + timer *time.Timer // if non-nil, we're doing a delayed write + fnonce *sync.Once // to call fn with + fn func() // the code to run in the goroutine, writing the body + resc chan error // result of fn's execution + delay time.Duration // how long we should delay a delayed write for +} + +func (t *Transport) getBodyWriterState(cs *clientStream, body io.Reader) (s bodyWriterState) { + s.cs = cs + if body == nil { + return + } + resc := make(chan error, 1) + s.resc = resc + s.fn = func() { + cs.cc.mu.Lock() + cs.startedWrite = true + cs.cc.mu.Unlock() + resc <- cs.writeRequestBody(body, cs.req.Body) + } + s.delay = t.expectContinueTimeout() + if s.delay == 0 || + !httplex.HeaderValuesContainsToken( + cs.req.Header["Expect"], + "100-continue") { + return + } + s.fnonce = new(sync.Once) + + // Arm the timer with a very large duration, which we'll + // intentionally lower later. It has to be large now because + // we need a handle to it before writing the headers, but the + // s.delay value is defined to not start until after the + // request headers were written. + const hugeDuration = 365 * 24 * time.Hour + s.timer = time.AfterFunc(hugeDuration, func() { + s.fnonce.Do(s.fn) + }) + return +} + +func (s bodyWriterState) cancel() { + if s.timer != nil { + s.timer.Stop() + } +} + +func (s bodyWriterState) on100() { + if s.timer == nil { + // If we didn't do a delayed write, ignore the server's + // bogus 100 continue response. + return + } + s.timer.Stop() + go func() { s.fnonce.Do(s.fn) }() +} + +// scheduleBodyWrite starts writing the body, either immediately (in +// the common case) or after the delay timeout. It should not be +// called until after the headers have been written. +func (s bodyWriterState) scheduleBodyWrite() { + if s.timer == nil { + // We're not doing a delayed write (see + // getBodyWriterState), so just start the writing + // goroutine immediately. + go s.fn() + return + } + traceWait100Continue(s.cs.trace) + if s.timer.Stop() { + s.timer.Reset(s.delay) + } +} + +// isConnectionCloseRequest reports whether req should use its own +// connection for a single request and then close the connection. +func isConnectionCloseRequest(req *http.Request) bool { + return req.Close || httplex.HeaderValuesContainsToken(req.Header["Connection"], "close") +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/transport_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/transport_test.go new file mode 100644 index 0000000..0126ff4 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/transport_test.go @@ -0,0 +1,3686 @@ +// Copyright 2015 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 http2 + +import ( + "bufio" + "bytes" + "crypto/tls" + "errors" + "flag" + "fmt" + "io" + "io/ioutil" + "math/rand" + "net" + "net/http" + "net/http/httptest" + "net/url" + "os" + "reflect" + "runtime" + "sort" + "strconv" + "strings" + "sync" + "sync/atomic" + "testing" + "time" + + "golang.org/x/net/http2/hpack" +) + +var ( + extNet = flag.Bool("extnet", false, "do external network tests") + transportHost = flag.String("transporthost", "http2.golang.org", "hostname to use for TestTransport") + insecure = flag.Bool("insecure", false, "insecure TLS dials") // TODO: dead code. remove? +) + +var tlsConfigInsecure = &tls.Config{InsecureSkipVerify: true} + +type testContext struct{} + +func (testContext) Done() <-chan struct{} { return make(chan struct{}) } +func (testContext) Err() error { panic("should not be called") } +func (testContext) Deadline() (deadline time.Time, ok bool) { return time.Time{}, false } +func (testContext) Value(key interface{}) interface{} { return nil } + +func TestTransportExternal(t *testing.T) { + if !*extNet { + t.Skip("skipping external network test") + } + req, _ := http.NewRequest("GET", "https://"+*transportHost+"/", nil) + rt := &Transport{TLSClientConfig: tlsConfigInsecure} + res, err := rt.RoundTrip(req) + if err != nil { + t.Fatalf("%v", err) + } + res.Write(os.Stdout) +} + +type fakeTLSConn struct { + net.Conn +} + +func (c *fakeTLSConn) ConnectionState() tls.ConnectionState { + return tls.ConnectionState{ + Version: tls.VersionTLS12, + CipherSuite: cipher_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, + } +} + +func startH2cServer(t *testing.T) net.Listener { + h2Server := &Server{} + l := newLocalListener(t) + go func() { + conn, err := l.Accept() + if err != nil { + t.Error(err) + return + } + h2Server.ServeConn(&fakeTLSConn{conn}, &ServeConnOpts{Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + fmt.Fprintf(w, "Hello, %v, http: %v", r.URL.Path, r.TLS == nil) + })}) + }() + return l +} + +func TestTransportH2c(t *testing.T) { + l := startH2cServer(t) + defer l.Close() + req, err := http.NewRequest("GET", "http://"+l.Addr().String()+"/foobar", nil) + if err != nil { + t.Fatal(err) + } + tr := &Transport{ + AllowHTTP: true, + DialTLS: func(network, addr string, cfg *tls.Config) (net.Conn, error) { + return net.Dial(network, addr) + }, + } + res, err := tr.RoundTrip(req) + if err != nil { + t.Fatal(err) + } + if res.ProtoMajor != 2 { + t.Fatal("proto not h2c") + } + body, err := ioutil.ReadAll(res.Body) + if err != nil { + t.Fatal(err) + } + if got, want := string(body), "Hello, /foobar, http: true"; got != want { + t.Fatalf("response got %v, want %v", got, want) + } +} + +func TestTransport(t *testing.T) { + const body = "sup" + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + io.WriteString(w, body) + }, optOnlyServer) + defer st.Close() + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + + req, err := http.NewRequest("GET", st.ts.URL, nil) + if err != nil { + t.Fatal(err) + } + res, err := tr.RoundTrip(req) + if err != nil { + t.Fatal(err) + } + defer res.Body.Close() + + t.Logf("Got res: %+v", res) + if g, w := res.StatusCode, 200; g != w { + t.Errorf("StatusCode = %v; want %v", g, w) + } + if g, w := res.Status, "200 OK"; g != w { + t.Errorf("Status = %q; want %q", g, w) + } + wantHeader := http.Header{ + "Content-Length": []string{"3"}, + "Content-Type": []string{"text/plain; charset=utf-8"}, + "Date": []string{"XXX"}, // see cleanDate + } + cleanDate(res) + if !reflect.DeepEqual(res.Header, wantHeader) { + t.Errorf("res Header = %v; want %v", res.Header, wantHeader) + } + if res.Request != req { + t.Errorf("Response.Request = %p; want %p", res.Request, req) + } + if res.TLS == nil { + t.Error("Response.TLS = nil; want non-nil") + } + slurp, err := ioutil.ReadAll(res.Body) + if err != nil { + t.Errorf("Body read: %v", err) + } else if string(slurp) != body { + t.Errorf("Body = %q; want %q", slurp, body) + } +} + +func onSameConn(t *testing.T, modReq func(*http.Request)) bool { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + io.WriteString(w, r.RemoteAddr) + }, optOnlyServer, func(c net.Conn, st http.ConnState) { + t.Logf("conn %v is now state %v", c.RemoteAddr(), st) + }) + defer st.Close() + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + get := func() string { + req, err := http.NewRequest("GET", st.ts.URL, nil) + if err != nil { + t.Fatal(err) + } + modReq(req) + res, err := tr.RoundTrip(req) + if err != nil { + t.Fatal(err) + } + defer res.Body.Close() + slurp, err := ioutil.ReadAll(res.Body) + if err != nil { + t.Fatalf("Body read: %v", err) + } + addr := strings.TrimSpace(string(slurp)) + if addr == "" { + t.Fatalf("didn't get an addr in response") + } + return addr + } + first := get() + second := get() + return first == second +} + +func TestTransportReusesConns(t *testing.T) { + if !onSameConn(t, func(*http.Request) {}) { + t.Errorf("first and second responses were on different connections") + } +} + +func TestTransportReusesConn_RequestClose(t *testing.T) { + if onSameConn(t, func(r *http.Request) { r.Close = true }) { + t.Errorf("first and second responses were not on different connections") + } +} + +func TestTransportReusesConn_ConnClose(t *testing.T) { + if onSameConn(t, func(r *http.Request) { r.Header.Set("Connection", "close") }) { + t.Errorf("first and second responses were not on different connections") + } +} + +// Tests that the Transport only keeps one pending dial open per destination address. +// https://golang.org/issue/13397 +func TestTransportGroupsPendingDials(t *testing.T) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + io.WriteString(w, r.RemoteAddr) + }, optOnlyServer) + defer st.Close() + tr := &Transport{ + TLSClientConfig: tlsConfigInsecure, + } + defer tr.CloseIdleConnections() + var ( + mu sync.Mutex + dials = map[string]int{} + ) + var wg sync.WaitGroup + for i := 0; i < 10; i++ { + wg.Add(1) + go func() { + defer wg.Done() + req, err := http.NewRequest("GET", st.ts.URL, nil) + if err != nil { + t.Error(err) + return + } + res, err := tr.RoundTrip(req) + if err != nil { + t.Error(err) + return + } + defer res.Body.Close() + slurp, err := ioutil.ReadAll(res.Body) + if err != nil { + t.Errorf("Body read: %v", err) + } + addr := strings.TrimSpace(string(slurp)) + if addr == "" { + t.Errorf("didn't get an addr in response") + } + mu.Lock() + dials[addr]++ + mu.Unlock() + }() + } + wg.Wait() + if len(dials) != 1 { + t.Errorf("saw %d dials; want 1: %v", len(dials), dials) + } + tr.CloseIdleConnections() + if err := retry(50, 10*time.Millisecond, func() error { + cp, ok := tr.connPool().(*clientConnPool) + if !ok { + return fmt.Errorf("Conn pool is %T; want *clientConnPool", tr.connPool()) + } + cp.mu.Lock() + defer cp.mu.Unlock() + if len(cp.dialing) != 0 { + return fmt.Errorf("dialing map = %v; want empty", cp.dialing) + } + if len(cp.conns) != 0 { + return fmt.Errorf("conns = %v; want empty", cp.conns) + } + if len(cp.keys) != 0 { + return fmt.Errorf("keys = %v; want empty", cp.keys) + } + return nil + }); err != nil { + t.Errorf("State of pool after CloseIdleConnections: %v", err) + } +} + +func retry(tries int, delay time.Duration, fn func() error) error { + var err error + for i := 0; i < tries; i++ { + err = fn() + if err == nil { + return nil + } + time.Sleep(delay) + } + return err +} + +func TestTransportAbortClosesPipes(t *testing.T) { + shutdown := make(chan struct{}) + st := newServerTester(t, + func(w http.ResponseWriter, r *http.Request) { + w.(http.Flusher).Flush() + <-shutdown + }, + optOnlyServer, + ) + defer st.Close() + defer close(shutdown) // we must shutdown before st.Close() to avoid hanging + + done := make(chan struct{}) + requestMade := make(chan struct{}) + go func() { + defer close(done) + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + req, err := http.NewRequest("GET", st.ts.URL, nil) + if err != nil { + t.Fatal(err) + } + res, err := tr.RoundTrip(req) + if err != nil { + t.Fatal(err) + } + defer res.Body.Close() + close(requestMade) + _, err = ioutil.ReadAll(res.Body) + if err == nil { + t.Error("expected error from res.Body.Read") + } + }() + + <-requestMade + // Now force the serve loop to end, via closing the connection. + st.closeConn() + // deadlock? that's a bug. + select { + case <-done: + case <-time.After(3 * time.Second): + t.Fatal("timeout") + } +} + +// TODO: merge this with TestTransportBody to make TestTransportRequest? This +// could be a table-driven test with extra goodies. +func TestTransportPath(t *testing.T) { + gotc := make(chan *url.URL, 1) + st := newServerTester(t, + func(w http.ResponseWriter, r *http.Request) { + gotc <- r.URL + }, + optOnlyServer, + ) + defer st.Close() + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + const ( + path = "/testpath" + query = "q=1" + ) + surl := st.ts.URL + path + "?" + query + req, err := http.NewRequest("POST", surl, nil) + if err != nil { + t.Fatal(err) + } + c := &http.Client{Transport: tr} + res, err := c.Do(req) + if err != nil { + t.Fatal(err) + } + defer res.Body.Close() + got := <-gotc + if got.Path != path { + t.Errorf("Read Path = %q; want %q", got.Path, path) + } + if got.RawQuery != query { + t.Errorf("Read RawQuery = %q; want %q", got.RawQuery, query) + } +} + +func randString(n int) string { + rnd := rand.New(rand.NewSource(int64(n))) + b := make([]byte, n) + for i := range b { + b[i] = byte(rnd.Intn(256)) + } + return string(b) +} + +type panicReader struct{} + +func (panicReader) Read([]byte) (int, error) { panic("unexpected Read") } +func (panicReader) Close() error { panic("unexpected Close") } + +func TestActualContentLength(t *testing.T) { + tests := []struct { + req *http.Request + want int64 + }{ + // Verify we don't read from Body: + 0: { + req: &http.Request{Body: panicReader{}}, + want: -1, + }, + // nil Body means 0, regardless of ContentLength: + 1: { + req: &http.Request{Body: nil, ContentLength: 5}, + want: 0, + }, + // ContentLength is used if set. + 2: { + req: &http.Request{Body: panicReader{}, ContentLength: 5}, + want: 5, + }, + // http.NoBody means 0, not -1. + 3: { + req: &http.Request{Body: go18httpNoBody()}, + want: 0, + }, + } + for i, tt := range tests { + got := actualContentLength(tt.req) + if got != tt.want { + t.Errorf("test[%d]: got %d; want %d", i, got, tt.want) + } + } +} + +func TestTransportBody(t *testing.T) { + bodyTests := []struct { + body string + noContentLen bool + }{ + {body: "some message"}, + {body: "some message", noContentLen: true}, + {body: strings.Repeat("a", 1<<20), noContentLen: true}, + {body: strings.Repeat("a", 1<<20)}, + {body: randString(16<<10 - 1)}, + {body: randString(16 << 10)}, + {body: randString(16<<10 + 1)}, + {body: randString(512<<10 - 1)}, + {body: randString(512 << 10)}, + {body: randString(512<<10 + 1)}, + {body: randString(1<<20 - 1)}, + {body: randString(1 << 20)}, + {body: randString(1<<20 + 2)}, + } + + type reqInfo struct { + req *http.Request + slurp []byte + err error + } + gotc := make(chan reqInfo, 1) + st := newServerTester(t, + func(w http.ResponseWriter, r *http.Request) { + slurp, err := ioutil.ReadAll(r.Body) + if err != nil { + gotc <- reqInfo{err: err} + } else { + gotc <- reqInfo{req: r, slurp: slurp} + } + }, + optOnlyServer, + ) + defer st.Close() + + for i, tt := range bodyTests { + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + + var body io.Reader = strings.NewReader(tt.body) + if tt.noContentLen { + body = struct{ io.Reader }{body} // just a Reader, hiding concrete type and other methods + } + req, err := http.NewRequest("POST", st.ts.URL, body) + if err != nil { + t.Fatalf("#%d: %v", i, err) + } + c := &http.Client{Transport: tr} + res, err := c.Do(req) + if err != nil { + t.Fatalf("#%d: %v", i, err) + } + defer res.Body.Close() + ri := <-gotc + if ri.err != nil { + t.Errorf("#%d: read error: %v", i, ri.err) + continue + } + if got := string(ri.slurp); got != tt.body { + t.Errorf("#%d: Read body mismatch.\n got: %q (len %d)\nwant: %q (len %d)", i, shortString(got), len(got), shortString(tt.body), len(tt.body)) + } + wantLen := int64(len(tt.body)) + if tt.noContentLen && tt.body != "" { + wantLen = -1 + } + if ri.req.ContentLength != wantLen { + t.Errorf("#%d. handler got ContentLength = %v; want %v", i, ri.req.ContentLength, wantLen) + } + } +} + +func shortString(v string) string { + const maxLen = 100 + if len(v) <= maxLen { + return v + } + return fmt.Sprintf("%v[...%d bytes omitted...]%v", v[:maxLen/2], len(v)-maxLen, v[len(v)-maxLen/2:]) +} + +func TestTransportDialTLS(t *testing.T) { + var mu sync.Mutex // guards following + var gotReq, didDial bool + + ts := newServerTester(t, + func(w http.ResponseWriter, r *http.Request) { + mu.Lock() + gotReq = true + mu.Unlock() + }, + optOnlyServer, + ) + defer ts.Close() + tr := &Transport{ + DialTLS: func(netw, addr string, cfg *tls.Config) (net.Conn, error) { + mu.Lock() + didDial = true + mu.Unlock() + cfg.InsecureSkipVerify = true + c, err := tls.Dial(netw, addr, cfg) + if err != nil { + return nil, err + } + return c, c.Handshake() + }, + } + defer tr.CloseIdleConnections() + client := &http.Client{Transport: tr} + res, err := client.Get(ts.ts.URL) + if err != nil { + t.Fatal(err) + } + res.Body.Close() + mu.Lock() + if !gotReq { + t.Error("didn't get request") + } + if !didDial { + t.Error("didn't use dial hook") + } +} + +func TestConfigureTransport(t *testing.T) { + t1 := &http.Transport{} + err := ConfigureTransport(t1) + if err == errTransportVersion { + t.Skip(err) + } + if err != nil { + t.Fatal(err) + } + if got := fmt.Sprintf("%#v", t1); !strings.Contains(got, `"h2"`) { + // Laziness, to avoid buildtags. + t.Errorf("stringification of HTTP/1 transport didn't contain \"h2\": %v", got) + } + wantNextProtos := []string{"h2", "http/1.1"} + if t1.TLSClientConfig == nil { + t.Errorf("nil t1.TLSClientConfig") + } else if !reflect.DeepEqual(t1.TLSClientConfig.NextProtos, wantNextProtos) { + t.Errorf("TLSClientConfig.NextProtos = %q; want %q", t1.TLSClientConfig.NextProtos, wantNextProtos) + } + if err := ConfigureTransport(t1); err == nil { + t.Error("unexpected success on second call to ConfigureTransport") + } + + // And does it work? + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + io.WriteString(w, r.Proto) + }, optOnlyServer) + defer st.Close() + + t1.TLSClientConfig.InsecureSkipVerify = true + c := &http.Client{Transport: t1} + res, err := c.Get(st.ts.URL) + if err != nil { + t.Fatal(err) + } + slurp, err := ioutil.ReadAll(res.Body) + if err != nil { + t.Fatal(err) + } + if got, want := string(slurp), "HTTP/2.0"; got != want { + t.Errorf("body = %q; want %q", got, want) + } +} + +type capitalizeReader struct { + r io.Reader +} + +func (cr capitalizeReader) Read(p []byte) (n int, err error) { + n, err = cr.r.Read(p) + for i, b := range p[:n] { + if b >= 'a' && b <= 'z' { + p[i] = b - ('a' - 'A') + } + } + return +} + +type flushWriter struct { + w io.Writer +} + +func (fw flushWriter) Write(p []byte) (n int, err error) { + n, err = fw.w.Write(p) + if f, ok := fw.w.(http.Flusher); ok { + f.Flush() + } + return +} + +type clientTester struct { + t *testing.T + tr *Transport + sc, cc net.Conn // server and client conn + fr *Framer // server's framer + client func() error + server func() error +} + +func newClientTester(t *testing.T) *clientTester { + var dialOnce struct { + sync.Mutex + dialed bool + } + ct := &clientTester{ + t: t, + } + ct.tr = &Transport{ + TLSClientConfig: tlsConfigInsecure, + DialTLS: func(network, addr string, cfg *tls.Config) (net.Conn, error) { + dialOnce.Lock() + defer dialOnce.Unlock() + if dialOnce.dialed { + return nil, errors.New("only one dial allowed in test mode") + } + dialOnce.dialed = true + return ct.cc, nil + }, + } + + ln := newLocalListener(t) + cc, err := net.Dial("tcp", ln.Addr().String()) + if err != nil { + t.Fatal(err) + + } + sc, err := ln.Accept() + if err != nil { + t.Fatal(err) + } + ln.Close() + ct.cc = cc + ct.sc = sc + ct.fr = NewFramer(sc, sc) + return ct +} + +func newLocalListener(t *testing.T) net.Listener { + ln, err := net.Listen("tcp4", "127.0.0.1:0") + if err == nil { + return ln + } + ln, err = net.Listen("tcp6", "[::1]:0") + if err != nil { + t.Fatal(err) + } + return ln +} + +func (ct *clientTester) greet(settings ...Setting) { + buf := make([]byte, len(ClientPreface)) + _, err := io.ReadFull(ct.sc, buf) + if err != nil { + ct.t.Fatalf("reading client preface: %v", err) + } + f, err := ct.fr.ReadFrame() + if err != nil { + ct.t.Fatalf("Reading client settings frame: %v", err) + } + if sf, ok := f.(*SettingsFrame); !ok { + ct.t.Fatalf("Wanted client settings frame; got %v", f) + _ = sf // stash it away? + } + if err := ct.fr.WriteSettings(settings...); err != nil { + ct.t.Fatal(err) + } + if err := ct.fr.WriteSettingsAck(); err != nil { + ct.t.Fatal(err) + } +} + +func (ct *clientTester) readNonSettingsFrame() (Frame, error) { + for { + f, err := ct.fr.ReadFrame() + if err != nil { + return nil, err + } + if _, ok := f.(*SettingsFrame); ok { + continue + } + return f, nil + } +} + +func (ct *clientTester) cleanup() { + ct.tr.CloseIdleConnections() +} + +func (ct *clientTester) run() { + errc := make(chan error, 2) + ct.start("client", errc, ct.client) + ct.start("server", errc, ct.server) + defer ct.cleanup() + for i := 0; i < 2; i++ { + if err := <-errc; err != nil { + ct.t.Error(err) + return + } + } +} + +func (ct *clientTester) start(which string, errc chan<- error, fn func() error) { + go func() { + finished := false + var err error + defer func() { + if !finished { + err = fmt.Errorf("%s goroutine didn't finish.", which) + } else if err != nil { + err = fmt.Errorf("%s: %v", which, err) + } + errc <- err + }() + err = fn() + finished = true + }() +} + +func (ct *clientTester) readFrame() (Frame, error) { + return readFrameTimeout(ct.fr, 2*time.Second) +} + +func (ct *clientTester) firstHeaders() (*HeadersFrame, error) { + for { + f, err := ct.readFrame() + if err != nil { + return nil, fmt.Errorf("ReadFrame while waiting for Headers: %v", err) + } + switch f.(type) { + case *WindowUpdateFrame, *SettingsFrame: + continue + } + hf, ok := f.(*HeadersFrame) + if !ok { + return nil, fmt.Errorf("Got %T; want HeadersFrame", f) + } + return hf, nil + } +} + +type countingReader struct { + n *int64 +} + +func (r countingReader) Read(p []byte) (n int, err error) { + for i := range p { + p[i] = byte(i) + } + atomic.AddInt64(r.n, int64(len(p))) + return len(p), err +} + +func TestTransportReqBodyAfterResponse_200(t *testing.T) { testTransportReqBodyAfterResponse(t, 200) } +func TestTransportReqBodyAfterResponse_403(t *testing.T) { testTransportReqBodyAfterResponse(t, 403) } + +func testTransportReqBodyAfterResponse(t *testing.T, status int) { + const bodySize = 10 << 20 + clientDone := make(chan struct{}) + ct := newClientTester(t) + ct.client = func() error { + defer ct.cc.(*net.TCPConn).CloseWrite() + defer close(clientDone) + + var n int64 // atomic + req, err := http.NewRequest("PUT", "https://dummy.tld/", io.LimitReader(countingReader{&n}, bodySize)) + if err != nil { + return err + } + res, err := ct.tr.RoundTrip(req) + if err != nil { + return fmt.Errorf("RoundTrip: %v", err) + } + defer res.Body.Close() + if res.StatusCode != status { + return fmt.Errorf("status code = %v; want %v", res.StatusCode, status) + } + slurp, err := ioutil.ReadAll(res.Body) + if err != nil { + return fmt.Errorf("Slurp: %v", err) + } + if len(slurp) > 0 { + return fmt.Errorf("unexpected body: %q", slurp) + } + if status == 200 { + if got := atomic.LoadInt64(&n); got != bodySize { + return fmt.Errorf("For 200 response, Transport wrote %d bytes; want %d", got, bodySize) + } + } else { + if got := atomic.LoadInt64(&n); got == 0 || got >= bodySize { + return fmt.Errorf("For %d response, Transport wrote %d bytes; want (0,%d) exclusive", status, got, bodySize) + } + } + return nil + } + ct.server = func() error { + ct.greet() + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + var dataRecv int64 + var closed bool + for { + f, err := ct.fr.ReadFrame() + if err != nil { + select { + case <-clientDone: + // If the client's done, it + // will have reported any + // errors on its side. + return nil + default: + return err + } + } + //println(fmt.Sprintf("server got frame: %v", f)) + switch f := f.(type) { + case *WindowUpdateFrame, *SettingsFrame: + case *HeadersFrame: + if !f.HeadersEnded() { + return fmt.Errorf("headers should have END_HEADERS be ended: %v", f) + } + if f.StreamEnded() { + return fmt.Errorf("headers contains END_STREAM unexpectedly: %v", f) + } + case *DataFrame: + dataLen := len(f.Data()) + if dataLen > 0 { + if dataRecv == 0 { + enc.WriteField(hpack.HeaderField{Name: ":status", Value: strconv.Itoa(status)}) + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: f.StreamID, + EndHeaders: true, + EndStream: false, + BlockFragment: buf.Bytes(), + }) + } + if err := ct.fr.WriteWindowUpdate(0, uint32(dataLen)); err != nil { + return err + } + if err := ct.fr.WriteWindowUpdate(f.StreamID, uint32(dataLen)); err != nil { + return err + } + } + dataRecv += int64(dataLen) + + if !closed && ((status != 200 && dataRecv > 0) || + (status == 200 && dataRecv == bodySize)) { + closed = true + if err := ct.fr.WriteData(f.StreamID, true, nil); err != nil { + return err + } + } + default: + return fmt.Errorf("Unexpected client frame %v", f) + } + } + } + ct.run() +} + +// See golang.org/issue/13444 +func TestTransportFullDuplex(t *testing.T) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(200) // redundant but for clarity + w.(http.Flusher).Flush() + io.Copy(flushWriter{w}, capitalizeReader{r.Body}) + fmt.Fprintf(w, "bye.\n") + }, optOnlyServer) + defer st.Close() + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + c := &http.Client{Transport: tr} + + pr, pw := io.Pipe() + req, err := http.NewRequest("PUT", st.ts.URL, ioutil.NopCloser(pr)) + if err != nil { + t.Fatal(err) + } + req.ContentLength = -1 + res, err := c.Do(req) + if err != nil { + t.Fatal(err) + } + defer res.Body.Close() + if res.StatusCode != 200 { + t.Fatalf("StatusCode = %v; want %v", res.StatusCode, 200) + } + bs := bufio.NewScanner(res.Body) + want := func(v string) { + if !bs.Scan() { + t.Fatalf("wanted to read %q but Scan() = false, err = %v", v, bs.Err()) + } + } + write := func(v string) { + _, err := io.WriteString(pw, v) + if err != nil { + t.Fatalf("pipe write: %v", err) + } + } + write("foo\n") + want("FOO") + write("bar\n") + want("BAR") + pw.Close() + want("bye.") + if err := bs.Err(); err != nil { + t.Fatal(err) + } +} + +func TestTransportConnectRequest(t *testing.T) { + gotc := make(chan *http.Request, 1) + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + gotc <- r + }, optOnlyServer) + defer st.Close() + + u, err := url.Parse(st.ts.URL) + if err != nil { + t.Fatal(err) + } + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + c := &http.Client{Transport: tr} + + tests := []struct { + req *http.Request + want string + }{ + { + req: &http.Request{ + Method: "CONNECT", + Header: http.Header{}, + URL: u, + }, + want: u.Host, + }, + { + req: &http.Request{ + Method: "CONNECT", + Header: http.Header{}, + URL: u, + Host: "example.com:123", + }, + want: "example.com:123", + }, + } + + for i, tt := range tests { + res, err := c.Do(tt.req) + if err != nil { + t.Errorf("%d. RoundTrip = %v", i, err) + continue + } + res.Body.Close() + req := <-gotc + if req.Method != "CONNECT" { + t.Errorf("method = %q; want CONNECT", req.Method) + } + if req.Host != tt.want { + t.Errorf("Host = %q; want %q", req.Host, tt.want) + } + if req.URL.Host != tt.want { + t.Errorf("URL.Host = %q; want %q", req.URL.Host, tt.want) + } + } +} + +type headerType int + +const ( + noHeader headerType = iota // omitted + oneHeader + splitHeader // broken into continuation on purpose +) + +const ( + f0 = noHeader + f1 = oneHeader + f2 = splitHeader + d0 = false + d1 = true +) + +// Test all 36 combinations of response frame orders: +// (3 ways of 100-continue) * (2 ways of headers) * (2 ways of data) * (3 ways of trailers):func TestTransportResponsePattern_00f0(t *testing.T) { testTransportResponsePattern(h0, h1, false, h0) } +// Generated by http://play.golang.org/p/SScqYKJYXd +func TestTransportResPattern_c0h1d0t0(t *testing.T) { testTransportResPattern(t, f0, f1, d0, f0) } +func TestTransportResPattern_c0h1d0t1(t *testing.T) { testTransportResPattern(t, f0, f1, d0, f1) } +func TestTransportResPattern_c0h1d0t2(t *testing.T) { testTransportResPattern(t, f0, f1, d0, f2) } +func TestTransportResPattern_c0h1d1t0(t *testing.T) { testTransportResPattern(t, f0, f1, d1, f0) } +func TestTransportResPattern_c0h1d1t1(t *testing.T) { testTransportResPattern(t, f0, f1, d1, f1) } +func TestTransportResPattern_c0h1d1t2(t *testing.T) { testTransportResPattern(t, f0, f1, d1, f2) } +func TestTransportResPattern_c0h2d0t0(t *testing.T) { testTransportResPattern(t, f0, f2, d0, f0) } +func TestTransportResPattern_c0h2d0t1(t *testing.T) { testTransportResPattern(t, f0, f2, d0, f1) } +func TestTransportResPattern_c0h2d0t2(t *testing.T) { testTransportResPattern(t, f0, f2, d0, f2) } +func TestTransportResPattern_c0h2d1t0(t *testing.T) { testTransportResPattern(t, f0, f2, d1, f0) } +func TestTransportResPattern_c0h2d1t1(t *testing.T) { testTransportResPattern(t, f0, f2, d1, f1) } +func TestTransportResPattern_c0h2d1t2(t *testing.T) { testTransportResPattern(t, f0, f2, d1, f2) } +func TestTransportResPattern_c1h1d0t0(t *testing.T) { testTransportResPattern(t, f1, f1, d0, f0) } +func TestTransportResPattern_c1h1d0t1(t *testing.T) { testTransportResPattern(t, f1, f1, d0, f1) } +func TestTransportResPattern_c1h1d0t2(t *testing.T) { testTransportResPattern(t, f1, f1, d0, f2) } +func TestTransportResPattern_c1h1d1t0(t *testing.T) { testTransportResPattern(t, f1, f1, d1, f0) } +func TestTransportResPattern_c1h1d1t1(t *testing.T) { testTransportResPattern(t, f1, f1, d1, f1) } +func TestTransportResPattern_c1h1d1t2(t *testing.T) { testTransportResPattern(t, f1, f1, d1, f2) } +func TestTransportResPattern_c1h2d0t0(t *testing.T) { testTransportResPattern(t, f1, f2, d0, f0) } +func TestTransportResPattern_c1h2d0t1(t *testing.T) { testTransportResPattern(t, f1, f2, d0, f1) } +func TestTransportResPattern_c1h2d0t2(t *testing.T) { testTransportResPattern(t, f1, f2, d0, f2) } +func TestTransportResPattern_c1h2d1t0(t *testing.T) { testTransportResPattern(t, f1, f2, d1, f0) } +func TestTransportResPattern_c1h2d1t1(t *testing.T) { testTransportResPattern(t, f1, f2, d1, f1) } +func TestTransportResPattern_c1h2d1t2(t *testing.T) { testTransportResPattern(t, f1, f2, d1, f2) } +func TestTransportResPattern_c2h1d0t0(t *testing.T) { testTransportResPattern(t, f2, f1, d0, f0) } +func TestTransportResPattern_c2h1d0t1(t *testing.T) { testTransportResPattern(t, f2, f1, d0, f1) } +func TestTransportResPattern_c2h1d0t2(t *testing.T) { testTransportResPattern(t, f2, f1, d0, f2) } +func TestTransportResPattern_c2h1d1t0(t *testing.T) { testTransportResPattern(t, f2, f1, d1, f0) } +func TestTransportResPattern_c2h1d1t1(t *testing.T) { testTransportResPattern(t, f2, f1, d1, f1) } +func TestTransportResPattern_c2h1d1t2(t *testing.T) { testTransportResPattern(t, f2, f1, d1, f2) } +func TestTransportResPattern_c2h2d0t0(t *testing.T) { testTransportResPattern(t, f2, f2, d0, f0) } +func TestTransportResPattern_c2h2d0t1(t *testing.T) { testTransportResPattern(t, f2, f2, d0, f1) } +func TestTransportResPattern_c2h2d0t2(t *testing.T) { testTransportResPattern(t, f2, f2, d0, f2) } +func TestTransportResPattern_c2h2d1t0(t *testing.T) { testTransportResPattern(t, f2, f2, d1, f0) } +func TestTransportResPattern_c2h2d1t1(t *testing.T) { testTransportResPattern(t, f2, f2, d1, f1) } +func TestTransportResPattern_c2h2d1t2(t *testing.T) { testTransportResPattern(t, f2, f2, d1, f2) } + +func testTransportResPattern(t *testing.T, expect100Continue, resHeader headerType, withData bool, trailers headerType) { + const reqBody = "some request body" + const resBody = "some response body" + + if resHeader == noHeader { + // TODO: test 100-continue followed by immediate + // server stream reset, without headers in the middle? + panic("invalid combination") + } + + ct := newClientTester(t) + ct.client = func() error { + req, _ := http.NewRequest("POST", "https://dummy.tld/", strings.NewReader(reqBody)) + if expect100Continue != noHeader { + req.Header.Set("Expect", "100-continue") + } + res, err := ct.tr.RoundTrip(req) + if err != nil { + return fmt.Errorf("RoundTrip: %v", err) + } + defer res.Body.Close() + if res.StatusCode != 200 { + return fmt.Errorf("status code = %v; want 200", res.StatusCode) + } + slurp, err := ioutil.ReadAll(res.Body) + if err != nil { + return fmt.Errorf("Slurp: %v", err) + } + wantBody := resBody + if !withData { + wantBody = "" + } + if string(slurp) != wantBody { + return fmt.Errorf("body = %q; want %q", slurp, wantBody) + } + if trailers == noHeader { + if len(res.Trailer) > 0 { + t.Errorf("Trailer = %v; want none", res.Trailer) + } + } else { + want := http.Header{"Some-Trailer": {"some-value"}} + if !reflect.DeepEqual(res.Trailer, want) { + t.Errorf("Trailer = %v; want %v", res.Trailer, want) + } + } + return nil + } + ct.server = func() error { + ct.greet() + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + + for { + f, err := ct.fr.ReadFrame() + if err != nil { + return err + } + endStream := false + send := func(mode headerType) { + hbf := buf.Bytes() + switch mode { + case oneHeader: + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: f.Header().StreamID, + EndHeaders: true, + EndStream: endStream, + BlockFragment: hbf, + }) + case splitHeader: + if len(hbf) < 2 { + panic("too small") + } + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: f.Header().StreamID, + EndHeaders: false, + EndStream: endStream, + BlockFragment: hbf[:1], + }) + ct.fr.WriteContinuation(f.Header().StreamID, true, hbf[1:]) + default: + panic("bogus mode") + } + } + switch f := f.(type) { + case *WindowUpdateFrame, *SettingsFrame: + case *DataFrame: + if !f.StreamEnded() { + // No need to send flow control tokens. The test request body is tiny. + continue + } + // Response headers (1+ frames; 1 or 2 in this test, but never 0) + { + buf.Reset() + enc.WriteField(hpack.HeaderField{Name: ":status", Value: "200"}) + enc.WriteField(hpack.HeaderField{Name: "x-foo", Value: "blah"}) + enc.WriteField(hpack.HeaderField{Name: "x-bar", Value: "more"}) + if trailers != noHeader { + enc.WriteField(hpack.HeaderField{Name: "trailer", Value: "some-trailer"}) + } + endStream = withData == false && trailers == noHeader + send(resHeader) + } + if withData { + endStream = trailers == noHeader + ct.fr.WriteData(f.StreamID, endStream, []byte(resBody)) + } + if trailers != noHeader { + endStream = true + buf.Reset() + enc.WriteField(hpack.HeaderField{Name: "some-trailer", Value: "some-value"}) + send(trailers) + } + if endStream { + return nil + } + case *HeadersFrame: + if expect100Continue != noHeader { + buf.Reset() + enc.WriteField(hpack.HeaderField{Name: ":status", Value: "100"}) + send(expect100Continue) + } + } + } + } + ct.run() +} + +func TestTransportReceiveUndeclaredTrailer(t *testing.T) { + ct := newClientTester(t) + ct.client = func() error { + req, _ := http.NewRequest("GET", "https://dummy.tld/", nil) + res, err := ct.tr.RoundTrip(req) + if err != nil { + return fmt.Errorf("RoundTrip: %v", err) + } + defer res.Body.Close() + if res.StatusCode != 200 { + return fmt.Errorf("status code = %v; want 200", res.StatusCode) + } + slurp, err := ioutil.ReadAll(res.Body) + if err != nil { + return fmt.Errorf("res.Body ReadAll error = %q, %v; want %v", slurp, err, nil) + } + if len(slurp) > 0 { + return fmt.Errorf("body = %q; want nothing", slurp) + } + if _, ok := res.Trailer["Some-Trailer"]; !ok { + return fmt.Errorf("expected Some-Trailer") + } + return nil + } + ct.server = func() error { + ct.greet() + + var n int + var hf *HeadersFrame + for hf == nil && n < 10 { + f, err := ct.fr.ReadFrame() + if err != nil { + return err + } + hf, _ = f.(*HeadersFrame) + n++ + } + + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + + // send headers without Trailer header + enc.WriteField(hpack.HeaderField{Name: ":status", Value: "200"}) + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: hf.StreamID, + EndHeaders: true, + EndStream: false, + BlockFragment: buf.Bytes(), + }) + + // send trailers + buf.Reset() + enc.WriteField(hpack.HeaderField{Name: "some-trailer", Value: "I'm an undeclared Trailer!"}) + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: hf.StreamID, + EndHeaders: true, + EndStream: true, + BlockFragment: buf.Bytes(), + }) + return nil + } + ct.run() +} + +func TestTransportInvalidTrailer_Pseudo1(t *testing.T) { + testTransportInvalidTrailer_Pseudo(t, oneHeader) +} +func TestTransportInvalidTrailer_Pseudo2(t *testing.T) { + testTransportInvalidTrailer_Pseudo(t, splitHeader) +} +func testTransportInvalidTrailer_Pseudo(t *testing.T, trailers headerType) { + testInvalidTrailer(t, trailers, pseudoHeaderError(":colon"), func(enc *hpack.Encoder) { + enc.WriteField(hpack.HeaderField{Name: ":colon", Value: "foo"}) + enc.WriteField(hpack.HeaderField{Name: "foo", Value: "bar"}) + }) +} + +func TestTransportInvalidTrailer_Capital1(t *testing.T) { + testTransportInvalidTrailer_Capital(t, oneHeader) +} +func TestTransportInvalidTrailer_Capital2(t *testing.T) { + testTransportInvalidTrailer_Capital(t, splitHeader) +} +func testTransportInvalidTrailer_Capital(t *testing.T, trailers headerType) { + testInvalidTrailer(t, trailers, headerFieldNameError("Capital"), func(enc *hpack.Encoder) { + enc.WriteField(hpack.HeaderField{Name: "foo", Value: "bar"}) + enc.WriteField(hpack.HeaderField{Name: "Capital", Value: "bad"}) + }) +} +func TestTransportInvalidTrailer_EmptyFieldName(t *testing.T) { + testInvalidTrailer(t, oneHeader, headerFieldNameError(""), func(enc *hpack.Encoder) { + enc.WriteField(hpack.HeaderField{Name: "", Value: "bad"}) + }) +} +func TestTransportInvalidTrailer_BinaryFieldValue(t *testing.T) { + testInvalidTrailer(t, oneHeader, headerFieldValueError("has\nnewline"), func(enc *hpack.Encoder) { + enc.WriteField(hpack.HeaderField{Name: "x", Value: "has\nnewline"}) + }) +} + +func testInvalidTrailer(t *testing.T, trailers headerType, wantErr error, writeTrailer func(*hpack.Encoder)) { + ct := newClientTester(t) + ct.client = func() error { + req, _ := http.NewRequest("GET", "https://dummy.tld/", nil) + res, err := ct.tr.RoundTrip(req) + if err != nil { + return fmt.Errorf("RoundTrip: %v", err) + } + defer res.Body.Close() + if res.StatusCode != 200 { + return fmt.Errorf("status code = %v; want 200", res.StatusCode) + } + slurp, err := ioutil.ReadAll(res.Body) + se, ok := err.(StreamError) + if !ok || se.Cause != wantErr { + return fmt.Errorf("res.Body ReadAll error = %q, %#v; want StreamError with cause %T, %#v", slurp, err, wantErr, wantErr) + } + if len(slurp) > 0 { + return fmt.Errorf("body = %q; want nothing", slurp) + } + return nil + } + ct.server = func() error { + ct.greet() + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + + for { + f, err := ct.fr.ReadFrame() + if err != nil { + return err + } + switch f := f.(type) { + case *HeadersFrame: + var endStream bool + send := func(mode headerType) { + hbf := buf.Bytes() + switch mode { + case oneHeader: + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: f.StreamID, + EndHeaders: true, + EndStream: endStream, + BlockFragment: hbf, + }) + case splitHeader: + if len(hbf) < 2 { + panic("too small") + } + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: f.StreamID, + EndHeaders: false, + EndStream: endStream, + BlockFragment: hbf[:1], + }) + ct.fr.WriteContinuation(f.StreamID, true, hbf[1:]) + default: + panic("bogus mode") + } + } + // Response headers (1+ frames; 1 or 2 in this test, but never 0) + { + buf.Reset() + enc.WriteField(hpack.HeaderField{Name: ":status", Value: "200"}) + enc.WriteField(hpack.HeaderField{Name: "trailer", Value: "declared"}) + endStream = false + send(oneHeader) + } + // Trailers: + { + endStream = true + buf.Reset() + writeTrailer(enc) + send(trailers) + } + return nil + } + } + } + ct.run() +} + +// headerListSize returns the HTTP2 header list size of h. +// http://httpwg.org/specs/rfc7540.html#SETTINGS_MAX_HEADER_LIST_SIZE +// http://httpwg.org/specs/rfc7540.html#MaxHeaderBlock +func headerListSize(h http.Header) (size uint32) { + for k, vv := range h { + for _, v := range vv { + hf := hpack.HeaderField{Name: k, Value: v} + size += hf.Size() + } + } + return size +} + +// padHeaders adds data to an http.Header until headerListSize(h) == +// limit. Due to the way header list sizes are calculated, padHeaders +// cannot add fewer than len("Pad-Headers") + 32 bytes to h, and will +// call t.Fatal if asked to do so. PadHeaders first reserves enough +// space for an empty "Pad-Headers" key, then adds as many copies of +// filler as possible. Any remaining bytes necessary to push the +// header list size up to limit are added to h["Pad-Headers"]. +func padHeaders(t *testing.T, h http.Header, limit uint64, filler string) { + if limit > 0xffffffff { + t.Fatalf("padHeaders: refusing to pad to more than 2^32-1 bytes. limit = %v", limit) + } + hf := hpack.HeaderField{Name: "Pad-Headers", Value: ""} + minPadding := uint64(hf.Size()) + size := uint64(headerListSize(h)) + + minlimit := size + minPadding + if limit < minlimit { + t.Fatalf("padHeaders: limit %v < %v", limit, minlimit) + } + + // Use a fixed-width format for name so that fieldSize + // remains constant. + nameFmt := "Pad-Headers-%06d" + hf = hpack.HeaderField{Name: fmt.Sprintf(nameFmt, 1), Value: filler} + fieldSize := uint64(hf.Size()) + + // Add as many complete filler values as possible, leaving + // room for at least one empty "Pad-Headers" key. + limit = limit - minPadding + for i := 0; size+fieldSize < limit; i++ { + name := fmt.Sprintf(nameFmt, i) + h.Add(name, filler) + size += fieldSize + } + + // Add enough bytes to reach limit. + remain := limit - size + lastValue := strings.Repeat("*", int(remain)) + h.Add("Pad-Headers", lastValue) +} + +func TestPadHeaders(t *testing.T) { + check := func(h http.Header, limit uint32, fillerLen int) { + if h == nil { + h = make(http.Header) + } + filler := strings.Repeat("f", fillerLen) + padHeaders(t, h, uint64(limit), filler) + gotSize := headerListSize(h) + if gotSize != limit { + t.Errorf("Got size = %v; want %v", gotSize, limit) + } + } + // Try all possible combinations for small fillerLen and limit. + hf := hpack.HeaderField{Name: "Pad-Headers", Value: ""} + minLimit := hf.Size() + for limit := minLimit; limit <= 128; limit++ { + for fillerLen := 0; uint32(fillerLen) <= limit; fillerLen++ { + check(nil, limit, fillerLen) + } + } + + // Try a few tests with larger limits, plus cumulative + // tests. Since these tests are cumulative, tests[i+1].limit + // must be >= tests[i].limit + minLimit. See the comment on + // padHeaders for more info on why the limit arg has this + // restriction. + tests := []struct { + fillerLen int + limit uint32 + }{ + { + fillerLen: 64, + limit: 1024, + }, + { + fillerLen: 1024, + limit: 1286, + }, + { + fillerLen: 256, + limit: 2048, + }, + { + fillerLen: 1024, + limit: 10 * 1024, + }, + { + fillerLen: 1023, + limit: 11 * 1024, + }, + } + h := make(http.Header) + for _, tc := range tests { + check(nil, tc.limit, tc.fillerLen) + check(h, tc.limit, tc.fillerLen) + } +} + +func TestTransportChecksRequestHeaderListSize(t *testing.T) { + st := newServerTester(t, + func(w http.ResponseWriter, r *http.Request) { + // Consume body & force client to send + // trailers before writing response. + // ioutil.ReadAll returns non-nil err for + // requests that attempt to send greater than + // maxHeaderListSize bytes of trailers, since + // those requests generate a stream reset. + ioutil.ReadAll(r.Body) + r.Body.Close() + }, + func(ts *httptest.Server) { + ts.Config.MaxHeaderBytes = 16 << 10 + }, + optOnlyServer, + optQuiet, + ) + defer st.Close() + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + + checkRoundTrip := func(req *http.Request, wantErr error, desc string) { + res, err := tr.RoundTrip(req) + if err != wantErr { + if res != nil { + res.Body.Close() + } + t.Errorf("%v: RoundTrip err = %v; want %v", desc, err, wantErr) + return + } + if err == nil { + if res == nil { + t.Errorf("%v: response nil; want non-nil.", desc) + return + } + defer res.Body.Close() + if res.StatusCode != http.StatusOK { + t.Errorf("%v: response status = %v; want %v", desc, res.StatusCode, http.StatusOK) + } + return + } + if res != nil { + t.Errorf("%v: RoundTrip err = %v but response non-nil", desc, err) + } + } + headerListSizeForRequest := func(req *http.Request) (size uint64) { + contentLen := actualContentLength(req) + trailers, err := commaSeparatedTrailers(req) + if err != nil { + t.Fatalf("headerListSizeForRequest: %v", err) + } + cc := &ClientConn{peerMaxHeaderListSize: 0xffffffffffffffff} + cc.henc = hpack.NewEncoder(&cc.hbuf) + cc.mu.Lock() + hdrs, err := cc.encodeHeaders(req, true, trailers, contentLen) + cc.mu.Unlock() + if err != nil { + t.Fatalf("headerListSizeForRequest: %v", err) + } + hpackDec := hpack.NewDecoder(initialHeaderTableSize, func(hf hpack.HeaderField) { + size += uint64(hf.Size()) + }) + if len(hdrs) > 0 { + if _, err := hpackDec.Write(hdrs); err != nil { + t.Fatalf("headerListSizeForRequest: %v", err) + } + } + return size + } + // Create a new Request for each test, rather than reusing the + // same Request, to avoid a race when modifying req.Headers. + // See https://github.com/golang/go/issues/21316 + newRequest := func() *http.Request { + // Body must be non-nil to enable writing trailers. + body := strings.NewReader("hello") + req, err := http.NewRequest("POST", st.ts.URL, body) + if err != nil { + t.Fatalf("newRequest: NewRequest: %v", err) + } + return req + } + + // Make an arbitrary request to ensure we get the server's + // settings frame and initialize peerMaxHeaderListSize. + req := newRequest() + checkRoundTrip(req, nil, "Initial request") + + // Get the ClientConn associated with the request and validate + // peerMaxHeaderListSize. + addr := authorityAddr(req.URL.Scheme, req.URL.Host) + cc, err := tr.connPool().GetClientConn(req, addr) + if err != nil { + t.Fatalf("GetClientConn: %v", err) + } + cc.mu.Lock() + peerSize := cc.peerMaxHeaderListSize + cc.mu.Unlock() + st.scMu.Lock() + wantSize := uint64(st.sc.maxHeaderListSize()) + st.scMu.Unlock() + if peerSize != wantSize { + t.Errorf("peerMaxHeaderListSize = %v; want %v", peerSize, wantSize) + } + + // Sanity check peerSize. (*serverConn) maxHeaderListSize adds + // 320 bytes of padding. + wantHeaderBytes := uint64(st.ts.Config.MaxHeaderBytes) + 320 + if peerSize != wantHeaderBytes { + t.Errorf("peerMaxHeaderListSize = %v; want %v.", peerSize, wantHeaderBytes) + } + + // Pad headers & trailers, but stay under peerSize. + req = newRequest() + req.Header = make(http.Header) + req.Trailer = make(http.Header) + filler := strings.Repeat("*", 1024) + padHeaders(t, req.Trailer, peerSize, filler) + // cc.encodeHeaders adds some default headers to the request, + // so we need to leave room for those. + defaultBytes := headerListSizeForRequest(req) + padHeaders(t, req.Header, peerSize-defaultBytes, filler) + checkRoundTrip(req, nil, "Headers & Trailers under limit") + + // Add enough header bytes to push us over peerSize. + req = newRequest() + req.Header = make(http.Header) + padHeaders(t, req.Header, peerSize, filler) + checkRoundTrip(req, errRequestHeaderListSize, "Headers over limit") + + // Push trailers over the limit. + req = newRequest() + req.Trailer = make(http.Header) + padHeaders(t, req.Trailer, peerSize+1, filler) + checkRoundTrip(req, errRequestHeaderListSize, "Trailers over limit") + + // Send headers with a single large value. + req = newRequest() + filler = strings.Repeat("*", int(peerSize)) + req.Header = make(http.Header) + req.Header.Set("Big", filler) + checkRoundTrip(req, errRequestHeaderListSize, "Single large header") + + // Send trailers with a single large value. + req = newRequest() + req.Trailer = make(http.Header) + req.Trailer.Set("Big", filler) + checkRoundTrip(req, errRequestHeaderListSize, "Single large trailer") +} + +func TestTransportChecksResponseHeaderListSize(t *testing.T) { + ct := newClientTester(t) + ct.client = func() error { + req, _ := http.NewRequest("GET", "https://dummy.tld/", nil) + res, err := ct.tr.RoundTrip(req) + if err != errResponseHeaderListSize { + if res != nil { + res.Body.Close() + } + size := int64(0) + for k, vv := range res.Header { + for _, v := range vv { + size += int64(len(k)) + int64(len(v)) + 32 + } + } + return fmt.Errorf("RoundTrip Error = %v (and %d bytes of response headers); want errResponseHeaderListSize", err, size) + } + return nil + } + ct.server = func() error { + ct.greet() + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + + for { + f, err := ct.fr.ReadFrame() + if err != nil { + return err + } + switch f := f.(type) { + case *HeadersFrame: + enc.WriteField(hpack.HeaderField{Name: ":status", Value: "200"}) + large := strings.Repeat("a", 1<<10) + for i := 0; i < 5042; i++ { + enc.WriteField(hpack.HeaderField{Name: large, Value: large}) + } + if size, want := buf.Len(), 6329; size != want { + // Note: this number might change if + // our hpack implementation + // changes. That's fine. This is + // just a sanity check that our + // response can fit in a single + // header block fragment frame. + return fmt.Errorf("encoding over 10MB of duplicate keypairs took %d bytes; expected %d", size, want) + } + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: f.StreamID, + EndHeaders: true, + EndStream: true, + BlockFragment: buf.Bytes(), + }) + return nil + } + } + } + ct.run() +} + +// Test that the the Transport returns a typed error from Response.Body.Read calls +// when the server sends an error. (here we use a panic, since that should generate +// a stream error, but others like cancel should be similar) +func TestTransportBodyReadErrorType(t *testing.T) { + doPanic := make(chan bool, 1) + st := newServerTester(t, + func(w http.ResponseWriter, r *http.Request) { + w.(http.Flusher).Flush() // force headers out + <-doPanic + panic("boom") + }, + optOnlyServer, + optQuiet, + ) + defer st.Close() + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + c := &http.Client{Transport: tr} + + res, err := c.Get(st.ts.URL) + if err != nil { + t.Fatal(err) + } + defer res.Body.Close() + doPanic <- true + buf := make([]byte, 100) + n, err := res.Body.Read(buf) + want := StreamError{StreamID: 0x1, Code: 0x2} + if !reflect.DeepEqual(want, err) { + t.Errorf("Read = %v, %#v; want error %#v", n, err, want) + } +} + +// golang.org/issue/13924 +// This used to fail after many iterations, especially with -race: +// go test -v -run=TestTransportDoubleCloseOnWriteError -count=500 -race +func TestTransportDoubleCloseOnWriteError(t *testing.T) { + var ( + mu sync.Mutex + conn net.Conn // to close if set + ) + + st := newServerTester(t, + func(w http.ResponseWriter, r *http.Request) { + mu.Lock() + defer mu.Unlock() + if conn != nil { + conn.Close() + } + }, + optOnlyServer, + ) + defer st.Close() + + tr := &Transport{ + TLSClientConfig: tlsConfigInsecure, + DialTLS: func(network, addr string, cfg *tls.Config) (net.Conn, error) { + tc, err := tls.Dial(network, addr, cfg) + if err != nil { + return nil, err + } + mu.Lock() + defer mu.Unlock() + conn = tc + return tc, nil + }, + } + defer tr.CloseIdleConnections() + c := &http.Client{Transport: tr} + c.Get(st.ts.URL) +} + +// Test that the http1 Transport.DisableKeepAlives option is respected +// and connections are closed as soon as idle. +// See golang.org/issue/14008 +func TestTransportDisableKeepAlives(t *testing.T) { + st := newServerTester(t, + func(w http.ResponseWriter, r *http.Request) { + io.WriteString(w, "hi") + }, + optOnlyServer, + ) + defer st.Close() + + connClosed := make(chan struct{}) // closed on tls.Conn.Close + tr := &Transport{ + t1: &http.Transport{ + DisableKeepAlives: true, + }, + TLSClientConfig: tlsConfigInsecure, + DialTLS: func(network, addr string, cfg *tls.Config) (net.Conn, error) { + tc, err := tls.Dial(network, addr, cfg) + if err != nil { + return nil, err + } + return ¬eCloseConn{Conn: tc, closefn: func() { close(connClosed) }}, nil + }, + } + c := &http.Client{Transport: tr} + res, err := c.Get(st.ts.URL) + if err != nil { + t.Fatal(err) + } + if _, err := ioutil.ReadAll(res.Body); err != nil { + t.Fatal(err) + } + defer res.Body.Close() + + select { + case <-connClosed: + case <-time.After(1 * time.Second): + t.Errorf("timeout") + } + +} + +// Test concurrent requests with Transport.DisableKeepAlives. We can share connections, +// but when things are totally idle, it still needs to close. +func TestTransportDisableKeepAlives_Concurrency(t *testing.T) { + const D = 25 * time.Millisecond + st := newServerTester(t, + func(w http.ResponseWriter, r *http.Request) { + time.Sleep(D) + io.WriteString(w, "hi") + }, + optOnlyServer, + ) + defer st.Close() + + var dials int32 + var conns sync.WaitGroup + tr := &Transport{ + t1: &http.Transport{ + DisableKeepAlives: true, + }, + TLSClientConfig: tlsConfigInsecure, + DialTLS: func(network, addr string, cfg *tls.Config) (net.Conn, error) { + tc, err := tls.Dial(network, addr, cfg) + if err != nil { + return nil, err + } + atomic.AddInt32(&dials, 1) + conns.Add(1) + return ¬eCloseConn{Conn: tc, closefn: func() { conns.Done() }}, nil + }, + } + c := &http.Client{Transport: tr} + var reqs sync.WaitGroup + const N = 20 + for i := 0; i < N; i++ { + reqs.Add(1) + if i == N-1 { + // For the final request, try to make all the + // others close. This isn't verified in the + // count, other than the Log statement, since + // it's so timing dependent. This test is + // really to make sure we don't interrupt a + // valid request. + time.Sleep(D * 2) + } + go func() { + defer reqs.Done() + res, err := c.Get(st.ts.URL) + if err != nil { + t.Error(err) + return + } + if _, err := ioutil.ReadAll(res.Body); err != nil { + t.Error(err) + return + } + res.Body.Close() + }() + } + reqs.Wait() + conns.Wait() + t.Logf("did %d dials, %d requests", atomic.LoadInt32(&dials), N) +} + +type noteCloseConn struct { + net.Conn + onceClose sync.Once + closefn func() +} + +func (c *noteCloseConn) Close() error { + c.onceClose.Do(c.closefn) + return c.Conn.Close() +} + +func isTimeout(err error) bool { + switch err := err.(type) { + case nil: + return false + case *url.Error: + return isTimeout(err.Err) + case net.Error: + return err.Timeout() + } + return false +} + +// Test that the http1 Transport.ResponseHeaderTimeout option and cancel is sent. +func TestTransportResponseHeaderTimeout_NoBody(t *testing.T) { + testTransportResponseHeaderTimeout(t, false) +} +func TestTransportResponseHeaderTimeout_Body(t *testing.T) { + testTransportResponseHeaderTimeout(t, true) +} + +func testTransportResponseHeaderTimeout(t *testing.T, body bool) { + ct := newClientTester(t) + ct.tr.t1 = &http.Transport{ + ResponseHeaderTimeout: 5 * time.Millisecond, + } + ct.client = func() error { + c := &http.Client{Transport: ct.tr} + var err error + var n int64 + const bodySize = 4 << 20 + if body { + _, err = c.Post("https://dummy.tld/", "text/foo", io.LimitReader(countingReader{&n}, bodySize)) + } else { + _, err = c.Get("https://dummy.tld/") + } + if !isTimeout(err) { + t.Errorf("client expected timeout error; got %#v", err) + } + if body && n != bodySize { + t.Errorf("only read %d bytes of body; want %d", n, bodySize) + } + return nil + } + ct.server = func() error { + ct.greet() + for { + f, err := ct.fr.ReadFrame() + if err != nil { + t.Logf("ReadFrame: %v", err) + return nil + } + switch f := f.(type) { + case *DataFrame: + dataLen := len(f.Data()) + if dataLen > 0 { + if err := ct.fr.WriteWindowUpdate(0, uint32(dataLen)); err != nil { + return err + } + if err := ct.fr.WriteWindowUpdate(f.StreamID, uint32(dataLen)); err != nil { + return err + } + } + case *RSTStreamFrame: + if f.StreamID == 1 && f.ErrCode == ErrCodeCancel { + return nil + } + } + } + } + ct.run() +} + +func TestTransportDisableCompression(t *testing.T) { + const body = "sup" + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + want := http.Header{ + "User-Agent": []string{"Go-http-client/2.0"}, + } + if !reflect.DeepEqual(r.Header, want) { + t.Errorf("request headers = %v; want %v", r.Header, want) + } + }, optOnlyServer) + defer st.Close() + + tr := &Transport{ + TLSClientConfig: tlsConfigInsecure, + t1: &http.Transport{ + DisableCompression: true, + }, + } + defer tr.CloseIdleConnections() + + req, err := http.NewRequest("GET", st.ts.URL, nil) + if err != nil { + t.Fatal(err) + } + res, err := tr.RoundTrip(req) + if err != nil { + t.Fatal(err) + } + defer res.Body.Close() +} + +// RFC 7540 section 8.1.2.2 +func TestTransportRejectsConnHeaders(t *testing.T) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + var got []string + for k := range r.Header { + got = append(got, k) + } + sort.Strings(got) + w.Header().Set("Got-Header", strings.Join(got, ",")) + }, optOnlyServer) + defer st.Close() + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + + tests := []struct { + key string + value []string + want string + }{ + { + key: "Upgrade", + value: []string{"anything"}, + want: "ERROR: http2: invalid Upgrade request header: [\"anything\"]", + }, + { + key: "Connection", + value: []string{"foo"}, + want: "ERROR: http2: invalid Connection request header: [\"foo\"]", + }, + { + key: "Connection", + value: []string{"close"}, + want: "Accept-Encoding,User-Agent", + }, + { + key: "Connection", + value: []string{"close", "something-else"}, + want: "ERROR: http2: invalid Connection request header: [\"close\" \"something-else\"]", + }, + { + key: "Connection", + value: []string{"keep-alive"}, + want: "Accept-Encoding,User-Agent", + }, + { + key: "Proxy-Connection", // just deleted and ignored + value: []string{"keep-alive"}, + want: "Accept-Encoding,User-Agent", + }, + { + key: "Transfer-Encoding", + value: []string{""}, + want: "Accept-Encoding,User-Agent", + }, + { + key: "Transfer-Encoding", + value: []string{"foo"}, + want: "ERROR: http2: invalid Transfer-Encoding request header: [\"foo\"]", + }, + { + key: "Transfer-Encoding", + value: []string{"chunked"}, + want: "Accept-Encoding,User-Agent", + }, + { + key: "Transfer-Encoding", + value: []string{"chunked", "other"}, + want: "ERROR: http2: invalid Transfer-Encoding request header: [\"chunked\" \"other\"]", + }, + { + key: "Content-Length", + value: []string{"123"}, + want: "Accept-Encoding,User-Agent", + }, + { + key: "Keep-Alive", + value: []string{"doop"}, + want: "Accept-Encoding,User-Agent", + }, + } + + for _, tt := range tests { + req, _ := http.NewRequest("GET", st.ts.URL, nil) + req.Header[tt.key] = tt.value + res, err := tr.RoundTrip(req) + var got string + if err != nil { + got = fmt.Sprintf("ERROR: %v", err) + } else { + got = res.Header.Get("Got-Header") + res.Body.Close() + } + if got != tt.want { + t.Errorf("For key %q, value %q, got = %q; want %q", tt.key, tt.value, got, tt.want) + } + } +} + +// golang.org/issue/14048 +func TestTransportFailsOnInvalidHeaders(t *testing.T) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + var got []string + for k := range r.Header { + got = append(got, k) + } + sort.Strings(got) + w.Header().Set("Got-Header", strings.Join(got, ",")) + }, optOnlyServer) + defer st.Close() + + tests := [...]struct { + h http.Header + wantErr string + }{ + 0: { + h: http.Header{"with space": {"foo"}}, + wantErr: `invalid HTTP header name "with space"`, + }, + 1: { + h: http.Header{"name": {"Брэд"}}, + wantErr: "", // okay + }, + 2: { + h: http.Header{"имя": {"Brad"}}, + wantErr: `invalid HTTP header name "имя"`, + }, + 3: { + h: http.Header{"foo": {"foo\x01bar"}}, + wantErr: `invalid HTTP header value "foo\x01bar" for header "foo"`, + }, + } + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + + for i, tt := range tests { + req, _ := http.NewRequest("GET", st.ts.URL, nil) + req.Header = tt.h + res, err := tr.RoundTrip(req) + var bad bool + if tt.wantErr == "" { + if err != nil { + bad = true + t.Errorf("case %d: error = %v; want no error", i, err) + } + } else { + if !strings.Contains(fmt.Sprint(err), tt.wantErr) { + bad = true + t.Errorf("case %d: error = %v; want error %q", i, err, tt.wantErr) + } + } + if err == nil { + if bad { + t.Logf("case %d: server got headers %q", i, res.Header.Get("Got-Header")) + } + res.Body.Close() + } + } +} + +// Tests that gzipReader doesn't crash on a second Read call following +// the first Read call's gzip.NewReader returning an error. +func TestGzipReader_DoubleReadCrash(t *testing.T) { + gz := &gzipReader{ + body: ioutil.NopCloser(strings.NewReader("0123456789")), + } + var buf [1]byte + n, err1 := gz.Read(buf[:]) + if n != 0 || !strings.Contains(fmt.Sprint(err1), "invalid header") { + t.Fatalf("Read = %v, %v; want 0, invalid header", n, err1) + } + n, err2 := gz.Read(buf[:]) + if n != 0 || err2 != err1 { + t.Fatalf("second Read = %v, %v; want 0, %v", n, err2, err1) + } +} + +func TestTransportNewTLSConfig(t *testing.T) { + tests := [...]struct { + conf *tls.Config + host string + want *tls.Config + }{ + // Normal case. + 0: { + conf: nil, + host: "foo.com", + want: &tls.Config{ + ServerName: "foo.com", + NextProtos: []string{NextProtoTLS}, + }, + }, + + // User-provided name (bar.com) takes precedence: + 1: { + conf: &tls.Config{ + ServerName: "bar.com", + }, + host: "foo.com", + want: &tls.Config{ + ServerName: "bar.com", + NextProtos: []string{NextProtoTLS}, + }, + }, + + // NextProto is prepended: + 2: { + conf: &tls.Config{ + NextProtos: []string{"foo", "bar"}, + }, + host: "example.com", + want: &tls.Config{ + ServerName: "example.com", + NextProtos: []string{NextProtoTLS, "foo", "bar"}, + }, + }, + + // NextProto is not duplicated: + 3: { + conf: &tls.Config{ + NextProtos: []string{"foo", "bar", NextProtoTLS}, + }, + host: "example.com", + want: &tls.Config{ + ServerName: "example.com", + NextProtos: []string{"foo", "bar", NextProtoTLS}, + }, + }, + } + for i, tt := range tests { + // Ignore the session ticket keys part, which ends up populating + // unexported fields in the Config: + if tt.conf != nil { + tt.conf.SessionTicketsDisabled = true + } + + tr := &Transport{TLSClientConfig: tt.conf} + got := tr.newTLSConfig(tt.host) + + got.SessionTicketsDisabled = false + + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("%d. got %#v; want %#v", i, got, tt.want) + } + } +} + +// The Google GFE responds to HEAD requests with a HEADERS frame +// without END_STREAM, followed by a 0-length DATA frame with +// END_STREAM. Make sure we don't get confused by that. (We did.) +func TestTransportReadHeadResponse(t *testing.T) { + ct := newClientTester(t) + clientDone := make(chan struct{}) + ct.client = func() error { + defer close(clientDone) + req, _ := http.NewRequest("HEAD", "https://dummy.tld/", nil) + res, err := ct.tr.RoundTrip(req) + if err != nil { + return err + } + if res.ContentLength != 123 { + return fmt.Errorf("Content-Length = %d; want 123", res.ContentLength) + } + slurp, err := ioutil.ReadAll(res.Body) + if err != nil { + return fmt.Errorf("ReadAll: %v", err) + } + if len(slurp) > 0 { + return fmt.Errorf("Unexpected non-empty ReadAll body: %q", slurp) + } + return nil + } + ct.server = func() error { + ct.greet() + for { + f, err := ct.fr.ReadFrame() + if err != nil { + t.Logf("ReadFrame: %v", err) + return nil + } + hf, ok := f.(*HeadersFrame) + if !ok { + continue + } + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + enc.WriteField(hpack.HeaderField{Name: ":status", Value: "200"}) + enc.WriteField(hpack.HeaderField{Name: "content-length", Value: "123"}) + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: hf.StreamID, + EndHeaders: true, + EndStream: false, // as the GFE does + BlockFragment: buf.Bytes(), + }) + ct.fr.WriteData(hf.StreamID, true, nil) + + <-clientDone + return nil + } + } + ct.run() +} + +type neverEnding byte + +func (b neverEnding) Read(p []byte) (int, error) { + for i := range p { + p[i] = byte(b) + } + return len(p), nil +} + +// golang.org/issue/15425: test that a handler closing the request +// body doesn't terminate the stream to the peer. (It just stops +// readability from the handler's side, and eventually the client +// runs out of flow control tokens) +func TestTransportHandlerBodyClose(t *testing.T) { + const bodySize = 10 << 20 + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + r.Body.Close() + io.Copy(w, io.LimitReader(neverEnding('A'), bodySize)) + }, optOnlyServer) + defer st.Close() + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + + g0 := runtime.NumGoroutine() + + const numReq = 10 + for i := 0; i < numReq; i++ { + req, err := http.NewRequest("POST", st.ts.URL, struct{ io.Reader }{io.LimitReader(neverEnding('A'), bodySize)}) + if err != nil { + t.Fatal(err) + } + res, err := tr.RoundTrip(req) + if err != nil { + t.Fatal(err) + } + n, err := io.Copy(ioutil.Discard, res.Body) + res.Body.Close() + if n != bodySize || err != nil { + t.Fatalf("req#%d: Copy = %d, %v; want %d, nil", i, n, err, bodySize) + } + } + tr.CloseIdleConnections() + + gd := runtime.NumGoroutine() - g0 + if gd > numReq/2 { + t.Errorf("appeared to leak goroutines") + } + +} + +// https://golang.org/issue/15930 +func TestTransportFlowControl(t *testing.T) { + const bufLen = 64 << 10 + var total int64 = 100 << 20 // 100MB + if testing.Short() { + total = 10 << 20 + } + + var wrote int64 // updated atomically + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + b := make([]byte, bufLen) + for wrote < total { + n, err := w.Write(b) + atomic.AddInt64(&wrote, int64(n)) + if err != nil { + t.Errorf("ResponseWriter.Write error: %v", err) + break + } + w.(http.Flusher).Flush() + } + }, optOnlyServer) + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + req, err := http.NewRequest("GET", st.ts.URL, nil) + if err != nil { + t.Fatal("NewRequest error:", err) + } + resp, err := tr.RoundTrip(req) + if err != nil { + t.Fatal("RoundTrip error:", err) + } + defer resp.Body.Close() + + var read int64 + b := make([]byte, bufLen) + for { + n, err := resp.Body.Read(b) + if err == io.EOF { + break + } + if err != nil { + t.Fatal("Read error:", err) + } + read += int64(n) + + const max = transportDefaultStreamFlow + if w := atomic.LoadInt64(&wrote); -max > read-w || read-w > max { + t.Fatalf("Too much data inflight: server wrote %v bytes but client only received %v", w, read) + } + + // Let the server get ahead of the client. + time.Sleep(1 * time.Millisecond) + } +} + +// golang.org/issue/14627 -- if the server sends a GOAWAY frame, make +// the Transport remember it and return it back to users (via +// RoundTrip or request body reads) if needed (e.g. if the server +// proceeds to close the TCP connection before the client gets its +// response) +func TestTransportUsesGoAwayDebugError_RoundTrip(t *testing.T) { + testTransportUsesGoAwayDebugError(t, false) +} + +func TestTransportUsesGoAwayDebugError_Body(t *testing.T) { + testTransportUsesGoAwayDebugError(t, true) +} + +func testTransportUsesGoAwayDebugError(t *testing.T, failMidBody bool) { + ct := newClientTester(t) + clientDone := make(chan struct{}) + + const goAwayErrCode = ErrCodeHTTP11Required // arbitrary + const goAwayDebugData = "some debug data" + + ct.client = func() error { + defer close(clientDone) + req, _ := http.NewRequest("GET", "https://dummy.tld/", nil) + res, err := ct.tr.RoundTrip(req) + if failMidBody { + if err != nil { + return fmt.Errorf("unexpected client RoundTrip error: %v", err) + } + _, err = io.Copy(ioutil.Discard, res.Body) + res.Body.Close() + } + want := GoAwayError{ + LastStreamID: 5, + ErrCode: goAwayErrCode, + DebugData: goAwayDebugData, + } + if !reflect.DeepEqual(err, want) { + t.Errorf("RoundTrip error = %T: %#v, want %T (%#v)", err, err, want, want) + } + return nil + } + ct.server = func() error { + ct.greet() + for { + f, err := ct.fr.ReadFrame() + if err != nil { + t.Logf("ReadFrame: %v", err) + return nil + } + hf, ok := f.(*HeadersFrame) + if !ok { + continue + } + if failMidBody { + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + enc.WriteField(hpack.HeaderField{Name: ":status", Value: "200"}) + enc.WriteField(hpack.HeaderField{Name: "content-length", Value: "123"}) + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: hf.StreamID, + EndHeaders: true, + EndStream: false, + BlockFragment: buf.Bytes(), + }) + } + // Write two GOAWAY frames, to test that the Transport takes + // the interesting parts of both. + ct.fr.WriteGoAway(5, ErrCodeNo, []byte(goAwayDebugData)) + ct.fr.WriteGoAway(5, goAwayErrCode, nil) + ct.sc.(*net.TCPConn).CloseWrite() + <-clientDone + return nil + } + } + ct.run() +} + +func testTransportReturnsUnusedFlowControl(t *testing.T, oneDataFrame bool) { + ct := newClientTester(t) + + clientClosed := make(chan struct{}) + serverWroteFirstByte := make(chan struct{}) + + ct.client = func() error { + req, _ := http.NewRequest("GET", "https://dummy.tld/", nil) + res, err := ct.tr.RoundTrip(req) + if err != nil { + return err + } + <-serverWroteFirstByte + + if n, err := res.Body.Read(make([]byte, 1)); err != nil || n != 1 { + return fmt.Errorf("body read = %v, %v; want 1, nil", n, err) + } + res.Body.Close() // leaving 4999 bytes unread + close(clientClosed) + + return nil + } + ct.server = func() error { + ct.greet() + + var hf *HeadersFrame + for { + f, err := ct.fr.ReadFrame() + if err != nil { + return fmt.Errorf("ReadFrame while waiting for Headers: %v", err) + } + switch f.(type) { + case *WindowUpdateFrame, *SettingsFrame: + continue + } + var ok bool + hf, ok = f.(*HeadersFrame) + if !ok { + return fmt.Errorf("Got %T; want HeadersFrame", f) + } + break + } + + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + enc.WriteField(hpack.HeaderField{Name: ":status", Value: "200"}) + enc.WriteField(hpack.HeaderField{Name: "content-length", Value: "5000"}) + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: hf.StreamID, + EndHeaders: true, + EndStream: false, + BlockFragment: buf.Bytes(), + }) + + // Two cases: + // - Send one DATA frame with 5000 bytes. + // - Send two DATA frames with 1 and 4999 bytes each. + // + // In both cases, the client should consume one byte of data, + // refund that byte, then refund the following 4999 bytes. + // + // In the second case, the server waits for the client connection to + // close before seconding the second DATA frame. This tests the case + // where the client receives a DATA frame after it has reset the stream. + if oneDataFrame { + ct.fr.WriteData(hf.StreamID, false /* don't end stream */, make([]byte, 5000)) + close(serverWroteFirstByte) + <-clientClosed + } else { + ct.fr.WriteData(hf.StreamID, false /* don't end stream */, make([]byte, 1)) + close(serverWroteFirstByte) + <-clientClosed + ct.fr.WriteData(hf.StreamID, false /* don't end stream */, make([]byte, 4999)) + } + + waitingFor := "RSTStreamFrame" + for { + f, err := ct.fr.ReadFrame() + if err != nil { + return fmt.Errorf("ReadFrame while waiting for %s: %v", waitingFor, err) + } + if _, ok := f.(*SettingsFrame); ok { + continue + } + switch waitingFor { + case "RSTStreamFrame": + if rf, ok := f.(*RSTStreamFrame); !ok || rf.ErrCode != ErrCodeCancel { + return fmt.Errorf("Expected a RSTStreamFrame with code cancel; got %v", summarizeFrame(f)) + } + waitingFor = "WindowUpdateFrame" + case "WindowUpdateFrame": + if wuf, ok := f.(*WindowUpdateFrame); !ok || wuf.Increment != 4999 { + return fmt.Errorf("Expected WindowUpdateFrame for 4999 bytes; got %v", summarizeFrame(f)) + } + return nil + } + } + } + ct.run() +} + +// See golang.org/issue/16481 +func TestTransportReturnsUnusedFlowControlSingleWrite(t *testing.T) { + testTransportReturnsUnusedFlowControl(t, true) +} + +// See golang.org/issue/20469 +func TestTransportReturnsUnusedFlowControlMultipleWrites(t *testing.T) { + testTransportReturnsUnusedFlowControl(t, false) +} + +// Issue 16612: adjust flow control on open streams when transport +// receives SETTINGS with INITIAL_WINDOW_SIZE from server. +func TestTransportAdjustsFlowControl(t *testing.T) { + ct := newClientTester(t) + clientDone := make(chan struct{}) + + const bodySize = 1 << 20 + + ct.client = func() error { + defer ct.cc.(*net.TCPConn).CloseWrite() + defer close(clientDone) + + req, _ := http.NewRequest("POST", "https://dummy.tld/", struct{ io.Reader }{io.LimitReader(neverEnding('A'), bodySize)}) + res, err := ct.tr.RoundTrip(req) + if err != nil { + return err + } + res.Body.Close() + return nil + } + ct.server = func() error { + _, err := io.ReadFull(ct.sc, make([]byte, len(ClientPreface))) + if err != nil { + return fmt.Errorf("reading client preface: %v", err) + } + + var gotBytes int64 + var sentSettings bool + for { + f, err := ct.fr.ReadFrame() + if err != nil { + select { + case <-clientDone: + return nil + default: + return fmt.Errorf("ReadFrame while waiting for Headers: %v", err) + } + } + switch f := f.(type) { + case *DataFrame: + gotBytes += int64(len(f.Data())) + // After we've got half the client's + // initial flow control window's worth + // of request body data, give it just + // enough flow control to finish. + if gotBytes >= initialWindowSize/2 && !sentSettings { + sentSettings = true + + ct.fr.WriteSettings(Setting{ID: SettingInitialWindowSize, Val: bodySize}) + ct.fr.WriteWindowUpdate(0, bodySize) + ct.fr.WriteSettingsAck() + } + + if f.StreamEnded() { + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + enc.WriteField(hpack.HeaderField{Name: ":status", Value: "200"}) + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: f.StreamID, + EndHeaders: true, + EndStream: true, + BlockFragment: buf.Bytes(), + }) + } + } + } + } + ct.run() +} + +// See golang.org/issue/16556 +func TestTransportReturnsDataPaddingFlowControl(t *testing.T) { + ct := newClientTester(t) + + unblockClient := make(chan bool, 1) + + ct.client = func() error { + req, _ := http.NewRequest("GET", "https://dummy.tld/", nil) + res, err := ct.tr.RoundTrip(req) + if err != nil { + return err + } + defer res.Body.Close() + <-unblockClient + return nil + } + ct.server = func() error { + ct.greet() + + var hf *HeadersFrame + for { + f, err := ct.fr.ReadFrame() + if err != nil { + return fmt.Errorf("ReadFrame while waiting for Headers: %v", err) + } + switch f.(type) { + case *WindowUpdateFrame, *SettingsFrame: + continue + } + var ok bool + hf, ok = f.(*HeadersFrame) + if !ok { + return fmt.Errorf("Got %T; want HeadersFrame", f) + } + break + } + + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + enc.WriteField(hpack.HeaderField{Name: ":status", Value: "200"}) + enc.WriteField(hpack.HeaderField{Name: "content-length", Value: "5000"}) + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: hf.StreamID, + EndHeaders: true, + EndStream: false, + BlockFragment: buf.Bytes(), + }) + pad := make([]byte, 5) + ct.fr.WriteDataPadded(hf.StreamID, false, make([]byte, 5000), pad) // without ending stream + + f, err := ct.readNonSettingsFrame() + if err != nil { + return fmt.Errorf("ReadFrame while waiting for first WindowUpdateFrame: %v", err) + } + wantBack := uint32(len(pad)) + 1 // one byte for the length of the padding + if wuf, ok := f.(*WindowUpdateFrame); !ok || wuf.Increment != wantBack || wuf.StreamID != 0 { + return fmt.Errorf("Expected conn WindowUpdateFrame for %d bytes; got %v", wantBack, summarizeFrame(f)) + } + + f, err = ct.readNonSettingsFrame() + if err != nil { + return fmt.Errorf("ReadFrame while waiting for second WindowUpdateFrame: %v", err) + } + if wuf, ok := f.(*WindowUpdateFrame); !ok || wuf.Increment != wantBack || wuf.StreamID == 0 { + return fmt.Errorf("Expected stream WindowUpdateFrame for %d bytes; got %v", wantBack, summarizeFrame(f)) + } + unblockClient <- true + return nil + } + ct.run() +} + +// golang.org/issue/16572 -- RoundTrip shouldn't hang when it gets a +// StreamError as a result of the response HEADERS +func TestTransportReturnsErrorOnBadResponseHeaders(t *testing.T) { + ct := newClientTester(t) + + ct.client = func() error { + req, _ := http.NewRequest("GET", "https://dummy.tld/", nil) + res, err := ct.tr.RoundTrip(req) + if err == nil { + res.Body.Close() + return errors.New("unexpected successful GET") + } + want := StreamError{1, ErrCodeProtocol, headerFieldNameError(" content-type")} + if !reflect.DeepEqual(want, err) { + t.Errorf("RoundTrip error = %#v; want %#v", err, want) + } + return nil + } + ct.server = func() error { + ct.greet() + + hf, err := ct.firstHeaders() + if err != nil { + return err + } + + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + enc.WriteField(hpack.HeaderField{Name: ":status", Value: "200"}) + enc.WriteField(hpack.HeaderField{Name: " content-type", Value: "bogus"}) // bogus spaces + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: hf.StreamID, + EndHeaders: true, + EndStream: false, + BlockFragment: buf.Bytes(), + }) + + for { + fr, err := ct.readFrame() + if err != nil { + return fmt.Errorf("error waiting for RST_STREAM from client: %v", err) + } + if _, ok := fr.(*SettingsFrame); ok { + continue + } + if rst, ok := fr.(*RSTStreamFrame); !ok || rst.StreamID != 1 || rst.ErrCode != ErrCodeProtocol { + t.Errorf("Frame = %v; want RST_STREAM for stream 1 with ErrCodeProtocol", summarizeFrame(fr)) + } + break + } + + return nil + } + ct.run() +} + +// byteAndEOFReader returns is in an io.Reader which reads one byte +// (the underlying byte) and io.EOF at once in its Read call. +type byteAndEOFReader byte + +func (b byteAndEOFReader) Read(p []byte) (n int, err error) { + if len(p) == 0 { + panic("unexpected useless call") + } + p[0] = byte(b) + return 1, io.EOF +} + +// Issue 16788: the Transport had a regression where it started +// sending a spurious DATA frame with a duplicate END_STREAM bit after +// the request body writer goroutine had already read an EOF from the +// Request.Body and included the END_STREAM on a data-carrying DATA +// frame. +// +// Notably, to trigger this, the requests need to use a Request.Body +// which returns (non-0, io.EOF) and also needs to set the ContentLength +// explicitly. +func TestTransportBodyDoubleEndStream(t *testing.T) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + // Nothing. + }, optOnlyServer) + defer st.Close() + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + + for i := 0; i < 2; i++ { + req, _ := http.NewRequest("POST", st.ts.URL, byteAndEOFReader('a')) + req.ContentLength = 1 + res, err := tr.RoundTrip(req) + if err != nil { + t.Fatalf("failure on req %d: %v", i+1, err) + } + defer res.Body.Close() + } +} + +// golang.org/issue/16847, golang.org/issue/19103 +func TestTransportRequestPathPseudo(t *testing.T) { + type result struct { + path string + err string + } + tests := []struct { + req *http.Request + want result + }{ + 0: { + req: &http.Request{ + Method: "GET", + URL: &url.URL{ + Host: "foo.com", + Path: "/foo", + }, + }, + want: result{path: "/foo"}, + }, + // In Go 1.7, we accepted paths of "//foo". + // In Go 1.8, we rejected it (issue 16847). + // In Go 1.9, we accepted it again (issue 19103). + 1: { + req: &http.Request{ + Method: "GET", + URL: &url.URL{ + Host: "foo.com", + Path: "//foo", + }, + }, + want: result{path: "//foo"}, + }, + + // Opaque with //$Matching_Hostname/path + 2: { + req: &http.Request{ + Method: "GET", + URL: &url.URL{ + Scheme: "https", + Opaque: "//foo.com/path", + Host: "foo.com", + Path: "/ignored", + }, + }, + want: result{path: "/path"}, + }, + + // Opaque with some other Request.Host instead: + 3: { + req: &http.Request{ + Method: "GET", + Host: "bar.com", + URL: &url.URL{ + Scheme: "https", + Opaque: "//bar.com/path", + Host: "foo.com", + Path: "/ignored", + }, + }, + want: result{path: "/path"}, + }, + + // Opaque without the leading "//": + 4: { + req: &http.Request{ + Method: "GET", + URL: &url.URL{ + Opaque: "/path", + Host: "foo.com", + Path: "/ignored", + }, + }, + want: result{path: "/path"}, + }, + + // Opaque we can't handle: + 5: { + req: &http.Request{ + Method: "GET", + URL: &url.URL{ + Scheme: "https", + Opaque: "//unknown_host/path", + Host: "foo.com", + Path: "/ignored", + }, + }, + want: result{err: `invalid request :path "https://unknown_host/path" from URL.Opaque = "//unknown_host/path"`}, + }, + + // A CONNECT request: + 6: { + req: &http.Request{ + Method: "CONNECT", + URL: &url.URL{ + Host: "foo.com", + }, + }, + want: result{}, + }, + } + for i, tt := range tests { + cc := &ClientConn{peerMaxHeaderListSize: 0xffffffffffffffff} + cc.henc = hpack.NewEncoder(&cc.hbuf) + cc.mu.Lock() + hdrs, err := cc.encodeHeaders(tt.req, false, "", -1) + cc.mu.Unlock() + var got result + hpackDec := hpack.NewDecoder(initialHeaderTableSize, func(f hpack.HeaderField) { + if f.Name == ":path" { + got.path = f.Value + } + }) + if err != nil { + got.err = err.Error() + } else if len(hdrs) > 0 { + if _, err := hpackDec.Write(hdrs); err != nil { + t.Errorf("%d. bogus hpack: %v", i, err) + continue + } + } + if got != tt.want { + t.Errorf("%d. got %+v; want %+v", i, got, tt.want) + } + + } + +} + +// golang.org/issue/17071 -- don't sniff the first byte of the request body +// before we've determined that the ClientConn is usable. +func TestRoundTripDoesntConsumeRequestBodyEarly(t *testing.T) { + const body = "foo" + req, _ := http.NewRequest("POST", "http://foo.com/", ioutil.NopCloser(strings.NewReader(body))) + cc := &ClientConn{ + closed: true, + } + _, err := cc.RoundTrip(req) + if err != errClientConnUnusable { + t.Fatalf("RoundTrip = %v; want errClientConnUnusable", err) + } + slurp, err := ioutil.ReadAll(req.Body) + if err != nil { + t.Errorf("ReadAll = %v", err) + } + if string(slurp) != body { + t.Errorf("Body = %q; want %q", slurp, body) + } +} + +func TestClientConnPing(t *testing.T) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {}, optOnlyServer) + defer st.Close() + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + cc, err := tr.dialClientConn(st.ts.Listener.Addr().String(), false) + if err != nil { + t.Fatal(err) + } + if err = cc.Ping(testContext{}); err != nil { + t.Fatal(err) + } +} + +// Issue 16974: if the server sent a DATA frame after the user +// canceled the Transport's Request, the Transport previously wrote to a +// closed pipe, got an error, and ended up closing the whole TCP +// connection. +func TestTransportCancelDataResponseRace(t *testing.T) { + cancel := make(chan struct{}) + clientGotError := make(chan bool, 1) + + const msg = "Hello." + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + if strings.Contains(r.URL.Path, "/hello") { + time.Sleep(50 * time.Millisecond) + io.WriteString(w, msg) + return + } + for i := 0; i < 50; i++ { + io.WriteString(w, "Some data.") + w.(http.Flusher).Flush() + if i == 2 { + close(cancel) + <-clientGotError + } + time.Sleep(10 * time.Millisecond) + } + }, optOnlyServer) + defer st.Close() + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + + c := &http.Client{Transport: tr} + req, _ := http.NewRequest("GET", st.ts.URL, nil) + req.Cancel = cancel + res, err := c.Do(req) + if err != nil { + t.Fatal(err) + } + if _, err = io.Copy(ioutil.Discard, res.Body); err == nil { + t.Fatal("unexpected success") + } + clientGotError <- true + + res, err = c.Get(st.ts.URL + "/hello") + if err != nil { + t.Fatal(err) + } + slurp, err := ioutil.ReadAll(res.Body) + if err != nil { + t.Fatal(err) + } + if string(slurp) != msg { + t.Errorf("Got = %q; want %q", slurp, msg) + } +} + +func TestTransportRetryAfterGOAWAY(t *testing.T) { + var dialer struct { + sync.Mutex + count int + } + ct1 := make(chan *clientTester) + ct2 := make(chan *clientTester) + + ln := newLocalListener(t) + defer ln.Close() + + tr := &Transport{ + TLSClientConfig: tlsConfigInsecure, + } + tr.DialTLS = func(network, addr string, cfg *tls.Config) (net.Conn, error) { + dialer.Lock() + defer dialer.Unlock() + dialer.count++ + if dialer.count == 3 { + return nil, errors.New("unexpected number of dials") + } + cc, err := net.Dial("tcp", ln.Addr().String()) + if err != nil { + return nil, fmt.Errorf("dial error: %v", err) + } + sc, err := ln.Accept() + if err != nil { + return nil, fmt.Errorf("accept error: %v", err) + } + ct := &clientTester{ + t: t, + tr: tr, + cc: cc, + sc: sc, + fr: NewFramer(sc, sc), + } + switch dialer.count { + case 1: + ct1 <- ct + case 2: + ct2 <- ct + } + return cc, nil + } + + errs := make(chan error, 3) + done := make(chan struct{}) + defer close(done) + + // Client. + go func() { + req, _ := http.NewRequest("GET", "https://dummy.tld/", nil) + res, err := tr.RoundTrip(req) + if res != nil { + res.Body.Close() + if got := res.Header.Get("Foo"); got != "bar" { + err = fmt.Errorf("foo header = %q; want bar", got) + } + } + if err != nil { + err = fmt.Errorf("RoundTrip: %v", err) + } + errs <- err + }() + + connToClose := make(chan io.Closer, 2) + + // Server for the first request. + go func() { + var ct *clientTester + select { + case ct = <-ct1: + case <-done: + return + } + + connToClose <- ct.cc + ct.greet() + hf, err := ct.firstHeaders() + if err != nil { + errs <- fmt.Errorf("server1 failed reading HEADERS: %v", err) + return + } + t.Logf("server1 got %v", hf) + if err := ct.fr.WriteGoAway(0 /*max id*/, ErrCodeNo, nil); err != nil { + errs <- fmt.Errorf("server1 failed writing GOAWAY: %v", err) + return + } + errs <- nil + }() + + // Server for the second request. + go func() { + var ct *clientTester + select { + case ct = <-ct2: + case <-done: + return + } + + connToClose <- ct.cc + ct.greet() + hf, err := ct.firstHeaders() + if err != nil { + errs <- fmt.Errorf("server2 failed reading HEADERS: %v", err) + return + } + t.Logf("server2 got %v", hf) + + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + enc.WriteField(hpack.HeaderField{Name: ":status", Value: "200"}) + enc.WriteField(hpack.HeaderField{Name: "foo", Value: "bar"}) + err = ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: hf.StreamID, + EndHeaders: true, + EndStream: false, + BlockFragment: buf.Bytes(), + }) + if err != nil { + errs <- fmt.Errorf("server2 failed writing response HEADERS: %v", err) + } else { + errs <- nil + } + }() + + for k := 0; k < 3; k++ { + select { + case err := <-errs: + if err != nil { + t.Error(err) + } + case <-time.After(1 * time.Second): + t.Errorf("timed out") + } + } + + for { + select { + case c := <-connToClose: + c.Close() + default: + return + } + } +} + +func TestTransportRetryAfterRefusedStream(t *testing.T) { + clientDone := make(chan struct{}) + ct := newClientTester(t) + ct.client = func() error { + defer ct.cc.(*net.TCPConn).CloseWrite() + defer close(clientDone) + req, _ := http.NewRequest("GET", "https://dummy.tld/", nil) + resp, err := ct.tr.RoundTrip(req) + if err != nil { + return fmt.Errorf("RoundTrip: %v", err) + } + resp.Body.Close() + if resp.StatusCode != 204 { + return fmt.Errorf("Status = %v; want 204", resp.StatusCode) + } + return nil + } + ct.server = func() error { + ct.greet() + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + nreq := 0 + + for { + f, err := ct.fr.ReadFrame() + if err != nil { + select { + case <-clientDone: + // If the client's done, it + // will have reported any + // errors on its side. + return nil + default: + return err + } + } + switch f := f.(type) { + case *WindowUpdateFrame, *SettingsFrame: + case *HeadersFrame: + if !f.HeadersEnded() { + return fmt.Errorf("headers should have END_HEADERS be ended: %v", f) + } + nreq++ + if nreq == 1 { + ct.fr.WriteRSTStream(f.StreamID, ErrCodeRefusedStream) + } else { + enc.WriteField(hpack.HeaderField{Name: ":status", Value: "204"}) + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: f.StreamID, + EndHeaders: true, + EndStream: true, + BlockFragment: buf.Bytes(), + }) + } + default: + return fmt.Errorf("Unexpected client frame %v", f) + } + } + } + ct.run() +} + +func TestTransportRetryHasLimit(t *testing.T) { + // Skip in short mode because the total expected delay is 1s+2s+4s+8s+16s=29s. + if testing.Short() { + t.Skip("skipping long test in short mode") + } + clientDone := make(chan struct{}) + ct := newClientTester(t) + ct.client = func() error { + defer ct.cc.(*net.TCPConn).CloseWrite() + defer close(clientDone) + req, _ := http.NewRequest("GET", "https://dummy.tld/", nil) + resp, err := ct.tr.RoundTrip(req) + if err == nil { + return fmt.Errorf("RoundTrip expected error, got response: %+v", resp) + } + t.Logf("expected error, got: %v", err) + return nil + } + ct.server = func() error { + ct.greet() + for { + f, err := ct.fr.ReadFrame() + if err != nil { + select { + case <-clientDone: + // If the client's done, it + // will have reported any + // errors on its side. + return nil + default: + return err + } + } + switch f := f.(type) { + case *WindowUpdateFrame, *SettingsFrame: + case *HeadersFrame: + if !f.HeadersEnded() { + return fmt.Errorf("headers should have END_HEADERS be ended: %v", f) + } + ct.fr.WriteRSTStream(f.StreamID, ErrCodeRefusedStream) + default: + return fmt.Errorf("Unexpected client frame %v", f) + } + } + } + ct.run() +} + +func TestTransportResponseDataBeforeHeaders(t *testing.T) { + ct := newClientTester(t) + ct.client = func() error { + defer ct.cc.(*net.TCPConn).CloseWrite() + req := httptest.NewRequest("GET", "https://dummy.tld/", nil) + // First request is normal to ensure the check is per stream and not per connection. + _, err := ct.tr.RoundTrip(req) + if err != nil { + return fmt.Errorf("RoundTrip expected no error, got: %v", err) + } + // Second request returns a DATA frame with no HEADERS. + resp, err := ct.tr.RoundTrip(req) + if err == nil { + return fmt.Errorf("RoundTrip expected error, got response: %+v", resp) + } + if err, ok := err.(StreamError); !ok || err.Code != ErrCodeProtocol { + return fmt.Errorf("expected stream PROTOCOL_ERROR, got: %v", err) + } + return nil + } + ct.server = func() error { + ct.greet() + for { + f, err := ct.fr.ReadFrame() + if err == io.EOF { + return nil + } else if err != nil { + return err + } + switch f := f.(type) { + case *WindowUpdateFrame, *SettingsFrame: + case *HeadersFrame: + switch f.StreamID { + case 1: + // Send a valid response to first request. + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + enc.WriteField(hpack.HeaderField{Name: ":status", Value: "200"}) + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: f.StreamID, + EndHeaders: true, + EndStream: true, + BlockFragment: buf.Bytes(), + }) + case 3: + ct.fr.WriteData(f.StreamID, true, []byte("payload")) + } + default: + return fmt.Errorf("Unexpected client frame %v", f) + } + } + } + ct.run() +} +func TestTransportRequestsStallAtServerLimit(t *testing.T) { + const maxConcurrent = 2 + + greet := make(chan struct{}) // server sends initial SETTINGS frame + gotRequest := make(chan struct{}) // server received a request + clientDone := make(chan struct{}) + + // Collect errors from goroutines. + var wg sync.WaitGroup + errs := make(chan error, 100) + defer func() { + wg.Wait() + close(errs) + for err := range errs { + t.Error(err) + } + }() + + // We will send maxConcurrent+2 requests. This checker goroutine waits for the + // following stages: + // 1. The first maxConcurrent requests are received by the server. + // 2. The client will cancel the next request + // 3. The server is unblocked so it can service the first maxConcurrent requests + // 4. The client will send the final request + wg.Add(1) + unblockClient := make(chan struct{}) + clientRequestCancelled := make(chan struct{}) + unblockServer := make(chan struct{}) + go func() { + defer wg.Done() + // Stage 1. + for k := 0; k < maxConcurrent; k++ { + <-gotRequest + } + // Stage 2. + close(unblockClient) + <-clientRequestCancelled + // Stage 3: give some time for the final RoundTrip call to be scheduled and + // verify that the final request is not sent. + time.Sleep(50 * time.Millisecond) + select { + case <-gotRequest: + errs <- errors.New("last request did not stall") + close(unblockServer) + return + default: + } + close(unblockServer) + // Stage 4. + <-gotRequest + }() + + ct := newClientTester(t) + ct.client = func() error { + var wg sync.WaitGroup + defer func() { + wg.Wait() + close(clientDone) + ct.cc.(*net.TCPConn).CloseWrite() + }() + for k := 0; k < maxConcurrent+2; k++ { + wg.Add(1) + go func(k int) { + defer wg.Done() + // Don't send the second request until after receiving SETTINGS from the server + // to avoid a race where we use the default SettingMaxConcurrentStreams, which + // is much larger than maxConcurrent. We have to send the first request before + // waiting because the first request triggers the dial and greet. + if k > 0 { + <-greet + } + // Block until maxConcurrent requests are sent before sending any more. + if k >= maxConcurrent { + <-unblockClient + } + req, _ := http.NewRequest("GET", fmt.Sprintf("https://dummy.tld/%d", k), nil) + if k == maxConcurrent { + // This request will be canceled. + cancel := make(chan struct{}) + req.Cancel = cancel + close(cancel) + _, err := ct.tr.RoundTrip(req) + close(clientRequestCancelled) + if err == nil { + errs <- fmt.Errorf("RoundTrip(%d) should have failed due to cancel", k) + return + } + } else { + resp, err := ct.tr.RoundTrip(req) + if err != nil { + errs <- fmt.Errorf("RoundTrip(%d): %v", k, err) + return + } + ioutil.ReadAll(resp.Body) + resp.Body.Close() + if resp.StatusCode != 204 { + errs <- fmt.Errorf("Status = %v; want 204", resp.StatusCode) + return + } + } + }(k) + } + return nil + } + + ct.server = func() error { + var wg sync.WaitGroup + defer wg.Wait() + + ct.greet(Setting{SettingMaxConcurrentStreams, maxConcurrent}) + + // Server write loop. + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + writeResp := make(chan uint32, maxConcurrent+1) + + wg.Add(1) + go func() { + defer wg.Done() + <-unblockServer + for id := range writeResp { + buf.Reset() + enc.WriteField(hpack.HeaderField{Name: ":status", Value: "204"}) + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: id, + EndHeaders: true, + EndStream: true, + BlockFragment: buf.Bytes(), + }) + } + }() + + // Server read loop. + var nreq int + for { + f, err := ct.fr.ReadFrame() + if err != nil { + select { + case <-clientDone: + // If the client's done, it will have reported any errors on its side. + return nil + default: + return err + } + } + switch f := f.(type) { + case *WindowUpdateFrame: + case *SettingsFrame: + // Wait for the client SETTINGS ack until ending the greet. + close(greet) + case *HeadersFrame: + if !f.HeadersEnded() { + return fmt.Errorf("headers should have END_HEADERS be ended: %v", f) + } + gotRequest <- struct{}{} + nreq++ + writeResp <- f.StreamID + if nreq == maxConcurrent+1 { + close(writeResp) + } + default: + return fmt.Errorf("Unexpected client frame %v", f) + } + } + } + + ct.run() +} + +func TestAuthorityAddr(t *testing.T) { + tests := []struct { + scheme, authority string + want string + }{ + {"http", "foo.com", "foo.com:80"}, + {"https", "foo.com", "foo.com:443"}, + {"https", "foo.com:1234", "foo.com:1234"}, + {"https", "1.2.3.4:1234", "1.2.3.4:1234"}, + {"https", "1.2.3.4", "1.2.3.4:443"}, + {"https", "[::1]:1234", "[::1]:1234"}, + {"https", "[::1]", "[::1]:443"}, + } + for _, tt := range tests { + got := authorityAddr(tt.scheme, tt.authority) + if got != tt.want { + t.Errorf("authorityAddr(%q, %q) = %q; want %q", tt.scheme, tt.authority, got, tt.want) + } + } +} + +// Issue 20448: stop allocating for DATA frames' payload after +// Response.Body.Close is called. +func TestTransportAllocationsAfterResponseBodyClose(t *testing.T) { + megabyteZero := make([]byte, 1<<20) + + writeErr := make(chan error, 1) + + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + w.(http.Flusher).Flush() + var sum int64 + for i := 0; i < 100; i++ { + n, err := w.Write(megabyteZero) + sum += int64(n) + if err != nil { + writeErr <- err + return + } + } + t.Logf("wrote all %d bytes", sum) + writeErr <- nil + }, optOnlyServer) + defer st.Close() + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + c := &http.Client{Transport: tr} + res, err := c.Get(st.ts.URL) + if err != nil { + t.Fatal(err) + } + var buf [1]byte + if _, err := res.Body.Read(buf[:]); err != nil { + t.Error(err) + } + if err := res.Body.Close(); err != nil { + t.Error(err) + } + + trb, ok := res.Body.(transportResponseBody) + if !ok { + t.Fatalf("res.Body = %T; want transportResponseBody", res.Body) + } + if trb.cs.bufPipe.b != nil { + t.Errorf("response body pipe is still open") + } + + gotErr := <-writeErr + if gotErr == nil { + t.Errorf("Handler unexpectedly managed to write its entire response without getting an error") + } else if gotErr != errStreamClosed { + t.Errorf("Handler Write err = %v; want errStreamClosed", gotErr) + } +} + +// Issue 18891: make sure Request.Body == NoBody means no DATA frame +// is ever sent, even if empty. +func TestTransportNoBodyMeansNoDATA(t *testing.T) { + ct := newClientTester(t) + + unblockClient := make(chan bool) + + ct.client = func() error { + req, _ := http.NewRequest("GET", "https://dummy.tld/", go18httpNoBody()) + ct.tr.RoundTrip(req) + <-unblockClient + return nil + } + ct.server = func() error { + defer close(unblockClient) + defer ct.cc.(*net.TCPConn).Close() + ct.greet() + + for { + f, err := ct.fr.ReadFrame() + if err != nil { + return fmt.Errorf("ReadFrame while waiting for Headers: %v", err) + } + switch f := f.(type) { + default: + return fmt.Errorf("Got %T; want HeadersFrame", f) + case *WindowUpdateFrame, *SettingsFrame: + continue + case *HeadersFrame: + if !f.StreamEnded() { + return fmt.Errorf("got headers frame without END_STREAM") + } + return nil + } + } + } + ct.run() +} + +func benchSimpleRoundTrip(b *testing.B, nHeaders int) { + defer disableGoroutineTracking()() + b.ReportAllocs() + st := newServerTester(b, + func(w http.ResponseWriter, r *http.Request) { + }, + optOnlyServer, + optQuiet, + ) + defer st.Close() + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + + req, err := http.NewRequest("GET", st.ts.URL, nil) + if err != nil { + b.Fatal(err) + } + + for i := 0; i < nHeaders; i++ { + name := fmt.Sprint("A-", i) + req.Header.Set(name, "*") + } + + b.ResetTimer() + + for i := 0; i < b.N; i++ { + res, err := tr.RoundTrip(req) + if err != nil { + if res != nil { + res.Body.Close() + } + b.Fatalf("RoundTrip err = %v; want nil", err) + } + res.Body.Close() + if res.StatusCode != http.StatusOK { + b.Fatalf("Response code = %v; want %v", res.StatusCode, http.StatusOK) + } + } +} + +func BenchmarkClientRequestHeaders(b *testing.B) { + b.Run(" 0 Headers", func(b *testing.B) { benchSimpleRoundTrip(b, 0) }) + b.Run(" 10 Headers", func(b *testing.B) { benchSimpleRoundTrip(b, 10) }) + b.Run(" 100 Headers", func(b *testing.B) { benchSimpleRoundTrip(b, 100) }) + b.Run("1000 Headers", func(b *testing.B) { benchSimpleRoundTrip(b, 1000) }) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/write.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/write.go new file mode 100644 index 0000000..6b0dfae --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/write.go @@ -0,0 +1,370 @@ +// 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 http2 + +import ( + "bytes" + "fmt" + "log" + "net/http" + "net/url" + "time" + + "golang.org/x/net/http2/hpack" + "golang.org/x/net/lex/httplex" +) + +// writeFramer is implemented by any type that is used to write frames. +type writeFramer interface { + writeFrame(writeContext) error + + // staysWithinBuffer reports whether this writer promises that + // it will only write less than or equal to size bytes, and it + // won't Flush the write context. + staysWithinBuffer(size int) bool +} + +// writeContext is the interface needed by the various frame writer +// types below. All the writeFrame methods below are scheduled via the +// frame writing scheduler (see writeScheduler in writesched.go). +// +// This interface is implemented by *serverConn. +// +// TODO: decide whether to a) use this in the client code (which didn't +// end up using this yet, because it has a simpler design, not +// currently implementing priorities), or b) delete this and +// make the server code a bit more concrete. +type writeContext interface { + Framer() *Framer + Flush() error + CloseConn() error + // HeaderEncoder returns an HPACK encoder that writes to the + // returned buffer. + HeaderEncoder() (*hpack.Encoder, *bytes.Buffer) +} + +// writeEndsStream reports whether w writes a frame that will transition +// the stream to a half-closed local state. This returns false for RST_STREAM, +// which closes the entire stream (not just the local half). +func writeEndsStream(w writeFramer) bool { + switch v := w.(type) { + case *writeData: + return v.endStream + case *writeResHeaders: + return v.endStream + case nil: + // This can only happen if the caller reuses w after it's + // been intentionally nil'ed out to prevent use. Keep this + // here to catch future refactoring breaking it. + panic("writeEndsStream called on nil writeFramer") + } + return false +} + +type flushFrameWriter struct{} + +func (flushFrameWriter) writeFrame(ctx writeContext) error { + return ctx.Flush() +} + +func (flushFrameWriter) staysWithinBuffer(max int) bool { return false } + +type writeSettings []Setting + +func (s writeSettings) staysWithinBuffer(max int) bool { + const settingSize = 6 // uint16 + uint32 + return frameHeaderLen+settingSize*len(s) <= max + +} + +func (s writeSettings) writeFrame(ctx writeContext) error { + return ctx.Framer().WriteSettings([]Setting(s)...) +} + +type writeGoAway struct { + maxStreamID uint32 + code ErrCode +} + +func (p *writeGoAway) writeFrame(ctx writeContext) error { + err := ctx.Framer().WriteGoAway(p.maxStreamID, p.code, nil) + if p.code != 0 { + ctx.Flush() // ignore error: we're hanging up on them anyway + time.Sleep(50 * time.Millisecond) + ctx.CloseConn() + } + return err +} + +func (*writeGoAway) staysWithinBuffer(max int) bool { return false } // flushes + +type writeData struct { + streamID uint32 + p []byte + endStream bool +} + +func (w *writeData) String() string { + return fmt.Sprintf("writeData(stream=%d, p=%d, endStream=%v)", w.streamID, len(w.p), w.endStream) +} + +func (w *writeData) writeFrame(ctx writeContext) error { + return ctx.Framer().WriteData(w.streamID, w.endStream, w.p) +} + +func (w *writeData) staysWithinBuffer(max int) bool { + return frameHeaderLen+len(w.p) <= max +} + +// handlerPanicRST is the message sent from handler goroutines when +// the handler panics. +type handlerPanicRST struct { + StreamID uint32 +} + +func (hp handlerPanicRST) writeFrame(ctx writeContext) error { + return ctx.Framer().WriteRSTStream(hp.StreamID, ErrCodeInternal) +} + +func (hp handlerPanicRST) staysWithinBuffer(max int) bool { return frameHeaderLen+4 <= max } + +func (se StreamError) writeFrame(ctx writeContext) error { + return ctx.Framer().WriteRSTStream(se.StreamID, se.Code) +} + +func (se StreamError) staysWithinBuffer(max int) bool { return frameHeaderLen+4 <= max } + +type writePingAck struct{ pf *PingFrame } + +func (w writePingAck) writeFrame(ctx writeContext) error { + return ctx.Framer().WritePing(true, w.pf.Data) +} + +func (w writePingAck) staysWithinBuffer(max int) bool { return frameHeaderLen+len(w.pf.Data) <= max } + +type writeSettingsAck struct{} + +func (writeSettingsAck) writeFrame(ctx writeContext) error { + return ctx.Framer().WriteSettingsAck() +} + +func (writeSettingsAck) staysWithinBuffer(max int) bool { return frameHeaderLen <= max } + +// splitHeaderBlock splits headerBlock into fragments so that each fragment fits +// in a single frame, then calls fn for each fragment. firstFrag/lastFrag are true +// for the first/last fragment, respectively. +func splitHeaderBlock(ctx writeContext, headerBlock []byte, fn func(ctx writeContext, frag []byte, firstFrag, lastFrag bool) error) error { + // For now we're lazy and just pick the minimum MAX_FRAME_SIZE + // that all peers must support (16KB). Later we could care + // more and send larger frames if the peer advertised it, but + // there's little point. Most headers are small anyway (so we + // generally won't have CONTINUATION frames), and extra frames + // only waste 9 bytes anyway. + const maxFrameSize = 16384 + + first := true + for len(headerBlock) > 0 { + frag := headerBlock + if len(frag) > maxFrameSize { + frag = frag[:maxFrameSize] + } + headerBlock = headerBlock[len(frag):] + if err := fn(ctx, frag, first, len(headerBlock) == 0); err != nil { + return err + } + first = false + } + return nil +} + +// writeResHeaders is a request to write a HEADERS and 0+ CONTINUATION frames +// for HTTP response headers or trailers from a server handler. +type writeResHeaders struct { + streamID uint32 + httpResCode int // 0 means no ":status" line + h http.Header // may be nil + trailers []string // if non-nil, which keys of h to write. nil means all. + endStream bool + + date string + contentType string + contentLength string +} + +func encKV(enc *hpack.Encoder, k, v string) { + if VerboseLogs { + log.Printf("http2: server encoding header %q = %q", k, v) + } + enc.WriteField(hpack.HeaderField{Name: k, Value: v}) +} + +func (w *writeResHeaders) staysWithinBuffer(max int) bool { + // TODO: this is a common one. It'd be nice to return true + // here and get into the fast path if we could be clever and + // calculate the size fast enough, or at least a conservative + // uppper bound that usually fires. (Maybe if w.h and + // w.trailers are nil, so we don't need to enumerate it.) + // Otherwise I'm afraid that just calculating the length to + // answer this question would be slower than the ~2µs benefit. + return false +} + +func (w *writeResHeaders) writeFrame(ctx writeContext) error { + enc, buf := ctx.HeaderEncoder() + buf.Reset() + + if w.httpResCode != 0 { + encKV(enc, ":status", httpCodeString(w.httpResCode)) + } + + encodeHeaders(enc, w.h, w.trailers) + + if w.contentType != "" { + encKV(enc, "content-type", w.contentType) + } + if w.contentLength != "" { + encKV(enc, "content-length", w.contentLength) + } + if w.date != "" { + encKV(enc, "date", w.date) + } + + headerBlock := buf.Bytes() + if len(headerBlock) == 0 && w.trailers == nil { + panic("unexpected empty hpack") + } + + return splitHeaderBlock(ctx, headerBlock, w.writeHeaderBlock) +} + +func (w *writeResHeaders) writeHeaderBlock(ctx writeContext, frag []byte, firstFrag, lastFrag bool) error { + if firstFrag { + return ctx.Framer().WriteHeaders(HeadersFrameParam{ + StreamID: w.streamID, + BlockFragment: frag, + EndStream: w.endStream, + EndHeaders: lastFrag, + }) + } else { + return ctx.Framer().WriteContinuation(w.streamID, lastFrag, frag) + } +} + +// writePushPromise is a request to write a PUSH_PROMISE and 0+ CONTINUATION frames. +type writePushPromise struct { + streamID uint32 // pusher stream + method string // for :method + url *url.URL // for :scheme, :authority, :path + h http.Header + + // Creates an ID for a pushed stream. This runs on serveG just before + // the frame is written. The returned ID is copied to promisedID. + allocatePromisedID func() (uint32, error) + promisedID uint32 +} + +func (w *writePushPromise) staysWithinBuffer(max int) bool { + // TODO: see writeResHeaders.staysWithinBuffer + return false +} + +func (w *writePushPromise) writeFrame(ctx writeContext) error { + enc, buf := ctx.HeaderEncoder() + buf.Reset() + + encKV(enc, ":method", w.method) + encKV(enc, ":scheme", w.url.Scheme) + encKV(enc, ":authority", w.url.Host) + encKV(enc, ":path", w.url.RequestURI()) + encodeHeaders(enc, w.h, nil) + + headerBlock := buf.Bytes() + if len(headerBlock) == 0 { + panic("unexpected empty hpack") + } + + return splitHeaderBlock(ctx, headerBlock, w.writeHeaderBlock) +} + +func (w *writePushPromise) writeHeaderBlock(ctx writeContext, frag []byte, firstFrag, lastFrag bool) error { + if firstFrag { + return ctx.Framer().WritePushPromise(PushPromiseParam{ + StreamID: w.streamID, + PromiseID: w.promisedID, + BlockFragment: frag, + EndHeaders: lastFrag, + }) + } else { + return ctx.Framer().WriteContinuation(w.streamID, lastFrag, frag) + } +} + +type write100ContinueHeadersFrame struct { + streamID uint32 +} + +func (w write100ContinueHeadersFrame) writeFrame(ctx writeContext) error { + enc, buf := ctx.HeaderEncoder() + buf.Reset() + encKV(enc, ":status", "100") + return ctx.Framer().WriteHeaders(HeadersFrameParam{ + StreamID: w.streamID, + BlockFragment: buf.Bytes(), + EndStream: false, + EndHeaders: true, + }) +} + +func (w write100ContinueHeadersFrame) staysWithinBuffer(max int) bool { + // Sloppy but conservative: + return 9+2*(len(":status")+len("100")) <= max +} + +type writeWindowUpdate struct { + streamID uint32 // or 0 for conn-level + n uint32 +} + +func (wu writeWindowUpdate) staysWithinBuffer(max int) bool { return frameHeaderLen+4 <= max } + +func (wu writeWindowUpdate) writeFrame(ctx writeContext) error { + return ctx.Framer().WriteWindowUpdate(wu.streamID, wu.n) +} + +// encodeHeaders encodes an http.Header. If keys is not nil, then (k, h[k]) +// is encoded only only if k is in keys. +func encodeHeaders(enc *hpack.Encoder, h http.Header, keys []string) { + if keys == nil { + sorter := sorterPool.Get().(*sorter) + // Using defer here, since the returned keys from the + // sorter.Keys method is only valid until the sorter + // is returned: + defer sorterPool.Put(sorter) + keys = sorter.Keys(h) + } + for _, k := range keys { + vv := h[k] + k = lowerHeader(k) + if !validWireHeaderFieldName(k) { + // Skip it as backup paranoia. Per + // golang.org/issue/14048, these should + // already be rejected at a higher level. + continue + } + isTE := k == "transfer-encoding" + for _, v := range vv { + if !httplex.ValidHeaderFieldValue(v) { + // TODO: return an error? golang.org/issue/14048 + // For now just omit it. + continue + } + // TODO: more of "8.1.2.2 Connection-Specific Header Fields" + if isTE && v != "trailers" { + continue + } + encKV(enc, k, v) + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/writesched.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/writesched.go new file mode 100644 index 0000000..4fe3073 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/writesched.go @@ -0,0 +1,242 @@ +// 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 http2 + +import "fmt" + +// WriteScheduler is the interface implemented by HTTP/2 write schedulers. +// Methods are never called concurrently. +type WriteScheduler interface { + // OpenStream opens a new stream in the write scheduler. + // It is illegal to call this with streamID=0 or with a streamID that is + // already open -- the call may panic. + OpenStream(streamID uint32, options OpenStreamOptions) + + // CloseStream closes a stream in the write scheduler. Any frames queued on + // this stream should be discarded. It is illegal to call this on a stream + // that is not open -- the call may panic. + CloseStream(streamID uint32) + + // AdjustStream adjusts the priority of the given stream. This may be called + // on a stream that has not yet been opened or has been closed. Note that + // RFC 7540 allows PRIORITY frames to be sent on streams in any state. See: + // https://tools.ietf.org/html/rfc7540#section-5.1 + AdjustStream(streamID uint32, priority PriorityParam) + + // Push queues a frame in the scheduler. In most cases, this will not be + // called with wr.StreamID()!=0 unless that stream is currently open. The one + // exception is RST_STREAM frames, which may be sent on idle or closed streams. + Push(wr FrameWriteRequest) + + // Pop dequeues the next frame to write. Returns false if no frames can + // be written. Frames with a given wr.StreamID() are Pop'd in the same + // order they are Push'd. + Pop() (wr FrameWriteRequest, ok bool) +} + +// OpenStreamOptions specifies extra options for WriteScheduler.OpenStream. +type OpenStreamOptions struct { + // PusherID is zero if the stream was initiated by the client. Otherwise, + // PusherID names the stream that pushed the newly opened stream. + PusherID uint32 +} + +// FrameWriteRequest is a request to write a frame. +type FrameWriteRequest struct { + // write is the interface value that does the writing, once the + // WriteScheduler has selected this frame to write. The write + // functions are all defined in write.go. + write writeFramer + + // stream is the stream on which this frame will be written. + // nil for non-stream frames like PING and SETTINGS. + stream *stream + + // done, if non-nil, must be a buffered channel with space for + // 1 message and is sent the return value from write (or an + // earlier error) when the frame has been written. + done chan error +} + +// StreamID returns the id of the stream this frame will be written to. +// 0 is used for non-stream frames such as PING and SETTINGS. +func (wr FrameWriteRequest) StreamID() uint32 { + if wr.stream == nil { + if se, ok := wr.write.(StreamError); ok { + // (*serverConn).resetStream doesn't set + // stream because it doesn't necessarily have + // one. So special case this type of write + // message. + return se.StreamID + } + return 0 + } + return wr.stream.id +} + +// DataSize returns the number of flow control bytes that must be consumed +// to write this entire frame. This is 0 for non-DATA frames. +func (wr FrameWriteRequest) DataSize() int { + if wd, ok := wr.write.(*writeData); ok { + return len(wd.p) + } + return 0 +} + +// Consume consumes min(n, available) bytes from this frame, where available +// is the number of flow control bytes available on the stream. Consume returns +// 0, 1, or 2 frames, where the integer return value gives the number of frames +// returned. +// +// If flow control prevents consuming any bytes, this returns (_, _, 0). If +// the entire frame was consumed, this returns (wr, _, 1). Otherwise, this +// returns (consumed, rest, 2), where 'consumed' contains the consumed bytes and +// 'rest' contains the remaining bytes. The consumed bytes are deducted from the +// underlying stream's flow control budget. +func (wr FrameWriteRequest) Consume(n int32) (FrameWriteRequest, FrameWriteRequest, int) { + var empty FrameWriteRequest + + // Non-DATA frames are always consumed whole. + wd, ok := wr.write.(*writeData) + if !ok || len(wd.p) == 0 { + return wr, empty, 1 + } + + // Might need to split after applying limits. + allowed := wr.stream.flow.available() + if n < allowed { + allowed = n + } + if wr.stream.sc.maxFrameSize < allowed { + allowed = wr.stream.sc.maxFrameSize + } + if allowed <= 0 { + return empty, empty, 0 + } + if len(wd.p) > int(allowed) { + wr.stream.flow.take(allowed) + consumed := FrameWriteRequest{ + stream: wr.stream, + write: &writeData{ + streamID: wd.streamID, + p: wd.p[:allowed], + // Even if the original had endStream set, there + // are bytes remaining because len(wd.p) > allowed, + // so we know endStream is false. + endStream: false, + }, + // Our caller is blocking on the final DATA frame, not + // this intermediate frame, so no need to wait. + done: nil, + } + rest := FrameWriteRequest{ + stream: wr.stream, + write: &writeData{ + streamID: wd.streamID, + p: wd.p[allowed:], + endStream: wd.endStream, + }, + done: wr.done, + } + return consumed, rest, 2 + } + + // The frame is consumed whole. + // NB: This cast cannot overflow because allowed is <= math.MaxInt32. + wr.stream.flow.take(int32(len(wd.p))) + return wr, empty, 1 +} + +// String is for debugging only. +func (wr FrameWriteRequest) String() string { + var des string + if s, ok := wr.write.(fmt.Stringer); ok { + des = s.String() + } else { + des = fmt.Sprintf("%T", wr.write) + } + return fmt.Sprintf("[FrameWriteRequest stream=%d, ch=%v, writer=%v]", wr.StreamID(), wr.done != nil, des) +} + +// replyToWriter sends err to wr.done and panics if the send must block +// This does nothing if wr.done is nil. +func (wr *FrameWriteRequest) replyToWriter(err error) { + if wr.done == nil { + return + } + select { + case wr.done <- err: + default: + panic(fmt.Sprintf("unbuffered done channel passed in for type %T", wr.write)) + } + wr.write = nil // prevent use (assume it's tainted after wr.done send) +} + +// writeQueue is used by implementations of WriteScheduler. +type writeQueue struct { + s []FrameWriteRequest +} + +func (q *writeQueue) empty() bool { return len(q.s) == 0 } + +func (q *writeQueue) push(wr FrameWriteRequest) { + q.s = append(q.s, wr) +} + +func (q *writeQueue) shift() FrameWriteRequest { + if len(q.s) == 0 { + panic("invalid use of queue") + } + wr := q.s[0] + // TODO: less copy-happy queue. + copy(q.s, q.s[1:]) + q.s[len(q.s)-1] = FrameWriteRequest{} + q.s = q.s[:len(q.s)-1] + return wr +} + +// consume consumes up to n bytes from q.s[0]. If the frame is +// entirely consumed, it is removed from the queue. If the frame +// is partially consumed, the frame is kept with the consumed +// bytes removed. Returns true iff any bytes were consumed. +func (q *writeQueue) consume(n int32) (FrameWriteRequest, bool) { + if len(q.s) == 0 { + return FrameWriteRequest{}, false + } + consumed, rest, numresult := q.s[0].Consume(n) + switch numresult { + case 0: + return FrameWriteRequest{}, false + case 1: + q.shift() + case 2: + q.s[0] = rest + } + return consumed, true +} + +type writeQueuePool []*writeQueue + +// put inserts an unused writeQueue into the pool. +func (p *writeQueuePool) put(q *writeQueue) { + for i := range q.s { + q.s[i] = FrameWriteRequest{} + } + q.s = q.s[:0] + *p = append(*p, q) +} + +// get returns an empty writeQueue. +func (p *writeQueuePool) get() *writeQueue { + ln := len(*p) + if ln == 0 { + return new(writeQueue) + } + x := ln - 1 + q := (*p)[x] + (*p)[x] = nil + *p = (*p)[:x] + return q +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/writesched_priority.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/writesched_priority.go new file mode 100644 index 0000000..848fed6 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/writesched_priority.go @@ -0,0 +1,452 @@ +// 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 http2 + +import ( + "fmt" + "math" + "sort" +) + +// RFC 7540, Section 5.3.5: the default weight is 16. +const priorityDefaultWeight = 15 // 16 = 15 + 1 + +// PriorityWriteSchedulerConfig configures a priorityWriteScheduler. +type PriorityWriteSchedulerConfig struct { + // MaxClosedNodesInTree controls the maximum number of closed streams to + // retain in the priority tree. Setting this to zero saves a small amount + // of memory at the cost of performance. + // + // See RFC 7540, Section 5.3.4: + // "It is possible for a stream to become closed while prioritization + // information ... is in transit. ... This potentially creates suboptimal + // prioritization, since the stream could be given a priority that is + // different from what is intended. To avoid these problems, an endpoint + // SHOULD retain stream prioritization state for a period after streams + // become closed. The longer state is retained, the lower the chance that + // streams are assigned incorrect or default priority values." + MaxClosedNodesInTree int + + // MaxIdleNodesInTree controls the maximum number of idle streams to + // retain in the priority tree. Setting this to zero saves a small amount + // of memory at the cost of performance. + // + // See RFC 7540, Section 5.3.4: + // Similarly, streams that are in the "idle" state can be assigned + // priority or become a parent of other streams. This allows for the + // creation of a grouping node in the dependency tree, which enables + // more flexible expressions of priority. Idle streams begin with a + // default priority (Section 5.3.5). + MaxIdleNodesInTree int + + // ThrottleOutOfOrderWrites enables write throttling to help ensure that + // data is delivered in priority order. This works around a race where + // stream B depends on stream A and both streams are about to call Write + // to queue DATA frames. If B wins the race, a naive scheduler would eagerly + // write as much data from B as possible, but this is suboptimal because A + // is a higher-priority stream. With throttling enabled, we write a small + // amount of data from B to minimize the amount of bandwidth that B can + // steal from A. + ThrottleOutOfOrderWrites bool +} + +// NewPriorityWriteScheduler constructs a WriteScheduler that schedules +// frames by following HTTP/2 priorities as described in RFC 7540 Section 5.3. +// If cfg is nil, default options are used. +func NewPriorityWriteScheduler(cfg *PriorityWriteSchedulerConfig) WriteScheduler { + if cfg == nil { + // For justification of these defaults, see: + // https://docs.google.com/document/d/1oLhNg1skaWD4_DtaoCxdSRN5erEXrH-KnLrMwEpOtFY + cfg = &PriorityWriteSchedulerConfig{ + MaxClosedNodesInTree: 10, + MaxIdleNodesInTree: 10, + ThrottleOutOfOrderWrites: false, + } + } + + ws := &priorityWriteScheduler{ + nodes: make(map[uint32]*priorityNode), + maxClosedNodesInTree: cfg.MaxClosedNodesInTree, + maxIdleNodesInTree: cfg.MaxIdleNodesInTree, + enableWriteThrottle: cfg.ThrottleOutOfOrderWrites, + } + ws.nodes[0] = &ws.root + if cfg.ThrottleOutOfOrderWrites { + ws.writeThrottleLimit = 1024 + } else { + ws.writeThrottleLimit = math.MaxInt32 + } + return ws +} + +type priorityNodeState int + +const ( + priorityNodeOpen priorityNodeState = iota + priorityNodeClosed + priorityNodeIdle +) + +// priorityNode is a node in an HTTP/2 priority tree. +// Each node is associated with a single stream ID. +// See RFC 7540, Section 5.3. +type priorityNode struct { + q writeQueue // queue of pending frames to write + id uint32 // id of the stream, or 0 for the root of the tree + weight uint8 // the actual weight is weight+1, so the value is in [1,256] + state priorityNodeState // open | closed | idle + bytes int64 // number of bytes written by this node, or 0 if closed + subtreeBytes int64 // sum(node.bytes) of all nodes in this subtree + + // These links form the priority tree. + parent *priorityNode + kids *priorityNode // start of the kids list + prev, next *priorityNode // doubly-linked list of siblings +} + +func (n *priorityNode) setParent(parent *priorityNode) { + if n == parent { + panic("setParent to self") + } + if n.parent == parent { + return + } + // Unlink from current parent. + if parent := n.parent; parent != nil { + if n.prev == nil { + parent.kids = n.next + } else { + n.prev.next = n.next + } + if n.next != nil { + n.next.prev = n.prev + } + } + // Link to new parent. + // If parent=nil, remove n from the tree. + // Always insert at the head of parent.kids (this is assumed by walkReadyInOrder). + n.parent = parent + if parent == nil { + n.next = nil + n.prev = nil + } else { + n.next = parent.kids + n.prev = nil + if n.next != nil { + n.next.prev = n + } + parent.kids = n + } +} + +func (n *priorityNode) addBytes(b int64) { + n.bytes += b + for ; n != nil; n = n.parent { + n.subtreeBytes += b + } +} + +// walkReadyInOrder iterates over the tree in priority order, calling f for each node +// with a non-empty write queue. When f returns true, this funcion returns true and the +// walk halts. tmp is used as scratch space for sorting. +// +// f(n, openParent) takes two arguments: the node to visit, n, and a bool that is true +// if any ancestor p of n is still open (ignoring the root node). +func (n *priorityNode) walkReadyInOrder(openParent bool, tmp *[]*priorityNode, f func(*priorityNode, bool) bool) bool { + if !n.q.empty() && f(n, openParent) { + return true + } + if n.kids == nil { + return false + } + + // Don't consider the root "open" when updating openParent since + // we can't send data frames on the root stream (only control frames). + if n.id != 0 { + openParent = openParent || (n.state == priorityNodeOpen) + } + + // Common case: only one kid or all kids have the same weight. + // Some clients don't use weights; other clients (like web browsers) + // use mostly-linear priority trees. + w := n.kids.weight + needSort := false + for k := n.kids.next; k != nil; k = k.next { + if k.weight != w { + needSort = true + break + } + } + if !needSort { + for k := n.kids; k != nil; k = k.next { + if k.walkReadyInOrder(openParent, tmp, f) { + return true + } + } + return false + } + + // Uncommon case: sort the child nodes. We remove the kids from the parent, + // then re-insert after sorting so we can reuse tmp for future sort calls. + *tmp = (*tmp)[:0] + for n.kids != nil { + *tmp = append(*tmp, n.kids) + n.kids.setParent(nil) + } + sort.Sort(sortPriorityNodeSiblings(*tmp)) + for i := len(*tmp) - 1; i >= 0; i-- { + (*tmp)[i].setParent(n) // setParent inserts at the head of n.kids + } + for k := n.kids; k != nil; k = k.next { + if k.walkReadyInOrder(openParent, tmp, f) { + return true + } + } + return false +} + +type sortPriorityNodeSiblings []*priorityNode + +func (z sortPriorityNodeSiblings) Len() int { return len(z) } +func (z sortPriorityNodeSiblings) Swap(i, k int) { z[i], z[k] = z[k], z[i] } +func (z sortPriorityNodeSiblings) Less(i, k int) bool { + // Prefer the subtree that has sent fewer bytes relative to its weight. + // See sections 5.3.2 and 5.3.4. + wi, bi := float64(z[i].weight+1), float64(z[i].subtreeBytes) + wk, bk := float64(z[k].weight+1), float64(z[k].subtreeBytes) + if bi == 0 && bk == 0 { + return wi >= wk + } + if bk == 0 { + return false + } + return bi/bk <= wi/wk +} + +type priorityWriteScheduler struct { + // root is the root of the priority tree, where root.id = 0. + // The root queues control frames that are not associated with any stream. + root priorityNode + + // nodes maps stream ids to priority tree nodes. + nodes map[uint32]*priorityNode + + // maxID is the maximum stream id in nodes. + maxID uint32 + + // lists of nodes that have been closed or are idle, but are kept in + // the tree for improved prioritization. When the lengths exceed either + // maxClosedNodesInTree or maxIdleNodesInTree, old nodes are discarded. + closedNodes, idleNodes []*priorityNode + + // From the config. + maxClosedNodesInTree int + maxIdleNodesInTree int + writeThrottleLimit int32 + enableWriteThrottle bool + + // tmp is scratch space for priorityNode.walkReadyInOrder to reduce allocations. + tmp []*priorityNode + + // pool of empty queues for reuse. + queuePool writeQueuePool +} + +func (ws *priorityWriteScheduler) OpenStream(streamID uint32, options OpenStreamOptions) { + // The stream may be currently idle but cannot be opened or closed. + if curr := ws.nodes[streamID]; curr != nil { + if curr.state != priorityNodeIdle { + panic(fmt.Sprintf("stream %d already opened", streamID)) + } + curr.state = priorityNodeOpen + return + } + + // RFC 7540, Section 5.3.5: + // "All streams are initially assigned a non-exclusive dependency on stream 0x0. + // Pushed streams initially depend on their associated stream. In both cases, + // streams are assigned a default weight of 16." + parent := ws.nodes[options.PusherID] + if parent == nil { + parent = &ws.root + } + n := &priorityNode{ + q: *ws.queuePool.get(), + id: streamID, + weight: priorityDefaultWeight, + state: priorityNodeOpen, + } + n.setParent(parent) + ws.nodes[streamID] = n + if streamID > ws.maxID { + ws.maxID = streamID + } +} + +func (ws *priorityWriteScheduler) CloseStream(streamID uint32) { + if streamID == 0 { + panic("violation of WriteScheduler interface: cannot close stream 0") + } + if ws.nodes[streamID] == nil { + panic(fmt.Sprintf("violation of WriteScheduler interface: unknown stream %d", streamID)) + } + if ws.nodes[streamID].state != priorityNodeOpen { + panic(fmt.Sprintf("violation of WriteScheduler interface: stream %d already closed", streamID)) + } + + n := ws.nodes[streamID] + n.state = priorityNodeClosed + n.addBytes(-n.bytes) + + q := n.q + ws.queuePool.put(&q) + n.q.s = nil + if ws.maxClosedNodesInTree > 0 { + ws.addClosedOrIdleNode(&ws.closedNodes, ws.maxClosedNodesInTree, n) + } else { + ws.removeNode(n) + } +} + +func (ws *priorityWriteScheduler) AdjustStream(streamID uint32, priority PriorityParam) { + if streamID == 0 { + panic("adjustPriority on root") + } + + // If streamID does not exist, there are two cases: + // - A closed stream that has been removed (this will have ID <= maxID) + // - An idle stream that is being used for "grouping" (this will have ID > maxID) + n := ws.nodes[streamID] + if n == nil { + if streamID <= ws.maxID || ws.maxIdleNodesInTree == 0 { + return + } + ws.maxID = streamID + n = &priorityNode{ + q: *ws.queuePool.get(), + id: streamID, + weight: priorityDefaultWeight, + state: priorityNodeIdle, + } + n.setParent(&ws.root) + ws.nodes[streamID] = n + ws.addClosedOrIdleNode(&ws.idleNodes, ws.maxIdleNodesInTree, n) + } + + // Section 5.3.1: A dependency on a stream that is not currently in the tree + // results in that stream being given a default priority (Section 5.3.5). + parent := ws.nodes[priority.StreamDep] + if parent == nil { + n.setParent(&ws.root) + n.weight = priorityDefaultWeight + return + } + + // Ignore if the client tries to make a node its own parent. + if n == parent { + return + } + + // Section 5.3.3: + // "If a stream is made dependent on one of its own dependencies, the + // formerly dependent stream is first moved to be dependent on the + // reprioritized stream's previous parent. The moved dependency retains + // its weight." + // + // That is: if parent depends on n, move parent to depend on n.parent. + for x := parent.parent; x != nil; x = x.parent { + if x == n { + parent.setParent(n.parent) + break + } + } + + // Section 5.3.3: The exclusive flag causes the stream to become the sole + // dependency of its parent stream, causing other dependencies to become + // dependent on the exclusive stream. + if priority.Exclusive { + k := parent.kids + for k != nil { + next := k.next + if k != n { + k.setParent(n) + } + k = next + } + } + + n.setParent(parent) + n.weight = priority.Weight +} + +func (ws *priorityWriteScheduler) Push(wr FrameWriteRequest) { + var n *priorityNode + if id := wr.StreamID(); id == 0 { + n = &ws.root + } else { + n = ws.nodes[id] + if n == nil { + // id is an idle or closed stream. wr should not be a HEADERS or + // DATA frame. However, wr can be a RST_STREAM. In this case, we + // push wr onto the root, rather than creating a new priorityNode, + // since RST_STREAM is tiny and the stream's priority is unknown + // anyway. See issue #17919. + if wr.DataSize() > 0 { + panic("add DATA on non-open stream") + } + n = &ws.root + } + } + n.q.push(wr) +} + +func (ws *priorityWriteScheduler) Pop() (wr FrameWriteRequest, ok bool) { + ws.root.walkReadyInOrder(false, &ws.tmp, func(n *priorityNode, openParent bool) bool { + limit := int32(math.MaxInt32) + if openParent { + limit = ws.writeThrottleLimit + } + wr, ok = n.q.consume(limit) + if !ok { + return false + } + n.addBytes(int64(wr.DataSize())) + // If B depends on A and B continuously has data available but A + // does not, gradually increase the throttling limit to allow B to + // steal more and more bandwidth from A. + if openParent { + ws.writeThrottleLimit += 1024 + if ws.writeThrottleLimit < 0 { + ws.writeThrottleLimit = math.MaxInt32 + } + } else if ws.enableWriteThrottle { + ws.writeThrottleLimit = 1024 + } + return true + }) + return wr, ok +} + +func (ws *priorityWriteScheduler) addClosedOrIdleNode(list *[]*priorityNode, maxSize int, n *priorityNode) { + if maxSize == 0 { + return + } + if len(*list) == maxSize { + // Remove the oldest node, then shift left. + ws.removeNode((*list)[0]) + x := (*list)[1:] + copy(*list, x) + *list = (*list)[:len(x)] + } + *list = append(*list, n) +} + +func (ws *priorityWriteScheduler) removeNode(n *priorityNode) { + for k := n.kids; k != nil; k = k.next { + k.setParent(n.parent) + } + n.setParent(nil) + delete(ws.nodes, n.id) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/writesched_priority_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/writesched_priority_test.go new file mode 100644 index 0000000..f2b535a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/writesched_priority_test.go @@ -0,0 +1,541 @@ +// 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 http2 + +import ( + "bytes" + "fmt" + "sort" + "testing" +) + +func defaultPriorityWriteScheduler() *priorityWriteScheduler { + return NewPriorityWriteScheduler(nil).(*priorityWriteScheduler) +} + +func checkPriorityWellFormed(ws *priorityWriteScheduler) error { + for id, n := range ws.nodes { + if id != n.id { + return fmt.Errorf("bad ws.nodes: ws.nodes[%d] = %d", id, n.id) + } + if n.parent == nil { + if n.next != nil || n.prev != nil { + return fmt.Errorf("bad node %d: nil parent but prev/next not nil", id) + } + continue + } + found := false + for k := n.parent.kids; k != nil; k = k.next { + if k.id == id { + found = true + break + } + } + if !found { + return fmt.Errorf("bad node %d: not found in parent %d kids list", id, n.parent.id) + } + } + return nil +} + +func fmtTree(ws *priorityWriteScheduler, fmtNode func(*priorityNode) string) string { + var ids []int + for _, n := range ws.nodes { + ids = append(ids, int(n.id)) + } + sort.Ints(ids) + + var buf bytes.Buffer + for _, id := range ids { + if buf.Len() != 0 { + buf.WriteString(" ") + } + if id == 0 { + buf.WriteString(fmtNode(&ws.root)) + } else { + buf.WriteString(fmtNode(ws.nodes[uint32(id)])) + } + } + return buf.String() +} + +func fmtNodeParentSkipRoot(n *priorityNode) string { + switch { + case n.id == 0: + return "" + case n.parent == nil: + return fmt.Sprintf("%d{parent:nil}", n.id) + default: + return fmt.Sprintf("%d{parent:%d}", n.id, n.parent.id) + } +} + +func fmtNodeWeightParentSkipRoot(n *priorityNode) string { + switch { + case n.id == 0: + return "" + case n.parent == nil: + return fmt.Sprintf("%d{weight:%d,parent:nil}", n.id, n.weight) + default: + return fmt.Sprintf("%d{weight:%d,parent:%d}", n.id, n.weight, n.parent.id) + } +} + +func TestPriorityTwoStreams(t *testing.T) { + ws := defaultPriorityWriteScheduler() + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{}) + + want := "1{weight:15,parent:0} 2{weight:15,parent:0}" + if got := fmtTree(ws, fmtNodeWeightParentSkipRoot); got != want { + t.Errorf("After open\ngot %q\nwant %q", got, want) + } + + // Move 1's parent to 2. + ws.AdjustStream(1, PriorityParam{ + StreamDep: 2, + Weight: 32, + Exclusive: false, + }) + want = "1{weight:32,parent:2} 2{weight:15,parent:0}" + if got := fmtTree(ws, fmtNodeWeightParentSkipRoot); got != want { + t.Errorf("After adjust\ngot %q\nwant %q", got, want) + } + + if err := checkPriorityWellFormed(ws); err != nil { + t.Error(err) + } +} + +func TestPriorityAdjustExclusiveZero(t *testing.T) { + // 1, 2, and 3 are all children of the 0 stream. + // Exclusive reprioritization to any of the streams should bring + // the rest of the streams under the reprioritized stream. + ws := defaultPriorityWriteScheduler() + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{}) + ws.OpenStream(3, OpenStreamOptions{}) + + want := "1{weight:15,parent:0} 2{weight:15,parent:0} 3{weight:15,parent:0}" + if got := fmtTree(ws, fmtNodeWeightParentSkipRoot); got != want { + t.Errorf("After open\ngot %q\nwant %q", got, want) + } + + ws.AdjustStream(2, PriorityParam{ + StreamDep: 0, + Weight: 20, + Exclusive: true, + }) + want = "1{weight:15,parent:2} 2{weight:20,parent:0} 3{weight:15,parent:2}" + if got := fmtTree(ws, fmtNodeWeightParentSkipRoot); got != want { + t.Errorf("After adjust\ngot %q\nwant %q", got, want) + } + + if err := checkPriorityWellFormed(ws); err != nil { + t.Error(err) + } +} + +func TestPriorityAdjustOwnParent(t *testing.T) { + // Assigning a node as its own parent should have no effect. + ws := defaultPriorityWriteScheduler() + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{}) + ws.AdjustStream(2, PriorityParam{ + StreamDep: 2, + Weight: 20, + Exclusive: true, + }) + want := "1{weight:15,parent:0} 2{weight:15,parent:0}" + if got := fmtTree(ws, fmtNodeWeightParentSkipRoot); got != want { + t.Errorf("After adjust\ngot %q\nwant %q", got, want) + } + if err := checkPriorityWellFormed(ws); err != nil { + t.Error(err) + } +} + +func TestPriorityClosedStreams(t *testing.T) { + ws := NewPriorityWriteScheduler(&PriorityWriteSchedulerConfig{MaxClosedNodesInTree: 2}).(*priorityWriteScheduler) + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{PusherID: 1}) + ws.OpenStream(3, OpenStreamOptions{PusherID: 2}) + ws.OpenStream(4, OpenStreamOptions{PusherID: 3}) + + // Close the first three streams. We lose 1, but keep 2 and 3. + ws.CloseStream(1) + ws.CloseStream(2) + ws.CloseStream(3) + + want := "2{weight:15,parent:0} 3{weight:15,parent:2} 4{weight:15,parent:3}" + if got := fmtTree(ws, fmtNodeWeightParentSkipRoot); got != want { + t.Errorf("After close\ngot %q\nwant %q", got, want) + } + if err := checkPriorityWellFormed(ws); err != nil { + t.Error(err) + } + + // Adding a stream as an exclusive child of 1 gives it default + // priorities, since 1 is gone. + ws.OpenStream(5, OpenStreamOptions{}) + ws.AdjustStream(5, PriorityParam{StreamDep: 1, Weight: 15, Exclusive: true}) + + // Adding a stream as an exclusive child of 2 should work, since 2 is not gone. + ws.OpenStream(6, OpenStreamOptions{}) + ws.AdjustStream(6, PriorityParam{StreamDep: 2, Weight: 15, Exclusive: true}) + + want = "2{weight:15,parent:0} 3{weight:15,parent:6} 4{weight:15,parent:3} 5{weight:15,parent:0} 6{weight:15,parent:2}" + if got := fmtTree(ws, fmtNodeWeightParentSkipRoot); got != want { + t.Errorf("After add streams\ngot %q\nwant %q", got, want) + } + if err := checkPriorityWellFormed(ws); err != nil { + t.Error(err) + } +} + +func TestPriorityClosedStreamsDisabled(t *testing.T) { + ws := NewPriorityWriteScheduler(&PriorityWriteSchedulerConfig{}).(*priorityWriteScheduler) + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{PusherID: 1}) + ws.OpenStream(3, OpenStreamOptions{PusherID: 2}) + + // Close the first two streams. We keep only 3. + ws.CloseStream(1) + ws.CloseStream(2) + + want := "3{weight:15,parent:0}" + if got := fmtTree(ws, fmtNodeWeightParentSkipRoot); got != want { + t.Errorf("After close\ngot %q\nwant %q", got, want) + } + if err := checkPriorityWellFormed(ws); err != nil { + t.Error(err) + } +} + +func TestPriorityIdleStreams(t *testing.T) { + ws := NewPriorityWriteScheduler(&PriorityWriteSchedulerConfig{MaxIdleNodesInTree: 2}).(*priorityWriteScheduler) + ws.AdjustStream(1, PriorityParam{StreamDep: 0, Weight: 15}) // idle + ws.AdjustStream(2, PriorityParam{StreamDep: 0, Weight: 15}) // idle + ws.AdjustStream(3, PriorityParam{StreamDep: 2, Weight: 20}) // idle + ws.OpenStream(4, OpenStreamOptions{}) + ws.OpenStream(5, OpenStreamOptions{}) + ws.OpenStream(6, OpenStreamOptions{}) + ws.AdjustStream(4, PriorityParam{StreamDep: 1, Weight: 15}) + ws.AdjustStream(5, PriorityParam{StreamDep: 2, Weight: 15}) + ws.AdjustStream(6, PriorityParam{StreamDep: 3, Weight: 15}) + + want := "2{weight:15,parent:0} 3{weight:20,parent:2} 4{weight:15,parent:0} 5{weight:15,parent:2} 6{weight:15,parent:3}" + if got := fmtTree(ws, fmtNodeWeightParentSkipRoot); got != want { + t.Errorf("After open\ngot %q\nwant %q", got, want) + } + if err := checkPriorityWellFormed(ws); err != nil { + t.Error(err) + } +} + +func TestPriorityIdleStreamsDisabled(t *testing.T) { + ws := NewPriorityWriteScheduler(&PriorityWriteSchedulerConfig{}).(*priorityWriteScheduler) + ws.AdjustStream(1, PriorityParam{StreamDep: 0, Weight: 15}) // idle + ws.AdjustStream(2, PriorityParam{StreamDep: 0, Weight: 15}) // idle + ws.AdjustStream(3, PriorityParam{StreamDep: 2, Weight: 20}) // idle + ws.OpenStream(4, OpenStreamOptions{}) + + want := "4{weight:15,parent:0}" + if got := fmtTree(ws, fmtNodeWeightParentSkipRoot); got != want { + t.Errorf("After open\ngot %q\nwant %q", got, want) + } + if err := checkPriorityWellFormed(ws); err != nil { + t.Error(err) + } +} + +func TestPrioritySection531NonExclusive(t *testing.T) { + // Example from RFC 7540 Section 5.3.1. + // A,B,C,D = 1,2,3,4 + ws := defaultPriorityWriteScheduler() + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{PusherID: 1}) + ws.OpenStream(3, OpenStreamOptions{PusherID: 1}) + ws.OpenStream(4, OpenStreamOptions{}) + ws.AdjustStream(4, PriorityParam{ + StreamDep: 1, + Weight: 15, + Exclusive: false, + }) + want := "1{parent:0} 2{parent:1} 3{parent:1} 4{parent:1}" + if got := fmtTree(ws, fmtNodeParentSkipRoot); got != want { + t.Errorf("After adjust\ngot %q\nwant %q", got, want) + } + if err := checkPriorityWellFormed(ws); err != nil { + t.Error(err) + } +} + +func TestPrioritySection531Exclusive(t *testing.T) { + // Example from RFC 7540 Section 5.3.1. + // A,B,C,D = 1,2,3,4 + ws := defaultPriorityWriteScheduler() + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{PusherID: 1}) + ws.OpenStream(3, OpenStreamOptions{PusherID: 1}) + ws.OpenStream(4, OpenStreamOptions{}) + ws.AdjustStream(4, PriorityParam{ + StreamDep: 1, + Weight: 15, + Exclusive: true, + }) + want := "1{parent:0} 2{parent:4} 3{parent:4} 4{parent:1}" + if got := fmtTree(ws, fmtNodeParentSkipRoot); got != want { + t.Errorf("After adjust\ngot %q\nwant %q", got, want) + } + if err := checkPriorityWellFormed(ws); err != nil { + t.Error(err) + } +} + +func makeSection533Tree() *priorityWriteScheduler { + // Initial tree from RFC 7540 Section 5.3.3. + // A,B,C,D,E,F = 1,2,3,4,5,6 + ws := defaultPriorityWriteScheduler() + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{PusherID: 1}) + ws.OpenStream(3, OpenStreamOptions{PusherID: 1}) + ws.OpenStream(4, OpenStreamOptions{PusherID: 3}) + ws.OpenStream(5, OpenStreamOptions{PusherID: 3}) + ws.OpenStream(6, OpenStreamOptions{PusherID: 4}) + return ws +} + +func TestPrioritySection533NonExclusive(t *testing.T) { + // Example from RFC 7540 Section 5.3.3. + // A,B,C,D,E,F = 1,2,3,4,5,6 + ws := defaultPriorityWriteScheduler() + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{PusherID: 1}) + ws.OpenStream(3, OpenStreamOptions{PusherID: 1}) + ws.OpenStream(4, OpenStreamOptions{PusherID: 3}) + ws.OpenStream(5, OpenStreamOptions{PusherID: 3}) + ws.OpenStream(6, OpenStreamOptions{PusherID: 4}) + ws.AdjustStream(1, PriorityParam{ + StreamDep: 4, + Weight: 15, + Exclusive: false, + }) + want := "1{parent:4} 2{parent:1} 3{parent:1} 4{parent:0} 5{parent:3} 6{parent:4}" + if got := fmtTree(ws, fmtNodeParentSkipRoot); got != want { + t.Errorf("After adjust\ngot %q\nwant %q", got, want) + } + if err := checkPriorityWellFormed(ws); err != nil { + t.Error(err) + } +} + +func TestPrioritySection533Exclusive(t *testing.T) { + // Example from RFC 7540 Section 5.3.3. + // A,B,C,D,E,F = 1,2,3,4,5,6 + ws := defaultPriorityWriteScheduler() + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{PusherID: 1}) + ws.OpenStream(3, OpenStreamOptions{PusherID: 1}) + ws.OpenStream(4, OpenStreamOptions{PusherID: 3}) + ws.OpenStream(5, OpenStreamOptions{PusherID: 3}) + ws.OpenStream(6, OpenStreamOptions{PusherID: 4}) + ws.AdjustStream(1, PriorityParam{ + StreamDep: 4, + Weight: 15, + Exclusive: true, + }) + want := "1{parent:4} 2{parent:1} 3{parent:1} 4{parent:0} 5{parent:3} 6{parent:1}" + if got := fmtTree(ws, fmtNodeParentSkipRoot); got != want { + t.Errorf("After adjust\ngot %q\nwant %q", got, want) + } + if err := checkPriorityWellFormed(ws); err != nil { + t.Error(err) + } +} + +func checkPopAll(ws WriteScheduler, order []uint32) error { + for k, id := range order { + wr, ok := ws.Pop() + if !ok { + return fmt.Errorf("Pop[%d]: got ok=false, want %d (order=%v)", k, id, order) + } + if got := wr.StreamID(); got != id { + return fmt.Errorf("Pop[%d]: got %v, want %d (order=%v)", k, got, id, order) + } + } + wr, ok := ws.Pop() + if ok { + return fmt.Errorf("Pop[%d]: got %v, want ok=false (order=%v)", len(order), wr.StreamID(), order) + } + return nil +} + +func TestPriorityPopFrom533Tree(t *testing.T) { + ws := makeSection533Tree() + + ws.Push(makeWriteHeadersRequest(3 /*C*/)) + ws.Push(makeWriteNonStreamRequest()) + ws.Push(makeWriteHeadersRequest(5 /*E*/)) + ws.Push(makeWriteHeadersRequest(1 /*A*/)) + t.Log("tree:", fmtTree(ws, fmtNodeParentSkipRoot)) + + if err := checkPopAll(ws, []uint32{0 /*NonStream*/, 1, 3, 5}); err != nil { + t.Error(err) + } +} + +func TestPriorityPopFromLinearTree(t *testing.T) { + ws := defaultPriorityWriteScheduler() + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{PusherID: 1}) + ws.OpenStream(3, OpenStreamOptions{PusherID: 2}) + ws.OpenStream(4, OpenStreamOptions{PusherID: 3}) + + ws.Push(makeWriteHeadersRequest(3)) + ws.Push(makeWriteHeadersRequest(4)) + ws.Push(makeWriteHeadersRequest(1)) + ws.Push(makeWriteHeadersRequest(2)) + ws.Push(makeWriteNonStreamRequest()) + ws.Push(makeWriteNonStreamRequest()) + t.Log("tree:", fmtTree(ws, fmtNodeParentSkipRoot)) + + if err := checkPopAll(ws, []uint32{0, 0 /*NonStreams*/, 1, 2, 3, 4}); err != nil { + t.Error(err) + } +} + +func TestPriorityFlowControl(t *testing.T) { + ws := NewPriorityWriteScheduler(&PriorityWriteSchedulerConfig{ThrottleOutOfOrderWrites: false}) + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{PusherID: 1}) + + sc := &serverConn{maxFrameSize: 16} + st1 := &stream{id: 1, sc: sc} + st2 := &stream{id: 2, sc: sc} + + ws.Push(FrameWriteRequest{&writeData{1, make([]byte, 16), false}, st1, nil}) + ws.Push(FrameWriteRequest{&writeData{2, make([]byte, 16), false}, st2, nil}) + ws.AdjustStream(2, PriorityParam{StreamDep: 1}) + + // No flow-control bytes available. + if wr, ok := ws.Pop(); ok { + t.Fatalf("Pop(limited by flow control)=%v,true, want false", wr) + } + + // Add enough flow-control bytes to write st2 in two Pop calls. + // Should write data from st2 even though it's lower priority than st1. + for i := 1; i <= 2; i++ { + st2.flow.add(8) + wr, ok := ws.Pop() + if !ok { + t.Fatalf("Pop(%d)=false, want true", i) + } + if got, want := wr.DataSize(), 8; got != want { + t.Fatalf("Pop(%d)=%d bytes, want %d bytes", i, got, want) + } + } +} + +func TestPriorityThrottleOutOfOrderWrites(t *testing.T) { + ws := NewPriorityWriteScheduler(&PriorityWriteSchedulerConfig{ThrottleOutOfOrderWrites: true}) + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{PusherID: 1}) + + sc := &serverConn{maxFrameSize: 4096} + st1 := &stream{id: 1, sc: sc} + st2 := &stream{id: 2, sc: sc} + st1.flow.add(4096) + st2.flow.add(4096) + ws.Push(FrameWriteRequest{&writeData{2, make([]byte, 4096), false}, st2, nil}) + ws.AdjustStream(2, PriorityParam{StreamDep: 1}) + + // We have enough flow-control bytes to write st2 in a single Pop call. + // However, due to out-of-order write throttling, the first call should + // only write 1KB. + wr, ok := ws.Pop() + if !ok { + t.Fatalf("Pop(st2.first)=false, want true") + } + if got, want := wr.StreamID(), uint32(2); got != want { + t.Fatalf("Pop(st2.first)=stream %d, want stream %d", got, want) + } + if got, want := wr.DataSize(), 1024; got != want { + t.Fatalf("Pop(st2.first)=%d bytes, want %d bytes", got, want) + } + + // Now add data on st1. This should take precedence. + ws.Push(FrameWriteRequest{&writeData{1, make([]byte, 4096), false}, st1, nil}) + wr, ok = ws.Pop() + if !ok { + t.Fatalf("Pop(st1)=false, want true") + } + if got, want := wr.StreamID(), uint32(1); got != want { + t.Fatalf("Pop(st1)=stream %d, want stream %d", got, want) + } + if got, want := wr.DataSize(), 4096; got != want { + t.Fatalf("Pop(st1)=%d bytes, want %d bytes", got, want) + } + + // Should go back to writing 1KB from st2. + wr, ok = ws.Pop() + if !ok { + t.Fatalf("Pop(st2.last)=false, want true") + } + if got, want := wr.StreamID(), uint32(2); got != want { + t.Fatalf("Pop(st2.last)=stream %d, want stream %d", got, want) + } + if got, want := wr.DataSize(), 1024; got != want { + t.Fatalf("Pop(st2.last)=%d bytes, want %d bytes", got, want) + } +} + +func TestPriorityWeights(t *testing.T) { + ws := defaultPriorityWriteScheduler() + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{}) + + sc := &serverConn{maxFrameSize: 8} + st1 := &stream{id: 1, sc: sc} + st2 := &stream{id: 2, sc: sc} + st1.flow.add(40) + st2.flow.add(40) + + ws.Push(FrameWriteRequest{&writeData{1, make([]byte, 40), false}, st1, nil}) + ws.Push(FrameWriteRequest{&writeData{2, make([]byte, 40), false}, st2, nil}) + ws.AdjustStream(1, PriorityParam{StreamDep: 0, Weight: 34}) + ws.AdjustStream(2, PriorityParam{StreamDep: 0, Weight: 9}) + + // st1 gets 3.5x the bandwidth of st2 (3.5 = (34+1)/(9+1)). + // The maximum frame size is 8 bytes. The write sequence should be: + // st1, total bytes so far is (st1=8, st=0) + // st2, total bytes so far is (st1=8, st=8) + // st1, total bytes so far is (st1=16, st=8) + // st1, total bytes so far is (st1=24, st=8) // 3x bandwidth + // st1, total bytes so far is (st1=32, st=8) // 4x bandwidth + // st2, total bytes so far is (st1=32, st=16) // 2x bandwidth + // st1, total bytes so far is (st1=40, st=16) + // st2, total bytes so far is (st1=40, st=24) + // st2, total bytes so far is (st1=40, st=32) + // st2, total bytes so far is (st1=40, st=40) + if err := checkPopAll(ws, []uint32{1, 2, 1, 1, 1, 2, 1, 2, 2, 2}); err != nil { + t.Error(err) + } +} + +func TestPriorityRstStreamOnNonOpenStreams(t *testing.T) { + ws := NewPriorityWriteScheduler(&PriorityWriteSchedulerConfig{ + MaxClosedNodesInTree: 0, + MaxIdleNodesInTree: 0, + }) + ws.OpenStream(1, OpenStreamOptions{}) + ws.CloseStream(1) + ws.Push(FrameWriteRequest{write: streamError(1, ErrCodeProtocol)}) + ws.Push(FrameWriteRequest{write: streamError(2, ErrCodeProtocol)}) + + if err := checkPopAll(ws, []uint32{1, 2}); err != nil { + t.Error(err) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/writesched_random.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/writesched_random.go new file mode 100644 index 0000000..36d7919 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/writesched_random.go @@ -0,0 +1,72 @@ +// 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 http2 + +import "math" + +// NewRandomWriteScheduler constructs a WriteScheduler that ignores HTTP/2 +// priorities. Control frames like SETTINGS and PING are written before DATA +// frames, but if no control frames are queued and multiple streams have queued +// HEADERS or DATA frames, Pop selects a ready stream arbitrarily. +func NewRandomWriteScheduler() WriteScheduler { + return &randomWriteScheduler{sq: make(map[uint32]*writeQueue)} +} + +type randomWriteScheduler struct { + // zero are frames not associated with a specific stream. + zero writeQueue + + // sq contains the stream-specific queues, keyed by stream ID. + // When a stream is idle or closed, it's deleted from the map. + sq map[uint32]*writeQueue + + // pool of empty queues for reuse. + queuePool writeQueuePool +} + +func (ws *randomWriteScheduler) OpenStream(streamID uint32, options OpenStreamOptions) { + // no-op: idle streams are not tracked +} + +func (ws *randomWriteScheduler) CloseStream(streamID uint32) { + q, ok := ws.sq[streamID] + if !ok { + return + } + delete(ws.sq, streamID) + ws.queuePool.put(q) +} + +func (ws *randomWriteScheduler) AdjustStream(streamID uint32, priority PriorityParam) { + // no-op: priorities are ignored +} + +func (ws *randomWriteScheduler) Push(wr FrameWriteRequest) { + id := wr.StreamID() + if id == 0 { + ws.zero.push(wr) + return + } + q, ok := ws.sq[id] + if !ok { + q = ws.queuePool.get() + ws.sq[id] = q + } + q.push(wr) +} + +func (ws *randomWriteScheduler) Pop() (FrameWriteRequest, bool) { + // Control frames first. + if !ws.zero.empty() { + return ws.zero.shift(), true + } + // Iterate over all non-idle streams until finding one that can be consumed. + for _, q := range ws.sq { + if wr, ok := q.consume(math.MaxInt32); ok { + return wr, true + } + } + return FrameWriteRequest{}, false +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/writesched_random_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/writesched_random_test.go new file mode 100644 index 0000000..3bf4aa3 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/writesched_random_test.go @@ -0,0 +1,44 @@ +// 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 http2 + +import "testing" + +func TestRandomScheduler(t *testing.T) { + ws := NewRandomWriteScheduler() + ws.Push(makeWriteHeadersRequest(3)) + ws.Push(makeWriteHeadersRequest(4)) + ws.Push(makeWriteHeadersRequest(1)) + ws.Push(makeWriteHeadersRequest(2)) + ws.Push(makeWriteNonStreamRequest()) + ws.Push(makeWriteNonStreamRequest()) + + // Pop all frames. Should get the non-stream requests first, + // followed by the stream requests in any order. + var order []FrameWriteRequest + for { + wr, ok := ws.Pop() + if !ok { + break + } + order = append(order, wr) + } + t.Logf("got frames: %v", order) + if len(order) != 6 { + t.Fatalf("got %d frames, expected 6", len(order)) + } + if order[0].StreamID() != 0 || order[1].StreamID() != 0 { + t.Fatal("expected non-stream frames first", order[0], order[1]) + } + got := make(map[uint32]bool) + for _, wr := range order[2:] { + got[wr.StreamID()] = true + } + for id := uint32(1); id <= 4; id++ { + if !got[id] { + t.Errorf("frame not found for stream %d", id) + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/writesched_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/writesched_test.go new file mode 100644 index 0000000..0807056 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/writesched_test.go @@ -0,0 +1,125 @@ +// 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 http2 + +import ( + "fmt" + "math" + "reflect" + "testing" +) + +func makeWriteNonStreamRequest() FrameWriteRequest { + return FrameWriteRequest{writeSettingsAck{}, nil, nil} +} + +func makeWriteHeadersRequest(streamID uint32) FrameWriteRequest { + st := &stream{id: streamID} + return FrameWriteRequest{&writeResHeaders{streamID: streamID, httpResCode: 200}, st, nil} +} + +func checkConsume(wr FrameWriteRequest, nbytes int32, want []FrameWriteRequest) error { + consumed, rest, n := wr.Consume(nbytes) + var wantConsumed, wantRest FrameWriteRequest + switch len(want) { + case 0: + case 1: + wantConsumed = want[0] + case 2: + wantConsumed = want[0] + wantRest = want[1] + } + if !reflect.DeepEqual(consumed, wantConsumed) || !reflect.DeepEqual(rest, wantRest) || n != len(want) { + return fmt.Errorf("got %v, %v, %v\nwant %v, %v, %v", consumed, rest, n, wantConsumed, wantRest, len(want)) + } + return nil +} + +func TestFrameWriteRequestNonData(t *testing.T) { + wr := makeWriteNonStreamRequest() + if got, want := wr.DataSize(), 0; got != want { + t.Errorf("DataSize: got %v, want %v", got, want) + } + + // Non-DATA frames are always consumed whole. + if err := checkConsume(wr, 0, []FrameWriteRequest{wr}); err != nil { + t.Errorf("Consume:\n%v", err) + } +} + +func TestFrameWriteRequestData(t *testing.T) { + st := &stream{ + id: 1, + sc: &serverConn{maxFrameSize: 16}, + } + const size = 32 + wr := FrameWriteRequest{&writeData{st.id, make([]byte, size), true}, st, make(chan error)} + if got, want := wr.DataSize(), size; got != want { + t.Errorf("DataSize: got %v, want %v", got, want) + } + + // No flow-control bytes available: cannot consume anything. + if err := checkConsume(wr, math.MaxInt32, []FrameWriteRequest{}); err != nil { + t.Errorf("Consume(limited by flow control):\n%v", err) + } + + // Add enough flow-control bytes to consume the entire frame, + // but we're now restricted by st.sc.maxFrameSize. + st.flow.add(size) + want := []FrameWriteRequest{ + { + write: &writeData{st.id, make([]byte, st.sc.maxFrameSize), false}, + stream: st, + done: nil, + }, + { + write: &writeData{st.id, make([]byte, size-st.sc.maxFrameSize), true}, + stream: st, + done: wr.done, + }, + } + if err := checkConsume(wr, math.MaxInt32, want); err != nil { + t.Errorf("Consume(limited by maxFrameSize):\n%v", err) + } + rest := want[1] + + // Consume 8 bytes from the remaining frame. + want = []FrameWriteRequest{ + { + write: &writeData{st.id, make([]byte, 8), false}, + stream: st, + done: nil, + }, + { + write: &writeData{st.id, make([]byte, size-st.sc.maxFrameSize-8), true}, + stream: st, + done: wr.done, + }, + } + if err := checkConsume(rest, 8, want); err != nil { + t.Errorf("Consume(8):\n%v", err) + } + rest = want[1] + + // Consume all remaining bytes. + want = []FrameWriteRequest{ + { + write: &writeData{st.id, make([]byte, size-st.sc.maxFrameSize-8), true}, + stream: st, + done: wr.done, + }, + } + if err := checkConsume(rest, math.MaxInt32, want); err != nil { + t.Errorf("Consume(remainder):\n%v", err) + } +} + +func TestFrameWriteRequest_StreamID(t *testing.T) { + const streamID = 123 + wr := FrameWriteRequest{write: streamError(streamID, ErrCodeNo)} + if got := wr.StreamID(); got != streamID { + t.Errorf("FrameWriteRequest(StreamError) = %v; want %v", got, streamID) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/z_spec_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/z_spec_test.go new file mode 100644 index 0000000..610b2cd --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/http2/z_spec_test.go @@ -0,0 +1,356 @@ +// 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 http2 + +import ( + "bytes" + "encoding/xml" + "flag" + "fmt" + "io" + "os" + "reflect" + "regexp" + "sort" + "strconv" + "strings" + "sync" + "testing" +) + +var coverSpec = flag.Bool("coverspec", false, "Run spec coverage tests") + +// The global map of sentence coverage for the http2 spec. +var defaultSpecCoverage specCoverage + +var loadSpecOnce sync.Once + +func loadSpec() { + if f, err := os.Open("testdata/draft-ietf-httpbis-http2.xml"); err != nil { + panic(err) + } else { + defaultSpecCoverage = readSpecCov(f) + f.Close() + } +} + +// covers marks all sentences for section sec in defaultSpecCoverage. Sentences not +// "covered" will be included in report outputted by TestSpecCoverage. +func covers(sec, sentences string) { + loadSpecOnce.Do(loadSpec) + defaultSpecCoverage.cover(sec, sentences) +} + +type specPart struct { + section string + sentence string +} + +func (ss specPart) Less(oo specPart) bool { + atoi := func(s string) int { + n, err := strconv.Atoi(s) + if err != nil { + panic(err) + } + return n + } + a := strings.Split(ss.section, ".") + b := strings.Split(oo.section, ".") + for len(a) > 0 { + if len(b) == 0 { + return false + } + x, y := atoi(a[0]), atoi(b[0]) + if x == y { + a, b = a[1:], b[1:] + continue + } + return x < y + } + if len(b) > 0 { + return true + } + return false +} + +type bySpecSection []specPart + +func (a bySpecSection) Len() int { return len(a) } +func (a bySpecSection) Less(i, j int) bool { return a[i].Less(a[j]) } +func (a bySpecSection) Swap(i, j int) { a[i], a[j] = a[j], a[i] } + +type specCoverage struct { + coverage map[specPart]bool + d *xml.Decoder +} + +func joinSection(sec []int) string { + s := fmt.Sprintf("%d", sec[0]) + for _, n := range sec[1:] { + s = fmt.Sprintf("%s.%d", s, n) + } + return s +} + +func (sc specCoverage) readSection(sec []int) { + var ( + buf = new(bytes.Buffer) + sub = 0 + ) + for { + tk, err := sc.d.Token() + if err != nil { + if err == io.EOF { + return + } + panic(err) + } + switch v := tk.(type) { + case xml.StartElement: + if skipElement(v) { + if err := sc.d.Skip(); err != nil { + panic(err) + } + if v.Name.Local == "section" { + sub++ + } + break + } + switch v.Name.Local { + case "section": + sub++ + sc.readSection(append(sec, sub)) + case "xref": + buf.Write(sc.readXRef(v)) + } + case xml.CharData: + if len(sec) == 0 { + break + } + buf.Write(v) + case xml.EndElement: + if v.Name.Local == "section" { + sc.addSentences(joinSection(sec), buf.String()) + return + } + } + } +} + +func (sc specCoverage) readXRef(se xml.StartElement) []byte { + var b []byte + for { + tk, err := sc.d.Token() + if err != nil { + panic(err) + } + switch v := tk.(type) { + case xml.CharData: + if b != nil { + panic("unexpected CharData") + } + b = []byte(string(v)) + case xml.EndElement: + if v.Name.Local != "xref" { + panic("expected ") + } + if b != nil { + return b + } + sig := attrSig(se) + switch sig { + case "target": + return []byte(fmt.Sprintf("[%s]", attrValue(se, "target"))) + case "fmt-of,rel,target", "fmt-,,rel,target": + return []byte(fmt.Sprintf("[%s, %s]", attrValue(se, "target"), attrValue(se, "rel"))) + case "fmt-of,sec,target", "fmt-,,sec,target": + return []byte(fmt.Sprintf("[section %s of %s]", attrValue(se, "sec"), attrValue(se, "target"))) + case "fmt-of,rel,sec,target": + return []byte(fmt.Sprintf("[section %s of %s, %s]", attrValue(se, "sec"), attrValue(se, "target"), attrValue(se, "rel"))) + default: + panic(fmt.Sprintf("unknown attribute signature %q in %#v", sig, fmt.Sprintf("%#v", se))) + } + default: + panic(fmt.Sprintf("unexpected tag %q", v)) + } + } +} + +var skipAnchor = map[string]bool{ + "intro": true, + "Overview": true, +} + +var skipTitle = map[string]bool{ + "Acknowledgements": true, + "Change Log": true, + "Document Organization": true, + "Conventions and Terminology": true, +} + +func skipElement(s xml.StartElement) bool { + switch s.Name.Local { + case "artwork": + return true + case "section": + for _, attr := range s.Attr { + switch attr.Name.Local { + case "anchor": + if skipAnchor[attr.Value] || strings.HasPrefix(attr.Value, "changes.since.") { + return true + } + case "title": + if skipTitle[attr.Value] { + return true + } + } + } + } + return false +} + +func readSpecCov(r io.Reader) specCoverage { + sc := specCoverage{ + coverage: map[specPart]bool{}, + d: xml.NewDecoder(r)} + sc.readSection(nil) + return sc +} + +func (sc specCoverage) addSentences(sec string, sentence string) { + for _, s := range parseSentences(sentence) { + sc.coverage[specPart{sec, s}] = false + } +} + +func (sc specCoverage) cover(sec string, sentence string) { + for _, s := range parseSentences(sentence) { + p := specPart{sec, s} + if _, ok := sc.coverage[p]; !ok { + panic(fmt.Sprintf("Not found in spec: %q, %q", sec, s)) + } + sc.coverage[specPart{sec, s}] = true + } + +} + +var whitespaceRx = regexp.MustCompile(`\s+`) + +func parseSentences(sens string) []string { + sens = strings.TrimSpace(sens) + if sens == "" { + return nil + } + ss := strings.Split(whitespaceRx.ReplaceAllString(sens, " "), ". ") + for i, s := range ss { + s = strings.TrimSpace(s) + if !strings.HasSuffix(s, ".") { + s += "." + } + ss[i] = s + } + return ss +} + +func TestSpecParseSentences(t *testing.T) { + tests := []struct { + ss string + want []string + }{ + {"Sentence 1. Sentence 2.", + []string{ + "Sentence 1.", + "Sentence 2.", + }}, + {"Sentence 1. \nSentence 2.\tSentence 3.", + []string{ + "Sentence 1.", + "Sentence 2.", + "Sentence 3.", + }}, + } + + for i, tt := range tests { + got := parseSentences(tt.ss) + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("%d: got = %q, want %q", i, got, tt.want) + } + } +} + +func TestSpecCoverage(t *testing.T) { + if !*coverSpec { + t.Skip() + } + + loadSpecOnce.Do(loadSpec) + + var ( + list []specPart + cv = defaultSpecCoverage.coverage + total = len(cv) + complete = 0 + ) + + for sp, touched := range defaultSpecCoverage.coverage { + if touched { + complete++ + } else { + list = append(list, sp) + } + } + sort.Stable(bySpecSection(list)) + + if testing.Short() && len(list) > 5 { + list = list[:5] + } + + for _, p := range list { + t.Errorf("\tSECTION %s: %s", p.section, p.sentence) + } + + t.Logf("%d/%d (%d%%) sentences covered", complete, total, (complete/total)*100) +} + +func attrSig(se xml.StartElement) string { + var names []string + for _, attr := range se.Attr { + if attr.Name.Local == "fmt" { + names = append(names, "fmt-"+attr.Value) + } else { + names = append(names, attr.Name.Local) + } + } + sort.Strings(names) + return strings.Join(names, ",") +} + +func attrValue(se xml.StartElement, attr string) string { + for _, a := range se.Attr { + if a.Name.Local == attr { + return a.Value + } + } + panic("unknown attribute " + attr) +} + +func TestSpecPartLess(t *testing.T) { + tests := []struct { + sec1, sec2 string + want bool + }{ + {"6.2.1", "6.2", false}, + {"6.2", "6.2.1", true}, + {"6.10", "6.10.1", true}, + {"6.10", "6.1.1", false}, // 10, not 1 + {"6.1", "6.1", false}, // equal, so not less + } + for _, tt := range tests { + got := (specPart{tt.sec1, "foo"}).Less(specPart{tt.sec2, "foo"}) + if got != tt.want { + t.Errorf("Less(%q, %q) = %v; want %v", tt.sec1, tt.sec2, got, tt.want) + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/dstunreach.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/dstunreach.go new file mode 100644 index 0000000..75db991 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/dstunreach.go @@ -0,0 +1,41 @@ +// 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 icmp + +// A DstUnreach represents an ICMP destination unreachable message +// body. +type DstUnreach struct { + Data []byte // data, known as original datagram field + Extensions []Extension // extensions +} + +// Len implements the Len method of MessageBody interface. +func (p *DstUnreach) Len(proto int) int { + if p == nil { + return 0 + } + l, _ := multipartMessageBodyDataLen(proto, p.Data, p.Extensions) + return 4 + l +} + +// Marshal implements the Marshal method of MessageBody interface. +func (p *DstUnreach) Marshal(proto int) ([]byte, error) { + return marshalMultipartMessageBody(proto, p.Data, p.Extensions) +} + +// parseDstUnreach parses b as an ICMP destination unreachable message +// body. +func parseDstUnreach(proto int, b []byte) (MessageBody, error) { + if len(b) < 4 { + return nil, errMessageTooShort + } + p := &DstUnreach{} + var err error + p.Data, p.Extensions, err = parseMultipartMessageBody(proto, b) + if err != nil { + return nil, err + } + return p, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/echo.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/echo.go new file mode 100644 index 0000000..e6f15ef --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/echo.go @@ -0,0 +1,45 @@ +// 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 icmp + +import "encoding/binary" + +// An Echo represents an ICMP echo request or reply message body. +type Echo struct { + ID int // identifier + Seq int // sequence number + Data []byte // data +} + +// Len implements the Len method of MessageBody interface. +func (p *Echo) Len(proto int) int { + if p == nil { + return 0 + } + return 4 + len(p.Data) +} + +// Marshal implements the Marshal method of MessageBody interface. +func (p *Echo) Marshal(proto int) ([]byte, error) { + b := make([]byte, 4+len(p.Data)) + binary.BigEndian.PutUint16(b[:2], uint16(p.ID)) + binary.BigEndian.PutUint16(b[2:4], uint16(p.Seq)) + copy(b[4:], p.Data) + return b, nil +} + +// parseEcho parses b as an ICMP echo request or reply message body. +func parseEcho(proto int, b []byte) (MessageBody, error) { + bodyLen := len(b) + if bodyLen < 4 { + return nil, errMessageTooShort + } + p := &Echo{ID: int(binary.BigEndian.Uint16(b[:2])), Seq: int(binary.BigEndian.Uint16(b[2:4]))} + if bodyLen > 4 { + p.Data = make([]byte, bodyLen-4) + copy(p.Data, b[4:]) + } + return p, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/endpoint.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/endpoint.go new file mode 100644 index 0000000..a68bfb0 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/endpoint.go @@ -0,0 +1,113 @@ +// 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 icmp + +import ( + "net" + "runtime" + "syscall" + "time" + + "golang.org/x/net/ipv4" + "golang.org/x/net/ipv6" +) + +var _ net.PacketConn = &PacketConn{} + +// A PacketConn represents a packet network endpoint that uses either +// ICMPv4 or ICMPv6. +type PacketConn struct { + c net.PacketConn + p4 *ipv4.PacketConn + p6 *ipv6.PacketConn +} + +func (c *PacketConn) ok() bool { return c != nil && c.c != nil } + +// IPv4PacketConn returns the ipv4.PacketConn of c. +// It returns nil when c is not created as the endpoint for ICMPv4. +func (c *PacketConn) IPv4PacketConn() *ipv4.PacketConn { + if !c.ok() { + return nil + } + return c.p4 +} + +// IPv6PacketConn returns the ipv6.PacketConn of c. +// It returns nil when c is not created as the endpoint for ICMPv6. +func (c *PacketConn) IPv6PacketConn() *ipv6.PacketConn { + if !c.ok() { + return nil + } + return c.p6 +} + +// ReadFrom reads an ICMP message from the connection. +func (c *PacketConn) ReadFrom(b []byte) (int, net.Addr, error) { + if !c.ok() { + return 0, nil, syscall.EINVAL + } + // Please be informed that ipv4.NewPacketConn enables + // IP_STRIPHDR option by default on Darwin. + // See golang.org/issue/9395 for further information. + if runtime.GOOS == "darwin" && c.p4 != nil { + n, _, peer, err := c.p4.ReadFrom(b) + return n, peer, err + } + return c.c.ReadFrom(b) +} + +// WriteTo writes the ICMP message b to dst. +// Dst must be net.UDPAddr when c is a non-privileged +// datagram-oriented ICMP endpoint. Otherwise it must be net.IPAddr. +func (c *PacketConn) WriteTo(b []byte, dst net.Addr) (int, error) { + if !c.ok() { + return 0, syscall.EINVAL + } + return c.c.WriteTo(b, dst) +} + +// Close closes the endpoint. +func (c *PacketConn) Close() error { + if !c.ok() { + return syscall.EINVAL + } + return c.c.Close() +} + +// LocalAddr returns the local network address. +func (c *PacketConn) LocalAddr() net.Addr { + if !c.ok() { + return nil + } + return c.c.LocalAddr() +} + +// SetDeadline sets the read and write deadlines associated with the +// endpoint. +func (c *PacketConn) SetDeadline(t time.Time) error { + if !c.ok() { + return syscall.EINVAL + } + return c.c.SetDeadline(t) +} + +// SetReadDeadline sets the read deadline associated with the +// endpoint. +func (c *PacketConn) SetReadDeadline(t time.Time) error { + if !c.ok() { + return syscall.EINVAL + } + return c.c.SetReadDeadline(t) +} + +// SetWriteDeadline sets the write deadline associated with the +// endpoint. +func (c *PacketConn) SetWriteDeadline(t time.Time) error { + if !c.ok() { + return syscall.EINVAL + } + return c.c.SetWriteDeadline(t) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/example_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/example_test.go new file mode 100644 index 0000000..1df4cec --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/example_test.go @@ -0,0 +1,63 @@ +// 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 icmp_test + +import ( + "log" + "net" + "os" + "runtime" + + "golang.org/x/net/icmp" + "golang.org/x/net/ipv6" +) + +func ExamplePacketConn_nonPrivilegedPing() { + switch runtime.GOOS { + case "darwin": + case "linux": + log.Println("you may need to adjust the net.ipv4.ping_group_range kernel state") + default: + log.Println("not supported on", runtime.GOOS) + return + } + + c, err := icmp.ListenPacket("udp6", "fe80::1%en0") + if err != nil { + log.Fatal(err) + } + defer c.Close() + + wm := icmp.Message{ + Type: ipv6.ICMPTypeEchoRequest, Code: 0, + Body: &icmp.Echo{ + ID: os.Getpid() & 0xffff, Seq: 1, + Data: []byte("HELLO-R-U-THERE"), + }, + } + wb, err := wm.Marshal(nil) + if err != nil { + log.Fatal(err) + } + if _, err := c.WriteTo(wb, &net.UDPAddr{IP: net.ParseIP("ff02::1"), Zone: "en0"}); err != nil { + log.Fatal(err) + } + + rb := make([]byte, 1500) + n, peer, err := c.ReadFrom(rb) + if err != nil { + log.Fatal(err) + } + rm, err := icmp.ParseMessage(58, rb[:n]) + if err != nil { + log.Fatal(err) + } + switch rm.Type { + case ipv6.ICMPTypeEchoReply: + log.Printf("got reflection from %v", peer) + default: + log.Printf("got %+v; want echo reply", rm) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/extension.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/extension.go new file mode 100644 index 0000000..402a751 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/extension.go @@ -0,0 +1,89 @@ +// Copyright 2015 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 icmp + +import "encoding/binary" + +// An Extension represents an ICMP extension. +type Extension interface { + // Len returns the length of ICMP extension. + // Proto must be either the ICMPv4 or ICMPv6 protocol number. + Len(proto int) int + + // Marshal returns the binary encoding of ICMP extension. + // Proto must be either the ICMPv4 or ICMPv6 protocol number. + Marshal(proto int) ([]byte, error) +} + +const extensionVersion = 2 + +func validExtensionHeader(b []byte) bool { + v := int(b[0]&0xf0) >> 4 + s := binary.BigEndian.Uint16(b[2:4]) + if s != 0 { + s = checksum(b) + } + if v != extensionVersion || s != 0 { + return false + } + return true +} + +// parseExtensions parses b as a list of ICMP extensions. +// The length attribute l must be the length attribute field in +// received icmp messages. +// +// It will return a list of ICMP extensions and an adjusted length +// attribute that represents the length of the padded original +// datagram field. Otherwise, it returns an error. +func parseExtensions(b []byte, l int) ([]Extension, int, error) { + // Still a lot of non-RFC 4884 compliant implementations are + // out there. Set the length attribute l to 128 when it looks + // inappropriate for backwards compatibility. + // + // A minimal extension at least requires 8 octets; 4 octets + // for an extension header, and 4 octets for a single object + // header. + // + // See RFC 4884 for further information. + if 128 > l || l+8 > len(b) { + l = 128 + } + if l+8 > len(b) { + return nil, -1, errNoExtension + } + if !validExtensionHeader(b[l:]) { + if l == 128 { + return nil, -1, errNoExtension + } + l = 128 + if !validExtensionHeader(b[l:]) { + return nil, -1, errNoExtension + } + } + var exts []Extension + for b = b[l+4:]; len(b) >= 4; { + ol := int(binary.BigEndian.Uint16(b[:2])) + if 4 > ol || ol > len(b) { + break + } + switch b[2] { + case classMPLSLabelStack: + ext, err := parseMPLSLabelStack(b[:ol]) + if err != nil { + return nil, -1, err + } + exts = append(exts, ext) + case classInterfaceInfo: + ext, err := parseInterfaceInfo(b[:ol]) + if err != nil { + return nil, -1, err + } + exts = append(exts, ext) + } + b = b[ol:] + } + return exts, l, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/extension_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/extension_test.go new file mode 100644 index 0000000..0b3f7b9 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/extension_test.go @@ -0,0 +1,259 @@ +// Copyright 2015 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 icmp + +import ( + "net" + "reflect" + "testing" + + "golang.org/x/net/internal/iana" +) + +var marshalAndParseExtensionTests = []struct { + proto int + hdr []byte + obj []byte + exts []Extension +}{ + // MPLS label stack with no label + { + proto: iana.ProtocolICMP, + hdr: []byte{ + 0x20, 0x00, 0x00, 0x00, + }, + obj: []byte{ + 0x00, 0x04, 0x01, 0x01, + }, + exts: []Extension{ + &MPLSLabelStack{ + Class: classMPLSLabelStack, + Type: typeIncomingMPLSLabelStack, + }, + }, + }, + // MPLS label stack with a single label + { + proto: iana.ProtocolIPv6ICMP, + hdr: []byte{ + 0x20, 0x00, 0x00, 0x00, + }, + obj: []byte{ + 0x00, 0x08, 0x01, 0x01, + 0x03, 0xe8, 0xe9, 0xff, + }, + exts: []Extension{ + &MPLSLabelStack{ + Class: classMPLSLabelStack, + Type: typeIncomingMPLSLabelStack, + Labels: []MPLSLabel{ + { + Label: 16014, + TC: 0x4, + S: true, + TTL: 255, + }, + }, + }, + }, + }, + // MPLS label stack with multiple labels + { + proto: iana.ProtocolICMP, + hdr: []byte{ + 0x20, 0x00, 0x00, 0x00, + }, + obj: []byte{ + 0x00, 0x0c, 0x01, 0x01, + 0x03, 0xe8, 0xde, 0xfe, + 0x03, 0xe8, 0xe1, 0xff, + }, + exts: []Extension{ + &MPLSLabelStack{ + Class: classMPLSLabelStack, + Type: typeIncomingMPLSLabelStack, + Labels: []MPLSLabel{ + { + Label: 16013, + TC: 0x7, + S: false, + TTL: 254, + }, + { + Label: 16014, + TC: 0, + S: true, + TTL: 255, + }, + }, + }, + }, + }, + // Interface information with no attribute + { + proto: iana.ProtocolICMP, + hdr: []byte{ + 0x20, 0x00, 0x00, 0x00, + }, + obj: []byte{ + 0x00, 0x04, 0x02, 0x00, + }, + exts: []Extension{ + &InterfaceInfo{ + Class: classInterfaceInfo, + }, + }, + }, + // Interface information with ifIndex and name + { + proto: iana.ProtocolICMP, + hdr: []byte{ + 0x20, 0x00, 0x00, 0x00, + }, + obj: []byte{ + 0x00, 0x10, 0x02, 0x0a, + 0x00, 0x00, 0x00, 0x10, + 0x08, byte('e'), byte('n'), byte('1'), + byte('0'), byte('1'), 0x00, 0x00, + }, + exts: []Extension{ + &InterfaceInfo{ + Class: classInterfaceInfo, + Type: 0x0a, + Interface: &net.Interface{ + Index: 16, + Name: "en101", + }, + }, + }, + }, + // Interface information with ifIndex, IPAddr, name and MTU + { + proto: iana.ProtocolIPv6ICMP, + hdr: []byte{ + 0x20, 0x00, 0x00, 0x00, + }, + obj: []byte{ + 0x00, 0x28, 0x02, 0x0f, + 0x00, 0x00, 0x00, 0x0f, + 0x00, 0x02, 0x00, 0x00, + 0xfe, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, + 0x08, byte('e'), byte('n'), byte('1'), + byte('0'), byte('1'), 0x00, 0x00, + 0x00, 0x00, 0x20, 0x00, + }, + exts: []Extension{ + &InterfaceInfo{ + Class: classInterfaceInfo, + Type: 0x0f, + Interface: &net.Interface{ + Index: 15, + Name: "en101", + MTU: 8192, + }, + Addr: &net.IPAddr{ + IP: net.ParseIP("fe80::1"), + Zone: "en101", + }, + }, + }, + }, +} + +func TestMarshalAndParseExtension(t *testing.T) { + for i, tt := range marshalAndParseExtensionTests { + for j, ext := range tt.exts { + var err error + var b []byte + switch ext := ext.(type) { + case *MPLSLabelStack: + b, err = ext.Marshal(tt.proto) + if err != nil { + t.Errorf("#%v/%v: %v", i, j, err) + continue + } + case *InterfaceInfo: + b, err = ext.Marshal(tt.proto) + if err != nil { + t.Errorf("#%v/%v: %v", i, j, err) + continue + } + } + if !reflect.DeepEqual(b, tt.obj) { + t.Errorf("#%v/%v: got %#v; want %#v", i, j, b, tt.obj) + continue + } + } + + for j, wire := range []struct { + data []byte // original datagram + inlattr int // length of padded original datagram, a hint + outlattr int // length of padded original datagram, a want + err error + }{ + {nil, 0, -1, errNoExtension}, + {make([]byte, 127), 128, -1, errNoExtension}, + + {make([]byte, 128), 127, -1, errNoExtension}, + {make([]byte, 128), 128, -1, errNoExtension}, + {make([]byte, 128), 129, -1, errNoExtension}, + + {append(make([]byte, 128), append(tt.hdr, tt.obj...)...), 127, 128, nil}, + {append(make([]byte, 128), append(tt.hdr, tt.obj...)...), 128, 128, nil}, + {append(make([]byte, 128), append(tt.hdr, tt.obj...)...), 129, 128, nil}, + + {append(make([]byte, 512), append(tt.hdr, tt.obj...)...), 511, -1, errNoExtension}, + {append(make([]byte, 512), append(tt.hdr, tt.obj...)...), 512, 512, nil}, + {append(make([]byte, 512), append(tt.hdr, tt.obj...)...), 513, -1, errNoExtension}, + } { + exts, l, err := parseExtensions(wire.data, wire.inlattr) + if err != wire.err { + t.Errorf("#%v/%v: got %v; want %v", i, j, err, wire.err) + continue + } + if wire.err != nil { + continue + } + if l != wire.outlattr { + t.Errorf("#%v/%v: got %v; want %v", i, j, l, wire.outlattr) + } + if !reflect.DeepEqual(exts, tt.exts) { + for j, ext := range exts { + switch ext := ext.(type) { + case *MPLSLabelStack: + want := tt.exts[j].(*MPLSLabelStack) + t.Errorf("#%v/%v: got %#v; want %#v", i, j, ext, want) + case *InterfaceInfo: + want := tt.exts[j].(*InterfaceInfo) + t.Errorf("#%v/%v: got %#v; want %#v", i, j, ext, want) + } + } + continue + } + } + } +} + +var parseInterfaceNameTests = []struct { + b []byte + error +}{ + {[]byte{0, 'e', 'n', '0'}, errInvalidExtension}, + {[]byte{4, 'e', 'n', '0'}, nil}, + {[]byte{7, 'e', 'n', '0', 0xff, 0xff, 0xff, 0xff}, errInvalidExtension}, + {[]byte{8, 'e', 'n', '0', 0xff, 0xff, 0xff}, errMessageTooShort}, +} + +func TestParseInterfaceName(t *testing.T) { + ifi := InterfaceInfo{Interface: &net.Interface{}} + for i, tt := range parseInterfaceNameTests { + if _, err := ifi.parseName(tt.b); err != tt.error { + t.Errorf("#%d: got %v; want %v", i, err, tt.error) + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/helper_posix.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/helper_posix.go new file mode 100644 index 0000000..398fd38 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/helper_posix.go @@ -0,0 +1,75 @@ +// 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows + +package icmp + +import ( + "net" + "strconv" + "syscall" +) + +func sockaddr(family int, address string) (syscall.Sockaddr, error) { + switch family { + case syscall.AF_INET: + a, err := net.ResolveIPAddr("ip4", address) + if err != nil { + return nil, err + } + if len(a.IP) == 0 { + a.IP = net.IPv4zero + } + if a.IP = a.IP.To4(); a.IP == nil { + return nil, net.InvalidAddrError("non-ipv4 address") + } + sa := &syscall.SockaddrInet4{} + copy(sa.Addr[:], a.IP) + return sa, nil + case syscall.AF_INET6: + a, err := net.ResolveIPAddr("ip6", address) + if err != nil { + return nil, err + } + if len(a.IP) == 0 { + a.IP = net.IPv6unspecified + } + if a.IP.Equal(net.IPv4zero) { + a.IP = net.IPv6unspecified + } + if a.IP = a.IP.To16(); a.IP == nil || a.IP.To4() != nil { + return nil, net.InvalidAddrError("non-ipv6 address") + } + sa := &syscall.SockaddrInet6{ZoneId: zoneToUint32(a.Zone)} + copy(sa.Addr[:], a.IP) + return sa, nil + default: + return nil, net.InvalidAddrError("unexpected family") + } +} + +func zoneToUint32(zone string) uint32 { + if zone == "" { + return 0 + } + if ifi, err := net.InterfaceByName(zone); err == nil { + return uint32(ifi.Index) + } + n, err := strconv.Atoi(zone) + if err != nil { + return 0 + } + return uint32(n) +} + +func last(s string, b byte) int { + i := len(s) + for i--; i >= 0; i-- { + if s[i] == b { + break + } + } + return i +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/interface.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/interface.go new file mode 100644 index 0000000..78b5b98 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/interface.go @@ -0,0 +1,236 @@ +// Copyright 2015 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 icmp + +import ( + "encoding/binary" + "net" + "strings" + + "golang.org/x/net/internal/iana" +) + +const ( + classInterfaceInfo = 2 + + afiIPv4 = 1 + afiIPv6 = 2 +) + +const ( + attrMTU = 1 << iota + attrName + attrIPAddr + attrIfIndex +) + +// An InterfaceInfo represents interface and next-hop identification. +type InterfaceInfo struct { + Class int // extension object class number + Type int // extension object sub-type + Interface *net.Interface + Addr *net.IPAddr +} + +func (ifi *InterfaceInfo) nameLen() int { + if len(ifi.Interface.Name) > 63 { + return 64 + } + l := 1 + len(ifi.Interface.Name) + return (l + 3) &^ 3 +} + +func (ifi *InterfaceInfo) attrsAndLen(proto int) (attrs, l int) { + l = 4 + if ifi.Interface != nil && ifi.Interface.Index > 0 { + attrs |= attrIfIndex + l += 4 + if len(ifi.Interface.Name) > 0 { + attrs |= attrName + l += ifi.nameLen() + } + if ifi.Interface.MTU > 0 { + attrs |= attrMTU + l += 4 + } + } + if ifi.Addr != nil { + switch proto { + case iana.ProtocolICMP: + if ifi.Addr.IP.To4() != nil { + attrs |= attrIPAddr + l += 4 + net.IPv4len + } + case iana.ProtocolIPv6ICMP: + if ifi.Addr.IP.To16() != nil && ifi.Addr.IP.To4() == nil { + attrs |= attrIPAddr + l += 4 + net.IPv6len + } + } + } + return +} + +// Len implements the Len method of Extension interface. +func (ifi *InterfaceInfo) Len(proto int) int { + _, l := ifi.attrsAndLen(proto) + return l +} + +// Marshal implements the Marshal method of Extension interface. +func (ifi *InterfaceInfo) Marshal(proto int) ([]byte, error) { + attrs, l := ifi.attrsAndLen(proto) + b := make([]byte, l) + if err := ifi.marshal(proto, b, attrs, l); err != nil { + return nil, err + } + return b, nil +} + +func (ifi *InterfaceInfo) marshal(proto int, b []byte, attrs, l int) error { + binary.BigEndian.PutUint16(b[:2], uint16(l)) + b[2], b[3] = classInterfaceInfo, byte(ifi.Type) + for b = b[4:]; len(b) > 0 && attrs != 0; { + switch { + case attrs&attrIfIndex != 0: + b = ifi.marshalIfIndex(proto, b) + attrs &^= attrIfIndex + case attrs&attrIPAddr != 0: + b = ifi.marshalIPAddr(proto, b) + attrs &^= attrIPAddr + case attrs&attrName != 0: + b = ifi.marshalName(proto, b) + attrs &^= attrName + case attrs&attrMTU != 0: + b = ifi.marshalMTU(proto, b) + attrs &^= attrMTU + } + } + return nil +} + +func (ifi *InterfaceInfo) marshalIfIndex(proto int, b []byte) []byte { + binary.BigEndian.PutUint32(b[:4], uint32(ifi.Interface.Index)) + return b[4:] +} + +func (ifi *InterfaceInfo) parseIfIndex(b []byte) ([]byte, error) { + if len(b) < 4 { + return nil, errMessageTooShort + } + ifi.Interface.Index = int(binary.BigEndian.Uint32(b[:4])) + return b[4:], nil +} + +func (ifi *InterfaceInfo) marshalIPAddr(proto int, b []byte) []byte { + switch proto { + case iana.ProtocolICMP: + binary.BigEndian.PutUint16(b[:2], uint16(afiIPv4)) + copy(b[4:4+net.IPv4len], ifi.Addr.IP.To4()) + b = b[4+net.IPv4len:] + case iana.ProtocolIPv6ICMP: + binary.BigEndian.PutUint16(b[:2], uint16(afiIPv6)) + copy(b[4:4+net.IPv6len], ifi.Addr.IP.To16()) + b = b[4+net.IPv6len:] + } + return b +} + +func (ifi *InterfaceInfo) parseIPAddr(b []byte) ([]byte, error) { + if len(b) < 4 { + return nil, errMessageTooShort + } + afi := int(binary.BigEndian.Uint16(b[:2])) + b = b[4:] + switch afi { + case afiIPv4: + if len(b) < net.IPv4len { + return nil, errMessageTooShort + } + ifi.Addr.IP = make(net.IP, net.IPv4len) + copy(ifi.Addr.IP, b[:net.IPv4len]) + b = b[net.IPv4len:] + case afiIPv6: + if len(b) < net.IPv6len { + return nil, errMessageTooShort + } + ifi.Addr.IP = make(net.IP, net.IPv6len) + copy(ifi.Addr.IP, b[:net.IPv6len]) + b = b[net.IPv6len:] + } + return b, nil +} + +func (ifi *InterfaceInfo) marshalName(proto int, b []byte) []byte { + l := byte(ifi.nameLen()) + b[0] = l + copy(b[1:], []byte(ifi.Interface.Name)) + return b[l:] +} + +func (ifi *InterfaceInfo) parseName(b []byte) ([]byte, error) { + if 4 > len(b) || len(b) < int(b[0]) { + return nil, errMessageTooShort + } + l := int(b[0]) + if l%4 != 0 || 4 > l || l > 64 { + return nil, errInvalidExtension + } + var name [63]byte + copy(name[:], b[1:l]) + ifi.Interface.Name = strings.Trim(string(name[:]), "\000") + return b[l:], nil +} + +func (ifi *InterfaceInfo) marshalMTU(proto int, b []byte) []byte { + binary.BigEndian.PutUint32(b[:4], uint32(ifi.Interface.MTU)) + return b[4:] +} + +func (ifi *InterfaceInfo) parseMTU(b []byte) ([]byte, error) { + if len(b) < 4 { + return nil, errMessageTooShort + } + ifi.Interface.MTU = int(binary.BigEndian.Uint32(b[:4])) + return b[4:], nil +} + +func parseInterfaceInfo(b []byte) (Extension, error) { + ifi := &InterfaceInfo{ + Class: int(b[2]), + Type: int(b[3]), + } + if ifi.Type&(attrIfIndex|attrName|attrMTU) != 0 { + ifi.Interface = &net.Interface{} + } + if ifi.Type&attrIPAddr != 0 { + ifi.Addr = &net.IPAddr{} + } + attrs := ifi.Type & (attrIfIndex | attrIPAddr | attrName | attrMTU) + for b = b[4:]; len(b) > 0 && attrs != 0; { + var err error + switch { + case attrs&attrIfIndex != 0: + b, err = ifi.parseIfIndex(b) + attrs &^= attrIfIndex + case attrs&attrIPAddr != 0: + b, err = ifi.parseIPAddr(b) + attrs &^= attrIPAddr + case attrs&attrName != 0: + b, err = ifi.parseName(b) + attrs &^= attrName + case attrs&attrMTU != 0: + b, err = ifi.parseMTU(b) + attrs &^= attrMTU + } + if err != nil { + return nil, err + } + } + if ifi.Interface != nil && ifi.Interface.Name != "" && ifi.Addr != nil && ifi.Addr.IP.To16() != nil && ifi.Addr.IP.To4() == nil { + ifi.Addr.Zone = ifi.Interface.Name + } + return ifi, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/ipv4.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/ipv4.go new file mode 100644 index 0000000..ffc66ed --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/ipv4.go @@ -0,0 +1,61 @@ +// 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 icmp + +import ( + "encoding/binary" + "net" + "runtime" + + "golang.org/x/net/internal/socket" + "golang.org/x/net/ipv4" +) + +// freebsdVersion is set in sys_freebsd.go. +// See http://www.freebsd.org/doc/en/books/porters-handbook/freebsd-versions.html. +var freebsdVersion uint32 + +// ParseIPv4Header parses b as an IPv4 header of ICMP error message +// invoking packet, which is contained in ICMP error message. +func ParseIPv4Header(b []byte) (*ipv4.Header, error) { + if len(b) < ipv4.HeaderLen { + return nil, errHeaderTooShort + } + hdrlen := int(b[0]&0x0f) << 2 + if hdrlen > len(b) { + return nil, errBufferTooShort + } + h := &ipv4.Header{ + Version: int(b[0] >> 4), + Len: hdrlen, + TOS: int(b[1]), + ID: int(binary.BigEndian.Uint16(b[4:6])), + FragOff: int(binary.BigEndian.Uint16(b[6:8])), + TTL: int(b[8]), + Protocol: int(b[9]), + Checksum: int(binary.BigEndian.Uint16(b[10:12])), + Src: net.IPv4(b[12], b[13], b[14], b[15]), + Dst: net.IPv4(b[16], b[17], b[18], b[19]), + } + switch runtime.GOOS { + case "darwin": + h.TotalLen = int(socket.NativeEndian.Uint16(b[2:4])) + case "freebsd": + if freebsdVersion >= 1000000 { + h.TotalLen = int(binary.BigEndian.Uint16(b[2:4])) + } else { + h.TotalLen = int(socket.NativeEndian.Uint16(b[2:4])) + } + default: + h.TotalLen = int(binary.BigEndian.Uint16(b[2:4])) + } + h.Flags = ipv4.HeaderFlags(h.FragOff&0xe000) >> 13 + h.FragOff = h.FragOff & 0x1fff + if hdrlen-ipv4.HeaderLen > 0 { + h.Options = make([]byte, hdrlen-ipv4.HeaderLen) + copy(h.Options, b[ipv4.HeaderLen:]) + } + return h, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/ipv4_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/ipv4_test.go new file mode 100644 index 0000000..058953f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/ipv4_test.go @@ -0,0 +1,83 @@ +// 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 icmp + +import ( + "encoding/binary" + "net" + "reflect" + "runtime" + "testing" + + "golang.org/x/net/internal/socket" + "golang.org/x/net/ipv4" +) + +type ipv4HeaderTest struct { + wireHeaderFromKernel [ipv4.HeaderLen]byte + wireHeaderFromTradBSDKernel [ipv4.HeaderLen]byte + Header *ipv4.Header +} + +var ipv4HeaderLittleEndianTest = ipv4HeaderTest{ + // TODO(mikio): Add platform dependent wire header formats when + // we support new platforms. + wireHeaderFromKernel: [ipv4.HeaderLen]byte{ + 0x45, 0x01, 0xbe, 0xef, + 0xca, 0xfe, 0x45, 0xdc, + 0xff, 0x01, 0xde, 0xad, + 172, 16, 254, 254, + 192, 168, 0, 1, + }, + wireHeaderFromTradBSDKernel: [ipv4.HeaderLen]byte{ + 0x45, 0x01, 0xef, 0xbe, + 0xca, 0xfe, 0x45, 0xdc, + 0xff, 0x01, 0xde, 0xad, + 172, 16, 254, 254, + 192, 168, 0, 1, + }, + Header: &ipv4.Header{ + Version: ipv4.Version, + Len: ipv4.HeaderLen, + TOS: 1, + TotalLen: 0xbeef, + ID: 0xcafe, + Flags: ipv4.DontFragment, + FragOff: 1500, + TTL: 255, + Protocol: 1, + Checksum: 0xdead, + Src: net.IPv4(172, 16, 254, 254), + Dst: net.IPv4(192, 168, 0, 1), + }, +} + +func TestParseIPv4Header(t *testing.T) { + tt := &ipv4HeaderLittleEndianTest + if socket.NativeEndian != binary.LittleEndian { + t.Skip("no test for non-little endian machine yet") + } + + var wh []byte + switch runtime.GOOS { + case "darwin": + wh = tt.wireHeaderFromTradBSDKernel[:] + case "freebsd": + if freebsdVersion >= 1000000 { + wh = tt.wireHeaderFromKernel[:] + } else { + wh = tt.wireHeaderFromTradBSDKernel[:] + } + default: + wh = tt.wireHeaderFromKernel[:] + } + h, err := ParseIPv4Header(wh) + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(h, tt.Header) { + t.Fatalf("got %#v; want %#v", h, tt.Header) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/ipv6.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/ipv6.go new file mode 100644 index 0000000..2e8cfeb --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/ipv6.go @@ -0,0 +1,23 @@ +// 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 icmp + +import ( + "net" + + "golang.org/x/net/internal/iana" +) + +const ipv6PseudoHeaderLen = 2*net.IPv6len + 8 + +// IPv6PseudoHeader returns an IPv6 pseudo header for checksum +// calculation. +func IPv6PseudoHeader(src, dst net.IP) []byte { + b := make([]byte, ipv6PseudoHeaderLen) + copy(b, src.To16()) + copy(b[net.IPv6len:], dst.To16()) + b[len(b)-1] = byte(iana.ProtocolIPv6ICMP) + return b +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/listen_posix.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/listen_posix.go new file mode 100644 index 0000000..7fac4f9 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/listen_posix.go @@ -0,0 +1,100 @@ +// 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows + +package icmp + +import ( + "net" + "os" + "runtime" + "syscall" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/ipv4" + "golang.org/x/net/ipv6" +) + +const sysIP_STRIPHDR = 0x17 // for now only darwin supports this option + +// ListenPacket listens for incoming ICMP packets addressed to +// address. See net.Dial for the syntax of address. +// +// For non-privileged datagram-oriented ICMP endpoints, network must +// be "udp4" or "udp6". The endpoint allows to read, write a few +// limited ICMP messages such as echo request and echo reply. +// Currently only Darwin and Linux support this. +// +// Examples: +// ListenPacket("udp4", "192.168.0.1") +// ListenPacket("udp4", "0.0.0.0") +// ListenPacket("udp6", "fe80::1%en0") +// ListenPacket("udp6", "::") +// +// For privileged raw ICMP endpoints, network must be "ip4" or "ip6" +// followed by a colon and an ICMP protocol number or name. +// +// Examples: +// ListenPacket("ip4:icmp", "192.168.0.1") +// ListenPacket("ip4:1", "0.0.0.0") +// ListenPacket("ip6:ipv6-icmp", "fe80::1%en0") +// ListenPacket("ip6:58", "::") +func ListenPacket(network, address string) (*PacketConn, error) { + var family, proto int + switch network { + case "udp4": + family, proto = syscall.AF_INET, iana.ProtocolICMP + case "udp6": + family, proto = syscall.AF_INET6, iana.ProtocolIPv6ICMP + default: + i := last(network, ':') + switch network[:i] { + case "ip4": + proto = iana.ProtocolICMP + case "ip6": + proto = iana.ProtocolIPv6ICMP + } + } + var cerr error + var c net.PacketConn + switch family { + case syscall.AF_INET, syscall.AF_INET6: + s, err := syscall.Socket(family, syscall.SOCK_DGRAM, proto) + if err != nil { + return nil, os.NewSyscallError("socket", err) + } + if runtime.GOOS == "darwin" && family == syscall.AF_INET { + if err := syscall.SetsockoptInt(s, iana.ProtocolIP, sysIP_STRIPHDR, 1); err != nil { + syscall.Close(s) + return nil, os.NewSyscallError("setsockopt", err) + } + } + sa, err := sockaddr(family, address) + if err != nil { + syscall.Close(s) + return nil, err + } + if err := syscall.Bind(s, sa); err != nil { + syscall.Close(s) + return nil, os.NewSyscallError("bind", err) + } + f := os.NewFile(uintptr(s), "datagram-oriented icmp") + c, cerr = net.FilePacketConn(f) + f.Close() + default: + c, cerr = net.ListenPacket(network, address) + } + if cerr != nil { + return nil, cerr + } + switch proto { + case iana.ProtocolICMP: + return &PacketConn{c: c, p4: ipv4.NewPacketConn(c)}, nil + case iana.ProtocolIPv6ICMP: + return &PacketConn{c: c, p6: ipv6.NewPacketConn(c)}, nil + default: + return &PacketConn{c: c}, nil + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/listen_stub.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/listen_stub.go new file mode 100644 index 0000000..668728d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/listen_stub.go @@ -0,0 +1,33 @@ +// 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. + +// +build nacl plan9 + +package icmp + +// ListenPacket listens for incoming ICMP packets addressed to +// address. See net.Dial for the syntax of address. +// +// For non-privileged datagram-oriented ICMP endpoints, network must +// be "udp4" or "udp6". The endpoint allows to read, write a few +// limited ICMP messages such as echo request and echo reply. +// Currently only Darwin and Linux support this. +// +// Examples: +// ListenPacket("udp4", "192.168.0.1") +// ListenPacket("udp4", "0.0.0.0") +// ListenPacket("udp6", "fe80::1%en0") +// ListenPacket("udp6", "::") +// +// For privileged raw ICMP endpoints, network must be "ip4" or "ip6" +// followed by a colon and an ICMP protocol number or name. +// +// Examples: +// ListenPacket("ip4:icmp", "192.168.0.1") +// ListenPacket("ip4:1", "0.0.0.0") +// ListenPacket("ip6:ipv6-icmp", "fe80::1%en0") +// ListenPacket("ip6:58", "::") +func ListenPacket(network, address string) (*PacketConn, error) { + return nil, errOpNoSupport +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/message.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/message.go new file mode 100644 index 0000000..81140b0 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/message.go @@ -0,0 +1,152 @@ +// 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 icmp provides basic functions for the manipulation of +// messages used in the Internet Control Message Protocols, +// ICMPv4 and ICMPv6. +// +// ICMPv4 and ICMPv6 are defined in RFC 792 and RFC 4443. +// Multi-part message support for ICMP is defined in RFC 4884. +// ICMP extensions for MPLS are defined in RFC 4950. +// ICMP extensions for interface and next-hop identification are +// defined in RFC 5837. +package icmp // import "golang.org/x/net/icmp" + +import ( + "encoding/binary" + "errors" + "net" + "syscall" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/ipv4" + "golang.org/x/net/ipv6" +) + +// BUG(mikio): This package is not implemented on NaCl and Plan 9. + +var ( + errMessageTooShort = errors.New("message too short") + errHeaderTooShort = errors.New("header too short") + errBufferTooShort = errors.New("buffer too short") + errOpNoSupport = errors.New("operation not supported") + errNoExtension = errors.New("no extension") + errInvalidExtension = errors.New("invalid extension") +) + +func checksum(b []byte) uint16 { + csumcv := len(b) - 1 // checksum coverage + s := uint32(0) + for i := 0; i < csumcv; i += 2 { + s += uint32(b[i+1])<<8 | uint32(b[i]) + } + if csumcv&1 == 0 { + s += uint32(b[csumcv]) + } + s = s>>16 + s&0xffff + s = s + s>>16 + return ^uint16(s) +} + +// A Type represents an ICMP message type. +type Type interface { + Protocol() int +} + +// A Message represents an ICMP message. +type Message struct { + Type Type // type, either ipv4.ICMPType or ipv6.ICMPType + Code int // code + Checksum int // checksum + Body MessageBody // body +} + +// Marshal returns the binary encoding of the ICMP message m. +// +// For an ICMPv4 message, the returned message always contains the +// calculated checksum field. +// +// For an ICMPv6 message, the returned message contains the calculated +// checksum field when psh is not nil, otherwise the kernel will +// compute the checksum field during the message transmission. +// When psh is not nil, it must be the pseudo header for IPv6. +func (m *Message) Marshal(psh []byte) ([]byte, error) { + var mtype int + switch typ := m.Type.(type) { + case ipv4.ICMPType: + mtype = int(typ) + case ipv6.ICMPType: + mtype = int(typ) + default: + return nil, syscall.EINVAL + } + b := []byte{byte(mtype), byte(m.Code), 0, 0} + if m.Type.Protocol() == iana.ProtocolIPv6ICMP && psh != nil { + b = append(psh, b...) + } + if m.Body != nil && m.Body.Len(m.Type.Protocol()) != 0 { + mb, err := m.Body.Marshal(m.Type.Protocol()) + if err != nil { + return nil, err + } + b = append(b, mb...) + } + if m.Type.Protocol() == iana.ProtocolIPv6ICMP { + if psh == nil { // cannot calculate checksum here + return b, nil + } + off, l := 2*net.IPv6len, len(b)-len(psh) + binary.BigEndian.PutUint32(b[off:off+4], uint32(l)) + } + s := checksum(b) + // Place checksum back in header; using ^= avoids the + // assumption the checksum bytes are zero. + b[len(psh)+2] ^= byte(s) + b[len(psh)+3] ^= byte(s >> 8) + return b[len(psh):], nil +} + +var parseFns = map[Type]func(int, []byte) (MessageBody, error){ + ipv4.ICMPTypeDestinationUnreachable: parseDstUnreach, + ipv4.ICMPTypeTimeExceeded: parseTimeExceeded, + ipv4.ICMPTypeParameterProblem: parseParamProb, + + ipv4.ICMPTypeEcho: parseEcho, + ipv4.ICMPTypeEchoReply: parseEcho, + + ipv6.ICMPTypeDestinationUnreachable: parseDstUnreach, + ipv6.ICMPTypePacketTooBig: parsePacketTooBig, + ipv6.ICMPTypeTimeExceeded: parseTimeExceeded, + ipv6.ICMPTypeParameterProblem: parseParamProb, + + ipv6.ICMPTypeEchoRequest: parseEcho, + ipv6.ICMPTypeEchoReply: parseEcho, +} + +// ParseMessage parses b as an ICMP message. +// Proto must be either the ICMPv4 or ICMPv6 protocol number. +func ParseMessage(proto int, b []byte) (*Message, error) { + if len(b) < 4 { + return nil, errMessageTooShort + } + var err error + m := &Message{Code: int(b[1]), Checksum: int(binary.BigEndian.Uint16(b[2:4]))} + switch proto { + case iana.ProtocolICMP: + m.Type = ipv4.ICMPType(b[0]) + case iana.ProtocolIPv6ICMP: + m.Type = ipv6.ICMPType(b[0]) + default: + return nil, syscall.EINVAL + } + if fn, ok := parseFns[m.Type]; !ok { + m.Body, err = parseDefaultMessageBody(proto, b[4:]) + } else { + m.Body, err = fn(proto, b[4:]) + } + if err != nil { + return nil, err + } + return m, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/message_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/message_test.go new file mode 100644 index 0000000..5d2605f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/message_test.go @@ -0,0 +1,134 @@ +// 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 icmp_test + +import ( + "net" + "reflect" + "testing" + + "golang.org/x/net/icmp" + "golang.org/x/net/internal/iana" + "golang.org/x/net/ipv4" + "golang.org/x/net/ipv6" +) + +var marshalAndParseMessageForIPv4Tests = []icmp.Message{ + { + Type: ipv4.ICMPTypeDestinationUnreachable, Code: 15, + Body: &icmp.DstUnreach{ + Data: []byte("ERROR-INVOKING-PACKET"), + }, + }, + { + Type: ipv4.ICMPTypeTimeExceeded, Code: 1, + Body: &icmp.TimeExceeded{ + Data: []byte("ERROR-INVOKING-PACKET"), + }, + }, + { + Type: ipv4.ICMPTypeParameterProblem, Code: 2, + Body: &icmp.ParamProb{ + Pointer: 8, + Data: []byte("ERROR-INVOKING-PACKET"), + }, + }, + { + Type: ipv4.ICMPTypeEcho, Code: 0, + Body: &icmp.Echo{ + ID: 1, Seq: 2, + Data: []byte("HELLO-R-U-THERE"), + }, + }, + { + Type: ipv4.ICMPTypePhoturis, + Body: &icmp.DefaultMessageBody{ + Data: []byte{0x80, 0x40, 0x20, 0x10}, + }, + }, +} + +func TestMarshalAndParseMessageForIPv4(t *testing.T) { + for i, tt := range marshalAndParseMessageForIPv4Tests { + b, err := tt.Marshal(nil) + if err != nil { + t.Fatal(err) + } + m, err := icmp.ParseMessage(iana.ProtocolICMP, b) + if err != nil { + t.Fatal(err) + } + if m.Type != tt.Type || m.Code != tt.Code { + t.Errorf("#%v: got %v; want %v", i, m, &tt) + } + if !reflect.DeepEqual(m.Body, tt.Body) { + t.Errorf("#%v: got %v; want %v", i, m.Body, tt.Body) + } + } +} + +var marshalAndParseMessageForIPv6Tests = []icmp.Message{ + { + Type: ipv6.ICMPTypeDestinationUnreachable, Code: 6, + Body: &icmp.DstUnreach{ + Data: []byte("ERROR-INVOKING-PACKET"), + }, + }, + { + Type: ipv6.ICMPTypePacketTooBig, Code: 0, + Body: &icmp.PacketTooBig{ + MTU: 1<<16 - 1, + Data: []byte("ERROR-INVOKING-PACKET"), + }, + }, + { + Type: ipv6.ICMPTypeTimeExceeded, Code: 1, + Body: &icmp.TimeExceeded{ + Data: []byte("ERROR-INVOKING-PACKET"), + }, + }, + { + Type: ipv6.ICMPTypeParameterProblem, Code: 2, + Body: &icmp.ParamProb{ + Pointer: 8, + Data: []byte("ERROR-INVOKING-PACKET"), + }, + }, + { + Type: ipv6.ICMPTypeEchoRequest, Code: 0, + Body: &icmp.Echo{ + ID: 1, Seq: 2, + Data: []byte("HELLO-R-U-THERE"), + }, + }, + { + Type: ipv6.ICMPTypeDuplicateAddressConfirmation, + Body: &icmp.DefaultMessageBody{ + Data: []byte{0x80, 0x40, 0x20, 0x10}, + }, + }, +} + +func TestMarshalAndParseMessageForIPv6(t *testing.T) { + pshicmp := icmp.IPv6PseudoHeader(net.ParseIP("fe80::1"), net.ParseIP("ff02::1")) + for i, tt := range marshalAndParseMessageForIPv6Tests { + for _, psh := range [][]byte{pshicmp, nil} { + b, err := tt.Marshal(psh) + if err != nil { + t.Fatal(err) + } + m, err := icmp.ParseMessage(iana.ProtocolIPv6ICMP, b) + if err != nil { + t.Fatal(err) + } + if m.Type != tt.Type || m.Code != tt.Code { + t.Errorf("#%v: got %v; want %v", i, m, &tt) + } + if !reflect.DeepEqual(m.Body, tt.Body) { + t.Errorf("#%v: got %v; want %v", i, m.Body, tt.Body) + } + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/messagebody.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/messagebody.go new file mode 100644 index 0000000..2463730 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/messagebody.go @@ -0,0 +1,41 @@ +// 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 icmp + +// A MessageBody represents an ICMP message body. +type MessageBody interface { + // Len returns the length of ICMP message body. + // Proto must be either the ICMPv4 or ICMPv6 protocol number. + Len(proto int) int + + // Marshal returns the binary encoding of ICMP message body. + // Proto must be either the ICMPv4 or ICMPv6 protocol number. + Marshal(proto int) ([]byte, error) +} + +// A DefaultMessageBody represents the default message body. +type DefaultMessageBody struct { + Data []byte // data +} + +// Len implements the Len method of MessageBody interface. +func (p *DefaultMessageBody) Len(proto int) int { + if p == nil { + return 0 + } + return len(p.Data) +} + +// Marshal implements the Marshal method of MessageBody interface. +func (p *DefaultMessageBody) Marshal(proto int) ([]byte, error) { + return p.Data, nil +} + +// parseDefaultMessageBody parses b as an ICMP message body. +func parseDefaultMessageBody(proto int, b []byte) (MessageBody, error) { + p := &DefaultMessageBody{Data: make([]byte, len(b))} + copy(p.Data, b) + return p, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/mpls.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/mpls.go new file mode 100644 index 0000000..c314917 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/mpls.go @@ -0,0 +1,77 @@ +// Copyright 2015 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 icmp + +import "encoding/binary" + +// A MPLSLabel represents a MPLS label stack entry. +type MPLSLabel struct { + Label int // label value + TC int // traffic class; formerly experimental use + S bool // bottom of stack + TTL int // time to live +} + +const ( + classMPLSLabelStack = 1 + typeIncomingMPLSLabelStack = 1 +) + +// A MPLSLabelStack represents a MPLS label stack. +type MPLSLabelStack struct { + Class int // extension object class number + Type int // extension object sub-type + Labels []MPLSLabel +} + +// Len implements the Len method of Extension interface. +func (ls *MPLSLabelStack) Len(proto int) int { + return 4 + (4 * len(ls.Labels)) +} + +// Marshal implements the Marshal method of Extension interface. +func (ls *MPLSLabelStack) Marshal(proto int) ([]byte, error) { + b := make([]byte, ls.Len(proto)) + if err := ls.marshal(proto, b); err != nil { + return nil, err + } + return b, nil +} + +func (ls *MPLSLabelStack) marshal(proto int, b []byte) error { + l := ls.Len(proto) + binary.BigEndian.PutUint16(b[:2], uint16(l)) + b[2], b[3] = classMPLSLabelStack, typeIncomingMPLSLabelStack + off := 4 + for _, ll := range ls.Labels { + b[off], b[off+1], b[off+2] = byte(ll.Label>>12), byte(ll.Label>>4&0xff), byte(ll.Label<<4&0xf0) + b[off+2] |= byte(ll.TC << 1 & 0x0e) + if ll.S { + b[off+2] |= 0x1 + } + b[off+3] = byte(ll.TTL) + off += 4 + } + return nil +} + +func parseMPLSLabelStack(b []byte) (Extension, error) { + ls := &MPLSLabelStack{ + Class: int(b[2]), + Type: int(b[3]), + } + for b = b[4:]; len(b) >= 4; b = b[4:] { + ll := MPLSLabel{ + Label: int(b[0])<<12 | int(b[1])<<4 | int(b[2])>>4, + TC: int(b[2]&0x0e) >> 1, + TTL: int(b[3]), + } + if b[2]&0x1 != 0 { + ll.S = true + } + ls.Labels = append(ls.Labels, ll) + } + return ls, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/multipart.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/multipart.go new file mode 100644 index 0000000..f271356 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/multipart.go @@ -0,0 +1,109 @@ +// Copyright 2015 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 icmp + +import "golang.org/x/net/internal/iana" + +// multipartMessageBodyDataLen takes b as an original datagram and +// exts as extensions, and returns a required length for message body +// and a required length for a padded original datagram in wire +// format. +func multipartMessageBodyDataLen(proto int, b []byte, exts []Extension) (bodyLen, dataLen int) { + for _, ext := range exts { + bodyLen += ext.Len(proto) + } + if bodyLen > 0 { + dataLen = multipartMessageOrigDatagramLen(proto, b) + bodyLen += 4 // length of extension header + } else { + dataLen = len(b) + } + bodyLen += dataLen + return bodyLen, dataLen +} + +// multipartMessageOrigDatagramLen takes b as an original datagram, +// and returns a required length for a padded orignal datagram in wire +// format. +func multipartMessageOrigDatagramLen(proto int, b []byte) int { + roundup := func(b []byte, align int) int { + // According to RFC 4884, the padded original datagram + // field must contain at least 128 octets. + if len(b) < 128 { + return 128 + } + r := len(b) + return (r + align - 1) & ^(align - 1) + } + switch proto { + case iana.ProtocolICMP: + return roundup(b, 4) + case iana.ProtocolIPv6ICMP: + return roundup(b, 8) + default: + return len(b) + } +} + +// marshalMultipartMessageBody takes data as an original datagram and +// exts as extesnsions, and returns a binary encoding of message body. +// It can be used for non-multipart message bodies when exts is nil. +func marshalMultipartMessageBody(proto int, data []byte, exts []Extension) ([]byte, error) { + bodyLen, dataLen := multipartMessageBodyDataLen(proto, data, exts) + b := make([]byte, 4+bodyLen) + copy(b[4:], data) + off := dataLen + 4 + if len(exts) > 0 { + b[dataLen+4] = byte(extensionVersion << 4) + off += 4 // length of object header + for _, ext := range exts { + switch ext := ext.(type) { + case *MPLSLabelStack: + if err := ext.marshal(proto, b[off:]); err != nil { + return nil, err + } + off += ext.Len(proto) + case *InterfaceInfo: + attrs, l := ext.attrsAndLen(proto) + if err := ext.marshal(proto, b[off:], attrs, l); err != nil { + return nil, err + } + off += ext.Len(proto) + } + } + s := checksum(b[dataLen+4:]) + b[dataLen+4+2] ^= byte(s) + b[dataLen+4+3] ^= byte(s >> 8) + switch proto { + case iana.ProtocolICMP: + b[1] = byte(dataLen / 4) + case iana.ProtocolIPv6ICMP: + b[0] = byte(dataLen / 8) + } + } + return b, nil +} + +// parseMultipartMessageBody parses b as either a non-multipart +// message body or a multipart message body. +func parseMultipartMessageBody(proto int, b []byte) ([]byte, []Extension, error) { + var l int + switch proto { + case iana.ProtocolICMP: + l = 4 * int(b[1]) + case iana.ProtocolIPv6ICMP: + l = 8 * int(b[0]) + } + if len(b) == 4 { + return nil, nil, nil + } + exts, l, err := parseExtensions(b[4:], l) + if err != nil { + l = len(b) - 4 + } + data := make([]byte, l) + copy(data, b[4:]) + return data, exts, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/multipart_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/multipart_test.go new file mode 100644 index 0000000..966ccb8 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/multipart_test.go @@ -0,0 +1,442 @@ +// Copyright 2015 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 icmp_test + +import ( + "fmt" + "net" + "reflect" + "testing" + + "golang.org/x/net/icmp" + "golang.org/x/net/internal/iana" + "golang.org/x/net/ipv4" + "golang.org/x/net/ipv6" +) + +var marshalAndParseMultipartMessageForIPv4Tests = []icmp.Message{ + { + Type: ipv4.ICMPTypeDestinationUnreachable, Code: 15, + Body: &icmp.DstUnreach{ + Data: []byte("ERROR-INVOKING-PACKET"), + Extensions: []icmp.Extension{ + &icmp.MPLSLabelStack{ + Class: 1, + Type: 1, + Labels: []icmp.MPLSLabel{ + { + Label: 16014, + TC: 0x4, + S: true, + TTL: 255, + }, + }, + }, + &icmp.InterfaceInfo{ + Class: 2, + Type: 0x0f, + Interface: &net.Interface{ + Index: 15, + Name: "en101", + MTU: 8192, + }, + Addr: &net.IPAddr{ + IP: net.IPv4(192, 168, 0, 1).To4(), + }, + }, + }, + }, + }, + { + Type: ipv4.ICMPTypeTimeExceeded, Code: 1, + Body: &icmp.TimeExceeded{ + Data: []byte("ERROR-INVOKING-PACKET"), + Extensions: []icmp.Extension{ + &icmp.InterfaceInfo{ + Class: 2, + Type: 0x0f, + Interface: &net.Interface{ + Index: 15, + Name: "en101", + MTU: 8192, + }, + Addr: &net.IPAddr{ + IP: net.IPv4(192, 168, 0, 1).To4(), + }, + }, + &icmp.MPLSLabelStack{ + Class: 1, + Type: 1, + Labels: []icmp.MPLSLabel{ + { + Label: 16014, + TC: 0x4, + S: true, + TTL: 255, + }, + }, + }, + }, + }, + }, + { + Type: ipv4.ICMPTypeParameterProblem, Code: 2, + Body: &icmp.ParamProb{ + Pointer: 8, + Data: []byte("ERROR-INVOKING-PACKET"), + Extensions: []icmp.Extension{ + &icmp.MPLSLabelStack{ + Class: 1, + Type: 1, + Labels: []icmp.MPLSLabel{ + { + Label: 16014, + TC: 0x4, + S: true, + TTL: 255, + }, + }, + }, + &icmp.InterfaceInfo{ + Class: 2, + Type: 0x0f, + Interface: &net.Interface{ + Index: 15, + Name: "en101", + MTU: 8192, + }, + Addr: &net.IPAddr{ + IP: net.IPv4(192, 168, 0, 1).To4(), + }, + }, + &icmp.InterfaceInfo{ + Class: 2, + Type: 0x2f, + Interface: &net.Interface{ + Index: 16, + Name: "en102", + MTU: 8192, + }, + Addr: &net.IPAddr{ + IP: net.IPv4(192, 168, 0, 2).To4(), + }, + }, + }, + }, + }, +} + +func TestMarshalAndParseMultipartMessageForIPv4(t *testing.T) { + for i, tt := range marshalAndParseMultipartMessageForIPv4Tests { + b, err := tt.Marshal(nil) + if err != nil { + t.Fatal(err) + } + if b[5] != 32 { + t.Errorf("#%v: got %v; want 32", i, b[5]) + } + m, err := icmp.ParseMessage(iana.ProtocolICMP, b) + if err != nil { + t.Fatal(err) + } + if m.Type != tt.Type || m.Code != tt.Code { + t.Errorf("#%v: got %v; want %v", i, m, &tt) + } + switch m.Type { + case ipv4.ICMPTypeDestinationUnreachable: + got, want := m.Body.(*icmp.DstUnreach), tt.Body.(*icmp.DstUnreach) + if !reflect.DeepEqual(got.Extensions, want.Extensions) { + t.Error(dumpExtensions(i, got.Extensions, want.Extensions)) + } + if len(got.Data) != 128 { + t.Errorf("#%v: got %v; want 128", i, len(got.Data)) + } + case ipv4.ICMPTypeTimeExceeded: + got, want := m.Body.(*icmp.TimeExceeded), tt.Body.(*icmp.TimeExceeded) + if !reflect.DeepEqual(got.Extensions, want.Extensions) { + t.Error(dumpExtensions(i, got.Extensions, want.Extensions)) + } + if len(got.Data) != 128 { + t.Errorf("#%v: got %v; want 128", i, len(got.Data)) + } + case ipv4.ICMPTypeParameterProblem: + got, want := m.Body.(*icmp.ParamProb), tt.Body.(*icmp.ParamProb) + if !reflect.DeepEqual(got.Extensions, want.Extensions) { + t.Error(dumpExtensions(i, got.Extensions, want.Extensions)) + } + if len(got.Data) != 128 { + t.Errorf("#%v: got %v; want 128", i, len(got.Data)) + } + } + } +} + +var marshalAndParseMultipartMessageForIPv6Tests = []icmp.Message{ + { + Type: ipv6.ICMPTypeDestinationUnreachable, Code: 6, + Body: &icmp.DstUnreach{ + Data: []byte("ERROR-INVOKING-PACKET"), + Extensions: []icmp.Extension{ + &icmp.MPLSLabelStack{ + Class: 1, + Type: 1, + Labels: []icmp.MPLSLabel{ + { + Label: 16014, + TC: 0x4, + S: true, + TTL: 255, + }, + }, + }, + &icmp.InterfaceInfo{ + Class: 2, + Type: 0x0f, + Interface: &net.Interface{ + Index: 15, + Name: "en101", + MTU: 8192, + }, + Addr: &net.IPAddr{ + IP: net.ParseIP("fe80::1"), + Zone: "en101", + }, + }, + }, + }, + }, + { + Type: ipv6.ICMPTypeTimeExceeded, Code: 1, + Body: &icmp.TimeExceeded{ + Data: []byte("ERROR-INVOKING-PACKET"), + Extensions: []icmp.Extension{ + &icmp.InterfaceInfo{ + Class: 2, + Type: 0x0f, + Interface: &net.Interface{ + Index: 15, + Name: "en101", + MTU: 8192, + }, + Addr: &net.IPAddr{ + IP: net.ParseIP("fe80::1"), + Zone: "en101", + }, + }, + &icmp.MPLSLabelStack{ + Class: 1, + Type: 1, + Labels: []icmp.MPLSLabel{ + { + Label: 16014, + TC: 0x4, + S: true, + TTL: 255, + }, + }, + }, + &icmp.InterfaceInfo{ + Class: 2, + Type: 0x2f, + Interface: &net.Interface{ + Index: 16, + Name: "en102", + MTU: 8192, + }, + Addr: &net.IPAddr{ + IP: net.ParseIP("fe80::1"), + Zone: "en102", + }, + }, + }, + }, + }, +} + +func TestMarshalAndParseMultipartMessageForIPv6(t *testing.T) { + pshicmp := icmp.IPv6PseudoHeader(net.ParseIP("fe80::1"), net.ParseIP("ff02::1")) + for i, tt := range marshalAndParseMultipartMessageForIPv6Tests { + for _, psh := range [][]byte{pshicmp, nil} { + b, err := tt.Marshal(psh) + if err != nil { + t.Fatal(err) + } + if b[4] != 16 { + t.Errorf("#%v: got %v; want 16", i, b[4]) + } + m, err := icmp.ParseMessage(iana.ProtocolIPv6ICMP, b) + if err != nil { + t.Fatal(err) + } + if m.Type != tt.Type || m.Code != tt.Code { + t.Errorf("#%v: got %v; want %v", i, m, &tt) + } + switch m.Type { + case ipv6.ICMPTypeDestinationUnreachable: + got, want := m.Body.(*icmp.DstUnreach), tt.Body.(*icmp.DstUnreach) + if !reflect.DeepEqual(got.Extensions, want.Extensions) { + t.Error(dumpExtensions(i, got.Extensions, want.Extensions)) + } + if len(got.Data) != 128 { + t.Errorf("#%v: got %v; want 128", i, len(got.Data)) + } + case ipv6.ICMPTypeTimeExceeded: + got, want := m.Body.(*icmp.TimeExceeded), tt.Body.(*icmp.TimeExceeded) + if !reflect.DeepEqual(got.Extensions, want.Extensions) { + t.Error(dumpExtensions(i, got.Extensions, want.Extensions)) + } + if len(got.Data) != 128 { + t.Errorf("#%v: got %v; want 128", i, len(got.Data)) + } + } + } + } +} + +func dumpExtensions(i int, gotExts, wantExts []icmp.Extension) string { + var s string + for j, got := range gotExts { + switch got := got.(type) { + case *icmp.MPLSLabelStack: + want := wantExts[j].(*icmp.MPLSLabelStack) + if !reflect.DeepEqual(got, want) { + s += fmt.Sprintf("#%v/%v: got %#v; want %#v\n", i, j, got, want) + } + case *icmp.InterfaceInfo: + want := wantExts[j].(*icmp.InterfaceInfo) + if !reflect.DeepEqual(got, want) { + s += fmt.Sprintf("#%v/%v: got %#v, %#v, %#v; want %#v, %#v, %#v\n", i, j, got, got.Interface, got.Addr, want, want.Interface, want.Addr) + } + } + } + return s[:len(s)-1] +} + +var multipartMessageBodyLenTests = []struct { + proto int + in icmp.MessageBody + out int +}{ + { + iana.ProtocolICMP, + &icmp.DstUnreach{ + Data: make([]byte, ipv4.HeaderLen), + }, + 4 + ipv4.HeaderLen, // unused and original datagram + }, + { + iana.ProtocolICMP, + &icmp.TimeExceeded{ + Data: make([]byte, ipv4.HeaderLen), + }, + 4 + ipv4.HeaderLen, // unused and original datagram + }, + { + iana.ProtocolICMP, + &icmp.ParamProb{ + Data: make([]byte, ipv4.HeaderLen), + }, + 4 + ipv4.HeaderLen, // [pointer, unused] and original datagram + }, + + { + iana.ProtocolICMP, + &icmp.ParamProb{ + Data: make([]byte, ipv4.HeaderLen), + Extensions: []icmp.Extension{ + &icmp.MPLSLabelStack{}, + }, + }, + 4 + 4 + 4 + 0 + 128, // [pointer, length, unused], extension header, object header, object payload, original datagram + }, + { + iana.ProtocolICMP, + &icmp.ParamProb{ + Data: make([]byte, 128), + Extensions: []icmp.Extension{ + &icmp.MPLSLabelStack{}, + }, + }, + 4 + 4 + 4 + 0 + 128, // [pointer, length, unused], extension header, object header, object payload and original datagram + }, + { + iana.ProtocolICMP, + &icmp.ParamProb{ + Data: make([]byte, 129), + Extensions: []icmp.Extension{ + &icmp.MPLSLabelStack{}, + }, + }, + 4 + 4 + 4 + 0 + 132, // [pointer, length, unused], extension header, object header, object payload and original datagram + }, + + { + iana.ProtocolIPv6ICMP, + &icmp.DstUnreach{ + Data: make([]byte, ipv6.HeaderLen), + }, + 4 + ipv6.HeaderLen, // unused and original datagram + }, + { + iana.ProtocolIPv6ICMP, + &icmp.PacketTooBig{ + Data: make([]byte, ipv6.HeaderLen), + }, + 4 + ipv6.HeaderLen, // mtu and original datagram + }, + { + iana.ProtocolIPv6ICMP, + &icmp.TimeExceeded{ + Data: make([]byte, ipv6.HeaderLen), + }, + 4 + ipv6.HeaderLen, // unused and original datagram + }, + { + iana.ProtocolIPv6ICMP, + &icmp.ParamProb{ + Data: make([]byte, ipv6.HeaderLen), + }, + 4 + ipv6.HeaderLen, // pointer and original datagram + }, + + { + iana.ProtocolIPv6ICMP, + &icmp.DstUnreach{ + Data: make([]byte, 127), + Extensions: []icmp.Extension{ + &icmp.MPLSLabelStack{}, + }, + }, + 4 + 4 + 4 + 0 + 128, // [length, unused], extension header, object header, object payload and original datagram + }, + { + iana.ProtocolIPv6ICMP, + &icmp.DstUnreach{ + Data: make([]byte, 128), + Extensions: []icmp.Extension{ + &icmp.MPLSLabelStack{}, + }, + }, + 4 + 4 + 4 + 0 + 128, // [length, unused], extension header, object header, object payload and original datagram + }, + { + iana.ProtocolIPv6ICMP, + &icmp.DstUnreach{ + Data: make([]byte, 129), + Extensions: []icmp.Extension{ + &icmp.MPLSLabelStack{}, + }, + }, + 4 + 4 + 4 + 0 + 136, // [length, unused], extension header, object header, object payload and original datagram + }, +} + +func TestMultipartMessageBodyLen(t *testing.T) { + for i, tt := range multipartMessageBodyLenTests { + if out := tt.in.Len(tt.proto); out != tt.out { + t.Errorf("#%d: got %d; want %d", i, out, tt.out) + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/packettoobig.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/packettoobig.go new file mode 100644 index 0000000..a1c9df7 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/packettoobig.go @@ -0,0 +1,43 @@ +// 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 icmp + +import "encoding/binary" + +// A PacketTooBig represents an ICMP packet too big message body. +type PacketTooBig struct { + MTU int // maximum transmission unit of the nexthop link + Data []byte // data, known as original datagram field +} + +// Len implements the Len method of MessageBody interface. +func (p *PacketTooBig) Len(proto int) int { + if p == nil { + return 0 + } + return 4 + len(p.Data) +} + +// Marshal implements the Marshal method of MessageBody interface. +func (p *PacketTooBig) Marshal(proto int) ([]byte, error) { + b := make([]byte, 4+len(p.Data)) + binary.BigEndian.PutUint32(b[:4], uint32(p.MTU)) + copy(b[4:], p.Data) + return b, nil +} + +// parsePacketTooBig parses b as an ICMP packet too big message body. +func parsePacketTooBig(proto int, b []byte) (MessageBody, error) { + bodyLen := len(b) + if bodyLen < 4 { + return nil, errMessageTooShort + } + p := &PacketTooBig{MTU: int(binary.BigEndian.Uint32(b[:4]))} + if bodyLen > 4 { + p.Data = make([]byte, bodyLen-4) + copy(p.Data, b[4:]) + } + return p, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/paramprob.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/paramprob.go new file mode 100644 index 0000000..0a2548d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/paramprob.go @@ -0,0 +1,63 @@ +// 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 icmp + +import ( + "encoding/binary" + "golang.org/x/net/internal/iana" +) + +// A ParamProb represents an ICMP parameter problem message body. +type ParamProb struct { + Pointer uintptr // offset within the data where the error was detected + Data []byte // data, known as original datagram field + Extensions []Extension // extensions +} + +// Len implements the Len method of MessageBody interface. +func (p *ParamProb) Len(proto int) int { + if p == nil { + return 0 + } + l, _ := multipartMessageBodyDataLen(proto, p.Data, p.Extensions) + return 4 + l +} + +// Marshal implements the Marshal method of MessageBody interface. +func (p *ParamProb) Marshal(proto int) ([]byte, error) { + if proto == iana.ProtocolIPv6ICMP { + b := make([]byte, p.Len(proto)) + binary.BigEndian.PutUint32(b[:4], uint32(p.Pointer)) + copy(b[4:], p.Data) + return b, nil + } + b, err := marshalMultipartMessageBody(proto, p.Data, p.Extensions) + if err != nil { + return nil, err + } + b[0] = byte(p.Pointer) + return b, nil +} + +// parseParamProb parses b as an ICMP parameter problem message body. +func parseParamProb(proto int, b []byte) (MessageBody, error) { + if len(b) < 4 { + return nil, errMessageTooShort + } + p := &ParamProb{} + if proto == iana.ProtocolIPv6ICMP { + p.Pointer = uintptr(binary.BigEndian.Uint32(b[:4])) + p.Data = make([]byte, len(b)-4) + copy(p.Data, b[4:]) + return p, nil + } + p.Pointer = uintptr(b[0]) + var err error + p.Data, p.Extensions, err = parseMultipartMessageBody(proto, b) + if err != nil { + return nil, err + } + return p, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/ping_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/ping_test.go new file mode 100644 index 0000000..3171dad --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/ping_test.go @@ -0,0 +1,200 @@ +// 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 icmp_test + +import ( + "errors" + "fmt" + "net" + "os" + "runtime" + "sync" + "testing" + "time" + + "golang.org/x/net/icmp" + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv4" + "golang.org/x/net/ipv6" +) + +func googleAddr(c *icmp.PacketConn, protocol int) (net.Addr, error) { + const host = "www.google.com" + ips, err := net.LookupIP(host) + if err != nil { + return nil, err + } + netaddr := func(ip net.IP) (net.Addr, error) { + switch c.LocalAddr().(type) { + case *net.UDPAddr: + return &net.UDPAddr{IP: ip}, nil + case *net.IPAddr: + return &net.IPAddr{IP: ip}, nil + default: + return nil, errors.New("neither UDPAddr nor IPAddr") + } + } + for _, ip := range ips { + switch protocol { + case iana.ProtocolICMP: + if ip.To4() != nil { + return netaddr(ip) + } + case iana.ProtocolIPv6ICMP: + if ip.To16() != nil && ip.To4() == nil { + return netaddr(ip) + } + } + } + return nil, errors.New("no A or AAAA record") +} + +type pingTest struct { + network, address string + protocol int + mtype icmp.Type +} + +var nonPrivilegedPingTests = []pingTest{ + {"udp4", "0.0.0.0", iana.ProtocolICMP, ipv4.ICMPTypeEcho}, + + {"udp6", "::", iana.ProtocolIPv6ICMP, ipv6.ICMPTypeEchoRequest}, +} + +func TestNonPrivilegedPing(t *testing.T) { + if testing.Short() { + t.Skip("avoid external network") + } + switch runtime.GOOS { + case "darwin": + case "linux": + t.Log("you may need to adjust the net.ipv4.ping_group_range kernel state") + default: + t.Skipf("not supported on %s", runtime.GOOS) + } + + for i, tt := range nonPrivilegedPingTests { + if err := doPing(tt, i); err != nil { + t.Error(err) + } + } +} + +var privilegedPingTests = []pingTest{ + {"ip4:icmp", "0.0.0.0", iana.ProtocolICMP, ipv4.ICMPTypeEcho}, + + {"ip6:ipv6-icmp", "::", iana.ProtocolIPv6ICMP, ipv6.ICMPTypeEchoRequest}, +} + +func TestPrivilegedPing(t *testing.T) { + if testing.Short() { + t.Skip("avoid external network") + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + + for i, tt := range privilegedPingTests { + if err := doPing(tt, i); err != nil { + t.Error(err) + } + } +} + +func doPing(tt pingTest, seq int) error { + c, err := icmp.ListenPacket(tt.network, tt.address) + if err != nil { + return err + } + defer c.Close() + + dst, err := googleAddr(c, tt.protocol) + if err != nil { + return err + } + + if tt.network != "udp6" && tt.protocol == iana.ProtocolIPv6ICMP { + var f ipv6.ICMPFilter + f.SetAll(true) + f.Accept(ipv6.ICMPTypeDestinationUnreachable) + f.Accept(ipv6.ICMPTypePacketTooBig) + f.Accept(ipv6.ICMPTypeTimeExceeded) + f.Accept(ipv6.ICMPTypeParameterProblem) + f.Accept(ipv6.ICMPTypeEchoReply) + if err := c.IPv6PacketConn().SetICMPFilter(&f); err != nil { + return err + } + } + + wm := icmp.Message{ + Type: tt.mtype, Code: 0, + Body: &icmp.Echo{ + ID: os.Getpid() & 0xffff, Seq: 1 << uint(seq), + Data: []byte("HELLO-R-U-THERE"), + }, + } + wb, err := wm.Marshal(nil) + if err != nil { + return err + } + if n, err := c.WriteTo(wb, dst); err != nil { + return err + } else if n != len(wb) { + return fmt.Errorf("got %v; want %v", n, len(wb)) + } + + rb := make([]byte, 1500) + if err := c.SetReadDeadline(time.Now().Add(3 * time.Second)); err != nil { + return err + } + n, peer, err := c.ReadFrom(rb) + if err != nil { + return err + } + rm, err := icmp.ParseMessage(tt.protocol, rb[:n]) + if err != nil { + return err + } + switch rm.Type { + case ipv4.ICMPTypeEchoReply, ipv6.ICMPTypeEchoReply: + return nil + default: + return fmt.Errorf("got %+v from %v; want echo reply", rm, peer) + } +} + +func TestConcurrentNonPrivilegedListenPacket(t *testing.T) { + if testing.Short() { + t.Skip("avoid external network") + } + switch runtime.GOOS { + case "darwin": + case "linux": + t.Log("you may need to adjust the net.ipv4.ping_group_range kernel state") + default: + t.Skipf("not supported on %s", runtime.GOOS) + } + + network, address := "udp4", "127.0.0.1" + if !nettest.SupportsIPv4() { + network, address = "udp6", "::1" + } + const N = 1000 + var wg sync.WaitGroup + wg.Add(N) + for i := 0; i < N; i++ { + go func() { + defer wg.Done() + c, err := icmp.ListenPacket(network, address) + if err != nil { + t.Error(err) + return + } + c.Close() + }() + } + wg.Wait() +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/sys_freebsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/sys_freebsd.go new file mode 100644 index 0000000..c75f3dd --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/sys_freebsd.go @@ -0,0 +1,11 @@ +// 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 icmp + +import "syscall" + +func init() { + freebsdVersion, _ = syscall.SysctlUint32("kern.osreldate") +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/timeexceeded.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/timeexceeded.go new file mode 100644 index 0000000..344e158 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/icmp/timeexceeded.go @@ -0,0 +1,39 @@ +// 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 icmp + +// A TimeExceeded represents an ICMP time exceeded message body. +type TimeExceeded struct { + Data []byte // data, known as original datagram field + Extensions []Extension // extensions +} + +// Len implements the Len method of MessageBody interface. +func (p *TimeExceeded) Len(proto int) int { + if p == nil { + return 0 + } + l, _ := multipartMessageBodyDataLen(proto, p.Data, p.Extensions) + return 4 + l +} + +// Marshal implements the Marshal method of MessageBody interface. +func (p *TimeExceeded) Marshal(proto int) ([]byte, error) { + return marshalMultipartMessageBody(proto, p.Data, p.Extensions) +} + +// parseTimeExceeded parses b as an ICMP time exceeded message body. +func parseTimeExceeded(proto int, b []byte) (MessageBody, error) { + if len(b) < 4 { + return nil, errMessageTooShort + } + p := &TimeExceeded{} + var err error + p.Data, p.Extensions, err = parseMultipartMessageBody(proto, b) + if err != nil { + return nil, err + } + return p, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/idna/example_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/idna/example_test.go new file mode 100644 index 0000000..948f6eb --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/idna/example_test.go @@ -0,0 +1,70 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +// 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 idna_test + +import ( + "fmt" + + "golang.org/x/net/idna" +) + +func ExampleProfile() { + // Raw Punycode has no restrictions and does no mappings. + fmt.Println(idna.ToASCII("")) + fmt.Println(idna.ToASCII("*.faß.com")) + fmt.Println(idna.Punycode.ToASCII("*.faß.com")) + + // Rewrite IDN for lookup. This (currently) uses transitional mappings to + // find a balance between IDNA2003 and IDNA2008 compatibility. + fmt.Println(idna.Lookup.ToASCII("")) + fmt.Println(idna.Lookup.ToASCII("www.faß.com")) + + // Convert an IDN to ASCII for registration purposes. This changes the + // encoding, but reports an error if the input was illformed. + fmt.Println(idna.Registration.ToASCII("")) + fmt.Println(idna.Registration.ToASCII("www.faß.com")) + + // Output: + // + // *.xn--fa-hia.com + // *.xn--fa-hia.com + // + // www.fass.com + // idna: invalid label "" + // www.xn--fa-hia.com +} + +func ExampleNew() { + var p *idna.Profile + + // Raw Punycode has no restrictions and does no mappings. + p = idna.New() + fmt.Println(p.ToASCII("*.faß.com")) + + // Do mappings. Note that star is not allowed in a DNS lookup. + p = idna.New( + idna.MapForLookup(), + idna.Transitional(true)) // Map ß -> ss + fmt.Println(p.ToASCII("*.faß.com")) + + // Lookup for registration. Also does not allow '*'. + p = idna.New(idna.ValidateForRegistration()) + fmt.Println(p.ToUnicode("*.faß.com")) + + // Set up a profile maps for lookup, but allows wild cards. + p = idna.New( + idna.MapForLookup(), + idna.Transitional(true), // Map ß -> ss + idna.StrictDomainName(false)) // Set more permissive ASCII rules. + fmt.Println(p.ToASCII("*.faß.com")) + + // Output: + // *.xn--fa-hia.com + // *.fass.com idna: disallowed rune U+002A + // *.faß.com idna: disallowed rune U+002A + // *.fass.com +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/idna/idna.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/idna/idna.go new file mode 100644 index 0000000..ec8232b --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/idna/idna.go @@ -0,0 +1,680 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +// 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 idna implements IDNA2008 using the compatibility processing +// defined by UTS (Unicode Technical Standard) #46, which defines a standard to +// deal with the transition from IDNA2003. +// +// IDNA2008 (Internationalized Domain Names for Applications), is defined in RFC +// 5890, RFC 5891, RFC 5892, RFC 5893 and RFC 5894. +// UTS #46 is defined in http://www.unicode.org/reports/tr46. +// See http://unicode.org/cldr/utility/idna.jsp for a visualization of the +// differences between these two standards. +package idna // import "golang.org/x/net/idna" + +import ( + "fmt" + "strings" + "unicode/utf8" + + "golang.org/x/text/secure/bidirule" + "golang.org/x/text/unicode/norm" +) + +// NOTE: Unlike common practice in Go APIs, the functions will return a +// sanitized domain name in case of errors. Browsers sometimes use a partially +// evaluated string as lookup. +// TODO: the current error handling is, in my opinion, the least opinionated. +// Other strategies are also viable, though: +// Option 1) Return an empty string in case of error, but allow the user to +// specify explicitly which errors to ignore. +// Option 2) Return the partially evaluated string if it is itself a valid +// string, otherwise return the empty string in case of error. +// Option 3) Option 1 and 2. +// Option 4) Always return an empty string for now and implement Option 1 as +// needed, and document that the return string may not be empty in case of +// error in the future. +// I think Option 1 is best, but it is quite opinionated. + +// ToASCII is a wrapper for Punycode.ToASCII. +func ToASCII(s string) (string, error) { + return Punycode.process(s, true) +} + +// ToUnicode is a wrapper for Punycode.ToUnicode. +func ToUnicode(s string) (string, error) { + return Punycode.process(s, false) +} + +// An Option configures a Profile at creation time. +type Option func(*options) + +// Transitional sets a Profile to use the Transitional mapping as defined in UTS +// #46. This will cause, for example, "ß" to be mapped to "ss". Using the +// transitional mapping provides a compromise between IDNA2003 and IDNA2008 +// compatibility. It is used by most browsers when resolving domain names. This +// option is only meaningful if combined with MapForLookup. +func Transitional(transitional bool) Option { + return func(o *options) { o.transitional = true } +} + +// VerifyDNSLength sets whether a Profile should fail if any of the IDN parts +// are longer than allowed by the RFC. +func VerifyDNSLength(verify bool) Option { + return func(o *options) { o.verifyDNSLength = verify } +} + +// RemoveLeadingDots removes leading label separators. Leading runes that map to +// dots, such as U+3002, are removed as well. +// +// This is the behavior suggested by the UTS #46 and is adopted by some +// browsers. +func RemoveLeadingDots(remove bool) Option { + return func(o *options) { o.removeLeadingDots = remove } +} + +// ValidateLabels sets whether to check the mandatory label validation criteria +// as defined in Section 5.4 of RFC 5891. This includes testing for correct use +// of hyphens ('-'), normalization, validity of runes, and the context rules. +func ValidateLabels(enable bool) Option { + return func(o *options) { + // Don't override existing mappings, but set one that at least checks + // normalization if it is not set. + if o.mapping == nil && enable { + o.mapping = normalize + } + o.trie = trie + o.validateLabels = enable + o.fromPuny = validateFromPunycode + } +} + +// StrictDomainName limits the set of permissable ASCII characters to those +// allowed in domain names as defined in RFC 1034 (A-Z, a-z, 0-9 and the +// hyphen). This is set by default for MapForLookup and ValidateForRegistration. +// +// This option is useful, for instance, for browsers that allow characters +// outside this range, for example a '_' (U+005F LOW LINE). See +// http://www.rfc-editor.org/std/std3.txt for more details This option +// corresponds to the UseSTD3ASCIIRules option in UTS #46. +func StrictDomainName(use bool) Option { + return func(o *options) { + o.trie = trie + o.useSTD3Rules = use + o.fromPuny = validateFromPunycode + } +} + +// NOTE: the following options pull in tables. The tables should not be linked +// in as long as the options are not used. + +// BidiRule enables the Bidi rule as defined in RFC 5893. Any application +// that relies on proper validation of labels should include this rule. +func BidiRule() Option { + return func(o *options) { o.bidirule = bidirule.ValidString } +} + +// ValidateForRegistration sets validation options to verify that a given IDN is +// properly formatted for registration as defined by Section 4 of RFC 5891. +func ValidateForRegistration() Option { + return func(o *options) { + o.mapping = validateRegistration + StrictDomainName(true)(o) + ValidateLabels(true)(o) + VerifyDNSLength(true)(o) + BidiRule()(o) + } +} + +// MapForLookup sets validation and mapping options such that a given IDN is +// transformed for domain name lookup according to the requirements set out in +// Section 5 of RFC 5891. The mappings follow the recommendations of RFC 5894, +// RFC 5895 and UTS 46. It does not add the Bidi Rule. Use the BidiRule option +// to add this check. +// +// The mappings include normalization and mapping case, width and other +// compatibility mappings. +func MapForLookup() Option { + return func(o *options) { + o.mapping = validateAndMap + StrictDomainName(true)(o) + ValidateLabels(true)(o) + RemoveLeadingDots(true)(o) + } +} + +type options struct { + transitional bool + useSTD3Rules bool + validateLabels bool + verifyDNSLength bool + removeLeadingDots bool + + trie *idnaTrie + + // fromPuny calls validation rules when converting A-labels to U-labels. + fromPuny func(p *Profile, s string) error + + // mapping implements a validation and mapping step as defined in RFC 5895 + // or UTS 46, tailored to, for example, domain registration or lookup. + mapping func(p *Profile, s string) (string, error) + + // bidirule, if specified, checks whether s conforms to the Bidi Rule + // defined in RFC 5893. + bidirule func(s string) bool +} + +// A Profile defines the configuration of an IDNA mapper. +type Profile struct { + options +} + +func apply(o *options, opts []Option) { + for _, f := range opts { + f(o) + } +} + +// New creates a new Profile. +// +// With no options, the returned Profile is the most permissive and equals the +// Punycode Profile. Options can be passed to further restrict the Profile. The +// MapForLookup and ValidateForRegistration options set a collection of options, +// for lookup and registration purposes respectively, which can be tailored by +// adding more fine-grained options, where later options override earlier +// options. +func New(o ...Option) *Profile { + p := &Profile{} + apply(&p.options, o) + return p +} + +// ToASCII converts a domain or domain label to its ASCII form. For example, +// ToASCII("bücher.example.com") is "xn--bcher-kva.example.com", and +// ToASCII("golang") is "golang". If an error is encountered it will return +// an error and a (partially) processed result. +func (p *Profile) ToASCII(s string) (string, error) { + return p.process(s, true) +} + +// ToUnicode converts a domain or domain label to its Unicode form. For example, +// ToUnicode("xn--bcher-kva.example.com") is "bücher.example.com", and +// ToUnicode("golang") is "golang". If an error is encountered it will return +// an error and a (partially) processed result. +func (p *Profile) ToUnicode(s string) (string, error) { + pp := *p + pp.transitional = false + return pp.process(s, false) +} + +// String reports a string with a description of the profile for debugging +// purposes. The string format may change with different versions. +func (p *Profile) String() string { + s := "" + if p.transitional { + s = "Transitional" + } else { + s = "NonTransitional" + } + if p.useSTD3Rules { + s += ":UseSTD3Rules" + } + if p.validateLabels { + s += ":ValidateLabels" + } + if p.verifyDNSLength { + s += ":VerifyDNSLength" + } + return s +} + +var ( + // Punycode is a Profile that does raw punycode processing with a minimum + // of validation. + Punycode *Profile = punycode + + // Lookup is the recommended profile for looking up domain names, according + // to Section 5 of RFC 5891. The exact configuration of this profile may + // change over time. + Lookup *Profile = lookup + + // Display is the recommended profile for displaying domain names. + // The configuration of this profile may change over time. + Display *Profile = display + + // Registration is the recommended profile for checking whether a given + // IDN is valid for registration, according to Section 4 of RFC 5891. + Registration *Profile = registration + + punycode = &Profile{} + lookup = &Profile{options{ + transitional: true, + useSTD3Rules: true, + validateLabels: true, + removeLeadingDots: true, + trie: trie, + fromPuny: validateFromPunycode, + mapping: validateAndMap, + bidirule: bidirule.ValidString, + }} + display = &Profile{options{ + useSTD3Rules: true, + validateLabels: true, + removeLeadingDots: true, + trie: trie, + fromPuny: validateFromPunycode, + mapping: validateAndMap, + bidirule: bidirule.ValidString, + }} + registration = &Profile{options{ + useSTD3Rules: true, + validateLabels: true, + verifyDNSLength: true, + trie: trie, + fromPuny: validateFromPunycode, + mapping: validateRegistration, + bidirule: bidirule.ValidString, + }} + + // TODO: profiles + // Register: recommended for approving domain names: don't do any mappings + // but rather reject on invalid input. Bundle or block deviation characters. +) + +type labelError struct{ label, code_ string } + +func (e labelError) code() string { return e.code_ } +func (e labelError) Error() string { + return fmt.Sprintf("idna: invalid label %q", e.label) +} + +type runeError rune + +func (e runeError) code() string { return "P1" } +func (e runeError) Error() string { + return fmt.Sprintf("idna: disallowed rune %U", e) +} + +// process implements the algorithm described in section 4 of UTS #46, +// see http://www.unicode.org/reports/tr46. +func (p *Profile) process(s string, toASCII bool) (string, error) { + var err error + if p.mapping != nil { + s, err = p.mapping(p, s) + } + // Remove leading empty labels. + if p.removeLeadingDots { + for ; len(s) > 0 && s[0] == '.'; s = s[1:] { + } + } + // It seems like we should only create this error on ToASCII, but the + // UTS 46 conformance tests suggests we should always check this. + if err == nil && p.verifyDNSLength && s == "" { + err = &labelError{s, "A4"} + } + labels := labelIter{orig: s} + for ; !labels.done(); labels.next() { + label := labels.label() + if label == "" { + // Empty labels are not okay. The label iterator skips the last + // label if it is empty. + if err == nil && p.verifyDNSLength { + err = &labelError{s, "A4"} + } + continue + } + if strings.HasPrefix(label, acePrefix) { + u, err2 := decode(label[len(acePrefix):]) + if err2 != nil { + if err == nil { + err = err2 + } + // Spec says keep the old label. + continue + } + labels.set(u) + if err == nil && p.validateLabels { + err = p.fromPuny(p, u) + } + if err == nil { + // This should be called on NonTransitional, according to the + // spec, but that currently does not have any effect. Use the + // original profile to preserve options. + err = p.validateLabel(u) + } + } else if err == nil { + err = p.validateLabel(label) + } + } + if toASCII { + for labels.reset(); !labels.done(); labels.next() { + label := labels.label() + if !ascii(label) { + a, err2 := encode(acePrefix, label) + if err == nil { + err = err2 + } + label = a + labels.set(a) + } + n := len(label) + if p.verifyDNSLength && err == nil && (n == 0 || n > 63) { + err = &labelError{label, "A4"} + } + } + } + s = labels.result() + if toASCII && p.verifyDNSLength && err == nil { + // Compute the length of the domain name minus the root label and its dot. + n := len(s) + if n > 0 && s[n-1] == '.' { + n-- + } + if len(s) < 1 || n > 253 { + err = &labelError{s, "A4"} + } + } + return s, err +} + +func normalize(p *Profile, s string) (string, error) { + return norm.NFC.String(s), nil +} + +func validateRegistration(p *Profile, s string) (string, error) { + if !norm.NFC.IsNormalString(s) { + return s, &labelError{s, "V1"} + } + for i := 0; i < len(s); { + v, sz := trie.lookupString(s[i:]) + // Copy bytes not copied so far. + switch p.simplify(info(v).category()) { + // TODO: handle the NV8 defined in the Unicode idna data set to allow + // for strict conformance to IDNA2008. + case valid, deviation: + case disallowed, mapped, unknown, ignored: + r, _ := utf8.DecodeRuneInString(s[i:]) + return s, runeError(r) + } + i += sz + } + return s, nil +} + +func validateAndMap(p *Profile, s string) (string, error) { + var ( + err error + b []byte + k int + ) + for i := 0; i < len(s); { + v, sz := trie.lookupString(s[i:]) + start := i + i += sz + // Copy bytes not copied so far. + switch p.simplify(info(v).category()) { + case valid: + continue + case disallowed: + if err == nil { + r, _ := utf8.DecodeRuneInString(s[start:]) + err = runeError(r) + } + continue + case mapped, deviation: + b = append(b, s[k:start]...) + b = info(v).appendMapping(b, s[start:i]) + case ignored: + b = append(b, s[k:start]...) + // drop the rune + case unknown: + b = append(b, s[k:start]...) + b = append(b, "\ufffd"...) + } + k = i + } + if k == 0 { + // No changes so far. + s = norm.NFC.String(s) + } else { + b = append(b, s[k:]...) + if norm.NFC.QuickSpan(b) != len(b) { + b = norm.NFC.Bytes(b) + } + // TODO: the punycode converters require strings as input. + s = string(b) + } + return s, err +} + +// A labelIter allows iterating over domain name labels. +type labelIter struct { + orig string + slice []string + curStart int + curEnd int + i int +} + +func (l *labelIter) reset() { + l.curStart = 0 + l.curEnd = 0 + l.i = 0 +} + +func (l *labelIter) done() bool { + return l.curStart >= len(l.orig) +} + +func (l *labelIter) result() string { + if l.slice != nil { + return strings.Join(l.slice, ".") + } + return l.orig +} + +func (l *labelIter) label() string { + if l.slice != nil { + return l.slice[l.i] + } + p := strings.IndexByte(l.orig[l.curStart:], '.') + l.curEnd = l.curStart + p + if p == -1 { + l.curEnd = len(l.orig) + } + return l.orig[l.curStart:l.curEnd] +} + +// next sets the value to the next label. It skips the last label if it is empty. +func (l *labelIter) next() { + l.i++ + if l.slice != nil { + if l.i >= len(l.slice) || l.i == len(l.slice)-1 && l.slice[l.i] == "" { + l.curStart = len(l.orig) + } + } else { + l.curStart = l.curEnd + 1 + if l.curStart == len(l.orig)-1 && l.orig[l.curStart] == '.' { + l.curStart = len(l.orig) + } + } +} + +func (l *labelIter) set(s string) { + if l.slice == nil { + l.slice = strings.Split(l.orig, ".") + } + l.slice[l.i] = s +} + +// acePrefix is the ASCII Compatible Encoding prefix. +const acePrefix = "xn--" + +func (p *Profile) simplify(cat category) category { + switch cat { + case disallowedSTD3Mapped: + if p.useSTD3Rules { + cat = disallowed + } else { + cat = mapped + } + case disallowedSTD3Valid: + if p.useSTD3Rules { + cat = disallowed + } else { + cat = valid + } + case deviation: + if !p.transitional { + cat = valid + } + case validNV8, validXV8: + // TODO: handle V2008 + cat = valid + } + return cat +} + +func validateFromPunycode(p *Profile, s string) error { + if !norm.NFC.IsNormalString(s) { + return &labelError{s, "V1"} + } + for i := 0; i < len(s); { + v, sz := trie.lookupString(s[i:]) + if c := p.simplify(info(v).category()); c != valid && c != deviation { + return &labelError{s, "V6"} + } + i += sz + } + return nil +} + +const ( + zwnj = "\u200c" + zwj = "\u200d" +) + +type joinState int8 + +const ( + stateStart joinState = iota + stateVirama + stateBefore + stateBeforeVirama + stateAfter + stateFAIL +) + +var joinStates = [][numJoinTypes]joinState{ + stateStart: { + joiningL: stateBefore, + joiningD: stateBefore, + joinZWNJ: stateFAIL, + joinZWJ: stateFAIL, + joinVirama: stateVirama, + }, + stateVirama: { + joiningL: stateBefore, + joiningD: stateBefore, + }, + stateBefore: { + joiningL: stateBefore, + joiningD: stateBefore, + joiningT: stateBefore, + joinZWNJ: stateAfter, + joinZWJ: stateFAIL, + joinVirama: stateBeforeVirama, + }, + stateBeforeVirama: { + joiningL: stateBefore, + joiningD: stateBefore, + joiningT: stateBefore, + }, + stateAfter: { + joiningL: stateFAIL, + joiningD: stateBefore, + joiningT: stateAfter, + joiningR: stateStart, + joinZWNJ: stateFAIL, + joinZWJ: stateFAIL, + joinVirama: stateAfter, // no-op as we can't accept joiners here + }, + stateFAIL: { + 0: stateFAIL, + joiningL: stateFAIL, + joiningD: stateFAIL, + joiningT: stateFAIL, + joiningR: stateFAIL, + joinZWNJ: stateFAIL, + joinZWJ: stateFAIL, + joinVirama: stateFAIL, + }, +} + +// validateLabel validates the criteria from Section 4.1. Item 1, 4, and 6 are +// already implicitly satisfied by the overall implementation. +func (p *Profile) validateLabel(s string) error { + if s == "" { + if p.verifyDNSLength { + return &labelError{s, "A4"} + } + return nil + } + if p.bidirule != nil && !p.bidirule(s) { + return &labelError{s, "B"} + } + if !p.validateLabels { + return nil + } + trie := p.trie // p.validateLabels is only set if trie is set. + if len(s) > 4 && s[2] == '-' && s[3] == '-' { + return &labelError{s, "V2"} + } + if s[0] == '-' || s[len(s)-1] == '-' { + return &labelError{s, "V3"} + } + // TODO: merge the use of this in the trie. + v, sz := trie.lookupString(s) + x := info(v) + if x.isModifier() { + return &labelError{s, "V5"} + } + // Quickly return in the absence of zero-width (non) joiners. + if strings.Index(s, zwj) == -1 && strings.Index(s, zwnj) == -1 { + return nil + } + st := stateStart + for i := 0; ; { + jt := x.joinType() + if s[i:i+sz] == zwj { + jt = joinZWJ + } else if s[i:i+sz] == zwnj { + jt = joinZWNJ + } + st = joinStates[st][jt] + if x.isViramaModifier() { + st = joinStates[st][joinVirama] + } + if i += sz; i == len(s) { + break + } + v, sz = trie.lookupString(s[i:]) + x = info(v) + } + if st == stateFAIL || st == stateAfter { + return &labelError{s, "C"} + } + return nil +} + +func ascii(s string) bool { + for i := 0; i < len(s); i++ { + if s[i] >= utf8.RuneSelf { + return false + } + } + return true +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/idna/idna_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/idna/idna_test.go new file mode 100644 index 0000000..0b067ca --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/idna/idna_test.go @@ -0,0 +1,108 @@ +// 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 idna + +import ( + "testing" +) + +var idnaTestCases = [...]struct { + ascii, unicode string +}{ + // Labels. + {"books", "books"}, + {"xn--bcher-kva", "bücher"}, + + // Domains. + {"foo--xn--bar.org", "foo--xn--bar.org"}, + {"golang.org", "golang.org"}, + {"example.xn--p1ai", "example.рф"}, + {"xn--czrw28b.tw", "商業.tw"}, + {"www.xn--mller-kva.de", "www.müller.de"}, +} + +func TestIDNA(t *testing.T) { + for _, tc := range idnaTestCases { + if a, err := ToASCII(tc.unicode); err != nil { + t.Errorf("ToASCII(%q): %v", tc.unicode, err) + } else if a != tc.ascii { + t.Errorf("ToASCII(%q): got %q, want %q", tc.unicode, a, tc.ascii) + } + + if u, err := ToUnicode(tc.ascii); err != nil { + t.Errorf("ToUnicode(%q): %v", tc.ascii, err) + } else if u != tc.unicode { + t.Errorf("ToUnicode(%q): got %q, want %q", tc.ascii, u, tc.unicode) + } + } +} + +func TestIDNASeparators(t *testing.T) { + type subCase struct { + unicode string + wantASCII string + wantErr bool + } + + testCases := []struct { + name string + profile *Profile + subCases []subCase + }{ + { + name: "Punycode", profile: Punycode, + subCases: []subCase{ + {"example\u3002jp", "xn--examplejp-ck3h", false}, + {"東京\uFF0Ejp", "xn--jp-l92cn98g071o", false}, + {"大阪\uFF61jp", "xn--jp-ku9cz72u463f", false}, + }, + }, + { + name: "Lookup", profile: Lookup, + subCases: []subCase{ + {"example\u3002jp", "example.jp", false}, + {"東京\uFF0Ejp", "xn--1lqs71d.jp", false}, + {"大阪\uFF61jp", "xn--pssu33l.jp", false}, + }, + }, + { + name: "Display", profile: Display, + subCases: []subCase{ + {"example\u3002jp", "example.jp", false}, + {"東京\uFF0Ejp", "xn--1lqs71d.jp", false}, + {"大阪\uFF61jp", "xn--pssu33l.jp", false}, + }, + }, + { + name: "Registration", profile: Registration, + subCases: []subCase{ + {"example\u3002jp", "", true}, + {"東京\uFF0Ejp", "", true}, + {"大阪\uFF61jp", "", true}, + }, + }, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + for _, c := range tc.subCases { + gotA, err := tc.profile.ToASCII(c.unicode) + if c.wantErr { + if err == nil { + t.Errorf("ToASCII(%q): got no error, but an error expected", c.unicode) + } + } else { + if err != nil { + t.Errorf("ToASCII(%q): got err=%v, but no error expected", c.unicode, err) + } else if gotA != c.wantASCII { + t.Errorf("ToASCII(%q): got %q, want %q", c.unicode, gotA, c.wantASCII) + } + } + } + }) + } +} + +// TODO(nigeltao): test errors, once we've specified when ToASCII and ToUnicode +// return errors. diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/idna/punycode.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/idna/punycode.go new file mode 100644 index 0000000..02c7d59 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/idna/punycode.go @@ -0,0 +1,203 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +// 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 idna + +// This file implements the Punycode algorithm from RFC 3492. + +import ( + "math" + "strings" + "unicode/utf8" +) + +// These parameter values are specified in section 5. +// +// All computation is done with int32s, so that overflow behavior is identical +// regardless of whether int is 32-bit or 64-bit. +const ( + base int32 = 36 + damp int32 = 700 + initialBias int32 = 72 + initialN int32 = 128 + skew int32 = 38 + tmax int32 = 26 + tmin int32 = 1 +) + +func punyError(s string) error { return &labelError{s, "A3"} } + +// decode decodes a string as specified in section 6.2. +func decode(encoded string) (string, error) { + if encoded == "" { + return "", nil + } + pos := 1 + strings.LastIndex(encoded, "-") + if pos == 1 { + return "", punyError(encoded) + } + if pos == len(encoded) { + return encoded[:len(encoded)-1], nil + } + output := make([]rune, 0, len(encoded)) + if pos != 0 { + for _, r := range encoded[:pos-1] { + output = append(output, r) + } + } + i, n, bias := int32(0), initialN, initialBias + for pos < len(encoded) { + oldI, w := i, int32(1) + for k := base; ; k += base { + if pos == len(encoded) { + return "", punyError(encoded) + } + digit, ok := decodeDigit(encoded[pos]) + if !ok { + return "", punyError(encoded) + } + pos++ + i += digit * w + if i < 0 { + return "", punyError(encoded) + } + t := k - bias + if t < tmin { + t = tmin + } else if t > tmax { + t = tmax + } + if digit < t { + break + } + w *= base - t + if w >= math.MaxInt32/base { + return "", punyError(encoded) + } + } + x := int32(len(output) + 1) + bias = adapt(i-oldI, x, oldI == 0) + n += i / x + i %= x + if n > utf8.MaxRune || len(output) >= 1024 { + return "", punyError(encoded) + } + output = append(output, 0) + copy(output[i+1:], output[i:]) + output[i] = n + i++ + } + return string(output), nil +} + +// encode encodes a string as specified in section 6.3 and prepends prefix to +// the result. +// +// The "while h < length(input)" line in the specification becomes "for +// remaining != 0" in the Go code, because len(s) in Go is in bytes, not runes. +func encode(prefix, s string) (string, error) { + output := make([]byte, len(prefix), len(prefix)+1+2*len(s)) + copy(output, prefix) + delta, n, bias := int32(0), initialN, initialBias + b, remaining := int32(0), int32(0) + for _, r := range s { + if r < 0x80 { + b++ + output = append(output, byte(r)) + } else { + remaining++ + } + } + h := b + if b > 0 { + output = append(output, '-') + } + for remaining != 0 { + m := int32(0x7fffffff) + for _, r := range s { + if m > r && r >= n { + m = r + } + } + delta += (m - n) * (h + 1) + if delta < 0 { + return "", punyError(s) + } + n = m + for _, r := range s { + if r < n { + delta++ + if delta < 0 { + return "", punyError(s) + } + continue + } + if r > n { + continue + } + q := delta + for k := base; ; k += base { + t := k - bias + if t < tmin { + t = tmin + } else if t > tmax { + t = tmax + } + if q < t { + break + } + output = append(output, encodeDigit(t+(q-t)%(base-t))) + q = (q - t) / (base - t) + } + output = append(output, encodeDigit(q)) + bias = adapt(delta, h+1, h == b) + delta = 0 + h++ + remaining-- + } + delta++ + n++ + } + return string(output), nil +} + +func decodeDigit(x byte) (digit int32, ok bool) { + switch { + case '0' <= x && x <= '9': + return int32(x - ('0' - 26)), true + case 'A' <= x && x <= 'Z': + return int32(x - 'A'), true + case 'a' <= x && x <= 'z': + return int32(x - 'a'), true + } + return 0, false +} + +func encodeDigit(digit int32) byte { + switch { + case 0 <= digit && digit < 26: + return byte(digit + 'a') + case 26 <= digit && digit < 36: + return byte(digit + ('0' - 26)) + } + panic("idna: internal error in punycode encoding") +} + +// adapt is the bias adaptation function specified in section 6.1. +func adapt(delta, numPoints int32, firstTime bool) int32 { + if firstTime { + delta /= damp + } else { + delta /= 2 + } + delta += delta / numPoints + k := int32(0) + for delta > ((base-tmin)*tmax)/2 { + delta /= base - tmin + k += base + } + return k + (base-tmin+1)*delta/(delta+skew) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/idna/punycode_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/idna/punycode_test.go new file mode 100644 index 0000000..bfec81d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/idna/punycode_test.go @@ -0,0 +1,198 @@ +// 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 idna + +import ( + "strings" + "testing" +) + +var punycodeTestCases = [...]struct { + s, encoded string +}{ + {"", ""}, + {"-", "--"}, + {"-a", "-a-"}, + {"-a-", "-a--"}, + {"a", "a-"}, + {"a-", "a--"}, + {"a-b", "a-b-"}, + {"books", "books-"}, + {"bücher", "bcher-kva"}, + {"Hello世界", "Hello-ck1hg65u"}, + {"ü", "tda"}, + {"üý", "tdac"}, + + // The test cases below come from RFC 3492 section 7.1 with Errata 3026. + { + // (A) Arabic (Egyptian). + "\u0644\u064A\u0647\u0645\u0627\u0628\u062A\u0643\u0644" + + "\u0645\u0648\u0634\u0639\u0631\u0628\u064A\u061F", + "egbpdaj6bu4bxfgehfvwxn", + }, + { + // (B) Chinese (simplified). + "\u4ED6\u4EEC\u4E3A\u4EC0\u4E48\u4E0D\u8BF4\u4E2D\u6587", + "ihqwcrb4cv8a8dqg056pqjye", + }, + { + // (C) Chinese (traditional). + "\u4ED6\u5011\u7232\u4EC0\u9EBD\u4E0D\u8AAA\u4E2D\u6587", + "ihqwctvzc91f659drss3x8bo0yb", + }, + { + // (D) Czech. + "\u0050\u0072\u006F\u010D\u0070\u0072\u006F\u0073\u0074" + + "\u011B\u006E\u0065\u006D\u006C\u0075\u0076\u00ED\u010D" + + "\u0065\u0073\u006B\u0079", + "Proprostnemluvesky-uyb24dma41a", + }, + { + // (E) Hebrew. + "\u05DC\u05DE\u05D4\u05D4\u05DD\u05E4\u05E9\u05D5\u05D8" + + "\u05DC\u05D0\u05DE\u05D3\u05D1\u05E8\u05D9\u05DD\u05E2" + + "\u05D1\u05E8\u05D9\u05EA", + "4dbcagdahymbxekheh6e0a7fei0b", + }, + { + // (F) Hindi (Devanagari). + "\u092F\u0939\u0932\u094B\u0917\u0939\u093F\u0928\u094D" + + "\u0926\u0940\u0915\u094D\u092F\u094B\u0902\u0928\u0939" + + "\u0940\u0902\u092C\u094B\u0932\u0938\u0915\u0924\u0947" + + "\u0939\u0948\u0902", + "i1baa7eci9glrd9b2ae1bj0hfcgg6iyaf8o0a1dig0cd", + }, + { + // (G) Japanese (kanji and hiragana). + "\u306A\u305C\u307F\u3093\u306A\u65E5\u672C\u8A9E\u3092" + + "\u8A71\u3057\u3066\u304F\u308C\u306A\u3044\u306E\u304B", + "n8jok5ay5dzabd5bym9f0cm5685rrjetr6pdxa", + }, + { + // (H) Korean (Hangul syllables). + "\uC138\uACC4\uC758\uBAA8\uB4E0\uC0AC\uB78C\uB4E4\uC774" + + "\uD55C\uAD6D\uC5B4\uB97C\uC774\uD574\uD55C\uB2E4\uBA74" + + "\uC5BC\uB9C8\uB098\uC88B\uC744\uAE4C", + "989aomsvi5e83db1d2a355cv1e0vak1dwrv93d5xbh15a0dt30a5j" + + "psd879ccm6fea98c", + }, + { + // (I) Russian (Cyrillic). + "\u043F\u043E\u0447\u0435\u043C\u0443\u0436\u0435\u043E" + + "\u043D\u0438\u043D\u0435\u0433\u043E\u0432\u043E\u0440" + + "\u044F\u0442\u043F\u043E\u0440\u0443\u0441\u0441\u043A" + + "\u0438", + "b1abfaaepdrnnbgefbadotcwatmq2g4l", + }, + { + // (J) Spanish. + "\u0050\u006F\u0072\u0071\u0075\u00E9\u006E\u006F\u0070" + + "\u0075\u0065\u0064\u0065\u006E\u0073\u0069\u006D\u0070" + + "\u006C\u0065\u006D\u0065\u006E\u0074\u0065\u0068\u0061" + + "\u0062\u006C\u0061\u0072\u0065\u006E\u0045\u0073\u0070" + + "\u0061\u00F1\u006F\u006C", + "PorqunopuedensimplementehablarenEspaol-fmd56a", + }, + { + // (K) Vietnamese. + "\u0054\u1EA1\u0069\u0073\u0061\u006F\u0068\u1ECD\u006B" + + "\u0068\u00F4\u006E\u0067\u0074\u0068\u1EC3\u0063\u0068" + + "\u1EC9\u006E\u00F3\u0069\u0074\u0069\u1EBF\u006E\u0067" + + "\u0056\u0069\u1EC7\u0074", + "TisaohkhngthchnitingVit-kjcr8268qyxafd2f1b9g", + }, + { + // (L) 3B. + "\u0033\u5E74\u0042\u7D44\u91D1\u516B\u5148\u751F", + "3B-ww4c5e180e575a65lsy2b", + }, + { + // (M) -with-SUPER-MONKEYS. + "\u5B89\u5BA4\u5948\u7F8E\u6075\u002D\u0077\u0069\u0074" + + "\u0068\u002D\u0053\u0055\u0050\u0045\u0052\u002D\u004D" + + "\u004F\u004E\u004B\u0045\u0059\u0053", + "-with-SUPER-MONKEYS-pc58ag80a8qai00g7n9n", + }, + { + // (N) Hello-Another-Way-. + "\u0048\u0065\u006C\u006C\u006F\u002D\u0041\u006E\u006F" + + "\u0074\u0068\u0065\u0072\u002D\u0057\u0061\u0079\u002D" + + "\u305D\u308C\u305E\u308C\u306E\u5834\u6240", + "Hello-Another-Way--fc4qua05auwb3674vfr0b", + }, + { + // (O) 2. + "\u3072\u3068\u3064\u5C4B\u6839\u306E\u4E0B\u0032", + "2-u9tlzr9756bt3uc0v", + }, + { + // (P) MajiKoi5 + "\u004D\u0061\u006A\u0069\u3067\u004B\u006F\u0069\u3059" + + "\u308B\u0035\u79D2\u524D", + "MajiKoi5-783gue6qz075azm5e", + }, + { + // (Q) de + "\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0", + "de-jg4avhby1noc0d", + }, + { + // (R) + "\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067", + "d9juau41awczczp", + }, + { + // (S) -> $1.00 <- + "\u002D\u003E\u0020\u0024\u0031\u002E\u0030\u0030\u0020" + + "\u003C\u002D", + "-> $1.00 <--", + }, +} + +func TestPunycode(t *testing.T) { + for _, tc := range punycodeTestCases { + if got, err := decode(tc.encoded); err != nil { + t.Errorf("decode(%q): %v", tc.encoded, err) + } else if got != tc.s { + t.Errorf("decode(%q): got %q, want %q", tc.encoded, got, tc.s) + } + + if got, err := encode("", tc.s); err != nil { + t.Errorf(`encode("", %q): %v`, tc.s, err) + } else if got != tc.encoded { + t.Errorf(`encode("", %q): got %q, want %q`, tc.s, got, tc.encoded) + } + } +} + +var punycodeErrorTestCases = [...]string{ + "decode -", // A sole '-' is invalid. + "decode foo\x00bar", // '\x00' is not in [0-9A-Za-z]. + "decode foo#bar", // '#' is not in [0-9A-Za-z]. + "decode foo\u00A3bar", // '\u00A3' is not in [0-9A-Za-z]. + "decode 9", // "9a" decodes to codepoint \u00A3; "9" is truncated. + "decode 99999a", // "99999a" decodes to codepoint \U0048A3C1, which is > \U0010FFFF. + "decode 9999999999a", // "9999999999a" overflows the int32 calculation. + + "encode " + strings.Repeat("x", 65536) + "\uff00", // int32 overflow. +} + +func TestPunycodeErrors(t *testing.T) { + for _, tc := range punycodeErrorTestCases { + var err error + switch { + case strings.HasPrefix(tc, "decode "): + _, err = decode(tc[7:]) + case strings.HasPrefix(tc, "encode "): + _, err = encode("", tc[7:]) + } + if err == nil { + if len(tc) > 256 { + tc = tc[:100] + "..." + tc[len(tc)-100:] + } + t.Errorf("no error for %s", tc) + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/idna/tables.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/idna/tables.go new file mode 100644 index 0000000..d281934 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/idna/tables.go @@ -0,0 +1,4477 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +package idna + +// UnicodeVersion is the Unicode version from which the tables in this package are derived. +const UnicodeVersion = "9.0.0" + +var mappings string = "" + // Size: 8176 bytes + "\x00\x01 \x03 ̈\x01a\x03 ̄\x012\x013\x03 ́\x03 ̧\x011\x01o\x051⁄4\x051⁄2" + + "\x053⁄4\x03i̇\x03l·\x03ʼn\x01s\x03dž\x03ⱥ\x03ⱦ\x01h\x01j\x01r\x01w\x01y" + + "\x03 ̆\x03 ̇\x03 ̊\x03 ̨\x03 ̃\x03 ̋\x01l\x01x\x04̈́\x03 ι\x01;\x05 ̈́" + + "\x04եւ\x04اٴ\x04وٴ\x04ۇٴ\x04يٴ\x06क़\x06ख़\x06ग़\x06ज़\x06ड़\x06ढ़\x06फ़" + + "\x06य़\x06ড়\x06ঢ়\x06য়\x06ਲ਼\x06ਸ਼\x06ਖ਼\x06ਗ਼\x06ਜ਼\x06ਫ਼\x06ଡ଼\x06ଢ଼" + + "\x06ํา\x06ໍາ\x06ຫນ\x06ຫມ\x06གྷ\x06ཌྷ\x06དྷ\x06བྷ\x06ཛྷ\x06ཀྵ\x06ཱི\x06ཱུ" + + "\x06ྲྀ\x09ྲཱྀ\x06ླྀ\x09ླཱྀ\x06ཱྀ\x06ྒྷ\x06ྜྷ\x06ྡྷ\x06ྦྷ\x06ྫྷ\x06ྐྵ\x02" + + "в\x02д\x02о\x02с\x02т\x02ъ\x02ѣ\x02æ\x01b\x01d\x01e\x02ǝ\x01g\x01i\x01k" + + "\x01m\x01n\x02ȣ\x01p\x01t\x01u\x02ɐ\x02ɑ\x02ə\x02ɛ\x02ɜ\x02ŋ\x02ɔ\x02ɯ" + + "\x01v\x02β\x02γ\x02δ\x02φ\x02χ\x02ρ\x02н\x02ɒ\x01c\x02ɕ\x02ð\x01f\x02ɟ" + + "\x02ɡ\x02ɥ\x02ɨ\x02ɩ\x02ɪ\x02ʝ\x02ɭ\x02ʟ\x02ɱ\x02ɰ\x02ɲ\x02ɳ\x02ɴ\x02ɵ" + + "\x02ɸ\x02ʂ\x02ʃ\x02ƫ\x02ʉ\x02ʊ\x02ʋ\x02ʌ\x01z\x02ʐ\x02ʑ\x02ʒ\x02θ\x02ss" + + "\x02ά\x02έ\x02ή\x02ί\x02ό\x02ύ\x02ώ\x05ἀι\x05ἁι\x05ἂι\x05ἃι\x05ἄι\x05ἅι" + + "\x05ἆι\x05ἇι\x05ἠι\x05ἡι\x05ἢι\x05ἣι\x05ἤι\x05ἥι\x05ἦι\x05ἧι\x05ὠι\x05ὡι" + + "\x05ὢι\x05ὣι\x05ὤι\x05ὥι\x05ὦι\x05ὧι\x05ὰι\x04αι\x04άι\x05ᾶι\x02ι\x05 ̈͂" + + "\x05ὴι\x04ηι\x04ήι\x05ῆι\x05 ̓̀\x05 ̓́\x05 ̓͂\x02ΐ\x05 ̔̀\x05 ̔́\x05 ̔͂" + + "\x02ΰ\x05 ̈̀\x01`\x05ὼι\x04ωι\x04ώι\x05ῶι\x06′′\x09′′′\x06‵‵\x09‵‵‵\x02!" + + "!\x02??\x02?!\x02!?\x0c′′′′\x010\x014\x015\x016\x017\x018\x019\x01+\x01=" + + "\x01(\x01)\x02rs\x02ħ\x02no\x01q\x02sm\x02tm\x02ω\x02å\x02א\x02ב\x02ג" + + "\x02ד\x02π\x051⁄7\x051⁄9\x061⁄10\x051⁄3\x052⁄3\x051⁄5\x052⁄5\x053⁄5\x054" + + "⁄5\x051⁄6\x055⁄6\x051⁄8\x053⁄8\x055⁄8\x057⁄8\x041⁄\x02ii\x02iv\x02vi" + + "\x04viii\x02ix\x02xi\x050⁄3\x06∫∫\x09∫∫∫\x06∮∮\x09∮∮∮\x0210\x0211\x0212" + + "\x0213\x0214\x0215\x0216\x0217\x0218\x0219\x0220\x04(10)\x04(11)\x04(12)" + + "\x04(13)\x04(14)\x04(15)\x04(16)\x04(17)\x04(18)\x04(19)\x04(20)\x0c∫∫∫∫" + + "\x02==\x05⫝̸\x02ɫ\x02ɽ\x02ȿ\x02ɀ\x01.\x04 ゙\x04 ゚\x06より\x06コト\x05(ᄀ)\x05" + + "(ᄂ)\x05(ᄃ)\x05(ᄅ)\x05(ᄆ)\x05(ᄇ)\x05(ᄉ)\x05(ᄋ)\x05(ᄌ)\x05(ᄎ)\x05(ᄏ)\x05(ᄐ" + + ")\x05(ᄑ)\x05(ᄒ)\x05(가)\x05(나)\x05(다)\x05(라)\x05(마)\x05(바)\x05(사)\x05(아)" + + "\x05(자)\x05(차)\x05(카)\x05(타)\x05(파)\x05(하)\x05(주)\x08(오전)\x08(오후)\x05(一)" + + "\x05(二)\x05(三)\x05(四)\x05(五)\x05(六)\x05(七)\x05(八)\x05(九)\x05(十)\x05(月)" + + "\x05(火)\x05(水)\x05(木)\x05(金)\x05(土)\x05(日)\x05(株)\x05(有)\x05(社)\x05(名)" + + "\x05(特)\x05(財)\x05(祝)\x05(労)\x05(代)\x05(呼)\x05(学)\x05(監)\x05(企)\x05(資)" + + "\x05(協)\x05(祭)\x05(休)\x05(自)\x05(至)\x0221\x0222\x0223\x0224\x0225\x0226" + + "\x0227\x0228\x0229\x0230\x0231\x0232\x0233\x0234\x0235\x06참고\x06주의\x0236" + + "\x0237\x0238\x0239\x0240\x0241\x0242\x0243\x0244\x0245\x0246\x0247\x0248" + + "\x0249\x0250\x041月\x042月\x043月\x044月\x045月\x046月\x047月\x048月\x049月\x0510" + + "月\x0511月\x0512月\x02hg\x02ev\x0cアパート\x0cアルファ\x0cアンペア\x09アール\x0cイニング\x09" + + "インチ\x09ウォン\x0fエスクード\x0cエーカー\x09オンス\x09オーム\x09カイリ\x0cカラット\x0cカロリー\x09ガロ" + + "ン\x09ガンマ\x06ギガ\x09ギニー\x0cキュリー\x0cギルダー\x06キロ\x0fキログラム\x12キロメートル\x0fキロワッ" + + "ト\x09グラム\x0fグラムトン\x0fクルゼイロ\x0cクローネ\x09ケース\x09コルナ\x09コーポ\x0cサイクル\x0fサンチ" + + "ーム\x0cシリング\x09センチ\x09セント\x09ダース\x06デシ\x06ドル\x06トン\x06ナノ\x09ノット\x09ハイツ" + + "\x0fパーセント\x09パーツ\x0cバーレル\x0fピアストル\x09ピクル\x06ピコ\x06ビル\x0fファラッド\x0cフィート" + + "\x0fブッシェル\x09フラン\x0fヘクタール\x06ペソ\x09ペニヒ\x09ヘルツ\x09ペンス\x09ページ\x09ベータ\x0cポイ" + + "ント\x09ボルト\x06ホン\x09ポンド\x09ホール\x09ホーン\x0cマイクロ\x09マイル\x09マッハ\x09マルク\x0fマ" + + "ンション\x0cミクロン\x06ミリ\x0fミリバール\x06メガ\x0cメガトン\x0cメートル\x09ヤード\x09ヤール\x09ユアン" + + "\x0cリットル\x06リラ\x09ルピー\x0cルーブル\x06レム\x0fレントゲン\x09ワット\x040点\x041点\x042点" + + "\x043点\x044点\x045点\x046点\x047点\x048点\x049点\x0510点\x0511点\x0512点\x0513点" + + "\x0514点\x0515点\x0516点\x0517点\x0518点\x0519点\x0520点\x0521点\x0522点\x0523点" + + "\x0524点\x02da\x02au\x02ov\x02pc\x02dm\x02iu\x06平成\x06昭和\x06大正\x06明治\x0c株" + + "式会社\x02pa\x02na\x02ma\x02ka\x02kb\x02mb\x02gb\x04kcal\x02pf\x02nf\x02m" + + "g\x02kg\x02hz\x02ml\x02dl\x02kl\x02fm\x02nm\x02mm\x02cm\x02km\x02m2\x02m" + + "3\x05m∕s\x06m∕s2\x07rad∕s\x08rad∕s2\x02ps\x02ns\x02ms\x02pv\x02nv\x02mv" + + "\x02kv\x02pw\x02nw\x02mw\x02kw\x02bq\x02cc\x02cd\x06c∕kg\x02db\x02gy\x02" + + "ha\x02hp\x02in\x02kk\x02kt\x02lm\x02ln\x02lx\x02ph\x02pr\x02sr\x02sv\x02" + + "wb\x05v∕m\x05a∕m\x041日\x042日\x043日\x044日\x045日\x046日\x047日\x048日\x049日" + + "\x0510日\x0511日\x0512日\x0513日\x0514日\x0515日\x0516日\x0517日\x0518日\x0519日" + + "\x0520日\x0521日\x0522日\x0523日\x0524日\x0525日\x0526日\x0527日\x0528日\x0529日" + + "\x0530日\x0531日\x02ь\x02ɦ\x02ɬ\x02ʞ\x02ʇ\x02œ\x04𤋮\x04𢡊\x04𢡄\x04𣏕\x04𥉉" + + "\x04𥳐\x04𧻓\x02ff\x02fi\x02fl\x02st\x04մն\x04մե\x04մի\x04վն\x04մխ\x04יִ" + + "\x04ײַ\x02ע\x02ה\x02כ\x02ל\x02ם\x02ר\x02ת\x04שׁ\x04שׂ\x06שּׁ\x06שּׂ\x04א" + + "ַ\x04אָ\x04אּ\x04בּ\x04גּ\x04דּ\x04הּ\x04וּ\x04זּ\x04טּ\x04יּ\x04ךּ\x04" + + "כּ\x04לּ\x04מּ\x04נּ\x04סּ\x04ףּ\x04פּ\x04צּ\x04קּ\x04רּ\x04שּ\x04תּ" + + "\x04וֹ\x04בֿ\x04כֿ\x04פֿ\x04אל\x02ٱ\x02ٻ\x02پ\x02ڀ\x02ٺ\x02ٿ\x02ٹ\x02ڤ" + + "\x02ڦ\x02ڄ\x02ڃ\x02چ\x02ڇ\x02ڍ\x02ڌ\x02ڎ\x02ڈ\x02ژ\x02ڑ\x02ک\x02گ\x02ڳ" + + "\x02ڱ\x02ں\x02ڻ\x02ۀ\x02ہ\x02ھ\x02ے\x02ۓ\x02ڭ\x02ۇ\x02ۆ\x02ۈ\x02ۋ\x02ۅ" + + "\x02ۉ\x02ې\x02ى\x04ئا\x04ئە\x04ئو\x04ئۇ\x04ئۆ\x04ئۈ\x04ئې\x04ئى\x02ی\x04" + + "ئج\x04ئح\x04ئم\x04ئي\x04بج\x04بح\x04بخ\x04بم\x04بى\x04بي\x04تج\x04تح" + + "\x04تخ\x04تم\x04تى\x04تي\x04ثج\x04ثم\x04ثى\x04ثي\x04جح\x04جم\x04حج\x04حم" + + "\x04خج\x04خح\x04خم\x04سج\x04سح\x04سخ\x04سم\x04صح\x04صم\x04ضج\x04ضح\x04ضخ" + + "\x04ضم\x04طح\x04طم\x04ظم\x04عج\x04عم\x04غج\x04غم\x04فج\x04فح\x04فخ\x04فم" + + "\x04فى\x04في\x04قح\x04قم\x04قى\x04قي\x04كا\x04كج\x04كح\x04كخ\x04كل\x04كم" + + "\x04كى\x04كي\x04لج\x04لح\x04لخ\x04لم\x04لى\x04لي\x04مج\x04مح\x04مخ\x04مم" + + "\x04مى\x04مي\x04نج\x04نح\x04نخ\x04نم\x04نى\x04ني\x04هج\x04هم\x04هى\x04هي" + + "\x04يج\x04يح\x04يخ\x04يم\x04يى\x04يي\x04ذٰ\x04رٰ\x04ىٰ\x05 ٌّ\x05 ٍّ\x05" + + " َّ\x05 ُّ\x05 ِّ\x05 ّٰ\x04ئر\x04ئز\x04ئن\x04بر\x04بز\x04بن\x04تر\x04تز" + + "\x04تن\x04ثر\x04ثز\x04ثن\x04ما\x04نر\x04نز\x04نن\x04ير\x04يز\x04ين\x04ئخ" + + "\x04ئه\x04به\x04ته\x04صخ\x04له\x04نه\x04هٰ\x04يه\x04ثه\x04سه\x04شم\x04شه" + + "\x06ـَّ\x06ـُّ\x06ـِّ\x04طى\x04طي\x04عى\x04عي\x04غى\x04غي\x04سى\x04سي" + + "\x04شى\x04شي\x04حى\x04حي\x04جى\x04جي\x04خى\x04خي\x04صى\x04صي\x04ضى\x04ضي" + + "\x04شج\x04شح\x04شخ\x04شر\x04سر\x04صر\x04ضر\x04اً\x06تجم\x06تحج\x06تحم" + + "\x06تخم\x06تمج\x06تمح\x06تمخ\x06جمح\x06حمي\x06حمى\x06سحج\x06سجح\x06سجى" + + "\x06سمح\x06سمج\x06سمم\x06صحح\x06صمم\x06شحم\x06شجي\x06شمخ\x06شمم\x06ضحى" + + "\x06ضخم\x06طمح\x06طمم\x06طمي\x06عجم\x06عمم\x06عمى\x06غمم\x06غمي\x06غمى" + + "\x06فخم\x06قمح\x06قمم\x06لحم\x06لحي\x06لحى\x06لجج\x06لخم\x06لمح\x06محج" + + "\x06محم\x06محي\x06مجح\x06مجم\x06مخج\x06مخم\x06مجخ\x06همج\x06همم\x06نحم" + + "\x06نحى\x06نجم\x06نجى\x06نمي\x06نمى\x06يمم\x06بخي\x06تجي\x06تجى\x06تخي" + + "\x06تخى\x06تمي\x06تمى\x06جمي\x06جحى\x06جمى\x06سخى\x06صحي\x06شحي\x06ضحي" + + "\x06لجي\x06لمي\x06يحي\x06يجي\x06يمي\x06ممي\x06قمي\x06نحي\x06عمي\x06كمي" + + "\x06نجح\x06مخي\x06لجم\x06كمم\x06جحي\x06حجي\x06مجي\x06فمي\x06بحي\x06سخي" + + "\x06نجي\x06صلے\x06قلے\x08الله\x08اكبر\x08محمد\x08صلعم\x08رسول\x08عليه" + + "\x08وسلم\x06صلى!صلى الله عليه وسلم\x0fجل جلاله\x08ریال\x01,\x01:\x01!" + + "\x01?\x01_\x01{\x01}\x01[\x01]\x01#\x01&\x01*\x01-\x01<\x01>\x01\\\x01$" + + "\x01%\x01@\x04ـً\x04ـَ\x04ـُ\x04ـِ\x04ـّ\x04ـْ\x02ء\x02آ\x02أ\x02ؤ\x02إ" + + "\x02ئ\x02ا\x02ب\x02ة\x02ت\x02ث\x02ج\x02ح\x02خ\x02د\x02ذ\x02ر\x02ز\x02س" + + "\x02ش\x02ص\x02ض\x02ط\x02ظ\x02ع\x02غ\x02ف\x02ق\x02ك\x02ل\x02م\x02ن\x02ه" + + "\x02و\x02ي\x04لآ\x04لأ\x04لإ\x04لا\x01\x22\x01'\x01/\x01^\x01|\x01~\x02¢" + + "\x02£\x02¬\x02¦\x02¥\x08𝅗𝅥\x08𝅘𝅥\x0c𝅘𝅥𝅮\x0c𝅘𝅥𝅯\x0c𝅘𝅥𝅰\x0c𝅘𝅥𝅱\x0c𝅘𝅥𝅲\x08𝆹" + + "𝅥\x08𝆺𝅥\x0c𝆹𝅥𝅮\x0c𝆺𝅥𝅮\x0c𝆹𝅥𝅯\x0c𝆺𝅥𝅯\x02ı\x02ȷ\x02α\x02ε\x02ζ\x02η\x02" + + "κ\x02λ\x02μ\x02ν\x02ξ\x02ο\x02σ\x02τ\x02υ\x02ψ\x03∇\x03∂\x02ϝ\x02ٮ\x02ڡ" + + "\x02ٯ\x020,\x021,\x022,\x023,\x024,\x025,\x026,\x027,\x028,\x029,\x03(a)" + + "\x03(b)\x03(c)\x03(d)\x03(e)\x03(f)\x03(g)\x03(h)\x03(i)\x03(j)\x03(k)" + + "\x03(l)\x03(m)\x03(n)\x03(o)\x03(p)\x03(q)\x03(r)\x03(s)\x03(t)\x03(u)" + + "\x03(v)\x03(w)\x03(x)\x03(y)\x03(z)\x07〔s〕\x02wz\x02hv\x02sd\x03ppv\x02w" + + "c\x02mc\x02md\x02dj\x06ほか\x06ココ\x03サ\x03手\x03字\x03双\x03デ\x03二\x03多\x03解" + + "\x03天\x03交\x03映\x03無\x03料\x03前\x03後\x03再\x03新\x03初\x03終\x03生\x03販\x03声" + + "\x03吹\x03演\x03投\x03捕\x03一\x03三\x03遊\x03左\x03中\x03右\x03指\x03走\x03打\x03禁" + + "\x03空\x03合\x03満\x03有\x03月\x03申\x03割\x03営\x03配\x09〔本〕\x09〔三〕\x09〔二〕\x09〔安" + + "〕\x09〔点〕\x09〔打〕\x09〔盗〕\x09〔勝〕\x09〔敗〕\x03得\x03可\x03丽\x03丸\x03乁\x03你\x03" + + "侮\x03侻\x03倂\x03偺\x03備\x03僧\x03像\x03㒞\x03免\x03兔\x03兤\x03具\x03㒹\x03內\x03" + + "冗\x03冤\x03仌\x03冬\x03况\x03凵\x03刃\x03㓟\x03刻\x03剆\x03剷\x03㔕\x03勇\x03勉\x03" + + "勤\x03勺\x03包\x03匆\x03北\x03卉\x03卑\x03博\x03即\x03卽\x03卿\x03灰\x03及\x03叟\x03" + + "叫\x03叱\x03吆\x03咞\x03吸\x03呈\x03周\x03咢\x03哶\x03唐\x03啓\x03啣\x03善\x03喙\x03" + + "喫\x03喳\x03嗂\x03圖\x03嘆\x03圗\x03噑\x03噴\x03切\x03壮\x03城\x03埴\x03堍\x03型\x03" + + "堲\x03報\x03墬\x03売\x03壷\x03夆\x03夢\x03奢\x03姬\x03娛\x03娧\x03姘\x03婦\x03㛮\x03" + + "嬈\x03嬾\x03寃\x03寘\x03寧\x03寳\x03寿\x03将\x03尢\x03㞁\x03屠\x03屮\x03峀\x03岍\x03" + + "嵃\x03嵮\x03嵫\x03嵼\x03巡\x03巢\x03㠯\x03巽\x03帨\x03帽\x03幩\x03㡢\x03㡼\x03庰\x03" + + "庳\x03庶\x03廊\x03廾\x03舁\x03弢\x03㣇\x03形\x03彫\x03㣣\x03徚\x03忍\x03志\x03忹\x03" + + "悁\x03㤺\x03㤜\x03悔\x03惇\x03慈\x03慌\x03慎\x03慺\x03憎\x03憲\x03憤\x03憯\x03懞\x03" + + "懲\x03懶\x03成\x03戛\x03扝\x03抱\x03拔\x03捐\x03挽\x03拼\x03捨\x03掃\x03揤\x03搢\x03" + + "揅\x03掩\x03㨮\x03摩\x03摾\x03撝\x03摷\x03㩬\x03敏\x03敬\x03旣\x03書\x03晉\x03㬙\x03" + + "暑\x03㬈\x03㫤\x03冒\x03冕\x03最\x03暜\x03肭\x03䏙\x03朗\x03望\x03朡\x03杞\x03杓\x03" + + "㭉\x03柺\x03枅\x03桒\x03梅\x03梎\x03栟\x03椔\x03㮝\x03楂\x03榣\x03槪\x03檨\x03櫛\x03" + + "㰘\x03次\x03歔\x03㱎\x03歲\x03殟\x03殺\x03殻\x03汎\x03沿\x03泍\x03汧\x03洖\x03派\x03" + + "海\x03流\x03浩\x03浸\x03涅\x03洴\x03港\x03湮\x03㴳\x03滋\x03滇\x03淹\x03潮\x03濆\x03" + + "瀹\x03瀞\x03瀛\x03㶖\x03灊\x03災\x03灷\x03炭\x03煅\x03熜\x03爨\x03爵\x03牐\x03犀\x03" + + "犕\x03獺\x03王\x03㺬\x03玥\x03㺸\x03瑇\x03瑜\x03瑱\x03璅\x03瓊\x03㼛\x03甤\x03甾\x03" + + "異\x03瘐\x03㿼\x03䀈\x03直\x03眞\x03真\x03睊\x03䀹\x03瞋\x03䁆\x03䂖\x03硎\x03碌\x03" + + "磌\x03䃣\x03祖\x03福\x03秫\x03䄯\x03穀\x03穊\x03穏\x03䈂\x03篆\x03築\x03䈧\x03糒\x03" + + "䊠\x03糨\x03糣\x03紀\x03絣\x03䌁\x03緇\x03縂\x03繅\x03䌴\x03䍙\x03罺\x03羕\x03翺\x03" + + "者\x03聠\x03聰\x03䏕\x03育\x03脃\x03䐋\x03脾\x03媵\x03舄\x03辞\x03䑫\x03芑\x03芋\x03" + + "芝\x03劳\x03花\x03芳\x03芽\x03苦\x03若\x03茝\x03荣\x03莭\x03茣\x03莽\x03菧\x03著\x03" + + "荓\x03菊\x03菌\x03菜\x03䔫\x03蓱\x03蓳\x03蔖\x03蕤\x03䕝\x03䕡\x03䕫\x03虐\x03虜\x03" + + "虧\x03虩\x03蚩\x03蚈\x03蜎\x03蛢\x03蝹\x03蜨\x03蝫\x03螆\x03蟡\x03蠁\x03䗹\x03衠\x03" + + "衣\x03裗\x03裞\x03䘵\x03裺\x03㒻\x03䚾\x03䛇\x03誠\x03諭\x03變\x03豕\x03貫\x03賁\x03" + + "贛\x03起\x03跋\x03趼\x03跰\x03軔\x03輸\x03邔\x03郱\x03鄑\x03鄛\x03鈸\x03鋗\x03鋘\x03" + + "鉼\x03鏹\x03鐕\x03開\x03䦕\x03閷\x03䧦\x03雃\x03嶲\x03霣\x03䩮\x03䩶\x03韠\x03䪲\x03" + + "頋\x03頩\x03飢\x03䬳\x03餩\x03馧\x03駂\x03駾\x03䯎\x03鬒\x03鱀\x03鳽\x03䳎\x03䳭\x03" + + "鵧\x03䳸\x03麻\x03䵖\x03黹\x03黾\x03鼅\x03鼏\x03鼖\x03鼻" + +var xorData string = "" + // Size: 4855 bytes + "\x02\x0c\x09\x02\xb0\xec\x02\xad\xd8\x02\xad\xd9\x02\x06\x07\x02\x0f\x12" + + "\x02\x0f\x1f\x02\x0f\x1d\x02\x01\x13\x02\x0f\x16\x02\x0f\x0b\x02\x0f3" + + "\x02\x0f7\x02\x0f?\x02\x0f/\x02\x0f*\x02\x0c&\x02\x0c*\x02\x0c;\x02\x0c9" + + "\x02\x0c%\x02\xab\xed\x02\xab\xe2\x02\xab\xe3\x02\xa9\xe0\x02\xa9\xe1" + + "\x02\xa9\xe6\x02\xa3\xcb\x02\xa3\xc8\x02\xa3\xc9\x02\x01#\x02\x01\x08" + + "\x02\x0e>\x02\x0e'\x02\x0f\x03\x02\x03\x0d\x02\x03\x09\x02\x03\x17\x02" + + "\x03\x0e\x02\x02\x03\x02\x011\x02\x01\x00\x02\x01\x10\x02\x03<\x02\x07" + + "\x0d\x02\x02\x0c\x02\x0c0\x02\x01\x03\x02\x01\x01\x02\x01 \x02\x01\x22" + + "\x02\x01)\x02\x01\x0a\x02\x01\x0c\x02\x02\x06\x02\x02\x02\x02\x03\x10" + + "\x03\x037 \x03\x0b+\x03\x02\x01\x04\x02\x01\x02\x02\x019\x02\x03\x1c\x02" + + "\x02$\x03\x80p$\x02\x03:\x02\x03\x0a\x03\xc1r.\x03\xc1r,\x03\xc1r\x02" + + "\x02\x02:\x02\x02>\x02\x02,\x02\x02\x10\x02\x02\x00\x03\xc1s<\x03\xc1s*" + + "\x03\xc2L$\x03\xc2L;\x02\x09)\x02\x0a\x19\x03\x83\xab\xe3\x03\x83\xab" + + "\xf2\x03 4\xe0\x03\x81\xab\xea\x03\x81\xab\xf3\x03 4\xef\x03\x96\xe1\xcd" + + "\x03\x84\xe5\xc3\x02\x0d\x11\x03\x8b\xec\xcb\x03\x94\xec\xcf\x03\x9a\xec" + + "\xc2\x03\x8b\xec\xdb\x03\x94\xec\xdf\x03\x9a\xec\xd2\x03\x01\x0c!\x03" + + "\x01\x0c#\x03ʠ\x9d\x03ʣ\x9c\x03ʢ\x9f\x03ʥ\x9e\x03ʤ\x91\x03ʧ\x90\x03ʦ\x93" + + "\x03ʩ\x92\x03ʨ\x95\x03\xca\xf3\xb5\x03\xca\xf0\xb4\x03\xca\xf1\xb7\x03" + + "\xca\xf6\xb6\x03\xca\xf7\x89\x03\xca\xf4\x88\x03\xca\xf5\x8b\x03\xca\xfa" + + "\x8a\x03\xca\xfb\x8d\x03\xca\xf8\x8c\x03\xca\xf9\x8f\x03\xca\xfe\x8e\x03" + + "\xca\xff\x81\x03\xca\xfc\x80\x03\xca\xfd\x83\x03\xca\xe2\x82\x03\xca\xe3" + + "\x85\x03\xca\xe0\x84\x03\xca\xe1\x87\x03\xca\xe6\x86\x03\xca\xe7\x99\x03" + + "\xca\xe4\x98\x03\xca\xe5\x9b\x03\xca\xea\x9a\x03\xca\xeb\x9d\x03\xca\xe8" + + "\x9c\x03ؓ\x89\x03ߔ\x8b\x02\x010\x03\x03\x04\x1e\x03\x04\x15\x12\x03\x0b" + + "\x05,\x03\x06\x04\x00\x03\x06\x04)\x03\x06\x044\x03\x06\x04<\x03\x06\x05" + + "\x1d\x03\x06\x06\x00\x03\x06\x06\x0a\x03\x06\x06'\x03\x06\x062\x03\x0786" + + "\x03\x079/\x03\x079 \x03\x07:\x0e\x03\x07:\x1b\x03\x07:%\x03\x07;/\x03" + + "\x07;%\x03\x074\x11\x03\x076\x09\x03\x077*\x03\x070\x01\x03\x070\x0f\x03" + + "\x070.\x03\x071\x16\x03\x071\x04\x03\x0710\x03\x072\x18\x03\x072-\x03" + + "\x073\x14\x03\x073>\x03\x07'\x09\x03\x07 \x00\x03\x07\x1f\x0b\x03\x07" + + "\x18#\x03\x07\x18(\x03\x07\x186\x03\x07\x18\x03\x03\x07\x19\x16\x03\x07" + + "\x116\x03\x07\x12'\x03\x07\x13\x10\x03\x07\x0c&\x03\x07\x0c\x08\x03\x07" + + "\x0c\x13\x03\x07\x0d\x02\x03\x07\x0d\x1c\x03\x07\x0b5\x03\x07\x0b\x0a" + + "\x03\x07\x0b\x01\x03\x07\x0b\x0f\x03\x07\x05\x00\x03\x07\x05\x09\x03\x07" + + "\x05\x0b\x03\x07\x07\x01\x03\x07\x07\x08\x03\x07\x00<\x03\x07\x00+\x03" + + "\x07\x01)\x03\x07\x01\x1b\x03\x07\x01\x08\x03\x07\x03?\x03\x0445\x03\x04" + + "4\x08\x03\x0454\x03\x04)/\x03\x04)5\x03\x04+\x05\x03\x04+\x14\x03\x04+ " + + "\x03\x04+<\x03\x04*&\x03\x04*\x22\x03\x04&8\x03\x04!\x01\x03\x04!\x22" + + "\x03\x04\x11+\x03\x04\x10.\x03\x04\x104\x03\x04\x13=\x03\x04\x12\x04\x03" + + "\x04\x12\x0a\x03\x04\x0d\x1d\x03\x04\x0d\x07\x03\x04\x0d \x03\x05<>\x03" + + "\x055<\x03\x055!\x03\x055#\x03\x055&\x03\x054\x1d\x03\x054\x02\x03\x054" + + "\x07\x03\x0571\x03\x053\x1a\x03\x053\x16\x03\x05.<\x03\x05.\x07\x03\x05)" + + ":\x03\x05)<\x03\x05)\x0c\x03\x05)\x15\x03\x05+-\x03\x05+5\x03\x05$\x1e" + + "\x03\x05$\x14\x03\x05'\x04\x03\x05'\x14\x03\x05&\x02\x03\x05\x226\x03" + + "\x05\x22\x0c\x03\x05\x22\x1c\x03\x05\x19\x0a\x03\x05\x1b\x09\x03\x05\x1b" + + "\x0c\x03\x05\x14\x07\x03\x05\x16?\x03\x05\x16\x0c\x03\x05\x0c\x05\x03" + + "\x05\x0e\x0f\x03\x05\x01\x0e\x03\x05\x00(\x03\x05\x030\x03\x05\x03\x06" + + "\x03\x0a==\x03\x0a=1\x03\x0a=,\x03\x0a=\x0c\x03\x0a??\x03\x0a<\x08\x03" + + "\x0a9!\x03\x0a9)\x03\x0a97\x03\x0a99\x03\x0a6\x0a\x03\x0a6\x1c\x03\x0a6" + + "\x17\x03\x0a7'\x03\x0a78\x03\x0a73\x03\x0a'\x01\x03\x0a'&\x03\x0a\x1f" + + "\x0e\x03\x0a\x1f\x03\x03\x0a\x1f3\x03\x0a\x1b/\x03\x0a\x18\x19\x03\x0a" + + "\x19\x01\x03\x0a\x16\x14\x03\x0a\x0e\x22\x03\x0a\x0f\x10\x03\x0a\x0f\x02" + + "\x03\x0a\x0f \x03\x0a\x0c\x04\x03\x0a\x0b>\x03\x0a\x0b+\x03\x0a\x08/\x03" + + "\x0a\x046\x03\x0a\x05\x14\x03\x0a\x00\x04\x03\x0a\x00\x10\x03\x0a\x00" + + "\x14\x03\x0b<3\x03\x0b;*\x03\x0b9\x22\x03\x0b9)\x03\x0b97\x03\x0b+\x10" + + "\x03\x0b((\x03\x0b&5\x03\x0b$\x1c\x03\x0b$\x12\x03\x0b%\x04\x03\x0b#<" + + "\x03\x0b#0\x03\x0b#\x0d\x03\x0b#\x19\x03\x0b!:\x03\x0b!\x1f\x03\x0b!\x00" + + "\x03\x0b\x1e5\x03\x0b\x1c\x1d\x03\x0b\x1d-\x03\x0b\x1d(\x03\x0b\x18.\x03" + + "\x0b\x18 \x03\x0b\x18\x16\x03\x0b\x14\x13\x03\x0b\x15$\x03\x0b\x15\x22" + + "\x03\x0b\x12\x1b\x03\x0b\x12\x10\x03\x0b\x132\x03\x0b\x13=\x03\x0b\x12" + + "\x18\x03\x0b\x0c&\x03\x0b\x061\x03\x0b\x06:\x03\x0b\x05#\x03\x0b\x05<" + + "\x03\x0b\x04\x0b\x03\x0b\x04\x04\x03\x0b\x04\x1b\x03\x0b\x042\x03\x0b" + + "\x041\x03\x0b\x03\x03\x03\x0b\x03\x1d\x03\x0b\x03/\x03\x0b\x03+\x03\x0b" + + "\x02\x1b\x03\x0b\x02\x00\x03\x0b\x01\x1e\x03\x0b\x01\x08\x03\x0b\x015" + + "\x03\x06\x0d9\x03\x06\x0d=\x03\x06\x0d?\x03\x02\x001\x03\x02\x003\x03" + + "\x02\x02\x19\x03\x02\x006\x03\x02\x02\x1b\x03\x02\x004\x03\x02\x00<\x03" + + "\x02\x02\x0a\x03\x02\x02\x0e\x03\x02\x01\x1a\x03\x02\x01\x07\x03\x02\x01" + + "\x05\x03\x02\x01\x0b\x03\x02\x01%\x03\x02\x01\x0c\x03\x02\x01\x04\x03" + + "\x02\x01\x1c\x03\x02\x00.\x03\x02\x002\x03\x02\x00>\x03\x02\x00\x12\x03" + + "\x02\x00\x16\x03\x02\x011\x03\x02\x013\x03\x02\x02 \x03\x02\x02%\x03\x02" + + "\x02$\x03\x02\x028\x03\x02\x02;\x03\x02\x024\x03\x02\x012\x03\x02\x022" + + "\x03\x02\x02/\x03\x02\x01,\x03\x02\x01\x13\x03\x02\x01\x16\x03\x02\x01" + + "\x11\x03\x02\x01\x1e\x03\x02\x01\x15\x03\x02\x01\x17\x03\x02\x01\x0f\x03" + + "\x02\x01\x08\x03\x02\x00?\x03\x02\x03\x07\x03\x02\x03\x0d\x03\x02\x03" + + "\x13\x03\x02\x03\x1d\x03\x02\x03\x1f\x03\x02\x00\x03\x03\x02\x00\x0d\x03" + + "\x02\x00\x01\x03\x02\x00\x1b\x03\x02\x00\x19\x03\x02\x00\x18\x03\x02\x00" + + "\x13\x03\x02\x00/\x03\x07>\x12\x03\x07<\x1f\x03\x07>\x1d\x03\x06\x1d\x0e" + + "\x03\x07>\x1c\x03\x07>:\x03\x07>\x13\x03\x04\x12+\x03\x07?\x03\x03\x07>" + + "\x02\x03\x06\x224\x03\x06\x1a.\x03\x07<%\x03\x06\x1c\x0b\x03\x0609\x03" + + "\x05\x1f\x01\x03\x04'\x08\x03\x93\xfd\xf5\x03\x02\x0d \x03\x02\x0d#\x03" + + "\x02\x0d!\x03\x02\x0d&\x03\x02\x0d\x22\x03\x02\x0d/\x03\x02\x0d,\x03\x02" + + "\x0d$\x03\x02\x0d'\x03\x02\x0d%\x03\x02\x0d;\x03\x02\x0d=\x03\x02\x0d?" + + "\x03\x099.\x03\x08\x0b7\x03\x08\x02\x14\x03\x08\x14\x0d\x03\x08.:\x03" + + "\x089'\x03\x0f\x0b\x18\x03\x0f\x1c1\x03\x0f\x17&\x03\x0f9\x1f\x03\x0f0" + + "\x0c\x03\x0e\x0a9\x03\x0e\x056\x03\x0e\x1c#\x03\x0f\x13\x0e\x03\x072\x00" + + "\x03\x070\x0d\x03\x072\x0b\x03\x06\x11\x18\x03\x070\x10\x03\x06\x0f(\x03" + + "\x072\x05\x03\x06\x0f,\x03\x073\x15\x03\x06\x07\x08\x03\x05\x16\x02\x03" + + "\x04\x0b \x03\x05:8\x03\x05\x16%\x03\x0a\x0d\x1f\x03\x06\x16\x10\x03\x05" + + "\x1d5\x03\x05*;\x03\x05\x16\x1b\x03\x04.-\x03\x06\x1a\x19\x03\x04\x03," + + "\x03\x0b87\x03\x04/\x0a\x03\x06\x00,\x03\x04-\x01\x03\x04\x1e-\x03\x06/(" + + "\x03\x0a\x0b5\x03\x06\x0e7\x03\x06\x07.\x03\x0597\x03\x0a*%\x03\x0760" + + "\x03\x06\x0c;\x03\x05'\x00\x03\x072.\x03\x072\x08\x03\x06=\x01\x03\x06" + + "\x05\x1b\x03\x06\x06\x12\x03\x06$=\x03\x06'\x0d\x03\x04\x11\x0f\x03\x076" + + ",\x03\x06\x07;\x03\x06.,\x03\x86\xf9\xea\x03\x8f\xff\xeb\x02\x092\x02" + + "\x095\x02\x094\x02\x09;\x02\x09>\x02\x098\x02\x09*\x02\x09/\x02\x09,\x02" + + "\x09%\x02\x09&\x02\x09#\x02\x09 \x02\x08!\x02\x08%\x02\x08$\x02\x08+\x02" + + "\x08.\x02\x08*\x02\x08&\x02\x088\x02\x08>\x02\x084\x02\x086\x02\x080\x02" + + "\x08\x10\x02\x08\x17\x02\x08\x12\x02\x08\x1d\x02\x08\x1f\x02\x08\x13\x02" + + "\x08\x15\x02\x08\x14\x02\x08\x0c\x03\x8b\xfd\xd0\x03\x81\xec\xc6\x03\x87" + + "\xe0\x8a\x03-2\xe3\x03\x80\xef\xe4\x03-2\xea\x03\x88\xe6\xeb\x03\x8e\xe6" + + "\xe8\x03\x84\xe6\xe9\x03\x97\xe6\xee\x03-2\xf9\x03-2\xf6\x03\x8e\xe3\xad" + + "\x03\x80\xe3\x92\x03\x88\xe3\x90\x03\x8e\xe3\x90\x03\x80\xe3\x97\x03\x88" + + "\xe3\x95\x03\x88\xfe\xcb\x03\x8e\xfe\xca\x03\x84\xfe\xcd\x03\x91\xef\xc9" + + "\x03-2\xc1\x03-2\xc0\x03-2\xcb\x03\x88@\x09\x03\x8e@\x08\x03\x8f\xe0\xf5" + + "\x03\x8e\xe6\xf9\x03\x8e\xe0\xfa\x03\x93\xff\xf4\x03\x84\xee\xd3\x03\x0b" + + "(\x04\x023 \x021;\x02\x01*\x03\x0b#\x10\x03\x0b 0\x03\x0b!\x10\x03\x0b!0" + + "\x03\x07\x15\x08\x03\x09?5\x03\x07\x1f\x08\x03\x07\x17\x0b\x03\x09\x1f" + + "\x15\x03\x0b\x1c7\x03\x0a+#\x03\x06\x1a\x1b\x03\x06\x1a\x14\x03\x0a\x01" + + "\x18\x03\x06#\x1b\x03\x0a2\x0c\x03\x0a\x01\x04\x03\x09#;\x03\x08='\x03" + + "\x08\x1a\x0a\x03\x07\x03\x0a\x111\x03\x09\x1b\x09\x03\x073.\x03\x07\x01\x00" + + "\x03\x09/,\x03\x07#>\x03\x07\x048\x03\x0a\x1f\x22\x03\x098>\x03\x09\x11" + + "\x00\x03\x08/\x17\x03\x06'\x22\x03\x0b\x1a+\x03\x0a\x22\x19\x03\x0a/1" + + "\x03\x0974\x03\x09\x0f\x22\x03\x08,\x22\x03\x08?\x14\x03\x07$5\x03\x07<3" + + "\x03\x07=*\x03\x07\x13\x18\x03\x068\x0a\x03\x06\x09\x16\x03\x06\x13\x00" + + "\x03\x08\x067\x03\x08\x01\x03\x03\x08\x12\x1d\x03\x07+7\x03\x06(;\x03" + + "\x06\x1c?\x03\x07\x0e\x17\x03\x0a\x06\x1d\x03\x0a\x19\x07\x03\x08\x14$" + + "\x03\x07$;\x03\x08,$\x03\x08\x06\x0d\x03\x07\x16\x0a\x03\x06>>\x03\x0a" + + "\x06\x12\x03\x0a\x14)\x03\x09\x0d\x1f\x03\x09\x12\x17\x03\x09\x19\x01" + + "\x03\x08\x11 \x03\x08\x1d'\x03\x06<\x1a\x03\x0a.\x00\x03\x07'\x18\x03" + + "\x0a\x22\x08\x03\x08\x0d\x0a\x03\x08\x13)\x03\x07*)\x03\x06<,\x03\x07" + + "\x0b\x1a\x03\x09.\x14\x03\x09\x0d\x1e\x03\x07\x0e#\x03\x0b\x1d'\x03\x0a" + + "\x0a8\x03\x09%2\x03\x08+&\x03\x080\x12\x03\x0a)4\x03\x08\x06\x1f\x03\x0b" + + "\x1b\x1a\x03\x0a\x1b\x0f\x03\x0b\x1d*\x03\x09\x16$\x03\x090\x11\x03\x08" + + "\x11\x08\x03\x0a*(\x03\x0a\x042\x03\x089,\x03\x074'\x03\x07\x0f\x05\x03" + + "\x09\x0b\x0a\x03\x07\x1b\x01\x03\x09\x17:\x03\x09.\x0d\x03\x07.\x11\x03" + + "\x09+\x15\x03\x080\x13\x03\x0b\x1f\x19\x03\x0a \x11\x03\x0a\x220\x03\x09" + + "\x07;\x03\x08\x16\x1c\x03\x07,\x13\x03\x07\x0e/\x03\x06\x221\x03\x0a." + + "\x0a\x03\x0a7\x02\x03\x0a\x032\x03\x0a\x1d.\x03\x091\x06\x03\x09\x19:" + + "\x03\x08\x02/\x03\x060+\x03\x06\x0f-\x03\x06\x1c\x1f\x03\x06\x1d\x07\x03" + + "\x0a,\x11\x03\x09=\x0d\x03\x09\x0b;\x03\x07\x1b/\x03\x0a\x1f:\x03\x09 " + + "\x1f\x03\x09.\x10\x03\x094\x0b\x03\x09\x1a1\x03\x08#\x1a\x03\x084\x1d" + + "\x03\x08\x01\x1f\x03\x08\x11\x22\x03\x07'8\x03\x07\x1a>\x03\x0757\x03" + + "\x06&9\x03\x06+\x11\x03\x0a.\x0b\x03\x0a,>\x03\x0a4#\x03\x08%\x17\x03" + + "\x07\x05\x22\x03\x07\x0c\x0b\x03\x0a\x1d+\x03\x0a\x19\x16\x03\x09+\x1f" + + "\x03\x09\x08\x0b\x03\x08\x16\x18\x03\x08+\x12\x03\x0b\x1d\x0c\x03\x0a=" + + "\x10\x03\x0a\x09\x0d\x03\x0a\x10\x11\x03\x09&0\x03\x08(\x1f\x03\x087\x07" + + "\x03\x08\x185\x03\x07'6\x03\x06.\x05\x03\x06=\x04\x03\x06;;\x03\x06\x06," + + "\x03\x0b\x18>\x03\x08\x00\x18\x03\x06 \x03\x03\x06<\x00\x03\x09%\x18\x03" + + "\x0b\x1c<\x03\x0a%!\x03\x0a\x09\x12\x03\x0a\x16\x02\x03\x090'\x03\x09" + + "\x0e=\x03\x08 \x0e\x03\x08>\x03\x03\x074>\x03\x06&?\x03\x06\x19\x09\x03" + + "\x06?(\x03\x0a-\x0e\x03\x09:3\x03\x098:\x03\x09\x12\x0b\x03\x09\x1d\x17" + + "\x03\x087\x05\x03\x082\x14\x03\x08\x06%\x03\x08\x13\x1f\x03\x06\x06\x0e" + + "\x03\x0a\x22<\x03\x09/<\x03\x06>+\x03\x0a'?\x03\x0a\x13\x0c\x03\x09\x10<" + + "\x03\x07\x1b=\x03\x0a\x19\x13\x03\x09\x22\x1d\x03\x09\x07\x0d\x03\x08)" + + "\x1c\x03\x06=\x1a\x03\x0a/4\x03\x0a7\x11\x03\x0a\x16:\x03\x09?3\x03\x09:" + + "/\x03\x09\x05\x0a\x03\x09\x14\x06\x03\x087\x22\x03\x080\x07\x03\x08\x1a" + + "\x1f\x03\x07\x04(\x03\x07\x04\x09\x03\x06 %\x03\x06<\x08\x03\x0a+\x14" + + "\x03\x09\x1d\x16\x03\x0a70\x03\x08 >\x03\x0857\x03\x070\x0a\x03\x06=\x12" + + "\x03\x06\x16%\x03\x06\x1d,\x03\x099#\x03\x09\x10>\x03\x07 \x1e\x03\x08" + + "\x0c<\x03\x08\x0b\x18\x03\x08\x15+\x03\x08,:\x03\x08%\x22\x03\x07\x0a$" + + "\x03\x0b\x1c=\x03\x07+\x08\x03\x0a/\x05\x03\x0a \x07\x03\x0a\x12'\x03" + + "\x09#\x11\x03\x08\x1b\x15\x03\x0a\x06\x01\x03\x09\x1c\x1b\x03\x0922\x03" + + "\x07\x14<\x03\x07\x09\x04\x03\x061\x04\x03\x07\x0e\x01\x03\x0a\x13\x18" + + "\x03\x0a-\x0c\x03\x0a?\x0d\x03\x0a\x09\x0a\x03\x091&\x03\x0a/\x0b\x03" + + "\x08$<\x03\x083\x1d\x03\x08\x0c$\x03\x08\x0d\x07\x03\x08\x0d?\x03\x08" + + "\x0e\x14\x03\x065\x0a\x03\x08\x1a#\x03\x08\x16#\x03\x0702\x03\x07\x03" + + "\x1a\x03\x06(\x1d\x03\x06+\x1b\x03\x06\x0b\x05\x03\x06\x0b\x17\x03\x06" + + "\x0c\x04\x03\x06\x1e\x19\x03\x06+0\x03\x062\x18\x03\x0b\x16\x1e\x03\x0a+" + + "\x16\x03\x0a-?\x03\x0a#:\x03\x0a#\x10\x03\x0a%$\x03\x0a>+\x03\x0a01\x03" + + "\x0a1\x10\x03\x0a\x099\x03\x0a\x0a\x12\x03\x0a\x19\x1f\x03\x0a\x19\x12" + + "\x03\x09*)\x03\x09-\x16\x03\x09.1\x03\x09.2\x03\x09<\x0e\x03\x09> \x03" + + "\x093\x12\x03\x09\x0b\x01\x03\x09\x1c2\x03\x09\x11\x1c\x03\x09\x15%\x03" + + "\x08,&\x03\x08!\x22\x03\x089(\x03\x08\x0b\x1a\x03\x08\x0d2\x03\x08\x0c" + + "\x04\x03\x08\x0c\x06\x03\x08\x0c\x1f\x03\x08\x0c\x0c\x03\x08\x0f\x1f\x03" + + "\x08\x0f\x1d\x03\x08\x00\x14\x03\x08\x03\x14\x03\x08\x06\x16\x03\x08\x1e" + + "#\x03\x08\x11\x11\x03\x08\x10\x18\x03\x08\x14(\x03\x07)\x1e\x03\x07.1" + + "\x03\x07 $\x03\x07 '\x03\x078\x08\x03\x07\x0d0\x03\x07\x0f7\x03\x07\x05#" + + "\x03\x07\x05\x1a\x03\x07\x1a7\x03\x07\x1d-\x03\x07\x17\x10\x03\x06)\x1f" + + "\x03\x062\x0b\x03\x066\x16\x03\x06\x09\x11\x03\x09(\x1e\x03\x07!5\x03" + + "\x0b\x11\x16\x03\x0a/\x04\x03\x0a,\x1a\x03\x0b\x173\x03\x0a,1\x03\x0a/5" + + "\x03\x0a\x221\x03\x0a\x22\x0d\x03\x0a?%\x03\x0a<,\x03\x0a?#\x03\x0a>\x19" + + "\x03\x0a\x08&\x03\x0a\x0b\x0e\x03\x0a\x0c:\x03\x0a\x0c+\x03\x0a\x03\x22" + + "\x03\x0a\x06)\x03\x0a\x11\x10\x03\x0a\x11\x1a\x03\x0a\x17-\x03\x0a\x14(" + + "\x03\x09)\x1e\x03\x09/\x09\x03\x09.\x00\x03\x09,\x07\x03\x09/*\x03\x09-9" + + "\x03\x09\x228\x03\x09%\x09\x03\x09:\x12\x03\x09;\x1d\x03\x09?\x06\x03" + + "\x093%\x03\x096\x05\x03\x096\x08\x03\x097\x02\x03\x09\x07,\x03\x09\x04," + + "\x03\x09\x1f\x16\x03\x09\x11\x03\x03\x09\x11\x12\x03\x09\x168\x03\x08*" + + "\x05\x03\x08/2\x03\x084:\x03\x08\x22+\x03\x08 0\x03\x08&\x0a\x03\x08;" + + "\x10\x03\x08>$\x03\x08>\x18\x03\x0829\x03\x082:\x03\x081,\x03\x081<\x03" + + "\x081\x1c\x03\x087#\x03\x087*\x03\x08\x09'\x03\x08\x00\x1d\x03\x08\x05-" + + "\x03\x08\x1f4\x03\x08\x1d\x04\x03\x08\x16\x0f\x03\x07*7\x03\x07'!\x03" + + "\x07%\x1b\x03\x077\x0c\x03\x07\x0c1\x03\x07\x0c.\x03\x07\x00\x06\x03\x07" + + "\x01\x02\x03\x07\x010\x03\x07\x06=\x03\x07\x01\x03\x03\x07\x01\x13\x03" + + "\x07\x06\x06\x03\x07\x05\x0a\x03\x07\x1f\x09\x03\x07\x17:\x03\x06*1\x03" + + "\x06-\x1d\x03\x06\x223\x03\x062:\x03\x060$\x03\x066\x1e\x03\x064\x12\x03" + + "\x0645\x03\x06\x0b\x00\x03\x06\x0b7\x03\x06\x07\x1f\x03\x06\x15\x12\x03" + + "\x0c\x05\x0f\x03\x0b+\x0b\x03\x0b+-\x03\x06\x16\x1b\x03\x06\x15\x17\x03" + + "\x89\xca\xea\x03\x89\xca\xe8\x03\x0c8\x10\x03\x0c8\x01\x03\x0c8\x0f\x03" + + "\x0d8%\x03\x0d8!\x03\x0c8-\x03\x0c8/\x03\x0c8+\x03\x0c87\x03\x0c85\x03" + + "\x0c9\x09\x03\x0c9\x0d\x03\x0c9\x0f\x03\x0c9\x0b\x03\xcfu\x0c\x03\xcfu" + + "\x0f\x03\xcfu\x0e\x03\xcfu\x09\x03\x0c9\x10\x03\x0d9\x0c\x03\xcf`;\x03" + + "\xcf`>\x03\xcf`9\x03\xcf`8\x03\xcf`7\x03\xcf`*\x03\xcf`-\x03\xcf`,\x03" + + "\x0d\x1b\x1a\x03\x0d\x1b&\x03\x0c=.\x03\x0c=%\x03\x0c>\x1e\x03\x0c>\x14" + + "\x03\x0c?\x06\x03\x0c?\x0b\x03\x0c?\x0c\x03\x0c?\x0d\x03\x0c?\x02\x03" + + "\x0c>\x0f\x03\x0c>\x08\x03\x0c>\x09\x03\x0c>,\x03\x0c>\x0c\x03\x0c?\x13" + + "\x03\x0c?\x16\x03\x0c?\x15\x03\x0c?\x1c\x03\x0c?\x1f\x03\x0c?\x1d\x03" + + "\x0c?\x1a\x03\x0c?\x17\x03\x0c?\x08\x03\x0c?\x09\x03\x0c?\x0e\x03\x0c?" + + "\x04\x03\x0c?\x05\x03\x0c" + + "\x03\x0c=2\x03\x0c=6\x03\x0c<\x07\x03\x0c<\x05\x03\x0e:!\x03\x0e:#\x03" + + "\x0e8\x09\x03\x0e:&\x03\x0e8\x0b\x03\x0e:$\x03\x0e:,\x03\x0e8\x1a\x03" + + "\x0e8\x1e\x03\x0e:*\x03\x0e:7\x03\x0e:5\x03\x0e:;\x03\x0e:\x15\x03\x0e:<" + + "\x03\x0e:4\x03\x0e:'\x03\x0e:-\x03\x0e:%\x03\x0e:?\x03\x0e:=\x03\x0e:)" + + "\x03\x0e:/\x03\xcfs'\x03\x0d=\x0f\x03\x0d+*\x03\x0d99\x03\x0d9;\x03\x0d9" + + "?\x03\x0d)\x0d\x03\x0d(%\x02\x01\x18\x02\x01(\x02\x01\x1e\x03\x0f$!\x03" + + "\x0f87\x03\x0f4\x0e\x03\x0f5\x1d\x03\x06'\x03\x03\x0f\x08\x18\x03\x0f" + + "\x0d\x1b\x03\x0e2=\x03\x0e;\x08\x03\x0e:\x0b\x03\x0e\x06$\x03\x0e\x0d)" + + "\x03\x0e\x16\x1f\x03\x0e\x16\x1b\x03\x0d$\x0a\x03\x05,\x1d\x03\x0d. \x03" + + "\x0d.#\x03\x0c(/\x03\x09%\x02\x03\x0d90\x03\x0d\x0e4\x03\x0d\x0d\x0f\x03" + + "\x0c#\x00\x03\x0c,\x1e\x03\x0c2\x0e\x03\x0c\x01\x17\x03\x0c\x09:\x03\x0e" + + "\x173\x03\x0c\x08\x03\x03\x0c\x11\x07\x03\x0c\x10\x18\x03\x0c\x1f\x1c" + + "\x03\x0c\x19\x0e\x03\x0c\x1a\x1f\x03\x0f0>\x03\x0b->\x03\x0b<+\x03\x0b8" + + "\x13\x03\x0b\x043\x03\x0b\x14\x03\x03\x0b\x16%\x03\x0d\x22&\x03\x0b\x1a" + + "\x1a\x03\x0b\x1a\x04\x03\x0a%9\x03\x0a&2\x03\x0a&0\x03\x0a!\x1a\x03\x0a!" + + "7\x03\x0a5\x10\x03\x0a=4\x03\x0a?\x0e\x03\x0a>\x10\x03\x0a\x00 \x03\x0a" + + "\x0f:\x03\x0a\x0f9\x03\x0a\x0b\x0a\x03\x0a\x17%\x03\x0a\x1b-\x03\x09-" + + "\x1a\x03\x09,4\x03\x09.,\x03\x09)\x09\x03\x096!\x03\x091\x1f\x03\x093" + + "\x16\x03\x0c+\x1f\x03\x098 \x03\x098=\x03\x0c(\x1a\x03\x0c(\x16\x03\x09" + + "\x0a+\x03\x09\x16\x12\x03\x09\x13\x0e\x03\x09\x153\x03\x08)!\x03\x09\x1a" + + "\x01\x03\x09\x18\x01\x03\x08%#\x03\x08>\x22\x03\x08\x05%\x03\x08\x02*" + + "\x03\x08\x15;\x03\x08\x1b7\x03\x0f\x07\x1d\x03\x0f\x04\x03\x03\x070\x0c" + + "\x03\x07;\x0b\x03\x07\x08\x17\x03\x07\x12\x06\x03\x06/-\x03\x0671\x03" + + "\x065+\x03\x06>7\x03\x06\x049\x03\x05+\x1e\x03\x05,\x17\x03\x05 \x1d\x03" + + "\x05\x22\x05\x03\x050\x1d" + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *idnaTrie) lookup(s []byte) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return idnaValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = idnaIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = idnaIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = idnaIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *idnaTrie) lookupUnsafe(s []byte) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return idnaValues[c0] + } + i := idnaIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = idnaIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = idnaIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// lookupString returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *idnaTrie) lookupString(s string) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return idnaValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = idnaIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = idnaIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = idnaIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *idnaTrie) lookupStringUnsafe(s string) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return idnaValues[c0] + } + i := idnaIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = idnaIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = idnaIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// idnaTrie. Total size: 28496 bytes (27.83 KiB). Checksum: 43288b883596640e. +type idnaTrie struct{} + +func newIdnaTrie(i int) *idnaTrie { + return &idnaTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *idnaTrie) lookupValue(n uint32, b byte) uint16 { + switch { + case n < 123: + return uint16(idnaValues[n<<6+uint32(b)]) + default: + n -= 123 + return uint16(idnaSparse.lookup(n, b)) + } +} + +// idnaValues: 125 blocks, 8000 entries, 16000 bytes +// The third block is the zero block. +var idnaValues = [8000]uint16{ + // Block 0x0, offset 0x0 + 0x00: 0x0080, 0x01: 0x0080, 0x02: 0x0080, 0x03: 0x0080, 0x04: 0x0080, 0x05: 0x0080, + 0x06: 0x0080, 0x07: 0x0080, 0x08: 0x0080, 0x09: 0x0080, 0x0a: 0x0080, 0x0b: 0x0080, + 0x0c: 0x0080, 0x0d: 0x0080, 0x0e: 0x0080, 0x0f: 0x0080, 0x10: 0x0080, 0x11: 0x0080, + 0x12: 0x0080, 0x13: 0x0080, 0x14: 0x0080, 0x15: 0x0080, 0x16: 0x0080, 0x17: 0x0080, + 0x18: 0x0080, 0x19: 0x0080, 0x1a: 0x0080, 0x1b: 0x0080, 0x1c: 0x0080, 0x1d: 0x0080, + 0x1e: 0x0080, 0x1f: 0x0080, 0x20: 0x0080, 0x21: 0x0080, 0x22: 0x0080, 0x23: 0x0080, + 0x24: 0x0080, 0x25: 0x0080, 0x26: 0x0080, 0x27: 0x0080, 0x28: 0x0080, 0x29: 0x0080, + 0x2a: 0x0080, 0x2b: 0x0080, 0x2c: 0x0080, 0x2d: 0x0008, 0x2e: 0x0008, 0x2f: 0x0080, + 0x30: 0x0008, 0x31: 0x0008, 0x32: 0x0008, 0x33: 0x0008, 0x34: 0x0008, 0x35: 0x0008, + 0x36: 0x0008, 0x37: 0x0008, 0x38: 0x0008, 0x39: 0x0008, 0x3a: 0x0080, 0x3b: 0x0080, + 0x3c: 0x0080, 0x3d: 0x0080, 0x3e: 0x0080, 0x3f: 0x0080, + // Block 0x1, offset 0x40 + 0x40: 0x0080, 0x41: 0xe105, 0x42: 0xe105, 0x43: 0xe105, 0x44: 0xe105, 0x45: 0xe105, + 0x46: 0xe105, 0x47: 0xe105, 0x48: 0xe105, 0x49: 0xe105, 0x4a: 0xe105, 0x4b: 0xe105, + 0x4c: 0xe105, 0x4d: 0xe105, 0x4e: 0xe105, 0x4f: 0xe105, 0x50: 0xe105, 0x51: 0xe105, + 0x52: 0xe105, 0x53: 0xe105, 0x54: 0xe105, 0x55: 0xe105, 0x56: 0xe105, 0x57: 0xe105, + 0x58: 0xe105, 0x59: 0xe105, 0x5a: 0xe105, 0x5b: 0x0080, 0x5c: 0x0080, 0x5d: 0x0080, + 0x5e: 0x0080, 0x5f: 0x0080, 0x60: 0x0080, 0x61: 0x0008, 0x62: 0x0008, 0x63: 0x0008, + 0x64: 0x0008, 0x65: 0x0008, 0x66: 0x0008, 0x67: 0x0008, 0x68: 0x0008, 0x69: 0x0008, + 0x6a: 0x0008, 0x6b: 0x0008, 0x6c: 0x0008, 0x6d: 0x0008, 0x6e: 0x0008, 0x6f: 0x0008, + 0x70: 0x0008, 0x71: 0x0008, 0x72: 0x0008, 0x73: 0x0008, 0x74: 0x0008, 0x75: 0x0008, + 0x76: 0x0008, 0x77: 0x0008, 0x78: 0x0008, 0x79: 0x0008, 0x7a: 0x0008, 0x7b: 0x0080, + 0x7c: 0x0080, 0x7d: 0x0080, 0x7e: 0x0080, 0x7f: 0x0080, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x0040, 0xc1: 0x0040, 0xc2: 0x0040, 0xc3: 0x0040, 0xc4: 0x0040, 0xc5: 0x0040, + 0xc6: 0x0040, 0xc7: 0x0040, 0xc8: 0x0040, 0xc9: 0x0040, 0xca: 0x0040, 0xcb: 0x0040, + 0xcc: 0x0040, 0xcd: 0x0040, 0xce: 0x0040, 0xcf: 0x0040, 0xd0: 0x0040, 0xd1: 0x0040, + 0xd2: 0x0040, 0xd3: 0x0040, 0xd4: 0x0040, 0xd5: 0x0040, 0xd6: 0x0040, 0xd7: 0x0040, + 0xd8: 0x0040, 0xd9: 0x0040, 0xda: 0x0040, 0xdb: 0x0040, 0xdc: 0x0040, 0xdd: 0x0040, + 0xde: 0x0040, 0xdf: 0x0040, 0xe0: 0x000a, 0xe1: 0x0018, 0xe2: 0x0018, 0xe3: 0x0018, + 0xe4: 0x0018, 0xe5: 0x0018, 0xe6: 0x0018, 0xe7: 0x0018, 0xe8: 0x001a, 0xe9: 0x0018, + 0xea: 0x0039, 0xeb: 0x0018, 0xec: 0x0018, 0xed: 0x03c0, 0xee: 0x0018, 0xef: 0x004a, + 0xf0: 0x0018, 0xf1: 0x0018, 0xf2: 0x0069, 0xf3: 0x0079, 0xf4: 0x008a, 0xf5: 0x0005, + 0xf6: 0x0018, 0xf7: 0x0008, 0xf8: 0x00aa, 0xf9: 0x00c9, 0xfa: 0x00d9, 0xfb: 0x0018, + 0xfc: 0x00e9, 0xfd: 0x0119, 0xfe: 0x0149, 0xff: 0x0018, + // Block 0x4, offset 0x100 + 0x100: 0xe00d, 0x101: 0x0008, 0x102: 0xe00d, 0x103: 0x0008, 0x104: 0xe00d, 0x105: 0x0008, + 0x106: 0xe00d, 0x107: 0x0008, 0x108: 0xe00d, 0x109: 0x0008, 0x10a: 0xe00d, 0x10b: 0x0008, + 0x10c: 0xe00d, 0x10d: 0x0008, 0x10e: 0xe00d, 0x10f: 0x0008, 0x110: 0xe00d, 0x111: 0x0008, + 0x112: 0xe00d, 0x113: 0x0008, 0x114: 0xe00d, 0x115: 0x0008, 0x116: 0xe00d, 0x117: 0x0008, + 0x118: 0xe00d, 0x119: 0x0008, 0x11a: 0xe00d, 0x11b: 0x0008, 0x11c: 0xe00d, 0x11d: 0x0008, + 0x11e: 0xe00d, 0x11f: 0x0008, 0x120: 0xe00d, 0x121: 0x0008, 0x122: 0xe00d, 0x123: 0x0008, + 0x124: 0xe00d, 0x125: 0x0008, 0x126: 0xe00d, 0x127: 0x0008, 0x128: 0xe00d, 0x129: 0x0008, + 0x12a: 0xe00d, 0x12b: 0x0008, 0x12c: 0xe00d, 0x12d: 0x0008, 0x12e: 0xe00d, 0x12f: 0x0008, + 0x130: 0x0179, 0x131: 0x0008, 0x132: 0x0035, 0x133: 0x004d, 0x134: 0xe00d, 0x135: 0x0008, + 0x136: 0xe00d, 0x137: 0x0008, 0x138: 0x0008, 0x139: 0xe01d, 0x13a: 0x0008, 0x13b: 0xe03d, + 0x13c: 0x0008, 0x13d: 0xe01d, 0x13e: 0x0008, 0x13f: 0x0199, + // Block 0x5, offset 0x140 + 0x140: 0x0199, 0x141: 0xe01d, 0x142: 0x0008, 0x143: 0xe03d, 0x144: 0x0008, 0x145: 0xe01d, + 0x146: 0x0008, 0x147: 0xe07d, 0x148: 0x0008, 0x149: 0x01b9, 0x14a: 0xe00d, 0x14b: 0x0008, + 0x14c: 0xe00d, 0x14d: 0x0008, 0x14e: 0xe00d, 0x14f: 0x0008, 0x150: 0xe00d, 0x151: 0x0008, + 0x152: 0xe00d, 0x153: 0x0008, 0x154: 0xe00d, 0x155: 0x0008, 0x156: 0xe00d, 0x157: 0x0008, + 0x158: 0xe00d, 0x159: 0x0008, 0x15a: 0xe00d, 0x15b: 0x0008, 0x15c: 0xe00d, 0x15d: 0x0008, + 0x15e: 0xe00d, 0x15f: 0x0008, 0x160: 0xe00d, 0x161: 0x0008, 0x162: 0xe00d, 0x163: 0x0008, + 0x164: 0xe00d, 0x165: 0x0008, 0x166: 0xe00d, 0x167: 0x0008, 0x168: 0xe00d, 0x169: 0x0008, + 0x16a: 0xe00d, 0x16b: 0x0008, 0x16c: 0xe00d, 0x16d: 0x0008, 0x16e: 0xe00d, 0x16f: 0x0008, + 0x170: 0xe00d, 0x171: 0x0008, 0x172: 0xe00d, 0x173: 0x0008, 0x174: 0xe00d, 0x175: 0x0008, + 0x176: 0xe00d, 0x177: 0x0008, 0x178: 0x0065, 0x179: 0xe01d, 0x17a: 0x0008, 0x17b: 0xe03d, + 0x17c: 0x0008, 0x17d: 0xe01d, 0x17e: 0x0008, 0x17f: 0x01d9, + // Block 0x6, offset 0x180 + 0x180: 0x0008, 0x181: 0x007d, 0x182: 0xe00d, 0x183: 0x0008, 0x184: 0xe00d, 0x185: 0x0008, + 0x186: 0x007d, 0x187: 0xe07d, 0x188: 0x0008, 0x189: 0x0095, 0x18a: 0x00ad, 0x18b: 0xe03d, + 0x18c: 0x0008, 0x18d: 0x0008, 0x18e: 0x00c5, 0x18f: 0x00dd, 0x190: 0x00f5, 0x191: 0xe01d, + 0x192: 0x0008, 0x193: 0x010d, 0x194: 0x0125, 0x195: 0x0008, 0x196: 0x013d, 0x197: 0x013d, + 0x198: 0xe00d, 0x199: 0x0008, 0x19a: 0x0008, 0x19b: 0x0008, 0x19c: 0x010d, 0x19d: 0x0155, + 0x19e: 0x0008, 0x19f: 0x016d, 0x1a0: 0xe00d, 0x1a1: 0x0008, 0x1a2: 0xe00d, 0x1a3: 0x0008, + 0x1a4: 0xe00d, 0x1a5: 0x0008, 0x1a6: 0x0185, 0x1a7: 0xe07d, 0x1a8: 0x0008, 0x1a9: 0x019d, + 0x1aa: 0x0008, 0x1ab: 0x0008, 0x1ac: 0xe00d, 0x1ad: 0x0008, 0x1ae: 0x0185, 0x1af: 0xe0fd, + 0x1b0: 0x0008, 0x1b1: 0x01b5, 0x1b2: 0x01cd, 0x1b3: 0xe03d, 0x1b4: 0x0008, 0x1b5: 0xe01d, + 0x1b6: 0x0008, 0x1b7: 0x01e5, 0x1b8: 0xe00d, 0x1b9: 0x0008, 0x1ba: 0x0008, 0x1bb: 0x0008, + 0x1bc: 0xe00d, 0x1bd: 0x0008, 0x1be: 0x0008, 0x1bf: 0x0008, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x0008, 0x1c1: 0x0008, 0x1c2: 0x0008, 0x1c3: 0x0008, 0x1c4: 0x01e9, 0x1c5: 0x01e9, + 0x1c6: 0x01e9, 0x1c7: 0x01fd, 0x1c8: 0x0215, 0x1c9: 0x022d, 0x1ca: 0x0245, 0x1cb: 0x025d, + 0x1cc: 0x0275, 0x1cd: 0xe01d, 0x1ce: 0x0008, 0x1cf: 0xe0fd, 0x1d0: 0x0008, 0x1d1: 0xe01d, + 0x1d2: 0x0008, 0x1d3: 0xe03d, 0x1d4: 0x0008, 0x1d5: 0xe01d, 0x1d6: 0x0008, 0x1d7: 0xe07d, + 0x1d8: 0x0008, 0x1d9: 0xe01d, 0x1da: 0x0008, 0x1db: 0xe03d, 0x1dc: 0x0008, 0x1dd: 0x0008, + 0x1de: 0xe00d, 0x1df: 0x0008, 0x1e0: 0xe00d, 0x1e1: 0x0008, 0x1e2: 0xe00d, 0x1e3: 0x0008, + 0x1e4: 0xe00d, 0x1e5: 0x0008, 0x1e6: 0xe00d, 0x1e7: 0x0008, 0x1e8: 0xe00d, 0x1e9: 0x0008, + 0x1ea: 0xe00d, 0x1eb: 0x0008, 0x1ec: 0xe00d, 0x1ed: 0x0008, 0x1ee: 0xe00d, 0x1ef: 0x0008, + 0x1f0: 0x0008, 0x1f1: 0x028d, 0x1f2: 0x02a5, 0x1f3: 0x02bd, 0x1f4: 0xe00d, 0x1f5: 0x0008, + 0x1f6: 0x02d5, 0x1f7: 0x02ed, 0x1f8: 0xe00d, 0x1f9: 0x0008, 0x1fa: 0xe00d, 0x1fb: 0x0008, + 0x1fc: 0xe00d, 0x1fd: 0x0008, 0x1fe: 0xe00d, 0x1ff: 0x0008, + // Block 0x8, offset 0x200 + 0x200: 0xe00d, 0x201: 0x0008, 0x202: 0xe00d, 0x203: 0x0008, 0x204: 0xe00d, 0x205: 0x0008, + 0x206: 0xe00d, 0x207: 0x0008, 0x208: 0xe00d, 0x209: 0x0008, 0x20a: 0xe00d, 0x20b: 0x0008, + 0x20c: 0xe00d, 0x20d: 0x0008, 0x20e: 0xe00d, 0x20f: 0x0008, 0x210: 0xe00d, 0x211: 0x0008, + 0x212: 0xe00d, 0x213: 0x0008, 0x214: 0xe00d, 0x215: 0x0008, 0x216: 0xe00d, 0x217: 0x0008, + 0x218: 0xe00d, 0x219: 0x0008, 0x21a: 0xe00d, 0x21b: 0x0008, 0x21c: 0xe00d, 0x21d: 0x0008, + 0x21e: 0xe00d, 0x21f: 0x0008, 0x220: 0x0305, 0x221: 0x0008, 0x222: 0xe00d, 0x223: 0x0008, + 0x224: 0xe00d, 0x225: 0x0008, 0x226: 0xe00d, 0x227: 0x0008, 0x228: 0xe00d, 0x229: 0x0008, + 0x22a: 0xe00d, 0x22b: 0x0008, 0x22c: 0xe00d, 0x22d: 0x0008, 0x22e: 0xe00d, 0x22f: 0x0008, + 0x230: 0xe00d, 0x231: 0x0008, 0x232: 0xe00d, 0x233: 0x0008, 0x234: 0x0008, 0x235: 0x0008, + 0x236: 0x0008, 0x237: 0x0008, 0x238: 0x0008, 0x239: 0x0008, 0x23a: 0x0209, 0x23b: 0xe03d, + 0x23c: 0x0008, 0x23d: 0x031d, 0x23e: 0x0229, 0x23f: 0x0008, + // Block 0x9, offset 0x240 + 0x240: 0x0008, 0x241: 0x0008, 0x242: 0x0018, 0x243: 0x0018, 0x244: 0x0018, 0x245: 0x0018, + 0x246: 0x0008, 0x247: 0x0008, 0x248: 0x0008, 0x249: 0x0008, 0x24a: 0x0008, 0x24b: 0x0008, + 0x24c: 0x0008, 0x24d: 0x0008, 0x24e: 0x0008, 0x24f: 0x0008, 0x250: 0x0008, 0x251: 0x0008, + 0x252: 0x0018, 0x253: 0x0018, 0x254: 0x0018, 0x255: 0x0018, 0x256: 0x0018, 0x257: 0x0018, + 0x258: 0x029a, 0x259: 0x02ba, 0x25a: 0x02da, 0x25b: 0x02fa, 0x25c: 0x031a, 0x25d: 0x033a, + 0x25e: 0x0018, 0x25f: 0x0018, 0x260: 0x03ad, 0x261: 0x0359, 0x262: 0x01d9, 0x263: 0x0369, + 0x264: 0x03c5, 0x265: 0x0018, 0x266: 0x0018, 0x267: 0x0018, 0x268: 0x0018, 0x269: 0x0018, + 0x26a: 0x0018, 0x26b: 0x0018, 0x26c: 0x0008, 0x26d: 0x0018, 0x26e: 0x0008, 0x26f: 0x0018, + 0x270: 0x0018, 0x271: 0x0018, 0x272: 0x0018, 0x273: 0x0018, 0x274: 0x0018, 0x275: 0x0018, + 0x276: 0x0018, 0x277: 0x0018, 0x278: 0x0018, 0x279: 0x0018, 0x27a: 0x0018, 0x27b: 0x0018, + 0x27c: 0x0018, 0x27d: 0x0018, 0x27e: 0x0018, 0x27f: 0x0018, + // Block 0xa, offset 0x280 + 0x280: 0x03dd, 0x281: 0x03dd, 0x282: 0x1308, 0x283: 0x03f5, 0x284: 0x0379, 0x285: 0x040d, + 0x286: 0x1308, 0x287: 0x1308, 0x288: 0x1308, 0x289: 0x1308, 0x28a: 0x1308, 0x28b: 0x1308, + 0x28c: 0x1308, 0x28d: 0x1308, 0x28e: 0x1308, 0x28f: 0x13c0, 0x290: 0x1308, 0x291: 0x1308, + 0x292: 0x1308, 0x293: 0x1308, 0x294: 0x1308, 0x295: 0x1308, 0x296: 0x1308, 0x297: 0x1308, + 0x298: 0x1308, 0x299: 0x1308, 0x29a: 0x1308, 0x29b: 0x1308, 0x29c: 0x1308, 0x29d: 0x1308, + 0x29e: 0x1308, 0x29f: 0x1308, 0x2a0: 0x1308, 0x2a1: 0x1308, 0x2a2: 0x1308, 0x2a3: 0x1308, + 0x2a4: 0x1308, 0x2a5: 0x1308, 0x2a6: 0x1308, 0x2a7: 0x1308, 0x2a8: 0x1308, 0x2a9: 0x1308, + 0x2aa: 0x1308, 0x2ab: 0x1308, 0x2ac: 0x1308, 0x2ad: 0x1308, 0x2ae: 0x1308, 0x2af: 0x1308, + 0x2b0: 0xe00d, 0x2b1: 0x0008, 0x2b2: 0xe00d, 0x2b3: 0x0008, 0x2b4: 0x0425, 0x2b5: 0x0008, + 0x2b6: 0xe00d, 0x2b7: 0x0008, 0x2b8: 0x0040, 0x2b9: 0x0040, 0x2ba: 0x03a2, 0x2bb: 0x0008, + 0x2bc: 0x0008, 0x2bd: 0x0008, 0x2be: 0x03c2, 0x2bf: 0x043d, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x0040, 0x2c1: 0x0040, 0x2c2: 0x0040, 0x2c3: 0x0040, 0x2c4: 0x008a, 0x2c5: 0x03d2, + 0x2c6: 0xe155, 0x2c7: 0x0455, 0x2c8: 0xe12d, 0x2c9: 0xe13d, 0x2ca: 0xe12d, 0x2cb: 0x0040, + 0x2cc: 0x03dd, 0x2cd: 0x0040, 0x2ce: 0x046d, 0x2cf: 0x0485, 0x2d0: 0x0008, 0x2d1: 0xe105, + 0x2d2: 0xe105, 0x2d3: 0xe105, 0x2d4: 0xe105, 0x2d5: 0xe105, 0x2d6: 0xe105, 0x2d7: 0xe105, + 0x2d8: 0xe105, 0x2d9: 0xe105, 0x2da: 0xe105, 0x2db: 0xe105, 0x2dc: 0xe105, 0x2dd: 0xe105, + 0x2de: 0xe105, 0x2df: 0xe105, 0x2e0: 0x049d, 0x2e1: 0x049d, 0x2e2: 0x0040, 0x2e3: 0x049d, + 0x2e4: 0x049d, 0x2e5: 0x049d, 0x2e6: 0x049d, 0x2e7: 0x049d, 0x2e8: 0x049d, 0x2e9: 0x049d, + 0x2ea: 0x049d, 0x2eb: 0x049d, 0x2ec: 0x0008, 0x2ed: 0x0008, 0x2ee: 0x0008, 0x2ef: 0x0008, + 0x2f0: 0x0008, 0x2f1: 0x0008, 0x2f2: 0x0008, 0x2f3: 0x0008, 0x2f4: 0x0008, 0x2f5: 0x0008, + 0x2f6: 0x0008, 0x2f7: 0x0008, 0x2f8: 0x0008, 0x2f9: 0x0008, 0x2fa: 0x0008, 0x2fb: 0x0008, + 0x2fc: 0x0008, 0x2fd: 0x0008, 0x2fe: 0x0008, 0x2ff: 0x0008, + // Block 0xc, offset 0x300 + 0x300: 0x0008, 0x301: 0x0008, 0x302: 0xe00f, 0x303: 0x0008, 0x304: 0x0008, 0x305: 0x0008, + 0x306: 0x0008, 0x307: 0x0008, 0x308: 0x0008, 0x309: 0x0008, 0x30a: 0x0008, 0x30b: 0x0008, + 0x30c: 0x0008, 0x30d: 0x0008, 0x30e: 0x0008, 0x30f: 0xe0c5, 0x310: 0x04b5, 0x311: 0x04cd, + 0x312: 0xe0bd, 0x313: 0xe0f5, 0x314: 0xe0fd, 0x315: 0xe09d, 0x316: 0xe0b5, 0x317: 0x0008, + 0x318: 0xe00d, 0x319: 0x0008, 0x31a: 0xe00d, 0x31b: 0x0008, 0x31c: 0xe00d, 0x31d: 0x0008, + 0x31e: 0xe00d, 0x31f: 0x0008, 0x320: 0xe00d, 0x321: 0x0008, 0x322: 0xe00d, 0x323: 0x0008, + 0x324: 0xe00d, 0x325: 0x0008, 0x326: 0xe00d, 0x327: 0x0008, 0x328: 0xe00d, 0x329: 0x0008, + 0x32a: 0xe00d, 0x32b: 0x0008, 0x32c: 0xe00d, 0x32d: 0x0008, 0x32e: 0xe00d, 0x32f: 0x0008, + 0x330: 0x04e5, 0x331: 0xe185, 0x332: 0xe18d, 0x333: 0x0008, 0x334: 0x04fd, 0x335: 0x03dd, + 0x336: 0x0018, 0x337: 0xe07d, 0x338: 0x0008, 0x339: 0xe1d5, 0x33a: 0xe00d, 0x33b: 0x0008, + 0x33c: 0x0008, 0x33d: 0x0515, 0x33e: 0x052d, 0x33f: 0x052d, + // Block 0xd, offset 0x340 + 0x340: 0x0008, 0x341: 0x0008, 0x342: 0x0008, 0x343: 0x0008, 0x344: 0x0008, 0x345: 0x0008, + 0x346: 0x0008, 0x347: 0x0008, 0x348: 0x0008, 0x349: 0x0008, 0x34a: 0x0008, 0x34b: 0x0008, + 0x34c: 0x0008, 0x34d: 0x0008, 0x34e: 0x0008, 0x34f: 0x0008, 0x350: 0x0008, 0x351: 0x0008, + 0x352: 0x0008, 0x353: 0x0008, 0x354: 0x0008, 0x355: 0x0008, 0x356: 0x0008, 0x357: 0x0008, + 0x358: 0x0008, 0x359: 0x0008, 0x35a: 0x0008, 0x35b: 0x0008, 0x35c: 0x0008, 0x35d: 0x0008, + 0x35e: 0x0008, 0x35f: 0x0008, 0x360: 0xe00d, 0x361: 0x0008, 0x362: 0xe00d, 0x363: 0x0008, + 0x364: 0xe00d, 0x365: 0x0008, 0x366: 0xe00d, 0x367: 0x0008, 0x368: 0xe00d, 0x369: 0x0008, + 0x36a: 0xe00d, 0x36b: 0x0008, 0x36c: 0xe00d, 0x36d: 0x0008, 0x36e: 0xe00d, 0x36f: 0x0008, + 0x370: 0xe00d, 0x371: 0x0008, 0x372: 0xe00d, 0x373: 0x0008, 0x374: 0xe00d, 0x375: 0x0008, + 0x376: 0xe00d, 0x377: 0x0008, 0x378: 0xe00d, 0x379: 0x0008, 0x37a: 0xe00d, 0x37b: 0x0008, + 0x37c: 0xe00d, 0x37d: 0x0008, 0x37e: 0xe00d, 0x37f: 0x0008, + // Block 0xe, offset 0x380 + 0x380: 0xe00d, 0x381: 0x0008, 0x382: 0x0018, 0x383: 0x1308, 0x384: 0x1308, 0x385: 0x1308, + 0x386: 0x1308, 0x387: 0x1308, 0x388: 0x1318, 0x389: 0x1318, 0x38a: 0xe00d, 0x38b: 0x0008, + 0x38c: 0xe00d, 0x38d: 0x0008, 0x38e: 0xe00d, 0x38f: 0x0008, 0x390: 0xe00d, 0x391: 0x0008, + 0x392: 0xe00d, 0x393: 0x0008, 0x394: 0xe00d, 0x395: 0x0008, 0x396: 0xe00d, 0x397: 0x0008, + 0x398: 0xe00d, 0x399: 0x0008, 0x39a: 0xe00d, 0x39b: 0x0008, 0x39c: 0xe00d, 0x39d: 0x0008, + 0x39e: 0xe00d, 0x39f: 0x0008, 0x3a0: 0xe00d, 0x3a1: 0x0008, 0x3a2: 0xe00d, 0x3a3: 0x0008, + 0x3a4: 0xe00d, 0x3a5: 0x0008, 0x3a6: 0xe00d, 0x3a7: 0x0008, 0x3a8: 0xe00d, 0x3a9: 0x0008, + 0x3aa: 0xe00d, 0x3ab: 0x0008, 0x3ac: 0xe00d, 0x3ad: 0x0008, 0x3ae: 0xe00d, 0x3af: 0x0008, + 0x3b0: 0xe00d, 0x3b1: 0x0008, 0x3b2: 0xe00d, 0x3b3: 0x0008, 0x3b4: 0xe00d, 0x3b5: 0x0008, + 0x3b6: 0xe00d, 0x3b7: 0x0008, 0x3b8: 0xe00d, 0x3b9: 0x0008, 0x3ba: 0xe00d, 0x3bb: 0x0008, + 0x3bc: 0xe00d, 0x3bd: 0x0008, 0x3be: 0xe00d, 0x3bf: 0x0008, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x0040, 0x3c1: 0xe01d, 0x3c2: 0x0008, 0x3c3: 0xe03d, 0x3c4: 0x0008, 0x3c5: 0xe01d, + 0x3c6: 0x0008, 0x3c7: 0xe07d, 0x3c8: 0x0008, 0x3c9: 0xe01d, 0x3ca: 0x0008, 0x3cb: 0xe03d, + 0x3cc: 0x0008, 0x3cd: 0xe01d, 0x3ce: 0x0008, 0x3cf: 0x0008, 0x3d0: 0xe00d, 0x3d1: 0x0008, + 0x3d2: 0xe00d, 0x3d3: 0x0008, 0x3d4: 0xe00d, 0x3d5: 0x0008, 0x3d6: 0xe00d, 0x3d7: 0x0008, + 0x3d8: 0xe00d, 0x3d9: 0x0008, 0x3da: 0xe00d, 0x3db: 0x0008, 0x3dc: 0xe00d, 0x3dd: 0x0008, + 0x3de: 0xe00d, 0x3df: 0x0008, 0x3e0: 0xe00d, 0x3e1: 0x0008, 0x3e2: 0xe00d, 0x3e3: 0x0008, + 0x3e4: 0xe00d, 0x3e5: 0x0008, 0x3e6: 0xe00d, 0x3e7: 0x0008, 0x3e8: 0xe00d, 0x3e9: 0x0008, + 0x3ea: 0xe00d, 0x3eb: 0x0008, 0x3ec: 0xe00d, 0x3ed: 0x0008, 0x3ee: 0xe00d, 0x3ef: 0x0008, + 0x3f0: 0xe00d, 0x3f1: 0x0008, 0x3f2: 0xe00d, 0x3f3: 0x0008, 0x3f4: 0xe00d, 0x3f5: 0x0008, + 0x3f6: 0xe00d, 0x3f7: 0x0008, 0x3f8: 0xe00d, 0x3f9: 0x0008, 0x3fa: 0xe00d, 0x3fb: 0x0008, + 0x3fc: 0xe00d, 0x3fd: 0x0008, 0x3fe: 0xe00d, 0x3ff: 0x0008, + // Block 0x10, offset 0x400 + 0x400: 0xe00d, 0x401: 0x0008, 0x402: 0xe00d, 0x403: 0x0008, 0x404: 0xe00d, 0x405: 0x0008, + 0x406: 0xe00d, 0x407: 0x0008, 0x408: 0xe00d, 0x409: 0x0008, 0x40a: 0xe00d, 0x40b: 0x0008, + 0x40c: 0xe00d, 0x40d: 0x0008, 0x40e: 0xe00d, 0x40f: 0x0008, 0x410: 0xe00d, 0x411: 0x0008, + 0x412: 0xe00d, 0x413: 0x0008, 0x414: 0xe00d, 0x415: 0x0008, 0x416: 0xe00d, 0x417: 0x0008, + 0x418: 0xe00d, 0x419: 0x0008, 0x41a: 0xe00d, 0x41b: 0x0008, 0x41c: 0xe00d, 0x41d: 0x0008, + 0x41e: 0xe00d, 0x41f: 0x0008, 0x420: 0xe00d, 0x421: 0x0008, 0x422: 0xe00d, 0x423: 0x0008, + 0x424: 0xe00d, 0x425: 0x0008, 0x426: 0xe00d, 0x427: 0x0008, 0x428: 0xe00d, 0x429: 0x0008, + 0x42a: 0xe00d, 0x42b: 0x0008, 0x42c: 0xe00d, 0x42d: 0x0008, 0x42e: 0xe00d, 0x42f: 0x0008, + 0x430: 0x0040, 0x431: 0x03f5, 0x432: 0x03f5, 0x433: 0x03f5, 0x434: 0x03f5, 0x435: 0x03f5, + 0x436: 0x03f5, 0x437: 0x03f5, 0x438: 0x03f5, 0x439: 0x03f5, 0x43a: 0x03f5, 0x43b: 0x03f5, + 0x43c: 0x03f5, 0x43d: 0x03f5, 0x43e: 0x03f5, 0x43f: 0x03f5, + // Block 0x11, offset 0x440 + 0x440: 0x0040, 0x441: 0x0040, 0x442: 0x0040, 0x443: 0x0040, 0x444: 0x0040, 0x445: 0x0040, + 0x446: 0x0018, 0x447: 0x0018, 0x448: 0x0018, 0x449: 0x0018, 0x44a: 0x0018, 0x44b: 0x0018, + 0x44c: 0x0018, 0x44d: 0x0018, 0x44e: 0x0018, 0x44f: 0x0018, 0x450: 0x1308, 0x451: 0x1308, + 0x452: 0x1308, 0x453: 0x1308, 0x454: 0x1308, 0x455: 0x1308, 0x456: 0x1308, 0x457: 0x1308, + 0x458: 0x1308, 0x459: 0x1308, 0x45a: 0x1308, 0x45b: 0x0018, 0x45c: 0x0340, 0x45d: 0x0040, + 0x45e: 0x0018, 0x45f: 0x0018, 0x460: 0x0208, 0x461: 0x0008, 0x462: 0x0408, 0x463: 0x0408, + 0x464: 0x0408, 0x465: 0x0408, 0x466: 0x0208, 0x467: 0x0408, 0x468: 0x0208, 0x469: 0x0408, + 0x46a: 0x0208, 0x46b: 0x0208, 0x46c: 0x0208, 0x46d: 0x0208, 0x46e: 0x0208, 0x46f: 0x0408, + 0x470: 0x0408, 0x471: 0x0408, 0x472: 0x0408, 0x473: 0x0208, 0x474: 0x0208, 0x475: 0x0208, + 0x476: 0x0208, 0x477: 0x0208, 0x478: 0x0208, 0x479: 0x0208, 0x47a: 0x0208, 0x47b: 0x0208, + 0x47c: 0x0208, 0x47d: 0x0208, 0x47e: 0x0208, 0x47f: 0x0208, + // Block 0x12, offset 0x480 + 0x480: 0x0408, 0x481: 0x0208, 0x482: 0x0208, 0x483: 0x0408, 0x484: 0x0408, 0x485: 0x0408, + 0x486: 0x0408, 0x487: 0x0408, 0x488: 0x0408, 0x489: 0x0408, 0x48a: 0x0408, 0x48b: 0x0408, + 0x48c: 0x0208, 0x48d: 0x0408, 0x48e: 0x0208, 0x48f: 0x0408, 0x490: 0x0208, 0x491: 0x0208, + 0x492: 0x0408, 0x493: 0x0408, 0x494: 0x0018, 0x495: 0x0408, 0x496: 0x1308, 0x497: 0x1308, + 0x498: 0x1308, 0x499: 0x1308, 0x49a: 0x1308, 0x49b: 0x1308, 0x49c: 0x1308, 0x49d: 0x0040, + 0x49e: 0x0018, 0x49f: 0x1308, 0x4a0: 0x1308, 0x4a1: 0x1308, 0x4a2: 0x1308, 0x4a3: 0x1308, + 0x4a4: 0x1308, 0x4a5: 0x0008, 0x4a6: 0x0008, 0x4a7: 0x1308, 0x4a8: 0x1308, 0x4a9: 0x0018, + 0x4aa: 0x1308, 0x4ab: 0x1308, 0x4ac: 0x1308, 0x4ad: 0x1308, 0x4ae: 0x0408, 0x4af: 0x0408, + 0x4b0: 0x0008, 0x4b1: 0x0008, 0x4b2: 0x0008, 0x4b3: 0x0008, 0x4b4: 0x0008, 0x4b5: 0x0008, + 0x4b6: 0x0008, 0x4b7: 0x0008, 0x4b8: 0x0008, 0x4b9: 0x0008, 0x4ba: 0x0208, 0x4bb: 0x0208, + 0x4bc: 0x0208, 0x4bd: 0x0008, 0x4be: 0x0008, 0x4bf: 0x0208, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x0018, 0x4c1: 0x0018, 0x4c2: 0x0018, 0x4c3: 0x0018, 0x4c4: 0x0018, 0x4c5: 0x0018, + 0x4c6: 0x0018, 0x4c7: 0x0018, 0x4c8: 0x0018, 0x4c9: 0x0018, 0x4ca: 0x0018, 0x4cb: 0x0018, + 0x4cc: 0x0018, 0x4cd: 0x0018, 0x4ce: 0x0040, 0x4cf: 0x0340, 0x4d0: 0x0408, 0x4d1: 0x1308, + 0x4d2: 0x0208, 0x4d3: 0x0208, 0x4d4: 0x0208, 0x4d5: 0x0408, 0x4d6: 0x0408, 0x4d7: 0x0408, + 0x4d8: 0x0408, 0x4d9: 0x0408, 0x4da: 0x0208, 0x4db: 0x0208, 0x4dc: 0x0208, 0x4dd: 0x0208, + 0x4de: 0x0408, 0x4df: 0x0208, 0x4e0: 0x0208, 0x4e1: 0x0208, 0x4e2: 0x0208, 0x4e3: 0x0208, + 0x4e4: 0x0208, 0x4e5: 0x0208, 0x4e6: 0x0208, 0x4e7: 0x0208, 0x4e8: 0x0408, 0x4e9: 0x0208, + 0x4ea: 0x0408, 0x4eb: 0x0208, 0x4ec: 0x0408, 0x4ed: 0x0208, 0x4ee: 0x0208, 0x4ef: 0x0408, + 0x4f0: 0x1308, 0x4f1: 0x1308, 0x4f2: 0x1308, 0x4f3: 0x1308, 0x4f4: 0x1308, 0x4f5: 0x1308, + 0x4f6: 0x1308, 0x4f7: 0x1308, 0x4f8: 0x1308, 0x4f9: 0x1308, 0x4fa: 0x1308, 0x4fb: 0x1308, + 0x4fc: 0x1308, 0x4fd: 0x1308, 0x4fe: 0x1308, 0x4ff: 0x1308, + // Block 0x14, offset 0x500 + 0x500: 0x1008, 0x501: 0x1308, 0x502: 0x1308, 0x503: 0x1308, 0x504: 0x1308, 0x505: 0x1308, + 0x506: 0x1308, 0x507: 0x1308, 0x508: 0x1308, 0x509: 0x1008, 0x50a: 0x1008, 0x50b: 0x1008, + 0x50c: 0x1008, 0x50d: 0x1b08, 0x50e: 0x1008, 0x50f: 0x1008, 0x510: 0x0008, 0x511: 0x1308, + 0x512: 0x1308, 0x513: 0x1308, 0x514: 0x1308, 0x515: 0x1308, 0x516: 0x1308, 0x517: 0x1308, + 0x518: 0x04c9, 0x519: 0x0501, 0x51a: 0x0539, 0x51b: 0x0571, 0x51c: 0x05a9, 0x51d: 0x05e1, + 0x51e: 0x0619, 0x51f: 0x0651, 0x520: 0x0008, 0x521: 0x0008, 0x522: 0x1308, 0x523: 0x1308, + 0x524: 0x0018, 0x525: 0x0018, 0x526: 0x0008, 0x527: 0x0008, 0x528: 0x0008, 0x529: 0x0008, + 0x52a: 0x0008, 0x52b: 0x0008, 0x52c: 0x0008, 0x52d: 0x0008, 0x52e: 0x0008, 0x52f: 0x0008, + 0x530: 0x0018, 0x531: 0x0008, 0x532: 0x0008, 0x533: 0x0008, 0x534: 0x0008, 0x535: 0x0008, + 0x536: 0x0008, 0x537: 0x0008, 0x538: 0x0008, 0x539: 0x0008, 0x53a: 0x0008, 0x53b: 0x0008, + 0x53c: 0x0008, 0x53d: 0x0008, 0x53e: 0x0008, 0x53f: 0x0008, + // Block 0x15, offset 0x540 + 0x540: 0x0008, 0x541: 0x1308, 0x542: 0x1008, 0x543: 0x1008, 0x544: 0x0040, 0x545: 0x0008, + 0x546: 0x0008, 0x547: 0x0008, 0x548: 0x0008, 0x549: 0x0008, 0x54a: 0x0008, 0x54b: 0x0008, + 0x54c: 0x0008, 0x54d: 0x0040, 0x54e: 0x0040, 0x54f: 0x0008, 0x550: 0x0008, 0x551: 0x0040, + 0x552: 0x0040, 0x553: 0x0008, 0x554: 0x0008, 0x555: 0x0008, 0x556: 0x0008, 0x557: 0x0008, + 0x558: 0x0008, 0x559: 0x0008, 0x55a: 0x0008, 0x55b: 0x0008, 0x55c: 0x0008, 0x55d: 0x0008, + 0x55e: 0x0008, 0x55f: 0x0008, 0x560: 0x0008, 0x561: 0x0008, 0x562: 0x0008, 0x563: 0x0008, + 0x564: 0x0008, 0x565: 0x0008, 0x566: 0x0008, 0x567: 0x0008, 0x568: 0x0008, 0x569: 0x0040, + 0x56a: 0x0008, 0x56b: 0x0008, 0x56c: 0x0008, 0x56d: 0x0008, 0x56e: 0x0008, 0x56f: 0x0008, + 0x570: 0x0008, 0x571: 0x0040, 0x572: 0x0008, 0x573: 0x0040, 0x574: 0x0040, 0x575: 0x0040, + 0x576: 0x0008, 0x577: 0x0008, 0x578: 0x0008, 0x579: 0x0008, 0x57a: 0x0040, 0x57b: 0x0040, + 0x57c: 0x1308, 0x57d: 0x0008, 0x57e: 0x1008, 0x57f: 0x1008, + // Block 0x16, offset 0x580 + 0x580: 0x1008, 0x581: 0x1308, 0x582: 0x1308, 0x583: 0x1308, 0x584: 0x1308, 0x585: 0x0040, + 0x586: 0x0040, 0x587: 0x1008, 0x588: 0x1008, 0x589: 0x0040, 0x58a: 0x0040, 0x58b: 0x1008, + 0x58c: 0x1008, 0x58d: 0x1b08, 0x58e: 0x0008, 0x58f: 0x0040, 0x590: 0x0040, 0x591: 0x0040, + 0x592: 0x0040, 0x593: 0x0040, 0x594: 0x0040, 0x595: 0x0040, 0x596: 0x0040, 0x597: 0x1008, + 0x598: 0x0040, 0x599: 0x0040, 0x59a: 0x0040, 0x59b: 0x0040, 0x59c: 0x0689, 0x59d: 0x06c1, + 0x59e: 0x0040, 0x59f: 0x06f9, 0x5a0: 0x0008, 0x5a1: 0x0008, 0x5a2: 0x1308, 0x5a3: 0x1308, + 0x5a4: 0x0040, 0x5a5: 0x0040, 0x5a6: 0x0008, 0x5a7: 0x0008, 0x5a8: 0x0008, 0x5a9: 0x0008, + 0x5aa: 0x0008, 0x5ab: 0x0008, 0x5ac: 0x0008, 0x5ad: 0x0008, 0x5ae: 0x0008, 0x5af: 0x0008, + 0x5b0: 0x0008, 0x5b1: 0x0008, 0x5b2: 0x0018, 0x5b3: 0x0018, 0x5b4: 0x0018, 0x5b5: 0x0018, + 0x5b6: 0x0018, 0x5b7: 0x0018, 0x5b8: 0x0018, 0x5b9: 0x0018, 0x5ba: 0x0018, 0x5bb: 0x0018, + 0x5bc: 0x0040, 0x5bd: 0x0040, 0x5be: 0x0040, 0x5bf: 0x0040, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x0040, 0x5c1: 0x1308, 0x5c2: 0x1308, 0x5c3: 0x1008, 0x5c4: 0x0040, 0x5c5: 0x0008, + 0x5c6: 0x0008, 0x5c7: 0x0008, 0x5c8: 0x0008, 0x5c9: 0x0008, 0x5ca: 0x0008, 0x5cb: 0x0040, + 0x5cc: 0x0040, 0x5cd: 0x0040, 0x5ce: 0x0040, 0x5cf: 0x0008, 0x5d0: 0x0008, 0x5d1: 0x0040, + 0x5d2: 0x0040, 0x5d3: 0x0008, 0x5d4: 0x0008, 0x5d5: 0x0008, 0x5d6: 0x0008, 0x5d7: 0x0008, + 0x5d8: 0x0008, 0x5d9: 0x0008, 0x5da: 0x0008, 0x5db: 0x0008, 0x5dc: 0x0008, 0x5dd: 0x0008, + 0x5de: 0x0008, 0x5df: 0x0008, 0x5e0: 0x0008, 0x5e1: 0x0008, 0x5e2: 0x0008, 0x5e3: 0x0008, + 0x5e4: 0x0008, 0x5e5: 0x0008, 0x5e6: 0x0008, 0x5e7: 0x0008, 0x5e8: 0x0008, 0x5e9: 0x0040, + 0x5ea: 0x0008, 0x5eb: 0x0008, 0x5ec: 0x0008, 0x5ed: 0x0008, 0x5ee: 0x0008, 0x5ef: 0x0008, + 0x5f0: 0x0008, 0x5f1: 0x0040, 0x5f2: 0x0008, 0x5f3: 0x0731, 0x5f4: 0x0040, 0x5f5: 0x0008, + 0x5f6: 0x0769, 0x5f7: 0x0040, 0x5f8: 0x0008, 0x5f9: 0x0008, 0x5fa: 0x0040, 0x5fb: 0x0040, + 0x5fc: 0x1308, 0x5fd: 0x0040, 0x5fe: 0x1008, 0x5ff: 0x1008, + // Block 0x18, offset 0x600 + 0x600: 0x1008, 0x601: 0x1308, 0x602: 0x1308, 0x603: 0x0040, 0x604: 0x0040, 0x605: 0x0040, + 0x606: 0x0040, 0x607: 0x1308, 0x608: 0x1308, 0x609: 0x0040, 0x60a: 0x0040, 0x60b: 0x1308, + 0x60c: 0x1308, 0x60d: 0x1b08, 0x60e: 0x0040, 0x60f: 0x0040, 0x610: 0x0040, 0x611: 0x1308, + 0x612: 0x0040, 0x613: 0x0040, 0x614: 0x0040, 0x615: 0x0040, 0x616: 0x0040, 0x617: 0x0040, + 0x618: 0x0040, 0x619: 0x07a1, 0x61a: 0x07d9, 0x61b: 0x0811, 0x61c: 0x0008, 0x61d: 0x0040, + 0x61e: 0x0849, 0x61f: 0x0040, 0x620: 0x0040, 0x621: 0x0040, 0x622: 0x0040, 0x623: 0x0040, + 0x624: 0x0040, 0x625: 0x0040, 0x626: 0x0008, 0x627: 0x0008, 0x628: 0x0008, 0x629: 0x0008, + 0x62a: 0x0008, 0x62b: 0x0008, 0x62c: 0x0008, 0x62d: 0x0008, 0x62e: 0x0008, 0x62f: 0x0008, + 0x630: 0x1308, 0x631: 0x1308, 0x632: 0x0008, 0x633: 0x0008, 0x634: 0x0008, 0x635: 0x1308, + 0x636: 0x0040, 0x637: 0x0040, 0x638: 0x0040, 0x639: 0x0040, 0x63a: 0x0040, 0x63b: 0x0040, + 0x63c: 0x0040, 0x63d: 0x0040, 0x63e: 0x0040, 0x63f: 0x0040, + // Block 0x19, offset 0x640 + 0x640: 0x0040, 0x641: 0x1308, 0x642: 0x1308, 0x643: 0x1008, 0x644: 0x0040, 0x645: 0x0008, + 0x646: 0x0008, 0x647: 0x0008, 0x648: 0x0008, 0x649: 0x0008, 0x64a: 0x0008, 0x64b: 0x0008, + 0x64c: 0x0008, 0x64d: 0x0008, 0x64e: 0x0040, 0x64f: 0x0008, 0x650: 0x0008, 0x651: 0x0008, + 0x652: 0x0040, 0x653: 0x0008, 0x654: 0x0008, 0x655: 0x0008, 0x656: 0x0008, 0x657: 0x0008, + 0x658: 0x0008, 0x659: 0x0008, 0x65a: 0x0008, 0x65b: 0x0008, 0x65c: 0x0008, 0x65d: 0x0008, + 0x65e: 0x0008, 0x65f: 0x0008, 0x660: 0x0008, 0x661: 0x0008, 0x662: 0x0008, 0x663: 0x0008, + 0x664: 0x0008, 0x665: 0x0008, 0x666: 0x0008, 0x667: 0x0008, 0x668: 0x0008, 0x669: 0x0040, + 0x66a: 0x0008, 0x66b: 0x0008, 0x66c: 0x0008, 0x66d: 0x0008, 0x66e: 0x0008, 0x66f: 0x0008, + 0x670: 0x0008, 0x671: 0x0040, 0x672: 0x0008, 0x673: 0x0008, 0x674: 0x0040, 0x675: 0x0008, + 0x676: 0x0008, 0x677: 0x0008, 0x678: 0x0008, 0x679: 0x0008, 0x67a: 0x0040, 0x67b: 0x0040, + 0x67c: 0x1308, 0x67d: 0x0008, 0x67e: 0x1008, 0x67f: 0x1008, + // Block 0x1a, offset 0x680 + 0x680: 0x1008, 0x681: 0x1308, 0x682: 0x1308, 0x683: 0x1308, 0x684: 0x1308, 0x685: 0x1308, + 0x686: 0x0040, 0x687: 0x1308, 0x688: 0x1308, 0x689: 0x1008, 0x68a: 0x0040, 0x68b: 0x1008, + 0x68c: 0x1008, 0x68d: 0x1b08, 0x68e: 0x0040, 0x68f: 0x0040, 0x690: 0x0008, 0x691: 0x0040, + 0x692: 0x0040, 0x693: 0x0040, 0x694: 0x0040, 0x695: 0x0040, 0x696: 0x0040, 0x697: 0x0040, + 0x698: 0x0040, 0x699: 0x0040, 0x69a: 0x0040, 0x69b: 0x0040, 0x69c: 0x0040, 0x69d: 0x0040, + 0x69e: 0x0040, 0x69f: 0x0040, 0x6a0: 0x0008, 0x6a1: 0x0008, 0x6a2: 0x1308, 0x6a3: 0x1308, + 0x6a4: 0x0040, 0x6a5: 0x0040, 0x6a6: 0x0008, 0x6a7: 0x0008, 0x6a8: 0x0008, 0x6a9: 0x0008, + 0x6aa: 0x0008, 0x6ab: 0x0008, 0x6ac: 0x0008, 0x6ad: 0x0008, 0x6ae: 0x0008, 0x6af: 0x0008, + 0x6b0: 0x0018, 0x6b1: 0x0018, 0x6b2: 0x0040, 0x6b3: 0x0040, 0x6b4: 0x0040, 0x6b5: 0x0040, + 0x6b6: 0x0040, 0x6b7: 0x0040, 0x6b8: 0x0040, 0x6b9: 0x0008, 0x6ba: 0x0040, 0x6bb: 0x0040, + 0x6bc: 0x0040, 0x6bd: 0x0040, 0x6be: 0x0040, 0x6bf: 0x0040, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0x0040, 0x6c1: 0x1308, 0x6c2: 0x1008, 0x6c3: 0x1008, 0x6c4: 0x0040, 0x6c5: 0x0008, + 0x6c6: 0x0008, 0x6c7: 0x0008, 0x6c8: 0x0008, 0x6c9: 0x0008, 0x6ca: 0x0008, 0x6cb: 0x0008, + 0x6cc: 0x0008, 0x6cd: 0x0040, 0x6ce: 0x0040, 0x6cf: 0x0008, 0x6d0: 0x0008, 0x6d1: 0x0040, + 0x6d2: 0x0040, 0x6d3: 0x0008, 0x6d4: 0x0008, 0x6d5: 0x0008, 0x6d6: 0x0008, 0x6d7: 0x0008, + 0x6d8: 0x0008, 0x6d9: 0x0008, 0x6da: 0x0008, 0x6db: 0x0008, 0x6dc: 0x0008, 0x6dd: 0x0008, + 0x6de: 0x0008, 0x6df: 0x0008, 0x6e0: 0x0008, 0x6e1: 0x0008, 0x6e2: 0x0008, 0x6e3: 0x0008, + 0x6e4: 0x0008, 0x6e5: 0x0008, 0x6e6: 0x0008, 0x6e7: 0x0008, 0x6e8: 0x0008, 0x6e9: 0x0040, + 0x6ea: 0x0008, 0x6eb: 0x0008, 0x6ec: 0x0008, 0x6ed: 0x0008, 0x6ee: 0x0008, 0x6ef: 0x0008, + 0x6f0: 0x0008, 0x6f1: 0x0040, 0x6f2: 0x0008, 0x6f3: 0x0008, 0x6f4: 0x0040, 0x6f5: 0x0008, + 0x6f6: 0x0008, 0x6f7: 0x0008, 0x6f8: 0x0008, 0x6f9: 0x0008, 0x6fa: 0x0040, 0x6fb: 0x0040, + 0x6fc: 0x1308, 0x6fd: 0x0008, 0x6fe: 0x1008, 0x6ff: 0x1308, + // Block 0x1c, offset 0x700 + 0x700: 0x1008, 0x701: 0x1308, 0x702: 0x1308, 0x703: 0x1308, 0x704: 0x1308, 0x705: 0x0040, + 0x706: 0x0040, 0x707: 0x1008, 0x708: 0x1008, 0x709: 0x0040, 0x70a: 0x0040, 0x70b: 0x1008, + 0x70c: 0x1008, 0x70d: 0x1b08, 0x70e: 0x0040, 0x70f: 0x0040, 0x710: 0x0040, 0x711: 0x0040, + 0x712: 0x0040, 0x713: 0x0040, 0x714: 0x0040, 0x715: 0x0040, 0x716: 0x1308, 0x717: 0x1008, + 0x718: 0x0040, 0x719: 0x0040, 0x71a: 0x0040, 0x71b: 0x0040, 0x71c: 0x0881, 0x71d: 0x08b9, + 0x71e: 0x0040, 0x71f: 0x0008, 0x720: 0x0008, 0x721: 0x0008, 0x722: 0x1308, 0x723: 0x1308, + 0x724: 0x0040, 0x725: 0x0040, 0x726: 0x0008, 0x727: 0x0008, 0x728: 0x0008, 0x729: 0x0008, + 0x72a: 0x0008, 0x72b: 0x0008, 0x72c: 0x0008, 0x72d: 0x0008, 0x72e: 0x0008, 0x72f: 0x0008, + 0x730: 0x0018, 0x731: 0x0008, 0x732: 0x0018, 0x733: 0x0018, 0x734: 0x0018, 0x735: 0x0018, + 0x736: 0x0018, 0x737: 0x0018, 0x738: 0x0040, 0x739: 0x0040, 0x73a: 0x0040, 0x73b: 0x0040, + 0x73c: 0x0040, 0x73d: 0x0040, 0x73e: 0x0040, 0x73f: 0x0040, + // Block 0x1d, offset 0x740 + 0x740: 0x0040, 0x741: 0x0040, 0x742: 0x1308, 0x743: 0x0008, 0x744: 0x0040, 0x745: 0x0008, + 0x746: 0x0008, 0x747: 0x0008, 0x748: 0x0008, 0x749: 0x0008, 0x74a: 0x0008, 0x74b: 0x0040, + 0x74c: 0x0040, 0x74d: 0x0040, 0x74e: 0x0008, 0x74f: 0x0008, 0x750: 0x0008, 0x751: 0x0040, + 0x752: 0x0008, 0x753: 0x0008, 0x754: 0x0008, 0x755: 0x0008, 0x756: 0x0040, 0x757: 0x0040, + 0x758: 0x0040, 0x759: 0x0008, 0x75a: 0x0008, 0x75b: 0x0040, 0x75c: 0x0008, 0x75d: 0x0040, + 0x75e: 0x0008, 0x75f: 0x0008, 0x760: 0x0040, 0x761: 0x0040, 0x762: 0x0040, 0x763: 0x0008, + 0x764: 0x0008, 0x765: 0x0040, 0x766: 0x0040, 0x767: 0x0040, 0x768: 0x0008, 0x769: 0x0008, + 0x76a: 0x0008, 0x76b: 0x0040, 0x76c: 0x0040, 0x76d: 0x0040, 0x76e: 0x0008, 0x76f: 0x0008, + 0x770: 0x0008, 0x771: 0x0008, 0x772: 0x0008, 0x773: 0x0008, 0x774: 0x0008, 0x775: 0x0008, + 0x776: 0x0008, 0x777: 0x0008, 0x778: 0x0008, 0x779: 0x0008, 0x77a: 0x0040, 0x77b: 0x0040, + 0x77c: 0x0040, 0x77d: 0x0040, 0x77e: 0x1008, 0x77f: 0x1008, + // Block 0x1e, offset 0x780 + 0x780: 0x1308, 0x781: 0x1008, 0x782: 0x1008, 0x783: 0x1008, 0x784: 0x1008, 0x785: 0x0040, + 0x786: 0x1308, 0x787: 0x1308, 0x788: 0x1308, 0x789: 0x0040, 0x78a: 0x1308, 0x78b: 0x1308, + 0x78c: 0x1308, 0x78d: 0x1b08, 0x78e: 0x0040, 0x78f: 0x0040, 0x790: 0x0040, 0x791: 0x0040, + 0x792: 0x0040, 0x793: 0x0040, 0x794: 0x0040, 0x795: 0x1308, 0x796: 0x1308, 0x797: 0x0040, + 0x798: 0x0008, 0x799: 0x0008, 0x79a: 0x0008, 0x79b: 0x0040, 0x79c: 0x0040, 0x79d: 0x0040, + 0x79e: 0x0040, 0x79f: 0x0040, 0x7a0: 0x0008, 0x7a1: 0x0008, 0x7a2: 0x1308, 0x7a3: 0x1308, + 0x7a4: 0x0040, 0x7a5: 0x0040, 0x7a6: 0x0008, 0x7a7: 0x0008, 0x7a8: 0x0008, 0x7a9: 0x0008, + 0x7aa: 0x0008, 0x7ab: 0x0008, 0x7ac: 0x0008, 0x7ad: 0x0008, 0x7ae: 0x0008, 0x7af: 0x0008, + 0x7b0: 0x0040, 0x7b1: 0x0040, 0x7b2: 0x0040, 0x7b3: 0x0040, 0x7b4: 0x0040, 0x7b5: 0x0040, + 0x7b6: 0x0040, 0x7b7: 0x0040, 0x7b8: 0x0018, 0x7b9: 0x0018, 0x7ba: 0x0018, 0x7bb: 0x0018, + 0x7bc: 0x0018, 0x7bd: 0x0018, 0x7be: 0x0018, 0x7bf: 0x0018, + // Block 0x1f, offset 0x7c0 + 0x7c0: 0x0008, 0x7c1: 0x1308, 0x7c2: 0x1008, 0x7c3: 0x1008, 0x7c4: 0x0040, 0x7c5: 0x0008, + 0x7c6: 0x0008, 0x7c7: 0x0008, 0x7c8: 0x0008, 0x7c9: 0x0008, 0x7ca: 0x0008, 0x7cb: 0x0008, + 0x7cc: 0x0008, 0x7cd: 0x0040, 0x7ce: 0x0008, 0x7cf: 0x0008, 0x7d0: 0x0008, 0x7d1: 0x0040, + 0x7d2: 0x0008, 0x7d3: 0x0008, 0x7d4: 0x0008, 0x7d5: 0x0008, 0x7d6: 0x0008, 0x7d7: 0x0008, + 0x7d8: 0x0008, 0x7d9: 0x0008, 0x7da: 0x0008, 0x7db: 0x0008, 0x7dc: 0x0008, 0x7dd: 0x0008, + 0x7de: 0x0008, 0x7df: 0x0008, 0x7e0: 0x0008, 0x7e1: 0x0008, 0x7e2: 0x0008, 0x7e3: 0x0008, + 0x7e4: 0x0008, 0x7e5: 0x0008, 0x7e6: 0x0008, 0x7e7: 0x0008, 0x7e8: 0x0008, 0x7e9: 0x0040, + 0x7ea: 0x0008, 0x7eb: 0x0008, 0x7ec: 0x0008, 0x7ed: 0x0008, 0x7ee: 0x0008, 0x7ef: 0x0008, + 0x7f0: 0x0008, 0x7f1: 0x0008, 0x7f2: 0x0008, 0x7f3: 0x0008, 0x7f4: 0x0040, 0x7f5: 0x0008, + 0x7f6: 0x0008, 0x7f7: 0x0008, 0x7f8: 0x0008, 0x7f9: 0x0008, 0x7fa: 0x0040, 0x7fb: 0x0040, + 0x7fc: 0x1308, 0x7fd: 0x0008, 0x7fe: 0x1008, 0x7ff: 0x1308, + // Block 0x20, offset 0x800 + 0x800: 0x1008, 0x801: 0x1008, 0x802: 0x1008, 0x803: 0x1008, 0x804: 0x1008, 0x805: 0x0040, + 0x806: 0x1308, 0x807: 0x1008, 0x808: 0x1008, 0x809: 0x0040, 0x80a: 0x1008, 0x80b: 0x1008, + 0x80c: 0x1308, 0x80d: 0x1b08, 0x80e: 0x0040, 0x80f: 0x0040, 0x810: 0x0040, 0x811: 0x0040, + 0x812: 0x0040, 0x813: 0x0040, 0x814: 0x0040, 0x815: 0x1008, 0x816: 0x1008, 0x817: 0x0040, + 0x818: 0x0040, 0x819: 0x0040, 0x81a: 0x0040, 0x81b: 0x0040, 0x81c: 0x0040, 0x81d: 0x0040, + 0x81e: 0x0008, 0x81f: 0x0040, 0x820: 0x0008, 0x821: 0x0008, 0x822: 0x1308, 0x823: 0x1308, + 0x824: 0x0040, 0x825: 0x0040, 0x826: 0x0008, 0x827: 0x0008, 0x828: 0x0008, 0x829: 0x0008, + 0x82a: 0x0008, 0x82b: 0x0008, 0x82c: 0x0008, 0x82d: 0x0008, 0x82e: 0x0008, 0x82f: 0x0008, + 0x830: 0x0040, 0x831: 0x0008, 0x832: 0x0008, 0x833: 0x0040, 0x834: 0x0040, 0x835: 0x0040, + 0x836: 0x0040, 0x837: 0x0040, 0x838: 0x0040, 0x839: 0x0040, 0x83a: 0x0040, 0x83b: 0x0040, + 0x83c: 0x0040, 0x83d: 0x0040, 0x83e: 0x0040, 0x83f: 0x0040, + // Block 0x21, offset 0x840 + 0x840: 0x1008, 0x841: 0x1308, 0x842: 0x1308, 0x843: 0x1308, 0x844: 0x1308, 0x845: 0x0040, + 0x846: 0x1008, 0x847: 0x1008, 0x848: 0x1008, 0x849: 0x0040, 0x84a: 0x1008, 0x84b: 0x1008, + 0x84c: 0x1008, 0x84d: 0x1b08, 0x84e: 0x0008, 0x84f: 0x0018, 0x850: 0x0040, 0x851: 0x0040, + 0x852: 0x0040, 0x853: 0x0040, 0x854: 0x0008, 0x855: 0x0008, 0x856: 0x0008, 0x857: 0x1008, + 0x858: 0x0018, 0x859: 0x0018, 0x85a: 0x0018, 0x85b: 0x0018, 0x85c: 0x0018, 0x85d: 0x0018, + 0x85e: 0x0018, 0x85f: 0x0008, 0x860: 0x0008, 0x861: 0x0008, 0x862: 0x1308, 0x863: 0x1308, + 0x864: 0x0040, 0x865: 0x0040, 0x866: 0x0008, 0x867: 0x0008, 0x868: 0x0008, 0x869: 0x0008, + 0x86a: 0x0008, 0x86b: 0x0008, 0x86c: 0x0008, 0x86d: 0x0008, 0x86e: 0x0008, 0x86f: 0x0008, + 0x870: 0x0018, 0x871: 0x0018, 0x872: 0x0018, 0x873: 0x0018, 0x874: 0x0018, 0x875: 0x0018, + 0x876: 0x0018, 0x877: 0x0018, 0x878: 0x0018, 0x879: 0x0018, 0x87a: 0x0008, 0x87b: 0x0008, + 0x87c: 0x0008, 0x87d: 0x0008, 0x87e: 0x0008, 0x87f: 0x0008, + // Block 0x22, offset 0x880 + 0x880: 0x0040, 0x881: 0x0008, 0x882: 0x0008, 0x883: 0x0040, 0x884: 0x0008, 0x885: 0x0040, + 0x886: 0x0040, 0x887: 0x0008, 0x888: 0x0008, 0x889: 0x0040, 0x88a: 0x0008, 0x88b: 0x0040, + 0x88c: 0x0040, 0x88d: 0x0008, 0x88e: 0x0040, 0x88f: 0x0040, 0x890: 0x0040, 0x891: 0x0040, + 0x892: 0x0040, 0x893: 0x0040, 0x894: 0x0008, 0x895: 0x0008, 0x896: 0x0008, 0x897: 0x0008, + 0x898: 0x0040, 0x899: 0x0008, 0x89a: 0x0008, 0x89b: 0x0008, 0x89c: 0x0008, 0x89d: 0x0008, + 0x89e: 0x0008, 0x89f: 0x0008, 0x8a0: 0x0040, 0x8a1: 0x0008, 0x8a2: 0x0008, 0x8a3: 0x0008, + 0x8a4: 0x0040, 0x8a5: 0x0008, 0x8a6: 0x0040, 0x8a7: 0x0008, 0x8a8: 0x0040, 0x8a9: 0x0040, + 0x8aa: 0x0008, 0x8ab: 0x0008, 0x8ac: 0x0040, 0x8ad: 0x0008, 0x8ae: 0x0008, 0x8af: 0x0008, + 0x8b0: 0x0008, 0x8b1: 0x1308, 0x8b2: 0x0008, 0x8b3: 0x0929, 0x8b4: 0x1308, 0x8b5: 0x1308, + 0x8b6: 0x1308, 0x8b7: 0x1308, 0x8b8: 0x1308, 0x8b9: 0x1308, 0x8ba: 0x0040, 0x8bb: 0x1308, + 0x8bc: 0x1308, 0x8bd: 0x0008, 0x8be: 0x0040, 0x8bf: 0x0040, + // Block 0x23, offset 0x8c0 + 0x8c0: 0x0008, 0x8c1: 0x0008, 0x8c2: 0x0008, 0x8c3: 0x09d1, 0x8c4: 0x0008, 0x8c5: 0x0008, + 0x8c6: 0x0008, 0x8c7: 0x0008, 0x8c8: 0x0040, 0x8c9: 0x0008, 0x8ca: 0x0008, 0x8cb: 0x0008, + 0x8cc: 0x0008, 0x8cd: 0x0a09, 0x8ce: 0x0008, 0x8cf: 0x0008, 0x8d0: 0x0008, 0x8d1: 0x0008, + 0x8d2: 0x0a41, 0x8d3: 0x0008, 0x8d4: 0x0008, 0x8d5: 0x0008, 0x8d6: 0x0008, 0x8d7: 0x0a79, + 0x8d8: 0x0008, 0x8d9: 0x0008, 0x8da: 0x0008, 0x8db: 0x0008, 0x8dc: 0x0ab1, 0x8dd: 0x0008, + 0x8de: 0x0008, 0x8df: 0x0008, 0x8e0: 0x0008, 0x8e1: 0x0008, 0x8e2: 0x0008, 0x8e3: 0x0008, + 0x8e4: 0x0008, 0x8e5: 0x0008, 0x8e6: 0x0008, 0x8e7: 0x0008, 0x8e8: 0x0008, 0x8e9: 0x0ae9, + 0x8ea: 0x0008, 0x8eb: 0x0008, 0x8ec: 0x0008, 0x8ed: 0x0040, 0x8ee: 0x0040, 0x8ef: 0x0040, + 0x8f0: 0x0040, 0x8f1: 0x1308, 0x8f2: 0x1308, 0x8f3: 0x0b21, 0x8f4: 0x1308, 0x8f5: 0x0b59, + 0x8f6: 0x0b91, 0x8f7: 0x0bc9, 0x8f8: 0x0c19, 0x8f9: 0x0c51, 0x8fa: 0x1308, 0x8fb: 0x1308, + 0x8fc: 0x1308, 0x8fd: 0x1308, 0x8fe: 0x1308, 0x8ff: 0x1008, + // Block 0x24, offset 0x900 + 0x900: 0x1308, 0x901: 0x0ca1, 0x902: 0x1308, 0x903: 0x1308, 0x904: 0x1b08, 0x905: 0x0018, + 0x906: 0x1308, 0x907: 0x1308, 0x908: 0x0008, 0x909: 0x0008, 0x90a: 0x0008, 0x90b: 0x0008, + 0x90c: 0x0008, 0x90d: 0x1308, 0x90e: 0x1308, 0x90f: 0x1308, 0x910: 0x1308, 0x911: 0x1308, + 0x912: 0x1308, 0x913: 0x0cd9, 0x914: 0x1308, 0x915: 0x1308, 0x916: 0x1308, 0x917: 0x1308, + 0x918: 0x0040, 0x919: 0x1308, 0x91a: 0x1308, 0x91b: 0x1308, 0x91c: 0x1308, 0x91d: 0x0d11, + 0x91e: 0x1308, 0x91f: 0x1308, 0x920: 0x1308, 0x921: 0x1308, 0x922: 0x0d49, 0x923: 0x1308, + 0x924: 0x1308, 0x925: 0x1308, 0x926: 0x1308, 0x927: 0x0d81, 0x928: 0x1308, 0x929: 0x1308, + 0x92a: 0x1308, 0x92b: 0x1308, 0x92c: 0x0db9, 0x92d: 0x1308, 0x92e: 0x1308, 0x92f: 0x1308, + 0x930: 0x1308, 0x931: 0x1308, 0x932: 0x1308, 0x933: 0x1308, 0x934: 0x1308, 0x935: 0x1308, + 0x936: 0x1308, 0x937: 0x1308, 0x938: 0x1308, 0x939: 0x0df1, 0x93a: 0x1308, 0x93b: 0x1308, + 0x93c: 0x1308, 0x93d: 0x0040, 0x93e: 0x0018, 0x93f: 0x0018, + // Block 0x25, offset 0x940 + 0x940: 0x0008, 0x941: 0x0008, 0x942: 0x0008, 0x943: 0x0008, 0x944: 0x0008, 0x945: 0x0008, + 0x946: 0x0008, 0x947: 0x0008, 0x948: 0x0008, 0x949: 0x0008, 0x94a: 0x0008, 0x94b: 0x0008, + 0x94c: 0x0008, 0x94d: 0x0008, 0x94e: 0x0008, 0x94f: 0x0008, 0x950: 0x0008, 0x951: 0x0008, + 0x952: 0x0008, 0x953: 0x0008, 0x954: 0x0008, 0x955: 0x0008, 0x956: 0x0008, 0x957: 0x0008, + 0x958: 0x0008, 0x959: 0x0008, 0x95a: 0x0008, 0x95b: 0x0008, 0x95c: 0x0008, 0x95d: 0x0008, + 0x95e: 0x0008, 0x95f: 0x0008, 0x960: 0x0008, 0x961: 0x0008, 0x962: 0x0008, 0x963: 0x0008, + 0x964: 0x0008, 0x965: 0x0008, 0x966: 0x0008, 0x967: 0x0008, 0x968: 0x0008, 0x969: 0x0008, + 0x96a: 0x0008, 0x96b: 0x0008, 0x96c: 0x0039, 0x96d: 0x0ed1, 0x96e: 0x0ee9, 0x96f: 0x0008, + 0x970: 0x0ef9, 0x971: 0x0f09, 0x972: 0x0f19, 0x973: 0x0f31, 0x974: 0x0249, 0x975: 0x0f41, + 0x976: 0x0259, 0x977: 0x0f51, 0x978: 0x0359, 0x979: 0x0f61, 0x97a: 0x0f71, 0x97b: 0x0008, + 0x97c: 0x00d9, 0x97d: 0x0f81, 0x97e: 0x0f99, 0x97f: 0x0269, + // Block 0x26, offset 0x980 + 0x980: 0x0fa9, 0x981: 0x0fb9, 0x982: 0x0279, 0x983: 0x0039, 0x984: 0x0fc9, 0x985: 0x0fe1, + 0x986: 0x059d, 0x987: 0x0ee9, 0x988: 0x0ef9, 0x989: 0x0f09, 0x98a: 0x0ff9, 0x98b: 0x1011, + 0x98c: 0x1029, 0x98d: 0x0f31, 0x98e: 0x0008, 0x98f: 0x0f51, 0x990: 0x0f61, 0x991: 0x1041, + 0x992: 0x00d9, 0x993: 0x1059, 0x994: 0x05b5, 0x995: 0x05b5, 0x996: 0x0f99, 0x997: 0x0fa9, + 0x998: 0x0fb9, 0x999: 0x059d, 0x99a: 0x1071, 0x99b: 0x1089, 0x99c: 0x05cd, 0x99d: 0x1099, + 0x99e: 0x10b1, 0x99f: 0x10c9, 0x9a0: 0x10e1, 0x9a1: 0x10f9, 0x9a2: 0x0f41, 0x9a3: 0x0269, + 0x9a4: 0x0fb9, 0x9a5: 0x1089, 0x9a6: 0x1099, 0x9a7: 0x10b1, 0x9a8: 0x1111, 0x9a9: 0x10e1, + 0x9aa: 0x10f9, 0x9ab: 0x0008, 0x9ac: 0x0008, 0x9ad: 0x0008, 0x9ae: 0x0008, 0x9af: 0x0008, + 0x9b0: 0x0008, 0x9b1: 0x0008, 0x9b2: 0x0008, 0x9b3: 0x0008, 0x9b4: 0x0008, 0x9b5: 0x0008, + 0x9b6: 0x0008, 0x9b7: 0x0008, 0x9b8: 0x1129, 0x9b9: 0x0008, 0x9ba: 0x0008, 0x9bb: 0x0008, + 0x9bc: 0x0008, 0x9bd: 0x0008, 0x9be: 0x0008, 0x9bf: 0x0008, + // Block 0x27, offset 0x9c0 + 0x9c0: 0x0008, 0x9c1: 0x0008, 0x9c2: 0x0008, 0x9c3: 0x0008, 0x9c4: 0x0008, 0x9c5: 0x0008, + 0x9c6: 0x0008, 0x9c7: 0x0008, 0x9c8: 0x0008, 0x9c9: 0x0008, 0x9ca: 0x0008, 0x9cb: 0x0008, + 0x9cc: 0x0008, 0x9cd: 0x0008, 0x9ce: 0x0008, 0x9cf: 0x0008, 0x9d0: 0x0008, 0x9d1: 0x0008, + 0x9d2: 0x0008, 0x9d3: 0x0008, 0x9d4: 0x0008, 0x9d5: 0x0008, 0x9d6: 0x0008, 0x9d7: 0x0008, + 0x9d8: 0x0008, 0x9d9: 0x0008, 0x9da: 0x0008, 0x9db: 0x1141, 0x9dc: 0x1159, 0x9dd: 0x1169, + 0x9de: 0x1181, 0x9df: 0x1029, 0x9e0: 0x1199, 0x9e1: 0x11a9, 0x9e2: 0x11c1, 0x9e3: 0x11d9, + 0x9e4: 0x11f1, 0x9e5: 0x1209, 0x9e6: 0x1221, 0x9e7: 0x05e5, 0x9e8: 0x1239, 0x9e9: 0x1251, + 0x9ea: 0xe17d, 0x9eb: 0x1269, 0x9ec: 0x1281, 0x9ed: 0x1299, 0x9ee: 0x12b1, 0x9ef: 0x12c9, + 0x9f0: 0x12e1, 0x9f1: 0x12f9, 0x9f2: 0x1311, 0x9f3: 0x1329, 0x9f4: 0x1341, 0x9f5: 0x1359, + 0x9f6: 0x1371, 0x9f7: 0x1389, 0x9f8: 0x05fd, 0x9f9: 0x13a1, 0x9fa: 0x13b9, 0x9fb: 0x13d1, + 0x9fc: 0x13e1, 0x9fd: 0x13f9, 0x9fe: 0x1411, 0x9ff: 0x1429, + // Block 0x28, offset 0xa00 + 0xa00: 0xe00d, 0xa01: 0x0008, 0xa02: 0xe00d, 0xa03: 0x0008, 0xa04: 0xe00d, 0xa05: 0x0008, + 0xa06: 0xe00d, 0xa07: 0x0008, 0xa08: 0xe00d, 0xa09: 0x0008, 0xa0a: 0xe00d, 0xa0b: 0x0008, + 0xa0c: 0xe00d, 0xa0d: 0x0008, 0xa0e: 0xe00d, 0xa0f: 0x0008, 0xa10: 0xe00d, 0xa11: 0x0008, + 0xa12: 0xe00d, 0xa13: 0x0008, 0xa14: 0xe00d, 0xa15: 0x0008, 0xa16: 0xe00d, 0xa17: 0x0008, + 0xa18: 0xe00d, 0xa19: 0x0008, 0xa1a: 0xe00d, 0xa1b: 0x0008, 0xa1c: 0xe00d, 0xa1d: 0x0008, + 0xa1e: 0xe00d, 0xa1f: 0x0008, 0xa20: 0xe00d, 0xa21: 0x0008, 0xa22: 0xe00d, 0xa23: 0x0008, + 0xa24: 0xe00d, 0xa25: 0x0008, 0xa26: 0xe00d, 0xa27: 0x0008, 0xa28: 0xe00d, 0xa29: 0x0008, + 0xa2a: 0xe00d, 0xa2b: 0x0008, 0xa2c: 0xe00d, 0xa2d: 0x0008, 0xa2e: 0xe00d, 0xa2f: 0x0008, + 0xa30: 0xe00d, 0xa31: 0x0008, 0xa32: 0xe00d, 0xa33: 0x0008, 0xa34: 0xe00d, 0xa35: 0x0008, + 0xa36: 0xe00d, 0xa37: 0x0008, 0xa38: 0xe00d, 0xa39: 0x0008, 0xa3a: 0xe00d, 0xa3b: 0x0008, + 0xa3c: 0xe00d, 0xa3d: 0x0008, 0xa3e: 0xe00d, 0xa3f: 0x0008, + // Block 0x29, offset 0xa40 + 0xa40: 0xe00d, 0xa41: 0x0008, 0xa42: 0xe00d, 0xa43: 0x0008, 0xa44: 0xe00d, 0xa45: 0x0008, + 0xa46: 0xe00d, 0xa47: 0x0008, 0xa48: 0xe00d, 0xa49: 0x0008, 0xa4a: 0xe00d, 0xa4b: 0x0008, + 0xa4c: 0xe00d, 0xa4d: 0x0008, 0xa4e: 0xe00d, 0xa4f: 0x0008, 0xa50: 0xe00d, 0xa51: 0x0008, + 0xa52: 0xe00d, 0xa53: 0x0008, 0xa54: 0xe00d, 0xa55: 0x0008, 0xa56: 0x0008, 0xa57: 0x0008, + 0xa58: 0x0008, 0xa59: 0x0008, 0xa5a: 0x0615, 0xa5b: 0x0635, 0xa5c: 0x0008, 0xa5d: 0x0008, + 0xa5e: 0x1441, 0xa5f: 0x0008, 0xa60: 0xe00d, 0xa61: 0x0008, 0xa62: 0xe00d, 0xa63: 0x0008, + 0xa64: 0xe00d, 0xa65: 0x0008, 0xa66: 0xe00d, 0xa67: 0x0008, 0xa68: 0xe00d, 0xa69: 0x0008, + 0xa6a: 0xe00d, 0xa6b: 0x0008, 0xa6c: 0xe00d, 0xa6d: 0x0008, 0xa6e: 0xe00d, 0xa6f: 0x0008, + 0xa70: 0xe00d, 0xa71: 0x0008, 0xa72: 0xe00d, 0xa73: 0x0008, 0xa74: 0xe00d, 0xa75: 0x0008, + 0xa76: 0xe00d, 0xa77: 0x0008, 0xa78: 0xe00d, 0xa79: 0x0008, 0xa7a: 0xe00d, 0xa7b: 0x0008, + 0xa7c: 0xe00d, 0xa7d: 0x0008, 0xa7e: 0xe00d, 0xa7f: 0x0008, + // Block 0x2a, offset 0xa80 + 0xa80: 0x0008, 0xa81: 0x0008, 0xa82: 0x0008, 0xa83: 0x0008, 0xa84: 0x0008, 0xa85: 0x0008, + 0xa86: 0x0040, 0xa87: 0x0040, 0xa88: 0xe045, 0xa89: 0xe045, 0xa8a: 0xe045, 0xa8b: 0xe045, + 0xa8c: 0xe045, 0xa8d: 0xe045, 0xa8e: 0x0040, 0xa8f: 0x0040, 0xa90: 0x0008, 0xa91: 0x0008, + 0xa92: 0x0008, 0xa93: 0x0008, 0xa94: 0x0008, 0xa95: 0x0008, 0xa96: 0x0008, 0xa97: 0x0008, + 0xa98: 0x0040, 0xa99: 0xe045, 0xa9a: 0x0040, 0xa9b: 0xe045, 0xa9c: 0x0040, 0xa9d: 0xe045, + 0xa9e: 0x0040, 0xa9f: 0xe045, 0xaa0: 0x0008, 0xaa1: 0x0008, 0xaa2: 0x0008, 0xaa3: 0x0008, + 0xaa4: 0x0008, 0xaa5: 0x0008, 0xaa6: 0x0008, 0xaa7: 0x0008, 0xaa8: 0xe045, 0xaa9: 0xe045, + 0xaaa: 0xe045, 0xaab: 0xe045, 0xaac: 0xe045, 0xaad: 0xe045, 0xaae: 0xe045, 0xaaf: 0xe045, + 0xab0: 0x0008, 0xab1: 0x1459, 0xab2: 0x0008, 0xab3: 0x1471, 0xab4: 0x0008, 0xab5: 0x1489, + 0xab6: 0x0008, 0xab7: 0x14a1, 0xab8: 0x0008, 0xab9: 0x14b9, 0xaba: 0x0008, 0xabb: 0x14d1, + 0xabc: 0x0008, 0xabd: 0x14e9, 0xabe: 0x0040, 0xabf: 0x0040, + // Block 0x2b, offset 0xac0 + 0xac0: 0x1501, 0xac1: 0x1531, 0xac2: 0x1561, 0xac3: 0x1591, 0xac4: 0x15c1, 0xac5: 0x15f1, + 0xac6: 0x1621, 0xac7: 0x1651, 0xac8: 0x1501, 0xac9: 0x1531, 0xaca: 0x1561, 0xacb: 0x1591, + 0xacc: 0x15c1, 0xacd: 0x15f1, 0xace: 0x1621, 0xacf: 0x1651, 0xad0: 0x1681, 0xad1: 0x16b1, + 0xad2: 0x16e1, 0xad3: 0x1711, 0xad4: 0x1741, 0xad5: 0x1771, 0xad6: 0x17a1, 0xad7: 0x17d1, + 0xad8: 0x1681, 0xad9: 0x16b1, 0xada: 0x16e1, 0xadb: 0x1711, 0xadc: 0x1741, 0xadd: 0x1771, + 0xade: 0x17a1, 0xadf: 0x17d1, 0xae0: 0x1801, 0xae1: 0x1831, 0xae2: 0x1861, 0xae3: 0x1891, + 0xae4: 0x18c1, 0xae5: 0x18f1, 0xae6: 0x1921, 0xae7: 0x1951, 0xae8: 0x1801, 0xae9: 0x1831, + 0xaea: 0x1861, 0xaeb: 0x1891, 0xaec: 0x18c1, 0xaed: 0x18f1, 0xaee: 0x1921, 0xaef: 0x1951, + 0xaf0: 0x0008, 0xaf1: 0x0008, 0xaf2: 0x1981, 0xaf3: 0x19b1, 0xaf4: 0x19d9, 0xaf5: 0x0040, + 0xaf6: 0x0008, 0xaf7: 0x1a01, 0xaf8: 0xe045, 0xaf9: 0xe045, 0xafa: 0x064d, 0xafb: 0x1459, + 0xafc: 0x19b1, 0xafd: 0x0666, 0xafe: 0x1a31, 0xaff: 0x0686, + // Block 0x2c, offset 0xb00 + 0xb00: 0x06a6, 0xb01: 0x1a4a, 0xb02: 0x1a79, 0xb03: 0x1aa9, 0xb04: 0x1ad1, 0xb05: 0x0040, + 0xb06: 0x0008, 0xb07: 0x1af9, 0xb08: 0x06c5, 0xb09: 0x1471, 0xb0a: 0x06dd, 0xb0b: 0x1489, + 0xb0c: 0x1aa9, 0xb0d: 0x1b2a, 0xb0e: 0x1b5a, 0xb0f: 0x1b8a, 0xb10: 0x0008, 0xb11: 0x0008, + 0xb12: 0x0008, 0xb13: 0x1bb9, 0xb14: 0x0040, 0xb15: 0x0040, 0xb16: 0x0008, 0xb17: 0x0008, + 0xb18: 0xe045, 0xb19: 0xe045, 0xb1a: 0x06f5, 0xb1b: 0x14a1, 0xb1c: 0x0040, 0xb1d: 0x1bd2, + 0xb1e: 0x1c02, 0xb1f: 0x1c32, 0xb20: 0x0008, 0xb21: 0x0008, 0xb22: 0x0008, 0xb23: 0x1c61, + 0xb24: 0x0008, 0xb25: 0x0008, 0xb26: 0x0008, 0xb27: 0x0008, 0xb28: 0xe045, 0xb29: 0xe045, + 0xb2a: 0x070d, 0xb2b: 0x14d1, 0xb2c: 0xe04d, 0xb2d: 0x1c7a, 0xb2e: 0x03d2, 0xb2f: 0x1caa, + 0xb30: 0x0040, 0xb31: 0x0040, 0xb32: 0x1cb9, 0xb33: 0x1ce9, 0xb34: 0x1d11, 0xb35: 0x0040, + 0xb36: 0x0008, 0xb37: 0x1d39, 0xb38: 0x0725, 0xb39: 0x14b9, 0xb3a: 0x0515, 0xb3b: 0x14e9, + 0xb3c: 0x1ce9, 0xb3d: 0x073e, 0xb3e: 0x075e, 0xb3f: 0x0040, + // Block 0x2d, offset 0xb40 + 0xb40: 0x000a, 0xb41: 0x000a, 0xb42: 0x000a, 0xb43: 0x000a, 0xb44: 0x000a, 0xb45: 0x000a, + 0xb46: 0x000a, 0xb47: 0x000a, 0xb48: 0x000a, 0xb49: 0x000a, 0xb4a: 0x000a, 0xb4b: 0x03c0, + 0xb4c: 0x0003, 0xb4d: 0x0003, 0xb4e: 0x0340, 0xb4f: 0x0340, 0xb50: 0x0018, 0xb51: 0xe00d, + 0xb52: 0x0018, 0xb53: 0x0018, 0xb54: 0x0018, 0xb55: 0x0018, 0xb56: 0x0018, 0xb57: 0x077e, + 0xb58: 0x0018, 0xb59: 0x0018, 0xb5a: 0x0018, 0xb5b: 0x0018, 0xb5c: 0x0018, 0xb5d: 0x0018, + 0xb5e: 0x0018, 0xb5f: 0x0018, 0xb60: 0x0018, 0xb61: 0x0018, 0xb62: 0x0018, 0xb63: 0x0018, + 0xb64: 0x0040, 0xb65: 0x0040, 0xb66: 0x0040, 0xb67: 0x0018, 0xb68: 0x0040, 0xb69: 0x0040, + 0xb6a: 0x0340, 0xb6b: 0x0340, 0xb6c: 0x0340, 0xb6d: 0x0340, 0xb6e: 0x0340, 0xb6f: 0x000a, + 0xb70: 0x0018, 0xb71: 0x0018, 0xb72: 0x0018, 0xb73: 0x1d69, 0xb74: 0x1da1, 0xb75: 0x0018, + 0xb76: 0x1df1, 0xb77: 0x1e29, 0xb78: 0x0018, 0xb79: 0x0018, 0xb7a: 0x0018, 0xb7b: 0x0018, + 0xb7c: 0x1e7a, 0xb7d: 0x0018, 0xb7e: 0x079e, 0xb7f: 0x0018, + // Block 0x2e, offset 0xb80 + 0xb80: 0x0018, 0xb81: 0x0018, 0xb82: 0x0018, 0xb83: 0x0018, 0xb84: 0x0018, 0xb85: 0x0018, + 0xb86: 0x0018, 0xb87: 0x1e92, 0xb88: 0x1eaa, 0xb89: 0x1ec2, 0xb8a: 0x0018, 0xb8b: 0x0018, + 0xb8c: 0x0018, 0xb8d: 0x0018, 0xb8e: 0x0018, 0xb8f: 0x0018, 0xb90: 0x0018, 0xb91: 0x0018, + 0xb92: 0x0018, 0xb93: 0x0018, 0xb94: 0x0018, 0xb95: 0x0018, 0xb96: 0x0018, 0xb97: 0x1ed9, + 0xb98: 0x0018, 0xb99: 0x0018, 0xb9a: 0x0018, 0xb9b: 0x0018, 0xb9c: 0x0018, 0xb9d: 0x0018, + 0xb9e: 0x0018, 0xb9f: 0x000a, 0xba0: 0x03c0, 0xba1: 0x0340, 0xba2: 0x0340, 0xba3: 0x0340, + 0xba4: 0x03c0, 0xba5: 0x0040, 0xba6: 0x0040, 0xba7: 0x0040, 0xba8: 0x0040, 0xba9: 0x0040, + 0xbaa: 0x0340, 0xbab: 0x0340, 0xbac: 0x0340, 0xbad: 0x0340, 0xbae: 0x0340, 0xbaf: 0x0340, + 0xbb0: 0x1f41, 0xbb1: 0x0f41, 0xbb2: 0x0040, 0xbb3: 0x0040, 0xbb4: 0x1f51, 0xbb5: 0x1f61, + 0xbb6: 0x1f71, 0xbb7: 0x1f81, 0xbb8: 0x1f91, 0xbb9: 0x1fa1, 0xbba: 0x1fb2, 0xbbb: 0x07bd, + 0xbbc: 0x1fc2, 0xbbd: 0x1fd2, 0xbbe: 0x1fe2, 0xbbf: 0x0f71, + // Block 0x2f, offset 0xbc0 + 0xbc0: 0x1f41, 0xbc1: 0x00c9, 0xbc2: 0x0069, 0xbc3: 0x0079, 0xbc4: 0x1f51, 0xbc5: 0x1f61, + 0xbc6: 0x1f71, 0xbc7: 0x1f81, 0xbc8: 0x1f91, 0xbc9: 0x1fa1, 0xbca: 0x1fb2, 0xbcb: 0x07d5, + 0xbcc: 0x1fc2, 0xbcd: 0x1fd2, 0xbce: 0x1fe2, 0xbcf: 0x0040, 0xbd0: 0x0039, 0xbd1: 0x0f09, + 0xbd2: 0x00d9, 0xbd3: 0x0369, 0xbd4: 0x0ff9, 0xbd5: 0x0249, 0xbd6: 0x0f51, 0xbd7: 0x0359, + 0xbd8: 0x0f61, 0xbd9: 0x0f71, 0xbda: 0x0f99, 0xbdb: 0x01d9, 0xbdc: 0x0fa9, 0xbdd: 0x0040, + 0xbde: 0x0040, 0xbdf: 0x0040, 0xbe0: 0x0018, 0xbe1: 0x0018, 0xbe2: 0x0018, 0xbe3: 0x0018, + 0xbe4: 0x0018, 0xbe5: 0x0018, 0xbe6: 0x0018, 0xbe7: 0x0018, 0xbe8: 0x1ff1, 0xbe9: 0x0018, + 0xbea: 0x0018, 0xbeb: 0x0018, 0xbec: 0x0018, 0xbed: 0x0018, 0xbee: 0x0018, 0xbef: 0x0018, + 0xbf0: 0x0018, 0xbf1: 0x0018, 0xbf2: 0x0018, 0xbf3: 0x0018, 0xbf4: 0x0018, 0xbf5: 0x0018, + 0xbf6: 0x0018, 0xbf7: 0x0018, 0xbf8: 0x0018, 0xbf9: 0x0018, 0xbfa: 0x0018, 0xbfb: 0x0018, + 0xbfc: 0x0018, 0xbfd: 0x0018, 0xbfe: 0x0018, 0xbff: 0x0040, + // Block 0x30, offset 0xc00 + 0xc00: 0x07ee, 0xc01: 0x080e, 0xc02: 0x1159, 0xc03: 0x082d, 0xc04: 0x0018, 0xc05: 0x084e, + 0xc06: 0x086e, 0xc07: 0x1011, 0xc08: 0x0018, 0xc09: 0x088d, 0xc0a: 0x0f31, 0xc0b: 0x0249, + 0xc0c: 0x0249, 0xc0d: 0x0249, 0xc0e: 0x0249, 0xc0f: 0x2009, 0xc10: 0x0f41, 0xc11: 0x0f41, + 0xc12: 0x0359, 0xc13: 0x0359, 0xc14: 0x0018, 0xc15: 0x0f71, 0xc16: 0x2021, 0xc17: 0x0018, + 0xc18: 0x0018, 0xc19: 0x0f99, 0xc1a: 0x2039, 0xc1b: 0x0269, 0xc1c: 0x0269, 0xc1d: 0x0269, + 0xc1e: 0x0018, 0xc1f: 0x0018, 0xc20: 0x2049, 0xc21: 0x08ad, 0xc22: 0x2061, 0xc23: 0x0018, + 0xc24: 0x13d1, 0xc25: 0x0018, 0xc26: 0x2079, 0xc27: 0x0018, 0xc28: 0x13d1, 0xc29: 0x0018, + 0xc2a: 0x0f51, 0xc2b: 0x2091, 0xc2c: 0x0ee9, 0xc2d: 0x1159, 0xc2e: 0x0018, 0xc2f: 0x0f09, + 0xc30: 0x0f09, 0xc31: 0x1199, 0xc32: 0x0040, 0xc33: 0x0f61, 0xc34: 0x00d9, 0xc35: 0x20a9, + 0xc36: 0x20c1, 0xc37: 0x20d9, 0xc38: 0x20f1, 0xc39: 0x0f41, 0xc3a: 0x0018, 0xc3b: 0x08cd, + 0xc3c: 0x2109, 0xc3d: 0x10b1, 0xc3e: 0x10b1, 0xc3f: 0x2109, + // Block 0x31, offset 0xc40 + 0xc40: 0x08ed, 0xc41: 0x0018, 0xc42: 0x0018, 0xc43: 0x0018, 0xc44: 0x0018, 0xc45: 0x0ef9, + 0xc46: 0x0ef9, 0xc47: 0x0f09, 0xc48: 0x0f41, 0xc49: 0x0259, 0xc4a: 0x0018, 0xc4b: 0x0018, + 0xc4c: 0x0018, 0xc4d: 0x0018, 0xc4e: 0x0008, 0xc4f: 0x0018, 0xc50: 0x2121, 0xc51: 0x2151, + 0xc52: 0x2181, 0xc53: 0x21b9, 0xc54: 0x21e9, 0xc55: 0x2219, 0xc56: 0x2249, 0xc57: 0x2279, + 0xc58: 0x22a9, 0xc59: 0x22d9, 0xc5a: 0x2309, 0xc5b: 0x2339, 0xc5c: 0x2369, 0xc5d: 0x2399, + 0xc5e: 0x23c9, 0xc5f: 0x23f9, 0xc60: 0x0f41, 0xc61: 0x2421, 0xc62: 0x0905, 0xc63: 0x2439, + 0xc64: 0x1089, 0xc65: 0x2451, 0xc66: 0x0925, 0xc67: 0x2469, 0xc68: 0x2491, 0xc69: 0x0369, + 0xc6a: 0x24a9, 0xc6b: 0x0945, 0xc6c: 0x0359, 0xc6d: 0x1159, 0xc6e: 0x0ef9, 0xc6f: 0x0f61, + 0xc70: 0x0f41, 0xc71: 0x2421, 0xc72: 0x0965, 0xc73: 0x2439, 0xc74: 0x1089, 0xc75: 0x2451, + 0xc76: 0x0985, 0xc77: 0x2469, 0xc78: 0x2491, 0xc79: 0x0369, 0xc7a: 0x24a9, 0xc7b: 0x09a5, + 0xc7c: 0x0359, 0xc7d: 0x1159, 0xc7e: 0x0ef9, 0xc7f: 0x0f61, + // Block 0x32, offset 0xc80 + 0xc80: 0x0018, 0xc81: 0x0018, 0xc82: 0x0018, 0xc83: 0x0018, 0xc84: 0x0018, 0xc85: 0x0018, + 0xc86: 0x0018, 0xc87: 0x0018, 0xc88: 0x0018, 0xc89: 0x0018, 0xc8a: 0x0018, 0xc8b: 0x0040, + 0xc8c: 0x0040, 0xc8d: 0x0040, 0xc8e: 0x0040, 0xc8f: 0x0040, 0xc90: 0x0040, 0xc91: 0x0040, + 0xc92: 0x0040, 0xc93: 0x0040, 0xc94: 0x0040, 0xc95: 0x0040, 0xc96: 0x0040, 0xc97: 0x0040, + 0xc98: 0x0040, 0xc99: 0x0040, 0xc9a: 0x0040, 0xc9b: 0x0040, 0xc9c: 0x0040, 0xc9d: 0x0040, + 0xc9e: 0x0040, 0xc9f: 0x0040, 0xca0: 0x00c9, 0xca1: 0x0069, 0xca2: 0x0079, 0xca3: 0x1f51, + 0xca4: 0x1f61, 0xca5: 0x1f71, 0xca6: 0x1f81, 0xca7: 0x1f91, 0xca8: 0x1fa1, 0xca9: 0x2601, + 0xcaa: 0x2619, 0xcab: 0x2631, 0xcac: 0x2649, 0xcad: 0x2661, 0xcae: 0x2679, 0xcaf: 0x2691, + 0xcb0: 0x26a9, 0xcb1: 0x26c1, 0xcb2: 0x26d9, 0xcb3: 0x26f1, 0xcb4: 0x0a06, 0xcb5: 0x0a26, + 0xcb6: 0x0a46, 0xcb7: 0x0a66, 0xcb8: 0x0a86, 0xcb9: 0x0aa6, 0xcba: 0x0ac6, 0xcbb: 0x0ae6, + 0xcbc: 0x0b06, 0xcbd: 0x270a, 0xcbe: 0x2732, 0xcbf: 0x275a, + // Block 0x33, offset 0xcc0 + 0xcc0: 0x2782, 0xcc1: 0x27aa, 0xcc2: 0x27d2, 0xcc3: 0x27fa, 0xcc4: 0x2822, 0xcc5: 0x284a, + 0xcc6: 0x2872, 0xcc7: 0x289a, 0xcc8: 0x0040, 0xcc9: 0x0040, 0xcca: 0x0040, 0xccb: 0x0040, + 0xccc: 0x0040, 0xccd: 0x0040, 0xcce: 0x0040, 0xccf: 0x0040, 0xcd0: 0x0040, 0xcd1: 0x0040, + 0xcd2: 0x0040, 0xcd3: 0x0040, 0xcd4: 0x0040, 0xcd5: 0x0040, 0xcd6: 0x0040, 0xcd7: 0x0040, + 0xcd8: 0x0040, 0xcd9: 0x0040, 0xcda: 0x0040, 0xcdb: 0x0040, 0xcdc: 0x0b26, 0xcdd: 0x0b46, + 0xcde: 0x0b66, 0xcdf: 0x0b86, 0xce0: 0x0ba6, 0xce1: 0x0bc6, 0xce2: 0x0be6, 0xce3: 0x0c06, + 0xce4: 0x0c26, 0xce5: 0x0c46, 0xce6: 0x0c66, 0xce7: 0x0c86, 0xce8: 0x0ca6, 0xce9: 0x0cc6, + 0xcea: 0x0ce6, 0xceb: 0x0d06, 0xcec: 0x0d26, 0xced: 0x0d46, 0xcee: 0x0d66, 0xcef: 0x0d86, + 0xcf0: 0x0da6, 0xcf1: 0x0dc6, 0xcf2: 0x0de6, 0xcf3: 0x0e06, 0xcf4: 0x0e26, 0xcf5: 0x0e46, + 0xcf6: 0x0039, 0xcf7: 0x0ee9, 0xcf8: 0x1159, 0xcf9: 0x0ef9, 0xcfa: 0x0f09, 0xcfb: 0x1199, + 0xcfc: 0x0f31, 0xcfd: 0x0249, 0xcfe: 0x0f41, 0xcff: 0x0259, + // Block 0x34, offset 0xd00 + 0xd00: 0x0f51, 0xd01: 0x0359, 0xd02: 0x0f61, 0xd03: 0x0f71, 0xd04: 0x00d9, 0xd05: 0x0f99, + 0xd06: 0x2039, 0xd07: 0x0269, 0xd08: 0x01d9, 0xd09: 0x0fa9, 0xd0a: 0x0fb9, 0xd0b: 0x1089, + 0xd0c: 0x0279, 0xd0d: 0x0369, 0xd0e: 0x0289, 0xd0f: 0x13d1, 0xd10: 0x0039, 0xd11: 0x0ee9, + 0xd12: 0x1159, 0xd13: 0x0ef9, 0xd14: 0x0f09, 0xd15: 0x1199, 0xd16: 0x0f31, 0xd17: 0x0249, + 0xd18: 0x0f41, 0xd19: 0x0259, 0xd1a: 0x0f51, 0xd1b: 0x0359, 0xd1c: 0x0f61, 0xd1d: 0x0f71, + 0xd1e: 0x00d9, 0xd1f: 0x0f99, 0xd20: 0x2039, 0xd21: 0x0269, 0xd22: 0x01d9, 0xd23: 0x0fa9, + 0xd24: 0x0fb9, 0xd25: 0x1089, 0xd26: 0x0279, 0xd27: 0x0369, 0xd28: 0x0289, 0xd29: 0x13d1, + 0xd2a: 0x1f41, 0xd2b: 0x0018, 0xd2c: 0x0018, 0xd2d: 0x0018, 0xd2e: 0x0018, 0xd2f: 0x0018, + 0xd30: 0x0018, 0xd31: 0x0018, 0xd32: 0x0018, 0xd33: 0x0018, 0xd34: 0x0018, 0xd35: 0x0018, + 0xd36: 0x0018, 0xd37: 0x0018, 0xd38: 0x0018, 0xd39: 0x0018, 0xd3a: 0x0018, 0xd3b: 0x0018, + 0xd3c: 0x0018, 0xd3d: 0x0018, 0xd3e: 0x0018, 0xd3f: 0x0018, + // Block 0x35, offset 0xd40 + 0xd40: 0x0008, 0xd41: 0x0008, 0xd42: 0x0008, 0xd43: 0x0008, 0xd44: 0x0008, 0xd45: 0x0008, + 0xd46: 0x0008, 0xd47: 0x0008, 0xd48: 0x0008, 0xd49: 0x0008, 0xd4a: 0x0008, 0xd4b: 0x0008, + 0xd4c: 0x0008, 0xd4d: 0x0008, 0xd4e: 0x0008, 0xd4f: 0x0008, 0xd50: 0x0008, 0xd51: 0x0008, + 0xd52: 0x0008, 0xd53: 0x0008, 0xd54: 0x0008, 0xd55: 0x0008, 0xd56: 0x0008, 0xd57: 0x0008, + 0xd58: 0x0008, 0xd59: 0x0008, 0xd5a: 0x0008, 0xd5b: 0x0008, 0xd5c: 0x0008, 0xd5d: 0x0008, + 0xd5e: 0x0008, 0xd5f: 0x0040, 0xd60: 0xe00d, 0xd61: 0x0008, 0xd62: 0x2971, 0xd63: 0x0ebd, + 0xd64: 0x2989, 0xd65: 0x0008, 0xd66: 0x0008, 0xd67: 0xe07d, 0xd68: 0x0008, 0xd69: 0xe01d, + 0xd6a: 0x0008, 0xd6b: 0xe03d, 0xd6c: 0x0008, 0xd6d: 0x0fe1, 0xd6e: 0x1281, 0xd6f: 0x0fc9, + 0xd70: 0x1141, 0xd71: 0x0008, 0xd72: 0xe00d, 0xd73: 0x0008, 0xd74: 0x0008, 0xd75: 0xe01d, + 0xd76: 0x0008, 0xd77: 0x0008, 0xd78: 0x0008, 0xd79: 0x0008, 0xd7a: 0x0008, 0xd7b: 0x0008, + 0xd7c: 0x0259, 0xd7d: 0x1089, 0xd7e: 0x29a1, 0xd7f: 0x29b9, + // Block 0x36, offset 0xd80 + 0xd80: 0xe00d, 0xd81: 0x0008, 0xd82: 0xe00d, 0xd83: 0x0008, 0xd84: 0xe00d, 0xd85: 0x0008, + 0xd86: 0xe00d, 0xd87: 0x0008, 0xd88: 0xe00d, 0xd89: 0x0008, 0xd8a: 0xe00d, 0xd8b: 0x0008, + 0xd8c: 0xe00d, 0xd8d: 0x0008, 0xd8e: 0xe00d, 0xd8f: 0x0008, 0xd90: 0xe00d, 0xd91: 0x0008, + 0xd92: 0xe00d, 0xd93: 0x0008, 0xd94: 0xe00d, 0xd95: 0x0008, 0xd96: 0xe00d, 0xd97: 0x0008, + 0xd98: 0xe00d, 0xd99: 0x0008, 0xd9a: 0xe00d, 0xd9b: 0x0008, 0xd9c: 0xe00d, 0xd9d: 0x0008, + 0xd9e: 0xe00d, 0xd9f: 0x0008, 0xda0: 0xe00d, 0xda1: 0x0008, 0xda2: 0xe00d, 0xda3: 0x0008, + 0xda4: 0x0008, 0xda5: 0x0018, 0xda6: 0x0018, 0xda7: 0x0018, 0xda8: 0x0018, 0xda9: 0x0018, + 0xdaa: 0x0018, 0xdab: 0xe03d, 0xdac: 0x0008, 0xdad: 0xe01d, 0xdae: 0x0008, 0xdaf: 0x1308, + 0xdb0: 0x1308, 0xdb1: 0x1308, 0xdb2: 0xe00d, 0xdb3: 0x0008, 0xdb4: 0x0040, 0xdb5: 0x0040, + 0xdb6: 0x0040, 0xdb7: 0x0040, 0xdb8: 0x0040, 0xdb9: 0x0018, 0xdba: 0x0018, 0xdbb: 0x0018, + 0xdbc: 0x0018, 0xdbd: 0x0018, 0xdbe: 0x0018, 0xdbf: 0x0018, + // Block 0x37, offset 0xdc0 + 0xdc0: 0x26fd, 0xdc1: 0x271d, 0xdc2: 0x273d, 0xdc3: 0x275d, 0xdc4: 0x277d, 0xdc5: 0x279d, + 0xdc6: 0x27bd, 0xdc7: 0x27dd, 0xdc8: 0x27fd, 0xdc9: 0x281d, 0xdca: 0x283d, 0xdcb: 0x285d, + 0xdcc: 0x287d, 0xdcd: 0x289d, 0xdce: 0x28bd, 0xdcf: 0x28dd, 0xdd0: 0x28fd, 0xdd1: 0x291d, + 0xdd2: 0x293d, 0xdd3: 0x295d, 0xdd4: 0x297d, 0xdd5: 0x299d, 0xdd6: 0x0040, 0xdd7: 0x0040, + 0xdd8: 0x0040, 0xdd9: 0x0040, 0xdda: 0x0040, 0xddb: 0x0040, 0xddc: 0x0040, 0xddd: 0x0040, + 0xdde: 0x0040, 0xddf: 0x0040, 0xde0: 0x0040, 0xde1: 0x0040, 0xde2: 0x0040, 0xde3: 0x0040, + 0xde4: 0x0040, 0xde5: 0x0040, 0xde6: 0x0040, 0xde7: 0x0040, 0xde8: 0x0040, 0xde9: 0x0040, + 0xdea: 0x0040, 0xdeb: 0x0040, 0xdec: 0x0040, 0xded: 0x0040, 0xdee: 0x0040, 0xdef: 0x0040, + 0xdf0: 0x0040, 0xdf1: 0x0040, 0xdf2: 0x0040, 0xdf3: 0x0040, 0xdf4: 0x0040, 0xdf5: 0x0040, + 0xdf6: 0x0040, 0xdf7: 0x0040, 0xdf8: 0x0040, 0xdf9: 0x0040, 0xdfa: 0x0040, 0xdfb: 0x0040, + 0xdfc: 0x0040, 0xdfd: 0x0040, 0xdfe: 0x0040, 0xdff: 0x0040, + // Block 0x38, offset 0xe00 + 0xe00: 0x000a, 0xe01: 0x0018, 0xe02: 0x29d1, 0xe03: 0x0018, 0xe04: 0x0018, 0xe05: 0x0008, + 0xe06: 0x0008, 0xe07: 0x0008, 0xe08: 0x0018, 0xe09: 0x0018, 0xe0a: 0x0018, 0xe0b: 0x0018, + 0xe0c: 0x0018, 0xe0d: 0x0018, 0xe0e: 0x0018, 0xe0f: 0x0018, 0xe10: 0x0018, 0xe11: 0x0018, + 0xe12: 0x0018, 0xe13: 0x0018, 0xe14: 0x0018, 0xe15: 0x0018, 0xe16: 0x0018, 0xe17: 0x0018, + 0xe18: 0x0018, 0xe19: 0x0018, 0xe1a: 0x0018, 0xe1b: 0x0018, 0xe1c: 0x0018, 0xe1d: 0x0018, + 0xe1e: 0x0018, 0xe1f: 0x0018, 0xe20: 0x0018, 0xe21: 0x0018, 0xe22: 0x0018, 0xe23: 0x0018, + 0xe24: 0x0018, 0xe25: 0x0018, 0xe26: 0x0018, 0xe27: 0x0018, 0xe28: 0x0018, 0xe29: 0x0018, + 0xe2a: 0x1308, 0xe2b: 0x1308, 0xe2c: 0x1308, 0xe2d: 0x1308, 0xe2e: 0x1018, 0xe2f: 0x1018, + 0xe30: 0x0018, 0xe31: 0x0018, 0xe32: 0x0018, 0xe33: 0x0018, 0xe34: 0x0018, 0xe35: 0x0018, + 0xe36: 0xe125, 0xe37: 0x0018, 0xe38: 0x29bd, 0xe39: 0x29dd, 0xe3a: 0x29fd, 0xe3b: 0x0018, + 0xe3c: 0x0008, 0xe3d: 0x0018, 0xe3e: 0x0018, 0xe3f: 0x0018, + // Block 0x39, offset 0xe40 + 0xe40: 0x2b3d, 0xe41: 0x2b5d, 0xe42: 0x2b7d, 0xe43: 0x2b9d, 0xe44: 0x2bbd, 0xe45: 0x2bdd, + 0xe46: 0x2bdd, 0xe47: 0x2bdd, 0xe48: 0x2bfd, 0xe49: 0x2bfd, 0xe4a: 0x2bfd, 0xe4b: 0x2bfd, + 0xe4c: 0x2c1d, 0xe4d: 0x2c1d, 0xe4e: 0x2c1d, 0xe4f: 0x2c3d, 0xe50: 0x2c5d, 0xe51: 0x2c5d, + 0xe52: 0x2a7d, 0xe53: 0x2a7d, 0xe54: 0x2c5d, 0xe55: 0x2c5d, 0xe56: 0x2c7d, 0xe57: 0x2c7d, + 0xe58: 0x2c5d, 0xe59: 0x2c5d, 0xe5a: 0x2a7d, 0xe5b: 0x2a7d, 0xe5c: 0x2c5d, 0xe5d: 0x2c5d, + 0xe5e: 0x2c3d, 0xe5f: 0x2c3d, 0xe60: 0x2c9d, 0xe61: 0x2c9d, 0xe62: 0x2cbd, 0xe63: 0x2cbd, + 0xe64: 0x0040, 0xe65: 0x2cdd, 0xe66: 0x2cfd, 0xe67: 0x2d1d, 0xe68: 0x2d1d, 0xe69: 0x2d3d, + 0xe6a: 0x2d5d, 0xe6b: 0x2d7d, 0xe6c: 0x2d9d, 0xe6d: 0x2dbd, 0xe6e: 0x2ddd, 0xe6f: 0x2dfd, + 0xe70: 0x2e1d, 0xe71: 0x2e3d, 0xe72: 0x2e3d, 0xe73: 0x2e5d, 0xe74: 0x2e7d, 0xe75: 0x2e7d, + 0xe76: 0x2e9d, 0xe77: 0x2ebd, 0xe78: 0x2e5d, 0xe79: 0x2edd, 0xe7a: 0x2efd, 0xe7b: 0x2edd, + 0xe7c: 0x2e5d, 0xe7d: 0x2f1d, 0xe7e: 0x2f3d, 0xe7f: 0x2f5d, + // Block 0x3a, offset 0xe80 + 0xe80: 0x2f7d, 0xe81: 0x2f9d, 0xe82: 0x2cfd, 0xe83: 0x2cdd, 0xe84: 0x2fbd, 0xe85: 0x2fdd, + 0xe86: 0x2ffd, 0xe87: 0x301d, 0xe88: 0x303d, 0xe89: 0x305d, 0xe8a: 0x307d, 0xe8b: 0x309d, + 0xe8c: 0x30bd, 0xe8d: 0x30dd, 0xe8e: 0x30fd, 0xe8f: 0x0040, 0xe90: 0x0018, 0xe91: 0x0018, + 0xe92: 0x311d, 0xe93: 0x313d, 0xe94: 0x315d, 0xe95: 0x317d, 0xe96: 0x319d, 0xe97: 0x31bd, + 0xe98: 0x31dd, 0xe99: 0x31fd, 0xe9a: 0x321d, 0xe9b: 0x323d, 0xe9c: 0x315d, 0xe9d: 0x325d, + 0xe9e: 0x327d, 0xe9f: 0x329d, 0xea0: 0x0008, 0xea1: 0x0008, 0xea2: 0x0008, 0xea3: 0x0008, + 0xea4: 0x0008, 0xea5: 0x0008, 0xea6: 0x0008, 0xea7: 0x0008, 0xea8: 0x0008, 0xea9: 0x0008, + 0xeaa: 0x0008, 0xeab: 0x0008, 0xeac: 0x0008, 0xead: 0x0008, 0xeae: 0x0008, 0xeaf: 0x0008, + 0xeb0: 0x0008, 0xeb1: 0x0008, 0xeb2: 0x0008, 0xeb3: 0x0008, 0xeb4: 0x0008, 0xeb5: 0x0008, + 0xeb6: 0x0008, 0xeb7: 0x0008, 0xeb8: 0x0008, 0xeb9: 0x0008, 0xeba: 0x0008, 0xebb: 0x0040, + 0xebc: 0x0040, 0xebd: 0x0040, 0xebe: 0x0040, 0xebf: 0x0040, + // Block 0x3b, offset 0xec0 + 0xec0: 0x36a2, 0xec1: 0x36d2, 0xec2: 0x3702, 0xec3: 0x3732, 0xec4: 0x32bd, 0xec5: 0x32dd, + 0xec6: 0x32fd, 0xec7: 0x331d, 0xec8: 0x0018, 0xec9: 0x0018, 0xeca: 0x0018, 0xecb: 0x0018, + 0xecc: 0x0018, 0xecd: 0x0018, 0xece: 0x0018, 0xecf: 0x0018, 0xed0: 0x333d, 0xed1: 0x3761, + 0xed2: 0x3779, 0xed3: 0x3791, 0xed4: 0x37a9, 0xed5: 0x37c1, 0xed6: 0x37d9, 0xed7: 0x37f1, + 0xed8: 0x3809, 0xed9: 0x3821, 0xeda: 0x3839, 0xedb: 0x3851, 0xedc: 0x3869, 0xedd: 0x3881, + 0xede: 0x3899, 0xedf: 0x38b1, 0xee0: 0x335d, 0xee1: 0x337d, 0xee2: 0x339d, 0xee3: 0x33bd, + 0xee4: 0x33dd, 0xee5: 0x33dd, 0xee6: 0x33fd, 0xee7: 0x341d, 0xee8: 0x343d, 0xee9: 0x345d, + 0xeea: 0x347d, 0xeeb: 0x349d, 0xeec: 0x34bd, 0xeed: 0x34dd, 0xeee: 0x34fd, 0xeef: 0x351d, + 0xef0: 0x353d, 0xef1: 0x355d, 0xef2: 0x357d, 0xef3: 0x359d, 0xef4: 0x35bd, 0xef5: 0x35dd, + 0xef6: 0x35fd, 0xef7: 0x361d, 0xef8: 0x363d, 0xef9: 0x365d, 0xefa: 0x367d, 0xefb: 0x369d, + 0xefc: 0x38c9, 0xefd: 0x3901, 0xefe: 0x36bd, 0xeff: 0x0018, + // Block 0x3c, offset 0xf00 + 0xf00: 0x36dd, 0xf01: 0x36fd, 0xf02: 0x371d, 0xf03: 0x373d, 0xf04: 0x375d, 0xf05: 0x377d, + 0xf06: 0x379d, 0xf07: 0x37bd, 0xf08: 0x37dd, 0xf09: 0x37fd, 0xf0a: 0x381d, 0xf0b: 0x383d, + 0xf0c: 0x385d, 0xf0d: 0x387d, 0xf0e: 0x389d, 0xf0f: 0x38bd, 0xf10: 0x38dd, 0xf11: 0x38fd, + 0xf12: 0x391d, 0xf13: 0x393d, 0xf14: 0x395d, 0xf15: 0x397d, 0xf16: 0x399d, 0xf17: 0x39bd, + 0xf18: 0x39dd, 0xf19: 0x39fd, 0xf1a: 0x3a1d, 0xf1b: 0x3a3d, 0xf1c: 0x3a5d, 0xf1d: 0x3a7d, + 0xf1e: 0x3a9d, 0xf1f: 0x3abd, 0xf20: 0x3add, 0xf21: 0x3afd, 0xf22: 0x3b1d, 0xf23: 0x3b3d, + 0xf24: 0x3b5d, 0xf25: 0x3b7d, 0xf26: 0x127d, 0xf27: 0x3b9d, 0xf28: 0x3bbd, 0xf29: 0x3bdd, + 0xf2a: 0x3bfd, 0xf2b: 0x3c1d, 0xf2c: 0x3c3d, 0xf2d: 0x3c5d, 0xf2e: 0x239d, 0xf2f: 0x3c7d, + 0xf30: 0x3c9d, 0xf31: 0x3939, 0xf32: 0x3951, 0xf33: 0x3969, 0xf34: 0x3981, 0xf35: 0x3999, + 0xf36: 0x39b1, 0xf37: 0x39c9, 0xf38: 0x39e1, 0xf39: 0x39f9, 0xf3a: 0x3a11, 0xf3b: 0x3a29, + 0xf3c: 0x3a41, 0xf3d: 0x3a59, 0xf3e: 0x3a71, 0xf3f: 0x3a89, + // Block 0x3d, offset 0xf40 + 0xf40: 0x3aa1, 0xf41: 0x3ac9, 0xf42: 0x3af1, 0xf43: 0x3b19, 0xf44: 0x3b41, 0xf45: 0x3b69, + 0xf46: 0x3b91, 0xf47: 0x3bb9, 0xf48: 0x3be1, 0xf49: 0x3c09, 0xf4a: 0x3c39, 0xf4b: 0x3c69, + 0xf4c: 0x3c99, 0xf4d: 0x3cbd, 0xf4e: 0x3cb1, 0xf4f: 0x3cdd, 0xf50: 0x3cfd, 0xf51: 0x3d15, + 0xf52: 0x3d2d, 0xf53: 0x3d45, 0xf54: 0x3d5d, 0xf55: 0x3d5d, 0xf56: 0x3d45, 0xf57: 0x3d75, + 0xf58: 0x07bd, 0xf59: 0x3d8d, 0xf5a: 0x3da5, 0xf5b: 0x3dbd, 0xf5c: 0x3dd5, 0xf5d: 0x3ded, + 0xf5e: 0x3e05, 0xf5f: 0x3e1d, 0xf60: 0x3e35, 0xf61: 0x3e4d, 0xf62: 0x3e65, 0xf63: 0x3e7d, + 0xf64: 0x3e95, 0xf65: 0x3e95, 0xf66: 0x3ead, 0xf67: 0x3ead, 0xf68: 0x3ec5, 0xf69: 0x3ec5, + 0xf6a: 0x3edd, 0xf6b: 0x3ef5, 0xf6c: 0x3f0d, 0xf6d: 0x3f25, 0xf6e: 0x3f3d, 0xf6f: 0x3f3d, + 0xf70: 0x3f55, 0xf71: 0x3f55, 0xf72: 0x3f55, 0xf73: 0x3f6d, 0xf74: 0x3f85, 0xf75: 0x3f9d, + 0xf76: 0x3fb5, 0xf77: 0x3f9d, 0xf78: 0x3fcd, 0xf79: 0x3fe5, 0xf7a: 0x3f6d, 0xf7b: 0x3ffd, + 0xf7c: 0x4015, 0xf7d: 0x4015, 0xf7e: 0x4015, 0xf7f: 0x0040, + // Block 0x3e, offset 0xf80 + 0xf80: 0x3cc9, 0xf81: 0x3d31, 0xf82: 0x3d99, 0xf83: 0x3e01, 0xf84: 0x3e51, 0xf85: 0x3eb9, + 0xf86: 0x3f09, 0xf87: 0x3f59, 0xf88: 0x3fd9, 0xf89: 0x4041, 0xf8a: 0x4091, 0xf8b: 0x40e1, + 0xf8c: 0x4131, 0xf8d: 0x4199, 0xf8e: 0x4201, 0xf8f: 0x4251, 0xf90: 0x42a1, 0xf91: 0x42d9, + 0xf92: 0x4329, 0xf93: 0x4391, 0xf94: 0x43f9, 0xf95: 0x4431, 0xf96: 0x44b1, 0xf97: 0x4549, + 0xf98: 0x45c9, 0xf99: 0x4619, 0xf9a: 0x4699, 0xf9b: 0x4719, 0xf9c: 0x4781, 0xf9d: 0x47d1, + 0xf9e: 0x4821, 0xf9f: 0x4871, 0xfa0: 0x48d9, 0xfa1: 0x4959, 0xfa2: 0x49c1, 0xfa3: 0x4a11, + 0xfa4: 0x4a61, 0xfa5: 0x4ab1, 0xfa6: 0x4ae9, 0xfa7: 0x4b21, 0xfa8: 0x4b59, 0xfa9: 0x4b91, + 0xfaa: 0x4be1, 0xfab: 0x4c31, 0xfac: 0x4cb1, 0xfad: 0x4d01, 0xfae: 0x4d69, 0xfaf: 0x4de9, + 0xfb0: 0x4e39, 0xfb1: 0x4e71, 0xfb2: 0x4ea9, 0xfb3: 0x4f29, 0xfb4: 0x4f91, 0xfb5: 0x5011, + 0xfb6: 0x5061, 0xfb7: 0x50e1, 0xfb8: 0x5119, 0xfb9: 0x5169, 0xfba: 0x51b9, 0xfbb: 0x5209, + 0xfbc: 0x5259, 0xfbd: 0x52a9, 0xfbe: 0x5311, 0xfbf: 0x5361, + // Block 0x3f, offset 0xfc0 + 0xfc0: 0x5399, 0xfc1: 0x53e9, 0xfc2: 0x5439, 0xfc3: 0x5489, 0xfc4: 0x54f1, 0xfc5: 0x5541, + 0xfc6: 0x5591, 0xfc7: 0x55e1, 0xfc8: 0x5661, 0xfc9: 0x56c9, 0xfca: 0x5701, 0xfcb: 0x5781, + 0xfcc: 0x57b9, 0xfcd: 0x5821, 0xfce: 0x5889, 0xfcf: 0x58d9, 0xfd0: 0x5929, 0xfd1: 0x5979, + 0xfd2: 0x59e1, 0xfd3: 0x5a19, 0xfd4: 0x5a69, 0xfd5: 0x5ad1, 0xfd6: 0x5b09, 0xfd7: 0x5b89, + 0xfd8: 0x5bd9, 0xfd9: 0x5c01, 0xfda: 0x5c29, 0xfdb: 0x5c51, 0xfdc: 0x5c79, 0xfdd: 0x5ca1, + 0xfde: 0x5cc9, 0xfdf: 0x5cf1, 0xfe0: 0x5d19, 0xfe1: 0x5d41, 0xfe2: 0x5d69, 0xfe3: 0x5d99, + 0xfe4: 0x5dc9, 0xfe5: 0x5df9, 0xfe6: 0x5e29, 0xfe7: 0x5e59, 0xfe8: 0x5e89, 0xfe9: 0x5eb9, + 0xfea: 0x5ee9, 0xfeb: 0x5f19, 0xfec: 0x5f49, 0xfed: 0x5f79, 0xfee: 0x5fa9, 0xfef: 0x5fd9, + 0xff0: 0x6009, 0xff1: 0x402d, 0xff2: 0x6039, 0xff3: 0x6051, 0xff4: 0x404d, 0xff5: 0x6069, + 0xff6: 0x6081, 0xff7: 0x6099, 0xff8: 0x406d, 0xff9: 0x406d, 0xffa: 0x60b1, 0xffb: 0x60c9, + 0xffc: 0x6101, 0xffd: 0x6139, 0xffe: 0x6171, 0xfff: 0x61a9, + // Block 0x40, offset 0x1000 + 0x1000: 0x6211, 0x1001: 0x6229, 0x1002: 0x408d, 0x1003: 0x6241, 0x1004: 0x6259, 0x1005: 0x6271, + 0x1006: 0x6289, 0x1007: 0x62a1, 0x1008: 0x40ad, 0x1009: 0x62b9, 0x100a: 0x62e1, 0x100b: 0x62f9, + 0x100c: 0x40cd, 0x100d: 0x40cd, 0x100e: 0x6311, 0x100f: 0x6329, 0x1010: 0x6341, 0x1011: 0x40ed, + 0x1012: 0x410d, 0x1013: 0x412d, 0x1014: 0x414d, 0x1015: 0x416d, 0x1016: 0x6359, 0x1017: 0x6371, + 0x1018: 0x6389, 0x1019: 0x63a1, 0x101a: 0x63b9, 0x101b: 0x418d, 0x101c: 0x63d1, 0x101d: 0x63e9, + 0x101e: 0x6401, 0x101f: 0x41ad, 0x1020: 0x41cd, 0x1021: 0x6419, 0x1022: 0x41ed, 0x1023: 0x420d, + 0x1024: 0x422d, 0x1025: 0x6431, 0x1026: 0x424d, 0x1027: 0x6449, 0x1028: 0x6479, 0x1029: 0x6211, + 0x102a: 0x426d, 0x102b: 0x428d, 0x102c: 0x42ad, 0x102d: 0x42cd, 0x102e: 0x64b1, 0x102f: 0x64f1, + 0x1030: 0x6539, 0x1031: 0x6551, 0x1032: 0x42ed, 0x1033: 0x6569, 0x1034: 0x6581, 0x1035: 0x6599, + 0x1036: 0x430d, 0x1037: 0x65b1, 0x1038: 0x65c9, 0x1039: 0x65b1, 0x103a: 0x65e1, 0x103b: 0x65f9, + 0x103c: 0x432d, 0x103d: 0x6611, 0x103e: 0x6629, 0x103f: 0x6611, + // Block 0x41, offset 0x1040 + 0x1040: 0x434d, 0x1041: 0x436d, 0x1042: 0x0040, 0x1043: 0x6641, 0x1044: 0x6659, 0x1045: 0x6671, + 0x1046: 0x6689, 0x1047: 0x0040, 0x1048: 0x66c1, 0x1049: 0x66d9, 0x104a: 0x66f1, 0x104b: 0x6709, + 0x104c: 0x6721, 0x104d: 0x6739, 0x104e: 0x6401, 0x104f: 0x6751, 0x1050: 0x6769, 0x1051: 0x6781, + 0x1052: 0x438d, 0x1053: 0x6799, 0x1054: 0x6289, 0x1055: 0x43ad, 0x1056: 0x43cd, 0x1057: 0x67b1, + 0x1058: 0x0040, 0x1059: 0x43ed, 0x105a: 0x67c9, 0x105b: 0x67e1, 0x105c: 0x67f9, 0x105d: 0x6811, + 0x105e: 0x6829, 0x105f: 0x6859, 0x1060: 0x6889, 0x1061: 0x68b1, 0x1062: 0x68d9, 0x1063: 0x6901, + 0x1064: 0x6929, 0x1065: 0x6951, 0x1066: 0x6979, 0x1067: 0x69a1, 0x1068: 0x69c9, 0x1069: 0x69f1, + 0x106a: 0x6a21, 0x106b: 0x6a51, 0x106c: 0x6a81, 0x106d: 0x6ab1, 0x106e: 0x6ae1, 0x106f: 0x6b11, + 0x1070: 0x6b41, 0x1071: 0x6b71, 0x1072: 0x6ba1, 0x1073: 0x6bd1, 0x1074: 0x6c01, 0x1075: 0x6c31, + 0x1076: 0x6c61, 0x1077: 0x6c91, 0x1078: 0x6cc1, 0x1079: 0x6cf1, 0x107a: 0x6d21, 0x107b: 0x6d51, + 0x107c: 0x6d81, 0x107d: 0x6db1, 0x107e: 0x6de1, 0x107f: 0x440d, + // Block 0x42, offset 0x1080 + 0x1080: 0xe00d, 0x1081: 0x0008, 0x1082: 0xe00d, 0x1083: 0x0008, 0x1084: 0xe00d, 0x1085: 0x0008, + 0x1086: 0xe00d, 0x1087: 0x0008, 0x1088: 0xe00d, 0x1089: 0x0008, 0x108a: 0xe00d, 0x108b: 0x0008, + 0x108c: 0xe00d, 0x108d: 0x0008, 0x108e: 0xe00d, 0x108f: 0x0008, 0x1090: 0xe00d, 0x1091: 0x0008, + 0x1092: 0xe00d, 0x1093: 0x0008, 0x1094: 0xe00d, 0x1095: 0x0008, 0x1096: 0xe00d, 0x1097: 0x0008, + 0x1098: 0xe00d, 0x1099: 0x0008, 0x109a: 0xe00d, 0x109b: 0x0008, 0x109c: 0xe00d, 0x109d: 0x0008, + 0x109e: 0xe00d, 0x109f: 0x0008, 0x10a0: 0xe00d, 0x10a1: 0x0008, 0x10a2: 0xe00d, 0x10a3: 0x0008, + 0x10a4: 0xe00d, 0x10a5: 0x0008, 0x10a6: 0xe00d, 0x10a7: 0x0008, 0x10a8: 0xe00d, 0x10a9: 0x0008, + 0x10aa: 0xe00d, 0x10ab: 0x0008, 0x10ac: 0xe00d, 0x10ad: 0x0008, 0x10ae: 0x0008, 0x10af: 0x1308, + 0x10b0: 0x1318, 0x10b1: 0x1318, 0x10b2: 0x1318, 0x10b3: 0x0018, 0x10b4: 0x1308, 0x10b5: 0x1308, + 0x10b6: 0x1308, 0x10b7: 0x1308, 0x10b8: 0x1308, 0x10b9: 0x1308, 0x10ba: 0x1308, 0x10bb: 0x1308, + 0x10bc: 0x1308, 0x10bd: 0x1308, 0x10be: 0x0018, 0x10bf: 0x0008, + // Block 0x43, offset 0x10c0 + 0x10c0: 0xe00d, 0x10c1: 0x0008, 0x10c2: 0xe00d, 0x10c3: 0x0008, 0x10c4: 0xe00d, 0x10c5: 0x0008, + 0x10c6: 0xe00d, 0x10c7: 0x0008, 0x10c8: 0xe00d, 0x10c9: 0x0008, 0x10ca: 0xe00d, 0x10cb: 0x0008, + 0x10cc: 0xe00d, 0x10cd: 0x0008, 0x10ce: 0xe00d, 0x10cf: 0x0008, 0x10d0: 0xe00d, 0x10d1: 0x0008, + 0x10d2: 0xe00d, 0x10d3: 0x0008, 0x10d4: 0xe00d, 0x10d5: 0x0008, 0x10d6: 0xe00d, 0x10d7: 0x0008, + 0x10d8: 0xe00d, 0x10d9: 0x0008, 0x10da: 0xe00d, 0x10db: 0x0008, 0x10dc: 0x0ea1, 0x10dd: 0x6e11, + 0x10de: 0x1308, 0x10df: 0x1308, 0x10e0: 0x0008, 0x10e1: 0x0008, 0x10e2: 0x0008, 0x10e3: 0x0008, + 0x10e4: 0x0008, 0x10e5: 0x0008, 0x10e6: 0x0008, 0x10e7: 0x0008, 0x10e8: 0x0008, 0x10e9: 0x0008, + 0x10ea: 0x0008, 0x10eb: 0x0008, 0x10ec: 0x0008, 0x10ed: 0x0008, 0x10ee: 0x0008, 0x10ef: 0x0008, + 0x10f0: 0x0008, 0x10f1: 0x0008, 0x10f2: 0x0008, 0x10f3: 0x0008, 0x10f4: 0x0008, 0x10f5: 0x0008, + 0x10f6: 0x0008, 0x10f7: 0x0008, 0x10f8: 0x0008, 0x10f9: 0x0008, 0x10fa: 0x0008, 0x10fb: 0x0008, + 0x10fc: 0x0008, 0x10fd: 0x0008, 0x10fe: 0x0008, 0x10ff: 0x0008, + // Block 0x44, offset 0x1100 + 0x1100: 0x0018, 0x1101: 0x0018, 0x1102: 0x0018, 0x1103: 0x0018, 0x1104: 0x0018, 0x1105: 0x0018, + 0x1106: 0x0018, 0x1107: 0x0018, 0x1108: 0x0018, 0x1109: 0x0018, 0x110a: 0x0018, 0x110b: 0x0018, + 0x110c: 0x0018, 0x110d: 0x0018, 0x110e: 0x0018, 0x110f: 0x0018, 0x1110: 0x0018, 0x1111: 0x0018, + 0x1112: 0x0018, 0x1113: 0x0018, 0x1114: 0x0018, 0x1115: 0x0018, 0x1116: 0x0018, 0x1117: 0x0008, + 0x1118: 0x0008, 0x1119: 0x0008, 0x111a: 0x0008, 0x111b: 0x0008, 0x111c: 0x0008, 0x111d: 0x0008, + 0x111e: 0x0008, 0x111f: 0x0008, 0x1120: 0x0018, 0x1121: 0x0018, 0x1122: 0xe00d, 0x1123: 0x0008, + 0x1124: 0xe00d, 0x1125: 0x0008, 0x1126: 0xe00d, 0x1127: 0x0008, 0x1128: 0xe00d, 0x1129: 0x0008, + 0x112a: 0xe00d, 0x112b: 0x0008, 0x112c: 0xe00d, 0x112d: 0x0008, 0x112e: 0xe00d, 0x112f: 0x0008, + 0x1130: 0x0008, 0x1131: 0x0008, 0x1132: 0xe00d, 0x1133: 0x0008, 0x1134: 0xe00d, 0x1135: 0x0008, + 0x1136: 0xe00d, 0x1137: 0x0008, 0x1138: 0xe00d, 0x1139: 0x0008, 0x113a: 0xe00d, 0x113b: 0x0008, + 0x113c: 0xe00d, 0x113d: 0x0008, 0x113e: 0xe00d, 0x113f: 0x0008, + // Block 0x45, offset 0x1140 + 0x1140: 0xe00d, 0x1141: 0x0008, 0x1142: 0xe00d, 0x1143: 0x0008, 0x1144: 0xe00d, 0x1145: 0x0008, + 0x1146: 0xe00d, 0x1147: 0x0008, 0x1148: 0xe00d, 0x1149: 0x0008, 0x114a: 0xe00d, 0x114b: 0x0008, + 0x114c: 0xe00d, 0x114d: 0x0008, 0x114e: 0xe00d, 0x114f: 0x0008, 0x1150: 0xe00d, 0x1151: 0x0008, + 0x1152: 0xe00d, 0x1153: 0x0008, 0x1154: 0xe00d, 0x1155: 0x0008, 0x1156: 0xe00d, 0x1157: 0x0008, + 0x1158: 0xe00d, 0x1159: 0x0008, 0x115a: 0xe00d, 0x115b: 0x0008, 0x115c: 0xe00d, 0x115d: 0x0008, + 0x115e: 0xe00d, 0x115f: 0x0008, 0x1160: 0xe00d, 0x1161: 0x0008, 0x1162: 0xe00d, 0x1163: 0x0008, + 0x1164: 0xe00d, 0x1165: 0x0008, 0x1166: 0xe00d, 0x1167: 0x0008, 0x1168: 0xe00d, 0x1169: 0x0008, + 0x116a: 0xe00d, 0x116b: 0x0008, 0x116c: 0xe00d, 0x116d: 0x0008, 0x116e: 0xe00d, 0x116f: 0x0008, + 0x1170: 0xe0fd, 0x1171: 0x0008, 0x1172: 0x0008, 0x1173: 0x0008, 0x1174: 0x0008, 0x1175: 0x0008, + 0x1176: 0x0008, 0x1177: 0x0008, 0x1178: 0x0008, 0x1179: 0xe01d, 0x117a: 0x0008, 0x117b: 0xe03d, + 0x117c: 0x0008, 0x117d: 0x442d, 0x117e: 0xe00d, 0x117f: 0x0008, + // Block 0x46, offset 0x1180 + 0x1180: 0xe00d, 0x1181: 0x0008, 0x1182: 0xe00d, 0x1183: 0x0008, 0x1184: 0xe00d, 0x1185: 0x0008, + 0x1186: 0xe00d, 0x1187: 0x0008, 0x1188: 0x0008, 0x1189: 0x0018, 0x118a: 0x0018, 0x118b: 0xe03d, + 0x118c: 0x0008, 0x118d: 0x11d9, 0x118e: 0x0008, 0x118f: 0x0008, 0x1190: 0xe00d, 0x1191: 0x0008, + 0x1192: 0xe00d, 0x1193: 0x0008, 0x1194: 0x0008, 0x1195: 0x0008, 0x1196: 0xe00d, 0x1197: 0x0008, + 0x1198: 0xe00d, 0x1199: 0x0008, 0x119a: 0xe00d, 0x119b: 0x0008, 0x119c: 0xe00d, 0x119d: 0x0008, + 0x119e: 0xe00d, 0x119f: 0x0008, 0x11a0: 0xe00d, 0x11a1: 0x0008, 0x11a2: 0xe00d, 0x11a3: 0x0008, + 0x11a4: 0xe00d, 0x11a5: 0x0008, 0x11a6: 0xe00d, 0x11a7: 0x0008, 0x11a8: 0xe00d, 0x11a9: 0x0008, + 0x11aa: 0x6e29, 0x11ab: 0x1029, 0x11ac: 0x11c1, 0x11ad: 0x6e41, 0x11ae: 0x1221, 0x11af: 0x0040, + 0x11b0: 0x6e59, 0x11b1: 0x6e71, 0x11b2: 0x1239, 0x11b3: 0x444d, 0x11b4: 0xe00d, 0x11b5: 0x0008, + 0x11b6: 0xe00d, 0x11b7: 0x0008, 0x11b8: 0x0040, 0x11b9: 0x0040, 0x11ba: 0x0040, 0x11bb: 0x0040, + 0x11bc: 0x0040, 0x11bd: 0x0040, 0x11be: 0x0040, 0x11bf: 0x0040, + // Block 0x47, offset 0x11c0 + 0x11c0: 0x64d5, 0x11c1: 0x64f5, 0x11c2: 0x6515, 0x11c3: 0x6535, 0x11c4: 0x6555, 0x11c5: 0x6575, + 0x11c6: 0x6595, 0x11c7: 0x65b5, 0x11c8: 0x65d5, 0x11c9: 0x65f5, 0x11ca: 0x6615, 0x11cb: 0x6635, + 0x11cc: 0x6655, 0x11cd: 0x6675, 0x11ce: 0x0008, 0x11cf: 0x0008, 0x11d0: 0x6695, 0x11d1: 0x0008, + 0x11d2: 0x66b5, 0x11d3: 0x0008, 0x11d4: 0x0008, 0x11d5: 0x66d5, 0x11d6: 0x66f5, 0x11d7: 0x6715, + 0x11d8: 0x6735, 0x11d9: 0x6755, 0x11da: 0x6775, 0x11db: 0x6795, 0x11dc: 0x67b5, 0x11dd: 0x67d5, + 0x11de: 0x67f5, 0x11df: 0x0008, 0x11e0: 0x6815, 0x11e1: 0x0008, 0x11e2: 0x6835, 0x11e3: 0x0008, + 0x11e4: 0x0008, 0x11e5: 0x6855, 0x11e6: 0x6875, 0x11e7: 0x0008, 0x11e8: 0x0008, 0x11e9: 0x0008, + 0x11ea: 0x6895, 0x11eb: 0x68b5, 0x11ec: 0x68d5, 0x11ed: 0x68f5, 0x11ee: 0x6915, 0x11ef: 0x6935, + 0x11f0: 0x6955, 0x11f1: 0x6975, 0x11f2: 0x6995, 0x11f3: 0x69b5, 0x11f4: 0x69d5, 0x11f5: 0x69f5, + 0x11f6: 0x6a15, 0x11f7: 0x6a35, 0x11f8: 0x6a55, 0x11f9: 0x6a75, 0x11fa: 0x6a95, 0x11fb: 0x6ab5, + 0x11fc: 0x6ad5, 0x11fd: 0x6af5, 0x11fe: 0x6b15, 0x11ff: 0x6b35, + // Block 0x48, offset 0x1200 + 0x1200: 0x7a95, 0x1201: 0x7ab5, 0x1202: 0x7ad5, 0x1203: 0x7af5, 0x1204: 0x7b15, 0x1205: 0x7b35, + 0x1206: 0x7b55, 0x1207: 0x7b75, 0x1208: 0x7b95, 0x1209: 0x7bb5, 0x120a: 0x7bd5, 0x120b: 0x7bf5, + 0x120c: 0x7c15, 0x120d: 0x7c35, 0x120e: 0x7c55, 0x120f: 0x6ec9, 0x1210: 0x6ef1, 0x1211: 0x6f19, + 0x1212: 0x7c75, 0x1213: 0x7c95, 0x1214: 0x7cb5, 0x1215: 0x6f41, 0x1216: 0x6f69, 0x1217: 0x6f91, + 0x1218: 0x7cd5, 0x1219: 0x7cf5, 0x121a: 0x0040, 0x121b: 0x0040, 0x121c: 0x0040, 0x121d: 0x0040, + 0x121e: 0x0040, 0x121f: 0x0040, 0x1220: 0x0040, 0x1221: 0x0040, 0x1222: 0x0040, 0x1223: 0x0040, + 0x1224: 0x0040, 0x1225: 0x0040, 0x1226: 0x0040, 0x1227: 0x0040, 0x1228: 0x0040, 0x1229: 0x0040, + 0x122a: 0x0040, 0x122b: 0x0040, 0x122c: 0x0040, 0x122d: 0x0040, 0x122e: 0x0040, 0x122f: 0x0040, + 0x1230: 0x0040, 0x1231: 0x0040, 0x1232: 0x0040, 0x1233: 0x0040, 0x1234: 0x0040, 0x1235: 0x0040, + 0x1236: 0x0040, 0x1237: 0x0040, 0x1238: 0x0040, 0x1239: 0x0040, 0x123a: 0x0040, 0x123b: 0x0040, + 0x123c: 0x0040, 0x123d: 0x0040, 0x123e: 0x0040, 0x123f: 0x0040, + // Block 0x49, offset 0x1240 + 0x1240: 0x6fb9, 0x1241: 0x6fd1, 0x1242: 0x6fe9, 0x1243: 0x7d15, 0x1244: 0x7d35, 0x1245: 0x7001, + 0x1246: 0x7001, 0x1247: 0x0040, 0x1248: 0x0040, 0x1249: 0x0040, 0x124a: 0x0040, 0x124b: 0x0040, + 0x124c: 0x0040, 0x124d: 0x0040, 0x124e: 0x0040, 0x124f: 0x0040, 0x1250: 0x0040, 0x1251: 0x0040, + 0x1252: 0x0040, 0x1253: 0x7019, 0x1254: 0x7041, 0x1255: 0x7069, 0x1256: 0x7091, 0x1257: 0x70b9, + 0x1258: 0x0040, 0x1259: 0x0040, 0x125a: 0x0040, 0x125b: 0x0040, 0x125c: 0x0040, 0x125d: 0x70e1, + 0x125e: 0x1308, 0x125f: 0x7109, 0x1260: 0x7131, 0x1261: 0x20a9, 0x1262: 0x20f1, 0x1263: 0x7149, + 0x1264: 0x7161, 0x1265: 0x7179, 0x1266: 0x7191, 0x1267: 0x71a9, 0x1268: 0x71c1, 0x1269: 0x1fb2, + 0x126a: 0x71d9, 0x126b: 0x7201, 0x126c: 0x7229, 0x126d: 0x7261, 0x126e: 0x7299, 0x126f: 0x72c1, + 0x1270: 0x72e9, 0x1271: 0x7311, 0x1272: 0x7339, 0x1273: 0x7361, 0x1274: 0x7389, 0x1275: 0x73b1, + 0x1276: 0x73d9, 0x1277: 0x0040, 0x1278: 0x7401, 0x1279: 0x7429, 0x127a: 0x7451, 0x127b: 0x7479, + 0x127c: 0x74a1, 0x127d: 0x0040, 0x127e: 0x74c9, 0x127f: 0x0040, + // Block 0x4a, offset 0x1280 + 0x1280: 0x74f1, 0x1281: 0x7519, 0x1282: 0x0040, 0x1283: 0x7541, 0x1284: 0x7569, 0x1285: 0x0040, + 0x1286: 0x7591, 0x1287: 0x75b9, 0x1288: 0x75e1, 0x1289: 0x7609, 0x128a: 0x7631, 0x128b: 0x7659, + 0x128c: 0x7681, 0x128d: 0x76a9, 0x128e: 0x76d1, 0x128f: 0x76f9, 0x1290: 0x7721, 0x1291: 0x7721, + 0x1292: 0x7739, 0x1293: 0x7739, 0x1294: 0x7739, 0x1295: 0x7739, 0x1296: 0x7751, 0x1297: 0x7751, + 0x1298: 0x7751, 0x1299: 0x7751, 0x129a: 0x7769, 0x129b: 0x7769, 0x129c: 0x7769, 0x129d: 0x7769, + 0x129e: 0x7781, 0x129f: 0x7781, 0x12a0: 0x7781, 0x12a1: 0x7781, 0x12a2: 0x7799, 0x12a3: 0x7799, + 0x12a4: 0x7799, 0x12a5: 0x7799, 0x12a6: 0x77b1, 0x12a7: 0x77b1, 0x12a8: 0x77b1, 0x12a9: 0x77b1, + 0x12aa: 0x77c9, 0x12ab: 0x77c9, 0x12ac: 0x77c9, 0x12ad: 0x77c9, 0x12ae: 0x77e1, 0x12af: 0x77e1, + 0x12b0: 0x77e1, 0x12b1: 0x77e1, 0x12b2: 0x77f9, 0x12b3: 0x77f9, 0x12b4: 0x77f9, 0x12b5: 0x77f9, + 0x12b6: 0x7811, 0x12b7: 0x7811, 0x12b8: 0x7811, 0x12b9: 0x7811, 0x12ba: 0x7829, 0x12bb: 0x7829, + 0x12bc: 0x7829, 0x12bd: 0x7829, 0x12be: 0x7841, 0x12bf: 0x7841, + // Block 0x4b, offset 0x12c0 + 0x12c0: 0x7841, 0x12c1: 0x7841, 0x12c2: 0x7859, 0x12c3: 0x7859, 0x12c4: 0x7871, 0x12c5: 0x7871, + 0x12c6: 0x7889, 0x12c7: 0x7889, 0x12c8: 0x78a1, 0x12c9: 0x78a1, 0x12ca: 0x78b9, 0x12cb: 0x78b9, + 0x12cc: 0x78d1, 0x12cd: 0x78d1, 0x12ce: 0x78e9, 0x12cf: 0x78e9, 0x12d0: 0x78e9, 0x12d1: 0x78e9, + 0x12d2: 0x7901, 0x12d3: 0x7901, 0x12d4: 0x7901, 0x12d5: 0x7901, 0x12d6: 0x7919, 0x12d7: 0x7919, + 0x12d8: 0x7919, 0x12d9: 0x7919, 0x12da: 0x7931, 0x12db: 0x7931, 0x12dc: 0x7931, 0x12dd: 0x7931, + 0x12de: 0x7949, 0x12df: 0x7949, 0x12e0: 0x7961, 0x12e1: 0x7961, 0x12e2: 0x7961, 0x12e3: 0x7961, + 0x12e4: 0x7979, 0x12e5: 0x7979, 0x12e6: 0x7991, 0x12e7: 0x7991, 0x12e8: 0x7991, 0x12e9: 0x7991, + 0x12ea: 0x79a9, 0x12eb: 0x79a9, 0x12ec: 0x79a9, 0x12ed: 0x79a9, 0x12ee: 0x79c1, 0x12ef: 0x79c1, + 0x12f0: 0x79d9, 0x12f1: 0x79d9, 0x12f2: 0x0018, 0x12f3: 0x0018, 0x12f4: 0x0018, 0x12f5: 0x0018, + 0x12f6: 0x0018, 0x12f7: 0x0018, 0x12f8: 0x0018, 0x12f9: 0x0018, 0x12fa: 0x0018, 0x12fb: 0x0018, + 0x12fc: 0x0018, 0x12fd: 0x0018, 0x12fe: 0x0018, 0x12ff: 0x0018, + // Block 0x4c, offset 0x1300 + 0x1300: 0x0018, 0x1301: 0x0018, 0x1302: 0x0040, 0x1303: 0x0040, 0x1304: 0x0040, 0x1305: 0x0040, + 0x1306: 0x0040, 0x1307: 0x0040, 0x1308: 0x0040, 0x1309: 0x0040, 0x130a: 0x0040, 0x130b: 0x0040, + 0x130c: 0x0040, 0x130d: 0x0040, 0x130e: 0x0040, 0x130f: 0x0040, 0x1310: 0x0040, 0x1311: 0x0040, + 0x1312: 0x0040, 0x1313: 0x79f1, 0x1314: 0x79f1, 0x1315: 0x79f1, 0x1316: 0x79f1, 0x1317: 0x7a09, + 0x1318: 0x7a09, 0x1319: 0x7a21, 0x131a: 0x7a21, 0x131b: 0x7a39, 0x131c: 0x7a39, 0x131d: 0x0479, + 0x131e: 0x7a51, 0x131f: 0x7a51, 0x1320: 0x7a69, 0x1321: 0x7a69, 0x1322: 0x7a81, 0x1323: 0x7a81, + 0x1324: 0x7a99, 0x1325: 0x7a99, 0x1326: 0x7a99, 0x1327: 0x7a99, 0x1328: 0x7ab1, 0x1329: 0x7ab1, + 0x132a: 0x7ac9, 0x132b: 0x7ac9, 0x132c: 0x7af1, 0x132d: 0x7af1, 0x132e: 0x7b19, 0x132f: 0x7b19, + 0x1330: 0x7b41, 0x1331: 0x7b41, 0x1332: 0x7b69, 0x1333: 0x7b69, 0x1334: 0x7b91, 0x1335: 0x7b91, + 0x1336: 0x7bb9, 0x1337: 0x7bb9, 0x1338: 0x7bb9, 0x1339: 0x7be1, 0x133a: 0x7be1, 0x133b: 0x7be1, + 0x133c: 0x7c09, 0x133d: 0x7c09, 0x133e: 0x7c09, 0x133f: 0x7c09, + // Block 0x4d, offset 0x1340 + 0x1340: 0x85f9, 0x1341: 0x8621, 0x1342: 0x8649, 0x1343: 0x8671, 0x1344: 0x8699, 0x1345: 0x86c1, + 0x1346: 0x86e9, 0x1347: 0x8711, 0x1348: 0x8739, 0x1349: 0x8761, 0x134a: 0x8789, 0x134b: 0x87b1, + 0x134c: 0x87d9, 0x134d: 0x8801, 0x134e: 0x8829, 0x134f: 0x8851, 0x1350: 0x8879, 0x1351: 0x88a1, + 0x1352: 0x88c9, 0x1353: 0x88f1, 0x1354: 0x8919, 0x1355: 0x8941, 0x1356: 0x8969, 0x1357: 0x8991, + 0x1358: 0x89b9, 0x1359: 0x89e1, 0x135a: 0x8a09, 0x135b: 0x8a31, 0x135c: 0x8a59, 0x135d: 0x8a81, + 0x135e: 0x8aaa, 0x135f: 0x8ada, 0x1360: 0x8b0a, 0x1361: 0x8b3a, 0x1362: 0x8b6a, 0x1363: 0x8b9a, + 0x1364: 0x8bc9, 0x1365: 0x8bf1, 0x1366: 0x7c71, 0x1367: 0x8c19, 0x1368: 0x7be1, 0x1369: 0x7c99, + 0x136a: 0x8c41, 0x136b: 0x8c69, 0x136c: 0x7d39, 0x136d: 0x8c91, 0x136e: 0x7d61, 0x136f: 0x7d89, + 0x1370: 0x8cb9, 0x1371: 0x8ce1, 0x1372: 0x7e29, 0x1373: 0x8d09, 0x1374: 0x7e51, 0x1375: 0x7e79, + 0x1376: 0x8d31, 0x1377: 0x8d59, 0x1378: 0x7ec9, 0x1379: 0x8d81, 0x137a: 0x7ef1, 0x137b: 0x7f19, + 0x137c: 0x83a1, 0x137d: 0x83c9, 0x137e: 0x8441, 0x137f: 0x8469, + // Block 0x4e, offset 0x1380 + 0x1380: 0x8491, 0x1381: 0x8531, 0x1382: 0x8559, 0x1383: 0x8581, 0x1384: 0x85a9, 0x1385: 0x8649, + 0x1386: 0x8671, 0x1387: 0x8699, 0x1388: 0x8da9, 0x1389: 0x8739, 0x138a: 0x8dd1, 0x138b: 0x8df9, + 0x138c: 0x8829, 0x138d: 0x8e21, 0x138e: 0x8851, 0x138f: 0x8879, 0x1390: 0x8a81, 0x1391: 0x8e49, + 0x1392: 0x8e71, 0x1393: 0x89b9, 0x1394: 0x8e99, 0x1395: 0x89e1, 0x1396: 0x8a09, 0x1397: 0x7c21, + 0x1398: 0x7c49, 0x1399: 0x8ec1, 0x139a: 0x7c71, 0x139b: 0x8ee9, 0x139c: 0x7cc1, 0x139d: 0x7ce9, + 0x139e: 0x7d11, 0x139f: 0x7d39, 0x13a0: 0x8f11, 0x13a1: 0x7db1, 0x13a2: 0x7dd9, 0x13a3: 0x7e01, + 0x13a4: 0x7e29, 0x13a5: 0x8f39, 0x13a6: 0x7ec9, 0x13a7: 0x7f41, 0x13a8: 0x7f69, 0x13a9: 0x7f91, + 0x13aa: 0x7fb9, 0x13ab: 0x7fe1, 0x13ac: 0x8031, 0x13ad: 0x8059, 0x13ae: 0x8081, 0x13af: 0x80a9, + 0x13b0: 0x80d1, 0x13b1: 0x80f9, 0x13b2: 0x8f61, 0x13b3: 0x8121, 0x13b4: 0x8149, 0x13b5: 0x8171, + 0x13b6: 0x8199, 0x13b7: 0x81c1, 0x13b8: 0x81e9, 0x13b9: 0x8239, 0x13ba: 0x8261, 0x13bb: 0x8289, + 0x13bc: 0x82b1, 0x13bd: 0x82d9, 0x13be: 0x8301, 0x13bf: 0x8329, + // Block 0x4f, offset 0x13c0 + 0x13c0: 0x8351, 0x13c1: 0x8379, 0x13c2: 0x83f1, 0x13c3: 0x8419, 0x13c4: 0x84b9, 0x13c5: 0x84e1, + 0x13c6: 0x8509, 0x13c7: 0x8531, 0x13c8: 0x8559, 0x13c9: 0x85d1, 0x13ca: 0x85f9, 0x13cb: 0x8621, + 0x13cc: 0x8649, 0x13cd: 0x8f89, 0x13ce: 0x86c1, 0x13cf: 0x86e9, 0x13d0: 0x8711, 0x13d1: 0x8739, + 0x13d2: 0x87b1, 0x13d3: 0x87d9, 0x13d4: 0x8801, 0x13d5: 0x8829, 0x13d6: 0x8fb1, 0x13d7: 0x88a1, + 0x13d8: 0x88c9, 0x13d9: 0x8fd9, 0x13da: 0x8941, 0x13db: 0x8969, 0x13dc: 0x8991, 0x13dd: 0x89b9, + 0x13de: 0x9001, 0x13df: 0x7c71, 0x13e0: 0x8ee9, 0x13e1: 0x7d39, 0x13e2: 0x8f11, 0x13e3: 0x7e29, + 0x13e4: 0x8f39, 0x13e5: 0x7ec9, 0x13e6: 0x9029, 0x13e7: 0x80d1, 0x13e8: 0x9051, 0x13e9: 0x9079, + 0x13ea: 0x90a1, 0x13eb: 0x8531, 0x13ec: 0x8559, 0x13ed: 0x8649, 0x13ee: 0x8829, 0x13ef: 0x8fb1, + 0x13f0: 0x89b9, 0x13f1: 0x9001, 0x13f2: 0x90c9, 0x13f3: 0x9101, 0x13f4: 0x9139, 0x13f5: 0x9171, + 0x13f6: 0x9199, 0x13f7: 0x91c1, 0x13f8: 0x91e9, 0x13f9: 0x9211, 0x13fa: 0x9239, 0x13fb: 0x9261, + 0x13fc: 0x9289, 0x13fd: 0x92b1, 0x13fe: 0x92d9, 0x13ff: 0x9301, + // Block 0x50, offset 0x1400 + 0x1400: 0x9329, 0x1401: 0x9351, 0x1402: 0x9379, 0x1403: 0x93a1, 0x1404: 0x93c9, 0x1405: 0x93f1, + 0x1406: 0x9419, 0x1407: 0x9441, 0x1408: 0x9469, 0x1409: 0x9491, 0x140a: 0x94b9, 0x140b: 0x94e1, + 0x140c: 0x9079, 0x140d: 0x9509, 0x140e: 0x9531, 0x140f: 0x9559, 0x1410: 0x9581, 0x1411: 0x9171, + 0x1412: 0x9199, 0x1413: 0x91c1, 0x1414: 0x91e9, 0x1415: 0x9211, 0x1416: 0x9239, 0x1417: 0x9261, + 0x1418: 0x9289, 0x1419: 0x92b1, 0x141a: 0x92d9, 0x141b: 0x9301, 0x141c: 0x9329, 0x141d: 0x9351, + 0x141e: 0x9379, 0x141f: 0x93a1, 0x1420: 0x93c9, 0x1421: 0x93f1, 0x1422: 0x9419, 0x1423: 0x9441, + 0x1424: 0x9469, 0x1425: 0x9491, 0x1426: 0x94b9, 0x1427: 0x94e1, 0x1428: 0x9079, 0x1429: 0x9509, + 0x142a: 0x9531, 0x142b: 0x9559, 0x142c: 0x9581, 0x142d: 0x9491, 0x142e: 0x94b9, 0x142f: 0x94e1, + 0x1430: 0x9079, 0x1431: 0x9051, 0x1432: 0x90a1, 0x1433: 0x8211, 0x1434: 0x8059, 0x1435: 0x8081, + 0x1436: 0x80a9, 0x1437: 0x9491, 0x1438: 0x94b9, 0x1439: 0x94e1, 0x143a: 0x8211, 0x143b: 0x8239, + 0x143c: 0x95a9, 0x143d: 0x95a9, 0x143e: 0x0018, 0x143f: 0x0018, + // Block 0x51, offset 0x1440 + 0x1440: 0x0040, 0x1441: 0x0040, 0x1442: 0x0040, 0x1443: 0x0040, 0x1444: 0x0040, 0x1445: 0x0040, + 0x1446: 0x0040, 0x1447: 0x0040, 0x1448: 0x0040, 0x1449: 0x0040, 0x144a: 0x0040, 0x144b: 0x0040, + 0x144c: 0x0040, 0x144d: 0x0040, 0x144e: 0x0040, 0x144f: 0x0040, 0x1450: 0x95d1, 0x1451: 0x9609, + 0x1452: 0x9609, 0x1453: 0x9641, 0x1454: 0x9679, 0x1455: 0x96b1, 0x1456: 0x96e9, 0x1457: 0x9721, + 0x1458: 0x9759, 0x1459: 0x9759, 0x145a: 0x9791, 0x145b: 0x97c9, 0x145c: 0x9801, 0x145d: 0x9839, + 0x145e: 0x9871, 0x145f: 0x98a9, 0x1460: 0x98a9, 0x1461: 0x98e1, 0x1462: 0x9919, 0x1463: 0x9919, + 0x1464: 0x9951, 0x1465: 0x9951, 0x1466: 0x9989, 0x1467: 0x99c1, 0x1468: 0x99c1, 0x1469: 0x99f9, + 0x146a: 0x9a31, 0x146b: 0x9a31, 0x146c: 0x9a69, 0x146d: 0x9a69, 0x146e: 0x9aa1, 0x146f: 0x9ad9, + 0x1470: 0x9ad9, 0x1471: 0x9b11, 0x1472: 0x9b11, 0x1473: 0x9b49, 0x1474: 0x9b81, 0x1475: 0x9bb9, + 0x1476: 0x9bf1, 0x1477: 0x9bf1, 0x1478: 0x9c29, 0x1479: 0x9c61, 0x147a: 0x9c99, 0x147b: 0x9cd1, + 0x147c: 0x9d09, 0x147d: 0x9d09, 0x147e: 0x9d41, 0x147f: 0x9d79, + // Block 0x52, offset 0x1480 + 0x1480: 0xa949, 0x1481: 0xa981, 0x1482: 0xa9b9, 0x1483: 0xa8a1, 0x1484: 0x9bb9, 0x1485: 0x9989, + 0x1486: 0xa9f1, 0x1487: 0xaa29, 0x1488: 0x0040, 0x1489: 0x0040, 0x148a: 0x0040, 0x148b: 0x0040, + 0x148c: 0x0040, 0x148d: 0x0040, 0x148e: 0x0040, 0x148f: 0x0040, 0x1490: 0x0040, 0x1491: 0x0040, + 0x1492: 0x0040, 0x1493: 0x0040, 0x1494: 0x0040, 0x1495: 0x0040, 0x1496: 0x0040, 0x1497: 0x0040, + 0x1498: 0x0040, 0x1499: 0x0040, 0x149a: 0x0040, 0x149b: 0x0040, 0x149c: 0x0040, 0x149d: 0x0040, + 0x149e: 0x0040, 0x149f: 0x0040, 0x14a0: 0x0040, 0x14a1: 0x0040, 0x14a2: 0x0040, 0x14a3: 0x0040, + 0x14a4: 0x0040, 0x14a5: 0x0040, 0x14a6: 0x0040, 0x14a7: 0x0040, 0x14a8: 0x0040, 0x14a9: 0x0040, + 0x14aa: 0x0040, 0x14ab: 0x0040, 0x14ac: 0x0040, 0x14ad: 0x0040, 0x14ae: 0x0040, 0x14af: 0x0040, + 0x14b0: 0xaa61, 0x14b1: 0xaa99, 0x14b2: 0xaad1, 0x14b3: 0xab19, 0x14b4: 0xab61, 0x14b5: 0xaba9, + 0x14b6: 0xabf1, 0x14b7: 0xac39, 0x14b8: 0xac81, 0x14b9: 0xacc9, 0x14ba: 0xad02, 0x14bb: 0xae12, + 0x14bc: 0xae91, 0x14bd: 0x0018, 0x14be: 0x0040, 0x14bf: 0x0040, + // Block 0x53, offset 0x14c0 + 0x14c0: 0x13c0, 0x14c1: 0x13c0, 0x14c2: 0x13c0, 0x14c3: 0x13c0, 0x14c4: 0x13c0, 0x14c5: 0x13c0, + 0x14c6: 0x13c0, 0x14c7: 0x13c0, 0x14c8: 0x13c0, 0x14c9: 0x13c0, 0x14ca: 0x13c0, 0x14cb: 0x13c0, + 0x14cc: 0x13c0, 0x14cd: 0x13c0, 0x14ce: 0x13c0, 0x14cf: 0x13c0, 0x14d0: 0xaeda, 0x14d1: 0x7d55, + 0x14d2: 0x0040, 0x14d3: 0xaeea, 0x14d4: 0x03c2, 0x14d5: 0xaefa, 0x14d6: 0xaf0a, 0x14d7: 0x7d75, + 0x14d8: 0x7d95, 0x14d9: 0x0040, 0x14da: 0x0040, 0x14db: 0x0040, 0x14dc: 0x0040, 0x14dd: 0x0040, + 0x14de: 0x0040, 0x14df: 0x0040, 0x14e0: 0x1308, 0x14e1: 0x1308, 0x14e2: 0x1308, 0x14e3: 0x1308, + 0x14e4: 0x1308, 0x14e5: 0x1308, 0x14e6: 0x1308, 0x14e7: 0x1308, 0x14e8: 0x1308, 0x14e9: 0x1308, + 0x14ea: 0x1308, 0x14eb: 0x1308, 0x14ec: 0x1308, 0x14ed: 0x1308, 0x14ee: 0x1308, 0x14ef: 0x1308, + 0x14f0: 0x0040, 0x14f1: 0x7db5, 0x14f2: 0x7dd5, 0x14f3: 0xaf1a, 0x14f4: 0xaf1a, 0x14f5: 0x1fd2, + 0x14f6: 0x1fe2, 0x14f7: 0xaf2a, 0x14f8: 0xaf3a, 0x14f9: 0x7df5, 0x14fa: 0x7e15, 0x14fb: 0x7e35, + 0x14fc: 0x7df5, 0x14fd: 0x7e55, 0x14fe: 0x7e75, 0x14ff: 0x7e55, + // Block 0x54, offset 0x1500 + 0x1500: 0x7e95, 0x1501: 0x7eb5, 0x1502: 0x7ed5, 0x1503: 0x7eb5, 0x1504: 0x7ef5, 0x1505: 0x0018, + 0x1506: 0x0018, 0x1507: 0xaf4a, 0x1508: 0xaf5a, 0x1509: 0x7f16, 0x150a: 0x7f36, 0x150b: 0x7f56, + 0x150c: 0x7f76, 0x150d: 0xaf1a, 0x150e: 0xaf1a, 0x150f: 0xaf1a, 0x1510: 0xaeda, 0x1511: 0x7f95, + 0x1512: 0x0040, 0x1513: 0x0040, 0x1514: 0x03c2, 0x1515: 0xaeea, 0x1516: 0xaf0a, 0x1517: 0xaefa, + 0x1518: 0x7fb5, 0x1519: 0x1fd2, 0x151a: 0x1fe2, 0x151b: 0xaf2a, 0x151c: 0xaf3a, 0x151d: 0x7e95, + 0x151e: 0x7ef5, 0x151f: 0xaf6a, 0x1520: 0xaf7a, 0x1521: 0xaf8a, 0x1522: 0x1fb2, 0x1523: 0xaf99, + 0x1524: 0xafaa, 0x1525: 0xafba, 0x1526: 0x1fc2, 0x1527: 0x0040, 0x1528: 0xafca, 0x1529: 0xafda, + 0x152a: 0xafea, 0x152b: 0xaffa, 0x152c: 0x0040, 0x152d: 0x0040, 0x152e: 0x0040, 0x152f: 0x0040, + 0x1530: 0x7fd6, 0x1531: 0xb009, 0x1532: 0x7ff6, 0x1533: 0x0008, 0x1534: 0x8016, 0x1535: 0x0040, + 0x1536: 0x8036, 0x1537: 0xb031, 0x1538: 0x8056, 0x1539: 0xb059, 0x153a: 0x8076, 0x153b: 0xb081, + 0x153c: 0x8096, 0x153d: 0xb0a9, 0x153e: 0x80b6, 0x153f: 0xb0d1, + // Block 0x55, offset 0x1540 + 0x1540: 0xb0f9, 0x1541: 0xb111, 0x1542: 0xb111, 0x1543: 0xb129, 0x1544: 0xb129, 0x1545: 0xb141, + 0x1546: 0xb141, 0x1547: 0xb159, 0x1548: 0xb159, 0x1549: 0xb171, 0x154a: 0xb171, 0x154b: 0xb171, + 0x154c: 0xb171, 0x154d: 0xb189, 0x154e: 0xb189, 0x154f: 0xb1a1, 0x1550: 0xb1a1, 0x1551: 0xb1a1, + 0x1552: 0xb1a1, 0x1553: 0xb1b9, 0x1554: 0xb1b9, 0x1555: 0xb1d1, 0x1556: 0xb1d1, 0x1557: 0xb1d1, + 0x1558: 0xb1d1, 0x1559: 0xb1e9, 0x155a: 0xb1e9, 0x155b: 0xb1e9, 0x155c: 0xb1e9, 0x155d: 0xb201, + 0x155e: 0xb201, 0x155f: 0xb201, 0x1560: 0xb201, 0x1561: 0xb219, 0x1562: 0xb219, 0x1563: 0xb219, + 0x1564: 0xb219, 0x1565: 0xb231, 0x1566: 0xb231, 0x1567: 0xb231, 0x1568: 0xb231, 0x1569: 0xb249, + 0x156a: 0xb249, 0x156b: 0xb261, 0x156c: 0xb261, 0x156d: 0xb279, 0x156e: 0xb279, 0x156f: 0xb291, + 0x1570: 0xb291, 0x1571: 0xb2a9, 0x1572: 0xb2a9, 0x1573: 0xb2a9, 0x1574: 0xb2a9, 0x1575: 0xb2c1, + 0x1576: 0xb2c1, 0x1577: 0xb2c1, 0x1578: 0xb2c1, 0x1579: 0xb2d9, 0x157a: 0xb2d9, 0x157b: 0xb2d9, + 0x157c: 0xb2d9, 0x157d: 0xb2f1, 0x157e: 0xb2f1, 0x157f: 0xb2f1, + // Block 0x56, offset 0x1580 + 0x1580: 0xb2f1, 0x1581: 0xb309, 0x1582: 0xb309, 0x1583: 0xb309, 0x1584: 0xb309, 0x1585: 0xb321, + 0x1586: 0xb321, 0x1587: 0xb321, 0x1588: 0xb321, 0x1589: 0xb339, 0x158a: 0xb339, 0x158b: 0xb339, + 0x158c: 0xb339, 0x158d: 0xb351, 0x158e: 0xb351, 0x158f: 0xb351, 0x1590: 0xb351, 0x1591: 0xb369, + 0x1592: 0xb369, 0x1593: 0xb369, 0x1594: 0xb369, 0x1595: 0xb381, 0x1596: 0xb381, 0x1597: 0xb381, + 0x1598: 0xb381, 0x1599: 0xb399, 0x159a: 0xb399, 0x159b: 0xb399, 0x159c: 0xb399, 0x159d: 0xb3b1, + 0x159e: 0xb3b1, 0x159f: 0xb3b1, 0x15a0: 0xb3b1, 0x15a1: 0xb3c9, 0x15a2: 0xb3c9, 0x15a3: 0xb3c9, + 0x15a4: 0xb3c9, 0x15a5: 0xb3e1, 0x15a6: 0xb3e1, 0x15a7: 0xb3e1, 0x15a8: 0xb3e1, 0x15a9: 0xb3f9, + 0x15aa: 0xb3f9, 0x15ab: 0xb3f9, 0x15ac: 0xb3f9, 0x15ad: 0xb411, 0x15ae: 0xb411, 0x15af: 0x7ab1, + 0x15b0: 0x7ab1, 0x15b1: 0xb429, 0x15b2: 0xb429, 0x15b3: 0xb429, 0x15b4: 0xb429, 0x15b5: 0xb441, + 0x15b6: 0xb441, 0x15b7: 0xb469, 0x15b8: 0xb469, 0x15b9: 0xb491, 0x15ba: 0xb491, 0x15bb: 0xb4b9, + 0x15bc: 0xb4b9, 0x15bd: 0x0040, 0x15be: 0x0040, 0x15bf: 0x03c0, + // Block 0x57, offset 0x15c0 + 0x15c0: 0x0040, 0x15c1: 0xaefa, 0x15c2: 0xb4e2, 0x15c3: 0xaf6a, 0x15c4: 0xafda, 0x15c5: 0xafea, + 0x15c6: 0xaf7a, 0x15c7: 0xb4f2, 0x15c8: 0x1fd2, 0x15c9: 0x1fe2, 0x15ca: 0xaf8a, 0x15cb: 0x1fb2, + 0x15cc: 0xaeda, 0x15cd: 0xaf99, 0x15ce: 0x29d1, 0x15cf: 0xb502, 0x15d0: 0x1f41, 0x15d1: 0x00c9, + 0x15d2: 0x0069, 0x15d3: 0x0079, 0x15d4: 0x1f51, 0x15d5: 0x1f61, 0x15d6: 0x1f71, 0x15d7: 0x1f81, + 0x15d8: 0x1f91, 0x15d9: 0x1fa1, 0x15da: 0xaeea, 0x15db: 0x03c2, 0x15dc: 0xafaa, 0x15dd: 0x1fc2, + 0x15de: 0xafba, 0x15df: 0xaf0a, 0x15e0: 0xaffa, 0x15e1: 0x0039, 0x15e2: 0x0ee9, 0x15e3: 0x1159, + 0x15e4: 0x0ef9, 0x15e5: 0x0f09, 0x15e6: 0x1199, 0x15e7: 0x0f31, 0x15e8: 0x0249, 0x15e9: 0x0f41, + 0x15ea: 0x0259, 0x15eb: 0x0f51, 0x15ec: 0x0359, 0x15ed: 0x0f61, 0x15ee: 0x0f71, 0x15ef: 0x00d9, + 0x15f0: 0x0f99, 0x15f1: 0x2039, 0x15f2: 0x0269, 0x15f3: 0x01d9, 0x15f4: 0x0fa9, 0x15f5: 0x0fb9, + 0x15f6: 0x1089, 0x15f7: 0x0279, 0x15f8: 0x0369, 0x15f9: 0x0289, 0x15fa: 0x13d1, 0x15fb: 0xaf4a, + 0x15fc: 0xafca, 0x15fd: 0xaf5a, 0x15fe: 0xb512, 0x15ff: 0xaf1a, + // Block 0x58, offset 0x1600 + 0x1600: 0x1caa, 0x1601: 0x0039, 0x1602: 0x0ee9, 0x1603: 0x1159, 0x1604: 0x0ef9, 0x1605: 0x0f09, + 0x1606: 0x1199, 0x1607: 0x0f31, 0x1608: 0x0249, 0x1609: 0x0f41, 0x160a: 0x0259, 0x160b: 0x0f51, + 0x160c: 0x0359, 0x160d: 0x0f61, 0x160e: 0x0f71, 0x160f: 0x00d9, 0x1610: 0x0f99, 0x1611: 0x2039, + 0x1612: 0x0269, 0x1613: 0x01d9, 0x1614: 0x0fa9, 0x1615: 0x0fb9, 0x1616: 0x1089, 0x1617: 0x0279, + 0x1618: 0x0369, 0x1619: 0x0289, 0x161a: 0x13d1, 0x161b: 0xaf2a, 0x161c: 0xb522, 0x161d: 0xaf3a, + 0x161e: 0xb532, 0x161f: 0x80d5, 0x1620: 0x80f5, 0x1621: 0x29d1, 0x1622: 0x8115, 0x1623: 0x8115, + 0x1624: 0x8135, 0x1625: 0x8155, 0x1626: 0x8175, 0x1627: 0x8195, 0x1628: 0x81b5, 0x1629: 0x81d5, + 0x162a: 0x81f5, 0x162b: 0x8215, 0x162c: 0x8235, 0x162d: 0x8255, 0x162e: 0x8275, 0x162f: 0x8295, + 0x1630: 0x82b5, 0x1631: 0x82d5, 0x1632: 0x82f5, 0x1633: 0x8315, 0x1634: 0x8335, 0x1635: 0x8355, + 0x1636: 0x8375, 0x1637: 0x8395, 0x1638: 0x83b5, 0x1639: 0x83d5, 0x163a: 0x83f5, 0x163b: 0x8415, + 0x163c: 0x81b5, 0x163d: 0x8435, 0x163e: 0x8455, 0x163f: 0x8215, + // Block 0x59, offset 0x1640 + 0x1640: 0x8475, 0x1641: 0x8495, 0x1642: 0x84b5, 0x1643: 0x84d5, 0x1644: 0x84f5, 0x1645: 0x8515, + 0x1646: 0x8535, 0x1647: 0x8555, 0x1648: 0x84d5, 0x1649: 0x8575, 0x164a: 0x84d5, 0x164b: 0x8595, + 0x164c: 0x8595, 0x164d: 0x85b5, 0x164e: 0x85b5, 0x164f: 0x85d5, 0x1650: 0x8515, 0x1651: 0x85f5, + 0x1652: 0x8615, 0x1653: 0x85f5, 0x1654: 0x8635, 0x1655: 0x8615, 0x1656: 0x8655, 0x1657: 0x8655, + 0x1658: 0x8675, 0x1659: 0x8675, 0x165a: 0x8695, 0x165b: 0x8695, 0x165c: 0x8615, 0x165d: 0x8115, + 0x165e: 0x86b5, 0x165f: 0x86d5, 0x1660: 0x0040, 0x1661: 0x86f5, 0x1662: 0x8715, 0x1663: 0x8735, + 0x1664: 0x8755, 0x1665: 0x8735, 0x1666: 0x8775, 0x1667: 0x8795, 0x1668: 0x87b5, 0x1669: 0x87b5, + 0x166a: 0x87d5, 0x166b: 0x87d5, 0x166c: 0x87f5, 0x166d: 0x87f5, 0x166e: 0x87d5, 0x166f: 0x87d5, + 0x1670: 0x8815, 0x1671: 0x8835, 0x1672: 0x8855, 0x1673: 0x8875, 0x1674: 0x8895, 0x1675: 0x88b5, + 0x1676: 0x88b5, 0x1677: 0x88b5, 0x1678: 0x88d5, 0x1679: 0x88d5, 0x167a: 0x88d5, 0x167b: 0x88d5, + 0x167c: 0x87b5, 0x167d: 0x87b5, 0x167e: 0x87b5, 0x167f: 0x0040, + // Block 0x5a, offset 0x1680 + 0x1680: 0x0040, 0x1681: 0x0040, 0x1682: 0x8715, 0x1683: 0x86f5, 0x1684: 0x88f5, 0x1685: 0x86f5, + 0x1686: 0x8715, 0x1687: 0x86f5, 0x1688: 0x0040, 0x1689: 0x0040, 0x168a: 0x8915, 0x168b: 0x8715, + 0x168c: 0x8935, 0x168d: 0x88f5, 0x168e: 0x8935, 0x168f: 0x8715, 0x1690: 0x0040, 0x1691: 0x0040, + 0x1692: 0x8955, 0x1693: 0x8975, 0x1694: 0x8875, 0x1695: 0x8935, 0x1696: 0x88f5, 0x1697: 0x8935, + 0x1698: 0x0040, 0x1699: 0x0040, 0x169a: 0x8995, 0x169b: 0x89b5, 0x169c: 0x8995, 0x169d: 0x0040, + 0x169e: 0x0040, 0x169f: 0x0040, 0x16a0: 0xb541, 0x16a1: 0xb559, 0x16a2: 0xb571, 0x16a3: 0x89d6, + 0x16a4: 0xb589, 0x16a5: 0xb5a1, 0x16a6: 0x89f5, 0x16a7: 0x0040, 0x16a8: 0x8a15, 0x16a9: 0x8a35, + 0x16aa: 0x8a55, 0x16ab: 0x8a35, 0x16ac: 0x8a75, 0x16ad: 0x8a95, 0x16ae: 0x8ab5, 0x16af: 0x0040, + 0x16b0: 0x0040, 0x16b1: 0x0040, 0x16b2: 0x0040, 0x16b3: 0x0040, 0x16b4: 0x0040, 0x16b5: 0x0040, + 0x16b6: 0x0040, 0x16b7: 0x0040, 0x16b8: 0x0040, 0x16b9: 0x0340, 0x16ba: 0x0340, 0x16bb: 0x0340, + 0x16bc: 0x0040, 0x16bd: 0x0040, 0x16be: 0x0040, 0x16bf: 0x0040, + // Block 0x5b, offset 0x16c0 + 0x16c0: 0x0208, 0x16c1: 0x0208, 0x16c2: 0x0208, 0x16c3: 0x0208, 0x16c4: 0x0208, 0x16c5: 0x0408, + 0x16c6: 0x0008, 0x16c7: 0x0408, 0x16c8: 0x0018, 0x16c9: 0x0408, 0x16ca: 0x0408, 0x16cb: 0x0008, + 0x16cc: 0x0008, 0x16cd: 0x0108, 0x16ce: 0x0408, 0x16cf: 0x0408, 0x16d0: 0x0408, 0x16d1: 0x0408, + 0x16d2: 0x0408, 0x16d3: 0x0208, 0x16d4: 0x0208, 0x16d5: 0x0208, 0x16d6: 0x0208, 0x16d7: 0x0108, + 0x16d8: 0x0208, 0x16d9: 0x0208, 0x16da: 0x0208, 0x16db: 0x0208, 0x16dc: 0x0208, 0x16dd: 0x0408, + 0x16de: 0x0208, 0x16df: 0x0208, 0x16e0: 0x0208, 0x16e1: 0x0408, 0x16e2: 0x0008, 0x16e3: 0x0008, + 0x16e4: 0x0408, 0x16e5: 0x1308, 0x16e6: 0x1308, 0x16e7: 0x0040, 0x16e8: 0x0040, 0x16e9: 0x0040, + 0x16ea: 0x0040, 0x16eb: 0x0218, 0x16ec: 0x0218, 0x16ed: 0x0218, 0x16ee: 0x0218, 0x16ef: 0x0418, + 0x16f0: 0x0018, 0x16f1: 0x0018, 0x16f2: 0x0018, 0x16f3: 0x0018, 0x16f4: 0x0018, 0x16f5: 0x0018, + 0x16f6: 0x0018, 0x16f7: 0x0040, 0x16f8: 0x0040, 0x16f9: 0x0040, 0x16fa: 0x0040, 0x16fb: 0x0040, + 0x16fc: 0x0040, 0x16fd: 0x0040, 0x16fe: 0x0040, 0x16ff: 0x0040, + // Block 0x5c, offset 0x1700 + 0x1700: 0x0208, 0x1701: 0x0408, 0x1702: 0x0208, 0x1703: 0x0408, 0x1704: 0x0408, 0x1705: 0x0408, + 0x1706: 0x0208, 0x1707: 0x0208, 0x1708: 0x0208, 0x1709: 0x0408, 0x170a: 0x0208, 0x170b: 0x0208, + 0x170c: 0x0408, 0x170d: 0x0208, 0x170e: 0x0408, 0x170f: 0x0408, 0x1710: 0x0208, 0x1711: 0x0408, + 0x1712: 0x0040, 0x1713: 0x0040, 0x1714: 0x0040, 0x1715: 0x0040, 0x1716: 0x0040, 0x1717: 0x0040, + 0x1718: 0x0040, 0x1719: 0x0018, 0x171a: 0x0018, 0x171b: 0x0018, 0x171c: 0x0018, 0x171d: 0x0040, + 0x171e: 0x0040, 0x171f: 0x0040, 0x1720: 0x0040, 0x1721: 0x0040, 0x1722: 0x0040, 0x1723: 0x0040, + 0x1724: 0x0040, 0x1725: 0x0040, 0x1726: 0x0040, 0x1727: 0x0040, 0x1728: 0x0040, 0x1729: 0x0418, + 0x172a: 0x0418, 0x172b: 0x0418, 0x172c: 0x0418, 0x172d: 0x0218, 0x172e: 0x0218, 0x172f: 0x0018, + 0x1730: 0x0040, 0x1731: 0x0040, 0x1732: 0x0040, 0x1733: 0x0040, 0x1734: 0x0040, 0x1735: 0x0040, + 0x1736: 0x0040, 0x1737: 0x0040, 0x1738: 0x0040, 0x1739: 0x0040, 0x173a: 0x0040, 0x173b: 0x0040, + 0x173c: 0x0040, 0x173d: 0x0040, 0x173e: 0x0040, 0x173f: 0x0040, + // Block 0x5d, offset 0x1740 + 0x1740: 0x1308, 0x1741: 0x1308, 0x1742: 0x1008, 0x1743: 0x1008, 0x1744: 0x0040, 0x1745: 0x0008, + 0x1746: 0x0008, 0x1747: 0x0008, 0x1748: 0x0008, 0x1749: 0x0008, 0x174a: 0x0008, 0x174b: 0x0008, + 0x174c: 0x0008, 0x174d: 0x0040, 0x174e: 0x0040, 0x174f: 0x0008, 0x1750: 0x0008, 0x1751: 0x0040, + 0x1752: 0x0040, 0x1753: 0x0008, 0x1754: 0x0008, 0x1755: 0x0008, 0x1756: 0x0008, 0x1757: 0x0008, + 0x1758: 0x0008, 0x1759: 0x0008, 0x175a: 0x0008, 0x175b: 0x0008, 0x175c: 0x0008, 0x175d: 0x0008, + 0x175e: 0x0008, 0x175f: 0x0008, 0x1760: 0x0008, 0x1761: 0x0008, 0x1762: 0x0008, 0x1763: 0x0008, + 0x1764: 0x0008, 0x1765: 0x0008, 0x1766: 0x0008, 0x1767: 0x0008, 0x1768: 0x0008, 0x1769: 0x0040, + 0x176a: 0x0008, 0x176b: 0x0008, 0x176c: 0x0008, 0x176d: 0x0008, 0x176e: 0x0008, 0x176f: 0x0008, + 0x1770: 0x0008, 0x1771: 0x0040, 0x1772: 0x0008, 0x1773: 0x0008, 0x1774: 0x0040, 0x1775: 0x0008, + 0x1776: 0x0008, 0x1777: 0x0008, 0x1778: 0x0008, 0x1779: 0x0008, 0x177a: 0x0040, 0x177b: 0x0040, + 0x177c: 0x1308, 0x177d: 0x0008, 0x177e: 0x1008, 0x177f: 0x1008, + // Block 0x5e, offset 0x1780 + 0x1780: 0x1308, 0x1781: 0x1008, 0x1782: 0x1008, 0x1783: 0x1008, 0x1784: 0x1008, 0x1785: 0x0040, + 0x1786: 0x0040, 0x1787: 0x1008, 0x1788: 0x1008, 0x1789: 0x0040, 0x178a: 0x0040, 0x178b: 0x1008, + 0x178c: 0x1008, 0x178d: 0x1808, 0x178e: 0x0040, 0x178f: 0x0040, 0x1790: 0x0008, 0x1791: 0x0040, + 0x1792: 0x0040, 0x1793: 0x0040, 0x1794: 0x0040, 0x1795: 0x0040, 0x1796: 0x0040, 0x1797: 0x1008, + 0x1798: 0x0040, 0x1799: 0x0040, 0x179a: 0x0040, 0x179b: 0x0040, 0x179c: 0x0040, 0x179d: 0x0008, + 0x179e: 0x0008, 0x179f: 0x0008, 0x17a0: 0x0008, 0x17a1: 0x0008, 0x17a2: 0x1008, 0x17a3: 0x1008, + 0x17a4: 0x0040, 0x17a5: 0x0040, 0x17a6: 0x1308, 0x17a7: 0x1308, 0x17a8: 0x1308, 0x17a9: 0x1308, + 0x17aa: 0x1308, 0x17ab: 0x1308, 0x17ac: 0x1308, 0x17ad: 0x0040, 0x17ae: 0x0040, 0x17af: 0x0040, + 0x17b0: 0x1308, 0x17b1: 0x1308, 0x17b2: 0x1308, 0x17b3: 0x1308, 0x17b4: 0x1308, 0x17b5: 0x0040, + 0x17b6: 0x0040, 0x17b7: 0x0040, 0x17b8: 0x0040, 0x17b9: 0x0040, 0x17ba: 0x0040, 0x17bb: 0x0040, + 0x17bc: 0x0040, 0x17bd: 0x0040, 0x17be: 0x0040, 0x17bf: 0x0040, + // Block 0x5f, offset 0x17c0 + 0x17c0: 0x0039, 0x17c1: 0x0ee9, 0x17c2: 0x1159, 0x17c3: 0x0ef9, 0x17c4: 0x0f09, 0x17c5: 0x1199, + 0x17c6: 0x0f31, 0x17c7: 0x0249, 0x17c8: 0x0f41, 0x17c9: 0x0259, 0x17ca: 0x0f51, 0x17cb: 0x0359, + 0x17cc: 0x0f61, 0x17cd: 0x0f71, 0x17ce: 0x00d9, 0x17cf: 0x0f99, 0x17d0: 0x2039, 0x17d1: 0x0269, + 0x17d2: 0x01d9, 0x17d3: 0x0fa9, 0x17d4: 0x0fb9, 0x17d5: 0x1089, 0x17d6: 0x0279, 0x17d7: 0x0369, + 0x17d8: 0x0289, 0x17d9: 0x13d1, 0x17da: 0x0039, 0x17db: 0x0ee9, 0x17dc: 0x1159, 0x17dd: 0x0ef9, + 0x17de: 0x0f09, 0x17df: 0x1199, 0x17e0: 0x0f31, 0x17e1: 0x0249, 0x17e2: 0x0f41, 0x17e3: 0x0259, + 0x17e4: 0x0f51, 0x17e5: 0x0359, 0x17e6: 0x0f61, 0x17e7: 0x0f71, 0x17e8: 0x00d9, 0x17e9: 0x0f99, + 0x17ea: 0x2039, 0x17eb: 0x0269, 0x17ec: 0x01d9, 0x17ed: 0x0fa9, 0x17ee: 0x0fb9, 0x17ef: 0x1089, + 0x17f0: 0x0279, 0x17f1: 0x0369, 0x17f2: 0x0289, 0x17f3: 0x13d1, 0x17f4: 0x0039, 0x17f5: 0x0ee9, + 0x17f6: 0x1159, 0x17f7: 0x0ef9, 0x17f8: 0x0f09, 0x17f9: 0x1199, 0x17fa: 0x0f31, 0x17fb: 0x0249, + 0x17fc: 0x0f41, 0x17fd: 0x0259, 0x17fe: 0x0f51, 0x17ff: 0x0359, + // Block 0x60, offset 0x1800 + 0x1800: 0x0f61, 0x1801: 0x0f71, 0x1802: 0x00d9, 0x1803: 0x0f99, 0x1804: 0x2039, 0x1805: 0x0269, + 0x1806: 0x01d9, 0x1807: 0x0fa9, 0x1808: 0x0fb9, 0x1809: 0x1089, 0x180a: 0x0279, 0x180b: 0x0369, + 0x180c: 0x0289, 0x180d: 0x13d1, 0x180e: 0x0039, 0x180f: 0x0ee9, 0x1810: 0x1159, 0x1811: 0x0ef9, + 0x1812: 0x0f09, 0x1813: 0x1199, 0x1814: 0x0f31, 0x1815: 0x0040, 0x1816: 0x0f41, 0x1817: 0x0259, + 0x1818: 0x0f51, 0x1819: 0x0359, 0x181a: 0x0f61, 0x181b: 0x0f71, 0x181c: 0x00d9, 0x181d: 0x0f99, + 0x181e: 0x2039, 0x181f: 0x0269, 0x1820: 0x01d9, 0x1821: 0x0fa9, 0x1822: 0x0fb9, 0x1823: 0x1089, + 0x1824: 0x0279, 0x1825: 0x0369, 0x1826: 0x0289, 0x1827: 0x13d1, 0x1828: 0x0039, 0x1829: 0x0ee9, + 0x182a: 0x1159, 0x182b: 0x0ef9, 0x182c: 0x0f09, 0x182d: 0x1199, 0x182e: 0x0f31, 0x182f: 0x0249, + 0x1830: 0x0f41, 0x1831: 0x0259, 0x1832: 0x0f51, 0x1833: 0x0359, 0x1834: 0x0f61, 0x1835: 0x0f71, + 0x1836: 0x00d9, 0x1837: 0x0f99, 0x1838: 0x2039, 0x1839: 0x0269, 0x183a: 0x01d9, 0x183b: 0x0fa9, + 0x183c: 0x0fb9, 0x183d: 0x1089, 0x183e: 0x0279, 0x183f: 0x0369, + // Block 0x61, offset 0x1840 + 0x1840: 0x0289, 0x1841: 0x13d1, 0x1842: 0x0039, 0x1843: 0x0ee9, 0x1844: 0x1159, 0x1845: 0x0ef9, + 0x1846: 0x0f09, 0x1847: 0x1199, 0x1848: 0x0f31, 0x1849: 0x0249, 0x184a: 0x0f41, 0x184b: 0x0259, + 0x184c: 0x0f51, 0x184d: 0x0359, 0x184e: 0x0f61, 0x184f: 0x0f71, 0x1850: 0x00d9, 0x1851: 0x0f99, + 0x1852: 0x2039, 0x1853: 0x0269, 0x1854: 0x01d9, 0x1855: 0x0fa9, 0x1856: 0x0fb9, 0x1857: 0x1089, + 0x1858: 0x0279, 0x1859: 0x0369, 0x185a: 0x0289, 0x185b: 0x13d1, 0x185c: 0x0039, 0x185d: 0x0040, + 0x185e: 0x1159, 0x185f: 0x0ef9, 0x1860: 0x0040, 0x1861: 0x0040, 0x1862: 0x0f31, 0x1863: 0x0040, + 0x1864: 0x0040, 0x1865: 0x0259, 0x1866: 0x0f51, 0x1867: 0x0040, 0x1868: 0x0040, 0x1869: 0x0f71, + 0x186a: 0x00d9, 0x186b: 0x0f99, 0x186c: 0x2039, 0x186d: 0x0040, 0x186e: 0x01d9, 0x186f: 0x0fa9, + 0x1870: 0x0fb9, 0x1871: 0x1089, 0x1872: 0x0279, 0x1873: 0x0369, 0x1874: 0x0289, 0x1875: 0x13d1, + 0x1876: 0x0039, 0x1877: 0x0ee9, 0x1878: 0x1159, 0x1879: 0x0ef9, 0x187a: 0x0040, 0x187b: 0x1199, + 0x187c: 0x0040, 0x187d: 0x0249, 0x187e: 0x0f41, 0x187f: 0x0259, + // Block 0x62, offset 0x1880 + 0x1880: 0x0f51, 0x1881: 0x0359, 0x1882: 0x0f61, 0x1883: 0x0f71, 0x1884: 0x0040, 0x1885: 0x0f99, + 0x1886: 0x2039, 0x1887: 0x0269, 0x1888: 0x01d9, 0x1889: 0x0fa9, 0x188a: 0x0fb9, 0x188b: 0x1089, + 0x188c: 0x0279, 0x188d: 0x0369, 0x188e: 0x0289, 0x188f: 0x13d1, 0x1890: 0x0039, 0x1891: 0x0ee9, + 0x1892: 0x1159, 0x1893: 0x0ef9, 0x1894: 0x0f09, 0x1895: 0x1199, 0x1896: 0x0f31, 0x1897: 0x0249, + 0x1898: 0x0f41, 0x1899: 0x0259, 0x189a: 0x0f51, 0x189b: 0x0359, 0x189c: 0x0f61, 0x189d: 0x0f71, + 0x189e: 0x00d9, 0x189f: 0x0f99, 0x18a0: 0x2039, 0x18a1: 0x0269, 0x18a2: 0x01d9, 0x18a3: 0x0fa9, + 0x18a4: 0x0fb9, 0x18a5: 0x1089, 0x18a6: 0x0279, 0x18a7: 0x0369, 0x18a8: 0x0289, 0x18a9: 0x13d1, + 0x18aa: 0x0039, 0x18ab: 0x0ee9, 0x18ac: 0x1159, 0x18ad: 0x0ef9, 0x18ae: 0x0f09, 0x18af: 0x1199, + 0x18b0: 0x0f31, 0x18b1: 0x0249, 0x18b2: 0x0f41, 0x18b3: 0x0259, 0x18b4: 0x0f51, 0x18b5: 0x0359, + 0x18b6: 0x0f61, 0x18b7: 0x0f71, 0x18b8: 0x00d9, 0x18b9: 0x0f99, 0x18ba: 0x2039, 0x18bb: 0x0269, + 0x18bc: 0x01d9, 0x18bd: 0x0fa9, 0x18be: 0x0fb9, 0x18bf: 0x1089, + // Block 0x63, offset 0x18c0 + 0x18c0: 0x0279, 0x18c1: 0x0369, 0x18c2: 0x0289, 0x18c3: 0x13d1, 0x18c4: 0x0039, 0x18c5: 0x0ee9, + 0x18c6: 0x0040, 0x18c7: 0x0ef9, 0x18c8: 0x0f09, 0x18c9: 0x1199, 0x18ca: 0x0f31, 0x18cb: 0x0040, + 0x18cc: 0x0040, 0x18cd: 0x0259, 0x18ce: 0x0f51, 0x18cf: 0x0359, 0x18d0: 0x0f61, 0x18d1: 0x0f71, + 0x18d2: 0x00d9, 0x18d3: 0x0f99, 0x18d4: 0x2039, 0x18d5: 0x0040, 0x18d6: 0x01d9, 0x18d7: 0x0fa9, + 0x18d8: 0x0fb9, 0x18d9: 0x1089, 0x18da: 0x0279, 0x18db: 0x0369, 0x18dc: 0x0289, 0x18dd: 0x0040, + 0x18de: 0x0039, 0x18df: 0x0ee9, 0x18e0: 0x1159, 0x18e1: 0x0ef9, 0x18e2: 0x0f09, 0x18e3: 0x1199, + 0x18e4: 0x0f31, 0x18e5: 0x0249, 0x18e6: 0x0f41, 0x18e7: 0x0259, 0x18e8: 0x0f51, 0x18e9: 0x0359, + 0x18ea: 0x0f61, 0x18eb: 0x0f71, 0x18ec: 0x00d9, 0x18ed: 0x0f99, 0x18ee: 0x2039, 0x18ef: 0x0269, + 0x18f0: 0x01d9, 0x18f1: 0x0fa9, 0x18f2: 0x0fb9, 0x18f3: 0x1089, 0x18f4: 0x0279, 0x18f5: 0x0369, + 0x18f6: 0x0289, 0x18f7: 0x13d1, 0x18f8: 0x0039, 0x18f9: 0x0ee9, 0x18fa: 0x0040, 0x18fb: 0x0ef9, + 0x18fc: 0x0f09, 0x18fd: 0x1199, 0x18fe: 0x0f31, 0x18ff: 0x0040, + // Block 0x64, offset 0x1900 + 0x1900: 0x0f41, 0x1901: 0x0259, 0x1902: 0x0f51, 0x1903: 0x0359, 0x1904: 0x0f61, 0x1905: 0x0040, + 0x1906: 0x00d9, 0x1907: 0x0040, 0x1908: 0x0040, 0x1909: 0x0040, 0x190a: 0x01d9, 0x190b: 0x0fa9, + 0x190c: 0x0fb9, 0x190d: 0x1089, 0x190e: 0x0279, 0x190f: 0x0369, 0x1910: 0x0289, 0x1911: 0x0040, + 0x1912: 0x0039, 0x1913: 0x0ee9, 0x1914: 0x1159, 0x1915: 0x0ef9, 0x1916: 0x0f09, 0x1917: 0x1199, + 0x1918: 0x0f31, 0x1919: 0x0249, 0x191a: 0x0f41, 0x191b: 0x0259, 0x191c: 0x0f51, 0x191d: 0x0359, + 0x191e: 0x0f61, 0x191f: 0x0f71, 0x1920: 0x00d9, 0x1921: 0x0f99, 0x1922: 0x2039, 0x1923: 0x0269, + 0x1924: 0x01d9, 0x1925: 0x0fa9, 0x1926: 0x0fb9, 0x1927: 0x1089, 0x1928: 0x0279, 0x1929: 0x0369, + 0x192a: 0x0289, 0x192b: 0x13d1, 0x192c: 0x0039, 0x192d: 0x0ee9, 0x192e: 0x1159, 0x192f: 0x0ef9, + 0x1930: 0x0f09, 0x1931: 0x1199, 0x1932: 0x0f31, 0x1933: 0x0249, 0x1934: 0x0f41, 0x1935: 0x0259, + 0x1936: 0x0f51, 0x1937: 0x0359, 0x1938: 0x0f61, 0x1939: 0x0f71, 0x193a: 0x00d9, 0x193b: 0x0f99, + 0x193c: 0x2039, 0x193d: 0x0269, 0x193e: 0x01d9, 0x193f: 0x0fa9, + // Block 0x65, offset 0x1940 + 0x1940: 0x0fb9, 0x1941: 0x1089, 0x1942: 0x0279, 0x1943: 0x0369, 0x1944: 0x0289, 0x1945: 0x13d1, + 0x1946: 0x0039, 0x1947: 0x0ee9, 0x1948: 0x1159, 0x1949: 0x0ef9, 0x194a: 0x0f09, 0x194b: 0x1199, + 0x194c: 0x0f31, 0x194d: 0x0249, 0x194e: 0x0f41, 0x194f: 0x0259, 0x1950: 0x0f51, 0x1951: 0x0359, + 0x1952: 0x0f61, 0x1953: 0x0f71, 0x1954: 0x00d9, 0x1955: 0x0f99, 0x1956: 0x2039, 0x1957: 0x0269, + 0x1958: 0x01d9, 0x1959: 0x0fa9, 0x195a: 0x0fb9, 0x195b: 0x1089, 0x195c: 0x0279, 0x195d: 0x0369, + 0x195e: 0x0289, 0x195f: 0x13d1, 0x1960: 0x0039, 0x1961: 0x0ee9, 0x1962: 0x1159, 0x1963: 0x0ef9, + 0x1964: 0x0f09, 0x1965: 0x1199, 0x1966: 0x0f31, 0x1967: 0x0249, 0x1968: 0x0f41, 0x1969: 0x0259, + 0x196a: 0x0f51, 0x196b: 0x0359, 0x196c: 0x0f61, 0x196d: 0x0f71, 0x196e: 0x00d9, 0x196f: 0x0f99, + 0x1970: 0x2039, 0x1971: 0x0269, 0x1972: 0x01d9, 0x1973: 0x0fa9, 0x1974: 0x0fb9, 0x1975: 0x1089, + 0x1976: 0x0279, 0x1977: 0x0369, 0x1978: 0x0289, 0x1979: 0x13d1, 0x197a: 0x0039, 0x197b: 0x0ee9, + 0x197c: 0x1159, 0x197d: 0x0ef9, 0x197e: 0x0f09, 0x197f: 0x1199, + // Block 0x66, offset 0x1980 + 0x1980: 0x0f31, 0x1981: 0x0249, 0x1982: 0x0f41, 0x1983: 0x0259, 0x1984: 0x0f51, 0x1985: 0x0359, + 0x1986: 0x0f61, 0x1987: 0x0f71, 0x1988: 0x00d9, 0x1989: 0x0f99, 0x198a: 0x2039, 0x198b: 0x0269, + 0x198c: 0x01d9, 0x198d: 0x0fa9, 0x198e: 0x0fb9, 0x198f: 0x1089, 0x1990: 0x0279, 0x1991: 0x0369, + 0x1992: 0x0289, 0x1993: 0x13d1, 0x1994: 0x0039, 0x1995: 0x0ee9, 0x1996: 0x1159, 0x1997: 0x0ef9, + 0x1998: 0x0f09, 0x1999: 0x1199, 0x199a: 0x0f31, 0x199b: 0x0249, 0x199c: 0x0f41, 0x199d: 0x0259, + 0x199e: 0x0f51, 0x199f: 0x0359, 0x19a0: 0x0f61, 0x19a1: 0x0f71, 0x19a2: 0x00d9, 0x19a3: 0x0f99, + 0x19a4: 0x2039, 0x19a5: 0x0269, 0x19a6: 0x01d9, 0x19a7: 0x0fa9, 0x19a8: 0x0fb9, 0x19a9: 0x1089, + 0x19aa: 0x0279, 0x19ab: 0x0369, 0x19ac: 0x0289, 0x19ad: 0x13d1, 0x19ae: 0x0039, 0x19af: 0x0ee9, + 0x19b0: 0x1159, 0x19b1: 0x0ef9, 0x19b2: 0x0f09, 0x19b3: 0x1199, 0x19b4: 0x0f31, 0x19b5: 0x0249, + 0x19b6: 0x0f41, 0x19b7: 0x0259, 0x19b8: 0x0f51, 0x19b9: 0x0359, 0x19ba: 0x0f61, 0x19bb: 0x0f71, + 0x19bc: 0x00d9, 0x19bd: 0x0f99, 0x19be: 0x2039, 0x19bf: 0x0269, + // Block 0x67, offset 0x19c0 + 0x19c0: 0x01d9, 0x19c1: 0x0fa9, 0x19c2: 0x0fb9, 0x19c3: 0x1089, 0x19c4: 0x0279, 0x19c5: 0x0369, + 0x19c6: 0x0289, 0x19c7: 0x13d1, 0x19c8: 0x0039, 0x19c9: 0x0ee9, 0x19ca: 0x1159, 0x19cb: 0x0ef9, + 0x19cc: 0x0f09, 0x19cd: 0x1199, 0x19ce: 0x0f31, 0x19cf: 0x0249, 0x19d0: 0x0f41, 0x19d1: 0x0259, + 0x19d2: 0x0f51, 0x19d3: 0x0359, 0x19d4: 0x0f61, 0x19d5: 0x0f71, 0x19d6: 0x00d9, 0x19d7: 0x0f99, + 0x19d8: 0x2039, 0x19d9: 0x0269, 0x19da: 0x01d9, 0x19db: 0x0fa9, 0x19dc: 0x0fb9, 0x19dd: 0x1089, + 0x19de: 0x0279, 0x19df: 0x0369, 0x19e0: 0x0289, 0x19e1: 0x13d1, 0x19e2: 0x0039, 0x19e3: 0x0ee9, + 0x19e4: 0x1159, 0x19e5: 0x0ef9, 0x19e6: 0x0f09, 0x19e7: 0x1199, 0x19e8: 0x0f31, 0x19e9: 0x0249, + 0x19ea: 0x0f41, 0x19eb: 0x0259, 0x19ec: 0x0f51, 0x19ed: 0x0359, 0x19ee: 0x0f61, 0x19ef: 0x0f71, + 0x19f0: 0x00d9, 0x19f1: 0x0f99, 0x19f2: 0x2039, 0x19f3: 0x0269, 0x19f4: 0x01d9, 0x19f5: 0x0fa9, + 0x19f6: 0x0fb9, 0x19f7: 0x1089, 0x19f8: 0x0279, 0x19f9: 0x0369, 0x19fa: 0x0289, 0x19fb: 0x13d1, + 0x19fc: 0x0039, 0x19fd: 0x0ee9, 0x19fe: 0x1159, 0x19ff: 0x0ef9, + // Block 0x68, offset 0x1a00 + 0x1a00: 0x0f09, 0x1a01: 0x1199, 0x1a02: 0x0f31, 0x1a03: 0x0249, 0x1a04: 0x0f41, 0x1a05: 0x0259, + 0x1a06: 0x0f51, 0x1a07: 0x0359, 0x1a08: 0x0f61, 0x1a09: 0x0f71, 0x1a0a: 0x00d9, 0x1a0b: 0x0f99, + 0x1a0c: 0x2039, 0x1a0d: 0x0269, 0x1a0e: 0x01d9, 0x1a0f: 0x0fa9, 0x1a10: 0x0fb9, 0x1a11: 0x1089, + 0x1a12: 0x0279, 0x1a13: 0x0369, 0x1a14: 0x0289, 0x1a15: 0x13d1, 0x1a16: 0x0039, 0x1a17: 0x0ee9, + 0x1a18: 0x1159, 0x1a19: 0x0ef9, 0x1a1a: 0x0f09, 0x1a1b: 0x1199, 0x1a1c: 0x0f31, 0x1a1d: 0x0249, + 0x1a1e: 0x0f41, 0x1a1f: 0x0259, 0x1a20: 0x0f51, 0x1a21: 0x0359, 0x1a22: 0x0f61, 0x1a23: 0x0f71, + 0x1a24: 0x00d9, 0x1a25: 0x0f99, 0x1a26: 0x2039, 0x1a27: 0x0269, 0x1a28: 0x01d9, 0x1a29: 0x0fa9, + 0x1a2a: 0x0fb9, 0x1a2b: 0x1089, 0x1a2c: 0x0279, 0x1a2d: 0x0369, 0x1a2e: 0x0289, 0x1a2f: 0x13d1, + 0x1a30: 0x0039, 0x1a31: 0x0ee9, 0x1a32: 0x1159, 0x1a33: 0x0ef9, 0x1a34: 0x0f09, 0x1a35: 0x1199, + 0x1a36: 0x0f31, 0x1a37: 0x0249, 0x1a38: 0x0f41, 0x1a39: 0x0259, 0x1a3a: 0x0f51, 0x1a3b: 0x0359, + 0x1a3c: 0x0f61, 0x1a3d: 0x0f71, 0x1a3e: 0x00d9, 0x1a3f: 0x0f99, + // Block 0x69, offset 0x1a40 + 0x1a40: 0x2039, 0x1a41: 0x0269, 0x1a42: 0x01d9, 0x1a43: 0x0fa9, 0x1a44: 0x0fb9, 0x1a45: 0x1089, + 0x1a46: 0x0279, 0x1a47: 0x0369, 0x1a48: 0x0289, 0x1a49: 0x13d1, 0x1a4a: 0x0039, 0x1a4b: 0x0ee9, + 0x1a4c: 0x1159, 0x1a4d: 0x0ef9, 0x1a4e: 0x0f09, 0x1a4f: 0x1199, 0x1a50: 0x0f31, 0x1a51: 0x0249, + 0x1a52: 0x0f41, 0x1a53: 0x0259, 0x1a54: 0x0f51, 0x1a55: 0x0359, 0x1a56: 0x0f61, 0x1a57: 0x0f71, + 0x1a58: 0x00d9, 0x1a59: 0x0f99, 0x1a5a: 0x2039, 0x1a5b: 0x0269, 0x1a5c: 0x01d9, 0x1a5d: 0x0fa9, + 0x1a5e: 0x0fb9, 0x1a5f: 0x1089, 0x1a60: 0x0279, 0x1a61: 0x0369, 0x1a62: 0x0289, 0x1a63: 0x13d1, + 0x1a64: 0xba81, 0x1a65: 0xba99, 0x1a66: 0x0040, 0x1a67: 0x0040, 0x1a68: 0xbab1, 0x1a69: 0x1099, + 0x1a6a: 0x10b1, 0x1a6b: 0x10c9, 0x1a6c: 0xbac9, 0x1a6d: 0xbae1, 0x1a6e: 0xbaf9, 0x1a6f: 0x1429, + 0x1a70: 0x1a31, 0x1a71: 0xbb11, 0x1a72: 0xbb29, 0x1a73: 0xbb41, 0x1a74: 0xbb59, 0x1a75: 0xbb71, + 0x1a76: 0xbb89, 0x1a77: 0x2109, 0x1a78: 0x1111, 0x1a79: 0x1429, 0x1a7a: 0xbba1, 0x1a7b: 0xbbb9, + 0x1a7c: 0xbbd1, 0x1a7d: 0x10e1, 0x1a7e: 0x10f9, 0x1a7f: 0xbbe9, + // Block 0x6a, offset 0x1a80 + 0x1a80: 0x2079, 0x1a81: 0xbc01, 0x1a82: 0xbab1, 0x1a83: 0x1099, 0x1a84: 0x10b1, 0x1a85: 0x10c9, + 0x1a86: 0xbac9, 0x1a87: 0xbae1, 0x1a88: 0xbaf9, 0x1a89: 0x1429, 0x1a8a: 0x1a31, 0x1a8b: 0xbb11, + 0x1a8c: 0xbb29, 0x1a8d: 0xbb41, 0x1a8e: 0xbb59, 0x1a8f: 0xbb71, 0x1a90: 0xbb89, 0x1a91: 0x2109, + 0x1a92: 0x1111, 0x1a93: 0xbba1, 0x1a94: 0xbba1, 0x1a95: 0xbbb9, 0x1a96: 0xbbd1, 0x1a97: 0x10e1, + 0x1a98: 0x10f9, 0x1a99: 0xbbe9, 0x1a9a: 0x2079, 0x1a9b: 0xbc21, 0x1a9c: 0xbac9, 0x1a9d: 0x1429, + 0x1a9e: 0xbb11, 0x1a9f: 0x10e1, 0x1aa0: 0x1111, 0x1aa1: 0x2109, 0x1aa2: 0xbab1, 0x1aa3: 0x1099, + 0x1aa4: 0x10b1, 0x1aa5: 0x10c9, 0x1aa6: 0xbac9, 0x1aa7: 0xbae1, 0x1aa8: 0xbaf9, 0x1aa9: 0x1429, + 0x1aaa: 0x1a31, 0x1aab: 0xbb11, 0x1aac: 0xbb29, 0x1aad: 0xbb41, 0x1aae: 0xbb59, 0x1aaf: 0xbb71, + 0x1ab0: 0xbb89, 0x1ab1: 0x2109, 0x1ab2: 0x1111, 0x1ab3: 0x1429, 0x1ab4: 0xbba1, 0x1ab5: 0xbbb9, + 0x1ab6: 0xbbd1, 0x1ab7: 0x10e1, 0x1ab8: 0x10f9, 0x1ab9: 0xbbe9, 0x1aba: 0x2079, 0x1abb: 0xbc01, + 0x1abc: 0xbab1, 0x1abd: 0x1099, 0x1abe: 0x10b1, 0x1abf: 0x10c9, + // Block 0x6b, offset 0x1ac0 + 0x1ac0: 0xbac9, 0x1ac1: 0xbae1, 0x1ac2: 0xbaf9, 0x1ac3: 0x1429, 0x1ac4: 0x1a31, 0x1ac5: 0xbb11, + 0x1ac6: 0xbb29, 0x1ac7: 0xbb41, 0x1ac8: 0xbb59, 0x1ac9: 0xbb71, 0x1aca: 0xbb89, 0x1acb: 0x2109, + 0x1acc: 0x1111, 0x1acd: 0xbba1, 0x1ace: 0xbba1, 0x1acf: 0xbbb9, 0x1ad0: 0xbbd1, 0x1ad1: 0x10e1, + 0x1ad2: 0x10f9, 0x1ad3: 0xbbe9, 0x1ad4: 0x2079, 0x1ad5: 0xbc21, 0x1ad6: 0xbac9, 0x1ad7: 0x1429, + 0x1ad8: 0xbb11, 0x1ad9: 0x10e1, 0x1ada: 0x1111, 0x1adb: 0x2109, 0x1adc: 0xbab1, 0x1add: 0x1099, + 0x1ade: 0x10b1, 0x1adf: 0x10c9, 0x1ae0: 0xbac9, 0x1ae1: 0xbae1, 0x1ae2: 0xbaf9, 0x1ae3: 0x1429, + 0x1ae4: 0x1a31, 0x1ae5: 0xbb11, 0x1ae6: 0xbb29, 0x1ae7: 0xbb41, 0x1ae8: 0xbb59, 0x1ae9: 0xbb71, + 0x1aea: 0xbb89, 0x1aeb: 0x2109, 0x1aec: 0x1111, 0x1aed: 0x1429, 0x1aee: 0xbba1, 0x1aef: 0xbbb9, + 0x1af0: 0xbbd1, 0x1af1: 0x10e1, 0x1af2: 0x10f9, 0x1af3: 0xbbe9, 0x1af4: 0x2079, 0x1af5: 0xbc01, + 0x1af6: 0xbab1, 0x1af7: 0x1099, 0x1af8: 0x10b1, 0x1af9: 0x10c9, 0x1afa: 0xbac9, 0x1afb: 0xbae1, + 0x1afc: 0xbaf9, 0x1afd: 0x1429, 0x1afe: 0x1a31, 0x1aff: 0xbb11, + // Block 0x6c, offset 0x1b00 + 0x1b00: 0xbb29, 0x1b01: 0xbb41, 0x1b02: 0xbb59, 0x1b03: 0xbb71, 0x1b04: 0xbb89, 0x1b05: 0x2109, + 0x1b06: 0x1111, 0x1b07: 0xbba1, 0x1b08: 0xbba1, 0x1b09: 0xbbb9, 0x1b0a: 0xbbd1, 0x1b0b: 0x10e1, + 0x1b0c: 0x10f9, 0x1b0d: 0xbbe9, 0x1b0e: 0x2079, 0x1b0f: 0xbc21, 0x1b10: 0xbac9, 0x1b11: 0x1429, + 0x1b12: 0xbb11, 0x1b13: 0x10e1, 0x1b14: 0x1111, 0x1b15: 0x2109, 0x1b16: 0xbab1, 0x1b17: 0x1099, + 0x1b18: 0x10b1, 0x1b19: 0x10c9, 0x1b1a: 0xbac9, 0x1b1b: 0xbae1, 0x1b1c: 0xbaf9, 0x1b1d: 0x1429, + 0x1b1e: 0x1a31, 0x1b1f: 0xbb11, 0x1b20: 0xbb29, 0x1b21: 0xbb41, 0x1b22: 0xbb59, 0x1b23: 0xbb71, + 0x1b24: 0xbb89, 0x1b25: 0x2109, 0x1b26: 0x1111, 0x1b27: 0x1429, 0x1b28: 0xbba1, 0x1b29: 0xbbb9, + 0x1b2a: 0xbbd1, 0x1b2b: 0x10e1, 0x1b2c: 0x10f9, 0x1b2d: 0xbbe9, 0x1b2e: 0x2079, 0x1b2f: 0xbc01, + 0x1b30: 0xbab1, 0x1b31: 0x1099, 0x1b32: 0x10b1, 0x1b33: 0x10c9, 0x1b34: 0xbac9, 0x1b35: 0xbae1, + 0x1b36: 0xbaf9, 0x1b37: 0x1429, 0x1b38: 0x1a31, 0x1b39: 0xbb11, 0x1b3a: 0xbb29, 0x1b3b: 0xbb41, + 0x1b3c: 0xbb59, 0x1b3d: 0xbb71, 0x1b3e: 0xbb89, 0x1b3f: 0x2109, + // Block 0x6d, offset 0x1b40 + 0x1b40: 0x1111, 0x1b41: 0xbba1, 0x1b42: 0xbba1, 0x1b43: 0xbbb9, 0x1b44: 0xbbd1, 0x1b45: 0x10e1, + 0x1b46: 0x10f9, 0x1b47: 0xbbe9, 0x1b48: 0x2079, 0x1b49: 0xbc21, 0x1b4a: 0xbac9, 0x1b4b: 0x1429, + 0x1b4c: 0xbb11, 0x1b4d: 0x10e1, 0x1b4e: 0x1111, 0x1b4f: 0x2109, 0x1b50: 0xbab1, 0x1b51: 0x1099, + 0x1b52: 0x10b1, 0x1b53: 0x10c9, 0x1b54: 0xbac9, 0x1b55: 0xbae1, 0x1b56: 0xbaf9, 0x1b57: 0x1429, + 0x1b58: 0x1a31, 0x1b59: 0xbb11, 0x1b5a: 0xbb29, 0x1b5b: 0xbb41, 0x1b5c: 0xbb59, 0x1b5d: 0xbb71, + 0x1b5e: 0xbb89, 0x1b5f: 0x2109, 0x1b60: 0x1111, 0x1b61: 0x1429, 0x1b62: 0xbba1, 0x1b63: 0xbbb9, + 0x1b64: 0xbbd1, 0x1b65: 0x10e1, 0x1b66: 0x10f9, 0x1b67: 0xbbe9, 0x1b68: 0x2079, 0x1b69: 0xbc01, + 0x1b6a: 0xbab1, 0x1b6b: 0x1099, 0x1b6c: 0x10b1, 0x1b6d: 0x10c9, 0x1b6e: 0xbac9, 0x1b6f: 0xbae1, + 0x1b70: 0xbaf9, 0x1b71: 0x1429, 0x1b72: 0x1a31, 0x1b73: 0xbb11, 0x1b74: 0xbb29, 0x1b75: 0xbb41, + 0x1b76: 0xbb59, 0x1b77: 0xbb71, 0x1b78: 0xbb89, 0x1b79: 0x2109, 0x1b7a: 0x1111, 0x1b7b: 0xbba1, + 0x1b7c: 0xbba1, 0x1b7d: 0xbbb9, 0x1b7e: 0xbbd1, 0x1b7f: 0x10e1, + // Block 0x6e, offset 0x1b80 + 0x1b80: 0x10f9, 0x1b81: 0xbbe9, 0x1b82: 0x2079, 0x1b83: 0xbc21, 0x1b84: 0xbac9, 0x1b85: 0x1429, + 0x1b86: 0xbb11, 0x1b87: 0x10e1, 0x1b88: 0x1111, 0x1b89: 0x2109, 0x1b8a: 0xbc41, 0x1b8b: 0xbc41, + 0x1b8c: 0x0040, 0x1b8d: 0x0040, 0x1b8e: 0x1f41, 0x1b8f: 0x00c9, 0x1b90: 0x0069, 0x1b91: 0x0079, + 0x1b92: 0x1f51, 0x1b93: 0x1f61, 0x1b94: 0x1f71, 0x1b95: 0x1f81, 0x1b96: 0x1f91, 0x1b97: 0x1fa1, + 0x1b98: 0x1f41, 0x1b99: 0x00c9, 0x1b9a: 0x0069, 0x1b9b: 0x0079, 0x1b9c: 0x1f51, 0x1b9d: 0x1f61, + 0x1b9e: 0x1f71, 0x1b9f: 0x1f81, 0x1ba0: 0x1f91, 0x1ba1: 0x1fa1, 0x1ba2: 0x1f41, 0x1ba3: 0x00c9, + 0x1ba4: 0x0069, 0x1ba5: 0x0079, 0x1ba6: 0x1f51, 0x1ba7: 0x1f61, 0x1ba8: 0x1f71, 0x1ba9: 0x1f81, + 0x1baa: 0x1f91, 0x1bab: 0x1fa1, 0x1bac: 0x1f41, 0x1bad: 0x00c9, 0x1bae: 0x0069, 0x1baf: 0x0079, + 0x1bb0: 0x1f51, 0x1bb1: 0x1f61, 0x1bb2: 0x1f71, 0x1bb3: 0x1f81, 0x1bb4: 0x1f91, 0x1bb5: 0x1fa1, + 0x1bb6: 0x1f41, 0x1bb7: 0x00c9, 0x1bb8: 0x0069, 0x1bb9: 0x0079, 0x1bba: 0x1f51, 0x1bbb: 0x1f61, + 0x1bbc: 0x1f71, 0x1bbd: 0x1f81, 0x1bbe: 0x1f91, 0x1bbf: 0x1fa1, + // Block 0x6f, offset 0x1bc0 + 0x1bc0: 0xe115, 0x1bc1: 0xe115, 0x1bc2: 0xe135, 0x1bc3: 0xe135, 0x1bc4: 0xe115, 0x1bc5: 0xe115, + 0x1bc6: 0xe175, 0x1bc7: 0xe175, 0x1bc8: 0xe115, 0x1bc9: 0xe115, 0x1bca: 0xe135, 0x1bcb: 0xe135, + 0x1bcc: 0xe115, 0x1bcd: 0xe115, 0x1bce: 0xe1f5, 0x1bcf: 0xe1f5, 0x1bd0: 0xe115, 0x1bd1: 0xe115, + 0x1bd2: 0xe135, 0x1bd3: 0xe135, 0x1bd4: 0xe115, 0x1bd5: 0xe115, 0x1bd6: 0xe175, 0x1bd7: 0xe175, + 0x1bd8: 0xe115, 0x1bd9: 0xe115, 0x1bda: 0xe135, 0x1bdb: 0xe135, 0x1bdc: 0xe115, 0x1bdd: 0xe115, + 0x1bde: 0x8b05, 0x1bdf: 0x8b05, 0x1be0: 0x04b5, 0x1be1: 0x04b5, 0x1be2: 0x0208, 0x1be3: 0x0208, + 0x1be4: 0x0208, 0x1be5: 0x0208, 0x1be6: 0x0208, 0x1be7: 0x0208, 0x1be8: 0x0208, 0x1be9: 0x0208, + 0x1bea: 0x0208, 0x1beb: 0x0208, 0x1bec: 0x0208, 0x1bed: 0x0208, 0x1bee: 0x0208, 0x1bef: 0x0208, + 0x1bf0: 0x0208, 0x1bf1: 0x0208, 0x1bf2: 0x0208, 0x1bf3: 0x0208, 0x1bf4: 0x0208, 0x1bf5: 0x0208, + 0x1bf6: 0x0208, 0x1bf7: 0x0208, 0x1bf8: 0x0208, 0x1bf9: 0x0208, 0x1bfa: 0x0208, 0x1bfb: 0x0208, + 0x1bfc: 0x0208, 0x1bfd: 0x0208, 0x1bfe: 0x0208, 0x1bff: 0x0208, + // Block 0x70, offset 0x1c00 + 0x1c00: 0xb189, 0x1c01: 0xb1a1, 0x1c02: 0xb201, 0x1c03: 0xb249, 0x1c04: 0x0040, 0x1c05: 0xb411, + 0x1c06: 0xb291, 0x1c07: 0xb219, 0x1c08: 0xb309, 0x1c09: 0xb429, 0x1c0a: 0xb399, 0x1c0b: 0xb3b1, + 0x1c0c: 0xb3c9, 0x1c0d: 0xb3e1, 0x1c0e: 0xb2a9, 0x1c0f: 0xb339, 0x1c10: 0xb369, 0x1c11: 0xb2d9, + 0x1c12: 0xb381, 0x1c13: 0xb279, 0x1c14: 0xb2c1, 0x1c15: 0xb1d1, 0x1c16: 0xb1e9, 0x1c17: 0xb231, + 0x1c18: 0xb261, 0x1c19: 0xb2f1, 0x1c1a: 0xb321, 0x1c1b: 0xb351, 0x1c1c: 0xbc59, 0x1c1d: 0x7949, + 0x1c1e: 0xbc71, 0x1c1f: 0xbc89, 0x1c20: 0x0040, 0x1c21: 0xb1a1, 0x1c22: 0xb201, 0x1c23: 0x0040, + 0x1c24: 0xb3f9, 0x1c25: 0x0040, 0x1c26: 0x0040, 0x1c27: 0xb219, 0x1c28: 0x0040, 0x1c29: 0xb429, + 0x1c2a: 0xb399, 0x1c2b: 0xb3b1, 0x1c2c: 0xb3c9, 0x1c2d: 0xb3e1, 0x1c2e: 0xb2a9, 0x1c2f: 0xb339, + 0x1c30: 0xb369, 0x1c31: 0xb2d9, 0x1c32: 0xb381, 0x1c33: 0x0040, 0x1c34: 0xb2c1, 0x1c35: 0xb1d1, + 0x1c36: 0xb1e9, 0x1c37: 0xb231, 0x1c38: 0x0040, 0x1c39: 0xb2f1, 0x1c3a: 0x0040, 0x1c3b: 0xb351, + 0x1c3c: 0x0040, 0x1c3d: 0x0040, 0x1c3e: 0x0040, 0x1c3f: 0x0040, + // Block 0x71, offset 0x1c40 + 0x1c40: 0x0040, 0x1c41: 0x0040, 0x1c42: 0xb201, 0x1c43: 0x0040, 0x1c44: 0x0040, 0x1c45: 0x0040, + 0x1c46: 0x0040, 0x1c47: 0xb219, 0x1c48: 0x0040, 0x1c49: 0xb429, 0x1c4a: 0x0040, 0x1c4b: 0xb3b1, + 0x1c4c: 0x0040, 0x1c4d: 0xb3e1, 0x1c4e: 0xb2a9, 0x1c4f: 0xb339, 0x1c50: 0x0040, 0x1c51: 0xb2d9, + 0x1c52: 0xb381, 0x1c53: 0x0040, 0x1c54: 0xb2c1, 0x1c55: 0x0040, 0x1c56: 0x0040, 0x1c57: 0xb231, + 0x1c58: 0x0040, 0x1c59: 0xb2f1, 0x1c5a: 0x0040, 0x1c5b: 0xb351, 0x1c5c: 0x0040, 0x1c5d: 0x7949, + 0x1c5e: 0x0040, 0x1c5f: 0xbc89, 0x1c60: 0x0040, 0x1c61: 0xb1a1, 0x1c62: 0xb201, 0x1c63: 0x0040, + 0x1c64: 0xb3f9, 0x1c65: 0x0040, 0x1c66: 0x0040, 0x1c67: 0xb219, 0x1c68: 0xb309, 0x1c69: 0xb429, + 0x1c6a: 0xb399, 0x1c6b: 0x0040, 0x1c6c: 0xb3c9, 0x1c6d: 0xb3e1, 0x1c6e: 0xb2a9, 0x1c6f: 0xb339, + 0x1c70: 0xb369, 0x1c71: 0xb2d9, 0x1c72: 0xb381, 0x1c73: 0x0040, 0x1c74: 0xb2c1, 0x1c75: 0xb1d1, + 0x1c76: 0xb1e9, 0x1c77: 0xb231, 0x1c78: 0x0040, 0x1c79: 0xb2f1, 0x1c7a: 0xb321, 0x1c7b: 0xb351, + 0x1c7c: 0xbc59, 0x1c7d: 0x0040, 0x1c7e: 0xbc71, 0x1c7f: 0x0040, + // Block 0x72, offset 0x1c80 + 0x1c80: 0xb189, 0x1c81: 0xb1a1, 0x1c82: 0xb201, 0x1c83: 0xb249, 0x1c84: 0xb3f9, 0x1c85: 0xb411, + 0x1c86: 0xb291, 0x1c87: 0xb219, 0x1c88: 0xb309, 0x1c89: 0xb429, 0x1c8a: 0x0040, 0x1c8b: 0xb3b1, + 0x1c8c: 0xb3c9, 0x1c8d: 0xb3e1, 0x1c8e: 0xb2a9, 0x1c8f: 0xb339, 0x1c90: 0xb369, 0x1c91: 0xb2d9, + 0x1c92: 0xb381, 0x1c93: 0xb279, 0x1c94: 0xb2c1, 0x1c95: 0xb1d1, 0x1c96: 0xb1e9, 0x1c97: 0xb231, + 0x1c98: 0xb261, 0x1c99: 0xb2f1, 0x1c9a: 0xb321, 0x1c9b: 0xb351, 0x1c9c: 0x0040, 0x1c9d: 0x0040, + 0x1c9e: 0x0040, 0x1c9f: 0x0040, 0x1ca0: 0x0040, 0x1ca1: 0xb1a1, 0x1ca2: 0xb201, 0x1ca3: 0xb249, + 0x1ca4: 0x0040, 0x1ca5: 0xb411, 0x1ca6: 0xb291, 0x1ca7: 0xb219, 0x1ca8: 0xb309, 0x1ca9: 0xb429, + 0x1caa: 0x0040, 0x1cab: 0xb3b1, 0x1cac: 0xb3c9, 0x1cad: 0xb3e1, 0x1cae: 0xb2a9, 0x1caf: 0xb339, + 0x1cb0: 0xb369, 0x1cb1: 0xb2d9, 0x1cb2: 0xb381, 0x1cb3: 0xb279, 0x1cb4: 0xb2c1, 0x1cb5: 0xb1d1, + 0x1cb6: 0xb1e9, 0x1cb7: 0xb231, 0x1cb8: 0xb261, 0x1cb9: 0xb2f1, 0x1cba: 0xb321, 0x1cbb: 0xb351, + 0x1cbc: 0x0040, 0x1cbd: 0x0040, 0x1cbe: 0x0040, 0x1cbf: 0x0040, + // Block 0x73, offset 0x1cc0 + 0x1cc0: 0x0040, 0x1cc1: 0xbca2, 0x1cc2: 0xbcba, 0x1cc3: 0xbcd2, 0x1cc4: 0xbcea, 0x1cc5: 0xbd02, + 0x1cc6: 0xbd1a, 0x1cc7: 0xbd32, 0x1cc8: 0xbd4a, 0x1cc9: 0xbd62, 0x1cca: 0xbd7a, 0x1ccb: 0x0018, + 0x1ccc: 0x0018, 0x1ccd: 0x0040, 0x1cce: 0x0040, 0x1ccf: 0x0040, 0x1cd0: 0xbd92, 0x1cd1: 0xbdb2, + 0x1cd2: 0xbdd2, 0x1cd3: 0xbdf2, 0x1cd4: 0xbe12, 0x1cd5: 0xbe32, 0x1cd6: 0xbe52, 0x1cd7: 0xbe72, + 0x1cd8: 0xbe92, 0x1cd9: 0xbeb2, 0x1cda: 0xbed2, 0x1cdb: 0xbef2, 0x1cdc: 0xbf12, 0x1cdd: 0xbf32, + 0x1cde: 0xbf52, 0x1cdf: 0xbf72, 0x1ce0: 0xbf92, 0x1ce1: 0xbfb2, 0x1ce2: 0xbfd2, 0x1ce3: 0xbff2, + 0x1ce4: 0xc012, 0x1ce5: 0xc032, 0x1ce6: 0xc052, 0x1ce7: 0xc072, 0x1ce8: 0xc092, 0x1ce9: 0xc0b2, + 0x1cea: 0xc0d1, 0x1ceb: 0x1159, 0x1cec: 0x0269, 0x1ced: 0x6671, 0x1cee: 0xc111, 0x1cef: 0x0040, + 0x1cf0: 0x0039, 0x1cf1: 0x0ee9, 0x1cf2: 0x1159, 0x1cf3: 0x0ef9, 0x1cf4: 0x0f09, 0x1cf5: 0x1199, + 0x1cf6: 0x0f31, 0x1cf7: 0x0249, 0x1cf8: 0x0f41, 0x1cf9: 0x0259, 0x1cfa: 0x0f51, 0x1cfb: 0x0359, + 0x1cfc: 0x0f61, 0x1cfd: 0x0f71, 0x1cfe: 0x00d9, 0x1cff: 0x0f99, + // Block 0x74, offset 0x1d00 + 0x1d00: 0x2039, 0x1d01: 0x0269, 0x1d02: 0x01d9, 0x1d03: 0x0fa9, 0x1d04: 0x0fb9, 0x1d05: 0x1089, + 0x1d06: 0x0279, 0x1d07: 0x0369, 0x1d08: 0x0289, 0x1d09: 0x13d1, 0x1d0a: 0xc129, 0x1d0b: 0x65b1, + 0x1d0c: 0xc141, 0x1d0d: 0x1441, 0x1d0e: 0xc159, 0x1d0f: 0xc179, 0x1d10: 0x0018, 0x1d11: 0x0018, + 0x1d12: 0x0018, 0x1d13: 0x0018, 0x1d14: 0x0018, 0x1d15: 0x0018, 0x1d16: 0x0018, 0x1d17: 0x0018, + 0x1d18: 0x0018, 0x1d19: 0x0018, 0x1d1a: 0x0018, 0x1d1b: 0x0018, 0x1d1c: 0x0018, 0x1d1d: 0x0018, + 0x1d1e: 0x0018, 0x1d1f: 0x0018, 0x1d20: 0x0018, 0x1d21: 0x0018, 0x1d22: 0x0018, 0x1d23: 0x0018, + 0x1d24: 0x0018, 0x1d25: 0x0018, 0x1d26: 0x0018, 0x1d27: 0x0018, 0x1d28: 0x0018, 0x1d29: 0x0018, + 0x1d2a: 0xc191, 0x1d2b: 0xc1a9, 0x1d2c: 0x0040, 0x1d2d: 0x0040, 0x1d2e: 0x0040, 0x1d2f: 0x0040, + 0x1d30: 0x0018, 0x1d31: 0x0018, 0x1d32: 0x0018, 0x1d33: 0x0018, 0x1d34: 0x0018, 0x1d35: 0x0018, + 0x1d36: 0x0018, 0x1d37: 0x0018, 0x1d38: 0x0018, 0x1d39: 0x0018, 0x1d3a: 0x0018, 0x1d3b: 0x0018, + 0x1d3c: 0x0018, 0x1d3d: 0x0018, 0x1d3e: 0x0018, 0x1d3f: 0x0018, + // Block 0x75, offset 0x1d40 + 0x1d40: 0xc1d9, 0x1d41: 0xc211, 0x1d42: 0xc249, 0x1d43: 0x0040, 0x1d44: 0x0040, 0x1d45: 0x0040, + 0x1d46: 0x0040, 0x1d47: 0x0040, 0x1d48: 0x0040, 0x1d49: 0x0040, 0x1d4a: 0x0040, 0x1d4b: 0x0040, + 0x1d4c: 0x0040, 0x1d4d: 0x0040, 0x1d4e: 0x0040, 0x1d4f: 0x0040, 0x1d50: 0xc269, 0x1d51: 0xc289, + 0x1d52: 0xc2a9, 0x1d53: 0xc2c9, 0x1d54: 0xc2e9, 0x1d55: 0xc309, 0x1d56: 0xc329, 0x1d57: 0xc349, + 0x1d58: 0xc369, 0x1d59: 0xc389, 0x1d5a: 0xc3a9, 0x1d5b: 0xc3c9, 0x1d5c: 0xc3e9, 0x1d5d: 0xc409, + 0x1d5e: 0xc429, 0x1d5f: 0xc449, 0x1d60: 0xc469, 0x1d61: 0xc489, 0x1d62: 0xc4a9, 0x1d63: 0xc4c9, + 0x1d64: 0xc4e9, 0x1d65: 0xc509, 0x1d66: 0xc529, 0x1d67: 0xc549, 0x1d68: 0xc569, 0x1d69: 0xc589, + 0x1d6a: 0xc5a9, 0x1d6b: 0xc5c9, 0x1d6c: 0xc5e9, 0x1d6d: 0xc609, 0x1d6e: 0xc629, 0x1d6f: 0xc649, + 0x1d70: 0xc669, 0x1d71: 0xc689, 0x1d72: 0xc6a9, 0x1d73: 0xc6c9, 0x1d74: 0xc6e9, 0x1d75: 0xc709, + 0x1d76: 0xc729, 0x1d77: 0xc749, 0x1d78: 0xc769, 0x1d79: 0xc789, 0x1d7a: 0xc7a9, 0x1d7b: 0xc7c9, + 0x1d7c: 0x0040, 0x1d7d: 0x0040, 0x1d7e: 0x0040, 0x1d7f: 0x0040, + // Block 0x76, offset 0x1d80 + 0x1d80: 0xcaf9, 0x1d81: 0xcb19, 0x1d82: 0xcb39, 0x1d83: 0x8b1d, 0x1d84: 0xcb59, 0x1d85: 0xcb79, + 0x1d86: 0xcb99, 0x1d87: 0xcbb9, 0x1d88: 0xcbd9, 0x1d89: 0xcbf9, 0x1d8a: 0xcc19, 0x1d8b: 0xcc39, + 0x1d8c: 0xcc59, 0x1d8d: 0x8b3d, 0x1d8e: 0xcc79, 0x1d8f: 0xcc99, 0x1d90: 0xccb9, 0x1d91: 0xccd9, + 0x1d92: 0x8b5d, 0x1d93: 0xccf9, 0x1d94: 0xcd19, 0x1d95: 0xc429, 0x1d96: 0x8b7d, 0x1d97: 0xcd39, + 0x1d98: 0xcd59, 0x1d99: 0xcd79, 0x1d9a: 0xcd99, 0x1d9b: 0xcdb9, 0x1d9c: 0x8b9d, 0x1d9d: 0xcdd9, + 0x1d9e: 0xcdf9, 0x1d9f: 0xce19, 0x1da0: 0xce39, 0x1da1: 0xce59, 0x1da2: 0xc789, 0x1da3: 0xce79, + 0x1da4: 0xce99, 0x1da5: 0xceb9, 0x1da6: 0xced9, 0x1da7: 0xcef9, 0x1da8: 0xcf19, 0x1da9: 0xcf39, + 0x1daa: 0xcf59, 0x1dab: 0xcf79, 0x1dac: 0xcf99, 0x1dad: 0xcfb9, 0x1dae: 0xcfd9, 0x1daf: 0xcff9, + 0x1db0: 0xd019, 0x1db1: 0xd039, 0x1db2: 0xd039, 0x1db3: 0xd039, 0x1db4: 0x8bbd, 0x1db5: 0xd059, + 0x1db6: 0xd079, 0x1db7: 0xd099, 0x1db8: 0x8bdd, 0x1db9: 0xd0b9, 0x1dba: 0xd0d9, 0x1dbb: 0xd0f9, + 0x1dbc: 0xd119, 0x1dbd: 0xd139, 0x1dbe: 0xd159, 0x1dbf: 0xd179, + // Block 0x77, offset 0x1dc0 + 0x1dc0: 0xd199, 0x1dc1: 0xd1b9, 0x1dc2: 0xd1d9, 0x1dc3: 0xd1f9, 0x1dc4: 0xd219, 0x1dc5: 0xd239, + 0x1dc6: 0xd239, 0x1dc7: 0xd259, 0x1dc8: 0xd279, 0x1dc9: 0xd299, 0x1dca: 0xd2b9, 0x1dcb: 0xd2d9, + 0x1dcc: 0xd2f9, 0x1dcd: 0xd319, 0x1dce: 0xd339, 0x1dcf: 0xd359, 0x1dd0: 0xd379, 0x1dd1: 0xd399, + 0x1dd2: 0xd3b9, 0x1dd3: 0xd3d9, 0x1dd4: 0xd3f9, 0x1dd5: 0xd419, 0x1dd6: 0xd439, 0x1dd7: 0xd459, + 0x1dd8: 0xd479, 0x1dd9: 0x8bfd, 0x1dda: 0xd499, 0x1ddb: 0xd4b9, 0x1ddc: 0xd4d9, 0x1ddd: 0xc309, + 0x1dde: 0xd4f9, 0x1ddf: 0xd519, 0x1de0: 0x8c1d, 0x1de1: 0x8c3d, 0x1de2: 0xd539, 0x1de3: 0xd559, + 0x1de4: 0xd579, 0x1de5: 0xd599, 0x1de6: 0xd5b9, 0x1de7: 0xd5d9, 0x1de8: 0x0040, 0x1de9: 0xd5f9, + 0x1dea: 0xd619, 0x1deb: 0xd619, 0x1dec: 0x8c5d, 0x1ded: 0xd639, 0x1dee: 0xd659, 0x1def: 0xd679, + 0x1df0: 0xd699, 0x1df1: 0x8c7d, 0x1df2: 0xd6b9, 0x1df3: 0xd6d9, 0x1df4: 0x0040, 0x1df5: 0xd6f9, + 0x1df6: 0xd719, 0x1df7: 0xd739, 0x1df8: 0xd759, 0x1df9: 0xd779, 0x1dfa: 0xd799, 0x1dfb: 0x8c9d, + 0x1dfc: 0xd7b9, 0x1dfd: 0x8cbd, 0x1dfe: 0xd7d9, 0x1dff: 0xd7f9, + // Block 0x78, offset 0x1e00 + 0x1e00: 0xd819, 0x1e01: 0xd839, 0x1e02: 0xd859, 0x1e03: 0xd879, 0x1e04: 0xd899, 0x1e05: 0xd8b9, + 0x1e06: 0xd8d9, 0x1e07: 0xd8f9, 0x1e08: 0xd919, 0x1e09: 0x8cdd, 0x1e0a: 0xd939, 0x1e0b: 0xd959, + 0x1e0c: 0xd979, 0x1e0d: 0xd999, 0x1e0e: 0xd9b9, 0x1e0f: 0x8cfd, 0x1e10: 0xd9d9, 0x1e11: 0x8d1d, + 0x1e12: 0x8d3d, 0x1e13: 0xd9f9, 0x1e14: 0xda19, 0x1e15: 0xda19, 0x1e16: 0xda39, 0x1e17: 0x8d5d, + 0x1e18: 0x8d7d, 0x1e19: 0xda59, 0x1e1a: 0xda79, 0x1e1b: 0xda99, 0x1e1c: 0xdab9, 0x1e1d: 0xdad9, + 0x1e1e: 0xdaf9, 0x1e1f: 0xdb19, 0x1e20: 0xdb39, 0x1e21: 0xdb59, 0x1e22: 0xdb79, 0x1e23: 0xdb99, + 0x1e24: 0x8d9d, 0x1e25: 0xdbb9, 0x1e26: 0xdbd9, 0x1e27: 0xdbf9, 0x1e28: 0xdc19, 0x1e29: 0xdbf9, + 0x1e2a: 0xdc39, 0x1e2b: 0xdc59, 0x1e2c: 0xdc79, 0x1e2d: 0xdc99, 0x1e2e: 0xdcb9, 0x1e2f: 0xdcd9, + 0x1e30: 0xdcf9, 0x1e31: 0xdd19, 0x1e32: 0xdd39, 0x1e33: 0xdd59, 0x1e34: 0xdd79, 0x1e35: 0xdd99, + 0x1e36: 0xddb9, 0x1e37: 0xddd9, 0x1e38: 0x8dbd, 0x1e39: 0xddf9, 0x1e3a: 0xde19, 0x1e3b: 0xde39, + 0x1e3c: 0xde59, 0x1e3d: 0xde79, 0x1e3e: 0x8ddd, 0x1e3f: 0xde99, + // Block 0x79, offset 0x1e40 + 0x1e40: 0xe599, 0x1e41: 0xe5b9, 0x1e42: 0xe5d9, 0x1e43: 0xe5f9, 0x1e44: 0xe619, 0x1e45: 0xe639, + 0x1e46: 0x8efd, 0x1e47: 0xe659, 0x1e48: 0xe679, 0x1e49: 0xe699, 0x1e4a: 0xe6b9, 0x1e4b: 0xe6d9, + 0x1e4c: 0xe6f9, 0x1e4d: 0x8f1d, 0x1e4e: 0xe719, 0x1e4f: 0xe739, 0x1e50: 0x8f3d, 0x1e51: 0x8f5d, + 0x1e52: 0xe759, 0x1e53: 0xe779, 0x1e54: 0xe799, 0x1e55: 0xe7b9, 0x1e56: 0xe7d9, 0x1e57: 0xe7f9, + 0x1e58: 0xe819, 0x1e59: 0xe839, 0x1e5a: 0xe859, 0x1e5b: 0x8f7d, 0x1e5c: 0xe879, 0x1e5d: 0x8f9d, + 0x1e5e: 0xe899, 0x1e5f: 0x0040, 0x1e60: 0xe8b9, 0x1e61: 0xe8d9, 0x1e62: 0xe8f9, 0x1e63: 0x8fbd, + 0x1e64: 0xe919, 0x1e65: 0xe939, 0x1e66: 0x8fdd, 0x1e67: 0x8ffd, 0x1e68: 0xe959, 0x1e69: 0xe979, + 0x1e6a: 0xe999, 0x1e6b: 0xe9b9, 0x1e6c: 0xe9d9, 0x1e6d: 0xe9d9, 0x1e6e: 0xe9f9, 0x1e6f: 0xea19, + 0x1e70: 0xea39, 0x1e71: 0xea59, 0x1e72: 0xea79, 0x1e73: 0xea99, 0x1e74: 0xeab9, 0x1e75: 0x901d, + 0x1e76: 0xead9, 0x1e77: 0x903d, 0x1e78: 0xeaf9, 0x1e79: 0x905d, 0x1e7a: 0xeb19, 0x1e7b: 0x907d, + 0x1e7c: 0x909d, 0x1e7d: 0x90bd, 0x1e7e: 0xeb39, 0x1e7f: 0xeb59, + // Block 0x7a, offset 0x1e80 + 0x1e80: 0xeb79, 0x1e81: 0x90dd, 0x1e82: 0x90fd, 0x1e83: 0x911d, 0x1e84: 0x913d, 0x1e85: 0xeb99, + 0x1e86: 0xebb9, 0x1e87: 0xebb9, 0x1e88: 0xebd9, 0x1e89: 0xebf9, 0x1e8a: 0xec19, 0x1e8b: 0xec39, + 0x1e8c: 0xec59, 0x1e8d: 0x915d, 0x1e8e: 0xec79, 0x1e8f: 0xec99, 0x1e90: 0xecb9, 0x1e91: 0xecd9, + 0x1e92: 0x917d, 0x1e93: 0xecf9, 0x1e94: 0x919d, 0x1e95: 0x91bd, 0x1e96: 0xed19, 0x1e97: 0xed39, + 0x1e98: 0xed59, 0x1e99: 0xed79, 0x1e9a: 0xed99, 0x1e9b: 0xedb9, 0x1e9c: 0x91dd, 0x1e9d: 0x91fd, + 0x1e9e: 0x921d, 0x1e9f: 0x0040, 0x1ea0: 0xedd9, 0x1ea1: 0x923d, 0x1ea2: 0xedf9, 0x1ea3: 0xee19, + 0x1ea4: 0xee39, 0x1ea5: 0x925d, 0x1ea6: 0xee59, 0x1ea7: 0xee79, 0x1ea8: 0xee99, 0x1ea9: 0xeeb9, + 0x1eaa: 0xeed9, 0x1eab: 0x927d, 0x1eac: 0xeef9, 0x1ead: 0xef19, 0x1eae: 0xef39, 0x1eaf: 0xef59, + 0x1eb0: 0xef79, 0x1eb1: 0xef99, 0x1eb2: 0x929d, 0x1eb3: 0x92bd, 0x1eb4: 0xefb9, 0x1eb5: 0x92dd, + 0x1eb6: 0xefd9, 0x1eb7: 0x92fd, 0x1eb8: 0xeff9, 0x1eb9: 0xf019, 0x1eba: 0xf039, 0x1ebb: 0x931d, + 0x1ebc: 0x933d, 0x1ebd: 0xf059, 0x1ebe: 0x935d, 0x1ebf: 0xf079, + // Block 0x7b, offset 0x1ec0 + 0x1ec0: 0xf6b9, 0x1ec1: 0xf6d9, 0x1ec2: 0xf6f9, 0x1ec3: 0xf719, 0x1ec4: 0xf739, 0x1ec5: 0x951d, + 0x1ec6: 0xf759, 0x1ec7: 0xf779, 0x1ec8: 0xf799, 0x1ec9: 0xf7b9, 0x1eca: 0xf7d9, 0x1ecb: 0x953d, + 0x1ecc: 0x955d, 0x1ecd: 0xf7f9, 0x1ece: 0xf819, 0x1ecf: 0xf839, 0x1ed0: 0xf859, 0x1ed1: 0xf879, + 0x1ed2: 0xf899, 0x1ed3: 0x957d, 0x1ed4: 0xf8b9, 0x1ed5: 0xf8d9, 0x1ed6: 0xf8f9, 0x1ed7: 0xf919, + 0x1ed8: 0x959d, 0x1ed9: 0x95bd, 0x1eda: 0xf939, 0x1edb: 0xf959, 0x1edc: 0xf979, 0x1edd: 0x95dd, + 0x1ede: 0xf999, 0x1edf: 0xf9b9, 0x1ee0: 0x6815, 0x1ee1: 0x95fd, 0x1ee2: 0xf9d9, 0x1ee3: 0xf9f9, + 0x1ee4: 0xfa19, 0x1ee5: 0x961d, 0x1ee6: 0xfa39, 0x1ee7: 0xfa59, 0x1ee8: 0xfa79, 0x1ee9: 0xfa99, + 0x1eea: 0xfab9, 0x1eeb: 0xfad9, 0x1eec: 0xfaf9, 0x1eed: 0x963d, 0x1eee: 0xfb19, 0x1eef: 0xfb39, + 0x1ef0: 0xfb59, 0x1ef1: 0x965d, 0x1ef2: 0xfb79, 0x1ef3: 0xfb99, 0x1ef4: 0xfbb9, 0x1ef5: 0xfbd9, + 0x1ef6: 0x7b35, 0x1ef7: 0x967d, 0x1ef8: 0xfbf9, 0x1ef9: 0xfc19, 0x1efa: 0xfc39, 0x1efb: 0x969d, + 0x1efc: 0xfc59, 0x1efd: 0x96bd, 0x1efe: 0xfc79, 0x1eff: 0xfc79, + // Block 0x7c, offset 0x1f00 + 0x1f00: 0xfc99, 0x1f01: 0x96dd, 0x1f02: 0xfcb9, 0x1f03: 0xfcd9, 0x1f04: 0xfcf9, 0x1f05: 0xfd19, + 0x1f06: 0xfd39, 0x1f07: 0xfd59, 0x1f08: 0xfd79, 0x1f09: 0x96fd, 0x1f0a: 0xfd99, 0x1f0b: 0xfdb9, + 0x1f0c: 0xfdd9, 0x1f0d: 0xfdf9, 0x1f0e: 0xfe19, 0x1f0f: 0xfe39, 0x1f10: 0x971d, 0x1f11: 0xfe59, + 0x1f12: 0x973d, 0x1f13: 0x975d, 0x1f14: 0x977d, 0x1f15: 0xfe79, 0x1f16: 0xfe99, 0x1f17: 0xfeb9, + 0x1f18: 0xfed9, 0x1f19: 0xfef9, 0x1f1a: 0xff19, 0x1f1b: 0xff39, 0x1f1c: 0xff59, 0x1f1d: 0x979d, + 0x1f1e: 0x0040, 0x1f1f: 0x0040, 0x1f20: 0x0040, 0x1f21: 0x0040, 0x1f22: 0x0040, 0x1f23: 0x0040, + 0x1f24: 0x0040, 0x1f25: 0x0040, 0x1f26: 0x0040, 0x1f27: 0x0040, 0x1f28: 0x0040, 0x1f29: 0x0040, + 0x1f2a: 0x0040, 0x1f2b: 0x0040, 0x1f2c: 0x0040, 0x1f2d: 0x0040, 0x1f2e: 0x0040, 0x1f2f: 0x0040, + 0x1f30: 0x0040, 0x1f31: 0x0040, 0x1f32: 0x0040, 0x1f33: 0x0040, 0x1f34: 0x0040, 0x1f35: 0x0040, + 0x1f36: 0x0040, 0x1f37: 0x0040, 0x1f38: 0x0040, 0x1f39: 0x0040, 0x1f3a: 0x0040, 0x1f3b: 0x0040, + 0x1f3c: 0x0040, 0x1f3d: 0x0040, 0x1f3e: 0x0040, 0x1f3f: 0x0040, +} + +// idnaIndex: 35 blocks, 2240 entries, 4480 bytes +// Block 0 is the zero block. +var idnaIndex = [2240]uint16{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x01, 0xc3: 0x7b, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x04, 0xc7: 0x05, + 0xc8: 0x06, 0xc9: 0x7c, 0xca: 0x7d, 0xcb: 0x07, 0xcc: 0x7e, 0xcd: 0x08, 0xce: 0x09, 0xcf: 0x0a, + 0xd0: 0x7f, 0xd1: 0x0b, 0xd2: 0x0c, 0xd3: 0x0d, 0xd4: 0x0e, 0xd5: 0x80, 0xd6: 0x81, 0xd7: 0x82, + 0xd8: 0x0f, 0xd9: 0x83, 0xda: 0x84, 0xdb: 0x10, 0xdc: 0x11, 0xdd: 0x85, 0xde: 0x86, 0xdf: 0x87, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06, 0xe5: 0x07, 0xe6: 0x07, 0xe7: 0x07, + 0xe8: 0x07, 0xe9: 0x08, 0xea: 0x09, 0xeb: 0x07, 0xec: 0x07, 0xed: 0x0a, 0xee: 0x0b, 0xef: 0x0c, + 0xf0: 0x1c, 0xf1: 0x1d, 0xf2: 0x1d, 0xf3: 0x1f, 0xf4: 0x20, + // Block 0x4, offset 0x100 + 0x120: 0x88, 0x121: 0x89, 0x122: 0x8a, 0x123: 0x8b, 0x124: 0x8c, 0x125: 0x12, 0x126: 0x13, 0x127: 0x14, + 0x128: 0x15, 0x129: 0x16, 0x12a: 0x17, 0x12b: 0x18, 0x12c: 0x19, 0x12d: 0x1a, 0x12e: 0x1b, 0x12f: 0x8d, + 0x130: 0x8e, 0x131: 0x1c, 0x132: 0x1d, 0x133: 0x1e, 0x134: 0x8f, 0x135: 0x1f, 0x136: 0x90, 0x137: 0x91, + 0x138: 0x92, 0x139: 0x93, 0x13a: 0x20, 0x13b: 0x94, 0x13c: 0x95, 0x13d: 0x21, 0x13e: 0x22, 0x13f: 0x96, + // Block 0x5, offset 0x140 + 0x140: 0x97, 0x141: 0x98, 0x142: 0x99, 0x143: 0x9a, 0x144: 0x9b, 0x145: 0x9c, 0x146: 0x9b, 0x147: 0x9b, + 0x148: 0x9d, 0x149: 0x9e, 0x14a: 0x9f, 0x14b: 0xa0, 0x14c: 0xa1, 0x14d: 0xa2, 0x14e: 0xa3, 0x14f: 0xa4, + 0x150: 0xa5, 0x151: 0x9d, 0x152: 0x9d, 0x153: 0x9d, 0x154: 0x9d, 0x155: 0x9d, 0x156: 0x9d, 0x157: 0x9d, + 0x158: 0x9d, 0x159: 0xa6, 0x15a: 0xa7, 0x15b: 0xa8, 0x15c: 0xa9, 0x15d: 0xaa, 0x15e: 0xab, 0x15f: 0xac, + 0x160: 0xad, 0x161: 0xae, 0x162: 0xaf, 0x163: 0xb0, 0x164: 0xb1, 0x165: 0xb2, 0x166: 0xb3, 0x167: 0xb4, + 0x168: 0xb5, 0x169: 0xb6, 0x16a: 0xb7, 0x16b: 0xb8, 0x16c: 0xb9, 0x16d: 0xba, 0x16e: 0xbb, 0x16f: 0xbc, + 0x170: 0xbd, 0x171: 0xbe, 0x172: 0xbf, 0x173: 0xc0, 0x174: 0x23, 0x175: 0x24, 0x176: 0x25, 0x177: 0xc1, + 0x178: 0x26, 0x179: 0x26, 0x17a: 0x27, 0x17b: 0x26, 0x17c: 0xc2, 0x17d: 0x28, 0x17e: 0x29, 0x17f: 0x2a, + // Block 0x6, offset 0x180 + 0x180: 0x2b, 0x181: 0x2c, 0x182: 0x2d, 0x183: 0xc3, 0x184: 0x2e, 0x185: 0x2f, 0x186: 0xc4, 0x187: 0x9b, + 0x188: 0xc5, 0x189: 0xc6, 0x18a: 0x9b, 0x18b: 0x9b, 0x18c: 0xc7, 0x18d: 0x9b, 0x18e: 0x9b, 0x18f: 0xc8, + 0x190: 0xc9, 0x191: 0x30, 0x192: 0x31, 0x193: 0x32, 0x194: 0x9b, 0x195: 0x9b, 0x196: 0x9b, 0x197: 0x9b, + 0x198: 0x9b, 0x199: 0x9b, 0x19a: 0x9b, 0x19b: 0x9b, 0x19c: 0x9b, 0x19d: 0x9b, 0x19e: 0x9b, 0x19f: 0x9b, + 0x1a0: 0x9b, 0x1a1: 0x9b, 0x1a2: 0x9b, 0x1a3: 0x9b, 0x1a4: 0x9b, 0x1a5: 0x9b, 0x1a6: 0x9b, 0x1a7: 0x9b, + 0x1a8: 0xca, 0x1a9: 0xcb, 0x1aa: 0x9b, 0x1ab: 0xcc, 0x1ac: 0x9b, 0x1ad: 0xcd, 0x1ae: 0xce, 0x1af: 0xcf, + 0x1b0: 0xd0, 0x1b1: 0x33, 0x1b2: 0x26, 0x1b3: 0x34, 0x1b4: 0xd1, 0x1b5: 0xd2, 0x1b6: 0xd3, 0x1b7: 0xd4, + 0x1b8: 0xd5, 0x1b9: 0xd6, 0x1ba: 0xd7, 0x1bb: 0xd8, 0x1bc: 0xd9, 0x1bd: 0xda, 0x1be: 0xdb, 0x1bf: 0x35, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x36, 0x1c1: 0xdc, 0x1c2: 0xdd, 0x1c3: 0xde, 0x1c4: 0xdf, 0x1c5: 0x37, 0x1c6: 0x38, 0x1c7: 0xe0, + 0x1c8: 0xe1, 0x1c9: 0x39, 0x1ca: 0x3a, 0x1cb: 0x3b, 0x1cc: 0x3c, 0x1cd: 0x3d, 0x1ce: 0x3e, 0x1cf: 0x3f, + 0x1d0: 0x9d, 0x1d1: 0x9d, 0x1d2: 0x9d, 0x1d3: 0x9d, 0x1d4: 0x9d, 0x1d5: 0x9d, 0x1d6: 0x9d, 0x1d7: 0x9d, + 0x1d8: 0x9d, 0x1d9: 0x9d, 0x1da: 0x9d, 0x1db: 0x9d, 0x1dc: 0x9d, 0x1dd: 0x9d, 0x1de: 0x9d, 0x1df: 0x9d, + 0x1e0: 0x9d, 0x1e1: 0x9d, 0x1e2: 0x9d, 0x1e3: 0x9d, 0x1e4: 0x9d, 0x1e5: 0x9d, 0x1e6: 0x9d, 0x1e7: 0x9d, + 0x1e8: 0x9d, 0x1e9: 0x9d, 0x1ea: 0x9d, 0x1eb: 0x9d, 0x1ec: 0x9d, 0x1ed: 0x9d, 0x1ee: 0x9d, 0x1ef: 0x9d, + 0x1f0: 0x9d, 0x1f1: 0x9d, 0x1f2: 0x9d, 0x1f3: 0x9d, 0x1f4: 0x9d, 0x1f5: 0x9d, 0x1f6: 0x9d, 0x1f7: 0x9d, + 0x1f8: 0x9d, 0x1f9: 0x9d, 0x1fa: 0x9d, 0x1fb: 0x9d, 0x1fc: 0x9d, 0x1fd: 0x9d, 0x1fe: 0x9d, 0x1ff: 0x9d, + // Block 0x8, offset 0x200 + 0x200: 0x9d, 0x201: 0x9d, 0x202: 0x9d, 0x203: 0x9d, 0x204: 0x9d, 0x205: 0x9d, 0x206: 0x9d, 0x207: 0x9d, + 0x208: 0x9d, 0x209: 0x9d, 0x20a: 0x9d, 0x20b: 0x9d, 0x20c: 0x9d, 0x20d: 0x9d, 0x20e: 0x9d, 0x20f: 0x9d, + 0x210: 0x9d, 0x211: 0x9d, 0x212: 0x9d, 0x213: 0x9d, 0x214: 0x9d, 0x215: 0x9d, 0x216: 0x9d, 0x217: 0x9d, + 0x218: 0x9d, 0x219: 0x9d, 0x21a: 0x9d, 0x21b: 0x9d, 0x21c: 0x9d, 0x21d: 0x9d, 0x21e: 0x9d, 0x21f: 0x9d, + 0x220: 0x9d, 0x221: 0x9d, 0x222: 0x9d, 0x223: 0x9d, 0x224: 0x9d, 0x225: 0x9d, 0x226: 0x9d, 0x227: 0x9d, + 0x228: 0x9d, 0x229: 0x9d, 0x22a: 0x9d, 0x22b: 0x9d, 0x22c: 0x9d, 0x22d: 0x9d, 0x22e: 0x9d, 0x22f: 0x9d, + 0x230: 0x9d, 0x231: 0x9d, 0x232: 0x9d, 0x233: 0x9d, 0x234: 0x9d, 0x235: 0x9d, 0x236: 0xb0, 0x237: 0x9b, + 0x238: 0x9d, 0x239: 0x9d, 0x23a: 0x9d, 0x23b: 0x9d, 0x23c: 0x9d, 0x23d: 0x9d, 0x23e: 0x9d, 0x23f: 0x9d, + // Block 0x9, offset 0x240 + 0x240: 0x9d, 0x241: 0x9d, 0x242: 0x9d, 0x243: 0x9d, 0x244: 0x9d, 0x245: 0x9d, 0x246: 0x9d, 0x247: 0x9d, + 0x248: 0x9d, 0x249: 0x9d, 0x24a: 0x9d, 0x24b: 0x9d, 0x24c: 0x9d, 0x24d: 0x9d, 0x24e: 0x9d, 0x24f: 0x9d, + 0x250: 0x9d, 0x251: 0x9d, 0x252: 0x9d, 0x253: 0x9d, 0x254: 0x9d, 0x255: 0x9d, 0x256: 0x9d, 0x257: 0x9d, + 0x258: 0x9d, 0x259: 0x9d, 0x25a: 0x9d, 0x25b: 0x9d, 0x25c: 0x9d, 0x25d: 0x9d, 0x25e: 0x9d, 0x25f: 0x9d, + 0x260: 0x9d, 0x261: 0x9d, 0x262: 0x9d, 0x263: 0x9d, 0x264: 0x9d, 0x265: 0x9d, 0x266: 0x9d, 0x267: 0x9d, + 0x268: 0x9d, 0x269: 0x9d, 0x26a: 0x9d, 0x26b: 0x9d, 0x26c: 0x9d, 0x26d: 0x9d, 0x26e: 0x9d, 0x26f: 0x9d, + 0x270: 0x9d, 0x271: 0x9d, 0x272: 0x9d, 0x273: 0x9d, 0x274: 0x9d, 0x275: 0x9d, 0x276: 0x9d, 0x277: 0x9d, + 0x278: 0x9d, 0x279: 0x9d, 0x27a: 0x9d, 0x27b: 0x9d, 0x27c: 0x9d, 0x27d: 0x9d, 0x27e: 0x9d, 0x27f: 0x9d, + // Block 0xa, offset 0x280 + 0x280: 0x9d, 0x281: 0x9d, 0x282: 0x9d, 0x283: 0x9d, 0x284: 0x9d, 0x285: 0x9d, 0x286: 0x9d, 0x287: 0x9d, + 0x288: 0x9d, 0x289: 0x9d, 0x28a: 0x9d, 0x28b: 0x9d, 0x28c: 0x9d, 0x28d: 0x9d, 0x28e: 0x9d, 0x28f: 0x9d, + 0x290: 0x9d, 0x291: 0x9d, 0x292: 0x9d, 0x293: 0x9d, 0x294: 0x9d, 0x295: 0x9d, 0x296: 0x9d, 0x297: 0x9d, + 0x298: 0x9d, 0x299: 0x9d, 0x29a: 0x9d, 0x29b: 0x9d, 0x29c: 0x9d, 0x29d: 0x9d, 0x29e: 0x9d, 0x29f: 0x9d, + 0x2a0: 0x9d, 0x2a1: 0x9d, 0x2a2: 0x9d, 0x2a3: 0x9d, 0x2a4: 0x9d, 0x2a5: 0x9d, 0x2a6: 0x9d, 0x2a7: 0x9d, + 0x2a8: 0x9d, 0x2a9: 0x9d, 0x2aa: 0x9d, 0x2ab: 0x9d, 0x2ac: 0x9d, 0x2ad: 0x9d, 0x2ae: 0x9d, 0x2af: 0x9d, + 0x2b0: 0x9d, 0x2b1: 0x9d, 0x2b2: 0x9d, 0x2b3: 0x9d, 0x2b4: 0x9d, 0x2b5: 0x9d, 0x2b6: 0x9d, 0x2b7: 0x9d, + 0x2b8: 0x9d, 0x2b9: 0x9d, 0x2ba: 0x9d, 0x2bb: 0x9d, 0x2bc: 0x9d, 0x2bd: 0x9d, 0x2be: 0x9d, 0x2bf: 0xe2, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x9d, 0x2c1: 0x9d, 0x2c2: 0x9d, 0x2c3: 0x9d, 0x2c4: 0x9d, 0x2c5: 0x9d, 0x2c6: 0x9d, 0x2c7: 0x9d, + 0x2c8: 0x9d, 0x2c9: 0x9d, 0x2ca: 0x9d, 0x2cb: 0x9d, 0x2cc: 0x9d, 0x2cd: 0x9d, 0x2ce: 0x9d, 0x2cf: 0x9d, + 0x2d0: 0x9d, 0x2d1: 0x9d, 0x2d2: 0xe3, 0x2d3: 0xe4, 0x2d4: 0x9d, 0x2d5: 0x9d, 0x2d6: 0x9d, 0x2d7: 0x9d, + 0x2d8: 0xe5, 0x2d9: 0x40, 0x2da: 0x41, 0x2db: 0xe6, 0x2dc: 0x42, 0x2dd: 0x43, 0x2de: 0x44, 0x2df: 0xe7, + 0x2e0: 0xe8, 0x2e1: 0xe9, 0x2e2: 0xea, 0x2e3: 0xeb, 0x2e4: 0xec, 0x2e5: 0xed, 0x2e6: 0xee, 0x2e7: 0xef, + 0x2e8: 0xf0, 0x2e9: 0xf1, 0x2ea: 0xf2, 0x2eb: 0xf3, 0x2ec: 0xf4, 0x2ed: 0xf5, 0x2ee: 0xf6, 0x2ef: 0xf7, + 0x2f0: 0x9d, 0x2f1: 0x9d, 0x2f2: 0x9d, 0x2f3: 0x9d, 0x2f4: 0x9d, 0x2f5: 0x9d, 0x2f6: 0x9d, 0x2f7: 0x9d, + 0x2f8: 0x9d, 0x2f9: 0x9d, 0x2fa: 0x9d, 0x2fb: 0x9d, 0x2fc: 0x9d, 0x2fd: 0x9d, 0x2fe: 0x9d, 0x2ff: 0x9d, + // Block 0xc, offset 0x300 + 0x300: 0x9d, 0x301: 0x9d, 0x302: 0x9d, 0x303: 0x9d, 0x304: 0x9d, 0x305: 0x9d, 0x306: 0x9d, 0x307: 0x9d, + 0x308: 0x9d, 0x309: 0x9d, 0x30a: 0x9d, 0x30b: 0x9d, 0x30c: 0x9d, 0x30d: 0x9d, 0x30e: 0x9d, 0x30f: 0x9d, + 0x310: 0x9d, 0x311: 0x9d, 0x312: 0x9d, 0x313: 0x9d, 0x314: 0x9d, 0x315: 0x9d, 0x316: 0x9d, 0x317: 0x9d, + 0x318: 0x9d, 0x319: 0x9d, 0x31a: 0x9d, 0x31b: 0x9d, 0x31c: 0x9d, 0x31d: 0x9d, 0x31e: 0xf8, 0x31f: 0xf9, + // Block 0xd, offset 0x340 + 0x340: 0xb8, 0x341: 0xb8, 0x342: 0xb8, 0x343: 0xb8, 0x344: 0xb8, 0x345: 0xb8, 0x346: 0xb8, 0x347: 0xb8, + 0x348: 0xb8, 0x349: 0xb8, 0x34a: 0xb8, 0x34b: 0xb8, 0x34c: 0xb8, 0x34d: 0xb8, 0x34e: 0xb8, 0x34f: 0xb8, + 0x350: 0xb8, 0x351: 0xb8, 0x352: 0xb8, 0x353: 0xb8, 0x354: 0xb8, 0x355: 0xb8, 0x356: 0xb8, 0x357: 0xb8, + 0x358: 0xb8, 0x359: 0xb8, 0x35a: 0xb8, 0x35b: 0xb8, 0x35c: 0xb8, 0x35d: 0xb8, 0x35e: 0xb8, 0x35f: 0xb8, + 0x360: 0xb8, 0x361: 0xb8, 0x362: 0xb8, 0x363: 0xb8, 0x364: 0xb8, 0x365: 0xb8, 0x366: 0xb8, 0x367: 0xb8, + 0x368: 0xb8, 0x369: 0xb8, 0x36a: 0xb8, 0x36b: 0xb8, 0x36c: 0xb8, 0x36d: 0xb8, 0x36e: 0xb8, 0x36f: 0xb8, + 0x370: 0xb8, 0x371: 0xb8, 0x372: 0xb8, 0x373: 0xb8, 0x374: 0xb8, 0x375: 0xb8, 0x376: 0xb8, 0x377: 0xb8, + 0x378: 0xb8, 0x379: 0xb8, 0x37a: 0xb8, 0x37b: 0xb8, 0x37c: 0xb8, 0x37d: 0xb8, 0x37e: 0xb8, 0x37f: 0xb8, + // Block 0xe, offset 0x380 + 0x380: 0xb8, 0x381: 0xb8, 0x382: 0xb8, 0x383: 0xb8, 0x384: 0xb8, 0x385: 0xb8, 0x386: 0xb8, 0x387: 0xb8, + 0x388: 0xb8, 0x389: 0xb8, 0x38a: 0xb8, 0x38b: 0xb8, 0x38c: 0xb8, 0x38d: 0xb8, 0x38e: 0xb8, 0x38f: 0xb8, + 0x390: 0xb8, 0x391: 0xb8, 0x392: 0xb8, 0x393: 0xb8, 0x394: 0xb8, 0x395: 0xb8, 0x396: 0xb8, 0x397: 0xb8, + 0x398: 0xb8, 0x399: 0xb8, 0x39a: 0xb8, 0x39b: 0xb8, 0x39c: 0xb8, 0x39d: 0xb8, 0x39e: 0xb8, 0x39f: 0xb8, + 0x3a0: 0xb8, 0x3a1: 0xb8, 0x3a2: 0xb8, 0x3a3: 0xb8, 0x3a4: 0xfa, 0x3a5: 0xfb, 0x3a6: 0xfc, 0x3a7: 0xfd, + 0x3a8: 0x45, 0x3a9: 0xfe, 0x3aa: 0xff, 0x3ab: 0x46, 0x3ac: 0x47, 0x3ad: 0x48, 0x3ae: 0x49, 0x3af: 0x4a, + 0x3b0: 0x100, 0x3b1: 0x4b, 0x3b2: 0x4c, 0x3b3: 0x4d, 0x3b4: 0x4e, 0x3b5: 0x4f, 0x3b6: 0x101, 0x3b7: 0x50, + 0x3b8: 0x51, 0x3b9: 0x52, 0x3ba: 0x53, 0x3bb: 0x54, 0x3bc: 0x55, 0x3bd: 0x56, 0x3be: 0x57, 0x3bf: 0x58, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x102, 0x3c1: 0x103, 0x3c2: 0x9d, 0x3c3: 0x104, 0x3c4: 0x105, 0x3c5: 0x9b, 0x3c6: 0x106, 0x3c7: 0x107, + 0x3c8: 0xb8, 0x3c9: 0xb8, 0x3ca: 0x108, 0x3cb: 0x109, 0x3cc: 0x10a, 0x3cd: 0x10b, 0x3ce: 0x10c, 0x3cf: 0x10d, + 0x3d0: 0x10e, 0x3d1: 0x9d, 0x3d2: 0x10f, 0x3d3: 0x110, 0x3d4: 0x111, 0x3d5: 0x112, 0x3d6: 0xb8, 0x3d7: 0xb8, + 0x3d8: 0x9d, 0x3d9: 0x9d, 0x3da: 0x9d, 0x3db: 0x9d, 0x3dc: 0x113, 0x3dd: 0x114, 0x3de: 0xb8, 0x3df: 0xb8, + 0x3e0: 0x115, 0x3e1: 0x116, 0x3e2: 0x117, 0x3e3: 0x118, 0x3e4: 0x119, 0x3e5: 0xb8, 0x3e6: 0x11a, 0x3e7: 0x11b, + 0x3e8: 0x11c, 0x3e9: 0x11d, 0x3ea: 0x11e, 0x3eb: 0x59, 0x3ec: 0x11f, 0x3ed: 0x120, 0x3ee: 0x5a, 0x3ef: 0xb8, + 0x3f0: 0x9d, 0x3f1: 0x121, 0x3f2: 0x122, 0x3f3: 0x123, 0x3f4: 0xb8, 0x3f5: 0xb8, 0x3f6: 0xb8, 0x3f7: 0xb8, + 0x3f8: 0xb8, 0x3f9: 0x124, 0x3fa: 0xb8, 0x3fb: 0xb8, 0x3fc: 0xb8, 0x3fd: 0xb8, 0x3fe: 0xb8, 0x3ff: 0xb8, + // Block 0x10, offset 0x400 + 0x400: 0x125, 0x401: 0x126, 0x402: 0x127, 0x403: 0x128, 0x404: 0x129, 0x405: 0x12a, 0x406: 0x12b, 0x407: 0x12c, + 0x408: 0x12d, 0x409: 0xb8, 0x40a: 0x12e, 0x40b: 0x12f, 0x40c: 0x5b, 0x40d: 0x5c, 0x40e: 0xb8, 0x40f: 0xb8, + 0x410: 0x130, 0x411: 0x131, 0x412: 0x132, 0x413: 0x133, 0x414: 0xb8, 0x415: 0xb8, 0x416: 0x134, 0x417: 0x135, + 0x418: 0x136, 0x419: 0x137, 0x41a: 0x138, 0x41b: 0x139, 0x41c: 0x13a, 0x41d: 0xb8, 0x41e: 0xb8, 0x41f: 0xb8, + 0x420: 0xb8, 0x421: 0xb8, 0x422: 0x13b, 0x423: 0x13c, 0x424: 0xb8, 0x425: 0xb8, 0x426: 0xb8, 0x427: 0xb8, + 0x428: 0xb8, 0x429: 0xb8, 0x42a: 0xb8, 0x42b: 0x13d, 0x42c: 0xb8, 0x42d: 0xb8, 0x42e: 0xb8, 0x42f: 0xb8, + 0x430: 0x13e, 0x431: 0x13f, 0x432: 0x140, 0x433: 0xb8, 0x434: 0xb8, 0x435: 0xb8, 0x436: 0xb8, 0x437: 0xb8, + 0x438: 0xb8, 0x439: 0xb8, 0x43a: 0xb8, 0x43b: 0xb8, 0x43c: 0xb8, 0x43d: 0xb8, 0x43e: 0xb8, 0x43f: 0xb8, + // Block 0x11, offset 0x440 + 0x440: 0x9d, 0x441: 0x9d, 0x442: 0x9d, 0x443: 0x9d, 0x444: 0x9d, 0x445: 0x9d, 0x446: 0x9d, 0x447: 0x9d, + 0x448: 0x9d, 0x449: 0x9d, 0x44a: 0x9d, 0x44b: 0x9d, 0x44c: 0x9d, 0x44d: 0x9d, 0x44e: 0x141, 0x44f: 0xb8, + 0x450: 0x9b, 0x451: 0x142, 0x452: 0x9d, 0x453: 0x9d, 0x454: 0x9d, 0x455: 0x143, 0x456: 0xb8, 0x457: 0xb8, + 0x458: 0xb8, 0x459: 0xb8, 0x45a: 0xb8, 0x45b: 0xb8, 0x45c: 0xb8, 0x45d: 0xb8, 0x45e: 0xb8, 0x45f: 0xb8, + 0x460: 0xb8, 0x461: 0xb8, 0x462: 0xb8, 0x463: 0xb8, 0x464: 0xb8, 0x465: 0xb8, 0x466: 0xb8, 0x467: 0xb8, + 0x468: 0xb8, 0x469: 0xb8, 0x46a: 0xb8, 0x46b: 0xb8, 0x46c: 0xb8, 0x46d: 0xb8, 0x46e: 0xb8, 0x46f: 0xb8, + 0x470: 0xb8, 0x471: 0xb8, 0x472: 0xb8, 0x473: 0xb8, 0x474: 0xb8, 0x475: 0xb8, 0x476: 0xb8, 0x477: 0xb8, + 0x478: 0xb8, 0x479: 0xb8, 0x47a: 0xb8, 0x47b: 0xb8, 0x47c: 0xb8, 0x47d: 0xb8, 0x47e: 0xb8, 0x47f: 0xb8, + // Block 0x12, offset 0x480 + 0x480: 0x9d, 0x481: 0x9d, 0x482: 0x9d, 0x483: 0x9d, 0x484: 0x9d, 0x485: 0x9d, 0x486: 0x9d, 0x487: 0x9d, + 0x488: 0x9d, 0x489: 0x9d, 0x48a: 0x9d, 0x48b: 0x9d, 0x48c: 0x9d, 0x48d: 0x9d, 0x48e: 0x9d, 0x48f: 0x9d, + 0x490: 0x144, 0x491: 0xb8, 0x492: 0xb8, 0x493: 0xb8, 0x494: 0xb8, 0x495: 0xb8, 0x496: 0xb8, 0x497: 0xb8, + 0x498: 0xb8, 0x499: 0xb8, 0x49a: 0xb8, 0x49b: 0xb8, 0x49c: 0xb8, 0x49d: 0xb8, 0x49e: 0xb8, 0x49f: 0xb8, + 0x4a0: 0xb8, 0x4a1: 0xb8, 0x4a2: 0xb8, 0x4a3: 0xb8, 0x4a4: 0xb8, 0x4a5: 0xb8, 0x4a6: 0xb8, 0x4a7: 0xb8, + 0x4a8: 0xb8, 0x4a9: 0xb8, 0x4aa: 0xb8, 0x4ab: 0xb8, 0x4ac: 0xb8, 0x4ad: 0xb8, 0x4ae: 0xb8, 0x4af: 0xb8, + 0x4b0: 0xb8, 0x4b1: 0xb8, 0x4b2: 0xb8, 0x4b3: 0xb8, 0x4b4: 0xb8, 0x4b5: 0xb8, 0x4b6: 0xb8, 0x4b7: 0xb8, + 0x4b8: 0xb8, 0x4b9: 0xb8, 0x4ba: 0xb8, 0x4bb: 0xb8, 0x4bc: 0xb8, 0x4bd: 0xb8, 0x4be: 0xb8, 0x4bf: 0xb8, + // Block 0x13, offset 0x4c0 + 0x4c0: 0xb8, 0x4c1: 0xb8, 0x4c2: 0xb8, 0x4c3: 0xb8, 0x4c4: 0xb8, 0x4c5: 0xb8, 0x4c6: 0xb8, 0x4c7: 0xb8, + 0x4c8: 0xb8, 0x4c9: 0xb8, 0x4ca: 0xb8, 0x4cb: 0xb8, 0x4cc: 0xb8, 0x4cd: 0xb8, 0x4ce: 0xb8, 0x4cf: 0xb8, + 0x4d0: 0x9d, 0x4d1: 0x9d, 0x4d2: 0x9d, 0x4d3: 0x9d, 0x4d4: 0x9d, 0x4d5: 0x9d, 0x4d6: 0x9d, 0x4d7: 0x9d, + 0x4d8: 0x9d, 0x4d9: 0x145, 0x4da: 0xb8, 0x4db: 0xb8, 0x4dc: 0xb8, 0x4dd: 0xb8, 0x4de: 0xb8, 0x4df: 0xb8, + 0x4e0: 0xb8, 0x4e1: 0xb8, 0x4e2: 0xb8, 0x4e3: 0xb8, 0x4e4: 0xb8, 0x4e5: 0xb8, 0x4e6: 0xb8, 0x4e7: 0xb8, + 0x4e8: 0xb8, 0x4e9: 0xb8, 0x4ea: 0xb8, 0x4eb: 0xb8, 0x4ec: 0xb8, 0x4ed: 0xb8, 0x4ee: 0xb8, 0x4ef: 0xb8, + 0x4f0: 0xb8, 0x4f1: 0xb8, 0x4f2: 0xb8, 0x4f3: 0xb8, 0x4f4: 0xb8, 0x4f5: 0xb8, 0x4f6: 0xb8, 0x4f7: 0xb8, + 0x4f8: 0xb8, 0x4f9: 0xb8, 0x4fa: 0xb8, 0x4fb: 0xb8, 0x4fc: 0xb8, 0x4fd: 0xb8, 0x4fe: 0xb8, 0x4ff: 0xb8, + // Block 0x14, offset 0x500 + 0x500: 0xb8, 0x501: 0xb8, 0x502: 0xb8, 0x503: 0xb8, 0x504: 0xb8, 0x505: 0xb8, 0x506: 0xb8, 0x507: 0xb8, + 0x508: 0xb8, 0x509: 0xb8, 0x50a: 0xb8, 0x50b: 0xb8, 0x50c: 0xb8, 0x50d: 0xb8, 0x50e: 0xb8, 0x50f: 0xb8, + 0x510: 0xb8, 0x511: 0xb8, 0x512: 0xb8, 0x513: 0xb8, 0x514: 0xb8, 0x515: 0xb8, 0x516: 0xb8, 0x517: 0xb8, + 0x518: 0xb8, 0x519: 0xb8, 0x51a: 0xb8, 0x51b: 0xb8, 0x51c: 0xb8, 0x51d: 0xb8, 0x51e: 0xb8, 0x51f: 0xb8, + 0x520: 0x9d, 0x521: 0x9d, 0x522: 0x9d, 0x523: 0x9d, 0x524: 0x9d, 0x525: 0x9d, 0x526: 0x9d, 0x527: 0x9d, + 0x528: 0x13d, 0x529: 0x146, 0x52a: 0xb8, 0x52b: 0x147, 0x52c: 0x148, 0x52d: 0x149, 0x52e: 0x14a, 0x52f: 0xb8, + 0x530: 0xb8, 0x531: 0xb8, 0x532: 0xb8, 0x533: 0xb8, 0x534: 0xb8, 0x535: 0xb8, 0x536: 0xb8, 0x537: 0xb8, + 0x538: 0xb8, 0x539: 0xb8, 0x53a: 0xb8, 0x53b: 0xb8, 0x53c: 0x9d, 0x53d: 0x14b, 0x53e: 0x14c, 0x53f: 0x14d, + // Block 0x15, offset 0x540 + 0x540: 0x9d, 0x541: 0x9d, 0x542: 0x9d, 0x543: 0x9d, 0x544: 0x9d, 0x545: 0x9d, 0x546: 0x9d, 0x547: 0x9d, + 0x548: 0x9d, 0x549: 0x9d, 0x54a: 0x9d, 0x54b: 0x9d, 0x54c: 0x9d, 0x54d: 0x9d, 0x54e: 0x9d, 0x54f: 0x9d, + 0x550: 0x9d, 0x551: 0x9d, 0x552: 0x9d, 0x553: 0x9d, 0x554: 0x9d, 0x555: 0x9d, 0x556: 0x9d, 0x557: 0x9d, + 0x558: 0x9d, 0x559: 0x9d, 0x55a: 0x9d, 0x55b: 0x9d, 0x55c: 0x9d, 0x55d: 0x9d, 0x55e: 0x9d, 0x55f: 0x14e, + 0x560: 0x9d, 0x561: 0x9d, 0x562: 0x9d, 0x563: 0x9d, 0x564: 0x9d, 0x565: 0x9d, 0x566: 0x9d, 0x567: 0x9d, + 0x568: 0x9d, 0x569: 0x9d, 0x56a: 0x9d, 0x56b: 0x14f, 0x56c: 0xb8, 0x56d: 0xb8, 0x56e: 0xb8, 0x56f: 0xb8, + 0x570: 0xb8, 0x571: 0xb8, 0x572: 0xb8, 0x573: 0xb8, 0x574: 0xb8, 0x575: 0xb8, 0x576: 0xb8, 0x577: 0xb8, + 0x578: 0xb8, 0x579: 0xb8, 0x57a: 0xb8, 0x57b: 0xb8, 0x57c: 0xb8, 0x57d: 0xb8, 0x57e: 0xb8, 0x57f: 0xb8, + // Block 0x16, offset 0x580 + 0x580: 0x150, 0x581: 0xb8, 0x582: 0xb8, 0x583: 0xb8, 0x584: 0xb8, 0x585: 0xb8, 0x586: 0xb8, 0x587: 0xb8, + 0x588: 0xb8, 0x589: 0xb8, 0x58a: 0xb8, 0x58b: 0xb8, 0x58c: 0xb8, 0x58d: 0xb8, 0x58e: 0xb8, 0x58f: 0xb8, + 0x590: 0xb8, 0x591: 0xb8, 0x592: 0xb8, 0x593: 0xb8, 0x594: 0xb8, 0x595: 0xb8, 0x596: 0xb8, 0x597: 0xb8, + 0x598: 0xb8, 0x599: 0xb8, 0x59a: 0xb8, 0x59b: 0xb8, 0x59c: 0xb8, 0x59d: 0xb8, 0x59e: 0xb8, 0x59f: 0xb8, + 0x5a0: 0xb8, 0x5a1: 0xb8, 0x5a2: 0xb8, 0x5a3: 0xb8, 0x5a4: 0xb8, 0x5a5: 0xb8, 0x5a6: 0xb8, 0x5a7: 0xb8, + 0x5a8: 0xb8, 0x5a9: 0xb8, 0x5aa: 0xb8, 0x5ab: 0xb8, 0x5ac: 0xb8, 0x5ad: 0xb8, 0x5ae: 0xb8, 0x5af: 0xb8, + 0x5b0: 0x9d, 0x5b1: 0x151, 0x5b2: 0x152, 0x5b3: 0xb8, 0x5b4: 0xb8, 0x5b5: 0xb8, 0x5b6: 0xb8, 0x5b7: 0xb8, + 0x5b8: 0xb8, 0x5b9: 0xb8, 0x5ba: 0xb8, 0x5bb: 0xb8, 0x5bc: 0xb8, 0x5bd: 0xb8, 0x5be: 0xb8, 0x5bf: 0xb8, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x9b, 0x5c1: 0x9b, 0x5c2: 0x9b, 0x5c3: 0x153, 0x5c4: 0x154, 0x5c5: 0x155, 0x5c6: 0x156, 0x5c7: 0x157, + 0x5c8: 0x9b, 0x5c9: 0x158, 0x5ca: 0xb8, 0x5cb: 0xb8, 0x5cc: 0x9b, 0x5cd: 0x159, 0x5ce: 0xb8, 0x5cf: 0xb8, + 0x5d0: 0x5d, 0x5d1: 0x5e, 0x5d2: 0x5f, 0x5d3: 0x60, 0x5d4: 0x61, 0x5d5: 0x62, 0x5d6: 0x63, 0x5d7: 0x64, + 0x5d8: 0x65, 0x5d9: 0x66, 0x5da: 0x67, 0x5db: 0x68, 0x5dc: 0x69, 0x5dd: 0x6a, 0x5de: 0x6b, 0x5df: 0x6c, + 0x5e0: 0x9b, 0x5e1: 0x9b, 0x5e2: 0x9b, 0x5e3: 0x9b, 0x5e4: 0x9b, 0x5e5: 0x9b, 0x5e6: 0x9b, 0x5e7: 0x9b, + 0x5e8: 0x15a, 0x5e9: 0x15b, 0x5ea: 0x15c, 0x5eb: 0xb8, 0x5ec: 0xb8, 0x5ed: 0xb8, 0x5ee: 0xb8, 0x5ef: 0xb8, + 0x5f0: 0xb8, 0x5f1: 0xb8, 0x5f2: 0xb8, 0x5f3: 0xb8, 0x5f4: 0xb8, 0x5f5: 0xb8, 0x5f6: 0xb8, 0x5f7: 0xb8, + 0x5f8: 0xb8, 0x5f9: 0xb8, 0x5fa: 0xb8, 0x5fb: 0xb8, 0x5fc: 0xb8, 0x5fd: 0xb8, 0x5fe: 0xb8, 0x5ff: 0xb8, + // Block 0x18, offset 0x600 + 0x600: 0x15d, 0x601: 0xb8, 0x602: 0xb8, 0x603: 0xb8, 0x604: 0xb8, 0x605: 0xb8, 0x606: 0xb8, 0x607: 0xb8, + 0x608: 0xb8, 0x609: 0xb8, 0x60a: 0xb8, 0x60b: 0xb8, 0x60c: 0xb8, 0x60d: 0xb8, 0x60e: 0xb8, 0x60f: 0xb8, + 0x610: 0xb8, 0x611: 0xb8, 0x612: 0xb8, 0x613: 0xb8, 0x614: 0xb8, 0x615: 0xb8, 0x616: 0xb8, 0x617: 0xb8, + 0x618: 0xb8, 0x619: 0xb8, 0x61a: 0xb8, 0x61b: 0xb8, 0x61c: 0xb8, 0x61d: 0xb8, 0x61e: 0xb8, 0x61f: 0xb8, + 0x620: 0x9d, 0x621: 0x9d, 0x622: 0x9d, 0x623: 0x15e, 0x624: 0x6d, 0x625: 0x15f, 0x626: 0xb8, 0x627: 0xb8, + 0x628: 0xb8, 0x629: 0xb8, 0x62a: 0xb8, 0x62b: 0xb8, 0x62c: 0xb8, 0x62d: 0xb8, 0x62e: 0xb8, 0x62f: 0xb8, + 0x630: 0xb8, 0x631: 0xb8, 0x632: 0xb8, 0x633: 0xb8, 0x634: 0xb8, 0x635: 0xb8, 0x636: 0xb8, 0x637: 0xb8, + 0x638: 0x6e, 0x639: 0x6f, 0x63a: 0x70, 0x63b: 0x160, 0x63c: 0xb8, 0x63d: 0xb8, 0x63e: 0xb8, 0x63f: 0xb8, + // Block 0x19, offset 0x640 + 0x640: 0x161, 0x641: 0x9b, 0x642: 0x162, 0x643: 0x163, 0x644: 0x71, 0x645: 0x72, 0x646: 0x164, 0x647: 0x165, + 0x648: 0x73, 0x649: 0x166, 0x64a: 0xb8, 0x64b: 0xb8, 0x64c: 0x9b, 0x64d: 0x9b, 0x64e: 0x9b, 0x64f: 0x9b, + 0x650: 0x9b, 0x651: 0x9b, 0x652: 0x9b, 0x653: 0x9b, 0x654: 0x9b, 0x655: 0x9b, 0x656: 0x9b, 0x657: 0x9b, + 0x658: 0x9b, 0x659: 0x9b, 0x65a: 0x9b, 0x65b: 0x167, 0x65c: 0x9b, 0x65d: 0x168, 0x65e: 0x9b, 0x65f: 0x169, + 0x660: 0x16a, 0x661: 0x16b, 0x662: 0x16c, 0x663: 0xb8, 0x664: 0x16d, 0x665: 0x16e, 0x666: 0x16f, 0x667: 0x170, + 0x668: 0xb8, 0x669: 0xb8, 0x66a: 0xb8, 0x66b: 0xb8, 0x66c: 0xb8, 0x66d: 0xb8, 0x66e: 0xb8, 0x66f: 0xb8, + 0x670: 0xb8, 0x671: 0xb8, 0x672: 0xb8, 0x673: 0xb8, 0x674: 0xb8, 0x675: 0xb8, 0x676: 0xb8, 0x677: 0xb8, + 0x678: 0xb8, 0x679: 0xb8, 0x67a: 0xb8, 0x67b: 0xb8, 0x67c: 0xb8, 0x67d: 0xb8, 0x67e: 0xb8, 0x67f: 0xb8, + // Block 0x1a, offset 0x680 + 0x680: 0x9d, 0x681: 0x9d, 0x682: 0x9d, 0x683: 0x9d, 0x684: 0x9d, 0x685: 0x9d, 0x686: 0x9d, 0x687: 0x9d, + 0x688: 0x9d, 0x689: 0x9d, 0x68a: 0x9d, 0x68b: 0x9d, 0x68c: 0x9d, 0x68d: 0x9d, 0x68e: 0x9d, 0x68f: 0x9d, + 0x690: 0x9d, 0x691: 0x9d, 0x692: 0x9d, 0x693: 0x9d, 0x694: 0x9d, 0x695: 0x9d, 0x696: 0x9d, 0x697: 0x9d, + 0x698: 0x9d, 0x699: 0x9d, 0x69a: 0x9d, 0x69b: 0x171, 0x69c: 0x9d, 0x69d: 0x9d, 0x69e: 0x9d, 0x69f: 0x9d, + 0x6a0: 0x9d, 0x6a1: 0x9d, 0x6a2: 0x9d, 0x6a3: 0x9d, 0x6a4: 0x9d, 0x6a5: 0x9d, 0x6a6: 0x9d, 0x6a7: 0x9d, + 0x6a8: 0x9d, 0x6a9: 0x9d, 0x6aa: 0x9d, 0x6ab: 0x9d, 0x6ac: 0x9d, 0x6ad: 0x9d, 0x6ae: 0x9d, 0x6af: 0x9d, + 0x6b0: 0x9d, 0x6b1: 0x9d, 0x6b2: 0x9d, 0x6b3: 0x9d, 0x6b4: 0x9d, 0x6b5: 0x9d, 0x6b6: 0x9d, 0x6b7: 0x9d, + 0x6b8: 0x9d, 0x6b9: 0x9d, 0x6ba: 0x9d, 0x6bb: 0x9d, 0x6bc: 0x9d, 0x6bd: 0x9d, 0x6be: 0x9d, 0x6bf: 0x9d, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0x9d, 0x6c1: 0x9d, 0x6c2: 0x9d, 0x6c3: 0x9d, 0x6c4: 0x9d, 0x6c5: 0x9d, 0x6c6: 0x9d, 0x6c7: 0x9d, + 0x6c8: 0x9d, 0x6c9: 0x9d, 0x6ca: 0x9d, 0x6cb: 0x9d, 0x6cc: 0x9d, 0x6cd: 0x9d, 0x6ce: 0x9d, 0x6cf: 0x9d, + 0x6d0: 0x9d, 0x6d1: 0x9d, 0x6d2: 0x9d, 0x6d3: 0x9d, 0x6d4: 0x9d, 0x6d5: 0x9d, 0x6d6: 0x9d, 0x6d7: 0x9d, + 0x6d8: 0x9d, 0x6d9: 0x9d, 0x6da: 0x9d, 0x6db: 0x9d, 0x6dc: 0x172, 0x6dd: 0x9d, 0x6de: 0x9d, 0x6df: 0x9d, + 0x6e0: 0x173, 0x6e1: 0x9d, 0x6e2: 0x9d, 0x6e3: 0x9d, 0x6e4: 0x9d, 0x6e5: 0x9d, 0x6e6: 0x9d, 0x6e7: 0x9d, + 0x6e8: 0x9d, 0x6e9: 0x9d, 0x6ea: 0x9d, 0x6eb: 0x9d, 0x6ec: 0x9d, 0x6ed: 0x9d, 0x6ee: 0x9d, 0x6ef: 0x9d, + 0x6f0: 0x9d, 0x6f1: 0x9d, 0x6f2: 0x9d, 0x6f3: 0x9d, 0x6f4: 0x9d, 0x6f5: 0x9d, 0x6f6: 0x9d, 0x6f7: 0x9d, + 0x6f8: 0x9d, 0x6f9: 0x9d, 0x6fa: 0x9d, 0x6fb: 0x9d, 0x6fc: 0x9d, 0x6fd: 0x9d, 0x6fe: 0x9d, 0x6ff: 0x9d, + // Block 0x1c, offset 0x700 + 0x700: 0x9d, 0x701: 0x9d, 0x702: 0x9d, 0x703: 0x9d, 0x704: 0x9d, 0x705: 0x9d, 0x706: 0x9d, 0x707: 0x9d, + 0x708: 0x9d, 0x709: 0x9d, 0x70a: 0x9d, 0x70b: 0x9d, 0x70c: 0x9d, 0x70d: 0x9d, 0x70e: 0x9d, 0x70f: 0x9d, + 0x710: 0x9d, 0x711: 0x9d, 0x712: 0x9d, 0x713: 0x9d, 0x714: 0x9d, 0x715: 0x9d, 0x716: 0x9d, 0x717: 0x9d, + 0x718: 0x9d, 0x719: 0x9d, 0x71a: 0x9d, 0x71b: 0x9d, 0x71c: 0x9d, 0x71d: 0x9d, 0x71e: 0x9d, 0x71f: 0x9d, + 0x720: 0x9d, 0x721: 0x9d, 0x722: 0x9d, 0x723: 0x9d, 0x724: 0x9d, 0x725: 0x9d, 0x726: 0x9d, 0x727: 0x9d, + 0x728: 0x9d, 0x729: 0x9d, 0x72a: 0x9d, 0x72b: 0x9d, 0x72c: 0x9d, 0x72d: 0x9d, 0x72e: 0x9d, 0x72f: 0x9d, + 0x730: 0x9d, 0x731: 0x9d, 0x732: 0x9d, 0x733: 0x9d, 0x734: 0x9d, 0x735: 0x9d, 0x736: 0x9d, 0x737: 0x9d, + 0x738: 0x9d, 0x739: 0x9d, 0x73a: 0x174, 0x73b: 0xb8, 0x73c: 0xb8, 0x73d: 0xb8, 0x73e: 0xb8, 0x73f: 0xb8, + // Block 0x1d, offset 0x740 + 0x740: 0xb8, 0x741: 0xb8, 0x742: 0xb8, 0x743: 0xb8, 0x744: 0xb8, 0x745: 0xb8, 0x746: 0xb8, 0x747: 0xb8, + 0x748: 0xb8, 0x749: 0xb8, 0x74a: 0xb8, 0x74b: 0xb8, 0x74c: 0xb8, 0x74d: 0xb8, 0x74e: 0xb8, 0x74f: 0xb8, + 0x750: 0xb8, 0x751: 0xb8, 0x752: 0xb8, 0x753: 0xb8, 0x754: 0xb8, 0x755: 0xb8, 0x756: 0xb8, 0x757: 0xb8, + 0x758: 0xb8, 0x759: 0xb8, 0x75a: 0xb8, 0x75b: 0xb8, 0x75c: 0xb8, 0x75d: 0xb8, 0x75e: 0xb8, 0x75f: 0xb8, + 0x760: 0x74, 0x761: 0x75, 0x762: 0x76, 0x763: 0x175, 0x764: 0x77, 0x765: 0x78, 0x766: 0x176, 0x767: 0x79, + 0x768: 0x7a, 0x769: 0xb8, 0x76a: 0xb8, 0x76b: 0xb8, 0x76c: 0xb8, 0x76d: 0xb8, 0x76e: 0xb8, 0x76f: 0xb8, + 0x770: 0xb8, 0x771: 0xb8, 0x772: 0xb8, 0x773: 0xb8, 0x774: 0xb8, 0x775: 0xb8, 0x776: 0xb8, 0x777: 0xb8, + 0x778: 0xb8, 0x779: 0xb8, 0x77a: 0xb8, 0x77b: 0xb8, 0x77c: 0xb8, 0x77d: 0xb8, 0x77e: 0xb8, 0x77f: 0xb8, + // Block 0x1e, offset 0x780 + 0x790: 0x0d, 0x791: 0x0e, 0x792: 0x0f, 0x793: 0x10, 0x794: 0x11, 0x795: 0x0b, 0x796: 0x12, 0x797: 0x07, + 0x798: 0x13, 0x799: 0x0b, 0x79a: 0x0b, 0x79b: 0x14, 0x79c: 0x0b, 0x79d: 0x15, 0x79e: 0x16, 0x79f: 0x17, + 0x7a0: 0x07, 0x7a1: 0x07, 0x7a2: 0x07, 0x7a3: 0x07, 0x7a4: 0x07, 0x7a5: 0x07, 0x7a6: 0x07, 0x7a7: 0x07, + 0x7a8: 0x07, 0x7a9: 0x07, 0x7aa: 0x18, 0x7ab: 0x19, 0x7ac: 0x1a, 0x7ad: 0x0b, 0x7ae: 0x0b, 0x7af: 0x1b, + 0x7b0: 0x0b, 0x7b1: 0x0b, 0x7b2: 0x0b, 0x7b3: 0x0b, 0x7b4: 0x0b, 0x7b5: 0x0b, 0x7b6: 0x0b, 0x7b7: 0x0b, + 0x7b8: 0x0b, 0x7b9: 0x0b, 0x7ba: 0x0b, 0x7bb: 0x0b, 0x7bc: 0x0b, 0x7bd: 0x0b, 0x7be: 0x0b, 0x7bf: 0x0b, + // Block 0x1f, offset 0x7c0 + 0x7c0: 0x0b, 0x7c1: 0x0b, 0x7c2: 0x0b, 0x7c3: 0x0b, 0x7c4: 0x0b, 0x7c5: 0x0b, 0x7c6: 0x0b, 0x7c7: 0x0b, + 0x7c8: 0x0b, 0x7c9: 0x0b, 0x7ca: 0x0b, 0x7cb: 0x0b, 0x7cc: 0x0b, 0x7cd: 0x0b, 0x7ce: 0x0b, 0x7cf: 0x0b, + 0x7d0: 0x0b, 0x7d1: 0x0b, 0x7d2: 0x0b, 0x7d3: 0x0b, 0x7d4: 0x0b, 0x7d5: 0x0b, 0x7d6: 0x0b, 0x7d7: 0x0b, + 0x7d8: 0x0b, 0x7d9: 0x0b, 0x7da: 0x0b, 0x7db: 0x0b, 0x7dc: 0x0b, 0x7dd: 0x0b, 0x7de: 0x0b, 0x7df: 0x0b, + 0x7e0: 0x0b, 0x7e1: 0x0b, 0x7e2: 0x0b, 0x7e3: 0x0b, 0x7e4: 0x0b, 0x7e5: 0x0b, 0x7e6: 0x0b, 0x7e7: 0x0b, + 0x7e8: 0x0b, 0x7e9: 0x0b, 0x7ea: 0x0b, 0x7eb: 0x0b, 0x7ec: 0x0b, 0x7ed: 0x0b, 0x7ee: 0x0b, 0x7ef: 0x0b, + 0x7f0: 0x0b, 0x7f1: 0x0b, 0x7f2: 0x0b, 0x7f3: 0x0b, 0x7f4: 0x0b, 0x7f5: 0x0b, 0x7f6: 0x0b, 0x7f7: 0x0b, + 0x7f8: 0x0b, 0x7f9: 0x0b, 0x7fa: 0x0b, 0x7fb: 0x0b, 0x7fc: 0x0b, 0x7fd: 0x0b, 0x7fe: 0x0b, 0x7ff: 0x0b, + // Block 0x20, offset 0x800 + 0x800: 0x177, 0x801: 0x178, 0x802: 0xb8, 0x803: 0xb8, 0x804: 0x179, 0x805: 0x179, 0x806: 0x179, 0x807: 0x17a, + 0x808: 0xb8, 0x809: 0xb8, 0x80a: 0xb8, 0x80b: 0xb8, 0x80c: 0xb8, 0x80d: 0xb8, 0x80e: 0xb8, 0x80f: 0xb8, + 0x810: 0xb8, 0x811: 0xb8, 0x812: 0xb8, 0x813: 0xb8, 0x814: 0xb8, 0x815: 0xb8, 0x816: 0xb8, 0x817: 0xb8, + 0x818: 0xb8, 0x819: 0xb8, 0x81a: 0xb8, 0x81b: 0xb8, 0x81c: 0xb8, 0x81d: 0xb8, 0x81e: 0xb8, 0x81f: 0xb8, + 0x820: 0xb8, 0x821: 0xb8, 0x822: 0xb8, 0x823: 0xb8, 0x824: 0xb8, 0x825: 0xb8, 0x826: 0xb8, 0x827: 0xb8, + 0x828: 0xb8, 0x829: 0xb8, 0x82a: 0xb8, 0x82b: 0xb8, 0x82c: 0xb8, 0x82d: 0xb8, 0x82e: 0xb8, 0x82f: 0xb8, + 0x830: 0xb8, 0x831: 0xb8, 0x832: 0xb8, 0x833: 0xb8, 0x834: 0xb8, 0x835: 0xb8, 0x836: 0xb8, 0x837: 0xb8, + 0x838: 0xb8, 0x839: 0xb8, 0x83a: 0xb8, 0x83b: 0xb8, 0x83c: 0xb8, 0x83d: 0xb8, 0x83e: 0xb8, 0x83f: 0xb8, + // Block 0x21, offset 0x840 + 0x840: 0x0b, 0x841: 0x0b, 0x842: 0x0b, 0x843: 0x0b, 0x844: 0x0b, 0x845: 0x0b, 0x846: 0x0b, 0x847: 0x0b, + 0x848: 0x0b, 0x849: 0x0b, 0x84a: 0x0b, 0x84b: 0x0b, 0x84c: 0x0b, 0x84d: 0x0b, 0x84e: 0x0b, 0x84f: 0x0b, + 0x850: 0x0b, 0x851: 0x0b, 0x852: 0x0b, 0x853: 0x0b, 0x854: 0x0b, 0x855: 0x0b, 0x856: 0x0b, 0x857: 0x0b, + 0x858: 0x0b, 0x859: 0x0b, 0x85a: 0x0b, 0x85b: 0x0b, 0x85c: 0x0b, 0x85d: 0x0b, 0x85e: 0x0b, 0x85f: 0x0b, + 0x860: 0x1e, 0x861: 0x0b, 0x862: 0x0b, 0x863: 0x0b, 0x864: 0x0b, 0x865: 0x0b, 0x866: 0x0b, 0x867: 0x0b, + 0x868: 0x0b, 0x869: 0x0b, 0x86a: 0x0b, 0x86b: 0x0b, 0x86c: 0x0b, 0x86d: 0x0b, 0x86e: 0x0b, 0x86f: 0x0b, + 0x870: 0x0b, 0x871: 0x0b, 0x872: 0x0b, 0x873: 0x0b, 0x874: 0x0b, 0x875: 0x0b, 0x876: 0x0b, 0x877: 0x0b, + 0x878: 0x0b, 0x879: 0x0b, 0x87a: 0x0b, 0x87b: 0x0b, 0x87c: 0x0b, 0x87d: 0x0b, 0x87e: 0x0b, 0x87f: 0x0b, + // Block 0x22, offset 0x880 + 0x880: 0x0b, 0x881: 0x0b, 0x882: 0x0b, 0x883: 0x0b, 0x884: 0x0b, 0x885: 0x0b, 0x886: 0x0b, 0x887: 0x0b, + 0x888: 0x0b, 0x889: 0x0b, 0x88a: 0x0b, 0x88b: 0x0b, 0x88c: 0x0b, 0x88d: 0x0b, 0x88e: 0x0b, 0x88f: 0x0b, +} + +// idnaSparseOffset: 256 entries, 512 bytes +var idnaSparseOffset = []uint16{0x0, 0x8, 0x19, 0x25, 0x27, 0x2c, 0x34, 0x3f, 0x4b, 0x5c, 0x60, 0x6f, 0x74, 0x7b, 0x87, 0x95, 0xa3, 0xa8, 0xb1, 0xc1, 0xcf, 0xdc, 0xe8, 0xf9, 0x103, 0x10a, 0x117, 0x128, 0x12f, 0x13a, 0x149, 0x157, 0x161, 0x163, 0x167, 0x169, 0x175, 0x180, 0x188, 0x18e, 0x194, 0x199, 0x19e, 0x1a1, 0x1a5, 0x1ab, 0x1b0, 0x1bc, 0x1c6, 0x1cc, 0x1dd, 0x1e7, 0x1ea, 0x1f2, 0x1f5, 0x202, 0x20a, 0x20e, 0x215, 0x21d, 0x22d, 0x239, 0x23b, 0x245, 0x251, 0x25d, 0x269, 0x271, 0x276, 0x280, 0x291, 0x295, 0x2a0, 0x2a4, 0x2ad, 0x2b5, 0x2bb, 0x2c0, 0x2c3, 0x2c6, 0x2ca, 0x2d0, 0x2d4, 0x2d8, 0x2de, 0x2e5, 0x2eb, 0x2f3, 0x2fa, 0x305, 0x30f, 0x313, 0x316, 0x31c, 0x320, 0x322, 0x325, 0x327, 0x32a, 0x334, 0x337, 0x346, 0x34a, 0x34f, 0x352, 0x356, 0x35b, 0x360, 0x366, 0x36c, 0x37b, 0x381, 0x385, 0x394, 0x399, 0x3a1, 0x3ab, 0x3b6, 0x3be, 0x3cf, 0x3d8, 0x3e8, 0x3f5, 0x3ff, 0x404, 0x411, 0x415, 0x41a, 0x41c, 0x420, 0x422, 0x426, 0x42f, 0x435, 0x439, 0x449, 0x453, 0x458, 0x45b, 0x461, 0x468, 0x46d, 0x471, 0x477, 0x47c, 0x485, 0x48a, 0x490, 0x497, 0x49e, 0x4a5, 0x4a9, 0x4ae, 0x4b1, 0x4b6, 0x4c2, 0x4c8, 0x4cd, 0x4d4, 0x4dc, 0x4e1, 0x4e5, 0x4f5, 0x4fc, 0x500, 0x504, 0x50b, 0x50e, 0x511, 0x515, 0x519, 0x51f, 0x528, 0x534, 0x53b, 0x544, 0x54c, 0x553, 0x561, 0x56e, 0x57b, 0x584, 0x588, 0x596, 0x59e, 0x5a9, 0x5b2, 0x5b8, 0x5c0, 0x5c9, 0x5d3, 0x5d6, 0x5e2, 0x5e5, 0x5ea, 0x5ed, 0x5f7, 0x600, 0x60c, 0x60f, 0x614, 0x617, 0x61a, 0x61d, 0x624, 0x62b, 0x62f, 0x63a, 0x63d, 0x643, 0x648, 0x64c, 0x64f, 0x652, 0x655, 0x65a, 0x664, 0x667, 0x66b, 0x67a, 0x686, 0x68a, 0x68f, 0x694, 0x698, 0x69d, 0x6a6, 0x6b1, 0x6b7, 0x6bf, 0x6c3, 0x6c7, 0x6cd, 0x6d3, 0x6d8, 0x6db, 0x6e9, 0x6f0, 0x6f3, 0x6f6, 0x6fa, 0x700, 0x705, 0x70f, 0x714, 0x717, 0x71a, 0x71d, 0x720, 0x724, 0x727, 0x737, 0x748, 0x74d, 0x74f, 0x751} + +// idnaSparseValues: 1876 entries, 7504 bytes +var idnaSparseValues = [1876]valueRange{ + // Block 0x0, offset 0x0 + {value: 0x0000, lo: 0x07}, + {value: 0xe105, lo: 0x80, hi: 0x96}, + {value: 0x0018, lo: 0x97, hi: 0x97}, + {value: 0xe105, lo: 0x98, hi: 0x9e}, + {value: 0x001f, lo: 0x9f, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xb7}, + {value: 0x0008, lo: 0xb8, hi: 0xbf}, + // Block 0x1, offset 0x8 + {value: 0x0000, lo: 0x10}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0xe01d, lo: 0x81, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0x82}, + {value: 0x0335, lo: 0x83, hi: 0x83}, + {value: 0x034d, lo: 0x84, hi: 0x84}, + {value: 0x0365, lo: 0x85, hi: 0x85}, + {value: 0xe00d, lo: 0x86, hi: 0x86}, + {value: 0x0008, lo: 0x87, hi: 0x87}, + {value: 0xe00d, lo: 0x88, hi: 0x88}, + {value: 0x0008, lo: 0x89, hi: 0x89}, + {value: 0xe00d, lo: 0x8a, hi: 0x8a}, + {value: 0x0008, lo: 0x8b, hi: 0x8b}, + {value: 0xe00d, lo: 0x8c, hi: 0x8c}, + {value: 0x0008, lo: 0x8d, hi: 0x8d}, + {value: 0xe00d, lo: 0x8e, hi: 0x8e}, + {value: 0x0008, lo: 0x8f, hi: 0xbf}, + // Block 0x2, offset 0x19 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x0249, lo: 0xb0, hi: 0xb0}, + {value: 0x037d, lo: 0xb1, hi: 0xb1}, + {value: 0x0259, lo: 0xb2, hi: 0xb2}, + {value: 0x0269, lo: 0xb3, hi: 0xb3}, + {value: 0x034d, lo: 0xb4, hi: 0xb4}, + {value: 0x0395, lo: 0xb5, hi: 0xb5}, + {value: 0xe1bd, lo: 0xb6, hi: 0xb6}, + {value: 0x0279, lo: 0xb7, hi: 0xb7}, + {value: 0x0289, lo: 0xb8, hi: 0xb8}, + {value: 0x0008, lo: 0xb9, hi: 0xbf}, + // Block 0x3, offset 0x25 + {value: 0x0000, lo: 0x01}, + {value: 0x1308, lo: 0x80, hi: 0xbf}, + // Block 0x4, offset 0x27 + {value: 0x0000, lo: 0x04}, + {value: 0x03f5, lo: 0x80, hi: 0x8f}, + {value: 0xe105, lo: 0x90, hi: 0x9f}, + {value: 0x049d, lo: 0xa0, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x5, offset 0x2c + {value: 0x0000, lo: 0x07}, + {value: 0xe185, lo: 0x80, hi: 0x8f}, + {value: 0x0545, lo: 0x90, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x98}, + {value: 0x0008, lo: 0x99, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xa0}, + {value: 0x0008, lo: 0xa1, hi: 0xbf}, + // Block 0x6, offset 0x34 + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0401, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x88}, + {value: 0x0018, lo: 0x89, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x90}, + {value: 0x1308, lo: 0x91, hi: 0xbd}, + {value: 0x0018, lo: 0xbe, hi: 0xbe}, + {value: 0x1308, lo: 0xbf, hi: 0xbf}, + // Block 0x7, offset 0x3f + {value: 0x0000, lo: 0x0b}, + {value: 0x0018, lo: 0x80, hi: 0x80}, + {value: 0x1308, lo: 0x81, hi: 0x82}, + {value: 0x0018, lo: 0x83, hi: 0x83}, + {value: 0x1308, lo: 0x84, hi: 0x85}, + {value: 0x0018, lo: 0x86, hi: 0x86}, + {value: 0x1308, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0x8, offset 0x4b + {value: 0x0000, lo: 0x10}, + {value: 0x0018, lo: 0x80, hi: 0x80}, + {value: 0x0208, lo: 0x81, hi: 0x87}, + {value: 0x0408, lo: 0x88, hi: 0x88}, + {value: 0x0208, lo: 0x89, hi: 0x8a}, + {value: 0x1308, lo: 0x8b, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa9}, + {value: 0x0018, lo: 0xaa, hi: 0xad}, + {value: 0x0208, lo: 0xae, hi: 0xaf}, + {value: 0x1308, lo: 0xb0, hi: 0xb0}, + {value: 0x0408, lo: 0xb1, hi: 0xb3}, + {value: 0x0008, lo: 0xb4, hi: 0xb4}, + {value: 0x0429, lo: 0xb5, hi: 0xb5}, + {value: 0x0451, lo: 0xb6, hi: 0xb6}, + {value: 0x0479, lo: 0xb7, hi: 0xb7}, + {value: 0x04a1, lo: 0xb8, hi: 0xb8}, + {value: 0x0208, lo: 0xb9, hi: 0xbf}, + // Block 0x9, offset 0x5c + {value: 0x0000, lo: 0x03}, + {value: 0x0208, lo: 0x80, hi: 0x87}, + {value: 0x0408, lo: 0x88, hi: 0x99}, + {value: 0x0208, lo: 0x9a, hi: 0xbf}, + // Block 0xa, offset 0x60 + {value: 0x0000, lo: 0x0e}, + {value: 0x1308, lo: 0x80, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8c}, + {value: 0x0408, lo: 0x8d, hi: 0x8d}, + {value: 0x0208, lo: 0x8e, hi: 0x98}, + {value: 0x0408, lo: 0x99, hi: 0x9b}, + {value: 0x0208, lo: 0x9c, hi: 0xaa}, + {value: 0x0408, lo: 0xab, hi: 0xac}, + {value: 0x0208, lo: 0xad, hi: 0xb0}, + {value: 0x0408, lo: 0xb1, hi: 0xb1}, + {value: 0x0208, lo: 0xb2, hi: 0xb2}, + {value: 0x0408, lo: 0xb3, hi: 0xb4}, + {value: 0x0208, lo: 0xb5, hi: 0xb7}, + {value: 0x0408, lo: 0xb8, hi: 0xb9}, + {value: 0x0208, lo: 0xba, hi: 0xbf}, + // Block 0xb, offset 0x6f + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xa5}, + {value: 0x1308, lo: 0xa6, hi: 0xb0}, + {value: 0x0008, lo: 0xb1, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xbf}, + // Block 0xc, offset 0x74 + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0208, lo: 0x8a, hi: 0xaa}, + {value: 0x1308, lo: 0xab, hi: 0xb3}, + {value: 0x0008, lo: 0xb4, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbf}, + // Block 0xd, offset 0x7b + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x95}, + {value: 0x1308, lo: 0x96, hi: 0x99}, + {value: 0x0008, lo: 0x9a, hi: 0x9a}, + {value: 0x1308, lo: 0x9b, hi: 0xa3}, + {value: 0x0008, lo: 0xa4, hi: 0xa4}, + {value: 0x1308, lo: 0xa5, hi: 0xa7}, + {value: 0x0008, lo: 0xa8, hi: 0xa8}, + {value: 0x1308, lo: 0xa9, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xe, offset 0x87 + {value: 0x0000, lo: 0x0d}, + {value: 0x0408, lo: 0x80, hi: 0x80}, + {value: 0x0208, lo: 0x81, hi: 0x85}, + {value: 0x0408, lo: 0x86, hi: 0x87}, + {value: 0x0208, lo: 0x88, hi: 0x88}, + {value: 0x0408, lo: 0x89, hi: 0x89}, + {value: 0x0208, lo: 0x8a, hi: 0x93}, + {value: 0x0408, lo: 0x94, hi: 0x94}, + {value: 0x0208, lo: 0x95, hi: 0x95}, + {value: 0x0008, lo: 0x96, hi: 0x98}, + {value: 0x1308, lo: 0x99, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0xbf}, + // Block 0xf, offset 0x95 + {value: 0x0000, lo: 0x0d}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0208, lo: 0xa0, hi: 0xa9}, + {value: 0x0408, lo: 0xaa, hi: 0xac}, + {value: 0x0008, lo: 0xad, hi: 0xad}, + {value: 0x0408, lo: 0xae, hi: 0xae}, + {value: 0x0208, lo: 0xaf, hi: 0xb0}, + {value: 0x0408, lo: 0xb1, hi: 0xb2}, + {value: 0x0208, lo: 0xb3, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xb5}, + {value: 0x0208, lo: 0xb6, hi: 0xb8}, + {value: 0x0408, lo: 0xb9, hi: 0xb9}, + {value: 0x0208, lo: 0xba, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0x10, offset 0xa3 + {value: 0x0000, lo: 0x04}, + {value: 0x0040, lo: 0x80, hi: 0x93}, + {value: 0x1308, lo: 0x94, hi: 0xa1}, + {value: 0x0040, lo: 0xa2, hi: 0xa2}, + {value: 0x1308, lo: 0xa3, hi: 0xbf}, + // Block 0x11, offset 0xa8 + {value: 0x0000, lo: 0x08}, + {value: 0x1308, lo: 0x80, hi: 0x82}, + {value: 0x1008, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0xb9}, + {value: 0x1308, lo: 0xba, hi: 0xba}, + {value: 0x1008, lo: 0xbb, hi: 0xbb}, + {value: 0x1308, lo: 0xbc, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x1008, lo: 0xbe, hi: 0xbf}, + // Block 0x12, offset 0xb1 + {value: 0x0000, lo: 0x0f}, + {value: 0x1308, lo: 0x80, hi: 0x80}, + {value: 0x1008, lo: 0x81, hi: 0x82}, + {value: 0x0040, lo: 0x83, hi: 0x85}, + {value: 0x1008, lo: 0x86, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x1008, lo: 0x8a, hi: 0x8c}, + {value: 0x1b08, lo: 0x8d, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x96}, + {value: 0x1008, lo: 0x97, hi: 0x97}, + {value: 0x0040, lo: 0x98, hi: 0xa5}, + {value: 0x0008, lo: 0xa6, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbf}, + // Block 0x13, offset 0xc1 + {value: 0x0000, lo: 0x0d}, + {value: 0x1308, lo: 0x80, hi: 0x80}, + {value: 0x1008, lo: 0x81, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8d}, + {value: 0x0008, lo: 0x8e, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x91}, + {value: 0x0008, lo: 0x92, hi: 0xa8}, + {value: 0x0040, lo: 0xa9, hi: 0xa9}, + {value: 0x0008, lo: 0xaa, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x1308, lo: 0xbe, hi: 0xbf}, + // Block 0x14, offset 0xcf + {value: 0x0000, lo: 0x0c}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x1308, lo: 0x81, hi: 0x81}, + {value: 0x1008, lo: 0x82, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8d}, + {value: 0x0008, lo: 0x8e, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x91}, + {value: 0x0008, lo: 0x92, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x1008, lo: 0xbe, hi: 0xbf}, + // Block 0x15, offset 0xdc + {value: 0x0000, lo: 0x0b}, + {value: 0x0040, lo: 0x80, hi: 0x81}, + {value: 0x1008, lo: 0x82, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x99}, + {value: 0x0008, lo: 0x9a, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xb2}, + {value: 0x0008, lo: 0xb3, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0x16, offset 0xe8 + {value: 0x0000, lo: 0x10}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x89}, + {value: 0x1b08, lo: 0x8a, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8e}, + {value: 0x1008, lo: 0x8f, hi: 0x91}, + {value: 0x1308, lo: 0x92, hi: 0x94}, + {value: 0x0040, lo: 0x95, hi: 0x95}, + {value: 0x1308, lo: 0x96, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x97}, + {value: 0x1008, lo: 0x98, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xa5}, + {value: 0x0008, lo: 0xa6, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xb1}, + {value: 0x1008, lo: 0xb2, hi: 0xb3}, + {value: 0x0018, lo: 0xb4, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0x17, offset 0xf9 + {value: 0x0000, lo: 0x09}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0xb0}, + {value: 0x1308, lo: 0xb1, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xb2}, + {value: 0x08f1, lo: 0xb3, hi: 0xb3}, + {value: 0x1308, lo: 0xb4, hi: 0xb9}, + {value: 0x1b08, lo: 0xba, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbe}, + {value: 0x0018, lo: 0xbf, hi: 0xbf}, + // Block 0x18, offset 0x103 + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x1308, lo: 0x87, hi: 0x8e}, + {value: 0x0018, lo: 0x8f, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0xbf}, + // Block 0x19, offset 0x10a + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x84}, + {value: 0x0040, lo: 0x85, hi: 0x85}, + {value: 0x0008, lo: 0x86, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x87}, + {value: 0x1308, lo: 0x88, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9b}, + {value: 0x0961, lo: 0x9c, hi: 0x9c}, + {value: 0x0999, lo: 0x9d, hi: 0x9d}, + {value: 0x0008, lo: 0x9e, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0x1a, offset 0x117 + {value: 0x0000, lo: 0x10}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x8a}, + {value: 0x0008, lo: 0x8b, hi: 0x8b}, + {value: 0xe03d, lo: 0x8c, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0x97}, + {value: 0x1308, lo: 0x98, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa9}, + {value: 0x0018, lo: 0xaa, hi: 0xb4}, + {value: 0x1308, lo: 0xb5, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xb6}, + {value: 0x1308, lo: 0xb7, hi: 0xb7}, + {value: 0x0018, lo: 0xb8, hi: 0xb8}, + {value: 0x1308, lo: 0xb9, hi: 0xb9}, + {value: 0x0018, lo: 0xba, hi: 0xbd}, + {value: 0x1008, lo: 0xbe, hi: 0xbf}, + // Block 0x1b, offset 0x128 + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x85}, + {value: 0x1308, lo: 0x86, hi: 0x86}, + {value: 0x0018, lo: 0x87, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8d}, + {value: 0x0018, lo: 0x8e, hi: 0x9a}, + {value: 0x0040, lo: 0x9b, hi: 0xbf}, + // Block 0x1c, offset 0x12f + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0xaa}, + {value: 0x1008, lo: 0xab, hi: 0xac}, + {value: 0x1308, lo: 0xad, hi: 0xb0}, + {value: 0x1008, lo: 0xb1, hi: 0xb1}, + {value: 0x1308, lo: 0xb2, hi: 0xb7}, + {value: 0x1008, lo: 0xb8, hi: 0xb8}, + {value: 0x1b08, lo: 0xb9, hi: 0xba}, + {value: 0x1008, lo: 0xbb, hi: 0xbc}, + {value: 0x1308, lo: 0xbd, hi: 0xbe}, + {value: 0x0008, lo: 0xbf, hi: 0xbf}, + // Block 0x1d, offset 0x13a + {value: 0x0000, lo: 0x0e}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0018, lo: 0x8a, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x95}, + {value: 0x1008, lo: 0x96, hi: 0x97}, + {value: 0x1308, lo: 0x98, hi: 0x99}, + {value: 0x0008, lo: 0x9a, hi: 0x9d}, + {value: 0x1308, lo: 0x9e, hi: 0xa0}, + {value: 0x0008, lo: 0xa1, hi: 0xa1}, + {value: 0x1008, lo: 0xa2, hi: 0xa4}, + {value: 0x0008, lo: 0xa5, hi: 0xa6}, + {value: 0x1008, lo: 0xa7, hi: 0xad}, + {value: 0x0008, lo: 0xae, hi: 0xb0}, + {value: 0x1308, lo: 0xb1, hi: 0xb4}, + {value: 0x0008, lo: 0xb5, hi: 0xbf}, + // Block 0x1e, offset 0x149 + {value: 0x0000, lo: 0x0d}, + {value: 0x0008, lo: 0x80, hi: 0x81}, + {value: 0x1308, lo: 0x82, hi: 0x82}, + {value: 0x1008, lo: 0x83, hi: 0x84}, + {value: 0x1308, lo: 0x85, hi: 0x86}, + {value: 0x1008, lo: 0x87, hi: 0x8c}, + {value: 0x1308, lo: 0x8d, hi: 0x8d}, + {value: 0x0008, lo: 0x8e, hi: 0x8e}, + {value: 0x1008, lo: 0x8f, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x1008, lo: 0x9a, hi: 0x9c}, + {value: 0x1308, lo: 0x9d, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0x1f, offset 0x157 + {value: 0x0000, lo: 0x09}, + {value: 0x0040, lo: 0x80, hi: 0x86}, + {value: 0x055d, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8c}, + {value: 0x055d, lo: 0x8d, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xba}, + {value: 0x0018, lo: 0xbb, hi: 0xbb}, + {value: 0xe105, lo: 0xbc, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbf}, + // Block 0x20, offset 0x161 + {value: 0x0000, lo: 0x01}, + {value: 0x0018, lo: 0x80, hi: 0xbf}, + // Block 0x21, offset 0x163 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0xa0}, + {value: 0x0018, lo: 0xa1, hi: 0xbf}, + // Block 0x22, offset 0x167 + {value: 0x0000, lo: 0x01}, + {value: 0x0008, lo: 0x80, hi: 0xbf}, + // Block 0x23, offset 0x169 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0008, lo: 0x8a, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0x98}, + {value: 0x0040, lo: 0x99, hi: 0x99}, + {value: 0x0008, lo: 0x9a, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x24, offset 0x175 + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0008, lo: 0x8a, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb7}, + {value: 0x0008, lo: 0xb8, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x25, offset 0x180 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x0040, lo: 0x81, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0xbf}, + // Block 0x26, offset 0x188 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x91}, + {value: 0x0008, lo: 0x92, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0xbf}, + // Block 0x27, offset 0x18e + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x9a}, + {value: 0x0040, lo: 0x9b, hi: 0x9c}, + {value: 0x1308, lo: 0x9d, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbf}, + // Block 0x28, offset 0x194 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x29, offset 0x199 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb7}, + {value: 0xe045, lo: 0xb8, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0x2a, offset 0x19e + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0xbf}, + // Block 0x2b, offset 0x1a1 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xac}, + {value: 0x0018, lo: 0xad, hi: 0xae}, + {value: 0x0008, lo: 0xaf, hi: 0xbf}, + // Block 0x2c, offset 0x1a5 + {value: 0x0000, lo: 0x05}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9c}, + {value: 0x0040, lo: 0x9d, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x2d, offset 0x1ab + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xaa}, + {value: 0x0018, lo: 0xab, hi: 0xb0}, + {value: 0x0008, lo: 0xb1, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbf}, + // Block 0x2e, offset 0x1b0 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8d}, + {value: 0x0008, lo: 0x8e, hi: 0x91}, + {value: 0x1308, lo: 0x92, hi: 0x93}, + {value: 0x1b08, lo: 0x94, hi: 0x94}, + {value: 0x0040, lo: 0x95, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xb1}, + {value: 0x1308, lo: 0xb2, hi: 0xb3}, + {value: 0x1b08, lo: 0xb4, hi: 0xb4}, + {value: 0x0018, lo: 0xb5, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0x2f, offset 0x1bc + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x91}, + {value: 0x1308, lo: 0x92, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xad}, + {value: 0x0008, lo: 0xae, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xb1}, + {value: 0x1308, lo: 0xb2, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xbf}, + // Block 0x30, offset 0x1c6 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0xb3}, + {value: 0x1340, lo: 0xb4, hi: 0xb5}, + {value: 0x1008, lo: 0xb6, hi: 0xb6}, + {value: 0x1308, lo: 0xb7, hi: 0xbd}, + {value: 0x1008, lo: 0xbe, hi: 0xbf}, + // Block 0x31, offset 0x1cc + {value: 0x0000, lo: 0x10}, + {value: 0x1008, lo: 0x80, hi: 0x85}, + {value: 0x1308, lo: 0x86, hi: 0x86}, + {value: 0x1008, lo: 0x87, hi: 0x88}, + {value: 0x1308, lo: 0x89, hi: 0x91}, + {value: 0x1b08, lo: 0x92, hi: 0x92}, + {value: 0x1308, lo: 0x93, hi: 0x93}, + {value: 0x0018, lo: 0x94, hi: 0x96}, + {value: 0x0008, lo: 0x97, hi: 0x97}, + {value: 0x0018, lo: 0x98, hi: 0x9b}, + {value: 0x0008, lo: 0x9c, hi: 0x9c}, + {value: 0x1308, lo: 0x9d, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa9}, + {value: 0x0040, lo: 0xaa, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0x32, offset 0x1dd + {value: 0x0000, lo: 0x09}, + {value: 0x0018, lo: 0x80, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x86}, + {value: 0x0218, lo: 0x87, hi: 0x87}, + {value: 0x0018, lo: 0x88, hi: 0x8a}, + {value: 0x13c0, lo: 0x8b, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0208, lo: 0xa0, hi: 0xbf}, + // Block 0x33, offset 0x1e7 + {value: 0x0000, lo: 0x02}, + {value: 0x0208, lo: 0x80, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbf}, + // Block 0x34, offset 0x1ea + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0x84}, + {value: 0x1308, lo: 0x85, hi: 0x86}, + {value: 0x0208, lo: 0x87, hi: 0xa8}, + {value: 0x1308, lo: 0xa9, hi: 0xa9}, + {value: 0x0208, lo: 0xaa, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x35, offset 0x1f2 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xbf}, + // Block 0x36, offset 0x1f5 + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x1308, lo: 0xa0, hi: 0xa2}, + {value: 0x1008, lo: 0xa3, hi: 0xa6}, + {value: 0x1308, lo: 0xa7, hi: 0xa8}, + {value: 0x1008, lo: 0xa9, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x1008, lo: 0xb0, hi: 0xb1}, + {value: 0x1308, lo: 0xb2, hi: 0xb2}, + {value: 0x1008, lo: 0xb3, hi: 0xb8}, + {value: 0x1308, lo: 0xb9, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0x37, offset 0x202 + {value: 0x0000, lo: 0x07}, + {value: 0x0018, lo: 0x80, hi: 0x80}, + {value: 0x0040, lo: 0x81, hi: 0x83}, + {value: 0x0018, lo: 0x84, hi: 0x85}, + {value: 0x0008, lo: 0x86, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0x38, offset 0x20a + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x39, offset 0x20e + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0028, lo: 0x9a, hi: 0x9a}, + {value: 0x0040, lo: 0x9b, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0xbf}, + // Block 0x3a, offset 0x215 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0x96}, + {value: 0x1308, lo: 0x97, hi: 0x98}, + {value: 0x1008, lo: 0x99, hi: 0x9a}, + {value: 0x1308, lo: 0x9b, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x3b, offset 0x21d + {value: 0x0000, lo: 0x0f}, + {value: 0x0008, lo: 0x80, hi: 0x94}, + {value: 0x1008, lo: 0x95, hi: 0x95}, + {value: 0x1308, lo: 0x96, hi: 0x96}, + {value: 0x1008, lo: 0x97, hi: 0x97}, + {value: 0x1308, lo: 0x98, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x1b08, lo: 0xa0, hi: 0xa0}, + {value: 0x1008, lo: 0xa1, hi: 0xa1}, + {value: 0x1308, lo: 0xa2, hi: 0xa2}, + {value: 0x1008, lo: 0xa3, hi: 0xa4}, + {value: 0x1308, lo: 0xa5, hi: 0xac}, + {value: 0x1008, lo: 0xad, hi: 0xb2}, + {value: 0x1308, lo: 0xb3, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbe}, + {value: 0x1308, lo: 0xbf, hi: 0xbf}, + // Block 0x3c, offset 0x22d + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa6}, + {value: 0x0008, lo: 0xa7, hi: 0xa7}, + {value: 0x0018, lo: 0xa8, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x1308, lo: 0xb0, hi: 0xbd}, + {value: 0x1318, lo: 0xbe, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x3d, offset 0x239 + {value: 0x0000, lo: 0x01}, + {value: 0x0040, lo: 0x80, hi: 0xbf}, + // Block 0x3e, offset 0x23b + {value: 0x0000, lo: 0x09}, + {value: 0x1308, lo: 0x80, hi: 0x83}, + {value: 0x1008, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0xb3}, + {value: 0x1308, lo: 0xb4, hi: 0xb4}, + {value: 0x1008, lo: 0xb5, hi: 0xb5}, + {value: 0x1308, lo: 0xb6, hi: 0xba}, + {value: 0x1008, lo: 0xbb, hi: 0xbb}, + {value: 0x1308, lo: 0xbc, hi: 0xbc}, + {value: 0x1008, lo: 0xbd, hi: 0xbf}, + // Block 0x3f, offset 0x245 + {value: 0x0000, lo: 0x0b}, + {value: 0x1008, lo: 0x80, hi: 0x81}, + {value: 0x1308, lo: 0x82, hi: 0x82}, + {value: 0x1008, lo: 0x83, hi: 0x83}, + {value: 0x1808, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0xaa}, + {value: 0x1308, lo: 0xab, hi: 0xb3}, + {value: 0x0018, lo: 0xb4, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbf}, + // Block 0x40, offset 0x251 + {value: 0x0000, lo: 0x0b}, + {value: 0x1308, lo: 0x80, hi: 0x81}, + {value: 0x1008, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xa0}, + {value: 0x1008, lo: 0xa1, hi: 0xa1}, + {value: 0x1308, lo: 0xa2, hi: 0xa5}, + {value: 0x1008, lo: 0xa6, hi: 0xa7}, + {value: 0x1308, lo: 0xa8, hi: 0xa9}, + {value: 0x1808, lo: 0xaa, hi: 0xaa}, + {value: 0x1b08, lo: 0xab, hi: 0xab}, + {value: 0x1308, lo: 0xac, hi: 0xad}, + {value: 0x0008, lo: 0xae, hi: 0xbf}, + // Block 0x41, offset 0x25d + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0xa5}, + {value: 0x1308, lo: 0xa6, hi: 0xa6}, + {value: 0x1008, lo: 0xa7, hi: 0xa7}, + {value: 0x1308, lo: 0xa8, hi: 0xa9}, + {value: 0x1008, lo: 0xaa, hi: 0xac}, + {value: 0x1308, lo: 0xad, hi: 0xad}, + {value: 0x1008, lo: 0xae, hi: 0xae}, + {value: 0x1308, lo: 0xaf, hi: 0xb1}, + {value: 0x1808, lo: 0xb2, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xbb}, + {value: 0x0018, lo: 0xbc, hi: 0xbf}, + // Block 0x42, offset 0x269 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xa3}, + {value: 0x1008, lo: 0xa4, hi: 0xab}, + {value: 0x1308, lo: 0xac, hi: 0xb3}, + {value: 0x1008, lo: 0xb4, hi: 0xb5}, + {value: 0x1308, lo: 0xb6, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xba}, + {value: 0x0018, lo: 0xbb, hi: 0xbf}, + // Block 0x43, offset 0x271 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0x8c}, + {value: 0x0008, lo: 0x8d, hi: 0xbd}, + {value: 0x0018, lo: 0xbe, hi: 0xbf}, + // Block 0x44, offset 0x276 + {value: 0x0000, lo: 0x09}, + {value: 0x0e29, lo: 0x80, hi: 0x80}, + {value: 0x0e41, lo: 0x81, hi: 0x81}, + {value: 0x0e59, lo: 0x82, hi: 0x82}, + {value: 0x0e71, lo: 0x83, hi: 0x83}, + {value: 0x0e89, lo: 0x84, hi: 0x85}, + {value: 0x0ea1, lo: 0x86, hi: 0x86}, + {value: 0x0eb9, lo: 0x87, hi: 0x87}, + {value: 0x057d, lo: 0x88, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0xbf}, + // Block 0x45, offset 0x280 + {value: 0x0000, lo: 0x10}, + {value: 0x0018, lo: 0x80, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x1308, lo: 0x90, hi: 0x92}, + {value: 0x0018, lo: 0x93, hi: 0x93}, + {value: 0x1308, lo: 0x94, hi: 0xa0}, + {value: 0x1008, lo: 0xa1, hi: 0xa1}, + {value: 0x1308, lo: 0xa2, hi: 0xa8}, + {value: 0x0008, lo: 0xa9, hi: 0xac}, + {value: 0x1308, lo: 0xad, hi: 0xad}, + {value: 0x0008, lo: 0xae, hi: 0xb1}, + {value: 0x1008, lo: 0xb2, hi: 0xb3}, + {value: 0x1308, lo: 0xb4, hi: 0xb4}, + {value: 0x0008, lo: 0xb5, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xb7}, + {value: 0x1308, lo: 0xb8, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0x46, offset 0x291 + {value: 0x0000, lo: 0x03}, + {value: 0x1308, lo: 0x80, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xba}, + {value: 0x1308, lo: 0xbb, hi: 0xbf}, + // Block 0x47, offset 0x295 + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x87}, + {value: 0xe045, lo: 0x88, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x97}, + {value: 0xe045, lo: 0x98, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa7}, + {value: 0xe045, lo: 0xa8, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb7}, + {value: 0xe045, lo: 0xb8, hi: 0xbf}, + // Block 0x48, offset 0x2a0 + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0x8f}, + {value: 0x1318, lo: 0x90, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xbf}, + // Block 0x49, offset 0x2a4 + {value: 0x0000, lo: 0x08}, + {value: 0x0018, lo: 0x80, hi: 0x82}, + {value: 0x0040, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x84}, + {value: 0x0018, lo: 0x85, hi: 0x88}, + {value: 0x24c1, lo: 0x89, hi: 0x89}, + {value: 0x0018, lo: 0x8a, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbf}, + // Block 0x4a, offset 0x2ad + {value: 0x0000, lo: 0x07}, + {value: 0x0018, lo: 0x80, hi: 0xab}, + {value: 0x24f1, lo: 0xac, hi: 0xac}, + {value: 0x2529, lo: 0xad, hi: 0xad}, + {value: 0x0018, lo: 0xae, hi: 0xae}, + {value: 0x2579, lo: 0xaf, hi: 0xaf}, + {value: 0x25b1, lo: 0xb0, hi: 0xb0}, + {value: 0x0018, lo: 0xb1, hi: 0xbf}, + // Block 0x4b, offset 0x2b5 + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x9f}, + {value: 0x0080, lo: 0xa0, hi: 0xa0}, + {value: 0x0018, lo: 0xa1, hi: 0xad}, + {value: 0x0080, lo: 0xae, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbf}, + // Block 0x4c, offset 0x2bb + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0xa8}, + {value: 0x09c5, lo: 0xa9, hi: 0xa9}, + {value: 0x09e5, lo: 0xaa, hi: 0xaa}, + {value: 0x0018, lo: 0xab, hi: 0xbf}, + // Block 0x4d, offset 0x2c0 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x4e, offset 0x2c3 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xbf}, + // Block 0x4f, offset 0x2c6 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x8b}, + {value: 0x28c1, lo: 0x8c, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0xbf}, + // Block 0x50, offset 0x2ca + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0xb3}, + {value: 0x0e66, lo: 0xb4, hi: 0xb4}, + {value: 0x292a, lo: 0xb5, hi: 0xb5}, + {value: 0x0e86, lo: 0xb6, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xbf}, + // Block 0x51, offset 0x2d0 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x9b}, + {value: 0x2941, lo: 0x9c, hi: 0x9c}, + {value: 0x0018, lo: 0x9d, hi: 0xbf}, + // Block 0x52, offset 0x2d4 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xbf}, + // Block 0x53, offset 0x2d8 + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x97}, + {value: 0x0018, lo: 0x98, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbc}, + {value: 0x0018, lo: 0xbd, hi: 0xbf}, + // Block 0x54, offset 0x2de + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0018, lo: 0x8a, hi: 0x91}, + {value: 0x0040, lo: 0x92, hi: 0xab}, + {value: 0x0018, lo: 0xac, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0x55, offset 0x2e5 + {value: 0x0000, lo: 0x05}, + {value: 0xe185, lo: 0x80, hi: 0x8f}, + {value: 0x03f5, lo: 0x90, hi: 0x9f}, + {value: 0x0ea5, lo: 0xa0, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x56, offset 0x2eb + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xa5}, + {value: 0x0040, lo: 0xa6, hi: 0xa6}, + {value: 0x0008, lo: 0xa7, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xac}, + {value: 0x0008, lo: 0xad, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x57, offset 0x2f3 + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xae}, + {value: 0xe075, lo: 0xaf, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xbe}, + {value: 0x1b08, lo: 0xbf, hi: 0xbf}, + // Block 0x58, offset 0x2fa + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xa7}, + {value: 0x0008, lo: 0xa8, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xb7}, + {value: 0x0008, lo: 0xb8, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x59, offset 0x305 + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x8e}, + {value: 0x0040, lo: 0x8f, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x1308, lo: 0xa0, hi: 0xbf}, + // Block 0x5a, offset 0x30f + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xae}, + {value: 0x0008, lo: 0xaf, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbf}, + // Block 0x5b, offset 0x313 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x84}, + {value: 0x0040, lo: 0x85, hi: 0xbf}, + // Block 0x5c, offset 0x316 + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9e}, + {value: 0x0edd, lo: 0x9f, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xbf}, + // Block 0x5d, offset 0x31c + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xb2}, + {value: 0x0efd, lo: 0xb3, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xbf}, + // Block 0x5e, offset 0x320 + {value: 0x0020, lo: 0x01}, + {value: 0x0f1d, lo: 0x80, hi: 0xbf}, + // Block 0x5f, offset 0x322 + {value: 0x0020, lo: 0x02}, + {value: 0x171d, lo: 0x80, hi: 0x8f}, + {value: 0x18fd, lo: 0x90, hi: 0xbf}, + // Block 0x60, offset 0x325 + {value: 0x0020, lo: 0x01}, + {value: 0x1efd, lo: 0x80, hi: 0xbf}, + // Block 0x61, offset 0x327 + {value: 0x0000, lo: 0x02}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0xbf}, + // Block 0x62, offset 0x32a + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x98}, + {value: 0x1308, lo: 0x99, hi: 0x9a}, + {value: 0x29e2, lo: 0x9b, hi: 0x9b}, + {value: 0x2a0a, lo: 0x9c, hi: 0x9c}, + {value: 0x0008, lo: 0x9d, hi: 0x9e}, + {value: 0x2a31, lo: 0x9f, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa0}, + {value: 0x0008, lo: 0xa1, hi: 0xbf}, + // Block 0x63, offset 0x334 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xbe}, + {value: 0x2a69, lo: 0xbf, hi: 0xbf}, + // Block 0x64, offset 0x337 + {value: 0x0000, lo: 0x0e}, + {value: 0x0040, lo: 0x80, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xb0}, + {value: 0x2a1d, lo: 0xb1, hi: 0xb1}, + {value: 0x2a3d, lo: 0xb2, hi: 0xb2}, + {value: 0x2a5d, lo: 0xb3, hi: 0xb3}, + {value: 0x2a7d, lo: 0xb4, hi: 0xb4}, + {value: 0x2a5d, lo: 0xb5, hi: 0xb5}, + {value: 0x2a9d, lo: 0xb6, hi: 0xb6}, + {value: 0x2abd, lo: 0xb7, hi: 0xb7}, + {value: 0x2add, lo: 0xb8, hi: 0xb9}, + {value: 0x2afd, lo: 0xba, hi: 0xbb}, + {value: 0x2b1d, lo: 0xbc, hi: 0xbd}, + {value: 0x2afd, lo: 0xbe, hi: 0xbf}, + // Block 0x65, offset 0x346 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x66, offset 0x34a + {value: 0x0030, lo: 0x04}, + {value: 0x2aa2, lo: 0x80, hi: 0x9d}, + {value: 0x305a, lo: 0x9e, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x30a2, lo: 0xa0, hi: 0xbf}, + // Block 0x67, offset 0x34f + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0xbf}, + // Block 0x68, offset 0x352 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbf}, + // Block 0x69, offset 0x356 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xbd}, + {value: 0x0018, lo: 0xbe, hi: 0xbf}, + // Block 0x6a, offset 0x35b + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xbf}, + // Block 0x6b, offset 0x360 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0xa5}, + {value: 0x0018, lo: 0xa6, hi: 0xaf}, + {value: 0x1308, lo: 0xb0, hi: 0xb1}, + {value: 0x0018, lo: 0xb2, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbf}, + // Block 0x6c, offset 0x366 + {value: 0x0000, lo: 0x05}, + {value: 0x0040, lo: 0x80, hi: 0xb6}, + {value: 0x0008, lo: 0xb7, hi: 0xb7}, + {value: 0x2009, lo: 0xb8, hi: 0xb8}, + {value: 0x6e89, lo: 0xb9, hi: 0xb9}, + {value: 0x0008, lo: 0xba, hi: 0xbf}, + // Block 0x6d, offset 0x36c + {value: 0x0000, lo: 0x0e}, + {value: 0x0008, lo: 0x80, hi: 0x81}, + {value: 0x1308, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0x85}, + {value: 0x1b08, lo: 0x86, hi: 0x86}, + {value: 0x0008, lo: 0x87, hi: 0x8a}, + {value: 0x1308, lo: 0x8b, hi: 0x8b}, + {value: 0x0008, lo: 0x8c, hi: 0xa2}, + {value: 0x1008, lo: 0xa3, hi: 0xa4}, + {value: 0x1308, lo: 0xa5, hi: 0xa6}, + {value: 0x1008, lo: 0xa7, hi: 0xa7}, + {value: 0x0018, lo: 0xa8, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0x6e, offset 0x37b + {value: 0x0000, lo: 0x05}, + {value: 0x0208, lo: 0x80, hi: 0xb1}, + {value: 0x0108, lo: 0xb2, hi: 0xb2}, + {value: 0x0008, lo: 0xb3, hi: 0xb3}, + {value: 0x0018, lo: 0xb4, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbf}, + // Block 0x6f, offset 0x381 + {value: 0x0000, lo: 0x03}, + {value: 0x1008, lo: 0x80, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0xb3}, + {value: 0x1008, lo: 0xb4, hi: 0xbf}, + // Block 0x70, offset 0x385 + {value: 0x0000, lo: 0x0e}, + {value: 0x1008, lo: 0x80, hi: 0x83}, + {value: 0x1b08, lo: 0x84, hi: 0x84}, + {value: 0x1308, lo: 0x85, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x8d}, + {value: 0x0018, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x1308, lo: 0xa0, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xb7}, + {value: 0x0018, lo: 0xb8, hi: 0xba}, + {value: 0x0008, lo: 0xbb, hi: 0xbb}, + {value: 0x0018, lo: 0xbc, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0x71, offset 0x394 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xa5}, + {value: 0x1308, lo: 0xa6, hi: 0xad}, + {value: 0x0018, lo: 0xae, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x72, offset 0x399 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x1308, lo: 0x87, hi: 0x91}, + {value: 0x1008, lo: 0x92, hi: 0x92}, + {value: 0x1808, lo: 0x93, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x9e}, + {value: 0x0018, lo: 0x9f, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbf}, + // Block 0x73, offset 0x3a1 + {value: 0x0000, lo: 0x09}, + {value: 0x1308, lo: 0x80, hi: 0x82}, + {value: 0x1008, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0xb2}, + {value: 0x1308, lo: 0xb3, hi: 0xb3}, + {value: 0x1008, lo: 0xb4, hi: 0xb5}, + {value: 0x1308, lo: 0xb6, hi: 0xb9}, + {value: 0x1008, lo: 0xba, hi: 0xbb}, + {value: 0x1308, lo: 0xbc, hi: 0xbc}, + {value: 0x1008, lo: 0xbd, hi: 0xbf}, + // Block 0x74, offset 0x3ab + {value: 0x0000, lo: 0x0a}, + {value: 0x1808, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8e}, + {value: 0x0008, lo: 0x8f, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa4}, + {value: 0x1308, lo: 0xa5, hi: 0xa5}, + {value: 0x0008, lo: 0xa6, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x75, offset 0x3b6 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xa8}, + {value: 0x1308, lo: 0xa9, hi: 0xae}, + {value: 0x1008, lo: 0xaf, hi: 0xb0}, + {value: 0x1308, lo: 0xb1, hi: 0xb2}, + {value: 0x1008, lo: 0xb3, hi: 0xb4}, + {value: 0x1308, lo: 0xb5, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0x76, offset 0x3be + {value: 0x0000, lo: 0x10}, + {value: 0x0008, lo: 0x80, hi: 0x82}, + {value: 0x1308, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x8b}, + {value: 0x1308, lo: 0x8c, hi: 0x8c}, + {value: 0x1008, lo: 0x8d, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9b}, + {value: 0x0018, lo: 0x9c, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xb9}, + {value: 0x0008, lo: 0xba, hi: 0xba}, + {value: 0x1008, lo: 0xbb, hi: 0xbb}, + {value: 0x1308, lo: 0xbc, hi: 0xbc}, + {value: 0x1008, lo: 0xbd, hi: 0xbd}, + {value: 0x0008, lo: 0xbe, hi: 0xbf}, + // Block 0x77, offset 0x3cf + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x1308, lo: 0xb0, hi: 0xb0}, + {value: 0x0008, lo: 0xb1, hi: 0xb1}, + {value: 0x1308, lo: 0xb2, hi: 0xb4}, + {value: 0x0008, lo: 0xb5, hi: 0xb6}, + {value: 0x1308, lo: 0xb7, hi: 0xb8}, + {value: 0x0008, lo: 0xb9, hi: 0xbd}, + {value: 0x1308, lo: 0xbe, hi: 0xbf}, + // Block 0x78, offset 0x3d8 + {value: 0x0000, lo: 0x0f}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x1308, lo: 0x81, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0x82}, + {value: 0x0040, lo: 0x83, hi: 0x9a}, + {value: 0x0008, lo: 0x9b, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xaa}, + {value: 0x1008, lo: 0xab, hi: 0xab}, + {value: 0x1308, lo: 0xac, hi: 0xad}, + {value: 0x1008, lo: 0xae, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xb4}, + {value: 0x1008, lo: 0xb5, hi: 0xb5}, + {value: 0x1b08, lo: 0xb6, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0x79, offset 0x3e8 + {value: 0x0000, lo: 0x0c}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x88}, + {value: 0x0008, lo: 0x89, hi: 0x8e}, + {value: 0x0040, lo: 0x8f, hi: 0x90}, + {value: 0x0008, lo: 0x91, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xa7}, + {value: 0x0008, lo: 0xa8, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x7a, offset 0x3f5 + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9b}, + {value: 0x4465, lo: 0x9c, hi: 0x9c}, + {value: 0x447d, lo: 0x9d, hi: 0x9d}, + {value: 0x2971, lo: 0x9e, hi: 0x9e}, + {value: 0xe06d, lo: 0x9f, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa5}, + {value: 0x0040, lo: 0xa6, hi: 0xaf}, + {value: 0x4495, lo: 0xb0, hi: 0xbf}, + // Block 0x7b, offset 0x3ff + {value: 0x0000, lo: 0x04}, + {value: 0x44b5, lo: 0x80, hi: 0x8f}, + {value: 0x44d5, lo: 0x90, hi: 0x9f}, + {value: 0x44f5, lo: 0xa0, hi: 0xaf}, + {value: 0x44d5, lo: 0xb0, hi: 0xbf}, + // Block 0x7c, offset 0x404 + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0xa2}, + {value: 0x1008, lo: 0xa3, hi: 0xa4}, + {value: 0x1308, lo: 0xa5, hi: 0xa5}, + {value: 0x1008, lo: 0xa6, hi: 0xa7}, + {value: 0x1308, lo: 0xa8, hi: 0xa8}, + {value: 0x1008, lo: 0xa9, hi: 0xaa}, + {value: 0x0018, lo: 0xab, hi: 0xab}, + {value: 0x1008, lo: 0xac, hi: 0xac}, + {value: 0x1b08, lo: 0xad, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0x7d, offset 0x411 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbf}, + // Block 0x7e, offset 0x415 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x8a}, + {value: 0x0018, lo: 0x8b, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0x7f, offset 0x41a + {value: 0x0020, lo: 0x01}, + {value: 0x4515, lo: 0x80, hi: 0xbf}, + // Block 0x80, offset 0x41c + {value: 0x0020, lo: 0x03}, + {value: 0x4d15, lo: 0x80, hi: 0x94}, + {value: 0x4ad5, lo: 0x95, hi: 0x95}, + {value: 0x4fb5, lo: 0x96, hi: 0xbf}, + // Block 0x81, offset 0x420 + {value: 0x0020, lo: 0x01}, + {value: 0x54f5, lo: 0x80, hi: 0xbf}, + // Block 0x82, offset 0x422 + {value: 0x0020, lo: 0x03}, + {value: 0x5cf5, lo: 0x80, hi: 0x84}, + {value: 0x5655, lo: 0x85, hi: 0x85}, + {value: 0x5d95, lo: 0x86, hi: 0xbf}, + // Block 0x83, offset 0x426 + {value: 0x0020, lo: 0x08}, + {value: 0x6b55, lo: 0x80, hi: 0x8f}, + {value: 0x6d15, lo: 0x90, hi: 0x90}, + {value: 0x6d55, lo: 0x91, hi: 0xab}, + {value: 0x6ea1, lo: 0xac, hi: 0xac}, + {value: 0x70b5, lo: 0xad, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x70d5, lo: 0xb0, hi: 0xbf}, + // Block 0x84, offset 0x42f + {value: 0x0020, lo: 0x05}, + {value: 0x72d5, lo: 0x80, hi: 0xad}, + {value: 0x6535, lo: 0xae, hi: 0xae}, + {value: 0x7895, lo: 0xaf, hi: 0xb5}, + {value: 0x6f55, lo: 0xb6, hi: 0xb6}, + {value: 0x7975, lo: 0xb7, hi: 0xbf}, + // Block 0x85, offset 0x435 + {value: 0x0028, lo: 0x03}, + {value: 0x7c21, lo: 0x80, hi: 0x82}, + {value: 0x7be1, lo: 0x83, hi: 0x83}, + {value: 0x7c99, lo: 0x84, hi: 0xbf}, + // Block 0x86, offset 0x439 + {value: 0x0038, lo: 0x0f}, + {value: 0x9db1, lo: 0x80, hi: 0x83}, + {value: 0x9e59, lo: 0x84, hi: 0x85}, + {value: 0x9e91, lo: 0x86, hi: 0x87}, + {value: 0x9ec9, lo: 0x88, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x91}, + {value: 0xa089, lo: 0x92, hi: 0x97}, + {value: 0xa1a1, lo: 0x98, hi: 0x9c}, + {value: 0xa281, lo: 0x9d, hi: 0xb3}, + {value: 0x9d41, lo: 0xb4, hi: 0xb4}, + {value: 0x9db1, lo: 0xb5, hi: 0xb5}, + {value: 0xa789, lo: 0xb6, hi: 0xbb}, + {value: 0xa869, lo: 0xbc, hi: 0xbc}, + {value: 0xa7f9, lo: 0xbd, hi: 0xbd}, + {value: 0xa8d9, lo: 0xbe, hi: 0xbf}, + // Block 0x87, offset 0x449 + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8c}, + {value: 0x0008, lo: 0x8d, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xa7}, + {value: 0x0008, lo: 0xa8, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbb}, + {value: 0x0008, lo: 0xbc, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbe}, + {value: 0x0008, lo: 0xbf, hi: 0xbf}, + // Block 0x88, offset 0x453 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0xbf}, + // Block 0x89, offset 0x458 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbf}, + // Block 0x8a, offset 0x45b + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x82}, + {value: 0x0040, lo: 0x83, hi: 0x86}, + {value: 0x0018, lo: 0x87, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xbf}, + // Block 0x8b, offset 0x461 + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x8e}, + {value: 0x0040, lo: 0x8f, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa0}, + {value: 0x0040, lo: 0xa1, hi: 0xbf}, + // Block 0x8c, offset 0x468 + {value: 0x0000, lo: 0x04}, + {value: 0x0040, lo: 0x80, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbc}, + {value: 0x1308, lo: 0xbd, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0x8d, offset 0x46d + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0x9c}, + {value: 0x0040, lo: 0x9d, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x8e, offset 0x471 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x9f}, + {value: 0x1308, lo: 0xa0, hi: 0xa0}, + {value: 0x0018, lo: 0xa1, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0x8f, offset 0x477 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x90, offset 0x47c + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0x89}, + {value: 0x0018, lo: 0x8a, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xb5}, + {value: 0x1308, lo: 0xb6, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbf}, + // Block 0x91, offset 0x485 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9e}, + {value: 0x0018, lo: 0x9f, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x92, offset 0x48a + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0xbf}, + // Block 0x93, offset 0x490 + {value: 0x0000, lo: 0x06}, + {value: 0xe145, lo: 0x80, hi: 0x87}, + {value: 0xe1c5, lo: 0x88, hi: 0x8f}, + {value: 0xe145, lo: 0x90, hi: 0x97}, + {value: 0x8ad5, lo: 0x98, hi: 0x9f}, + {value: 0x8aed, lo: 0xa0, hi: 0xa7}, + {value: 0x0008, lo: 0xa8, hi: 0xbf}, + // Block 0x94, offset 0x497 + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa9}, + {value: 0x0040, lo: 0xaa, hi: 0xaf}, + {value: 0x8aed, lo: 0xb0, hi: 0xb7}, + {value: 0x8ad5, lo: 0xb8, hi: 0xbf}, + // Block 0x95, offset 0x49e + {value: 0x0000, lo: 0x06}, + {value: 0xe145, lo: 0x80, hi: 0x87}, + {value: 0xe1c5, lo: 0x88, hi: 0x8f}, + {value: 0xe145, lo: 0x90, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0x96, offset 0x4a5 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x97, offset 0x4a9 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xae}, + {value: 0x0018, lo: 0xaf, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0x98, offset 0x4ae + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0x99, offset 0x4b1 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xbf}, + // Block 0x9a, offset 0x4b6 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0008, lo: 0x8a, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb6}, + {value: 0x0008, lo: 0xb7, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbb}, + {value: 0x0008, lo: 0xbc, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbe}, + {value: 0x0008, lo: 0xbf, hi: 0xbf}, + // Block 0x9b, offset 0x4c2 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x96}, + {value: 0x0018, lo: 0x97, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xbf}, + // Block 0x9c, offset 0x4c8 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0xa6}, + {value: 0x0018, lo: 0xa7, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0x9d, offset 0x4cd + {value: 0x0000, lo: 0x06}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xb3}, + {value: 0x0008, lo: 0xb4, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xba}, + {value: 0x0018, lo: 0xbb, hi: 0xbf}, + // Block 0x9e, offset 0x4d4 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0x95}, + {value: 0x0018, lo: 0x96, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0x9e}, + {value: 0x0018, lo: 0x9f, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbe}, + {value: 0x0018, lo: 0xbf, hi: 0xbf}, + // Block 0x9f, offset 0x4dc + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbb}, + {value: 0x0018, lo: 0xbc, hi: 0xbd}, + {value: 0x0008, lo: 0xbe, hi: 0xbf}, + // Block 0xa0, offset 0x4e1 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x91}, + {value: 0x0018, lo: 0x92, hi: 0xbf}, + // Block 0xa1, offset 0x4e5 + {value: 0x0000, lo: 0x0f}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x1308, lo: 0x81, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x84}, + {value: 0x1308, lo: 0x85, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x8b}, + {value: 0x1308, lo: 0x8c, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x94}, + {value: 0x0008, lo: 0x95, hi: 0x97}, + {value: 0x0040, lo: 0x98, hi: 0x98}, + {value: 0x0008, lo: 0x99, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xb7}, + {value: 0x1308, lo: 0xb8, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbe}, + {value: 0x1b08, lo: 0xbf, hi: 0xbf}, + // Block 0xa2, offset 0x4f5 + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x98}, + {value: 0x0040, lo: 0x99, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbc}, + {value: 0x0018, lo: 0xbd, hi: 0xbf}, + // Block 0xa3, offset 0x4fc + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0x9c}, + {value: 0x0018, lo: 0x9d, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0xa4, offset 0x500 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb8}, + {value: 0x0018, lo: 0xb9, hi: 0xbf}, + // Block 0xa5, offset 0x504 + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x97}, + {value: 0x0018, lo: 0x98, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xb7}, + {value: 0x0018, lo: 0xb8, hi: 0xbf}, + // Block 0xa6, offset 0x50b + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0xbf}, + // Block 0xa7, offset 0x50e + {value: 0x0000, lo: 0x02}, + {value: 0x03dd, lo: 0x80, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xbf}, + // Block 0xa8, offset 0x511 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xb9}, + {value: 0x0018, lo: 0xba, hi: 0xbf}, + // Block 0xa9, offset 0x515 + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xaa, offset 0x519 + {value: 0x0000, lo: 0x05}, + {value: 0x1008, lo: 0x80, hi: 0x80}, + {value: 0x1308, lo: 0x81, hi: 0x81}, + {value: 0x1008, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xb7}, + {value: 0x1308, lo: 0xb8, hi: 0xbf}, + // Block 0xab, offset 0x51f + {value: 0x0000, lo: 0x08}, + {value: 0x1308, lo: 0x80, hi: 0x85}, + {value: 0x1b08, lo: 0x86, hi: 0x86}, + {value: 0x0018, lo: 0x87, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x91}, + {value: 0x0018, lo: 0x92, hi: 0xa5}, + {value: 0x0008, lo: 0xa6, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbe}, + {value: 0x1b08, lo: 0xbf, hi: 0xbf}, + // Block 0xac, offset 0x528 + {value: 0x0000, lo: 0x0b}, + {value: 0x1308, lo: 0x80, hi: 0x81}, + {value: 0x1008, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xaf}, + {value: 0x1008, lo: 0xb0, hi: 0xb2}, + {value: 0x1308, lo: 0xb3, hi: 0xb6}, + {value: 0x1008, lo: 0xb7, hi: 0xb8}, + {value: 0x1b08, lo: 0xb9, hi: 0xb9}, + {value: 0x1308, lo: 0xba, hi: 0xba}, + {value: 0x0018, lo: 0xbb, hi: 0xbc}, + {value: 0x0340, lo: 0xbd, hi: 0xbd}, + {value: 0x0018, lo: 0xbe, hi: 0xbf}, + // Block 0xad, offset 0x534 + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x81}, + {value: 0x0040, lo: 0x82, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xa8}, + {value: 0x0040, lo: 0xa9, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0xae, offset 0x53b + {value: 0x0000, lo: 0x08}, + {value: 0x1308, lo: 0x80, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xa6}, + {value: 0x1308, lo: 0xa7, hi: 0xab}, + {value: 0x1008, lo: 0xac, hi: 0xac}, + {value: 0x1308, lo: 0xad, hi: 0xb2}, + {value: 0x1b08, lo: 0xb3, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xb5}, + {value: 0x0008, lo: 0xb6, hi: 0xbf}, + // Block 0xaf, offset 0x544 + {value: 0x0000, lo: 0x07}, + {value: 0x0018, lo: 0x80, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xb2}, + {value: 0x1308, lo: 0xb3, hi: 0xb3}, + {value: 0x0018, lo: 0xb4, hi: 0xb5}, + {value: 0x0008, lo: 0xb6, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0xb0, offset 0x54c + {value: 0x0000, lo: 0x06}, + {value: 0x1308, lo: 0x80, hi: 0x81}, + {value: 0x1008, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xb2}, + {value: 0x1008, lo: 0xb3, hi: 0xb5}, + {value: 0x1308, lo: 0xb6, hi: 0xbe}, + {value: 0x1008, lo: 0xbf, hi: 0xbf}, + // Block 0xb1, offset 0x553 + {value: 0x0000, lo: 0x0d}, + {value: 0x1808, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0x84}, + {value: 0x0018, lo: 0x85, hi: 0x89}, + {value: 0x1308, lo: 0x8a, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9b}, + {value: 0x0008, lo: 0x9c, hi: 0x9c}, + {value: 0x0018, lo: 0x9d, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xa0}, + {value: 0x0018, lo: 0xa1, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0xb2, offset 0x561 + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x91}, + {value: 0x0040, lo: 0x92, hi: 0x92}, + {value: 0x0008, lo: 0x93, hi: 0xab}, + {value: 0x1008, lo: 0xac, hi: 0xae}, + {value: 0x1308, lo: 0xaf, hi: 0xb1}, + {value: 0x1008, lo: 0xb2, hi: 0xb3}, + {value: 0x1308, lo: 0xb4, hi: 0xb4}, + {value: 0x1808, lo: 0xb5, hi: 0xb5}, + {value: 0x1308, lo: 0xb6, hi: 0xb7}, + {value: 0x0018, lo: 0xb8, hi: 0xbd}, + {value: 0x1308, lo: 0xbe, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xb3, offset 0x56e + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0008, lo: 0x8a, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8e}, + {value: 0x0008, lo: 0x8f, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9e}, + {value: 0x0008, lo: 0x9f, hi: 0xa8}, + {value: 0x0018, lo: 0xa9, hi: 0xa9}, + {value: 0x0040, lo: 0xaa, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0xb4, offset 0x57b + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0x9e}, + {value: 0x1308, lo: 0x9f, hi: 0x9f}, + {value: 0x1008, lo: 0xa0, hi: 0xa2}, + {value: 0x1308, lo: 0xa3, hi: 0xa9}, + {value: 0x1b08, lo: 0xaa, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0xb5, offset 0x584 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xb4}, + {value: 0x1008, lo: 0xb5, hi: 0xb7}, + {value: 0x1308, lo: 0xb8, hi: 0xbf}, + // Block 0xb6, offset 0x588 + {value: 0x0000, lo: 0x0d}, + {value: 0x1008, lo: 0x80, hi: 0x81}, + {value: 0x1b08, lo: 0x82, hi: 0x82}, + {value: 0x1308, lo: 0x83, hi: 0x84}, + {value: 0x1008, lo: 0x85, hi: 0x85}, + {value: 0x1308, lo: 0x86, hi: 0x86}, + {value: 0x0008, lo: 0x87, hi: 0x8a}, + {value: 0x0018, lo: 0x8b, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0x9c}, + {value: 0x0018, lo: 0x9d, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0xbf}, + // Block 0xb7, offset 0x596 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x1008, lo: 0xb0, hi: 0xb2}, + {value: 0x1308, lo: 0xb3, hi: 0xb8}, + {value: 0x1008, lo: 0xb9, hi: 0xb9}, + {value: 0x1308, lo: 0xba, hi: 0xba}, + {value: 0x1008, lo: 0xbb, hi: 0xbe}, + {value: 0x1308, lo: 0xbf, hi: 0xbf}, + // Block 0xb8, offset 0x59e + {value: 0x0000, lo: 0x0a}, + {value: 0x1308, lo: 0x80, hi: 0x80}, + {value: 0x1008, lo: 0x81, hi: 0x81}, + {value: 0x1b08, lo: 0x82, hi: 0x82}, + {value: 0x1308, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x85}, + {value: 0x0018, lo: 0x86, hi: 0x86}, + {value: 0x0008, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0xbf}, + // Block 0xb9, offset 0x5a9 + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0xae}, + {value: 0x1008, lo: 0xaf, hi: 0xb1}, + {value: 0x1308, lo: 0xb2, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb7}, + {value: 0x1008, lo: 0xb8, hi: 0xbb}, + {value: 0x1308, lo: 0xbc, hi: 0xbd}, + {value: 0x1008, lo: 0xbe, hi: 0xbe}, + {value: 0x1b08, lo: 0xbf, hi: 0xbf}, + // Block 0xba, offset 0x5b2 + {value: 0x0000, lo: 0x05}, + {value: 0x1308, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0x9b}, + {value: 0x1308, lo: 0x9c, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0xbf}, + // Block 0xbb, offset 0x5b8 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x1008, lo: 0xb0, hi: 0xb2}, + {value: 0x1308, lo: 0xb3, hi: 0xba}, + {value: 0x1008, lo: 0xbb, hi: 0xbc}, + {value: 0x1308, lo: 0xbd, hi: 0xbd}, + {value: 0x1008, lo: 0xbe, hi: 0xbe}, + {value: 0x1b08, lo: 0xbf, hi: 0xbf}, + // Block 0xbc, offset 0x5c0 + {value: 0x0000, lo: 0x08}, + {value: 0x1308, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x84}, + {value: 0x0040, lo: 0x85, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xbf}, + // Block 0xbd, offset 0x5c9 + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0xaa}, + {value: 0x1308, lo: 0xab, hi: 0xab}, + {value: 0x1008, lo: 0xac, hi: 0xac}, + {value: 0x1308, lo: 0xad, hi: 0xad}, + {value: 0x1008, lo: 0xae, hi: 0xaf}, + {value: 0x1308, lo: 0xb0, hi: 0xb5}, + {value: 0x1808, lo: 0xb6, hi: 0xb6}, + {value: 0x1308, lo: 0xb7, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbf}, + // Block 0xbe, offset 0x5d3 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0xbf}, + // Block 0xbf, offset 0x5d6 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9c}, + {value: 0x1308, lo: 0x9d, hi: 0x9f}, + {value: 0x1008, lo: 0xa0, hi: 0xa1}, + {value: 0x1308, lo: 0xa2, hi: 0xa5}, + {value: 0x1008, lo: 0xa6, hi: 0xa6}, + {value: 0x1308, lo: 0xa7, hi: 0xaa}, + {value: 0x1b08, lo: 0xab, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0018, lo: 0xba, hi: 0xbf}, + // Block 0xc0, offset 0x5e2 + {value: 0x0000, lo: 0x02}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x049d, lo: 0xa0, hi: 0xbf}, + // Block 0xc1, offset 0x5e5 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xa9}, + {value: 0x0018, lo: 0xaa, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xbe}, + {value: 0x0008, lo: 0xbf, hi: 0xbf}, + // Block 0xc2, offset 0x5ea + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbf}, + // Block 0xc3, offset 0x5ed + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0008, lo: 0x8a, hi: 0xae}, + {value: 0x1008, lo: 0xaf, hi: 0xaf}, + {value: 0x1308, lo: 0xb0, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xb7}, + {value: 0x1308, lo: 0xb8, hi: 0xbd}, + {value: 0x1008, lo: 0xbe, hi: 0xbe}, + {value: 0x1b08, lo: 0xbf, hi: 0xbf}, + // Block 0xc4, offset 0x5f7 + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xbf}, + // Block 0xc5, offset 0x600 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x91}, + {value: 0x1308, lo: 0x92, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xa8}, + {value: 0x1008, lo: 0xa9, hi: 0xa9}, + {value: 0x1308, lo: 0xaa, hi: 0xb0}, + {value: 0x1008, lo: 0xb1, hi: 0xb1}, + {value: 0x1308, lo: 0xb2, hi: 0xb3}, + {value: 0x1008, lo: 0xb4, hi: 0xb4}, + {value: 0x1308, lo: 0xb5, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0xc6, offset 0x60c + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0xbf}, + // Block 0xc7, offset 0x60f + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0xc8, offset 0x614 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0xbf}, + // Block 0xc9, offset 0x617 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xbf}, + // Block 0xca, offset 0x61a + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0xbf}, + // Block 0xcb, offset 0x61d + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa9}, + {value: 0x0040, lo: 0xaa, hi: 0xad}, + {value: 0x0018, lo: 0xae, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0xcc, offset 0x624 + {value: 0x0000, lo: 0x06}, + {value: 0x0040, lo: 0x80, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x1308, lo: 0xb0, hi: 0xb4}, + {value: 0x0018, lo: 0xb5, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xbf}, + // Block 0xcd, offset 0x62b + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x1308, lo: 0xb0, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xbf}, + // Block 0xce, offset 0x62f + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x83}, + {value: 0x0018, lo: 0x84, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0xa1}, + {value: 0x0040, lo: 0xa2, hi: 0xa2}, + {value: 0x0008, lo: 0xa3, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbf}, + // Block 0xcf, offset 0x63a + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0xbf}, + // Block 0xd0, offset 0x63d + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x84}, + {value: 0x0040, lo: 0x85, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x90}, + {value: 0x1008, lo: 0x91, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xd1, offset 0x643 + {value: 0x0000, lo: 0x04}, + {value: 0x0040, lo: 0x80, hi: 0x8e}, + {value: 0x1308, lo: 0x8f, hi: 0x92}, + {value: 0x0008, lo: 0x93, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0xd2, offset 0x648 + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa0}, + {value: 0x0040, lo: 0xa1, hi: 0xbf}, + // Block 0xd3, offset 0x64c + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xbf}, + // Block 0xd4, offset 0x64f + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xbf}, + // Block 0xd5, offset 0x652 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x81}, + {value: 0x0040, lo: 0x82, hi: 0xbf}, + // Block 0xd6, offset 0x655 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbf}, + // Block 0xd7, offset 0x65a + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9b}, + {value: 0x0018, lo: 0x9c, hi: 0x9c}, + {value: 0x1308, lo: 0x9d, hi: 0x9e}, + {value: 0x0018, lo: 0x9f, hi: 0x9f}, + {value: 0x03c0, lo: 0xa0, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xbf}, + // Block 0xd8, offset 0x664 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xbf}, + // Block 0xd9, offset 0x667 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xa8}, + {value: 0x0018, lo: 0xa9, hi: 0xbf}, + // Block 0xda, offset 0x66b + {value: 0x0000, lo: 0x0e}, + {value: 0x0018, lo: 0x80, hi: 0x9d}, + {value: 0xb5b9, lo: 0x9e, hi: 0x9e}, + {value: 0xb601, lo: 0x9f, hi: 0x9f}, + {value: 0xb649, lo: 0xa0, hi: 0xa0}, + {value: 0xb6b1, lo: 0xa1, hi: 0xa1}, + {value: 0xb719, lo: 0xa2, hi: 0xa2}, + {value: 0xb781, lo: 0xa3, hi: 0xa3}, + {value: 0xb7e9, lo: 0xa4, hi: 0xa4}, + {value: 0x1018, lo: 0xa5, hi: 0xa6}, + {value: 0x1318, lo: 0xa7, hi: 0xa9}, + {value: 0x0018, lo: 0xaa, hi: 0xac}, + {value: 0x1018, lo: 0xad, hi: 0xb2}, + {value: 0x0340, lo: 0xb3, hi: 0xba}, + {value: 0x1318, lo: 0xbb, hi: 0xbf}, + // Block 0xdb, offset 0x67a + {value: 0x0000, lo: 0x0b}, + {value: 0x1318, lo: 0x80, hi: 0x82}, + {value: 0x0018, lo: 0x83, hi: 0x84}, + {value: 0x1318, lo: 0x85, hi: 0x8b}, + {value: 0x0018, lo: 0x8c, hi: 0xa9}, + {value: 0x1318, lo: 0xaa, hi: 0xad}, + {value: 0x0018, lo: 0xae, hi: 0xba}, + {value: 0xb851, lo: 0xbb, hi: 0xbb}, + {value: 0xb899, lo: 0xbc, hi: 0xbc}, + {value: 0xb8e1, lo: 0xbd, hi: 0xbd}, + {value: 0xb949, lo: 0xbe, hi: 0xbe}, + {value: 0xb9b1, lo: 0xbf, hi: 0xbf}, + // Block 0xdc, offset 0x686 + {value: 0x0000, lo: 0x03}, + {value: 0xba19, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0xa8}, + {value: 0x0040, lo: 0xa9, hi: 0xbf}, + // Block 0xdd, offset 0x68a + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x81}, + {value: 0x1318, lo: 0x82, hi: 0x84}, + {value: 0x0018, lo: 0x85, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0xbf}, + // Block 0xde, offset 0x68f + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xbf}, + // Block 0xdf, offset 0x694 + {value: 0x0000, lo: 0x03}, + {value: 0x1308, lo: 0x80, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xba}, + {value: 0x1308, lo: 0xbb, hi: 0xbf}, + // Block 0xe0, offset 0x698 + {value: 0x0000, lo: 0x04}, + {value: 0x1308, lo: 0x80, hi: 0xac}, + {value: 0x0018, lo: 0xad, hi: 0xb4}, + {value: 0x1308, lo: 0xb5, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xbf}, + // Block 0xe1, offset 0x69d + {value: 0x0000, lo: 0x08}, + {value: 0x0018, lo: 0x80, hi: 0x83}, + {value: 0x1308, lo: 0x84, hi: 0x84}, + {value: 0x0018, lo: 0x85, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x9a}, + {value: 0x1308, lo: 0x9b, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xa0}, + {value: 0x1308, lo: 0xa1, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0xe2, offset 0x6a6 + {value: 0x0000, lo: 0x0a}, + {value: 0x1308, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x87}, + {value: 0x1308, lo: 0x88, hi: 0x98}, + {value: 0x0040, lo: 0x99, hi: 0x9a}, + {value: 0x1308, lo: 0x9b, hi: 0xa1}, + {value: 0x0040, lo: 0xa2, hi: 0xa2}, + {value: 0x1308, lo: 0xa3, hi: 0xa4}, + {value: 0x0040, lo: 0xa5, hi: 0xa5}, + {value: 0x1308, lo: 0xa6, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xbf}, + // Block 0xe3, offset 0x6b1 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x84}, + {value: 0x0040, lo: 0x85, hi: 0x86}, + {value: 0x0018, lo: 0x87, hi: 0x8f}, + {value: 0x1308, lo: 0x90, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0xbf}, + // Block 0xe4, offset 0x6b7 + {value: 0x0000, lo: 0x07}, + {value: 0x0208, lo: 0x80, hi: 0x83}, + {value: 0x1308, lo: 0x84, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0xe5, offset 0x6bf + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xbf}, + // Block 0xe6, offset 0x6c3 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbf}, + // Block 0xe7, offset 0x6c7 + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xb0}, + {value: 0x0018, lo: 0xb1, hi: 0xbf}, + // Block 0xe8, offset 0x6cd + {value: 0x0000, lo: 0x05}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x90}, + {value: 0x0018, lo: 0x91, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xbf}, + // Block 0xe9, offset 0x6d3 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x8f}, + {value: 0xc1c1, lo: 0x90, hi: 0x90}, + {value: 0x0018, lo: 0x91, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xbf}, + // Block 0xea, offset 0x6d8 + {value: 0x0000, lo: 0x02}, + {value: 0x0040, lo: 0x80, hi: 0xa5}, + {value: 0x0018, lo: 0xa6, hi: 0xbf}, + // Block 0xeb, offset 0x6db + {value: 0x0000, lo: 0x0d}, + {value: 0xc7e9, lo: 0x80, hi: 0x80}, + {value: 0xc839, lo: 0x81, hi: 0x81}, + {value: 0xc889, lo: 0x82, hi: 0x82}, + {value: 0xc8d9, lo: 0x83, hi: 0x83}, + {value: 0xc929, lo: 0x84, hi: 0x84}, + {value: 0xc979, lo: 0x85, hi: 0x85}, + {value: 0xc9c9, lo: 0x86, hi: 0x86}, + {value: 0xca19, lo: 0x87, hi: 0x87}, + {value: 0xca69, lo: 0x88, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x8f}, + {value: 0xcab9, lo: 0x90, hi: 0x90}, + {value: 0xcad9, lo: 0x91, hi: 0x91}, + {value: 0x0040, lo: 0x92, hi: 0xbf}, + // Block 0xec, offset 0x6e9 + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x92}, + {value: 0x0040, lo: 0x93, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0xed, offset 0x6f0 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xbf}, + // Block 0xee, offset 0x6f3 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x94}, + {value: 0x0040, lo: 0x95, hi: 0xbf}, + // Block 0xef, offset 0x6f6 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbf}, + // Block 0xf0, offset 0x6fa + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xbf}, + // Block 0xf1, offset 0x700 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xbf}, + // Block 0xf2, offset 0x705 + {value: 0x0000, lo: 0x09}, + {value: 0x0040, lo: 0x80, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xb2}, + {value: 0x0018, lo: 0xb3, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xf3, offset 0x70f + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0xbf}, + // Block 0xf4, offset 0x714 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x91}, + {value: 0x0040, lo: 0x92, hi: 0xbf}, + // Block 0xf5, offset 0x717 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x80}, + {value: 0x0040, lo: 0x81, hi: 0xbf}, + // Block 0xf6, offset 0x71a + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0xbf}, + // Block 0xf7, offset 0x71d + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0xf8, offset 0x720 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0xf9, offset 0x724 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xa1}, + {value: 0x0040, lo: 0xa2, hi: 0xbf}, + // Block 0xfa, offset 0x727 + {value: 0x0020, lo: 0x0f}, + {value: 0xdeb9, lo: 0x80, hi: 0x89}, + {value: 0x8dfd, lo: 0x8a, hi: 0x8a}, + {value: 0xdff9, lo: 0x8b, hi: 0x9c}, + {value: 0x8e1d, lo: 0x9d, hi: 0x9d}, + {value: 0xe239, lo: 0x9e, hi: 0xa2}, + {value: 0x8e3d, lo: 0xa3, hi: 0xa3}, + {value: 0xe2d9, lo: 0xa4, hi: 0xab}, + {value: 0x7ed5, lo: 0xac, hi: 0xac}, + {value: 0xe3d9, lo: 0xad, hi: 0xaf}, + {value: 0x8e5d, lo: 0xb0, hi: 0xb0}, + {value: 0xe439, lo: 0xb1, hi: 0xb6}, + {value: 0x8e7d, lo: 0xb7, hi: 0xb9}, + {value: 0xe4f9, lo: 0xba, hi: 0xba}, + {value: 0x8edd, lo: 0xbb, hi: 0xbb}, + {value: 0xe519, lo: 0xbc, hi: 0xbf}, + // Block 0xfb, offset 0x737 + {value: 0x0020, lo: 0x10}, + {value: 0x937d, lo: 0x80, hi: 0x80}, + {value: 0xf099, lo: 0x81, hi: 0x86}, + {value: 0x939d, lo: 0x87, hi: 0x8a}, + {value: 0xd9f9, lo: 0x8b, hi: 0x8b}, + {value: 0xf159, lo: 0x8c, hi: 0x96}, + {value: 0x941d, lo: 0x97, hi: 0x97}, + {value: 0xf2b9, lo: 0x98, hi: 0xa3}, + {value: 0x943d, lo: 0xa4, hi: 0xa6}, + {value: 0xf439, lo: 0xa7, hi: 0xaa}, + {value: 0x949d, lo: 0xab, hi: 0xab}, + {value: 0xf4b9, lo: 0xac, hi: 0xac}, + {value: 0x94bd, lo: 0xad, hi: 0xad}, + {value: 0xf4d9, lo: 0xae, hi: 0xaf}, + {value: 0x94dd, lo: 0xb0, hi: 0xb1}, + {value: 0xf519, lo: 0xb2, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xfc, offset 0x748 + {value: 0x0000, lo: 0x04}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0340, lo: 0x81, hi: 0x81}, + {value: 0x0040, lo: 0x82, hi: 0x9f}, + {value: 0x0340, lo: 0xa0, hi: 0xbf}, + // Block 0xfd, offset 0x74d + {value: 0x0000, lo: 0x01}, + {value: 0x0340, lo: 0x80, hi: 0xbf}, + // Block 0xfe, offset 0x74f + {value: 0x0000, lo: 0x01}, + {value: 0x13c0, lo: 0x80, hi: 0xbf}, + // Block 0xff, offset 0x751 + {value: 0x0000, lo: 0x02}, + {value: 0x13c0, lo: 0x80, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, +} + +// Total table size 41559 bytes (40KiB); checksum: F4A1FA4E diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/idna/trie.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/idna/trie.go new file mode 100644 index 0000000..c4ef847 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/idna/trie.go @@ -0,0 +1,72 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +// 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 idna + +// appendMapping appends the mapping for the respective rune. isMapped must be +// true. A mapping is a categorization of a rune as defined in UTS #46. +func (c info) appendMapping(b []byte, s string) []byte { + index := int(c >> indexShift) + if c&xorBit == 0 { + s := mappings[index:] + return append(b, s[1:s[0]+1]...) + } + b = append(b, s...) + if c&inlineXOR == inlineXOR { + // TODO: support and handle two-byte inline masks + b[len(b)-1] ^= byte(index) + } else { + for p := len(b) - int(xorData[index]); p < len(b); p++ { + index++ + b[p] ^= xorData[index] + } + } + return b +} + +// Sparse block handling code. + +type valueRange struct { + value uint16 // header: value:stride + lo, hi byte // header: lo:n +} + +type sparseBlocks struct { + values []valueRange + offset []uint16 +} + +var idnaSparse = sparseBlocks{ + values: idnaSparseValues[:], + offset: idnaSparseOffset[:], +} + +// Don't use newIdnaTrie to avoid unconditional linking in of the table. +var trie = &idnaTrie{} + +// lookup determines the type of block n and looks up the value for b. +// For n < t.cutoff, the block is a simple lookup table. Otherwise, the block +// is a list of ranges with an accompanying value. Given a matching range r, +// the value for b is by r.value + (b - r.lo) * stride. +func (t *sparseBlocks) lookup(n uint32, b byte) uint16 { + offset := t.offset[n] + header := t.values[offset] + lo := offset + 1 + hi := lo + uint16(header.lo) + for lo < hi { + m := lo + (hi-lo)/2 + r := t.values[m] + if r.lo <= b && b <= r.hi { + return r.value + uint16(b-r.lo)*header.value + } + if b < r.lo { + hi = m + } else { + lo = m + 1 + } + } + return 0 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/idna/trieval.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/idna/trieval.go new file mode 100644 index 0000000..63cb03b --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/idna/trieval.go @@ -0,0 +1,114 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +package idna + +// This file contains definitions for interpreting the trie value of the idna +// trie generated by "go run gen*.go". It is shared by both the generator +// program and the resultant package. Sharing is achieved by the generator +// copying gen_trieval.go to trieval.go and changing what's above this comment. + +// info holds information from the IDNA mapping table for a single rune. It is +// the value returned by a trie lookup. In most cases, all information fits in +// a 16-bit value. For mappings, this value may contain an index into a slice +// with the mapped string. Such mappings can consist of the actual mapped value +// or an XOR pattern to be applied to the bytes of the UTF8 encoding of the +// input rune. This technique is used by the cases packages and reduces the +// table size significantly. +// +// The per-rune values have the following format: +// +// if mapped { +// if inlinedXOR { +// 15..13 inline XOR marker +// 12..11 unused +// 10..3 inline XOR mask +// } else { +// 15..3 index into xor or mapping table +// } +// } else { +// 15..13 unused +// 12 modifier (including virama) +// 11 virama modifier +// 10..8 joining type +// 7..3 category type +// } +// 2 use xor pattern +// 1..0 mapped category +// +// See the definitions below for a more detailed description of the various +// bits. +type info uint16 + +const ( + catSmallMask = 0x3 + catBigMask = 0xF8 + indexShift = 3 + xorBit = 0x4 // interpret the index as an xor pattern + inlineXOR = 0xE000 // These bits are set if the XOR pattern is inlined. + + joinShift = 8 + joinMask = 0x07 + + viramaModifier = 0x0800 + modifier = 0x1000 +) + +// A category corresponds to a category defined in the IDNA mapping table. +type category uint16 + +const ( + unknown category = 0 // not defined currently in unicode. + mapped category = 1 + disallowedSTD3Mapped category = 2 + deviation category = 3 +) + +const ( + valid category = 0x08 + validNV8 category = 0x18 + validXV8 category = 0x28 + disallowed category = 0x40 + disallowedSTD3Valid category = 0x80 + ignored category = 0xC0 +) + +// join types and additional rune information +const ( + joiningL = (iota + 1) + joiningD + joiningT + joiningR + + //the following types are derived during processing + joinZWJ + joinZWNJ + joinVirama + numJoinTypes +) + +func (c info) isMapped() bool { + return c&0x3 != 0 +} + +func (c info) category() category { + small := c & catSmallMask + if small != 0 { + return category(small) + } + return category(c & catBigMask) +} + +func (c info) joinType() info { + if c.isMapped() { + return 0 + } + return (c >> joinShift) & joinMask +} + +func (c info) isModifier() bool { + return c&(modifier|catSmallMask) == modifier +} + +func (c info) isViramaModifier() bool { + return c&(viramaModifier|catSmallMask) == viramaModifier +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/iana/const.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/iana/const.go new file mode 100644 index 0000000..c9df24d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/iana/const.go @@ -0,0 +1,180 @@ +// go generate gen.go +// GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// Package iana provides protocol number resources managed by the Internet Assigned Numbers Authority (IANA). +package iana // import "golang.org/x/net/internal/iana" + +// Differentiated Services Field Codepoints (DSCP), Updated: 2017-05-12 +const ( + DiffServCS0 = 0x0 // CS0 + DiffServCS1 = 0x20 // CS1 + DiffServCS2 = 0x40 // CS2 + DiffServCS3 = 0x60 // CS3 + DiffServCS4 = 0x80 // CS4 + DiffServCS5 = 0xa0 // CS5 + DiffServCS6 = 0xc0 // CS6 + DiffServCS7 = 0xe0 // CS7 + DiffServAF11 = 0x28 // AF11 + DiffServAF12 = 0x30 // AF12 + DiffServAF13 = 0x38 // AF13 + DiffServAF21 = 0x48 // AF21 + DiffServAF22 = 0x50 // AF22 + DiffServAF23 = 0x58 // AF23 + DiffServAF31 = 0x68 // AF31 + DiffServAF32 = 0x70 // AF32 + DiffServAF33 = 0x78 // AF33 + DiffServAF41 = 0x88 // AF41 + DiffServAF42 = 0x90 // AF42 + DiffServAF43 = 0x98 // AF43 + DiffServEF = 0xb8 // EF + DiffServVOICEADMIT = 0xb0 // VOICE-ADMIT +) + +// IPv4 TOS Byte and IPv6 Traffic Class Octet, Updated: 2001-09-06 +const ( + NotECNTransport = 0x0 // Not-ECT (Not ECN-Capable Transport) + ECNTransport1 = 0x1 // ECT(1) (ECN-Capable Transport(1)) + ECNTransport0 = 0x2 // ECT(0) (ECN-Capable Transport(0)) + CongestionExperienced = 0x3 // CE (Congestion Experienced) +) + +// Protocol Numbers, Updated: 2016-06-22 +const ( + ProtocolIP = 0 // IPv4 encapsulation, pseudo protocol number + ProtocolHOPOPT = 0 // IPv6 Hop-by-Hop Option + ProtocolICMP = 1 // Internet Control Message + ProtocolIGMP = 2 // Internet Group Management + ProtocolGGP = 3 // Gateway-to-Gateway + ProtocolIPv4 = 4 // IPv4 encapsulation + ProtocolST = 5 // Stream + ProtocolTCP = 6 // Transmission Control + ProtocolCBT = 7 // CBT + ProtocolEGP = 8 // Exterior Gateway Protocol + ProtocolIGP = 9 // any private interior gateway (used by Cisco for their IGRP) + ProtocolBBNRCCMON = 10 // BBN RCC Monitoring + ProtocolNVPII = 11 // Network Voice Protocol + ProtocolPUP = 12 // PUP + ProtocolEMCON = 14 // EMCON + ProtocolXNET = 15 // Cross Net Debugger + ProtocolCHAOS = 16 // Chaos + ProtocolUDP = 17 // User Datagram + ProtocolMUX = 18 // Multiplexing + ProtocolDCNMEAS = 19 // DCN Measurement Subsystems + ProtocolHMP = 20 // Host Monitoring + ProtocolPRM = 21 // Packet Radio Measurement + ProtocolXNSIDP = 22 // XEROX NS IDP + ProtocolTRUNK1 = 23 // Trunk-1 + ProtocolTRUNK2 = 24 // Trunk-2 + ProtocolLEAF1 = 25 // Leaf-1 + ProtocolLEAF2 = 26 // Leaf-2 + ProtocolRDP = 27 // Reliable Data Protocol + ProtocolIRTP = 28 // Internet Reliable Transaction + ProtocolISOTP4 = 29 // ISO Transport Protocol Class 4 + ProtocolNETBLT = 30 // Bulk Data Transfer Protocol + ProtocolMFENSP = 31 // MFE Network Services Protocol + ProtocolMERITINP = 32 // MERIT Internodal Protocol + ProtocolDCCP = 33 // Datagram Congestion Control Protocol + Protocol3PC = 34 // Third Party Connect Protocol + ProtocolIDPR = 35 // Inter-Domain Policy Routing Protocol + ProtocolXTP = 36 // XTP + ProtocolDDP = 37 // Datagram Delivery Protocol + ProtocolIDPRCMTP = 38 // IDPR Control Message Transport Proto + ProtocolTPPP = 39 // TP++ Transport Protocol + ProtocolIL = 40 // IL Transport Protocol + ProtocolIPv6 = 41 // IPv6 encapsulation + ProtocolSDRP = 42 // Source Demand Routing Protocol + ProtocolIPv6Route = 43 // Routing Header for IPv6 + ProtocolIPv6Frag = 44 // Fragment Header for IPv6 + ProtocolIDRP = 45 // Inter-Domain Routing Protocol + ProtocolRSVP = 46 // Reservation Protocol + ProtocolGRE = 47 // Generic Routing Encapsulation + ProtocolDSR = 48 // Dynamic Source Routing Protocol + ProtocolBNA = 49 // BNA + ProtocolESP = 50 // Encap Security Payload + ProtocolAH = 51 // Authentication Header + ProtocolINLSP = 52 // Integrated Net Layer Security TUBA + ProtocolNARP = 54 // NBMA Address Resolution Protocol + ProtocolMOBILE = 55 // IP Mobility + ProtocolTLSP = 56 // Transport Layer Security Protocol using Kryptonet key management + ProtocolSKIP = 57 // SKIP + ProtocolIPv6ICMP = 58 // ICMP for IPv6 + ProtocolIPv6NoNxt = 59 // No Next Header for IPv6 + ProtocolIPv6Opts = 60 // Destination Options for IPv6 + ProtocolCFTP = 62 // CFTP + ProtocolSATEXPAK = 64 // SATNET and Backroom EXPAK + ProtocolKRYPTOLAN = 65 // Kryptolan + ProtocolRVD = 66 // MIT Remote Virtual Disk Protocol + ProtocolIPPC = 67 // Internet Pluribus Packet Core + ProtocolSATMON = 69 // SATNET Monitoring + ProtocolVISA = 70 // VISA Protocol + ProtocolIPCV = 71 // Internet Packet Core Utility + ProtocolCPNX = 72 // Computer Protocol Network Executive + ProtocolCPHB = 73 // Computer Protocol Heart Beat + ProtocolWSN = 74 // Wang Span Network + ProtocolPVP = 75 // Packet Video Protocol + ProtocolBRSATMON = 76 // Backroom SATNET Monitoring + ProtocolSUNND = 77 // SUN ND PROTOCOL-Temporary + ProtocolWBMON = 78 // WIDEBAND Monitoring + ProtocolWBEXPAK = 79 // WIDEBAND EXPAK + ProtocolISOIP = 80 // ISO Internet Protocol + ProtocolVMTP = 81 // VMTP + ProtocolSECUREVMTP = 82 // SECURE-VMTP + ProtocolVINES = 83 // VINES + ProtocolTTP = 84 // Transaction Transport Protocol + ProtocolIPTM = 84 // Internet Protocol Traffic Manager + ProtocolNSFNETIGP = 85 // NSFNET-IGP + ProtocolDGP = 86 // Dissimilar Gateway Protocol + ProtocolTCF = 87 // TCF + ProtocolEIGRP = 88 // EIGRP + ProtocolOSPFIGP = 89 // OSPFIGP + ProtocolSpriteRPC = 90 // Sprite RPC Protocol + ProtocolLARP = 91 // Locus Address Resolution Protocol + ProtocolMTP = 92 // Multicast Transport Protocol + ProtocolAX25 = 93 // AX.25 Frames + ProtocolIPIP = 94 // IP-within-IP Encapsulation Protocol + ProtocolSCCSP = 96 // Semaphore Communications Sec. Pro. + ProtocolETHERIP = 97 // Ethernet-within-IP Encapsulation + ProtocolENCAP = 98 // Encapsulation Header + ProtocolGMTP = 100 // GMTP + ProtocolIFMP = 101 // Ipsilon Flow Management Protocol + ProtocolPNNI = 102 // PNNI over IP + ProtocolPIM = 103 // Protocol Independent Multicast + ProtocolARIS = 104 // ARIS + ProtocolSCPS = 105 // SCPS + ProtocolQNX = 106 // QNX + ProtocolAN = 107 // Active Networks + ProtocolIPComp = 108 // IP Payload Compression Protocol + ProtocolSNP = 109 // Sitara Networks Protocol + ProtocolCompaqPeer = 110 // Compaq Peer Protocol + ProtocolIPXinIP = 111 // IPX in IP + ProtocolVRRP = 112 // Virtual Router Redundancy Protocol + ProtocolPGM = 113 // PGM Reliable Transport Protocol + ProtocolL2TP = 115 // Layer Two Tunneling Protocol + ProtocolDDX = 116 // D-II Data Exchange (DDX) + ProtocolIATP = 117 // Interactive Agent Transfer Protocol + ProtocolSTP = 118 // Schedule Transfer Protocol + ProtocolSRP = 119 // SpectraLink Radio Protocol + ProtocolUTI = 120 // UTI + ProtocolSMP = 121 // Simple Message Protocol + ProtocolPTP = 123 // Performance Transparency Protocol + ProtocolISIS = 124 // ISIS over IPv4 + ProtocolFIRE = 125 // FIRE + ProtocolCRTP = 126 // Combat Radio Transport Protocol + ProtocolCRUDP = 127 // Combat Radio User Datagram + ProtocolSSCOPMCE = 128 // SSCOPMCE + ProtocolIPLT = 129 // IPLT + ProtocolSPS = 130 // Secure Packet Shield + ProtocolPIPE = 131 // Private IP Encapsulation within IP + ProtocolSCTP = 132 // Stream Control Transmission Protocol + ProtocolFC = 133 // Fibre Channel + ProtocolRSVPE2EIGNORE = 134 // RSVP-E2E-IGNORE + ProtocolMobilityHeader = 135 // Mobility Header + ProtocolUDPLite = 136 // UDPLite + ProtocolMPLSinIP = 137 // MPLS-in-IP + ProtocolMANET = 138 // MANET Protocols + ProtocolHIP = 139 // Host Identity Protocol + ProtocolShim6 = 140 // Shim6 Protocol + ProtocolWESP = 141 // Wrapped Encapsulating Security Payload + ProtocolROHC = 142 // Robust Header Compression + ProtocolReserved = 255 // Reserved +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/iana/gen.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/iana/gen.go new file mode 100644 index 0000000..86c78b3 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/iana/gen.go @@ -0,0 +1,293 @@ +// 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. + +// +build ignore + +//go:generate go run gen.go + +// This program generates internet protocol constants and tables by +// reading IANA protocol registries. +package main + +import ( + "bytes" + "encoding/xml" + "fmt" + "go/format" + "io" + "io/ioutil" + "net/http" + "os" + "strconv" + "strings" +) + +var registries = []struct { + url string + parse func(io.Writer, io.Reader) error +}{ + { + "http://www.iana.org/assignments/dscp-registry/dscp-registry.xml", + parseDSCPRegistry, + }, + { + "http://www.iana.org/assignments/ipv4-tos-byte/ipv4-tos-byte.xml", + parseTOSTCByte, + }, + { + "http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xml", + parseProtocolNumbers, + }, +} + +func main() { + var bb bytes.Buffer + fmt.Fprintf(&bb, "// go generate gen.go\n") + fmt.Fprintf(&bb, "// GENERATED BY THE COMMAND ABOVE; DO NOT EDIT\n\n") + fmt.Fprintf(&bb, "// Package iana provides protocol number resources managed by the Internet Assigned Numbers Authority (IANA).\n") + fmt.Fprintf(&bb, `package iana // import "golang.org/x/net/internal/iana"`+"\n\n") + for _, r := range registries { + resp, err := http.Get(r.url) + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + fmt.Fprintf(os.Stderr, "got HTTP status code %v for %v\n", resp.StatusCode, r.url) + os.Exit(1) + } + if err := r.parse(&bb, resp.Body); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + fmt.Fprintf(&bb, "\n") + } + b, err := format.Source(bb.Bytes()) + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + if err := ioutil.WriteFile("const.go", b, 0644); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} + +func parseDSCPRegistry(w io.Writer, r io.Reader) error { + dec := xml.NewDecoder(r) + var dr dscpRegistry + if err := dec.Decode(&dr); err != nil { + return err + } + drs := dr.escape() + fmt.Fprintf(w, "// %s, Updated: %s\n", dr.Title, dr.Updated) + fmt.Fprintf(w, "const (\n") + for _, dr := range drs { + fmt.Fprintf(w, "DiffServ%s = %#x", dr.Name, dr.Value) + fmt.Fprintf(w, "// %s\n", dr.OrigName) + } + fmt.Fprintf(w, ")\n") + return nil +} + +type dscpRegistry struct { + XMLName xml.Name `xml:"registry"` + Title string `xml:"title"` + Updated string `xml:"updated"` + Note string `xml:"note"` + RegTitle string `xml:"registry>title"` + PoolRecords []struct { + Name string `xml:"name"` + Space string `xml:"space"` + } `xml:"registry>record"` + Records []struct { + Name string `xml:"name"` + Space string `xml:"space"` + } `xml:"registry>registry>record"` +} + +type canonDSCPRecord struct { + OrigName string + Name string + Value int +} + +func (drr *dscpRegistry) escape() []canonDSCPRecord { + drs := make([]canonDSCPRecord, len(drr.Records)) + sr := strings.NewReplacer( + "+", "", + "-", "", + "/", "", + ".", "", + " ", "", + ) + for i, dr := range drr.Records { + s := strings.TrimSpace(dr.Name) + drs[i].OrigName = s + drs[i].Name = sr.Replace(s) + n, err := strconv.ParseUint(dr.Space, 2, 8) + if err != nil { + continue + } + drs[i].Value = int(n) << 2 + } + return drs +} + +func parseTOSTCByte(w io.Writer, r io.Reader) error { + dec := xml.NewDecoder(r) + var ttb tosTCByte + if err := dec.Decode(&ttb); err != nil { + return err + } + trs := ttb.escape() + fmt.Fprintf(w, "// %s, Updated: %s\n", ttb.Title, ttb.Updated) + fmt.Fprintf(w, "const (\n") + for _, tr := range trs { + fmt.Fprintf(w, "%s = %#x", tr.Keyword, tr.Value) + fmt.Fprintf(w, "// %s\n", tr.OrigKeyword) + } + fmt.Fprintf(w, ")\n") + return nil +} + +type tosTCByte struct { + XMLName xml.Name `xml:"registry"` + Title string `xml:"title"` + Updated string `xml:"updated"` + Note string `xml:"note"` + RegTitle string `xml:"registry>title"` + Records []struct { + Binary string `xml:"binary"` + Keyword string `xml:"keyword"` + } `xml:"registry>record"` +} + +type canonTOSTCByteRecord struct { + OrigKeyword string + Keyword string + Value int +} + +func (ttb *tosTCByte) escape() []canonTOSTCByteRecord { + trs := make([]canonTOSTCByteRecord, len(ttb.Records)) + sr := strings.NewReplacer( + "Capable", "", + "(", "", + ")", "", + "+", "", + "-", "", + "/", "", + ".", "", + " ", "", + ) + for i, tr := range ttb.Records { + s := strings.TrimSpace(tr.Keyword) + trs[i].OrigKeyword = s + ss := strings.Split(s, " ") + if len(ss) > 1 { + trs[i].Keyword = strings.Join(ss[1:], " ") + } else { + trs[i].Keyword = ss[0] + } + trs[i].Keyword = sr.Replace(trs[i].Keyword) + n, err := strconv.ParseUint(tr.Binary, 2, 8) + if err != nil { + continue + } + trs[i].Value = int(n) + } + return trs +} + +func parseProtocolNumbers(w io.Writer, r io.Reader) error { + dec := xml.NewDecoder(r) + var pn protocolNumbers + if err := dec.Decode(&pn); err != nil { + return err + } + prs := pn.escape() + prs = append([]canonProtocolRecord{{ + Name: "IP", + Descr: "IPv4 encapsulation, pseudo protocol number", + Value: 0, + }}, prs...) + fmt.Fprintf(w, "// %s, Updated: %s\n", pn.Title, pn.Updated) + fmt.Fprintf(w, "const (\n") + for _, pr := range prs { + if pr.Name == "" { + continue + } + fmt.Fprintf(w, "Protocol%s = %d", pr.Name, pr.Value) + s := pr.Descr + if s == "" { + s = pr.OrigName + } + fmt.Fprintf(w, "// %s\n", s) + } + fmt.Fprintf(w, ")\n") + return nil +} + +type protocolNumbers struct { + XMLName xml.Name `xml:"registry"` + Title string `xml:"title"` + Updated string `xml:"updated"` + RegTitle string `xml:"registry>title"` + Note string `xml:"registry>note"` + Records []struct { + Value string `xml:"value"` + Name string `xml:"name"` + Descr string `xml:"description"` + } `xml:"registry>record"` +} + +type canonProtocolRecord struct { + OrigName string + Name string + Descr string + Value int +} + +func (pn *protocolNumbers) escape() []canonProtocolRecord { + prs := make([]canonProtocolRecord, len(pn.Records)) + sr := strings.NewReplacer( + "-in-", "in", + "-within-", "within", + "-over-", "over", + "+", "P", + "-", "", + "/", "", + ".", "", + " ", "", + ) + for i, pr := range pn.Records { + if strings.Contains(pr.Name, "Deprecated") || + strings.Contains(pr.Name, "deprecated") { + continue + } + prs[i].OrigName = pr.Name + s := strings.TrimSpace(pr.Name) + switch pr.Name { + case "ISIS over IPv4": + prs[i].Name = "ISIS" + case "manet": + prs[i].Name = "MANET" + default: + prs[i].Name = sr.Replace(s) + } + ss := strings.Split(pr.Descr, "\n") + for i := range ss { + ss[i] = strings.TrimSpace(ss[i]) + } + if len(ss) > 1 { + prs[i].Descr = strings.Join(ss, " ") + } else { + prs[i].Descr = ss[0] + } + prs[i].Value, _ = strconv.Atoi(pr.Value) + } + return prs +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/nettest/helper_bsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/nettest/helper_bsd.go new file mode 100644 index 0000000..a6e433b --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/nettest/helper_bsd.go @@ -0,0 +1,53 @@ +// 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. + +// +build darwin dragonfly freebsd netbsd openbsd + +package nettest + +import ( + "runtime" + "strconv" + "strings" + "syscall" +) + +var darwinVersion int + +func init() { + if runtime.GOOS == "darwin" { + // See http://support.apple.com/kb/HT1633. + s, err := syscall.Sysctl("kern.osrelease") + if err != nil { + return + } + ss := strings.Split(s, ".") + if len(ss) == 0 { + return + } + darwinVersion, _ = strconv.Atoi(ss[0]) + } +} + +func supportsIPv6MulticastDeliveryOnLoopback() bool { + switch runtime.GOOS { + case "freebsd": + // See http://www.freebsd.org/cgi/query-pr.cgi?pr=180065. + // Even after the fix, it looks like the latest + // kernels don't deliver link-local scoped multicast + // packets correctly. + return false + case "darwin": + return !causesIPv6Crash() + default: + return true + } +} + +func causesIPv6Crash() bool { + // We see some kernel crash when running IPv6 with IP-level + // options on Darwin kernel version 12 or below. + // See golang.org/issues/17015. + return darwinVersion < 13 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/nettest/helper_nobsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/nettest/helper_nobsd.go new file mode 100644 index 0000000..bc7da5e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/nettest/helper_nobsd.go @@ -0,0 +1,15 @@ +// 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. + +// +build linux solaris + +package nettest + +func supportsIPv6MulticastDeliveryOnLoopback() bool { + return true +} + +func causesIPv6Crash() bool { + return false +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/nettest/helper_posix.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/nettest/helper_posix.go new file mode 100644 index 0000000..963ed99 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/nettest/helper_posix.go @@ -0,0 +1,31 @@ +// 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows + +package nettest + +import ( + "os" + "syscall" +) + +func protocolNotSupported(err error) bool { + switch err := err.(type) { + case syscall.Errno: + switch err { + case syscall.EPROTONOSUPPORT, syscall.ENOPROTOOPT: + return true + } + case *os.SyscallError: + switch err := err.Err.(type) { + case syscall.Errno: + switch err { + case syscall.EPROTONOSUPPORT, syscall.ENOPROTOOPT: + return true + } + } + } + return false +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/nettest/helper_stub.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/nettest/helper_stub.go new file mode 100644 index 0000000..ea61b6f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/nettest/helper_stub.go @@ -0,0 +1,32 @@ +// 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. + +// +build nacl plan9 + +package nettest + +import ( + "fmt" + "runtime" +) + +func maxOpenFiles() int { + return defaultMaxOpenFiles +} + +func supportsRawIPSocket() (string, bool) { + return fmt.Sprintf("not supported on %s", runtime.GOOS), false +} + +func supportsIPv6MulticastDeliveryOnLoopback() bool { + return false +} + +func causesIPv6Crash() bool { + return false +} + +func protocolNotSupported(err error) bool { + return false +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/nettest/helper_unix.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/nettest/helper_unix.go new file mode 100644 index 0000000..ed13e44 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/nettest/helper_unix.go @@ -0,0 +1,29 @@ +// Copyright 2015 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 darwin dragonfly freebsd linux netbsd openbsd solaris + +package nettest + +import ( + "fmt" + "os" + "runtime" + "syscall" +) + +func maxOpenFiles() int { + var rlim syscall.Rlimit + if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rlim); err != nil { + return defaultMaxOpenFiles + } + return int(rlim.Cur) +} + +func supportsRawIPSocket() (string, bool) { + if os.Getuid() != 0 { + return fmt.Sprintf("must be root on %s", runtime.GOOS), false + } + return "", true +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/nettest/helper_windows.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/nettest/helper_windows.go new file mode 100644 index 0000000..3dcb727 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/nettest/helper_windows.go @@ -0,0 +1,42 @@ +// Copyright 2015 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 nettest + +import ( + "fmt" + "runtime" + "syscall" +) + +func maxOpenFiles() int { + return 4 * defaultMaxOpenFiles /* actually it's 16581375 */ +} + +func supportsRawIPSocket() (string, bool) { + // From http://msdn.microsoft.com/en-us/library/windows/desktop/ms740548.aspx: + // Note: To use a socket of type SOCK_RAW requires administrative privileges. + // Users running Winsock applications that use raw sockets must be a member of + // the Administrators group on the local computer, otherwise raw socket calls + // will fail with an error code of WSAEACCES. On Windows Vista and later, access + // for raw sockets is enforced at socket creation. In earlier versions of Windows, + // access for raw sockets is enforced during other socket operations. + s, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_RAW, 0) + if err == syscall.WSAEACCES { + return fmt.Sprintf("no access to raw socket allowed on %s", runtime.GOOS), false + } + if err != nil { + return err.Error(), false + } + syscall.Closesocket(s) + return "", true +} + +func supportsIPv6MulticastDeliveryOnLoopback() bool { + return true +} + +func causesIPv6Crash() bool { + return false +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/nettest/interface.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/nettest/interface.go new file mode 100644 index 0000000..8e6333a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/nettest/interface.go @@ -0,0 +1,94 @@ +// 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 nettest + +import "net" + +// IsMulticastCapable reports whether ifi is an IP multicast-capable +// network interface. Network must be "ip", "ip4" or "ip6". +func IsMulticastCapable(network string, ifi *net.Interface) (net.IP, bool) { + switch network { + case "ip", "ip4", "ip6": + default: + return nil, false + } + if ifi == nil || ifi.Flags&net.FlagUp == 0 || ifi.Flags&net.FlagMulticast == 0 { + return nil, false + } + return hasRoutableIP(network, ifi) +} + +// RoutedInterface returns a network interface that can route IP +// traffic and satisfies flags. It returns nil when an appropriate +// network interface is not found. Network must be "ip", "ip4" or +// "ip6". +func RoutedInterface(network string, flags net.Flags) *net.Interface { + switch network { + case "ip", "ip4", "ip6": + default: + return nil + } + ift, err := net.Interfaces() + if err != nil { + return nil + } + for _, ifi := range ift { + if ifi.Flags&flags != flags { + continue + } + if _, ok := hasRoutableIP(network, &ifi); !ok { + continue + } + return &ifi + } + return nil +} + +func hasRoutableIP(network string, ifi *net.Interface) (net.IP, bool) { + ifat, err := ifi.Addrs() + if err != nil { + return nil, false + } + for _, ifa := range ifat { + switch ifa := ifa.(type) { + case *net.IPAddr: + if ip := routableIP(network, ifa.IP); ip != nil { + return ip, true + } + case *net.IPNet: + if ip := routableIP(network, ifa.IP); ip != nil { + return ip, true + } + } + } + return nil, false +} + +func routableIP(network string, ip net.IP) net.IP { + if !ip.IsLoopback() && !ip.IsLinkLocalUnicast() && !ip.IsGlobalUnicast() { + return nil + } + switch network { + case "ip4": + if ip := ip.To4(); ip != nil { + return ip + } + case "ip6": + if ip.IsLoopback() { // addressing scope of the loopback address depends on each implementation + return nil + } + if ip := ip.To16(); ip != nil && ip.To4() == nil { + return ip + } + default: + if ip := ip.To4(); ip != nil { + return ip + } + if ip := ip.To16(); ip != nil { + return ip + } + } + return nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/nettest/rlimit.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/nettest/rlimit.go new file mode 100644 index 0000000..bb34aec --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/nettest/rlimit.go @@ -0,0 +1,11 @@ +// Copyright 2015 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 nettest + +const defaultMaxOpenFiles = 256 + +// MaxOpenFiles returns the maximum number of open files for the +// caller's process. +func MaxOpenFiles() int { return maxOpenFiles() } diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/nettest/stack.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/nettest/stack.go new file mode 100644 index 0000000..cc92c03 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/nettest/stack.go @@ -0,0 +1,147 @@ +// 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 nettest provides utilities for network testing. +package nettest // import "golang.org/x/net/internal/nettest" + +import ( + "fmt" + "io/ioutil" + "net" + "os" + "runtime" +) + +var ( + supportsIPv4 bool + supportsIPv6 bool +) + +func init() { + if ln, err := net.Listen("tcp4", "127.0.0.1:0"); err == nil { + ln.Close() + supportsIPv4 = true + } + if ln, err := net.Listen("tcp6", "[::1]:0"); err == nil { + ln.Close() + supportsIPv6 = true + } +} + +// SupportsIPv4 reports whether the platform supports IPv4 networking +// functionality. +func SupportsIPv4() bool { return supportsIPv4 } + +// SupportsIPv6 reports whether the platform supports IPv6 networking +// functionality. +func SupportsIPv6() bool { return supportsIPv6 } + +// SupportsRawIPSocket reports whether the platform supports raw IP +// sockets. +func SupportsRawIPSocket() (string, bool) { + return supportsRawIPSocket() +} + +// SupportsIPv6MulticastDeliveryOnLoopback reports whether the +// platform supports IPv6 multicast packet delivery on software +// loopback interface. +func SupportsIPv6MulticastDeliveryOnLoopback() bool { + return supportsIPv6MulticastDeliveryOnLoopback() +} + +// ProtocolNotSupported reports whether err is a protocol not +// supported error. +func ProtocolNotSupported(err error) bool { + return protocolNotSupported(err) +} + +// TestableNetwork reports whether network is testable on the current +// platform configuration. +func TestableNetwork(network string) bool { + // This is based on logic from standard library's + // net/platform_test.go. + switch network { + case "unix", "unixgram": + switch runtime.GOOS { + case "android", "nacl", "plan9", "windows": + return false + } + if runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64") { + return false + } + case "unixpacket": + switch runtime.GOOS { + case "android", "darwin", "freebsd", "nacl", "plan9", "windows": + return false + } + } + return true +} + +// NewLocalListener returns a listener which listens to a loopback IP +// address or local file system path. +// Network must be "tcp", "tcp4", "tcp6", "unix" or "unixpacket". +func NewLocalListener(network string) (net.Listener, error) { + switch network { + case "tcp": + if supportsIPv4 { + if ln, err := net.Listen("tcp4", "127.0.0.1:0"); err == nil { + return ln, nil + } + } + if supportsIPv6 { + return net.Listen("tcp6", "[::1]:0") + } + case "tcp4": + if supportsIPv4 { + return net.Listen("tcp4", "127.0.0.1:0") + } + case "tcp6": + if supportsIPv6 { + return net.Listen("tcp6", "[::1]:0") + } + case "unix", "unixpacket": + return net.Listen(network, localPath()) + } + return nil, fmt.Errorf("%s is not supported", network) +} + +// NewLocalPacketListener returns a packet listener which listens to a +// loopback IP address or local file system path. +// Network must be "udp", "udp4", "udp6" or "unixgram". +func NewLocalPacketListener(network string) (net.PacketConn, error) { + switch network { + case "udp": + if supportsIPv4 { + if c, err := net.ListenPacket("udp4", "127.0.0.1:0"); err == nil { + return c, nil + } + } + if supportsIPv6 { + return net.ListenPacket("udp6", "[::1]:0") + } + case "udp4": + if supportsIPv4 { + return net.ListenPacket("udp4", "127.0.0.1:0") + } + case "udp6": + if supportsIPv6 { + return net.ListenPacket("udp6", "[::1]:0") + } + case "unixgram": + return net.ListenPacket(network, localPath()) + } + return nil, fmt.Errorf("%s is not supported", network) +} + +func localPath() string { + f, err := ioutil.TempFile("", "nettest") + if err != nil { + panic(err) + } + path := f.Name() + f.Close() + os.Remove(path) + return path +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/cmsghdr.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/cmsghdr.go new file mode 100644 index 0000000..1eb07d2 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/cmsghdr.go @@ -0,0 +1,11 @@ +// 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +package socket + +func (h *cmsghdr) len() int { return int(h.Len) } +func (h *cmsghdr) lvl() int { return int(h.Level) } +func (h *cmsghdr) typ() int { return int(h.Type) } diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/cmsghdr_bsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/cmsghdr_bsd.go new file mode 100644 index 0000000..d1d0c2d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/cmsghdr_bsd.go @@ -0,0 +1,13 @@ +// 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. + +// +build darwin dragonfly freebsd netbsd openbsd + +package socket + +func (h *cmsghdr) set(l, lvl, typ int) { + h.Len = uint32(l) + h.Level = int32(lvl) + h.Type = int32(typ) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_32bit.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_32bit.go new file mode 100644 index 0000000..bac6681 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_32bit.go @@ -0,0 +1,14 @@ +// 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. + +// +build arm mips mipsle 386 +// +build linux + +package socket + +func (h *cmsghdr) set(l, lvl, typ int) { + h.Len = uint32(l) + h.Level = int32(lvl) + h.Type = int32(typ) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_64bit.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_64bit.go new file mode 100644 index 0000000..63f0534 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_64bit.go @@ -0,0 +1,14 @@ +// 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. + +// +build arm64 amd64 ppc64 ppc64le mips64 mips64le s390x +// +build linux + +package socket + +func (h *cmsghdr) set(l, lvl, typ int) { + h.Len = uint64(l) + h.Level = int32(lvl) + h.Type = int32(typ) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/cmsghdr_solaris_64bit.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/cmsghdr_solaris_64bit.go new file mode 100644 index 0000000..7dedd43 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/cmsghdr_solaris_64bit.go @@ -0,0 +1,14 @@ +// 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. + +// +build amd64 +// +build solaris + +package socket + +func (h *cmsghdr) set(l, lvl, typ int) { + h.Len = uint32(l) + h.Level = int32(lvl) + h.Type = int32(typ) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/cmsghdr_stub.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/cmsghdr_stub.go new file mode 100644 index 0000000..a4e7122 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/cmsghdr_stub.go @@ -0,0 +1,17 @@ +// 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. + +// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris + +package socket + +type cmsghdr struct{} + +const sizeofCmsghdr = 0 + +func (h *cmsghdr) len() int { return 0 } +func (h *cmsghdr) lvl() int { return 0 } +func (h *cmsghdr) typ() int { return 0 } + +func (h *cmsghdr) set(l, lvl, typ int) {} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/defs_darwin.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/defs_darwin.go new file mode 100644 index 0000000..14e28c0 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/defs_darwin.go @@ -0,0 +1,44 @@ +// 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. + +// +build ignore + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package socket + +/* +#include + +#include +*/ +import "C" + +const ( + sysAF_UNSPEC = C.AF_UNSPEC + sysAF_INET = C.AF_INET + sysAF_INET6 = C.AF_INET6 + + sysSOCK_RAW = C.SOCK_RAW +) + +type iovec C.struct_iovec + +type msghdr C.struct_msghdr + +type cmsghdr C.struct_cmsghdr + +type sockaddrInet C.struct_sockaddr_in + +type sockaddrInet6 C.struct_sockaddr_in6 + +const ( + sizeofIovec = C.sizeof_struct_iovec + sizeofMsghdr = C.sizeof_struct_msghdr + sizeofCmsghdr = C.sizeof_struct_cmsghdr + + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/defs_dragonfly.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/defs_dragonfly.go new file mode 100644 index 0000000..14e28c0 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/defs_dragonfly.go @@ -0,0 +1,44 @@ +// 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. + +// +build ignore + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package socket + +/* +#include + +#include +*/ +import "C" + +const ( + sysAF_UNSPEC = C.AF_UNSPEC + sysAF_INET = C.AF_INET + sysAF_INET6 = C.AF_INET6 + + sysSOCK_RAW = C.SOCK_RAW +) + +type iovec C.struct_iovec + +type msghdr C.struct_msghdr + +type cmsghdr C.struct_cmsghdr + +type sockaddrInet C.struct_sockaddr_in + +type sockaddrInet6 C.struct_sockaddr_in6 + +const ( + sizeofIovec = C.sizeof_struct_iovec + sizeofMsghdr = C.sizeof_struct_msghdr + sizeofCmsghdr = C.sizeof_struct_cmsghdr + + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/defs_freebsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/defs_freebsd.go new file mode 100644 index 0000000..14e28c0 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/defs_freebsd.go @@ -0,0 +1,44 @@ +// 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. + +// +build ignore + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package socket + +/* +#include + +#include +*/ +import "C" + +const ( + sysAF_UNSPEC = C.AF_UNSPEC + sysAF_INET = C.AF_INET + sysAF_INET6 = C.AF_INET6 + + sysSOCK_RAW = C.SOCK_RAW +) + +type iovec C.struct_iovec + +type msghdr C.struct_msghdr + +type cmsghdr C.struct_cmsghdr + +type sockaddrInet C.struct_sockaddr_in + +type sockaddrInet6 C.struct_sockaddr_in6 + +const ( + sizeofIovec = C.sizeof_struct_iovec + sizeofMsghdr = C.sizeof_struct_msghdr + sizeofCmsghdr = C.sizeof_struct_cmsghdr + + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/defs_linux.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/defs_linux.go new file mode 100644 index 0000000..ce9ec2f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/defs_linux.go @@ -0,0 +1,49 @@ +// 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. + +// +build ignore + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package socket + +/* +#include +#include + +#define _GNU_SOURCE +#include +*/ +import "C" + +const ( + sysAF_UNSPEC = C.AF_UNSPEC + sysAF_INET = C.AF_INET + sysAF_INET6 = C.AF_INET6 + + sysSOCK_RAW = C.SOCK_RAW +) + +type iovec C.struct_iovec + +type msghdr C.struct_msghdr + +type mmsghdr C.struct_mmsghdr + +type cmsghdr C.struct_cmsghdr + +type sockaddrInet C.struct_sockaddr_in + +type sockaddrInet6 C.struct_sockaddr_in6 + +const ( + sizeofIovec = C.sizeof_struct_iovec + sizeofMsghdr = C.sizeof_struct_msghdr + sizeofMmsghdr = C.sizeof_struct_mmsghdr + sizeofCmsghdr = C.sizeof_struct_cmsghdr + + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/defs_netbsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/defs_netbsd.go new file mode 100644 index 0000000..3f84335 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/defs_netbsd.go @@ -0,0 +1,47 @@ +// 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. + +// +build ignore + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package socket + +/* +#include + +#include +*/ +import "C" + +const ( + sysAF_UNSPEC = C.AF_UNSPEC + sysAF_INET = C.AF_INET + sysAF_INET6 = C.AF_INET6 + + sysSOCK_RAW = C.SOCK_RAW +) + +type iovec C.struct_iovec + +type msghdr C.struct_msghdr + +type mmsghdr C.struct_mmsghdr + +type cmsghdr C.struct_cmsghdr + +type sockaddrInet C.struct_sockaddr_in + +type sockaddrInet6 C.struct_sockaddr_in6 + +const ( + sizeofIovec = C.sizeof_struct_iovec + sizeofMsghdr = C.sizeof_struct_msghdr + sizeofMmsghdr = C.sizeof_struct_mmsghdr + sizeofCmsghdr = C.sizeof_struct_cmsghdr + + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/defs_openbsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/defs_openbsd.go new file mode 100644 index 0000000..14e28c0 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/defs_openbsd.go @@ -0,0 +1,44 @@ +// 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. + +// +build ignore + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package socket + +/* +#include + +#include +*/ +import "C" + +const ( + sysAF_UNSPEC = C.AF_UNSPEC + sysAF_INET = C.AF_INET + sysAF_INET6 = C.AF_INET6 + + sysSOCK_RAW = C.SOCK_RAW +) + +type iovec C.struct_iovec + +type msghdr C.struct_msghdr + +type cmsghdr C.struct_cmsghdr + +type sockaddrInet C.struct_sockaddr_in + +type sockaddrInet6 C.struct_sockaddr_in6 + +const ( + sizeofIovec = C.sizeof_struct_iovec + sizeofMsghdr = C.sizeof_struct_msghdr + sizeofCmsghdr = C.sizeof_struct_cmsghdr + + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/defs_solaris.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/defs_solaris.go new file mode 100644 index 0000000..14e28c0 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/defs_solaris.go @@ -0,0 +1,44 @@ +// 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. + +// +build ignore + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package socket + +/* +#include + +#include +*/ +import "C" + +const ( + sysAF_UNSPEC = C.AF_UNSPEC + sysAF_INET = C.AF_INET + sysAF_INET6 = C.AF_INET6 + + sysSOCK_RAW = C.SOCK_RAW +) + +type iovec C.struct_iovec + +type msghdr C.struct_msghdr + +type cmsghdr C.struct_cmsghdr + +type sockaddrInet C.struct_sockaddr_in + +type sockaddrInet6 C.struct_sockaddr_in6 + +const ( + sizeofIovec = C.sizeof_struct_iovec + sizeofMsghdr = C.sizeof_struct_msghdr + sizeofCmsghdr = C.sizeof_struct_cmsghdr + + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/error_unix.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/error_unix.go new file mode 100644 index 0000000..93dff91 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/error_unix.go @@ -0,0 +1,31 @@ +// 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +package socket + +import "syscall" + +var ( + errEAGAIN error = syscall.EAGAIN + errEINVAL error = syscall.EINVAL + errENOENT error = syscall.ENOENT +) + +// errnoErr returns common boxed Errno values, to prevent allocations +// at runtime. +func errnoErr(errno syscall.Errno) error { + switch errno { + case 0: + return nil + case syscall.EAGAIN: + return errEAGAIN + case syscall.EINVAL: + return errEINVAL + case syscall.ENOENT: + return errENOENT + } + return errno +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/error_windows.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/error_windows.go new file mode 100644 index 0000000..6a6379a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/error_windows.go @@ -0,0 +1,26 @@ +// 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 socket + +import "syscall" + +var ( + errERROR_IO_PENDING error = syscall.ERROR_IO_PENDING + errEINVAL error = syscall.EINVAL +) + +// errnoErr returns common boxed Errno values, to prevent allocations +// at runtime. +func errnoErr(errno syscall.Errno) error { + switch errno { + case 0: + return nil + case syscall.ERROR_IO_PENDING: + return errERROR_IO_PENDING + case syscall.EINVAL: + return errEINVAL + } + return errno +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/iovec_32bit.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/iovec_32bit.go new file mode 100644 index 0000000..05d6082 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/iovec_32bit.go @@ -0,0 +1,19 @@ +// 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. + +// +build arm mips mipsle 386 +// +build darwin dragonfly freebsd linux netbsd openbsd + +package socket + +import "unsafe" + +func (v *iovec) set(b []byte) { + l := len(b) + if l == 0 { + return + } + v.Base = (*byte)(unsafe.Pointer(&b[0])) + v.Len = uint32(l) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/iovec_64bit.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/iovec_64bit.go new file mode 100644 index 0000000..afb34ad --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/iovec_64bit.go @@ -0,0 +1,19 @@ +// 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. + +// +build arm64 amd64 ppc64 ppc64le mips64 mips64le s390x +// +build darwin dragonfly freebsd linux netbsd openbsd + +package socket + +import "unsafe" + +func (v *iovec) set(b []byte) { + l := len(b) + if l == 0 { + return + } + v.Base = (*byte)(unsafe.Pointer(&b[0])) + v.Len = uint64(l) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/iovec_solaris_64bit.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/iovec_solaris_64bit.go new file mode 100644 index 0000000..8d17a40 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/iovec_solaris_64bit.go @@ -0,0 +1,19 @@ +// 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. + +// +build amd64 +// +build solaris + +package socket + +import "unsafe" + +func (v *iovec) set(b []byte) { + l := len(b) + if l == 0 { + return + } + v.Base = (*int8)(unsafe.Pointer(&b[0])) + v.Len = uint64(l) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/iovec_stub.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/iovec_stub.go new file mode 100644 index 0000000..c87d2a9 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/iovec_stub.go @@ -0,0 +1,11 @@ +// 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. + +// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris + +package socket + +type iovec struct{} + +func (v *iovec) set(b []byte) {} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/mmsghdr_stub.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/mmsghdr_stub.go new file mode 100644 index 0000000..2e80a9c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/mmsghdr_stub.go @@ -0,0 +1,21 @@ +// 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. + +// +build !linux,!netbsd + +package socket + +import "net" + +type mmsghdr struct{} + +type mmsghdrs []mmsghdr + +func (hs mmsghdrs) pack(ms []Message, parseFn func([]byte, string) (net.Addr, error), marshalFn func(net.Addr) []byte) error { + return nil +} + +func (hs mmsghdrs) unpack(ms []Message, parseFn func([]byte, string) (net.Addr, error), hint string) error { + return nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/mmsghdr_unix.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/mmsghdr_unix.go new file mode 100644 index 0000000..3c42ea7 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/mmsghdr_unix.go @@ -0,0 +1,42 @@ +// 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. + +// +build linux netbsd + +package socket + +import "net" + +type mmsghdrs []mmsghdr + +func (hs mmsghdrs) pack(ms []Message, parseFn func([]byte, string) (net.Addr, error), marshalFn func(net.Addr) []byte) error { + for i := range hs { + vs := make([]iovec, len(ms[i].Buffers)) + var sa []byte + if parseFn != nil { + sa = make([]byte, sizeofSockaddrInet6) + } + if marshalFn != nil { + sa = marshalFn(ms[i].Addr) + } + hs[i].Hdr.pack(vs, ms[i].Buffers, ms[i].OOB, sa) + } + return nil +} + +func (hs mmsghdrs) unpack(ms []Message, parseFn func([]byte, string) (net.Addr, error), hint string) error { + for i := range hs { + ms[i].N = int(hs[i].Len) + ms[i].NN = hs[i].Hdr.controllen() + ms[i].Flags = hs[i].Hdr.flags() + if parseFn != nil { + var err error + ms[i].Addr, err = parseFn(hs[i].Hdr.name(), hint) + if err != nil { + return err + } + } + } + return nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/msghdr_bsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/msghdr_bsd.go new file mode 100644 index 0000000..5567afc --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/msghdr_bsd.go @@ -0,0 +1,39 @@ +// 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. + +// +build darwin dragonfly freebsd netbsd openbsd + +package socket + +import "unsafe" + +func (h *msghdr) pack(vs []iovec, bs [][]byte, oob []byte, sa []byte) { + for i := range vs { + vs[i].set(bs[i]) + } + h.setIov(vs) + if len(oob) > 0 { + h.Control = (*byte)(unsafe.Pointer(&oob[0])) + h.Controllen = uint32(len(oob)) + } + if sa != nil { + h.Name = (*byte)(unsafe.Pointer(&sa[0])) + h.Namelen = uint32(len(sa)) + } +} + +func (h *msghdr) name() []byte { + if h.Name != nil && h.Namelen > 0 { + return (*[sizeofSockaddrInet6]byte)(unsafe.Pointer(h.Name))[:h.Namelen] + } + return nil +} + +func (h *msghdr) controllen() int { + return int(h.Controllen) +} + +func (h *msghdr) flags() int { + return int(h.Flags) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/msghdr_bsdvar.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/msghdr_bsdvar.go new file mode 100644 index 0000000..b8c87b7 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/msghdr_bsdvar.go @@ -0,0 +1,16 @@ +// 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. + +// +build darwin dragonfly freebsd netbsd + +package socket + +func (h *msghdr) setIov(vs []iovec) { + l := len(vs) + if l == 0 { + return + } + h.Iov = &vs[0] + h.Iovlen = int32(l) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/msghdr_linux.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/msghdr_linux.go new file mode 100644 index 0000000..5a38798 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/msghdr_linux.go @@ -0,0 +1,36 @@ +// 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 socket + +import "unsafe" + +func (h *msghdr) pack(vs []iovec, bs [][]byte, oob []byte, sa []byte) { + for i := range vs { + vs[i].set(bs[i]) + } + h.setIov(vs) + if len(oob) > 0 { + h.setControl(oob) + } + if sa != nil { + h.Name = (*byte)(unsafe.Pointer(&sa[0])) + h.Namelen = uint32(len(sa)) + } +} + +func (h *msghdr) name() []byte { + if h.Name != nil && h.Namelen > 0 { + return (*[sizeofSockaddrInet6]byte)(unsafe.Pointer(h.Name))[:h.Namelen] + } + return nil +} + +func (h *msghdr) controllen() int { + return int(h.Controllen) +} + +func (h *msghdr) flags() int { + return int(h.Flags) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/msghdr_linux_32bit.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/msghdr_linux_32bit.go new file mode 100644 index 0000000..a7a5987 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/msghdr_linux_32bit.go @@ -0,0 +1,24 @@ +// 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. + +// +build arm mips mipsle 386 +// +build linux + +package socket + +import "unsafe" + +func (h *msghdr) setIov(vs []iovec) { + l := len(vs) + if l == 0 { + return + } + h.Iov = &vs[0] + h.Iovlen = uint32(l) +} + +func (h *msghdr) setControl(b []byte) { + h.Control = (*byte)(unsafe.Pointer(&b[0])) + h.Controllen = uint32(len(b)) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/msghdr_linux_64bit.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/msghdr_linux_64bit.go new file mode 100644 index 0000000..610fc4f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/msghdr_linux_64bit.go @@ -0,0 +1,24 @@ +// 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. + +// +build arm64 amd64 ppc64 ppc64le mips64 mips64le s390x +// +build linux + +package socket + +import "unsafe" + +func (h *msghdr) setIov(vs []iovec) { + l := len(vs) + if l == 0 { + return + } + h.Iov = &vs[0] + h.Iovlen = uint64(l) +} + +func (h *msghdr) setControl(b []byte) { + h.Control = (*byte)(unsafe.Pointer(&b[0])) + h.Controllen = uint64(len(b)) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/msghdr_openbsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/msghdr_openbsd.go new file mode 100644 index 0000000..71a69e2 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/msghdr_openbsd.go @@ -0,0 +1,14 @@ +// 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 socket + +func (h *msghdr) setIov(vs []iovec) { + l := len(vs) + if l == 0 { + return + } + h.Iov = &vs[0] + h.Iovlen = uint32(l) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/msghdr_solaris_64bit.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/msghdr_solaris_64bit.go new file mode 100644 index 0000000..6465b20 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/msghdr_solaris_64bit.go @@ -0,0 +1,36 @@ +// 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. + +// +build amd64 +// +build solaris + +package socket + +import "unsafe" + +func (h *msghdr) pack(vs []iovec, bs [][]byte, oob []byte, sa []byte) { + for i := range vs { + vs[i].set(bs[i]) + } + if len(vs) > 0 { + h.Iov = &vs[0] + h.Iovlen = int32(len(vs)) + } + if len(oob) > 0 { + h.Accrights = (*int8)(unsafe.Pointer(&oob[0])) + h.Accrightslen = int32(len(oob)) + } + if sa != nil { + h.Name = (*byte)(unsafe.Pointer(&sa[0])) + h.Namelen = uint32(len(sa)) + } +} + +func (h *msghdr) controllen() int { + return int(h.Accrightslen) +} + +func (h *msghdr) flags() int { + return int(NativeEndian.Uint32(h.Pad_cgo_2[:])) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/msghdr_stub.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/msghdr_stub.go new file mode 100644 index 0000000..64e8173 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/msghdr_stub.go @@ -0,0 +1,14 @@ +// 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. + +// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris + +package socket + +type msghdr struct{} + +func (h *msghdr) pack(vs []iovec, bs [][]byte, oob []byte, sa []byte) {} +func (h *msghdr) name() []byte { return nil } +func (h *msghdr) controllen() int { return 0 } +func (h *msghdr) flags() int { return 0 } diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/rawconn.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/rawconn.go new file mode 100644 index 0000000..d6871d5 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/rawconn.go @@ -0,0 +1,66 @@ +// 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. + +// +build go1.9 + +package socket + +import ( + "errors" + "net" + "os" + "syscall" +) + +// A Conn represents a raw connection. +type Conn struct { + network string + c syscall.RawConn +} + +// NewConn returns a new raw connection. +func NewConn(c net.Conn) (*Conn, error) { + var err error + var cc Conn + switch c := c.(type) { + case *net.TCPConn: + cc.network = "tcp" + cc.c, err = c.SyscallConn() + case *net.UDPConn: + cc.network = "udp" + cc.c, err = c.SyscallConn() + case *net.IPConn: + cc.network = "ip" + cc.c, err = c.SyscallConn() + default: + return nil, errors.New("unknown connection type") + } + if err != nil { + return nil, err + } + return &cc, nil +} + +func (o *Option) get(c *Conn, b []byte) (int, error) { + var operr error + var n int + fn := func(s uintptr) { + n, operr = getsockopt(s, o.Level, o.Name, b) + } + if err := c.c.Control(fn); err != nil { + return 0, err + } + return n, os.NewSyscallError("getsockopt", operr) +} + +func (o *Option) set(c *Conn, b []byte) error { + var operr error + fn := func(s uintptr) { + operr = setsockopt(s, o.Level, o.Name, b) + } + if err := c.c.Control(fn); err != nil { + return err + } + return os.NewSyscallError("setsockopt", operr) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/rawconn_mmsg.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/rawconn_mmsg.go new file mode 100644 index 0000000..499164a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/rawconn_mmsg.go @@ -0,0 +1,74 @@ +// 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. + +// +build go1.9 +// +build linux + +package socket + +import ( + "net" + "os" + "syscall" +) + +func (c *Conn) recvMsgs(ms []Message, flags int) (int, error) { + hs := make(mmsghdrs, len(ms)) + var parseFn func([]byte, string) (net.Addr, error) + if c.network != "tcp" { + parseFn = parseInetAddr + } + if err := hs.pack(ms, parseFn, nil); err != nil { + return 0, err + } + var operr error + var n int + fn := func(s uintptr) bool { + n, operr = recvmmsg(s, hs, flags) + if operr == syscall.EAGAIN { + return false + } + return true + } + if err := c.c.Read(fn); err != nil { + return n, err + } + if operr != nil { + return n, os.NewSyscallError("recvmmsg", operr) + } + if err := hs[:n].unpack(ms[:n], parseFn, c.network); err != nil { + return n, err + } + return n, nil +} + +func (c *Conn) sendMsgs(ms []Message, flags int) (int, error) { + hs := make(mmsghdrs, len(ms)) + var marshalFn func(net.Addr) []byte + if c.network != "tcp" { + marshalFn = marshalInetAddr + } + if err := hs.pack(ms, nil, marshalFn); err != nil { + return 0, err + } + var operr error + var n int + fn := func(s uintptr) bool { + n, operr = sendmmsg(s, hs, flags) + if operr == syscall.EAGAIN { + return false + } + return true + } + if err := c.c.Write(fn); err != nil { + return n, err + } + if operr != nil { + return n, os.NewSyscallError("sendmmsg", operr) + } + if err := hs[:n].unpack(ms[:n], nil, ""); err != nil { + return n, err + } + return n, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/rawconn_msg.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/rawconn_msg.go new file mode 100644 index 0000000..b21d2e6 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/rawconn_msg.go @@ -0,0 +1,77 @@ +// 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. + +// +build go1.9 +// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows + +package socket + +import ( + "os" + "syscall" +) + +func (c *Conn) recvMsg(m *Message, flags int) error { + var h msghdr + vs := make([]iovec, len(m.Buffers)) + var sa []byte + if c.network != "tcp" { + sa = make([]byte, sizeofSockaddrInet6) + } + h.pack(vs, m.Buffers, m.OOB, sa) + var operr error + var n int + fn := func(s uintptr) bool { + n, operr = recvmsg(s, &h, flags) + if operr == syscall.EAGAIN { + return false + } + return true + } + if err := c.c.Read(fn); err != nil { + return err + } + if operr != nil { + return os.NewSyscallError("recvmsg", operr) + } + if c.network != "tcp" { + var err error + m.Addr, err = parseInetAddr(sa[:], c.network) + if err != nil { + return err + } + } + m.N = n + m.NN = h.controllen() + m.Flags = h.flags() + return nil +} + +func (c *Conn) sendMsg(m *Message, flags int) error { + var h msghdr + vs := make([]iovec, len(m.Buffers)) + var sa []byte + if m.Addr != nil { + sa = marshalInetAddr(m.Addr) + } + h.pack(vs, m.Buffers, m.OOB, sa) + var operr error + var n int + fn := func(s uintptr) bool { + n, operr = sendmsg(s, &h, flags) + if operr == syscall.EAGAIN { + return false + } + return true + } + if err := c.c.Write(fn); err != nil { + return err + } + if operr != nil { + return os.NewSyscallError("sendmsg", operr) + } + m.N = n + m.NN = len(m.OOB) + return nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/rawconn_nommsg.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/rawconn_nommsg.go new file mode 100644 index 0000000..f78832a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/rawconn_nommsg.go @@ -0,0 +1,18 @@ +// 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. + +// +build go1.9 +// +build !linux + +package socket + +import "errors" + +func (c *Conn) recvMsgs(ms []Message, flags int) (int, error) { + return 0, errors.New("not implemented") +} + +func (c *Conn) sendMsgs(ms []Message, flags int) (int, error) { + return 0, errors.New("not implemented") +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/rawconn_nomsg.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/rawconn_nomsg.go new file mode 100644 index 0000000..96733cb --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/rawconn_nomsg.go @@ -0,0 +1,18 @@ +// 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. + +// +build go1.9 +// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows + +package socket + +import "errors" + +func (c *Conn) recvMsg(m *Message, flags int) error { + return errors.New("not implemented") +} + +func (c *Conn) sendMsg(m *Message, flags int) error { + return errors.New("not implemented") +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/rawconn_stub.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/rawconn_stub.go new file mode 100644 index 0000000..d2add1a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/rawconn_stub.go @@ -0,0 +1,25 @@ +// 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. + +// +build !go1.9 + +package socket + +import "errors" + +func (c *Conn) recvMsg(m *Message, flags int) error { + return errors.New("not implemented") +} + +func (c *Conn) sendMsg(m *Message, flags int) error { + return errors.New("not implemented") +} + +func (c *Conn) recvMsgs(ms []Message, flags int) (int, error) { + return 0, errors.New("not implemented") +} + +func (c *Conn) sendMsgs(ms []Message, flags int) (int, error) { + return 0, errors.New("not implemented") +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/reflect.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/reflect.go new file mode 100644 index 0000000..bb179f1 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/reflect.go @@ -0,0 +1,62 @@ +// 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. + +// +build !go1.9 + +package socket + +import ( + "errors" + "net" + "os" + "reflect" + "runtime" +) + +// A Conn represents a raw connection. +type Conn struct { + c net.Conn +} + +// NewConn returns a new raw connection. +func NewConn(c net.Conn) (*Conn, error) { + return &Conn{c: c}, nil +} + +func (o *Option) get(c *Conn, b []byte) (int, error) { + s, err := socketOf(c.c) + if err != nil { + return 0, err + } + n, err := getsockopt(s, o.Level, o.Name, b) + return n, os.NewSyscallError("getsockopt", err) +} + +func (o *Option) set(c *Conn, b []byte) error { + s, err := socketOf(c.c) + if err != nil { + return err + } + return os.NewSyscallError("setsockopt", setsockopt(s, o.Level, o.Name, b)) +} + +func socketOf(c net.Conn) (uintptr, error) { + switch c.(type) { + case *net.TCPConn, *net.UDPConn, *net.IPConn: + v := reflect.ValueOf(c) + switch e := v.Elem(); e.Kind() { + case reflect.Struct: + fd := e.FieldByName("conn").FieldByName("fd") + switch e := fd.Elem(); e.Kind() { + case reflect.Struct: + sysfd := e.FieldByName("sysfd") + if runtime.GOOS == "windows" { + return uintptr(sysfd.Uint()), nil + } + return uintptr(sysfd.Int()), nil + } + } + } + return 0, errors.New("invalid type") +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/socket.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/socket.go new file mode 100644 index 0000000..729dea1 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/socket.go @@ -0,0 +1,285 @@ +// 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 socket provides a portable interface for socket system +// calls. +package socket // import "golang.org/x/net/internal/socket" + +import ( + "errors" + "net" + "unsafe" +) + +// An Option represents a sticky socket option. +type Option struct { + Level int // level + Name int // name; must be equal or greater than 1 + Len int // length of value in bytes; must be equal or greater than 1 +} + +// Get reads a value for the option from the kernel. +// It returns the number of bytes written into b. +func (o *Option) Get(c *Conn, b []byte) (int, error) { + if o.Name < 1 || o.Len < 1 { + return 0, errors.New("invalid option") + } + if len(b) < o.Len { + return 0, errors.New("short buffer") + } + return o.get(c, b) +} + +// GetInt returns an integer value for the option. +// +// The Len field of Option must be either 1 or 4. +func (o *Option) GetInt(c *Conn) (int, error) { + if o.Len != 1 && o.Len != 4 { + return 0, errors.New("invalid option") + } + var b []byte + var bb [4]byte + if o.Len == 1 { + b = bb[:1] + } else { + b = bb[:4] + } + n, err := o.get(c, b) + if err != nil { + return 0, err + } + if n != o.Len { + return 0, errors.New("invalid option length") + } + if o.Len == 1 { + return int(b[0]), nil + } + return int(NativeEndian.Uint32(b[:4])), nil +} + +// Set writes the option and value to the kernel. +func (o *Option) Set(c *Conn, b []byte) error { + if o.Name < 1 || o.Len < 1 { + return errors.New("invalid option") + } + if len(b) < o.Len { + return errors.New("short buffer") + } + return o.set(c, b) +} + +// SetInt writes the option and value to the kernel. +// +// The Len field of Option must be either 1 or 4. +func (o *Option) SetInt(c *Conn, v int) error { + if o.Len != 1 && o.Len != 4 { + return errors.New("invalid option") + } + var b []byte + if o.Len == 1 { + b = []byte{byte(v)} + } else { + var bb [4]byte + NativeEndian.PutUint32(bb[:o.Len], uint32(v)) + b = bb[:4] + } + return o.set(c, b) +} + +func controlHeaderLen() int { + return roundup(sizeofCmsghdr) +} + +func controlMessageLen(dataLen int) int { + return roundup(sizeofCmsghdr) + dataLen +} + +// ControlMessageSpace returns the whole length of control message. +func ControlMessageSpace(dataLen int) int { + return roundup(sizeofCmsghdr) + roundup(dataLen) +} + +// A ControlMessage represents the head message in a stream of control +// messages. +// +// A control message comprises of a header, data and a few padding +// fields to conform to the interface to the kernel. +// +// See RFC 3542 for further information. +type ControlMessage []byte + +// Data returns the data field of the control message at the head on +// w. +func (m ControlMessage) Data(dataLen int) []byte { + l := controlHeaderLen() + if len(m) < l || len(m) < l+dataLen { + return nil + } + return m[l : l+dataLen] +} + +// Next returns the control message at the next on w. +// +// Next works only for standard control messages. +func (m ControlMessage) Next(dataLen int) ControlMessage { + l := ControlMessageSpace(dataLen) + if len(m) < l { + return nil + } + return m[l:] +} + +// MarshalHeader marshals the header fields of the control message at +// the head on w. +func (m ControlMessage) MarshalHeader(lvl, typ, dataLen int) error { + if len(m) < controlHeaderLen() { + return errors.New("short message") + } + h := (*cmsghdr)(unsafe.Pointer(&m[0])) + h.set(controlMessageLen(dataLen), lvl, typ) + return nil +} + +// ParseHeader parses and returns the header fields of the control +// message at the head on w. +func (m ControlMessage) ParseHeader() (lvl, typ, dataLen int, err error) { + l := controlHeaderLen() + if len(m) < l { + return 0, 0, 0, errors.New("short message") + } + h := (*cmsghdr)(unsafe.Pointer(&m[0])) + return h.lvl(), h.typ(), int(uint64(h.len()) - uint64(l)), nil +} + +// Marshal marshals the control message at the head on w, and returns +// the next control message. +func (m ControlMessage) Marshal(lvl, typ int, data []byte) (ControlMessage, error) { + l := len(data) + if len(m) < ControlMessageSpace(l) { + return nil, errors.New("short message") + } + h := (*cmsghdr)(unsafe.Pointer(&m[0])) + h.set(controlMessageLen(l), lvl, typ) + if l > 0 { + copy(m.Data(l), data) + } + return m.Next(l), nil +} + +// Parse parses w as a single or multiple control messages. +// +// Parse works for both standard and compatible messages. +func (m ControlMessage) Parse() ([]ControlMessage, error) { + var ms []ControlMessage + for len(m) >= controlHeaderLen() { + h := (*cmsghdr)(unsafe.Pointer(&m[0])) + l := h.len() + if l <= 0 { + return nil, errors.New("invalid header length") + } + if uint64(l) < uint64(controlHeaderLen()) { + return nil, errors.New("invalid message length") + } + if uint64(l) > uint64(len(m)) { + return nil, errors.New("short buffer") + } + // On message reception: + // + // |<- ControlMessageSpace --------------->| + // |<- controlMessageLen ---------->| | + // |<- controlHeaderLen ->| | | + // +---------------+------+---------+------+ + // | Header | PadH | Data | PadD | + // +---------------+------+---------+------+ + // + // On compatible message reception: + // + // | ... |<- controlMessageLen ----------->| + // | ... |<- controlHeaderLen ->| | + // +-----+---------------+------+----------+ + // | ... | Header | PadH | Data | + // +-----+---------------+------+----------+ + ms = append(ms, ControlMessage(m[:l])) + ll := l - controlHeaderLen() + if len(m) >= ControlMessageSpace(ll) { + m = m[ControlMessageSpace(ll):] + } else { + m = m[controlMessageLen(ll):] + } + } + return ms, nil +} + +// NewControlMessage returns a new stream of control messages. +func NewControlMessage(dataLen []int) ControlMessage { + var l int + for i := range dataLen { + l += ControlMessageSpace(dataLen[i]) + } + return make([]byte, l) +} + +// A Message represents an IO message. +type Message struct { + // When writing, the Buffers field must contain at least one + // byte to write. + // When reading, the Buffers field will always contain a byte + // to read. + Buffers [][]byte + + // OOB contains protocol-specific control or miscellaneous + // ancillary data known as out-of-band data. + OOB []byte + + // Addr specifies a destination address when writing. + // It can be nil when the underlying protocol of the raw + // connection uses connection-oriented communication. + // After a successful read, it may contain the source address + // on the received packet. + Addr net.Addr + + N int // # of bytes read or written from/to Buffers + NN int // # of bytes read or written from/to OOB + Flags int // protocol-specific information on the received message +} + +// RecvMsg wraps recvmsg system call. +// +// The provided flags is a set of platform-dependent flags, such as +// syscall.MSG_PEEK. +func (c *Conn) RecvMsg(m *Message, flags int) error { + return c.recvMsg(m, flags) +} + +// SendMsg wraps sendmsg system call. +// +// The provided flags is a set of platform-dependent flags, such as +// syscall.MSG_DONTROUTE. +func (c *Conn) SendMsg(m *Message, flags int) error { + return c.sendMsg(m, flags) +} + +// RecvMsgs wraps recvmmsg system call. +// +// It returns the number of processed messages. +// +// The provided flags is a set of platform-dependent flags, such as +// syscall.MSG_PEEK. +// +// Only Linux supports this. +func (c *Conn) RecvMsgs(ms []Message, flags int) (int, error) { + return c.recvMsgs(ms, flags) +} + +// SendMsgs wraps sendmmsg system call. +// +// It returns the number of processed messages. +// +// The provided flags is a set of platform-dependent flags, such as +// syscall.MSG_DONTROUTE. +// +// Only Linux supports this. +func (c *Conn) SendMsgs(ms []Message, flags int) (int, error) { + return c.sendMsgs(ms, flags) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/socket_go1_9_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/socket_go1_9_test.go new file mode 100644 index 0000000..c4edd4a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/socket_go1_9_test.go @@ -0,0 +1,259 @@ +// 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. + +// +build go1.9 +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +package socket_test + +import ( + "bytes" + "fmt" + "net" + "runtime" + "testing" + + "golang.org/x/net/internal/nettest" + "golang.org/x/net/internal/socket" +) + +type mockControl struct { + Level int + Type int + Data []byte +} + +func TestControlMessage(t *testing.T) { + for _, tt := range []struct { + cs []mockControl + }{ + { + []mockControl{ + {Level: 1, Type: 1}, + }, + }, + { + []mockControl{ + {Level: 2, Type: 2, Data: []byte{0xfe}}, + }, + }, + { + []mockControl{ + {Level: 3, Type: 3, Data: []byte{0xfe, 0xff, 0xff, 0xfe}}, + }, + }, + { + []mockControl{ + {Level: 4, Type: 4, Data: []byte{0xfe, 0xff, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xfe}}, + }, + }, + { + []mockControl{ + {Level: 4, Type: 4, Data: []byte{0xfe, 0xff, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xfe}}, + {Level: 2, Type: 2, Data: []byte{0xfe}}, + }, + }, + } { + var w []byte + var tailPadLen int + mm := socket.NewControlMessage([]int{0}) + for i, c := range tt.cs { + m := socket.NewControlMessage([]int{len(c.Data)}) + l := len(m) - len(mm) + if i == len(tt.cs)-1 && l > len(c.Data) { + tailPadLen = l - len(c.Data) + } + w = append(w, m...) + } + + var err error + ww := make([]byte, len(w)) + copy(ww, w) + m := socket.ControlMessage(ww) + for _, c := range tt.cs { + if err = m.MarshalHeader(c.Level, c.Type, len(c.Data)); err != nil { + t.Fatalf("(%v).MarshalHeader() = %v", tt.cs, err) + } + copy(m.Data(len(c.Data)), c.Data) + m = m.Next(len(c.Data)) + } + m = socket.ControlMessage(w) + for _, c := range tt.cs { + m, err = m.Marshal(c.Level, c.Type, c.Data) + if err != nil { + t.Fatalf("(%v).Marshal() = %v", tt.cs, err) + } + } + if !bytes.Equal(ww, w) { + t.Fatalf("got %#v; want %#v", ww, w) + } + + ws := [][]byte{w} + if tailPadLen > 0 { + // Test a message with no tail padding. + nopad := w[:len(w)-tailPadLen] + ws = append(ws, [][]byte{nopad}...) + } + for _, w := range ws { + ms, err := socket.ControlMessage(w).Parse() + if err != nil { + t.Fatalf("(%v).Parse() = %v", tt.cs, err) + } + for i, m := range ms { + lvl, typ, dataLen, err := m.ParseHeader() + if err != nil { + t.Fatalf("(%v).ParseHeader() = %v", tt.cs, err) + } + if lvl != tt.cs[i].Level || typ != tt.cs[i].Type || dataLen != len(tt.cs[i].Data) { + t.Fatalf("%v: got %d, %d, %d; want %d, %d, %d", tt.cs[i], lvl, typ, dataLen, tt.cs[i].Level, tt.cs[i].Type, len(tt.cs[i].Data)) + } + } + } + } +} + +func TestUDP(t *testing.T) { + c, err := nettest.NewLocalPacketListener("udp") + if err != nil { + t.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + cc, err := socket.NewConn(c.(net.Conn)) + if err != nil { + t.Fatal(err) + } + + t.Run("Message", func(t *testing.T) { + data := []byte("HELLO-R-U-THERE") + wm := socket.Message{ + Buffers: bytes.SplitAfter(data, []byte("-")), + Addr: c.LocalAddr(), + } + if err := cc.SendMsg(&wm, 0); err != nil { + t.Fatal(err) + } + b := make([]byte, 32) + rm := socket.Message{ + Buffers: [][]byte{b[:1], b[1:3], b[3:7], b[7:11], b[11:]}, + } + if err := cc.RecvMsg(&rm, 0); err != nil { + t.Fatal(err) + } + if !bytes.Equal(b[:rm.N], data) { + t.Fatalf("got %#v; want %#v", b[:rm.N], data) + } + }) + switch runtime.GOOS { + case "android", "linux": + t.Run("Messages", func(t *testing.T) { + data := []byte("HELLO-R-U-THERE") + wmbs := bytes.SplitAfter(data, []byte("-")) + wms := []socket.Message{ + {Buffers: wmbs[:1], Addr: c.LocalAddr()}, + {Buffers: wmbs[1:], Addr: c.LocalAddr()}, + } + n, err := cc.SendMsgs(wms, 0) + if err != nil { + t.Fatal(err) + } + if n != len(wms) { + t.Fatalf("got %d; want %d", n, len(wms)) + } + b := make([]byte, 32) + rmbs := [][][]byte{{b[:len(wmbs[0])]}, {b[len(wmbs[0]):]}} + rms := []socket.Message{ + {Buffers: rmbs[0]}, + {Buffers: rmbs[1]}, + } + n, err = cc.RecvMsgs(rms, 0) + if err != nil { + t.Fatal(err) + } + if n != len(rms) { + t.Fatalf("got %d; want %d", n, len(rms)) + } + nn := 0 + for i := 0; i < n; i++ { + nn += rms[i].N + } + if !bytes.Equal(b[:nn], data) { + t.Fatalf("got %#v; want %#v", b[:nn], data) + } + }) + } + + // The behavior of transmission for zero byte paylaod depends + // on each platform implementation. Some may transmit only + // protocol header and options, other may transmit nothing. + // We test only that SendMsg and SendMsgs will not crash with + // empty buffers. + wm := socket.Message{ + Buffers: [][]byte{{}}, + Addr: c.LocalAddr(), + } + cc.SendMsg(&wm, 0) + wms := []socket.Message{ + {Buffers: [][]byte{{}}, Addr: c.LocalAddr()}, + } + cc.SendMsgs(wms, 0) +} + +func BenchmarkUDP(b *testing.B) { + c, err := nettest.NewLocalPacketListener("udp") + if err != nil { + b.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + cc, err := socket.NewConn(c.(net.Conn)) + if err != nil { + b.Fatal(err) + } + data := []byte("HELLO-R-U-THERE") + wm := socket.Message{ + Buffers: [][]byte{data}, + Addr: c.LocalAddr(), + } + rm := socket.Message{ + Buffers: [][]byte{make([]byte, 128)}, + OOB: make([]byte, 128), + } + + for M := 1; M <= 1<<9; M = M << 1 { + b.Run(fmt.Sprintf("Iter-%d", M), func(b *testing.B) { + for i := 0; i < b.N; i++ { + for j := 0; j < M; j++ { + if err := cc.SendMsg(&wm, 0); err != nil { + b.Fatal(err) + } + if err := cc.RecvMsg(&rm, 0); err != nil { + b.Fatal(err) + } + } + } + }) + switch runtime.GOOS { + case "android", "linux": + wms := make([]socket.Message, M) + for i := range wms { + wms[i].Buffers = [][]byte{data} + wms[i].Addr = c.LocalAddr() + } + rms := make([]socket.Message, M) + for i := range rms { + rms[i].Buffers = [][]byte{make([]byte, 128)} + rms[i].OOB = make([]byte, 128) + } + b.Run(fmt.Sprintf("Batch-%d", M), func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := cc.SendMsgs(wms, 0); err != nil { + b.Fatal(err) + } + if _, err := cc.RecvMsgs(rms, 0); err != nil { + b.Fatal(err) + } + } + }) + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/socket_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/socket_test.go new file mode 100644 index 0000000..bf3751b --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/socket_test.go @@ -0,0 +1,46 @@ +// 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows + +package socket_test + +import ( + "net" + "runtime" + "syscall" + "testing" + + "golang.org/x/net/internal/nettest" + "golang.org/x/net/internal/socket" +) + +func TestSocket(t *testing.T) { + t.Run("Option", func(t *testing.T) { + testSocketOption(t, &socket.Option{Level: syscall.SOL_SOCKET, Name: syscall.SO_RCVBUF, Len: 4}) + }) +} + +func testSocketOption(t *testing.T, so *socket.Option) { + c, err := nettest.NewLocalPacketListener("udp") + if err != nil { + t.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + cc, err := socket.NewConn(c.(net.Conn)) + if err != nil { + t.Fatal(err) + } + const N = 2048 + if err := so.SetInt(cc, N); err != nil { + t.Fatal(err) + } + n, err := so.GetInt(cc) + if err != nil { + t.Fatal(err) + } + if n < N { + t.Fatalf("got %d; want greater than or equal to %d", n, N) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys.go new file mode 100644 index 0000000..4f0eead --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys.go @@ -0,0 +1,33 @@ +// 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 socket + +import ( + "encoding/binary" + "unsafe" +) + +var ( + // NativeEndian is the machine native endian implementation of + // ByteOrder. + NativeEndian binary.ByteOrder + + kernelAlign int +) + +func init() { + i := uint32(1) + b := (*[4]byte)(unsafe.Pointer(&i)) + if b[0] == 1 { + NativeEndian = binary.LittleEndian + } else { + NativeEndian = binary.BigEndian + } + kernelAlign = probeProtocolStack() +} + +func roundup(l int) int { + return (l + kernelAlign - 1) & ^(kernelAlign - 1) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_bsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_bsd.go new file mode 100644 index 0000000..f13e14f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_bsd.go @@ -0,0 +1,17 @@ +// 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. + +// +build darwin dragonfly freebsd openbsd + +package socket + +import "errors" + +func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + return 0, errors.New("not implemented") +} + +func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + return 0, errors.New("not implemented") +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_bsdvar.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_bsdvar.go new file mode 100644 index 0000000..f723fa3 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_bsdvar.go @@ -0,0 +1,14 @@ +// 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. + +// +build freebsd netbsd openbsd + +package socket + +import "unsafe" + +func probeProtocolStack() int { + var p uintptr + return int(unsafe.Sizeof(p)) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_darwin.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_darwin.go new file mode 100644 index 0000000..b17d223 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_darwin.go @@ -0,0 +1,7 @@ +// 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 socket + +func probeProtocolStack() int { return 4 } diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_dragonfly.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_dragonfly.go new file mode 100644 index 0000000..b17d223 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_dragonfly.go @@ -0,0 +1,7 @@ +// 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 socket + +func probeProtocolStack() int { return 4 } diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux.go new file mode 100644 index 0000000..1559521 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux.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. + +// +build linux,!s390x,!386 + +package socket + +import ( + "syscall" + "unsafe" +) + +func probeProtocolStack() int { + var p uintptr + return int(unsafe.Sizeof(p)) +} + +func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + n, _, errno := syscall.Syscall6(sysRECVMMSG, s, uintptr(unsafe.Pointer(&hs[0])), uintptr(len(hs)), uintptr(flags), 0, 0) + return int(n), errnoErr(errno) +} + +func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + n, _, errno := syscall.Syscall6(sysSENDMMSG, s, uintptr(unsafe.Pointer(&hs[0])), uintptr(len(hs)), uintptr(flags), 0, 0) + return int(n), errnoErr(errno) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_386.go new file mode 100644 index 0000000..235b2cc --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_386.go @@ -0,0 +1,55 @@ +// 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 socket + +import ( + "syscall" + "unsafe" +) + +func probeProtocolStack() int { return 4 } + +const ( + sysSETSOCKOPT = 0xe + sysGETSOCKOPT = 0xf + sysSENDMSG = 0x10 + sysRECVMSG = 0x11 + sysRECVMMSG = 0x13 + sysSENDMMSG = 0x14 +) + +func socketcall(call, a0, a1, a2, a3, a4, a5 uintptr) (uintptr, syscall.Errno) +func rawsocketcall(call, a0, a1, a2, a3, a4, a5 uintptr) (uintptr, syscall.Errno) + +func getsockopt(s uintptr, level, name int, b []byte) (int, error) { + l := uint32(len(b)) + _, errno := socketcall(sysGETSOCKOPT, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(unsafe.Pointer(&l)), 0) + return int(l), errnoErr(errno) +} + +func setsockopt(s uintptr, level, name int, b []byte) error { + _, errno := socketcall(sysSETSOCKOPT, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(len(b)), 0) + return errnoErr(errno) +} + +func recvmsg(s uintptr, h *msghdr, flags int) (int, error) { + n, errno := socketcall(sysRECVMSG, s, uintptr(unsafe.Pointer(h)), uintptr(flags), 0, 0, 0) + return int(n), errnoErr(errno) +} + +func sendmsg(s uintptr, h *msghdr, flags int) (int, error) { + n, errno := socketcall(sysSENDMSG, s, uintptr(unsafe.Pointer(h)), uintptr(flags), 0, 0, 0) + return int(n), errnoErr(errno) +} + +func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + n, errno := socketcall(sysRECVMMSG, s, uintptr(unsafe.Pointer(&hs[0])), uintptr(len(hs)), uintptr(flags), 0, 0) + return int(n), errnoErr(errno) +} + +func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + n, errno := socketcall(sysSENDMMSG, s, uintptr(unsafe.Pointer(&hs[0])), uintptr(len(hs)), uintptr(flags), 0, 0) + return int(n), errnoErr(errno) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_386.s b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_386.s new file mode 100644 index 0000000..93e7d75 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_386.s @@ -0,0 +1,11 @@ +// 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. + +#include "textflag.h" + +TEXT ·socketcall(SB),NOSPLIT,$0-36 + JMP syscall·socketcall(SB) + +TEXT ·rawsocketcall(SB),NOSPLIT,$0-36 + JMP syscall·rawsocketcall(SB) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_amd64.go new file mode 100644 index 0000000..9decee2 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_amd64.go @@ -0,0 +1,10 @@ +// 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 socket + +const ( + sysRECVMMSG = 0x12b + sysSENDMMSG = 0x133 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_arm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_arm.go new file mode 100644 index 0000000..d753b43 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_arm.go @@ -0,0 +1,10 @@ +// 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 socket + +const ( + sysRECVMMSG = 0x16d + sysSENDMMSG = 0x176 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_arm64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_arm64.go new file mode 100644 index 0000000..b670894 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_arm64.go @@ -0,0 +1,10 @@ +// 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 socket + +const ( + sysRECVMMSG = 0xf3 + sysSENDMMSG = 0x10d +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_mips.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_mips.go new file mode 100644 index 0000000..9c0d740 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_mips.go @@ -0,0 +1,10 @@ +// 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 socket + +const ( + sysRECVMMSG = 0x10ef + sysSENDMMSG = 0x10f7 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_mips64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_mips64.go new file mode 100644 index 0000000..071a4ab --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_mips64.go @@ -0,0 +1,10 @@ +// 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 socket + +const ( + sysRECVMMSG = 0x14ae + sysSENDMMSG = 0x14b6 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_mips64le.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_mips64le.go new file mode 100644 index 0000000..071a4ab --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_mips64le.go @@ -0,0 +1,10 @@ +// 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 socket + +const ( + sysRECVMMSG = 0x14ae + sysSENDMMSG = 0x14b6 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_mipsle.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_mipsle.go new file mode 100644 index 0000000..9c0d740 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_mipsle.go @@ -0,0 +1,10 @@ +// 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 socket + +const ( + sysRECVMMSG = 0x10ef + sysSENDMMSG = 0x10f7 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_ppc64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_ppc64.go new file mode 100644 index 0000000..21c1e3f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_ppc64.go @@ -0,0 +1,10 @@ +// 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 socket + +const ( + sysRECVMMSG = 0x157 + sysSENDMMSG = 0x15d +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_ppc64le.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_ppc64le.go new file mode 100644 index 0000000..21c1e3f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_ppc64le.go @@ -0,0 +1,10 @@ +// 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 socket + +const ( + sysRECVMMSG = 0x157 + sysSENDMMSG = 0x15d +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_s390x.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_s390x.go new file mode 100644 index 0000000..327979e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_s390x.go @@ -0,0 +1,55 @@ +// 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 socket + +import ( + "syscall" + "unsafe" +) + +func probeProtocolStack() int { return 8 } + +const ( + sysSETSOCKOPT = 0xe + sysGETSOCKOPT = 0xf + sysSENDMSG = 0x10 + sysRECVMSG = 0x11 + sysRECVMMSG = 0x13 + sysSENDMMSG = 0x14 +) + +func socketcall(call, a0, a1, a2, a3, a4, a5 uintptr) (uintptr, syscall.Errno) +func rawsocketcall(call, a0, a1, a2, a3, a4, a5 uintptr) (uintptr, syscall.Errno) + +func getsockopt(s uintptr, level, name int, b []byte) (int, error) { + l := uint32(len(b)) + _, errno := socketcall(sysGETSOCKOPT, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(unsafe.Pointer(&l)), 0) + return int(l), errnoErr(errno) +} + +func setsockopt(s uintptr, level, name int, b []byte) error { + _, errno := socketcall(sysSETSOCKOPT, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(len(b)), 0) + return errnoErr(errno) +} + +func recvmsg(s uintptr, h *msghdr, flags int) (int, error) { + n, errno := socketcall(sysRECVMSG, s, uintptr(unsafe.Pointer(h)), uintptr(flags), 0, 0, 0) + return int(n), errnoErr(errno) +} + +func sendmsg(s uintptr, h *msghdr, flags int) (int, error) { + n, errno := socketcall(sysSENDMSG, s, uintptr(unsafe.Pointer(h)), uintptr(flags), 0, 0, 0) + return int(n), errnoErr(errno) +} + +func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + n, errno := socketcall(sysRECVMMSG, s, uintptr(unsafe.Pointer(&hs[0])), uintptr(len(hs)), uintptr(flags), 0, 0) + return int(n), errnoErr(errno) +} + +func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + n, errno := socketcall(sysSENDMMSG, s, uintptr(unsafe.Pointer(&hs[0])), uintptr(len(hs)), uintptr(flags), 0, 0) + return int(n), errnoErr(errno) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_s390x.s b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_s390x.s new file mode 100644 index 0000000..06d7562 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_linux_s390x.s @@ -0,0 +1,11 @@ +// 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. + +#include "textflag.h" + +TEXT ·socketcall(SB),NOSPLIT,$0-72 + JMP syscall·socketcall(SB) + +TEXT ·rawsocketcall(SB),NOSPLIT,$0-72 + JMP syscall·rawsocketcall(SB) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_netbsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_netbsd.go new file mode 100644 index 0000000..431851c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_netbsd.go @@ -0,0 +1,25 @@ +// 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 socket + +import ( + "syscall" + "unsafe" +) + +const ( + sysRECVMMSG = 0x1db + sysSENDMMSG = 0x1dc +) + +func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + n, _, errno := syscall.Syscall6(sysRECVMMSG, s, uintptr(unsafe.Pointer(&hs[0])), uintptr(len(hs)), uintptr(flags), 0, 0) + return int(n), errnoErr(errno) +} + +func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + n, _, errno := syscall.Syscall6(sysSENDMMSG, s, uintptr(unsafe.Pointer(&hs[0])), uintptr(len(hs)), uintptr(flags), 0, 0) + return int(n), errnoErr(errno) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_posix.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_posix.go new file mode 100644 index 0000000..dc130c2 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_posix.go @@ -0,0 +1,168 @@ +// 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. + +// +build go1.9 +// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows + +package socket + +import ( + "encoding/binary" + "errors" + "net" + "runtime" + "strconv" + "sync" + "time" +) + +func marshalInetAddr(a net.Addr) []byte { + switch a := a.(type) { + case *net.TCPAddr: + return marshalSockaddr(a.IP, a.Port, a.Zone) + case *net.UDPAddr: + return marshalSockaddr(a.IP, a.Port, a.Zone) + case *net.IPAddr: + return marshalSockaddr(a.IP, 0, a.Zone) + default: + return nil + } +} + +func marshalSockaddr(ip net.IP, port int, zone string) []byte { + if ip4 := ip.To4(); ip4 != nil { + b := make([]byte, sizeofSockaddrInet) + switch runtime.GOOS { + case "android", "linux", "solaris", "windows": + NativeEndian.PutUint16(b[:2], uint16(sysAF_INET)) + default: + b[0] = sizeofSockaddrInet + b[1] = sysAF_INET + } + binary.BigEndian.PutUint16(b[2:4], uint16(port)) + copy(b[4:8], ip4) + return b + } + if ip6 := ip.To16(); ip6 != nil && ip.To4() == nil { + b := make([]byte, sizeofSockaddrInet6) + switch runtime.GOOS { + case "android", "linux", "solaris", "windows": + NativeEndian.PutUint16(b[:2], uint16(sysAF_INET6)) + default: + b[0] = sizeofSockaddrInet6 + b[1] = sysAF_INET6 + } + binary.BigEndian.PutUint16(b[2:4], uint16(port)) + copy(b[8:24], ip6) + if zone != "" { + NativeEndian.PutUint32(b[24:28], uint32(zoneCache.index(zone))) + } + return b + } + return nil +} + +func parseInetAddr(b []byte, network string) (net.Addr, error) { + if len(b) < 2 { + return nil, errors.New("invalid address") + } + var af int + switch runtime.GOOS { + case "android", "linux", "solaris", "windows": + af = int(NativeEndian.Uint16(b[:2])) + default: + af = int(b[1]) + } + var ip net.IP + var zone string + if af == sysAF_INET { + if len(b) < sizeofSockaddrInet { + return nil, errors.New("short address") + } + ip = make(net.IP, net.IPv4len) + copy(ip, b[4:8]) + } + if af == sysAF_INET6 { + if len(b) < sizeofSockaddrInet6 { + return nil, errors.New("short address") + } + ip = make(net.IP, net.IPv6len) + copy(ip, b[8:24]) + if id := int(NativeEndian.Uint32(b[24:28])); id > 0 { + zone = zoneCache.name(id) + } + } + switch network { + case "tcp", "tcp4", "tcp6": + return &net.TCPAddr{IP: ip, Port: int(binary.BigEndian.Uint16(b[2:4])), Zone: zone}, nil + case "udp", "udp4", "udp6": + return &net.UDPAddr{IP: ip, Port: int(binary.BigEndian.Uint16(b[2:4])), Zone: zone}, nil + default: + return &net.IPAddr{IP: ip, Zone: zone}, nil + } +} + +// An ipv6ZoneCache represents a cache holding partial network +// interface information. It is used for reducing the cost of IPv6 +// addressing scope zone resolution. +// +// Multiple names sharing the index are managed by first-come +// first-served basis for consistency. +type ipv6ZoneCache struct { + sync.RWMutex // guard the following + lastFetched time.Time // last time routing information was fetched + toIndex map[string]int // interface name to its index + toName map[int]string // interface index to its name +} + +var zoneCache = ipv6ZoneCache{ + toIndex: make(map[string]int), + toName: make(map[int]string), +} + +func (zc *ipv6ZoneCache) update(ift []net.Interface) { + zc.Lock() + defer zc.Unlock() + now := time.Now() + if zc.lastFetched.After(now.Add(-60 * time.Second)) { + return + } + zc.lastFetched = now + if len(ift) == 0 { + var err error + if ift, err = net.Interfaces(); err != nil { + return + } + } + zc.toIndex = make(map[string]int, len(ift)) + zc.toName = make(map[int]string, len(ift)) + for _, ifi := range ift { + zc.toIndex[ifi.Name] = ifi.Index + if _, ok := zc.toName[ifi.Index]; !ok { + zc.toName[ifi.Index] = ifi.Name + } + } +} + +func (zc *ipv6ZoneCache) name(zone int) string { + zoneCache.update(nil) + zoneCache.RLock() + defer zoneCache.RUnlock() + name, ok := zoneCache.toName[zone] + if !ok { + name = strconv.Itoa(zone) + } + return name +} + +func (zc *ipv6ZoneCache) index(zone string) int { + zoneCache.update(nil) + zoneCache.RLock() + defer zoneCache.RUnlock() + index, ok := zoneCache.toIndex[zone] + if !ok { + index, _ = strconv.Atoi(zone) + } + return index +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_solaris.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_solaris.go new file mode 100644 index 0000000..cced74e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_solaris.go @@ -0,0 +1,71 @@ +// 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 socket + +import ( + "errors" + "runtime" + "syscall" + "unsafe" +) + +func probeProtocolStack() int { + switch runtime.GOARCH { + case "amd64": + return 4 + default: + var p uintptr + return int(unsafe.Sizeof(p)) + } +} + +//go:cgo_import_dynamic libc___xnet_getsockopt __xnet_getsockopt "libsocket.so" +//go:cgo_import_dynamic libc_setsockopt setsockopt "libsocket.so" +//go:cgo_import_dynamic libc___xnet_recvmsg __xnet_recvmsg "libsocket.so" +//go:cgo_import_dynamic libc___xnet_sendmsg __xnet_sendmsg "libsocket.so" + +//go:linkname procGetsockopt libc___xnet_getsockopt +//go:linkname procSetsockopt libc_setsockopt +//go:linkname procRecvmsg libc___xnet_recvmsg +//go:linkname procSendmsg libc___xnet_sendmsg + +var ( + procGetsockopt uintptr + procSetsockopt uintptr + procRecvmsg uintptr + procSendmsg uintptr +) + +func sysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (uintptr, uintptr, syscall.Errno) +func rawSysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (uintptr, uintptr, syscall.Errno) + +func getsockopt(s uintptr, level, name int, b []byte) (int, error) { + l := uint32(len(b)) + _, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procGetsockopt)), 5, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(unsafe.Pointer(&l)), 0) + return int(l), errnoErr(errno) +} + +func setsockopt(s uintptr, level, name int, b []byte) error { + _, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procSetsockopt)), 5, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(len(b)), 0) + return errnoErr(errno) +} + +func recvmsg(s uintptr, h *msghdr, flags int) (int, error) { + n, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procRecvmsg)), 3, s, uintptr(unsafe.Pointer(h)), uintptr(flags), 0, 0, 0) + return int(n), errnoErr(errno) +} + +func sendmsg(s uintptr, h *msghdr, flags int) (int, error) { + n, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procSendmsg)), 3, s, uintptr(unsafe.Pointer(h)), uintptr(flags), 0, 0, 0) + return int(n), errnoErr(errno) +} + +func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + return 0, errors.New("not implemented") +} + +func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + return 0, errors.New("not implemented") +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_solaris_amd64.s b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_solaris_amd64.s new file mode 100644 index 0000000..a18ac5e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_solaris_amd64.s @@ -0,0 +1,11 @@ +// 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. + +#include "textflag.h" + +TEXT ·sysvicall6(SB),NOSPLIT,$0-88 + JMP syscall·sysvicall6(SB) + +TEXT ·rawSysvicall6(SB),NOSPLIT,$0-88 + JMP syscall·rawSysvicall6(SB) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_stub.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_stub.go new file mode 100644 index 0000000..d9f06d0 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_stub.go @@ -0,0 +1,64 @@ +// 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. + +// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows + +package socket + +import ( + "errors" + "net" + "runtime" + "unsafe" +) + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0xa + + sysSOCK_RAW = 0x3 +) + +func probeProtocolStack() int { + switch runtime.GOARCH { + case "amd64p32", "mips64p32": + return 4 + default: + var p uintptr + return int(unsafe.Sizeof(p)) + } +} + +func marshalInetAddr(ip net.IP, port int, zone string) []byte { + return nil +} + +func parseInetAddr(b []byte, network string) (net.Addr, error) { + return nil, errors.New("not implemented") +} + +func getsockopt(s uintptr, level, name int, b []byte) (int, error) { + return 0, errors.New("not implemented") +} + +func setsockopt(s uintptr, level, name int, b []byte) error { + return errors.New("not implemented") +} + +func recvmsg(s uintptr, h *msghdr, flags int) (int, error) { + return 0, errors.New("not implemented") +} + +func sendmsg(s uintptr, h *msghdr, flags int) (int, error) { + return 0, errors.New("not implemented") +} + +func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + return 0, errors.New("not implemented") +} + +func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + return 0, errors.New("not implemented") +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_unix.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_unix.go new file mode 100644 index 0000000..18eba30 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_unix.go @@ -0,0 +1,33 @@ +// 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. + +// +build darwin dragonfly freebsd linux,!s390x,!386 netbsd openbsd + +package socket + +import ( + "syscall" + "unsafe" +) + +func getsockopt(s uintptr, level, name int, b []byte) (int, error) { + l := uint32(len(b)) + _, _, errno := syscall.Syscall6(syscall.SYS_GETSOCKOPT, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(unsafe.Pointer(&l)), 0) + return int(l), errnoErr(errno) +} + +func setsockopt(s uintptr, level, name int, b []byte) error { + _, _, errno := syscall.Syscall6(syscall.SYS_SETSOCKOPT, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(len(b)), 0) + return errnoErr(errno) +} + +func recvmsg(s uintptr, h *msghdr, flags int) (int, error) { + n, _, errno := syscall.Syscall(syscall.SYS_RECVMSG, s, uintptr(unsafe.Pointer(h)), uintptr(flags)) + return int(n), errnoErr(errno) +} + +func sendmsg(s uintptr, h *msghdr, flags int) (int, error) { + n, _, errno := syscall.Syscall(syscall.SYS_SENDMSG, s, uintptr(unsafe.Pointer(h)), uintptr(flags)) + return int(n), errnoErr(errno) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_windows.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_windows.go new file mode 100644 index 0000000..54a470e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/sys_windows.go @@ -0,0 +1,70 @@ +// 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 socket + +import ( + "errors" + "syscall" + "unsafe" +) + +func probeProtocolStack() int { + var p uintptr + return int(unsafe.Sizeof(p)) +} + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0x17 + + sysSOCK_RAW = 0x3 +) + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) + +func getsockopt(s uintptr, level, name int, b []byte) (int, error) { + l := uint32(len(b)) + err := syscall.Getsockopt(syscall.Handle(s), int32(level), int32(name), (*byte)(unsafe.Pointer(&b[0])), (*int32)(unsafe.Pointer(&l))) + return int(l), err +} + +func setsockopt(s uintptr, level, name int, b []byte) error { + return syscall.Setsockopt(syscall.Handle(s), int32(level), int32(name), (*byte)(unsafe.Pointer(&b[0])), int32(len(b))) +} + +func recvmsg(s uintptr, h *msghdr, flags int) (int, error) { + return 0, errors.New("not implemented") +} + +func sendmsg(s uintptr, h *msghdr, flags int) (int, error) { + return 0, errors.New("not implemented") +} + +func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + return 0, errors.New("not implemented") +} + +func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + return 0, errors.New("not implemented") +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_darwin_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_darwin_386.go new file mode 100644 index 0000000..26f8fef --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_darwin_386.go @@ -0,0 +1,59 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_darwin.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0x1e + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint32 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x8 + sizeofMsghdr = 0x1c + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_darwin_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_darwin_amd64.go new file mode 100644 index 0000000..e2987f7 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_darwin_amd64.go @@ -0,0 +1,61 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_darwin.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0x1e + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen int32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x30 + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm.go new file mode 100644 index 0000000..26f8fef --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm.go @@ -0,0 +1,59 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_darwin.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0x1e + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint32 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x8 + sizeofMsghdr = 0x1c + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_dragonfly_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_dragonfly_amd64.go new file mode 100644 index 0000000..c582abd --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_dragonfly_amd64.go @@ -0,0 +1,61 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_dragonfly.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0x1c + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen int32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x30 + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_freebsd_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_freebsd_386.go new file mode 100644 index 0000000..04a2488 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_freebsd_386.go @@ -0,0 +1,59 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_freebsd.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0x1c + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint32 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x8 + sizeofMsghdr = 0x1c + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_freebsd_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_freebsd_amd64.go new file mode 100644 index 0000000..35c7cb9 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_freebsd_amd64.go @@ -0,0 +1,61 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_freebsd.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0x1c + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen int32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x30 + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm.go new file mode 100644 index 0000000..04a2488 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm.go @@ -0,0 +1,59 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_freebsd.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0x1c + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint32 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x8 + sizeofMsghdr = 0x1c + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_386.go new file mode 100644 index 0000000..4302069 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_386.go @@ -0,0 +1,63 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0xa + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint32 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x8 + sizeofMsghdr = 0x1c + sizeofMmsghdr = 0x20 + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_amd64.go new file mode 100644 index 0000000..1502f6c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_amd64.go @@ -0,0 +1,66 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0xa + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + Pad_cgo_1 [4]byte +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 + Pad_cgo_0 [4]byte +} + +type cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x38 + sizeofMmsghdr = 0x40 + sizeofCmsghdr = 0x10 + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_arm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_arm.go new file mode 100644 index 0000000..4302069 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_arm.go @@ -0,0 +1,63 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0xa + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint32 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x8 + sizeofMsghdr = 0x1c + sizeofMmsghdr = 0x20 + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_arm64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_arm64.go new file mode 100644 index 0000000..1502f6c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_arm64.go @@ -0,0 +1,66 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0xa + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + Pad_cgo_1 [4]byte +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 + Pad_cgo_0 [4]byte +} + +type cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x38 + sizeofMmsghdr = 0x40 + sizeofCmsghdr = 0x10 + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_mips.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_mips.go new file mode 100644 index 0000000..4302069 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_mips.go @@ -0,0 +1,63 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0xa + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint32 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x8 + sizeofMsghdr = 0x1c + sizeofMmsghdr = 0x20 + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64.go new file mode 100644 index 0000000..1502f6c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64.go @@ -0,0 +1,66 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0xa + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + Pad_cgo_1 [4]byte +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 + Pad_cgo_0 [4]byte +} + +type cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x38 + sizeofMmsghdr = 0x40 + sizeofCmsghdr = 0x10 + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64le.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64le.go new file mode 100644 index 0000000..1502f6c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64le.go @@ -0,0 +1,66 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0xa + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + Pad_cgo_1 [4]byte +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 + Pad_cgo_0 [4]byte +} + +type cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x38 + sizeofMmsghdr = 0x40 + sizeofCmsghdr = 0x10 + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_mipsle.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_mipsle.go new file mode 100644 index 0000000..4302069 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_mipsle.go @@ -0,0 +1,63 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0xa + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint32 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x8 + sizeofMsghdr = 0x1c + sizeofMmsghdr = 0x20 + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64.go new file mode 100644 index 0000000..1502f6c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64.go @@ -0,0 +1,66 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0xa + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + Pad_cgo_1 [4]byte +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 + Pad_cgo_0 [4]byte +} + +type cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x38 + sizeofMmsghdr = 0x40 + sizeofCmsghdr = 0x10 + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64le.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64le.go new file mode 100644 index 0000000..1502f6c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64le.go @@ -0,0 +1,66 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0xa + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + Pad_cgo_1 [4]byte +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 + Pad_cgo_0 [4]byte +} + +type cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x38 + sizeofMmsghdr = 0x40 + sizeofCmsghdr = 0x10 + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_s390x.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_s390x.go new file mode 100644 index 0000000..1502f6c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_linux_s390x.go @@ -0,0 +1,66 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0xa + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + Pad_cgo_1 [4]byte +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 + Pad_cgo_0 [4]byte +} + +type cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x38 + sizeofMmsghdr = 0x40 + sizeofCmsghdr = 0x10 + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_netbsd_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_netbsd_386.go new file mode 100644 index 0000000..db60491 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_netbsd_386.go @@ -0,0 +1,65 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_netbsd.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0x18 + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint32 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x8 + sizeofMsghdr = 0x1c + sizeofMmsghdr = 0x20 + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_netbsd_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_netbsd_amd64.go new file mode 100644 index 0000000..2a1a799 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_netbsd_amd64.go @@ -0,0 +1,68 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_netbsd.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0x18 + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen int32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 + Pad_cgo_0 [4]byte +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x30 + sizeofMmsghdr = 0x40 + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm.go new file mode 100644 index 0000000..206ea2d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm.go @@ -0,0 +1,59 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_netbsd.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0x18 + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint32 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x8 + sizeofMsghdr = 0x1c + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_openbsd_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_openbsd_386.go new file mode 100644 index 0000000..1c83636 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_openbsd_386.go @@ -0,0 +1,59 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_openbsd.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0x18 + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint32 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x8 + sizeofMsghdr = 0x1c + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_openbsd_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_openbsd_amd64.go new file mode 100644 index 0000000..a6c0bf4 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_openbsd_amd64.go @@ -0,0 +1,61 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_openbsd.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0x18 + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen uint32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x30 + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm.go new file mode 100644 index 0000000..1c83636 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm.go @@ -0,0 +1,59 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_openbsd.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0x18 + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint32 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x8 + sizeofMsghdr = 0x1c + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_solaris_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_solaris_amd64.go new file mode 100644 index 0000000..327c632 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/socket/zsys_solaris_amd64.go @@ -0,0 +1,60 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_solaris.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0x1a + + sysSOCK_RAW = 0x4 +) + +type iovec struct { + Base *int8 + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen int32 + Pad_cgo_1 [4]byte + Accrights *int8 + Accrightslen int32 + Pad_cgo_2 [4]byte +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 + X__sin6_src_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x30 + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x20 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/timeseries/timeseries.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/timeseries/timeseries.go new file mode 100644 index 0000000..685f0e7 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/timeseries/timeseries.go @@ -0,0 +1,525 @@ +// Copyright 2015 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 timeseries implements a time series structure for stats collection. +package timeseries // import "golang.org/x/net/internal/timeseries" + +import ( + "fmt" + "log" + "time" +) + +const ( + timeSeriesNumBuckets = 64 + minuteHourSeriesNumBuckets = 60 +) + +var timeSeriesResolutions = []time.Duration{ + 1 * time.Second, + 10 * time.Second, + 1 * time.Minute, + 10 * time.Minute, + 1 * time.Hour, + 6 * time.Hour, + 24 * time.Hour, // 1 day + 7 * 24 * time.Hour, // 1 week + 4 * 7 * 24 * time.Hour, // 4 weeks + 16 * 7 * 24 * time.Hour, // 16 weeks +} + +var minuteHourSeriesResolutions = []time.Duration{ + 1 * time.Second, + 1 * time.Minute, +} + +// An Observable is a kind of data that can be aggregated in a time series. +type Observable interface { + Multiply(ratio float64) // Multiplies the data in self by a given ratio + Add(other Observable) // Adds the data from a different observation to self + Clear() // Clears the observation so it can be reused. + CopyFrom(other Observable) // Copies the contents of a given observation to self +} + +// Float attaches the methods of Observable to a float64. +type Float float64 + +// NewFloat returns a Float. +func NewFloat() Observable { + f := Float(0) + return &f +} + +// String returns the float as a string. +func (f *Float) String() string { return fmt.Sprintf("%g", f.Value()) } + +// Value returns the float's value. +func (f *Float) Value() float64 { return float64(*f) } + +func (f *Float) Multiply(ratio float64) { *f *= Float(ratio) } + +func (f *Float) Add(other Observable) { + o := other.(*Float) + *f += *o +} + +func (f *Float) Clear() { *f = 0 } + +func (f *Float) CopyFrom(other Observable) { + o := other.(*Float) + *f = *o +} + +// A Clock tells the current time. +type Clock interface { + Time() time.Time +} + +type defaultClock int + +var defaultClockInstance defaultClock + +func (defaultClock) Time() time.Time { return time.Now() } + +// Information kept per level. Each level consists of a circular list of +// observations. The start of the level may be derived from end and the +// len(buckets) * sizeInMillis. +type tsLevel struct { + oldest int // index to oldest bucketed Observable + newest int // index to newest bucketed Observable + end time.Time // end timestamp for this level + size time.Duration // duration of the bucketed Observable + buckets []Observable // collections of observations + provider func() Observable // used for creating new Observable +} + +func (l *tsLevel) Clear() { + l.oldest = 0 + l.newest = len(l.buckets) - 1 + l.end = time.Time{} + for i := range l.buckets { + if l.buckets[i] != nil { + l.buckets[i].Clear() + l.buckets[i] = nil + } + } +} + +func (l *tsLevel) InitLevel(size time.Duration, numBuckets int, f func() Observable) { + l.size = size + l.provider = f + l.buckets = make([]Observable, numBuckets) +} + +// Keeps a sequence of levels. Each level is responsible for storing data at +// a given resolution. For example, the first level stores data at a one +// minute resolution while the second level stores data at a one hour +// resolution. + +// Each level is represented by a sequence of buckets. Each bucket spans an +// interval equal to the resolution of the level. New observations are added +// to the last bucket. +type timeSeries struct { + provider func() Observable // make more Observable + numBuckets int // number of buckets in each level + levels []*tsLevel // levels of bucketed Observable + lastAdd time.Time // time of last Observable tracked + total Observable // convenient aggregation of all Observable + clock Clock // Clock for getting current time + pending Observable // observations not yet bucketed + pendingTime time.Time // what time are we keeping in pending + dirty bool // if there are pending observations +} + +// init initializes a level according to the supplied criteria. +func (ts *timeSeries) init(resolutions []time.Duration, f func() Observable, numBuckets int, clock Clock) { + ts.provider = f + ts.numBuckets = numBuckets + ts.clock = clock + ts.levels = make([]*tsLevel, len(resolutions)) + + for i := range resolutions { + if i > 0 && resolutions[i-1] >= resolutions[i] { + log.Print("timeseries: resolutions must be monotonically increasing") + break + } + newLevel := new(tsLevel) + newLevel.InitLevel(resolutions[i], ts.numBuckets, ts.provider) + ts.levels[i] = newLevel + } + + ts.Clear() +} + +// Clear removes all observations from the time series. +func (ts *timeSeries) Clear() { + ts.lastAdd = time.Time{} + ts.total = ts.resetObservation(ts.total) + ts.pending = ts.resetObservation(ts.pending) + ts.pendingTime = time.Time{} + ts.dirty = false + + for i := range ts.levels { + ts.levels[i].Clear() + } +} + +// Add records an observation at the current time. +func (ts *timeSeries) Add(observation Observable) { + ts.AddWithTime(observation, ts.clock.Time()) +} + +// AddWithTime records an observation at the specified time. +func (ts *timeSeries) AddWithTime(observation Observable, t time.Time) { + + smallBucketDuration := ts.levels[0].size + + if t.After(ts.lastAdd) { + ts.lastAdd = t + } + + if t.After(ts.pendingTime) { + ts.advance(t) + ts.mergePendingUpdates() + ts.pendingTime = ts.levels[0].end + ts.pending.CopyFrom(observation) + ts.dirty = true + } else if t.After(ts.pendingTime.Add(-1 * smallBucketDuration)) { + // The observation is close enough to go into the pending bucket. + // This compensates for clock skewing and small scheduling delays + // by letting the update stay in the fast path. + ts.pending.Add(observation) + ts.dirty = true + } else { + ts.mergeValue(observation, t) + } +} + +// mergeValue inserts the observation at the specified time in the past into all levels. +func (ts *timeSeries) mergeValue(observation Observable, t time.Time) { + for _, level := range ts.levels { + index := (ts.numBuckets - 1) - int(level.end.Sub(t)/level.size) + if 0 <= index && index < ts.numBuckets { + bucketNumber := (level.oldest + index) % ts.numBuckets + if level.buckets[bucketNumber] == nil { + level.buckets[bucketNumber] = level.provider() + } + level.buckets[bucketNumber].Add(observation) + } + } + ts.total.Add(observation) +} + +// mergePendingUpdates applies the pending updates into all levels. +func (ts *timeSeries) mergePendingUpdates() { + if ts.dirty { + ts.mergeValue(ts.pending, ts.pendingTime) + ts.pending = ts.resetObservation(ts.pending) + ts.dirty = false + } +} + +// advance cycles the buckets at each level until the latest bucket in +// each level can hold the time specified. +func (ts *timeSeries) advance(t time.Time) { + if !t.After(ts.levels[0].end) { + return + } + for i := 0; i < len(ts.levels); i++ { + level := ts.levels[i] + if !level.end.Before(t) { + break + } + + // If the time is sufficiently far, just clear the level and advance + // directly. + if !t.Before(level.end.Add(level.size * time.Duration(ts.numBuckets))) { + for _, b := range level.buckets { + ts.resetObservation(b) + } + level.end = time.Unix(0, (t.UnixNano()/level.size.Nanoseconds())*level.size.Nanoseconds()) + } + + for t.After(level.end) { + level.end = level.end.Add(level.size) + level.newest = level.oldest + level.oldest = (level.oldest + 1) % ts.numBuckets + ts.resetObservation(level.buckets[level.newest]) + } + + t = level.end + } +} + +// Latest returns the sum of the num latest buckets from the level. +func (ts *timeSeries) Latest(level, num int) Observable { + now := ts.clock.Time() + if ts.levels[0].end.Before(now) { + ts.advance(now) + } + + ts.mergePendingUpdates() + + result := ts.provider() + l := ts.levels[level] + index := l.newest + + for i := 0; i < num; i++ { + if l.buckets[index] != nil { + result.Add(l.buckets[index]) + } + if index == 0 { + index = ts.numBuckets + } + index-- + } + + return result +} + +// LatestBuckets returns a copy of the num latest buckets from level. +func (ts *timeSeries) LatestBuckets(level, num int) []Observable { + if level < 0 || level > len(ts.levels) { + log.Print("timeseries: bad level argument: ", level) + return nil + } + if num < 0 || num >= ts.numBuckets { + log.Print("timeseries: bad num argument: ", num) + return nil + } + + results := make([]Observable, num) + now := ts.clock.Time() + if ts.levels[0].end.Before(now) { + ts.advance(now) + } + + ts.mergePendingUpdates() + + l := ts.levels[level] + index := l.newest + + for i := 0; i < num; i++ { + result := ts.provider() + results[i] = result + if l.buckets[index] != nil { + result.CopyFrom(l.buckets[index]) + } + + if index == 0 { + index = ts.numBuckets + } + index -= 1 + } + return results +} + +// ScaleBy updates observations by scaling by factor. +func (ts *timeSeries) ScaleBy(factor float64) { + for _, l := range ts.levels { + for i := 0; i < ts.numBuckets; i++ { + l.buckets[i].Multiply(factor) + } + } + + ts.total.Multiply(factor) + ts.pending.Multiply(factor) +} + +// Range returns the sum of observations added over the specified time range. +// If start or finish times don't fall on bucket boundaries of the same +// level, then return values are approximate answers. +func (ts *timeSeries) Range(start, finish time.Time) Observable { + return ts.ComputeRange(start, finish, 1)[0] +} + +// Recent returns the sum of observations from the last delta. +func (ts *timeSeries) Recent(delta time.Duration) Observable { + now := ts.clock.Time() + return ts.Range(now.Add(-delta), now) +} + +// Total returns the total of all observations. +func (ts *timeSeries) Total() Observable { + ts.mergePendingUpdates() + return ts.total +} + +// ComputeRange computes a specified number of values into a slice using +// the observations recorded over the specified time period. The return +// values are approximate if the start or finish times don't fall on the +// bucket boundaries at the same level or if the number of buckets spanning +// the range is not an integral multiple of num. +func (ts *timeSeries) ComputeRange(start, finish time.Time, num int) []Observable { + if start.After(finish) { + log.Printf("timeseries: start > finish, %v>%v", start, finish) + return nil + } + + if num < 0 { + log.Printf("timeseries: num < 0, %v", num) + return nil + } + + results := make([]Observable, num) + + for _, l := range ts.levels { + if !start.Before(l.end.Add(-l.size * time.Duration(ts.numBuckets))) { + ts.extract(l, start, finish, num, results) + return results + } + } + + // Failed to find a level that covers the desired range. So just + // extract from the last level, even if it doesn't cover the entire + // desired range. + ts.extract(ts.levels[len(ts.levels)-1], start, finish, num, results) + + return results +} + +// RecentList returns the specified number of values in slice over the most +// recent time period of the specified range. +func (ts *timeSeries) RecentList(delta time.Duration, num int) []Observable { + if delta < 0 { + return nil + } + now := ts.clock.Time() + return ts.ComputeRange(now.Add(-delta), now, num) +} + +// extract returns a slice of specified number of observations from a given +// level over a given range. +func (ts *timeSeries) extract(l *tsLevel, start, finish time.Time, num int, results []Observable) { + ts.mergePendingUpdates() + + srcInterval := l.size + dstInterval := finish.Sub(start) / time.Duration(num) + dstStart := start + srcStart := l.end.Add(-srcInterval * time.Duration(ts.numBuckets)) + + srcIndex := 0 + + // Where should scanning start? + if dstStart.After(srcStart) { + advance := dstStart.Sub(srcStart) / srcInterval + srcIndex += int(advance) + srcStart = srcStart.Add(advance * srcInterval) + } + + // The i'th value is computed as show below. + // interval = (finish/start)/num + // i'th value = sum of observation in range + // [ start + i * interval, + // start + (i + 1) * interval ) + for i := 0; i < num; i++ { + results[i] = ts.resetObservation(results[i]) + dstEnd := dstStart.Add(dstInterval) + for srcIndex < ts.numBuckets && srcStart.Before(dstEnd) { + srcEnd := srcStart.Add(srcInterval) + if srcEnd.After(ts.lastAdd) { + srcEnd = ts.lastAdd + } + + if !srcEnd.Before(dstStart) { + srcValue := l.buckets[(srcIndex+l.oldest)%ts.numBuckets] + if !srcStart.Before(dstStart) && !srcEnd.After(dstEnd) { + // dst completely contains src. + if srcValue != nil { + results[i].Add(srcValue) + } + } else { + // dst partially overlaps src. + overlapStart := maxTime(srcStart, dstStart) + overlapEnd := minTime(srcEnd, dstEnd) + base := srcEnd.Sub(srcStart) + fraction := overlapEnd.Sub(overlapStart).Seconds() / base.Seconds() + + used := ts.provider() + if srcValue != nil { + used.CopyFrom(srcValue) + } + used.Multiply(fraction) + results[i].Add(used) + } + + if srcEnd.After(dstEnd) { + break + } + } + srcIndex++ + srcStart = srcStart.Add(srcInterval) + } + dstStart = dstStart.Add(dstInterval) + } +} + +// resetObservation clears the content so the struct may be reused. +func (ts *timeSeries) resetObservation(observation Observable) Observable { + if observation == nil { + observation = ts.provider() + } else { + observation.Clear() + } + return observation +} + +// TimeSeries tracks data at granularities from 1 second to 16 weeks. +type TimeSeries struct { + timeSeries +} + +// NewTimeSeries creates a new TimeSeries using the function provided for creating new Observable. +func NewTimeSeries(f func() Observable) *TimeSeries { + return NewTimeSeriesWithClock(f, defaultClockInstance) +} + +// NewTimeSeriesWithClock creates a new TimeSeries using the function provided for creating new Observable and the clock for +// assigning timestamps. +func NewTimeSeriesWithClock(f func() Observable, clock Clock) *TimeSeries { + ts := new(TimeSeries) + ts.timeSeries.init(timeSeriesResolutions, f, timeSeriesNumBuckets, clock) + return ts +} + +// MinuteHourSeries tracks data at granularities of 1 minute and 1 hour. +type MinuteHourSeries struct { + timeSeries +} + +// NewMinuteHourSeries creates a new MinuteHourSeries using the function provided for creating new Observable. +func NewMinuteHourSeries(f func() Observable) *MinuteHourSeries { + return NewMinuteHourSeriesWithClock(f, defaultClockInstance) +} + +// NewMinuteHourSeriesWithClock creates a new MinuteHourSeries using the function provided for creating new Observable and the clock for +// assigning timestamps. +func NewMinuteHourSeriesWithClock(f func() Observable, clock Clock) *MinuteHourSeries { + ts := new(MinuteHourSeries) + ts.timeSeries.init(minuteHourSeriesResolutions, f, + minuteHourSeriesNumBuckets, clock) + return ts +} + +func (ts *MinuteHourSeries) Minute() Observable { + return ts.timeSeries.Latest(0, 60) +} + +func (ts *MinuteHourSeries) Hour() Observable { + return ts.timeSeries.Latest(1, 60) +} + +func minTime(a, b time.Time) time.Time { + if a.Before(b) { + return a + } + return b +} + +func maxTime(a, b time.Time) time.Time { + if a.After(b) { + return a + } + return b +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/timeseries/timeseries_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/timeseries/timeseries_test.go new file mode 100644 index 0000000..66325a9 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/internal/timeseries/timeseries_test.go @@ -0,0 +1,170 @@ +// Copyright 2015 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 timeseries + +import ( + "math" + "testing" + "time" +) + +func isNear(x *Float, y float64, tolerance float64) bool { + return math.Abs(x.Value()-y) < tolerance +} + +func isApproximate(x *Float, y float64) bool { + return isNear(x, y, 1e-2) +} + +func checkApproximate(t *testing.T, o Observable, y float64) { + x := o.(*Float) + if !isApproximate(x, y) { + t.Errorf("Wanted %g, got %g", y, x.Value()) + } +} + +func checkNear(t *testing.T, o Observable, y, tolerance float64) { + x := o.(*Float) + if !isNear(x, y, tolerance) { + t.Errorf("Wanted %g +- %g, got %g", y, tolerance, x.Value()) + } +} + +var baseTime = time.Date(2013, 1, 1, 0, 0, 0, 0, time.UTC) + +func tu(s int64) time.Time { + return baseTime.Add(time.Duration(s) * time.Second) +} + +func tu2(s int64, ns int64) time.Time { + return baseTime.Add(time.Duration(s)*time.Second + time.Duration(ns)*time.Nanosecond) +} + +func TestBasicTimeSeries(t *testing.T) { + ts := NewTimeSeries(NewFloat) + fo := new(Float) + *fo = Float(10) + ts.AddWithTime(fo, tu(1)) + ts.AddWithTime(fo, tu(1)) + ts.AddWithTime(fo, tu(1)) + ts.AddWithTime(fo, tu(1)) + checkApproximate(t, ts.Range(tu(0), tu(1)), 40) + checkApproximate(t, ts.Total(), 40) + ts.AddWithTime(fo, tu(3)) + ts.AddWithTime(fo, tu(3)) + ts.AddWithTime(fo, tu(3)) + checkApproximate(t, ts.Range(tu(0), tu(2)), 40) + checkApproximate(t, ts.Range(tu(2), tu(4)), 30) + checkApproximate(t, ts.Total(), 70) + ts.AddWithTime(fo, tu(1)) + ts.AddWithTime(fo, tu(1)) + checkApproximate(t, ts.Range(tu(0), tu(2)), 60) + checkApproximate(t, ts.Range(tu(2), tu(4)), 30) + checkApproximate(t, ts.Total(), 90) + *fo = Float(100) + ts.AddWithTime(fo, tu(100)) + checkApproximate(t, ts.Range(tu(99), tu(100)), 100) + checkApproximate(t, ts.Range(tu(0), tu(4)), 36) + checkApproximate(t, ts.Total(), 190) + *fo = Float(10) + ts.AddWithTime(fo, tu(1)) + ts.AddWithTime(fo, tu(1)) + checkApproximate(t, ts.Range(tu(0), tu(4)), 44) + checkApproximate(t, ts.Range(tu(37), tu2(100, 100e6)), 100) + checkApproximate(t, ts.Range(tu(50), tu2(100, 100e6)), 100) + checkApproximate(t, ts.Range(tu(99), tu2(100, 100e6)), 100) + checkApproximate(t, ts.Total(), 210) + + for i, l := range ts.ComputeRange(tu(36), tu(100), 64) { + if i == 63 { + checkApproximate(t, l, 100) + } else { + checkApproximate(t, l, 0) + } + } + + checkApproximate(t, ts.Range(tu(0), tu(100)), 210) + checkApproximate(t, ts.Range(tu(10), tu(100)), 100) + + for i, l := range ts.ComputeRange(tu(0), tu(100), 100) { + if i < 10 { + checkApproximate(t, l, 11) + } else if i >= 90 { + checkApproximate(t, l, 10) + } else { + checkApproximate(t, l, 0) + } + } +} + +func TestFloat(t *testing.T) { + f := Float(1) + if g, w := f.String(), "1"; g != w { + t.Errorf("Float(1).String = %q; want %q", g, w) + } + f2 := Float(2) + var o Observable = &f2 + f.Add(o) + if g, w := f.Value(), 3.0; g != w { + t.Errorf("Float post-add = %v; want %v", g, w) + } + f.Multiply(2) + if g, w := f.Value(), 6.0; g != w { + t.Errorf("Float post-multiply = %v; want %v", g, w) + } + f.Clear() + if g, w := f.Value(), 0.0; g != w { + t.Errorf("Float post-clear = %v; want %v", g, w) + } + f.CopyFrom(&f2) + if g, w := f.Value(), 2.0; g != w { + t.Errorf("Float post-CopyFrom = %v; want %v", g, w) + } +} + +type mockClock struct { + time time.Time +} + +func (m *mockClock) Time() time.Time { return m.time } +func (m *mockClock) Set(t time.Time) { m.time = t } + +const buckets = 6 + +var testResolutions = []time.Duration{ + 10 * time.Second, // level holds one minute of observations + 100 * time.Second, // level holds ten minutes of observations + 10 * time.Minute, // level holds one hour of observations +} + +// TestTimeSeries uses a small number of buckets to force a higher +// error rate on approximations from the timeseries. +type TestTimeSeries struct { + timeSeries +} + +func TestExpectedErrorRate(t *testing.T) { + ts := new(TestTimeSeries) + fake := new(mockClock) + fake.Set(time.Now()) + ts.timeSeries.init(testResolutions, NewFloat, buckets, fake) + for i := 1; i <= 61*61; i++ { + fake.Set(fake.Time().Add(1 * time.Second)) + ob := Float(1) + ts.AddWithTime(&ob, fake.Time()) + + // The results should be accurate within one missing bucket (1/6) of the observations recorded. + checkNear(t, ts.Latest(0, buckets), min(float64(i), 60), 10) + checkNear(t, ts.Latest(1, buckets), min(float64(i), 600), 100) + checkNear(t, ts.Latest(2, buckets), min(float64(i), 3600), 600) + } +} + +func min(a, b float64) float64 { + if a < b { + return a + } + return b +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/batch.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/batch.go new file mode 100644 index 0000000..b445499 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/batch.go @@ -0,0 +1,191 @@ +// 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. + +// +build go1.9 + +package ipv4 + +import ( + "net" + "runtime" + "syscall" + + "golang.org/x/net/internal/socket" +) + +// BUG(mikio): On Windows, the ReadBatch and WriteBatch methods of +// PacketConn are not implemented. + +// BUG(mikio): On Windows, the ReadBatch and WriteBatch methods of +// RawConn are not implemented. + +// A Message represents an IO message. +// +// type Message struct { +// Buffers [][]byte +// OOB []byte +// Addr net.Addr +// N int +// NN int +// Flags int +// } +// +// The Buffers fields represents a list of contiguous buffers, which +// can be used for vectored IO, for example, putting a header and a +// payload in each slice. +// When writing, the Buffers field must contain at least one byte to +// write. +// When reading, the Buffers field will always contain a byte to read. +// +// The OOB field contains protocol-specific control or miscellaneous +// ancillary data known as out-of-band data. +// It can be nil when not required. +// +// The Addr field specifies a destination address when writing. +// It can be nil when the underlying protocol of the endpoint uses +// connection-oriented communication. +// After a successful read, it may contain the source address on the +// received packet. +// +// The N field indicates the number of bytes read or written from/to +// Buffers. +// +// The NN field indicates the number of bytes read or written from/to +// OOB. +// +// The Flags field contains protocol-specific information on the +// received message. +type Message = socket.Message + +// ReadBatch reads a batch of messages. +// +// The provided flags is a set of platform-dependent flags, such as +// syscall.MSG_PEEK. +// +// On a successful read it returns the number of messages received, up +// to len(ms). +// +// On Linux, a batch read will be optimized. +// On other platforms, this method will read only a single message. +// +// Unlike the ReadFrom method, it doesn't strip the IPv4 header +// followed by option headers from the received IPv4 datagram when the +// underlying transport is net.IPConn. Each Buffers field of Message +// must be large enough to accommodate an IPv4 header and option +// headers. +func (c *payloadHandler) ReadBatch(ms []Message, flags int) (int, error) { + if !c.ok() { + return 0, syscall.EINVAL + } + switch runtime.GOOS { + case "linux": + n, err := c.RecvMsgs([]socket.Message(ms), flags) + if err != nil { + err = &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + return n, err + default: + n := 1 + err := c.RecvMsg(&ms[0], flags) + if err != nil { + n = 0 + err = &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + return n, err + } +} + +// WriteBatch writes a batch of messages. +// +// The provided flags is a set of platform-dependent flags, such as +// syscall.MSG_DONTROUTE. +// +// It returns the number of messages written on a successful write. +// +// On Linux, a batch write will be optimized. +// On other platforms, this method will write only a single message. +func (c *payloadHandler) WriteBatch(ms []Message, flags int) (int, error) { + if !c.ok() { + return 0, syscall.EINVAL + } + switch runtime.GOOS { + case "linux": + n, err := c.SendMsgs([]socket.Message(ms), flags) + if err != nil { + err = &net.OpError{Op: "write", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + return n, err + default: + n := 1 + err := c.SendMsg(&ms[0], flags) + if err != nil { + n = 0 + err = &net.OpError{Op: "write", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + return n, err + } +} + +// ReadBatch reads a batch of messages. +// +// The provided flags is a set of platform-dependent flags, such as +// syscall.MSG_PEEK. +// +// On a successful read it returns the number of messages received, up +// to len(ms). +// +// On Linux, a batch read will be optimized. +// On other platforms, this method will read only a single message. +func (c *packetHandler) ReadBatch(ms []Message, flags int) (int, error) { + if !c.ok() { + return 0, syscall.EINVAL + } + switch runtime.GOOS { + case "linux": + n, err := c.RecvMsgs([]socket.Message(ms), flags) + if err != nil { + err = &net.OpError{Op: "read", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Err: err} + } + return n, err + default: + n := 1 + err := c.RecvMsg(&ms[0], flags) + if err != nil { + n = 0 + err = &net.OpError{Op: "read", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Err: err} + } + return n, err + } +} + +// WriteBatch writes a batch of messages. +// +// The provided flags is a set of platform-dependent flags, such as +// syscall.MSG_DONTROUTE. +// +// It returns the number of messages written on a successful write. +// +// On Linux, a batch write will be optimized. +// On other platforms, this method will write only a single message. +func (c *packetHandler) WriteBatch(ms []Message, flags int) (int, error) { + if !c.ok() { + return 0, syscall.EINVAL + } + switch runtime.GOOS { + case "linux": + n, err := c.SendMsgs([]socket.Message(ms), flags) + if err != nil { + err = &net.OpError{Op: "write", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Err: err} + } + return n, err + default: + n := 1 + err := c.SendMsg(&ms[0], flags) + if err != nil { + n = 0 + err = &net.OpError{Op: "write", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Err: err} + } + return n, err + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/bpf_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/bpf_test.go new file mode 100644 index 0000000..b44da90 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/bpf_test.go @@ -0,0 +1,93 @@ +// 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 ipv4_test + +import ( + "net" + "runtime" + "testing" + "time" + + "golang.org/x/net/bpf" + "golang.org/x/net/ipv4" +) + +func TestBPF(t *testing.T) { + if runtime.GOOS != "linux" { + t.Skipf("not supported on %s", runtime.GOOS) + } + + l, err := net.ListenPacket("udp4", "127.0.0.1:0") + if err != nil { + t.Fatal(err) + } + defer l.Close() + + p := ipv4.NewPacketConn(l) + + // This filter accepts UDP packets whose first payload byte is + // even. + prog, err := bpf.Assemble([]bpf.Instruction{ + // Load the first byte of the payload (skipping UDP header). + bpf.LoadAbsolute{Off: 8, Size: 1}, + // Select LSB of the byte. + bpf.ALUOpConstant{Op: bpf.ALUOpAnd, Val: 1}, + // Byte is even? + bpf.JumpIf{Cond: bpf.JumpEqual, Val: 0, SkipFalse: 1}, + // Accept. + bpf.RetConstant{Val: 4096}, + // Ignore. + bpf.RetConstant{Val: 0}, + }) + if err != nil { + t.Fatalf("compiling BPF: %s", err) + } + + if err = p.SetBPF(prog); err != nil { + t.Fatalf("attaching filter to Conn: %s", err) + } + + s, err := net.Dial("udp4", l.LocalAddr().String()) + if err != nil { + t.Fatal(err) + } + defer s.Close() + go func() { + for i := byte(0); i < 10; i++ { + s.Write([]byte{i}) + } + }() + + l.SetDeadline(time.Now().Add(2 * time.Second)) + seen := make([]bool, 5) + for { + var b [512]byte + n, _, err := l.ReadFrom(b[:]) + if err != nil { + t.Fatalf("reading from listener: %s", err) + } + if n != 1 { + t.Fatalf("unexpected packet length, want 1, got %d", n) + } + if b[0] >= 10 { + t.Fatalf("unexpected byte, want 0-9, got %d", b[0]) + } + if b[0]%2 != 0 { + t.Fatalf("got odd byte %d, wanted only even bytes", b[0]) + } + seen[b[0]/2] = true + + seenAll := true + for _, v := range seen { + if !v { + seenAll = false + break + } + } + if seenAll { + break + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/control.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/control.go new file mode 100644 index 0000000..a2b02ca --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/control.go @@ -0,0 +1,144 @@ +// 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 ipv4 + +import ( + "fmt" + "net" + "sync" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +type rawOpt struct { + sync.RWMutex + cflags ControlFlags +} + +func (c *rawOpt) set(f ControlFlags) { c.cflags |= f } +func (c *rawOpt) clear(f ControlFlags) { c.cflags &^= f } +func (c *rawOpt) isset(f ControlFlags) bool { return c.cflags&f != 0 } + +type ControlFlags uint + +const ( + FlagTTL ControlFlags = 1 << iota // pass the TTL on the received packet + FlagSrc // pass the source address on the received packet + FlagDst // pass the destination address on the received packet + FlagInterface // pass the interface index on the received packet +) + +// A ControlMessage represents per packet basis IP-level socket options. +type ControlMessage struct { + // Receiving socket options: SetControlMessage allows to + // receive the options from the protocol stack using ReadFrom + // method of PacketConn or RawConn. + // + // Specifying socket options: ControlMessage for WriteTo + // method of PacketConn or RawConn allows to send the options + // to the protocol stack. + // + TTL int // time-to-live, receiving only + Src net.IP // source address, specifying only + Dst net.IP // destination address, receiving only + IfIndex int // interface index, must be 1 <= value when specifying +} + +func (cm *ControlMessage) String() string { + if cm == nil { + return "" + } + return fmt.Sprintf("ttl=%d src=%v dst=%v ifindex=%d", cm.TTL, cm.Src, cm.Dst, cm.IfIndex) +} + +// Marshal returns the binary encoding of cm. +func (cm *ControlMessage) Marshal() []byte { + if cm == nil { + return nil + } + var m socket.ControlMessage + if ctlOpts[ctlPacketInfo].name > 0 && (cm.Src.To4() != nil || cm.IfIndex > 0) { + m = socket.NewControlMessage([]int{ctlOpts[ctlPacketInfo].length}) + } + if len(m) > 0 { + ctlOpts[ctlPacketInfo].marshal(m, cm) + } + return m +} + +// Parse parses b as a control message and stores the result in cm. +func (cm *ControlMessage) Parse(b []byte) error { + ms, err := socket.ControlMessage(b).Parse() + if err != nil { + return err + } + for _, m := range ms { + lvl, typ, l, err := m.ParseHeader() + if err != nil { + return err + } + if lvl != iana.ProtocolIP { + continue + } + switch { + case typ == ctlOpts[ctlTTL].name && l >= ctlOpts[ctlTTL].length: + ctlOpts[ctlTTL].parse(cm, m.Data(l)) + case typ == ctlOpts[ctlDst].name && l >= ctlOpts[ctlDst].length: + ctlOpts[ctlDst].parse(cm, m.Data(l)) + case typ == ctlOpts[ctlInterface].name && l >= ctlOpts[ctlInterface].length: + ctlOpts[ctlInterface].parse(cm, m.Data(l)) + case typ == ctlOpts[ctlPacketInfo].name && l >= ctlOpts[ctlPacketInfo].length: + ctlOpts[ctlPacketInfo].parse(cm, m.Data(l)) + } + } + return nil +} + +// NewControlMessage returns a new control message. +// +// The returned message is large enough for options specified by cf. +func NewControlMessage(cf ControlFlags) []byte { + opt := rawOpt{cflags: cf} + var l int + if opt.isset(FlagTTL) && ctlOpts[ctlTTL].name > 0 { + l += socket.ControlMessageSpace(ctlOpts[ctlTTL].length) + } + if ctlOpts[ctlPacketInfo].name > 0 { + if opt.isset(FlagSrc | FlagDst | FlagInterface) { + l += socket.ControlMessageSpace(ctlOpts[ctlPacketInfo].length) + } + } else { + if opt.isset(FlagDst) && ctlOpts[ctlDst].name > 0 { + l += socket.ControlMessageSpace(ctlOpts[ctlDst].length) + } + if opt.isset(FlagInterface) && ctlOpts[ctlInterface].name > 0 { + l += socket.ControlMessageSpace(ctlOpts[ctlInterface].length) + } + } + var b []byte + if l > 0 { + b = make([]byte, l) + } + return b +} + +// Ancillary data socket options +const ( + ctlTTL = iota // header field + ctlSrc // header field + ctlDst // header field + ctlInterface // inbound or outbound interface + ctlPacketInfo // inbound or outbound packet path + ctlMax +) + +// A ctlOpt represents a binding for ancillary data socket option. +type ctlOpt struct { + name int // option name, must be equal or greater than 1 + length int // option length + marshal func([]byte, *ControlMessage) []byte + parse func(*ControlMessage, []byte) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/control_bsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/control_bsd.go new file mode 100644 index 0000000..77e7ad5 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/control_bsd.go @@ -0,0 +1,40 @@ +// 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. + +// +build darwin dragonfly freebsd netbsd openbsd + +package ipv4 + +import ( + "net" + "syscall" + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +func marshalDst(b []byte, cm *ControlMessage) []byte { + m := socket.ControlMessage(b) + m.MarshalHeader(iana.ProtocolIP, sysIP_RECVDSTADDR, net.IPv4len) + return m.Next(net.IPv4len) +} + +func parseDst(cm *ControlMessage, b []byte) { + if len(cm.Dst) < net.IPv4len { + cm.Dst = make(net.IP, net.IPv4len) + } + copy(cm.Dst, b[:net.IPv4len]) +} + +func marshalInterface(b []byte, cm *ControlMessage) []byte { + m := socket.ControlMessage(b) + m.MarshalHeader(iana.ProtocolIP, sysIP_RECVIF, syscall.SizeofSockaddrDatalink) + return m.Next(syscall.SizeofSockaddrDatalink) +} + +func parseInterface(cm *ControlMessage, b []byte) { + sadl := (*syscall.SockaddrDatalink)(unsafe.Pointer(&b[0])) + cm.IfIndex = int(sadl.Index) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/control_pktinfo.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/control_pktinfo.go new file mode 100644 index 0000000..425338f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/control_pktinfo.go @@ -0,0 +1,39 @@ +// 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. + +// +build darwin linux solaris + +package ipv4 + +import ( + "net" + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +func marshalPacketInfo(b []byte, cm *ControlMessage) []byte { + m := socket.ControlMessage(b) + m.MarshalHeader(iana.ProtocolIP, sysIP_PKTINFO, sizeofInetPktinfo) + if cm != nil { + pi := (*inetPktinfo)(unsafe.Pointer(&m.Data(sizeofInetPktinfo)[0])) + if ip := cm.Src.To4(); ip != nil { + copy(pi.Spec_dst[:], ip) + } + if cm.IfIndex > 0 { + pi.setIfindex(cm.IfIndex) + } + } + return m.Next(sizeofInetPktinfo) +} + +func parsePacketInfo(cm *ControlMessage, b []byte) { + pi := (*inetPktinfo)(unsafe.Pointer(&b[0])) + cm.IfIndex = int(pi.Ifindex) + if len(cm.Dst) < net.IPv4len { + cm.Dst = make(net.IP, net.IPv4len) + } + copy(cm.Dst, pi.Addr[:]) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/control_stub.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/control_stub.go new file mode 100644 index 0000000..5a2f7d8 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/control_stub.go @@ -0,0 +1,13 @@ +// 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. + +// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows + +package ipv4 + +import "golang.org/x/net/internal/socket" + +func setControlMessage(c *socket.Conn, opt *rawOpt, cf ControlFlags, on bool) error { + return errOpNoSupport +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/control_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/control_test.go new file mode 100644 index 0000000..f87fe12 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/control_test.go @@ -0,0 +1,21 @@ +// 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 ipv4_test + +import ( + "testing" + + "golang.org/x/net/ipv4" +) + +func TestControlMessageParseWithFuzz(t *testing.T) { + var cm ipv4.ControlMessage + for _, fuzz := range []string{ + "\f\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00", + "\f\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x00\x00", + } { + cm.Parse([]byte(fuzz)) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/control_unix.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/control_unix.go new file mode 100644 index 0000000..e1ae816 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/control_unix.go @@ -0,0 +1,73 @@ +// 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +package ipv4 + +import ( + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +func setControlMessage(c *socket.Conn, opt *rawOpt, cf ControlFlags, on bool) error { + opt.Lock() + defer opt.Unlock() + if so, ok := sockOpts[ssoReceiveTTL]; ok && cf&FlagTTL != 0 { + if err := so.SetInt(c, boolint(on)); err != nil { + return err + } + if on { + opt.set(FlagTTL) + } else { + opt.clear(FlagTTL) + } + } + if so, ok := sockOpts[ssoPacketInfo]; ok { + if cf&(FlagSrc|FlagDst|FlagInterface) != 0 { + if err := so.SetInt(c, boolint(on)); err != nil { + return err + } + if on { + opt.set(cf & (FlagSrc | FlagDst | FlagInterface)) + } else { + opt.clear(cf & (FlagSrc | FlagDst | FlagInterface)) + } + } + } else { + if so, ok := sockOpts[ssoReceiveDst]; ok && cf&FlagDst != 0 { + if err := so.SetInt(c, boolint(on)); err != nil { + return err + } + if on { + opt.set(FlagDst) + } else { + opt.clear(FlagDst) + } + } + if so, ok := sockOpts[ssoReceiveInterface]; ok && cf&FlagInterface != 0 { + if err := so.SetInt(c, boolint(on)); err != nil { + return err + } + if on { + opt.set(FlagInterface) + } else { + opt.clear(FlagInterface) + } + } + } + return nil +} + +func marshalTTL(b []byte, cm *ControlMessage) []byte { + m := socket.ControlMessage(b) + m.MarshalHeader(iana.ProtocolIP, sysIP_RECVTTL, 1) + return m.Next(1) +} + +func parseTTL(cm *ControlMessage, b []byte) { + cm.TTL = int(*(*byte)(unsafe.Pointer(&b[:1][0]))) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/control_windows.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/control_windows.go new file mode 100644 index 0000000..ce55c66 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/control_windows.go @@ -0,0 +1,16 @@ +// 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 ipv4 + +import ( + "syscall" + + "golang.org/x/net/internal/socket" +) + +func setControlMessage(c *socket.Conn, opt *rawOpt, cf ControlFlags, on bool) error { + // TODO(mikio): implement this + return syscall.EWINDOWS +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/defs_darwin.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/defs_darwin.go new file mode 100644 index 0000000..c8f2e05 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/defs_darwin.go @@ -0,0 +1,77 @@ +// 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. + +// +build ignore + +// +godefs map struct_in_addr [4]byte /* in_addr */ + +package ipv4 + +/* +#include + +#include +*/ +import "C" + +const ( + sysIP_OPTIONS = C.IP_OPTIONS + sysIP_HDRINCL = C.IP_HDRINCL + sysIP_TOS = C.IP_TOS + sysIP_TTL = C.IP_TTL + sysIP_RECVOPTS = C.IP_RECVOPTS + sysIP_RECVRETOPTS = C.IP_RECVRETOPTS + sysIP_RECVDSTADDR = C.IP_RECVDSTADDR + sysIP_RETOPTS = C.IP_RETOPTS + sysIP_RECVIF = C.IP_RECVIF + sysIP_STRIPHDR = C.IP_STRIPHDR + sysIP_RECVTTL = C.IP_RECVTTL + sysIP_BOUND_IF = C.IP_BOUND_IF + sysIP_PKTINFO = C.IP_PKTINFO + sysIP_RECVPKTINFO = C.IP_RECVPKTINFO + + sysIP_MULTICAST_IF = C.IP_MULTICAST_IF + sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL + sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP + sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP + sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP + sysIP_MULTICAST_VIF = C.IP_MULTICAST_VIF + sysIP_MULTICAST_IFINDEX = C.IP_MULTICAST_IFINDEX + sysIP_ADD_SOURCE_MEMBERSHIP = C.IP_ADD_SOURCE_MEMBERSHIP + sysIP_DROP_SOURCE_MEMBERSHIP = C.IP_DROP_SOURCE_MEMBERSHIP + sysIP_BLOCK_SOURCE = C.IP_BLOCK_SOURCE + sysIP_UNBLOCK_SOURCE = C.IP_UNBLOCK_SOURCE + sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP + sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP + sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP + sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP + sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE + sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE + + sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sizeofInetPktinfo = C.sizeof_struct_in_pktinfo + + sizeofIPMreq = C.sizeof_struct_ip_mreq + sizeofIPMreqn = C.sizeof_struct_ip_mreqn + sizeofIPMreqSource = C.sizeof_struct_ip_mreq_source + sizeofGroupReq = C.sizeof_struct_group_req + sizeofGroupSourceReq = C.sizeof_struct_group_source_req +) + +type sockaddrStorage C.struct_sockaddr_storage + +type sockaddrInet C.struct_sockaddr_in + +type inetPktinfo C.struct_in_pktinfo + +type ipMreq C.struct_ip_mreq + +type ipMreqn C.struct_ip_mreqn + +type ipMreqSource C.struct_ip_mreq_source + +type groupReq C.struct_group_req + +type groupSourceReq C.struct_group_source_req diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/defs_dragonfly.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/defs_dragonfly.go new file mode 100644 index 0000000..f30544e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/defs_dragonfly.go @@ -0,0 +1,38 @@ +// 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. + +// +build ignore + +// +godefs map struct_in_addr [4]byte /* in_addr */ + +package ipv4 + +/* +#include +*/ +import "C" + +const ( + sysIP_OPTIONS = C.IP_OPTIONS + sysIP_HDRINCL = C.IP_HDRINCL + sysIP_TOS = C.IP_TOS + sysIP_TTL = C.IP_TTL + sysIP_RECVOPTS = C.IP_RECVOPTS + sysIP_RECVRETOPTS = C.IP_RECVRETOPTS + sysIP_RECVDSTADDR = C.IP_RECVDSTADDR + sysIP_RETOPTS = C.IP_RETOPTS + sysIP_RECVIF = C.IP_RECVIF + sysIP_RECVTTL = C.IP_RECVTTL + + sysIP_MULTICAST_IF = C.IP_MULTICAST_IF + sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL + sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP + sysIP_MULTICAST_VIF = C.IP_MULTICAST_VIF + sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP + sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP + + sizeofIPMreq = C.sizeof_struct_ip_mreq +) + +type ipMreq C.struct_ip_mreq diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/defs_freebsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/defs_freebsd.go new file mode 100644 index 0000000..4dd57d8 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/defs_freebsd.go @@ -0,0 +1,75 @@ +// 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. + +// +build ignore + +// +godefs map struct_in_addr [4]byte /* in_addr */ + +package ipv4 + +/* +#include + +#include +*/ +import "C" + +const ( + sysIP_OPTIONS = C.IP_OPTIONS + sysIP_HDRINCL = C.IP_HDRINCL + sysIP_TOS = C.IP_TOS + sysIP_TTL = C.IP_TTL + sysIP_RECVOPTS = C.IP_RECVOPTS + sysIP_RECVRETOPTS = C.IP_RECVRETOPTS + sysIP_RECVDSTADDR = C.IP_RECVDSTADDR + sysIP_SENDSRCADDR = C.IP_SENDSRCADDR + sysIP_RETOPTS = C.IP_RETOPTS + sysIP_RECVIF = C.IP_RECVIF + sysIP_ONESBCAST = C.IP_ONESBCAST + sysIP_BINDANY = C.IP_BINDANY + sysIP_RECVTTL = C.IP_RECVTTL + sysIP_MINTTL = C.IP_MINTTL + sysIP_DONTFRAG = C.IP_DONTFRAG + sysIP_RECVTOS = C.IP_RECVTOS + + sysIP_MULTICAST_IF = C.IP_MULTICAST_IF + sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL + sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP + sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP + sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP + sysIP_MULTICAST_VIF = C.IP_MULTICAST_VIF + sysIP_ADD_SOURCE_MEMBERSHIP = C.IP_ADD_SOURCE_MEMBERSHIP + sysIP_DROP_SOURCE_MEMBERSHIP = C.IP_DROP_SOURCE_MEMBERSHIP + sysIP_BLOCK_SOURCE = C.IP_BLOCK_SOURCE + sysIP_UNBLOCK_SOURCE = C.IP_UNBLOCK_SOURCE + sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP + sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP + sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP + sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP + sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE + sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE + + sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + + sizeofIPMreq = C.sizeof_struct_ip_mreq + sizeofIPMreqn = C.sizeof_struct_ip_mreqn + sizeofIPMreqSource = C.sizeof_struct_ip_mreq_source + sizeofGroupReq = C.sizeof_struct_group_req + sizeofGroupSourceReq = C.sizeof_struct_group_source_req +) + +type sockaddrStorage C.struct_sockaddr_storage + +type sockaddrInet C.struct_sockaddr_in + +type ipMreq C.struct_ip_mreq + +type ipMreqn C.struct_ip_mreqn + +type ipMreqSource C.struct_ip_mreq_source + +type groupReq C.struct_group_req + +type groupSourceReq C.struct_group_source_req diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/defs_linux.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/defs_linux.go new file mode 100644 index 0000000..beb1107 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/defs_linux.go @@ -0,0 +1,122 @@ +// 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. + +// +build ignore + +// +godefs map struct_in_addr [4]byte /* in_addr */ + +package ipv4 + +/* +#include + +#include +#include +#include +#include +#include +*/ +import "C" + +const ( + sysIP_TOS = C.IP_TOS + sysIP_TTL = C.IP_TTL + sysIP_HDRINCL = C.IP_HDRINCL + sysIP_OPTIONS = C.IP_OPTIONS + sysIP_ROUTER_ALERT = C.IP_ROUTER_ALERT + sysIP_RECVOPTS = C.IP_RECVOPTS + sysIP_RETOPTS = C.IP_RETOPTS + sysIP_PKTINFO = C.IP_PKTINFO + sysIP_PKTOPTIONS = C.IP_PKTOPTIONS + sysIP_MTU_DISCOVER = C.IP_MTU_DISCOVER + sysIP_RECVERR = C.IP_RECVERR + sysIP_RECVTTL = C.IP_RECVTTL + sysIP_RECVTOS = C.IP_RECVTOS + sysIP_MTU = C.IP_MTU + sysIP_FREEBIND = C.IP_FREEBIND + sysIP_TRANSPARENT = C.IP_TRANSPARENT + sysIP_RECVRETOPTS = C.IP_RECVRETOPTS + sysIP_ORIGDSTADDR = C.IP_ORIGDSTADDR + sysIP_RECVORIGDSTADDR = C.IP_RECVORIGDSTADDR + sysIP_MINTTL = C.IP_MINTTL + sysIP_NODEFRAG = C.IP_NODEFRAG + sysIP_UNICAST_IF = C.IP_UNICAST_IF + + sysIP_MULTICAST_IF = C.IP_MULTICAST_IF + sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL + sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP + sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP + sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP + sysIP_UNBLOCK_SOURCE = C.IP_UNBLOCK_SOURCE + sysIP_BLOCK_SOURCE = C.IP_BLOCK_SOURCE + sysIP_ADD_SOURCE_MEMBERSHIP = C.IP_ADD_SOURCE_MEMBERSHIP + sysIP_DROP_SOURCE_MEMBERSHIP = C.IP_DROP_SOURCE_MEMBERSHIP + sysIP_MSFILTER = C.IP_MSFILTER + sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP + sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP + sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP + sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP + sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE + sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE + sysMCAST_MSFILTER = C.MCAST_MSFILTER + sysIP_MULTICAST_ALL = C.IP_MULTICAST_ALL + + //sysIP_PMTUDISC_DONT = C.IP_PMTUDISC_DONT + //sysIP_PMTUDISC_WANT = C.IP_PMTUDISC_WANT + //sysIP_PMTUDISC_DO = C.IP_PMTUDISC_DO + //sysIP_PMTUDISC_PROBE = C.IP_PMTUDISC_PROBE + //sysIP_PMTUDISC_INTERFACE = C.IP_PMTUDISC_INTERFACE + //sysIP_PMTUDISC_OMIT = C.IP_PMTUDISC_OMIT + + sysICMP_FILTER = C.ICMP_FILTER + + sysSO_EE_ORIGIN_NONE = C.SO_EE_ORIGIN_NONE + sysSO_EE_ORIGIN_LOCAL = C.SO_EE_ORIGIN_LOCAL + sysSO_EE_ORIGIN_ICMP = C.SO_EE_ORIGIN_ICMP + sysSO_EE_ORIGIN_ICMP6 = C.SO_EE_ORIGIN_ICMP6 + sysSO_EE_ORIGIN_TXSTATUS = C.SO_EE_ORIGIN_TXSTATUS + sysSO_EE_ORIGIN_TIMESTAMPING = C.SO_EE_ORIGIN_TIMESTAMPING + + sysSOL_SOCKET = C.SOL_SOCKET + sysSO_ATTACH_FILTER = C.SO_ATTACH_FILTER + + sizeofKernelSockaddrStorage = C.sizeof_struct___kernel_sockaddr_storage + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sizeofInetPktinfo = C.sizeof_struct_in_pktinfo + sizeofSockExtendedErr = C.sizeof_struct_sock_extended_err + + sizeofIPMreq = C.sizeof_struct_ip_mreq + sizeofIPMreqn = C.sizeof_struct_ip_mreqn + sizeofIPMreqSource = C.sizeof_struct_ip_mreq_source + sizeofGroupReq = C.sizeof_struct_group_req + sizeofGroupSourceReq = C.sizeof_struct_group_source_req + + sizeofICMPFilter = C.sizeof_struct_icmp_filter + + sizeofSockFprog = C.sizeof_struct_sock_fprog +) + +type kernelSockaddrStorage C.struct___kernel_sockaddr_storage + +type sockaddrInet C.struct_sockaddr_in + +type inetPktinfo C.struct_in_pktinfo + +type sockExtendedErr C.struct_sock_extended_err + +type ipMreq C.struct_ip_mreq + +type ipMreqn C.struct_ip_mreqn + +type ipMreqSource C.struct_ip_mreq_source + +type groupReq C.struct_group_req + +type groupSourceReq C.struct_group_source_req + +type icmpFilter C.struct_icmp_filter + +type sockFProg C.struct_sock_fprog + +type sockFilter C.struct_sock_filter diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/defs_netbsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/defs_netbsd.go new file mode 100644 index 0000000..8f8af1b --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/defs_netbsd.go @@ -0,0 +1,37 @@ +// 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. + +// +build ignore + +// +godefs map struct_in_addr [4]byte /* in_addr */ + +package ipv4 + +/* +#include +*/ +import "C" + +const ( + sysIP_OPTIONS = C.IP_OPTIONS + sysIP_HDRINCL = C.IP_HDRINCL + sysIP_TOS = C.IP_TOS + sysIP_TTL = C.IP_TTL + sysIP_RECVOPTS = C.IP_RECVOPTS + sysIP_RECVRETOPTS = C.IP_RECVRETOPTS + sysIP_RECVDSTADDR = C.IP_RECVDSTADDR + sysIP_RETOPTS = C.IP_RETOPTS + sysIP_RECVIF = C.IP_RECVIF + sysIP_RECVTTL = C.IP_RECVTTL + + sysIP_MULTICAST_IF = C.IP_MULTICAST_IF + sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL + sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP + sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP + sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP + + sizeofIPMreq = C.sizeof_struct_ip_mreq +) + +type ipMreq C.struct_ip_mreq diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/defs_openbsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/defs_openbsd.go new file mode 100644 index 0000000..8f8af1b --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/defs_openbsd.go @@ -0,0 +1,37 @@ +// 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. + +// +build ignore + +// +godefs map struct_in_addr [4]byte /* in_addr */ + +package ipv4 + +/* +#include +*/ +import "C" + +const ( + sysIP_OPTIONS = C.IP_OPTIONS + sysIP_HDRINCL = C.IP_HDRINCL + sysIP_TOS = C.IP_TOS + sysIP_TTL = C.IP_TTL + sysIP_RECVOPTS = C.IP_RECVOPTS + sysIP_RECVRETOPTS = C.IP_RECVRETOPTS + sysIP_RECVDSTADDR = C.IP_RECVDSTADDR + sysIP_RETOPTS = C.IP_RETOPTS + sysIP_RECVIF = C.IP_RECVIF + sysIP_RECVTTL = C.IP_RECVTTL + + sysIP_MULTICAST_IF = C.IP_MULTICAST_IF + sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL + sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP + sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP + sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP + + sizeofIPMreq = C.sizeof_struct_ip_mreq +) + +type ipMreq C.struct_ip_mreq diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/defs_solaris.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/defs_solaris.go new file mode 100644 index 0000000..aeb33e9 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/defs_solaris.go @@ -0,0 +1,84 @@ +// 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. + +// +build ignore + +// +godefs map struct_in_addr [4]byte /* in_addr */ + +package ipv4 + +/* +#include + +#include +*/ +import "C" + +const ( + sysIP_OPTIONS = C.IP_OPTIONS + sysIP_HDRINCL = C.IP_HDRINCL + sysIP_TOS = C.IP_TOS + sysIP_TTL = C.IP_TTL + sysIP_RECVOPTS = C.IP_RECVOPTS + sysIP_RECVRETOPTS = C.IP_RECVRETOPTS + sysIP_RECVDSTADDR = C.IP_RECVDSTADDR + sysIP_RETOPTS = C.IP_RETOPTS + sysIP_RECVIF = C.IP_RECVIF + sysIP_RECVSLLA = C.IP_RECVSLLA + sysIP_RECVTTL = C.IP_RECVTTL + + sysIP_MULTICAST_IF = C.IP_MULTICAST_IF + sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL + sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP + sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP + sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP + sysIP_BLOCK_SOURCE = C.IP_BLOCK_SOURCE + sysIP_UNBLOCK_SOURCE = C.IP_UNBLOCK_SOURCE + sysIP_ADD_SOURCE_MEMBERSHIP = C.IP_ADD_SOURCE_MEMBERSHIP + sysIP_DROP_SOURCE_MEMBERSHIP = C.IP_DROP_SOURCE_MEMBERSHIP + sysIP_NEXTHOP = C.IP_NEXTHOP + + sysIP_PKTINFO = C.IP_PKTINFO + sysIP_RECVPKTINFO = C.IP_RECVPKTINFO + sysIP_DONTFRAG = C.IP_DONTFRAG + + sysIP_BOUND_IF = C.IP_BOUND_IF + sysIP_UNSPEC_SRC = C.IP_UNSPEC_SRC + sysIP_BROADCAST_TTL = C.IP_BROADCAST_TTL + sysIP_DHCPINIT_IF = C.IP_DHCPINIT_IF + + sysIP_REUSEADDR = C.IP_REUSEADDR + sysIP_DONTROUTE = C.IP_DONTROUTE + sysIP_BROADCAST = C.IP_BROADCAST + + sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP + sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP + sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE + sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE + sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP + sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP + + sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sizeofInetPktinfo = C.sizeof_struct_in_pktinfo + + sizeofIPMreq = C.sizeof_struct_ip_mreq + sizeofIPMreqSource = C.sizeof_struct_ip_mreq_source + sizeofGroupReq = C.sizeof_struct_group_req + sizeofGroupSourceReq = C.sizeof_struct_group_source_req +) + +type sockaddrStorage C.struct_sockaddr_storage + +type sockaddrInet C.struct_sockaddr_in + +type inetPktinfo C.struct_in_pktinfo + +type ipMreq C.struct_ip_mreq + +type ipMreqSource C.struct_ip_mreq_source + +type groupReq C.struct_group_req + +type groupSourceReq C.struct_group_source_req diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/dgramopt.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/dgramopt.go new file mode 100644 index 0000000..54d77d5 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/dgramopt.go @@ -0,0 +1,265 @@ +// 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 ipv4 + +import ( + "net" + "syscall" + + "golang.org/x/net/bpf" +) + +// MulticastTTL returns the time-to-live field value for outgoing +// multicast packets. +func (c *dgramOpt) MulticastTTL() (int, error) { + if !c.ok() { + return 0, syscall.EINVAL + } + so, ok := sockOpts[ssoMulticastTTL] + if !ok { + return 0, errOpNoSupport + } + return so.GetInt(c.Conn) +} + +// SetMulticastTTL sets the time-to-live field value for future +// outgoing multicast packets. +func (c *dgramOpt) SetMulticastTTL(ttl int) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoMulticastTTL] + if !ok { + return errOpNoSupport + } + return so.SetInt(c.Conn, ttl) +} + +// MulticastInterface returns the default interface for multicast +// packet transmissions. +func (c *dgramOpt) MulticastInterface() (*net.Interface, error) { + if !c.ok() { + return nil, syscall.EINVAL + } + so, ok := sockOpts[ssoMulticastInterface] + if !ok { + return nil, errOpNoSupport + } + return so.getMulticastInterface(c.Conn) +} + +// SetMulticastInterface sets the default interface for future +// multicast packet transmissions. +func (c *dgramOpt) SetMulticastInterface(ifi *net.Interface) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoMulticastInterface] + if !ok { + return errOpNoSupport + } + return so.setMulticastInterface(c.Conn, ifi) +} + +// MulticastLoopback reports whether transmitted multicast packets +// should be copied and send back to the originator. +func (c *dgramOpt) MulticastLoopback() (bool, error) { + if !c.ok() { + return false, syscall.EINVAL + } + so, ok := sockOpts[ssoMulticastLoopback] + if !ok { + return false, errOpNoSupport + } + on, err := so.GetInt(c.Conn) + if err != nil { + return false, err + } + return on == 1, nil +} + +// SetMulticastLoopback sets whether transmitted multicast packets +// should be copied and send back to the originator. +func (c *dgramOpt) SetMulticastLoopback(on bool) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoMulticastLoopback] + if !ok { + return errOpNoSupport + } + return so.SetInt(c.Conn, boolint(on)) +} + +// JoinGroup joins the group address group on the interface ifi. +// By default all sources that can cast data to group are accepted. +// It's possible to mute and unmute data transmission from a specific +// source by using ExcludeSourceSpecificGroup and +// IncludeSourceSpecificGroup. +// JoinGroup uses the system assigned multicast interface when ifi is +// nil, although this is not recommended because the assignment +// depends on platforms and sometimes it might require routing +// configuration. +func (c *dgramOpt) JoinGroup(ifi *net.Interface, group net.Addr) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoJoinGroup] + if !ok { + return errOpNoSupport + } + grp := netAddrToIP4(group) + if grp == nil { + return errMissingAddress + } + return so.setGroup(c.Conn, ifi, grp) +} + +// LeaveGroup leaves the group address group on the interface ifi +// regardless of whether the group is any-source group or +// source-specific group. +func (c *dgramOpt) LeaveGroup(ifi *net.Interface, group net.Addr) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoLeaveGroup] + if !ok { + return errOpNoSupport + } + grp := netAddrToIP4(group) + if grp == nil { + return errMissingAddress + } + return so.setGroup(c.Conn, ifi, grp) +} + +// JoinSourceSpecificGroup joins the source-specific group comprising +// group and source on the interface ifi. +// JoinSourceSpecificGroup uses the system assigned multicast +// interface when ifi is nil, although this is not recommended because +// the assignment depends on platforms and sometimes it might require +// routing configuration. +func (c *dgramOpt) JoinSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoJoinSourceGroup] + if !ok { + return errOpNoSupport + } + grp := netAddrToIP4(group) + if grp == nil { + return errMissingAddress + } + src := netAddrToIP4(source) + if src == nil { + return errMissingAddress + } + return so.setSourceGroup(c.Conn, ifi, grp, src) +} + +// LeaveSourceSpecificGroup leaves the source-specific group on the +// interface ifi. +func (c *dgramOpt) LeaveSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoLeaveSourceGroup] + if !ok { + return errOpNoSupport + } + grp := netAddrToIP4(group) + if grp == nil { + return errMissingAddress + } + src := netAddrToIP4(source) + if src == nil { + return errMissingAddress + } + return so.setSourceGroup(c.Conn, ifi, grp, src) +} + +// ExcludeSourceSpecificGroup excludes the source-specific group from +// the already joined any-source groups by JoinGroup on the interface +// ifi. +func (c *dgramOpt) ExcludeSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoBlockSourceGroup] + if !ok { + return errOpNoSupport + } + grp := netAddrToIP4(group) + if grp == nil { + return errMissingAddress + } + src := netAddrToIP4(source) + if src == nil { + return errMissingAddress + } + return so.setSourceGroup(c.Conn, ifi, grp, src) +} + +// IncludeSourceSpecificGroup includes the excluded source-specific +// group by ExcludeSourceSpecificGroup again on the interface ifi. +func (c *dgramOpt) IncludeSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoUnblockSourceGroup] + if !ok { + return errOpNoSupport + } + grp := netAddrToIP4(group) + if grp == nil { + return errMissingAddress + } + src := netAddrToIP4(source) + if src == nil { + return errMissingAddress + } + return so.setSourceGroup(c.Conn, ifi, grp, src) +} + +// ICMPFilter returns an ICMP filter. +// Currently only Linux supports this. +func (c *dgramOpt) ICMPFilter() (*ICMPFilter, error) { + if !c.ok() { + return nil, syscall.EINVAL + } + so, ok := sockOpts[ssoICMPFilter] + if !ok { + return nil, errOpNoSupport + } + return so.getICMPFilter(c.Conn) +} + +// SetICMPFilter deploys the ICMP filter. +// Currently only Linux supports this. +func (c *dgramOpt) SetICMPFilter(f *ICMPFilter) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoICMPFilter] + if !ok { + return errOpNoSupport + } + return so.setICMPFilter(c.Conn, f) +} + +// SetBPF attaches a BPF program to the connection. +// +// Only supported on Linux. +func (c *dgramOpt) SetBPF(filter []bpf.RawInstruction) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoAttachFilter] + if !ok { + return errOpNoSupport + } + return so.setBPF(c.Conn, filter) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/doc.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/doc.go new file mode 100644 index 0000000..b43935a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/doc.go @@ -0,0 +1,244 @@ +// 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 ipv4 implements IP-level socket options for the Internet +// Protocol version 4. +// +// The package provides IP-level socket options that allow +// manipulation of IPv4 facilities. +// +// The IPv4 protocol and basic host requirements for IPv4 are defined +// in RFC 791 and RFC 1122. +// Host extensions for multicasting and socket interface extensions +// for multicast source filters are defined in RFC 1112 and RFC 3678. +// IGMPv1, IGMPv2 and IGMPv3 are defined in RFC 1112, RFC 2236 and RFC +// 3376. +// Source-specific multicast is defined in RFC 4607. +// +// +// Unicasting +// +// The options for unicasting are available for net.TCPConn, +// net.UDPConn and net.IPConn which are created as network connections +// that use the IPv4 transport. When a single TCP connection carrying +// a data flow of multiple packets needs to indicate the flow is +// important, Conn is used to set the type-of-service field on the +// IPv4 header for each packet. +// +// ln, err := net.Listen("tcp4", "0.0.0.0:1024") +// if err != nil { +// // error handling +// } +// defer ln.Close() +// for { +// c, err := ln.Accept() +// if err != nil { +// // error handling +// } +// go func(c net.Conn) { +// defer c.Close() +// +// The outgoing packets will be labeled DiffServ assured forwarding +// class 1 low drop precedence, known as AF11 packets. +// +// if err := ipv4.NewConn(c).SetTOS(0x28); err != nil { +// // error handling +// } +// if _, err := c.Write(data); err != nil { +// // error handling +// } +// }(c) +// } +// +// +// Multicasting +// +// The options for multicasting are available for net.UDPConn and +// net.IPconn which are created as network connections that use the +// IPv4 transport. A few network facilities must be prepared before +// you begin multicasting, at a minimum joining network interfaces and +// multicast groups. +// +// en0, err := net.InterfaceByName("en0") +// if err != nil { +// // error handling +// } +// en1, err := net.InterfaceByIndex(911) +// if err != nil { +// // error handling +// } +// group := net.IPv4(224, 0, 0, 250) +// +// First, an application listens to an appropriate address with an +// appropriate service port. +// +// c, err := net.ListenPacket("udp4", "0.0.0.0:1024") +// if err != nil { +// // error handling +// } +// defer c.Close() +// +// Second, the application joins multicast groups, starts listening to +// the groups on the specified network interfaces. Note that the +// service port for transport layer protocol does not matter with this +// operation as joining groups affects only network and link layer +// protocols, such as IPv4 and Ethernet. +// +// p := ipv4.NewPacketConn(c) +// if err := p.JoinGroup(en0, &net.UDPAddr{IP: group}); err != nil { +// // error handling +// } +// if err := p.JoinGroup(en1, &net.UDPAddr{IP: group}); err != nil { +// // error handling +// } +// +// The application might set per packet control message transmissions +// between the protocol stack within the kernel. When the application +// needs a destination address on an incoming packet, +// SetControlMessage of PacketConn is used to enable control message +// transmissions. +// +// if err := p.SetControlMessage(ipv4.FlagDst, true); err != nil { +// // error handling +// } +// +// The application could identify whether the received packets are +// of interest by using the control message that contains the +// destination address of the received packet. +// +// b := make([]byte, 1500) +// for { +// n, cm, src, err := p.ReadFrom(b) +// if err != nil { +// // error handling +// } +// if cm.Dst.IsMulticast() { +// if cm.Dst.Equal(group) { +// // joined group, do something +// } else { +// // unknown group, discard +// continue +// } +// } +// +// The application can also send both unicast and multicast packets. +// +// p.SetTOS(0x0) +// p.SetTTL(16) +// if _, err := p.WriteTo(data, nil, src); err != nil { +// // error handling +// } +// dst := &net.UDPAddr{IP: group, Port: 1024} +// for _, ifi := range []*net.Interface{en0, en1} { +// if err := p.SetMulticastInterface(ifi); err != nil { +// // error handling +// } +// p.SetMulticastTTL(2) +// if _, err := p.WriteTo(data, nil, dst); err != nil { +// // error handling +// } +// } +// } +// +// +// More multicasting +// +// An application that uses PacketConn or RawConn may join multiple +// multicast groups. For example, a UDP listener with port 1024 might +// join two different groups across over two different network +// interfaces by using: +// +// c, err := net.ListenPacket("udp4", "0.0.0.0:1024") +// if err != nil { +// // error handling +// } +// defer c.Close() +// p := ipv4.NewPacketConn(c) +// if err := p.JoinGroup(en0, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 248)}); err != nil { +// // error handling +// } +// if err := p.JoinGroup(en0, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 249)}); err != nil { +// // error handling +// } +// if err := p.JoinGroup(en1, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 249)}); err != nil { +// // error handling +// } +// +// It is possible for multiple UDP listeners that listen on the same +// UDP port to join the same multicast group. The net package will +// provide a socket that listens to a wildcard address with reusable +// UDP port when an appropriate multicast address prefix is passed to +// the net.ListenPacket or net.ListenUDP. +// +// c1, err := net.ListenPacket("udp4", "224.0.0.0:1024") +// if err != nil { +// // error handling +// } +// defer c1.Close() +// c2, err := net.ListenPacket("udp4", "224.0.0.0:1024") +// if err != nil { +// // error handling +// } +// defer c2.Close() +// p1 := ipv4.NewPacketConn(c1) +// if err := p1.JoinGroup(en0, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 248)}); err != nil { +// // error handling +// } +// p2 := ipv4.NewPacketConn(c2) +// if err := p2.JoinGroup(en0, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 248)}); err != nil { +// // error handling +// } +// +// Also it is possible for the application to leave or rejoin a +// multicast group on the network interface. +// +// if err := p.LeaveGroup(en0, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 248)}); err != nil { +// // error handling +// } +// if err := p.JoinGroup(en0, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 250)}); err != nil { +// // error handling +// } +// +// +// Source-specific multicasting +// +// An application that uses PacketConn or RawConn on IGMPv3 supported +// platform is able to join source-specific multicast groups. +// The application may use JoinSourceSpecificGroup and +// LeaveSourceSpecificGroup for the operation known as "include" mode, +// +// ssmgroup := net.UDPAddr{IP: net.IPv4(232, 7, 8, 9)} +// ssmsource := net.UDPAddr{IP: net.IPv4(192, 168, 0, 1)}) +// if err := p.JoinSourceSpecificGroup(en0, &ssmgroup, &ssmsource); err != nil { +// // error handling +// } +// if err := p.LeaveSourceSpecificGroup(en0, &ssmgroup, &ssmsource); err != nil { +// // error handling +// } +// +// or JoinGroup, ExcludeSourceSpecificGroup, +// IncludeSourceSpecificGroup and LeaveGroup for the operation known +// as "exclude" mode. +// +// exclsource := net.UDPAddr{IP: net.IPv4(192, 168, 0, 254)} +// if err := p.JoinGroup(en0, &ssmgroup); err != nil { +// // error handling +// } +// if err := p.ExcludeSourceSpecificGroup(en0, &ssmgroup, &exclsource); err != nil { +// // error handling +// } +// if err := p.LeaveGroup(en0, &ssmgroup); err != nil { +// // error handling +// } +// +// Note that it depends on each platform implementation what happens +// when an application which runs on IGMPv3 unsupported platform uses +// JoinSourceSpecificGroup and LeaveSourceSpecificGroup. +// In general the platform tries to fall back to conversations using +// IGMPv1 or IGMPv2 and starts to listen to multicast traffic. +// In the fallback case, ExcludeSourceSpecificGroup and +// IncludeSourceSpecificGroup may return an error. +package ipv4 // import "golang.org/x/net/ipv4" + +// BUG(mikio): This package is not implemented on NaCl and Plan 9. diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/endpoint.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/endpoint.go new file mode 100644 index 0000000..2ab8773 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/endpoint.go @@ -0,0 +1,187 @@ +// 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 ipv4 + +import ( + "net" + "syscall" + "time" + + "golang.org/x/net/internal/socket" +) + +// BUG(mikio): On Windows, the JoinSourceSpecificGroup, +// LeaveSourceSpecificGroup, ExcludeSourceSpecificGroup and +// IncludeSourceSpecificGroup methods of PacketConn and RawConn are +// not implemented. + +// A Conn represents a network endpoint that uses the IPv4 transport. +// It is used to control basic IP-level socket options such as TOS and +// TTL. +type Conn struct { + genericOpt +} + +type genericOpt struct { + *socket.Conn +} + +func (c *genericOpt) ok() bool { return c != nil && c.Conn != nil } + +// NewConn returns a new Conn. +func NewConn(c net.Conn) *Conn { + cc, _ := socket.NewConn(c) + return &Conn{ + genericOpt: genericOpt{Conn: cc}, + } +} + +// A PacketConn represents a packet network endpoint that uses the +// IPv4 transport. It is used to control several IP-level socket +// options including multicasting. It also provides datagram based +// network I/O methods specific to the IPv4 and higher layer protocols +// such as UDP. +type PacketConn struct { + genericOpt + dgramOpt + payloadHandler +} + +type dgramOpt struct { + *socket.Conn +} + +func (c *dgramOpt) ok() bool { return c != nil && c.Conn != nil } + +// SetControlMessage sets the per packet IP-level socket options. +func (c *PacketConn) SetControlMessage(cf ControlFlags, on bool) error { + if !c.payloadHandler.ok() { + return syscall.EINVAL + } + return setControlMessage(c.dgramOpt.Conn, &c.payloadHandler.rawOpt, cf, on) +} + +// SetDeadline sets the read and write deadlines associated with the +// endpoint. +func (c *PacketConn) SetDeadline(t time.Time) error { + if !c.payloadHandler.ok() { + return syscall.EINVAL + } + return c.payloadHandler.PacketConn.SetDeadline(t) +} + +// SetReadDeadline sets the read deadline associated with the +// endpoint. +func (c *PacketConn) SetReadDeadline(t time.Time) error { + if !c.payloadHandler.ok() { + return syscall.EINVAL + } + return c.payloadHandler.PacketConn.SetReadDeadline(t) +} + +// SetWriteDeadline sets the write deadline associated with the +// endpoint. +func (c *PacketConn) SetWriteDeadline(t time.Time) error { + if !c.payloadHandler.ok() { + return syscall.EINVAL + } + return c.payloadHandler.PacketConn.SetWriteDeadline(t) +} + +// Close closes the endpoint. +func (c *PacketConn) Close() error { + if !c.payloadHandler.ok() { + return syscall.EINVAL + } + return c.payloadHandler.PacketConn.Close() +} + +// NewPacketConn returns a new PacketConn using c as its underlying +// transport. +func NewPacketConn(c net.PacketConn) *PacketConn { + cc, _ := socket.NewConn(c.(net.Conn)) + p := &PacketConn{ + genericOpt: genericOpt{Conn: cc}, + dgramOpt: dgramOpt{Conn: cc}, + payloadHandler: payloadHandler{PacketConn: c, Conn: cc}, + } + return p +} + +// A RawConn represents a packet network endpoint that uses the IPv4 +// transport. It is used to control several IP-level socket options +// including IPv4 header manipulation. It also provides datagram +// based network I/O methods specific to the IPv4 and higher layer +// protocols that handle IPv4 datagram directly such as OSPF, GRE. +type RawConn struct { + genericOpt + dgramOpt + packetHandler +} + +// SetControlMessage sets the per packet IP-level socket options. +func (c *RawConn) SetControlMessage(cf ControlFlags, on bool) error { + if !c.packetHandler.ok() { + return syscall.EINVAL + } + return setControlMessage(c.dgramOpt.Conn, &c.packetHandler.rawOpt, cf, on) +} + +// SetDeadline sets the read and write deadlines associated with the +// endpoint. +func (c *RawConn) SetDeadline(t time.Time) error { + if !c.packetHandler.ok() { + return syscall.EINVAL + } + return c.packetHandler.IPConn.SetDeadline(t) +} + +// SetReadDeadline sets the read deadline associated with the +// endpoint. +func (c *RawConn) SetReadDeadline(t time.Time) error { + if !c.packetHandler.ok() { + return syscall.EINVAL + } + return c.packetHandler.IPConn.SetReadDeadline(t) +} + +// SetWriteDeadline sets the write deadline associated with the +// endpoint. +func (c *RawConn) SetWriteDeadline(t time.Time) error { + if !c.packetHandler.ok() { + return syscall.EINVAL + } + return c.packetHandler.IPConn.SetWriteDeadline(t) +} + +// Close closes the endpoint. +func (c *RawConn) Close() error { + if !c.packetHandler.ok() { + return syscall.EINVAL + } + return c.packetHandler.IPConn.Close() +} + +// NewRawConn returns a new RawConn using c as its underlying +// transport. +func NewRawConn(c net.PacketConn) (*RawConn, error) { + cc, err := socket.NewConn(c.(net.Conn)) + if err != nil { + return nil, err + } + r := &RawConn{ + genericOpt: genericOpt{Conn: cc}, + dgramOpt: dgramOpt{Conn: cc}, + packetHandler: packetHandler{IPConn: c.(*net.IPConn), Conn: cc}, + } + so, ok := sockOpts[ssoHeaderPrepend] + if !ok { + return nil, errOpNoSupport + } + if err := so.SetInt(r.dgramOpt.Conn, boolint(true)); err != nil { + return nil, err + } + return r, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/example_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/example_test.go new file mode 100644 index 0000000..ddc7577 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/example_test.go @@ -0,0 +1,224 @@ +// 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 ipv4_test + +import ( + "fmt" + "log" + "net" + "os" + "runtime" + "time" + + "golang.org/x/net/icmp" + "golang.org/x/net/ipv4" +) + +func ExampleConn_markingTCP() { + ln, err := net.Listen("tcp", "0.0.0.0:1024") + if err != nil { + log.Fatal(err) + } + defer ln.Close() + + for { + c, err := ln.Accept() + if err != nil { + log.Fatal(err) + } + go func(c net.Conn) { + defer c.Close() + if c.RemoteAddr().(*net.TCPAddr).IP.To4() != nil { + p := ipv4.NewConn(c) + if err := p.SetTOS(0x28); err != nil { // DSCP AF11 + log.Fatal(err) + } + if err := p.SetTTL(128); err != nil { + log.Fatal(err) + } + } + if _, err := c.Write([]byte("HELLO-R-U-THERE-ACK")); err != nil { + log.Fatal(err) + } + }(c) + } +} + +func ExamplePacketConn_servingOneShotMulticastDNS() { + c, err := net.ListenPacket("udp4", "0.0.0.0:5353") // mDNS over UDP + if err != nil { + log.Fatal(err) + } + defer c.Close() + p := ipv4.NewPacketConn(c) + + en0, err := net.InterfaceByName("en0") + if err != nil { + log.Fatal(err) + } + mDNSLinkLocal := net.UDPAddr{IP: net.IPv4(224, 0, 0, 251)} + if err := p.JoinGroup(en0, &mDNSLinkLocal); err != nil { + log.Fatal(err) + } + defer p.LeaveGroup(en0, &mDNSLinkLocal) + if err := p.SetControlMessage(ipv4.FlagDst, true); err != nil { + log.Fatal(err) + } + + b := make([]byte, 1500) + for { + _, cm, peer, err := p.ReadFrom(b) + if err != nil { + log.Fatal(err) + } + if !cm.Dst.IsMulticast() || !cm.Dst.Equal(mDNSLinkLocal.IP) { + continue + } + answers := []byte("FAKE-MDNS-ANSWERS") // fake mDNS answers, you need to implement this + if _, err := p.WriteTo(answers, nil, peer); err != nil { + log.Fatal(err) + } + } +} + +func ExamplePacketConn_tracingIPPacketRoute() { + // Tracing an IP packet route to www.google.com. + + const host = "www.google.com" + ips, err := net.LookupIP(host) + if err != nil { + log.Fatal(err) + } + var dst net.IPAddr + for _, ip := range ips { + if ip.To4() != nil { + dst.IP = ip + fmt.Printf("using %v for tracing an IP packet route to %s\n", dst.IP, host) + break + } + } + if dst.IP == nil { + log.Fatal("no A record found") + } + + c, err := net.ListenPacket("ip4:1", "0.0.0.0") // ICMP for IPv4 + if err != nil { + log.Fatal(err) + } + defer c.Close() + p := ipv4.NewPacketConn(c) + + if err := p.SetControlMessage(ipv4.FlagTTL|ipv4.FlagSrc|ipv4.FlagDst|ipv4.FlagInterface, true); err != nil { + log.Fatal(err) + } + wm := icmp.Message{ + Type: ipv4.ICMPTypeEcho, Code: 0, + Body: &icmp.Echo{ + ID: os.Getpid() & 0xffff, + Data: []byte("HELLO-R-U-THERE"), + }, + } + + rb := make([]byte, 1500) + for i := 1; i <= 64; i++ { // up to 64 hops + wm.Body.(*icmp.Echo).Seq = i + wb, err := wm.Marshal(nil) + if err != nil { + log.Fatal(err) + } + if err := p.SetTTL(i); err != nil { + log.Fatal(err) + } + + // In the real world usually there are several + // multiple traffic-engineered paths for each hop. + // You may need to probe a few times to each hop. + begin := time.Now() + if _, err := p.WriteTo(wb, nil, &dst); err != nil { + log.Fatal(err) + } + if err := p.SetReadDeadline(time.Now().Add(3 * time.Second)); err != nil { + log.Fatal(err) + } + n, cm, peer, err := p.ReadFrom(rb) + if err != nil { + if err, ok := err.(net.Error); ok && err.Timeout() { + fmt.Printf("%v\t*\n", i) + continue + } + log.Fatal(err) + } + rm, err := icmp.ParseMessage(1, rb[:n]) + if err != nil { + log.Fatal(err) + } + rtt := time.Since(begin) + + // In the real world you need to determine whether the + // received message is yours using ControlMessage.Src, + // ControlMessage.Dst, icmp.Echo.ID and icmp.Echo.Seq. + switch rm.Type { + case ipv4.ICMPTypeTimeExceeded: + names, _ := net.LookupAddr(peer.String()) + fmt.Printf("%d\t%v %+v %v\n\t%+v\n", i, peer, names, rtt, cm) + case ipv4.ICMPTypeEchoReply: + names, _ := net.LookupAddr(peer.String()) + fmt.Printf("%d\t%v %+v %v\n\t%+v\n", i, peer, names, rtt, cm) + return + default: + log.Printf("unknown ICMP message: %+v\n", rm) + } + } +} + +func ExampleRawConn_advertisingOSPFHello() { + c, err := net.ListenPacket("ip4:89", "0.0.0.0") // OSPF for IPv4 + if err != nil { + log.Fatal(err) + } + defer c.Close() + r, err := ipv4.NewRawConn(c) + if err != nil { + log.Fatal(err) + } + + en0, err := net.InterfaceByName("en0") + if err != nil { + log.Fatal(err) + } + allSPFRouters := net.IPAddr{IP: net.IPv4(224, 0, 0, 5)} + if err := r.JoinGroup(en0, &allSPFRouters); err != nil { + log.Fatal(err) + } + defer r.LeaveGroup(en0, &allSPFRouters) + + hello := make([]byte, 24) // fake hello data, you need to implement this + ospf := make([]byte, 24) // fake ospf header, you need to implement this + ospf[0] = 2 // version 2 + ospf[1] = 1 // hello packet + ospf = append(ospf, hello...) + iph := &ipv4.Header{ + Version: ipv4.Version, + Len: ipv4.HeaderLen, + TOS: 0xc0, // DSCP CS6 + TotalLen: ipv4.HeaderLen + len(ospf), + TTL: 1, + Protocol: 89, + Dst: allSPFRouters.IP.To4(), + } + + var cm *ipv4.ControlMessage + switch runtime.GOOS { + case "darwin", "linux": + cm = &ipv4.ControlMessage{IfIndex: en0.Index} + default: + if err := r.SetMulticastInterface(en0); err != nil { + log.Fatal(err) + } + } + if err := r.WriteTo(iph, ospf, cm); err != nil { + log.Fatal(err) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/gen.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/gen.go new file mode 100644 index 0000000..ffb44fe --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/gen.go @@ -0,0 +1,199 @@ +// 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. + +// +build ignore + +//go:generate go run gen.go + +// This program generates system adaptation constants and types, +// internet protocol constants and tables by reading template files +// and IANA protocol registries. +package main + +import ( + "bytes" + "encoding/xml" + "fmt" + "go/format" + "io" + "io/ioutil" + "net/http" + "os" + "os/exec" + "runtime" + "strconv" + "strings" +) + +func main() { + if err := genzsys(); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + if err := geniana(); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} + +func genzsys() error { + defs := "defs_" + runtime.GOOS + ".go" + f, err := os.Open(defs) + if err != nil { + if os.IsNotExist(err) { + return nil + } + return err + } + f.Close() + cmd := exec.Command("go", "tool", "cgo", "-godefs", defs) + b, err := cmd.Output() + if err != nil { + return err + } + b, err = format.Source(b) + if err != nil { + return err + } + zsys := "zsys_" + runtime.GOOS + ".go" + switch runtime.GOOS { + case "freebsd", "linux": + zsys = "zsys_" + runtime.GOOS + "_" + runtime.GOARCH + ".go" + } + if err := ioutil.WriteFile(zsys, b, 0644); err != nil { + return err + } + return nil +} + +var registries = []struct { + url string + parse func(io.Writer, io.Reader) error +}{ + { + "http://www.iana.org/assignments/icmp-parameters/icmp-parameters.xml", + parseICMPv4Parameters, + }, +} + +func geniana() error { + var bb bytes.Buffer + fmt.Fprintf(&bb, "// go generate gen.go\n") + fmt.Fprintf(&bb, "// GENERATED BY THE COMMAND ABOVE; DO NOT EDIT\n\n") + fmt.Fprintf(&bb, "package ipv4\n\n") + for _, r := range registries { + resp, err := http.Get(r.url) + if err != nil { + return err + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + return fmt.Errorf("got HTTP status code %v for %v\n", resp.StatusCode, r.url) + } + if err := r.parse(&bb, resp.Body); err != nil { + return err + } + fmt.Fprintf(&bb, "\n") + } + b, err := format.Source(bb.Bytes()) + if err != nil { + return err + } + if err := ioutil.WriteFile("iana.go", b, 0644); err != nil { + return err + } + return nil +} + +func parseICMPv4Parameters(w io.Writer, r io.Reader) error { + dec := xml.NewDecoder(r) + var icp icmpv4Parameters + if err := dec.Decode(&icp); err != nil { + return err + } + prs := icp.escape() + fmt.Fprintf(w, "// %s, Updated: %s\n", icp.Title, icp.Updated) + fmt.Fprintf(w, "const (\n") + for _, pr := range prs { + if pr.Descr == "" { + continue + } + fmt.Fprintf(w, "ICMPType%s ICMPType = %d", pr.Descr, pr.Value) + fmt.Fprintf(w, "// %s\n", pr.OrigDescr) + } + fmt.Fprintf(w, ")\n\n") + fmt.Fprintf(w, "// %s, Updated: %s\n", icp.Title, icp.Updated) + fmt.Fprintf(w, "var icmpTypes = map[ICMPType]string{\n") + for _, pr := range prs { + if pr.Descr == "" { + continue + } + fmt.Fprintf(w, "%d: %q,\n", pr.Value, strings.ToLower(pr.OrigDescr)) + } + fmt.Fprintf(w, "}\n") + return nil +} + +type icmpv4Parameters struct { + XMLName xml.Name `xml:"registry"` + Title string `xml:"title"` + Updated string `xml:"updated"` + Registries []struct { + Title string `xml:"title"` + Records []struct { + Value string `xml:"value"` + Descr string `xml:"description"` + } `xml:"record"` + } `xml:"registry"` +} + +type canonICMPv4ParamRecord struct { + OrigDescr string + Descr string + Value int +} + +func (icp *icmpv4Parameters) escape() []canonICMPv4ParamRecord { + id := -1 + for i, r := range icp.Registries { + if strings.Contains(r.Title, "Type") || strings.Contains(r.Title, "type") { + id = i + break + } + } + if id < 0 { + return nil + } + prs := make([]canonICMPv4ParamRecord, len(icp.Registries[id].Records)) + sr := strings.NewReplacer( + "Messages", "", + "Message", "", + "ICMP", "", + "+", "P", + "-", "", + "/", "", + ".", "", + " ", "", + ) + for i, pr := range icp.Registries[id].Records { + if strings.Contains(pr.Descr, "Reserved") || + strings.Contains(pr.Descr, "Unassigned") || + strings.Contains(pr.Descr, "Deprecated") || + strings.Contains(pr.Descr, "Experiment") || + strings.Contains(pr.Descr, "experiment") { + continue + } + ss := strings.Split(pr.Descr, "\n") + if len(ss) > 1 { + prs[i].Descr = strings.Join(ss, " ") + } else { + prs[i].Descr = ss[0] + } + s := strings.TrimSpace(prs[i].Descr) + prs[i].OrigDescr = s + prs[i].Descr = sr.Replace(s) + prs[i].Value, _ = strconv.Atoi(pr.Value) + } + return prs +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/genericopt.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/genericopt.go new file mode 100644 index 0000000..119bf84 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/genericopt.go @@ -0,0 +1,57 @@ +// 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 ipv4 + +import "syscall" + +// TOS returns the type-of-service field value for outgoing packets. +func (c *genericOpt) TOS() (int, error) { + if !c.ok() { + return 0, syscall.EINVAL + } + so, ok := sockOpts[ssoTOS] + if !ok { + return 0, errOpNoSupport + } + return so.GetInt(c.Conn) +} + +// SetTOS sets the type-of-service field value for future outgoing +// packets. +func (c *genericOpt) SetTOS(tos int) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoTOS] + if !ok { + return errOpNoSupport + } + return so.SetInt(c.Conn, tos) +} + +// TTL returns the time-to-live field value for outgoing packets. +func (c *genericOpt) TTL() (int, error) { + if !c.ok() { + return 0, syscall.EINVAL + } + so, ok := sockOpts[ssoTTL] + if !ok { + return 0, errOpNoSupport + } + return so.GetInt(c.Conn) +} + +// SetTTL sets the time-to-live field value for future outgoing +// packets. +func (c *genericOpt) SetTTL(ttl int) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoTTL] + if !ok { + return errOpNoSupport + } + return so.SetInt(c.Conn, ttl) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/header.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/header.go new file mode 100644 index 0000000..8bb0f0f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/header.go @@ -0,0 +1,159 @@ +// 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 ipv4 + +import ( + "encoding/binary" + "fmt" + "net" + "runtime" + "syscall" + + "golang.org/x/net/internal/socket" +) + +const ( + Version = 4 // protocol version + HeaderLen = 20 // header length without extension headers + maxHeaderLen = 60 // sensible default, revisit if later RFCs define new usage of version and header length fields +) + +type HeaderFlags int + +const ( + MoreFragments HeaderFlags = 1 << iota // more fragments flag + DontFragment // don't fragment flag +) + +// A Header represents an IPv4 header. +type Header struct { + Version int // protocol version + Len int // header length + TOS int // type-of-service + TotalLen int // packet total length + ID int // identification + Flags HeaderFlags // flags + FragOff int // fragment offset + TTL int // time-to-live + Protocol int // next protocol + Checksum int // checksum + Src net.IP // source address + Dst net.IP // destination address + Options []byte // options, extension headers +} + +func (h *Header) String() string { + if h == nil { + return "" + } + return fmt.Sprintf("ver=%d hdrlen=%d tos=%#x totallen=%d id=%#x flags=%#x fragoff=%#x ttl=%d proto=%d cksum=%#x src=%v dst=%v", h.Version, h.Len, h.TOS, h.TotalLen, h.ID, h.Flags, h.FragOff, h.TTL, h.Protocol, h.Checksum, h.Src, h.Dst) +} + +// Marshal returns the binary encoding of h. +func (h *Header) Marshal() ([]byte, error) { + if h == nil { + return nil, syscall.EINVAL + } + if h.Len < HeaderLen { + return nil, errHeaderTooShort + } + hdrlen := HeaderLen + len(h.Options) + b := make([]byte, hdrlen) + b[0] = byte(Version<<4 | (hdrlen >> 2 & 0x0f)) + b[1] = byte(h.TOS) + flagsAndFragOff := (h.FragOff & 0x1fff) | int(h.Flags<<13) + switch runtime.GOOS { + case "darwin", "dragonfly", "netbsd": + socket.NativeEndian.PutUint16(b[2:4], uint16(h.TotalLen)) + socket.NativeEndian.PutUint16(b[6:8], uint16(flagsAndFragOff)) + case "freebsd": + if freebsdVersion < 1100000 { + socket.NativeEndian.PutUint16(b[2:4], uint16(h.TotalLen)) + socket.NativeEndian.PutUint16(b[6:8], uint16(flagsAndFragOff)) + } else { + binary.BigEndian.PutUint16(b[2:4], uint16(h.TotalLen)) + binary.BigEndian.PutUint16(b[6:8], uint16(flagsAndFragOff)) + } + default: + binary.BigEndian.PutUint16(b[2:4], uint16(h.TotalLen)) + binary.BigEndian.PutUint16(b[6:8], uint16(flagsAndFragOff)) + } + binary.BigEndian.PutUint16(b[4:6], uint16(h.ID)) + b[8] = byte(h.TTL) + b[9] = byte(h.Protocol) + binary.BigEndian.PutUint16(b[10:12], uint16(h.Checksum)) + if ip := h.Src.To4(); ip != nil { + copy(b[12:16], ip[:net.IPv4len]) + } + if ip := h.Dst.To4(); ip != nil { + copy(b[16:20], ip[:net.IPv4len]) + } else { + return nil, errMissingAddress + } + if len(h.Options) > 0 { + copy(b[HeaderLen:], h.Options) + } + return b, nil +} + +// Parse parses b as an IPv4 header and sotres the result in h. +func (h *Header) Parse(b []byte) error { + if h == nil || len(b) < HeaderLen { + return errHeaderTooShort + } + hdrlen := int(b[0]&0x0f) << 2 + if hdrlen > len(b) { + return errBufferTooShort + } + h.Version = int(b[0] >> 4) + h.Len = hdrlen + h.TOS = int(b[1]) + h.ID = int(binary.BigEndian.Uint16(b[4:6])) + h.TTL = int(b[8]) + h.Protocol = int(b[9]) + h.Checksum = int(binary.BigEndian.Uint16(b[10:12])) + h.Src = net.IPv4(b[12], b[13], b[14], b[15]) + h.Dst = net.IPv4(b[16], b[17], b[18], b[19]) + switch runtime.GOOS { + case "darwin", "dragonfly", "netbsd": + h.TotalLen = int(socket.NativeEndian.Uint16(b[2:4])) + hdrlen + h.FragOff = int(socket.NativeEndian.Uint16(b[6:8])) + case "freebsd": + if freebsdVersion < 1100000 { + h.TotalLen = int(socket.NativeEndian.Uint16(b[2:4])) + if freebsdVersion < 1000000 { + h.TotalLen += hdrlen + } + h.FragOff = int(socket.NativeEndian.Uint16(b[6:8])) + } else { + h.TotalLen = int(binary.BigEndian.Uint16(b[2:4])) + h.FragOff = int(binary.BigEndian.Uint16(b[6:8])) + } + default: + h.TotalLen = int(binary.BigEndian.Uint16(b[2:4])) + h.FragOff = int(binary.BigEndian.Uint16(b[6:8])) + } + h.Flags = HeaderFlags(h.FragOff&0xe000) >> 13 + h.FragOff = h.FragOff & 0x1fff + optlen := hdrlen - HeaderLen + if optlen > 0 && len(b) >= hdrlen { + if cap(h.Options) < optlen { + h.Options = make([]byte, optlen) + } else { + h.Options = h.Options[:optlen] + } + copy(h.Options, b[HeaderLen:hdrlen]) + } + return nil +} + +// ParseHeader parses b as an IPv4 header. +func ParseHeader(b []byte) (*Header, error) { + h := new(Header) + if err := h.Parse(b); err != nil { + return nil, err + } + return h, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/header_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/header_test.go new file mode 100644 index 0000000..a246aee --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/header_test.go @@ -0,0 +1,228 @@ +// 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 ipv4 + +import ( + "bytes" + "encoding/binary" + "net" + "reflect" + "runtime" + "strings" + "testing" + + "golang.org/x/net/internal/socket" +) + +type headerTest struct { + wireHeaderFromKernel []byte + wireHeaderToKernel []byte + wireHeaderFromTradBSDKernel []byte + wireHeaderToTradBSDKernel []byte + wireHeaderFromFreeBSD10Kernel []byte + wireHeaderToFreeBSD10Kernel []byte + *Header +} + +var headerLittleEndianTests = []headerTest{ + // TODO(mikio): Add platform dependent wire header formats when + // we support new platforms. + { + wireHeaderFromKernel: []byte{ + 0x45, 0x01, 0xbe, 0xef, + 0xca, 0xfe, 0x45, 0xdc, + 0xff, 0x01, 0xde, 0xad, + 172, 16, 254, 254, + 192, 168, 0, 1, + }, + wireHeaderToKernel: []byte{ + 0x45, 0x01, 0xbe, 0xef, + 0xca, 0xfe, 0x45, 0xdc, + 0xff, 0x01, 0xde, 0xad, + 172, 16, 254, 254, + 192, 168, 0, 1, + }, + wireHeaderFromTradBSDKernel: []byte{ + 0x45, 0x01, 0xdb, 0xbe, + 0xca, 0xfe, 0xdc, 0x45, + 0xff, 0x01, 0xde, 0xad, + 172, 16, 254, 254, + 192, 168, 0, 1, + }, + wireHeaderToTradBSDKernel: []byte{ + 0x45, 0x01, 0xef, 0xbe, + 0xca, 0xfe, 0xdc, 0x45, + 0xff, 0x01, 0xde, 0xad, + 172, 16, 254, 254, + 192, 168, 0, 1, + }, + wireHeaderFromFreeBSD10Kernel: []byte{ + 0x45, 0x01, 0xef, 0xbe, + 0xca, 0xfe, 0xdc, 0x45, + 0xff, 0x01, 0xde, 0xad, + 172, 16, 254, 254, + 192, 168, 0, 1, + }, + wireHeaderToFreeBSD10Kernel: []byte{ + 0x45, 0x01, 0xef, 0xbe, + 0xca, 0xfe, 0xdc, 0x45, + 0xff, 0x01, 0xde, 0xad, + 172, 16, 254, 254, + 192, 168, 0, 1, + }, + Header: &Header{ + Version: Version, + Len: HeaderLen, + TOS: 1, + TotalLen: 0xbeef, + ID: 0xcafe, + Flags: DontFragment, + FragOff: 1500, + TTL: 255, + Protocol: 1, + Checksum: 0xdead, + Src: net.IPv4(172, 16, 254, 254), + Dst: net.IPv4(192, 168, 0, 1), + }, + }, + + // with option headers + { + wireHeaderFromKernel: []byte{ + 0x46, 0x01, 0xbe, 0xf3, + 0xca, 0xfe, 0x45, 0xdc, + 0xff, 0x01, 0xde, 0xad, + 172, 16, 254, 254, + 192, 168, 0, 1, + 0xff, 0xfe, 0xfe, 0xff, + }, + wireHeaderToKernel: []byte{ + 0x46, 0x01, 0xbe, 0xf3, + 0xca, 0xfe, 0x45, 0xdc, + 0xff, 0x01, 0xde, 0xad, + 172, 16, 254, 254, + 192, 168, 0, 1, + 0xff, 0xfe, 0xfe, 0xff, + }, + wireHeaderFromTradBSDKernel: []byte{ + 0x46, 0x01, 0xdb, 0xbe, + 0xca, 0xfe, 0xdc, 0x45, + 0xff, 0x01, 0xde, 0xad, + 172, 16, 254, 254, + 192, 168, 0, 1, + 0xff, 0xfe, 0xfe, 0xff, + }, + wireHeaderToTradBSDKernel: []byte{ + 0x46, 0x01, 0xf3, 0xbe, + 0xca, 0xfe, 0xdc, 0x45, + 0xff, 0x01, 0xde, 0xad, + 172, 16, 254, 254, + 192, 168, 0, 1, + 0xff, 0xfe, 0xfe, 0xff, + }, + wireHeaderFromFreeBSD10Kernel: []byte{ + 0x46, 0x01, 0xf3, 0xbe, + 0xca, 0xfe, 0xdc, 0x45, + 0xff, 0x01, 0xde, 0xad, + 172, 16, 254, 254, + 192, 168, 0, 1, + 0xff, 0xfe, 0xfe, 0xff, + }, + wireHeaderToFreeBSD10Kernel: []byte{ + 0x46, 0x01, 0xf3, 0xbe, + 0xca, 0xfe, 0xdc, 0x45, + 0xff, 0x01, 0xde, 0xad, + 172, 16, 254, 254, + 192, 168, 0, 1, + 0xff, 0xfe, 0xfe, 0xff, + }, + Header: &Header{ + Version: Version, + Len: HeaderLen + 4, + TOS: 1, + TotalLen: 0xbef3, + ID: 0xcafe, + Flags: DontFragment, + FragOff: 1500, + TTL: 255, + Protocol: 1, + Checksum: 0xdead, + Src: net.IPv4(172, 16, 254, 254), + Dst: net.IPv4(192, 168, 0, 1), + Options: []byte{0xff, 0xfe, 0xfe, 0xff}, + }, + }, +} + +func TestMarshalHeader(t *testing.T) { + if socket.NativeEndian != binary.LittleEndian { + t.Skip("no test for non-little endian machine yet") + } + + for _, tt := range headerLittleEndianTests { + b, err := tt.Header.Marshal() + if err != nil { + t.Fatal(err) + } + var wh []byte + switch runtime.GOOS { + case "darwin", "dragonfly", "netbsd": + wh = tt.wireHeaderToTradBSDKernel + case "freebsd": + switch { + case freebsdVersion < 1000000: + wh = tt.wireHeaderToTradBSDKernel + case 1000000 <= freebsdVersion && freebsdVersion < 1100000: + wh = tt.wireHeaderToFreeBSD10Kernel + default: + wh = tt.wireHeaderToKernel + } + default: + wh = tt.wireHeaderToKernel + } + if !bytes.Equal(b, wh) { + t.Fatalf("got %#v; want %#v", b, wh) + } + } +} + +func TestParseHeader(t *testing.T) { + if socket.NativeEndian != binary.LittleEndian { + t.Skip("no test for big endian machine yet") + } + + for _, tt := range headerLittleEndianTests { + var wh []byte + switch runtime.GOOS { + case "darwin", "dragonfly", "netbsd": + wh = tt.wireHeaderFromTradBSDKernel + case "freebsd": + switch { + case freebsdVersion < 1000000: + wh = tt.wireHeaderFromTradBSDKernel + case 1000000 <= freebsdVersion && freebsdVersion < 1100000: + wh = tt.wireHeaderFromFreeBSD10Kernel + default: + wh = tt.wireHeaderFromKernel + } + default: + wh = tt.wireHeaderFromKernel + } + h, err := ParseHeader(wh) + if err != nil { + t.Fatal(err) + } + if err := h.Parse(wh); err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(h, tt.Header) { + t.Fatalf("got %#v; want %#v", h, tt.Header) + } + s := h.String() + if strings.Contains(s, ",") { + t.Fatalf("should be space-separated values: %s", s) + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/helper.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/helper.go new file mode 100644 index 0000000..a5052e3 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/helper.go @@ -0,0 +1,63 @@ +// 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 ipv4 + +import ( + "errors" + "net" +) + +var ( + errMissingAddress = errors.New("missing address") + errMissingHeader = errors.New("missing header") + errHeaderTooShort = errors.New("header too short") + errBufferTooShort = errors.New("buffer too short") + errInvalidConnType = errors.New("invalid conn type") + errOpNoSupport = errors.New("operation not supported") + errNoSuchInterface = errors.New("no such interface") + errNoSuchMulticastInterface = errors.New("no such multicast interface") + + // See http://www.freebsd.org/doc/en/books/porters-handbook/freebsd-versions.html. + freebsdVersion uint32 +) + +func boolint(b bool) int { + if b { + return 1 + } + return 0 +} + +func netAddrToIP4(a net.Addr) net.IP { + switch v := a.(type) { + case *net.UDPAddr: + if ip := v.IP.To4(); ip != nil { + return ip + } + case *net.IPAddr: + if ip := v.IP.To4(); ip != nil { + return ip + } + } + return nil +} + +func opAddr(a net.Addr) net.Addr { + switch a.(type) { + case *net.TCPAddr: + if a == nil { + return nil + } + case *net.UDPAddr: + if a == nil { + return nil + } + case *net.IPAddr: + if a == nil { + return nil + } + } + return a +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/iana.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/iana.go new file mode 100644 index 0000000..be10c94 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/iana.go @@ -0,0 +1,34 @@ +// go generate gen.go +// GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +package ipv4 + +// Internet Control Message Protocol (ICMP) Parameters, Updated: 2013-04-19 +const ( + ICMPTypeEchoReply ICMPType = 0 // Echo Reply + ICMPTypeDestinationUnreachable ICMPType = 3 // Destination Unreachable + ICMPTypeRedirect ICMPType = 5 // Redirect + ICMPTypeEcho ICMPType = 8 // Echo + ICMPTypeRouterAdvertisement ICMPType = 9 // Router Advertisement + ICMPTypeRouterSolicitation ICMPType = 10 // Router Solicitation + ICMPTypeTimeExceeded ICMPType = 11 // Time Exceeded + ICMPTypeParameterProblem ICMPType = 12 // Parameter Problem + ICMPTypeTimestamp ICMPType = 13 // Timestamp + ICMPTypeTimestampReply ICMPType = 14 // Timestamp Reply + ICMPTypePhoturis ICMPType = 40 // Photuris +) + +// Internet Control Message Protocol (ICMP) Parameters, Updated: 2013-04-19 +var icmpTypes = map[ICMPType]string{ + 0: "echo reply", + 3: "destination unreachable", + 5: "redirect", + 8: "echo", + 9: "router advertisement", + 10: "router solicitation", + 11: "time exceeded", + 12: "parameter problem", + 13: "timestamp", + 14: "timestamp reply", + 40: "photuris", +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/icmp.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/icmp.go new file mode 100644 index 0000000..9902bb3 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/icmp.go @@ -0,0 +1,57 @@ +// 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 ipv4 + +import "golang.org/x/net/internal/iana" + +// An ICMPType represents a type of ICMP message. +type ICMPType int + +func (typ ICMPType) String() string { + s, ok := icmpTypes[typ] + if !ok { + return "" + } + return s +} + +// Protocol returns the ICMPv4 protocol number. +func (typ ICMPType) Protocol() int { + return iana.ProtocolICMP +} + +// An ICMPFilter represents an ICMP message filter for incoming +// packets. The filter belongs to a packet delivery path on a host and +// it cannot interact with forwarding packets or tunnel-outer packets. +// +// Note: RFC 8200 defines a reasonable role model and it works not +// only for IPv6 but IPv4. A node means a device that implements IP. +// A router means a node that forwards IP packets not explicitly +// addressed to itself, and a host means a node that is not a router. +type ICMPFilter struct { + icmpFilter +} + +// Accept accepts incoming ICMP packets including the type field value +// typ. +func (f *ICMPFilter) Accept(typ ICMPType) { + f.accept(typ) +} + +// Block blocks incoming ICMP packets including the type field value +// typ. +func (f *ICMPFilter) Block(typ ICMPType) { + f.block(typ) +} + +// SetAll sets the filter action to the filter. +func (f *ICMPFilter) SetAll(block bool) { + f.setAll(block) +} + +// WillBlock reports whether the ICMP type will be blocked. +func (f *ICMPFilter) WillBlock(typ ICMPType) bool { + return f.willBlock(typ) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/icmp_linux.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/icmp_linux.go new file mode 100644 index 0000000..6e1c5c8 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/icmp_linux.go @@ -0,0 +1,25 @@ +// 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 ipv4 + +func (f *icmpFilter) accept(typ ICMPType) { + f.Data &^= 1 << (uint32(typ) & 31) +} + +func (f *icmpFilter) block(typ ICMPType) { + f.Data |= 1 << (uint32(typ) & 31) +} + +func (f *icmpFilter) setAll(block bool) { + if block { + f.Data = 1<<32 - 1 + } else { + f.Data = 0 + } +} + +func (f *icmpFilter) willBlock(typ ICMPType) bool { + return f.Data&(1<<(uint32(typ)&31)) != 0 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/icmp_stub.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/icmp_stub.go new file mode 100644 index 0000000..21bb29a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/icmp_stub.go @@ -0,0 +1,25 @@ +// 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. + +// +build !linux + +package ipv4 + +const sizeofICMPFilter = 0x0 + +type icmpFilter struct { +} + +func (f *icmpFilter) accept(typ ICMPType) { +} + +func (f *icmpFilter) block(typ ICMPType) { +} + +func (f *icmpFilter) setAll(block bool) { +} + +func (f *icmpFilter) willBlock(typ ICMPType) bool { + return false +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/icmp_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/icmp_test.go new file mode 100644 index 0000000..3324b54 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/icmp_test.go @@ -0,0 +1,95 @@ +// 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 ipv4_test + +import ( + "net" + "reflect" + "runtime" + "testing" + + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv4" +) + +var icmpStringTests = []struct { + in ipv4.ICMPType + out string +}{ + {ipv4.ICMPTypeDestinationUnreachable, "destination unreachable"}, + + {256, ""}, +} + +func TestICMPString(t *testing.T) { + for _, tt := range icmpStringTests { + s := tt.in.String() + if s != tt.out { + t.Errorf("got %s; want %s", s, tt.out) + } + } +} + +func TestICMPFilter(t *testing.T) { + switch runtime.GOOS { + case "linux": + default: + t.Skipf("not supported on %s", runtime.GOOS) + } + + var f ipv4.ICMPFilter + for _, toggle := range []bool{false, true} { + f.SetAll(toggle) + for _, typ := range []ipv4.ICMPType{ + ipv4.ICMPTypeDestinationUnreachable, + ipv4.ICMPTypeEchoReply, + ipv4.ICMPTypeTimeExceeded, + ipv4.ICMPTypeParameterProblem, + } { + f.Accept(typ) + if f.WillBlock(typ) { + t.Errorf("ipv4.ICMPFilter.Set(%v, false) failed", typ) + } + f.Block(typ) + if !f.WillBlock(typ) { + t.Errorf("ipv4.ICMPFilter.Set(%v, true) failed", typ) + } + } + } +} + +func TestSetICMPFilter(t *testing.T) { + switch runtime.GOOS { + case "linux": + default: + t.Skipf("not supported on %s", runtime.GOOS) + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + + c, err := net.ListenPacket("ip4:icmp", "127.0.0.1") + if err != nil { + t.Fatal(err) + } + defer c.Close() + + p := ipv4.NewPacketConn(c) + + var f ipv4.ICMPFilter + f.SetAll(true) + f.Accept(ipv4.ICMPTypeEcho) + f.Accept(ipv4.ICMPTypeEchoReply) + if err := p.SetICMPFilter(&f); err != nil { + t.Fatal(err) + } + kf, err := p.ICMPFilter() + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(kf, &f) { + t.Fatalf("got %#v; want %#v", kf, f) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/multicast_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/multicast_test.go new file mode 100644 index 0000000..bcf4973 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/multicast_test.go @@ -0,0 +1,334 @@ +// 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 ipv4_test + +import ( + "bytes" + "net" + "os" + "runtime" + "testing" + "time" + + "golang.org/x/net/icmp" + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv4" +) + +var packetConnReadWriteMulticastUDPTests = []struct { + addr string + grp, src *net.UDPAddr +}{ + {"224.0.0.0:0", &net.UDPAddr{IP: net.IPv4(224, 0, 0, 254)}, nil}, // see RFC 4727 + + {"232.0.1.0:0", &net.UDPAddr{IP: net.IPv4(232, 0, 1, 254)}, &net.UDPAddr{IP: net.IPv4(127, 0, 0, 1)}}, // see RFC 5771 +} + +func TestPacketConnReadWriteMulticastUDP(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "solaris", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagMulticast|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + for _, tt := range packetConnReadWriteMulticastUDPTests { + c, err := net.ListenPacket("udp4", tt.addr) + if err != nil { + t.Fatal(err) + } + defer c.Close() + + grp := *tt.grp + grp.Port = c.LocalAddr().(*net.UDPAddr).Port + p := ipv4.NewPacketConn(c) + defer p.Close() + if tt.src == nil { + if err := p.JoinGroup(ifi, &grp); err != nil { + t.Fatal(err) + } + defer p.LeaveGroup(ifi, &grp) + } else { + if err := p.JoinSourceSpecificGroup(ifi, &grp, tt.src); err != nil { + switch runtime.GOOS { + case "freebsd", "linux": + default: // platforms that don't support IGMPv2/3 fail here + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + defer p.LeaveSourceSpecificGroup(ifi, &grp, tt.src) + } + if err := p.SetMulticastInterface(ifi); err != nil { + t.Fatal(err) + } + if _, err := p.MulticastInterface(); err != nil { + t.Fatal(err) + } + if err := p.SetMulticastLoopback(true); err != nil { + t.Fatal(err) + } + if _, err := p.MulticastLoopback(); err != nil { + t.Fatal(err) + } + cf := ipv4.FlagTTL | ipv4.FlagDst | ipv4.FlagInterface + wb := []byte("HELLO-R-U-THERE") + + for i, toggle := range []bool{true, false, true} { + if err := p.SetControlMessage(cf, toggle); err != nil { + if nettest.ProtocolNotSupported(err) { + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + if err := p.SetDeadline(time.Now().Add(200 * time.Millisecond)); err != nil { + t.Fatal(err) + } + p.SetMulticastTTL(i + 1) + if n, err := p.WriteTo(wb, nil, &grp); err != nil { + t.Fatal(err) + } else if n != len(wb) { + t.Fatalf("got %v; want %v", n, len(wb)) + } + rb := make([]byte, 128) + if n, _, _, err := p.ReadFrom(rb); err != nil { + t.Fatal(err) + } else if !bytes.Equal(rb[:n], wb) { + t.Fatalf("got %v; want %v", rb[:n], wb) + } + } + } +} + +var packetConnReadWriteMulticastICMPTests = []struct { + grp, src *net.IPAddr +}{ + {&net.IPAddr{IP: net.IPv4(224, 0, 0, 254)}, nil}, // see RFC 4727 + + {&net.IPAddr{IP: net.IPv4(232, 0, 1, 254)}, &net.IPAddr{IP: net.IPv4(127, 0, 0, 1)}}, // see RFC 5771 +} + +func TestPacketConnReadWriteMulticastICMP(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "solaris", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagMulticast|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + for _, tt := range packetConnReadWriteMulticastICMPTests { + c, err := net.ListenPacket("ip4:icmp", "0.0.0.0") + if err != nil { + t.Fatal(err) + } + defer c.Close() + + p := ipv4.NewPacketConn(c) + defer p.Close() + if tt.src == nil { + if err := p.JoinGroup(ifi, tt.grp); err != nil { + t.Fatal(err) + } + defer p.LeaveGroup(ifi, tt.grp) + } else { + if err := p.JoinSourceSpecificGroup(ifi, tt.grp, tt.src); err != nil { + switch runtime.GOOS { + case "freebsd", "linux": + default: // platforms that don't support IGMPv2/3 fail here + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + defer p.LeaveSourceSpecificGroup(ifi, tt.grp, tt.src) + } + if err := p.SetMulticastInterface(ifi); err != nil { + t.Fatal(err) + } + if _, err := p.MulticastInterface(); err != nil { + t.Fatal(err) + } + if err := p.SetMulticastLoopback(true); err != nil { + t.Fatal(err) + } + if _, err := p.MulticastLoopback(); err != nil { + t.Fatal(err) + } + cf := ipv4.FlagDst | ipv4.FlagInterface + if runtime.GOOS != "solaris" { + // Solaris never allows to modify ICMP properties. + cf |= ipv4.FlagTTL + } + + for i, toggle := range []bool{true, false, true} { + wb, err := (&icmp.Message{ + Type: ipv4.ICMPTypeEcho, Code: 0, + Body: &icmp.Echo{ + ID: os.Getpid() & 0xffff, Seq: i + 1, + Data: []byte("HELLO-R-U-THERE"), + }, + }).Marshal(nil) + if err != nil { + t.Fatal(err) + } + if err := p.SetControlMessage(cf, toggle); err != nil { + if nettest.ProtocolNotSupported(err) { + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + if err := p.SetDeadline(time.Now().Add(200 * time.Millisecond)); err != nil { + t.Fatal(err) + } + p.SetMulticastTTL(i + 1) + if n, err := p.WriteTo(wb, nil, tt.grp); err != nil { + t.Fatal(err) + } else if n != len(wb) { + t.Fatalf("got %v; want %v", n, len(wb)) + } + rb := make([]byte, 128) + if n, _, _, err := p.ReadFrom(rb); err != nil { + t.Fatal(err) + } else { + m, err := icmp.ParseMessage(iana.ProtocolICMP, rb[:n]) + if err != nil { + t.Fatal(err) + } + switch { + case m.Type == ipv4.ICMPTypeEchoReply && m.Code == 0: // net.inet.icmp.bmcastecho=1 + case m.Type == ipv4.ICMPTypeEcho && m.Code == 0: // net.inet.icmp.bmcastecho=0 + default: + t.Fatalf("got type=%v, code=%v; want type=%v, code=%v", m.Type, m.Code, ipv4.ICMPTypeEchoReply, 0) + } + } + } + } +} + +var rawConnReadWriteMulticastICMPTests = []struct { + grp, src *net.IPAddr +}{ + {&net.IPAddr{IP: net.IPv4(224, 0, 0, 254)}, nil}, // see RFC 4727 + + {&net.IPAddr{IP: net.IPv4(232, 0, 1, 254)}, &net.IPAddr{IP: net.IPv4(127, 0, 0, 1)}}, // see RFC 5771 +} + +func TestRawConnReadWriteMulticastICMP(t *testing.T) { + if testing.Short() { + t.Skip("to avoid external network") + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagMulticast|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + for _, tt := range rawConnReadWriteMulticastICMPTests { + c, err := net.ListenPacket("ip4:icmp", "0.0.0.0") + if err != nil { + t.Fatal(err) + } + defer c.Close() + + r, err := ipv4.NewRawConn(c) + if err != nil { + t.Fatal(err) + } + defer r.Close() + if tt.src == nil { + if err := r.JoinGroup(ifi, tt.grp); err != nil { + t.Fatal(err) + } + defer r.LeaveGroup(ifi, tt.grp) + } else { + if err := r.JoinSourceSpecificGroup(ifi, tt.grp, tt.src); err != nil { + switch runtime.GOOS { + case "freebsd", "linux": + default: // platforms that don't support IGMPv2/3 fail here + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + defer r.LeaveSourceSpecificGroup(ifi, tt.grp, tt.src) + } + if err := r.SetMulticastInterface(ifi); err != nil { + t.Fatal(err) + } + if _, err := r.MulticastInterface(); err != nil { + t.Fatal(err) + } + if err := r.SetMulticastLoopback(true); err != nil { + t.Fatal(err) + } + if _, err := r.MulticastLoopback(); err != nil { + t.Fatal(err) + } + cf := ipv4.FlagTTL | ipv4.FlagDst | ipv4.FlagInterface + + for i, toggle := range []bool{true, false, true} { + wb, err := (&icmp.Message{ + Type: ipv4.ICMPTypeEcho, Code: 0, + Body: &icmp.Echo{ + ID: os.Getpid() & 0xffff, Seq: i + 1, + Data: []byte("HELLO-R-U-THERE"), + }, + }).Marshal(nil) + if err != nil { + t.Fatal(err) + } + wh := &ipv4.Header{ + Version: ipv4.Version, + Len: ipv4.HeaderLen, + TOS: i + 1, + TotalLen: ipv4.HeaderLen + len(wb), + Protocol: 1, + Dst: tt.grp.IP, + } + if err := r.SetControlMessage(cf, toggle); err != nil { + if nettest.ProtocolNotSupported(err) { + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + if err := r.SetDeadline(time.Now().Add(200 * time.Millisecond)); err != nil { + t.Fatal(err) + } + r.SetMulticastTTL(i + 1) + if err := r.WriteTo(wh, wb, nil); err != nil { + t.Fatal(err) + } + rb := make([]byte, ipv4.HeaderLen+128) + if rh, b, _, err := r.ReadFrom(rb); err != nil { + t.Fatal(err) + } else { + m, err := icmp.ParseMessage(iana.ProtocolICMP, b) + if err != nil { + t.Fatal(err) + } + switch { + case (rh.Dst.IsLoopback() || rh.Dst.IsLinkLocalUnicast() || rh.Dst.IsGlobalUnicast()) && m.Type == ipv4.ICMPTypeEchoReply && m.Code == 0: // net.inet.icmp.bmcastecho=1 + case rh.Dst.IsMulticast() && m.Type == ipv4.ICMPTypeEcho && m.Code == 0: // net.inet.icmp.bmcastecho=0 + default: + t.Fatalf("got type=%v, code=%v; want type=%v, code=%v", m.Type, m.Code, ipv4.ICMPTypeEchoReply, 0) + } + } + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/multicastlistener_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/multicastlistener_test.go new file mode 100644 index 0000000..e43fbbe --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/multicastlistener_test.go @@ -0,0 +1,265 @@ +// 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 ipv4_test + +import ( + "net" + "runtime" + "testing" + + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv4" +) + +var udpMultipleGroupListenerTests = []net.Addr{ + &net.UDPAddr{IP: net.IPv4(224, 0, 0, 249)}, // see RFC 4727 + &net.UDPAddr{IP: net.IPv4(224, 0, 0, 250)}, + &net.UDPAddr{IP: net.IPv4(224, 0, 0, 254)}, +} + +func TestUDPSinglePacketConnWithMultipleGroupListeners(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if testing.Short() { + t.Skip("to avoid external network") + } + + for _, gaddr := range udpMultipleGroupListenerTests { + c, err := net.ListenPacket("udp4", "0.0.0.0:0") // wildcard address with no reusable port + if err != nil { + t.Fatal(err) + } + defer c.Close() + + p := ipv4.NewPacketConn(c) + var mift []*net.Interface + + ift, err := net.Interfaces() + if err != nil { + t.Fatal(err) + } + for i, ifi := range ift { + if _, ok := nettest.IsMulticastCapable("ip4", &ifi); !ok { + continue + } + if err := p.JoinGroup(&ifi, gaddr); err != nil { + t.Fatal(err) + } + mift = append(mift, &ift[i]) + } + for _, ifi := range mift { + if err := p.LeaveGroup(ifi, gaddr); err != nil { + t.Fatal(err) + } + } + } +} + +func TestUDPMultiplePacketConnWithMultipleGroupListeners(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if testing.Short() { + t.Skip("to avoid external network") + } + + for _, gaddr := range udpMultipleGroupListenerTests { + c1, err := net.ListenPacket("udp4", "224.0.0.0:0") // wildcard address with reusable port + if err != nil { + t.Fatal(err) + } + defer c1.Close() + _, port, err := net.SplitHostPort(c1.LocalAddr().String()) + if err != nil { + t.Fatal(err) + } + c2, err := net.ListenPacket("udp4", net.JoinHostPort("224.0.0.0", port)) // wildcard address with reusable port + if err != nil { + t.Fatal(err) + } + defer c2.Close() + + var ps [2]*ipv4.PacketConn + ps[0] = ipv4.NewPacketConn(c1) + ps[1] = ipv4.NewPacketConn(c2) + var mift []*net.Interface + + ift, err := net.Interfaces() + if err != nil { + t.Fatal(err) + } + for i, ifi := range ift { + if _, ok := nettest.IsMulticastCapable("ip4", &ifi); !ok { + continue + } + for _, p := range ps { + if err := p.JoinGroup(&ifi, gaddr); err != nil { + t.Fatal(err) + } + } + mift = append(mift, &ift[i]) + } + for _, ifi := range mift { + for _, p := range ps { + if err := p.LeaveGroup(ifi, gaddr); err != nil { + t.Fatal(err) + } + } + } + } +} + +func TestUDPPerInterfaceSinglePacketConnWithSingleGroupListener(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if testing.Short() { + t.Skip("to avoid external network") + } + + gaddr := net.IPAddr{IP: net.IPv4(224, 0, 0, 254)} // see RFC 4727 + type ml struct { + c *ipv4.PacketConn + ifi *net.Interface + } + var mlt []*ml + + ift, err := net.Interfaces() + if err != nil { + t.Fatal(err) + } + port := "0" + for i, ifi := range ift { + ip, ok := nettest.IsMulticastCapable("ip4", &ifi) + if !ok { + continue + } + c, err := net.ListenPacket("udp4", net.JoinHostPort(ip.String(), port)) // unicast address with non-reusable port + if err != nil { + // The listen may fail when the serivce is + // already in use, but it's fine because the + // purpose of this is not to test the + // bookkeeping of IP control block inside the + // kernel. + t.Log(err) + continue + } + defer c.Close() + if port == "0" { + _, port, err = net.SplitHostPort(c.LocalAddr().String()) + if err != nil { + t.Fatal(err) + } + } + p := ipv4.NewPacketConn(c) + if err := p.JoinGroup(&ifi, &gaddr); err != nil { + t.Fatal(err) + } + mlt = append(mlt, &ml{p, &ift[i]}) + } + for _, m := range mlt { + if err := m.c.LeaveGroup(m.ifi, &gaddr); err != nil { + t.Fatal(err) + } + } +} + +func TestIPSingleRawConnWithSingleGroupListener(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if testing.Short() { + t.Skip("to avoid external network") + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + + c, err := net.ListenPacket("ip4:icmp", "0.0.0.0") // wildcard address + if err != nil { + t.Fatal(err) + } + defer c.Close() + + r, err := ipv4.NewRawConn(c) + if err != nil { + t.Fatal(err) + } + gaddr := net.IPAddr{IP: net.IPv4(224, 0, 0, 254)} // see RFC 4727 + var mift []*net.Interface + + ift, err := net.Interfaces() + if err != nil { + t.Fatal(err) + } + for i, ifi := range ift { + if _, ok := nettest.IsMulticastCapable("ip4", &ifi); !ok { + continue + } + if err := r.JoinGroup(&ifi, &gaddr); err != nil { + t.Fatal(err) + } + mift = append(mift, &ift[i]) + } + for _, ifi := range mift { + if err := r.LeaveGroup(ifi, &gaddr); err != nil { + t.Fatal(err) + } + } +} + +func TestIPPerInterfaceSingleRawConnWithSingleGroupListener(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if testing.Short() { + t.Skip("to avoid external network") + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + + gaddr := net.IPAddr{IP: net.IPv4(224, 0, 0, 254)} // see RFC 4727 + type ml struct { + c *ipv4.RawConn + ifi *net.Interface + } + var mlt []*ml + + ift, err := net.Interfaces() + if err != nil { + t.Fatal(err) + } + for i, ifi := range ift { + ip, ok := nettest.IsMulticastCapable("ip4", &ifi) + if !ok { + continue + } + c, err := net.ListenPacket("ip4:253", ip.String()) // unicast address + if err != nil { + t.Fatal(err) + } + defer c.Close() + r, err := ipv4.NewRawConn(c) + if err != nil { + t.Fatal(err) + } + if err := r.JoinGroup(&ifi, &gaddr); err != nil { + t.Fatal(err) + } + mlt = append(mlt, &ml{r, &ift[i]}) + } + for _, m := range mlt { + if err := m.c.LeaveGroup(m.ifi, &gaddr); err != nil { + t.Fatal(err) + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/multicastsockopt_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/multicastsockopt_test.go new file mode 100644 index 0000000..f7efac2 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/multicastsockopt_test.go @@ -0,0 +1,195 @@ +// 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 ipv4_test + +import ( + "net" + "runtime" + "testing" + + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv4" +) + +var packetConnMulticastSocketOptionTests = []struct { + net, proto, addr string + grp, src net.Addr +}{ + {"udp4", "", "224.0.0.0:0", &net.UDPAddr{IP: net.IPv4(224, 0, 0, 249)}, nil}, // see RFC 4727 + {"ip4", ":icmp", "0.0.0.0", &net.IPAddr{IP: net.IPv4(224, 0, 0, 250)}, nil}, // see RFC 4727 + + {"udp4", "", "232.0.0.0:0", &net.UDPAddr{IP: net.IPv4(232, 0, 1, 249)}, &net.UDPAddr{IP: net.IPv4(127, 0, 0, 1)}}, // see RFC 5771 + {"ip4", ":icmp", "0.0.0.0", &net.IPAddr{IP: net.IPv4(232, 0, 1, 250)}, &net.UDPAddr{IP: net.IPv4(127, 0, 0, 1)}}, // see RFC 5771 +} + +func TestPacketConnMulticastSocketOptions(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9": + t.Skipf("not supported on %s", runtime.GOOS) + } + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagMulticast|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + m, ok := nettest.SupportsRawIPSocket() + for _, tt := range packetConnMulticastSocketOptionTests { + if tt.net == "ip4" && !ok { + t.Log(m) + continue + } + c, err := net.ListenPacket(tt.net+tt.proto, tt.addr) + if err != nil { + t.Fatal(err) + } + defer c.Close() + p := ipv4.NewPacketConn(c) + defer p.Close() + + if tt.src == nil { + testMulticastSocketOptions(t, p, ifi, tt.grp) + } else { + testSourceSpecificMulticastSocketOptions(t, p, ifi, tt.grp, tt.src) + } + } +} + +var rawConnMulticastSocketOptionTests = []struct { + grp, src net.Addr +}{ + {&net.IPAddr{IP: net.IPv4(224, 0, 0, 250)}, nil}, // see RFC 4727 + + {&net.IPAddr{IP: net.IPv4(232, 0, 1, 250)}, &net.IPAddr{IP: net.IPv4(127, 0, 0, 1)}}, // see RFC 5771 +} + +func TestRawConnMulticastSocketOptions(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9": + t.Skipf("not supported on %s", runtime.GOOS) + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagMulticast|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + for _, tt := range rawConnMulticastSocketOptionTests { + c, err := net.ListenPacket("ip4:icmp", "0.0.0.0") + if err != nil { + t.Fatal(err) + } + defer c.Close() + r, err := ipv4.NewRawConn(c) + if err != nil { + t.Fatal(err) + } + defer r.Close() + + if tt.src == nil { + testMulticastSocketOptions(t, r, ifi, tt.grp) + } else { + testSourceSpecificMulticastSocketOptions(t, r, ifi, tt.grp, tt.src) + } + } +} + +type testIPv4MulticastConn interface { + MulticastTTL() (int, error) + SetMulticastTTL(ttl int) error + MulticastLoopback() (bool, error) + SetMulticastLoopback(bool) error + JoinGroup(*net.Interface, net.Addr) error + LeaveGroup(*net.Interface, net.Addr) error + JoinSourceSpecificGroup(*net.Interface, net.Addr, net.Addr) error + LeaveSourceSpecificGroup(*net.Interface, net.Addr, net.Addr) error + ExcludeSourceSpecificGroup(*net.Interface, net.Addr, net.Addr) error + IncludeSourceSpecificGroup(*net.Interface, net.Addr, net.Addr) error +} + +func testMulticastSocketOptions(t *testing.T, c testIPv4MulticastConn, ifi *net.Interface, grp net.Addr) { + const ttl = 255 + if err := c.SetMulticastTTL(ttl); err != nil { + t.Error(err) + return + } + if v, err := c.MulticastTTL(); err != nil { + t.Error(err) + return + } else if v != ttl { + t.Errorf("got %v; want %v", v, ttl) + return + } + + for _, toggle := range []bool{true, false} { + if err := c.SetMulticastLoopback(toggle); err != nil { + t.Error(err) + return + } + if v, err := c.MulticastLoopback(); err != nil { + t.Error(err) + return + } else if v != toggle { + t.Errorf("got %v; want %v", v, toggle) + return + } + } + + if err := c.JoinGroup(ifi, grp); err != nil { + t.Error(err) + return + } + if err := c.LeaveGroup(ifi, grp); err != nil { + t.Error(err) + return + } +} + +func testSourceSpecificMulticastSocketOptions(t *testing.T, c testIPv4MulticastConn, ifi *net.Interface, grp, src net.Addr) { + // MCAST_JOIN_GROUP -> MCAST_BLOCK_SOURCE -> MCAST_UNBLOCK_SOURCE -> MCAST_LEAVE_GROUP + if err := c.JoinGroup(ifi, grp); err != nil { + t.Error(err) + return + } + if err := c.ExcludeSourceSpecificGroup(ifi, grp, src); err != nil { + switch runtime.GOOS { + case "freebsd", "linux": + default: // platforms that don't support IGMPv2/3 fail here + t.Logf("not supported on %s", runtime.GOOS) + return + } + t.Error(err) + return + } + if err := c.IncludeSourceSpecificGroup(ifi, grp, src); err != nil { + t.Error(err) + return + } + if err := c.LeaveGroup(ifi, grp); err != nil { + t.Error(err) + return + } + + // MCAST_JOIN_SOURCE_GROUP -> MCAST_LEAVE_SOURCE_GROUP + if err := c.JoinSourceSpecificGroup(ifi, grp, src); err != nil { + t.Error(err) + return + } + if err := c.LeaveSourceSpecificGroup(ifi, grp, src); err != nil { + t.Error(err) + return + } + + // MCAST_JOIN_SOURCE_GROUP -> MCAST_LEAVE_GROUP + if err := c.JoinSourceSpecificGroup(ifi, grp, src); err != nil { + t.Error(err) + return + } + if err := c.LeaveGroup(ifi, grp); err != nil { + t.Error(err) + return + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/packet.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/packet.go new file mode 100644 index 0000000..f00f5b0 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/packet.go @@ -0,0 +1,69 @@ +// 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 ipv4 + +import ( + "net" + "syscall" + + "golang.org/x/net/internal/socket" +) + +// BUG(mikio): On Windows, the ReadFrom and WriteTo methods of RawConn +// are not implemented. + +// A packetHandler represents the IPv4 datagram handler. +type packetHandler struct { + *net.IPConn + *socket.Conn + rawOpt +} + +func (c *packetHandler) ok() bool { return c != nil && c.IPConn != nil && c.Conn != nil } + +// ReadFrom reads an IPv4 datagram from the endpoint c, copying the +// datagram into b. It returns the received datagram as the IPv4 +// header h, the payload p and the control message cm. +func (c *packetHandler) ReadFrom(b []byte) (h *Header, p []byte, cm *ControlMessage, err error) { + if !c.ok() { + return nil, nil, nil, syscall.EINVAL + } + return c.readFrom(b) +} + +func slicePacket(b []byte) (h, p []byte, err error) { + if len(b) < HeaderLen { + return nil, nil, errHeaderTooShort + } + hdrlen := int(b[0]&0x0f) << 2 + return b[:hdrlen], b[hdrlen:], nil +} + +// WriteTo writes an IPv4 datagram through the endpoint c, copying the +// datagram from the IPv4 header h and the payload p. The control +// message cm allows the datagram path and the outgoing interface to be +// specified. Currently only Darwin and Linux support this. The cm +// may be nil if control of the outgoing datagram is not required. +// +// The IPv4 header h must contain appropriate fields that include: +// +// Version = +// Len = +// TOS = +// TotalLen = +// ID = platform sets an appropriate value if ID is zero +// FragOff = +// TTL = +// Protocol = +// Checksum = platform sets an appropriate value if Checksum is zero +// Src = platform sets an appropriate value if Src is nil +// Dst = +// Options = optional +func (c *packetHandler) WriteTo(h *Header, p []byte, cm *ControlMessage) error { + if !c.ok() { + return syscall.EINVAL + } + return c.writeTo(h, p, cm) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/packet_go1_8.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/packet_go1_8.go new file mode 100644 index 0000000..b47d186 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/packet_go1_8.go @@ -0,0 +1,56 @@ +// 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. + +// +build !go1.9 + +package ipv4 + +import "net" + +func (c *packetHandler) readFrom(b []byte) (h *Header, p []byte, cm *ControlMessage, err error) { + c.rawOpt.RLock() + oob := NewControlMessage(c.rawOpt.cflags) + c.rawOpt.RUnlock() + n, nn, _, src, err := c.ReadMsgIP(b, oob) + if err != nil { + return nil, nil, nil, err + } + var hs []byte + if hs, p, err = slicePacket(b[:n]); err != nil { + return nil, nil, nil, err + } + if h, err = ParseHeader(hs); err != nil { + return nil, nil, nil, err + } + if nn > 0 { + cm = new(ControlMessage) + if err := cm.Parse(oob[:nn]); err != nil { + return nil, nil, nil, err + } + } + if src != nil && cm != nil { + cm.Src = src.IP + } + return +} + +func (c *packetHandler) writeTo(h *Header, p []byte, cm *ControlMessage) error { + oob := cm.Marshal() + wh, err := h.Marshal() + if err != nil { + return err + } + dst := new(net.IPAddr) + if cm != nil { + if ip := cm.Dst.To4(); ip != nil { + dst.IP = ip + } + } + if dst.IP == nil { + dst.IP = h.Dst + } + wh = append(wh, p...) + _, _, err = c.WriteMsgIP(wh, oob, dst) + return err +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/packet_go1_9.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/packet_go1_9.go new file mode 100644 index 0000000..082c36d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/packet_go1_9.go @@ -0,0 +1,67 @@ +// 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. + +// +build go1.9 + +package ipv4 + +import ( + "net" + + "golang.org/x/net/internal/socket" +) + +func (c *packetHandler) readFrom(b []byte) (h *Header, p []byte, cm *ControlMessage, err error) { + c.rawOpt.RLock() + m := socket.Message{ + Buffers: [][]byte{b}, + OOB: NewControlMessage(c.rawOpt.cflags), + } + c.rawOpt.RUnlock() + if err := c.RecvMsg(&m, 0); err != nil { + return nil, nil, nil, &net.OpError{Op: "read", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Err: err} + } + var hs []byte + if hs, p, err = slicePacket(b[:m.N]); err != nil { + return nil, nil, nil, &net.OpError{Op: "read", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Err: err} + } + if h, err = ParseHeader(hs); err != nil { + return nil, nil, nil, &net.OpError{Op: "read", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Err: err} + } + if m.NN > 0 { + cm = new(ControlMessage) + if err := cm.Parse(m.OOB[:m.NN]); err != nil { + return nil, nil, nil, &net.OpError{Op: "read", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Err: err} + } + } + if src, ok := m.Addr.(*net.IPAddr); ok && cm != nil { + cm.Src = src.IP + } + return +} + +func (c *packetHandler) writeTo(h *Header, p []byte, cm *ControlMessage) error { + m := socket.Message{ + OOB: cm.Marshal(), + } + wh, err := h.Marshal() + if err != nil { + return err + } + m.Buffers = [][]byte{wh, p} + dst := new(net.IPAddr) + if cm != nil { + if ip := cm.Dst.To4(); ip != nil { + dst.IP = ip + } + } + if dst.IP == nil { + dst.IP = h.Dst + } + m.Addr = dst + if err := c.SendMsg(&m, 0); err != nil { + return &net.OpError{Op: "write", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Addr: opAddr(dst), Err: err} + } + return nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/payload.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/payload.go new file mode 100644 index 0000000..f95f811 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/payload.go @@ -0,0 +1,23 @@ +// 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 ipv4 + +import ( + "net" + + "golang.org/x/net/internal/socket" +) + +// BUG(mikio): On Windows, the ControlMessage for ReadFrom and WriteTo +// methods of PacketConn is not implemented. + +// A payloadHandler represents the IPv4 datagram payload handler. +type payloadHandler struct { + net.PacketConn + *socket.Conn + rawOpt +} + +func (c *payloadHandler) ok() bool { return c != nil && c.PacketConn != nil && c.Conn != nil } diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/payload_cmsg.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/payload_cmsg.go new file mode 100644 index 0000000..3f06d76 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/payload_cmsg.go @@ -0,0 +1,36 @@ +// 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. + +// +build !nacl,!plan9,!windows + +package ipv4 + +import ( + "net" + "syscall" +) + +// ReadFrom reads a payload of the received IPv4 datagram, from the +// endpoint c, copying the payload into b. It returns the number of +// bytes copied into b, the control message cm and the source address +// src of the received datagram. +func (c *payloadHandler) ReadFrom(b []byte) (n int, cm *ControlMessage, src net.Addr, err error) { + if !c.ok() { + return 0, nil, nil, syscall.EINVAL + } + return c.readFrom(b) +} + +// WriteTo writes a payload of the IPv4 datagram, to the destination +// address dst through the endpoint c, copying the payload from b. It +// returns the number of bytes written. The control message cm allows +// the datagram path and the outgoing interface to be specified. +// Currently only Darwin and Linux support this. The cm may be nil if +// control of the outgoing datagram is not required. +func (c *payloadHandler) WriteTo(b []byte, cm *ControlMessage, dst net.Addr) (n int, err error) { + if !c.ok() { + return 0, syscall.EINVAL + } + return c.writeTo(b, cm, dst) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/payload_cmsg_go1_8.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/payload_cmsg_go1_8.go new file mode 100644 index 0000000..d26ccd9 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/payload_cmsg_go1_8.go @@ -0,0 +1,59 @@ +// 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. + +// +build !go1.9 +// +build !nacl,!plan9,!windows + +package ipv4 + +import "net" + +func (c *payloadHandler) readFrom(b []byte) (n int, cm *ControlMessage, src net.Addr, err error) { + c.rawOpt.RLock() + oob := NewControlMessage(c.rawOpt.cflags) + c.rawOpt.RUnlock() + var nn int + switch c := c.PacketConn.(type) { + case *net.UDPConn: + if n, nn, _, src, err = c.ReadMsgUDP(b, oob); err != nil { + return 0, nil, nil, err + } + case *net.IPConn: + nb := make([]byte, maxHeaderLen+len(b)) + if n, nn, _, src, err = c.ReadMsgIP(nb, oob); err != nil { + return 0, nil, nil, err + } + hdrlen := int(nb[0]&0x0f) << 2 + copy(b, nb[hdrlen:]) + n -= hdrlen + default: + return 0, nil, nil, &net.OpError{Op: "read", Net: c.LocalAddr().Network(), Source: c.LocalAddr(), Err: errInvalidConnType} + } + if nn > 0 { + cm = new(ControlMessage) + if err = cm.Parse(oob[:nn]); err != nil { + return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + } + if cm != nil { + cm.Src = netAddrToIP4(src) + } + return +} + +func (c *payloadHandler) writeTo(b []byte, cm *ControlMessage, dst net.Addr) (n int, err error) { + oob := cm.Marshal() + if dst == nil { + return 0, &net.OpError{Op: "write", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: errMissingAddress} + } + switch c := c.PacketConn.(type) { + case *net.UDPConn: + n, _, err = c.WriteMsgUDP(b, oob, dst.(*net.UDPAddr)) + case *net.IPConn: + n, _, err = c.WriteMsgIP(b, oob, dst.(*net.IPAddr)) + default: + return 0, &net.OpError{Op: "write", Net: c.LocalAddr().Network(), Source: c.LocalAddr(), Addr: opAddr(dst), Err: errInvalidConnType} + } + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/payload_cmsg_go1_9.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/payload_cmsg_go1_9.go new file mode 100644 index 0000000..2f19311 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/payload_cmsg_go1_9.go @@ -0,0 +1,67 @@ +// 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. + +// +build go1.9 +// +build !nacl,!plan9,!windows + +package ipv4 + +import ( + "net" + + "golang.org/x/net/internal/socket" +) + +func (c *payloadHandler) readFrom(b []byte) (int, *ControlMessage, net.Addr, error) { + c.rawOpt.RLock() + m := socket.Message{ + OOB: NewControlMessage(c.rawOpt.cflags), + } + c.rawOpt.RUnlock() + switch c.PacketConn.(type) { + case *net.UDPConn: + m.Buffers = [][]byte{b} + if err := c.RecvMsg(&m, 0); err != nil { + return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + case *net.IPConn: + h := make([]byte, HeaderLen) + m.Buffers = [][]byte{h, b} + if err := c.RecvMsg(&m, 0); err != nil { + return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + hdrlen := int(h[0]&0x0f) << 2 + if hdrlen > len(h) { + d := hdrlen - len(h) + copy(b, b[d:]) + m.N -= d + } else { + m.N -= hdrlen + } + default: + return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: errInvalidConnType} + } + var cm *ControlMessage + if m.NN > 0 { + cm = new(ControlMessage) + if err := cm.Parse(m.OOB[:m.NN]); err != nil { + return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + cm.Src = netAddrToIP4(m.Addr) + } + return m.N, cm, m.Addr, nil +} + +func (c *payloadHandler) writeTo(b []byte, cm *ControlMessage, dst net.Addr) (int, error) { + m := socket.Message{ + Buffers: [][]byte{b}, + OOB: cm.Marshal(), + Addr: dst, + } + err := c.SendMsg(&m, 0) + if err != nil { + err = &net.OpError{Op: "write", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Addr: opAddr(dst), Err: err} + } + return m.N, err +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/payload_nocmsg.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/payload_nocmsg.go new file mode 100644 index 0000000..3926de7 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/payload_nocmsg.go @@ -0,0 +1,42 @@ +// 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. + +// +build nacl plan9 windows + +package ipv4 + +import ( + "net" + "syscall" +) + +// ReadFrom reads a payload of the received IPv4 datagram, from the +// endpoint c, copying the payload into b. It returns the number of +// bytes copied into b, the control message cm and the source address +// src of the received datagram. +func (c *payloadHandler) ReadFrom(b []byte) (n int, cm *ControlMessage, src net.Addr, err error) { + if !c.ok() { + return 0, nil, nil, syscall.EINVAL + } + if n, src, err = c.PacketConn.ReadFrom(b); err != nil { + return 0, nil, nil, err + } + return +} + +// WriteTo writes a payload of the IPv4 datagram, to the destination +// address dst through the endpoint c, copying the payload from b. It +// returns the number of bytes written. The control message cm allows +// the datagram path and the outgoing interface to be specified. +// Currently only Darwin and Linux support this. The cm may be nil if +// control of the outgoing datagram is not required. +func (c *payloadHandler) WriteTo(b []byte, cm *ControlMessage, dst net.Addr) (n int, err error) { + if !c.ok() { + return 0, syscall.EINVAL + } + if dst == nil { + return 0, errMissingAddress + } + return c.PacketConn.WriteTo(b, dst) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/readwrite_go1_8_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/readwrite_go1_8_test.go new file mode 100644 index 0000000..1cd926e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/readwrite_go1_8_test.go @@ -0,0 +1,248 @@ +// 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. + +// +build !go1.9 + +package ipv4_test + +import ( + "bytes" + "fmt" + "net" + "runtime" + "strings" + "sync" + "testing" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv4" +) + +func BenchmarkPacketConnReadWriteUnicast(b *testing.B) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + b.Skipf("not supported on %s", runtime.GOOS) + } + + payload := []byte("HELLO-R-U-THERE") + iph, err := (&ipv4.Header{ + Version: ipv4.Version, + Len: ipv4.HeaderLen, + TotalLen: ipv4.HeaderLen + len(payload), + TTL: 1, + Protocol: iana.ProtocolReserved, + Src: net.IPv4(192, 0, 2, 1), + Dst: net.IPv4(192, 0, 2, 254), + }).Marshal() + if err != nil { + b.Fatal(err) + } + greh := []byte{0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00} + datagram := append(greh, append(iph, payload...)...) + bb := make([]byte, 128) + cm := ipv4.ControlMessage{ + Src: net.IPv4(127, 0, 0, 1), + } + if ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback); ifi != nil { + cm.IfIndex = ifi.Index + } + + b.Run("UDP", func(b *testing.B) { + c, err := nettest.NewLocalPacketListener("udp4") + if err != nil { + b.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + p := ipv4.NewPacketConn(c) + dst := c.LocalAddr() + cf := ipv4.FlagTTL | ipv4.FlagInterface + if err := p.SetControlMessage(cf, true); err != nil { + b.Fatal(err) + } + b.Run("Net", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := c.WriteTo(payload, dst); err != nil { + b.Fatal(err) + } + if _, _, err := c.ReadFrom(bb); err != nil { + b.Fatal(err) + } + } + }) + b.Run("ToFrom", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := p.WriteTo(payload, &cm, dst); err != nil { + b.Fatal(err) + } + if _, _, _, err := p.ReadFrom(bb); err != nil { + b.Fatal(err) + } + } + }) + }) + b.Run("IP", func(b *testing.B) { + switch runtime.GOOS { + case "netbsd": + b.Skip("need to configure gre on netbsd") + case "openbsd": + b.Skip("net.inet.gre.allow=0 by default on openbsd") + } + + c, err := net.ListenPacket(fmt.Sprintf("ip4:%d", iana.ProtocolGRE), "127.0.0.1") + if err != nil { + b.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + p := ipv4.NewPacketConn(c) + dst := c.LocalAddr() + cf := ipv4.FlagTTL | ipv4.FlagInterface + if err := p.SetControlMessage(cf, true); err != nil { + b.Fatal(err) + } + b.Run("Net", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := c.WriteTo(datagram, dst); err != nil { + b.Fatal(err) + } + if _, _, err := c.ReadFrom(bb); err != nil { + b.Fatal(err) + } + } + }) + b.Run("ToFrom", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := p.WriteTo(datagram, &cm, dst); err != nil { + b.Fatal(err) + } + if _, _, _, err := p.ReadFrom(bb); err != nil { + b.Fatal(err) + } + } + }) + }) +} + +func TestPacketConnConcurrentReadWriteUnicast(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + + payload := []byte("HELLO-R-U-THERE") + iph, err := (&ipv4.Header{ + Version: ipv4.Version, + Len: ipv4.HeaderLen, + TotalLen: ipv4.HeaderLen + len(payload), + TTL: 1, + Protocol: iana.ProtocolReserved, + Src: net.IPv4(192, 0, 2, 1), + Dst: net.IPv4(192, 0, 2, 254), + }).Marshal() + if err != nil { + t.Fatal(err) + } + greh := []byte{0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00} + datagram := append(greh, append(iph, payload...)...) + + t.Run("UDP", func(t *testing.T) { + c, err := nettest.NewLocalPacketListener("udp4") + if err != nil { + t.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + p := ipv4.NewPacketConn(c) + t.Run("ToFrom", func(t *testing.T) { + testPacketConnConcurrentReadWriteUnicast(t, p, payload, c.LocalAddr()) + }) + }) + t.Run("IP", func(t *testing.T) { + switch runtime.GOOS { + case "netbsd": + t.Skip("need to configure gre on netbsd") + case "openbsd": + t.Skip("net.inet.gre.allow=0 by default on openbsd") + } + + c, err := net.ListenPacket(fmt.Sprintf("ip4:%d", iana.ProtocolGRE), "127.0.0.1") + if err != nil { + t.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + p := ipv4.NewPacketConn(c) + t.Run("ToFrom", func(t *testing.T) { + testPacketConnConcurrentReadWriteUnicast(t, p, datagram, c.LocalAddr()) + }) + }) +} + +func testPacketConnConcurrentReadWriteUnicast(t *testing.T, p *ipv4.PacketConn, data []byte, dst net.Addr) { + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback) + cf := ipv4.FlagTTL | ipv4.FlagSrc | ipv4.FlagDst | ipv4.FlagInterface + + if err := p.SetControlMessage(cf, true); err != nil { // probe before test + if nettest.ProtocolNotSupported(err) { + t.Skipf("not supported on %s", runtime.GOOS) + } + t.Fatal(err) + } + + var wg sync.WaitGroup + reader := func() { + defer wg.Done() + b := make([]byte, 128) + n, cm, _, err := p.ReadFrom(b) + if err != nil { + t.Error(err) + return + } + if !bytes.Equal(b[:n], data) { + t.Errorf("got %#v; want %#v", b[:n], data) + return + } + s := cm.String() + if strings.Contains(s, ",") { + t.Errorf("should be space-separated values: %s", s) + return + } + } + writer := func(toggle bool) { + defer wg.Done() + cm := ipv4.ControlMessage{ + Src: net.IPv4(127, 0, 0, 1), + } + if ifi != nil { + cm.IfIndex = ifi.Index + } + if err := p.SetControlMessage(cf, toggle); err != nil { + t.Error(err) + return + } + n, err := p.WriteTo(data, &cm, dst) + if err != nil { + t.Error(err) + return + } + if n != len(data) { + t.Errorf("got %d; want %d", n, len(data)) + return + } + } + + const N = 10 + wg.Add(N) + for i := 0; i < N; i++ { + go reader() + } + wg.Add(2 * N) + for i := 0; i < 2*N; i++ { + go writer(i%2 != 0) + + } + wg.Add(N) + for i := 0; i < N; i++ { + go reader() + } + wg.Wait() +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/readwrite_go1_9_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/readwrite_go1_9_test.go new file mode 100644 index 0000000..365de02 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/readwrite_go1_9_test.go @@ -0,0 +1,388 @@ +// 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. + +// +build go1.9 + +package ipv4_test + +import ( + "bytes" + "fmt" + "net" + "runtime" + "strings" + "sync" + "testing" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv4" +) + +func BenchmarkPacketConnReadWriteUnicast(b *testing.B) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + b.Skipf("not supported on %s", runtime.GOOS) + } + + payload := []byte("HELLO-R-U-THERE") + iph, err := (&ipv4.Header{ + Version: ipv4.Version, + Len: ipv4.HeaderLen, + TotalLen: ipv4.HeaderLen + len(payload), + TTL: 1, + Protocol: iana.ProtocolReserved, + Src: net.IPv4(192, 0, 2, 1), + Dst: net.IPv4(192, 0, 2, 254), + }).Marshal() + if err != nil { + b.Fatal(err) + } + greh := []byte{0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00} + datagram := append(greh, append(iph, payload...)...) + bb := make([]byte, 128) + cm := ipv4.ControlMessage{ + Src: net.IPv4(127, 0, 0, 1), + } + if ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback); ifi != nil { + cm.IfIndex = ifi.Index + } + + b.Run("UDP", func(b *testing.B) { + c, err := nettest.NewLocalPacketListener("udp4") + if err != nil { + b.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + p := ipv4.NewPacketConn(c) + dst := c.LocalAddr() + cf := ipv4.FlagTTL | ipv4.FlagInterface + if err := p.SetControlMessage(cf, true); err != nil { + b.Fatal(err) + } + wms := []ipv4.Message{ + { + Buffers: [][]byte{payload}, + Addr: dst, + OOB: cm.Marshal(), + }, + } + rms := []ipv4.Message{ + { + Buffers: [][]byte{bb}, + OOB: ipv4.NewControlMessage(cf), + }, + } + b.Run("Net", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := c.WriteTo(payload, dst); err != nil { + b.Fatal(err) + } + if _, _, err := c.ReadFrom(bb); err != nil { + b.Fatal(err) + } + } + }) + b.Run("ToFrom", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := p.WriteTo(payload, &cm, dst); err != nil { + b.Fatal(err) + } + if _, _, _, err := p.ReadFrom(bb); err != nil { + b.Fatal(err) + } + } + }) + b.Run("Batch", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := p.WriteBatch(wms, 0); err != nil { + b.Fatal(err) + } + if _, err := p.ReadBatch(rms, 0); err != nil { + b.Fatal(err) + } + } + }) + }) + b.Run("IP", func(b *testing.B) { + switch runtime.GOOS { + case "netbsd": + b.Skip("need to configure gre on netbsd") + case "openbsd": + b.Skip("net.inet.gre.allow=0 by default on openbsd") + } + + c, err := net.ListenPacket(fmt.Sprintf("ip4:%d", iana.ProtocolGRE), "127.0.0.1") + if err != nil { + b.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + p := ipv4.NewPacketConn(c) + dst := c.LocalAddr() + cf := ipv4.FlagTTL | ipv4.FlagInterface + if err := p.SetControlMessage(cf, true); err != nil { + b.Fatal(err) + } + wms := []ipv4.Message{ + { + Buffers: [][]byte{datagram}, + Addr: dst, + OOB: cm.Marshal(), + }, + } + rms := []ipv4.Message{ + { + Buffers: [][]byte{bb}, + OOB: ipv4.NewControlMessage(cf), + }, + } + b.Run("Net", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := c.WriteTo(datagram, dst); err != nil { + b.Fatal(err) + } + if _, _, err := c.ReadFrom(bb); err != nil { + b.Fatal(err) + } + } + }) + b.Run("ToFrom", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := p.WriteTo(datagram, &cm, dst); err != nil { + b.Fatal(err) + } + if _, _, _, err := p.ReadFrom(bb); err != nil { + b.Fatal(err) + } + } + }) + b.Run("Batch", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := p.WriteBatch(wms, 0); err != nil { + b.Fatal(err) + } + if _, err := p.ReadBatch(rms, 0); err != nil { + b.Fatal(err) + } + } + }) + }) +} + +func TestPacketConnConcurrentReadWriteUnicast(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + + payload := []byte("HELLO-R-U-THERE") + iph, err := (&ipv4.Header{ + Version: ipv4.Version, + Len: ipv4.HeaderLen, + TotalLen: ipv4.HeaderLen + len(payload), + TTL: 1, + Protocol: iana.ProtocolReserved, + Src: net.IPv4(192, 0, 2, 1), + Dst: net.IPv4(192, 0, 2, 254), + }).Marshal() + if err != nil { + t.Fatal(err) + } + greh := []byte{0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00} + datagram := append(greh, append(iph, payload...)...) + + t.Run("UDP", func(t *testing.T) { + c, err := nettest.NewLocalPacketListener("udp4") + if err != nil { + t.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + p := ipv4.NewPacketConn(c) + t.Run("ToFrom", func(t *testing.T) { + testPacketConnConcurrentReadWriteUnicast(t, p, payload, c.LocalAddr(), false) + }) + t.Run("Batch", func(t *testing.T) { + testPacketConnConcurrentReadWriteUnicast(t, p, payload, c.LocalAddr(), true) + }) + }) + t.Run("IP", func(t *testing.T) { + switch runtime.GOOS { + case "netbsd": + t.Skip("need to configure gre on netbsd") + case "openbsd": + t.Skip("net.inet.gre.allow=0 by default on openbsd") + } + + c, err := net.ListenPacket(fmt.Sprintf("ip4:%d", iana.ProtocolGRE), "127.0.0.1") + if err != nil { + t.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + p := ipv4.NewPacketConn(c) + t.Run("ToFrom", func(t *testing.T) { + testPacketConnConcurrentReadWriteUnicast(t, p, datagram, c.LocalAddr(), false) + }) + t.Run("Batch", func(t *testing.T) { + testPacketConnConcurrentReadWriteUnicast(t, p, datagram, c.LocalAddr(), true) + }) + }) +} + +func testPacketConnConcurrentReadWriteUnicast(t *testing.T, p *ipv4.PacketConn, data []byte, dst net.Addr, batch bool) { + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback) + cf := ipv4.FlagTTL | ipv4.FlagSrc | ipv4.FlagDst | ipv4.FlagInterface + + if err := p.SetControlMessage(cf, true); err != nil { // probe before test + if nettest.ProtocolNotSupported(err) { + t.Skipf("not supported on %s", runtime.GOOS) + } + t.Fatal(err) + } + + var wg sync.WaitGroup + reader := func() { + defer wg.Done() + b := make([]byte, 128) + n, cm, _, err := p.ReadFrom(b) + if err != nil { + t.Error(err) + return + } + if !bytes.Equal(b[:n], data) { + t.Errorf("got %#v; want %#v", b[:n], data) + return + } + s := cm.String() + if strings.Contains(s, ",") { + t.Errorf("should be space-separated values: %s", s) + return + } + } + batchReader := func() { + defer wg.Done() + ms := []ipv4.Message{ + { + Buffers: [][]byte{make([]byte, 128)}, + OOB: ipv4.NewControlMessage(cf), + }, + } + n, err := p.ReadBatch(ms, 0) + if err != nil { + t.Error(err) + return + } + if n != len(ms) { + t.Errorf("got %d; want %d", n, len(ms)) + return + } + var cm ipv4.ControlMessage + if err := cm.Parse(ms[0].OOB[:ms[0].NN]); err != nil { + t.Error(err) + return + } + var b []byte + if _, ok := dst.(*net.IPAddr); ok { + var h ipv4.Header + if err := h.Parse(ms[0].Buffers[0][:ms[0].N]); err != nil { + t.Error(err) + return + } + b = ms[0].Buffers[0][h.Len:ms[0].N] + } else { + b = ms[0].Buffers[0][:ms[0].N] + } + if !bytes.Equal(b, data) { + t.Errorf("got %#v; want %#v", b, data) + return + } + s := cm.String() + if strings.Contains(s, ",") { + t.Errorf("should be space-separated values: %s", s) + return + } + } + writer := func(toggle bool) { + defer wg.Done() + cm := ipv4.ControlMessage{ + Src: net.IPv4(127, 0, 0, 1), + } + if ifi != nil { + cm.IfIndex = ifi.Index + } + if err := p.SetControlMessage(cf, toggle); err != nil { + t.Error(err) + return + } + n, err := p.WriteTo(data, &cm, dst) + if err != nil { + t.Error(err) + return + } + if n != len(data) { + t.Errorf("got %d; want %d", n, len(data)) + return + } + } + batchWriter := func(toggle bool) { + defer wg.Done() + cm := ipv4.ControlMessage{ + Src: net.IPv4(127, 0, 0, 1), + } + if ifi != nil { + cm.IfIndex = ifi.Index + } + if err := p.SetControlMessage(cf, toggle); err != nil { + t.Error(err) + return + } + ms := []ipv4.Message{ + { + Buffers: [][]byte{data}, + OOB: cm.Marshal(), + Addr: dst, + }, + } + n, err := p.WriteBatch(ms, 0) + if err != nil { + t.Error(err) + return + } + if n != len(ms) { + t.Errorf("got %d; want %d", n, len(ms)) + return + } + if ms[0].N != len(data) { + t.Errorf("got %d; want %d", ms[0].N, len(data)) + return + } + } + + const N = 10 + wg.Add(N) + for i := 0; i < N; i++ { + if batch { + go batchReader() + } else { + go reader() + } + } + wg.Add(2 * N) + for i := 0; i < 2*N; i++ { + if batch { + go batchWriter(i%2 != 0) + } else { + go writer(i%2 != 0) + } + + } + wg.Add(N) + for i := 0; i < N; i++ { + if batch { + go batchReader() + } else { + go reader() + } + } + wg.Wait() +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/readwrite_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/readwrite_test.go new file mode 100644 index 0000000..3896a8a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/readwrite_test.go @@ -0,0 +1,140 @@ +// 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 ipv4_test + +import ( + "bytes" + "net" + "runtime" + "strings" + "sync" + "testing" + + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv4" +) + +func BenchmarkReadWriteUnicast(b *testing.B) { + c, err := nettest.NewLocalPacketListener("udp4") + if err != nil { + b.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + + dst := c.LocalAddr() + wb, rb := []byte("HELLO-R-U-THERE"), make([]byte, 128) + + b.Run("NetUDP", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := c.WriteTo(wb, dst); err != nil { + b.Fatal(err) + } + if _, _, err := c.ReadFrom(rb); err != nil { + b.Fatal(err) + } + } + }) + b.Run("IPv4UDP", func(b *testing.B) { + p := ipv4.NewPacketConn(c) + cf := ipv4.FlagTTL | ipv4.FlagInterface + if err := p.SetControlMessage(cf, true); err != nil { + b.Fatal(err) + } + cm := ipv4.ControlMessage{TTL: 1} + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback) + if ifi != nil { + cm.IfIndex = ifi.Index + } + + for i := 0; i < b.N; i++ { + if _, err := p.WriteTo(wb, &cm, dst); err != nil { + b.Fatal(err) + } + if _, _, _, err := p.ReadFrom(rb); err != nil { + b.Fatal(err) + } + } + }) +} + +func TestPacketConnConcurrentReadWriteUnicastUDP(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + + c, err := nettest.NewLocalPacketListener("udp4") + if err != nil { + t.Fatal(err) + } + defer c.Close() + p := ipv4.NewPacketConn(c) + defer p.Close() + + dst := c.LocalAddr() + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback) + cf := ipv4.FlagTTL | ipv4.FlagSrc | ipv4.FlagDst | ipv4.FlagInterface + wb := []byte("HELLO-R-U-THERE") + + if err := p.SetControlMessage(cf, true); err != nil { // probe before test + if nettest.ProtocolNotSupported(err) { + t.Skipf("not supported on %s", runtime.GOOS) + } + t.Fatal(err) + } + + var wg sync.WaitGroup + reader := func() { + defer wg.Done() + rb := make([]byte, 128) + if n, cm, _, err := p.ReadFrom(rb); err != nil { + t.Error(err) + return + } else if !bytes.Equal(rb[:n], wb) { + t.Errorf("got %v; want %v", rb[:n], wb) + return + } else { + s := cm.String() + if strings.Contains(s, ",") { + t.Errorf("should be space-separated values: %s", s) + } + } + } + writer := func(toggle bool) { + defer wg.Done() + cm := ipv4.ControlMessage{ + Src: net.IPv4(127, 0, 0, 1), + } + if ifi != nil { + cm.IfIndex = ifi.Index + } + if err := p.SetControlMessage(cf, toggle); err != nil { + t.Error(err) + return + } + if n, err := p.WriteTo(wb, &cm, dst); err != nil { + t.Error(err) + return + } else if n != len(wb) { + t.Errorf("got %d; want %d", n, len(wb)) + return + } + } + + const N = 10 + wg.Add(N) + for i := 0; i < N; i++ { + go reader() + } + wg.Add(2 * N) + for i := 0; i < 2*N; i++ { + go writer(i%2 != 0) + } + wg.Add(N) + for i := 0; i < N; i++ { + go reader() + } + wg.Wait() +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sockopt.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sockopt.go new file mode 100644 index 0000000..22e90c0 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sockopt.go @@ -0,0 +1,44 @@ +// 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 ipv4 + +import "golang.org/x/net/internal/socket" + +// Sticky socket options +const ( + ssoTOS = iota // header field for unicast packet + ssoTTL // header field for unicast packet + ssoMulticastTTL // header field for multicast packet + ssoMulticastInterface // outbound interface for multicast packet + ssoMulticastLoopback // loopback for multicast packet + ssoReceiveTTL // header field on received packet + ssoReceiveDst // header field on received packet + ssoReceiveInterface // inbound interface on received packet + ssoPacketInfo // incbound or outbound packet path + ssoHeaderPrepend // ipv4 header prepend + ssoStripHeader // strip ipv4 header + ssoICMPFilter // icmp filter + ssoJoinGroup // any-source multicast + ssoLeaveGroup // any-source multicast + ssoJoinSourceGroup // source-specific multicast + ssoLeaveSourceGroup // source-specific multicast + ssoBlockSourceGroup // any-source or source-specific multicast + ssoUnblockSourceGroup // any-source or source-specific multicast + ssoAttachFilter // attach BPF for filtering inbound traffic +) + +// Sticky socket option value types +const ( + ssoTypeIPMreq = iota + 1 + ssoTypeIPMreqn + ssoTypeGroupReq + ssoTypeGroupSourceReq +) + +// A sockOpt represents a binding for sticky socket option. +type sockOpt struct { + socket.Option + typ int // hint for option value type; optional +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sockopt_posix.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sockopt_posix.go new file mode 100644 index 0000000..e96955b --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sockopt_posix.go @@ -0,0 +1,71 @@ +// 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows + +package ipv4 + +import ( + "net" + "unsafe" + + "golang.org/x/net/bpf" + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) getMulticastInterface(c *socket.Conn) (*net.Interface, error) { + switch so.typ { + case ssoTypeIPMreqn: + return so.getIPMreqn(c) + default: + return so.getMulticastIf(c) + } +} + +func (so *sockOpt) setMulticastInterface(c *socket.Conn, ifi *net.Interface) error { + switch so.typ { + case ssoTypeIPMreqn: + return so.setIPMreqn(c, ifi, nil) + default: + return so.setMulticastIf(c, ifi) + } +} + +func (so *sockOpt) getICMPFilter(c *socket.Conn) (*ICMPFilter, error) { + b := make([]byte, so.Len) + n, err := so.Get(c, b) + if err != nil { + return nil, err + } + if n != sizeofICMPFilter { + return nil, errOpNoSupport + } + return (*ICMPFilter)(unsafe.Pointer(&b[0])), nil +} + +func (so *sockOpt) setICMPFilter(c *socket.Conn, f *ICMPFilter) error { + b := (*[sizeofICMPFilter]byte)(unsafe.Pointer(f))[:sizeofICMPFilter] + return so.Set(c, b) +} + +func (so *sockOpt) setGroup(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + switch so.typ { + case ssoTypeIPMreq: + return so.setIPMreq(c, ifi, grp) + case ssoTypeIPMreqn: + return so.setIPMreqn(c, ifi, grp) + case ssoTypeGroupReq: + return so.setGroupReq(c, ifi, grp) + default: + return errOpNoSupport + } +} + +func (so *sockOpt) setSourceGroup(c *socket.Conn, ifi *net.Interface, grp, src net.IP) error { + return so.setGroupSourceReq(c, ifi, grp, src) +} + +func (so *sockOpt) setBPF(c *socket.Conn, f []bpf.RawInstruction) error { + return so.setAttachFilter(c, f) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sockopt_stub.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sockopt_stub.go new file mode 100644 index 0000000..23249b7 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sockopt_stub.go @@ -0,0 +1,42 @@ +// 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. + +// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows + +package ipv4 + +import ( + "net" + + "golang.org/x/net/bpf" + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) getMulticastInterface(c *socket.Conn) (*net.Interface, error) { + return nil, errOpNoSupport +} + +func (so *sockOpt) setMulticastInterface(c *socket.Conn, ifi *net.Interface) error { + return errOpNoSupport +} + +func (so *sockOpt) getICMPFilter(c *socket.Conn) (*ICMPFilter, error) { + return nil, errOpNoSupport +} + +func (so *sockOpt) setICMPFilter(c *socket.Conn, f *ICMPFilter) error { + return errOpNoSupport +} + +func (so *sockOpt) setGroup(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + return errOpNoSupport +} + +func (so *sockOpt) setSourceGroup(c *socket.Conn, ifi *net.Interface, grp, src net.IP) error { + return errOpNoSupport +} + +func (so *sockOpt) setBPF(c *socket.Conn, f []bpf.RawInstruction) error { + return errOpNoSupport +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_asmreq.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_asmreq.go new file mode 100644 index 0000000..0388cba --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_asmreq.go @@ -0,0 +1,119 @@ +// 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. + +// +build darwin dragonfly freebsd netbsd openbsd solaris windows + +package ipv4 + +import ( + "net" + "unsafe" + + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) setIPMreq(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + mreq := ipMreq{Multiaddr: [4]byte{grp[0], grp[1], grp[2], grp[3]}} + if err := setIPMreqInterface(&mreq, ifi); err != nil { + return err + } + b := (*[sizeofIPMreq]byte)(unsafe.Pointer(&mreq))[:sizeofIPMreq] + return so.Set(c, b) +} + +func (so *sockOpt) getMulticastIf(c *socket.Conn) (*net.Interface, error) { + var b [4]byte + if _, err := so.Get(c, b[:]); err != nil { + return nil, err + } + ifi, err := netIP4ToInterface(net.IPv4(b[0], b[1], b[2], b[3])) + if err != nil { + return nil, err + } + return ifi, nil +} + +func (so *sockOpt) setMulticastIf(c *socket.Conn, ifi *net.Interface) error { + ip, err := netInterfaceToIP4(ifi) + if err != nil { + return err + } + var b [4]byte + copy(b[:], ip) + return so.Set(c, b[:]) +} + +func setIPMreqInterface(mreq *ipMreq, ifi *net.Interface) error { + if ifi == nil { + return nil + } + ifat, err := ifi.Addrs() + if err != nil { + return err + } + for _, ifa := range ifat { + switch ifa := ifa.(type) { + case *net.IPAddr: + if ip := ifa.IP.To4(); ip != nil { + copy(mreq.Interface[:], ip) + return nil + } + case *net.IPNet: + if ip := ifa.IP.To4(); ip != nil { + copy(mreq.Interface[:], ip) + return nil + } + } + } + return errNoSuchInterface +} + +func netIP4ToInterface(ip net.IP) (*net.Interface, error) { + ift, err := net.Interfaces() + if err != nil { + return nil, err + } + for _, ifi := range ift { + ifat, err := ifi.Addrs() + if err != nil { + return nil, err + } + for _, ifa := range ifat { + switch ifa := ifa.(type) { + case *net.IPAddr: + if ip.Equal(ifa.IP) { + return &ifi, nil + } + case *net.IPNet: + if ip.Equal(ifa.IP) { + return &ifi, nil + } + } + } + } + return nil, errNoSuchInterface +} + +func netInterfaceToIP4(ifi *net.Interface) (net.IP, error) { + if ifi == nil { + return net.IPv4zero.To4(), nil + } + ifat, err := ifi.Addrs() + if err != nil { + return nil, err + } + for _, ifa := range ifat { + switch ifa := ifa.(type) { + case *net.IPAddr: + if ip := ifa.IP.To4(); ip != nil { + return ip, nil + } + case *net.IPNet: + if ip := ifa.IP.To4(); ip != nil { + return ip, nil + } + } + } + return nil, errNoSuchInterface +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_asmreq_stub.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_asmreq_stub.go new file mode 100644 index 0000000..f391920 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_asmreq_stub.go @@ -0,0 +1,25 @@ +// 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. + +// +build !darwin,!dragonfly,!freebsd,!netbsd,!openbsd,!solaris,!windows + +package ipv4 + +import ( + "net" + + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) setIPMreq(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + return errOpNoSupport +} + +func (so *sockOpt) getMulticastIf(c *socket.Conn) (*net.Interface, error) { + return nil, errOpNoSupport +} + +func (so *sockOpt) setMulticastIf(c *socket.Conn, ifi *net.Interface) error { + return errOpNoSupport +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_asmreqn.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_asmreqn.go new file mode 100644 index 0000000..1f24f69 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_asmreqn.go @@ -0,0 +1,42 @@ +// 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. + +// +build darwin freebsd linux + +package ipv4 + +import ( + "net" + "unsafe" + + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) getIPMreqn(c *socket.Conn) (*net.Interface, error) { + b := make([]byte, so.Len) + if _, err := so.Get(c, b); err != nil { + return nil, err + } + mreqn := (*ipMreqn)(unsafe.Pointer(&b[0])) + if mreqn.Ifindex == 0 { + return nil, nil + } + ifi, err := net.InterfaceByIndex(int(mreqn.Ifindex)) + if err != nil { + return nil, err + } + return ifi, nil +} + +func (so *sockOpt) setIPMreqn(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + var mreqn ipMreqn + if ifi != nil { + mreqn.Ifindex = int32(ifi.Index) + } + if grp != nil { + mreqn.Multiaddr = [4]byte{grp[0], grp[1], grp[2], grp[3]} + } + b := (*[sizeofIPMreqn]byte)(unsafe.Pointer(&mreqn))[:sizeofIPMreqn] + return so.Set(c, b) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_asmreqn_stub.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_asmreqn_stub.go new file mode 100644 index 0000000..0711d3d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_asmreqn_stub.go @@ -0,0 +1,21 @@ +// 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. + +// +build !darwin,!freebsd,!linux + +package ipv4 + +import ( + "net" + + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) getIPMreqn(c *socket.Conn) (*net.Interface, error) { + return nil, errOpNoSupport +} + +func (so *sockOpt) setIPMreqn(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + return errOpNoSupport +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_bpf.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_bpf.go new file mode 100644 index 0000000..9f30b73 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_bpf.go @@ -0,0 +1,23 @@ +// 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. + +// +build linux + +package ipv4 + +import ( + "unsafe" + + "golang.org/x/net/bpf" + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) setAttachFilter(c *socket.Conn, f []bpf.RawInstruction) error { + prog := sockFProg{ + Len: uint16(len(f)), + Filter: (*sockFilter)(unsafe.Pointer(&f[0])), + } + b := (*[sizeofSockFprog]byte)(unsafe.Pointer(&prog))[:sizeofSockFprog] + return so.Set(c, b) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_bpf_stub.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_bpf_stub.go new file mode 100644 index 0000000..9a21320 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_bpf_stub.go @@ -0,0 +1,16 @@ +// 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. + +// +build !linux + +package ipv4 + +import ( + "golang.org/x/net/bpf" + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) setAttachFilter(c *socket.Conn, f []bpf.RawInstruction) error { + return errOpNoSupport +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_bsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_bsd.go new file mode 100644 index 0000000..58256dd --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_bsd.go @@ -0,0 +1,37 @@ +// 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. + +// +build netbsd openbsd + +package ipv4 + +import ( + "net" + "syscall" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTTL: {sysIP_RECVTTL, 1, marshalTTL, parseTTL}, + ctlDst: {sysIP_RECVDSTADDR, net.IPv4len, marshalDst, parseDst}, + ctlInterface: {sysIP_RECVIF, syscall.SizeofSockaddrDatalink, marshalInterface, parseInterface}, + } + + sockOpts = map[int]*sockOpt{ + ssoTOS: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TOS, Len: 4}}, + ssoTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TTL, Len: 4}}, + ssoMulticastTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_TTL, Len: 1}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_IF, Len: 4}}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_LOOP, Len: 1}}, + ssoReceiveTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVTTL, Len: 4}}, + ssoReceiveDst: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVDSTADDR, Len: 4}}, + ssoReceiveInterface: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVIF, Len: 4}}, + ssoHeaderPrepend: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_HDRINCL, Len: 4}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_ADD_MEMBERSHIP, Len: sizeofIPMreq}, typ: ssoTypeIPMreq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_DROP_MEMBERSHIP, Len: sizeofIPMreq}, typ: ssoTypeIPMreq}, + } +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_darwin.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_darwin.go new file mode 100644 index 0000000..e8fb191 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_darwin.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 ipv4 + +import ( + "net" + "strconv" + "strings" + "syscall" + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTTL: {sysIP_RECVTTL, 1, marshalTTL, parseTTL}, + ctlDst: {sysIP_RECVDSTADDR, net.IPv4len, marshalDst, parseDst}, + ctlInterface: {sysIP_RECVIF, syscall.SizeofSockaddrDatalink, marshalInterface, parseInterface}, + } + + sockOpts = map[int]*sockOpt{ + ssoTOS: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TOS, Len: 4}}, + ssoTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TTL, Len: 4}}, + ssoMulticastTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_TTL, Len: 1}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_IF, Len: 4}}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_LOOP, Len: 4}}, + ssoReceiveTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVTTL, Len: 4}}, + ssoReceiveDst: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVDSTADDR, Len: 4}}, + ssoReceiveInterface: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVIF, Len: 4}}, + ssoHeaderPrepend: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_HDRINCL, Len: 4}}, + ssoStripHeader: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_STRIPHDR, Len: 4}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_ADD_MEMBERSHIP, Len: sizeofIPMreq}, typ: ssoTypeIPMreq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_DROP_MEMBERSHIP, Len: sizeofIPMreq}, typ: ssoTypeIPMreq}, + } +) + +func init() { + // Seems like kern.osreldate is veiled on latest OS X. We use + // kern.osrelease instead. + s, err := syscall.Sysctl("kern.osrelease") + if err != nil { + return + } + ss := strings.Split(s, ".") + if len(ss) == 0 { + return + } + // The IP_PKTINFO and protocol-independent multicast API were + // introduced in OS X 10.7 (Darwin 11). But it looks like + // those features require OS X 10.8 (Darwin 12) or above. + // See http://support.apple.com/kb/HT1633. + if mjver, err := strconv.Atoi(ss[0]); err != nil || mjver < 12 { + return + } + ctlOpts[ctlPacketInfo].name = sysIP_PKTINFO + ctlOpts[ctlPacketInfo].length = sizeofInetPktinfo + ctlOpts[ctlPacketInfo].marshal = marshalPacketInfo + ctlOpts[ctlPacketInfo].parse = parsePacketInfo + sockOpts[ssoPacketInfo] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVPKTINFO, Len: 4}} + sockOpts[ssoMulticastInterface] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_IF, Len: sizeofIPMreqn}, typ: ssoTypeIPMreqn} + sockOpts[ssoJoinGroup] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_JOIN_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq} + sockOpts[ssoLeaveGroup] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_LEAVE_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq} + sockOpts[ssoJoinSourceGroup] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_JOIN_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq} + sockOpts[ssoLeaveSourceGroup] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_LEAVE_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq} + sockOpts[ssoBlockSourceGroup] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_BLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq} + sockOpts[ssoUnblockSourceGroup] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_UNBLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq} +} + +func (pi *inetPktinfo) setIfindex(i int) { + pi.Ifindex = uint32(i) +} + +func (gr *groupReq) setGroup(grp net.IP) { + sa := (*sockaddrInet)(unsafe.Pointer(uintptr(unsafe.Pointer(gr)) + 4)) + sa.Len = sizeofSockaddrInet + sa.Family = syscall.AF_INET + copy(sa.Addr[:], grp) +} + +func (gsr *groupSourceReq) setSourceGroup(grp, src net.IP) { + sa := (*sockaddrInet)(unsafe.Pointer(uintptr(unsafe.Pointer(gsr)) + 4)) + sa.Len = sizeofSockaddrInet + sa.Family = syscall.AF_INET + copy(sa.Addr[:], grp) + sa = (*sockaddrInet)(unsafe.Pointer(uintptr(unsafe.Pointer(gsr)) + 132)) + sa.Len = sizeofSockaddrInet + sa.Family = syscall.AF_INET + copy(sa.Addr[:], src) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_dragonfly.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_dragonfly.go new file mode 100644 index 0000000..859764f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_dragonfly.go @@ -0,0 +1,35 @@ +// 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 ipv4 + +import ( + "net" + "syscall" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTTL: {sysIP_RECVTTL, 1, marshalTTL, parseTTL}, + ctlDst: {sysIP_RECVDSTADDR, net.IPv4len, marshalDst, parseDst}, + ctlInterface: {sysIP_RECVIF, syscall.SizeofSockaddrDatalink, marshalInterface, parseInterface}, + } + + sockOpts = map[int]*sockOpt{ + ssoTOS: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TOS, Len: 4}}, + ssoTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TTL, Len: 4}}, + ssoMulticastTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_TTL, Len: 1}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_IF, Len: 4}}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_LOOP, Len: 4}}, + ssoReceiveTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVTTL, Len: 4}}, + ssoReceiveDst: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVDSTADDR, Len: 4}}, + ssoReceiveInterface: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVIF, Len: 4}}, + ssoHeaderPrepend: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_HDRINCL, Len: 4}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_ADD_MEMBERSHIP, Len: sizeofIPMreq}, typ: ssoTypeIPMreq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_DROP_MEMBERSHIP, Len: sizeofIPMreq}, typ: ssoTypeIPMreq}, + } +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_freebsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_freebsd.go new file mode 100644 index 0000000..b800324 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_freebsd.go @@ -0,0 +1,76 @@ +// 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 ipv4 + +import ( + "net" + "runtime" + "strings" + "syscall" + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTTL: {sysIP_RECVTTL, 1, marshalTTL, parseTTL}, + ctlDst: {sysIP_RECVDSTADDR, net.IPv4len, marshalDst, parseDst}, + ctlInterface: {sysIP_RECVIF, syscall.SizeofSockaddrDatalink, marshalInterface, parseInterface}, + } + + sockOpts = map[int]*sockOpt{ + ssoTOS: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TOS, Len: 4}}, + ssoTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TTL, Len: 4}}, + ssoMulticastTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_TTL, Len: 1}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_IF, Len: 4}}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_LOOP, Len: 4}}, + ssoReceiveTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVTTL, Len: 4}}, + ssoReceiveDst: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVDSTADDR, Len: 4}}, + ssoReceiveInterface: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVIF, Len: 4}}, + ssoHeaderPrepend: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_HDRINCL, Len: 4}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_JOIN_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_LEAVE_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoJoinSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_JOIN_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoLeaveSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_LEAVE_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoBlockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_BLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoUnblockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_UNBLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + } +) + +func init() { + freebsdVersion, _ = syscall.SysctlUint32("kern.osreldate") + if freebsdVersion >= 1000000 { + sockOpts[ssoMulticastInterface] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_IF, Len: sizeofIPMreqn}, typ: ssoTypeIPMreqn} + } + if runtime.GOOS == "freebsd" && runtime.GOARCH == "386" { + archs, _ := syscall.Sysctl("kern.supported_archs") + for _, s := range strings.Fields(archs) { + if s == "amd64" { + freebsd32o64 = true + break + } + } + } +} + +func (gr *groupReq) setGroup(grp net.IP) { + sa := (*sockaddrInet)(unsafe.Pointer(&gr.Group)) + sa.Len = sizeofSockaddrInet + sa.Family = syscall.AF_INET + copy(sa.Addr[:], grp) +} + +func (gsr *groupSourceReq) setSourceGroup(grp, src net.IP) { + sa := (*sockaddrInet)(unsafe.Pointer(&gsr.Group)) + sa.Len = sizeofSockaddrInet + sa.Family = syscall.AF_INET + copy(sa.Addr[:], grp) + sa = (*sockaddrInet)(unsafe.Pointer(&gsr.Source)) + sa.Len = sizeofSockaddrInet + sa.Family = syscall.AF_INET + copy(sa.Addr[:], src) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_linux.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_linux.go new file mode 100644 index 0000000..60defe1 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_linux.go @@ -0,0 +1,59 @@ +// 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 ipv4 + +import ( + "net" + "syscall" + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTTL: {sysIP_TTL, 1, marshalTTL, parseTTL}, + ctlPacketInfo: {sysIP_PKTINFO, sizeofInetPktinfo, marshalPacketInfo, parsePacketInfo}, + } + + sockOpts = map[int]*sockOpt{ + ssoTOS: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TOS, Len: 4}}, + ssoTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TTL, Len: 4}}, + ssoMulticastTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_TTL, Len: 4}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_IF, Len: sizeofIPMreqn}, typ: ssoTypeIPMreqn}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_LOOP, Len: 4}}, + ssoReceiveTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVTTL, Len: 4}}, + ssoPacketInfo: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_PKTINFO, Len: 4}}, + ssoHeaderPrepend: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_HDRINCL, Len: 4}}, + ssoICMPFilter: {Option: socket.Option{Level: iana.ProtocolReserved, Name: sysICMP_FILTER, Len: sizeofICMPFilter}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_JOIN_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_LEAVE_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoJoinSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_JOIN_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoLeaveSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_LEAVE_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoBlockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_BLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoUnblockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_UNBLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoAttachFilter: {Option: socket.Option{Level: sysSOL_SOCKET, Name: sysSO_ATTACH_FILTER, Len: sizeofSockFprog}}, + } +) + +func (pi *inetPktinfo) setIfindex(i int) { + pi.Ifindex = int32(i) +} + +func (gr *groupReq) setGroup(grp net.IP) { + sa := (*sockaddrInet)(unsafe.Pointer(&gr.Group)) + sa.Family = syscall.AF_INET + copy(sa.Addr[:], grp) +} + +func (gsr *groupSourceReq) setSourceGroup(grp, src net.IP) { + sa := (*sockaddrInet)(unsafe.Pointer(&gsr.Group)) + sa.Family = syscall.AF_INET + copy(sa.Addr[:], grp) + sa = (*sockaddrInet)(unsafe.Pointer(&gsr.Source)) + sa.Family = syscall.AF_INET + copy(sa.Addr[:], src) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_solaris.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_solaris.go new file mode 100644 index 0000000..832fef1 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_solaris.go @@ -0,0 +1,57 @@ +// 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 ipv4 + +import ( + "net" + "syscall" + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTTL: {sysIP_RECVTTL, 4, marshalTTL, parseTTL}, + ctlPacketInfo: {sysIP_PKTINFO, sizeofInetPktinfo, marshalPacketInfo, parsePacketInfo}, + } + + sockOpts = map[int]sockOpt{ + ssoTOS: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TOS, Len: 4}}, + ssoTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TTL, Len: 4}}, + ssoMulticastTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_TTL, Len: 1}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_IF, Len: 4}}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_LOOP, Len: 1}}, + ssoReceiveTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVTTL, Len: 4}}, + ssoPacketInfo: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVPKTINFO, Len: 4}}, + ssoHeaderPrepend: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_HDRINCL, Len: 4}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_JOIN_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_LEAVE_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoJoinSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_JOIN_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoLeaveSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_LEAVE_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoBlockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_BLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoUnblockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_UNBLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + } +) + +func (pi *inetPktinfo) setIfindex(i int) { + pi.Ifindex = uint32(i) +} + +func (gr *groupReq) setGroup(grp net.IP) { + sa := (*sockaddrInet)(unsafe.Pointer(uintptr(unsafe.Pointer(gr)) + 4)) + sa.Family = syscall.AF_INET + copy(sa.Addr[:], grp) +} + +func (gsr *groupSourceReq) setSourceGroup(grp, src net.IP) { + sa := (*sockaddrInet)(unsafe.Pointer(uintptr(unsafe.Pointer(gsr)) + 4)) + sa.Family = syscall.AF_INET + copy(sa.Addr[:], grp) + sa = (*sockaddrInet)(unsafe.Pointer(uintptr(unsafe.Pointer(gsr)) + 260)) + sa.Family = syscall.AF_INET + copy(sa.Addr[:], src) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_ssmreq.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_ssmreq.go new file mode 100644 index 0000000..ae5704e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_ssmreq.go @@ -0,0 +1,54 @@ +// 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. + +// +build darwin freebsd linux solaris + +package ipv4 + +import ( + "net" + "unsafe" + + "golang.org/x/net/internal/socket" +) + +var freebsd32o64 bool + +func (so *sockOpt) setGroupReq(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + var gr groupReq + if ifi != nil { + gr.Interface = uint32(ifi.Index) + } + gr.setGroup(grp) + var b []byte + if freebsd32o64 { + var d [sizeofGroupReq + 4]byte + s := (*[sizeofGroupReq]byte)(unsafe.Pointer(&gr)) + copy(d[:4], s[:4]) + copy(d[8:], s[4:]) + b = d[:] + } else { + b = (*[sizeofGroupReq]byte)(unsafe.Pointer(&gr))[:sizeofGroupReq] + } + return so.Set(c, b) +} + +func (so *sockOpt) setGroupSourceReq(c *socket.Conn, ifi *net.Interface, grp, src net.IP) error { + var gsr groupSourceReq + if ifi != nil { + gsr.Interface = uint32(ifi.Index) + } + gsr.setSourceGroup(grp, src) + var b []byte + if freebsd32o64 { + var d [sizeofGroupSourceReq + 4]byte + s := (*[sizeofGroupSourceReq]byte)(unsafe.Pointer(&gsr)) + copy(d[:4], s[:4]) + copy(d[8:], s[4:]) + b = d[:] + } else { + b = (*[sizeofGroupSourceReq]byte)(unsafe.Pointer(&gsr))[:sizeofGroupSourceReq] + } + return so.Set(c, b) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_ssmreq_stub.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_ssmreq_stub.go new file mode 100644 index 0000000..e6b7623 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_ssmreq_stub.go @@ -0,0 +1,21 @@ +// 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. + +// +build !darwin,!freebsd,!linux,!solaris + +package ipv4 + +import ( + "net" + + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) setGroupReq(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + return errOpNoSupport +} + +func (so *sockOpt) setGroupSourceReq(c *socket.Conn, ifi *net.Interface, grp, src net.IP) error { + return errOpNoSupport +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_stub.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_stub.go new file mode 100644 index 0000000..4f07647 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_stub.go @@ -0,0 +1,13 @@ +// 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. + +// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows + +package ipv4 + +var ( + ctlOpts = [ctlMax]ctlOpt{} + + sockOpts = map[int]*sockOpt{} +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_windows.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_windows.go new file mode 100644 index 0000000..b0913d5 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/sys_windows.go @@ -0,0 +1,67 @@ +// 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 ipv4 + +import ( + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +const ( + // See ws2tcpip.h. + sysIP_OPTIONS = 0x1 + sysIP_HDRINCL = 0x2 + sysIP_TOS = 0x3 + sysIP_TTL = 0x4 + sysIP_MULTICAST_IF = 0x9 + sysIP_MULTICAST_TTL = 0xa + sysIP_MULTICAST_LOOP = 0xb + sysIP_ADD_MEMBERSHIP = 0xc + sysIP_DROP_MEMBERSHIP = 0xd + sysIP_DONTFRAGMENT = 0xe + sysIP_ADD_SOURCE_MEMBERSHIP = 0xf + sysIP_DROP_SOURCE_MEMBERSHIP = 0x10 + sysIP_PKTINFO = 0x13 + + sizeofInetPktinfo = 0x8 + sizeofIPMreq = 0x8 + sizeofIPMreqSource = 0xc +) + +type inetPktinfo struct { + Addr [4]byte + Ifindex int32 +} + +type ipMreq struct { + Multiaddr [4]byte + Interface [4]byte +} + +type ipMreqSource struct { + Multiaddr [4]byte + Sourceaddr [4]byte + Interface [4]byte +} + +// See http://msdn.microsoft.com/en-us/library/windows/desktop/ms738586(v=vs.85).aspx +var ( + ctlOpts = [ctlMax]ctlOpt{} + + sockOpts = map[int]*sockOpt{ + ssoTOS: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TOS, Len: 4}}, + ssoTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TTL, Len: 4}}, + ssoMulticastTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_TTL, Len: 4}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_IF, Len: 4}}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_LOOP, Len: 4}}, + ssoHeaderPrepend: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_HDRINCL, Len: 4}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_ADD_MEMBERSHIP, Len: sizeofIPMreq}, typ: ssoTypeIPMreq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_DROP_MEMBERSHIP, Len: sizeofIPMreq}, typ: ssoTypeIPMreq}, + } +) + +func (pi *inetPktinfo) setIfindex(i int) { + pi.Ifindex = int32(i) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/unicast_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/unicast_test.go new file mode 100644 index 0000000..02c089f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/unicast_test.go @@ -0,0 +1,247 @@ +// 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 ipv4_test + +import ( + "bytes" + "net" + "os" + "runtime" + "testing" + "time" + + "golang.org/x/net/icmp" + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv4" +) + +func TestPacketConnReadWriteUnicastUDP(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + c, err := nettest.NewLocalPacketListener("udp4") + if err != nil { + t.Fatal(err) + } + defer c.Close() + p := ipv4.NewPacketConn(c) + defer p.Close() + + dst := c.LocalAddr() + cf := ipv4.FlagTTL | ipv4.FlagDst | ipv4.FlagInterface + wb := []byte("HELLO-R-U-THERE") + + for i, toggle := range []bool{true, false, true} { + if err := p.SetControlMessage(cf, toggle); err != nil { + if nettest.ProtocolNotSupported(err) { + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + p.SetTTL(i + 1) + if err := p.SetWriteDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { + t.Fatal(err) + } + if n, err := p.WriteTo(wb, nil, dst); err != nil { + t.Fatal(err) + } else if n != len(wb) { + t.Fatalf("got %v; want %v", n, len(wb)) + } + rb := make([]byte, 128) + if err := p.SetReadDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { + t.Fatal(err) + } + if n, _, _, err := p.ReadFrom(rb); err != nil { + t.Fatal(err) + } else if !bytes.Equal(rb[:n], wb) { + t.Fatalf("got %v; want %v", rb[:n], wb) + } + } +} + +func TestPacketConnReadWriteUnicastICMP(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + c, err := net.ListenPacket("ip4:icmp", "0.0.0.0") + if err != nil { + t.Fatal(err) + } + defer c.Close() + + dst, err := net.ResolveIPAddr("ip4", "127.0.0.1") + if err != nil { + t.Fatal(err) + } + p := ipv4.NewPacketConn(c) + defer p.Close() + cf := ipv4.FlagDst | ipv4.FlagInterface + if runtime.GOOS != "solaris" { + // Solaris never allows to modify ICMP properties. + cf |= ipv4.FlagTTL + } + + for i, toggle := range []bool{true, false, true} { + wb, err := (&icmp.Message{ + Type: ipv4.ICMPTypeEcho, Code: 0, + Body: &icmp.Echo{ + ID: os.Getpid() & 0xffff, Seq: i + 1, + Data: []byte("HELLO-R-U-THERE"), + }, + }).Marshal(nil) + if err != nil { + t.Fatal(err) + } + if err := p.SetControlMessage(cf, toggle); err != nil { + if nettest.ProtocolNotSupported(err) { + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + p.SetTTL(i + 1) + if err := p.SetWriteDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { + t.Fatal(err) + } + if n, err := p.WriteTo(wb, nil, dst); err != nil { + t.Fatal(err) + } else if n != len(wb) { + t.Fatalf("got %v; want %v", n, len(wb)) + } + rb := make([]byte, 128) + loop: + if err := p.SetReadDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { + t.Fatal(err) + } + if n, _, _, err := p.ReadFrom(rb); err != nil { + switch runtime.GOOS { + case "darwin": // older darwin kernels have some limitation on receiving icmp packet through raw socket + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } else { + m, err := icmp.ParseMessage(iana.ProtocolICMP, rb[:n]) + if err != nil { + t.Fatal(err) + } + if runtime.GOOS == "linux" && m.Type == ipv4.ICMPTypeEcho { + // On Linux we must handle own sent packets. + goto loop + } + if m.Type != ipv4.ICMPTypeEchoReply || m.Code != 0 { + t.Fatalf("got type=%v, code=%v; want type=%v, code=%v", m.Type, m.Code, ipv4.ICMPTypeEchoReply, 0) + } + } + } +} + +func TestRawConnReadWriteUnicastICMP(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + c, err := net.ListenPacket("ip4:icmp", "0.0.0.0") + if err != nil { + t.Fatal(err) + } + defer c.Close() + + dst, err := net.ResolveIPAddr("ip4", "127.0.0.1") + if err != nil { + t.Fatal(err) + } + r, err := ipv4.NewRawConn(c) + if err != nil { + t.Fatal(err) + } + defer r.Close() + cf := ipv4.FlagTTL | ipv4.FlagDst | ipv4.FlagInterface + + for i, toggle := range []bool{true, false, true} { + wb, err := (&icmp.Message{ + Type: ipv4.ICMPTypeEcho, Code: 0, + Body: &icmp.Echo{ + ID: os.Getpid() & 0xffff, Seq: i + 1, + Data: []byte("HELLO-R-U-THERE"), + }, + }).Marshal(nil) + if err != nil { + t.Fatal(err) + } + wh := &ipv4.Header{ + Version: ipv4.Version, + Len: ipv4.HeaderLen, + TOS: i + 1, + TotalLen: ipv4.HeaderLen + len(wb), + TTL: i + 1, + Protocol: 1, + Dst: dst.IP, + } + if err := r.SetControlMessage(cf, toggle); err != nil { + if nettest.ProtocolNotSupported(err) { + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + if err := r.SetWriteDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { + t.Fatal(err) + } + if err := r.WriteTo(wh, wb, nil); err != nil { + t.Fatal(err) + } + rb := make([]byte, ipv4.HeaderLen+128) + loop: + if err := r.SetReadDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { + t.Fatal(err) + } + if _, b, _, err := r.ReadFrom(rb); err != nil { + switch runtime.GOOS { + case "darwin": // older darwin kernels have some limitation on receiving icmp packet through raw socket + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } else { + m, err := icmp.ParseMessage(iana.ProtocolICMP, b) + if err != nil { + t.Fatal(err) + } + if runtime.GOOS == "linux" && m.Type == ipv4.ICMPTypeEcho { + // On Linux we must handle own sent packets. + goto loop + } + if m.Type != ipv4.ICMPTypeEchoReply || m.Code != 0 { + t.Fatalf("got type=%v, code=%v; want type=%v, code=%v", m.Type, m.Code, ipv4.ICMPTypeEchoReply, 0) + } + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/unicastsockopt_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/unicastsockopt_test.go new file mode 100644 index 0000000..db5213b --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/unicastsockopt_test.go @@ -0,0 +1,148 @@ +// 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 ipv4_test + +import ( + "net" + "runtime" + "testing" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv4" +) + +func TestConnUnicastSocketOptions(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + ln, err := net.Listen("tcp4", "127.0.0.1:0") + if err != nil { + t.Fatal(err) + } + defer ln.Close() + + errc := make(chan error, 1) + go func() { + c, err := ln.Accept() + if err != nil { + errc <- err + return + } + errc <- c.Close() + }() + + c, err := net.Dial("tcp4", ln.Addr().String()) + if err != nil { + t.Fatal(err) + } + defer c.Close() + + testUnicastSocketOptions(t, ipv4.NewConn(c)) + + if err := <-errc; err != nil { + t.Errorf("server: %v", err) + } +} + +var packetConnUnicastSocketOptionTests = []struct { + net, proto, addr string +}{ + {"udp4", "", "127.0.0.1:0"}, + {"ip4", ":icmp", "127.0.0.1"}, +} + +func TestPacketConnUnicastSocketOptions(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + m, ok := nettest.SupportsRawIPSocket() + for _, tt := range packetConnUnicastSocketOptionTests { + if tt.net == "ip4" && !ok { + t.Log(m) + continue + } + c, err := net.ListenPacket(tt.net+tt.proto, tt.addr) + if err != nil { + t.Fatal(err) + } + defer c.Close() + + testUnicastSocketOptions(t, ipv4.NewPacketConn(c)) + } +} + +func TestRawConnUnicastSocketOptions(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + c, err := net.ListenPacket("ip4:icmp", "127.0.0.1") + if err != nil { + t.Fatal(err) + } + defer c.Close() + + r, err := ipv4.NewRawConn(c) + if err != nil { + t.Fatal(err) + } + + testUnicastSocketOptions(t, r) +} + +type testIPv4UnicastConn interface { + TOS() (int, error) + SetTOS(int) error + TTL() (int, error) + SetTTL(int) error +} + +func testUnicastSocketOptions(t *testing.T, c testIPv4UnicastConn) { + tos := iana.DiffServCS0 | iana.NotECNTransport + switch runtime.GOOS { + case "windows": + // IP_TOS option is supported on Windows 8 and beyond. + t.Skipf("not supported on %s", runtime.GOOS) + } + + if err := c.SetTOS(tos); err != nil { + t.Fatal(err) + } + if v, err := c.TOS(); err != nil { + t.Fatal(err) + } else if v != tos { + t.Fatalf("got %v; want %v", v, tos) + } + const ttl = 255 + if err := c.SetTTL(ttl); err != nil { + t.Fatal(err) + } + if v, err := c.TTL(); err != nil { + t.Fatal(err) + } else if v != ttl { + t.Fatalf("got %v; want %v", v, ttl) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_darwin.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_darwin.go new file mode 100644 index 0000000..c07cc88 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_darwin.go @@ -0,0 +1,99 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_darwin.go + +package ipv4 + +const ( + sysIP_OPTIONS = 0x1 + sysIP_HDRINCL = 0x2 + sysIP_TOS = 0x3 + sysIP_TTL = 0x4 + sysIP_RECVOPTS = 0x5 + sysIP_RECVRETOPTS = 0x6 + sysIP_RECVDSTADDR = 0x7 + sysIP_RETOPTS = 0x8 + sysIP_RECVIF = 0x14 + sysIP_STRIPHDR = 0x17 + sysIP_RECVTTL = 0x18 + sysIP_BOUND_IF = 0x19 + sysIP_PKTINFO = 0x1a + sysIP_RECVPKTINFO = 0x1a + + sysIP_MULTICAST_IF = 0x9 + sysIP_MULTICAST_TTL = 0xa + sysIP_MULTICAST_LOOP = 0xb + sysIP_ADD_MEMBERSHIP = 0xc + sysIP_DROP_MEMBERSHIP = 0xd + sysIP_MULTICAST_VIF = 0xe + sysIP_MULTICAST_IFINDEX = 0x42 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x46 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x47 + sysIP_BLOCK_SOURCE = 0x48 + sysIP_UNBLOCK_SOURCE = 0x49 + sysMCAST_JOIN_GROUP = 0x50 + sysMCAST_LEAVE_GROUP = 0x51 + sysMCAST_JOIN_SOURCE_GROUP = 0x52 + sysMCAST_LEAVE_SOURCE_GROUP = 0x53 + sysMCAST_BLOCK_SOURCE = 0x54 + sysMCAST_UNBLOCK_SOURCE = 0x55 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 +) + +type sockaddrStorage struct { + Len uint8 + Family uint8 + X__ss_pad1 [6]int8 + X__ss_align int64 + X__ss_pad2 [112]int8 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type inetPktinfo struct { + Ifindex uint32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr [4]byte /* in_addr */ + Sourceaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [128]byte +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [128]byte + Pad_cgo_1 [128]byte +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_dragonfly.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_dragonfly.go new file mode 100644 index 0000000..c4365e9 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_dragonfly.go @@ -0,0 +1,31 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_dragonfly.go + +package ipv4 + +const ( + sysIP_OPTIONS = 0x1 + sysIP_HDRINCL = 0x2 + sysIP_TOS = 0x3 + sysIP_TTL = 0x4 + sysIP_RECVOPTS = 0x5 + sysIP_RECVRETOPTS = 0x6 + sysIP_RECVDSTADDR = 0x7 + sysIP_RETOPTS = 0x8 + sysIP_RECVIF = 0x14 + sysIP_RECVTTL = 0x41 + + sysIP_MULTICAST_IF = 0x9 + sysIP_MULTICAST_TTL = 0xa + sysIP_MULTICAST_LOOP = 0xb + sysIP_MULTICAST_VIF = 0xe + sysIP_ADD_MEMBERSHIP = 0xc + sysIP_DROP_MEMBERSHIP = 0xd + + sizeofIPMreq = 0x8 +) + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_freebsd_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_freebsd_386.go new file mode 100644 index 0000000..8c4aec9 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_freebsd_386.go @@ -0,0 +1,93 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_freebsd.go + +package ipv4 + +const ( + sysIP_OPTIONS = 0x1 + sysIP_HDRINCL = 0x2 + sysIP_TOS = 0x3 + sysIP_TTL = 0x4 + sysIP_RECVOPTS = 0x5 + sysIP_RECVRETOPTS = 0x6 + sysIP_RECVDSTADDR = 0x7 + sysIP_SENDSRCADDR = 0x7 + sysIP_RETOPTS = 0x8 + sysIP_RECVIF = 0x14 + sysIP_ONESBCAST = 0x17 + sysIP_BINDANY = 0x18 + sysIP_RECVTTL = 0x41 + sysIP_MINTTL = 0x42 + sysIP_DONTFRAG = 0x43 + sysIP_RECVTOS = 0x44 + + sysIP_MULTICAST_IF = 0x9 + sysIP_MULTICAST_TTL = 0xa + sysIP_MULTICAST_LOOP = 0xb + sysIP_ADD_MEMBERSHIP = 0xc + sysIP_DROP_MEMBERSHIP = 0xd + sysIP_MULTICAST_VIF = 0xe + sysIP_ADD_SOURCE_MEMBERSHIP = 0x46 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x47 + sysIP_BLOCK_SOURCE = 0x48 + sysIP_UNBLOCK_SOURCE = 0x49 + sysMCAST_JOIN_GROUP = 0x50 + sysMCAST_LEAVE_GROUP = 0x51 + sysMCAST_JOIN_SOURCE_GROUP = 0x52 + sysMCAST_LEAVE_SOURCE_GROUP = 0x53 + sysMCAST_BLOCK_SOURCE = 0x54 + sysMCAST_UNBLOCK_SOURCE = 0x55 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 +) + +type sockaddrStorage struct { + Len uint8 + Family uint8 + X__ss_pad1 [6]int8 + X__ss_align int64 + X__ss_pad2 [112]int8 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr [4]byte /* in_addr */ + Sourceaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type groupReq struct { + Interface uint32 + Group sockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Group sockaddrStorage + Source sockaddrStorage +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_freebsd_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_freebsd_amd64.go new file mode 100644 index 0000000..4b10b7c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_freebsd_amd64.go @@ -0,0 +1,95 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_freebsd.go + +package ipv4 + +const ( + sysIP_OPTIONS = 0x1 + sysIP_HDRINCL = 0x2 + sysIP_TOS = 0x3 + sysIP_TTL = 0x4 + sysIP_RECVOPTS = 0x5 + sysIP_RECVRETOPTS = 0x6 + sysIP_RECVDSTADDR = 0x7 + sysIP_SENDSRCADDR = 0x7 + sysIP_RETOPTS = 0x8 + sysIP_RECVIF = 0x14 + sysIP_ONESBCAST = 0x17 + sysIP_BINDANY = 0x18 + sysIP_RECVTTL = 0x41 + sysIP_MINTTL = 0x42 + sysIP_DONTFRAG = 0x43 + sysIP_RECVTOS = 0x44 + + sysIP_MULTICAST_IF = 0x9 + sysIP_MULTICAST_TTL = 0xa + sysIP_MULTICAST_LOOP = 0xb + sysIP_ADD_MEMBERSHIP = 0xc + sysIP_DROP_MEMBERSHIP = 0xd + sysIP_MULTICAST_VIF = 0xe + sysIP_ADD_SOURCE_MEMBERSHIP = 0x46 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x47 + sysIP_BLOCK_SOURCE = 0x48 + sysIP_UNBLOCK_SOURCE = 0x49 + sysMCAST_JOIN_GROUP = 0x50 + sysMCAST_LEAVE_GROUP = 0x51 + sysMCAST_JOIN_SOURCE_GROUP = 0x52 + sysMCAST_LEAVE_SOURCE_GROUP = 0x53 + sysMCAST_BLOCK_SOURCE = 0x54 + sysMCAST_UNBLOCK_SOURCE = 0x55 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 +) + +type sockaddrStorage struct { + Len uint8 + Family uint8 + X__ss_pad1 [6]int8 + X__ss_align int64 + X__ss_pad2 [112]int8 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr [4]byte /* in_addr */ + Sourceaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sockaddrStorage + Source sockaddrStorage +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_freebsd_arm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_freebsd_arm.go new file mode 100644 index 0000000..4b10b7c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_freebsd_arm.go @@ -0,0 +1,95 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_freebsd.go + +package ipv4 + +const ( + sysIP_OPTIONS = 0x1 + sysIP_HDRINCL = 0x2 + sysIP_TOS = 0x3 + sysIP_TTL = 0x4 + sysIP_RECVOPTS = 0x5 + sysIP_RECVRETOPTS = 0x6 + sysIP_RECVDSTADDR = 0x7 + sysIP_SENDSRCADDR = 0x7 + sysIP_RETOPTS = 0x8 + sysIP_RECVIF = 0x14 + sysIP_ONESBCAST = 0x17 + sysIP_BINDANY = 0x18 + sysIP_RECVTTL = 0x41 + sysIP_MINTTL = 0x42 + sysIP_DONTFRAG = 0x43 + sysIP_RECVTOS = 0x44 + + sysIP_MULTICAST_IF = 0x9 + sysIP_MULTICAST_TTL = 0xa + sysIP_MULTICAST_LOOP = 0xb + sysIP_ADD_MEMBERSHIP = 0xc + sysIP_DROP_MEMBERSHIP = 0xd + sysIP_MULTICAST_VIF = 0xe + sysIP_ADD_SOURCE_MEMBERSHIP = 0x46 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x47 + sysIP_BLOCK_SOURCE = 0x48 + sysIP_UNBLOCK_SOURCE = 0x49 + sysMCAST_JOIN_GROUP = 0x50 + sysMCAST_LEAVE_GROUP = 0x51 + sysMCAST_JOIN_SOURCE_GROUP = 0x52 + sysMCAST_LEAVE_SOURCE_GROUP = 0x53 + sysMCAST_BLOCK_SOURCE = 0x54 + sysMCAST_UNBLOCK_SOURCE = 0x55 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 +) + +type sockaddrStorage struct { + Len uint8 + Family uint8 + X__ss_pad1 [6]int8 + X__ss_align int64 + X__ss_pad2 [112]int8 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr [4]byte /* in_addr */ + Sourceaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sockaddrStorage + Source sockaddrStorage +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_386.go new file mode 100644 index 0000000..c0260f0 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_386.go @@ -0,0 +1,148 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 + + sizeofICMPFilter = 0x4 + + sizeofSockFprog = 0x8 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type inetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type groupReq struct { + Interface uint32 + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpFilter struct { + Data uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [2]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_amd64.go new file mode 100644 index 0000000..9c967ea --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_amd64.go @@ -0,0 +1,150 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPFilter = 0x4 + + sizeofSockFprog = 0x10 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type inetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpFilter struct { + Data uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_arm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_arm.go new file mode 100644 index 0000000..c0260f0 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_arm.go @@ -0,0 +1,148 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 + + sizeofICMPFilter = 0x4 + + sizeofSockFprog = 0x8 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type inetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type groupReq struct { + Interface uint32 + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpFilter struct { + Data uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [2]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_arm64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_arm64.go new file mode 100644 index 0000000..9c967ea --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_arm64.go @@ -0,0 +1,150 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPFilter = 0x4 + + sizeofSockFprog = 0x10 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type inetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpFilter struct { + Data uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_mips.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_mips.go new file mode 100644 index 0000000..c0260f0 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_mips.go @@ -0,0 +1,148 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 + + sizeofICMPFilter = 0x4 + + sizeofSockFprog = 0x8 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type inetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type groupReq struct { + Interface uint32 + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpFilter struct { + Data uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [2]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_mips64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_mips64.go new file mode 100644 index 0000000..9c967ea --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_mips64.go @@ -0,0 +1,150 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPFilter = 0x4 + + sizeofSockFprog = 0x10 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type inetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpFilter struct { + Data uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_mips64le.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_mips64le.go new file mode 100644 index 0000000..9c967ea --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_mips64le.go @@ -0,0 +1,150 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPFilter = 0x4 + + sizeofSockFprog = 0x10 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type inetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpFilter struct { + Data uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_mipsle.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_mipsle.go new file mode 100644 index 0000000..c0260f0 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_mipsle.go @@ -0,0 +1,148 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 + + sizeofICMPFilter = 0x4 + + sizeofSockFprog = 0x8 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type inetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type groupReq struct { + Interface uint32 + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpFilter struct { + Data uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [2]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_ppc.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_ppc.go new file mode 100644 index 0000000..f65bd9a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_ppc.go @@ -0,0 +1,148 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 + + sizeofICMPFilter = 0x4 + + sizeofSockFprog = 0x8 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]uint8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type inetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type groupReq struct { + Interface uint32 + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpFilter struct { + Data uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [2]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64.go new file mode 100644 index 0000000..9c967ea --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64.go @@ -0,0 +1,150 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPFilter = 0x4 + + sizeofSockFprog = 0x10 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type inetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpFilter struct { + Data uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64le.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64le.go new file mode 100644 index 0000000..9c967ea --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64le.go @@ -0,0 +1,150 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPFilter = 0x4 + + sizeofSockFprog = 0x10 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type inetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpFilter struct { + Data uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_s390x.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_s390x.go new file mode 100644 index 0000000..9c967ea --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_linux_s390x.go @@ -0,0 +1,150 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPFilter = 0x4 + + sizeofSockFprog = 0x10 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type inetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpFilter struct { + Data uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_netbsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_netbsd.go new file mode 100644 index 0000000..fd3624d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_netbsd.go @@ -0,0 +1,30 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_netbsd.go + +package ipv4 + +const ( + sysIP_OPTIONS = 0x1 + sysIP_HDRINCL = 0x2 + sysIP_TOS = 0x3 + sysIP_TTL = 0x4 + sysIP_RECVOPTS = 0x5 + sysIP_RECVRETOPTS = 0x6 + sysIP_RECVDSTADDR = 0x7 + sysIP_RETOPTS = 0x8 + sysIP_RECVIF = 0x14 + sysIP_RECVTTL = 0x17 + + sysIP_MULTICAST_IF = 0x9 + sysIP_MULTICAST_TTL = 0xa + sysIP_MULTICAST_LOOP = 0xb + sysIP_ADD_MEMBERSHIP = 0xc + sysIP_DROP_MEMBERSHIP = 0xd + + sizeofIPMreq = 0x8 +) + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_openbsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_openbsd.go new file mode 100644 index 0000000..12f36be --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_openbsd.go @@ -0,0 +1,30 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_openbsd.go + +package ipv4 + +const ( + sysIP_OPTIONS = 0x1 + sysIP_HDRINCL = 0x2 + sysIP_TOS = 0x3 + sysIP_TTL = 0x4 + sysIP_RECVOPTS = 0x5 + sysIP_RECVRETOPTS = 0x6 + sysIP_RECVDSTADDR = 0x7 + sysIP_RETOPTS = 0x8 + sysIP_RECVIF = 0x1e + sysIP_RECVTTL = 0x1f + + sysIP_MULTICAST_IF = 0x9 + sysIP_MULTICAST_TTL = 0xa + sysIP_MULTICAST_LOOP = 0xb + sysIP_ADD_MEMBERSHIP = 0xc + sysIP_DROP_MEMBERSHIP = 0xd + + sizeofIPMreq = 0x8 +) + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_solaris.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_solaris.go new file mode 100644 index 0000000..0a3875c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv4/zsys_solaris.go @@ -0,0 +1,100 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_solaris.go + +package ipv4 + +const ( + sysIP_OPTIONS = 0x1 + sysIP_HDRINCL = 0x2 + sysIP_TOS = 0x3 + sysIP_TTL = 0x4 + sysIP_RECVOPTS = 0x5 + sysIP_RECVRETOPTS = 0x6 + sysIP_RECVDSTADDR = 0x7 + sysIP_RETOPTS = 0x8 + sysIP_RECVIF = 0x9 + sysIP_RECVSLLA = 0xa + sysIP_RECVTTL = 0xb + + sysIP_MULTICAST_IF = 0x10 + sysIP_MULTICAST_TTL = 0x11 + sysIP_MULTICAST_LOOP = 0x12 + sysIP_ADD_MEMBERSHIP = 0x13 + sysIP_DROP_MEMBERSHIP = 0x14 + sysIP_BLOCK_SOURCE = 0x15 + sysIP_UNBLOCK_SOURCE = 0x16 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x17 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x18 + sysIP_NEXTHOP = 0x19 + + sysIP_PKTINFO = 0x1a + sysIP_RECVPKTINFO = 0x1a + sysIP_DONTFRAG = 0x1b + + sysIP_BOUND_IF = 0x41 + sysIP_UNSPEC_SRC = 0x42 + sysIP_BROADCAST_TTL = 0x43 + sysIP_DHCPINIT_IF = 0x45 + + sysIP_REUSEADDR = 0x104 + sysIP_DONTROUTE = 0x105 + sysIP_BROADCAST = 0x106 + + sysMCAST_JOIN_GROUP = 0x29 + sysMCAST_LEAVE_GROUP = 0x2a + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_JOIN_SOURCE_GROUP = 0x2d + sysMCAST_LEAVE_SOURCE_GROUP = 0x2e + + sizeofSockaddrStorage = 0x100 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + + sizeofIPMreq = 0x8 + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x104 + sizeofGroupSourceReq = 0x204 +) + +type sockaddrStorage struct { + Family uint16 + X_ss_pad1 [6]int8 + X_ss_align float64 + X_ss_pad2 [240]int8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type inetPktinfo struct { + Ifindex uint32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqSource struct { + Multiaddr [4]byte /* in_addr */ + Sourceaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [256]byte +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [256]byte + Pad_cgo_1 [256]byte +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/batch.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/batch.go new file mode 100644 index 0000000..4f5fe68 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/batch.go @@ -0,0 +1,119 @@ +// 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. + +// +build go1.9 + +package ipv6 + +import ( + "net" + "runtime" + "syscall" + + "golang.org/x/net/internal/socket" +) + +// BUG(mikio): On Windows, the ReadBatch and WriteBatch methods of +// PacketConn are not implemented. + +// A Message represents an IO message. +// +// type Message struct { +// Buffers [][]byte +// OOB []byte +// Addr net.Addr +// N int +// NN int +// Flags int +// } +// +// The Buffers fields represents a list of contiguous buffers, which +// can be used for vectored IO, for example, putting a header and a +// payload in each slice. +// When writing, the Buffers field must contain at least one byte to +// write. +// When reading, the Buffers field will always contain a byte to read. +// +// The OOB field contains protocol-specific control or miscellaneous +// ancillary data known as out-of-band data. +// It can be nil when not required. +// +// The Addr field specifies a destination address when writing. +// It can be nil when the underlying protocol of the endpoint uses +// connection-oriented communication. +// After a successful read, it may contain the source address on the +// received packet. +// +// The N field indicates the number of bytes read or written from/to +// Buffers. +// +// The NN field indicates the number of bytes read or written from/to +// OOB. +// +// The Flags field contains protocol-specific information on the +// received message. +type Message = socket.Message + +// ReadBatch reads a batch of messages. +// +// The provided flags is a set of platform-dependent flags, such as +// syscall.MSG_PEEK. +// +// On a successful read it returns the number of messages received, up +// to len(ms). +// +// On Linux, a batch read will be optimized. +// On other platforms, this method will read only a single message. +func (c *payloadHandler) ReadBatch(ms []Message, flags int) (int, error) { + if !c.ok() { + return 0, syscall.EINVAL + } + switch runtime.GOOS { + case "linux": + n, err := c.RecvMsgs([]socket.Message(ms), flags) + if err != nil { + err = &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + return n, err + default: + n := 1 + err := c.RecvMsg(&ms[0], flags) + if err != nil { + n = 0 + err = &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + return n, err + } +} + +// WriteBatch writes a batch of messages. +// +// The provided flags is a set of platform-dependent flags, such as +// syscall.MSG_DONTROUTE. +// +// It returns the number of messages written on a successful write. +// +// On Linux, a batch write will be optimized. +// On other platforms, this method will write only a single message. +func (c *payloadHandler) WriteBatch(ms []Message, flags int) (int, error) { + if !c.ok() { + return 0, syscall.EINVAL + } + switch runtime.GOOS { + case "linux": + n, err := c.SendMsgs([]socket.Message(ms), flags) + if err != nil { + err = &net.OpError{Op: "write", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + return n, err + default: + n := 1 + err := c.SendMsg(&ms[0], flags) + if err != nil { + n = 0 + err = &net.OpError{Op: "write", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + return n, err + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/bpf_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/bpf_test.go new file mode 100644 index 0000000..8253e1f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/bpf_test.go @@ -0,0 +1,96 @@ +// 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 ipv6_test + +import ( + "net" + "runtime" + "testing" + "time" + + "golang.org/x/net/bpf" + "golang.org/x/net/ipv6" +) + +func TestBPF(t *testing.T) { + if runtime.GOOS != "linux" { + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + + l, err := net.ListenPacket("udp6", "[::1]:0") + if err != nil { + t.Fatal(err) + } + defer l.Close() + + p := ipv6.NewPacketConn(l) + + // This filter accepts UDP packets whose first payload byte is + // even. + prog, err := bpf.Assemble([]bpf.Instruction{ + // Load the first byte of the payload (skipping UDP header). + bpf.LoadAbsolute{Off: 8, Size: 1}, + // Select LSB of the byte. + bpf.ALUOpConstant{Op: bpf.ALUOpAnd, Val: 1}, + // Byte is even? + bpf.JumpIf{Cond: bpf.JumpEqual, Val: 0, SkipFalse: 1}, + // Accept. + bpf.RetConstant{Val: 4096}, + // Ignore. + bpf.RetConstant{Val: 0}, + }) + if err != nil { + t.Fatalf("compiling BPF: %s", err) + } + + if err = p.SetBPF(prog); err != nil { + t.Fatalf("attaching filter to Conn: %s", err) + } + + s, err := net.Dial("udp6", l.LocalAddr().String()) + if err != nil { + t.Fatal(err) + } + defer s.Close() + go func() { + for i := byte(0); i < 10; i++ { + s.Write([]byte{i}) + } + }() + + l.SetDeadline(time.Now().Add(2 * time.Second)) + seen := make([]bool, 5) + for { + var b [512]byte + n, _, err := l.ReadFrom(b[:]) + if err != nil { + t.Fatalf("reading from listener: %s", err) + } + if n != 1 { + t.Fatalf("unexpected packet length, want 1, got %d", n) + } + if b[0] >= 10 { + t.Fatalf("unexpected byte, want 0-9, got %d", b[0]) + } + if b[0]%2 != 0 { + t.Fatalf("got odd byte %d, wanted only even bytes", b[0]) + } + seen[b[0]/2] = true + + seenAll := true + for _, v := range seen { + if !v { + seenAll = false + break + } + } + if seenAll { + break + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/control.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/control.go new file mode 100644 index 0000000..2da6444 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/control.go @@ -0,0 +1,187 @@ +// 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 ipv6 + +import ( + "fmt" + "net" + "sync" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +// Note that RFC 3542 obsoletes RFC 2292 but OS X Snow Leopard and the +// former still support RFC 2292 only. Please be aware that almost +// all protocol implementations prohibit using a combination of RFC +// 2292 and RFC 3542 for some practical reasons. + +type rawOpt struct { + sync.RWMutex + cflags ControlFlags +} + +func (c *rawOpt) set(f ControlFlags) { c.cflags |= f } +func (c *rawOpt) clear(f ControlFlags) { c.cflags &^= f } +func (c *rawOpt) isset(f ControlFlags) bool { return c.cflags&f != 0 } + +// A ControlFlags represents per packet basis IP-level socket option +// control flags. +type ControlFlags uint + +const ( + FlagTrafficClass ControlFlags = 1 << iota // pass the traffic class on the received packet + FlagHopLimit // pass the hop limit on the received packet + FlagSrc // pass the source address on the received packet + FlagDst // pass the destination address on the received packet + FlagInterface // pass the interface index on the received packet + FlagPathMTU // pass the path MTU on the received packet path +) + +const flagPacketInfo = FlagDst | FlagInterface + +// A ControlMessage represents per packet basis IP-level socket +// options. +type ControlMessage struct { + // Receiving socket options: SetControlMessage allows to + // receive the options from the protocol stack using ReadFrom + // method of PacketConn. + // + // Specifying socket options: ControlMessage for WriteTo + // method of PacketConn allows to send the options to the + // protocol stack. + // + TrafficClass int // traffic class, must be 1 <= value <= 255 when specifying + HopLimit int // hop limit, must be 1 <= value <= 255 when specifying + Src net.IP // source address, specifying only + Dst net.IP // destination address, receiving only + IfIndex int // interface index, must be 1 <= value when specifying + NextHop net.IP // next hop address, specifying only + MTU int // path MTU, receiving only +} + +func (cm *ControlMessage) String() string { + if cm == nil { + return "" + } + return fmt.Sprintf("tclass=%#x hoplim=%d src=%v dst=%v ifindex=%d nexthop=%v mtu=%d", cm.TrafficClass, cm.HopLimit, cm.Src, cm.Dst, cm.IfIndex, cm.NextHop, cm.MTU) +} + +// Marshal returns the binary encoding of cm. +func (cm *ControlMessage) Marshal() []byte { + if cm == nil { + return nil + } + var l int + tclass := false + if ctlOpts[ctlTrafficClass].name > 0 && cm.TrafficClass > 0 { + tclass = true + l += socket.ControlMessageSpace(ctlOpts[ctlTrafficClass].length) + } + hoplimit := false + if ctlOpts[ctlHopLimit].name > 0 && cm.HopLimit > 0 { + hoplimit = true + l += socket.ControlMessageSpace(ctlOpts[ctlHopLimit].length) + } + pktinfo := false + if ctlOpts[ctlPacketInfo].name > 0 && (cm.Src.To16() != nil && cm.Src.To4() == nil || cm.IfIndex > 0) { + pktinfo = true + l += socket.ControlMessageSpace(ctlOpts[ctlPacketInfo].length) + } + nexthop := false + if ctlOpts[ctlNextHop].name > 0 && cm.NextHop.To16() != nil && cm.NextHop.To4() == nil { + nexthop = true + l += socket.ControlMessageSpace(ctlOpts[ctlNextHop].length) + } + var b []byte + if l > 0 { + b = make([]byte, l) + bb := b + if tclass { + bb = ctlOpts[ctlTrafficClass].marshal(bb, cm) + } + if hoplimit { + bb = ctlOpts[ctlHopLimit].marshal(bb, cm) + } + if pktinfo { + bb = ctlOpts[ctlPacketInfo].marshal(bb, cm) + } + if nexthop { + bb = ctlOpts[ctlNextHop].marshal(bb, cm) + } + } + return b +} + +// Parse parses b as a control message and stores the result in cm. +func (cm *ControlMessage) Parse(b []byte) error { + ms, err := socket.ControlMessage(b).Parse() + if err != nil { + return err + } + for _, m := range ms { + lvl, typ, l, err := m.ParseHeader() + if err != nil { + return err + } + if lvl != iana.ProtocolIPv6 { + continue + } + switch { + case typ == ctlOpts[ctlTrafficClass].name && l >= ctlOpts[ctlTrafficClass].length: + ctlOpts[ctlTrafficClass].parse(cm, m.Data(l)) + case typ == ctlOpts[ctlHopLimit].name && l >= ctlOpts[ctlHopLimit].length: + ctlOpts[ctlHopLimit].parse(cm, m.Data(l)) + case typ == ctlOpts[ctlPacketInfo].name && l >= ctlOpts[ctlPacketInfo].length: + ctlOpts[ctlPacketInfo].parse(cm, m.Data(l)) + case typ == ctlOpts[ctlPathMTU].name && l >= ctlOpts[ctlPathMTU].length: + ctlOpts[ctlPathMTU].parse(cm, m.Data(l)) + } + } + return nil +} + +// NewControlMessage returns a new control message. +// +// The returned message is large enough for options specified by cf. +func NewControlMessage(cf ControlFlags) []byte { + opt := rawOpt{cflags: cf} + var l int + if opt.isset(FlagTrafficClass) && ctlOpts[ctlTrafficClass].name > 0 { + l += socket.ControlMessageSpace(ctlOpts[ctlTrafficClass].length) + } + if opt.isset(FlagHopLimit) && ctlOpts[ctlHopLimit].name > 0 { + l += socket.ControlMessageSpace(ctlOpts[ctlHopLimit].length) + } + if opt.isset(flagPacketInfo) && ctlOpts[ctlPacketInfo].name > 0 { + l += socket.ControlMessageSpace(ctlOpts[ctlPacketInfo].length) + } + if opt.isset(FlagPathMTU) && ctlOpts[ctlPathMTU].name > 0 { + l += socket.ControlMessageSpace(ctlOpts[ctlPathMTU].length) + } + var b []byte + if l > 0 { + b = make([]byte, l) + } + return b +} + +// Ancillary data socket options +const ( + ctlTrafficClass = iota // header field + ctlHopLimit // header field + ctlPacketInfo // inbound or outbound packet path + ctlNextHop // nexthop + ctlPathMTU // path mtu + ctlMax +) + +// A ctlOpt represents a binding for ancillary data socket option. +type ctlOpt struct { + name int // option name, must be equal or greater than 1 + length int // option length + marshal func([]byte, *ControlMessage) []byte + parse func(*ControlMessage, []byte) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/control_rfc2292_unix.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/control_rfc2292_unix.go new file mode 100644 index 0000000..9fd9eb1 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/control_rfc2292_unix.go @@ -0,0 +1,48 @@ +// 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. + +// +build darwin + +package ipv6 + +import ( + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +func marshal2292HopLimit(b []byte, cm *ControlMessage) []byte { + m := socket.ControlMessage(b) + m.MarshalHeader(iana.ProtocolIPv6, sysIPV6_2292HOPLIMIT, 4) + if cm != nil { + socket.NativeEndian.PutUint32(m.Data(4), uint32(cm.HopLimit)) + } + return m.Next(4) +} + +func marshal2292PacketInfo(b []byte, cm *ControlMessage) []byte { + m := socket.ControlMessage(b) + m.MarshalHeader(iana.ProtocolIPv6, sysIPV6_2292PKTINFO, sizeofInet6Pktinfo) + if cm != nil { + pi := (*inet6Pktinfo)(unsafe.Pointer(&m.Data(sizeofInet6Pktinfo)[0])) + if ip := cm.Src.To16(); ip != nil && ip.To4() == nil { + copy(pi.Addr[:], ip) + } + if cm.IfIndex > 0 { + pi.setIfindex(cm.IfIndex) + } + } + return m.Next(sizeofInet6Pktinfo) +} + +func marshal2292NextHop(b []byte, cm *ControlMessage) []byte { + m := socket.ControlMessage(b) + m.MarshalHeader(iana.ProtocolIPv6, sysIPV6_2292NEXTHOP, sizeofSockaddrInet6) + if cm != nil { + sa := (*sockaddrInet6)(unsafe.Pointer(&m.Data(sizeofSockaddrInet6)[0])) + sa.setSockaddr(cm.NextHop, cm.IfIndex) + } + return m.Next(sizeofSockaddrInet6) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/control_rfc3542_unix.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/control_rfc3542_unix.go new file mode 100644 index 0000000..eec529c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/control_rfc3542_unix.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. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +package ipv6 + +import ( + "net" + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +func marshalTrafficClass(b []byte, cm *ControlMessage) []byte { + m := socket.ControlMessage(b) + m.MarshalHeader(iana.ProtocolIPv6, sysIPV6_TCLASS, 4) + if cm != nil { + socket.NativeEndian.PutUint32(m.Data(4), uint32(cm.TrafficClass)) + } + return m.Next(4) +} + +func parseTrafficClass(cm *ControlMessage, b []byte) { + cm.TrafficClass = int(socket.NativeEndian.Uint32(b[:4])) +} + +func marshalHopLimit(b []byte, cm *ControlMessage) []byte { + m := socket.ControlMessage(b) + m.MarshalHeader(iana.ProtocolIPv6, sysIPV6_HOPLIMIT, 4) + if cm != nil { + socket.NativeEndian.PutUint32(m.Data(4), uint32(cm.HopLimit)) + } + return m.Next(4) +} + +func parseHopLimit(cm *ControlMessage, b []byte) { + cm.HopLimit = int(socket.NativeEndian.Uint32(b[:4])) +} + +func marshalPacketInfo(b []byte, cm *ControlMessage) []byte { + m := socket.ControlMessage(b) + m.MarshalHeader(iana.ProtocolIPv6, sysIPV6_PKTINFO, sizeofInet6Pktinfo) + if cm != nil { + pi := (*inet6Pktinfo)(unsafe.Pointer(&m.Data(sizeofInet6Pktinfo)[0])) + if ip := cm.Src.To16(); ip != nil && ip.To4() == nil { + copy(pi.Addr[:], ip) + } + if cm.IfIndex > 0 { + pi.setIfindex(cm.IfIndex) + } + } + return m.Next(sizeofInet6Pktinfo) +} + +func parsePacketInfo(cm *ControlMessage, b []byte) { + pi := (*inet6Pktinfo)(unsafe.Pointer(&b[0])) + if len(cm.Dst) < net.IPv6len { + cm.Dst = make(net.IP, net.IPv6len) + } + copy(cm.Dst, pi.Addr[:]) + cm.IfIndex = int(pi.Ifindex) +} + +func marshalNextHop(b []byte, cm *ControlMessage) []byte { + m := socket.ControlMessage(b) + m.MarshalHeader(iana.ProtocolIPv6, sysIPV6_NEXTHOP, sizeofSockaddrInet6) + if cm != nil { + sa := (*sockaddrInet6)(unsafe.Pointer(&m.Data(sizeofSockaddrInet6)[0])) + sa.setSockaddr(cm.NextHop, cm.IfIndex) + } + return m.Next(sizeofSockaddrInet6) +} + +func parseNextHop(cm *ControlMessage, b []byte) { +} + +func marshalPathMTU(b []byte, cm *ControlMessage) []byte { + m := socket.ControlMessage(b) + m.MarshalHeader(iana.ProtocolIPv6, sysIPV6_PATHMTU, sizeofIPv6Mtuinfo) + return m.Next(sizeofIPv6Mtuinfo) +} + +func parsePathMTU(cm *ControlMessage, b []byte) { + mi := (*ipv6Mtuinfo)(unsafe.Pointer(&b[0])) + if len(cm.Dst) < net.IPv6len { + cm.Dst = make(net.IP, net.IPv6len) + } + copy(cm.Dst, mi.Addr.Addr[:]) + cm.IfIndex = int(mi.Addr.Scope_id) + cm.MTU = int(mi.Mtu) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/control_stub.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/control_stub.go new file mode 100644 index 0000000..a045f28 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/control_stub.go @@ -0,0 +1,13 @@ +// 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. + +// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows + +package ipv6 + +import "golang.org/x/net/internal/socket" + +func setControlMessage(c *socket.Conn, opt *rawOpt, cf ControlFlags, on bool) error { + return errOpNoSupport +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/control_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/control_test.go new file mode 100644 index 0000000..c186ca9 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/control_test.go @@ -0,0 +1,21 @@ +// 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 ipv6_test + +import ( + "testing" + + "golang.org/x/net/ipv6" +) + +func TestControlMessageParseWithFuzz(t *testing.T) { + var cm ipv6.ControlMessage + for _, fuzz := range []string{ + "\f\x00\x00\x00)\x00\x00\x00.\x00\x00\x00", + "\f\x00\x00\x00)\x00\x00\x00,\x00\x00\x00", + } { + cm.Parse([]byte(fuzz)) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/control_unix.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/control_unix.go new file mode 100644 index 0000000..6651506 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/control_unix.go @@ -0,0 +1,55 @@ +// 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +package ipv6 + +import "golang.org/x/net/internal/socket" + +func setControlMessage(c *socket.Conn, opt *rawOpt, cf ControlFlags, on bool) error { + opt.Lock() + defer opt.Unlock() + if so, ok := sockOpts[ssoReceiveTrafficClass]; ok && cf&FlagTrafficClass != 0 { + if err := so.SetInt(c, boolint(on)); err != nil { + return err + } + if on { + opt.set(FlagTrafficClass) + } else { + opt.clear(FlagTrafficClass) + } + } + if so, ok := sockOpts[ssoReceiveHopLimit]; ok && cf&FlagHopLimit != 0 { + if err := so.SetInt(c, boolint(on)); err != nil { + return err + } + if on { + opt.set(FlagHopLimit) + } else { + opt.clear(FlagHopLimit) + } + } + if so, ok := sockOpts[ssoReceivePacketInfo]; ok && cf&flagPacketInfo != 0 { + if err := so.SetInt(c, boolint(on)); err != nil { + return err + } + if on { + opt.set(cf & flagPacketInfo) + } else { + opt.clear(cf & flagPacketInfo) + } + } + if so, ok := sockOpts[ssoReceivePathMTU]; ok && cf&FlagPathMTU != 0 { + if err := so.SetInt(c, boolint(on)); err != nil { + return err + } + if on { + opt.set(FlagPathMTU) + } else { + opt.clear(FlagPathMTU) + } + } + return nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/control_windows.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/control_windows.go new file mode 100644 index 0000000..ef2563b --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/control_windows.go @@ -0,0 +1,16 @@ +// 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 ipv6 + +import ( + "syscall" + + "golang.org/x/net/internal/socket" +) + +func setControlMessage(c *socket.Conn, opt *rawOpt, cf ControlFlags, on bool) error { + // TODO(mikio): implement this + return syscall.EWINDOWS +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/defs_darwin.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/defs_darwin.go new file mode 100644 index 0000000..55ddc11 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/defs_darwin.go @@ -0,0 +1,112 @@ +// 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. + +// +build ignore + +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package ipv6 + +/* +#define __APPLE_USE_RFC_3542 +#include +#include +*/ +import "C" + +const ( + sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS + sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF + sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS + sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP + sysIPV6_JOIN_GROUP = C.IPV6_JOIN_GROUP + sysIPV6_LEAVE_GROUP = C.IPV6_LEAVE_GROUP + + sysIPV6_PORTRANGE = C.IPV6_PORTRANGE + sysICMP6_FILTER = C.ICMP6_FILTER + sysIPV6_2292PKTINFO = C.IPV6_2292PKTINFO + sysIPV6_2292HOPLIMIT = C.IPV6_2292HOPLIMIT + sysIPV6_2292NEXTHOP = C.IPV6_2292NEXTHOP + sysIPV6_2292HOPOPTS = C.IPV6_2292HOPOPTS + sysIPV6_2292DSTOPTS = C.IPV6_2292DSTOPTS + sysIPV6_2292RTHDR = C.IPV6_2292RTHDR + + sysIPV6_2292PKTOPTIONS = C.IPV6_2292PKTOPTIONS + + sysIPV6_CHECKSUM = C.IPV6_CHECKSUM + sysIPV6_V6ONLY = C.IPV6_V6ONLY + + sysIPV6_IPSEC_POLICY = C.IPV6_IPSEC_POLICY + + sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS + sysIPV6_TCLASS = C.IPV6_TCLASS + + sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS + + sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO + + sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT + sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR + sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS + sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS + + sysIPV6_USE_MIN_MTU = C.IPV6_USE_MIN_MTU + sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU + + sysIPV6_PATHMTU = C.IPV6_PATHMTU + + sysIPV6_PKTINFO = C.IPV6_PKTINFO + sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT + sysIPV6_NEXTHOP = C.IPV6_NEXTHOP + sysIPV6_HOPOPTS = C.IPV6_HOPOPTS + sysIPV6_DSTOPTS = C.IPV6_DSTOPTS + sysIPV6_RTHDR = C.IPV6_RTHDR + + sysIPV6_AUTOFLOWLABEL = C.IPV6_AUTOFLOWLABEL + + sysIPV6_DONTFRAG = C.IPV6_DONTFRAG + + sysIPV6_PREFER_TEMPADDR = C.IPV6_PREFER_TEMPADDR + + sysIPV6_MSFILTER = C.IPV6_MSFILTER + sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP + sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP + sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP + sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP + sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE + sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE + + sysIPV6_BOUND_IF = C.IPV6_BOUND_IF + + sysIPV6_PORTRANGE_DEFAULT = C.IPV6_PORTRANGE_DEFAULT + sysIPV6_PORTRANGE_HIGH = C.IPV6_PORTRANGE_HIGH + sysIPV6_PORTRANGE_LOW = C.IPV6_PORTRANGE_LOW + + sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + sizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + sizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo + + sizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + sizeofGroupReq = C.sizeof_struct_group_req + sizeofGroupSourceReq = C.sizeof_struct_group_source_req + + sizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +type sockaddrStorage C.struct_sockaddr_storage + +type sockaddrInet6 C.struct_sockaddr_in6 + +type inet6Pktinfo C.struct_in6_pktinfo + +type ipv6Mtuinfo C.struct_ip6_mtuinfo + +type ipv6Mreq C.struct_ipv6_mreq + +type icmpv6Filter C.struct_icmp6_filter + +type groupReq C.struct_group_req + +type groupSourceReq C.struct_group_source_req diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/defs_dragonfly.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/defs_dragonfly.go new file mode 100644 index 0000000..a4c383a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/defs_dragonfly.go @@ -0,0 +1,84 @@ +// 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. + +// +build ignore + +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package ipv6 + +/* +#include +#include + +#include +#include +*/ +import "C" + +const ( + sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS + sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF + sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS + sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP + sysIPV6_JOIN_GROUP = C.IPV6_JOIN_GROUP + sysIPV6_LEAVE_GROUP = C.IPV6_LEAVE_GROUP + sysIPV6_PORTRANGE = C.IPV6_PORTRANGE + sysICMP6_FILTER = C.ICMP6_FILTER + + sysIPV6_CHECKSUM = C.IPV6_CHECKSUM + sysIPV6_V6ONLY = C.IPV6_V6ONLY + + sysIPV6_IPSEC_POLICY = C.IPV6_IPSEC_POLICY + + sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS + sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO + sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT + sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR + sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS + sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS + + sysIPV6_USE_MIN_MTU = C.IPV6_USE_MIN_MTU + sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU + + sysIPV6_PATHMTU = C.IPV6_PATHMTU + + sysIPV6_PKTINFO = C.IPV6_PKTINFO + sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT + sysIPV6_NEXTHOP = C.IPV6_NEXTHOP + sysIPV6_HOPOPTS = C.IPV6_HOPOPTS + sysIPV6_DSTOPTS = C.IPV6_DSTOPTS + sysIPV6_RTHDR = C.IPV6_RTHDR + + sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS + + sysIPV6_AUTOFLOWLABEL = C.IPV6_AUTOFLOWLABEL + + sysIPV6_TCLASS = C.IPV6_TCLASS + sysIPV6_DONTFRAG = C.IPV6_DONTFRAG + + sysIPV6_PREFER_TEMPADDR = C.IPV6_PREFER_TEMPADDR + + sysIPV6_PORTRANGE_DEFAULT = C.IPV6_PORTRANGE_DEFAULT + sysIPV6_PORTRANGE_HIGH = C.IPV6_PORTRANGE_HIGH + sysIPV6_PORTRANGE_LOW = C.IPV6_PORTRANGE_LOW + + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + sizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + sizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo + + sizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + + sizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +type sockaddrInet6 C.struct_sockaddr_in6 + +type inet6Pktinfo C.struct_in6_pktinfo + +type ipv6Mtuinfo C.struct_ip6_mtuinfo + +type ipv6Mreq C.struct_ipv6_mreq + +type icmpv6Filter C.struct_icmp6_filter diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/defs_freebsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/defs_freebsd.go new file mode 100644 index 0000000..53e6253 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/defs_freebsd.go @@ -0,0 +1,105 @@ +// 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. + +// +build ignore + +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package ipv6 + +/* +#include +#include + +#include +#include +*/ +import "C" + +const ( + sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS + sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF + sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS + sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP + sysIPV6_JOIN_GROUP = C.IPV6_JOIN_GROUP + sysIPV6_LEAVE_GROUP = C.IPV6_LEAVE_GROUP + sysIPV6_PORTRANGE = C.IPV6_PORTRANGE + sysICMP6_FILTER = C.ICMP6_FILTER + + sysIPV6_CHECKSUM = C.IPV6_CHECKSUM + sysIPV6_V6ONLY = C.IPV6_V6ONLY + + sysIPV6_IPSEC_POLICY = C.IPV6_IPSEC_POLICY + + sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS + + sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO + sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT + sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR + sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS + sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS + + sysIPV6_USE_MIN_MTU = C.IPV6_USE_MIN_MTU + sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU + + sysIPV6_PATHMTU = C.IPV6_PATHMTU + + sysIPV6_PKTINFO = C.IPV6_PKTINFO + sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT + sysIPV6_NEXTHOP = C.IPV6_NEXTHOP + sysIPV6_HOPOPTS = C.IPV6_HOPOPTS + sysIPV6_DSTOPTS = C.IPV6_DSTOPTS + sysIPV6_RTHDR = C.IPV6_RTHDR + + sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS + + sysIPV6_AUTOFLOWLABEL = C.IPV6_AUTOFLOWLABEL + + sysIPV6_TCLASS = C.IPV6_TCLASS + sysIPV6_DONTFRAG = C.IPV6_DONTFRAG + + sysIPV6_PREFER_TEMPADDR = C.IPV6_PREFER_TEMPADDR + + sysIPV6_BINDANY = C.IPV6_BINDANY + + sysIPV6_MSFILTER = C.IPV6_MSFILTER + + sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP + sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP + sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP + sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP + sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE + sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE + + sysIPV6_PORTRANGE_DEFAULT = C.IPV6_PORTRANGE_DEFAULT + sysIPV6_PORTRANGE_HIGH = C.IPV6_PORTRANGE_HIGH + sysIPV6_PORTRANGE_LOW = C.IPV6_PORTRANGE_LOW + + sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + sizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + sizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo + + sizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + sizeofGroupReq = C.sizeof_struct_group_req + sizeofGroupSourceReq = C.sizeof_struct_group_source_req + + sizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +type sockaddrStorage C.struct_sockaddr_storage + +type sockaddrInet6 C.struct_sockaddr_in6 + +type inet6Pktinfo C.struct_in6_pktinfo + +type ipv6Mtuinfo C.struct_ip6_mtuinfo + +type ipv6Mreq C.struct_ipv6_mreq + +type groupReq C.struct_group_req + +type groupSourceReq C.struct_group_source_req + +type icmpv6Filter C.struct_icmp6_filter diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/defs_linux.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/defs_linux.go new file mode 100644 index 0000000..3308cb2 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/defs_linux.go @@ -0,0 +1,147 @@ +// 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. + +// +build ignore + +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package ipv6 + +/* +#include +#include +#include +#include +#include +#include +*/ +import "C" + +const ( + sysIPV6_ADDRFORM = C.IPV6_ADDRFORM + sysIPV6_2292PKTINFO = C.IPV6_2292PKTINFO + sysIPV6_2292HOPOPTS = C.IPV6_2292HOPOPTS + sysIPV6_2292DSTOPTS = C.IPV6_2292DSTOPTS + sysIPV6_2292RTHDR = C.IPV6_2292RTHDR + sysIPV6_2292PKTOPTIONS = C.IPV6_2292PKTOPTIONS + sysIPV6_CHECKSUM = C.IPV6_CHECKSUM + sysIPV6_2292HOPLIMIT = C.IPV6_2292HOPLIMIT + sysIPV6_NEXTHOP = C.IPV6_NEXTHOP + sysIPV6_FLOWINFO = C.IPV6_FLOWINFO + + sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS + sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF + sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS + sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP + sysIPV6_ADD_MEMBERSHIP = C.IPV6_ADD_MEMBERSHIP + sysIPV6_DROP_MEMBERSHIP = C.IPV6_DROP_MEMBERSHIP + sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP + sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP + sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP + sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP + sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE + sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE + sysMCAST_MSFILTER = C.MCAST_MSFILTER + sysIPV6_ROUTER_ALERT = C.IPV6_ROUTER_ALERT + sysIPV6_MTU_DISCOVER = C.IPV6_MTU_DISCOVER + sysIPV6_MTU = C.IPV6_MTU + sysIPV6_RECVERR = C.IPV6_RECVERR + sysIPV6_V6ONLY = C.IPV6_V6ONLY + sysIPV6_JOIN_ANYCAST = C.IPV6_JOIN_ANYCAST + sysIPV6_LEAVE_ANYCAST = C.IPV6_LEAVE_ANYCAST + + //sysIPV6_PMTUDISC_DONT = C.IPV6_PMTUDISC_DONT + //sysIPV6_PMTUDISC_WANT = C.IPV6_PMTUDISC_WANT + //sysIPV6_PMTUDISC_DO = C.IPV6_PMTUDISC_DO + //sysIPV6_PMTUDISC_PROBE = C.IPV6_PMTUDISC_PROBE + //sysIPV6_PMTUDISC_INTERFACE = C.IPV6_PMTUDISC_INTERFACE + //sysIPV6_PMTUDISC_OMIT = C.IPV6_PMTUDISC_OMIT + + sysIPV6_FLOWLABEL_MGR = C.IPV6_FLOWLABEL_MGR + sysIPV6_FLOWINFO_SEND = C.IPV6_FLOWINFO_SEND + + sysIPV6_IPSEC_POLICY = C.IPV6_IPSEC_POLICY + sysIPV6_XFRM_POLICY = C.IPV6_XFRM_POLICY + + sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO + sysIPV6_PKTINFO = C.IPV6_PKTINFO + sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT + sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT + sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS + sysIPV6_HOPOPTS = C.IPV6_HOPOPTS + sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS + sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR + sysIPV6_RTHDR = C.IPV6_RTHDR + sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS + sysIPV6_DSTOPTS = C.IPV6_DSTOPTS + sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU + sysIPV6_PATHMTU = C.IPV6_PATHMTU + sysIPV6_DONTFRAG = C.IPV6_DONTFRAG + + sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS + sysIPV6_TCLASS = C.IPV6_TCLASS + + sysIPV6_ADDR_PREFERENCES = C.IPV6_ADDR_PREFERENCES + + sysIPV6_PREFER_SRC_TMP = C.IPV6_PREFER_SRC_TMP + sysIPV6_PREFER_SRC_PUBLIC = C.IPV6_PREFER_SRC_PUBLIC + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = C.IPV6_PREFER_SRC_PUBTMP_DEFAULT + sysIPV6_PREFER_SRC_COA = C.IPV6_PREFER_SRC_COA + sysIPV6_PREFER_SRC_HOME = C.IPV6_PREFER_SRC_HOME + sysIPV6_PREFER_SRC_CGA = C.IPV6_PREFER_SRC_CGA + sysIPV6_PREFER_SRC_NONCGA = C.IPV6_PREFER_SRC_NONCGA + + sysIPV6_MINHOPCOUNT = C.IPV6_MINHOPCOUNT + + sysIPV6_ORIGDSTADDR = C.IPV6_ORIGDSTADDR + sysIPV6_RECVORIGDSTADDR = C.IPV6_RECVORIGDSTADDR + sysIPV6_TRANSPARENT = C.IPV6_TRANSPARENT + sysIPV6_UNICAST_IF = C.IPV6_UNICAST_IF + + sysICMPV6_FILTER = C.ICMPV6_FILTER + + sysICMPV6_FILTER_BLOCK = C.ICMPV6_FILTER_BLOCK + sysICMPV6_FILTER_PASS = C.ICMPV6_FILTER_PASS + sysICMPV6_FILTER_BLOCKOTHERS = C.ICMPV6_FILTER_BLOCKOTHERS + sysICMPV6_FILTER_PASSONLY = C.ICMPV6_FILTER_PASSONLY + + sysSOL_SOCKET = C.SOL_SOCKET + sysSO_ATTACH_FILTER = C.SO_ATTACH_FILTER + + sizeofKernelSockaddrStorage = C.sizeof_struct___kernel_sockaddr_storage + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + sizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + sizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo + sizeofIPv6FlowlabelReq = C.sizeof_struct_in6_flowlabel_req + + sizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + sizeofGroupReq = C.sizeof_struct_group_req + sizeofGroupSourceReq = C.sizeof_struct_group_source_req + + sizeofICMPv6Filter = C.sizeof_struct_icmp6_filter + + sizeofSockFprog = C.sizeof_struct_sock_fprog +) + +type kernelSockaddrStorage C.struct___kernel_sockaddr_storage + +type sockaddrInet6 C.struct_sockaddr_in6 + +type inet6Pktinfo C.struct_in6_pktinfo + +type ipv6Mtuinfo C.struct_ip6_mtuinfo + +type ipv6FlowlabelReq C.struct_in6_flowlabel_req + +type ipv6Mreq C.struct_ipv6_mreq + +type groupReq C.struct_group_req + +type groupSourceReq C.struct_group_source_req + +type icmpv6Filter C.struct_icmp6_filter + +type sockFProg C.struct_sock_fprog + +type sockFilter C.struct_sock_filter diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/defs_netbsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/defs_netbsd.go new file mode 100644 index 0000000..be9ceb9 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/defs_netbsd.go @@ -0,0 +1,80 @@ +// 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. + +// +build ignore + +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package ipv6 + +/* +#include +#include + +#include +#include +*/ +import "C" + +const ( + sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS + sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF + sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS + sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP + sysIPV6_JOIN_GROUP = C.IPV6_JOIN_GROUP + sysIPV6_LEAVE_GROUP = C.IPV6_LEAVE_GROUP + sysIPV6_PORTRANGE = C.IPV6_PORTRANGE + sysICMP6_FILTER = C.ICMP6_FILTER + + sysIPV6_CHECKSUM = C.IPV6_CHECKSUM + sysIPV6_V6ONLY = C.IPV6_V6ONLY + + sysIPV6_IPSEC_POLICY = C.IPV6_IPSEC_POLICY + + sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS + + sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO + sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT + sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR + sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS + sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS + + sysIPV6_USE_MIN_MTU = C.IPV6_USE_MIN_MTU + sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU + sysIPV6_PATHMTU = C.IPV6_PATHMTU + + sysIPV6_PKTINFO = C.IPV6_PKTINFO + sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT + sysIPV6_NEXTHOP = C.IPV6_NEXTHOP + sysIPV6_HOPOPTS = C.IPV6_HOPOPTS + sysIPV6_DSTOPTS = C.IPV6_DSTOPTS + sysIPV6_RTHDR = C.IPV6_RTHDR + + sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS + + sysIPV6_TCLASS = C.IPV6_TCLASS + sysIPV6_DONTFRAG = C.IPV6_DONTFRAG + + sysIPV6_PORTRANGE_DEFAULT = C.IPV6_PORTRANGE_DEFAULT + sysIPV6_PORTRANGE_HIGH = C.IPV6_PORTRANGE_HIGH + sysIPV6_PORTRANGE_LOW = C.IPV6_PORTRANGE_LOW + + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + sizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + sizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo + + sizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + + sizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +type sockaddrInet6 C.struct_sockaddr_in6 + +type inet6Pktinfo C.struct_in6_pktinfo + +type ipv6Mtuinfo C.struct_ip6_mtuinfo + +type ipv6Mreq C.struct_ipv6_mreq + +type icmpv6Filter C.struct_icmp6_filter diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/defs_openbsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/defs_openbsd.go new file mode 100644 index 0000000..177ddf8 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/defs_openbsd.go @@ -0,0 +1,89 @@ +// 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. + +// +build ignore + +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package ipv6 + +/* +#include +#include + +#include +#include +*/ +import "C" + +const ( + sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS + sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF + sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS + sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP + sysIPV6_JOIN_GROUP = C.IPV6_JOIN_GROUP + sysIPV6_LEAVE_GROUP = C.IPV6_LEAVE_GROUP + sysIPV6_PORTRANGE = C.IPV6_PORTRANGE + sysICMP6_FILTER = C.ICMP6_FILTER + + sysIPV6_CHECKSUM = C.IPV6_CHECKSUM + sysIPV6_V6ONLY = C.IPV6_V6ONLY + + sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS + + sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO + sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT + sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR + sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS + sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS + + sysIPV6_USE_MIN_MTU = C.IPV6_USE_MIN_MTU + sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU + + sysIPV6_PATHMTU = C.IPV6_PATHMTU + + sysIPV6_PKTINFO = C.IPV6_PKTINFO + sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT + sysIPV6_NEXTHOP = C.IPV6_NEXTHOP + sysIPV6_HOPOPTS = C.IPV6_HOPOPTS + sysIPV6_DSTOPTS = C.IPV6_DSTOPTS + sysIPV6_RTHDR = C.IPV6_RTHDR + + sysIPV6_AUTH_LEVEL = C.IPV6_AUTH_LEVEL + sysIPV6_ESP_TRANS_LEVEL = C.IPV6_ESP_TRANS_LEVEL + sysIPV6_ESP_NETWORK_LEVEL = C.IPV6_ESP_NETWORK_LEVEL + sysIPSEC6_OUTSA = C.IPSEC6_OUTSA + sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS + + sysIPV6_AUTOFLOWLABEL = C.IPV6_AUTOFLOWLABEL + sysIPV6_IPCOMP_LEVEL = C.IPV6_IPCOMP_LEVEL + + sysIPV6_TCLASS = C.IPV6_TCLASS + sysIPV6_DONTFRAG = C.IPV6_DONTFRAG + sysIPV6_PIPEX = C.IPV6_PIPEX + + sysIPV6_RTABLE = C.IPV6_RTABLE + + sysIPV6_PORTRANGE_DEFAULT = C.IPV6_PORTRANGE_DEFAULT + sysIPV6_PORTRANGE_HIGH = C.IPV6_PORTRANGE_HIGH + sysIPV6_PORTRANGE_LOW = C.IPV6_PORTRANGE_LOW + + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + sizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + sizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo + + sizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + + sizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +type sockaddrInet6 C.struct_sockaddr_in6 + +type inet6Pktinfo C.struct_in6_pktinfo + +type ipv6Mtuinfo C.struct_ip6_mtuinfo + +type ipv6Mreq C.struct_ipv6_mreq + +type icmpv6Filter C.struct_icmp6_filter diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/defs_solaris.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/defs_solaris.go new file mode 100644 index 0000000..0f8ce2b --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/defs_solaris.go @@ -0,0 +1,114 @@ +// 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. + +// +build ignore + +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package ipv6 + +/* +#include + +#include +#include +*/ +import "C" + +const ( + sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS + sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF + sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS + sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP + sysIPV6_JOIN_GROUP = C.IPV6_JOIN_GROUP + sysIPV6_LEAVE_GROUP = C.IPV6_LEAVE_GROUP + + sysIPV6_PKTINFO = C.IPV6_PKTINFO + + sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT + sysIPV6_NEXTHOP = C.IPV6_NEXTHOP + sysIPV6_HOPOPTS = C.IPV6_HOPOPTS + sysIPV6_DSTOPTS = C.IPV6_DSTOPTS + + sysIPV6_RTHDR = C.IPV6_RTHDR + sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS + + sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO + sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT + sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS + + sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR + + sysIPV6_RECVRTHDRDSTOPTS = C.IPV6_RECVRTHDRDSTOPTS + + sysIPV6_CHECKSUM = C.IPV6_CHECKSUM + sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS + sysIPV6_USE_MIN_MTU = C.IPV6_USE_MIN_MTU + sysIPV6_DONTFRAG = C.IPV6_DONTFRAG + sysIPV6_SEC_OPT = C.IPV6_SEC_OPT + sysIPV6_SRC_PREFERENCES = C.IPV6_SRC_PREFERENCES + sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU + sysIPV6_PATHMTU = C.IPV6_PATHMTU + sysIPV6_TCLASS = C.IPV6_TCLASS + sysIPV6_V6ONLY = C.IPV6_V6ONLY + + sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS + + sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP + sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP + sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE + sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE + sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP + sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP + + sysIPV6_PREFER_SRC_HOME = C.IPV6_PREFER_SRC_HOME + sysIPV6_PREFER_SRC_COA = C.IPV6_PREFER_SRC_COA + sysIPV6_PREFER_SRC_PUBLIC = C.IPV6_PREFER_SRC_PUBLIC + sysIPV6_PREFER_SRC_TMP = C.IPV6_PREFER_SRC_TMP + sysIPV6_PREFER_SRC_NONCGA = C.IPV6_PREFER_SRC_NONCGA + sysIPV6_PREFER_SRC_CGA = C.IPV6_PREFER_SRC_CGA + + sysIPV6_PREFER_SRC_MIPMASK = C.IPV6_PREFER_SRC_MIPMASK + sysIPV6_PREFER_SRC_MIPDEFAULT = C.IPV6_PREFER_SRC_MIPDEFAULT + sysIPV6_PREFER_SRC_TMPMASK = C.IPV6_PREFER_SRC_TMPMASK + sysIPV6_PREFER_SRC_TMPDEFAULT = C.IPV6_PREFER_SRC_TMPDEFAULT + sysIPV6_PREFER_SRC_CGAMASK = C.IPV6_PREFER_SRC_CGAMASK + sysIPV6_PREFER_SRC_CGADEFAULT = C.IPV6_PREFER_SRC_CGADEFAULT + + sysIPV6_PREFER_SRC_MASK = C.IPV6_PREFER_SRC_MASK + + sysIPV6_PREFER_SRC_DEFAULT = C.IPV6_PREFER_SRC_DEFAULT + + sysIPV6_BOUND_IF = C.IPV6_BOUND_IF + sysIPV6_UNSPEC_SRC = C.IPV6_UNSPEC_SRC + + sysICMP6_FILTER = C.ICMP6_FILTER + + sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + sizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + sizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo + + sizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + sizeofGroupReq = C.sizeof_struct_group_req + sizeofGroupSourceReq = C.sizeof_struct_group_source_req + + sizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +type sockaddrStorage C.struct_sockaddr_storage + +type sockaddrInet6 C.struct_sockaddr_in6 + +type inet6Pktinfo C.struct_in6_pktinfo + +type ipv6Mtuinfo C.struct_ip6_mtuinfo + +type ipv6Mreq C.struct_ipv6_mreq + +type groupReq C.struct_group_req + +type groupSourceReq C.struct_group_source_req + +type icmpv6Filter C.struct_icmp6_filter diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/dgramopt.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/dgramopt.go new file mode 100644 index 0000000..703dafe --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/dgramopt.go @@ -0,0 +1,302 @@ +// 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 ipv6 + +import ( + "net" + "syscall" + + "golang.org/x/net/bpf" +) + +// MulticastHopLimit returns the hop limit field value for outgoing +// multicast packets. +func (c *dgramOpt) MulticastHopLimit() (int, error) { + if !c.ok() { + return 0, syscall.EINVAL + } + so, ok := sockOpts[ssoMulticastHopLimit] + if !ok { + return 0, errOpNoSupport + } + return so.GetInt(c.Conn) +} + +// SetMulticastHopLimit sets the hop limit field value for future +// outgoing multicast packets. +func (c *dgramOpt) SetMulticastHopLimit(hoplim int) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoMulticastHopLimit] + if !ok { + return errOpNoSupport + } + return so.SetInt(c.Conn, hoplim) +} + +// MulticastInterface returns the default interface for multicast +// packet transmissions. +func (c *dgramOpt) MulticastInterface() (*net.Interface, error) { + if !c.ok() { + return nil, syscall.EINVAL + } + so, ok := sockOpts[ssoMulticastInterface] + if !ok { + return nil, errOpNoSupport + } + return so.getMulticastInterface(c.Conn) +} + +// SetMulticastInterface sets the default interface for future +// multicast packet transmissions. +func (c *dgramOpt) SetMulticastInterface(ifi *net.Interface) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoMulticastInterface] + if !ok { + return errOpNoSupport + } + return so.setMulticastInterface(c.Conn, ifi) +} + +// MulticastLoopback reports whether transmitted multicast packets +// should be copied and send back to the originator. +func (c *dgramOpt) MulticastLoopback() (bool, error) { + if !c.ok() { + return false, syscall.EINVAL + } + so, ok := sockOpts[ssoMulticastLoopback] + if !ok { + return false, errOpNoSupport + } + on, err := so.GetInt(c.Conn) + if err != nil { + return false, err + } + return on == 1, nil +} + +// SetMulticastLoopback sets whether transmitted multicast packets +// should be copied and send back to the originator. +func (c *dgramOpt) SetMulticastLoopback(on bool) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoMulticastLoopback] + if !ok { + return errOpNoSupport + } + return so.SetInt(c.Conn, boolint(on)) +} + +// JoinGroup joins the group address group on the interface ifi. +// By default all sources that can cast data to group are accepted. +// It's possible to mute and unmute data transmission from a specific +// source by using ExcludeSourceSpecificGroup and +// IncludeSourceSpecificGroup. +// JoinGroup uses the system assigned multicast interface when ifi is +// nil, although this is not recommended because the assignment +// depends on platforms and sometimes it might require routing +// configuration. +func (c *dgramOpt) JoinGroup(ifi *net.Interface, group net.Addr) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoJoinGroup] + if !ok { + return errOpNoSupport + } + grp := netAddrToIP16(group) + if grp == nil { + return errMissingAddress + } + return so.setGroup(c.Conn, ifi, grp) +} + +// LeaveGroup leaves the group address group on the interface ifi +// regardless of whether the group is any-source group or +// source-specific group. +func (c *dgramOpt) LeaveGroup(ifi *net.Interface, group net.Addr) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoLeaveGroup] + if !ok { + return errOpNoSupport + } + grp := netAddrToIP16(group) + if grp == nil { + return errMissingAddress + } + return so.setGroup(c.Conn, ifi, grp) +} + +// JoinSourceSpecificGroup joins the source-specific group comprising +// group and source on the interface ifi. +// JoinSourceSpecificGroup uses the system assigned multicast +// interface when ifi is nil, although this is not recommended because +// the assignment depends on platforms and sometimes it might require +// routing configuration. +func (c *dgramOpt) JoinSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoJoinSourceGroup] + if !ok { + return errOpNoSupport + } + grp := netAddrToIP16(group) + if grp == nil { + return errMissingAddress + } + src := netAddrToIP16(source) + if src == nil { + return errMissingAddress + } + return so.setSourceGroup(c.Conn, ifi, grp, src) +} + +// LeaveSourceSpecificGroup leaves the source-specific group on the +// interface ifi. +func (c *dgramOpt) LeaveSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoLeaveSourceGroup] + if !ok { + return errOpNoSupport + } + grp := netAddrToIP16(group) + if grp == nil { + return errMissingAddress + } + src := netAddrToIP16(source) + if src == nil { + return errMissingAddress + } + return so.setSourceGroup(c.Conn, ifi, grp, src) +} + +// ExcludeSourceSpecificGroup excludes the source-specific group from +// the already joined any-source groups by JoinGroup on the interface +// ifi. +func (c *dgramOpt) ExcludeSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoBlockSourceGroup] + if !ok { + return errOpNoSupport + } + grp := netAddrToIP16(group) + if grp == nil { + return errMissingAddress + } + src := netAddrToIP16(source) + if src == nil { + return errMissingAddress + } + return so.setSourceGroup(c.Conn, ifi, grp, src) +} + +// IncludeSourceSpecificGroup includes the excluded source-specific +// group by ExcludeSourceSpecificGroup again on the interface ifi. +func (c *dgramOpt) IncludeSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoUnblockSourceGroup] + if !ok { + return errOpNoSupport + } + grp := netAddrToIP16(group) + if grp == nil { + return errMissingAddress + } + src := netAddrToIP16(source) + if src == nil { + return errMissingAddress + } + return so.setSourceGroup(c.Conn, ifi, grp, src) +} + +// Checksum reports whether the kernel will compute, store or verify a +// checksum for both incoming and outgoing packets. If on is true, it +// returns an offset in bytes into the data of where the checksum +// field is located. +func (c *dgramOpt) Checksum() (on bool, offset int, err error) { + if !c.ok() { + return false, 0, syscall.EINVAL + } + so, ok := sockOpts[ssoChecksum] + if !ok { + return false, 0, errOpNoSupport + } + offset, err = so.GetInt(c.Conn) + if err != nil { + return false, 0, err + } + if offset < 0 { + return false, 0, nil + } + return true, offset, nil +} + +// SetChecksum enables the kernel checksum processing. If on is ture, +// the offset should be an offset in bytes into the data of where the +// checksum field is located. +func (c *dgramOpt) SetChecksum(on bool, offset int) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoChecksum] + if !ok { + return errOpNoSupport + } + if !on { + offset = -1 + } + return so.SetInt(c.Conn, offset) +} + +// ICMPFilter returns an ICMP filter. +func (c *dgramOpt) ICMPFilter() (*ICMPFilter, error) { + if !c.ok() { + return nil, syscall.EINVAL + } + so, ok := sockOpts[ssoICMPFilter] + if !ok { + return nil, errOpNoSupport + } + return so.getICMPFilter(c.Conn) +} + +// SetICMPFilter deploys the ICMP filter. +func (c *dgramOpt) SetICMPFilter(f *ICMPFilter) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoICMPFilter] + if !ok { + return errOpNoSupport + } + return so.setICMPFilter(c.Conn, f) +} + +// SetBPF attaches a BPF program to the connection. +// +// Only supported on Linux. +func (c *dgramOpt) SetBPF(filter []bpf.RawInstruction) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoAttachFilter] + if !ok { + return errOpNoSupport + } + return so.setBPF(c.Conn, filter) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/doc.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/doc.go new file mode 100644 index 0000000..664a97d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/doc.go @@ -0,0 +1,243 @@ +// 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 ipv6 implements IP-level socket options for the Internet +// Protocol version 6. +// +// The package provides IP-level socket options that allow +// manipulation of IPv6 facilities. +// +// The IPv6 protocol is defined in RFC 8200. +// Socket interface extensions are defined in RFC 3493, RFC 3542 and +// RFC 3678. +// MLDv1 and MLDv2 are defined in RFC 2710 and RFC 3810. +// Source-specific multicast is defined in RFC 4607. +// +// On Darwin, this package requires OS X Mavericks version 10.9 or +// above, or equivalent. +// +// +// Unicasting +// +// The options for unicasting are available for net.TCPConn, +// net.UDPConn and net.IPConn which are created as network connections +// that use the IPv6 transport. When a single TCP connection carrying +// a data flow of multiple packets needs to indicate the flow is +// important, Conn is used to set the traffic class field on the IPv6 +// header for each packet. +// +// ln, err := net.Listen("tcp6", "[::]:1024") +// if err != nil { +// // error handling +// } +// defer ln.Close() +// for { +// c, err := ln.Accept() +// if err != nil { +// // error handling +// } +// go func(c net.Conn) { +// defer c.Close() +// +// The outgoing packets will be labeled DiffServ assured forwarding +// class 1 low drop precedence, known as AF11 packets. +// +// if err := ipv6.NewConn(c).SetTrafficClass(0x28); err != nil { +// // error handling +// } +// if _, err := c.Write(data); err != nil { +// // error handling +// } +// }(c) +// } +// +// +// Multicasting +// +// The options for multicasting are available for net.UDPConn and +// net.IPconn which are created as network connections that use the +// IPv6 transport. A few network facilities must be prepared before +// you begin multicasting, at a minimum joining network interfaces and +// multicast groups. +// +// en0, err := net.InterfaceByName("en0") +// if err != nil { +// // error handling +// } +// en1, err := net.InterfaceByIndex(911) +// if err != nil { +// // error handling +// } +// group := net.ParseIP("ff02::114") +// +// First, an application listens to an appropriate address with an +// appropriate service port. +// +// c, err := net.ListenPacket("udp6", "[::]:1024") +// if err != nil { +// // error handling +// } +// defer c.Close() +// +// Second, the application joins multicast groups, starts listening to +// the groups on the specified network interfaces. Note that the +// service port for transport layer protocol does not matter with this +// operation as joining groups affects only network and link layer +// protocols, such as IPv6 and Ethernet. +// +// p := ipv6.NewPacketConn(c) +// if err := p.JoinGroup(en0, &net.UDPAddr{IP: group}); err != nil { +// // error handling +// } +// if err := p.JoinGroup(en1, &net.UDPAddr{IP: group}); err != nil { +// // error handling +// } +// +// The application might set per packet control message transmissions +// between the protocol stack within the kernel. When the application +// needs a destination address on an incoming packet, +// SetControlMessage of PacketConn is used to enable control message +// transmissions. +// +// if err := p.SetControlMessage(ipv6.FlagDst, true); err != nil { +// // error handling +// } +// +// The application could identify whether the received packets are +// of interest by using the control message that contains the +// destination address of the received packet. +// +// b := make([]byte, 1500) +// for { +// n, rcm, src, err := p.ReadFrom(b) +// if err != nil { +// // error handling +// } +// if rcm.Dst.IsMulticast() { +// if rcm.Dst.Equal(group) { +// // joined group, do something +// } else { +// // unknown group, discard +// continue +// } +// } +// +// The application can also send both unicast and multicast packets. +// +// p.SetTrafficClass(0x0) +// p.SetHopLimit(16) +// if _, err := p.WriteTo(data[:n], nil, src); err != nil { +// // error handling +// } +// dst := &net.UDPAddr{IP: group, Port: 1024} +// wcm := ipv6.ControlMessage{TrafficClass: 0xe0, HopLimit: 1} +// for _, ifi := range []*net.Interface{en0, en1} { +// wcm.IfIndex = ifi.Index +// if _, err := p.WriteTo(data[:n], &wcm, dst); err != nil { +// // error handling +// } +// } +// } +// +// +// More multicasting +// +// An application that uses PacketConn may join multiple multicast +// groups. For example, a UDP listener with port 1024 might join two +// different groups across over two different network interfaces by +// using: +// +// c, err := net.ListenPacket("udp6", "[::]:1024") +// if err != nil { +// // error handling +// } +// defer c.Close() +// p := ipv6.NewPacketConn(c) +// if err := p.JoinGroup(en0, &net.UDPAddr{IP: net.ParseIP("ff02::1:114")}); err != nil { +// // error handling +// } +// if err := p.JoinGroup(en0, &net.UDPAddr{IP: net.ParseIP("ff02::2:114")}); err != nil { +// // error handling +// } +// if err := p.JoinGroup(en1, &net.UDPAddr{IP: net.ParseIP("ff02::2:114")}); err != nil { +// // error handling +// } +// +// It is possible for multiple UDP listeners that listen on the same +// UDP port to join the same multicast group. The net package will +// provide a socket that listens to a wildcard address with reusable +// UDP port when an appropriate multicast address prefix is passed to +// the net.ListenPacket or net.ListenUDP. +// +// c1, err := net.ListenPacket("udp6", "[ff02::]:1024") +// if err != nil { +// // error handling +// } +// defer c1.Close() +// c2, err := net.ListenPacket("udp6", "[ff02::]:1024") +// if err != nil { +// // error handling +// } +// defer c2.Close() +// p1 := ipv6.NewPacketConn(c1) +// if err := p1.JoinGroup(en0, &net.UDPAddr{IP: net.ParseIP("ff02::114")}); err != nil { +// // error handling +// } +// p2 := ipv6.NewPacketConn(c2) +// if err := p2.JoinGroup(en0, &net.UDPAddr{IP: net.ParseIP("ff02::114")}); err != nil { +// // error handling +// } +// +// Also it is possible for the application to leave or rejoin a +// multicast group on the network interface. +// +// if err := p.LeaveGroup(en0, &net.UDPAddr{IP: net.ParseIP("ff02::114")}); err != nil { +// // error handling +// } +// if err := p.JoinGroup(en0, &net.UDPAddr{IP: net.ParseIP("ff01::114")}); err != nil { +// // error handling +// } +// +// +// Source-specific multicasting +// +// An application that uses PacketConn on MLDv2 supported platform is +// able to join source-specific multicast groups. +// The application may use JoinSourceSpecificGroup and +// LeaveSourceSpecificGroup for the operation known as "include" mode, +// +// ssmgroup := net.UDPAddr{IP: net.ParseIP("ff32::8000:9")} +// ssmsource := net.UDPAddr{IP: net.ParseIP("fe80::cafe")} +// if err := p.JoinSourceSpecificGroup(en0, &ssmgroup, &ssmsource); err != nil { +// // error handling +// } +// if err := p.LeaveSourceSpecificGroup(en0, &ssmgroup, &ssmsource); err != nil { +// // error handling +// } +// +// or JoinGroup, ExcludeSourceSpecificGroup, +// IncludeSourceSpecificGroup and LeaveGroup for the operation known +// as "exclude" mode. +// +// exclsource := net.UDPAddr{IP: net.ParseIP("fe80::dead")} +// if err := p.JoinGroup(en0, &ssmgroup); err != nil { +// // error handling +// } +// if err := p.ExcludeSourceSpecificGroup(en0, &ssmgroup, &exclsource); err != nil { +// // error handling +// } +// if err := p.LeaveGroup(en0, &ssmgroup); err != nil { +// // error handling +// } +// +// Note that it depends on each platform implementation what happens +// when an application which runs on MLDv2 unsupported platform uses +// JoinSourceSpecificGroup and LeaveSourceSpecificGroup. +// In general the platform tries to fall back to conversations using +// MLDv1 and starts to listen to multicast traffic. +// In the fallback case, ExcludeSourceSpecificGroup and +// IncludeSourceSpecificGroup may return an error. +package ipv6 // import "golang.org/x/net/ipv6" + +// BUG(mikio): This package is not implemented on NaCl and Plan 9. diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/endpoint.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/endpoint.go new file mode 100644 index 0000000..0624c17 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/endpoint.go @@ -0,0 +1,128 @@ +// 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 ipv6 + +import ( + "net" + "syscall" + "time" + + "golang.org/x/net/internal/socket" +) + +// BUG(mikio): On Windows, the JoinSourceSpecificGroup, +// LeaveSourceSpecificGroup, ExcludeSourceSpecificGroup and +// IncludeSourceSpecificGroup methods of PacketConn are not +// implemented. + +// A Conn represents a network endpoint that uses IPv6 transport. +// It allows to set basic IP-level socket options such as traffic +// class and hop limit. +type Conn struct { + genericOpt +} + +type genericOpt struct { + *socket.Conn +} + +func (c *genericOpt) ok() bool { return c != nil && c.Conn != nil } + +// PathMTU returns a path MTU value for the destination associated +// with the endpoint. +func (c *Conn) PathMTU() (int, error) { + if !c.ok() { + return 0, syscall.EINVAL + } + so, ok := sockOpts[ssoPathMTU] + if !ok { + return 0, errOpNoSupport + } + _, mtu, err := so.getMTUInfo(c.Conn) + if err != nil { + return 0, err + } + return mtu, nil +} + +// NewConn returns a new Conn. +func NewConn(c net.Conn) *Conn { + cc, _ := socket.NewConn(c) + return &Conn{ + genericOpt: genericOpt{Conn: cc}, + } +} + +// A PacketConn represents a packet network endpoint that uses IPv6 +// transport. It is used to control several IP-level socket options +// including IPv6 header manipulation. It also provides datagram +// based network I/O methods specific to the IPv6 and higher layer +// protocols such as OSPF, GRE, and UDP. +type PacketConn struct { + genericOpt + dgramOpt + payloadHandler +} + +type dgramOpt struct { + *socket.Conn +} + +func (c *dgramOpt) ok() bool { return c != nil && c.Conn != nil } + +// SetControlMessage allows to receive the per packet basis IP-level +// socket options. +func (c *PacketConn) SetControlMessage(cf ControlFlags, on bool) error { + if !c.payloadHandler.ok() { + return syscall.EINVAL + } + return setControlMessage(c.dgramOpt.Conn, &c.payloadHandler.rawOpt, cf, on) +} + +// SetDeadline sets the read and write deadlines associated with the +// endpoint. +func (c *PacketConn) SetDeadline(t time.Time) error { + if !c.payloadHandler.ok() { + return syscall.EINVAL + } + return c.payloadHandler.SetDeadline(t) +} + +// SetReadDeadline sets the read deadline associated with the +// endpoint. +func (c *PacketConn) SetReadDeadline(t time.Time) error { + if !c.payloadHandler.ok() { + return syscall.EINVAL + } + return c.payloadHandler.SetReadDeadline(t) +} + +// SetWriteDeadline sets the write deadline associated with the +// endpoint. +func (c *PacketConn) SetWriteDeadline(t time.Time) error { + if !c.payloadHandler.ok() { + return syscall.EINVAL + } + return c.payloadHandler.SetWriteDeadline(t) +} + +// Close closes the endpoint. +func (c *PacketConn) Close() error { + if !c.payloadHandler.ok() { + return syscall.EINVAL + } + return c.payloadHandler.Close() +} + +// NewPacketConn returns a new PacketConn using c as its underlying +// transport. +func NewPacketConn(c net.PacketConn) *PacketConn { + cc, _ := socket.NewConn(c.(net.Conn)) + return &PacketConn{ + genericOpt: genericOpt{Conn: cc}, + dgramOpt: dgramOpt{Conn: cc}, + payloadHandler: payloadHandler{PacketConn: c, Conn: cc}, + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/example_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/example_test.go new file mode 100644 index 0000000..e761aa2 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/example_test.go @@ -0,0 +1,216 @@ +// 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 ipv6_test + +import ( + "fmt" + "log" + "net" + "os" + "time" + + "golang.org/x/net/icmp" + "golang.org/x/net/ipv6" +) + +func ExampleConn_markingTCP() { + ln, err := net.Listen("tcp", "[::]:1024") + if err != nil { + log.Fatal(err) + } + defer ln.Close() + + for { + c, err := ln.Accept() + if err != nil { + log.Fatal(err) + } + go func(c net.Conn) { + defer c.Close() + if c.RemoteAddr().(*net.TCPAddr).IP.To16() != nil && c.RemoteAddr().(*net.TCPAddr).IP.To4() == nil { + p := ipv6.NewConn(c) + if err := p.SetTrafficClass(0x28); err != nil { // DSCP AF11 + log.Fatal(err) + } + if err := p.SetHopLimit(128); err != nil { + log.Fatal(err) + } + } + if _, err := c.Write([]byte("HELLO-R-U-THERE-ACK")); err != nil { + log.Fatal(err) + } + }(c) + } +} + +func ExamplePacketConn_servingOneShotMulticastDNS() { + c, err := net.ListenPacket("udp6", "[::]:5353") // mDNS over UDP + if err != nil { + log.Fatal(err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + + en0, err := net.InterfaceByName("en0") + if err != nil { + log.Fatal(err) + } + mDNSLinkLocal := net.UDPAddr{IP: net.ParseIP("ff02::fb")} + if err := p.JoinGroup(en0, &mDNSLinkLocal); err != nil { + log.Fatal(err) + } + defer p.LeaveGroup(en0, &mDNSLinkLocal) + if err := p.SetControlMessage(ipv6.FlagDst|ipv6.FlagInterface, true); err != nil { + log.Fatal(err) + } + + var wcm ipv6.ControlMessage + b := make([]byte, 1500) + for { + _, rcm, peer, err := p.ReadFrom(b) + if err != nil { + log.Fatal(err) + } + if !rcm.Dst.IsMulticast() || !rcm.Dst.Equal(mDNSLinkLocal.IP) { + continue + } + wcm.IfIndex = rcm.IfIndex + answers := []byte("FAKE-MDNS-ANSWERS") // fake mDNS answers, you need to implement this + if _, err := p.WriteTo(answers, &wcm, peer); err != nil { + log.Fatal(err) + } + } +} + +func ExamplePacketConn_tracingIPPacketRoute() { + // Tracing an IP packet route to www.google.com. + + const host = "www.google.com" + ips, err := net.LookupIP(host) + if err != nil { + log.Fatal(err) + } + var dst net.IPAddr + for _, ip := range ips { + if ip.To16() != nil && ip.To4() == nil { + dst.IP = ip + fmt.Printf("using %v for tracing an IP packet route to %s\n", dst.IP, host) + break + } + } + if dst.IP == nil { + log.Fatal("no AAAA record found") + } + + c, err := net.ListenPacket("ip6:58", "::") // ICMP for IPv6 + if err != nil { + log.Fatal(err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + + if err := p.SetControlMessage(ipv6.FlagHopLimit|ipv6.FlagSrc|ipv6.FlagDst|ipv6.FlagInterface, true); err != nil { + log.Fatal(err) + } + wm := icmp.Message{ + Type: ipv6.ICMPTypeEchoRequest, Code: 0, + Body: &icmp.Echo{ + ID: os.Getpid() & 0xffff, + Data: []byte("HELLO-R-U-THERE"), + }, + } + var f ipv6.ICMPFilter + f.SetAll(true) + f.Accept(ipv6.ICMPTypeTimeExceeded) + f.Accept(ipv6.ICMPTypeEchoReply) + if err := p.SetICMPFilter(&f); err != nil { + log.Fatal(err) + } + + var wcm ipv6.ControlMessage + rb := make([]byte, 1500) + for i := 1; i <= 64; i++ { // up to 64 hops + wm.Body.(*icmp.Echo).Seq = i + wb, err := wm.Marshal(nil) + if err != nil { + log.Fatal(err) + } + + // In the real world usually there are several + // multiple traffic-engineered paths for each hop. + // You may need to probe a few times to each hop. + begin := time.Now() + wcm.HopLimit = i + if _, err := p.WriteTo(wb, &wcm, &dst); err != nil { + log.Fatal(err) + } + if err := p.SetReadDeadline(time.Now().Add(3 * time.Second)); err != nil { + log.Fatal(err) + } + n, rcm, peer, err := p.ReadFrom(rb) + if err != nil { + if err, ok := err.(net.Error); ok && err.Timeout() { + fmt.Printf("%v\t*\n", i) + continue + } + log.Fatal(err) + } + rm, err := icmp.ParseMessage(58, rb[:n]) + if err != nil { + log.Fatal(err) + } + rtt := time.Since(begin) + + // In the real world you need to determine whether the + // received message is yours using ControlMessage.Src, + // ControlMesage.Dst, icmp.Echo.ID and icmp.Echo.Seq. + switch rm.Type { + case ipv6.ICMPTypeTimeExceeded: + names, _ := net.LookupAddr(peer.String()) + fmt.Printf("%d\t%v %+v %v\n\t%+v\n", i, peer, names, rtt, rcm) + case ipv6.ICMPTypeEchoReply: + names, _ := net.LookupAddr(peer.String()) + fmt.Printf("%d\t%v %+v %v\n\t%+v\n", i, peer, names, rtt, rcm) + return + } + } +} + +func ExamplePacketConn_advertisingOSPFHello() { + c, err := net.ListenPacket("ip6:89", "::") // OSPF for IPv6 + if err != nil { + log.Fatal(err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + + en0, err := net.InterfaceByName("en0") + if err != nil { + log.Fatal(err) + } + allSPFRouters := net.IPAddr{IP: net.ParseIP("ff02::5")} + if err := p.JoinGroup(en0, &allSPFRouters); err != nil { + log.Fatal(err) + } + defer p.LeaveGroup(en0, &allSPFRouters) + + hello := make([]byte, 24) // fake hello data, you need to implement this + ospf := make([]byte, 16) // fake ospf header, you need to implement this + ospf[0] = 3 // version 3 + ospf[1] = 1 // hello packet + ospf = append(ospf, hello...) + if err := p.SetChecksum(true, 12); err != nil { + log.Fatal(err) + } + + cm := ipv6.ControlMessage{ + TrafficClass: 0xc0, // DSCP CS6 + HopLimit: 1, + IfIndex: en0.Index, + } + if _, err := p.WriteTo(ospf, &cm, &allSPFRouters); err != nil { + log.Fatal(err) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/gen.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/gen.go new file mode 100644 index 0000000..41886ec --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/gen.go @@ -0,0 +1,199 @@ +// 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. + +// +build ignore + +//go:generate go run gen.go + +// This program generates system adaptation constants and types, +// internet protocol constants and tables by reading template files +// and IANA protocol registries. +package main + +import ( + "bytes" + "encoding/xml" + "fmt" + "go/format" + "io" + "io/ioutil" + "net/http" + "os" + "os/exec" + "runtime" + "strconv" + "strings" +) + +func main() { + if err := genzsys(); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + if err := geniana(); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} + +func genzsys() error { + defs := "defs_" + runtime.GOOS + ".go" + f, err := os.Open(defs) + if err != nil { + if os.IsNotExist(err) { + return nil + } + return err + } + f.Close() + cmd := exec.Command("go", "tool", "cgo", "-godefs", defs) + b, err := cmd.Output() + if err != nil { + return err + } + b, err = format.Source(b) + if err != nil { + return err + } + zsys := "zsys_" + runtime.GOOS + ".go" + switch runtime.GOOS { + case "freebsd", "linux": + zsys = "zsys_" + runtime.GOOS + "_" + runtime.GOARCH + ".go" + } + if err := ioutil.WriteFile(zsys, b, 0644); err != nil { + return err + } + return nil +} + +var registries = []struct { + url string + parse func(io.Writer, io.Reader) error +}{ + { + "http://www.iana.org/assignments/icmpv6-parameters/icmpv6-parameters.xml", + parseICMPv6Parameters, + }, +} + +func geniana() error { + var bb bytes.Buffer + fmt.Fprintf(&bb, "// go generate gen.go\n") + fmt.Fprintf(&bb, "// GENERATED BY THE COMMAND ABOVE; DO NOT EDIT\n\n") + fmt.Fprintf(&bb, "package ipv6\n\n") + for _, r := range registries { + resp, err := http.Get(r.url) + if err != nil { + return err + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + return fmt.Errorf("got HTTP status code %v for %v\n", resp.StatusCode, r.url) + } + if err := r.parse(&bb, resp.Body); err != nil { + return err + } + fmt.Fprintf(&bb, "\n") + } + b, err := format.Source(bb.Bytes()) + if err != nil { + return err + } + if err := ioutil.WriteFile("iana.go", b, 0644); err != nil { + return err + } + return nil +} + +func parseICMPv6Parameters(w io.Writer, r io.Reader) error { + dec := xml.NewDecoder(r) + var icp icmpv6Parameters + if err := dec.Decode(&icp); err != nil { + return err + } + prs := icp.escape() + fmt.Fprintf(w, "// %s, Updated: %s\n", icp.Title, icp.Updated) + fmt.Fprintf(w, "const (\n") + for _, pr := range prs { + if pr.Name == "" { + continue + } + fmt.Fprintf(w, "ICMPType%s ICMPType = %d", pr.Name, pr.Value) + fmt.Fprintf(w, "// %s\n", pr.OrigName) + } + fmt.Fprintf(w, ")\n\n") + fmt.Fprintf(w, "// %s, Updated: %s\n", icp.Title, icp.Updated) + fmt.Fprintf(w, "var icmpTypes = map[ICMPType]string{\n") + for _, pr := range prs { + if pr.Name == "" { + continue + } + fmt.Fprintf(w, "%d: %q,\n", pr.Value, strings.ToLower(pr.OrigName)) + } + fmt.Fprintf(w, "}\n") + return nil +} + +type icmpv6Parameters struct { + XMLName xml.Name `xml:"registry"` + Title string `xml:"title"` + Updated string `xml:"updated"` + Registries []struct { + Title string `xml:"title"` + Records []struct { + Value string `xml:"value"` + Name string `xml:"name"` + } `xml:"record"` + } `xml:"registry"` +} + +type canonICMPv6ParamRecord struct { + OrigName string + Name string + Value int +} + +func (icp *icmpv6Parameters) escape() []canonICMPv6ParamRecord { + id := -1 + for i, r := range icp.Registries { + if strings.Contains(r.Title, "Type") || strings.Contains(r.Title, "type") { + id = i + break + } + } + if id < 0 { + return nil + } + prs := make([]canonICMPv6ParamRecord, len(icp.Registries[id].Records)) + sr := strings.NewReplacer( + "Messages", "", + "Message", "", + "ICMP", "", + "+", "P", + "-", "", + "/", "", + ".", "", + " ", "", + ) + for i, pr := range icp.Registries[id].Records { + if strings.Contains(pr.Name, "Reserved") || + strings.Contains(pr.Name, "Unassigned") || + strings.Contains(pr.Name, "Deprecated") || + strings.Contains(pr.Name, "Experiment") || + strings.Contains(pr.Name, "experiment") { + continue + } + ss := strings.Split(pr.Name, "\n") + if len(ss) > 1 { + prs[i].Name = strings.Join(ss, " ") + } else { + prs[i].Name = ss[0] + } + s := strings.TrimSpace(prs[i].Name) + prs[i].OrigName = s + prs[i].Name = sr.Replace(s) + prs[i].Value, _ = strconv.Atoi(pr.Value) + } + return prs +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/genericopt.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/genericopt.go new file mode 100644 index 0000000..e9dbc2e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/genericopt.go @@ -0,0 +1,58 @@ +// 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 ipv6 + +import "syscall" + +// TrafficClass returns the traffic class field value for outgoing +// packets. +func (c *genericOpt) TrafficClass() (int, error) { + if !c.ok() { + return 0, syscall.EINVAL + } + so, ok := sockOpts[ssoTrafficClass] + if !ok { + return 0, errOpNoSupport + } + return so.GetInt(c.Conn) +} + +// SetTrafficClass sets the traffic class field value for future +// outgoing packets. +func (c *genericOpt) SetTrafficClass(tclass int) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoTrafficClass] + if !ok { + return errOpNoSupport + } + return so.SetInt(c.Conn, tclass) +} + +// HopLimit returns the hop limit field value for outgoing packets. +func (c *genericOpt) HopLimit() (int, error) { + if !c.ok() { + return 0, syscall.EINVAL + } + so, ok := sockOpts[ssoHopLimit] + if !ok { + return 0, errOpNoSupport + } + return so.GetInt(c.Conn) +} + +// SetHopLimit sets the hop limit field value for future outgoing +// packets. +func (c *genericOpt) SetHopLimit(hoplim int) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoHopLimit] + if !ok { + return errOpNoSupport + } + return so.SetInt(c.Conn, hoplim) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/header.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/header.go new file mode 100644 index 0000000..e05cb08 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/header.go @@ -0,0 +1,55 @@ +// 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 ipv6 + +import ( + "encoding/binary" + "fmt" + "net" +) + +const ( + Version = 6 // protocol version + HeaderLen = 40 // header length +) + +// A Header represents an IPv6 base header. +type Header struct { + Version int // protocol version + TrafficClass int // traffic class + FlowLabel int // flow label + PayloadLen int // payload length + NextHeader int // next header + HopLimit int // hop limit + Src net.IP // source address + Dst net.IP // destination address +} + +func (h *Header) String() string { + if h == nil { + return "" + } + return fmt.Sprintf("ver=%d tclass=%#x flowlbl=%#x payloadlen=%d nxthdr=%d hoplim=%d src=%v dst=%v", h.Version, h.TrafficClass, h.FlowLabel, h.PayloadLen, h.NextHeader, h.HopLimit, h.Src, h.Dst) +} + +// ParseHeader parses b as an IPv6 base header. +func ParseHeader(b []byte) (*Header, error) { + if len(b) < HeaderLen { + return nil, errHeaderTooShort + } + h := &Header{ + Version: int(b[0]) >> 4, + TrafficClass: int(b[0]&0x0f)<<4 | int(b[1])>>4, + FlowLabel: int(b[1]&0x0f)<<16 | int(b[2])<<8 | int(b[3]), + PayloadLen: int(binary.BigEndian.Uint16(b[4:6])), + NextHeader: int(b[6]), + HopLimit: int(b[7]), + } + h.Src = make(net.IP, net.IPv6len) + copy(h.Src, b[8:24]) + h.Dst = make(net.IP, net.IPv6len) + copy(h.Dst, b[24:40]) + return h, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/header_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/header_test.go new file mode 100644 index 0000000..ca11dc2 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/header_test.go @@ -0,0 +1,55 @@ +// 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 ipv6_test + +import ( + "net" + "reflect" + "strings" + "testing" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/ipv6" +) + +var ( + wireHeaderFromKernel = [ipv6.HeaderLen]byte{ + 0x69, 0x8b, 0xee, 0xf1, + 0xca, 0xfe, 0x2c, 0x01, + 0x20, 0x01, 0x0d, 0xb8, + 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, + 0x20, 0x01, 0x0d, 0xb8, + 0x00, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, + } + + testHeader = &ipv6.Header{ + Version: ipv6.Version, + TrafficClass: iana.DiffServAF43, + FlowLabel: 0xbeef1, + PayloadLen: 0xcafe, + NextHeader: iana.ProtocolIPv6Frag, + HopLimit: 1, + Src: net.ParseIP("2001:db8:1::1"), + Dst: net.ParseIP("2001:db8:2::1"), + } +) + +func TestParseHeader(t *testing.T) { + h, err := ipv6.ParseHeader(wireHeaderFromKernel[:]) + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(h, testHeader) { + t.Fatalf("got %#v; want %#v", h, testHeader) + } + s := h.String() + if strings.Contains(s, ",") { + t.Fatalf("should be space-separated values: %s", s) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/helper.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/helper.go new file mode 100644 index 0000000..2597401 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/helper.go @@ -0,0 +1,57 @@ +// 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 ipv6 + +import ( + "errors" + "net" +) + +var ( + errMissingAddress = errors.New("missing address") + errHeaderTooShort = errors.New("header too short") + errInvalidConnType = errors.New("invalid conn type") + errOpNoSupport = errors.New("operation not supported") + errNoSuchInterface = errors.New("no such interface") +) + +func boolint(b bool) int { + if b { + return 1 + } + return 0 +} + +func netAddrToIP16(a net.Addr) net.IP { + switch v := a.(type) { + case *net.UDPAddr: + if ip := v.IP.To16(); ip != nil && ip.To4() == nil { + return ip + } + case *net.IPAddr: + if ip := v.IP.To16(); ip != nil && ip.To4() == nil { + return ip + } + } + return nil +} + +func opAddr(a net.Addr) net.Addr { + switch a.(type) { + case *net.TCPAddr: + if a == nil { + return nil + } + case *net.UDPAddr: + if a == nil { + return nil + } + case *net.IPAddr: + if a == nil { + return nil + } + } + return a +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/iana.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/iana.go new file mode 100644 index 0000000..3c6214f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/iana.go @@ -0,0 +1,82 @@ +// go generate gen.go +// GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +package ipv6 + +// Internet Control Message Protocol version 6 (ICMPv6) Parameters, Updated: 2015-07-07 +const ( + ICMPTypeDestinationUnreachable ICMPType = 1 // Destination Unreachable + ICMPTypePacketTooBig ICMPType = 2 // Packet Too Big + ICMPTypeTimeExceeded ICMPType = 3 // Time Exceeded + ICMPTypeParameterProblem ICMPType = 4 // Parameter Problem + ICMPTypeEchoRequest ICMPType = 128 // Echo Request + ICMPTypeEchoReply ICMPType = 129 // Echo Reply + ICMPTypeMulticastListenerQuery ICMPType = 130 // Multicast Listener Query + ICMPTypeMulticastListenerReport ICMPType = 131 // Multicast Listener Report + ICMPTypeMulticastListenerDone ICMPType = 132 // Multicast Listener Done + ICMPTypeRouterSolicitation ICMPType = 133 // Router Solicitation + ICMPTypeRouterAdvertisement ICMPType = 134 // Router Advertisement + ICMPTypeNeighborSolicitation ICMPType = 135 // Neighbor Solicitation + ICMPTypeNeighborAdvertisement ICMPType = 136 // Neighbor Advertisement + ICMPTypeRedirect ICMPType = 137 // Redirect Message + ICMPTypeRouterRenumbering ICMPType = 138 // Router Renumbering + ICMPTypeNodeInformationQuery ICMPType = 139 // ICMP Node Information Query + ICMPTypeNodeInformationResponse ICMPType = 140 // ICMP Node Information Response + ICMPTypeInverseNeighborDiscoverySolicitation ICMPType = 141 // Inverse Neighbor Discovery Solicitation Message + ICMPTypeInverseNeighborDiscoveryAdvertisement ICMPType = 142 // Inverse Neighbor Discovery Advertisement Message + ICMPTypeVersion2MulticastListenerReport ICMPType = 143 // Version 2 Multicast Listener Report + ICMPTypeHomeAgentAddressDiscoveryRequest ICMPType = 144 // Home Agent Address Discovery Request Message + ICMPTypeHomeAgentAddressDiscoveryReply ICMPType = 145 // Home Agent Address Discovery Reply Message + ICMPTypeMobilePrefixSolicitation ICMPType = 146 // Mobile Prefix Solicitation + ICMPTypeMobilePrefixAdvertisement ICMPType = 147 // Mobile Prefix Advertisement + ICMPTypeCertificationPathSolicitation ICMPType = 148 // Certification Path Solicitation Message + ICMPTypeCertificationPathAdvertisement ICMPType = 149 // Certification Path Advertisement Message + ICMPTypeMulticastRouterAdvertisement ICMPType = 151 // Multicast Router Advertisement + ICMPTypeMulticastRouterSolicitation ICMPType = 152 // Multicast Router Solicitation + ICMPTypeMulticastRouterTermination ICMPType = 153 // Multicast Router Termination + ICMPTypeFMIPv6 ICMPType = 154 // FMIPv6 Messages + ICMPTypeRPLControl ICMPType = 155 // RPL Control Message + ICMPTypeILNPv6LocatorUpdate ICMPType = 156 // ILNPv6 Locator Update Message + ICMPTypeDuplicateAddressRequest ICMPType = 157 // Duplicate Address Request + ICMPTypeDuplicateAddressConfirmation ICMPType = 158 // Duplicate Address Confirmation + ICMPTypeMPLControl ICMPType = 159 // MPL Control Message +) + +// Internet Control Message Protocol version 6 (ICMPv6) Parameters, Updated: 2015-07-07 +var icmpTypes = map[ICMPType]string{ + 1: "destination unreachable", + 2: "packet too big", + 3: "time exceeded", + 4: "parameter problem", + 128: "echo request", + 129: "echo reply", + 130: "multicast listener query", + 131: "multicast listener report", + 132: "multicast listener done", + 133: "router solicitation", + 134: "router advertisement", + 135: "neighbor solicitation", + 136: "neighbor advertisement", + 137: "redirect message", + 138: "router renumbering", + 139: "icmp node information query", + 140: "icmp node information response", + 141: "inverse neighbor discovery solicitation message", + 142: "inverse neighbor discovery advertisement message", + 143: "version 2 multicast listener report", + 144: "home agent address discovery request message", + 145: "home agent address discovery reply message", + 146: "mobile prefix solicitation", + 147: "mobile prefix advertisement", + 148: "certification path solicitation message", + 149: "certification path advertisement message", + 151: "multicast router advertisement", + 152: "multicast router solicitation", + 153: "multicast router termination", + 154: "fmipv6 messages", + 155: "rpl control message", + 156: "ilnpv6 locator update message", + 157: "duplicate address request", + 158: "duplicate address confirmation", + 159: "mpl control message", +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/icmp.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/icmp.go new file mode 100644 index 0000000..b7f48e2 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/icmp.go @@ -0,0 +1,60 @@ +// 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 ipv6 + +import "golang.org/x/net/internal/iana" + +// BUG(mikio): On Windows, methods related to ICMPFilter are not +// implemented. + +// An ICMPType represents a type of ICMP message. +type ICMPType int + +func (typ ICMPType) String() string { + s, ok := icmpTypes[typ] + if !ok { + return "" + } + return s +} + +// Protocol returns the ICMPv6 protocol number. +func (typ ICMPType) Protocol() int { + return iana.ProtocolIPv6ICMP +} + +// An ICMPFilter represents an ICMP message filter for incoming +// packets. The filter belongs to a packet delivery path on a host and +// it cannot interact with forwarding packets or tunnel-outer packets. +// +// Note: RFC 8200 defines a reasonable role model. A node means a +// device that implements IP. A router means a node that forwards IP +// packets not explicitly addressed to itself, and a host means a node +// that is not a router. +type ICMPFilter struct { + icmpv6Filter +} + +// Accept accepts incoming ICMP packets including the type field value +// typ. +func (f *ICMPFilter) Accept(typ ICMPType) { + f.accept(typ) +} + +// Block blocks incoming ICMP packets including the type field value +// typ. +func (f *ICMPFilter) Block(typ ICMPType) { + f.block(typ) +} + +// SetAll sets the filter action to the filter. +func (f *ICMPFilter) SetAll(block bool) { + f.setAll(block) +} + +// WillBlock reports whether the ICMP type will be blocked. +func (f *ICMPFilter) WillBlock(typ ICMPType) bool { + return f.willBlock(typ) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/icmp_bsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/icmp_bsd.go new file mode 100644 index 0000000..e1a791d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/icmp_bsd.go @@ -0,0 +1,29 @@ +// 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. + +// +build darwin dragonfly freebsd netbsd openbsd + +package ipv6 + +func (f *icmpv6Filter) accept(typ ICMPType) { + f.Filt[typ>>5] |= 1 << (uint32(typ) & 31) +} + +func (f *icmpv6Filter) block(typ ICMPType) { + f.Filt[typ>>5] &^= 1 << (uint32(typ) & 31) +} + +func (f *icmpv6Filter) setAll(block bool) { + for i := range f.Filt { + if block { + f.Filt[i] = 0 + } else { + f.Filt[i] = 1<<32 - 1 + } + } +} + +func (f *icmpv6Filter) willBlock(typ ICMPType) bool { + return f.Filt[typ>>5]&(1<<(uint32(typ)&31)) == 0 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/icmp_linux.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/icmp_linux.go new file mode 100644 index 0000000..647f6b4 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/icmp_linux.go @@ -0,0 +1,27 @@ +// 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 ipv6 + +func (f *icmpv6Filter) accept(typ ICMPType) { + f.Data[typ>>5] &^= 1 << (uint32(typ) & 31) +} + +func (f *icmpv6Filter) block(typ ICMPType) { + f.Data[typ>>5] |= 1 << (uint32(typ) & 31) +} + +func (f *icmpv6Filter) setAll(block bool) { + for i := range f.Data { + if block { + f.Data[i] = 1<<32 - 1 + } else { + f.Data[i] = 0 + } + } +} + +func (f *icmpv6Filter) willBlock(typ ICMPType) bool { + return f.Data[typ>>5]&(1<<(uint32(typ)&31)) != 0 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/icmp_solaris.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/icmp_solaris.go new file mode 100644 index 0000000..7c23bb1 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/icmp_solaris.go @@ -0,0 +1,27 @@ +// 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 ipv6 + +func (f *icmpv6Filter) accept(typ ICMPType) { + f.X__icmp6_filt[typ>>5] |= 1 << (uint32(typ) & 31) +} + +func (f *icmpv6Filter) block(typ ICMPType) { + f.X__icmp6_filt[typ>>5] &^= 1 << (uint32(typ) & 31) +} + +func (f *icmpv6Filter) setAll(block bool) { + for i := range f.X__icmp6_filt { + if block { + f.X__icmp6_filt[i] = 0 + } else { + f.X__icmp6_filt[i] = 1<<32 - 1 + } + } +} + +func (f *icmpv6Filter) willBlock(typ ICMPType) bool { + return f.X__icmp6_filt[typ>>5]&(1<<(uint32(typ)&31)) == 0 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/icmp_stub.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/icmp_stub.go new file mode 100644 index 0000000..c4b9be6 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/icmp_stub.go @@ -0,0 +1,23 @@ +// 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. + +// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows + +package ipv6 + +type icmpv6Filter struct { +} + +func (f *icmpv6Filter) accept(typ ICMPType) { +} + +func (f *icmpv6Filter) block(typ ICMPType) { +} + +func (f *icmpv6Filter) setAll(block bool) { +} + +func (f *icmpv6Filter) willBlock(typ ICMPType) bool { + return false +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/icmp_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/icmp_test.go new file mode 100644 index 0000000..d8e9675 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/icmp_test.go @@ -0,0 +1,96 @@ +// 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 ipv6_test + +import ( + "net" + "reflect" + "runtime" + "testing" + + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv6" +) + +var icmpStringTests = []struct { + in ipv6.ICMPType + out string +}{ + {ipv6.ICMPTypeDestinationUnreachable, "destination unreachable"}, + + {256, ""}, +} + +func TestICMPString(t *testing.T) { + for _, tt := range icmpStringTests { + s := tt.in.String() + if s != tt.out { + t.Errorf("got %s; want %s", s, tt.out) + } + } +} + +func TestICMPFilter(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + + var f ipv6.ICMPFilter + for _, toggle := range []bool{false, true} { + f.SetAll(toggle) + for _, typ := range []ipv6.ICMPType{ + ipv6.ICMPTypeDestinationUnreachable, + ipv6.ICMPTypeEchoReply, + ipv6.ICMPTypeNeighborSolicitation, + ipv6.ICMPTypeDuplicateAddressConfirmation, + } { + f.Accept(typ) + if f.WillBlock(typ) { + t.Errorf("ipv6.ICMPFilter.Set(%v, false) failed", typ) + } + f.Block(typ) + if !f.WillBlock(typ) { + t.Errorf("ipv6.ICMPFilter.Set(%v, true) failed", typ) + } + } + } +} + +func TestSetICMPFilter(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + + c, err := net.ListenPacket("ip6:ipv6-icmp", "::1") + if err != nil { + t.Fatal(err) + } + defer c.Close() + + p := ipv6.NewPacketConn(c) + + var f ipv6.ICMPFilter + f.SetAll(true) + f.Accept(ipv6.ICMPTypeEchoRequest) + f.Accept(ipv6.ICMPTypeEchoReply) + if err := p.SetICMPFilter(&f); err != nil { + t.Fatal(err) + } + kf, err := p.ICMPFilter() + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(kf, &f) { + t.Fatalf("got %#v; want %#v", kf, f) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/icmp_windows.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/icmp_windows.go new file mode 100644 index 0000000..443cd07 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/icmp_windows.go @@ -0,0 +1,22 @@ +// 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 ipv6 + +func (f *icmpv6Filter) accept(typ ICMPType) { + // TODO(mikio): implement this +} + +func (f *icmpv6Filter) block(typ ICMPType) { + // TODO(mikio): implement this +} + +func (f *icmpv6Filter) setAll(block bool) { + // TODO(mikio): implement this +} + +func (f *icmpv6Filter) willBlock(typ ICMPType) bool { + // TODO(mikio): implement this + return false +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/mocktransponder_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/mocktransponder_test.go new file mode 100644 index 0000000..6efe56c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/mocktransponder_test.go @@ -0,0 +1,32 @@ +// 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 ipv6_test + +import ( + "net" + "testing" +) + +func connector(t *testing.T, network, addr string, done chan<- bool) { + defer func() { done <- true }() + + c, err := net.Dial(network, addr) + if err != nil { + t.Error(err) + return + } + c.Close() +} + +func acceptor(t *testing.T, ln net.Listener, done chan<- bool) { + defer func() { done <- true }() + + c, err := ln.Accept() + if err != nil { + t.Error(err) + return + } + c.Close() +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/multicast_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/multicast_test.go new file mode 100644 index 0000000..69a21cd --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/multicast_test.go @@ -0,0 +1,264 @@ +// 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 ipv6_test + +import ( + "bytes" + "net" + "os" + "runtime" + "testing" + "time" + + "golang.org/x/net/icmp" + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv6" +) + +var packetConnReadWriteMulticastUDPTests = []struct { + addr string + grp, src *net.UDPAddr +}{ + {"[ff02::]:0", &net.UDPAddr{IP: net.ParseIP("ff02::114")}, nil}, // see RFC 4727 + + {"[ff30::8000:0]:0", &net.UDPAddr{IP: net.ParseIP("ff30::8000:1")}, &net.UDPAddr{IP: net.IPv6loopback}}, // see RFC 5771 +} + +func TestPacketConnReadWriteMulticastUDP(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + if !nettest.SupportsIPv6MulticastDeliveryOnLoopback() { + t.Skipf("multicast delivery doesn't work correctly on %s", runtime.GOOS) + } + ifi := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagMulticast|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + for _, tt := range packetConnReadWriteMulticastUDPTests { + c, err := net.ListenPacket("udp6", tt.addr) + if err != nil { + t.Fatal(err) + } + defer c.Close() + + grp := *tt.grp + grp.Port = c.LocalAddr().(*net.UDPAddr).Port + p := ipv6.NewPacketConn(c) + defer p.Close() + if tt.src == nil { + if err := p.JoinGroup(ifi, &grp); err != nil { + t.Fatal(err) + } + defer p.LeaveGroup(ifi, &grp) + } else { + if err := p.JoinSourceSpecificGroup(ifi, &grp, tt.src); err != nil { + switch runtime.GOOS { + case "freebsd", "linux": + default: // platforms that don't support MLDv2 fail here + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + defer p.LeaveSourceSpecificGroup(ifi, &grp, tt.src) + } + if err := p.SetMulticastInterface(ifi); err != nil { + t.Fatal(err) + } + if _, err := p.MulticastInterface(); err != nil { + t.Fatal(err) + } + if err := p.SetMulticastLoopback(true); err != nil { + t.Fatal(err) + } + if _, err := p.MulticastLoopback(); err != nil { + t.Fatal(err) + } + + cm := ipv6.ControlMessage{ + TrafficClass: iana.DiffServAF11 | iana.CongestionExperienced, + Src: net.IPv6loopback, + IfIndex: ifi.Index, + } + cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagSrc | ipv6.FlagDst | ipv6.FlagInterface | ipv6.FlagPathMTU + wb := []byte("HELLO-R-U-THERE") + + for i, toggle := range []bool{true, false, true} { + if err := p.SetControlMessage(cf, toggle); err != nil { + if nettest.ProtocolNotSupported(err) { + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + if err := p.SetDeadline(time.Now().Add(200 * time.Millisecond)); err != nil { + t.Fatal(err) + } + cm.HopLimit = i + 1 + if n, err := p.WriteTo(wb, &cm, &grp); err != nil { + t.Fatal(err) + } else if n != len(wb) { + t.Fatal(err) + } + rb := make([]byte, 128) + if n, _, _, err := p.ReadFrom(rb); err != nil { + t.Fatal(err) + } else if !bytes.Equal(rb[:n], wb) { + t.Fatalf("got %v; want %v", rb[:n], wb) + } + } + } +} + +var packetConnReadWriteMulticastICMPTests = []struct { + grp, src *net.IPAddr +}{ + {&net.IPAddr{IP: net.ParseIP("ff02::114")}, nil}, // see RFC 4727 + + {&net.IPAddr{IP: net.ParseIP("ff30::8000:1")}, &net.IPAddr{IP: net.IPv6loopback}}, // see RFC 5771 +} + +func TestPacketConnReadWriteMulticastICMP(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + if !nettest.SupportsIPv6MulticastDeliveryOnLoopback() { + t.Skipf("multicast delivery doesn't work correctly on %s", runtime.GOOS) + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + ifi := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagMulticast|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + for _, tt := range packetConnReadWriteMulticastICMPTests { + c, err := net.ListenPacket("ip6:ipv6-icmp", "::") + if err != nil { + t.Fatal(err) + } + defer c.Close() + + pshicmp := icmp.IPv6PseudoHeader(c.LocalAddr().(*net.IPAddr).IP, tt.grp.IP) + p := ipv6.NewPacketConn(c) + defer p.Close() + if tt.src == nil { + if err := p.JoinGroup(ifi, tt.grp); err != nil { + t.Fatal(err) + } + defer p.LeaveGroup(ifi, tt.grp) + } else { + if err := p.JoinSourceSpecificGroup(ifi, tt.grp, tt.src); err != nil { + switch runtime.GOOS { + case "freebsd", "linux": + default: // platforms that don't support MLDv2 fail here + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + defer p.LeaveSourceSpecificGroup(ifi, tt.grp, tt.src) + } + if err := p.SetMulticastInterface(ifi); err != nil { + t.Fatal(err) + } + if _, err := p.MulticastInterface(); err != nil { + t.Fatal(err) + } + if err := p.SetMulticastLoopback(true); err != nil { + t.Fatal(err) + } + if _, err := p.MulticastLoopback(); err != nil { + t.Fatal(err) + } + + cm := ipv6.ControlMessage{ + TrafficClass: iana.DiffServAF11 | iana.CongestionExperienced, + Src: net.IPv6loopback, + IfIndex: ifi.Index, + } + cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagSrc | ipv6.FlagDst | ipv6.FlagInterface | ipv6.FlagPathMTU + + var f ipv6.ICMPFilter + f.SetAll(true) + f.Accept(ipv6.ICMPTypeEchoReply) + if err := p.SetICMPFilter(&f); err != nil { + t.Fatal(err) + } + + var psh []byte + for i, toggle := range []bool{true, false, true} { + if toggle { + psh = nil + if err := p.SetChecksum(true, 2); err != nil { + // Solaris never allows to + // modify ICMP properties. + if runtime.GOOS != "solaris" { + t.Fatal(err) + } + } + } else { + psh = pshicmp + // Some platforms never allow to + // disable the kernel checksum + // processing. + p.SetChecksum(false, -1) + } + wb, err := (&icmp.Message{ + Type: ipv6.ICMPTypeEchoRequest, Code: 0, + Body: &icmp.Echo{ + ID: os.Getpid() & 0xffff, Seq: i + 1, + Data: []byte("HELLO-R-U-THERE"), + }, + }).Marshal(psh) + if err != nil { + t.Fatal(err) + } + if err := p.SetControlMessage(cf, toggle); err != nil { + if nettest.ProtocolNotSupported(err) { + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + if err := p.SetDeadline(time.Now().Add(200 * time.Millisecond)); err != nil { + t.Fatal(err) + } + cm.HopLimit = i + 1 + if n, err := p.WriteTo(wb, &cm, tt.grp); err != nil { + t.Fatal(err) + } else if n != len(wb) { + t.Fatalf("got %v; want %v", n, len(wb)) + } + rb := make([]byte, 128) + if n, _, _, err := p.ReadFrom(rb); err != nil { + switch runtime.GOOS { + case "darwin": // older darwin kernels have some limitation on receiving icmp packet through raw socket + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } else { + if m, err := icmp.ParseMessage(iana.ProtocolIPv6ICMP, rb[:n]); err != nil { + t.Fatal(err) + } else if m.Type != ipv6.ICMPTypeEchoReply || m.Code != 0 { + t.Fatalf("got type=%v, code=%v; want type=%v, code=%v", m.Type, m.Code, ipv6.ICMPTypeEchoReply, 0) + } + } + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/multicastlistener_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/multicastlistener_test.go new file mode 100644 index 0000000..b27713e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/multicastlistener_test.go @@ -0,0 +1,261 @@ +// 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 ipv6_test + +import ( + "net" + "runtime" + "testing" + + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv6" +) + +var udpMultipleGroupListenerTests = []net.Addr{ + &net.UDPAddr{IP: net.ParseIP("ff02::114")}, // see RFC 4727 + &net.UDPAddr{IP: net.ParseIP("ff02::1:114")}, + &net.UDPAddr{IP: net.ParseIP("ff02::2:114")}, +} + +func TestUDPSinglePacketConnWithMultipleGroupListeners(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + + for _, gaddr := range udpMultipleGroupListenerTests { + c, err := net.ListenPacket("udp6", "[::]:0") // wildcard address with non-reusable port + if err != nil { + t.Fatal(err) + } + defer c.Close() + + p := ipv6.NewPacketConn(c) + var mift []*net.Interface + + ift, err := net.Interfaces() + if err != nil { + t.Fatal(err) + } + for i, ifi := range ift { + if _, ok := nettest.IsMulticastCapable("ip6", &ifi); !ok { + continue + } + if err := p.JoinGroup(&ifi, gaddr); err != nil { + t.Fatal(err) + } + mift = append(mift, &ift[i]) + } + for _, ifi := range mift { + if err := p.LeaveGroup(ifi, gaddr); err != nil { + t.Fatal(err) + } + } + } +} + +func TestUDPMultiplePacketConnWithMultipleGroupListeners(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + + for _, gaddr := range udpMultipleGroupListenerTests { + c1, err := net.ListenPacket("udp6", "[ff02::]:0") // wildcard address with reusable port + if err != nil { + t.Fatal(err) + } + defer c1.Close() + _, port, err := net.SplitHostPort(c1.LocalAddr().String()) + if err != nil { + t.Fatal(err) + } + c2, err := net.ListenPacket("udp6", net.JoinHostPort("ff02::", port)) // wildcard address with reusable port + if err != nil { + t.Fatal(err) + } + defer c2.Close() + + var ps [2]*ipv6.PacketConn + ps[0] = ipv6.NewPacketConn(c1) + ps[1] = ipv6.NewPacketConn(c2) + var mift []*net.Interface + + ift, err := net.Interfaces() + if err != nil { + t.Fatal(err) + } + for i, ifi := range ift { + if _, ok := nettest.IsMulticastCapable("ip6", &ifi); !ok { + continue + } + for _, p := range ps { + if err := p.JoinGroup(&ifi, gaddr); err != nil { + t.Fatal(err) + } + } + mift = append(mift, &ift[i]) + } + for _, ifi := range mift { + for _, p := range ps { + if err := p.LeaveGroup(ifi, gaddr); err != nil { + t.Fatal(err) + } + } + } + } +} + +func TestUDPPerInterfaceSinglePacketConnWithSingleGroupListener(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + + gaddr := net.IPAddr{IP: net.ParseIP("ff02::114")} // see RFC 4727 + type ml struct { + c *ipv6.PacketConn + ifi *net.Interface + } + var mlt []*ml + + ift, err := net.Interfaces() + if err != nil { + t.Fatal(err) + } + port := "0" + for i, ifi := range ift { + ip, ok := nettest.IsMulticastCapable("ip6", &ifi) + if !ok { + continue + } + c, err := net.ListenPacket("udp6", net.JoinHostPort(ip.String()+"%"+ifi.Name, port)) // unicast address with non-reusable port + if err != nil { + // The listen may fail when the serivce is + // already in use, but it's fine because the + // purpose of this is not to test the + // bookkeeping of IP control block inside the + // kernel. + t.Log(err) + continue + } + defer c.Close() + if port == "0" { + _, port, err = net.SplitHostPort(c.LocalAddr().String()) + if err != nil { + t.Fatal(err) + } + } + p := ipv6.NewPacketConn(c) + if err := p.JoinGroup(&ifi, &gaddr); err != nil { + t.Fatal(err) + } + mlt = append(mlt, &ml{p, &ift[i]}) + } + for _, m := range mlt { + if err := m.c.LeaveGroup(m.ifi, &gaddr); err != nil { + t.Fatal(err) + } + } +} + +func TestIPSinglePacketConnWithSingleGroupListener(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + + c, err := net.ListenPacket("ip6:ipv6-icmp", "::") // wildcard address + if err != nil { + t.Fatal(err) + } + defer c.Close() + + p := ipv6.NewPacketConn(c) + gaddr := net.IPAddr{IP: net.ParseIP("ff02::114")} // see RFC 4727 + var mift []*net.Interface + + ift, err := net.Interfaces() + if err != nil { + t.Fatal(err) + } + for i, ifi := range ift { + if _, ok := nettest.IsMulticastCapable("ip6", &ifi); !ok { + continue + } + if err := p.JoinGroup(&ifi, &gaddr); err != nil { + t.Fatal(err) + } + mift = append(mift, &ift[i]) + } + for _, ifi := range mift { + if err := p.LeaveGroup(ifi, &gaddr); err != nil { + t.Fatal(err) + } + } +} + +func TestIPPerInterfaceSinglePacketConnWithSingleGroupListener(t *testing.T) { + switch runtime.GOOS { + case "darwin", "dragonfly", "openbsd": // platforms that return fe80::1%lo0: bind: can't assign requested address + t.Skipf("not supported on %s", runtime.GOOS) + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + + gaddr := net.IPAddr{IP: net.ParseIP("ff02::114")} // see RFC 4727 + type ml struct { + c *ipv6.PacketConn + ifi *net.Interface + } + var mlt []*ml + + ift, err := net.Interfaces() + if err != nil { + t.Fatal(err) + } + for i, ifi := range ift { + ip, ok := nettest.IsMulticastCapable("ip6", &ifi) + if !ok { + continue + } + c, err := net.ListenPacket("ip6:ipv6-icmp", ip.String()+"%"+ifi.Name) // unicast address + if err != nil { + t.Fatal(err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + if err := p.JoinGroup(&ifi, &gaddr); err != nil { + t.Fatal(err) + } + mlt = append(mlt, &ml{p, &ift[i]}) + } + for _, m := range mlt { + if err := m.c.LeaveGroup(m.ifi, &gaddr); err != nil { + t.Fatal(err) + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/multicastsockopt_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/multicastsockopt_test.go new file mode 100644 index 0000000..9e6b902 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/multicastsockopt_test.go @@ -0,0 +1,157 @@ +// 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 ipv6_test + +import ( + "net" + "runtime" + "testing" + + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv6" +) + +var packetConnMulticastSocketOptionTests = []struct { + net, proto, addr string + grp, src net.Addr +}{ + {"udp6", "", "[ff02::]:0", &net.UDPAddr{IP: net.ParseIP("ff02::114")}, nil}, // see RFC 4727 + {"ip6", ":ipv6-icmp", "::", &net.IPAddr{IP: net.ParseIP("ff02::115")}, nil}, // see RFC 4727 + + {"udp6", "", "[ff30::8000:0]:0", &net.UDPAddr{IP: net.ParseIP("ff30::8000:1")}, &net.UDPAddr{IP: net.IPv6loopback}}, // see RFC 5771 + {"ip6", ":ipv6-icmp", "::", &net.IPAddr{IP: net.ParseIP("ff30::8000:2")}, &net.IPAddr{IP: net.IPv6loopback}}, // see RFC 5771 +} + +func TestPacketConnMulticastSocketOptions(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + ifi := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagMulticast|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + m, ok := nettest.SupportsRawIPSocket() + for _, tt := range packetConnMulticastSocketOptionTests { + if tt.net == "ip6" && !ok { + t.Log(m) + continue + } + c, err := net.ListenPacket(tt.net+tt.proto, tt.addr) + if err != nil { + t.Fatal(err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + defer p.Close() + + if tt.src == nil { + testMulticastSocketOptions(t, p, ifi, tt.grp) + } else { + testSourceSpecificMulticastSocketOptions(t, p, ifi, tt.grp, tt.src) + } + } +} + +type testIPv6MulticastConn interface { + MulticastHopLimit() (int, error) + SetMulticastHopLimit(ttl int) error + MulticastLoopback() (bool, error) + SetMulticastLoopback(bool) error + JoinGroup(*net.Interface, net.Addr) error + LeaveGroup(*net.Interface, net.Addr) error + JoinSourceSpecificGroup(*net.Interface, net.Addr, net.Addr) error + LeaveSourceSpecificGroup(*net.Interface, net.Addr, net.Addr) error + ExcludeSourceSpecificGroup(*net.Interface, net.Addr, net.Addr) error + IncludeSourceSpecificGroup(*net.Interface, net.Addr, net.Addr) error +} + +func testMulticastSocketOptions(t *testing.T, c testIPv6MulticastConn, ifi *net.Interface, grp net.Addr) { + const hoplim = 255 + if err := c.SetMulticastHopLimit(hoplim); err != nil { + t.Error(err) + return + } + if v, err := c.MulticastHopLimit(); err != nil { + t.Error(err) + return + } else if v != hoplim { + t.Errorf("got %v; want %v", v, hoplim) + return + } + + for _, toggle := range []bool{true, false} { + if err := c.SetMulticastLoopback(toggle); err != nil { + t.Error(err) + return + } + if v, err := c.MulticastLoopback(); err != nil { + t.Error(err) + return + } else if v != toggle { + t.Errorf("got %v; want %v", v, toggle) + return + } + } + + if err := c.JoinGroup(ifi, grp); err != nil { + t.Error(err) + return + } + if err := c.LeaveGroup(ifi, grp); err != nil { + t.Error(err) + return + } +} + +func testSourceSpecificMulticastSocketOptions(t *testing.T, c testIPv6MulticastConn, ifi *net.Interface, grp, src net.Addr) { + // MCAST_JOIN_GROUP -> MCAST_BLOCK_SOURCE -> MCAST_UNBLOCK_SOURCE -> MCAST_LEAVE_GROUP + if err := c.JoinGroup(ifi, grp); err != nil { + t.Error(err) + return + } + if err := c.ExcludeSourceSpecificGroup(ifi, grp, src); err != nil { + switch runtime.GOOS { + case "freebsd", "linux": + default: // platforms that don't support MLDv2 fail here + t.Logf("not supported on %s", runtime.GOOS) + return + } + t.Error(err) + return + } + if err := c.IncludeSourceSpecificGroup(ifi, grp, src); err != nil { + t.Error(err) + return + } + if err := c.LeaveGroup(ifi, grp); err != nil { + t.Error(err) + return + } + + // MCAST_JOIN_SOURCE_GROUP -> MCAST_LEAVE_SOURCE_GROUP + if err := c.JoinSourceSpecificGroup(ifi, grp, src); err != nil { + t.Error(err) + return + } + if err := c.LeaveSourceSpecificGroup(ifi, grp, src); err != nil { + t.Error(err) + return + } + + // MCAST_JOIN_SOURCE_GROUP -> MCAST_LEAVE_GROUP + if err := c.JoinSourceSpecificGroup(ifi, grp, src); err != nil { + t.Error(err) + return + } + if err := c.LeaveGroup(ifi, grp); err != nil { + t.Error(err) + return + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/payload.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/payload.go new file mode 100644 index 0000000..a8197f1 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/payload.go @@ -0,0 +1,23 @@ +// 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 ipv6 + +import ( + "net" + + "golang.org/x/net/internal/socket" +) + +// BUG(mikio): On Windows, the ControlMessage for ReadFrom and WriteTo +// methods of PacketConn is not implemented. + +// A payloadHandler represents the IPv6 datagram payload handler. +type payloadHandler struct { + net.PacketConn + *socket.Conn + rawOpt +} + +func (c *payloadHandler) ok() bool { return c != nil && c.PacketConn != nil && c.Conn != nil } diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/payload_cmsg.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/payload_cmsg.go new file mode 100644 index 0000000..4ee4b06 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/payload_cmsg.go @@ -0,0 +1,35 @@ +// 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. + +// +build !nacl,!plan9,!windows + +package ipv6 + +import ( + "net" + "syscall" +) + +// ReadFrom reads a payload of the received IPv6 datagram, from the +// endpoint c, copying the payload into b. It returns the number of +// bytes copied into b, the control message cm and the source address +// src of the received datagram. +func (c *payloadHandler) ReadFrom(b []byte) (n int, cm *ControlMessage, src net.Addr, err error) { + if !c.ok() { + return 0, nil, nil, syscall.EINVAL + } + return c.readFrom(b) +} + +// WriteTo writes a payload of the IPv6 datagram, to the destination +// address dst through the endpoint c, copying the payload from b. It +// returns the number of bytes written. The control message cm allows +// the IPv6 header fields and the datagram path to be specified. The +// cm may be nil if control of the outgoing datagram is not required. +func (c *payloadHandler) WriteTo(b []byte, cm *ControlMessage, dst net.Addr) (n int, err error) { + if !c.ok() { + return 0, syscall.EINVAL + } + return c.writeTo(b, cm, dst) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/payload_cmsg_go1_8.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/payload_cmsg_go1_8.go new file mode 100644 index 0000000..fdc6c39 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/payload_cmsg_go1_8.go @@ -0,0 +1,55 @@ +// 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. + +// +build !go1.9 +// +build !nacl,!plan9,!windows + +package ipv6 + +import "net" + +func (c *payloadHandler) readFrom(b []byte) (n int, cm *ControlMessage, src net.Addr, err error) { + c.rawOpt.RLock() + oob := NewControlMessage(c.rawOpt.cflags) + c.rawOpt.RUnlock() + var nn int + switch c := c.PacketConn.(type) { + case *net.UDPConn: + if n, nn, _, src, err = c.ReadMsgUDP(b, oob); err != nil { + return 0, nil, nil, err + } + case *net.IPConn: + if n, nn, _, src, err = c.ReadMsgIP(b, oob); err != nil { + return 0, nil, nil, err + } + default: + return 0, nil, nil, &net.OpError{Op: "read", Net: c.LocalAddr().Network(), Source: c.LocalAddr(), Err: errInvalidConnType} + } + if nn > 0 { + cm = new(ControlMessage) + if err = cm.Parse(oob[:nn]); err != nil { + return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + } + if cm != nil { + cm.Src = netAddrToIP16(src) + } + return +} + +func (c *payloadHandler) writeTo(b []byte, cm *ControlMessage, dst net.Addr) (n int, err error) { + oob := cm.Marshal() + if dst == nil { + return 0, &net.OpError{Op: "write", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: errMissingAddress} + } + switch c := c.PacketConn.(type) { + case *net.UDPConn: + n, _, err = c.WriteMsgUDP(b, oob, dst.(*net.UDPAddr)) + case *net.IPConn: + n, _, err = c.WriteMsgIP(b, oob, dst.(*net.IPAddr)) + default: + return 0, &net.OpError{Op: "write", Net: c.LocalAddr().Network(), Source: c.LocalAddr(), Addr: opAddr(dst), Err: errInvalidConnType} + } + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/payload_cmsg_go1_9.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/payload_cmsg_go1_9.go new file mode 100644 index 0000000..8f6d02e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/payload_cmsg_go1_9.go @@ -0,0 +1,57 @@ +// 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. + +// +build go1.9 +// +build !nacl,!plan9,!windows + +package ipv6 + +import ( + "net" + + "golang.org/x/net/internal/socket" +) + +func (c *payloadHandler) readFrom(b []byte) (int, *ControlMessage, net.Addr, error) { + c.rawOpt.RLock() + m := socket.Message{ + Buffers: [][]byte{b}, + OOB: NewControlMessage(c.rawOpt.cflags), + } + c.rawOpt.RUnlock() + switch c.PacketConn.(type) { + case *net.UDPConn: + if err := c.RecvMsg(&m, 0); err != nil { + return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + case *net.IPConn: + if err := c.RecvMsg(&m, 0); err != nil { + return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + default: + return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: errInvalidConnType} + } + var cm *ControlMessage + if m.NN > 0 { + cm = new(ControlMessage) + if err := cm.Parse(m.OOB[:m.NN]); err != nil { + return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + cm.Src = netAddrToIP16(m.Addr) + } + return m.N, cm, m.Addr, nil +} + +func (c *payloadHandler) writeTo(b []byte, cm *ControlMessage, dst net.Addr) (int, error) { + m := socket.Message{ + Buffers: [][]byte{b}, + OOB: cm.Marshal(), + Addr: dst, + } + err := c.SendMsg(&m, 0) + if err != nil { + err = &net.OpError{Op: "write", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Addr: opAddr(dst), Err: err} + } + return m.N, err +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/payload_nocmsg.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/payload_nocmsg.go new file mode 100644 index 0000000..99a4354 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/payload_nocmsg.go @@ -0,0 +1,41 @@ +// 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. + +// +build nacl plan9 windows + +package ipv6 + +import ( + "net" + "syscall" +) + +// ReadFrom reads a payload of the received IPv6 datagram, from the +// endpoint c, copying the payload into b. It returns the number of +// bytes copied into b, the control message cm and the source address +// src of the received datagram. +func (c *payloadHandler) ReadFrom(b []byte) (n int, cm *ControlMessage, src net.Addr, err error) { + if !c.ok() { + return 0, nil, nil, syscall.EINVAL + } + if n, src, err = c.PacketConn.ReadFrom(b); err != nil { + return 0, nil, nil, err + } + return +} + +// WriteTo writes a payload of the IPv6 datagram, to the destination +// address dst through the endpoint c, copying the payload from b. It +// returns the number of bytes written. The control message cm allows +// the IPv6 header fields and the datagram path to be specified. The +// cm may be nil if control of the outgoing datagram is not required. +func (c *payloadHandler) WriteTo(b []byte, cm *ControlMessage, dst net.Addr) (n int, err error) { + if !c.ok() { + return 0, syscall.EINVAL + } + if dst == nil { + return 0, errMissingAddress + } + return c.PacketConn.WriteTo(b, dst) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/readwrite_go1_8_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/readwrite_go1_8_test.go new file mode 100644 index 0000000..c11d92a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/readwrite_go1_8_test.go @@ -0,0 +1,242 @@ +// 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. + +// +build !go1.9 + +package ipv6_test + +import ( + "bytes" + "fmt" + "net" + "runtime" + "strings" + "sync" + "testing" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv6" +) + +func BenchmarkPacketConnReadWriteUnicast(b *testing.B) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + b.Skipf("not supported on %s", runtime.GOOS) + } + + payload := []byte("HELLO-R-U-THERE") + iph := []byte{ + 0x69, 0x8b, 0xee, 0xf1, 0xca, 0xfe, 0xff, 0x01, + 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + } + greh := []byte{0x00, 0x00, 0x86, 0xdd, 0x00, 0x00, 0x00, 0x00} + datagram := append(greh, append(iph, payload...)...) + bb := make([]byte, 128) + cm := ipv6.ControlMessage{ + TrafficClass: iana.DiffServAF11 | iana.CongestionExperienced, + HopLimit: 1, + Src: net.IPv6loopback, + } + if ifi := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagLoopback); ifi != nil { + cm.IfIndex = ifi.Index + } + + b.Run("UDP", func(b *testing.B) { + c, err := nettest.NewLocalPacketListener("udp6") + if err != nil { + b.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + dst := c.LocalAddr() + cf := ipv6.FlagHopLimit | ipv6.FlagInterface + if err := p.SetControlMessage(cf, true); err != nil { + b.Fatal(err) + } + b.Run("Net", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := c.WriteTo(payload, dst); err != nil { + b.Fatal(err) + } + if _, _, err := c.ReadFrom(bb); err != nil { + b.Fatal(err) + } + } + }) + b.Run("ToFrom", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := p.WriteTo(payload, &cm, dst); err != nil { + b.Fatal(err) + } + if _, _, _, err := p.ReadFrom(bb); err != nil { + b.Fatal(err) + } + } + }) + }) + b.Run("IP", func(b *testing.B) { + switch runtime.GOOS { + case "netbsd": + b.Skip("need to configure gre on netbsd") + case "openbsd": + b.Skip("net.inet.gre.allow=0 by default on openbsd") + } + + c, err := net.ListenPacket(fmt.Sprintf("ip6:%d", iana.ProtocolGRE), "::1") + if err != nil { + b.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + dst := c.LocalAddr() + cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagSrc | ipv6.FlagDst | ipv6.FlagInterface | ipv6.FlagPathMTU + if err := p.SetControlMessage(cf, true); err != nil { + b.Fatal(err) + } + b.Run("Net", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := c.WriteTo(datagram, dst); err != nil { + b.Fatal(err) + } + if _, _, err := c.ReadFrom(bb); err != nil { + b.Fatal(err) + } + } + }) + b.Run("ToFrom", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := p.WriteTo(datagram, &cm, dst); err != nil { + b.Fatal(err) + } + if _, _, _, err := p.ReadFrom(bb); err != nil { + b.Fatal(err) + } + } + }) + }) +} + +func TestPacketConnConcurrentReadWriteUnicast(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + + payload := []byte("HELLO-R-U-THERE") + iph := []byte{ + 0x69, 0x8b, 0xee, 0xf1, 0xca, 0xfe, 0xff, 0x01, + 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + } + greh := []byte{0x00, 0x00, 0x86, 0xdd, 0x00, 0x00, 0x00, 0x00} + datagram := append(greh, append(iph, payload...)...) + + t.Run("UDP", func(t *testing.T) { + c, err := nettest.NewLocalPacketListener("udp6") + if err != nil { + t.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + t.Run("ToFrom", func(t *testing.T) { + testPacketConnConcurrentReadWriteUnicast(t, p, payload, c.LocalAddr()) + }) + }) + t.Run("IP", func(t *testing.T) { + switch runtime.GOOS { + case "netbsd": + t.Skip("need to configure gre on netbsd") + case "openbsd": + t.Skip("net.inet.gre.allow=0 by default on openbsd") + } + + c, err := net.ListenPacket(fmt.Sprintf("ip6:%d", iana.ProtocolGRE), "::1") + if err != nil { + t.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + t.Run("ToFrom", func(t *testing.T) { + testPacketConnConcurrentReadWriteUnicast(t, p, datagram, c.LocalAddr()) + }) + }) +} + +func testPacketConnConcurrentReadWriteUnicast(t *testing.T, p *ipv6.PacketConn, data []byte, dst net.Addr) { + ifi := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagLoopback) + cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagSrc | ipv6.FlagDst | ipv6.FlagInterface | ipv6.FlagPathMTU + + if err := p.SetControlMessage(cf, true); err != nil { // probe before test + if nettest.ProtocolNotSupported(err) { + t.Skipf("not supported on %s", runtime.GOOS) + } + t.Fatal(err) + } + + var wg sync.WaitGroup + reader := func() { + defer wg.Done() + b := make([]byte, 128) + n, cm, _, err := p.ReadFrom(b) + if err != nil { + t.Error(err) + return + } + if !bytes.Equal(b[:n], data) { + t.Errorf("got %#v; want %#v", b[:n], data) + return + } + s := cm.String() + if strings.Contains(s, ",") { + t.Errorf("should be space-separated values: %s", s) + return + } + } + writer := func(toggle bool) { + defer wg.Done() + cm := ipv6.ControlMessage{ + TrafficClass: iana.DiffServAF11 | iana.CongestionExperienced, + HopLimit: 1, + Src: net.IPv6loopback, + } + if ifi != nil { + cm.IfIndex = ifi.Index + } + if err := p.SetControlMessage(cf, toggle); err != nil { + t.Error(err) + return + } + n, err := p.WriteTo(data, &cm, dst) + if err != nil { + t.Error(err) + return + } + if n != len(data) { + t.Errorf("got %d; want %d", n, len(data)) + return + } + } + + const N = 10 + wg.Add(N) + for i := 0; i < N; i++ { + go reader() + } + wg.Add(2 * N) + for i := 0; i < 2*N; i++ { + go writer(i%2 != 0) + + } + wg.Add(N) + for i := 0; i < N; i++ { + go reader() + } + wg.Wait() +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/readwrite_go1_9_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/readwrite_go1_9_test.go new file mode 100644 index 0000000..e2fd733 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/readwrite_go1_9_test.go @@ -0,0 +1,373 @@ +// 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. + +// +build go1.9 + +package ipv6_test + +import ( + "bytes" + "fmt" + "net" + "runtime" + "strings" + "sync" + "testing" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv6" +) + +func BenchmarkPacketConnReadWriteUnicast(b *testing.B) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + b.Skipf("not supported on %s", runtime.GOOS) + } + + payload := []byte("HELLO-R-U-THERE") + iph := []byte{ + 0x69, 0x8b, 0xee, 0xf1, 0xca, 0xfe, 0xff, 0x01, + 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + } + greh := []byte{0x00, 0x00, 0x86, 0xdd, 0x00, 0x00, 0x00, 0x00} + datagram := append(greh, append(iph, payload...)...) + bb := make([]byte, 128) + cm := ipv6.ControlMessage{ + TrafficClass: iana.DiffServAF11 | iana.CongestionExperienced, + HopLimit: 1, + Src: net.IPv6loopback, + } + if ifi := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagLoopback); ifi != nil { + cm.IfIndex = ifi.Index + } + + b.Run("UDP", func(b *testing.B) { + c, err := nettest.NewLocalPacketListener("udp6") + if err != nil { + b.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + dst := c.LocalAddr() + cf := ipv6.FlagHopLimit | ipv6.FlagInterface + if err := p.SetControlMessage(cf, true); err != nil { + b.Fatal(err) + } + wms := []ipv6.Message{ + { + Buffers: [][]byte{payload}, + Addr: dst, + OOB: cm.Marshal(), + }, + } + rms := []ipv6.Message{ + { + Buffers: [][]byte{bb}, + OOB: ipv6.NewControlMessage(cf), + }, + } + b.Run("Net", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := c.WriteTo(payload, dst); err != nil { + b.Fatal(err) + } + if _, _, err := c.ReadFrom(bb); err != nil { + b.Fatal(err) + } + } + }) + b.Run("ToFrom", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := p.WriteTo(payload, &cm, dst); err != nil { + b.Fatal(err) + } + if _, _, _, err := p.ReadFrom(bb); err != nil { + b.Fatal(err) + } + } + }) + b.Run("Batch", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := p.WriteBatch(wms, 0); err != nil { + b.Fatal(err) + } + if _, err := p.ReadBatch(rms, 0); err != nil { + b.Fatal(err) + } + } + }) + }) + b.Run("IP", func(b *testing.B) { + switch runtime.GOOS { + case "netbsd": + b.Skip("need to configure gre on netbsd") + case "openbsd": + b.Skip("net.inet.gre.allow=0 by default on openbsd") + } + + c, err := net.ListenPacket(fmt.Sprintf("ip6:%d", iana.ProtocolGRE), "::1") + if err != nil { + b.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + dst := c.LocalAddr() + cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagSrc | ipv6.FlagDst | ipv6.FlagInterface | ipv6.FlagPathMTU + if err := p.SetControlMessage(cf, true); err != nil { + b.Fatal(err) + } + wms := []ipv6.Message{ + { + Buffers: [][]byte{datagram}, + Addr: dst, + OOB: cm.Marshal(), + }, + } + rms := []ipv6.Message{ + { + Buffers: [][]byte{bb}, + OOB: ipv6.NewControlMessage(cf), + }, + } + b.Run("Net", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := c.WriteTo(datagram, dst); err != nil { + b.Fatal(err) + } + if _, _, err := c.ReadFrom(bb); err != nil { + b.Fatal(err) + } + } + }) + b.Run("ToFrom", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := p.WriteTo(datagram, &cm, dst); err != nil { + b.Fatal(err) + } + if _, _, _, err := p.ReadFrom(bb); err != nil { + b.Fatal(err) + } + } + }) + b.Run("Batch", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := p.WriteBatch(wms, 0); err != nil { + b.Fatal(err) + } + if _, err := p.ReadBatch(rms, 0); err != nil { + b.Fatal(err) + } + } + }) + }) +} + +func TestPacketConnConcurrentReadWriteUnicast(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + + payload := []byte("HELLO-R-U-THERE") + iph := []byte{ + 0x69, 0x8b, 0xee, 0xf1, 0xca, 0xfe, 0xff, 0x01, + 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + } + greh := []byte{0x00, 0x00, 0x86, 0xdd, 0x00, 0x00, 0x00, 0x00} + datagram := append(greh, append(iph, payload...)...) + + t.Run("UDP", func(t *testing.T) { + c, err := nettest.NewLocalPacketListener("udp6") + if err != nil { + t.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + t.Run("ToFrom", func(t *testing.T) { + testPacketConnConcurrentReadWriteUnicast(t, p, payload, c.LocalAddr(), false) + }) + t.Run("Batch", func(t *testing.T) { + testPacketConnConcurrentReadWriteUnicast(t, p, payload, c.LocalAddr(), true) + }) + }) + t.Run("IP", func(t *testing.T) { + switch runtime.GOOS { + case "netbsd": + t.Skip("need to configure gre on netbsd") + case "openbsd": + t.Skip("net.inet.gre.allow=0 by default on openbsd") + } + + c, err := net.ListenPacket(fmt.Sprintf("ip6:%d", iana.ProtocolGRE), "::1") + if err != nil { + t.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + t.Run("ToFrom", func(t *testing.T) { + testPacketConnConcurrentReadWriteUnicast(t, p, datagram, c.LocalAddr(), false) + }) + t.Run("Batch", func(t *testing.T) { + testPacketConnConcurrentReadWriteUnicast(t, p, datagram, c.LocalAddr(), true) + }) + }) +} + +func testPacketConnConcurrentReadWriteUnicast(t *testing.T, p *ipv6.PacketConn, data []byte, dst net.Addr, batch bool) { + ifi := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagLoopback) + cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagSrc | ipv6.FlagDst | ipv6.FlagInterface | ipv6.FlagPathMTU + + if err := p.SetControlMessage(cf, true); err != nil { // probe before test + if nettest.ProtocolNotSupported(err) { + t.Skipf("not supported on %s", runtime.GOOS) + } + t.Fatal(err) + } + + var wg sync.WaitGroup + reader := func() { + defer wg.Done() + b := make([]byte, 128) + n, cm, _, err := p.ReadFrom(b) + if err != nil { + t.Error(err) + return + } + if !bytes.Equal(b[:n], data) { + t.Errorf("got %#v; want %#v", b[:n], data) + return + } + s := cm.String() + if strings.Contains(s, ",") { + t.Errorf("should be space-separated values: %s", s) + return + } + } + batchReader := func() { + defer wg.Done() + ms := []ipv6.Message{ + { + Buffers: [][]byte{make([]byte, 128)}, + OOB: ipv6.NewControlMessage(cf), + }, + } + n, err := p.ReadBatch(ms, 0) + if err != nil { + t.Error(err) + return + } + if n != len(ms) { + t.Errorf("got %d; want %d", n, len(ms)) + return + } + var cm ipv6.ControlMessage + if err := cm.Parse(ms[0].OOB[:ms[0].NN]); err != nil { + t.Error(err) + return + } + b := ms[0].Buffers[0][:ms[0].N] + if !bytes.Equal(b, data) { + t.Errorf("got %#v; want %#v", b, data) + return + } + s := cm.String() + if strings.Contains(s, ",") { + t.Errorf("should be space-separated values: %s", s) + return + } + } + writer := func(toggle bool) { + defer wg.Done() + cm := ipv6.ControlMessage{ + TrafficClass: iana.DiffServAF11 | iana.CongestionExperienced, + HopLimit: 1, + Src: net.IPv6loopback, + } + if ifi != nil { + cm.IfIndex = ifi.Index + } + if err := p.SetControlMessage(cf, toggle); err != nil { + t.Error(err) + return + } + n, err := p.WriteTo(data, &cm, dst) + if err != nil { + t.Error(err) + return + } + if n != len(data) { + t.Errorf("got %d; want %d", n, len(data)) + return + } + } + batchWriter := func(toggle bool) { + defer wg.Done() + cm := ipv6.ControlMessage{ + TrafficClass: iana.DiffServAF11 | iana.CongestionExperienced, + HopLimit: 1, + Src: net.IPv6loopback, + } + if ifi != nil { + cm.IfIndex = ifi.Index + } + if err := p.SetControlMessage(cf, toggle); err != nil { + t.Error(err) + return + } + ms := []ipv6.Message{ + { + Buffers: [][]byte{data}, + OOB: cm.Marshal(), + Addr: dst, + }, + } + n, err := p.WriteBatch(ms, 0) + if err != nil { + t.Error(err) + return + } + if n != len(ms) { + t.Errorf("got %d; want %d", n, len(ms)) + return + } + if ms[0].N != len(data) { + t.Errorf("got %d; want %d", ms[0].N, len(data)) + return + } + } + + const N = 10 + wg.Add(N) + for i := 0; i < N; i++ { + if batch { + go batchReader() + } else { + go reader() + } + } + wg.Add(2 * N) + for i := 0; i < 2*N; i++ { + if batch { + go batchWriter(i%2 != 0) + } else { + go writer(i%2 != 0) + } + } + wg.Add(N) + for i := 0; i < N; i++ { + if batch { + go batchReader() + } else { + go reader() + } + } + wg.Wait() +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/readwrite_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/readwrite_test.go new file mode 100644 index 0000000..206b915 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/readwrite_test.go @@ -0,0 +1,148 @@ +// 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 ipv6_test + +import ( + "bytes" + "net" + "runtime" + "strings" + "sync" + "testing" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv6" +) + +func BenchmarkReadWriteUnicast(b *testing.B) { + c, err := nettest.NewLocalPacketListener("udp6") + if err != nil { + b.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + + dst := c.LocalAddr() + wb, rb := []byte("HELLO-R-U-THERE"), make([]byte, 128) + + b.Run("NetUDP", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := c.WriteTo(wb, dst); err != nil { + b.Fatal(err) + } + if _, _, err := c.ReadFrom(rb); err != nil { + b.Fatal(err) + } + } + }) + b.Run("IPv6UDP", func(b *testing.B) { + p := ipv6.NewPacketConn(c) + cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagSrc | ipv6.FlagDst | ipv6.FlagInterface | ipv6.FlagPathMTU + if err := p.SetControlMessage(cf, true); err != nil { + b.Fatal(err) + } + cm := ipv6.ControlMessage{ + TrafficClass: iana.DiffServAF11 | iana.CongestionExperienced, + HopLimit: 1, + } + ifi := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagLoopback) + if ifi != nil { + cm.IfIndex = ifi.Index + } + + for i := 0; i < b.N; i++ { + if _, err := p.WriteTo(wb, &cm, dst); err != nil { + b.Fatal(err) + } + if _, _, _, err := p.ReadFrom(rb); err != nil { + b.Fatal(err) + } + } + }) +} + +func TestPacketConnConcurrentReadWriteUnicastUDP(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + + c, err := nettest.NewLocalPacketListener("udp6") + if err != nil { + t.Fatal(err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + defer p.Close() + + dst := c.LocalAddr() + ifi := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagLoopback) + cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagSrc | ipv6.FlagDst | ipv6.FlagInterface | ipv6.FlagPathMTU + wb := []byte("HELLO-R-U-THERE") + + if err := p.SetControlMessage(cf, true); err != nil { // probe before test + if nettest.ProtocolNotSupported(err) { + t.Skipf("not supported on %s", runtime.GOOS) + } + t.Fatal(err) + } + + var wg sync.WaitGroup + reader := func() { + defer wg.Done() + rb := make([]byte, 128) + if n, cm, _, err := p.ReadFrom(rb); err != nil { + t.Error(err) + return + } else if !bytes.Equal(rb[:n], wb) { + t.Errorf("got %v; want %v", rb[:n], wb) + return + } else { + s := cm.String() + if strings.Contains(s, ",") { + t.Errorf("should be space-separated values: %s", s) + } + } + } + writer := func(toggle bool) { + defer wg.Done() + cm := ipv6.ControlMessage{ + TrafficClass: iana.DiffServAF11 | iana.CongestionExperienced, + Src: net.IPv6loopback, + } + if ifi != nil { + cm.IfIndex = ifi.Index + } + if err := p.SetControlMessage(cf, toggle); err != nil { + t.Error(err) + return + } + if n, err := p.WriteTo(wb, &cm, dst); err != nil { + t.Error(err) + return + } else if n != len(wb) { + t.Errorf("got %d; want %d", n, len(wb)) + return + } + } + + const N = 10 + wg.Add(N) + for i := 0; i < N; i++ { + go reader() + } + wg.Add(2 * N) + for i := 0; i < 2*N; i++ { + go writer(i%2 != 0) + } + wg.Add(N) + for i := 0; i < N; i++ { + go reader() + } + wg.Wait() +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sockopt.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sockopt.go new file mode 100644 index 0000000..cc3907d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sockopt.go @@ -0,0 +1,43 @@ +// 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 ipv6 + +import "golang.org/x/net/internal/socket" + +// Sticky socket options +const ( + ssoTrafficClass = iota // header field for unicast packet, RFC 3542 + ssoHopLimit // header field for unicast packet, RFC 3493 + ssoMulticastInterface // outbound interface for multicast packet, RFC 3493 + ssoMulticastHopLimit // header field for multicast packet, RFC 3493 + ssoMulticastLoopback // loopback for multicast packet, RFC 3493 + ssoReceiveTrafficClass // header field on received packet, RFC 3542 + ssoReceiveHopLimit // header field on received packet, RFC 2292 or 3542 + ssoReceivePacketInfo // incbound or outbound packet path, RFC 2292 or 3542 + ssoReceivePathMTU // path mtu, RFC 3542 + ssoPathMTU // path mtu, RFC 3542 + ssoChecksum // packet checksum, RFC 2292 or 3542 + ssoICMPFilter // icmp filter, RFC 2292 or 3542 + ssoJoinGroup // any-source multicast, RFC 3493 + ssoLeaveGroup // any-source multicast, RFC 3493 + ssoJoinSourceGroup // source-specific multicast + ssoLeaveSourceGroup // source-specific multicast + ssoBlockSourceGroup // any-source or source-specific multicast + ssoUnblockSourceGroup // any-source or source-specific multicast + ssoAttachFilter // attach BPF for filtering inbound traffic +) + +// Sticky socket option value types +const ( + ssoTypeIPMreq = iota + 1 + ssoTypeGroupReq + ssoTypeGroupSourceReq +) + +// A sockOpt represents a binding for sticky socket option. +type sockOpt struct { + socket.Option + typ int // hint for option value type; optional +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sockopt_posix.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sockopt_posix.go new file mode 100644 index 0000000..0eac86e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sockopt_posix.go @@ -0,0 +1,87 @@ +// 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows + +package ipv6 + +import ( + "net" + "unsafe" + + "golang.org/x/net/bpf" + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) getMulticastInterface(c *socket.Conn) (*net.Interface, error) { + n, err := so.GetInt(c) + if err != nil { + return nil, err + } + return net.InterfaceByIndex(n) +} + +func (so *sockOpt) setMulticastInterface(c *socket.Conn, ifi *net.Interface) error { + var n int + if ifi != nil { + n = ifi.Index + } + return so.SetInt(c, n) +} + +func (so *sockOpt) getICMPFilter(c *socket.Conn) (*ICMPFilter, error) { + b := make([]byte, so.Len) + n, err := so.Get(c, b) + if err != nil { + return nil, err + } + if n != sizeofICMPv6Filter { + return nil, errOpNoSupport + } + return (*ICMPFilter)(unsafe.Pointer(&b[0])), nil +} + +func (so *sockOpt) setICMPFilter(c *socket.Conn, f *ICMPFilter) error { + b := (*[sizeofICMPv6Filter]byte)(unsafe.Pointer(f))[:sizeofICMPv6Filter] + return so.Set(c, b) +} + +func (so *sockOpt) getMTUInfo(c *socket.Conn) (*net.Interface, int, error) { + b := make([]byte, so.Len) + n, err := so.Get(c, b) + if err != nil { + return nil, 0, err + } + if n != sizeofIPv6Mtuinfo { + return nil, 0, errOpNoSupport + } + mi := (*ipv6Mtuinfo)(unsafe.Pointer(&b[0])) + if mi.Addr.Scope_id == 0 { + return nil, int(mi.Mtu), nil + } + ifi, err := net.InterfaceByIndex(int(mi.Addr.Scope_id)) + if err != nil { + return nil, 0, err + } + return ifi, int(mi.Mtu), nil +} + +func (so *sockOpt) setGroup(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + switch so.typ { + case ssoTypeIPMreq: + return so.setIPMreq(c, ifi, grp) + case ssoTypeGroupReq: + return so.setGroupReq(c, ifi, grp) + default: + return errOpNoSupport + } +} + +func (so *sockOpt) setSourceGroup(c *socket.Conn, ifi *net.Interface, grp, src net.IP) error { + return so.setGroupSourceReq(c, ifi, grp, src) +} + +func (so *sockOpt) setBPF(c *socket.Conn, f []bpf.RawInstruction) error { + return so.setAttachFilter(c, f) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sockopt_stub.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sockopt_stub.go new file mode 100644 index 0000000..1f4a273 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sockopt_stub.go @@ -0,0 +1,46 @@ +// 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. + +// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows + +package ipv6 + +import ( + "net" + + "golang.org/x/net/bpf" + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) getMulticastInterface(c *socket.Conn) (*net.Interface, error) { + return nil, errOpNoSupport +} + +func (so *sockOpt) setMulticastInterface(c *socket.Conn, ifi *net.Interface) error { + return errOpNoSupport +} + +func (so *sockOpt) getICMPFilter(c *socket.Conn) (*ICMPFilter, error) { + return nil, errOpNoSupport +} + +func (so *sockOpt) setICMPFilter(c *socket.Conn, f *ICMPFilter) error { + return errOpNoSupport +} + +func (so *sockOpt) getMTUInfo(c *socket.Conn) (*net.Interface, int, error) { + return nil, 0, errOpNoSupport +} + +func (so *sockOpt) setGroup(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + return errOpNoSupport +} + +func (so *sockOpt) setSourceGroup(c *socket.Conn, ifi *net.Interface, grp, src net.IP) error { + return errOpNoSupport +} + +func (so *sockOpt) setBPF(c *socket.Conn, f []bpf.RawInstruction) error { + return errOpNoSupport +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sockopt_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sockopt_test.go new file mode 100644 index 0000000..774338d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sockopt_test.go @@ -0,0 +1,133 @@ +// 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 ipv6_test + +import ( + "fmt" + "net" + "runtime" + "testing" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv6" +) + +var supportsIPv6 bool = nettest.SupportsIPv6() + +func TestConnInitiatorPathMTU(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + + ln, err := net.Listen("tcp6", "[::1]:0") + if err != nil { + t.Fatal(err) + } + defer ln.Close() + + done := make(chan bool) + go acceptor(t, ln, done) + + c, err := net.Dial("tcp6", ln.Addr().String()) + if err != nil { + t.Fatal(err) + } + defer c.Close() + + if pmtu, err := ipv6.NewConn(c).PathMTU(); err != nil { + switch runtime.GOOS { + case "darwin": // older darwin kernels don't support IPV6_PATHMTU option + t.Logf("not supported on %s", runtime.GOOS) + default: + t.Fatal(err) + } + } else { + t.Logf("path mtu for %v: %v", c.RemoteAddr(), pmtu) + } + + <-done +} + +func TestConnResponderPathMTU(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + + ln, err := net.Listen("tcp6", "[::1]:0") + if err != nil { + t.Fatal(err) + } + defer ln.Close() + + done := make(chan bool) + go connector(t, "tcp6", ln.Addr().String(), done) + + c, err := ln.Accept() + if err != nil { + t.Fatal(err) + } + defer c.Close() + + if pmtu, err := ipv6.NewConn(c).PathMTU(); err != nil { + switch runtime.GOOS { + case "darwin": // older darwin kernels don't support IPV6_PATHMTU option + t.Logf("not supported on %s", runtime.GOOS) + default: + t.Fatal(err) + } + } else { + t.Logf("path mtu for %v: %v", c.RemoteAddr(), pmtu) + } + + <-done +} + +func TestPacketConnChecksum(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + + c, err := net.ListenPacket(fmt.Sprintf("ip6:%d", iana.ProtocolOSPFIGP), "::") // OSPF for IPv6 + if err != nil { + t.Fatal(err) + } + defer c.Close() + + p := ipv6.NewPacketConn(c) + offset := 12 // see RFC 5340 + + for _, toggle := range []bool{false, true} { + if err := p.SetChecksum(toggle, offset); err != nil { + if toggle { + t.Fatalf("ipv6.PacketConn.SetChecksum(%v, %v) failed: %v", toggle, offset, err) + } else { + // Some platforms never allow to disable the kernel + // checksum processing. + t.Logf("ipv6.PacketConn.SetChecksum(%v, %v) failed: %v", toggle, offset, err) + } + } + if on, offset, err := p.Checksum(); err != nil { + t.Fatal(err) + } else { + t.Logf("kernel checksum processing enabled=%v, offset=%v", on, offset) + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_asmreq.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_asmreq.go new file mode 100644 index 0000000..b0510c0 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_asmreq.go @@ -0,0 +1,24 @@ +// 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows + +package ipv6 + +import ( + "net" + "unsafe" + + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) setIPMreq(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + var mreq ipv6Mreq + copy(mreq.Multiaddr[:], grp) + if ifi != nil { + mreq.setIfindex(ifi.Index) + } + b := (*[sizeofIPv6Mreq]byte)(unsafe.Pointer(&mreq))[:sizeofIPv6Mreq] + return so.Set(c, b) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_asmreq_stub.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_asmreq_stub.go new file mode 100644 index 0000000..eece961 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_asmreq_stub.go @@ -0,0 +1,17 @@ +// 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. + +// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows + +package ipv6 + +import ( + "net" + + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) setIPMreq(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + return errOpNoSupport +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_bpf.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_bpf.go new file mode 100644 index 0000000..b2dbcb2 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_bpf.go @@ -0,0 +1,23 @@ +// 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. + +// +build linux + +package ipv6 + +import ( + "unsafe" + + "golang.org/x/net/bpf" + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) setAttachFilter(c *socket.Conn, f []bpf.RawInstruction) error { + prog := sockFProg{ + Len: uint16(len(f)), + Filter: (*sockFilter)(unsafe.Pointer(&f[0])), + } + b := (*[sizeofSockFprog]byte)(unsafe.Pointer(&prog))[:sizeofSockFprog] + return so.Set(c, b) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_bpf_stub.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_bpf_stub.go new file mode 100644 index 0000000..676bea5 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_bpf_stub.go @@ -0,0 +1,16 @@ +// 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. + +// +build !linux + +package ipv6 + +import ( + "golang.org/x/net/bpf" + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) setAttachFilter(c *socket.Conn, f []bpf.RawInstruction) error { + return errOpNoSupport +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_bsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_bsd.go new file mode 100644 index 0000000..e416eaa --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_bsd.go @@ -0,0 +1,57 @@ +// 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. + +// +build dragonfly netbsd openbsd + +package ipv6 + +import ( + "net" + "syscall" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTrafficClass: {sysIPV6_TCLASS, 4, marshalTrafficClass, parseTrafficClass}, + ctlHopLimit: {sysIPV6_HOPLIMIT, 4, marshalHopLimit, parseHopLimit}, + ctlPacketInfo: {sysIPV6_PKTINFO, sizeofInet6Pktinfo, marshalPacketInfo, parsePacketInfo}, + ctlNextHop: {sysIPV6_NEXTHOP, sizeofSockaddrInet6, marshalNextHop, parseNextHop}, + ctlPathMTU: {sysIPV6_PATHMTU, sizeofIPv6Mtuinfo, marshalPathMTU, parsePathMTU}, + } + + sockOpts = map[int]*sockOpt{ + ssoTrafficClass: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_TCLASS, Len: 4}}, + ssoHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_UNICAST_HOPS, Len: 4}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_IF, Len: 4}}, + ssoMulticastHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_HOPS, Len: 4}}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_LOOP, Len: 4}}, + ssoReceiveTrafficClass: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVTCLASS, Len: 4}}, + ssoReceiveHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVHOPLIMIT, Len: 4}}, + ssoReceivePacketInfo: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVPKTINFO, Len: 4}}, + ssoReceivePathMTU: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVPATHMTU, Len: 4}}, + ssoPathMTU: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_PATHMTU, Len: sizeofIPv6Mtuinfo}}, + ssoChecksum: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_CHECKSUM, Len: 4}}, + ssoICMPFilter: {Option: socket.Option{Level: iana.ProtocolIPv6ICMP, Name: sysICMP6_FILTER, Len: sizeofICMPv6Filter}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_JOIN_GROUP, Len: sizeofIPv6Mreq}, typ: ssoTypeIPMreq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_LEAVE_GROUP, Len: sizeofIPv6Mreq}, typ: ssoTypeIPMreq}, + } +) + +func (sa *sockaddrInet6) setSockaddr(ip net.IP, i int) { + sa.Len = sizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], ip) + sa.Scope_id = uint32(i) +} + +func (pi *inet6Pktinfo) setIfindex(i int) { + pi.Ifindex = uint32(i) +} + +func (mreq *ipv6Mreq) setIfindex(i int) { + mreq.Interface = uint32(i) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_darwin.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_darwin.go new file mode 100644 index 0000000..e3d0443 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_darwin.go @@ -0,0 +1,106 @@ +// 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 ipv6 + +import ( + "net" + "strconv" + "strings" + "syscall" + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlHopLimit: {sysIPV6_2292HOPLIMIT, 4, marshal2292HopLimit, parseHopLimit}, + ctlPacketInfo: {sysIPV6_2292PKTINFO, sizeofInet6Pktinfo, marshal2292PacketInfo, parsePacketInfo}, + } + + sockOpts = map[int]*sockOpt{ + ssoHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_UNICAST_HOPS, Len: 4}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_IF, Len: 4}}, + ssoMulticastHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_HOPS, Len: 4}}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_LOOP, Len: 4}}, + ssoReceiveHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_2292HOPLIMIT, Len: 4}}, + ssoReceivePacketInfo: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_2292PKTINFO, Len: 4}}, + ssoChecksum: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_CHECKSUM, Len: 4}}, + ssoICMPFilter: {Option: socket.Option{Level: iana.ProtocolIPv6ICMP, Name: sysICMP6_FILTER, Len: sizeofICMPv6Filter}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_JOIN_GROUP, Len: sizeofIPv6Mreq}, typ: ssoTypeIPMreq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_LEAVE_GROUP, Len: sizeofIPv6Mreq}, typ: ssoTypeIPMreq}, + } +) + +func init() { + // Seems like kern.osreldate is veiled on latest OS X. We use + // kern.osrelease instead. + s, err := syscall.Sysctl("kern.osrelease") + if err != nil { + return + } + ss := strings.Split(s, ".") + if len(ss) == 0 { + return + } + // The IP_PKTINFO and protocol-independent multicast API were + // introduced in OS X 10.7 (Darwin 11). But it looks like + // those features require OS X 10.8 (Darwin 12) or above. + // See http://support.apple.com/kb/HT1633. + if mjver, err := strconv.Atoi(ss[0]); err != nil || mjver < 12 { + return + } + ctlOpts[ctlTrafficClass] = ctlOpt{sysIPV6_TCLASS, 4, marshalTrafficClass, parseTrafficClass} + ctlOpts[ctlHopLimit] = ctlOpt{sysIPV6_HOPLIMIT, 4, marshalHopLimit, parseHopLimit} + ctlOpts[ctlPacketInfo] = ctlOpt{sysIPV6_PKTINFO, sizeofInet6Pktinfo, marshalPacketInfo, parsePacketInfo} + ctlOpts[ctlNextHop] = ctlOpt{sysIPV6_NEXTHOP, sizeofSockaddrInet6, marshalNextHop, parseNextHop} + ctlOpts[ctlPathMTU] = ctlOpt{sysIPV6_PATHMTU, sizeofIPv6Mtuinfo, marshalPathMTU, parsePathMTU} + sockOpts[ssoTrafficClass] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_TCLASS, Len: 4}} + sockOpts[ssoReceiveTrafficClass] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVTCLASS, Len: 4}} + sockOpts[ssoReceiveHopLimit] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVHOPLIMIT, Len: 4}} + sockOpts[ssoReceivePacketInfo] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVPKTINFO, Len: 4}} + sockOpts[ssoReceivePathMTU] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVPATHMTU, Len: 4}} + sockOpts[ssoPathMTU] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_PATHMTU, Len: sizeofIPv6Mtuinfo}} + sockOpts[ssoJoinGroup] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_JOIN_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq} + sockOpts[ssoLeaveGroup] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_LEAVE_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq} + sockOpts[ssoJoinSourceGroup] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_JOIN_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq} + sockOpts[ssoLeaveSourceGroup] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_LEAVE_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq} + sockOpts[ssoBlockSourceGroup] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_BLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq} + sockOpts[ssoUnblockSourceGroup] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_UNBLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq} +} + +func (sa *sockaddrInet6) setSockaddr(ip net.IP, i int) { + sa.Len = sizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], ip) + sa.Scope_id = uint32(i) +} + +func (pi *inet6Pktinfo) setIfindex(i int) { + pi.Ifindex = uint32(i) +} + +func (mreq *ipv6Mreq) setIfindex(i int) { + mreq.Interface = uint32(i) +} + +func (gr *groupReq) setGroup(grp net.IP) { + sa := (*sockaddrInet6)(unsafe.Pointer(uintptr(unsafe.Pointer(gr)) + 4)) + sa.Len = sizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], grp) +} + +func (gsr *groupSourceReq) setSourceGroup(grp, src net.IP) { + sa := (*sockaddrInet6)(unsafe.Pointer(uintptr(unsafe.Pointer(gsr)) + 4)) + sa.Len = sizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], grp) + sa = (*sockaddrInet6)(unsafe.Pointer(uintptr(unsafe.Pointer(gsr)) + 132)) + sa.Len = sizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], src) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_freebsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_freebsd.go new file mode 100644 index 0000000..e9349dc --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_freebsd.go @@ -0,0 +1,92 @@ +// 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 ipv6 + +import ( + "net" + "runtime" + "strings" + "syscall" + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTrafficClass: {sysIPV6_TCLASS, 4, marshalTrafficClass, parseTrafficClass}, + ctlHopLimit: {sysIPV6_HOPLIMIT, 4, marshalHopLimit, parseHopLimit}, + ctlPacketInfo: {sysIPV6_PKTINFO, sizeofInet6Pktinfo, marshalPacketInfo, parsePacketInfo}, + ctlNextHop: {sysIPV6_NEXTHOP, sizeofSockaddrInet6, marshalNextHop, parseNextHop}, + ctlPathMTU: {sysIPV6_PATHMTU, sizeofIPv6Mtuinfo, marshalPathMTU, parsePathMTU}, + } + + sockOpts = map[int]sockOpt{ + ssoTrafficClass: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_TCLASS, Len: 4}}, + ssoHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_UNICAST_HOPS, Len: 4}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_IF, Len: 4}}, + ssoMulticastHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_HOPS, Len: 4}}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_LOOP, Len: 4}}, + ssoReceiveTrafficClass: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVTCLASS, Len: 4}}, + ssoReceiveHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVHOPLIMIT, Len: 4}}, + ssoReceivePacketInfo: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVPKTINFO, Len: 4}}, + ssoReceivePathMTU: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVPATHMTU, Len: 4}}, + ssoPathMTU: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_PATHMTU, Len: sizeofIPv6Mtuinfo}}, + ssoChecksum: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_CHECKSUM, Len: 4}}, + ssoICMPFilter: {Option: socket.Option{Level: iana.ProtocolIPv6ICMP, Name: sysICMP6_FILTER, Len: sizeofICMPv6Filter}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_JOIN_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_LEAVE_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoJoinSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_JOIN_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoLeaveSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_LEAVE_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoBlockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_BLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoUnblockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_UNBLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + } +) + +func init() { + if runtime.GOOS == "freebsd" && runtime.GOARCH == "386" { + archs, _ := syscall.Sysctl("kern.supported_archs") + for _, s := range strings.Fields(archs) { + if s == "amd64" { + freebsd32o64 = true + break + } + } + } +} + +func (sa *sockaddrInet6) setSockaddr(ip net.IP, i int) { + sa.Len = sizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], ip) + sa.Scope_id = uint32(i) +} + +func (pi *inet6Pktinfo) setIfindex(i int) { + pi.Ifindex = uint32(i) +} + +func (mreq *ipv6Mreq) setIfindex(i int) { + mreq.Interface = uint32(i) +} + +func (gr *groupReq) setGroup(grp net.IP) { + sa := (*sockaddrInet6)(unsafe.Pointer(&gr.Group)) + sa.Len = sizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], grp) +} + +func (gsr *groupSourceReq) setSourceGroup(grp, src net.IP) { + sa := (*sockaddrInet6)(unsafe.Pointer(&gsr.Group)) + sa.Len = sizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], grp) + sa = (*sockaddrInet6)(unsafe.Pointer(&gsr.Source)) + sa.Len = sizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], src) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_linux.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_linux.go new file mode 100644 index 0000000..bc21810 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_linux.go @@ -0,0 +1,74 @@ +// 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 ipv6 + +import ( + "net" + "syscall" + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTrafficClass: {sysIPV6_TCLASS, 4, marshalTrafficClass, parseTrafficClass}, + ctlHopLimit: {sysIPV6_HOPLIMIT, 4, marshalHopLimit, parseHopLimit}, + ctlPacketInfo: {sysIPV6_PKTINFO, sizeofInet6Pktinfo, marshalPacketInfo, parsePacketInfo}, + ctlPathMTU: {sysIPV6_PATHMTU, sizeofIPv6Mtuinfo, marshalPathMTU, parsePathMTU}, + } + + sockOpts = map[int]*sockOpt{ + ssoTrafficClass: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_TCLASS, Len: 4}}, + ssoHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_UNICAST_HOPS, Len: 4}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_IF, Len: 4}}, + ssoMulticastHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_HOPS, Len: 4}}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_LOOP, Len: 4}}, + ssoReceiveTrafficClass: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVTCLASS, Len: 4}}, + ssoReceiveHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVHOPLIMIT, Len: 4}}, + ssoReceivePacketInfo: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVPKTINFO, Len: 4}}, + ssoReceivePathMTU: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVPATHMTU, Len: 4}}, + ssoPathMTU: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_PATHMTU, Len: sizeofIPv6Mtuinfo}}, + ssoChecksum: {Option: socket.Option{Level: iana.ProtocolReserved, Name: sysIPV6_CHECKSUM, Len: 4}}, + ssoICMPFilter: {Option: socket.Option{Level: iana.ProtocolIPv6ICMP, Name: sysICMPV6_FILTER, Len: sizeofICMPv6Filter}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_JOIN_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_LEAVE_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoJoinSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_JOIN_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoLeaveSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_LEAVE_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoBlockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_BLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoUnblockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_UNBLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoAttachFilter: {Option: socket.Option{Level: sysSOL_SOCKET, Name: sysSO_ATTACH_FILTER, Len: sizeofSockFprog}}, + } +) + +func (sa *sockaddrInet6) setSockaddr(ip net.IP, i int) { + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], ip) + sa.Scope_id = uint32(i) +} + +func (pi *inet6Pktinfo) setIfindex(i int) { + pi.Ifindex = int32(i) +} + +func (mreq *ipv6Mreq) setIfindex(i int) { + mreq.Ifindex = int32(i) +} + +func (gr *groupReq) setGroup(grp net.IP) { + sa := (*sockaddrInet6)(unsafe.Pointer(&gr.Group)) + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], grp) +} + +func (gsr *groupSourceReq) setSourceGroup(grp, src net.IP) { + sa := (*sockaddrInet6)(unsafe.Pointer(&gsr.Group)) + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], grp) + sa = (*sockaddrInet6)(unsafe.Pointer(&gsr.Source)) + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], src) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_solaris.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_solaris.go new file mode 100644 index 0000000..d348b5f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_solaris.go @@ -0,0 +1,74 @@ +// 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 ipv6 + +import ( + "net" + "syscall" + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTrafficClass: {sysIPV6_TCLASS, 4, marshalTrafficClass, parseTrafficClass}, + ctlHopLimit: {sysIPV6_HOPLIMIT, 4, marshalHopLimit, parseHopLimit}, + ctlPacketInfo: {sysIPV6_PKTINFO, sizeofInet6Pktinfo, marshalPacketInfo, parsePacketInfo}, + ctlNextHop: {sysIPV6_NEXTHOP, sizeofSockaddrInet6, marshalNextHop, parseNextHop}, + ctlPathMTU: {sysIPV6_PATHMTU, sizeofIPv6Mtuinfo, marshalPathMTU, parsePathMTU}, + } + + sockOpts = map[int]*sockOpt{ + ssoTrafficClass: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_TCLASS, Len: 4}}, + ssoHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_UNICAST_HOPS, Len: 4}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_IF, Len: 4}}, + ssoMulticastHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_HOPS, Len: 4}}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_LOOP, Len: 4}}, + ssoReceiveTrafficClass: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVTCLASS, Len: 4}}, + ssoReceiveHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVHOPLIMIT, Len: 4}}, + ssoReceivePacketInfo: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVPKTINFO, Len: 4}}, + ssoReceivePathMTU: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVPATHMTU, Len: 4}}, + ssoPathMTU: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_PATHMTU, Len: sizeofIPv6Mtuinfo}}, + ssoChecksum: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_CHECKSUM, Len: 4}}, + ssoICMPFilter: {Option: socket.Option{Level: iana.ProtocolIPv6ICMP, Name: sysICMP6_FILTER, Len: sizeofICMPv6Filter}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_JOIN_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_LEAVE_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoJoinSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_JOIN_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoLeaveSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_LEAVE_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoBlockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_BLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoUnblockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_UNBLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + } +) + +func (sa *sockaddrInet6) setSockaddr(ip net.IP, i int) { + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], ip) + sa.Scope_id = uint32(i) +} + +func (pi *inet6Pktinfo) setIfindex(i int) { + pi.Ifindex = uint32(i) +} + +func (mreq *ipv6Mreq) setIfindex(i int) { + mreq.Interface = uint32(i) +} + +func (gr *groupReq) setGroup(grp net.IP) { + sa := (*sockaddrInet6)(unsafe.Pointer(uintptr(unsafe.Pointer(gr)) + 4)) + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], grp) +} + +func (gsr *groupSourceReq) setSourceGroup(grp, src net.IP) { + sa := (*sockaddrInet6)(unsafe.Pointer(uintptr(unsafe.Pointer(gsr)) + 4)) + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], grp) + sa = (*sockaddrInet6)(unsafe.Pointer(uintptr(unsafe.Pointer(gsr)) + 260)) + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], src) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_ssmreq.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_ssmreq.go new file mode 100644 index 0000000..add8ccc --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_ssmreq.go @@ -0,0 +1,54 @@ +// 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. + +// +build darwin freebsd linux solaris + +package ipv6 + +import ( + "net" + "unsafe" + + "golang.org/x/net/internal/socket" +) + +var freebsd32o64 bool + +func (so *sockOpt) setGroupReq(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + var gr groupReq + if ifi != nil { + gr.Interface = uint32(ifi.Index) + } + gr.setGroup(grp) + var b []byte + if freebsd32o64 { + var d [sizeofGroupReq + 4]byte + s := (*[sizeofGroupReq]byte)(unsafe.Pointer(&gr)) + copy(d[:4], s[:4]) + copy(d[8:], s[4:]) + b = d[:] + } else { + b = (*[sizeofGroupReq]byte)(unsafe.Pointer(&gr))[:sizeofGroupReq] + } + return so.Set(c, b) +} + +func (so *sockOpt) setGroupSourceReq(c *socket.Conn, ifi *net.Interface, grp, src net.IP) error { + var gsr groupSourceReq + if ifi != nil { + gsr.Interface = uint32(ifi.Index) + } + gsr.setSourceGroup(grp, src) + var b []byte + if freebsd32o64 { + var d [sizeofGroupSourceReq + 4]byte + s := (*[sizeofGroupSourceReq]byte)(unsafe.Pointer(&gsr)) + copy(d[:4], s[:4]) + copy(d[8:], s[4:]) + b = d[:] + } else { + b = (*[sizeofGroupSourceReq]byte)(unsafe.Pointer(&gsr))[:sizeofGroupSourceReq] + } + return so.Set(c, b) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_ssmreq_stub.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_ssmreq_stub.go new file mode 100644 index 0000000..581ee49 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_ssmreq_stub.go @@ -0,0 +1,21 @@ +// 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. + +// +build !darwin,!freebsd,!linux,!solaris + +package ipv6 + +import ( + "net" + + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) setGroupReq(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + return errOpNoSupport +} + +func (so *sockOpt) setGroupSourceReq(c *socket.Conn, ifi *net.Interface, grp, src net.IP) error { + return errOpNoSupport +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_stub.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_stub.go new file mode 100644 index 0000000..b845388 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_stub.go @@ -0,0 +1,13 @@ +// 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. + +// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows + +package ipv6 + +var ( + ctlOpts = [ctlMax]ctlOpt{} + + sockOpts = map[int]*sockOpt{} +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_windows.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_windows.go new file mode 100644 index 0000000..fc36b01 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/sys_windows.go @@ -0,0 +1,75 @@ +// 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 ipv6 + +import ( + "net" + "syscall" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +const ( + // See ws2tcpip.h. + sysIPV6_UNICAST_HOPS = 0x4 + sysIPV6_MULTICAST_IF = 0x9 + sysIPV6_MULTICAST_HOPS = 0xa + sysIPV6_MULTICAST_LOOP = 0xb + sysIPV6_JOIN_GROUP = 0xc + sysIPV6_LEAVE_GROUP = 0xd + sysIPV6_PKTINFO = 0x13 + + sizeofSockaddrInet6 = 0x1c + + sizeofIPv6Mreq = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofICMPv6Filter = 0 +) + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type icmpv6Filter struct { + // TODO(mikio): implement this +} + +var ( + ctlOpts = [ctlMax]ctlOpt{} + + sockOpts = map[int]*sockOpt{ + ssoHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_UNICAST_HOPS, Len: 4}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_IF, Len: 4}}, + ssoMulticastHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_HOPS, Len: 4}}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_LOOP, Len: 4}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_JOIN_GROUP, Len: sizeofIPv6Mreq}, typ: ssoTypeIPMreq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_LEAVE_GROUP, Len: sizeofIPv6Mreq}, typ: ssoTypeIPMreq}, + } +) + +func (sa *sockaddrInet6) setSockaddr(ip net.IP, i int) { + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], ip) + sa.Scope_id = uint32(i) +} + +func (mreq *ipv6Mreq) setIfindex(i int) { + mreq.Interface = uint32(i) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/unicast_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/unicast_test.go new file mode 100644 index 0000000..a0b7d95 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/unicast_test.go @@ -0,0 +1,184 @@ +// 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 ipv6_test + +import ( + "bytes" + "net" + "os" + "runtime" + "testing" + "time" + + "golang.org/x/net/icmp" + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv6" +) + +func TestPacketConnReadWriteUnicastUDP(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + + c, err := nettest.NewLocalPacketListener("udp6") + if err != nil { + t.Fatal(err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + defer p.Close() + + dst := c.LocalAddr() + cm := ipv6.ControlMessage{ + TrafficClass: iana.DiffServAF11 | iana.CongestionExperienced, + Src: net.IPv6loopback, + } + cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagSrc | ipv6.FlagDst | ipv6.FlagInterface | ipv6.FlagPathMTU + ifi := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagLoopback) + if ifi != nil { + cm.IfIndex = ifi.Index + } + wb := []byte("HELLO-R-U-THERE") + + for i, toggle := range []bool{true, false, true} { + if err := p.SetControlMessage(cf, toggle); err != nil { + if nettest.ProtocolNotSupported(err) { + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + cm.HopLimit = i + 1 + if err := p.SetWriteDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { + t.Fatal(err) + } + if n, err := p.WriteTo(wb, &cm, dst); err != nil { + t.Fatal(err) + } else if n != len(wb) { + t.Fatalf("got %v; want %v", n, len(wb)) + } + rb := make([]byte, 128) + if err := p.SetReadDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { + t.Fatal(err) + } + if n, _, _, err := p.ReadFrom(rb); err != nil { + t.Fatal(err) + } else if !bytes.Equal(rb[:n], wb) { + t.Fatalf("got %v; want %v", rb[:n], wb) + } + } +} + +func TestPacketConnReadWriteUnicastICMP(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + + c, err := net.ListenPacket("ip6:ipv6-icmp", "::1") + if err != nil { + t.Fatal(err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + defer p.Close() + + dst, err := net.ResolveIPAddr("ip6", "::1") + if err != nil { + t.Fatal(err) + } + + pshicmp := icmp.IPv6PseudoHeader(c.LocalAddr().(*net.IPAddr).IP, dst.IP) + cm := ipv6.ControlMessage{ + TrafficClass: iana.DiffServAF11 | iana.CongestionExperienced, + Src: net.IPv6loopback, + } + cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagSrc | ipv6.FlagDst | ipv6.FlagInterface | ipv6.FlagPathMTU + ifi := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagLoopback) + if ifi != nil { + cm.IfIndex = ifi.Index + } + + var f ipv6.ICMPFilter + f.SetAll(true) + f.Accept(ipv6.ICMPTypeEchoReply) + if err := p.SetICMPFilter(&f); err != nil { + t.Fatal(err) + } + + var psh []byte + for i, toggle := range []bool{true, false, true} { + if toggle { + psh = nil + if err := p.SetChecksum(true, 2); err != nil { + // Solaris never allows to modify + // ICMP properties. + if runtime.GOOS != "solaris" { + t.Fatal(err) + } + } + } else { + psh = pshicmp + // Some platforms never allow to disable the + // kernel checksum processing. + p.SetChecksum(false, -1) + } + wb, err := (&icmp.Message{ + Type: ipv6.ICMPTypeEchoRequest, Code: 0, + Body: &icmp.Echo{ + ID: os.Getpid() & 0xffff, Seq: i + 1, + Data: []byte("HELLO-R-U-THERE"), + }, + }).Marshal(psh) + if err != nil { + t.Fatal(err) + } + if err := p.SetControlMessage(cf, toggle); err != nil { + if nettest.ProtocolNotSupported(err) { + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + cm.HopLimit = i + 1 + if err := p.SetWriteDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { + t.Fatal(err) + } + if n, err := p.WriteTo(wb, &cm, dst); err != nil { + t.Fatal(err) + } else if n != len(wb) { + t.Fatalf("got %v; want %v", n, len(wb)) + } + rb := make([]byte, 128) + if err := p.SetReadDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { + t.Fatal(err) + } + if n, _, _, err := p.ReadFrom(rb); err != nil { + switch runtime.GOOS { + case "darwin": // older darwin kernels have some limitation on receiving icmp packet through raw socket + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } else { + if m, err := icmp.ParseMessage(iana.ProtocolIPv6ICMP, rb[:n]); err != nil { + t.Fatal(err) + } else if m.Type != ipv6.ICMPTypeEchoReply || m.Code != 0 { + t.Fatalf("got type=%v, code=%v; want type=%v, code=%v", m.Type, m.Code, ipv6.ICMPTypeEchoReply, 0) + } + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/unicastsockopt_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/unicastsockopt_test.go new file mode 100644 index 0000000..e175dcc --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/unicastsockopt_test.go @@ -0,0 +1,120 @@ +// 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 ipv6_test + +import ( + "net" + "runtime" + "testing" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv6" +) + +func TestConnUnicastSocketOptions(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + + ln, err := net.Listen("tcp6", "[::1]:0") + if err != nil { + t.Fatal(err) + } + defer ln.Close() + + errc := make(chan error, 1) + go func() { + c, err := ln.Accept() + if err != nil { + errc <- err + return + } + errc <- c.Close() + }() + + c, err := net.Dial("tcp6", ln.Addr().String()) + if err != nil { + t.Fatal(err) + } + defer c.Close() + + testUnicastSocketOptions(t, ipv6.NewConn(c)) + + if err := <-errc; err != nil { + t.Errorf("server: %v", err) + } +} + +var packetConnUnicastSocketOptionTests = []struct { + net, proto, addr string +}{ + {"udp6", "", "[::1]:0"}, + {"ip6", ":ipv6-icmp", "::1"}, +} + +func TestPacketConnUnicastSocketOptions(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + + m, ok := nettest.SupportsRawIPSocket() + for _, tt := range packetConnUnicastSocketOptionTests { + if tt.net == "ip6" && !ok { + t.Log(m) + continue + } + c, err := net.ListenPacket(tt.net+tt.proto, tt.addr) + if err != nil { + t.Fatal(err) + } + defer c.Close() + + testUnicastSocketOptions(t, ipv6.NewPacketConn(c)) + } +} + +type testIPv6UnicastConn interface { + TrafficClass() (int, error) + SetTrafficClass(int) error + HopLimit() (int, error) + SetHopLimit(int) error +} + +func testUnicastSocketOptions(t *testing.T, c testIPv6UnicastConn) { + tclass := iana.DiffServCS0 | iana.NotECNTransport + if err := c.SetTrafficClass(tclass); err != nil { + switch runtime.GOOS { + case "darwin": // older darwin kernels don't support IPV6_TCLASS option + t.Logf("not supported on %s", runtime.GOOS) + goto next + } + t.Fatal(err) + } + if v, err := c.TrafficClass(); err != nil { + t.Fatal(err) + } else if v != tclass { + t.Fatalf("got %v; want %v", v, tclass) + } + +next: + hoplim := 255 + if err := c.SetHopLimit(hoplim); err != nil { + t.Fatal(err) + } + if v, err := c.HopLimit(); err != nil { + t.Fatal(err) + } else if v != hoplim { + t.Fatalf("got %v; want %v", v, hoplim) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_darwin.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_darwin.go new file mode 100644 index 0000000..6aab1df --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_darwin.go @@ -0,0 +1,131 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_darwin.go + +package ipv6 + +const ( + sysIPV6_UNICAST_HOPS = 0x4 + sysIPV6_MULTICAST_IF = 0x9 + sysIPV6_MULTICAST_HOPS = 0xa + sysIPV6_MULTICAST_LOOP = 0xb + sysIPV6_JOIN_GROUP = 0xc + sysIPV6_LEAVE_GROUP = 0xd + + sysIPV6_PORTRANGE = 0xe + sysICMP6_FILTER = 0x12 + sysIPV6_2292PKTINFO = 0x13 + sysIPV6_2292HOPLIMIT = 0x14 + sysIPV6_2292NEXTHOP = 0x15 + sysIPV6_2292HOPOPTS = 0x16 + sysIPV6_2292DSTOPTS = 0x17 + sysIPV6_2292RTHDR = 0x18 + + sysIPV6_2292PKTOPTIONS = 0x19 + + sysIPV6_CHECKSUM = 0x1a + sysIPV6_V6ONLY = 0x1b + + sysIPV6_IPSEC_POLICY = 0x1c + + sysIPV6_RECVTCLASS = 0x23 + sysIPV6_TCLASS = 0x24 + + sysIPV6_RTHDRDSTOPTS = 0x39 + + sysIPV6_RECVPKTINFO = 0x3d + + sysIPV6_RECVHOPLIMIT = 0x25 + sysIPV6_RECVRTHDR = 0x26 + sysIPV6_RECVHOPOPTS = 0x27 + sysIPV6_RECVDSTOPTS = 0x28 + + sysIPV6_USE_MIN_MTU = 0x2a + sysIPV6_RECVPATHMTU = 0x2b + + sysIPV6_PATHMTU = 0x2c + + sysIPV6_PKTINFO = 0x2e + sysIPV6_HOPLIMIT = 0x2f + sysIPV6_NEXTHOP = 0x30 + sysIPV6_HOPOPTS = 0x31 + sysIPV6_DSTOPTS = 0x32 + sysIPV6_RTHDR = 0x33 + + sysIPV6_AUTOFLOWLABEL = 0x3b + + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_PREFER_TEMPADDR = 0x3f + + sysIPV6_MSFILTER = 0x4a + sysMCAST_JOIN_GROUP = 0x50 + sysMCAST_LEAVE_GROUP = 0x51 + sysMCAST_JOIN_SOURCE_GROUP = 0x52 + sysMCAST_LEAVE_SOURCE_GROUP = 0x53 + sysMCAST_BLOCK_SOURCE = 0x54 + sysMCAST_UNBLOCK_SOURCE = 0x55 + + sysIPV6_BOUND_IF = 0x7d + + sysIPV6_PORTRANGE_DEFAULT = 0x0 + sysIPV6_PORTRANGE_HIGH = 0x1 + sysIPV6_PORTRANGE_LOW = 0x2 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 + + sizeofICMPv6Filter = 0x20 +) + +type sockaddrStorage struct { + Len uint8 + Family uint8 + X__ss_pad1 [6]int8 + X__ss_align int64 + X__ss_pad2 [112]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type icmpv6Filter struct { + Filt [8]uint32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [128]byte +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [128]byte + Pad_cgo_1 [128]byte +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_dragonfly.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_dragonfly.go new file mode 100644 index 0000000..d2de804 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_dragonfly.go @@ -0,0 +1,88 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_dragonfly.go + +package ipv6 + +const ( + sysIPV6_UNICAST_HOPS = 0x4 + sysIPV6_MULTICAST_IF = 0x9 + sysIPV6_MULTICAST_HOPS = 0xa + sysIPV6_MULTICAST_LOOP = 0xb + sysIPV6_JOIN_GROUP = 0xc + sysIPV6_LEAVE_GROUP = 0xd + sysIPV6_PORTRANGE = 0xe + sysICMP6_FILTER = 0x12 + + sysIPV6_CHECKSUM = 0x1a + sysIPV6_V6ONLY = 0x1b + + sysIPV6_IPSEC_POLICY = 0x1c + + sysIPV6_RTHDRDSTOPTS = 0x23 + sysIPV6_RECVPKTINFO = 0x24 + sysIPV6_RECVHOPLIMIT = 0x25 + sysIPV6_RECVRTHDR = 0x26 + sysIPV6_RECVHOPOPTS = 0x27 + sysIPV6_RECVDSTOPTS = 0x28 + + sysIPV6_USE_MIN_MTU = 0x2a + sysIPV6_RECVPATHMTU = 0x2b + + sysIPV6_PATHMTU = 0x2c + + sysIPV6_PKTINFO = 0x2e + sysIPV6_HOPLIMIT = 0x2f + sysIPV6_NEXTHOP = 0x30 + sysIPV6_HOPOPTS = 0x31 + sysIPV6_DSTOPTS = 0x32 + sysIPV6_RTHDR = 0x33 + + sysIPV6_RECVTCLASS = 0x39 + + sysIPV6_AUTOFLOWLABEL = 0x3b + + sysIPV6_TCLASS = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_PREFER_TEMPADDR = 0x3f + + sysIPV6_PORTRANGE_DEFAULT = 0x0 + sysIPV6_PORTRANGE_HIGH = 0x1 + sysIPV6_PORTRANGE_LOW = 0x2 + + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + + sizeofIPv6Mreq = 0x14 + + sizeofICMPv6Filter = 0x20 +) + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type icmpv6Filter struct { + Filt [8]uint32 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_freebsd_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_freebsd_386.go new file mode 100644 index 0000000..919e572 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_freebsd_386.go @@ -0,0 +1,122 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_freebsd.go + +package ipv6 + +const ( + sysIPV6_UNICAST_HOPS = 0x4 + sysIPV6_MULTICAST_IF = 0x9 + sysIPV6_MULTICAST_HOPS = 0xa + sysIPV6_MULTICAST_LOOP = 0xb + sysIPV6_JOIN_GROUP = 0xc + sysIPV6_LEAVE_GROUP = 0xd + sysIPV6_PORTRANGE = 0xe + sysICMP6_FILTER = 0x12 + + sysIPV6_CHECKSUM = 0x1a + sysIPV6_V6ONLY = 0x1b + + sysIPV6_IPSEC_POLICY = 0x1c + + sysIPV6_RTHDRDSTOPTS = 0x23 + + sysIPV6_RECVPKTINFO = 0x24 + sysIPV6_RECVHOPLIMIT = 0x25 + sysIPV6_RECVRTHDR = 0x26 + sysIPV6_RECVHOPOPTS = 0x27 + sysIPV6_RECVDSTOPTS = 0x28 + + sysIPV6_USE_MIN_MTU = 0x2a + sysIPV6_RECVPATHMTU = 0x2b + + sysIPV6_PATHMTU = 0x2c + + sysIPV6_PKTINFO = 0x2e + sysIPV6_HOPLIMIT = 0x2f + sysIPV6_NEXTHOP = 0x30 + sysIPV6_HOPOPTS = 0x31 + sysIPV6_DSTOPTS = 0x32 + sysIPV6_RTHDR = 0x33 + + sysIPV6_RECVTCLASS = 0x39 + + sysIPV6_AUTOFLOWLABEL = 0x3b + + sysIPV6_TCLASS = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_PREFER_TEMPADDR = 0x3f + + sysIPV6_BINDANY = 0x40 + + sysIPV6_MSFILTER = 0x4a + + sysMCAST_JOIN_GROUP = 0x50 + sysMCAST_LEAVE_GROUP = 0x51 + sysMCAST_JOIN_SOURCE_GROUP = 0x52 + sysMCAST_LEAVE_SOURCE_GROUP = 0x53 + sysMCAST_BLOCK_SOURCE = 0x54 + sysMCAST_UNBLOCK_SOURCE = 0x55 + + sysIPV6_PORTRANGE_DEFAULT = 0x0 + sysIPV6_PORTRANGE_HIGH = 0x1 + sysIPV6_PORTRANGE_LOW = 0x2 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 + + sizeofICMPv6Filter = 0x20 +) + +type sockaddrStorage struct { + Len uint8 + Family uint8 + X__ss_pad1 [6]int8 + X__ss_align int64 + X__ss_pad2 [112]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type groupReq struct { + Interface uint32 + Group sockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Group sockaddrStorage + Source sockaddrStorage +} + +type icmpv6Filter struct { + Filt [8]uint32 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_freebsd_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_freebsd_amd64.go new file mode 100644 index 0000000..cb8141f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_freebsd_amd64.go @@ -0,0 +1,124 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_freebsd.go + +package ipv6 + +const ( + sysIPV6_UNICAST_HOPS = 0x4 + sysIPV6_MULTICAST_IF = 0x9 + sysIPV6_MULTICAST_HOPS = 0xa + sysIPV6_MULTICAST_LOOP = 0xb + sysIPV6_JOIN_GROUP = 0xc + sysIPV6_LEAVE_GROUP = 0xd + sysIPV6_PORTRANGE = 0xe + sysICMP6_FILTER = 0x12 + + sysIPV6_CHECKSUM = 0x1a + sysIPV6_V6ONLY = 0x1b + + sysIPV6_IPSEC_POLICY = 0x1c + + sysIPV6_RTHDRDSTOPTS = 0x23 + + sysIPV6_RECVPKTINFO = 0x24 + sysIPV6_RECVHOPLIMIT = 0x25 + sysIPV6_RECVRTHDR = 0x26 + sysIPV6_RECVHOPOPTS = 0x27 + sysIPV6_RECVDSTOPTS = 0x28 + + sysIPV6_USE_MIN_MTU = 0x2a + sysIPV6_RECVPATHMTU = 0x2b + + sysIPV6_PATHMTU = 0x2c + + sysIPV6_PKTINFO = 0x2e + sysIPV6_HOPLIMIT = 0x2f + sysIPV6_NEXTHOP = 0x30 + sysIPV6_HOPOPTS = 0x31 + sysIPV6_DSTOPTS = 0x32 + sysIPV6_RTHDR = 0x33 + + sysIPV6_RECVTCLASS = 0x39 + + sysIPV6_AUTOFLOWLABEL = 0x3b + + sysIPV6_TCLASS = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_PREFER_TEMPADDR = 0x3f + + sysIPV6_BINDANY = 0x40 + + sysIPV6_MSFILTER = 0x4a + + sysMCAST_JOIN_GROUP = 0x50 + sysMCAST_LEAVE_GROUP = 0x51 + sysMCAST_JOIN_SOURCE_GROUP = 0x52 + sysMCAST_LEAVE_SOURCE_GROUP = 0x53 + sysMCAST_BLOCK_SOURCE = 0x54 + sysMCAST_UNBLOCK_SOURCE = 0x55 + + sysIPV6_PORTRANGE_DEFAULT = 0x0 + sysIPV6_PORTRANGE_HIGH = 0x1 + sysIPV6_PORTRANGE_LOW = 0x2 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPv6Filter = 0x20 +) + +type sockaddrStorage struct { + Len uint8 + Family uint8 + X__ss_pad1 [6]int8 + X__ss_align int64 + X__ss_pad2 [112]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sockaddrStorage + Source sockaddrStorage +} + +type icmpv6Filter struct { + Filt [8]uint32 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_freebsd_arm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_freebsd_arm.go new file mode 100644 index 0000000..cb8141f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_freebsd_arm.go @@ -0,0 +1,124 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_freebsd.go + +package ipv6 + +const ( + sysIPV6_UNICAST_HOPS = 0x4 + sysIPV6_MULTICAST_IF = 0x9 + sysIPV6_MULTICAST_HOPS = 0xa + sysIPV6_MULTICAST_LOOP = 0xb + sysIPV6_JOIN_GROUP = 0xc + sysIPV6_LEAVE_GROUP = 0xd + sysIPV6_PORTRANGE = 0xe + sysICMP6_FILTER = 0x12 + + sysIPV6_CHECKSUM = 0x1a + sysIPV6_V6ONLY = 0x1b + + sysIPV6_IPSEC_POLICY = 0x1c + + sysIPV6_RTHDRDSTOPTS = 0x23 + + sysIPV6_RECVPKTINFO = 0x24 + sysIPV6_RECVHOPLIMIT = 0x25 + sysIPV6_RECVRTHDR = 0x26 + sysIPV6_RECVHOPOPTS = 0x27 + sysIPV6_RECVDSTOPTS = 0x28 + + sysIPV6_USE_MIN_MTU = 0x2a + sysIPV6_RECVPATHMTU = 0x2b + + sysIPV6_PATHMTU = 0x2c + + sysIPV6_PKTINFO = 0x2e + sysIPV6_HOPLIMIT = 0x2f + sysIPV6_NEXTHOP = 0x30 + sysIPV6_HOPOPTS = 0x31 + sysIPV6_DSTOPTS = 0x32 + sysIPV6_RTHDR = 0x33 + + sysIPV6_RECVTCLASS = 0x39 + + sysIPV6_AUTOFLOWLABEL = 0x3b + + sysIPV6_TCLASS = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_PREFER_TEMPADDR = 0x3f + + sysIPV6_BINDANY = 0x40 + + sysIPV6_MSFILTER = 0x4a + + sysMCAST_JOIN_GROUP = 0x50 + sysMCAST_LEAVE_GROUP = 0x51 + sysMCAST_JOIN_SOURCE_GROUP = 0x52 + sysMCAST_LEAVE_SOURCE_GROUP = 0x53 + sysMCAST_BLOCK_SOURCE = 0x54 + sysMCAST_UNBLOCK_SOURCE = 0x55 + + sysIPV6_PORTRANGE_DEFAULT = 0x0 + sysIPV6_PORTRANGE_HIGH = 0x1 + sysIPV6_PORTRANGE_LOW = 0x2 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPv6Filter = 0x20 +) + +type sockaddrStorage struct { + Len uint8 + Family uint8 + X__ss_pad1 [6]int8 + X__ss_align int64 + X__ss_pad2 [112]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sockaddrStorage + Source sockaddrStorage +} + +type icmpv6Filter struct { + Filt [8]uint32 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_386.go new file mode 100644 index 0000000..73aa8c6 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_386.go @@ -0,0 +1,170 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 + + sizeofICMPv6Filter = 0x20 + + sizeofSockFprog = 0x8 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type groupReq struct { + Interface uint32 + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpv6Filter struct { + Data [8]uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [2]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_amd64.go new file mode 100644 index 0000000..b64f015 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_amd64.go @@ -0,0 +1,172 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPv6Filter = 0x20 + + sizeofSockFprog = 0x10 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpv6Filter struct { + Data [8]uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_arm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_arm.go new file mode 100644 index 0000000..73aa8c6 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_arm.go @@ -0,0 +1,170 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 + + sizeofICMPv6Filter = 0x20 + + sizeofSockFprog = 0x8 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type groupReq struct { + Interface uint32 + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpv6Filter struct { + Data [8]uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [2]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_arm64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_arm64.go new file mode 100644 index 0000000..b64f015 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_arm64.go @@ -0,0 +1,172 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPv6Filter = 0x20 + + sizeofSockFprog = 0x10 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpv6Filter struct { + Data [8]uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_mips.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_mips.go new file mode 100644 index 0000000..73aa8c6 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_mips.go @@ -0,0 +1,170 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 + + sizeofICMPv6Filter = 0x20 + + sizeofSockFprog = 0x8 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type groupReq struct { + Interface uint32 + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpv6Filter struct { + Data [8]uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [2]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_mips64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_mips64.go new file mode 100644 index 0000000..b64f015 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_mips64.go @@ -0,0 +1,172 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPv6Filter = 0x20 + + sizeofSockFprog = 0x10 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpv6Filter struct { + Data [8]uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_mips64le.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_mips64le.go new file mode 100644 index 0000000..b64f015 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_mips64le.go @@ -0,0 +1,172 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPv6Filter = 0x20 + + sizeofSockFprog = 0x10 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpv6Filter struct { + Data [8]uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_mipsle.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_mipsle.go new file mode 100644 index 0000000..73aa8c6 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_mipsle.go @@ -0,0 +1,170 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 + + sizeofICMPv6Filter = 0x20 + + sizeofSockFprog = 0x8 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type groupReq struct { + Interface uint32 + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpv6Filter struct { + Data [8]uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [2]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_ppc.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_ppc.go new file mode 100644 index 0000000..c9bf6a8 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_ppc.go @@ -0,0 +1,170 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 + + sizeofICMPv6Filter = 0x20 + + sizeofSockFprog = 0x8 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type groupReq struct { + Interface uint32 + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpv6Filter struct { + Data [8]uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [2]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64.go new file mode 100644 index 0000000..b64f015 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64.go @@ -0,0 +1,172 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPv6Filter = 0x20 + + sizeofSockFprog = 0x10 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpv6Filter struct { + Data [8]uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64le.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64le.go new file mode 100644 index 0000000..b64f015 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64le.go @@ -0,0 +1,172 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPv6Filter = 0x20 + + sizeofSockFprog = 0x10 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpv6Filter struct { + Data [8]uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_s390x.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_s390x.go new file mode 100644 index 0000000..b64f015 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_linux_s390x.go @@ -0,0 +1,172 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPv6Filter = 0x20 + + sizeofSockFprog = 0x10 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpv6Filter struct { + Data [8]uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_netbsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_netbsd.go new file mode 100644 index 0000000..bcada13 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_netbsd.go @@ -0,0 +1,84 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_netbsd.go + +package ipv6 + +const ( + sysIPV6_UNICAST_HOPS = 0x4 + sysIPV6_MULTICAST_IF = 0x9 + sysIPV6_MULTICAST_HOPS = 0xa + sysIPV6_MULTICAST_LOOP = 0xb + sysIPV6_JOIN_GROUP = 0xc + sysIPV6_LEAVE_GROUP = 0xd + sysIPV6_PORTRANGE = 0xe + sysICMP6_FILTER = 0x12 + + sysIPV6_CHECKSUM = 0x1a + sysIPV6_V6ONLY = 0x1b + + sysIPV6_IPSEC_POLICY = 0x1c + + sysIPV6_RTHDRDSTOPTS = 0x23 + + sysIPV6_RECVPKTINFO = 0x24 + sysIPV6_RECVHOPLIMIT = 0x25 + sysIPV6_RECVRTHDR = 0x26 + sysIPV6_RECVHOPOPTS = 0x27 + sysIPV6_RECVDSTOPTS = 0x28 + + sysIPV6_USE_MIN_MTU = 0x2a + sysIPV6_RECVPATHMTU = 0x2b + sysIPV6_PATHMTU = 0x2c + + sysIPV6_PKTINFO = 0x2e + sysIPV6_HOPLIMIT = 0x2f + sysIPV6_NEXTHOP = 0x30 + sysIPV6_HOPOPTS = 0x31 + sysIPV6_DSTOPTS = 0x32 + sysIPV6_RTHDR = 0x33 + + sysIPV6_RECVTCLASS = 0x39 + + sysIPV6_TCLASS = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_PORTRANGE_DEFAULT = 0x0 + sysIPV6_PORTRANGE_HIGH = 0x1 + sysIPV6_PORTRANGE_LOW = 0x2 + + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + + sizeofIPv6Mreq = 0x14 + + sizeofICMPv6Filter = 0x20 +) + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type icmpv6Filter struct { + Filt [8]uint32 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_openbsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_openbsd.go new file mode 100644 index 0000000..86cf3c6 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_openbsd.go @@ -0,0 +1,93 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_openbsd.go + +package ipv6 + +const ( + sysIPV6_UNICAST_HOPS = 0x4 + sysIPV6_MULTICAST_IF = 0x9 + sysIPV6_MULTICAST_HOPS = 0xa + sysIPV6_MULTICAST_LOOP = 0xb + sysIPV6_JOIN_GROUP = 0xc + sysIPV6_LEAVE_GROUP = 0xd + sysIPV6_PORTRANGE = 0xe + sysICMP6_FILTER = 0x12 + + sysIPV6_CHECKSUM = 0x1a + sysIPV6_V6ONLY = 0x1b + + sysIPV6_RTHDRDSTOPTS = 0x23 + + sysIPV6_RECVPKTINFO = 0x24 + sysIPV6_RECVHOPLIMIT = 0x25 + sysIPV6_RECVRTHDR = 0x26 + sysIPV6_RECVHOPOPTS = 0x27 + sysIPV6_RECVDSTOPTS = 0x28 + + sysIPV6_USE_MIN_MTU = 0x2a + sysIPV6_RECVPATHMTU = 0x2b + + sysIPV6_PATHMTU = 0x2c + + sysIPV6_PKTINFO = 0x2e + sysIPV6_HOPLIMIT = 0x2f + sysIPV6_NEXTHOP = 0x30 + sysIPV6_HOPOPTS = 0x31 + sysIPV6_DSTOPTS = 0x32 + sysIPV6_RTHDR = 0x33 + + sysIPV6_AUTH_LEVEL = 0x35 + sysIPV6_ESP_TRANS_LEVEL = 0x36 + sysIPV6_ESP_NETWORK_LEVEL = 0x37 + sysIPSEC6_OUTSA = 0x38 + sysIPV6_RECVTCLASS = 0x39 + + sysIPV6_AUTOFLOWLABEL = 0x3b + sysIPV6_IPCOMP_LEVEL = 0x3c + + sysIPV6_TCLASS = 0x3d + sysIPV6_DONTFRAG = 0x3e + sysIPV6_PIPEX = 0x3f + + sysIPV6_RTABLE = 0x1021 + + sysIPV6_PORTRANGE_DEFAULT = 0x0 + sysIPV6_PORTRANGE_HIGH = 0x1 + sysIPV6_PORTRANGE_LOW = 0x2 + + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + + sizeofIPv6Mreq = 0x14 + + sizeofICMPv6Filter = 0x20 +) + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type icmpv6Filter struct { + Filt [8]uint32 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_solaris.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_solaris.go new file mode 100644 index 0000000..cf1837d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/ipv6/zsys_solaris.go @@ -0,0 +1,131 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_solaris.go + +package ipv6 + +const ( + sysIPV6_UNICAST_HOPS = 0x5 + sysIPV6_MULTICAST_IF = 0x6 + sysIPV6_MULTICAST_HOPS = 0x7 + sysIPV6_MULTICAST_LOOP = 0x8 + sysIPV6_JOIN_GROUP = 0x9 + sysIPV6_LEAVE_GROUP = 0xa + + sysIPV6_PKTINFO = 0xb + + sysIPV6_HOPLIMIT = 0xc + sysIPV6_NEXTHOP = 0xd + sysIPV6_HOPOPTS = 0xe + sysIPV6_DSTOPTS = 0xf + + sysIPV6_RTHDR = 0x10 + sysIPV6_RTHDRDSTOPTS = 0x11 + + sysIPV6_RECVPKTINFO = 0x12 + sysIPV6_RECVHOPLIMIT = 0x13 + sysIPV6_RECVHOPOPTS = 0x14 + + sysIPV6_RECVRTHDR = 0x16 + + sysIPV6_RECVRTHDRDSTOPTS = 0x17 + + sysIPV6_CHECKSUM = 0x18 + sysIPV6_RECVTCLASS = 0x19 + sysIPV6_USE_MIN_MTU = 0x20 + sysIPV6_DONTFRAG = 0x21 + sysIPV6_SEC_OPT = 0x22 + sysIPV6_SRC_PREFERENCES = 0x23 + sysIPV6_RECVPATHMTU = 0x24 + sysIPV6_PATHMTU = 0x25 + sysIPV6_TCLASS = 0x26 + sysIPV6_V6ONLY = 0x27 + + sysIPV6_RECVDSTOPTS = 0x28 + + sysMCAST_JOIN_GROUP = 0x29 + sysMCAST_LEAVE_GROUP = 0x2a + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_JOIN_SOURCE_GROUP = 0x2d + sysMCAST_LEAVE_SOURCE_GROUP = 0x2e + + sysIPV6_PREFER_SRC_HOME = 0x1 + sysIPV6_PREFER_SRC_COA = 0x2 + sysIPV6_PREFER_SRC_PUBLIC = 0x4 + sysIPV6_PREFER_SRC_TMP = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x10 + sysIPV6_PREFER_SRC_CGA = 0x20 + + sysIPV6_PREFER_SRC_MIPMASK = 0x3 + sysIPV6_PREFER_SRC_MIPDEFAULT = 0x1 + sysIPV6_PREFER_SRC_TMPMASK = 0xc + sysIPV6_PREFER_SRC_TMPDEFAULT = 0x4 + sysIPV6_PREFER_SRC_CGAMASK = 0x30 + sysIPV6_PREFER_SRC_CGADEFAULT = 0x10 + + sysIPV6_PREFER_SRC_MASK = 0x3f + + sysIPV6_PREFER_SRC_DEFAULT = 0x15 + + sysIPV6_BOUND_IF = 0x41 + sysIPV6_UNSPEC_SRC = 0x42 + + sysICMP6_FILTER = 0x1 + + sizeofSockaddrStorage = 0x100 + sizeofSockaddrInet6 = 0x20 + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x24 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x104 + sizeofGroupSourceReq = 0x204 + + sizeofICMPv6Filter = 0x20 +) + +type sockaddrStorage struct { + Family uint16 + X_ss_pad1 [6]int8 + X_ss_align float64 + X_ss_pad2 [240]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 + X__sin6_src_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [256]byte +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [256]byte + Pad_cgo_1 [256]byte +} + +type icmpv6Filter struct { + X__icmp6_filt [8]uint32 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lex/httplex/httplex.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lex/httplex/httplex.go new file mode 100644 index 0000000..20f2b89 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lex/httplex/httplex.go @@ -0,0 +1,351 @@ +// 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 httplex contains rules around lexical matters of various +// HTTP-related specifications. +// +// This package is shared by the standard library (which vendors it) +// and x/net/http2. It comes with no API stability promise. +package httplex + +import ( + "net" + "strings" + "unicode/utf8" + + "golang.org/x/net/idna" +) + +var isTokenTable = [127]bool{ + '!': true, + '#': true, + '$': true, + '%': true, + '&': true, + '\'': true, + '*': true, + '+': true, + '-': true, + '.': true, + '0': true, + '1': true, + '2': true, + '3': true, + '4': true, + '5': true, + '6': true, + '7': true, + '8': true, + '9': true, + 'A': true, + 'B': true, + 'C': true, + 'D': true, + 'E': true, + 'F': true, + 'G': true, + 'H': true, + 'I': true, + 'J': true, + 'K': true, + 'L': true, + 'M': true, + 'N': true, + 'O': true, + 'P': true, + 'Q': true, + 'R': true, + 'S': true, + 'T': true, + 'U': true, + 'W': true, + 'V': true, + 'X': true, + 'Y': true, + 'Z': true, + '^': true, + '_': true, + '`': true, + 'a': true, + 'b': true, + 'c': true, + 'd': true, + 'e': true, + 'f': true, + 'g': true, + 'h': true, + 'i': true, + 'j': true, + 'k': true, + 'l': true, + 'm': true, + 'n': true, + 'o': true, + 'p': true, + 'q': true, + 'r': true, + 's': true, + 't': true, + 'u': true, + 'v': true, + 'w': true, + 'x': true, + 'y': true, + 'z': true, + '|': true, + '~': true, +} + +func IsTokenRune(r rune) bool { + i := int(r) + return i < len(isTokenTable) && isTokenTable[i] +} + +func isNotToken(r rune) bool { + return !IsTokenRune(r) +} + +// HeaderValuesContainsToken reports whether any string in values +// contains the provided token, ASCII case-insensitively. +func HeaderValuesContainsToken(values []string, token string) bool { + for _, v := range values { + if headerValueContainsToken(v, token) { + return true + } + } + return false +} + +// isOWS reports whether b is an optional whitespace byte, as defined +// by RFC 7230 section 3.2.3. +func isOWS(b byte) bool { return b == ' ' || b == '\t' } + +// trimOWS returns x with all optional whitespace removes from the +// beginning and end. +func trimOWS(x string) string { + // TODO: consider using strings.Trim(x, " \t") instead, + // if and when it's fast enough. See issue 10292. + // But this ASCII-only code will probably always beat UTF-8 + // aware code. + for len(x) > 0 && isOWS(x[0]) { + x = x[1:] + } + for len(x) > 0 && isOWS(x[len(x)-1]) { + x = x[:len(x)-1] + } + return x +} + +// headerValueContainsToken reports whether v (assumed to be a +// 0#element, in the ABNF extension described in RFC 7230 section 7) +// contains token amongst its comma-separated tokens, ASCII +// case-insensitively. +func headerValueContainsToken(v string, token string) bool { + v = trimOWS(v) + if comma := strings.IndexByte(v, ','); comma != -1 { + return tokenEqual(trimOWS(v[:comma]), token) || headerValueContainsToken(v[comma+1:], token) + } + return tokenEqual(v, token) +} + +// lowerASCII returns the ASCII lowercase version of b. +func lowerASCII(b byte) byte { + if 'A' <= b && b <= 'Z' { + return b + ('a' - 'A') + } + return b +} + +// tokenEqual reports whether t1 and t2 are equal, ASCII case-insensitively. +func tokenEqual(t1, t2 string) bool { + if len(t1) != len(t2) { + return false + } + for i, b := range t1 { + if b >= utf8.RuneSelf { + // No UTF-8 or non-ASCII allowed in tokens. + return false + } + if lowerASCII(byte(b)) != lowerASCII(t2[i]) { + return false + } + } + return true +} + +// isLWS reports whether b is linear white space, according +// to http://www.w3.org/Protocols/rfc2616/rfc2616-sec2.html#sec2.2 +// LWS = [CRLF] 1*( SP | HT ) +func isLWS(b byte) bool { return b == ' ' || b == '\t' } + +// isCTL reports whether b is a control byte, according +// to http://www.w3.org/Protocols/rfc2616/rfc2616-sec2.html#sec2.2 +// CTL = +func isCTL(b byte) bool { + const del = 0x7f // a CTL + return b < ' ' || b == del +} + +// ValidHeaderFieldName reports whether v is a valid HTTP/1.x header name. +// HTTP/2 imposes the additional restriction that uppercase ASCII +// letters are not allowed. +// +// RFC 7230 says: +// header-field = field-name ":" OWS field-value OWS +// field-name = token +// token = 1*tchar +// tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "." / +// "^" / "_" / "`" / "|" / "~" / DIGIT / ALPHA +func ValidHeaderFieldName(v string) bool { + if len(v) == 0 { + return false + } + for _, r := range v { + if !IsTokenRune(r) { + return false + } + } + return true +} + +// ValidHostHeader reports whether h is a valid host header. +func ValidHostHeader(h string) bool { + // The latest spec is actually this: + // + // http://tools.ietf.org/html/rfc7230#section-5.4 + // Host = uri-host [ ":" port ] + // + // Where uri-host is: + // http://tools.ietf.org/html/rfc3986#section-3.2.2 + // + // But we're going to be much more lenient for now and just + // search for any byte that's not a valid byte in any of those + // expressions. + for i := 0; i < len(h); i++ { + if !validHostByte[h[i]] { + return false + } + } + return true +} + +// See the validHostHeader comment. +var validHostByte = [256]bool{ + '0': true, '1': true, '2': true, '3': true, '4': true, '5': true, '6': true, '7': true, + '8': true, '9': true, + + 'a': true, 'b': true, 'c': true, 'd': true, 'e': true, 'f': true, 'g': true, 'h': true, + 'i': true, 'j': true, 'k': true, 'l': true, 'm': true, 'n': true, 'o': true, 'p': true, + 'q': true, 'r': true, 's': true, 't': true, 'u': true, 'v': true, 'w': true, 'x': true, + 'y': true, 'z': true, + + 'A': true, 'B': true, 'C': true, 'D': true, 'E': true, 'F': true, 'G': true, 'H': true, + 'I': true, 'J': true, 'K': true, 'L': true, 'M': true, 'N': true, 'O': true, 'P': true, + 'Q': true, 'R': true, 'S': true, 'T': true, 'U': true, 'V': true, 'W': true, 'X': true, + 'Y': true, 'Z': true, + + '!': true, // sub-delims + '$': true, // sub-delims + '%': true, // pct-encoded (and used in IPv6 zones) + '&': true, // sub-delims + '(': true, // sub-delims + ')': true, // sub-delims + '*': true, // sub-delims + '+': true, // sub-delims + ',': true, // sub-delims + '-': true, // unreserved + '.': true, // unreserved + ':': true, // IPv6address + Host expression's optional port + ';': true, // sub-delims + '=': true, // sub-delims + '[': true, + '\'': true, // sub-delims + ']': true, + '_': true, // unreserved + '~': true, // unreserved +} + +// ValidHeaderFieldValue reports whether v is a valid "field-value" according to +// http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2 : +// +// message-header = field-name ":" [ field-value ] +// field-value = *( field-content | LWS ) +// field-content = +// +// http://www.w3.org/Protocols/rfc2616/rfc2616-sec2.html#sec2.2 : +// +// TEXT = +// LWS = [CRLF] 1*( SP | HT ) +// CTL = +// +// RFC 7230 says: +// field-value = *( field-content / obs-fold ) +// obj-fold = N/A to http2, and deprecated +// field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ] +// field-vchar = VCHAR / obs-text +// obs-text = %x80-FF +// VCHAR = "any visible [USASCII] character" +// +// http2 further says: "Similarly, HTTP/2 allows header field values +// that are not valid. While most of the values that can be encoded +// will not alter header field parsing, carriage return (CR, ASCII +// 0xd), line feed (LF, ASCII 0xa), and the zero character (NUL, ASCII +// 0x0) might be exploited by an attacker if they are translated +// verbatim. Any request or response that contains a character not +// permitted in a header field value MUST be treated as malformed +// (Section 8.1.2.6). Valid characters are defined by the +// field-content ABNF rule in Section 3.2 of [RFC7230]." +// +// This function does not (yet?) properly handle the rejection of +// strings that begin or end with SP or HTAB. +func ValidHeaderFieldValue(v string) bool { + for i := 0; i < len(v); i++ { + b := v[i] + if isCTL(b) && !isLWS(b) { + return false + } + } + return true +} + +func isASCII(s string) bool { + for i := 0; i < len(s); i++ { + if s[i] >= utf8.RuneSelf { + return false + } + } + return true +} + +// PunycodeHostPort returns the IDNA Punycode version +// of the provided "host" or "host:port" string. +func PunycodeHostPort(v string) (string, error) { + if isASCII(v) { + return v, nil + } + + host, port, err := net.SplitHostPort(v) + if err != nil { + // The input 'v' argument was just a "host" argument, + // without a port. This error should not be returned + // to the caller. + host = v + port = "" + } + host, err = idna.ToASCII(host) + if err != nil { + // Non-UTF-8? Not representable in Punycode, in any + // case. + return "", err + } + if port == "" { + return host, nil + } + return net.JoinHostPort(host, port), nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lex/httplex/httplex_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lex/httplex/httplex_test.go new file mode 100644 index 0000000..f47adc9 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lex/httplex/httplex_test.go @@ -0,0 +1,119 @@ +// 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 httplex + +import ( + "testing" +) + +func isChar(c rune) bool { return c <= 127 } + +func isCtl(c rune) bool { return c <= 31 || c == 127 } + +func isSeparator(c rune) bool { + switch c { + case '(', ')', '<', '>', '@', ',', ';', ':', '\\', '"', '/', '[', ']', '?', '=', '{', '}', ' ', '\t': + return true + } + return false +} + +func TestIsToken(t *testing.T) { + for i := 0; i <= 130; i++ { + r := rune(i) + expected := isChar(r) && !isCtl(r) && !isSeparator(r) + if IsTokenRune(r) != expected { + t.Errorf("isToken(0x%x) = %v", r, !expected) + } + } +} + +func TestHeaderValuesContainsToken(t *testing.T) { + tests := []struct { + vals []string + token string + want bool + }{ + { + vals: []string{"foo"}, + token: "foo", + want: true, + }, + { + vals: []string{"bar", "foo"}, + token: "foo", + want: true, + }, + { + vals: []string{"foo"}, + token: "FOO", + want: true, + }, + { + vals: []string{"foo"}, + token: "bar", + want: false, + }, + { + vals: []string{" foo "}, + token: "FOO", + want: true, + }, + { + vals: []string{"foo,bar"}, + token: "FOO", + want: true, + }, + { + vals: []string{"bar,foo,bar"}, + token: "FOO", + want: true, + }, + { + vals: []string{"bar , foo"}, + token: "FOO", + want: true, + }, + { + vals: []string{"foo ,bar "}, + token: "FOO", + want: true, + }, + { + vals: []string{"bar, foo ,bar"}, + token: "FOO", + want: true, + }, + { + vals: []string{"bar , foo"}, + token: "FOO", + want: true, + }, + } + for _, tt := range tests { + got := HeaderValuesContainsToken(tt.vals, tt.token) + if got != tt.want { + t.Errorf("headerValuesContainsToken(%q, %q) = %v; want %v", tt.vals, tt.token, got, tt.want) + } + } +} + +func TestPunycodeHostPort(t *testing.T) { + tests := []struct { + in, want string + }{ + {"www.google.com", "www.google.com"}, + {"гофер.рф", "xn--c1ae0ajs.xn--p1ai"}, + {"bücher.de", "xn--bcher-kva.de"}, + {"bücher.de:8080", "xn--bcher-kva.de:8080"}, + {"[1::6]:8080", "[1::6]:8080"}, + } + for _, tt := range tests { + got, err := PunycodeHostPort(tt.in) + if tt.want != got || err != nil { + t.Errorf("PunycodeHostPort(%q) = %q, %v, want %q, nil", tt.in, got, err, tt.want) + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/address.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/address.go new file mode 100644 index 0000000..afb957f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/address.go @@ -0,0 +1,105 @@ +// 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. + +// +build solaris + +package lif + +import ( + "errors" + "unsafe" +) + +// An Addr represents an address associated with packet routing. +type Addr interface { + // Family returns an address family. + Family() int +} + +// An Inet4Addr represents an internet address for IPv4. +type Inet4Addr struct { + IP [4]byte // IP address + PrefixLen int // address prefix length +} + +// Family implements the Family method of Addr interface. +func (a *Inet4Addr) Family() int { return sysAF_INET } + +// An Inet6Addr represents an internet address for IPv6. +type Inet6Addr struct { + IP [16]byte // IP address + PrefixLen int // address prefix length + ZoneID int // zone identifier +} + +// Family implements the Family method of Addr interface. +func (a *Inet6Addr) Family() int { return sysAF_INET6 } + +// Addrs returns a list of interface addresses. +// +// The provided af must be an address family and name must be a data +// link name. The zero value of af or name means a wildcard. +func Addrs(af int, name string) ([]Addr, error) { + eps, err := newEndpoints(af) + if len(eps) == 0 { + return nil, err + } + defer func() { + for _, ep := range eps { + ep.close() + } + }() + lls, err := links(eps, name) + if len(lls) == 0 { + return nil, err + } + var as []Addr + for _, ll := range lls { + var lifr lifreq + for i := 0; i < len(ll.Name); i++ { + lifr.Name[i] = int8(ll.Name[i]) + } + for _, ep := range eps { + ioc := int64(sysSIOCGLIFADDR) + err := ioctl(ep.s, uintptr(ioc), unsafe.Pointer(&lifr)) + if err != nil { + continue + } + sa := (*sockaddrStorage)(unsafe.Pointer(&lifr.Lifru[0])) + l := int(nativeEndian.Uint32(lifr.Lifru1[:4])) + if l == 0 { + continue + } + switch sa.Family { + case sysAF_INET: + a := &Inet4Addr{PrefixLen: l} + copy(a.IP[:], lifr.Lifru[4:8]) + as = append(as, a) + case sysAF_INET6: + a := &Inet6Addr{PrefixLen: l, ZoneID: int(nativeEndian.Uint32(lifr.Lifru[24:28]))} + copy(a.IP[:], lifr.Lifru[8:24]) + as = append(as, a) + } + } + } + return as, nil +} + +func parseLinkAddr(b []byte) ([]byte, error) { + nlen, alen, slen := int(b[1]), int(b[2]), int(b[3]) + l := 4 + nlen + alen + slen + if len(b) < l { + return nil, errors.New("invalid address") + } + b = b[4:] + var addr []byte + if nlen > 0 { + b = b[nlen:] + } + if alen > 0 { + addr = make([]byte, alen) + copy(addr, b[:alen]) + } + return addr, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/address_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/address_test.go new file mode 100644 index 0000000..a25f10b --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/address_test.go @@ -0,0 +1,123 @@ +// 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. + +// +build solaris + +package lif + +import ( + "fmt" + "testing" +) + +type addrFamily int + +func (af addrFamily) String() string { + switch af { + case sysAF_UNSPEC: + return "unspec" + case sysAF_INET: + return "inet4" + case sysAF_INET6: + return "inet6" + default: + return fmt.Sprintf("%d", af) + } +} + +const hexDigit = "0123456789abcdef" + +type llAddr []byte + +func (a llAddr) String() string { + if len(a) == 0 { + return "" + } + buf := make([]byte, 0, len(a)*3-1) + for i, b := range a { + if i > 0 { + buf = append(buf, ':') + } + buf = append(buf, hexDigit[b>>4]) + buf = append(buf, hexDigit[b&0xF]) + } + return string(buf) +} + +type ipAddr []byte + +func (a ipAddr) String() string { + if len(a) == 0 { + return "" + } + if len(a) == 4 { + return fmt.Sprintf("%d.%d.%d.%d", a[0], a[1], a[2], a[3]) + } + if len(a) == 16 { + return fmt.Sprintf("%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x", a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]) + } + s := make([]byte, len(a)*2) + for i, tn := range a { + s[i*2], s[i*2+1] = hexDigit[tn>>4], hexDigit[tn&0xf] + } + return string(s) +} + +func (a *Inet4Addr) String() string { + return fmt.Sprintf("(%s %s %d)", addrFamily(a.Family()), ipAddr(a.IP[:]), a.PrefixLen) +} + +func (a *Inet6Addr) String() string { + return fmt.Sprintf("(%s %s %d %d)", addrFamily(a.Family()), ipAddr(a.IP[:]), a.PrefixLen, a.ZoneID) +} + +type addrPack struct { + af int + as []Addr +} + +func addrPacks() ([]addrPack, error) { + var lastErr error + var aps []addrPack + for _, af := range [...]int{sysAF_UNSPEC, sysAF_INET, sysAF_INET6} { + as, err := Addrs(af, "") + if err != nil { + lastErr = err + continue + } + aps = append(aps, addrPack{af: af, as: as}) + } + return aps, lastErr +} + +func TestAddrs(t *testing.T) { + aps, err := addrPacks() + if len(aps) == 0 && err != nil { + t.Fatal(err) + } + lps, err := linkPacks() + if len(lps) == 0 && err != nil { + t.Fatal(err) + } + for _, lp := range lps { + n := 0 + for _, ll := range lp.lls { + as, err := Addrs(lp.af, ll.Name) + if err != nil { + t.Fatal(lp.af, ll.Name, err) + } + t.Logf("af=%s name=%s %v", addrFamily(lp.af), ll.Name, as) + n += len(as) + } + for _, ap := range aps { + if ap.af != lp.af { + continue + } + if n != len(ap.as) { + t.Errorf("af=%s got %d; want %d", addrFamily(lp.af), n, len(ap.as)) + continue + } + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/binary.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/binary.go new file mode 100644 index 0000000..738a94f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/binary.go @@ -0,0 +1,115 @@ +// 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. + +// +build solaris + +package lif + +// This file contains duplicates of encoding/binary package. +// +// This package is supposed to be used by the net package of standard +// library. Therefore the package set used in the package must be the +// same as net package. + +var ( + littleEndian binaryLittleEndian + bigEndian binaryBigEndian +) + +type binaryByteOrder interface { + Uint16([]byte) uint16 + Uint32([]byte) uint32 + Uint64([]byte) uint64 + PutUint16([]byte, uint16) + PutUint32([]byte, uint32) + PutUint64([]byte, uint64) +} + +type binaryLittleEndian struct{} + +func (binaryLittleEndian) Uint16(b []byte) uint16 { + _ = b[1] // bounds check hint to compiler; see golang.org/issue/14808 + return uint16(b[0]) | uint16(b[1])<<8 +} + +func (binaryLittleEndian) PutUint16(b []byte, v uint16) { + _ = b[1] // early bounds check to guarantee safety of writes below + b[0] = byte(v) + b[1] = byte(v >> 8) +} + +func (binaryLittleEndian) 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 (binaryLittleEndian) PutUint32(b []byte, v uint32) { + _ = b[3] // early bounds check to guarantee safety of writes below + b[0] = byte(v) + b[1] = byte(v >> 8) + b[2] = byte(v >> 16) + b[3] = byte(v >> 24) +} + +func (binaryLittleEndian) 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 (binaryLittleEndian) PutUint64(b []byte, v uint64) { + _ = b[7] // early bounds check to guarantee safety of writes below + b[0] = byte(v) + b[1] = byte(v >> 8) + b[2] = byte(v >> 16) + b[3] = byte(v >> 24) + b[4] = byte(v >> 32) + b[5] = byte(v >> 40) + b[6] = byte(v >> 48) + b[7] = byte(v >> 56) +} + +type binaryBigEndian struct{} + +func (binaryBigEndian) Uint16(b []byte) uint16 { + _ = b[1] // bounds check hint to compiler; see golang.org/issue/14808 + return uint16(b[1]) | uint16(b[0])<<8 +} + +func (binaryBigEndian) PutUint16(b []byte, v uint16) { + _ = b[1] // early bounds check to guarantee safety of writes below + b[0] = byte(v >> 8) + b[1] = byte(v) +} + +func (binaryBigEndian) 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 (binaryBigEndian) PutUint32(b []byte, v uint32) { + _ = b[3] // early bounds check to guarantee safety of writes below + b[0] = byte(v >> 24) + b[1] = byte(v >> 16) + b[2] = byte(v >> 8) + b[3] = byte(v) +} + +func (binaryBigEndian) 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 +} + +func (binaryBigEndian) PutUint64(b []byte, v uint64) { + _ = b[7] // early bounds check to guarantee safety of writes below + b[0] = byte(v >> 56) + b[1] = byte(v >> 48) + b[2] = byte(v >> 40) + b[3] = byte(v >> 32) + b[4] = byte(v >> 24) + b[5] = byte(v >> 16) + b[6] = byte(v >> 8) + b[7] = byte(v) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/defs_solaris.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/defs_solaris.go new file mode 100644 index 0000000..02c1998 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/defs_solaris.go @@ -0,0 +1,90 @@ +// 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. + +// +build ignore + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package lif + +/* +#include +#include + +#include +#include +*/ +import "C" + +const ( + sysAF_UNSPEC = C.AF_UNSPEC + sysAF_INET = C.AF_INET + sysAF_INET6 = C.AF_INET6 + + sysSOCK_DGRAM = C.SOCK_DGRAM +) + +type sockaddrStorage C.struct_sockaddr_storage + +const ( + sysLIFC_NOXMIT = C.LIFC_NOXMIT + sysLIFC_EXTERNAL_SOURCE = C.LIFC_EXTERNAL_SOURCE + sysLIFC_TEMPORARY = C.LIFC_TEMPORARY + sysLIFC_ALLZONES = C.LIFC_ALLZONES + sysLIFC_UNDER_IPMP = C.LIFC_UNDER_IPMP + sysLIFC_ENABLED = C.LIFC_ENABLED + + sysSIOCGLIFADDR = C.SIOCGLIFADDR + sysSIOCGLIFDSTADDR = C.SIOCGLIFDSTADDR + sysSIOCGLIFFLAGS = C.SIOCGLIFFLAGS + sysSIOCGLIFMTU = C.SIOCGLIFMTU + sysSIOCGLIFNETMASK = C.SIOCGLIFNETMASK + sysSIOCGLIFMETRIC = C.SIOCGLIFMETRIC + sysSIOCGLIFNUM = C.SIOCGLIFNUM + sysSIOCGLIFINDEX = C.SIOCGLIFINDEX + sysSIOCGLIFSUBNET = C.SIOCGLIFSUBNET + sysSIOCGLIFLNKINFO = C.SIOCGLIFLNKINFO + sysSIOCGLIFCONF = C.SIOCGLIFCONF + sysSIOCGLIFHWADDR = C.SIOCGLIFHWADDR +) + +const ( + sysIFF_UP = C.IFF_UP + sysIFF_BROADCAST = C.IFF_BROADCAST + sysIFF_DEBUG = C.IFF_DEBUG + sysIFF_LOOPBACK = C.IFF_LOOPBACK + sysIFF_POINTOPOINT = C.IFF_POINTOPOINT + sysIFF_NOTRAILERS = C.IFF_NOTRAILERS + sysIFF_RUNNING = C.IFF_RUNNING + sysIFF_NOARP = C.IFF_NOARP + sysIFF_PROMISC = C.IFF_PROMISC + sysIFF_ALLMULTI = C.IFF_ALLMULTI + sysIFF_INTELLIGENT = C.IFF_INTELLIGENT + sysIFF_MULTICAST = C.IFF_MULTICAST + sysIFF_MULTI_BCAST = C.IFF_MULTI_BCAST + sysIFF_UNNUMBERED = C.IFF_UNNUMBERED + sysIFF_PRIVATE = C.IFF_PRIVATE +) + +const ( + sizeofLifnum = C.sizeof_struct_lifnum + sizeofLifreq = C.sizeof_struct_lifreq + sizeofLifconf = C.sizeof_struct_lifconf + sizeofLifIfinfoReq = C.sizeof_struct_lif_ifinfo_req +) + +type lifnum C.struct_lifnum + +type lifreq C.struct_lifreq + +type lifconf C.struct_lifconf + +type lifIfinfoReq C.struct_lif_ifinfo_req + +const ( + sysIFT_IPV4 = C.IFT_IPV4 + sysIFT_IPV6 = C.IFT_IPV6 + sysIFT_6TO4 = C.IFT_6TO4 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/lif.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/lif.go new file mode 100644 index 0000000..6e81f81 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/lif.go @@ -0,0 +1,43 @@ +// 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. + +// +build solaris + +// Package lif provides basic functions for the manipulation of +// logical network interfaces and interface addresses on Solaris. +// +// The package supports Solaris 11 or above. +package lif + +import "syscall" + +type endpoint struct { + af int + s uintptr +} + +func (ep *endpoint) close() error { + return syscall.Close(int(ep.s)) +} + +func newEndpoints(af int) ([]endpoint, error) { + var lastErr error + var eps []endpoint + afs := []int{sysAF_INET, sysAF_INET6} + if af != sysAF_UNSPEC { + afs = []int{af} + } + for _, af := range afs { + s, err := syscall.Socket(af, sysSOCK_DGRAM, 0) + if err != nil { + lastErr = err + continue + } + eps = append(eps, endpoint{af: af, s: uintptr(s)}) + } + if len(eps) == 0 { + return nil, lastErr + } + return eps, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/link.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/link.go new file mode 100644 index 0000000..913a53e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/link.go @@ -0,0 +1,126 @@ +// 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. + +// +build solaris + +package lif + +import "unsafe" + +// A Link represents logical data link information. +// +// It also represents base information for logical network interface. +// On Solaris, each logical network interface represents network layer +// adjacency information and the interface has a only single network +// address or address pair for tunneling. It's usual that multiple +// logical network interfaces share the same logical data link. +type Link struct { + Name string // name, equivalent to IP interface name + Index int // index, equivalent to IP interface index + Type int // type + Flags int // flags + MTU int // maximum transmission unit, basically link MTU but may differ between IP address families + Addr []byte // address +} + +func (ll *Link) fetch(s uintptr) { + var lifr lifreq + for i := 0; i < len(ll.Name); i++ { + lifr.Name[i] = int8(ll.Name[i]) + } + ioc := int64(sysSIOCGLIFINDEX) + if err := ioctl(s, uintptr(ioc), unsafe.Pointer(&lifr)); err == nil { + ll.Index = int(nativeEndian.Uint32(lifr.Lifru[:4])) + } + ioc = int64(sysSIOCGLIFFLAGS) + if err := ioctl(s, uintptr(ioc), unsafe.Pointer(&lifr)); err == nil { + ll.Flags = int(nativeEndian.Uint64(lifr.Lifru[:8])) + } + ioc = int64(sysSIOCGLIFMTU) + if err := ioctl(s, uintptr(ioc), unsafe.Pointer(&lifr)); err == nil { + ll.MTU = int(nativeEndian.Uint32(lifr.Lifru[:4])) + } + switch ll.Type { + case sysIFT_IPV4, sysIFT_IPV6, sysIFT_6TO4: + default: + ioc = int64(sysSIOCGLIFHWADDR) + if err := ioctl(s, uintptr(ioc), unsafe.Pointer(&lifr)); err == nil { + ll.Addr, _ = parseLinkAddr(lifr.Lifru[4:]) + } + } +} + +// Links returns a list of logical data links. +// +// The provided af must be an address family and name must be a data +// link name. The zero value of af or name means a wildcard. +func Links(af int, name string) ([]Link, error) { + eps, err := newEndpoints(af) + if len(eps) == 0 { + return nil, err + } + defer func() { + for _, ep := range eps { + ep.close() + } + }() + return links(eps, name) +} + +func links(eps []endpoint, name string) ([]Link, error) { + var lls []Link + lifn := lifnum{Flags: sysLIFC_NOXMIT | sysLIFC_TEMPORARY | sysLIFC_ALLZONES | sysLIFC_UNDER_IPMP} + lifc := lifconf{Flags: sysLIFC_NOXMIT | sysLIFC_TEMPORARY | sysLIFC_ALLZONES | sysLIFC_UNDER_IPMP} + for _, ep := range eps { + lifn.Family = uint16(ep.af) + ioc := int64(sysSIOCGLIFNUM) + if err := ioctl(ep.s, uintptr(ioc), unsafe.Pointer(&lifn)); err != nil { + continue + } + if lifn.Count == 0 { + continue + } + b := make([]byte, lifn.Count*sizeofLifreq) + lifc.Family = uint16(ep.af) + lifc.Len = lifn.Count * sizeofLifreq + if len(lifc.Lifcu) == 8 { + nativeEndian.PutUint64(lifc.Lifcu[:], uint64(uintptr(unsafe.Pointer(&b[0])))) + } else { + nativeEndian.PutUint32(lifc.Lifcu[:], uint32(uintptr(unsafe.Pointer(&b[0])))) + } + ioc = int64(sysSIOCGLIFCONF) + if err := ioctl(ep.s, uintptr(ioc), unsafe.Pointer(&lifc)); err != nil { + continue + } + nb := make([]byte, 32) // see LIFNAMSIZ in net/if.h + for i := 0; i < int(lifn.Count); i++ { + lifr := (*lifreq)(unsafe.Pointer(&b[i*sizeofLifreq])) + for i := 0; i < 32; i++ { + if lifr.Name[i] == 0 { + nb = nb[:i] + break + } + nb[i] = byte(lifr.Name[i]) + } + llname := string(nb) + nb = nb[:32] + if isDupLink(lls, llname) || name != "" && name != llname { + continue + } + ll := Link{Name: llname, Type: int(lifr.Type)} + ll.fetch(ep.s) + lls = append(lls, ll) + } + } + return lls, nil +} + +func isDupLink(lls []Link, name string) bool { + for _, ll := range lls { + if ll.Name == name { + return true + } + } + return false +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/link_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/link_test.go new file mode 100644 index 0000000..0cb9b95 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/link_test.go @@ -0,0 +1,63 @@ +// 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. + +// +build solaris + +package lif + +import ( + "fmt" + "testing" +) + +func (ll *Link) String() string { + return fmt.Sprintf("name=%s index=%d type=%d flags=%#x mtu=%d addr=%v", ll.Name, ll.Index, ll.Type, ll.Flags, ll.MTU, llAddr(ll.Addr)) +} + +type linkPack struct { + af int + lls []Link +} + +func linkPacks() ([]linkPack, error) { + var lastErr error + var lps []linkPack + for _, af := range [...]int{sysAF_UNSPEC, sysAF_INET, sysAF_INET6} { + lls, err := Links(af, "") + if err != nil { + lastErr = err + continue + } + lps = append(lps, linkPack{af: af, lls: lls}) + } + return lps, lastErr +} + +func TestLinks(t *testing.T) { + lps, err := linkPacks() + if len(lps) == 0 && err != nil { + t.Fatal(err) + } + for _, lp := range lps { + n := 0 + for _, sll := range lp.lls { + lls, err := Links(lp.af, sll.Name) + if err != nil { + t.Fatal(lp.af, sll.Name, err) + } + for _, ll := range lls { + if ll.Name != sll.Name || ll.Index != sll.Index { + t.Errorf("af=%s got %v; want %v", addrFamily(lp.af), &ll, &sll) + continue + } + t.Logf("af=%s name=%s %v", addrFamily(lp.af), sll.Name, &ll) + n++ + } + } + if n != len(lp.lls) { + t.Errorf("af=%s got %d; want %d", addrFamily(lp.af), n, len(lp.lls)) + continue + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/sys.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/sys.go new file mode 100644 index 0000000..c896041 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/sys.go @@ -0,0 +1,21 @@ +// 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. + +// +build solaris + +package lif + +import "unsafe" + +var nativeEndian binaryByteOrder + +func init() { + i := uint32(1) + b := (*[4]byte)(unsafe.Pointer(&i)) + if b[0] == 1 { + nativeEndian = littleEndian + } else { + nativeEndian = bigEndian + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/sys_solaris_amd64.s b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/sys_solaris_amd64.s new file mode 100644 index 0000000..39d76af --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/sys_solaris_amd64.s @@ -0,0 +1,8 @@ +// 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. + +#include "textflag.h" + +TEXT ·sysvicall6(SB),NOSPLIT,$0-88 + JMP syscall·sysvicall6(SB) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/syscall.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/syscall.go new file mode 100644 index 0000000..aadab2e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/syscall.go @@ -0,0 +1,28 @@ +// 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. + +// +build solaris + +package lif + +import ( + "syscall" + "unsafe" +) + +//go:cgo_import_dynamic libc_ioctl ioctl "libc.so" + +//go:linkname procIoctl libc_ioctl + +var procIoctl uintptr + +func sysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (uintptr, uintptr, syscall.Errno) + +func ioctl(s, ioc uintptr, arg unsafe.Pointer) error { + _, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procIoctl)), 3, s, ioc, uintptr(arg), 0, 0, 0) + if errno != 0 { + return error(errno) + } + return nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/zsys_solaris_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/zsys_solaris_amd64.go new file mode 100644 index 0000000..b5e999b --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/lif/zsys_solaris_amd64.go @@ -0,0 +1,103 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_solaris.go + +package lif + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0x1a + + sysSOCK_DGRAM = 0x1 +) + +type sockaddrStorage struct { + Family uint16 + X_ss_pad1 [6]int8 + X_ss_align float64 + X_ss_pad2 [240]int8 +} + +const ( + sysLIFC_NOXMIT = 0x1 + sysLIFC_EXTERNAL_SOURCE = 0x2 + sysLIFC_TEMPORARY = 0x4 + sysLIFC_ALLZONES = 0x8 + sysLIFC_UNDER_IPMP = 0x10 + sysLIFC_ENABLED = 0x20 + + sysSIOCGLIFADDR = -0x3f87968f + sysSIOCGLIFDSTADDR = -0x3f87968d + sysSIOCGLIFFLAGS = -0x3f87968b + sysSIOCGLIFMTU = -0x3f879686 + sysSIOCGLIFNETMASK = -0x3f879683 + sysSIOCGLIFMETRIC = -0x3f879681 + sysSIOCGLIFNUM = -0x3ff3967e + sysSIOCGLIFINDEX = -0x3f87967b + sysSIOCGLIFSUBNET = -0x3f879676 + sysSIOCGLIFLNKINFO = -0x3f879674 + sysSIOCGLIFCONF = -0x3fef965b + sysSIOCGLIFHWADDR = -0x3f879640 +) + +const ( + sysIFF_UP = 0x1 + sysIFF_BROADCAST = 0x2 + sysIFF_DEBUG = 0x4 + sysIFF_LOOPBACK = 0x8 + sysIFF_POINTOPOINT = 0x10 + sysIFF_NOTRAILERS = 0x20 + sysIFF_RUNNING = 0x40 + sysIFF_NOARP = 0x80 + sysIFF_PROMISC = 0x100 + sysIFF_ALLMULTI = 0x200 + sysIFF_INTELLIGENT = 0x400 + sysIFF_MULTICAST = 0x800 + sysIFF_MULTI_BCAST = 0x1000 + sysIFF_UNNUMBERED = 0x2000 + sysIFF_PRIVATE = 0x8000 +) + +const ( + sizeofLifnum = 0xc + sizeofLifreq = 0x178 + sizeofLifconf = 0x18 + sizeofLifIfinfoReq = 0x10 +) + +type lifnum struct { + Family uint16 + Pad_cgo_0 [2]byte + Flags int32 + Count int32 +} + +type lifreq struct { + Name [32]int8 + Lifru1 [4]byte + Type uint32 + Lifru [336]byte +} + +type lifconf struct { + Family uint16 + Pad_cgo_0 [2]byte + Flags int32 + Len int32 + Pad_cgo_1 [4]byte + Lifcu [8]byte +} + +type lifIfinfoReq struct { + Maxhops uint8 + Pad_cgo_0 [3]byte + Reachtime uint32 + Reachretrans uint32 + Maxmtu uint32 +} + +const ( + sysIFT_IPV4 = 0xc8 + sysIFT_IPV6 = 0xc9 + sysIFT_6TO4 = 0xca +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/nettest/conntest.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/nettest/conntest.go new file mode 100644 index 0000000..5bd3a8c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/nettest/conntest.go @@ -0,0 +1,456 @@ +// 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 nettest provides utilities for network testing. +package nettest + +import ( + "bytes" + "encoding/binary" + "io" + "io/ioutil" + "math/rand" + "net" + "runtime" + "sync" + "testing" + "time" +) + +var ( + aLongTimeAgo = time.Unix(233431200, 0) + neverTimeout = time.Time{} +) + +// MakePipe creates a connection between two endpoints and returns the pair +// as c1 and c2, such that anything written to c1 is read by c2 and vice-versa. +// The stop function closes all resources, including c1, c2, and the underlying +// net.Listener (if there is one), and should not be nil. +type MakePipe func() (c1, c2 net.Conn, stop func(), err error) + +// TestConn tests that a net.Conn implementation properly satisfies the interface. +// The tests should not produce any false positives, but may experience +// false negatives. Thus, some issues may only be detected when the test is +// run multiple times. For maximal effectiveness, run the tests under the +// race detector. +func TestConn(t *testing.T, mp MakePipe) { + testConn(t, mp) +} + +type connTester func(t *testing.T, c1, c2 net.Conn) + +func timeoutWrapper(t *testing.T, mp MakePipe, f connTester) { + c1, c2, stop, err := mp() + if err != nil { + t.Fatalf("unable to make pipe: %v", err) + } + var once sync.Once + defer once.Do(func() { stop() }) + timer := time.AfterFunc(time.Minute, func() { + once.Do(func() { + t.Error("test timed out; terminating pipe") + stop() + }) + }) + defer timer.Stop() + f(t, c1, c2) +} + +// testBasicIO tests that the data sent on c1 is properly received on c2. +func testBasicIO(t *testing.T, c1, c2 net.Conn) { + want := make([]byte, 1<<20) + rand.New(rand.NewSource(0)).Read(want) + + dataCh := make(chan []byte) + go func() { + rd := bytes.NewReader(want) + if err := chunkedCopy(c1, rd); err != nil { + t.Errorf("unexpected c1.Write error: %v", err) + } + if err := c1.Close(); err != nil { + t.Errorf("unexpected c1.Close error: %v", err) + } + }() + + go func() { + wr := new(bytes.Buffer) + if err := chunkedCopy(wr, c2); err != nil { + t.Errorf("unexpected c2.Read error: %v", err) + } + if err := c2.Close(); err != nil { + t.Errorf("unexpected c2.Close error: %v", err) + } + dataCh <- wr.Bytes() + }() + + if got := <-dataCh; !bytes.Equal(got, want) { + t.Errorf("transmitted data differs") + } +} + +// testPingPong tests that the two endpoints can synchronously send data to +// each other in a typical request-response pattern. +func testPingPong(t *testing.T, c1, c2 net.Conn) { + var wg sync.WaitGroup + defer wg.Wait() + + pingPonger := func(c net.Conn) { + defer wg.Done() + buf := make([]byte, 8) + var prev uint64 + for { + if _, err := io.ReadFull(c, buf); err != nil { + if err == io.EOF { + break + } + t.Errorf("unexpected Read error: %v", err) + } + + v := binary.LittleEndian.Uint64(buf) + binary.LittleEndian.PutUint64(buf, v+1) + if prev != 0 && prev+2 != v { + t.Errorf("mismatching value: got %d, want %d", v, prev+2) + } + prev = v + if v == 1000 { + break + } + + if _, err := c.Write(buf); err != nil { + t.Errorf("unexpected Write error: %v", err) + break + } + } + if err := c.Close(); err != nil { + t.Errorf("unexpected Close error: %v", err) + } + } + + wg.Add(2) + go pingPonger(c1) + go pingPonger(c2) + + // Start off the chain reaction. + if _, err := c1.Write(make([]byte, 8)); err != nil { + t.Errorf("unexpected c1.Write error: %v", err) + } +} + +// testRacyRead tests that it is safe to mutate the input Read buffer +// immediately after cancelation has occurred. +func testRacyRead(t *testing.T, c1, c2 net.Conn) { + go chunkedCopy(c2, rand.New(rand.NewSource(0))) + + var wg sync.WaitGroup + defer wg.Wait() + + c1.SetReadDeadline(time.Now().Add(time.Millisecond)) + for i := 0; i < 10; i++ { + wg.Add(1) + go func() { + defer wg.Done() + + b1 := make([]byte, 1024) + b2 := make([]byte, 1024) + for j := 0; j < 100; j++ { + _, err := c1.Read(b1) + copy(b1, b2) // Mutate b1 to trigger potential race + if err != nil { + checkForTimeoutError(t, err) + c1.SetReadDeadline(time.Now().Add(time.Millisecond)) + } + } + }() + } +} + +// testRacyWrite tests that it is safe to mutate the input Write buffer +// immediately after cancelation has occurred. +func testRacyWrite(t *testing.T, c1, c2 net.Conn) { + go chunkedCopy(ioutil.Discard, c2) + + var wg sync.WaitGroup + defer wg.Wait() + + c1.SetWriteDeadline(time.Now().Add(time.Millisecond)) + for i := 0; i < 10; i++ { + wg.Add(1) + go func() { + defer wg.Done() + + b1 := make([]byte, 1024) + b2 := make([]byte, 1024) + for j := 0; j < 100; j++ { + _, err := c1.Write(b1) + copy(b1, b2) // Mutate b1 to trigger potential race + if err != nil { + checkForTimeoutError(t, err) + c1.SetWriteDeadline(time.Now().Add(time.Millisecond)) + } + } + }() + } +} + +// testReadTimeout tests that Read timeouts do not affect Write. +func testReadTimeout(t *testing.T, c1, c2 net.Conn) { + go chunkedCopy(ioutil.Discard, c2) + + c1.SetReadDeadline(aLongTimeAgo) + _, err := c1.Read(make([]byte, 1024)) + checkForTimeoutError(t, err) + if _, err := c1.Write(make([]byte, 1024)); err != nil { + t.Errorf("unexpected Write error: %v", err) + } +} + +// testWriteTimeout tests that Write timeouts do not affect Read. +func testWriteTimeout(t *testing.T, c1, c2 net.Conn) { + go chunkedCopy(c2, rand.New(rand.NewSource(0))) + + c1.SetWriteDeadline(aLongTimeAgo) + _, err := c1.Write(make([]byte, 1024)) + checkForTimeoutError(t, err) + if _, err := c1.Read(make([]byte, 1024)); err != nil { + t.Errorf("unexpected Read error: %v", err) + } +} + +// testPastTimeout tests that a deadline set in the past immediately times out +// Read and Write requests. +func testPastTimeout(t *testing.T, c1, c2 net.Conn) { + go chunkedCopy(c2, c2) + + testRoundtrip(t, c1) + + c1.SetDeadline(aLongTimeAgo) + n, err := c1.Write(make([]byte, 1024)) + if n != 0 { + t.Errorf("unexpected Write count: got %d, want 0", n) + } + checkForTimeoutError(t, err) + n, err = c1.Read(make([]byte, 1024)) + if n != 0 { + t.Errorf("unexpected Read count: got %d, want 0", n) + } + checkForTimeoutError(t, err) + + testRoundtrip(t, c1) +} + +// testPresentTimeout tests that a deadline set while there are pending +// Read and Write operations immediately times out those operations. +func testPresentTimeout(t *testing.T, c1, c2 net.Conn) { + var wg sync.WaitGroup + defer wg.Wait() + wg.Add(3) + + deadlineSet := make(chan bool, 1) + go func() { + defer wg.Done() + time.Sleep(100 * time.Millisecond) + deadlineSet <- true + c1.SetReadDeadline(aLongTimeAgo) + c1.SetWriteDeadline(aLongTimeAgo) + }() + go func() { + defer wg.Done() + n, err := c1.Read(make([]byte, 1024)) + if n != 0 { + t.Errorf("unexpected Read count: got %d, want 0", n) + } + checkForTimeoutError(t, err) + if len(deadlineSet) == 0 { + t.Error("Read timed out before deadline is set") + } + }() + go func() { + defer wg.Done() + var err error + for err == nil { + _, err = c1.Write(make([]byte, 1024)) + } + checkForTimeoutError(t, err) + if len(deadlineSet) == 0 { + t.Error("Write timed out before deadline is set") + } + }() +} + +// testFutureTimeout tests that a future deadline will eventually time out +// Read and Write operations. +func testFutureTimeout(t *testing.T, c1, c2 net.Conn) { + var wg sync.WaitGroup + wg.Add(2) + + c1.SetDeadline(time.Now().Add(100 * time.Millisecond)) + go func() { + defer wg.Done() + _, err := c1.Read(make([]byte, 1024)) + checkForTimeoutError(t, err) + }() + go func() { + defer wg.Done() + var err error + for err == nil { + _, err = c1.Write(make([]byte, 1024)) + } + checkForTimeoutError(t, err) + }() + wg.Wait() + + go chunkedCopy(c2, c2) + resyncConn(t, c1) + testRoundtrip(t, c1) +} + +// testCloseTimeout tests that calling Close immediately times out pending +// Read and Write operations. +func testCloseTimeout(t *testing.T, c1, c2 net.Conn) { + go chunkedCopy(c2, c2) + + var wg sync.WaitGroup + defer wg.Wait() + wg.Add(3) + + // Test for cancelation upon connection closure. + c1.SetDeadline(neverTimeout) + go func() { + defer wg.Done() + time.Sleep(100 * time.Millisecond) + c1.Close() + }() + go func() { + defer wg.Done() + var err error + buf := make([]byte, 1024) + for err == nil { + _, err = c1.Read(buf) + } + }() + go func() { + defer wg.Done() + var err error + buf := make([]byte, 1024) + for err == nil { + _, err = c1.Write(buf) + } + }() +} + +// testConcurrentMethods tests that the methods of net.Conn can safely +// be called concurrently. +func testConcurrentMethods(t *testing.T, c1, c2 net.Conn) { + if runtime.GOOS == "plan9" { + t.Skip("skipping on plan9; see https://golang.org/issue/20489") + } + go chunkedCopy(c2, c2) + + // The results of the calls may be nonsensical, but this should + // not trigger a race detector warning. + var wg sync.WaitGroup + for i := 0; i < 100; i++ { + wg.Add(7) + go func() { + defer wg.Done() + c1.Read(make([]byte, 1024)) + }() + go func() { + defer wg.Done() + c1.Write(make([]byte, 1024)) + }() + go func() { + defer wg.Done() + c1.SetDeadline(time.Now().Add(10 * time.Millisecond)) + }() + go func() { + defer wg.Done() + c1.SetReadDeadline(aLongTimeAgo) + }() + go func() { + defer wg.Done() + c1.SetWriteDeadline(aLongTimeAgo) + }() + go func() { + defer wg.Done() + c1.LocalAddr() + }() + go func() { + defer wg.Done() + c1.RemoteAddr() + }() + } + wg.Wait() // At worst, the deadline is set 10ms into the future + + resyncConn(t, c1) + testRoundtrip(t, c1) +} + +// checkForTimeoutError checks that the error satisfies the Error interface +// and that Timeout returns true. +func checkForTimeoutError(t *testing.T, err error) { + if nerr, ok := err.(net.Error); ok { + if !nerr.Timeout() { + t.Errorf("err.Timeout() = false, want true") + } + } else { + t.Errorf("got %T, want net.Error", err) + } +} + +// testRoundtrip writes something into c and reads it back. +// It assumes that everything written into c is echoed back to itself. +func testRoundtrip(t *testing.T, c net.Conn) { + if err := c.SetDeadline(neverTimeout); err != nil { + t.Errorf("roundtrip SetDeadline error: %v", err) + } + + const s = "Hello, world!" + buf := []byte(s) + if _, err := c.Write(buf); err != nil { + t.Errorf("roundtrip Write error: %v", err) + } + if _, err := io.ReadFull(c, buf); err != nil { + t.Errorf("roundtrip Read error: %v", err) + } + if string(buf) != s { + t.Errorf("roundtrip data mismatch: got %q, want %q", buf, s) + } +} + +// resyncConn resynchronizes the connection into a sane state. +// It assumes that everything written into c is echoed back to itself. +// It assumes that 0xff is not currently on the wire or in the read buffer. +func resyncConn(t *testing.T, c net.Conn) { + c.SetDeadline(neverTimeout) + errCh := make(chan error) + go func() { + _, err := c.Write([]byte{0xff}) + errCh <- err + }() + buf := make([]byte, 1024) + for { + n, err := c.Read(buf) + if n > 0 && bytes.IndexByte(buf[:n], 0xff) == n-1 { + break + } + if err != nil { + t.Errorf("unexpected Read error: %v", err) + break + } + } + if err := <-errCh; err != nil { + t.Errorf("unexpected Write error: %v", err) + } +} + +// chunkedCopy copies from r to w in fixed-width chunks to avoid +// causing a Write that exceeds the maximum packet size for packet-based +// connections like "unixpacket". +// We assume that the maximum packet size is at least 1024. +func chunkedCopy(w io.Writer, r io.Reader) error { + b := make([]byte, 1024) + _, err := io.CopyBuffer(struct{ io.Writer }{w}, struct{ io.Reader }{r}, b) + return err +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/nettest/conntest_go16.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/nettest/conntest_go16.go new file mode 100644 index 0000000..4cbf48e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/nettest/conntest_go16.go @@ -0,0 +1,24 @@ +// 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. + +// +build !go1.7 + +package nettest + +import "testing" + +func testConn(t *testing.T, mp MakePipe) { + // Avoid using subtests on Go 1.6 and below. + timeoutWrapper(t, mp, testBasicIO) + timeoutWrapper(t, mp, testPingPong) + timeoutWrapper(t, mp, testRacyRead) + timeoutWrapper(t, mp, testRacyWrite) + timeoutWrapper(t, mp, testReadTimeout) + timeoutWrapper(t, mp, testWriteTimeout) + timeoutWrapper(t, mp, testPastTimeout) + timeoutWrapper(t, mp, testPresentTimeout) + timeoutWrapper(t, mp, testFutureTimeout) + timeoutWrapper(t, mp, testCloseTimeout) + timeoutWrapper(t, mp, testConcurrentMethods) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/nettest/conntest_go17.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/nettest/conntest_go17.go new file mode 100644 index 0000000..fa039f0 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/nettest/conntest_go17.go @@ -0,0 +1,24 @@ +// 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. + +// +build go1.7 + +package nettest + +import "testing" + +func testConn(t *testing.T, mp MakePipe) { + // Use subtests on Go 1.7 and above since it is better organized. + t.Run("BasicIO", func(t *testing.T) { timeoutWrapper(t, mp, testBasicIO) }) + t.Run("PingPong", func(t *testing.T) { timeoutWrapper(t, mp, testPingPong) }) + t.Run("RacyRead", func(t *testing.T) { timeoutWrapper(t, mp, testRacyRead) }) + t.Run("RacyWrite", func(t *testing.T) { timeoutWrapper(t, mp, testRacyWrite) }) + t.Run("ReadTimeout", func(t *testing.T) { timeoutWrapper(t, mp, testReadTimeout) }) + t.Run("WriteTimeout", func(t *testing.T) { timeoutWrapper(t, mp, testWriteTimeout) }) + t.Run("PastTimeout", func(t *testing.T) { timeoutWrapper(t, mp, testPastTimeout) }) + t.Run("PresentTimeout", func(t *testing.T) { timeoutWrapper(t, mp, testPresentTimeout) }) + t.Run("FutureTimeout", func(t *testing.T) { timeoutWrapper(t, mp, testFutureTimeout) }) + t.Run("CloseTimeout", func(t *testing.T) { timeoutWrapper(t, mp, testCloseTimeout) }) + t.Run("ConcurrentMethods", func(t *testing.T) { timeoutWrapper(t, mp, testConcurrentMethods) }) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/nettest/conntest_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/nettest/conntest_test.go new file mode 100644 index 0000000..9f9453f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/nettest/conntest_test.go @@ -0,0 +1,76 @@ +// 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. + +// +build go1.8 + +package nettest + +import ( + "net" + "os" + "runtime" + "testing" + + "golang.org/x/net/internal/nettest" +) + +func TestTestConn(t *testing.T) { + tests := []struct{ name, network string }{ + {"TCP", "tcp"}, + {"UnixPipe", "unix"}, + {"UnixPacketPipe", "unixpacket"}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if !nettest.TestableNetwork(tt.network) { + t.Skipf("not supported on %s", runtime.GOOS) + } + + mp := func() (c1, c2 net.Conn, stop func(), err error) { + ln, err := nettest.NewLocalListener(tt.network) + if err != nil { + return nil, nil, nil, err + } + + // Start a connection between two endpoints. + var err1, err2 error + done := make(chan bool) + go func() { + c2, err2 = ln.Accept() + close(done) + }() + c1, err1 = net.Dial(ln.Addr().Network(), ln.Addr().String()) + <-done + + stop = func() { + if err1 == nil { + c1.Close() + } + if err2 == nil { + c2.Close() + } + ln.Close() + switch tt.network { + case "unix", "unixpacket": + os.Remove(ln.Addr().String()) + } + } + + switch { + case err1 != nil: + stop() + return nil, nil, nil, err1 + case err2 != nil: + stop() + return nil, nil, nil, err2 + default: + return c1, c2, stop, nil + } + } + + TestConn(t, mp) + }) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/netutil/listen.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/netutil/listen.go new file mode 100644 index 0000000..56f43bf --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/netutil/listen.go @@ -0,0 +1,48 @@ +// 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 netutil provides network utility functions, complementing the more +// common ones in the net package. +package netutil // import "golang.org/x/net/netutil" + +import ( + "net" + "sync" +) + +// LimitListener returns a Listener that accepts at most n simultaneous +// connections from the provided Listener. +func LimitListener(l net.Listener, n int) net.Listener { + return &limitListener{l, make(chan struct{}, n)} +} + +type limitListener struct { + net.Listener + sem chan struct{} +} + +func (l *limitListener) acquire() { l.sem <- struct{}{} } +func (l *limitListener) release() { <-l.sem } + +func (l *limitListener) Accept() (net.Conn, error) { + l.acquire() + c, err := l.Listener.Accept() + if err != nil { + l.release() + return nil, err + } + return &limitListenerConn{Conn: c, release: l.release}, nil +} + +type limitListenerConn struct { + net.Conn + releaseOnce sync.Once + release func() +} + +func (l *limitListenerConn) Close() error { + err := l.Conn.Close() + l.releaseOnce.Do(l.release) + return err +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/netutil/listen_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/netutil/listen_test.go new file mode 100644 index 0000000..5e07d7b --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/netutil/listen_test.go @@ -0,0 +1,101 @@ +// 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 netutil + +import ( + "errors" + "fmt" + "io" + "io/ioutil" + "net" + "net/http" + "sync" + "sync/atomic" + "testing" + "time" + + "golang.org/x/net/internal/nettest" +) + +func TestLimitListener(t *testing.T) { + const max = 5 + attempts := (nettest.MaxOpenFiles() - max) / 2 + if attempts > 256 { // maximum length of accept queue is 128 by default + attempts = 256 + } + + l, err := net.Listen("tcp", "127.0.0.1:0") + if err != nil { + t.Fatal(err) + } + defer l.Close() + l = LimitListener(l, max) + + var open int32 + go http.Serve(l, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if n := atomic.AddInt32(&open, 1); n > max { + t.Errorf("%d open connections, want <= %d", n, max) + } + defer atomic.AddInt32(&open, -1) + time.Sleep(10 * time.Millisecond) + fmt.Fprint(w, "some body") + })) + + var wg sync.WaitGroup + var failed int32 + for i := 0; i < attempts; i++ { + wg.Add(1) + go func() { + defer wg.Done() + c := http.Client{Timeout: 3 * time.Second} + r, err := c.Get("http://" + l.Addr().String()) + if err != nil { + t.Log(err) + atomic.AddInt32(&failed, 1) + return + } + defer r.Body.Close() + io.Copy(ioutil.Discard, r.Body) + }() + } + wg.Wait() + + // We expect some Gets to fail as the kernel's accept queue is filled, + // but most should succeed. + if int(failed) >= attempts/2 { + t.Errorf("%d requests failed within %d attempts", failed, attempts) + } +} + +type errorListener struct { + net.Listener +} + +func (errorListener) Accept() (net.Conn, error) { + return nil, errFake +} + +var errFake = errors.New("fake error from errorListener") + +// This used to hang. +func TestLimitListenerError(t *testing.T) { + donec := make(chan bool, 1) + go func() { + const n = 2 + ll := LimitListener(errorListener{}, n) + for i := 0; i < n+1; i++ { + _, err := ll.Accept() + if err != errFake { + t.Fatalf("Accept error = %v; want errFake", err) + } + } + donec <- true + }() + select { + case <-donec: + case <-time.After(5 * time.Second): + t.Fatal("timeout. deadlock?") + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/proxy/direct.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/proxy/direct.go new file mode 100644 index 0000000..4c5ad88 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/proxy/direct.go @@ -0,0 +1,18 @@ +// 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 proxy + +import ( + "net" +) + +type direct struct{} + +// Direct is a direct proxy: one that makes network connections directly. +var Direct = direct{} + +func (direct) Dial(network, addr string) (net.Conn, error) { + return net.Dial(network, addr) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/proxy/per_host.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/proxy/per_host.go new file mode 100644 index 0000000..242d562 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/proxy/per_host.go @@ -0,0 +1,140 @@ +// 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 proxy + +import ( + "net" + "strings" +) + +// A PerHost directs connections to a default Dialer unless the host name +// requested matches one of a number of exceptions. +type PerHost struct { + def, bypass Dialer + + bypassNetworks []*net.IPNet + bypassIPs []net.IP + bypassZones []string + bypassHosts []string +} + +// NewPerHost returns a PerHost Dialer that directs connections to either +// defaultDialer or bypass, depending on whether the connection matches one of +// the configured rules. +func NewPerHost(defaultDialer, bypass Dialer) *PerHost { + return &PerHost{ + def: defaultDialer, + bypass: bypass, + } +} + +// Dial connects to the address addr on the given network through either +// defaultDialer or bypass. +func (p *PerHost) Dial(network, addr string) (c net.Conn, err error) { + host, _, err := net.SplitHostPort(addr) + if err != nil { + return nil, err + } + + return p.dialerForRequest(host).Dial(network, addr) +} + +func (p *PerHost) dialerForRequest(host string) Dialer { + if ip := net.ParseIP(host); ip != nil { + for _, net := range p.bypassNetworks { + if net.Contains(ip) { + return p.bypass + } + } + for _, bypassIP := range p.bypassIPs { + if bypassIP.Equal(ip) { + return p.bypass + } + } + return p.def + } + + for _, zone := range p.bypassZones { + if strings.HasSuffix(host, zone) { + return p.bypass + } + if host == zone[1:] { + // For a zone "example.com", we match "example.com" + // too. + return p.bypass + } + } + for _, bypassHost := range p.bypassHosts { + if bypassHost == host { + return p.bypass + } + } + return p.def +} + +// AddFromString parses a string that contains comma-separated values +// specifying hosts that should use the bypass proxy. Each value is either an +// IP address, a CIDR range, a zone (*.example.com) or a host name +// (localhost). A best effort is made to parse the string and errors are +// ignored. +func (p *PerHost) AddFromString(s string) { + hosts := strings.Split(s, ",") + for _, host := range hosts { + host = strings.TrimSpace(host) + if len(host) == 0 { + continue + } + if strings.Contains(host, "/") { + // We assume that it's a CIDR address like 127.0.0.0/8 + if _, net, err := net.ParseCIDR(host); err == nil { + p.AddNetwork(net) + } + continue + } + if ip := net.ParseIP(host); ip != nil { + p.AddIP(ip) + continue + } + if strings.HasPrefix(host, "*.") { + p.AddZone(host[1:]) + continue + } + p.AddHost(host) + } +} + +// AddIP specifies an IP address that will use the bypass proxy. Note that +// this will only take effect if a literal IP address is dialed. A connection +// to a named host will never match an IP. +func (p *PerHost) AddIP(ip net.IP) { + p.bypassIPs = append(p.bypassIPs, ip) +} + +// AddNetwork specifies an IP range that will use the bypass proxy. Note that +// this will only take effect if a literal IP address is dialed. A connection +// to a named host will never match. +func (p *PerHost) AddNetwork(net *net.IPNet) { + p.bypassNetworks = append(p.bypassNetworks, net) +} + +// AddZone specifies a DNS suffix that will use the bypass proxy. A zone of +// "example.com" matches "example.com" and all of its subdomains. +func (p *PerHost) AddZone(zone string) { + if strings.HasSuffix(zone, ".") { + zone = zone[:len(zone)-1] + } + if !strings.HasPrefix(zone, ".") { + zone = "." + zone + } + p.bypassZones = append(p.bypassZones, zone) +} + +// AddHost specifies a host name that will use the bypass proxy. +func (p *PerHost) AddHost(host string) { + if strings.HasSuffix(host, ".") { + host = host[:len(host)-1] + } + p.bypassHosts = append(p.bypassHosts, host) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/proxy/per_host_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/proxy/per_host_test.go new file mode 100644 index 0000000..a7d8095 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/proxy/per_host_test.go @@ -0,0 +1,55 @@ +// 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 proxy + +import ( + "errors" + "net" + "reflect" + "testing" +) + +type recordingProxy struct { + addrs []string +} + +func (r *recordingProxy) Dial(network, addr string) (net.Conn, error) { + r.addrs = append(r.addrs, addr) + return nil, errors.New("recordingProxy") +} + +func TestPerHost(t *testing.T) { + var def, bypass recordingProxy + perHost := NewPerHost(&def, &bypass) + perHost.AddFromString("localhost,*.zone,127.0.0.1,10.0.0.1/8,1000::/16") + + expectedDef := []string{ + "example.com:123", + "1.2.3.4:123", + "[1001::]:123", + } + expectedBypass := []string{ + "localhost:123", + "zone:123", + "foo.zone:123", + "127.0.0.1:123", + "10.1.2.3:123", + "[1000::]:123", + } + + for _, addr := range expectedDef { + perHost.Dial("tcp", addr) + } + for _, addr := range expectedBypass { + perHost.Dial("tcp", addr) + } + + if !reflect.DeepEqual(expectedDef, def.addrs) { + t.Errorf("Hosts which went to the default proxy didn't match. Got %v, want %v", def.addrs, expectedDef) + } + if !reflect.DeepEqual(expectedBypass, bypass.addrs) { + t.Errorf("Hosts which went to the bypass proxy didn't match. Got %v, want %v", bypass.addrs, expectedBypass) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/proxy/proxy.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/proxy/proxy.go new file mode 100644 index 0000000..553ead7 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/proxy/proxy.go @@ -0,0 +1,134 @@ +// 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 proxy provides support for a variety of protocols to proxy network +// data. +package proxy // import "golang.org/x/net/proxy" + +import ( + "errors" + "net" + "net/url" + "os" + "sync" +) + +// A Dialer is a means to establish a connection. +type Dialer interface { + // Dial connects to the given address via the proxy. + Dial(network, addr string) (c net.Conn, err error) +} + +// Auth contains authentication parameters that specific Dialers may require. +type Auth struct { + User, Password string +} + +// FromEnvironment returns the dialer specified by the proxy related variables in +// the environment. +func FromEnvironment() Dialer { + allProxy := allProxyEnv.Get() + if len(allProxy) == 0 { + return Direct + } + + proxyURL, err := url.Parse(allProxy) + if err != nil { + return Direct + } + proxy, err := FromURL(proxyURL, Direct) + if err != nil { + return Direct + } + + noProxy := noProxyEnv.Get() + if len(noProxy) == 0 { + return proxy + } + + perHost := NewPerHost(proxy, Direct) + perHost.AddFromString(noProxy) + return perHost +} + +// proxySchemes is a map from URL schemes to a function that creates a Dialer +// from a URL with such a scheme. +var proxySchemes map[string]func(*url.URL, Dialer) (Dialer, error) + +// RegisterDialerType takes a URL scheme and a function to generate Dialers from +// a URL with that scheme and a forwarding Dialer. Registered schemes are used +// by FromURL. +func RegisterDialerType(scheme string, f func(*url.URL, Dialer) (Dialer, error)) { + if proxySchemes == nil { + proxySchemes = make(map[string]func(*url.URL, Dialer) (Dialer, error)) + } + proxySchemes[scheme] = f +} + +// FromURL returns a Dialer given a URL specification and an underlying +// Dialer for it to make network requests. +func FromURL(u *url.URL, forward Dialer) (Dialer, error) { + var auth *Auth + if u.User != nil { + auth = new(Auth) + auth.User = u.User.Username() + if p, ok := u.User.Password(); ok { + auth.Password = p + } + } + + switch u.Scheme { + case "socks5": + return SOCKS5("tcp", u.Host, auth, forward) + } + + // If the scheme doesn't match any of the built-in schemes, see if it + // was registered by another package. + if proxySchemes != nil { + if f, ok := proxySchemes[u.Scheme]; ok { + return f(u, forward) + } + } + + return nil, errors.New("proxy: unknown scheme: " + u.Scheme) +} + +var ( + allProxyEnv = &envOnce{ + names: []string{"ALL_PROXY", "all_proxy"}, + } + noProxyEnv = &envOnce{ + names: []string{"NO_PROXY", "no_proxy"}, + } +) + +// envOnce looks up an environment variable (optionally by multiple +// names) once. It mitigates expensive lookups on some platforms +// (e.g. Windows). +// (Borrowed from net/http/transport.go) +type envOnce struct { + names []string + once sync.Once + val string +} + +func (e *envOnce) Get() string { + e.once.Do(e.init) + return e.val +} + +func (e *envOnce) init() { + for _, n := range e.names { + e.val = os.Getenv(n) + if e.val != "" { + return + } + } +} + +// reset is used by tests +func (e *envOnce) reset() { + e.once = sync.Once{} + e.val = "" +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/proxy/proxy_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/proxy/proxy_test.go new file mode 100644 index 0000000..0f31e21 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/proxy/proxy_test.go @@ -0,0 +1,215 @@ +// 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 proxy + +import ( + "bytes" + "fmt" + "io" + "net" + "net/url" + "os" + "strconv" + "strings" + "sync" + "testing" +) + +type proxyFromEnvTest struct { + allProxyEnv string + noProxyEnv string + wantTypeOf Dialer +} + +func (t proxyFromEnvTest) String() string { + var buf bytes.Buffer + space := func() { + if buf.Len() > 0 { + buf.WriteByte(' ') + } + } + if t.allProxyEnv != "" { + fmt.Fprintf(&buf, "all_proxy=%q", t.allProxyEnv) + } + if t.noProxyEnv != "" { + space() + fmt.Fprintf(&buf, "no_proxy=%q", t.noProxyEnv) + } + return strings.TrimSpace(buf.String()) +} + +func TestFromEnvironment(t *testing.T) { + ResetProxyEnv() + + type dummyDialer struct { + direct + } + + RegisterDialerType("irc", func(_ *url.URL, _ Dialer) (Dialer, error) { + return dummyDialer{}, nil + }) + + proxyFromEnvTests := []proxyFromEnvTest{ + {allProxyEnv: "127.0.0.1:8080", noProxyEnv: "localhost, 127.0.0.1", wantTypeOf: direct{}}, + {allProxyEnv: "ftp://example.com:8000", noProxyEnv: "localhost, 127.0.0.1", wantTypeOf: direct{}}, + {allProxyEnv: "socks5://example.com:8080", noProxyEnv: "localhost, 127.0.0.1", wantTypeOf: &PerHost{}}, + {allProxyEnv: "irc://example.com:8000", wantTypeOf: dummyDialer{}}, + {noProxyEnv: "localhost, 127.0.0.1", wantTypeOf: direct{}}, + {wantTypeOf: direct{}}, + } + + for _, tt := range proxyFromEnvTests { + os.Setenv("ALL_PROXY", tt.allProxyEnv) + os.Setenv("NO_PROXY", tt.noProxyEnv) + ResetCachedEnvironment() + + d := FromEnvironment() + if got, want := fmt.Sprintf("%T", d), fmt.Sprintf("%T", tt.wantTypeOf); got != want { + t.Errorf("%v: got type = %T, want %T", tt, d, tt.wantTypeOf) + } + } +} + +func TestFromURL(t *testing.T) { + endSystem, err := net.Listen("tcp", "127.0.0.1:0") + if err != nil { + t.Fatalf("net.Listen failed: %v", err) + } + defer endSystem.Close() + gateway, err := net.Listen("tcp", "127.0.0.1:0") + if err != nil { + t.Fatalf("net.Listen failed: %v", err) + } + defer gateway.Close() + + var wg sync.WaitGroup + wg.Add(1) + go socks5Gateway(t, gateway, endSystem, socks5Domain, &wg) + + url, err := url.Parse("socks5://user:password@" + gateway.Addr().String()) + if err != nil { + t.Fatalf("url.Parse failed: %v", err) + } + proxy, err := FromURL(url, Direct) + if err != nil { + t.Fatalf("FromURL failed: %v", err) + } + _, port, err := net.SplitHostPort(endSystem.Addr().String()) + if err != nil { + t.Fatalf("net.SplitHostPort failed: %v", err) + } + if c, err := proxy.Dial("tcp", "localhost:"+port); err != nil { + t.Fatalf("FromURL.Dial failed: %v", err) + } else { + c.Close() + } + + wg.Wait() +} + +func TestSOCKS5(t *testing.T) { + endSystem, err := net.Listen("tcp", "127.0.0.1:0") + if err != nil { + t.Fatalf("net.Listen failed: %v", err) + } + defer endSystem.Close() + gateway, err := net.Listen("tcp", "127.0.0.1:0") + if err != nil { + t.Fatalf("net.Listen failed: %v", err) + } + defer gateway.Close() + + var wg sync.WaitGroup + wg.Add(1) + go socks5Gateway(t, gateway, endSystem, socks5IP4, &wg) + + proxy, err := SOCKS5("tcp", gateway.Addr().String(), nil, Direct) + if err != nil { + t.Fatalf("SOCKS5 failed: %v", err) + } + if c, err := proxy.Dial("tcp", endSystem.Addr().String()); err != nil { + t.Fatalf("SOCKS5.Dial failed: %v", err) + } else { + c.Close() + } + + wg.Wait() +} + +func socks5Gateway(t *testing.T, gateway, endSystem net.Listener, typ byte, wg *sync.WaitGroup) { + defer wg.Done() + + c, err := gateway.Accept() + if err != nil { + t.Errorf("net.Listener.Accept failed: %v", err) + return + } + defer c.Close() + + b := make([]byte, 32) + var n int + if typ == socks5Domain { + n = 4 + } else { + n = 3 + } + if _, err := io.ReadFull(c, b[:n]); err != nil { + t.Errorf("io.ReadFull failed: %v", err) + return + } + if _, err := c.Write([]byte{socks5Version, socks5AuthNone}); err != nil { + t.Errorf("net.Conn.Write failed: %v", err) + return + } + if typ == socks5Domain { + n = 16 + } else { + n = 10 + } + if _, err := io.ReadFull(c, b[:n]); err != nil { + t.Errorf("io.ReadFull failed: %v", err) + return + } + if b[0] != socks5Version || b[1] != socks5Connect || b[2] != 0x00 || b[3] != typ { + t.Errorf("got an unexpected packet: %#02x %#02x %#02x %#02x", b[0], b[1], b[2], b[3]) + return + } + if typ == socks5Domain { + copy(b[:5], []byte{socks5Version, 0x00, 0x00, socks5Domain, 9}) + b = append(b, []byte("localhost")...) + } else { + copy(b[:4], []byte{socks5Version, 0x00, 0x00, socks5IP4}) + } + host, port, err := net.SplitHostPort(endSystem.Addr().String()) + if err != nil { + t.Errorf("net.SplitHostPort failed: %v", err) + return + } + b = append(b, []byte(net.ParseIP(host).To4())...) + p, err := strconv.Atoi(port) + if err != nil { + t.Errorf("strconv.Atoi failed: %v", err) + return + } + b = append(b, []byte{byte(p >> 8), byte(p)}...) + if _, err := c.Write(b); err != nil { + t.Errorf("net.Conn.Write failed: %v", err) + return + } +} + +func ResetProxyEnv() { + for _, env := range []*envOnce{allProxyEnv, noProxyEnv} { + for _, v := range env.names { + os.Setenv(v, "") + } + } + ResetCachedEnvironment() +} + +func ResetCachedEnvironment() { + allProxyEnv.reset() + noProxyEnv.reset() +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/proxy/socks5.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/proxy/socks5.go new file mode 100644 index 0000000..2d7978f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/proxy/socks5.go @@ -0,0 +1,214 @@ +// 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 proxy + +import ( + "errors" + "io" + "net" + "strconv" +) + +// SOCKS5 returns a Dialer that makes SOCKSv5 connections to the given address +// with an optional username and password. See RFC 1928 and 1929. +func SOCKS5(network, addr string, auth *Auth, forward Dialer) (Dialer, error) { + s := &socks5{ + network: network, + addr: addr, + forward: forward, + } + if auth != nil { + s.user = auth.User + s.password = auth.Password + } + + return s, nil +} + +type socks5 struct { + user, password string + network, addr string + forward Dialer +} + +const socks5Version = 5 + +const ( + socks5AuthNone = 0 + socks5AuthPassword = 2 +) + +const socks5Connect = 1 + +const ( + socks5IP4 = 1 + socks5Domain = 3 + socks5IP6 = 4 +) + +var socks5Errors = []string{ + "", + "general failure", + "connection forbidden", + "network unreachable", + "host unreachable", + "connection refused", + "TTL expired", + "command not supported", + "address type not supported", +} + +// Dial connects to the address addr on the network net via the SOCKS5 proxy. +func (s *socks5) Dial(network, addr string) (net.Conn, error) { + switch network { + case "tcp", "tcp6", "tcp4": + default: + return nil, errors.New("proxy: no support for SOCKS5 proxy connections of type " + network) + } + + conn, err := s.forward.Dial(s.network, s.addr) + if err != nil { + return nil, err + } + if err := s.connect(conn, addr); err != nil { + conn.Close() + return nil, err + } + return conn, nil +} + +// connect takes an existing connection to a socks5 proxy server, +// and commands the server to extend that connection to target, +// which must be a canonical address with a host and port. +func (s *socks5) connect(conn net.Conn, target string) error { + host, portStr, err := net.SplitHostPort(target) + if err != nil { + return err + } + + port, err := strconv.Atoi(portStr) + if err != nil { + return errors.New("proxy: failed to parse port number: " + portStr) + } + if port < 1 || port > 0xffff { + return errors.New("proxy: port number out of range: " + portStr) + } + + // the size here is just an estimate + buf := make([]byte, 0, 6+len(host)) + + buf = append(buf, socks5Version) + if len(s.user) > 0 && len(s.user) < 256 && len(s.password) < 256 { + buf = append(buf, 2 /* num auth methods */, socks5AuthNone, socks5AuthPassword) + } else { + buf = append(buf, 1 /* num auth methods */, socks5AuthNone) + } + + if _, err := conn.Write(buf); err != nil { + return errors.New("proxy: failed to write greeting to SOCKS5 proxy at " + s.addr + ": " + err.Error()) + } + + if _, err := io.ReadFull(conn, buf[:2]); err != nil { + return errors.New("proxy: failed to read greeting from SOCKS5 proxy at " + s.addr + ": " + err.Error()) + } + if buf[0] != 5 { + return errors.New("proxy: SOCKS5 proxy at " + s.addr + " has unexpected version " + strconv.Itoa(int(buf[0]))) + } + if buf[1] == 0xff { + return errors.New("proxy: SOCKS5 proxy at " + s.addr + " requires authentication") + } + + // See RFC 1929 + if buf[1] == socks5AuthPassword { + buf = buf[:0] + buf = append(buf, 1 /* password protocol version */) + buf = append(buf, uint8(len(s.user))) + buf = append(buf, s.user...) + buf = append(buf, uint8(len(s.password))) + buf = append(buf, s.password...) + + if _, err := conn.Write(buf); err != nil { + return errors.New("proxy: failed to write authentication request to SOCKS5 proxy at " + s.addr + ": " + err.Error()) + } + + if _, err := io.ReadFull(conn, buf[:2]); err != nil { + return errors.New("proxy: failed to read authentication reply from SOCKS5 proxy at " + s.addr + ": " + err.Error()) + } + + if buf[1] != 0 { + return errors.New("proxy: SOCKS5 proxy at " + s.addr + " rejected username/password") + } + } + + buf = buf[:0] + buf = append(buf, socks5Version, socks5Connect, 0 /* reserved */) + + if ip := net.ParseIP(host); ip != nil { + if ip4 := ip.To4(); ip4 != nil { + buf = append(buf, socks5IP4) + ip = ip4 + } else { + buf = append(buf, socks5IP6) + } + buf = append(buf, ip...) + } else { + if len(host) > 255 { + return errors.New("proxy: destination host name too long: " + host) + } + buf = append(buf, socks5Domain) + buf = append(buf, byte(len(host))) + buf = append(buf, host...) + } + buf = append(buf, byte(port>>8), byte(port)) + + if _, err := conn.Write(buf); err != nil { + return errors.New("proxy: failed to write connect request to SOCKS5 proxy at " + s.addr + ": " + err.Error()) + } + + if _, err := io.ReadFull(conn, buf[:4]); err != nil { + return errors.New("proxy: failed to read connect reply from SOCKS5 proxy at " + s.addr + ": " + err.Error()) + } + + failure := "unknown error" + if int(buf[1]) < len(socks5Errors) { + failure = socks5Errors[buf[1]] + } + + if len(failure) > 0 { + return errors.New("proxy: SOCKS5 proxy at " + s.addr + " failed to connect: " + failure) + } + + bytesToDiscard := 0 + switch buf[3] { + case socks5IP4: + bytesToDiscard = net.IPv4len + case socks5IP6: + bytesToDiscard = net.IPv6len + case socks5Domain: + _, err := io.ReadFull(conn, buf[:1]) + if err != nil { + return errors.New("proxy: failed to read domain length from SOCKS5 proxy at " + s.addr + ": " + err.Error()) + } + bytesToDiscard = int(buf[0]) + default: + return errors.New("proxy: got unknown address type " + strconv.Itoa(int(buf[3])) + " from SOCKS5 proxy at " + s.addr) + } + + if cap(buf) < bytesToDiscard { + buf = make([]byte, bytesToDiscard) + } else { + buf = buf[:bytesToDiscard] + } + if _, err := io.ReadFull(conn, buf); err != nil { + return errors.New("proxy: failed to read address from SOCKS5 proxy at " + s.addr + ": " + err.Error()) + } + + // Also need to discard the port number + if _, err := io.ReadFull(conn, buf[:2]); err != nil { + return errors.New("proxy: failed to read port from SOCKS5 proxy at " + s.addr + ": " + err.Error()) + } + + return nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/publicsuffix/gen.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/publicsuffix/gen.go new file mode 100644 index 0000000..f85a3c3 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/publicsuffix/gen.go @@ -0,0 +1,713 @@ +// 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. + +// +build ignore + +package main + +// This program generates table.go and table_test.go based on the authoritative +// public suffix list at https://publicsuffix.org/list/effective_tld_names.dat +// +// The version is derived from +// https://api.github.com/repos/publicsuffix/list/commits?path=public_suffix_list.dat +// and a human-readable form is at +// https://github.com/publicsuffix/list/commits/master/public_suffix_list.dat +// +// To fetch a particular git revision, such as 5c70ccd250, pass +// -url "https://raw.githubusercontent.com/publicsuffix/list/5c70ccd250/public_suffix_list.dat" +// and -version "an explicit version string". + +import ( + "bufio" + "bytes" + "flag" + "fmt" + "go/format" + "io" + "io/ioutil" + "net/http" + "os" + "regexp" + "sort" + "strings" + + "golang.org/x/net/idna" +) + +const ( + // These sum of these four values must be no greater than 32. + nodesBitsChildren = 10 + nodesBitsICANN = 1 + nodesBitsTextOffset = 15 + nodesBitsTextLength = 6 + + // These sum of these four values must be no greater than 32. + childrenBitsWildcard = 1 + childrenBitsNodeType = 2 + childrenBitsHi = 14 + childrenBitsLo = 14 +) + +var ( + maxChildren int + maxTextOffset int + maxTextLength int + maxHi uint32 + maxLo uint32 +) + +func max(a, b int) int { + if a < b { + return b + } + return a +} + +func u32max(a, b uint32) uint32 { + if a < b { + return b + } + return a +} + +const ( + nodeTypeNormal = 0 + nodeTypeException = 1 + nodeTypeParentOnly = 2 + numNodeType = 3 +) + +func nodeTypeStr(n int) string { + switch n { + case nodeTypeNormal: + return "+" + case nodeTypeException: + return "!" + case nodeTypeParentOnly: + return "o" + } + panic("unreachable") +} + +const ( + defaultURL = "https://publicsuffix.org/list/effective_tld_names.dat" + gitCommitURL = "https://api.github.com/repos/publicsuffix/list/commits?path=public_suffix_list.dat" +) + +var ( + labelEncoding = map[string]uint32{} + labelsList = []string{} + labelsMap = map[string]bool{} + rules = []string{} + + // validSuffixRE is used to check that the entries in the public suffix + // list are in canonical form (after Punycode encoding). Specifically, + // capital letters are not allowed. + validSuffixRE = regexp.MustCompile(`^[a-z0-9_\!\*\-\.]+$`) + + shaRE = regexp.MustCompile(`"sha":"([^"]+)"`) + dateRE = regexp.MustCompile(`"committer":{[^{]+"date":"([^"]+)"`) + + comments = flag.Bool("comments", false, "generate table.go comments, for debugging") + subset = flag.Bool("subset", false, "generate only a subset of the full table, for debugging") + url = flag.String("url", defaultURL, "URL of the publicsuffix.org list. If empty, stdin is read instead") + v = flag.Bool("v", false, "verbose output (to stderr)") + version = flag.String("version", "", "the effective_tld_names.dat version") +) + +func main() { + if err := main1(); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} + +func main1() error { + flag.Parse() + if nodesBitsTextLength+nodesBitsTextOffset+nodesBitsICANN+nodesBitsChildren > 32 { + return fmt.Errorf("not enough bits to encode the nodes table") + } + if childrenBitsLo+childrenBitsHi+childrenBitsNodeType+childrenBitsWildcard > 32 { + return fmt.Errorf("not enough bits to encode the children table") + } + if *version == "" { + if *url != defaultURL { + return fmt.Errorf("-version was not specified, and the -url is not the default one") + } + sha, date, err := gitCommit() + if err != nil { + return err + } + *version = fmt.Sprintf("publicsuffix.org's public_suffix_list.dat, git revision %s (%s)", sha, date) + } + var r io.Reader = os.Stdin + if *url != "" { + res, err := http.Get(*url) + if err != nil { + return err + } + if res.StatusCode != http.StatusOK { + return fmt.Errorf("bad GET status for %s: %d", *url, res.Status) + } + r = res.Body + defer res.Body.Close() + } + + var root node + icann := false + br := bufio.NewReader(r) + for { + s, err := br.ReadString('\n') + if err != nil { + if err == io.EOF { + break + } + return err + } + s = strings.TrimSpace(s) + if strings.Contains(s, "BEGIN ICANN DOMAINS") { + icann = true + continue + } + if strings.Contains(s, "END ICANN DOMAINS") { + icann = false + continue + } + if s == "" || strings.HasPrefix(s, "//") { + continue + } + s, err = idna.ToASCII(s) + if err != nil { + return err + } + if !validSuffixRE.MatchString(s) { + return fmt.Errorf("bad publicsuffix.org list data: %q", s) + } + + if *subset { + switch { + case s == "ac.jp" || strings.HasSuffix(s, ".ac.jp"): + case s == "ak.us" || strings.HasSuffix(s, ".ak.us"): + case s == "ao" || strings.HasSuffix(s, ".ao"): + case s == "ar" || strings.HasSuffix(s, ".ar"): + case s == "arpa" || strings.HasSuffix(s, ".arpa"): + case s == "cy" || strings.HasSuffix(s, ".cy"): + case s == "dyndns.org" || strings.HasSuffix(s, ".dyndns.org"): + case s == "jp": + case s == "kobe.jp" || strings.HasSuffix(s, ".kobe.jp"): + case s == "kyoto.jp" || strings.HasSuffix(s, ".kyoto.jp"): + case s == "om" || strings.HasSuffix(s, ".om"): + case s == "uk" || strings.HasSuffix(s, ".uk"): + case s == "uk.com" || strings.HasSuffix(s, ".uk.com"): + case s == "tw" || strings.HasSuffix(s, ".tw"): + case s == "zw" || strings.HasSuffix(s, ".zw"): + case s == "xn--p1ai" || strings.HasSuffix(s, ".xn--p1ai"): + // xn--p1ai is Russian-Cyrillic "рф". + default: + continue + } + } + + rules = append(rules, s) + + nt, wildcard := nodeTypeNormal, false + switch { + case strings.HasPrefix(s, "*."): + s, nt = s[2:], nodeTypeParentOnly + wildcard = true + case strings.HasPrefix(s, "!"): + s, nt = s[1:], nodeTypeException + } + labels := strings.Split(s, ".") + for n, i := &root, len(labels)-1; i >= 0; i-- { + label := labels[i] + n = n.child(label) + if i == 0 { + if nt != nodeTypeParentOnly && n.nodeType == nodeTypeParentOnly { + n.nodeType = nt + } + n.icann = n.icann && icann + n.wildcard = n.wildcard || wildcard + } + labelsMap[label] = true + } + } + labelsList = make([]string, 0, len(labelsMap)) + for label := range labelsMap { + labelsList = append(labelsList, label) + } + sort.Strings(labelsList) + + if err := generate(printReal, &root, "table.go"); err != nil { + return err + } + if err := generate(printTest, &root, "table_test.go"); err != nil { + return err + } + return nil +} + +func generate(p func(io.Writer, *node) error, root *node, filename string) error { + buf := new(bytes.Buffer) + if err := p(buf, root); err != nil { + return err + } + b, err := format.Source(buf.Bytes()) + if err != nil { + return err + } + return ioutil.WriteFile(filename, b, 0644) +} + +func gitCommit() (sha, date string, retErr error) { + res, err := http.Get(gitCommitURL) + if err != nil { + return "", "", err + } + if res.StatusCode != http.StatusOK { + return "", "", fmt.Errorf("bad GET status for %s: %d", gitCommitURL, res.Status) + } + defer res.Body.Close() + b, err := ioutil.ReadAll(res.Body) + if err != nil { + return "", "", err + } + if m := shaRE.FindSubmatch(b); m != nil { + sha = string(m[1]) + } + if m := dateRE.FindSubmatch(b); m != nil { + date = string(m[1]) + } + if sha == "" || date == "" { + retErr = fmt.Errorf("could not find commit SHA and date in %s", gitCommitURL) + } + return sha, date, retErr +} + +func printTest(w io.Writer, n *node) error { + fmt.Fprintf(w, "// generated by go run gen.go; DO NOT EDIT\n\n") + fmt.Fprintf(w, "package publicsuffix\n\nvar rules = [...]string{\n") + for _, rule := range rules { + fmt.Fprintf(w, "%q,\n", rule) + } + fmt.Fprintf(w, "}\n\nvar nodeLabels = [...]string{\n") + if err := n.walk(w, printNodeLabel); err != nil { + return err + } + fmt.Fprintf(w, "}\n") + return nil +} + +func printReal(w io.Writer, n *node) error { + const header = `// generated by go run gen.go; DO NOT EDIT + +package publicsuffix + +const version = %q + +const ( + nodesBitsChildren = %d + nodesBitsICANN = %d + nodesBitsTextOffset = %d + nodesBitsTextLength = %d + + childrenBitsWildcard = %d + childrenBitsNodeType = %d + childrenBitsHi = %d + childrenBitsLo = %d +) + +const ( + nodeTypeNormal = %d + nodeTypeException = %d + nodeTypeParentOnly = %d +) + +// numTLD is the number of top level domains. +const numTLD = %d + +` + fmt.Fprintf(w, header, *version, + nodesBitsChildren, nodesBitsICANN, nodesBitsTextOffset, nodesBitsTextLength, + childrenBitsWildcard, childrenBitsNodeType, childrenBitsHi, childrenBitsLo, + nodeTypeNormal, nodeTypeException, nodeTypeParentOnly, len(n.children)) + + text := combineText(labelsList) + if text == "" { + return fmt.Errorf("internal error: makeText returned no text") + } + for _, label := range labelsList { + offset, length := strings.Index(text, label), len(label) + if offset < 0 { + return fmt.Errorf("internal error: could not find %q in text %q", label, text) + } + maxTextOffset, maxTextLength = max(maxTextOffset, offset), max(maxTextLength, length) + if offset >= 1<= 1< 64 { + n, plus = 64, " +" + } + fmt.Fprintf(w, "%q%s\n", text[:n], plus) + text = text[n:] + } + + if err := n.walk(w, assignIndexes); err != nil { + return err + } + + fmt.Fprintf(w, ` + +// nodes is the list of nodes. Each node is represented as a uint32, which +// encodes the node's children, wildcard bit and node type (as an index into +// the children array), ICANN bit and text. +// +// If the table was generated with the -comments flag, there is a //-comment +// after each node's data. In it is the nodes-array indexes of the children, +// formatted as (n0x1234-n0x1256), with * denoting the wildcard bit. The +// nodeType is printed as + for normal, ! for exception, and o for parent-only +// nodes that have children but don't match a domain label in their own right. +// An I denotes an ICANN domain. +// +// The layout within the uint32, from MSB to LSB, is: +// [%2d bits] unused +// [%2d bits] children index +// [%2d bits] ICANN bit +// [%2d bits] text index +// [%2d bits] text length +var nodes = [...]uint32{ +`, + 32-nodesBitsChildren-nodesBitsICANN-nodesBitsTextOffset-nodesBitsTextLength, + nodesBitsChildren, nodesBitsICANN, nodesBitsTextOffset, nodesBitsTextLength) + if err := n.walk(w, printNode); err != nil { + return err + } + fmt.Fprintf(w, `} + +// children is the list of nodes' children, the parent's wildcard bit and the +// parent's node type. If a node has no children then their children index +// will be in the range [0, 6), depending on the wildcard bit and node type. +// +// The layout within the uint32, from MSB to LSB, is: +// [%2d bits] unused +// [%2d bits] wildcard bit +// [%2d bits] node type +// [%2d bits] high nodes index (exclusive) of children +// [%2d bits] low nodes index (inclusive) of children +var children=[...]uint32{ +`, + 32-childrenBitsWildcard-childrenBitsNodeType-childrenBitsHi-childrenBitsLo, + childrenBitsWildcard, childrenBitsNodeType, childrenBitsHi, childrenBitsLo) + for i, c := range childrenEncoding { + s := "---------------" + lo := c & (1<> childrenBitsLo) & (1<>(childrenBitsLo+childrenBitsHi)) & (1<>(childrenBitsLo+childrenBitsHi+childrenBitsNodeType) != 0 + if *comments { + fmt.Fprintf(w, "0x%08x, // c0x%04x (%s)%s %s\n", + c, i, s, wildcardStr(wildcard), nodeTypeStr(nodeType)) + } else { + fmt.Fprintf(w, "0x%x,\n", c) + } + } + fmt.Fprintf(w, "}\n\n") + fmt.Fprintf(w, "// max children %d (capacity %d)\n", maxChildren, 1<= 1<= 1<= 1< 0 && ss[0] == "" { + ss = ss[1:] + } + return ss +} + +// crush combines a list of strings, taking advantage of overlaps. It returns a +// single string that contains each input string as a substring. +func crush(ss []string) string { + maxLabelLen := 0 + for _, s := range ss { + if maxLabelLen < len(s) { + maxLabelLen = len(s) + } + } + + for prefixLen := maxLabelLen; prefixLen > 0; prefixLen-- { + prefixes := makePrefixMap(ss, prefixLen) + for i, s := range ss { + if len(s) <= prefixLen { + continue + } + mergeLabel(ss, i, prefixLen, prefixes) + } + } + + return strings.Join(ss, "") +} + +// mergeLabel merges the label at ss[i] with the first available matching label +// in prefixMap, where the last "prefixLen" characters in ss[i] match the first +// "prefixLen" characters in the matching label. +// It will merge ss[i] repeatedly until no more matches are available. +// All matching labels merged into ss[i] are replaced by "". +func mergeLabel(ss []string, i, prefixLen int, prefixes prefixMap) { + s := ss[i] + suffix := s[len(s)-prefixLen:] + for _, j := range prefixes[suffix] { + // Empty strings mean "already used." Also avoid merging with self. + if ss[j] == "" || i == j { + continue + } + if *v { + fmt.Fprintf(os.Stderr, "%d-length overlap at (%4d,%4d): %q and %q share %q\n", + prefixLen, i, j, ss[i], ss[j], suffix) + } + ss[i] += ss[j][prefixLen:] + ss[j] = "" + // ss[i] has a new suffix, so merge again if possible. + // Note: we only have to merge again at the same prefix length. Shorter + // prefix lengths will be handled in the next iteration of crush's for loop. + // Can there be matches for longer prefix lengths, introduced by the merge? + // I believe that any such matches would by necessity have been eliminated + // during substring removal or merged at a higher prefix length. For + // instance, in crush("abc", "cde", "bcdef"), combining "abc" and "cde" + // would yield "abcde", which could be merged with "bcdef." However, in + // practice "cde" would already have been elimintated by removeSubstrings. + mergeLabel(ss, i, prefixLen, prefixes) + return + } +} + +// prefixMap maps from a prefix to a list of strings containing that prefix. The +// list of strings is represented as indexes into a slice of strings stored +// elsewhere. +type prefixMap map[string][]int + +// makePrefixMap constructs a prefixMap from a slice of strings. +func makePrefixMap(ss []string, prefixLen int) prefixMap { + prefixes := make(prefixMap) + for i, s := range ss { + // We use < rather than <= because if a label matches on a prefix equal to + // its full length, that's actually a substring match handled by + // removeSubstrings. + if prefixLen < len(s) { + prefix := s[:prefixLen] + prefixes[prefix] = append(prefixes[prefix], i) + } + } + + return prefixes +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/publicsuffix/list.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/publicsuffix/list.go new file mode 100644 index 0000000..8bbf3bc --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/publicsuffix/list.go @@ -0,0 +1,135 @@ +// 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:generate go run gen.go + +// Package publicsuffix provides a public suffix list based on data from +// http://publicsuffix.org/. A public suffix is one under which Internet users +// can directly register names. +package publicsuffix // import "golang.org/x/net/publicsuffix" + +// TODO: specify case sensitivity and leading/trailing dot behavior for +// func PublicSuffix and func EffectiveTLDPlusOne. + +import ( + "fmt" + "net/http/cookiejar" + "strings" +) + +// List implements the cookiejar.PublicSuffixList interface by calling the +// PublicSuffix function. +var List cookiejar.PublicSuffixList = list{} + +type list struct{} + +func (list) PublicSuffix(domain string) string { + ps, _ := PublicSuffix(domain) + return ps +} + +func (list) String() string { + return version +} + +// PublicSuffix returns the public suffix of the domain using a copy of the +// publicsuffix.org database compiled into the library. +// +// icann is whether the public suffix is managed by the Internet Corporation +// for Assigned Names and Numbers. If not, the public suffix is privately +// managed. For example, foo.org and foo.co.uk are ICANN domains, +// foo.dyndns.org and foo.blogspot.co.uk are private domains. +// +// Use cases for distinguishing ICANN domains like foo.com from private +// domains like foo.appspot.com can be found at +// https://wiki.mozilla.org/Public_Suffix_List/Use_Cases +func PublicSuffix(domain string) (publicSuffix string, icann bool) { + lo, hi := uint32(0), uint32(numTLD) + s, suffix, wildcard := domain, len(domain), false +loop: + for { + dot := strings.LastIndex(s, ".") + if wildcard { + suffix = 1 + dot + } + if lo == hi { + break + } + f := find(s[1+dot:], lo, hi) + if f == notFound { + break + } + + u := nodes[f] >> (nodesBitsTextOffset + nodesBitsTextLength) + icann = u&(1<>= nodesBitsICANN + u = children[u&(1<>= childrenBitsLo + hi = u & (1<>= childrenBitsHi + switch u & (1<>= childrenBitsNodeType + wildcard = u&(1<>= nodesBitsTextLength + offset := x & (1< len(b[j]) +} + +// eTLDPlusOneTestCases come from +// https://github.com/publicsuffix/list/blob/master/tests/test_psl.txt +var eTLDPlusOneTestCases = []struct { + domain, want string +}{ + // Empty input. + {"", ""}, + // Unlisted TLD. + {"example", ""}, + {"example.example", "example.example"}, + {"b.example.example", "example.example"}, + {"a.b.example.example", "example.example"}, + // TLD with only 1 rule. + {"biz", ""}, + {"domain.biz", "domain.biz"}, + {"b.domain.biz", "domain.biz"}, + {"a.b.domain.biz", "domain.biz"}, + // TLD with some 2-level rules. + {"com", ""}, + {"example.com", "example.com"}, + {"b.example.com", "example.com"}, + {"a.b.example.com", "example.com"}, + {"uk.com", ""}, + {"example.uk.com", "example.uk.com"}, + {"b.example.uk.com", "example.uk.com"}, + {"a.b.example.uk.com", "example.uk.com"}, + {"test.ac", "test.ac"}, + // TLD with only 1 (wildcard) rule. + {"mm", ""}, + {"c.mm", ""}, + {"b.c.mm", "b.c.mm"}, + {"a.b.c.mm", "b.c.mm"}, + // More complex TLD. + {"jp", ""}, + {"test.jp", "test.jp"}, + {"www.test.jp", "test.jp"}, + {"ac.jp", ""}, + {"test.ac.jp", "test.ac.jp"}, + {"www.test.ac.jp", "test.ac.jp"}, + {"kyoto.jp", ""}, + {"test.kyoto.jp", "test.kyoto.jp"}, + {"ide.kyoto.jp", ""}, + {"b.ide.kyoto.jp", "b.ide.kyoto.jp"}, + {"a.b.ide.kyoto.jp", "b.ide.kyoto.jp"}, + {"c.kobe.jp", ""}, + {"b.c.kobe.jp", "b.c.kobe.jp"}, + {"a.b.c.kobe.jp", "b.c.kobe.jp"}, + {"city.kobe.jp", "city.kobe.jp"}, + {"www.city.kobe.jp", "city.kobe.jp"}, + // TLD with a wildcard rule and exceptions. + {"ck", ""}, + {"test.ck", ""}, + {"b.test.ck", "b.test.ck"}, + {"a.b.test.ck", "b.test.ck"}, + {"www.ck", "www.ck"}, + {"www.www.ck", "www.ck"}, + // US K12. + {"us", ""}, + {"test.us", "test.us"}, + {"www.test.us", "test.us"}, + {"ak.us", ""}, + {"test.ak.us", "test.ak.us"}, + {"www.test.ak.us", "test.ak.us"}, + {"k12.ak.us", ""}, + {"test.k12.ak.us", "test.k12.ak.us"}, + {"www.test.k12.ak.us", "test.k12.ak.us"}, + // Punycoded IDN labels + {"xn--85x722f.com.cn", "xn--85x722f.com.cn"}, + {"xn--85x722f.xn--55qx5d.cn", "xn--85x722f.xn--55qx5d.cn"}, + {"www.xn--85x722f.xn--55qx5d.cn", "xn--85x722f.xn--55qx5d.cn"}, + {"shishi.xn--55qx5d.cn", "shishi.xn--55qx5d.cn"}, + {"xn--55qx5d.cn", ""}, + {"xn--85x722f.xn--fiqs8s", "xn--85x722f.xn--fiqs8s"}, + {"www.xn--85x722f.xn--fiqs8s", "xn--85x722f.xn--fiqs8s"}, + {"shishi.xn--fiqs8s", "shishi.xn--fiqs8s"}, + {"xn--fiqs8s", ""}, +} + +func TestEffectiveTLDPlusOne(t *testing.T) { + for _, tc := range eTLDPlusOneTestCases { + got, _ := EffectiveTLDPlusOne(tc.domain) + if got != tc.want { + t.Errorf("%q: got %q, want %q", tc.domain, got, tc.want) + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/publicsuffix/table.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/publicsuffix/table.go new file mode 100644 index 0000000..549511c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/publicsuffix/table.go @@ -0,0 +1,9419 @@ +// generated by go run gen.go; DO NOT EDIT + +package publicsuffix + +const version = "publicsuffix.org's public_suffix_list.dat, git revision 38b238d6324042f2c2e6270459d1f4ccfe789fba (2017-08-28T20:09:01Z)" + +const ( + nodesBitsChildren = 10 + nodesBitsICANN = 1 + nodesBitsTextOffset = 15 + nodesBitsTextLength = 6 + + childrenBitsWildcard = 1 + childrenBitsNodeType = 2 + childrenBitsHi = 14 + childrenBitsLo = 14 +) + +const ( + nodeTypeNormal = 0 + nodeTypeException = 1 + nodeTypeParentOnly = 2 +) + +// numTLD is the number of top level domains. +const numTLD = 1557 + +// Text is the combined text of all labels. +const text = "bifukagawalterbihorologyukuhashimoichinosekigaharaxastronomy-gat" + + "ewaybomloans3-ca-central-1bikedagestangeorgeorgiabilbaogakihokum" + + "akogengerdalces3-website-us-west-1billustrationikinuyamashinashi" + + "kitchenikkoebenhavnikolaevents3-website-us-west-2bioddabirdartce" + + "nterprisesakikugawarszawashingtondclkariyameldalindesnesakurainv" + + "estmentsakyotanabellunord-odalivornomutashinainzais-a-candidateb" + + "irkenesoddtangenovaraumalopolskanlandrayddnsfreebox-oslocus-3bir" + + "thplacebitballooningladefinimakanegasakindlegokasells-for-lessal" + + "angenikonantankarlsoyurihonjoyentattoolsztynsettlersalondonetska" + + "rmoyusuharabjarkoyusuisserveexchangebjerkreimbalsfjordgcahcesuol" + + "ocalhostrodawaraugustowadaegubalsanagochihayaakasakawaharanzanne" + + "frankfurtarumizusawabkhaziamallamagazineat-url-o-g-i-naturalhist" + + "orymuseumcentereviewskrakowebredirectmeteorappaleobihirosakikami" + + "jimabogadocscbgdyniabruzzoologicalvinklein-addrammenuernberggfar" + + "merseinebinagisochildrensgardenaturalsciencesnaturelles3-ap-nort" + + "heast-2ixboxenapponazure-mobileastcoastaldefenceatonsberg12000em" + + "mafanconagawakayamadridvagsoyericssonyoursidealerimo-i-ranaamesj" + + "evuemielno-ip6bjugninohekinannestadraydnsaltdalombardiamondsalva" + + "dordalibabalatinord-frontierblockbustermezjavald-aostaplesalzbur" + + "glassassinationalheritagematsubarakawagoebloombergbauerninomiyak" + + "onojosoyrorosamegawabloxcmsamnangerbluedancebmoattachmentsamsclu" + + "bindalombardynamisches-dnsamsungleezebmsandvikcoromantovalle-d-a" + + "ostathellebmwedeployuufcfanirasakis-a-catererbnpparibaselburgliw" + + "icebnrwegroweibolzanorddalomzaporizhzheguris-a-celticsfanishiaza" + + "is-a-chefarmsteadrivelandrobaknoluoktachikawalbrzycharternidrudu" + + "nsanfranciscofreakunedre-eikerbonnishigoppdalorenskoglobalashovh" + + "achinohedmarkarpaczeladzlglobodoes-itvedestrandupontariobookingl" + + "ogoweirboomladbrokesangobootsanjournalismailillesandefjordurbana" + + "mexnetlifyis-a-conservativefsnillfjordurhamburgloppenzaogashimad" + + "achicagoboatsannanishiharaboschaefflerdalotenkawabostikaruizawab" + + "ostonakijinsekikogentingmbhartiffanyuzawabotanicalgardenishiizun" + + "azukis-a-cpadualstackspace-to-rentalstomakomaibarabotanicgardeni" + + "shikatakayamatta-varjjataxihuanishikatsuragit-repostfoldnavybota" + + "nybouncemerckmsdnipropetrovskjervoyagebounty-fullensakerryproper" + + "tiesannohelplfinancialotteboutiquebecngminakamichiharabozentsuji" + + "iebplacedekagaminordkappgafanpachigasakievennodesashibetsukumiya" + + "mazonawsaarlandyndns-at-workinggroupalmspringsakerbrandywinevall" + + "eybrasiliabresciabrindisibenikebristoloseyouripirangapartmentsan" + + "okarumaifarsundyndns-blogdnsantabarbarabritishcolumbialowiezachp" + + "omorskienishikawazukamitsuebroadcastlefrakkestadyndns-freeboxost" + + "rowwlkpmgmodenakatombetsumitakagiizebroadwaybroke-itgorybrokerbr" + + "onnoysundyndns-homednsantacruzsantafedjeffersonishimerabrotherme" + + "saverdeatnurembergmxfinitybrowsersafetymarketsanukis-a-cubicle-s" + + "lavellinotteroybrumunddalottokonamegatakasugais-a-democratjeldsu" + + "ndyndns-ipamperedchefashionishinomiyashironobrunelasticbeanstalk" + + "asaokaminoyamaxunusualpersonishinoomotegobrusselsaotomeloyalistj" + + "ordalshalsenishinoshimattelefonicarbonia-iglesias-carboniaiglesi" + + "ascarboniabruxellesapodlasiellaktyubinskiptveterinairealtorlandy" + + "ndns-mailouvrehabmerbryanskleppanamabrynewjerseybuskerudinewport" + + "lligatjmaxxxjaworznowtv-infoodnetworkshoppingrimstadyndns-office" + + "-on-the-webcambulancebuzenishiokoppegardyndns-picsapporobuzzpana" + + "sonicateringebugattipschlesischesardegnamsskoganeis-a-designerim" + + "arumorimachidabwfastlylbaltimore-og-romsdalillyokozehimejibigawa" + + "ukraanghkeymachinewhampshirebungoonord-aurdalpha-myqnapcloudacce" + + "sscambridgestonemurorangeiseiyoichippubetsubetsugaruhrhcloudns3-" + + "eu-central-1bzhitomirumalselvendrellowiczest-le-patronishitosash" + + "imizunaminamiashigaracompute-1computerhistoryofscience-fictionco" + + "msecuritytacticsaseboknowsitallvivano-frankivskasuyanagawacondos" + + "hichinohealth-carereformitakeharaconferenceconstructionconsulado" + + "esntexistanbullensvanguardyndns-workisboringrueconsultanthropolo" + + "gyconsultingvollcontactoyonocontemporaryarteducationalchikugodoh" + + "aruovatoyookannamifunecontractorskenconventureshinodearthdfcbank" + + "aszubycookingchannelsdvrdnsdojoetsuwanouchikujogaszczytnordreisa" + + "-geekatowicecoolkuszkolahppiacenzaganquannakadomarineustarhubsas" + + "katchewancooperaunitemp-dnsassaris-a-gurulsandoycopenhagencyclop" + + "edichernihivanovodkagoshimalvikashibatakashimaseratis-a-financia" + + "ladvisor-aurdalucaniacorsicagliaridagawashtenawdev-myqnapcloudap" + + "plebtimnetzwhoswhokksundyndns1corvettenrightathomeftparliamentoy" + + "osatoyakokonoecosenzakopanerairguardiann-arboretumbriacosidnsfor" + + "-better-thanawatchesatxn--12c1fe0bradescorporationcostumedio-cam" + + "pidano-mediocampidanomediocouchpotatofriesaudacouncilcouponsauhe" + + "radynnsavannahgacoursesaves-the-whalessandria-trani-barletta-and" + + "riatranibarlettaandriacqhachiojiyahoooshikamaishimodatecranbrook" + + "uwanalyticsavonaplesaxocreditcardynulvikatsushikabeeldengeluidyn" + + "v6creditunioncremonashgabadaddjambylcrewiiheyakagecricketrzyncri" + + "meast-kazakhstanangercrotonexus-2crownprovidercrsvparmacruisesbs" + + "chokoladencryptonomichigangwoncuisinellair-traffic-controlleycul" + + "turalcentertainmentoyotaris-a-hard-workercuneocupcakecxn--12cfi8" + + "ixb8lcyberlevagangaviikanonjis-a-huntercymrussiacyonabarunzencyo" + + "utheworkpccwildlifedorainfracloudcontrolledogawarabikomaezakirun" + + "orfolkebibleikangerfidonnakaniikawatanagurafieldfiguerestauranto" + + "yotsukaidownloadfilateliafilegearfilminamiechizenfinalfinancefin" + + "eartscientistockholmestrandfinlandfinnoyfirebaseapparscjohnsonfi" + + "renzefirestonefirmdaleirvikatsuyamasfjordenfishingolffanscotland" + + "fitjarfitnessettlementoyourafjalerflesbergulenflickragerotikakeg" + + "awaflightscrapper-siteflirflogintogurafloraflorencefloridavvesii" + + "dazaifudaigojomedizinhistorischescrappingunmarburguovdageaidnusl" + + "ivinghistoryfloripaderbornfloristanohatakahamangyshlakasamatsudo" + + "ntexisteingeekaufenflorogerserveftpartis-a-landscaperflowerserve" + + "game-serversicherungushikamifuranortonflynnhostingxn--1ck2e1bamb" + + "leclercasadelamonedatingjerstadotsuruokakudamatsuemrflynnhubanan" + + "arepublicaseihichisobetsuitainairforcechirealmetlifeinsuranceu-1" + + "fndfor-ourfor-someethnologyfor-theaterforexrothachirogatakahatak" + + "aishimogosenforgotdnservehalflifestyleforli-cesena-forlicesenafo" + + "rlikescandynamic-dnservehttpartnerservehumourforsaleitungsenfors" + + "andasuolodingenfortmissoulancashireggio-calabriafortworthadanose" + + "gawaforuminamifuranofosneserveirchernovtsykkylvenetogakushimotog" + + "anewyorkshirecipesaro-urbino-pesarourbinopesaromasvuotnaharimamu" + + "rogawassamukawataricohdatsunanjoburgriwataraidyndns-remotewdyndn" + + "s-serverdaluccapitalonewspaperfotaruis-a-lawyerfoxfordebianfredr" + + "ikstadtvserveminecraftoystre-slidrettozawafreeddnsgeekgalaxyfree" + + "masonryfreesitexascolipicenogiftservemp3freetlservep2partservepi" + + "cservequakefreiburgfreightcminamiiselectozsdeloittevadsoccertifi" + + "cationfresenius-4fribourgfriuli-v-giuliafriuli-ve-giuliafriuli-v" + + "egiuliafriuli-venezia-giuliafriuli-veneziagiuliafriuli-vgiuliafr" + + "iuliv-giuliafriulive-giuliafriulivegiuliafriulivenezia-giuliafri" + + "uliveneziagiuliafriulivgiuliafrlfroganservesarcasmatartanddesign" + + "frognfrolandfrom-akrehamnfrom-alfrom-arfrom-azfrom-capebretonami" + + "astalowa-wolayangroupartyfrom-coguchikuzenfrom-ctrani-andria-bar" + + "letta-trani-andriafrom-dchirurgiens-dentistes-en-francefrom-dedy" + + "n-ip24from-flanderservicesettsurgeonshalloffamemergencyachtsevas" + + "topolefrom-gausdalfrom-higashiagatsumagoizumizakirkenesevenassis" + + "icilyfrom-iafrom-idfrom-ilfrom-incheonfrom-ksewilliamhillfrom-ky" + + "owariasahikawafrom-lancasterfrom-maniwakuratextileksvikautokeino" + + "from-mdfrom-megurokunohealthcareersharis-a-liberalfrom-microsoft" + + "bankazofrom-mnfrom-modellingfrom-msharpasadenamsosnowiechiryukyu" + + "ragifuchungbukharafrom-mtnfrom-nchitachinakagawatchandclockashih" + + "arafrom-ndfrom-nefrom-nhktraniandriabarlettatraniandriafrom-njcb" + + "nlfrom-nminamiizukamishihoronobeauxartsandcraftshawaiijimarugame" + + "-hostrolekamikitayamatsuris-a-libertarianfrom-nvalled-aostatoilf" + + "rom-nyfrom-ohkurafrom-oketohmannorth-kazakhstanfrom-orfrom-padov" + + "aksdalfrom-pratohnoshooguyfrom-rivnefrom-schoenbrunnfrom-sdfrom-" + + "tnfrom-txn--1ctwolominamatakkokamiokamiminershellaspeziafrom-uta" + + "zuerichardlillehammerfeste-ipassagenshimojis-a-linux-useranishia" + + "ritabashijonawatefrom-val-daostavalleyfrom-vtranoyfrom-wafrom-wi" + + "elunnerfrom-wvalledaostavangerfrom-wyfrosinonefrostalbanshimokaw" + + "afroyahikobeardubaiduckdnshimokitayamafstavernfujiiderafujikawag" + + "uchikonefujiminohtawaramotoineppubolognakanotoddenfujinomiyadafu" + + "jiokayamansionshimonitayanagithubusercontentransportransurlfujis" + + "atoshonairtelecitychyattorneyagawakuyabukidsmynasushiobaragusart" + + "shimonosekikawafujisawafujishiroishidakabiratoridefenseljordfuji" + + "tsurugashimaritimekeepingfujixeroxn--1lqs03nfujiyoshidafukayabea" + + "tshimosuwalkis-a-llamarylandfukuchiyamadafukudominichitosetogits" + + "uldalucernefukuis-a-musicianfukumitsubishigakirovogradoyfukuokaz" + + "akiryuohadselfipassenger-associationfukuroishikarikaturindalfuku" + + "sakisarazurewebsiteshikagamiishibukawafukuyamagatakaharufunabash" + + "iriuchinadafunagatakahashimamakishiwadafunahashikamiamakusatsuma" + + "sendaisennangonohejis-a-nascarfanfundaciofuoiskujukuriyamanxn--1" + + "lqs71dfuosskoczowinbarcelonagasakikonaikawachinaganoharamcoacham" + + "pionshiphoptobishimaizurugbydgoszczecinemakeupowiathletajimabari" + + "akembuchikumagayagawakkanaibetsubamericanfamilydscloudcontrolapp" + + "spotagerfurnitureggio-emilia-romagnakasatsunairtrafficplexus-1fu" + + "rubiraquarellebesbyenglandfurudonostiaarpaviancarrierfurukawais-" + + "a-nurservebbshimotsukefusodegaurafussagamiharafutabayamaguchinom" + + "igawafutboldlygoingnowhere-for-moregontrailroadfuttsurugimperiaf" + + "uturecmshimotsumafuturehostingfuturemailingfvgfylkesbiblackfrida" + + "yfyresdalhangglidinghangoutsystemscloudfunctionshinichinanhannan" + + "mokuizumodernhannotaireshinjournalisteinkjerusalembroideryhanyuz" + + "enhapmirhareidsbergenharstadharvestcelebrationhasamarcheapgfoggi" + + "ahasaminami-alpssells-itrapaniimimatakatoris-a-playerhashbanghas" + + "udahasura-appharmacienshinjukumanohasvikazunohatogayaitakamoriok" + + "aluganskolevangerhatoyamazakitahiroshimarnardalhatsukaichikaisei" + + "s-a-republicancerresearchaeologicaliforniahattfjelldalhayashimam" + + "otobungotakadapliernewmexicodyn-vpnplusterhazuminobusellsyourhom" + + "egoodshinkamigotoyohashimotoshimahboehringerikehelsinkitakamiizu" + + "misanofidelityhembygdsforbundhemneshinshinotsurgeryhemsedalhepfo" + + "rgeherokussldheroyhgtvallee-aosteroyhigashichichibunkyonanaoshim" + + "ageandsoundandvisionhigashihiroshimanehigashiizumozakitakatakana" + + "beautysfjordhigashikagawahigashikagurasoedahigashikawakitaaikita" + + "kyushuaiahigashikurumeiwamarriottravelchannelhigashimatsushimars" + + "hallstatebankddielddanuorrikuzentakataiwanairlinebraskaunjargals" + + "aceohigashimatsuyamakitaakitadaitoigawahigashimurayamamotorcycle" + + "shinshirohigashinarusembokukitamidoris-a-rockstarachowicehigashi" + + "nehigashiomihachimanchesterhigashiosakasayamanakakogawahigashish" + + "irakawamatakanezawahigashisumiyoshikawaminamiaikitamotosumy-rout" + + "erhigashitsunotogawahigashiurausukitanakagusukumoduminamiminowah" + + "igashiyamatokoriyamanashifteditchyouripharmacyshintokushimahigas" + + "hiyodogawahigashiyoshinogaris-a-socialistmein-vigorgehiraizumisa" + + "tohobby-sitehirakatashinagawahiranais-a-soxfanhirarahiratsukagaw" + + "ahirayaizuwakamatsubushikusakadogawahistorichouseshintomikasahar" + + "ahitachiomiyagildeskaliszhitachiotagooglecodespotravelersinsuran" + + "cehitraeumtgeradellogliastradinghjartdalhjelmelandholeckobierzyc" + + "eholidayhomeiphdhomelinkfhappouhomelinuxn--1qqw23ahomeofficehome" + + "securitymaceratakaokamakurazakitashiobarahomesecuritypchloehomes" + + "enseminehomeunixn--2m4a15ehondahoneywellbeingzonehongopocznorthw" + + "esternmutualhonjyoitakarazukameokameyamatotakadahornindalhorseou" + + "lminamiogunicomcastresistancehortendofinternet-dnshinyoshitomiok" + + "amogawahospitalhoteleshiojirishirifujiedahotmailhoyangerhoylande" + + "troitskydivinghumanitieshioyanaizuhurdalhurumajis-a-studentalhyl" + + "lestadhyogoris-a-teacherkassymantechnologyhyugawarahyundaiwafune" + + "hzchocolatemasekashiwarajewishartgalleryjfkharkovalleeaosteigenj" + + "gorajlcube-serverrankoshigayakumoldelmenhorstagejlljmphilipsynol" + + "ogy-diskstationjnjcphilatelyjoyokaichibahccavuotnagareyamalborkd" + + "alwaysdatabaseballangenoamishirasatochigiessensiositelemarkherso" + + "njpmorganjpnjprshiraokananporovigotpantheonsitejuniperjurkoshuna" + + "ntokigawakosugekotohiradomainshiratakahagitlaborkotourakouhokuta" + + "makis-an-artistcgrouphiladelphiaareadmyblogsitekounosupplieshish" + + "ikuis-an-engineeringkouyamashikokuchuokouzushimasoykozagawakozak" + + "is-an-entertainerkozowindmillkpnkppspdnshisognekrasnodarkredston" + + "ekristiansandcatshisuifuelblagdenesnaaseralingenkainanaejrietisa" + + "latinabenonichoshibuyachiyodavvenjargaulardalutskasukabedzin-the" + + "-bandaioiraseeklogest-mon-blogueurovisionisshingugekristiansundk" + + "rodsheradkrokstadelvaldaostarnbergkryminamisanrikubetsupportrent" + + "ino-alto-adigekumatorinokumejimasudakumenanyokkaichiropractichoy" + + "odobashichikashukujitawarakunisakis-bykunitachiarailwaykunitomig" + + "usukumamotoyamassa-carrara-massacarraramassabusinessebyklegalloc" + + "alhistoryggeelvinckhmelnytskyivanylvenicekunneppulawykunstsammlu" + + "ngkunstunddesignkuokgrouphoenixn--30rr7ykureggioemiliaromagnakay" + + "amatsumaebashikshacknetrentino-altoadigekurgankurobelaudiblebork" + + "angerkurogimilanokuroisoftwarendalenugkuromatsunais-certifieduca" + + "torahimeshimamateramochizukirakurotakikawasakis-foundationkushir" + + "ogawakustanais-gonekusupplykutchanelkutnokuzumakis-into-animelbo" + + "urnekvafjordkvalsundkvamlidlugolekafjordkvanangenkvinesdalkvinnh" + + "eradkviteseidskogkvitsoykwpspiegelkzmisugitokorozawamitourismola" + + "ngevagrarchaeologyeongbuknx-serveronakatsugawamitoyoakemiuramiya" + + "zumiyotamanomjondalenmlbfanmonstermonticellolmontrealestatefarme" + + "quipmentrentino-s-tirollagrigentomologyeonggiehtavuoatnagaivuotn" + + "agaokakyotambabia-goracleaningatlantabusebastopologyeongnamegawa" + + "keisenbahnmonza-brianzaporizhzhiamonza-e-della-brianzapposhitara" + + "mamonzabrianzaptokuyamatsusakahoginankokubunjis-leetnedalmonzaeb" + + "rianzaramonzaedellabrianzamoonscalezajskolobrzegersundmoparachut" + + "ingmordoviajessheiminamitanemoriyamatsushigemoriyoshimilitarymor" + + "monmouthagakhanamigawamoroyamatsuuramortgagemoscowindowshizukuis" + + "himofusaintlouis-a-bruinsfanmoseushistorymosjoenmoskeneshizuokan" + + "azawamosshoujis-lostre-toteneis-an-accountantshirahamatonbetsurn" + + "adalmosvikomaganemoteginowaniihamatamakawajimaoris-not-certified" + + "unetbankhakassiamoviemovistargardmtpchristiansburgrondarmtranbym" + + "uenstermuginozawaonsenmuikamisunagawamukochikushinonsenergymulho" + + "uservebeermunakatanemuncieszynmuosattemuphonefosshowamurmanskoma" + + "kiyosunndalmurotorcraftrentino-stirolmusashimurayamatsuzakis-sav" + + "edmusashinoharamuseetrentino-sud-tirolmuseumverenigingmusicargod" + + "addynaliascoli-picenogataijis-slickharkivgucciprianiigataishinom" + + "akinderoymutsuzawamy-vigorlicemy-wanggouvicenzamyactivedirectory" + + "myasustor-elvdalmycdn77-securecifedexhibitionmyddnskingmydissent" + + "rentino-sudtirolmydrobofagemydshowtimemorialmyeffectrentino-sued" + + "-tirolmyfirewallonieruchomoscienceandindustrynmyfritzmyftpaccess" + + "hriramsterdamnserverbaniamyfusionmyhome-serversaillesienarashino" + + "mykolaivaolbia-tempio-olbiatempioolbialystokkepnoduminamiuonumat" + + "sumotofukemymailermymediapchristmasakimobetsuliguriamyokohamamat" + + "sudamypephotographysiomypetsigdalmyphotoshibajddarchitecturealty" + + "dalipaymypsxn--32vp30hagebostadmysecuritycamerakermyshopblocksil" + + "komatsushimashikizunokunimihoboleslawiechonanbuilderschmidtre-ga" + + "uldalukowhalingroks-thisayamanobeokalmykiamytis-a-bloggermytulea" + + "piagetmyipictetrentino-suedtirolmyvnchromedicaltanissettairamywi" + + "reitrentinoa-adigepinkomforbarclays3-us-east-2pioneerpippupictur" + + "esimple-urlpiszpittsburghofauskedsmokorsetagayasells-for-usgarde" + + "npiwatepixolinopizzapkommunalforbundplanetariuminamiyamashirokaw" + + "anabelembetsukubanklabudhabikinokawabarthaebaruminamimakis-a-pai" + + "nteractivegarsheis-a-patsfanplantationplantslingplatformshangril" + + "anslupskommuneplaystationplazaplchryslerplumbingopmnpodzonepohlp" + + "oivronpokerpokrovskomonopolitiendapolkowicepoltavalle-aostarostw" + + "odzislawinnersnoasaitamatsukuris-uberleetrdpomorzeszowiosokaneya" + + "mazoepordenonepornporsangerporsanguidell-ogliastraderporsgrunnan" + + "poznanpraxis-a-bookkeeperugiaprdpreservationpresidioprgmrprimelh" + + "uscultureisenprincipeprivatizehealthinsuranceprochowiceproductio" + + "nsokndalprofbsbxn--12co0c3b4evalleaostaticschuleprogressivegasia" + + "promombetsurfbx-oschwarzgwangjuifminamidaitomangotsukisofukushim" + + "aparocherkasyno-dschweizpropertyprotectionprotonetrentinoaadigep" + + "rudentialpruszkowitdkomorotsukamisatokamachintaifun-dnsaliasdabu" + + "rprzeworskogptplusdecorativeartsolarssonpvtrentinoalto-adigepwch" + + "ungnamdalseidfjordyndns-weberlincolniyodogawapzqldqponqslgbtrent" + + "inoaltoadigequicksytesolognequipelementsolundbeckomvuxn--2scrj9c" + + "hoseiroumuenchenissandnessjoenissayokoshibahikariwanumatakazakis" + + "-a-greenissedaluroyqvchurchaseljeepsongdalenviknagatorodoystufft" + + "oread-booksnesomnaritakurashikis-very-badajozorastuttgartrentino" + + "sudtirolsusakis-very-evillagesusonosuzakaniepcesuzukanmakiwakuni" + + "gamidsundsuzukis-very-goodhandsonsvalbardunloppacificirclegnicaf" + + "ederationsveiosvelvikongsvingersvizzerasvn-reposooswedenswidnica" + + "rtierswiebodzindianapolis-a-anarchistoireggiocalabriaswiftcovers" + + "winoujscienceandhistoryswisshikis-very-nicesynology-dsopotrentin" + + "os-tirolturystykanoyaltakasakiwientuscanytushuissier-justicetuva" + + "lle-daostatic-accessorreisahayakawakamiichikawamisatotaltuxfamil" + + "ytwmailvbargainstitutelevisionaustdalimanowarudaustevollavangena" + + "turbruksgymnaturhistorisches3-eu-west-1venneslaskerrylogisticsor" + + "tlandvestfoldvestnesoruminanovestre-slidreamhostersouthcarolinaz" + + "awavestre-totennishiawakuravestvagoyvevelstadvibo-valentiavibova" + + "lentiavideovillaskimitsubatamicable-modemoneyvinnicartoonartdeco" + + "ffeedbackplaneapplinzis-very-sweetpeppervinnytsiavipsinaappilots" + + "irdalvirginiavirtualvirtueeldomeindianmarketingvirtuelvisakataki" + + "nouevistaprinternationalfirearmsouthwestfalenviterboltrevisohugh" + + "esor-odalvivoldavixn--3bst00mincommbankmpspbarclaycards3-sa-east" + + "-1vlaanderenvladikavkazimierz-dolnyvladimirvlogoipimientaketomis" + + "atolgavolkswagentsowavologdanskonskowolawavolvolkenkundenvolyngd" + + "alvossevangenvotevotingvotoyonakagyokutourspjelkavikongsbergwloc" + + "lawekonsulatrobeepilepsydneywmflabspreadbettingworldworse-thanda" + + "wowithgoogleapisa-hockeynutsiracusakakinokiawpdevcloudwritesthis" + + "blogsytewroclawithyoutubeneventoeidsvollwtcircustomerwtfbxoscien" + + "cecentersciencehistorywuozuwwwiwatsukiyonowruzhgorodeowzmiuwajim" + + "axn--42c2d9axn--45br5cylxn--45brj9citadeliveryxn--45q11citicatho" + + "licheltenham-radio-opencraftrainingripescaravantaaxn--4gbriminin" + + "gxn--4it168dxn--4it797kooris-an-actorxn--4pvxs4allxn--54b7fta0cc" + + "ivilaviationxn--55qw42gxn--55qx5dxn--5js045dxn--5rtp49civilisati" + + "onxn--5rtq34kopervikhmelnitskiyamashikexn--5su34j936bgsgxn--5tzm" + + "5gxn--6btw5axn--6frz82gxn--6orx2rxn--6qq986b3xlxn--7t0a264civili" + + "zationxn--80adxhkspydebergxn--80ao21axn--80aqecdr1axn--80asehdba" + + "rreauctionaval-d-aosta-valleyolasiteu-2xn--80aswgxn--80audnedaln" + + "xn--8ltr62koryokamikawanehonbetsurutaharaxn--8pvr4uxn--8y0a063ax" + + "n--90a3academy-firewall-gatewayxn--90aeroportalaheadjudaicaaarbo" + + "rteaches-yogasawaracingroks-theatreexn--90aishobaraomoriguchihar" + + "ahkkeravjuedischesapeakebayernrtritonxn--90azhytomyrxn--9dbhblg6" + + "dietcimdbarrel-of-knowledgemologicallimitediscountysvardolls3-us" + + "-gov-west-1xn--9dbq2axn--9et52uxn--9krt00axn--andy-iraxn--aropor" + + "t-byandexn--3ds443gxn--asky-iraxn--aurskog-hland-jnbarrell-of-kn" + + "owledgeologyombondiscoveryomitanobninskarasjohkaminokawanishiaiz" + + "ubangeu-3utilitiesquare7xn--avery-yuasakegawaxn--b-5gaxn--b4w605" + + "ferdxn--bck1b9a5dre4civilwarmanagementjxn--0trq7p7nnxn--bdddj-mr" + + "abdxn--bearalvhki-y4axn--berlevg-jxaxn--bhcavuotna-s4axn--bhccav" + + "uotna-k7axn--bidr-5nachikatsuuraxn--bievt-0qa2xn--bjarky-fyaotsu" + + "rreyxn--bjddar-ptamayufuettertdasnetzxn--blt-elabourxn--bmlo-gra" + + "ingerxn--bod-2naroyxn--brnny-wuaccident-investigation-aptiblease" + + "ating-organicbcn-north-1xn--brnnysund-m8accident-prevention-webh" + + "openairbusantiquest-a-la-maisondre-landebudapest-a-la-masionionj" + + "ukudoyamagentositelekommunikationthewifiat-band-campaniaxn--brum" + + "-voagatroandinosaurepbodynathomebuiltrentinosued-tirolxn--btsfjo" + + "rd-9zaxn--c1avgxn--c2br7gxn--c3s14minnesotaketakatsukis-into-car" + + "shiranukanagawaxn--cck2b3barsyonlinewhollandishakotanavigationav" + + "oibmdisrechtranakaiwamizawaweddingjesdalimoliserniaustinnatuurwe" + + "tenschappenaumburgjerdrumckinseyokosukanzakiyokawaragrocerybnika" + + "hokutobamaintenancebetsuikicks-assedic66xn--cg4bkis-with-theband" + + "ovre-eikerxn--ciqpnxn--clchc0ea0b2g2a9gcdn77-sslattumintelligenc" + + "exn--comunicaes-v6a2oxn--correios-e-telecomunicaes-ghc29axn--czr" + + "694bashkiriaustraliaisondriodejaneirochesterxn--czrs0trogstadxn-" + + "-czru2dxn--czrw28basilicataniaustrheimatunduhrennesoyokotebinore" + + "-og-uvdalaziobiraskvolloabathsbcasacamdvrcampobassociatestingjem" + + "nes3-ap-southeast-1xn--d1acj3basketballyngenavuotnaklodzkodairau" + + "thordalandroiddnss3-eu-west-2xn--d1alfaromeoxn--d1atromsaitomobe" + + "llevuelosangelesjaguarmeniaxn--d5qv7z876claimsardiniaxn--davvenj" + + "rga-y4axn--djrs72d6uyxn--djty4kosaigawaxn--dnna-grajewolterskluw" + + "erxn--drbak-wuaxn--dyry-iraxn--e1a4clanbibaidarq-axn--eckvdtc9dx" + + "n--efvn9srlxn--efvy88haibarakisosakitagawaxn--ehqz56nxn--elqq16h" + + "air-surveillancexn--estv75gxn--eveni-0qa01gaxn--f6qx53axn--fct42" + + "9kosakaerodromegallupinbarefootballfinanzgoraurskog-holandroverh" + + "alla-speziaetnagahamaroygardenebakkeshibechambagriculturennebude" + + "jjudygarlandd-dnshome-webservercellikes-piedmontblancomeeres3-ap" + + "-south-1kappchizippodhaleangaviikadenadexetereport3l3p0rtargets-" + + "itargivestbytomaritimobaravennagasuke12hpalace164lima-cityeatsel" + + "inogradultarnobrzegyptianativeamericanantiques3-ap-northeast-133" + + "7xn--fhbeiarnxn--finny-yuaxn--fiq228c5hsrtrentinostirolxn--fiq64" + + "batodayonagoyautomotivecoalvdalaskanittedallasalleasinglesurance" + + "rtmgretagajoboji234xn--fiqs8srvaporcloudxn--fiqz9storagexn--fjor" + + "d-lraxn--fjq720axn--fl-ziaxn--flor-jraxn--flw351exn--fpcrj9c3dxn" + + "--frde-grandrapidstordalxn--frna-woaraisaijotromsojampagefrontap" + + "piemontexn--frya-hraxn--fzc2c9e2cldmailuxembourgrongaxn--fzys8d6" + + "9uvgmailxn--g2xx48clickasumigaurawa-mazowszextraspacekitagatajir" + + "issagaeroclubmedecincinnationwidealstahaugesunderseaportsinfolld" + + "alabamagasakishimabarackmazerbaijan-mayendoftheinternetflixilove" + + "collegefantasyleaguernseyxn--gckr3f0fedorapeopleirfjordynvpncher" + + "nivtsiciliaxn--gecrj9clinichernigovernmentjometacentruminamiawaj" + + "ikis-a-doctorayxn--ggaviika-8ya47hakatanoshiroomuraxn--gildeskl-" + + "g0axn--givuotna-8yasakaiminatoyonezawaxn--gjvik-wuaxn--gk3at1exn" + + "--gls-elacaixaxn--gmq050isleofmandalxn--gmqw5axn--h-2failxn--h1a" + + "eghakodatexn--h2breg3evenestorepaircraftrentinosud-tirolxn--h2br" + + "j9c8cliniquenoharaxn--h3cuzk1digitalxn--hbmer-xqaxn--hcesuolo-7y" + + "a35batsfjordivtasvuodnakamagayahababyglandivttasvuotnakamurataji" + + "mibuildingjovikarasjokarasuyamarylhurstjohnayorovnoceanographics" + + "3-us-west-1xn--hery-iraxn--hgebostad-g3axn--hmmrfeasta-s4acctrus" + + "teexn--hnefoss-q1axn--hobl-iraxn--holtlen-hxaxn--hpmir-xqaxn--hx" + + "t814exn--hyanger-q1axn--hylandet-54axn--i1b6b1a6a2exn--imr513nxn" + + "--indery-fyasugivingxn--io0a7issmarterthanyouxn--j1aefedoraproje" + + "ctoyotomiyazakis-a-knightpointtokaizukamikoaniikappugliaxn--j1am" + + "hakonexn--j6w193gxn--jlq61u9w7bauhausposts-and-telecommunication" + + "sncfdiyonaguniversityoriikarateu-4xn--jlster-byasuokanraxn--jrpe" + + "land-54axn--jvr189misakis-into-cartoonshiraois-a-techietis-a-the" + + "rapistoiaxn--k7yn95exn--karmy-yuaxn--kbrq7oxn--kcrx77d1x4axn--kf" + + "jord-iuaxn--klbu-woaxn--klt787dxn--kltp7dxn--kltx9axn--klty5xn--" + + "3e0b707exn--koluokta-7ya57hakubaghdadxn--kprw13dxn--kpry57dxn--k" + + "pu716fermodalenxn--kput3iwchofunatoriginsurecreationishiwakis-a-" + + "geekashiwazakiyosatokashikiyosemitexn--krager-gyatomitamamuraxn-" + + "-kranghke-b0axn--krdsherad-m8axn--krehamn-dxaxn--krjohka-hwab49j" + + "elenia-goraxn--ksnes-uuaxn--kvfjord-nxaxn--kvitsy-fyatsukanumazu" + + "ryxn--kvnangen-k0axn--l-1fairwindstorfjordxn--l1accentureklambor" + + "ghiniizaxn--laheadju-7yatsushiroxn--langevg-jxaxn--lcvr32dxn--ld" + + "ingen-q1axn--leagaviika-52bbcasertaipeiheijiitatebayashiibahcavu" + + "otnagaraholtalenvironmentalconservationflfanfshostrowiecasinordl" + + "andnpalermomahachijorpelandrangedalindashorokanaieverbankaratsug" + + "inamikatagamiharuconnectashkentatamotors3-us-west-2xn--lesund-hu" + + "axn--lgbbat1ad8jeonnamerikawauexn--lgrd-poaclintonoshoesarluxury" + + "xn--lhppi-xqaxn--linds-pramericanartrvareserveblogspotrentinosue" + + "dtirolxn--lns-qlapyatigorskypexn--loabt-0qaxn--lrdal-sraxn--lren" + + "skog-54axn--lt-liaclothingdustkakamigaharaxn--lten-granexn--lury" + + "-iraxn--m3ch0j3axn--mely-iraxn--merker-kuaxn--mgb2ddestorjdevclo" + + "udfrontdoorxn--mgb9awbferraraxn--mgba3a3ejtrysiljanxn--mgba3a4f1" + + "6axn--mgba3a4franamizuholdingsmilelverumisasaguris-into-gamessin" + + "atsukigatakasagotembaixadaxn--mgba7c0bbn0axn--mgbaakc7dvferrarit" + + "togoldpoint2thisamitsukexn--mgbaam7a8hakuis-a-personaltrainerxn-" + + "-mgbab2bdxn--mgbai9a5eva00bbtatarantottoriiyamanouchikuhokuryuga" + + "sakitaurayasudautoscanadaejeonbukaragandasnesoddenmarkhangelskja" + + "kdnepropetrovskiervaapsteiermark12xn--mgbai9azgqp6jetztrentino-a" + + "-adigexn--mgbayh7gpagespeedmobilizeroxn--mgbb9fbpobanazawaxn--mg" + + "bbh1a71exn--mgbc0a9azcgxn--mgbca7dzdoxn--mgberp4a5d4a87gxn--mgbe" + + "rp4a5d4arxn--mgbgu82axn--mgbi4ecexposedxn--mgbpl2fhskodjejuegosh" + + "ikiminokamoenairportland-4-salernoboribetsuckstpetersburgxn--mgb" + + "qly7c0a67fbcnsarpsborgrossetouchijiwadegreexn--mgbqly7cvafranzis" + + "kanerdpolicexn--mgbt3dhdxn--mgbtf8flatangerxn--mgbtx2bbvacations" + + "watch-and-clockerxn--mgbx4cd0abbottulanxessor-varangerxn--mix082" + + "ferreroticanonoichinomiyakexn--mix891fetsundyroyrvikinguitarscho" + + "larshipschoolxn--mjndalen-64axn--mk0axindustriesteamfamberkeleyx" + + "n--mk1bu44cntkmaxxn--11b4c3dyndns-wikinkobayashikaoirminamibosog" + + "ndaluzernxn--mkru45ixn--mlatvuopmi-s4axn--mli-tlaquilanciaxn--ml" + + "selv-iuaxn--moreke-juaxn--mori-qsakuhokkaidoomdnsiskinkyotobetsu" + + "midatlanticolognextdirectmparaglidingroundhandlingroznyxn--mosje" + + "n-eyawaraxn--mot-tlarvikoseis-an-actresshirakofuefukihaboromskog" + + "xn--mre-og-romsdal-qqbentleyoshiokaracoldwarmiamihamadaveroykeni" + + "waizumiotsukuibestadds3-external-1xn--msy-ula0hakusandiegoodyear" + + "xn--mtta-vrjjat-k7afamilycompanycolonialwilliamsburgrparisor-fro" + + "nxn--muost-0qaxn--mxtq1misawaxn--ngbc5azdxn--ngbe9e0axn--ngbrxn-" + + "-3hcrj9cistrondheimmobilienxn--nit225kosherbrookegawaxn--nmesjev" + + "uemie-tcbalestrandabergamoarekexn--nnx388axn--nodessakuragawaxn-" + + "-nqv7fs00emaxn--nry-yla5gxn--ntso0iqx3axn--ntsq17gxn--nttery-bya" + + "eservecounterstrikexn--nvuotna-hwaxn--nyqy26axn--o1achattanoogan" + + "ordre-landxn--o3cw4haldenxn--o3cyx2axn--od0algxn--od0aq3beppubli" + + "shproxyzgorzeleccollectionhlfanhs3-website-ap-northeast-1xn--ogb" + + "pf8flekkefjordxn--oppegrd-ixaxn--ostery-fyawatahamaxn--osyro-wua" + + "xn--p1acfgujolsterxn--p1aixn--pbt977coloradoplateaudioxn--pgbs0d" + + "hlxn--porsgu-sta26fhvalerxn--pssu33lxn--pssy2uxn--q9jyb4columbus" + + "heyxn--qcka1pmcdonaldstreamuneuesolutionsomaxn--qqqt11misconfuse" + + "dxn--qxamusementunesorfoldxn--rady-iraxn--rdal-poaxn--rde-ulavag" + + "iskexn--rdy-0nabarixn--rennesy-v1axn--rhkkervju-01aflakstadaokag" + + "akibichuoxn--rholt-mragowoodsideltaitogliattirestudioxn--rhqv96g" + + "xn--rht27zxn--rht3dxn--rht61exn--risa-5narusawaxn--risr-iraxn--r" + + "land-uuaxn--rlingen-mxaxn--rmskog-byaxn--rny31halsaikitahatakama" + + "tsukawaxn--rovu88bernuorockartuzyukinfinitintuitateshinanomachim" + + "kentateyamavocatanzarowebspacebizenakanojohanamakinoharassnasaba" + + "erobatickets3-ap-southeast-2xn--rros-granvindafjordxn--rskog-uua" + + "xn--rst-0narutokyotangovtunkoninjamisonxn--rsta-francaiseharaxn-" + + "-rvc1e0am3exn--ryken-vuaxn--ryrvik-byaxn--s-1faithruheredumbrell" + + "ajollamericanexpressexyxn--s9brj9communitysnesarufutsunomiyawaka" + + "saikaitakoelnxn--sandnessjen-ogbizxn--sandy-yuaxn--seral-lraxn--" + + "ses554gxn--sgne-gratangenxn--skierv-utazaskoyabearalvahkijobserv" + + "erisignieznoipifonymishimatsunoxn--skjervy-v1axn--skjk-soaxn--sk" + + "nit-yqaxn--sknland-fxaxn--slat-5narviikamitondabayashiogamagoriz" + + "iaxn--slt-elabbvieeexn--smla-hraxn--smna-gratis-a-bulls-fanxn--s" + + "nase-nraxn--sndre-land-0cbremangerxn--snes-poaxn--snsa-roaxn--sr" + + "-aurdal-l8axn--sr-fron-q1axn--sr-odal-q1axn--sr-varanger-ggbeski" + + "dyn-o-saurlandes3-website-ap-southeast-1xn--srfold-byaxn--srreis" + + "a-q1axn--srum-grazxn--stfold-9xaxn--stjrdal-s1axn--stjrdalshalse" + + "n-sqbestbuyshouses3-website-ap-southeast-2xn--stre-toten-zcbstud" + + "yndns-at-homedepotenzamamicrolightingxn--t60b56axn--tckweatherch" + + "annelxn--tiq49xqyjevnakershuscountryestateofdelawarezzoologyxn--" + + "tjme-hraxn--tn0agrinet-freakstuff-4-salexn--tnsberg-q1axn--tor13" + + "1oxn--trany-yuaxn--trgstad-r1axn--trna-woaxn--troms-zuaxn--tysvr" + + "-vraxn--uc0atvarggatrentoyokawaxn--uc0ay4axn--uist22hammarfeasta" + + "fricapetownnews-stagingxn--uisz3gxn--unjrga-rtaobaokinawashirosa" + + "tochiokinoshimalatvuopmiasakuchinotsuchiurakawalesundxn--unup4yx" + + "n--uuwu58axn--vads-jraxn--vard-jraxn--vegrshei-c0axn--vermgensbe" + + "rater-ctbetainaboxfusejnynysadodgeometre-experts-comptables3-web" + + "site-eu-west-1xn--vermgensberatung-pwbieigersundray-dnsupdaterno" + + "pilawavoues3-fips-us-gov-west-1xn--vestvgy-ixa6oxn--vg-yiabcgxn-" + + "-vgan-qoaxn--vgsy-qoa0jewelryxn--vgu402comobilyxn--vhquvaroyxn--" + + "vler-qoaxn--vre-eiker-k8axn--vrggt-xqadxn--vry-yla5gxn--vuq861bi" + + "elawalmartatsunoceanographiquevje-og-hornnes3-website-sa-east-1x" + + "n--w4r85el8fhu5dnraxn--w4rs40lxn--wcvs22dxn--wgbh1comparemarkerr" + + "yhotelsasayamaxn--wgbl6axn--xhq521biellaakesvuemieleccexn--xkc2a" + + "l3hye2axn--xkc2dl3a5ee0hamurakamigoris-a-photographerokuappfizer" + + "xn--y9a3aquariumissilewismillerxn--yer-znarvikoshimizumakis-an-a" + + "narchistoricalsocietyxn--yfro4i67oxn--ygarden-p1axn--ygbi2ammxn-" + + "-3oq18vl8pn36axn--ystre-slidre-ujbieszczadygeyachimataikikuchiku" + + "seikarugamvikareliancexn--zbx025dxn--zf0ao64axn--zf0avxn--3pxu8k" + + "onyveloftrentino-aadigexn--zfr164bievatmallorcadaques3-website-u" + + "s-east-1xperiaxz" + +// nodes is the list of nodes. Each node is represented as a uint32, which +// encodes the node's children, wildcard bit and node type (as an index into +// the children array), ICANN bit and text. +// +// If the table was generated with the -comments flag, there is a //-comment +// after each node's data. In it is the nodes-array indexes of the children, +// formatted as (n0x1234-n0x1256), with * denoting the wildcard bit. The +// nodeType is printed as + for normal, ! for exception, and o for parent-only +// nodes that have children but don't match a domain label in their own right. +// An I denotes an ICANN domain. +// +// The layout within the uint32, from MSB to LSB, is: +// [ 0 bits] unused +// [10 bits] children index +// [ 1 bits] ICANN bit +// [15 bits] text index +// [ 6 bits] text length +var nodes = [...]uint32{ + 0x31fe83, + 0x28e944, + 0x2ed8c6, + 0x380743, + 0x380746, + 0x3a5306, + 0x3b5e43, + 0x30a7c4, + 0x20d0c7, + 0x2ed508, + 0x1a07102, + 0x31f1c7, + 0x368c09, + 0x2d68ca, + 0x2d68cb, + 0x238503, + 0x2dec46, + 0x23d6c5, + 0x1e07542, + 0x21cf84, + 0x266d03, + 0x346145, + 0x22035c2, + 0x20a643, + 0x271f944, + 0x342285, + 0x2a10042, + 0x38a48e, + 0x255083, + 0x3affc6, + 0x2e00142, + 0x2d4207, + 0x240d86, + 0x3204f02, + 0x22ee43, + 0x256204, + 0x32d106, + 0x25b788, + 0x2811c6, + 0x378fc4, + 0x3600242, + 0x33b8c9, + 0x212107, + 0x2e6046, + 0x341809, + 0x2a0048, + 0x33a904, + 0x2a0f46, + 0x21f886, + 0x3a02d42, + 0x3a014f, + 0x28c84e, + 0x21bfc4, + 0x382c85, + 0x30a6c5, + 0x2e2109, + 0x249089, + 0x33b1c7, + 0x23f8c6, + 0x20ae43, + 0x3e01d42, + 0x2e3203, + 0x225d0a, + 0x20cac3, + 0x242f85, + 0x28e142, + 0x28e149, + 0x4200bc2, + 0x209204, + 0x28ad46, + 0x2e5c05, + 0x361644, + 0x4a1a344, + 0x203ec3, + 0x218d04, + 0x4e00702, + 0x2f8e84, + 0x52f5f04, + 0x339bca, + 0x5600f82, + 0x28bc47, + 0x281548, + 0x6206502, + 0x31d0c7, + 0x2c6d44, + 0x2c6d47, + 0x393c45, + 0x35e887, + 0x33af86, + 0x271dc4, + 0x378385, + 0x28ea47, + 0x72001c2, + 0x224143, + 0x200c42, + 0x200c43, + 0x760b5c2, + 0x20f4c5, + 0x7a01d02, + 0x357844, + 0x27e405, + 0x21bf07, + 0x25aece, + 0x2bf044, + 0x23df04, + 0x211c43, + 0x28a4c9, + 0x30eacb, + 0x2ea6c8, + 0x3415c8, + 0x306208, + 0x2b7288, + 0x33a74a, + 0x35e787, + 0x321606, + 0x7e8f282, + 0x36a683, + 0x377683, + 0x37fd44, + 0x3b5e83, + 0x32c343, + 0x1727e02, + 0x8203302, + 0x283f45, + 0x29e006, + 0x2da184, + 0x388547, + 0x2fa686, + 0x389384, + 0x3aa107, + 0x223d43, + 0x86cd5c2, + 0x8a0d342, + 0x8e1e642, + 0x21e646, + 0x9200002, + 0x2501c5, + 0x329343, + 0x201684, + 0x2efb04, + 0x2efb05, + 0x203c43, + 0x979c783, + 0x9a092c2, + 0x291d85, + 0x291d8b, + 0x343c06, + 0x21270b, + 0x226544, + 0x213a49, + 0x2148c4, + 0x9e14b02, + 0x215943, + 0x216283, + 0x1616b42, + 0x275fc3, + 0x216b4a, + 0xa201102, + 0x21d205, + 0x29a88a, + 0x2e0544, + 0x201103, + 0x325384, + 0x21ae03, + 0x21ae04, + 0x21ae07, + 0x21b605, + 0x21d685, + 0x21dc46, + 0x21dfc6, + 0x21ea43, + 0x222688, + 0x206c03, + 0xa60c702, + 0x245848, + 0x23614b, + 0x228908, + 0x228e06, + 0x229dc7, + 0x22da48, + 0xb6024c2, + 0xba430c2, + 0x32da08, + 0x233347, + 0x2e7b45, + 0x2e7b48, + 0x2c3b08, + 0x2be483, + 0x232e04, + 0x37fd82, + 0xbe34382, + 0xc23e102, + 0xca37302, + 0x237303, + 0xce01382, + 0x30a783, + 0x300f44, + 0x20a043, + 0x322844, + 0x20d7cb, + 0x2322c3, + 0x2e6a46, + 0x245f44, + 0x2982ce, + 0x381245, + 0x3b00c8, + 0x263347, + 0x26334a, + 0x22e803, + 0x317a07, + 0x30ec85, + 0x23a384, + 0x272706, + 0x272707, + 0x330f44, + 0x301f87, + 0x25a184, + 0x25b204, + 0x25b206, + 0x25f704, + 0x36bdc6, + 0x216983, + 0x233108, + 0x316ec8, + 0x23dec3, + 0x275f83, + 0x3a6604, + 0x3aae83, + 0xd235f42, + 0xd6df482, + 0x207143, + 0x203f86, + 0x2a1043, + 0x285184, + 0xda165c2, + 0x2165c3, + 0x35f083, + 0x21fe02, + 0xde008c2, + 0x2c9786, + 0x23e347, + 0x2fd645, + 0x38fd04, + 0x294d45, + 0x2f8a47, + 0x2add85, + 0x2e4689, + 0x2e9906, + 0x2ef808, + 0x2fd546, + 0xe20e982, + 0x2ddb08, + 0x300d06, + 0x219205, + 0x316887, + 0x316dc4, + 0x316dc5, + 0x281384, + 0x345d88, + 0xe6127c2, + 0xea04882, + 0x33ca06, + 0x2cf588, + 0x34d485, + 0x351546, + 0x356108, + 0x371488, + 0xee35dc5, + 0xf214f44, + 0x34e247, + 0xf614602, + 0xfa22902, + 0x10e0f882, + 0x28ae45, + 0x2aaa45, + 0x30af86, + 0x350007, + 0x386287, + 0x11638543, + 0x2b0307, + 0x30e7c8, + 0x3a0849, + 0x38a647, + 0x3b9c87, + 0x238788, + 0x238f86, + 0x239e86, + 0x23aacc, + 0x23c08a, + 0x23c407, + 0x23d58b, + 0x23e187, + 0x23e18e, + 0x19a3f304, + 0x240244, + 0x242547, + 0x3ac747, + 0x246d46, + 0x246d47, + 0x247407, + 0x19e29682, + 0x2495c6, + 0x2495ca, + 0x24a08b, + 0x24ac87, + 0x24b845, + 0x24bb83, + 0x24bdc6, + 0x24bdc7, + 0x20d283, + 0x1a206e02, + 0x24c78a, + 0x1a769d02, + 0x1aa4f282, + 0x1ae4dd42, + 0x1b240e82, + 0x24e9c5, + 0x24ef44, + 0x1ba1a442, + 0x2f8f05, + 0x24a683, + 0x2149c5, + 0x2b7184, + 0x205ec4, + 0x25a486, + 0x262586, + 0x291f83, + 0x204844, + 0x3894c3, + 0x1c204c82, + 0x210ac4, + 0x210ac6, + 0x34e7c5, + 0x37e946, + 0x316988, + 0x273544, + 0x266ac8, + 0x398785, + 0x22bc88, + 0x2b2dc6, + 0x26d907, + 0x233d84, + 0x233d86, + 0x242bc3, + 0x393fc3, + 0x211d08, + 0x322004, + 0x356747, + 0x20c7c6, + 0x2dedc9, + 0x322a88, + 0x325448, + 0x331ac4, + 0x35f103, + 0x229942, + 0x1d2234c2, + 0x1d61a202, + 0x36c083, + 0x1da08e02, + 0x20d204, + 0x3521c6, + 0x3b3745, + 0x24fa83, + 0x23cf44, + 0x2b95c7, + 0x25a783, + 0x251208, + 0x218405, + 0x264143, + 0x27e385, + 0x27e4c4, + 0x300a06, + 0x218f84, + 0x21ab86, + 0x21be46, + 0x210584, + 0x23e543, + 0x1de1a582, + 0x23dd05, + 0x20b9c3, + 0x1e20c882, + 0x23aa83, + 0x2231c5, + 0x23cac3, + 0x23cac9, + 0x1e606b82, + 0x1ee07842, + 0x2918c5, + 0x2211c6, + 0x2d9d46, + 0x2bb248, + 0x2bb24b, + 0x203fcb, + 0x220bc5, + 0x2fd845, + 0x2cdfc9, + 0x1600302, + 0x210748, + 0x213d44, + 0x1f601842, + 0x326403, + 0x1fecdd46, + 0x348e08, + 0x20208b42, + 0x2bdec8, + 0x2060c182, + 0x2bf7ca, + 0x20a3fd03, + 0x203606, + 0x36cc48, + 0x209708, + 0x3b3a46, + 0x37c807, + 0x3a0347, + 0x34daca, + 0x2e05c4, + 0x354d44, + 0x368649, + 0x2139fb45, + 0x28ca46, + 0x210083, + 0x253d44, + 0x2160df44, + 0x20df47, + 0x22c507, + 0x234404, + 0x2df805, + 0x30b048, + 0x375e07, + 0x381007, + 0x21a07602, + 0x32e984, + 0x29b188, + 0x2504c4, + 0x251844, + 0x251c45, + 0x251d87, + 0x222349, + 0x252a04, + 0x253149, + 0x253388, + 0x253ac4, + 0x253ac7, + 0x21e54003, + 0x254187, + 0x1609c42, + 0x16b4a42, + 0x254b86, + 0x2550c7, + 0x255584, + 0x257687, + 0x258d47, + 0x259983, + 0x2f6802, + 0x207d82, + 0x231683, + 0x231684, + 0x23168b, + 0x3416c8, + 0x263c84, + 0x25c985, + 0x25eb47, + 0x260105, + 0x2c8c0a, + 0x263bc3, + 0x22206b02, + 0x206b04, + 0x267189, + 0x26a743, + 0x26a807, + 0x373089, + 0x212508, + 0x2db543, + 0x282f07, + 0x283649, + 0x23d483, + 0x289844, + 0x28d209, + 0x290146, + 0x21c203, + 0x200182, + 0x264d83, + 0x2b4847, + 0x2c3e85, + 0x3413c6, + 0x259004, + 0x374e05, + 0x225cc3, + 0x20e646, + 0x213c42, + 0x3a1784, + 0x2260d382, + 0x226603, + 0x22a01802, + 0x251743, + 0x21e444, + 0x21e447, + 0x201986, + 0x20df02, + 0x22e0dec2, + 0x2c4244, + 0x23235182, + 0x23601b82, + 0x265704, + 0x265705, + 0x345105, + 0x35c386, + 0x23a074c2, + 0x2074c5, + 0x213005, + 0x2157c3, + 0x219d06, + 0x21a645, + 0x21e5c2, + 0x34d0c5, + 0x21e5c4, + 0x228203, + 0x22a443, + 0x23e11442, + 0x2dcf47, + 0x376084, + 0x376089, + 0x253c44, + 0x2357c3, + 0x300589, + 0x389e08, + 0x242aa8c4, + 0x2aa8c6, + 0x219983, + 0x25d3c3, + 0x323043, + 0x246eebc2, + 0x379b82, + 0x24a17202, + 0x32af48, + 0x358e08, + 0x3a5a46, + 0x2fd0c5, + 0x317885, + 0x333d07, + 0x2247c5, + 0x210642, + 0x24e04742, + 0x160a442, + 0x2447c8, + 0x2dda45, + 0x2bfbc4, + 0x2f2845, + 0x381d87, + 0x240944, + 0x24c682, + 0x25200582, + 0x33ffc4, + 0x21ca07, + 0x292507, + 0x35e844, + 0x29a843, + 0x23de04, + 0x23de08, + 0x23a1c6, + 0x27258a, + 0x222204, + 0x29abc8, + 0x290584, + 0x229ec6, + 0x29c484, + 0x28b146, + 0x376349, + 0x274847, + 0x241243, + 0x256351c2, + 0x2755c3, + 0x214d02, + 0x25a52e42, + 0x313486, + 0x374588, + 0x2ac047, + 0x3ab249, + 0x299f49, + 0x2acf05, + 0x2adec9, + 0x2ae685, + 0x2ae7c9, + 0x2afe45, + 0x2b11c8, + 0x25e0a104, + 0x26259ac7, + 0x2b13c3, + 0x2b13c7, + 0x3ba046, + 0x2b1a47, + 0x2a9b05, + 0x2a2cc3, + 0x26636d02, + 0x339704, + 0x26a42a42, + 0x266603, + 0x26e206c2, + 0x30df06, + 0x2814c5, + 0x2b3cc7, + 0x332043, + 0x32c2c4, + 0x217003, + 0x342c43, + 0x27205e82, + 0x27a0c442, + 0x3a5404, + 0x2f67c3, + 0x24e545, + 0x27e01c82, + 0x286007c2, + 0x2c8286, + 0x322144, + 0x38c444, + 0x38c44a, + 0x28e00942, + 0x38298a, + 0x39b8c8, + 0x29231604, + 0x2046c3, + 0x20d8c3, + 0x306349, + 0x25bd09, + 0x364986, + 0x29655783, + 0x335d45, + 0x30d2cd, + 0x39ba86, + 0x204f4b, + 0x29a02b02, + 0x225b48, + 0x2be22782, + 0x2c203e02, + 0x2b1685, + 0x2c604182, + 0x266847, + 0x21b987, + 0x20bf43, + 0x23b188, + 0x2ca02542, + 0x3780c4, + 0x21a8c3, + 0x348505, + 0x364603, + 0x33c406, + 0x212a84, + 0x275f43, + 0x2b6443, + 0x2ce09942, + 0x2fd7c4, + 0x379c85, + 0x3b6587, + 0x280003, + 0x2b5103, + 0x2b5c03, + 0x1631182, + 0x2b5cc3, + 0x2b63c3, + 0x2d2086c2, + 0x3a2e44, + 0x262786, + 0x34ba83, + 0x2086c3, + 0x2d6b8042, + 0x2b8048, + 0x2b8304, + 0x37ce46, + 0x2b8bc7, + 0x258346, + 0x2a0304, + 0x3b201702, + 0x3b9f0b, + 0x307c0e, + 0x221d4f, + 0x2ac5c3, + 0x3ba64d42, + 0x160b542, + 0x3be00a82, + 0x2e89c3, + 0x2e4903, + 0x2de046, + 0x207986, + 0x203007, + 0x304704, + 0x3c221302, + 0x3c618742, + 0x3a1205, + 0x2e7007, + 0x38c946, + 0x3ca28142, + 0x228144, + 0x2bc743, + 0x3ce09a02, + 0x3d366443, + 0x2bce04, + 0x2c5409, + 0x16cb602, + 0x3d605242, + 0x385d85, + 0x3dacb882, + 0x3de03582, + 0x3541c7, + 0x21b2c9, + 0x368e8b, + 0x3a0105, + 0x2714c9, + 0x384d06, + 0x343c47, + 0x3e206844, + 0x341d89, + 0x380907, + 0x348ac7, + 0x2122c3, + 0x2122c6, + 0x312247, + 0x263a43, + 0x263a46, + 0x3ea01cc2, + 0x3ee022c2, + 0x22bf03, + 0x32bec5, + 0x25a007, + 0x227906, + 0x2c3e05, + 0x207a84, + 0x28ddc5, + 0x2fae04, + 0x3f204bc2, + 0x337447, + 0x2ca604, + 0x24f3c4, + 0x25bc0d, + 0x25d749, + 0x3ab748, + 0x25e044, + 0x234a85, + 0x322907, + 0x3329c4, + 0x2fa747, + 0x204bc5, + 0x3f6ac504, + 0x2b5e05, + 0x269404, + 0x256fc6, + 0x34fe05, + 0x3fa048c2, + 0x2011c4, + 0x2011c5, + 0x3802c6, + 0x206d85, + 0x3c0144, + 0x2cda83, + 0x208d46, + 0x222545, + 0x22b605, + 0x34ff04, + 0x222283, + 0x22228c, + 0x3fe90a82, + 0x40206702, + 0x40600282, + 0x211a83, + 0x211a84, + 0x40a02942, + 0x2fba48, + 0x341485, + 0x34c984, + 0x36ee86, + 0x40e0d842, + 0x41234502, + 0x41601fc2, + 0x2a6a85, + 0x210446, + 0x226144, + 0x32d646, + 0x28ba06, + 0x215c83, + 0x41b2770a, + 0x2f6b05, + 0x2f6fc3, + 0x22a9c6, + 0x30c989, + 0x22a9c7, + 0x29f648, + 0x29ff09, + 0x241b08, + 0x22e546, + 0x209b03, + 0x41e0c202, + 0x395343, + 0x395349, + 0x333608, + 0x42253442, + 0x42604a82, + 0x229443, + 0x2e4505, + 0x25c404, + 0x2c9ec9, + 0x26eb44, + 0x2e0908, + 0x2050c3, + 0x20dc44, + 0x2acd03, + 0x221208, + 0x25bb47, + 0x42e281c2, + 0x270d02, + 0x388b05, + 0x272dc9, + 0x28cac3, + 0x284bc4, + 0x335d04, + 0x227543, + 0x28580a, + 0x43382842, + 0x43601182, + 0x2cd543, + 0x384f83, + 0x160dc02, + 0x20ffc3, + 0x43a14702, + 0x43e00802, + 0x4420f644, + 0x20f646, + 0x3b6a46, + 0x248c44, + 0x37d243, + 0x200803, + 0x2f60c3, + 0x24a406, + 0x30aa05, + 0x2cd6c7, + 0x343b09, + 0x2d2d85, + 0x2d3f46, + 0x2d4908, + 0x2d4b06, + 0x260ec4, + 0x2a1d8b, + 0x2d8403, + 0x2d8405, + 0x2d8548, + 0x22c2c2, + 0x3544c2, + 0x4464ea42, + 0x44a14642, + 0x221343, + 0x44e745c2, + 0x2745c3, + 0x2d8844, + 0x2d8e03, + 0x45605902, + 0x45a0c0c6, + 0x2af186, + 0x45edcac2, + 0x462162c2, + 0x4662a482, + 0x46a00e82, + 0x46e176c2, + 0x47202ec2, + 0x205383, + 0x344905, + 0x348206, + 0x4761bf84, + 0x34e5ca, + 0x20bd46, + 0x220e04, + 0x28a483, + 0x4820ea42, + 0x204d42, + 0x23d503, + 0x48608e83, + 0x2d8047, + 0x34fd07, + 0x49e31787, + 0x23fcc7, + 0x2309c3, + 0x33188a, + 0x263544, + 0x3863c4, + 0x3863ca, + 0x24b685, + 0x4a2190c2, + 0x254b43, + 0x4a601942, + 0x21b543, + 0x275583, + 0x4ae02b82, + 0x2b0284, + 0x2256c4, + 0x208105, + 0x39e745, + 0x2fc3c6, + 0x2fc746, + 0x4b206802, + 0x4b600982, + 0x3139c5, + 0x2aee92, + 0x259806, + 0x231483, + 0x315a06, + 0x231485, + 0x1616b82, + 0x53a17102, + 0x35fd43, + 0x217103, + 0x35d703, + 0x53e02c82, + 0x38a783, + 0x54205b82, + 0x20cc43, + 0x3a2e88, + 0x231e83, + 0x231e86, + 0x3b0c87, + 0x26c286, + 0x26c28b, + 0x220d47, + 0x339504, + 0x54a00e42, + 0x341305, + 0x54e08e43, + 0x2aec83, + 0x32de85, + 0x331783, + 0x55331786, + 0x2108ca, + 0x2488c3, + 0x240c44, + 0x2cf4c6, + 0x2364c6, + 0x55601a03, + 0x32c187, + 0x364887, + 0x2a3885, + 0x251046, + 0x222583, + 0x57619f43, + 0x57a0cb42, + 0x34bd44, + 0x22c24c, + 0x232f09, + 0x2445c7, + 0x38ad45, + 0x252c84, + 0x25e6c8, + 0x265d45, + 0x57e6c505, + 0x27b709, + 0x2e6103, + 0x24f204, + 0x5821cc82, + 0x221543, + 0x5869bf42, + 0x3bbe86, + 0x16235c2, + 0x58a35b42, + 0x2a6988, + 0x2ac343, + 0x2b5d47, + 0x2daa05, + 0x2e5205, + 0x2e520b, + 0x2e58c6, + 0x2e5406, + 0x2e9006, + 0x232b84, + 0x2e9246, + 0x58eeae88, + 0x246003, + 0x231a43, + 0x231a44, + 0x2ea484, + 0x2eab87, + 0x2ec3c5, + 0x592ec502, + 0x59607082, + 0x207085, + 0x295bc4, + 0x2ef38b, + 0x2efa08, + 0x2998c4, + 0x228182, + 0x59e99842, + 0x350e83, + 0x2efec4, + 0x2f0185, + 0x2f0607, + 0x2f2384, + 0x220c04, + 0x5a204102, + 0x36f5c9, + 0x2f3185, + 0x3a03c5, + 0x2f3e45, + 0x5a621483, + 0x2f4dc4, + 0x2f4dcb, + 0x2f5204, + 0x2f5c0b, + 0x2f6005, + 0x221e8a, + 0x2f7608, + 0x2f780a, + 0x2f7fc3, + 0x2f7fca, + 0x5aa33502, + 0x5ae2fa42, + 0x236903, + 0x5b2f9f02, + 0x2f9f03, + 0x5b71c482, + 0x5bb29ac2, + 0x2fac84, + 0x2227c6, + 0x32d385, + 0x2fd4c3, + 0x320446, + 0x317345, + 0x262a84, + 0x5be06b42, + 0x2ba844, + 0x2cdc4a, + 0x22fd07, + 0x2e5e86, + 0x2612c7, + 0x20c743, + 0x2bce48, + 0x39fd8b, + 0x230305, + 0x2f41c5, + 0x2f41c6, + 0x2ea004, + 0x3bf388, + 0x20e543, + 0x21f784, + 0x21f787, + 0x355746, + 0x344b06, + 0x29810a, + 0x250d44, + 0x250d4a, + 0x5c20c386, + 0x20c387, + 0x25ca07, + 0x27b0c4, + 0x27b0c9, + 0x262445, + 0x2439cb, + 0x2eef43, + 0x21ad43, + 0x5c625b03, + 0x23a584, + 0x5ca00482, + 0x2f70c6, + 0x5cea2a45, + 0x315c45, + 0x258586, + 0x352b04, + 0x5d2044c2, + 0x24bbc4, + 0x5d60b282, + 0x28b5c5, + 0x236c84, + 0x22cb43, + 0x5de17142, + 0x217143, + 0x273e86, + 0x5e204242, + 0x2241c8, + 0x22a844, + 0x22a846, + 0x204dc6, + 0x25ec04, + 0x208cc5, + 0x214e48, + 0x215647, + 0x2159c7, + 0x2159cf, + 0x29b086, + 0x22f483, + 0x22f484, + 0x36edc4, + 0x213103, + 0x22a004, + 0x2494c4, + 0x5e60fd02, + 0x291cc3, + 0x24bf43, + 0x5ea0d2c2, + 0x22f043, + 0x20d2c3, + 0x21d70a, + 0x2e7d07, + 0x381f0c, + 0x3821c6, + 0x2f5a86, + 0x2f6447, + 0x5ee0e947, + 0x252d49, + 0x245984, + 0x253e04, + 0x5f221382, + 0x5f600a02, + 0x2984c6, + 0x32bf84, + 0x2df606, + 0x239048, + 0x2bf2c4, + 0x266886, + 0x2d9d05, + 0x26e488, + 0x2041c3, + 0x26fd85, + 0x270b03, + 0x3a04c3, + 0x3a04c4, + 0x206ac3, + 0x5fa0e602, + 0x5fe00742, + 0x2eee09, + 0x273885, + 0x276bc4, + 0x27ab05, + 0x217e84, + 0x2c62c7, + 0x36ecc5, + 0x231944, + 0x231948, + 0x2d6206, + 0x2dac04, + 0x2e0788, + 0x2e1fc7, + 0x60202502, + 0x2e6f44, + 0x2131c4, + 0x348cc7, + 0x60602504, + 0x210f82, + 0x60a06742, + 0x227103, + 0x2dfc84, + 0x2b2143, + 0x370645, + 0x60e06d42, + 0x2eeac5, + 0x21b9c2, + 0x35c7c5, + 0x374745, + 0x61204d02, + 0x35f004, + 0x61606182, + 0x266d86, + 0x2a7806, + 0x272f08, + 0x2c7588, + 0x30de84, + 0x2f97c5, + 0x395809, + 0x2fd8c4, + 0x210884, + 0x208483, + 0x61a1f545, + 0x2cb6c7, + 0x28d004, + 0x31288d, + 0x332182, + 0x33f203, + 0x3479c3, + 0x61e00d02, + 0x397dc5, + 0x212cc7, + 0x23fd84, + 0x23fd87, + 0x2a0109, + 0x2cdd89, + 0x277e07, + 0x20f803, + 0x2ba348, + 0x2522c9, + 0x349c47, + 0x355685, + 0x395546, + 0x398bc6, + 0x3aaf05, + 0x25d845, + 0x62209142, + 0x37da45, + 0x2bad08, + 0x2c9546, + 0x626c0d47, + 0x2f6244, + 0x29bb07, + 0x300246, + 0x62a3b442, + 0x37ffc6, + 0x302d4a, + 0x3035c5, + 0x62ee6282, + 0x63260a02, + 0x312586, + 0x2b36c8, + 0x636926c7, + 0x63a04502, + 0x226783, + 0x36a846, + 0x22cf04, + 0x3b0b46, + 0x344e06, + 0x36d78a, + 0x377705, + 0x208806, + 0x2205c3, + 0x2205c4, + 0x203082, + 0x314a43, + 0x63e11ac2, + 0x2f8483, + 0x382c04, + 0x2b3804, + 0x2b380a, + 0x22e603, + 0x281288, + 0x22e60a, + 0x2b4247, + 0x309306, + 0x266c44, + 0x220cc2, + 0x228cc2, + 0x64207002, + 0x23ddc3, + 0x25c7c7, + 0x320707, + 0x28e8c4, + 0x39d147, + 0x2f0706, + 0x21e747, + 0x233484, + 0x398ac5, + 0x2ce485, + 0x6462be42, + 0x231146, + 0x327943, + 0x371742, + 0x383306, + 0x64a08bc2, + 0x64e05082, + 0x3c0985, + 0x6522a202, + 0x65604782, + 0x348085, + 0x39e345, + 0x2088c5, + 0x26f003, + 0x352285, + 0x2e5987, + 0x305cc5, + 0x311985, + 0x3b01c4, + 0x24d486, + 0x264544, + 0x65a00d42, + 0x666f2bc5, + 0x2ab647, + 0x3176c8, + 0x29f806, + 0x29f80d, + 0x2aac09, + 0x2aac12, + 0x359f05, + 0x36f8c3, + 0x66a08882, + 0x314544, + 0x39bb03, + 0x3963c5, + 0x304a45, + 0x66e1a902, + 0x264183, + 0x67231802, + 0x67a43242, + 0x67e1f342, + 0x2ed385, + 0x23fec3, + 0x36d408, + 0x68204382, + 0x686000c2, + 0x2b0246, + 0x35f2ca, + 0x205503, + 0x209f43, + 0x2ef103, + 0x69202642, + 0x77602cc2, + 0x77e0d582, + 0x206442, + 0x37fdc9, + 0x2caa44, + 0x23b488, + 0x782fd502, + 0x78603642, + 0x2f5e45, + 0x23d9c8, + 0x3a2fc8, + 0x25920c, + 0x22fac3, + 0x78a68dc2, + 0x78e0c402, + 0x2d3206, + 0x30a185, + 0x2a7b83, + 0x381c46, + 0x30a2c6, + 0x20d883, + 0x30bc43, + 0x30c146, + 0x30cd84, + 0x29d386, + 0x2d85c5, + 0x30d10a, + 0x2397c4, + 0x30e244, + 0x30f08a, + 0x79203442, + 0x2413c5, + 0x31018a, + 0x310a85, + 0x311344, + 0x311446, + 0x3115c4, + 0x221806, + 0x79611042, + 0x33c0c6, + 0x3b1b45, + 0x3b80c7, + 0x200206, + 0x2de844, + 0x2de847, + 0x327646, + 0x245345, + 0x245347, + 0x3abdc7, + 0x3abdce, + 0x232206, + 0x2fa605, + 0x202447, + 0x216303, + 0x3326c7, + 0x2172c5, + 0x21b0c4, + 0x2343c2, + 0x2432c7, + 0x304784, + 0x383884, + 0x270b8b, + 0x224e03, + 0x2d4c47, + 0x224e04, + 0x2f11c7, + 0x299543, + 0x33dd4d, + 0x398608, + 0x224604, + 0x231845, + 0x312bc5, + 0x313003, + 0x79a0c4c2, + 0x314a03, + 0x314d43, + 0x20f204, + 0x283745, + 0x22a4c7, + 0x220646, + 0x382943, + 0x38344b, + 0x259c8b, + 0x2ac9cb, + 0x2fbd4b, + 0x2c578a, + 0x30e48b, + 0x32420b, + 0x362f0c, + 0x38bf4b, + 0x3bdf51, + 0x3bfd8a, + 0x31604b, + 0x31630c, + 0x31660b, + 0x316b8a, + 0x317c8a, + 0x318c8e, + 0x31930b, + 0x3195ca, + 0x31a9d1, + 0x31ae0a, + 0x31b30b, + 0x31b84e, + 0x31c18c, + 0x31c68b, + 0x31c94e, + 0x31cccc, + 0x31d9ca, + 0x31eccc, + 0x79f1efca, + 0x31f7c8, + 0x320909, + 0x3232ca, + 0x32354a, + 0x3237cb, + 0x326d8e, + 0x327111, + 0x330189, + 0x3303ca, + 0x3313cb, + 0x334a0a, + 0x3354d6, + 0x336e4b, + 0x337b0a, + 0x337f4a, + 0x33a4cb, + 0x33b749, + 0x33e6c9, + 0x33ec8d, + 0x33f2cb, + 0x34040b, + 0x340dcb, + 0x347049, + 0x34768e, + 0x347dca, + 0x3494ca, + 0x349a0a, + 0x34a14b, + 0x34a98b, + 0x34ac4d, + 0x34c50d, + 0x34cd50, + 0x34d20b, + 0x35064c, + 0x3512cb, + 0x353ccb, + 0x35528e, + 0x355e0b, + 0x355e0d, + 0x35ae8b, + 0x35b90f, + 0x35bccb, + 0x35c50a, + 0x35cb49, + 0x35de09, + 0x35e18b, + 0x35e44e, + 0x36020b, + 0x361acf, + 0x36394b, + 0x363c0b, + 0x363ecb, + 0x3643ca, + 0x368a89, + 0x36e04f, + 0x372a8c, + 0x3732cc, + 0x37374e, + 0x373ccf, + 0x37408e, + 0x375690, + 0x375a8f, + 0x37660e, + 0x376f4c, + 0x377252, + 0x379891, + 0x37a18e, + 0x37a94e, + 0x37ae8e, + 0x37b20f, + 0x37b5ce, + 0x37b953, + 0x37be11, + 0x37c24c, + 0x37c54e, + 0x37c9cc, + 0x37de53, + 0x37ead0, + 0x37f30c, + 0x37f60c, + 0x37facb, + 0x38044e, + 0x380d8b, + 0x3816cb, + 0x382fcc, + 0x38b38a, + 0x38b74c, + 0x38ba4c, + 0x38bd49, + 0x38d7cb, + 0x38da88, + 0x38df49, + 0x38df4f, + 0x38f88b, + 0x7a39028a, + 0x391e4c, + 0x393009, + 0x393488, + 0x39368b, + 0x393d8b, + 0x39490a, + 0x394b8b, + 0x3950cc, + 0x396048, + 0x398d4b, + 0x39b1cb, + 0x39ef4e, + 0x3a05cb, + 0x3a1f0b, + 0x3ab94b, + 0x3abc09, + 0x3ac14d, + 0x3b1d4a, + 0x3b2c97, + 0x3b4398, + 0x3b6bc9, + 0x3b7d0b, + 0x3b8fd4, + 0x3b94cb, + 0x3b9a4a, + 0x3ba38a, + 0x3ba60b, + 0x3badd0, + 0x3bb1d1, + 0x3bc00a, + 0x3bd54d, + 0x3bdc4d, + 0x3c05cb, + 0x3c1206, + 0x231243, + 0x7a791143, + 0x26ed86, + 0x248805, + 0x22d287, + 0x3240c6, + 0x1608742, + 0x2c1fc9, + 0x320244, + 0x2e4d48, + 0x210943, + 0x314487, + 0x239202, + 0x2b3d03, + 0x7aa04542, + 0x2d0d06, + 0x2d2104, + 0x37a844, + 0x3443c3, + 0x3443c5, + 0x7b2cb8c2, + 0x7b6aeb44, + 0x27b007, + 0x7ba43282, + 0x238543, + 0x23cac3, + 0x323043, + 0x28cac3, + 0x208e83, + 0x201a03, + 0x200e03, + 0x207102, + 0x16fb88, + 0x20f882, + 0x323043, + 0x28cac3, + 0x208e83, + 0xe03, + 0x201a03, + 0x215443, + 0x32b7d6, + 0x32ca13, + 0x39cfc9, + 0x34e148, + 0x341189, + 0x310306, + 0x340010, + 0x24c9d3, + 0x355808, + 0x2a0a87, + 0x37d347, + 0x28db0a, + 0x232309, + 0x3961c9, + 0x28664b, + 0x33af86, + 0x20728a, + 0x228e06, + 0x31fe43, + 0x2dce85, + 0x233108, + 0x266e4d, + 0x28af0c, + 0x218c87, + 0x318fcd, + 0x214f44, + 0x23a84a, + 0x23bbca, + 0x23c08a, + 0x24ccc7, + 0x246b87, + 0x24a904, + 0x233d86, + 0x209d44, + 0x2c7ec8, + 0x26eb89, + 0x2bb246, + 0x2bb248, + 0x24d18d, + 0x2cdfc9, + 0x209708, + 0x3a0347, + 0x300fca, + 0x2550c6, + 0x2664c7, + 0x2bd584, + 0x292347, + 0x35180a, + 0x38690e, + 0x2247c5, + 0x29224b, + 0x32f709, + 0x25bd09, + 0x21b7c7, + 0x2936ca, + 0x348c07, + 0x307d49, + 0x20b808, + 0x33420b, + 0x2e4505, + 0x3ab60a, + 0x2734c9, + 0x331d0a, + 0x2d2e0b, + 0x38668b, + 0x2863d5, + 0x30be85, + 0x3a03c5, + 0x2f4dca, + 0x364a8a, + 0x32f487, + 0x2252c3, + 0x298448, + 0x2db34a, + 0x22a846, + 0x252109, + 0x26e488, + 0x2dac04, + 0x2b2149, + 0x2c7588, + 0x2b2d07, + 0x2f2bc6, + 0x2ab647, + 0x376d87, + 0x24a205, + 0x22460c, + 0x231845, + 0x238543, + 0x23cac3, + 0x323043, + 0x208e83, + 0x201a03, + 0x20f882, + 0x238543, + 0x208e83, + 0x200e03, + 0x201a03, + 0x238543, + 0x208e83, + 0xe03, + 0x231e83, + 0x201a03, + 0x16fb88, + 0x238543, + 0x23cac3, + 0x323043, + 0x28cac3, + 0x208e83, + 0xe03, + 0x201a03, + 0x16fb88, + 0x20f882, + 0x201742, + 0x23c2c2, + 0x202542, + 0x200542, + 0x2e6dc2, + 0x4638543, + 0x23cac3, + 0x21b583, + 0x323043, + 0x255783, + 0x28cac3, + 0x2dcd86, + 0x208e83, + 0x201a03, + 0x20bdc3, + 0x16fb88, + 0x345b44, + 0x20da07, + 0x2112c3, + 0x2b1684, + 0x208543, + 0x21b843, + 0x323043, + 0x36dc7, + 0x145944, + 0xf183, + 0x145c05, + 0x207102, + 0x19c783, + 0x5a0f882, + 0x1490fc9, + 0x9144d, + 0x9178d, + 0x23c2c2, + 0x31604, + 0x145c49, + 0x200442, + 0x5f4ed48, + 0xf4544, + 0x16fb88, + 0x1409702, + 0x1510cc6, + 0x239283, + 0x2bcc43, + 0x6638543, + 0x23a844, + 0x6a3cac3, + 0x6f23043, + 0x205e82, + 0x231604, + 0x208e83, + 0x301dc3, + 0x2014c2, + 0x201a03, + 0x222dc2, + 0x2fabc3, + 0x204242, + 0x205983, + 0x26e543, + 0x200202, + 0x16fb88, + 0x239283, + 0x301dc3, + 0x2014c2, + 0x2fabc3, + 0x204242, + 0x205983, + 0x26e543, + 0x200202, + 0x2fabc3, + 0x204242, + 0x205983, + 0x26e543, + 0x200202, + 0x238543, + 0x39c783, + 0x238543, + 0x23cac3, + 0x323043, + 0x231604, + 0x255783, + 0x28cac3, + 0x21bf84, + 0x208e83, + 0x201a03, + 0x20cb02, + 0x221483, + 0x16fb88, + 0x238543, + 0x23cac3, + 0x323043, + 0x28cac3, + 0x208e83, + 0x201a03, + 0x39c783, + 0x20f882, + 0x238543, + 0x23cac3, + 0x323043, + 0x231604, + 0x208e83, + 0x201a03, + 0x355685, + 0x21a902, + 0x207102, + 0x16fb88, + 0x1480cc8, + 0x323043, + 0x20fec1, + 0x201641, + 0x203c01, + 0x201301, + 0x267401, + 0x2ae601, + 0x211341, + 0x28a0c1, + 0x24dfc1, + 0x2fbf81, + 0x200141, + 0x200001, + 0x131645, + 0x16fb88, + 0x2008c1, + 0x201781, + 0x200301, + 0x200081, + 0x200181, + 0x200401, + 0x200041, + 0x2086c1, + 0x200101, + 0x200281, + 0x200801, + 0x200981, + 0x200441, + 0x204101, + 0x2227c1, + 0x200341, + 0x200741, + 0x2002c1, + 0x2000c1, + 0x203441, + 0x200201, + 0x200c81, + 0x2005c1, + 0x204541, + 0x238543, + 0x23cac3, + 0x323043, + 0x208e83, + 0x201a03, + 0x20f882, + 0x238543, + 0x23cac3, + 0x200442, + 0x201a03, + 0x36dc7, + 0x8cbc7, + 0x24386, + 0x44f4a, + 0x906c8, + 0x5c288, + 0x5c6c7, + 0xffc6, + 0xe1d45, + 0x11205, + 0x86286, + 0x12cf06, + 0x286644, + 0x31cf87, + 0x16fb88, + 0x2de944, + 0x238543, + 0x23cac3, + 0x323043, + 0x208e83, + 0x201a03, + 0x238543, + 0x23cac3, + 0x21b583, + 0x323043, + 0x255783, + 0x28cac3, + 0x208e83, + 0x201a03, + 0x21a902, + 0x2ba8c3, + 0x242043, + 0x2cc103, + 0x202d42, + 0x33eb43, + 0x203ec3, + 0x20fc03, + 0x200001, + 0x2ed0c5, + 0x203c43, + 0x226544, + 0x332083, + 0x322103, + 0x222903, + 0x383283, + 0xaa38543, + 0x240244, + 0x24ac83, + 0x207583, + 0x2228c3, + 0x23aa83, + 0x23cac3, + 0x23c803, + 0x202103, + 0x2aab03, + 0x322083, + 0x2bdec3, + 0x20df43, + 0x255684, + 0x257307, + 0x2f6802, + 0x25c003, + 0x263783, + 0x27e983, + 0x20fe03, + 0x20dec3, + 0xaf23043, + 0x209ac3, + 0x204c03, + 0x231603, + 0x34bc85, + 0x209c83, + 0x304d43, + 0xb207a83, + 0x374803, + 0x213643, + 0x229443, + 0x28cac3, + 0x22c2c2, + 0x20c0c3, + 0x208e83, + 0x1600e03, + 0x22b1c3, + 0x2014c3, + 0x21a743, + 0x201a03, + 0x36ea03, + 0x223583, + 0x221483, + 0x233503, + 0x30bcc3, + 0x2fad83, + 0x317345, + 0x20c843, + 0x2df706, + 0x2fadc3, + 0x349703, + 0x2205c4, + 0x20c9c3, + 0x386603, + 0x2f1a03, + 0x20bdc3, + 0x21a902, + 0x22fac3, + 0x30e403, + 0x30fac4, + 0x383884, + 0x21a5c3, + 0x16fb88, + 0x207102, + 0x200242, + 0x202d42, + 0x20cac2, + 0x201d02, + 0x201442, + 0x23de42, + 0x201842, + 0x207b02, + 0x201fc2, + 0x2281c2, + 0x214642, + 0x2745c2, + 0x20cb42, + 0x2e6dc2, + 0x21cc82, + 0x225b82, + 0x204102, + 0x2204c2, + 0x205842, + 0x200482, + 0x221dc2, + 0x2044c2, + 0x20d2c2, + 0x200a02, + 0x21f542, + 0x204782, + 0x7102, + 0x242, + 0x2d42, + 0xcac2, + 0x1d02, + 0x1442, + 0x3de42, + 0x1842, + 0x7b02, + 0x1fc2, + 0x281c2, + 0x14642, + 0x745c2, + 0xcb42, + 0xe6dc2, + 0x1cc82, + 0x25b82, + 0x4102, + 0x204c2, + 0x5842, + 0x482, + 0x21dc2, + 0x44c2, + 0xd2c2, + 0xa02, + 0x1f542, + 0x4782, + 0x238543, + 0x23cac3, + 0x323043, + 0x208e83, + 0x201a03, + 0x2442, + 0x238543, + 0x23cac3, + 0x323043, + 0x208e83, + 0x201a03, + 0x20f882, + 0x201a03, + 0xc638543, + 0x323043, + 0x28cac3, + 0x1a3443, + 0x219302, + 0x16fb88, + 0x238543, + 0x23cac3, + 0x323043, + 0x208e83, + 0x1a3443, + 0x201a03, + 0x4542, + 0x201c02, + 0x1442b45, + 0x232282, + 0x16fb88, + 0xf882, + 0x209d82, + 0x209b02, + 0x20ddc2, + 0x2190c2, + 0x206802, + 0x11205, + 0x201282, + 0x2014c2, + 0x202c82, + 0x200dc2, + 0x21cc82, + 0x3951c2, + 0x206742, + 0x260a42, + 0x36dc7, + 0x1501cd, + 0xe1dc9, + 0x5900b, + 0xe5848, + 0x56809, + 0x106046, + 0x323043, + 0x16fb88, + 0x145944, + 0xf183, + 0x145c05, + 0x16fb88, + 0x5d3c6, + 0x145c49, + 0x126447, + 0x207102, + 0x286644, + 0x20f882, + 0x238543, + 0x201742, + 0x23cac3, + 0x207b02, + 0x2de944, + 0x255783, + 0x253442, + 0x208e83, + 0x200442, + 0x201a03, + 0x3a03c6, + 0x323d8f, + 0x7156c3, + 0x16fb88, + 0x20f882, + 0x21b583, + 0x323043, + 0x28cac3, + 0xe03, + 0x152e1cb, + 0xe2648, + 0x14b7aca, + 0x14f5907, + 0x8dbcb, + 0x149785, + 0x36dc7, + 0x20f882, + 0x238543, + 0x323043, + 0x208e83, + 0x207102, + 0x200b42, + 0x2092c2, + 0xfe38543, + 0x248582, + 0x23cac3, + 0x209c42, + 0x20d382, + 0x323043, + 0x210642, + 0x259c42, + 0x2aeb02, + 0x2006c2, + 0x295e02, + 0x203102, + 0x200782, + 0x2351c2, + 0x2335c2, + 0x252e42, + 0x2b5102, + 0x2d2942, + 0x327982, + 0x2111c2, + 0x28cac3, + 0x200802, + 0x208e83, + 0x24d382, + 0x289e82, + 0x201a03, + 0x2485c2, + 0x20d2c2, + 0x221382, + 0x200742, + 0x204d02, + 0x2e6282, + 0x22be42, + 0x231802, + 0x2312c2, + 0x3195ca, + 0x35c50a, + 0x39090a, + 0x3c1382, + 0x208a82, + 0x212a42, + 0x10223fc9, + 0x1072c38a, + 0x1438547, + 0x10a02482, + 0x1416dc3, + 0x12c2, + 0x12c38a, + 0x252044, + 0x11238543, + 0x23cac3, + 0x253384, + 0x323043, + 0x231604, + 0x255783, + 0x28cac3, + 0x208e83, + 0xe3bc5, + 0x200e03, + 0x201a03, + 0x20c843, + 0x202443, + 0x16fb88, + 0x140ff44, + 0x1441c5, + 0x12620a, + 0x11ec42, + 0x1affc6, + 0x35ad1, + 0x11a23fc9, + 0x144248, + 0x10b388, + 0x8cf47, + 0xbc2, + 0x13164b, + 0x1b320a, + 0x71ca, + 0x26547, + 0x16fb88, + 0x114008, + 0x14507, + 0x17c2198b, + 0x23087, + 0xc702, + 0x5b907, + 0x1920a, + 0x8cc4f, + 0x4f70f, + 0x22902, + 0xf882, + 0xaaa48, + 0xe228a, + 0x6a08, + 0x64b88, + 0xdfbc8, + 0x4c82, + 0x42bcf, + 0xa670b, + 0xf8d08, + 0x3e607, + 0x185b8a, + 0x3af8b, + 0x57f89, + 0x185a87, + 0x6908, + 0x1089cc, + 0x81a87, + 0x1a800a, + 0xdd088, + 0x1aafce, + 0x2438e, + 0x2638b, + 0x27bcb, + 0x2920b, + 0x2c049, + 0x2ff8b, + 0x31ccd, + 0x329cb, + 0x62b4d, + 0x62ecd, + 0xfa44a, + 0x1836cb, + 0x3b64b, + 0x47085, + 0x1802cc10, + 0x12d40f, + 0x12db4f, + 0x37a4d, + 0xbf490, + 0xc182, + 0x18623a08, + 0x8ca48, + 0x18af52c5, + 0x52a0b, + 0x11f3d0, + 0x5ad08, + 0x6b0a, + 0x27d89, + 0x6b307, + 0x6b647, + 0x6b807, + 0x6bb87, + 0x6ca87, + 0x6d487, + 0x6ddc7, + 0x6e187, + 0x6f187, + 0x6f487, + 0x70147, + 0x70307, + 0x704c7, + 0x70687, + 0x70987, + 0x70e47, + 0x71707, + 0x72007, + 0x72c87, + 0x731c7, + 0x73387, + 0x73707, + 0x74487, + 0x74687, + 0x750c7, + 0x75287, + 0x75447, + 0x75dc7, + 0x76087, + 0x77a47, + 0x78187, + 0x78447, + 0x78bc7, + 0x78d87, + 0x79187, + 0x79687, + 0x79907, + 0x79d07, + 0x79ec7, + 0x7a087, + 0x7ae07, + 0x7c447, + 0x7c987, + 0x7cc87, + 0x7ce47, + 0x7d1c7, + 0x7d787, + 0x13c42, + 0x64c8a, + 0xe90c7, + 0x287c5, + 0x806d1, + 0x157c6, + 0x11318a, + 0xaa8ca, + 0x5d3c6, + 0xb880b, + 0x17202, + 0x3a1d1, + 0x1bbc89, + 0x9c0c9, + 0x351c2, + 0xa808a, + 0xac7c9, + 0xacf0f, + 0xada4e, + 0xae208, + 0x206c2, + 0xb649, + 0x1025ce, + 0xe8b4c, + 0xf328f, + 0x1a5b4e, + 0x1684c, + 0x18009, + 0x1c291, + 0x1f108, + 0x2ac92, + 0x2bb4d, + 0x33c4d, + 0x15208b, + 0x41cd5, + 0x164ec9, + 0xfcf8a, + 0x40809, + 0x4d650, + 0x4e70b, + 0x5898f, + 0x6390b, + 0x7298c, + 0x77650, + 0x8430a, + 0x853cd, + 0x894ce, + 0x8ef4a, + 0xede0c, + 0x176a54, + 0x1bb911, + 0x95a8b, + 0x97fcf, + 0xa290d, + 0xa76ce, + 0xb2bcc, + 0xb330c, + 0x160b0b, + 0x160e0e, + 0xd6750, + 0x11868b, + 0x1876cd, + 0x1bce4f, + 0xba0cc, + 0xbb0ce, + 0xbc011, + 0xc7c4c, + 0xc9307, + 0xc9c0d, + 0x130d4c, + 0x1605d0, + 0x174c0d, + 0xd1b47, + 0xd7c10, + 0xdd6c8, + 0xf178b, + 0x134c4f, + 0x3ef48, + 0x11338d, + 0x15c750, + 0x172e49, + 0x18e086c6, + 0xb8243, + 0xbc445, + 0x9a02, + 0x143889, + 0x5e04a, + 0x10fb06, + 0x2594a, + 0x1900c949, + 0x1c003, + 0xdebd1, + 0xdf009, + 0xe0407, + 0x35c4b, + 0xe67d0, + 0xe6c8c, + 0xe8e48, + 0xe9805, + 0xb988, + 0x1ad4ca, + 0x1c0c7, + 0x16bac7, + 0x982, + 0x12bcca, + 0x12e7c9, + 0x79545, + 0x402ca, + 0x9260f, + 0x4b8cb, + 0x14bd4c, + 0x17a492, + 0x94e45, + 0xec1c8, + 0x17618a, + 0x196f3d05, + 0x190ecc, + 0x129ac3, + 0x1951c2, + 0xfb30a, + 0x14fb70c, + 0x14f508, + 0x62d08, + 0x36d47, + 0xb282, + 0x4242, + 0x47590, + 0xa02, + 0x3904f, + 0x86286, + 0x7c0e, + 0xebbcb, + 0x8f148, + 0xda049, + 0x18f052, + 0x95cd, + 0x586c8, + 0x58ec9, + 0x5d50d, + 0x5e4c9, + 0x5e88b, + 0x60648, + 0x65808, + 0x65b88, + 0x65e49, + 0x6604a, + 0x6a98c, + 0xeb04a, + 0x10bd07, + 0x1f54d, + 0xfde8b, + 0x12004c, + 0x404c8, + 0x4f049, + 0x1b01d0, + 0xc2, + 0x2d3cd, + 0x2642, + 0x2cc2, + 0x10bc4a, + 0x11308a, + 0x11438b, + 0x3b80c, + 0x113b0a, + 0x113d8e, + 0xf2cd, + 0x11d708, + 0x4542, + 0x11f46c0e, + 0x1260ee4e, + 0x12f43f8a, + 0x1373a14e, + 0x13f9d38e, + 0x1460138c, + 0x1438547, + 0x1438549, + 0x1416dc3, + 0x14e3700c, + 0x15707789, + 0x15f3b509, + 0x12c2, + 0x146b51, + 0xed91, + 0x143ecd, + 0x13a091, + 0x19d2d1, + 0x12cf, + 0x36f4f, + 0x1076cc, + 0x13b44c, + 0x18954d, + 0x1b5295, + 0x10ed8c, + 0xea88c, + 0x122ed0, + 0x158fcc, + 0x16d9cc, + 0x191819, + 0x1a83d9, + 0x1aa459, + 0x1b3e94, + 0x1b8ad4, + 0x1c0d14, + 0x2394, + 0x3754, + 0x1670ee49, + 0x16dc0fc9, + 0x176ea949, + 0x1221f309, + 0x12c2, + 0x12a1f309, + 0x12c2, + 0x238a, + 0x12c2, + 0x1321f309, + 0x12c2, + 0x238a, + 0x12c2, + 0x13a1f309, + 0x12c2, + 0x1421f309, + 0x12c2, + 0x14a1f309, + 0x12c2, + 0x238a, + 0x12c2, + 0x1521f309, + 0x12c2, + 0x238a, + 0x12c2, + 0x15a1f309, + 0x12c2, + 0x1621f309, + 0x12c2, + 0x238a, + 0x12c2, + 0x16a1f309, + 0x12c2, + 0x1721f309, + 0x12c2, + 0x17a1f309, + 0x12c2, + 0x238a, + 0x12c2, + 0x35ac5, + 0x1b3204, + 0x146c0e, + 0xee4e, + 0x143f8a, + 0x13a14e, + 0x19d38e, + 0x138c, + 0x3700c, + 0x107789, + 0x13b509, + 0x10ee49, + 0x1c0fc9, + 0xea949, + 0x122f8d, + 0x2649, + 0x3a09, + 0x5bf04, + 0x11d8c4, + 0x126144, + 0x15f784, + 0x8de84, + 0x4b744, + 0x6e44, + 0x67344, + 0x8cf44, + 0x157e2c3, + 0xc182, + 0xf2c3, + 0x4c82, + 0x207102, + 0x20f882, + 0x201742, + 0x207602, + 0x207b02, + 0x200442, + 0x204242, + 0x238543, + 0x23cac3, + 0x323043, + 0x231603, + 0x208e83, + 0x201a03, + 0x16fb88, + 0x238543, + 0x23cac3, + 0x208e83, + 0x201a03, + 0x160c3, + 0x323043, + 0x31604, + 0x207102, + 0x39c783, + 0x1b638543, + 0x2bf347, + 0x323043, + 0x211a83, + 0x21bf84, + 0x208e83, + 0x201a03, + 0x243d0a, + 0x3a03c5, + 0x221483, + 0x205082, + 0x16fb88, + 0x16fb88, + 0xf882, + 0x127482, + 0x1bf51b0b, + 0x5ba45, + 0x35dc5, + 0x114b46, + 0x145944, + 0xf183, + 0x145c05, + 0x131645, + 0x16fb88, + 0x23087, + 0x38543, + 0x1c644d87, + 0x1432c6, + 0x1c93b345, + 0x143387, + 0x1b4d0a, + 0x1b4bc8, + 0x11887, + 0x6df88, + 0x99707, + 0x152cf, + 0x435c7, + 0x150d86, + 0x11f3d0, + 0x12a58f, + 0x20a89, + 0x10fb84, + 0x1cd4344e, + 0xb098c, + 0x5810a, + 0xa7987, + 0x3520a, + 0xbb49, + 0xb514c, + 0x4304a, + 0x5ec8a, + 0x145c49, + 0x10fb06, + 0xa7a4a, + 0xe8a, + 0xa4e49, + 0xde488, + 0xde786, + 0xe284d, + 0xbc8c5, + 0x126447, + 0x1019c9, + 0xf72c7, + 0xb5ed4, + 0x103acb, + 0xf8b4a, + 0xab10d, + 0xd3c3, + 0xd3c3, + 0x24386, + 0xd3c3, + 0x19c783, + 0x16fb88, + 0xf882, + 0x53384, + 0x5f843, + 0x155685, + 0x238543, + 0x23cac3, + 0x323043, + 0x208e83, + 0x201a03, + 0x203ec3, + 0x238543, + 0x23cac3, + 0x21b583, + 0x323043, + 0x28cac3, + 0x208e83, + 0x201a03, + 0x29c283, + 0x202443, + 0x203ec3, + 0x286644, + 0x238543, + 0x23cac3, + 0x323043, + 0x208e83, + 0x201a03, + 0x206683, + 0x238543, + 0x23cac3, + 0x207603, + 0x21b583, + 0x323043, + 0x231604, + 0x3797c3, + 0x229443, + 0x28cac3, + 0x208e83, + 0x201a03, + 0x221483, + 0x36a883, + 0x1ea38543, + 0x23cac3, + 0x250ac3, + 0x323043, + 0x212143, + 0x229443, + 0x201a03, + 0x204103, + 0x35f584, + 0x16fb88, + 0x1f238543, + 0x23cac3, + 0x2ae2c3, + 0x323043, + 0x28cac3, + 0x21bf84, + 0x208e83, + 0x201a03, + 0x20e943, + 0x16fb88, + 0x1fa38543, + 0x23cac3, + 0x21b583, + 0x200e03, + 0x201a03, + 0x16fb88, + 0x1438547, + 0x39c783, + 0x238543, + 0x23cac3, + 0x323043, + 0x231604, + 0x21bf84, + 0x208e83, + 0x201a03, + 0x131645, + 0x36dc7, + 0xb610b, + 0xdf404, + 0xbc8c5, + 0x1480cc8, + 0xae90d, + 0x20e6c505, + 0x7bd44, + 0x10c3, + 0x172d45, + 0x33b145, + 0x16fb88, + 0xd3c2, + 0x2bc3, + 0xf9306, + 0x31f948, + 0x3347c7, + 0x286644, + 0x39c286, + 0x3b5146, + 0x16fb88, + 0x2ddac3, + 0x342a49, + 0x26d615, + 0x6d61f, + 0x238543, + 0x3b3a52, + 0xf6306, + 0x114dc5, + 0x6b0a, + 0x27d89, + 0x3b380f, + 0x2de944, + 0x3490c5, + 0x304b10, + 0x34e347, + 0x200e03, + 0x293408, + 0x12ce46, + 0x29630a, + 0x230f04, + 0x2f3743, + 0x3a03c6, + 0x205082, + 0x22facb, + 0xe03, + 0x238543, + 0x23cac3, + 0x323043, + 0x28cac3, + 0x208e83, + 0x201a03, + 0x2f9a03, + 0x20f882, + 0x6ed43, + 0x208e83, + 0x201a03, + 0x238543, + 0x23cac3, + 0x323043, + 0x28cac3, + 0x201a03, + 0x238543, + 0x23cac3, + 0x323043, + 0x211a83, + 0x228243, + 0x201a03, + 0x20f882, + 0x238543, + 0x23cac3, + 0x208e83, + 0xe03, + 0x201a03, + 0x207102, + 0x238543, + 0x23cac3, + 0x323043, + 0x208e83, + 0x201a03, + 0x35dc5, + 0x286644, + 0x238543, + 0x23cac3, + 0x20f644, + 0x208e83, + 0x201a03, + 0x16fb88, + 0x238543, + 0x23cac3, + 0x323043, + 0x208e83, + 0x1a3443, + 0x201a03, + 0x238543, + 0x23cac3, + 0x21b583, + 0x204c03, + 0x28cac3, + 0x208e83, + 0xe03, + 0x201a03, + 0x20f882, + 0x238543, + 0x23cac3, + 0x323043, + 0x208e83, + 0x201a03, + 0x16fb88, + 0x238543, + 0x23cac3, + 0x323043, + 0x210543, + 0x707c3, + 0x11a83, + 0x208e83, + 0x201a03, + 0x3195ca, + 0x335289, + 0x35438b, + 0x35490a, + 0x35c50a, + 0x369bcb, + 0x38274a, + 0x38b38a, + 0x39090a, + 0x390b8b, + 0x3ad209, + 0x3af10a, + 0x3af7cb, + 0x3b978b, + 0x3bfb4a, + 0x238543, + 0x23cac3, + 0x21b583, + 0x28cac3, + 0x208e83, + 0xe03, + 0x201a03, + 0x35dcb, + 0x651c8, + 0x1174c9, + 0x16fb88, + 0x238543, + 0x26b304, + 0x20b342, + 0x21bf84, + 0x346145, + 0x203ec3, + 0x286644, + 0x238543, + 0x240244, + 0x23cac3, + 0x253384, + 0x2de944, + 0x231604, + 0x229443, + 0x208e83, + 0x201a03, + 0x22d585, + 0x206683, + 0x221483, + 0x20ec43, + 0x231944, + 0x20fe84, + 0x2cc105, + 0x16fb88, + 0x30dc84, + 0x36bdc6, + 0x281384, + 0x20f882, + 0x381107, + 0x254d87, + 0x251844, + 0x260105, + 0x374e05, + 0x2b13c5, + 0x231604, + 0x2cf6c8, + 0x23eb46, + 0x3bffc8, + 0x257cc5, + 0x2e4505, + 0x263544, + 0x201a03, + 0x2f4544, + 0x368dc6, + 0x3a04c3, + 0x231944, + 0x280bc5, + 0x2e4ac4, + 0x34da44, + 0x205082, + 0x2669c6, + 0x3a2906, + 0x30a185, + 0x207102, + 0x39c783, + 0x2760f882, + 0x223b84, + 0x207b02, + 0x28cac3, + 0x200e82, + 0x208e83, + 0x200442, + 0x215443, + 0x202443, + 0x16fb88, + 0x16fb88, + 0x323043, + 0x207102, + 0x2820f882, + 0x323043, + 0x270443, + 0x3797c3, + 0x32e5c4, + 0x208e83, + 0x201a03, + 0x16fb88, + 0x207102, + 0x28a0f882, + 0x238543, + 0x208e83, + 0xe03, + 0x201a03, + 0x482, + 0x208882, + 0x21a902, + 0x211a83, + 0x2ef783, + 0x207102, + 0x131645, + 0x16fb88, + 0x36dc7, + 0x20f882, + 0x23cac3, + 0x253384, + 0x2020c3, + 0x323043, + 0x204c03, + 0x28cac3, + 0x208e83, + 0x21eb43, + 0x201a03, + 0x2252c3, + 0x122213, + 0x124cd4, + 0x36dc7, + 0x139986, + 0x5e24b, + 0x24386, + 0x5c0c7, + 0x120589, + 0xe838a, + 0x9058d, + 0x14fecc, + 0x3954a, + 0x11205, + 0x1b4d48, + 0x86286, + 0x31586, + 0x12cf06, + 0x20c182, + 0x10b14c, + 0x1b33c7, + 0x2a691, + 0x238543, + 0x6df05, + 0x7588, + 0x18ec4, + 0x29cbe1c6, + 0x806c6, + 0xb9a06, + 0x960ca, + 0xb4003, + 0x2a24c984, + 0xe8345, + 0x18e43, + 0x2a63dc47, + 0xe3bc5, + 0xb88cc, + 0xf7a88, + 0xbd248, + 0xa6589, + 0x14dc08, + 0x1425886, + 0x2ab71549, + 0x14978a, + 0x16308, + 0x114b48, + 0x8cf44, + 0xb5ac5, + 0x2ae42bc3, + 0x2b332106, + 0x2b6f4dc4, + 0x2bb39d87, + 0x114b44, + 0x114b44, + 0x114b44, + 0x114b44, + 0x238543, + 0x23cac3, + 0x323043, + 0x28cac3, + 0x208e83, + 0x201a03, + 0x207102, + 0x20f882, + 0x323043, + 0x205e82, + 0x208e83, + 0x201a03, + 0x215443, + 0x373ccf, + 0x37408e, + 0x16fb88, + 0x238543, + 0x4db87, + 0x23cac3, + 0x323043, + 0x255783, + 0x208e83, + 0x201a03, + 0x20d4c3, + 0x20d4c7, + 0x200142, + 0x2ce609, + 0x200242, + 0x24788b, + 0x2c110a, + 0x2c67c9, + 0x201242, + 0x2100c6, + 0x26cd95, + 0x2479d5, + 0x275793, + 0x247f53, + 0x201d42, + 0x212c45, + 0x31d44c, + 0x27c6cb, + 0x29c705, + 0x20cac2, + 0x28e142, + 0x384c06, + 0x200bc2, + 0x3acc46, + 0x2dd20d, + 0x26540c, + 0x22cc84, + 0x200f82, + 0x203402, + 0x22b048, + 0x201d02, + 0x20a746, + 0x28bf04, + 0x26cf55, + 0x275913, + 0x216d03, + 0x33844a, + 0x205407, + 0x3145c9, + 0x38d4c7, + 0x20d342, + 0x200002, + 0x3ba886, + 0x212702, + 0x16fb88, + 0x216b42, + 0x201102, + 0x27f847, + 0x217387, + 0x222d85, + 0x20c702, + 0x225287, + 0x225448, + 0x2024c2, + 0x2430c2, + 0x237302, + 0x201382, + 0x242688, + 0x20a043, + 0x25fa08, + 0x2e9b0d, + 0x2322c3, + 0x32ec08, + 0x245f4f, + 0x24630e, + 0x339a4a, + 0x22e811, + 0x22ec90, + 0x2c34cd, + 0x2c380c, + 0x36a707, + 0x3385c7, + 0x39c349, + 0x20d302, + 0x201442, + 0x25db0c, + 0x25de0b, + 0x2008c2, + 0x360cc6, + 0x20e982, + 0x204882, + 0x222902, + 0x20f882, + 0x3b69c4, + 0x244387, + 0x229682, + 0x24a347, + 0x24b547, + 0x20d282, + 0x20c8c2, + 0x24da45, + 0x21a442, + 0x2f290e, + 0x2ab3cd, + 0x23cac3, + 0x28d58e, + 0x2c5c0d, + 0x25ac43, + 0x201482, + 0x2891c4, + 0x216582, + 0x20fac2, + 0x364145, + 0x373587, + 0x393202, + 0x207602, + 0x252f87, + 0x255ac8, + 0x2f6802, + 0x294ec6, + 0x25d98c, + 0x25dccb, + 0x206b02, + 0x26764f, + 0x267a10, + 0x267e0f, + 0x2681d5, + 0x268714, + 0x268c0e, + 0x268f8e, + 0x26930f, + 0x2696ce, + 0x269a54, + 0x269f53, + 0x26a40d, + 0x27d949, + 0x291ac3, + 0x201802, + 0x2b7505, + 0x206346, + 0x207b02, + 0x3a4ec7, + 0x323043, + 0x217202, + 0x37e548, + 0x22ea51, + 0x22ee90, + 0x2007c2, + 0x290e07, + 0x204182, + 0x332b07, + 0x209a02, + 0x342089, + 0x384bc7, + 0x27ac08, + 0x2be006, + 0x2ef683, + 0x339205, + 0x2022c2, + 0x207a82, + 0x3bac85, + 0x391345, + 0x204bc2, + 0x231043, + 0x2e4b47, + 0x205747, + 0x200502, + 0x25f1c4, + 0x211b83, + 0x211b89, + 0x215148, + 0x200282, + 0x202942, + 0x242387, + 0x263285, + 0x2ad208, + 0x215c87, + 0x21a243, + 0x294c86, + 0x2c334d, + 0x2c36cc, + 0x2c8346, + 0x209b02, + 0x20c202, + 0x204a82, + 0x245dcf, + 0x2461ce, + 0x374e87, + 0x20b302, + 0x2c72c5, + 0x2c72c6, + 0x214702, + 0x200802, + 0x228246, + 0x2b57c3, + 0x332a46, + 0x2d0285, + 0x2d028d, + 0x2d0855, + 0x2d108c, + 0x2d1e4d, + 0x2d2212, + 0x214642, + 0x2745c2, + 0x202ec2, + 0x249386, + 0x302486, + 0x200982, + 0x2063c6, + 0x202c82, + 0x39b505, + 0x200542, + 0x2ab4c9, + 0x2e324c, + 0x2e358b, + 0x200442, + 0x257708, + 0x2052c2, + 0x20cb42, + 0x278ec6, + 0x21f285, + 0x36c107, + 0x24bc85, + 0x28ea05, + 0x235d82, + 0x219a42, + 0x21cc82, + 0x2f3587, + 0x2613cd, + 0x26174c, + 0x317947, + 0x2235c2, + 0x225b82, + 0x23f688, + 0x343a08, + 0x34c008, + 0x313344, + 0x361087, + 0x2efc43, + 0x299842, + 0x206682, + 0x2f2149, + 0x3ab3c7, + 0x204102, + 0x2792c5, + 0x22fa42, + 0x236902, + 0x35dc83, + 0x35dc86, + 0x2f9a02, + 0x2fab42, + 0x200c02, + 0x281e06, + 0x345607, + 0x221282, + 0x206b42, + 0x25f84f, + 0x28d3cd, + 0x3029ce, + 0x2c5a8c, + 0x201a42, + 0x204142, + 0x2bde45, + 0x317e46, + 0x209002, + 0x205842, + 0x200482, + 0x215c04, + 0x2e9984, + 0x2b8706, + 0x204242, + 0x37d6c7, + 0x233803, + 0x233808, + 0x33cb48, + 0x240687, + 0x249286, + 0x202502, + 0x242603, + 0x351107, + 0x26ffc6, + 0x2e2d05, + 0x3136c8, + 0x206182, + 0x337547, + 0x21f542, + 0x332182, + 0x207f02, + 0x2e95c9, + 0x23b442, + 0x2018c2, + 0x248383, + 0x377787, + 0x2002c2, + 0x2e33cc, + 0x2e36cb, + 0x2c83c6, + 0x218d85, + 0x22a202, + 0x204782, + 0x2c1486, + 0x237e83, + 0x378407, + 0x243cc2, + 0x200d42, + 0x26cc15, + 0x247b95, + 0x275653, + 0x2480d3, + 0x2955c7, + 0x2c0ec8, + 0x379d90, + 0x3c020f, + 0x2c0ed3, + 0x2c6592, + 0x2ce1d0, + 0x2db58f, + 0x2dc512, + 0x2dffd1, + 0x2e0cd3, + 0x2e9392, + 0x2ea0cf, + 0x2f7c4e, + 0x2f9a92, + 0x2faed1, + 0x303e4f, + 0x347a4e, + 0x3559d1, + 0x2fee10, + 0x32f912, + 0x36fd51, + 0x3af4c6, + 0x30dd47, + 0x382ac7, + 0x203702, + 0x286d05, + 0x304887, + 0x21a902, + 0x218f42, + 0x230d85, + 0x226c43, + 0x244c06, + 0x26158d, + 0x2618cc, + 0x206442, + 0x31d2cb, + 0x27c58a, + 0x212b0a, + 0x2c04c9, + 0x2f0c0b, + 0x215dcd, + 0x304f8c, + 0x2f574a, + 0x277bcc, + 0x27d34b, + 0x29c54c, + 0x2b4c0b, + 0x2e31c3, + 0x36f946, + 0x3061c2, + 0x2fd502, + 0x256d03, + 0x203642, + 0x203643, + 0x260b86, + 0x268387, + 0x2c48c6, + 0x2e2448, + 0x343708, + 0x2cc7c6, + 0x20c402, + 0x309b4d, + 0x309e8c, + 0x2dea07, + 0x30db47, + 0x2302c2, + 0x221682, + 0x260982, + 0x255e82, + 0x20f882, + 0x208e83, + 0x201a03, + 0x238543, + 0x23cac3, + 0x323043, + 0x28cac3, + 0x21bf84, + 0x208e83, + 0x201a03, + 0x215443, + 0x207102, + 0x207542, + 0x2da97d45, + 0x2de97685, + 0x2e320c86, + 0x16fb88, + 0x2e6b68c5, + 0x20f882, + 0x201742, + 0x2ea34cc5, + 0x2ee852c5, + 0x2f285e07, + 0x2f6f6e09, + 0x2fa74084, + 0x207b02, + 0x217202, + 0x2fe56a05, + 0x302977c9, + 0x30785908, + 0x30ab3185, + 0x30f3f5c7, + 0x31227248, + 0x316ec085, + 0x31a00106, + 0x31e41489, + 0x323311c8, + 0x326c8988, + 0x32a9ef0a, + 0x32e7e204, + 0x332d99c5, + 0x336c30c8, + 0x33b85d85, + 0x21a602, + 0x33e11103, + 0x342aa246, + 0x3475d1c8, + 0x34a8ab86, + 0x34e8a688, + 0x35348206, + 0x356e2dc4, + 0x204d42, + 0x35addc87, + 0x35eaf444, + 0x36280087, + 0x367b0c87, + 0x200442, + 0x36aa3885, + 0x36e8f904, + 0x372f1447, + 0x37632c47, + 0x37a89006, + 0x37e38385, + 0x3829d7c7, + 0x386d5dc8, + 0x38ab7887, + 0x38ea6c89, + 0x3939e345, + 0x397778c7, + 0x39a974c6, + 0x39e102c8, + 0x3279cd, + 0x27a209, + 0x28384b, + 0x289ecb, + 0x2ae3cb, + 0x2e62cb, + 0x31804b, + 0x31830b, + 0x318949, + 0x31984b, + 0x319b0b, + 0x31a08b, + 0x31b08a, + 0x31b5ca, + 0x31bbcc, + 0x31e00b, + 0x31ea4a, + 0x33064a, + 0x33c6ce, + 0x33d1ce, + 0x33d54a, + 0x33efca, + 0x33fa8b, + 0x33fd4b, + 0x340b0b, + 0x36124b, + 0x36184a, + 0x36250b, + 0x3627ca, + 0x362a4a, + 0x362cca, + 0x38424b, + 0x38c6cb, + 0x38e64e, + 0x38e9cb, + 0x39464b, + 0x395b0b, + 0x39900a, + 0x399289, + 0x3994ca, + 0x39a94a, + 0x3addcb, + 0x3afa8b, + 0x3b05ca, + 0x3b1fcb, + 0x3b674b, + 0x3bf58b, + 0x3a287a88, + 0x3a68fd09, + 0x3aaa6409, + 0x3aee4d48, + 0x34b945, + 0x202d43, + 0x21b744, + 0x345805, + 0x273dc6, + 0x274805, + 0x28f584, + 0x3a4dc8, + 0x312ec5, + 0x299a84, + 0x211587, + 0x2a550a, + 0x3813ca, + 0x308f07, + 0x202c47, + 0x303647, + 0x271907, + 0x2ff9c5, + 0x204906, + 0x22b9c7, + 0x2c8684, + 0x2db006, + 0x2daf06, + 0x208185, + 0x331c04, + 0x388bc6, + 0x2a4707, + 0x232646, + 0x2bfa07, + 0x232dc3, + 0x26c7c6, + 0x23cf85, + 0x285f07, + 0x27100a, + 0x284e04, + 0x220808, + 0x2a2009, + 0x2d0e47, + 0x31e8c6, + 0x257988, + 0x28b2c9, + 0x314784, + 0x376004, + 0x35d785, + 0x22b6c8, + 0x2ccc07, + 0x29a3c9, + 0x3af5c8, + 0x353706, + 0x24d486, + 0x29fd88, + 0x365bc6, + 0x297685, + 0x2890c6, + 0x280ec8, + 0x256286, + 0x25cb8b, + 0x2ac646, + 0x2a224d, + 0x208605, + 0x2af306, + 0x218a05, + 0x35d949, + 0x27a787, + 0x36d148, + 0x2969c6, + 0x2a1509, + 0x341046, + 0x270f85, + 0x2a7f06, + 0x2d3586, + 0x2d3b09, + 0x333f06, + 0x3529c7, + 0x248c85, + 0x201d83, + 0x25cd05, + 0x2a2507, + 0x338d06, + 0x208509, + 0x320c86, + 0x289306, + 0x219fc9, + 0x288ac9, + 0x2a8747, + 0x20cd08, + 0x280509, + 0x286988, + 0x38b5c6, + 0x2de245, + 0x23fa4a, + 0x289386, + 0x2bf1c6, + 0x2d7605, + 0x272408, + 0x2220c7, + 0x239fca, + 0x253b46, + 0x27a645, + 0x20a506, + 0x236b47, + 0x31e787, + 0x24fc45, + 0x271145, + 0x2e79c6, + 0x2fbfc6, + 0x2be306, + 0x2bb884, + 0x287e09, + 0x290bc6, + 0x2d430a, + 0x222b88, + 0x3059c8, + 0x3813ca, + 0x205b45, + 0x2a4645, + 0x3575c8, + 0x2b0fc8, + 0x2b43c7, + 0x295946, + 0x329608, + 0x30a447, + 0x287088, + 0x2bbec6, + 0x289b88, + 0x29cd06, + 0x257e47, + 0x2a27c6, + 0x388bc6, + 0x383d4a, + 0x345506, + 0x2de249, + 0x36b086, + 0x2b6c0a, + 0x2e2dc9, + 0x2fe406, + 0x2bccc4, + 0x2b75cd, + 0x28ff87, + 0x32df46, + 0x2c8845, + 0x3410c5, + 0x204dc6, + 0x2d4fc9, + 0x3879c7, + 0x2826c6, + 0x2bd406, + 0x28f609, + 0x33f784, + 0x3a1184, + 0x39c0c8, + 0x260f46, + 0x279388, + 0x30fec8, + 0x378187, + 0x3beb49, + 0x2be507, + 0x2b678a, + 0x2fc88f, + 0x25100a, + 0x2bdc45, + 0x281105, + 0x220085, + 0x28be47, + 0x236703, + 0x20cf08, + 0x201e46, + 0x201f49, + 0x2e4806, + 0x3a3607, + 0x2a12c9, + 0x36d048, + 0x2d76c7, + 0x315603, + 0x34b9c5, + 0x236685, + 0x2bb6cb, + 0x385e44, + 0x30ad44, + 0x27f006, + 0x315e87, + 0x392a4a, + 0x251a87, + 0x36a947, + 0x2852c5, + 0x2016c5, + 0x253689, + 0x388bc6, + 0x25190d, + 0x334145, + 0x2a10c3, + 0x200dc3, + 0x39cf05, + 0x3534c5, + 0x257988, + 0x283007, + 0x3a0f06, + 0x2a6086, + 0x232545, + 0x23cd87, + 0x377c87, + 0x23ea07, + 0x2d9a4a, + 0x26c888, + 0x2bb884, + 0x256007, + 0x284707, + 0x352846, + 0x26f5c7, + 0x2ece48, + 0x2e8548, + 0x276346, + 0x374f88, + 0x2d1704, + 0x22b9c6, + 0x239b86, + 0x333b86, + 0x2d0006, + 0x233ac4, + 0x2719c6, + 0x2c7146, + 0x29f406, + 0x2381c6, + 0x213ec6, + 0x223f06, + 0x3a0e08, + 0x3bcc88, + 0x2da288, + 0x274a08, + 0x357546, + 0x217e05, + 0x2dd4c6, + 0x2b3205, + 0x397f07, + 0x27df05, + 0x21ae83, + 0x2058c5, + 0x34cc44, + 0x214005, + 0x22dc83, + 0x33d807, + 0x374a48, + 0x2bfac6, + 0x2b0c4d, + 0x2810c6, + 0x29e985, + 0x227603, + 0x2c2a89, + 0x33f906, + 0x29dd86, + 0x2a8004, + 0x250f87, + 0x334546, + 0x387c85, + 0x20b2c3, + 0x209484, + 0x2848c6, + 0x204a04, + 0x239c88, + 0x2005c9, + 0x325f49, + 0x2a7e0a, + 0x2a918d, + 0x20abc7, + 0x2bf046, + 0x205ec4, + 0x2f6e09, + 0x28e688, + 0x28fb86, + 0x245246, + 0x26f5c7, + 0x2b9786, + 0x22c986, + 0x36aac6, + 0x3b0d0a, + 0x227248, + 0x364dc5, + 0x26fa09, + 0x28758a, + 0x2f1e88, + 0x2a40c8, + 0x29dd08, + 0x2ad74c, + 0x318585, + 0x2a6308, + 0x2e7546, + 0x36d2c6, + 0x3a34c7, + 0x251985, + 0x289245, + 0x325e09, + 0x219847, + 0x201f05, + 0x22d887, + 0x200dc3, + 0x2cd145, + 0x214308, + 0x25d087, + 0x2a3f89, + 0x2dac05, + 0x395a04, + 0x2a8e48, + 0x2dddc7, + 0x2d7888, + 0x2508c8, + 0x2d6645, + 0x281906, + 0x2a6186, + 0x277449, + 0x2b26c7, + 0x2b3ac6, + 0x2236c7, + 0x20e743, + 0x274084, + 0x2d1805, + 0x23cec4, + 0x393244, + 0x288547, + 0x25b347, + 0x234284, + 0x2a3dd0, + 0x234e47, + 0x2016c5, + 0x37178c, + 0x250684, + 0x2a9e48, + 0x257d49, + 0x36e646, + 0x34dd48, + 0x223384, + 0x37d0c8, + 0x23a5c6, + 0x238048, + 0x2a4cc6, + 0x2cc8cb, + 0x201d85, + 0x2d1688, + 0x200a04, + 0x200a0a, + 0x2a3f89, + 0x357f06, + 0x220148, + 0x263805, + 0x2b9044, + 0x2a9d46, + 0x23e8c8, + 0x287a88, + 0x329e86, + 0x358b04, + 0x23f9c6, + 0x2be587, + 0x27ff87, + 0x26f5cf, + 0x204187, + 0x2fe4c7, + 0x23d2c5, + 0x35fcc5, + 0x2a8409, + 0x2ed806, + 0x286045, + 0x288dc7, + 0x2c6188, + 0x29f505, + 0x2a27c6, + 0x2229c8, + 0x28ab8a, + 0x39c888, + 0x292f47, + 0x2fccc6, + 0x26f9c6, + 0x20ca43, + 0x2052c3, + 0x287749, + 0x280389, + 0x2a6b86, + 0x2dac05, + 0x304588, + 0x220148, + 0x365d48, + 0x36ab4b, + 0x2b0e87, + 0x315849, + 0x26f848, + 0x356284, + 0x3886c8, + 0x295089, + 0x2b3dc5, + 0x28bd47, + 0x274105, + 0x287988, + 0x297bcb, + 0x29d510, + 0x2aec45, + 0x21e20c, + 0x3a10c5, + 0x285343, + 0x296706, + 0x2c5a04, + 0x28fa06, + 0x2a4707, + 0x222a44, + 0x24c3c8, + 0x20cdcd, + 0x330a05, + 0x20ac04, + 0x241b84, + 0x27bd89, + 0x292bc8, + 0x320b07, + 0x23a648, + 0x287ec8, + 0x2829c5, + 0x28c647, + 0x282947, + 0x342807, + 0x271149, + 0x223c49, + 0x36c986, + 0x2c3a06, + 0x26f806, + 0x33e9c5, + 0x3b4944, + 0x200006, + 0x200386, + 0x282a08, + 0x23680b, + 0x284cc7, + 0x205ec4, + 0x334486, + 0x2ed187, + 0x388f45, + 0x210bc5, + 0x21b484, + 0x223bc6, + 0x200088, + 0x2f6e09, + 0x259706, + 0x28df88, + 0x387d46, + 0x355088, + 0x2d6c8c, + 0x282886, + 0x29e64d, + 0x29eacb, + 0x352a85, + 0x377dc7, + 0x334006, + 0x31e648, + 0x36ca09, + 0x276608, + 0x2016c5, + 0x2076c7, + 0x286a88, + 0x332489, + 0x2a0986, + 0x25960a, + 0x31e3c8, + 0x27644b, + 0x2d964c, + 0x37d1c8, + 0x283e46, + 0x28c048, + 0x28a807, + 0x2e4909, + 0x2976cd, + 0x2a26c6, + 0x365308, + 0x3bcb49, + 0x2c4a48, + 0x289c88, + 0x2c798c, + 0x2c8e87, + 0x2c96c7, + 0x270f85, + 0x31a807, + 0x2c6048, + 0x2a9dc6, + 0x26020c, + 0x2f60c8, + 0x2d5708, + 0x262246, + 0x236407, + 0x36cb84, + 0x274a08, + 0x28d88c, + 0x22834c, + 0x2bdcc5, + 0x2b85c7, + 0x358a86, + 0x236386, + 0x35db08, + 0x202b84, + 0x23264b, + 0x37d80b, + 0x2fccc6, + 0x20cc47, + 0x339305, + 0x278585, + 0x232786, + 0x2637c5, + 0x385e05, + 0x2e40c7, + 0x27f609, + 0x2fc184, + 0x2feac5, + 0x2ead45, + 0x2b5448, + 0x235685, + 0x2c0b89, + 0x2b16c7, + 0x2b16cb, + 0x261ac6, + 0x3a0b49, + 0x331b48, + 0x272885, + 0x342908, + 0x223c88, + 0x249b07, + 0x383b47, + 0x2885c9, + 0x237f87, + 0x27de09, + 0x29b88c, + 0x2a6b88, + 0x331009, + 0x360987, + 0x287f89, + 0x25b487, + 0x2d9748, + 0x3bed05, + 0x22b946, + 0x2c8888, + 0x30cf08, + 0x287449, + 0x385e47, + 0x278645, + 0x21f949, + 0x345306, + 0x2440c4, + 0x2440c6, + 0x35d048, + 0x254547, + 0x236a08, + 0x375049, + 0x3b1a07, + 0x2a56c6, + 0x377e84, + 0x205949, + 0x28c4c8, + 0x262107, + 0x2b56c6, + 0x236746, + 0x2bf144, + 0x241986, + 0x202003, + 0x34f109, + 0x201d46, + 0x3752c5, + 0x2a6086, + 0x2d79c5, + 0x286f08, + 0x37cf07, + 0x261e06, + 0x234d06, + 0x3059c8, + 0x2a8587, + 0x2a2705, + 0x2a3bc8, + 0x3bb748, + 0x31e3c8, + 0x3a0f85, + 0x22b9c6, + 0x325d09, + 0x2772c4, + 0x351d8b, + 0x22c68b, + 0x364cc9, + 0x200dc3, + 0x25efc5, + 0x21d306, + 0x3ba188, + 0x2fc804, + 0x2bfac6, + 0x2d9b89, + 0x2bc9c5, + 0x2e4006, + 0x2dddc6, + 0x220144, + 0x2af4ca, + 0x375208, + 0x30cf06, + 0x2cf245, + 0x3b8247, + 0x23d187, + 0x281904, + 0x22c8c7, + 0x2b6784, + 0x333b06, + 0x20cf43, + 0x271145, + 0x334f05, + 0x3beec8, + 0x2561c5, + 0x2825c9, + 0x274847, + 0x27484b, + 0x2aa04c, + 0x2aa64a, + 0x33f5c7, + 0x202e83, + 0x202e88, + 0x3a1145, + 0x29f585, + 0x2140c4, + 0x2d9646, + 0x257d46, + 0x2419c7, + 0x34d58b, + 0x233ac4, + 0x2e7644, + 0x2cbd04, + 0x2d3706, + 0x222a44, + 0x22b7c8, + 0x34b885, + 0x24fac5, + 0x365c87, + 0x377ec9, + 0x3534c5, + 0x38dcca, + 0x248b89, + 0x2911ca, + 0x3b0e49, + 0x310444, + 0x2bd4c5, + 0x2b9888, + 0x2f150b, + 0x35d785, + 0x33be86, + 0x236304, + 0x282b06, + 0x3b1889, + 0x2ed287, + 0x320e48, + 0x2a9506, + 0x2be507, + 0x287a88, + 0x3870c6, + 0x39b804, + 0x3743c7, + 0x376945, + 0x389b87, + 0x200104, + 0x333f86, + 0x2d5f48, + 0x29ec88, + 0x2e7007, + 0x27f988, + 0x29cdc5, + 0x213e44, + 0x3812c8, + 0x27fa84, + 0x220005, + 0x2ffbc4, + 0x30a547, + 0x290c87, + 0x2880c8, + 0x2d7a06, + 0x256145, + 0x2823c8, + 0x39ca88, + 0x2a7d49, + 0x22c986, + 0x23a048, + 0x20088a, + 0x388fc8, + 0x2ec085, + 0x349286, + 0x248a48, + 0x20778a, + 0x226047, + 0x28ee45, + 0x29ad48, + 0x2c2404, + 0x272486, + 0x2c9a48, + 0x213ec6, + 0x20b308, + 0x296e87, + 0x211486, + 0x2bccc4, + 0x364707, + 0x2b8e84, + 0x3b1847, + 0x2a064d, + 0x288805, + 0x2d4dcb, + 0x2285c6, + 0x257808, + 0x24c384, + 0x357746, + 0x2848c6, + 0x28c387, + 0x29e30d, + 0x24e587, + 0x2b93c8, + 0x278705, + 0x276e08, + 0x2ccb86, + 0x29ce48, + 0x22ab46, + 0x25a707, + 0x39ae89, + 0x36ebc7, + 0x28fe48, + 0x27af45, + 0x222e08, + 0x219405, + 0x3ab545, + 0x3b10c5, + 0x23ef43, + 0x289144, + 0x26fa05, + 0x241489, + 0x3043c6, + 0x2ecf48, + 0x383905, + 0x2bb507, + 0x2ad54a, + 0x2e3f49, + 0x2d348a, + 0x2da308, + 0x22d6cc, + 0x288e4d, + 0x301bc3, + 0x20b208, + 0x209445, + 0x28a946, + 0x36cec6, + 0x2ebb05, + 0x2237c9, + 0x20e1c5, + 0x2823c8, + 0x25fe06, + 0x35e006, + 0x2a8d09, + 0x39ed87, + 0x297e86, + 0x2ad4c8, + 0x333a88, + 0x2e4f47, + 0x2381ce, + 0x2ccdc5, + 0x332385, + 0x213dc8, + 0x20a247, + 0x200842, + 0x2c7504, + 0x28f90a, + 0x2621c8, + 0x389206, + 0x2a1408, + 0x2a6186, + 0x3337c8, + 0x2b3ac8, + 0x3ab504, + 0x2bba45, + 0x681384, + 0x681384, + 0x681384, + 0x201e03, + 0x2365c6, + 0x282886, + 0x2a508c, + 0x200943, + 0x223286, + 0x20cf04, + 0x33f888, + 0x2d99c5, + 0x28fa06, + 0x2c31c8, + 0x2db2c6, + 0x261d86, + 0x357d08, + 0x2d1887, + 0x237d49, + 0x2fa8ca, + 0x20a944, + 0x27df05, + 0x29a385, + 0x2f6c06, + 0x20ac06, + 0x2a5ac6, + 0x2ff206, + 0x237e84, + 0x237e8b, + 0x23c584, + 0x2a5245, + 0x2b2ac5, + 0x378246, + 0x2090c8, + 0x288d07, + 0x320c04, + 0x232fc3, + 0x2c1f05, + 0x311847, + 0x288c0b, + 0x3bedc7, + 0x2c30c8, + 0x2e7287, + 0x23d406, + 0x27a4c8, + 0x2b004b, + 0x345746, + 0x21d449, + 0x2b01c5, + 0x315603, + 0x2e4006, + 0x296d88, + 0x21f083, + 0x271e03, + 0x287a86, + 0x2a6186, + 0x36958a, + 0x283e85, + 0x28470b, + 0x2a5fcb, + 0x210a83, + 0x20b943, + 0x2b6704, + 0x2af6c7, + 0x296e04, + 0x277344, + 0x2e73c4, + 0x223e88, + 0x2cf188, + 0x205249, + 0x39e3c8, + 0x28b487, + 0x2381c6, + 0x2ecb8f, + 0x2ccf06, + 0x2d9944, + 0x2cefca, + 0x311747, + 0x208206, + 0x297509, + 0x2051c5, + 0x3bf005, + 0x205306, + 0x222f43, + 0x2c2449, + 0x2273c6, + 0x202d09, + 0x392a46, + 0x271145, + 0x2be0c5, + 0x204183, + 0x2af808, + 0x213887, + 0x201e44, + 0x33f708, + 0x2ffe04, + 0x2f0486, + 0x296706, + 0x248fc6, + 0x2d1549, + 0x29f505, + 0x388bc6, + 0x2666c9, + 0x2cb906, + 0x223f06, + 0x397346, + 0x21ce85, + 0x2ffbc6, + 0x25a704, + 0x3bed05, + 0x2c8884, + 0x2b9f86, + 0x334104, + 0x2136c3, + 0x28e745, + 0x23dac8, + 0x262987, + 0x2c1ac9, + 0x28ed48, + 0x29fb51, + 0x2dde4a, + 0x2fcc07, + 0x25a986, + 0x20cf04, + 0x2c8988, + 0x233fc8, + 0x29fd0a, + 0x2c094d, + 0x2a7f06, + 0x357e06, + 0x3647c6, + 0x24fac7, + 0x2b9485, + 0x210187, + 0x20cdc5, + 0x2b1804, + 0x2ae086, + 0x241807, + 0x2c214d, + 0x248987, + 0x3a4cc8, + 0x2826c9, + 0x349186, + 0x2a0905, + 0x22dcc4, + 0x35d146, + 0x281806, + 0x262346, + 0x2a1c88, + 0x21cd43, + 0x20aa83, + 0x338e45, + 0x207b06, + 0x2b3a85, + 0x2a9708, + 0x2a48ca, + 0x3a2dc4, + 0x33f888, + 0x29dd08, + 0x378087, + 0x3839c9, + 0x2c2dc8, + 0x2a6d07, + 0x2957c6, + 0x213eca, + 0x35d1c8, + 0x2f8589, + 0x292c88, + 0x229b89, + 0x2e8747, + 0x33bdc5, + 0x36ad46, + 0x2a9c48, + 0x287c08, + 0x29de88, + 0x2fcdc8, + 0x2a5245, + 0x218944, + 0x213588, + 0x24b384, + 0x3b0c44, + 0x271145, + 0x299ac7, + 0x377c89, + 0x28c187, + 0x2008c5, + 0x27f206, + 0x363686, + 0x200b84, + 0x2a9046, + 0x255f84, + 0x276d06, + 0x377a46, + 0x21eec6, + 0x2016c5, + 0x2a95c7, + 0x202e83, + 0x21dd89, + 0x3057c8, + 0x2f6d04, + 0x2f6d0d, + 0x29ed88, + 0x2d7248, + 0x2f8506, + 0x39af89, + 0x2e3f49, + 0x3b1585, + 0x2a49ca, + 0x2edbca, + 0x2a5ccc, + 0x2a5e46, + 0x27fe06, + 0x2cd086, + 0x2c84c9, + 0x28ab86, + 0x2101c6, + 0x20e286, + 0x274a08, + 0x27f986, + 0x2d92cb, + 0x299c45, + 0x24fac5, + 0x280085, + 0x39be46, + 0x213e83, + 0x248f46, + 0x248907, + 0x2c8845, + 0x24d545, + 0x3410c5, + 0x313846, + 0x204dc4, + 0x385806, + 0x284049, + 0x39bccc, + 0x2b1548, + 0x23e844, + 0x2ff8c6, + 0x2286c6, + 0x296d88, + 0x220148, + 0x39bbc9, + 0x3b8247, + 0x260c89, + 0x255806, + 0x237404, + 0x214944, + 0x20a584, + 0x287a88, + 0x377aca, + 0x353446, + 0x35fb87, + 0x37e787, + 0x3a0c45, + 0x29a344, + 0x295046, + 0x2b94c6, + 0x202bc3, + 0x305607, + 0x2507c8, + 0x3b16ca, + 0x2d4708, + 0x28a688, + 0x334145, + 0x352b85, + 0x284dc5, + 0x3a1006, + 0x2393c6, + 0x25b285, + 0x34f349, + 0x29a14c, + 0x284e87, + 0x29fd88, + 0x24ee05, + 0x681384, + 0x240ac4, + 0x25d1c4, + 0x217946, + 0x2a728e, + 0x3bf087, + 0x24fcc5, + 0x27724c, + 0x2ffcc7, + 0x241787, + 0x274e89, + 0x2208c9, + 0x28ee45, + 0x3057c8, + 0x325d09, + 0x31e285, + 0x2c8788, + 0x227546, + 0x381546, + 0x2e2dc4, + 0x25ff08, + 0x248743, + 0x235e44, + 0x2c1f85, + 0x204dc7, + 0x21b4c5, + 0x200749, + 0x27e64d, + 0x2935c6, + 0x229b04, + 0x2958c8, + 0x27f44a, + 0x21da87, + 0x243905, + 0x235e83, + 0x2a618e, + 0x2af90c, + 0x2f1f87, + 0x2a7447, + 0x200143, + 0x28abc5, + 0x25d1c5, + 0x2a17c8, + 0x29db49, + 0x23e746, + 0x296e04, + 0x2fcb46, + 0x3650cb, + 0x2e3ccc, + 0x376447, + 0x2d9585, + 0x3bb648, + 0x2e4d05, + 0x2cefc7, + 0x2ddc87, + 0x248745, + 0x213e83, + 0x3b36c4, + 0x21b705, + 0x2fc085, + 0x2fc086, + 0x2821c8, + 0x241807, + 0x36d1c6, + 0x25b686, + 0x3b1006, + 0x2f88c9, + 0x28c747, + 0x262606, + 0x2e3e46, + 0x27e106, + 0x2af405, + 0x21e8c6, + 0x390e05, + 0x235708, + 0x2990cb, + 0x294b86, + 0x37e7c4, + 0x2c8109, + 0x274844, + 0x2274c8, + 0x2441c7, + 0x289b84, + 0x2c2688, + 0x2c94c4, + 0x2af444, + 0x39ac45, + 0x330a46, + 0x223dc7, + 0x20b3c3, + 0x2a5785, + 0x32a504, + 0x3323c6, + 0x3b1608, + 0x39c785, + 0x298d89, + 0x21fb45, + 0x223288, + 0x22cfc7, + 0x398048, + 0x2c1907, + 0x2fe589, + 0x271846, + 0x360486, + 0x20e284, + 0x295705, + 0x3093cc, + 0x280087, + 0x280fc7, + 0x37e648, + 0x2935c6, + 0x2794c4, + 0x34bc04, + 0x288449, + 0x2cd186, + 0x253707, + 0x2cff84, + 0x24ab06, + 0x35f245, + 0x2d7547, + 0x2d9246, + 0x2594c9, + 0x2eda07, + 0x26f5c7, + 0x2a8b86, + 0x24aa45, + 0x285988, + 0x227248, + 0x2f6a46, + 0x39c7c5, + 0x344806, + 0x202c03, + 0x2a1649, + 0x2a584e, + 0x2c1608, + 0x2fff08, + 0x2f684b, + 0x298fc6, + 0x20a884, + 0x261d84, + 0x2a594a, + 0x21e107, + 0x2626c5, + 0x21d449, + 0x2c7205, + 0x3b0c87, + 0x250584, + 0x27b907, + 0x30fdc8, + 0x2d0f06, + 0x365489, + 0x2c2eca, + 0x21e086, + 0x29e8c6, + 0x2b2a45, + 0x38ef85, + 0x325647, + 0x24ec48, + 0x35f188, + 0x3ab506, + 0x2be145, + 0x20a98e, + 0x2bb884, + 0x2a1745, + 0x27eb89, + 0x2ed608, + 0x292e86, + 0x2a36cc, + 0x2a44d0, + 0x2a6ecf, + 0x2a8308, + 0x33f5c7, + 0x2016c5, + 0x26fa05, + 0x389089, + 0x29af49, + 0x23fac6, + 0x35d807, + 0x2b8545, + 0x2b43c9, + 0x3528c6, + 0x28a9cd, + 0x288789, + 0x277344, + 0x2c1388, + 0x213649, + 0x353606, + 0x27f305, + 0x360486, + 0x320d09, + 0x281688, + 0x217e05, + 0x200984, + 0x2a388b, + 0x3534c5, + 0x2a39c6, + 0x289186, + 0x26e646, + 0x27c18b, + 0x298e89, + 0x25b5c5, + 0x397e07, + 0x2dddc6, + 0x34dec6, + 0x25cf48, + 0x330b49, + 0x3a4a8c, + 0x311648, + 0x23c586, + 0x329e83, + 0x28bf46, + 0x27bfc5, + 0x284a48, + 0x2bdb46, + 0x2d7788, + 0x251b05, + 0x283245, + 0x27a8c8, + 0x333947, + 0x36ce07, + 0x2419c7, + 0x34dd48, + 0x39ad08, + 0x31a706, + 0x2b9dc7, + 0x273f47, + 0x27be8a, + 0x20d703, + 0x39be46, + 0x23e985, + 0x28f904, + 0x2826c9, + 0x2fe504, + 0x262a04, + 0x2a4d44, + 0x2a744b, + 0x2137c7, + 0x20abc5, + 0x29cac8, + 0x27f206, + 0x27f208, + 0x283dc6, + 0x293345, + 0x293e85, + 0x295f46, + 0x296b48, + 0x297448, + 0x282886, + 0x29c90f, + 0x2a1110, + 0x208605, + 0x202e83, + 0x2374c5, + 0x315788, + 0x29ae49, + 0x31e3c8, + 0x2f8748, + 0x2bec08, + 0x213887, + 0x27eec9, + 0x2d7988, + 0x2730c4, + 0x2a4bc8, + 0x2b5509, + 0x2babc7, + 0x2a2644, + 0x28c248, + 0x2a938a, + 0x3085c6, + 0x2a7f06, + 0x22c849, + 0x2a4707, + 0x2d4588, + 0x2fdbc8, + 0x2cfe08, + 0x3690c5, + 0x38ff05, + 0x24fac5, + 0x25d185, + 0x38cb87, + 0x213e85, + 0x2c8845, + 0x20ae06, + 0x31e307, + 0x2f1447, + 0x2a9686, + 0x2da845, + 0x2a39c6, + 0x202f45, + 0x2b83c8, + 0x2f1e04, + 0x2cb986, + 0x348084, + 0x2b9048, + 0x2cba8a, + 0x28300c, + 0x34d785, + 0x24fb86, + 0x3a4c46, + 0x234b86, + 0x23c604, + 0x35f505, + 0x283c07, + 0x2a4789, + 0x2d3c07, + 0x681384, + 0x681384, + 0x320a85, + 0x38d584, + 0x2a308a, + 0x27f086, + 0x27a704, + 0x208185, + 0x3875c5, + 0x2b93c4, + 0x288dc7, + 0x21fac7, + 0x2d3708, + 0x342348, + 0x217e09, + 0x2a5308, + 0x2a324b, + 0x251044, + 0x375f45, + 0x2860c5, + 0x241949, + 0x330b49, + 0x2c8008, + 0x243f48, + 0x2df044, + 0x228705, + 0x202d43, + 0x2f6bc5, + 0x388c46, + 0x29d98c, + 0x2189c6, + 0x37cfc6, + 0x293105, + 0x3138c8, + 0x2c1786, + 0x25ab06, + 0x2a7f06, + 0x22e2cc, + 0x262504, + 0x3b114a, + 0x293048, + 0x29d7c7, + 0x32a406, + 0x23e807, + 0x2f2ec5, + 0x2b56c6, + 0x35c286, + 0x367cc7, + 0x262a44, + 0x30a645, + 0x27eb84, + 0x2b1887, + 0x27edc8, + 0x27fc8a, + 0x286907, + 0x375387, + 0x33f547, + 0x2e4e49, + 0x29d98a, + 0x2373c3, + 0x262945, + 0x20b343, + 0x2e7409, + 0x254ec8, + 0x23d2c7, + 0x31e4c9, + 0x227346, + 0x2042c8, + 0x33d785, + 0x39cb8a, + 0x2dbc89, + 0x276209, + 0x3a34c7, + 0x2340c9, + 0x21edc8, + 0x367e86, + 0x24fd48, + 0x21ce87, + 0x237f87, + 0x248b87, + 0x2d5dc8, + 0x2ff746, + 0x2a9145, + 0x283c07, + 0x29e3c8, + 0x348004, + 0x2d41c4, + 0x297d87, + 0x2b3e47, + 0x325b8a, + 0x367e06, + 0x35854a, + 0x2c7447, + 0x2bb647, + 0x358004, + 0x27dec4, + 0x2d7446, + 0x281b84, + 0x281b8c, + 0x203185, + 0x21ff89, + 0x265684, + 0x2b9485, + 0x27f3c8, + 0x22d245, + 0x204dc6, + 0x225f44, + 0x28f30a, + 0x2b25c6, + 0x2a424a, + 0x2b7887, + 0x236b45, + 0x222f45, + 0x3a0c8a, + 0x296cc5, + 0x2a7e06, + 0x24b384, + 0x2b6886, + 0x325705, + 0x2bdc06, + 0x2e700c, + 0x2d388a, + 0x2957c4, + 0x2381c6, + 0x2a4707, + 0x2d91c4, + 0x274a08, + 0x39e246, + 0x20a809, + 0x2baec9, + 0x2a6c89, + 0x351f46, + 0x21cf86, + 0x24fe87, + 0x34f288, + 0x21cd89, + 0x2137c7, + 0x29cc46, + 0x2be587, + 0x364685, + 0x2bb884, + 0x24fa47, + 0x274105, + 0x28f845, + 0x36c347, + 0x248608, + 0x3bb5c6, + 0x29f24d, + 0x2a19cf, + 0x2a5fcd, + 0x200904, + 0x23dbc6, + 0x2dc1c8, + 0x20e245, + 0x27c048, + 0x2499ca, + 0x277344, + 0x365646, + 0x33ae07, + 0x233ac7, + 0x2d1949, + 0x24fd05, + 0x2b93c4, + 0x2bb98a, + 0x2c2989, + 0x2341c7, + 0x272306, + 0x353606, + 0x228646, + 0x374486, + 0x2db94f, + 0x2dc089, + 0x27f986, + 0x233ec6, + 0x320289, + 0x2b9ec7, + 0x229403, + 0x22e446, + 0x2052c3, + 0x2eb9c8, + 0x2be3c7, + 0x2a8509, + 0x296588, + 0x36cf48, + 0x385f86, + 0x218909, + 0x398845, + 0x2b9f84, + 0x29a687, + 0x2c8545, + 0x200904, + 0x20ac88, + 0x202044, + 0x2b9c07, + 0x3749c6, + 0x2e7a85, + 0x292c88, + 0x3534cb, + 0x3778c7, + 0x3a0f06, + 0x2ccf84, + 0x348186, + 0x271145, + 0x274105, + 0x285709, + 0x2889c9, + 0x237fc4, + 0x238005, + 0x238205, + 0x39ca06, + 0x3058c8, + 0x2c6b86, + 0x25060b, + 0x36e4ca, + 0x2b8f85, + 0x293f06, + 0x3a2ac5, + 0x2e9dc5, + 0x2ad387, + 0x39c0c8, + 0x260c84, + 0x26be86, + 0x2974c6, + 0x21ef87, + 0x3155c4, + 0x2848c6, + 0x2427c5, + 0x2427c9, + 0x21b584, + 0x29a4c9, + 0x282886, + 0x2c8f48, + 0x238205, + 0x37e885, + 0x2bdc06, + 0x3a4989, + 0x2208c9, + 0x37d046, + 0x2ed708, + 0x277348, + 0x3a2a84, + 0x2bbcc4, + 0x2bbcc8, + 0x32e048, + 0x260d89, + 0x388bc6, + 0x2a7f06, + 0x3294cd, + 0x2bfac6, + 0x2d6b49, + 0x2dd5c5, + 0x205306, + 0x2102c8, + 0x326885, + 0x273f84, + 0x271145, + 0x2882c8, + 0x2a2e49, + 0x27ec44, + 0x333f86, + 0x22d10a, + 0x2f1e88, + 0x325d09, + 0x261f0a, + 0x31e446, + 0x2a1b88, + 0x2ced85, + 0x2c5ec8, + 0x2c1a05, + 0x227209, + 0x37ac49, + 0x203282, + 0x2b01c5, + 0x2782c6, + 0x2827c7, + 0x34e085, + 0x30ce06, + 0x326948, + 0x2935c6, + 0x2b9749, + 0x2810c6, + 0x25cdc8, + 0x2b0805, + 0x264906, + 0x25a808, + 0x287a88, + 0x2e8648, + 0x353788, + 0x21e8c4, + 0x281943, + 0x2b9984, + 0x286b06, + 0x3646c4, + 0x2ffe47, + 0x25aa09, + 0x2cbd05, + 0x2fdbc6, + 0x22e446, + 0x28200b, + 0x2b8ec6, + 0x2cf8c6, + 0x2d13c8, + 0x24d486, + 0x236943, + 0x2164c3, + 0x2bb884, + 0x239f45, + 0x387b87, + 0x27edc8, + 0x27edcf, + 0x283b0b, + 0x3056c8, + 0x334006, + 0x3059ce, + 0x251143, + 0x387b04, + 0x2b8e45, + 0x2b9246, + 0x29514b, + 0x299b86, + 0x222a49, + 0x2e7a85, + 0x3999c8, + 0x216688, + 0x22078c, + 0x2a7486, + 0x2f6c06, + 0x2dac05, + 0x28fc08, + 0x25a805, + 0x356288, + 0x2a3a4a, + 0x2a6409, + 0x681384, + 0x3b60f882, + 0x16fb88, + 0x238543, + 0x23cac3, + 0x323043, + 0x28cac3, + 0x208e83, + 0x201a03, + 0x39c783, + 0x238543, + 0x23cac3, + 0x323043, + 0x231604, + 0x208e83, + 0x201a03, + 0x213083, + 0x286644, + 0x238543, + 0x240244, + 0x23cac3, + 0x2de944, + 0x323043, + 0x34e347, + 0x28cac3, + 0x200e03, + 0x293408, + 0x201a03, + 0x29630b, + 0x2f3743, + 0x3a03c6, + 0x205082, + 0x22facb, + 0x23cac3, + 0x323043, + 0x208e83, + 0x201a03, + 0x238543, + 0x23cac3, + 0x323043, + 0x201a03, + 0x220b83, + 0x201503, + 0x207102, + 0x16fb88, + 0x32d1c5, + 0x274188, + 0x2f9f88, + 0x20f882, + 0x20a605, + 0x3785c7, + 0x201842, + 0x24c5c7, + 0x207b02, + 0x2f6607, + 0x2cc409, + 0x2ce948, + 0x2cfc89, + 0x24b2c2, + 0x2707c7, + 0x37cdc4, + 0x378687, + 0x36e3c7, + 0x264d42, + 0x28cac3, + 0x214642, + 0x204d42, + 0x200442, + 0x21cc82, + 0x206b42, + 0x20d2c2, + 0x2aff05, + 0x240a05, + 0xf882, + 0x3cac3, + 0x238543, + 0x23cac3, + 0x323043, + 0x208e83, + 0x201a03, + 0x238543, + 0x23cac3, + 0x323043, + 0x28cac3, + 0x208e83, + 0x1a3443, + 0x201a03, + 0x170c3, + 0x8c1, + 0x238543, + 0x23cac3, + 0x323043, + 0x231604, + 0x255783, + 0x208e83, + 0x1a3443, + 0x201a03, + 0x221f43, + 0x3e4f5906, + 0x42bc3, + 0x873c5, + 0x238543, + 0x23cac3, + 0x323043, + 0x208e83, + 0x201a03, + 0x20f882, + 0x238543, + 0x23cac3, + 0x323043, + 0x208e83, + 0x201a03, + 0x84c2, + 0x16fb88, + 0xe03, + 0x1a3443, + 0x4ec04, + 0xe5105, + 0x207102, + 0x39cdc4, + 0x238543, + 0x23cac3, + 0x323043, + 0x38acc3, + 0x2b13c5, + 0x255783, + 0x211a83, + 0x208e83, + 0x21b543, + 0x201a03, + 0x215443, + 0x20e383, + 0x202443, + 0x238543, + 0x23cac3, + 0x323043, + 0x208e83, + 0x201a03, + 0x20f882, + 0x201a03, + 0x16fb88, + 0x323043, + 0x1a3443, + 0x16fb88, + 0x1a3443, + 0x2bcc43, + 0x238543, + 0x23a844, + 0x23cac3, + 0x323043, + 0x205e82, + 0x28cac3, + 0x208e83, + 0x201a03, + 0x238543, + 0x23cac3, + 0x323043, + 0x205e82, + 0x229443, + 0x208e83, + 0x201a03, + 0x2ef783, + 0x215443, + 0x207102, + 0x20f882, + 0x323043, + 0x208e83, + 0x201a03, + 0x3a03c5, + 0xa4f06, + 0x286644, + 0x205082, + 0x16fb88, + 0x207102, + 0x25088, + 0x134943, + 0x20f882, + 0x42899306, + 0x6a04, + 0xb610b, + 0x44e86, + 0x8cbc7, + 0x23cac3, + 0x51648, + 0x323043, + 0x8b205, + 0x1493c4, + 0x227583, + 0x556c7, + 0xe06c4, + 0x208e83, + 0x1a3284, + 0x1a3443, + 0x201a03, + 0x2f4544, + 0xb5ec8, + 0x12cf06, + 0x16308, + 0x1252c5, + 0x9fc9, + 0x20f882, + 0x238543, + 0x23cac3, + 0x323043, + 0x28cac3, + 0x200e03, + 0x201a03, + 0x2f3743, + 0x205082, + 0x16fb88, + 0x238543, + 0x23cac3, + 0x323043, + 0x231603, + 0x21bf84, + 0x208e83, + 0xe03, + 0x201a03, + 0x238543, + 0x23cac3, + 0x2de944, + 0x323043, + 0x208e83, + 0x201a03, + 0x3a03c6, + 0x23cac3, + 0x323043, + 0x18a783, + 0x201a03, + 0x238543, + 0x23cac3, + 0x323043, + 0x208e83, + 0x201a03, + 0x8cbc7, + 0x16fb88, + 0x323043, + 0x238543, + 0x23cac3, + 0x323043, + 0x208e83, + 0x201a03, + 0x45238543, + 0x23cac3, + 0x208e83, + 0x201a03, + 0x16fb88, + 0x207102, + 0x20f882, + 0x238543, + 0x323043, + 0x208e83, + 0x200442, + 0x201a03, + 0x31f1c7, + 0x342b8b, + 0x22fc83, + 0x244708, + 0x34f007, + 0x348746, + 0x382d45, + 0x232309, + 0x28c848, + 0x346789, + 0x346790, + 0x36f64b, + 0x2e2109, + 0x205dc3, + 0x20af09, + 0x23bd86, + 0x23bd8c, + 0x32d288, + 0x3bc208, + 0x244a49, + 0x29854e, + 0x2cc1cb, + 0x2e5c0c, + 0x203ec3, + 0x26ad0c, + 0x203ec9, + 0x30ae47, + 0x23ca0c, + 0x2b478a, + 0x252044, + 0x2768cd, + 0x26abc8, + 0x21308d, + 0x26fec6, + 0x28664b, + 0x200cc9, + 0x2cf787, + 0x332c86, + 0x3372c9, + 0x34834a, + 0x319108, + 0x2f3204, + 0x2fe987, + 0x363787, + 0x2d0184, + 0x38d204, + 0x2345c9, + 0x28a4c9, + 0x2b7288, + 0x216d05, + 0x339645, + 0x213c86, + 0x276789, + 0x249c4d, + 0x33bf88, + 0x213b87, + 0x382dc8, + 0x2fa686, + 0x39b444, + 0x2501c5, + 0x201c46, + 0x202884, + 0x203dc7, + 0x206f4a, + 0x219784, + 0x21dfc6, + 0x21ea49, + 0x21ea4f, + 0x21fc8d, + 0x220f06, + 0x224c90, + 0x225086, + 0x2257c7, + 0x2269c7, + 0x2269cf, + 0x2276c9, + 0x22cb06, + 0x22da47, + 0x22da48, + 0x22f289, + 0x358088, + 0x2eb507, + 0x212843, + 0x394f46, + 0x3c0b48, + 0x29880a, + 0x236089, + 0x205d83, + 0x3784c6, + 0x26bcca, + 0x28eb87, + 0x30ac8a, + 0x25a18e, + 0x227806, + 0x2b03c7, + 0x217bc6, + 0x203f86, + 0x38fd0b, + 0x31708a, + 0x32138d, + 0x21d047, + 0x20e408, + 0x20e409, + 0x20e40f, + 0x2c1c4c, + 0x2b4089, + 0x2d890e, + 0x34e44a, + 0x28b906, + 0x314a86, + 0x319d8c, + 0x31be8c, + 0x327508, + 0x36eac7, + 0x274d85, + 0x3485c4, + 0x20f88e, + 0x299684, + 0x388947, + 0x39140a, + 0x38a814, + 0x39390f, + 0x226b88, + 0x394e08, + 0x35eccd, + 0x35ecce, + 0x3a0849, + 0x238788, + 0x23878f, + 0x23c70c, + 0x23c70f, + 0x23d907, + 0x240c0a, + 0x2459cb, + 0x243788, + 0x245c87, + 0x3ac74d, + 0x322b46, + 0x276a86, + 0x248dc9, + 0x364b08, + 0x24cf48, + 0x24cf4e, + 0x2f4087, + 0x24e145, + 0x24e9c5, + 0x204b44, + 0x348a06, + 0x2b7188, + 0x20db03, + 0x2f948e, + 0x3acb08, + 0x2b588b, + 0x378bc7, + 0x3ab345, + 0x233d86, + 0x2b1f87, + 0x32f2c8, + 0x325449, + 0x322dc5, + 0x28e788, + 0x21c946, + 0x3afeca, + 0x20f789, + 0x23cac9, + 0x23cacb, + 0x346448, + 0x2d0049, + 0x216dc6, + 0x23768a, + 0x293c0a, + 0x240e0c, + 0x28e4c7, + 0x2ce74a, + 0x36b38b, + 0x36b399, + 0x312408, + 0x3a0445, + 0x2cdd46, + 0x25c489, + 0x3449c6, + 0x2df8ca, + 0x28ca46, + 0x20df44, + 0x2cdecd, + 0x20df47, + 0x218209, + 0x250ac5, + 0x250c08, + 0x251409, + 0x251844, + 0x251f47, + 0x251f48, + 0x2526c7, + 0x26e2c8, + 0x255cc7, + 0x25b845, + 0x25f3cc, + 0x25fc09, + 0x2c8c0a, + 0x39ec09, + 0x20b009, + 0x37ee4c, + 0x264f0b, + 0x2662c8, + 0x267448, + 0x26a804, + 0x289848, + 0x28d209, + 0x2b4847, + 0x20e646, + 0x200f47, + 0x2c4289, + 0x32264b, + 0x325147, + 0x201a87, + 0x2b79c7, + 0x213004, + 0x213005, + 0x2a7c05, + 0x34b1cb, + 0x3a9384, + 0x350448, + 0x26e94a, + 0x21ca07, + 0x300687, + 0x294712, + 0x276c06, + 0x23a1c6, + 0x33888e, + 0x27ab46, + 0x29abc8, + 0x29b38f, + 0x213448, + 0x302848, + 0x3bd10a, + 0x3bd111, + 0x2a990e, + 0x25654a, + 0x25654c, + 0x20bf07, + 0x238990, + 0x200408, + 0x2a9b05, + 0x2b238a, + 0x2028cc, + 0x29cf8d, + 0x302346, + 0x302347, + 0x30234c, + 0x30c80c, + 0x335d4c, + 0x2edfcb, + 0x28e0c4, + 0x22c9c4, + 0x354609, + 0x39e807, + 0x229989, + 0x293a49, + 0x3b6587, + 0x2b4606, + 0x2b4609, + 0x2b4a03, + 0x21b7ca, + 0x31fd07, + 0x34304b, + 0x32120a, + 0x2f6744, + 0x35f646, + 0x286b89, + 0x281a04, + 0x20324a, + 0x3a1205, + 0x2c4d45, + 0x2c4d4d, + 0x2c508e, + 0x2b9ac5, + 0x32ab86, + 0x39ffc7, + 0x25f64a, + 0x3a8286, + 0x2eefc4, + 0x2f9847, + 0x3bc50b, + 0x2fa747, + 0x30b444, + 0x256fc6, + 0x256fcd, + 0x2c3f4c, + 0x208d46, + 0x33c18a, + 0x230206, + 0x22ddc8, + 0x285107, + 0x34c98a, + 0x3840c6, + 0x210443, + 0x210446, + 0x3c09c8, + 0x2a344a, + 0x2801c7, + 0x2801c8, + 0x289e04, + 0x256ac7, + 0x283288, + 0x345388, + 0x284508, + 0x35874a, + 0x2e4505, + 0x2e9a07, + 0x256393, + 0x343d86, + 0x2e0908, + 0x229f89, + 0x24c488, + 0x38600b, + 0x2d3d48, + 0x2bc644, + 0x27a9c6, + 0x317ec6, + 0x330889, + 0x3bc3c7, + 0x25f4c8, + 0x2931c6, + 0x36c244, + 0x30aa05, + 0x2d4008, + 0x2cd88a, + 0x2cdb48, + 0x2d4b06, + 0x2a1d8a, + 0x2fc208, + 0x2d8fc8, + 0x2d9ec8, + 0x2da506, + 0x2dc3c6, + 0x20c0cc, + 0x2dc990, + 0x285505, + 0x213248, + 0x30d410, + 0x213250, + 0x34660e, + 0x20bd4e, + 0x20bd54, + 0x20e78f, + 0x20eb46, + 0x3072d1, + 0x332e13, + 0x333288, + 0x31d245, + 0x2a0bc8, + 0x395705, + 0x23540c, + 0x2309c9, + 0x2994c9, + 0x230e47, + 0x263549, + 0x261047, + 0x2ffa46, + 0x24ffc7, + 0x20ef05, + 0x217103, + 0x20dcc9, + 0x22a249, + 0x38a783, + 0x3b35c4, + 0x358c8d, + 0x3b83cf, + 0x36c285, + 0x331786, + 0x21ac47, + 0x32d007, + 0x290806, + 0x29080b, + 0x2aa805, + 0x263c06, + 0x300b87, + 0x257449, + 0x345a06, + 0x20cb45, + 0x2248cb, + 0x230786, + 0x38ad45, + 0x273988, + 0x2a6988, + 0x2ba50c, + 0x2ba510, + 0x2b64c9, + 0x2c5607, + 0x2e520b, + 0x30be86, + 0x2eb3ca, + 0x2ec90b, + 0x2ee70a, + 0x2ee986, + 0x2ef645, + 0x31fa46, + 0x37d408, + 0x230f0a, + 0x35e95c, + 0x2f380c, + 0x2f3b08, + 0x3a03c5, + 0x35cec7, + 0x25b0c6, + 0x27f7c5, + 0x2227c6, + 0x2909c8, + 0x2c2c07, + 0x298448, + 0x2b04ca, + 0x33764c, + 0x3378c9, + 0x39b5c7, + 0x215c04, + 0x24ea86, + 0x2d518a, + 0x293b45, + 0x211ecc, + 0x212e48, + 0x389c88, + 0x21904c, + 0x2266cc, + 0x229549, + 0x229787, + 0x23ff4c, + 0x2454c4, + 0x24718a, + 0x23354c, + 0x279a4b, + 0x24bfcb, + 0x3821c6, + 0x2f7447, + 0x20e947, + 0x238bcf, + 0x303191, + 0x2e16d2, + 0x314ecd, + 0x314ece, + 0x31520e, + 0x20e948, + 0x20e952, + 0x253e08, + 0x34ec47, + 0x25430a, + 0x208b08, + 0x27ab05, + 0x38c9ca, + 0x2255c7, + 0x2e6f44, + 0x227103, + 0x297185, + 0x3bd387, + 0x2fb547, + 0x29d18e, + 0x308c8d, + 0x30d7c9, + 0x21f545, + 0x31c443, + 0x326446, + 0x264085, + 0x27dc48, + 0x2c0649, + 0x2a0105, + 0x3ac94f, + 0x2b6207, + 0x382bc5, + 0x37958a, + 0x358946, + 0x2522c9, + 0x37db4c, + 0x2fec09, + 0x2094c6, + 0x26e74c, + 0x329f86, + 0x3017c8, + 0x301c86, + 0x312586, + 0x2082c4, + 0x266643, + 0x2b380a, + 0x32e411, + 0x30650a, + 0x265345, + 0x271ac7, + 0x25c7c7, + 0x283384, + 0x28338b, + 0x2cfb08, + 0x2c1486, + 0x37e6c5, + 0x3b01c4, + 0x280ac9, + 0x320804, + 0x24cd87, + 0x359f05, + 0x359f07, + 0x338ac5, + 0x2affc3, + 0x34eb08, + 0x35f2ca, + 0x20b3c3, + 0x32d20a, + 0x281ec6, + 0x3ac6cf, + 0x2f4009, + 0x2f9410, + 0x2ebe48, + 0x2d5809, + 0x29f087, + 0x256f4f, + 0x31e884, + 0x2de9c4, + 0x224f06, + 0x317b06, + 0x2e2aca, + 0x381c46, + 0x2ff587, + 0x30c148, + 0x30c347, + 0x30cbc7, + 0x30f08a, + 0x310b4b, + 0x3b1b45, + 0x2e1308, + 0x204443, + 0x2045cc, + 0x38000f, + 0x274b8d, + 0x2aefc7, + 0x30d909, + 0x2e8207, + 0x24f2c8, + 0x38aa0c, + 0x2bc548, + 0x231848, + 0x321d0e, + 0x336054, + 0x336564, + 0x354e4a, + 0x37018b, + 0x261104, + 0x261109, + 0x3656c8, + 0x24ef85, + 0x20d60a, + 0x3acd47, + 0x31f944, + 0x39c783, + 0x238543, + 0x240244, + 0x23cac3, + 0x323043, + 0x231604, + 0x255783, + 0x28cac3, + 0x20c0c6, + 0x21bf84, + 0x208e83, + 0x201a03, + 0x221483, + 0x207102, + 0x39c783, + 0x20f882, + 0x238543, + 0x240244, + 0x23cac3, + 0x323043, + 0x255783, + 0x20c0c6, + 0x208e83, + 0x201a03, + 0x16fb88, + 0x238543, + 0x23cac3, + 0x21b583, + 0x208e83, + 0x1a3443, + 0x201a03, + 0x16fb88, + 0x238543, + 0x23cac3, + 0x323043, + 0x28cac3, + 0x21bf84, + 0x208e83, + 0x201a03, + 0x207102, + 0x242043, + 0x20f882, + 0x23cac3, + 0x323043, + 0x28cac3, + 0x208e83, + 0x201a03, + 0x201382, + 0x235f42, + 0x20f882, + 0x238543, + 0x206902, + 0x200942, + 0x231604, + 0x20f644, + 0x22a482, + 0x21bf84, + 0x200442, + 0x201a03, + 0x221483, + 0x3821c6, + 0x21a902, + 0x202642, + 0x20c4c2, + 0x47a13443, + 0x47e0bf03, + 0x5d306, + 0x5d306, + 0x286644, + 0x200e03, + 0x14b700a, + 0x12ea0c, + 0xf4cc, + 0x871cd, + 0x131645, + 0x26547, + 0x1b1c6, + 0x21088, + 0x23087, + 0x28b08, + 0x1aa20a, + 0x1397c7, + 0x48adf485, + 0x1359c9, + 0x3e34b, + 0x35dcb, + 0x42e48, + 0x172f4a, + 0x9288e, + 0x144c28b, + 0x6a04, + 0x63d46, + 0x7588, + 0xf8d08, + 0x3e607, + 0x1a787, + 0x57f89, + 0x81a87, + 0xdd088, + 0x12f5c9, + 0x49804, + 0x49f45, + 0x12bfce, + 0xb084d, + 0x8ca48, + 0x48e34406, + 0x49834408, + 0x7b548, + 0x11f3d0, + 0x5998c, + 0x6b9c7, + 0x6c647, + 0x71387, + 0x77fc7, + 0x13c42, + 0x144ec7, + 0x11724c, + 0x43b87, + 0xac206, + 0xac7c9, + 0xae208, + 0x206c2, + 0x942, + 0xbee8b, + 0x1a3307, + 0x18009, + 0x164ec9, + 0x3ef48, + 0xb8042, + 0x134649, + 0xcc60a, + 0xd2689, + 0xdfdc9, + 0xe0b08, + 0xe1b87, + 0xe4489, + 0xe61c5, + 0xe67d0, + 0x191646, + 0x11205, + 0x31e8d, + 0x235c6, + 0xefd07, + 0xf4558, + 0x14f508, + 0xc74a, + 0xb282, + 0x5524d, + 0xa02, + 0x86286, + 0x95408, + 0x8f148, + 0x16fa49, + 0x586c8, + 0x6420e, + 0x126447, + 0x1051cd, + 0xfb445, + 0x144c48, + 0x19fc08, + 0x106046, + 0xc2, + 0x12cf06, + 0x4542, + 0x341, + 0x65a07, + 0xf6fc3, + 0x492f4dc4, + 0x4969c243, + 0x141, + 0x19d06, + 0x141, + 0x1, + 0x19d06, + 0xf6fc3, + 0x1402285, + 0x252044, + 0x238543, + 0x253384, + 0x231604, + 0x208e83, + 0x229e45, + 0x221f43, + 0x20c843, + 0x355685, + 0x202443, + 0x4aa38543, + 0x23cac3, + 0x323043, + 0x200041, + 0x28cac3, + 0x20f644, + 0x21bf84, + 0x208e83, + 0x201a03, + 0x215443, + 0x16fb88, + 0x207102, + 0x39c783, + 0x20f882, + 0x238543, + 0x23cac3, + 0x21b583, + 0x200942, + 0x231604, + 0x255783, + 0x28cac3, + 0x208e83, + 0x200e03, + 0x201a03, + 0x202443, + 0x16fb88, + 0x37fd82, + 0x18c1c7, + 0xf882, + 0x10a985, + 0x1480cc8, + 0x10c50e, + 0x4ba0ab02, + 0x31fec8, + 0x2bdd86, + 0x2ca186, + 0x2bd707, + 0x4be00b42, + 0x4c3ac548, + 0x21870a, + 0x26b448, + 0x200242, + 0x31fb49, + 0x3b1b87, + 0x21ec06, + 0x34e849, + 0x2e9b44, + 0x348646, + 0x2ca584, + 0x27f584, + 0x25f009, + 0x32d906, + 0x240ac5, + 0x297a85, + 0x3b9d87, + 0x2c76c7, + 0x2979c4, + 0x2bd946, + 0x307b85, + 0x30a3c5, + 0x3a2a05, + 0x339407, + 0x378a05, + 0x31ddc9, + 0x234fc5, + 0x32f404, + 0x3a81c7, + 0x341b0e, + 0x306bc9, + 0x338749, + 0x388d86, + 0x24a608, + 0x36ae4b, + 0x2b698c, + 0x33ea46, + 0x2e5ac7, + 0x212245, + 0x38d20a, + 0x2b7389, + 0x209b49, + 0x259f06, + 0x300945, + 0x2edac5, + 0x3570c9, + 0x3a2b8b, + 0x27e286, + 0x3471c6, + 0x20de04, + 0x2943c6, + 0x24e1c8, + 0x3c0846, + 0x215006, + 0x205fc8, + 0x2092c7, + 0x209909, + 0x211385, + 0x16fb88, + 0x21a704, + 0x2394c4, + 0x201105, + 0x3a6649, + 0x228f87, + 0x228f8b, + 0x22b3ca, + 0x230905, + 0x4c612842, + 0x342f07, + 0x4ca30c08, + 0x3578c7, + 0x2c3d45, + 0x209dca, + 0xf882, + 0x2be6cb, + 0x255e0a, + 0x22a146, + 0x216383, + 0x2a038d, + 0x3572cc, + 0x357a4d, + 0x250545, + 0x334fc5, + 0x20db47, + 0x36c689, + 0x218606, + 0x381ac5, + 0x2d2b88, + 0x2942c3, + 0x2fa288, + 0x2942c8, + 0x2cb287, + 0x314808, + 0x3b49c9, + 0x374847, + 0x342707, + 0x202108, + 0x2d1c84, + 0x2d1c87, + 0x26fdc8, + 0x355546, + 0x3b874f, + 0x226207, + 0x2eb686, + 0x2298c5, + 0x22a8c3, + 0x381947, + 0x37cc43, + 0x252886, + 0x254006, + 0x254706, + 0x298b85, + 0x26e2c3, + 0x397cc8, + 0x37f889, + 0x3920cb, + 0x254888, + 0x255985, + 0x2584c5, + 0x4cef6802, + 0x250089, + 0x34eec7, + 0x263c85, + 0x25ef07, + 0x260506, + 0x374345, + 0x263ecb, + 0x2662c4, + 0x26b005, + 0x26b147, + 0x27db86, + 0x27e045, + 0x289a47, + 0x28a187, + 0x2d5104, + 0x291b8a, + 0x292048, + 0x2cee09, + 0x2a0f05, + 0x3bf1c6, + 0x24e38a, + 0x2be906, + 0x26f2c7, + 0x2ceacd, + 0x2aa349, + 0x396fc5, + 0x339f07, + 0x333448, + 0x25a5c8, + 0x332847, + 0x358246, + 0x21cb87, + 0x253c43, + 0x34b1c4, + 0x371cc5, + 0x39d947, + 0x3a2409, + 0x231b08, + 0x34cbc5, + 0x23bac4, + 0x254a45, + 0x256c4d, + 0x2006c2, + 0x230386, + 0x2861c6, + 0x2e654a, + 0x3904c6, + 0x39ab85, + 0x342445, + 0x342447, + 0x3afd0c, + 0x27b3ca, + 0x294086, + 0x28ad05, + 0x294206, + 0x294547, + 0x296886, + 0x298a8c, + 0x34e989, + 0x4d21a187, + 0x29b745, + 0x29b746, + 0x29bcc8, + 0x246f85, + 0x2ab085, + 0x2ab808, + 0x2aba0a, + 0x4d6335c2, + 0x4da14d02, + 0x2e76c5, + 0x2eb603, + 0x243408, + 0x252403, + 0x2abc84, + 0x25240b, + 0x36b208, + 0x2daa48, + 0x4df3b049, + 0x2afc09, + 0x2b0746, + 0x2b1c08, + 0x2b1e09, + 0x2b2886, + 0x2b2a05, + 0x3944c6, + 0x2b2f49, + 0x389347, + 0x2647c6, + 0x2de087, + 0x218487, + 0x2dd9c4, + 0x4e34f809, + 0x2d32c8, + 0x3ac448, + 0x3932c7, + 0x2cd346, + 0x36c489, + 0x2ca847, + 0x32598a, + 0x358388, + 0x208387, + 0x208f86, + 0x271d8a, + 0x26fbc8, + 0x2ed485, + 0x230685, + 0x2ef1c7, + 0x311cc9, + 0x30150b, + 0x31a308, + 0x235049, + 0x254c87, + 0x2bd04c, + 0x2bfccc, + 0x2bffca, + 0x2c024c, + 0x2ca108, + 0x2ca308, + 0x2ca504, + 0x2caa09, + 0x2cac49, + 0x2cae8a, + 0x2cb109, + 0x2cb447, + 0x3ba98c, + 0x23f586, + 0x2cbf88, + 0x2be9c6, + 0x387486, + 0x396ec7, + 0x306dc8, + 0x3445cb, + 0x28e307, + 0x250289, + 0x350b89, + 0x253507, + 0x2771c4, + 0x271c07, + 0x2fda46, + 0x21d8c6, + 0x33c345, + 0x297248, + 0x2993c4, + 0x2993c6, + 0x27b28b, + 0x21bac9, + 0x36c886, + 0x204bc9, + 0x339586, + 0x25f1c8, + 0x211b83, + 0x300ac5, + 0x219b09, + 0x21da05, + 0x2fba44, + 0x27d046, + 0x2fd385, + 0x299906, + 0x310ec7, + 0x33a986, + 0x3b134b, + 0x237587, + 0x241646, + 0x354786, + 0x3b9e46, + 0x297989, + 0x25384a, + 0x2bbb85, + 0x2202cd, + 0x2abb06, + 0x204a86, + 0x2f3f06, + 0x22dd45, + 0x2e6ac7, + 0x300087, + 0x2e7dce, + 0x28cac3, + 0x2cd309, + 0x210c89, + 0x38d607, + 0x364207, + 0x2a5bc5, + 0x2b57c5, + 0x4e63470f, + 0x2d5a47, + 0x2d5c08, + 0x2d6144, + 0x2d7106, + 0x4ea4ea42, + 0x2da786, + 0x20c0c6, + 0x210e4e, + 0x2fa0ca, + 0x273b06, + 0x23398a, + 0x211689, + 0x32b385, + 0x3a4808, + 0x3bca06, + 0x306748, + 0x33aac8, + 0x2194cb, + 0x2bd805, + 0x378a88, + 0x20610c, + 0x2c3c07, + 0x254246, + 0x2fd1c8, + 0x3488c8, + 0x4ee06802, + 0x23588b, + 0x2123c9, + 0x205549, + 0x2174c7, + 0x223408, + 0x4f36bec8, + 0x38ffcb, + 0x23edc9, + 0x338f0d, + 0x27fa88, + 0x22b1c8, + 0x4f6014c2, + 0x203cc4, + 0x4fa19302, + 0x2fe206, + 0x4fe004c2, + 0x261b8a, + 0x2199c6, + 0x232808, + 0x2c6f48, + 0x2b6f06, + 0x22fe46, + 0x2f9186, + 0x2b5a45, + 0x2443c4, + 0x50206d04, + 0x214106, + 0x29c747, + 0x50620c47, + 0x2d644b, + 0x341ec9, + 0x33500a, + 0x2106c4, + 0x342588, + 0x26458d, + 0x2f2489, + 0x2f26c8, + 0x2f2d49, + 0x2f4544, + 0x245884, + 0x285cc5, + 0x320fcb, + 0x36b186, + 0x34b905, + 0x2279c9, + 0x2bda08, + 0x210dc4, + 0x38d389, + 0x2064c5, + 0x2c7708, + 0x342dc7, + 0x338b48, + 0x286d86, + 0x233207, + 0x29a989, + 0x224a49, + 0x38adc5, + 0x34dfc5, + 0x50a08402, + 0x32f1c4, + 0x2fdd45, + 0x2ce506, + 0x33bd05, + 0x387e47, + 0x214205, + 0x27dbc4, + 0x388e46, + 0x381b47, + 0x23d046, + 0x2c41c5, + 0x207f48, + 0x2bdf85, + 0x211a07, + 0x214689, + 0x21bc0a, + 0x2fc487, + 0x2fc48c, + 0x240a86, + 0x37e349, + 0x246a45, + 0x246ec8, + 0x207c03, + 0x216d85, + 0x2fd705, + 0x282d47, + 0x50e06ac2, + 0x22f647, + 0x2e56c6, + 0x373b46, + 0x30bfc6, + 0x348806, + 0x206748, + 0x2a0d05, + 0x2eb747, + 0x2eb74d, + 0x227103, + 0x227105, + 0x379347, + 0x22f988, + 0x378f05, + 0x2216c8, + 0x37ccc6, + 0x335b87, + 0x2cbec5, + 0x2bd886, + 0x39ce45, + 0x21c70a, + 0x2f1346, + 0x383f47, + 0x2bca85, + 0x2f5047, + 0x2f97c4, + 0x2fb9c6, + 0x2fe345, + 0x32d70b, + 0x2fd8c9, + 0x24214a, + 0x38ae48, + 0x30e048, + 0x380a8c, + 0x3964c7, + 0x3054c8, + 0x307f48, + 0x3084c5, + 0x311a8a, + 0x31c449, + 0x51200d02, + 0x201886, + 0x216044, + 0x216049, + 0x27d549, + 0x27e9c7, + 0x2b4e07, + 0x2938c9, + 0x22df48, + 0x22df4f, + 0x2e3a06, + 0x2df14b, + 0x34b445, + 0x34b447, + 0x368849, + 0x21aa46, + 0x38d307, + 0x2e1a45, + 0x23ae84, + 0x284fc6, + 0x2262c4, + 0x2db107, + 0x2d6f08, + 0x51700848, + 0x301245, + 0x301387, + 0x260a09, + 0x205304, + 0x24b348, + 0x51ab7cc8, + 0x283384, + 0x23c208, + 0x332d44, + 0x22be49, + 0x351a45, + 0x51e05082, + 0x2e3a45, + 0x310045, + 0x20fc48, + 0x23d747, + 0x52200d42, + 0x3322c5, + 0x2d8e46, + 0x27cb06, + 0x32f188, + 0x337d48, + 0x33bcc6, + 0x34bb06, + 0x38c289, + 0x373a86, + 0x21a90b, + 0x2e5f85, + 0x208a46, + 0x29e108, + 0x3a0a06, + 0x322c46, + 0x221b8a, + 0x23b30a, + 0x2498c5, + 0x2a0dc7, + 0x313646, + 0x52606442, + 0x379487, + 0x266cc5, + 0x24e304, + 0x24e305, + 0x2105c6, + 0x278fc7, + 0x215dc5, + 0x23b484, + 0x2c4788, + 0x322d05, + 0x3af347, + 0x3b6dc5, + 0x21c645, + 0x258f84, + 0x2ee209, + 0x3079c8, + 0x263146, + 0x2b5386, + 0x345186, + 0x52b08148, + 0x308347, + 0x30874d, + 0x3090cc, + 0x3096c9, + 0x309909, + 0x52f67742, + 0x3b6343, + 0x215ac3, + 0x2fdb05, + 0x39da4a, + 0x32f046, + 0x30e2c5, + 0x311084, + 0x31108b, + 0x323a8c, + 0x3244cc, + 0x3247d5, + 0x32660d, + 0x327d0f, + 0x3280d2, + 0x32854f, + 0x328912, + 0x328d93, + 0x32924d, + 0x32980d, + 0x329b8e, + 0x32a10e, + 0x32a94c, + 0x32ad0c, + 0x32b14b, + 0x32b4ce, + 0x32c612, + 0x32ee0c, + 0x32fd90, + 0x33cd52, + 0x33d9cc, + 0x33e08d, + 0x33e3cc, + 0x3406d1, + 0x34734d, + 0x349e0d, + 0x34a40a, + 0x34a68c, + 0x34af8c, + 0x34b60c, + 0x34c20c, + 0x3523d3, + 0x352cd0, + 0x3530d0, + 0x35398d, + 0x353f8c, + 0x354b89, + 0x35690d, + 0x356c53, + 0x3595d1, + 0x359a13, + 0x35a0cf, + 0x35a48c, + 0x35a78f, + 0x35ab4d, + 0x35b14f, + 0x35b510, + 0x35bf8e, + 0x35f88e, + 0x35fe10, + 0x36150d, + 0x361e8e, + 0x36220c, + 0x363213, + 0x3658ce, + 0x365f50, + 0x366351, + 0x36678f, + 0x366b53, + 0x3672cd, + 0x36760f, + 0x3679ce, + 0x368090, + 0x368489, + 0x369210, + 0x36980f, + 0x369e8f, + 0x36a252, + 0x36dcce, + 0x36e7cd, + 0x36f00d, + 0x36f34d, + 0x37078d, + 0x370acd, + 0x370e10, + 0x37120b, + 0x371a8c, + 0x371e0c, + 0x37240c, + 0x37270e, + 0x382350, + 0x384512, + 0x38498b, + 0x384e8e, + 0x38520e, + 0x386dce, + 0x38724b, + 0x53388016, + 0x38988d, + 0x38a014, + 0x38b04d, + 0x38cd55, + 0x38e30d, + 0x38ec8f, + 0x38f4cf, + 0x39238f, + 0x39274e, + 0x392ccd, + 0x394091, + 0x39668c, + 0x39698c, + 0x396c8b, + 0x39710c, + 0x3974cf, + 0x397892, + 0x39824d, + 0x39974c, + 0x399bcc, + 0x399ecd, + 0x39a20f, + 0x39a5ce, + 0x39d70c, + 0x39dccd, + 0x39e00b, + 0x39e9cc, + 0x39f2cd, + 0x39f60e, + 0x39f989, + 0x3a1353, + 0x3a188d, + 0x3a1bcd, + 0x3a21cc, + 0x3a264e, + 0x3a37cf, + 0x3a3b8c, + 0x3a3e8d, + 0x3a41cf, + 0x3a458c, + 0x3a508c, + 0x3a550c, + 0x3a580c, + 0x3a5ecd, + 0x3a6212, + 0x3a688c, + 0x3a6b8c, + 0x3a6e91, + 0x3a72cf, + 0x3a768f, + 0x3a7a53, + 0x3a8a0e, + 0x3a8d8f, + 0x3a914c, + 0x537a948e, + 0x3a980f, + 0x3a9bd6, + 0x3aaa92, + 0x3acf0c, + 0x3ada0f, + 0x3ae08d, + 0x3ae3cf, + 0x3ae78c, + 0x3aea8d, + 0x3aedcd, + 0x3b084e, + 0x3b228c, + 0x3b258c, + 0x3b2890, + 0x3b57d1, + 0x3b5c0b, + 0x3b5f4c, + 0x3b624e, + 0x3b7211, + 0x3b764e, + 0x3b79cd, + 0x3bc7cb, + 0x3bd88f, + 0x3be394, + 0x210642, + 0x210642, + 0x204d43, + 0x210642, + 0x204d43, + 0x210642, + 0x2009c2, + 0x394505, + 0x3b6f0c, + 0x210642, + 0x210642, + 0x2009c2, + 0x210642, + 0x29c345, + 0x21bc05, + 0x210642, + 0x210642, + 0x201102, + 0x29c345, + 0x326b49, + 0x3592cc, + 0x210642, + 0x210642, + 0x210642, + 0x210642, + 0x394505, + 0x210642, + 0x210642, + 0x210642, + 0x210642, + 0x201102, + 0x326b49, + 0x210642, + 0x210642, + 0x210642, + 0x21bc05, + 0x210642, + 0x21bc05, + 0x3592cc, + 0x3b6f0c, + 0x39c783, + 0x238543, + 0x23cac3, + 0x323043, + 0x231604, + 0x208e83, + 0x201a03, + 0xe008, + 0x64344, + 0xe03, + 0xc63c8, + 0x207102, + 0x5460f882, + 0x24ac83, + 0x23f044, + 0x2020c3, + 0x39e544, + 0x23a1c6, + 0x216f83, + 0x304704, + 0x2d7b05, + 0x28cac3, + 0x208e83, + 0x1a3443, + 0x201a03, + 0x243d0a, + 0x3821c6, + 0x38558c, + 0x16fb88, + 0x20f882, + 0x238543, + 0x23cac3, + 0x323043, + 0x229443, + 0x20c0c6, + 0x208e83, + 0x201a03, + 0x221483, + 0xac408, + 0x131645, + 0x35f09, + 0x35c2, + 0x55b95645, + 0x26547, + 0xba9c8, + 0x14b0e, + 0x90212, + 0x10a78b, + 0x1398c6, + 0x55edf485, + 0x562df48c, + 0x148f87, + 0x36dc7, + 0x15000a, + 0x46690, + 0x13b345, + 0xb610b, + 0xf8d08, + 0x3e607, + 0x3af8b, + 0x57f89, + 0x185a87, + 0x81a87, + 0x7e4c7, + 0x3e546, + 0xdd088, + 0x56824386, + 0xb084d, + 0x14f9d0, + 0x56c0c182, + 0x8ca48, + 0x4f450, + 0x15090c, + 0x5735cd4d, + 0x64a88, + 0x721c7, + 0x76f09, + 0x5d3c6, + 0x9bec8, + 0x351c2, + 0xa808a, + 0x293c7, + 0x43b87, + 0xac7c9, + 0xae208, + 0x8b205, + 0xd538e, + 0x5c4e, + 0x17a8f, + 0x18009, + 0x164ec9, + 0x15d38b, + 0x7ba8f, + 0xee40c, + 0xa88cb, + 0xc8b48, + 0xd6347, + 0xdbe88, + 0xfe78b, + 0xff34c, + 0x10038c, + 0x1037cc, + 0x10b54d, + 0x3ef48, + 0xd2942, + 0x134649, + 0x195d8b, + 0xcd546, + 0x11f30b, + 0xe118a, + 0xe1d45, + 0xe67d0, + 0xe9f06, + 0x16b986, + 0x11205, + 0x10fc48, + 0xefd07, + 0xeffc7, + 0x8d047, + 0xfe04a, + 0xba84a, + 0x86286, + 0x99d0d, + 0x8f148, + 0x586c8, + 0x58ec9, + 0xbc8c5, + 0x1ad70c, + 0x10b74b, + 0x19e604, + 0x105e09, + 0x106046, + 0x16546, + 0x2642, + 0x12cf06, + 0xc68b, + 0x112707, + 0x4542, + 0xd1305, + 0x2e604, + 0x8c1, + 0x52d03, + 0x56764886, + 0x9c243, + 0x7b02, + 0x293c4, + 0x242, + 0x86644, + 0xf82, + 0x6502, + 0x3302, + 0xd342, + 0x1382, + 0xdf482, + 0x8c2, + 0x22902, + 0x40e82, + 0x1a442, + 0x4c82, + 0x234c2, + 0x3cac3, + 0x6b82, + 0x1842, + 0x7602, + 0x6b02, + 0x17202, + 0x36d02, + 0x206c2, + 0xc442, + 0x1c82, + 0x942, + 0x55783, + 0x4182, + 0x2542, + 0xb8042, + 0x9a02, + 0x282, + 0x2942, + 0xd842, + 0xc202, + 0x4a82, + 0x182842, + 0x745c2, + 0xe82, + 0x8e83, + 0x1942, + 0x6802, + 0x982, + 0x5b82, + 0x18ad45, + 0x7082, + 0x2fa42, + 0x13ebc3, + 0x482, + 0xb282, + 0xa02, + 0x2502, + 0x6742, + 0xd42, + 0xc2, + 0x2642, + 0x35dc5, + 0x17f087, + 0x20d0c3, + 0x207102, + 0x238543, + 0x23cac3, + 0x21b583, + 0x2046c3, + 0x229443, + 0x208e83, + 0x200e03, + 0x201a03, + 0x29c283, + 0x10c3, + 0x16fb88, + 0x238543, + 0x23cac3, + 0x21b583, + 0x28cac3, + 0x208e83, + 0x200e03, + 0x1a3443, + 0x201a03, + 0x238543, + 0x23cac3, + 0x201a03, + 0x238543, + 0x23cac3, + 0x323043, + 0x200041, + 0x28cac3, + 0x208e83, + 0x21b543, + 0x201a03, + 0x146f44, + 0x39c783, + 0x238543, + 0x23cac3, + 0x26eac3, + 0x21b583, + 0x207b03, + 0x289303, + 0x219983, + 0x241503, + 0x323043, + 0x231604, + 0x208e83, + 0x201a03, + 0x202443, + 0x333cc4, + 0x251183, + 0x3ec3, + 0x3c0943, + 0x20a3c8, + 0x271dc4, + 0x2cf30a, + 0x2bed86, + 0x112384, + 0x3a7ec7, + 0x226cca, + 0x2e38c9, + 0x3b7f87, + 0x3be84a, + 0x39c783, + 0x2e774b, + 0x28b689, + 0x345285, + 0x2da5c7, + 0xf882, + 0x238543, + 0x21a447, + 0x2379c5, + 0x2ca689, + 0x23cac3, + 0x2bd606, + 0x2c9883, + 0xe5743, + 0x110646, + 0xd386, + 0x16f07, + 0x21af86, + 0x222985, + 0x3a3147, + 0x2de5c7, + 0x59b23043, + 0x33dc07, + 0x374703, + 0x3b5045, + 0x231604, + 0x231308, + 0x366fcc, + 0x2b4fc5, + 0x2aa4c6, + 0x21a307, + 0x39b687, + 0x23dfc7, + 0x23f108, + 0x30f50f, + 0x2e3b05, + 0x24ad87, + 0x33acc7, + 0x2abdca, + 0x2d29c9, + 0x39e6c5, + 0x31078a, + 0xc546, + 0x2c9905, + 0x3703c4, + 0x2c6e86, + 0x300e07, + 0x2d2847, + 0x306908, + 0x217645, + 0x2378c6, + 0x214f85, + 0x2e8105, + 0x21ba04, + 0x2b6e07, + 0x20658a, + 0x34d908, + 0x367f06, + 0x29443, + 0x2e4505, + 0x26bf86, + 0x3babc6, + 0x211106, + 0x28cac3, + 0x3984c7, + 0x33ac45, + 0x208e83, + 0x2e144d, + 0x200e03, + 0x306a08, + 0x3b3644, + 0x310945, + 0x2abcc6, + 0x23f386, + 0x208947, + 0x2aed47, + 0x26f045, + 0x201a03, + 0x20a147, + 0x277089, + 0x36bbc9, + 0x227f4a, + 0x235d82, + 0x3b5004, + 0x2eb2c4, + 0x344487, + 0x22f508, + 0x2f0889, + 0x226fc9, + 0x2f1ac7, + 0x28bb46, + 0xf3006, + 0x2f4544, + 0x2f4b4a, + 0x2f8248, + 0x2f9049, + 0x2c4bc6, + 0x2b9545, + 0x34d7c8, + 0x2cdc4a, + 0x20ec43, + 0x333e46, + 0x2f1bc7, + 0x225f45, + 0x3b3505, + 0x3a04c3, + 0x231944, + 0x230645, + 0x28a287, + 0x307b05, + 0x2ef086, + 0x103d45, + 0x273bc3, + 0x273bc9, + 0x26c04c, + 0x2a2b4c, + 0x2d8648, + 0x284187, + 0x301e08, + 0x30214a, + 0x302fcb, + 0x28b7c8, + 0x23ec48, + 0x23f486, + 0x345045, + 0x34624a, + 0x228cc5, + 0x205082, + 0x2cbd87, + 0x29f806, + 0x368d45, + 0x304209, + 0x281405, + 0x3716c5, + 0x218ac9, + 0x388a46, + 0x204448, + 0x332643, + 0x217186, + 0x27cf86, + 0x311f05, + 0x311f09, + 0x2f0fc9, + 0x27a3c7, + 0x114204, + 0x314207, + 0x226ec9, + 0x23f805, + 0x444c8, + 0x39c485, + 0x341a05, + 0x3911c9, + 0x20cac2, + 0x2628c4, + 0x200882, + 0x204182, + 0x30e985, + 0x312108, + 0x2bc805, + 0x2cb603, + 0x2cb605, + 0x2da983, + 0x2162c2, + 0x383c84, + 0x2fc183, + 0x20cb42, + 0x341504, + 0x2ec043, + 0x206682, + 0x28cfc3, + 0x295384, + 0x2eae03, + 0x2f6584, + 0x204242, + 0x221383, + 0x219c43, + 0x206182, + 0x332182, + 0x2f0e09, + 0x204382, + 0x290d84, + 0x201f82, + 0x34d644, + 0x28bb04, + 0x2c0d84, + 0x202642, + 0x23e882, + 0x229703, + 0x302d83, + 0x24a9c4, + 0x28a404, + 0x2f1d44, + 0x2f8404, + 0x315743, + 0x224183, + 0x20c4c4, + 0x315584, + 0x315d86, + 0x232ec2, + 0x20f882, + 0x23cac3, + 0x323043, + 0x208e83, + 0x201a03, + 0x207102, + 0x39c783, + 0x238543, + 0x23cac3, + 0x201843, + 0x323043, + 0x231604, + 0x2f10c4, + 0x21bf84, + 0x208e83, + 0x201a03, + 0x221483, + 0x2f5204, + 0x31fe83, + 0x2c37c3, + 0x359e44, + 0x39c286, + 0x211c43, + 0x36dc7, + 0x21f243, + 0x202103, + 0x2b8d83, + 0x263a43, + 0x229443, + 0x3321c5, + 0x238543, + 0x23cac3, + 0x323043, + 0x208e83, + 0x201a03, + 0x216403, + 0x239043, + 0x16fb88, + 0x238543, + 0x23cac3, + 0x323043, + 0x255783, + 0x208e83, + 0x2464c4, + 0x1a3443, + 0x201a03, + 0x25b0c4, + 0x2c6c85, + 0x36dc7, + 0x20f882, + 0x201742, + 0x207b02, + 0x204d42, + 0xe03, + 0x200442, + 0x238543, + 0x240244, + 0x23cac3, + 0x323043, + 0x28cac3, + 0x208e83, + 0x201a03, + 0x16fb88, + 0x238543, + 0x23cac3, + 0x323043, + 0x28cac3, + 0x21bf84, + 0x208e83, + 0xe03, + 0x201a03, + 0x215443, + 0x286644, + 0x16fb88, + 0x238543, + 0x200e03, + 0x10c3, + 0x13e8c4, + 0x252044, + 0x16fb88, + 0x238543, + 0x253384, + 0x231604, + 0x200e03, + 0x2014c2, + 0x201a03, + 0x20c843, + 0x31944, + 0x355685, + 0x205082, + 0x3156c3, + 0x145c49, + 0xdfb46, + 0x19c588, + 0x207102, + 0x16fb88, + 0x20f882, + 0x23cac3, + 0x323043, + 0x200942, + 0xe03, + 0x201a03, + 0x207102, + 0x1bea07, + 0x1370c9, + 0x3dc3, + 0x16fb88, + 0xd303, + 0x5db4c807, + 0x38543, + 0x1788, + 0x23cac3, + 0x323043, + 0x186c46, + 0x255783, + 0xe8888, + 0xc9148, + 0x3fbc6, + 0x28cac3, + 0xd30c8, + 0x187ec3, + 0xe8a85, + 0x3ccc7, + 0x8e83, + 0x63c3, + 0x1a03, + 0xcb02, + 0x17044a, + 0x10ea43, + 0x313e44, + 0x10f30b, + 0x10f8c8, + 0x95e02, + 0x207102, + 0x20f882, + 0x238543, + 0x23cac3, + 0x2de944, + 0x323043, + 0x255783, + 0x28cac3, + 0x208e83, + 0x238543, + 0x23cac3, + 0x323043, + 0x229443, + 0x208e83, + 0x201a03, + 0x236903, + 0x215443, + 0x238543, + 0x23cac3, + 0x323043, + 0x208e83, + 0x201a03, + 0x238543, + 0x23cac3, + 0x323043, + 0x208e83, + 0x201a03, + 0x10c3, + 0x238543, + 0x23cac3, + 0x323043, + 0x231604, + 0x229443, + 0x208e83, + 0x201a03, + 0x21a902, + 0x200141, + 0x207102, + 0x200001, + 0x327e02, + 0x16fb88, + 0x224c85, + 0x2008c1, + 0x38543, + 0x201781, + 0x200301, + 0x200081, + 0x2ac602, + 0x37cc44, + 0x394483, + 0x200181, + 0x200401, + 0x200041, + 0x200101, + 0x2ea547, + 0x2ec54f, + 0x2fbc06, + 0x200281, + 0x33e906, + 0x200801, + 0x200981, + 0x306f8e, + 0x200441, + 0x201a03, + 0x204101, + 0x258885, + 0x20cb02, + 0x3a03c5, + 0x200341, + 0x200741, + 0x2002c1, + 0x205082, + 0x2000c1, + 0x200201, + 0x200c81, + 0x2005c1, + 0x204541, + 0x16fb88, + 0x238543, + 0x23cac3, + 0x323043, + 0x208e83, + 0x201a03, + 0x221f43, + 0x238543, + 0x323043, + 0x95d48, + 0x28cac3, + 0x208e83, + 0x31483, + 0x201a03, + 0x14eec08, + 0x16308, + 0x16fb88, + 0xe03, + 0x8e444, + 0x4ec04, + 0x14eec0a, + 0x16fb88, + 0x1a3443, + 0x238543, + 0x23cac3, + 0x323043, + 0x208e83, + 0x201a03, + 0x203ec3, + 0x16fb88, + 0x238543, + 0x23cac3, + 0x2de944, + 0x201a03, + 0x22d585, + 0x35f2c4, + 0x238543, + 0x208e83, + 0x201a03, + 0x1f40a, + 0xf1844, + 0x118b06, + 0x20f882, + 0x238543, + 0x23adc9, + 0x23cac3, + 0x375449, + 0x323043, + 0x28cac3, + 0x208e83, + 0x201a03, + 0x2f4348, + 0x22dc07, + 0x355685, + 0xb4c8, + 0x1bea07, + 0x2f78a, + 0x178ccb, + 0x13c507, + 0x4a4c8, + 0x14f64a, + 0x19dc8, + 0x1370c9, + 0x30507, + 0x742c7, + 0x19bf08, + 0x1788, + 0x4b04f, + 0x1c045, + 0x1a87, + 0x186c46, + 0x41287, + 0x4a786, + 0xe8888, + 0x96fc6, + 0x188847, + 0x178809, + 0x1bf307, + 0xd81c9, + 0xbcbc9, + 0xc6a06, + 0xc9148, + 0xc7845, + 0x57b0a, + 0xd30c8, + 0x187ec3, + 0xdad48, + 0x3ccc7, + 0x131f45, + 0x787d0, + 0x63c3, + 0x1a3443, + 0x125807, + 0x1cc85, + 0xf02c8, + 0xe385, + 0x10ea43, + 0x16d5c8, + 0x12906, + 0x198909, + 0xb2007, + 0x145f0b, + 0x180884, + 0x104f04, + 0x10f30b, + 0x10f8c8, + 0x110547, + 0x131645, + 0x238543, + 0x23cac3, + 0x21b583, + 0x201a03, + 0x20c743, + 0x323043, + 0x1a3443, + 0x238543, + 0x23cac3, + 0x323043, + 0x28cac3, + 0x208e83, + 0x201a03, + 0x15d4cb, + 0x207102, + 0x20f882, + 0x201a03, + 0x16fb88, + 0x207102, + 0x20f882, + 0x207b02, + 0x200942, + 0x20b302, + 0x208e83, + 0x200442, + 0x207102, + 0x39c783, + 0x20f882, + 0x238543, + 0x23cac3, + 0x207b02, + 0x323043, + 0x255783, + 0x28cac3, + 0x21bf84, + 0x208e83, + 0x21eb43, + 0x201a03, + 0x313e44, + 0x202443, + 0x323043, + 0x20f882, + 0x238543, + 0x23cac3, + 0x323043, + 0x28cac3, + 0x208e83, + 0x200e03, + 0x201a03, + 0x3ad3c7, + 0x238543, + 0x282c07, + 0x2d7f86, + 0x20e583, + 0x207603, + 0x323043, + 0x204c03, + 0x231604, + 0x2d5204, + 0x30e706, + 0x20bd43, + 0x208e83, + 0x201a03, + 0x22d585, + 0x321704, + 0x350503, + 0x39b4c3, + 0x2cbd87, + 0x342d45, + 0x238543, + 0x23cac3, + 0x323043, + 0x28cac3, + 0x208e83, + 0x201a03, + 0x99807, + 0x203402, + 0x28f283, + 0x205403, + 0x39c783, + 0x65e38543, + 0x206902, + 0x23cac3, + 0x2020c3, + 0x323043, + 0x231604, + 0x3797c3, + 0x2e3b03, + 0x28cac3, + 0x21bf84, + 0x6620ea42, + 0x208e83, + 0x201a03, + 0x206683, + 0x22e603, + 0x21a902, + 0x202443, + 0x16fb88, + 0x323043, + 0x10c3, + 0x31f944, + 0x39c783, + 0x20f882, + 0x238543, + 0x240244, + 0x23cac3, + 0x323043, + 0x231604, + 0x255783, + 0x3a2e44, + 0x20f644, + 0x20c0c6, + 0x21bf84, + 0x208e83, + 0x201a03, + 0x221483, + 0x29f806, + 0x4504b, + 0x24386, + 0x3204a, + 0x112d0a, + 0x16fb88, + 0x214f44, + 0x67638543, + 0x39c744, + 0x23cac3, + 0x259004, + 0x323043, + 0x210543, + 0x28cac3, + 0x208e83, + 0x1a3443, + 0x201a03, + 0xbac3, + 0x3381cb, + 0x3af10a, + 0x3bf84c, + 0xe4288, + 0x207102, + 0x20f882, + 0x207b02, + 0x2b13c5, + 0x231604, + 0x204a82, + 0x28cac3, + 0x20f644, + 0x204d42, + 0x200442, + 0x20d2c2, + 0x21a902, + 0x19c783, + 0x35f42, + 0x2b3509, + 0x2f7148, + 0x351689, + 0x2410c9, + 0x350f0a, + 0x26080a, + 0x2127c2, + 0x222902, + 0xf882, + 0x238543, + 0x229682, + 0x24af46, + 0x369d02, + 0x206a42, + 0x37904e, + 0x2213ce, + 0x284b47, + 0x208e07, + 0x2ec8c2, + 0x23cac3, + 0x323043, + 0x200042, + 0x200942, + 0x31603, + 0x23980f, + 0x20b542, + 0x2dd887, + 0x2b4a87, + 0x2b7e87, + 0x31a4cc, + 0x2c448c, + 0x223984, + 0x285b0a, + 0x221302, + 0x209a02, + 0x2c0884, + 0x21f502, + 0x2ca102, + 0x2c46c4, + 0x21a602, + 0x200282, + 0x11a83, + 0x297047, + 0x2beb05, + 0x20d842, + 0x239784, + 0x382842, + 0x2e3008, + 0x208e83, + 0x203488, + 0x203cc2, + 0x223b45, + 0x38dbc6, + 0x201a03, + 0x207082, + 0x2f0ac7, + 0xcb02, + 0x2797c5, + 0x358b85, + 0x209642, + 0x20fd02, + 0x2cf9ca, + 0x26eeca, + 0x21b9c2, + 0x2a4dc4, + 0x2002c2, + 0x3b4ec8, + 0x20d582, + 0x315b08, + 0x30ab47, + 0x30ba09, + 0x203442, + 0x310e45, + 0x3044c5, + 0x21770b, + 0x2d054c, + 0x237348, + 0x321b08, + 0x232ec2, + 0x208a02, + 0x207102, + 0x16fb88, + 0x20f882, + 0x238543, + 0x207b02, + 0x204d42, + 0xe03, + 0x200442, + 0x201a03, + 0x20d2c2, + 0x207102, + 0x68a0f882, + 0x68f23043, + 0x211a83, + 0x204a82, + 0x208e83, + 0x391783, + 0x201a03, + 0x2ef783, + 0x37f186, + 0x1615443, + 0x16fb88, + 0x11205, + 0xae90d, + 0xacc8a, + 0x6e487, + 0x69601e02, + 0x69a00242, + 0x69e00bc2, + 0x6a200702, + 0x6a60b5c2, + 0x6aa01382, + 0x36dc7, + 0x6ae0f882, + 0x6b20c8c2, + 0x6b604842, + 0x6ba04c82, + 0x2213c3, + 0x18ec4, + 0x2298c3, + 0x6be1d882, + 0x6c200182, + 0x53c47, + 0x6c60a442, + 0x6ca00782, + 0x6ce01bc2, + 0x6d205e82, + 0x6d601c82, + 0x6da00942, + 0xc2845, + 0x23ef43, + 0x281a04, + 0x6de1f502, + 0x6e205242, + 0x6e603582, + 0x17d50b, + 0x6ea01fc2, + 0x6f253442, + 0x6f604a82, + 0x6fa0b302, + 0x6fe14702, + 0x70200802, + 0x70614642, + 0x70a745c2, + 0x70e0ea42, + 0x71204802, + 0x71604d42, + 0x71a03382, + 0x71e08682, + 0x7224d382, + 0x1a3284, + 0x35efc3, + 0x72604f82, + 0x72a10902, + 0x72e11542, + 0x73201f02, + 0x73600442, + 0x73a0cb42, + 0x15d647, + 0x73e04102, + 0x74204142, + 0x7460d2c2, + 0x74a21382, + 0x1ad70c, + 0x74e2a202, + 0x75245542, + 0x75605942, + 0x75a06442, + 0x75e0c402, + 0x76260982, + 0x76600202, + 0x76a16fc2, + 0x76e7d302, + 0x772610c2, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x12143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x6ef797c3, + 0x212143, + 0x332244, + 0x2f7046, + 0x2f9a03, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x244949, + 0x235f42, + 0x26c783, + 0x2bcec3, + 0x20fbc5, + 0x2020c3, + 0x3797c3, + 0x212143, + 0x20c0c3, + 0x248d43, + 0x242989, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x3797c3, + 0x212143, + 0x235f42, + 0x235f42, + 0x3797c3, + 0x212143, + 0x77a38543, + 0x23cac3, + 0x20a6c3, + 0x28cac3, + 0x208e83, + 0xe03, + 0x201a03, + 0x16fb88, + 0x20f882, + 0x238543, + 0x208e83, + 0x201a03, + 0x238543, + 0x23cac3, + 0x323043, + 0x28cac3, + 0x208e83, + 0xe03, + 0x201a03, + 0x252044, + 0x20f882, + 0x238543, + 0x345903, + 0x23cac3, + 0x253384, + 0x21b583, + 0x323043, + 0x231604, + 0x255783, + 0x28cac3, + 0x208e83, + 0x201a03, + 0x20c843, + 0x355685, + 0x248d43, + 0x202443, + 0xe03, + 0x20f882, + 0x238543, + 0x3797c3, + 0x208e83, + 0x201a03, + 0x207102, + 0x39c783, + 0x16fb88, + 0x238543, + 0x23cac3, + 0x323043, + 0x23a1c6, + 0x231604, + 0x255783, + 0x21bf84, + 0x208e83, + 0x201a03, + 0x221483, + 0x238543, + 0x23cac3, + 0x208e83, + 0x201a03, + 0x1442047, + 0x238543, + 0x24386, + 0x23cac3, + 0x323043, + 0xe5586, + 0x208e83, + 0x201a03, + 0x31dc48, + 0x321949, + 0x330189, + 0x33bb08, + 0x38fb48, + 0x38fb49, + 0x24558d, + 0x24dd8f, + 0x2f53d0, + 0x35648d, + 0x37210c, + 0x39064b, + 0xba9c8, + 0xac605, + 0x207102, + 0x342b85, + 0x200243, + 0x7ae0f882, + 0x23cac3, + 0x323043, + 0x2d8c47, + 0x263a43, + 0x28cac3, + 0x208e83, + 0x21b543, + 0x217e03, + 0x200e03, + 0x201a03, + 0x3821c6, + 0x205082, + 0x202443, + 0x16fb88, + 0x207102, + 0x39c783, + 0x20f882, + 0x238543, + 0x23cac3, + 0x323043, + 0x231604, + 0x28cac3, + 0x208e83, + 0x201a03, + 0x215443, + 0x106904, + 0x15217c6, + 0x207102, + 0x20f882, + 0x323043, + 0x28cac3, + 0x201a03, +} + +// children is the list of nodes' children, the parent's wildcard bit and the +// parent's node type. If a node has no children then their children index +// will be in the range [0, 6), depending on the wildcard bit and node type. +// +// The layout within the uint32, from MSB to LSB, is: +// [ 1 bits] unused +// [ 1 bits] wildcard bit +// [ 2 bits] node type +// [14 bits] high nodes index (exclusive) of children +// [14 bits] low nodes index (inclusive) of children +var children = [...]uint32{ + 0x0, + 0x10000000, + 0x20000000, + 0x40000000, + 0x50000000, + 0x60000000, + 0x186c615, + 0x187061b, + 0x189461c, + 0x19f0625, + 0x1a0467c, + 0x1a18681, + 0x1a2c686, + 0x1a4c68b, + 0x1a50693, + 0x1a68694, + 0x1a9069a, + 0x1a946a4, + 0x1aac6a5, + 0x1ab06ab, + 0x1ab46ac, + 0x1af06ad, + 0x1af46bc, + 0x21afc6bd, + 0x1b446bf, + 0x1b486d1, + 0x1b686d2, + 0x1b7c6da, + 0x1b806df, + 0x1bb06e0, + 0x1bcc6ec, + 0x1bf46f3, + 0x1c006fd, + 0x1c04700, + 0x1c9c701, + 0x1cb0727, + 0x1cc472c, + 0x1cf4731, + 0x1d0473d, + 0x1d18741, + 0x1d3c746, + 0x1e7474f, + 0x1e7879d, + 0x1ee479e, + 0x1f507b9, + 0x1f687d4, + 0x1f7c7da, + 0x1f847df, + 0x1f987e1, + 0x1f9c7e6, + 0x1fb87e7, + 0x20047ee, + 0x2020801, + 0x2024808, + 0x2028809, + 0x204480a, + 0x2080811, + 0x62084820, + 0x209c821, + 0x20b4827, + 0x20b882d, + 0x20c882e, + 0x2178832, + 0x217c85e, + 0x2218c85f, + 0x22190863, + 0x22194864, + 0x21cc865, + 0x21d0873, + 0x2658874, + 0x226f8996, + 0x226fc9be, + 0x227009bf, + 0x2270c9c0, + 0x227109c3, + 0x2271c9c4, + 0x227209c7, + 0x227249c8, + 0x227289c9, + 0x2272c9ca, + 0x227309cb, + 0x2273c9cc, + 0x227409cf, + 0x2274c9d0, + 0x227509d3, + 0x227549d4, + 0x227589d5, + 0x227649d6, + 0x227689d9, + 0x2276c9da, + 0x227709db, + 0x27749dc, + 0x227789dd, + 0x227849de, + 0x227889e1, + 0x27909e2, + 0x27cc9e4, + 0x227ec9f3, + 0x227f09fb, + 0x227f49fc, + 0x27f89fd, + 0x227fc9fe, + 0x28009ff, + 0x281ca00, + 0x2834a07, + 0x2838a0d, + 0x2848a0e, + 0x2854a12, + 0x2888a15, + 0x288ca22, + 0x28a0a23, + 0x228a8a28, + 0x2968a2a, + 0x2296ca5a, + 0x2974a5b, + 0x2978a5d, + 0x2990a5e, + 0x29a4a64, + 0x29cca69, + 0x29eca73, + 0x2a1ca7b, + 0x2a44a87, + 0x2a48a91, + 0x2a6ca92, + 0x2a70a9b, + 0x2a84a9c, + 0x2a88aa1, + 0x2a8caa2, + 0x2aacaa3, + 0x2ac8aab, + 0x2accab2, + 0x22ad0ab3, + 0x2ad4ab4, + 0x2ad8ab5, + 0x2ae8ab6, + 0x2aecaba, + 0x2b64abb, + 0x2b68ad9, + 0x2b84ada, + 0x2b94ae1, + 0x2ba8ae5, + 0x2bc0aea, + 0x2bd8af0, + 0x2bf0af6, + 0x2bf4afc, + 0x2c0cafd, + 0x2c28b03, + 0x2c48b0a, + 0x2c60b12, + 0x2cc0b18, + 0x2cdcb30, + 0x2ce4b37, + 0x2ce8b39, + 0x2cfcb3a, + 0x2d40b3f, + 0x2dc0b50, + 0x2decb70, + 0x2df0b7b, + 0x2df8b7c, + 0x2e18b7e, + 0x2e1cb86, + 0x2e40b87, + 0x2e48b90, + 0x2e84b92, + 0x2ec8ba1, + 0x2eccbb2, + 0x2f34bb3, + 0x2f38bcd, + 0x22f3cbce, + 0x22f40bcf, + 0x22f50bd0, + 0x22f54bd4, + 0x22f58bd5, + 0x22f5cbd6, + 0x22f60bd7, + 0x2f78bd8, + 0x2f9cbde, + 0x2fbcbe7, + 0x3580bef, + 0x358cd60, + 0x35acd63, + 0x3768d6b, + 0x3838dda, + 0x38a8e0e, + 0x3900e2a, + 0x39e8e40, + 0x3a40e7a, + 0x3a7ce90, + 0x3b78e9f, + 0x3c44ede, + 0x3cdcf11, + 0x3d6cf37, + 0x3dd0f5b, + 0x4008f74, + 0x40c1002, + 0x418d030, + 0x41d9063, + 0x4261076, + 0x429d098, + 0x42ed0a7, + 0x43650bb, + 0x643690d9, + 0x6436d0da, + 0x643710db, + 0x43ed0dc, + 0x44490fb, + 0x44c5112, + 0x453d131, + 0x45bd14f, + 0x462916f, + 0x475518a, + 0x47ad1d5, + 0x647b11eb, + 0x48491ec, + 0x48d1212, + 0x491d234, + 0x4985247, + 0x4a2d261, + 0x4af528b, + 0x4b5d2bd, + 0x4c712d7, + 0x64c7531c, + 0x64c7931d, + 0x4cd531e, + 0x4d31335, + 0x4dc134c, + 0x4e3d370, + 0x4e8138f, + 0x4f653a0, + 0x4f993d9, + 0x4ff93e6, + 0x506d3fe, + 0x50f541b, + 0x513543d, + 0x51a544d, + 0x651a9469, + 0x651ad46a, + 0x251b146b, + 0x51c946c, + 0x51e5472, + 0x5229479, + 0x523948a, + 0x525148e, + 0x52c9494, + 0x52d14b2, + 0x52e54b4, + 0x53014b9, + 0x532d4c0, + 0x53314cb, + 0x53394cc, + 0x534d4ce, + 0x53694d3, + 0x53754da, + 0x537d4dd, + 0x53b94df, + 0x53cd4ee, + 0x53d54f3, + 0x53e14f5, + 0x53e94f8, + 0x540d4fa, + 0x5431503, + 0x544950c, + 0x544d512, + 0x5455513, + 0x5459515, + 0x54c1516, + 0x54c5530, + 0x54e9531, + 0x550d53a, + 0x5529543, + 0x553954a, + 0x554d54e, + 0x5551553, + 0x5559554, + 0x556d556, + 0x557d55b, + 0x558155f, + 0x559d560, + 0x5e2d567, + 0x5e6578b, + 0x5e91799, + 0x5ead7a4, + 0x5ecd7ab, + 0x5eed7b3, + 0x5f317bb, + 0x5f397cc, + 0x25f3d7ce, + 0x25f417cf, + 0x5f497d0, + 0x60c17d2, + 0x260c5830, + 0x260d5831, + 0x260dd835, + 0x260e9837, + 0x60ed83a, + 0x60f183b, + 0x611983c, + 0x6141846, + 0x6145850, + 0x617d851, + 0x619985f, + 0x6cf1866, + 0x6cf5b3c, + 0x6cf9b3d, + 0x26cfdb3e, + 0x6d01b3f, + 0x26d05b40, + 0x6d09b41, + 0x26d15b42, + 0x6d19b45, + 0x6d1db46, + 0x26d21b47, + 0x6d25b48, + 0x26d2db49, + 0x6d31b4b, + 0x6d35b4c, + 0x26d45b4d, + 0x6d49b51, + 0x6d4db52, + 0x6d51b53, + 0x6d55b54, + 0x26d59b55, + 0x6d5db56, + 0x6d61b57, + 0x6d65b58, + 0x6d69b59, + 0x26d71b5a, + 0x6d75b5c, + 0x6d79b5d, + 0x6d7db5e, + 0x26d81b5f, + 0x6d85b60, + 0x26d8db61, + 0x26d91b63, + 0x6dadb64, + 0x6dbdb6b, + 0x6e01b6f, + 0x6e05b80, + 0x6e29b81, + 0x6e2db8a, + 0x6e31b8b, + 0x6fbdb8c, + 0x26fc1bef, + 0x26fc9bf0, + 0x26fcdbf2, + 0x26fd1bf3, + 0x6fd9bf4, + 0x70b5bf6, + 0x270b9c2d, + 0x70bdc2e, + 0x70e9c2f, + 0x70edc3a, + 0x7111c3b, + 0x711dc44, + 0x713dc47, + 0x7141c4f, + 0x7179c50, + 0x7411c5e, + 0x74cdd04, + 0x74e1d33, + 0x7515d38, + 0x7545d45, + 0x7561d51, + 0x7589d58, + 0x75a9d62, + 0x75c5d6a, + 0x75edd71, + 0x75fdd7b, + 0x7601d7f, + 0x7605d80, + 0x7639d81, + 0x7645d8e, + 0x7665d91, + 0x76ddd99, + 0x276e1db7, + 0x7705db8, + 0x7725dc1, + 0x7739dc9, + 0x774ddce, + 0x7751dd3, + 0x7771dd4, + 0x7815ddc, + 0x7831e05, + 0x7855e0c, + 0x785de15, + 0x7869e17, + 0x7871e1a, + 0x7885e1c, + 0x78a5e21, + 0x78b1e29, + 0x78bde2c, + 0x78ede2f, + 0x79c1e3b, + 0x79c5e70, + 0x79d9e71, + 0x79e1e76, + 0x79f9e78, + 0x79fde7e, + 0x7a09e7f, + 0x7a0de82, + 0x7a29e83, + 0x7a65e8a, + 0x7a69e99, + 0x7a89e9a, + 0x7ad9ea2, + 0x7af5eb6, + 0x7b49ebd, + 0x7b4ded2, + 0x7b51ed3, + 0x7b55ed4, + 0x7b99ed5, + 0x7ba9ee6, + 0x7be9eea, + 0x7bedefa, + 0x7c1defb, + 0x7d65f07, + 0x7d8df59, + 0x7db9f63, + 0x7dc5f6e, + 0x7dcdf71, + 0x7eddf73, + 0x7ee9fb7, + 0x7ef5fba, + 0x7f01fbd, + 0x7f0dfc0, + 0x7f19fc3, + 0x7f25fc6, + 0x7f31fc9, + 0x7f3dfcc, + 0x7f49fcf, + 0x7f55fd2, + 0x7f61fd5, + 0x7f6dfd8, + 0x7f79fdb, + 0x7f81fde, + 0x7f8dfe0, + 0x7f99fe3, + 0x7fa5fe6, + 0x7fb1fe9, + 0x7fbdfec, + 0x7fc9fef, + 0x7fd5ff2, + 0x7fe1ff5, + 0x7fedff8, + 0x7ff9ffb, + 0x8005ffe, + 0x8032001, + 0x803e00c, + 0x804a00f, + 0x8056012, + 0x8062015, + 0x806e018, + 0x807601b, + 0x808201d, + 0x808e020, + 0x809a023, + 0x80a6026, + 0x80b2029, + 0x80be02c, + 0x80ca02f, + 0x80d6032, + 0x80e2035, + 0x80ee038, + 0x80fa03b, + 0x810603e, + 0x8112041, + 0x811a044, + 0x8126046, + 0x8132049, + 0x813e04c, + 0x814a04f, + 0x8156052, + 0x8162055, + 0x816e058, + 0x817a05b, + 0x817e05e, + 0x818a05f, + 0x81a6062, + 0x81aa069, + 0x81ba06a, + 0x81d606e, + 0x821a075, + 0x821e086, + 0x8232087, + 0x826608c, + 0x8276099, + 0x829609d, + 0x82ae0a5, + 0x82c60ab, + 0x82ce0b1, + 0x283120b3, + 0x83160c4, + 0x83420c5, + 0x834a0d0, + 0x835e0d2, +} + +// max children 494 (capacity 1023) +// max text offset 28750 (capacity 32767) +// max text length 36 (capacity 63) +// max hi 8407 (capacity 16383) +// max lo 8402 (capacity 16383) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/publicsuffix/table_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/publicsuffix/table_test.go new file mode 100644 index 0000000..6261018 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/publicsuffix/table_test.go @@ -0,0 +1,16756 @@ +// generated by go run gen.go; DO NOT EDIT + +package publicsuffix + +var rules = [...]string{ + "ac", + "com.ac", + "edu.ac", + "gov.ac", + "net.ac", + "mil.ac", + "org.ac", + "ad", + "nom.ad", + "ae", + "co.ae", + "net.ae", + "org.ae", + "sch.ae", + "ac.ae", + "gov.ae", + "mil.ae", + "aero", + "accident-investigation.aero", + "accident-prevention.aero", + "aerobatic.aero", + "aeroclub.aero", + "aerodrome.aero", + "agents.aero", + "aircraft.aero", + "airline.aero", + "airport.aero", + "air-surveillance.aero", + "airtraffic.aero", + "air-traffic-control.aero", + "ambulance.aero", + "amusement.aero", + "association.aero", + "author.aero", + "ballooning.aero", + "broker.aero", + "caa.aero", + "cargo.aero", + "catering.aero", + "certification.aero", + "championship.aero", + "charter.aero", + "civilaviation.aero", + "club.aero", + "conference.aero", + "consultant.aero", + "consulting.aero", + "control.aero", + "council.aero", + "crew.aero", + "design.aero", + "dgca.aero", + "educator.aero", + "emergency.aero", + "engine.aero", + "engineer.aero", + "entertainment.aero", + "equipment.aero", + "exchange.aero", + "express.aero", + "federation.aero", + "flight.aero", + "freight.aero", + "fuel.aero", + "gliding.aero", + "government.aero", + "groundhandling.aero", + "group.aero", + "hanggliding.aero", + "homebuilt.aero", + "insurance.aero", + "journal.aero", + "journalist.aero", + "leasing.aero", + "logistics.aero", + "magazine.aero", + "maintenance.aero", + "media.aero", + "microlight.aero", + "modelling.aero", + "navigation.aero", + "parachuting.aero", + "paragliding.aero", + "passenger-association.aero", + "pilot.aero", + "press.aero", + "production.aero", + "recreation.aero", + "repbody.aero", + "res.aero", + "research.aero", + "rotorcraft.aero", + "safety.aero", + "scientist.aero", + "services.aero", + "show.aero", + "skydiving.aero", + "software.aero", + "student.aero", + "trader.aero", + "trading.aero", + "trainer.aero", + "union.aero", + "workinggroup.aero", + "works.aero", + "af", + "gov.af", + "com.af", + "org.af", + "net.af", + "edu.af", + "ag", + "com.ag", + "org.ag", + "net.ag", + "co.ag", + "nom.ag", + "ai", + "off.ai", + "com.ai", + "net.ai", + "org.ai", + "al", + "com.al", + "edu.al", + "gov.al", + "mil.al", + "net.al", + "org.al", + "am", + "ao", + "ed.ao", + "gv.ao", + "og.ao", + "co.ao", + "pb.ao", + "it.ao", + "aq", + "ar", + "com.ar", + "edu.ar", + "gob.ar", + "gov.ar", + "int.ar", + "mil.ar", + "musica.ar", + "net.ar", + "org.ar", + "tur.ar", + "arpa", + "e164.arpa", + "in-addr.arpa", + "ip6.arpa", + "iris.arpa", + "uri.arpa", + "urn.arpa", + "as", + "gov.as", + "asia", + "at", + "ac.at", + "co.at", + "gv.at", + "or.at", + "au", + "com.au", + "net.au", + "org.au", + "edu.au", + "gov.au", + "asn.au", + "id.au", + "info.au", + "conf.au", + "oz.au", + "act.au", + "nsw.au", + "nt.au", + "qld.au", + "sa.au", + "tas.au", + "vic.au", + "wa.au", + "act.edu.au", + "nsw.edu.au", + "nt.edu.au", + "qld.edu.au", + "sa.edu.au", + "tas.edu.au", + "vic.edu.au", + "wa.edu.au", + "qld.gov.au", + "sa.gov.au", + "tas.gov.au", + "vic.gov.au", + "wa.gov.au", + "aw", + "com.aw", + "ax", + "az", + "com.az", + "net.az", + "int.az", + "gov.az", + "org.az", + "edu.az", + "info.az", + "pp.az", + "mil.az", + "name.az", + "pro.az", + "biz.az", + "ba", + "com.ba", + "edu.ba", + "gov.ba", + "mil.ba", + "net.ba", + "org.ba", + "bb", + "biz.bb", + "co.bb", + "com.bb", + "edu.bb", + "gov.bb", + "info.bb", + "net.bb", + "org.bb", + "store.bb", + "tv.bb", + "*.bd", + "be", + "ac.be", + "bf", + "gov.bf", + "bg", + "a.bg", + "b.bg", + "c.bg", + "d.bg", + "e.bg", + "f.bg", + "g.bg", + "h.bg", + "i.bg", + "j.bg", + "k.bg", + "l.bg", + "m.bg", + "n.bg", + "o.bg", + "p.bg", + "q.bg", + "r.bg", + "s.bg", + "t.bg", + "u.bg", + "v.bg", + "w.bg", + "x.bg", + "y.bg", + "z.bg", + "0.bg", + "1.bg", + "2.bg", + "3.bg", + "4.bg", + "5.bg", + "6.bg", + "7.bg", + "8.bg", + "9.bg", + "bh", + "com.bh", + "edu.bh", + "net.bh", + "org.bh", + "gov.bh", + "bi", + "co.bi", + "com.bi", + "edu.bi", + "or.bi", + "org.bi", + "biz", + "bj", + "asso.bj", + "barreau.bj", + "gouv.bj", + "bm", + "com.bm", + "edu.bm", + "gov.bm", + "net.bm", + "org.bm", + "*.bn", + "bo", + "com.bo", + "edu.bo", + "gov.bo", + "gob.bo", + "int.bo", + "org.bo", + "net.bo", + "mil.bo", + "tv.bo", + "br", + "adm.br", + "adv.br", + "agr.br", + "am.br", + "arq.br", + "art.br", + "ato.br", + "b.br", + "belem.br", + "bio.br", + "blog.br", + "bmd.br", + "cim.br", + "cng.br", + "cnt.br", + "com.br", + "coop.br", + "cri.br", + "def.br", + "ecn.br", + "eco.br", + "edu.br", + "emp.br", + "eng.br", + "esp.br", + "etc.br", + "eti.br", + "far.br", + "flog.br", + "floripa.br", + "fm.br", + "fnd.br", + "fot.br", + "fst.br", + "g12.br", + "ggf.br", + "gov.br", + "ac.gov.br", + "al.gov.br", + "am.gov.br", + "ap.gov.br", + "ba.gov.br", + "ce.gov.br", + "df.gov.br", + "es.gov.br", + "go.gov.br", + "ma.gov.br", + "mg.gov.br", + "ms.gov.br", + "mt.gov.br", + "pa.gov.br", + "pb.gov.br", + "pe.gov.br", + "pi.gov.br", + "pr.gov.br", + "rj.gov.br", + "rn.gov.br", + "ro.gov.br", + "rr.gov.br", + "rs.gov.br", + "sc.gov.br", + "se.gov.br", + "sp.gov.br", + "to.gov.br", + "imb.br", + "ind.br", + "inf.br", + "jampa.br", + "jor.br", + "jus.br", + "leg.br", + "lel.br", + "mat.br", + "med.br", + "mil.br", + "mp.br", + "mus.br", + "net.br", + "*.nom.br", + "not.br", + "ntr.br", + "odo.br", + "org.br", + "poa.br", + "ppg.br", + "pro.br", + "psc.br", + "psi.br", + "qsl.br", + "radio.br", + "rec.br", + "recife.br", + "slg.br", + "srv.br", + "taxi.br", + "teo.br", + "tmp.br", + "trd.br", + "tur.br", + "tv.br", + "vet.br", + "vix.br", + "vlog.br", + "wiki.br", + "zlg.br", + "bs", + "com.bs", + "net.bs", + "org.bs", + "edu.bs", + "gov.bs", + "bt", + "com.bt", + "edu.bt", + "gov.bt", + "net.bt", + "org.bt", + "bv", + "bw", + "co.bw", + "org.bw", + "by", + "gov.by", + "mil.by", + "com.by", + "of.by", + "bz", + "com.bz", + "net.bz", + "org.bz", + "edu.bz", + "gov.bz", + "ca", + "ab.ca", + "bc.ca", + "mb.ca", + "nb.ca", + "nf.ca", + "nl.ca", + "ns.ca", + "nt.ca", + "nu.ca", + "on.ca", + "pe.ca", + "qc.ca", + "sk.ca", + "yk.ca", + "gc.ca", + "cat", + "cc", + "cd", + "gov.cd", + "cf", + "cg", + "ch", + "ci", + "org.ci", + "or.ci", + "com.ci", + "co.ci", + "edu.ci", + "ed.ci", + "ac.ci", + "net.ci", + "go.ci", + "asso.ci", + "xn--aroport-bya.ci", + "int.ci", + "presse.ci", + "md.ci", + "gouv.ci", + "*.ck", + "!www.ck", + "cl", + "gov.cl", + "gob.cl", + "co.cl", + "mil.cl", + "cm", + "co.cm", + "com.cm", + "gov.cm", + "net.cm", + "cn", + "ac.cn", + "com.cn", + "edu.cn", + "gov.cn", + "net.cn", + "org.cn", + "mil.cn", + "xn--55qx5d.cn", + "xn--io0a7i.cn", + "xn--od0alg.cn", + "ah.cn", + "bj.cn", + "cq.cn", + "fj.cn", + "gd.cn", + "gs.cn", + "gz.cn", + "gx.cn", + "ha.cn", + "hb.cn", + "he.cn", + "hi.cn", + "hl.cn", + "hn.cn", + "jl.cn", + "js.cn", + "jx.cn", + "ln.cn", + "nm.cn", + "nx.cn", + "qh.cn", + "sc.cn", + "sd.cn", + "sh.cn", + "sn.cn", + "sx.cn", + "tj.cn", + "xj.cn", + "xz.cn", + "yn.cn", + "zj.cn", + "hk.cn", + "mo.cn", + "tw.cn", + "co", + "arts.co", + "com.co", + "edu.co", + "firm.co", + "gov.co", + "info.co", + "int.co", + "mil.co", + "net.co", + "nom.co", + "org.co", + "rec.co", + "web.co", + "com", + "coop", + "cr", + "ac.cr", + "co.cr", + "ed.cr", + "fi.cr", + "go.cr", + "or.cr", + "sa.cr", + "cu", + "com.cu", + "edu.cu", + "org.cu", + "net.cu", + "gov.cu", + "inf.cu", + "cv", + "cw", + "com.cw", + "edu.cw", + "net.cw", + "org.cw", + "cx", + "gov.cx", + "cy", + "ac.cy", + "biz.cy", + "com.cy", + "ekloges.cy", + "gov.cy", + "ltd.cy", + "name.cy", + "net.cy", + "org.cy", + "parliament.cy", + "press.cy", + "pro.cy", + "tm.cy", + "cz", + "de", + "dj", + "dk", + "dm", + "com.dm", + "net.dm", + "org.dm", + "edu.dm", + "gov.dm", + "do", + "art.do", + "com.do", + "edu.do", + "gob.do", + "gov.do", + "mil.do", + "net.do", + "org.do", + "sld.do", + "web.do", + "dz", + "com.dz", + "org.dz", + "net.dz", + "gov.dz", + "edu.dz", + "asso.dz", + "pol.dz", + "art.dz", + "ec", + "com.ec", + "info.ec", + "net.ec", + "fin.ec", + "k12.ec", + "med.ec", + "pro.ec", + "org.ec", + "edu.ec", + "gov.ec", + "gob.ec", + "mil.ec", + "edu", + "ee", + "edu.ee", + "gov.ee", + "riik.ee", + "lib.ee", + "med.ee", + "com.ee", + "pri.ee", + "aip.ee", + "org.ee", + "fie.ee", + "eg", + "com.eg", + "edu.eg", + "eun.eg", + "gov.eg", + "mil.eg", + "name.eg", + "net.eg", + "org.eg", + "sci.eg", + "*.er", + "es", + "com.es", + "nom.es", + "org.es", + "gob.es", + "edu.es", + "et", + "com.et", + "gov.et", + "org.et", + "edu.et", + "biz.et", + "name.et", + "info.et", + "net.et", + "eu", + "fi", + "aland.fi", + "*.fj", + "*.fk", + "fm", + "fo", + "fr", + "com.fr", + "asso.fr", + "nom.fr", + "prd.fr", + "presse.fr", + "tm.fr", + "aeroport.fr", + "assedic.fr", + "avocat.fr", + "avoues.fr", + "cci.fr", + "chambagri.fr", + "chirurgiens-dentistes.fr", + "experts-comptables.fr", + "geometre-expert.fr", + "gouv.fr", + "greta.fr", + "huissier-justice.fr", + "medecin.fr", + "notaires.fr", + "pharmacien.fr", + "port.fr", + "veterinaire.fr", + "ga", + "gb", + "gd", + "ge", + "com.ge", + "edu.ge", + "gov.ge", + "org.ge", + "mil.ge", + "net.ge", + "pvt.ge", + "gf", + "gg", + "co.gg", + "net.gg", + "org.gg", + "gh", + "com.gh", + "edu.gh", + "gov.gh", + "org.gh", + "mil.gh", + "gi", + "com.gi", + "ltd.gi", + "gov.gi", + "mod.gi", + "edu.gi", + "org.gi", + "gl", + "co.gl", + "com.gl", + "edu.gl", + "net.gl", + "org.gl", + "gm", + "gn", + "ac.gn", + "com.gn", + "edu.gn", + "gov.gn", + "org.gn", + "net.gn", + "gov", + "gp", + "com.gp", + "net.gp", + "mobi.gp", + "edu.gp", + "org.gp", + "asso.gp", + "gq", + "gr", + "com.gr", + "edu.gr", + "net.gr", + "org.gr", + "gov.gr", + "gs", + "gt", + "com.gt", + "edu.gt", + "gob.gt", + "ind.gt", + "mil.gt", + "net.gt", + "org.gt", + "*.gu", + "gw", + "gy", + "co.gy", + "com.gy", + "edu.gy", + "gov.gy", + "net.gy", + "org.gy", + "hk", + "com.hk", + "edu.hk", + "gov.hk", + "idv.hk", + "net.hk", + "org.hk", + "xn--55qx5d.hk", + "xn--wcvs22d.hk", + "xn--lcvr32d.hk", + "xn--mxtq1m.hk", + "xn--gmqw5a.hk", + "xn--ciqpn.hk", + "xn--gmq050i.hk", + "xn--zf0avx.hk", + "xn--io0a7i.hk", + "xn--mk0axi.hk", + "xn--od0alg.hk", + "xn--od0aq3b.hk", + "xn--tn0ag.hk", + "xn--uc0atv.hk", + "xn--uc0ay4a.hk", + "hm", + "hn", + "com.hn", + "edu.hn", + "org.hn", + "net.hn", + "mil.hn", + "gob.hn", + "hr", + "iz.hr", + "from.hr", + "name.hr", + "com.hr", + "ht", + "com.ht", + "shop.ht", + "firm.ht", + "info.ht", + "adult.ht", + "net.ht", + "pro.ht", + "org.ht", + "med.ht", + "art.ht", + "coop.ht", + "pol.ht", + "asso.ht", + "edu.ht", + "rel.ht", + "gouv.ht", + "perso.ht", + "hu", + "co.hu", + "info.hu", + "org.hu", + "priv.hu", + "sport.hu", + "tm.hu", + "2000.hu", + "agrar.hu", + "bolt.hu", + "casino.hu", + "city.hu", + "erotica.hu", + "erotika.hu", + "film.hu", + "forum.hu", + "games.hu", + "hotel.hu", + "ingatlan.hu", + "jogasz.hu", + "konyvelo.hu", + "lakas.hu", + "media.hu", + "news.hu", + "reklam.hu", + "sex.hu", + "shop.hu", + "suli.hu", + "szex.hu", + "tozsde.hu", + "utazas.hu", + "video.hu", + "id", + "ac.id", + "biz.id", + "co.id", + "desa.id", + "go.id", + "mil.id", + "my.id", + "net.id", + "or.id", + "sch.id", + "web.id", + "ie", + "gov.ie", + "il", + "ac.il", + "co.il", + "gov.il", + "idf.il", + "k12.il", + "muni.il", + "net.il", + "org.il", + "im", + "ac.im", + "co.im", + "com.im", + "ltd.co.im", + "net.im", + "org.im", + "plc.co.im", + "tt.im", + "tv.im", + "in", + "co.in", + "firm.in", + "net.in", + "org.in", + "gen.in", + "ind.in", + "nic.in", + "ac.in", + "edu.in", + "res.in", + "gov.in", + "mil.in", + "info", + "int", + "eu.int", + "io", + "com.io", + "iq", + "gov.iq", + "edu.iq", + "mil.iq", + "com.iq", + "org.iq", + "net.iq", + "ir", + "ac.ir", + "co.ir", + "gov.ir", + "id.ir", + "net.ir", + "org.ir", + "sch.ir", + "xn--mgba3a4f16a.ir", + "xn--mgba3a4fra.ir", + "is", + "net.is", + "com.is", + "edu.is", + "gov.is", + "org.is", + "int.is", + "it", + "gov.it", + "edu.it", + "abr.it", + "abruzzo.it", + "aosta-valley.it", + "aostavalley.it", + "bas.it", + "basilicata.it", + "cal.it", + "calabria.it", + "cam.it", + "campania.it", + "emilia-romagna.it", + "emiliaromagna.it", + "emr.it", + "friuli-v-giulia.it", + "friuli-ve-giulia.it", + "friuli-vegiulia.it", + "friuli-venezia-giulia.it", + "friuli-veneziagiulia.it", + "friuli-vgiulia.it", + "friuliv-giulia.it", + "friulive-giulia.it", + "friulivegiulia.it", + "friulivenezia-giulia.it", + "friuliveneziagiulia.it", + "friulivgiulia.it", + "fvg.it", + "laz.it", + "lazio.it", + "lig.it", + "liguria.it", + "lom.it", + "lombardia.it", + "lombardy.it", + "lucania.it", + "mar.it", + "marche.it", + "mol.it", + "molise.it", + "piedmont.it", + "piemonte.it", + "pmn.it", + "pug.it", + "puglia.it", + "sar.it", + "sardegna.it", + "sardinia.it", + "sic.it", + "sicilia.it", + "sicily.it", + "taa.it", + "tos.it", + "toscana.it", + "trentino-a-adige.it", + "trentino-aadige.it", + "trentino-alto-adige.it", + "trentino-altoadige.it", + "trentino-s-tirol.it", + "trentino-stirol.it", + "trentino-sud-tirol.it", + "trentino-sudtirol.it", + "trentino-sued-tirol.it", + "trentino-suedtirol.it", + "trentinoa-adige.it", + "trentinoaadige.it", + "trentinoalto-adige.it", + "trentinoaltoadige.it", + "trentinos-tirol.it", + "trentinostirol.it", + "trentinosud-tirol.it", + "trentinosudtirol.it", + "trentinosued-tirol.it", + "trentinosuedtirol.it", + "tuscany.it", + "umb.it", + "umbria.it", + "val-d-aosta.it", + "val-daosta.it", + "vald-aosta.it", + "valdaosta.it", + "valle-aosta.it", + "valle-d-aosta.it", + "valle-daosta.it", + "valleaosta.it", + "valled-aosta.it", + "valledaosta.it", + "vallee-aoste.it", + "valleeaoste.it", + "vao.it", + "vda.it", + "ven.it", + "veneto.it", + "ag.it", + "agrigento.it", + "al.it", + "alessandria.it", + "alto-adige.it", + "altoadige.it", + "an.it", + "ancona.it", + "andria-barletta-trani.it", + "andria-trani-barletta.it", + "andriabarlettatrani.it", + "andriatranibarletta.it", + "ao.it", + "aosta.it", + "aoste.it", + "ap.it", + "aq.it", + "aquila.it", + "ar.it", + "arezzo.it", + "ascoli-piceno.it", + "ascolipiceno.it", + "asti.it", + "at.it", + "av.it", + "avellino.it", + "ba.it", + "balsan.it", + "bari.it", + "barletta-trani-andria.it", + "barlettatraniandria.it", + "belluno.it", + "benevento.it", + "bergamo.it", + "bg.it", + "bi.it", + "biella.it", + "bl.it", + "bn.it", + "bo.it", + "bologna.it", + "bolzano.it", + "bozen.it", + "br.it", + "brescia.it", + "brindisi.it", + "bs.it", + "bt.it", + "bz.it", + "ca.it", + "cagliari.it", + "caltanissetta.it", + "campidano-medio.it", + "campidanomedio.it", + "campobasso.it", + "carbonia-iglesias.it", + "carboniaiglesias.it", + "carrara-massa.it", + "carraramassa.it", + "caserta.it", + "catania.it", + "catanzaro.it", + "cb.it", + "ce.it", + "cesena-forli.it", + "cesenaforli.it", + "ch.it", + "chieti.it", + "ci.it", + "cl.it", + "cn.it", + "co.it", + "como.it", + "cosenza.it", + "cr.it", + "cremona.it", + "crotone.it", + "cs.it", + "ct.it", + "cuneo.it", + "cz.it", + "dell-ogliastra.it", + "dellogliastra.it", + "en.it", + "enna.it", + "fc.it", + "fe.it", + "fermo.it", + "ferrara.it", + "fg.it", + "fi.it", + "firenze.it", + "florence.it", + "fm.it", + "foggia.it", + "forli-cesena.it", + "forlicesena.it", + "fr.it", + "frosinone.it", + "ge.it", + "genoa.it", + "genova.it", + "go.it", + "gorizia.it", + "gr.it", + "grosseto.it", + "iglesias-carbonia.it", + "iglesiascarbonia.it", + "im.it", + "imperia.it", + "is.it", + "isernia.it", + "kr.it", + "la-spezia.it", + "laquila.it", + "laspezia.it", + "latina.it", + "lc.it", + "le.it", + "lecce.it", + "lecco.it", + "li.it", + "livorno.it", + "lo.it", + "lodi.it", + "lt.it", + "lu.it", + "lucca.it", + "macerata.it", + "mantova.it", + "massa-carrara.it", + "massacarrara.it", + "matera.it", + "mb.it", + "mc.it", + "me.it", + "medio-campidano.it", + "mediocampidano.it", + "messina.it", + "mi.it", + "milan.it", + "milano.it", + "mn.it", + "mo.it", + "modena.it", + "monza-brianza.it", + "monza-e-della-brianza.it", + "monza.it", + "monzabrianza.it", + "monzaebrianza.it", + "monzaedellabrianza.it", + "ms.it", + "mt.it", + "na.it", + "naples.it", + "napoli.it", + "no.it", + "novara.it", + "nu.it", + "nuoro.it", + "og.it", + "ogliastra.it", + "olbia-tempio.it", + "olbiatempio.it", + "or.it", + "oristano.it", + "ot.it", + "pa.it", + "padova.it", + "padua.it", + "palermo.it", + "parma.it", + "pavia.it", + "pc.it", + "pd.it", + "pe.it", + "perugia.it", + "pesaro-urbino.it", + "pesarourbino.it", + "pescara.it", + "pg.it", + "pi.it", + "piacenza.it", + "pisa.it", + "pistoia.it", + "pn.it", + "po.it", + "pordenone.it", + "potenza.it", + "pr.it", + "prato.it", + "pt.it", + "pu.it", + "pv.it", + "pz.it", + "ra.it", + "ragusa.it", + "ravenna.it", + "rc.it", + "re.it", + "reggio-calabria.it", + "reggio-emilia.it", + "reggiocalabria.it", + "reggioemilia.it", + "rg.it", + "ri.it", + "rieti.it", + "rimini.it", + "rm.it", + "rn.it", + "ro.it", + "roma.it", + "rome.it", + "rovigo.it", + "sa.it", + "salerno.it", + "sassari.it", + "savona.it", + "si.it", + "siena.it", + "siracusa.it", + "so.it", + "sondrio.it", + "sp.it", + "sr.it", + "ss.it", + "suedtirol.it", + "sv.it", + "ta.it", + "taranto.it", + "te.it", + "tempio-olbia.it", + "tempioolbia.it", + "teramo.it", + "terni.it", + "tn.it", + "to.it", + "torino.it", + "tp.it", + "tr.it", + "trani-andria-barletta.it", + "trani-barletta-andria.it", + "traniandriabarletta.it", + "tranibarlettaandria.it", + "trapani.it", + "trentino.it", + "trento.it", + "treviso.it", + "trieste.it", + "ts.it", + "turin.it", + "tv.it", + "ud.it", + "udine.it", + "urbino-pesaro.it", + "urbinopesaro.it", + "va.it", + "varese.it", + "vb.it", + "vc.it", + "ve.it", + "venezia.it", + "venice.it", + "verbania.it", + "vercelli.it", + "verona.it", + "vi.it", + "vibo-valentia.it", + "vibovalentia.it", + "vicenza.it", + "viterbo.it", + "vr.it", + "vs.it", + "vt.it", + "vv.it", + "je", + "co.je", + "net.je", + "org.je", + "*.jm", + "jo", + "com.jo", + "org.jo", + "net.jo", + "edu.jo", + "sch.jo", + "gov.jo", + "mil.jo", + "name.jo", + "jobs", + "jp", + "ac.jp", + "ad.jp", + "co.jp", + "ed.jp", + "go.jp", + "gr.jp", + "lg.jp", + "ne.jp", + "or.jp", + "aichi.jp", + "akita.jp", + "aomori.jp", + "chiba.jp", + "ehime.jp", + "fukui.jp", + "fukuoka.jp", + "fukushima.jp", + "gifu.jp", + "gunma.jp", + "hiroshima.jp", + "hokkaido.jp", + "hyogo.jp", + "ibaraki.jp", + "ishikawa.jp", + "iwate.jp", + "kagawa.jp", + "kagoshima.jp", + "kanagawa.jp", + "kochi.jp", + "kumamoto.jp", + "kyoto.jp", + "mie.jp", + "miyagi.jp", + "miyazaki.jp", + "nagano.jp", + "nagasaki.jp", + "nara.jp", + "niigata.jp", + "oita.jp", + "okayama.jp", + "okinawa.jp", + "osaka.jp", + "saga.jp", + "saitama.jp", + "shiga.jp", + "shimane.jp", + "shizuoka.jp", + "tochigi.jp", + "tokushima.jp", + "tokyo.jp", + "tottori.jp", + "toyama.jp", + "wakayama.jp", + "yamagata.jp", + "yamaguchi.jp", + "yamanashi.jp", + "xn--4pvxs.jp", + "xn--vgu402c.jp", + "xn--c3s14m.jp", + "xn--f6qx53a.jp", + "xn--8pvr4u.jp", + "xn--uist22h.jp", + "xn--djrs72d6uy.jp", + "xn--mkru45i.jp", + "xn--0trq7p7nn.jp", + "xn--8ltr62k.jp", + "xn--2m4a15e.jp", + "xn--efvn9s.jp", + "xn--32vp30h.jp", + "xn--4it797k.jp", + "xn--1lqs71d.jp", + "xn--5rtp49c.jp", + "xn--5js045d.jp", + "xn--ehqz56n.jp", + "xn--1lqs03n.jp", + "xn--qqqt11m.jp", + "xn--kbrq7o.jp", + "xn--pssu33l.jp", + "xn--ntsq17g.jp", + "xn--uisz3g.jp", + "xn--6btw5a.jp", + "xn--1ctwo.jp", + "xn--6orx2r.jp", + "xn--rht61e.jp", + "xn--rht27z.jp", + "xn--djty4k.jp", + "xn--nit225k.jp", + "xn--rht3d.jp", + "xn--klty5x.jp", + "xn--kltx9a.jp", + "xn--kltp7d.jp", + "xn--uuwu58a.jp", + "xn--zbx025d.jp", + "xn--ntso0iqx3a.jp", + "xn--elqq16h.jp", + "xn--4it168d.jp", + "xn--klt787d.jp", + "xn--rny31h.jp", + "xn--7t0a264c.jp", + "xn--5rtq34k.jp", + "xn--k7yn95e.jp", + "xn--tor131o.jp", + "xn--d5qv7z876c.jp", + "*.kawasaki.jp", + "*.kitakyushu.jp", + "*.kobe.jp", + "*.nagoya.jp", + "*.sapporo.jp", + "*.sendai.jp", + "*.yokohama.jp", + "!city.kawasaki.jp", + "!city.kitakyushu.jp", + "!city.kobe.jp", + "!city.nagoya.jp", + "!city.sapporo.jp", + "!city.sendai.jp", + "!city.yokohama.jp", + "aisai.aichi.jp", + "ama.aichi.jp", + "anjo.aichi.jp", + "asuke.aichi.jp", + "chiryu.aichi.jp", + "chita.aichi.jp", + "fuso.aichi.jp", + "gamagori.aichi.jp", + "handa.aichi.jp", + "hazu.aichi.jp", + "hekinan.aichi.jp", + "higashiura.aichi.jp", + "ichinomiya.aichi.jp", + "inazawa.aichi.jp", + "inuyama.aichi.jp", + "isshiki.aichi.jp", + "iwakura.aichi.jp", + "kanie.aichi.jp", + "kariya.aichi.jp", + "kasugai.aichi.jp", + "kira.aichi.jp", + "kiyosu.aichi.jp", + "komaki.aichi.jp", + "konan.aichi.jp", + "kota.aichi.jp", + "mihama.aichi.jp", + "miyoshi.aichi.jp", + "nishio.aichi.jp", + "nisshin.aichi.jp", + "obu.aichi.jp", + "oguchi.aichi.jp", + "oharu.aichi.jp", + "okazaki.aichi.jp", + "owariasahi.aichi.jp", + "seto.aichi.jp", + "shikatsu.aichi.jp", + "shinshiro.aichi.jp", + "shitara.aichi.jp", + "tahara.aichi.jp", + "takahama.aichi.jp", + "tobishima.aichi.jp", + "toei.aichi.jp", + "togo.aichi.jp", + "tokai.aichi.jp", + "tokoname.aichi.jp", + "toyoake.aichi.jp", + "toyohashi.aichi.jp", + "toyokawa.aichi.jp", + "toyone.aichi.jp", + "toyota.aichi.jp", + "tsushima.aichi.jp", + "yatomi.aichi.jp", + "akita.akita.jp", + "daisen.akita.jp", + "fujisato.akita.jp", + "gojome.akita.jp", + "hachirogata.akita.jp", + "happou.akita.jp", + "higashinaruse.akita.jp", + "honjo.akita.jp", + "honjyo.akita.jp", + "ikawa.akita.jp", + "kamikoani.akita.jp", + "kamioka.akita.jp", + "katagami.akita.jp", + "kazuno.akita.jp", + "kitaakita.akita.jp", + "kosaka.akita.jp", + "kyowa.akita.jp", + "misato.akita.jp", + "mitane.akita.jp", + "moriyoshi.akita.jp", + "nikaho.akita.jp", + "noshiro.akita.jp", + "odate.akita.jp", + "oga.akita.jp", + "ogata.akita.jp", + "semboku.akita.jp", + "yokote.akita.jp", + "yurihonjo.akita.jp", + "aomori.aomori.jp", + "gonohe.aomori.jp", + "hachinohe.aomori.jp", + "hashikami.aomori.jp", + "hiranai.aomori.jp", + "hirosaki.aomori.jp", + "itayanagi.aomori.jp", + "kuroishi.aomori.jp", + "misawa.aomori.jp", + "mutsu.aomori.jp", + "nakadomari.aomori.jp", + "noheji.aomori.jp", + "oirase.aomori.jp", + "owani.aomori.jp", + "rokunohe.aomori.jp", + "sannohe.aomori.jp", + "shichinohe.aomori.jp", + "shingo.aomori.jp", + "takko.aomori.jp", + "towada.aomori.jp", + "tsugaru.aomori.jp", + "tsuruta.aomori.jp", + "abiko.chiba.jp", + "asahi.chiba.jp", + "chonan.chiba.jp", + "chosei.chiba.jp", + "choshi.chiba.jp", + "chuo.chiba.jp", + "funabashi.chiba.jp", + "futtsu.chiba.jp", + "hanamigawa.chiba.jp", + "ichihara.chiba.jp", + "ichikawa.chiba.jp", + "ichinomiya.chiba.jp", + "inzai.chiba.jp", + "isumi.chiba.jp", + "kamagaya.chiba.jp", + "kamogawa.chiba.jp", + "kashiwa.chiba.jp", + "katori.chiba.jp", + "katsuura.chiba.jp", + "kimitsu.chiba.jp", + "kisarazu.chiba.jp", + "kozaki.chiba.jp", + "kujukuri.chiba.jp", + "kyonan.chiba.jp", + "matsudo.chiba.jp", + "midori.chiba.jp", + "mihama.chiba.jp", + "minamiboso.chiba.jp", + "mobara.chiba.jp", + "mutsuzawa.chiba.jp", + "nagara.chiba.jp", + "nagareyama.chiba.jp", + "narashino.chiba.jp", + "narita.chiba.jp", + "noda.chiba.jp", + "oamishirasato.chiba.jp", + "omigawa.chiba.jp", + "onjuku.chiba.jp", + "otaki.chiba.jp", + "sakae.chiba.jp", + "sakura.chiba.jp", + "shimofusa.chiba.jp", + "shirako.chiba.jp", + "shiroi.chiba.jp", + "shisui.chiba.jp", + "sodegaura.chiba.jp", + "sosa.chiba.jp", + "tako.chiba.jp", + "tateyama.chiba.jp", + "togane.chiba.jp", + "tohnosho.chiba.jp", + "tomisato.chiba.jp", + "urayasu.chiba.jp", + "yachimata.chiba.jp", + "yachiyo.chiba.jp", + "yokaichiba.chiba.jp", + "yokoshibahikari.chiba.jp", + "yotsukaido.chiba.jp", + "ainan.ehime.jp", + "honai.ehime.jp", + "ikata.ehime.jp", + "imabari.ehime.jp", + "iyo.ehime.jp", + "kamijima.ehime.jp", + "kihoku.ehime.jp", + "kumakogen.ehime.jp", + "masaki.ehime.jp", + "matsuno.ehime.jp", + "matsuyama.ehime.jp", + "namikata.ehime.jp", + "niihama.ehime.jp", + "ozu.ehime.jp", + "saijo.ehime.jp", + "seiyo.ehime.jp", + "shikokuchuo.ehime.jp", + "tobe.ehime.jp", + "toon.ehime.jp", + "uchiko.ehime.jp", + "uwajima.ehime.jp", + "yawatahama.ehime.jp", + "echizen.fukui.jp", + "eiheiji.fukui.jp", + "fukui.fukui.jp", + "ikeda.fukui.jp", + "katsuyama.fukui.jp", + "mihama.fukui.jp", + "minamiechizen.fukui.jp", + "obama.fukui.jp", + "ohi.fukui.jp", + "ono.fukui.jp", + "sabae.fukui.jp", + "sakai.fukui.jp", + "takahama.fukui.jp", + "tsuruga.fukui.jp", + "wakasa.fukui.jp", + "ashiya.fukuoka.jp", + "buzen.fukuoka.jp", + "chikugo.fukuoka.jp", + "chikuho.fukuoka.jp", + "chikujo.fukuoka.jp", + "chikushino.fukuoka.jp", + "chikuzen.fukuoka.jp", + "chuo.fukuoka.jp", + "dazaifu.fukuoka.jp", + "fukuchi.fukuoka.jp", + "hakata.fukuoka.jp", + "higashi.fukuoka.jp", + "hirokawa.fukuoka.jp", + "hisayama.fukuoka.jp", + "iizuka.fukuoka.jp", + "inatsuki.fukuoka.jp", + "kaho.fukuoka.jp", + "kasuga.fukuoka.jp", + "kasuya.fukuoka.jp", + "kawara.fukuoka.jp", + "keisen.fukuoka.jp", + "koga.fukuoka.jp", + "kurate.fukuoka.jp", + "kurogi.fukuoka.jp", + "kurume.fukuoka.jp", + "minami.fukuoka.jp", + "miyako.fukuoka.jp", + "miyama.fukuoka.jp", + "miyawaka.fukuoka.jp", + "mizumaki.fukuoka.jp", + "munakata.fukuoka.jp", + "nakagawa.fukuoka.jp", + "nakama.fukuoka.jp", + "nishi.fukuoka.jp", + "nogata.fukuoka.jp", + "ogori.fukuoka.jp", + "okagaki.fukuoka.jp", + "okawa.fukuoka.jp", + "oki.fukuoka.jp", + "omuta.fukuoka.jp", + "onga.fukuoka.jp", + "onojo.fukuoka.jp", + "oto.fukuoka.jp", + "saigawa.fukuoka.jp", + "sasaguri.fukuoka.jp", + "shingu.fukuoka.jp", + "shinyoshitomi.fukuoka.jp", + "shonai.fukuoka.jp", + "soeda.fukuoka.jp", + "sue.fukuoka.jp", + "tachiarai.fukuoka.jp", + "tagawa.fukuoka.jp", + "takata.fukuoka.jp", + "toho.fukuoka.jp", + "toyotsu.fukuoka.jp", + "tsuiki.fukuoka.jp", + "ukiha.fukuoka.jp", + "umi.fukuoka.jp", + "usui.fukuoka.jp", + "yamada.fukuoka.jp", + "yame.fukuoka.jp", + "yanagawa.fukuoka.jp", + "yukuhashi.fukuoka.jp", + "aizubange.fukushima.jp", + "aizumisato.fukushima.jp", + "aizuwakamatsu.fukushima.jp", + "asakawa.fukushima.jp", + "bandai.fukushima.jp", + "date.fukushima.jp", + "fukushima.fukushima.jp", + "furudono.fukushima.jp", + "futaba.fukushima.jp", + "hanawa.fukushima.jp", + "higashi.fukushima.jp", + "hirata.fukushima.jp", + "hirono.fukushima.jp", + "iitate.fukushima.jp", + "inawashiro.fukushima.jp", + "ishikawa.fukushima.jp", + "iwaki.fukushima.jp", + "izumizaki.fukushima.jp", + "kagamiishi.fukushima.jp", + "kaneyama.fukushima.jp", + "kawamata.fukushima.jp", + "kitakata.fukushima.jp", + "kitashiobara.fukushima.jp", + "koori.fukushima.jp", + "koriyama.fukushima.jp", + "kunimi.fukushima.jp", + "miharu.fukushima.jp", + "mishima.fukushima.jp", + "namie.fukushima.jp", + "nango.fukushima.jp", + "nishiaizu.fukushima.jp", + "nishigo.fukushima.jp", + "okuma.fukushima.jp", + "omotego.fukushima.jp", + "ono.fukushima.jp", + "otama.fukushima.jp", + "samegawa.fukushima.jp", + "shimogo.fukushima.jp", + "shirakawa.fukushima.jp", + "showa.fukushima.jp", + "soma.fukushima.jp", + "sukagawa.fukushima.jp", + "taishin.fukushima.jp", + "tamakawa.fukushima.jp", + "tanagura.fukushima.jp", + "tenei.fukushima.jp", + "yabuki.fukushima.jp", + "yamato.fukushima.jp", + "yamatsuri.fukushima.jp", + "yanaizu.fukushima.jp", + "yugawa.fukushima.jp", + "anpachi.gifu.jp", + "ena.gifu.jp", + "gifu.gifu.jp", + "ginan.gifu.jp", + "godo.gifu.jp", + "gujo.gifu.jp", + "hashima.gifu.jp", + "hichiso.gifu.jp", + "hida.gifu.jp", + "higashishirakawa.gifu.jp", + "ibigawa.gifu.jp", + "ikeda.gifu.jp", + "kakamigahara.gifu.jp", + "kani.gifu.jp", + "kasahara.gifu.jp", + "kasamatsu.gifu.jp", + "kawaue.gifu.jp", + "kitagata.gifu.jp", + "mino.gifu.jp", + "minokamo.gifu.jp", + "mitake.gifu.jp", + "mizunami.gifu.jp", + "motosu.gifu.jp", + "nakatsugawa.gifu.jp", + "ogaki.gifu.jp", + "sakahogi.gifu.jp", + "seki.gifu.jp", + "sekigahara.gifu.jp", + "shirakawa.gifu.jp", + "tajimi.gifu.jp", + "takayama.gifu.jp", + "tarui.gifu.jp", + "toki.gifu.jp", + "tomika.gifu.jp", + "wanouchi.gifu.jp", + "yamagata.gifu.jp", + "yaotsu.gifu.jp", + "yoro.gifu.jp", + "annaka.gunma.jp", + "chiyoda.gunma.jp", + "fujioka.gunma.jp", + "higashiagatsuma.gunma.jp", + "isesaki.gunma.jp", + "itakura.gunma.jp", + "kanna.gunma.jp", + "kanra.gunma.jp", + "katashina.gunma.jp", + "kawaba.gunma.jp", + "kiryu.gunma.jp", + "kusatsu.gunma.jp", + "maebashi.gunma.jp", + "meiwa.gunma.jp", + "midori.gunma.jp", + "minakami.gunma.jp", + "naganohara.gunma.jp", + "nakanojo.gunma.jp", + "nanmoku.gunma.jp", + "numata.gunma.jp", + "oizumi.gunma.jp", + "ora.gunma.jp", + "ota.gunma.jp", + "shibukawa.gunma.jp", + "shimonita.gunma.jp", + "shinto.gunma.jp", + "showa.gunma.jp", + "takasaki.gunma.jp", + "takayama.gunma.jp", + "tamamura.gunma.jp", + "tatebayashi.gunma.jp", + "tomioka.gunma.jp", + "tsukiyono.gunma.jp", + "tsumagoi.gunma.jp", + "ueno.gunma.jp", + "yoshioka.gunma.jp", + "asaminami.hiroshima.jp", + "daiwa.hiroshima.jp", + "etajima.hiroshima.jp", + "fuchu.hiroshima.jp", + "fukuyama.hiroshima.jp", + "hatsukaichi.hiroshima.jp", + "higashihiroshima.hiroshima.jp", + "hongo.hiroshima.jp", + "jinsekikogen.hiroshima.jp", + "kaita.hiroshima.jp", + "kui.hiroshima.jp", + "kumano.hiroshima.jp", + "kure.hiroshima.jp", + "mihara.hiroshima.jp", + "miyoshi.hiroshima.jp", + "naka.hiroshima.jp", + "onomichi.hiroshima.jp", + "osakikamijima.hiroshima.jp", + "otake.hiroshima.jp", + "saka.hiroshima.jp", + "sera.hiroshima.jp", + "seranishi.hiroshima.jp", + "shinichi.hiroshima.jp", + "shobara.hiroshima.jp", + "takehara.hiroshima.jp", + "abashiri.hokkaido.jp", + "abira.hokkaido.jp", + "aibetsu.hokkaido.jp", + "akabira.hokkaido.jp", + "akkeshi.hokkaido.jp", + "asahikawa.hokkaido.jp", + "ashibetsu.hokkaido.jp", + "ashoro.hokkaido.jp", + "assabu.hokkaido.jp", + "atsuma.hokkaido.jp", + "bibai.hokkaido.jp", + "biei.hokkaido.jp", + "bifuka.hokkaido.jp", + "bihoro.hokkaido.jp", + "biratori.hokkaido.jp", + "chippubetsu.hokkaido.jp", + "chitose.hokkaido.jp", + "date.hokkaido.jp", + "ebetsu.hokkaido.jp", + "embetsu.hokkaido.jp", + "eniwa.hokkaido.jp", + "erimo.hokkaido.jp", + "esan.hokkaido.jp", + "esashi.hokkaido.jp", + "fukagawa.hokkaido.jp", + "fukushima.hokkaido.jp", + "furano.hokkaido.jp", + "furubira.hokkaido.jp", + "haboro.hokkaido.jp", + "hakodate.hokkaido.jp", + "hamatonbetsu.hokkaido.jp", + "hidaka.hokkaido.jp", + "higashikagura.hokkaido.jp", + "higashikawa.hokkaido.jp", + "hiroo.hokkaido.jp", + "hokuryu.hokkaido.jp", + "hokuto.hokkaido.jp", + "honbetsu.hokkaido.jp", + "horokanai.hokkaido.jp", + "horonobe.hokkaido.jp", + "ikeda.hokkaido.jp", + "imakane.hokkaido.jp", + "ishikari.hokkaido.jp", + "iwamizawa.hokkaido.jp", + "iwanai.hokkaido.jp", + "kamifurano.hokkaido.jp", + "kamikawa.hokkaido.jp", + "kamishihoro.hokkaido.jp", + "kamisunagawa.hokkaido.jp", + "kamoenai.hokkaido.jp", + "kayabe.hokkaido.jp", + "kembuchi.hokkaido.jp", + "kikonai.hokkaido.jp", + "kimobetsu.hokkaido.jp", + "kitahiroshima.hokkaido.jp", + "kitami.hokkaido.jp", + "kiyosato.hokkaido.jp", + "koshimizu.hokkaido.jp", + "kunneppu.hokkaido.jp", + "kuriyama.hokkaido.jp", + "kuromatsunai.hokkaido.jp", + "kushiro.hokkaido.jp", + "kutchan.hokkaido.jp", + "kyowa.hokkaido.jp", + "mashike.hokkaido.jp", + "matsumae.hokkaido.jp", + "mikasa.hokkaido.jp", + "minamifurano.hokkaido.jp", + "mombetsu.hokkaido.jp", + "moseushi.hokkaido.jp", + "mukawa.hokkaido.jp", + "muroran.hokkaido.jp", + "naie.hokkaido.jp", + "nakagawa.hokkaido.jp", + "nakasatsunai.hokkaido.jp", + "nakatombetsu.hokkaido.jp", + "nanae.hokkaido.jp", + "nanporo.hokkaido.jp", + "nayoro.hokkaido.jp", + "nemuro.hokkaido.jp", + "niikappu.hokkaido.jp", + "niki.hokkaido.jp", + "nishiokoppe.hokkaido.jp", + "noboribetsu.hokkaido.jp", + "numata.hokkaido.jp", + "obihiro.hokkaido.jp", + "obira.hokkaido.jp", + "oketo.hokkaido.jp", + "okoppe.hokkaido.jp", + "otaru.hokkaido.jp", + "otobe.hokkaido.jp", + "otofuke.hokkaido.jp", + "otoineppu.hokkaido.jp", + "oumu.hokkaido.jp", + "ozora.hokkaido.jp", + "pippu.hokkaido.jp", + "rankoshi.hokkaido.jp", + "rebun.hokkaido.jp", + "rikubetsu.hokkaido.jp", + "rishiri.hokkaido.jp", + "rishirifuji.hokkaido.jp", + "saroma.hokkaido.jp", + "sarufutsu.hokkaido.jp", + "shakotan.hokkaido.jp", + "shari.hokkaido.jp", + "shibecha.hokkaido.jp", + "shibetsu.hokkaido.jp", + "shikabe.hokkaido.jp", + "shikaoi.hokkaido.jp", + "shimamaki.hokkaido.jp", + "shimizu.hokkaido.jp", + "shimokawa.hokkaido.jp", + "shinshinotsu.hokkaido.jp", + "shintoku.hokkaido.jp", + "shiranuka.hokkaido.jp", + "shiraoi.hokkaido.jp", + "shiriuchi.hokkaido.jp", + "sobetsu.hokkaido.jp", + "sunagawa.hokkaido.jp", + "taiki.hokkaido.jp", + "takasu.hokkaido.jp", + "takikawa.hokkaido.jp", + "takinoue.hokkaido.jp", + "teshikaga.hokkaido.jp", + "tobetsu.hokkaido.jp", + "tohma.hokkaido.jp", + "tomakomai.hokkaido.jp", + "tomari.hokkaido.jp", + "toya.hokkaido.jp", + "toyako.hokkaido.jp", + "toyotomi.hokkaido.jp", + "toyoura.hokkaido.jp", + "tsubetsu.hokkaido.jp", + "tsukigata.hokkaido.jp", + "urakawa.hokkaido.jp", + "urausu.hokkaido.jp", + "uryu.hokkaido.jp", + "utashinai.hokkaido.jp", + "wakkanai.hokkaido.jp", + "wassamu.hokkaido.jp", + "yakumo.hokkaido.jp", + "yoichi.hokkaido.jp", + "aioi.hyogo.jp", + "akashi.hyogo.jp", + "ako.hyogo.jp", + "amagasaki.hyogo.jp", + "aogaki.hyogo.jp", + "asago.hyogo.jp", + "ashiya.hyogo.jp", + "awaji.hyogo.jp", + "fukusaki.hyogo.jp", + "goshiki.hyogo.jp", + "harima.hyogo.jp", + "himeji.hyogo.jp", + "ichikawa.hyogo.jp", + "inagawa.hyogo.jp", + "itami.hyogo.jp", + "kakogawa.hyogo.jp", + "kamigori.hyogo.jp", + "kamikawa.hyogo.jp", + "kasai.hyogo.jp", + "kasuga.hyogo.jp", + "kawanishi.hyogo.jp", + "miki.hyogo.jp", + "minamiawaji.hyogo.jp", + "nishinomiya.hyogo.jp", + "nishiwaki.hyogo.jp", + "ono.hyogo.jp", + "sanda.hyogo.jp", + "sannan.hyogo.jp", + "sasayama.hyogo.jp", + "sayo.hyogo.jp", + "shingu.hyogo.jp", + "shinonsen.hyogo.jp", + "shiso.hyogo.jp", + "sumoto.hyogo.jp", + "taishi.hyogo.jp", + "taka.hyogo.jp", + "takarazuka.hyogo.jp", + "takasago.hyogo.jp", + "takino.hyogo.jp", + "tamba.hyogo.jp", + "tatsuno.hyogo.jp", + "toyooka.hyogo.jp", + "yabu.hyogo.jp", + "yashiro.hyogo.jp", + "yoka.hyogo.jp", + "yokawa.hyogo.jp", + "ami.ibaraki.jp", + "asahi.ibaraki.jp", + "bando.ibaraki.jp", + "chikusei.ibaraki.jp", + "daigo.ibaraki.jp", + "fujishiro.ibaraki.jp", + "hitachi.ibaraki.jp", + "hitachinaka.ibaraki.jp", + "hitachiomiya.ibaraki.jp", + "hitachiota.ibaraki.jp", + "ibaraki.ibaraki.jp", + "ina.ibaraki.jp", + "inashiki.ibaraki.jp", + "itako.ibaraki.jp", + "iwama.ibaraki.jp", + "joso.ibaraki.jp", + "kamisu.ibaraki.jp", + "kasama.ibaraki.jp", + "kashima.ibaraki.jp", + "kasumigaura.ibaraki.jp", + "koga.ibaraki.jp", + "miho.ibaraki.jp", + "mito.ibaraki.jp", + "moriya.ibaraki.jp", + "naka.ibaraki.jp", + "namegata.ibaraki.jp", + "oarai.ibaraki.jp", + "ogawa.ibaraki.jp", + "omitama.ibaraki.jp", + "ryugasaki.ibaraki.jp", + "sakai.ibaraki.jp", + "sakuragawa.ibaraki.jp", + "shimodate.ibaraki.jp", + "shimotsuma.ibaraki.jp", + "shirosato.ibaraki.jp", + "sowa.ibaraki.jp", + "suifu.ibaraki.jp", + "takahagi.ibaraki.jp", + "tamatsukuri.ibaraki.jp", + "tokai.ibaraki.jp", + "tomobe.ibaraki.jp", + "tone.ibaraki.jp", + "toride.ibaraki.jp", + "tsuchiura.ibaraki.jp", + "tsukuba.ibaraki.jp", + "uchihara.ibaraki.jp", + "ushiku.ibaraki.jp", + "yachiyo.ibaraki.jp", + "yamagata.ibaraki.jp", + "yawara.ibaraki.jp", + "yuki.ibaraki.jp", + "anamizu.ishikawa.jp", + "hakui.ishikawa.jp", + "hakusan.ishikawa.jp", + "kaga.ishikawa.jp", + "kahoku.ishikawa.jp", + "kanazawa.ishikawa.jp", + "kawakita.ishikawa.jp", + "komatsu.ishikawa.jp", + "nakanoto.ishikawa.jp", + "nanao.ishikawa.jp", + "nomi.ishikawa.jp", + "nonoichi.ishikawa.jp", + "noto.ishikawa.jp", + "shika.ishikawa.jp", + "suzu.ishikawa.jp", + "tsubata.ishikawa.jp", + "tsurugi.ishikawa.jp", + "uchinada.ishikawa.jp", + "wajima.ishikawa.jp", + "fudai.iwate.jp", + "fujisawa.iwate.jp", + "hanamaki.iwate.jp", + "hiraizumi.iwate.jp", + "hirono.iwate.jp", + "ichinohe.iwate.jp", + "ichinoseki.iwate.jp", + "iwaizumi.iwate.jp", + "iwate.iwate.jp", + "joboji.iwate.jp", + "kamaishi.iwate.jp", + "kanegasaki.iwate.jp", + "karumai.iwate.jp", + "kawai.iwate.jp", + "kitakami.iwate.jp", + "kuji.iwate.jp", + "kunohe.iwate.jp", + "kuzumaki.iwate.jp", + "miyako.iwate.jp", + "mizusawa.iwate.jp", + "morioka.iwate.jp", + "ninohe.iwate.jp", + "noda.iwate.jp", + "ofunato.iwate.jp", + "oshu.iwate.jp", + "otsuchi.iwate.jp", + "rikuzentakata.iwate.jp", + "shiwa.iwate.jp", + "shizukuishi.iwate.jp", + "sumita.iwate.jp", + "tanohata.iwate.jp", + "tono.iwate.jp", + "yahaba.iwate.jp", + "yamada.iwate.jp", + "ayagawa.kagawa.jp", + "higashikagawa.kagawa.jp", + "kanonji.kagawa.jp", + "kotohira.kagawa.jp", + "manno.kagawa.jp", + "marugame.kagawa.jp", + "mitoyo.kagawa.jp", + "naoshima.kagawa.jp", + "sanuki.kagawa.jp", + "tadotsu.kagawa.jp", + "takamatsu.kagawa.jp", + "tonosho.kagawa.jp", + "uchinomi.kagawa.jp", + "utazu.kagawa.jp", + "zentsuji.kagawa.jp", + "akune.kagoshima.jp", + "amami.kagoshima.jp", + "hioki.kagoshima.jp", + "isa.kagoshima.jp", + "isen.kagoshima.jp", + "izumi.kagoshima.jp", + "kagoshima.kagoshima.jp", + "kanoya.kagoshima.jp", + "kawanabe.kagoshima.jp", + "kinko.kagoshima.jp", + "kouyama.kagoshima.jp", + "makurazaki.kagoshima.jp", + "matsumoto.kagoshima.jp", + "minamitane.kagoshima.jp", + "nakatane.kagoshima.jp", + "nishinoomote.kagoshima.jp", + "satsumasendai.kagoshima.jp", + "soo.kagoshima.jp", + "tarumizu.kagoshima.jp", + "yusui.kagoshima.jp", + "aikawa.kanagawa.jp", + "atsugi.kanagawa.jp", + "ayase.kanagawa.jp", + "chigasaki.kanagawa.jp", + "ebina.kanagawa.jp", + "fujisawa.kanagawa.jp", + "hadano.kanagawa.jp", + "hakone.kanagawa.jp", + "hiratsuka.kanagawa.jp", + "isehara.kanagawa.jp", + "kaisei.kanagawa.jp", + "kamakura.kanagawa.jp", + "kiyokawa.kanagawa.jp", + "matsuda.kanagawa.jp", + "minamiashigara.kanagawa.jp", + "miura.kanagawa.jp", + "nakai.kanagawa.jp", + "ninomiya.kanagawa.jp", + "odawara.kanagawa.jp", + "oi.kanagawa.jp", + "oiso.kanagawa.jp", + "sagamihara.kanagawa.jp", + "samukawa.kanagawa.jp", + "tsukui.kanagawa.jp", + "yamakita.kanagawa.jp", + "yamato.kanagawa.jp", + "yokosuka.kanagawa.jp", + "yugawara.kanagawa.jp", + "zama.kanagawa.jp", + "zushi.kanagawa.jp", + "aki.kochi.jp", + "geisei.kochi.jp", + "hidaka.kochi.jp", + "higashitsuno.kochi.jp", + "ino.kochi.jp", + "kagami.kochi.jp", + "kami.kochi.jp", + "kitagawa.kochi.jp", + "kochi.kochi.jp", + "mihara.kochi.jp", + "motoyama.kochi.jp", + "muroto.kochi.jp", + "nahari.kochi.jp", + "nakamura.kochi.jp", + "nankoku.kochi.jp", + "nishitosa.kochi.jp", + "niyodogawa.kochi.jp", + "ochi.kochi.jp", + "okawa.kochi.jp", + "otoyo.kochi.jp", + "otsuki.kochi.jp", + "sakawa.kochi.jp", + "sukumo.kochi.jp", + "susaki.kochi.jp", + "tosa.kochi.jp", + "tosashimizu.kochi.jp", + "toyo.kochi.jp", + "tsuno.kochi.jp", + "umaji.kochi.jp", + "yasuda.kochi.jp", + "yusuhara.kochi.jp", + "amakusa.kumamoto.jp", + "arao.kumamoto.jp", + "aso.kumamoto.jp", + "choyo.kumamoto.jp", + "gyokuto.kumamoto.jp", + "kamiamakusa.kumamoto.jp", + "kikuchi.kumamoto.jp", + "kumamoto.kumamoto.jp", + "mashiki.kumamoto.jp", + "mifune.kumamoto.jp", + "minamata.kumamoto.jp", + "minamioguni.kumamoto.jp", + "nagasu.kumamoto.jp", + "nishihara.kumamoto.jp", + "oguni.kumamoto.jp", + "ozu.kumamoto.jp", + "sumoto.kumamoto.jp", + "takamori.kumamoto.jp", + "uki.kumamoto.jp", + "uto.kumamoto.jp", + "yamaga.kumamoto.jp", + "yamato.kumamoto.jp", + "yatsushiro.kumamoto.jp", + "ayabe.kyoto.jp", + "fukuchiyama.kyoto.jp", + "higashiyama.kyoto.jp", + "ide.kyoto.jp", + "ine.kyoto.jp", + "joyo.kyoto.jp", + "kameoka.kyoto.jp", + "kamo.kyoto.jp", + "kita.kyoto.jp", + "kizu.kyoto.jp", + "kumiyama.kyoto.jp", + "kyotamba.kyoto.jp", + "kyotanabe.kyoto.jp", + "kyotango.kyoto.jp", + "maizuru.kyoto.jp", + "minami.kyoto.jp", + "minamiyamashiro.kyoto.jp", + "miyazu.kyoto.jp", + "muko.kyoto.jp", + "nagaokakyo.kyoto.jp", + "nakagyo.kyoto.jp", + "nantan.kyoto.jp", + "oyamazaki.kyoto.jp", + "sakyo.kyoto.jp", + "seika.kyoto.jp", + "tanabe.kyoto.jp", + "uji.kyoto.jp", + "ujitawara.kyoto.jp", + "wazuka.kyoto.jp", + "yamashina.kyoto.jp", + "yawata.kyoto.jp", + "asahi.mie.jp", + "inabe.mie.jp", + "ise.mie.jp", + "kameyama.mie.jp", + "kawagoe.mie.jp", + "kiho.mie.jp", + "kisosaki.mie.jp", + "kiwa.mie.jp", + "komono.mie.jp", + "kumano.mie.jp", + "kuwana.mie.jp", + "matsusaka.mie.jp", + "meiwa.mie.jp", + "mihama.mie.jp", + "minamiise.mie.jp", + "misugi.mie.jp", + "miyama.mie.jp", + "nabari.mie.jp", + "shima.mie.jp", + "suzuka.mie.jp", + "tado.mie.jp", + "taiki.mie.jp", + "taki.mie.jp", + "tamaki.mie.jp", + "toba.mie.jp", + "tsu.mie.jp", + "udono.mie.jp", + "ureshino.mie.jp", + "watarai.mie.jp", + "yokkaichi.mie.jp", + "furukawa.miyagi.jp", + "higashimatsushima.miyagi.jp", + "ishinomaki.miyagi.jp", + "iwanuma.miyagi.jp", + "kakuda.miyagi.jp", + "kami.miyagi.jp", + "kawasaki.miyagi.jp", + "marumori.miyagi.jp", + "matsushima.miyagi.jp", + "minamisanriku.miyagi.jp", + "misato.miyagi.jp", + "murata.miyagi.jp", + "natori.miyagi.jp", + "ogawara.miyagi.jp", + "ohira.miyagi.jp", + "onagawa.miyagi.jp", + "osaki.miyagi.jp", + "rifu.miyagi.jp", + "semine.miyagi.jp", + "shibata.miyagi.jp", + "shichikashuku.miyagi.jp", + "shikama.miyagi.jp", + "shiogama.miyagi.jp", + "shiroishi.miyagi.jp", + "tagajo.miyagi.jp", + "taiwa.miyagi.jp", + "tome.miyagi.jp", + "tomiya.miyagi.jp", + "wakuya.miyagi.jp", + "watari.miyagi.jp", + "yamamoto.miyagi.jp", + "zao.miyagi.jp", + "aya.miyazaki.jp", + "ebino.miyazaki.jp", + "gokase.miyazaki.jp", + "hyuga.miyazaki.jp", + "kadogawa.miyazaki.jp", + "kawaminami.miyazaki.jp", + "kijo.miyazaki.jp", + "kitagawa.miyazaki.jp", + "kitakata.miyazaki.jp", + "kitaura.miyazaki.jp", + "kobayashi.miyazaki.jp", + "kunitomi.miyazaki.jp", + "kushima.miyazaki.jp", + "mimata.miyazaki.jp", + "miyakonojo.miyazaki.jp", + "miyazaki.miyazaki.jp", + "morotsuka.miyazaki.jp", + "nichinan.miyazaki.jp", + "nishimera.miyazaki.jp", + "nobeoka.miyazaki.jp", + "saito.miyazaki.jp", + "shiiba.miyazaki.jp", + "shintomi.miyazaki.jp", + "takaharu.miyazaki.jp", + "takanabe.miyazaki.jp", + "takazaki.miyazaki.jp", + "tsuno.miyazaki.jp", + "achi.nagano.jp", + "agematsu.nagano.jp", + "anan.nagano.jp", + "aoki.nagano.jp", + "asahi.nagano.jp", + "azumino.nagano.jp", + "chikuhoku.nagano.jp", + "chikuma.nagano.jp", + "chino.nagano.jp", + "fujimi.nagano.jp", + "hakuba.nagano.jp", + "hara.nagano.jp", + "hiraya.nagano.jp", + "iida.nagano.jp", + "iijima.nagano.jp", + "iiyama.nagano.jp", + "iizuna.nagano.jp", + "ikeda.nagano.jp", + "ikusaka.nagano.jp", + "ina.nagano.jp", + "karuizawa.nagano.jp", + "kawakami.nagano.jp", + "kiso.nagano.jp", + "kisofukushima.nagano.jp", + "kitaaiki.nagano.jp", + "komagane.nagano.jp", + "komoro.nagano.jp", + "matsukawa.nagano.jp", + "matsumoto.nagano.jp", + "miasa.nagano.jp", + "minamiaiki.nagano.jp", + "minamimaki.nagano.jp", + "minamiminowa.nagano.jp", + "minowa.nagano.jp", + "miyada.nagano.jp", + "miyota.nagano.jp", + "mochizuki.nagano.jp", + "nagano.nagano.jp", + "nagawa.nagano.jp", + "nagiso.nagano.jp", + "nakagawa.nagano.jp", + "nakano.nagano.jp", + "nozawaonsen.nagano.jp", + "obuse.nagano.jp", + "ogawa.nagano.jp", + "okaya.nagano.jp", + "omachi.nagano.jp", + "omi.nagano.jp", + "ookuwa.nagano.jp", + "ooshika.nagano.jp", + "otaki.nagano.jp", + "otari.nagano.jp", + "sakae.nagano.jp", + "sakaki.nagano.jp", + "saku.nagano.jp", + "sakuho.nagano.jp", + "shimosuwa.nagano.jp", + "shinanomachi.nagano.jp", + "shiojiri.nagano.jp", + "suwa.nagano.jp", + "suzaka.nagano.jp", + "takagi.nagano.jp", + "takamori.nagano.jp", + "takayama.nagano.jp", + "tateshina.nagano.jp", + "tatsuno.nagano.jp", + "togakushi.nagano.jp", + "togura.nagano.jp", + "tomi.nagano.jp", + "ueda.nagano.jp", + "wada.nagano.jp", + "yamagata.nagano.jp", + "yamanouchi.nagano.jp", + "yasaka.nagano.jp", + "yasuoka.nagano.jp", + "chijiwa.nagasaki.jp", + "futsu.nagasaki.jp", + "goto.nagasaki.jp", + "hasami.nagasaki.jp", + "hirado.nagasaki.jp", + "iki.nagasaki.jp", + "isahaya.nagasaki.jp", + "kawatana.nagasaki.jp", + "kuchinotsu.nagasaki.jp", + "matsuura.nagasaki.jp", + "nagasaki.nagasaki.jp", + "obama.nagasaki.jp", + "omura.nagasaki.jp", + "oseto.nagasaki.jp", + "saikai.nagasaki.jp", + "sasebo.nagasaki.jp", + "seihi.nagasaki.jp", + "shimabara.nagasaki.jp", + "shinkamigoto.nagasaki.jp", + "togitsu.nagasaki.jp", + "tsushima.nagasaki.jp", + "unzen.nagasaki.jp", + "ando.nara.jp", + "gose.nara.jp", + "heguri.nara.jp", + "higashiyoshino.nara.jp", + "ikaruga.nara.jp", + "ikoma.nara.jp", + "kamikitayama.nara.jp", + "kanmaki.nara.jp", + "kashiba.nara.jp", + "kashihara.nara.jp", + "katsuragi.nara.jp", + "kawai.nara.jp", + "kawakami.nara.jp", + "kawanishi.nara.jp", + "koryo.nara.jp", + "kurotaki.nara.jp", + "mitsue.nara.jp", + "miyake.nara.jp", + "nara.nara.jp", + "nosegawa.nara.jp", + "oji.nara.jp", + "ouda.nara.jp", + "oyodo.nara.jp", + "sakurai.nara.jp", + "sango.nara.jp", + "shimoichi.nara.jp", + "shimokitayama.nara.jp", + "shinjo.nara.jp", + "soni.nara.jp", + "takatori.nara.jp", + "tawaramoto.nara.jp", + "tenkawa.nara.jp", + "tenri.nara.jp", + "uda.nara.jp", + "yamatokoriyama.nara.jp", + "yamatotakada.nara.jp", + "yamazoe.nara.jp", + "yoshino.nara.jp", + "aga.niigata.jp", + "agano.niigata.jp", + "gosen.niigata.jp", + "itoigawa.niigata.jp", + "izumozaki.niigata.jp", + "joetsu.niigata.jp", + "kamo.niigata.jp", + "kariwa.niigata.jp", + "kashiwazaki.niigata.jp", + "minamiuonuma.niigata.jp", + "mitsuke.niigata.jp", + "muika.niigata.jp", + "murakami.niigata.jp", + "myoko.niigata.jp", + "nagaoka.niigata.jp", + "niigata.niigata.jp", + "ojiya.niigata.jp", + "omi.niigata.jp", + "sado.niigata.jp", + "sanjo.niigata.jp", + "seiro.niigata.jp", + "seirou.niigata.jp", + "sekikawa.niigata.jp", + "shibata.niigata.jp", + "tagami.niigata.jp", + "tainai.niigata.jp", + "tochio.niigata.jp", + "tokamachi.niigata.jp", + "tsubame.niigata.jp", + "tsunan.niigata.jp", + "uonuma.niigata.jp", + "yahiko.niigata.jp", + "yoita.niigata.jp", + "yuzawa.niigata.jp", + "beppu.oita.jp", + "bungoono.oita.jp", + "bungotakada.oita.jp", + "hasama.oita.jp", + "hiji.oita.jp", + "himeshima.oita.jp", + "hita.oita.jp", + "kamitsue.oita.jp", + "kokonoe.oita.jp", + "kuju.oita.jp", + "kunisaki.oita.jp", + "kusu.oita.jp", + "oita.oita.jp", + "saiki.oita.jp", + "taketa.oita.jp", + "tsukumi.oita.jp", + "usa.oita.jp", + "usuki.oita.jp", + "yufu.oita.jp", + "akaiwa.okayama.jp", + "asakuchi.okayama.jp", + "bizen.okayama.jp", + "hayashima.okayama.jp", + "ibara.okayama.jp", + "kagamino.okayama.jp", + "kasaoka.okayama.jp", + "kibichuo.okayama.jp", + "kumenan.okayama.jp", + "kurashiki.okayama.jp", + "maniwa.okayama.jp", + "misaki.okayama.jp", + "nagi.okayama.jp", + "niimi.okayama.jp", + "nishiawakura.okayama.jp", + "okayama.okayama.jp", + "satosho.okayama.jp", + "setouchi.okayama.jp", + "shinjo.okayama.jp", + "shoo.okayama.jp", + "soja.okayama.jp", + "takahashi.okayama.jp", + "tamano.okayama.jp", + "tsuyama.okayama.jp", + "wake.okayama.jp", + "yakage.okayama.jp", + "aguni.okinawa.jp", + "ginowan.okinawa.jp", + "ginoza.okinawa.jp", + "gushikami.okinawa.jp", + "haebaru.okinawa.jp", + "higashi.okinawa.jp", + "hirara.okinawa.jp", + "iheya.okinawa.jp", + "ishigaki.okinawa.jp", + "ishikawa.okinawa.jp", + "itoman.okinawa.jp", + "izena.okinawa.jp", + "kadena.okinawa.jp", + "kin.okinawa.jp", + "kitadaito.okinawa.jp", + "kitanakagusuku.okinawa.jp", + "kumejima.okinawa.jp", + "kunigami.okinawa.jp", + "minamidaito.okinawa.jp", + "motobu.okinawa.jp", + "nago.okinawa.jp", + "naha.okinawa.jp", + "nakagusuku.okinawa.jp", + "nakijin.okinawa.jp", + "nanjo.okinawa.jp", + "nishihara.okinawa.jp", + "ogimi.okinawa.jp", + "okinawa.okinawa.jp", + "onna.okinawa.jp", + "shimoji.okinawa.jp", + "taketomi.okinawa.jp", + "tarama.okinawa.jp", + "tokashiki.okinawa.jp", + "tomigusuku.okinawa.jp", + "tonaki.okinawa.jp", + "urasoe.okinawa.jp", + "uruma.okinawa.jp", + "yaese.okinawa.jp", + "yomitan.okinawa.jp", + "yonabaru.okinawa.jp", + "yonaguni.okinawa.jp", + "zamami.okinawa.jp", + "abeno.osaka.jp", + "chihayaakasaka.osaka.jp", + "chuo.osaka.jp", + "daito.osaka.jp", + "fujiidera.osaka.jp", + "habikino.osaka.jp", + "hannan.osaka.jp", + "higashiosaka.osaka.jp", + "higashisumiyoshi.osaka.jp", + "higashiyodogawa.osaka.jp", + "hirakata.osaka.jp", + "ibaraki.osaka.jp", + "ikeda.osaka.jp", + "izumi.osaka.jp", + "izumiotsu.osaka.jp", + "izumisano.osaka.jp", + "kadoma.osaka.jp", + "kaizuka.osaka.jp", + "kanan.osaka.jp", + "kashiwara.osaka.jp", + "katano.osaka.jp", + "kawachinagano.osaka.jp", + "kishiwada.osaka.jp", + "kita.osaka.jp", + "kumatori.osaka.jp", + "matsubara.osaka.jp", + "minato.osaka.jp", + "minoh.osaka.jp", + "misaki.osaka.jp", + "moriguchi.osaka.jp", + "neyagawa.osaka.jp", + "nishi.osaka.jp", + "nose.osaka.jp", + "osakasayama.osaka.jp", + "sakai.osaka.jp", + "sayama.osaka.jp", + "sennan.osaka.jp", + "settsu.osaka.jp", + "shijonawate.osaka.jp", + "shimamoto.osaka.jp", + "suita.osaka.jp", + "tadaoka.osaka.jp", + "taishi.osaka.jp", + "tajiri.osaka.jp", + "takaishi.osaka.jp", + "takatsuki.osaka.jp", + "tondabayashi.osaka.jp", + "toyonaka.osaka.jp", + "toyono.osaka.jp", + "yao.osaka.jp", + "ariake.saga.jp", + "arita.saga.jp", + "fukudomi.saga.jp", + "genkai.saga.jp", + "hamatama.saga.jp", + "hizen.saga.jp", + "imari.saga.jp", + "kamimine.saga.jp", + "kanzaki.saga.jp", + "karatsu.saga.jp", + "kashima.saga.jp", + "kitagata.saga.jp", + "kitahata.saga.jp", + "kiyama.saga.jp", + "kouhoku.saga.jp", + "kyuragi.saga.jp", + "nishiarita.saga.jp", + "ogi.saga.jp", + "omachi.saga.jp", + "ouchi.saga.jp", + "saga.saga.jp", + "shiroishi.saga.jp", + "taku.saga.jp", + "tara.saga.jp", + "tosu.saga.jp", + "yoshinogari.saga.jp", + "arakawa.saitama.jp", + "asaka.saitama.jp", + "chichibu.saitama.jp", + "fujimi.saitama.jp", + "fujimino.saitama.jp", + "fukaya.saitama.jp", + "hanno.saitama.jp", + "hanyu.saitama.jp", + "hasuda.saitama.jp", + "hatogaya.saitama.jp", + "hatoyama.saitama.jp", + "hidaka.saitama.jp", + "higashichichibu.saitama.jp", + "higashimatsuyama.saitama.jp", + "honjo.saitama.jp", + "ina.saitama.jp", + "iruma.saitama.jp", + "iwatsuki.saitama.jp", + "kamiizumi.saitama.jp", + "kamikawa.saitama.jp", + "kamisato.saitama.jp", + "kasukabe.saitama.jp", + "kawagoe.saitama.jp", + "kawaguchi.saitama.jp", + "kawajima.saitama.jp", + "kazo.saitama.jp", + "kitamoto.saitama.jp", + "koshigaya.saitama.jp", + "kounosu.saitama.jp", + "kuki.saitama.jp", + "kumagaya.saitama.jp", + "matsubushi.saitama.jp", + "minano.saitama.jp", + "misato.saitama.jp", + "miyashiro.saitama.jp", + "miyoshi.saitama.jp", + "moroyama.saitama.jp", + "nagatoro.saitama.jp", + "namegawa.saitama.jp", + "niiza.saitama.jp", + "ogano.saitama.jp", + "ogawa.saitama.jp", + "ogose.saitama.jp", + "okegawa.saitama.jp", + "omiya.saitama.jp", + "otaki.saitama.jp", + "ranzan.saitama.jp", + "ryokami.saitama.jp", + "saitama.saitama.jp", + "sakado.saitama.jp", + "satte.saitama.jp", + "sayama.saitama.jp", + "shiki.saitama.jp", + "shiraoka.saitama.jp", + "soka.saitama.jp", + "sugito.saitama.jp", + "toda.saitama.jp", + "tokigawa.saitama.jp", + "tokorozawa.saitama.jp", + "tsurugashima.saitama.jp", + "urawa.saitama.jp", + "warabi.saitama.jp", + "yashio.saitama.jp", + "yokoze.saitama.jp", + "yono.saitama.jp", + "yorii.saitama.jp", + "yoshida.saitama.jp", + "yoshikawa.saitama.jp", + "yoshimi.saitama.jp", + "aisho.shiga.jp", + "gamo.shiga.jp", + "higashiomi.shiga.jp", + "hikone.shiga.jp", + "koka.shiga.jp", + "konan.shiga.jp", + "kosei.shiga.jp", + "koto.shiga.jp", + "kusatsu.shiga.jp", + "maibara.shiga.jp", + "moriyama.shiga.jp", + "nagahama.shiga.jp", + "nishiazai.shiga.jp", + "notogawa.shiga.jp", + "omihachiman.shiga.jp", + "otsu.shiga.jp", + "ritto.shiga.jp", + "ryuoh.shiga.jp", + "takashima.shiga.jp", + "takatsuki.shiga.jp", + "torahime.shiga.jp", + "toyosato.shiga.jp", + "yasu.shiga.jp", + "akagi.shimane.jp", + "ama.shimane.jp", + "gotsu.shimane.jp", + "hamada.shimane.jp", + "higashiizumo.shimane.jp", + "hikawa.shimane.jp", + "hikimi.shimane.jp", + "izumo.shimane.jp", + "kakinoki.shimane.jp", + "masuda.shimane.jp", + "matsue.shimane.jp", + "misato.shimane.jp", + "nishinoshima.shimane.jp", + "ohda.shimane.jp", + "okinoshima.shimane.jp", + "okuizumo.shimane.jp", + "shimane.shimane.jp", + "tamayu.shimane.jp", + "tsuwano.shimane.jp", + "unnan.shimane.jp", + "yakumo.shimane.jp", + "yasugi.shimane.jp", + "yatsuka.shimane.jp", + "arai.shizuoka.jp", + "atami.shizuoka.jp", + "fuji.shizuoka.jp", + "fujieda.shizuoka.jp", + "fujikawa.shizuoka.jp", + "fujinomiya.shizuoka.jp", + "fukuroi.shizuoka.jp", + "gotemba.shizuoka.jp", + "haibara.shizuoka.jp", + "hamamatsu.shizuoka.jp", + "higashiizu.shizuoka.jp", + "ito.shizuoka.jp", + "iwata.shizuoka.jp", + "izu.shizuoka.jp", + "izunokuni.shizuoka.jp", + "kakegawa.shizuoka.jp", + "kannami.shizuoka.jp", + "kawanehon.shizuoka.jp", + "kawazu.shizuoka.jp", + "kikugawa.shizuoka.jp", + "kosai.shizuoka.jp", + "makinohara.shizuoka.jp", + "matsuzaki.shizuoka.jp", + "minamiizu.shizuoka.jp", + "mishima.shizuoka.jp", + "morimachi.shizuoka.jp", + "nishiizu.shizuoka.jp", + "numazu.shizuoka.jp", + "omaezaki.shizuoka.jp", + "shimada.shizuoka.jp", + "shimizu.shizuoka.jp", + "shimoda.shizuoka.jp", + "shizuoka.shizuoka.jp", + "susono.shizuoka.jp", + "yaizu.shizuoka.jp", + "yoshida.shizuoka.jp", + "ashikaga.tochigi.jp", + "bato.tochigi.jp", + "haga.tochigi.jp", + "ichikai.tochigi.jp", + "iwafune.tochigi.jp", + "kaminokawa.tochigi.jp", + "kanuma.tochigi.jp", + "karasuyama.tochigi.jp", + "kuroiso.tochigi.jp", + "mashiko.tochigi.jp", + "mibu.tochigi.jp", + "moka.tochigi.jp", + "motegi.tochigi.jp", + "nasu.tochigi.jp", + "nasushiobara.tochigi.jp", + "nikko.tochigi.jp", + "nishikata.tochigi.jp", + "nogi.tochigi.jp", + "ohira.tochigi.jp", + "ohtawara.tochigi.jp", + "oyama.tochigi.jp", + "sakura.tochigi.jp", + "sano.tochigi.jp", + "shimotsuke.tochigi.jp", + "shioya.tochigi.jp", + "takanezawa.tochigi.jp", + "tochigi.tochigi.jp", + "tsuga.tochigi.jp", + "ujiie.tochigi.jp", + "utsunomiya.tochigi.jp", + "yaita.tochigi.jp", + "aizumi.tokushima.jp", + "anan.tokushima.jp", + "ichiba.tokushima.jp", + "itano.tokushima.jp", + "kainan.tokushima.jp", + "komatsushima.tokushima.jp", + "matsushige.tokushima.jp", + "mima.tokushima.jp", + "minami.tokushima.jp", + "miyoshi.tokushima.jp", + "mugi.tokushima.jp", + "nakagawa.tokushima.jp", + "naruto.tokushima.jp", + "sanagochi.tokushima.jp", + "shishikui.tokushima.jp", + "tokushima.tokushima.jp", + "wajiki.tokushima.jp", + "adachi.tokyo.jp", + "akiruno.tokyo.jp", + "akishima.tokyo.jp", + "aogashima.tokyo.jp", + "arakawa.tokyo.jp", + "bunkyo.tokyo.jp", + "chiyoda.tokyo.jp", + "chofu.tokyo.jp", + "chuo.tokyo.jp", + "edogawa.tokyo.jp", + "fuchu.tokyo.jp", + "fussa.tokyo.jp", + "hachijo.tokyo.jp", + "hachioji.tokyo.jp", + "hamura.tokyo.jp", + "higashikurume.tokyo.jp", + "higashimurayama.tokyo.jp", + "higashiyamato.tokyo.jp", + "hino.tokyo.jp", + "hinode.tokyo.jp", + "hinohara.tokyo.jp", + "inagi.tokyo.jp", + "itabashi.tokyo.jp", + "katsushika.tokyo.jp", + "kita.tokyo.jp", + "kiyose.tokyo.jp", + "kodaira.tokyo.jp", + "koganei.tokyo.jp", + "kokubunji.tokyo.jp", + "komae.tokyo.jp", + "koto.tokyo.jp", + "kouzushima.tokyo.jp", + "kunitachi.tokyo.jp", + "machida.tokyo.jp", + "meguro.tokyo.jp", + "minato.tokyo.jp", + "mitaka.tokyo.jp", + "mizuho.tokyo.jp", + "musashimurayama.tokyo.jp", + "musashino.tokyo.jp", + "nakano.tokyo.jp", + "nerima.tokyo.jp", + "ogasawara.tokyo.jp", + "okutama.tokyo.jp", + "ome.tokyo.jp", + "oshima.tokyo.jp", + "ota.tokyo.jp", + "setagaya.tokyo.jp", + "shibuya.tokyo.jp", + "shinagawa.tokyo.jp", + "shinjuku.tokyo.jp", + "suginami.tokyo.jp", + "sumida.tokyo.jp", + "tachikawa.tokyo.jp", + "taito.tokyo.jp", + "tama.tokyo.jp", + "toshima.tokyo.jp", + "chizu.tottori.jp", + "hino.tottori.jp", + "kawahara.tottori.jp", + "koge.tottori.jp", + "kotoura.tottori.jp", + "misasa.tottori.jp", + "nanbu.tottori.jp", + "nichinan.tottori.jp", + "sakaiminato.tottori.jp", + "tottori.tottori.jp", + "wakasa.tottori.jp", + "yazu.tottori.jp", + "yonago.tottori.jp", + "asahi.toyama.jp", + "fuchu.toyama.jp", + "fukumitsu.toyama.jp", + "funahashi.toyama.jp", + "himi.toyama.jp", + "imizu.toyama.jp", + "inami.toyama.jp", + "johana.toyama.jp", + "kamiichi.toyama.jp", + "kurobe.toyama.jp", + "nakaniikawa.toyama.jp", + "namerikawa.toyama.jp", + "nanto.toyama.jp", + "nyuzen.toyama.jp", + "oyabe.toyama.jp", + "taira.toyama.jp", + "takaoka.toyama.jp", + "tateyama.toyama.jp", + "toga.toyama.jp", + "tonami.toyama.jp", + "toyama.toyama.jp", + "unazuki.toyama.jp", + "uozu.toyama.jp", + "yamada.toyama.jp", + "arida.wakayama.jp", + "aridagawa.wakayama.jp", + "gobo.wakayama.jp", + "hashimoto.wakayama.jp", + "hidaka.wakayama.jp", + "hirogawa.wakayama.jp", + "inami.wakayama.jp", + "iwade.wakayama.jp", + "kainan.wakayama.jp", + "kamitonda.wakayama.jp", + "katsuragi.wakayama.jp", + "kimino.wakayama.jp", + "kinokawa.wakayama.jp", + "kitayama.wakayama.jp", + "koya.wakayama.jp", + "koza.wakayama.jp", + "kozagawa.wakayama.jp", + "kudoyama.wakayama.jp", + "kushimoto.wakayama.jp", + "mihama.wakayama.jp", + "misato.wakayama.jp", + "nachikatsuura.wakayama.jp", + "shingu.wakayama.jp", + "shirahama.wakayama.jp", + "taiji.wakayama.jp", + "tanabe.wakayama.jp", + "wakayama.wakayama.jp", + "yuasa.wakayama.jp", + "yura.wakayama.jp", + "asahi.yamagata.jp", + "funagata.yamagata.jp", + "higashine.yamagata.jp", + "iide.yamagata.jp", + "kahoku.yamagata.jp", + "kaminoyama.yamagata.jp", + "kaneyama.yamagata.jp", + "kawanishi.yamagata.jp", + "mamurogawa.yamagata.jp", + "mikawa.yamagata.jp", + "murayama.yamagata.jp", + "nagai.yamagata.jp", + "nakayama.yamagata.jp", + "nanyo.yamagata.jp", + "nishikawa.yamagata.jp", + "obanazawa.yamagata.jp", + "oe.yamagata.jp", + "oguni.yamagata.jp", + "ohkura.yamagata.jp", + "oishida.yamagata.jp", + "sagae.yamagata.jp", + "sakata.yamagata.jp", + "sakegawa.yamagata.jp", + "shinjo.yamagata.jp", + "shirataka.yamagata.jp", + "shonai.yamagata.jp", + "takahata.yamagata.jp", + "tendo.yamagata.jp", + "tozawa.yamagata.jp", + "tsuruoka.yamagata.jp", + "yamagata.yamagata.jp", + "yamanobe.yamagata.jp", + "yonezawa.yamagata.jp", + "yuza.yamagata.jp", + "abu.yamaguchi.jp", + "hagi.yamaguchi.jp", + "hikari.yamaguchi.jp", + "hofu.yamaguchi.jp", + "iwakuni.yamaguchi.jp", + "kudamatsu.yamaguchi.jp", + "mitou.yamaguchi.jp", + "nagato.yamaguchi.jp", + "oshima.yamaguchi.jp", + "shimonoseki.yamaguchi.jp", + "shunan.yamaguchi.jp", + "tabuse.yamaguchi.jp", + "tokuyama.yamaguchi.jp", + "toyota.yamaguchi.jp", + "ube.yamaguchi.jp", + "yuu.yamaguchi.jp", + "chuo.yamanashi.jp", + "doshi.yamanashi.jp", + "fuefuki.yamanashi.jp", + "fujikawa.yamanashi.jp", + "fujikawaguchiko.yamanashi.jp", + "fujiyoshida.yamanashi.jp", + "hayakawa.yamanashi.jp", + "hokuto.yamanashi.jp", + "ichikawamisato.yamanashi.jp", + "kai.yamanashi.jp", + "kofu.yamanashi.jp", + "koshu.yamanashi.jp", + "kosuge.yamanashi.jp", + "minami-alps.yamanashi.jp", + "minobu.yamanashi.jp", + "nakamichi.yamanashi.jp", + "nanbu.yamanashi.jp", + "narusawa.yamanashi.jp", + "nirasaki.yamanashi.jp", + "nishikatsura.yamanashi.jp", + "oshino.yamanashi.jp", + "otsuki.yamanashi.jp", + "showa.yamanashi.jp", + "tabayama.yamanashi.jp", + "tsuru.yamanashi.jp", + "uenohara.yamanashi.jp", + "yamanakako.yamanashi.jp", + "yamanashi.yamanashi.jp", + "*.ke", + "kg", + "org.kg", + "net.kg", + "com.kg", + "edu.kg", + "gov.kg", + "mil.kg", + "*.kh", + "ki", + "edu.ki", + "biz.ki", + "net.ki", + "org.ki", + "gov.ki", + "info.ki", + "com.ki", + "km", + "org.km", + "nom.km", + "gov.km", + "prd.km", + "tm.km", + "edu.km", + "mil.km", + "ass.km", + "com.km", + "coop.km", + "asso.km", + "presse.km", + "medecin.km", + "notaires.km", + "pharmaciens.km", + "veterinaire.km", + "gouv.km", + "kn", + "net.kn", + "org.kn", + "edu.kn", + "gov.kn", + "kp", + "com.kp", + "edu.kp", + "gov.kp", + "org.kp", + "rep.kp", + "tra.kp", + "kr", + "ac.kr", + "co.kr", + "es.kr", + "go.kr", + "hs.kr", + "kg.kr", + "mil.kr", + "ms.kr", + "ne.kr", + "or.kr", + "pe.kr", + "re.kr", + "sc.kr", + "busan.kr", + "chungbuk.kr", + "chungnam.kr", + "daegu.kr", + "daejeon.kr", + "gangwon.kr", + "gwangju.kr", + "gyeongbuk.kr", + "gyeonggi.kr", + "gyeongnam.kr", + "incheon.kr", + "jeju.kr", + "jeonbuk.kr", + "jeonnam.kr", + "seoul.kr", + "ulsan.kr", + "*.kw", + "ky", + "edu.ky", + "gov.ky", + "com.ky", + "org.ky", + "net.ky", + "kz", + "org.kz", + "edu.kz", + "net.kz", + "gov.kz", + "mil.kz", + "com.kz", + "la", + "int.la", + "net.la", + "info.la", + "edu.la", + "gov.la", + "per.la", + "com.la", + "org.la", + "lb", + "com.lb", + "edu.lb", + "gov.lb", + "net.lb", + "org.lb", + "lc", + "com.lc", + "net.lc", + "co.lc", + "org.lc", + "edu.lc", + "gov.lc", + "li", + "lk", + "gov.lk", + "sch.lk", + "net.lk", + "int.lk", + "com.lk", + "org.lk", + "edu.lk", + "ngo.lk", + "soc.lk", + "web.lk", + "ltd.lk", + "assn.lk", + "grp.lk", + "hotel.lk", + "ac.lk", + "lr", + "com.lr", + "edu.lr", + "gov.lr", + "org.lr", + "net.lr", + "ls", + "co.ls", + "org.ls", + "lt", + "gov.lt", + "lu", + "lv", + "com.lv", + "edu.lv", + "gov.lv", + "org.lv", + "mil.lv", + "id.lv", + "net.lv", + "asn.lv", + "conf.lv", + "ly", + "com.ly", + "net.ly", + "gov.ly", + "plc.ly", + "edu.ly", + "sch.ly", + "med.ly", + "org.ly", + "id.ly", + "ma", + "co.ma", + "net.ma", + "gov.ma", + "org.ma", + "ac.ma", + "press.ma", + "mc", + "tm.mc", + "asso.mc", + "md", + "me", + "co.me", + "net.me", + "org.me", + "edu.me", + "ac.me", + "gov.me", + "its.me", + "priv.me", + "mg", + "org.mg", + "nom.mg", + "gov.mg", + "prd.mg", + "tm.mg", + "edu.mg", + "mil.mg", + "com.mg", + "co.mg", + "mh", + "mil", + "mk", + "com.mk", + "org.mk", + "net.mk", + "edu.mk", + "gov.mk", + "inf.mk", + "name.mk", + "ml", + "com.ml", + "edu.ml", + "gouv.ml", + "gov.ml", + "net.ml", + "org.ml", + "presse.ml", + "*.mm", + "mn", + "gov.mn", + "edu.mn", + "org.mn", + "mo", + "com.mo", + "net.mo", + "org.mo", + "edu.mo", + "gov.mo", + "mobi", + "mp", + "mq", + "mr", + "gov.mr", + "ms", + "com.ms", + "edu.ms", + "gov.ms", + "net.ms", + "org.ms", + "mt", + "com.mt", + "edu.mt", + "net.mt", + "org.mt", + "mu", + "com.mu", + "net.mu", + "org.mu", + "gov.mu", + "ac.mu", + "co.mu", + "or.mu", + "museum", + "academy.museum", + "agriculture.museum", + "air.museum", + "airguard.museum", + "alabama.museum", + "alaska.museum", + "amber.museum", + "ambulance.museum", + "american.museum", + "americana.museum", + "americanantiques.museum", + "americanart.museum", + "amsterdam.museum", + "and.museum", + "annefrank.museum", + "anthro.museum", + "anthropology.museum", + "antiques.museum", + "aquarium.museum", + "arboretum.museum", + "archaeological.museum", + "archaeology.museum", + "architecture.museum", + "art.museum", + "artanddesign.museum", + "artcenter.museum", + "artdeco.museum", + "arteducation.museum", + "artgallery.museum", + "arts.museum", + "artsandcrafts.museum", + "asmatart.museum", + "assassination.museum", + "assisi.museum", + "association.museum", + "astronomy.museum", + "atlanta.museum", + "austin.museum", + "australia.museum", + "automotive.museum", + "aviation.museum", + "axis.museum", + "badajoz.museum", + "baghdad.museum", + "bahn.museum", + "bale.museum", + "baltimore.museum", + "barcelona.museum", + "baseball.museum", + "basel.museum", + "baths.museum", + "bauern.museum", + "beauxarts.museum", + "beeldengeluid.museum", + "bellevue.museum", + "bergbau.museum", + "berkeley.museum", + "berlin.museum", + "bern.museum", + "bible.museum", + "bilbao.museum", + "bill.museum", + "birdart.museum", + "birthplace.museum", + "bonn.museum", + "boston.museum", + "botanical.museum", + "botanicalgarden.museum", + "botanicgarden.museum", + "botany.museum", + "brandywinevalley.museum", + "brasil.museum", + "bristol.museum", + "british.museum", + "britishcolumbia.museum", + "broadcast.museum", + "brunel.museum", + "brussel.museum", + "brussels.museum", + "bruxelles.museum", + "building.museum", + "burghof.museum", + "bus.museum", + "bushey.museum", + "cadaques.museum", + "california.museum", + "cambridge.museum", + "can.museum", + "canada.museum", + "capebreton.museum", + "carrier.museum", + "cartoonart.museum", + "casadelamoneda.museum", + "castle.museum", + "castres.museum", + "celtic.museum", + "center.museum", + "chattanooga.museum", + "cheltenham.museum", + "chesapeakebay.museum", + "chicago.museum", + "children.museum", + "childrens.museum", + "childrensgarden.museum", + "chiropractic.museum", + "chocolate.museum", + "christiansburg.museum", + "cincinnati.museum", + "cinema.museum", + "circus.museum", + "civilisation.museum", + "civilization.museum", + "civilwar.museum", + "clinton.museum", + "clock.museum", + "coal.museum", + "coastaldefence.museum", + "cody.museum", + "coldwar.museum", + "collection.museum", + "colonialwilliamsburg.museum", + "coloradoplateau.museum", + "columbia.museum", + "columbus.museum", + "communication.museum", + "communications.museum", + "community.museum", + "computer.museum", + "computerhistory.museum", + "xn--comunicaes-v6a2o.museum", + "contemporary.museum", + "contemporaryart.museum", + "convent.museum", + "copenhagen.museum", + "corporation.museum", + "xn--correios-e-telecomunicaes-ghc29a.museum", + "corvette.museum", + "costume.museum", + "countryestate.museum", + "county.museum", + "crafts.museum", + "cranbrook.museum", + "creation.museum", + "cultural.museum", + "culturalcenter.museum", + "culture.museum", + "cyber.museum", + "cymru.museum", + "dali.museum", + "dallas.museum", + "database.museum", + "ddr.museum", + "decorativearts.museum", + "delaware.museum", + "delmenhorst.museum", + "denmark.museum", + "depot.museum", + "design.museum", + "detroit.museum", + "dinosaur.museum", + "discovery.museum", + "dolls.museum", + "donostia.museum", + "durham.museum", + "eastafrica.museum", + "eastcoast.museum", + "education.museum", + "educational.museum", + "egyptian.museum", + "eisenbahn.museum", + "elburg.museum", + "elvendrell.museum", + "embroidery.museum", + "encyclopedic.museum", + "england.museum", + "entomology.museum", + "environment.museum", + "environmentalconservation.museum", + "epilepsy.museum", + "essex.museum", + "estate.museum", + "ethnology.museum", + "exeter.museum", + "exhibition.museum", + "family.museum", + "farm.museum", + "farmequipment.museum", + "farmers.museum", + "farmstead.museum", + "field.museum", + "figueres.museum", + "filatelia.museum", + "film.museum", + "fineart.museum", + "finearts.museum", + "finland.museum", + "flanders.museum", + "florida.museum", + "force.museum", + "fortmissoula.museum", + "fortworth.museum", + "foundation.museum", + "francaise.museum", + "frankfurt.museum", + "franziskaner.museum", + "freemasonry.museum", + "freiburg.museum", + "fribourg.museum", + "frog.museum", + "fundacio.museum", + "furniture.museum", + "gallery.museum", + "garden.museum", + "gateway.museum", + "geelvinck.museum", + "gemological.museum", + "geology.museum", + "georgia.museum", + "giessen.museum", + "glas.museum", + "glass.museum", + "gorge.museum", + "grandrapids.museum", + "graz.museum", + "guernsey.museum", + "halloffame.museum", + "hamburg.museum", + "handson.museum", + "harvestcelebration.museum", + "hawaii.museum", + "health.museum", + "heimatunduhren.museum", + "hellas.museum", + "helsinki.museum", + "hembygdsforbund.museum", + "heritage.museum", + "histoire.museum", + "historical.museum", + "historicalsociety.museum", + "historichouses.museum", + "historisch.museum", + "historisches.museum", + "history.museum", + "historyofscience.museum", + "horology.museum", + "house.museum", + "humanities.museum", + "illustration.museum", + "imageandsound.museum", + "indian.museum", + "indiana.museum", + "indianapolis.museum", + "indianmarket.museum", + "intelligence.museum", + "interactive.museum", + "iraq.museum", + "iron.museum", + "isleofman.museum", + "jamison.museum", + "jefferson.museum", + "jerusalem.museum", + "jewelry.museum", + "jewish.museum", + "jewishart.museum", + "jfk.museum", + "journalism.museum", + "judaica.museum", + "judygarland.museum", + "juedisches.museum", + "juif.museum", + "karate.museum", + "karikatur.museum", + "kids.museum", + "koebenhavn.museum", + "koeln.museum", + "kunst.museum", + "kunstsammlung.museum", + "kunstunddesign.museum", + "labor.museum", + "labour.museum", + "lajolla.museum", + "lancashire.museum", + "landes.museum", + "lans.museum", + "xn--lns-qla.museum", + "larsson.museum", + "lewismiller.museum", + "lincoln.museum", + "linz.museum", + "living.museum", + "livinghistory.museum", + "localhistory.museum", + "london.museum", + "losangeles.museum", + "louvre.museum", + "loyalist.museum", + "lucerne.museum", + "luxembourg.museum", + "luzern.museum", + "mad.museum", + "madrid.museum", + "mallorca.museum", + "manchester.museum", + "mansion.museum", + "mansions.museum", + "manx.museum", + "marburg.museum", + "maritime.museum", + "maritimo.museum", + "maryland.museum", + "marylhurst.museum", + "media.museum", + "medical.museum", + "medizinhistorisches.museum", + "meeres.museum", + "memorial.museum", + "mesaverde.museum", + "michigan.museum", + "midatlantic.museum", + "military.museum", + "mill.museum", + "miners.museum", + "mining.museum", + "minnesota.museum", + "missile.museum", + "missoula.museum", + "modern.museum", + "moma.museum", + "money.museum", + "monmouth.museum", + "monticello.museum", + "montreal.museum", + "moscow.museum", + "motorcycle.museum", + "muenchen.museum", + "muenster.museum", + "mulhouse.museum", + "muncie.museum", + "museet.museum", + "museumcenter.museum", + "museumvereniging.museum", + "music.museum", + "national.museum", + "nationalfirearms.museum", + "nationalheritage.museum", + "nativeamerican.museum", + "naturalhistory.museum", + "naturalhistorymuseum.museum", + "naturalsciences.museum", + "nature.museum", + "naturhistorisches.museum", + "natuurwetenschappen.museum", + "naumburg.museum", + "naval.museum", + "nebraska.museum", + "neues.museum", + "newhampshire.museum", + "newjersey.museum", + "newmexico.museum", + "newport.museum", + "newspaper.museum", + "newyork.museum", + "niepce.museum", + "norfolk.museum", + "north.museum", + "nrw.museum", + "nuernberg.museum", + "nuremberg.museum", + "nyc.museum", + "nyny.museum", + "oceanographic.museum", + "oceanographique.museum", + "omaha.museum", + "online.museum", + "ontario.museum", + "openair.museum", + "oregon.museum", + "oregontrail.museum", + "otago.museum", + "oxford.museum", + "pacific.museum", + "paderborn.museum", + "palace.museum", + "paleo.museum", + "palmsprings.museum", + "panama.museum", + "paris.museum", + "pasadena.museum", + "pharmacy.museum", + "philadelphia.museum", + "philadelphiaarea.museum", + "philately.museum", + "phoenix.museum", + "photography.museum", + "pilots.museum", + "pittsburgh.museum", + "planetarium.museum", + "plantation.museum", + "plants.museum", + "plaza.museum", + "portal.museum", + "portland.museum", + "portlligat.museum", + "posts-and-telecommunications.museum", + "preservation.museum", + "presidio.museum", + "press.museum", + "project.museum", + "public.museum", + "pubol.museum", + "quebec.museum", + "railroad.museum", + "railway.museum", + "research.museum", + "resistance.museum", + "riodejaneiro.museum", + "rochester.museum", + "rockart.museum", + "roma.museum", + "russia.museum", + "saintlouis.museum", + "salem.museum", + "salvadordali.museum", + "salzburg.museum", + "sandiego.museum", + "sanfrancisco.museum", + "santabarbara.museum", + "santacruz.museum", + "santafe.museum", + "saskatchewan.museum", + "satx.museum", + "savannahga.museum", + "schlesisches.museum", + "schoenbrunn.museum", + "schokoladen.museum", + "school.museum", + "schweiz.museum", + "science.museum", + "scienceandhistory.museum", + "scienceandindustry.museum", + "sciencecenter.museum", + "sciencecenters.museum", + "science-fiction.museum", + "sciencehistory.museum", + "sciences.museum", + "sciencesnaturelles.museum", + "scotland.museum", + "seaport.museum", + "settlement.museum", + "settlers.museum", + "shell.museum", + "sherbrooke.museum", + "sibenik.museum", + "silk.museum", + "ski.museum", + "skole.museum", + "society.museum", + "sologne.museum", + "soundandvision.museum", + "southcarolina.museum", + "southwest.museum", + "space.museum", + "spy.museum", + "square.museum", + "stadt.museum", + "stalbans.museum", + "starnberg.museum", + "state.museum", + "stateofdelaware.museum", + "station.museum", + "steam.museum", + "steiermark.museum", + "stjohn.museum", + "stockholm.museum", + "stpetersburg.museum", + "stuttgart.museum", + "suisse.museum", + "surgeonshall.museum", + "surrey.museum", + "svizzera.museum", + "sweden.museum", + "sydney.museum", + "tank.museum", + "tcm.museum", + "technology.museum", + "telekommunikation.museum", + "television.museum", + "texas.museum", + "textile.museum", + "theater.museum", + "time.museum", + "timekeeping.museum", + "topology.museum", + "torino.museum", + "touch.museum", + "town.museum", + "transport.museum", + "tree.museum", + "trolley.museum", + "trust.museum", + "trustee.museum", + "uhren.museum", + "ulm.museum", + "undersea.museum", + "university.museum", + "usa.museum", + "usantiques.museum", + "usarts.museum", + "uscountryestate.museum", + "usculture.museum", + "usdecorativearts.museum", + "usgarden.museum", + "ushistory.museum", + "ushuaia.museum", + "uslivinghistory.museum", + "utah.museum", + "uvic.museum", + "valley.museum", + "vantaa.museum", + "versailles.museum", + "viking.museum", + "village.museum", + "virginia.museum", + "virtual.museum", + "virtuel.museum", + "vlaanderen.museum", + "volkenkunde.museum", + "wales.museum", + "wallonie.museum", + "war.museum", + "washingtondc.museum", + "watchandclock.museum", + "watch-and-clock.museum", + "western.museum", + "westfalen.museum", + "whaling.museum", + "wildlife.museum", + "williamsburg.museum", + "windmill.museum", + "workshop.museum", + "york.museum", + "yorkshire.museum", + "yosemite.museum", + "youth.museum", + "zoological.museum", + "zoology.museum", + "xn--9dbhblg6di.museum", + "xn--h1aegh.museum", + "mv", + "aero.mv", + "biz.mv", + "com.mv", + "coop.mv", + "edu.mv", + "gov.mv", + "info.mv", + "int.mv", + "mil.mv", + "museum.mv", + "name.mv", + "net.mv", + "org.mv", + "pro.mv", + "mw", + "ac.mw", + "biz.mw", + "co.mw", + "com.mw", + "coop.mw", + "edu.mw", + "gov.mw", + "int.mw", + "museum.mw", + "net.mw", + "org.mw", + "mx", + "com.mx", + "org.mx", + "gob.mx", + "edu.mx", + "net.mx", + "my", + "com.my", + "net.my", + "org.my", + "gov.my", + "edu.my", + "mil.my", + "name.my", + "mz", + "ac.mz", + "adv.mz", + "co.mz", + "edu.mz", + "gov.mz", + "mil.mz", + "net.mz", + "org.mz", + "na", + "info.na", + "pro.na", + "name.na", + "school.na", + "or.na", + "dr.na", + "us.na", + "mx.na", + "ca.na", + "in.na", + "cc.na", + "tv.na", + "ws.na", + "mobi.na", + "co.na", + "com.na", + "org.na", + "name", + "nc", + "asso.nc", + "nom.nc", + "ne", + "net", + "nf", + "com.nf", + "net.nf", + "per.nf", + "rec.nf", + "web.nf", + "arts.nf", + "firm.nf", + "info.nf", + "other.nf", + "store.nf", + "ng", + "com.ng", + "edu.ng", + "gov.ng", + "i.ng", + "mil.ng", + "mobi.ng", + "name.ng", + "net.ng", + "org.ng", + "sch.ng", + "ni", + "ac.ni", + "biz.ni", + "co.ni", + "com.ni", + "edu.ni", + "gob.ni", + "in.ni", + "info.ni", + "int.ni", + "mil.ni", + "net.ni", + "nom.ni", + "org.ni", + "web.ni", + "nl", + "bv.nl", + "no", + "fhs.no", + "vgs.no", + "fylkesbibl.no", + "folkebibl.no", + "museum.no", + "idrett.no", + "priv.no", + "mil.no", + "stat.no", + "dep.no", + "kommune.no", + "herad.no", + "aa.no", + "ah.no", + "bu.no", + "fm.no", + "hl.no", + "hm.no", + "jan-mayen.no", + "mr.no", + "nl.no", + "nt.no", + "of.no", + "ol.no", + "oslo.no", + "rl.no", + "sf.no", + "st.no", + "svalbard.no", + "tm.no", + "tr.no", + "va.no", + "vf.no", + "gs.aa.no", + "gs.ah.no", + "gs.bu.no", + "gs.fm.no", + "gs.hl.no", + "gs.hm.no", + "gs.jan-mayen.no", + "gs.mr.no", + "gs.nl.no", + "gs.nt.no", + "gs.of.no", + "gs.ol.no", + "gs.oslo.no", + "gs.rl.no", + "gs.sf.no", + "gs.st.no", + "gs.svalbard.no", + "gs.tm.no", + "gs.tr.no", + "gs.va.no", + "gs.vf.no", + "akrehamn.no", + "xn--krehamn-dxa.no", + "algard.no", + "xn--lgrd-poac.no", + "arna.no", + "brumunddal.no", + "bryne.no", + "bronnoysund.no", + "xn--brnnysund-m8ac.no", + "drobak.no", + "xn--drbak-wua.no", + "egersund.no", + "fetsund.no", + "floro.no", + "xn--flor-jra.no", + "fredrikstad.no", + "hokksund.no", + "honefoss.no", + "xn--hnefoss-q1a.no", + "jessheim.no", + "jorpeland.no", + "xn--jrpeland-54a.no", + "kirkenes.no", + "kopervik.no", + "krokstadelva.no", + "langevag.no", + "xn--langevg-jxa.no", + "leirvik.no", + "mjondalen.no", + "xn--mjndalen-64a.no", + "mo-i-rana.no", + "mosjoen.no", + "xn--mosjen-eya.no", + "nesoddtangen.no", + "orkanger.no", + "osoyro.no", + "xn--osyro-wua.no", + "raholt.no", + "xn--rholt-mra.no", + "sandnessjoen.no", + "xn--sandnessjen-ogb.no", + "skedsmokorset.no", + "slattum.no", + "spjelkavik.no", + "stathelle.no", + "stavern.no", + "stjordalshalsen.no", + "xn--stjrdalshalsen-sqb.no", + "tananger.no", + "tranby.no", + "vossevangen.no", + "afjord.no", + "xn--fjord-lra.no", + "agdenes.no", + "al.no", + "xn--l-1fa.no", + "alesund.no", + "xn--lesund-hua.no", + "alstahaug.no", + "alta.no", + "xn--lt-liac.no", + "alaheadju.no", + "xn--laheadju-7ya.no", + "alvdal.no", + "amli.no", + "xn--mli-tla.no", + "amot.no", + "xn--mot-tla.no", + "andebu.no", + "andoy.no", + "xn--andy-ira.no", + "andasuolo.no", + "ardal.no", + "xn--rdal-poa.no", + "aremark.no", + "arendal.no", + "xn--s-1fa.no", + "aseral.no", + "xn--seral-lra.no", + "asker.no", + "askim.no", + "askvoll.no", + "askoy.no", + "xn--asky-ira.no", + "asnes.no", + "xn--snes-poa.no", + "audnedaln.no", + "aukra.no", + "aure.no", + "aurland.no", + "aurskog-holand.no", + "xn--aurskog-hland-jnb.no", + "austevoll.no", + "austrheim.no", + "averoy.no", + "xn--avery-yua.no", + "balestrand.no", + "ballangen.no", + "balat.no", + "xn--blt-elab.no", + "balsfjord.no", + "bahccavuotna.no", + "xn--bhccavuotna-k7a.no", + "bamble.no", + "bardu.no", + "beardu.no", + "beiarn.no", + "bajddar.no", + "xn--bjddar-pta.no", + "baidar.no", + "xn--bidr-5nac.no", + "berg.no", + "bergen.no", + "berlevag.no", + "xn--berlevg-jxa.no", + "bearalvahki.no", + "xn--bearalvhki-y4a.no", + "bindal.no", + "birkenes.no", + "bjarkoy.no", + "xn--bjarky-fya.no", + "bjerkreim.no", + "bjugn.no", + "bodo.no", + "xn--bod-2na.no", + "badaddja.no", + "xn--bdddj-mrabd.no", + "budejju.no", + "bokn.no", + "bremanger.no", + "bronnoy.no", + "xn--brnny-wuac.no", + "bygland.no", + "bykle.no", + "barum.no", + "xn--brum-voa.no", + "bo.telemark.no", + "xn--b-5ga.telemark.no", + "bo.nordland.no", + "xn--b-5ga.nordland.no", + "bievat.no", + "xn--bievt-0qa.no", + "bomlo.no", + "xn--bmlo-gra.no", + "batsfjord.no", + "xn--btsfjord-9za.no", + "bahcavuotna.no", + "xn--bhcavuotna-s4a.no", + "dovre.no", + "drammen.no", + "drangedal.no", + "dyroy.no", + "xn--dyry-ira.no", + "donna.no", + "xn--dnna-gra.no", + "eid.no", + "eidfjord.no", + "eidsberg.no", + "eidskog.no", + "eidsvoll.no", + "eigersund.no", + "elverum.no", + "enebakk.no", + "engerdal.no", + "etne.no", + "etnedal.no", + "evenes.no", + "evenassi.no", + "xn--eveni-0qa01ga.no", + "evje-og-hornnes.no", + "farsund.no", + "fauske.no", + "fuossko.no", + "fuoisku.no", + "fedje.no", + "fet.no", + "finnoy.no", + "xn--finny-yua.no", + "fitjar.no", + "fjaler.no", + "fjell.no", + "flakstad.no", + "flatanger.no", + "flekkefjord.no", + "flesberg.no", + "flora.no", + "fla.no", + "xn--fl-zia.no", + "folldal.no", + "forsand.no", + "fosnes.no", + "frei.no", + "frogn.no", + "froland.no", + "frosta.no", + "frana.no", + "xn--frna-woa.no", + "froya.no", + "xn--frya-hra.no", + "fusa.no", + "fyresdal.no", + "forde.no", + "xn--frde-gra.no", + "gamvik.no", + "gangaviika.no", + "xn--ggaviika-8ya47h.no", + "gaular.no", + "gausdal.no", + "gildeskal.no", + "xn--gildeskl-g0a.no", + "giske.no", + "gjemnes.no", + "gjerdrum.no", + "gjerstad.no", + "gjesdal.no", + "gjovik.no", + "xn--gjvik-wua.no", + "gloppen.no", + "gol.no", + "gran.no", + "grane.no", + "granvin.no", + "gratangen.no", + "grimstad.no", + "grong.no", + "kraanghke.no", + "xn--kranghke-b0a.no", + "grue.no", + "gulen.no", + "hadsel.no", + "halden.no", + "halsa.no", + "hamar.no", + "hamaroy.no", + "habmer.no", + "xn--hbmer-xqa.no", + "hapmir.no", + "xn--hpmir-xqa.no", + "hammerfest.no", + "hammarfeasta.no", + "xn--hmmrfeasta-s4ac.no", + "haram.no", + "hareid.no", + "harstad.no", + "hasvik.no", + "aknoluokta.no", + "xn--koluokta-7ya57h.no", + "hattfjelldal.no", + "aarborte.no", + "haugesund.no", + "hemne.no", + "hemnes.no", + "hemsedal.no", + "heroy.more-og-romsdal.no", + "xn--hery-ira.xn--mre-og-romsdal-qqb.no", + "heroy.nordland.no", + "xn--hery-ira.nordland.no", + "hitra.no", + "hjartdal.no", + "hjelmeland.no", + "hobol.no", + "xn--hobl-ira.no", + "hof.no", + "hol.no", + "hole.no", + "holmestrand.no", + "holtalen.no", + "xn--holtlen-hxa.no", + "hornindal.no", + "horten.no", + "hurdal.no", + "hurum.no", + "hvaler.no", + "hyllestad.no", + "hagebostad.no", + "xn--hgebostad-g3a.no", + "hoyanger.no", + "xn--hyanger-q1a.no", + "hoylandet.no", + "xn--hylandet-54a.no", + "ha.no", + "xn--h-2fa.no", + "ibestad.no", + "inderoy.no", + "xn--indery-fya.no", + "iveland.no", + "jevnaker.no", + "jondal.no", + "jolster.no", + "xn--jlster-bya.no", + "karasjok.no", + "karasjohka.no", + "xn--krjohka-hwab49j.no", + "karlsoy.no", + "galsa.no", + "xn--gls-elac.no", + "karmoy.no", + "xn--karmy-yua.no", + "kautokeino.no", + "guovdageaidnu.no", + "klepp.no", + "klabu.no", + "xn--klbu-woa.no", + "kongsberg.no", + "kongsvinger.no", + "kragero.no", + "xn--krager-gya.no", + "kristiansand.no", + "kristiansund.no", + "krodsherad.no", + "xn--krdsherad-m8a.no", + "kvalsund.no", + "rahkkeravju.no", + "xn--rhkkervju-01af.no", + "kvam.no", + "kvinesdal.no", + "kvinnherad.no", + "kviteseid.no", + "kvitsoy.no", + "xn--kvitsy-fya.no", + "kvafjord.no", + "xn--kvfjord-nxa.no", + "giehtavuoatna.no", + "kvanangen.no", + "xn--kvnangen-k0a.no", + "navuotna.no", + "xn--nvuotna-hwa.no", + "kafjord.no", + "xn--kfjord-iua.no", + "gaivuotna.no", + "xn--givuotna-8ya.no", + "larvik.no", + "lavangen.no", + "lavagis.no", + "loabat.no", + "xn--loabt-0qa.no", + "lebesby.no", + "davvesiida.no", + "leikanger.no", + "leirfjord.no", + "leka.no", + "leksvik.no", + "lenvik.no", + "leangaviika.no", + "xn--leagaviika-52b.no", + "lesja.no", + "levanger.no", + "lier.no", + "lierne.no", + "lillehammer.no", + "lillesand.no", + "lindesnes.no", + "lindas.no", + "xn--linds-pra.no", + "lom.no", + "loppa.no", + "lahppi.no", + "xn--lhppi-xqa.no", + "lund.no", + "lunner.no", + "luroy.no", + "xn--lury-ira.no", + "luster.no", + "lyngdal.no", + "lyngen.no", + "ivgu.no", + "lardal.no", + "lerdal.no", + "xn--lrdal-sra.no", + "lodingen.no", + "xn--ldingen-q1a.no", + "lorenskog.no", + "xn--lrenskog-54a.no", + "loten.no", + "xn--lten-gra.no", + "malvik.no", + "masoy.no", + "xn--msy-ula0h.no", + "muosat.no", + "xn--muost-0qa.no", + "mandal.no", + "marker.no", + "marnardal.no", + "masfjorden.no", + "meland.no", + "meldal.no", + "melhus.no", + "meloy.no", + "xn--mely-ira.no", + "meraker.no", + "xn--merker-kua.no", + "moareke.no", + "xn--moreke-jua.no", + "midsund.no", + "midtre-gauldal.no", + "modalen.no", + "modum.no", + "molde.no", + "moskenes.no", + "moss.no", + "mosvik.no", + "malselv.no", + "xn--mlselv-iua.no", + "malatvuopmi.no", + "xn--mlatvuopmi-s4a.no", + "namdalseid.no", + "aejrie.no", + "namsos.no", + "namsskogan.no", + "naamesjevuemie.no", + "xn--nmesjevuemie-tcba.no", + "laakesvuemie.no", + "nannestad.no", + "narvik.no", + "narviika.no", + "naustdal.no", + "nedre-eiker.no", + "nes.akershus.no", + "nes.buskerud.no", + "nesna.no", + "nesodden.no", + "nesseby.no", + "unjarga.no", + "xn--unjrga-rta.no", + "nesset.no", + "nissedal.no", + "nittedal.no", + "nord-aurdal.no", + "nord-fron.no", + "nord-odal.no", + "norddal.no", + "nordkapp.no", + "davvenjarga.no", + "xn--davvenjrga-y4a.no", + "nordre-land.no", + "nordreisa.no", + "raisa.no", + "xn--risa-5na.no", + "nore-og-uvdal.no", + "notodden.no", + "naroy.no", + "xn--nry-yla5g.no", + "notteroy.no", + "xn--nttery-byae.no", + "odda.no", + "oksnes.no", + "xn--ksnes-uua.no", + "oppdal.no", + "oppegard.no", + "xn--oppegrd-ixa.no", + "orkdal.no", + "orland.no", + "xn--rland-uua.no", + "orskog.no", + "xn--rskog-uua.no", + "orsta.no", + "xn--rsta-fra.no", + "os.hedmark.no", + "os.hordaland.no", + "osen.no", + "osteroy.no", + "xn--ostery-fya.no", + "ostre-toten.no", + "xn--stre-toten-zcb.no", + "overhalla.no", + "ovre-eiker.no", + "xn--vre-eiker-k8a.no", + "oyer.no", + "xn--yer-zna.no", + "oygarden.no", + "xn--ygarden-p1a.no", + "oystre-slidre.no", + "xn--ystre-slidre-ujb.no", + "porsanger.no", + "porsangu.no", + "xn--porsgu-sta26f.no", + "porsgrunn.no", + "radoy.no", + "xn--rady-ira.no", + "rakkestad.no", + "rana.no", + "ruovat.no", + "randaberg.no", + "rauma.no", + "rendalen.no", + "rennebu.no", + "rennesoy.no", + "xn--rennesy-v1a.no", + "rindal.no", + "ringebu.no", + "ringerike.no", + "ringsaker.no", + "rissa.no", + "risor.no", + "xn--risr-ira.no", + "roan.no", + "rollag.no", + "rygge.no", + "ralingen.no", + "xn--rlingen-mxa.no", + "rodoy.no", + "xn--rdy-0nab.no", + "romskog.no", + "xn--rmskog-bya.no", + "roros.no", + "xn--rros-gra.no", + "rost.no", + "xn--rst-0na.no", + "royken.no", + "xn--ryken-vua.no", + "royrvik.no", + "xn--ryrvik-bya.no", + "rade.no", + "xn--rde-ula.no", + "salangen.no", + "siellak.no", + "saltdal.no", + "salat.no", + "xn--slt-elab.no", + "xn--slat-5na.no", + "samnanger.no", + "sande.more-og-romsdal.no", + "sande.xn--mre-og-romsdal-qqb.no", + "sande.vestfold.no", + "sandefjord.no", + "sandnes.no", + "sandoy.no", + "xn--sandy-yua.no", + "sarpsborg.no", + "sauda.no", + "sauherad.no", + "sel.no", + "selbu.no", + "selje.no", + "seljord.no", + "sigdal.no", + "siljan.no", + "sirdal.no", + "skaun.no", + "skedsmo.no", + "ski.no", + "skien.no", + "skiptvet.no", + "skjervoy.no", + "xn--skjervy-v1a.no", + "skierva.no", + "xn--skierv-uta.no", + "skjak.no", + "xn--skjk-soa.no", + "skodje.no", + "skanland.no", + "xn--sknland-fxa.no", + "skanit.no", + "xn--sknit-yqa.no", + "smola.no", + "xn--smla-hra.no", + "snillfjord.no", + "snasa.no", + "xn--snsa-roa.no", + "snoasa.no", + "snaase.no", + "xn--snase-nra.no", + "sogndal.no", + "sokndal.no", + "sola.no", + "solund.no", + "songdalen.no", + "sortland.no", + "spydeberg.no", + "stange.no", + "stavanger.no", + "steigen.no", + "steinkjer.no", + "stjordal.no", + "xn--stjrdal-s1a.no", + "stokke.no", + "stor-elvdal.no", + "stord.no", + "stordal.no", + "storfjord.no", + "omasvuotna.no", + "strand.no", + "stranda.no", + "stryn.no", + "sula.no", + "suldal.no", + "sund.no", + "sunndal.no", + "surnadal.no", + "sveio.no", + "svelvik.no", + "sykkylven.no", + "sogne.no", + "xn--sgne-gra.no", + "somna.no", + "xn--smna-gra.no", + "sondre-land.no", + "xn--sndre-land-0cb.no", + "sor-aurdal.no", + "xn--sr-aurdal-l8a.no", + "sor-fron.no", + "xn--sr-fron-q1a.no", + "sor-odal.no", + "xn--sr-odal-q1a.no", + "sor-varanger.no", + "xn--sr-varanger-ggb.no", + "matta-varjjat.no", + "xn--mtta-vrjjat-k7af.no", + "sorfold.no", + "xn--srfold-bya.no", + "sorreisa.no", + "xn--srreisa-q1a.no", + "sorum.no", + "xn--srum-gra.no", + "tana.no", + "deatnu.no", + "time.no", + "tingvoll.no", + "tinn.no", + "tjeldsund.no", + "dielddanuorri.no", + "tjome.no", + "xn--tjme-hra.no", + "tokke.no", + "tolga.no", + "torsken.no", + "tranoy.no", + "xn--trany-yua.no", + "tromso.no", + "xn--troms-zua.no", + "tromsa.no", + "romsa.no", + "trondheim.no", + "troandin.no", + "trysil.no", + "trana.no", + "xn--trna-woa.no", + "trogstad.no", + "xn--trgstad-r1a.no", + "tvedestrand.no", + "tydal.no", + "tynset.no", + "tysfjord.no", + "divtasvuodna.no", + "divttasvuotna.no", + "tysnes.no", + "tysvar.no", + "xn--tysvr-vra.no", + "tonsberg.no", + "xn--tnsberg-q1a.no", + "ullensaker.no", + "ullensvang.no", + "ulvik.no", + "utsira.no", + "vadso.no", + "xn--vads-jra.no", + "cahcesuolo.no", + "xn--hcesuolo-7ya35b.no", + "vaksdal.no", + "valle.no", + "vang.no", + "vanylven.no", + "vardo.no", + "xn--vard-jra.no", + "varggat.no", + "xn--vrggt-xqad.no", + "vefsn.no", + "vaapste.no", + "vega.no", + "vegarshei.no", + "xn--vegrshei-c0a.no", + "vennesla.no", + "verdal.no", + "verran.no", + "vestby.no", + "vestnes.no", + "vestre-slidre.no", + "vestre-toten.no", + "vestvagoy.no", + "xn--vestvgy-ixa6o.no", + "vevelstad.no", + "vik.no", + "vikna.no", + "vindafjord.no", + "volda.no", + "voss.no", + "varoy.no", + "xn--vry-yla5g.no", + "vagan.no", + "xn--vgan-qoa.no", + "voagat.no", + "vagsoy.no", + "xn--vgsy-qoa0j.no", + "vaga.no", + "xn--vg-yiab.no", + "valer.ostfold.no", + "xn--vler-qoa.xn--stfold-9xa.no", + "valer.hedmark.no", + "xn--vler-qoa.hedmark.no", + "*.np", + "nr", + "biz.nr", + "info.nr", + "gov.nr", + "edu.nr", + "org.nr", + "net.nr", + "com.nr", + "nu", + "nz", + "ac.nz", + "co.nz", + "cri.nz", + "geek.nz", + "gen.nz", + "govt.nz", + "health.nz", + "iwi.nz", + "kiwi.nz", + "maori.nz", + "mil.nz", + "xn--mori-qsa.nz", + "net.nz", + "org.nz", + "parliament.nz", + "school.nz", + "om", + "co.om", + "com.om", + "edu.om", + "gov.om", + "med.om", + "museum.om", + "net.om", + "org.om", + "pro.om", + "onion", + "org", + "pa", + "ac.pa", + "gob.pa", + "com.pa", + "org.pa", + "sld.pa", + "edu.pa", + "net.pa", + "ing.pa", + "abo.pa", + "med.pa", + "nom.pa", + "pe", + "edu.pe", + "gob.pe", + "nom.pe", + "mil.pe", + "org.pe", + "com.pe", + "net.pe", + "pf", + "com.pf", + "org.pf", + "edu.pf", + "*.pg", + "ph", + "com.ph", + "net.ph", + "org.ph", + "gov.ph", + "edu.ph", + "ngo.ph", + "mil.ph", + "i.ph", + "pk", + "com.pk", + "net.pk", + "edu.pk", + "org.pk", + "fam.pk", + "biz.pk", + "web.pk", + "gov.pk", + "gob.pk", + "gok.pk", + "gon.pk", + "gop.pk", + "gos.pk", + "info.pk", + "pl", + "com.pl", + "net.pl", + "org.pl", + "aid.pl", + "agro.pl", + "atm.pl", + "auto.pl", + "biz.pl", + "edu.pl", + "gmina.pl", + "gsm.pl", + "info.pl", + "mail.pl", + "miasta.pl", + "media.pl", + "mil.pl", + "nieruchomosci.pl", + "nom.pl", + "pc.pl", + "powiat.pl", + "priv.pl", + "realestate.pl", + "rel.pl", + "sex.pl", + "shop.pl", + "sklep.pl", + "sos.pl", + "szkola.pl", + "targi.pl", + "tm.pl", + "tourism.pl", + "travel.pl", + "turystyka.pl", + "gov.pl", + "ap.gov.pl", + "ic.gov.pl", + "is.gov.pl", + "us.gov.pl", + "kmpsp.gov.pl", + "kppsp.gov.pl", + "kwpsp.gov.pl", + "psp.gov.pl", + "wskr.gov.pl", + "kwp.gov.pl", + "mw.gov.pl", + "ug.gov.pl", + "um.gov.pl", + "umig.gov.pl", + "ugim.gov.pl", + "upow.gov.pl", + "uw.gov.pl", + "starostwo.gov.pl", + "pa.gov.pl", + "po.gov.pl", + "psse.gov.pl", + "pup.gov.pl", + "rzgw.gov.pl", + "sa.gov.pl", + "so.gov.pl", + "sr.gov.pl", + "wsa.gov.pl", + "sko.gov.pl", + "uzs.gov.pl", + "wiih.gov.pl", + "winb.gov.pl", + "pinb.gov.pl", + "wios.gov.pl", + "witd.gov.pl", + "wzmiuw.gov.pl", + "piw.gov.pl", + "wiw.gov.pl", + "griw.gov.pl", + "wif.gov.pl", + "oum.gov.pl", + "sdn.gov.pl", + "zp.gov.pl", + "uppo.gov.pl", + "mup.gov.pl", + "wuoz.gov.pl", + "konsulat.gov.pl", + "oirm.gov.pl", + "augustow.pl", + "babia-gora.pl", + "bedzin.pl", + "beskidy.pl", + "bialowieza.pl", + "bialystok.pl", + "bielawa.pl", + "bieszczady.pl", + "boleslawiec.pl", + "bydgoszcz.pl", + "bytom.pl", + "cieszyn.pl", + "czeladz.pl", + "czest.pl", + "dlugoleka.pl", + "elblag.pl", + "elk.pl", + "glogow.pl", + "gniezno.pl", + "gorlice.pl", + "grajewo.pl", + "ilawa.pl", + "jaworzno.pl", + "jelenia-gora.pl", + "jgora.pl", + "kalisz.pl", + "kazimierz-dolny.pl", + "karpacz.pl", + "kartuzy.pl", + "kaszuby.pl", + "katowice.pl", + "kepno.pl", + "ketrzyn.pl", + "klodzko.pl", + "kobierzyce.pl", + "kolobrzeg.pl", + "konin.pl", + "konskowola.pl", + "kutno.pl", + "lapy.pl", + "lebork.pl", + "legnica.pl", + "lezajsk.pl", + "limanowa.pl", + "lomza.pl", + "lowicz.pl", + "lubin.pl", + "lukow.pl", + "malbork.pl", + "malopolska.pl", + "mazowsze.pl", + "mazury.pl", + "mielec.pl", + "mielno.pl", + "mragowo.pl", + "naklo.pl", + "nowaruda.pl", + "nysa.pl", + "olawa.pl", + "olecko.pl", + "olkusz.pl", + "olsztyn.pl", + "opoczno.pl", + "opole.pl", + "ostroda.pl", + "ostroleka.pl", + "ostrowiec.pl", + "ostrowwlkp.pl", + "pila.pl", + "pisz.pl", + "podhale.pl", + "podlasie.pl", + "polkowice.pl", + "pomorze.pl", + "pomorskie.pl", + "prochowice.pl", + "pruszkow.pl", + "przeworsk.pl", + "pulawy.pl", + "radom.pl", + "rawa-maz.pl", + "rybnik.pl", + "rzeszow.pl", + "sanok.pl", + "sejny.pl", + "slask.pl", + "slupsk.pl", + "sosnowiec.pl", + "stalowa-wola.pl", + "skoczow.pl", + "starachowice.pl", + "stargard.pl", + "suwalki.pl", + "swidnica.pl", + "swiebodzin.pl", + "swinoujscie.pl", + "szczecin.pl", + "szczytno.pl", + "tarnobrzeg.pl", + "tgory.pl", + "turek.pl", + "tychy.pl", + "ustka.pl", + "walbrzych.pl", + "warmia.pl", + "warszawa.pl", + "waw.pl", + "wegrow.pl", + "wielun.pl", + "wlocl.pl", + "wloclawek.pl", + "wodzislaw.pl", + "wolomin.pl", + "wroclaw.pl", + "zachpomor.pl", + "zagan.pl", + "zarow.pl", + "zgora.pl", + "zgorzelec.pl", + "pm", + "pn", + "gov.pn", + "co.pn", + "org.pn", + "edu.pn", + "net.pn", + "post", + "pr", + "com.pr", + "net.pr", + "org.pr", + "gov.pr", + "edu.pr", + "isla.pr", + "pro.pr", + "biz.pr", + "info.pr", + "name.pr", + "est.pr", + "prof.pr", + "ac.pr", + "pro", + "aaa.pro", + "aca.pro", + "acct.pro", + "avocat.pro", + "bar.pro", + "cpa.pro", + "eng.pro", + "jur.pro", + "law.pro", + "med.pro", + "recht.pro", + "ps", + "edu.ps", + "gov.ps", + "sec.ps", + "plo.ps", + "com.ps", + "org.ps", + "net.ps", + "pt", + "net.pt", + "gov.pt", + "org.pt", + "edu.pt", + "int.pt", + "publ.pt", + "com.pt", + "nome.pt", + "pw", + "co.pw", + "ne.pw", + "or.pw", + "ed.pw", + "go.pw", + "belau.pw", + "py", + "com.py", + "coop.py", + "edu.py", + "gov.py", + "mil.py", + "net.py", + "org.py", + "qa", + "com.qa", + "edu.qa", + "gov.qa", + "mil.qa", + "name.qa", + "net.qa", + "org.qa", + "sch.qa", + "re", + "asso.re", + "com.re", + "nom.re", + "ro", + "arts.ro", + "com.ro", + "firm.ro", + "info.ro", + "nom.ro", + "nt.ro", + "org.ro", + "rec.ro", + "store.ro", + "tm.ro", + "www.ro", + "rs", + "ac.rs", + "co.rs", + "edu.rs", + "gov.rs", + "in.rs", + "org.rs", + "ru", + "ac.ru", + "edu.ru", + "gov.ru", + "int.ru", + "mil.ru", + "test.ru", + "rw", + "gov.rw", + "net.rw", + "edu.rw", + "ac.rw", + "com.rw", + "co.rw", + "int.rw", + "mil.rw", + "gouv.rw", + "sa", + "com.sa", + "net.sa", + "org.sa", + "gov.sa", + "med.sa", + "pub.sa", + "edu.sa", + "sch.sa", + "sb", + "com.sb", + "edu.sb", + "gov.sb", + "net.sb", + "org.sb", + "sc", + "com.sc", + "gov.sc", + "net.sc", + "org.sc", + "edu.sc", + "sd", + "com.sd", + "net.sd", + "org.sd", + "edu.sd", + "med.sd", + "tv.sd", + "gov.sd", + "info.sd", + "se", + "a.se", + "ac.se", + "b.se", + "bd.se", + "brand.se", + "c.se", + "d.se", + "e.se", + "f.se", + "fh.se", + "fhsk.se", + "fhv.se", + "g.se", + "h.se", + "i.se", + "k.se", + "komforb.se", + "kommunalforbund.se", + "komvux.se", + "l.se", + "lanbib.se", + "m.se", + "n.se", + "naturbruksgymn.se", + "o.se", + "org.se", + "p.se", + "parti.se", + "pp.se", + "press.se", + "r.se", + "s.se", + "t.se", + "tm.se", + "u.se", + "w.se", + "x.se", + "y.se", + "z.se", + "sg", + "com.sg", + "net.sg", + "org.sg", + "gov.sg", + "edu.sg", + "per.sg", + "sh", + "com.sh", + "net.sh", + "gov.sh", + "org.sh", + "mil.sh", + "si", + "sj", + "sk", + "sl", + "com.sl", + "net.sl", + "edu.sl", + "gov.sl", + "org.sl", + "sm", + "sn", + "art.sn", + "com.sn", + "edu.sn", + "gouv.sn", + "org.sn", + "perso.sn", + "univ.sn", + "so", + "com.so", + "net.so", + "org.so", + "sr", + "st", + "co.st", + "com.st", + "consulado.st", + "edu.st", + "embaixada.st", + "gov.st", + "mil.st", + "net.st", + "org.st", + "principe.st", + "saotome.st", + "store.st", + "su", + "sv", + "com.sv", + "edu.sv", + "gob.sv", + "org.sv", + "red.sv", + "sx", + "gov.sx", + "sy", + "edu.sy", + "gov.sy", + "net.sy", + "mil.sy", + "com.sy", + "org.sy", + "sz", + "co.sz", + "ac.sz", + "org.sz", + "tc", + "td", + "tel", + "tf", + "tg", + "th", + "ac.th", + "co.th", + "go.th", + "in.th", + "mi.th", + "net.th", + "or.th", + "tj", + "ac.tj", + "biz.tj", + "co.tj", + "com.tj", + "edu.tj", + "go.tj", + "gov.tj", + "int.tj", + "mil.tj", + "name.tj", + "net.tj", + "nic.tj", + "org.tj", + "test.tj", + "web.tj", + "tk", + "tl", + "gov.tl", + "tm", + "com.tm", + "co.tm", + "org.tm", + "net.tm", + "nom.tm", + "gov.tm", + "mil.tm", + "edu.tm", + "tn", + "com.tn", + "ens.tn", + "fin.tn", + "gov.tn", + "ind.tn", + "intl.tn", + "nat.tn", + "net.tn", + "org.tn", + "info.tn", + "perso.tn", + "tourism.tn", + "edunet.tn", + "rnrt.tn", + "rns.tn", + "rnu.tn", + "mincom.tn", + "agrinet.tn", + "defense.tn", + "turen.tn", + "to", + "com.to", + "gov.to", + "net.to", + "org.to", + "edu.to", + "mil.to", + "tr", + "com.tr", + "info.tr", + "biz.tr", + "net.tr", + "org.tr", + "web.tr", + "gen.tr", + "tv.tr", + "av.tr", + "dr.tr", + "bbs.tr", + "name.tr", + "tel.tr", + "gov.tr", + "bel.tr", + "pol.tr", + "mil.tr", + "k12.tr", + "edu.tr", + "kep.tr", + "nc.tr", + "gov.nc.tr", + "travel", + "tt", + "co.tt", + "com.tt", + "org.tt", + "net.tt", + "biz.tt", + "info.tt", + "pro.tt", + "int.tt", + "coop.tt", + "jobs.tt", + "mobi.tt", + "travel.tt", + "museum.tt", + "aero.tt", + "name.tt", + "gov.tt", + "edu.tt", + "tv", + "tw", + "edu.tw", + "gov.tw", + "mil.tw", + "com.tw", + "net.tw", + "org.tw", + "idv.tw", + "game.tw", + "ebiz.tw", + "club.tw", + "xn--zf0ao64a.tw", + "xn--uc0atv.tw", + "xn--czrw28b.tw", + "tz", + "ac.tz", + "co.tz", + "go.tz", + "hotel.tz", + "info.tz", + "me.tz", + "mil.tz", + "mobi.tz", + "ne.tz", + "or.tz", + "sc.tz", + "tv.tz", + "ua", + "com.ua", + "edu.ua", + "gov.ua", + "in.ua", + "net.ua", + "org.ua", + "cherkassy.ua", + "cherkasy.ua", + "chernigov.ua", + "chernihiv.ua", + "chernivtsi.ua", + "chernovtsy.ua", + "ck.ua", + "cn.ua", + "cr.ua", + "crimea.ua", + "cv.ua", + "dn.ua", + "dnepropetrovsk.ua", + "dnipropetrovsk.ua", + "dominic.ua", + "donetsk.ua", + "dp.ua", + "if.ua", + "ivano-frankivsk.ua", + "kh.ua", + "kharkiv.ua", + "kharkov.ua", + "kherson.ua", + "khmelnitskiy.ua", + "khmelnytskyi.ua", + "kiev.ua", + "kirovograd.ua", + "km.ua", + "kr.ua", + "krym.ua", + "ks.ua", + "kv.ua", + "kyiv.ua", + "lg.ua", + "lt.ua", + "lugansk.ua", + "lutsk.ua", + "lv.ua", + "lviv.ua", + "mk.ua", + "mykolaiv.ua", + "nikolaev.ua", + "od.ua", + "odesa.ua", + "odessa.ua", + "pl.ua", + "poltava.ua", + "rivne.ua", + "rovno.ua", + "rv.ua", + "sb.ua", + "sebastopol.ua", + "sevastopol.ua", + "sm.ua", + "sumy.ua", + "te.ua", + "ternopil.ua", + "uz.ua", + "uzhgorod.ua", + "vinnica.ua", + "vinnytsia.ua", + "vn.ua", + "volyn.ua", + "yalta.ua", + "zaporizhzhe.ua", + "zaporizhzhia.ua", + "zhitomir.ua", + "zhytomyr.ua", + "zp.ua", + "zt.ua", + "ug", + "co.ug", + "or.ug", + "ac.ug", + "sc.ug", + "go.ug", + "ne.ug", + "com.ug", + "org.ug", + "uk", + "ac.uk", + "co.uk", + "gov.uk", + "ltd.uk", + "me.uk", + "net.uk", + "nhs.uk", + "org.uk", + "plc.uk", + "police.uk", + "*.sch.uk", + "us", + "dni.us", + "fed.us", + "isa.us", + "kids.us", + "nsn.us", + "ak.us", + "al.us", + "ar.us", + "as.us", + "az.us", + "ca.us", + "co.us", + "ct.us", + "dc.us", + "de.us", + "fl.us", + "ga.us", + "gu.us", + "hi.us", + "ia.us", + "id.us", + "il.us", + "in.us", + "ks.us", + "ky.us", + "la.us", + "ma.us", + "md.us", + "me.us", + "mi.us", + "mn.us", + "mo.us", + "ms.us", + "mt.us", + "nc.us", + "nd.us", + "ne.us", + "nh.us", + "nj.us", + "nm.us", + "nv.us", + "ny.us", + "oh.us", + "ok.us", + "or.us", + "pa.us", + "pr.us", + "ri.us", + "sc.us", + "sd.us", + "tn.us", + "tx.us", + "ut.us", + "vi.us", + "vt.us", + "va.us", + "wa.us", + "wi.us", + "wv.us", + "wy.us", + "k12.ak.us", + "k12.al.us", + "k12.ar.us", + "k12.as.us", + "k12.az.us", + "k12.ca.us", + "k12.co.us", + "k12.ct.us", + "k12.dc.us", + "k12.de.us", + "k12.fl.us", + "k12.ga.us", + "k12.gu.us", + "k12.ia.us", + "k12.id.us", + "k12.il.us", + "k12.in.us", + "k12.ks.us", + "k12.ky.us", + "k12.la.us", + "k12.ma.us", + "k12.md.us", + "k12.me.us", + "k12.mi.us", + "k12.mn.us", + "k12.mo.us", + "k12.ms.us", + "k12.mt.us", + "k12.nc.us", + "k12.ne.us", + "k12.nh.us", + "k12.nj.us", + "k12.nm.us", + "k12.nv.us", + "k12.ny.us", + "k12.oh.us", + "k12.ok.us", + "k12.or.us", + "k12.pa.us", + "k12.pr.us", + "k12.ri.us", + "k12.sc.us", + "k12.tn.us", + "k12.tx.us", + "k12.ut.us", + "k12.vi.us", + "k12.vt.us", + "k12.va.us", + "k12.wa.us", + "k12.wi.us", + "k12.wy.us", + "cc.ak.us", + "cc.al.us", + "cc.ar.us", + "cc.as.us", + "cc.az.us", + "cc.ca.us", + "cc.co.us", + "cc.ct.us", + "cc.dc.us", + "cc.de.us", + "cc.fl.us", + "cc.ga.us", + "cc.gu.us", + "cc.hi.us", + "cc.ia.us", + "cc.id.us", + "cc.il.us", + "cc.in.us", + "cc.ks.us", + "cc.ky.us", + "cc.la.us", + "cc.ma.us", + "cc.md.us", + "cc.me.us", + "cc.mi.us", + "cc.mn.us", + "cc.mo.us", + "cc.ms.us", + "cc.mt.us", + "cc.nc.us", + "cc.nd.us", + "cc.ne.us", + "cc.nh.us", + "cc.nj.us", + "cc.nm.us", + "cc.nv.us", + "cc.ny.us", + "cc.oh.us", + "cc.ok.us", + "cc.or.us", + "cc.pa.us", + "cc.pr.us", + "cc.ri.us", + "cc.sc.us", + "cc.sd.us", + "cc.tn.us", + "cc.tx.us", + "cc.ut.us", + "cc.vi.us", + "cc.vt.us", + "cc.va.us", + "cc.wa.us", + "cc.wi.us", + "cc.wv.us", + "cc.wy.us", + "lib.ak.us", + "lib.al.us", + "lib.ar.us", + "lib.as.us", + "lib.az.us", + "lib.ca.us", + "lib.co.us", + "lib.ct.us", + "lib.dc.us", + "lib.fl.us", + "lib.ga.us", + "lib.gu.us", + "lib.hi.us", + "lib.ia.us", + "lib.id.us", + "lib.il.us", + "lib.in.us", + "lib.ks.us", + "lib.ky.us", + "lib.la.us", + "lib.ma.us", + "lib.md.us", + "lib.me.us", + "lib.mi.us", + "lib.mn.us", + "lib.mo.us", + "lib.ms.us", + "lib.mt.us", + "lib.nc.us", + "lib.nd.us", + "lib.ne.us", + "lib.nh.us", + "lib.nj.us", + "lib.nm.us", + "lib.nv.us", + "lib.ny.us", + "lib.oh.us", + "lib.ok.us", + "lib.or.us", + "lib.pa.us", + "lib.pr.us", + "lib.ri.us", + "lib.sc.us", + "lib.sd.us", + "lib.tn.us", + "lib.tx.us", + "lib.ut.us", + "lib.vi.us", + "lib.vt.us", + "lib.va.us", + "lib.wa.us", + "lib.wi.us", + "lib.wy.us", + "pvt.k12.ma.us", + "chtr.k12.ma.us", + "paroch.k12.ma.us", + "ann-arbor.mi.us", + "cog.mi.us", + "dst.mi.us", + "eaton.mi.us", + "gen.mi.us", + "mus.mi.us", + "tec.mi.us", + "washtenaw.mi.us", + "uy", + "com.uy", + "edu.uy", + "gub.uy", + "mil.uy", + "net.uy", + "org.uy", + "uz", + "co.uz", + "com.uz", + "net.uz", + "org.uz", + "va", + "vc", + "com.vc", + "net.vc", + "org.vc", + "gov.vc", + "mil.vc", + "edu.vc", + "ve", + "arts.ve", + "co.ve", + "com.ve", + "e12.ve", + "edu.ve", + "firm.ve", + "gob.ve", + "gov.ve", + "info.ve", + "int.ve", + "mil.ve", + "net.ve", + "org.ve", + "rec.ve", + "store.ve", + "tec.ve", + "web.ve", + "vg", + "vi", + "co.vi", + "com.vi", + "k12.vi", + "net.vi", + "org.vi", + "vn", + "com.vn", + "net.vn", + "org.vn", + "edu.vn", + "gov.vn", + "int.vn", + "ac.vn", + "biz.vn", + "info.vn", + "name.vn", + "pro.vn", + "health.vn", + "vu", + "com.vu", + "edu.vu", + "net.vu", + "org.vu", + "wf", + "ws", + "com.ws", + "net.ws", + "org.ws", + "gov.ws", + "edu.ws", + "yt", + "xn--mgbaam7a8h", + "xn--y9a3aq", + "xn--54b7fta0cc", + "xn--90ae", + "xn--90ais", + "xn--fiqs8s", + "xn--fiqz9s", + "xn--lgbbat1ad8j", + "xn--wgbh1c", + "xn--e1a4c", + "xn--node", + "xn--qxam", + "xn--j6w193g", + "xn--2scrj9c", + "xn--3hcrj9c", + "xn--45br5cyl", + "xn--h2breg3eve", + "xn--h2brj9c8c", + "xn--mgbgu82a", + "xn--rvc1e0am3e", + "xn--h2brj9c", + "xn--mgbbh1a71e", + "xn--fpcrj9c3d", + "xn--gecrj9c", + "xn--s9brj9c", + "xn--45brj9c", + "xn--xkc2dl3a5ee0h", + "xn--mgba3a4f16a", + "xn--mgba3a4fra", + "xn--mgbtx2b", + "xn--mgbayh7gpa", + "xn--3e0b707e", + "xn--80ao21a", + "xn--fzc2c9e2c", + "xn--xkc2al3hye2a", + "xn--mgbc0a9azcg", + "xn--d1alf", + "xn--l1acc", + "xn--mix891f", + "xn--mix082f", + "xn--mgbx4cd0ab", + "xn--mgb9awbf", + "xn--mgbai9azgqp6j", + "xn--mgbai9a5eva00b", + "xn--ygbi2ammx", + "xn--90a3ac", + "xn--o1ac.xn--90a3ac", + "xn--c1avg.xn--90a3ac", + "xn--90azh.xn--90a3ac", + "xn--d1at.xn--90a3ac", + "xn--o1ach.xn--90a3ac", + "xn--80au.xn--90a3ac", + "xn--p1ai", + "xn--wgbl6a", + "xn--mgberp4a5d4ar", + "xn--mgberp4a5d4a87g", + "xn--mgbqly7c0a67fbc", + "xn--mgbqly7cvafr", + "xn--mgbpl2fh", + "xn--yfro4i67o", + "xn--clchc0ea0b2g2a9gcd", + "xn--ogbpf8fl", + "xn--mgbtf8fl", + "xn--o3cw4h", + "xn--12c1fe0br.xn--o3cw4h", + "xn--12co0c3b4eva.xn--o3cw4h", + "xn--h3cuzk1di.xn--o3cw4h", + "xn--o3cyx2a.xn--o3cw4h", + "xn--m3ch0j3a.xn--o3cw4h", + "xn--12cfi8ixb8l.xn--o3cw4h", + "xn--pgbs0dh", + "xn--kpry57d", + "xn--kprw13d", + "xn--nnx388a", + "xn--j1amh", + "xn--mgb2ddes", + "xxx", + "*.ye", + "ac.za", + "agric.za", + "alt.za", + "co.za", + "edu.za", + "gov.za", + "grondar.za", + "law.za", + "mil.za", + "net.za", + "ngo.za", + "nis.za", + "nom.za", + "org.za", + "school.za", + "tm.za", + "web.za", + "zm", + "ac.zm", + "biz.zm", + "co.zm", + "com.zm", + "edu.zm", + "gov.zm", + "info.zm", + "mil.zm", + "net.zm", + "org.zm", + "sch.zm", + "zw", + "ac.zw", + "co.zw", + "gov.zw", + "mil.zw", + "org.zw", + "aaa", + "aarp", + "abarth", + "abb", + "abbott", + "abbvie", + "abc", + "able", + "abogado", + "abudhabi", + "academy", + "accenture", + "accountant", + "accountants", + "aco", + "active", + "actor", + "adac", + "ads", + "adult", + "aeg", + "aetna", + "afamilycompany", + "afl", + "africa", + "agakhan", + "agency", + "aig", + "aigo", + "airbus", + "airforce", + "airtel", + "akdn", + "alfaromeo", + "alibaba", + "alipay", + "allfinanz", + "allstate", + "ally", + "alsace", + "alstom", + "americanexpress", + "americanfamily", + "amex", + "amfam", + "amica", + "amsterdam", + "analytics", + "android", + "anquan", + "anz", + "aol", + "apartments", + "app", + "apple", + "aquarelle", + "arab", + "aramco", + "archi", + "army", + "art", + "arte", + "asda", + "associates", + "athleta", + "attorney", + "auction", + "audi", + "audible", + "audio", + "auspost", + "author", + "auto", + "autos", + "avianca", + "aws", + "axa", + "azure", + "baby", + "baidu", + "banamex", + "bananarepublic", + "band", + "bank", + "bar", + "barcelona", + "barclaycard", + "barclays", + "barefoot", + "bargains", + "baseball", + "basketball", + "bauhaus", + "bayern", + "bbc", + "bbt", + "bbva", + "bcg", + "bcn", + "beats", + "beauty", + "beer", + "bentley", + "berlin", + "best", + "bestbuy", + "bet", + "bharti", + "bible", + "bid", + "bike", + "bing", + "bingo", + "bio", + "black", + "blackfriday", + "blanco", + "blockbuster", + "blog", + "bloomberg", + "blue", + "bms", + "bmw", + "bnl", + "bnpparibas", + "boats", + "boehringer", + "bofa", + "bom", + "bond", + "boo", + "book", + "booking", + "boots", + "bosch", + "bostik", + "boston", + "bot", + "boutique", + "box", + "bradesco", + "bridgestone", + "broadway", + "broker", + "brother", + "brussels", + "budapest", + "bugatti", + "build", + "builders", + "business", + "buy", + "buzz", + "bzh", + "cab", + "cafe", + "cal", + "call", + "calvinklein", + "cam", + "camera", + "camp", + "cancerresearch", + "canon", + "capetown", + "capital", + "capitalone", + "car", + "caravan", + "cards", + "care", + "career", + "careers", + "cars", + "cartier", + "casa", + "case", + "caseih", + "cash", + "casino", + "catering", + "catholic", + "cba", + "cbn", + "cbre", + "cbs", + "ceb", + "center", + "ceo", + "cern", + "cfa", + "cfd", + "chanel", + "channel", + "chase", + "chat", + "cheap", + "chintai", + "chloe", + "christmas", + "chrome", + "chrysler", + "church", + "cipriani", + "circle", + "cisco", + "citadel", + "citi", + "citic", + "city", + "cityeats", + "claims", + "cleaning", + "click", + "clinic", + "clinique", + "clothing", + "cloud", + "club", + "clubmed", + "coach", + "codes", + "coffee", + "college", + "cologne", + "comcast", + "commbank", + "community", + "company", + "compare", + "computer", + "comsec", + "condos", + "construction", + "consulting", + "contact", + "contractors", + "cooking", + "cookingchannel", + "cool", + "corsica", + "country", + "coupon", + "coupons", + "courses", + "credit", + "creditcard", + "creditunion", + "cricket", + "crown", + "crs", + "cruise", + "cruises", + "csc", + "cuisinella", + "cymru", + "cyou", + "dabur", + "dad", + "dance", + "data", + "date", + "dating", + "datsun", + "day", + "dclk", + "dds", + "deal", + "dealer", + "deals", + "degree", + "delivery", + "dell", + "deloitte", + "delta", + "democrat", + "dental", + "dentist", + "desi", + "design", + "dev", + "dhl", + "diamonds", + "diet", + "digital", + "direct", + "directory", + "discount", + "discover", + "dish", + "diy", + "dnp", + "docs", + "doctor", + "dodge", + "dog", + "doha", + "domains", + "dot", + "download", + "drive", + "dtv", + "dubai", + "duck", + "dunlop", + "duns", + "dupont", + "durban", + "dvag", + "dvr", + "earth", + "eat", + "eco", + "edeka", + "education", + "email", + "emerck", + "energy", + "engineer", + "engineering", + "enterprises", + "epost", + "epson", + "equipment", + "ericsson", + "erni", + "esq", + "estate", + "esurance", + "etisalat", + "eurovision", + "eus", + "events", + "everbank", + "exchange", + "expert", + "exposed", + "express", + "extraspace", + "fage", + "fail", + "fairwinds", + "faith", + "family", + "fan", + "fans", + "farm", + "farmers", + "fashion", + "fast", + "fedex", + "feedback", + "ferrari", + "ferrero", + "fiat", + "fidelity", + "fido", + "film", + "final", + "finance", + "financial", + "fire", + "firestone", + "firmdale", + "fish", + "fishing", + "fit", + "fitness", + "flickr", + "flights", + "flir", + "florist", + "flowers", + "fly", + "foo", + "food", + "foodnetwork", + "football", + "ford", + "forex", + "forsale", + "forum", + "foundation", + "fox", + "free", + "fresenius", + "frl", + "frogans", + "frontdoor", + "frontier", + "ftr", + "fujitsu", + "fujixerox", + "fun", + "fund", + "furniture", + "futbol", + "fyi", + "gal", + "gallery", + "gallo", + "gallup", + "game", + "games", + "gap", + "garden", + "gbiz", + "gdn", + "gea", + "gent", + "genting", + "george", + "ggee", + "gift", + "gifts", + "gives", + "giving", + "glade", + "glass", + "gle", + "global", + "globo", + "gmail", + "gmbh", + "gmo", + "gmx", + "godaddy", + "gold", + "goldpoint", + "golf", + "goo", + "goodhands", + "goodyear", + "goog", + "google", + "gop", + "got", + "grainger", + "graphics", + "gratis", + "green", + "gripe", + "grocery", + "group", + "guardian", + "gucci", + "guge", + "guide", + "guitars", + "guru", + "hair", + "hamburg", + "hangout", + "haus", + "hbo", + "hdfc", + "hdfcbank", + "health", + "healthcare", + "help", + "helsinki", + "here", + "hermes", + "hgtv", + "hiphop", + "hisamitsu", + "hitachi", + "hiv", + "hkt", + "hockey", + "holdings", + "holiday", + "homedepot", + "homegoods", + "homes", + "homesense", + "honda", + "honeywell", + "horse", + "hospital", + "host", + "hosting", + "hot", + "hoteles", + "hotels", + "hotmail", + "house", + "how", + "hsbc", + "htc", + "hughes", + "hyatt", + "hyundai", + "ibm", + "icbc", + "ice", + "icu", + "ieee", + "ifm", + "ikano", + "imamat", + "imdb", + "immo", + "immobilien", + "industries", + "infiniti", + "ing", + "ink", + "institute", + "insurance", + "insure", + "intel", + "international", + "intuit", + "investments", + "ipiranga", + "irish", + "iselect", + "ismaili", + "ist", + "istanbul", + "itau", + "itv", + "iveco", + "iwc", + "jaguar", + "java", + "jcb", + "jcp", + "jeep", + "jetzt", + "jewelry", + "jio", + "jlc", + "jll", + "jmp", + "jnj", + "joburg", + "jot", + "joy", + "jpmorgan", + "jprs", + "juegos", + "juniper", + "kaufen", + "kddi", + "kerryhotels", + "kerrylogistics", + "kerryproperties", + "kfh", + "kia", + "kim", + "kinder", + "kindle", + "kitchen", + "kiwi", + "koeln", + "komatsu", + "kosher", + "kpmg", + "kpn", + "krd", + "kred", + "kuokgroup", + "kyoto", + "lacaixa", + "ladbrokes", + "lamborghini", + "lamer", + "lancaster", + "lancia", + "lancome", + "land", + "landrover", + "lanxess", + "lasalle", + "lat", + "latino", + "latrobe", + "law", + "lawyer", + "lds", + "lease", + "leclerc", + "lefrak", + "legal", + "lego", + "lexus", + "lgbt", + "liaison", + "lidl", + "life", + "lifeinsurance", + "lifestyle", + "lighting", + "like", + "lilly", + "limited", + "limo", + "lincoln", + "linde", + "link", + "lipsy", + "live", + "living", + "lixil", + "loan", + "loans", + "locker", + "locus", + "loft", + "lol", + "london", + "lotte", + "lotto", + "love", + "lpl", + "lplfinancial", + "ltd", + "ltda", + "lundbeck", + "lupin", + "luxe", + "luxury", + "macys", + "madrid", + "maif", + "maison", + "makeup", + "man", + "management", + "mango", + "map", + "market", + "marketing", + "markets", + "marriott", + "marshalls", + "maserati", + "mattel", + "mba", + "mcd", + "mcdonalds", + "mckinsey", + "med", + "media", + "meet", + "melbourne", + "meme", + "memorial", + "men", + "menu", + "meo", + "merckmsd", + "metlife", + "miami", + "microsoft", + "mini", + "mint", + "mit", + "mitsubishi", + "mlb", + "mls", + "mma", + "mobile", + "mobily", + "moda", + "moe", + "moi", + "mom", + "monash", + "money", + "monster", + "montblanc", + "mopar", + "mormon", + "mortgage", + "moscow", + "moto", + "motorcycles", + "mov", + "movie", + "movistar", + "msd", + "mtn", + "mtpc", + "mtr", + "mutual", + "nab", + "nadex", + "nagoya", + "nationwide", + "natura", + "navy", + "nba", + "nec", + "netbank", + "netflix", + "network", + "neustar", + "new", + "newholland", + "news", + "next", + "nextdirect", + "nexus", + "nfl", + "ngo", + "nhk", + "nico", + "nike", + "nikon", + "ninja", + "nissan", + "nissay", + "nokia", + "northwesternmutual", + "norton", + "now", + "nowruz", + "nowtv", + "nra", + "nrw", + "ntt", + "nyc", + "obi", + "observer", + "off", + "office", + "okinawa", + "olayan", + "olayangroup", + "oldnavy", + "ollo", + "omega", + "one", + "ong", + "onl", + "online", + "onyourside", + "ooo", + "open", + "oracle", + "orange", + "organic", + "origins", + "osaka", + "otsuka", + "ott", + "ovh", + "page", + "pamperedchef", + "panasonic", + "panerai", + "paris", + "pars", + "partners", + "parts", + "party", + "passagens", + "pay", + "pccw", + "pet", + "pfizer", + "pharmacy", + "phd", + "philips", + "phone", + "photo", + "photography", + "photos", + "physio", + "piaget", + "pics", + "pictet", + "pictures", + "pid", + "pin", + "ping", + "pink", + "pioneer", + "pizza", + "place", + "play", + "playstation", + "plumbing", + "plus", + "pnc", + "pohl", + "poker", + "politie", + "porn", + "pramerica", + "praxi", + "press", + "prime", + "prod", + "productions", + "prof", + "progressive", + "promo", + "properties", + "property", + "protection", + "pru", + "prudential", + "pub", + "pwc", + "qpon", + "quebec", + "quest", + "qvc", + "racing", + "radio", + "raid", + "read", + "realestate", + "realtor", + "realty", + "recipes", + "red", + "redstone", + "redumbrella", + "rehab", + "reise", + "reisen", + "reit", + "reliance", + "ren", + "rent", + "rentals", + "repair", + "report", + "republican", + "rest", + "restaurant", + "review", + "reviews", + "rexroth", + "rich", + "richardli", + "ricoh", + "rightathome", + "ril", + "rio", + "rip", + "rmit", + "rocher", + "rocks", + "rodeo", + "rogers", + "room", + "rsvp", + "rugby", + "ruhr", + "run", + "rwe", + "ryukyu", + "saarland", + "safe", + "safety", + "sakura", + "sale", + "salon", + "samsclub", + "samsung", + "sandvik", + "sandvikcoromant", + "sanofi", + "sap", + "sapo", + "sarl", + "sas", + "save", + "saxo", + "sbi", + "sbs", + "sca", + "scb", + "schaeffler", + "schmidt", + "scholarships", + "school", + "schule", + "schwarz", + "science", + "scjohnson", + "scor", + "scot", + "search", + "seat", + "secure", + "security", + "seek", + "select", + "sener", + "services", + "ses", + "seven", + "sew", + "sex", + "sexy", + "sfr", + "shangrila", + "sharp", + "shaw", + "shell", + "shia", + "shiksha", + "shoes", + "shop", + "shopping", + "shouji", + "show", + "showtime", + "shriram", + "silk", + "sina", + "singles", + "site", + "ski", + "skin", + "sky", + "skype", + "sling", + "smart", + "smile", + "sncf", + "soccer", + "social", + "softbank", + "software", + "sohu", + "solar", + "solutions", + "song", + "sony", + "soy", + "space", + "spiegel", + "spot", + "spreadbetting", + "srl", + "srt", + "stada", + "staples", + "star", + "starhub", + "statebank", + "statefarm", + "statoil", + "stc", + "stcgroup", + "stockholm", + "storage", + "store", + "stream", + "studio", + "study", + "style", + "sucks", + "supplies", + "supply", + "support", + "surf", + "surgery", + "suzuki", + "swatch", + "swiftcover", + "swiss", + "sydney", + "symantec", + "systems", + "tab", + "taipei", + "talk", + "taobao", + "target", + "tatamotors", + "tatar", + "tattoo", + "tax", + "taxi", + "tci", + "tdk", + "team", + "tech", + "technology", + "telecity", + "telefonica", + "temasek", + "tennis", + "teva", + "thd", + "theater", + "theatre", + "tiaa", + "tickets", + "tienda", + "tiffany", + "tips", + "tires", + "tirol", + "tjmaxx", + "tjx", + "tkmaxx", + "tmall", + "today", + "tokyo", + "tools", + "top", + "toray", + "toshiba", + "total", + "tours", + "town", + "toyota", + "toys", + "trade", + "trading", + "training", + "travelchannel", + "travelers", + "travelersinsurance", + "trust", + "trv", + "tube", + "tui", + "tunes", + "tushu", + "tvs", + "ubank", + "ubs", + "uconnect", + "unicom", + "university", + "uno", + "uol", + "ups", + "vacations", + "vana", + "vanguard", + "vegas", + "ventures", + "verisign", + "versicherung", + "vet", + "viajes", + "video", + "vig", + "viking", + "villas", + "vin", + "vip", + "virgin", + "visa", + "vision", + "vista", + "vistaprint", + "viva", + "vivo", + "vlaanderen", + "vodka", + "volkswagen", + "volvo", + "vote", + "voting", + "voto", + "voyage", + "vuelos", + "wales", + "walmart", + "walter", + "wang", + "wanggou", + "warman", + "watch", + "watches", + "weather", + "weatherchannel", + "webcam", + "weber", + "website", + "wed", + "wedding", + "weibo", + "weir", + "whoswho", + "wien", + "wiki", + "williamhill", + "win", + "windows", + "wine", + "winners", + "wme", + "wolterskluwer", + "woodside", + "work", + "works", + "world", + "wow", + "wtc", + "wtf", + "xbox", + "xerox", + "xfinity", + "xihuan", + "xin", + "xn--11b4c3d", + "xn--1ck2e1b", + "xn--1qqw23a", + "xn--30rr7y", + "xn--3bst00m", + "xn--3ds443g", + "xn--3oq18vl8pn36a", + "xn--3pxu8k", + "xn--42c2d9a", + "xn--45q11c", + "xn--4gbrim", + "xn--55qw42g", + "xn--55qx5d", + "xn--5su34j936bgsg", + "xn--5tzm5g", + "xn--6frz82g", + "xn--6qq986b3xl", + "xn--80adxhks", + "xn--80aqecdr1a", + "xn--80asehdb", + "xn--80aswg", + "xn--8y0a063a", + "xn--9dbq2a", + "xn--9et52u", + "xn--9krt00a", + "xn--b4w605ferd", + "xn--bck1b9a5dre4c", + "xn--c1avg", + "xn--c2br7g", + "xn--cck2b3b", + "xn--cg4bki", + "xn--czr694b", + "xn--czrs0t", + "xn--czru2d", + "xn--d1acj3b", + "xn--eckvdtc9d", + "xn--efvy88h", + "xn--estv75g", + "xn--fct429k", + "xn--fhbei", + "xn--fiq228c5hs", + "xn--fiq64b", + "xn--fjq720a", + "xn--flw351e", + "xn--fzys8d69uvgm", + "xn--g2xx48c", + "xn--gckr3f0f", + "xn--gk3at1e", + "xn--hxt814e", + "xn--i1b6b1a6a2e", + "xn--imr513n", + "xn--io0a7i", + "xn--j1aef", + "xn--jlq61u9w7b", + "xn--jvr189m", + "xn--kcrx77d1x4a", + "xn--kpu716f", + "xn--kput3i", + "xn--mgba3a3ejt", + "xn--mgba7c0bbn0a", + "xn--mgbaakc7dvf", + "xn--mgbab2bd", + "xn--mgbb9fbpob", + "xn--mgbca7dzdo", + "xn--mgbi4ecexp", + "xn--mgbt3dhd", + "xn--mk1bu44c", + "xn--mxtq1m", + "xn--ngbc5azd", + "xn--ngbe9e0a", + "xn--ngbrx", + "xn--nqv7f", + "xn--nqv7fs00ema", + "xn--nyqy26a", + "xn--p1acf", + "xn--pbt977c", + "xn--pssy2u", + "xn--q9jyb4c", + "xn--qcka1pmc", + "xn--rhqv96g", + "xn--rovu88b", + "xn--ses554g", + "xn--t60b56a", + "xn--tckwe", + "xn--tiq49xqyj", + "xn--unup4y", + "xn--vermgensberater-ctb", + "xn--vermgensberatung-pwb", + "xn--vhquv", + "xn--vuq861b", + "xn--w4r85el8fhu5dnra", + "xn--w4rs40l", + "xn--xhq521b", + "xn--zfr164b", + "xperia", + "xyz", + "yachts", + "yahoo", + "yamaxun", + "yandex", + "yodobashi", + "yoga", + "yokohama", + "you", + "youtube", + "yun", + "zappos", + "zara", + "zero", + "zip", + "zippo", + "zone", + "zuerich", + "cc.ua", + "inf.ua", + "ltd.ua", + "beep.pl", + "*.compute.estate", + "*.alces.network", + "*.alwaysdata.net", + "cloudfront.net", + "*.compute.amazonaws.com", + "*.compute-1.amazonaws.com", + "*.compute.amazonaws.com.cn", + "us-east-1.amazonaws.com", + "cn-north-1.eb.amazonaws.com.cn", + "elasticbeanstalk.com", + "ap-northeast-1.elasticbeanstalk.com", + "ap-northeast-2.elasticbeanstalk.com", + "ap-south-1.elasticbeanstalk.com", + "ap-southeast-1.elasticbeanstalk.com", + "ap-southeast-2.elasticbeanstalk.com", + "ca-central-1.elasticbeanstalk.com", + "eu-central-1.elasticbeanstalk.com", + "eu-west-1.elasticbeanstalk.com", + "eu-west-2.elasticbeanstalk.com", + "sa-east-1.elasticbeanstalk.com", + "us-east-1.elasticbeanstalk.com", + "us-east-2.elasticbeanstalk.com", + "us-gov-west-1.elasticbeanstalk.com", + "us-west-1.elasticbeanstalk.com", + "us-west-2.elasticbeanstalk.com", + "*.elb.amazonaws.com", + "*.elb.amazonaws.com.cn", + "s3.amazonaws.com", + "s3-ap-northeast-1.amazonaws.com", + "s3-ap-northeast-2.amazonaws.com", + "s3-ap-south-1.amazonaws.com", + "s3-ap-southeast-1.amazonaws.com", + "s3-ap-southeast-2.amazonaws.com", + "s3-ca-central-1.amazonaws.com", + "s3-eu-central-1.amazonaws.com", + "s3-eu-west-1.amazonaws.com", + "s3-eu-west-2.amazonaws.com", + "s3-external-1.amazonaws.com", + "s3-fips-us-gov-west-1.amazonaws.com", + "s3-sa-east-1.amazonaws.com", + "s3-us-gov-west-1.amazonaws.com", + "s3-us-east-2.amazonaws.com", + "s3-us-west-1.amazonaws.com", + "s3-us-west-2.amazonaws.com", + "s3.ap-northeast-2.amazonaws.com", + "s3.ap-south-1.amazonaws.com", + "s3.cn-north-1.amazonaws.com.cn", + "s3.ca-central-1.amazonaws.com", + "s3.eu-central-1.amazonaws.com", + "s3.eu-west-2.amazonaws.com", + "s3.us-east-2.amazonaws.com", + "s3.dualstack.ap-northeast-1.amazonaws.com", + "s3.dualstack.ap-northeast-2.amazonaws.com", + "s3.dualstack.ap-south-1.amazonaws.com", + "s3.dualstack.ap-southeast-1.amazonaws.com", + "s3.dualstack.ap-southeast-2.amazonaws.com", + "s3.dualstack.ca-central-1.amazonaws.com", + "s3.dualstack.eu-central-1.amazonaws.com", + "s3.dualstack.eu-west-1.amazonaws.com", + "s3.dualstack.eu-west-2.amazonaws.com", + "s3.dualstack.sa-east-1.amazonaws.com", + "s3.dualstack.us-east-1.amazonaws.com", + "s3.dualstack.us-east-2.amazonaws.com", + "s3-website-us-east-1.amazonaws.com", + "s3-website-us-west-1.amazonaws.com", + "s3-website-us-west-2.amazonaws.com", + "s3-website-ap-northeast-1.amazonaws.com", + "s3-website-ap-southeast-1.amazonaws.com", + "s3-website-ap-southeast-2.amazonaws.com", + "s3-website-eu-west-1.amazonaws.com", + "s3-website-sa-east-1.amazonaws.com", + "s3-website.ap-northeast-2.amazonaws.com", + "s3-website.ap-south-1.amazonaws.com", + "s3-website.ca-central-1.amazonaws.com", + "s3-website.eu-central-1.amazonaws.com", + "s3-website.eu-west-2.amazonaws.com", + "s3-website.us-east-2.amazonaws.com", + "t3l3p0rt.net", + "tele.amune.org", + "on-aptible.com", + "user.party.eus", + "pimienta.org", + "poivron.org", + "potager.org", + "sweetpepper.org", + "myasustor.com", + "myfritz.net", + "*.awdev.ca", + "*.advisor.ws", + "backplaneapp.io", + "betainabox.com", + "bnr.la", + "boomla.net", + "boxfuse.io", + "square7.ch", + "bplaced.com", + "bplaced.de", + "square7.de", + "bplaced.net", + "square7.net", + "browsersafetymark.io", + "mycd.eu", + "ae.org", + "ar.com", + "br.com", + "cn.com", + "com.de", + "com.se", + "de.com", + "eu.com", + "gb.com", + "gb.net", + "hu.com", + "hu.net", + "jp.net", + "jpn.com", + "kr.com", + "mex.com", + "no.com", + "qc.com", + "ru.com", + "sa.com", + "se.com", + "se.net", + "uk.com", + "uk.net", + "us.com", + "uy.com", + "za.bz", + "za.com", + "africa.com", + "gr.com", + "in.net", + "us.org", + "co.com", + "c.la", + "certmgr.org", + "xenapponazure.com", + "virtueeldomein.nl", + "c66.me", + "jdevcloud.com", + "wpdevcloud.com", + "cloudaccess.host", + "freesite.host", + "cloudaccess.net", + "cloudcontrolled.com", + "cloudcontrolapp.com", + "co.ca", + "co.cz", + "c.cdn77.org", + "cdn77-ssl.net", + "r.cdn77.net", + "rsc.cdn77.org", + "ssl.origin.cdn77-secure.org", + "cloudns.asia", + "cloudns.biz", + "cloudns.club", + "cloudns.cc", + "cloudns.eu", + "cloudns.in", + "cloudns.info", + "cloudns.org", + "cloudns.pro", + "cloudns.pw", + "cloudns.us", + "co.nl", + "co.no", + "dyn.cosidns.de", + "dynamisches-dns.de", + "dnsupdater.de", + "internet-dns.de", + "l-o-g-i-n.de", + "dynamic-dns.info", + "feste-ip.net", + "knx-server.net", + "static-access.net", + "realm.cz", + "*.cryptonomic.net", + "cupcake.is", + "cyon.link", + "cyon.site", + "daplie.me", + "localhost.daplie.me", + "biz.dk", + "co.dk", + "firm.dk", + "reg.dk", + "store.dk", + "debian.net", + "dedyn.io", + "dnshome.de", + "drayddns.com", + "dreamhosters.com", + "mydrobo.com", + "drud.io", + "drud.us", + "duckdns.org", + "dy.fi", + "tunk.org", + "dyndns-at-home.com", + "dyndns-at-work.com", + "dyndns-blog.com", + "dyndns-free.com", + "dyndns-home.com", + "dyndns-ip.com", + "dyndns-mail.com", + "dyndns-office.com", + "dyndns-pics.com", + "dyndns-remote.com", + "dyndns-server.com", + "dyndns-web.com", + "dyndns-wiki.com", + "dyndns-work.com", + "dyndns.biz", + "dyndns.info", + "dyndns.org", + "dyndns.tv", + "at-band-camp.net", + "ath.cx", + "barrel-of-knowledge.info", + "barrell-of-knowledge.info", + "better-than.tv", + "blogdns.com", + "blogdns.net", + "blogdns.org", + "blogsite.org", + "boldlygoingnowhere.org", + "broke-it.net", + "buyshouses.net", + "cechire.com", + "dnsalias.com", + "dnsalias.net", + "dnsalias.org", + "dnsdojo.com", + "dnsdojo.net", + "dnsdojo.org", + "does-it.net", + "doesntexist.com", + "doesntexist.org", + "dontexist.com", + "dontexist.net", + "dontexist.org", + "doomdns.com", + "doomdns.org", + "dvrdns.org", + "dyn-o-saur.com", + "dynalias.com", + "dynalias.net", + "dynalias.org", + "dynathome.net", + "dyndns.ws", + "endofinternet.net", + "endofinternet.org", + "endoftheinternet.org", + "est-a-la-maison.com", + "est-a-la-masion.com", + "est-le-patron.com", + "est-mon-blogueur.com", + "for-better.biz", + "for-more.biz", + "for-our.info", + "for-some.biz", + "for-the.biz", + "forgot.her.name", + "forgot.his.name", + "from-ak.com", + "from-al.com", + "from-ar.com", + "from-az.net", + "from-ca.com", + "from-co.net", + "from-ct.com", + "from-dc.com", + "from-de.com", + "from-fl.com", + "from-ga.com", + "from-hi.com", + "from-ia.com", + "from-id.com", + "from-il.com", + "from-in.com", + "from-ks.com", + "from-ky.com", + "from-la.net", + "from-ma.com", + "from-md.com", + "from-me.org", + "from-mi.com", + "from-mn.com", + "from-mo.com", + "from-ms.com", + "from-mt.com", + "from-nc.com", + "from-nd.com", + "from-ne.com", + "from-nh.com", + "from-nj.com", + "from-nm.com", + "from-nv.com", + "from-ny.net", + "from-oh.com", + "from-ok.com", + "from-or.com", + "from-pa.com", + "from-pr.com", + "from-ri.com", + "from-sc.com", + "from-sd.com", + "from-tn.com", + "from-tx.com", + "from-ut.com", + "from-va.com", + "from-vt.com", + "from-wa.com", + "from-wi.com", + "from-wv.com", + "from-wy.com", + "ftpaccess.cc", + "fuettertdasnetz.de", + "game-host.org", + "game-server.cc", + "getmyip.com", + "gets-it.net", + "go.dyndns.org", + "gotdns.com", + "gotdns.org", + "groks-the.info", + "groks-this.info", + "ham-radio-op.net", + "here-for-more.info", + "hobby-site.com", + "hobby-site.org", + "home.dyndns.org", + "homedns.org", + "homeftp.net", + "homeftp.org", + "homeip.net", + "homelinux.com", + "homelinux.net", + "homelinux.org", + "homeunix.com", + "homeunix.net", + "homeunix.org", + "iamallama.com", + "in-the-band.net", + "is-a-anarchist.com", + "is-a-blogger.com", + "is-a-bookkeeper.com", + "is-a-bruinsfan.org", + "is-a-bulls-fan.com", + "is-a-candidate.org", + "is-a-caterer.com", + "is-a-celticsfan.org", + "is-a-chef.com", + "is-a-chef.net", + "is-a-chef.org", + "is-a-conservative.com", + "is-a-cpa.com", + "is-a-cubicle-slave.com", + "is-a-democrat.com", + "is-a-designer.com", + "is-a-doctor.com", + "is-a-financialadvisor.com", + "is-a-geek.com", + "is-a-geek.net", + "is-a-geek.org", + "is-a-green.com", + "is-a-guru.com", + "is-a-hard-worker.com", + "is-a-hunter.com", + "is-a-knight.org", + "is-a-landscaper.com", + "is-a-lawyer.com", + "is-a-liberal.com", + "is-a-libertarian.com", + "is-a-linux-user.org", + "is-a-llama.com", + "is-a-musician.com", + "is-a-nascarfan.com", + "is-a-nurse.com", + "is-a-painter.com", + "is-a-patsfan.org", + "is-a-personaltrainer.com", + "is-a-photographer.com", + "is-a-player.com", + "is-a-republican.com", + "is-a-rockstar.com", + "is-a-socialist.com", + "is-a-soxfan.org", + "is-a-student.com", + "is-a-teacher.com", + "is-a-techie.com", + "is-a-therapist.com", + "is-an-accountant.com", + "is-an-actor.com", + "is-an-actress.com", + "is-an-anarchist.com", + "is-an-artist.com", + "is-an-engineer.com", + "is-an-entertainer.com", + "is-by.us", + "is-certified.com", + "is-found.org", + "is-gone.com", + "is-into-anime.com", + "is-into-cars.com", + "is-into-cartoons.com", + "is-into-games.com", + "is-leet.com", + "is-lost.org", + "is-not-certified.com", + "is-saved.org", + "is-slick.com", + "is-uberleet.com", + "is-very-bad.org", + "is-very-evil.org", + "is-very-good.org", + "is-very-nice.org", + "is-very-sweet.org", + "is-with-theband.com", + "isa-geek.com", + "isa-geek.net", + "isa-geek.org", + "isa-hockeynut.com", + "issmarterthanyou.com", + "isteingeek.de", + "istmein.de", + "kicks-ass.net", + "kicks-ass.org", + "knowsitall.info", + "land-4-sale.us", + "lebtimnetz.de", + "leitungsen.de", + "likes-pie.com", + "likescandy.com", + "merseine.nu", + "mine.nu", + "misconfused.org", + "mypets.ws", + "myphotos.cc", + "neat-url.com", + "office-on-the.net", + "on-the-web.tv", + "podzone.net", + "podzone.org", + "readmyblog.org", + "saves-the-whales.com", + "scrapper-site.net", + "scrapping.cc", + "selfip.biz", + "selfip.com", + "selfip.info", + "selfip.net", + "selfip.org", + "sells-for-less.com", + "sells-for-u.com", + "sells-it.net", + "sellsyourhome.org", + "servebbs.com", + "servebbs.net", + "servebbs.org", + "serveftp.net", + "serveftp.org", + "servegame.org", + "shacknet.nu", + "simple-url.com", + "space-to-rent.com", + "stuff-4-sale.org", + "stuff-4-sale.us", + "teaches-yoga.com", + "thruhere.net", + "traeumtgerade.de", + "webhop.biz", + "webhop.info", + "webhop.net", + "webhop.org", + "worse-than.tv", + "writesthisblog.com", + "ddnss.de", + "dyn.ddnss.de", + "dyndns.ddnss.de", + "dyndns1.de", + "dyn-ip24.de", + "home-webserver.de", + "dyn.home-webserver.de", + "myhome-server.de", + "ddnss.org", + "definima.net", + "definima.io", + "ddnsfree.com", + "ddnsgeek.com", + "giize.com", + "gleeze.com", + "kozow.com", + "loseyourip.com", + "ooguy.com", + "theworkpc.com", + "casacam.net", + "dynu.net", + "accesscam.org", + "camdvr.org", + "freeddns.org", + "mywire.org", + "webredirect.org", + "myddns.rocks", + "blogsite.xyz", + "dynv6.net", + "e4.cz", + "mytuleap.com", + "enonic.io", + "customer.enonic.io", + "eu.org", + "al.eu.org", + "asso.eu.org", + "at.eu.org", + "au.eu.org", + "be.eu.org", + "bg.eu.org", + "ca.eu.org", + "cd.eu.org", + "ch.eu.org", + "cn.eu.org", + "cy.eu.org", + "cz.eu.org", + "de.eu.org", + "dk.eu.org", + "edu.eu.org", + "ee.eu.org", + "es.eu.org", + "fi.eu.org", + "fr.eu.org", + "gr.eu.org", + "hr.eu.org", + "hu.eu.org", + "ie.eu.org", + "il.eu.org", + "in.eu.org", + "int.eu.org", + "is.eu.org", + "it.eu.org", + "jp.eu.org", + "kr.eu.org", + "lt.eu.org", + "lu.eu.org", + "lv.eu.org", + "mc.eu.org", + "me.eu.org", + "mk.eu.org", + "mt.eu.org", + "my.eu.org", + "net.eu.org", + "ng.eu.org", + "nl.eu.org", + "no.eu.org", + "nz.eu.org", + "paris.eu.org", + "pl.eu.org", + "pt.eu.org", + "q-a.eu.org", + "ro.eu.org", + "ru.eu.org", + "se.eu.org", + "si.eu.org", + "sk.eu.org", + "tr.eu.org", + "uk.eu.org", + "us.eu.org", + "eu-1.evennode.com", + "eu-2.evennode.com", + "eu-3.evennode.com", + "eu-4.evennode.com", + "us-1.evennode.com", + "us-2.evennode.com", + "us-3.evennode.com", + "us-4.evennode.com", + "twmail.cc", + "twmail.net", + "twmail.org", + "mymailer.com.tw", + "url.tw", + "apps.fbsbx.com", + "ru.net", + "adygeya.ru", + "bashkiria.ru", + "bir.ru", + "cbg.ru", + "com.ru", + "dagestan.ru", + "grozny.ru", + "kalmykia.ru", + "kustanai.ru", + "marine.ru", + "mordovia.ru", + "msk.ru", + "mytis.ru", + "nalchik.ru", + "nov.ru", + "pyatigorsk.ru", + "spb.ru", + "vladikavkaz.ru", + "vladimir.ru", + "abkhazia.su", + "adygeya.su", + "aktyubinsk.su", + "arkhangelsk.su", + "armenia.su", + "ashgabad.su", + "azerbaijan.su", + "balashov.su", + "bashkiria.su", + "bryansk.su", + "bukhara.su", + "chimkent.su", + "dagestan.su", + "east-kazakhstan.su", + "exnet.su", + "georgia.su", + "grozny.su", + "ivanovo.su", + "jambyl.su", + "kalmykia.su", + "kaluga.su", + "karacol.su", + "karaganda.su", + "karelia.su", + "khakassia.su", + "krasnodar.su", + "kurgan.su", + "kustanai.su", + "lenug.su", + "mangyshlak.su", + "mordovia.su", + "msk.su", + "murmansk.su", + "nalchik.su", + "navoi.su", + "north-kazakhstan.su", + "nov.su", + "obninsk.su", + "penza.su", + "pokrovsk.su", + "sochi.su", + "spb.su", + "tashkent.su", + "termez.su", + "togliatti.su", + "troitsk.su", + "tselinograd.su", + "tula.su", + "tuva.su", + "vladikavkaz.su", + "vladimir.su", + "vologda.su", + "channelsdvr.net", + "fastlylb.net", + "map.fastlylb.net", + "freetls.fastly.net", + "map.fastly.net", + "a.prod.fastly.net", + "global.prod.fastly.net", + "a.ssl.fastly.net", + "b.ssl.fastly.net", + "global.ssl.fastly.net", + "fhapp.xyz", + "fedorainfracloud.org", + "fedorapeople.org", + "cloud.fedoraproject.org", + "filegear.me", + "firebaseapp.com", + "flynnhub.com", + "flynnhosting.net", + "freebox-os.com", + "freeboxos.com", + "fbx-os.fr", + "fbxos.fr", + "freebox-os.fr", + "freeboxos.fr", + "myfusion.cloud", + "*.futurecms.at", + "futurehosting.at", + "futuremailing.at", + "*.ex.ortsinfo.at", + "*.kunden.ortsinfo.at", + "*.statics.cloud", + "service.gov.uk", + "github.io", + "githubusercontent.com", + "gitlab.io", + "homeoffice.gov.uk", + "ro.im", + "shop.ro", + "goip.de", + "*.0emm.com", + "appspot.com", + "blogspot.ae", + "blogspot.al", + "blogspot.am", + "blogspot.ba", + "blogspot.be", + "blogspot.bg", + "blogspot.bj", + "blogspot.ca", + "blogspot.cf", + "blogspot.ch", + "blogspot.cl", + "blogspot.co.at", + "blogspot.co.id", + "blogspot.co.il", + "blogspot.co.ke", + "blogspot.co.nz", + "blogspot.co.uk", + "blogspot.co.za", + "blogspot.com", + "blogspot.com.ar", + "blogspot.com.au", + "blogspot.com.br", + "blogspot.com.by", + "blogspot.com.co", + "blogspot.com.cy", + "blogspot.com.ee", + "blogspot.com.eg", + "blogspot.com.es", + "blogspot.com.mt", + "blogspot.com.ng", + "blogspot.com.tr", + "blogspot.com.uy", + "blogspot.cv", + "blogspot.cz", + "blogspot.de", + "blogspot.dk", + "blogspot.fi", + "blogspot.fr", + "blogspot.gr", + "blogspot.hk", + "blogspot.hr", + "blogspot.hu", + "blogspot.ie", + "blogspot.in", + "blogspot.is", + "blogspot.it", + "blogspot.jp", + "blogspot.kr", + "blogspot.li", + "blogspot.lt", + "blogspot.lu", + "blogspot.md", + "blogspot.mk", + "blogspot.mr", + "blogspot.mx", + "blogspot.my", + "blogspot.nl", + "blogspot.no", + "blogspot.pe", + "blogspot.pt", + "blogspot.qa", + "blogspot.re", + "blogspot.ro", + "blogspot.rs", + "blogspot.ru", + "blogspot.se", + "blogspot.sg", + "blogspot.si", + "blogspot.sk", + "blogspot.sn", + "blogspot.td", + "blogspot.tw", + "blogspot.ug", + "blogspot.vn", + "cloudfunctions.net", + "cloud.goog", + "codespot.com", + "googleapis.com", + "googlecode.com", + "pagespeedmobilizer.com", + "publishproxy.com", + "withgoogle.com", + "withyoutube.com", + "hashbang.sh", + "hasura-app.io", + "hepforge.org", + "herokuapp.com", + "herokussl.com", + "moonscale.net", + "iki.fi", + "biz.at", + "info.at", + "info.cx", + "ac.leg.br", + "al.leg.br", + "am.leg.br", + "ap.leg.br", + "ba.leg.br", + "ce.leg.br", + "df.leg.br", + "es.leg.br", + "go.leg.br", + "ma.leg.br", + "mg.leg.br", + "ms.leg.br", + "mt.leg.br", + "pa.leg.br", + "pb.leg.br", + "pe.leg.br", + "pi.leg.br", + "pr.leg.br", + "rj.leg.br", + "rn.leg.br", + "ro.leg.br", + "rr.leg.br", + "rs.leg.br", + "sc.leg.br", + "se.leg.br", + "sp.leg.br", + "to.leg.br", + "pixolino.com", + "ipifony.net", + "*.triton.zone", + "*.cns.joyent.com", + "js.org", + "keymachine.de", + "knightpoint.systems", + "co.krd", + "edu.krd", + "git-repos.de", + "lcube-server.de", + "svn-repos.de", + "we.bs", + "barsy.bg", + "barsyonline.com", + "barsy.de", + "barsy.eu", + "barsy.in", + "barsy.net", + "barsy.online", + "barsy.support", + "*.magentosite.cloud", + "hb.cldmail.ru", + "cloud.metacentrum.cz", + "custom.metacentrum.cz", + "meteorapp.com", + "eu.meteorapp.com", + "co.pl", + "azurewebsites.net", + "azure-mobile.net", + "cloudapp.net", + "bmoattachments.org", + "net.ru", + "org.ru", + "pp.ru", + "bitballoon.com", + "netlify.com", + "4u.com", + "ngrok.io", + "nfshost.com", + "nsupdate.info", + "nerdpol.ovh", + "blogsyte.com", + "brasilia.me", + "cable-modem.org", + "ciscofreak.com", + "collegefan.org", + "couchpotatofries.org", + "damnserver.com", + "ddns.me", + "ditchyourip.com", + "dnsfor.me", + "dnsiskinky.com", + "dvrcam.info", + "dynns.com", + "eating-organic.net", + "fantasyleague.cc", + "geekgalaxy.com", + "golffan.us", + "health-carereform.com", + "homesecuritymac.com", + "homesecuritypc.com", + "hopto.me", + "ilovecollege.info", + "loginto.me", + "mlbfan.org", + "mmafan.biz", + "myactivedirectory.com", + "mydissent.net", + "myeffect.net", + "mymediapc.net", + "mypsx.net", + "mysecuritycamera.com", + "mysecuritycamera.net", + "mysecuritycamera.org", + "net-freaks.com", + "nflfan.org", + "nhlfan.net", + "no-ip.ca", + "no-ip.co.uk", + "no-ip.net", + "noip.us", + "onthewifi.com", + "pgafan.net", + "point2this.com", + "pointto.us", + "privatizehealthinsurance.net", + "quicksytes.com", + "read-books.org", + "securitytactics.com", + "serveexchange.com", + "servehumour.com", + "servep2p.com", + "servesarcasm.com", + "stufftoread.com", + "ufcfan.org", + "unusualperson.com", + "workisboring.com", + "3utilities.com", + "bounceme.net", + "ddns.net", + "ddnsking.com", + "gotdns.ch", + "hopto.org", + "myftp.biz", + "myftp.org", + "myvnc.com", + "no-ip.biz", + "no-ip.info", + "no-ip.org", + "noip.me", + "redirectme.net", + "servebeer.com", + "serveblog.net", + "servecounterstrike.com", + "serveftp.com", + "servegame.com", + "servehalflife.com", + "servehttp.com", + "serveirc.com", + "serveminecraft.net", + "servemp3.com", + "servepics.com", + "servequake.com", + "sytes.net", + "webhop.me", + "zapto.org", + "stage.nodeart.io", + "nodum.co", + "nodum.io", + "nyc.mn", + "nom.ae", + "nom.ai", + "nom.al", + "nym.by", + "nym.bz", + "nom.cl", + "nom.gd", + "nom.gl", + "nym.gr", + "nom.gt", + "nom.hn", + "nom.im", + "nym.kz", + "nym.la", + "nom.li", + "nym.li", + "nym.lt", + "nym.lu", + "nym.me", + "nom.mk", + "nym.mx", + "nom.nu", + "nym.nz", + "nym.pe", + "nym.pt", + "nom.pw", + "nom.qa", + "nom.rs", + "nom.si", + "nym.sk", + "nym.su", + "nym.sx", + "nym.tw", + "nom.ug", + "nom.uy", + "nom.vc", + "nom.vg", + "cya.gg", + "nid.io", + "opencraft.hosting", + "operaunite.com", + "outsystemscloud.com", + "ownprovider.com", + "oy.lc", + "pgfog.com", + "pagefrontapp.com", + "art.pl", + "gliwice.pl", + "krakow.pl", + "poznan.pl", + "wroc.pl", + "zakopane.pl", + "pantheonsite.io", + "gotpantheon.com", + "mypep.link", + "on-web.fr", + "*.platform.sh", + "*.platformsh.site", + "xen.prgmr.com", + "priv.at", + "protonet.io", + "chirurgiens-dentistes-en-france.fr", + "byen.site", + "qa2.com", + "dev-myqnapcloud.com", + "alpha-myqnapcloud.com", + "myqnapcloud.com", + "*.quipelements.com", + "vapor.cloud", + "vaporcloud.io", + "rackmaze.com", + "rackmaze.net", + "rhcloud.com", + "hzc.io", + "wellbeingzone.eu", + "ptplus.fit", + "wellbeingzone.co.uk", + "sandcats.io", + "logoip.de", + "logoip.com", + "firewall-gateway.com", + "firewall-gateway.de", + "my-gateway.de", + "my-router.de", + "spdns.de", + "spdns.eu", + "firewall-gateway.net", + "my-firewall.org", + "myfirewall.org", + "spdns.org", + "*.sensiosite.cloud", + "biz.ua", + "co.ua", + "pp.ua", + "shiftedit.io", + "myshopblocks.com", + "1kapp.com", + "appchizi.com", + "applinzi.com", + "sinaapp.com", + "vipsinaapp.com", + "bounty-full.com", + "alpha.bounty-full.com", + "beta.bounty-full.com", + "static.land", + "dev.static.land", + "sites.static.land", + "apps.lair.io", + "*.stolos.io", + "spacekit.io", + "stackspace.space", + "storj.farm", + "temp-dns.com", + "diskstation.me", + "dscloud.biz", + "dscloud.me", + "dscloud.mobi", + "dsmynas.com", + "dsmynas.net", + "dsmynas.org", + "familyds.com", + "familyds.net", + "familyds.org", + "i234.me", + "myds.me", + "synology.me", + "vpnplus.to", + "taifun-dns.de", + "gda.pl", + "gdansk.pl", + "gdynia.pl", + "med.pl", + "sopot.pl", + "cust.dev.thingdust.io", + "cust.disrec.thingdust.io", + "cust.prod.thingdust.io", + "cust.testing.thingdust.io", + "bloxcms.com", + "townnews-staging.com", + "12hp.at", + "2ix.at", + "4lima.at", + "lima-city.at", + "12hp.ch", + "2ix.ch", + "4lima.ch", + "lima-city.ch", + "trafficplex.cloud", + "de.cool", + "12hp.de", + "2ix.de", + "4lima.de", + "lima-city.de", + "1337.pictures", + "clan.rip", + "lima-city.rocks", + "webspace.rocks", + "lima.zone", + "*.transurl.be", + "*.transurl.eu", + "*.transurl.nl", + "tuxfamily.org", + "dd-dns.de", + "diskstation.eu", + "diskstation.org", + "dray-dns.de", + "draydns.de", + "dyn-vpn.de", + "dynvpn.de", + "mein-vigor.de", + "my-vigor.de", + "my-wan.de", + "syno-ds.de", + "synology-diskstation.de", + "synology-ds.de", + "uber.space", + "hk.com", + "hk.org", + "ltd.hk", + "inc.hk", + "lib.de.us", + "router.management", + "v-info.info", + "wedeploy.io", + "wedeploy.me", + "wedeploy.sh", + "remotewd.com", + "wmflabs.org", + "cistron.nl", + "demon.nl", + "xs4all.space", + "yolasite.com", + "ybo.faith", + "yombo.me", + "homelink.one", + "ybo.party", + "ybo.review", + "ybo.science", + "ybo.trade", + "za.net", + "za.org", + "now.sh", +} + +var nodeLabels = [...]string{ + "aaa", + "aarp", + "abarth", + "abb", + "abbott", + "abbvie", + "abc", + "able", + "abogado", + "abudhabi", + "ac", + "academy", + "accenture", + "accountant", + "accountants", + "aco", + "active", + "actor", + "ad", + "adac", + "ads", + "adult", + "ae", + "aeg", + "aero", + "aetna", + "af", + "afamilycompany", + "afl", + "africa", + "ag", + "agakhan", + "agency", + "ai", + "aig", + "aigo", + "airbus", + "airforce", + "airtel", + "akdn", + "al", + "alfaromeo", + "alibaba", + "alipay", + "allfinanz", + "allstate", + "ally", + "alsace", + "alstom", + "am", + "americanexpress", + "americanfamily", + "amex", + "amfam", + "amica", + "amsterdam", + "analytics", + "android", + "anquan", + "anz", + "ao", + "aol", + "apartments", + "app", + "apple", + "aq", + "aquarelle", + "ar", + "arab", + "aramco", + "archi", + "army", + "arpa", + "art", + "arte", + "as", + "asda", + "asia", + "associates", + "at", + "athleta", + "attorney", + "au", + "auction", + "audi", + "audible", + "audio", + "auspost", + "author", + "auto", + "autos", + "avianca", + "aw", + "aws", + "ax", + "axa", + "az", + "azure", + "ba", + "baby", + "baidu", + "banamex", + "bananarepublic", + "band", + "bank", + "bar", + "barcelona", + "barclaycard", + "barclays", + "barefoot", + "bargains", + "baseball", + "basketball", + "bauhaus", + "bayern", + "bb", + "bbc", + "bbt", + "bbva", + "bcg", + "bcn", + "bd", + "be", + "beats", + "beauty", + "beer", + "bentley", + "berlin", + "best", + "bestbuy", + "bet", + "bf", + "bg", + "bh", + "bharti", + "bi", + "bible", + "bid", + "bike", + "bing", + "bingo", + "bio", + "biz", + "bj", + "black", + "blackfriday", + "blanco", + "blockbuster", + "blog", + "bloomberg", + "blue", + "bm", + "bms", + "bmw", + "bn", + "bnl", + "bnpparibas", + "bo", + "boats", + "boehringer", + "bofa", + "bom", + "bond", + "boo", + "book", + "booking", + "boots", + "bosch", + "bostik", + "boston", + "bot", + "boutique", + "box", + "br", + "bradesco", + "bridgestone", + "broadway", + "broker", + "brother", + "brussels", + "bs", + "bt", + "budapest", + "bugatti", + "build", + "builders", + "business", + "buy", + "buzz", + "bv", + "bw", + "by", + "bz", + "bzh", + "ca", + "cab", + "cafe", + "cal", + "call", + "calvinklein", + "cam", + "camera", + "camp", + "cancerresearch", + "canon", + "capetown", + "capital", + "capitalone", + "car", + "caravan", + "cards", + "care", + "career", + "careers", + "cars", + "cartier", + "casa", + "case", + "caseih", + "cash", + "casino", + "cat", + "catering", + "catholic", + "cba", + "cbn", + "cbre", + "cbs", + "cc", + "cd", + "ceb", + "center", + "ceo", + "cern", + "cf", + "cfa", + "cfd", + "cg", + "ch", + "chanel", + "channel", + "chase", + "chat", + "cheap", + "chintai", + "chloe", + "christmas", + "chrome", + "chrysler", + "church", + "ci", + "cipriani", + "circle", + "cisco", + "citadel", + "citi", + "citic", + "city", + "cityeats", + "ck", + "cl", + "claims", + "cleaning", + "click", + "clinic", + "clinique", + "clothing", + "cloud", + "club", + "clubmed", + "cm", + "cn", + "co", + "coach", + "codes", + "coffee", + "college", + "cologne", + "com", + "comcast", + "commbank", + "community", + "company", + "compare", + "computer", + "comsec", + "condos", + "construction", + "consulting", + "contact", + "contractors", + "cooking", + "cookingchannel", + "cool", + "coop", + "corsica", + "country", + "coupon", + "coupons", + "courses", + "cr", + "credit", + "creditcard", + "creditunion", + "cricket", + "crown", + "crs", + "cruise", + "cruises", + "csc", + "cu", + "cuisinella", + "cv", + "cw", + "cx", + "cy", + "cymru", + "cyou", + "cz", + "dabur", + "dad", + "dance", + "data", + "date", + "dating", + "datsun", + "day", + "dclk", + "dds", + "de", + "deal", + "dealer", + "deals", + "degree", + "delivery", + "dell", + "deloitte", + "delta", + "democrat", + "dental", + "dentist", + "desi", + "design", + "dev", + "dhl", + "diamonds", + "diet", + "digital", + "direct", + "directory", + "discount", + "discover", + "dish", + "diy", + "dj", + "dk", + "dm", + "dnp", + "do", + "docs", + "doctor", + "dodge", + "dog", + "doha", + "domains", + "dot", + "download", + "drive", + "dtv", + "dubai", + "duck", + "dunlop", + "duns", + "dupont", + "durban", + "dvag", + "dvr", + "dz", + "earth", + "eat", + "ec", + "eco", + "edeka", + "edu", + "education", + "ee", + "eg", + "email", + "emerck", + "energy", + "engineer", + "engineering", + "enterprises", + "epost", + "epson", + "equipment", + "er", + "ericsson", + "erni", + "es", + "esq", + "estate", + "esurance", + "et", + "etisalat", + "eu", + "eurovision", + "eus", + "events", + "everbank", + "exchange", + "expert", + "exposed", + "express", + "extraspace", + "fage", + "fail", + "fairwinds", + "faith", + "family", + "fan", + "fans", + "farm", + "farmers", + "fashion", + "fast", + "fedex", + "feedback", + "ferrari", + "ferrero", + "fi", + "fiat", + "fidelity", + "fido", + "film", + "final", + "finance", + "financial", + "fire", + "firestone", + "firmdale", + "fish", + "fishing", + "fit", + "fitness", + "fj", + "fk", + "flickr", + "flights", + "flir", + "florist", + "flowers", + "fly", + "fm", + "fo", + "foo", + "food", + "foodnetwork", + "football", + "ford", + "forex", + "forsale", + "forum", + "foundation", + "fox", + "fr", + "free", + "fresenius", + "frl", + "frogans", + "frontdoor", + "frontier", + "ftr", + "fujitsu", + "fujixerox", + "fun", + "fund", + "furniture", + "futbol", + "fyi", + "ga", + "gal", + "gallery", + "gallo", + "gallup", + "game", + "games", + "gap", + "garden", + "gb", + "gbiz", + "gd", + "gdn", + "ge", + "gea", + "gent", + "genting", + "george", + "gf", + "gg", + "ggee", + "gh", + "gi", + "gift", + "gifts", + "gives", + "giving", + "gl", + "glade", + "glass", + "gle", + "global", + "globo", + "gm", + "gmail", + "gmbh", + "gmo", + "gmx", + "gn", + "godaddy", + "gold", + "goldpoint", + "golf", + "goo", + "goodhands", + "goodyear", + "goog", + "google", + "gop", + "got", + "gov", + "gp", + "gq", + "gr", + "grainger", + "graphics", + "gratis", + "green", + "gripe", + "grocery", + "group", + "gs", + "gt", + "gu", + "guardian", + "gucci", + "guge", + "guide", + "guitars", + "guru", + "gw", + "gy", + "hair", + "hamburg", + "hangout", + "haus", + "hbo", + "hdfc", + "hdfcbank", + "health", + "healthcare", + "help", + "helsinki", + "here", + "hermes", + "hgtv", + "hiphop", + "hisamitsu", + "hitachi", + "hiv", + "hk", + "hkt", + "hm", + "hn", + "hockey", + "holdings", + "holiday", + "homedepot", + "homegoods", + "homes", + "homesense", + "honda", + "honeywell", + "horse", + "hospital", + "host", + "hosting", + "hot", + "hoteles", + "hotels", + "hotmail", + "house", + "how", + "hr", + "hsbc", + "ht", + "htc", + "hu", + "hughes", + "hyatt", + "hyundai", + "ibm", + "icbc", + "ice", + "icu", + "id", + "ie", + "ieee", + "ifm", + "ikano", + "il", + "im", + "imamat", + "imdb", + "immo", + "immobilien", + "in", + "industries", + "infiniti", + "info", + "ing", + "ink", + "institute", + "insurance", + "insure", + "int", + "intel", + "international", + "intuit", + "investments", + "io", + "ipiranga", + "iq", + "ir", + "irish", + "is", + "iselect", + "ismaili", + "ist", + "istanbul", + "it", + "itau", + "itv", + "iveco", + "iwc", + "jaguar", + "java", + "jcb", + "jcp", + "je", + "jeep", + "jetzt", + "jewelry", + "jio", + "jlc", + "jll", + "jm", + "jmp", + "jnj", + "jo", + "jobs", + "joburg", + "jot", + "joy", + "jp", + "jpmorgan", + "jprs", + "juegos", + "juniper", + "kaufen", + "kddi", + "ke", + "kerryhotels", + "kerrylogistics", + "kerryproperties", + "kfh", + "kg", + "kh", + "ki", + "kia", + "kim", + "kinder", + "kindle", + "kitchen", + "kiwi", + "km", + "kn", + "koeln", + "komatsu", + "kosher", + "kp", + "kpmg", + "kpn", + "kr", + "krd", + "kred", + "kuokgroup", + "kw", + "ky", + "kyoto", + "kz", + "la", + "lacaixa", + "ladbrokes", + "lamborghini", + "lamer", + "lancaster", + "lancia", + "lancome", + "land", + "landrover", + "lanxess", + "lasalle", + "lat", + "latino", + "latrobe", + "law", + "lawyer", + "lb", + "lc", + "lds", + "lease", + "leclerc", + "lefrak", + "legal", + "lego", + "lexus", + "lgbt", + "li", + "liaison", + "lidl", + "life", + "lifeinsurance", + "lifestyle", + "lighting", + "like", + "lilly", + "limited", + "limo", + "lincoln", + "linde", + "link", + "lipsy", + "live", + "living", + "lixil", + "lk", + "loan", + "loans", + "locker", + "locus", + "loft", + "lol", + "london", + "lotte", + "lotto", + "love", + "lpl", + "lplfinancial", + "lr", + "ls", + "lt", + "ltd", + "ltda", + "lu", + "lundbeck", + "lupin", + "luxe", + "luxury", + "lv", + "ly", + "ma", + "macys", + "madrid", + "maif", + "maison", + "makeup", + "man", + "management", + "mango", + "map", + "market", + "marketing", + "markets", + "marriott", + "marshalls", + "maserati", + "mattel", + "mba", + "mc", + "mcd", + "mcdonalds", + "mckinsey", + "md", + "me", + "med", + "media", + "meet", + "melbourne", + "meme", + "memorial", + "men", + "menu", + "meo", + "merckmsd", + "metlife", + "mg", + "mh", + "miami", + "microsoft", + "mil", + "mini", + "mint", + "mit", + "mitsubishi", + "mk", + "ml", + "mlb", + "mls", + "mm", + "mma", + "mn", + "mo", + "mobi", + "mobile", + "mobily", + "moda", + "moe", + "moi", + "mom", + "monash", + "money", + "monster", + "montblanc", + "mopar", + "mormon", + "mortgage", + "moscow", + "moto", + "motorcycles", + "mov", + "movie", + "movistar", + "mp", + "mq", + "mr", + "ms", + "msd", + "mt", + "mtn", + "mtpc", + "mtr", + "mu", + "museum", + "mutual", + "mv", + "mw", + "mx", + "my", + "mz", + "na", + "nab", + "nadex", + "nagoya", + "name", + "nationwide", + "natura", + "navy", + "nba", + "nc", + "ne", + "nec", + "net", + "netbank", + "netflix", + "network", + "neustar", + "new", + "newholland", + "news", + "next", + "nextdirect", + "nexus", + "nf", + "nfl", + "ng", + "ngo", + "nhk", + "ni", + "nico", + "nike", + "nikon", + "ninja", + "nissan", + "nissay", + "nl", + "no", + "nokia", + "northwesternmutual", + "norton", + "now", + "nowruz", + "nowtv", + "np", + "nr", + "nra", + "nrw", + "ntt", + "nu", + "nyc", + "nz", + "obi", + "observer", + "off", + "office", + "okinawa", + "olayan", + "olayangroup", + "oldnavy", + "ollo", + "om", + "omega", + "one", + "ong", + "onion", + "onl", + "online", + "onyourside", + "ooo", + "open", + "oracle", + "orange", + "org", + "organic", + "origins", + "osaka", + "otsuka", + "ott", + "ovh", + "pa", + "page", + "pamperedchef", + "panasonic", + "panerai", + "paris", + "pars", + "partners", + "parts", + "party", + "passagens", + "pay", + "pccw", + "pe", + "pet", + "pf", + "pfizer", + "pg", + "ph", + "pharmacy", + "phd", + "philips", + "phone", + "photo", + "photography", + "photos", + "physio", + "piaget", + "pics", + "pictet", + "pictures", + "pid", + "pin", + "ping", + "pink", + "pioneer", + "pizza", + "pk", + "pl", + "place", + "play", + "playstation", + "plumbing", + "plus", + "pm", + "pn", + "pnc", + "pohl", + "poker", + "politie", + "porn", + "post", + "pr", + "pramerica", + "praxi", + "press", + "prime", + "pro", + "prod", + "productions", + "prof", + "progressive", + "promo", + "properties", + "property", + "protection", + "pru", + "prudential", + "ps", + "pt", + "pub", + "pw", + "pwc", + "py", + "qa", + "qpon", + "quebec", + "quest", + "qvc", + "racing", + "radio", + "raid", + "re", + "read", + "realestate", + "realtor", + "realty", + "recipes", + "red", + "redstone", + "redumbrella", + "rehab", + "reise", + "reisen", + "reit", + "reliance", + "ren", + "rent", + "rentals", + "repair", + "report", + "republican", + "rest", + "restaurant", + "review", + "reviews", + "rexroth", + "rich", + "richardli", + "ricoh", + "rightathome", + "ril", + "rio", + "rip", + "rmit", + "ro", + "rocher", + "rocks", + "rodeo", + "rogers", + "room", + "rs", + "rsvp", + "ru", + "rugby", + "ruhr", + "run", + "rw", + "rwe", + "ryukyu", + "sa", + "saarland", + "safe", + "safety", + "sakura", + "sale", + "salon", + "samsclub", + "samsung", + "sandvik", + "sandvikcoromant", + "sanofi", + "sap", + "sapo", + "sarl", + "sas", + "save", + "saxo", + "sb", + "sbi", + "sbs", + "sc", + "sca", + "scb", + "schaeffler", + "schmidt", + "scholarships", + "school", + "schule", + "schwarz", + "science", + "scjohnson", + "scor", + "scot", + "sd", + "se", + "search", + "seat", + "secure", + "security", + "seek", + "select", + "sener", + "services", + "ses", + "seven", + "sew", + "sex", + "sexy", + "sfr", + "sg", + "sh", + "shangrila", + "sharp", + "shaw", + "shell", + "shia", + "shiksha", + "shoes", + "shop", + "shopping", + "shouji", + "show", + "showtime", + "shriram", + "si", + "silk", + "sina", + "singles", + "site", + "sj", + "sk", + "ski", + "skin", + "sky", + "skype", + "sl", + "sling", + "sm", + "smart", + "smile", + "sn", + "sncf", + "so", + "soccer", + "social", + "softbank", + "software", + "sohu", + "solar", + "solutions", + "song", + "sony", + "soy", + "space", + "spiegel", + "spot", + "spreadbetting", + "sr", + "srl", + "srt", + "st", + "stada", + "staples", + "star", + "starhub", + "statebank", + "statefarm", + "statoil", + "stc", + "stcgroup", + "stockholm", + "storage", + "store", + "stream", + "studio", + "study", + "style", + "su", + "sucks", + "supplies", + "supply", + "support", + "surf", + "surgery", + "suzuki", + "sv", + "swatch", + "swiftcover", + "swiss", + "sx", + "sy", + "sydney", + "symantec", + "systems", + "sz", + "tab", + "taipei", + "talk", + "taobao", + "target", + "tatamotors", + "tatar", + "tattoo", + "tax", + "taxi", + "tc", + "tci", + "td", + "tdk", + "team", + "tech", + "technology", + "tel", + "telecity", + "telefonica", + "temasek", + "tennis", + "teva", + "tf", + "tg", + "th", + "thd", + "theater", + "theatre", + "tiaa", + "tickets", + "tienda", + "tiffany", + "tips", + "tires", + "tirol", + "tj", + "tjmaxx", + "tjx", + "tk", + "tkmaxx", + "tl", + "tm", + "tmall", + "tn", + "to", + "today", + "tokyo", + "tools", + "top", + "toray", + "toshiba", + "total", + "tours", + "town", + "toyota", + "toys", + "tr", + "trade", + "trading", + "training", + "travel", + "travelchannel", + "travelers", + "travelersinsurance", + "trust", + "trv", + "tt", + "tube", + "tui", + "tunes", + "tushu", + "tv", + "tvs", + "tw", + "tz", + "ua", + "ubank", + "ubs", + "uconnect", + "ug", + "uk", + "unicom", + "university", + "uno", + "uol", + "ups", + "us", + "uy", + "uz", + "va", + "vacations", + "vana", + "vanguard", + "vc", + "ve", + "vegas", + "ventures", + "verisign", + "versicherung", + "vet", + "vg", + "vi", + "viajes", + "video", + "vig", + "viking", + "villas", + "vin", + "vip", + "virgin", + "visa", + "vision", + "vista", + "vistaprint", + "viva", + "vivo", + "vlaanderen", + "vn", + "vodka", + "volkswagen", + "volvo", + "vote", + "voting", + "voto", + "voyage", + "vu", + "vuelos", + "wales", + "walmart", + "walter", + "wang", + "wanggou", + "warman", + "watch", + "watches", + "weather", + "weatherchannel", + "webcam", + "weber", + "website", + "wed", + "wedding", + "weibo", + "weir", + "wf", + "whoswho", + "wien", + "wiki", + "williamhill", + "win", + "windows", + "wine", + "winners", + "wme", + "wolterskluwer", + "woodside", + "work", + "works", + "world", + "wow", + "ws", + "wtc", + "wtf", + "xbox", + "xerox", + "xfinity", + "xihuan", + "xin", + "xn--11b4c3d", + "xn--1ck2e1b", + "xn--1qqw23a", + "xn--2scrj9c", + "xn--30rr7y", + "xn--3bst00m", + "xn--3ds443g", + "xn--3e0b707e", + "xn--3hcrj9c", + "xn--3oq18vl8pn36a", + "xn--3pxu8k", + "xn--42c2d9a", + "xn--45br5cyl", + "xn--45brj9c", + "xn--45q11c", + "xn--4gbrim", + "xn--54b7fta0cc", + "xn--55qw42g", + "xn--55qx5d", + "xn--5su34j936bgsg", + "xn--5tzm5g", + "xn--6frz82g", + "xn--6qq986b3xl", + "xn--80adxhks", + "xn--80ao21a", + "xn--80aqecdr1a", + "xn--80asehdb", + "xn--80aswg", + "xn--8y0a063a", + "xn--90a3ac", + "xn--90ae", + "xn--90ais", + "xn--9dbq2a", + "xn--9et52u", + "xn--9krt00a", + "xn--b4w605ferd", + "xn--bck1b9a5dre4c", + "xn--c1avg", + "xn--c2br7g", + "xn--cck2b3b", + "xn--cg4bki", + "xn--clchc0ea0b2g2a9gcd", + "xn--czr694b", + "xn--czrs0t", + "xn--czru2d", + "xn--d1acj3b", + "xn--d1alf", + "xn--e1a4c", + "xn--eckvdtc9d", + "xn--efvy88h", + "xn--estv75g", + "xn--fct429k", + "xn--fhbei", + "xn--fiq228c5hs", + "xn--fiq64b", + "xn--fiqs8s", + "xn--fiqz9s", + "xn--fjq720a", + "xn--flw351e", + "xn--fpcrj9c3d", + "xn--fzc2c9e2c", + "xn--fzys8d69uvgm", + "xn--g2xx48c", + "xn--gckr3f0f", + "xn--gecrj9c", + "xn--gk3at1e", + "xn--h2breg3eve", + "xn--h2brj9c", + "xn--h2brj9c8c", + "xn--hxt814e", + "xn--i1b6b1a6a2e", + "xn--imr513n", + "xn--io0a7i", + "xn--j1aef", + "xn--j1amh", + "xn--j6w193g", + "xn--jlq61u9w7b", + "xn--jvr189m", + "xn--kcrx77d1x4a", + "xn--kprw13d", + "xn--kpry57d", + "xn--kpu716f", + "xn--kput3i", + "xn--l1acc", + "xn--lgbbat1ad8j", + "xn--mgb2ddes", + "xn--mgb9awbf", + "xn--mgba3a3ejt", + "xn--mgba3a4f16a", + "xn--mgba3a4fra", + "xn--mgba7c0bbn0a", + "xn--mgbaakc7dvf", + "xn--mgbaam7a8h", + "xn--mgbab2bd", + "xn--mgbai9a5eva00b", + "xn--mgbai9azgqp6j", + "xn--mgbayh7gpa", + "xn--mgbb9fbpob", + "xn--mgbbh1a71e", + "xn--mgbc0a9azcg", + "xn--mgbca7dzdo", + "xn--mgberp4a5d4a87g", + "xn--mgberp4a5d4ar", + "xn--mgbgu82a", + "xn--mgbi4ecexp", + "xn--mgbpl2fh", + "xn--mgbqly7c0a67fbc", + "xn--mgbqly7cvafr", + "xn--mgbt3dhd", + "xn--mgbtf8fl", + "xn--mgbtx2b", + "xn--mgbx4cd0ab", + "xn--mix082f", + "xn--mix891f", + "xn--mk1bu44c", + "xn--mxtq1m", + "xn--ngbc5azd", + "xn--ngbe9e0a", + "xn--ngbrx", + "xn--nnx388a", + "xn--node", + "xn--nqv7f", + "xn--nqv7fs00ema", + "xn--nyqy26a", + "xn--o3cw4h", + "xn--ogbpf8fl", + "xn--p1acf", + "xn--p1ai", + "xn--pbt977c", + "xn--pgbs0dh", + "xn--pssy2u", + "xn--q9jyb4c", + "xn--qcka1pmc", + "xn--qxam", + "xn--rhqv96g", + "xn--rovu88b", + "xn--rvc1e0am3e", + "xn--s9brj9c", + "xn--ses554g", + "xn--t60b56a", + "xn--tckwe", + "xn--tiq49xqyj", + "xn--unup4y", + "xn--vermgensberater-ctb", + "xn--vermgensberatung-pwb", + "xn--vhquv", + "xn--vuq861b", + "xn--w4r85el8fhu5dnra", + "xn--w4rs40l", + "xn--wgbh1c", + "xn--wgbl6a", + "xn--xhq521b", + "xn--xkc2al3hye2a", + "xn--xkc2dl3a5ee0h", + "xn--y9a3aq", + "xn--yfro4i67o", + "xn--ygbi2ammx", + "xn--zfr164b", + "xperia", + "xxx", + "xyz", + "yachts", + "yahoo", + "yamaxun", + "yandex", + "ye", + "yodobashi", + "yoga", + "yokohama", + "you", + "youtube", + "yt", + "yun", + "za", + "zappos", + "zara", + "zero", + "zip", + "zippo", + "zm", + "zone", + "zuerich", + "zw", + "com", + "edu", + "gov", + "mil", + "net", + "org", + "nom", + "ac", + "blogspot", + "co", + "gov", + "mil", + "net", + "nom", + "org", + "sch", + "accident-investigation", + "accident-prevention", + "aerobatic", + "aeroclub", + "aerodrome", + "agents", + "air-surveillance", + "air-traffic-control", + "aircraft", + "airline", + "airport", + "airtraffic", + "ambulance", + "amusement", + "association", + "author", + "ballooning", + "broker", + "caa", + "cargo", + "catering", + "certification", + "championship", + "charter", + "civilaviation", + "club", + "conference", + "consultant", + "consulting", + "control", + "council", + "crew", + "design", + "dgca", + "educator", + "emergency", + "engine", + "engineer", + "entertainment", + "equipment", + "exchange", + "express", + "federation", + "flight", + "freight", + "fuel", + "gliding", + "government", + "groundhandling", + "group", + "hanggliding", + "homebuilt", + "insurance", + "journal", + "journalist", + "leasing", + "logistics", + "magazine", + "maintenance", + "media", + "microlight", + "modelling", + "navigation", + "parachuting", + "paragliding", + "passenger-association", + "pilot", + "press", + "production", + "recreation", + "repbody", + "res", + "research", + "rotorcraft", + "safety", + "scientist", + "services", + "show", + "skydiving", + "software", + "student", + "trader", + "trading", + "trainer", + "union", + "workinggroup", + "works", + "com", + "edu", + "gov", + "net", + "org", + "co", + "com", + "net", + "nom", + "org", + "com", + "net", + "nom", + "off", + "org", + "blogspot", + "com", + "edu", + "gov", + "mil", + "net", + "nom", + "org", + "blogspot", + "co", + "ed", + "gv", + "it", + "og", + "pb", + "com", + "edu", + "gob", + "gov", + "int", + "mil", + "musica", + "net", + "org", + "tur", + "blogspot", + "e164", + "in-addr", + "ip6", + "iris", + "uri", + "urn", + "gov", + "cloudns", + "12hp", + "2ix", + "4lima", + "ac", + "biz", + "co", + "futurecms", + "futurehosting", + "futuremailing", + "gv", + "info", + "lima-city", + "or", + "ortsinfo", + "priv", + "blogspot", + "ex", + "kunden", + "act", + "asn", + "com", + "conf", + "edu", + "gov", + "id", + "info", + "net", + "nsw", + "nt", + "org", + "oz", + "qld", + "sa", + "tas", + "vic", + "wa", + "blogspot", + "act", + "nsw", + "nt", + "qld", + "sa", + "tas", + "vic", + "wa", + "qld", + "sa", + "tas", + "vic", + "wa", + "com", + "biz", + "com", + "edu", + "gov", + "info", + "int", + "mil", + "name", + "net", + "org", + "pp", + "pro", + "blogspot", + "com", + "edu", + "gov", + "mil", + "net", + "org", + "biz", + "co", + "com", + "edu", + "gov", + "info", + "net", + "org", + "store", + "tv", + "ac", + "blogspot", + "transurl", + "gov", + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "a", + "b", + "barsy", + "blogspot", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "com", + "edu", + "gov", + "net", + "org", + "co", + "com", + "edu", + "or", + "org", + "cloudns", + "dscloud", + "dyndns", + "for-better", + "for-more", + "for-some", + "for-the", + "mmafan", + "myftp", + "no-ip", + "selfip", + "webhop", + "asso", + "barreau", + "blogspot", + "gouv", + "com", + "edu", + "gov", + "net", + "org", + "com", + "edu", + "gob", + "gov", + "int", + "mil", + "net", + "org", + "tv", + "adm", + "adv", + "agr", + "am", + "arq", + "art", + "ato", + "b", + "belem", + "bio", + "blog", + "bmd", + "cim", + "cng", + "cnt", + "com", + "coop", + "cri", + "def", + "ecn", + "eco", + "edu", + "emp", + "eng", + "esp", + "etc", + "eti", + "far", + "flog", + "floripa", + "fm", + "fnd", + "fot", + "fst", + "g12", + "ggf", + "gov", + "imb", + "ind", + "inf", + "jampa", + "jor", + "jus", + "leg", + "lel", + "mat", + "med", + "mil", + "mp", + "mus", + "net", + "nom", + "not", + "ntr", + "odo", + "org", + "poa", + "ppg", + "pro", + "psc", + "psi", + "qsl", + "radio", + "rec", + "recife", + "slg", + "srv", + "taxi", + "teo", + "tmp", + "trd", + "tur", + "tv", + "vet", + "vix", + "vlog", + "wiki", + "zlg", + "blogspot", + "ac", + "al", + "am", + "ap", + "ba", + "ce", + "df", + "es", + "go", + "ma", + "mg", + "ms", + "mt", + "pa", + "pb", + "pe", + "pi", + "pr", + "rj", + "rn", + "ro", + "rr", + "rs", + "sc", + "se", + "sp", + "to", + "ac", + "al", + "am", + "ap", + "ba", + "ce", + "df", + "es", + "go", + "ma", + "mg", + "ms", + "mt", + "pa", + "pb", + "pe", + "pi", + "pr", + "rj", + "rn", + "ro", + "rr", + "rs", + "sc", + "se", + "sp", + "to", + "com", + "edu", + "gov", + "net", + "org", + "we", + "com", + "edu", + "gov", + "net", + "org", + "co", + "org", + "com", + "gov", + "mil", + "nym", + "of", + "blogspot", + "com", + "edu", + "gov", + "net", + "nym", + "org", + "za", + "ab", + "awdev", + "bc", + "blogspot", + "co", + "gc", + "mb", + "nb", + "nf", + "nl", + "no-ip", + "ns", + "nt", + "nu", + "on", + "pe", + "qc", + "sk", + "yk", + "cloudns", + "fantasyleague", + "ftpaccess", + "game-server", + "myphotos", + "scrapping", + "twmail", + "gov", + "blogspot", + "12hp", + "2ix", + "4lima", + "blogspot", + "gotdns", + "lima-city", + "square7", + "ac", + "asso", + "co", + "com", + "ed", + "edu", + "go", + "gouv", + "int", + "md", + "net", + "or", + "org", + "presse", + "xn--aroport-bya", + "www", + "blogspot", + "co", + "gob", + "gov", + "mil", + "nom", + "magentosite", + "myfusion", + "sensiosite", + "statics", + "trafficplex", + "vapor", + "cloudns", + "co", + "com", + "gov", + "net", + "ac", + "ah", + "bj", + "com", + "cq", + "edu", + "fj", + "gd", + "gov", + "gs", + "gx", + "gz", + "ha", + "hb", + "he", + "hi", + "hk", + "hl", + "hn", + "jl", + "js", + "jx", + "ln", + "mil", + "mo", + "net", + "nm", + "nx", + "org", + "qh", + "sc", + "sd", + "sh", + "sn", + "sx", + "tj", + "tw", + "xj", + "xn--55qx5d", + "xn--io0a7i", + "xn--od0alg", + "xz", + "yn", + "zj", + "amazonaws", + "cn-north-1", + "compute", + "eb", + "elb", + "s3", + "cn-north-1", + "arts", + "com", + "edu", + "firm", + "gov", + "info", + "int", + "mil", + "net", + "nodum", + "nom", + "org", + "rec", + "web", + "blogspot", + "0emm", + "1kapp", + "3utilities", + "4u", + "africa", + "alpha-myqnapcloud", + "amazonaws", + "appchizi", + "applinzi", + "appspot", + "ar", + "barsyonline", + "betainabox", + "bitballoon", + "blogdns", + "blogspot", + "blogsyte", + "bloxcms", + "bounty-full", + "bplaced", + "br", + "cechire", + "ciscofreak", + "cloudcontrolapp", + "cloudcontrolled", + "cn", + "co", + "codespot", + "damnserver", + "ddnsfree", + "ddnsgeek", + "ddnsking", + "de", + "dev-myqnapcloud", + "ditchyourip", + "dnsalias", + "dnsdojo", + "dnsiskinky", + "doesntexist", + "dontexist", + "doomdns", + "drayddns", + "dreamhosters", + "dsmynas", + "dyn-o-saur", + "dynalias", + "dyndns-at-home", + "dyndns-at-work", + "dyndns-blog", + "dyndns-free", + "dyndns-home", + "dyndns-ip", + "dyndns-mail", + "dyndns-office", + "dyndns-pics", + "dyndns-remote", + "dyndns-server", + "dyndns-web", + "dyndns-wiki", + "dyndns-work", + "dynns", + "elasticbeanstalk", + "est-a-la-maison", + "est-a-la-masion", + "est-le-patron", + "est-mon-blogueur", + "eu", + "evennode", + "familyds", + "fbsbx", + "firebaseapp", + "firewall-gateway", + "flynnhub", + "freebox-os", + "freeboxos", + "from-ak", + "from-al", + "from-ar", + "from-ca", + "from-ct", + "from-dc", + "from-de", + "from-fl", + "from-ga", + "from-hi", + "from-ia", + "from-id", + "from-il", + "from-in", + "from-ks", + "from-ky", + "from-ma", + "from-md", + "from-mi", + "from-mn", + "from-mo", + "from-ms", + "from-mt", + "from-nc", + "from-nd", + "from-ne", + "from-nh", + "from-nj", + "from-nm", + "from-nv", + "from-oh", + "from-ok", + "from-or", + "from-pa", + "from-pr", + "from-ri", + "from-sc", + "from-sd", + "from-tn", + "from-tx", + "from-ut", + "from-va", + "from-vt", + "from-wa", + "from-wi", + "from-wv", + "from-wy", + "gb", + "geekgalaxy", + "getmyip", + "giize", + "githubusercontent", + "gleeze", + "googleapis", + "googlecode", + "gotdns", + "gotpantheon", + "gr", + "health-carereform", + "herokuapp", + "herokussl", + "hk", + "hobby-site", + "homelinux", + "homesecuritymac", + "homesecuritypc", + "homeunix", + "hu", + "iamallama", + "is-a-anarchist", + "is-a-blogger", + "is-a-bookkeeper", + "is-a-bulls-fan", + "is-a-caterer", + "is-a-chef", + "is-a-conservative", + "is-a-cpa", + "is-a-cubicle-slave", + "is-a-democrat", + "is-a-designer", + "is-a-doctor", + "is-a-financialadvisor", + "is-a-geek", + "is-a-green", + "is-a-guru", + "is-a-hard-worker", + "is-a-hunter", + "is-a-landscaper", + "is-a-lawyer", + "is-a-liberal", + "is-a-libertarian", + "is-a-llama", + "is-a-musician", + "is-a-nascarfan", + "is-a-nurse", + "is-a-painter", + "is-a-personaltrainer", + "is-a-photographer", + "is-a-player", + "is-a-republican", + "is-a-rockstar", + "is-a-socialist", + "is-a-student", + "is-a-teacher", + "is-a-techie", + "is-a-therapist", + "is-an-accountant", + "is-an-actor", + "is-an-actress", + "is-an-anarchist", + "is-an-artist", + "is-an-engineer", + "is-an-entertainer", + "is-certified", + "is-gone", + "is-into-anime", + "is-into-cars", + "is-into-cartoons", + "is-into-games", + "is-leet", + "is-not-certified", + "is-slick", + "is-uberleet", + "is-with-theband", + "isa-geek", + "isa-hockeynut", + "issmarterthanyou", + "jdevcloud", + "joyent", + "jpn", + "kozow", + "kr", + "likes-pie", + "likescandy", + "logoip", + "loseyourip", + "meteorapp", + "mex", + "myactivedirectory", + "myasustor", + "mydrobo", + "myqnapcloud", + "mysecuritycamera", + "myshopblocks", + "mytuleap", + "myvnc", + "neat-url", + "net-freaks", + "netlify", + "nfshost", + "no", + "on-aptible", + "onthewifi", + "ooguy", + "operaunite", + "outsystemscloud", + "ownprovider", + "pagefrontapp", + "pagespeedmobilizer", + "pgfog", + "pixolino", + "point2this", + "prgmr", + "publishproxy", + "qa2", + "qc", + "quicksytes", + "quipelements", + "rackmaze", + "remotewd", + "rhcloud", + "ru", + "sa", + "saves-the-whales", + "se", + "securitytactics", + "selfip", + "sells-for-less", + "sells-for-u", + "servebbs", + "servebeer", + "servecounterstrike", + "serveexchange", + "serveftp", + "servegame", + "servehalflife", + "servehttp", + "servehumour", + "serveirc", + "servemp3", + "servep2p", + "servepics", + "servequake", + "servesarcasm", + "simple-url", + "sinaapp", + "space-to-rent", + "stufftoread", + "teaches-yoga", + "temp-dns", + "theworkpc", + "townnews-staging", + "uk", + "unusualperson", + "us", + "uy", + "vipsinaapp", + "withgoogle", + "withyoutube", + "workisboring", + "wpdevcloud", + "writesthisblog", + "xenapponazure", + "yolasite", + "za", + "ap-northeast-1", + "ap-northeast-2", + "ap-south-1", + "ap-southeast-1", + "ap-southeast-2", + "ca-central-1", + "compute", + "compute-1", + "elb", + "eu-central-1", + "eu-west-1", + "eu-west-2", + "s3", + "s3-ap-northeast-1", + "s3-ap-northeast-2", + "s3-ap-south-1", + "s3-ap-southeast-1", + "s3-ap-southeast-2", + "s3-ca-central-1", + "s3-eu-central-1", + "s3-eu-west-1", + "s3-eu-west-2", + "s3-external-1", + "s3-fips-us-gov-west-1", + "s3-sa-east-1", + "s3-us-east-2", + "s3-us-gov-west-1", + "s3-us-west-1", + "s3-us-west-2", + "s3-website-ap-northeast-1", + "s3-website-ap-southeast-1", + "s3-website-ap-southeast-2", + "s3-website-eu-west-1", + "s3-website-sa-east-1", + "s3-website-us-east-1", + "s3-website-us-west-1", + "s3-website-us-west-2", + "sa-east-1", + "us-east-1", + "us-east-2", + "dualstack", + "s3", + "dualstack", + "s3", + "s3-website", + "s3", + "dualstack", + "s3", + "s3-website", + "s3", + "dualstack", + "s3", + "dualstack", + "s3", + "dualstack", + "s3", + "s3-website", + "s3", + "dualstack", + "s3", + "s3-website", + "s3", + "dualstack", + "s3", + "dualstack", + "s3", + "s3-website", + "s3", + "dualstack", + "s3", + "dualstack", + "s3", + "dualstack", + "s3", + "s3-website", + "s3", + "alpha", + "beta", + "ap-northeast-1", + "ap-northeast-2", + "ap-south-1", + "ap-southeast-1", + "ap-southeast-2", + "ca-central-1", + "eu-central-1", + "eu-west-1", + "eu-west-2", + "sa-east-1", + "us-east-1", + "us-east-2", + "us-gov-west-1", + "us-west-1", + "us-west-2", + "eu-1", + "eu-2", + "eu-3", + "eu-4", + "us-1", + "us-2", + "us-3", + "us-4", + "apps", + "cns", + "eu", + "xen", + "de", + "ac", + "co", + "ed", + "fi", + "go", + "or", + "sa", + "com", + "edu", + "gov", + "inf", + "net", + "org", + "blogspot", + "com", + "edu", + "net", + "org", + "ath", + "gov", + "info", + "ac", + "biz", + "com", + "ekloges", + "gov", + "ltd", + "name", + "net", + "org", + "parliament", + "press", + "pro", + "tm", + "blogspot", + "blogspot", + "co", + "e4", + "metacentrum", + "realm", + "cloud", + "custom", + "12hp", + "2ix", + "4lima", + "barsy", + "blogspot", + "bplaced", + "com", + "cosidns", + "dd-dns", + "ddnss", + "dnshome", + "dnsupdater", + "dray-dns", + "draydns", + "dyn-ip24", + "dyn-vpn", + "dynamisches-dns", + "dyndns1", + "dynvpn", + "firewall-gateway", + "fuettertdasnetz", + "git-repos", + "goip", + "home-webserver", + "internet-dns", + "isteingeek", + "istmein", + "keymachine", + "l-o-g-i-n", + "lcube-server", + "lebtimnetz", + "leitungsen", + "lima-city", + "logoip", + "mein-vigor", + "my-gateway", + "my-router", + "my-vigor", + "my-wan", + "myhome-server", + "spdns", + "square7", + "svn-repos", + "syno-ds", + "synology-diskstation", + "synology-ds", + "taifun-dns", + "traeumtgerade", + "dyn", + "dyn", + "dyndns", + "dyn", + "biz", + "blogspot", + "co", + "firm", + "reg", + "store", + "com", + "edu", + "gov", + "net", + "org", + "art", + "com", + "edu", + "gob", + "gov", + "mil", + "net", + "org", + "sld", + "web", + "art", + "asso", + "com", + "edu", + "gov", + "net", + "org", + "pol", + "com", + "edu", + "fin", + "gob", + "gov", + "info", + "k12", + "med", + "mil", + "net", + "org", + "pro", + "aip", + "com", + "edu", + "fie", + "gov", + "lib", + "med", + "org", + "pri", + "riik", + "blogspot", + "com", + "edu", + "eun", + "gov", + "mil", + "name", + "net", + "org", + "sci", + "blogspot", + "com", + "edu", + "gob", + "nom", + "org", + "blogspot", + "compute", + "biz", + "com", + "edu", + "gov", + "info", + "name", + "net", + "org", + "barsy", + "cloudns", + "diskstation", + "mycd", + "spdns", + "transurl", + "wellbeingzone", + "party", + "user", + "ybo", + "storj", + "aland", + "blogspot", + "dy", + "iki", + "ptplus", + "aeroport", + "assedic", + "asso", + "avocat", + "avoues", + "blogspot", + "cci", + "chambagri", + "chirurgiens-dentistes", + "chirurgiens-dentistes-en-france", + "com", + "experts-comptables", + "fbx-os", + "fbxos", + "freebox-os", + "freeboxos", + "geometre-expert", + "gouv", + "greta", + "huissier-justice", + "medecin", + "nom", + "notaires", + "on-web", + "pharmacien", + "port", + "prd", + "presse", + "tm", + "veterinaire", + "nom", + "com", + "edu", + "gov", + "mil", + "net", + "org", + "pvt", + "co", + "cya", + "net", + "org", + "com", + "edu", + "gov", + "mil", + "org", + "com", + "edu", + "gov", + "ltd", + "mod", + "org", + "co", + "com", + "edu", + "net", + "nom", + "org", + "ac", + "com", + "edu", + "gov", + "net", + "org", + "cloud", + "asso", + "com", + "edu", + "mobi", + "net", + "org", + "blogspot", + "com", + "edu", + "gov", + "net", + "nym", + "org", + "com", + "edu", + "gob", + "ind", + "mil", + "net", + "nom", + "org", + "co", + "com", + "edu", + "gov", + "net", + "org", + "blogspot", + "com", + "edu", + "gov", + "idv", + "inc", + "ltd", + "net", + "org", + "xn--55qx5d", + "xn--ciqpn", + "xn--gmq050i", + "xn--gmqw5a", + "xn--io0a7i", + "xn--lcvr32d", + "xn--mk0axi", + "xn--mxtq1m", + "xn--od0alg", + "xn--od0aq3b", + "xn--tn0ag", + "xn--uc0atv", + "xn--uc0ay4a", + "xn--wcvs22d", + "xn--zf0avx", + "com", + "edu", + "gob", + "mil", + "net", + "nom", + "org", + "cloudaccess", + "freesite", + "opencraft", + "blogspot", + "com", + "from", + "iz", + "name", + "adult", + "art", + "asso", + "com", + "coop", + "edu", + "firm", + "gouv", + "info", + "med", + "net", + "org", + "perso", + "pol", + "pro", + "rel", + "shop", + "2000", + "agrar", + "blogspot", + "bolt", + "casino", + "city", + "co", + "erotica", + "erotika", + "film", + "forum", + "games", + "hotel", + "info", + "ingatlan", + "jogasz", + "konyvelo", + "lakas", + "media", + "news", + "org", + "priv", + "reklam", + "sex", + "shop", + "sport", + "suli", + "szex", + "tm", + "tozsde", + "utazas", + "video", + "ac", + "biz", + "co", + "desa", + "go", + "mil", + "my", + "net", + "or", + "sch", + "web", + "blogspot", + "blogspot", + "gov", + "ac", + "co", + "gov", + "idf", + "k12", + "muni", + "net", + "org", + "blogspot", + "ac", + "co", + "com", + "net", + "nom", + "org", + "ro", + "tt", + "tv", + "ltd", + "plc", + "ac", + "barsy", + "blogspot", + "cloudns", + "co", + "edu", + "firm", + "gen", + "gov", + "ind", + "mil", + "net", + "nic", + "org", + "res", + "barrel-of-knowledge", + "barrell-of-knowledge", + "cloudns", + "dvrcam", + "dynamic-dns", + "dyndns", + "for-our", + "groks-the", + "groks-this", + "here-for-more", + "ilovecollege", + "knowsitall", + "no-ip", + "nsupdate", + "selfip", + "v-info", + "webhop", + "eu", + "backplaneapp", + "boxfuse", + "browsersafetymark", + "com", + "dedyn", + "definima", + "drud", + "enonic", + "github", + "gitlab", + "hasura-app", + "hzc", + "lair", + "ngrok", + "nid", + "nodeart", + "nodum", + "pantheonsite", + "protonet", + "sandcats", + "shiftedit", + "spacekit", + "stolos", + "thingdust", + "vaporcloud", + "wedeploy", + "customer", + "apps", + "stage", + "dev", + "disrec", + "prod", + "testing", + "cust", + "cust", + "cust", + "cust", + "com", + "edu", + "gov", + "mil", + "net", + "org", + "ac", + "co", + "gov", + "id", + "net", + "org", + "sch", + "xn--mgba3a4f16a", + "xn--mgba3a4fra", + "blogspot", + "com", + "cupcake", + "edu", + "gov", + "int", + "net", + "org", + "abr", + "abruzzo", + "ag", + "agrigento", + "al", + "alessandria", + "alto-adige", + "altoadige", + "an", + "ancona", + "andria-barletta-trani", + "andria-trani-barletta", + "andriabarlettatrani", + "andriatranibarletta", + "ao", + "aosta", + "aosta-valley", + "aostavalley", + "aoste", + "ap", + "aq", + "aquila", + "ar", + "arezzo", + "ascoli-piceno", + "ascolipiceno", + "asti", + "at", + "av", + "avellino", + "ba", + "balsan", + "bari", + "barletta-trani-andria", + "barlettatraniandria", + "bas", + "basilicata", + "belluno", + "benevento", + "bergamo", + "bg", + "bi", + "biella", + "bl", + "blogspot", + "bn", + "bo", + "bologna", + "bolzano", + "bozen", + "br", + "brescia", + "brindisi", + "bs", + "bt", + "bz", + "ca", + "cagliari", + "cal", + "calabria", + "caltanissetta", + "cam", + "campania", + "campidano-medio", + "campidanomedio", + "campobasso", + "carbonia-iglesias", + "carboniaiglesias", + "carrara-massa", + "carraramassa", + "caserta", + "catania", + "catanzaro", + "cb", + "ce", + "cesena-forli", + "cesenaforli", + "ch", + "chieti", + "ci", + "cl", + "cn", + "co", + "como", + "cosenza", + "cr", + "cremona", + "crotone", + "cs", + "ct", + "cuneo", + "cz", + "dell-ogliastra", + "dellogliastra", + "edu", + "emilia-romagna", + "emiliaromagna", + "emr", + "en", + "enna", + "fc", + "fe", + "fermo", + "ferrara", + "fg", + "fi", + "firenze", + "florence", + "fm", + "foggia", + "forli-cesena", + "forlicesena", + "fr", + "friuli-v-giulia", + "friuli-ve-giulia", + "friuli-vegiulia", + "friuli-venezia-giulia", + "friuli-veneziagiulia", + "friuli-vgiulia", + "friuliv-giulia", + "friulive-giulia", + "friulivegiulia", + "friulivenezia-giulia", + "friuliveneziagiulia", + "friulivgiulia", + "frosinone", + "fvg", + "ge", + "genoa", + "genova", + "go", + "gorizia", + "gov", + "gr", + "grosseto", + "iglesias-carbonia", + "iglesiascarbonia", + "im", + "imperia", + "is", + "isernia", + "kr", + "la-spezia", + "laquila", + "laspezia", + "latina", + "laz", + "lazio", + "lc", + "le", + "lecce", + "lecco", + "li", + "lig", + "liguria", + "livorno", + "lo", + "lodi", + "lom", + "lombardia", + "lombardy", + "lt", + "lu", + "lucania", + "lucca", + "macerata", + "mantova", + "mar", + "marche", + "massa-carrara", + "massacarrara", + "matera", + "mb", + "mc", + "me", + "medio-campidano", + "mediocampidano", + "messina", + "mi", + "milan", + "milano", + "mn", + "mo", + "modena", + "mol", + "molise", + "monza", + "monza-brianza", + "monza-e-della-brianza", + "monzabrianza", + "monzaebrianza", + "monzaedellabrianza", + "ms", + "mt", + "na", + "naples", + "napoli", + "no", + "novara", + "nu", + "nuoro", + "og", + "ogliastra", + "olbia-tempio", + "olbiatempio", + "or", + "oristano", + "ot", + "pa", + "padova", + "padua", + "palermo", + "parma", + "pavia", + "pc", + "pd", + "pe", + "perugia", + "pesaro-urbino", + "pesarourbino", + "pescara", + "pg", + "pi", + "piacenza", + "piedmont", + "piemonte", + "pisa", + "pistoia", + "pmn", + "pn", + "po", + "pordenone", + "potenza", + "pr", + "prato", + "pt", + "pu", + "pug", + "puglia", + "pv", + "pz", + "ra", + "ragusa", + "ravenna", + "rc", + "re", + "reggio-calabria", + "reggio-emilia", + "reggiocalabria", + "reggioemilia", + "rg", + "ri", + "rieti", + "rimini", + "rm", + "rn", + "ro", + "roma", + "rome", + "rovigo", + "sa", + "salerno", + "sar", + "sardegna", + "sardinia", + "sassari", + "savona", + "si", + "sic", + "sicilia", + "sicily", + "siena", + "siracusa", + "so", + "sondrio", + "sp", + "sr", + "ss", + "suedtirol", + "sv", + "ta", + "taa", + "taranto", + "te", + "tempio-olbia", + "tempioolbia", + "teramo", + "terni", + "tn", + "to", + "torino", + "tos", + "toscana", + "tp", + "tr", + "trani-andria-barletta", + "trani-barletta-andria", + "traniandriabarletta", + "tranibarlettaandria", + "trapani", + "trentino", + "trentino-a-adige", + "trentino-aadige", + "trentino-alto-adige", + "trentino-altoadige", + "trentino-s-tirol", + "trentino-stirol", + "trentino-sud-tirol", + "trentino-sudtirol", + "trentino-sued-tirol", + "trentino-suedtirol", + "trentinoa-adige", + "trentinoaadige", + "trentinoalto-adige", + "trentinoaltoadige", + "trentinos-tirol", + "trentinostirol", + "trentinosud-tirol", + "trentinosudtirol", + "trentinosued-tirol", + "trentinosuedtirol", + "trento", + "treviso", + "trieste", + "ts", + "turin", + "tuscany", + "tv", + "ud", + "udine", + "umb", + "umbria", + "urbino-pesaro", + "urbinopesaro", + "va", + "val-d-aosta", + "val-daosta", + "vald-aosta", + "valdaosta", + "valle-aosta", + "valle-d-aosta", + "valle-daosta", + "valleaosta", + "valled-aosta", + "valledaosta", + "vallee-aoste", + "valleeaoste", + "vao", + "varese", + "vb", + "vc", + "vda", + "ve", + "ven", + "veneto", + "venezia", + "venice", + "verbania", + "vercelli", + "verona", + "vi", + "vibo-valentia", + "vibovalentia", + "vicenza", + "viterbo", + "vr", + "vs", + "vt", + "vv", + "co", + "net", + "org", + "com", + "edu", + "gov", + "mil", + "name", + "net", + "org", + "sch", + "ac", + "ad", + "aichi", + "akita", + "aomori", + "blogspot", + "chiba", + "co", + "ed", + "ehime", + "fukui", + "fukuoka", + "fukushima", + "gifu", + "go", + "gr", + "gunma", + "hiroshima", + "hokkaido", + "hyogo", + "ibaraki", + "ishikawa", + "iwate", + "kagawa", + "kagoshima", + "kanagawa", + "kawasaki", + "kitakyushu", + "kobe", + "kochi", + "kumamoto", + "kyoto", + "lg", + "mie", + "miyagi", + "miyazaki", + "nagano", + "nagasaki", + "nagoya", + "nara", + "ne", + "niigata", + "oita", + "okayama", + "okinawa", + "or", + "osaka", + "saga", + "saitama", + "sapporo", + "sendai", + "shiga", + "shimane", + "shizuoka", + "tochigi", + "tokushima", + "tokyo", + "tottori", + "toyama", + "wakayama", + "xn--0trq7p7nn", + "xn--1ctwo", + "xn--1lqs03n", + "xn--1lqs71d", + "xn--2m4a15e", + "xn--32vp30h", + "xn--4it168d", + "xn--4it797k", + "xn--4pvxs", + "xn--5js045d", + "xn--5rtp49c", + "xn--5rtq34k", + "xn--6btw5a", + "xn--6orx2r", + "xn--7t0a264c", + "xn--8ltr62k", + "xn--8pvr4u", + "xn--c3s14m", + "xn--d5qv7z876c", + "xn--djrs72d6uy", + "xn--djty4k", + "xn--efvn9s", + "xn--ehqz56n", + "xn--elqq16h", + "xn--f6qx53a", + "xn--k7yn95e", + "xn--kbrq7o", + "xn--klt787d", + "xn--kltp7d", + "xn--kltx9a", + "xn--klty5x", + "xn--mkru45i", + "xn--nit225k", + "xn--ntso0iqx3a", + "xn--ntsq17g", + "xn--pssu33l", + "xn--qqqt11m", + "xn--rht27z", + "xn--rht3d", + "xn--rht61e", + "xn--rny31h", + "xn--tor131o", + "xn--uist22h", + "xn--uisz3g", + "xn--uuwu58a", + "xn--vgu402c", + "xn--zbx025d", + "yamagata", + "yamaguchi", + "yamanashi", + "yokohama", + "aisai", + "ama", + "anjo", + "asuke", + "chiryu", + "chita", + "fuso", + "gamagori", + "handa", + "hazu", + "hekinan", + "higashiura", + "ichinomiya", + "inazawa", + "inuyama", + "isshiki", + "iwakura", + "kanie", + "kariya", + "kasugai", + "kira", + "kiyosu", + "komaki", + "konan", + "kota", + "mihama", + "miyoshi", + "nishio", + "nisshin", + "obu", + "oguchi", + "oharu", + "okazaki", + "owariasahi", + "seto", + "shikatsu", + "shinshiro", + "shitara", + "tahara", + "takahama", + "tobishima", + "toei", + "togo", + "tokai", + "tokoname", + "toyoake", + "toyohashi", + "toyokawa", + "toyone", + "toyota", + "tsushima", + "yatomi", + "akita", + "daisen", + "fujisato", + "gojome", + "hachirogata", + "happou", + "higashinaruse", + "honjo", + "honjyo", + "ikawa", + "kamikoani", + "kamioka", + "katagami", + "kazuno", + "kitaakita", + "kosaka", + "kyowa", + "misato", + "mitane", + "moriyoshi", + "nikaho", + "noshiro", + "odate", + "oga", + "ogata", + "semboku", + "yokote", + "yurihonjo", + "aomori", + "gonohe", + "hachinohe", + "hashikami", + "hiranai", + "hirosaki", + "itayanagi", + "kuroishi", + "misawa", + "mutsu", + "nakadomari", + "noheji", + "oirase", + "owani", + "rokunohe", + "sannohe", + "shichinohe", + "shingo", + "takko", + "towada", + "tsugaru", + "tsuruta", + "abiko", + "asahi", + "chonan", + "chosei", + "choshi", + "chuo", + "funabashi", + "futtsu", + "hanamigawa", + "ichihara", + "ichikawa", + "ichinomiya", + "inzai", + "isumi", + "kamagaya", + "kamogawa", + "kashiwa", + "katori", + "katsuura", + "kimitsu", + "kisarazu", + "kozaki", + "kujukuri", + "kyonan", + "matsudo", + "midori", + "mihama", + "minamiboso", + "mobara", + "mutsuzawa", + "nagara", + "nagareyama", + "narashino", + "narita", + "noda", + "oamishirasato", + "omigawa", + "onjuku", + "otaki", + "sakae", + "sakura", + "shimofusa", + "shirako", + "shiroi", + "shisui", + "sodegaura", + "sosa", + "tako", + "tateyama", + "togane", + "tohnosho", + "tomisato", + "urayasu", + "yachimata", + "yachiyo", + "yokaichiba", + "yokoshibahikari", + "yotsukaido", + "ainan", + "honai", + "ikata", + "imabari", + "iyo", + "kamijima", + "kihoku", + "kumakogen", + "masaki", + "matsuno", + "matsuyama", + "namikata", + "niihama", + "ozu", + "saijo", + "seiyo", + "shikokuchuo", + "tobe", + "toon", + "uchiko", + "uwajima", + "yawatahama", + "echizen", + "eiheiji", + "fukui", + "ikeda", + "katsuyama", + "mihama", + "minamiechizen", + "obama", + "ohi", + "ono", + "sabae", + "sakai", + "takahama", + "tsuruga", + "wakasa", + "ashiya", + "buzen", + "chikugo", + "chikuho", + "chikujo", + "chikushino", + "chikuzen", + "chuo", + "dazaifu", + "fukuchi", + "hakata", + "higashi", + "hirokawa", + "hisayama", + "iizuka", + "inatsuki", + "kaho", + "kasuga", + "kasuya", + "kawara", + "keisen", + "koga", + "kurate", + "kurogi", + "kurume", + "minami", + "miyako", + "miyama", + "miyawaka", + "mizumaki", + "munakata", + "nakagawa", + "nakama", + "nishi", + "nogata", + "ogori", + "okagaki", + "okawa", + "oki", + "omuta", + "onga", + "onojo", + "oto", + "saigawa", + "sasaguri", + "shingu", + "shinyoshitomi", + "shonai", + "soeda", + "sue", + "tachiarai", + "tagawa", + "takata", + "toho", + "toyotsu", + "tsuiki", + "ukiha", + "umi", + "usui", + "yamada", + "yame", + "yanagawa", + "yukuhashi", + "aizubange", + "aizumisato", + "aizuwakamatsu", + "asakawa", + "bandai", + "date", + "fukushima", + "furudono", + "futaba", + "hanawa", + "higashi", + "hirata", + "hirono", + "iitate", + "inawashiro", + "ishikawa", + "iwaki", + "izumizaki", + "kagamiishi", + "kaneyama", + "kawamata", + "kitakata", + "kitashiobara", + "koori", + "koriyama", + "kunimi", + "miharu", + "mishima", + "namie", + "nango", + "nishiaizu", + "nishigo", + "okuma", + "omotego", + "ono", + "otama", + "samegawa", + "shimogo", + "shirakawa", + "showa", + "soma", + "sukagawa", + "taishin", + "tamakawa", + "tanagura", + "tenei", + "yabuki", + "yamato", + "yamatsuri", + "yanaizu", + "yugawa", + "anpachi", + "ena", + "gifu", + "ginan", + "godo", + "gujo", + "hashima", + "hichiso", + "hida", + "higashishirakawa", + "ibigawa", + "ikeda", + "kakamigahara", + "kani", + "kasahara", + "kasamatsu", + "kawaue", + "kitagata", + "mino", + "minokamo", + "mitake", + "mizunami", + "motosu", + "nakatsugawa", + "ogaki", + "sakahogi", + "seki", + "sekigahara", + "shirakawa", + "tajimi", + "takayama", + "tarui", + "toki", + "tomika", + "wanouchi", + "yamagata", + "yaotsu", + "yoro", + "annaka", + "chiyoda", + "fujioka", + "higashiagatsuma", + "isesaki", + "itakura", + "kanna", + "kanra", + "katashina", + "kawaba", + "kiryu", + "kusatsu", + "maebashi", + "meiwa", + "midori", + "minakami", + "naganohara", + "nakanojo", + "nanmoku", + "numata", + "oizumi", + "ora", + "ota", + "shibukawa", + "shimonita", + "shinto", + "showa", + "takasaki", + "takayama", + "tamamura", + "tatebayashi", + "tomioka", + "tsukiyono", + "tsumagoi", + "ueno", + "yoshioka", + "asaminami", + "daiwa", + "etajima", + "fuchu", + "fukuyama", + "hatsukaichi", + "higashihiroshima", + "hongo", + "jinsekikogen", + "kaita", + "kui", + "kumano", + "kure", + "mihara", + "miyoshi", + "naka", + "onomichi", + "osakikamijima", + "otake", + "saka", + "sera", + "seranishi", + "shinichi", + "shobara", + "takehara", + "abashiri", + "abira", + "aibetsu", + "akabira", + "akkeshi", + "asahikawa", + "ashibetsu", + "ashoro", + "assabu", + "atsuma", + "bibai", + "biei", + "bifuka", + "bihoro", + "biratori", + "chippubetsu", + "chitose", + "date", + "ebetsu", + "embetsu", + "eniwa", + "erimo", + "esan", + "esashi", + "fukagawa", + "fukushima", + "furano", + "furubira", + "haboro", + "hakodate", + "hamatonbetsu", + "hidaka", + "higashikagura", + "higashikawa", + "hiroo", + "hokuryu", + "hokuto", + "honbetsu", + "horokanai", + "horonobe", + "ikeda", + "imakane", + "ishikari", + "iwamizawa", + "iwanai", + "kamifurano", + "kamikawa", + "kamishihoro", + "kamisunagawa", + "kamoenai", + "kayabe", + "kembuchi", + "kikonai", + "kimobetsu", + "kitahiroshima", + "kitami", + "kiyosato", + "koshimizu", + "kunneppu", + "kuriyama", + "kuromatsunai", + "kushiro", + "kutchan", + "kyowa", + "mashike", + "matsumae", + "mikasa", + "minamifurano", + "mombetsu", + "moseushi", + "mukawa", + "muroran", + "naie", + "nakagawa", + "nakasatsunai", + "nakatombetsu", + "nanae", + "nanporo", + "nayoro", + "nemuro", + "niikappu", + "niki", + "nishiokoppe", + "noboribetsu", + "numata", + "obihiro", + "obira", + "oketo", + "okoppe", + "otaru", + "otobe", + "otofuke", + "otoineppu", + "oumu", + "ozora", + "pippu", + "rankoshi", + "rebun", + "rikubetsu", + "rishiri", + "rishirifuji", + "saroma", + "sarufutsu", + "shakotan", + "shari", + "shibecha", + "shibetsu", + "shikabe", + "shikaoi", + "shimamaki", + "shimizu", + "shimokawa", + "shinshinotsu", + "shintoku", + "shiranuka", + "shiraoi", + "shiriuchi", + "sobetsu", + "sunagawa", + "taiki", + "takasu", + "takikawa", + "takinoue", + "teshikaga", + "tobetsu", + "tohma", + "tomakomai", + "tomari", + "toya", + "toyako", + "toyotomi", + "toyoura", + "tsubetsu", + "tsukigata", + "urakawa", + "urausu", + "uryu", + "utashinai", + "wakkanai", + "wassamu", + "yakumo", + "yoichi", + "aioi", + "akashi", + "ako", + "amagasaki", + "aogaki", + "asago", + "ashiya", + "awaji", + "fukusaki", + "goshiki", + "harima", + "himeji", + "ichikawa", + "inagawa", + "itami", + "kakogawa", + "kamigori", + "kamikawa", + "kasai", + "kasuga", + "kawanishi", + "miki", + "minamiawaji", + "nishinomiya", + "nishiwaki", + "ono", + "sanda", + "sannan", + "sasayama", + "sayo", + "shingu", + "shinonsen", + "shiso", + "sumoto", + "taishi", + "taka", + "takarazuka", + "takasago", + "takino", + "tamba", + "tatsuno", + "toyooka", + "yabu", + "yashiro", + "yoka", + "yokawa", + "ami", + "asahi", + "bando", + "chikusei", + "daigo", + "fujishiro", + "hitachi", + "hitachinaka", + "hitachiomiya", + "hitachiota", + "ibaraki", + "ina", + "inashiki", + "itako", + "iwama", + "joso", + "kamisu", + "kasama", + "kashima", + "kasumigaura", + "koga", + "miho", + "mito", + "moriya", + "naka", + "namegata", + "oarai", + "ogawa", + "omitama", + "ryugasaki", + "sakai", + "sakuragawa", + "shimodate", + "shimotsuma", + "shirosato", + "sowa", + "suifu", + "takahagi", + "tamatsukuri", + "tokai", + "tomobe", + "tone", + "toride", + "tsuchiura", + "tsukuba", + "uchihara", + "ushiku", + "yachiyo", + "yamagata", + "yawara", + "yuki", + "anamizu", + "hakui", + "hakusan", + "kaga", + "kahoku", + "kanazawa", + "kawakita", + "komatsu", + "nakanoto", + "nanao", + "nomi", + "nonoichi", + "noto", + "shika", + "suzu", + "tsubata", + "tsurugi", + "uchinada", + "wajima", + "fudai", + "fujisawa", + "hanamaki", + "hiraizumi", + "hirono", + "ichinohe", + "ichinoseki", + "iwaizumi", + "iwate", + "joboji", + "kamaishi", + "kanegasaki", + "karumai", + "kawai", + "kitakami", + "kuji", + "kunohe", + "kuzumaki", + "miyako", + "mizusawa", + "morioka", + "ninohe", + "noda", + "ofunato", + "oshu", + "otsuchi", + "rikuzentakata", + "shiwa", + "shizukuishi", + "sumita", + "tanohata", + "tono", + "yahaba", + "yamada", + "ayagawa", + "higashikagawa", + "kanonji", + "kotohira", + "manno", + "marugame", + "mitoyo", + "naoshima", + "sanuki", + "tadotsu", + "takamatsu", + "tonosho", + "uchinomi", + "utazu", + "zentsuji", + "akune", + "amami", + "hioki", + "isa", + "isen", + "izumi", + "kagoshima", + "kanoya", + "kawanabe", + "kinko", + "kouyama", + "makurazaki", + "matsumoto", + "minamitane", + "nakatane", + "nishinoomote", + "satsumasendai", + "soo", + "tarumizu", + "yusui", + "aikawa", + "atsugi", + "ayase", + "chigasaki", + "ebina", + "fujisawa", + "hadano", + "hakone", + "hiratsuka", + "isehara", + "kaisei", + "kamakura", + "kiyokawa", + "matsuda", + "minamiashigara", + "miura", + "nakai", + "ninomiya", + "odawara", + "oi", + "oiso", + "sagamihara", + "samukawa", + "tsukui", + "yamakita", + "yamato", + "yokosuka", + "yugawara", + "zama", + "zushi", + "city", + "city", + "city", + "aki", + "geisei", + "hidaka", + "higashitsuno", + "ino", + "kagami", + "kami", + "kitagawa", + "kochi", + "mihara", + "motoyama", + "muroto", + "nahari", + "nakamura", + "nankoku", + "nishitosa", + "niyodogawa", + "ochi", + "okawa", + "otoyo", + "otsuki", + "sakawa", + "sukumo", + "susaki", + "tosa", + "tosashimizu", + "toyo", + "tsuno", + "umaji", + "yasuda", + "yusuhara", + "amakusa", + "arao", + "aso", + "choyo", + "gyokuto", + "kamiamakusa", + "kikuchi", + "kumamoto", + "mashiki", + "mifune", + "minamata", + "minamioguni", + "nagasu", + "nishihara", + "oguni", + "ozu", + "sumoto", + "takamori", + "uki", + "uto", + "yamaga", + "yamato", + "yatsushiro", + "ayabe", + "fukuchiyama", + "higashiyama", + "ide", + "ine", + "joyo", + "kameoka", + "kamo", + "kita", + "kizu", + "kumiyama", + "kyotamba", + "kyotanabe", + "kyotango", + "maizuru", + "minami", + "minamiyamashiro", + "miyazu", + "muko", + "nagaokakyo", + "nakagyo", + "nantan", + "oyamazaki", + "sakyo", + "seika", + "tanabe", + "uji", + "ujitawara", + "wazuka", + "yamashina", + "yawata", + "asahi", + "inabe", + "ise", + "kameyama", + "kawagoe", + "kiho", + "kisosaki", + "kiwa", + "komono", + "kumano", + "kuwana", + "matsusaka", + "meiwa", + "mihama", + "minamiise", + "misugi", + "miyama", + "nabari", + "shima", + "suzuka", + "tado", + "taiki", + "taki", + "tamaki", + "toba", + "tsu", + "udono", + "ureshino", + "watarai", + "yokkaichi", + "furukawa", + "higashimatsushima", + "ishinomaki", + "iwanuma", + "kakuda", + "kami", + "kawasaki", + "marumori", + "matsushima", + "minamisanriku", + "misato", + "murata", + "natori", + "ogawara", + "ohira", + "onagawa", + "osaki", + "rifu", + "semine", + "shibata", + "shichikashuku", + "shikama", + "shiogama", + "shiroishi", + "tagajo", + "taiwa", + "tome", + "tomiya", + "wakuya", + "watari", + "yamamoto", + "zao", + "aya", + "ebino", + "gokase", + "hyuga", + "kadogawa", + "kawaminami", + "kijo", + "kitagawa", + "kitakata", + "kitaura", + "kobayashi", + "kunitomi", + "kushima", + "mimata", + "miyakonojo", + "miyazaki", + "morotsuka", + "nichinan", + "nishimera", + "nobeoka", + "saito", + "shiiba", + "shintomi", + "takaharu", + "takanabe", + "takazaki", + "tsuno", + "achi", + "agematsu", + "anan", + "aoki", + "asahi", + "azumino", + "chikuhoku", + "chikuma", + "chino", + "fujimi", + "hakuba", + "hara", + "hiraya", + "iida", + "iijima", + "iiyama", + "iizuna", + "ikeda", + "ikusaka", + "ina", + "karuizawa", + "kawakami", + "kiso", + "kisofukushima", + "kitaaiki", + "komagane", + "komoro", + "matsukawa", + "matsumoto", + "miasa", + "minamiaiki", + "minamimaki", + "minamiminowa", + "minowa", + "miyada", + "miyota", + "mochizuki", + "nagano", + "nagawa", + "nagiso", + "nakagawa", + "nakano", + "nozawaonsen", + "obuse", + "ogawa", + "okaya", + "omachi", + "omi", + "ookuwa", + "ooshika", + "otaki", + "otari", + "sakae", + "sakaki", + "saku", + "sakuho", + "shimosuwa", + "shinanomachi", + "shiojiri", + "suwa", + "suzaka", + "takagi", + "takamori", + "takayama", + "tateshina", + "tatsuno", + "togakushi", + "togura", + "tomi", + "ueda", + "wada", + "yamagata", + "yamanouchi", + "yasaka", + "yasuoka", + "chijiwa", + "futsu", + "goto", + "hasami", + "hirado", + "iki", + "isahaya", + "kawatana", + "kuchinotsu", + "matsuura", + "nagasaki", + "obama", + "omura", + "oseto", + "saikai", + "sasebo", + "seihi", + "shimabara", + "shinkamigoto", + "togitsu", + "tsushima", + "unzen", + "city", + "ando", + "gose", + "heguri", + "higashiyoshino", + "ikaruga", + "ikoma", + "kamikitayama", + "kanmaki", + "kashiba", + "kashihara", + "katsuragi", + "kawai", + "kawakami", + "kawanishi", + "koryo", + "kurotaki", + "mitsue", + "miyake", + "nara", + "nosegawa", + "oji", + "ouda", + "oyodo", + "sakurai", + "sango", + "shimoichi", + "shimokitayama", + "shinjo", + "soni", + "takatori", + "tawaramoto", + "tenkawa", + "tenri", + "uda", + "yamatokoriyama", + "yamatotakada", + "yamazoe", + "yoshino", + "aga", + "agano", + "gosen", + "itoigawa", + "izumozaki", + "joetsu", + "kamo", + "kariwa", + "kashiwazaki", + "minamiuonuma", + "mitsuke", + "muika", + "murakami", + "myoko", + "nagaoka", + "niigata", + "ojiya", + "omi", + "sado", + "sanjo", + "seiro", + "seirou", + "sekikawa", + "shibata", + "tagami", + "tainai", + "tochio", + "tokamachi", + "tsubame", + "tsunan", + "uonuma", + "yahiko", + "yoita", + "yuzawa", + "beppu", + "bungoono", + "bungotakada", + "hasama", + "hiji", + "himeshima", + "hita", + "kamitsue", + "kokonoe", + "kuju", + "kunisaki", + "kusu", + "oita", + "saiki", + "taketa", + "tsukumi", + "usa", + "usuki", + "yufu", + "akaiwa", + "asakuchi", + "bizen", + "hayashima", + "ibara", + "kagamino", + "kasaoka", + "kibichuo", + "kumenan", + "kurashiki", + "maniwa", + "misaki", + "nagi", + "niimi", + "nishiawakura", + "okayama", + "satosho", + "setouchi", + "shinjo", + "shoo", + "soja", + "takahashi", + "tamano", + "tsuyama", + "wake", + "yakage", + "aguni", + "ginowan", + "ginoza", + "gushikami", + "haebaru", + "higashi", + "hirara", + "iheya", + "ishigaki", + "ishikawa", + "itoman", + "izena", + "kadena", + "kin", + "kitadaito", + "kitanakagusuku", + "kumejima", + "kunigami", + "minamidaito", + "motobu", + "nago", + "naha", + "nakagusuku", + "nakijin", + "nanjo", + "nishihara", + "ogimi", + "okinawa", + "onna", + "shimoji", + "taketomi", + "tarama", + "tokashiki", + "tomigusuku", + "tonaki", + "urasoe", + "uruma", + "yaese", + "yomitan", + "yonabaru", + "yonaguni", + "zamami", + "abeno", + "chihayaakasaka", + "chuo", + "daito", + "fujiidera", + "habikino", + "hannan", + "higashiosaka", + "higashisumiyoshi", + "higashiyodogawa", + "hirakata", + "ibaraki", + "ikeda", + "izumi", + "izumiotsu", + "izumisano", + "kadoma", + "kaizuka", + "kanan", + "kashiwara", + "katano", + "kawachinagano", + "kishiwada", + "kita", + "kumatori", + "matsubara", + "minato", + "minoh", + "misaki", + "moriguchi", + "neyagawa", + "nishi", + "nose", + "osakasayama", + "sakai", + "sayama", + "sennan", + "settsu", + "shijonawate", + "shimamoto", + "suita", + "tadaoka", + "taishi", + "tajiri", + "takaishi", + "takatsuki", + "tondabayashi", + "toyonaka", + "toyono", + "yao", + "ariake", + "arita", + "fukudomi", + "genkai", + "hamatama", + "hizen", + "imari", + "kamimine", + "kanzaki", + "karatsu", + "kashima", + "kitagata", + "kitahata", + "kiyama", + "kouhoku", + "kyuragi", + "nishiarita", + "ogi", + "omachi", + "ouchi", + "saga", + "shiroishi", + "taku", + "tara", + "tosu", + "yoshinogari", + "arakawa", + "asaka", + "chichibu", + "fujimi", + "fujimino", + "fukaya", + "hanno", + "hanyu", + "hasuda", + "hatogaya", + "hatoyama", + "hidaka", + "higashichichibu", + "higashimatsuyama", + "honjo", + "ina", + "iruma", + "iwatsuki", + "kamiizumi", + "kamikawa", + "kamisato", + "kasukabe", + "kawagoe", + "kawaguchi", + "kawajima", + "kazo", + "kitamoto", + "koshigaya", + "kounosu", + "kuki", + "kumagaya", + "matsubushi", + "minano", + "misato", + "miyashiro", + "miyoshi", + "moroyama", + "nagatoro", + "namegawa", + "niiza", + "ogano", + "ogawa", + "ogose", + "okegawa", + "omiya", + "otaki", + "ranzan", + "ryokami", + "saitama", + "sakado", + "satte", + "sayama", + "shiki", + "shiraoka", + "soka", + "sugito", + "toda", + "tokigawa", + "tokorozawa", + "tsurugashima", + "urawa", + "warabi", + "yashio", + "yokoze", + "yono", + "yorii", + "yoshida", + "yoshikawa", + "yoshimi", + "city", + "city", + "aisho", + "gamo", + "higashiomi", + "hikone", + "koka", + "konan", + "kosei", + "koto", + "kusatsu", + "maibara", + "moriyama", + "nagahama", + "nishiazai", + "notogawa", + "omihachiman", + "otsu", + "ritto", + "ryuoh", + "takashima", + "takatsuki", + "torahime", + "toyosato", + "yasu", + "akagi", + "ama", + "gotsu", + "hamada", + "higashiizumo", + "hikawa", + "hikimi", + "izumo", + "kakinoki", + "masuda", + "matsue", + "misato", + "nishinoshima", + "ohda", + "okinoshima", + "okuizumo", + "shimane", + "tamayu", + "tsuwano", + "unnan", + "yakumo", + "yasugi", + "yatsuka", + "arai", + "atami", + "fuji", + "fujieda", + "fujikawa", + "fujinomiya", + "fukuroi", + "gotemba", + "haibara", + "hamamatsu", + "higashiizu", + "ito", + "iwata", + "izu", + "izunokuni", + "kakegawa", + "kannami", + "kawanehon", + "kawazu", + "kikugawa", + "kosai", + "makinohara", + "matsuzaki", + "minamiizu", + "mishima", + "morimachi", + "nishiizu", + "numazu", + "omaezaki", + "shimada", + "shimizu", + "shimoda", + "shizuoka", + "susono", + "yaizu", + "yoshida", + "ashikaga", + "bato", + "haga", + "ichikai", + "iwafune", + "kaminokawa", + "kanuma", + "karasuyama", + "kuroiso", + "mashiko", + "mibu", + "moka", + "motegi", + "nasu", + "nasushiobara", + "nikko", + "nishikata", + "nogi", + "ohira", + "ohtawara", + "oyama", + "sakura", + "sano", + "shimotsuke", + "shioya", + "takanezawa", + "tochigi", + "tsuga", + "ujiie", + "utsunomiya", + "yaita", + "aizumi", + "anan", + "ichiba", + "itano", + "kainan", + "komatsushima", + "matsushige", + "mima", + "minami", + "miyoshi", + "mugi", + "nakagawa", + "naruto", + "sanagochi", + "shishikui", + "tokushima", + "wajiki", + "adachi", + "akiruno", + "akishima", + "aogashima", + "arakawa", + "bunkyo", + "chiyoda", + "chofu", + "chuo", + "edogawa", + "fuchu", + "fussa", + "hachijo", + "hachioji", + "hamura", + "higashikurume", + "higashimurayama", + "higashiyamato", + "hino", + "hinode", + "hinohara", + "inagi", + "itabashi", + "katsushika", + "kita", + "kiyose", + "kodaira", + "koganei", + "kokubunji", + "komae", + "koto", + "kouzushima", + "kunitachi", + "machida", + "meguro", + "minato", + "mitaka", + "mizuho", + "musashimurayama", + "musashino", + "nakano", + "nerima", + "ogasawara", + "okutama", + "ome", + "oshima", + "ota", + "setagaya", + "shibuya", + "shinagawa", + "shinjuku", + "suginami", + "sumida", + "tachikawa", + "taito", + "tama", + "toshima", + "chizu", + "hino", + "kawahara", + "koge", + "kotoura", + "misasa", + "nanbu", + "nichinan", + "sakaiminato", + "tottori", + "wakasa", + "yazu", + "yonago", + "asahi", + "fuchu", + "fukumitsu", + "funahashi", + "himi", + "imizu", + "inami", + "johana", + "kamiichi", + "kurobe", + "nakaniikawa", + "namerikawa", + "nanto", + "nyuzen", + "oyabe", + "taira", + "takaoka", + "tateyama", + "toga", + "tonami", + "toyama", + "unazuki", + "uozu", + "yamada", + "arida", + "aridagawa", + "gobo", + "hashimoto", + "hidaka", + "hirogawa", + "inami", + "iwade", + "kainan", + "kamitonda", + "katsuragi", + "kimino", + "kinokawa", + "kitayama", + "koya", + "koza", + "kozagawa", + "kudoyama", + "kushimoto", + "mihama", + "misato", + "nachikatsuura", + "shingu", + "shirahama", + "taiji", + "tanabe", + "wakayama", + "yuasa", + "yura", + "asahi", + "funagata", + "higashine", + "iide", + "kahoku", + "kaminoyama", + "kaneyama", + "kawanishi", + "mamurogawa", + "mikawa", + "murayama", + "nagai", + "nakayama", + "nanyo", + "nishikawa", + "obanazawa", + "oe", + "oguni", + "ohkura", + "oishida", + "sagae", + "sakata", + "sakegawa", + "shinjo", + "shirataka", + "shonai", + "takahata", + "tendo", + "tozawa", + "tsuruoka", + "yamagata", + "yamanobe", + "yonezawa", + "yuza", + "abu", + "hagi", + "hikari", + "hofu", + "iwakuni", + "kudamatsu", + "mitou", + "nagato", + "oshima", + "shimonoseki", + "shunan", + "tabuse", + "tokuyama", + "toyota", + "ube", + "yuu", + "chuo", + "doshi", + "fuefuki", + "fujikawa", + "fujikawaguchiko", + "fujiyoshida", + "hayakawa", + "hokuto", + "ichikawamisato", + "kai", + "kofu", + "koshu", + "kosuge", + "minami-alps", + "minobu", + "nakamichi", + "nanbu", + "narusawa", + "nirasaki", + "nishikatsura", + "oshino", + "otsuki", + "showa", + "tabayama", + "tsuru", + "uenohara", + "yamanakako", + "yamanashi", + "city", + "co", + "blogspot", + "com", + "edu", + "gov", + "mil", + "net", + "org", + "biz", + "com", + "edu", + "gov", + "info", + "net", + "org", + "ass", + "asso", + "com", + "coop", + "edu", + "gouv", + "gov", + "medecin", + "mil", + "nom", + "notaires", + "org", + "pharmaciens", + "prd", + "presse", + "tm", + "veterinaire", + "edu", + "gov", + "net", + "org", + "com", + "edu", + "gov", + "org", + "rep", + "tra", + "ac", + "blogspot", + "busan", + "chungbuk", + "chungnam", + "co", + "daegu", + "daejeon", + "es", + "gangwon", + "go", + "gwangju", + "gyeongbuk", + "gyeonggi", + "gyeongnam", + "hs", + "incheon", + "jeju", + "jeonbuk", + "jeonnam", + "kg", + "mil", + "ms", + "ne", + "or", + "pe", + "re", + "sc", + "seoul", + "ulsan", + "co", + "edu", + "com", + "edu", + "gov", + "net", + "org", + "com", + "edu", + "gov", + "mil", + "net", + "nym", + "org", + "bnr", + "c", + "com", + "edu", + "gov", + "info", + "int", + "net", + "nym", + "org", + "per", + "static", + "dev", + "sites", + "com", + "edu", + "gov", + "net", + "org", + "co", + "com", + "edu", + "gov", + "net", + "org", + "oy", + "blogspot", + "nom", + "nym", + "cyon", + "mypep", + "ac", + "assn", + "com", + "edu", + "gov", + "grp", + "hotel", + "int", + "ltd", + "net", + "ngo", + "org", + "sch", + "soc", + "web", + "com", + "edu", + "gov", + "net", + "org", + "co", + "org", + "blogspot", + "gov", + "nym", + "blogspot", + "nym", + "asn", + "com", + "conf", + "edu", + "gov", + "id", + "mil", + "net", + "org", + "com", + "edu", + "gov", + "id", + "med", + "net", + "org", + "plc", + "sch", + "ac", + "co", + "gov", + "net", + "org", + "press", + "router", + "asso", + "tm", + "blogspot", + "ac", + "brasilia", + "c66", + "co", + "daplie", + "ddns", + "diskstation", + "dnsfor", + "dscloud", + "edu", + "filegear", + "gov", + "hopto", + "i234", + "its", + "loginto", + "myds", + "net", + "noip", + "nym", + "org", + "priv", + "synology", + "webhop", + "wedeploy", + "yombo", + "localhost", + "co", + "com", + "edu", + "gov", + "mil", + "nom", + "org", + "prd", + "tm", + "blogspot", + "com", + "edu", + "gov", + "inf", + "name", + "net", + "nom", + "org", + "com", + "edu", + "gouv", + "gov", + "net", + "org", + "presse", + "edu", + "gov", + "nyc", + "org", + "com", + "edu", + "gov", + "net", + "org", + "dscloud", + "blogspot", + "gov", + "com", + "edu", + "gov", + "net", + "org", + "com", + "edu", + "net", + "org", + "blogspot", + "ac", + "co", + "com", + "gov", + "net", + "or", + "org", + "academy", + "agriculture", + "air", + "airguard", + "alabama", + "alaska", + "amber", + "ambulance", + "american", + "americana", + "americanantiques", + "americanart", + "amsterdam", + "and", + "annefrank", + "anthro", + "anthropology", + "antiques", + "aquarium", + "arboretum", + "archaeological", + "archaeology", + "architecture", + "art", + "artanddesign", + "artcenter", + "artdeco", + "arteducation", + "artgallery", + "arts", + "artsandcrafts", + "asmatart", + "assassination", + "assisi", + "association", + "astronomy", + "atlanta", + "austin", + "australia", + "automotive", + "aviation", + "axis", + "badajoz", + "baghdad", + "bahn", + "bale", + "baltimore", + "barcelona", + "baseball", + "basel", + "baths", + "bauern", + "beauxarts", + "beeldengeluid", + "bellevue", + "bergbau", + "berkeley", + "berlin", + "bern", + "bible", + "bilbao", + "bill", + "birdart", + "birthplace", + "bonn", + "boston", + "botanical", + "botanicalgarden", + "botanicgarden", + "botany", + "brandywinevalley", + "brasil", + "bristol", + "british", + "britishcolumbia", + "broadcast", + "brunel", + "brussel", + "brussels", + "bruxelles", + "building", + "burghof", + "bus", + "bushey", + "cadaques", + "california", + "cambridge", + "can", + "canada", + "capebreton", + "carrier", + "cartoonart", + "casadelamoneda", + "castle", + "castres", + "celtic", + "center", + "chattanooga", + "cheltenham", + "chesapeakebay", + "chicago", + "children", + "childrens", + "childrensgarden", + "chiropractic", + "chocolate", + "christiansburg", + "cincinnati", + "cinema", + "circus", + "civilisation", + "civilization", + "civilwar", + "clinton", + "clock", + "coal", + "coastaldefence", + "cody", + "coldwar", + "collection", + "colonialwilliamsburg", + "coloradoplateau", + "columbia", + "columbus", + "communication", + "communications", + "community", + "computer", + "computerhistory", + "contemporary", + "contemporaryart", + "convent", + "copenhagen", + "corporation", + "corvette", + "costume", + "countryestate", + "county", + "crafts", + "cranbrook", + "creation", + "cultural", + "culturalcenter", + "culture", + "cyber", + "cymru", + "dali", + "dallas", + "database", + "ddr", + "decorativearts", + "delaware", + "delmenhorst", + "denmark", + "depot", + "design", + "detroit", + "dinosaur", + "discovery", + "dolls", + "donostia", + "durham", + "eastafrica", + "eastcoast", + "education", + "educational", + "egyptian", + "eisenbahn", + "elburg", + "elvendrell", + "embroidery", + "encyclopedic", + "england", + "entomology", + "environment", + "environmentalconservation", + "epilepsy", + "essex", + "estate", + "ethnology", + "exeter", + "exhibition", + "family", + "farm", + "farmequipment", + "farmers", + "farmstead", + "field", + "figueres", + "filatelia", + "film", + "fineart", + "finearts", + "finland", + "flanders", + "florida", + "force", + "fortmissoula", + "fortworth", + "foundation", + "francaise", + "frankfurt", + "franziskaner", + "freemasonry", + "freiburg", + "fribourg", + "frog", + "fundacio", + "furniture", + "gallery", + "garden", + "gateway", + "geelvinck", + "gemological", + "geology", + "georgia", + "giessen", + "glas", + "glass", + "gorge", + "grandrapids", + "graz", + "guernsey", + "halloffame", + "hamburg", + "handson", + "harvestcelebration", + "hawaii", + "health", + "heimatunduhren", + "hellas", + "helsinki", + "hembygdsforbund", + "heritage", + "histoire", + "historical", + "historicalsociety", + "historichouses", + "historisch", + "historisches", + "history", + "historyofscience", + "horology", + "house", + "humanities", + "illustration", + "imageandsound", + "indian", + "indiana", + "indianapolis", + "indianmarket", + "intelligence", + "interactive", + "iraq", + "iron", + "isleofman", + "jamison", + "jefferson", + "jerusalem", + "jewelry", + "jewish", + "jewishart", + "jfk", + "journalism", + "judaica", + "judygarland", + "juedisches", + "juif", + "karate", + "karikatur", + "kids", + "koebenhavn", + "koeln", + "kunst", + "kunstsammlung", + "kunstunddesign", + "labor", + "labour", + "lajolla", + "lancashire", + "landes", + "lans", + "larsson", + "lewismiller", + "lincoln", + "linz", + "living", + "livinghistory", + "localhistory", + "london", + "losangeles", + "louvre", + "loyalist", + "lucerne", + "luxembourg", + "luzern", + "mad", + "madrid", + "mallorca", + "manchester", + "mansion", + "mansions", + "manx", + "marburg", + "maritime", + "maritimo", + "maryland", + "marylhurst", + "media", + "medical", + "medizinhistorisches", + "meeres", + "memorial", + "mesaverde", + "michigan", + "midatlantic", + "military", + "mill", + "miners", + "mining", + "minnesota", + "missile", + "missoula", + "modern", + "moma", + "money", + "monmouth", + "monticello", + "montreal", + "moscow", + "motorcycle", + "muenchen", + "muenster", + "mulhouse", + "muncie", + "museet", + "museumcenter", + "museumvereniging", + "music", + "national", + "nationalfirearms", + "nationalheritage", + "nativeamerican", + "naturalhistory", + "naturalhistorymuseum", + "naturalsciences", + "nature", + "naturhistorisches", + "natuurwetenschappen", + "naumburg", + "naval", + "nebraska", + "neues", + "newhampshire", + "newjersey", + "newmexico", + "newport", + "newspaper", + "newyork", + "niepce", + "norfolk", + "north", + "nrw", + "nuernberg", + "nuremberg", + "nyc", + "nyny", + "oceanographic", + "oceanographique", + "omaha", + "online", + "ontario", + "openair", + "oregon", + "oregontrail", + "otago", + "oxford", + "pacific", + "paderborn", + "palace", + "paleo", + "palmsprings", + "panama", + "paris", + "pasadena", + "pharmacy", + "philadelphia", + "philadelphiaarea", + "philately", + "phoenix", + "photography", + "pilots", + "pittsburgh", + "planetarium", + "plantation", + "plants", + "plaza", + "portal", + "portland", + "portlligat", + "posts-and-telecommunications", + "preservation", + "presidio", + "press", + "project", + "public", + "pubol", + "quebec", + "railroad", + "railway", + "research", + "resistance", + "riodejaneiro", + "rochester", + "rockart", + "roma", + "russia", + "saintlouis", + "salem", + "salvadordali", + "salzburg", + "sandiego", + "sanfrancisco", + "santabarbara", + "santacruz", + "santafe", + "saskatchewan", + "satx", + "savannahga", + "schlesisches", + "schoenbrunn", + "schokoladen", + "school", + "schweiz", + "science", + "science-fiction", + "scienceandhistory", + "scienceandindustry", + "sciencecenter", + "sciencecenters", + "sciencehistory", + "sciences", + "sciencesnaturelles", + "scotland", + "seaport", + "settlement", + "settlers", + "shell", + "sherbrooke", + "sibenik", + "silk", + "ski", + "skole", + "society", + "sologne", + "soundandvision", + "southcarolina", + "southwest", + "space", + "spy", + "square", + "stadt", + "stalbans", + "starnberg", + "state", + "stateofdelaware", + "station", + "steam", + "steiermark", + "stjohn", + "stockholm", + "stpetersburg", + "stuttgart", + "suisse", + "surgeonshall", + "surrey", + "svizzera", + "sweden", + "sydney", + "tank", + "tcm", + "technology", + "telekommunikation", + "television", + "texas", + "textile", + "theater", + "time", + "timekeeping", + "topology", + "torino", + "touch", + "town", + "transport", + "tree", + "trolley", + "trust", + "trustee", + "uhren", + "ulm", + "undersea", + "university", + "usa", + "usantiques", + "usarts", + "uscountryestate", + "usculture", + "usdecorativearts", + "usgarden", + "ushistory", + "ushuaia", + "uslivinghistory", + "utah", + "uvic", + "valley", + "vantaa", + "versailles", + "viking", + "village", + "virginia", + "virtual", + "virtuel", + "vlaanderen", + "volkenkunde", + "wales", + "wallonie", + "war", + "washingtondc", + "watch-and-clock", + "watchandclock", + "western", + "westfalen", + "whaling", + "wildlife", + "williamsburg", + "windmill", + "workshop", + "xn--9dbhblg6di", + "xn--comunicaes-v6a2o", + "xn--correios-e-telecomunicaes-ghc29a", + "xn--h1aegh", + "xn--lns-qla", + "york", + "yorkshire", + "yosemite", + "youth", + "zoological", + "zoology", + "aero", + "biz", + "com", + "coop", + "edu", + "gov", + "info", + "int", + "mil", + "museum", + "name", + "net", + "org", + "pro", + "ac", + "biz", + "co", + "com", + "coop", + "edu", + "gov", + "int", + "museum", + "net", + "org", + "blogspot", + "com", + "edu", + "gob", + "net", + "nym", + "org", + "blogspot", + "com", + "edu", + "gov", + "mil", + "name", + "net", + "org", + "ac", + "adv", + "co", + "edu", + "gov", + "mil", + "net", + "org", + "ca", + "cc", + "co", + "com", + "dr", + "in", + "info", + "mobi", + "mx", + "name", + "or", + "org", + "pro", + "school", + "tv", + "us", + "ws", + "her", + "his", + "forgot", + "forgot", + "asso", + "nom", + "alwaysdata", + "at-band-camp", + "azure-mobile", + "azurewebsites", + "barsy", + "blogdns", + "boomla", + "bounceme", + "bplaced", + "broke-it", + "buyshouses", + "casacam", + "cdn77", + "cdn77-ssl", + "channelsdvr", + "cloudaccess", + "cloudapp", + "cloudfront", + "cloudfunctions", + "cryptonomic", + "ddns", + "debian", + "definima", + "dnsalias", + "dnsdojo", + "does-it", + "dontexist", + "dsmynas", + "dynalias", + "dynathome", + "dynu", + "dynv6", + "eating-organic", + "endofinternet", + "familyds", + "fastly", + "fastlylb", + "feste-ip", + "firewall-gateway", + "flynnhosting", + "from-az", + "from-co", + "from-la", + "from-ny", + "gb", + "gets-it", + "ham-radio-op", + "homeftp", + "homeip", + "homelinux", + "homeunix", + "hu", + "in", + "in-the-band", + "ipifony", + "is-a-chef", + "is-a-geek", + "isa-geek", + "jp", + "kicks-ass", + "knx-server", + "moonscale", + "mydissent", + "myeffect", + "myfritz", + "mymediapc", + "mypsx", + "mysecuritycamera", + "nhlfan", + "no-ip", + "office-on-the", + "pgafan", + "podzone", + "privatizehealthinsurance", + "rackmaze", + "redirectme", + "ru", + "scrapper-site", + "se", + "selfip", + "sells-it", + "servebbs", + "serveblog", + "serveftp", + "serveminecraft", + "square7", + "static-access", + "sytes", + "t3l3p0rt", + "thruhere", + "twmail", + "uk", + "webhop", + "za", + "r", + "freetls", + "map", + "prod", + "ssl", + "a", + "global", + "a", + "b", + "global", + "map", + "alces", + "arts", + "com", + "firm", + "info", + "net", + "other", + "per", + "rec", + "store", + "web", + "com", + "edu", + "gov", + "i", + "mil", + "mobi", + "name", + "net", + "org", + "sch", + "blogspot", + "ac", + "biz", + "co", + "com", + "edu", + "gob", + "in", + "info", + "int", + "mil", + "net", + "nom", + "org", + "web", + "blogspot", + "bv", + "cistron", + "co", + "demon", + "transurl", + "virtueeldomein", + "aa", + "aarborte", + "aejrie", + "afjord", + "agdenes", + "ah", + "akershus", + "aknoluokta", + "akrehamn", + "al", + "alaheadju", + "alesund", + "algard", + "alstahaug", + "alta", + "alvdal", + "amli", + "amot", + "andasuolo", + "andebu", + "andoy", + "ardal", + "aremark", + "arendal", + "arna", + "aseral", + "asker", + "askim", + "askoy", + "askvoll", + "asnes", + "audnedaln", + "aukra", + "aure", + "aurland", + "aurskog-holand", + "austevoll", + "austrheim", + "averoy", + "badaddja", + "bahcavuotna", + "bahccavuotna", + "baidar", + "bajddar", + "balat", + "balestrand", + "ballangen", + "balsfjord", + "bamble", + "bardu", + "barum", + "batsfjord", + "bearalvahki", + "beardu", + "beiarn", + "berg", + "bergen", + "berlevag", + "bievat", + "bindal", + "birkenes", + "bjarkoy", + "bjerkreim", + "bjugn", + "blogspot", + "bodo", + "bokn", + "bomlo", + "bremanger", + "bronnoy", + "bronnoysund", + "brumunddal", + "bryne", + "bu", + "budejju", + "buskerud", + "bygland", + "bykle", + "cahcesuolo", + "co", + "davvenjarga", + "davvesiida", + "deatnu", + "dep", + "dielddanuorri", + "divtasvuodna", + "divttasvuotna", + "donna", + "dovre", + "drammen", + "drangedal", + "drobak", + "dyroy", + "egersund", + "eid", + "eidfjord", + "eidsberg", + "eidskog", + "eidsvoll", + "eigersund", + "elverum", + "enebakk", + "engerdal", + "etne", + "etnedal", + "evenassi", + "evenes", + "evje-og-hornnes", + "farsund", + "fauske", + "fedje", + "fet", + "fetsund", + "fhs", + "finnoy", + "fitjar", + "fjaler", + "fjell", + "fla", + "flakstad", + "flatanger", + "flekkefjord", + "flesberg", + "flora", + "floro", + "fm", + "folkebibl", + "folldal", + "forde", + "forsand", + "fosnes", + "frana", + "fredrikstad", + "frei", + "frogn", + "froland", + "frosta", + "froya", + "fuoisku", + "fuossko", + "fusa", + "fylkesbibl", + "fyresdal", + "gaivuotna", + "galsa", + "gamvik", + "gangaviika", + "gaular", + "gausdal", + "giehtavuoatna", + "gildeskal", + "giske", + "gjemnes", + "gjerdrum", + "gjerstad", + "gjesdal", + "gjovik", + "gloppen", + "gol", + "gran", + "grane", + "granvin", + "gratangen", + "grimstad", + "grong", + "grue", + "gulen", + "guovdageaidnu", + "ha", + "habmer", + "hadsel", + "hagebostad", + "halden", + "halsa", + "hamar", + "hamaroy", + "hammarfeasta", + "hammerfest", + "hapmir", + "haram", + "hareid", + "harstad", + "hasvik", + "hattfjelldal", + "haugesund", + "hedmark", + "hemne", + "hemnes", + "hemsedal", + "herad", + "hitra", + "hjartdal", + "hjelmeland", + "hl", + "hm", + "hobol", + "hof", + "hokksund", + "hol", + "hole", + "holmestrand", + "holtalen", + "honefoss", + "hordaland", + "hornindal", + "horten", + "hoyanger", + "hoylandet", + "hurdal", + "hurum", + "hvaler", + "hyllestad", + "ibestad", + "idrett", + "inderoy", + "iveland", + "ivgu", + "jan-mayen", + "jessheim", + "jevnaker", + "jolster", + "jondal", + "jorpeland", + "kafjord", + "karasjohka", + "karasjok", + "karlsoy", + "karmoy", + "kautokeino", + "kirkenes", + "klabu", + "klepp", + "kommune", + "kongsberg", + "kongsvinger", + "kopervik", + "kraanghke", + "kragero", + "kristiansand", + "kristiansund", + "krodsherad", + "krokstadelva", + "kvafjord", + "kvalsund", + "kvam", + "kvanangen", + "kvinesdal", + "kvinnherad", + "kviteseid", + "kvitsoy", + "laakesvuemie", + "lahppi", + "langevag", + "lardal", + "larvik", + "lavagis", + "lavangen", + "leangaviika", + "lebesby", + "leikanger", + "leirfjord", + "leirvik", + "leka", + "leksvik", + "lenvik", + "lerdal", + "lesja", + "levanger", + "lier", + "lierne", + "lillehammer", + "lillesand", + "lindas", + "lindesnes", + "loabat", + "lodingen", + "lom", + "loppa", + "lorenskog", + "loten", + "lund", + "lunner", + "luroy", + "luster", + "lyngdal", + "lyngen", + "malatvuopmi", + "malselv", + "malvik", + "mandal", + "marker", + "marnardal", + "masfjorden", + "masoy", + "matta-varjjat", + "meland", + "meldal", + "melhus", + "meloy", + "meraker", + "midsund", + "midtre-gauldal", + "mil", + "mjondalen", + "mo-i-rana", + "moareke", + "modalen", + "modum", + "molde", + "more-og-romsdal", + "mosjoen", + "moskenes", + "moss", + "mosvik", + "mr", + "muosat", + "museum", + "naamesjevuemie", + "namdalseid", + "namsos", + "namsskogan", + "nannestad", + "naroy", + "narviika", + "narvik", + "naustdal", + "navuotna", + "nedre-eiker", + "nesna", + "nesodden", + "nesoddtangen", + "nesseby", + "nesset", + "nissedal", + "nittedal", + "nl", + "nord-aurdal", + "nord-fron", + "nord-odal", + "norddal", + "nordkapp", + "nordland", + "nordre-land", + "nordreisa", + "nore-og-uvdal", + "notodden", + "notteroy", + "nt", + "odda", + "of", + "oksnes", + "ol", + "omasvuotna", + "oppdal", + "oppegard", + "orkanger", + "orkdal", + "orland", + "orskog", + "orsta", + "osen", + "oslo", + "osoyro", + "osteroy", + "ostfold", + "ostre-toten", + "overhalla", + "ovre-eiker", + "oyer", + "oygarden", + "oystre-slidre", + "porsanger", + "porsangu", + "porsgrunn", + "priv", + "rade", + "radoy", + "rahkkeravju", + "raholt", + "raisa", + "rakkestad", + "ralingen", + "rana", + "randaberg", + "rauma", + "rendalen", + "rennebu", + "rennesoy", + "rindal", + "ringebu", + "ringerike", + "ringsaker", + "risor", + "rissa", + "rl", + "roan", + "rodoy", + "rollag", + "romsa", + "romskog", + "roros", + "rost", + "royken", + "royrvik", + "ruovat", + "rygge", + "salangen", + "salat", + "saltdal", + "samnanger", + "sandefjord", + "sandnes", + "sandnessjoen", + "sandoy", + "sarpsborg", + "sauda", + "sauherad", + "sel", + "selbu", + "selje", + "seljord", + "sf", + "siellak", + "sigdal", + "siljan", + "sirdal", + "skanit", + "skanland", + "skaun", + "skedsmo", + "skedsmokorset", + "ski", + "skien", + "skierva", + "skiptvet", + "skjak", + "skjervoy", + "skodje", + "slattum", + "smola", + "snaase", + "snasa", + "snillfjord", + "snoasa", + "sogndal", + "sogne", + "sokndal", + "sola", + "solund", + "somna", + "sondre-land", + "songdalen", + "sor-aurdal", + "sor-fron", + "sor-odal", + "sor-varanger", + "sorfold", + "sorreisa", + "sortland", + "sorum", + "spjelkavik", + "spydeberg", + "st", + "stange", + "stat", + "stathelle", + "stavanger", + "stavern", + "steigen", + "steinkjer", + "stjordal", + "stjordalshalsen", + "stokke", + "stor-elvdal", + "stord", + "stordal", + "storfjord", + "strand", + "stranda", + "stryn", + "sula", + "suldal", + "sund", + "sunndal", + "surnadal", + "svalbard", + "sveio", + "svelvik", + "sykkylven", + "tana", + "tananger", + "telemark", + "time", + "tingvoll", + "tinn", + "tjeldsund", + "tjome", + "tm", + "tokke", + "tolga", + "tonsberg", + "torsken", + "tr", + "trana", + "tranby", + "tranoy", + "troandin", + "trogstad", + "tromsa", + "tromso", + "trondheim", + "trysil", + "tvedestrand", + "tydal", + "tynset", + "tysfjord", + "tysnes", + "tysvar", + "ullensaker", + "ullensvang", + "ulvik", + "unjarga", + "utsira", + "va", + "vaapste", + "vadso", + "vaga", + "vagan", + "vagsoy", + "vaksdal", + "valle", + "vang", + "vanylven", + "vardo", + "varggat", + "varoy", + "vefsn", + "vega", + "vegarshei", + "vennesla", + "verdal", + "verran", + "vestby", + "vestfold", + "vestnes", + "vestre-slidre", + "vestre-toten", + "vestvagoy", + "vevelstad", + "vf", + "vgs", + "vik", + "vikna", + "vindafjord", + "voagat", + "volda", + "voss", + "vossevangen", + "xn--andy-ira", + "xn--asky-ira", + "xn--aurskog-hland-jnb", + "xn--avery-yua", + "xn--bdddj-mrabd", + "xn--bearalvhki-y4a", + "xn--berlevg-jxa", + "xn--bhcavuotna-s4a", + "xn--bhccavuotna-k7a", + "xn--bidr-5nac", + "xn--bievt-0qa", + "xn--bjarky-fya", + "xn--bjddar-pta", + "xn--blt-elab", + "xn--bmlo-gra", + "xn--bod-2na", + "xn--brnny-wuac", + "xn--brnnysund-m8ac", + "xn--brum-voa", + "xn--btsfjord-9za", + "xn--davvenjrga-y4a", + "xn--dnna-gra", + "xn--drbak-wua", + "xn--dyry-ira", + "xn--eveni-0qa01ga", + "xn--finny-yua", + "xn--fjord-lra", + "xn--fl-zia", + "xn--flor-jra", + "xn--frde-gra", + "xn--frna-woa", + "xn--frya-hra", + "xn--ggaviika-8ya47h", + "xn--gildeskl-g0a", + "xn--givuotna-8ya", + "xn--gjvik-wua", + "xn--gls-elac", + "xn--h-2fa", + "xn--hbmer-xqa", + "xn--hcesuolo-7ya35b", + "xn--hgebostad-g3a", + "xn--hmmrfeasta-s4ac", + "xn--hnefoss-q1a", + "xn--hobl-ira", + "xn--holtlen-hxa", + "xn--hpmir-xqa", + "xn--hyanger-q1a", + "xn--hylandet-54a", + "xn--indery-fya", + "xn--jlster-bya", + "xn--jrpeland-54a", + "xn--karmy-yua", + "xn--kfjord-iua", + "xn--klbu-woa", + "xn--koluokta-7ya57h", + "xn--krager-gya", + "xn--kranghke-b0a", + "xn--krdsherad-m8a", + "xn--krehamn-dxa", + "xn--krjohka-hwab49j", + "xn--ksnes-uua", + "xn--kvfjord-nxa", + "xn--kvitsy-fya", + "xn--kvnangen-k0a", + "xn--l-1fa", + "xn--laheadju-7ya", + "xn--langevg-jxa", + "xn--ldingen-q1a", + "xn--leagaviika-52b", + "xn--lesund-hua", + "xn--lgrd-poac", + "xn--lhppi-xqa", + "xn--linds-pra", + "xn--loabt-0qa", + "xn--lrdal-sra", + "xn--lrenskog-54a", + "xn--lt-liac", + "xn--lten-gra", + "xn--lury-ira", + "xn--mely-ira", + "xn--merker-kua", + "xn--mjndalen-64a", + "xn--mlatvuopmi-s4a", + "xn--mli-tla", + "xn--mlselv-iua", + "xn--moreke-jua", + "xn--mosjen-eya", + "xn--mot-tla", + "xn--mre-og-romsdal-qqb", + "xn--msy-ula0h", + "xn--mtta-vrjjat-k7af", + "xn--muost-0qa", + "xn--nmesjevuemie-tcba", + "xn--nry-yla5g", + "xn--nttery-byae", + "xn--nvuotna-hwa", + "xn--oppegrd-ixa", + "xn--ostery-fya", + "xn--osyro-wua", + "xn--porsgu-sta26f", + "xn--rady-ira", + "xn--rdal-poa", + "xn--rde-ula", + "xn--rdy-0nab", + "xn--rennesy-v1a", + "xn--rhkkervju-01af", + "xn--rholt-mra", + "xn--risa-5na", + "xn--risr-ira", + "xn--rland-uua", + "xn--rlingen-mxa", + "xn--rmskog-bya", + "xn--rros-gra", + "xn--rskog-uua", + "xn--rst-0na", + "xn--rsta-fra", + "xn--ryken-vua", + "xn--ryrvik-bya", + "xn--s-1fa", + "xn--sandnessjen-ogb", + "xn--sandy-yua", + "xn--seral-lra", + "xn--sgne-gra", + "xn--skierv-uta", + "xn--skjervy-v1a", + "xn--skjk-soa", + "xn--sknit-yqa", + "xn--sknland-fxa", + "xn--slat-5na", + "xn--slt-elab", + "xn--smla-hra", + "xn--smna-gra", + "xn--snase-nra", + "xn--sndre-land-0cb", + "xn--snes-poa", + "xn--snsa-roa", + "xn--sr-aurdal-l8a", + "xn--sr-fron-q1a", + "xn--sr-odal-q1a", + "xn--sr-varanger-ggb", + "xn--srfold-bya", + "xn--srreisa-q1a", + "xn--srum-gra", + "xn--stfold-9xa", + "xn--stjrdal-s1a", + "xn--stjrdalshalsen-sqb", + "xn--stre-toten-zcb", + "xn--tjme-hra", + "xn--tnsberg-q1a", + "xn--trany-yua", + "xn--trgstad-r1a", + "xn--trna-woa", + "xn--troms-zua", + "xn--tysvr-vra", + "xn--unjrga-rta", + "xn--vads-jra", + "xn--vard-jra", + "xn--vegrshei-c0a", + "xn--vestvgy-ixa6o", + "xn--vg-yiab", + "xn--vgan-qoa", + "xn--vgsy-qoa0j", + "xn--vre-eiker-k8a", + "xn--vrggt-xqad", + "xn--vry-yla5g", + "xn--yer-zna", + "xn--ygarden-p1a", + "xn--ystre-slidre-ujb", + "gs", + "gs", + "nes", + "gs", + "nes", + "gs", + "os", + "valer", + "xn--vler-qoa", + "gs", + "gs", + "os", + "gs", + "heroy", + "sande", + "gs", + "gs", + "bo", + "heroy", + "xn--b-5ga", + "xn--hery-ira", + "gs", + "gs", + "gs", + "gs", + "valer", + "gs", + "gs", + "gs", + "gs", + "bo", + "xn--b-5ga", + "gs", + "gs", + "gs", + "sande", + "gs", + "sande", + "xn--hery-ira", + "xn--vler-qoa", + "biz", + "com", + "edu", + "gov", + "info", + "net", + "org", + "merseine", + "mine", + "nom", + "shacknet", + "ac", + "co", + "cri", + "geek", + "gen", + "govt", + "health", + "iwi", + "kiwi", + "maori", + "mil", + "net", + "nym", + "org", + "parliament", + "school", + "xn--mori-qsa", + "blogspot", + "co", + "com", + "edu", + "gov", + "med", + "museum", + "net", + "org", + "pro", + "homelink", + "barsy", + "accesscam", + "ae", + "amune", + "blogdns", + "blogsite", + "bmoattachments", + "boldlygoingnowhere", + "cable-modem", + "camdvr", + "cdn77", + "cdn77-secure", + "certmgr", + "cloudns", + "collegefan", + "couchpotatofries", + "ddnss", + "diskstation", + "dnsalias", + "dnsdojo", + "doesntexist", + "dontexist", + "doomdns", + "dsmynas", + "duckdns", + "dvrdns", + "dynalias", + "dyndns", + "endofinternet", + "endoftheinternet", + "eu", + "familyds", + "fedorainfracloud", + "fedorapeople", + "fedoraproject", + "freeddns", + "from-me", + "game-host", + "gotdns", + "hepforge", + "hk", + "hobby-site", + "homedns", + "homeftp", + "homelinux", + "homeunix", + "hopto", + "is-a-bruinsfan", + "is-a-candidate", + "is-a-celticsfan", + "is-a-chef", + "is-a-geek", + "is-a-knight", + "is-a-linux-user", + "is-a-patsfan", + "is-a-soxfan", + "is-found", + "is-lost", + "is-saved", + "is-very-bad", + "is-very-evil", + "is-very-good", + "is-very-nice", + "is-very-sweet", + "isa-geek", + "js", + "kicks-ass", + "misconfused", + "mlbfan", + "my-firewall", + "myfirewall", + "myftp", + "mysecuritycamera", + "mywire", + "nflfan", + "no-ip", + "pimienta", + "podzone", + "poivron", + "potager", + "read-books", + "readmyblog", + "selfip", + "sellsyourhome", + "servebbs", + "serveftp", + "servegame", + "spdns", + "stuff-4-sale", + "sweetpepper", + "tunk", + "tuxfamily", + "twmail", + "ufcfan", + "us", + "webhop", + "webredirect", + "wmflabs", + "za", + "zapto", + "tele", + "c", + "rsc", + "origin", + "ssl", + "go", + "home", + "al", + "asso", + "at", + "au", + "be", + "bg", + "ca", + "cd", + "ch", + "cn", + "cy", + "cz", + "de", + "dk", + "edu", + "ee", + "es", + "fi", + "fr", + "gr", + "hr", + "hu", + "ie", + "il", + "in", + "int", + "is", + "it", + "jp", + "kr", + "lt", + "lu", + "lv", + "mc", + "me", + "mk", + "mt", + "my", + "net", + "ng", + "nl", + "no", + "nz", + "paris", + "pl", + "pt", + "q-a", + "ro", + "ru", + "se", + "si", + "sk", + "tr", + "uk", + "us", + "cloud", + "nerdpol", + "abo", + "ac", + "com", + "edu", + "gob", + "ing", + "med", + "net", + "nom", + "org", + "sld", + "ybo", + "blogspot", + "com", + "edu", + "gob", + "mil", + "net", + "nom", + "nym", + "org", + "com", + "edu", + "org", + "com", + "edu", + "gov", + "i", + "mil", + "net", + "ngo", + "org", + "1337", + "biz", + "com", + "edu", + "fam", + "gob", + "gok", + "gon", + "gop", + "gos", + "gov", + "info", + "net", + "org", + "web", + "agro", + "aid", + "art", + "atm", + "augustow", + "auto", + "babia-gora", + "bedzin", + "beep", + "beskidy", + "bialowieza", + "bialystok", + "bielawa", + "bieszczady", + "biz", + "boleslawiec", + "bydgoszcz", + "bytom", + "cieszyn", + "co", + "com", + "czeladz", + "czest", + "dlugoleka", + "edu", + "elblag", + "elk", + "gda", + "gdansk", + "gdynia", + "gliwice", + "glogow", + "gmina", + "gniezno", + "gorlice", + "gov", + "grajewo", + "gsm", + "ilawa", + "info", + "jaworzno", + "jelenia-gora", + "jgora", + "kalisz", + "karpacz", + "kartuzy", + "kaszuby", + "katowice", + "kazimierz-dolny", + "kepno", + "ketrzyn", + "klodzko", + "kobierzyce", + "kolobrzeg", + "konin", + "konskowola", + "krakow", + "kutno", + "lapy", + "lebork", + "legnica", + "lezajsk", + "limanowa", + "lomza", + "lowicz", + "lubin", + "lukow", + "mail", + "malbork", + "malopolska", + "mazowsze", + "mazury", + "med", + "media", + "miasta", + "mielec", + "mielno", + "mil", + "mragowo", + "naklo", + "net", + "nieruchomosci", + "nom", + "nowaruda", + "nysa", + "olawa", + "olecko", + "olkusz", + "olsztyn", + "opoczno", + "opole", + "org", + "ostroda", + "ostroleka", + "ostrowiec", + "ostrowwlkp", + "pc", + "pila", + "pisz", + "podhale", + "podlasie", + "polkowice", + "pomorskie", + "pomorze", + "powiat", + "poznan", + "priv", + "prochowice", + "pruszkow", + "przeworsk", + "pulawy", + "radom", + "rawa-maz", + "realestate", + "rel", + "rybnik", + "rzeszow", + "sanok", + "sejny", + "sex", + "shop", + "sklep", + "skoczow", + "slask", + "slupsk", + "sopot", + "sos", + "sosnowiec", + "stalowa-wola", + "starachowice", + "stargard", + "suwalki", + "swidnica", + "swiebodzin", + "swinoujscie", + "szczecin", + "szczytno", + "szkola", + "targi", + "tarnobrzeg", + "tgory", + "tm", + "tourism", + "travel", + "turek", + "turystyka", + "tychy", + "ustka", + "walbrzych", + "warmia", + "warszawa", + "waw", + "wegrow", + "wielun", + "wlocl", + "wloclawek", + "wodzislaw", + "wolomin", + "wroc", + "wroclaw", + "zachpomor", + "zagan", + "zakopane", + "zarow", + "zgora", + "zgorzelec", + "ap", + "griw", + "ic", + "is", + "kmpsp", + "konsulat", + "kppsp", + "kwp", + "kwpsp", + "mup", + "mw", + "oirm", + "oum", + "pa", + "pinb", + "piw", + "po", + "psp", + "psse", + "pup", + "rzgw", + "sa", + "sdn", + "sko", + "so", + "sr", + "starostwo", + "ug", + "ugim", + "um", + "umig", + "upow", + "uppo", + "us", + "uw", + "uzs", + "wif", + "wiih", + "winb", + "wios", + "witd", + "wiw", + "wsa", + "wskr", + "wuoz", + "wzmiuw", + "zp", + "co", + "edu", + "gov", + "net", + "org", + "ac", + "biz", + "com", + "edu", + "est", + "gov", + "info", + "isla", + "name", + "net", + "org", + "pro", + "prof", + "aaa", + "aca", + "acct", + "avocat", + "bar", + "cloudns", + "cpa", + "eng", + "jur", + "law", + "med", + "recht", + "com", + "edu", + "gov", + "net", + "org", + "plo", + "sec", + "blogspot", + "com", + "edu", + "gov", + "int", + "net", + "nome", + "nym", + "org", + "publ", + "belau", + "cloudns", + "co", + "ed", + "go", + "ne", + "nom", + "or", + "com", + "coop", + "edu", + "gov", + "mil", + "net", + "org", + "blogspot", + "com", + "edu", + "gov", + "mil", + "name", + "net", + "nom", + "org", + "sch", + "asso", + "blogspot", + "com", + "nom", + "ybo", + "clan", + "arts", + "blogspot", + "com", + "firm", + "info", + "nom", + "nt", + "org", + "rec", + "shop", + "store", + "tm", + "www", + "lima-city", + "myddns", + "webspace", + "ac", + "blogspot", + "co", + "edu", + "gov", + "in", + "nom", + "org", + "ac", + "adygeya", + "bashkiria", + "bir", + "blogspot", + "cbg", + "cldmail", + "com", + "dagestan", + "edu", + "gov", + "grozny", + "int", + "kalmykia", + "kustanai", + "marine", + "mil", + "mordovia", + "msk", + "mytis", + "nalchik", + "net", + "nov", + "org", + "pp", + "pyatigorsk", + "spb", + "test", + "vladikavkaz", + "vladimir", + "hb", + "ac", + "co", + "com", + "edu", + "gouv", + "gov", + "int", + "mil", + "net", + "com", + "edu", + "gov", + "med", + "net", + "org", + "pub", + "sch", + "com", + "edu", + "gov", + "net", + "org", + "com", + "edu", + "gov", + "net", + "org", + "ybo", + "com", + "edu", + "gov", + "info", + "med", + "net", + "org", + "tv", + "a", + "ac", + "b", + "bd", + "blogspot", + "brand", + "c", + "com", + "d", + "e", + "f", + "fh", + "fhsk", + "fhv", + "g", + "h", + "i", + "k", + "komforb", + "kommunalforbund", + "komvux", + "l", + "lanbib", + "m", + "n", + "naturbruksgymn", + "o", + "org", + "p", + "parti", + "pp", + "press", + "r", + "s", + "t", + "tm", + "u", + "w", + "x", + "y", + "z", + "blogspot", + "com", + "edu", + "gov", + "net", + "org", + "per", + "com", + "gov", + "hashbang", + "mil", + "net", + "now", + "org", + "platform", + "wedeploy", + "blogspot", + "nom", + "byen", + "cyon", + "platformsh", + "blogspot", + "nym", + "com", + "edu", + "gov", + "net", + "org", + "art", + "blogspot", + "com", + "edu", + "gouv", + "org", + "perso", + "univ", + "com", + "net", + "org", + "stackspace", + "uber", + "xs4all", + "co", + "com", + "consulado", + "edu", + "embaixada", + "gov", + "mil", + "net", + "org", + "principe", + "saotome", + "store", + "abkhazia", + "adygeya", + "aktyubinsk", + "arkhangelsk", + "armenia", + "ashgabad", + "azerbaijan", + "balashov", + "bashkiria", + "bryansk", + "bukhara", + "chimkent", + "dagestan", + "east-kazakhstan", + "exnet", + "georgia", + "grozny", + "ivanovo", + "jambyl", + "kalmykia", + "kaluga", + "karacol", + "karaganda", + "karelia", + "khakassia", + "krasnodar", + "kurgan", + "kustanai", + "lenug", + "mangyshlak", + "mordovia", + "msk", + "murmansk", + "nalchik", + "navoi", + "north-kazakhstan", + "nov", + "nym", + "obninsk", + "penza", + "pokrovsk", + "sochi", + "spb", + "tashkent", + "termez", + "togliatti", + "troitsk", + "tselinograd", + "tula", + "tuva", + "vladikavkaz", + "vladimir", + "vologda", + "barsy", + "com", + "edu", + "gob", + "org", + "red", + "gov", + "nym", + "com", + "edu", + "gov", + "mil", + "net", + "org", + "knightpoint", + "ac", + "co", + "org", + "blogspot", + "ac", + "co", + "go", + "in", + "mi", + "net", + "or", + "ac", + "biz", + "co", + "com", + "edu", + "go", + "gov", + "int", + "mil", + "name", + "net", + "nic", + "org", + "test", + "web", + "gov", + "co", + "com", + "edu", + "gov", + "mil", + "net", + "nom", + "org", + "agrinet", + "com", + "defense", + "edunet", + "ens", + "fin", + "gov", + "ind", + "info", + "intl", + "mincom", + "nat", + "net", + "org", + "perso", + "rnrt", + "rns", + "rnu", + "tourism", + "turen", + "com", + "edu", + "gov", + "mil", + "net", + "org", + "vpnplus", + "av", + "bbs", + "bel", + "biz", + "com", + "dr", + "edu", + "gen", + "gov", + "info", + "k12", + "kep", + "mil", + "name", + "nc", + "net", + "org", + "pol", + "tel", + "tv", + "web", + "blogspot", + "gov", + "ybo", + "aero", + "biz", + "co", + "com", + "coop", + "edu", + "gov", + "info", + "int", + "jobs", + "mobi", + "museum", + "name", + "net", + "org", + "pro", + "travel", + "better-than", + "dyndns", + "on-the-web", + "worse-than", + "blogspot", + "club", + "com", + "ebiz", + "edu", + "game", + "gov", + "idv", + "mil", + "net", + "nym", + "org", + "url", + "xn--czrw28b", + "xn--uc0atv", + "xn--zf0ao64a", + "mymailer", + "ac", + "co", + "go", + "hotel", + "info", + "me", + "mil", + "mobi", + "ne", + "or", + "sc", + "tv", + "biz", + "cc", + "cherkassy", + "cherkasy", + "chernigov", + "chernihiv", + "chernivtsi", + "chernovtsy", + "ck", + "cn", + "co", + "com", + "cr", + "crimea", + "cv", + "dn", + "dnepropetrovsk", + "dnipropetrovsk", + "dominic", + "donetsk", + "dp", + "edu", + "gov", + "if", + "in", + "inf", + "ivano-frankivsk", + "kh", + "kharkiv", + "kharkov", + "kherson", + "khmelnitskiy", + "khmelnytskyi", + "kiev", + "kirovograd", + "km", + "kr", + "krym", + "ks", + "kv", + "kyiv", + "lg", + "lt", + "ltd", + "lugansk", + "lutsk", + "lv", + "lviv", + "mk", + "mykolaiv", + "net", + "nikolaev", + "od", + "odesa", + "odessa", + "org", + "pl", + "poltava", + "pp", + "rivne", + "rovno", + "rv", + "sb", + "sebastopol", + "sevastopol", + "sm", + "sumy", + "te", + "ternopil", + "uz", + "uzhgorod", + "vinnica", + "vinnytsia", + "vn", + "volyn", + "yalta", + "zaporizhzhe", + "zaporizhzhia", + "zhitomir", + "zhytomyr", + "zp", + "zt", + "ac", + "blogspot", + "co", + "com", + "go", + "ne", + "nom", + "or", + "org", + "sc", + "ac", + "co", + "gov", + "ltd", + "me", + "net", + "nhs", + "org", + "plc", + "police", + "sch", + "blogspot", + "no-ip", + "wellbeingzone", + "homeoffice", + "service", + "ak", + "al", + "ar", + "as", + "az", + "ca", + "cloudns", + "co", + "ct", + "dc", + "de", + "dni", + "drud", + "fed", + "fl", + "ga", + "golffan", + "gu", + "hi", + "ia", + "id", + "il", + "in", + "is-by", + "isa", + "kids", + "ks", + "ky", + "la", + "land-4-sale", + "ma", + "md", + "me", + "mi", + "mn", + "mo", + "ms", + "mt", + "nc", + "nd", + "ne", + "nh", + "nj", + "nm", + "noip", + "nsn", + "nv", + "ny", + "oh", + "ok", + "or", + "pa", + "pointto", + "pr", + "ri", + "sc", + "sd", + "stuff-4-sale", + "tn", + "tx", + "ut", + "va", + "vi", + "vt", + "wa", + "wi", + "wv", + "wy", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "chtr", + "paroch", + "pvt", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "ann-arbor", + "cc", + "cog", + "dst", + "eaton", + "gen", + "k12", + "lib", + "mus", + "tec", + "washtenaw", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "cc", + "k12", + "lib", + "com", + "edu", + "gub", + "mil", + "net", + "nom", + "org", + "blogspot", + "co", + "com", + "net", + "org", + "com", + "edu", + "gov", + "mil", + "net", + "nom", + "org", + "arts", + "co", + "com", + "e12", + "edu", + "firm", + "gob", + "gov", + "info", + "int", + "mil", + "net", + "org", + "rec", + "store", + "tec", + "web", + "nom", + "co", + "com", + "k12", + "net", + "org", + "ac", + "biz", + "blogspot", + "com", + "edu", + "gov", + "health", + "info", + "int", + "name", + "net", + "org", + "pro", + "com", + "edu", + "net", + "org", + "advisor", + "com", + "dyndns", + "edu", + "gov", + "mypets", + "net", + "org", + "xn--80au", + "xn--90azh", + "xn--c1avg", + "xn--d1at", + "xn--o1ac", + "xn--o1ach", + "xn--12c1fe0br", + "xn--12cfi8ixb8l", + "xn--12co0c3b4eva", + "xn--h3cuzk1di", + "xn--m3ch0j3a", + "xn--o3cyx2a", + "blogsite", + "fhapp", + "ac", + "agric", + "alt", + "co", + "edu", + "gov", + "grondar", + "law", + "mil", + "net", + "ngo", + "nis", + "nom", + "org", + "school", + "tm", + "web", + "blogspot", + "ac", + "biz", + "co", + "com", + "edu", + "gov", + "info", + "mil", + "net", + "org", + "sch", + "lima", + "triton", + "ac", + "co", + "gov", + "mil", + "org", +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/address.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/address.go new file mode 100644 index 0000000..e6bfa39 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/address.go @@ -0,0 +1,425 @@ +// 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. + +// +build darwin dragonfly freebsd netbsd openbsd + +package route + +import "runtime" + +// An Addr represents an address associated with packet routing. +type Addr interface { + // Family returns an address family. + Family() int +} + +// A LinkAddr represents a link-layer address. +type LinkAddr struct { + Index int // interface index when attached + Name string // interface name when attached + Addr []byte // link-layer address when attached +} + +// Family implements the Family method of Addr interface. +func (a *LinkAddr) Family() int { return sysAF_LINK } + +func (a *LinkAddr) lenAndSpace() (int, int) { + l := 8 + len(a.Name) + len(a.Addr) + return l, roundup(l) +} + +func (a *LinkAddr) marshal(b []byte) (int, error) { + l, ll := a.lenAndSpace() + if len(b) < ll { + return 0, errShortBuffer + } + nlen, alen := len(a.Name), len(a.Addr) + if nlen > 255 || alen > 255 { + return 0, errInvalidAddr + } + b[0] = byte(l) + b[1] = sysAF_LINK + if a.Index > 0 { + nativeEndian.PutUint16(b[2:4], uint16(a.Index)) + } + data := b[8:] + if nlen > 0 { + b[5] = byte(nlen) + copy(data[:nlen], a.Addr) + data = data[nlen:] + } + if alen > 0 { + b[6] = byte(alen) + copy(data[:alen], a.Name) + data = data[alen:] + } + return ll, nil +} + +func parseLinkAddr(b []byte) (Addr, error) { + if len(b) < 8 { + return nil, errInvalidAddr + } + _, a, err := parseKernelLinkAddr(sysAF_LINK, b[4:]) + if err != nil { + return nil, err + } + a.(*LinkAddr).Index = int(nativeEndian.Uint16(b[2:4])) + return a, nil +} + +// parseKernelLinkAddr parses b as a link-layer address in +// conventional BSD kernel form. +func parseKernelLinkAddr(_ int, b []byte) (int, Addr, error) { + // The encoding looks like the following: + // +----------------------------+ + // | Type (1 octet) | + // +----------------------------+ + // | Name length (1 octet) | + // +----------------------------+ + // | Address length (1 octet) | + // +----------------------------+ + // | Selector length (1 octet) | + // +----------------------------+ + // | Data (variable) | + // +----------------------------+ + // + // On some platforms, all-bit-one of length field means "don't + // care". + nlen, alen, slen := int(b[1]), int(b[2]), int(b[3]) + if nlen == 0xff { + nlen = 0 + } + if alen == 0xff { + alen = 0 + } + if slen == 0xff { + slen = 0 + } + l := 4 + nlen + alen + slen + if len(b) < l { + return 0, nil, errInvalidAddr + } + data := b[4:] + var name string + var addr []byte + if nlen > 0 { + name = string(data[:nlen]) + data = data[nlen:] + } + if alen > 0 { + addr = data[:alen] + data = data[alen:] + } + return l, &LinkAddr{Name: name, Addr: addr}, nil +} + +// An Inet4Addr represents an internet address for IPv4. +type Inet4Addr struct { + IP [4]byte // IP address +} + +// Family implements the Family method of Addr interface. +func (a *Inet4Addr) Family() int { return sysAF_INET } + +func (a *Inet4Addr) lenAndSpace() (int, int) { + return sizeofSockaddrInet, roundup(sizeofSockaddrInet) +} + +func (a *Inet4Addr) marshal(b []byte) (int, error) { + l, ll := a.lenAndSpace() + if len(b) < ll { + return 0, errShortBuffer + } + b[0] = byte(l) + b[1] = sysAF_INET + copy(b[4:8], a.IP[:]) + return ll, nil +} + +// An Inet6Addr represents an internet address for IPv6. +type Inet6Addr struct { + IP [16]byte // IP address + ZoneID int // zone identifier +} + +// Family implements the Family method of Addr interface. +func (a *Inet6Addr) Family() int { return sysAF_INET6 } + +func (a *Inet6Addr) lenAndSpace() (int, int) { + return sizeofSockaddrInet6, roundup(sizeofSockaddrInet6) +} + +func (a *Inet6Addr) marshal(b []byte) (int, error) { + l, ll := a.lenAndSpace() + if len(b) < ll { + return 0, errShortBuffer + } + b[0] = byte(l) + b[1] = sysAF_INET6 + copy(b[8:24], a.IP[:]) + if a.ZoneID > 0 { + nativeEndian.PutUint32(b[24:28], uint32(a.ZoneID)) + } + return ll, nil +} + +// parseInetAddr parses b as an internet address for IPv4 or IPv6. +func parseInetAddr(af int, b []byte) (Addr, error) { + switch af { + case sysAF_INET: + if len(b) < sizeofSockaddrInet { + return nil, errInvalidAddr + } + a := &Inet4Addr{} + copy(a.IP[:], b[4:8]) + return a, nil + case sysAF_INET6: + if len(b) < sizeofSockaddrInet6 { + return nil, errInvalidAddr + } + a := &Inet6Addr{ZoneID: int(nativeEndian.Uint32(b[24:28]))} + copy(a.IP[:], b[8:24]) + if a.IP[0] == 0xfe && a.IP[1]&0xc0 == 0x80 || a.IP[0] == 0xff && (a.IP[1]&0x0f == 0x01 || a.IP[1]&0x0f == 0x02) { + // KAME based IPv6 protocol stack usually + // embeds the interface index in the + // interface-local or link-local address as + // the kernel-internal form. + id := int(bigEndian.Uint16(a.IP[2:4])) + if id != 0 { + a.ZoneID = id + a.IP[2], a.IP[3] = 0, 0 + } + } + return a, nil + default: + return nil, errInvalidAddr + } +} + +// parseKernelInetAddr parses b as an internet address in conventional +// BSD kernel form. +func parseKernelInetAddr(af int, b []byte) (int, Addr, error) { + // The encoding looks similar to the NLRI encoding. + // +----------------------------+ + // | Length (1 octet) | + // +----------------------------+ + // | Address prefix (variable) | + // +----------------------------+ + // + // The differences between the kernel form and the NLRI + // encoding are: + // + // - The length field of the kernel form indicates the prefix + // length in bytes, not in bits + // + // - In the kernel form, zero value of the length field + // doesn't mean 0.0.0.0/0 or ::/0 + // + // - The kernel form appends leading bytes to the prefix field + // to make the tuple to be conformed with + // the routing message boundary + l := int(b[0]) + if runtime.GOOS == "darwin" { + // On Darwn, an address in the kernel form is also + // used as a message filler. + if l == 0 || len(b) > roundup(l) { + l = roundup(l) + } + } else { + l = roundup(l) + } + if len(b) < l { + return 0, nil, errInvalidAddr + } + // Don't reorder case expressions. + // The case expressions for IPv6 must come first. + const ( + off4 = 4 // offset of in_addr + off6 = 8 // offset of in6_addr + ) + switch { + case b[0] == sizeofSockaddrInet6: + a := &Inet6Addr{} + copy(a.IP[:], b[off6:off6+16]) + return int(b[0]), a, nil + case af == sysAF_INET6: + a := &Inet6Addr{} + if l-1 < off6 { + copy(a.IP[:], b[1:l]) + } else { + copy(a.IP[:], b[l-off6:l]) + } + return int(b[0]), a, nil + case b[0] == sizeofSockaddrInet: + a := &Inet4Addr{} + copy(a.IP[:], b[off4:off4+4]) + return int(b[0]), a, nil + default: // an old fashion, AF_UNSPEC or unknown means AF_INET + a := &Inet4Addr{} + if l-1 < off4 { + copy(a.IP[:], b[1:l]) + } else { + copy(a.IP[:], b[l-off4:l]) + } + return int(b[0]), a, nil + } +} + +// A DefaultAddr represents an address of various operating +// system-specific features. +type DefaultAddr struct { + af int + Raw []byte // raw format of address +} + +// Family implements the Family method of Addr interface. +func (a *DefaultAddr) Family() int { return a.af } + +func (a *DefaultAddr) lenAndSpace() (int, int) { + l := len(a.Raw) + return l, roundup(l) +} + +func (a *DefaultAddr) marshal(b []byte) (int, error) { + l, ll := a.lenAndSpace() + if len(b) < ll { + return 0, errShortBuffer + } + if l > 255 { + return 0, errInvalidAddr + } + b[1] = byte(l) + copy(b[:l], a.Raw) + return ll, nil +} + +func parseDefaultAddr(b []byte) (Addr, error) { + if len(b) < 2 || len(b) < int(b[0]) { + return nil, errInvalidAddr + } + a := &DefaultAddr{af: int(b[1]), Raw: b[:b[0]]} + return a, nil +} + +func addrsSpace(as []Addr) int { + var l int + for _, a := range as { + switch a := a.(type) { + case *LinkAddr: + _, ll := a.lenAndSpace() + l += ll + case *Inet4Addr: + _, ll := a.lenAndSpace() + l += ll + case *Inet6Addr: + _, ll := a.lenAndSpace() + l += ll + case *DefaultAddr: + _, ll := a.lenAndSpace() + l += ll + } + } + return l +} + +// marshalAddrs marshals as and returns a bitmap indicating which +// address is stored in b. +func marshalAddrs(b []byte, as []Addr) (uint, error) { + var attrs uint + for i, a := range as { + switch a := a.(type) { + case *LinkAddr: + l, err := a.marshal(b) + if err != nil { + return 0, err + } + b = b[l:] + attrs |= 1 << uint(i) + case *Inet4Addr: + l, err := a.marshal(b) + if err != nil { + return 0, err + } + b = b[l:] + attrs |= 1 << uint(i) + case *Inet6Addr: + l, err := a.marshal(b) + if err != nil { + return 0, err + } + b = b[l:] + attrs |= 1 << uint(i) + case *DefaultAddr: + l, err := a.marshal(b) + if err != nil { + return 0, err + } + b = b[l:] + attrs |= 1 << uint(i) + } + } + return attrs, nil +} + +func parseAddrs(attrs uint, fn func(int, []byte) (int, Addr, error), b []byte) ([]Addr, error) { + var as [sysRTAX_MAX]Addr + af := int(sysAF_UNSPEC) + for i := uint(0); i < sysRTAX_MAX && len(b) >= roundup(0); i++ { + if attrs&(1<> 8) +} + +func (binaryLittleEndian) 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 (binaryLittleEndian) PutUint32(b []byte, v uint32) { + _ = b[3] // early bounds check to guarantee safety of writes below + b[0] = byte(v) + b[1] = byte(v >> 8) + b[2] = byte(v >> 16) + b[3] = byte(v >> 24) +} + +func (binaryLittleEndian) 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 +} + +type binaryBigEndian struct{} + +func (binaryBigEndian) Uint16(b []byte) uint16 { + _ = b[1] // bounds check hint to compiler; see golang.org/issue/14808 + return uint16(b[1]) | uint16(b[0])<<8 +} + +func (binaryBigEndian) PutUint16(b []byte, v uint16) { + _ = b[1] // early bounds check to guarantee safety of writes below + b[0] = byte(v >> 8) + b[1] = byte(v) +} + +func (binaryBigEndian) 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 (binaryBigEndian) PutUint32(b []byte, v uint32) { + _ = b[3] // early bounds check to guarantee safety of writes below + b[0] = byte(v >> 24) + b[1] = byte(v >> 16) + b[2] = byte(v >> 8) + b[3] = byte(v) +} + +func (binaryBigEndian) 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 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/defs_darwin.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/defs_darwin.go new file mode 100644 index 0000000..e771644 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/defs_darwin.go @@ -0,0 +1,114 @@ +// 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. + +// +build ignore + +package route + +/* +#include +#include + +#include +#include +#include + +#include +*/ +import "C" + +const ( + sysAF_UNSPEC = C.AF_UNSPEC + sysAF_INET = C.AF_INET + sysAF_ROUTE = C.AF_ROUTE + sysAF_LINK = C.AF_LINK + sysAF_INET6 = C.AF_INET6 + + sysSOCK_RAW = C.SOCK_RAW + + sysNET_RT_DUMP = C.NET_RT_DUMP + sysNET_RT_FLAGS = C.NET_RT_FLAGS + sysNET_RT_IFLIST = C.NET_RT_IFLIST + sysNET_RT_STAT = C.NET_RT_STAT + sysNET_RT_TRASH = C.NET_RT_TRASH + sysNET_RT_IFLIST2 = C.NET_RT_IFLIST2 + sysNET_RT_DUMP2 = C.NET_RT_DUMP2 + sysNET_RT_MAXID = C.NET_RT_MAXID +) + +const ( + sysCTL_MAXNAME = C.CTL_MAXNAME + + sysCTL_UNSPEC = C.CTL_UNSPEC + sysCTL_KERN = C.CTL_KERN + sysCTL_VM = C.CTL_VM + sysCTL_VFS = C.CTL_VFS + sysCTL_NET = C.CTL_NET + sysCTL_DEBUG = C.CTL_DEBUG + sysCTL_HW = C.CTL_HW + sysCTL_MACHDEP = C.CTL_MACHDEP + sysCTL_USER = C.CTL_USER + sysCTL_MAXID = C.CTL_MAXID +) + +const ( + sysRTM_VERSION = C.RTM_VERSION + + sysRTM_ADD = C.RTM_ADD + sysRTM_DELETE = C.RTM_DELETE + sysRTM_CHANGE = C.RTM_CHANGE + sysRTM_GET = C.RTM_GET + sysRTM_LOSING = C.RTM_LOSING + sysRTM_REDIRECT = C.RTM_REDIRECT + sysRTM_MISS = C.RTM_MISS + sysRTM_LOCK = C.RTM_LOCK + sysRTM_OLDADD = C.RTM_OLDADD + sysRTM_OLDDEL = C.RTM_OLDDEL + sysRTM_RESOLVE = C.RTM_RESOLVE + sysRTM_NEWADDR = C.RTM_NEWADDR + sysRTM_DELADDR = C.RTM_DELADDR + sysRTM_IFINFO = C.RTM_IFINFO + sysRTM_NEWMADDR = C.RTM_NEWMADDR + sysRTM_DELMADDR = C.RTM_DELMADDR + sysRTM_IFINFO2 = C.RTM_IFINFO2 + sysRTM_NEWMADDR2 = C.RTM_NEWMADDR2 + sysRTM_GET2 = C.RTM_GET2 + + sysRTA_DST = C.RTA_DST + sysRTA_GATEWAY = C.RTA_GATEWAY + sysRTA_NETMASK = C.RTA_NETMASK + sysRTA_GENMASK = C.RTA_GENMASK + sysRTA_IFP = C.RTA_IFP + sysRTA_IFA = C.RTA_IFA + sysRTA_AUTHOR = C.RTA_AUTHOR + sysRTA_BRD = C.RTA_BRD + + sysRTAX_DST = C.RTAX_DST + sysRTAX_GATEWAY = C.RTAX_GATEWAY + sysRTAX_NETMASK = C.RTAX_NETMASK + sysRTAX_GENMASK = C.RTAX_GENMASK + sysRTAX_IFP = C.RTAX_IFP + sysRTAX_IFA = C.RTAX_IFA + sysRTAX_AUTHOR = C.RTAX_AUTHOR + sysRTAX_BRD = C.RTAX_BRD + sysRTAX_MAX = C.RTAX_MAX +) + +const ( + sizeofIfMsghdrDarwin15 = C.sizeof_struct_if_msghdr + sizeofIfaMsghdrDarwin15 = C.sizeof_struct_ifa_msghdr + sizeofIfmaMsghdrDarwin15 = C.sizeof_struct_ifma_msghdr + sizeofIfMsghdr2Darwin15 = C.sizeof_struct_if_msghdr2 + sizeofIfmaMsghdr2Darwin15 = C.sizeof_struct_ifma_msghdr2 + sizeofIfDataDarwin15 = C.sizeof_struct_if_data + sizeofIfData64Darwin15 = C.sizeof_struct_if_data64 + + sizeofRtMsghdrDarwin15 = C.sizeof_struct_rt_msghdr + sizeofRtMsghdr2Darwin15 = C.sizeof_struct_rt_msghdr2 + sizeofRtMetricsDarwin15 = C.sizeof_struct_rt_metrics + + sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/defs_dragonfly.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/defs_dragonfly.go new file mode 100644 index 0000000..dd31de2 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/defs_dragonfly.go @@ -0,0 +1,113 @@ +// 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. + +// +build ignore + +package route + +/* +#include +#include + +#include +#include +#include + +#include +*/ +import "C" + +const ( + sysAF_UNSPEC = C.AF_UNSPEC + sysAF_INET = C.AF_INET + sysAF_ROUTE = C.AF_ROUTE + sysAF_LINK = C.AF_LINK + sysAF_INET6 = C.AF_INET6 + + sysSOCK_RAW = C.SOCK_RAW + + sysNET_RT_DUMP = C.NET_RT_DUMP + sysNET_RT_FLAGS = C.NET_RT_FLAGS + sysNET_RT_IFLIST = C.NET_RT_IFLIST + sysNET_RT_MAXID = C.NET_RT_MAXID +) + +const ( + sysCTL_MAXNAME = C.CTL_MAXNAME + + sysCTL_UNSPEC = C.CTL_UNSPEC + sysCTL_KERN = C.CTL_KERN + sysCTL_VM = C.CTL_VM + sysCTL_VFS = C.CTL_VFS + sysCTL_NET = C.CTL_NET + sysCTL_DEBUG = C.CTL_DEBUG + sysCTL_HW = C.CTL_HW + sysCTL_MACHDEP = C.CTL_MACHDEP + sysCTL_USER = C.CTL_USER + sysCTL_P1003_1B = C.CTL_P1003_1B + sysCTL_LWKT = C.CTL_LWKT + sysCTL_MAXID = C.CTL_MAXID +) + +const ( + sysRTM_VERSION = C.RTM_VERSION + + sysRTM_ADD = C.RTM_ADD + sysRTM_DELETE = C.RTM_DELETE + sysRTM_CHANGE = C.RTM_CHANGE + sysRTM_GET = C.RTM_GET + sysRTM_LOSING = C.RTM_LOSING + sysRTM_REDIRECT = C.RTM_REDIRECT + sysRTM_MISS = C.RTM_MISS + sysRTM_LOCK = C.RTM_LOCK + sysRTM_OLDADD = C.RTM_OLDADD + sysRTM_OLDDEL = C.RTM_OLDDEL + sysRTM_RESOLVE = C.RTM_RESOLVE + sysRTM_NEWADDR = C.RTM_NEWADDR + sysRTM_DELADDR = C.RTM_DELADDR + sysRTM_IFINFO = C.RTM_IFINFO + sysRTM_NEWMADDR = C.RTM_NEWMADDR + sysRTM_DELMADDR = C.RTM_DELMADDR + sysRTM_IFANNOUNCE = C.RTM_IFANNOUNCE + sysRTM_IEEE80211 = C.RTM_IEEE80211 + + sysRTA_DST = C.RTA_DST + sysRTA_GATEWAY = C.RTA_GATEWAY + sysRTA_NETMASK = C.RTA_NETMASK + sysRTA_GENMASK = C.RTA_GENMASK + sysRTA_IFP = C.RTA_IFP + sysRTA_IFA = C.RTA_IFA + sysRTA_AUTHOR = C.RTA_AUTHOR + sysRTA_BRD = C.RTA_BRD + sysRTA_MPLS1 = C.RTA_MPLS1 + sysRTA_MPLS2 = C.RTA_MPLS2 + sysRTA_MPLS3 = C.RTA_MPLS3 + + sysRTAX_DST = C.RTAX_DST + sysRTAX_GATEWAY = C.RTAX_GATEWAY + sysRTAX_NETMASK = C.RTAX_NETMASK + sysRTAX_GENMASK = C.RTAX_GENMASK + sysRTAX_IFP = C.RTAX_IFP + sysRTAX_IFA = C.RTAX_IFA + sysRTAX_AUTHOR = C.RTAX_AUTHOR + sysRTAX_BRD = C.RTAX_BRD + sysRTAX_MPLS1 = C.RTAX_MPLS1 + sysRTAX_MPLS2 = C.RTAX_MPLS2 + sysRTAX_MPLS3 = C.RTAX_MPLS3 + sysRTAX_MAX = C.RTAX_MAX +) + +const ( + sizeofIfMsghdrDragonFlyBSD4 = C.sizeof_struct_if_msghdr + sizeofIfaMsghdrDragonFlyBSD4 = C.sizeof_struct_ifa_msghdr + sizeofIfmaMsghdrDragonFlyBSD4 = C.sizeof_struct_ifma_msghdr + sizeofIfAnnouncemsghdrDragonFlyBSD4 = C.sizeof_struct_if_announcemsghdr + + sizeofRtMsghdrDragonFlyBSD4 = C.sizeof_struct_rt_msghdr + sizeofRtMetricsDragonFlyBSD4 = C.sizeof_struct_rt_metrics + + sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/defs_freebsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/defs_freebsd.go new file mode 100644 index 0000000..d95594d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/defs_freebsd.go @@ -0,0 +1,337 @@ +// 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. + +// +build ignore + +package route + +/* +#include +#include + +#include +#include +#include + +#include + +struct if_data_freebsd7 { + u_char ifi_type; + u_char ifi_physical; + u_char ifi_addrlen; + u_char ifi_hdrlen; + u_char ifi_link_state; + u_char ifi_spare_char1; + u_char ifi_spare_char2; + u_char ifi_datalen; + u_long ifi_mtu; + u_long ifi_metric; + u_long ifi_baudrate; + u_long ifi_ipackets; + u_long ifi_ierrors; + u_long ifi_opackets; + u_long ifi_oerrors; + u_long ifi_collisions; + u_long ifi_ibytes; + u_long ifi_obytes; + u_long ifi_imcasts; + u_long ifi_omcasts; + u_long ifi_iqdrops; + u_long ifi_noproto; + u_long ifi_hwassist; + time_t __ifi_epoch; + struct timeval __ifi_lastchange; +}; + +struct if_data_freebsd8 { + u_char ifi_type; + u_char ifi_physical; + u_char ifi_addrlen; + u_char ifi_hdrlen; + u_char ifi_link_state; + u_char ifi_spare_char1; + u_char ifi_spare_char2; + u_char ifi_datalen; + u_long ifi_mtu; + u_long ifi_metric; + u_long ifi_baudrate; + u_long ifi_ipackets; + u_long ifi_ierrors; + u_long ifi_opackets; + u_long ifi_oerrors; + u_long ifi_collisions; + u_long ifi_ibytes; + u_long ifi_obytes; + u_long ifi_imcasts; + u_long ifi_omcasts; + u_long ifi_iqdrops; + u_long ifi_noproto; + u_long ifi_hwassist; + time_t __ifi_epoch; + struct timeval __ifi_lastchange; +}; + +struct if_data_freebsd9 { + u_char ifi_type; + u_char ifi_physical; + u_char ifi_addrlen; + u_char ifi_hdrlen; + u_char ifi_link_state; + u_char ifi_spare_char1; + u_char ifi_spare_char2; + u_char ifi_datalen; + u_long ifi_mtu; + u_long ifi_metric; + u_long ifi_baudrate; + u_long ifi_ipackets; + u_long ifi_ierrors; + u_long ifi_opackets; + u_long ifi_oerrors; + u_long ifi_collisions; + u_long ifi_ibytes; + u_long ifi_obytes; + u_long ifi_imcasts; + u_long ifi_omcasts; + u_long ifi_iqdrops; + u_long ifi_noproto; + u_long ifi_hwassist; + time_t __ifi_epoch; + struct timeval __ifi_lastchange; +}; + +struct if_data_freebsd10 { + u_char ifi_type; + u_char ifi_physical; + u_char ifi_addrlen; + u_char ifi_hdrlen; + u_char ifi_link_state; + u_char ifi_vhid; + u_char ifi_baudrate_pf; + u_char ifi_datalen; + u_long ifi_mtu; + u_long ifi_metric; + u_long ifi_baudrate; + u_long ifi_ipackets; + u_long ifi_ierrors; + u_long ifi_opackets; + u_long ifi_oerrors; + u_long ifi_collisions; + u_long ifi_ibytes; + u_long ifi_obytes; + u_long ifi_imcasts; + u_long ifi_omcasts; + u_long ifi_iqdrops; + u_long ifi_noproto; + uint64_t ifi_hwassist; + time_t __ifi_epoch; + struct timeval __ifi_lastchange; +}; + +struct if_data_freebsd11 { + uint8_t ifi_type; + uint8_t ifi_physical; + uint8_t ifi_addrlen; + uint8_t ifi_hdrlen; + uint8_t ifi_link_state; + uint8_t ifi_vhid; + uint16_t ifi_datalen; + uint32_t ifi_mtu; + uint32_t ifi_metric; + uint64_t ifi_baudrate; + uint64_t ifi_ipackets; + uint64_t ifi_ierrors; + uint64_t ifi_opackets; + uint64_t ifi_oerrors; + uint64_t ifi_collisions; + uint64_t ifi_ibytes; + uint64_t ifi_obytes; + uint64_t ifi_imcasts; + uint64_t ifi_omcasts; + uint64_t ifi_iqdrops; + uint64_t ifi_oqdrops; + uint64_t ifi_noproto; + uint64_t ifi_hwassist; + union { + time_t tt; + uint64_t ph; + } __ifi_epoch; + union { + struct timeval tv; + struct { + uint64_t ph1; + uint64_t ph2; + } ph; + } __ifi_lastchange; +}; + +struct if_msghdr_freebsd7 { + u_short ifm_msglen; + u_char ifm_version; + u_char ifm_type; + int ifm_addrs; + int ifm_flags; + u_short ifm_index; + struct if_data_freebsd7 ifm_data; +}; + +struct if_msghdr_freebsd8 { + u_short ifm_msglen; + u_char ifm_version; + u_char ifm_type; + int ifm_addrs; + int ifm_flags; + u_short ifm_index; + struct if_data_freebsd8 ifm_data; +}; + +struct if_msghdr_freebsd9 { + u_short ifm_msglen; + u_char ifm_version; + u_char ifm_type; + int ifm_addrs; + int ifm_flags; + u_short ifm_index; + struct if_data_freebsd9 ifm_data; +}; + +struct if_msghdr_freebsd10 { + u_short ifm_msglen; + u_char ifm_version; + u_char ifm_type; + int ifm_addrs; + int ifm_flags; + u_short ifm_index; + struct if_data_freebsd10 ifm_data; +}; + +struct if_msghdr_freebsd11 { + u_short ifm_msglen; + u_char ifm_version; + u_char ifm_type; + int ifm_addrs; + int ifm_flags; + u_short ifm_index; + struct if_data_freebsd11 ifm_data; +}; +*/ +import "C" + +const ( + sysAF_UNSPEC = C.AF_UNSPEC + sysAF_INET = C.AF_INET + sysAF_ROUTE = C.AF_ROUTE + sysAF_LINK = C.AF_LINK + sysAF_INET6 = C.AF_INET6 + + sysSOCK_RAW = C.SOCK_RAW + + sysNET_RT_DUMP = C.NET_RT_DUMP + sysNET_RT_FLAGS = C.NET_RT_FLAGS + sysNET_RT_IFLIST = C.NET_RT_IFLIST + sysNET_RT_IFMALIST = C.NET_RT_IFMALIST + sysNET_RT_IFLISTL = C.NET_RT_IFLISTL +) + +const ( + sysCTL_MAXNAME = C.CTL_MAXNAME + + sysCTL_UNSPEC = C.CTL_UNSPEC + sysCTL_KERN = C.CTL_KERN + sysCTL_VM = C.CTL_VM + sysCTL_VFS = C.CTL_VFS + sysCTL_NET = C.CTL_NET + sysCTL_DEBUG = C.CTL_DEBUG + sysCTL_HW = C.CTL_HW + sysCTL_MACHDEP = C.CTL_MACHDEP + sysCTL_USER = C.CTL_USER + sysCTL_P1003_1B = C.CTL_P1003_1B +) + +const ( + sysRTM_VERSION = C.RTM_VERSION + + sysRTM_ADD = C.RTM_ADD + sysRTM_DELETE = C.RTM_DELETE + sysRTM_CHANGE = C.RTM_CHANGE + sysRTM_GET = C.RTM_GET + sysRTM_LOSING = C.RTM_LOSING + sysRTM_REDIRECT = C.RTM_REDIRECT + sysRTM_MISS = C.RTM_MISS + sysRTM_LOCK = C.RTM_LOCK + sysRTM_RESOLVE = C.RTM_RESOLVE + sysRTM_NEWADDR = C.RTM_NEWADDR + sysRTM_DELADDR = C.RTM_DELADDR + sysRTM_IFINFO = C.RTM_IFINFO + sysRTM_NEWMADDR = C.RTM_NEWMADDR + sysRTM_DELMADDR = C.RTM_DELMADDR + sysRTM_IFANNOUNCE = C.RTM_IFANNOUNCE + sysRTM_IEEE80211 = C.RTM_IEEE80211 + + sysRTA_DST = C.RTA_DST + sysRTA_GATEWAY = C.RTA_GATEWAY + sysRTA_NETMASK = C.RTA_NETMASK + sysRTA_GENMASK = C.RTA_GENMASK + sysRTA_IFP = C.RTA_IFP + sysRTA_IFA = C.RTA_IFA + sysRTA_AUTHOR = C.RTA_AUTHOR + sysRTA_BRD = C.RTA_BRD + + sysRTAX_DST = C.RTAX_DST + sysRTAX_GATEWAY = C.RTAX_GATEWAY + sysRTAX_NETMASK = C.RTAX_NETMASK + sysRTAX_GENMASK = C.RTAX_GENMASK + sysRTAX_IFP = C.RTAX_IFP + sysRTAX_IFA = C.RTAX_IFA + sysRTAX_AUTHOR = C.RTAX_AUTHOR + sysRTAX_BRD = C.RTAX_BRD + sysRTAX_MAX = C.RTAX_MAX +) + +const ( + sizeofIfMsghdrlFreeBSD10 = C.sizeof_struct_if_msghdrl + sizeofIfaMsghdrFreeBSD10 = C.sizeof_struct_ifa_msghdr + sizeofIfaMsghdrlFreeBSD10 = C.sizeof_struct_ifa_msghdrl + sizeofIfmaMsghdrFreeBSD10 = C.sizeof_struct_ifma_msghdr + sizeofIfAnnouncemsghdrFreeBSD10 = C.sizeof_struct_if_announcemsghdr + + sizeofRtMsghdrFreeBSD10 = C.sizeof_struct_rt_msghdr + sizeofRtMetricsFreeBSD10 = C.sizeof_struct_rt_metrics + + sizeofIfMsghdrFreeBSD7 = C.sizeof_struct_if_msghdr_freebsd7 + sizeofIfMsghdrFreeBSD8 = C.sizeof_struct_if_msghdr_freebsd8 + sizeofIfMsghdrFreeBSD9 = C.sizeof_struct_if_msghdr_freebsd9 + sizeofIfMsghdrFreeBSD10 = C.sizeof_struct_if_msghdr_freebsd10 + sizeofIfMsghdrFreeBSD11 = C.sizeof_struct_if_msghdr_freebsd11 + + sizeofIfDataFreeBSD7 = C.sizeof_struct_if_data_freebsd7 + sizeofIfDataFreeBSD8 = C.sizeof_struct_if_data_freebsd8 + sizeofIfDataFreeBSD9 = C.sizeof_struct_if_data_freebsd9 + sizeofIfDataFreeBSD10 = C.sizeof_struct_if_data_freebsd10 + sizeofIfDataFreeBSD11 = C.sizeof_struct_if_data_freebsd11 + + sizeofIfMsghdrlFreeBSD10Emu = C.sizeof_struct_if_msghdrl + sizeofIfaMsghdrFreeBSD10Emu = C.sizeof_struct_ifa_msghdr + sizeofIfaMsghdrlFreeBSD10Emu = C.sizeof_struct_ifa_msghdrl + sizeofIfmaMsghdrFreeBSD10Emu = C.sizeof_struct_ifma_msghdr + sizeofIfAnnouncemsghdrFreeBSD10Emu = C.sizeof_struct_if_announcemsghdr + + sizeofRtMsghdrFreeBSD10Emu = C.sizeof_struct_rt_msghdr + sizeofRtMetricsFreeBSD10Emu = C.sizeof_struct_rt_metrics + + sizeofIfMsghdrFreeBSD7Emu = C.sizeof_struct_if_msghdr_freebsd7 + sizeofIfMsghdrFreeBSD8Emu = C.sizeof_struct_if_msghdr_freebsd8 + sizeofIfMsghdrFreeBSD9Emu = C.sizeof_struct_if_msghdr_freebsd9 + sizeofIfMsghdrFreeBSD10Emu = C.sizeof_struct_if_msghdr_freebsd10 + sizeofIfMsghdrFreeBSD11Emu = C.sizeof_struct_if_msghdr_freebsd11 + + sizeofIfDataFreeBSD7Emu = C.sizeof_struct_if_data_freebsd7 + sizeofIfDataFreeBSD8Emu = C.sizeof_struct_if_data_freebsd8 + sizeofIfDataFreeBSD9Emu = C.sizeof_struct_if_data_freebsd9 + sizeofIfDataFreeBSD10Emu = C.sizeof_struct_if_data_freebsd10 + sizeofIfDataFreeBSD11Emu = C.sizeof_struct_if_data_freebsd11 + + sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/defs_netbsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/defs_netbsd.go new file mode 100644 index 0000000..b0abd54 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/defs_netbsd.go @@ -0,0 +1,112 @@ +// 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. + +// +build ignore + +package route + +/* +#include +#include + +#include +#include +#include + +#include +*/ +import "C" + +const ( + sysAF_UNSPEC = C.AF_UNSPEC + sysAF_INET = C.AF_INET + sysAF_ROUTE = C.AF_ROUTE + sysAF_LINK = C.AF_LINK + sysAF_INET6 = C.AF_INET6 + + sysSOCK_RAW = C.SOCK_RAW + + sysNET_RT_DUMP = C.NET_RT_DUMP + sysNET_RT_FLAGS = C.NET_RT_FLAGS + sysNET_RT_IFLIST = C.NET_RT_IFLIST + sysNET_RT_MAXID = C.NET_RT_MAXID +) + +const ( + sysCTL_MAXNAME = C.CTL_MAXNAME + + sysCTL_UNSPEC = C.CTL_UNSPEC + sysCTL_KERN = C.CTL_KERN + sysCTL_VM = C.CTL_VM + sysCTL_VFS = C.CTL_VFS + sysCTL_NET = C.CTL_NET + sysCTL_DEBUG = C.CTL_DEBUG + sysCTL_HW = C.CTL_HW + sysCTL_MACHDEP = C.CTL_MACHDEP + sysCTL_USER = C.CTL_USER + sysCTL_DDB = C.CTL_DDB + sysCTL_PROC = C.CTL_PROC + sysCTL_VENDOR = C.CTL_VENDOR + sysCTL_EMUL = C.CTL_EMUL + sysCTL_SECURITY = C.CTL_SECURITY + sysCTL_MAXID = C.CTL_MAXID +) + +const ( + sysRTM_VERSION = C.RTM_VERSION + + sysRTM_ADD = C.RTM_ADD + sysRTM_DELETE = C.RTM_DELETE + sysRTM_CHANGE = C.RTM_CHANGE + sysRTM_GET = C.RTM_GET + sysRTM_LOSING = C.RTM_LOSING + sysRTM_REDIRECT = C.RTM_REDIRECT + sysRTM_MISS = C.RTM_MISS + sysRTM_LOCK = C.RTM_LOCK + sysRTM_OLDADD = C.RTM_OLDADD + sysRTM_OLDDEL = C.RTM_OLDDEL + sysRTM_RESOLVE = C.RTM_RESOLVE + sysRTM_NEWADDR = C.RTM_NEWADDR + sysRTM_DELADDR = C.RTM_DELADDR + sysRTM_IFANNOUNCE = C.RTM_IFANNOUNCE + sysRTM_IEEE80211 = C.RTM_IEEE80211 + sysRTM_SETGATE = C.RTM_SETGATE + sysRTM_LLINFO_UPD = C.RTM_LLINFO_UPD + sysRTM_IFINFO = C.RTM_IFINFO + sysRTM_CHGADDR = C.RTM_CHGADDR + + sysRTA_DST = C.RTA_DST + sysRTA_GATEWAY = C.RTA_GATEWAY + sysRTA_NETMASK = C.RTA_NETMASK + sysRTA_GENMASK = C.RTA_GENMASK + sysRTA_IFP = C.RTA_IFP + sysRTA_IFA = C.RTA_IFA + sysRTA_AUTHOR = C.RTA_AUTHOR + sysRTA_BRD = C.RTA_BRD + sysRTA_TAG = C.RTA_TAG + + sysRTAX_DST = C.RTAX_DST + sysRTAX_GATEWAY = C.RTAX_GATEWAY + sysRTAX_NETMASK = C.RTAX_NETMASK + sysRTAX_GENMASK = C.RTAX_GENMASK + sysRTAX_IFP = C.RTAX_IFP + sysRTAX_IFA = C.RTAX_IFA + sysRTAX_AUTHOR = C.RTAX_AUTHOR + sysRTAX_BRD = C.RTAX_BRD + sysRTAX_TAG = C.RTAX_TAG + sysRTAX_MAX = C.RTAX_MAX +) + +const ( + sizeofIfMsghdrNetBSD7 = C.sizeof_struct_if_msghdr + sizeofIfaMsghdrNetBSD7 = C.sizeof_struct_ifa_msghdr + sizeofIfAnnouncemsghdrNetBSD7 = C.sizeof_struct_if_announcemsghdr + + sizeofRtMsghdrNetBSD7 = C.sizeof_struct_rt_msghdr + sizeofRtMetricsNetBSD7 = C.sizeof_struct_rt_metrics + + sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/defs_openbsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/defs_openbsd.go new file mode 100644 index 0000000..173bb5d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/defs_openbsd.go @@ -0,0 +1,116 @@ +// 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. + +// +build ignore + +package route + +/* +#include +#include + +#include +#include +#include + +#include +*/ +import "C" + +const ( + sysAF_UNSPEC = C.AF_UNSPEC + sysAF_INET = C.AF_INET + sysAF_ROUTE = C.AF_ROUTE + sysAF_LINK = C.AF_LINK + sysAF_INET6 = C.AF_INET6 + + sysSOCK_RAW = C.SOCK_RAW + + sysNET_RT_DUMP = C.NET_RT_DUMP + sysNET_RT_FLAGS = C.NET_RT_FLAGS + sysNET_RT_IFLIST = C.NET_RT_IFLIST + sysNET_RT_STATS = C.NET_RT_STATS + sysNET_RT_TABLE = C.NET_RT_TABLE + sysNET_RT_IFNAMES = C.NET_RT_IFNAMES + sysNET_RT_MAXID = C.NET_RT_MAXID +) + +const ( + sysCTL_MAXNAME = C.CTL_MAXNAME + + sysCTL_UNSPEC = C.CTL_UNSPEC + sysCTL_KERN = C.CTL_KERN + sysCTL_VM = C.CTL_VM + sysCTL_FS = C.CTL_FS + sysCTL_NET = C.CTL_NET + sysCTL_DEBUG = C.CTL_DEBUG + sysCTL_HW = C.CTL_HW + sysCTL_MACHDEP = C.CTL_MACHDEP + sysCTL_DDB = C.CTL_DDB + sysCTL_VFS = C.CTL_VFS + sysCTL_MAXID = C.CTL_MAXID +) + +const ( + sysRTM_VERSION = C.RTM_VERSION + + sysRTM_ADD = C.RTM_ADD + sysRTM_DELETE = C.RTM_DELETE + sysRTM_CHANGE = C.RTM_CHANGE + sysRTM_GET = C.RTM_GET + sysRTM_LOSING = C.RTM_LOSING + sysRTM_REDIRECT = C.RTM_REDIRECT + sysRTM_MISS = C.RTM_MISS + sysRTM_LOCK = C.RTM_LOCK + sysRTM_RESOLVE = C.RTM_RESOLVE + sysRTM_NEWADDR = C.RTM_NEWADDR + sysRTM_DELADDR = C.RTM_DELADDR + sysRTM_IFINFO = C.RTM_IFINFO + sysRTM_IFANNOUNCE = C.RTM_IFANNOUNCE + sysRTM_DESYNC = C.RTM_DESYNC + sysRTM_INVALIDATE = C.RTM_INVALIDATE + sysRTM_BFD = C.RTM_BFD + sysRTM_PROPOSAL = C.RTM_PROPOSAL + + sysRTA_DST = C.RTA_DST + sysRTA_GATEWAY = C.RTA_GATEWAY + sysRTA_NETMASK = C.RTA_NETMASK + sysRTA_GENMASK = C.RTA_GENMASK + sysRTA_IFP = C.RTA_IFP + sysRTA_IFA = C.RTA_IFA + sysRTA_AUTHOR = C.RTA_AUTHOR + sysRTA_BRD = C.RTA_BRD + sysRTA_SRC = C.RTA_SRC + sysRTA_SRCMASK = C.RTA_SRCMASK + sysRTA_LABEL = C.RTA_LABEL + sysRTA_BFD = C.RTA_BFD + sysRTA_DNS = C.RTA_DNS + sysRTA_STATIC = C.RTA_STATIC + sysRTA_SEARCH = C.RTA_SEARCH + + sysRTAX_DST = C.RTAX_DST + sysRTAX_GATEWAY = C.RTAX_GATEWAY + sysRTAX_NETMASK = C.RTAX_NETMASK + sysRTAX_GENMASK = C.RTAX_GENMASK + sysRTAX_IFP = C.RTAX_IFP + sysRTAX_IFA = C.RTAX_IFA + sysRTAX_AUTHOR = C.RTAX_AUTHOR + sysRTAX_BRD = C.RTAX_BRD + sysRTAX_SRC = C.RTAX_SRC + sysRTAX_SRCMASK = C.RTAX_SRCMASK + sysRTAX_LABEL = C.RTAX_LABEL + sysRTAX_BFD = C.RTAX_BFD + sysRTAX_DNS = C.RTAX_DNS + sysRTAX_STATIC = C.RTAX_STATIC + sysRTAX_SEARCH = C.RTAX_SEARCH + sysRTAX_MAX = C.RTAX_MAX +) + +const ( + sizeofRtMsghdr = C.sizeof_struct_rt_msghdr + + sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/interface.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/interface.go new file mode 100644 index 0000000..854906d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/interface.go @@ -0,0 +1,64 @@ +// 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. + +// +build darwin dragonfly freebsd netbsd openbsd + +package route + +// An InterfaceMessage represents an interface message. +type InterfaceMessage struct { + Version int // message version + Type int // message type + Flags int // interface flags + Index int // interface index + Name string // interface name + Addrs []Addr // addresses + + extOff int // offset of header extension + raw []byte // raw message +} + +// An InterfaceAddrMessage represents an interface address message. +type InterfaceAddrMessage struct { + Version int // message version + Type int // message type + Flags int // interface flags + Index int // interface index + Addrs []Addr // addresses + + raw []byte // raw message +} + +// Sys implements the Sys method of Message interface. +func (m *InterfaceAddrMessage) Sys() []Sys { return nil } + +// An InterfaceMulticastAddrMessage represents an interface multicast +// address message. +type InterfaceMulticastAddrMessage struct { + Version int // message version + Type int // messsage type + Flags int // interface flags + Index int // interface index + Addrs []Addr // addresses + + raw []byte // raw message +} + +// Sys implements the Sys method of Message interface. +func (m *InterfaceMulticastAddrMessage) Sys() []Sys { return nil } + +// An InterfaceAnnounceMessage represents an interface announcement +// message. +type InterfaceAnnounceMessage struct { + Version int // message version + Type int // message type + Index int // interface index + Name string // interface name + What int // what type of announcement + + raw []byte // raw message +} + +// Sys implements the Sys method of Message interface. +func (m *InterfaceAnnounceMessage) Sys() []Sys { return nil } diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/interface_announce.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/interface_announce.go new file mode 100644 index 0000000..520d657 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/interface_announce.go @@ -0,0 +1,32 @@ +// 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. + +// +build dragonfly freebsd netbsd + +package route + +func (w *wireFormat) parseInterfaceAnnounceMessage(_ RIBType, b []byte) (Message, error) { + if len(b) < w.bodyOff { + return nil, errMessageTooShort + } + l := int(nativeEndian.Uint16(b[:2])) + if len(b) < l { + return nil, errInvalidMessage + } + m := &InterfaceAnnounceMessage{ + Version: int(b[2]), + Type: int(b[3]), + Index: int(nativeEndian.Uint16(b[4:6])), + What: int(nativeEndian.Uint16(b[22:24])), + raw: b[:l], + } + for i := 0; i < 16; i++ { + if b[6+i] != 0 { + continue + } + m.Name = string(b[6 : 6+i]) + break + } + return m, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/interface_classic.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/interface_classic.go new file mode 100644 index 0000000..ac4e7a6 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/interface_classic.go @@ -0,0 +1,66 @@ +// 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. + +// +build darwin dragonfly netbsd + +package route + +import "runtime" + +func (w *wireFormat) parseInterfaceMessage(_ RIBType, b []byte) (Message, error) { + if len(b) < w.bodyOff { + return nil, errMessageTooShort + } + l := int(nativeEndian.Uint16(b[:2])) + if len(b) < l { + return nil, errInvalidMessage + } + attrs := uint(nativeEndian.Uint32(b[4:8])) + if attrs&sysRTA_IFP == 0 { + return nil, nil + } + m := &InterfaceMessage{ + Version: int(b[2]), + Type: int(b[3]), + Addrs: make([]Addr, sysRTAX_MAX), + Flags: int(nativeEndian.Uint32(b[8:12])), + Index: int(nativeEndian.Uint16(b[12:14])), + extOff: w.extOff, + raw: b[:l], + } + a, err := parseLinkAddr(b[w.bodyOff:]) + if err != nil { + return nil, err + } + m.Addrs[sysRTAX_IFP] = a + m.Name = a.(*LinkAddr).Name + return m, nil +} + +func (w *wireFormat) parseInterfaceAddrMessage(_ RIBType, b []byte) (Message, error) { + if len(b) < w.bodyOff { + return nil, errMessageTooShort + } + l := int(nativeEndian.Uint16(b[:2])) + if len(b) < l { + return nil, errInvalidMessage + } + m := &InterfaceAddrMessage{ + Version: int(b[2]), + Type: int(b[3]), + Flags: int(nativeEndian.Uint32(b[8:12])), + raw: b[:l], + } + if runtime.GOOS == "netbsd" { + m.Index = int(nativeEndian.Uint16(b[16:18])) + } else { + m.Index = int(nativeEndian.Uint16(b[12:14])) + } + var err error + m.Addrs, err = parseAddrs(uint(nativeEndian.Uint32(b[4:8])), parseKernelInetAddr, b[w.bodyOff:]) + if err != nil { + return nil, err + } + return m, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/interface_freebsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/interface_freebsd.go new file mode 100644 index 0000000..9f6f50c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/interface_freebsd.go @@ -0,0 +1,78 @@ +// 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 route + +func (w *wireFormat) parseInterfaceMessage(typ RIBType, b []byte) (Message, error) { + var extOff, bodyOff int + if typ == sysNET_RT_IFLISTL { + if len(b) < 20 { + return nil, errMessageTooShort + } + extOff = int(nativeEndian.Uint16(b[18:20])) + bodyOff = int(nativeEndian.Uint16(b[16:18])) + } else { + extOff = w.extOff + bodyOff = w.bodyOff + } + if len(b) < extOff || len(b) < bodyOff { + return nil, errInvalidMessage + } + l := int(nativeEndian.Uint16(b[:2])) + if len(b) < l { + return nil, errInvalidMessage + } + attrs := uint(nativeEndian.Uint32(b[4:8])) + if attrs&sysRTA_IFP == 0 { + return nil, nil + } + m := &InterfaceMessage{ + Version: int(b[2]), + Type: int(b[3]), + Flags: int(nativeEndian.Uint32(b[8:12])), + Index: int(nativeEndian.Uint16(b[12:14])), + Addrs: make([]Addr, sysRTAX_MAX), + extOff: extOff, + raw: b[:l], + } + a, err := parseLinkAddr(b[bodyOff:]) + if err != nil { + return nil, err + } + m.Addrs[sysRTAX_IFP] = a + m.Name = a.(*LinkAddr).Name + return m, nil +} + +func (w *wireFormat) parseInterfaceAddrMessage(typ RIBType, b []byte) (Message, error) { + var bodyOff int + if typ == sysNET_RT_IFLISTL { + if len(b) < 24 { + return nil, errMessageTooShort + } + bodyOff = int(nativeEndian.Uint16(b[16:18])) + } else { + bodyOff = w.bodyOff + } + if len(b) < bodyOff { + return nil, errInvalidMessage + } + l := int(nativeEndian.Uint16(b[:2])) + if len(b) < l { + return nil, errInvalidMessage + } + m := &InterfaceAddrMessage{ + Version: int(b[2]), + Type: int(b[3]), + Flags: int(nativeEndian.Uint32(b[8:12])), + Index: int(nativeEndian.Uint16(b[12:14])), + raw: b[:l], + } + var err error + m.Addrs, err = parseAddrs(uint(nativeEndian.Uint32(b[4:8])), parseKernelInetAddr, b[bodyOff:]) + if err != nil { + return nil, err + } + return m, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/interface_multicast.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/interface_multicast.go new file mode 100644 index 0000000..1e99a9c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/interface_multicast.go @@ -0,0 +1,30 @@ +// 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. + +// +build darwin dragonfly freebsd + +package route + +func (w *wireFormat) parseInterfaceMulticastAddrMessage(_ RIBType, b []byte) (Message, error) { + if len(b) < w.bodyOff { + return nil, errMessageTooShort + } + l := int(nativeEndian.Uint16(b[:2])) + if len(b) < l { + return nil, errInvalidMessage + } + m := &InterfaceMulticastAddrMessage{ + Version: int(b[2]), + Type: int(b[3]), + Flags: int(nativeEndian.Uint32(b[8:12])), + Index: int(nativeEndian.Uint16(b[12:14])), + raw: b[:l], + } + var err error + m.Addrs, err = parseAddrs(uint(nativeEndian.Uint32(b[4:8])), parseKernelInetAddr, b[w.bodyOff:]) + if err != nil { + return nil, err + } + return m, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/interface_openbsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/interface_openbsd.go new file mode 100644 index 0000000..e4a143c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/interface_openbsd.go @@ -0,0 +1,90 @@ +// 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 route + +func (*wireFormat) parseInterfaceMessage(_ RIBType, b []byte) (Message, error) { + if len(b) < 32 { + return nil, errMessageTooShort + } + l := int(nativeEndian.Uint16(b[:2])) + if len(b) < l { + return nil, errInvalidMessage + } + attrs := uint(nativeEndian.Uint32(b[12:16])) + if attrs&sysRTA_IFP == 0 { + return nil, nil + } + m := &InterfaceMessage{ + Version: int(b[2]), + Type: int(b[3]), + Flags: int(nativeEndian.Uint32(b[16:20])), + Index: int(nativeEndian.Uint16(b[6:8])), + Addrs: make([]Addr, sysRTAX_MAX), + raw: b[:l], + } + ll := int(nativeEndian.Uint16(b[4:6])) + if len(b) < ll { + return nil, errInvalidMessage + } + a, err := parseLinkAddr(b[ll:]) + if err != nil { + return nil, err + } + m.Addrs[sysRTAX_IFP] = a + m.Name = a.(*LinkAddr).Name + return m, nil +} + +func (*wireFormat) parseInterfaceAddrMessage(_ RIBType, b []byte) (Message, error) { + if len(b) < 24 { + return nil, errMessageTooShort + } + l := int(nativeEndian.Uint16(b[:2])) + if len(b) < l { + return nil, errInvalidMessage + } + bodyOff := int(nativeEndian.Uint16(b[4:6])) + if len(b) < bodyOff { + return nil, errInvalidMessage + } + m := &InterfaceAddrMessage{ + Version: int(b[2]), + Type: int(b[3]), + Flags: int(nativeEndian.Uint32(b[12:16])), + Index: int(nativeEndian.Uint16(b[6:8])), + raw: b[:l], + } + var err error + m.Addrs, err = parseAddrs(uint(nativeEndian.Uint32(b[12:16])), parseKernelInetAddr, b[bodyOff:]) + if err != nil { + return nil, err + } + return m, nil +} + +func (*wireFormat) parseInterfaceAnnounceMessage(_ RIBType, b []byte) (Message, error) { + if len(b) < 26 { + return nil, errMessageTooShort + } + l := int(nativeEndian.Uint16(b[:2])) + if len(b) < l { + return nil, errInvalidMessage + } + m := &InterfaceAnnounceMessage{ + Version: int(b[2]), + Type: int(b[3]), + Index: int(nativeEndian.Uint16(b[6:8])), + What: int(nativeEndian.Uint16(b[8:10])), + raw: b[:l], + } + for i := 0; i < 16; i++ { + if b[10+i] != 0 { + continue + } + m.Name = string(b[10 : 10+i]) + break + } + return m, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/message.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/message.go new file mode 100644 index 0000000..0fa7e09 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/message.go @@ -0,0 +1,72 @@ +// 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. + +// +build darwin dragonfly freebsd netbsd openbsd + +package route + +// A Message represents a routing message. +type Message interface { + // Sys returns operating system-specific information. + Sys() []Sys +} + +// A Sys reprensents operating system-specific information. +type Sys interface { + // SysType returns a type of operating system-specific + // information. + SysType() SysType +} + +// A SysType represents a type of operating system-specific +// information. +type SysType int + +const ( + SysMetrics SysType = iota + SysStats +) + +// ParseRIB parses b as a routing information base and returns a list +// of routing messages. +func ParseRIB(typ RIBType, b []byte) ([]Message, error) { + if !typ.parseable() { + return nil, errUnsupportedMessage + } + var msgs []Message + nmsgs, nskips := 0, 0 + for len(b) > 4 { + nmsgs++ + l := int(nativeEndian.Uint16(b[:2])) + if l == 0 { + return nil, errInvalidMessage + } + if len(b) < l { + return nil, errMessageTooShort + } + if b[2] != sysRTM_VERSION { + b = b[l:] + continue + } + if w, ok := wireFormats[int(b[3])]; !ok { + nskips++ + } else { + m, err := w.parse(typ, b) + if err != nil { + return nil, err + } + if m == nil { + nskips++ + } else { + msgs = append(msgs, m) + } + } + b = b[l:] + } + // We failed to parse any of the messages - version mismatch? + if nmsgs != len(msgs)+nskips { + return nil, errMessageMismatch + } + return msgs, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/message_darwin_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/message_darwin_test.go new file mode 100644 index 0000000..316aa75 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/message_darwin_test.go @@ -0,0 +1,34 @@ +// 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 route + +import "testing" + +func TestFetchAndParseRIBOnDarwin(t *testing.T) { + for _, typ := range []RIBType{sysNET_RT_FLAGS, sysNET_RT_DUMP2, sysNET_RT_IFLIST2} { + var lastErr error + var ms []Message + for _, af := range []int{sysAF_UNSPEC, sysAF_INET, sysAF_INET6} { + rs, err := fetchAndParseRIB(af, typ) + if err != nil { + lastErr = err + continue + } + ms = append(ms, rs...) + } + if len(ms) == 0 && lastErr != nil { + t.Error(typ, lastErr) + continue + } + ss, err := msgs(ms).validate() + if err != nil { + t.Error(typ, err) + continue + } + for _, s := range ss { + t.Log(s) + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/message_freebsd_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/message_freebsd_test.go new file mode 100644 index 0000000..db4b567 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/message_freebsd_test.go @@ -0,0 +1,92 @@ +// 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 route + +import ( + "testing" + "unsafe" +) + +func TestFetchAndParseRIBOnFreeBSD(t *testing.T) { + for _, typ := range []RIBType{sysNET_RT_IFMALIST} { + var lastErr error + var ms []Message + for _, af := range []int{sysAF_UNSPEC, sysAF_INET, sysAF_INET6} { + rs, err := fetchAndParseRIB(af, typ) + if err != nil { + lastErr = err + continue + } + ms = append(ms, rs...) + } + if len(ms) == 0 && lastErr != nil { + t.Error(typ, lastErr) + continue + } + ss, err := msgs(ms).validate() + if err != nil { + t.Error(typ, err) + continue + } + for _, s := range ss { + t.Log(s) + } + } +} + +func TestFetchAndParseRIBOnFreeBSD10AndAbove(t *testing.T) { + if _, err := FetchRIB(sysAF_UNSPEC, sysNET_RT_IFLISTL, 0); err != nil { + t.Skip("NET_RT_IFLISTL not supported") + } + var p uintptr + if kernelAlign != int(unsafe.Sizeof(p)) { + t.Skip("NET_RT_IFLIST vs. NET_RT_IFLISTL doesn't work for 386 emulation on amd64") + } + + var tests = [2]struct { + typ RIBType + b []byte + msgs []Message + ss []string + }{ + {typ: sysNET_RT_IFLIST}, + {typ: sysNET_RT_IFLISTL}, + } + for i := range tests { + var lastErr error + for _, af := range []int{sysAF_UNSPEC, sysAF_INET, sysAF_INET6} { + rs, err := fetchAndParseRIB(af, tests[i].typ) + if err != nil { + lastErr = err + continue + } + tests[i].msgs = append(tests[i].msgs, rs...) + } + if len(tests[i].msgs) == 0 && lastErr != nil { + t.Error(tests[i].typ, lastErr) + continue + } + tests[i].ss, lastErr = msgs(tests[i].msgs).validate() + if lastErr != nil { + t.Error(tests[i].typ, lastErr) + continue + } + for _, s := range tests[i].ss { + t.Log(s) + } + } + for i := len(tests) - 1; i > 0; i-- { + if len(tests[i].ss) != len(tests[i-1].ss) { + t.Errorf("got %v; want %v", tests[i].ss, tests[i-1].ss) + continue + } + for j, s1 := range tests[i].ss { + s0 := tests[i-1].ss[j] + if s1 != s0 { + t.Errorf("got %s; want %s", s1, s0) + } + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/message_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/message_test.go new file mode 100644 index 0000000..e848dab --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/message_test.go @@ -0,0 +1,239 @@ +// 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. + +// +build darwin dragonfly freebsd netbsd openbsd + +package route + +import ( + "os" + "syscall" + "testing" + "time" +) + +func TestFetchAndParseRIB(t *testing.T) { + for _, typ := range []RIBType{sysNET_RT_DUMP, sysNET_RT_IFLIST} { + var lastErr error + var ms []Message + for _, af := range []int{sysAF_UNSPEC, sysAF_INET, sysAF_INET6} { + rs, err := fetchAndParseRIB(af, typ) + if err != nil { + lastErr = err + continue + } + ms = append(ms, rs...) + } + if len(ms) == 0 && lastErr != nil { + t.Error(typ, lastErr) + continue + } + ss, err := msgs(ms).validate() + if err != nil { + t.Error(typ, err) + continue + } + for _, s := range ss { + t.Log(typ, s) + } + } +} + +var ( + rtmonSock int + rtmonErr error +) + +func init() { + // We need to keep rtmonSock alive to avoid treading on + // recycled socket descriptors. + rtmonSock, rtmonErr = syscall.Socket(sysAF_ROUTE, sysSOCK_RAW, sysAF_UNSPEC) +} + +// TestMonitorAndParseRIB leaks a worker goroutine and a socket +// descriptor but that's intentional. +func TestMonitorAndParseRIB(t *testing.T) { + if testing.Short() || os.Getuid() != 0 { + t.Skip("must be root") + } + + if rtmonErr != nil { + t.Fatal(rtmonErr) + } + + // We suppose that using an IPv4 link-local address and the + // dot1Q ID for Token Ring and FDDI doesn't harm anyone. + pv := &propVirtual{addr: "169.254.0.1", mask: "255.255.255.0"} + if err := pv.configure(1002); err != nil { + t.Skip(err) + } + if err := pv.setup(); err != nil { + t.Skip(err) + } + pv.teardown() + + go func() { + b := make([]byte, os.Getpagesize()) + for { + // There's no easy way to unblock this read + // call because the routing message exchange + // over routing socket is a connectionless + // message-oriented protocol, no control plane + // for signaling connectivity, and we cannot + // use the net package of standard library due + // to the lack of support for routing socket + // and circular dependency. + n, err := syscall.Read(rtmonSock, b) + if err != nil { + return + } + ms, err := ParseRIB(0, b[:n]) + if err != nil { + t.Error(err) + return + } + ss, err := msgs(ms).validate() + if err != nil { + t.Error(err) + return + } + for _, s := range ss { + t.Log(s) + } + } + }() + + for _, vid := range []int{1002, 1003, 1004, 1005} { + pv := &propVirtual{addr: "169.254.0.1", mask: "255.255.255.0"} + if err := pv.configure(vid); err != nil { + t.Fatal(err) + } + if err := pv.setup(); err != nil { + t.Fatal(err) + } + time.Sleep(200 * time.Millisecond) + if err := pv.teardown(); err != nil { + t.Fatal(err) + } + time.Sleep(200 * time.Millisecond) + } +} + +func TestParseRIBWithFuzz(t *testing.T) { + for _, fuzz := range []string{ + "0\x00\x05\x050000000000000000" + + "00000000000000000000" + + "00000000000000000000" + + "00000000000000000000" + + "0000000000000\x02000000" + + "00000000", + "\x02\x00\x05\f0000000000000000" + + "0\x0200000000000000", + "\x02\x00\x05\x100000000000000\x1200" + + "0\x00\xff\x00", + "\x02\x00\x05\f0000000000000000" + + "0\x12000\x00\x02\x0000", + "\x00\x00\x00\x01\x00", + "00000", + } { + for typ := RIBType(0); typ < 256; typ++ { + ParseRIB(typ, []byte(fuzz)) + } + } +} + +func TestRouteMessage(t *testing.T) { + s, err := syscall.Socket(sysAF_ROUTE, sysSOCK_RAW, sysAF_UNSPEC) + if err != nil { + t.Fatal(err) + } + defer syscall.Close(s) + + var ms []RouteMessage + for _, af := range []int{sysAF_INET, sysAF_INET6} { + if _, err := fetchAndParseRIB(af, sysNET_RT_DUMP); err != nil { + t.Log(err) + continue + } + switch af { + case sysAF_INET: + ms = append(ms, []RouteMessage{ + { + Type: sysRTM_GET, + Addrs: []Addr{ + &Inet4Addr{IP: [4]byte{127, 0, 0, 1}}, + nil, + nil, + nil, + &LinkAddr{}, + &Inet4Addr{}, + nil, + &Inet4Addr{}, + }, + }, + { + Type: sysRTM_GET, + Addrs: []Addr{ + &Inet4Addr{IP: [4]byte{127, 0, 0, 1}}, + }, + }, + }...) + case sysAF_INET6: + ms = append(ms, []RouteMessage{ + { + Type: sysRTM_GET, + Addrs: []Addr{ + &Inet6Addr{IP: [16]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}}, + nil, + nil, + nil, + &LinkAddr{}, + &Inet6Addr{}, + nil, + &Inet6Addr{}, + }, + }, + { + Type: sysRTM_GET, + Addrs: []Addr{ + &Inet6Addr{IP: [16]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}}, + }, + }, + }...) + } + } + for i, m := range ms { + m.ID = uintptr(os.Getpid()) + m.Seq = i + 1 + wb, err := m.Marshal() + if err != nil { + t.Fatalf("%v: %v", m, err) + } + if _, err := syscall.Write(s, wb); err != nil { + t.Fatalf("%v: %v", m, err) + } + rb := make([]byte, os.Getpagesize()) + n, err := syscall.Read(s, rb) + if err != nil { + t.Fatalf("%v: %v", m, err) + } + rms, err := ParseRIB(0, rb[:n]) + if err != nil { + t.Fatalf("%v: %v", m, err) + } + for _, rm := range rms { + err := rm.(*RouteMessage).Err + if err != nil { + t.Errorf("%v: %v", m, err) + } + } + ss, err := msgs(rms).validate() + if err != nil { + t.Fatalf("%v: %v", m, err) + } + for _, s := range ss { + t.Log(s) + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/route.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/route.go new file mode 100644 index 0000000..081da0d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/route.go @@ -0,0 +1,123 @@ +// 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. + +// +build darwin dragonfly freebsd netbsd openbsd + +// Package route provides basic functions for the manipulation of +// packet routing facilities on BSD variants. +// +// The package supports any version of Darwin, any version of +// DragonFly BSD, FreeBSD 7 through 11, NetBSD 6 and above, and +// OpenBSD 5.6 and above. +package route + +import ( + "errors" + "os" + "syscall" +) + +var ( + errUnsupportedMessage = errors.New("unsupported message") + errMessageMismatch = errors.New("message mismatch") + errMessageTooShort = errors.New("message too short") + errInvalidMessage = errors.New("invalid message") + errInvalidAddr = errors.New("invalid address") + errShortBuffer = errors.New("short buffer") +) + +// A RouteMessage represents a message conveying an address prefix, a +// nexthop address and an output interface. +// +// Unlike other messages, this message can be used to query adjacency +// information for the given address prefix, to add a new route, and +// to delete or modify the existing route from the routing information +// base inside the kernel by writing and reading route messages on a +// routing socket. +// +// For the manipulation of routing information, the route message must +// contain appropriate fields that include: +// +// Version = +// Type = +// Flags = +// Index = +// ID = +// Seq = +// Addrs = +// +// The Type field specifies a type of manipulation, the Flags field +// specifies a class of target information and the Addrs field +// specifies target information like the following: +// +// route.RouteMessage{ +// Version: RTM_VERSION, +// Type: RTM_GET, +// Flags: RTF_UP | RTF_HOST, +// ID: uintptr(os.Getpid()), +// Seq: 1, +// Addrs: []route.Addrs{ +// RTAX_DST: &route.Inet4Addr{ ... }, +// RTAX_IFP: &route.LinkAddr{ ... }, +// RTAX_BRD: &route.Inet4Addr{ ... }, +// }, +// } +// +// The values for the above fields depend on the implementation of +// each operating system. +// +// The Err field on a response message contains an error value on the +// requested operation. If non-nil, the requested operation is failed. +type RouteMessage struct { + Version int // message version + Type int // message type + Flags int // route flags + Index int // interface index when atatched + ID uintptr // sender's identifier; usually process ID + Seq int // sequence number + Err error // error on requested operation + Addrs []Addr // addresses + + extOff int // offset of header extension + raw []byte // raw message +} + +// Marshal returns the binary encoding of m. +func (m *RouteMessage) Marshal() ([]byte, error) { + return m.marshal() +} + +// A RIBType reprensents a type of routing information base. +type RIBType int + +const ( + RIBTypeRoute RIBType = syscall.NET_RT_DUMP + RIBTypeInterface RIBType = syscall.NET_RT_IFLIST +) + +// FetchRIB fetches a routing information base from the operating +// system. +// +// The provided af must be an address family. +// +// The provided arg must be a RIBType-specific argument. +// When RIBType is related to routes, arg might be a set of route +// flags. When RIBType is related to network interfaces, arg might be +// an interface index or a set of interface flags. In most cases, zero +// means a wildcard. +func FetchRIB(af int, typ RIBType, arg int) ([]byte, error) { + mib := [6]int32{sysCTL_NET, sysAF_ROUTE, 0, int32(af), int32(typ), int32(arg)} + n := uintptr(0) + if err := sysctl(mib[:], nil, &n, nil, 0); err != nil { + return nil, os.NewSyscallError("sysctl", err) + } + if n == 0 { + return nil, nil + } + b := make([]byte, n) + if err := sysctl(mib[:], &b[0], &n, nil, 0); err != nil { + return nil, os.NewSyscallError("sysctl", err) + } + return b[:n], nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/route_classic.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/route_classic.go new file mode 100644 index 0000000..61b2bb4 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/route_classic.go @@ -0,0 +1,67 @@ +// 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. + +// +build darwin dragonfly freebsd netbsd + +package route + +import "syscall" + +func (m *RouteMessage) marshal() ([]byte, error) { + w, ok := wireFormats[m.Type] + if !ok { + return nil, errUnsupportedMessage + } + l := w.bodyOff + addrsSpace(m.Addrs) + b := make([]byte, l) + nativeEndian.PutUint16(b[:2], uint16(l)) + if m.Version == 0 { + b[2] = sysRTM_VERSION + } else { + b[2] = byte(m.Version) + } + b[3] = byte(m.Type) + nativeEndian.PutUint32(b[8:12], uint32(m.Flags)) + nativeEndian.PutUint16(b[4:6], uint16(m.Index)) + nativeEndian.PutUint32(b[16:20], uint32(m.ID)) + nativeEndian.PutUint32(b[20:24], uint32(m.Seq)) + attrs, err := marshalAddrs(b[w.bodyOff:], m.Addrs) + if err != nil { + return nil, err + } + if attrs > 0 { + nativeEndian.PutUint32(b[12:16], uint32(attrs)) + } + return b, nil +} + +func (w *wireFormat) parseRouteMessage(typ RIBType, b []byte) (Message, error) { + if len(b) < w.bodyOff { + return nil, errMessageTooShort + } + l := int(nativeEndian.Uint16(b[:2])) + if len(b) < l { + return nil, errInvalidMessage + } + m := &RouteMessage{ + Version: int(b[2]), + Type: int(b[3]), + Flags: int(nativeEndian.Uint32(b[8:12])), + Index: int(nativeEndian.Uint16(b[4:6])), + ID: uintptr(nativeEndian.Uint32(b[16:20])), + Seq: int(nativeEndian.Uint32(b[20:24])), + extOff: w.extOff, + raw: b[:l], + } + errno := syscall.Errno(nativeEndian.Uint32(b[28:32])) + if errno != 0 { + m.Err = errno + } + var err error + m.Addrs, err = parseAddrs(uint(nativeEndian.Uint32(b[12:16])), parseKernelInetAddr, b[w.bodyOff:]) + if err != nil { + return nil, err + } + return m, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/route_openbsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/route_openbsd.go new file mode 100644 index 0000000..daf2e90 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/route_openbsd.go @@ -0,0 +1,65 @@ +// 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 route + +import "syscall" + +func (m *RouteMessage) marshal() ([]byte, error) { + l := sizeofRtMsghdr + addrsSpace(m.Addrs) + b := make([]byte, l) + nativeEndian.PutUint16(b[:2], uint16(l)) + if m.Version == 0 { + b[2] = sysRTM_VERSION + } else { + b[2] = byte(m.Version) + } + b[3] = byte(m.Type) + nativeEndian.PutUint16(b[4:6], uint16(sizeofRtMsghdr)) + nativeEndian.PutUint32(b[16:20], uint32(m.Flags)) + nativeEndian.PutUint16(b[6:8], uint16(m.Index)) + nativeEndian.PutUint32(b[24:28], uint32(m.ID)) + nativeEndian.PutUint32(b[28:32], uint32(m.Seq)) + attrs, err := marshalAddrs(b[sizeofRtMsghdr:], m.Addrs) + if err != nil { + return nil, err + } + if attrs > 0 { + nativeEndian.PutUint32(b[12:16], uint32(attrs)) + } + return b, nil +} + +func (*wireFormat) parseRouteMessage(_ RIBType, b []byte) (Message, error) { + if len(b) < sizeofRtMsghdr { + return nil, errMessageTooShort + } + l := int(nativeEndian.Uint16(b[:2])) + if len(b) < l { + return nil, errInvalidMessage + } + m := &RouteMessage{ + Version: int(b[2]), + Type: int(b[3]), + Flags: int(nativeEndian.Uint32(b[16:20])), + Index: int(nativeEndian.Uint16(b[6:8])), + ID: uintptr(nativeEndian.Uint32(b[24:28])), + Seq: int(nativeEndian.Uint32(b[28:32])), + raw: b[:l], + } + ll := int(nativeEndian.Uint16(b[4:6])) + if len(b) < ll { + return nil, errInvalidMessage + } + errno := syscall.Errno(nativeEndian.Uint32(b[32:36])) + if errno != 0 { + m.Err = errno + } + as, err := parseAddrs(uint(nativeEndian.Uint32(b[12:16])), parseKernelInetAddr, b[ll:]) + if err != nil { + return nil, err + } + m.Addrs = as + return m, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/route_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/route_test.go new file mode 100644 index 0000000..61bd174 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/route_test.go @@ -0,0 +1,390 @@ +// 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. + +// +build darwin dragonfly freebsd netbsd openbsd + +package route + +import ( + "fmt" + "os/exec" + "runtime" + "time" +) + +func (m *RouteMessage) String() string { + return fmt.Sprintf("%s", addrAttrs(nativeEndian.Uint32(m.raw[12:16]))) +} + +func (m *InterfaceMessage) String() string { + var attrs addrAttrs + if runtime.GOOS == "openbsd" { + attrs = addrAttrs(nativeEndian.Uint32(m.raw[12:16])) + } else { + attrs = addrAttrs(nativeEndian.Uint32(m.raw[4:8])) + } + return fmt.Sprintf("%s", attrs) +} + +func (m *InterfaceAddrMessage) String() string { + var attrs addrAttrs + if runtime.GOOS == "openbsd" { + attrs = addrAttrs(nativeEndian.Uint32(m.raw[12:16])) + } else { + attrs = addrAttrs(nativeEndian.Uint32(m.raw[4:8])) + } + return fmt.Sprintf("%s", attrs) +} + +func (m *InterfaceMulticastAddrMessage) String() string { + return fmt.Sprintf("%s", addrAttrs(nativeEndian.Uint32(m.raw[4:8]))) +} + +func (m *InterfaceAnnounceMessage) String() string { + what := "" + switch m.What { + case 0: + what = "arrival" + case 1: + what = "departure" + } + return fmt.Sprintf("(%d %s %s)", m.Index, m.Name, what) +} + +func (m *InterfaceMetrics) String() string { + return fmt.Sprintf("(type=%d mtu=%d)", m.Type, m.MTU) +} + +func (m *RouteMetrics) String() string { + return fmt.Sprintf("(pmtu=%d)", m.PathMTU) +} + +type addrAttrs uint + +var addrAttrNames = [...]string{ + "dst", + "gateway", + "netmask", + "genmask", + "ifp", + "ifa", + "author", + "brd", + "df:mpls1-n:tag-o:src", // mpls1 for dragonfly, tag for netbsd, src for openbsd + "df:mpls2-o:srcmask", // mpls2 for dragonfly, srcmask for openbsd + "df:mpls3-o:label", // mpls3 for dragonfly, label for openbsd + "o:bfd", // bfd for openbsd + "o:dns", // dns for openbsd + "o:static", // static for openbsd + "o:search", // search for openbsd +} + +func (attrs addrAttrs) String() string { + var s string + for i, name := range addrAttrNames { + if attrs&(1<" + } + return s +} + +type msgs []Message + +func (ms msgs) validate() ([]string, error) { + var ss []string + for _, m := range ms { + switch m := m.(type) { + case *RouteMessage: + if err := addrs(m.Addrs).match(addrAttrs(nativeEndian.Uint32(m.raw[12:16]))); err != nil { + return nil, err + } + sys := m.Sys() + if sys == nil { + return nil, fmt.Errorf("no sys for %s", m.String()) + } + ss = append(ss, m.String()+" "+syss(sys).String()+" "+addrs(m.Addrs).String()) + case *InterfaceMessage: + var attrs addrAttrs + if runtime.GOOS == "openbsd" { + attrs = addrAttrs(nativeEndian.Uint32(m.raw[12:16])) + } else { + attrs = addrAttrs(nativeEndian.Uint32(m.raw[4:8])) + } + if err := addrs(m.Addrs).match(attrs); err != nil { + return nil, err + } + sys := m.Sys() + if sys == nil { + return nil, fmt.Errorf("no sys for %s", m.String()) + } + ss = append(ss, m.String()+" "+syss(sys).String()+" "+addrs(m.Addrs).String()) + case *InterfaceAddrMessage: + var attrs addrAttrs + if runtime.GOOS == "openbsd" { + attrs = addrAttrs(nativeEndian.Uint32(m.raw[12:16])) + } else { + attrs = addrAttrs(nativeEndian.Uint32(m.raw[4:8])) + } + if err := addrs(m.Addrs).match(attrs); err != nil { + return nil, err + } + ss = append(ss, m.String()+" "+addrs(m.Addrs).String()) + case *InterfaceMulticastAddrMessage: + if err := addrs(m.Addrs).match(addrAttrs(nativeEndian.Uint32(m.raw[4:8]))); err != nil { + return nil, err + } + ss = append(ss, m.String()+" "+addrs(m.Addrs).String()) + case *InterfaceAnnounceMessage: + ss = append(ss, m.String()) + default: + ss = append(ss, fmt.Sprintf("%+v", m)) + } + } + return ss, nil +} + +type syss []Sys + +func (sys syss) String() string { + var s string + for _, sy := range sys { + switch sy := sy.(type) { + case *InterfaceMetrics: + if len(s) > 0 { + s += " " + } + s += sy.String() + case *RouteMetrics: + if len(s) > 0 { + s += " " + } + s += sy.String() + } + } + return s +} + +type addrFamily int + +func (af addrFamily) String() string { + switch af { + case sysAF_UNSPEC: + return "unspec" + case sysAF_LINK: + return "link" + case sysAF_INET: + return "inet4" + case sysAF_INET6: + return "inet6" + default: + return fmt.Sprintf("%d", af) + } +} + +const hexDigit = "0123456789abcdef" + +type llAddr []byte + +func (a llAddr) String() string { + if len(a) == 0 { + return "" + } + buf := make([]byte, 0, len(a)*3-1) + for i, b := range a { + if i > 0 { + buf = append(buf, ':') + } + buf = append(buf, hexDigit[b>>4]) + buf = append(buf, hexDigit[b&0xF]) + } + return string(buf) +} + +type ipAddr []byte + +func (a ipAddr) String() string { + if len(a) == 0 { + return "" + } + if len(a) == 4 { + return fmt.Sprintf("%d.%d.%d.%d", a[0], a[1], a[2], a[3]) + } + if len(a) == 16 { + return fmt.Sprintf("%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x", a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]) + } + s := make([]byte, len(a)*2) + for i, tn := range a { + s[i*2], s[i*2+1] = hexDigit[tn>>4], hexDigit[tn&0xf] + } + return string(s) +} + +func (a *LinkAddr) String() string { + name := a.Name + if name == "" { + name = "" + } + lla := llAddr(a.Addr).String() + if lla == "" { + lla = "" + } + return fmt.Sprintf("(%v %d %s %s)", addrFamily(a.Family()), a.Index, name, lla) +} + +func (a *Inet4Addr) String() string { + return fmt.Sprintf("(%v %v)", addrFamily(a.Family()), ipAddr(a.IP[:])) +} + +func (a *Inet6Addr) String() string { + return fmt.Sprintf("(%v %v %d)", addrFamily(a.Family()), ipAddr(a.IP[:]), a.ZoneID) +} + +func (a *DefaultAddr) String() string { + return fmt.Sprintf("(%v %s)", addrFamily(a.Family()), ipAddr(a.Raw[2:]).String()) +} + +type addrs []Addr + +func (as addrs) String() string { + var s string + for _, a := range as { + if a == nil { + continue + } + if len(s) > 0 { + s += " " + } + switch a := a.(type) { + case *LinkAddr: + s += a.String() + case *Inet4Addr: + s += a.String() + case *Inet6Addr: + s += a.String() + case *DefaultAddr: + s += a.String() + } + } + if s == "" { + return "" + } + return s +} + +func (as addrs) match(attrs addrAttrs) error { + var ts addrAttrs + af := sysAF_UNSPEC + for i := range as { + if as[i] != nil { + ts |= 1 << uint(i) + } + switch as[i].(type) { + case *Inet4Addr: + if af == sysAF_UNSPEC { + af = sysAF_INET + } + if af != sysAF_INET { + return fmt.Errorf("got %v; want %v", addrs(as), addrFamily(af)) + } + case *Inet6Addr: + if af == sysAF_UNSPEC { + af = sysAF_INET6 + } + if af != sysAF_INET6 { + return fmt.Errorf("got %v; want %v", addrs(as), addrFamily(af)) + } + } + } + if ts != attrs && ts > attrs { + return fmt.Errorf("%v not included in %v", ts, attrs) + } + return nil +} + +func fetchAndParseRIB(af int, typ RIBType) ([]Message, error) { + var err error + var b []byte + for i := 0; i < 3; i++ { + if b, err = FetchRIB(af, typ, 0); err != nil { + time.Sleep(10 * time.Millisecond) + continue + } + break + } + if err != nil { + return nil, fmt.Errorf("%v %d %v", addrFamily(af), typ, err) + } + ms, err := ParseRIB(typ, b) + if err != nil { + return nil, fmt.Errorf("%v %d %v", addrFamily(af), typ, err) + } + return ms, nil +} + +// propVirtual is a proprietary virtual network interface. +type propVirtual struct { + name string + addr, mask string + setupCmds []*exec.Cmd + teardownCmds []*exec.Cmd +} + +func (pv *propVirtual) setup() error { + for _, cmd := range pv.setupCmds { + if err := cmd.Run(); err != nil { + pv.teardown() + return err + } + } + return nil +} + +func (pv *propVirtual) teardown() error { + for _, cmd := range pv.teardownCmds { + if err := cmd.Run(); err != nil { + return err + } + } + return nil +} + +func (pv *propVirtual) configure(suffix int) error { + if runtime.GOOS == "openbsd" { + pv.name = fmt.Sprintf("vether%d", suffix) + } else { + pv.name = fmt.Sprintf("vlan%d", suffix) + } + xname, err := exec.LookPath("ifconfig") + if err != nil { + return err + } + pv.setupCmds = append(pv.setupCmds, &exec.Cmd{ + Path: xname, + Args: []string{"ifconfig", pv.name, "create"}, + }) + if runtime.GOOS == "netbsd" { + // NetBSD requires an underlying dot1Q-capable network + // interface. + pv.setupCmds = append(pv.setupCmds, &exec.Cmd{ + Path: xname, + Args: []string{"ifconfig", pv.name, "vlan", fmt.Sprintf("%d", suffix&0xfff), "vlanif", "wm0"}, + }) + } + pv.setupCmds = append(pv.setupCmds, &exec.Cmd{ + Path: xname, + Args: []string{"ifconfig", pv.name, "inet", pv.addr, "netmask", pv.mask}, + }) + pv.teardownCmds = append(pv.teardownCmds, &exec.Cmd{ + Path: xname, + Args: []string{"ifconfig", pv.name, "destroy"}, + }) + return nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/sys.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/sys.go new file mode 100644 index 0000000..3d0ee9b --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/sys.go @@ -0,0 +1,39 @@ +// 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. + +// +build darwin dragonfly freebsd netbsd openbsd + +package route + +import "unsafe" + +var ( + nativeEndian binaryByteOrder + kernelAlign int + wireFormats map[int]*wireFormat +) + +func init() { + i := uint32(1) + b := (*[4]byte)(unsafe.Pointer(&i)) + if b[0] == 1 { + nativeEndian = littleEndian + } else { + nativeEndian = bigEndian + } + kernelAlign, wireFormats = probeRoutingStack() +} + +func roundup(l int) int { + if l == 0 { + return kernelAlign + } + return (l + kernelAlign - 1) & ^(kernelAlign - 1) +} + +type wireFormat struct { + extOff int // offset of header extension + bodyOff int // offset of message body + parse func(RIBType, []byte) (Message, error) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/sys_darwin.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/sys_darwin.go new file mode 100644 index 0000000..d2daf5c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/sys_darwin.go @@ -0,0 +1,87 @@ +// 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 route + +func (typ RIBType) parseable() bool { + switch typ { + case sysNET_RT_STAT, sysNET_RT_TRASH: + return false + default: + return true + } +} + +// RouteMetrics represents route metrics. +type RouteMetrics struct { + PathMTU int // path maximum transmission unit +} + +// SysType implements the SysType method of Sys interface. +func (rmx *RouteMetrics) SysType() SysType { return SysMetrics } + +// Sys implements the Sys method of Message interface. +func (m *RouteMessage) Sys() []Sys { + return []Sys{ + &RouteMetrics{ + PathMTU: int(nativeEndian.Uint32(m.raw[m.extOff+4 : m.extOff+8])), + }, + } +} + +// InterfaceMetrics represents interface metrics. +type InterfaceMetrics struct { + Type int // interface type + MTU int // maximum transmission unit +} + +// SysType implements the SysType method of Sys interface. +func (imx *InterfaceMetrics) SysType() SysType { return SysMetrics } + +// Sys implements the Sys method of Message interface. +func (m *InterfaceMessage) Sys() []Sys { + return []Sys{ + &InterfaceMetrics{ + Type: int(m.raw[m.extOff]), + MTU: int(nativeEndian.Uint32(m.raw[m.extOff+8 : m.extOff+12])), + }, + } +} + +func probeRoutingStack() (int, map[int]*wireFormat) { + rtm := &wireFormat{extOff: 36, bodyOff: sizeofRtMsghdrDarwin15} + rtm.parse = rtm.parseRouteMessage + rtm2 := &wireFormat{extOff: 36, bodyOff: sizeofRtMsghdr2Darwin15} + rtm2.parse = rtm2.parseRouteMessage + ifm := &wireFormat{extOff: 16, bodyOff: sizeofIfMsghdrDarwin15} + ifm.parse = ifm.parseInterfaceMessage + ifm2 := &wireFormat{extOff: 32, bodyOff: sizeofIfMsghdr2Darwin15} + ifm2.parse = ifm2.parseInterfaceMessage + ifam := &wireFormat{extOff: sizeofIfaMsghdrDarwin15, bodyOff: sizeofIfaMsghdrDarwin15} + ifam.parse = ifam.parseInterfaceAddrMessage + ifmam := &wireFormat{extOff: sizeofIfmaMsghdrDarwin15, bodyOff: sizeofIfmaMsghdrDarwin15} + ifmam.parse = ifmam.parseInterfaceMulticastAddrMessage + ifmam2 := &wireFormat{extOff: sizeofIfmaMsghdr2Darwin15, bodyOff: sizeofIfmaMsghdr2Darwin15} + ifmam2.parse = ifmam2.parseInterfaceMulticastAddrMessage + // Darwin kernels require 32-bit aligned access to routing facilities. + return 4, map[int]*wireFormat{ + sysRTM_ADD: rtm, + sysRTM_DELETE: rtm, + sysRTM_CHANGE: rtm, + sysRTM_GET: rtm, + sysRTM_LOSING: rtm, + sysRTM_REDIRECT: rtm, + sysRTM_MISS: rtm, + sysRTM_LOCK: rtm, + sysRTM_RESOLVE: rtm, + sysRTM_NEWADDR: ifam, + sysRTM_DELADDR: ifam, + sysRTM_IFINFO: ifm, + sysRTM_NEWMADDR: ifmam, + sysRTM_DELMADDR: ifmam, + sysRTM_IFINFO2: ifm2, + sysRTM_NEWMADDR2: ifmam2, + sysRTM_GET2: rtm2, + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/sys_dragonfly.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/sys_dragonfly.go new file mode 100644 index 0000000..0c14bc2 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/sys_dragonfly.go @@ -0,0 +1,76 @@ +// 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 route + +import "unsafe" + +func (typ RIBType) parseable() bool { return true } + +// RouteMetrics represents route metrics. +type RouteMetrics struct { + PathMTU int // path maximum transmission unit +} + +// SysType implements the SysType method of Sys interface. +func (rmx *RouteMetrics) SysType() SysType { return SysMetrics } + +// Sys implements the Sys method of Message interface. +func (m *RouteMessage) Sys() []Sys { + return []Sys{ + &RouteMetrics{ + PathMTU: int(nativeEndian.Uint64(m.raw[m.extOff+8 : m.extOff+16])), + }, + } +} + +// InterfaceMetrics represents interface metrics. +type InterfaceMetrics struct { + Type int // interface type + MTU int // maximum transmission unit +} + +// SysType implements the SysType method of Sys interface. +func (imx *InterfaceMetrics) SysType() SysType { return SysMetrics } + +// Sys implements the Sys method of Message interface. +func (m *InterfaceMessage) Sys() []Sys { + return []Sys{ + &InterfaceMetrics{ + Type: int(m.raw[m.extOff]), + MTU: int(nativeEndian.Uint32(m.raw[m.extOff+8 : m.extOff+12])), + }, + } +} + +func probeRoutingStack() (int, map[int]*wireFormat) { + var p uintptr + rtm := &wireFormat{extOff: 40, bodyOff: sizeofRtMsghdrDragonFlyBSD4} + rtm.parse = rtm.parseRouteMessage + ifm := &wireFormat{extOff: 16, bodyOff: sizeofIfMsghdrDragonFlyBSD4} + ifm.parse = ifm.parseInterfaceMessage + ifam := &wireFormat{extOff: sizeofIfaMsghdrDragonFlyBSD4, bodyOff: sizeofIfaMsghdrDragonFlyBSD4} + ifam.parse = ifam.parseInterfaceAddrMessage + ifmam := &wireFormat{extOff: sizeofIfmaMsghdrDragonFlyBSD4, bodyOff: sizeofIfmaMsghdrDragonFlyBSD4} + ifmam.parse = ifmam.parseInterfaceMulticastAddrMessage + ifanm := &wireFormat{extOff: sizeofIfAnnouncemsghdrDragonFlyBSD4, bodyOff: sizeofIfAnnouncemsghdrDragonFlyBSD4} + ifanm.parse = ifanm.parseInterfaceAnnounceMessage + return int(unsafe.Sizeof(p)), map[int]*wireFormat{ + sysRTM_ADD: rtm, + sysRTM_DELETE: rtm, + sysRTM_CHANGE: rtm, + sysRTM_GET: rtm, + sysRTM_LOSING: rtm, + sysRTM_REDIRECT: rtm, + sysRTM_MISS: rtm, + sysRTM_LOCK: rtm, + sysRTM_RESOLVE: rtm, + sysRTM_NEWADDR: ifam, + sysRTM_DELADDR: ifam, + sysRTM_IFINFO: ifm, + sysRTM_NEWMADDR: ifmam, + sysRTM_DELMADDR: ifmam, + sysRTM_IFANNOUNCE: ifanm, + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/sys_freebsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/sys_freebsd.go new file mode 100644 index 0000000..89ba1c4 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/sys_freebsd.go @@ -0,0 +1,155 @@ +// 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 route + +import ( + "syscall" + "unsafe" +) + +func (typ RIBType) parseable() bool { return true } + +// RouteMetrics represents route metrics. +type RouteMetrics struct { + PathMTU int // path maximum transmission unit +} + +// SysType implements the SysType method of Sys interface. +func (rmx *RouteMetrics) SysType() SysType { return SysMetrics } + +// Sys implements the Sys method of Message interface. +func (m *RouteMessage) Sys() []Sys { + if kernelAlign == 8 { + return []Sys{ + &RouteMetrics{ + PathMTU: int(nativeEndian.Uint64(m.raw[m.extOff+8 : m.extOff+16])), + }, + } + } + return []Sys{ + &RouteMetrics{ + PathMTU: int(nativeEndian.Uint32(m.raw[m.extOff+4 : m.extOff+8])), + }, + } +} + +// InterfaceMetrics represents interface metrics. +type InterfaceMetrics struct { + Type int // interface type + MTU int // maximum transmission unit +} + +// SysType implements the SysType method of Sys interface. +func (imx *InterfaceMetrics) SysType() SysType { return SysMetrics } + +// Sys implements the Sys method of Message interface. +func (m *InterfaceMessage) Sys() []Sys { + return []Sys{ + &InterfaceMetrics{ + Type: int(m.raw[m.extOff]), + MTU: int(nativeEndian.Uint32(m.raw[m.extOff+8 : m.extOff+12])), + }, + } +} + +func probeRoutingStack() (int, map[int]*wireFormat) { + var p uintptr + wordSize := int(unsafe.Sizeof(p)) + align := int(unsafe.Sizeof(p)) + // In the case of kern.supported_archs="amd64 i386", we need + // to know the underlying kernel's architecture because the + // alignment for routing facilities are set at the build time + // of the kernel. + conf, _ := syscall.Sysctl("kern.conftxt") + for i, j := 0, 0; j < len(conf); j++ { + if conf[j] != '\n' { + continue + } + s := conf[i:j] + i = j + 1 + if len(s) > len("machine") && s[:len("machine")] == "machine" { + s = s[len("machine"):] + for k := 0; k < len(s); k++ { + if s[k] == ' ' || s[k] == '\t' { + s = s[1:] + } + break + } + if s == "amd64" { + align = 8 + } + break + } + } + var rtm, ifm, ifam, ifmam, ifanm *wireFormat + if align != wordSize { // 386 emulation on amd64 + rtm = &wireFormat{extOff: sizeofRtMsghdrFreeBSD10Emu - sizeofRtMetricsFreeBSD10Emu, bodyOff: sizeofRtMsghdrFreeBSD10Emu} + ifm = &wireFormat{extOff: 16} + ifam = &wireFormat{extOff: sizeofIfaMsghdrFreeBSD10Emu, bodyOff: sizeofIfaMsghdrFreeBSD10Emu} + ifmam = &wireFormat{extOff: sizeofIfmaMsghdrFreeBSD10Emu, bodyOff: sizeofIfmaMsghdrFreeBSD10Emu} + ifanm = &wireFormat{extOff: sizeofIfAnnouncemsghdrFreeBSD10Emu, bodyOff: sizeofIfAnnouncemsghdrFreeBSD10Emu} + } else { + rtm = &wireFormat{extOff: sizeofRtMsghdrFreeBSD10 - sizeofRtMetricsFreeBSD10, bodyOff: sizeofRtMsghdrFreeBSD10} + ifm = &wireFormat{extOff: 16} + ifam = &wireFormat{extOff: sizeofIfaMsghdrFreeBSD10, bodyOff: sizeofIfaMsghdrFreeBSD10} + ifmam = &wireFormat{extOff: sizeofIfmaMsghdrFreeBSD10, bodyOff: sizeofIfmaMsghdrFreeBSD10} + ifanm = &wireFormat{extOff: sizeofIfAnnouncemsghdrFreeBSD10, bodyOff: sizeofIfAnnouncemsghdrFreeBSD10} + } + rel, _ := syscall.SysctlUint32("kern.osreldate") + switch { + case rel < 800000: + if align != wordSize { // 386 emulation on amd64 + ifm.bodyOff = sizeofIfMsghdrFreeBSD7Emu + } else { + ifm.bodyOff = sizeofIfMsghdrFreeBSD7 + } + case 800000 <= rel && rel < 900000: + if align != wordSize { // 386 emulation on amd64 + ifm.bodyOff = sizeofIfMsghdrFreeBSD8Emu + } else { + ifm.bodyOff = sizeofIfMsghdrFreeBSD8 + } + case 900000 <= rel && rel < 1000000: + if align != wordSize { // 386 emulation on amd64 + ifm.bodyOff = sizeofIfMsghdrFreeBSD9Emu + } else { + ifm.bodyOff = sizeofIfMsghdrFreeBSD9 + } + case 1000000 <= rel && rel < 1100000: + if align != wordSize { // 386 emulation on amd64 + ifm.bodyOff = sizeofIfMsghdrFreeBSD10Emu + } else { + ifm.bodyOff = sizeofIfMsghdrFreeBSD10 + } + default: + if align != wordSize { // 386 emulation on amd64 + ifm.bodyOff = sizeofIfMsghdrFreeBSD11Emu + } else { + ifm.bodyOff = sizeofIfMsghdrFreeBSD11 + } + } + rtm.parse = rtm.parseRouteMessage + ifm.parse = ifm.parseInterfaceMessage + ifam.parse = ifam.parseInterfaceAddrMessage + ifmam.parse = ifmam.parseInterfaceMulticastAddrMessage + ifanm.parse = ifanm.parseInterfaceAnnounceMessage + return align, map[int]*wireFormat{ + sysRTM_ADD: rtm, + sysRTM_DELETE: rtm, + sysRTM_CHANGE: rtm, + sysRTM_GET: rtm, + sysRTM_LOSING: rtm, + sysRTM_REDIRECT: rtm, + sysRTM_MISS: rtm, + sysRTM_LOCK: rtm, + sysRTM_RESOLVE: rtm, + sysRTM_NEWADDR: ifam, + sysRTM_DELADDR: ifam, + sysRTM_IFINFO: ifm, + sysRTM_NEWMADDR: ifmam, + sysRTM_DELMADDR: ifmam, + sysRTM_IFANNOUNCE: ifanm, + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/sys_netbsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/sys_netbsd.go new file mode 100644 index 0000000..02f71d5 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/sys_netbsd.go @@ -0,0 +1,71 @@ +// 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 route + +func (typ RIBType) parseable() bool { return true } + +// RouteMetrics represents route metrics. +type RouteMetrics struct { + PathMTU int // path maximum transmission unit +} + +// SysType implements the SysType method of Sys interface. +func (rmx *RouteMetrics) SysType() SysType { return SysMetrics } + +// Sys implements the Sys method of Message interface. +func (m *RouteMessage) Sys() []Sys { + return []Sys{ + &RouteMetrics{ + PathMTU: int(nativeEndian.Uint64(m.raw[m.extOff+8 : m.extOff+16])), + }, + } +} + +// RouteMetrics represents route metrics. +type InterfaceMetrics struct { + Type int // interface type + MTU int // maximum transmission unit +} + +// SysType implements the SysType method of Sys interface. +func (imx *InterfaceMetrics) SysType() SysType { return SysMetrics } + +// Sys implements the Sys method of Message interface. +func (m *InterfaceMessage) Sys() []Sys { + return []Sys{ + &InterfaceMetrics{ + Type: int(m.raw[m.extOff]), + MTU: int(nativeEndian.Uint32(m.raw[m.extOff+8 : m.extOff+12])), + }, + } +} + +func probeRoutingStack() (int, map[int]*wireFormat) { + rtm := &wireFormat{extOff: 40, bodyOff: sizeofRtMsghdrNetBSD7} + rtm.parse = rtm.parseRouteMessage + ifm := &wireFormat{extOff: 16, bodyOff: sizeofIfMsghdrNetBSD7} + ifm.parse = ifm.parseInterfaceMessage + ifam := &wireFormat{extOff: sizeofIfaMsghdrNetBSD7, bodyOff: sizeofIfaMsghdrNetBSD7} + ifam.parse = ifam.parseInterfaceAddrMessage + ifanm := &wireFormat{extOff: sizeofIfAnnouncemsghdrNetBSD7, bodyOff: sizeofIfAnnouncemsghdrNetBSD7} + ifanm.parse = ifanm.parseInterfaceAnnounceMessage + // NetBSD 6 and above kernels require 64-bit aligned access to + // routing facilities. + return 8, map[int]*wireFormat{ + sysRTM_ADD: rtm, + sysRTM_DELETE: rtm, + sysRTM_CHANGE: rtm, + sysRTM_GET: rtm, + sysRTM_LOSING: rtm, + sysRTM_REDIRECT: rtm, + sysRTM_MISS: rtm, + sysRTM_LOCK: rtm, + sysRTM_RESOLVE: rtm, + sysRTM_NEWADDR: ifam, + sysRTM_DELADDR: ifam, + sysRTM_IFANNOUNCE: ifanm, + sysRTM_IFINFO: ifm, + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/sys_openbsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/sys_openbsd.go new file mode 100644 index 0000000..c5674e8 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/sys_openbsd.go @@ -0,0 +1,80 @@ +// 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 route + +import "unsafe" + +func (typ RIBType) parseable() bool { + switch typ { + case sysNET_RT_STATS, sysNET_RT_TABLE: + return false + default: + return true + } +} + +// RouteMetrics represents route metrics. +type RouteMetrics struct { + PathMTU int // path maximum transmission unit +} + +// SysType implements the SysType method of Sys interface. +func (rmx *RouteMetrics) SysType() SysType { return SysMetrics } + +// Sys implements the Sys method of Message interface. +func (m *RouteMessage) Sys() []Sys { + return []Sys{ + &RouteMetrics{ + PathMTU: int(nativeEndian.Uint32(m.raw[60:64])), + }, + } +} + +// InterfaceMetrics represents interface metrics. +type InterfaceMetrics struct { + Type int // interface type + MTU int // maximum transmission unit +} + +// SysType implements the SysType method of Sys interface. +func (imx *InterfaceMetrics) SysType() SysType { return SysMetrics } + +// Sys implements the Sys method of Message interface. +func (m *InterfaceMessage) Sys() []Sys { + return []Sys{ + &InterfaceMetrics{ + Type: int(m.raw[24]), + MTU: int(nativeEndian.Uint32(m.raw[28:32])), + }, + } +} + +func probeRoutingStack() (int, map[int]*wireFormat) { + var p uintptr + rtm := &wireFormat{extOff: -1, bodyOff: -1} + rtm.parse = rtm.parseRouteMessage + ifm := &wireFormat{extOff: -1, bodyOff: -1} + ifm.parse = ifm.parseInterfaceMessage + ifam := &wireFormat{extOff: -1, bodyOff: -1} + ifam.parse = ifam.parseInterfaceAddrMessage + ifanm := &wireFormat{extOff: -1, bodyOff: -1} + ifanm.parse = ifanm.parseInterfaceAnnounceMessage + return int(unsafe.Sizeof(p)), map[int]*wireFormat{ + sysRTM_ADD: rtm, + sysRTM_DELETE: rtm, + sysRTM_CHANGE: rtm, + sysRTM_GET: rtm, + sysRTM_LOSING: rtm, + sysRTM_REDIRECT: rtm, + sysRTM_MISS: rtm, + sysRTM_LOCK: rtm, + sysRTM_RESOLVE: rtm, + sysRTM_NEWADDR: ifam, + sysRTM_DELADDR: ifam, + sysRTM_IFINFO: ifm, + sysRTM_IFANNOUNCE: ifanm, + sysRTM_DESYNC: rtm, + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/syscall.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/syscall.go new file mode 100644 index 0000000..c211188 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/syscall.go @@ -0,0 +1,28 @@ +// 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. + +// +build darwin dragonfly freebsd netbsd openbsd + +package route + +import ( + "syscall" + "unsafe" +) + +var zero uintptr + +func sysctl(mib []int32, old *byte, oldlen *uintptr, new *byte, newlen uintptr) error { + var p unsafe.Pointer + if len(mib) > 0 { + p = unsafe.Pointer(&mib[0]) + } else { + p = unsafe.Pointer(&zero) + } + _, _, errno := syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(p), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if errno != 0 { + return error(errno) + } + return nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/zsys_darwin.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/zsys_darwin.go new file mode 100644 index 0000000..4e2e1ab --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/zsys_darwin.go @@ -0,0 +1,99 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_darwin.go + +package route + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_ROUTE = 0x11 + sysAF_LINK = 0x12 + sysAF_INET6 = 0x1e + + sysSOCK_RAW = 0x3 + + sysNET_RT_DUMP = 0x1 + sysNET_RT_FLAGS = 0x2 + sysNET_RT_IFLIST = 0x3 + sysNET_RT_STAT = 0x4 + sysNET_RT_TRASH = 0x5 + sysNET_RT_IFLIST2 = 0x6 + sysNET_RT_DUMP2 = 0x7 + sysNET_RT_MAXID = 0xa +) + +const ( + sysCTL_MAXNAME = 0xc + + sysCTL_UNSPEC = 0x0 + sysCTL_KERN = 0x1 + sysCTL_VM = 0x2 + sysCTL_VFS = 0x3 + sysCTL_NET = 0x4 + sysCTL_DEBUG = 0x5 + sysCTL_HW = 0x6 + sysCTL_MACHDEP = 0x7 + sysCTL_USER = 0x8 + sysCTL_MAXID = 0x9 +) + +const ( + sysRTM_VERSION = 0x5 + + sysRTM_ADD = 0x1 + sysRTM_DELETE = 0x2 + sysRTM_CHANGE = 0x3 + sysRTM_GET = 0x4 + sysRTM_LOSING = 0x5 + sysRTM_REDIRECT = 0x6 + sysRTM_MISS = 0x7 + sysRTM_LOCK = 0x8 + sysRTM_OLDADD = 0x9 + sysRTM_OLDDEL = 0xa + sysRTM_RESOLVE = 0xb + sysRTM_NEWADDR = 0xc + sysRTM_DELADDR = 0xd + sysRTM_IFINFO = 0xe + sysRTM_NEWMADDR = 0xf + sysRTM_DELMADDR = 0x10 + sysRTM_IFINFO2 = 0x12 + sysRTM_NEWMADDR2 = 0x13 + sysRTM_GET2 = 0x14 + + sysRTA_DST = 0x1 + sysRTA_GATEWAY = 0x2 + sysRTA_NETMASK = 0x4 + sysRTA_GENMASK = 0x8 + sysRTA_IFP = 0x10 + sysRTA_IFA = 0x20 + sysRTA_AUTHOR = 0x40 + sysRTA_BRD = 0x80 + + sysRTAX_DST = 0x0 + sysRTAX_GATEWAY = 0x1 + sysRTAX_NETMASK = 0x2 + sysRTAX_GENMASK = 0x3 + sysRTAX_IFP = 0x4 + sysRTAX_IFA = 0x5 + sysRTAX_AUTHOR = 0x6 + sysRTAX_BRD = 0x7 + sysRTAX_MAX = 0x8 +) + +const ( + sizeofIfMsghdrDarwin15 = 0x70 + sizeofIfaMsghdrDarwin15 = 0x14 + sizeofIfmaMsghdrDarwin15 = 0x10 + sizeofIfMsghdr2Darwin15 = 0xa0 + sizeofIfmaMsghdr2Darwin15 = 0x14 + sizeofIfDataDarwin15 = 0x60 + sizeofIfData64Darwin15 = 0x80 + + sizeofRtMsghdrDarwin15 = 0x5c + sizeofRtMsghdr2Darwin15 = 0x5c + sizeofRtMetricsDarwin15 = 0x38 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/zsys_dragonfly.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/zsys_dragonfly.go new file mode 100644 index 0000000..719c88d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/zsys_dragonfly.go @@ -0,0 +1,98 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_dragonfly.go + +package route + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_ROUTE = 0x11 + sysAF_LINK = 0x12 + sysAF_INET6 = 0x1c + + sysSOCK_RAW = 0x3 + + sysNET_RT_DUMP = 0x1 + sysNET_RT_FLAGS = 0x2 + sysNET_RT_IFLIST = 0x3 + sysNET_RT_MAXID = 0x4 +) + +const ( + sysCTL_MAXNAME = 0xc + + sysCTL_UNSPEC = 0x0 + sysCTL_KERN = 0x1 + sysCTL_VM = 0x2 + sysCTL_VFS = 0x3 + sysCTL_NET = 0x4 + sysCTL_DEBUG = 0x5 + sysCTL_HW = 0x6 + sysCTL_MACHDEP = 0x7 + sysCTL_USER = 0x8 + sysCTL_P1003_1B = 0x9 + sysCTL_LWKT = 0xa + sysCTL_MAXID = 0xb +) + +const ( + sysRTM_VERSION = 0x6 + + sysRTM_ADD = 0x1 + sysRTM_DELETE = 0x2 + sysRTM_CHANGE = 0x3 + sysRTM_GET = 0x4 + sysRTM_LOSING = 0x5 + sysRTM_REDIRECT = 0x6 + sysRTM_MISS = 0x7 + sysRTM_LOCK = 0x8 + sysRTM_OLDADD = 0x9 + sysRTM_OLDDEL = 0xa + sysRTM_RESOLVE = 0xb + sysRTM_NEWADDR = 0xc + sysRTM_DELADDR = 0xd + sysRTM_IFINFO = 0xe + sysRTM_NEWMADDR = 0xf + sysRTM_DELMADDR = 0x10 + sysRTM_IFANNOUNCE = 0x11 + sysRTM_IEEE80211 = 0x12 + + sysRTA_DST = 0x1 + sysRTA_GATEWAY = 0x2 + sysRTA_NETMASK = 0x4 + sysRTA_GENMASK = 0x8 + sysRTA_IFP = 0x10 + sysRTA_IFA = 0x20 + sysRTA_AUTHOR = 0x40 + sysRTA_BRD = 0x80 + sysRTA_MPLS1 = 0x100 + sysRTA_MPLS2 = 0x200 + sysRTA_MPLS3 = 0x400 + + sysRTAX_DST = 0x0 + sysRTAX_GATEWAY = 0x1 + sysRTAX_NETMASK = 0x2 + sysRTAX_GENMASK = 0x3 + sysRTAX_IFP = 0x4 + sysRTAX_IFA = 0x5 + sysRTAX_AUTHOR = 0x6 + sysRTAX_BRD = 0x7 + sysRTAX_MPLS1 = 0x8 + sysRTAX_MPLS2 = 0x9 + sysRTAX_MPLS3 = 0xa + sysRTAX_MAX = 0xb +) + +const ( + sizeofIfMsghdrDragonFlyBSD4 = 0xb0 + sizeofIfaMsghdrDragonFlyBSD4 = 0x14 + sizeofIfmaMsghdrDragonFlyBSD4 = 0x10 + sizeofIfAnnouncemsghdrDragonFlyBSD4 = 0x18 + + sizeofRtMsghdrDragonFlyBSD4 = 0x98 + sizeofRtMetricsDragonFlyBSD4 = 0x70 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/zsys_freebsd_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/zsys_freebsd_386.go new file mode 100644 index 0000000..b03bc01 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/zsys_freebsd_386.go @@ -0,0 +1,126 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_freebsd.go + +package route + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_ROUTE = 0x11 + sysAF_LINK = 0x12 + sysAF_INET6 = 0x1c + + sysSOCK_RAW = 0x3 + + sysNET_RT_DUMP = 0x1 + sysNET_RT_FLAGS = 0x2 + sysNET_RT_IFLIST = 0x3 + sysNET_RT_IFMALIST = 0x4 + sysNET_RT_IFLISTL = 0x5 +) + +const ( + sysCTL_MAXNAME = 0x18 + + sysCTL_UNSPEC = 0x0 + sysCTL_KERN = 0x1 + sysCTL_VM = 0x2 + sysCTL_VFS = 0x3 + sysCTL_NET = 0x4 + sysCTL_DEBUG = 0x5 + sysCTL_HW = 0x6 + sysCTL_MACHDEP = 0x7 + sysCTL_USER = 0x8 + sysCTL_P1003_1B = 0x9 +) + +const ( + sysRTM_VERSION = 0x5 + + sysRTM_ADD = 0x1 + sysRTM_DELETE = 0x2 + sysRTM_CHANGE = 0x3 + sysRTM_GET = 0x4 + sysRTM_LOSING = 0x5 + sysRTM_REDIRECT = 0x6 + sysRTM_MISS = 0x7 + sysRTM_LOCK = 0x8 + sysRTM_RESOLVE = 0xb + sysRTM_NEWADDR = 0xc + sysRTM_DELADDR = 0xd + sysRTM_IFINFO = 0xe + sysRTM_NEWMADDR = 0xf + sysRTM_DELMADDR = 0x10 + sysRTM_IFANNOUNCE = 0x11 + sysRTM_IEEE80211 = 0x12 + + sysRTA_DST = 0x1 + sysRTA_GATEWAY = 0x2 + sysRTA_NETMASK = 0x4 + sysRTA_GENMASK = 0x8 + sysRTA_IFP = 0x10 + sysRTA_IFA = 0x20 + sysRTA_AUTHOR = 0x40 + sysRTA_BRD = 0x80 + + sysRTAX_DST = 0x0 + sysRTAX_GATEWAY = 0x1 + sysRTAX_NETMASK = 0x2 + sysRTAX_GENMASK = 0x3 + sysRTAX_IFP = 0x4 + sysRTAX_IFA = 0x5 + sysRTAX_AUTHOR = 0x6 + sysRTAX_BRD = 0x7 + sysRTAX_MAX = 0x8 +) + +const ( + sizeofIfMsghdrlFreeBSD10 = 0x68 + sizeofIfaMsghdrFreeBSD10 = 0x14 + sizeofIfaMsghdrlFreeBSD10 = 0x6c + sizeofIfmaMsghdrFreeBSD10 = 0x10 + sizeofIfAnnouncemsghdrFreeBSD10 = 0x18 + + sizeofRtMsghdrFreeBSD10 = 0x5c + sizeofRtMetricsFreeBSD10 = 0x38 + + sizeofIfMsghdrFreeBSD7 = 0x60 + sizeofIfMsghdrFreeBSD8 = 0x60 + sizeofIfMsghdrFreeBSD9 = 0x60 + sizeofIfMsghdrFreeBSD10 = 0x64 + sizeofIfMsghdrFreeBSD11 = 0xa8 + + sizeofIfDataFreeBSD7 = 0x50 + sizeofIfDataFreeBSD8 = 0x50 + sizeofIfDataFreeBSD9 = 0x50 + sizeofIfDataFreeBSD10 = 0x54 + sizeofIfDataFreeBSD11 = 0x98 + + // MODIFIED BY HAND FOR 386 EMULATION ON AMD64 + // 386 EMULATION USES THE UNDERLYING RAW DATA LAYOUT + + sizeofIfMsghdrlFreeBSD10Emu = 0xb0 + sizeofIfaMsghdrFreeBSD10Emu = 0x14 + sizeofIfaMsghdrlFreeBSD10Emu = 0xb0 + sizeofIfmaMsghdrFreeBSD10Emu = 0x10 + sizeofIfAnnouncemsghdrFreeBSD10Emu = 0x18 + + sizeofRtMsghdrFreeBSD10Emu = 0x98 + sizeofRtMetricsFreeBSD10Emu = 0x70 + + sizeofIfMsghdrFreeBSD7Emu = 0xa8 + sizeofIfMsghdrFreeBSD8Emu = 0xa8 + sizeofIfMsghdrFreeBSD9Emu = 0xa8 + sizeofIfMsghdrFreeBSD10Emu = 0xa8 + sizeofIfMsghdrFreeBSD11Emu = 0xa8 + + sizeofIfDataFreeBSD7Emu = 0x98 + sizeofIfDataFreeBSD8Emu = 0x98 + sizeofIfDataFreeBSD9Emu = 0x98 + sizeofIfDataFreeBSD10Emu = 0x98 + sizeofIfDataFreeBSD11Emu = 0x98 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/zsys_freebsd_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/zsys_freebsd_amd64.go new file mode 100644 index 0000000..0b675b3 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/zsys_freebsd_amd64.go @@ -0,0 +1,123 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_freebsd.go + +package route + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_ROUTE = 0x11 + sysAF_LINK = 0x12 + sysAF_INET6 = 0x1c + + sysSOCK_RAW = 0x3 + + sysNET_RT_DUMP = 0x1 + sysNET_RT_FLAGS = 0x2 + sysNET_RT_IFLIST = 0x3 + sysNET_RT_IFMALIST = 0x4 + sysNET_RT_IFLISTL = 0x5 +) + +const ( + sysCTL_MAXNAME = 0x18 + + sysCTL_UNSPEC = 0x0 + sysCTL_KERN = 0x1 + sysCTL_VM = 0x2 + sysCTL_VFS = 0x3 + sysCTL_NET = 0x4 + sysCTL_DEBUG = 0x5 + sysCTL_HW = 0x6 + sysCTL_MACHDEP = 0x7 + sysCTL_USER = 0x8 + sysCTL_P1003_1B = 0x9 +) + +const ( + sysRTM_VERSION = 0x5 + + sysRTM_ADD = 0x1 + sysRTM_DELETE = 0x2 + sysRTM_CHANGE = 0x3 + sysRTM_GET = 0x4 + sysRTM_LOSING = 0x5 + sysRTM_REDIRECT = 0x6 + sysRTM_MISS = 0x7 + sysRTM_LOCK = 0x8 + sysRTM_RESOLVE = 0xb + sysRTM_NEWADDR = 0xc + sysRTM_DELADDR = 0xd + sysRTM_IFINFO = 0xe + sysRTM_NEWMADDR = 0xf + sysRTM_DELMADDR = 0x10 + sysRTM_IFANNOUNCE = 0x11 + sysRTM_IEEE80211 = 0x12 + + sysRTA_DST = 0x1 + sysRTA_GATEWAY = 0x2 + sysRTA_NETMASK = 0x4 + sysRTA_GENMASK = 0x8 + sysRTA_IFP = 0x10 + sysRTA_IFA = 0x20 + sysRTA_AUTHOR = 0x40 + sysRTA_BRD = 0x80 + + sysRTAX_DST = 0x0 + sysRTAX_GATEWAY = 0x1 + sysRTAX_NETMASK = 0x2 + sysRTAX_GENMASK = 0x3 + sysRTAX_IFP = 0x4 + sysRTAX_IFA = 0x5 + sysRTAX_AUTHOR = 0x6 + sysRTAX_BRD = 0x7 + sysRTAX_MAX = 0x8 +) + +const ( + sizeofIfMsghdrlFreeBSD10 = 0xb0 + sizeofIfaMsghdrFreeBSD10 = 0x14 + sizeofIfaMsghdrlFreeBSD10 = 0xb0 + sizeofIfmaMsghdrFreeBSD10 = 0x10 + sizeofIfAnnouncemsghdrFreeBSD10 = 0x18 + + sizeofRtMsghdrFreeBSD10 = 0x98 + sizeofRtMetricsFreeBSD10 = 0x70 + + sizeofIfMsghdrFreeBSD7 = 0xa8 + sizeofIfMsghdrFreeBSD8 = 0xa8 + sizeofIfMsghdrFreeBSD9 = 0xa8 + sizeofIfMsghdrFreeBSD10 = 0xa8 + sizeofIfMsghdrFreeBSD11 = 0xa8 + + sizeofIfDataFreeBSD7 = 0x98 + sizeofIfDataFreeBSD8 = 0x98 + sizeofIfDataFreeBSD9 = 0x98 + sizeofIfDataFreeBSD10 = 0x98 + sizeofIfDataFreeBSD11 = 0x98 + + sizeofIfMsghdrlFreeBSD10Emu = 0xb0 + sizeofIfaMsghdrFreeBSD10Emu = 0x14 + sizeofIfaMsghdrlFreeBSD10Emu = 0xb0 + sizeofIfmaMsghdrFreeBSD10Emu = 0x10 + sizeofIfAnnouncemsghdrFreeBSD10Emu = 0x18 + + sizeofRtMsghdrFreeBSD10Emu = 0x98 + sizeofRtMetricsFreeBSD10Emu = 0x70 + + sizeofIfMsghdrFreeBSD7Emu = 0xa8 + sizeofIfMsghdrFreeBSD8Emu = 0xa8 + sizeofIfMsghdrFreeBSD9Emu = 0xa8 + sizeofIfMsghdrFreeBSD10Emu = 0xa8 + sizeofIfMsghdrFreeBSD11Emu = 0xa8 + + sizeofIfDataFreeBSD7Emu = 0x98 + sizeofIfDataFreeBSD8Emu = 0x98 + sizeofIfDataFreeBSD9Emu = 0x98 + sizeofIfDataFreeBSD10Emu = 0x98 + sizeofIfDataFreeBSD11Emu = 0x98 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/zsys_freebsd_arm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/zsys_freebsd_arm.go new file mode 100644 index 0000000..58f8ea1 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/zsys_freebsd_arm.go @@ -0,0 +1,123 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_freebsd.go + +package route + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_ROUTE = 0x11 + sysAF_LINK = 0x12 + sysAF_INET6 = 0x1c + + sysSOCK_RAW = 0x3 + + sysNET_RT_DUMP = 0x1 + sysNET_RT_FLAGS = 0x2 + sysNET_RT_IFLIST = 0x3 + sysNET_RT_IFMALIST = 0x4 + sysNET_RT_IFLISTL = 0x5 +) + +const ( + sysCTL_MAXNAME = 0x18 + + sysCTL_UNSPEC = 0x0 + sysCTL_KERN = 0x1 + sysCTL_VM = 0x2 + sysCTL_VFS = 0x3 + sysCTL_NET = 0x4 + sysCTL_DEBUG = 0x5 + sysCTL_HW = 0x6 + sysCTL_MACHDEP = 0x7 + sysCTL_USER = 0x8 + sysCTL_P1003_1B = 0x9 +) + +const ( + sysRTM_VERSION = 0x5 + + sysRTM_ADD = 0x1 + sysRTM_DELETE = 0x2 + sysRTM_CHANGE = 0x3 + sysRTM_GET = 0x4 + sysRTM_LOSING = 0x5 + sysRTM_REDIRECT = 0x6 + sysRTM_MISS = 0x7 + sysRTM_LOCK = 0x8 + sysRTM_RESOLVE = 0xb + sysRTM_NEWADDR = 0xc + sysRTM_DELADDR = 0xd + sysRTM_IFINFO = 0xe + sysRTM_NEWMADDR = 0xf + sysRTM_DELMADDR = 0x10 + sysRTM_IFANNOUNCE = 0x11 + sysRTM_IEEE80211 = 0x12 + + sysRTA_DST = 0x1 + sysRTA_GATEWAY = 0x2 + sysRTA_NETMASK = 0x4 + sysRTA_GENMASK = 0x8 + sysRTA_IFP = 0x10 + sysRTA_IFA = 0x20 + sysRTA_AUTHOR = 0x40 + sysRTA_BRD = 0x80 + + sysRTAX_DST = 0x0 + sysRTAX_GATEWAY = 0x1 + sysRTAX_NETMASK = 0x2 + sysRTAX_GENMASK = 0x3 + sysRTAX_IFP = 0x4 + sysRTAX_IFA = 0x5 + sysRTAX_AUTHOR = 0x6 + sysRTAX_BRD = 0x7 + sysRTAX_MAX = 0x8 +) + +const ( + sizeofIfMsghdrlFreeBSD10 = 0x68 + sizeofIfaMsghdrFreeBSD10 = 0x14 + sizeofIfaMsghdrlFreeBSD10 = 0x6c + sizeofIfmaMsghdrFreeBSD10 = 0x10 + sizeofIfAnnouncemsghdrFreeBSD10 = 0x18 + + sizeofRtMsghdrFreeBSD10 = 0x5c + sizeofRtMetricsFreeBSD10 = 0x38 + + sizeofIfMsghdrFreeBSD7 = 0x70 + sizeofIfMsghdrFreeBSD8 = 0x70 + sizeofIfMsghdrFreeBSD9 = 0x70 + sizeofIfMsghdrFreeBSD10 = 0x70 + sizeofIfMsghdrFreeBSD11 = 0xa8 + + sizeofIfDataFreeBSD7 = 0x60 + sizeofIfDataFreeBSD8 = 0x60 + sizeofIfDataFreeBSD9 = 0x60 + sizeofIfDataFreeBSD10 = 0x60 + sizeofIfDataFreeBSD11 = 0x98 + + sizeofIfMsghdrlFreeBSD10Emu = 0x68 + sizeofIfaMsghdrFreeBSD10Emu = 0x14 + sizeofIfaMsghdrlFreeBSD10Emu = 0x6c + sizeofIfmaMsghdrFreeBSD10Emu = 0x10 + sizeofIfAnnouncemsghdrFreeBSD10Emu = 0x18 + + sizeofRtMsghdrFreeBSD10Emu = 0x5c + sizeofRtMetricsFreeBSD10Emu = 0x38 + + sizeofIfMsghdrFreeBSD7Emu = 0x70 + sizeofIfMsghdrFreeBSD8Emu = 0x70 + sizeofIfMsghdrFreeBSD9Emu = 0x70 + sizeofIfMsghdrFreeBSD10Emu = 0x70 + sizeofIfMsghdrFreeBSD11Emu = 0xa8 + + sizeofIfDataFreeBSD7Emu = 0x60 + sizeofIfDataFreeBSD8Emu = 0x60 + sizeofIfDataFreeBSD9Emu = 0x60 + sizeofIfDataFreeBSD10Emu = 0x60 + sizeofIfDataFreeBSD11Emu = 0x98 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/zsys_netbsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/zsys_netbsd.go new file mode 100644 index 0000000..e0df45e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/zsys_netbsd.go @@ -0,0 +1,97 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_netbsd.go + +package route + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_ROUTE = 0x22 + sysAF_LINK = 0x12 + sysAF_INET6 = 0x18 + + sysSOCK_RAW = 0x3 + + sysNET_RT_DUMP = 0x1 + sysNET_RT_FLAGS = 0x2 + sysNET_RT_IFLIST = 0x5 + sysNET_RT_MAXID = 0x6 +) + +const ( + sysCTL_MAXNAME = 0xc + + sysCTL_UNSPEC = 0x0 + sysCTL_KERN = 0x1 + sysCTL_VM = 0x2 + sysCTL_VFS = 0x3 + sysCTL_NET = 0x4 + sysCTL_DEBUG = 0x5 + sysCTL_HW = 0x6 + sysCTL_MACHDEP = 0x7 + sysCTL_USER = 0x8 + sysCTL_DDB = 0x9 + sysCTL_PROC = 0xa + sysCTL_VENDOR = 0xb + sysCTL_EMUL = 0xc + sysCTL_SECURITY = 0xd + sysCTL_MAXID = 0xe +) + +const ( + sysRTM_VERSION = 0x4 + + sysRTM_ADD = 0x1 + sysRTM_DELETE = 0x2 + sysRTM_CHANGE = 0x3 + sysRTM_GET = 0x4 + sysRTM_LOSING = 0x5 + sysRTM_REDIRECT = 0x6 + sysRTM_MISS = 0x7 + sysRTM_LOCK = 0x8 + sysRTM_OLDADD = 0x9 + sysRTM_OLDDEL = 0xa + sysRTM_RESOLVE = 0xb + sysRTM_NEWADDR = 0xc + sysRTM_DELADDR = 0xd + sysRTM_IFANNOUNCE = 0x10 + sysRTM_IEEE80211 = 0x11 + sysRTM_SETGATE = 0x12 + sysRTM_LLINFO_UPD = 0x13 + sysRTM_IFINFO = 0x14 + sysRTM_CHGADDR = 0x15 + + sysRTA_DST = 0x1 + sysRTA_GATEWAY = 0x2 + sysRTA_NETMASK = 0x4 + sysRTA_GENMASK = 0x8 + sysRTA_IFP = 0x10 + sysRTA_IFA = 0x20 + sysRTA_AUTHOR = 0x40 + sysRTA_BRD = 0x80 + sysRTA_TAG = 0x100 + + sysRTAX_DST = 0x0 + sysRTAX_GATEWAY = 0x1 + sysRTAX_NETMASK = 0x2 + sysRTAX_GENMASK = 0x3 + sysRTAX_IFP = 0x4 + sysRTAX_IFA = 0x5 + sysRTAX_AUTHOR = 0x6 + sysRTAX_BRD = 0x7 + sysRTAX_TAG = 0x8 + sysRTAX_MAX = 0x9 +) + +const ( + sizeofIfMsghdrNetBSD7 = 0x98 + sizeofIfaMsghdrNetBSD7 = 0x18 + sizeofIfAnnouncemsghdrNetBSD7 = 0x18 + + sizeofRtMsghdrNetBSD7 = 0x78 + sizeofRtMetricsNetBSD7 = 0x50 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/zsys_openbsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/zsys_openbsd.go new file mode 100644 index 0000000..db8c8ef --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/route/zsys_openbsd.go @@ -0,0 +1,101 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_openbsd.go + +package route + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_ROUTE = 0x11 + sysAF_LINK = 0x12 + sysAF_INET6 = 0x18 + + sysSOCK_RAW = 0x3 + + sysNET_RT_DUMP = 0x1 + sysNET_RT_FLAGS = 0x2 + sysNET_RT_IFLIST = 0x3 + sysNET_RT_STATS = 0x4 + sysNET_RT_TABLE = 0x5 + sysNET_RT_IFNAMES = 0x6 + sysNET_RT_MAXID = 0x7 +) + +const ( + sysCTL_MAXNAME = 0xc + + sysCTL_UNSPEC = 0x0 + sysCTL_KERN = 0x1 + sysCTL_VM = 0x2 + sysCTL_FS = 0x3 + sysCTL_NET = 0x4 + sysCTL_DEBUG = 0x5 + sysCTL_HW = 0x6 + sysCTL_MACHDEP = 0x7 + sysCTL_DDB = 0x9 + sysCTL_VFS = 0xa + sysCTL_MAXID = 0xb +) + +const ( + sysRTM_VERSION = 0x5 + + sysRTM_ADD = 0x1 + sysRTM_DELETE = 0x2 + sysRTM_CHANGE = 0x3 + sysRTM_GET = 0x4 + sysRTM_LOSING = 0x5 + sysRTM_REDIRECT = 0x6 + sysRTM_MISS = 0x7 + sysRTM_LOCK = 0x8 + sysRTM_RESOLVE = 0xb + sysRTM_NEWADDR = 0xc + sysRTM_DELADDR = 0xd + sysRTM_IFINFO = 0xe + sysRTM_IFANNOUNCE = 0xf + sysRTM_DESYNC = 0x10 + sysRTM_INVALIDATE = 0x11 + sysRTM_BFD = 0x12 + sysRTM_PROPOSAL = 0x13 + + sysRTA_DST = 0x1 + sysRTA_GATEWAY = 0x2 + sysRTA_NETMASK = 0x4 + sysRTA_GENMASK = 0x8 + sysRTA_IFP = 0x10 + sysRTA_IFA = 0x20 + sysRTA_AUTHOR = 0x40 + sysRTA_BRD = 0x80 + sysRTA_SRC = 0x100 + sysRTA_SRCMASK = 0x200 + sysRTA_LABEL = 0x400 + sysRTA_BFD = 0x800 + sysRTA_DNS = 0x1000 + sysRTA_STATIC = 0x2000 + sysRTA_SEARCH = 0x4000 + + sysRTAX_DST = 0x0 + sysRTAX_GATEWAY = 0x1 + sysRTAX_NETMASK = 0x2 + sysRTAX_GENMASK = 0x3 + sysRTAX_IFP = 0x4 + sysRTAX_IFA = 0x5 + sysRTAX_AUTHOR = 0x6 + sysRTAX_BRD = 0x7 + sysRTAX_SRC = 0x8 + sysRTAX_SRCMASK = 0x9 + sysRTAX_LABEL = 0xa + sysRTAX_BFD = 0xb + sysRTAX_DNS = 0xc + sysRTAX_STATIC = 0xd + sysRTAX_SEARCH = 0xe + sysRTAX_MAX = 0xf +) + +const ( + sizeofRtMsghdr = 0x60 + + sizeofSockaddrStorage = 0x100 + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/trace/events.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/trace/events.go new file mode 100644 index 0000000..c646a69 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/trace/events.go @@ -0,0 +1,532 @@ +// Copyright 2015 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 trace + +import ( + "bytes" + "fmt" + "html/template" + "io" + "log" + "net/http" + "runtime" + "sort" + "strconv" + "strings" + "sync" + "sync/atomic" + "text/tabwriter" + "time" +) + +const maxEventsPerLog = 100 + +type bucket struct { + MaxErrAge time.Duration + String string +} + +var buckets = []bucket{ + {0, "total"}, + {10 * time.Second, "errs<10s"}, + {1 * time.Minute, "errs<1m"}, + {10 * time.Minute, "errs<10m"}, + {1 * time.Hour, "errs<1h"}, + {10 * time.Hour, "errs<10h"}, + {24000 * time.Hour, "errors"}, +} + +// RenderEvents renders the HTML page typically served at /debug/events. +// It does not do any auth checking. The request may be nil. +// +// Most users will use the Events handler. +func RenderEvents(w http.ResponseWriter, req *http.Request, sensitive bool) { + now := time.Now() + data := &struct { + Families []string // family names + Buckets []bucket + Counts [][]int // eventLog count per family/bucket + + // Set when a bucket has been selected. + Family string + Bucket int + EventLogs eventLogs + Expanded bool + }{ + Buckets: buckets, + } + + data.Families = make([]string, 0, len(families)) + famMu.RLock() + for name := range families { + data.Families = append(data.Families, name) + } + famMu.RUnlock() + sort.Strings(data.Families) + + // Count the number of eventLogs in each family for each error age. + data.Counts = make([][]int, len(data.Families)) + for i, name := range data.Families { + // TODO(sameer): move this loop under the family lock. + f := getEventFamily(name) + data.Counts[i] = make([]int, len(data.Buckets)) + for j, b := range data.Buckets { + data.Counts[i][j] = f.Count(now, b.MaxErrAge) + } + } + + if req != nil { + var ok bool + data.Family, data.Bucket, ok = parseEventsArgs(req) + if !ok { + // No-op + } else { + data.EventLogs = getEventFamily(data.Family).Copy(now, buckets[data.Bucket].MaxErrAge) + } + if data.EventLogs != nil { + defer data.EventLogs.Free() + sort.Sort(data.EventLogs) + } + if exp, err := strconv.ParseBool(req.FormValue("exp")); err == nil { + data.Expanded = exp + } + } + + famMu.RLock() + defer famMu.RUnlock() + if err := eventsTmpl().Execute(w, data); err != nil { + log.Printf("net/trace: Failed executing template: %v", err) + } +} + +func parseEventsArgs(req *http.Request) (fam string, b int, ok bool) { + fam, bStr := req.FormValue("fam"), req.FormValue("b") + if fam == "" || bStr == "" { + return "", 0, false + } + b, err := strconv.Atoi(bStr) + if err != nil || b < 0 || b >= len(buckets) { + return "", 0, false + } + return fam, b, true +} + +// An EventLog provides a log of events associated with a specific object. +type EventLog interface { + // Printf formats its arguments with fmt.Sprintf and adds the + // result to the event log. + Printf(format string, a ...interface{}) + + // Errorf is like Printf, but it marks this event as an error. + Errorf(format string, a ...interface{}) + + // Finish declares that this event log is complete. + // The event log should not be used after calling this method. + Finish() +} + +// NewEventLog returns a new EventLog with the specified family name +// and title. +func NewEventLog(family, title string) EventLog { + el := newEventLog() + el.ref() + el.Family, el.Title = family, title + el.Start = time.Now() + el.events = make([]logEntry, 0, maxEventsPerLog) + el.stack = make([]uintptr, 32) + n := runtime.Callers(2, el.stack) + el.stack = el.stack[:n] + + getEventFamily(family).add(el) + return el +} + +func (el *eventLog) Finish() { + getEventFamily(el.Family).remove(el) + el.unref() // matches ref in New +} + +var ( + famMu sync.RWMutex + families = make(map[string]*eventFamily) // family name => family +) + +func getEventFamily(fam string) *eventFamily { + famMu.Lock() + defer famMu.Unlock() + f := families[fam] + if f == nil { + f = &eventFamily{} + families[fam] = f + } + return f +} + +type eventFamily struct { + mu sync.RWMutex + eventLogs eventLogs +} + +func (f *eventFamily) add(el *eventLog) { + f.mu.Lock() + f.eventLogs = append(f.eventLogs, el) + f.mu.Unlock() +} + +func (f *eventFamily) remove(el *eventLog) { + f.mu.Lock() + defer f.mu.Unlock() + for i, el0 := range f.eventLogs { + if el == el0 { + copy(f.eventLogs[i:], f.eventLogs[i+1:]) + f.eventLogs = f.eventLogs[:len(f.eventLogs)-1] + return + } + } +} + +func (f *eventFamily) Count(now time.Time, maxErrAge time.Duration) (n int) { + f.mu.RLock() + defer f.mu.RUnlock() + for _, el := range f.eventLogs { + if el.hasRecentError(now, maxErrAge) { + n++ + } + } + return +} + +func (f *eventFamily) Copy(now time.Time, maxErrAge time.Duration) (els eventLogs) { + f.mu.RLock() + defer f.mu.RUnlock() + els = make(eventLogs, 0, len(f.eventLogs)) + for _, el := range f.eventLogs { + if el.hasRecentError(now, maxErrAge) { + el.ref() + els = append(els, el) + } + } + return +} + +type eventLogs []*eventLog + +// Free calls unref on each element of the list. +func (els eventLogs) Free() { + for _, el := range els { + el.unref() + } +} + +// eventLogs may be sorted in reverse chronological order. +func (els eventLogs) Len() int { return len(els) } +func (els eventLogs) Less(i, j int) bool { return els[i].Start.After(els[j].Start) } +func (els eventLogs) Swap(i, j int) { els[i], els[j] = els[j], els[i] } + +// A logEntry is a timestamped log entry in an event log. +type logEntry struct { + When time.Time + Elapsed time.Duration // since previous event in log + NewDay bool // whether this event is on a different day to the previous event + What string + IsErr bool +} + +// WhenString returns a string representation of the elapsed time of the event. +// It will include the date if midnight was crossed. +func (e logEntry) WhenString() string { + if e.NewDay { + return e.When.Format("2006/01/02 15:04:05.000000") + } + return e.When.Format("15:04:05.000000") +} + +// An eventLog represents an active event log. +type eventLog struct { + // Family is the top-level grouping of event logs to which this belongs. + Family string + + // Title is the title of this event log. + Title string + + // Timing information. + Start time.Time + + // Call stack where this event log was created. + stack []uintptr + + // Append-only sequence of events. + // + // TODO(sameer): change this to a ring buffer to avoid the array copy + // when we hit maxEventsPerLog. + mu sync.RWMutex + events []logEntry + LastErrorTime time.Time + discarded int + + refs int32 // how many buckets this is in +} + +func (el *eventLog) reset() { + // Clear all but the mutex. Mutexes may not be copied, even when unlocked. + el.Family = "" + el.Title = "" + el.Start = time.Time{} + el.stack = nil + el.events = nil + el.LastErrorTime = time.Time{} + el.discarded = 0 + el.refs = 0 +} + +func (el *eventLog) hasRecentError(now time.Time, maxErrAge time.Duration) bool { + if maxErrAge == 0 { + return true + } + el.mu.RLock() + defer el.mu.RUnlock() + return now.Sub(el.LastErrorTime) < maxErrAge +} + +// delta returns the elapsed time since the last event or the log start, +// and whether it spans midnight. +// L >= el.mu +func (el *eventLog) delta(t time.Time) (time.Duration, bool) { + if len(el.events) == 0 { + return t.Sub(el.Start), false + } + prev := el.events[len(el.events)-1].When + return t.Sub(prev), prev.Day() != t.Day() + +} + +func (el *eventLog) Printf(format string, a ...interface{}) { + el.printf(false, format, a...) +} + +func (el *eventLog) Errorf(format string, a ...interface{}) { + el.printf(true, format, a...) +} + +func (el *eventLog) printf(isErr bool, format string, a ...interface{}) { + e := logEntry{When: time.Now(), IsErr: isErr, What: fmt.Sprintf(format, a...)} + el.mu.Lock() + e.Elapsed, e.NewDay = el.delta(e.When) + if len(el.events) < maxEventsPerLog { + el.events = append(el.events, e) + } else { + // Discard the oldest event. + if el.discarded == 0 { + // el.discarded starts at two to count for the event it + // is replacing, plus the next one that we are about to + // drop. + el.discarded = 2 + } else { + el.discarded++ + } + // TODO(sameer): if this causes allocations on a critical path, + // change eventLog.What to be a fmt.Stringer, as in trace.go. + el.events[0].What = fmt.Sprintf("(%d events discarded)", el.discarded) + // The timestamp of the discarded meta-event should be + // the time of the last event it is representing. + el.events[0].When = el.events[1].When + copy(el.events[1:], el.events[2:]) + el.events[maxEventsPerLog-1] = e + } + if e.IsErr { + el.LastErrorTime = e.When + } + el.mu.Unlock() +} + +func (el *eventLog) ref() { + atomic.AddInt32(&el.refs, 1) +} + +func (el *eventLog) unref() { + if atomic.AddInt32(&el.refs, -1) == 0 { + freeEventLog(el) + } +} + +func (el *eventLog) When() string { + return el.Start.Format("2006/01/02 15:04:05.000000") +} + +func (el *eventLog) ElapsedTime() string { + elapsed := time.Since(el.Start) + return fmt.Sprintf("%.6f", elapsed.Seconds()) +} + +func (el *eventLog) Stack() string { + buf := new(bytes.Buffer) + tw := tabwriter.NewWriter(buf, 1, 8, 1, '\t', 0) + printStackRecord(tw, el.stack) + tw.Flush() + return buf.String() +} + +// printStackRecord prints the function + source line information +// for a single stack trace. +// Adapted from runtime/pprof/pprof.go. +func printStackRecord(w io.Writer, stk []uintptr) { + for _, pc := range stk { + f := runtime.FuncForPC(pc) + if f == nil { + continue + } + file, line := f.FileLine(pc) + name := f.Name() + // Hide runtime.goexit and any runtime functions at the beginning. + if strings.HasPrefix(name, "runtime.") { + continue + } + fmt.Fprintf(w, "# %s\t%s:%d\n", name, file, line) + } +} + +func (el *eventLog) Events() []logEntry { + el.mu.RLock() + defer el.mu.RUnlock() + return el.events +} + +// freeEventLogs is a freelist of *eventLog +var freeEventLogs = make(chan *eventLog, 1000) + +// newEventLog returns a event log ready to use. +func newEventLog() *eventLog { + select { + case el := <-freeEventLogs: + return el + default: + return new(eventLog) + } +} + +// freeEventLog adds el to freeEventLogs if there's room. +// This is non-blocking. +func freeEventLog(el *eventLog) { + el.reset() + select { + case freeEventLogs <- el: + default: + } +} + +var eventsTmplCache *template.Template +var eventsTmplOnce sync.Once + +func eventsTmpl() *template.Template { + eventsTmplOnce.Do(func() { + eventsTmplCache = template.Must(template.New("events").Funcs(template.FuncMap{ + "elapsed": elapsed, + "trimSpace": strings.TrimSpace, + }).Parse(eventsHTML)) + }) + return eventsTmplCache +} + +const eventsHTML = ` + + + events + + + + +

    /debug/events

    + +
  • + {{range $i, $fam := .Families}} + + + + {{range $j, $bucket := $.Buckets}} + {{$n := index $.Counts $i $j}} + + {{end}} + + {{end}} +
    {{$fam}} + {{if $n}}{{end}} + [{{$n}} {{$bucket.String}}] + {{if $n}}{{end}} +
    + +{{if $.EventLogs}} +


    +

    Family: {{$.Family}}

    + +{{if $.Expanded}}{{end}} +[Summary]{{if $.Expanded}}{{end}} + +{{if not $.Expanded}}{{end}} +[Expanded]{{if not $.Expanded}}{{end}} + + + + {{range $el := $.EventLogs}} + + + + + {{if $.Expanded}} + + + + + + {{range $el.Events}} + + + + + + {{end}} + {{end}} + {{end}} +
    WhenElapsed
    {{$el.When}}{{$el.ElapsedTime}}{{$el.Title}} +
    {{$el.Stack|trimSpace}}
    {{.WhenString}}{{elapsed .Elapsed}}.{{if .IsErr}}E{{else}}.{{end}}. {{.What}}
    +{{end}} + + +` diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/trace/histogram.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/trace/histogram.go new file mode 100644 index 0000000..9bf4286 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/trace/histogram.go @@ -0,0 +1,365 @@ +// Copyright 2015 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 trace + +// This file implements histogramming for RPC statistics collection. + +import ( + "bytes" + "fmt" + "html/template" + "log" + "math" + "sync" + + "golang.org/x/net/internal/timeseries" +) + +const ( + bucketCount = 38 +) + +// histogram keeps counts of values in buckets that are spaced +// out in powers of 2: 0-1, 2-3, 4-7... +// histogram implements timeseries.Observable +type histogram struct { + sum int64 // running total of measurements + sumOfSquares float64 // square of running total + buckets []int64 // bucketed values for histogram + value int // holds a single value as an optimization + valueCount int64 // number of values recorded for single value +} + +// AddMeasurement records a value measurement observation to the histogram. +func (h *histogram) addMeasurement(value int64) { + // TODO: assert invariant + h.sum += value + h.sumOfSquares += float64(value) * float64(value) + + bucketIndex := getBucket(value) + + if h.valueCount == 0 || (h.valueCount > 0 && h.value == bucketIndex) { + h.value = bucketIndex + h.valueCount++ + } else { + h.allocateBuckets() + h.buckets[bucketIndex]++ + } +} + +func (h *histogram) allocateBuckets() { + if h.buckets == nil { + h.buckets = make([]int64, bucketCount) + h.buckets[h.value] = h.valueCount + h.value = 0 + h.valueCount = -1 + } +} + +func log2(i int64) int { + n := 0 + for ; i >= 0x100; i >>= 8 { + n += 8 + } + for ; i > 0; i >>= 1 { + n += 1 + } + return n +} + +func getBucket(i int64) (index int) { + index = log2(i) - 1 + if index < 0 { + index = 0 + } + if index >= bucketCount { + index = bucketCount - 1 + } + return +} + +// Total returns the number of recorded observations. +func (h *histogram) total() (total int64) { + if h.valueCount >= 0 { + total = h.valueCount + } + for _, val := range h.buckets { + total += int64(val) + } + return +} + +// Average returns the average value of recorded observations. +func (h *histogram) average() float64 { + t := h.total() + if t == 0 { + return 0 + } + return float64(h.sum) / float64(t) +} + +// Variance returns the variance of recorded observations. +func (h *histogram) variance() float64 { + t := float64(h.total()) + if t == 0 { + return 0 + } + s := float64(h.sum) / t + return h.sumOfSquares/t - s*s +} + +// StandardDeviation returns the standard deviation of recorded observations. +func (h *histogram) standardDeviation() float64 { + return math.Sqrt(h.variance()) +} + +// PercentileBoundary estimates the value that the given fraction of recorded +// observations are less than. +func (h *histogram) percentileBoundary(percentile float64) int64 { + total := h.total() + + // Corner cases (make sure result is strictly less than Total()) + if total == 0 { + return 0 + } else if total == 1 { + return int64(h.average()) + } + + percentOfTotal := round(float64(total) * percentile) + var runningTotal int64 + + for i := range h.buckets { + value := h.buckets[i] + runningTotal += value + if runningTotal == percentOfTotal { + // We hit an exact bucket boundary. If the next bucket has data, it is a + // good estimate of the value. If the bucket is empty, we interpolate the + // midpoint between the next bucket's boundary and the next non-zero + // bucket. If the remaining buckets are all empty, then we use the + // boundary for the next bucket as the estimate. + j := uint8(i + 1) + min := bucketBoundary(j) + if runningTotal < total { + for h.buckets[j] == 0 { + j++ + } + } + max := bucketBoundary(j) + return min + round(float64(max-min)/2) + } else if runningTotal > percentOfTotal { + // The value is in this bucket. Interpolate the value. + delta := runningTotal - percentOfTotal + percentBucket := float64(value-delta) / float64(value) + bucketMin := bucketBoundary(uint8(i)) + nextBucketMin := bucketBoundary(uint8(i + 1)) + bucketSize := nextBucketMin - bucketMin + return bucketMin + round(percentBucket*float64(bucketSize)) + } + } + return bucketBoundary(bucketCount - 1) +} + +// Median returns the estimated median of the observed values. +func (h *histogram) median() int64 { + return h.percentileBoundary(0.5) +} + +// Add adds other to h. +func (h *histogram) Add(other timeseries.Observable) { + o := other.(*histogram) + if o.valueCount == 0 { + // Other histogram is empty + } else if h.valueCount >= 0 && o.valueCount > 0 && h.value == o.value { + // Both have a single bucketed value, aggregate them + h.valueCount += o.valueCount + } else { + // Two different values necessitate buckets in this histogram + h.allocateBuckets() + if o.valueCount >= 0 { + h.buckets[o.value] += o.valueCount + } else { + for i := range h.buckets { + h.buckets[i] += o.buckets[i] + } + } + } + h.sumOfSquares += o.sumOfSquares + h.sum += o.sum +} + +// Clear resets the histogram to an empty state, removing all observed values. +func (h *histogram) Clear() { + h.buckets = nil + h.value = 0 + h.valueCount = 0 + h.sum = 0 + h.sumOfSquares = 0 +} + +// CopyFrom copies from other, which must be a *histogram, into h. +func (h *histogram) CopyFrom(other timeseries.Observable) { + o := other.(*histogram) + if o.valueCount == -1 { + h.allocateBuckets() + copy(h.buckets, o.buckets) + } + h.sum = o.sum + h.sumOfSquares = o.sumOfSquares + h.value = o.value + h.valueCount = o.valueCount +} + +// Multiply scales the histogram by the specified ratio. +func (h *histogram) Multiply(ratio float64) { + if h.valueCount == -1 { + for i := range h.buckets { + h.buckets[i] = int64(float64(h.buckets[i]) * ratio) + } + } else { + h.valueCount = int64(float64(h.valueCount) * ratio) + } + h.sum = int64(float64(h.sum) * ratio) + h.sumOfSquares = h.sumOfSquares * ratio +} + +// New creates a new histogram. +func (h *histogram) New() timeseries.Observable { + r := new(histogram) + r.Clear() + return r +} + +func (h *histogram) String() string { + return fmt.Sprintf("%d, %f, %d, %d, %v", + h.sum, h.sumOfSquares, h.value, h.valueCount, h.buckets) +} + +// round returns the closest int64 to the argument +func round(in float64) int64 { + return int64(math.Floor(in + 0.5)) +} + +// bucketBoundary returns the first value in the bucket. +func bucketBoundary(bucket uint8) int64 { + if bucket == 0 { + return 0 + } + return 1 << bucket +} + +// bucketData holds data about a specific bucket for use in distTmpl. +type bucketData struct { + Lower, Upper int64 + N int64 + Pct, CumulativePct float64 + GraphWidth int +} + +// data holds data about a Distribution for use in distTmpl. +type data struct { + Buckets []*bucketData + Count, Median int64 + Mean, StandardDeviation float64 +} + +// maxHTMLBarWidth is the maximum width of the HTML bar for visualizing buckets. +const maxHTMLBarWidth = 350.0 + +// newData returns data representing h for use in distTmpl. +func (h *histogram) newData() *data { + // Force the allocation of buckets to simplify the rendering implementation + h.allocateBuckets() + // We scale the bars on the right so that the largest bar is + // maxHTMLBarWidth pixels in width. + maxBucket := int64(0) + for _, n := range h.buckets { + if n > maxBucket { + maxBucket = n + } + } + total := h.total() + barsizeMult := maxHTMLBarWidth / float64(maxBucket) + var pctMult float64 + if total == 0 { + pctMult = 1.0 + } else { + pctMult = 100.0 / float64(total) + } + + buckets := make([]*bucketData, len(h.buckets)) + runningTotal := int64(0) + for i, n := range h.buckets { + if n == 0 { + continue + } + runningTotal += n + var upperBound int64 + if i < bucketCount-1 { + upperBound = bucketBoundary(uint8(i + 1)) + } else { + upperBound = math.MaxInt64 + } + buckets[i] = &bucketData{ + Lower: bucketBoundary(uint8(i)), + Upper: upperBound, + N: n, + Pct: float64(n) * pctMult, + CumulativePct: float64(runningTotal) * pctMult, + GraphWidth: int(float64(n) * barsizeMult), + } + } + return &data{ + Buckets: buckets, + Count: total, + Median: h.median(), + Mean: h.average(), + StandardDeviation: h.standardDeviation(), + } +} + +func (h *histogram) html() template.HTML { + buf := new(bytes.Buffer) + if err := distTmpl().Execute(buf, h.newData()); err != nil { + buf.Reset() + log.Printf("net/trace: couldn't execute template: %v", err) + } + return template.HTML(buf.String()) +} + +var distTmplCache *template.Template +var distTmplOnce sync.Once + +func distTmpl() *template.Template { + distTmplOnce.Do(func() { + // Input: data + distTmplCache = template.Must(template.New("distTmpl").Parse(` + + + + + + + +
    Count: {{.Count}}Mean: {{printf "%.0f" .Mean}}StdDev: {{printf "%.0f" .StandardDeviation}}Median: {{.Median}}
    +
    + +{{range $b := .Buckets}} +{{if $b}} + + + + + + + + + +{{end}} +{{end}} +
    [{{.Lower}},{{.Upper}}){{.N}}{{printf "%#.3f" .Pct}}%{{printf "%#.3f" .CumulativePct}}%
    +`)) + }) + return distTmplCache +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/trace/histogram_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/trace/histogram_test.go new file mode 100644 index 0000000..d384b93 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/trace/histogram_test.go @@ -0,0 +1,325 @@ +// Copyright 2015 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 trace + +import ( + "math" + "testing" +) + +type sumTest struct { + value int64 + sum int64 + sumOfSquares float64 + total int64 +} + +var sumTests = []sumTest{ + {100, 100, 10000, 1}, + {50, 150, 12500, 2}, + {50, 200, 15000, 3}, + {50, 250, 17500, 4}, +} + +type bucketingTest struct { + in int64 + log int + bucket int +} + +var bucketingTests = []bucketingTest{ + {0, 0, 0}, + {1, 1, 0}, + {2, 2, 1}, + {3, 2, 1}, + {4, 3, 2}, + {1000, 10, 9}, + {1023, 10, 9}, + {1024, 11, 10}, + {1000000, 20, 19}, +} + +type multiplyTest struct { + in int64 + ratio float64 + expectedSum int64 + expectedTotal int64 + expectedSumOfSquares float64 +} + +var multiplyTests = []multiplyTest{ + {15, 2.5, 37, 2, 562.5}, + {128, 4.6, 758, 13, 77953.9}, +} + +type percentileTest struct { + fraction float64 + expected int64 +} + +var percentileTests = []percentileTest{ + {0.25, 48}, + {0.5, 96}, + {0.6, 109}, + {0.75, 128}, + {0.90, 205}, + {0.95, 230}, + {0.99, 256}, +} + +func TestSum(t *testing.T) { + var h histogram + + for _, test := range sumTests { + h.addMeasurement(test.value) + sum := h.sum + if sum != test.sum { + t.Errorf("h.Sum = %v WANT: %v", sum, test.sum) + } + + sumOfSquares := h.sumOfSquares + if sumOfSquares != test.sumOfSquares { + t.Errorf("h.SumOfSquares = %v WANT: %v", sumOfSquares, test.sumOfSquares) + } + + total := h.total() + if total != test.total { + t.Errorf("h.Total = %v WANT: %v", total, test.total) + } + } +} + +func TestMultiply(t *testing.T) { + var h histogram + for i, test := range multiplyTests { + h.addMeasurement(test.in) + h.Multiply(test.ratio) + if h.sum != test.expectedSum { + t.Errorf("#%v: h.sum = %v WANT: %v", i, h.sum, test.expectedSum) + } + if h.total() != test.expectedTotal { + t.Errorf("#%v: h.total = %v WANT: %v", i, h.total(), test.expectedTotal) + } + if h.sumOfSquares != test.expectedSumOfSquares { + t.Errorf("#%v: h.SumOfSquares = %v WANT: %v", i, test.expectedSumOfSquares, h.sumOfSquares) + } + } +} + +func TestBucketingFunctions(t *testing.T) { + for _, test := range bucketingTests { + log := log2(test.in) + if log != test.log { + t.Errorf("log2 = %v WANT: %v", log, test.log) + } + + bucket := getBucket(test.in) + if bucket != test.bucket { + t.Errorf("getBucket = %v WANT: %v", bucket, test.bucket) + } + } +} + +func TestAverage(t *testing.T) { + a := new(histogram) + average := a.average() + if average != 0 { + t.Errorf("Average of empty histogram was %v WANT: 0", average) + } + + a.addMeasurement(1) + a.addMeasurement(1) + a.addMeasurement(3) + const expected = float64(5) / float64(3) + average = a.average() + + if !isApproximate(average, expected) { + t.Errorf("Average = %g WANT: %v", average, expected) + } +} + +func TestStandardDeviation(t *testing.T) { + a := new(histogram) + add(a, 10, 1<<4) + add(a, 10, 1<<5) + add(a, 10, 1<<6) + stdDev := a.standardDeviation() + const expected = 19.95 + + if !isApproximate(stdDev, expected) { + t.Errorf("StandardDeviation = %v WANT: %v", stdDev, expected) + } + + // No values + a = new(histogram) + stdDev = a.standardDeviation() + + if !isApproximate(stdDev, 0) { + t.Errorf("StandardDeviation = %v WANT: 0", stdDev) + } + + add(a, 1, 1<<4) + if !isApproximate(stdDev, 0) { + t.Errorf("StandardDeviation = %v WANT: 0", stdDev) + } + + add(a, 10, 1<<4) + if !isApproximate(stdDev, 0) { + t.Errorf("StandardDeviation = %v WANT: 0", stdDev) + } +} + +func TestPercentileBoundary(t *testing.T) { + a := new(histogram) + add(a, 5, 1<<4) + add(a, 10, 1<<6) + add(a, 5, 1<<7) + + for _, test := range percentileTests { + percentile := a.percentileBoundary(test.fraction) + if percentile != test.expected { + t.Errorf("h.PercentileBoundary (fraction=%v) = %v WANT: %v", test.fraction, percentile, test.expected) + } + } +} + +func TestCopyFrom(t *testing.T) { + a := histogram{5, 25, []int64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38}, 4, -1} + b := histogram{6, 36, []int64{2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39}, 5, -1} + + a.CopyFrom(&b) + + if a.String() != b.String() { + t.Errorf("a.String = %s WANT: %s", a.String(), b.String()) + } +} + +func TestClear(t *testing.T) { + a := histogram{5, 25, []int64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38}, 4, -1} + + a.Clear() + + expected := "0, 0.000000, 0, 0, []" + if a.String() != expected { + t.Errorf("a.String = %s WANT %s", a.String(), expected) + } +} + +func TestNew(t *testing.T) { + a := histogram{5, 25, []int64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38}, 4, -1} + b := a.New() + + expected := "0, 0.000000, 0, 0, []" + if b.(*histogram).String() != expected { + t.Errorf("b.(*histogram).String = %s WANT: %s", b.(*histogram).String(), expected) + } +} + +func TestAdd(t *testing.T) { + // The tests here depend on the associativity of addMeasurement and Add. + // Add empty observation + a := histogram{5, 25, []int64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38}, 4, -1} + b := a.New() + + expected := a.String() + a.Add(b) + if a.String() != expected { + t.Errorf("a.String = %s WANT: %s", a.String(), expected) + } + + // Add same bucketed value, no new buckets + c := new(histogram) + d := new(histogram) + e := new(histogram) + c.addMeasurement(12) + d.addMeasurement(11) + e.addMeasurement(12) + e.addMeasurement(11) + c.Add(d) + if c.String() != e.String() { + t.Errorf("c.String = %s WANT: %s", c.String(), e.String()) + } + + // Add bucketed values + f := new(histogram) + g := new(histogram) + h := new(histogram) + f.addMeasurement(4) + f.addMeasurement(12) + f.addMeasurement(100) + g.addMeasurement(18) + g.addMeasurement(36) + g.addMeasurement(255) + h.addMeasurement(4) + h.addMeasurement(12) + h.addMeasurement(100) + h.addMeasurement(18) + h.addMeasurement(36) + h.addMeasurement(255) + f.Add(g) + if f.String() != h.String() { + t.Errorf("f.String = %q WANT: %q", f.String(), h.String()) + } + + // add buckets to no buckets + i := new(histogram) + j := new(histogram) + k := new(histogram) + j.addMeasurement(18) + j.addMeasurement(36) + j.addMeasurement(255) + k.addMeasurement(18) + k.addMeasurement(36) + k.addMeasurement(255) + i.Add(j) + if i.String() != k.String() { + t.Errorf("i.String = %q WANT: %q", i.String(), k.String()) + } + + // add buckets to single value (no overlap) + l := new(histogram) + m := new(histogram) + n := new(histogram) + l.addMeasurement(0) + m.addMeasurement(18) + m.addMeasurement(36) + m.addMeasurement(255) + n.addMeasurement(0) + n.addMeasurement(18) + n.addMeasurement(36) + n.addMeasurement(255) + l.Add(m) + if l.String() != n.String() { + t.Errorf("l.String = %q WANT: %q", l.String(), n.String()) + } + + // mixed order + o := new(histogram) + p := new(histogram) + o.addMeasurement(0) + o.addMeasurement(2) + o.addMeasurement(0) + p.addMeasurement(0) + p.addMeasurement(0) + p.addMeasurement(2) + if o.String() != p.String() { + t.Errorf("o.String = %q WANT: %q", o.String(), p.String()) + } +} + +func add(h *histogram, times int, val int64) { + for i := 0; i < times; i++ { + h.addMeasurement(val) + } +} + +func isApproximate(x, y float64) bool { + return math.Abs(x-y) < 1e-2 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/trace/trace.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/trace/trace.go new file mode 100644 index 0000000..bb72a52 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/trace/trace.go @@ -0,0 +1,1082 @@ +// Copyright 2015 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 trace implements tracing of requests and long-lived objects. +It exports HTTP interfaces on /debug/requests and /debug/events. + +A trace.Trace provides tracing for short-lived objects, usually requests. +A request handler might be implemented like this: + + func fooHandler(w http.ResponseWriter, req *http.Request) { + tr := trace.New("mypkg.Foo", req.URL.Path) + defer tr.Finish() + ... + tr.LazyPrintf("some event %q happened", str) + ... + if err := somethingImportant(); err != nil { + tr.LazyPrintf("somethingImportant failed: %v", err) + tr.SetError() + } + } + +The /debug/requests HTTP endpoint organizes the traces by family, +errors, and duration. It also provides histogram of request duration +for each family. + +A trace.EventLog provides tracing for long-lived objects, such as RPC +connections. + + // A Fetcher fetches URL paths for a single domain. + type Fetcher struct { + domain string + events trace.EventLog + } + + func NewFetcher(domain string) *Fetcher { + return &Fetcher{ + domain, + trace.NewEventLog("mypkg.Fetcher", domain), + } + } + + func (f *Fetcher) Fetch(path string) (string, error) { + resp, err := http.Get("http://" + f.domain + "/" + path) + if err != nil { + f.events.Errorf("Get(%q) = %v", path, err) + return "", err + } + f.events.Printf("Get(%q) = %s", path, resp.Status) + ... + } + + func (f *Fetcher) Close() error { + f.events.Finish() + return nil + } + +The /debug/events HTTP endpoint organizes the event logs by family and +by time since the last error. The expanded view displays recent log +entries and the log's call stack. +*/ +package trace // import "golang.org/x/net/trace" + +import ( + "bytes" + "fmt" + "html/template" + "io" + "log" + "net" + "net/http" + "runtime" + "sort" + "strconv" + "sync" + "sync/atomic" + "time" + + "golang.org/x/net/internal/timeseries" +) + +// DebugUseAfterFinish controls whether to debug uses of Trace values after finishing. +// FOR DEBUGGING ONLY. This will slow down the program. +var DebugUseAfterFinish = false + +// AuthRequest determines whether a specific request is permitted to load the +// /debug/requests or /debug/events pages. +// +// It returns two bools; the first indicates whether the page may be viewed at all, +// and the second indicates whether sensitive events will be shown. +// +// AuthRequest may be replaced by a program to customize its authorization requirements. +// +// The default AuthRequest function returns (true, true) if and only if the request +// comes from localhost/127.0.0.1/[::1]. +var AuthRequest = func(req *http.Request) (any, sensitive bool) { + // RemoteAddr is commonly in the form "IP" or "IP:port". + // If it is in the form "IP:port", split off the port. + host, _, err := net.SplitHostPort(req.RemoteAddr) + if err != nil { + host = req.RemoteAddr + } + switch host { + case "localhost", "127.0.0.1", "::1": + return true, true + default: + return false, false + } +} + +func init() { + // TODO(jbd): Serve Traces from /debug/traces in the future? + // There is no requirement for a request to be present to have traces. + http.HandleFunc("/debug/requests", Traces) + http.HandleFunc("/debug/events", Events) +} + +// Traces responds with traces from the program. +// The package initialization registers it in http.DefaultServeMux +// at /debug/requests. +// +// It performs authorization by running AuthRequest. +func Traces(w http.ResponseWriter, req *http.Request) { + any, sensitive := AuthRequest(req) + if !any { + http.Error(w, "not allowed", http.StatusUnauthorized) + return + } + w.Header().Set("Content-Type", "text/html; charset=utf-8") + Render(w, req, sensitive) +} + +// Events responds with a page of events collected by EventLogs. +// The package initialization registers it in http.DefaultServeMux +// at /debug/events. +// +// It performs authorization by running AuthRequest. +func Events(w http.ResponseWriter, req *http.Request) { + any, sensitive := AuthRequest(req) + if !any { + http.Error(w, "not allowed", http.StatusUnauthorized) + return + } + w.Header().Set("Content-Type", "text/html; charset=utf-8") + RenderEvents(w, req, sensitive) +} + +// Render renders the HTML page typically served at /debug/requests. +// It does not do any auth checking. The request may be nil. +// +// Most users will use the Traces handler. +func Render(w io.Writer, req *http.Request, sensitive bool) { + data := &struct { + Families []string + ActiveTraceCount map[string]int + CompletedTraces map[string]*family + + // Set when a bucket has been selected. + Traces traceList + Family string + Bucket int + Expanded bool + Traced bool + Active bool + ShowSensitive bool // whether to show sensitive events + + Histogram template.HTML + HistogramWindow string // e.g. "last minute", "last hour", "all time" + + // If non-zero, the set of traces is a partial set, + // and this is the total number. + Total int + }{ + CompletedTraces: completedTraces, + } + + data.ShowSensitive = sensitive + if req != nil { + // Allow show_sensitive=0 to force hiding of sensitive data for testing. + // This only goes one way; you can't use show_sensitive=1 to see things. + if req.FormValue("show_sensitive") == "0" { + data.ShowSensitive = false + } + + if exp, err := strconv.ParseBool(req.FormValue("exp")); err == nil { + data.Expanded = exp + } + if exp, err := strconv.ParseBool(req.FormValue("rtraced")); err == nil { + data.Traced = exp + } + } + + completedMu.RLock() + data.Families = make([]string, 0, len(completedTraces)) + for fam := range completedTraces { + data.Families = append(data.Families, fam) + } + completedMu.RUnlock() + sort.Strings(data.Families) + + // We are careful here to minimize the time spent locking activeMu, + // since that lock is required every time an RPC starts and finishes. + data.ActiveTraceCount = make(map[string]int, len(data.Families)) + activeMu.RLock() + for fam, s := range activeTraces { + data.ActiveTraceCount[fam] = s.Len() + } + activeMu.RUnlock() + + var ok bool + data.Family, data.Bucket, ok = parseArgs(req) + switch { + case !ok: + // No-op + case data.Bucket == -1: + data.Active = true + n := data.ActiveTraceCount[data.Family] + data.Traces = getActiveTraces(data.Family) + if len(data.Traces) < n { + data.Total = n + } + case data.Bucket < bucketsPerFamily: + if b := lookupBucket(data.Family, data.Bucket); b != nil { + data.Traces = b.Copy(data.Traced) + } + default: + if f := getFamily(data.Family, false); f != nil { + var obs timeseries.Observable + f.LatencyMu.RLock() + switch o := data.Bucket - bucketsPerFamily; o { + case 0: + obs = f.Latency.Minute() + data.HistogramWindow = "last minute" + case 1: + obs = f.Latency.Hour() + data.HistogramWindow = "last hour" + case 2: + obs = f.Latency.Total() + data.HistogramWindow = "all time" + } + f.LatencyMu.RUnlock() + if obs != nil { + data.Histogram = obs.(*histogram).html() + } + } + } + + if data.Traces != nil { + defer data.Traces.Free() + sort.Sort(data.Traces) + } + + completedMu.RLock() + defer completedMu.RUnlock() + if err := pageTmpl().ExecuteTemplate(w, "Page", data); err != nil { + log.Printf("net/trace: Failed executing template: %v", err) + } +} + +func parseArgs(req *http.Request) (fam string, b int, ok bool) { + if req == nil { + return "", 0, false + } + fam, bStr := req.FormValue("fam"), req.FormValue("b") + if fam == "" || bStr == "" { + return "", 0, false + } + b, err := strconv.Atoi(bStr) + if err != nil || b < -1 { + return "", 0, false + } + + return fam, b, true +} + +func lookupBucket(fam string, b int) *traceBucket { + f := getFamily(fam, false) + if f == nil || b < 0 || b >= len(f.Buckets) { + return nil + } + return f.Buckets[b] +} + +type contextKeyT string + +var contextKey = contextKeyT("golang.org/x/net/trace.Trace") + +// Trace represents an active request. +type Trace interface { + // LazyLog adds x to the event log. It will be evaluated each time the + // /debug/requests page is rendered. Any memory referenced by x will be + // pinned until the trace is finished and later discarded. + LazyLog(x fmt.Stringer, sensitive bool) + + // LazyPrintf evaluates its arguments with fmt.Sprintf each time the + // /debug/requests page is rendered. Any memory referenced by a will be + // pinned until the trace is finished and later discarded. + LazyPrintf(format string, a ...interface{}) + + // SetError declares that this trace resulted in an error. + SetError() + + // SetRecycler sets a recycler for the trace. + // f will be called for each event passed to LazyLog at a time when + // it is no longer required, whether while the trace is still active + // and the event is discarded, or when a completed trace is discarded. + SetRecycler(f func(interface{})) + + // SetTraceInfo sets the trace info for the trace. + // This is currently unused. + SetTraceInfo(traceID, spanID uint64) + + // SetMaxEvents sets the maximum number of events that will be stored + // in the trace. This has no effect if any events have already been + // added to the trace. + SetMaxEvents(m int) + + // Finish declares that this trace is complete. + // The trace should not be used after calling this method. + Finish() +} + +type lazySprintf struct { + format string + a []interface{} +} + +func (l *lazySprintf) String() string { + return fmt.Sprintf(l.format, l.a...) +} + +// New returns a new Trace with the specified family and title. +func New(family, title string) Trace { + tr := newTrace() + tr.ref() + tr.Family, tr.Title = family, title + tr.Start = time.Now() + tr.maxEvents = maxEventsPerTrace + tr.events = tr.eventsBuf[:0] + + activeMu.RLock() + s := activeTraces[tr.Family] + activeMu.RUnlock() + if s == nil { + activeMu.Lock() + s = activeTraces[tr.Family] // check again + if s == nil { + s = new(traceSet) + activeTraces[tr.Family] = s + } + activeMu.Unlock() + } + s.Add(tr) + + // Trigger allocation of the completed trace structure for this family. + // This will cause the family to be present in the request page during + // the first trace of this family. We don't care about the return value, + // nor is there any need for this to run inline, so we execute it in its + // own goroutine, but only if the family isn't allocated yet. + completedMu.RLock() + if _, ok := completedTraces[tr.Family]; !ok { + go allocFamily(tr.Family) + } + completedMu.RUnlock() + + return tr +} + +func (tr *trace) Finish() { + tr.Elapsed = time.Now().Sub(tr.Start) + if DebugUseAfterFinish { + buf := make([]byte, 4<<10) // 4 KB should be enough + n := runtime.Stack(buf, false) + tr.finishStack = buf[:n] + } + + activeMu.RLock() + m := activeTraces[tr.Family] + activeMu.RUnlock() + m.Remove(tr) + + f := getFamily(tr.Family, true) + for _, b := range f.Buckets { + if b.Cond.match(tr) { + b.Add(tr) + } + } + // Add a sample of elapsed time as microseconds to the family's timeseries + h := new(histogram) + h.addMeasurement(tr.Elapsed.Nanoseconds() / 1e3) + f.LatencyMu.Lock() + f.Latency.Add(h) + f.LatencyMu.Unlock() + + tr.unref() // matches ref in New +} + +const ( + bucketsPerFamily = 9 + tracesPerBucket = 10 + maxActiveTraces = 20 // Maximum number of active traces to show. + maxEventsPerTrace = 10 + numHistogramBuckets = 38 +) + +var ( + // The active traces. + activeMu sync.RWMutex + activeTraces = make(map[string]*traceSet) // family -> traces + + // Families of completed traces. + completedMu sync.RWMutex + completedTraces = make(map[string]*family) // family -> traces +) + +type traceSet struct { + mu sync.RWMutex + m map[*trace]bool + + // We could avoid the entire map scan in FirstN by having a slice of all the traces + // ordered by start time, and an index into that from the trace struct, with a periodic + // repack of the slice after enough traces finish; we could also use a skip list or similar. + // However, that would shift some of the expense from /debug/requests time to RPC time, + // which is probably the wrong trade-off. +} + +func (ts *traceSet) Len() int { + ts.mu.RLock() + defer ts.mu.RUnlock() + return len(ts.m) +} + +func (ts *traceSet) Add(tr *trace) { + ts.mu.Lock() + if ts.m == nil { + ts.m = make(map[*trace]bool) + } + ts.m[tr] = true + ts.mu.Unlock() +} + +func (ts *traceSet) Remove(tr *trace) { + ts.mu.Lock() + delete(ts.m, tr) + ts.mu.Unlock() +} + +// FirstN returns the first n traces ordered by time. +func (ts *traceSet) FirstN(n int) traceList { + ts.mu.RLock() + defer ts.mu.RUnlock() + + if n > len(ts.m) { + n = len(ts.m) + } + trl := make(traceList, 0, n) + + // Fast path for when no selectivity is needed. + if n == len(ts.m) { + for tr := range ts.m { + tr.ref() + trl = append(trl, tr) + } + sort.Sort(trl) + return trl + } + + // Pick the oldest n traces. + // This is inefficient. See the comment in the traceSet struct. + for tr := range ts.m { + // Put the first n traces into trl in the order they occur. + // When we have n, sort trl, and thereafter maintain its order. + if len(trl) < n { + tr.ref() + trl = append(trl, tr) + if len(trl) == n { + // This is guaranteed to happen exactly once during this loop. + sort.Sort(trl) + } + continue + } + if tr.Start.After(trl[n-1].Start) { + continue + } + + // Find where to insert this one. + tr.ref() + i := sort.Search(n, func(i int) bool { return trl[i].Start.After(tr.Start) }) + trl[n-1].unref() + copy(trl[i+1:], trl[i:]) + trl[i] = tr + } + + return trl +} + +func getActiveTraces(fam string) traceList { + activeMu.RLock() + s := activeTraces[fam] + activeMu.RUnlock() + if s == nil { + return nil + } + return s.FirstN(maxActiveTraces) +} + +func getFamily(fam string, allocNew bool) *family { + completedMu.RLock() + f := completedTraces[fam] + completedMu.RUnlock() + if f == nil && allocNew { + f = allocFamily(fam) + } + return f +} + +func allocFamily(fam string) *family { + completedMu.Lock() + defer completedMu.Unlock() + f := completedTraces[fam] + if f == nil { + f = newFamily() + completedTraces[fam] = f + } + return f +} + +// family represents a set of trace buckets and associated latency information. +type family struct { + // traces may occur in multiple buckets. + Buckets [bucketsPerFamily]*traceBucket + + // latency time series + LatencyMu sync.RWMutex + Latency *timeseries.MinuteHourSeries +} + +func newFamily() *family { + return &family{ + Buckets: [bucketsPerFamily]*traceBucket{ + {Cond: minCond(0)}, + {Cond: minCond(50 * time.Millisecond)}, + {Cond: minCond(100 * time.Millisecond)}, + {Cond: minCond(200 * time.Millisecond)}, + {Cond: minCond(500 * time.Millisecond)}, + {Cond: minCond(1 * time.Second)}, + {Cond: minCond(10 * time.Second)}, + {Cond: minCond(100 * time.Second)}, + {Cond: errorCond{}}, + }, + Latency: timeseries.NewMinuteHourSeries(func() timeseries.Observable { return new(histogram) }), + } +} + +// traceBucket represents a size-capped bucket of historic traces, +// along with a condition for a trace to belong to the bucket. +type traceBucket struct { + Cond cond + + // Ring buffer implementation of a fixed-size FIFO queue. + mu sync.RWMutex + buf [tracesPerBucket]*trace + start int // < tracesPerBucket + length int // <= tracesPerBucket +} + +func (b *traceBucket) Add(tr *trace) { + b.mu.Lock() + defer b.mu.Unlock() + + i := b.start + b.length + if i >= tracesPerBucket { + i -= tracesPerBucket + } + if b.length == tracesPerBucket { + // "Remove" an element from the bucket. + b.buf[i].unref() + b.start++ + if b.start == tracesPerBucket { + b.start = 0 + } + } + b.buf[i] = tr + if b.length < tracesPerBucket { + b.length++ + } + tr.ref() +} + +// Copy returns a copy of the traces in the bucket. +// If tracedOnly is true, only the traces with trace information will be returned. +// The logs will be ref'd before returning; the caller should call +// the Free method when it is done with them. +// TODO(dsymonds): keep track of traced requests in separate buckets. +func (b *traceBucket) Copy(tracedOnly bool) traceList { + b.mu.RLock() + defer b.mu.RUnlock() + + trl := make(traceList, 0, b.length) + for i, x := 0, b.start; i < b.length; i++ { + tr := b.buf[x] + if !tracedOnly || tr.spanID != 0 { + tr.ref() + trl = append(trl, tr) + } + x++ + if x == b.length { + x = 0 + } + } + return trl +} + +func (b *traceBucket) Empty() bool { + b.mu.RLock() + defer b.mu.RUnlock() + return b.length == 0 +} + +// cond represents a condition on a trace. +type cond interface { + match(t *trace) bool + String() string +} + +type minCond time.Duration + +func (m minCond) match(t *trace) bool { return t.Elapsed >= time.Duration(m) } +func (m minCond) String() string { return fmt.Sprintf("≥%gs", time.Duration(m).Seconds()) } + +type errorCond struct{} + +func (e errorCond) match(t *trace) bool { return t.IsError } +func (e errorCond) String() string { return "errors" } + +type traceList []*trace + +// Free calls unref on each element of the list. +func (trl traceList) Free() { + for _, t := range trl { + t.unref() + } +} + +// traceList may be sorted in reverse chronological order. +func (trl traceList) Len() int { return len(trl) } +func (trl traceList) Less(i, j int) bool { return trl[i].Start.After(trl[j].Start) } +func (trl traceList) Swap(i, j int) { trl[i], trl[j] = trl[j], trl[i] } + +// An event is a timestamped log entry in a trace. +type event struct { + When time.Time + Elapsed time.Duration // since previous event in trace + NewDay bool // whether this event is on a different day to the previous event + Recyclable bool // whether this event was passed via LazyLog + Sensitive bool // whether this event contains sensitive information + What interface{} // string or fmt.Stringer +} + +// WhenString returns a string representation of the elapsed time of the event. +// It will include the date if midnight was crossed. +func (e event) WhenString() string { + if e.NewDay { + return e.When.Format("2006/01/02 15:04:05.000000") + } + return e.When.Format("15:04:05.000000") +} + +// discarded represents a number of discarded events. +// It is stored as *discarded to make it easier to update in-place. +type discarded int + +func (d *discarded) String() string { + return fmt.Sprintf("(%d events discarded)", int(*d)) +} + +// trace represents an active or complete request, +// either sent or received by this program. +type trace struct { + // Family is the top-level grouping of traces to which this belongs. + Family string + + // Title is the title of this trace. + Title string + + // Timing information. + Start time.Time + Elapsed time.Duration // zero while active + + // Trace information if non-zero. + traceID uint64 + spanID uint64 + + // Whether this trace resulted in an error. + IsError bool + + // Append-only sequence of events (modulo discards). + mu sync.RWMutex + events []event + maxEvents int + + refs int32 // how many buckets this is in + recycler func(interface{}) + disc discarded // scratch space to avoid allocation + + finishStack []byte // where finish was called, if DebugUseAfterFinish is set + + eventsBuf [4]event // preallocated buffer in case we only log a few events +} + +func (tr *trace) reset() { + // Clear all but the mutex. Mutexes may not be copied, even when unlocked. + tr.Family = "" + tr.Title = "" + tr.Start = time.Time{} + tr.Elapsed = 0 + tr.traceID = 0 + tr.spanID = 0 + tr.IsError = false + tr.maxEvents = 0 + tr.events = nil + tr.refs = 0 + tr.recycler = nil + tr.disc = 0 + tr.finishStack = nil + for i := range tr.eventsBuf { + tr.eventsBuf[i] = event{} + } +} + +// delta returns the elapsed time since the last event or the trace start, +// and whether it spans midnight. +// L >= tr.mu +func (tr *trace) delta(t time.Time) (time.Duration, bool) { + if len(tr.events) == 0 { + return t.Sub(tr.Start), false + } + prev := tr.events[len(tr.events)-1].When + return t.Sub(prev), prev.Day() != t.Day() +} + +func (tr *trace) addEvent(x interface{}, recyclable, sensitive bool) { + if DebugUseAfterFinish && tr.finishStack != nil { + buf := make([]byte, 4<<10) // 4 KB should be enough + n := runtime.Stack(buf, false) + log.Printf("net/trace: trace used after finish:\nFinished at:\n%s\nUsed at:\n%s", tr.finishStack, buf[:n]) + } + + /* + NOTE TO DEBUGGERS + + If you are here because your program panicked in this code, + it is almost definitely the fault of code using this package, + and very unlikely to be the fault of this code. + + The most likely scenario is that some code elsewhere is using + a trace.Trace after its Finish method is called. + You can temporarily set the DebugUseAfterFinish var + to help discover where that is; do not leave that var set, + since it makes this package much less efficient. + */ + + e := event{When: time.Now(), What: x, Recyclable: recyclable, Sensitive: sensitive} + tr.mu.Lock() + e.Elapsed, e.NewDay = tr.delta(e.When) + if len(tr.events) < tr.maxEvents { + tr.events = append(tr.events, e) + } else { + // Discard the middle events. + di := int((tr.maxEvents - 1) / 2) + if d, ok := tr.events[di].What.(*discarded); ok { + (*d)++ + } else { + // disc starts at two to count for the event it is replacing, + // plus the next one that we are about to drop. + tr.disc = 2 + if tr.recycler != nil && tr.events[di].Recyclable { + go tr.recycler(tr.events[di].What) + } + tr.events[di].What = &tr.disc + } + // The timestamp of the discarded meta-event should be + // the time of the last event it is representing. + tr.events[di].When = tr.events[di+1].When + + if tr.recycler != nil && tr.events[di+1].Recyclable { + go tr.recycler(tr.events[di+1].What) + } + copy(tr.events[di+1:], tr.events[di+2:]) + tr.events[tr.maxEvents-1] = e + } + tr.mu.Unlock() +} + +func (tr *trace) LazyLog(x fmt.Stringer, sensitive bool) { + tr.addEvent(x, true, sensitive) +} + +func (tr *trace) LazyPrintf(format string, a ...interface{}) { + tr.addEvent(&lazySprintf{format, a}, false, false) +} + +func (tr *trace) SetError() { tr.IsError = true } + +func (tr *trace) SetRecycler(f func(interface{})) { + tr.recycler = f +} + +func (tr *trace) SetTraceInfo(traceID, spanID uint64) { + tr.traceID, tr.spanID = traceID, spanID +} + +func (tr *trace) SetMaxEvents(m int) { + // Always keep at least three events: first, discarded count, last. + if len(tr.events) == 0 && m > 3 { + tr.maxEvents = m + } +} + +func (tr *trace) ref() { + atomic.AddInt32(&tr.refs, 1) +} + +func (tr *trace) unref() { + if atomic.AddInt32(&tr.refs, -1) == 0 { + if tr.recycler != nil { + // freeTrace clears tr, so we hold tr.recycler and tr.events here. + go func(f func(interface{}), es []event) { + for _, e := range es { + if e.Recyclable { + f(e.What) + } + } + }(tr.recycler, tr.events) + } + + freeTrace(tr) + } +} + +func (tr *trace) When() string { + return tr.Start.Format("2006/01/02 15:04:05.000000") +} + +func (tr *trace) ElapsedTime() string { + t := tr.Elapsed + if t == 0 { + // Active trace. + t = time.Since(tr.Start) + } + return fmt.Sprintf("%.6f", t.Seconds()) +} + +func (tr *trace) Events() []event { + tr.mu.RLock() + defer tr.mu.RUnlock() + return tr.events +} + +var traceFreeList = make(chan *trace, 1000) // TODO(dsymonds): Use sync.Pool? + +// newTrace returns a trace ready to use. +func newTrace() *trace { + select { + case tr := <-traceFreeList: + return tr + default: + return new(trace) + } +} + +// freeTrace adds tr to traceFreeList if there's room. +// This is non-blocking. +func freeTrace(tr *trace) { + if DebugUseAfterFinish { + return // never reuse + } + tr.reset() + select { + case traceFreeList <- tr: + default: + } +} + +func elapsed(d time.Duration) string { + b := []byte(fmt.Sprintf("%.6f", d.Seconds())) + + // For subsecond durations, blank all zeros before decimal point, + // and all zeros between the decimal point and the first non-zero digit. + if d < time.Second { + dot := bytes.IndexByte(b, '.') + for i := 0; i < dot; i++ { + b[i] = ' ' + } + for i := dot + 1; i < len(b); i++ { + if b[i] == '0' { + b[i] = ' ' + } else { + break + } + } + } + + return string(b) +} + +var pageTmplCache *template.Template +var pageTmplOnce sync.Once + +func pageTmpl() *template.Template { + pageTmplOnce.Do(func() { + pageTmplCache = template.Must(template.New("Page").Funcs(template.FuncMap{ + "elapsed": elapsed, + "add": func(a, b int) int { return a + b }, + }).Parse(pageHTML)) + }) + return pageTmplCache +} + +const pageHTML = ` +{{template "Prolog" .}} +{{template "StatusTable" .}} +{{template "Epilog" .}} + +{{define "Prolog"}} + + + /debug/requests + + + + +

    /debug/requests

    +{{end}} {{/* end of Prolog */}} + +{{define "StatusTable"}} + + {{range $fam := .Families}} + + + + {{$n := index $.ActiveTraceCount $fam}} + + + {{$f := index $.CompletedTraces $fam}} + {{range $i, $b := $f.Buckets}} + {{$empty := $b.Empty}} + + {{end}} + + {{$nb := len $f.Buckets}} + + + + + + {{end}} +
    {{$fam}} + {{if $n}}{{end}} + [{{$n}} active] + {{if $n}}{{end}} + + {{if not $empty}}{{end}} + [{{.Cond}}] + {{if not $empty}}{{end}} + + [minute] + + [hour] + + [total] +
    +{{end}} {{/* end of StatusTable */}} + +{{define "Epilog"}} +{{if $.Traces}} +
    +

    Family: {{$.Family}}

    + +{{if or $.Expanded $.Traced}} + [Normal/Summary] +{{else}} + [Normal/Summary] +{{end}} + +{{if or (not $.Expanded) $.Traced}} + [Normal/Expanded] +{{else}} + [Normal/Expanded] +{{end}} + +{{if not $.Active}} + {{if or $.Expanded (not $.Traced)}} + [Traced/Summary] + {{else}} + [Traced/Summary] + {{end}} + {{if or (not $.Expanded) (not $.Traced)}} + [Traced/Expanded] + {{else}} + [Traced/Expanded] + {{end}} +{{end}} + +{{if $.Total}} +

    Showing {{len $.Traces}} of {{$.Total}} traces.

    +{{end}} + + + + + {{range $tr := $.Traces}} + + + + + {{/* TODO: include traceID/spanID */}} + + {{if $.Expanded}} + {{range $tr.Events}} + + + + + + {{end}} + {{end}} + {{end}} +
    + {{if $.Active}}Active{{else}}Completed{{end}} Requests +
    WhenElapsed (s)
    {{$tr.When}}{{$tr.ElapsedTime}}{{$tr.Title}}
    {{.WhenString}}{{elapsed .Elapsed}}{{if or $.ShowSensitive (not .Sensitive)}}... {{.What}}{{else}}[redacted]{{end}}
    +{{end}} {{/* if $.Traces */}} + +{{if $.Histogram}} +

    Latency (µs) of {{$.Family}} over {{$.HistogramWindow}}

    +{{$.Histogram}} +{{end}} {{/* if $.Histogram */}} + + + +{{end}} {{/* end of Epilog */}} +` diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/trace/trace_go16.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/trace/trace_go16.go new file mode 100644 index 0000000..d608191 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/trace/trace_go16.go @@ -0,0 +1,21 @@ +// 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. + +// +build !go1.7 + +package trace + +import "golang.org/x/net/context" + +// NewContext returns a copy of the parent context +// and associates it with a Trace. +func NewContext(ctx context.Context, tr Trace) context.Context { + return context.WithValue(ctx, contextKey, tr) +} + +// FromContext returns the Trace bound to the context, if any. +func FromContext(ctx context.Context) (tr Trace, ok bool) { + tr, ok = ctx.Value(contextKey).(Trace) + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/trace/trace_go17.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/trace/trace_go17.go new file mode 100644 index 0000000..df6e1fb --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/trace/trace_go17.go @@ -0,0 +1,21 @@ +// 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. + +// +build go1.7 + +package trace + +import "context" + +// NewContext returns a copy of the parent context +// and associates it with a Trace. +func NewContext(ctx context.Context, tr Trace) context.Context { + return context.WithValue(ctx, contextKey, tr) +} + +// FromContext returns the Trace bound to the context, if any. +func FromContext(ctx context.Context) (tr Trace, ok bool) { + tr, ok = ctx.Value(contextKey).(Trace) + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/trace/trace_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/trace/trace_test.go new file mode 100644 index 0000000..bfd9dfe --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/trace/trace_test.go @@ -0,0 +1,178 @@ +// Copyright 2015 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 trace + +import ( + "net/http" + "reflect" + "testing" +) + +type s struct{} + +func (s) String() string { return "lazy string" } + +// TestReset checks whether all the fields are zeroed after reset. +func TestReset(t *testing.T) { + tr := New("foo", "bar") + tr.LazyLog(s{}, false) + tr.LazyPrintf("%d", 1) + tr.SetRecycler(func(_ interface{}) {}) + tr.SetTraceInfo(3, 4) + tr.SetMaxEvents(100) + tr.SetError() + tr.Finish() + + tr.(*trace).reset() + + if !reflect.DeepEqual(tr, new(trace)) { + t.Errorf("reset didn't clear all fields: %+v", tr) + } +} + +// TestResetLog checks whether all the fields are zeroed after reset. +func TestResetLog(t *testing.T) { + el := NewEventLog("foo", "bar") + el.Printf("message") + el.Errorf("error") + el.Finish() + + el.(*eventLog).reset() + + if !reflect.DeepEqual(el, new(eventLog)) { + t.Errorf("reset didn't clear all fields: %+v", el) + } +} + +func TestAuthRequest(t *testing.T) { + testCases := []struct { + host string + want bool + }{ + {host: "192.168.23.1", want: false}, + {host: "192.168.23.1:8080", want: false}, + {host: "malformed remote addr", want: false}, + {host: "localhost", want: true}, + {host: "localhost:8080", want: true}, + {host: "127.0.0.1", want: true}, + {host: "127.0.0.1:8080", want: true}, + {host: "::1", want: true}, + {host: "[::1]:8080", want: true}, + } + for _, tt := range testCases { + req := &http.Request{RemoteAddr: tt.host} + any, sensitive := AuthRequest(req) + if any != tt.want || sensitive != tt.want { + t.Errorf("AuthRequest(%q) = %t, %t; want %t, %t", tt.host, any, sensitive, tt.want, tt.want) + } + } +} + +// TestParseTemplate checks that all templates used by this package are valid +// as they are parsed on first usage +func TestParseTemplate(t *testing.T) { + if tmpl := distTmpl(); tmpl == nil { + t.Error("invalid template returned from distTmpl()") + } + if tmpl := pageTmpl(); tmpl == nil { + t.Error("invalid template returned from pageTmpl()") + } + if tmpl := eventsTmpl(); tmpl == nil { + t.Error("invalid template returned from eventsTmpl()") + } +} + +func benchmarkTrace(b *testing.B, maxEvents, numEvents int) { + numSpans := (b.N + numEvents + 1) / numEvents + + for i := 0; i < numSpans; i++ { + tr := New("test", "test") + tr.SetMaxEvents(maxEvents) + for j := 0; j < numEvents; j++ { + tr.LazyPrintf("%d", j) + } + tr.Finish() + } +} + +func BenchmarkTrace_Default_2(b *testing.B) { + benchmarkTrace(b, 0, 2) +} + +func BenchmarkTrace_Default_10(b *testing.B) { + benchmarkTrace(b, 0, 10) +} + +func BenchmarkTrace_Default_100(b *testing.B) { + benchmarkTrace(b, 0, 100) +} + +func BenchmarkTrace_Default_1000(b *testing.B) { + benchmarkTrace(b, 0, 1000) +} + +func BenchmarkTrace_Default_10000(b *testing.B) { + benchmarkTrace(b, 0, 10000) +} + +func BenchmarkTrace_10_2(b *testing.B) { + benchmarkTrace(b, 10, 2) +} + +func BenchmarkTrace_10_10(b *testing.B) { + benchmarkTrace(b, 10, 10) +} + +func BenchmarkTrace_10_100(b *testing.B) { + benchmarkTrace(b, 10, 100) +} + +func BenchmarkTrace_10_1000(b *testing.B) { + benchmarkTrace(b, 10, 1000) +} + +func BenchmarkTrace_10_10000(b *testing.B) { + benchmarkTrace(b, 10, 10000) +} + +func BenchmarkTrace_100_2(b *testing.B) { + benchmarkTrace(b, 100, 2) +} + +func BenchmarkTrace_100_10(b *testing.B) { + benchmarkTrace(b, 100, 10) +} + +func BenchmarkTrace_100_100(b *testing.B) { + benchmarkTrace(b, 100, 100) +} + +func BenchmarkTrace_100_1000(b *testing.B) { + benchmarkTrace(b, 100, 1000) +} + +func BenchmarkTrace_100_10000(b *testing.B) { + benchmarkTrace(b, 100, 10000) +} + +func BenchmarkTrace_1000_2(b *testing.B) { + benchmarkTrace(b, 1000, 2) +} + +func BenchmarkTrace_1000_10(b *testing.B) { + benchmarkTrace(b, 1000, 10) +} + +func BenchmarkTrace_1000_100(b *testing.B) { + benchmarkTrace(b, 1000, 100) +} + +func BenchmarkTrace_1000_1000(b *testing.B) { + benchmarkTrace(b, 1000, 1000) +} + +func BenchmarkTrace_1000_10000(b *testing.B) { + benchmarkTrace(b, 1000, 10000) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/file.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/file.go new file mode 100644 index 0000000..748118d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/file.go @@ -0,0 +1,796 @@ +// 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 webdav + +import ( + "encoding/xml" + "io" + "net/http" + "os" + "path" + "path/filepath" + "strings" + "sync" + "time" + + "golang.org/x/net/context" +) + +// slashClean is equivalent to but slightly more efficient than +// path.Clean("/" + name). +func slashClean(name string) string { + if name == "" || name[0] != '/' { + name = "/" + name + } + return path.Clean(name) +} + +// A FileSystem implements access to a collection of named files. The elements +// in a file path are separated by slash ('/', U+002F) characters, regardless +// of host operating system convention. +// +// Each method has the same semantics as the os package's function of the same +// name. +// +// Note that the os.Rename documentation says that "OS-specific restrictions +// might apply". In particular, whether or not renaming a file or directory +// overwriting another existing file or directory is an error is OS-dependent. +type FileSystem interface { + Mkdir(ctx context.Context, name string, perm os.FileMode) error + OpenFile(ctx context.Context, name string, flag int, perm os.FileMode) (File, error) + RemoveAll(ctx context.Context, name string) error + Rename(ctx context.Context, oldName, newName string) error + Stat(ctx context.Context, name string) (os.FileInfo, error) +} + +// A File is returned by a FileSystem's OpenFile method and can be served by a +// Handler. +// +// A File may optionally implement the DeadPropsHolder interface, if it can +// load and save dead properties. +type File interface { + http.File + io.Writer +} + +// A Dir implements FileSystem using the native file system restricted to a +// specific directory tree. +// +// While the FileSystem.OpenFile method takes '/'-separated paths, a Dir's +// string value is a filename on the native file system, not a URL, so it is +// separated by filepath.Separator, which isn't necessarily '/'. +// +// An empty Dir is treated as ".". +type Dir string + +func (d Dir) resolve(name string) string { + // This implementation is based on Dir.Open's code in the standard net/http package. + if filepath.Separator != '/' && strings.IndexRune(name, filepath.Separator) >= 0 || + strings.Contains(name, "\x00") { + return "" + } + dir := string(d) + if dir == "" { + dir = "." + } + return filepath.Join(dir, filepath.FromSlash(slashClean(name))) +} + +func (d Dir) Mkdir(ctx context.Context, name string, perm os.FileMode) error { + if name = d.resolve(name); name == "" { + return os.ErrNotExist + } + return os.Mkdir(name, perm) +} + +func (d Dir) OpenFile(ctx context.Context, name string, flag int, perm os.FileMode) (File, error) { + if name = d.resolve(name); name == "" { + return nil, os.ErrNotExist + } + f, err := os.OpenFile(name, flag, perm) + if err != nil { + return nil, err + } + return f, nil +} + +func (d Dir) RemoveAll(ctx context.Context, name string) error { + if name = d.resolve(name); name == "" { + return os.ErrNotExist + } + if name == filepath.Clean(string(d)) { + // Prohibit removing the virtual root directory. + return os.ErrInvalid + } + return os.RemoveAll(name) +} + +func (d Dir) Rename(ctx context.Context, oldName, newName string) error { + if oldName = d.resolve(oldName); oldName == "" { + return os.ErrNotExist + } + if newName = d.resolve(newName); newName == "" { + return os.ErrNotExist + } + if root := filepath.Clean(string(d)); root == oldName || root == newName { + // Prohibit renaming from or to the virtual root directory. + return os.ErrInvalid + } + return os.Rename(oldName, newName) +} + +func (d Dir) Stat(ctx context.Context, name string) (os.FileInfo, error) { + if name = d.resolve(name); name == "" { + return nil, os.ErrNotExist + } + return os.Stat(name) +} + +// NewMemFS returns a new in-memory FileSystem implementation. +func NewMemFS() FileSystem { + return &memFS{ + root: memFSNode{ + children: make(map[string]*memFSNode), + mode: 0660 | os.ModeDir, + modTime: time.Now(), + }, + } +} + +// A memFS implements FileSystem, storing all metadata and actual file data +// in-memory. No limits on filesystem size are used, so it is not recommended +// this be used where the clients are untrusted. +// +// Concurrent access is permitted. The tree structure is protected by a mutex, +// and each node's contents and metadata are protected by a per-node mutex. +// +// TODO: Enforce file permissions. +type memFS struct { + mu sync.Mutex + root memFSNode +} + +// TODO: clean up and rationalize the walk/find code. + +// walk walks the directory tree for the fullname, calling f at each step. If f +// returns an error, the walk will be aborted and return that same error. +// +// dir is the directory at that step, frag is the name fragment, and final is +// whether it is the final step. For example, walking "/foo/bar/x" will result +// in 3 calls to f: +// - "/", "foo", false +// - "/foo/", "bar", false +// - "/foo/bar/", "x", true +// The frag argument will be empty only if dir is the root node and the walk +// ends at that root node. +func (fs *memFS) walk(op, fullname string, f func(dir *memFSNode, frag string, final bool) error) error { + original := fullname + fullname = slashClean(fullname) + + // Strip any leading "/"s to make fullname a relative path, as the walk + // starts at fs.root. + if fullname[0] == '/' { + fullname = fullname[1:] + } + dir := &fs.root + + for { + frag, remaining := fullname, "" + i := strings.IndexRune(fullname, '/') + final := i < 0 + if !final { + frag, remaining = fullname[:i], fullname[i+1:] + } + if frag == "" && dir != &fs.root { + panic("webdav: empty path fragment for a clean path") + } + if err := f(dir, frag, final); err != nil { + return &os.PathError{ + Op: op, + Path: original, + Err: err, + } + } + if final { + break + } + child := dir.children[frag] + if child == nil { + return &os.PathError{ + Op: op, + Path: original, + Err: os.ErrNotExist, + } + } + if !child.mode.IsDir() { + return &os.PathError{ + Op: op, + Path: original, + Err: os.ErrInvalid, + } + } + dir, fullname = child, remaining + } + return nil +} + +// find returns the parent of the named node and the relative name fragment +// from the parent to the child. For example, if finding "/foo/bar/baz" then +// parent will be the node for "/foo/bar" and frag will be "baz". +// +// If the fullname names the root node, then parent, frag and err will be zero. +// +// find returns an error if the parent does not already exist or the parent +// isn't a directory, but it will not return an error per se if the child does +// not already exist. The error returned is either nil or an *os.PathError +// whose Op is op. +func (fs *memFS) find(op, fullname string) (parent *memFSNode, frag string, err error) { + err = fs.walk(op, fullname, func(parent0 *memFSNode, frag0 string, final bool) error { + if !final { + return nil + } + if frag0 != "" { + parent, frag = parent0, frag0 + } + return nil + }) + return parent, frag, err +} + +func (fs *memFS) Mkdir(ctx context.Context, name string, perm os.FileMode) error { + fs.mu.Lock() + defer fs.mu.Unlock() + + dir, frag, err := fs.find("mkdir", name) + if err != nil { + return err + } + if dir == nil { + // We can't create the root. + return os.ErrInvalid + } + if _, ok := dir.children[frag]; ok { + return os.ErrExist + } + dir.children[frag] = &memFSNode{ + children: make(map[string]*memFSNode), + mode: perm.Perm() | os.ModeDir, + modTime: time.Now(), + } + return nil +} + +func (fs *memFS) OpenFile(ctx context.Context, name string, flag int, perm os.FileMode) (File, error) { + fs.mu.Lock() + defer fs.mu.Unlock() + + dir, frag, err := fs.find("open", name) + if err != nil { + return nil, err + } + var n *memFSNode + if dir == nil { + // We're opening the root. + if flag&(os.O_WRONLY|os.O_RDWR) != 0 { + return nil, os.ErrPermission + } + n, frag = &fs.root, "/" + + } else { + n = dir.children[frag] + if flag&(os.O_SYNC|os.O_APPEND) != 0 { + // memFile doesn't support these flags yet. + return nil, os.ErrInvalid + } + if flag&os.O_CREATE != 0 { + if flag&os.O_EXCL != 0 && n != nil { + return nil, os.ErrExist + } + if n == nil { + n = &memFSNode{ + mode: perm.Perm(), + } + dir.children[frag] = n + } + } + if n == nil { + return nil, os.ErrNotExist + } + if flag&(os.O_WRONLY|os.O_RDWR) != 0 && flag&os.O_TRUNC != 0 { + n.mu.Lock() + n.data = nil + n.mu.Unlock() + } + } + + children := make([]os.FileInfo, 0, len(n.children)) + for cName, c := range n.children { + children = append(children, c.stat(cName)) + } + return &memFile{ + n: n, + nameSnapshot: frag, + childrenSnapshot: children, + }, nil +} + +func (fs *memFS) RemoveAll(ctx context.Context, name string) error { + fs.mu.Lock() + defer fs.mu.Unlock() + + dir, frag, err := fs.find("remove", name) + if err != nil { + return err + } + if dir == nil { + // We can't remove the root. + return os.ErrInvalid + } + delete(dir.children, frag) + return nil +} + +func (fs *memFS) Rename(ctx context.Context, oldName, newName string) error { + fs.mu.Lock() + defer fs.mu.Unlock() + + oldName = slashClean(oldName) + newName = slashClean(newName) + if oldName == newName { + return nil + } + if strings.HasPrefix(newName, oldName+"/") { + // We can't rename oldName to be a sub-directory of itself. + return os.ErrInvalid + } + + oDir, oFrag, err := fs.find("rename", oldName) + if err != nil { + return err + } + if oDir == nil { + // We can't rename from the root. + return os.ErrInvalid + } + + nDir, nFrag, err := fs.find("rename", newName) + if err != nil { + return err + } + if nDir == nil { + // We can't rename to the root. + return os.ErrInvalid + } + + oNode, ok := oDir.children[oFrag] + if !ok { + return os.ErrNotExist + } + if oNode.children != nil { + if nNode, ok := nDir.children[nFrag]; ok { + if nNode.children == nil { + return errNotADirectory + } + if len(nNode.children) != 0 { + return errDirectoryNotEmpty + } + } + } + delete(oDir.children, oFrag) + nDir.children[nFrag] = oNode + return nil +} + +func (fs *memFS) Stat(ctx context.Context, name string) (os.FileInfo, error) { + fs.mu.Lock() + defer fs.mu.Unlock() + + dir, frag, err := fs.find("stat", name) + if err != nil { + return nil, err + } + if dir == nil { + // We're stat'ting the root. + return fs.root.stat("/"), nil + } + if n, ok := dir.children[frag]; ok { + return n.stat(path.Base(name)), nil + } + return nil, os.ErrNotExist +} + +// A memFSNode represents a single entry in the in-memory filesystem and also +// implements os.FileInfo. +type memFSNode struct { + // children is protected by memFS.mu. + children map[string]*memFSNode + + mu sync.Mutex + data []byte + mode os.FileMode + modTime time.Time + deadProps map[xml.Name]Property +} + +func (n *memFSNode) stat(name string) *memFileInfo { + n.mu.Lock() + defer n.mu.Unlock() + return &memFileInfo{ + name: name, + size: int64(len(n.data)), + mode: n.mode, + modTime: n.modTime, + } +} + +func (n *memFSNode) DeadProps() (map[xml.Name]Property, error) { + n.mu.Lock() + defer n.mu.Unlock() + if len(n.deadProps) == 0 { + return nil, nil + } + ret := make(map[xml.Name]Property, len(n.deadProps)) + for k, v := range n.deadProps { + ret[k] = v + } + return ret, nil +} + +func (n *memFSNode) Patch(patches []Proppatch) ([]Propstat, error) { + n.mu.Lock() + defer n.mu.Unlock() + pstat := Propstat{Status: http.StatusOK} + for _, patch := range patches { + for _, p := range patch.Props { + pstat.Props = append(pstat.Props, Property{XMLName: p.XMLName}) + if patch.Remove { + delete(n.deadProps, p.XMLName) + continue + } + if n.deadProps == nil { + n.deadProps = map[xml.Name]Property{} + } + n.deadProps[p.XMLName] = p + } + } + return []Propstat{pstat}, nil +} + +type memFileInfo struct { + name string + size int64 + mode os.FileMode + modTime time.Time +} + +func (f *memFileInfo) Name() string { return f.name } +func (f *memFileInfo) Size() int64 { return f.size } +func (f *memFileInfo) Mode() os.FileMode { return f.mode } +func (f *memFileInfo) ModTime() time.Time { return f.modTime } +func (f *memFileInfo) IsDir() bool { return f.mode.IsDir() } +func (f *memFileInfo) Sys() interface{} { return nil } + +// A memFile is a File implementation for a memFSNode. It is a per-file (not +// per-node) read/write position, and a snapshot of the memFS' tree structure +// (a node's name and children) for that node. +type memFile struct { + n *memFSNode + nameSnapshot string + childrenSnapshot []os.FileInfo + // pos is protected by n.mu. + pos int +} + +// A *memFile implements the optional DeadPropsHolder interface. +var _ DeadPropsHolder = (*memFile)(nil) + +func (f *memFile) DeadProps() (map[xml.Name]Property, error) { return f.n.DeadProps() } +func (f *memFile) Patch(patches []Proppatch) ([]Propstat, error) { return f.n.Patch(patches) } + +func (f *memFile) Close() error { + return nil +} + +func (f *memFile) Read(p []byte) (int, error) { + f.n.mu.Lock() + defer f.n.mu.Unlock() + if f.n.mode.IsDir() { + return 0, os.ErrInvalid + } + if f.pos >= len(f.n.data) { + return 0, io.EOF + } + n := copy(p, f.n.data[f.pos:]) + f.pos += n + return n, nil +} + +func (f *memFile) Readdir(count int) ([]os.FileInfo, error) { + f.n.mu.Lock() + defer f.n.mu.Unlock() + if !f.n.mode.IsDir() { + return nil, os.ErrInvalid + } + old := f.pos + if old >= len(f.childrenSnapshot) { + // The os.File Readdir docs say that at the end of a directory, + // the error is io.EOF if count > 0 and nil if count <= 0. + if count > 0 { + return nil, io.EOF + } + return nil, nil + } + if count > 0 { + f.pos += count + if f.pos > len(f.childrenSnapshot) { + f.pos = len(f.childrenSnapshot) + } + } else { + f.pos = len(f.childrenSnapshot) + old = 0 + } + return f.childrenSnapshot[old:f.pos], nil +} + +func (f *memFile) Seek(offset int64, whence int) (int64, error) { + f.n.mu.Lock() + defer f.n.mu.Unlock() + npos := f.pos + // TODO: How to handle offsets greater than the size of system int? + switch whence { + case os.SEEK_SET: + npos = int(offset) + case os.SEEK_CUR: + npos += int(offset) + case os.SEEK_END: + npos = len(f.n.data) + int(offset) + default: + npos = -1 + } + if npos < 0 { + return 0, os.ErrInvalid + } + f.pos = npos + return int64(f.pos), nil +} + +func (f *memFile) Stat() (os.FileInfo, error) { + return f.n.stat(f.nameSnapshot), nil +} + +func (f *memFile) Write(p []byte) (int, error) { + lenp := len(p) + f.n.mu.Lock() + defer f.n.mu.Unlock() + + if f.n.mode.IsDir() { + return 0, os.ErrInvalid + } + if f.pos < len(f.n.data) { + n := copy(f.n.data[f.pos:], p) + f.pos += n + p = p[n:] + } else if f.pos > len(f.n.data) { + // Write permits the creation of holes, if we've seek'ed past the + // existing end of file. + if f.pos <= cap(f.n.data) { + oldLen := len(f.n.data) + f.n.data = f.n.data[:f.pos] + hole := f.n.data[oldLen:] + for i := range hole { + hole[i] = 0 + } + } else { + d := make([]byte, f.pos, f.pos+len(p)) + copy(d, f.n.data) + f.n.data = d + } + } + + if len(p) > 0 { + // We should only get here if f.pos == len(f.n.data). + f.n.data = append(f.n.data, p...) + f.pos = len(f.n.data) + } + f.n.modTime = time.Now() + return lenp, nil +} + +// moveFiles moves files and/or directories from src to dst. +// +// See section 9.9.4 for when various HTTP status codes apply. +func moveFiles(ctx context.Context, fs FileSystem, src, dst string, overwrite bool) (status int, err error) { + created := false + if _, err := fs.Stat(ctx, dst); err != nil { + if !os.IsNotExist(err) { + return http.StatusForbidden, err + } + created = true + } else if overwrite { + // Section 9.9.3 says that "If a resource exists at the destination + // and the Overwrite header is "T", then prior to performing the move, + // the server must perform a DELETE with "Depth: infinity" on the + // destination resource. + if err := fs.RemoveAll(ctx, dst); err != nil { + return http.StatusForbidden, err + } + } else { + return http.StatusPreconditionFailed, os.ErrExist + } + if err := fs.Rename(ctx, src, dst); err != nil { + return http.StatusForbidden, err + } + if created { + return http.StatusCreated, nil + } + return http.StatusNoContent, nil +} + +func copyProps(dst, src File) error { + d, ok := dst.(DeadPropsHolder) + if !ok { + return nil + } + s, ok := src.(DeadPropsHolder) + if !ok { + return nil + } + m, err := s.DeadProps() + if err != nil { + return err + } + props := make([]Property, 0, len(m)) + for _, prop := range m { + props = append(props, prop) + } + _, err = d.Patch([]Proppatch{{Props: props}}) + return err +} + +// copyFiles copies files and/or directories from src to dst. +// +// See section 9.8.5 for when various HTTP status codes apply. +func copyFiles(ctx context.Context, fs FileSystem, src, dst string, overwrite bool, depth int, recursion int) (status int, err error) { + if recursion == 1000 { + return http.StatusInternalServerError, errRecursionTooDeep + } + recursion++ + + // TODO: section 9.8.3 says that "Note that an infinite-depth COPY of /A/ + // into /A/B/ could lead to infinite recursion if not handled correctly." + + srcFile, err := fs.OpenFile(ctx, src, os.O_RDONLY, 0) + if err != nil { + if os.IsNotExist(err) { + return http.StatusNotFound, err + } + return http.StatusInternalServerError, err + } + defer srcFile.Close() + srcStat, err := srcFile.Stat() + if err != nil { + if os.IsNotExist(err) { + return http.StatusNotFound, err + } + return http.StatusInternalServerError, err + } + srcPerm := srcStat.Mode() & os.ModePerm + + created := false + if _, err := fs.Stat(ctx, dst); err != nil { + if os.IsNotExist(err) { + created = true + } else { + return http.StatusForbidden, err + } + } else { + if !overwrite { + return http.StatusPreconditionFailed, os.ErrExist + } + if err := fs.RemoveAll(ctx, dst); err != nil && !os.IsNotExist(err) { + return http.StatusForbidden, err + } + } + + if srcStat.IsDir() { + if err := fs.Mkdir(ctx, dst, srcPerm); err != nil { + return http.StatusForbidden, err + } + if depth == infiniteDepth { + children, err := srcFile.Readdir(-1) + if err != nil { + return http.StatusForbidden, err + } + for _, c := range children { + name := c.Name() + s := path.Join(src, name) + d := path.Join(dst, name) + cStatus, cErr := copyFiles(ctx, fs, s, d, overwrite, depth, recursion) + if cErr != nil { + // TODO: MultiStatus. + return cStatus, cErr + } + } + } + + } else { + dstFile, err := fs.OpenFile(ctx, dst, os.O_RDWR|os.O_CREATE|os.O_TRUNC, srcPerm) + if err != nil { + if os.IsNotExist(err) { + return http.StatusConflict, err + } + return http.StatusForbidden, err + + } + _, copyErr := io.Copy(dstFile, srcFile) + propsErr := copyProps(dstFile, srcFile) + closeErr := dstFile.Close() + if copyErr != nil { + return http.StatusInternalServerError, copyErr + } + if propsErr != nil { + return http.StatusInternalServerError, propsErr + } + if closeErr != nil { + return http.StatusInternalServerError, closeErr + } + } + + if created { + return http.StatusCreated, nil + } + return http.StatusNoContent, nil +} + +// walkFS traverses filesystem fs starting at name up to depth levels. +// +// Allowed values for depth are 0, 1 or infiniteDepth. For each visited node, +// walkFS calls walkFn. If a visited file system node is a directory and +// walkFn returns filepath.SkipDir, walkFS will skip traversal of this node. +func walkFS(ctx context.Context, fs FileSystem, depth int, name string, info os.FileInfo, walkFn filepath.WalkFunc) error { + // This implementation is based on Walk's code in the standard path/filepath package. + err := walkFn(name, info, nil) + if err != nil { + if info.IsDir() && err == filepath.SkipDir { + return nil + } + return err + } + if !info.IsDir() || depth == 0 { + return nil + } + if depth == 1 { + depth = 0 + } + + // Read directory names. + f, err := fs.OpenFile(ctx, name, os.O_RDONLY, 0) + if err != nil { + return walkFn(name, info, err) + } + fileInfos, err := f.Readdir(0) + f.Close() + if err != nil { + return walkFn(name, info, err) + } + + for _, fileInfo := range fileInfos { + filename := path.Join(name, fileInfo.Name()) + fileInfo, err := fs.Stat(ctx, filename) + if err != nil { + if err := walkFn(filename, fileInfo, err); err != nil && err != filepath.SkipDir { + return err + } + } else { + err = walkFS(ctx, fs, depth, filename, fileInfo, walkFn) + if err != nil { + if !fileInfo.IsDir() || err != filepath.SkipDir { + return err + } + } + } + } + return nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/file_go1.6.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/file_go1.6.go new file mode 100644 index 0000000..fa38770 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/file_go1.6.go @@ -0,0 +1,17 @@ +// 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. + +// +build !go1.7 + +package webdav + +import ( + "net/http" + + "golang.org/x/net/context" +) + +func getContext(r *http.Request) context.Context { + return context.Background() +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/file_go1.7.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/file_go1.7.go new file mode 100644 index 0000000..d1c3de8 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/file_go1.7.go @@ -0,0 +1,16 @@ +// 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. + +// +build go1.7 + +package webdav + +import ( + "context" + "net/http" +) + +func getContext(r *http.Request) context.Context { + return r.Context() +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/file_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/file_test.go new file mode 100644 index 0000000..bfd96e1 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/file_test.go @@ -0,0 +1,1184 @@ +// 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 webdav + +import ( + "encoding/xml" + "fmt" + "io" + "io/ioutil" + "os" + "path" + "path/filepath" + "reflect" + "runtime" + "sort" + "strconv" + "strings" + "testing" + + "golang.org/x/net/context" +) + +func TestSlashClean(t *testing.T) { + testCases := []string{ + "", + ".", + "/", + "/./", + "//", + "//.", + "//a", + "/a", + "/a/b/c", + "/a//b/./../c/d/", + "a", + "a/b/c", + } + for _, tc := range testCases { + got := slashClean(tc) + want := path.Clean("/" + tc) + if got != want { + t.Errorf("tc=%q: got %q, want %q", tc, got, want) + } + } +} + +func TestDirResolve(t *testing.T) { + testCases := []struct { + dir, name, want string + }{ + {"/", "", "/"}, + {"/", "/", "/"}, + {"/", ".", "/"}, + {"/", "./a", "/a"}, + {"/", "..", "/"}, + {"/", "..", "/"}, + {"/", "../", "/"}, + {"/", "../.", "/"}, + {"/", "../a", "/a"}, + {"/", "../..", "/"}, + {"/", "../bar/a", "/bar/a"}, + {"/", "../baz/a", "/baz/a"}, + {"/", "...", "/..."}, + {"/", ".../a", "/.../a"}, + {"/", ".../..", "/"}, + {"/", "a", "/a"}, + {"/", "a/./b", "/a/b"}, + {"/", "a/../../b", "/b"}, + {"/", "a/../b", "/b"}, + {"/", "a/b", "/a/b"}, + {"/", "a/b/c/../../d", "/a/d"}, + {"/", "a/b/c/../../../d", "/d"}, + {"/", "a/b/c/../../../../d", "/d"}, + {"/", "a/b/c/d", "/a/b/c/d"}, + + {"/foo/bar", "", "/foo/bar"}, + {"/foo/bar", "/", "/foo/bar"}, + {"/foo/bar", ".", "/foo/bar"}, + {"/foo/bar", "./a", "/foo/bar/a"}, + {"/foo/bar", "..", "/foo/bar"}, + {"/foo/bar", "../", "/foo/bar"}, + {"/foo/bar", "../.", "/foo/bar"}, + {"/foo/bar", "../a", "/foo/bar/a"}, + {"/foo/bar", "../..", "/foo/bar"}, + {"/foo/bar", "../bar/a", "/foo/bar/bar/a"}, + {"/foo/bar", "../baz/a", "/foo/bar/baz/a"}, + {"/foo/bar", "...", "/foo/bar/..."}, + {"/foo/bar", ".../a", "/foo/bar/.../a"}, + {"/foo/bar", ".../..", "/foo/bar"}, + {"/foo/bar", "a", "/foo/bar/a"}, + {"/foo/bar", "a/./b", "/foo/bar/a/b"}, + {"/foo/bar", "a/../../b", "/foo/bar/b"}, + {"/foo/bar", "a/../b", "/foo/bar/b"}, + {"/foo/bar", "a/b", "/foo/bar/a/b"}, + {"/foo/bar", "a/b/c/../../d", "/foo/bar/a/d"}, + {"/foo/bar", "a/b/c/../../../d", "/foo/bar/d"}, + {"/foo/bar", "a/b/c/../../../../d", "/foo/bar/d"}, + {"/foo/bar", "a/b/c/d", "/foo/bar/a/b/c/d"}, + + {"/foo/bar/", "", "/foo/bar"}, + {"/foo/bar/", "/", "/foo/bar"}, + {"/foo/bar/", ".", "/foo/bar"}, + {"/foo/bar/", "./a", "/foo/bar/a"}, + {"/foo/bar/", "..", "/foo/bar"}, + + {"/foo//bar///", "", "/foo/bar"}, + {"/foo//bar///", "/", "/foo/bar"}, + {"/foo//bar///", ".", "/foo/bar"}, + {"/foo//bar///", "./a", "/foo/bar/a"}, + {"/foo//bar///", "..", "/foo/bar"}, + + {"/x/y/z", "ab/c\x00d/ef", ""}, + + {".", "", "."}, + {".", "/", "."}, + {".", ".", "."}, + {".", "./a", "a"}, + {".", "..", "."}, + {".", "..", "."}, + {".", "../", "."}, + {".", "../.", "."}, + {".", "../a", "a"}, + {".", "../..", "."}, + {".", "../bar/a", "bar/a"}, + {".", "../baz/a", "baz/a"}, + {".", "...", "..."}, + {".", ".../a", ".../a"}, + {".", ".../..", "."}, + {".", "a", "a"}, + {".", "a/./b", "a/b"}, + {".", "a/../../b", "b"}, + {".", "a/../b", "b"}, + {".", "a/b", "a/b"}, + {".", "a/b/c/../../d", "a/d"}, + {".", "a/b/c/../../../d", "d"}, + {".", "a/b/c/../../../../d", "d"}, + {".", "a/b/c/d", "a/b/c/d"}, + + {"", "", "."}, + {"", "/", "."}, + {"", ".", "."}, + {"", "./a", "a"}, + {"", "..", "."}, + } + + for _, tc := range testCases { + d := Dir(filepath.FromSlash(tc.dir)) + if got := filepath.ToSlash(d.resolve(tc.name)); got != tc.want { + t.Errorf("dir=%q, name=%q: got %q, want %q", tc.dir, tc.name, got, tc.want) + } + } +} + +func TestWalk(t *testing.T) { + type walkStep struct { + name, frag string + final bool + } + + testCases := []struct { + dir string + want []walkStep + }{ + {"", []walkStep{ + {"", "", true}, + }}, + {"/", []walkStep{ + {"", "", true}, + }}, + {"/a", []walkStep{ + {"", "a", true}, + }}, + {"/a/", []walkStep{ + {"", "a", true}, + }}, + {"/a/b", []walkStep{ + {"", "a", false}, + {"a", "b", true}, + }}, + {"/a/b/", []walkStep{ + {"", "a", false}, + {"a", "b", true}, + }}, + {"/a/b/c", []walkStep{ + {"", "a", false}, + {"a", "b", false}, + {"b", "c", true}, + }}, + // The following test case is the one mentioned explicitly + // in the method description. + {"/foo/bar/x", []walkStep{ + {"", "foo", false}, + {"foo", "bar", false}, + {"bar", "x", true}, + }}, + } + + ctx := context.Background() + + for _, tc := range testCases { + fs := NewMemFS().(*memFS) + + parts := strings.Split(tc.dir, "/") + for p := 2; p < len(parts); p++ { + d := strings.Join(parts[:p], "/") + if err := fs.Mkdir(ctx, d, 0666); err != nil { + t.Errorf("tc.dir=%q: mkdir: %q: %v", tc.dir, d, err) + } + } + + i, prevFrag := 0, "" + err := fs.walk("test", tc.dir, func(dir *memFSNode, frag string, final bool) error { + got := walkStep{ + name: prevFrag, + frag: frag, + final: final, + } + want := tc.want[i] + + if got != want { + return fmt.Errorf("got %+v, want %+v", got, want) + } + i, prevFrag = i+1, frag + return nil + }) + if err != nil { + t.Errorf("tc.dir=%q: %v", tc.dir, err) + } + } +} + +// find appends to ss the names of the named file and its children. It is +// analogous to the Unix find command. +// +// The returned strings are not guaranteed to be in any particular order. +func find(ctx context.Context, ss []string, fs FileSystem, name string) ([]string, error) { + stat, err := fs.Stat(ctx, name) + if err != nil { + return nil, err + } + ss = append(ss, name) + if stat.IsDir() { + f, err := fs.OpenFile(ctx, name, os.O_RDONLY, 0) + if err != nil { + return nil, err + } + defer f.Close() + children, err := f.Readdir(-1) + if err != nil { + return nil, err + } + for _, c := range children { + ss, err = find(ctx, ss, fs, path.Join(name, c.Name())) + if err != nil { + return nil, err + } + } + } + return ss, nil +} + +func testFS(t *testing.T, fs FileSystem) { + errStr := func(err error) string { + switch { + case os.IsExist(err): + return "errExist" + case os.IsNotExist(err): + return "errNotExist" + case err != nil: + return "err" + } + return "ok" + } + + // The non-"find" non-"stat" test cases should change the file system state. The + // indentation of the "find"s and "stat"s helps distinguish such test cases. + testCases := []string{ + " stat / want dir", + " stat /a want errNotExist", + " stat /d want errNotExist", + " stat /d/e want errNotExist", + "create /a A want ok", + " stat /a want 1", + "create /d/e EEE want errNotExist", + "mk-dir /a want errExist", + "mk-dir /d/m want errNotExist", + "mk-dir /d want ok", + " stat /d want dir", + "create /d/e EEE want ok", + " stat /d/e want 3", + " find / /a /d /d/e", + "create /d/f FFFF want ok", + "create /d/g GGGGGGG want ok", + "mk-dir /d/m want ok", + "mk-dir /d/m want errExist", + "create /d/m/p PPPPP want ok", + " stat /d/e want 3", + " stat /d/f want 4", + " stat /d/g want 7", + " stat /d/h want errNotExist", + " stat /d/m want dir", + " stat /d/m/p want 5", + " find / /a /d /d/e /d/f /d/g /d/m /d/m/p", + "rm-all /d want ok", + " stat /a want 1", + " stat /d want errNotExist", + " stat /d/e want errNotExist", + " stat /d/f want errNotExist", + " stat /d/g want errNotExist", + " stat /d/m want errNotExist", + " stat /d/m/p want errNotExist", + " find / /a", + "mk-dir /d/m want errNotExist", + "mk-dir /d want ok", + "create /d/f FFFF want ok", + "rm-all /d/f want ok", + "mk-dir /d/m want ok", + "rm-all /z want ok", + "rm-all / want err", + "create /b BB want ok", + " stat / want dir", + " stat /a want 1", + " stat /b want 2", + " stat /c want errNotExist", + " stat /d want dir", + " stat /d/m want dir", + " find / /a /b /d /d/m", + "move__ o=F /b /c want ok", + " stat /b want errNotExist", + " stat /c want 2", + " stat /d/m want dir", + " stat /d/n want errNotExist", + " find / /a /c /d /d/m", + "move__ o=F /d/m /d/n want ok", + "create /d/n/q QQQQ want ok", + " stat /d/m want errNotExist", + " stat /d/n want dir", + " stat /d/n/q want 4", + "move__ o=F /d /d/n/z want err", + "move__ o=T /c /d/n/q want ok", + " stat /c want errNotExist", + " stat /d/n/q want 2", + " find / /a /d /d/n /d/n/q", + "create /d/n/r RRRRR want ok", + "mk-dir /u want ok", + "mk-dir /u/v want ok", + "move__ o=F /d/n /u want errExist", + "create /t TTTTTT want ok", + "move__ o=F /d/n /t want errExist", + "rm-all /t want ok", + "move__ o=F /d/n /t want ok", + " stat /d want dir", + " stat /d/n want errNotExist", + " stat /d/n/r want errNotExist", + " stat /t want dir", + " stat /t/q want 2", + " stat /t/r want 5", + " find / /a /d /t /t/q /t/r /u /u/v", + "move__ o=F /t / want errExist", + "move__ o=T /t /u/v want ok", + " stat /u/v/r want 5", + "move__ o=F / /z want err", + " find / /a /d /u /u/v /u/v/q /u/v/r", + " stat /a want 1", + " stat /b want errNotExist", + " stat /c want errNotExist", + " stat /u/v/r want 5", + "copy__ o=F d=0 /a /b want ok", + "copy__ o=T d=0 /a /c want ok", + " stat /a want 1", + " stat /b want 1", + " stat /c want 1", + " stat /u/v/r want 5", + "copy__ o=F d=0 /u/v/r /b want errExist", + " stat /b want 1", + "copy__ o=T d=0 /u/v/r /b want ok", + " stat /a want 1", + " stat /b want 5", + " stat /u/v/r want 5", + "rm-all /a want ok", + "rm-all /b want ok", + "mk-dir /u/v/w want ok", + "create /u/v/w/s SSSSSSSS want ok", + " stat /d want dir", + " stat /d/x want errNotExist", + " stat /d/y want errNotExist", + " stat /u/v/r want 5", + " stat /u/v/w/s want 8", + " find / /c /d /u /u/v /u/v/q /u/v/r /u/v/w /u/v/w/s", + "copy__ o=T d=0 /u/v /d/x want ok", + "copy__ o=T d=∞ /u/v /d/y want ok", + "rm-all /u want ok", + " stat /d/x want dir", + " stat /d/x/q want errNotExist", + " stat /d/x/r want errNotExist", + " stat /d/x/w want errNotExist", + " stat /d/x/w/s want errNotExist", + " stat /d/y want dir", + " stat /d/y/q want 2", + " stat /d/y/r want 5", + " stat /d/y/w want dir", + " stat /d/y/w/s want 8", + " stat /u want errNotExist", + " find / /c /d /d/x /d/y /d/y/q /d/y/r /d/y/w /d/y/w/s", + "copy__ o=F d=∞ /d/y /d/x want errExist", + } + + ctx := context.Background() + + for i, tc := range testCases { + tc = strings.TrimSpace(tc) + j := strings.IndexByte(tc, ' ') + if j < 0 { + t.Fatalf("test case #%d %q: invalid command", i, tc) + } + op, arg := tc[:j], tc[j+1:] + + switch op { + default: + t.Fatalf("test case #%d %q: invalid operation %q", i, tc, op) + + case "create": + parts := strings.Split(arg, " ") + if len(parts) != 4 || parts[2] != "want" { + t.Fatalf("test case #%d %q: invalid write", i, tc) + } + f, opErr := fs.OpenFile(ctx, parts[0], os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) + if got := errStr(opErr); got != parts[3] { + t.Fatalf("test case #%d %q: OpenFile: got %q (%v), want %q", i, tc, got, opErr, parts[3]) + } + if f != nil { + if _, err := f.Write([]byte(parts[1])); err != nil { + t.Fatalf("test case #%d %q: Write: %v", i, tc, err) + } + if err := f.Close(); err != nil { + t.Fatalf("test case #%d %q: Close: %v", i, tc, err) + } + } + + case "find": + got, err := find(ctx, nil, fs, "/") + if err != nil { + t.Fatalf("test case #%d %q: find: %v", i, tc, err) + } + sort.Strings(got) + want := strings.Split(arg, " ") + if !reflect.DeepEqual(got, want) { + t.Fatalf("test case #%d %q:\ngot %s\nwant %s", i, tc, got, want) + } + + case "copy__", "mk-dir", "move__", "rm-all", "stat": + nParts := 3 + switch op { + case "copy__": + nParts = 6 + case "move__": + nParts = 5 + } + parts := strings.Split(arg, " ") + if len(parts) != nParts { + t.Fatalf("test case #%d %q: invalid %s", i, tc, op) + } + + got, opErr := "", error(nil) + switch op { + case "copy__": + depth := 0 + if parts[1] == "d=∞" { + depth = infiniteDepth + } + _, opErr = copyFiles(ctx, fs, parts[2], parts[3], parts[0] == "o=T", depth, 0) + case "mk-dir": + opErr = fs.Mkdir(ctx, parts[0], 0777) + case "move__": + _, opErr = moveFiles(ctx, fs, parts[1], parts[2], parts[0] == "o=T") + case "rm-all": + opErr = fs.RemoveAll(ctx, parts[0]) + case "stat": + var stat os.FileInfo + fileName := parts[0] + if stat, opErr = fs.Stat(ctx, fileName); opErr == nil { + if stat.IsDir() { + got = "dir" + } else { + got = strconv.Itoa(int(stat.Size())) + } + + if fileName == "/" { + // For a Dir FileSystem, the virtual file system root maps to a + // real file system name like "/tmp/webdav-test012345", which does + // not end with "/". We skip such cases. + } else if statName := stat.Name(); path.Base(fileName) != statName { + t.Fatalf("test case #%d %q: file name %q inconsistent with stat name %q", + i, tc, fileName, statName) + } + } + } + if got == "" { + got = errStr(opErr) + } + + if parts[len(parts)-2] != "want" { + t.Fatalf("test case #%d %q: invalid %s", i, tc, op) + } + if want := parts[len(parts)-1]; got != want { + t.Fatalf("test case #%d %q: got %q (%v), want %q", i, tc, got, opErr, want) + } + } + } +} + +func TestDir(t *testing.T) { + switch runtime.GOOS { + case "nacl": + t.Skip("see golang.org/issue/12004") + case "plan9": + t.Skip("see golang.org/issue/11453") + } + + td, err := ioutil.TempDir("", "webdav-test") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(td) + testFS(t, Dir(td)) +} + +func TestMemFS(t *testing.T) { + testFS(t, NewMemFS()) +} + +func TestMemFSRoot(t *testing.T) { + ctx := context.Background() + fs := NewMemFS() + for i := 0; i < 5; i++ { + stat, err := fs.Stat(ctx, "/") + if err != nil { + t.Fatalf("i=%d: Stat: %v", i, err) + } + if !stat.IsDir() { + t.Fatalf("i=%d: Stat.IsDir is false, want true", i) + } + + f, err := fs.OpenFile(ctx, "/", os.O_RDONLY, 0) + if err != nil { + t.Fatalf("i=%d: OpenFile: %v", i, err) + } + defer f.Close() + children, err := f.Readdir(-1) + if err != nil { + t.Fatalf("i=%d: Readdir: %v", i, err) + } + if len(children) != i { + t.Fatalf("i=%d: got %d children, want %d", i, len(children), i) + } + + if _, err := f.Write(make([]byte, 1)); err == nil { + t.Fatalf("i=%d: Write: got nil error, want non-nil", i) + } + + if err := fs.Mkdir(ctx, fmt.Sprintf("/dir%d", i), 0777); err != nil { + t.Fatalf("i=%d: Mkdir: %v", i, err) + } + } +} + +func TestMemFileReaddir(t *testing.T) { + ctx := context.Background() + fs := NewMemFS() + if err := fs.Mkdir(ctx, "/foo", 0777); err != nil { + t.Fatalf("Mkdir: %v", err) + } + readdir := func(count int) ([]os.FileInfo, error) { + f, err := fs.OpenFile(ctx, "/foo", os.O_RDONLY, 0) + if err != nil { + t.Fatalf("OpenFile: %v", err) + } + defer f.Close() + return f.Readdir(count) + } + if got, err := readdir(-1); len(got) != 0 || err != nil { + t.Fatalf("readdir(-1): got %d fileInfos with err=%v, want 0, ", len(got), err) + } + if got, err := readdir(+1); len(got) != 0 || err != io.EOF { + t.Fatalf("readdir(+1): got %d fileInfos with err=%v, want 0, EOF", len(got), err) + } +} + +func TestMemFile(t *testing.T) { + testCases := []string{ + "wantData ", + "wantSize 0", + "write abc", + "wantData abc", + "write de", + "wantData abcde", + "wantSize 5", + "write 5*x", + "write 4*y+2*z", + "write 3*st", + "wantData abcdexxxxxyyyyzzststst", + "wantSize 22", + "seek set 4 want 4", + "write EFG", + "wantData abcdEFGxxxyyyyzzststst", + "wantSize 22", + "seek set 2 want 2", + "read cdEF", + "read Gx", + "seek cur 0 want 8", + "seek cur 2 want 10", + "seek cur -1 want 9", + "write J", + "wantData abcdEFGxxJyyyyzzststst", + "wantSize 22", + "seek cur -4 want 6", + "write ghijk", + "wantData abcdEFghijkyyyzzststst", + "wantSize 22", + "read yyyz", + "seek cur 0 want 15", + "write ", + "seek cur 0 want 15", + "read ", + "seek cur 0 want 15", + "seek end -3 want 19", + "write ZZ", + "wantData abcdEFghijkyyyzzstsZZt", + "wantSize 22", + "write 4*A", + "wantData abcdEFghijkyyyzzstsZZAAAA", + "wantSize 25", + "seek end 0 want 25", + "seek end -5 want 20", + "read Z+4*A", + "write 5*B", + "wantData abcdEFghijkyyyzzstsZZAAAABBBBB", + "wantSize 30", + "seek end 10 want 40", + "write C", + "wantData abcdEFghijkyyyzzstsZZAAAABBBBB..........C", + "wantSize 41", + "write D", + "wantData abcdEFghijkyyyzzstsZZAAAABBBBB..........CD", + "wantSize 42", + "seek set 43 want 43", + "write E", + "wantData abcdEFghijkyyyzzstsZZAAAABBBBB..........CD.E", + "wantSize 44", + "seek set 0 want 0", + "write 5*123456789_", + "wantData 123456789_123456789_123456789_123456789_123456789_", + "wantSize 50", + "seek cur 0 want 50", + "seek cur -99 want err", + } + + ctx := context.Background() + + const filename = "/foo" + fs := NewMemFS() + f, err := fs.OpenFile(ctx, filename, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) + if err != nil { + t.Fatalf("OpenFile: %v", err) + } + defer f.Close() + + for i, tc := range testCases { + j := strings.IndexByte(tc, ' ') + if j < 0 { + t.Fatalf("test case #%d %q: invalid command", i, tc) + } + op, arg := tc[:j], tc[j+1:] + + // Expand an arg like "3*a+2*b" to "aaabb". + parts := strings.Split(arg, "+") + for j, part := range parts { + if k := strings.IndexByte(part, '*'); k >= 0 { + repeatCount, repeatStr := part[:k], part[k+1:] + n, err := strconv.Atoi(repeatCount) + if err != nil { + t.Fatalf("test case #%d %q: invalid repeat count %q", i, tc, repeatCount) + } + parts[j] = strings.Repeat(repeatStr, n) + } + } + arg = strings.Join(parts, "") + + switch op { + default: + t.Fatalf("test case #%d %q: invalid operation %q", i, tc, op) + + case "read": + buf := make([]byte, len(arg)) + if _, err := io.ReadFull(f, buf); err != nil { + t.Fatalf("test case #%d %q: ReadFull: %v", i, tc, err) + } + if got := string(buf); got != arg { + t.Fatalf("test case #%d %q:\ngot %q\nwant %q", i, tc, got, arg) + } + + case "seek": + parts := strings.Split(arg, " ") + if len(parts) != 4 { + t.Fatalf("test case #%d %q: invalid seek", i, tc) + } + + whence := 0 + switch parts[0] { + default: + t.Fatalf("test case #%d %q: invalid seek whence", i, tc) + case "set": + whence = os.SEEK_SET + case "cur": + whence = os.SEEK_CUR + case "end": + whence = os.SEEK_END + } + offset, err := strconv.Atoi(parts[1]) + if err != nil { + t.Fatalf("test case #%d %q: invalid offset %q", i, tc, parts[1]) + } + + if parts[2] != "want" { + t.Fatalf("test case #%d %q: invalid seek", i, tc) + } + if parts[3] == "err" { + _, err := f.Seek(int64(offset), whence) + if err == nil { + t.Fatalf("test case #%d %q: Seek returned nil error, want non-nil", i, tc) + } + } else { + got, err := f.Seek(int64(offset), whence) + if err != nil { + t.Fatalf("test case #%d %q: Seek: %v", i, tc, err) + } + want, err := strconv.Atoi(parts[3]) + if err != nil { + t.Fatalf("test case #%d %q: invalid want %q", i, tc, parts[3]) + } + if got != int64(want) { + t.Fatalf("test case #%d %q: got %d, want %d", i, tc, got, want) + } + } + + case "write": + n, err := f.Write([]byte(arg)) + if err != nil { + t.Fatalf("test case #%d %q: write: %v", i, tc, err) + } + if n != len(arg) { + t.Fatalf("test case #%d %q: write returned %d bytes, want %d", i, tc, n, len(arg)) + } + + case "wantData": + g, err := fs.OpenFile(ctx, filename, os.O_RDONLY, 0666) + if err != nil { + t.Fatalf("test case #%d %q: OpenFile: %v", i, tc, err) + } + gotBytes, err := ioutil.ReadAll(g) + if err != nil { + t.Fatalf("test case #%d %q: ReadAll: %v", i, tc, err) + } + for i, c := range gotBytes { + if c == '\x00' { + gotBytes[i] = '.' + } + } + got := string(gotBytes) + if got != arg { + t.Fatalf("test case #%d %q:\ngot %q\nwant %q", i, tc, got, arg) + } + if err := g.Close(); err != nil { + t.Fatalf("test case #%d %q: Close: %v", i, tc, err) + } + + case "wantSize": + n, err := strconv.Atoi(arg) + if err != nil { + t.Fatalf("test case #%d %q: invalid size %q", i, tc, arg) + } + fi, err := fs.Stat(ctx, filename) + if err != nil { + t.Fatalf("test case #%d %q: Stat: %v", i, tc, err) + } + if got, want := fi.Size(), int64(n); got != want { + t.Fatalf("test case #%d %q: got %d, want %d", i, tc, got, want) + } + } + } +} + +// TestMemFileWriteAllocs tests that writing N consecutive 1KiB chunks to a +// memFile doesn't allocate a new buffer for each of those N times. Otherwise, +// calling io.Copy(aMemFile, src) is likely to have quadratic complexity. +func TestMemFileWriteAllocs(t *testing.T) { + if runtime.Compiler == "gccgo" { + t.Skip("gccgo allocates here") + } + ctx := context.Background() + fs := NewMemFS() + f, err := fs.OpenFile(ctx, "/xxx", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) + if err != nil { + t.Fatalf("OpenFile: %v", err) + } + defer f.Close() + + xxx := make([]byte, 1024) + for i := range xxx { + xxx[i] = 'x' + } + + a := testing.AllocsPerRun(100, func() { + f.Write(xxx) + }) + // AllocsPerRun returns an integral value, so we compare the rounded-down + // number to zero. + if a > 0 { + t.Fatalf("%v allocs per run, want 0", a) + } +} + +func BenchmarkMemFileWrite(b *testing.B) { + ctx := context.Background() + fs := NewMemFS() + xxx := make([]byte, 1024) + for i := range xxx { + xxx[i] = 'x' + } + + b.ResetTimer() + for i := 0; i < b.N; i++ { + f, err := fs.OpenFile(ctx, "/xxx", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) + if err != nil { + b.Fatalf("OpenFile: %v", err) + } + for j := 0; j < 100; j++ { + f.Write(xxx) + } + if err := f.Close(); err != nil { + b.Fatalf("Close: %v", err) + } + if err := fs.RemoveAll(ctx, "/xxx"); err != nil { + b.Fatalf("RemoveAll: %v", err) + } + } +} + +func TestCopyMoveProps(t *testing.T) { + ctx := context.Background() + fs := NewMemFS() + create := func(name string) error { + f, err := fs.OpenFile(ctx, name, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) + if err != nil { + return err + } + _, wErr := f.Write([]byte("contents")) + cErr := f.Close() + if wErr != nil { + return wErr + } + return cErr + } + patch := func(name string, patches ...Proppatch) error { + f, err := fs.OpenFile(ctx, name, os.O_RDWR, 0666) + if err != nil { + return err + } + _, pErr := f.(DeadPropsHolder).Patch(patches) + cErr := f.Close() + if pErr != nil { + return pErr + } + return cErr + } + props := func(name string) (map[xml.Name]Property, error) { + f, err := fs.OpenFile(ctx, name, os.O_RDWR, 0666) + if err != nil { + return nil, err + } + m, pErr := f.(DeadPropsHolder).DeadProps() + cErr := f.Close() + if pErr != nil { + return nil, pErr + } + if cErr != nil { + return nil, cErr + } + return m, nil + } + + p0 := Property{ + XMLName: xml.Name{Space: "x:", Local: "boat"}, + InnerXML: []byte("pea-green"), + } + p1 := Property{ + XMLName: xml.Name{Space: "x:", Local: "ring"}, + InnerXML: []byte("1 shilling"), + } + p2 := Property{ + XMLName: xml.Name{Space: "x:", Local: "spoon"}, + InnerXML: []byte("runcible"), + } + p3 := Property{ + XMLName: xml.Name{Space: "x:", Local: "moon"}, + InnerXML: []byte("light"), + } + + if err := create("/src"); err != nil { + t.Fatalf("create /src: %v", err) + } + if err := patch("/src", Proppatch{Props: []Property{p0, p1}}); err != nil { + t.Fatalf("patch /src +p0 +p1: %v", err) + } + if _, err := copyFiles(ctx, fs, "/src", "/tmp", true, infiniteDepth, 0); err != nil { + t.Fatalf("copyFiles /src /tmp: %v", err) + } + if _, err := moveFiles(ctx, fs, "/tmp", "/dst", true); err != nil { + t.Fatalf("moveFiles /tmp /dst: %v", err) + } + if err := patch("/src", Proppatch{Props: []Property{p0}, Remove: true}); err != nil { + t.Fatalf("patch /src -p0: %v", err) + } + if err := patch("/src", Proppatch{Props: []Property{p2}}); err != nil { + t.Fatalf("patch /src +p2: %v", err) + } + if err := patch("/dst", Proppatch{Props: []Property{p1}, Remove: true}); err != nil { + t.Fatalf("patch /dst -p1: %v", err) + } + if err := patch("/dst", Proppatch{Props: []Property{p3}}); err != nil { + t.Fatalf("patch /dst +p3: %v", err) + } + + gotSrc, err := props("/src") + if err != nil { + t.Fatalf("props /src: %v", err) + } + wantSrc := map[xml.Name]Property{ + p1.XMLName: p1, + p2.XMLName: p2, + } + if !reflect.DeepEqual(gotSrc, wantSrc) { + t.Fatalf("props /src:\ngot %v\nwant %v", gotSrc, wantSrc) + } + + gotDst, err := props("/dst") + if err != nil { + t.Fatalf("props /dst: %v", err) + } + wantDst := map[xml.Name]Property{ + p0.XMLName: p0, + p3.XMLName: p3, + } + if !reflect.DeepEqual(gotDst, wantDst) { + t.Fatalf("props /dst:\ngot %v\nwant %v", gotDst, wantDst) + } +} + +func TestWalkFS(t *testing.T) { + testCases := []struct { + desc string + buildfs []string + startAt string + depth int + walkFn filepath.WalkFunc + want []string + }{{ + "just root", + []string{}, + "/", + infiniteDepth, + nil, + []string{ + "/", + }, + }, { + "infinite walk from root", + []string{ + "mkdir /a", + "mkdir /a/b", + "touch /a/b/c", + "mkdir /a/d", + "mkdir /e", + "touch /f", + }, + "/", + infiniteDepth, + nil, + []string{ + "/", + "/a", + "/a/b", + "/a/b/c", + "/a/d", + "/e", + "/f", + }, + }, { + "infinite walk from subdir", + []string{ + "mkdir /a", + "mkdir /a/b", + "touch /a/b/c", + "mkdir /a/d", + "mkdir /e", + "touch /f", + }, + "/a", + infiniteDepth, + nil, + []string{ + "/a", + "/a/b", + "/a/b/c", + "/a/d", + }, + }, { + "depth 1 walk from root", + []string{ + "mkdir /a", + "mkdir /a/b", + "touch /a/b/c", + "mkdir /a/d", + "mkdir /e", + "touch /f", + }, + "/", + 1, + nil, + []string{ + "/", + "/a", + "/e", + "/f", + }, + }, { + "depth 1 walk from subdir", + []string{ + "mkdir /a", + "mkdir /a/b", + "touch /a/b/c", + "mkdir /a/b/g", + "mkdir /a/b/g/h", + "touch /a/b/g/i", + "touch /a/b/g/h/j", + }, + "/a/b", + 1, + nil, + []string{ + "/a/b", + "/a/b/c", + "/a/b/g", + }, + }, { + "depth 0 walk from subdir", + []string{ + "mkdir /a", + "mkdir /a/b", + "touch /a/b/c", + "mkdir /a/b/g", + "mkdir /a/b/g/h", + "touch /a/b/g/i", + "touch /a/b/g/h/j", + }, + "/a/b", + 0, + nil, + []string{ + "/a/b", + }, + }, { + "infinite walk from file", + []string{ + "mkdir /a", + "touch /a/b", + "touch /a/c", + }, + "/a/b", + 0, + nil, + []string{ + "/a/b", + }, + }, { + "infinite walk with skipped subdir", + []string{ + "mkdir /a", + "mkdir /a/b", + "touch /a/b/c", + "mkdir /a/b/g", + "mkdir /a/b/g/h", + "touch /a/b/g/i", + "touch /a/b/g/h/j", + "touch /a/b/z", + }, + "/", + infiniteDepth, + func(path string, info os.FileInfo, err error) error { + if path == "/a/b/g" { + return filepath.SkipDir + } + return nil + }, + []string{ + "/", + "/a", + "/a/b", + "/a/b/c", + "/a/b/z", + }, + }} + ctx := context.Background() + for _, tc := range testCases { + fs, err := buildTestFS(tc.buildfs) + if err != nil { + t.Fatalf("%s: cannot create test filesystem: %v", tc.desc, err) + } + var got []string + traceFn := func(path string, info os.FileInfo, err error) error { + if tc.walkFn != nil { + err = tc.walkFn(path, info, err) + if err != nil { + return err + } + } + got = append(got, path) + return nil + } + fi, err := fs.Stat(ctx, tc.startAt) + if err != nil { + t.Fatalf("%s: cannot stat: %v", tc.desc, err) + } + err = walkFS(ctx, fs, tc.depth, tc.startAt, fi, traceFn) + if err != nil { + t.Errorf("%s:\ngot error %v, want nil", tc.desc, err) + continue + } + sort.Strings(got) + sort.Strings(tc.want) + if !reflect.DeepEqual(got, tc.want) { + t.Errorf("%s:\ngot %q\nwant %q", tc.desc, got, tc.want) + continue + } + } +} + +func buildTestFS(buildfs []string) (FileSystem, error) { + // TODO: Could this be merged with the build logic in TestFS? + + ctx := context.Background() + fs := NewMemFS() + for _, b := range buildfs { + op := strings.Split(b, " ") + switch op[0] { + case "mkdir": + err := fs.Mkdir(ctx, op[1], os.ModeDir|0777) + if err != nil { + return nil, err + } + case "touch": + f, err := fs.OpenFile(ctx, op[1], os.O_RDWR|os.O_CREATE, 0666) + if err != nil { + return nil, err + } + f.Close() + case "write": + f, err := fs.OpenFile(ctx, op[1], os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) + if err != nil { + return nil, err + } + _, err = f.Write([]byte(op[2])) + f.Close() + if err != nil { + return nil, err + } + default: + return nil, fmt.Errorf("unknown file operation %q", op[0]) + } + } + return fs, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/if.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/if.go new file mode 100644 index 0000000..416e81c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/if.go @@ -0,0 +1,173 @@ +// 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 webdav + +// The If header is covered by Section 10.4. +// http://www.webdav.org/specs/rfc4918.html#HEADER_If + +import ( + "strings" +) + +// ifHeader is a disjunction (OR) of ifLists. +type ifHeader struct { + lists []ifList +} + +// ifList is a conjunction (AND) of Conditions, and an optional resource tag. +type ifList struct { + resourceTag string + conditions []Condition +} + +// parseIfHeader parses the "If: foo bar" HTTP header. The httpHeader string +// should omit the "If:" prefix and have any "\r\n"s collapsed to a " ", as is +// returned by req.Header.Get("If") for a http.Request req. +func parseIfHeader(httpHeader string) (h ifHeader, ok bool) { + s := strings.TrimSpace(httpHeader) + switch tokenType, _, _ := lex(s); tokenType { + case '(': + return parseNoTagLists(s) + case angleTokenType: + return parseTaggedLists(s) + default: + return ifHeader{}, false + } +} + +func parseNoTagLists(s string) (h ifHeader, ok bool) { + for { + l, remaining, ok := parseList(s) + if !ok { + return ifHeader{}, false + } + h.lists = append(h.lists, l) + if remaining == "" { + return h, true + } + s = remaining + } +} + +func parseTaggedLists(s string) (h ifHeader, ok bool) { + resourceTag, n := "", 0 + for first := true; ; first = false { + tokenType, tokenStr, remaining := lex(s) + switch tokenType { + case angleTokenType: + if !first && n == 0 { + return ifHeader{}, false + } + resourceTag, n = tokenStr, 0 + s = remaining + case '(': + n++ + l, remaining, ok := parseList(s) + if !ok { + return ifHeader{}, false + } + l.resourceTag = resourceTag + h.lists = append(h.lists, l) + if remaining == "" { + return h, true + } + s = remaining + default: + return ifHeader{}, false + } + } +} + +func parseList(s string) (l ifList, remaining string, ok bool) { + tokenType, _, s := lex(s) + if tokenType != '(' { + return ifList{}, "", false + } + for { + tokenType, _, remaining = lex(s) + if tokenType == ')' { + if len(l.conditions) == 0 { + return ifList{}, "", false + } + return l, remaining, true + } + c, remaining, ok := parseCondition(s) + if !ok { + return ifList{}, "", false + } + l.conditions = append(l.conditions, c) + s = remaining + } +} + +func parseCondition(s string) (c Condition, remaining string, ok bool) { + tokenType, tokenStr, s := lex(s) + if tokenType == notTokenType { + c.Not = true + tokenType, tokenStr, s = lex(s) + } + switch tokenType { + case strTokenType, angleTokenType: + c.Token = tokenStr + case squareTokenType: + c.ETag = tokenStr + default: + return Condition{}, "", false + } + return c, s, true +} + +// Single-rune tokens like '(' or ')' have a token type equal to their rune. +// All other tokens have a negative token type. +const ( + errTokenType = rune(-1) + eofTokenType = rune(-2) + strTokenType = rune(-3) + notTokenType = rune(-4) + angleTokenType = rune(-5) + squareTokenType = rune(-6) +) + +func lex(s string) (tokenType rune, tokenStr string, remaining string) { + // The net/textproto Reader that parses the HTTP header will collapse + // Linear White Space that spans multiple "\r\n" lines to a single " ", + // so we don't need to look for '\r' or '\n'. + for len(s) > 0 && (s[0] == '\t' || s[0] == ' ') { + s = s[1:] + } + if len(s) == 0 { + return eofTokenType, "", "" + } + i := 0 +loop: + for ; i < len(s); i++ { + switch s[i] { + case '\t', ' ', '(', ')', '<', '>', '[', ']': + break loop + } + } + + if i != 0 { + tokenStr, remaining = s[:i], s[i:] + if tokenStr == "Not" { + return notTokenType, "", remaining + } + return strTokenType, tokenStr, remaining + } + + j := 0 + switch s[0] { + case '<': + j, tokenType = strings.IndexByte(s, '>'), angleTokenType + case '[': + j, tokenType = strings.IndexByte(s, ']'), squareTokenType + default: + return rune(s[0]), "", s[1:] + } + if j < 0 { + return errTokenType, "", "" + } + return tokenType, s[1:j], s[j+1:] +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/if_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/if_test.go new file mode 100644 index 0000000..aad61a4 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/if_test.go @@ -0,0 +1,322 @@ +// 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 webdav + +import ( + "reflect" + "strings" + "testing" +) + +func TestParseIfHeader(t *testing.T) { + // The "section x.y.z" test cases come from section x.y.z of the spec at + // http://www.webdav.org/specs/rfc4918.html + testCases := []struct { + desc string + input string + want ifHeader + }{{ + "bad: empty", + ``, + ifHeader{}, + }, { + "bad: no parens", + `foobar`, + ifHeader{}, + }, { + "bad: empty list #1", + `()`, + ifHeader{}, + }, { + "bad: empty list #2", + `(a) (b c) () (d)`, + ifHeader{}, + }, { + "bad: no list after resource #1", + ``, + ifHeader{}, + }, { + "bad: no list after resource #2", + ` (a)`, + ifHeader{}, + }, { + "bad: no list after resource #3", + ` (a) (b) `, + ifHeader{}, + }, { + "bad: no-tag-list followed by tagged-list", + `(a) (b) (c)`, + ifHeader{}, + }, { + "bad: unfinished list", + `(a`, + ifHeader{}, + }, { + "bad: unfinished ETag", + `([b`, + ifHeader{}, + }, { + "bad: unfinished Notted list", + `(Not a`, + ifHeader{}, + }, { + "bad: double Not", + `(Not Not a)`, + ifHeader{}, + }, { + "good: one list with a Token", + `(a)`, + ifHeader{ + lists: []ifList{{ + conditions: []Condition{{ + Token: `a`, + }}, + }}, + }, + }, { + "good: one list with an ETag", + `([a])`, + ifHeader{ + lists: []ifList{{ + conditions: []Condition{{ + ETag: `a`, + }}, + }}, + }, + }, { + "good: one list with three Nots", + `(Not a Not b Not [d])`, + ifHeader{ + lists: []ifList{{ + conditions: []Condition{{ + Not: true, + Token: `a`, + }, { + Not: true, + Token: `b`, + }, { + Not: true, + ETag: `d`, + }}, + }}, + }, + }, { + "good: two lists", + `(a) (b)`, + ifHeader{ + lists: []ifList{{ + conditions: []Condition{{ + Token: `a`, + }}, + }, { + conditions: []Condition{{ + Token: `b`, + }}, + }}, + }, + }, { + "good: two Notted lists", + `(Not a) (Not b)`, + ifHeader{ + lists: []ifList{{ + conditions: []Condition{{ + Not: true, + Token: `a`, + }}, + }, { + conditions: []Condition{{ + Not: true, + Token: `b`, + }}, + }}, + }, + }, { + "section 7.5.1", + ` + ()`, + ifHeader{ + lists: []ifList{{ + resourceTag: `http://www.example.com/users/f/fielding/index.html`, + conditions: []Condition{{ + Token: `urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6`, + }}, + }}, + }, + }, { + "section 7.5.2 #1", + `()`, + ifHeader{ + lists: []ifList{{ + conditions: []Condition{{ + Token: `urn:uuid:150852e2-3847-42d5-8cbe-0f4f296f26cf`, + }}, + }}, + }, + }, { + "section 7.5.2 #2", + ` + ()`, + ifHeader{ + lists: []ifList{{ + resourceTag: `http://example.com/locked/`, + conditions: []Condition{{ + Token: `urn:uuid:150852e2-3847-42d5-8cbe-0f4f296f26cf`, + }}, + }}, + }, + }, { + "section 7.5.2 #3", + ` + ()`, + ifHeader{ + lists: []ifList{{ + resourceTag: `http://example.com/locked/member`, + conditions: []Condition{{ + Token: `urn:uuid:150852e2-3847-42d5-8cbe-0f4f296f26cf`, + }}, + }}, + }, + }, { + "section 9.9.6", + `() + ()`, + ifHeader{ + lists: []ifList{{ + conditions: []Condition{{ + Token: `urn:uuid:fe184f2e-6eec-41d0-c765-01adc56e6bb4`, + }}, + }, { + conditions: []Condition{{ + Token: `urn:uuid:e454f3f3-acdc-452a-56c7-00a5c91e4b77`, + }}, + }}, + }, + }, { + "section 9.10.8", + `()`, + ifHeader{ + lists: []ifList{{ + conditions: []Condition{{ + Token: `urn:uuid:e71d4fae-5dec-22d6-fea5-00a0c91e6be4`, + }}, + }}, + }, + }, { + "section 10.4.6", + `( + ["I am an ETag"]) + (["I am another ETag"])`, + ifHeader{ + lists: []ifList{{ + conditions: []Condition{{ + Token: `urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2`, + }, { + ETag: `"I am an ETag"`, + }}, + }, { + conditions: []Condition{{ + ETag: `"I am another ETag"`, + }}, + }}, + }, + }, { + "section 10.4.7", + `(Not + )`, + ifHeader{ + lists: []ifList{{ + conditions: []Condition{{ + Not: true, + Token: `urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2`, + }, { + Token: `urn:uuid:58f202ac-22cf-11d1-b12d-002035b29092`, + }}, + }}, + }, + }, { + "section 10.4.8", + `() + (Not )`, + ifHeader{ + lists: []ifList{{ + conditions: []Condition{{ + Token: `urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2`, + }}, + }, { + conditions: []Condition{{ + Not: true, + Token: `DAV:no-lock`, + }}, + }}, + }, + }, { + "section 10.4.9", + ` + ( + [W/"A weak ETag"]) (["strong ETag"])`, + ifHeader{ + lists: []ifList{{ + resourceTag: `/resource1`, + conditions: []Condition{{ + Token: `urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2`, + }, { + ETag: `W/"A weak ETag"`, + }}, + }, { + resourceTag: `/resource1`, + conditions: []Condition{{ + ETag: `"strong ETag"`, + }}, + }}, + }, + }, { + "section 10.4.10", + ` + ()`, + ifHeader{ + lists: []ifList{{ + resourceTag: `http://www.example.com/specs/`, + conditions: []Condition{{ + Token: `urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2`, + }}, + }}, + }, + }, { + "section 10.4.11 #1", + ` (["4217"])`, + ifHeader{ + lists: []ifList{{ + resourceTag: `/specs/rfc2518.doc`, + conditions: []Condition{{ + ETag: `"4217"`, + }}, + }}, + }, + }, { + "section 10.4.11 #2", + ` (Not ["4217"])`, + ifHeader{ + lists: []ifList{{ + resourceTag: `/specs/rfc2518.doc`, + conditions: []Condition{{ + Not: true, + ETag: `"4217"`, + }}, + }}, + }, + }} + + for _, tc := range testCases { + got, ok := parseIfHeader(strings.Replace(tc.input, "\n", "", -1)) + if gotEmpty := reflect.DeepEqual(got, ifHeader{}); gotEmpty == ok { + t.Errorf("%s: should be different: empty header == %t, ok == %t", tc.desc, gotEmpty, ok) + continue + } + if !reflect.DeepEqual(got, tc.want) { + t.Errorf("%s:\ngot %v\nwant %v", tc.desc, got, tc.want) + continue + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/internal/xml/README b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/internal/xml/README new file mode 100644 index 0000000..89656f4 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/internal/xml/README @@ -0,0 +1,11 @@ +This is a fork of the encoding/xml package at ca1d6c4, the last commit before +https://go.googlesource.com/go/+/c0d6d33 "encoding/xml: restore Go 1.4 name +space behavior" made late in the lead-up to the Go 1.5 release. + +The list of encoding/xml changes is at +https://go.googlesource.com/go/+log/master/src/encoding/xml + +This fork is temporary, and I (nigeltao) expect to revert it after Go 1.6 is +released. + +See http://golang.org/issue/11841 diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/internal/xml/atom_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/internal/xml/atom_test.go new file mode 100644 index 0000000..a712843 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/internal/xml/atom_test.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 xml + +import "time" + +var atomValue = &Feed{ + XMLName: Name{"http://www.w3.org/2005/Atom", "feed"}, + Title: "Example Feed", + Link: []Link{{Href: "http://example.org/"}}, + Updated: ParseTime("2003-12-13T18:30:02Z"), + Author: Person{Name: "John Doe"}, + Id: "urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6", + + Entry: []Entry{ + { + Title: "Atom-Powered Robots Run Amok", + Link: []Link{{Href: "http://example.org/2003/12/13/atom03"}}, + Id: "urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a", + Updated: ParseTime("2003-12-13T18:30:02Z"), + Summary: NewText("Some text."), + }, + }, +} + +var atomXml = `` + + `` + + `Example Feed` + + `urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6` + + `` + + `John Doe` + + `` + + `Atom-Powered Robots Run Amok` + + `urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a` + + `` + + `2003-12-13T18:30:02Z` + + `` + + `Some text.` + + `` + + `` + +func ParseTime(str string) time.Time { + t, err := time.Parse(time.RFC3339, str) + if err != nil { + panic(err) + } + return t +} + +func NewText(text string) Text { + return Text{ + Body: text, + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/internal/xml/example_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/internal/xml/example_test.go new file mode 100644 index 0000000..21b48de --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/internal/xml/example_test.go @@ -0,0 +1,151 @@ +// 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 xml_test + +import ( + "encoding/xml" + "fmt" + "os" +) + +func ExampleMarshalIndent() { + type Address struct { + City, State string + } + type Person struct { + XMLName xml.Name `xml:"person"` + Id int `xml:"id,attr"` + FirstName string `xml:"name>first"` + LastName string `xml:"name>last"` + Age int `xml:"age"` + Height float32 `xml:"height,omitempty"` + Married bool + Address + Comment string `xml:",comment"` + } + + v := &Person{Id: 13, FirstName: "John", LastName: "Doe", Age: 42} + v.Comment = " Need more details. " + v.Address = Address{"Hanga Roa", "Easter Island"} + + output, err := xml.MarshalIndent(v, " ", " ") + if err != nil { + fmt.Printf("error: %v\n", err) + } + + os.Stdout.Write(output) + // Output: + // + // + // John + // Doe + // + // 42 + // false + // Hanga Roa + // Easter Island + // + // +} + +func ExampleEncoder() { + type Address struct { + City, State string + } + type Person struct { + XMLName xml.Name `xml:"person"` + Id int `xml:"id,attr"` + FirstName string `xml:"name>first"` + LastName string `xml:"name>last"` + Age int `xml:"age"` + Height float32 `xml:"height,omitempty"` + Married bool + Address + Comment string `xml:",comment"` + } + + v := &Person{Id: 13, FirstName: "John", LastName: "Doe", Age: 42} + v.Comment = " Need more details. " + v.Address = Address{"Hanga Roa", "Easter Island"} + + enc := xml.NewEncoder(os.Stdout) + enc.Indent(" ", " ") + if err := enc.Encode(v); err != nil { + fmt.Printf("error: %v\n", err) + } + + // Output: + // + // + // John + // Doe + // + // 42 + // false + // Hanga Roa + // Easter Island + // + // +} + +// This example demonstrates unmarshaling an XML excerpt into a value with +// some preset fields. Note that the Phone field isn't modified and that +// the XML element is ignored. Also, the Groups field is assigned +// considering the element path provided in its tag. +func ExampleUnmarshal() { + type Email struct { + Where string `xml:"where,attr"` + Addr string + } + type Address struct { + City, State string + } + type Result struct { + XMLName xml.Name `xml:"Person"` + Name string `xml:"FullName"` + Phone string + Email []Email + Groups []string `xml:"Group>Value"` + Address + } + v := Result{Name: "none", Phone: "none"} + + data := ` + + Grace R. Emlin + Example Inc. + + gre@example.com + + + gre@work.com + + + Friends + Squash + + Hanga Roa + Easter Island + + ` + err := xml.Unmarshal([]byte(data), &v) + if err != nil { + fmt.Printf("error: %v", err) + return + } + fmt.Printf("XMLName: %#v\n", v.XMLName) + fmt.Printf("Name: %q\n", v.Name) + fmt.Printf("Phone: %q\n", v.Phone) + fmt.Printf("Email: %v\n", v.Email) + fmt.Printf("Groups: %v\n", v.Groups) + fmt.Printf("Address: %v\n", v.Address) + // Output: + // XMLName: xml.Name{Space:"", Local:"Person"} + // Name: "Grace R. Emlin" + // Phone: "none" + // Email: [{home gre@example.com} {work gre@work.com}] + // Groups: [Friends Squash] + // Address: {Hanga Roa Easter Island} +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/internal/xml/marshal.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/internal/xml/marshal.go new file mode 100644 index 0000000..cb82ec2 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/internal/xml/marshal.go @@ -0,0 +1,1223 @@ +// 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 xml + +import ( + "bufio" + "bytes" + "encoding" + "fmt" + "io" + "reflect" + "strconv" + "strings" +) + +const ( + // A generic XML header suitable for use with the output of Marshal. + // This is not automatically added to any output of this package, + // it is provided as a convenience. + Header = `` + "\n" +) + +// Marshal returns the XML encoding of v. +// +// Marshal handles an array or slice by marshalling each of the elements. +// Marshal handles a pointer by marshalling the value it points at or, if the +// pointer is nil, by writing nothing. Marshal handles an interface value by +// marshalling the value it contains or, if the interface value is nil, by +// writing nothing. Marshal handles all other data by writing one or more XML +// elements containing the data. +// +// The name for the XML elements is taken from, in order of preference: +// - the tag on the XMLName field, if the data is a struct +// - the value of the XMLName field of type xml.Name +// - the tag of the struct field used to obtain the data +// - the name of the struct field used to obtain the data +// - the name of the marshalled type +// +// The XML element for a struct contains marshalled elements for each of the +// exported fields of the struct, with these exceptions: +// - the XMLName field, described above, is omitted. +// - a field with tag "-" is omitted. +// - a field with tag "name,attr" becomes an attribute with +// the given name in the XML element. +// - a field with tag ",attr" becomes an attribute with the +// field name in the XML element. +// - a field with tag ",chardata" is written as character data, +// not as an XML element. +// - a field with tag ",innerxml" is written verbatim, not subject +// to the usual marshalling procedure. +// - a field with tag ",comment" is written as an XML comment, not +// subject to the usual marshalling procedure. It must not contain +// the "--" string within it. +// - a field with a tag including the "omitempty" option is omitted +// if the field value is empty. The empty values are false, 0, any +// nil pointer or interface value, and any array, slice, map, or +// string of length zero. +// - an anonymous struct field is handled as if the fields of its +// value were part of the outer struct. +// +// If a field uses a tag "a>b>c", then the element c will be nested inside +// parent elements a and b. Fields that appear next to each other that name +// the same parent will be enclosed in one XML element. +// +// See MarshalIndent for an example. +// +// Marshal will return an error if asked to marshal a channel, function, or map. +func Marshal(v interface{}) ([]byte, error) { + var b bytes.Buffer + if err := NewEncoder(&b).Encode(v); err != nil { + return nil, err + } + return b.Bytes(), nil +} + +// Marshaler is the interface implemented by objects that can marshal +// themselves into valid XML elements. +// +// MarshalXML encodes the receiver as zero or more XML elements. +// By convention, arrays or slices are typically encoded as a sequence +// of elements, one per entry. +// Using start as the element tag is not required, but doing so +// will enable Unmarshal to match the XML elements to the correct +// struct field. +// One common implementation strategy is to construct a separate +// value with a layout corresponding to the desired XML and then +// to encode it using e.EncodeElement. +// Another common strategy is to use repeated calls to e.EncodeToken +// to generate the XML output one token at a time. +// The sequence of encoded tokens must make up zero or more valid +// XML elements. +type Marshaler interface { + MarshalXML(e *Encoder, start StartElement) error +} + +// MarshalerAttr is the interface implemented by objects that can marshal +// themselves into valid XML attributes. +// +// MarshalXMLAttr returns an XML attribute with the encoded value of the receiver. +// Using name as the attribute name is not required, but doing so +// will enable Unmarshal to match the attribute to the correct +// struct field. +// If MarshalXMLAttr returns the zero attribute Attr{}, no attribute +// will be generated in the output. +// MarshalXMLAttr is used only for struct fields with the +// "attr" option in the field tag. +type MarshalerAttr interface { + MarshalXMLAttr(name Name) (Attr, error) +} + +// MarshalIndent works like Marshal, but each XML element begins on a new +// indented line that starts with prefix and is followed by one or more +// copies of indent according to the nesting depth. +func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) { + var b bytes.Buffer + enc := NewEncoder(&b) + enc.Indent(prefix, indent) + if err := enc.Encode(v); err != nil { + return nil, err + } + return b.Bytes(), nil +} + +// An Encoder writes XML data to an output stream. +type Encoder struct { + p printer +} + +// NewEncoder returns a new encoder that writes to w. +func NewEncoder(w io.Writer) *Encoder { + e := &Encoder{printer{Writer: bufio.NewWriter(w)}} + e.p.encoder = e + return e +} + +// Indent sets the encoder to generate XML in which each element +// begins on a new indented line that starts with prefix and is followed by +// one or more copies of indent according to the nesting depth. +func (enc *Encoder) Indent(prefix, indent string) { + enc.p.prefix = prefix + enc.p.indent = indent +} + +// Encode writes the XML encoding of v to the stream. +// +// See the documentation for Marshal for details about the conversion +// of Go values to XML. +// +// Encode calls Flush before returning. +func (enc *Encoder) Encode(v interface{}) error { + err := enc.p.marshalValue(reflect.ValueOf(v), nil, nil) + if err != nil { + return err + } + return enc.p.Flush() +} + +// EncodeElement writes the XML encoding of v to the stream, +// using start as the outermost tag in the encoding. +// +// See the documentation for Marshal for details about the conversion +// of Go values to XML. +// +// EncodeElement calls Flush before returning. +func (enc *Encoder) EncodeElement(v interface{}, start StartElement) error { + err := enc.p.marshalValue(reflect.ValueOf(v), nil, &start) + if err != nil { + return err + } + return enc.p.Flush() +} + +var ( + begComment = []byte("") + endProcInst = []byte("?>") + endDirective = []byte(">") +) + +// EncodeToken writes the given XML token to the stream. +// It returns an error if StartElement and EndElement tokens are not +// properly matched. +// +// EncodeToken does not call Flush, because usually it is part of a +// larger operation such as Encode or EncodeElement (or a custom +// Marshaler's MarshalXML invoked during those), and those will call +// Flush when finished. Callers that create an Encoder and then invoke +// EncodeToken directly, without using Encode or EncodeElement, need to +// call Flush when finished to ensure that the XML is written to the +// underlying writer. +// +// EncodeToken allows writing a ProcInst with Target set to "xml" only +// as the first token in the stream. +// +// When encoding a StartElement holding an XML namespace prefix +// declaration for a prefix that is not already declared, contained +// elements (including the StartElement itself) will use the declared +// prefix when encoding names with matching namespace URIs. +func (enc *Encoder) EncodeToken(t Token) error { + + p := &enc.p + switch t := t.(type) { + case StartElement: + if err := p.writeStart(&t); err != nil { + return err + } + case EndElement: + if err := p.writeEnd(t.Name); err != nil { + return err + } + case CharData: + escapeText(p, t, false) + case Comment: + if bytes.Contains(t, endComment) { + return fmt.Errorf("xml: EncodeToken of Comment containing --> marker") + } + p.WriteString("") + return p.cachedWriteError() + case ProcInst: + // First token to be encoded which is also a ProcInst with target of xml + // is the xml declaration. The only ProcInst where target of xml is allowed. + if t.Target == "xml" && p.Buffered() != 0 { + return fmt.Errorf("xml: EncodeToken of ProcInst xml target only valid for xml declaration, first token encoded") + } + if !isNameString(t.Target) { + return fmt.Errorf("xml: EncodeToken of ProcInst with invalid Target") + } + if bytes.Contains(t.Inst, endProcInst) { + return fmt.Errorf("xml: EncodeToken of ProcInst containing ?> marker") + } + p.WriteString(" 0 { + p.WriteByte(' ') + p.Write(t.Inst) + } + p.WriteString("?>") + case Directive: + if !isValidDirective(t) { + return fmt.Errorf("xml: EncodeToken of Directive containing wrong < or > markers") + } + p.WriteString("") + default: + return fmt.Errorf("xml: EncodeToken of invalid token type") + + } + return p.cachedWriteError() +} + +// isValidDirective reports whether dir is a valid directive text, +// meaning angle brackets are matched, ignoring comments and strings. +func isValidDirective(dir Directive) bool { + var ( + depth int + inquote uint8 + incomment bool + ) + for i, c := range dir { + switch { + case incomment: + if c == '>' { + if n := 1 + i - len(endComment); n >= 0 && bytes.Equal(dir[n:i+1], endComment) { + incomment = false + } + } + // Just ignore anything in comment + case inquote != 0: + if c == inquote { + inquote = 0 + } + // Just ignore anything within quotes + case c == '\'' || c == '"': + inquote = c + case c == '<': + if i+len(begComment) < len(dir) && bytes.Equal(dir[i:i+len(begComment)], begComment) { + incomment = true + } else { + depth++ + } + case c == '>': + if depth == 0 { + return false + } + depth-- + } + } + return depth == 0 && inquote == 0 && !incomment +} + +// Flush flushes any buffered XML to the underlying writer. +// See the EncodeToken documentation for details about when it is necessary. +func (enc *Encoder) Flush() error { + return enc.p.Flush() +} + +type printer struct { + *bufio.Writer + encoder *Encoder + seq int + indent string + prefix string + depth int + indentedIn bool + putNewline bool + defaultNS string + attrNS map[string]string // map prefix -> name space + attrPrefix map[string]string // map name space -> prefix + prefixes []printerPrefix + tags []Name +} + +// printerPrefix holds a namespace undo record. +// When an element is popped, the prefix record +// is set back to the recorded URL. The empty +// prefix records the URL for the default name space. +// +// The start of an element is recorded with an element +// that has mark=true. +type printerPrefix struct { + prefix string + url string + mark bool +} + +func (p *printer) prefixForNS(url string, isAttr bool) string { + // The "http://www.w3.org/XML/1998/namespace" name space is predefined as "xml" + // and must be referred to that way. + // (The "http://www.w3.org/2000/xmlns/" name space is also predefined as "xmlns", + // but users should not be trying to use that one directly - that's our job.) + if url == xmlURL { + return "xml" + } + if !isAttr && url == p.defaultNS { + // We can use the default name space. + return "" + } + return p.attrPrefix[url] +} + +// defineNS pushes any namespace definition found in the given attribute. +// If ignoreNonEmptyDefault is true, an xmlns="nonempty" +// attribute will be ignored. +func (p *printer) defineNS(attr Attr, ignoreNonEmptyDefault bool) error { + var prefix string + if attr.Name.Local == "xmlns" { + if attr.Name.Space != "" && attr.Name.Space != "xml" && attr.Name.Space != xmlURL { + return fmt.Errorf("xml: cannot redefine xmlns attribute prefix") + } + } else if attr.Name.Space == "xmlns" && attr.Name.Local != "" { + prefix = attr.Name.Local + if attr.Value == "" { + // Technically, an empty XML namespace is allowed for an attribute. + // From http://www.w3.org/TR/xml-names11/#scoping-defaulting: + // + // The attribute value in a namespace declaration for a prefix may be + // empty. This has the effect, within the scope of the declaration, of removing + // any association of the prefix with a namespace name. + // + // However our namespace prefixes here are used only as hints. There's + // no need to respect the removal of a namespace prefix, so we ignore it. + return nil + } + } else { + // Ignore: it's not a namespace definition + return nil + } + if prefix == "" { + if attr.Value == p.defaultNS { + // No need for redefinition. + return nil + } + if attr.Value != "" && ignoreNonEmptyDefault { + // We have an xmlns="..." value but + // it can't define a name space in this context, + // probably because the element has an empty + // name space. In this case, we just ignore + // the name space declaration. + return nil + } + } else if _, ok := p.attrPrefix[attr.Value]; ok { + // There's already a prefix for the given name space, + // so use that. This prevents us from + // having two prefixes for the same name space + // so attrNS and attrPrefix can remain bijective. + return nil + } + p.pushPrefix(prefix, attr.Value) + return nil +} + +// createNSPrefix creates a name space prefix attribute +// to use for the given name space, defining a new prefix +// if necessary. +// If isAttr is true, the prefix is to be created for an attribute +// prefix, which means that the default name space cannot +// be used. +func (p *printer) createNSPrefix(url string, isAttr bool) { + if _, ok := p.attrPrefix[url]; ok { + // We already have a prefix for the given URL. + return + } + switch { + case !isAttr && url == p.defaultNS: + // We can use the default name space. + return + case url == "": + // The only way we can encode names in the empty + // name space is by using the default name space, + // so we must use that. + if p.defaultNS != "" { + // The default namespace is non-empty, so we + // need to set it to empty. + p.pushPrefix("", "") + } + return + case url == xmlURL: + return + } + // TODO If the URL is an existing prefix, we could + // use it as is. That would enable the + // marshaling of elements that had been unmarshaled + // and with a name space prefix that was not found. + // although technically it would be incorrect. + + // Pick a name. We try to use the final element of the path + // but fall back to _. + prefix := strings.TrimRight(url, "/") + if i := strings.LastIndex(prefix, "/"); i >= 0 { + prefix = prefix[i+1:] + } + if prefix == "" || !isName([]byte(prefix)) || strings.Contains(prefix, ":") { + prefix = "_" + } + if strings.HasPrefix(prefix, "xml") { + // xmlanything is reserved. + prefix = "_" + prefix + } + if p.attrNS[prefix] != "" { + // Name is taken. Find a better one. + for p.seq++; ; p.seq++ { + if id := prefix + "_" + strconv.Itoa(p.seq); p.attrNS[id] == "" { + prefix = id + break + } + } + } + + p.pushPrefix(prefix, url) +} + +// writeNamespaces writes xmlns attributes for all the +// namespace prefixes that have been defined in +// the current element. +func (p *printer) writeNamespaces() { + for i := len(p.prefixes) - 1; i >= 0; i-- { + prefix := p.prefixes[i] + if prefix.mark { + return + } + p.WriteString(" ") + if prefix.prefix == "" { + // Default name space. + p.WriteString(`xmlns="`) + } else { + p.WriteString("xmlns:") + p.WriteString(prefix.prefix) + p.WriteString(`="`) + } + EscapeText(p, []byte(p.nsForPrefix(prefix.prefix))) + p.WriteString(`"`) + } +} + +// pushPrefix pushes a new prefix on the prefix stack +// without checking to see if it is already defined. +func (p *printer) pushPrefix(prefix, url string) { + p.prefixes = append(p.prefixes, printerPrefix{ + prefix: prefix, + url: p.nsForPrefix(prefix), + }) + p.setAttrPrefix(prefix, url) +} + +// nsForPrefix returns the name space for the given +// prefix. Note that this is not valid for the +// empty attribute prefix, which always has an empty +// name space. +func (p *printer) nsForPrefix(prefix string) string { + if prefix == "" { + return p.defaultNS + } + return p.attrNS[prefix] +} + +// markPrefix marks the start of an element on the prefix +// stack. +func (p *printer) markPrefix() { + p.prefixes = append(p.prefixes, printerPrefix{ + mark: true, + }) +} + +// popPrefix pops all defined prefixes for the current +// element. +func (p *printer) popPrefix() { + for len(p.prefixes) > 0 { + prefix := p.prefixes[len(p.prefixes)-1] + p.prefixes = p.prefixes[:len(p.prefixes)-1] + if prefix.mark { + break + } + p.setAttrPrefix(prefix.prefix, prefix.url) + } +} + +// setAttrPrefix sets an attribute name space prefix. +// If url is empty, the attribute is removed. +// If prefix is empty, the default name space is set. +func (p *printer) setAttrPrefix(prefix, url string) { + if prefix == "" { + p.defaultNS = url + return + } + if url == "" { + delete(p.attrPrefix, p.attrNS[prefix]) + delete(p.attrNS, prefix) + return + } + if p.attrPrefix == nil { + // Need to define a new name space. + p.attrPrefix = make(map[string]string) + p.attrNS = make(map[string]string) + } + // Remove any old prefix value. This is OK because we maintain a + // strict one-to-one mapping between prefix and URL (see + // defineNS) + delete(p.attrPrefix, p.attrNS[prefix]) + p.attrPrefix[url] = prefix + p.attrNS[prefix] = url +} + +var ( + marshalerType = reflect.TypeOf((*Marshaler)(nil)).Elem() + marshalerAttrType = reflect.TypeOf((*MarshalerAttr)(nil)).Elem() + textMarshalerType = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem() +) + +// marshalValue writes one or more XML elements representing val. +// If val was obtained from a struct field, finfo must have its details. +func (p *printer) marshalValue(val reflect.Value, finfo *fieldInfo, startTemplate *StartElement) error { + if startTemplate != nil && startTemplate.Name.Local == "" { + return fmt.Errorf("xml: EncodeElement of StartElement with missing name") + } + + if !val.IsValid() { + return nil + } + if finfo != nil && finfo.flags&fOmitEmpty != 0 && isEmptyValue(val) { + return nil + } + + // Drill into interfaces and pointers. + // This can turn into an infinite loop given a cyclic chain, + // but it matches the Go 1 behavior. + for val.Kind() == reflect.Interface || val.Kind() == reflect.Ptr { + if val.IsNil() { + return nil + } + val = val.Elem() + } + + kind := val.Kind() + typ := val.Type() + + // Check for marshaler. + if val.CanInterface() && typ.Implements(marshalerType) { + return p.marshalInterface(val.Interface().(Marshaler), p.defaultStart(typ, finfo, startTemplate)) + } + if val.CanAddr() { + pv := val.Addr() + if pv.CanInterface() && pv.Type().Implements(marshalerType) { + return p.marshalInterface(pv.Interface().(Marshaler), p.defaultStart(pv.Type(), finfo, startTemplate)) + } + } + + // Check for text marshaler. + if val.CanInterface() && typ.Implements(textMarshalerType) { + return p.marshalTextInterface(val.Interface().(encoding.TextMarshaler), p.defaultStart(typ, finfo, startTemplate)) + } + if val.CanAddr() { + pv := val.Addr() + if pv.CanInterface() && pv.Type().Implements(textMarshalerType) { + return p.marshalTextInterface(pv.Interface().(encoding.TextMarshaler), p.defaultStart(pv.Type(), finfo, startTemplate)) + } + } + + // Slices and arrays iterate over the elements. They do not have an enclosing tag. + if (kind == reflect.Slice || kind == reflect.Array) && typ.Elem().Kind() != reflect.Uint8 { + for i, n := 0, val.Len(); i < n; i++ { + if err := p.marshalValue(val.Index(i), finfo, startTemplate); err != nil { + return err + } + } + return nil + } + + tinfo, err := getTypeInfo(typ) + if err != nil { + return err + } + + // Create start element. + // Precedence for the XML element name is: + // 0. startTemplate + // 1. XMLName field in underlying struct; + // 2. field name/tag in the struct field; and + // 3. type name + var start StartElement + + // explicitNS records whether the element's name space has been + // explicitly set (for example an XMLName field). + explicitNS := false + + if startTemplate != nil { + start.Name = startTemplate.Name + explicitNS = true + start.Attr = append(start.Attr, startTemplate.Attr...) + } else if tinfo.xmlname != nil { + xmlname := tinfo.xmlname + if xmlname.name != "" { + start.Name.Space, start.Name.Local = xmlname.xmlns, xmlname.name + } else if v, ok := xmlname.value(val).Interface().(Name); ok && v.Local != "" { + start.Name = v + } + explicitNS = true + } + if start.Name.Local == "" && finfo != nil { + start.Name.Local = finfo.name + if finfo.xmlns != "" { + start.Name.Space = finfo.xmlns + explicitNS = true + } + } + if start.Name.Local == "" { + name := typ.Name() + if name == "" { + return &UnsupportedTypeError{typ} + } + start.Name.Local = name + } + + // defaultNS records the default name space as set by a xmlns="..." + // attribute. We don't set p.defaultNS because we want to let + // the attribute writing code (in p.defineNS) be solely responsible + // for maintaining that. + defaultNS := p.defaultNS + + // Attributes + for i := range tinfo.fields { + finfo := &tinfo.fields[i] + if finfo.flags&fAttr == 0 { + continue + } + attr, err := p.fieldAttr(finfo, val) + if err != nil { + return err + } + if attr.Name.Local == "" { + continue + } + start.Attr = append(start.Attr, attr) + if attr.Name.Space == "" && attr.Name.Local == "xmlns" { + defaultNS = attr.Value + } + } + if !explicitNS { + // Historic behavior: elements use the default name space + // they are contained in by default. + start.Name.Space = defaultNS + } + // Historic behaviour: an element that's in a namespace sets + // the default namespace for all elements contained within it. + start.setDefaultNamespace() + + if err := p.writeStart(&start); err != nil { + return err + } + + if val.Kind() == reflect.Struct { + err = p.marshalStruct(tinfo, val) + } else { + s, b, err1 := p.marshalSimple(typ, val) + if err1 != nil { + err = err1 + } else if b != nil { + EscapeText(p, b) + } else { + p.EscapeString(s) + } + } + if err != nil { + return err + } + + if err := p.writeEnd(start.Name); err != nil { + return err + } + + return p.cachedWriteError() +} + +// fieldAttr returns the attribute of the given field. +// If the returned attribute has an empty Name.Local, +// it should not be used. +// The given value holds the value containing the field. +func (p *printer) fieldAttr(finfo *fieldInfo, val reflect.Value) (Attr, error) { + fv := finfo.value(val) + name := Name{Space: finfo.xmlns, Local: finfo.name} + if finfo.flags&fOmitEmpty != 0 && isEmptyValue(fv) { + return Attr{}, nil + } + if fv.Kind() == reflect.Interface && fv.IsNil() { + return Attr{}, nil + } + if fv.CanInterface() && fv.Type().Implements(marshalerAttrType) { + attr, err := fv.Interface().(MarshalerAttr).MarshalXMLAttr(name) + return attr, err + } + if fv.CanAddr() { + pv := fv.Addr() + if pv.CanInterface() && pv.Type().Implements(marshalerAttrType) { + attr, err := pv.Interface().(MarshalerAttr).MarshalXMLAttr(name) + return attr, err + } + } + if fv.CanInterface() && fv.Type().Implements(textMarshalerType) { + text, err := fv.Interface().(encoding.TextMarshaler).MarshalText() + if err != nil { + return Attr{}, err + } + return Attr{name, string(text)}, nil + } + if fv.CanAddr() { + pv := fv.Addr() + if pv.CanInterface() && pv.Type().Implements(textMarshalerType) { + text, err := pv.Interface().(encoding.TextMarshaler).MarshalText() + if err != nil { + return Attr{}, err + } + return Attr{name, string(text)}, nil + } + } + // Dereference or skip nil pointer, interface values. + switch fv.Kind() { + case reflect.Ptr, reflect.Interface: + if fv.IsNil() { + return Attr{}, nil + } + fv = fv.Elem() + } + s, b, err := p.marshalSimple(fv.Type(), fv) + if err != nil { + return Attr{}, err + } + if b != nil { + s = string(b) + } + return Attr{name, s}, nil +} + +// defaultStart returns the default start element to use, +// given the reflect type, field info, and start template. +func (p *printer) defaultStart(typ reflect.Type, finfo *fieldInfo, startTemplate *StartElement) StartElement { + var start StartElement + // Precedence for the XML element name is as above, + // except that we do not look inside structs for the first field. + if startTemplate != nil { + start.Name = startTemplate.Name + start.Attr = append(start.Attr, startTemplate.Attr...) + } else if finfo != nil && finfo.name != "" { + start.Name.Local = finfo.name + start.Name.Space = finfo.xmlns + } else if typ.Name() != "" { + start.Name.Local = typ.Name() + } else { + // Must be a pointer to a named type, + // since it has the Marshaler methods. + start.Name.Local = typ.Elem().Name() + } + // Historic behaviour: elements use the name space of + // the element they are contained in by default. + if start.Name.Space == "" { + start.Name.Space = p.defaultNS + } + start.setDefaultNamespace() + return start +} + +// marshalInterface marshals a Marshaler interface value. +func (p *printer) marshalInterface(val Marshaler, start StartElement) error { + // Push a marker onto the tag stack so that MarshalXML + // cannot close the XML tags that it did not open. + p.tags = append(p.tags, Name{}) + n := len(p.tags) + + err := val.MarshalXML(p.encoder, start) + if err != nil { + return err + } + + // Make sure MarshalXML closed all its tags. p.tags[n-1] is the mark. + if len(p.tags) > n { + return fmt.Errorf("xml: %s.MarshalXML wrote invalid XML: <%s> not closed", receiverType(val), p.tags[len(p.tags)-1].Local) + } + p.tags = p.tags[:n-1] + return nil +} + +// marshalTextInterface marshals a TextMarshaler interface value. +func (p *printer) marshalTextInterface(val encoding.TextMarshaler, start StartElement) error { + if err := p.writeStart(&start); err != nil { + return err + } + text, err := val.MarshalText() + if err != nil { + return err + } + EscapeText(p, text) + return p.writeEnd(start.Name) +} + +// writeStart writes the given start element. +func (p *printer) writeStart(start *StartElement) error { + if start.Name.Local == "" { + return fmt.Errorf("xml: start tag with no name") + } + + p.tags = append(p.tags, start.Name) + p.markPrefix() + // Define any name spaces explicitly declared in the attributes. + // We do this as a separate pass so that explicitly declared prefixes + // will take precedence over implicitly declared prefixes + // regardless of the order of the attributes. + ignoreNonEmptyDefault := start.Name.Space == "" + for _, attr := range start.Attr { + if err := p.defineNS(attr, ignoreNonEmptyDefault); err != nil { + return err + } + } + // Define any new name spaces implied by the attributes. + for _, attr := range start.Attr { + name := attr.Name + // From http://www.w3.org/TR/xml-names11/#defaulting + // "Default namespace declarations do not apply directly + // to attribute names; the interpretation of unprefixed + // attributes is determined by the element on which they + // appear." + // This means we don't need to create a new namespace + // when an attribute name space is empty. + if name.Space != "" && !name.isNamespace() { + p.createNSPrefix(name.Space, true) + } + } + p.createNSPrefix(start.Name.Space, false) + + p.writeIndent(1) + p.WriteByte('<') + p.writeName(start.Name, false) + p.writeNamespaces() + for _, attr := range start.Attr { + name := attr.Name + if name.Local == "" || name.isNamespace() { + // Namespaces have already been written by writeNamespaces above. + continue + } + p.WriteByte(' ') + p.writeName(name, true) + p.WriteString(`="`) + p.EscapeString(attr.Value) + p.WriteByte('"') + } + p.WriteByte('>') + return nil +} + +// writeName writes the given name. It assumes +// that p.createNSPrefix(name) has already been called. +func (p *printer) writeName(name Name, isAttr bool) { + if prefix := p.prefixForNS(name.Space, isAttr); prefix != "" { + p.WriteString(prefix) + p.WriteByte(':') + } + p.WriteString(name.Local) +} + +func (p *printer) writeEnd(name Name) error { + if name.Local == "" { + return fmt.Errorf("xml: end tag with no name") + } + if len(p.tags) == 0 || p.tags[len(p.tags)-1].Local == "" { + return fmt.Errorf("xml: end tag without start tag", name.Local) + } + if top := p.tags[len(p.tags)-1]; top != name { + if top.Local != name.Local { + return fmt.Errorf("xml: end tag does not match start tag <%s>", name.Local, top.Local) + } + return fmt.Errorf("xml: end tag in namespace %s does not match start tag <%s> in namespace %s", name.Local, name.Space, top.Local, top.Space) + } + p.tags = p.tags[:len(p.tags)-1] + + p.writeIndent(-1) + p.WriteByte('<') + p.WriteByte('/') + p.writeName(name, false) + p.WriteByte('>') + p.popPrefix() + return nil +} + +func (p *printer) marshalSimple(typ reflect.Type, val reflect.Value) (string, []byte, error) { + switch val.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return strconv.FormatInt(val.Int(), 10), nil, nil + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return strconv.FormatUint(val.Uint(), 10), nil, nil + case reflect.Float32, reflect.Float64: + return strconv.FormatFloat(val.Float(), 'g', -1, val.Type().Bits()), nil, nil + case reflect.String: + return val.String(), nil, nil + case reflect.Bool: + return strconv.FormatBool(val.Bool()), nil, nil + case reflect.Array: + if typ.Elem().Kind() != reflect.Uint8 { + break + } + // [...]byte + var bytes []byte + if val.CanAddr() { + bytes = val.Slice(0, val.Len()).Bytes() + } else { + bytes = make([]byte, val.Len()) + reflect.Copy(reflect.ValueOf(bytes), val) + } + return "", bytes, nil + case reflect.Slice: + if typ.Elem().Kind() != reflect.Uint8 { + break + } + // []byte + return "", val.Bytes(), nil + } + return "", nil, &UnsupportedTypeError{typ} +} + +var ddBytes = []byte("--") + +func (p *printer) marshalStruct(tinfo *typeInfo, val reflect.Value) error { + s := parentStack{p: p} + for i := range tinfo.fields { + finfo := &tinfo.fields[i] + if finfo.flags&fAttr != 0 { + continue + } + vf := finfo.value(val) + + // Dereference or skip nil pointer, interface values. + switch vf.Kind() { + case reflect.Ptr, reflect.Interface: + if !vf.IsNil() { + vf = vf.Elem() + } + } + + switch finfo.flags & fMode { + case fCharData: + if err := s.setParents(&noField, reflect.Value{}); err != nil { + return err + } + if vf.CanInterface() && vf.Type().Implements(textMarshalerType) { + data, err := vf.Interface().(encoding.TextMarshaler).MarshalText() + if err != nil { + return err + } + Escape(p, data) + continue + } + if vf.CanAddr() { + pv := vf.Addr() + if pv.CanInterface() && pv.Type().Implements(textMarshalerType) { + data, err := pv.Interface().(encoding.TextMarshaler).MarshalText() + if err != nil { + return err + } + Escape(p, data) + continue + } + } + var scratch [64]byte + switch vf.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + Escape(p, strconv.AppendInt(scratch[:0], vf.Int(), 10)) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + Escape(p, strconv.AppendUint(scratch[:0], vf.Uint(), 10)) + case reflect.Float32, reflect.Float64: + Escape(p, strconv.AppendFloat(scratch[:0], vf.Float(), 'g', -1, vf.Type().Bits())) + case reflect.Bool: + Escape(p, strconv.AppendBool(scratch[:0], vf.Bool())) + case reflect.String: + if err := EscapeText(p, []byte(vf.String())); err != nil { + return err + } + case reflect.Slice: + if elem, ok := vf.Interface().([]byte); ok { + if err := EscapeText(p, elem); err != nil { + return err + } + } + } + continue + + case fComment: + if err := s.setParents(&noField, reflect.Value{}); err != nil { + return err + } + k := vf.Kind() + if !(k == reflect.String || k == reflect.Slice && vf.Type().Elem().Kind() == reflect.Uint8) { + return fmt.Errorf("xml: bad type for comment field of %s", val.Type()) + } + if vf.Len() == 0 { + continue + } + p.writeIndent(0) + p.WriteString("" is invalid grammar. Make it "- -->" + p.WriteByte(' ') + } + p.WriteString("-->") + continue + + case fInnerXml: + iface := vf.Interface() + switch raw := iface.(type) { + case []byte: + p.Write(raw) + continue + case string: + p.WriteString(raw) + continue + } + + case fElement, fElement | fAny: + if err := s.setParents(finfo, vf); err != nil { + return err + } + } + if err := p.marshalValue(vf, finfo, nil); err != nil { + return err + } + } + if err := s.setParents(&noField, reflect.Value{}); err != nil { + return err + } + return p.cachedWriteError() +} + +var noField fieldInfo + +// return the bufio Writer's cached write error +func (p *printer) cachedWriteError() error { + _, err := p.Write(nil) + return err +} + +func (p *printer) writeIndent(depthDelta int) { + if len(p.prefix) == 0 && len(p.indent) == 0 { + return + } + if depthDelta < 0 { + p.depth-- + if p.indentedIn { + p.indentedIn = false + return + } + p.indentedIn = false + } + if p.putNewline { + p.WriteByte('\n') + } else { + p.putNewline = true + } + if len(p.prefix) > 0 { + p.WriteString(p.prefix) + } + if len(p.indent) > 0 { + for i := 0; i < p.depth; i++ { + p.WriteString(p.indent) + } + } + if depthDelta > 0 { + p.depth++ + p.indentedIn = true + } +} + +type parentStack struct { + p *printer + xmlns string + parents []string +} + +// setParents sets the stack of current parents to those found in finfo. +// It only writes the start elements if vf holds a non-nil value. +// If finfo is &noField, it pops all elements. +func (s *parentStack) setParents(finfo *fieldInfo, vf reflect.Value) error { + xmlns := s.p.defaultNS + if finfo.xmlns != "" { + xmlns = finfo.xmlns + } + commonParents := 0 + if xmlns == s.xmlns { + for ; commonParents < len(finfo.parents) && commonParents < len(s.parents); commonParents++ { + if finfo.parents[commonParents] != s.parents[commonParents] { + break + } + } + } + // Pop off any parents that aren't in common with the previous field. + for i := len(s.parents) - 1; i >= commonParents; i-- { + if err := s.p.writeEnd(Name{ + Space: s.xmlns, + Local: s.parents[i], + }); err != nil { + return err + } + } + s.parents = finfo.parents + s.xmlns = xmlns + if commonParents >= len(s.parents) { + // No new elements to push. + return nil + } + if (vf.Kind() == reflect.Ptr || vf.Kind() == reflect.Interface) && vf.IsNil() { + // The element is nil, so no need for the start elements. + s.parents = s.parents[:commonParents] + return nil + } + // Push any new parents required. + for _, name := range s.parents[commonParents:] { + start := &StartElement{ + Name: Name{ + Space: s.xmlns, + Local: name, + }, + } + // Set the default name space for parent elements + // to match what we do with other elements. + if s.xmlns != s.p.defaultNS { + start.setDefaultNamespace() + } + if err := s.p.writeStart(start); err != nil { + return err + } + } + return nil +} + +// A MarshalXMLError is returned when Marshal encounters a type +// that cannot be converted into XML. +type UnsupportedTypeError struct { + Type reflect.Type +} + +func (e *UnsupportedTypeError) Error() string { + return "xml: unsupported type: " + e.Type.String() +} + +func isEmptyValue(v reflect.Value) bool { + switch v.Kind() { + case reflect.Array, reflect.Map, reflect.Slice, reflect.String: + return v.Len() == 0 + case reflect.Bool: + return !v.Bool() + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return v.Int() == 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return v.Uint() == 0 + case reflect.Float32, reflect.Float64: + return v.Float() == 0 + case reflect.Interface, reflect.Ptr: + return v.IsNil() + } + return false +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/internal/xml/marshal_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/internal/xml/marshal_test.go new file mode 100644 index 0000000..226cfd0 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/internal/xml/marshal_test.go @@ -0,0 +1,1939 @@ +// 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 xml + +import ( + "bytes" + "errors" + "fmt" + "io" + "reflect" + "strconv" + "strings" + "sync" + "testing" + "time" +) + +type DriveType int + +const ( + HyperDrive DriveType = iota + ImprobabilityDrive +) + +type Passenger struct { + Name []string `xml:"name"` + Weight float32 `xml:"weight"` +} + +type Ship struct { + XMLName struct{} `xml:"spaceship"` + + Name string `xml:"name,attr"` + Pilot string `xml:"pilot,attr"` + Drive DriveType `xml:"drive"` + Age uint `xml:"age"` + Passenger []*Passenger `xml:"passenger"` + secret string +} + +type NamedType string + +type Port struct { + XMLName struct{} `xml:"port"` + Type string `xml:"type,attr,omitempty"` + Comment string `xml:",comment"` + Number string `xml:",chardata"` +} + +type Domain struct { + XMLName struct{} `xml:"domain"` + Country string `xml:",attr,omitempty"` + Name []byte `xml:",chardata"` + Comment []byte `xml:",comment"` +} + +type Book struct { + XMLName struct{} `xml:"book"` + Title string `xml:",chardata"` +} + +type Event struct { + XMLName struct{} `xml:"event"` + Year int `xml:",chardata"` +} + +type Movie struct { + XMLName struct{} `xml:"movie"` + Length uint `xml:",chardata"` +} + +type Pi struct { + XMLName struct{} `xml:"pi"` + Approximation float32 `xml:",chardata"` +} + +type Universe struct { + XMLName struct{} `xml:"universe"` + Visible float64 `xml:",chardata"` +} + +type Particle struct { + XMLName struct{} `xml:"particle"` + HasMass bool `xml:",chardata"` +} + +type Departure struct { + XMLName struct{} `xml:"departure"` + When time.Time `xml:",chardata"` +} + +type SecretAgent struct { + XMLName struct{} `xml:"agent"` + Handle string `xml:"handle,attr"` + Identity string + Obfuscate string `xml:",innerxml"` +} + +type NestedItems struct { + XMLName struct{} `xml:"result"` + Items []string `xml:">item"` + Item1 []string `xml:"Items>item1"` +} + +type NestedOrder struct { + XMLName struct{} `xml:"result"` + Field1 string `xml:"parent>c"` + Field2 string `xml:"parent>b"` + Field3 string `xml:"parent>a"` +} + +type MixedNested struct { + XMLName struct{} `xml:"result"` + A string `xml:"parent1>a"` + B string `xml:"b"` + C string `xml:"parent1>parent2>c"` + D string `xml:"parent1>d"` +} + +type NilTest struct { + A interface{} `xml:"parent1>parent2>a"` + B interface{} `xml:"parent1>b"` + C interface{} `xml:"parent1>parent2>c"` +} + +type Service struct { + XMLName struct{} `xml:"service"` + Domain *Domain `xml:"host>domain"` + Port *Port `xml:"host>port"` + Extra1 interface{} + Extra2 interface{} `xml:"host>extra2"` +} + +var nilStruct *Ship + +type EmbedA struct { + EmbedC + EmbedB EmbedB + FieldA string +} + +type EmbedB struct { + FieldB string + *EmbedC +} + +type EmbedC struct { + FieldA1 string `xml:"FieldA>A1"` + FieldA2 string `xml:"FieldA>A2"` + FieldB string + FieldC string +} + +type NameCasing struct { + XMLName struct{} `xml:"casing"` + Xy string + XY string + XyA string `xml:"Xy,attr"` + XYA string `xml:"XY,attr"` +} + +type NamePrecedence struct { + XMLName Name `xml:"Parent"` + FromTag XMLNameWithoutTag `xml:"InTag"` + FromNameVal XMLNameWithoutTag + FromNameTag XMLNameWithTag + InFieldName string +} + +type XMLNameWithTag struct { + XMLName Name `xml:"InXMLNameTag"` + Value string `xml:",chardata"` +} + +type XMLNameWithNSTag struct { + XMLName Name `xml:"ns InXMLNameWithNSTag"` + Value string `xml:",chardata"` +} + +type XMLNameWithoutTag struct { + XMLName Name + Value string `xml:",chardata"` +} + +type NameInField struct { + Foo Name `xml:"ns foo"` +} + +type AttrTest struct { + Int int `xml:",attr"` + Named int `xml:"int,attr"` + Float float64 `xml:",attr"` + Uint8 uint8 `xml:",attr"` + Bool bool `xml:",attr"` + Str string `xml:",attr"` + Bytes []byte `xml:",attr"` +} + +type OmitAttrTest struct { + Int int `xml:",attr,omitempty"` + Named int `xml:"int,attr,omitempty"` + Float float64 `xml:",attr,omitempty"` + Uint8 uint8 `xml:",attr,omitempty"` + Bool bool `xml:",attr,omitempty"` + Str string `xml:",attr,omitempty"` + Bytes []byte `xml:",attr,omitempty"` +} + +type OmitFieldTest struct { + Int int `xml:",omitempty"` + Named int `xml:"int,omitempty"` + Float float64 `xml:",omitempty"` + Uint8 uint8 `xml:",omitempty"` + Bool bool `xml:",omitempty"` + Str string `xml:",omitempty"` + Bytes []byte `xml:",omitempty"` + Ptr *PresenceTest `xml:",omitempty"` +} + +type AnyTest struct { + XMLName struct{} `xml:"a"` + Nested string `xml:"nested>value"` + AnyField AnyHolder `xml:",any"` +} + +type AnyOmitTest struct { + XMLName struct{} `xml:"a"` + Nested string `xml:"nested>value"` + AnyField *AnyHolder `xml:",any,omitempty"` +} + +type AnySliceTest struct { + XMLName struct{} `xml:"a"` + Nested string `xml:"nested>value"` + AnyField []AnyHolder `xml:",any"` +} + +type AnyHolder struct { + XMLName Name + XML string `xml:",innerxml"` +} + +type RecurseA struct { + A string + B *RecurseB +} + +type RecurseB struct { + A *RecurseA + B string +} + +type PresenceTest struct { + Exists *struct{} +} + +type IgnoreTest struct { + PublicSecret string `xml:"-"` +} + +type MyBytes []byte + +type Data struct { + Bytes []byte + Attr []byte `xml:",attr"` + Custom MyBytes +} + +type Plain struct { + V interface{} +} + +type MyInt int + +type EmbedInt struct { + MyInt +} + +type Strings struct { + X []string `xml:"A>B,omitempty"` +} + +type PointerFieldsTest struct { + XMLName Name `xml:"dummy"` + Name *string `xml:"name,attr"` + Age *uint `xml:"age,attr"` + Empty *string `xml:"empty,attr"` + Contents *string `xml:",chardata"` +} + +type ChardataEmptyTest struct { + XMLName Name `xml:"test"` + Contents *string `xml:",chardata"` +} + +type MyMarshalerTest struct { +} + +var _ Marshaler = (*MyMarshalerTest)(nil) + +func (m *MyMarshalerTest) MarshalXML(e *Encoder, start StartElement) error { + e.EncodeToken(start) + e.EncodeToken(CharData([]byte("hello world"))) + e.EncodeToken(EndElement{start.Name}) + return nil +} + +type MyMarshalerAttrTest struct{} + +var _ MarshalerAttr = (*MyMarshalerAttrTest)(nil) + +func (m *MyMarshalerAttrTest) MarshalXMLAttr(name Name) (Attr, error) { + return Attr{name, "hello world"}, nil +} + +type MyMarshalerValueAttrTest struct{} + +var _ MarshalerAttr = MyMarshalerValueAttrTest{} + +func (m MyMarshalerValueAttrTest) MarshalXMLAttr(name Name) (Attr, error) { + return Attr{name, "hello world"}, nil +} + +type MarshalerStruct struct { + Foo MyMarshalerAttrTest `xml:",attr"` +} + +type MarshalerValueStruct struct { + Foo MyMarshalerValueAttrTest `xml:",attr"` +} + +type InnerStruct struct { + XMLName Name `xml:"testns outer"` +} + +type OuterStruct struct { + InnerStruct + IntAttr int `xml:"int,attr"` +} + +type OuterNamedStruct struct { + InnerStruct + XMLName Name `xml:"outerns test"` + IntAttr int `xml:"int,attr"` +} + +type OuterNamedOrderedStruct struct { + XMLName Name `xml:"outerns test"` + InnerStruct + IntAttr int `xml:"int,attr"` +} + +type OuterOuterStruct struct { + OuterStruct +} + +type NestedAndChardata struct { + AB []string `xml:"A>B"` + Chardata string `xml:",chardata"` +} + +type NestedAndComment struct { + AB []string `xml:"A>B"` + Comment string `xml:",comment"` +} + +type XMLNSFieldStruct struct { + Ns string `xml:"xmlns,attr"` + Body string +} + +type NamedXMLNSFieldStruct struct { + XMLName struct{} `xml:"testns test"` + Ns string `xml:"xmlns,attr"` + Body string +} + +type XMLNSFieldStructWithOmitEmpty struct { + Ns string `xml:"xmlns,attr,omitempty"` + Body string +} + +type NamedXMLNSFieldStructWithEmptyNamespace struct { + XMLName struct{} `xml:"test"` + Ns string `xml:"xmlns,attr"` + Body string +} + +type RecursiveXMLNSFieldStruct struct { + Ns string `xml:"xmlns,attr"` + Body *RecursiveXMLNSFieldStruct `xml:",omitempty"` + Text string `xml:",omitempty"` +} + +func ifaceptr(x interface{}) interface{} { + return &x +} + +var ( + nameAttr = "Sarah" + ageAttr = uint(12) + contentsAttr = "lorem ipsum" +) + +// Unless explicitly stated as such (or *Plain), all of the +// tests below are two-way tests. When introducing new tests, +// please try to make them two-way as well to ensure that +// marshalling and unmarshalling are as symmetrical as feasible. +var marshalTests = []struct { + Value interface{} + ExpectXML string + MarshalOnly bool + UnmarshalOnly bool +}{ + // Test nil marshals to nothing + {Value: nil, ExpectXML: ``, MarshalOnly: true}, + {Value: nilStruct, ExpectXML: ``, MarshalOnly: true}, + + // Test value types + {Value: &Plain{true}, ExpectXML: `true`}, + {Value: &Plain{false}, ExpectXML: `false`}, + {Value: &Plain{int(42)}, ExpectXML: `42`}, + {Value: &Plain{int8(42)}, ExpectXML: `42`}, + {Value: &Plain{int16(42)}, ExpectXML: `42`}, + {Value: &Plain{int32(42)}, ExpectXML: `42`}, + {Value: &Plain{uint(42)}, ExpectXML: `42`}, + {Value: &Plain{uint8(42)}, ExpectXML: `42`}, + {Value: &Plain{uint16(42)}, ExpectXML: `42`}, + {Value: &Plain{uint32(42)}, ExpectXML: `42`}, + {Value: &Plain{float32(1.25)}, ExpectXML: `1.25`}, + {Value: &Plain{float64(1.25)}, ExpectXML: `1.25`}, + {Value: &Plain{uintptr(0xFFDD)}, ExpectXML: `65501`}, + {Value: &Plain{"gopher"}, ExpectXML: `gopher`}, + {Value: &Plain{[]byte("gopher")}, ExpectXML: `gopher`}, + {Value: &Plain{""}, ExpectXML: `</>`}, + {Value: &Plain{[]byte("")}, ExpectXML: `</>`}, + {Value: &Plain{[3]byte{'<', '/', '>'}}, ExpectXML: `</>`}, + {Value: &Plain{NamedType("potato")}, ExpectXML: `potato`}, + {Value: &Plain{[]int{1, 2, 3}}, ExpectXML: `123`}, + {Value: &Plain{[3]int{1, 2, 3}}, ExpectXML: `123`}, + {Value: ifaceptr(true), MarshalOnly: true, ExpectXML: `true`}, + + // Test time. + { + Value: &Plain{time.Unix(1e9, 123456789).UTC()}, + ExpectXML: `2001-09-09T01:46:40.123456789Z`, + }, + + // A pointer to struct{} may be used to test for an element's presence. + { + Value: &PresenceTest{new(struct{})}, + ExpectXML: ``, + }, + { + Value: &PresenceTest{}, + ExpectXML: ``, + }, + + // A pointer to struct{} may be used to test for an element's presence. + { + Value: &PresenceTest{new(struct{})}, + ExpectXML: ``, + }, + { + Value: &PresenceTest{}, + ExpectXML: ``, + }, + + // A []byte field is only nil if the element was not found. + { + Value: &Data{}, + ExpectXML: ``, + UnmarshalOnly: true, + }, + { + Value: &Data{Bytes: []byte{}, Custom: MyBytes{}, Attr: []byte{}}, + ExpectXML: ``, + UnmarshalOnly: true, + }, + + // Check that []byte works, including named []byte types. + { + Value: &Data{Bytes: []byte("ab"), Custom: MyBytes("cd"), Attr: []byte{'v'}}, + ExpectXML: `abcd`, + }, + + // Test innerxml + { + Value: &SecretAgent{ + Handle: "007", + Identity: "James Bond", + Obfuscate: "", + }, + ExpectXML: `James Bond`, + MarshalOnly: true, + }, + { + Value: &SecretAgent{ + Handle: "007", + Identity: "James Bond", + Obfuscate: "James Bond", + }, + ExpectXML: `James Bond`, + UnmarshalOnly: true, + }, + + // Test structs + {Value: &Port{Type: "ssl", Number: "443"}, ExpectXML: `443`}, + {Value: &Port{Number: "443"}, ExpectXML: `443`}, + {Value: &Port{Type: ""}, ExpectXML: ``}, + {Value: &Port{Number: "443", Comment: "https"}, ExpectXML: `443`}, + {Value: &Port{Number: "443", Comment: "add space-"}, ExpectXML: `443`, MarshalOnly: true}, + {Value: &Domain{Name: []byte("google.com&friends")}, ExpectXML: `google.com&friends`}, + {Value: &Domain{Name: []byte("google.com"), Comment: []byte(" &friends ")}, ExpectXML: `google.com`}, + {Value: &Book{Title: "Pride & Prejudice"}, ExpectXML: `Pride & Prejudice`}, + {Value: &Event{Year: -3114}, ExpectXML: `-3114`}, + {Value: &Movie{Length: 13440}, ExpectXML: `13440`}, + {Value: &Pi{Approximation: 3.14159265}, ExpectXML: `3.1415927`}, + {Value: &Universe{Visible: 9.3e13}, ExpectXML: `9.3e+13`}, + {Value: &Particle{HasMass: true}, ExpectXML: `true`}, + {Value: &Departure{When: ParseTime("2013-01-09T00:15:00-09:00")}, ExpectXML: `2013-01-09T00:15:00-09:00`}, + {Value: atomValue, ExpectXML: atomXml}, + { + Value: &Ship{ + Name: "Heart of Gold", + Pilot: "Computer", + Age: 1, + Drive: ImprobabilityDrive, + Passenger: []*Passenger{ + { + Name: []string{"Zaphod", "Beeblebrox"}, + Weight: 7.25, + }, + { + Name: []string{"Trisha", "McMillen"}, + Weight: 5.5, + }, + { + Name: []string{"Ford", "Prefect"}, + Weight: 7, + }, + { + Name: []string{"Arthur", "Dent"}, + Weight: 6.75, + }, + }, + }, + ExpectXML: `` + + `` + strconv.Itoa(int(ImprobabilityDrive)) + `` + + `1` + + `` + + `Zaphod` + + `Beeblebrox` + + `7.25` + + `` + + `` + + `Trisha` + + `McMillen` + + `5.5` + + `` + + `` + + `Ford` + + `Prefect` + + `7` + + `` + + `` + + `Arthur` + + `Dent` + + `6.75` + + `` + + ``, + }, + + // Test a>b + { + Value: &NestedItems{Items: nil, Item1: nil}, + ExpectXML: `` + + `` + + `` + + ``, + }, + { + Value: &NestedItems{Items: []string{}, Item1: []string{}}, + ExpectXML: `` + + `` + + `` + + ``, + MarshalOnly: true, + }, + { + Value: &NestedItems{Items: nil, Item1: []string{"A"}}, + ExpectXML: `` + + `` + + `A` + + `` + + ``, + }, + { + Value: &NestedItems{Items: []string{"A", "B"}, Item1: nil}, + ExpectXML: `` + + `` + + `A` + + `B` + + `` + + ``, + }, + { + Value: &NestedItems{Items: []string{"A", "B"}, Item1: []string{"C"}}, + ExpectXML: `` + + `` + + `A` + + `B` + + `C` + + `` + + ``, + }, + { + Value: &NestedOrder{Field1: "C", Field2: "B", Field3: "A"}, + ExpectXML: `` + + `` + + `C` + + `B` + + `A` + + `` + + ``, + }, + { + Value: &NilTest{A: "A", B: nil, C: "C"}, + ExpectXML: `` + + `` + + `A` + + `C` + + `` + + ``, + MarshalOnly: true, // Uses interface{} + }, + { + Value: &MixedNested{A: "A", B: "B", C: "C", D: "D"}, + ExpectXML: `` + + `A` + + `B` + + `` + + `C` + + `D` + + `` + + ``, + }, + { + Value: &Service{Port: &Port{Number: "80"}}, + ExpectXML: `80`, + }, + { + Value: &Service{}, + ExpectXML: ``, + }, + { + Value: &Service{Port: &Port{Number: "80"}, Extra1: "A", Extra2: "B"}, + ExpectXML: `` + + `80` + + `A` + + `B` + + ``, + MarshalOnly: true, + }, + { + Value: &Service{Port: &Port{Number: "80"}, Extra2: "example"}, + ExpectXML: `` + + `80` + + `example` + + ``, + MarshalOnly: true, + }, + { + Value: &struct { + XMLName struct{} `xml:"space top"` + A string `xml:"x>a"` + B string `xml:"x>b"` + C string `xml:"space x>c"` + C1 string `xml:"space1 x>c"` + D1 string `xml:"space1 x>d"` + E1 string `xml:"x>e"` + }{ + A: "a", + B: "b", + C: "c", + C1: "c1", + D1: "d1", + E1: "e1", + }, + ExpectXML: `` + + `abc` + + `` + + `c1` + + `d1` + + `` + + `` + + `e1` + + `` + + ``, + }, + { + Value: &struct { + XMLName Name + A string `xml:"x>a"` + B string `xml:"x>b"` + C string `xml:"space x>c"` + C1 string `xml:"space1 x>c"` + D1 string `xml:"space1 x>d"` + }{ + XMLName: Name{ + Space: "space0", + Local: "top", + }, + A: "a", + B: "b", + C: "c", + C1: "c1", + D1: "d1", + }, + ExpectXML: `` + + `ab` + + `c` + + `` + + `c1` + + `d1` + + `` + + ``, + }, + { + Value: &struct { + XMLName struct{} `xml:"top"` + B string `xml:"space x>b"` + B1 string `xml:"space1 x>b"` + }{ + B: "b", + B1: "b1", + }, + ExpectXML: `` + + `b` + + `b1` + + ``, + }, + + // Test struct embedding + { + Value: &EmbedA{ + EmbedC: EmbedC{ + FieldA1: "", // Shadowed by A.A + FieldA2: "", // Shadowed by A.A + FieldB: "A.C.B", + FieldC: "A.C.C", + }, + EmbedB: EmbedB{ + FieldB: "A.B.B", + EmbedC: &EmbedC{ + FieldA1: "A.B.C.A1", + FieldA2: "A.B.C.A2", + FieldB: "", // Shadowed by A.B.B + FieldC: "A.B.C.C", + }, + }, + FieldA: "A.A", + }, + ExpectXML: `` + + `A.C.B` + + `A.C.C` + + `` + + `A.B.B` + + `` + + `A.B.C.A1` + + `A.B.C.A2` + + `` + + `A.B.C.C` + + `` + + `A.A` + + ``, + }, + + // Test that name casing matters + { + Value: &NameCasing{Xy: "mixed", XY: "upper", XyA: "mixedA", XYA: "upperA"}, + ExpectXML: `mixedupper`, + }, + + // Test the order in which the XML element name is chosen + { + Value: &NamePrecedence{ + FromTag: XMLNameWithoutTag{Value: "A"}, + FromNameVal: XMLNameWithoutTag{XMLName: Name{Local: "InXMLName"}, Value: "B"}, + FromNameTag: XMLNameWithTag{Value: "C"}, + InFieldName: "D", + }, + ExpectXML: `` + + `A` + + `B` + + `C` + + `D` + + ``, + MarshalOnly: true, + }, + { + Value: &NamePrecedence{ + XMLName: Name{Local: "Parent"}, + FromTag: XMLNameWithoutTag{XMLName: Name{Local: "InTag"}, Value: "A"}, + FromNameVal: XMLNameWithoutTag{XMLName: Name{Local: "FromNameVal"}, Value: "B"}, + FromNameTag: XMLNameWithTag{XMLName: Name{Local: "InXMLNameTag"}, Value: "C"}, + InFieldName: "D", + }, + ExpectXML: `` + + `A` + + `B` + + `C` + + `D` + + ``, + UnmarshalOnly: true, + }, + + // xml.Name works in a plain field as well. + { + Value: &NameInField{Name{Space: "ns", Local: "foo"}}, + ExpectXML: ``, + }, + { + Value: &NameInField{Name{Space: "ns", Local: "foo"}}, + ExpectXML: ``, + UnmarshalOnly: true, + }, + + // Marshaling zero xml.Name uses the tag or field name. + { + Value: &NameInField{}, + ExpectXML: ``, + MarshalOnly: true, + }, + + // Test attributes + { + Value: &AttrTest{ + Int: 8, + Named: 9, + Float: 23.5, + Uint8: 255, + Bool: true, + Str: "str", + Bytes: []byte("byt"), + }, + ExpectXML: ``, + }, + { + Value: &AttrTest{Bytes: []byte{}}, + ExpectXML: ``, + }, + { + Value: &OmitAttrTest{ + Int: 8, + Named: 9, + Float: 23.5, + Uint8: 255, + Bool: true, + Str: "str", + Bytes: []byte("byt"), + }, + ExpectXML: ``, + }, + { + Value: &OmitAttrTest{}, + ExpectXML: ``, + }, + + // pointer fields + { + Value: &PointerFieldsTest{Name: &nameAttr, Age: &ageAttr, Contents: &contentsAttr}, + ExpectXML: `lorem ipsum`, + MarshalOnly: true, + }, + + // empty chardata pointer field + { + Value: &ChardataEmptyTest{}, + ExpectXML: ``, + MarshalOnly: true, + }, + + // omitempty on fields + { + Value: &OmitFieldTest{ + Int: 8, + Named: 9, + Float: 23.5, + Uint8: 255, + Bool: true, + Str: "str", + Bytes: []byte("byt"), + Ptr: &PresenceTest{}, + }, + ExpectXML: `` + + `8` + + `9` + + `23.5` + + `255` + + `true` + + `str` + + `byt` + + `` + + ``, + }, + { + Value: &OmitFieldTest{}, + ExpectXML: ``, + }, + + // Test ",any" + { + ExpectXML: `knownunknown`, + Value: &AnyTest{ + Nested: "known", + AnyField: AnyHolder{ + XMLName: Name{Local: "other"}, + XML: "unknown", + }, + }, + }, + { + Value: &AnyTest{Nested: "known", + AnyField: AnyHolder{ + XML: "", + XMLName: Name{Local: "AnyField"}, + }, + }, + ExpectXML: `known`, + }, + { + ExpectXML: `b`, + Value: &AnyOmitTest{ + Nested: "b", + }, + }, + { + ExpectXML: `bei`, + Value: &AnySliceTest{ + Nested: "b", + AnyField: []AnyHolder{ + { + XMLName: Name{Local: "c"}, + XML: "e", + }, + { + XMLName: Name{Space: "f", Local: "g"}, + XML: "i", + }, + }, + }, + }, + { + ExpectXML: `b`, + Value: &AnySliceTest{ + Nested: "b", + }, + }, + + // Test recursive types. + { + Value: &RecurseA{ + A: "a1", + B: &RecurseB{ + A: &RecurseA{"a2", nil}, + B: "b1", + }, + }, + ExpectXML: `a1a2b1`, + }, + + // Test ignoring fields via "-" tag + { + ExpectXML: ``, + Value: &IgnoreTest{}, + }, + { + ExpectXML: ``, + Value: &IgnoreTest{PublicSecret: "can't tell"}, + MarshalOnly: true, + }, + { + ExpectXML: `ignore me`, + Value: &IgnoreTest{}, + UnmarshalOnly: true, + }, + + // Test escaping. + { + ExpectXML: `dquote: "; squote: '; ampersand: &; less: <; greater: >;`, + Value: &AnyTest{ + Nested: `dquote: "; squote: '; ampersand: &; less: <; greater: >;`, + AnyField: AnyHolder{XMLName: Name{Local: "empty"}}, + }, + }, + { + ExpectXML: `newline: ; cr: ; tab: ;`, + Value: &AnyTest{ + Nested: "newline: \n; cr: \r; tab: \t;", + AnyField: AnyHolder{XMLName: Name{Local: "AnyField"}}, + }, + }, + { + ExpectXML: "1\r2\r\n3\n\r4\n5", + Value: &AnyTest{ + Nested: "1\n2\n3\n\n4\n5", + }, + UnmarshalOnly: true, + }, + { + ExpectXML: `42`, + Value: &EmbedInt{ + MyInt: 42, + }, + }, + // Test omitempty with parent chain; see golang.org/issue/4168. + { + ExpectXML: ``, + Value: &Strings{}, + }, + // Custom marshalers. + { + ExpectXML: `hello world`, + Value: &MyMarshalerTest{}, + }, + { + ExpectXML: ``, + Value: &MarshalerStruct{}, + }, + { + ExpectXML: ``, + Value: &MarshalerValueStruct{}, + }, + { + ExpectXML: ``, + Value: &OuterStruct{IntAttr: 10}, + }, + { + ExpectXML: ``, + Value: &OuterNamedStruct{XMLName: Name{Space: "outerns", Local: "test"}, IntAttr: 10}, + }, + { + ExpectXML: ``, + Value: &OuterNamedOrderedStruct{XMLName: Name{Space: "outerns", Local: "test"}, IntAttr: 10}, + }, + { + ExpectXML: ``, + Value: &OuterOuterStruct{OuterStruct{IntAttr: 10}}, + }, + { + ExpectXML: `test`, + Value: &NestedAndChardata{AB: make([]string, 2), Chardata: "test"}, + }, + { + ExpectXML: ``, + Value: &NestedAndComment{AB: make([]string, 2), Comment: "test"}, + }, + { + ExpectXML: `hello world`, + Value: &XMLNSFieldStruct{Ns: "http://example.com/ns", Body: "hello world"}, + }, + { + ExpectXML: `hello world`, + Value: &NamedXMLNSFieldStruct{Ns: "http://example.com/ns", Body: "hello world"}, + }, + { + ExpectXML: `hello world`, + Value: &NamedXMLNSFieldStruct{Ns: "", Body: "hello world"}, + }, + { + ExpectXML: `hello world`, + Value: &XMLNSFieldStructWithOmitEmpty{Body: "hello world"}, + }, + { + // The xmlns attribute must be ignored because the + // element is in the empty namespace, so it's not possible + // to set the default namespace to something non-empty. + ExpectXML: `hello world`, + Value: &NamedXMLNSFieldStructWithEmptyNamespace{Ns: "foo", Body: "hello world"}, + MarshalOnly: true, + }, + { + ExpectXML: `hello world`, + Value: &RecursiveXMLNSFieldStruct{ + Ns: "foo", + Body: &RecursiveXMLNSFieldStruct{ + Text: "hello world", + }, + }, + }, +} + +func TestMarshal(t *testing.T) { + for idx, test := range marshalTests { + if test.UnmarshalOnly { + continue + } + data, err := Marshal(test.Value) + if err != nil { + t.Errorf("#%d: marshal(%#v): %s", idx, test.Value, err) + continue + } + if got, want := string(data), test.ExpectXML; got != want { + if strings.Contains(want, "\n") { + t.Errorf("#%d: marshal(%#v):\nHAVE:\n%s\nWANT:\n%s", idx, test.Value, got, want) + } else { + t.Errorf("#%d: marshal(%#v):\nhave %#q\nwant %#q", idx, test.Value, got, want) + } + } + } +} + +type AttrParent struct { + X string `xml:"X>Y,attr"` +} + +type BadAttr struct { + Name []string `xml:"name,attr"` +} + +var marshalErrorTests = []struct { + Value interface{} + Err string + Kind reflect.Kind +}{ + { + Value: make(chan bool), + Err: "xml: unsupported type: chan bool", + Kind: reflect.Chan, + }, + { + Value: map[string]string{ + "question": "What do you get when you multiply six by nine?", + "answer": "42", + }, + Err: "xml: unsupported type: map[string]string", + Kind: reflect.Map, + }, + { + Value: map[*Ship]bool{nil: false}, + Err: "xml: unsupported type: map[*xml.Ship]bool", + Kind: reflect.Map, + }, + { + Value: &Domain{Comment: []byte("f--bar")}, + Err: `xml: comments must not contain "--"`, + }, + // Reject parent chain with attr, never worked; see golang.org/issue/5033. + { + Value: &AttrParent{}, + Err: `xml: X>Y chain not valid with attr flag`, + }, + { + Value: BadAttr{[]string{"X", "Y"}}, + Err: `xml: unsupported type: []string`, + }, +} + +var marshalIndentTests = []struct { + Value interface{} + Prefix string + Indent string + ExpectXML string +}{ + { + Value: &SecretAgent{ + Handle: "007", + Identity: "James Bond", + Obfuscate: "", + }, + Prefix: "", + Indent: "\t", + ExpectXML: fmt.Sprintf("\n\tJames Bond\n"), + }, +} + +func TestMarshalErrors(t *testing.T) { + for idx, test := range marshalErrorTests { + data, err := Marshal(test.Value) + if err == nil { + t.Errorf("#%d: marshal(%#v) = [success] %q, want error %v", idx, test.Value, data, test.Err) + continue + } + if err.Error() != test.Err { + t.Errorf("#%d: marshal(%#v) = [error] %v, want %v", idx, test.Value, err, test.Err) + } + if test.Kind != reflect.Invalid { + if kind := err.(*UnsupportedTypeError).Type.Kind(); kind != test.Kind { + t.Errorf("#%d: marshal(%#v) = [error kind] %s, want %s", idx, test.Value, kind, test.Kind) + } + } + } +} + +// Do invertibility testing on the various structures that we test +func TestUnmarshal(t *testing.T) { + for i, test := range marshalTests { + if test.MarshalOnly { + continue + } + if _, ok := test.Value.(*Plain); ok { + continue + } + vt := reflect.TypeOf(test.Value) + dest := reflect.New(vt.Elem()).Interface() + err := Unmarshal([]byte(test.ExpectXML), dest) + + switch fix := dest.(type) { + case *Feed: + fix.Author.InnerXML = "" + for i := range fix.Entry { + fix.Entry[i].Author.InnerXML = "" + } + } + + if err != nil { + t.Errorf("#%d: unexpected error: %#v", i, err) + } else if got, want := dest, test.Value; !reflect.DeepEqual(got, want) { + t.Errorf("#%d: unmarshal(%q):\nhave %#v\nwant %#v", i, test.ExpectXML, got, want) + } + } +} + +func TestMarshalIndent(t *testing.T) { + for i, test := range marshalIndentTests { + data, err := MarshalIndent(test.Value, test.Prefix, test.Indent) + if err != nil { + t.Errorf("#%d: Error: %s", i, err) + continue + } + if got, want := string(data), test.ExpectXML; got != want { + t.Errorf("#%d: MarshalIndent:\nGot:%s\nWant:\n%s", i, got, want) + } + } +} + +type limitedBytesWriter struct { + w io.Writer + remain int // until writes fail +} + +func (lw *limitedBytesWriter) Write(p []byte) (n int, err error) { + if lw.remain <= 0 { + println("error") + return 0, errors.New("write limit hit") + } + if len(p) > lw.remain { + p = p[:lw.remain] + n, _ = lw.w.Write(p) + lw.remain = 0 + return n, errors.New("write limit hit") + } + n, err = lw.w.Write(p) + lw.remain -= n + return n, err +} + +func TestMarshalWriteErrors(t *testing.T) { + var buf bytes.Buffer + const writeCap = 1024 + w := &limitedBytesWriter{&buf, writeCap} + enc := NewEncoder(w) + var err error + var i int + const n = 4000 + for i = 1; i <= n; i++ { + err = enc.Encode(&Passenger{ + Name: []string{"Alice", "Bob"}, + Weight: 5, + }) + if err != nil { + break + } + } + if err == nil { + t.Error("expected an error") + } + if i == n { + t.Errorf("expected to fail before the end") + } + if buf.Len() != writeCap { + t.Errorf("buf.Len() = %d; want %d", buf.Len(), writeCap) + } +} + +func TestMarshalWriteIOErrors(t *testing.T) { + enc := NewEncoder(errWriter{}) + + expectErr := "unwritable" + err := enc.Encode(&Passenger{}) + if err == nil || err.Error() != expectErr { + t.Errorf("EscapeTest = [error] %v, want %v", err, expectErr) + } +} + +func TestMarshalFlush(t *testing.T) { + var buf bytes.Buffer + enc := NewEncoder(&buf) + if err := enc.EncodeToken(CharData("hello world")); err != nil { + t.Fatalf("enc.EncodeToken: %v", err) + } + if buf.Len() > 0 { + t.Fatalf("enc.EncodeToken caused actual write: %q", buf.Bytes()) + } + if err := enc.Flush(); err != nil { + t.Fatalf("enc.Flush: %v", err) + } + if buf.String() != "hello world" { + t.Fatalf("after enc.Flush, buf.String() = %q, want %q", buf.String(), "hello world") + } +} + +var encodeElementTests = []struct { + desc string + value interface{} + start StartElement + expectXML string +}{{ + desc: "simple string", + value: "hello", + start: StartElement{ + Name: Name{Local: "a"}, + }, + expectXML: `hello`, +}, { + desc: "string with added attributes", + value: "hello", + start: StartElement{ + Name: Name{Local: "a"}, + Attr: []Attr{{ + Name: Name{Local: "x"}, + Value: "y", + }, { + Name: Name{Local: "foo"}, + Value: "bar", + }}, + }, + expectXML: `hello`, +}, { + desc: "start element with default name space", + value: struct { + Foo XMLNameWithNSTag + }{ + Foo: XMLNameWithNSTag{ + Value: "hello", + }, + }, + start: StartElement{ + Name: Name{Space: "ns", Local: "a"}, + Attr: []Attr{{ + Name: Name{Local: "xmlns"}, + // "ns" is the name space defined in XMLNameWithNSTag + Value: "ns", + }}, + }, + expectXML: `hello`, +}, { + desc: "start element in name space with different default name space", + value: struct { + Foo XMLNameWithNSTag + }{ + Foo: XMLNameWithNSTag{ + Value: "hello", + }, + }, + start: StartElement{ + Name: Name{Space: "ns2", Local: "a"}, + Attr: []Attr{{ + Name: Name{Local: "xmlns"}, + // "ns" is the name space defined in XMLNameWithNSTag + Value: "ns", + }}, + }, + expectXML: `hello`, +}, { + desc: "XMLMarshaler with start element with default name space", + value: &MyMarshalerTest{}, + start: StartElement{ + Name: Name{Space: "ns2", Local: "a"}, + Attr: []Attr{{ + Name: Name{Local: "xmlns"}, + // "ns" is the name space defined in XMLNameWithNSTag + Value: "ns", + }}, + }, + expectXML: `hello world`, +}} + +func TestEncodeElement(t *testing.T) { + for idx, test := range encodeElementTests { + var buf bytes.Buffer + enc := NewEncoder(&buf) + err := enc.EncodeElement(test.value, test.start) + if err != nil { + t.Fatalf("enc.EncodeElement: %v", err) + } + err = enc.Flush() + if err != nil { + t.Fatalf("enc.Flush: %v", err) + } + if got, want := buf.String(), test.expectXML; got != want { + t.Errorf("#%d(%s): EncodeElement(%#v, %#v):\nhave %#q\nwant %#q", idx, test.desc, test.value, test.start, got, want) + } + } +} + +func BenchmarkMarshal(b *testing.B) { + b.ReportAllocs() + for i := 0; i < b.N; i++ { + Marshal(atomValue) + } +} + +func BenchmarkUnmarshal(b *testing.B) { + b.ReportAllocs() + xml := []byte(atomXml) + for i := 0; i < b.N; i++ { + Unmarshal(xml, &Feed{}) + } +} + +// golang.org/issue/6556 +func TestStructPointerMarshal(t *testing.T) { + type A struct { + XMLName string `xml:"a"` + B []interface{} + } + type C struct { + XMLName Name + Value string `xml:"value"` + } + + a := new(A) + a.B = append(a.B, &C{ + XMLName: Name{Local: "c"}, + Value: "x", + }) + + b, err := Marshal(a) + if err != nil { + t.Fatal(err) + } + if x := string(b); x != "x" { + t.Fatal(x) + } + var v A + err = Unmarshal(b, &v) + if err != nil { + t.Fatal(err) + } +} + +var encodeTokenTests = []struct { + desc string + toks []Token + want string + err string +}{{ + desc: "start element with name space", + toks: []Token{ + StartElement{Name{"space", "local"}, nil}, + }, + want: ``, +}, { + desc: "start element with no name", + toks: []Token{ + StartElement{Name{"space", ""}, nil}, + }, + err: "xml: start tag with no name", +}, { + desc: "end element with no name", + toks: []Token{ + EndElement{Name{"space", ""}}, + }, + err: "xml: end tag with no name", +}, { + desc: "char data", + toks: []Token{ + CharData("foo"), + }, + want: `foo`, +}, { + desc: "char data with escaped chars", + toks: []Token{ + CharData(" \t\n"), + }, + want: " \n", +}, { + desc: "comment", + toks: []Token{ + Comment("foo"), + }, + want: ``, +}, { + desc: "comment with invalid content", + toks: []Token{ + Comment("foo-->"), + }, + err: "xml: EncodeToken of Comment containing --> marker", +}, { + desc: "proc instruction", + toks: []Token{ + ProcInst{"Target", []byte("Instruction")}, + }, + want: ``, +}, { + desc: "proc instruction with empty target", + toks: []Token{ + ProcInst{"", []byte("Instruction")}, + }, + err: "xml: EncodeToken of ProcInst with invalid Target", +}, { + desc: "proc instruction with bad content", + toks: []Token{ + ProcInst{"", []byte("Instruction?>")}, + }, + err: "xml: EncodeToken of ProcInst with invalid Target", +}, { + desc: "directive", + toks: []Token{ + Directive("foo"), + }, + want: ``, +}, { + desc: "more complex directive", + toks: []Token{ + Directive("DOCTYPE doc [ '> ]"), + }, + want: `'> ]>`, +}, { + desc: "directive instruction with bad name", + toks: []Token{ + Directive("foo>"), + }, + err: "xml: EncodeToken of Directive containing wrong < or > markers", +}, { + desc: "end tag without start tag", + toks: []Token{ + EndElement{Name{"foo", "bar"}}, + }, + err: "xml: end tag without start tag", +}, { + desc: "mismatching end tag local name", + toks: []Token{ + StartElement{Name{"", "foo"}, nil}, + EndElement{Name{"", "bar"}}, + }, + err: "xml: end tag does not match start tag ", + want: ``, +}, { + desc: "mismatching end tag namespace", + toks: []Token{ + StartElement{Name{"space", "foo"}, nil}, + EndElement{Name{"another", "foo"}}, + }, + err: "xml: end tag in namespace another does not match start tag in namespace space", + want: ``, +}, { + desc: "start element with explicit namespace", + toks: []Token{ + StartElement{Name{"space", "local"}, []Attr{ + {Name{"xmlns", "x"}, "space"}, + {Name{"space", "foo"}, "value"}, + }}, + }, + want: ``, +}, { + desc: "start element with explicit namespace and colliding prefix", + toks: []Token{ + StartElement{Name{"space", "local"}, []Attr{ + {Name{"xmlns", "x"}, "space"}, + {Name{"space", "foo"}, "value"}, + {Name{"x", "bar"}, "other"}, + }}, + }, + want: ``, +}, { + desc: "start element using previously defined namespace", + toks: []Token{ + StartElement{Name{"", "local"}, []Attr{ + {Name{"xmlns", "x"}, "space"}, + }}, + StartElement{Name{"space", "foo"}, []Attr{ + {Name{"space", "x"}, "y"}, + }}, + }, + want: ``, +}, { + desc: "nested name space with same prefix", + toks: []Token{ + StartElement{Name{"", "foo"}, []Attr{ + {Name{"xmlns", "x"}, "space1"}, + }}, + StartElement{Name{"", "foo"}, []Attr{ + {Name{"xmlns", "x"}, "space2"}, + }}, + StartElement{Name{"", "foo"}, []Attr{ + {Name{"space1", "a"}, "space1 value"}, + {Name{"space2", "b"}, "space2 value"}, + }}, + EndElement{Name{"", "foo"}}, + EndElement{Name{"", "foo"}}, + StartElement{Name{"", "foo"}, []Attr{ + {Name{"space1", "a"}, "space1 value"}, + {Name{"space2", "b"}, "space2 value"}, + }}, + }, + want: ``, +}, { + desc: "start element defining several prefixes for the same name space", + toks: []Token{ + StartElement{Name{"space", "foo"}, []Attr{ + {Name{"xmlns", "a"}, "space"}, + {Name{"xmlns", "b"}, "space"}, + {Name{"space", "x"}, "value"}, + }}, + }, + want: ``, +}, { + desc: "nested element redefines name space", + toks: []Token{ + StartElement{Name{"", "foo"}, []Attr{ + {Name{"xmlns", "x"}, "space"}, + }}, + StartElement{Name{"space", "foo"}, []Attr{ + {Name{"xmlns", "y"}, "space"}, + {Name{"space", "a"}, "value"}, + }}, + }, + want: ``, +}, { + desc: "nested element creates alias for default name space", + toks: []Token{ + StartElement{Name{"space", "foo"}, []Attr{ + {Name{"", "xmlns"}, "space"}, + }}, + StartElement{Name{"space", "foo"}, []Attr{ + {Name{"xmlns", "y"}, "space"}, + {Name{"space", "a"}, "value"}, + }}, + }, + want: ``, +}, { + desc: "nested element defines default name space with existing prefix", + toks: []Token{ + StartElement{Name{"", "foo"}, []Attr{ + {Name{"xmlns", "x"}, "space"}, + }}, + StartElement{Name{"space", "foo"}, []Attr{ + {Name{"", "xmlns"}, "space"}, + {Name{"space", "a"}, "value"}, + }}, + }, + want: ``, +}, { + desc: "nested element uses empty attribute name space when default ns defined", + toks: []Token{ + StartElement{Name{"space", "foo"}, []Attr{ + {Name{"", "xmlns"}, "space"}, + }}, + StartElement{Name{"space", "foo"}, []Attr{ + {Name{"", "attr"}, "value"}, + }}, + }, + want: ``, +}, { + desc: "redefine xmlns", + toks: []Token{ + StartElement{Name{"", "foo"}, []Attr{ + {Name{"foo", "xmlns"}, "space"}, + }}, + }, + err: `xml: cannot redefine xmlns attribute prefix`, +}, { + desc: "xmlns with explicit name space #1", + toks: []Token{ + StartElement{Name{"space", "foo"}, []Attr{ + {Name{"xml", "xmlns"}, "space"}, + }}, + }, + want: ``, +}, { + desc: "xmlns with explicit name space #2", + toks: []Token{ + StartElement{Name{"space", "foo"}, []Attr{ + {Name{xmlURL, "xmlns"}, "space"}, + }}, + }, + want: ``, +}, { + desc: "empty name space declaration is ignored", + toks: []Token{ + StartElement{Name{"", "foo"}, []Attr{ + {Name{"xmlns", "foo"}, ""}, + }}, + }, + want: ``, +}, { + desc: "attribute with no name is ignored", + toks: []Token{ + StartElement{Name{"", "foo"}, []Attr{ + {Name{"", ""}, "value"}, + }}, + }, + want: ``, +}, { + desc: "namespace URL with non-valid name", + toks: []Token{ + StartElement{Name{"/34", "foo"}, []Attr{ + {Name{"/34", "x"}, "value"}, + }}, + }, + want: `<_:foo xmlns:_="/34" _:x="value">`, +}, { + desc: "nested element resets default namespace to empty", + toks: []Token{ + StartElement{Name{"space", "foo"}, []Attr{ + {Name{"", "xmlns"}, "space"}, + }}, + StartElement{Name{"", "foo"}, []Attr{ + {Name{"", "xmlns"}, ""}, + {Name{"", "x"}, "value"}, + {Name{"space", "x"}, "value"}, + }}, + }, + want: ``, +}, { + desc: "nested element requires empty default name space", + toks: []Token{ + StartElement{Name{"space", "foo"}, []Attr{ + {Name{"", "xmlns"}, "space"}, + }}, + StartElement{Name{"", "foo"}, nil}, + }, + want: ``, +}, { + desc: "attribute uses name space from xmlns", + toks: []Token{ + StartElement{Name{"some/space", "foo"}, []Attr{ + {Name{"", "attr"}, "value"}, + {Name{"some/space", "other"}, "other value"}, + }}, + }, + want: ``, +}, { + desc: "default name space should not be used by attributes", + toks: []Token{ + StartElement{Name{"space", "foo"}, []Attr{ + {Name{"", "xmlns"}, "space"}, + {Name{"xmlns", "bar"}, "space"}, + {Name{"space", "baz"}, "foo"}, + }}, + StartElement{Name{"space", "baz"}, nil}, + EndElement{Name{"space", "baz"}}, + EndElement{Name{"space", "foo"}}, + }, + want: ``, +}, { + desc: "default name space not used by attributes, not explicitly defined", + toks: []Token{ + StartElement{Name{"space", "foo"}, []Attr{ + {Name{"", "xmlns"}, "space"}, + {Name{"space", "baz"}, "foo"}, + }}, + StartElement{Name{"space", "baz"}, nil}, + EndElement{Name{"space", "baz"}}, + EndElement{Name{"space", "foo"}}, + }, + want: ``, +}, { + desc: "impossible xmlns declaration", + toks: []Token{ + StartElement{Name{"", "foo"}, []Attr{ + {Name{"", "xmlns"}, "space"}, + }}, + StartElement{Name{"space", "bar"}, []Attr{ + {Name{"space", "attr"}, "value"}, + }}, + }, + want: ``, +}} + +func TestEncodeToken(t *testing.T) { +loop: + for i, tt := range encodeTokenTests { + var buf bytes.Buffer + enc := NewEncoder(&buf) + var err error + for j, tok := range tt.toks { + err = enc.EncodeToken(tok) + if err != nil && j < len(tt.toks)-1 { + t.Errorf("#%d %s token #%d: %v", i, tt.desc, j, err) + continue loop + } + } + errorf := func(f string, a ...interface{}) { + t.Errorf("#%d %s token #%d:%s", i, tt.desc, len(tt.toks)-1, fmt.Sprintf(f, a...)) + } + switch { + case tt.err != "" && err == nil: + errorf(" expected error; got none") + continue + case tt.err == "" && err != nil: + errorf(" got error: %v", err) + continue + case tt.err != "" && err != nil && tt.err != err.Error(): + errorf(" error mismatch; got %v, want %v", err, tt.err) + continue + } + if err := enc.Flush(); err != nil { + errorf(" %v", err) + continue + } + if got := buf.String(); got != tt.want { + errorf("\ngot %v\nwant %v", got, tt.want) + continue + } + } +} + +func TestProcInstEncodeToken(t *testing.T) { + var buf bytes.Buffer + enc := NewEncoder(&buf) + + if err := enc.EncodeToken(ProcInst{"xml", []byte("Instruction")}); err != nil { + t.Fatalf("enc.EncodeToken: expected to be able to encode xml target ProcInst as first token, %s", err) + } + + if err := enc.EncodeToken(ProcInst{"Target", []byte("Instruction")}); err != nil { + t.Fatalf("enc.EncodeToken: expected to be able to add non-xml target ProcInst") + } + + if err := enc.EncodeToken(ProcInst{"xml", []byte("Instruction")}); err == nil { + t.Fatalf("enc.EncodeToken: expected to not be allowed to encode xml target ProcInst when not first token") + } +} + +func TestDecodeEncode(t *testing.T) { + var in, out bytes.Buffer + in.WriteString(` + + + +`) + dec := NewDecoder(&in) + enc := NewEncoder(&out) + for tok, err := dec.Token(); err == nil; tok, err = dec.Token() { + err = enc.EncodeToken(tok) + if err != nil { + t.Fatalf("enc.EncodeToken: Unable to encode token (%#v), %v", tok, err) + } + } +} + +// Issue 9796. Used to fail with GORACE="halt_on_error=1" -race. +func TestRace9796(t *testing.T) { + type A struct{} + type B struct { + C []A `xml:"X>Y"` + } + var wg sync.WaitGroup + for i := 0; i < 2; i++ { + wg.Add(1) + go func() { + Marshal(B{[]A{{}}}) + wg.Done() + }() + } + wg.Wait() +} + +func TestIsValidDirective(t *testing.T) { + testOK := []string{ + "<>", + "< < > >", + "' '>' >", + " ]>", + " '<' ' doc ANY> ]>", + ">>> a < comment --> [ ] >", + } + testKO := []string{ + "<", + ">", + "", + "< > > < < >", + " -->", + "", + "'", + "", + } + for _, s := range testOK { + if !isValidDirective(Directive(s)) { + t.Errorf("Directive %q is expected to be valid", s) + } + } + for _, s := range testKO { + if isValidDirective(Directive(s)) { + t.Errorf("Directive %q is expected to be invalid", s) + } + } +} + +// Issue 11719. EncodeToken used to silently eat tokens with an invalid type. +func TestSimpleUseOfEncodeToken(t *testing.T) { + var buf bytes.Buffer + enc := NewEncoder(&buf) + if err := enc.EncodeToken(&StartElement{Name: Name{"", "object1"}}); err == nil { + t.Errorf("enc.EncodeToken: pointer type should be rejected") + } + if err := enc.EncodeToken(&EndElement{Name: Name{"", "object1"}}); err == nil { + t.Errorf("enc.EncodeToken: pointer type should be rejected") + } + if err := enc.EncodeToken(StartElement{Name: Name{"", "object2"}}); err != nil { + t.Errorf("enc.EncodeToken: StartElement %s", err) + } + if err := enc.EncodeToken(EndElement{Name: Name{"", "object2"}}); err != nil { + t.Errorf("enc.EncodeToken: EndElement %s", err) + } + if err := enc.EncodeToken(Universe{}); err == nil { + t.Errorf("enc.EncodeToken: invalid type not caught") + } + if err := enc.Flush(); err != nil { + t.Errorf("enc.Flush: %s", err) + } + if buf.Len() == 0 { + t.Errorf("enc.EncodeToken: empty buffer") + } + want := "" + if buf.String() != want { + t.Errorf("enc.EncodeToken: expected %q; got %q", want, buf.String()) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/internal/xml/read.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/internal/xml/read.go new file mode 100644 index 0000000..4089056 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/internal/xml/read.go @@ -0,0 +1,692 @@ +// 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 xml + +import ( + "bytes" + "encoding" + "errors" + "fmt" + "reflect" + "strconv" + "strings" +) + +// BUG(rsc): Mapping between XML elements and data structures is inherently flawed: +// an XML element is an order-dependent collection of anonymous +// values, while a data structure is an order-independent collection +// of named values. +// See package json for a textual representation more suitable +// to data structures. + +// Unmarshal parses the XML-encoded data and stores the result in +// the value pointed to by v, which must be an arbitrary struct, +// slice, or string. Well-formed data that does not fit into v is +// discarded. +// +// Because Unmarshal uses the reflect package, it can only assign +// to exported (upper case) fields. Unmarshal uses a case-sensitive +// comparison to match XML element names to tag values and struct +// field names. +// +// Unmarshal maps an XML element to a struct using the following rules. +// In the rules, the tag of a field refers to the value associated with the +// key 'xml' in the struct field's tag (see the example above). +// +// * If the struct has a field of type []byte or string with tag +// ",innerxml", Unmarshal accumulates the raw XML nested inside the +// element in that field. The rest of the rules still apply. +// +// * If the struct has a field named XMLName of type xml.Name, +// Unmarshal records the element name in that field. +// +// * If the XMLName field has an associated tag of the form +// "name" or "namespace-URL name", the XML element must have +// the given name (and, optionally, name space) or else Unmarshal +// returns an error. +// +// * If the XML element has an attribute whose name matches a +// struct field name with an associated tag containing ",attr" or +// the explicit name in a struct field tag of the form "name,attr", +// Unmarshal records the attribute value in that field. +// +// * If the XML element contains character data, that data is +// accumulated in the first struct field that has tag ",chardata". +// The struct field may have type []byte or string. +// If there is no such field, the character data is discarded. +// +// * If the XML element contains comments, they are accumulated in +// the first struct field that has tag ",comment". The struct +// field may have type []byte or string. If there is no such +// field, the comments are discarded. +// +// * If the XML element contains a sub-element whose name matches +// the prefix of a tag formatted as "a" or "a>b>c", unmarshal +// will descend into the XML structure looking for elements with the +// given names, and will map the innermost elements to that struct +// field. A tag starting with ">" is equivalent to one starting +// with the field name followed by ">". +// +// * If the XML element contains a sub-element whose name matches +// a struct field's XMLName tag and the struct field has no +// explicit name tag as per the previous rule, unmarshal maps +// the sub-element to that struct field. +// +// * If the XML element contains a sub-element whose name matches a +// field without any mode flags (",attr", ",chardata", etc), Unmarshal +// maps the sub-element to that struct field. +// +// * If the XML element contains a sub-element that hasn't matched any +// of the above rules and the struct has a field with tag ",any", +// unmarshal maps the sub-element to that struct field. +// +// * An anonymous struct field is handled as if the fields of its +// value were part of the outer struct. +// +// * A struct field with tag "-" is never unmarshalled into. +// +// Unmarshal maps an XML element to a string or []byte by saving the +// concatenation of that element's character data in the string or +// []byte. The saved []byte is never nil. +// +// Unmarshal maps an attribute value to a string or []byte by saving +// the value in the string or slice. +// +// Unmarshal maps an XML element to a slice by extending the length of +// the slice and mapping the element to the newly created value. +// +// Unmarshal maps an XML element or attribute value to a bool by +// setting it to the boolean value represented by the string. +// +// Unmarshal maps an XML element or attribute value to an integer or +// floating-point field by setting the field to the result of +// interpreting the string value in decimal. There is no check for +// overflow. +// +// Unmarshal maps an XML element to an xml.Name by recording the +// element name. +// +// Unmarshal maps an XML element to a pointer by setting the pointer +// to a freshly allocated value and then mapping the element to that value. +// +func Unmarshal(data []byte, v interface{}) error { + return NewDecoder(bytes.NewReader(data)).Decode(v) +} + +// Decode works like xml.Unmarshal, except it reads the decoder +// stream to find the start element. +func (d *Decoder) Decode(v interface{}) error { + return d.DecodeElement(v, nil) +} + +// DecodeElement works like xml.Unmarshal except that it takes +// a pointer to the start XML element to decode into v. +// It is useful when a client reads some raw XML tokens itself +// but also wants to defer to Unmarshal for some elements. +func (d *Decoder) DecodeElement(v interface{}, start *StartElement) error { + val := reflect.ValueOf(v) + if val.Kind() != reflect.Ptr { + return errors.New("non-pointer passed to Unmarshal") + } + return d.unmarshal(val.Elem(), start) +} + +// An UnmarshalError represents an error in the unmarshalling process. +type UnmarshalError string + +func (e UnmarshalError) Error() string { return string(e) } + +// Unmarshaler is the interface implemented by objects that can unmarshal +// an XML element description of themselves. +// +// UnmarshalXML decodes a single XML element +// beginning with the given start element. +// If it returns an error, the outer call to Unmarshal stops and +// returns that error. +// UnmarshalXML must consume exactly one XML element. +// One common implementation strategy is to unmarshal into +// a separate value with a layout matching the expected XML +// using d.DecodeElement, and then to copy the data from +// that value into the receiver. +// Another common strategy is to use d.Token to process the +// XML object one token at a time. +// UnmarshalXML may not use d.RawToken. +type Unmarshaler interface { + UnmarshalXML(d *Decoder, start StartElement) error +} + +// UnmarshalerAttr is the interface implemented by objects that can unmarshal +// an XML attribute description of themselves. +// +// UnmarshalXMLAttr decodes a single XML attribute. +// If it returns an error, the outer call to Unmarshal stops and +// returns that error. +// UnmarshalXMLAttr is used only for struct fields with the +// "attr" option in the field tag. +type UnmarshalerAttr interface { + UnmarshalXMLAttr(attr Attr) error +} + +// receiverType returns the receiver type to use in an expression like "%s.MethodName". +func receiverType(val interface{}) string { + t := reflect.TypeOf(val) + if t.Name() != "" { + return t.String() + } + return "(" + t.String() + ")" +} + +// unmarshalInterface unmarshals a single XML element into val. +// start is the opening tag of the element. +func (p *Decoder) unmarshalInterface(val Unmarshaler, start *StartElement) error { + // Record that decoder must stop at end tag corresponding to start. + p.pushEOF() + + p.unmarshalDepth++ + err := val.UnmarshalXML(p, *start) + p.unmarshalDepth-- + if err != nil { + p.popEOF() + return err + } + + if !p.popEOF() { + return fmt.Errorf("xml: %s.UnmarshalXML did not consume entire <%s> element", receiverType(val), start.Name.Local) + } + + return nil +} + +// unmarshalTextInterface unmarshals a single XML element into val. +// The chardata contained in the element (but not its children) +// is passed to the text unmarshaler. +func (p *Decoder) unmarshalTextInterface(val encoding.TextUnmarshaler, start *StartElement) error { + var buf []byte + depth := 1 + for depth > 0 { + t, err := p.Token() + if err != nil { + return err + } + switch t := t.(type) { + case CharData: + if depth == 1 { + buf = append(buf, t...) + } + case StartElement: + depth++ + case EndElement: + depth-- + } + } + return val.UnmarshalText(buf) +} + +// unmarshalAttr unmarshals a single XML attribute into val. +func (p *Decoder) unmarshalAttr(val reflect.Value, attr Attr) error { + if val.Kind() == reflect.Ptr { + if val.IsNil() { + val.Set(reflect.New(val.Type().Elem())) + } + val = val.Elem() + } + + if val.CanInterface() && val.Type().Implements(unmarshalerAttrType) { + // This is an unmarshaler with a non-pointer receiver, + // so it's likely to be incorrect, but we do what we're told. + return val.Interface().(UnmarshalerAttr).UnmarshalXMLAttr(attr) + } + if val.CanAddr() { + pv := val.Addr() + if pv.CanInterface() && pv.Type().Implements(unmarshalerAttrType) { + return pv.Interface().(UnmarshalerAttr).UnmarshalXMLAttr(attr) + } + } + + // Not an UnmarshalerAttr; try encoding.TextUnmarshaler. + if val.CanInterface() && val.Type().Implements(textUnmarshalerType) { + // This is an unmarshaler with a non-pointer receiver, + // so it's likely to be incorrect, but we do what we're told. + return val.Interface().(encoding.TextUnmarshaler).UnmarshalText([]byte(attr.Value)) + } + if val.CanAddr() { + pv := val.Addr() + if pv.CanInterface() && pv.Type().Implements(textUnmarshalerType) { + return pv.Interface().(encoding.TextUnmarshaler).UnmarshalText([]byte(attr.Value)) + } + } + + copyValue(val, []byte(attr.Value)) + return nil +} + +var ( + unmarshalerType = reflect.TypeOf((*Unmarshaler)(nil)).Elem() + unmarshalerAttrType = reflect.TypeOf((*UnmarshalerAttr)(nil)).Elem() + textUnmarshalerType = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem() +) + +// Unmarshal a single XML element into val. +func (p *Decoder) unmarshal(val reflect.Value, start *StartElement) error { + // Find start element if we need it. + if start == nil { + for { + tok, err := p.Token() + if err != nil { + return err + } + if t, ok := tok.(StartElement); ok { + start = &t + break + } + } + } + + // Load value from interface, but only if the result will be + // usefully addressable. + if val.Kind() == reflect.Interface && !val.IsNil() { + e := val.Elem() + if e.Kind() == reflect.Ptr && !e.IsNil() { + val = e + } + } + + if val.Kind() == reflect.Ptr { + if val.IsNil() { + val.Set(reflect.New(val.Type().Elem())) + } + val = val.Elem() + } + + if val.CanInterface() && val.Type().Implements(unmarshalerType) { + // This is an unmarshaler with a non-pointer receiver, + // so it's likely to be incorrect, but we do what we're told. + return p.unmarshalInterface(val.Interface().(Unmarshaler), start) + } + + if val.CanAddr() { + pv := val.Addr() + if pv.CanInterface() && pv.Type().Implements(unmarshalerType) { + return p.unmarshalInterface(pv.Interface().(Unmarshaler), start) + } + } + + if val.CanInterface() && val.Type().Implements(textUnmarshalerType) { + return p.unmarshalTextInterface(val.Interface().(encoding.TextUnmarshaler), start) + } + + if val.CanAddr() { + pv := val.Addr() + if pv.CanInterface() && pv.Type().Implements(textUnmarshalerType) { + return p.unmarshalTextInterface(pv.Interface().(encoding.TextUnmarshaler), start) + } + } + + var ( + data []byte + saveData reflect.Value + comment []byte + saveComment reflect.Value + saveXML reflect.Value + saveXMLIndex int + saveXMLData []byte + saveAny reflect.Value + sv reflect.Value + tinfo *typeInfo + err error + ) + + switch v := val; v.Kind() { + default: + return errors.New("unknown type " + v.Type().String()) + + case reflect.Interface: + // TODO: For now, simply ignore the field. In the near + // future we may choose to unmarshal the start + // element on it, if not nil. + return p.Skip() + + case reflect.Slice: + typ := v.Type() + if typ.Elem().Kind() == reflect.Uint8 { + // []byte + saveData = v + break + } + + // Slice of element values. + // Grow slice. + n := v.Len() + if n >= v.Cap() { + ncap := 2 * n + if ncap < 4 { + ncap = 4 + } + new := reflect.MakeSlice(typ, n, ncap) + reflect.Copy(new, v) + v.Set(new) + } + v.SetLen(n + 1) + + // Recur to read element into slice. + if err := p.unmarshal(v.Index(n), start); err != nil { + v.SetLen(n) + return err + } + return nil + + case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr, reflect.String: + saveData = v + + case reflect.Struct: + typ := v.Type() + if typ == nameType { + v.Set(reflect.ValueOf(start.Name)) + break + } + + sv = v + tinfo, err = getTypeInfo(typ) + if err != nil { + return err + } + + // Validate and assign element name. + if tinfo.xmlname != nil { + finfo := tinfo.xmlname + if finfo.name != "" && finfo.name != start.Name.Local { + return UnmarshalError("expected element type <" + finfo.name + "> but have <" + start.Name.Local + ">") + } + if finfo.xmlns != "" && finfo.xmlns != start.Name.Space { + e := "expected element <" + finfo.name + "> in name space " + finfo.xmlns + " but have " + if start.Name.Space == "" { + e += "no name space" + } else { + e += start.Name.Space + } + return UnmarshalError(e) + } + fv := finfo.value(sv) + if _, ok := fv.Interface().(Name); ok { + fv.Set(reflect.ValueOf(start.Name)) + } + } + + // Assign attributes. + // Also, determine whether we need to save character data or comments. + for i := range tinfo.fields { + finfo := &tinfo.fields[i] + switch finfo.flags & fMode { + case fAttr: + strv := finfo.value(sv) + // Look for attribute. + for _, a := range start.Attr { + if a.Name.Local == finfo.name && (finfo.xmlns == "" || finfo.xmlns == a.Name.Space) { + if err := p.unmarshalAttr(strv, a); err != nil { + return err + } + break + } + } + + case fCharData: + if !saveData.IsValid() { + saveData = finfo.value(sv) + } + + case fComment: + if !saveComment.IsValid() { + saveComment = finfo.value(sv) + } + + case fAny, fAny | fElement: + if !saveAny.IsValid() { + saveAny = finfo.value(sv) + } + + case fInnerXml: + if !saveXML.IsValid() { + saveXML = finfo.value(sv) + if p.saved == nil { + saveXMLIndex = 0 + p.saved = new(bytes.Buffer) + } else { + saveXMLIndex = p.savedOffset() + } + } + } + } + } + + // Find end element. + // Process sub-elements along the way. +Loop: + for { + var savedOffset int + if saveXML.IsValid() { + savedOffset = p.savedOffset() + } + tok, err := p.Token() + if err != nil { + return err + } + switch t := tok.(type) { + case StartElement: + consumed := false + if sv.IsValid() { + consumed, err = p.unmarshalPath(tinfo, sv, nil, &t) + if err != nil { + return err + } + if !consumed && saveAny.IsValid() { + consumed = true + if err := p.unmarshal(saveAny, &t); err != nil { + return err + } + } + } + if !consumed { + if err := p.Skip(); err != nil { + return err + } + } + + case EndElement: + if saveXML.IsValid() { + saveXMLData = p.saved.Bytes()[saveXMLIndex:savedOffset] + if saveXMLIndex == 0 { + p.saved = nil + } + } + break Loop + + case CharData: + if saveData.IsValid() { + data = append(data, t...) + } + + case Comment: + if saveComment.IsValid() { + comment = append(comment, t...) + } + } + } + + if saveData.IsValid() && saveData.CanInterface() && saveData.Type().Implements(textUnmarshalerType) { + if err := saveData.Interface().(encoding.TextUnmarshaler).UnmarshalText(data); err != nil { + return err + } + saveData = reflect.Value{} + } + + if saveData.IsValid() && saveData.CanAddr() { + pv := saveData.Addr() + if pv.CanInterface() && pv.Type().Implements(textUnmarshalerType) { + if err := pv.Interface().(encoding.TextUnmarshaler).UnmarshalText(data); err != nil { + return err + } + saveData = reflect.Value{} + } + } + + if err := copyValue(saveData, data); err != nil { + return err + } + + switch t := saveComment; t.Kind() { + case reflect.String: + t.SetString(string(comment)) + case reflect.Slice: + t.Set(reflect.ValueOf(comment)) + } + + switch t := saveXML; t.Kind() { + case reflect.String: + t.SetString(string(saveXMLData)) + case reflect.Slice: + t.Set(reflect.ValueOf(saveXMLData)) + } + + return nil +} + +func copyValue(dst reflect.Value, src []byte) (err error) { + dst0 := dst + + if dst.Kind() == reflect.Ptr { + if dst.IsNil() { + dst.Set(reflect.New(dst.Type().Elem())) + } + dst = dst.Elem() + } + + // Save accumulated data. + switch dst.Kind() { + case reflect.Invalid: + // Probably a comment. + default: + return errors.New("cannot unmarshal into " + dst0.Type().String()) + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + itmp, err := strconv.ParseInt(string(src), 10, dst.Type().Bits()) + if err != nil { + return err + } + dst.SetInt(itmp) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + utmp, err := strconv.ParseUint(string(src), 10, dst.Type().Bits()) + if err != nil { + return err + } + dst.SetUint(utmp) + case reflect.Float32, reflect.Float64: + ftmp, err := strconv.ParseFloat(string(src), dst.Type().Bits()) + if err != nil { + return err + } + dst.SetFloat(ftmp) + case reflect.Bool: + value, err := strconv.ParseBool(strings.TrimSpace(string(src))) + if err != nil { + return err + } + dst.SetBool(value) + case reflect.String: + dst.SetString(string(src)) + case reflect.Slice: + if len(src) == 0 { + // non-nil to flag presence + src = []byte{} + } + dst.SetBytes(src) + } + return nil +} + +// unmarshalPath walks down an XML structure looking for wanted +// paths, and calls unmarshal on them. +// The consumed result tells whether XML elements have been consumed +// from the Decoder until start's matching end element, or if it's +// still untouched because start is uninteresting for sv's fields. +func (p *Decoder) unmarshalPath(tinfo *typeInfo, sv reflect.Value, parents []string, start *StartElement) (consumed bool, err error) { + recurse := false +Loop: + for i := range tinfo.fields { + finfo := &tinfo.fields[i] + if finfo.flags&fElement == 0 || len(finfo.parents) < len(parents) || finfo.xmlns != "" && finfo.xmlns != start.Name.Space { + continue + } + for j := range parents { + if parents[j] != finfo.parents[j] { + continue Loop + } + } + if len(finfo.parents) == len(parents) && finfo.name == start.Name.Local { + // It's a perfect match, unmarshal the field. + return true, p.unmarshal(finfo.value(sv), start) + } + if len(finfo.parents) > len(parents) && finfo.parents[len(parents)] == start.Name.Local { + // It's a prefix for the field. Break and recurse + // since it's not ok for one field path to be itself + // the prefix for another field path. + recurse = true + + // We can reuse the same slice as long as we + // don't try to append to it. + parents = finfo.parents[:len(parents)+1] + break + } + } + if !recurse { + // We have no business with this element. + return false, nil + } + // The element is not a perfect match for any field, but one + // or more fields have the path to this element as a parent + // prefix. Recurse and attempt to match these. + for { + var tok Token + tok, err = p.Token() + if err != nil { + return true, err + } + switch t := tok.(type) { + case StartElement: + consumed2, err := p.unmarshalPath(tinfo, sv, parents, &t) + if err != nil { + return true, err + } + if !consumed2 { + if err := p.Skip(); err != nil { + return true, err + } + } + case EndElement: + return true, nil + } + } +} + +// Skip reads tokens until it has consumed the end element +// matching the most recent start element already consumed. +// It recurs if it encounters a start element, so it can be used to +// skip nested structures. +// It returns nil if it finds an end element matching the start +// element; otherwise it returns an error describing the problem. +func (d *Decoder) Skip() error { + for { + tok, err := d.Token() + if err != nil { + return err + } + switch tok.(type) { + case StartElement: + if err := d.Skip(); err != nil { + return err + } + case EndElement: + return nil + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/internal/xml/read_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/internal/xml/read_test.go new file mode 100644 index 0000000..02f1e10 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/internal/xml/read_test.go @@ -0,0 +1,744 @@ +// 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 xml + +import ( + "bytes" + "fmt" + "io" + "reflect" + "strings" + "testing" + "time" +) + +// Stripped down Atom feed data structures. + +func TestUnmarshalFeed(t *testing.T) { + var f Feed + if err := Unmarshal([]byte(atomFeedString), &f); err != nil { + t.Fatalf("Unmarshal: %s", err) + } + if !reflect.DeepEqual(f, atomFeed) { + t.Fatalf("have %#v\nwant %#v", f, atomFeed) + } +} + +// hget http://codereview.appspot.com/rss/mine/rsc +const atomFeedString = ` + +Code Review - My issueshttp://codereview.appspot.com/rietveld<>rietveld: an attempt at pubsubhubbub +2009-10-04T01:35:58+00:00email-address-removedurn:md5:134d9179c41f806be79b3a5f7877d19a + An attempt at adding pubsubhubbub support to Rietveld. +http://code.google.com/p/pubsubhubbub +http://code.google.com/p/rietveld/issues/detail?id=155 + +The server side of the protocol is trivial: + 1. add a &lt;link rel=&quot;hub&quot; href=&quot;hub-server&quot;&gt; tag to all + feeds that will be pubsubhubbubbed. + 2. every time one of those feeds changes, tell the hub + with a simple POST request. + +I have tested this by adding debug prints to a local hub +server and checking that the server got the right publish +requests. + +I can&#39;t quite get the server to work, but I think the bug +is not in my code. I think that the server expects to be +able to grab the feed and see the feed&#39;s actual URL in +the link rel=&quot;self&quot;, but the default value for that drops +the :port from the URL, and I cannot for the life of me +figure out how to get the Atom generator deep inside +django not to do that, or even where it is doing that, +or even what code is running to generate the Atom feed. +(I thought I knew but I added some assert False statements +and it kept running!) + +Ignoring that particular problem, I would appreciate +feedback on the right way to get the two values at +the top of feeds.py marked NOTE(rsc). + + +rietveld: correct tab handling +2009-10-03T23:02:17+00:00email-address-removedurn:md5:0a2a4f19bb815101f0ba2904aed7c35a + This fixes the buggy tab rendering that can be seen at +http://codereview.appspot.com/116075/diff/1/2 + +The fundamental problem was that the tab code was +not being told what column the text began in, so it +didn&#39;t know where to put the tab stops. Another problem +was that some of the code assumed that string byte +offsets were the same as column offsets, which is only +true if there are no tabs. + +In the process of fixing this, I cleaned up the arguments +to Fold and ExpandTabs and renamed them Break and +_ExpandTabs so that I could be sure that I found all the +call sites. I also wanted to verify that ExpandTabs was +not being used from outside intra_region_diff.py. + + + ` + +type Feed struct { + XMLName Name `xml:"http://www.w3.org/2005/Atom feed"` + Title string `xml:"title"` + Id string `xml:"id"` + Link []Link `xml:"link"` + Updated time.Time `xml:"updated,attr"` + Author Person `xml:"author"` + Entry []Entry `xml:"entry"` +} + +type Entry struct { + Title string `xml:"title"` + Id string `xml:"id"` + Link []Link `xml:"link"` + Updated time.Time `xml:"updated"` + Author Person `xml:"author"` + Summary Text `xml:"summary"` +} + +type Link struct { + Rel string `xml:"rel,attr,omitempty"` + Href string `xml:"href,attr"` +} + +type Person struct { + Name string `xml:"name"` + URI string `xml:"uri"` + Email string `xml:"email"` + InnerXML string `xml:",innerxml"` +} + +type Text struct { + Type string `xml:"type,attr,omitempty"` + Body string `xml:",chardata"` +} + +var atomFeed = Feed{ + XMLName: Name{"http://www.w3.org/2005/Atom", "feed"}, + Title: "Code Review - My issues", + Link: []Link{ + {Rel: "alternate", Href: "http://codereview.appspot.com/"}, + {Rel: "self", Href: "http://codereview.appspot.com/rss/mine/rsc"}, + }, + Id: "http://codereview.appspot.com/", + Updated: ParseTime("2009-10-04T01:35:58+00:00"), + Author: Person{ + Name: "rietveld<>", + InnerXML: "rietveld<>", + }, + Entry: []Entry{ + { + Title: "rietveld: an attempt at pubsubhubbub\n", + Link: []Link{ + {Rel: "alternate", Href: "http://codereview.appspot.com/126085"}, + }, + Updated: ParseTime("2009-10-04T01:35:58+00:00"), + Author: Person{ + Name: "email-address-removed", + InnerXML: "email-address-removed", + }, + Id: "urn:md5:134d9179c41f806be79b3a5f7877d19a", + Summary: Text{ + Type: "html", + Body: ` + An attempt at adding pubsubhubbub support to Rietveld. +http://code.google.com/p/pubsubhubbub +http://code.google.com/p/rietveld/issues/detail?id=155 + +The server side of the protocol is trivial: + 1. add a <link rel="hub" href="hub-server"> tag to all + feeds that will be pubsubhubbubbed. + 2. every time one of those feeds changes, tell the hub + with a simple POST request. + +I have tested this by adding debug prints to a local hub +server and checking that the server got the right publish +requests. + +I can't quite get the server to work, but I think the bug +is not in my code. I think that the server expects to be +able to grab the feed and see the feed's actual URL in +the link rel="self", but the default value for that drops +the :port from the URL, and I cannot for the life of me +figure out how to get the Atom generator deep inside +django not to do that, or even where it is doing that, +or even what code is running to generate the Atom feed. +(I thought I knew but I added some assert False statements +and it kept running!) + +Ignoring that particular problem, I would appreciate +feedback on the right way to get the two values at +the top of feeds.py marked NOTE(rsc). + + +`, + }, + }, + { + Title: "rietveld: correct tab handling\n", + Link: []Link{ + {Rel: "alternate", Href: "http://codereview.appspot.com/124106"}, + }, + Updated: ParseTime("2009-10-03T23:02:17+00:00"), + Author: Person{ + Name: "email-address-removed", + InnerXML: "email-address-removed", + }, + Id: "urn:md5:0a2a4f19bb815101f0ba2904aed7c35a", + Summary: Text{ + Type: "html", + Body: ` + This fixes the buggy tab rendering that can be seen at +http://codereview.appspot.com/116075/diff/1/2 + +The fundamental problem was that the tab code was +not being told what column the text began in, so it +didn't know where to put the tab stops. Another problem +was that some of the code assumed that string byte +offsets were the same as column offsets, which is only +true if there are no tabs. + +In the process of fixing this, I cleaned up the arguments +to Fold and ExpandTabs and renamed them Break and +_ExpandTabs so that I could be sure that I found all the +call sites. I also wanted to verify that ExpandTabs was +not being used from outside intra_region_diff.py. + + +`, + }, + }, + }, +} + +const pathTestString = ` + + 1 + + + A + + + B + + + C + D + + <_> + E + + + 2 + +` + +type PathTestItem struct { + Value string +} + +type PathTestA struct { + Items []PathTestItem `xml:">Item1"` + Before, After string +} + +type PathTestB struct { + Other []PathTestItem `xml:"Items>Item1"` + Before, After string +} + +type PathTestC struct { + Values1 []string `xml:"Items>Item1>Value"` + Values2 []string `xml:"Items>Item2>Value"` + Before, After string +} + +type PathTestSet struct { + Item1 []PathTestItem +} + +type PathTestD struct { + Other PathTestSet `xml:"Items"` + Before, After string +} + +type PathTestE struct { + Underline string `xml:"Items>_>Value"` + Before, After string +} + +var pathTests = []interface{}{ + &PathTestA{Items: []PathTestItem{{"A"}, {"D"}}, Before: "1", After: "2"}, + &PathTestB{Other: []PathTestItem{{"A"}, {"D"}}, Before: "1", After: "2"}, + &PathTestC{Values1: []string{"A", "C", "D"}, Values2: []string{"B"}, Before: "1", After: "2"}, + &PathTestD{Other: PathTestSet{Item1: []PathTestItem{{"A"}, {"D"}}}, Before: "1", After: "2"}, + &PathTestE{Underline: "E", Before: "1", After: "2"}, +} + +func TestUnmarshalPaths(t *testing.T) { + for _, pt := range pathTests { + v := reflect.New(reflect.TypeOf(pt).Elem()).Interface() + if err := Unmarshal([]byte(pathTestString), v); err != nil { + t.Fatalf("Unmarshal: %s", err) + } + if !reflect.DeepEqual(v, pt) { + t.Fatalf("have %#v\nwant %#v", v, pt) + } + } +} + +type BadPathTestA struct { + First string `xml:"items>item1"` + Other string `xml:"items>item2"` + Second string `xml:"items"` +} + +type BadPathTestB struct { + Other string `xml:"items>item2>value"` + First string `xml:"items>item1"` + Second string `xml:"items>item1>value"` +} + +type BadPathTestC struct { + First string + Second string `xml:"First"` +} + +type BadPathTestD struct { + BadPathEmbeddedA + BadPathEmbeddedB +} + +type BadPathEmbeddedA struct { + First string +} + +type BadPathEmbeddedB struct { + Second string `xml:"First"` +} + +var badPathTests = []struct { + v, e interface{} +}{ + {&BadPathTestA{}, &TagPathError{reflect.TypeOf(BadPathTestA{}), "First", "items>item1", "Second", "items"}}, + {&BadPathTestB{}, &TagPathError{reflect.TypeOf(BadPathTestB{}), "First", "items>item1", "Second", "items>item1>value"}}, + {&BadPathTestC{}, &TagPathError{reflect.TypeOf(BadPathTestC{}), "First", "", "Second", "First"}}, + {&BadPathTestD{}, &TagPathError{reflect.TypeOf(BadPathTestD{}), "First", "", "Second", "First"}}, +} + +func TestUnmarshalBadPaths(t *testing.T) { + for _, tt := range badPathTests { + err := Unmarshal([]byte(pathTestString), tt.v) + if !reflect.DeepEqual(err, tt.e) { + t.Fatalf("Unmarshal with %#v didn't fail properly:\nhave %#v,\nwant %#v", tt.v, err, tt.e) + } + } +} + +const OK = "OK" +const withoutNameTypeData = ` + +` + +type TestThree struct { + XMLName Name `xml:"Test3"` + Attr string `xml:",attr"` +} + +func TestUnmarshalWithoutNameType(t *testing.T) { + var x TestThree + if err := Unmarshal([]byte(withoutNameTypeData), &x); err != nil { + t.Fatalf("Unmarshal: %s", err) + } + if x.Attr != OK { + t.Fatalf("have %v\nwant %v", x.Attr, OK) + } +} + +func TestUnmarshalAttr(t *testing.T) { + type ParamVal struct { + Int int `xml:"int,attr"` + } + + type ParamPtr struct { + Int *int `xml:"int,attr"` + } + + type ParamStringPtr struct { + Int *string `xml:"int,attr"` + } + + x := []byte(``) + + p1 := &ParamPtr{} + if err := Unmarshal(x, p1); err != nil { + t.Fatalf("Unmarshal: %s", err) + } + if p1.Int == nil { + t.Fatalf("Unmarshal failed in to *int field") + } else if *p1.Int != 1 { + t.Fatalf("Unmarshal with %s failed:\nhave %#v,\n want %#v", x, p1.Int, 1) + } + + p2 := &ParamVal{} + if err := Unmarshal(x, p2); err != nil { + t.Fatalf("Unmarshal: %s", err) + } + if p2.Int != 1 { + t.Fatalf("Unmarshal with %s failed:\nhave %#v,\n want %#v", x, p2.Int, 1) + } + + p3 := &ParamStringPtr{} + if err := Unmarshal(x, p3); err != nil { + t.Fatalf("Unmarshal: %s", err) + } + if p3.Int == nil { + t.Fatalf("Unmarshal failed in to *string field") + } else if *p3.Int != "1" { + t.Fatalf("Unmarshal with %s failed:\nhave %#v,\n want %#v", x, p3.Int, 1) + } +} + +type Tables struct { + HTable string `xml:"http://www.w3.org/TR/html4/ table"` + FTable string `xml:"http://www.w3schools.com/furniture table"` +} + +var tables = []struct { + xml string + tab Tables + ns string +}{ + { + xml: `` + + `hello
    ` + + `world
    ` + + `
    `, + tab: Tables{"hello", "world"}, + }, + { + xml: `` + + `world
    ` + + `hello
    ` + + `
    `, + tab: Tables{"hello", "world"}, + }, + { + xml: `` + + `world` + + `hello` + + ``, + tab: Tables{"hello", "world"}, + }, + { + xml: `` + + `bogus
    ` + + `
    `, + tab: Tables{}, + }, + { + xml: `` + + `only
    ` + + `
    `, + tab: Tables{HTable: "only"}, + ns: "http://www.w3.org/TR/html4/", + }, + { + xml: `` + + `only
    ` + + `
    `, + tab: Tables{FTable: "only"}, + ns: "http://www.w3schools.com/furniture", + }, + { + xml: `` + + `only
    ` + + `
    `, + tab: Tables{}, + ns: "something else entirely", + }, +} + +func TestUnmarshalNS(t *testing.T) { + for i, tt := range tables { + var dst Tables + var err error + if tt.ns != "" { + d := NewDecoder(strings.NewReader(tt.xml)) + d.DefaultSpace = tt.ns + err = d.Decode(&dst) + } else { + err = Unmarshal([]byte(tt.xml), &dst) + } + if err != nil { + t.Errorf("#%d: Unmarshal: %v", i, err) + continue + } + want := tt.tab + if dst != want { + t.Errorf("#%d: dst=%+v, want %+v", i, dst, want) + } + } +} + +func TestRoundTrip(t *testing.T) { + // From issue 7535 + const s = `` + in := bytes.NewBufferString(s) + for i := 0; i < 10; i++ { + out := &bytes.Buffer{} + d := NewDecoder(in) + e := NewEncoder(out) + + for { + t, err := d.Token() + if err == io.EOF { + break + } + if err != nil { + fmt.Println("failed:", err) + return + } + e.EncodeToken(t) + } + e.Flush() + in = out + } + if got := in.String(); got != s { + t.Errorf("have: %q\nwant: %q\n", got, s) + } +} + +func TestMarshalNS(t *testing.T) { + dst := Tables{"hello", "world"} + data, err := Marshal(&dst) + if err != nil { + t.Fatalf("Marshal: %v", err) + } + want := `hello
    world
    ` + str := string(data) + if str != want { + t.Errorf("have: %q\nwant: %q\n", str, want) + } +} + +type TableAttrs struct { + TAttr TAttr +} + +type TAttr struct { + HTable string `xml:"http://www.w3.org/TR/html4/ table,attr"` + FTable string `xml:"http://www.w3schools.com/furniture table,attr"` + Lang string `xml:"http://www.w3.org/XML/1998/namespace lang,attr,omitempty"` + Other1 string `xml:"http://golang.org/xml/ other,attr,omitempty"` + Other2 string `xml:"http://golang.org/xmlfoo/ other,attr,omitempty"` + Other3 string `xml:"http://golang.org/json/ other,attr,omitempty"` + Other4 string `xml:"http://golang.org/2/json/ other,attr,omitempty"` +} + +var tableAttrs = []struct { + xml string + tab TableAttrs + ns string +}{ + { + xml: ``, + tab: TableAttrs{TAttr{HTable: "hello", FTable: "world"}}, + }, + { + xml: ``, + tab: TableAttrs{TAttr{HTable: "hello", FTable: "world"}}, + }, + { + xml: ``, + tab: TableAttrs{TAttr{HTable: "hello", FTable: "world"}}, + }, + { + // Default space does not apply to attribute names. + xml: ``, + tab: TableAttrs{TAttr{HTable: "hello", FTable: ""}}, + }, + { + // Default space does not apply to attribute names. + xml: ``, + tab: TableAttrs{TAttr{HTable: "", FTable: "world"}}, + }, + { + xml: ``, + tab: TableAttrs{}, + }, + { + // Default space does not apply to attribute names. + xml: ``, + tab: TableAttrs{TAttr{HTable: "hello", FTable: ""}}, + ns: "http://www.w3schools.com/furniture", + }, + { + // Default space does not apply to attribute names. + xml: ``, + tab: TableAttrs{TAttr{HTable: "", FTable: "world"}}, + ns: "http://www.w3.org/TR/html4/", + }, + { + xml: ``, + tab: TableAttrs{}, + ns: "something else entirely", + }, +} + +func TestUnmarshalNSAttr(t *testing.T) { + for i, tt := range tableAttrs { + var dst TableAttrs + var err error + if tt.ns != "" { + d := NewDecoder(strings.NewReader(tt.xml)) + d.DefaultSpace = tt.ns + err = d.Decode(&dst) + } else { + err = Unmarshal([]byte(tt.xml), &dst) + } + if err != nil { + t.Errorf("#%d: Unmarshal: %v", i, err) + continue + } + want := tt.tab + if dst != want { + t.Errorf("#%d: dst=%+v, want %+v", i, dst, want) + } + } +} + +func TestMarshalNSAttr(t *testing.T) { + src := TableAttrs{TAttr{"hello", "world", "en_US", "other1", "other2", "other3", "other4"}} + data, err := Marshal(&src) + if err != nil { + t.Fatalf("Marshal: %v", err) + } + want := `` + str := string(data) + if str != want { + t.Errorf("Marshal:\nhave: %#q\nwant: %#q\n", str, want) + } + + var dst TableAttrs + if err := Unmarshal(data, &dst); err != nil { + t.Errorf("Unmarshal: %v", err) + } + + if dst != src { + t.Errorf("Unmarshal = %q, want %q", dst, src) + } +} + +type MyCharData struct { + body string +} + +func (m *MyCharData) UnmarshalXML(d *Decoder, start StartElement) error { + for { + t, err := d.Token() + if err == io.EOF { // found end of element + break + } + if err != nil { + return err + } + if char, ok := t.(CharData); ok { + m.body += string(char) + } + } + return nil +} + +var _ Unmarshaler = (*MyCharData)(nil) + +func (m *MyCharData) UnmarshalXMLAttr(attr Attr) error { + panic("must not call") +} + +type MyAttr struct { + attr string +} + +func (m *MyAttr) UnmarshalXMLAttr(attr Attr) error { + m.attr = attr.Value + return nil +} + +var _ UnmarshalerAttr = (*MyAttr)(nil) + +type MyStruct struct { + Data *MyCharData + Attr *MyAttr `xml:",attr"` + + Data2 MyCharData + Attr2 MyAttr `xml:",attr"` +} + +func TestUnmarshaler(t *testing.T) { + xml := ` + + hello world + howdy world + + ` + + var m MyStruct + if err := Unmarshal([]byte(xml), &m); err != nil { + t.Fatal(err) + } + + if m.Data == nil || m.Attr == nil || m.Data.body != "hello world" || m.Attr.attr != "attr1" || m.Data2.body != "howdy world" || m.Attr2.attr != "attr2" { + t.Errorf("m=%#+v\n", m) + } +} + +type Pea struct { + Cotelydon string +} + +type Pod struct { + Pea interface{} `xml:"Pea"` +} + +// https://golang.org/issue/6836 +func TestUnmarshalIntoInterface(t *testing.T) { + pod := new(Pod) + pod.Pea = new(Pea) + xml := `Green stuff` + err := Unmarshal([]byte(xml), pod) + if err != nil { + t.Fatalf("failed to unmarshal %q: %v", xml, err) + } + pea, ok := pod.Pea.(*Pea) + if !ok { + t.Fatalf("unmarshalled into wrong type: have %T want *Pea", pod.Pea) + } + have, want := pea.Cotelydon, "Green stuff" + if have != want { + t.Errorf("failed to unmarshal into interface, have %q want %q", have, want) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/internal/xml/typeinfo.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/internal/xml/typeinfo.go new file mode 100644 index 0000000..fdde288 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/internal/xml/typeinfo.go @@ -0,0 +1,371 @@ +// 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 xml + +import ( + "fmt" + "reflect" + "strings" + "sync" +) + +// typeInfo holds details for the xml representation of a type. +type typeInfo struct { + xmlname *fieldInfo + fields []fieldInfo +} + +// fieldInfo holds details for the xml representation of a single field. +type fieldInfo struct { + idx []int + name string + xmlns string + flags fieldFlags + parents []string +} + +type fieldFlags int + +const ( + fElement fieldFlags = 1 << iota + fAttr + fCharData + fInnerXml + fComment + fAny + + fOmitEmpty + + fMode = fElement | fAttr | fCharData | fInnerXml | fComment | fAny +) + +var tinfoMap = make(map[reflect.Type]*typeInfo) +var tinfoLock sync.RWMutex + +var nameType = reflect.TypeOf(Name{}) + +// getTypeInfo returns the typeInfo structure with details necessary +// for marshalling and unmarshalling typ. +func getTypeInfo(typ reflect.Type) (*typeInfo, error) { + tinfoLock.RLock() + tinfo, ok := tinfoMap[typ] + tinfoLock.RUnlock() + if ok { + return tinfo, nil + } + tinfo = &typeInfo{} + if typ.Kind() == reflect.Struct && typ != nameType { + n := typ.NumField() + for i := 0; i < n; i++ { + f := typ.Field(i) + if f.PkgPath != "" || f.Tag.Get("xml") == "-" { + continue // Private field + } + + // For embedded structs, embed its fields. + if f.Anonymous { + t := f.Type + if t.Kind() == reflect.Ptr { + t = t.Elem() + } + if t.Kind() == reflect.Struct { + inner, err := getTypeInfo(t) + if err != nil { + return nil, err + } + if tinfo.xmlname == nil { + tinfo.xmlname = inner.xmlname + } + for _, finfo := range inner.fields { + finfo.idx = append([]int{i}, finfo.idx...) + if err := addFieldInfo(typ, tinfo, &finfo); err != nil { + return nil, err + } + } + continue + } + } + + finfo, err := structFieldInfo(typ, &f) + if err != nil { + return nil, err + } + + if f.Name == "XMLName" { + tinfo.xmlname = finfo + continue + } + + // Add the field if it doesn't conflict with other fields. + if err := addFieldInfo(typ, tinfo, finfo); err != nil { + return nil, err + } + } + } + tinfoLock.Lock() + tinfoMap[typ] = tinfo + tinfoLock.Unlock() + return tinfo, nil +} + +// structFieldInfo builds and returns a fieldInfo for f. +func structFieldInfo(typ reflect.Type, f *reflect.StructField) (*fieldInfo, error) { + finfo := &fieldInfo{idx: f.Index} + + // Split the tag from the xml namespace if necessary. + tag := f.Tag.Get("xml") + if i := strings.Index(tag, " "); i >= 0 { + finfo.xmlns, tag = tag[:i], tag[i+1:] + } + + // Parse flags. + tokens := strings.Split(tag, ",") + if len(tokens) == 1 { + finfo.flags = fElement + } else { + tag = tokens[0] + for _, flag := range tokens[1:] { + switch flag { + case "attr": + finfo.flags |= fAttr + case "chardata": + finfo.flags |= fCharData + case "innerxml": + finfo.flags |= fInnerXml + case "comment": + finfo.flags |= fComment + case "any": + finfo.flags |= fAny + case "omitempty": + finfo.flags |= fOmitEmpty + } + } + + // Validate the flags used. + valid := true + switch mode := finfo.flags & fMode; mode { + case 0: + finfo.flags |= fElement + case fAttr, fCharData, fInnerXml, fComment, fAny: + if f.Name == "XMLName" || tag != "" && mode != fAttr { + valid = false + } + default: + // This will also catch multiple modes in a single field. + valid = false + } + if finfo.flags&fMode == fAny { + finfo.flags |= fElement + } + if finfo.flags&fOmitEmpty != 0 && finfo.flags&(fElement|fAttr) == 0 { + valid = false + } + if !valid { + return nil, fmt.Errorf("xml: invalid tag in field %s of type %s: %q", + f.Name, typ, f.Tag.Get("xml")) + } + } + + // Use of xmlns without a name is not allowed. + if finfo.xmlns != "" && tag == "" { + return nil, fmt.Errorf("xml: namespace without name in field %s of type %s: %q", + f.Name, typ, f.Tag.Get("xml")) + } + + if f.Name == "XMLName" { + // The XMLName field records the XML element name. Don't + // process it as usual because its name should default to + // empty rather than to the field name. + finfo.name = tag + return finfo, nil + } + + if tag == "" { + // If the name part of the tag is completely empty, get + // default from XMLName of underlying struct if feasible, + // or field name otherwise. + if xmlname := lookupXMLName(f.Type); xmlname != nil { + finfo.xmlns, finfo.name = xmlname.xmlns, xmlname.name + } else { + finfo.name = f.Name + } + return finfo, nil + } + + if finfo.xmlns == "" && finfo.flags&fAttr == 0 { + // If it's an element no namespace specified, get the default + // from the XMLName of enclosing struct if possible. + if xmlname := lookupXMLName(typ); xmlname != nil { + finfo.xmlns = xmlname.xmlns + } + } + + // Prepare field name and parents. + parents := strings.Split(tag, ">") + if parents[0] == "" { + parents[0] = f.Name + } + if parents[len(parents)-1] == "" { + return nil, fmt.Errorf("xml: trailing '>' in field %s of type %s", f.Name, typ) + } + finfo.name = parents[len(parents)-1] + if len(parents) > 1 { + if (finfo.flags & fElement) == 0 { + return nil, fmt.Errorf("xml: %s chain not valid with %s flag", tag, strings.Join(tokens[1:], ",")) + } + finfo.parents = parents[:len(parents)-1] + } + + // If the field type has an XMLName field, the names must match + // so that the behavior of both marshalling and unmarshalling + // is straightforward and unambiguous. + if finfo.flags&fElement != 0 { + ftyp := f.Type + xmlname := lookupXMLName(ftyp) + if xmlname != nil && xmlname.name != finfo.name { + return nil, fmt.Errorf("xml: name %q in tag of %s.%s conflicts with name %q in %s.XMLName", + finfo.name, typ, f.Name, xmlname.name, ftyp) + } + } + return finfo, nil +} + +// lookupXMLName returns the fieldInfo for typ's XMLName field +// in case it exists and has a valid xml field tag, otherwise +// it returns nil. +func lookupXMLName(typ reflect.Type) (xmlname *fieldInfo) { + for typ.Kind() == reflect.Ptr { + typ = typ.Elem() + } + if typ.Kind() != reflect.Struct { + return nil + } + for i, n := 0, typ.NumField(); i < n; i++ { + f := typ.Field(i) + if f.Name != "XMLName" { + continue + } + finfo, err := structFieldInfo(typ, &f) + if finfo.name != "" && err == nil { + return finfo + } + // Also consider errors as a non-existent field tag + // and let getTypeInfo itself report the error. + break + } + return nil +} + +func min(a, b int) int { + if a <= b { + return a + } + return b +} + +// addFieldInfo adds finfo to tinfo.fields if there are no +// conflicts, or if conflicts arise from previous fields that were +// obtained from deeper embedded structures than finfo. In the latter +// case, the conflicting entries are dropped. +// A conflict occurs when the path (parent + name) to a field is +// itself a prefix of another path, or when two paths match exactly. +// It is okay for field paths to share a common, shorter prefix. +func addFieldInfo(typ reflect.Type, tinfo *typeInfo, newf *fieldInfo) error { + var conflicts []int +Loop: + // First, figure all conflicts. Most working code will have none. + for i := range tinfo.fields { + oldf := &tinfo.fields[i] + if oldf.flags&fMode != newf.flags&fMode { + continue + } + if oldf.xmlns != "" && newf.xmlns != "" && oldf.xmlns != newf.xmlns { + continue + } + minl := min(len(newf.parents), len(oldf.parents)) + for p := 0; p < minl; p++ { + if oldf.parents[p] != newf.parents[p] { + continue Loop + } + } + if len(oldf.parents) > len(newf.parents) { + if oldf.parents[len(newf.parents)] == newf.name { + conflicts = append(conflicts, i) + } + } else if len(oldf.parents) < len(newf.parents) { + if newf.parents[len(oldf.parents)] == oldf.name { + conflicts = append(conflicts, i) + } + } else { + if newf.name == oldf.name { + conflicts = append(conflicts, i) + } + } + } + // Without conflicts, add the new field and return. + if conflicts == nil { + tinfo.fields = append(tinfo.fields, *newf) + return nil + } + + // If any conflict is shallower, ignore the new field. + // This matches the Go field resolution on embedding. + for _, i := range conflicts { + if len(tinfo.fields[i].idx) < len(newf.idx) { + return nil + } + } + + // Otherwise, if any of them is at the same depth level, it's an error. + for _, i := range conflicts { + oldf := &tinfo.fields[i] + if len(oldf.idx) == len(newf.idx) { + f1 := typ.FieldByIndex(oldf.idx) + f2 := typ.FieldByIndex(newf.idx) + return &TagPathError{typ, f1.Name, f1.Tag.Get("xml"), f2.Name, f2.Tag.Get("xml")} + } + } + + // Otherwise, the new field is shallower, and thus takes precedence, + // so drop the conflicting fields from tinfo and append the new one. + for c := len(conflicts) - 1; c >= 0; c-- { + i := conflicts[c] + copy(tinfo.fields[i:], tinfo.fields[i+1:]) + tinfo.fields = tinfo.fields[:len(tinfo.fields)-1] + } + tinfo.fields = append(tinfo.fields, *newf) + return nil +} + +// A TagPathError represents an error in the unmarshalling process +// caused by the use of field tags with conflicting paths. +type TagPathError struct { + Struct reflect.Type + Field1, Tag1 string + Field2, Tag2 string +} + +func (e *TagPathError) Error() string { + return fmt.Sprintf("%s field %q with tag %q conflicts with field %q with tag %q", e.Struct, e.Field1, e.Tag1, e.Field2, e.Tag2) +} + +// value returns v's field value corresponding to finfo. +// It's equivalent to v.FieldByIndex(finfo.idx), but initializes +// and dereferences pointers as necessary. +func (finfo *fieldInfo) value(v reflect.Value) reflect.Value { + for i, x := range finfo.idx { + if i > 0 { + t := v.Type() + if t.Kind() == reflect.Ptr && t.Elem().Kind() == reflect.Struct { + if v.IsNil() { + v.Set(reflect.New(v.Type().Elem())) + } + v = v.Elem() + } + } + v = v.Field(x) + } + return v +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/internal/xml/xml.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/internal/xml/xml.go new file mode 100644 index 0000000..5b79cbe --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/internal/xml/xml.go @@ -0,0 +1,1998 @@ +// 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 xml implements a simple XML 1.0 parser that +// understands XML name spaces. +package xml + +// References: +// Annotated XML spec: http://www.xml.com/axml/testaxml.htm +// XML name spaces: http://www.w3.org/TR/REC-xml-names/ + +// TODO(rsc): +// Test error handling. + +import ( + "bufio" + "bytes" + "errors" + "fmt" + "io" + "strconv" + "strings" + "unicode" + "unicode/utf8" +) + +// A SyntaxError represents a syntax error in the XML input stream. +type SyntaxError struct { + Msg string + Line int +} + +func (e *SyntaxError) Error() string { + return "XML syntax error on line " + strconv.Itoa(e.Line) + ": " + e.Msg +} + +// A Name represents an XML name (Local) annotated with a name space +// identifier (Space). In tokens returned by Decoder.Token, the Space +// identifier is given as a canonical URL, not the short prefix used in +// the document being parsed. +// +// As a special case, XML namespace declarations will use the literal +// string "xmlns" for the Space field instead of the fully resolved URL. +// See Encoder.EncodeToken for more information on namespace encoding +// behaviour. +type Name struct { + Space, Local string +} + +// isNamespace reports whether the name is a namespace-defining name. +func (name Name) isNamespace() bool { + return name.Local == "xmlns" || name.Space == "xmlns" +} + +// An Attr represents an attribute in an XML element (Name=Value). +type Attr struct { + Name Name + Value string +} + +// A Token is an interface holding one of the token types: +// StartElement, EndElement, CharData, Comment, ProcInst, or Directive. +type Token interface{} + +// A StartElement represents an XML start element. +type StartElement struct { + Name Name + Attr []Attr +} + +func (e StartElement) Copy() StartElement { + attrs := make([]Attr, len(e.Attr)) + copy(attrs, e.Attr) + e.Attr = attrs + return e +} + +// End returns the corresponding XML end element. +func (e StartElement) End() EndElement { + return EndElement{e.Name} +} + +// setDefaultNamespace sets the namespace of the element +// as the default for all elements contained within it. +func (e *StartElement) setDefaultNamespace() { + if e.Name.Space == "" { + // If there's no namespace on the element, don't + // set the default. Strictly speaking this might be wrong, as + // we can't tell if the element had no namespace set + // or was just using the default namespace. + return + } + // Don't add a default name space if there's already one set. + for _, attr := range e.Attr { + if attr.Name.Space == "" && attr.Name.Local == "xmlns" { + return + } + } + e.Attr = append(e.Attr, Attr{ + Name: Name{ + Local: "xmlns", + }, + Value: e.Name.Space, + }) +} + +// An EndElement represents an XML end element. +type EndElement struct { + Name Name +} + +// A CharData represents XML character data (raw text), +// in which XML escape sequences have been replaced by +// the characters they represent. +type CharData []byte + +func makeCopy(b []byte) []byte { + b1 := make([]byte, len(b)) + copy(b1, b) + return b1 +} + +func (c CharData) Copy() CharData { return CharData(makeCopy(c)) } + +// A Comment represents an XML comment of the form . +// The bytes do not include the comment markers. +type Comment []byte + +func (c Comment) Copy() Comment { return Comment(makeCopy(c)) } + +// A ProcInst represents an XML processing instruction of the form +type ProcInst struct { + Target string + Inst []byte +} + +func (p ProcInst) Copy() ProcInst { + p.Inst = makeCopy(p.Inst) + return p +} + +// A Directive represents an XML directive of the form . +// The bytes do not include the markers. +type Directive []byte + +func (d Directive) Copy() Directive { return Directive(makeCopy(d)) } + +// CopyToken returns a copy of a Token. +func CopyToken(t Token) Token { + switch v := t.(type) { + case CharData: + return v.Copy() + case Comment: + return v.Copy() + case Directive: + return v.Copy() + case ProcInst: + return v.Copy() + case StartElement: + return v.Copy() + } + return t +} + +// A Decoder represents an XML parser reading a particular input stream. +// The parser assumes that its input is encoded in UTF-8. +type Decoder struct { + // Strict defaults to true, enforcing the requirements + // of the XML specification. + // If set to false, the parser allows input containing common + // mistakes: + // * If an element is missing an end tag, the parser invents + // end tags as necessary to keep the return values from Token + // properly balanced. + // * In attribute values and character data, unknown or malformed + // character entities (sequences beginning with &) are left alone. + // + // Setting: + // + // d.Strict = false; + // d.AutoClose = HTMLAutoClose; + // d.Entity = HTMLEntity + // + // creates a parser that can handle typical HTML. + // + // Strict mode does not enforce the requirements of the XML name spaces TR. + // In particular it does not reject name space tags using undefined prefixes. + // Such tags are recorded with the unknown prefix as the name space URL. + Strict bool + + // When Strict == false, AutoClose indicates a set of elements to + // consider closed immediately after they are opened, regardless + // of whether an end element is present. + AutoClose []string + + // Entity can be used to map non-standard entity names to string replacements. + // The parser behaves as if these standard mappings are present in the map, + // regardless of the actual map content: + // + // "lt": "<", + // "gt": ">", + // "amp": "&", + // "apos": "'", + // "quot": `"`, + Entity map[string]string + + // CharsetReader, if non-nil, defines a function to generate + // charset-conversion readers, converting from the provided + // non-UTF-8 charset into UTF-8. If CharsetReader is nil or + // returns an error, parsing stops with an error. One of the + // the CharsetReader's result values must be non-nil. + CharsetReader func(charset string, input io.Reader) (io.Reader, error) + + // DefaultSpace sets the default name space used for unadorned tags, + // as if the entire XML stream were wrapped in an element containing + // the attribute xmlns="DefaultSpace". + DefaultSpace string + + r io.ByteReader + buf bytes.Buffer + saved *bytes.Buffer + stk *stack + free *stack + needClose bool + toClose Name + nextToken Token + nextByte int + ns map[string]string + err error + line int + offset int64 + unmarshalDepth int +} + +// NewDecoder creates a new XML parser reading from r. +// If r does not implement io.ByteReader, NewDecoder will +// do its own buffering. +func NewDecoder(r io.Reader) *Decoder { + d := &Decoder{ + ns: make(map[string]string), + nextByte: -1, + line: 1, + Strict: true, + } + d.switchToReader(r) + return d +} + +// Token returns the next XML token in the input stream. +// At the end of the input stream, Token returns nil, io.EOF. +// +// Slices of bytes in the returned token data refer to the +// parser's internal buffer and remain valid only until the next +// call to Token. To acquire a copy of the bytes, call CopyToken +// or the token's Copy method. +// +// Token expands self-closing elements such as
    +// into separate start and end elements returned by successive calls. +// +// Token guarantees that the StartElement and EndElement +// tokens it returns are properly nested and matched: +// if Token encounters an unexpected end element, +// it will return an error. +// +// Token implements XML name spaces as described by +// http://www.w3.org/TR/REC-xml-names/. Each of the +// Name structures contained in the Token has the Space +// set to the URL identifying its name space when known. +// If Token encounters an unrecognized name space prefix, +// it uses the prefix as the Space rather than report an error. +func (d *Decoder) Token() (t Token, err error) { + if d.stk != nil && d.stk.kind == stkEOF { + err = io.EOF + return + } + if d.nextToken != nil { + t = d.nextToken + d.nextToken = nil + } else if t, err = d.rawToken(); err != nil { + return + } + + if !d.Strict { + if t1, ok := d.autoClose(t); ok { + d.nextToken = t + t = t1 + } + } + switch t1 := t.(type) { + case StartElement: + // In XML name spaces, the translations listed in the + // attributes apply to the element name and + // to the other attribute names, so process + // the translations first. + for _, a := range t1.Attr { + if a.Name.Space == "xmlns" { + v, ok := d.ns[a.Name.Local] + d.pushNs(a.Name.Local, v, ok) + d.ns[a.Name.Local] = a.Value + } + if a.Name.Space == "" && a.Name.Local == "xmlns" { + // Default space for untagged names + v, ok := d.ns[""] + d.pushNs("", v, ok) + d.ns[""] = a.Value + } + } + + d.translate(&t1.Name, true) + for i := range t1.Attr { + d.translate(&t1.Attr[i].Name, false) + } + d.pushElement(t1.Name) + t = t1 + + case EndElement: + d.translate(&t1.Name, true) + if !d.popElement(&t1) { + return nil, d.err + } + t = t1 + } + return +} + +const xmlURL = "http://www.w3.org/XML/1998/namespace" + +// Apply name space translation to name n. +// The default name space (for Space=="") +// applies only to element names, not to attribute names. +func (d *Decoder) translate(n *Name, isElementName bool) { + switch { + case n.Space == "xmlns": + return + case n.Space == "" && !isElementName: + return + case n.Space == "xml": + n.Space = xmlURL + case n.Space == "" && n.Local == "xmlns": + return + } + if v, ok := d.ns[n.Space]; ok { + n.Space = v + } else if n.Space == "" { + n.Space = d.DefaultSpace + } +} + +func (d *Decoder) switchToReader(r io.Reader) { + // Get efficient byte at a time reader. + // Assume that if reader has its own + // ReadByte, it's efficient enough. + // Otherwise, use bufio. + if rb, ok := r.(io.ByteReader); ok { + d.r = rb + } else { + d.r = bufio.NewReader(r) + } +} + +// Parsing state - stack holds old name space translations +// and the current set of open elements. The translations to pop when +// ending a given tag are *below* it on the stack, which is +// more work but forced on us by XML. +type stack struct { + next *stack + kind int + name Name + ok bool +} + +const ( + stkStart = iota + stkNs + stkEOF +) + +func (d *Decoder) push(kind int) *stack { + s := d.free + if s != nil { + d.free = s.next + } else { + s = new(stack) + } + s.next = d.stk + s.kind = kind + d.stk = s + return s +} + +func (d *Decoder) pop() *stack { + s := d.stk + if s != nil { + d.stk = s.next + s.next = d.free + d.free = s + } + return s +} + +// Record that after the current element is finished +// (that element is already pushed on the stack) +// Token should return EOF until popEOF is called. +func (d *Decoder) pushEOF() { + // Walk down stack to find Start. + // It might not be the top, because there might be stkNs + // entries above it. + start := d.stk + for start.kind != stkStart { + start = start.next + } + // The stkNs entries below a start are associated with that + // element too; skip over them. + for start.next != nil && start.next.kind == stkNs { + start = start.next + } + s := d.free + if s != nil { + d.free = s.next + } else { + s = new(stack) + } + s.kind = stkEOF + s.next = start.next + start.next = s +} + +// Undo a pushEOF. +// The element must have been finished, so the EOF should be at the top of the stack. +func (d *Decoder) popEOF() bool { + if d.stk == nil || d.stk.kind != stkEOF { + return false + } + d.pop() + return true +} + +// Record that we are starting an element with the given name. +func (d *Decoder) pushElement(name Name) { + s := d.push(stkStart) + s.name = name +} + +// Record that we are changing the value of ns[local]. +// The old value is url, ok. +func (d *Decoder) pushNs(local string, url string, ok bool) { + s := d.push(stkNs) + s.name.Local = local + s.name.Space = url + s.ok = ok +} + +// Creates a SyntaxError with the current line number. +func (d *Decoder) syntaxError(msg string) error { + return &SyntaxError{Msg: msg, Line: d.line} +} + +// Record that we are ending an element with the given name. +// The name must match the record at the top of the stack, +// which must be a pushElement record. +// After popping the element, apply any undo records from +// the stack to restore the name translations that existed +// before we saw this element. +func (d *Decoder) popElement(t *EndElement) bool { + s := d.pop() + name := t.Name + switch { + case s == nil || s.kind != stkStart: + d.err = d.syntaxError("unexpected end element ") + return false + case s.name.Local != name.Local: + if !d.Strict { + d.needClose = true + d.toClose = t.Name + t.Name = s.name + return true + } + d.err = d.syntaxError("element <" + s.name.Local + "> closed by ") + return false + case s.name.Space != name.Space: + d.err = d.syntaxError("element <" + s.name.Local + "> in space " + s.name.Space + + "closed by in space " + name.Space) + return false + } + + // Pop stack until a Start or EOF is on the top, undoing the + // translations that were associated with the element we just closed. + for d.stk != nil && d.stk.kind != stkStart && d.stk.kind != stkEOF { + s := d.pop() + if s.ok { + d.ns[s.name.Local] = s.name.Space + } else { + delete(d.ns, s.name.Local) + } + } + + return true +} + +// If the top element on the stack is autoclosing and +// t is not the end tag, invent the end tag. +func (d *Decoder) autoClose(t Token) (Token, bool) { + if d.stk == nil || d.stk.kind != stkStart { + return nil, false + } + name := strings.ToLower(d.stk.name.Local) + for _, s := range d.AutoClose { + if strings.ToLower(s) == name { + // This one should be auto closed if t doesn't close it. + et, ok := t.(EndElement) + if !ok || et.Name.Local != name { + return EndElement{d.stk.name}, true + } + break + } + } + return nil, false +} + +var errRawToken = errors.New("xml: cannot use RawToken from UnmarshalXML method") + +// RawToken is like Token but does not verify that +// start and end elements match and does not translate +// name space prefixes to their corresponding URLs. +func (d *Decoder) RawToken() (Token, error) { + if d.unmarshalDepth > 0 { + return nil, errRawToken + } + return d.rawToken() +} + +func (d *Decoder) rawToken() (Token, error) { + if d.err != nil { + return nil, d.err + } + if d.needClose { + // The last element we read was self-closing and + // we returned just the StartElement half. + // Return the EndElement half now. + d.needClose = false + return EndElement{d.toClose}, nil + } + + b, ok := d.getc() + if !ok { + return nil, d.err + } + + if b != '<' { + // Text section. + d.ungetc(b) + data := d.text(-1, false) + if data == nil { + return nil, d.err + } + return CharData(data), nil + } + + if b, ok = d.mustgetc(); !ok { + return nil, d.err + } + switch b { + case '/': + // ' { + d.err = d.syntaxError("invalid characters between ") + return nil, d.err + } + return EndElement{name}, nil + + case '?': + // ' { + break + } + b0 = b + } + data := d.buf.Bytes() + data = data[0 : len(data)-2] // chop ?> + + if target == "xml" { + content := string(data) + ver := procInst("version", content) + if ver != "" && ver != "1.0" { + d.err = fmt.Errorf("xml: unsupported version %q; only version 1.0 is supported", ver) + return nil, d.err + } + enc := procInst("encoding", content) + if enc != "" && enc != "utf-8" && enc != "UTF-8" { + if d.CharsetReader == nil { + d.err = fmt.Errorf("xml: encoding %q declared but Decoder.CharsetReader is nil", enc) + return nil, d.err + } + newr, err := d.CharsetReader(enc, d.r.(io.Reader)) + if err != nil { + d.err = fmt.Errorf("xml: opening charset %q: %v", enc, err) + return nil, d.err + } + if newr == nil { + panic("CharsetReader returned a nil Reader for charset " + enc) + } + d.switchToReader(newr) + } + } + return ProcInst{target, data}, nil + + case '!': + // ' { + break + } + b0, b1 = b1, b + } + data := d.buf.Bytes() + data = data[0 : len(data)-3] // chop --> + return Comment(data), nil + + case '[': // . + data := d.text(-1, true) + if data == nil { + return nil, d.err + } + return CharData(data), nil + } + + // Probably a directive: , , etc. + // We don't care, but accumulate for caller. Quoted angle + // brackets do not count for nesting. + d.buf.Reset() + d.buf.WriteByte(b) + inquote := uint8(0) + depth := 0 + for { + if b, ok = d.mustgetc(); !ok { + return nil, d.err + } + if inquote == 0 && b == '>' && depth == 0 { + break + } + HandleB: + d.buf.WriteByte(b) + switch { + case b == inquote: + inquote = 0 + + case inquote != 0: + // in quotes, no special action + + case b == '\'' || b == '"': + inquote = b + + case b == '>' && inquote == 0: + depth-- + + case b == '<' && inquote == 0: + // Look for ` + +var testEntity = map[string]string{"何": "What", "is-it": "is it?"} + +var rawTokens = []Token{ + CharData("\n"), + ProcInst{"xml", []byte(`version="1.0" encoding="UTF-8"`)}, + CharData("\n"), + Directive(`DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"`), + CharData("\n"), + StartElement{Name{"", "body"}, []Attr{{Name{"xmlns", "foo"}, "ns1"}, {Name{"", "xmlns"}, "ns2"}, {Name{"xmlns", "tag"}, "ns3"}}}, + CharData("\n "), + StartElement{Name{"", "hello"}, []Attr{{Name{"", "lang"}, "en"}}}, + CharData("World <>'\" 白鵬翔"), + EndElement{Name{"", "hello"}}, + CharData("\n "), + StartElement{Name{"", "query"}, []Attr{}}, + CharData("What is it?"), + EndElement{Name{"", "query"}}, + CharData("\n "), + StartElement{Name{"", "goodbye"}, []Attr{}}, + EndElement{Name{"", "goodbye"}}, + CharData("\n "), + StartElement{Name{"", "outer"}, []Attr{{Name{"foo", "attr"}, "value"}, {Name{"xmlns", "tag"}, "ns4"}}}, + CharData("\n "), + StartElement{Name{"", "inner"}, []Attr{}}, + EndElement{Name{"", "inner"}}, + CharData("\n "), + EndElement{Name{"", "outer"}}, + CharData("\n "), + StartElement{Name{"tag", "name"}, []Attr{}}, + CharData("\n "), + CharData("Some text here."), + CharData("\n "), + EndElement{Name{"tag", "name"}}, + CharData("\n"), + EndElement{Name{"", "body"}}, + Comment(" missing final newline "), +} + +var cookedTokens = []Token{ + CharData("\n"), + ProcInst{"xml", []byte(`version="1.0" encoding="UTF-8"`)}, + CharData("\n"), + Directive(`DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"`), + CharData("\n"), + StartElement{Name{"ns2", "body"}, []Attr{{Name{"xmlns", "foo"}, "ns1"}, {Name{"", "xmlns"}, "ns2"}, {Name{"xmlns", "tag"}, "ns3"}}}, + CharData("\n "), + StartElement{Name{"ns2", "hello"}, []Attr{{Name{"", "lang"}, "en"}}}, + CharData("World <>'\" 白鵬翔"), + EndElement{Name{"ns2", "hello"}}, + CharData("\n "), + StartElement{Name{"ns2", "query"}, []Attr{}}, + CharData("What is it?"), + EndElement{Name{"ns2", "query"}}, + CharData("\n "), + StartElement{Name{"ns2", "goodbye"}, []Attr{}}, + EndElement{Name{"ns2", "goodbye"}}, + CharData("\n "), + StartElement{Name{"ns2", "outer"}, []Attr{{Name{"ns1", "attr"}, "value"}, {Name{"xmlns", "tag"}, "ns4"}}}, + CharData("\n "), + StartElement{Name{"ns2", "inner"}, []Attr{}}, + EndElement{Name{"ns2", "inner"}}, + CharData("\n "), + EndElement{Name{"ns2", "outer"}}, + CharData("\n "), + StartElement{Name{"ns3", "name"}, []Attr{}}, + CharData("\n "), + CharData("Some text here."), + CharData("\n "), + EndElement{Name{"ns3", "name"}}, + CharData("\n"), + EndElement{Name{"ns2", "body"}}, + Comment(" missing final newline "), +} + +const testInputAltEncoding = ` + +VALUE` + +var rawTokensAltEncoding = []Token{ + CharData("\n"), + ProcInst{"xml", []byte(`version="1.0" encoding="x-testing-uppercase"`)}, + CharData("\n"), + StartElement{Name{"", "tag"}, []Attr{}}, + CharData("value"), + EndElement{Name{"", "tag"}}, +} + +var xmlInput = []string{ + // unexpected EOF cases + "<", + "", + "", + "", + // "", // let the Token() caller handle + "", + "", + "", + "", + " c;", + "", + "", + "", + // "", // let the Token() caller handle + "", + "", + "cdata]]>", +} + +func TestRawToken(t *testing.T) { + d := NewDecoder(strings.NewReader(testInput)) + d.Entity = testEntity + testRawToken(t, d, testInput, rawTokens) +} + +const nonStrictInput = ` +non&entity +&unknown;entity +{ +&#zzz; +&なまえ3; +<-gt; +&; +&0a; +` + +var nonStringEntity = map[string]string{"": "oops!", "0a": "oops!"} + +var nonStrictTokens = []Token{ + CharData("\n"), + StartElement{Name{"", "tag"}, []Attr{}}, + CharData("non&entity"), + EndElement{Name{"", "tag"}}, + CharData("\n"), + StartElement{Name{"", "tag"}, []Attr{}}, + CharData("&unknown;entity"), + EndElement{Name{"", "tag"}}, + CharData("\n"), + StartElement{Name{"", "tag"}, []Attr{}}, + CharData("{"), + EndElement{Name{"", "tag"}}, + CharData("\n"), + StartElement{Name{"", "tag"}, []Attr{}}, + CharData("&#zzz;"), + EndElement{Name{"", "tag"}}, + CharData("\n"), + StartElement{Name{"", "tag"}, []Attr{}}, + CharData("&なまえ3;"), + EndElement{Name{"", "tag"}}, + CharData("\n"), + StartElement{Name{"", "tag"}, []Attr{}}, + CharData("<-gt;"), + EndElement{Name{"", "tag"}}, + CharData("\n"), + StartElement{Name{"", "tag"}, []Attr{}}, + CharData("&;"), + EndElement{Name{"", "tag"}}, + CharData("\n"), + StartElement{Name{"", "tag"}, []Attr{}}, + CharData("&0a;"), + EndElement{Name{"", "tag"}}, + CharData("\n"), +} + +func TestNonStrictRawToken(t *testing.T) { + d := NewDecoder(strings.NewReader(nonStrictInput)) + d.Strict = false + testRawToken(t, d, nonStrictInput, nonStrictTokens) +} + +type downCaser struct { + t *testing.T + r io.ByteReader +} + +func (d *downCaser) ReadByte() (c byte, err error) { + c, err = d.r.ReadByte() + if c >= 'A' && c <= 'Z' { + c += 'a' - 'A' + } + return +} + +func (d *downCaser) Read(p []byte) (int, error) { + d.t.Fatalf("unexpected Read call on downCaser reader") + panic("unreachable") +} + +func TestRawTokenAltEncoding(t *testing.T) { + d := NewDecoder(strings.NewReader(testInputAltEncoding)) + d.CharsetReader = func(charset string, input io.Reader) (io.Reader, error) { + if charset != "x-testing-uppercase" { + t.Fatalf("unexpected charset %q", charset) + } + return &downCaser{t, input.(io.ByteReader)}, nil + } + testRawToken(t, d, testInputAltEncoding, rawTokensAltEncoding) +} + +func TestRawTokenAltEncodingNoConverter(t *testing.T) { + d := NewDecoder(strings.NewReader(testInputAltEncoding)) + token, err := d.RawToken() + if token == nil { + t.Fatalf("expected a token on first RawToken call") + } + if err != nil { + t.Fatal(err) + } + token, err = d.RawToken() + if token != nil { + t.Errorf("expected a nil token; got %#v", token) + } + if err == nil { + t.Fatalf("expected an error on second RawToken call") + } + const encoding = "x-testing-uppercase" + if !strings.Contains(err.Error(), encoding) { + t.Errorf("expected error to contain %q; got error: %v", + encoding, err) + } +} + +func testRawToken(t *testing.T, d *Decoder, raw string, rawTokens []Token) { + lastEnd := int64(0) + for i, want := range rawTokens { + start := d.InputOffset() + have, err := d.RawToken() + end := d.InputOffset() + if err != nil { + t.Fatalf("token %d: unexpected error: %s", i, err) + } + if !reflect.DeepEqual(have, want) { + var shave, swant string + if _, ok := have.(CharData); ok { + shave = fmt.Sprintf("CharData(%q)", have) + } else { + shave = fmt.Sprintf("%#v", have) + } + if _, ok := want.(CharData); ok { + swant = fmt.Sprintf("CharData(%q)", want) + } else { + swant = fmt.Sprintf("%#v", want) + } + t.Errorf("token %d = %s, want %s", i, shave, swant) + } + + // Check that InputOffset returned actual token. + switch { + case start < lastEnd: + t.Errorf("token %d: position [%d,%d) for %T is before previous token", i, start, end, have) + case start >= end: + // Special case: EndElement can be synthesized. + if start == end && end == lastEnd { + break + } + t.Errorf("token %d: position [%d,%d) for %T is empty", i, start, end, have) + case end > int64(len(raw)): + t.Errorf("token %d: position [%d,%d) for %T extends beyond input", i, start, end, have) + default: + text := raw[start:end] + if strings.ContainsAny(text, "<>") && (!strings.HasPrefix(text, "<") || !strings.HasSuffix(text, ">")) { + t.Errorf("token %d: misaligned raw token %#q for %T", i, text, have) + } + } + lastEnd = end + } +} + +// Ensure that directives (specifically !DOCTYPE) include the complete +// text of any nested directives, noting that < and > do not change +// nesting depth if they are in single or double quotes. + +var nestedDirectivesInput = ` +]> +">]> +]> +'>]> +]> +'>]> +]> +` + +var nestedDirectivesTokens = []Token{ + CharData("\n"), + Directive(`DOCTYPE []`), + CharData("\n"), + Directive(`DOCTYPE [">]`), + CharData("\n"), + Directive(`DOCTYPE []`), + CharData("\n"), + Directive(`DOCTYPE ['>]`), + CharData("\n"), + Directive(`DOCTYPE []`), + CharData("\n"), + Directive(`DOCTYPE ['>]`), + CharData("\n"), + Directive(`DOCTYPE []`), + CharData("\n"), +} + +func TestNestedDirectives(t *testing.T) { + d := NewDecoder(strings.NewReader(nestedDirectivesInput)) + + for i, want := range nestedDirectivesTokens { + have, err := d.Token() + if err != nil { + t.Fatalf("token %d: unexpected error: %s", i, err) + } + if !reflect.DeepEqual(have, want) { + t.Errorf("token %d = %#v want %#v", i, have, want) + } + } +} + +func TestToken(t *testing.T) { + d := NewDecoder(strings.NewReader(testInput)) + d.Entity = testEntity + + for i, want := range cookedTokens { + have, err := d.Token() + if err != nil { + t.Fatalf("token %d: unexpected error: %s", i, err) + } + if !reflect.DeepEqual(have, want) { + t.Errorf("token %d = %#v want %#v", i, have, want) + } + } +} + +func TestSyntax(t *testing.T) { + for i := range xmlInput { + d := NewDecoder(strings.NewReader(xmlInput[i])) + var err error + for _, err = d.Token(); err == nil; _, err = d.Token() { + } + if _, ok := err.(*SyntaxError); !ok { + t.Fatalf(`xmlInput "%s": expected SyntaxError not received`, xmlInput[i]) + } + } +} + +type allScalars struct { + True1 bool + True2 bool + False1 bool + False2 bool + Int int + Int8 int8 + Int16 int16 + Int32 int32 + Int64 int64 + Uint int + Uint8 uint8 + Uint16 uint16 + Uint32 uint32 + Uint64 uint64 + Uintptr uintptr + Float32 float32 + Float64 float64 + String string + PtrString *string +} + +var all = allScalars{ + True1: true, + True2: true, + False1: false, + False2: false, + Int: 1, + Int8: -2, + Int16: 3, + Int32: -4, + Int64: 5, + Uint: 6, + Uint8: 7, + Uint16: 8, + Uint32: 9, + Uint64: 10, + Uintptr: 11, + Float32: 13.0, + Float64: 14.0, + String: "15", + PtrString: &sixteen, +} + +var sixteen = "16" + +const testScalarsInput = ` + true + 1 + false + 0 + 1 + -2 + 3 + -4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12.0 + 13.0 + 14.0 + 15 + 16 +` + +func TestAllScalars(t *testing.T) { + var a allScalars + err := Unmarshal([]byte(testScalarsInput), &a) + + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(a, all) { + t.Errorf("have %+v want %+v", a, all) + } +} + +type item struct { + Field_a string +} + +func TestIssue569(t *testing.T) { + data := `abcd` + var i item + err := Unmarshal([]byte(data), &i) + + if err != nil || i.Field_a != "abcd" { + t.Fatal("Expecting abcd") + } +} + +func TestUnquotedAttrs(t *testing.T) { + data := "" + d := NewDecoder(strings.NewReader(data)) + d.Strict = false + token, err := d.Token() + if _, ok := err.(*SyntaxError); ok { + t.Errorf("Unexpected error: %v", err) + } + if token.(StartElement).Name.Local != "tag" { + t.Errorf("Unexpected tag name: %v", token.(StartElement).Name.Local) + } + attr := token.(StartElement).Attr[0] + if attr.Value != "azAZ09:-_" { + t.Errorf("Unexpected attribute value: %v", attr.Value) + } + if attr.Name.Local != "attr" { + t.Errorf("Unexpected attribute name: %v", attr.Name.Local) + } +} + +func TestValuelessAttrs(t *testing.T) { + tests := [][3]string{ + {"

    ", "p", "nowrap"}, + {"

    ", "p", "nowrap"}, + {"", "input", "checked"}, + {"", "input", "checked"}, + } + for _, test := range tests { + d := NewDecoder(strings.NewReader(test[0])) + d.Strict = false + token, err := d.Token() + if _, ok := err.(*SyntaxError); ok { + t.Errorf("Unexpected error: %v", err) + } + if token.(StartElement).Name.Local != test[1] { + t.Errorf("Unexpected tag name: %v", token.(StartElement).Name.Local) + } + attr := token.(StartElement).Attr[0] + if attr.Value != test[2] { + t.Errorf("Unexpected attribute value: %v", attr.Value) + } + if attr.Name.Local != test[2] { + t.Errorf("Unexpected attribute name: %v", attr.Name.Local) + } + } +} + +func TestCopyTokenCharData(t *testing.T) { + data := []byte("same data") + var tok1 Token = CharData(data) + tok2 := CopyToken(tok1) + if !reflect.DeepEqual(tok1, tok2) { + t.Error("CopyToken(CharData) != CharData") + } + data[1] = 'o' + if reflect.DeepEqual(tok1, tok2) { + t.Error("CopyToken(CharData) uses same buffer.") + } +} + +func TestCopyTokenStartElement(t *testing.T) { + elt := StartElement{Name{"", "hello"}, []Attr{{Name{"", "lang"}, "en"}}} + var tok1 Token = elt + tok2 := CopyToken(tok1) + if tok1.(StartElement).Attr[0].Value != "en" { + t.Error("CopyToken overwrote Attr[0]") + } + if !reflect.DeepEqual(tok1, tok2) { + t.Error("CopyToken(StartElement) != StartElement") + } + tok1.(StartElement).Attr[0] = Attr{Name{"", "lang"}, "de"} + if reflect.DeepEqual(tok1, tok2) { + t.Error("CopyToken(CharData) uses same buffer.") + } +} + +func TestSyntaxErrorLineNum(t *testing.T) { + testInput := "

    Foo

    \n\n

    Bar\n" + d := NewDecoder(strings.NewReader(testInput)) + var err error + for _, err = d.Token(); err == nil; _, err = d.Token() { + } + synerr, ok := err.(*SyntaxError) + if !ok { + t.Error("Expected SyntaxError.") + } + if synerr.Line != 3 { + t.Error("SyntaxError didn't have correct line number.") + } +} + +func TestTrailingRawToken(t *testing.T) { + input := ` ` + d := NewDecoder(strings.NewReader(input)) + var err error + for _, err = d.RawToken(); err == nil; _, err = d.RawToken() { + } + if err != io.EOF { + t.Fatalf("d.RawToken() = _, %v, want _, io.EOF", err) + } +} + +func TestTrailingToken(t *testing.T) { + input := ` ` + d := NewDecoder(strings.NewReader(input)) + var err error + for _, err = d.Token(); err == nil; _, err = d.Token() { + } + if err != io.EOF { + t.Fatalf("d.Token() = _, %v, want _, io.EOF", err) + } +} + +func TestEntityInsideCDATA(t *testing.T) { + input := `` + d := NewDecoder(strings.NewReader(input)) + var err error + for _, err = d.Token(); err == nil; _, err = d.Token() { + } + if err != io.EOF { + t.Fatalf("d.Token() = _, %v, want _, io.EOF", err) + } +} + +var characterTests = []struct { + in string + err string +}{ + {"\x12", "illegal character code U+0012"}, + {"\x0b", "illegal character code U+000B"}, + {"\xef\xbf\xbe", "illegal character code U+FFFE"}, + {"\r\n\x07", "illegal character code U+0007"}, + {"what's up", "expected attribute name in element"}, + {"&abc\x01;", "invalid character entity &abc (no semicolon)"}, + {"&\x01;", "invalid character entity & (no semicolon)"}, + {"&\xef\xbf\xbe;", "invalid character entity &\uFFFE;"}, + {"&hello;", "invalid character entity &hello;"}, +} + +func TestDisallowedCharacters(t *testing.T) { + + for i, tt := range characterTests { + d := NewDecoder(strings.NewReader(tt.in)) + var err error + + for err == nil { + _, err = d.Token() + } + synerr, ok := err.(*SyntaxError) + if !ok { + t.Fatalf("input %d d.Token() = _, %v, want _, *SyntaxError", i, err) + } + if synerr.Msg != tt.err { + t.Fatalf("input %d synerr.Msg wrong: want %q, got %q", i, tt.err, synerr.Msg) + } + } +} + +type procInstEncodingTest struct { + expect, got string +} + +var procInstTests = []struct { + input string + expect [2]string +}{ + {`version="1.0" encoding="utf-8"`, [2]string{"1.0", "utf-8"}}, + {`version="1.0" encoding='utf-8'`, [2]string{"1.0", "utf-8"}}, + {`version="1.0" encoding='utf-8' `, [2]string{"1.0", "utf-8"}}, + {`version="1.0" encoding=utf-8`, [2]string{"1.0", ""}}, + {`encoding="FOO" `, [2]string{"", "FOO"}}, +} + +func TestProcInstEncoding(t *testing.T) { + for _, test := range procInstTests { + if got := procInst("version", test.input); got != test.expect[0] { + t.Errorf("procInst(version, %q) = %q; want %q", test.input, got, test.expect[0]) + } + if got := procInst("encoding", test.input); got != test.expect[1] { + t.Errorf("procInst(encoding, %q) = %q; want %q", test.input, got, test.expect[1]) + } + } +} + +// Ensure that directives with comments include the complete +// text of any nested directives. + +var directivesWithCommentsInput = ` +]> +]> + --> --> []> +` + +var directivesWithCommentsTokens = []Token{ + CharData("\n"), + Directive(`DOCTYPE []`), + CharData("\n"), + Directive(`DOCTYPE []`), + CharData("\n"), + Directive(`DOCTYPE []`), + CharData("\n"), +} + +func TestDirectivesWithComments(t *testing.T) { + d := NewDecoder(strings.NewReader(directivesWithCommentsInput)) + + for i, want := range directivesWithCommentsTokens { + have, err := d.Token() + if err != nil { + t.Fatalf("token %d: unexpected error: %s", i, err) + } + if !reflect.DeepEqual(have, want) { + t.Errorf("token %d = %#v want %#v", i, have, want) + } + } +} + +// Writer whose Write method always returns an error. +type errWriter struct{} + +func (errWriter) Write(p []byte) (n int, err error) { return 0, fmt.Errorf("unwritable") } + +func TestEscapeTextIOErrors(t *testing.T) { + expectErr := "unwritable" + err := EscapeText(errWriter{}, []byte{'A'}) + + if err == nil || err.Error() != expectErr { + t.Errorf("have %v, want %v", err, expectErr) + } +} + +func TestEscapeTextInvalidChar(t *testing.T) { + input := []byte("A \x00 terminated string.") + expected := "A \uFFFD terminated string." + + buff := new(bytes.Buffer) + if err := EscapeText(buff, input); err != nil { + t.Fatalf("have %v, want nil", err) + } + text := buff.String() + + if text != expected { + t.Errorf("have %v, want %v", text, expected) + } +} + +func TestIssue5880(t *testing.T) { + type T []byte + data, err := Marshal(T{192, 168, 0, 1}) + if err != nil { + t.Errorf("Marshal error: %v", err) + } + if !utf8.Valid(data) { + t.Errorf("Marshal generated invalid UTF-8: %x", data) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/litmus_test_server.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/litmus_test_server.go new file mode 100644 index 0000000..514db5d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/litmus_test_server.go @@ -0,0 +1,94 @@ +// Copyright 2015 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 ignore + +/* +This program is a server for the WebDAV 'litmus' compliance test at +http://www.webdav.org/neon/litmus/ +To run the test: + +go run litmus_test_server.go + +and separately, from the downloaded litmus-xxx directory: + +make URL=http://localhost:9999/ check +*/ +package main + +import ( + "flag" + "fmt" + "log" + "net/http" + "net/url" + + "golang.org/x/net/webdav" +) + +var port = flag.Int("port", 9999, "server port") + +func main() { + flag.Parse() + log.SetFlags(0) + h := &webdav.Handler{ + FileSystem: webdav.NewMemFS(), + LockSystem: webdav.NewMemLS(), + Logger: func(r *http.Request, err error) { + litmus := r.Header.Get("X-Litmus") + if len(litmus) > 19 { + litmus = litmus[:16] + "..." + } + + switch r.Method { + case "COPY", "MOVE": + dst := "" + if u, err := url.Parse(r.Header.Get("Destination")); err == nil { + dst = u.Path + } + o := r.Header.Get("Overwrite") + log.Printf("%-20s%-10s%-30s%-30so=%-2s%v", litmus, r.Method, r.URL.Path, dst, o, err) + default: + log.Printf("%-20s%-10s%-30s%v", litmus, r.Method, r.URL.Path, err) + } + }, + } + + // The next line would normally be: + // http.Handle("/", h) + // but we wrap that HTTP handler h to cater for a special case. + // + // The propfind_invalid2 litmus test case expects an empty namespace prefix + // declaration to be an error. The FAQ in the webdav litmus test says: + // + // "What does the "propfind_invalid2" test check for?... + // + // If a request was sent with an XML body which included an empty namespace + // prefix declaration (xmlns:ns1=""), then the server must reject that with + // a "400 Bad Request" response, as it is invalid according to the XML + // Namespace specification." + // + // On the other hand, the Go standard library's encoding/xml package + // accepts an empty xmlns namespace, as per the discussion at + // https://github.com/golang/go/issues/8068 + // + // Empty namespaces seem disallowed in the second (2006) edition of the XML + // standard, but allowed in a later edition. The grammar differs between + // http://www.w3.org/TR/2006/REC-xml-names-20060816/#ns-decl and + // http://www.w3.org/TR/REC-xml-names/#dt-prefix + // + // Thus, we assume that the propfind_invalid2 test is obsolete, and + // hard-code the 400 Bad Request response that the test expects. + http.Handle("/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Header.Get("X-Litmus") == "props: 3 (propfind_invalid2)" { + http.Error(w, "400 Bad Request", http.StatusBadRequest) + return + } + h.ServeHTTP(w, r) + })) + + addr := fmt.Sprintf(":%d", *port) + log.Printf("Serving %v", addr) + log.Fatal(http.ListenAndServe(addr, nil)) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/lock.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/lock.go new file mode 100644 index 0000000..344ac5c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/lock.go @@ -0,0 +1,445 @@ +// 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 webdav + +import ( + "container/heap" + "errors" + "strconv" + "strings" + "sync" + "time" +) + +var ( + // ErrConfirmationFailed is returned by a LockSystem's Confirm method. + ErrConfirmationFailed = errors.New("webdav: confirmation failed") + // ErrForbidden is returned by a LockSystem's Unlock method. + ErrForbidden = errors.New("webdav: forbidden") + // ErrLocked is returned by a LockSystem's Create, Refresh and Unlock methods. + ErrLocked = errors.New("webdav: locked") + // ErrNoSuchLock is returned by a LockSystem's Refresh and Unlock methods. + ErrNoSuchLock = errors.New("webdav: no such lock") +) + +// Condition can match a WebDAV resource, based on a token or ETag. +// Exactly one of Token and ETag should be non-empty. +type Condition struct { + Not bool + Token string + ETag string +} + +// LockSystem manages access to a collection of named resources. The elements +// in a lock name are separated by slash ('/', U+002F) characters, regardless +// of host operating system convention. +type LockSystem interface { + // Confirm confirms that the caller can claim all of the locks specified by + // the given conditions, and that holding the union of all of those locks + // gives exclusive access to all of the named resources. Up to two resources + // can be named. Empty names are ignored. + // + // Exactly one of release and err will be non-nil. If release is non-nil, + // all of the requested locks are held until release is called. Calling + // release does not unlock the lock, in the WebDAV UNLOCK sense, but once + // Confirm has confirmed that a lock claim is valid, that lock cannot be + // Confirmed again until it has been released. + // + // If Confirm returns ErrConfirmationFailed then the Handler will continue + // to try any other set of locks presented (a WebDAV HTTP request can + // present more than one set of locks). If it returns any other non-nil + // error, the Handler will write a "500 Internal Server Error" HTTP status. + Confirm(now time.Time, name0, name1 string, conditions ...Condition) (release func(), err error) + + // Create creates a lock with the given depth, duration, owner and root + // (name). The depth will either be negative (meaning infinite) or zero. + // + // If Create returns ErrLocked then the Handler will write a "423 Locked" + // HTTP status. If it returns any other non-nil error, the Handler will + // write a "500 Internal Server Error" HTTP status. + // + // See http://www.webdav.org/specs/rfc4918.html#rfc.section.9.10.6 for + // when to use each error. + // + // The token returned identifies the created lock. It should be an absolute + // URI as defined by RFC 3986, Section 4.3. In particular, it should not + // contain whitespace. + Create(now time.Time, details LockDetails) (token string, err error) + + // Refresh refreshes the lock with the given token. + // + // If Refresh returns ErrLocked then the Handler will write a "423 Locked" + // HTTP Status. If Refresh returns ErrNoSuchLock then the Handler will write + // a "412 Precondition Failed" HTTP Status. If it returns any other non-nil + // error, the Handler will write a "500 Internal Server Error" HTTP status. + // + // See http://www.webdav.org/specs/rfc4918.html#rfc.section.9.10.6 for + // when to use each error. + Refresh(now time.Time, token string, duration time.Duration) (LockDetails, error) + + // Unlock unlocks the lock with the given token. + // + // If Unlock returns ErrForbidden then the Handler will write a "403 + // Forbidden" HTTP Status. If Unlock returns ErrLocked then the Handler + // will write a "423 Locked" HTTP status. If Unlock returns ErrNoSuchLock + // then the Handler will write a "409 Conflict" HTTP Status. If it returns + // any other non-nil error, the Handler will write a "500 Internal Server + // Error" HTTP status. + // + // See http://www.webdav.org/specs/rfc4918.html#rfc.section.9.11.1 for + // when to use each error. + Unlock(now time.Time, token string) error +} + +// LockDetails are a lock's metadata. +type LockDetails struct { + // Root is the root resource name being locked. For a zero-depth lock, the + // root is the only resource being locked. + Root string + // Duration is the lock timeout. A negative duration means infinite. + Duration time.Duration + // OwnerXML is the verbatim XML given in a LOCK HTTP request. + // + // TODO: does the "verbatim" nature play well with XML namespaces? + // Does the OwnerXML field need to have more structure? See + // https://codereview.appspot.com/175140043/#msg2 + OwnerXML string + // ZeroDepth is whether the lock has zero depth. If it does not have zero + // depth, it has infinite depth. + ZeroDepth bool +} + +// NewMemLS returns a new in-memory LockSystem. +func NewMemLS() LockSystem { + return &memLS{ + byName: make(map[string]*memLSNode), + byToken: make(map[string]*memLSNode), + gen: uint64(time.Now().Unix()), + } +} + +type memLS struct { + mu sync.Mutex + byName map[string]*memLSNode + byToken map[string]*memLSNode + gen uint64 + // byExpiry only contains those nodes whose LockDetails have a finite + // Duration and are yet to expire. + byExpiry byExpiry +} + +func (m *memLS) nextToken() string { + m.gen++ + return strconv.FormatUint(m.gen, 10) +} + +func (m *memLS) collectExpiredNodes(now time.Time) { + for len(m.byExpiry) > 0 { + if now.Before(m.byExpiry[0].expiry) { + break + } + m.remove(m.byExpiry[0]) + } +} + +func (m *memLS) Confirm(now time.Time, name0, name1 string, conditions ...Condition) (func(), error) { + m.mu.Lock() + defer m.mu.Unlock() + m.collectExpiredNodes(now) + + var n0, n1 *memLSNode + if name0 != "" { + if n0 = m.lookup(slashClean(name0), conditions...); n0 == nil { + return nil, ErrConfirmationFailed + } + } + if name1 != "" { + if n1 = m.lookup(slashClean(name1), conditions...); n1 == nil { + return nil, ErrConfirmationFailed + } + } + + // Don't hold the same node twice. + if n1 == n0 { + n1 = nil + } + + if n0 != nil { + m.hold(n0) + } + if n1 != nil { + m.hold(n1) + } + return func() { + m.mu.Lock() + defer m.mu.Unlock() + if n1 != nil { + m.unhold(n1) + } + if n0 != nil { + m.unhold(n0) + } + }, nil +} + +// lookup returns the node n that locks the named resource, provided that n +// matches at least one of the given conditions and that lock isn't held by +// another party. Otherwise, it returns nil. +// +// n may be a parent of the named resource, if n is an infinite depth lock. +func (m *memLS) lookup(name string, conditions ...Condition) (n *memLSNode) { + // TODO: support Condition.Not and Condition.ETag. + for _, c := range conditions { + n = m.byToken[c.Token] + if n == nil || n.held { + continue + } + if name == n.details.Root { + return n + } + if n.details.ZeroDepth { + continue + } + if n.details.Root == "/" || strings.HasPrefix(name, n.details.Root+"/") { + return n + } + } + return nil +} + +func (m *memLS) hold(n *memLSNode) { + if n.held { + panic("webdav: memLS inconsistent held state") + } + n.held = true + if n.details.Duration >= 0 && n.byExpiryIndex >= 0 { + heap.Remove(&m.byExpiry, n.byExpiryIndex) + } +} + +func (m *memLS) unhold(n *memLSNode) { + if !n.held { + panic("webdav: memLS inconsistent held state") + } + n.held = false + if n.details.Duration >= 0 { + heap.Push(&m.byExpiry, n) + } +} + +func (m *memLS) Create(now time.Time, details LockDetails) (string, error) { + m.mu.Lock() + defer m.mu.Unlock() + m.collectExpiredNodes(now) + details.Root = slashClean(details.Root) + + if !m.canCreate(details.Root, details.ZeroDepth) { + return "", ErrLocked + } + n := m.create(details.Root) + n.token = m.nextToken() + m.byToken[n.token] = n + n.details = details + if n.details.Duration >= 0 { + n.expiry = now.Add(n.details.Duration) + heap.Push(&m.byExpiry, n) + } + return n.token, nil +} + +func (m *memLS) Refresh(now time.Time, token string, duration time.Duration) (LockDetails, error) { + m.mu.Lock() + defer m.mu.Unlock() + m.collectExpiredNodes(now) + + n := m.byToken[token] + if n == nil { + return LockDetails{}, ErrNoSuchLock + } + if n.held { + return LockDetails{}, ErrLocked + } + if n.byExpiryIndex >= 0 { + heap.Remove(&m.byExpiry, n.byExpiryIndex) + } + n.details.Duration = duration + if n.details.Duration >= 0 { + n.expiry = now.Add(n.details.Duration) + heap.Push(&m.byExpiry, n) + } + return n.details, nil +} + +func (m *memLS) Unlock(now time.Time, token string) error { + m.mu.Lock() + defer m.mu.Unlock() + m.collectExpiredNodes(now) + + n := m.byToken[token] + if n == nil { + return ErrNoSuchLock + } + if n.held { + return ErrLocked + } + m.remove(n) + return nil +} + +func (m *memLS) canCreate(name string, zeroDepth bool) bool { + return walkToRoot(name, func(name0 string, first bool) bool { + n := m.byName[name0] + if n == nil { + return true + } + if first { + if n.token != "" { + // The target node is already locked. + return false + } + if !zeroDepth { + // The requested lock depth is infinite, and the fact that n exists + // (n != nil) means that a descendent of the target node is locked. + return false + } + } else if n.token != "" && !n.details.ZeroDepth { + // An ancestor of the target node is locked with infinite depth. + return false + } + return true + }) +} + +func (m *memLS) create(name string) (ret *memLSNode) { + walkToRoot(name, func(name0 string, first bool) bool { + n := m.byName[name0] + if n == nil { + n = &memLSNode{ + details: LockDetails{ + Root: name0, + }, + byExpiryIndex: -1, + } + m.byName[name0] = n + } + n.refCount++ + if first { + ret = n + } + return true + }) + return ret +} + +func (m *memLS) remove(n *memLSNode) { + delete(m.byToken, n.token) + n.token = "" + walkToRoot(n.details.Root, func(name0 string, first bool) bool { + x := m.byName[name0] + x.refCount-- + if x.refCount == 0 { + delete(m.byName, name0) + } + return true + }) + if n.byExpiryIndex >= 0 { + heap.Remove(&m.byExpiry, n.byExpiryIndex) + } +} + +func walkToRoot(name string, f func(name0 string, first bool) bool) bool { + for first := true; ; first = false { + if !f(name, first) { + return false + } + if name == "/" { + break + } + name = name[:strings.LastIndex(name, "/")] + if name == "" { + name = "/" + } + } + return true +} + +type memLSNode struct { + // details are the lock metadata. Even if this node's name is not explicitly locked, + // details.Root will still equal the node's name. + details LockDetails + // token is the unique identifier for this node's lock. An empty token means that + // this node is not explicitly locked. + token string + // refCount is the number of self-or-descendent nodes that are explicitly locked. + refCount int + // expiry is when this node's lock expires. + expiry time.Time + // byExpiryIndex is the index of this node in memLS.byExpiry. It is -1 + // if this node does not expire, or has expired. + byExpiryIndex int + // held is whether this node's lock is actively held by a Confirm call. + held bool +} + +type byExpiry []*memLSNode + +func (b *byExpiry) Len() int { + return len(*b) +} + +func (b *byExpiry) Less(i, j int) bool { + return (*b)[i].expiry.Before((*b)[j].expiry) +} + +func (b *byExpiry) Swap(i, j int) { + (*b)[i], (*b)[j] = (*b)[j], (*b)[i] + (*b)[i].byExpiryIndex = i + (*b)[j].byExpiryIndex = j +} + +func (b *byExpiry) Push(x interface{}) { + n := x.(*memLSNode) + n.byExpiryIndex = len(*b) + *b = append(*b, n) +} + +func (b *byExpiry) Pop() interface{} { + i := len(*b) - 1 + n := (*b)[i] + (*b)[i] = nil + n.byExpiryIndex = -1 + *b = (*b)[:i] + return n +} + +const infiniteTimeout = -1 + +// parseTimeout parses the Timeout HTTP header, as per section 10.7. If s is +// empty, an infiniteTimeout is returned. +func parseTimeout(s string) (time.Duration, error) { + if s == "" { + return infiniteTimeout, nil + } + if i := strings.IndexByte(s, ','); i >= 0 { + s = s[:i] + } + s = strings.TrimSpace(s) + if s == "Infinite" { + return infiniteTimeout, nil + } + const pre = "Second-" + if !strings.HasPrefix(s, pre) { + return 0, errInvalidTimeout + } + s = s[len(pre):] + if s == "" || s[0] < '0' || '9' < s[0] { + return 0, errInvalidTimeout + } + n, err := strconv.ParseInt(s, 10, 64) + if err != nil || 1<<32-1 < n { + return 0, errInvalidTimeout + } + return time.Duration(n) * time.Second, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/lock_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/lock_test.go new file mode 100644 index 0000000..5cf14cd --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/lock_test.go @@ -0,0 +1,731 @@ +// 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 webdav + +import ( + "fmt" + "math/rand" + "path" + "reflect" + "sort" + "strconv" + "strings" + "testing" + "time" +) + +func TestWalkToRoot(t *testing.T) { + testCases := []struct { + name string + want []string + }{{ + "/a/b/c/d", + []string{ + "/a/b/c/d", + "/a/b/c", + "/a/b", + "/a", + "/", + }, + }, { + "/a", + []string{ + "/a", + "/", + }, + }, { + "/", + []string{ + "/", + }, + }} + + for _, tc := range testCases { + var got []string + if !walkToRoot(tc.name, func(name0 string, first bool) bool { + if first != (len(got) == 0) { + t.Errorf("name=%q: first=%t but len(got)==%d", tc.name, first, len(got)) + return false + } + got = append(got, name0) + return true + }) { + continue + } + if !reflect.DeepEqual(got, tc.want) { + t.Errorf("name=%q:\ngot %q\nwant %q", tc.name, got, tc.want) + } + } +} + +var lockTestDurations = []time.Duration{ + infiniteTimeout, // infiniteTimeout means to never expire. + 0, // A zero duration means to expire immediately. + 100 * time.Hour, // A very large duration will not expire in these tests. +} + +// lockTestNames are the names of a set of mutually compatible locks. For each +// name fragment: +// - _ means no explicit lock. +// - i means an infinite-depth lock, +// - z means a zero-depth lock, +var lockTestNames = []string{ + "/_/_/_/_/z", + "/_/_/i", + "/_/z", + "/_/z/i", + "/_/z/z", + "/_/z/_/i", + "/_/z/_/z", + "/i", + "/z", + "/z/_/i", + "/z/_/z", +} + +func lockTestZeroDepth(name string) bool { + switch name[len(name)-1] { + case 'i': + return false + case 'z': + return true + } + panic(fmt.Sprintf("lock name %q did not end with 'i' or 'z'", name)) +} + +func TestMemLSCanCreate(t *testing.T) { + now := time.Unix(0, 0) + m := NewMemLS().(*memLS) + + for _, name := range lockTestNames { + _, err := m.Create(now, LockDetails{ + Root: name, + Duration: infiniteTimeout, + ZeroDepth: lockTestZeroDepth(name), + }) + if err != nil { + t.Fatalf("creating lock for %q: %v", name, err) + } + } + + wantCanCreate := func(name string, zeroDepth bool) bool { + for _, n := range lockTestNames { + switch { + case n == name: + // An existing lock has the same name as the proposed lock. + return false + case strings.HasPrefix(n, name): + // An existing lock would be a child of the proposed lock, + // which conflicts if the proposed lock has infinite depth. + if !zeroDepth { + return false + } + case strings.HasPrefix(name, n): + // An existing lock would be an ancestor of the proposed lock, + // which conflicts if the ancestor has infinite depth. + if n[len(n)-1] == 'i' { + return false + } + } + } + return true + } + + var check func(int, string) + check = func(recursion int, name string) { + for _, zeroDepth := range []bool{false, true} { + got := m.canCreate(name, zeroDepth) + want := wantCanCreate(name, zeroDepth) + if got != want { + t.Errorf("canCreate name=%q zeroDepth=%t: got %t, want %t", name, zeroDepth, got, want) + } + } + if recursion == 6 { + return + } + if name != "/" { + name += "/" + } + for _, c := range "_iz" { + check(recursion+1, name+string(c)) + } + } + check(0, "/") +} + +func TestMemLSLookup(t *testing.T) { + now := time.Unix(0, 0) + m := NewMemLS().(*memLS) + + badToken := m.nextToken() + t.Logf("badToken=%q", badToken) + + for _, name := range lockTestNames { + token, err := m.Create(now, LockDetails{ + Root: name, + Duration: infiniteTimeout, + ZeroDepth: lockTestZeroDepth(name), + }) + if err != nil { + t.Fatalf("creating lock for %q: %v", name, err) + } + t.Logf("%-15q -> node=%p token=%q", name, m.byName[name], token) + } + + baseNames := append([]string{"/a", "/b/c"}, lockTestNames...) + for _, baseName := range baseNames { + for _, suffix := range []string{"", "/0", "/1/2/3"} { + name := baseName + suffix + + goodToken := "" + base := m.byName[baseName] + if base != nil && (suffix == "" || !lockTestZeroDepth(baseName)) { + goodToken = base.token + } + + for _, token := range []string{badToken, goodToken} { + if token == "" { + continue + } + + got := m.lookup(name, Condition{Token: token}) + want := base + if token == badToken { + want = nil + } + if got != want { + t.Errorf("name=%-20qtoken=%q (bad=%t): got %p, want %p", + name, token, token == badToken, got, want) + } + } + } + } +} + +func TestMemLSConfirm(t *testing.T) { + now := time.Unix(0, 0) + m := NewMemLS().(*memLS) + alice, err := m.Create(now, LockDetails{ + Root: "/alice", + Duration: infiniteTimeout, + ZeroDepth: false, + }) + tweedle, err := m.Create(now, LockDetails{ + Root: "/tweedle", + Duration: infiniteTimeout, + ZeroDepth: false, + }) + if err != nil { + t.Fatalf("Create: %v", err) + } + if err := m.consistent(); err != nil { + t.Fatalf("Create: inconsistent state: %v", err) + } + + // Test a mismatch between name and condition. + _, err = m.Confirm(now, "/tweedle/dee", "", Condition{Token: alice}) + if err != ErrConfirmationFailed { + t.Fatalf("Confirm (mismatch): got %v, want ErrConfirmationFailed", err) + } + if err := m.consistent(); err != nil { + t.Fatalf("Confirm (mismatch): inconsistent state: %v", err) + } + + // Test two names (that fall under the same lock) in the one Confirm call. + release, err := m.Confirm(now, "/tweedle/dee", "/tweedle/dum", Condition{Token: tweedle}) + if err != nil { + t.Fatalf("Confirm (twins): %v", err) + } + if err := m.consistent(); err != nil { + t.Fatalf("Confirm (twins): inconsistent state: %v", err) + } + release() + if err := m.consistent(); err != nil { + t.Fatalf("release (twins): inconsistent state: %v", err) + } + + // Test the same two names in overlapping Confirm / release calls. + releaseDee, err := m.Confirm(now, "/tweedle/dee", "", Condition{Token: tweedle}) + if err != nil { + t.Fatalf("Confirm (sequence #0): %v", err) + } + if err := m.consistent(); err != nil { + t.Fatalf("Confirm (sequence #0): inconsistent state: %v", err) + } + + _, err = m.Confirm(now, "/tweedle/dum", "", Condition{Token: tweedle}) + if err != ErrConfirmationFailed { + t.Fatalf("Confirm (sequence #1): got %v, want ErrConfirmationFailed", err) + } + if err := m.consistent(); err != nil { + t.Fatalf("Confirm (sequence #1): inconsistent state: %v", err) + } + + releaseDee() + if err := m.consistent(); err != nil { + t.Fatalf("release (sequence #2): inconsistent state: %v", err) + } + + releaseDum, err := m.Confirm(now, "/tweedle/dum", "", Condition{Token: tweedle}) + if err != nil { + t.Fatalf("Confirm (sequence #3): %v", err) + } + if err := m.consistent(); err != nil { + t.Fatalf("Confirm (sequence #3): inconsistent state: %v", err) + } + + // Test that you can't unlock a held lock. + err = m.Unlock(now, tweedle) + if err != ErrLocked { + t.Fatalf("Unlock (sequence #4): got %v, want ErrLocked", err) + } + + releaseDum() + if err := m.consistent(); err != nil { + t.Fatalf("release (sequence #5): inconsistent state: %v", err) + } + + err = m.Unlock(now, tweedle) + if err != nil { + t.Fatalf("Unlock (sequence #6): %v", err) + } + if err := m.consistent(); err != nil { + t.Fatalf("Unlock (sequence #6): inconsistent state: %v", err) + } +} + +func TestMemLSNonCanonicalRoot(t *testing.T) { + now := time.Unix(0, 0) + m := NewMemLS().(*memLS) + token, err := m.Create(now, LockDetails{ + Root: "/foo/./bar//", + Duration: 1 * time.Second, + }) + if err != nil { + t.Fatalf("Create: %v", err) + } + if err := m.consistent(); err != nil { + t.Fatalf("Create: inconsistent state: %v", err) + } + if err := m.Unlock(now, token); err != nil { + t.Fatalf("Unlock: %v", err) + } + if err := m.consistent(); err != nil { + t.Fatalf("Unlock: inconsistent state: %v", err) + } +} + +func TestMemLSExpiry(t *testing.T) { + m := NewMemLS().(*memLS) + testCases := []string{ + "setNow 0", + "create /a.5", + "want /a.5", + "create /c.6", + "want /a.5 /c.6", + "create /a/b.7", + "want /a.5 /a/b.7 /c.6", + "setNow 4", + "want /a.5 /a/b.7 /c.6", + "setNow 5", + "want /a/b.7 /c.6", + "setNow 6", + "want /a/b.7", + "setNow 7", + "want ", + "setNow 8", + "want ", + "create /a.12", + "create /b.13", + "create /c.15", + "create /a/d.16", + "want /a.12 /a/d.16 /b.13 /c.15", + "refresh /a.14", + "want /a.14 /a/d.16 /b.13 /c.15", + "setNow 12", + "want /a.14 /a/d.16 /b.13 /c.15", + "setNow 13", + "want /a.14 /a/d.16 /c.15", + "setNow 14", + "want /a/d.16 /c.15", + "refresh /a/d.20", + "refresh /c.20", + "want /a/d.20 /c.20", + "setNow 20", + "want ", + } + + tokens := map[string]string{} + zTime := time.Unix(0, 0) + now := zTime + for i, tc := range testCases { + j := strings.IndexByte(tc, ' ') + if j < 0 { + t.Fatalf("test case #%d %q: invalid command", i, tc) + } + op, arg := tc[:j], tc[j+1:] + switch op { + default: + t.Fatalf("test case #%d %q: invalid operation %q", i, tc, op) + + case "create", "refresh": + parts := strings.Split(arg, ".") + if len(parts) != 2 { + t.Fatalf("test case #%d %q: invalid create", i, tc) + } + root := parts[0] + d, err := strconv.Atoi(parts[1]) + if err != nil { + t.Fatalf("test case #%d %q: invalid duration", i, tc) + } + dur := time.Unix(0, 0).Add(time.Duration(d) * time.Second).Sub(now) + + switch op { + case "create": + token, err := m.Create(now, LockDetails{ + Root: root, + Duration: dur, + ZeroDepth: true, + }) + if err != nil { + t.Fatalf("test case #%d %q: Create: %v", i, tc, err) + } + tokens[root] = token + + case "refresh": + token := tokens[root] + if token == "" { + t.Fatalf("test case #%d %q: no token for %q", i, tc, root) + } + got, err := m.Refresh(now, token, dur) + if err != nil { + t.Fatalf("test case #%d %q: Refresh: %v", i, tc, err) + } + want := LockDetails{ + Root: root, + Duration: dur, + ZeroDepth: true, + } + if got != want { + t.Fatalf("test case #%d %q:\ngot %v\nwant %v", i, tc, got, want) + } + } + + case "setNow": + d, err := strconv.Atoi(arg) + if err != nil { + t.Fatalf("test case #%d %q: invalid duration", i, tc) + } + now = time.Unix(0, 0).Add(time.Duration(d) * time.Second) + + case "want": + m.mu.Lock() + m.collectExpiredNodes(now) + got := make([]string, 0, len(m.byToken)) + for _, n := range m.byToken { + got = append(got, fmt.Sprintf("%s.%d", + n.details.Root, n.expiry.Sub(zTime)/time.Second)) + } + m.mu.Unlock() + sort.Strings(got) + want := []string{} + if arg != "" { + want = strings.Split(arg, " ") + } + if !reflect.DeepEqual(got, want) { + t.Fatalf("test case #%d %q:\ngot %q\nwant %q", i, tc, got, want) + } + } + + if err := m.consistent(); err != nil { + t.Fatalf("test case #%d %q: inconsistent state: %v", i, tc, err) + } + } +} + +func TestMemLS(t *testing.T) { + now := time.Unix(0, 0) + m := NewMemLS().(*memLS) + rng := rand.New(rand.NewSource(0)) + tokens := map[string]string{} + nConfirm, nCreate, nRefresh, nUnlock := 0, 0, 0, 0 + const N = 2000 + + for i := 0; i < N; i++ { + name := lockTestNames[rng.Intn(len(lockTestNames))] + duration := lockTestDurations[rng.Intn(len(lockTestDurations))] + confirmed, unlocked := false, false + + // If the name was already locked, we randomly confirm/release, refresh + // or unlock it. Otherwise, we create a lock. + token := tokens[name] + if token != "" { + switch rng.Intn(3) { + case 0: + confirmed = true + nConfirm++ + release, err := m.Confirm(now, name, "", Condition{Token: token}) + if err != nil { + t.Fatalf("iteration #%d: Confirm %q: %v", i, name, err) + } + if err := m.consistent(); err != nil { + t.Fatalf("iteration #%d: inconsistent state: %v", i, err) + } + release() + + case 1: + nRefresh++ + if _, err := m.Refresh(now, token, duration); err != nil { + t.Fatalf("iteration #%d: Refresh %q: %v", i, name, err) + } + + case 2: + unlocked = true + nUnlock++ + if err := m.Unlock(now, token); err != nil { + t.Fatalf("iteration #%d: Unlock %q: %v", i, name, err) + } + } + + } else { + nCreate++ + var err error + token, err = m.Create(now, LockDetails{ + Root: name, + Duration: duration, + ZeroDepth: lockTestZeroDepth(name), + }) + if err != nil { + t.Fatalf("iteration #%d: Create %q: %v", i, name, err) + } + } + + if !confirmed { + if duration == 0 || unlocked { + // A zero-duration lock should expire immediately and is + // effectively equivalent to being unlocked. + tokens[name] = "" + } else { + tokens[name] = token + } + } + + if err := m.consistent(); err != nil { + t.Fatalf("iteration #%d: inconsistent state: %v", i, err) + } + } + + if nConfirm < N/10 { + t.Fatalf("too few Confirm calls: got %d, want >= %d", nConfirm, N/10) + } + if nCreate < N/10 { + t.Fatalf("too few Create calls: got %d, want >= %d", nCreate, N/10) + } + if nRefresh < N/10 { + t.Fatalf("too few Refresh calls: got %d, want >= %d", nRefresh, N/10) + } + if nUnlock < N/10 { + t.Fatalf("too few Unlock calls: got %d, want >= %d", nUnlock, N/10) + } +} + +func (m *memLS) consistent() error { + m.mu.Lock() + defer m.mu.Unlock() + + // If m.byName is non-empty, then it must contain an entry for the root "/", + // and its refCount should equal the number of locked nodes. + if len(m.byName) > 0 { + n := m.byName["/"] + if n == nil { + return fmt.Errorf(`non-empty m.byName does not contain the root "/"`) + } + if n.refCount != len(m.byToken) { + return fmt.Errorf("root node refCount=%d, differs from len(m.byToken)=%d", n.refCount, len(m.byToken)) + } + } + + for name, n := range m.byName { + // The map keys should be consistent with the node's copy of the key. + if n.details.Root != name { + return fmt.Errorf("node name %q != byName map key %q", n.details.Root, name) + } + + // A name must be clean, and start with a "/". + if len(name) == 0 || name[0] != '/' { + return fmt.Errorf(`node name %q does not start with "/"`, name) + } + if name != path.Clean(name) { + return fmt.Errorf(`node name %q is not clean`, name) + } + + // A node's refCount should be positive. + if n.refCount <= 0 { + return fmt.Errorf("non-positive refCount for node at name %q", name) + } + + // A node's refCount should be the number of self-or-descendents that + // are locked (i.e. have a non-empty token). + var list []string + for name0, n0 := range m.byName { + // All of lockTestNames' name fragments are one byte long: '_', 'i' or 'z', + // so strings.HasPrefix is equivalent to self-or-descendent name match. + // We don't have to worry about "/foo/bar" being a false positive match + // for "/foo/b". + if strings.HasPrefix(name0, name) && n0.token != "" { + list = append(list, name0) + } + } + if n.refCount != len(list) { + sort.Strings(list) + return fmt.Errorf("node at name %q has refCount %d but locked self-or-descendents are %q (len=%d)", + name, n.refCount, list, len(list)) + } + + // A node n is in m.byToken if it has a non-empty token. + if n.token != "" { + if _, ok := m.byToken[n.token]; !ok { + return fmt.Errorf("node at name %q has token %q but not in m.byToken", name, n.token) + } + } + + // A node n is in m.byExpiry if it has a non-negative byExpiryIndex. + if n.byExpiryIndex >= 0 { + if n.byExpiryIndex >= len(m.byExpiry) { + return fmt.Errorf("node at name %q has byExpiryIndex %d but m.byExpiry has length %d", name, n.byExpiryIndex, len(m.byExpiry)) + } + if n != m.byExpiry[n.byExpiryIndex] { + return fmt.Errorf("node at name %q has byExpiryIndex %d but that indexes a different node", name, n.byExpiryIndex) + } + } + } + + for token, n := range m.byToken { + // The map keys should be consistent with the node's copy of the key. + if n.token != token { + return fmt.Errorf("node token %q != byToken map key %q", n.token, token) + } + + // Every node in m.byToken is in m.byName. + if _, ok := m.byName[n.details.Root]; !ok { + return fmt.Errorf("node at name %q in m.byToken but not in m.byName", n.details.Root) + } + } + + for i, n := range m.byExpiry { + // The slice indices should be consistent with the node's copy of the index. + if n.byExpiryIndex != i { + return fmt.Errorf("node byExpiryIndex %d != byExpiry slice index %d", n.byExpiryIndex, i) + } + + // Every node in m.byExpiry is in m.byName. + if _, ok := m.byName[n.details.Root]; !ok { + return fmt.Errorf("node at name %q in m.byExpiry but not in m.byName", n.details.Root) + } + + // No node in m.byExpiry should be held. + if n.held { + return fmt.Errorf("node at name %q in m.byExpiry is held", n.details.Root) + } + } + return nil +} + +func TestParseTimeout(t *testing.T) { + testCases := []struct { + s string + want time.Duration + wantErr error + }{{ + "", + infiniteTimeout, + nil, + }, { + "Infinite", + infiniteTimeout, + nil, + }, { + "Infinitesimal", + 0, + errInvalidTimeout, + }, { + "infinite", + 0, + errInvalidTimeout, + }, { + "Second-0", + 0 * time.Second, + nil, + }, { + "Second-123", + 123 * time.Second, + nil, + }, { + " Second-456 ", + 456 * time.Second, + nil, + }, { + "Second-4100000000", + 4100000000 * time.Second, + nil, + }, { + "junk", + 0, + errInvalidTimeout, + }, { + "Second-", + 0, + errInvalidTimeout, + }, { + "Second--1", + 0, + errInvalidTimeout, + }, { + "Second--123", + 0, + errInvalidTimeout, + }, { + "Second-+123", + 0, + errInvalidTimeout, + }, { + "Second-0x123", + 0, + errInvalidTimeout, + }, { + "second-123", + 0, + errInvalidTimeout, + }, { + "Second-4294967295", + 4294967295 * time.Second, + nil, + }, { + // Section 10.7 says that "The timeout value for TimeType "Second" + // must not be greater than 2^32-1." + "Second-4294967296", + 0, + errInvalidTimeout, + }, { + // This test case comes from section 9.10.9 of the spec. It says, + // + // "In this request, the client has specified that it desires an + // infinite-length lock, if available, otherwise a timeout of 4.1 + // billion seconds, if available." + // + // The Go WebDAV package always supports infinite length locks, + // and ignores the fallback after the comma. + "Infinite, Second-4100000000", + infiniteTimeout, + nil, + }} + + for _, tc := range testCases { + got, gotErr := parseTimeout(tc.s) + if got != tc.want || gotErr != tc.wantErr { + t.Errorf("parsing %q:\ngot %v, %v\nwant %v, %v", tc.s, got, gotErr, tc.want, tc.wantErr) + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/prop.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/prop.go new file mode 100644 index 0000000..e36a3b3 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/prop.go @@ -0,0 +1,418 @@ +// Copyright 2015 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 webdav + +import ( + "bytes" + "encoding/xml" + "fmt" + "io" + "mime" + "net/http" + "os" + "path/filepath" + "strconv" + + "golang.org/x/net/context" +) + +// Proppatch describes a property update instruction as defined in RFC 4918. +// See http://www.webdav.org/specs/rfc4918.html#METHOD_PROPPATCH +type Proppatch struct { + // Remove specifies whether this patch removes properties. If it does not + // remove them, it sets them. + Remove bool + // Props contains the properties to be set or removed. + Props []Property +} + +// Propstat describes a XML propstat element as defined in RFC 4918. +// See http://www.webdav.org/specs/rfc4918.html#ELEMENT_propstat +type Propstat struct { + // Props contains the properties for which Status applies. + Props []Property + + // Status defines the HTTP status code of the properties in Prop. + // Allowed values include, but are not limited to the WebDAV status + // code extensions for HTTP/1.1. + // http://www.webdav.org/specs/rfc4918.html#status.code.extensions.to.http11 + Status int + + // XMLError contains the XML representation of the optional error element. + // XML content within this field must not rely on any predefined + // namespace declarations or prefixes. If empty, the XML error element + // is omitted. + XMLError string + + // ResponseDescription contains the contents of the optional + // responsedescription field. If empty, the XML element is omitted. + ResponseDescription string +} + +// makePropstats returns a slice containing those of x and y whose Props slice +// is non-empty. If both are empty, it returns a slice containing an otherwise +// zero Propstat whose HTTP status code is 200 OK. +func makePropstats(x, y Propstat) []Propstat { + pstats := make([]Propstat, 0, 2) + if len(x.Props) != 0 { + pstats = append(pstats, x) + } + if len(y.Props) != 0 { + pstats = append(pstats, y) + } + if len(pstats) == 0 { + pstats = append(pstats, Propstat{ + Status: http.StatusOK, + }) + } + return pstats +} + +// DeadPropsHolder holds the dead properties of a resource. +// +// Dead properties are those properties that are explicitly defined. In +// comparison, live properties, such as DAV:getcontentlength, are implicitly +// defined by the underlying resource, and cannot be explicitly overridden or +// removed. See the Terminology section of +// http://www.webdav.org/specs/rfc4918.html#rfc.section.3 +// +// There is a whitelist of the names of live properties. This package handles +// all live properties, and will only pass non-whitelisted names to the Patch +// method of DeadPropsHolder implementations. +type DeadPropsHolder interface { + // DeadProps returns a copy of the dead properties held. + DeadProps() (map[xml.Name]Property, error) + + // Patch patches the dead properties held. + // + // Patching is atomic; either all or no patches succeed. It returns (nil, + // non-nil) if an internal server error occurred, otherwise the Propstats + // collectively contain one Property for each proposed patch Property. If + // all patches succeed, Patch returns a slice of length one and a Propstat + // element with a 200 OK HTTP status code. If none succeed, for reasons + // other than an internal server error, no Propstat has status 200 OK. + // + // For more details on when various HTTP status codes apply, see + // http://www.webdav.org/specs/rfc4918.html#PROPPATCH-status + Patch([]Proppatch) ([]Propstat, error) +} + +// liveProps contains all supported, protected DAV: properties. +var liveProps = map[xml.Name]struct { + // findFn implements the propfind function of this property. If nil, + // it indicates a hidden property. + findFn func(context.Context, FileSystem, LockSystem, string, os.FileInfo) (string, error) + // dir is true if the property applies to directories. + dir bool +}{ + {Space: "DAV:", Local: "resourcetype"}: { + findFn: findResourceType, + dir: true, + }, + {Space: "DAV:", Local: "displayname"}: { + findFn: findDisplayName, + dir: true, + }, + {Space: "DAV:", Local: "getcontentlength"}: { + findFn: findContentLength, + dir: false, + }, + {Space: "DAV:", Local: "getlastmodified"}: { + findFn: findLastModified, + // http://webdav.org/specs/rfc4918.html#PROPERTY_getlastmodified + // suggests that getlastmodified should only apply to GETable + // resources, and this package does not support GET on directories. + // + // Nonetheless, some WebDAV clients expect child directories to be + // sortable by getlastmodified date, so this value is true, not false. + // See golang.org/issue/15334. + dir: true, + }, + {Space: "DAV:", Local: "creationdate"}: { + findFn: nil, + dir: false, + }, + {Space: "DAV:", Local: "getcontentlanguage"}: { + findFn: nil, + dir: false, + }, + {Space: "DAV:", Local: "getcontenttype"}: { + findFn: findContentType, + dir: false, + }, + {Space: "DAV:", Local: "getetag"}: { + findFn: findETag, + // findETag implements ETag as the concatenated hex values of a file's + // modification time and size. This is not a reliable synchronization + // mechanism for directories, so we do not advertise getetag for DAV + // collections. + dir: false, + }, + + // TODO: The lockdiscovery property requires LockSystem to list the + // active locks on a resource. + {Space: "DAV:", Local: "lockdiscovery"}: {}, + {Space: "DAV:", Local: "supportedlock"}: { + findFn: findSupportedLock, + dir: true, + }, +} + +// TODO(nigeltao) merge props and allprop? + +// Props returns the status of the properties named pnames for resource name. +// +// Each Propstat has a unique status and each property name will only be part +// of one Propstat element. +func props(ctx context.Context, fs FileSystem, ls LockSystem, name string, pnames []xml.Name) ([]Propstat, error) { + f, err := fs.OpenFile(ctx, name, os.O_RDONLY, 0) + if err != nil { + return nil, err + } + defer f.Close() + fi, err := f.Stat() + if err != nil { + return nil, err + } + isDir := fi.IsDir() + + var deadProps map[xml.Name]Property + if dph, ok := f.(DeadPropsHolder); ok { + deadProps, err = dph.DeadProps() + if err != nil { + return nil, err + } + } + + pstatOK := Propstat{Status: http.StatusOK} + pstatNotFound := Propstat{Status: http.StatusNotFound} + for _, pn := range pnames { + // If this file has dead properties, check if they contain pn. + if dp, ok := deadProps[pn]; ok { + pstatOK.Props = append(pstatOK.Props, dp) + continue + } + // Otherwise, it must either be a live property or we don't know it. + if prop := liveProps[pn]; prop.findFn != nil && (prop.dir || !isDir) { + innerXML, err := prop.findFn(ctx, fs, ls, name, fi) + if err != nil { + return nil, err + } + pstatOK.Props = append(pstatOK.Props, Property{ + XMLName: pn, + InnerXML: []byte(innerXML), + }) + } else { + pstatNotFound.Props = append(pstatNotFound.Props, Property{ + XMLName: pn, + }) + } + } + return makePropstats(pstatOK, pstatNotFound), nil +} + +// Propnames returns the property names defined for resource name. +func propnames(ctx context.Context, fs FileSystem, ls LockSystem, name string) ([]xml.Name, error) { + f, err := fs.OpenFile(ctx, name, os.O_RDONLY, 0) + if err != nil { + return nil, err + } + defer f.Close() + fi, err := f.Stat() + if err != nil { + return nil, err + } + isDir := fi.IsDir() + + var deadProps map[xml.Name]Property + if dph, ok := f.(DeadPropsHolder); ok { + deadProps, err = dph.DeadProps() + if err != nil { + return nil, err + } + } + + pnames := make([]xml.Name, 0, len(liveProps)+len(deadProps)) + for pn, prop := range liveProps { + if prop.findFn != nil && (prop.dir || !isDir) { + pnames = append(pnames, pn) + } + } + for pn := range deadProps { + pnames = append(pnames, pn) + } + return pnames, nil +} + +// Allprop returns the properties defined for resource name and the properties +// named in include. +// +// Note that RFC 4918 defines 'allprop' to return the DAV: properties defined +// within the RFC plus dead properties. Other live properties should only be +// returned if they are named in 'include'. +// +// See http://www.webdav.org/specs/rfc4918.html#METHOD_PROPFIND +func allprop(ctx context.Context, fs FileSystem, ls LockSystem, name string, include []xml.Name) ([]Propstat, error) { + pnames, err := propnames(ctx, fs, ls, name) + if err != nil { + return nil, err + } + // Add names from include if they are not already covered in pnames. + nameset := make(map[xml.Name]bool) + for _, pn := range pnames { + nameset[pn] = true + } + for _, pn := range include { + if !nameset[pn] { + pnames = append(pnames, pn) + } + } + return props(ctx, fs, ls, name, pnames) +} + +// Patch patches the properties of resource name. The return values are +// constrained in the same manner as DeadPropsHolder.Patch. +func patch(ctx context.Context, fs FileSystem, ls LockSystem, name string, patches []Proppatch) ([]Propstat, error) { + conflict := false +loop: + for _, patch := range patches { + for _, p := range patch.Props { + if _, ok := liveProps[p.XMLName]; ok { + conflict = true + break loop + } + } + } + if conflict { + pstatForbidden := Propstat{ + Status: http.StatusForbidden, + XMLError: ``, + } + pstatFailedDep := Propstat{ + Status: StatusFailedDependency, + } + for _, patch := range patches { + for _, p := range patch.Props { + if _, ok := liveProps[p.XMLName]; ok { + pstatForbidden.Props = append(pstatForbidden.Props, Property{XMLName: p.XMLName}) + } else { + pstatFailedDep.Props = append(pstatFailedDep.Props, Property{XMLName: p.XMLName}) + } + } + } + return makePropstats(pstatForbidden, pstatFailedDep), nil + } + + f, err := fs.OpenFile(ctx, name, os.O_RDWR, 0) + if err != nil { + return nil, err + } + defer f.Close() + if dph, ok := f.(DeadPropsHolder); ok { + ret, err := dph.Patch(patches) + if err != nil { + return nil, err + } + // http://www.webdav.org/specs/rfc4918.html#ELEMENT_propstat says that + // "The contents of the prop XML element must only list the names of + // properties to which the result in the status element applies." + for _, pstat := range ret { + for i, p := range pstat.Props { + pstat.Props[i] = Property{XMLName: p.XMLName} + } + } + return ret, nil + } + // The file doesn't implement the optional DeadPropsHolder interface, so + // all patches are forbidden. + pstat := Propstat{Status: http.StatusForbidden} + for _, patch := range patches { + for _, p := range patch.Props { + pstat.Props = append(pstat.Props, Property{XMLName: p.XMLName}) + } + } + return []Propstat{pstat}, nil +} + +func escapeXML(s string) string { + for i := 0; i < len(s); i++ { + // As an optimization, if s contains only ASCII letters, digits or a + // few special characters, the escaped value is s itself and we don't + // need to allocate a buffer and convert between string and []byte. + switch c := s[i]; { + case c == ' ' || c == '_' || + ('+' <= c && c <= '9') || // Digits as well as + , - . and / + ('A' <= c && c <= 'Z') || + ('a' <= c && c <= 'z'): + continue + } + // Otherwise, go through the full escaping process. + var buf bytes.Buffer + xml.EscapeText(&buf, []byte(s)) + return buf.String() + } + return s +} + +func findResourceType(ctx context.Context, fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { + if fi.IsDir() { + return ``, nil + } + return "", nil +} + +func findDisplayName(ctx context.Context, fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { + if slashClean(name) == "/" { + // Hide the real name of a possibly prefixed root directory. + return "", nil + } + return escapeXML(fi.Name()), nil +} + +func findContentLength(ctx context.Context, fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { + return strconv.FormatInt(fi.Size(), 10), nil +} + +func findLastModified(ctx context.Context, fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { + return fi.ModTime().Format(http.TimeFormat), nil +} + +func findContentType(ctx context.Context, fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { + f, err := fs.OpenFile(ctx, name, os.O_RDONLY, 0) + if err != nil { + return "", err + } + defer f.Close() + // This implementation is based on serveContent's code in the standard net/http package. + ctype := mime.TypeByExtension(filepath.Ext(name)) + if ctype != "" { + return ctype, nil + } + // Read a chunk to decide between utf-8 text and binary. + var buf [512]byte + n, err := io.ReadFull(f, buf[:]) + if err != nil && err != io.EOF && err != io.ErrUnexpectedEOF { + return "", err + } + ctype = http.DetectContentType(buf[:n]) + // Rewind file. + _, err = f.Seek(0, os.SEEK_SET) + return ctype, err +} + +func findETag(ctx context.Context, fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { + // The Apache http 2.4 web server by default concatenates the + // modification time and size of a file. We replicate the heuristic + // with nanosecond granularity. + return fmt.Sprintf(`"%x%x"`, fi.ModTime().UnixNano(), fi.Size()), nil +} + +func findSupportedLock(ctx context.Context, fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { + return `` + + `` + + `` + + `` + + ``, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/prop_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/prop_test.go new file mode 100644 index 0000000..57d0e82 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/prop_test.go @@ -0,0 +1,613 @@ +// Copyright 2015 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 webdav + +import ( + "encoding/xml" + "fmt" + "net/http" + "os" + "reflect" + "sort" + "testing" + + "golang.org/x/net/context" +) + +func TestMemPS(t *testing.T) { + ctx := context.Background() + // calcProps calculates the getlastmodified and getetag DAV: property + // values in pstats for resource name in file-system fs. + calcProps := func(name string, fs FileSystem, ls LockSystem, pstats []Propstat) error { + fi, err := fs.Stat(ctx, name) + if err != nil { + return err + } + for _, pst := range pstats { + for i, p := range pst.Props { + switch p.XMLName { + case xml.Name{Space: "DAV:", Local: "getlastmodified"}: + p.InnerXML = []byte(fi.ModTime().Format(http.TimeFormat)) + pst.Props[i] = p + case xml.Name{Space: "DAV:", Local: "getetag"}: + if fi.IsDir() { + continue + } + etag, err := findETag(ctx, fs, ls, name, fi) + if err != nil { + return err + } + p.InnerXML = []byte(etag) + pst.Props[i] = p + } + } + } + return nil + } + + const ( + lockEntry = `` + + `` + + `` + + `` + + `` + statForbiddenError = `` + ) + + type propOp struct { + op string + name string + pnames []xml.Name + patches []Proppatch + wantPnames []xml.Name + wantPropstats []Propstat + } + + testCases := []struct { + desc string + noDeadProps bool + buildfs []string + propOp []propOp + }{{ + desc: "propname", + buildfs: []string{"mkdir /dir", "touch /file"}, + propOp: []propOp{{ + op: "propname", + name: "/dir", + wantPnames: []xml.Name{ + {Space: "DAV:", Local: "resourcetype"}, + {Space: "DAV:", Local: "displayname"}, + {Space: "DAV:", Local: "supportedlock"}, + {Space: "DAV:", Local: "getlastmodified"}, + }, + }, { + op: "propname", + name: "/file", + wantPnames: []xml.Name{ + {Space: "DAV:", Local: "resourcetype"}, + {Space: "DAV:", Local: "displayname"}, + {Space: "DAV:", Local: "getcontentlength"}, + {Space: "DAV:", Local: "getlastmodified"}, + {Space: "DAV:", Local: "getcontenttype"}, + {Space: "DAV:", Local: "getetag"}, + {Space: "DAV:", Local: "supportedlock"}, + }, + }}, + }, { + desc: "allprop dir and file", + buildfs: []string{"mkdir /dir", "write /file foobarbaz"}, + propOp: []propOp{{ + op: "allprop", + name: "/dir", + wantPropstats: []Propstat{{ + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "DAV:", Local: "resourcetype"}, + InnerXML: []byte(``), + }, { + XMLName: xml.Name{Space: "DAV:", Local: "displayname"}, + InnerXML: []byte("dir"), + }, { + XMLName: xml.Name{Space: "DAV:", Local: "getlastmodified"}, + InnerXML: nil, // Calculated during test. + }, { + XMLName: xml.Name{Space: "DAV:", Local: "supportedlock"}, + InnerXML: []byte(lockEntry), + }}, + }}, + }, { + op: "allprop", + name: "/file", + wantPropstats: []Propstat{{ + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "DAV:", Local: "resourcetype"}, + InnerXML: []byte(""), + }, { + XMLName: xml.Name{Space: "DAV:", Local: "displayname"}, + InnerXML: []byte("file"), + }, { + XMLName: xml.Name{Space: "DAV:", Local: "getcontentlength"}, + InnerXML: []byte("9"), + }, { + XMLName: xml.Name{Space: "DAV:", Local: "getlastmodified"}, + InnerXML: nil, // Calculated during test. + }, { + XMLName: xml.Name{Space: "DAV:", Local: "getcontenttype"}, + InnerXML: []byte("text/plain; charset=utf-8"), + }, { + XMLName: xml.Name{Space: "DAV:", Local: "getetag"}, + InnerXML: nil, // Calculated during test. + }, { + XMLName: xml.Name{Space: "DAV:", Local: "supportedlock"}, + InnerXML: []byte(lockEntry), + }}, + }}, + }, { + op: "allprop", + name: "/file", + pnames: []xml.Name{ + {"DAV:", "resourcetype"}, + {"foo", "bar"}, + }, + wantPropstats: []Propstat{{ + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "DAV:", Local: "resourcetype"}, + InnerXML: []byte(""), + }, { + XMLName: xml.Name{Space: "DAV:", Local: "displayname"}, + InnerXML: []byte("file"), + }, { + XMLName: xml.Name{Space: "DAV:", Local: "getcontentlength"}, + InnerXML: []byte("9"), + }, { + XMLName: xml.Name{Space: "DAV:", Local: "getlastmodified"}, + InnerXML: nil, // Calculated during test. + }, { + XMLName: xml.Name{Space: "DAV:", Local: "getcontenttype"}, + InnerXML: []byte("text/plain; charset=utf-8"), + }, { + XMLName: xml.Name{Space: "DAV:", Local: "getetag"}, + InnerXML: nil, // Calculated during test. + }, { + XMLName: xml.Name{Space: "DAV:", Local: "supportedlock"}, + InnerXML: []byte(lockEntry), + }}}, { + Status: http.StatusNotFound, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + }}}, + }, + }}, + }, { + desc: "propfind DAV:resourcetype", + buildfs: []string{"mkdir /dir", "touch /file"}, + propOp: []propOp{{ + op: "propfind", + name: "/dir", + pnames: []xml.Name{{"DAV:", "resourcetype"}}, + wantPropstats: []Propstat{{ + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "DAV:", Local: "resourcetype"}, + InnerXML: []byte(``), + }}, + }}, + }, { + op: "propfind", + name: "/file", + pnames: []xml.Name{{"DAV:", "resourcetype"}}, + wantPropstats: []Propstat{{ + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "DAV:", Local: "resourcetype"}, + InnerXML: []byte(""), + }}, + }}, + }}, + }, { + desc: "propfind unsupported DAV properties", + buildfs: []string{"mkdir /dir"}, + propOp: []propOp{{ + op: "propfind", + name: "/dir", + pnames: []xml.Name{{"DAV:", "getcontentlanguage"}}, + wantPropstats: []Propstat{{ + Status: http.StatusNotFound, + Props: []Property{{ + XMLName: xml.Name{Space: "DAV:", Local: "getcontentlanguage"}, + }}, + }}, + }, { + op: "propfind", + name: "/dir", + pnames: []xml.Name{{"DAV:", "creationdate"}}, + wantPropstats: []Propstat{{ + Status: http.StatusNotFound, + Props: []Property{{ + XMLName: xml.Name{Space: "DAV:", Local: "creationdate"}, + }}, + }}, + }}, + }, { + desc: "propfind getetag for files but not for directories", + buildfs: []string{"mkdir /dir", "touch /file"}, + propOp: []propOp{{ + op: "propfind", + name: "/dir", + pnames: []xml.Name{{"DAV:", "getetag"}}, + wantPropstats: []Propstat{{ + Status: http.StatusNotFound, + Props: []Property{{ + XMLName: xml.Name{Space: "DAV:", Local: "getetag"}, + }}, + }}, + }, { + op: "propfind", + name: "/file", + pnames: []xml.Name{{"DAV:", "getetag"}}, + wantPropstats: []Propstat{{ + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "DAV:", Local: "getetag"}, + InnerXML: nil, // Calculated during test. + }}, + }}, + }}, + }, { + desc: "proppatch property on no-dead-properties file system", + buildfs: []string{"mkdir /dir"}, + noDeadProps: true, + propOp: []propOp{{ + op: "proppatch", + name: "/dir", + patches: []Proppatch{{ + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + }}, + }}, + wantPropstats: []Propstat{{ + Status: http.StatusForbidden, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + }}, + }}, + }, { + op: "proppatch", + name: "/dir", + patches: []Proppatch{{ + Props: []Property{{ + XMLName: xml.Name{Space: "DAV:", Local: "getetag"}, + }}, + }}, + wantPropstats: []Propstat{{ + Status: http.StatusForbidden, + XMLError: statForbiddenError, + Props: []Property{{ + XMLName: xml.Name{Space: "DAV:", Local: "getetag"}, + }}, + }}, + }}, + }, { + desc: "proppatch dead property", + buildfs: []string{"mkdir /dir"}, + propOp: []propOp{{ + op: "proppatch", + name: "/dir", + patches: []Proppatch{{ + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + InnerXML: []byte("baz"), + }}, + }}, + wantPropstats: []Propstat{{ + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + }}, + }}, + }, { + op: "propfind", + name: "/dir", + pnames: []xml.Name{{Space: "foo", Local: "bar"}}, + wantPropstats: []Propstat{{ + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + InnerXML: []byte("baz"), + }}, + }}, + }}, + }, { + desc: "proppatch dead property with failed dependency", + buildfs: []string{"mkdir /dir"}, + propOp: []propOp{{ + op: "proppatch", + name: "/dir", + patches: []Proppatch{{ + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + InnerXML: []byte("baz"), + }}, + }, { + Props: []Property{{ + XMLName: xml.Name{Space: "DAV:", Local: "displayname"}, + InnerXML: []byte("xxx"), + }}, + }}, + wantPropstats: []Propstat{{ + Status: http.StatusForbidden, + XMLError: statForbiddenError, + Props: []Property{{ + XMLName: xml.Name{Space: "DAV:", Local: "displayname"}, + }}, + }, { + Status: StatusFailedDependency, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + }}, + }}, + }, { + op: "propfind", + name: "/dir", + pnames: []xml.Name{{Space: "foo", Local: "bar"}}, + wantPropstats: []Propstat{{ + Status: http.StatusNotFound, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + }}, + }}, + }}, + }, { + desc: "proppatch remove dead property", + buildfs: []string{"mkdir /dir"}, + propOp: []propOp{{ + op: "proppatch", + name: "/dir", + patches: []Proppatch{{ + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + InnerXML: []byte("baz"), + }, { + XMLName: xml.Name{Space: "spam", Local: "ham"}, + InnerXML: []byte("eggs"), + }}, + }}, + wantPropstats: []Propstat{{ + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + }, { + XMLName: xml.Name{Space: "spam", Local: "ham"}, + }}, + }}, + }, { + op: "propfind", + name: "/dir", + pnames: []xml.Name{ + {Space: "foo", Local: "bar"}, + {Space: "spam", Local: "ham"}, + }, + wantPropstats: []Propstat{{ + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + InnerXML: []byte("baz"), + }, { + XMLName: xml.Name{Space: "spam", Local: "ham"}, + InnerXML: []byte("eggs"), + }}, + }}, + }, { + op: "proppatch", + name: "/dir", + patches: []Proppatch{{ + Remove: true, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + }}, + }}, + wantPropstats: []Propstat{{ + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + }}, + }}, + }, { + op: "propfind", + name: "/dir", + pnames: []xml.Name{ + {Space: "foo", Local: "bar"}, + {Space: "spam", Local: "ham"}, + }, + wantPropstats: []Propstat{{ + Status: http.StatusNotFound, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + }}, + }, { + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "spam", Local: "ham"}, + InnerXML: []byte("eggs"), + }}, + }}, + }}, + }, { + desc: "propname with dead property", + buildfs: []string{"touch /file"}, + propOp: []propOp{{ + op: "proppatch", + name: "/file", + patches: []Proppatch{{ + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + InnerXML: []byte("baz"), + }}, + }}, + wantPropstats: []Propstat{{ + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + }}, + }}, + }, { + op: "propname", + name: "/file", + wantPnames: []xml.Name{ + {Space: "DAV:", Local: "resourcetype"}, + {Space: "DAV:", Local: "displayname"}, + {Space: "DAV:", Local: "getcontentlength"}, + {Space: "DAV:", Local: "getlastmodified"}, + {Space: "DAV:", Local: "getcontenttype"}, + {Space: "DAV:", Local: "getetag"}, + {Space: "DAV:", Local: "supportedlock"}, + {Space: "foo", Local: "bar"}, + }, + }}, + }, { + desc: "proppatch remove unknown dead property", + buildfs: []string{"mkdir /dir"}, + propOp: []propOp{{ + op: "proppatch", + name: "/dir", + patches: []Proppatch{{ + Remove: true, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + }}, + }}, + wantPropstats: []Propstat{{ + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + }}, + }}, + }}, + }, { + desc: "bad: propfind unknown property", + buildfs: []string{"mkdir /dir"}, + propOp: []propOp{{ + op: "propfind", + name: "/dir", + pnames: []xml.Name{{"foo:", "bar"}}, + wantPropstats: []Propstat{{ + Status: http.StatusNotFound, + Props: []Property{{ + XMLName: xml.Name{Space: "foo:", Local: "bar"}, + }}, + }}, + }}, + }} + + for _, tc := range testCases { + fs, err := buildTestFS(tc.buildfs) + if err != nil { + t.Fatalf("%s: cannot create test filesystem: %v", tc.desc, err) + } + if tc.noDeadProps { + fs = noDeadPropsFS{fs} + } + ls := NewMemLS() + for _, op := range tc.propOp { + desc := fmt.Sprintf("%s: %s %s", tc.desc, op.op, op.name) + if err = calcProps(op.name, fs, ls, op.wantPropstats); err != nil { + t.Fatalf("%s: calcProps: %v", desc, err) + } + + // Call property system. + var propstats []Propstat + switch op.op { + case "propname": + pnames, err := propnames(ctx, fs, ls, op.name) + if err != nil { + t.Errorf("%s: got error %v, want nil", desc, err) + continue + } + sort.Sort(byXMLName(pnames)) + sort.Sort(byXMLName(op.wantPnames)) + if !reflect.DeepEqual(pnames, op.wantPnames) { + t.Errorf("%s: pnames\ngot %q\nwant %q", desc, pnames, op.wantPnames) + } + continue + case "allprop": + propstats, err = allprop(ctx, fs, ls, op.name, op.pnames) + case "propfind": + propstats, err = props(ctx, fs, ls, op.name, op.pnames) + case "proppatch": + propstats, err = patch(ctx, fs, ls, op.name, op.patches) + default: + t.Fatalf("%s: %s not implemented", desc, op.op) + } + if err != nil { + t.Errorf("%s: got error %v, want nil", desc, err) + continue + } + // Compare return values from allprop, propfind or proppatch. + for _, pst := range propstats { + sort.Sort(byPropname(pst.Props)) + } + for _, pst := range op.wantPropstats { + sort.Sort(byPropname(pst.Props)) + } + sort.Sort(byStatus(propstats)) + sort.Sort(byStatus(op.wantPropstats)) + if !reflect.DeepEqual(propstats, op.wantPropstats) { + t.Errorf("%s: propstat\ngot %q\nwant %q", desc, propstats, op.wantPropstats) + } + } + } +} + +func cmpXMLName(a, b xml.Name) bool { + if a.Space != b.Space { + return a.Space < b.Space + } + return a.Local < b.Local +} + +type byXMLName []xml.Name + +func (b byXMLName) Len() int { return len(b) } +func (b byXMLName) Swap(i, j int) { b[i], b[j] = b[j], b[i] } +func (b byXMLName) Less(i, j int) bool { return cmpXMLName(b[i], b[j]) } + +type byPropname []Property + +func (b byPropname) Len() int { return len(b) } +func (b byPropname) Swap(i, j int) { b[i], b[j] = b[j], b[i] } +func (b byPropname) Less(i, j int) bool { return cmpXMLName(b[i].XMLName, b[j].XMLName) } + +type byStatus []Propstat + +func (b byStatus) Len() int { return len(b) } +func (b byStatus) Swap(i, j int) { b[i], b[j] = b[j], b[i] } +func (b byStatus) Less(i, j int) bool { return b[i].Status < b[j].Status } + +type noDeadPropsFS struct { + FileSystem +} + +func (fs noDeadPropsFS) OpenFile(ctx context.Context, name string, flag int, perm os.FileMode) (File, error) { + f, err := fs.FileSystem.OpenFile(ctx, name, flag, perm) + if err != nil { + return nil, err + } + return noDeadPropsFile{f}, nil +} + +// noDeadPropsFile wraps a File but strips any optional DeadPropsHolder methods +// provided by the underlying File implementation. +type noDeadPropsFile struct { + f File +} + +func (f noDeadPropsFile) Close() error { return f.f.Close() } +func (f noDeadPropsFile) Read(p []byte) (int, error) { return f.f.Read(p) } +func (f noDeadPropsFile) Readdir(count int) ([]os.FileInfo, error) { return f.f.Readdir(count) } +func (f noDeadPropsFile) Seek(off int64, whence int) (int64, error) { return f.f.Seek(off, whence) } +func (f noDeadPropsFile) Stat() (os.FileInfo, error) { return f.f.Stat() } +func (f noDeadPropsFile) Write(p []byte) (int, error) { return f.f.Write(p) } diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/webdav.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/webdav.go new file mode 100644 index 0000000..7b56687 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/webdav.go @@ -0,0 +1,702 @@ +// 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 webdav provides a WebDAV server implementation. +package webdav // import "golang.org/x/net/webdav" + +import ( + "errors" + "fmt" + "io" + "net/http" + "net/url" + "os" + "path" + "strings" + "time" +) + +type Handler struct { + // Prefix is the URL path prefix to strip from WebDAV resource paths. + Prefix string + // FileSystem is the virtual file system. + FileSystem FileSystem + // LockSystem is the lock management system. + LockSystem LockSystem + // Logger is an optional error logger. If non-nil, it will be called + // for all HTTP requests. + Logger func(*http.Request, error) +} + +func (h *Handler) stripPrefix(p string) (string, int, error) { + if h.Prefix == "" { + return p, http.StatusOK, nil + } + if r := strings.TrimPrefix(p, h.Prefix); len(r) < len(p) { + return r, http.StatusOK, nil + } + return p, http.StatusNotFound, errPrefixMismatch +} + +func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + status, err := http.StatusBadRequest, errUnsupportedMethod + if h.FileSystem == nil { + status, err = http.StatusInternalServerError, errNoFileSystem + } else if h.LockSystem == nil { + status, err = http.StatusInternalServerError, errNoLockSystem + } else { + switch r.Method { + case "OPTIONS": + status, err = h.handleOptions(w, r) + case "GET", "HEAD", "POST": + status, err = h.handleGetHeadPost(w, r) + case "DELETE": + status, err = h.handleDelete(w, r) + case "PUT": + status, err = h.handlePut(w, r) + case "MKCOL": + status, err = h.handleMkcol(w, r) + case "COPY", "MOVE": + status, err = h.handleCopyMove(w, r) + case "LOCK": + status, err = h.handleLock(w, r) + case "UNLOCK": + status, err = h.handleUnlock(w, r) + case "PROPFIND": + status, err = h.handlePropfind(w, r) + case "PROPPATCH": + status, err = h.handleProppatch(w, r) + } + } + + if status != 0 { + w.WriteHeader(status) + if status != http.StatusNoContent { + w.Write([]byte(StatusText(status))) + } + } + if h.Logger != nil { + h.Logger(r, err) + } +} + +func (h *Handler) lock(now time.Time, root string) (token string, status int, err error) { + token, err = h.LockSystem.Create(now, LockDetails{ + Root: root, + Duration: infiniteTimeout, + ZeroDepth: true, + }) + if err != nil { + if err == ErrLocked { + return "", StatusLocked, err + } + return "", http.StatusInternalServerError, err + } + return token, 0, nil +} + +func (h *Handler) confirmLocks(r *http.Request, src, dst string) (release func(), status int, err error) { + hdr := r.Header.Get("If") + if hdr == "" { + // An empty If header means that the client hasn't previously created locks. + // Even if this client doesn't care about locks, we still need to check that + // the resources aren't locked by another client, so we create temporary + // locks that would conflict with another client's locks. These temporary + // locks are unlocked at the end of the HTTP request. + now, srcToken, dstToken := time.Now(), "", "" + if src != "" { + srcToken, status, err = h.lock(now, src) + if err != nil { + return nil, status, err + } + } + if dst != "" { + dstToken, status, err = h.lock(now, dst) + if err != nil { + if srcToken != "" { + h.LockSystem.Unlock(now, srcToken) + } + return nil, status, err + } + } + + return func() { + if dstToken != "" { + h.LockSystem.Unlock(now, dstToken) + } + if srcToken != "" { + h.LockSystem.Unlock(now, srcToken) + } + }, 0, nil + } + + ih, ok := parseIfHeader(hdr) + if !ok { + return nil, http.StatusBadRequest, errInvalidIfHeader + } + // ih is a disjunction (OR) of ifLists, so any ifList will do. + for _, l := range ih.lists { + lsrc := l.resourceTag + if lsrc == "" { + lsrc = src + } else { + u, err := url.Parse(lsrc) + if err != nil { + continue + } + if u.Host != r.Host { + continue + } + lsrc, status, err = h.stripPrefix(u.Path) + if err != nil { + return nil, status, err + } + } + release, err = h.LockSystem.Confirm(time.Now(), lsrc, dst, l.conditions...) + if err == ErrConfirmationFailed { + continue + } + if err != nil { + return nil, http.StatusInternalServerError, err + } + return release, 0, nil + } + // Section 10.4.1 says that "If this header is evaluated and all state lists + // fail, then the request must fail with a 412 (Precondition Failed) status." + // We follow the spec even though the cond_put_corrupt_token test case from + // the litmus test warns on seeing a 412 instead of a 423 (Locked). + return nil, http.StatusPreconditionFailed, ErrLocked +} + +func (h *Handler) handleOptions(w http.ResponseWriter, r *http.Request) (status int, err error) { + reqPath, status, err := h.stripPrefix(r.URL.Path) + if err != nil { + return status, err + } + ctx := getContext(r) + allow := "OPTIONS, LOCK, PUT, MKCOL" + if fi, err := h.FileSystem.Stat(ctx, reqPath); err == nil { + if fi.IsDir() { + allow = "OPTIONS, LOCK, DELETE, PROPPATCH, COPY, MOVE, UNLOCK, PROPFIND" + } else { + allow = "OPTIONS, LOCK, GET, HEAD, POST, DELETE, PROPPATCH, COPY, MOVE, UNLOCK, PROPFIND, PUT" + } + } + w.Header().Set("Allow", allow) + // http://www.webdav.org/specs/rfc4918.html#dav.compliance.classes + w.Header().Set("DAV", "1, 2") + // http://msdn.microsoft.com/en-au/library/cc250217.aspx + w.Header().Set("MS-Author-Via", "DAV") + return 0, nil +} + +func (h *Handler) handleGetHeadPost(w http.ResponseWriter, r *http.Request) (status int, err error) { + reqPath, status, err := h.stripPrefix(r.URL.Path) + if err != nil { + return status, err + } + // TODO: check locks for read-only access?? + ctx := getContext(r) + f, err := h.FileSystem.OpenFile(ctx, reqPath, os.O_RDONLY, 0) + if err != nil { + return http.StatusNotFound, err + } + defer f.Close() + fi, err := f.Stat() + if err != nil { + return http.StatusNotFound, err + } + if fi.IsDir() { + return http.StatusMethodNotAllowed, nil + } + etag, err := findETag(ctx, h.FileSystem, h.LockSystem, reqPath, fi) + if err != nil { + return http.StatusInternalServerError, err + } + w.Header().Set("ETag", etag) + // Let ServeContent determine the Content-Type header. + http.ServeContent(w, r, reqPath, fi.ModTime(), f) + return 0, nil +} + +func (h *Handler) handleDelete(w http.ResponseWriter, r *http.Request) (status int, err error) { + reqPath, status, err := h.stripPrefix(r.URL.Path) + if err != nil { + return status, err + } + release, status, err := h.confirmLocks(r, reqPath, "") + if err != nil { + return status, err + } + defer release() + + ctx := getContext(r) + + // TODO: return MultiStatus where appropriate. + + // "godoc os RemoveAll" says that "If the path does not exist, RemoveAll + // returns nil (no error)." WebDAV semantics are that it should return a + // "404 Not Found". We therefore have to Stat before we RemoveAll. + if _, err := h.FileSystem.Stat(ctx, reqPath); err != nil { + if os.IsNotExist(err) { + return http.StatusNotFound, err + } + return http.StatusMethodNotAllowed, err + } + if err := h.FileSystem.RemoveAll(ctx, reqPath); err != nil { + return http.StatusMethodNotAllowed, err + } + return http.StatusNoContent, nil +} + +func (h *Handler) handlePut(w http.ResponseWriter, r *http.Request) (status int, err error) { + reqPath, status, err := h.stripPrefix(r.URL.Path) + if err != nil { + return status, err + } + release, status, err := h.confirmLocks(r, reqPath, "") + if err != nil { + return status, err + } + defer release() + // TODO(rost): Support the If-Match, If-None-Match headers? See bradfitz' + // comments in http.checkEtag. + ctx := getContext(r) + + f, err := h.FileSystem.OpenFile(ctx, reqPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) + if err != nil { + return http.StatusNotFound, err + } + _, copyErr := io.Copy(f, r.Body) + fi, statErr := f.Stat() + closeErr := f.Close() + // TODO(rost): Returning 405 Method Not Allowed might not be appropriate. + if copyErr != nil { + return http.StatusMethodNotAllowed, copyErr + } + if statErr != nil { + return http.StatusMethodNotAllowed, statErr + } + if closeErr != nil { + return http.StatusMethodNotAllowed, closeErr + } + etag, err := findETag(ctx, h.FileSystem, h.LockSystem, reqPath, fi) + if err != nil { + return http.StatusInternalServerError, err + } + w.Header().Set("ETag", etag) + return http.StatusCreated, nil +} + +func (h *Handler) handleMkcol(w http.ResponseWriter, r *http.Request) (status int, err error) { + reqPath, status, err := h.stripPrefix(r.URL.Path) + if err != nil { + return status, err + } + release, status, err := h.confirmLocks(r, reqPath, "") + if err != nil { + return status, err + } + defer release() + + ctx := getContext(r) + + if r.ContentLength > 0 { + return http.StatusUnsupportedMediaType, nil + } + if err := h.FileSystem.Mkdir(ctx, reqPath, 0777); err != nil { + if os.IsNotExist(err) { + return http.StatusConflict, err + } + return http.StatusMethodNotAllowed, err + } + return http.StatusCreated, nil +} + +func (h *Handler) handleCopyMove(w http.ResponseWriter, r *http.Request) (status int, err error) { + hdr := r.Header.Get("Destination") + if hdr == "" { + return http.StatusBadRequest, errInvalidDestination + } + u, err := url.Parse(hdr) + if err != nil { + return http.StatusBadRequest, errInvalidDestination + } + if u.Host != r.Host { + return http.StatusBadGateway, errInvalidDestination + } + + src, status, err := h.stripPrefix(r.URL.Path) + if err != nil { + return status, err + } + + dst, status, err := h.stripPrefix(u.Path) + if err != nil { + return status, err + } + + if dst == "" { + return http.StatusBadGateway, errInvalidDestination + } + if dst == src { + return http.StatusForbidden, errDestinationEqualsSource + } + + ctx := getContext(r) + + if r.Method == "COPY" { + // Section 7.5.1 says that a COPY only needs to lock the destination, + // not both destination and source. Strictly speaking, this is racy, + // even though a COPY doesn't modify the source, if a concurrent + // operation modifies the source. However, the litmus test explicitly + // checks that COPYing a locked-by-another source is OK. + release, status, err := h.confirmLocks(r, "", dst) + if err != nil { + return status, err + } + defer release() + + // Section 9.8.3 says that "The COPY method on a collection without a Depth + // header must act as if a Depth header with value "infinity" was included". + depth := infiniteDepth + if hdr := r.Header.Get("Depth"); hdr != "" { + depth = parseDepth(hdr) + if depth != 0 && depth != infiniteDepth { + // Section 9.8.3 says that "A client may submit a Depth header on a + // COPY on a collection with a value of "0" or "infinity"." + return http.StatusBadRequest, errInvalidDepth + } + } + return copyFiles(ctx, h.FileSystem, src, dst, r.Header.Get("Overwrite") != "F", depth, 0) + } + + release, status, err := h.confirmLocks(r, src, dst) + if err != nil { + return status, err + } + defer release() + + // Section 9.9.2 says that "The MOVE method on a collection must act as if + // a "Depth: infinity" header was used on it. A client must not submit a + // Depth header on a MOVE on a collection with any value but "infinity"." + if hdr := r.Header.Get("Depth"); hdr != "" { + if parseDepth(hdr) != infiniteDepth { + return http.StatusBadRequest, errInvalidDepth + } + } + return moveFiles(ctx, h.FileSystem, src, dst, r.Header.Get("Overwrite") == "T") +} + +func (h *Handler) handleLock(w http.ResponseWriter, r *http.Request) (retStatus int, retErr error) { + duration, err := parseTimeout(r.Header.Get("Timeout")) + if err != nil { + return http.StatusBadRequest, err + } + li, status, err := readLockInfo(r.Body) + if err != nil { + return status, err + } + + ctx := getContext(r) + token, ld, now, created := "", LockDetails{}, time.Now(), false + if li == (lockInfo{}) { + // An empty lockInfo means to refresh the lock. + ih, ok := parseIfHeader(r.Header.Get("If")) + if !ok { + return http.StatusBadRequest, errInvalidIfHeader + } + if len(ih.lists) == 1 && len(ih.lists[0].conditions) == 1 { + token = ih.lists[0].conditions[0].Token + } + if token == "" { + return http.StatusBadRequest, errInvalidLockToken + } + ld, err = h.LockSystem.Refresh(now, token, duration) + if err != nil { + if err == ErrNoSuchLock { + return http.StatusPreconditionFailed, err + } + return http.StatusInternalServerError, err + } + + } else { + // Section 9.10.3 says that "If no Depth header is submitted on a LOCK request, + // then the request MUST act as if a "Depth:infinity" had been submitted." + depth := infiniteDepth + if hdr := r.Header.Get("Depth"); hdr != "" { + depth = parseDepth(hdr) + if depth != 0 && depth != infiniteDepth { + // Section 9.10.3 says that "Values other than 0 or infinity must not be + // used with the Depth header on a LOCK method". + return http.StatusBadRequest, errInvalidDepth + } + } + reqPath, status, err := h.stripPrefix(r.URL.Path) + if err != nil { + return status, err + } + ld = LockDetails{ + Root: reqPath, + Duration: duration, + OwnerXML: li.Owner.InnerXML, + ZeroDepth: depth == 0, + } + token, err = h.LockSystem.Create(now, ld) + if err != nil { + if err == ErrLocked { + return StatusLocked, err + } + return http.StatusInternalServerError, err + } + defer func() { + if retErr != nil { + h.LockSystem.Unlock(now, token) + } + }() + + // Create the resource if it didn't previously exist. + if _, err := h.FileSystem.Stat(ctx, reqPath); err != nil { + f, err := h.FileSystem.OpenFile(ctx, reqPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) + if err != nil { + // TODO: detect missing intermediate dirs and return http.StatusConflict? + return http.StatusInternalServerError, err + } + f.Close() + created = true + } + + // http://www.webdav.org/specs/rfc4918.html#HEADER_Lock-Token says that the + // Lock-Token value is a Coded-URL. We add angle brackets. + w.Header().Set("Lock-Token", "<"+token+">") + } + + w.Header().Set("Content-Type", "application/xml; charset=utf-8") + if created { + // This is "w.WriteHeader(http.StatusCreated)" and not "return + // http.StatusCreated, nil" because we write our own (XML) response to w + // and Handler.ServeHTTP would otherwise write "Created". + w.WriteHeader(http.StatusCreated) + } + writeLockInfo(w, token, ld) + return 0, nil +} + +func (h *Handler) handleUnlock(w http.ResponseWriter, r *http.Request) (status int, err error) { + // http://www.webdav.org/specs/rfc4918.html#HEADER_Lock-Token says that the + // Lock-Token value is a Coded-URL. We strip its angle brackets. + t := r.Header.Get("Lock-Token") + if len(t) < 2 || t[0] != '<' || t[len(t)-1] != '>' { + return http.StatusBadRequest, errInvalidLockToken + } + t = t[1 : len(t)-1] + + switch err = h.LockSystem.Unlock(time.Now(), t); err { + case nil: + return http.StatusNoContent, err + case ErrForbidden: + return http.StatusForbidden, err + case ErrLocked: + return StatusLocked, err + case ErrNoSuchLock: + return http.StatusConflict, err + default: + return http.StatusInternalServerError, err + } +} + +func (h *Handler) handlePropfind(w http.ResponseWriter, r *http.Request) (status int, err error) { + reqPath, status, err := h.stripPrefix(r.URL.Path) + if err != nil { + return status, err + } + ctx := getContext(r) + fi, err := h.FileSystem.Stat(ctx, reqPath) + if err != nil { + if os.IsNotExist(err) { + return http.StatusNotFound, err + } + return http.StatusMethodNotAllowed, err + } + depth := infiniteDepth + if hdr := r.Header.Get("Depth"); hdr != "" { + depth = parseDepth(hdr) + if depth == invalidDepth { + return http.StatusBadRequest, errInvalidDepth + } + } + pf, status, err := readPropfind(r.Body) + if err != nil { + return status, err + } + + mw := multistatusWriter{w: w} + + walkFn := func(reqPath string, info os.FileInfo, err error) error { + if err != nil { + return err + } + var pstats []Propstat + if pf.Propname != nil { + pnames, err := propnames(ctx, h.FileSystem, h.LockSystem, reqPath) + if err != nil { + return err + } + pstat := Propstat{Status: http.StatusOK} + for _, xmlname := range pnames { + pstat.Props = append(pstat.Props, Property{XMLName: xmlname}) + } + pstats = append(pstats, pstat) + } else if pf.Allprop != nil { + pstats, err = allprop(ctx, h.FileSystem, h.LockSystem, reqPath, pf.Prop) + } else { + pstats, err = props(ctx, h.FileSystem, h.LockSystem, reqPath, pf.Prop) + } + if err != nil { + return err + } + return mw.write(makePropstatResponse(path.Join(h.Prefix, reqPath), pstats)) + } + + walkErr := walkFS(ctx, h.FileSystem, depth, reqPath, fi, walkFn) + closeErr := mw.close() + if walkErr != nil { + return http.StatusInternalServerError, walkErr + } + if closeErr != nil { + return http.StatusInternalServerError, closeErr + } + return 0, nil +} + +func (h *Handler) handleProppatch(w http.ResponseWriter, r *http.Request) (status int, err error) { + reqPath, status, err := h.stripPrefix(r.URL.Path) + if err != nil { + return status, err + } + release, status, err := h.confirmLocks(r, reqPath, "") + if err != nil { + return status, err + } + defer release() + + ctx := getContext(r) + + if _, err := h.FileSystem.Stat(ctx, reqPath); err != nil { + if os.IsNotExist(err) { + return http.StatusNotFound, err + } + return http.StatusMethodNotAllowed, err + } + patches, status, err := readProppatch(r.Body) + if err != nil { + return status, err + } + pstats, err := patch(ctx, h.FileSystem, h.LockSystem, reqPath, patches) + if err != nil { + return http.StatusInternalServerError, err + } + mw := multistatusWriter{w: w} + writeErr := mw.write(makePropstatResponse(r.URL.Path, pstats)) + closeErr := mw.close() + if writeErr != nil { + return http.StatusInternalServerError, writeErr + } + if closeErr != nil { + return http.StatusInternalServerError, closeErr + } + return 0, nil +} + +func makePropstatResponse(href string, pstats []Propstat) *response { + resp := response{ + Href: []string{(&url.URL{Path: href}).EscapedPath()}, + Propstat: make([]propstat, 0, len(pstats)), + } + for _, p := range pstats { + var xmlErr *xmlError + if p.XMLError != "" { + xmlErr = &xmlError{InnerXML: []byte(p.XMLError)} + } + resp.Propstat = append(resp.Propstat, propstat{ + Status: fmt.Sprintf("HTTP/1.1 %d %s", p.Status, StatusText(p.Status)), + Prop: p.Props, + ResponseDescription: p.ResponseDescription, + Error: xmlErr, + }) + } + return &resp +} + +const ( + infiniteDepth = -1 + invalidDepth = -2 +) + +// parseDepth maps the strings "0", "1" and "infinity" to 0, 1 and +// infiniteDepth. Parsing any other string returns invalidDepth. +// +// Different WebDAV methods have further constraints on valid depths: +// - PROPFIND has no further restrictions, as per section 9.1. +// - COPY accepts only "0" or "infinity", as per section 9.8.3. +// - MOVE accepts only "infinity", as per section 9.9.2. +// - LOCK accepts only "0" or "infinity", as per section 9.10.3. +// These constraints are enforced by the handleXxx methods. +func parseDepth(s string) int { + switch s { + case "0": + return 0 + case "1": + return 1 + case "infinity": + return infiniteDepth + } + return invalidDepth +} + +// http://www.webdav.org/specs/rfc4918.html#status.code.extensions.to.http11 +const ( + StatusMulti = 207 + StatusUnprocessableEntity = 422 + StatusLocked = 423 + StatusFailedDependency = 424 + StatusInsufficientStorage = 507 +) + +func StatusText(code int) string { + switch code { + case StatusMulti: + return "Multi-Status" + case StatusUnprocessableEntity: + return "Unprocessable Entity" + case StatusLocked: + return "Locked" + case StatusFailedDependency: + return "Failed Dependency" + case StatusInsufficientStorage: + return "Insufficient Storage" + } + return http.StatusText(code) +} + +var ( + errDestinationEqualsSource = errors.New("webdav: destination equals source") + errDirectoryNotEmpty = errors.New("webdav: directory not empty") + errInvalidDepth = errors.New("webdav: invalid depth") + errInvalidDestination = errors.New("webdav: invalid destination") + errInvalidIfHeader = errors.New("webdav: invalid If header") + errInvalidLockInfo = errors.New("webdav: invalid lock info") + errInvalidLockToken = errors.New("webdav: invalid lock token") + errInvalidPropfind = errors.New("webdav: invalid propfind") + errInvalidProppatch = errors.New("webdav: invalid proppatch") + errInvalidResponse = errors.New("webdav: invalid response") + errInvalidTimeout = errors.New("webdav: invalid timeout") + errNoFileSystem = errors.New("webdav: no file system") + errNoLockSystem = errors.New("webdav: no lock system") + errNotADirectory = errors.New("webdav: not a directory") + errPrefixMismatch = errors.New("webdav: prefix mismatch") + errRecursionTooDeep = errors.New("webdav: recursion too deep") + errUnsupportedLockInfo = errors.New("webdav: unsupported lock info") + errUnsupportedMethod = errors.New("webdav: unsupported method") +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/webdav_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/webdav_test.go new file mode 100644 index 0000000..25e0d54 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/webdav_test.go @@ -0,0 +1,344 @@ +// Copyright 2015 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 webdav + +import ( + "errors" + "fmt" + "io" + "io/ioutil" + "net/http" + "net/http/httptest" + "net/url" + "os" + "reflect" + "regexp" + "sort" + "strings" + "testing" + + "golang.org/x/net/context" +) + +// TODO: add tests to check XML responses with the expected prefix path +func TestPrefix(t *testing.T) { + const dst, blah = "Destination", "blah blah blah" + + // createLockBody comes from the example in Section 9.10.7. + const createLockBody = ` + + + + + http://example.org/~ejw/contact.html + + + ` + + do := func(method, urlStr string, body string, wantStatusCode int, headers ...string) (http.Header, error) { + var bodyReader io.Reader + if body != "" { + bodyReader = strings.NewReader(body) + } + req, err := http.NewRequest(method, urlStr, bodyReader) + if err != nil { + return nil, err + } + for len(headers) >= 2 { + req.Header.Add(headers[0], headers[1]) + headers = headers[2:] + } + res, err := http.DefaultTransport.RoundTrip(req) + if err != nil { + return nil, err + } + defer res.Body.Close() + if res.StatusCode != wantStatusCode { + return nil, fmt.Errorf("got status code %d, want %d", res.StatusCode, wantStatusCode) + } + return res.Header, nil + } + + prefixes := []string{ + "/", + "/a/", + "/a/b/", + "/a/b/c/", + } + ctx := context.Background() + for _, prefix := range prefixes { + fs := NewMemFS() + h := &Handler{ + FileSystem: fs, + LockSystem: NewMemLS(), + } + mux := http.NewServeMux() + if prefix != "/" { + h.Prefix = prefix + } + mux.Handle(prefix, h) + srv := httptest.NewServer(mux) + defer srv.Close() + + // The script is: + // MKCOL /a + // MKCOL /a/b + // PUT /a/b/c + // COPY /a/b/c /a/b/d + // MKCOL /a/b/e + // MOVE /a/b/d /a/b/e/f + // LOCK /a/b/e/g + // PUT /a/b/e/g + // which should yield the (possibly stripped) filenames /a/b/c, + // /a/b/e/f and /a/b/e/g, plus their parent directories. + + wantA := map[string]int{ + "/": http.StatusCreated, + "/a/": http.StatusMovedPermanently, + "/a/b/": http.StatusNotFound, + "/a/b/c/": http.StatusNotFound, + }[prefix] + if _, err := do("MKCOL", srv.URL+"/a", "", wantA); err != nil { + t.Errorf("prefix=%-9q MKCOL /a: %v", prefix, err) + continue + } + + wantB := map[string]int{ + "/": http.StatusCreated, + "/a/": http.StatusCreated, + "/a/b/": http.StatusMovedPermanently, + "/a/b/c/": http.StatusNotFound, + }[prefix] + if _, err := do("MKCOL", srv.URL+"/a/b", "", wantB); err != nil { + t.Errorf("prefix=%-9q MKCOL /a/b: %v", prefix, err) + continue + } + + wantC := map[string]int{ + "/": http.StatusCreated, + "/a/": http.StatusCreated, + "/a/b/": http.StatusCreated, + "/a/b/c/": http.StatusMovedPermanently, + }[prefix] + if _, err := do("PUT", srv.URL+"/a/b/c", blah, wantC); err != nil { + t.Errorf("prefix=%-9q PUT /a/b/c: %v", prefix, err) + continue + } + + wantD := map[string]int{ + "/": http.StatusCreated, + "/a/": http.StatusCreated, + "/a/b/": http.StatusCreated, + "/a/b/c/": http.StatusMovedPermanently, + }[prefix] + if _, err := do("COPY", srv.URL+"/a/b/c", "", wantD, dst, srv.URL+"/a/b/d"); err != nil { + t.Errorf("prefix=%-9q COPY /a/b/c /a/b/d: %v", prefix, err) + continue + } + + wantE := map[string]int{ + "/": http.StatusCreated, + "/a/": http.StatusCreated, + "/a/b/": http.StatusCreated, + "/a/b/c/": http.StatusNotFound, + }[prefix] + if _, err := do("MKCOL", srv.URL+"/a/b/e", "", wantE); err != nil { + t.Errorf("prefix=%-9q MKCOL /a/b/e: %v", prefix, err) + continue + } + + wantF := map[string]int{ + "/": http.StatusCreated, + "/a/": http.StatusCreated, + "/a/b/": http.StatusCreated, + "/a/b/c/": http.StatusNotFound, + }[prefix] + if _, err := do("MOVE", srv.URL+"/a/b/d", "", wantF, dst, srv.URL+"/a/b/e/f"); err != nil { + t.Errorf("prefix=%-9q MOVE /a/b/d /a/b/e/f: %v", prefix, err) + continue + } + + var lockToken string + wantG := map[string]int{ + "/": http.StatusCreated, + "/a/": http.StatusCreated, + "/a/b/": http.StatusCreated, + "/a/b/c/": http.StatusNotFound, + }[prefix] + if h, err := do("LOCK", srv.URL+"/a/b/e/g", createLockBody, wantG); err != nil { + t.Errorf("prefix=%-9q LOCK /a/b/e/g: %v", prefix, err) + continue + } else { + lockToken = h.Get("Lock-Token") + } + + ifHeader := fmt.Sprintf("<%s/a/b/e/g> (%s)", srv.URL, lockToken) + wantH := map[string]int{ + "/": http.StatusCreated, + "/a/": http.StatusCreated, + "/a/b/": http.StatusCreated, + "/a/b/c/": http.StatusNotFound, + }[prefix] + if _, err := do("PUT", srv.URL+"/a/b/e/g", blah, wantH, "If", ifHeader); err != nil { + t.Errorf("prefix=%-9q PUT /a/b/e/g: %v", prefix, err) + continue + } + + got, err := find(ctx, nil, fs, "/") + if err != nil { + t.Errorf("prefix=%-9q find: %v", prefix, err) + continue + } + sort.Strings(got) + want := map[string][]string{ + "/": {"/", "/a", "/a/b", "/a/b/c", "/a/b/e", "/a/b/e/f", "/a/b/e/g"}, + "/a/": {"/", "/b", "/b/c", "/b/e", "/b/e/f", "/b/e/g"}, + "/a/b/": {"/", "/c", "/e", "/e/f", "/e/g"}, + "/a/b/c/": {"/"}, + }[prefix] + if !reflect.DeepEqual(got, want) { + t.Errorf("prefix=%-9q find:\ngot %v\nwant %v", prefix, got, want) + continue + } + } +} + +func TestEscapeXML(t *testing.T) { + // These test cases aren't exhaustive, and there is more than one way to + // escape e.g. a quot (as """ or """) or an apos. We presume that + // the encoding/xml package tests xml.EscapeText more thoroughly. This test + // here is just a sanity check for this package's escapeXML function, and + // its attempt to provide a fast path (and avoid a bytes.Buffer allocation) + // when escaping filenames is obviously a no-op. + testCases := map[string]string{ + "": "", + " ": " ", + "&": "&", + "*": "*", + "+": "+", + ",": ",", + "-": "-", + ".": ".", + "/": "/", + "0": "0", + "9": "9", + ":": ":", + "<": "<", + ">": ">", + "A": "A", + "_": "_", + "a": "a", + "~": "~", + "\u0201": "\u0201", + "&": "&amp;", + "foo&baz": "foo&<b/ar>baz", + } + + for in, want := range testCases { + if got := escapeXML(in); got != want { + t.Errorf("in=%q: got %q, want %q", in, got, want) + } + } +} + +func TestFilenameEscape(t *testing.T) { + hrefRe := regexp.MustCompile(`([^<]*)`) + displayNameRe := regexp.MustCompile(`([^<]*)`) + do := func(method, urlStr string) (string, string, error) { + req, err := http.NewRequest(method, urlStr, nil) + if err != nil { + return "", "", err + } + res, err := http.DefaultClient.Do(req) + if err != nil { + return "", "", err + } + defer res.Body.Close() + + b, err := ioutil.ReadAll(res.Body) + if err != nil { + return "", "", err + } + hrefMatch := hrefRe.FindStringSubmatch(string(b)) + if len(hrefMatch) != 2 { + return "", "", errors.New("D:href not found") + } + displayNameMatch := displayNameRe.FindStringSubmatch(string(b)) + if len(displayNameMatch) != 2 { + return "", "", errors.New("D:displayname not found") + } + + return hrefMatch[1], displayNameMatch[1], nil + } + + testCases := []struct { + name, wantHref, wantDisplayName string + }{{ + name: `/foo%bar`, + wantHref: `/foo%25bar`, + wantDisplayName: `foo%bar`, + }, { + name: `/こんにちわ世界`, + wantHref: `/%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%82%8F%E4%B8%96%E7%95%8C`, + wantDisplayName: `こんにちわ世界`, + }, { + name: `/Program Files/`, + wantHref: `/Program%20Files`, + wantDisplayName: `Program Files`, + }, { + name: `/go+lang`, + wantHref: `/go+lang`, + wantDisplayName: `go+lang`, + }, { + name: `/go&lang`, + wantHref: `/go&lang`, + wantDisplayName: `go&lang`, + }, { + name: `/goexclusive"` + Shared *struct{} `xml:"lockscope>shared"` + Write *struct{} `xml:"locktype>write"` + Owner owner `xml:"owner"` +} + +// http://www.webdav.org/specs/rfc4918.html#ELEMENT_owner +type owner struct { + InnerXML string `xml:",innerxml"` +} + +func readLockInfo(r io.Reader) (li lockInfo, status int, err error) { + c := &countingReader{r: r} + if err = ixml.NewDecoder(c).Decode(&li); err != nil { + if err == io.EOF { + if c.n == 0 { + // An empty body means to refresh the lock. + // http://www.webdav.org/specs/rfc4918.html#refreshing-locks + return lockInfo{}, 0, nil + } + err = errInvalidLockInfo + } + return lockInfo{}, http.StatusBadRequest, err + } + // We only support exclusive (non-shared) write locks. In practice, these are + // the only types of locks that seem to matter. + if li.Exclusive == nil || li.Shared != nil || li.Write == nil { + return lockInfo{}, http.StatusNotImplemented, errUnsupportedLockInfo + } + return li, 0, nil +} + +type countingReader struct { + n int + r io.Reader +} + +func (c *countingReader) Read(p []byte) (int, error) { + n, err := c.r.Read(p) + c.n += n + return n, err +} + +func writeLockInfo(w io.Writer, token string, ld LockDetails) (int, error) { + depth := "infinity" + if ld.ZeroDepth { + depth = "0" + } + timeout := ld.Duration / time.Second + return fmt.Fprintf(w, "\n"+ + "\n"+ + " \n"+ + " \n"+ + " %s\n"+ + " %s\n"+ + " Second-%d\n"+ + " %s\n"+ + " %s\n"+ + "", + depth, ld.OwnerXML, timeout, escape(token), escape(ld.Root), + ) +} + +func escape(s string) string { + for i := 0; i < len(s); i++ { + switch s[i] { + case '"', '&', '\'', '<', '>': + b := bytes.NewBuffer(nil) + ixml.EscapeText(b, []byte(s)) + return b.String() + } + } + return s +} + +// Next returns the next token, if any, in the XML stream of d. +// RFC 4918 requires to ignore comments, processing instructions +// and directives. +// http://www.webdav.org/specs/rfc4918.html#property_values +// http://www.webdav.org/specs/rfc4918.html#xml-extensibility +func next(d *ixml.Decoder) (ixml.Token, error) { + for { + t, err := d.Token() + if err != nil { + return t, err + } + switch t.(type) { + case ixml.Comment, ixml.Directive, ixml.ProcInst: + continue + default: + return t, nil + } + } +} + +// http://www.webdav.org/specs/rfc4918.html#ELEMENT_prop (for propfind) +type propfindProps []xml.Name + +// UnmarshalXML appends the property names enclosed within start to pn. +// +// It returns an error if start does not contain any properties or if +// properties contain values. Character data between properties is ignored. +func (pn *propfindProps) UnmarshalXML(d *ixml.Decoder, start ixml.StartElement) error { + for { + t, err := next(d) + if err != nil { + return err + } + switch t.(type) { + case ixml.EndElement: + if len(*pn) == 0 { + return fmt.Errorf("%s must not be empty", start.Name.Local) + } + return nil + case ixml.StartElement: + name := t.(ixml.StartElement).Name + t, err = next(d) + if err != nil { + return err + } + if _, ok := t.(ixml.EndElement); !ok { + return fmt.Errorf("unexpected token %T", t) + } + *pn = append(*pn, xml.Name(name)) + } + } +} + +// http://www.webdav.org/specs/rfc4918.html#ELEMENT_propfind +type propfind struct { + XMLName ixml.Name `xml:"DAV: propfind"` + Allprop *struct{} `xml:"DAV: allprop"` + Propname *struct{} `xml:"DAV: propname"` + Prop propfindProps `xml:"DAV: prop"` + Include propfindProps `xml:"DAV: include"` +} + +func readPropfind(r io.Reader) (pf propfind, status int, err error) { + c := countingReader{r: r} + if err = ixml.NewDecoder(&c).Decode(&pf); err != nil { + if err == io.EOF { + if c.n == 0 { + // An empty body means to propfind allprop. + // http://www.webdav.org/specs/rfc4918.html#METHOD_PROPFIND + return propfind{Allprop: new(struct{})}, 0, nil + } + err = errInvalidPropfind + } + return propfind{}, http.StatusBadRequest, err + } + + if pf.Allprop == nil && pf.Include != nil { + return propfind{}, http.StatusBadRequest, errInvalidPropfind + } + if pf.Allprop != nil && (pf.Prop != nil || pf.Propname != nil) { + return propfind{}, http.StatusBadRequest, errInvalidPropfind + } + if pf.Prop != nil && pf.Propname != nil { + return propfind{}, http.StatusBadRequest, errInvalidPropfind + } + if pf.Propname == nil && pf.Allprop == nil && pf.Prop == nil { + return propfind{}, http.StatusBadRequest, errInvalidPropfind + } + return pf, 0, nil +} + +// Property represents a single DAV resource property as defined in RFC 4918. +// See http://www.webdav.org/specs/rfc4918.html#data.model.for.resource.properties +type Property struct { + // XMLName is the fully qualified name that identifies this property. + XMLName xml.Name + + // Lang is an optional xml:lang attribute. + Lang string `xml:"xml:lang,attr,omitempty"` + + // InnerXML contains the XML representation of the property value. + // See http://www.webdav.org/specs/rfc4918.html#property_values + // + // Property values of complex type or mixed-content must have fully + // expanded XML namespaces or be self-contained with according + // XML namespace declarations. They must not rely on any XML + // namespace declarations within the scope of the XML document, + // even including the DAV: namespace. + InnerXML []byte `xml:",innerxml"` +} + +// ixmlProperty is the same as the Property type except it holds an ixml.Name +// instead of an xml.Name. +type ixmlProperty struct { + XMLName ixml.Name + Lang string `xml:"xml:lang,attr,omitempty"` + InnerXML []byte `xml:",innerxml"` +} + +// http://www.webdav.org/specs/rfc4918.html#ELEMENT_error +// See multistatusWriter for the "D:" namespace prefix. +type xmlError struct { + XMLName ixml.Name `xml:"D:error"` + InnerXML []byte `xml:",innerxml"` +} + +// http://www.webdav.org/specs/rfc4918.html#ELEMENT_propstat +// See multistatusWriter for the "D:" namespace prefix. +type propstat struct { + Prop []Property `xml:"D:prop>_ignored_"` + Status string `xml:"D:status"` + Error *xmlError `xml:"D:error"` + ResponseDescription string `xml:"D:responsedescription,omitempty"` +} + +// ixmlPropstat is the same as the propstat type except it holds an ixml.Name +// instead of an xml.Name. +type ixmlPropstat struct { + Prop []ixmlProperty `xml:"D:prop>_ignored_"` + Status string `xml:"D:status"` + Error *xmlError `xml:"D:error"` + ResponseDescription string `xml:"D:responsedescription,omitempty"` +} + +// MarshalXML prepends the "D:" namespace prefix on properties in the DAV: namespace +// before encoding. See multistatusWriter. +func (ps propstat) MarshalXML(e *ixml.Encoder, start ixml.StartElement) error { + // Convert from a propstat to an ixmlPropstat. + ixmlPs := ixmlPropstat{ + Prop: make([]ixmlProperty, len(ps.Prop)), + Status: ps.Status, + Error: ps.Error, + ResponseDescription: ps.ResponseDescription, + } + for k, prop := range ps.Prop { + ixmlPs.Prop[k] = ixmlProperty{ + XMLName: ixml.Name(prop.XMLName), + Lang: prop.Lang, + InnerXML: prop.InnerXML, + } + } + + for k, prop := range ixmlPs.Prop { + if prop.XMLName.Space == "DAV:" { + prop.XMLName = ixml.Name{Space: "", Local: "D:" + prop.XMLName.Local} + ixmlPs.Prop[k] = prop + } + } + // Distinct type to avoid infinite recursion of MarshalXML. + type newpropstat ixmlPropstat + return e.EncodeElement(newpropstat(ixmlPs), start) +} + +// http://www.webdav.org/specs/rfc4918.html#ELEMENT_response +// See multistatusWriter for the "D:" namespace prefix. +type response struct { + XMLName ixml.Name `xml:"D:response"` + Href []string `xml:"D:href"` + Propstat []propstat `xml:"D:propstat"` + Status string `xml:"D:status,omitempty"` + Error *xmlError `xml:"D:error"` + ResponseDescription string `xml:"D:responsedescription,omitempty"` +} + +// MultistatusWriter marshals one or more Responses into a XML +// multistatus response. +// See http://www.webdav.org/specs/rfc4918.html#ELEMENT_multistatus +// TODO(rsto, mpl): As a workaround, the "D:" namespace prefix, defined as +// "DAV:" on this element, is prepended on the nested response, as well as on all +// its nested elements. All property names in the DAV: namespace are prefixed as +// well. This is because some versions of Mini-Redirector (on windows 7) ignore +// elements with a default namespace (no prefixed namespace). A less intrusive fix +// should be possible after golang.org/cl/11074. See https://golang.org/issue/11177 +type multistatusWriter struct { + // ResponseDescription contains the optional responsedescription + // of the multistatus XML element. Only the latest content before + // close will be emitted. Empty response descriptions are not + // written. + responseDescription string + + w http.ResponseWriter + enc *ixml.Encoder +} + +// Write validates and emits a DAV response as part of a multistatus response +// element. +// +// It sets the HTTP status code of its underlying http.ResponseWriter to 207 +// (Multi-Status) and populates the Content-Type header. If r is the +// first, valid response to be written, Write prepends the XML representation +// of r with a multistatus tag. Callers must call close after the last response +// has been written. +func (w *multistatusWriter) write(r *response) error { + switch len(r.Href) { + case 0: + return errInvalidResponse + case 1: + if len(r.Propstat) > 0 != (r.Status == "") { + return errInvalidResponse + } + default: + if len(r.Propstat) > 0 || r.Status == "" { + return errInvalidResponse + } + } + err := w.writeHeader() + if err != nil { + return err + } + return w.enc.Encode(r) +} + +// writeHeader writes a XML multistatus start element on w's underlying +// http.ResponseWriter and returns the result of the write operation. +// After the first write attempt, writeHeader becomes a no-op. +func (w *multistatusWriter) writeHeader() error { + if w.enc != nil { + return nil + } + w.w.Header().Add("Content-Type", "text/xml; charset=utf-8") + w.w.WriteHeader(StatusMulti) + _, err := fmt.Fprintf(w.w, ``) + if err != nil { + return err + } + w.enc = ixml.NewEncoder(w.w) + return w.enc.EncodeToken(ixml.StartElement{ + Name: ixml.Name{ + Space: "DAV:", + Local: "multistatus", + }, + Attr: []ixml.Attr{{ + Name: ixml.Name{Space: "xmlns", Local: "D"}, + Value: "DAV:", + }}, + }) +} + +// Close completes the marshalling of the multistatus response. It returns +// an error if the multistatus response could not be completed. If both the +// return value and field enc of w are nil, then no multistatus response has +// been written. +func (w *multistatusWriter) close() error { + if w.enc == nil { + return nil + } + var end []ixml.Token + if w.responseDescription != "" { + name := ixml.Name{Space: "DAV:", Local: "responsedescription"} + end = append(end, + ixml.StartElement{Name: name}, + ixml.CharData(w.responseDescription), + ixml.EndElement{Name: name}, + ) + } + end = append(end, ixml.EndElement{ + Name: ixml.Name{Space: "DAV:", Local: "multistatus"}, + }) + for _, t := range end { + err := w.enc.EncodeToken(t) + if err != nil { + return err + } + } + return w.enc.Flush() +} + +var xmlLangName = ixml.Name{Space: "http://www.w3.org/XML/1998/namespace", Local: "lang"} + +func xmlLang(s ixml.StartElement, d string) string { + for _, attr := range s.Attr { + if attr.Name == xmlLangName { + return attr.Value + } + } + return d +} + +type xmlValue []byte + +func (v *xmlValue) UnmarshalXML(d *ixml.Decoder, start ixml.StartElement) error { + // The XML value of a property can be arbitrary, mixed-content XML. + // To make sure that the unmarshalled value contains all required + // namespaces, we encode all the property value XML tokens into a + // buffer. This forces the encoder to redeclare any used namespaces. + var b bytes.Buffer + e := ixml.NewEncoder(&b) + for { + t, err := next(d) + if err != nil { + return err + } + if e, ok := t.(ixml.EndElement); ok && e.Name == start.Name { + break + } + if err = e.EncodeToken(t); err != nil { + return err + } + } + err := e.Flush() + if err != nil { + return err + } + *v = b.Bytes() + return nil +} + +// http://www.webdav.org/specs/rfc4918.html#ELEMENT_prop (for proppatch) +type proppatchProps []Property + +// UnmarshalXML appends the property names and values enclosed within start +// to ps. +// +// An xml:lang attribute that is defined either on the DAV:prop or property +// name XML element is propagated to the property's Lang field. +// +// UnmarshalXML returns an error if start does not contain any properties or if +// property values contain syntactically incorrect XML. +func (ps *proppatchProps) UnmarshalXML(d *ixml.Decoder, start ixml.StartElement) error { + lang := xmlLang(start, "") + for { + t, err := next(d) + if err != nil { + return err + } + switch elem := t.(type) { + case ixml.EndElement: + if len(*ps) == 0 { + return fmt.Errorf("%s must not be empty", start.Name.Local) + } + return nil + case ixml.StartElement: + p := Property{ + XMLName: xml.Name(t.(ixml.StartElement).Name), + Lang: xmlLang(t.(ixml.StartElement), lang), + } + err = d.DecodeElement(((*xmlValue)(&p.InnerXML)), &elem) + if err != nil { + return err + } + *ps = append(*ps, p) + } + } +} + +// http://www.webdav.org/specs/rfc4918.html#ELEMENT_set +// http://www.webdav.org/specs/rfc4918.html#ELEMENT_remove +type setRemove struct { + XMLName ixml.Name + Lang string `xml:"xml:lang,attr,omitempty"` + Prop proppatchProps `xml:"DAV: prop"` +} + +// http://www.webdav.org/specs/rfc4918.html#ELEMENT_propertyupdate +type propertyupdate struct { + XMLName ixml.Name `xml:"DAV: propertyupdate"` + Lang string `xml:"xml:lang,attr,omitempty"` + SetRemove []setRemove `xml:",any"` +} + +func readProppatch(r io.Reader) (patches []Proppatch, status int, err error) { + var pu propertyupdate + if err = ixml.NewDecoder(r).Decode(&pu); err != nil { + return nil, http.StatusBadRequest, err + } + for _, op := range pu.SetRemove { + remove := false + switch op.XMLName { + case ixml.Name{Space: "DAV:", Local: "set"}: + // No-op. + case ixml.Name{Space: "DAV:", Local: "remove"}: + for _, p := range op.Prop { + if len(p.InnerXML) > 0 { + return nil, http.StatusBadRequest, errInvalidProppatch + } + } + remove = true + default: + return nil, http.StatusBadRequest, errInvalidProppatch + } + patches = append(patches, Proppatch{Remove: remove, Props: op.Prop}) + } + return patches, 0, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/xml_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/xml_test.go new file mode 100644 index 0000000..a3d9e1e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/webdav/xml_test.go @@ -0,0 +1,906 @@ +// 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 webdav + +import ( + "bytes" + "encoding/xml" + "fmt" + "io" + "net/http" + "net/http/httptest" + "reflect" + "sort" + "strings" + "testing" + + ixml "golang.org/x/net/webdav/internal/xml" +) + +func TestReadLockInfo(t *testing.T) { + // The "section x.y.z" test cases come from section x.y.z of the spec at + // http://www.webdav.org/specs/rfc4918.html + testCases := []struct { + desc string + input string + wantLI lockInfo + wantStatus int + }{{ + "bad: junk", + "xxx", + lockInfo{}, + http.StatusBadRequest, + }, { + "bad: invalid owner XML", + "" + + "\n" + + " \n" + + " \n" + + " \n" + + " no end tag \n" + + " \n" + + "", + lockInfo{}, + http.StatusBadRequest, + }, { + "bad: invalid UTF-8", + "" + + "\n" + + " \n" + + " \n" + + " \n" + + " \xff \n" + + " \n" + + "", + lockInfo{}, + http.StatusBadRequest, + }, { + "bad: unfinished XML #1", + "" + + "\n" + + " \n" + + " \n", + lockInfo{}, + http.StatusBadRequest, + }, { + "bad: unfinished XML #2", + "" + + "\n" + + " \n" + + " \n" + + " \n", + lockInfo{}, + http.StatusBadRequest, + }, { + "good: empty", + "", + lockInfo{}, + 0, + }, { + "good: plain-text owner", + "" + + "\n" + + " \n" + + " \n" + + " gopher\n" + + "", + lockInfo{ + XMLName: ixml.Name{Space: "DAV:", Local: "lockinfo"}, + Exclusive: new(struct{}), + Write: new(struct{}), + Owner: owner{ + InnerXML: "gopher", + }, + }, + 0, + }, { + "section 9.10.7", + "" + + "\n" + + " \n" + + " \n" + + " \n" + + " http://example.org/~ejw/contact.html\n" + + " \n" + + "", + lockInfo{ + XMLName: ixml.Name{Space: "DAV:", Local: "lockinfo"}, + Exclusive: new(struct{}), + Write: new(struct{}), + Owner: owner{ + InnerXML: "\n http://example.org/~ejw/contact.html\n ", + }, + }, + 0, + }} + + for _, tc := range testCases { + li, status, err := readLockInfo(strings.NewReader(tc.input)) + if tc.wantStatus != 0 { + if err == nil { + t.Errorf("%s: got nil error, want non-nil", tc.desc) + continue + } + } else if err != nil { + t.Errorf("%s: %v", tc.desc, err) + continue + } + if !reflect.DeepEqual(li, tc.wantLI) || status != tc.wantStatus { + t.Errorf("%s:\ngot lockInfo=%v, status=%v\nwant lockInfo=%v, status=%v", + tc.desc, li, status, tc.wantLI, tc.wantStatus) + continue + } + } +} + +func TestReadPropfind(t *testing.T) { + testCases := []struct { + desc string + input string + wantPF propfind + wantStatus int + }{{ + desc: "propfind: propname", + input: "" + + "\n" + + " \n" + + "", + wantPF: propfind{ + XMLName: ixml.Name{Space: "DAV:", Local: "propfind"}, + Propname: new(struct{}), + }, + }, { + desc: "propfind: empty body means allprop", + input: "", + wantPF: propfind{ + Allprop: new(struct{}), + }, + }, { + desc: "propfind: allprop", + input: "" + + "\n" + + " \n" + + "", + wantPF: propfind{ + XMLName: ixml.Name{Space: "DAV:", Local: "propfind"}, + Allprop: new(struct{}), + }, + }, { + desc: "propfind: allprop followed by include", + input: "" + + "\n" + + " \n" + + " \n" + + "", + wantPF: propfind{ + XMLName: ixml.Name{Space: "DAV:", Local: "propfind"}, + Allprop: new(struct{}), + Include: propfindProps{xml.Name{Space: "DAV:", Local: "displayname"}}, + }, + }, { + desc: "propfind: include followed by allprop", + input: "" + + "\n" + + " \n" + + " \n" + + "", + wantPF: propfind{ + XMLName: ixml.Name{Space: "DAV:", Local: "propfind"}, + Allprop: new(struct{}), + Include: propfindProps{xml.Name{Space: "DAV:", Local: "displayname"}}, + }, + }, { + desc: "propfind: propfind", + input: "" + + "\n" + + " \n" + + "", + wantPF: propfind{ + XMLName: ixml.Name{Space: "DAV:", Local: "propfind"}, + Prop: propfindProps{xml.Name{Space: "DAV:", Local: "displayname"}}, + }, + }, { + desc: "propfind: prop with ignored comments", + input: "" + + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + "", + wantPF: propfind{ + XMLName: ixml.Name{Space: "DAV:", Local: "propfind"}, + Prop: propfindProps{xml.Name{Space: "DAV:", Local: "displayname"}}, + }, + }, { + desc: "propfind: propfind with ignored whitespace", + input: "" + + "\n" + + " \n" + + "", + wantPF: propfind{ + XMLName: ixml.Name{Space: "DAV:", Local: "propfind"}, + Prop: propfindProps{xml.Name{Space: "DAV:", Local: "displayname"}}, + }, + }, { + desc: "propfind: propfind with ignored mixed-content", + input: "" + + "\n" + + " foobar\n" + + "", + wantPF: propfind{ + XMLName: ixml.Name{Space: "DAV:", Local: "propfind"}, + Prop: propfindProps{xml.Name{Space: "DAV:", Local: "displayname"}}, + }, + }, { + desc: "propfind: propname with ignored element (section A.4)", + input: "" + + "\n" + + " \n" + + " *boss*\n" + + "", + wantPF: propfind{ + XMLName: ixml.Name{Space: "DAV:", Local: "propfind"}, + Propname: new(struct{}), + }, + }, { + desc: "propfind: bad: junk", + input: "xxx", + wantStatus: http.StatusBadRequest, + }, { + desc: "propfind: bad: propname and allprop (section A.3)", + input: "" + + "\n" + + " " + + " " + + "", + wantStatus: http.StatusBadRequest, + }, { + desc: "propfind: bad: propname and prop", + input: "" + + "\n" + + " \n" + + " \n" + + "", + wantStatus: http.StatusBadRequest, + }, { + desc: "propfind: bad: allprop and prop", + input: "" + + "\n" + + " \n" + + " \n" + + "", + wantStatus: http.StatusBadRequest, + }, { + desc: "propfind: bad: empty propfind with ignored element (section A.4)", + input: "" + + "\n" + + " \n" + + "", + wantStatus: http.StatusBadRequest, + }, { + desc: "propfind: bad: empty prop", + input: "" + + "\n" + + " \n" + + "", + wantStatus: http.StatusBadRequest, + }, { + desc: "propfind: bad: prop with just chardata", + input: "" + + "\n" + + " foo\n" + + "", + wantStatus: http.StatusBadRequest, + }, { + desc: "bad: interrupted prop", + input: "" + + "\n" + + " \n", + wantStatus: http.StatusBadRequest, + }, { + desc: "bad: malformed end element prop", + input: "" + + "\n" + + " \n", + wantStatus: http.StatusBadRequest, + }, { + desc: "propfind: bad: property with chardata value", + input: "" + + "\n" + + " bar\n" + + "", + wantStatus: http.StatusBadRequest, + }, { + desc: "propfind: bad: property with whitespace value", + input: "" + + "\n" + + " \n" + + "", + wantStatus: http.StatusBadRequest, + }, { + desc: "propfind: bad: include without allprop", + input: "" + + "\n" + + " \n" + + "", + wantStatus: http.StatusBadRequest, + }} + + for _, tc := range testCases { + pf, status, err := readPropfind(strings.NewReader(tc.input)) + if tc.wantStatus != 0 { + if err == nil { + t.Errorf("%s: got nil error, want non-nil", tc.desc) + continue + } + } else if err != nil { + t.Errorf("%s: %v", tc.desc, err) + continue + } + if !reflect.DeepEqual(pf, tc.wantPF) || status != tc.wantStatus { + t.Errorf("%s:\ngot propfind=%v, status=%v\nwant propfind=%v, status=%v", + tc.desc, pf, status, tc.wantPF, tc.wantStatus) + continue + } + } +} + +func TestMultistatusWriter(t *testing.T) { + ///The "section x.y.z" test cases come from section x.y.z of the spec at + // http://www.webdav.org/specs/rfc4918.html + testCases := []struct { + desc string + responses []response + respdesc string + writeHeader bool + wantXML string + wantCode int + wantErr error + }{{ + desc: "section 9.2.2 (failed dependency)", + responses: []response{{ + Href: []string{"http://example.com/foo"}, + Propstat: []propstat{{ + Prop: []Property{{ + XMLName: xml.Name{ + Space: "http://ns.example.com/", + Local: "Authors", + }, + }}, + Status: "HTTP/1.1 424 Failed Dependency", + }, { + Prop: []Property{{ + XMLName: xml.Name{ + Space: "http://ns.example.com/", + Local: "Copyright-Owner", + }, + }}, + Status: "HTTP/1.1 409 Conflict", + }}, + ResponseDescription: "Copyright Owner cannot be deleted or altered.", + }}, + wantXML: `` + + `` + + `` + + ` ` + + ` http://example.com/foo` + + ` ` + + ` ` + + ` ` + + ` ` + + ` HTTP/1.1 424 Failed Dependency` + + ` ` + + ` ` + + ` ` + + ` ` + + ` ` + + ` HTTP/1.1 409 Conflict` + + ` ` + + ` Copyright Owner cannot be deleted or altered.` + + `` + + ``, + wantCode: StatusMulti, + }, { + desc: "section 9.6.2 (lock-token-submitted)", + responses: []response{{ + Href: []string{"http://example.com/foo"}, + Status: "HTTP/1.1 423 Locked", + Error: &xmlError{ + InnerXML: []byte(``), + }, + }}, + wantXML: `` + + `` + + `` + + ` ` + + ` http://example.com/foo` + + ` HTTP/1.1 423 Locked` + + ` ` + + ` ` + + ``, + wantCode: StatusMulti, + }, { + desc: "section 9.1.3", + responses: []response{{ + Href: []string{"http://example.com/foo"}, + Propstat: []propstat{{ + Prop: []Property{{ + XMLName: xml.Name{Space: "http://ns.example.com/boxschema/", Local: "bigbox"}, + InnerXML: []byte(`` + + `` + + `Box type A` + + ``), + }, { + XMLName: xml.Name{Space: "http://ns.example.com/boxschema/", Local: "author"}, + InnerXML: []byte(`` + + `` + + `J.J. Johnson` + + ``), + }}, + Status: "HTTP/1.1 200 OK", + }, { + Prop: []Property{{ + XMLName: xml.Name{Space: "http://ns.example.com/boxschema/", Local: "DingALing"}, + }, { + XMLName: xml.Name{Space: "http://ns.example.com/boxschema/", Local: "Random"}, + }}, + Status: "HTTP/1.1 403 Forbidden", + ResponseDescription: "The user does not have access to the DingALing property.", + }}, + }}, + respdesc: "There has been an access violation error.", + wantXML: `` + + `` + + `` + + ` ` + + ` http://example.com/foo` + + ` ` + + ` ` + + ` Box type A` + + ` J.J. Johnson` + + ` ` + + ` HTTP/1.1 200 OK` + + ` ` + + ` ` + + ` ` + + ` ` + + ` ` + + ` ` + + ` HTTP/1.1 403 Forbidden` + + ` The user does not have access to the DingALing property.` + + ` ` + + ` ` + + ` There has been an access violation error.` + + ``, + wantCode: StatusMulti, + }, { + desc: "no response written", + // default of http.responseWriter + wantCode: http.StatusOK, + }, { + desc: "no response written (with description)", + respdesc: "too bad", + // default of http.responseWriter + wantCode: http.StatusOK, + }, { + desc: "empty multistatus with header", + writeHeader: true, + wantXML: ``, + wantCode: StatusMulti, + }, { + desc: "bad: no href", + responses: []response{{ + Propstat: []propstat{{ + Prop: []Property{{ + XMLName: xml.Name{ + Space: "http://example.com/", + Local: "foo", + }, + }}, + Status: "HTTP/1.1 200 OK", + }}, + }}, + wantErr: errInvalidResponse, + // default of http.responseWriter + wantCode: http.StatusOK, + }, { + desc: "bad: multiple hrefs and no status", + responses: []response{{ + Href: []string{"http://example.com/foo", "http://example.com/bar"}, + }}, + wantErr: errInvalidResponse, + // default of http.responseWriter + wantCode: http.StatusOK, + }, { + desc: "bad: one href and no propstat", + responses: []response{{ + Href: []string{"http://example.com/foo"}, + }}, + wantErr: errInvalidResponse, + // default of http.responseWriter + wantCode: http.StatusOK, + }, { + desc: "bad: status with one href and propstat", + responses: []response{{ + Href: []string{"http://example.com/foo"}, + Propstat: []propstat{{ + Prop: []Property{{ + XMLName: xml.Name{ + Space: "http://example.com/", + Local: "foo", + }, + }}, + Status: "HTTP/1.1 200 OK", + }}, + Status: "HTTP/1.1 200 OK", + }}, + wantErr: errInvalidResponse, + // default of http.responseWriter + wantCode: http.StatusOK, + }, { + desc: "bad: multiple hrefs and propstat", + responses: []response{{ + Href: []string{ + "http://example.com/foo", + "http://example.com/bar", + }, + Propstat: []propstat{{ + Prop: []Property{{ + XMLName: xml.Name{ + Space: "http://example.com/", + Local: "foo", + }, + }}, + Status: "HTTP/1.1 200 OK", + }}, + }}, + wantErr: errInvalidResponse, + // default of http.responseWriter + wantCode: http.StatusOK, + }} + + n := xmlNormalizer{omitWhitespace: true} +loop: + for _, tc := range testCases { + rec := httptest.NewRecorder() + w := multistatusWriter{w: rec, responseDescription: tc.respdesc} + if tc.writeHeader { + if err := w.writeHeader(); err != nil { + t.Errorf("%s: got writeHeader error %v, want nil", tc.desc, err) + continue + } + } + for _, r := range tc.responses { + if err := w.write(&r); err != nil { + if err != tc.wantErr { + t.Errorf("%s: got write error %v, want %v", + tc.desc, err, tc.wantErr) + } + continue loop + } + } + if err := w.close(); err != tc.wantErr { + t.Errorf("%s: got close error %v, want %v", + tc.desc, err, tc.wantErr) + continue + } + if rec.Code != tc.wantCode { + t.Errorf("%s: got HTTP status code %d, want %d\n", + tc.desc, rec.Code, tc.wantCode) + continue + } + gotXML := rec.Body.String() + eq, err := n.equalXML(strings.NewReader(gotXML), strings.NewReader(tc.wantXML)) + if err != nil { + t.Errorf("%s: equalXML: %v", tc.desc, err) + continue + } + if !eq { + t.Errorf("%s: XML body\ngot %s\nwant %s", tc.desc, gotXML, tc.wantXML) + } + } +} + +func TestReadProppatch(t *testing.T) { + ppStr := func(pps []Proppatch) string { + var outer []string + for _, pp := range pps { + var inner []string + for _, p := range pp.Props { + inner = append(inner, fmt.Sprintf("{XMLName: %q, Lang: %q, InnerXML: %q}", + p.XMLName, p.Lang, p.InnerXML)) + } + outer = append(outer, fmt.Sprintf("{Remove: %t, Props: [%s]}", + pp.Remove, strings.Join(inner, ", "))) + } + return "[" + strings.Join(outer, ", ") + "]" + } + + testCases := []struct { + desc string + input string + wantPP []Proppatch + wantStatus int + }{{ + desc: "proppatch: section 9.2 (with simple property value)", + input: `` + + `` + + `` + + ` ` + + ` somevalue` + + ` ` + + ` ` + + ` ` + + ` ` + + ``, + wantPP: []Proppatch{{ + Props: []Property{{ + xml.Name{Space: "http://ns.example.com/z/", Local: "Authors"}, + "", + []byte(`somevalue`), + }}, + }, { + Remove: true, + Props: []Property{{ + xml.Name{Space: "http://ns.example.com/z/", Local: "Copyright-Owner"}, + "", + nil, + }}, + }}, + }, { + desc: "proppatch: lang attribute on prop", + input: `` + + `` + + `` + + ` ` + + ` ` + + ` ` + + ` ` + + ` ` + + ``, + wantPP: []Proppatch{{ + Props: []Property{{ + xml.Name{Space: "http://example.com/ns", Local: "foo"}, + "en", + nil, + }}, + }}, + }, { + desc: "bad: remove with value", + input: `` + + `` + + `` + + ` ` + + ` ` + + ` ` + + ` Jim Whitehead` + + ` ` + + ` ` + + ` ` + + ``, + wantStatus: http.StatusBadRequest, + }, { + desc: "bad: empty propertyupdate", + input: `` + + `` + + ``, + wantStatus: http.StatusBadRequest, + }, { + desc: "bad: empty prop", + input: `` + + `` + + `` + + ` ` + + ` ` + + ` ` + + ``, + wantStatus: http.StatusBadRequest, + }} + + for _, tc := range testCases { + pp, status, err := readProppatch(strings.NewReader(tc.input)) + if tc.wantStatus != 0 { + if err == nil { + t.Errorf("%s: got nil error, want non-nil", tc.desc) + continue + } + } else if err != nil { + t.Errorf("%s: %v", tc.desc, err) + continue + } + if status != tc.wantStatus { + t.Errorf("%s: got status %d, want %d", tc.desc, status, tc.wantStatus) + continue + } + if !reflect.DeepEqual(pp, tc.wantPP) || status != tc.wantStatus { + t.Errorf("%s: proppatch\ngot %v\nwant %v", tc.desc, ppStr(pp), ppStr(tc.wantPP)) + } + } +} + +func TestUnmarshalXMLValue(t *testing.T) { + testCases := []struct { + desc string + input string + wantVal string + }{{ + desc: "simple char data", + input: "foo", + wantVal: "foo", + }, { + desc: "empty element", + input: "", + wantVal: "", + }, { + desc: "preserve namespace", + input: ``, + wantVal: ``, + }, { + desc: "preserve root element namespace", + input: ``, + wantVal: ``, + }, { + desc: "preserve whitespace", + input: " \t ", + wantVal: " \t ", + }, { + desc: "preserve mixed content", + input: ` a `, + wantVal: ` a `, + }, { + desc: "section 9.2", + input: `` + + `` + + ` Jim Whitehead` + + ` Roy Fielding` + + ``, + wantVal: `` + + ` Jim Whitehead` + + ` Roy Fielding`, + }, { + desc: "section 4.3.1 (mixed content)", + input: `` + + `` + + ` Jane Doe` + + ` ` + + ` mailto:jane.doe@example.com` + + ` http://www.example.com` + + ` ` + + ` Jane has been working way too long on the` + + ` long-awaited revision of ]]>.` + + ` ` + + ``, + wantVal: `` + + ` Jane Doe` + + ` ` + + ` mailto:jane.doe@example.com` + + ` http://www.example.com` + + ` ` + + ` Jane has been working way too long on the` + + ` long-awaited revision of <RFC2518>.` + + ` `, + }} + + var n xmlNormalizer + for _, tc := range testCases { + d := ixml.NewDecoder(strings.NewReader(tc.input)) + var v xmlValue + if err := d.Decode(&v); err != nil { + t.Errorf("%s: got error %v, want nil", tc.desc, err) + continue + } + eq, err := n.equalXML(bytes.NewReader(v), strings.NewReader(tc.wantVal)) + if err != nil { + t.Errorf("%s: equalXML: %v", tc.desc, err) + continue + } + if !eq { + t.Errorf("%s:\ngot %s\nwant %s", tc.desc, string(v), tc.wantVal) + } + } +} + +// xmlNormalizer normalizes XML. +type xmlNormalizer struct { + // omitWhitespace instructs to ignore whitespace between element tags. + omitWhitespace bool + // omitComments instructs to ignore XML comments. + omitComments bool +} + +// normalize writes the normalized XML content of r to w. It applies the +// following rules +// +// * Rename namespace prefixes according to an internal heuristic. +// * Remove unnecessary namespace declarations. +// * Sort attributes in XML start elements in lexical order of their +// fully qualified name. +// * Remove XML directives and processing instructions. +// * Remove CDATA between XML tags that only contains whitespace, if +// instructed to do so. +// * Remove comments, if instructed to do so. +// +func (n *xmlNormalizer) normalize(w io.Writer, r io.Reader) error { + d := ixml.NewDecoder(r) + e := ixml.NewEncoder(w) + for { + t, err := d.Token() + if err != nil { + if t == nil && err == io.EOF { + break + } + return err + } + switch val := t.(type) { + case ixml.Directive, ixml.ProcInst: + continue + case ixml.Comment: + if n.omitComments { + continue + } + case ixml.CharData: + if n.omitWhitespace && len(bytes.TrimSpace(val)) == 0 { + continue + } + case ixml.StartElement: + start, _ := ixml.CopyToken(val).(ixml.StartElement) + attr := start.Attr[:0] + for _, a := range start.Attr { + if a.Name.Space == "xmlns" || a.Name.Local == "xmlns" { + continue + } + attr = append(attr, a) + } + sort.Sort(byName(attr)) + start.Attr = attr + t = start + } + err = e.EncodeToken(t) + if err != nil { + return err + } + } + return e.Flush() +} + +// equalXML tests for equality of the normalized XML contents of a and b. +func (n *xmlNormalizer) equalXML(a, b io.Reader) (bool, error) { + var buf bytes.Buffer + if err := n.normalize(&buf, a); err != nil { + return false, err + } + normA := buf.String() + buf.Reset() + if err := n.normalize(&buf, b); err != nil { + return false, err + } + normB := buf.String() + return normA == normB, nil +} + +type byName []ixml.Attr + +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 { + if a[i].Name.Space != a[j].Name.Space { + return a[i].Name.Space < a[j].Name.Space + } + return a[i].Name.Local < a[j].Name.Local +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/client.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/client.go new file mode 100644 index 0000000..69a4ac7 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/client.go @@ -0,0 +1,106 @@ +// 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 websocket + +import ( + "bufio" + "io" + "net" + "net/http" + "net/url" +) + +// DialError is an error that occurs while dialling a websocket server. +type DialError struct { + *Config + Err error +} + +func (e *DialError) Error() string { + return "websocket.Dial " + e.Config.Location.String() + ": " + e.Err.Error() +} + +// NewConfig creates a new WebSocket config for client connection. +func NewConfig(server, origin string) (config *Config, err error) { + config = new(Config) + config.Version = ProtocolVersionHybi13 + config.Location, err = url.ParseRequestURI(server) + if err != nil { + return + } + config.Origin, err = url.ParseRequestURI(origin) + if err != nil { + return + } + config.Header = http.Header(make(map[string][]string)) + return +} + +// NewClient creates a new WebSocket client connection over rwc. +func NewClient(config *Config, rwc io.ReadWriteCloser) (ws *Conn, err error) { + br := bufio.NewReader(rwc) + bw := bufio.NewWriter(rwc) + err = hybiClientHandshake(config, br, bw) + if err != nil { + return + } + buf := bufio.NewReadWriter(br, bw) + ws = newHybiClientConn(config, buf, rwc) + return +} + +// Dial opens a new client connection to a WebSocket. +func Dial(url_, protocol, origin string) (ws *Conn, err error) { + config, err := NewConfig(url_, origin) + if err != nil { + return nil, err + } + if protocol != "" { + config.Protocol = []string{protocol} + } + return DialConfig(config) +} + +var portMap = map[string]string{ + "ws": "80", + "wss": "443", +} + +func parseAuthority(location *url.URL) string { + if _, ok := portMap[location.Scheme]; ok { + if _, _, err := net.SplitHostPort(location.Host); err != nil { + return net.JoinHostPort(location.Host, portMap[location.Scheme]) + } + } + return location.Host +} + +// DialConfig opens a new client connection to a WebSocket with a config. +func DialConfig(config *Config) (ws *Conn, err error) { + var client net.Conn + if config.Location == nil { + return nil, &DialError{config, ErrBadWebSocketLocation} + } + if config.Origin == nil { + return nil, &DialError{config, ErrBadWebSocketOrigin} + } + dialer := config.Dialer + if dialer == nil { + dialer = &net.Dialer{} + } + client, err = dialWithDialer(dialer, config) + if err != nil { + goto Error + } + ws, err = NewClient(config, client) + if err != nil { + client.Close() + goto Error + } + return + +Error: + return nil, &DialError{config, err} +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/dial.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/dial.go new file mode 100644 index 0000000..2dab943 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/dial.go @@ -0,0 +1,24 @@ +// Copyright 2015 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 websocket + +import ( + "crypto/tls" + "net" +) + +func dialWithDialer(dialer *net.Dialer, config *Config) (conn net.Conn, err error) { + switch config.Location.Scheme { + case "ws": + conn, err = dialer.Dial("tcp", parseAuthority(config.Location)) + + case "wss": + conn, err = tls.DialWithDialer(dialer, "tcp", parseAuthority(config.Location), config.TlsConfig) + + default: + err = ErrBadScheme + } + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/dial_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/dial_test.go new file mode 100644 index 0000000..aa03e30 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/dial_test.go @@ -0,0 +1,43 @@ +// Copyright 2015 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 websocket + +import ( + "crypto/tls" + "fmt" + "log" + "net" + "net/http/httptest" + "testing" + "time" +) + +// This test depend on Go 1.3+ because in earlier versions the Dialer won't be +// used in TLS connections and a timeout won't be triggered. +func TestDialConfigTLSWithDialer(t *testing.T) { + tlsServer := httptest.NewTLSServer(nil) + tlsServerAddr := tlsServer.Listener.Addr().String() + log.Print("Test TLS WebSocket server listening on ", tlsServerAddr) + defer tlsServer.Close() + config, _ := NewConfig(fmt.Sprintf("wss://%s/echo", tlsServerAddr), "http://localhost") + config.Dialer = &net.Dialer{ + Deadline: time.Now().Add(-time.Minute), + } + config.TlsConfig = &tls.Config{ + InsecureSkipVerify: true, + } + _, err := DialConfig(config) + dialerr, ok := err.(*DialError) + if !ok { + t.Fatalf("DialError expected, got %#v", err) + } + neterr, ok := dialerr.Err.(*net.OpError) + if !ok { + t.Fatalf("net.OpError error expected, got %#v", dialerr.Err) + } + if !neterr.Timeout() { + t.Fatalf("expected timeout error, got %#v", neterr) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/exampledial_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/exampledial_test.go new file mode 100644 index 0000000..72bb9d4 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/exampledial_test.go @@ -0,0 +1,31 @@ +// 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 websocket_test + +import ( + "fmt" + "log" + + "golang.org/x/net/websocket" +) + +// This example demonstrates a trivial client. +func ExampleDial() { + origin := "http://localhost/" + url := "ws://localhost:12345/ws" + ws, err := websocket.Dial(url, "", origin) + if err != nil { + log.Fatal(err) + } + if _, err := ws.Write([]byte("hello, world!\n")); err != nil { + log.Fatal(err) + } + var msg = make([]byte, 512) + var n int + if n, err = ws.Read(msg); err != nil { + log.Fatal(err) + } + fmt.Printf("Received: %s.\n", msg[:n]) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/examplehandler_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/examplehandler_test.go new file mode 100644 index 0000000..f22a98f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/examplehandler_test.go @@ -0,0 +1,26 @@ +// 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 websocket_test + +import ( + "io" + "net/http" + + "golang.org/x/net/websocket" +) + +// Echo the data received on the WebSocket. +func EchoServer(ws *websocket.Conn) { + io.Copy(ws, ws) +} + +// This example demonstrates a trivial echo server. +func ExampleHandler() { + http.Handle("/echo", websocket.Handler(EchoServer)) + err := http.ListenAndServe(":12345", nil) + if err != nil { + panic("ListenAndServe: " + err.Error()) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/hybi.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/hybi.go new file mode 100644 index 0000000..8cffdd1 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/hybi.go @@ -0,0 +1,583 @@ +// 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 websocket + +// This file implements a protocol of hybi draft. +// http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17 + +import ( + "bufio" + "bytes" + "crypto/rand" + "crypto/sha1" + "encoding/base64" + "encoding/binary" + "fmt" + "io" + "io/ioutil" + "net/http" + "net/url" + "strings" +) + +const ( + websocketGUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" + + closeStatusNormal = 1000 + closeStatusGoingAway = 1001 + closeStatusProtocolError = 1002 + closeStatusUnsupportedData = 1003 + closeStatusFrameTooLarge = 1004 + closeStatusNoStatusRcvd = 1005 + closeStatusAbnormalClosure = 1006 + closeStatusBadMessageData = 1007 + closeStatusPolicyViolation = 1008 + closeStatusTooBigData = 1009 + closeStatusExtensionMismatch = 1010 + + maxControlFramePayloadLength = 125 +) + +var ( + ErrBadMaskingKey = &ProtocolError{"bad masking key"} + ErrBadPongMessage = &ProtocolError{"bad pong message"} + ErrBadClosingStatus = &ProtocolError{"bad closing status"} + ErrUnsupportedExtensions = &ProtocolError{"unsupported extensions"} + ErrNotImplemented = &ProtocolError{"not implemented"} + + handshakeHeader = map[string]bool{ + "Host": true, + "Upgrade": true, + "Connection": true, + "Sec-Websocket-Key": true, + "Sec-Websocket-Origin": true, + "Sec-Websocket-Version": true, + "Sec-Websocket-Protocol": true, + "Sec-Websocket-Accept": true, + } +) + +// A hybiFrameHeader is a frame header as defined in hybi draft. +type hybiFrameHeader struct { + Fin bool + Rsv [3]bool + OpCode byte + Length int64 + MaskingKey []byte + + data *bytes.Buffer +} + +// A hybiFrameReader is a reader for hybi frame. +type hybiFrameReader struct { + reader io.Reader + + header hybiFrameHeader + pos int64 + length int +} + +func (frame *hybiFrameReader) Read(msg []byte) (n int, err error) { + n, err = frame.reader.Read(msg) + if frame.header.MaskingKey != nil { + for i := 0; i < n; i++ { + msg[i] = msg[i] ^ frame.header.MaskingKey[frame.pos%4] + frame.pos++ + } + } + return n, err +} + +func (frame *hybiFrameReader) PayloadType() byte { return frame.header.OpCode } + +func (frame *hybiFrameReader) HeaderReader() io.Reader { + if frame.header.data == nil { + return nil + } + if frame.header.data.Len() == 0 { + return nil + } + return frame.header.data +} + +func (frame *hybiFrameReader) TrailerReader() io.Reader { return nil } + +func (frame *hybiFrameReader) Len() (n int) { return frame.length } + +// A hybiFrameReaderFactory creates new frame reader based on its frame type. +type hybiFrameReaderFactory struct { + *bufio.Reader +} + +// NewFrameReader reads a frame header from the connection, and creates new reader for the frame. +// See Section 5.2 Base Framing protocol for detail. +// http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17#section-5.2 +func (buf hybiFrameReaderFactory) NewFrameReader() (frame frameReader, err error) { + hybiFrame := new(hybiFrameReader) + frame = hybiFrame + var header []byte + var b byte + // First byte. FIN/RSV1/RSV2/RSV3/OpCode(4bits) + b, err = buf.ReadByte() + if err != nil { + return + } + header = append(header, b) + hybiFrame.header.Fin = ((header[0] >> 7) & 1) != 0 + for i := 0; i < 3; i++ { + j := uint(6 - i) + hybiFrame.header.Rsv[i] = ((header[0] >> j) & 1) != 0 + } + hybiFrame.header.OpCode = header[0] & 0x0f + + // Second byte. Mask/Payload len(7bits) + b, err = buf.ReadByte() + if err != nil { + return + } + header = append(header, b) + mask := (b & 0x80) != 0 + b &= 0x7f + lengthFields := 0 + switch { + case b <= 125: // Payload length 7bits. + hybiFrame.header.Length = int64(b) + case b == 126: // Payload length 7+16bits + lengthFields = 2 + case b == 127: // Payload length 7+64bits + lengthFields = 8 + } + for i := 0; i < lengthFields; i++ { + b, err = buf.ReadByte() + if err != nil { + return + } + if lengthFields == 8 && i == 0 { // MSB must be zero when 7+64 bits + b &= 0x7f + } + header = append(header, b) + hybiFrame.header.Length = hybiFrame.header.Length*256 + int64(b) + } + if mask { + // Masking key. 4 bytes. + for i := 0; i < 4; i++ { + b, err = buf.ReadByte() + if err != nil { + return + } + header = append(header, b) + hybiFrame.header.MaskingKey = append(hybiFrame.header.MaskingKey, b) + } + } + hybiFrame.reader = io.LimitReader(buf.Reader, hybiFrame.header.Length) + hybiFrame.header.data = bytes.NewBuffer(header) + hybiFrame.length = len(header) + int(hybiFrame.header.Length) + return +} + +// A HybiFrameWriter is a writer for hybi frame. +type hybiFrameWriter struct { + writer *bufio.Writer + + header *hybiFrameHeader +} + +func (frame *hybiFrameWriter) Write(msg []byte) (n int, err error) { + var header []byte + var b byte + if frame.header.Fin { + b |= 0x80 + } + for i := 0; i < 3; i++ { + if frame.header.Rsv[i] { + j := uint(6 - i) + b |= 1 << j + } + } + b |= frame.header.OpCode + header = append(header, b) + if frame.header.MaskingKey != nil { + b = 0x80 + } else { + b = 0 + } + lengthFields := 0 + length := len(msg) + switch { + case length <= 125: + b |= byte(length) + case length < 65536: + b |= 126 + lengthFields = 2 + default: + b |= 127 + lengthFields = 8 + } + header = append(header, b) + for i := 0; i < lengthFields; i++ { + j := uint((lengthFields - i - 1) * 8) + b = byte((length >> j) & 0xff) + header = append(header, b) + } + if frame.header.MaskingKey != nil { + if len(frame.header.MaskingKey) != 4 { + return 0, ErrBadMaskingKey + } + header = append(header, frame.header.MaskingKey...) + frame.writer.Write(header) + data := make([]byte, length) + for i := range data { + data[i] = msg[i] ^ frame.header.MaskingKey[i%4] + } + frame.writer.Write(data) + err = frame.writer.Flush() + return length, err + } + frame.writer.Write(header) + frame.writer.Write(msg) + err = frame.writer.Flush() + return length, err +} + +func (frame *hybiFrameWriter) Close() error { return nil } + +type hybiFrameWriterFactory struct { + *bufio.Writer + needMaskingKey bool +} + +func (buf hybiFrameWriterFactory) NewFrameWriter(payloadType byte) (frame frameWriter, err error) { + frameHeader := &hybiFrameHeader{Fin: true, OpCode: payloadType} + if buf.needMaskingKey { + frameHeader.MaskingKey, err = generateMaskingKey() + if err != nil { + return nil, err + } + } + return &hybiFrameWriter{writer: buf.Writer, header: frameHeader}, nil +} + +type hybiFrameHandler struct { + conn *Conn + payloadType byte +} + +func (handler *hybiFrameHandler) HandleFrame(frame frameReader) (frameReader, error) { + if handler.conn.IsServerConn() { + // The client MUST mask all frames sent to the server. + if frame.(*hybiFrameReader).header.MaskingKey == nil { + handler.WriteClose(closeStatusProtocolError) + return nil, io.EOF + } + } else { + // The server MUST NOT mask all frames. + if frame.(*hybiFrameReader).header.MaskingKey != nil { + handler.WriteClose(closeStatusProtocolError) + return nil, io.EOF + } + } + if header := frame.HeaderReader(); header != nil { + io.Copy(ioutil.Discard, header) + } + switch frame.PayloadType() { + case ContinuationFrame: + frame.(*hybiFrameReader).header.OpCode = handler.payloadType + case TextFrame, BinaryFrame: + handler.payloadType = frame.PayloadType() + case CloseFrame: + return nil, io.EOF + case PingFrame, PongFrame: + b := make([]byte, maxControlFramePayloadLength) + n, err := io.ReadFull(frame, b) + if err != nil && err != io.EOF && err != io.ErrUnexpectedEOF { + return nil, err + } + io.Copy(ioutil.Discard, frame) + if frame.PayloadType() == PingFrame { + if _, err := handler.WritePong(b[:n]); err != nil { + return nil, err + } + } + return nil, nil + } + return frame, nil +} + +func (handler *hybiFrameHandler) WriteClose(status int) (err error) { + handler.conn.wio.Lock() + defer handler.conn.wio.Unlock() + w, err := handler.conn.frameWriterFactory.NewFrameWriter(CloseFrame) + if err != nil { + return err + } + msg := make([]byte, 2) + binary.BigEndian.PutUint16(msg, uint16(status)) + _, err = w.Write(msg) + w.Close() + return err +} + +func (handler *hybiFrameHandler) WritePong(msg []byte) (n int, err error) { + handler.conn.wio.Lock() + defer handler.conn.wio.Unlock() + w, err := handler.conn.frameWriterFactory.NewFrameWriter(PongFrame) + if err != nil { + return 0, err + } + n, err = w.Write(msg) + w.Close() + return n, err +} + +// newHybiConn creates a new WebSocket connection speaking hybi draft protocol. +func newHybiConn(config *Config, buf *bufio.ReadWriter, rwc io.ReadWriteCloser, request *http.Request) *Conn { + if buf == nil { + br := bufio.NewReader(rwc) + bw := bufio.NewWriter(rwc) + buf = bufio.NewReadWriter(br, bw) + } + ws := &Conn{config: config, request: request, buf: buf, rwc: rwc, + frameReaderFactory: hybiFrameReaderFactory{buf.Reader}, + frameWriterFactory: hybiFrameWriterFactory{ + buf.Writer, request == nil}, + PayloadType: TextFrame, + defaultCloseStatus: closeStatusNormal} + ws.frameHandler = &hybiFrameHandler{conn: ws} + return ws +} + +// generateMaskingKey generates a masking key for a frame. +func generateMaskingKey() (maskingKey []byte, err error) { + maskingKey = make([]byte, 4) + if _, err = io.ReadFull(rand.Reader, maskingKey); err != nil { + return + } + return +} + +// generateNonce generates a nonce consisting of a randomly selected 16-byte +// value that has been base64-encoded. +func generateNonce() (nonce []byte) { + key := make([]byte, 16) + if _, err := io.ReadFull(rand.Reader, key); err != nil { + panic(err) + } + nonce = make([]byte, 24) + base64.StdEncoding.Encode(nonce, key) + return +} + +// removeZone removes IPv6 zone identifer from host. +// E.g., "[fe80::1%en0]:8080" to "[fe80::1]:8080" +func removeZone(host string) string { + if !strings.HasPrefix(host, "[") { + return host + } + i := strings.LastIndex(host, "]") + if i < 0 { + return host + } + j := strings.LastIndex(host[:i], "%") + if j < 0 { + return host + } + return host[:j] + host[i:] +} + +// getNonceAccept computes the base64-encoded SHA-1 of the concatenation of +// the nonce ("Sec-WebSocket-Key" value) with the websocket GUID string. +func getNonceAccept(nonce []byte) (expected []byte, err error) { + h := sha1.New() + if _, err = h.Write(nonce); err != nil { + return + } + if _, err = h.Write([]byte(websocketGUID)); err != nil { + return + } + expected = make([]byte, 28) + base64.StdEncoding.Encode(expected, h.Sum(nil)) + return +} + +// Client handshake described in draft-ietf-hybi-thewebsocket-protocol-17 +func hybiClientHandshake(config *Config, br *bufio.Reader, bw *bufio.Writer) (err error) { + bw.WriteString("GET " + config.Location.RequestURI() + " HTTP/1.1\r\n") + + // According to RFC 6874, an HTTP client, proxy, or other + // intermediary must remove any IPv6 zone identifier attached + // to an outgoing URI. + bw.WriteString("Host: " + removeZone(config.Location.Host) + "\r\n") + bw.WriteString("Upgrade: websocket\r\n") + bw.WriteString("Connection: Upgrade\r\n") + nonce := generateNonce() + if config.handshakeData != nil { + nonce = []byte(config.handshakeData["key"]) + } + bw.WriteString("Sec-WebSocket-Key: " + string(nonce) + "\r\n") + bw.WriteString("Origin: " + strings.ToLower(config.Origin.String()) + "\r\n") + + if config.Version != ProtocolVersionHybi13 { + return ErrBadProtocolVersion + } + + bw.WriteString("Sec-WebSocket-Version: " + fmt.Sprintf("%d", config.Version) + "\r\n") + if len(config.Protocol) > 0 { + bw.WriteString("Sec-WebSocket-Protocol: " + strings.Join(config.Protocol, ", ") + "\r\n") + } + // TODO(ukai): send Sec-WebSocket-Extensions. + err = config.Header.WriteSubset(bw, handshakeHeader) + if err != nil { + return err + } + + bw.WriteString("\r\n") + if err = bw.Flush(); err != nil { + return err + } + + resp, err := http.ReadResponse(br, &http.Request{Method: "GET"}) + if err != nil { + return err + } + if resp.StatusCode != 101 { + return ErrBadStatus + } + if strings.ToLower(resp.Header.Get("Upgrade")) != "websocket" || + strings.ToLower(resp.Header.Get("Connection")) != "upgrade" { + return ErrBadUpgrade + } + expectedAccept, err := getNonceAccept(nonce) + if err != nil { + return err + } + if resp.Header.Get("Sec-WebSocket-Accept") != string(expectedAccept) { + return ErrChallengeResponse + } + if resp.Header.Get("Sec-WebSocket-Extensions") != "" { + return ErrUnsupportedExtensions + } + offeredProtocol := resp.Header.Get("Sec-WebSocket-Protocol") + if offeredProtocol != "" { + protocolMatched := false + for i := 0; i < len(config.Protocol); i++ { + if config.Protocol[i] == offeredProtocol { + protocolMatched = true + break + } + } + if !protocolMatched { + return ErrBadWebSocketProtocol + } + config.Protocol = []string{offeredProtocol} + } + + return nil +} + +// newHybiClientConn creates a client WebSocket connection after handshake. +func newHybiClientConn(config *Config, buf *bufio.ReadWriter, rwc io.ReadWriteCloser) *Conn { + return newHybiConn(config, buf, rwc, nil) +} + +// A HybiServerHandshaker performs a server handshake using hybi draft protocol. +type hybiServerHandshaker struct { + *Config + accept []byte +} + +func (c *hybiServerHandshaker) ReadHandshake(buf *bufio.Reader, req *http.Request) (code int, err error) { + c.Version = ProtocolVersionHybi13 + if req.Method != "GET" { + return http.StatusMethodNotAllowed, ErrBadRequestMethod + } + // HTTP version can be safely ignored. + + if strings.ToLower(req.Header.Get("Upgrade")) != "websocket" || + !strings.Contains(strings.ToLower(req.Header.Get("Connection")), "upgrade") { + return http.StatusBadRequest, ErrNotWebSocket + } + + key := req.Header.Get("Sec-Websocket-Key") + if key == "" { + return http.StatusBadRequest, ErrChallengeResponse + } + version := req.Header.Get("Sec-Websocket-Version") + switch version { + case "13": + c.Version = ProtocolVersionHybi13 + default: + return http.StatusBadRequest, ErrBadWebSocketVersion + } + var scheme string + if req.TLS != nil { + scheme = "wss" + } else { + scheme = "ws" + } + c.Location, err = url.ParseRequestURI(scheme + "://" + req.Host + req.URL.RequestURI()) + if err != nil { + return http.StatusBadRequest, err + } + protocol := strings.TrimSpace(req.Header.Get("Sec-Websocket-Protocol")) + if protocol != "" { + protocols := strings.Split(protocol, ",") + for i := 0; i < len(protocols); i++ { + c.Protocol = append(c.Protocol, strings.TrimSpace(protocols[i])) + } + } + c.accept, err = getNonceAccept([]byte(key)) + if err != nil { + return http.StatusInternalServerError, err + } + return http.StatusSwitchingProtocols, nil +} + +// Origin parses the Origin header in req. +// If the Origin header is not set, it returns nil and nil. +func Origin(config *Config, req *http.Request) (*url.URL, error) { + var origin string + switch config.Version { + case ProtocolVersionHybi13: + origin = req.Header.Get("Origin") + } + if origin == "" { + return nil, nil + } + return url.ParseRequestURI(origin) +} + +func (c *hybiServerHandshaker) AcceptHandshake(buf *bufio.Writer) (err error) { + if len(c.Protocol) > 0 { + if len(c.Protocol) != 1 { + // You need choose a Protocol in Handshake func in Server. + return ErrBadWebSocketProtocol + } + } + buf.WriteString("HTTP/1.1 101 Switching Protocols\r\n") + buf.WriteString("Upgrade: websocket\r\n") + buf.WriteString("Connection: Upgrade\r\n") + buf.WriteString("Sec-WebSocket-Accept: " + string(c.accept) + "\r\n") + if len(c.Protocol) > 0 { + buf.WriteString("Sec-WebSocket-Protocol: " + c.Protocol[0] + "\r\n") + } + // TODO(ukai): send Sec-WebSocket-Extensions. + if c.Header != nil { + err := c.Header.WriteSubset(buf, handshakeHeader) + if err != nil { + return err + } + } + buf.WriteString("\r\n") + return buf.Flush() +} + +func (c *hybiServerHandshaker) NewServerConn(buf *bufio.ReadWriter, rwc io.ReadWriteCloser, request *http.Request) *Conn { + return newHybiServerConn(c.Config, buf, rwc, request) +} + +// newHybiServerConn returns a new WebSocket connection speaking hybi draft protocol. +func newHybiServerConn(config *Config, buf *bufio.ReadWriter, rwc io.ReadWriteCloser, request *http.Request) *Conn { + return newHybiConn(config, buf, rwc, request) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/hybi_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/hybi_test.go new file mode 100644 index 0000000..9504aa2 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/hybi_test.go @@ -0,0 +1,608 @@ +// 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 websocket + +import ( + "bufio" + "bytes" + "fmt" + "io" + "net/http" + "net/url" + "strings" + "testing" +) + +// Test the getNonceAccept function with values in +// http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17 +func TestSecWebSocketAccept(t *testing.T) { + nonce := []byte("dGhlIHNhbXBsZSBub25jZQ==") + expected := []byte("s3pPLMBiTxaQ9kYGzzhZRbK+xOo=") + accept, err := getNonceAccept(nonce) + if err != nil { + t.Errorf("getNonceAccept: returned error %v", err) + return + } + if !bytes.Equal(expected, accept) { + t.Errorf("getNonceAccept: expected %q got %q", expected, accept) + } +} + +func TestHybiClientHandshake(t *testing.T) { + type test struct { + url, host string + } + tests := []test{ + {"ws://server.example.com/chat", "server.example.com"}, + {"ws://127.0.0.1/chat", "127.0.0.1"}, + } + if _, err := url.ParseRequestURI("http://[fe80::1%25lo0]"); err == nil { + tests = append(tests, test{"ws://[fe80::1%25lo0]/chat", "[fe80::1]"}) + } + + for _, tt := range tests { + var b bytes.Buffer + bw := bufio.NewWriter(&b) + br := bufio.NewReader(strings.NewReader(`HTTP/1.1 101 Switching Protocols +Upgrade: websocket +Connection: Upgrade +Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= +Sec-WebSocket-Protocol: chat + +`)) + var err error + var config Config + config.Location, err = url.ParseRequestURI(tt.url) + if err != nil { + t.Fatal("location url", err) + } + config.Origin, err = url.ParseRequestURI("http://example.com") + if err != nil { + t.Fatal("origin url", err) + } + config.Protocol = append(config.Protocol, "chat") + config.Protocol = append(config.Protocol, "superchat") + config.Version = ProtocolVersionHybi13 + config.handshakeData = map[string]string{ + "key": "dGhlIHNhbXBsZSBub25jZQ==", + } + if err := hybiClientHandshake(&config, br, bw); err != nil { + t.Fatal("handshake", err) + } + req, err := http.ReadRequest(bufio.NewReader(&b)) + if err != nil { + t.Fatal("read request", err) + } + if req.Method != "GET" { + t.Errorf("request method expected GET, but got %s", req.Method) + } + if req.URL.Path != "/chat" { + t.Errorf("request path expected /chat, but got %s", req.URL.Path) + } + if req.Proto != "HTTP/1.1" { + t.Errorf("request proto expected HTTP/1.1, but got %s", req.Proto) + } + if req.Host != tt.host { + t.Errorf("request host expected %s, but got %s", tt.host, req.Host) + } + var expectedHeader = map[string]string{ + "Connection": "Upgrade", + "Upgrade": "websocket", + "Sec-Websocket-Key": config.handshakeData["key"], + "Origin": config.Origin.String(), + "Sec-Websocket-Protocol": "chat, superchat", + "Sec-Websocket-Version": fmt.Sprintf("%d", ProtocolVersionHybi13), + } + for k, v := range expectedHeader { + if req.Header.Get(k) != v { + t.Errorf("%s expected %s, but got %v", k, v, req.Header.Get(k)) + } + } + } +} + +func TestHybiClientHandshakeWithHeader(t *testing.T) { + b := bytes.NewBuffer([]byte{}) + bw := bufio.NewWriter(b) + br := bufio.NewReader(strings.NewReader(`HTTP/1.1 101 Switching Protocols +Upgrade: websocket +Connection: Upgrade +Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= +Sec-WebSocket-Protocol: chat + +`)) + var err error + config := new(Config) + config.Location, err = url.ParseRequestURI("ws://server.example.com/chat") + if err != nil { + t.Fatal("location url", err) + } + config.Origin, err = url.ParseRequestURI("http://example.com") + if err != nil { + t.Fatal("origin url", err) + } + config.Protocol = append(config.Protocol, "chat") + config.Protocol = append(config.Protocol, "superchat") + config.Version = ProtocolVersionHybi13 + config.Header = http.Header(make(map[string][]string)) + config.Header.Add("User-Agent", "test") + + config.handshakeData = map[string]string{ + "key": "dGhlIHNhbXBsZSBub25jZQ==", + } + err = hybiClientHandshake(config, br, bw) + if err != nil { + t.Errorf("handshake failed: %v", err) + } + req, err := http.ReadRequest(bufio.NewReader(b)) + if err != nil { + t.Fatalf("read request: %v", err) + } + if req.Method != "GET" { + t.Errorf("request method expected GET, but got %q", req.Method) + } + if req.URL.Path != "/chat" { + t.Errorf("request path expected /chat, but got %q", req.URL.Path) + } + if req.Proto != "HTTP/1.1" { + t.Errorf("request proto expected HTTP/1.1, but got %q", req.Proto) + } + if req.Host != "server.example.com" { + t.Errorf("request Host expected server.example.com, but got %v", req.Host) + } + var expectedHeader = map[string]string{ + "Connection": "Upgrade", + "Upgrade": "websocket", + "Sec-Websocket-Key": config.handshakeData["key"], + "Origin": config.Origin.String(), + "Sec-Websocket-Protocol": "chat, superchat", + "Sec-Websocket-Version": fmt.Sprintf("%d", ProtocolVersionHybi13), + "User-Agent": "test", + } + for k, v := range expectedHeader { + if req.Header.Get(k) != v { + t.Errorf(fmt.Sprintf("%s expected %q but got %q", k, v, req.Header.Get(k))) + } + } +} + +func TestHybiServerHandshake(t *testing.T) { + config := new(Config) + handshaker := &hybiServerHandshaker{Config: config} + br := bufio.NewReader(strings.NewReader(`GET /chat HTTP/1.1 +Host: server.example.com +Upgrade: websocket +Connection: Upgrade +Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== +Origin: http://example.com +Sec-WebSocket-Protocol: chat, superchat +Sec-WebSocket-Version: 13 + +`)) + req, err := http.ReadRequest(br) + if err != nil { + t.Fatal("request", err) + } + code, err := handshaker.ReadHandshake(br, req) + if err != nil { + t.Errorf("handshake failed: %v", err) + } + if code != http.StatusSwitchingProtocols { + t.Errorf("status expected %q but got %q", http.StatusSwitchingProtocols, code) + } + expectedProtocols := []string{"chat", "superchat"} + if fmt.Sprintf("%v", config.Protocol) != fmt.Sprintf("%v", expectedProtocols) { + t.Errorf("protocol expected %q but got %q", expectedProtocols, config.Protocol) + } + b := bytes.NewBuffer([]byte{}) + bw := bufio.NewWriter(b) + + config.Protocol = config.Protocol[:1] + + err = handshaker.AcceptHandshake(bw) + if err != nil { + t.Errorf("handshake response failed: %v", err) + } + expectedResponse := strings.Join([]string{ + "HTTP/1.1 101 Switching Protocols", + "Upgrade: websocket", + "Connection: Upgrade", + "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=", + "Sec-WebSocket-Protocol: chat", + "", ""}, "\r\n") + + if b.String() != expectedResponse { + t.Errorf("handshake expected %q but got %q", expectedResponse, b.String()) + } +} + +func TestHybiServerHandshakeNoSubProtocol(t *testing.T) { + config := new(Config) + handshaker := &hybiServerHandshaker{Config: config} + br := bufio.NewReader(strings.NewReader(`GET /chat HTTP/1.1 +Host: server.example.com +Upgrade: websocket +Connection: Upgrade +Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== +Origin: http://example.com +Sec-WebSocket-Version: 13 + +`)) + req, err := http.ReadRequest(br) + if err != nil { + t.Fatal("request", err) + } + code, err := handshaker.ReadHandshake(br, req) + if err != nil { + t.Errorf("handshake failed: %v", err) + } + if code != http.StatusSwitchingProtocols { + t.Errorf("status expected %q but got %q", http.StatusSwitchingProtocols, code) + } + if len(config.Protocol) != 0 { + t.Errorf("len(config.Protocol) expected 0, but got %q", len(config.Protocol)) + } + b := bytes.NewBuffer([]byte{}) + bw := bufio.NewWriter(b) + + err = handshaker.AcceptHandshake(bw) + if err != nil { + t.Errorf("handshake response failed: %v", err) + } + expectedResponse := strings.Join([]string{ + "HTTP/1.1 101 Switching Protocols", + "Upgrade: websocket", + "Connection: Upgrade", + "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=", + "", ""}, "\r\n") + + if b.String() != expectedResponse { + t.Errorf("handshake expected %q but got %q", expectedResponse, b.String()) + } +} + +func TestHybiServerHandshakeHybiBadVersion(t *testing.T) { + config := new(Config) + handshaker := &hybiServerHandshaker{Config: config} + br := bufio.NewReader(strings.NewReader(`GET /chat HTTP/1.1 +Host: server.example.com +Upgrade: websocket +Connection: Upgrade +Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== +Sec-WebSocket-Origin: http://example.com +Sec-WebSocket-Protocol: chat, superchat +Sec-WebSocket-Version: 9 + +`)) + req, err := http.ReadRequest(br) + if err != nil { + t.Fatal("request", err) + } + code, err := handshaker.ReadHandshake(br, req) + if err != ErrBadWebSocketVersion { + t.Errorf("handshake expected err %q but got %q", ErrBadWebSocketVersion, err) + } + if code != http.StatusBadRequest { + t.Errorf("status expected %q but got %q", http.StatusBadRequest, code) + } +} + +func testHybiFrame(t *testing.T, testHeader, testPayload, testMaskedPayload []byte, frameHeader *hybiFrameHeader) { + b := bytes.NewBuffer([]byte{}) + frameWriterFactory := &hybiFrameWriterFactory{bufio.NewWriter(b), false} + w, _ := frameWriterFactory.NewFrameWriter(TextFrame) + w.(*hybiFrameWriter).header = frameHeader + _, err := w.Write(testPayload) + w.Close() + if err != nil { + t.Errorf("Write error %q", err) + } + var expectedFrame []byte + expectedFrame = append(expectedFrame, testHeader...) + expectedFrame = append(expectedFrame, testMaskedPayload...) + if !bytes.Equal(expectedFrame, b.Bytes()) { + t.Errorf("frame expected %q got %q", expectedFrame, b.Bytes()) + } + frameReaderFactory := &hybiFrameReaderFactory{bufio.NewReader(b)} + r, err := frameReaderFactory.NewFrameReader() + if err != nil { + t.Errorf("Read error %q", err) + } + if header := r.HeaderReader(); header == nil { + t.Errorf("no header") + } else { + actualHeader := make([]byte, r.Len()) + n, err := header.Read(actualHeader) + if err != nil { + t.Errorf("Read header error %q", err) + } else { + if n < len(testHeader) { + t.Errorf("header too short %q got %q", testHeader, actualHeader[:n]) + } + if !bytes.Equal(testHeader, actualHeader[:n]) { + t.Errorf("header expected %q got %q", testHeader, actualHeader[:n]) + } + } + } + if trailer := r.TrailerReader(); trailer != nil { + t.Errorf("unexpected trailer %q", trailer) + } + frame := r.(*hybiFrameReader) + if frameHeader.Fin != frame.header.Fin || + frameHeader.OpCode != frame.header.OpCode || + len(testPayload) != int(frame.header.Length) { + t.Errorf("mismatch %v (%d) vs %v", frameHeader, len(testPayload), frame) + } + payload := make([]byte, len(testPayload)) + _, err = r.Read(payload) + if err != nil && err != io.EOF { + t.Errorf("read %v", err) + } + if !bytes.Equal(testPayload, payload) { + t.Errorf("payload %q vs %q", testPayload, payload) + } +} + +func TestHybiShortTextFrame(t *testing.T) { + frameHeader := &hybiFrameHeader{Fin: true, OpCode: TextFrame} + payload := []byte("hello") + testHybiFrame(t, []byte{0x81, 0x05}, payload, payload, frameHeader) + + payload = make([]byte, 125) + testHybiFrame(t, []byte{0x81, 125}, payload, payload, frameHeader) +} + +func TestHybiShortMaskedTextFrame(t *testing.T) { + frameHeader := &hybiFrameHeader{Fin: true, OpCode: TextFrame, + MaskingKey: []byte{0xcc, 0x55, 0x80, 0x20}} + payload := []byte("hello") + maskedPayload := []byte{0xa4, 0x30, 0xec, 0x4c, 0xa3} + header := []byte{0x81, 0x85} + header = append(header, frameHeader.MaskingKey...) + testHybiFrame(t, header, payload, maskedPayload, frameHeader) +} + +func TestHybiShortBinaryFrame(t *testing.T) { + frameHeader := &hybiFrameHeader{Fin: true, OpCode: BinaryFrame} + payload := []byte("hello") + testHybiFrame(t, []byte{0x82, 0x05}, payload, payload, frameHeader) + + payload = make([]byte, 125) + testHybiFrame(t, []byte{0x82, 125}, payload, payload, frameHeader) +} + +func TestHybiControlFrame(t *testing.T) { + payload := []byte("hello") + + frameHeader := &hybiFrameHeader{Fin: true, OpCode: PingFrame} + testHybiFrame(t, []byte{0x89, 0x05}, payload, payload, frameHeader) + + frameHeader = &hybiFrameHeader{Fin: true, OpCode: PingFrame} + testHybiFrame(t, []byte{0x89, 0x00}, nil, nil, frameHeader) + + frameHeader = &hybiFrameHeader{Fin: true, OpCode: PongFrame} + testHybiFrame(t, []byte{0x8A, 0x05}, payload, payload, frameHeader) + + frameHeader = &hybiFrameHeader{Fin: true, OpCode: PongFrame} + testHybiFrame(t, []byte{0x8A, 0x00}, nil, nil, frameHeader) + + frameHeader = &hybiFrameHeader{Fin: true, OpCode: CloseFrame} + payload = []byte{0x03, 0xe8} // 1000 + testHybiFrame(t, []byte{0x88, 0x02}, payload, payload, frameHeader) +} + +func TestHybiLongFrame(t *testing.T) { + frameHeader := &hybiFrameHeader{Fin: true, OpCode: TextFrame} + payload := make([]byte, 126) + testHybiFrame(t, []byte{0x81, 126, 0x00, 126}, payload, payload, frameHeader) + + payload = make([]byte, 65535) + testHybiFrame(t, []byte{0x81, 126, 0xff, 0xff}, payload, payload, frameHeader) + + payload = make([]byte, 65536) + testHybiFrame(t, []byte{0x81, 127, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00}, payload, payload, frameHeader) +} + +func TestHybiClientRead(t *testing.T) { + wireData := []byte{0x81, 0x05, 'h', 'e', 'l', 'l', 'o', + 0x89, 0x05, 'h', 'e', 'l', 'l', 'o', // ping + 0x81, 0x05, 'w', 'o', 'r', 'l', 'd'} + br := bufio.NewReader(bytes.NewBuffer(wireData)) + bw := bufio.NewWriter(bytes.NewBuffer([]byte{})) + conn := newHybiConn(newConfig(t, "/"), bufio.NewReadWriter(br, bw), nil, nil) + + msg := make([]byte, 512) + n, err := conn.Read(msg) + if err != nil { + t.Errorf("read 1st frame, error %q", err) + } + if n != 5 { + t.Errorf("read 1st frame, expect 5, got %d", n) + } + if !bytes.Equal(wireData[2:7], msg[:n]) { + t.Errorf("read 1st frame %v, got %v", wireData[2:7], msg[:n]) + } + n, err = conn.Read(msg) + if err != nil { + t.Errorf("read 2nd frame, error %q", err) + } + if n != 5 { + t.Errorf("read 2nd frame, expect 5, got %d", n) + } + if !bytes.Equal(wireData[16:21], msg[:n]) { + t.Errorf("read 2nd frame %v, got %v", wireData[16:21], msg[:n]) + } + n, err = conn.Read(msg) + if err == nil { + t.Errorf("read not EOF") + } + if n != 0 { + t.Errorf("expect read 0, got %d", n) + } +} + +func TestHybiShortRead(t *testing.T) { + wireData := []byte{0x81, 0x05, 'h', 'e', 'l', 'l', 'o', + 0x89, 0x05, 'h', 'e', 'l', 'l', 'o', // ping + 0x81, 0x05, 'w', 'o', 'r', 'l', 'd'} + br := bufio.NewReader(bytes.NewBuffer(wireData)) + bw := bufio.NewWriter(bytes.NewBuffer([]byte{})) + conn := newHybiConn(newConfig(t, "/"), bufio.NewReadWriter(br, bw), nil, nil) + + step := 0 + pos := 0 + expectedPos := []int{2, 5, 16, 19} + expectedLen := []int{3, 2, 3, 2} + for { + msg := make([]byte, 3) + n, err := conn.Read(msg) + if step >= len(expectedPos) { + if err == nil { + t.Errorf("read not EOF") + } + if n != 0 { + t.Errorf("expect read 0, got %d", n) + } + return + } + pos = expectedPos[step] + endPos := pos + expectedLen[step] + if err != nil { + t.Errorf("read from %d, got error %q", pos, err) + return + } + if n != endPos-pos { + t.Errorf("read from %d, expect %d, got %d", pos, endPos-pos, n) + } + if !bytes.Equal(wireData[pos:endPos], msg[:n]) { + t.Errorf("read from %d, frame %v, got %v", pos, wireData[pos:endPos], msg[:n]) + } + step++ + } +} + +func TestHybiServerRead(t *testing.T) { + wireData := []byte{0x81, 0x85, 0xcc, 0x55, 0x80, 0x20, + 0xa4, 0x30, 0xec, 0x4c, 0xa3, // hello + 0x89, 0x85, 0xcc, 0x55, 0x80, 0x20, + 0xa4, 0x30, 0xec, 0x4c, 0xa3, // ping: hello + 0x81, 0x85, 0xed, 0x83, 0xb4, 0x24, + 0x9a, 0xec, 0xc6, 0x48, 0x89, // world + } + br := bufio.NewReader(bytes.NewBuffer(wireData)) + bw := bufio.NewWriter(bytes.NewBuffer([]byte{})) + conn := newHybiConn(newConfig(t, "/"), bufio.NewReadWriter(br, bw), nil, new(http.Request)) + + expected := [][]byte{[]byte("hello"), []byte("world")} + + msg := make([]byte, 512) + n, err := conn.Read(msg) + if err != nil { + t.Errorf("read 1st frame, error %q", err) + } + if n != 5 { + t.Errorf("read 1st frame, expect 5, got %d", n) + } + if !bytes.Equal(expected[0], msg[:n]) { + t.Errorf("read 1st frame %q, got %q", expected[0], msg[:n]) + } + + n, err = conn.Read(msg) + if err != nil { + t.Errorf("read 2nd frame, error %q", err) + } + if n != 5 { + t.Errorf("read 2nd frame, expect 5, got %d", n) + } + if !bytes.Equal(expected[1], msg[:n]) { + t.Errorf("read 2nd frame %q, got %q", expected[1], msg[:n]) + } + + n, err = conn.Read(msg) + if err == nil { + t.Errorf("read not EOF") + } + if n != 0 { + t.Errorf("expect read 0, got %d", n) + } +} + +func TestHybiServerReadWithoutMasking(t *testing.T) { + wireData := []byte{0x81, 0x05, 'h', 'e', 'l', 'l', 'o'} + br := bufio.NewReader(bytes.NewBuffer(wireData)) + bw := bufio.NewWriter(bytes.NewBuffer([]byte{})) + conn := newHybiConn(newConfig(t, "/"), bufio.NewReadWriter(br, bw), nil, new(http.Request)) + // server MUST close the connection upon receiving a non-masked frame. + msg := make([]byte, 512) + _, err := conn.Read(msg) + if err != io.EOF { + t.Errorf("read 1st frame, expect %q, but got %q", io.EOF, err) + } +} + +func TestHybiClientReadWithMasking(t *testing.T) { + wireData := []byte{0x81, 0x85, 0xcc, 0x55, 0x80, 0x20, + 0xa4, 0x30, 0xec, 0x4c, 0xa3, // hello + } + br := bufio.NewReader(bytes.NewBuffer(wireData)) + bw := bufio.NewWriter(bytes.NewBuffer([]byte{})) + conn := newHybiConn(newConfig(t, "/"), bufio.NewReadWriter(br, bw), nil, nil) + + // client MUST close the connection upon receiving a masked frame. + msg := make([]byte, 512) + _, err := conn.Read(msg) + if err != io.EOF { + t.Errorf("read 1st frame, expect %q, but got %q", io.EOF, err) + } +} + +// Test the hybiServerHandshaker supports firefox implementation and +// checks Connection request header include (but it's not necessary +// equal to) "upgrade" +func TestHybiServerFirefoxHandshake(t *testing.T) { + config := new(Config) + handshaker := &hybiServerHandshaker{Config: config} + br := bufio.NewReader(strings.NewReader(`GET /chat HTTP/1.1 +Host: server.example.com +Upgrade: websocket +Connection: keep-alive, upgrade +Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== +Origin: http://example.com +Sec-WebSocket-Protocol: chat, superchat +Sec-WebSocket-Version: 13 + +`)) + req, err := http.ReadRequest(br) + if err != nil { + t.Fatal("request", err) + } + code, err := handshaker.ReadHandshake(br, req) + if err != nil { + t.Errorf("handshake failed: %v", err) + } + if code != http.StatusSwitchingProtocols { + t.Errorf("status expected %q but got %q", http.StatusSwitchingProtocols, code) + } + b := bytes.NewBuffer([]byte{}) + bw := bufio.NewWriter(b) + + config.Protocol = []string{"chat"} + + err = handshaker.AcceptHandshake(bw) + if err != nil { + t.Errorf("handshake response failed: %v", err) + } + expectedResponse := strings.Join([]string{ + "HTTP/1.1 101 Switching Protocols", + "Upgrade: websocket", + "Connection: Upgrade", + "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=", + "Sec-WebSocket-Protocol: chat", + "", ""}, "\r\n") + + if b.String() != expectedResponse { + t.Errorf("handshake expected %q but got %q", expectedResponse, b.String()) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/server.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/server.go new file mode 100644 index 0000000..0895dea --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/server.go @@ -0,0 +1,113 @@ +// 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 websocket + +import ( + "bufio" + "fmt" + "io" + "net/http" +) + +func newServerConn(rwc io.ReadWriteCloser, buf *bufio.ReadWriter, req *http.Request, config *Config, handshake func(*Config, *http.Request) error) (conn *Conn, err error) { + var hs serverHandshaker = &hybiServerHandshaker{Config: config} + code, err := hs.ReadHandshake(buf.Reader, req) + if err == ErrBadWebSocketVersion { + fmt.Fprintf(buf, "HTTP/1.1 %03d %s\r\n", code, http.StatusText(code)) + fmt.Fprintf(buf, "Sec-WebSocket-Version: %s\r\n", SupportedProtocolVersion) + buf.WriteString("\r\n") + buf.WriteString(err.Error()) + buf.Flush() + return + } + if err != nil { + fmt.Fprintf(buf, "HTTP/1.1 %03d %s\r\n", code, http.StatusText(code)) + buf.WriteString("\r\n") + buf.WriteString(err.Error()) + buf.Flush() + return + } + if handshake != nil { + err = handshake(config, req) + if err != nil { + code = http.StatusForbidden + fmt.Fprintf(buf, "HTTP/1.1 %03d %s\r\n", code, http.StatusText(code)) + buf.WriteString("\r\n") + buf.Flush() + return + } + } + err = hs.AcceptHandshake(buf.Writer) + if err != nil { + code = http.StatusBadRequest + fmt.Fprintf(buf, "HTTP/1.1 %03d %s\r\n", code, http.StatusText(code)) + buf.WriteString("\r\n") + buf.Flush() + return + } + conn = hs.NewServerConn(buf, rwc, req) + return +} + +// Server represents a server of a WebSocket. +type Server struct { + // Config is a WebSocket configuration for new WebSocket connection. + Config + + // Handshake is an optional function in WebSocket handshake. + // For example, you can check, or don't check Origin header. + // Another example, you can select config.Protocol. + Handshake func(*Config, *http.Request) error + + // Handler handles a WebSocket connection. + Handler +} + +// ServeHTTP implements the http.Handler interface for a WebSocket +func (s Server) ServeHTTP(w http.ResponseWriter, req *http.Request) { + s.serveWebSocket(w, req) +} + +func (s Server) serveWebSocket(w http.ResponseWriter, req *http.Request) { + rwc, buf, err := w.(http.Hijacker).Hijack() + if err != nil { + panic("Hijack failed: " + err.Error()) + } + // The server should abort the WebSocket connection if it finds + // the client did not send a handshake that matches with protocol + // specification. + defer rwc.Close() + conn, err := newServerConn(rwc, buf, req, &s.Config, s.Handshake) + if err != nil { + return + } + if conn == nil { + panic("unexpected nil conn") + } + s.Handler(conn) +} + +// Handler is a simple interface to a WebSocket browser client. +// It checks if Origin header is valid URL by default. +// You might want to verify websocket.Conn.Config().Origin in the func. +// If you use Server instead of Handler, you could call websocket.Origin and +// check the origin in your Handshake func. So, if you want to accept +// non-browser clients, which do not send an Origin header, set a +// Server.Handshake that does not check the origin. +type Handler func(*Conn) + +func checkOrigin(config *Config, req *http.Request) (err error) { + config.Origin, err = Origin(config, req) + if err == nil && config.Origin == nil { + return fmt.Errorf("null origin") + } + return err +} + +// ServeHTTP implements the http.Handler interface for a WebSocket +func (h Handler) ServeHTTP(w http.ResponseWriter, req *http.Request) { + s := Server{Handler: h, Handshake: checkOrigin} + s.serveWebSocket(w, req) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/websocket.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/websocket.go new file mode 100644 index 0000000..e242c89 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/websocket.go @@ -0,0 +1,448 @@ +// 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 websocket implements a client and server for the WebSocket protocol +// as specified in RFC 6455. +// +// This package currently lacks some features found in an alternative +// and more actively maintained WebSocket package: +// +// https://godoc.org/github.com/gorilla/websocket +// +package websocket // import "golang.org/x/net/websocket" + +import ( + "bufio" + "crypto/tls" + "encoding/json" + "errors" + "io" + "io/ioutil" + "net" + "net/http" + "net/url" + "sync" + "time" +) + +const ( + ProtocolVersionHybi13 = 13 + ProtocolVersionHybi = ProtocolVersionHybi13 + SupportedProtocolVersion = "13" + + ContinuationFrame = 0 + TextFrame = 1 + BinaryFrame = 2 + CloseFrame = 8 + PingFrame = 9 + PongFrame = 10 + UnknownFrame = 255 + + DefaultMaxPayloadBytes = 32 << 20 // 32MB +) + +// ProtocolError represents WebSocket protocol errors. +type ProtocolError struct { + ErrorString string +} + +func (err *ProtocolError) Error() string { return err.ErrorString } + +var ( + ErrBadProtocolVersion = &ProtocolError{"bad protocol version"} + ErrBadScheme = &ProtocolError{"bad scheme"} + ErrBadStatus = &ProtocolError{"bad status"} + ErrBadUpgrade = &ProtocolError{"missing or bad upgrade"} + ErrBadWebSocketOrigin = &ProtocolError{"missing or bad WebSocket-Origin"} + ErrBadWebSocketLocation = &ProtocolError{"missing or bad WebSocket-Location"} + ErrBadWebSocketProtocol = &ProtocolError{"missing or bad WebSocket-Protocol"} + ErrBadWebSocketVersion = &ProtocolError{"missing or bad WebSocket Version"} + ErrChallengeResponse = &ProtocolError{"mismatch challenge/response"} + ErrBadFrame = &ProtocolError{"bad frame"} + ErrBadFrameBoundary = &ProtocolError{"not on frame boundary"} + ErrNotWebSocket = &ProtocolError{"not websocket protocol"} + ErrBadRequestMethod = &ProtocolError{"bad method"} + ErrNotSupported = &ProtocolError{"not supported"} +) + +// ErrFrameTooLarge is returned by Codec's Receive method if payload size +// exceeds limit set by Conn.MaxPayloadBytes +var ErrFrameTooLarge = errors.New("websocket: frame payload size exceeds limit") + +// Addr is an implementation of net.Addr for WebSocket. +type Addr struct { + *url.URL +} + +// Network returns the network type for a WebSocket, "websocket". +func (addr *Addr) Network() string { return "websocket" } + +// Config is a WebSocket configuration +type Config struct { + // A WebSocket server address. + Location *url.URL + + // A Websocket client origin. + Origin *url.URL + + // WebSocket subprotocols. + Protocol []string + + // WebSocket protocol version. + Version int + + // TLS config for secure WebSocket (wss). + TlsConfig *tls.Config + + // Additional header fields to be sent in WebSocket opening handshake. + Header http.Header + + // Dialer used when opening websocket connections. + Dialer *net.Dialer + + handshakeData map[string]string +} + +// serverHandshaker is an interface to handle WebSocket server side handshake. +type serverHandshaker interface { + // ReadHandshake reads handshake request message from client. + // Returns http response code and error if any. + ReadHandshake(buf *bufio.Reader, req *http.Request) (code int, err error) + + // AcceptHandshake accepts the client handshake request and sends + // handshake response back to client. + AcceptHandshake(buf *bufio.Writer) (err error) + + // NewServerConn creates a new WebSocket connection. + NewServerConn(buf *bufio.ReadWriter, rwc io.ReadWriteCloser, request *http.Request) (conn *Conn) +} + +// frameReader is an interface to read a WebSocket frame. +type frameReader interface { + // Reader is to read payload of the frame. + io.Reader + + // PayloadType returns payload type. + PayloadType() byte + + // HeaderReader returns a reader to read header of the frame. + HeaderReader() io.Reader + + // TrailerReader returns a reader to read trailer of the frame. + // If it returns nil, there is no trailer in the frame. + TrailerReader() io.Reader + + // Len returns total length of the frame, including header and trailer. + Len() int +} + +// frameReaderFactory is an interface to creates new frame reader. +type frameReaderFactory interface { + NewFrameReader() (r frameReader, err error) +} + +// frameWriter is an interface to write a WebSocket frame. +type frameWriter interface { + // Writer is to write payload of the frame. + io.WriteCloser +} + +// frameWriterFactory is an interface to create new frame writer. +type frameWriterFactory interface { + NewFrameWriter(payloadType byte) (w frameWriter, err error) +} + +type frameHandler interface { + HandleFrame(frame frameReader) (r frameReader, err error) + WriteClose(status int) (err error) +} + +// Conn represents a WebSocket connection. +// +// Multiple goroutines may invoke methods on a Conn simultaneously. +type Conn struct { + config *Config + request *http.Request + + buf *bufio.ReadWriter + rwc io.ReadWriteCloser + + rio sync.Mutex + frameReaderFactory + frameReader + + wio sync.Mutex + frameWriterFactory + + frameHandler + PayloadType byte + defaultCloseStatus int + + // MaxPayloadBytes limits the size of frame payload received over Conn + // by Codec's Receive method. If zero, DefaultMaxPayloadBytes is used. + MaxPayloadBytes int +} + +// Read implements the io.Reader interface: +// it reads data of a frame from the WebSocket connection. +// if msg is not large enough for the frame data, it fills the msg and next Read +// will read the rest of the frame data. +// it reads Text frame or Binary frame. +func (ws *Conn) Read(msg []byte) (n int, err error) { + ws.rio.Lock() + defer ws.rio.Unlock() +again: + if ws.frameReader == nil { + frame, err := ws.frameReaderFactory.NewFrameReader() + if err != nil { + return 0, err + } + ws.frameReader, err = ws.frameHandler.HandleFrame(frame) + if err != nil { + return 0, err + } + if ws.frameReader == nil { + goto again + } + } + n, err = ws.frameReader.Read(msg) + if err == io.EOF { + if trailer := ws.frameReader.TrailerReader(); trailer != nil { + io.Copy(ioutil.Discard, trailer) + } + ws.frameReader = nil + goto again + } + return n, err +} + +// Write implements the io.Writer interface: +// it writes data as a frame to the WebSocket connection. +func (ws *Conn) Write(msg []byte) (n int, err error) { + ws.wio.Lock() + defer ws.wio.Unlock() + w, err := ws.frameWriterFactory.NewFrameWriter(ws.PayloadType) + if err != nil { + return 0, err + } + n, err = w.Write(msg) + w.Close() + return n, err +} + +// Close implements the io.Closer interface. +func (ws *Conn) Close() error { + err := ws.frameHandler.WriteClose(ws.defaultCloseStatus) + err1 := ws.rwc.Close() + if err != nil { + return err + } + return err1 +} + +func (ws *Conn) IsClientConn() bool { return ws.request == nil } +func (ws *Conn) IsServerConn() bool { return ws.request != nil } + +// LocalAddr returns the WebSocket Origin for the connection for client, or +// the WebSocket location for server. +func (ws *Conn) LocalAddr() net.Addr { + if ws.IsClientConn() { + return &Addr{ws.config.Origin} + } + return &Addr{ws.config.Location} +} + +// RemoteAddr returns the WebSocket location for the connection for client, or +// the Websocket Origin for server. +func (ws *Conn) RemoteAddr() net.Addr { + if ws.IsClientConn() { + return &Addr{ws.config.Location} + } + return &Addr{ws.config.Origin} +} + +var errSetDeadline = errors.New("websocket: cannot set deadline: not using a net.Conn") + +// SetDeadline sets the connection's network read & write deadlines. +func (ws *Conn) SetDeadline(t time.Time) error { + if conn, ok := ws.rwc.(net.Conn); ok { + return conn.SetDeadline(t) + } + return errSetDeadline +} + +// SetReadDeadline sets the connection's network read deadline. +func (ws *Conn) SetReadDeadline(t time.Time) error { + if conn, ok := ws.rwc.(net.Conn); ok { + return conn.SetReadDeadline(t) + } + return errSetDeadline +} + +// SetWriteDeadline sets the connection's network write deadline. +func (ws *Conn) SetWriteDeadline(t time.Time) error { + if conn, ok := ws.rwc.(net.Conn); ok { + return conn.SetWriteDeadline(t) + } + return errSetDeadline +} + +// Config returns the WebSocket config. +func (ws *Conn) Config() *Config { return ws.config } + +// Request returns the http request upgraded to the WebSocket. +// It is nil for client side. +func (ws *Conn) Request() *http.Request { return ws.request } + +// Codec represents a symmetric pair of functions that implement a codec. +type Codec struct { + Marshal func(v interface{}) (data []byte, payloadType byte, err error) + Unmarshal func(data []byte, payloadType byte, v interface{}) (err error) +} + +// Send sends v marshaled by cd.Marshal as single frame to ws. +func (cd Codec) Send(ws *Conn, v interface{}) (err error) { + data, payloadType, err := cd.Marshal(v) + if err != nil { + return err + } + ws.wio.Lock() + defer ws.wio.Unlock() + w, err := ws.frameWriterFactory.NewFrameWriter(payloadType) + if err != nil { + return err + } + _, err = w.Write(data) + w.Close() + return err +} + +// Receive receives single frame from ws, unmarshaled by cd.Unmarshal and stores +// in v. The whole frame payload is read to an in-memory buffer; max size of +// payload is defined by ws.MaxPayloadBytes. If frame payload size exceeds +// limit, ErrFrameTooLarge is returned; in this case frame is not read off wire +// completely. The next call to Receive would read and discard leftover data of +// previous oversized frame before processing next frame. +func (cd Codec) Receive(ws *Conn, v interface{}) (err error) { + ws.rio.Lock() + defer ws.rio.Unlock() + if ws.frameReader != nil { + _, err = io.Copy(ioutil.Discard, ws.frameReader) + if err != nil { + return err + } + ws.frameReader = nil + } +again: + frame, err := ws.frameReaderFactory.NewFrameReader() + if err != nil { + return err + } + frame, err = ws.frameHandler.HandleFrame(frame) + if err != nil { + return err + } + if frame == nil { + goto again + } + maxPayloadBytes := ws.MaxPayloadBytes + if maxPayloadBytes == 0 { + maxPayloadBytes = DefaultMaxPayloadBytes + } + if hf, ok := frame.(*hybiFrameReader); ok && hf.header.Length > int64(maxPayloadBytes) { + // payload size exceeds limit, no need to call Unmarshal + // + // set frameReader to current oversized frame so that + // the next call to this function can drain leftover + // data before processing the next frame + ws.frameReader = frame + return ErrFrameTooLarge + } + payloadType := frame.PayloadType() + data, err := ioutil.ReadAll(frame) + if err != nil { + return err + } + return cd.Unmarshal(data, payloadType, v) +} + +func marshal(v interface{}) (msg []byte, payloadType byte, err error) { + switch data := v.(type) { + case string: + return []byte(data), TextFrame, nil + case []byte: + return data, BinaryFrame, nil + } + return nil, UnknownFrame, ErrNotSupported +} + +func unmarshal(msg []byte, payloadType byte, v interface{}) (err error) { + switch data := v.(type) { + case *string: + *data = string(msg) + return nil + case *[]byte: + *data = msg + return nil + } + return ErrNotSupported +} + +/* +Message is a codec to send/receive text/binary data in a frame on WebSocket connection. +To send/receive text frame, use string type. +To send/receive binary frame, use []byte type. + +Trivial usage: + + import "websocket" + + // receive text frame + var message string + websocket.Message.Receive(ws, &message) + + // send text frame + message = "hello" + websocket.Message.Send(ws, message) + + // receive binary frame + var data []byte + websocket.Message.Receive(ws, &data) + + // send binary frame + data = []byte{0, 1, 2} + websocket.Message.Send(ws, data) + +*/ +var Message = Codec{marshal, unmarshal} + +func jsonMarshal(v interface{}) (msg []byte, payloadType byte, err error) { + msg, err = json.Marshal(v) + return msg, TextFrame, err +} + +func jsonUnmarshal(msg []byte, payloadType byte, v interface{}) (err error) { + return json.Unmarshal(msg, v) +} + +/* +JSON is a codec to send/receive JSON data in a frame from a WebSocket connection. + +Trivial usage: + + import "websocket" + + type T struct { + Msg string + Count int + } + + // receive JSON type T + var data T + websocket.JSON.Receive(ws, &data) + + // send JSON type T + websocket.JSON.Send(ws, data) +*/ +var JSON = Codec{jsonMarshal, jsonUnmarshal} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/websocket_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/websocket_test.go new file mode 100644 index 0000000..2054ce8 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/websocket/websocket_test.go @@ -0,0 +1,665 @@ +// 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 websocket + +import ( + "bytes" + "crypto/rand" + "fmt" + "io" + "log" + "net" + "net/http" + "net/http/httptest" + "net/url" + "reflect" + "runtime" + "strings" + "sync" + "testing" + "time" +) + +var serverAddr string +var once sync.Once + +func echoServer(ws *Conn) { + defer ws.Close() + io.Copy(ws, ws) +} + +type Count struct { + S string + N int +} + +func countServer(ws *Conn) { + defer ws.Close() + for { + var count Count + err := JSON.Receive(ws, &count) + if err != nil { + return + } + count.N++ + count.S = strings.Repeat(count.S, count.N) + err = JSON.Send(ws, count) + if err != nil { + return + } + } +} + +type testCtrlAndDataHandler struct { + hybiFrameHandler +} + +func (h *testCtrlAndDataHandler) WritePing(b []byte) (int, error) { + h.hybiFrameHandler.conn.wio.Lock() + defer h.hybiFrameHandler.conn.wio.Unlock() + w, err := h.hybiFrameHandler.conn.frameWriterFactory.NewFrameWriter(PingFrame) + if err != nil { + return 0, err + } + n, err := w.Write(b) + w.Close() + return n, err +} + +func ctrlAndDataServer(ws *Conn) { + defer ws.Close() + h := &testCtrlAndDataHandler{hybiFrameHandler: hybiFrameHandler{conn: ws}} + ws.frameHandler = h + + go func() { + for i := 0; ; i++ { + var b []byte + if i%2 != 0 { // with or without payload + b = []byte(fmt.Sprintf("#%d-CONTROL-FRAME-FROM-SERVER", i)) + } + if _, err := h.WritePing(b); err != nil { + break + } + if _, err := h.WritePong(b); err != nil { // unsolicited pong + break + } + time.Sleep(10 * time.Millisecond) + } + }() + + b := make([]byte, 128) + for { + n, err := ws.Read(b) + if err != nil { + break + } + if _, err := ws.Write(b[:n]); err != nil { + break + } + } +} + +func subProtocolHandshake(config *Config, req *http.Request) error { + for _, proto := range config.Protocol { + if proto == "chat" { + config.Protocol = []string{proto} + return nil + } + } + return ErrBadWebSocketProtocol +} + +func subProtoServer(ws *Conn) { + for _, proto := range ws.Config().Protocol { + io.WriteString(ws, proto) + } +} + +func startServer() { + http.Handle("/echo", Handler(echoServer)) + http.Handle("/count", Handler(countServer)) + http.Handle("/ctrldata", Handler(ctrlAndDataServer)) + subproto := Server{ + Handshake: subProtocolHandshake, + Handler: Handler(subProtoServer), + } + http.Handle("/subproto", subproto) + server := httptest.NewServer(nil) + serverAddr = server.Listener.Addr().String() + log.Print("Test WebSocket server listening on ", serverAddr) +} + +func newConfig(t *testing.T, path string) *Config { + config, _ := NewConfig(fmt.Sprintf("ws://%s%s", serverAddr, path), "http://localhost") + return config +} + +func TestEcho(t *testing.T) { + once.Do(startServer) + + // websocket.Dial() + client, err := net.Dial("tcp", serverAddr) + if err != nil { + t.Fatal("dialing", err) + } + conn, err := NewClient(newConfig(t, "/echo"), client) + if err != nil { + t.Errorf("WebSocket handshake error: %v", err) + return + } + + msg := []byte("hello, world\n") + if _, err := conn.Write(msg); err != nil { + t.Errorf("Write: %v", err) + } + var actual_msg = make([]byte, 512) + n, err := conn.Read(actual_msg) + if err != nil { + t.Errorf("Read: %v", err) + } + actual_msg = actual_msg[0:n] + if !bytes.Equal(msg, actual_msg) { + t.Errorf("Echo: expected %q got %q", msg, actual_msg) + } + conn.Close() +} + +func TestAddr(t *testing.T) { + once.Do(startServer) + + // websocket.Dial() + client, err := net.Dial("tcp", serverAddr) + if err != nil { + t.Fatal("dialing", err) + } + conn, err := NewClient(newConfig(t, "/echo"), client) + if err != nil { + t.Errorf("WebSocket handshake error: %v", err) + return + } + + ra := conn.RemoteAddr().String() + if !strings.HasPrefix(ra, "ws://") || !strings.HasSuffix(ra, "/echo") { + t.Errorf("Bad remote addr: %v", ra) + } + la := conn.LocalAddr().String() + if !strings.HasPrefix(la, "http://") { + t.Errorf("Bad local addr: %v", la) + } + conn.Close() +} + +func TestCount(t *testing.T) { + once.Do(startServer) + + // websocket.Dial() + client, err := net.Dial("tcp", serverAddr) + if err != nil { + t.Fatal("dialing", err) + } + conn, err := NewClient(newConfig(t, "/count"), client) + if err != nil { + t.Errorf("WebSocket handshake error: %v", err) + return + } + + var count Count + count.S = "hello" + if err := JSON.Send(conn, count); err != nil { + t.Errorf("Write: %v", err) + } + if err := JSON.Receive(conn, &count); err != nil { + t.Errorf("Read: %v", err) + } + if count.N != 1 { + t.Errorf("count: expected %d got %d", 1, count.N) + } + if count.S != "hello" { + t.Errorf("count: expected %q got %q", "hello", count.S) + } + if err := JSON.Send(conn, count); err != nil { + t.Errorf("Write: %v", err) + } + if err := JSON.Receive(conn, &count); err != nil { + t.Errorf("Read: %v", err) + } + if count.N != 2 { + t.Errorf("count: expected %d got %d", 2, count.N) + } + if count.S != "hellohello" { + t.Errorf("count: expected %q got %q", "hellohello", count.S) + } + conn.Close() +} + +func TestWithQuery(t *testing.T) { + once.Do(startServer) + + client, err := net.Dial("tcp", serverAddr) + if err != nil { + t.Fatal("dialing", err) + } + + config := newConfig(t, "/echo") + config.Location, err = url.ParseRequestURI(fmt.Sprintf("ws://%s/echo?q=v", serverAddr)) + if err != nil { + t.Fatal("location url", err) + } + + ws, err := NewClient(config, client) + if err != nil { + t.Errorf("WebSocket handshake: %v", err) + return + } + ws.Close() +} + +func testWithProtocol(t *testing.T, subproto []string) (string, error) { + once.Do(startServer) + + client, err := net.Dial("tcp", serverAddr) + if err != nil { + t.Fatal("dialing", err) + } + + config := newConfig(t, "/subproto") + config.Protocol = subproto + + ws, err := NewClient(config, client) + if err != nil { + return "", err + } + msg := make([]byte, 16) + n, err := ws.Read(msg) + if err != nil { + return "", err + } + ws.Close() + return string(msg[:n]), nil +} + +func TestWithProtocol(t *testing.T) { + proto, err := testWithProtocol(t, []string{"chat"}) + if err != nil { + t.Errorf("SubProto: unexpected error: %v", err) + } + if proto != "chat" { + t.Errorf("SubProto: expected %q, got %q", "chat", proto) + } +} + +func TestWithTwoProtocol(t *testing.T) { + proto, err := testWithProtocol(t, []string{"test", "chat"}) + if err != nil { + t.Errorf("SubProto: unexpected error: %v", err) + } + if proto != "chat" { + t.Errorf("SubProto: expected %q, got %q", "chat", proto) + } +} + +func TestWithBadProtocol(t *testing.T) { + _, err := testWithProtocol(t, []string{"test"}) + if err != ErrBadStatus { + t.Errorf("SubProto: expected %v, got %v", ErrBadStatus, err) + } +} + +func TestHTTP(t *testing.T) { + once.Do(startServer) + + // If the client did not send a handshake that matches the protocol + // specification, the server MUST return an HTTP response with an + // appropriate error code (such as 400 Bad Request) + resp, err := http.Get(fmt.Sprintf("http://%s/echo", serverAddr)) + if err != nil { + t.Errorf("Get: error %#v", err) + return + } + if resp == nil { + t.Error("Get: resp is null") + return + } + if resp.StatusCode != http.StatusBadRequest { + t.Errorf("Get: expected %q got %q", http.StatusBadRequest, resp.StatusCode) + } +} + +func TestTrailingSpaces(t *testing.T) { + // http://code.google.com/p/go/issues/detail?id=955 + // The last runs of this create keys with trailing spaces that should not be + // generated by the client. + once.Do(startServer) + config := newConfig(t, "/echo") + for i := 0; i < 30; i++ { + // body + ws, err := DialConfig(config) + if err != nil { + t.Errorf("Dial #%d failed: %v", i, err) + break + } + ws.Close() + } +} + +func TestDialConfigBadVersion(t *testing.T) { + once.Do(startServer) + config := newConfig(t, "/echo") + config.Version = 1234 + + _, err := DialConfig(config) + + if dialerr, ok := err.(*DialError); ok { + if dialerr.Err != ErrBadProtocolVersion { + t.Errorf("dial expected err %q but got %q", ErrBadProtocolVersion, dialerr.Err) + } + } +} + +func TestDialConfigWithDialer(t *testing.T) { + once.Do(startServer) + config := newConfig(t, "/echo") + config.Dialer = &net.Dialer{ + Deadline: time.Now().Add(-time.Minute), + } + _, err := DialConfig(config) + dialerr, ok := err.(*DialError) + if !ok { + t.Fatalf("DialError expected, got %#v", err) + } + neterr, ok := dialerr.Err.(*net.OpError) + if !ok { + t.Fatalf("net.OpError error expected, got %#v", dialerr.Err) + } + if !neterr.Timeout() { + t.Fatalf("expected timeout error, got %#v", neterr) + } +} + +func TestSmallBuffer(t *testing.T) { + // http://code.google.com/p/go/issues/detail?id=1145 + // Read should be able to handle reading a fragment of a frame. + once.Do(startServer) + + // websocket.Dial() + client, err := net.Dial("tcp", serverAddr) + if err != nil { + t.Fatal("dialing", err) + } + conn, err := NewClient(newConfig(t, "/echo"), client) + if err != nil { + t.Errorf("WebSocket handshake error: %v", err) + return + } + + msg := []byte("hello, world\n") + if _, err := conn.Write(msg); err != nil { + t.Errorf("Write: %v", err) + } + var small_msg = make([]byte, 8) + n, err := conn.Read(small_msg) + if err != nil { + t.Errorf("Read: %v", err) + } + if !bytes.Equal(msg[:len(small_msg)], small_msg) { + t.Errorf("Echo: expected %q got %q", msg[:len(small_msg)], small_msg) + } + var second_msg = make([]byte, len(msg)) + n, err = conn.Read(second_msg) + if err != nil { + t.Errorf("Read: %v", err) + } + second_msg = second_msg[0:n] + if !bytes.Equal(msg[len(small_msg):], second_msg) { + t.Errorf("Echo: expected %q got %q", msg[len(small_msg):], second_msg) + } + conn.Close() +} + +var parseAuthorityTests = []struct { + in *url.URL + out string +}{ + { + &url.URL{ + Scheme: "ws", + Host: "www.google.com", + }, + "www.google.com:80", + }, + { + &url.URL{ + Scheme: "wss", + Host: "www.google.com", + }, + "www.google.com:443", + }, + { + &url.URL{ + Scheme: "ws", + Host: "www.google.com:80", + }, + "www.google.com:80", + }, + { + &url.URL{ + Scheme: "wss", + Host: "www.google.com:443", + }, + "www.google.com:443", + }, + // some invalid ones for parseAuthority. parseAuthority doesn't + // concern itself with the scheme unless it actually knows about it + { + &url.URL{ + Scheme: "http", + Host: "www.google.com", + }, + "www.google.com", + }, + { + &url.URL{ + Scheme: "http", + Host: "www.google.com:80", + }, + "www.google.com:80", + }, + { + &url.URL{ + Scheme: "asdf", + Host: "127.0.0.1", + }, + "127.0.0.1", + }, + { + &url.URL{ + Scheme: "asdf", + Host: "www.google.com", + }, + "www.google.com", + }, +} + +func TestParseAuthority(t *testing.T) { + for _, tt := range parseAuthorityTests { + out := parseAuthority(tt.in) + if out != tt.out { + t.Errorf("got %v; want %v", out, tt.out) + } + } +} + +type closerConn struct { + net.Conn + closed int // count of the number of times Close was called +} + +func (c *closerConn) Close() error { + c.closed++ + return c.Conn.Close() +} + +func TestClose(t *testing.T) { + if runtime.GOOS == "plan9" { + t.Skip("see golang.org/issue/11454") + } + + once.Do(startServer) + + conn, err := net.Dial("tcp", serverAddr) + if err != nil { + t.Fatal("dialing", err) + } + + cc := closerConn{Conn: conn} + + client, err := NewClient(newConfig(t, "/echo"), &cc) + if err != nil { + t.Fatalf("WebSocket handshake: %v", err) + } + + // set the deadline to ten minutes ago, which will have expired by the time + // client.Close sends the close status frame. + conn.SetDeadline(time.Now().Add(-10 * time.Minute)) + + if err := client.Close(); err == nil { + t.Errorf("ws.Close(): expected error, got %v", err) + } + if cc.closed < 1 { + t.Fatalf("ws.Close(): expected underlying ws.rwc.Close to be called > 0 times, got: %v", cc.closed) + } +} + +var originTests = []struct { + req *http.Request + origin *url.URL +}{ + { + req: &http.Request{ + Header: http.Header{ + "Origin": []string{"http://www.example.com"}, + }, + }, + origin: &url.URL{ + Scheme: "http", + Host: "www.example.com", + }, + }, + { + req: &http.Request{}, + }, +} + +func TestOrigin(t *testing.T) { + conf := newConfig(t, "/echo") + conf.Version = ProtocolVersionHybi13 + for i, tt := range originTests { + origin, err := Origin(conf, tt.req) + if err != nil { + t.Error(err) + continue + } + if !reflect.DeepEqual(origin, tt.origin) { + t.Errorf("#%d: got origin %v; want %v", i, origin, tt.origin) + continue + } + } +} + +func TestCtrlAndData(t *testing.T) { + once.Do(startServer) + + c, err := net.Dial("tcp", serverAddr) + if err != nil { + t.Fatal(err) + } + ws, err := NewClient(newConfig(t, "/ctrldata"), c) + if err != nil { + t.Fatal(err) + } + defer ws.Close() + + h := &testCtrlAndDataHandler{hybiFrameHandler: hybiFrameHandler{conn: ws}} + ws.frameHandler = h + + b := make([]byte, 128) + for i := 0; i < 2; i++ { + data := []byte(fmt.Sprintf("#%d-DATA-FRAME-FROM-CLIENT", i)) + if _, err := ws.Write(data); err != nil { + t.Fatalf("#%d: %v", i, err) + } + var ctrl []byte + if i%2 != 0 { // with or without payload + ctrl = []byte(fmt.Sprintf("#%d-CONTROL-FRAME-FROM-CLIENT", i)) + } + if _, err := h.WritePing(ctrl); err != nil { + t.Fatalf("#%d: %v", i, err) + } + n, err := ws.Read(b) + if err != nil { + t.Fatalf("#%d: %v", i, err) + } + if !bytes.Equal(b[:n], data) { + t.Fatalf("#%d: got %v; want %v", i, b[:n], data) + } + } +} + +func TestCodec_ReceiveLimited(t *testing.T) { + const limit = 2048 + var payloads [][]byte + for _, size := range []int{ + 1024, + 2048, + 4096, // receive of this message would be interrupted due to limit + 2048, // this one is to make sure next receive recovers discarding leftovers + } { + b := make([]byte, size) + rand.Read(b) + payloads = append(payloads, b) + } + handlerDone := make(chan struct{}) + limitedHandler := func(ws *Conn) { + defer close(handlerDone) + ws.MaxPayloadBytes = limit + defer ws.Close() + for i, p := range payloads { + t.Logf("payload #%d (size %d, exceeds limit: %v)", i, len(p), len(p) > limit) + var recv []byte + err := Message.Receive(ws, &recv) + switch err { + case nil: + case ErrFrameTooLarge: + if len(p) <= limit { + t.Fatalf("unexpected frame size limit: expected %d bytes of payload having limit at %d", len(p), limit) + } + continue + default: + t.Fatalf("unexpected error: %v (want either nil or ErrFrameTooLarge)", err) + } + if len(recv) > limit { + t.Fatalf("received %d bytes of payload having limit at %d", len(recv), limit) + } + if !bytes.Equal(p, recv) { + t.Fatalf("received payload differs:\ngot:\t%v\nwant:\t%v", recv, p) + } + } + } + server := httptest.NewServer(Handler(limitedHandler)) + defer server.CloseClientConnections() + defer server.Close() + addr := server.Listener.Addr().String() + ws, err := Dial("ws://"+addr+"/", "", "http://localhost/") + if err != nil { + t.Fatal(err) + } + defer ws.Close() + for i, p := range payloads { + if err := Message.Send(ws, p); err != nil { + t.Fatalf("payload #%d (size %d): %v", i, len(p), err) + } + } + <-handlerDone +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/xsrftoken/xsrf.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/xsrftoken/xsrf.go new file mode 100644 index 0000000..bc861e1 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/xsrftoken/xsrf.go @@ -0,0 +1,94 @@ +// 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 xsrftoken provides methods for generating and validating secure XSRF tokens. +package xsrftoken // import "golang.org/x/net/xsrftoken" + +import ( + "crypto/hmac" + "crypto/sha1" + "crypto/subtle" + "encoding/base64" + "fmt" + "strconv" + "strings" + "time" +) + +// Timeout is the duration for which XSRF tokens are valid. +// It is exported so clients may set cookie timeouts that match generated tokens. +const Timeout = 24 * time.Hour + +// clean sanitizes a string for inclusion in a token by replacing all ":"s. +func clean(s string) string { + return strings.Replace(s, ":", "_", -1) +} + +// Generate returns a URL-safe secure XSRF token that expires in 24 hours. +// +// key is a secret key for your application; it must be non-empty. +// userID is an optional unique identifier for the user. +// actionID is an optional action the user is taking (e.g. POSTing to a particular path). +func Generate(key, userID, actionID string) string { + return generateTokenAtTime(key, userID, actionID, time.Now()) +} + +// generateTokenAtTime is like Generate, but returns a token that expires 24 hours from now. +func generateTokenAtTime(key, userID, actionID string, now time.Time) string { + if len(key) == 0 { + panic("zero length xsrf secret key") + } + // Round time up and convert to milliseconds. + milliTime := (now.UnixNano() + 1e6 - 1) / 1e6 + + h := hmac.New(sha1.New, []byte(key)) + fmt.Fprintf(h, "%s:%s:%d", clean(userID), clean(actionID), milliTime) + + // Get the padded base64 string then removing the padding. + tok := string(h.Sum(nil)) + tok = base64.URLEncoding.EncodeToString([]byte(tok)) + tok = strings.TrimRight(tok, "=") + + return fmt.Sprintf("%s:%d", tok, milliTime) +} + +// Valid reports whether a token is a valid, unexpired token returned by Generate. +func Valid(token, key, userID, actionID string) bool { + return validTokenAtTime(token, key, userID, actionID, time.Now()) +} + +// validTokenAtTime reports whether a token is valid at the given time. +func validTokenAtTime(token, key, userID, actionID string, now time.Time) bool { + if len(key) == 0 { + panic("zero length xsrf secret key") + } + // Extract the issue time of the token. + sep := strings.LastIndex(token, ":") + if sep < 0 { + return false + } + millis, err := strconv.ParseInt(token[sep+1:], 10, 64) + if err != nil { + return false + } + issueTime := time.Unix(0, millis*1e6) + + // Check that the token is not expired. + if now.Sub(issueTime) >= Timeout { + return false + } + + // Check that the token is not from the future. + // Allow 1 minute grace period in case the token is being verified on a + // machine whose clock is behind the machine that issued the token. + if issueTime.After(now.Add(1 * time.Minute)) { + return false + } + + expected := generateTokenAtTime(key, userID, actionID, issueTime) + + // Check that the token matches the expected value. + // Use constant time comparison to avoid timing attacks. + return subtle.ConstantTimeCompare([]byte(token), []byte(expected)) == 1 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/xsrftoken/xsrf_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/xsrftoken/xsrf_test.go new file mode 100644 index 0000000..6c8e7d9 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/net/xsrftoken/xsrf_test.go @@ -0,0 +1,83 @@ +// 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 xsrftoken + +import ( + "encoding/base64" + "testing" + "time" +) + +const ( + key = "quay" + userID = "12345678" + actionID = "POST /form" +) + +var ( + now = time.Now() + oneMinuteFromNow = now.Add(1 * time.Minute) +) + +func TestValidToken(t *testing.T) { + tok := generateTokenAtTime(key, userID, actionID, now) + if !validTokenAtTime(tok, key, userID, actionID, oneMinuteFromNow) { + t.Error("One second later: Expected token to be valid") + } + if !validTokenAtTime(tok, key, userID, actionID, now.Add(Timeout-1*time.Nanosecond)) { + t.Error("Just before timeout: Expected token to be valid") + } + if !validTokenAtTime(tok, key, userID, actionID, now.Add(-1*time.Minute+1*time.Millisecond)) { + t.Error("One minute in the past: Expected token to be valid") + } +} + +// TestSeparatorReplacement tests that separators are being correctly substituted +func TestSeparatorReplacement(t *testing.T) { + tok := generateTokenAtTime("foo:bar", "baz", "wah", now) + tok2 := generateTokenAtTime("foo", "bar:baz", "wah", now) + if tok == tok2 { + t.Errorf("Expected generated tokens to be different") + } +} + +func TestInvalidToken(t *testing.T) { + invalidTokenTests := []struct { + name, key, userID, actionID string + t time.Time + }{ + {"Bad key", "foobar", userID, actionID, oneMinuteFromNow}, + {"Bad userID", key, "foobar", actionID, oneMinuteFromNow}, + {"Bad actionID", key, userID, "foobar", oneMinuteFromNow}, + {"Expired", key, userID, actionID, now.Add(Timeout + 1*time.Millisecond)}, + {"More than 1 minute from the future", key, userID, actionID, now.Add(-1*time.Nanosecond - 1*time.Minute)}, + } + + tok := generateTokenAtTime(key, userID, actionID, now) + for _, itt := range invalidTokenTests { + if validTokenAtTime(tok, itt.key, itt.userID, itt.actionID, itt.t) { + t.Errorf("%v: Expected token to be invalid", itt.name) + } + } +} + +// TestValidateBadData primarily tests that no unexpected panics are triggered +// during parsing +func TestValidateBadData(t *testing.T) { + badDataTests := []struct { + name, tok string + }{ + {"Invalid Base64", "ASDab24(@)$*=="}, + {"No delimiter", base64.URLEncoding.EncodeToString([]byte("foobar12345678"))}, + {"Invalid time", base64.URLEncoding.EncodeToString([]byte("foobar:foobar"))}, + {"Wrong length", "1234" + generateTokenAtTime(key, userID, actionID, now)}, + } + + for _, bdt := range badDataTests { + if validTokenAtTime(bdt.tok, key, userID, actionID, oneMinuteFromNow) { + t.Errorf("%v: Expected token to be invalid", bdt.name) + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/.gitattributes b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/.gitattributes new file mode 100644 index 0000000..d2f212e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/.gitattributes @@ -0,0 +1,10 @@ +# Treat all files in this repo as binary, with no git magic updating +# line endings. Windows users contributing to Go will need to use a +# modern version of git and editors capable of LF line endings. +# +# We'll prevent accidental CRLF line endings from entering the repo +# via the git-review gofmt checks. +# +# See golang.org/issue/9281 + +* -text diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/.gitignore b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/.gitignore new file mode 100644 index 0000000..8339fd6 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/.gitignore @@ -0,0 +1,2 @@ +# Add no patterns to .hgignore except for files generated by the build. +last-change diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/AUTHORS b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/AUTHORS new file mode 100644 index 0000000..15167cd --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/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 http://tip.golang.org/AUTHORS. diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/CONTRIBUTING.md b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/CONTRIBUTING.md new file mode 100644 index 0000000..88dff59 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/CONTRIBUTING.md @@ -0,0 +1,31 @@ +# Contributing to Go + +Go is an open source project. + +It is the work of hundreds of contributors. We appreciate your help! + + +## Filing issues + +When [filing an issue](https://golang.org/issue/new), make sure to answer these five questions: + +1. What version of Go are you using (`go version`)? +2. What operating system and processor architecture are you using? +3. What did you do? +4. What did you expect to see? +5. What did you see instead? + +General questions should go to the [golang-nuts mailing list](https://groups.google.com/group/golang-nuts) instead of the issue tracker. +The gophers there will answer or ask you to file an issue if you've tripped over a bug. + +## Contributing code + +Please read the [Contribution Guidelines](https://golang.org/doc/contribute.html) +before sending patches. + +**We do not accept GitHub pull requests** +(we use [Gerrit](https://code.google.com/p/gerrit/) instead for code review). + +Unless otherwise noted, the Go source files are distributed under +the BSD-style license found in the LICENSE file. + diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/CONTRIBUTORS b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/CONTRIBUTORS new file mode 100644 index 0000000..1c4577e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/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 http://tip.golang.org/CONTRIBUTORS. diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/LICENSE b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/LICENSE new file mode 100644 index 0000000..6a66aea --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/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/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/PATENTS b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/PATENTS new file mode 100644 index 0000000..7330990 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/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/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/README.md b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/README.md new file mode 100644 index 0000000..ef6c9e5 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/README.md @@ -0,0 +1,18 @@ +# sys + +This repository holds supplemental Go packages for low-level interactions with +the operating system. + +## Download/Install + +The easiest way to install is to run `go get -u golang.org/x/sys`. You can +also manually git clone the repository to `$GOPATH/src/golang.org/x/sys`. + +## Report Issues / Send Patches + +This repository uses Gerrit for code changes. To learn how to submit changes to +this repository, see https://golang.org/doc/contribute.html. + +The main issue tracker for the sys repository is located at +https://github.com/golang/go/issues. Prefix your issue with "x/sys:" in the +subject line, so it is easy to find. diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/codereview.cfg b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/codereview.cfg new file mode 100644 index 0000000..3f8b14b --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/codereview.cfg @@ -0,0 +1 @@ +issuerepo: golang/go diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/asm.s b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/asm.s new file mode 100644 index 0000000..d4ca868 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/asm.s @@ -0,0 +1,8 @@ +// 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. + +#include "textflag.h" + +TEXT ·use(SB),NOSPLIT,$0 + RET diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/asm_plan9_386.s b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/asm_plan9_386.s new file mode 100644 index 0000000..bc5cab1 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/asm_plan9_386.s @@ -0,0 +1,30 @@ +// 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. + +#include "textflag.h" + +// +// System call support for 386, Plan 9 +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-32 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-44 + JMP syscall·Syscall6(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + JMP syscall·RawSyscall6(SB) + +TEXT ·seek(SB),NOSPLIT,$0-36 + JMP syscall·seek(SB) + +TEXT ·exit(SB),NOSPLIT,$4-4 + JMP syscall·exit(SB) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/asm_plan9_amd64.s b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/asm_plan9_amd64.s new file mode 100644 index 0000000..d3448e6 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/asm_plan9_amd64.s @@ -0,0 +1,30 @@ +// 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. + +#include "textflag.h" + +// +// System call support for amd64, Plan 9 +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-64 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-88 + JMP syscall·Syscall6(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + JMP syscall·RawSyscall6(SB) + +TEXT ·seek(SB),NOSPLIT,$0-56 + JMP syscall·seek(SB) + +TEXT ·exit(SB),NOSPLIT,$8-8 + JMP syscall·exit(SB) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/const_plan9.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/const_plan9.go new file mode 100644 index 0000000..b4e85a3 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/const_plan9.go @@ -0,0 +1,70 @@ +package plan9 + +// Plan 9 Constants + +// Open modes +const ( + O_RDONLY = 0 + O_WRONLY = 1 + O_RDWR = 2 + O_TRUNC = 16 + O_CLOEXEC = 32 + O_EXCL = 0x1000 +) + +// Rfork flags +const ( + RFNAMEG = 1 << 0 + RFENVG = 1 << 1 + RFFDG = 1 << 2 + RFNOTEG = 1 << 3 + RFPROC = 1 << 4 + RFMEM = 1 << 5 + RFNOWAIT = 1 << 6 + RFCNAMEG = 1 << 10 + RFCENVG = 1 << 11 + RFCFDG = 1 << 12 + RFREND = 1 << 13 + RFNOMNT = 1 << 14 +) + +// Qid.Type bits +const ( + QTDIR = 0x80 + QTAPPEND = 0x40 + QTEXCL = 0x20 + QTMOUNT = 0x10 + QTAUTH = 0x08 + QTTMP = 0x04 + QTFILE = 0x00 +) + +// Dir.Mode bits +const ( + DMDIR = 0x80000000 + DMAPPEND = 0x40000000 + DMEXCL = 0x20000000 + DMMOUNT = 0x10000000 + DMAUTH = 0x08000000 + DMTMP = 0x04000000 + DMREAD = 0x4 + DMWRITE = 0x2 + DMEXEC = 0x1 +) + +const ( + STATMAX = 65535 + ERRMAX = 128 + STATFIXLEN = 49 +) + +// Mount and bind flags +const ( + MREPL = 0x0000 + MBEFORE = 0x0001 + MAFTER = 0x0002 + MORDER = 0x0003 + MCREATE = 0x0004 + MCACHE = 0x0010 + MMASK = 0x0017 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/dir_plan9.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/dir_plan9.go new file mode 100644 index 0000000..0955e0c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/dir_plan9.go @@ -0,0 +1,212 @@ +// 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. + +// Plan 9 directory marshalling. See intro(5). + +package plan9 + +import "errors" + +var ( + ErrShortStat = errors.New("stat buffer too short") + ErrBadStat = errors.New("malformed stat buffer") + ErrBadName = errors.New("bad character in file name") +) + +// A Qid represents a 9P server's unique identification for a file. +type Qid struct { + Path uint64 // the file server's unique identification for the file + Vers uint32 // version number for given Path + Type uint8 // the type of the file (plan9.QTDIR for example) +} + +// A Dir contains the metadata for a file. +type Dir struct { + // system-modified data + Type uint16 // server type + Dev uint32 // server subtype + + // file data + Qid Qid // unique id from server + Mode uint32 // permissions + Atime uint32 // last read time + Mtime uint32 // last write time + Length int64 // file length + Name string // last element of path + Uid string // owner name + Gid string // group name + Muid string // last modifier name +} + +var nullDir = Dir{ + Type: ^uint16(0), + Dev: ^uint32(0), + Qid: Qid{ + Path: ^uint64(0), + Vers: ^uint32(0), + Type: ^uint8(0), + }, + Mode: ^uint32(0), + Atime: ^uint32(0), + Mtime: ^uint32(0), + Length: ^int64(0), +} + +// Null assigns special "don't touch" values to members of d to +// avoid modifying them during plan9.Wstat. +func (d *Dir) Null() { *d = nullDir } + +// Marshal encodes a 9P stat message corresponding to d into b +// +// If there isn't enough space in b for a stat message, ErrShortStat is returned. +func (d *Dir) Marshal(b []byte) (n int, err error) { + n = STATFIXLEN + len(d.Name) + len(d.Uid) + len(d.Gid) + len(d.Muid) + if n > len(b) { + return n, ErrShortStat + } + + for _, c := range d.Name { + if c == '/' { + return n, ErrBadName + } + } + + b = pbit16(b, uint16(n)-2) + b = pbit16(b, d.Type) + b = pbit32(b, d.Dev) + b = pbit8(b, d.Qid.Type) + b = pbit32(b, d.Qid.Vers) + b = pbit64(b, d.Qid.Path) + b = pbit32(b, d.Mode) + b = pbit32(b, d.Atime) + b = pbit32(b, d.Mtime) + b = pbit64(b, uint64(d.Length)) + b = pstring(b, d.Name) + b = pstring(b, d.Uid) + b = pstring(b, d.Gid) + b = pstring(b, d.Muid) + + return n, nil +} + +// UnmarshalDir decodes a single 9P stat message from b and returns the resulting Dir. +// +// If b is too small to hold a valid stat message, ErrShortStat is returned. +// +// If the stat message itself is invalid, ErrBadStat is returned. +func UnmarshalDir(b []byte) (*Dir, error) { + if len(b) < STATFIXLEN { + return nil, ErrShortStat + } + size, buf := gbit16(b) + if len(b) != int(size)+2 { + return nil, ErrBadStat + } + b = buf + + var d Dir + d.Type, b = gbit16(b) + d.Dev, b = gbit32(b) + d.Qid.Type, b = gbit8(b) + d.Qid.Vers, b = gbit32(b) + d.Qid.Path, b = gbit64(b) + d.Mode, b = gbit32(b) + d.Atime, b = gbit32(b) + d.Mtime, b = gbit32(b) + + n, b := gbit64(b) + d.Length = int64(n) + + var ok bool + if d.Name, b, ok = gstring(b); !ok { + return nil, ErrBadStat + } + if d.Uid, b, ok = gstring(b); !ok { + return nil, ErrBadStat + } + if d.Gid, b, ok = gstring(b); !ok { + return nil, ErrBadStat + } + if d.Muid, b, ok = gstring(b); !ok { + return nil, ErrBadStat + } + + return &d, nil +} + +// pbit8 copies the 8-bit number v to b and returns the remaining slice of b. +func pbit8(b []byte, v uint8) []byte { + b[0] = byte(v) + return b[1:] +} + +// pbit16 copies the 16-bit number v to b in little-endian order and returns the remaining slice of b. +func pbit16(b []byte, v uint16) []byte { + b[0] = byte(v) + b[1] = byte(v >> 8) + return b[2:] +} + +// pbit32 copies the 32-bit number v to b in little-endian order and returns the remaining slice of b. +func pbit32(b []byte, v uint32) []byte { + b[0] = byte(v) + b[1] = byte(v >> 8) + b[2] = byte(v >> 16) + b[3] = byte(v >> 24) + return b[4:] +} + +// pbit64 copies the 64-bit number v to b in little-endian order and returns the remaining slice of b. +func pbit64(b []byte, v uint64) []byte { + b[0] = byte(v) + b[1] = byte(v >> 8) + b[2] = byte(v >> 16) + b[3] = byte(v >> 24) + b[4] = byte(v >> 32) + b[5] = byte(v >> 40) + b[6] = byte(v >> 48) + b[7] = byte(v >> 56) + return b[8:] +} + +// pstring copies the string s to b, prepending it with a 16-bit length in little-endian order, and +// returning the remaining slice of b.. +func pstring(b []byte, s string) []byte { + b = pbit16(b, uint16(len(s))) + n := copy(b, s) + return b[n:] +} + +// gbit8 reads an 8-bit number from b and returns it with the remaining slice of b. +func gbit8(b []byte) (uint8, []byte) { + return uint8(b[0]), b[1:] +} + +// gbit16 reads a 16-bit number in little-endian order from b and returns it with the remaining slice of b. +func gbit16(b []byte) (uint16, []byte) { + return uint16(b[0]) | uint16(b[1])<<8, b[2:] +} + +// gbit32 reads a 32-bit number in little-endian order from b and returns it with the remaining slice of b. +func gbit32(b []byte) (uint32, []byte) { + return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24, b[4:] +} + +// gbit64 reads a 64-bit number in little-endian order from b and returns it with the remaining slice of b. +func gbit64(b []byte) (uint64, []byte) { + lo := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + hi := uint32(b[4]) | uint32(b[5])<<8 | uint32(b[6])<<16 | uint32(b[7])<<24 + return uint64(lo) | uint64(hi)<<32, b[8:] +} + +// gstring reads a string from b, prefixed with a 16-bit length in little-endian order. +// It returns the string with the remaining slice of b and a boolean. If the length is +// greater than the number of bytes in b, the boolean will be false. +func gstring(b []byte) (string, []byte, bool) { + n, b := gbit16(b) + if int(n) > len(b) { + return "", b, false + } + return string(b[:n]), b[n:], true +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/env_plan9.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/env_plan9.go new file mode 100644 index 0000000..25a96e7 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/env_plan9.go @@ -0,0 +1,27 @@ +// 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. + +// Plan 9 environment variables. + +package plan9 + +import ( + "syscall" +) + +func Getenv(key string) (value string, found bool) { + return syscall.Getenv(key) +} + +func Setenv(key, value string) error { + return syscall.Setenv(key, value) +} + +func Clearenv() { + syscall.Clearenv() +} + +func Environ() []string { + return syscall.Environ() +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/env_unset.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/env_unset.go new file mode 100644 index 0000000..c37fc26 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/env_unset.go @@ -0,0 +1,14 @@ +// 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. + +// +build go1.4 + +package plan9 + +import "syscall" + +func Unsetenv(key string) error { + // This was added in Go 1.4. + return syscall.Unsetenv(key) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/errors_plan9.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/errors_plan9.go new file mode 100644 index 0000000..110cf6a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/errors_plan9.go @@ -0,0 +1,50 @@ +// 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 plan9 + +import "syscall" + +// Constants +const ( + // Invented values to support what package os expects. + O_CREAT = 0x02000 + O_APPEND = 0x00400 + O_NOCTTY = 0x00000 + O_NONBLOCK = 0x00000 + O_SYNC = 0x00000 + O_ASYNC = 0x00000 + + S_IFMT = 0x1f000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 +) + +// Errors +var ( + EINVAL = syscall.NewError("bad arg in system call") + ENOTDIR = syscall.NewError("not a directory") + EISDIR = syscall.NewError("file is a directory") + ENOENT = syscall.NewError("file does not exist") + EEXIST = syscall.NewError("file already exists") + EMFILE = syscall.NewError("no free file descriptors") + EIO = syscall.NewError("i/o error") + ENAMETOOLONG = syscall.NewError("file name too long") + EINTR = syscall.NewError("interrupted") + EPERM = syscall.NewError("permission denied") + EBUSY = syscall.NewError("no free devices") + ETIMEDOUT = syscall.NewError("connection timed out") + EPLAN9 = syscall.NewError("not supported by plan 9") + + // The following errors do not correspond to any + // Plan 9 system messages. Invented to support + // what package os and others expect. + EACCES = syscall.NewError("access permission denied") + EAFNOSUPPORT = syscall.NewError("address family not supported by protocol") +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/mkall.sh b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/mkall.sh new file mode 100755 index 0000000..9f73c60 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/mkall.sh @@ -0,0 +1,138 @@ +#!/usr/bin/env bash +# 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. + +# The plan9 package provides access to the raw system call +# interface of the underlying operating system. Porting Go to +# a new architecture/operating system combination requires +# some manual effort, though there are tools that automate +# much of the process. The auto-generated files have names +# beginning with z. +# +# This script runs or (given -n) prints suggested commands to generate z files +# for the current system. Running those commands is not automatic. +# This script is documentation more than anything else. +# +# * asm_${GOOS}_${GOARCH}.s +# +# This hand-written assembly file implements system call dispatch. +# There are three entry points: +# +# func Syscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr); +# func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr); +# func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr); +# +# The first and second are the standard ones; they differ only in +# how many arguments can be passed to the kernel. +# The third is for low-level use by the ForkExec wrapper; +# unlike the first two, it does not call into the scheduler to +# let it know that a system call is running. +# +# * syscall_${GOOS}.go +# +# This hand-written Go file implements system calls that need +# special handling and lists "//sys" comments giving prototypes +# for ones that can be auto-generated. Mksyscall reads those +# comments to generate the stubs. +# +# * syscall_${GOOS}_${GOARCH}.go +# +# Same as syscall_${GOOS}.go except that it contains code specific +# to ${GOOS} on one particular architecture. +# +# * types_${GOOS}.c +# +# This hand-written C file includes standard C headers and then +# creates typedef or enum names beginning with a dollar sign +# (use of $ in variable names is a gcc extension). The hardest +# part about preparing this file is figuring out which headers to +# include and which symbols need to be #defined to get the +# actual data structures that pass through to the kernel system calls. +# Some C libraries present alternate versions for binary compatibility +# and translate them on the way in and out of system calls, but +# there is almost always a #define that can get the real ones. +# See types_darwin.c and types_linux.c for examples. +# +# * zerror_${GOOS}_${GOARCH}.go +# +# This machine-generated file defines the system's error numbers, +# error strings, and signal numbers. The generator is "mkerrors.sh". +# Usually no arguments are needed, but mkerrors.sh will pass its +# arguments on to godefs. +# +# * zsyscall_${GOOS}_${GOARCH}.go +# +# Generated by mksyscall.pl; see syscall_${GOOS}.go above. +# +# * zsysnum_${GOOS}_${GOARCH}.go +# +# Generated by mksysnum_${GOOS}. +# +# * ztypes_${GOOS}_${GOARCH}.go +# +# Generated by godefs; see types_${GOOS}.c above. + +GOOSARCH="${GOOS}_${GOARCH}" + +# defaults +mksyscall="./mksyscall.pl" +mkerrors="./mkerrors.sh" +zerrors="zerrors_$GOOSARCH.go" +mksysctl="" +zsysctl="zsysctl_$GOOSARCH.go" +mksysnum= +mktypes= +run="sh" + +case "$1" in +-syscalls) + for i in zsyscall*go + do + sed 1q $i | sed 's;^// ;;' | sh > _$i && gofmt < _$i > $i + rm _$i + done + exit 0 + ;; +-n) + run="cat" + shift +esac + +case "$#" in +0) + ;; +*) + echo 'usage: mkall.sh [-n]' 1>&2 + exit 2 +esac + +case "$GOOSARCH" in +_* | *_ | _) + echo 'undefined $GOOS_$GOARCH:' "$GOOSARCH" 1>&2 + exit 1 + ;; +plan9_386) + mkerrors= + mksyscall="./mksyscall.pl -l32 -plan9" + mksysnum="./mksysnum_plan9.sh /n/sources/plan9/sys/src/libc/9syscall/sys.h" + mktypes="XXX" + ;; +*) + echo 'unrecognized $GOOS_$GOARCH: ' "$GOOSARCH" 1>&2 + exit 1 + ;; +esac + +( + if [ -n "$mkerrors" ]; then echo "$mkerrors |gofmt >$zerrors"; fi + case "$GOOS" in + plan9) + syscall_goos="syscall_$GOOS.go" + if [ -n "$mksyscall" ]; then echo "$mksyscall $syscall_goos syscall_$GOOSARCH.go |gofmt >zsyscall_$GOOSARCH.go"; fi + ;; + esac + if [ -n "$mksysctl" ]; then echo "$mksysctl |gofmt >$zsysctl"; fi + if [ -n "$mksysnum" ]; then echo "$mksysnum |gofmt >zsysnum_$GOOSARCH.go"; fi + if [ -n "$mktypes" ]; then echo "$mktypes types_$GOOS.go |gofmt >ztypes_$GOOSARCH.go"; fi +) | $run diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/mkerrors.sh b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/mkerrors.sh new file mode 100755 index 0000000..052c86d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/mkerrors.sh @@ -0,0 +1,246 @@ +#!/usr/bin/env bash +# 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. + +# Generate Go code listing errors and other #defined constant +# values (ENAMETOOLONG etc.), by asking the preprocessor +# about the definitions. + +unset LANG +export LC_ALL=C +export LC_CTYPE=C + +CC=${CC:-gcc} + +uname=$(uname) + +includes=' +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +' + +ccflags="$@" + +# Write go tool cgo -godefs input. +( + echo package plan9 + echo + echo '/*' + indirect="includes_$(uname)" + echo "${!indirect} $includes" + echo '*/' + echo 'import "C"' + echo + echo 'const (' + + # The gcc command line prints all the #defines + # it encounters while processing the input + echo "${!indirect} $includes" | $CC -x c - -E -dM $ccflags | + awk ' + $1 != "#define" || $2 ~ /\(/ || $3 == "" {next} + + $2 ~ /^E([ABCD]X|[BIS]P|[SD]I|S|FL)$/ {next} # 386 registers + $2 ~ /^(SIGEV_|SIGSTKSZ|SIGRT(MIN|MAX))/ {next} + $2 ~ /^(SCM_SRCRT)$/ {next} + $2 ~ /^(MAP_FAILED)$/ {next} + + $2 !~ /^ETH_/ && + $2 !~ /^EPROC_/ && + $2 !~ /^EQUIV_/ && + $2 !~ /^EXPR_/ && + $2 ~ /^E[A-Z0-9_]+$/ || + $2 ~ /^B[0-9_]+$/ || + $2 ~ /^V[A-Z0-9]+$/ || + $2 ~ /^CS[A-Z0-9]/ || + $2 ~ /^I(SIG|CANON|CRNL|EXTEN|MAXBEL|STRIP|UTF8)$/ || + $2 ~ /^IGN/ || + $2 ~ /^IX(ON|ANY|OFF)$/ || + $2 ~ /^IN(LCR|PCK)$/ || + $2 ~ /(^FLU?SH)|(FLU?SH$)/ || + $2 ~ /^C(LOCAL|READ)$/ || + $2 == "BRKINT" || + $2 == "HUPCL" || + $2 == "PENDIN" || + $2 == "TOSTOP" || + $2 ~ /^PAR/ || + $2 ~ /^SIG[^_]/ || + $2 ~ /^O[CNPFP][A-Z]+[^_][A-Z]+$/ || + $2 ~ /^IN_/ || + $2 ~ /^LOCK_(SH|EX|NB|UN)$/ || + $2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|ICMP6|TCP|EVFILT|NOTE|EV|SHUT|PROT|MAP|PACKET|MSG|SCM|MCL|DT|MADV|PR)_/ || + $2 == "ICMPV6_FILTER" || + $2 == "SOMAXCONN" || + $2 == "NAME_MAX" || + $2 == "IFNAMSIZ" || + $2 ~ /^CTL_(MAXNAME|NET|QUERY)$/ || + $2 ~ /^SYSCTL_VERS/ || + $2 ~ /^(MS|MNT)_/ || + $2 ~ /^TUN(SET|GET|ATTACH|DETACH)/ || + $2 ~ /^(O|F|FD|NAME|S|PTRACE|PT)_/ || + $2 ~ /^LINUX_REBOOT_CMD_/ || + $2 ~ /^LINUX_REBOOT_MAGIC[12]$/ || + $2 !~ "NLA_TYPE_MASK" && + $2 ~ /^(NETLINK|NLM|NLMSG|NLA|IFA|IFAN|RT|RTCF|RTN|RTPROT|RTNH|ARPHRD|ETH_P)_/ || + $2 ~ /^SIOC/ || + $2 ~ /^TIOC/ || + $2 !~ "RTF_BITS" && + $2 ~ /^(IFF|IFT|NET_RT|RTM|RTF|RTV|RTA|RTAX)_/ || + $2 ~ /^BIOC/ || + $2 ~ /^RUSAGE_(SELF|CHILDREN|THREAD)/ || + $2 ~ /^RLIMIT_(AS|CORE|CPU|DATA|FSIZE|NOFILE|STACK)|RLIM_INFINITY/ || + $2 ~ /^PRIO_(PROCESS|PGRP|USER)/ || + $2 ~ /^CLONE_[A-Z_]+/ || + $2 !~ /^(BPF_TIMEVAL)$/ && + $2 ~ /^(BPF|DLT)_/ || + $2 !~ "WMESGLEN" && + $2 ~ /^W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", $2, $2)} + $2 ~ /^__WCOREFLAG$/ {next} + $2 ~ /^__W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", substr($2,3), $2)} + + {next} + ' | sort + + echo ')' +) >_const.go + +# Pull out the error names for later. +errors=$( + echo '#include ' | $CC -x c - -E -dM $ccflags | + awk '$1=="#define" && $2 ~ /^E[A-Z0-9_]+$/ { print $2 }' | + sort +) + +# Pull out the signal names for later. +signals=$( + echo '#include ' | $CC -x c - -E -dM $ccflags | + awk '$1=="#define" && $2 ~ /^SIG[A-Z0-9]+$/ { print $2 }' | + egrep -v '(SIGSTKSIZE|SIGSTKSZ|SIGRT)' | + sort +) + +# Again, writing regexps to a file. +echo '#include ' | $CC -x c - -E -dM $ccflags | + awk '$1=="#define" && $2 ~ /^E[A-Z0-9_]+$/ { print "^\t" $2 "[ \t]*=" }' | + sort >_error.grep +echo '#include ' | $CC -x c - -E -dM $ccflags | + awk '$1=="#define" && $2 ~ /^SIG[A-Z0-9]+$/ { print "^\t" $2 "[ \t]*=" }' | + egrep -v '(SIGSTKSIZE|SIGSTKSZ|SIGRT)' | + sort >_signal.grep + +echo '// mkerrors.sh' "$@" +echo '// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT' +echo +go tool cgo -godefs -- "$@" _const.go >_error.out +cat _error.out | grep -vf _error.grep | grep -vf _signal.grep +echo +echo '// Errors' +echo 'const (' +cat _error.out | grep -f _error.grep | sed 's/=\(.*\)/= Errno(\1)/' +echo ')' + +echo +echo '// Signals' +echo 'const (' +cat _error.out | grep -f _signal.grep | sed 's/=\(.*\)/= Signal(\1)/' +echo ')' + +# Run C program to print error and syscall strings. +( + echo -E " +#include +#include +#include +#include +#include +#include + +#define nelem(x) (sizeof(x)/sizeof((x)[0])) + +enum { A = 'A', Z = 'Z', a = 'a', z = 'z' }; // avoid need for single quotes below + +int errors[] = { +" + for i in $errors + do + echo -E ' '$i, + done + + echo -E " +}; + +int signals[] = { +" + for i in $signals + do + echo -E ' '$i, + done + + # Use -E because on some systems bash builtin interprets \n itself. + echo -E ' +}; + +static int +intcmp(const void *a, const void *b) +{ + return *(int*)a - *(int*)b; +} + +int +main(void) +{ + int i, j, e; + char buf[1024], *p; + + printf("\n\n// Error table\n"); + printf("var errors = [...]string {\n"); + qsort(errors, nelem(errors), sizeof errors[0], intcmp); + for(i=0; i 0 && errors[i-1] == e) + continue; + strcpy(buf, strerror(e)); + // lowercase first letter: Bad -> bad, but STREAM -> STREAM. + if(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z) + buf[0] += a - A; + printf("\t%d: \"%s\",\n", e, buf); + } + printf("}\n\n"); + + printf("\n\n// Signal table\n"); + printf("var signals = [...]string {\n"); + qsort(signals, nelem(signals), sizeof signals[0], intcmp); + for(i=0; i 0 && signals[i-1] == e) + continue; + strcpy(buf, strsignal(e)); + // lowercase first letter: Bad -> bad, but STREAM -> STREAM. + if(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z) + buf[0] += a - A; + // cut trailing : number. + p = strrchr(buf, ":"[0]); + if(p) + *p = '\0'; + printf("\t%d: \"%s\",\n", e, buf); + } + printf("}\n\n"); + + return 0; +} + +' +) >_errors.c + +$CC $ccflags -o _errors _errors.c && $GORUN ./_errors && rm -f _errors.c _errors _const.go _error.grep _signal.grep _error.out diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/mksyscall.pl b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/mksyscall.pl new file mode 100755 index 0000000..ce8e1e4 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/mksyscall.pl @@ -0,0 +1,319 @@ +#!/usr/bin/env perl +# 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. + +# This program reads a file containing function prototypes +# (like syscall_plan9.go) and generates system call bodies. +# The prototypes are marked by lines beginning with "//sys" +# and read like func declarations if //sys is replaced by func, but: +# * The parameter lists must give a name for each argument. +# This includes return parameters. +# * The parameter lists must give a type for each argument: +# the (x, y, z int) shorthand is not allowed. +# * If the return parameter is an error number, it must be named errno. + +# A line beginning with //sysnb is like //sys, except that the +# goroutine will not be suspended during the execution of the system +# call. This must only be used for system calls which can never +# block, as otherwise the system call could cause all goroutines to +# hang. + +use strict; + +my $cmdline = "mksyscall.pl " . join(' ', @ARGV); +my $errors = 0; +my $_32bit = ""; +my $plan9 = 0; +my $openbsd = 0; +my $netbsd = 0; +my $dragonfly = 0; +my $nacl = 0; +my $arm = 0; # 64-bit value should use (even, odd)-pair + +if($ARGV[0] eq "-b32") { + $_32bit = "big-endian"; + shift; +} elsif($ARGV[0] eq "-l32") { + $_32bit = "little-endian"; + shift; +} +if($ARGV[0] eq "-plan9") { + $plan9 = 1; + shift; +} +if($ARGV[0] eq "-openbsd") { + $openbsd = 1; + shift; +} +if($ARGV[0] eq "-netbsd") { + $netbsd = 1; + shift; +} +if($ARGV[0] eq "-dragonfly") { + $dragonfly = 1; + shift; +} +if($ARGV[0] eq "-nacl") { + $nacl = 1; + shift; +} +if($ARGV[0] eq "-arm") { + $arm = 1; + shift; +} + +if($ARGV[0] =~ /^-/) { + print STDERR "usage: mksyscall.pl [-b32 | -l32] [file ...]\n"; + exit 1; +} + +sub parseparamlist($) { + my ($list) = @_; + $list =~ s/^\s*//; + $list =~ s/\s*$//; + if($list eq "") { + return (); + } + return split(/\s*,\s*/, $list); +} + +sub parseparam($) { + my ($p) = @_; + if($p !~ /^(\S*) (\S*)$/) { + print STDERR "$ARGV:$.: malformed parameter: $p\n"; + $errors = 1; + return ("xx", "int"); + } + return ($1, $2); +} + +my $text = ""; +while(<>) { + chomp; + s/\s+/ /g; + s/^\s+//; + s/\s+$//; + my $nonblock = /^\/\/sysnb /; + next if !/^\/\/sys / && !$nonblock; + + # Line must be of the form + # func Open(path string, mode int, perm int) (fd int, errno error) + # Split into name, in params, out params. + if(!/^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*((?i)SYS_[A-Z0-9_]+))?$/) { + print STDERR "$ARGV:$.: malformed //sys declaration\n"; + $errors = 1; + next; + } + my ($func, $in, $out, $sysname) = ($2, $3, $4, $5); + + # Split argument lists on comma. + my @in = parseparamlist($in); + my @out = parseparamlist($out); + + # Try in vain to keep people from editing this file. + # The theory is that they jump into the middle of the file + # without reading the header. + $text .= "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n"; + + # Go function header. + my $out_decl = @out ? sprintf(" (%s)", join(', ', @out)) : ""; + $text .= sprintf "func %s(%s)%s {\n", $func, join(', ', @in), $out_decl; + + # Check if err return available + my $errvar = ""; + foreach my $p (@out) { + my ($name, $type) = parseparam($p); + if($type eq "error") { + $errvar = $name; + last; + } + } + + # Prepare arguments to Syscall. + my @args = (); + my @uses = (); + my $n = 0; + foreach my $p (@in) { + my ($name, $type) = parseparam($p); + if($type =~ /^\*/) { + push @args, "uintptr(unsafe.Pointer($name))"; + } elsif($type eq "string" && $errvar ne "") { + $text .= "\tvar _p$n *byte\n"; + $text .= "\t_p$n, $errvar = BytePtrFromString($name)\n"; + $text .= "\tif $errvar != nil {\n\t\treturn\n\t}\n"; + push @args, "uintptr(unsafe.Pointer(_p$n))"; + push @uses, "use(unsafe.Pointer(_p$n))"; + $n++; + } elsif($type eq "string") { + print STDERR "$ARGV:$.: $func uses string arguments, but has no error return\n"; + $text .= "\tvar _p$n *byte\n"; + $text .= "\t_p$n, _ = BytePtrFromString($name)\n"; + push @args, "uintptr(unsafe.Pointer(_p$n))"; + push @uses, "use(unsafe.Pointer(_p$n))"; + $n++; + } elsif($type =~ /^\[\](.*)/) { + # Convert slice into pointer, length. + # Have to be careful not to take address of &a[0] if len == 0: + # pass dummy pointer in that case. + # Used to pass nil, but some OSes or simulators reject write(fd, nil, 0). + $text .= "\tvar _p$n unsafe.Pointer\n"; + $text .= "\tif len($name) > 0 {\n\t\t_p$n = unsafe.Pointer(\&${name}[0])\n\t}"; + $text .= " else {\n\t\t_p$n = unsafe.Pointer(&_zero)\n\t}"; + $text .= "\n"; + push @args, "uintptr(_p$n)", "uintptr(len($name))"; + $n++; + } elsif($type eq "int64" && ($openbsd || $netbsd)) { + push @args, "0"; + if($_32bit eq "big-endian") { + push @args, "uintptr($name>>32)", "uintptr($name)"; + } elsif($_32bit eq "little-endian") { + push @args, "uintptr($name)", "uintptr($name>>32)"; + } else { + push @args, "uintptr($name)"; + } + } elsif($type eq "int64" && $dragonfly) { + if ($func !~ /^extp(read|write)/i) { + push @args, "0"; + } + if($_32bit eq "big-endian") { + push @args, "uintptr($name>>32)", "uintptr($name)"; + } elsif($_32bit eq "little-endian") { + push @args, "uintptr($name)", "uintptr($name>>32)"; + } else { + push @args, "uintptr($name)"; + } + } elsif($type eq "int64" && $_32bit ne "") { + if(@args % 2 && $arm) { + # arm abi specifies 64-bit argument uses + # (even, odd) pair + push @args, "0" + } + if($_32bit eq "big-endian") { + push @args, "uintptr($name>>32)", "uintptr($name)"; + } else { + push @args, "uintptr($name)", "uintptr($name>>32)"; + } + } else { + push @args, "uintptr($name)"; + } + } + + # Determine which form to use; pad args with zeros. + my $asm = "Syscall"; + if ($nonblock) { + $asm = "RawSyscall"; + } + if(@args <= 3) { + while(@args < 3) { + push @args, "0"; + } + } elsif(@args <= 6) { + $asm .= "6"; + while(@args < 6) { + push @args, "0"; + } + } elsif(@args <= 9) { + $asm .= "9"; + while(@args < 9) { + push @args, "0"; + } + } else { + print STDERR "$ARGV:$.: too many arguments to system call\n"; + } + + # System call number. + if($sysname eq "") { + $sysname = "SYS_$func"; + $sysname =~ s/([a-z])([A-Z])/${1}_$2/g; # turn FooBar into Foo_Bar + $sysname =~ y/a-z/A-Z/; + if($nacl) { + $sysname =~ y/A-Z/a-z/; + } + } + + # Actual call. + my $args = join(', ', @args); + my $call = "$asm($sysname, $args)"; + + # Assign return values. + my $body = ""; + my @ret = ("_", "_", "_"); + my $do_errno = 0; + for(my $i=0; $i<@out; $i++) { + my $p = $out[$i]; + my ($name, $type) = parseparam($p); + my $reg = ""; + if($name eq "err" && !$plan9) { + $reg = "e1"; + $ret[2] = $reg; + $do_errno = 1; + } elsif($name eq "err" && $plan9) { + $ret[0] = "r0"; + $ret[2] = "e1"; + next; + } else { + $reg = sprintf("r%d", $i); + $ret[$i] = $reg; + } + if($type eq "bool") { + $reg = "$reg != 0"; + } + if($type eq "int64" && $_32bit ne "") { + # 64-bit number in r1:r0 or r0:r1. + if($i+2 > @out) { + print STDERR "$ARGV:$.: not enough registers for int64 return\n"; + } + if($_32bit eq "big-endian") { + $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i, $i+1); + } else { + $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i+1, $i); + } + $ret[$i] = sprintf("r%d", $i); + $ret[$i+1] = sprintf("r%d", $i+1); + } + if($reg ne "e1" || $plan9) { + $body .= "\t$name = $type($reg)\n"; + } + } + if ($ret[0] eq "_" && $ret[1] eq "_" && $ret[2] eq "_") { + $text .= "\t$call\n"; + } else { + $text .= "\t$ret[0], $ret[1], $ret[2] := $call\n"; + } + foreach my $use (@uses) { + $text .= "\t$use\n"; + } + $text .= $body; + + if ($plan9 && $ret[2] eq "e1") { + $text .= "\tif int32(r0) == -1 {\n"; + $text .= "\t\terr = e1\n"; + $text .= "\t}\n"; + } elsif ($do_errno) { + $text .= "\tif e1 != 0 {\n"; + $text .= "\t\terr = e1\n"; + $text .= "\t}\n"; + } + $text .= "\treturn\n"; + $text .= "}\n\n"; +} + +chomp $text; +chomp $text; + +if($errors) { + exit 1; +} + +print <= 10 { + buf[i] = byte(val%10 + '0') + i-- + val /= 10 + } + buf[i] = byte(val + '0') + return string(buf[i:]) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/syscall.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/syscall.go new file mode 100644 index 0000000..df6f8c5 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/syscall.go @@ -0,0 +1,74 @@ +// 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. + +// +build plan9 + +// Package plan9 contains an interface to the low-level operating system +// primitives. OS details vary depending on the underlying system, and +// by default, godoc will display the OS-specific documentation for the current +// system. If you want godoc to display documentation for another +// system, set $GOOS and $GOARCH to the desired system. For example, if +// you want to view documentation for freebsd/arm on linux/amd64, set $GOOS +// to freebsd and $GOARCH to arm. +// The primary use of this package is inside other packages that provide a more +// portable interface to the system, such as "os", "time" and "net". Use +// those packages rather than this one if you can. +// For details of the functions and data types in this package consult +// the manuals for the appropriate operating system. +// These calls return err == nil to indicate success; otherwise +// err represents an operating system error describing the failure and +// holds a value of type syscall.ErrorString. +package plan9 // import "golang.org/x/sys/plan9" + +import "unsafe" + +// ByteSliceFromString returns a NUL-terminated slice of bytes +// containing the text of s. If s contains a NUL byte at any +// location, it returns (nil, EINVAL). +func ByteSliceFromString(s string) ([]byte, error) { + for i := 0; i < len(s); i++ { + if s[i] == 0 { + return nil, EINVAL + } + } + a := make([]byte, len(s)+1) + copy(a, s) + return a, nil +} + +// BytePtrFromString returns a pointer to a NUL-terminated array of +// bytes containing the text of s. If s contains a NUL byte at any +// location, it returns (nil, EINVAL). +func BytePtrFromString(s string) (*byte, error) { + a, err := ByteSliceFromString(s) + if err != nil { + return nil, err + } + return &a[0], nil +} + +// Single-word zero for use when we need a valid pointer to 0 bytes. +// See mksyscall.pl. +var _zero uintptr + +func (ts *Timespec) Unix() (sec int64, nsec int64) { + return int64(ts.Sec), int64(ts.Nsec) +} + +func (tv *Timeval) Unix() (sec int64, nsec int64) { + return int64(tv.Sec), int64(tv.Usec) * 1000 +} + +func (ts *Timespec) Nano() int64 { + return int64(ts.Sec)*1e9 + int64(ts.Nsec) +} + +func (tv *Timeval) Nano() int64 { + return int64(tv.Sec)*1e9 + int64(tv.Usec)*1000 +} + +// use is a no-op, but the compiler cannot see that it is. +// Calling use(p) ensures that p is kept live until that point. +//go:noescape +func use(p unsafe.Pointer) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/syscall_plan9.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/syscall_plan9.go new file mode 100644 index 0000000..d39d07d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/syscall_plan9.go @@ -0,0 +1,349 @@ +// 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. + +// Plan 9 system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and +// wrap it in our own nicer implementation. + +package plan9 + +import ( + "syscall" + "unsafe" +) + +// A Note is a string describing a process note. +// It implements the os.Signal interface. +type Note string + +func (n Note) Signal() {} + +func (n Note) String() string { + return string(n) +} + +var ( + Stdin = 0 + Stdout = 1 + Stderr = 2 +) + +// For testing: clients can set this flag to force +// creation of IPv6 sockets to return EAFNOSUPPORT. +var SocketDisableIPv6 bool + +func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.ErrorString) +func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.ErrorString) +func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr) +func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) + +func atoi(b []byte) (n uint) { + n = 0 + for i := 0; i < len(b); i++ { + n = n*10 + uint(b[i]-'0') + } + return +} + +func cstring(s []byte) string { + for i := range s { + if s[i] == 0 { + return string(s[0:i]) + } + } + return string(s) +} + +func errstr() string { + var buf [ERRMAX]byte + + RawSyscall(SYS_ERRSTR, uintptr(unsafe.Pointer(&buf[0])), uintptr(len(buf)), 0) + + buf[len(buf)-1] = 0 + return cstring(buf[:]) +} + +// Implemented in assembly to import from runtime. +func exit(code int) + +func Exit(code int) { exit(code) } + +func readnum(path string) (uint, error) { + var b [12]byte + + fd, e := Open(path, O_RDONLY) + if e != nil { + return 0, e + } + defer Close(fd) + + n, e := Pread(fd, b[:], 0) + + if e != nil { + return 0, e + } + + m := 0 + for ; m < n && b[m] == ' '; m++ { + } + + return atoi(b[m : n-1]), nil +} + +func Getpid() (pid int) { + n, _ := readnum("#c/pid") + return int(n) +} + +func Getppid() (ppid int) { + n, _ := readnum("#c/ppid") + return int(n) +} + +func Read(fd int, p []byte) (n int, err error) { + return Pread(fd, p, -1) +} + +func Write(fd int, p []byte) (n int, err error) { + return Pwrite(fd, p, -1) +} + +var ioSync int64 + +//sys fd2path(fd int, buf []byte) (err error) +func Fd2path(fd int) (path string, err error) { + var buf [512]byte + + e := fd2path(fd, buf[:]) + if e != nil { + return "", e + } + return cstring(buf[:]), nil +} + +//sys pipe(p *[2]int32) (err error) +func Pipe(p []int) (err error) { + if len(p) != 2 { + return syscall.ErrorString("bad arg in system call") + } + var pp [2]int32 + err = pipe(&pp) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +// Underlying system call writes to newoffset via pointer. +// Implemented in assembly to avoid allocation. +func seek(placeholder uintptr, fd int, offset int64, whence int) (newoffset int64, err string) + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + newoffset, e := seek(0, fd, offset, whence) + + if newoffset == -1 { + err = syscall.ErrorString(e) + } + return +} + +func Mkdir(path string, mode uint32) (err error) { + fd, err := Create(path, O_RDONLY, DMDIR|mode) + + if fd != -1 { + Close(fd) + } + + return +} + +type Waitmsg struct { + Pid int + Time [3]uint32 + Msg string +} + +func (w Waitmsg) Exited() bool { return true } +func (w Waitmsg) Signaled() bool { return false } + +func (w Waitmsg) ExitStatus() int { + if len(w.Msg) == 0 { + // a normal exit returns no message + return 0 + } + return 1 +} + +//sys await(s []byte) (n int, err error) +func Await(w *Waitmsg) (err error) { + var buf [512]byte + var f [5][]byte + + n, err := await(buf[:]) + + if err != nil || w == nil { + return + } + + nf := 0 + p := 0 + for i := 0; i < n && nf < len(f)-1; i++ { + if buf[i] == ' ' { + f[nf] = buf[p:i] + p = i + 1 + nf++ + } + } + f[nf] = buf[p:] + nf++ + + if nf != len(f) { + return syscall.ErrorString("invalid wait message") + } + w.Pid = int(atoi(f[0])) + w.Time[0] = uint32(atoi(f[1])) + w.Time[1] = uint32(atoi(f[2])) + w.Time[2] = uint32(atoi(f[3])) + w.Msg = cstring(f[4]) + if w.Msg == "''" { + // await() returns '' for no error + w.Msg = "" + } + return +} + +func Unmount(name, old string) (err error) { + fixwd() + oldp, err := BytePtrFromString(old) + if err != nil { + return err + } + oldptr := uintptr(unsafe.Pointer(oldp)) + + var r0 uintptr + var e syscall.ErrorString + + // bind(2) man page: If name is zero, everything bound or mounted upon old is unbound or unmounted. + if name == "" { + r0, _, e = Syscall(SYS_UNMOUNT, _zero, oldptr, 0) + } else { + namep, err := BytePtrFromString(name) + if err != nil { + return err + } + r0, _, e = Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(namep)), oldptr, 0) + } + + if int32(r0) == -1 { + err = e + } + return +} + +func Fchdir(fd int) (err error) { + path, err := Fd2path(fd) + + if err != nil { + return + } + + return Chdir(path) +} + +type Timespec struct { + Sec int32 + Nsec int32 +} + +type Timeval struct { + Sec int32 + Usec int32 +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Usec = int32(nsec % 1e9 / 1e3) + tv.Sec = int32(nsec / 1e9) + return +} + +func nsec() int64 { + var scratch int64 + + r0, _, _ := Syscall(SYS_NSEC, uintptr(unsafe.Pointer(&scratch)), 0, 0) + // TODO(aram): remove hack after I fix _nsec in the pc64 kernel. + if r0 == 0 { + return scratch + } + return int64(r0) +} + +func Gettimeofday(tv *Timeval) error { + nsec := nsec() + *tv = NsecToTimeval(nsec) + return nil +} + +func Getpagesize() int { return 0x1000 } + +func Getegid() (egid int) { return -1 } +func Geteuid() (euid int) { return -1 } +func Getgid() (gid int) { return -1 } +func Getuid() (uid int) { return -1 } + +func Getgroups() (gids []int, err error) { + return make([]int, 0), nil +} + +//sys open(path string, mode int) (fd int, err error) +func Open(path string, mode int) (fd int, err error) { + fixwd() + return open(path, mode) +} + +//sys create(path string, mode int, perm uint32) (fd int, err error) +func Create(path string, mode int, perm uint32) (fd int, err error) { + fixwd() + return create(path, mode, perm) +} + +//sys remove(path string) (err error) +func Remove(path string) error { + fixwd() + return remove(path) +} + +//sys stat(path string, edir []byte) (n int, err error) +func Stat(path string, edir []byte) (n int, err error) { + fixwd() + return stat(path, edir) +} + +//sys bind(name string, old string, flag int) (err error) +func Bind(name string, old string, flag int) (err error) { + fixwd() + return bind(name, old, flag) +} + +//sys mount(fd int, afd int, old string, flag int, aname string) (err error) +func Mount(fd int, afd int, old string, flag int, aname string) (err error) { + fixwd() + return mount(fd, afd, old, flag, aname) +} + +//sys wstat(path string, edir []byte) (err error) +func Wstat(path string, edir []byte) (err error) { + fixwd() + return wstat(path, edir) +} + +//sys chdir(path string) (err error) +//sys Dup(oldfd int, newfd int) (fd int, err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys Close(fd int) (err error) +//sys Fstat(fd int, edir []byte) (n int, err error) +//sys Fwstat(fd int, edir []byte) (err error) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/syscall_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/syscall_test.go new file mode 100644 index 0000000..8f829ba --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/syscall_test.go @@ -0,0 +1,33 @@ +// 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. + +// +build plan9 + +package plan9_test + +import ( + "testing" + + "golang.org/x/sys/plan9" +) + +func testSetGetenv(t *testing.T, key, value string) { + err := plan9.Setenv(key, value) + if err != nil { + t.Fatalf("Setenv failed to set %q: %v", value, err) + } + newvalue, found := plan9.Getenv(key) + if !found { + t.Fatalf("Getenv failed to find %v variable (want value %q)", key, value) + } + if newvalue != value { + t.Fatalf("Getenv(%v) = %q; want %q", key, newvalue, value) + } +} + +func TestEnv(t *testing.T) { + testSetGetenv(t, "TESTENV", "AVALUE") + // make sure TESTENV gets set to "", not deleted + testSetGetenv(t, "TESTENV", "") +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/zsyscall_plan9_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/zsyscall_plan9_386.go new file mode 100644 index 0000000..b35598a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/zsyscall_plan9_386.go @@ -0,0 +1,292 @@ +// mksyscall.pl -l32 -plan9 syscall_plan9.go +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +package plan9 + +import "unsafe" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fd2path(fd int, buf []byte) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FD2PATH, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]int32) (err error) { + r0, _, e1 := Syscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func await(s []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(s) > 0 { + _p0 = unsafe.Pointer(&s[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_AWAIT, uintptr(_p0), uintptr(len(s)), 0) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func open(path string, mode int) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + fd = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func create(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_CREATE, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + use(unsafe.Pointer(_p0)) + fd = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func remove(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_REMOVE, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func stat(path string, edir []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(edir) > 0 { + _p1 = unsafe.Pointer(&edir[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(edir))) + use(unsafe.Pointer(_p0)) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(name string, old string, flag int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(old) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_BIND, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(flag)) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(fd int, afd int, old string, flag int, aname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(old) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(aname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_MOUNT, uintptr(fd), uintptr(afd), uintptr(unsafe.Pointer(_p0)), uintptr(flag), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wstat(path string, edir []byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(edir) > 0 { + _p1 = unsafe.Pointer(&edir[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(edir))) + use(unsafe.Pointer(_p0)) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int, newfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), uintptr(newfd), 0) + fd = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + r0, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, edir []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(edir) > 0 { + _p0 = unsafe.Pointer(&edir[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(_p0), uintptr(len(edir))) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fwstat(fd int, edir []byte) (err error) { + var _p0 unsafe.Pointer + if len(edir) > 0 { + _p0 = unsafe.Pointer(&edir[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FWSTAT, uintptr(fd), uintptr(_p0), uintptr(len(edir))) + if int32(r0) == -1 { + err = e1 + } + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/zsyscall_plan9_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/zsyscall_plan9_amd64.go new file mode 100644 index 0000000..b35598a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/zsyscall_plan9_amd64.go @@ -0,0 +1,292 @@ +// mksyscall.pl -l32 -plan9 syscall_plan9.go +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +package plan9 + +import "unsafe" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fd2path(fd int, buf []byte) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FD2PATH, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]int32) (err error) { + r0, _, e1 := Syscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func await(s []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(s) > 0 { + _p0 = unsafe.Pointer(&s[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_AWAIT, uintptr(_p0), uintptr(len(s)), 0) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func open(path string, mode int) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + fd = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func create(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_CREATE, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + use(unsafe.Pointer(_p0)) + fd = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func remove(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_REMOVE, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func stat(path string, edir []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(edir) > 0 { + _p1 = unsafe.Pointer(&edir[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(edir))) + use(unsafe.Pointer(_p0)) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(name string, old string, flag int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(old) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_BIND, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(flag)) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(fd int, afd int, old string, flag int, aname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(old) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(aname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_MOUNT, uintptr(fd), uintptr(afd), uintptr(unsafe.Pointer(_p0)), uintptr(flag), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wstat(path string, edir []byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(edir) > 0 { + _p1 = unsafe.Pointer(&edir[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(edir))) + use(unsafe.Pointer(_p0)) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int, newfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), uintptr(newfd), 0) + fd = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + r0, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, edir []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(edir) > 0 { + _p0 = unsafe.Pointer(&edir[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(_p0), uintptr(len(edir))) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fwstat(fd int, edir []byte) (err error) { + var _p0 unsafe.Pointer + if len(edir) > 0 { + _p0 = unsafe.Pointer(&edir[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FWSTAT, uintptr(fd), uintptr(_p0), uintptr(len(edir))) + if int32(r0) == -1 { + err = e1 + } + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/zsysnum_plan9.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/zsysnum_plan9.go new file mode 100644 index 0000000..22e8abd --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/plan9/zsysnum_plan9.go @@ -0,0 +1,49 @@ +// mksysnum_plan9.sh /opt/plan9/sys/src/libc/9syscall/sys.h +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +package plan9 + +const ( + SYS_SYSR1 = 0 + SYS_BIND = 2 + SYS_CHDIR = 3 + SYS_CLOSE = 4 + SYS_DUP = 5 + SYS_ALARM = 6 + SYS_EXEC = 7 + SYS_EXITS = 8 + SYS_FAUTH = 10 + SYS_SEGBRK = 12 + SYS_OPEN = 14 + SYS_OSEEK = 16 + SYS_SLEEP = 17 + SYS_RFORK = 19 + SYS_PIPE = 21 + SYS_CREATE = 22 + SYS_FD2PATH = 23 + SYS_BRK_ = 24 + SYS_REMOVE = 25 + SYS_NOTIFY = 28 + SYS_NOTED = 29 + SYS_SEGATTACH = 30 + SYS_SEGDETACH = 31 + SYS_SEGFREE = 32 + SYS_SEGFLUSH = 33 + SYS_RENDEZVOUS = 34 + SYS_UNMOUNT = 35 + SYS_SEMACQUIRE = 37 + SYS_SEMRELEASE = 38 + SYS_SEEK = 39 + SYS_FVERSION = 40 + SYS_ERRSTR = 41 + SYS_STAT = 42 + SYS_FSTAT = 43 + SYS_WSTAT = 44 + SYS_FWSTAT = 45 + SYS_MOUNT = 46 + SYS_AWAIT = 47 + SYS_PREAD = 50 + SYS_PWRITE = 51 + SYS_TSEMACQUIRE = 52 + SYS_NSEC = 53 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/.gitignore b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/.gitignore new file mode 100644 index 0000000..e482715 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/.gitignore @@ -0,0 +1 @@ +_obj/ diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/README.md b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/README.md new file mode 100644 index 0000000..bc6f603 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/README.md @@ -0,0 +1,173 @@ +# Building `sys/unix` + +The sys/unix package provides access to the raw system call interface of the +underlying operating system. See: https://godoc.org/golang.org/x/sys/unix + +Porting Go to a new architecture/OS combination or adding syscalls, types, or +constants to an existing architecture/OS pair requires some manual effort; +however, there are tools that automate much of the process. + +## Build Systems + +There are currently two ways we generate the necessary files. We are currently +migrating the build system to use containers so the builds are reproducible. +This is being done on an OS-by-OS basis. Please update this documentation as +components of the build system change. + +### Old Build System (currently for `GOOS != "Linux" || GOARCH == "sparc64"`) + +The old build system generates the Go files based on the C header files +present on your system. This means that files +for a given GOOS/GOARCH pair must be generated on a system with that OS and +architecture. This also means that the generated code can differ from system +to system, based on differences in the header files. + +To avoid this, if you are using the old build system, only generate the Go +files on an installation with unmodified header files. It is also important to +keep track of which version of the OS the files were generated from (ex. +Darwin 14 vs Darwin 15). This makes it easier to track the progress of changes +and have each OS upgrade correspond to a single change. + +To build the files for your current OS and architecture, make sure GOOS and +GOARCH are set correctly and run `mkall.sh`. This will generate the files for +your specific system. Running `mkall.sh -n` shows the commands that will be run. + +Requirements: bash, perl, go + +### New Build System (currently for `GOOS == "Linux" && GOARCH != "sparc64"`) + +The new build system uses a Docker container to generate the go files directly +from source checkouts of the kernel and various system libraries. This means +that on any platform that supports Docker, all the files using the new build +system can be generated at once, and generated files will not change based on +what the person running the scripts has installed on their computer. + +The OS specific files for the new build system are located in the `${GOOS}` +directory, and the build is coordinated by the `${GOOS}/mkall.go` program. When +the kernel or system library updates, modify the Dockerfile at +`${GOOS}/Dockerfile` to checkout the new release of the source. + +To build all the files under the new build system, you must be on an amd64/Linux +system and have your GOOS and GOARCH set accordingly. Running `mkall.sh` will +then generate all of the files for all of the GOOS/GOARCH pairs in the new build +system. Running `mkall.sh -n` shows the commands that will be run. + +Requirements: bash, perl, go, docker + +## Component files + +This section describes the various files used in the code generation process. +It also contains instructions on how to modify these files to add a new +architecture/OS or to add additional syscalls, types, or constants. Note that +if you are using the new build system, the scripts cannot be called normally. +They must be called from within the docker container. + +### asm files + +The hand-written assembly file at `asm_${GOOS}_${GOARCH}.s` implements system +call dispatch. There are three entry points: +``` + func Syscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr) + func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) + func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr) +``` +The first and second are the standard ones; they differ only in how many +arguments can be passed to the kernel. The third is for low-level use by the +ForkExec wrapper. Unlike the first two, it does not call into the scheduler to +let it know that a system call is running. + +When porting Go to an new architecture/OS, this file must be implemented for +each GOOS/GOARCH pair. + +### mksysnum + +Mksysnum is a script located at `${GOOS}/mksysnum.pl` (or `mksysnum_${GOOS}.pl` +for the old system). This script takes in a list of header files containing the +syscall number declarations and parses them to produce the corresponding list of +Go numeric constants. See `zsysnum_${GOOS}_${GOARCH}.go` for the generated +constants. + +Adding new syscall numbers is mostly done by running the build on a sufficiently +new installation of the target OS (or updating the source checkouts for the +new build system). However, depending on the OS, you make need to update the +parsing in mksysnum. + +### mksyscall.pl + +The `syscall.go`, `syscall_${GOOS}.go`, `syscall_${GOOS}_${GOARCH}.go` are +hand-written Go files which implement system calls (for unix, the specific OS, +or the specific OS/Architecture pair respectively) that need special handling +and list `//sys` comments giving prototypes for ones that can be generated. + +The mksyscall.pl script takes the `//sys` and `//sysnb` comments and converts +them into syscalls. This requires the name of the prototype in the comment to +match a syscall number in the `zsysnum_${GOOS}_${GOARCH}.go` file. The function +prototype can be exported (capitalized) or not. + +Adding a new syscall often just requires adding a new `//sys` function prototype +with the desired arguments and a capitalized name so it is exported. However, if +you want the interface to the syscall to be different, often one will make an +unexported `//sys` prototype, an then write a custom wrapper in +`syscall_${GOOS}.go`. + +### types files + +For each OS, there is a hand-written Go file at `${GOOS}/types.go` (or +`types_${GOOS}.go` on the old system). This file includes standard C headers and +creates Go type aliases to the corresponding C types. The file is then fed +through godef to get the Go compatible definitions. Finally, the generated code +is fed though mkpost.go to format the code correctly and remove any hidden or +private identifiers. This cleaned-up code is written to +`ztypes_${GOOS}_${GOARCH}.go`. + +The hardest part about preparing this file is figuring out which headers to +include and which symbols need to be `#define`d to get the actual data +structures that pass through to the kernel system calls. Some C libraries +preset alternate versions for binary compatibility and translate them on the +way in and out of system calls, but there is almost always a `#define` that can +get the real ones. +See `types_darwin.go` and `linux/types.go` for examples. + +To add a new type, add in the necessary include statement at the top of the +file (if it is not already there) and add in a type alias line. Note that if +your type is significantly different on different architectures, you may need +some `#if/#elif` macros in your include statements. + +### mkerrors.sh + +This script is used to generate the system's various constants. This doesn't +just include the error numbers and error strings, but also the signal numbers +an a wide variety of miscellaneous constants. The constants come from the list +of include files in the `includes_${uname}` variable. A regex then picks out +the desired `#define` statements, and generates the corresponding Go constants. +The error numbers and strings are generated from `#include `, and the +signal numbers and strings are generated from `#include `. All of +these constants are written to `zerrors_${GOOS}_${GOARCH}.go` via a C program, +`_errors.c`, which prints out all the constants. + +To add a constant, add the header that includes it to the appropriate variable. +Then, edit the regex (if necessary) to match the desired constant. Avoid making +the regex too broad to avoid matching unintended constants. + + +## Generated files + +### `zerror_${GOOS}_${GOARCH}.go` + +A file containing all of the system's generated error numbers, error strings, +signal numbers, and constants. Generated by `mkerrors.sh` (see above). + +### `zsyscall_${GOOS}_${GOARCH}.go` + +A file containing all the generated syscalls for a specific GOOS and GOARCH. +Generated by `mksyscall.pl` (see above). + +### `zsysnum_${GOOS}_${GOARCH}.go` + +A list of numeric constants for all the syscall number of the specific GOOS +and GOARCH. Generated by mksysnum (see above). + +### `ztypes_${GOOS}_${GOARCH}.go` + +A file containing Go types for passing into (or returning from) syscalls. +Generated by godefs and the types file (see above). diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_darwin_386.s b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_darwin_386.s new file mode 100644 index 0000000..8a72783 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_darwin_386.s @@ -0,0 +1,29 @@ +// 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. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for 386, Darwin +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + JMP syscall·RawSyscall6(SB) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_darwin_amd64.s b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_darwin_amd64.s new file mode 100644 index 0000000..6321421 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_darwin_amd64.s @@ -0,0 +1,29 @@ +// 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. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for AMD64, Darwin +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-104 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + JMP syscall·RawSyscall6(SB) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_darwin_arm.s b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_darwin_arm.s new file mode 100644 index 0000000..333242d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_darwin_arm.s @@ -0,0 +1,30 @@ +// Copyright 2015 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 !gccgo +// +build arm,darwin + +#include "textflag.h" + +// +// System call support for ARM, Darwin +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + B syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + B syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + B syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + B syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + B syscall·RawSyscall6(SB) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_darwin_arm64.s b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_darwin_arm64.s new file mode 100644 index 0000000..97e0174 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_darwin_arm64.s @@ -0,0 +1,30 @@ +// Copyright 2015 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 !gccgo +// +build arm64,darwin + +#include "textflag.h" + +// +// System call support for AMD64, Darwin +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + B syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + B syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-104 + B syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + B syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + B syscall·RawSyscall6(SB) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_dragonfly_amd64.s b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_dragonfly_amd64.s new file mode 100644 index 0000000..d5ed672 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_dragonfly_amd64.s @@ -0,0 +1,29 @@ +// 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. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for AMD64, DragonFly +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-64 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-88 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-112 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-64 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-88 + JMP syscall·RawSyscall6(SB) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_freebsd_386.s b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_freebsd_386.s new file mode 100644 index 0000000..c9a0a26 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_freebsd_386.s @@ -0,0 +1,29 @@ +// 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. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for 386, FreeBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + JMP syscall·RawSyscall6(SB) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_freebsd_amd64.s b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_freebsd_amd64.s new file mode 100644 index 0000000..3517247 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_freebsd_amd64.s @@ -0,0 +1,29 @@ +// 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. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for AMD64, FreeBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-104 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + JMP syscall·RawSyscall6(SB) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_freebsd_arm.s b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_freebsd_arm.s new file mode 100644 index 0000000..9227c87 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_freebsd_arm.s @@ -0,0 +1,29 @@ +// 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. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for ARM, FreeBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + B syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + B syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + B syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + B syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + B syscall·RawSyscall6(SB) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_linux_386.s b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_linux_386.s new file mode 100644 index 0000000..4db2909 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_linux_386.s @@ -0,0 +1,35 @@ +// 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. + +// +build !gccgo + +#include "textflag.h" + +// +// System calls for 386, Linux +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + JMP syscall·Syscall6(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + JMP syscall·RawSyscall6(SB) + +TEXT ·socketcall(SB),NOSPLIT,$0-36 + JMP syscall·socketcall(SB) + +TEXT ·rawsocketcall(SB),NOSPLIT,$0-36 + JMP syscall·rawsocketcall(SB) + +TEXT ·seek(SB),NOSPLIT,$0-28 + JMP syscall·seek(SB) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_linux_amd64.s b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_linux_amd64.s new file mode 100644 index 0000000..44e25c6 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_linux_amd64.s @@ -0,0 +1,29 @@ +// 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. + +// +build !gccgo + +#include "textflag.h" + +// +// System calls for AMD64, Linux +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + JMP syscall·Syscall6(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + JMP syscall·RawSyscall6(SB) + +TEXT ·gettimeofday(SB),NOSPLIT,$0-16 + JMP syscall·gettimeofday(SB) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_linux_arm.s b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_linux_arm.s new file mode 100644 index 0000000..cf0b574 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_linux_arm.s @@ -0,0 +1,29 @@ +// 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. + +// +build !gccgo + +#include "textflag.h" + +// +// System calls for arm, Linux +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + B syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + B syscall·Syscall6(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + B syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + B syscall·RawSyscall6(SB) + +TEXT ·seek(SB),NOSPLIT,$0-32 + B syscall·seek(SB) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_linux_arm64.s b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_linux_arm64.s new file mode 100644 index 0000000..4be9bfe --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_linux_arm64.s @@ -0,0 +1,24 @@ +// Copyright 2015 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 linux +// +build arm64 +// +build !gccgo + +#include "textflag.h" + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + B syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + B syscall·Syscall6(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + B syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + B syscall·RawSyscall6(SB) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_linux_mips64x.s b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_linux_mips64x.s new file mode 100644 index 0000000..724e580 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_linux_mips64x.s @@ -0,0 +1,28 @@ +// Copyright 2015 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 linux +// +build mips64 mips64le +// +build !gccgo + +#include "textflag.h" + +// +// System calls for mips64, Linux +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + JMP syscall·Syscall6(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + JMP syscall·RawSyscall6(SB) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_linux_mipsx.s b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_linux_mipsx.s new file mode 100644 index 0000000..2ea4257 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_linux_mipsx.s @@ -0,0 +1,31 @@ +// 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. + +// +build linux +// +build mips mipsle +// +build !gccgo + +#include "textflag.h" + +// +// System calls for mips, Linux +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + JMP syscall·RawSyscall6(SB) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s new file mode 100644 index 0000000..8d231fe --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s @@ -0,0 +1,28 @@ +// 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. + +// +build linux +// +build ppc64 ppc64le +// +build !gccgo + +#include "textflag.h" + +// +// System calls for ppc64, Linux +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + BR syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + BR syscall·Syscall6(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + BR syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + BR syscall·RawSyscall6(SB) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_linux_s390x.s b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_linux_s390x.s new file mode 100644 index 0000000..1188985 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_linux_s390x.s @@ -0,0 +1,28 @@ +// 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. + +// +build s390x +// +build linux +// +build !gccgo + +#include "textflag.h" + +// +// System calls for s390x, Linux +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + BR syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + BR syscall·Syscall6(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + BR syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + BR syscall·RawSyscall6(SB) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_netbsd_386.s b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_netbsd_386.s new file mode 100644 index 0000000..48bdcd7 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_netbsd_386.s @@ -0,0 +1,29 @@ +// 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. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for 386, NetBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + JMP syscall·RawSyscall6(SB) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_netbsd_amd64.s b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_netbsd_amd64.s new file mode 100644 index 0000000..2ede05c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_netbsd_amd64.s @@ -0,0 +1,29 @@ +// 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. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for AMD64, NetBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-104 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + JMP syscall·RawSyscall6(SB) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_netbsd_arm.s b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_netbsd_arm.s new file mode 100644 index 0000000..e892857 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_netbsd_arm.s @@ -0,0 +1,29 @@ +// 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. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for ARM, NetBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + B syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + B syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + B syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + B syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + B syscall·RawSyscall6(SB) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_openbsd_386.s b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_openbsd_386.s new file mode 100644 index 0000000..00576f3 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_openbsd_386.s @@ -0,0 +1,29 @@ +// 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. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for 386, OpenBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + JMP syscall·RawSyscall6(SB) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_openbsd_amd64.s b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_openbsd_amd64.s new file mode 100644 index 0000000..790ef77 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_openbsd_amd64.s @@ -0,0 +1,29 @@ +// 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. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for AMD64, OpenBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-104 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + JMP syscall·RawSyscall6(SB) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_openbsd_arm.s b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_openbsd_arm.s new file mode 100644 index 0000000..469bfa1 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_openbsd_arm.s @@ -0,0 +1,29 @@ +// 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. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for ARM, OpenBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + B syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + B syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + B syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + B syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + B syscall·RawSyscall6(SB) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_solaris_amd64.s b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_solaris_amd64.s new file mode 100644 index 0000000..ded8260 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/asm_solaris_amd64.s @@ -0,0 +1,17 @@ +// 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. + +// +build !gccgo + +#include "textflag.h" + +// +// System calls for amd64, Solaris are implemented in runtime/syscall_solaris.go +// + +TEXT ·sysvicall6(SB),NOSPLIT,$0-88 + JMP syscall·sysvicall6(SB) + +TEXT ·rawSysvicall6(SB),NOSPLIT,$0-88 + JMP syscall·rawSysvicall6(SB) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/bluetooth_linux.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/bluetooth_linux.go new file mode 100644 index 0000000..6e32296 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/bluetooth_linux.go @@ -0,0 +1,35 @@ +// 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. + +// Bluetooth sockets and messages + +package unix + +// Bluetooth Protocols +const ( + BTPROTO_L2CAP = 0 + BTPROTO_HCI = 1 + BTPROTO_SCO = 2 + BTPROTO_RFCOMM = 3 + BTPROTO_BNEP = 4 + BTPROTO_CMTP = 5 + BTPROTO_HIDP = 6 + BTPROTO_AVDTP = 7 +) + +const ( + HCI_CHANNEL_RAW = 0 + HCI_CHANNEL_USER = 1 + HCI_CHANNEL_MONITOR = 2 + HCI_CHANNEL_CONTROL = 3 +) + +// Socketoption Level +const ( + SOL_BLUETOOTH = 0x112 + SOL_HCI = 0x0 + SOL_L2CAP = 0x6 + SOL_RFCOMM = 0x12 + SOL_SCO = 0x11 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/cap_freebsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/cap_freebsd.go new file mode 100644 index 0000000..83b6bce --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/cap_freebsd.go @@ -0,0 +1,195 @@ +// 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. + +// +build freebsd + +package unix + +import ( + errorspkg "errors" + "fmt" +) + +// Go implementation of C mostly found in /usr/src/sys/kern/subr_capability.c + +const ( + // This is the version of CapRights this package understands. See C implementation for parallels. + capRightsGoVersion = CAP_RIGHTS_VERSION_00 + capArSizeMin = CAP_RIGHTS_VERSION_00 + 2 + capArSizeMax = capRightsGoVersion + 2 +) + +var ( + bit2idx = []int{ + -1, 0, 1, -1, 2, -1, -1, -1, 3, -1, -1, -1, -1, -1, -1, -1, + 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + } +) + +func capidxbit(right uint64) int { + return int((right >> 57) & 0x1f) +} + +func rightToIndex(right uint64) (int, error) { + idx := capidxbit(right) + if idx < 0 || idx >= len(bit2idx) { + return -2, fmt.Errorf("index for right 0x%x out of range", right) + } + return bit2idx[idx], nil +} + +func caprver(right uint64) int { + return int(right >> 62) +} + +func capver(rights *CapRights) int { + return caprver(rights.Rights[0]) +} + +func caparsize(rights *CapRights) int { + return capver(rights) + 2 +} + +// CapRightsSet sets the permissions in setrights in rights. +func CapRightsSet(rights *CapRights, setrights []uint64) error { + // This is essentially a copy of cap_rights_vset() + if capver(rights) != CAP_RIGHTS_VERSION_00 { + return fmt.Errorf("bad rights version %d", capver(rights)) + } + + n := caparsize(rights) + if n < capArSizeMin || n > capArSizeMax { + return errorspkg.New("bad rights size") + } + + for _, right := range setrights { + if caprver(right) != CAP_RIGHTS_VERSION_00 { + return errorspkg.New("bad right version") + } + i, err := rightToIndex(right) + if err != nil { + return err + } + if i >= n { + return errorspkg.New("index overflow") + } + if capidxbit(rights.Rights[i]) != capidxbit(right) { + return errorspkg.New("index mismatch") + } + rights.Rights[i] |= right + if capidxbit(rights.Rights[i]) != capidxbit(right) { + return errorspkg.New("index mismatch (after assign)") + } + } + + return nil +} + +// CapRightsClear clears the permissions in clearrights from rights. +func CapRightsClear(rights *CapRights, clearrights []uint64) error { + // This is essentially a copy of cap_rights_vclear() + if capver(rights) != CAP_RIGHTS_VERSION_00 { + return fmt.Errorf("bad rights version %d", capver(rights)) + } + + n := caparsize(rights) + if n < capArSizeMin || n > capArSizeMax { + return errorspkg.New("bad rights size") + } + + for _, right := range clearrights { + if caprver(right) != CAP_RIGHTS_VERSION_00 { + return errorspkg.New("bad right version") + } + i, err := rightToIndex(right) + if err != nil { + return err + } + if i >= n { + return errorspkg.New("index overflow") + } + if capidxbit(rights.Rights[i]) != capidxbit(right) { + return errorspkg.New("index mismatch") + } + rights.Rights[i] &= ^(right & 0x01FFFFFFFFFFFFFF) + if capidxbit(rights.Rights[i]) != capidxbit(right) { + return errorspkg.New("index mismatch (after assign)") + } + } + + return nil +} + +// CapRightsIsSet checks whether all the permissions in setrights are present in rights. +func CapRightsIsSet(rights *CapRights, setrights []uint64) (bool, error) { + // This is essentially a copy of cap_rights_is_vset() + if capver(rights) != CAP_RIGHTS_VERSION_00 { + return false, fmt.Errorf("bad rights version %d", capver(rights)) + } + + n := caparsize(rights) + if n < capArSizeMin || n > capArSizeMax { + return false, errorspkg.New("bad rights size") + } + + for _, right := range setrights { + if caprver(right) != CAP_RIGHTS_VERSION_00 { + return false, errorspkg.New("bad right version") + } + i, err := rightToIndex(right) + if err != nil { + return false, err + } + if i >= n { + return false, errorspkg.New("index overflow") + } + if capidxbit(rights.Rights[i]) != capidxbit(right) { + return false, errorspkg.New("index mismatch") + } + if (rights.Rights[i] & right) != right { + return false, nil + } + } + + return true, nil +} + +func capright(idx uint64, bit uint64) uint64 { + return ((1 << (57 + idx)) | bit) +} + +// CapRightsInit returns a pointer to an initialised CapRights structure filled with rights. +// See man cap_rights_init(3) and rights(4). +func CapRightsInit(rights []uint64) (*CapRights, error) { + var r CapRights + r.Rights[0] = (capRightsGoVersion << 62) | capright(0, 0) + r.Rights[1] = capright(1, 0) + + err := CapRightsSet(&r, rights) + if err != nil { + return nil, err + } + return &r, nil +} + +// CapRightsLimit reduces the operations permitted on fd to at most those contained in rights. +// The capability rights on fd can never be increased by CapRightsLimit. +// See man cap_rights_limit(2) and rights(4). +func CapRightsLimit(fd uintptr, rights *CapRights) error { + return capRightsLimit(int(fd), rights) +} + +// CapRightsGet returns a CapRights structure containing the operations permitted on fd. +// See man cap_rights_get(3) and rights(4). +func CapRightsGet(fd uintptr) (*CapRights, error) { + r, err := CapRightsInit(nil) + if err != nil { + return nil, err + } + err = capRightsGet(capRightsGoVersion, int(fd), r) + if err != nil { + return nil, err + } + return r, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/constants.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/constants.go new file mode 100644 index 0000000..a96f0eb --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/constants.go @@ -0,0 +1,13 @@ +// Copyright 2015 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 darwin dragonfly freebsd linux netbsd openbsd solaris + +package unix + +const ( + R_OK = 0x4 + W_OK = 0x2 + X_OK = 0x1 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/creds_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/creds_test.go new file mode 100644 index 0000000..7ae3305 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/creds_test.go @@ -0,0 +1,136 @@ +// 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. + +// +build linux + +package unix_test + +import ( + "bytes" + "net" + "os" + "syscall" + "testing" + + "golang.org/x/sys/unix" +) + +// TestSCMCredentials tests the sending and receiving of credentials +// (PID, UID, GID) in an ancillary message between two UNIX +// sockets. The SO_PASSCRED socket option is enabled on the sending +// socket for this to work. +func TestSCMCredentials(t *testing.T) { + socketTypeTests := []struct { + socketType int + dataLen int + }{ + { + unix.SOCK_STREAM, + 1, + }, { + unix.SOCK_DGRAM, + 0, + }, + } + + for _, tt := range socketTypeTests { + fds, err := unix.Socketpair(unix.AF_LOCAL, tt.socketType, 0) + if err != nil { + t.Fatalf("Socketpair: %v", err) + } + defer unix.Close(fds[0]) + defer unix.Close(fds[1]) + + err = unix.SetsockoptInt(fds[0], unix.SOL_SOCKET, unix.SO_PASSCRED, 1) + if err != nil { + t.Fatalf("SetsockoptInt: %v", err) + } + + srvFile := os.NewFile(uintptr(fds[0]), "server") + defer srvFile.Close() + srv, err := net.FileConn(srvFile) + if err != nil { + t.Errorf("FileConn: %v", err) + return + } + defer srv.Close() + + cliFile := os.NewFile(uintptr(fds[1]), "client") + defer cliFile.Close() + cli, err := net.FileConn(cliFile) + if err != nil { + t.Errorf("FileConn: %v", err) + return + } + defer cli.Close() + + var ucred unix.Ucred + if os.Getuid() != 0 { + ucred.Pid = int32(os.Getpid()) + ucred.Uid = 0 + ucred.Gid = 0 + oob := unix.UnixCredentials(&ucred) + _, _, err := cli.(*net.UnixConn).WriteMsgUnix(nil, oob, nil) + if op, ok := err.(*net.OpError); ok { + err = op.Err + } + if sys, ok := err.(*os.SyscallError); ok { + err = sys.Err + } + if err != syscall.EPERM { + t.Fatalf("WriteMsgUnix failed with %v, want EPERM", err) + } + } + + ucred.Pid = int32(os.Getpid()) + ucred.Uid = uint32(os.Getuid()) + ucred.Gid = uint32(os.Getgid()) + oob := unix.UnixCredentials(&ucred) + + // On SOCK_STREAM, this is internally going to send a dummy byte + n, oobn, err := cli.(*net.UnixConn).WriteMsgUnix(nil, oob, nil) + if err != nil { + t.Fatalf("WriteMsgUnix: %v", err) + } + if n != 0 { + t.Fatalf("WriteMsgUnix n = %d, want 0", n) + } + if oobn != len(oob) { + t.Fatalf("WriteMsgUnix oobn = %d, want %d", oobn, len(oob)) + } + + oob2 := make([]byte, 10*len(oob)) + n, oobn2, flags, _, err := srv.(*net.UnixConn).ReadMsgUnix(nil, oob2) + if err != nil { + t.Fatalf("ReadMsgUnix: %v", err) + } + if flags != 0 { + t.Fatalf("ReadMsgUnix flags = 0x%x, want 0", flags) + } + if n != tt.dataLen { + t.Fatalf("ReadMsgUnix n = %d, want %d", n, tt.dataLen) + } + if oobn2 != oobn { + // without SO_PASSCRED set on the socket, ReadMsgUnix will + // return zero oob bytes + t.Fatalf("ReadMsgUnix oobn = %d, want %d", oobn2, oobn) + } + oob2 = oob2[:oobn2] + if !bytes.Equal(oob, oob2) { + t.Fatal("ReadMsgUnix oob bytes don't match") + } + + scm, err := unix.ParseSocketControlMessage(oob2) + if err != nil { + t.Fatalf("ParseSocketControlMessage: %v", err) + } + newUcred, err := unix.ParseUnixCredentials(&scm[0]) + if err != nil { + t.Fatalf("ParseUnixCredentials: %v", err) + } + if *newUcred != ucred { + t.Fatalf("ParseUnixCredentials = %+v, want %+v", newUcred, ucred) + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_darwin.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_darwin.go new file mode 100644 index 0000000..8d1dc0f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_darwin.go @@ -0,0 +1,24 @@ +// 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. + +// Functions to access/create device major and minor numbers matching the +// encoding used in Darwin's sys/types.h header. + +package unix + +// Major returns the major component of a Darwin device number. +func Major(dev uint64) uint32 { + return uint32((dev >> 24) & 0xff) +} + +// Minor returns the minor component of a Darwin device number. +func Minor(dev uint64) uint32 { + return uint32(dev & 0xffffff) +} + +// Mkdev returns a Darwin device number generated from the given major and minor +// components. +func Mkdev(major, minor uint32) uint64 { + return (uint64(major) << 24) | uint64(minor) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_darwin_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_darwin_test.go new file mode 100644 index 0000000..48d0448 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_darwin_test.go @@ -0,0 +1,49 @@ +// 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 unix_test + +import ( + "fmt" + "testing" + + "golang.org/x/sys/unix" +) + +func TestDevices(t *testing.T) { + testCases := []struct { + path string + major uint32 + minor uint32 + }{ + // Most of the device major/minor numbers on Darwin are + // dynamically generated by devfs. These are some well-known + // static numbers. + {"/dev/ttyp0", 4, 0}, + {"/dev/ttys0", 4, 48}, + {"/dev/ptyp0", 5, 0}, + {"/dev/ptyr0", 5, 32}, + } + for _, tc := range testCases { + t.Run(fmt.Sprintf("%s %v:%v", tc.path, tc.major, tc.minor), func(t *testing.T) { + var stat unix.Stat_t + err := unix.Stat(tc.path, &stat) + if err != nil { + t.Errorf("failed to stat device: %v", err) + return + } + + dev := uint64(stat.Rdev) + if unix.Major(dev) != tc.major { + t.Errorf("for %s Major(%#x) == %d, want %d", tc.path, dev, unix.Major(dev), tc.major) + } + if unix.Minor(dev) != tc.minor { + t.Errorf("for %s Minor(%#x) == %d, want %d", tc.path, dev, unix.Minor(dev), tc.minor) + } + if unix.Mkdev(tc.major, tc.minor) != dev { + t.Errorf("for %s Mkdev(%d, %d) == %#x, want %#x", tc.path, tc.major, tc.minor, unix.Mkdev(tc.major, tc.minor), dev) + } + }) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_dragonfly.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_dragonfly.go new file mode 100644 index 0000000..8502f20 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_dragonfly.go @@ -0,0 +1,30 @@ +// 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. + +// Functions to access/create device major and minor numbers matching the +// encoding used in Dragonfly's sys/types.h header. +// +// The information below is extracted and adapted from sys/types.h: +// +// Minor gives a cookie instead of an index since in order to avoid changing the +// meanings of bits 0-15 or wasting time and space shifting bits 16-31 for +// devices that don't use them. + +package unix + +// Major returns the major component of a DragonFlyBSD device number. +func Major(dev uint64) uint32 { + return uint32((dev >> 8) & 0xff) +} + +// Minor returns the minor component of a DragonFlyBSD device number. +func Minor(dev uint64) uint32 { + return uint32(dev & 0xffff00ff) +} + +// Mkdev returns a DragonFlyBSD device number generated from the given major and +// minor components. +func Mkdev(major, minor uint32) uint64 { + return (uint64(major) << 8) | uint64(minor) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_dragonfly_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_dragonfly_test.go new file mode 100644 index 0000000..2caba08 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_dragonfly_test.go @@ -0,0 +1,48 @@ +// 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 unix_test + +import ( + "fmt" + "testing" + + "golang.org/x/sys/unix" +) + +func TestDevices(t *testing.T) { + testCases := []struct { + path string + major uint32 + minor uint32 + }{ + // Minor is a cookie instead of an index on DragonFlyBSD + {"/dev/null", 10, 0x00000002}, + {"/dev/random", 10, 0x00000003}, + {"/dev/urandom", 10, 0x00000004}, + {"/dev/zero", 10, 0x0000000c}, + {"/dev/bpf", 15, 0xffff00ff}, + } + for _, tc := range testCases { + t.Run(fmt.Sprintf("%s %v:%v", tc.path, tc.major, tc.minor), func(t *testing.T) { + var stat unix.Stat_t + err := unix.Stat(tc.path, &stat) + if err != nil { + t.Errorf("failed to stat device: %v", err) + return + } + + dev := uint64(stat.Rdev) + if unix.Major(dev) != tc.major { + t.Errorf("for %s Major(%#x) == %d, want %d", tc.path, dev, unix.Major(dev), tc.major) + } + if unix.Minor(dev) != tc.minor { + t.Errorf("for %s Minor(%#x) == %d, want %d", tc.path, dev, unix.Minor(dev), tc.minor) + } + if unix.Mkdev(tc.major, tc.minor) != dev { + t.Errorf("for %s Mkdev(%d, %d) == %#x, want %#x", tc.path, tc.major, tc.minor, unix.Mkdev(tc.major, tc.minor), dev) + } + }) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_freebsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_freebsd.go new file mode 100644 index 0000000..eba3b4b --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_freebsd.go @@ -0,0 +1,30 @@ +// 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. + +// Functions to access/create device major and minor numbers matching the +// encoding used in FreeBSD's sys/types.h header. +// +// The information below is extracted and adapted from sys/types.h: +// +// Minor gives a cookie instead of an index since in order to avoid changing the +// meanings of bits 0-15 or wasting time and space shifting bits 16-31 for +// devices that don't use them. + +package unix + +// Major returns the major component of a FreeBSD device number. +func Major(dev uint64) uint32 { + return uint32((dev >> 8) & 0xff) +} + +// Minor returns the minor component of a FreeBSD device number. +func Minor(dev uint64) uint32 { + return uint32(dev & 0xffff00ff) +} + +// Mkdev returns a FreeBSD device number generated from the given major and +// minor components. +func Mkdev(major, minor uint32) uint64 { + return (uint64(major) << 8) | uint64(minor) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_linux.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_linux.go new file mode 100644 index 0000000..d165d6f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_linux.go @@ -0,0 +1,42 @@ +// 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. + +// Functions to access/create device major and minor numbers matching the +// encoding used by the Linux kernel and glibc. +// +// The information below is extracted and adapted from bits/sysmacros.h in the +// glibc sources: +// +// dev_t in glibc is 64-bit, with 32-bit major and minor numbers. glibc's +// default encoding is MMMM Mmmm mmmM MMmm, where M is a hex digit of the major +// number and m is a hex digit of the minor number. This is backward compatible +// with legacy systems where dev_t is 16 bits wide, encoded as MMmm. It is also +// backward compatible with the Linux kernel, which for some architectures uses +// 32-bit dev_t, encoded as mmmM MMmm. + +package unix + +// Major returns the major component of a Linux device number. +func Major(dev uint64) uint32 { + major := uint32((dev & 0x00000000000fff00) >> 8) + major |= uint32((dev & 0xfffff00000000000) >> 32) + return major +} + +// Minor returns the minor component of a Linux device number. +func Minor(dev uint64) uint32 { + minor := uint32((dev & 0x00000000000000ff) >> 0) + minor |= uint32((dev & 0x00000ffffff00000) >> 12) + return minor +} + +// Mkdev returns a Linux device number generated from the given major and minor +// components. +func Mkdev(major, minor uint32) uint64 { + dev := (uint64(major) & 0x00000fff) << 8 + dev |= (uint64(major) & 0xfffff000) << 32 + dev |= (uint64(minor) & 0x000000ff) << 0 + dev |= (uint64(minor) & 0xffffff00) << 12 + return dev +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_linux_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_linux_test.go new file mode 100644 index 0000000..6e001f3 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_linux_test.go @@ -0,0 +1,51 @@ +// 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 unix_test + +import ( + "fmt" + "testing" + + "golang.org/x/sys/unix" +) + +func TestDevices(t *testing.T) { + testCases := []struct { + path string + major uint32 + minor uint32 + }{ + // well known major/minor numbers according to + // https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/admin-guide/devices.txt + {"/dev/null", 1, 3}, + {"/dev/zero", 1, 5}, + {"/dev/random", 1, 8}, + {"/dev/full", 1, 7}, + {"/dev/urandom", 1, 9}, + {"/dev/tty", 5, 0}, + } + for _, tc := range testCases { + t.Run(fmt.Sprintf("%s %v:%v", tc.path, tc.major, tc.minor), func(t *testing.T) { + var stat unix.Stat_t + err := unix.Stat(tc.path, &stat) + if err != nil { + t.Errorf("failed to stat device: %v", err) + return + } + + dev := uint64(stat.Rdev) + if unix.Major(dev) != tc.major { + t.Errorf("for %s Major(%#x) == %d, want %d", tc.path, dev, unix.Major(dev), tc.major) + } + if unix.Minor(dev) != tc.minor { + t.Errorf("for %s Minor(%#x) == %d, want %d", tc.path, dev, unix.Minor(dev), tc.minor) + } + if unix.Mkdev(tc.major, tc.minor) != dev { + t.Errorf("for %s Mkdev(%d, %d) == %#x, want %#x", tc.path, tc.major, tc.minor, unix.Mkdev(tc.major, tc.minor), dev) + } + }) + + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_netbsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_netbsd.go new file mode 100644 index 0000000..b4a203d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_netbsd.go @@ -0,0 +1,29 @@ +// 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. + +// Functions to access/create device major and minor numbers matching the +// encoding used in NetBSD's sys/types.h header. + +package unix + +// Major returns the major component of a NetBSD device number. +func Major(dev uint64) uint32 { + return uint32((dev & 0x000fff00) >> 8) +} + +// Minor returns the minor component of a NetBSD device number. +func Minor(dev uint64) uint32 { + minor := uint32((dev & 0x000000ff) >> 0) + minor |= uint32((dev & 0xfff00000) >> 12) + return minor +} + +// Mkdev returns a NetBSD device number generated from the given major and minor +// components. +func Mkdev(major, minor uint32) uint64 { + dev := (uint64(major) << 8) & 0x000fff00 + dev |= (uint64(minor) << 12) & 0xfff00000 + dev |= (uint64(minor) << 0) & 0x000000ff + return dev +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_netbsd_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_netbsd_test.go new file mode 100644 index 0000000..c39a80a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_netbsd_test.go @@ -0,0 +1,50 @@ +// 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 unix_test + +import ( + "fmt" + "testing" + + "golang.org/x/sys/unix" +) + +func TestDevices(t *testing.T) { + testCases := []struct { + path string + major uint32 + minor uint32 + }{ + // well known major/minor numbers according to /dev/MAKEDEV on + // NetBSD 7.0 + {"/dev/null", 2, 2}, + {"/dev/zero", 2, 12}, + {"/dev/ttyp0", 5, 0}, + {"/dev/ttyp1", 5, 1}, + {"/dev/random", 46, 0}, + {"/dev/urandom", 46, 1}, + } + for _, tc := range testCases { + t.Run(fmt.Sprintf("%s %v:%v", tc.path, tc.major, tc.minor), func(t *testing.T) { + var stat unix.Stat_t + err := unix.Stat(tc.path, &stat) + if err != nil { + t.Errorf("failed to stat device: %v", err) + return + } + + dev := uint64(stat.Rdev) + if unix.Major(dev) != tc.major { + t.Errorf("for %s Major(%#x) == %d, want %d", tc.path, dev, unix.Major(dev), tc.major) + } + if unix.Minor(dev) != tc.minor { + t.Errorf("for %s Minor(%#x) == %d, want %d", tc.path, dev, unix.Minor(dev), tc.minor) + } + if unix.Mkdev(tc.major, tc.minor) != dev { + t.Errorf("for %s Mkdev(%d, %d) == %#x, want %#x", tc.path, tc.major, tc.minor, unix.Mkdev(tc.major, tc.minor), dev) + } + }) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_openbsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_openbsd.go new file mode 100644 index 0000000..f3430c4 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_openbsd.go @@ -0,0 +1,29 @@ +// 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. + +// Functions to access/create device major and minor numbers matching the +// encoding used in OpenBSD's sys/types.h header. + +package unix + +// Major returns the major component of an OpenBSD device number. +func Major(dev uint64) uint32 { + return uint32((dev & 0x0000ff00) >> 8) +} + +// Minor returns the minor component of an OpenBSD device number. +func Minor(dev uint64) uint32 { + minor := uint32((dev & 0x000000ff) >> 0) + minor |= uint32((dev & 0xffff0000) >> 8) + return minor +} + +// Mkdev returns an OpenBSD device number generated from the given major and minor +// components. +func Mkdev(major, minor uint32) uint64 { + dev := (uint64(major) << 8) & 0x0000ff00 + dev |= (uint64(minor) << 8) & 0xffff0000 + dev |= (uint64(minor) << 0) & 0x000000ff + return dev +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_openbsd_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_openbsd_test.go new file mode 100644 index 0000000..5635d27 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_openbsd_test.go @@ -0,0 +1,52 @@ +// 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 unix_test + +import ( + "fmt" + "testing" + + "golang.org/x/sys/unix" +) + +func TestDevices(t *testing.T) { + testCases := []struct { + path string + major uint32 + minor uint32 + }{ + // well known major/minor numbers according to /dev/MAKEDEV on + // OpenBSD 6.0 + {"/dev/null", 2, 2}, + {"/dev/zero", 2, 12}, + {"/dev/ttyp0", 5, 0}, + {"/dev/ttyp1", 5, 1}, + {"/dev/random", 45, 0}, + {"/dev/srandom", 45, 1}, + {"/dev/urandom", 45, 2}, + {"/dev/arandom", 45, 3}, + } + for _, tc := range testCases { + t.Run(fmt.Sprintf("%s %v:%v", tc.path, tc.major, tc.minor), func(t *testing.T) { + var stat unix.Stat_t + err := unix.Stat(tc.path, &stat) + if err != nil { + t.Errorf("failed to stat device: %v", err) + return + } + + dev := uint64(stat.Rdev) + if unix.Major(dev) != tc.major { + t.Errorf("for %s Major(%#x) == %d, want %d", tc.path, dev, unix.Major(dev), tc.major) + } + if unix.Minor(dev) != tc.minor { + t.Errorf("for %s Minor(%#x) == %d, want %d", tc.path, dev, unix.Minor(dev), tc.minor) + } + if unix.Mkdev(tc.major, tc.minor) != dev { + t.Errorf("for %s Mkdev(%d, %d) == %#x, want %#x", tc.path, tc.major, tc.minor, unix.Mkdev(tc.major, tc.minor), dev) + } + }) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_solaris_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_solaris_test.go new file mode 100644 index 0000000..db58c0d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dev_solaris_test.go @@ -0,0 +1,49 @@ +// 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 unix_test + +import ( + "fmt" + "testing" + + "golang.org/x/sys/unix" +) + +func TestDevices(t *testing.T) { + testCases := []struct { + path string + major uint32 + minor uint32 + }{ + // Well-known major/minor numbers on OpenSolaris according to + // /etc/name_to_major + {"/dev/zero", 134, 12}, + {"/dev/null", 134, 2}, + {"/dev/ptyp0", 172, 0}, + {"/dev/ttyp0", 175, 0}, + {"/dev/ttyp1", 175, 1}, + } + for _, tc := range testCases { + t.Run(fmt.Sprintf("%s %v:%v", tc.path, tc.major, tc.minor), func(t *testing.T) { + var stat unix.Stat_t + err := unix.Stat(tc.path, &stat) + if err != nil { + t.Errorf("failed to stat device: %v", err) + return + } + + dev := uint64(stat.Rdev) + if unix.Major(dev) != tc.major { + t.Errorf("for %s Major(%#x) == %d, want %d", tc.path, dev, unix.Major(dev), tc.major) + } + if unix.Minor(dev) != tc.minor { + t.Errorf("for %s Minor(%#x) == %d, want %d", tc.path, dev, unix.Minor(dev), tc.minor) + } + if unix.Mkdev(tc.major, tc.minor) != dev { + t.Errorf("for %s Mkdev(%d, %d) == %#x, want %#x", tc.path, tc.major, tc.minor, unix.Mkdev(tc.major, tc.minor), dev) + } + }) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dirent.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dirent.go new file mode 100644 index 0000000..bd47581 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/dirent.go @@ -0,0 +1,102 @@ +// 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. + +// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris + +package unix + +import "unsafe" + +// readInt returns the size-bytes unsigned integer in native byte order at offset off. +func readInt(b []byte, off, size uintptr) (u uint64, ok bool) { + if len(b) < int(off+size) { + return 0, false + } + if isBigEndian { + return readIntBE(b[off:], size), true + } + return readIntLE(b[off:], size), true +} + +func readIntBE(b []byte, size uintptr) uint64 { + switch size { + case 1: + return uint64(b[0]) + case 2: + _ = b[1] // bounds check hint to compiler; see golang.org/issue/14808 + return uint64(b[1]) | uint64(b[0])<<8 + case 4: + _ = b[3] // bounds check hint to compiler; see golang.org/issue/14808 + return uint64(b[3]) | uint64(b[2])<<8 | uint64(b[1])<<16 | uint64(b[0])<<24 + case 8: + _ = 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 + default: + panic("syscall: readInt with unsupported size") + } +} + +func readIntLE(b []byte, size uintptr) uint64 { + switch size { + case 1: + return uint64(b[0]) + case 2: + _ = b[1] // bounds check hint to compiler; see golang.org/issue/14808 + return uint64(b[0]) | uint64(b[1])<<8 + case 4: + _ = b[3] // 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 + case 8: + _ = 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 + default: + panic("syscall: readInt with unsupported size") + } +} + +// ParseDirent parses up to max directory entries in buf, +// appending the names to names. It returns the number of +// bytes consumed from buf, the number of entries added +// to names, and the new names slice. +func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, newnames []string) { + origlen := len(buf) + count = 0 + for max != 0 && len(buf) > 0 { + reclen, ok := direntReclen(buf) + if !ok || reclen > uint64(len(buf)) { + return origlen, count, names + } + rec := buf[:reclen] + buf = buf[reclen:] + ino, ok := direntIno(rec) + if !ok { + break + } + if ino == 0 { // File absent in directory. + continue + } + const namoff = uint64(unsafe.Offsetof(Dirent{}.Name)) + namlen, ok := direntNamlen(rec) + if !ok || namoff+namlen > uint64(len(rec)) { + break + } + name := rec[namoff : namoff+namlen] + for i, c := range name { + if c == 0 { + name = name[:i] + break + } + } + // Check for useless names before allocating a string. + if string(name) == "." || string(name) == ".." { + continue + } + max-- + count++ + names = append(names, string(name)) + } + return origlen - len(buf), count, names +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/endian_big.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/endian_big.go new file mode 100644 index 0000000..5e92690 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/endian_big.go @@ -0,0 +1,9 @@ +// 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. +// +// +build ppc64 s390x mips mips64 + +package unix + +const isBigEndian = true diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/endian_little.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/endian_little.go new file mode 100644 index 0000000..085df2d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/endian_little.go @@ -0,0 +1,9 @@ +// 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. +// +// +build 386 amd64 amd64p32 arm arm64 ppc64le mipsle mips64le + +package unix + +const isBigEndian = false diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/env_unix.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/env_unix.go new file mode 100644 index 0000000..45e281a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/env_unix.go @@ -0,0 +1,27 @@ +// 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +// Unix environment variables. + +package unix + +import "syscall" + +func Getenv(key string) (value string, found bool) { + return syscall.Getenv(key) +} + +func Setenv(key, value string) error { + return syscall.Setenv(key, value) +} + +func Clearenv() { + syscall.Clearenv() +} + +func Environ() []string { + return syscall.Environ() +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/env_unset.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/env_unset.go new file mode 100644 index 0000000..9222262 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/env_unset.go @@ -0,0 +1,14 @@ +// 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. + +// +build go1.4 + +package unix + +import "syscall" + +func Unsetenv(key string) error { + // This was added in Go 1.4. + return syscall.Unsetenv(key) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/errors_freebsd_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/errors_freebsd_386.go new file mode 100644 index 0000000..c56bc8b --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/errors_freebsd_386.go @@ -0,0 +1,227 @@ +// 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. + +// Constants that were deprecated or moved to enums in the FreeBSD headers. Keep +// them here for backwards compatibility. + +package unix + +const ( + IFF_SMART = 0x20 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BSC = 0x53 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf2 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_IPXIP = 0xf9 + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf6 + IFT_PFSYNC = 0xf7 + IFT_PLC = 0xae + IFT_POS = 0xab + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf1 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_STF = 0xd7 + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VOICEEM = 0x64 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IPPROTO_MAXID = 0x34 + IPV6_FAITH = 0x1d + IP_FAITH = 0x16 + MAP_NORESERVE = 0x40 + MAP_RENAME = 0x20 + NET_RT_MAXID = 0x6 + RTF_PRCLONING = 0x10000 + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + SIOCADDRT = 0x8030720a + SIOCALIFADDR = 0x8118691b + SIOCDELRT = 0x8030720b + SIOCDLIFADDR = 0x8118691d + SIOCGLIFADDR = 0xc118691c + SIOCGLIFPHYADDR = 0xc118694b + SIOCSLIFPHYADDR = 0x8118694a +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/errors_freebsd_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/errors_freebsd_amd64.go new file mode 100644 index 0000000..3e97711 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/errors_freebsd_amd64.go @@ -0,0 +1,227 @@ +// 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. + +// Constants that were deprecated or moved to enums in the FreeBSD headers. Keep +// them here for backwards compatibility. + +package unix + +const ( + IFF_SMART = 0x20 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BSC = 0x53 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf2 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_IPXIP = 0xf9 + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf6 + IFT_PFSYNC = 0xf7 + IFT_PLC = 0xae + IFT_POS = 0xab + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf1 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_STF = 0xd7 + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VOICEEM = 0x64 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IPPROTO_MAXID = 0x34 + IPV6_FAITH = 0x1d + IP_FAITH = 0x16 + MAP_NORESERVE = 0x40 + MAP_RENAME = 0x20 + NET_RT_MAXID = 0x6 + RTF_PRCLONING = 0x10000 + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + SIOCADDRT = 0x8040720a + SIOCALIFADDR = 0x8118691b + SIOCDELRT = 0x8040720b + SIOCDLIFADDR = 0x8118691d + SIOCGLIFADDR = 0xc118691c + SIOCGLIFPHYADDR = 0xc118694b + SIOCSLIFPHYADDR = 0x8118694a +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/errors_freebsd_arm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/errors_freebsd_arm.go new file mode 100644 index 0000000..856dca3 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/errors_freebsd_arm.go @@ -0,0 +1,226 @@ +// 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 unix + +const ( + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BSC = 0x53 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf6 + IFT_PFSYNC = 0xf7 + IFT_PLC = 0xae + IFT_POS = 0xab + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf1 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_STF = 0xd7 + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VOICEEM = 0x64 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + + // missing constants on FreeBSD-11.1-RELEASE, copied from old values in ztypes_freebsd_arm.go + IFF_SMART = 0x20 + IFT_FAITH = 0xf2 + IFT_IPXIP = 0xf9 + IPPROTO_MAXID = 0x34 + IPV6_FAITH = 0x1d + IP_FAITH = 0x16 + MAP_NORESERVE = 0x40 + MAP_RENAME = 0x20 + NET_RT_MAXID = 0x6 + RTF_PRCLONING = 0x10000 + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + SIOCADDRT = 0x8030720a + SIOCALIFADDR = 0x8118691b + SIOCDELRT = 0x8030720b + SIOCDLIFADDR = 0x8118691d + SIOCGLIFADDR = 0xc118691c + SIOCGLIFPHYADDR = 0xc118694b + SIOCSLIFPHYADDR = 0x8118694a +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/export_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/export_test.go new file mode 100644 index 0000000..b4fdd97 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/export_test.go @@ -0,0 +1,9 @@ +// Copyright 2015 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 darwin dragonfly freebsd linux netbsd openbsd solaris + +package unix + +var Itoa = itoa diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/file_unix.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/file_unix.go new file mode 100644 index 0000000..47f6a83 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/file_unix.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 unix + +import ( + "os" + "syscall" +) + +// FIXME: unexported function from os +// syscallMode returns the syscall-specific mode bits from Go's portable mode bits. +func syscallMode(i os.FileMode) (o uint32) { + o |= uint32(i.Perm()) + if i&os.ModeSetuid != 0 { + o |= syscall.S_ISUID + } + if i&os.ModeSetgid != 0 { + o |= syscall.S_ISGID + } + if i&os.ModeSticky != 0 { + o |= syscall.S_ISVTX + } + // No mapping for Go's ModeTemporary (plan9 only). + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/flock.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/flock.go new file mode 100644 index 0000000..2994ce7 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/flock.go @@ -0,0 +1,22 @@ +// 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd + +package unix + +import "unsafe" + +// fcntl64Syscall is usually SYS_FCNTL, but is overridden on 32-bit Linux +// systems by flock_linux_32bit.go to be SYS_FCNTL64. +var fcntl64Syscall uintptr = SYS_FCNTL + +// FcntlFlock performs a fcntl syscall for the F_GETLK, F_SETLK or F_SETLKW command. +func FcntlFlock(fd uintptr, cmd int, lk *Flock_t) error { + _, _, errno := Syscall(fcntl64Syscall, fd, uintptr(cmd), uintptr(unsafe.Pointer(lk))) + if errno == 0 { + return nil + } + return errno +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/flock_linux_32bit.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/flock_linux_32bit.go new file mode 100644 index 0000000..fc0e50e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/flock_linux_32bit.go @@ -0,0 +1,13 @@ +// +build linux,386 linux,arm linux,mips linux,mipsle + +// 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 unix + +func init() { + // On 32-bit Linux systems, the fcntl syscall that matches Go's + // Flock_t type is SYS_FCNTL64, not SYS_FCNTL. + fcntl64Syscall = SYS_FCNTL64 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/gccgo.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/gccgo.go new file mode 100644 index 0000000..94c8232 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/gccgo.go @@ -0,0 +1,46 @@ +// Copyright 2015 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 gccgo + +package unix + +import "syscall" + +// We can't use the gc-syntax .s files for gccgo. On the plus side +// much of the functionality can be written directly in Go. + +//extern gccgoRealSyscall +func realSyscall(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r, errno uintptr) + +func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) { + syscall.Entersyscall() + r, errno := realSyscall(trap, a1, a2, a3, 0, 0, 0, 0, 0, 0) + syscall.Exitsyscall() + return r, 0, syscall.Errno(errno) +} + +func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) { + syscall.Entersyscall() + r, errno := realSyscall(trap, a1, a2, a3, a4, a5, a6, 0, 0, 0) + syscall.Exitsyscall() + return r, 0, syscall.Errno(errno) +} + +func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) { + syscall.Entersyscall() + r, errno := realSyscall(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9) + syscall.Exitsyscall() + return r, 0, syscall.Errno(errno) +} + +func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) { + r, errno := realSyscall(trap, a1, a2, a3, 0, 0, 0, 0, 0, 0) + return r, 0, syscall.Errno(errno) +} + +func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) { + r, errno := realSyscall(trap, a1, a2, a3, a4, a5, a6, 0, 0, 0) + return r, 0, syscall.Errno(errno) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/gccgo_c.c b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/gccgo_c.c new file mode 100644 index 0000000..07f6be0 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/gccgo_c.c @@ -0,0 +1,41 @@ +// Copyright 2015 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 gccgo + +#include +#include +#include + +#define _STRINGIFY2_(x) #x +#define _STRINGIFY_(x) _STRINGIFY2_(x) +#define GOSYM_PREFIX _STRINGIFY_(__USER_LABEL_PREFIX__) + +// Call syscall from C code because the gccgo support for calling from +// Go to C does not support varargs functions. + +struct ret { + uintptr_t r; + uintptr_t err; +}; + +struct ret +gccgoRealSyscall(uintptr_t trap, uintptr_t a1, uintptr_t a2, uintptr_t a3, uintptr_t a4, uintptr_t a5, uintptr_t a6, uintptr_t a7, uintptr_t a8, uintptr_t a9) +{ + struct ret r; + + errno = 0; + r.r = syscall(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9); + r.err = errno; + return r; +} + +// Define the use function in C so that it is not inlined. + +extern void use(void *) __asm__ (GOSYM_PREFIX GOPKGPATH ".use") __attribute__((noinline)); + +void +use(void *p __attribute__ ((unused))) +{ +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go new file mode 100644 index 0000000..bffe1a7 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go @@ -0,0 +1,20 @@ +// Copyright 2015 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 gccgo,linux,amd64 + +package unix + +import "syscall" + +//extern gettimeofday +func realGettimeofday(*Timeval, *byte) int32 + +func gettimeofday(tv *Timeval) (err syscall.Errno) { + r := realGettimeofday(tv, nil) + if r < 0 { + return syscall.GetErrno() + } + return 0 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/linux/Dockerfile b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/linux/Dockerfile new file mode 100644 index 0000000..c448b9d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/linux/Dockerfile @@ -0,0 +1,51 @@ +FROM ubuntu:16.04 + +# Use the most recent ubuntu sources +RUN echo 'deb http://en.archive.ubuntu.com/ubuntu/ artful main universe' >> /etc/apt/sources.list + +# Dependencies to get the git sources and go binaries +RUN apt-get update && apt-get install -y \ + curl \ + git \ + && rm -rf /var/lib/apt/lists/* + +# Get the git sources. If not cached, this takes O(5 minutes). +WORKDIR /git +RUN git config --global advice.detachedHead false +# Linux Kernel: Released 03 Sep 2017 +RUN git clone --branch v4.13 --depth 1 https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux +# GNU C library: Released 02 Aug 2017 (we should try to get a secure way to clone this) +RUN git clone --branch glibc-2.26 --depth 1 git://sourceware.org/git/glibc.git + +# Get Go 1.8 (https://github.com/docker-library/golang/blob/master/1.8/Dockerfile) +ENV GOLANG_VERSION 1.8 +ENV GOLANG_DOWNLOAD_URL https://golang.org/dl/go$GOLANG_VERSION.linux-amd64.tar.gz +ENV GOLANG_DOWNLOAD_SHA256 53ab94104ee3923e228a2cb2116e5e462ad3ebaeea06ff04463479d7f12d27ca + +RUN curl -fsSL "$GOLANG_DOWNLOAD_URL" -o golang.tar.gz \ + && echo "$GOLANG_DOWNLOAD_SHA256 golang.tar.gz" | sha256sum -c - \ + && tar -C /usr/local -xzf golang.tar.gz \ + && rm golang.tar.gz + +ENV PATH /usr/local/go/bin:$PATH + +# Linux and Glibc build dependencies +RUN apt-get update && apt-get install -y \ + gawk make python \ + gcc gcc-multilib \ + gettext texinfo \ + && rm -rf /var/lib/apt/lists/* +# Emulator and cross compilers +RUN apt-get update && apt-get install -y \ + qemu \ + gcc-aarch64-linux-gnu gcc-arm-linux-gnueabi \ + gcc-mips-linux-gnu gcc-mips64-linux-gnuabi64 \ + gcc-mips64el-linux-gnuabi64 gcc-mipsel-linux-gnu \ + gcc-powerpc64-linux-gnu gcc-powerpc64le-linux-gnu \ + gcc-s390x-linux-gnu gcc-sparc64-linux-gnu \ + && rm -rf /var/lib/apt/lists/* + +# Let the scripts know they are in the docker environment +ENV GOLANG_SYS_BUILD docker +WORKDIR /build +ENTRYPOINT ["go", "run", "linux/mkall.go", "/git/linux", "/git/glibc"] diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/linux/mkall.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/linux/mkall.go new file mode 100644 index 0000000..429754f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/linux/mkall.go @@ -0,0 +1,379 @@ +// 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. + +// linux/mkall.go - Generates all Linux zsysnum, zsyscall, zerror, and ztype +// files for all 11 linux architectures supported by the go compiler. See +// README.md for more information about the build system. + +// To run it you must have a git checkout of the Linux kernel and glibc. Once +// the appropriate sources are ready, the program is run as: +// go run linux/mkall.go + +// +build ignore + +package main + +import ( + "fmt" + "os" + "os/exec" + "path/filepath" + "runtime" + "strings" +) + +// These will be paths to the appropriate source directories. +var LinuxDir string +var GlibcDir string + +const TempDir = "/tmp" +const IncludeDir = TempDir + "/include" // To hold our C headers +const BuildDir = TempDir + "/build" // To hold intermediate build files + +const GOOS = "linux" // Only for Linux targets +const BuildArch = "amd64" // Must be built on this architecture +const MinKernel = "2.6.23" // https://golang.org/doc/install#requirements + +type target struct { + GoArch string // Architecture name according to Go + LinuxArch string // Architecture name according to the Linux Kernel + GNUArch string // Architecture name according to GNU tools (https://wiki.debian.org/Multiarch/Tuples) + BigEndian bool // Default Little Endian + SignedChar bool // Is -fsigned-char needed (default no) + Bits int +} + +// List of the 11 Linux targets supported by the go compiler. sparc64 is not +// currently supported, though a port is in progress. +var targets = []target{ + { + GoArch: "386", + LinuxArch: "x86", + GNUArch: "i686-linux-gnu", // Note "i686" not "i386" + Bits: 32, + }, + { + GoArch: "amd64", + LinuxArch: "x86", + GNUArch: "x86_64-linux-gnu", + Bits: 64, + }, + { + GoArch: "arm64", + LinuxArch: "arm64", + GNUArch: "aarch64-linux-gnu", + SignedChar: true, + Bits: 64, + }, + { + GoArch: "arm", + LinuxArch: "arm", + GNUArch: "arm-linux-gnueabi", + Bits: 32, + }, + { + GoArch: "mips", + LinuxArch: "mips", + GNUArch: "mips-linux-gnu", + BigEndian: true, + Bits: 32, + }, + { + GoArch: "mipsle", + LinuxArch: "mips", + GNUArch: "mipsel-linux-gnu", + Bits: 32, + }, + { + GoArch: "mips64", + LinuxArch: "mips", + GNUArch: "mips64-linux-gnuabi64", + BigEndian: true, + Bits: 64, + }, + { + GoArch: "mips64le", + LinuxArch: "mips", + GNUArch: "mips64el-linux-gnuabi64", + Bits: 64, + }, + { + GoArch: "ppc64", + LinuxArch: "powerpc", + GNUArch: "powerpc64-linux-gnu", + BigEndian: true, + Bits: 64, + }, + { + GoArch: "ppc64le", + LinuxArch: "powerpc", + GNUArch: "powerpc64le-linux-gnu", + Bits: 64, + }, + { + GoArch: "s390x", + LinuxArch: "s390", + GNUArch: "s390x-linux-gnu", + BigEndian: true, + SignedChar: true, + Bits: 64, + }, + // { + // GoArch: "sparc64", + // LinuxArch: "sparc", + // GNUArch: "sparc64-linux-gnu", + // BigEndian: true, + // Bits: 64, + // }, +} + +func main() { + if runtime.GOOS != GOOS || runtime.GOARCH != BuildArch { + fmt.Printf("Build system has GOOS_GOARCH = %s_%s, need %s_%s\n", + runtime.GOOS, runtime.GOARCH, GOOS, BuildArch) + return + } + + // Check that we are using the new build system if we should + if os.Getenv("GOLANG_SYS_BUILD") != "docker" { + fmt.Println("In the new build system, mkall.go should not be called directly.") + fmt.Println("See README.md") + return + } + + // Parse the command line options + if len(os.Args) != 3 { + fmt.Println("USAGE: go run linux/mkall.go ") + return + } + LinuxDir = os.Args[1] + GlibcDir = os.Args[2] + + for _, t := range targets { + fmt.Printf("----- GENERATING: %s -----\n", t.GoArch) + if err := t.generateFiles(); err != nil { + fmt.Printf("%v\n***** FAILURE: %s *****\n\n", err, t.GoArch) + } else { + fmt.Printf("----- SUCCESS: %s -----\n\n", t.GoArch) + } + } +} + +// Makes an exec.Cmd with Stderr attached to os.Stderr +func makeCommand(name string, args ...string) *exec.Cmd { + cmd := exec.Command(name, args...) + cmd.Stderr = os.Stderr + return cmd +} + +// Runs the command, pipes output to a formatter, pipes that to an output file. +func (t *target) commandFormatOutput(formatter string, outputFile string, + name string, args ...string) (err error) { + mainCmd := makeCommand(name, args...) + + fmtCmd := makeCommand(formatter) + if formatter == "mkpost" { + fmtCmd = makeCommand("go", "run", "mkpost.go") + // Set GOARCH_TARGET so mkpost knows what GOARCH is.. + fmtCmd.Env = append(os.Environ(), "GOARCH_TARGET="+t.GoArch) + // Set GOARCH to host arch for mkpost, so it can run natively. + for i, s := range fmtCmd.Env { + if strings.HasPrefix(s, "GOARCH=") { + fmtCmd.Env[i] = "GOARCH=" + BuildArch + } + } + } + + // mainCmd | fmtCmd > outputFile + if fmtCmd.Stdin, err = mainCmd.StdoutPipe(); err != nil { + return + } + if fmtCmd.Stdout, err = os.Create(outputFile); err != nil { + return + } + + // Make sure the formatter eventually closes + if err = fmtCmd.Start(); err != nil { + return + } + defer func() { + fmtErr := fmtCmd.Wait() + if err == nil { + err = fmtErr + } + }() + + return mainCmd.Run() +} + +// Generates all the files for a Linux target +func (t *target) generateFiles() error { + // Setup environment variables + os.Setenv("GOOS", GOOS) + os.Setenv("GOARCH", t.GoArch) + + // Get appropriate compiler and emulator (unless on x86) + if t.LinuxArch != "x86" { + // Check/Setup cross compiler + compiler := t.GNUArch + "-gcc" + if _, err := exec.LookPath(compiler); err != nil { + return err + } + os.Setenv("CC", compiler) + + // Check/Setup emulator (usually first component of GNUArch) + qemuArchName := t.GNUArch[:strings.Index(t.GNUArch, "-")] + if t.LinuxArch == "powerpc" { + qemuArchName = t.GoArch + } + os.Setenv("GORUN", "qemu-"+qemuArchName) + } else { + os.Setenv("CC", "gcc") + } + + // Make the include directory and fill it with headers + if err := os.MkdirAll(IncludeDir, os.ModePerm); err != nil { + return err + } + defer os.RemoveAll(IncludeDir) + if err := t.makeHeaders(); err != nil { + return fmt.Errorf("could not make header files: %v", err) + } + fmt.Println("header files generated") + + // Make each of the four files + if err := t.makeZSysnumFile(); err != nil { + return fmt.Errorf("could not make zsysnum file: %v", err) + } + fmt.Println("zsysnum file generated") + + if err := t.makeZSyscallFile(); err != nil { + return fmt.Errorf("could not make zsyscall file: %v", err) + } + fmt.Println("zsyscall file generated") + + if err := t.makeZTypesFile(); err != nil { + return fmt.Errorf("could not make ztypes file: %v", err) + } + fmt.Println("ztypes file generated") + + if err := t.makeZErrorsFile(); err != nil { + return fmt.Errorf("could not make zerrors file: %v", err) + } + fmt.Println("zerrors file generated") + + return nil +} + +// Create the Linux and glibc headers in the include directory. +func (t *target) makeHeaders() error { + // Make the Linux headers we need for this architecture + linuxMake := makeCommand("make", "headers_install", "ARCH="+t.LinuxArch, "INSTALL_HDR_PATH="+TempDir) + linuxMake.Dir = LinuxDir + if err := linuxMake.Run(); err != nil { + return err + } + + // A Temporary build directory for glibc + if err := os.MkdirAll(BuildDir, os.ModePerm); err != nil { + return err + } + defer os.RemoveAll(BuildDir) + + // Make the glibc headers we need for this architecture + confScript := filepath.Join(GlibcDir, "configure") + glibcConf := makeCommand(confScript, "--prefix="+TempDir, "--host="+t.GNUArch, "--enable-kernel="+MinKernel) + glibcConf.Dir = BuildDir + if err := glibcConf.Run(); err != nil { + return err + } + glibcMake := makeCommand("make", "install-headers") + glibcMake.Dir = BuildDir + if err := glibcMake.Run(); err != nil { + return err + } + // We only need an empty stubs file + stubsFile := filepath.Join(IncludeDir, "gnu/stubs.h") + if file, err := os.Create(stubsFile); err != nil { + return err + } else { + file.Close() + } + + return nil +} + +// makes the zsysnum_linux_$GOARCH.go file +func (t *target) makeZSysnumFile() error { + zsysnumFile := fmt.Sprintf("zsysnum_linux_%s.go", t.GoArch) + unistdFile := filepath.Join(IncludeDir, "asm/unistd.h") + + args := append(t.cFlags(), unistdFile) + return t.commandFormatOutput("gofmt", zsysnumFile, "linux/mksysnum.pl", args...) +} + +// makes the zsyscall_linux_$GOARCH.go file +func (t *target) makeZSyscallFile() error { + zsyscallFile := fmt.Sprintf("zsyscall_linux_%s.go", t.GoArch) + // Find the correct architecture syscall file (might end with x.go) + archSyscallFile := fmt.Sprintf("syscall_linux_%s.go", t.GoArch) + if _, err := os.Stat(archSyscallFile); os.IsNotExist(err) { + shortArch := strings.TrimSuffix(t.GoArch, "le") + archSyscallFile = fmt.Sprintf("syscall_linux_%sx.go", shortArch) + } + + args := append(t.mksyscallFlags(), "-tags", "linux,"+t.GoArch, + "syscall_linux.go", archSyscallFile) + return t.commandFormatOutput("gofmt", zsyscallFile, "./mksyscall.pl", args...) +} + +// makes the zerrors_linux_$GOARCH.go file +func (t *target) makeZErrorsFile() error { + zerrorsFile := fmt.Sprintf("zerrors_linux_%s.go", t.GoArch) + + return t.commandFormatOutput("gofmt", zerrorsFile, "./mkerrors.sh", t.cFlags()...) +} + +// makes the ztypes_linux_$GOARCH.go file +func (t *target) makeZTypesFile() error { + ztypesFile := fmt.Sprintf("ztypes_linux_%s.go", t.GoArch) + + args := []string{"tool", "cgo", "-godefs", "--"} + args = append(args, t.cFlags()...) + args = append(args, "linux/types.go") + return t.commandFormatOutput("mkpost", ztypesFile, "go", args...) +} + +// Flags that should be given to gcc and cgo for this target +func (t *target) cFlags() []string { + // Compile statically to avoid cross-architecture dynamic linking. + flags := []string{"-Wall", "-Werror", "-static", "-I" + IncludeDir} + + // Architecture-specific flags + if t.SignedChar { + flags = append(flags, "-fsigned-char") + } + if t.LinuxArch == "x86" { + flags = append(flags, fmt.Sprintf("-m%d", t.Bits)) + } + + return flags +} + +// Flags that should be given to mksyscall for this target +func (t *target) mksyscallFlags() (flags []string) { + if t.Bits == 32 { + if t.BigEndian { + flags = append(flags, "-b32") + } else { + flags = append(flags, "-l32") + } + } + + // This flag menas a 64-bit value should use (even, odd)-pair. + if t.GoArch == "arm" || (t.LinuxArch == "mips" && t.Bits == 32) { + flags = append(flags, "-arm") + } + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/linux/mksysnum.pl b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/linux/mksysnum.pl new file mode 100755 index 0000000..63fd800 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/linux/mksysnum.pl @@ -0,0 +1,85 @@ +#!/usr/bin/env perl +# 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. + +use strict; + +if($ENV{'GOARCH'} eq "" || $ENV{'GOOS'} eq "") { + print STDERR "GOARCH or GOOS not defined in environment\n"; + exit 1; +} + +# Check that we are using the new build system if we should +if($ENV{'GOLANG_SYS_BUILD'} ne "docker") { + print STDERR "In the new build system, mksysnum should not be called directly.\n"; + print STDERR "See README.md\n"; + exit 1; +} + +my $command = "$0 ". join(' ', @ARGV); + +print < 999){ + # ignore deprecated syscalls that are no longer implemented + # https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/uapi/asm-generic/unistd.h?id=refs/heads/master#n716 + return; + } + $name =~ y/a-z/A-Z/; + $num = $num + $offset; + print " SYS_$name = $num;\n"; +} + +my $prev; +open(CC, "$ENV{'CC'} -E -dD @ARGV |") || die "can't run $ENV{'CC'}"; +while(){ + if(/^#define __NR_Linux\s+([0-9]+)/){ + # mips/mips64: extract offset + $offset = $1; + } + elsif(/^#define __NR(\w*)_SYSCALL_BASE\s+([0-9]+)/){ + # arm: extract offset + $offset = $1; + } + elsif(/^#define __NR_syscalls\s+/) { + # ignore redefinitions of __NR_syscalls + } + elsif(/^#define __NR_(\w*)Linux_syscalls\s+/) { + # mips/mips64: ignore definitions about the number of syscalls + } + elsif(/^#define __NR_(\w+)\s+([0-9]+)/){ + $prev = $2; + fmt($1, $2); + } + elsif(/^#define __NR3264_(\w+)\s+([0-9]+)/){ + $prev = $2; + fmt($1, $2); + } + elsif(/^#define __NR_(\w+)\s+\(\w+\+\s*([0-9]+)\)/){ + fmt($1, $prev+$2) + } + elsif(/^#define __NR_(\w+)\s+\(__NR_Linux \+ ([0-9]+)/){ + fmt($1, $2); + } + elsif(/^#define __NR_(\w+)\s+\(__NR_SYSCALL_BASE \+ ([0-9]+)/){ + fmt($1, $2); + } +} + +print < +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// On mips64, the glibc stat and kernel stat do not agree +#if (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI64) + +// Use the stat defined by the kernel with a few modifications. These are: +// * The time fields (like st_atime and st_atimensec) use the timespec +// struct (like st_atim) for consitancy with the glibc fields. +// * The padding fields get different names to not break compatibility. +// * st_blocks is signed, again for compatibility. +struct stat { + unsigned int st_dev; + unsigned int st_pad1[3]; // Reserved for st_dev expansion + + unsigned long st_ino; + + mode_t st_mode; + __u32 st_nlink; + + uid_t st_uid; + gid_t st_gid; + + unsigned int st_rdev; + unsigned int st_pad2[3]; // Reserved for st_rdev expansion + + off_t st_size; + + // These are declared as speperate fields in the kernel. Here we use + // the timespec struct for consistancy with the other stat structs. + struct timespec st_atim; + struct timespec st_mtim; + struct timespec st_ctim; + + unsigned int st_blksize; + unsigned int st_pad4; + + long st_blocks; +}; + +// These are needed because we do not include fcntl.h or sys/types.h +#include +#include + +#else + +// Use the stat defined by glibc +#include +#include + +#endif + +#ifdef TCSETS2 +// On systems that have "struct termios2" use this as type Termios. +typedef struct termios2 termios_t; +#else +typedef struct termios termios_t; +#endif + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_ll s5; + struct sockaddr_nl s6; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +// copied from /usr/include/bluetooth/hci.h +struct sockaddr_hci { + sa_family_t hci_family; + unsigned short hci_dev; + unsigned short hci_channel; +};; + +// copied from /usr/include/linux/un.h +struct my_sockaddr_un { + sa_family_t sun_family; +#if defined(__ARM_EABI__) || defined(__powerpc64__) + // on ARM char is by default unsigned + signed char sun_path[108]; +#else + char sun_path[108]; +#endif +}; + +#ifdef __ARM_EABI__ +typedef struct user_regs PtraceRegs; +#elif defined(__aarch64__) +typedef struct user_pt_regs PtraceRegs; +#elif defined(__mips__) || defined(__powerpc64__) +typedef struct pt_regs PtraceRegs; +#elif defined(__s390x__) +typedef struct _user_regs_struct PtraceRegs; +#elif defined(__sparc__) +#include +typedef struct pt_regs PtraceRegs; +#else +typedef struct user_regs_struct PtraceRegs; +#endif + +#if defined(__s390x__) +typedef struct _user_psw_struct ptracePsw; +typedef struct _user_fpregs_struct ptraceFpregs; +typedef struct _user_per_struct ptracePer; +#else +typedef struct {} ptracePsw; +typedef struct {} ptraceFpregs; +typedef struct {} ptracePer; +#endif + +// The real epoll_event is a union, and godefs doesn't handle it well. +struct my_epoll_event { + uint32_t events; +#if defined(__ARM_EABI__) || defined(__aarch64__) || (defined(__mips__) && _MIPS_SIM == _ABIO32) + // padding is not specified in linux/eventpoll.h but added to conform to the + // alignment requirements of EABI + int32_t padFd; +#elif defined(__powerpc64__) || defined(__s390x__) || defined(__sparc__) + int32_t _padFd; +#endif + int32_t fd; + int32_t pad; +}; + +*/ +import "C" + +// Machine characteristics; for internal use. + +const ( + sizeofPtr = C.sizeofPtr + sizeofShort = C.sizeof_short + sizeofInt = C.sizeof_int + sizeofLong = C.sizeof_long + sizeofLongLong = C.sizeof_longlong + PathMax = C.PATH_MAX +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +type Timex C.struct_timex + +type Time_t C.time_t + +type Tms C.struct_tms + +type Utimbuf C.struct_utimbuf + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +type Stat_t C.struct_stat + +type Statfs_t C.struct_statfs + +type Dirent C.struct_dirent + +type Fsid C.fsid_t + +type Flock_t C.struct_flock + +// Filesystem Encryption + +type FscryptPolicy C.struct_fscrypt_policy + +type FscryptKey C.struct_fscrypt_key + +// Structure for Keyctl + +type KeyctlDHParams C.struct_keyctl_dh_params + +// Advice to Fadvise + +const ( + FADV_NORMAL = C.POSIX_FADV_NORMAL + FADV_RANDOM = C.POSIX_FADV_RANDOM + FADV_SEQUENTIAL = C.POSIX_FADV_SEQUENTIAL + FADV_WILLNEED = C.POSIX_FADV_WILLNEED + FADV_DONTNEED = C.POSIX_FADV_DONTNEED + FADV_NOREUSE = C.POSIX_FADV_NOREUSE +) + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_my_sockaddr_un + +type RawSockaddrLinklayer C.struct_sockaddr_ll + +type RawSockaddrNetlink C.struct_sockaddr_nl + +type RawSockaddrHCI C.struct_sockaddr_hci + +type RawSockaddrCAN C.struct_sockaddr_can + +type RawSockaddrALG C.struct_sockaddr_alg + +type RawSockaddrVM C.struct_sockaddr_vm + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPMreqn C.struct_ip_mreqn + +type IPv6Mreq C.struct_ipv6_mreq + +type PacketMreq C.struct_packet_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet4Pktinfo C.struct_in_pktinfo + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +type Ucred C.struct_ucred + +type TCPInfo C.struct_tcp_info + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrLinklayer = C.sizeof_struct_sockaddr_ll + SizeofSockaddrNetlink = C.sizeof_struct_sockaddr_nl + SizeofSockaddrHCI = C.sizeof_struct_sockaddr_hci + SizeofSockaddrCAN = C.sizeof_struct_sockaddr_can + SizeofSockaddrALG = C.sizeof_struct_sockaddr_alg + SizeofSockaddrVM = C.sizeof_struct_sockaddr_vm + SizeofLinger = C.sizeof_struct_linger + SizeofIovec = C.sizeof_struct_iovec + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPMreqn = C.sizeof_struct_ip_mreqn + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofPacketMreq = C.sizeof_struct_packet_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet4Pktinfo = C.sizeof_struct_in_pktinfo + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter + SizeofUcred = C.sizeof_struct_ucred + SizeofTCPInfo = C.sizeof_struct_tcp_info +) + +// Netlink routing and interface messages + +const ( + IFA_UNSPEC = C.IFA_UNSPEC + IFA_ADDRESS = C.IFA_ADDRESS + IFA_LOCAL = C.IFA_LOCAL + IFA_LABEL = C.IFA_LABEL + IFA_BROADCAST = C.IFA_BROADCAST + IFA_ANYCAST = C.IFA_ANYCAST + IFA_CACHEINFO = C.IFA_CACHEINFO + IFA_MULTICAST = C.IFA_MULTICAST + IFLA_UNSPEC = C.IFLA_UNSPEC + IFLA_ADDRESS = C.IFLA_ADDRESS + IFLA_BROADCAST = C.IFLA_BROADCAST + IFLA_IFNAME = C.IFLA_IFNAME + IFLA_MTU = C.IFLA_MTU + IFLA_LINK = C.IFLA_LINK + IFLA_QDISC = C.IFLA_QDISC + IFLA_STATS = C.IFLA_STATS + IFLA_COST = C.IFLA_COST + IFLA_PRIORITY = C.IFLA_PRIORITY + IFLA_MASTER = C.IFLA_MASTER + IFLA_WIRELESS = C.IFLA_WIRELESS + IFLA_PROTINFO = C.IFLA_PROTINFO + IFLA_TXQLEN = C.IFLA_TXQLEN + IFLA_MAP = C.IFLA_MAP + IFLA_WEIGHT = C.IFLA_WEIGHT + IFLA_OPERSTATE = C.IFLA_OPERSTATE + IFLA_LINKMODE = C.IFLA_LINKMODE + IFLA_LINKINFO = C.IFLA_LINKINFO + IFLA_NET_NS_PID = C.IFLA_NET_NS_PID + IFLA_IFALIAS = C.IFLA_IFALIAS + IFLA_MAX = C.IFLA_MAX + RT_SCOPE_UNIVERSE = C.RT_SCOPE_UNIVERSE + RT_SCOPE_SITE = C.RT_SCOPE_SITE + RT_SCOPE_LINK = C.RT_SCOPE_LINK + RT_SCOPE_HOST = C.RT_SCOPE_HOST + RT_SCOPE_NOWHERE = C.RT_SCOPE_NOWHERE + RT_TABLE_UNSPEC = C.RT_TABLE_UNSPEC + RT_TABLE_COMPAT = C.RT_TABLE_COMPAT + RT_TABLE_DEFAULT = C.RT_TABLE_DEFAULT + RT_TABLE_MAIN = C.RT_TABLE_MAIN + RT_TABLE_LOCAL = C.RT_TABLE_LOCAL + RT_TABLE_MAX = C.RT_TABLE_MAX + RTA_UNSPEC = C.RTA_UNSPEC + RTA_DST = C.RTA_DST + RTA_SRC = C.RTA_SRC + RTA_IIF = C.RTA_IIF + RTA_OIF = C.RTA_OIF + RTA_GATEWAY = C.RTA_GATEWAY + RTA_PRIORITY = C.RTA_PRIORITY + RTA_PREFSRC = C.RTA_PREFSRC + RTA_METRICS = C.RTA_METRICS + RTA_MULTIPATH = C.RTA_MULTIPATH + RTA_FLOW = C.RTA_FLOW + RTA_CACHEINFO = C.RTA_CACHEINFO + RTA_TABLE = C.RTA_TABLE + RTN_UNSPEC = C.RTN_UNSPEC + RTN_UNICAST = C.RTN_UNICAST + RTN_LOCAL = C.RTN_LOCAL + RTN_BROADCAST = C.RTN_BROADCAST + RTN_ANYCAST = C.RTN_ANYCAST + RTN_MULTICAST = C.RTN_MULTICAST + RTN_BLACKHOLE = C.RTN_BLACKHOLE + RTN_UNREACHABLE = C.RTN_UNREACHABLE + RTN_PROHIBIT = C.RTN_PROHIBIT + RTN_THROW = C.RTN_THROW + RTN_NAT = C.RTN_NAT + RTN_XRESOLVE = C.RTN_XRESOLVE + RTNLGRP_NONE = C.RTNLGRP_NONE + RTNLGRP_LINK = C.RTNLGRP_LINK + RTNLGRP_NOTIFY = C.RTNLGRP_NOTIFY + RTNLGRP_NEIGH = C.RTNLGRP_NEIGH + RTNLGRP_TC = C.RTNLGRP_TC + RTNLGRP_IPV4_IFADDR = C.RTNLGRP_IPV4_IFADDR + RTNLGRP_IPV4_MROUTE = C.RTNLGRP_IPV4_MROUTE + RTNLGRP_IPV4_ROUTE = C.RTNLGRP_IPV4_ROUTE + RTNLGRP_IPV4_RULE = C.RTNLGRP_IPV4_RULE + RTNLGRP_IPV6_IFADDR = C.RTNLGRP_IPV6_IFADDR + RTNLGRP_IPV6_MROUTE = C.RTNLGRP_IPV6_MROUTE + RTNLGRP_IPV6_ROUTE = C.RTNLGRP_IPV6_ROUTE + RTNLGRP_IPV6_IFINFO = C.RTNLGRP_IPV6_IFINFO + RTNLGRP_IPV6_PREFIX = C.RTNLGRP_IPV6_PREFIX + RTNLGRP_IPV6_RULE = C.RTNLGRP_IPV6_RULE + RTNLGRP_ND_USEROPT = C.RTNLGRP_ND_USEROPT + SizeofNlMsghdr = C.sizeof_struct_nlmsghdr + SizeofNlMsgerr = C.sizeof_struct_nlmsgerr + SizeofRtGenmsg = C.sizeof_struct_rtgenmsg + SizeofNlAttr = C.sizeof_struct_nlattr + SizeofRtAttr = C.sizeof_struct_rtattr + SizeofIfInfomsg = C.sizeof_struct_ifinfomsg + SizeofIfAddrmsg = C.sizeof_struct_ifaddrmsg + SizeofRtMsg = C.sizeof_struct_rtmsg + SizeofRtNexthop = C.sizeof_struct_rtnexthop +) + +type NlMsghdr C.struct_nlmsghdr + +type NlMsgerr C.struct_nlmsgerr + +type RtGenmsg C.struct_rtgenmsg + +type NlAttr C.struct_nlattr + +type RtAttr C.struct_rtattr + +type IfInfomsg C.struct_ifinfomsg + +type IfAddrmsg C.struct_ifaddrmsg + +type RtMsg C.struct_rtmsg + +type RtNexthop C.struct_rtnexthop + +// Linux socket filter + +const ( + SizeofSockFilter = C.sizeof_struct_sock_filter + SizeofSockFprog = C.sizeof_struct_sock_fprog +) + +type SockFilter C.struct_sock_filter + +type SockFprog C.struct_sock_fprog + +// Inotify + +type InotifyEvent C.struct_inotify_event + +const SizeofInotifyEvent = C.sizeof_struct_inotify_event + +// Ptrace + +// Register structures +type PtraceRegs C.PtraceRegs + +// Structures contained in PtraceRegs on s390x (exported by mkpost.go) +type PtracePsw C.ptracePsw + +type PtraceFpregs C.ptraceFpregs + +type PtracePer C.ptracePer + +// Misc + +type FdSet C.fd_set + +type Sysinfo_t C.struct_sysinfo + +type Utsname C.struct_utsname + +type Ustat_t C.struct_ustat + +type EpollEvent C.struct_my_epoll_event + +const ( + AT_FDCWD = C.AT_FDCWD + AT_REMOVEDIR = C.AT_REMOVEDIR + AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW +) + +type PollFd C.struct_pollfd + +const ( + POLLIN = C.POLLIN + POLLPRI = C.POLLPRI + POLLOUT = C.POLLOUT + POLLRDHUP = C.POLLRDHUP + POLLERR = C.POLLERR + POLLHUP = C.POLLHUP + POLLNVAL = C.POLLNVAL +) + +type Sigset_t C.sigset_t + +const RNDGETENTCNT = C.RNDGETENTCNT + +const PERF_IOC_FLAG_GROUP = C.PERF_IOC_FLAG_GROUP + +// Terminal handling + +type Termios C.termios_t + +type Winsize C.struct_winsize + +// Taskstats + +type Taskstats C.struct_taskstats + +const ( + TASKSTATS_CMD_UNSPEC = C.TASKSTATS_CMD_UNSPEC + TASKSTATS_CMD_GET = C.TASKSTATS_CMD_GET + TASKSTATS_CMD_NEW = C.TASKSTATS_CMD_NEW + TASKSTATS_TYPE_UNSPEC = C.TASKSTATS_TYPE_UNSPEC + TASKSTATS_TYPE_PID = C.TASKSTATS_TYPE_PID + TASKSTATS_TYPE_TGID = C.TASKSTATS_TYPE_TGID + TASKSTATS_TYPE_STATS = C.TASKSTATS_TYPE_STATS + TASKSTATS_TYPE_AGGR_PID = C.TASKSTATS_TYPE_AGGR_PID + TASKSTATS_TYPE_AGGR_TGID = C.TASKSTATS_TYPE_AGGR_TGID + TASKSTATS_TYPE_NULL = C.TASKSTATS_TYPE_NULL + TASKSTATS_CMD_ATTR_UNSPEC = C.TASKSTATS_CMD_ATTR_UNSPEC + TASKSTATS_CMD_ATTR_PID = C.TASKSTATS_CMD_ATTR_PID + TASKSTATS_CMD_ATTR_TGID = C.TASKSTATS_CMD_ATTR_TGID + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = C.TASKSTATS_CMD_ATTR_REGISTER_CPUMASK + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = C.TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK +) + +// Generic netlink + +type Genlmsghdr C.struct_genlmsghdr + +const ( + CTRL_CMD_UNSPEC = C.CTRL_CMD_UNSPEC + CTRL_CMD_NEWFAMILY = C.CTRL_CMD_NEWFAMILY + CTRL_CMD_DELFAMILY = C.CTRL_CMD_DELFAMILY + CTRL_CMD_GETFAMILY = C.CTRL_CMD_GETFAMILY + CTRL_CMD_NEWOPS = C.CTRL_CMD_NEWOPS + CTRL_CMD_DELOPS = C.CTRL_CMD_DELOPS + CTRL_CMD_GETOPS = C.CTRL_CMD_GETOPS + CTRL_CMD_NEWMCAST_GRP = C.CTRL_CMD_NEWMCAST_GRP + CTRL_CMD_DELMCAST_GRP = C.CTRL_CMD_DELMCAST_GRP + CTRL_CMD_GETMCAST_GRP = C.CTRL_CMD_GETMCAST_GRP + CTRL_ATTR_UNSPEC = C.CTRL_ATTR_UNSPEC + CTRL_ATTR_FAMILY_ID = C.CTRL_ATTR_FAMILY_ID + CTRL_ATTR_FAMILY_NAME = C.CTRL_ATTR_FAMILY_NAME + CTRL_ATTR_VERSION = C.CTRL_ATTR_VERSION + CTRL_ATTR_HDRSIZE = C.CTRL_ATTR_HDRSIZE + CTRL_ATTR_MAXATTR = C.CTRL_ATTR_MAXATTR + CTRL_ATTR_OPS = C.CTRL_ATTR_OPS + CTRL_ATTR_MCAST_GROUPS = C.CTRL_ATTR_MCAST_GROUPS + CTRL_ATTR_OP_UNSPEC = C.CTRL_ATTR_OP_UNSPEC + CTRL_ATTR_OP_ID = C.CTRL_ATTR_OP_ID + CTRL_ATTR_OP_FLAGS = C.CTRL_ATTR_OP_FLAGS + CTRL_ATTR_MCAST_GRP_UNSPEC = C.CTRL_ATTR_MCAST_GRP_UNSPEC + CTRL_ATTR_MCAST_GRP_NAME = C.CTRL_ATTR_MCAST_GRP_NAME + CTRL_ATTR_MCAST_GRP_ID = C.CTRL_ATTR_MCAST_GRP_ID +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/mkall.sh b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/mkall.sh new file mode 100755 index 0000000..00b7ce7 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/mkall.sh @@ -0,0 +1,194 @@ +#!/usr/bin/env bash +# 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. + +# This script runs or (given -n) prints suggested commands to generate files for +# the Architecture/OS specified by the GOARCH and GOOS environment variables. +# See README.md for more information about how the build system works. + +GOOSARCH="${GOOS}_${GOARCH}" + +# defaults +mksyscall="./mksyscall.pl" +mkerrors="./mkerrors.sh" +zerrors="zerrors_$GOOSARCH.go" +mksysctl="" +zsysctl="zsysctl_$GOOSARCH.go" +mksysnum= +mktypes= +run="sh" +cmd="" + +case "$1" in +-syscalls) + for i in zsyscall*go + do + # Run the command line that appears in the first line + # of the generated file to regenerate it. + sed 1q $i | sed 's;^// ;;' | sh > _$i && gofmt < _$i > $i + rm _$i + done + exit 0 + ;; +-n) + run="cat" + cmd="echo" + shift +esac + +case "$#" in +0) + ;; +*) + echo 'usage: mkall.sh [-n]' 1>&2 + exit 2 +esac + +if [[ "$GOOS" = "linux" ]] && [[ "$GOARCH" != "sparc64" ]]; then + # Use then new build system + # Files generated through docker (use $cmd so you can Ctl-C the build or run) + $cmd docker build --tag generate:$GOOS $GOOS + $cmd docker run --interactive --tty --volume $(dirname "$(readlink -f "$0")"):/build generate:$GOOS + exit +fi + +GOOSARCH_in=syscall_$GOOSARCH.go +case "$GOOSARCH" in +_* | *_ | _) + echo 'undefined $GOOS_$GOARCH:' "$GOOSARCH" 1>&2 + exit 1 + ;; +darwin_386) + mkerrors="$mkerrors -m32" + mksyscall="./mksyscall.pl -l32" + mksysnum="./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk macosx)/usr/include/sys/syscall.h" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +darwin_amd64) + mkerrors="$mkerrors -m64" + mksysnum="./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk macosx)/usr/include/sys/syscall.h" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +darwin_arm) + mkerrors="$mkerrors" + mksysnum="./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk iphoneos)/usr/include/sys/syscall.h" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +darwin_arm64) + mkerrors="$mkerrors -m64" + mksysnum="./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk iphoneos)/usr/include/sys/syscall.h" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +dragonfly_386) + mkerrors="$mkerrors -m32" + mksyscall="./mksyscall.pl -l32 -dragonfly" + mksysnum="curl -s 'http://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/sys/kern/syscalls.master' | ./mksysnum_dragonfly.pl" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +dragonfly_amd64) + mkerrors="$mkerrors -m64" + mksyscall="./mksyscall.pl -dragonfly" + mksysnum="curl -s 'http://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/sys/kern/syscalls.master' | ./mksysnum_dragonfly.pl" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +freebsd_386) + mkerrors="$mkerrors -m32" + mksyscall="./mksyscall.pl -l32" + mksysnum="curl -s 'http://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master' | ./mksysnum_freebsd.pl" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +freebsd_amd64) + mkerrors="$mkerrors -m64" + mksysnum="curl -s 'http://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master' | ./mksysnum_freebsd.pl" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +freebsd_arm) + mkerrors="$mkerrors" + mksyscall="./mksyscall.pl -l32 -arm" + mksysnum="curl -s 'http://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master' | ./mksysnum_freebsd.pl" + # Let the type of C char be signed for making the bare syscall + # API consistent across platforms. + mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" + ;; +linux_sparc64) + GOOSARCH_in=syscall_linux_sparc64.go + unistd_h=/usr/include/sparc64-linux-gnu/asm/unistd.h + mkerrors="$mkerrors -m64" + mksysnum="./mksysnum_linux.pl $unistd_h" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +netbsd_386) + mkerrors="$mkerrors -m32" + mksyscall="./mksyscall.pl -l32 -netbsd" + mksysnum="curl -s 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_netbsd.pl" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +netbsd_amd64) + mkerrors="$mkerrors -m64" + mksyscall="./mksyscall.pl -netbsd" + mksysnum="curl -s 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_netbsd.pl" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +netbsd_arm) + mkerrors="$mkerrors" + mksyscall="./mksyscall.pl -l32 -netbsd -arm" + mksysnum="curl -s 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_netbsd.pl" + # Let the type of C char be signed for making the bare syscall + # API consistent across platforms. + mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" + ;; +openbsd_386) + mkerrors="$mkerrors -m32" + mksyscall="./mksyscall.pl -l32 -openbsd" + mksysctl="./mksysctl_openbsd.pl" + mksysnum="curl -s 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_openbsd.pl" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +openbsd_amd64) + mkerrors="$mkerrors -m64" + mksyscall="./mksyscall.pl -openbsd" + mksysctl="./mksysctl_openbsd.pl" + mksysnum="curl -s 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_openbsd.pl" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +openbsd_arm) + mkerrors="$mkerrors" + mksyscall="./mksyscall.pl -l32 -openbsd -arm" + mksysctl="./mksysctl_openbsd.pl" + mksysnum="curl -s 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_openbsd.pl" + # Let the type of C char be signed for making the bare syscall + # API consistent across platforms. + mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" + ;; +solaris_amd64) + mksyscall="./mksyscall_solaris.pl" + mkerrors="$mkerrors -m64" + mksysnum= + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +*) + echo 'unrecognized $GOOS_$GOARCH: ' "$GOOSARCH" 1>&2 + exit 1 + ;; +esac + +( + if [ -n "$mkerrors" ]; then echo "$mkerrors |gofmt >$zerrors"; fi + case "$GOOS" in + *) + syscall_goos="syscall_$GOOS.go" + case "$GOOS" in + darwin | dragonfly | freebsd | netbsd | openbsd) + syscall_goos="syscall_bsd.go $syscall_goos" + ;; + esac + if [ -n "$mksyscall" ]; then echo "$mksyscall -tags $GOOS,$GOARCH $syscall_goos $GOOSARCH_in |gofmt >zsyscall_$GOOSARCH.go"; fi + ;; + esac + if [ -n "$mksysctl" ]; then echo "$mksysctl |gofmt >$zsysctl"; fi + if [ -n "$mksysnum" ]; then echo "$mksysnum |gofmt >zsysnum_$GOOSARCH.go"; fi + if [ -n "$mktypes" ]; then + echo "$mktypes types_$GOOS.go | go run mkpost.go > ztypes_$GOOSARCH.go"; + fi +) | $run diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/mkerrors.sh b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/mkerrors.sh new file mode 100755 index 0000000..e16c4fa --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/mkerrors.sh @@ -0,0 +1,566 @@ +#!/usr/bin/env bash +# 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. + +# Generate Go code listing errors and other #defined constant +# values (ENAMETOOLONG etc.), by asking the preprocessor +# about the definitions. + +unset LANG +export LC_ALL=C +export LC_CTYPE=C + +if test -z "$GOARCH" -o -z "$GOOS"; then + echo 1>&2 "GOARCH or GOOS not defined in environment" + exit 1 +fi + +# Check that we are using the new build system if we should +if [[ "$GOOS" = "linux" ]] && [[ "$GOARCH" != "sparc64" ]]; then + if [[ "$GOLANG_SYS_BUILD" != "docker" ]]; then + echo 1>&2 "In the new build system, mkerrors should not be called directly." + echo 1>&2 "See README.md" + exit 1 + fi +fi + +CC=${CC:-cc} + +if [[ "$GOOS" = "solaris" ]]; then + # Assumes GNU versions of utilities in PATH. + export PATH=/usr/gnu/bin:$PATH +fi + +uname=$(uname) + +includes_Darwin=' +#define _DARWIN_C_SOURCE +#define KERNEL +#define _DARWIN_USE_64_BIT_INODE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +' + +includes_DragonFly=' +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +' + +includes_FreeBSD=' +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if __FreeBSD__ >= 10 +#define IFT_CARP 0xf8 // IFT_CARP is deprecated in FreeBSD 10 +#undef SIOCAIFADDR +#define SIOCAIFADDR _IOW(105, 26, struct oifaliasreq) // ifaliasreq contains if_data +#undef SIOCSIFPHYADDR +#define SIOCSIFPHYADDR _IOW(105, 70, struct oifaliasreq) // ifaliasreq contains if_data +#endif +' + +includes_Linux=' +#define _LARGEFILE_SOURCE +#define _LARGEFILE64_SOURCE +#ifndef __LP64__ +#define _FILE_OFFSET_BITS 64 +#endif +#define _GNU_SOURCE + +// is broken on powerpc64, as it fails to include definitions of +// these structures. We just include them copied from . +#if defined(__powerpc__) +struct sgttyb { + char sg_ispeed; + char sg_ospeed; + char sg_erase; + char sg_kill; + short sg_flags; +}; + +struct tchars { + char t_intrc; + char t_quitc; + char t_startc; + char t_stopc; + char t_eofc; + char t_brkc; +}; + +struct ltchars { + char t_suspc; + char t_dsuspc; + char t_rprntc; + char t_flushc; + char t_werasc; + char t_lnextc; +}; +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef MSG_FASTOPEN +#define MSG_FASTOPEN 0x20000000 +#endif + +#ifndef PTRACE_GETREGS +#define PTRACE_GETREGS 0xc +#endif + +#ifndef PTRACE_SETREGS +#define PTRACE_SETREGS 0xd +#endif + +#ifndef SOL_NETLINK +#define SOL_NETLINK 270 +#endif + +#ifdef SOL_BLUETOOTH +// SPARC includes this in /usr/include/sparc64-linux-gnu/bits/socket.h +// but it is already in bluetooth_linux.go +#undef SOL_BLUETOOTH +#endif + +// Certain constants are missing from the fs/crypto UAPI +#define FS_KEY_DESC_PREFIX "fscrypt:" +#define FS_KEY_DESC_PREFIX_SIZE 8 +#define FS_MAX_KEY_SIZE 64 +' + +includes_NetBSD=' +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Needed since refers to it... +#define schedppq 1 +' + +includes_OpenBSD=' +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// We keep some constants not supported in OpenBSD 5.5 and beyond for +// the promise of compatibility. +#define EMUL_ENABLED 0x1 +#define EMUL_NATIVE 0x2 +#define IPV6_FAITH 0x1d +#define IPV6_OPTIONS 0x1 +#define IPV6_RTHDR_STRICT 0x1 +#define IPV6_SOCKOPT_RESERVED1 0x3 +#define SIOCGIFGENERIC 0xc020693a +#define SIOCSIFGENERIC 0x80206939 +#define WALTSIG 0x4 +' + +includes_SunOS=' +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +' + + +includes=' +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +' +ccflags="$@" + +# Write go tool cgo -godefs input. +( + echo package unix + echo + echo '/*' + indirect="includes_$(uname)" + echo "${!indirect} $includes" + echo '*/' + echo 'import "C"' + echo 'import "syscall"' + echo + echo 'const (' + + # The gcc command line prints all the #defines + # it encounters while processing the input + echo "${!indirect} $includes" | $CC -x c - -E -dM $ccflags | + awk ' + $1 != "#define" || $2 ~ /\(/ || $3 == "" {next} + + $2 ~ /^E([ABCD]X|[BIS]P|[SD]I|S|FL)$/ {next} # 386 registers + $2 ~ /^(SIGEV_|SIGSTKSZ|SIGRT(MIN|MAX))/ {next} + $2 ~ /^(SCM_SRCRT)$/ {next} + $2 ~ /^(MAP_FAILED)$/ {next} + $2 ~ /^ELF_.*$/ {next}# contains ELF_ARCH, etc. + + $2 ~ /^EXTATTR_NAMESPACE_NAMES/ || + $2 ~ /^EXTATTR_NAMESPACE_[A-Z]+_STRING/ {next} + + $2 !~ /^ETH_/ && + $2 !~ /^EPROC_/ && + $2 !~ /^EQUIV_/ && + $2 !~ /^EXPR_/ && + $2 ~ /^E[A-Z0-9_]+$/ || + $2 ~ /^B[0-9_]+$/ || + $2 ~ /^(OLD|NEW)DEV$/ || + $2 == "BOTHER" || + $2 ~ /^CI?BAUD(EX)?$/ || + $2 == "IBSHIFT" || + $2 ~ /^V[A-Z0-9]+$/ || + $2 ~ /^CS[A-Z0-9]/ || + $2 ~ /^I(SIG|CANON|CRNL|UCLC|EXTEN|MAXBEL|STRIP|UTF8)$/ || + $2 ~ /^IGN/ || + $2 ~ /^IX(ON|ANY|OFF)$/ || + $2 ~ /^IN(LCR|PCK)$/ || + $2 ~ /(^FLU?SH)|(FLU?SH$)/ || + $2 ~ /^C(LOCAL|READ|MSPAR|RTSCTS)$/ || + $2 == "BRKINT" || + $2 == "HUPCL" || + $2 == "PENDIN" || + $2 == "TOSTOP" || + $2 == "XCASE" || + $2 == "ALTWERASE" || + $2 == "NOKERNINFO" || + $2 ~ /^PAR/ || + $2 ~ /^SIG[^_]/ || + $2 ~ /^O[CNPFPL][A-Z]+[^_][A-Z]+$/ || + $2 ~ /^(NL|CR|TAB|BS|VT|FF)DLY$/ || + $2 ~ /^(NL|CR|TAB|BS|VT|FF)[0-9]$/ || + $2 ~ /^O?XTABS$/ || + $2 ~ /^TC[IO](ON|OFF)$/ || + $2 ~ /^IN_/ || + $2 ~ /^LOCK_(SH|EX|NB|UN)$/ || + $2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|ICMP6|TCP|EVFILT|NOTE|EV|SHUT|PROT|MAP|PACKET|MSG|SCM|MCL|DT|MADV|PR)_/ || + $2 ~ /^FALLOC_/ || + $2 == "ICMPV6_FILTER" || + $2 == "SOMAXCONN" || + $2 == "NAME_MAX" || + $2 == "IFNAMSIZ" || + $2 ~ /^CTL_(MAXNAME|NET|QUERY)$/ || + $2 ~ /^SYSCTL_VERS/ || + $2 ~ /^(MS|MNT|UMOUNT)_/ || + $2 ~ /^TUN(SET|GET|ATTACH|DETACH)/ || + $2 ~ /^(O|F|E?FD|NAME|S|PTRACE|PT)_/ || + $2 ~ /^LINUX_REBOOT_CMD_/ || + $2 ~ /^LINUX_REBOOT_MAGIC[12]$/ || + $2 !~ "NLA_TYPE_MASK" && + $2 ~ /^(NETLINK|NLM|NLMSG|NLA|IFA|IFAN|RT|RTCF|RTN|RTPROT|RTNH|ARPHRD|ETH_P)_/ || + $2 ~ /^SIOC/ || + $2 ~ /^TIOC/ || + $2 ~ /^TCGET/ || + $2 ~ /^TCSET/ || + $2 ~ /^TC(FLSH|SBRKP?|XONC)$/ || + $2 !~ "RTF_BITS" && + $2 ~ /^(IFF|IFT|NET_RT|RTM|RTF|RTV|RTA|RTAX)_/ || + $2 ~ /^BIOC/ || + $2 ~ /^RUSAGE_(SELF|CHILDREN|THREAD)/ || + $2 ~ /^RLIMIT_(AS|CORE|CPU|DATA|FSIZE|LOCKS|MEMLOCK|MSGQUEUE|NICE|NOFILE|NPROC|RSS|RTPRIO|RTTIME|SIGPENDING|STACK)|RLIM_INFINITY/ || + $2 ~ /^PRIO_(PROCESS|PGRP|USER)/ || + $2 ~ /^CLONE_[A-Z_]+/ || + $2 !~ /^(BPF_TIMEVAL)$/ && + $2 ~ /^(BPF|DLT)_/ || + $2 ~ /^CLOCK_/ || + $2 ~ /^CAN_/ || + $2 ~ /^CAP_/ || + $2 ~ /^ALG_/ || + $2 ~ /^FS_(POLICY_FLAGS|KEY_DESC|ENCRYPTION_MODE|[A-Z0-9_]+_KEY_SIZE|IOC_(GET|SET)_ENCRYPTION)/ || + $2 ~ /^GRND_/ || + $2 ~ /^KEY_(SPEC|REQKEY_DEFL)_/ || + $2 ~ /^KEYCTL_/ || + $2 ~ /^PERF_EVENT_IOC_/ || + $2 ~ /^SECCOMP_MODE_/ || + $2 ~ /^SPLICE_/ || + $2 ~ /^(VM|VMADDR)_/ || + $2 ~ /^(TASKSTATS|TS)_/ || + $2 ~ /^GENL_/ || + $2 ~ /^XATTR_(CREATE|REPLACE)/ || + $2 !~ "WMESGLEN" && + $2 ~ /^W[A-Z0-9]+$/ || + $2 ~ /^BLK[A-Z]*(GET$|SET$|BUF$|PART$|SIZE)/ {printf("\t%s = C.%s\n", $2, $2)} + $2 ~ /^__WCOREFLAG$/ {next} + $2 ~ /^__W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", substr($2,3), $2)} + + {next} + ' | sort + + echo ')' +) >_const.go + +# Pull out the error names for later. +errors=$( + echo '#include ' | $CC -x c - -E -dM $ccflags | + awk '$1=="#define" && $2 ~ /^E[A-Z0-9_]+$/ { print $2 }' | + sort +) + +# Pull out the signal names for later. +signals=$( + echo '#include ' | $CC -x c - -E -dM $ccflags | + awk '$1=="#define" && $2 ~ /^SIG[A-Z0-9]+$/ { print $2 }' | + egrep -v '(SIGSTKSIZE|SIGSTKSZ|SIGRT)' | + sort +) + +# Again, writing regexps to a file. +echo '#include ' | $CC -x c - -E -dM $ccflags | + awk '$1=="#define" && $2 ~ /^E[A-Z0-9_]+$/ { print "^\t" $2 "[ \t]*=" }' | + sort >_error.grep +echo '#include ' | $CC -x c - -E -dM $ccflags | + awk '$1=="#define" && $2 ~ /^SIG[A-Z0-9]+$/ { print "^\t" $2 "[ \t]*=" }' | + egrep -v '(SIGSTKSIZE|SIGSTKSZ|SIGRT)' | + sort >_signal.grep + +echo '// mkerrors.sh' "$@" +echo '// Code generated by the command above; see README.md. DO NOT EDIT.' +echo +echo "// +build ${GOARCH},${GOOS}" +echo +go tool cgo -godefs -- "$@" _const.go >_error.out +cat _error.out | grep -vf _error.grep | grep -vf _signal.grep +echo +echo '// Errors' +echo 'const (' +cat _error.out | grep -f _error.grep | sed 's/=\(.*\)/= syscall.Errno(\1)/' +echo ')' + +echo +echo '// Signals' +echo 'const (' +cat _error.out | grep -f _signal.grep | sed 's/=\(.*\)/= syscall.Signal(\1)/' +echo ')' + +# Run C program to print error and syscall strings. +( + echo -E " +#include +#include +#include +#include +#include +#include + +#define nelem(x) (sizeof(x)/sizeof((x)[0])) + +enum { A = 'A', Z = 'Z', a = 'a', z = 'z' }; // avoid need for single quotes below + +int errors[] = { +" + for i in $errors + do + echo -E ' '$i, + done + + echo -E " +}; + +int signals[] = { +" + for i in $signals + do + echo -E ' '$i, + done + + # Use -E because on some systems bash builtin interprets \n itself. + echo -E ' +}; + +static int +intcmp(const void *a, const void *b) +{ + return *(int*)a - *(int*)b; +} + +int +main(void) +{ + int i, e; + char buf[1024], *p; + + printf("\n\n// Error table\n"); + printf("var errors = [...]string {\n"); + qsort(errors, nelem(errors), sizeof errors[0], intcmp); + for(i=0; i 0 && errors[i-1] == e) + continue; + strcpy(buf, strerror(e)); + // lowercase first letter: Bad -> bad, but STREAM -> STREAM. + if(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z) + buf[0] += a - A; + printf("\t%d: \"%s\",\n", e, buf); + } + printf("}\n\n"); + + printf("\n\n// Signal table\n"); + printf("var signals = [...]string {\n"); + qsort(signals, nelem(signals), sizeof signals[0], intcmp); + for(i=0; i 0 && signals[i-1] == e) + continue; + strcpy(buf, strsignal(e)); + // lowercase first letter: Bad -> bad, but STREAM -> STREAM. + if(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z) + buf[0] += a - A; + // cut trailing : number. + p = strrchr(buf, ":"[0]); + if(p) + *p = '\0'; + printf("\t%d: \"%s\",\n", e, buf); + } + printf("}\n\n"); + + return 0; +} + +' +) >_errors.c + +$CC $ccflags -o _errors _errors.c && $GORUN ./_errors && rm -f _errors.c _errors _const.go _error.grep _signal.grep _error.out diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/mkpost.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/mkpost.go new file mode 100644 index 0000000..d3ff659 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/mkpost.go @@ -0,0 +1,88 @@ +// 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. + +// +build ignore + +// mkpost processes the output of cgo -godefs to +// modify the generated types. It is used to clean up +// the sys API in an architecture specific manner. +// +// mkpost is run after cgo -godefs; see README.md. +package main + +import ( + "bytes" + "fmt" + "go/format" + "io/ioutil" + "log" + "os" + "regexp" +) + +func main() { + // Get the OS and architecture (using GOARCH_TARGET if it exists) + goos := os.Getenv("GOOS") + goarch := os.Getenv("GOARCH_TARGET") + if goarch == "" { + goarch = os.Getenv("GOARCH") + } + // Check that we are using the new build system if we should be. + if goos == "linux" && goarch != "sparc64" { + if os.Getenv("GOLANG_SYS_BUILD") != "docker" { + os.Stderr.WriteString("In the new build system, mkpost should not be called directly.\n") + os.Stderr.WriteString("See README.md\n") + os.Exit(1) + } + } + + b, err := ioutil.ReadAll(os.Stdin) + if err != nil { + log.Fatal(err) + } + + // If we have empty Ptrace structs, we should delete them. Only s390x emits + // nonempty Ptrace structs. + ptraceRexexp := regexp.MustCompile(`type Ptrace((Psw|Fpregs|Per) struct {\s*})`) + b = ptraceRexexp.ReplaceAll(b, nil) + + // Replace the control_regs union with a blank identifier for now. + controlRegsRegex := regexp.MustCompile(`(Control_regs)\s+\[0\]uint64`) + b = controlRegsRegex.ReplaceAll(b, []byte("_ [0]uint64")) + + // Remove fields that are added by glibc + // Note that this is unstable as the identifers are private. + removeFieldsRegex := regexp.MustCompile(`X__glibc\S*`) + b = removeFieldsRegex.ReplaceAll(b, []byte("_")) + + // We refuse to export private fields on s390x + if goarch == "s390x" && goos == "linux" { + // Remove cgo padding fields + removeFieldsRegex := regexp.MustCompile(`Pad_cgo_\d+`) + b = removeFieldsRegex.ReplaceAll(b, []byte("_")) + + // Remove padding, hidden, or unused fields + removeFieldsRegex = regexp.MustCompile(`X_\S+`) + b = removeFieldsRegex.ReplaceAll(b, []byte("_")) + } + + // Remove the first line of warning from cgo + b = b[bytes.IndexByte(b, '\n')+1:] + // Modify the command in the header to include: + // mkpost, our own warning, and a build tag. + replacement := fmt.Sprintf(`$1 | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build %s,%s`, goarch, goos) + cgoCommandRegex := regexp.MustCompile(`(cgo -godefs .*)`) + b = cgoCommandRegex.ReplaceAll(b, []byte(replacement)) + + // gofmt + b, err = format.Source(b) + if err != nil { + log.Fatal(err) + } + + os.Stdout.Write(b) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/mksyscall.pl b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/mksyscall.pl new file mode 100755 index 0000000..fb929b4 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/mksyscall.pl @@ -0,0 +1,328 @@ +#!/usr/bin/env perl +# 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. + +# This program reads a file containing function prototypes +# (like syscall_darwin.go) and generates system call bodies. +# The prototypes are marked by lines beginning with "//sys" +# and read like func declarations if //sys is replaced by func, but: +# * The parameter lists must give a name for each argument. +# This includes return parameters. +# * The parameter lists must give a type for each argument: +# the (x, y, z int) shorthand is not allowed. +# * If the return parameter is an error number, it must be named errno. + +# A line beginning with //sysnb is like //sys, except that the +# goroutine will not be suspended during the execution of the system +# call. This must only be used for system calls which can never +# block, as otherwise the system call could cause all goroutines to +# hang. + +use strict; + +my $cmdline = "mksyscall.pl " . join(' ', @ARGV); +my $errors = 0; +my $_32bit = ""; +my $plan9 = 0; +my $openbsd = 0; +my $netbsd = 0; +my $dragonfly = 0; +my $arm = 0; # 64-bit value should use (even, odd)-pair +my $tags = ""; # build tags + +if($ARGV[0] eq "-b32") { + $_32bit = "big-endian"; + shift; +} elsif($ARGV[0] eq "-l32") { + $_32bit = "little-endian"; + shift; +} +if($ARGV[0] eq "-plan9") { + $plan9 = 1; + shift; +} +if($ARGV[0] eq "-openbsd") { + $openbsd = 1; + shift; +} +if($ARGV[0] eq "-netbsd") { + $netbsd = 1; + shift; +} +if($ARGV[0] eq "-dragonfly") { + $dragonfly = 1; + shift; +} +if($ARGV[0] eq "-arm") { + $arm = 1; + shift; +} +if($ARGV[0] eq "-tags") { + shift; + $tags = $ARGV[0]; + shift; +} + +if($ARGV[0] =~ /^-/) { + print STDERR "usage: mksyscall.pl [-b32 | -l32] [-tags x,y] [file ...]\n"; + exit 1; +} + +# Check that we are using the new build system if we should +if($ENV{'GOOS'} eq "linux" && $ENV{'GOARCH'} ne "sparc64") { + if($ENV{'GOLANG_SYS_BUILD'} ne "docker") { + print STDERR "In the new build system, mksyscall should not be called directly.\n"; + print STDERR "See README.md\n"; + exit 1; + } +} + + +sub parseparamlist($) { + my ($list) = @_; + $list =~ s/^\s*//; + $list =~ s/\s*$//; + if($list eq "") { + return (); + } + return split(/\s*,\s*/, $list); +} + +sub parseparam($) { + my ($p) = @_; + if($p !~ /^(\S*) (\S*)$/) { + print STDERR "$ARGV:$.: malformed parameter: $p\n"; + $errors = 1; + return ("xx", "int"); + } + return ($1, $2); +} + +my $text = ""; +while(<>) { + chomp; + s/\s+/ /g; + s/^\s+//; + s/\s+$//; + my $nonblock = /^\/\/sysnb /; + next if !/^\/\/sys / && !$nonblock; + + # Line must be of the form + # func Open(path string, mode int, perm int) (fd int, errno error) + # Split into name, in params, out params. + if(!/^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*((?i)SYS_[A-Z0-9_]+))?$/) { + print STDERR "$ARGV:$.: malformed //sys declaration\n"; + $errors = 1; + next; + } + my ($func, $in, $out, $sysname) = ($2, $3, $4, $5); + + # Split argument lists on comma. + my @in = parseparamlist($in); + my @out = parseparamlist($out); + + # Try in vain to keep people from editing this file. + # The theory is that they jump into the middle of the file + # without reading the header. + $text .= "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n"; + + # Go function header. + my $out_decl = @out ? sprintf(" (%s)", join(', ', @out)) : ""; + $text .= sprintf "func %s(%s)%s {\n", $func, join(', ', @in), $out_decl; + + # Check if err return available + my $errvar = ""; + foreach my $p (@out) { + my ($name, $type) = parseparam($p); + if($type eq "error") { + $errvar = $name; + last; + } + } + + # Prepare arguments to Syscall. + my @args = (); + my $n = 0; + foreach my $p (@in) { + my ($name, $type) = parseparam($p); + if($type =~ /^\*/) { + push @args, "uintptr(unsafe.Pointer($name))"; + } elsif($type eq "string" && $errvar ne "") { + $text .= "\tvar _p$n *byte\n"; + $text .= "\t_p$n, $errvar = BytePtrFromString($name)\n"; + $text .= "\tif $errvar != nil {\n\t\treturn\n\t}\n"; + push @args, "uintptr(unsafe.Pointer(_p$n))"; + $n++; + } elsif($type eq "string") { + print STDERR "$ARGV:$.: $func uses string arguments, but has no error return\n"; + $text .= "\tvar _p$n *byte\n"; + $text .= "\t_p$n, _ = BytePtrFromString($name)\n"; + push @args, "uintptr(unsafe.Pointer(_p$n))"; + $n++; + } elsif($type =~ /^\[\](.*)/) { + # Convert slice into pointer, length. + # Have to be careful not to take address of &a[0] if len == 0: + # pass dummy pointer in that case. + # Used to pass nil, but some OSes or simulators reject write(fd, nil, 0). + $text .= "\tvar _p$n unsafe.Pointer\n"; + $text .= "\tif len($name) > 0 {\n\t\t_p$n = unsafe.Pointer(\&${name}[0])\n\t}"; + $text .= " else {\n\t\t_p$n = unsafe.Pointer(&_zero)\n\t}"; + $text .= "\n"; + push @args, "uintptr(_p$n)", "uintptr(len($name))"; + $n++; + } elsif($type eq "int64" && ($openbsd || $netbsd)) { + push @args, "0"; + if($_32bit eq "big-endian") { + push @args, "uintptr($name>>32)", "uintptr($name)"; + } elsif($_32bit eq "little-endian") { + push @args, "uintptr($name)", "uintptr($name>>32)"; + } else { + push @args, "uintptr($name)"; + } + } elsif($type eq "int64" && $dragonfly) { + if ($func !~ /^extp(read|write)/i) { + push @args, "0"; + } + if($_32bit eq "big-endian") { + push @args, "uintptr($name>>32)", "uintptr($name)"; + } elsif($_32bit eq "little-endian") { + push @args, "uintptr($name)", "uintptr($name>>32)"; + } else { + push @args, "uintptr($name)"; + } + } elsif($type eq "int64" && $_32bit ne "") { + if(@args % 2 && $arm) { + # arm abi specifies 64-bit argument uses + # (even, odd) pair + push @args, "0" + } + if($_32bit eq "big-endian") { + push @args, "uintptr($name>>32)", "uintptr($name)"; + } else { + push @args, "uintptr($name)", "uintptr($name>>32)"; + } + } else { + push @args, "uintptr($name)"; + } + } + + # Determine which form to use; pad args with zeros. + my $asm = "Syscall"; + if ($nonblock) { + $asm = "RawSyscall"; + } + if(@args <= 3) { + while(@args < 3) { + push @args, "0"; + } + } elsif(@args <= 6) { + $asm .= "6"; + while(@args < 6) { + push @args, "0"; + } + } elsif(@args <= 9) { + $asm .= "9"; + while(@args < 9) { + push @args, "0"; + } + } else { + print STDERR "$ARGV:$.: too many arguments to system call\n"; + } + + # System call number. + if($sysname eq "") { + $sysname = "SYS_$func"; + $sysname =~ s/([a-z])([A-Z])/${1}_$2/g; # turn FooBar into Foo_Bar + $sysname =~ y/a-z/A-Z/; + } + + # Actual call. + my $args = join(', ', @args); + my $call = "$asm($sysname, $args)"; + + # Assign return values. + my $body = ""; + my @ret = ("_", "_", "_"); + my $do_errno = 0; + for(my $i=0; $i<@out; $i++) { + my $p = $out[$i]; + my ($name, $type) = parseparam($p); + my $reg = ""; + if($name eq "err" && !$plan9) { + $reg = "e1"; + $ret[2] = $reg; + $do_errno = 1; + } elsif($name eq "err" && $plan9) { + $ret[0] = "r0"; + $ret[2] = "e1"; + next; + } else { + $reg = sprintf("r%d", $i); + $ret[$i] = $reg; + } + if($type eq "bool") { + $reg = "$reg != 0"; + } + if($type eq "int64" && $_32bit ne "") { + # 64-bit number in r1:r0 or r0:r1. + if($i+2 > @out) { + print STDERR "$ARGV:$.: not enough registers for int64 return\n"; + } + if($_32bit eq "big-endian") { + $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i, $i+1); + } else { + $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i+1, $i); + } + $ret[$i] = sprintf("r%d", $i); + $ret[$i+1] = sprintf("r%d", $i+1); + } + if($reg ne "e1" || $plan9) { + $body .= "\t$name = $type($reg)\n"; + } + } + if ($ret[0] eq "_" && $ret[1] eq "_" && $ret[2] eq "_") { + $text .= "\t$call\n"; + } else { + $text .= "\t$ret[0], $ret[1], $ret[2] := $call\n"; + } + $text .= $body; + + if ($plan9 && $ret[2] eq "e1") { + $text .= "\tif int32(r0) == -1 {\n"; + $text .= "\t\terr = e1\n"; + $text .= "\t}\n"; + } elsif ($do_errno) { + $text .= "\tif e1 != 0 {\n"; + $text .= "\t\terr = errnoErr(e1)\n"; + $text .= "\t}\n"; + } + $text .= "\treturn\n"; + $text .= "}\n\n"; +} + +chomp $text; +chomp $text; + +if($errors) { + exit 1; +} + +print <) { + chomp; + s/\s+/ /g; + s/^\s+//; + s/\s+$//; + $package = $1 if !$package && /^package (\S+)$/; + my $nonblock = /^\/\/sysnb /; + next if !/^\/\/sys / && !$nonblock; + + # Line must be of the form + # func Open(path string, mode int, perm int) (fd int, err error) + # Split into name, in params, out params. + if(!/^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*(?:(\w*)\.)?(\w*))?$/) { + print STDERR "$ARGV:$.: malformed //sys declaration\n"; + $errors = 1; + next; + } + my ($nb, $func, $in, $out, $modname, $sysname) = ($1, $2, $3, $4, $5, $6); + + # Split argument lists on comma. + my @in = parseparamlist($in); + my @out = parseparamlist($out); + + # So file name. + if($modname eq "") { + $modname = "libc"; + } + + # System call name. + if($sysname eq "") { + $sysname = "$func"; + } + + # System call pointer variable name. + my $sysvarname = "proc$sysname"; + + my $strconvfunc = "BytePtrFromString"; + my $strconvtype = "*byte"; + + $sysname =~ y/A-Z/a-z/; # All libc functions are lowercase. + + # Runtime import of function to allow cross-platform builds. + $dynimports .= "//go:cgo_import_dynamic libc_${sysname} ${sysname} \"$modname.so\"\n"; + # Link symbol to proc address variable. + $linknames .= "//go:linkname ${sysvarname} libc_${sysname}\n"; + # Library proc address variable. + push @vars, $sysvarname; + + # Go function header. + $out = join(', ', @out); + if($out ne "") { + $out = " ($out)"; + } + if($text ne "") { + $text .= "\n" + } + $text .= sprintf "func %s(%s)%s {\n", $func, join(', ', @in), $out; + + # Check if err return available + my $errvar = ""; + foreach my $p (@out) { + my ($name, $type) = parseparam($p); + if($type eq "error") { + $errvar = $name; + last; + } + } + + # Prepare arguments to Syscall. + my @args = (); + my $n = 0; + foreach my $p (@in) { + my ($name, $type) = parseparam($p); + if($type =~ /^\*/) { + push @args, "uintptr(unsafe.Pointer($name))"; + } elsif($type eq "string" && $errvar ne "") { + $text .= "\tvar _p$n $strconvtype\n"; + $text .= "\t_p$n, $errvar = $strconvfunc($name)\n"; + $text .= "\tif $errvar != nil {\n\t\treturn\n\t}\n"; + push @args, "uintptr(unsafe.Pointer(_p$n))"; + $n++; + } elsif($type eq "string") { + print STDERR "$ARGV:$.: $func uses string arguments, but has no error return\n"; + $text .= "\tvar _p$n $strconvtype\n"; + $text .= "\t_p$n, _ = $strconvfunc($name)\n"; + push @args, "uintptr(unsafe.Pointer(_p$n))"; + $n++; + } elsif($type =~ /^\[\](.*)/) { + # Convert slice into pointer, length. + # Have to be careful not to take address of &a[0] if len == 0: + # pass nil in that case. + $text .= "\tvar _p$n *$1\n"; + $text .= "\tif len($name) > 0 {\n\t\t_p$n = \&$name\[0]\n\t}\n"; + push @args, "uintptr(unsafe.Pointer(_p$n))", "uintptr(len($name))"; + $n++; + } elsif($type eq "int64" && $_32bit ne "") { + if($_32bit eq "big-endian") { + push @args, "uintptr($name >> 32)", "uintptr($name)"; + } else { + push @args, "uintptr($name)", "uintptr($name >> 32)"; + } + } elsif($type eq "bool") { + $text .= "\tvar _p$n uint32\n"; + $text .= "\tif $name {\n\t\t_p$n = 1\n\t} else {\n\t\t_p$n = 0\n\t}\n"; + push @args, "uintptr(_p$n)"; + $n++; + } else { + push @args, "uintptr($name)"; + } + } + my $nargs = @args; + + # Determine which form to use; pad args with zeros. + my $asm = "sysvicall6"; + if ($nonblock) { + $asm = "rawSysvicall6"; + } + if(@args <= 6) { + while(@args < 6) { + push @args, "0"; + } + } else { + print STDERR "$ARGV:$.: too many arguments to system call\n"; + } + + # Actual call. + my $args = join(', ', @args); + my $call = "$asm(uintptr(unsafe.Pointer(&$sysvarname)), $nargs, $args)"; + + # Assign return values. + my $body = ""; + my $failexpr = ""; + my @ret = ("_", "_", "_"); + my @pout= (); + my $do_errno = 0; + for(my $i=0; $i<@out; $i++) { + my $p = $out[$i]; + my ($name, $type) = parseparam($p); + my $reg = ""; + if($name eq "err") { + $reg = "e1"; + $ret[2] = $reg; + $do_errno = 1; + } else { + $reg = sprintf("r%d", $i); + $ret[$i] = $reg; + } + if($type eq "bool") { + $reg = "$reg != 0"; + } + if($type eq "int64" && $_32bit ne "") { + # 64-bit number in r1:r0 or r0:r1. + if($i+2 > @out) { + print STDERR "$ARGV:$.: not enough registers for int64 return\n"; + } + if($_32bit eq "big-endian") { + $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i, $i+1); + } else { + $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i+1, $i); + } + $ret[$i] = sprintf("r%d", $i); + $ret[$i+1] = sprintf("r%d", $i+1); + } + if($reg ne "e1") { + $body .= "\t$name = $type($reg)\n"; + } + } + if ($ret[0] eq "_" && $ret[1] eq "_" && $ret[2] eq "_") { + $text .= "\t$call\n"; + } else { + $text .= "\t$ret[0], $ret[1], $ret[2] := $call\n"; + } + $text .= $body; + + if ($do_errno) { + $text .= "\tif e1 != 0 {\n"; + $text .= "\t\terr = e1\n"; + $text .= "\t}\n"; + } + $text .= "\treturn\n"; + $text .= "}\n"; +} + +if($errors) { + exit 1; +} + +print < "net.inet", + "net.inet.ipproto" => "net.inet", + "net.inet6.ipv6proto" => "net.inet6", + "net.inet6.ipv6" => "net.inet6.ip6", + "net.inet.icmpv6" => "net.inet6.icmp6", + "net.inet6.divert6" => "net.inet6.divert", + "net.inet6.tcp6" => "net.inet.tcp", + "net.inet6.udp6" => "net.inet.udp", + "mpls" => "net.mpls", + "swpenc" => "vm.swapencrypt" +); + +# Node mappings +my %node_map = ( + "net.inet.ip.ifq" => "net.ifq", + "net.inet.pfsync" => "net.pfsync", + "net.mpls.ifq" => "net.ifq" +); + +my $ctlname; +my %mib = (); +my %sysctl = (); +my $node; + +sub debug() { + print STDERR "$_[0]\n" if $debug; +} + +# Walk the MIB and build a sysctl name to OID mapping. +sub build_sysctl() { + my ($node, $name, $oid) = @_; + my %node = %{$node}; + my @oid = @{$oid}; + + foreach my $key (sort keys %node) { + my @node = @{$node{$key}}; + my $nodename = $name.($name ne '' ? '.' : '').$key; + my @nodeoid = (@oid, $node[0]); + if ($node[1] eq 'CTLTYPE_NODE') { + if (exists $node_map{$nodename}) { + $node = \%mib; + $ctlname = $node_map{$nodename}; + foreach my $part (split /\./, $ctlname) { + $node = \%{@{$$node{$part}}[2]}; + } + } else { + $node = $node[2]; + } + &build_sysctl($node, $nodename, \@nodeoid); + } elsif ($node[1] ne '') { + $sysctl{$nodename} = \@nodeoid; + } + } +} + +foreach my $ctl (@ctls) { + $ctls{$ctl} = $ctl; +} + +# Build MIB +foreach my $header (@headers) { + &debug("Processing $header..."); + open HEADER, "/usr/include/$header" || + print STDERR "Failed to open $header\n"; + while (

    ) { + if ($_ =~ /^#define\s+(CTL_NAMES)\s+{/ || + $_ =~ /^#define\s+(CTL_(.*)_NAMES)\s+{/ || + $_ =~ /^#define\s+((.*)CTL_NAMES)\s+{/) { + if ($1 eq 'CTL_NAMES') { + # Top level. + $node = \%mib; + } else { + # Node. + my $nodename = lc($2); + if ($header =~ /^netinet\//) { + $ctlname = "net.inet.$nodename"; + } elsif ($header =~ /^netinet6\//) { + $ctlname = "net.inet6.$nodename"; + } elsif ($header =~ /^net\//) { + $ctlname = "net.$nodename"; + } else { + $ctlname = "$nodename"; + $ctlname =~ s/^(fs|net|kern)_/$1\./; + } + if (exists $ctl_map{$ctlname}) { + $ctlname = $ctl_map{$ctlname}; + } + if (not exists $ctls{$ctlname}) { + &debug("Ignoring $ctlname..."); + next; + } + + # Walk down from the top of the MIB. + $node = \%mib; + foreach my $part (split /\./, $ctlname) { + if (not exists $$node{$part}) { + &debug("Missing node $part"); + $$node{$part} = [ 0, '', {} ]; + } + $node = \%{@{$$node{$part}}[2]}; + } + } + + # Populate current node with entries. + my $i = -1; + while (defined($_) && $_ !~ /^}/) { + $_ =
    ; + $i++ if $_ =~ /{.*}/; + next if $_ !~ /{\s+"(\w+)",\s+(CTLTYPE_[A-Z]+)\s+}/; + $$node{$1} = [ $i, $2, {} ]; + } + } + } + close HEADER; +} + +&build_sysctl(\%mib, "", []); + +print <){ + if(/^#define\s+SYS_(\w+)\s+([0-9]+)/){ + my $name = $1; + my $num = $2; + $name =~ y/a-z/A-Z/; + print " SYS_$name = $num;" + } +} + +print <){ + if(/^([0-9]+)\s+STD\s+({ \S+\s+(\w+).*)$/){ + my $num = $1; + my $proto = $2; + my $name = "SYS_$3"; + $name =~ y/a-z/A-Z/; + + # There are multiple entries for enosys and nosys, so comment them out. + if($name =~ /^SYS_E?NOSYS$/){ + $name = "// $name"; + } + if($name eq 'SYS_SYS_EXIT'){ + $name = 'SYS_EXIT'; + } + + print " $name = $num; // $proto\n"; + } +} + +print <){ + if(/^([0-9]+)\s+\S+\s+STD\s+({ \S+\s+(\w+).*)$/){ + my $num = $1; + my $proto = $2; + my $name = "SYS_$3"; + $name =~ y/a-z/A-Z/; + + # There are multiple entries for enosys and nosys, so comment them out. + if($name =~ /^SYS_E?NOSYS$/){ + $name = "// $name"; + } + if($name eq 'SYS_SYS_EXIT'){ + $name = 'SYS_EXIT'; + } + + print " $name = $num; // $proto\n"; + } +} + +print <){ + if($line =~ /^(.*)\\$/) { + # Handle continuation + $line = $1; + $_ =~ s/^\s+//; + $line .= $_; + } else { + # New line + $line = $_; + } + next if $line =~ /\\$/; + if($line =~ /^([0-9]+)\s+((STD)|(NOERR))\s+(RUMP\s+)?({\s+\S+\s*\*?\s*\|(\S+)\|(\S*)\|(\w+).*\s+})(\s+(\S+))?$/) { + my $num = $1; + my $proto = $6; + my $compat = $8; + my $name = "$7_$9"; + + $name = "$7_$11" if $11 ne ''; + $name =~ y/a-z/A-Z/; + + if($compat eq '' || $compat eq '13' || $compat eq '30' || $compat eq '50') { + print " $name = $num; // $proto\n"; + } + } +} + +print <){ + if(/^([0-9]+)\s+STD\s+(NOLOCK\s+)?({ \S+\s+\*?(\w+).*)$/){ + my $num = $1; + my $proto = $3; + my $name = $4; + $name =~ y/a-z/A-Z/; + + # There are multiple entries for enosys and nosys, so comment them out. + if($name =~ /^SYS_E?NOSYS$/){ + $name = "// $name"; + } + if($name eq 'SYS_SYS_EXIT'){ + $name = 'SYS_EXIT'; + } + + print " $name = $num; // $proto\n"; + } +} + +print < uint64(len(b)) { + return nil, nil, EINVAL + } + return h, b[cmsgAlignOf(SizeofCmsghdr):h.Len], nil +} + +// UnixRights encodes a set of open file descriptors into a socket +// control message for sending to another process. +func UnixRights(fds ...int) []byte { + datalen := len(fds) * 4 + b := make([]byte, CmsgSpace(datalen)) + h := (*Cmsghdr)(unsafe.Pointer(&b[0])) + h.Level = SOL_SOCKET + h.Type = SCM_RIGHTS + h.SetLen(CmsgLen(datalen)) + data := cmsgData(h) + for _, fd := range fds { + *(*int32)(data) = int32(fd) + data = unsafe.Pointer(uintptr(data) + 4) + } + return b +} + +// ParseUnixRights decodes a socket control message that contains an +// integer array of open file descriptors from another process. +func ParseUnixRights(m *SocketControlMessage) ([]int, error) { + if m.Header.Level != SOL_SOCKET { + return nil, EINVAL + } + if m.Header.Type != SCM_RIGHTS { + return nil, EINVAL + } + fds := make([]int, len(m.Data)>>2) + for i, j := 0, 0; i < len(m.Data); i += 4 { + fds[j] = int(*(*int32)(unsafe.Pointer(&m.Data[i]))) + j++ + } + return fds, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/str.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/str.go new file mode 100644 index 0000000..35ed664 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/str.go @@ -0,0 +1,26 @@ +// 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +package unix + +func itoa(val int) string { // do it here rather than with fmt to avoid dependency + if val < 0 { + return "-" + uitoa(uint(-val)) + } + return uitoa(uint(val)) +} + +func uitoa(val uint) string { + var buf [32]byte // big enough for int64 + i := len(buf) - 1 + for val >= 10 { + buf[i] = byte(val%10 + '0') + i-- + val /= 10 + } + buf[i] = byte(val + '0') + return string(buf[i:]) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall.go new file mode 100644 index 0000000..85e3502 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall.go @@ -0,0 +1,69 @@ +// 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +// Package unix contains an interface to the low-level operating system +// primitives. OS details vary depending on the underlying system, and +// by default, godoc will display OS-specific documentation for the current +// system. If you want godoc to display OS documentation for another +// system, set $GOOS and $GOARCH to the desired system. For example, if +// you want to view documentation for freebsd/arm on linux/amd64, set $GOOS +// to freebsd and $GOARCH to arm. +// The primary use of this package is inside other packages that provide a more +// portable interface to the system, such as "os", "time" and "net". Use +// those packages rather than this one if you can. +// For details of the functions and data types in this package consult +// the manuals for the appropriate operating system. +// These calls return err == nil to indicate success; otherwise +// err represents an operating system error describing the failure and +// holds a value of type syscall.Errno. +package unix // import "golang.org/x/sys/unix" + +// ByteSliceFromString returns a NUL-terminated slice of bytes +// containing the text of s. If s contains a NUL byte at any +// location, it returns (nil, EINVAL). +func ByteSliceFromString(s string) ([]byte, error) { + for i := 0; i < len(s); i++ { + if s[i] == 0 { + return nil, EINVAL + } + } + a := make([]byte, len(s)+1) + copy(a, s) + return a, nil +} + +// BytePtrFromString returns a pointer to a NUL-terminated array of +// bytes containing the text of s. If s contains a NUL byte at any +// location, it returns (nil, EINVAL). +func BytePtrFromString(s string) (*byte, error) { + a, err := ByteSliceFromString(s) + if err != nil { + return nil, err + } + return &a[0], nil +} + +// Single-word zero for use when we need a valid pointer to 0 bytes. +// See mkunix.pl. +var _zero uintptr + +func (ts *Timespec) Unix() (sec int64, nsec int64) { + return int64(ts.Sec), int64(ts.Nsec) +} + +func (tv *Timeval) Unix() (sec int64, nsec int64) { + return int64(tv.Sec), int64(tv.Usec) * 1000 +} + +func (ts *Timespec) Nano() int64 { + return int64(ts.Sec)*1e9 + int64(ts.Nsec) +} + +func (tv *Timeval) Nano() int64 { + return int64(tv.Sec)*1e9 + int64(tv.Usec)*1000 +} + +func TimevalToNsec(tv Timeval) int64 { return int64(tv.Sec)*1e9 + int64(tv.Usec)*1e3 } diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_bsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_bsd.go new file mode 100644 index 0000000..c2846b3 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_bsd.go @@ -0,0 +1,635 @@ +// 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. + +// +build darwin dragonfly freebsd netbsd openbsd + +// BSD system call wrappers shared by *BSD based systems +// including OS X (Darwin) and FreeBSD. Like the other +// syscall_*.go files it is compiled as Go code but also +// used as input to mksyscall which parses the //sys +// lines and generates system call stubs. + +package unix + +import ( + "runtime" + "syscall" + "unsafe" +) + +/* + * Wrapped + */ + +//sysnb getgroups(ngid int, gid *_Gid_t) (n int, err error) +//sysnb setgroups(ngid int, gid *_Gid_t) (err error) + +func Getgroups() (gids []int, err error) { + n, err := getgroups(0, nil) + if err != nil { + return nil, err + } + if n == 0 { + return nil, nil + } + + // Sanity check group count. Max is 16 on BSD. + if n < 0 || n > 1000 { + return nil, EINVAL + } + + a := make([]_Gid_t, n) + n, err = getgroups(n, &a[0]) + if err != nil { + return nil, err + } + gids = make([]int, n) + for i, v := range a[0:n] { + gids[i] = int(v) + } + return +} + +func Setgroups(gids []int) (err error) { + if len(gids) == 0 { + return setgroups(0, nil) + } + + a := make([]_Gid_t, len(gids)) + for i, v := range gids { + a[i] = _Gid_t(v) + } + return setgroups(len(a), &a[0]) +} + +func ReadDirent(fd int, buf []byte) (n int, err error) { + // Final argument is (basep *uintptr) and the syscall doesn't take nil. + // 64 bits should be enough. (32 bits isn't even on 386). Since the + // actual system call is getdirentries64, 64 is a good guess. + // TODO(rsc): Can we use a single global basep for all calls? + var base = (*uintptr)(unsafe.Pointer(new(uint64))) + return Getdirentries(fd, buf, base) +} + +// Wait status is 7 bits at bottom, either 0 (exited), +// 0x7F (stopped), or a signal number that caused an exit. +// The 0x80 bit is whether there was a core dump. +// An extra number (exit code, signal causing a stop) +// is in the high bits. + +type WaitStatus uint32 + +const ( + mask = 0x7F + core = 0x80 + shift = 8 + + exited = 0 + stopped = 0x7F +) + +func (w WaitStatus) Exited() bool { return w&mask == exited } + +func (w WaitStatus) ExitStatus() int { + if w&mask != exited { + return -1 + } + return int(w >> shift) +} + +func (w WaitStatus) Signaled() bool { return w&mask != stopped && w&mask != 0 } + +func (w WaitStatus) Signal() syscall.Signal { + sig := syscall.Signal(w & mask) + if sig == stopped || sig == 0 { + return -1 + } + return sig +} + +func (w WaitStatus) CoreDump() bool { return w.Signaled() && w&core != 0 } + +func (w WaitStatus) Stopped() bool { return w&mask == stopped && syscall.Signal(w>>shift) != SIGSTOP } + +func (w WaitStatus) Continued() bool { return w&mask == stopped && syscall.Signal(w>>shift) == SIGSTOP } + +func (w WaitStatus) StopSignal() syscall.Signal { + if !w.Stopped() { + return -1 + } + return syscall.Signal(w>>shift) & 0xFF +} + +func (w WaitStatus) TrapCause() int { return -1 } + +//sys wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) + +func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) { + var status _C_int + wpid, err = wait4(pid, &status, options, rusage) + if wstatus != nil { + *wstatus = WaitStatus(status) + } + return +} + +//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (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) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys Shutdown(s int, how int) (err error) + +func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, EINVAL + } + sa.raw.Len = SizeofSockaddrInet4 + sa.raw.Family = AF_INET + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil +} + +func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, EINVAL + } + sa.raw.Len = SizeofSockaddrInet6 + sa.raw.Family = AF_INET6 + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + sa.raw.Scope_id = sa.ZoneId + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil +} + +func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) { + name := sa.Name + n := len(name) + if n >= len(sa.raw.Path) || n == 0 { + return nil, 0, EINVAL + } + sa.raw.Len = byte(3 + n) // 2 for Family, Len; 1 for NUL + sa.raw.Family = AF_UNIX + for i := 0; i < n; i++ { + sa.raw.Path[i] = int8(name[i]) + } + return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil +} + +func (sa *SockaddrDatalink) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Index == 0 { + return nil, 0, EINVAL + } + sa.raw.Len = sa.Len + sa.raw.Family = AF_LINK + sa.raw.Index = sa.Index + sa.raw.Type = sa.Type + sa.raw.Nlen = sa.Nlen + sa.raw.Alen = sa.Alen + sa.raw.Slen = sa.Slen + for i := 0; i < len(sa.raw.Data); i++ { + sa.raw.Data[i] = sa.Data[i] + } + return unsafe.Pointer(&sa.raw), SizeofSockaddrDatalink, nil +} + +func anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) { + switch rsa.Addr.Family { + case AF_LINK: + pp := (*RawSockaddrDatalink)(unsafe.Pointer(rsa)) + sa := new(SockaddrDatalink) + sa.Len = pp.Len + sa.Family = pp.Family + sa.Index = pp.Index + sa.Type = pp.Type + sa.Nlen = pp.Nlen + sa.Alen = pp.Alen + sa.Slen = pp.Slen + for i := 0; i < len(sa.Data); i++ { + sa.Data[i] = pp.Data[i] + } + return sa, nil + + case AF_UNIX: + pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa)) + if pp.Len < 2 || pp.Len > SizeofSockaddrUnix { + return nil, EINVAL + } + sa := new(SockaddrUnix) + + // Some BSDs include the trailing NUL in the length, whereas + // others do not. Work around this by subtracting the leading + // family and len. The path is then scanned to see if a NUL + // terminator still exists within the length. + n := int(pp.Len) - 2 // subtract leading Family, Len + for i := 0; i < n; i++ { + if pp.Path[i] == 0 { + // found early NUL; assume Len included the NUL + // or was overestimating. + n = i + break + } + } + bytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n] + sa.Name = string(bytes) + return sa, nil + + case AF_INET: + pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet4) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + + case AF_INET6: + pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet6) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + sa.ZoneId = pp.Scope_id + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + } + return nil, EAFNOSUPPORT +} + +func Accept(fd int) (nfd int, sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + nfd, err = accept(fd, &rsa, &len) + if err != nil { + return + } + if runtime.GOOS == "darwin" && len == 0 { + // Accepted socket has no address. + // This is likely due to a bug in xnu kernels, + // where instead of ECONNABORTED error socket + // is accepted, but has no address. + Close(nfd) + return 0, nil, ECONNABORTED + } + sa, err = anyToSockaddr(&rsa) + if err != nil { + Close(nfd) + nfd = 0 + } + return +} + +func Getsockname(fd int) (sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + if err = getsockname(fd, &rsa, &len); err != nil { + return + } + // TODO(jsing): DragonFly has a "bug" (see issue 3349), which should be + // reported upstream. + if runtime.GOOS == "dragonfly" && rsa.Addr.Family == AF_UNSPEC && rsa.Addr.Len == 0 { + rsa.Addr.Family = AF_UNIX + rsa.Addr.Len = SizeofSockaddrUnix + } + return anyToSockaddr(&rsa) +} + +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) + +func GetsockoptByte(fd, level, opt int) (value byte, err error) { + var n byte + vallen := _Socklen(1) + err = getsockopt(fd, level, opt, unsafe.Pointer(&n), &vallen) + return n, err +} + +func GetsockoptInet4Addr(fd, level, opt int) (value [4]byte, err error) { + vallen := _Socklen(4) + err = getsockopt(fd, level, opt, unsafe.Pointer(&value[0]), &vallen) + return value, err +} + +func GetsockoptIPMreq(fd, level, opt int) (*IPMreq, error) { + var value IPMreq + vallen := _Socklen(SizeofIPMreq) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptIPv6Mreq(fd, level, opt int) (*IPv6Mreq, error) { + var value IPv6Mreq + vallen := _Socklen(SizeofIPv6Mreq) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptIPv6MTUInfo(fd, level, opt int) (*IPv6MTUInfo, error) { + var value IPv6MTUInfo + vallen := _Socklen(SizeofIPv6MTUInfo) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptICMPv6Filter(fd, level, opt int) (*ICMPv6Filter, error) { + var value ICMPv6Filter + vallen := _Socklen(SizeofICMPv6Filter) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) + +func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { + var msg Msghdr + var rsa RawSockaddrAny + msg.Name = (*byte)(unsafe.Pointer(&rsa)) + msg.Namelen = uint32(SizeofSockaddrAny) + var iov Iovec + if len(p) > 0 { + iov.Base = (*byte)(unsafe.Pointer(&p[0])) + iov.SetLen(len(p)) + } + var dummy byte + if len(oob) > 0 { + // receive at least one normal byte + if len(p) == 0 { + iov.Base = &dummy + iov.SetLen(1) + } + msg.Control = (*byte)(unsafe.Pointer(&oob[0])) + msg.SetControllen(len(oob)) + } + msg.Iov = &iov + msg.Iovlen = 1 + if n, err = recvmsg(fd, &msg, flags); err != nil { + return + } + oobn = int(msg.Controllen) + recvflags = int(msg.Flags) + // source address is only specified if the socket is unconnected + if rsa.Addr.Family != AF_UNSPEC { + from, err = anyToSockaddr(&rsa) + } + return +} + +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) + +func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { + _, err = SendmsgN(fd, p, oob, to, flags) + return +} + +func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { + var ptr unsafe.Pointer + var salen _Socklen + if to != nil { + ptr, salen, err = to.sockaddr() + if err != nil { + return 0, err + } + } + var msg Msghdr + msg.Name = (*byte)(unsafe.Pointer(ptr)) + msg.Namelen = uint32(salen) + var iov Iovec + if len(p) > 0 { + iov.Base = (*byte)(unsafe.Pointer(&p[0])) + iov.SetLen(len(p)) + } + var dummy byte + if len(oob) > 0 { + // send at least one normal byte + if len(p) == 0 { + iov.Base = &dummy + iov.SetLen(1) + } + msg.Control = (*byte)(unsafe.Pointer(&oob[0])) + msg.SetControllen(len(oob)) + } + msg.Iov = &iov + msg.Iovlen = 1 + if n, err = sendmsg(fd, &msg, flags); err != nil { + return 0, err + } + if len(oob) > 0 && len(p) == 0 { + n = 0 + } + return n, nil +} + +//sys kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) + +func Kevent(kq int, changes, events []Kevent_t, timeout *Timespec) (n int, err error) { + var change, event unsafe.Pointer + if len(changes) > 0 { + change = unsafe.Pointer(&changes[0]) + } + if len(events) > 0 { + event = unsafe.Pointer(&events[0]) + } + return kevent(kq, change, len(changes), event, len(events), timeout) +} + +//sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL + +// sysctlmib translates name to mib number and appends any additional args. +func sysctlmib(name string, args ...int) ([]_C_int, error) { + // Translate name to mib number. + mib, err := nametomib(name) + if err != nil { + return nil, err + } + + for _, a := range args { + mib = append(mib, _C_int(a)) + } + + return mib, nil +} + +func Sysctl(name string) (string, error) { + return SysctlArgs(name) +} + +func SysctlArgs(name string, args ...int) (string, error) { + buf, err := SysctlRaw(name, args...) + if err != nil { + return "", err + } + n := len(buf) + + // Throw away terminating NUL. + if n > 0 && buf[n-1] == '\x00' { + n-- + } + return string(buf[0:n]), nil +} + +func SysctlUint32(name string) (uint32, error) { + return SysctlUint32Args(name) +} + +func SysctlUint32Args(name string, args ...int) (uint32, error) { + mib, err := sysctlmib(name, args...) + if err != nil { + return 0, err + } + + n := uintptr(4) + buf := make([]byte, 4) + if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil { + return 0, err + } + if n != 4 { + return 0, EIO + } + return *(*uint32)(unsafe.Pointer(&buf[0])), nil +} + +func SysctlUint64(name string, args ...int) (uint64, error) { + mib, err := sysctlmib(name, args...) + if err != nil { + return 0, err + } + + n := uintptr(8) + buf := make([]byte, 8) + if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil { + return 0, err + } + if n != 8 { + return 0, EIO + } + return *(*uint64)(unsafe.Pointer(&buf[0])), nil +} + +func SysctlRaw(name string, args ...int) ([]byte, error) { + mib, err := sysctlmib(name, args...) + if err != nil { + return nil, err + } + + // Find size. + n := uintptr(0) + if err := sysctl(mib, nil, &n, nil, 0); err != nil { + return nil, err + } + if n == 0 { + return nil, nil + } + + // Read into buffer of that size. + buf := make([]byte, n) + if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil { + return nil, err + } + + // The actual call may return less than the original reported required + // size so ensure we deal with that. + return buf[:n], nil +} + +//sys utimes(path string, timeval *[2]Timeval) (err error) + +func Utimes(path string, tv []Timeval) error { + if tv == nil { + return utimes(path, nil) + } + if len(tv) != 2 { + return EINVAL + } + return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +func UtimesNano(path string, ts []Timespec) error { + if ts == nil { + err := utimensat(AT_FDCWD, path, nil, 0) + if err != ENOSYS { + return err + } + return utimes(path, nil) + } + if len(ts) != 2 { + return EINVAL + } + err := utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) + if err != ENOSYS { + return err + } + // Not as efficient as it could be because Timespec and + // Timeval have different types in the different OSes + tv := [2]Timeval{ + NsecToTimeval(TimespecToNsec(ts[0])), + NsecToTimeval(TimespecToNsec(ts[1])), + } + return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +func UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) error { + if ts == nil { + return utimensat(dirfd, path, nil, flags) + } + if len(ts) != 2 { + return EINVAL + } + return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags) +} + +//sys futimes(fd int, timeval *[2]Timeval) (err error) + +func Futimes(fd int, tv []Timeval) error { + if tv == nil { + return futimes(fd, nil) + } + if len(tv) != 2 { + return EINVAL + } + return futimes(fd, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +//sys fcntl(fd int, cmd int, arg int) (val int, err error) + +// TODO: wrap +// Acct(name nil-string) (err error) +// Gethostuuid(uuid *byte, timeout *Timespec) (err error) +// Ptrace(req int, pid int, addr uintptr, data int) (ret uintptr, err error) + +var mapper = &mmapper{ + active: make(map[*byte][]byte), + mmap: mmap, + munmap: munmap, +} + +func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { + return mapper.Mmap(fd, offset, length, prot, flags) +} + +func Munmap(b []byte) (err error) { + return mapper.Munmap(b) +} + +//sys Madvise(b []byte, behav int) (err error) +//sys Mlock(b []byte) (err error) +//sys Mlockall(flags int) (err error) +//sys Mprotect(b []byte, prot int) (err error) +//sys Msync(b []byte, flags int) (err error) +//sys Munlock(b []byte) (err error) +//sys Munlockall() (err error) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_bsd_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_bsd_test.go new file mode 100644 index 0000000..d8085a0 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_bsd_test.go @@ -0,0 +1,62 @@ +// 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. + +// +build darwin dragonfly freebsd openbsd + +package unix_test + +import ( + "os/exec" + "runtime" + "testing" + + "golang.org/x/sys/unix" +) + +const MNT_WAIT = 1 +const MNT_NOWAIT = 2 + +func TestGetfsstat(t *testing.T) { + const flags = MNT_NOWAIT // see golang.org/issue/16937 + n, err := unix.Getfsstat(nil, flags) + if err != nil { + t.Fatal(err) + } + + data := make([]unix.Statfs_t, n) + n2, err := unix.Getfsstat(data, flags) + if err != nil { + t.Fatal(err) + } + if n != n2 { + t.Errorf("Getfsstat(nil) = %d, but subsequent Getfsstat(slice) = %d", n, n2) + } + for i, stat := range data { + if stat == (unix.Statfs_t{}) { + t.Errorf("index %v is an empty Statfs_t struct", i) + } + } + if t.Failed() { + for i, stat := range data[:n2] { + t.Logf("data[%v] = %+v", i, stat) + } + mount, err := exec.Command("mount").CombinedOutput() + if err != nil { + t.Logf("mount: %v\n%s", err, mount) + } else { + t.Logf("mount: %s", mount) + } + } +} + +func TestSysctlRaw(t *testing.T) { + if runtime.GOOS == "openbsd" { + t.Skip("kern.proc.pid does not exist on OpenBSD") + } + + _, err := unix.SysctlRaw("kern.proc.pid", unix.Getpid()) + if err != nil { + t.Fatal(err) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_darwin.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_darwin.go new file mode 100644 index 0000000..ad74a11 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_darwin.go @@ -0,0 +1,536 @@ +// Copyright 2009,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. + +// Darwin system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and wrap +// it in our own nicer implementation, either here or in +// syscall_bsd.go or syscall_unix.go. + +package unix + +import ( + errorspkg "errors" + "syscall" + "unsafe" +) + +const ImplementsGetwd = true + +func Getwd() (string, error) { + buf := make([]byte, 2048) + attrs, err := getAttrList(".", attrList{CommonAttr: attrCmnFullpath}, buf, 0) + if err == nil && len(attrs) == 1 && len(attrs[0]) >= 2 { + wd := string(attrs[0]) + // Sanity check that it's an absolute path and ends + // in a null byte, which we then strip. + if wd[0] == '/' && wd[len(wd)-1] == 0 { + return wd[:len(wd)-1], nil + } + } + // If pkg/os/getwd.go gets ENOTSUP, it will fall back to the + // slow algorithm. + return "", ENOTSUP +} + +type SockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 + raw RawSockaddrDatalink +} + +// Translate "kern.hostname" to []_C_int{0,1,2,3}. +func nametomib(name string) (mib []_C_int, err error) { + const siz = unsafe.Sizeof(mib[0]) + + // NOTE(rsc): It seems strange to set the buffer to have + // size CTL_MAXNAME+2 but use only CTL_MAXNAME + // as the size. I don't know why the +2 is here, but the + // kernel uses +2 for its own implementation of this function. + // I am scared that if we don't include the +2 here, the kernel + // will silently write 2 words farther than we specify + // and we'll get memory corruption. + var buf [CTL_MAXNAME + 2]_C_int + n := uintptr(CTL_MAXNAME) * siz + + p := (*byte)(unsafe.Pointer(&buf[0])) + bytes, err := ByteSliceFromString(name) + if err != nil { + return nil, err + } + + // Magic sysctl: "setting" 0.3 to a string name + // lets you read back the array of integers form. + if err = sysctl([]_C_int{0, 3}, p, &n, &bytes[0], uintptr(len(name))); err != nil { + return nil, err + } + return buf[0 : n/siz], nil +} + +func direntIno(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino)) +} + +func direntReclen(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen)) +} + +func direntNamlen(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen)) +} + +//sys ptrace(request int, pid int, addr uintptr, data uintptr) (err error) +func PtraceAttach(pid int) (err error) { return ptrace(PT_ATTACH, pid, 0, 0) } +func PtraceDetach(pid int) (err error) { return ptrace(PT_DETACH, pid, 0, 0) } + +const ( + attrBitMapCount = 5 + attrCmnFullpath = 0x08000000 +) + +type attrList struct { + bitmapCount uint16 + _ uint16 + CommonAttr uint32 + VolAttr uint32 + DirAttr uint32 + FileAttr uint32 + Forkattr uint32 +} + +func getAttrList(path string, attrList attrList, attrBuf []byte, options uint) (attrs [][]byte, err error) { + if len(attrBuf) < 4 { + return nil, errorspkg.New("attrBuf too small") + } + attrList.bitmapCount = attrBitMapCount + + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return nil, err + } + + _, _, e1 := Syscall6( + SYS_GETATTRLIST, + uintptr(unsafe.Pointer(_p0)), + uintptr(unsafe.Pointer(&attrList)), + uintptr(unsafe.Pointer(&attrBuf[0])), + uintptr(len(attrBuf)), + uintptr(options), + 0, + ) + if e1 != 0 { + return nil, e1 + } + size := *(*uint32)(unsafe.Pointer(&attrBuf[0])) + + // dat is the section of attrBuf that contains valid data, + // without the 4 byte length header. All attribute offsets + // are relative to dat. + dat := attrBuf + if int(size) < len(attrBuf) { + dat = dat[:size] + } + dat = dat[4:] // remove length prefix + + for i := uint32(0); int(i) < len(dat); { + header := dat[i:] + if len(header) < 8 { + return attrs, errorspkg.New("truncated attribute header") + } + datOff := *(*int32)(unsafe.Pointer(&header[0])) + attrLen := *(*uint32)(unsafe.Pointer(&header[4])) + if datOff < 0 || uint32(datOff)+attrLen > uint32(len(dat)) { + return attrs, errorspkg.New("truncated results; attrBuf too small") + } + end := uint32(datOff) + attrLen + attrs = append(attrs, dat[datOff:end]) + i = end + if r := i % 4; r != 0 { + i += (4 - r) + } + } + return +} + +//sysnb pipe() (r int, w int, err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + p[0], p[1], err = pipe() + return +} + +func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { + var _p0 unsafe.Pointer + var bufsize uintptr + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf)) + } + r0, _, e1 := Syscall(SYS_GETFSSTAT64, uintptr(_p0), bufsize, uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) error { + // Darwin doesn't support SYS_UTIMENSAT + return ENOSYS +} + +/* + * Wrapped + */ + +//sys kill(pid int, signum int, posix int) (err error) + +func Kill(pid int, signum syscall.Signal) (err error) { return kill(pid, int(signum), 1) } + +//sys ioctl(fd int, req uint, arg uintptr) (err error) + +// ioctl itself should not be exposed directly, but additional get/set +// functions for specific types are permissible. + +// IoctlSetInt performs an ioctl operation which sets an integer value +// on fd, using the specified request number. +func IoctlSetInt(fd int, req uint, value int) error { + return ioctl(fd, req, uintptr(value)) +} + +func IoctlSetWinsize(fd int, req uint, value *Winsize) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlSetTermios(fd int, req uint, value *Termios) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +// IoctlGetInt performs an ioctl operation which gets an integer value +// from fd, using the specified request number. +func IoctlGetInt(fd int, req uint) (int, error) { + var value int + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return value, err +} + +func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { + var value Winsize + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermios(fd int, req uint) (*Termios, error) { + var value Termios + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +/* + * Exposed directly + */ +//sys Access(path string, mode uint32) (err error) +//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) +//sys Chdir(path string) (err error) +//sys Chflags(path string, flags int) (err error) +//sys Chmod(path string, mode uint32) (err error) +//sys Chown(path string, uid int, gid int) (err error) +//sys Chroot(path string) (err error) +//sys Close(fd int) (err error) +//sys Dup(fd int) (nfd int, err error) +//sys Dup2(from int, to int) (err error) +//sys Exchangedata(path1 string, path2 string, options int) (err error) +//sys Exit(code int) +//sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fchdir(fd int) (err error) +//sys Fchflags(fd int, flags int) (err error) +//sys Fchmod(fd int, mode uint32) (err error) +//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) +//sys Flock(fd int, how int) (err error) +//sys Fpathconf(fd int, name int) (val int, err error) +//sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64 +//sys Fstatfs(fd int, stat *Statfs_t) (err error) = SYS_FSTATFS64 +//sys Fsync(fd int) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sys Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) = SYS_GETDIRENTRIES64 +//sys Getdtablesize() (size int) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (uid int) +//sysnb Getgid() (gid int) +//sysnb Getpgid(pid int) (pgid int, err error) +//sysnb Getpgrp() (pgrp int) +//sysnb Getpid() (pid int) +//sysnb Getppid() (ppid int) +//sys Getpriority(which int, who int) (prio int, err error) +//sysnb Getrlimit(which int, lim *Rlimit) (err error) +//sysnb Getrusage(who int, rusage *Rusage) (err error) +//sysnb Getsid(pid int) (sid int, err error) +//sysnb Getuid() (uid int) +//sysnb Issetugid() (tainted bool) +//sys Kqueue() (fd int, err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Link(path string, link string) (err error) +//sys Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) +//sys Listen(s int, backlog int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 +//sys Mkdir(path string, mode uint32) (err error) +//sys Mkdirat(dirfd int, path string, mode uint32) (err error) +//sys Mkfifo(path string, mode uint32) (err error) +//sys Mknod(path string, mode uint32, dev int) (err error) +//sys Open(path string, mode int, perm uint32) (fd int, err error) +//sys Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) +//sys Pathconf(path string, name int) (val int, err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys read(fd int, p []byte) (n int, err error) +//sys Readlink(path string, buf []byte) (n int, err error) +//sys Readlinkat(dirfd int, path string, buf []byte) (n int, err error) +//sys Rename(from string, to string) (err error) +//sys Renameat(fromfd int, from string, tofd int, to string) (err error) +//sys Revoke(path string) (err error) +//sys Rmdir(path string) (err error) +//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK +//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) +//sys Setegid(egid int) (err error) +//sysnb Seteuid(euid int) (err error) +//sysnb Setgid(gid int) (err error) +//sys Setlogin(name string) (err error) +//sysnb Setpgid(pid int, pgid int) (err error) +//sys Setpriority(which int, who int, prio int) (err error) +//sys Setprivexec(flag int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sysnb Setrlimit(which int, lim *Rlimit) (err error) +//sysnb Setsid() (pid int, err error) +//sysnb Settimeofday(tp *Timeval) (err error) +//sysnb Setuid(uid int) (err error) +//sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64 +//sys Statfs(path string, stat *Statfs_t) (err error) = SYS_STATFS64 +//sys Symlink(path string, link string) (err error) +//sys Symlinkat(oldpath string, newdirfd int, newpath string) (err error) +//sys Sync() (err error) +//sys Truncate(path string, length int64) (err error) +//sys Umask(newmask int) (oldmask int) +//sys Undelete(path string) (err error) +//sys Unlink(path string) (err error) +//sys Unlinkat(dirfd int, path string, flags int) (err error) +//sys Unmount(path string, flags int) (err error) +//sys write(fd int, p []byte) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) +//sys munmap(addr uintptr, length uintptr) (err error) +//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ +//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE + +/* + * Unimplemented + */ +// Profil +// Sigaction +// Sigprocmask +// Getlogin +// Sigpending +// Sigaltstack +// Ioctl +// Reboot +// Execve +// Vfork +// Sbrk +// Sstk +// Ovadvise +// Mincore +// Setitimer +// Swapon +// Select +// Sigsuspend +// Readv +// Writev +// Nfssvc +// Getfh +// Quotactl +// Mount +// Csops +// Waitid +// Add_profil +// Kdebug_trace +// Sigreturn +// Atsocket +// Kqueue_from_portset_np +// Kqueue_portset +// Getattrlist +// Setattrlist +// Getdirentriesattr +// Searchfs +// Delete +// Copyfile +// Poll +// Watchevent +// Waitevent +// Modwatch +// Getxattr +// Fgetxattr +// Setxattr +// Fsetxattr +// Removexattr +// Fremovexattr +// Listxattr +// Flistxattr +// Fsctl +// Initgroups +// Posix_spawn +// Nfsclnt +// Fhopen +// Minherit +// Semsys +// Msgsys +// Shmsys +// Semctl +// Semget +// Semop +// Msgctl +// Msgget +// Msgsnd +// Msgrcv +// Shmat +// Shmctl +// Shmdt +// Shmget +// Shm_open +// Shm_unlink +// Sem_open +// Sem_close +// Sem_unlink +// Sem_wait +// Sem_trywait +// Sem_post +// Sem_getvalue +// Sem_init +// Sem_destroy +// Open_extended +// Umask_extended +// Stat_extended +// Lstat_extended +// Fstat_extended +// Chmod_extended +// Fchmod_extended +// Access_extended +// Settid +// Gettid +// Setsgroups +// Getsgroups +// Setwgroups +// Getwgroups +// Mkfifo_extended +// Mkdir_extended +// Identitysvc +// Shared_region_check_np +// Shared_region_map_np +// __pthread_mutex_destroy +// __pthread_mutex_init +// __pthread_mutex_lock +// __pthread_mutex_trylock +// __pthread_mutex_unlock +// __pthread_cond_init +// __pthread_cond_destroy +// __pthread_cond_broadcast +// __pthread_cond_signal +// Setsid_with_pid +// __pthread_cond_timedwait +// Aio_fsync +// Aio_return +// Aio_suspend +// Aio_cancel +// Aio_error +// Aio_read +// Aio_write +// Lio_listio +// __pthread_cond_wait +// Iopolicysys +// __pthread_kill +// __pthread_sigmask +// __sigwait +// __disable_threadsignal +// __pthread_markcancel +// __pthread_canceled +// __semwait_signal +// Proc_info +// sendfile +// Stat64_extended +// Lstat64_extended +// Fstat64_extended +// __pthread_chdir +// __pthread_fchdir +// Audit +// Auditon +// Getauid +// Setauid +// Getaudit +// Setaudit +// Getaudit_addr +// Setaudit_addr +// Auditctl +// Bsdthread_create +// Bsdthread_terminate +// Stack_snapshot +// Bsdthread_register +// Workq_open +// Workq_ops +// __mac_execve +// __mac_syscall +// __mac_get_file +// __mac_set_file +// __mac_get_link +// __mac_set_link +// __mac_get_proc +// __mac_set_proc +// __mac_get_fd +// __mac_set_fd +// __mac_get_pid +// __mac_get_lcid +// __mac_get_lctx +// __mac_set_lctx +// Setlcid +// Read_nocancel +// Write_nocancel +// Open_nocancel +// Close_nocancel +// Wait4_nocancel +// Recvmsg_nocancel +// Sendmsg_nocancel +// Recvfrom_nocancel +// Accept_nocancel +// Fcntl_nocancel +// Select_nocancel +// Fsync_nocancel +// Connect_nocancel +// Sigsuspend_nocancel +// Readv_nocancel +// Writev_nocancel +// Sendto_nocancel +// Pread_nocancel +// Pwrite_nocancel +// Waitid_nocancel +// Poll_nocancel +// Msgsnd_nocancel +// Msgrcv_nocancel +// Sem_wait_nocancel +// Aio_suspend_nocancel +// __sigwait_nocancel +// __semwait_signal_nocancel +// __mac_mount +// __mac_get_mount +// __mac_getfsstat diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_darwin_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_darwin_386.go new file mode 100644 index 0000000..76634f7 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_darwin_386.go @@ -0,0 +1,75 @@ +// 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. + +// +build 386,darwin + +package unix + +import ( + "syscall" + "unsafe" +) + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = int32(nsec / 1e9) + ts.Nsec = int32(nsec % 1e9) + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Usec = int32(nsec % 1e9 / 1e3) + tv.Sec = int32(nsec / 1e9) + return +} + +//sysnb gettimeofday(tp *Timeval) (sec int32, usec int32, err error) +func Gettimeofday(tv *Timeval) (err error) { + // The tv passed to gettimeofday must be non-nil + // but is otherwise unused. The answers come back + // in the two registers. + sec, usec, err := gettimeofday(tv) + tv.Sec = int32(sec) + tv.Usec = int32(usec) + return err +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var length = uint64(count) + + _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(*offset>>32), uintptr(unsafe.Pointer(&length)), 0, 0, 0, 0) + + written = int(length) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) + +// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions +// of darwin/386 the syscall is called sysctl instead of __sysctl. +const SYS___SYSCTL = SYS_SYSCTL diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go new file mode 100644 index 0000000..7be02da --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go @@ -0,0 +1,75 @@ +// 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. + +// +build amd64,darwin + +package unix + +import ( + "syscall" + "unsafe" +) + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = nsec / 1e9 + ts.Nsec = nsec % 1e9 + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Usec = int32(nsec % 1e9 / 1e3) + tv.Sec = int64(nsec / 1e9) + return +} + +//sysnb gettimeofday(tp *Timeval) (sec int64, usec int32, err error) +func Gettimeofday(tv *Timeval) (err error) { + // The tv passed to gettimeofday must be non-nil + // but is otherwise unused. The answers come back + // in the two registers. + sec, usec, err := gettimeofday(tv) + tv.Sec = sec + tv.Usec = usec + return err +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint64(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var length = uint64(count) + + _, _, e1 := Syscall6(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(unsafe.Pointer(&length)), 0, 0) + + written = int(length) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) + +// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions +// of darwin/amd64 the syscall is called sysctl instead of __sysctl. +const SYS___SYSCTL = SYS_SYSCTL diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_darwin_arm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_darwin_arm.go new file mode 100644 index 0000000..26b6697 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_darwin_arm.go @@ -0,0 +1,69 @@ +// Copyright 2015 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 unix + +import ( + "syscall" + "unsafe" +) + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = int32(nsec / 1e9) + ts.Nsec = int32(nsec % 1e9) + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Usec = int32(nsec % 1e9 / 1e3) + tv.Sec = int32(nsec / 1e9) + return +} + +//sysnb gettimeofday(tp *Timeval) (sec int32, usec int32, err error) +func Gettimeofday(tv *Timeval) (err error) { + // The tv passed to gettimeofday must be non-nil + // but is otherwise unused. The answers come back + // in the two registers. + sec, usec, err := gettimeofday(tv) + tv.Sec = int32(sec) + tv.Usec = int32(usec) + return err +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var length = uint64(count) + + _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(*offset>>32), uintptr(unsafe.Pointer(&length)), 0, 0, 0, 0) + + written = int(length) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) // sic diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go new file mode 100644 index 0000000..4d67a87 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go @@ -0,0 +1,75 @@ +// Copyright 2015 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 arm64,darwin + +package unix + +import ( + "syscall" + "unsafe" +) + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = nsec / 1e9 + ts.Nsec = nsec % 1e9 + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Usec = int32(nsec % 1e9 / 1e3) + tv.Sec = int64(nsec / 1e9) + return +} + +//sysnb gettimeofday(tp *Timeval) (sec int64, usec int32, err error) +func Gettimeofday(tv *Timeval) (err error) { + // The tv passed to gettimeofday must be non-nil + // but is otherwise unused. The answers come back + // in the two registers. + sec, usec, err := gettimeofday(tv) + tv.Sec = sec + tv.Usec = usec + return err +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint64(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var length = uint64(count) + + _, _, e1 := Syscall6(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(unsafe.Pointer(&length)), 0, 0) + + written = int(length) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) // sic + +// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions +// of darwin/arm64 the syscall is called sysctl instead of __sysctl. +const SYS___SYSCTL = SYS_SYSCTL diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_dragonfly.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_dragonfly.go new file mode 100644 index 0000000..3a48337 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_dragonfly.go @@ -0,0 +1,415 @@ +// 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. + +// DragonFly BSD system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and wrap +// it in our own nicer implementation, either here or in +// syscall_bsd.go or syscall_unix.go. + +package unix + +import "unsafe" + +type SockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 + Rcf uint16 + Route [16]uint16 + raw RawSockaddrDatalink +} + +// Translate "kern.hostname" to []_C_int{0,1,2,3}. +func nametomib(name string) (mib []_C_int, err error) { + const siz = unsafe.Sizeof(mib[0]) + + // NOTE(rsc): It seems strange to set the buffer to have + // size CTL_MAXNAME+2 but use only CTL_MAXNAME + // as the size. I don't know why the +2 is here, but the + // kernel uses +2 for its own implementation of this function. + // I am scared that if we don't include the +2 here, the kernel + // will silently write 2 words farther than we specify + // and we'll get memory corruption. + var buf [CTL_MAXNAME + 2]_C_int + n := uintptr(CTL_MAXNAME) * siz + + p := (*byte)(unsafe.Pointer(&buf[0])) + bytes, err := ByteSliceFromString(name) + if err != nil { + return nil, err + } + + // Magic sysctl: "setting" 0.3 to a string name + // lets you read back the array of integers form. + if err = sysctl([]_C_int{0, 3}, p, &n, &bytes[0], uintptr(len(name))); err != nil { + return nil, err + } + return buf[0 : n/siz], nil +} + +func direntIno(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Fileno), unsafe.Sizeof(Dirent{}.Fileno)) +} + +func direntReclen(buf []byte) (uint64, bool) { + namlen, ok := direntNamlen(buf) + if !ok { + return 0, false + } + return (16 + namlen + 1 + 7) &^ 7, true +} + +func direntNamlen(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen)) +} + +//sysnb pipe() (r int, w int, err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + p[0], p[1], err = pipe() + return +} + +//sys extpread(fd int, p []byte, flags int, offset int64) (n int, err error) +func Pread(fd int, p []byte, offset int64) (n int, err error) { + return extpread(fd, p, 0, offset) +} + +//sys extpwrite(fd int, p []byte, flags int, offset int64) (n int, err error) +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + return extpwrite(fd, p, 0, offset) +} + +func Accept4(fd, flags int) (nfd int, sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + nfd, err = accept4(fd, &rsa, &len, flags) + if err != nil { + return + } + if len > SizeofSockaddrAny { + panic("RawSockaddrAny too small") + } + sa, err = anyToSockaddr(&rsa) + if err != nil { + Close(nfd) + nfd = 0 + } + return +} + +func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { + var _p0 unsafe.Pointer + var bufsize uintptr + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf)) + } + r0, _, e1 := Syscall(SYS_GETFSSTAT, uintptr(_p0), bufsize, uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +/* + * Exposed directly + */ +//sys Access(path string, mode uint32) (err error) +//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) +//sys Chdir(path string) (err error) +//sys Chflags(path string, flags int) (err error) +//sys Chmod(path string, mode uint32) (err error) +//sys Chown(path string, uid int, gid int) (err error) +//sys Chroot(path string) (err error) +//sys Close(fd int) (err error) +//sys Dup(fd int) (nfd int, err error) +//sys Dup2(from int, to int) (err error) +//sys Exit(code int) +//sys Fchdir(fd int) (err error) +//sys Fchflags(fd int, flags int) (err error) +//sys Fchmod(fd int, mode uint32) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Flock(fd int, how int) (err error) +//sys Fpathconf(fd int, name int) (val int, err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatfs(fd int, stat *Statfs_t) (err error) +//sys Fsync(fd int) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sys Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) +//sys Getdtablesize() (size int) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (uid int) +//sysnb Getgid() (gid int) +//sysnb Getpgid(pid int) (pgid int, err error) +//sysnb Getpgrp() (pgrp int) +//sysnb Getpid() (pid int) +//sysnb Getppid() (ppid int) +//sys Getpriority(which int, who int) (prio int, err error) +//sysnb Getrlimit(which int, lim *Rlimit) (err error) +//sysnb Getrusage(who int, rusage *Rusage) (err error) +//sysnb Getsid(pid int) (sid int, err error) +//sysnb Gettimeofday(tv *Timeval) (err error) +//sysnb Getuid() (uid int) +//sys Issetugid() (tainted bool) +//sys Kill(pid int, signum syscall.Signal) (err error) +//sys Kqueue() (fd int, err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Link(path string, link string) (err error) +//sys Listen(s int, backlog int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Mkdir(path string, mode uint32) (err error) +//sys Mkfifo(path string, mode uint32) (err error) +//sys Mknod(path string, mode uint32, dev int) (err error) +//sys Nanosleep(time *Timespec, leftover *Timespec) (err error) +//sys Open(path string, mode int, perm uint32) (fd int, err error) +//sys Pathconf(path string, name int) (val int, err error) +//sys read(fd int, p []byte) (n int, err error) +//sys Readlink(path string, buf []byte) (n int, err error) +//sys Rename(from string, to string) (err error) +//sys Revoke(path string) (err error) +//sys Rmdir(path string) (err error) +//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK +//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) +//sysnb Setegid(egid int) (err error) +//sysnb Seteuid(euid int) (err error) +//sysnb Setgid(gid int) (err error) +//sys Setlogin(name string) (err error) +//sysnb Setpgid(pid int, pgid int) (err error) +//sys Setpriority(which int, who int, prio int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(which int, lim *Rlimit) (err error) +//sysnb Setsid() (pid int, err error) +//sysnb Settimeofday(tp *Timeval) (err error) +//sysnb Setuid(uid int) (err error) +//sys Stat(path string, stat *Stat_t) (err error) +//sys Statfs(path string, stat *Statfs_t) (err error) +//sys Symlink(path string, link string) (err error) +//sys Sync() (err error) +//sys Truncate(path string, length int64) (err error) +//sys Umask(newmask int) (oldmask int) +//sys Undelete(path string) (err error) +//sys Unlink(path string) (err error) +//sys Unmount(path string, flags int) (err error) +//sys write(fd int, p []byte) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) +//sys munmap(addr uintptr, length uintptr) (err error) +//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ +//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE +//sys accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) +//sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) + +/* + * Unimplemented + * TODO(jsing): Update this list for DragonFly. + */ +// Profil +// Sigaction +// Sigprocmask +// Getlogin +// Sigpending +// Sigaltstack +// Ioctl +// Reboot +// Execve +// Vfork +// Sbrk +// Sstk +// Ovadvise +// Mincore +// Setitimer +// Swapon +// Select +// Sigsuspend +// Readv +// Writev +// Nfssvc +// Getfh +// Quotactl +// Mount +// Csops +// Waitid +// Add_profil +// Kdebug_trace +// Sigreturn +// Atsocket +// Kqueue_from_portset_np +// Kqueue_portset +// Getattrlist +// Setattrlist +// Getdirentriesattr +// Searchfs +// Delete +// Copyfile +// Poll +// Watchevent +// Waitevent +// Modwatch +// Getxattr +// Fgetxattr +// Setxattr +// Fsetxattr +// Removexattr +// Fremovexattr +// Listxattr +// Flistxattr +// Fsctl +// Initgroups +// Posix_spawn +// Nfsclnt +// Fhopen +// Minherit +// Semsys +// Msgsys +// Shmsys +// Semctl +// Semget +// Semop +// Msgctl +// Msgget +// Msgsnd +// Msgrcv +// Shmat +// Shmctl +// Shmdt +// Shmget +// Shm_open +// Shm_unlink +// Sem_open +// Sem_close +// Sem_unlink +// Sem_wait +// Sem_trywait +// Sem_post +// Sem_getvalue +// Sem_init +// Sem_destroy +// Open_extended +// Umask_extended +// Stat_extended +// Lstat_extended +// Fstat_extended +// Chmod_extended +// Fchmod_extended +// Access_extended +// Settid +// Gettid +// Setsgroups +// Getsgroups +// Setwgroups +// Getwgroups +// Mkfifo_extended +// Mkdir_extended +// Identitysvc +// Shared_region_check_np +// Shared_region_map_np +// __pthread_mutex_destroy +// __pthread_mutex_init +// __pthread_mutex_lock +// __pthread_mutex_trylock +// __pthread_mutex_unlock +// __pthread_cond_init +// __pthread_cond_destroy +// __pthread_cond_broadcast +// __pthread_cond_signal +// Setsid_with_pid +// __pthread_cond_timedwait +// Aio_fsync +// Aio_return +// Aio_suspend +// Aio_cancel +// Aio_error +// Aio_read +// Aio_write +// Lio_listio +// __pthread_cond_wait +// Iopolicysys +// __pthread_kill +// __pthread_sigmask +// __sigwait +// __disable_threadsignal +// __pthread_markcancel +// __pthread_canceled +// __semwait_signal +// Proc_info +// Stat64_extended +// Lstat64_extended +// Fstat64_extended +// __pthread_chdir +// __pthread_fchdir +// Audit +// Auditon +// Getauid +// Setauid +// Getaudit +// Setaudit +// Getaudit_addr +// Setaudit_addr +// Auditctl +// Bsdthread_create +// Bsdthread_terminate +// Stack_snapshot +// Bsdthread_register +// Workq_open +// Workq_ops +// __mac_execve +// __mac_syscall +// __mac_get_file +// __mac_set_file +// __mac_get_link +// __mac_set_link +// __mac_get_proc +// __mac_set_proc +// __mac_get_fd +// __mac_set_fd +// __mac_get_pid +// __mac_get_lcid +// __mac_get_lctx +// __mac_set_lctx +// Setlcid +// Read_nocancel +// Write_nocancel +// Open_nocancel +// Close_nocancel +// Wait4_nocancel +// Recvmsg_nocancel +// Sendmsg_nocancel +// Recvfrom_nocancel +// Accept_nocancel +// Fcntl_nocancel +// Select_nocancel +// Fsync_nocancel +// Connect_nocancel +// Sigsuspend_nocancel +// Readv_nocancel +// Writev_nocancel +// Sendto_nocancel +// Pread_nocancel +// Pwrite_nocancel +// Waitid_nocancel +// Poll_nocancel +// Msgsnd_nocancel +// Msgrcv_nocancel +// Sem_wait_nocancel +// Aio_suspend_nocancel +// __sigwait_nocancel +// __semwait_signal_nocancel +// __mac_mount +// __mac_get_mount +// __mac_getfsstat diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go new file mode 100644 index 0000000..6d8952d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go @@ -0,0 +1,59 @@ +// 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. + +// +build amd64,dragonfly + +package unix + +import ( + "syscall" + "unsafe" +) + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = nsec / 1e9 + ts.Nsec = nsec % 1e9 + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Usec = nsec % 1e9 / 1e3 + tv.Sec = int64(nsec / 1e9) + return +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint64(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var writtenOut uint64 = 0 + _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0, 0) + + written = int(writtenOut) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_freebsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_freebsd.go new file mode 100644 index 0000000..d26e52e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_freebsd.go @@ -0,0 +1,708 @@ +// Copyright 2009,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. + +// FreeBSD system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and wrap +// it in our own nicer implementation, either here or in +// syscall_bsd.go or syscall_unix.go. + +package unix + +import "unsafe" + +type SockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [46]int8 + raw RawSockaddrDatalink +} + +// Translate "kern.hostname" to []_C_int{0,1,2,3}. +func nametomib(name string) (mib []_C_int, err error) { + const siz = unsafe.Sizeof(mib[0]) + + // NOTE(rsc): It seems strange to set the buffer to have + // size CTL_MAXNAME+2 but use only CTL_MAXNAME + // as the size. I don't know why the +2 is here, but the + // kernel uses +2 for its own implementation of this function. + // I am scared that if we don't include the +2 here, the kernel + // will silently write 2 words farther than we specify + // and we'll get memory corruption. + var buf [CTL_MAXNAME + 2]_C_int + n := uintptr(CTL_MAXNAME) * siz + + p := (*byte)(unsafe.Pointer(&buf[0])) + bytes, err := ByteSliceFromString(name) + if err != nil { + return nil, err + } + + // Magic sysctl: "setting" 0.3 to a string name + // lets you read back the array of integers form. + if err = sysctl([]_C_int{0, 3}, p, &n, &bytes[0], uintptr(len(name))); err != nil { + return nil, err + } + return buf[0 : n/siz], nil +} + +func direntIno(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Fileno), unsafe.Sizeof(Dirent{}.Fileno)) +} + +func direntReclen(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen)) +} + +func direntNamlen(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen)) +} + +//sysnb pipe() (r int, w int, err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + p[0], p[1], err = pipe() + return +} + +func GetsockoptIPMreqn(fd, level, opt int) (*IPMreqn, error) { + var value IPMreqn + vallen := _Socklen(SizeofIPMreqn) + errno := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, errno +} + +func SetsockoptIPMreqn(fd, level, opt int, mreq *IPMreqn) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(mreq), unsafe.Sizeof(*mreq)) +} + +func Accept4(fd, flags int) (nfd int, sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + nfd, err = accept4(fd, &rsa, &len, flags) + if err != nil { + return + } + if len > SizeofSockaddrAny { + panic("RawSockaddrAny too small") + } + sa, err = anyToSockaddr(&rsa) + if err != nil { + Close(nfd) + nfd = 0 + } + return +} + +func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { + var _p0 unsafe.Pointer + var bufsize uintptr + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf)) + } + r0, _, e1 := Syscall(SYS_GETFSSTAT, uintptr(_p0), bufsize, uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +// Derive extattr namespace and attribute name + +func xattrnamespace(fullattr string) (ns int, attr string, err error) { + s := -1 + for idx, val := range fullattr { + if val == '.' { + s = idx + break + } + } + + if s == -1 { + return -1, "", ENOATTR + } + + namespace := fullattr[0:s] + attr = fullattr[s+1:] + + switch namespace { + case "user": + return EXTATTR_NAMESPACE_USER, attr, nil + case "system": + return EXTATTR_NAMESPACE_SYSTEM, attr, nil + default: + return -1, "", ENOATTR + } +} + +func initxattrdest(dest []byte, idx int) (d unsafe.Pointer) { + if len(dest) > idx { + return unsafe.Pointer(&dest[idx]) + } else { + return unsafe.Pointer(_zero) + } +} + +// FreeBSD implements its own syscalls to handle extended attributes + +func Getxattr(file string, attr string, dest []byte) (sz int, err error) { + d := initxattrdest(dest, 0) + destsize := len(dest) + + nsid, a, err := xattrnamespace(attr) + if err != nil { + return -1, err + } + + return ExtattrGetFile(file, nsid, a, uintptr(d), destsize) +} + +func Fgetxattr(fd int, attr string, dest []byte) (sz int, err error) { + d := initxattrdest(dest, 0) + destsize := len(dest) + + nsid, a, err := xattrnamespace(attr) + if err != nil { + return -1, err + } + + return ExtattrGetFd(fd, nsid, a, uintptr(d), destsize) +} + +func Lgetxattr(link string, attr string, dest []byte) (sz int, err error) { + d := initxattrdest(dest, 0) + destsize := len(dest) + + nsid, a, err := xattrnamespace(attr) + if err != nil { + return -1, err + } + + return ExtattrGetLink(link, nsid, a, uintptr(d), destsize) +} + +// flags are unused on FreeBSD + +func Fsetxattr(fd int, attr string, data []byte, flags int) (err error) { + d := unsafe.Pointer(&data[0]) + datasiz := len(data) + + nsid, a, err := xattrnamespace(attr) + if err != nil { + return + } + + _, err = ExtattrSetFd(fd, nsid, a, uintptr(d), datasiz) + return +} + +func Setxattr(file string, attr string, data []byte, flags int) (err error) { + d := unsafe.Pointer(&data[0]) + datasiz := len(data) + + nsid, a, err := xattrnamespace(attr) + if err != nil { + return + } + + _, err = ExtattrSetFile(file, nsid, a, uintptr(d), datasiz) + return +} + +func Lsetxattr(link string, attr string, data []byte, flags int) (err error) { + d := unsafe.Pointer(&data[0]) + datasiz := len(data) + + nsid, a, err := xattrnamespace(attr) + if err != nil { + return + } + + _, err = ExtattrSetLink(link, nsid, a, uintptr(d), datasiz) + return +} + +func Removexattr(file string, attr string) (err error) { + nsid, a, err := xattrnamespace(attr) + if err != nil { + return + } + + err = ExtattrDeleteFile(file, nsid, a) + return +} + +func Fremovexattr(fd int, attr string) (err error) { + nsid, a, err := xattrnamespace(attr) + if err != nil { + return + } + + err = ExtattrDeleteFd(fd, nsid, a) + return +} + +func Lremovexattr(link string, attr string) (err error) { + nsid, a, err := xattrnamespace(attr) + if err != nil { + return + } + + err = ExtattrDeleteLink(link, nsid, a) + return +} + +func Listxattr(file string, dest []byte) (sz int, err error) { + d := initxattrdest(dest, 0) + destsiz := len(dest) + + // FreeBSD won't allow you to list xattrs from multiple namespaces + s := 0 + var e error + for _, nsid := range [...]int{EXTATTR_NAMESPACE_USER, EXTATTR_NAMESPACE_SYSTEM} { + stmp, e := ExtattrListFile(file, nsid, uintptr(d), destsiz) + + /* Errors accessing system attrs are ignored so that + * we can implement the Linux-like behavior of omitting errors that + * we don't have read permissions on + * + * Linux will still error if we ask for user attributes on a file that + * we don't have read permissions on, so don't ignore those errors + */ + if e != nil && e == EPERM && nsid != EXTATTR_NAMESPACE_USER { + e = nil + continue + } else if e != nil { + return s, e + } + + s += stmp + destsiz -= s + if destsiz < 0 { + destsiz = 0 + } + d = initxattrdest(dest, s) + } + + return s, e +} + +func Flistxattr(fd int, dest []byte) (sz int, err error) { + d := initxattrdest(dest, 0) + destsiz := len(dest) + + s := 0 + var e error + for _, nsid := range [...]int{EXTATTR_NAMESPACE_USER, EXTATTR_NAMESPACE_SYSTEM} { + stmp, e := ExtattrListFd(fd, nsid, uintptr(d), destsiz) + if e != nil && e == EPERM && nsid != EXTATTR_NAMESPACE_USER { + e = nil + continue + } else if e != nil { + return s, e + } + + s += stmp + destsiz -= s + if destsiz < 0 { + destsiz = 0 + } + d = initxattrdest(dest, s) + } + + return s, e +} + +func Llistxattr(link string, dest []byte) (sz int, err error) { + d := initxattrdest(dest, 0) + destsiz := len(dest) + + s := 0 + var e error + for _, nsid := range [...]int{EXTATTR_NAMESPACE_USER, EXTATTR_NAMESPACE_SYSTEM} { + stmp, e := ExtattrListLink(link, nsid, uintptr(d), destsiz) + if e != nil && e == EPERM && nsid != EXTATTR_NAMESPACE_USER { + e = nil + continue + } else if e != nil { + return s, e + } + + s += stmp + destsiz -= s + if destsiz < 0 { + destsiz = 0 + } + d = initxattrdest(dest, s) + } + + return s, e +} + +//sys ioctl(fd int, req uint, arg uintptr) (err error) + +// ioctl itself should not be exposed directly, but additional get/set +// functions for specific types are permissible. + +// IoctlSetInt performs an ioctl operation which sets an integer value +// on fd, using the specified request number. +func IoctlSetInt(fd int, req uint, value int) error { + return ioctl(fd, req, uintptr(value)) +} + +func IoctlSetWinsize(fd int, req uint, value *Winsize) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlSetTermios(fd int, req uint, value *Termios) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +// IoctlGetInt performs an ioctl operation which gets an integer value +// from fd, using the specified request number. +func IoctlGetInt(fd int, req uint) (int, error) { + var value int + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return value, err +} + +func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { + var value Winsize + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermios(fd int, req uint) (*Termios, error) { + var value Termios + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +/* + * Exposed directly + */ +//sys Access(path string, mode uint32) (err error) +//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) +//sys CapEnter() (err error) +//sys capRightsGet(version int, fd int, rightsp *CapRights) (err error) = SYS___CAP_RIGHTS_GET +//sys capRightsLimit(fd int, rightsp *CapRights) (err error) +//sys Chdir(path string) (err error) +//sys Chflags(path string, flags int) (err error) +//sys Chmod(path string, mode uint32) (err error) +//sys Chown(path string, uid int, gid int) (err error) +//sys Chroot(path string) (err error) +//sys Close(fd int) (err error) +//sys Dup(fd int) (nfd int, err error) +//sys Dup2(from int, to int) (err error) +//sys Exit(code int) +//sys ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error) +//sys ExtattrListFd(fd int, attrnamespace int, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrGetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrSetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err error) +//sys ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrGetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrSetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err error) +//sys ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_POSIX_FADVISE +//sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fchdir(fd int) (err error) +//sys Fchflags(fd int, flags int) (err error) +//sys Fchmod(fd int, mode uint32) (err error) +//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) +//sys Flock(fd int, how int) (err error) +//sys Fpathconf(fd int, name int) (val int, err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatfs(fd int, stat *Statfs_t) (err error) +//sys Fsync(fd int) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sys Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) +//sys Getdtablesize() (size int) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (uid int) +//sysnb Getgid() (gid int) +//sysnb Getpgid(pid int) (pgid int, err error) +//sysnb Getpgrp() (pgrp int) +//sysnb Getpid() (pid int) +//sysnb Getppid() (ppid int) +//sys Getpriority(which int, who int) (prio int, err error) +//sysnb Getrlimit(which int, lim *Rlimit) (err error) +//sysnb Getrusage(who int, rusage *Rusage) (err error) +//sysnb Getsid(pid int) (sid int, err error) +//sysnb Gettimeofday(tv *Timeval) (err error) +//sysnb Getuid() (uid int) +//sys Issetugid() (tainted bool) +//sys Kill(pid int, signum syscall.Signal) (err error) +//sys Kqueue() (fd int, err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Link(path string, link string) (err error) +//sys Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) +//sys Listen(s int, backlog int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Mkdir(path string, mode uint32) (err error) +//sys Mkdirat(dirfd int, path string, mode uint32) (err error) +//sys Mkfifo(path string, mode uint32) (err error) +//sys Mknod(path string, mode uint32, dev int) (err error) +//sys Nanosleep(time *Timespec, leftover *Timespec) (err error) +//sys Open(path string, mode int, perm uint32) (fd int, err error) +//sys Openat(fdat int, path string, mode int, perm uint32) (fd int, err error) +//sys Pathconf(path string, name int) (val int, err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys read(fd int, p []byte) (n int, err error) +//sys Readlink(path string, buf []byte) (n int, err error) +//sys Readlinkat(dirfd int, path string, buf []byte) (n int, err error) +//sys Rename(from string, to string) (err error) +//sys Renameat(fromfd int, from string, tofd int, to string) (err error) +//sys Revoke(path string) (err error) +//sys Rmdir(path string) (err error) +//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK +//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) +//sysnb Setegid(egid int) (err error) +//sysnb Seteuid(euid int) (err error) +//sysnb Setgid(gid int) (err error) +//sys Setlogin(name string) (err error) +//sysnb Setpgid(pid int, pgid int) (err error) +//sys Setpriority(which int, who int, prio int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(which int, lim *Rlimit) (err error) +//sysnb Setsid() (pid int, err error) +//sysnb Settimeofday(tp *Timeval) (err error) +//sysnb Setuid(uid int) (err error) +//sys Stat(path string, stat *Stat_t) (err error) +//sys Statfs(path string, stat *Statfs_t) (err error) +//sys Symlink(path string, link string) (err error) +//sys Symlinkat(oldpath string, newdirfd int, newpath string) (err error) +//sys Sync() (err error) +//sys Truncate(path string, length int64) (err error) +//sys Umask(newmask int) (oldmask int) +//sys Undelete(path string) (err error) +//sys Unlink(path string) (err error) +//sys Unlinkat(dirfd int, path string, flags int) (err error) +//sys Unmount(path string, flags int) (err error) +//sys write(fd int, p []byte) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) +//sys munmap(addr uintptr, length uintptr) (err error) +//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ +//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE +//sys accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) +//sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) + +/* + * Unimplemented + */ +// Profil +// Sigaction +// Sigprocmask +// Getlogin +// Sigpending +// Sigaltstack +// Ioctl +// Reboot +// Execve +// Vfork +// Sbrk +// Sstk +// Ovadvise +// Mincore +// Setitimer +// Swapon +// Select +// Sigsuspend +// Readv +// Writev +// Nfssvc +// Getfh +// Quotactl +// Mount +// Csops +// Waitid +// Add_profil +// Kdebug_trace +// Sigreturn +// Atsocket +// Kqueue_from_portset_np +// Kqueue_portset +// Getattrlist +// Setattrlist +// Getdirentriesattr +// Searchfs +// Delete +// Copyfile +// Poll +// Watchevent +// Waitevent +// Modwatch +// Getxattr +// Fgetxattr +// Setxattr +// Fsetxattr +// Removexattr +// Fremovexattr +// Listxattr +// Flistxattr +// Fsctl +// Initgroups +// Posix_spawn +// Nfsclnt +// Fhopen +// Minherit +// Semsys +// Msgsys +// Shmsys +// Semctl +// Semget +// Semop +// Msgctl +// Msgget +// Msgsnd +// Msgrcv +// Shmat +// Shmctl +// Shmdt +// Shmget +// Shm_open +// Shm_unlink +// Sem_open +// Sem_close +// Sem_unlink +// Sem_wait +// Sem_trywait +// Sem_post +// Sem_getvalue +// Sem_init +// Sem_destroy +// Open_extended +// Umask_extended +// Stat_extended +// Lstat_extended +// Fstat_extended +// Chmod_extended +// Fchmod_extended +// Access_extended +// Settid +// Gettid +// Setsgroups +// Getsgroups +// Setwgroups +// Getwgroups +// Mkfifo_extended +// Mkdir_extended +// Identitysvc +// Shared_region_check_np +// Shared_region_map_np +// __pthread_mutex_destroy +// __pthread_mutex_init +// __pthread_mutex_lock +// __pthread_mutex_trylock +// __pthread_mutex_unlock +// __pthread_cond_init +// __pthread_cond_destroy +// __pthread_cond_broadcast +// __pthread_cond_signal +// Setsid_with_pid +// __pthread_cond_timedwait +// Aio_fsync +// Aio_return +// Aio_suspend +// Aio_cancel +// Aio_error +// Aio_read +// Aio_write +// Lio_listio +// __pthread_cond_wait +// Iopolicysys +// __pthread_kill +// __pthread_sigmask +// __sigwait +// __disable_threadsignal +// __pthread_markcancel +// __pthread_canceled +// __semwait_signal +// Proc_info +// Stat64_extended +// Lstat64_extended +// Fstat64_extended +// __pthread_chdir +// __pthread_fchdir +// Audit +// Auditon +// Getauid +// Setauid +// Getaudit +// Setaudit +// Getaudit_addr +// Setaudit_addr +// Auditctl +// Bsdthread_create +// Bsdthread_terminate +// Stack_snapshot +// Bsdthread_register +// Workq_open +// Workq_ops +// __mac_execve +// __mac_syscall +// __mac_get_file +// __mac_set_file +// __mac_get_link +// __mac_set_link +// __mac_get_proc +// __mac_set_proc +// __mac_get_fd +// __mac_set_fd +// __mac_get_pid +// __mac_get_lcid +// __mac_get_lctx +// __mac_set_lctx +// Setlcid +// Read_nocancel +// Write_nocancel +// Open_nocancel +// Close_nocancel +// Wait4_nocancel +// Recvmsg_nocancel +// Sendmsg_nocancel +// Recvfrom_nocancel +// Accept_nocancel +// Fcntl_nocancel +// Select_nocancel +// Fsync_nocancel +// Connect_nocancel +// Sigsuspend_nocancel +// Readv_nocancel +// Writev_nocancel +// Sendto_nocancel +// Pread_nocancel +// Pwrite_nocancel +// Waitid_nocancel +// Poll_nocancel +// Msgsnd_nocancel +// Msgrcv_nocancel +// Sem_wait_nocancel +// Aio_suspend_nocancel +// __sigwait_nocancel +// __semwait_signal_nocancel +// __mac_mount +// __mac_get_mount +// __mac_getfsstat diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go new file mode 100644 index 0000000..4cf5f45 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go @@ -0,0 +1,59 @@ +// 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. + +// +build 386,freebsd + +package unix + +import ( + "syscall" + "unsafe" +) + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = int32(nsec / 1e9) + ts.Nsec = int32(nsec % 1e9) + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Usec = int32(nsec % 1e9 / 1e3) + tv.Sec = int32(nsec / 1e9) + return +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var writtenOut uint64 = 0 + _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr((*offset)>>32), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0) + + written = int(writtenOut) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go new file mode 100644 index 0000000..b8036e7 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go @@ -0,0 +1,59 @@ +// 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. + +// +build amd64,freebsd + +package unix + +import ( + "syscall" + "unsafe" +) + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = nsec / 1e9 + ts.Nsec = nsec % 1e9 + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Usec = nsec % 1e9 / 1e3 + tv.Sec = int64(nsec / 1e9) + return +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint64(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var writtenOut uint64 = 0 + _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0, 0) + + written = int(writtenOut) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go new file mode 100644 index 0000000..5a3bb6a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go @@ -0,0 +1,59 @@ +// 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. + +// +build arm,freebsd + +package unix + +import ( + "syscall" + "unsafe" +) + +func TimespecToNsec(ts Timespec) int64 { return ts.Sec*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = nsec / 1e9 + ts.Nsec = int32(nsec % 1e9) + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Usec = int32(nsec % 1e9 / 1e3) + tv.Sec = nsec / 1e9 + return +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var writtenOut uint64 = 0 + _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr((*offset)>>32), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0) + + written = int(writtenOut) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_freebsd_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_freebsd_test.go new file mode 100644 index 0000000..654439e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_freebsd_test.go @@ -0,0 +1,297 @@ +// 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. + +// +build freebsd + +package unix_test + +import ( + "flag" + "fmt" + "io/ioutil" + "os" + "os/exec" + "path" + "path/filepath" + "runtime" + "testing" + + "golang.org/x/sys/unix" +) + +func TestSysctlUint64(t *testing.T) { + _, err := unix.SysctlUint64("vm.swap_total") + if err != nil { + t.Fatal(err) + } +} + +// FIXME: Infrastructure for launching tests in subprocesses stolen from openbsd_test.go - refactor? +// testCmd generates a proper command that, when executed, runs the test +// corresponding to the given key. + +type testProc struct { + fn func() // should always exit instead of returning + arg func(t *testing.T) string // generate argument for test + cleanup func(arg string) error // for instance, delete coredumps from testing pledge + success bool // whether zero-exit means success or failure +} + +var ( + testProcs = map[string]testProc{} + procName = "" + procArg = "" +) + +const ( + optName = "sys-unix-internal-procname" + optArg = "sys-unix-internal-arg" +) + +func init() { + flag.StringVar(&procName, optName, "", "internal use only") + flag.StringVar(&procArg, optArg, "", "internal use only") + +} + +func testCmd(procName string, procArg string) (*exec.Cmd, error) { + exe, err := filepath.Abs(os.Args[0]) + if err != nil { + return nil, err + } + cmd := exec.Command(exe, "-"+optName+"="+procName, "-"+optArg+"="+procArg) + cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr + return cmd, nil +} + +// ExitsCorrectly is a comprehensive, one-line-of-use wrapper for testing +// a testProc with a key. +func ExitsCorrectly(t *testing.T, procName string) { + s := testProcs[procName] + arg := "-" + if s.arg != nil { + arg = s.arg(t) + } + c, err := testCmd(procName, arg) + defer func(arg string) { + if err := s.cleanup(arg); err != nil { + t.Fatalf("Failed to run cleanup for %s %s %#v", procName, err, err) + } + }(arg) + if err != nil { + t.Fatalf("Failed to construct command for %s", procName) + } + if (c.Run() == nil) != s.success { + result := "succeed" + if !s.success { + result = "fail" + } + t.Fatalf("Process did not %s when it was supposed to", result) + } +} + +func TestMain(m *testing.M) { + flag.Parse() + if procName != "" { + t := testProcs[procName] + t.fn() + os.Stderr.WriteString("test function did not exit\n") + if t.success { + os.Exit(1) + } else { + os.Exit(0) + } + } + os.Exit(m.Run()) +} + +// end of infrastructure + +const testfile = "gocapmodetest" +const testfile2 = testfile + "2" + +func CapEnterTest() { + _, err := os.OpenFile(path.Join(procArg, testfile), os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666) + if err != nil { + panic(fmt.Sprintf("OpenFile: %s", err)) + } + + err = unix.CapEnter() + if err != nil { + panic(fmt.Sprintf("CapEnter: %s", err)) + } + + _, err = os.OpenFile(path.Join(procArg, testfile2), os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666) + if err == nil { + panic("OpenFile works!") + } + if err.(*os.PathError).Err != unix.ECAPMODE { + panic(fmt.Sprintf("OpenFile failed wrong: %s %#v", err, err)) + } + os.Exit(0) +} + +func makeTempDir(t *testing.T) string { + d, err := ioutil.TempDir("", "go_openat_test") + if err != nil { + t.Fatalf("TempDir failed: %s", err) + } + return d +} + +func removeTempDir(arg string) error { + err := os.RemoveAll(arg) + if err != nil && err.(*os.PathError).Err == unix.ENOENT { + return nil + } + return err +} + +func init() { + testProcs["cap_enter"] = testProc{ + CapEnterTest, + makeTempDir, + removeTempDir, + true, + } +} + +func TestCapEnter(t *testing.T) { + if runtime.GOARCH != "amd64" { + t.Skipf("skipping test on %s", runtime.GOARCH) + } + ExitsCorrectly(t, "cap_enter") +} + +func OpenatTest() { + f, err := os.Open(procArg) + if err != nil { + panic(err) + } + + err = unix.CapEnter() + if err != nil { + panic(fmt.Sprintf("CapEnter: %s", err)) + } + + fxx, err := unix.Openat(int(f.Fd()), "xx", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666) + if err != nil { + panic(err) + } + unix.Close(fxx) + + // The right to open BASE/xx is not ambient + _, err = os.OpenFile(procArg+"/xx", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666) + if err == nil { + panic("OpenFile succeeded") + } + if err.(*os.PathError).Err != unix.ECAPMODE { + panic(fmt.Sprintf("OpenFile failed wrong: %s %#v", err, err)) + } + + // Can't make a new directory either + err = os.Mkdir(procArg+"2", 0777) + if err == nil { + panic("MKdir succeeded") + } + if err.(*os.PathError).Err != unix.ECAPMODE { + panic(fmt.Sprintf("Mkdir failed wrong: %s %#v", err, err)) + } + + // Remove all caps except read and lookup. + r, err := unix.CapRightsInit([]uint64{unix.CAP_READ, unix.CAP_LOOKUP}) + if err != nil { + panic(fmt.Sprintf("CapRightsInit failed: %s %#v", err, err)) + } + err = unix.CapRightsLimit(f.Fd(), r) + if err != nil { + panic(fmt.Sprintf("CapRightsLimit failed: %s %#v", err, err)) + } + + // Check we can get the rights back again + r, err = unix.CapRightsGet(f.Fd()) + if err != nil { + panic(fmt.Sprintf("CapRightsGet failed: %s %#v", err, err)) + } + b, err := unix.CapRightsIsSet(r, []uint64{unix.CAP_READ, unix.CAP_LOOKUP}) + if err != nil { + panic(fmt.Sprintf("CapRightsIsSet failed: %s %#v", err, err)) + } + if !b { + panic(fmt.Sprintf("Unexpected rights")) + } + b, err = unix.CapRightsIsSet(r, []uint64{unix.CAP_READ, unix.CAP_LOOKUP, unix.CAP_WRITE}) + if err != nil { + panic(fmt.Sprintf("CapRightsIsSet failed: %s %#v", err, err)) + } + if b { + panic(fmt.Sprintf("Unexpected rights (2)")) + } + + // Can no longer create a file + _, err = unix.Openat(int(f.Fd()), "xx2", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666) + if err == nil { + panic("Openat succeeded") + } + if err != unix.ENOTCAPABLE { + panic(fmt.Sprintf("OpenFileAt failed wrong: %s %#v", err, err)) + } + + // But can read an existing one + _, err = unix.Openat(int(f.Fd()), "xx", os.O_RDONLY, 0666) + if err != nil { + panic(fmt.Sprintf("Openat failed: %s %#v", err, err)) + } + + os.Exit(0) +} + +func init() { + testProcs["openat"] = testProc{ + OpenatTest, + makeTempDir, + removeTempDir, + true, + } +} + +func TestOpenat(t *testing.T) { + if runtime.GOARCH != "amd64" { + t.Skipf("skipping test on %s", runtime.GOARCH) + } + ExitsCorrectly(t, "openat") +} + +func TestCapRightsSetAndClear(t *testing.T) { + r, err := unix.CapRightsInit([]uint64{unix.CAP_READ, unix.CAP_WRITE, unix.CAP_PDWAIT}) + if err != nil { + t.Fatalf("CapRightsInit failed: %s", err) + } + + err = unix.CapRightsSet(r, []uint64{unix.CAP_EVENT, unix.CAP_LISTEN}) + if err != nil { + t.Fatalf("CapRightsSet failed: %s", err) + } + + b, err := unix.CapRightsIsSet(r, []uint64{unix.CAP_READ, unix.CAP_WRITE, unix.CAP_PDWAIT, unix.CAP_EVENT, unix.CAP_LISTEN}) + if err != nil { + t.Fatalf("CapRightsIsSet failed: %s", err) + } + if !b { + t.Fatalf("Wrong rights set") + } + + err = unix.CapRightsClear(r, []uint64{unix.CAP_READ, unix.CAP_PDWAIT}) + if err != nil { + t.Fatalf("CapRightsClear failed: %s", err) + } + + b, err = unix.CapRightsIsSet(r, []uint64{unix.CAP_WRITE, unix.CAP_EVENT, unix.CAP_LISTEN}) + if err != nil { + t.Fatalf("CapRightsIsSet failed: %s", err) + } + if !b { + t.Fatalf("Wrong rights set") + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux.go new file mode 100644 index 0000000..1b7d59d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux.go @@ -0,0 +1,1469 @@ +// 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. + +// Linux system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and +// wrap it in our own nicer implementation. + +package unix + +import ( + "syscall" + "unsafe" +) + +/* + * Wrapped + */ + +func Access(path string, mode uint32) (err error) { + return Faccessat(AT_FDCWD, path, mode, 0) +} + +func Chmod(path string, mode uint32) (err error) { + return Fchmodat(AT_FDCWD, path, mode, 0) +} + +func Chown(path string, uid int, gid int) (err error) { + return Fchownat(AT_FDCWD, path, uid, gid, 0) +} + +func Creat(path string, mode uint32) (fd int, err error) { + return Open(path, O_CREAT|O_WRONLY|O_TRUNC, mode) +} + +//sys fchmodat(dirfd int, path string, mode uint32) (err error) + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + // Linux fchmodat doesn't support the flags parameter. Mimick glibc's behavior + // and check the flags. Otherwise the mode would be applied to the symlink + // destination which is not what the user expects. + if flags&^AT_SYMLINK_NOFOLLOW != 0 { + return EINVAL + } else if flags&AT_SYMLINK_NOFOLLOW != 0 { + return EOPNOTSUPP + } + return fchmodat(dirfd, path, mode) +} + +//sys ioctl(fd int, req uint, arg uintptr) (err error) + +// ioctl itself should not be exposed directly, but additional get/set +// functions for specific types are permissible. + +// IoctlSetInt performs an ioctl operation which sets an integer value +// on fd, using the specified request number. +func IoctlSetInt(fd int, req uint, value int) error { + return ioctl(fd, req, uintptr(value)) +} + +func IoctlSetWinsize(fd int, req uint, value *Winsize) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlSetTermios(fd int, req uint, value *Termios) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +// IoctlGetInt performs an ioctl operation which gets an integer value +// from fd, using the specified request number. +func IoctlGetInt(fd int, req uint) (int, error) { + var value int + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return value, err +} + +func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { + var value Winsize + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermios(fd int, req uint) (*Termios, error) { + var value Termios + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +//sys Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) + +func Link(oldpath string, newpath string) (err error) { + return Linkat(AT_FDCWD, oldpath, AT_FDCWD, newpath, 0) +} + +func Mkdir(path string, mode uint32) (err error) { + return Mkdirat(AT_FDCWD, path, mode) +} + +func Mknod(path string, mode uint32, dev int) (err error) { + return Mknodat(AT_FDCWD, path, mode, dev) +} + +func Open(path string, mode int, perm uint32) (fd int, err error) { + return openat(AT_FDCWD, path, mode|O_LARGEFILE, perm) +} + +//sys openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) + +func Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + return openat(dirfd, path, flags|O_LARGEFILE, mode) +} + +//sys ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) + +func Ppoll(fds []PollFd, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + if len(fds) == 0 { + return ppoll(nil, 0, timeout, sigmask) + } + return ppoll(&fds[0], len(fds), timeout, sigmask) +} + +//sys Readlinkat(dirfd int, path string, buf []byte) (n int, err error) + +func Readlink(path string, buf []byte) (n int, err error) { + return Readlinkat(AT_FDCWD, path, buf) +} + +func Rename(oldpath string, newpath string) (err error) { + return Renameat(AT_FDCWD, oldpath, AT_FDCWD, newpath) +} + +func Rmdir(path string) error { + return Unlinkat(AT_FDCWD, path, AT_REMOVEDIR) +} + +//sys Symlinkat(oldpath string, newdirfd int, newpath string) (err error) + +func Symlink(oldpath string, newpath string) (err error) { + return Symlinkat(oldpath, AT_FDCWD, newpath) +} + +func Unlink(path string) error { + return Unlinkat(AT_FDCWD, path, 0) +} + +//sys Unlinkat(dirfd int, path string, flags int) (err error) + +//sys utimes(path string, times *[2]Timeval) (err error) + +func Utimes(path string, tv []Timeval) error { + if tv == nil { + err := utimensat(AT_FDCWD, path, nil, 0) + if err != ENOSYS { + return err + } + return utimes(path, nil) + } + if len(tv) != 2 { + return EINVAL + } + var ts [2]Timespec + ts[0] = NsecToTimespec(TimevalToNsec(tv[0])) + ts[1] = NsecToTimespec(TimevalToNsec(tv[1])) + err := utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) + if err != ENOSYS { + return err + } + return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +//sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) + +func UtimesNano(path string, ts []Timespec) error { + if ts == nil { + err := utimensat(AT_FDCWD, path, nil, 0) + if err != ENOSYS { + return err + } + return utimes(path, nil) + } + if len(ts) != 2 { + return EINVAL + } + err := utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) + if err != ENOSYS { + return err + } + // If the utimensat syscall isn't available (utimensat was added to Linux + // in 2.6.22, Released, 8 July 2007) then fall back to utimes + var tv [2]Timeval + for i := 0; i < 2; i++ { + tv[i] = NsecToTimeval(TimespecToNsec(ts[i])) + } + return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +func UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) error { + if ts == nil { + return utimensat(dirfd, path, nil, flags) + } + if len(ts) != 2 { + return EINVAL + } + return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags) +} + +//sys futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) + +func Futimesat(dirfd int, path string, tv []Timeval) error { + pathp, err := BytePtrFromString(path) + if err != nil { + return err + } + if tv == nil { + return futimesat(dirfd, pathp, nil) + } + if len(tv) != 2 { + return EINVAL + } + return futimesat(dirfd, pathp, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +func Futimes(fd int, tv []Timeval) (err error) { + // Believe it or not, this is the best we can do on Linux + // (and is what glibc does). + return Utimes("/proc/self/fd/"+itoa(fd), tv) +} + +const ImplementsGetwd = true + +//sys Getcwd(buf []byte) (n int, err error) + +func Getwd() (wd string, err error) { + var buf [PathMax]byte + n, err := Getcwd(buf[0:]) + if err != nil { + return "", err + } + // Getcwd returns the number of bytes written to buf, including the NUL. + if n < 1 || n > len(buf) || buf[n-1] != 0 { + return "", EINVAL + } + return string(buf[0 : n-1]), nil +} + +func Getgroups() (gids []int, err error) { + n, err := getgroups(0, nil) + if err != nil { + return nil, err + } + if n == 0 { + return nil, nil + } + + // Sanity check group count. Max is 1<<16 on Linux. + if n < 0 || n > 1<<20 { + return nil, EINVAL + } + + a := make([]_Gid_t, n) + n, err = getgroups(n, &a[0]) + if err != nil { + return nil, err + } + gids = make([]int, n) + for i, v := range a[0:n] { + gids[i] = int(v) + } + return +} + +func Setgroups(gids []int) (err error) { + if len(gids) == 0 { + return setgroups(0, nil) + } + + a := make([]_Gid_t, len(gids)) + for i, v := range gids { + a[i] = _Gid_t(v) + } + return setgroups(len(a), &a[0]) +} + +type WaitStatus uint32 + +// Wait status is 7 bits at bottom, either 0 (exited), +// 0x7F (stopped), or a signal number that caused an exit. +// The 0x80 bit is whether there was a core dump. +// An extra number (exit code, signal causing a stop) +// is in the high bits. At least that's the idea. +// There are various irregularities. For example, the +// "continued" status is 0xFFFF, distinguishing itself +// from stopped via the core dump bit. + +const ( + mask = 0x7F + core = 0x80 + exited = 0x00 + stopped = 0x7F + shift = 8 +) + +func (w WaitStatus) Exited() bool { return w&mask == exited } + +func (w WaitStatus) Signaled() bool { return w&mask != stopped && w&mask != exited } + +func (w WaitStatus) Stopped() bool { return w&0xFF == stopped } + +func (w WaitStatus) Continued() bool { return w == 0xFFFF } + +func (w WaitStatus) CoreDump() bool { return w.Signaled() && w&core != 0 } + +func (w WaitStatus) ExitStatus() int { + if !w.Exited() { + return -1 + } + return int(w>>shift) & 0xFF +} + +func (w WaitStatus) Signal() syscall.Signal { + if !w.Signaled() { + return -1 + } + return syscall.Signal(w & mask) +} + +func (w WaitStatus) StopSignal() syscall.Signal { + if !w.Stopped() { + return -1 + } + return syscall.Signal(w>>shift) & 0xFF +} + +func (w WaitStatus) TrapCause() int { + if w.StopSignal() != SIGTRAP { + return -1 + } + return int(w>>shift) >> 8 +} + +//sys wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) + +func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) { + var status _C_int + wpid, err = wait4(pid, &status, options, rusage) + if wstatus != nil { + *wstatus = WaitStatus(status) + } + return +} + +func Mkfifo(path string, mode uint32) error { + return Mknod(path, mode|S_IFIFO, 0) +} + +func Mkfifoat(dirfd int, path string, mode uint32) error { + return Mknodat(dirfd, path, mode|S_IFIFO, 0) +} + +func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, EINVAL + } + sa.raw.Family = AF_INET + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), SizeofSockaddrInet4, nil +} + +func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, EINVAL + } + sa.raw.Family = AF_INET6 + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + sa.raw.Scope_id = sa.ZoneId + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), SizeofSockaddrInet6, nil +} + +func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) { + name := sa.Name + n := len(name) + if n >= len(sa.raw.Path) { + return nil, 0, EINVAL + } + sa.raw.Family = AF_UNIX + for i := 0; i < n; i++ { + sa.raw.Path[i] = int8(name[i]) + } + // length is family (uint16), name, NUL. + sl := _Socklen(2) + if n > 0 { + sl += _Socklen(n) + 1 + } + if sa.raw.Path[0] == '@' { + sa.raw.Path[0] = 0 + // Don't count trailing NUL for abstract address. + sl-- + } + + return unsafe.Pointer(&sa.raw), sl, nil +} + +type SockaddrLinklayer struct { + Protocol uint16 + Ifindex int + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]byte + raw RawSockaddrLinklayer +} + +func (sa *SockaddrLinklayer) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Ifindex < 0 || sa.Ifindex > 0x7fffffff { + return nil, 0, EINVAL + } + sa.raw.Family = AF_PACKET + sa.raw.Protocol = sa.Protocol + sa.raw.Ifindex = int32(sa.Ifindex) + sa.raw.Hatype = sa.Hatype + sa.raw.Pkttype = sa.Pkttype + sa.raw.Halen = sa.Halen + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), SizeofSockaddrLinklayer, nil +} + +type SockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 + raw RawSockaddrNetlink +} + +func (sa *SockaddrNetlink) sockaddr() (unsafe.Pointer, _Socklen, error) { + sa.raw.Family = AF_NETLINK + sa.raw.Pad = sa.Pad + sa.raw.Pid = sa.Pid + sa.raw.Groups = sa.Groups + return unsafe.Pointer(&sa.raw), SizeofSockaddrNetlink, nil +} + +type SockaddrHCI struct { + Dev uint16 + Channel uint16 + raw RawSockaddrHCI +} + +func (sa *SockaddrHCI) sockaddr() (unsafe.Pointer, _Socklen, error) { + sa.raw.Family = AF_BLUETOOTH + sa.raw.Dev = sa.Dev + sa.raw.Channel = sa.Channel + return unsafe.Pointer(&sa.raw), SizeofSockaddrHCI, nil +} + +// SockaddrCAN implements the Sockaddr interface for AF_CAN type sockets. +// The RxID and TxID fields are used for transport protocol addressing in +// (CAN_TP16, CAN_TP20, CAN_MCNET, and CAN_ISOTP), they can be left with +// zero values for CAN_RAW and CAN_BCM sockets as they have no meaning. +// +// The SockaddrCAN struct must be bound to the socket file descriptor +// using Bind before the CAN socket can be used. +// +// // Read one raw CAN frame +// fd, _ := Socket(AF_CAN, SOCK_RAW, CAN_RAW) +// addr := &SockaddrCAN{Ifindex: index} +// Bind(fd, addr) +// frame := make([]byte, 16) +// Read(fd, frame) +// +// The full SocketCAN documentation can be found in the linux kernel +// archives at: https://www.kernel.org/doc/Documentation/networking/can.txt +type SockaddrCAN struct { + Ifindex int + RxID uint32 + TxID uint32 + raw RawSockaddrCAN +} + +func (sa *SockaddrCAN) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Ifindex < 0 || sa.Ifindex > 0x7fffffff { + return nil, 0, EINVAL + } + sa.raw.Family = AF_CAN + sa.raw.Ifindex = int32(sa.Ifindex) + rx := (*[4]byte)(unsafe.Pointer(&sa.RxID)) + for i := 0; i < 4; i++ { + sa.raw.Addr[i] = rx[i] + } + tx := (*[4]byte)(unsafe.Pointer(&sa.TxID)) + for i := 0; i < 4; i++ { + sa.raw.Addr[i+4] = tx[i] + } + return unsafe.Pointer(&sa.raw), SizeofSockaddrCAN, nil +} + +// SockaddrALG implements the Sockaddr interface for AF_ALG type sockets. +// SockaddrALG enables userspace access to the Linux kernel's cryptography +// subsystem. The Type and Name fields specify which type of hash or cipher +// should be used with a given socket. +// +// To create a file descriptor that provides access to a hash or cipher, both +// Bind and Accept must be used. Once the setup process is complete, input +// data can be written to the socket, processed by the kernel, and then read +// back as hash output or ciphertext. +// +// Here is an example of using an AF_ALG socket with SHA1 hashing. +// The initial socket setup process is as follows: +// +// // Open a socket to perform SHA1 hashing. +// fd, _ := unix.Socket(unix.AF_ALG, unix.SOCK_SEQPACKET, 0) +// addr := &unix.SockaddrALG{Type: "hash", Name: "sha1"} +// unix.Bind(fd, addr) +// // Note: unix.Accept does not work at this time; must invoke accept() +// // manually using unix.Syscall. +// hashfd, _, _ := unix.Syscall(unix.SYS_ACCEPT, uintptr(fd), 0, 0) +// +// Once a file descriptor has been returned from Accept, it may be used to +// perform SHA1 hashing. The descriptor is not safe for concurrent use, but +// may be re-used repeatedly with subsequent Write and Read operations. +// +// When hashing a small byte slice or string, a single Write and Read may +// be used: +// +// // Assume hashfd is already configured using the setup process. +// hash := os.NewFile(hashfd, "sha1") +// // Hash an input string and read the results. Each Write discards +// // previous hash state. Read always reads the current state. +// b := make([]byte, 20) +// for i := 0; i < 2; i++ { +// io.WriteString(hash, "Hello, world.") +// hash.Read(b) +// fmt.Println(hex.EncodeToString(b)) +// } +// // Output: +// // 2ae01472317d1935a84797ec1983ae243fc6aa28 +// // 2ae01472317d1935a84797ec1983ae243fc6aa28 +// +// For hashing larger byte slices, or byte streams such as those read from +// a file or socket, use Sendto with MSG_MORE to instruct the kernel to update +// the hash digest instead of creating a new one for a given chunk and finalizing it. +// +// // Assume hashfd and addr are already configured using the setup process. +// hash := os.NewFile(hashfd, "sha1") +// // Hash the contents of a file. +// f, _ := os.Open("/tmp/linux-4.10-rc7.tar.xz") +// b := make([]byte, 4096) +// for { +// n, err := f.Read(b) +// if err == io.EOF { +// break +// } +// unix.Sendto(hashfd, b[:n], unix.MSG_MORE, addr) +// } +// hash.Read(b) +// fmt.Println(hex.EncodeToString(b)) +// // Output: 85cdcad0c06eef66f805ecce353bec9accbeecc5 +// +// For more information, see: http://www.chronox.de/crypto-API/crypto/userspace-if.html. +type SockaddrALG struct { + Type string + Name string + Feature uint32 + Mask uint32 + raw RawSockaddrALG +} + +func (sa *SockaddrALG) sockaddr() (unsafe.Pointer, _Socklen, error) { + // Leave room for NUL byte terminator. + if len(sa.Type) > 13 { + return nil, 0, EINVAL + } + if len(sa.Name) > 63 { + return nil, 0, EINVAL + } + + sa.raw.Family = AF_ALG + sa.raw.Feat = sa.Feature + sa.raw.Mask = sa.Mask + + typ, err := ByteSliceFromString(sa.Type) + if err != nil { + return nil, 0, err + } + name, err := ByteSliceFromString(sa.Name) + if err != nil { + return nil, 0, err + } + + copy(sa.raw.Type[:], typ) + copy(sa.raw.Name[:], name) + + return unsafe.Pointer(&sa.raw), SizeofSockaddrALG, nil +} + +// SockaddrVM implements the Sockaddr interface for AF_VSOCK type sockets. +// SockaddrVM provides access to Linux VM sockets: a mechanism that enables +// bidirectional communication between a hypervisor and its guest virtual +// machines. +type SockaddrVM struct { + // CID and Port specify a context ID and port address for a VM socket. + // Guests have a unique CID, and hosts may have a well-known CID of: + // - VMADDR_CID_HYPERVISOR: refers to the hypervisor process. + // - VMADDR_CID_HOST: refers to other processes on the host. + CID uint32 + Port uint32 + raw RawSockaddrVM +} + +func (sa *SockaddrVM) sockaddr() (unsafe.Pointer, _Socklen, error) { + sa.raw.Family = AF_VSOCK + sa.raw.Port = sa.Port + sa.raw.Cid = sa.CID + + return unsafe.Pointer(&sa.raw), SizeofSockaddrVM, nil +} + +func anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) { + switch rsa.Addr.Family { + case AF_NETLINK: + pp := (*RawSockaddrNetlink)(unsafe.Pointer(rsa)) + sa := new(SockaddrNetlink) + sa.Family = pp.Family + sa.Pad = pp.Pad + sa.Pid = pp.Pid + sa.Groups = pp.Groups + return sa, nil + + case AF_PACKET: + pp := (*RawSockaddrLinklayer)(unsafe.Pointer(rsa)) + sa := new(SockaddrLinklayer) + sa.Protocol = pp.Protocol + sa.Ifindex = int(pp.Ifindex) + sa.Hatype = pp.Hatype + sa.Pkttype = pp.Pkttype + sa.Halen = pp.Halen + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + + case AF_UNIX: + pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa)) + sa := new(SockaddrUnix) + if pp.Path[0] == 0 { + // "Abstract" Unix domain socket. + // Rewrite leading NUL as @ for textual display. + // (This is the standard convention.) + // Not friendly to overwrite in place, + // but the callers below don't care. + pp.Path[0] = '@' + } + + // Assume path ends at NUL. + // This is not technically the Linux semantics for + // abstract Unix domain sockets--they are supposed + // to be uninterpreted fixed-size binary blobs--but + // everyone uses this convention. + n := 0 + for n < len(pp.Path) && pp.Path[n] != 0 { + n++ + } + bytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n] + sa.Name = string(bytes) + return sa, nil + + case AF_INET: + pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet4) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + + case AF_INET6: + pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet6) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + sa.ZoneId = pp.Scope_id + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + + case AF_VSOCK: + pp := (*RawSockaddrVM)(unsafe.Pointer(rsa)) + sa := &SockaddrVM{ + CID: pp.Cid, + Port: pp.Port, + } + return sa, nil + } + return nil, EAFNOSUPPORT +} + +func Accept(fd int) (nfd int, sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + nfd, err = accept(fd, &rsa, &len) + if err != nil { + return + } + sa, err = anyToSockaddr(&rsa) + if err != nil { + Close(nfd) + nfd = 0 + } + return +} + +func Accept4(fd int, flags int) (nfd int, sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + nfd, err = accept4(fd, &rsa, &len, flags) + if err != nil { + return + } + if len > SizeofSockaddrAny { + panic("RawSockaddrAny too small") + } + sa, err = anyToSockaddr(&rsa) + if err != nil { + Close(nfd) + nfd = 0 + } + return +} + +func Getsockname(fd int) (sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + if err = getsockname(fd, &rsa, &len); err != nil { + return + } + return anyToSockaddr(&rsa) +} + +func GetsockoptInet4Addr(fd, level, opt int) (value [4]byte, err error) { + vallen := _Socklen(4) + err = getsockopt(fd, level, opt, unsafe.Pointer(&value[0]), &vallen) + return value, err +} + +func GetsockoptIPMreq(fd, level, opt int) (*IPMreq, error) { + var value IPMreq + vallen := _Socklen(SizeofIPMreq) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptIPMreqn(fd, level, opt int) (*IPMreqn, error) { + var value IPMreqn + vallen := _Socklen(SizeofIPMreqn) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptIPv6Mreq(fd, level, opt int) (*IPv6Mreq, error) { + var value IPv6Mreq + vallen := _Socklen(SizeofIPv6Mreq) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptIPv6MTUInfo(fd, level, opt int) (*IPv6MTUInfo, error) { + var value IPv6MTUInfo + vallen := _Socklen(SizeofIPv6MTUInfo) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptICMPv6Filter(fd, level, opt int) (*ICMPv6Filter, error) { + var value ICMPv6Filter + vallen := _Socklen(SizeofICMPv6Filter) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptUcred(fd, level, opt int) (*Ucred, error) { + var value Ucred + vallen := _Socklen(SizeofUcred) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptTCPInfo(fd, level, opt int) (*TCPInfo, error) { + var value TCPInfo + vallen := _Socklen(SizeofTCPInfo) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func SetsockoptIPMreqn(fd, level, opt int, mreq *IPMreqn) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(mreq), unsafe.Sizeof(*mreq)) +} + +// Keyctl Commands (http://man7.org/linux/man-pages/man2/keyctl.2.html) + +// KeyctlInt calls keyctl commands in which each argument is an int. +// These commands are KEYCTL_REVOKE, KEYCTL_CHOWN, KEYCTL_CLEAR, KEYCTL_LINK, +// KEYCTL_UNLINK, KEYCTL_NEGATE, KEYCTL_SET_REQKEY_KEYRING, KEYCTL_SET_TIMEOUT, +// KEYCTL_ASSUME_AUTHORITY, KEYCTL_SESSION_TO_PARENT, KEYCTL_REJECT, +// KEYCTL_INVALIDATE, and KEYCTL_GET_PERSISTENT. +//sys KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) = SYS_KEYCTL + +// KeyctlBuffer calls keyctl commands in which the third and fourth +// arguments are a buffer and its length, respectively. +// These commands are KEYCTL_UPDATE, KEYCTL_READ, and KEYCTL_INSTANTIATE. +//sys KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) = SYS_KEYCTL + +// KeyctlString calls keyctl commands which return a string. +// These commands are KEYCTL_DESCRIBE and KEYCTL_GET_SECURITY. +func KeyctlString(cmd int, id int) (string, error) { + // We must loop as the string data may change in between the syscalls. + // We could allocate a large buffer here to reduce the chance that the + // syscall needs to be called twice; however, this is unnecessary as + // the performance loss is negligible. + var buffer []byte + for { + // Try to fill the buffer with data + length, err := KeyctlBuffer(cmd, id, buffer, 0) + if err != nil { + return "", err + } + + // Check if the data was written + if length <= len(buffer) { + // Exclude the null terminator + return string(buffer[:length-1]), nil + } + + // Make a bigger buffer if needed + buffer = make([]byte, length) + } +} + +// Keyctl commands with special signatures. + +// KeyctlGetKeyringID implements the KEYCTL_GET_KEYRING_ID command. +// See the full documentation at: +// http://man7.org/linux/man-pages/man3/keyctl_get_keyring_ID.3.html +func KeyctlGetKeyringID(id int, create bool) (ringid int, err error) { + createInt := 0 + if create { + createInt = 1 + } + return KeyctlInt(KEYCTL_GET_KEYRING_ID, id, createInt, 0, 0) +} + +// KeyctlSetperm implements the KEYCTL_SETPERM command. The perm value is the +// key handle permission mask as described in the "keyctl setperm" section of +// http://man7.org/linux/man-pages/man1/keyctl.1.html. +// See the full documentation at: +// http://man7.org/linux/man-pages/man3/keyctl_setperm.3.html +func KeyctlSetperm(id int, perm uint32) error { + _, err := KeyctlInt(KEYCTL_SETPERM, id, int(perm), 0, 0) + return err +} + +//sys keyctlJoin(cmd int, arg2 string) (ret int, err error) = SYS_KEYCTL + +// KeyctlJoinSessionKeyring implements the KEYCTL_JOIN_SESSION_KEYRING command. +// See the full documentation at: +// http://man7.org/linux/man-pages/man3/keyctl_join_session_keyring.3.html +func KeyctlJoinSessionKeyring(name string) (ringid int, err error) { + return keyctlJoin(KEYCTL_JOIN_SESSION_KEYRING, name) +} + +//sys keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) = SYS_KEYCTL + +// KeyctlSearch implements the KEYCTL_SEARCH command. +// See the full documentation at: +// http://man7.org/linux/man-pages/man3/keyctl_search.3.html +func KeyctlSearch(ringid int, keyType, description string, destRingid int) (id int, err error) { + return keyctlSearch(KEYCTL_SEARCH, ringid, keyType, description, destRingid) +} + +//sys keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) = SYS_KEYCTL + +// KeyctlInstantiateIOV implements the KEYCTL_INSTANTIATE_IOV command. This +// command is similar to KEYCTL_INSTANTIATE, except that the payload is a slice +// of Iovec (each of which represents a buffer) instead of a single buffer. +// See the full documentation at: +// http://man7.org/linux/man-pages/man3/keyctl_instantiate_iov.3.html +func KeyctlInstantiateIOV(id int, payload []Iovec, ringid int) error { + return keyctlIOV(KEYCTL_INSTANTIATE_IOV, id, payload, ringid) +} + +//sys keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) = SYS_KEYCTL + +// KeyctlDHCompute implements the KEYCTL_DH_COMPUTE command. This command +// computes a Diffie-Hellman shared secret based on the provide params. The +// secret is written to the provided buffer and the returned size is the number +// of bytes written (returning an error if there is insufficient space in the +// buffer). If a nil buffer is passed in, this function returns the minimum +// buffer length needed to store the appropriate data. Note that this differs +// from KEYCTL_READ's behavior which always returns the requested payload size. +// See the full documentation at: +// http://man7.org/linux/man-pages/man3/keyctl_dh_compute.3.html +func KeyctlDHCompute(params *KeyctlDHParams, buffer []byte) (size int, err error) { + return keyctlDH(KEYCTL_DH_COMPUTE, params, buffer) +} + +func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { + var msg Msghdr + var rsa RawSockaddrAny + msg.Name = (*byte)(unsafe.Pointer(&rsa)) + msg.Namelen = uint32(SizeofSockaddrAny) + var iov Iovec + if len(p) > 0 { + iov.Base = (*byte)(unsafe.Pointer(&p[0])) + iov.SetLen(len(p)) + } + var dummy byte + if len(oob) > 0 { + var sockType int + sockType, err = GetsockoptInt(fd, SOL_SOCKET, SO_TYPE) + if err != nil { + return + } + // receive at least one normal byte + if sockType != SOCK_DGRAM && len(p) == 0 { + iov.Base = &dummy + iov.SetLen(1) + } + msg.Control = (*byte)(unsafe.Pointer(&oob[0])) + msg.SetControllen(len(oob)) + } + msg.Iov = &iov + msg.Iovlen = 1 + if n, err = recvmsg(fd, &msg, flags); err != nil { + return + } + oobn = int(msg.Controllen) + recvflags = int(msg.Flags) + // source address is only specified if the socket is unconnected + if rsa.Addr.Family != AF_UNSPEC { + from, err = anyToSockaddr(&rsa) + } + return +} + +func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { + _, err = SendmsgN(fd, p, oob, to, flags) + return +} + +func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { + var ptr unsafe.Pointer + var salen _Socklen + if to != nil { + var err error + ptr, salen, err = to.sockaddr() + if err != nil { + return 0, err + } + } + var msg Msghdr + msg.Name = (*byte)(unsafe.Pointer(ptr)) + msg.Namelen = uint32(salen) + var iov Iovec + if len(p) > 0 { + iov.Base = (*byte)(unsafe.Pointer(&p[0])) + iov.SetLen(len(p)) + } + var dummy byte + if len(oob) > 0 { + var sockType int + sockType, err = GetsockoptInt(fd, SOL_SOCKET, SO_TYPE) + if err != nil { + return 0, err + } + // send at least one normal byte + if sockType != SOCK_DGRAM && len(p) == 0 { + iov.Base = &dummy + iov.SetLen(1) + } + msg.Control = (*byte)(unsafe.Pointer(&oob[0])) + msg.SetControllen(len(oob)) + } + msg.Iov = &iov + msg.Iovlen = 1 + if n, err = sendmsg(fd, &msg, flags); err != nil { + return 0, err + } + if len(oob) > 0 && len(p) == 0 { + n = 0 + } + return n, nil +} + +// BindToDevice binds the socket associated with fd to device. +func BindToDevice(fd int, device string) (err error) { + return SetsockoptString(fd, SOL_SOCKET, SO_BINDTODEVICE, device) +} + +//sys ptrace(request int, pid int, addr uintptr, data uintptr) (err error) + +func ptracePeek(req int, pid int, addr uintptr, out []byte) (count int, err error) { + // The peek requests are machine-size oriented, so we wrap it + // to retrieve arbitrary-length data. + + // The ptrace syscall differs from glibc's ptrace. + // Peeks returns the word in *data, not as the return value. + + var buf [sizeofPtr]byte + + // Leading edge. PEEKTEXT/PEEKDATA don't require aligned + // access (PEEKUSER warns that it might), but if we don't + // align our reads, we might straddle an unmapped page + // boundary and not get the bytes leading up to the page + // boundary. + n := 0 + if addr%sizeofPtr != 0 { + err = ptrace(req, pid, addr-addr%sizeofPtr, uintptr(unsafe.Pointer(&buf[0]))) + if err != nil { + return 0, err + } + n += copy(out, buf[addr%sizeofPtr:]) + out = out[n:] + } + + // Remainder. + for len(out) > 0 { + // We use an internal buffer to guarantee alignment. + // It's not documented if this is necessary, but we're paranoid. + err = ptrace(req, pid, addr+uintptr(n), uintptr(unsafe.Pointer(&buf[0]))) + if err != nil { + return n, err + } + copied := copy(out, buf[0:]) + n += copied + out = out[copied:] + } + + return n, nil +} + +func PtracePeekText(pid int, addr uintptr, out []byte) (count int, err error) { + return ptracePeek(PTRACE_PEEKTEXT, pid, addr, out) +} + +func PtracePeekData(pid int, addr uintptr, out []byte) (count int, err error) { + return ptracePeek(PTRACE_PEEKDATA, pid, addr, out) +} + +func PtracePeekUser(pid int, addr uintptr, out []byte) (count int, err error) { + return ptracePeek(PTRACE_PEEKUSR, pid, addr, out) +} + +func ptracePoke(pokeReq int, peekReq int, pid int, addr uintptr, data []byte) (count int, err error) { + // As for ptracePeek, we need to align our accesses to deal + // with the possibility of straddling an invalid page. + + // Leading edge. + n := 0 + if addr%sizeofPtr != 0 { + var buf [sizeofPtr]byte + err = ptrace(peekReq, pid, addr-addr%sizeofPtr, uintptr(unsafe.Pointer(&buf[0]))) + if err != nil { + return 0, err + } + n += copy(buf[addr%sizeofPtr:], data) + word := *((*uintptr)(unsafe.Pointer(&buf[0]))) + err = ptrace(pokeReq, pid, addr-addr%sizeofPtr, word) + if err != nil { + return 0, err + } + data = data[n:] + } + + // Interior. + for len(data) > sizeofPtr { + word := *((*uintptr)(unsafe.Pointer(&data[0]))) + err = ptrace(pokeReq, pid, addr+uintptr(n), word) + if err != nil { + return n, err + } + n += sizeofPtr + data = data[sizeofPtr:] + } + + // Trailing edge. + if len(data) > 0 { + var buf [sizeofPtr]byte + err = ptrace(peekReq, pid, addr+uintptr(n), uintptr(unsafe.Pointer(&buf[0]))) + if err != nil { + return n, err + } + copy(buf[0:], data) + word := *((*uintptr)(unsafe.Pointer(&buf[0]))) + err = ptrace(pokeReq, pid, addr+uintptr(n), word) + if err != nil { + return n, err + } + n += len(data) + } + + return n, nil +} + +func PtracePokeText(pid int, addr uintptr, data []byte) (count int, err error) { + return ptracePoke(PTRACE_POKETEXT, PTRACE_PEEKTEXT, pid, addr, data) +} + +func PtracePokeData(pid int, addr uintptr, data []byte) (count int, err error) { + return ptracePoke(PTRACE_POKEDATA, PTRACE_PEEKDATA, pid, addr, data) +} + +func PtraceGetRegs(pid int, regsout *PtraceRegs) (err error) { + return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) +} + +func PtraceSetRegs(pid int, regs *PtraceRegs) (err error) { + return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) +} + +func PtraceSetOptions(pid int, options int) (err error) { + return ptrace(PTRACE_SETOPTIONS, pid, 0, uintptr(options)) +} + +func PtraceGetEventMsg(pid int) (msg uint, err error) { + var data _C_long + err = ptrace(PTRACE_GETEVENTMSG, pid, 0, uintptr(unsafe.Pointer(&data))) + msg = uint(data) + return +} + +func PtraceCont(pid int, signal int) (err error) { + return ptrace(PTRACE_CONT, pid, 0, uintptr(signal)) +} + +func PtraceSyscall(pid int, signal int) (err error) { + return ptrace(PTRACE_SYSCALL, pid, 0, uintptr(signal)) +} + +func PtraceSingleStep(pid int) (err error) { return ptrace(PTRACE_SINGLESTEP, pid, 0, 0) } + +func PtraceAttach(pid int) (err error) { return ptrace(PTRACE_ATTACH, pid, 0, 0) } + +func PtraceDetach(pid int) (err error) { return ptrace(PTRACE_DETACH, pid, 0, 0) } + +//sys reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) + +func Reboot(cmd int) (err error) { + return reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, cmd, "") +} + +func ReadDirent(fd int, buf []byte) (n int, err error) { + return Getdents(fd, buf) +} + +func direntIno(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino)) +} + +func direntReclen(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen)) +} + +func direntNamlen(buf []byte) (uint64, bool) { + reclen, ok := direntReclen(buf) + if !ok { + return 0, false + } + return reclen - uint64(unsafe.Offsetof(Dirent{}.Name)), true +} + +//sys mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) + +func Mount(source string, target string, fstype string, flags uintptr, data string) (err error) { + // Certain file systems get rather angry and EINVAL if you give + // them an empty string of data, rather than NULL. + if data == "" { + return mount(source, target, fstype, flags, nil) + } + datap, err := BytePtrFromString(data) + if err != nil { + return err + } + return mount(source, target, fstype, flags, datap) +} + +// Sendto +// Recvfrom +// Socketpair + +/* + * Direct access + */ +//sys Acct(path string) (err error) +//sys AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) +//sys Adjtimex(buf *Timex) (state int, err error) +//sys Chdir(path string) (err error) +//sys Chroot(path string) (err error) +//sys ClockGettime(clockid int32, time *Timespec) (err error) +//sys Close(fd int) (err error) +//sys CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) +//sys Dup(oldfd int) (fd int, err error) +//sys Dup3(oldfd int, newfd int, flags int) (err error) +//sysnb EpollCreate(size int) (fd int, err error) +//sysnb EpollCreate1(flag int) (fd int, err error) +//sysnb EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) +//sys Eventfd(initval uint, flags int) (fd int, err error) = SYS_EVENTFD2 +//sys Exit(code int) = SYS_EXIT_GROUP +//sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fallocate(fd int, mode uint32, off int64, len int64) (err error) +//sys Fchdir(fd int) (err error) +//sys Fchmod(fd int, mode uint32) (err error) +//sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) +//sys fcntl(fd int, cmd int, arg int) (val int, err error) +//sys Fdatasync(fd int) (err error) +//sys Flock(fd int, how int) (err error) +//sys Fsync(fd int) (err error) +//sys Getdents(fd int, buf []byte) (n int, err error) = SYS_GETDENTS64 +//sysnb Getpgid(pid int) (pgid int, err error) + +func Getpgrp() (pid int) { + pid, _ = Getpgid(0) + return +} + +//sysnb Getpid() (pid int) +//sysnb Getppid() (ppid int) +//sys Getpriority(which int, who int) (prio int, err error) +//sys Getrandom(buf []byte, flags int) (n int, err error) +//sysnb Getrusage(who int, rusage *Rusage) (err error) +//sysnb Getsid(pid int) (sid int, err error) +//sysnb Gettid() (tid int) +//sys Getxattr(path string, attr string, dest []byte) (sz int, err error) +//sys InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) +//sysnb InotifyInit1(flags int) (fd int, err error) +//sysnb InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) +//sysnb Kill(pid int, sig syscall.Signal) (err error) +//sys Klogctl(typ int, buf []byte) (n int, err error) = SYS_SYSLOG +//sys Lgetxattr(path string, attr string, dest []byte) (sz int, err error) +//sys Listxattr(path string, dest []byte) (sz int, err error) +//sys Llistxattr(path string, dest []byte) (sz int, err error) +//sys Lremovexattr(path string, attr string) (err error) +//sys Lsetxattr(path string, attr string, data []byte, flags int) (err error) +//sys Mkdirat(dirfd int, path string, mode uint32) (err error) +//sys Mknodat(dirfd int, path string, mode uint32, dev int) (err error) +//sys Nanosleep(time *Timespec, leftover *Timespec) (err error) +//sys PivotRoot(newroot string, putold string) (err error) = SYS_PIVOT_ROOT +//sysnb prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) = SYS_PRLIMIT64 +//sys Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) +//sys read(fd int, p []byte) (n int, err error) +//sys Removexattr(path string, attr string) (err error) +//sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) +//sys RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) +//sys Setdomainname(p []byte) (err error) +//sys Sethostname(p []byte) (err error) +//sysnb Setpgid(pid int, pgid int) (err error) +//sysnb Setsid() (pid int, err error) +//sysnb Settimeofday(tv *Timeval) (err error) +//sys Setns(fd int, nstype int) (err error) + +// issue 1435. +// On linux Setuid and Setgid only affects the current thread, not the process. +// This does not match what most callers expect so we must return an error +// here rather than letting the caller think that the call succeeded. + +func Setuid(uid int) (err error) { + return EOPNOTSUPP +} + +func Setgid(uid int) (err error) { + return EOPNOTSUPP +} + +//sys Setpriority(which int, who int, prio int) (err error) +//sys Setxattr(path string, attr string, data []byte, flags int) (err error) +//sys Sync() +//sys Syncfs(fd int) (err error) +//sysnb Sysinfo(info *Sysinfo_t) (err error) +//sys Tee(rfd int, wfd int, len int, flags int) (n int64, err error) +//sysnb Tgkill(tgid int, tid int, sig syscall.Signal) (err error) +//sysnb Times(tms *Tms) (ticks uintptr, err error) +//sysnb Umask(mask int) (oldmask int) +//sysnb Uname(buf *Utsname) (err error) +//sys Unmount(target string, flags int) (err error) = SYS_UMOUNT2 +//sys Unshare(flags int) (err error) +//sys Ustat(dev int, ubuf *Ustat_t) (err error) +//sys write(fd int, p []byte) (n int, err error) +//sys exitThread(code int) (err error) = SYS_EXIT +//sys readlen(fd int, p *byte, np int) (n int, err error) = SYS_READ +//sys writelen(fd int, p *byte, np int) (n int, err error) = SYS_WRITE + +// mmap varies by architecture; see syscall_linux_*.go. +//sys munmap(addr uintptr, length uintptr) (err error) + +var mapper = &mmapper{ + active: make(map[*byte][]byte), + mmap: mmap, + munmap: munmap, +} + +func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { + return mapper.Mmap(fd, offset, length, prot, flags) +} + +func Munmap(b []byte) (err error) { + return mapper.Munmap(b) +} + +//sys Madvise(b []byte, advice int) (err error) +//sys Mprotect(b []byte, prot int) (err error) +//sys Mlock(b []byte) (err error) +//sys Mlockall(flags int) (err error) +//sys Msync(b []byte, flags int) (err error) +//sys Munlock(b []byte) (err error) +//sys Munlockall() (err error) + +// Vmsplice splices user pages from a slice of Iovecs into a pipe specified by fd, +// using the specified flags. +func Vmsplice(fd int, iovs []Iovec, flags int) (int, error) { + n, _, errno := Syscall6( + SYS_VMSPLICE, + uintptr(fd), + uintptr(unsafe.Pointer(&iovs[0])), + uintptr(len(iovs)), + uintptr(flags), + 0, + 0, + ) + if errno != 0 { + return 0, syscall.Errno(errno) + } + + return int(n), nil +} + +/* + * Unimplemented + */ +// AfsSyscall +// Alarm +// ArchPrctl +// Brk +// Capget +// Capset +// ClockGetres +// ClockNanosleep +// ClockSettime +// Clone +// CreateModule +// DeleteModule +// EpollCtlOld +// EpollPwait +// EpollWaitOld +// Execve +// Fgetxattr +// Flistxattr +// Fork +// Fremovexattr +// Fsetxattr +// Futex +// GetKernelSyms +// GetMempolicy +// GetRobustList +// GetThreadArea +// Getitimer +// Getpmsg +// IoCancel +// IoDestroy +// IoGetevents +// IoSetup +// IoSubmit +// IoprioGet +// IoprioSet +// KexecLoad +// LookupDcookie +// Mbind +// MigratePages +// Mincore +// ModifyLdt +// Mount +// MovePages +// MqGetsetattr +// MqNotify +// MqOpen +// MqTimedreceive +// MqTimedsend +// MqUnlink +// Mremap +// Msgctl +// Msgget +// Msgrcv +// Msgsnd +// Newfstatat +// Nfsservctl +// Personality +// Pselect6 +// Ptrace +// Putpmsg +// QueryModule +// Quotactl +// Readahead +// Readv +// RemapFilePages +// RestartSyscall +// RtSigaction +// RtSigpending +// RtSigprocmask +// RtSigqueueinfo +// RtSigreturn +// RtSigsuspend +// RtSigtimedwait +// SchedGetPriorityMax +// SchedGetPriorityMin +// SchedGetaffinity +// SchedGetparam +// SchedGetscheduler +// SchedRrGetInterval +// SchedSetaffinity +// SchedSetparam +// SchedYield +// Security +// Semctl +// Semget +// Semop +// Semtimedop +// SetMempolicy +// SetRobustList +// SetThreadArea +// SetTidAddress +// Shmat +// Shmctl +// Shmdt +// Shmget +// Sigaltstack +// Signalfd +// Swapoff +// Swapon +// Sysfs +// TimerCreate +// TimerDelete +// TimerGetoverrun +// TimerGettime +// TimerSettime +// Timerfd +// Tkill (obsolete) +// Tuxcall +// Umount2 +// Uselib +// Utimensat +// Vfork +// Vhangup +// Vserver +// Waitid +// _Sysctl diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_386.go new file mode 100644 index 0000000..f4c826a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_386.go @@ -0,0 +1,397 @@ +// 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. + +// TODO(rsc): Rewrite all nn(SP) references into name+(nn-8)(FP) +// so that go vet can check that they are correct. + +// +build 386,linux + +package unix + +import ( + "syscall" + "unsafe" +) + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = int32(nsec / 1e9) + ts.Nsec = int32(nsec % 1e9) + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Sec = int32(nsec / 1e9) + tv.Usec = int32(nsec % 1e9 / 1e3) + return +} + +//sysnb pipe(p *[2]_C_int) (err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe(&pp) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +// 64-bit file system and 32-bit uid calls +// (386 default is 32-bit file system and 16-bit uid). +//sys Dup2(oldfd int, newfd int) (err error) +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64_64 +//sys Fchown(fd int, uid int, gid int) (err error) = SYS_FCHOWN32 +//sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64 +//sys Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64 +//sysnb Getegid() (egid int) = SYS_GETEGID32 +//sysnb Geteuid() (euid int) = SYS_GETEUID32 +//sysnb Getgid() (gid int) = SYS_GETGID32 +//sysnb Getuid() (uid int) = SYS_GETUID32 +//sysnb InotifyInit() (fd int, err error) +//sys Ioperm(from int, num int, on int) (err error) +//sys Iopl(level int) (err error) +//sys Lchown(path string, uid int, gid int) (err error) = SYS_LCHOWN32 +//sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64 +//sys Setfsgid(gid int) (err error) = SYS_SETFSGID32 +//sys Setfsuid(uid int) (err error) = SYS_SETFSUID32 +//sysnb Setregid(rgid int, egid int) (err error) = SYS_SETREGID32 +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) = SYS_SETRESGID32 +//sysnb Setresuid(ruid int, euid int, suid int) (err error) = SYS_SETRESUID32 +//sysnb Setreuid(ruid int, euid int) (err error) = SYS_SETREUID32 +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) +//sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64 +//sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) +//sys Truncate(path string, length int64) (err error) = SYS_TRUNCATE64 +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) = SYS_GETGROUPS32 +//sysnb setgroups(n int, list *_Gid_t) (err error) = SYS_SETGROUPS32 +//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT + +//sys mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) +//sys Pause() (err error) + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + page := uintptr(offset / 4096) + if offset != int64(page)*4096 { + return 0, EINVAL + } + return mmap2(addr, length, prot, flags, fd, page) +} + +type rlimit32 struct { + Cur uint32 + Max uint32 +} + +//sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_GETRLIMIT + +const rlimInf32 = ^uint32(0) +const rlimInf64 = ^uint64(0) + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + err = prlimit(0, resource, nil, rlim) + if err != ENOSYS { + return err + } + + rl := rlimit32{} + err = getrlimit(resource, &rl) + if err != nil { + return + } + + if rl.Cur == rlimInf32 { + rlim.Cur = rlimInf64 + } else { + rlim.Cur = uint64(rl.Cur) + } + + if rl.Max == rlimInf32 { + rlim.Max = rlimInf64 + } else { + rlim.Max = uint64(rl.Max) + } + return +} + +//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + err = prlimit(0, resource, rlim, nil) + if err != ENOSYS { + return err + } + + rl := rlimit32{} + if rlim.Cur == rlimInf64 { + rl.Cur = rlimInf32 + } else if rlim.Cur < uint64(rlimInf32) { + rl.Cur = uint32(rlim.Cur) + } else { + return EINVAL + } + if rlim.Max == rlimInf64 { + rl.Max = rlimInf32 + } else if rlim.Max < uint64(rlimInf32) { + rl.Max = uint32(rlim.Max) + } else { + return EINVAL + } + + return setrlimit(resource, &rl) +} + +// Underlying system call writes to newoffset via pointer. +// Implemented in assembly to avoid allocation. +func seek(fd int, offset int64, whence int) (newoffset int64, err syscall.Errno) + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + newoffset, errno := seek(fd, offset, whence) + if errno != 0 { + return 0, errno + } + return newoffset, nil +} + +// Vsyscalls on amd64. +//sysnb Gettimeofday(tv *Timeval) (err error) +//sysnb Time(t *Time_t) (tt Time_t, err error) + +//sys Utime(path string, buf *Utimbuf) (err error) + +// On x86 Linux, all the socket calls go through an extra indirection, +// I think because the 5-register system call interface can't handle +// the 6-argument calls like sendto and recvfrom. Instead the +// arguments to the underlying system call are the number below +// and a pointer to an array of uintptr. We hide the pointer in the +// socketcall assembly to avoid allocation on every system call. + +const ( + // see linux/net.h + _SOCKET = 1 + _BIND = 2 + _CONNECT = 3 + _LISTEN = 4 + _ACCEPT = 5 + _GETSOCKNAME = 6 + _GETPEERNAME = 7 + _SOCKETPAIR = 8 + _SEND = 9 + _RECV = 10 + _SENDTO = 11 + _RECVFROM = 12 + _SHUTDOWN = 13 + _SETSOCKOPT = 14 + _GETSOCKOPT = 15 + _SENDMSG = 16 + _RECVMSG = 17 + _ACCEPT4 = 18 + _RECVMMSG = 19 + _SENDMMSG = 20 +) + +func socketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (n int, err syscall.Errno) +func rawsocketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (n int, err syscall.Errno) + +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 { + err = e + } + return +} + +func getsockname(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, e := rawsocketcall(_GETSOCKNAME, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func getpeername(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, e := rawsocketcall(_GETPEERNAME, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func socketpair(domain int, typ int, flags int, fd *[2]int32) (err error) { + _, e := rawsocketcall(_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(flags), uintptr(unsafe.Pointer(fd)), 0, 0) + if e != 0 { + err = e + } + return +} + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, e := socketcall(_BIND, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, e := socketcall(_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func socket(domain int, typ int, proto int) (fd int, err error) { + fd, e := rawsocketcall(_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto), 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, e := socketcall(_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e != 0 { + err = e + } + return +} + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, e := socketcall(_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), vallen, 0) + if e != 0 { + err = e + } + return +} + +func recvfrom(s int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var base uintptr + if len(p) > 0 { + base = uintptr(unsafe.Pointer(&p[0])) + } + n, e := socketcall(_RECVFROM, uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + if e != 0 { + err = e + } + return +} + +func sendto(s int, p []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var base uintptr + if len(p) > 0 { + base = uintptr(unsafe.Pointer(&p[0])) + } + _, e := socketcall(_SENDTO, uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e != 0 { + err = e + } + return +} + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + n, e := socketcall(_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + n, e := socketcall(_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func Listen(s int, n int) (err error) { + _, e := socketcall(_LISTEN, uintptr(s), uintptr(n), 0, 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func Shutdown(s, how int) (err error) { + _, e := socketcall(_SHUTDOWN, uintptr(s), uintptr(how), 0, 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e := Syscall(SYS_FSTATFS64, uintptr(fd), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) + if e != 0 { + err = e + } + return +} + +func Statfs(path string, buf *Statfs_t) (err error) { + pathp, err := BytePtrFromString(path) + if err != nil { + return err + } + _, _, e := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(pathp)), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) + if e != 0 { + err = e + } + return +} + +func (r *PtraceRegs) PC() uint64 { return uint64(uint32(r.Eip)) } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Eip = int32(pc) } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go new file mode 100644 index 0000000..0715200 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go @@ -0,0 +1,150 @@ +// 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. + +// +build amd64,linux + +package unix + +//sys Dup2(oldfd int, newfd int) (err error) +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatfs(fd int, buf *Statfs_t) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (euid int) +//sysnb Getgid() (gid int) +//sysnb Getrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Getuid() (uid int) +//sysnb InotifyInit() (fd int, err error) +//sys Ioperm(from int, num int, on int) (err error) +//sys Iopl(level int) (err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Listen(s int, n int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Pause() (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK +//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) +//sys Setfsgid(gid int) (err error) +//sys Setfsuid(uid int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sys Shutdown(fd int, how int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) +//sys Stat(path string, stat *Stat_t) (err error) +//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) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) +//sysnb setgroups(n int, list *_Gid_t) (err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) + +func Gettimeofday(tv *Timeval) (err error) { + errno := gettimeofday(tv) + if errno != 0 { + return errno + } + return nil +} + +func Time(t *Time_t) (tt Time_t, err error) { + var tv Timeval + errno := gettimeofday(&tv) + if errno != 0 { + return 0, errno + } + if t != nil { + *t = Time_t(tv.Sec) + } + return Time_t(tv.Sec), nil +} + +//sys Utime(path string, buf *Utimbuf) (err error) + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = nsec / 1e9 + ts.Nsec = nsec % 1e9 + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Sec = nsec / 1e9 + tv.Usec = nsec % 1e9 / 1e3 + return +} + +//sysnb pipe(p *[2]_C_int) (err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe(&pp) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +func (r *PtraceRegs) PC() uint64 { return r.Rip } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Rip = pc } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint64(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint64(length) +} + +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go new file mode 100644 index 0000000..21a4946 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go @@ -0,0 +1,13 @@ +// 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. + +// +build amd64,linux +// +build !gccgo + +package unix + +import "syscall" + +//go:noescape +func gettimeofday(tv *Timeval) (err syscall.Errno) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_arm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_arm.go new file mode 100644 index 0000000..2b79c84 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_arm.go @@ -0,0 +1,261 @@ +// 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. + +// +build arm,linux + +package unix + +import ( + "syscall" + "unsafe" +) + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = int32(nsec / 1e9) + ts.Nsec = int32(nsec % 1e9) + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Sec = int32(nsec / 1e9) + tv.Usec = int32(nsec % 1e9 / 1e3) + return +} + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, 0) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +// Underlying system call writes to newoffset via pointer. +// Implemented in assembly to avoid allocation. +func seek(fd int, offset int64, whence int) (newoffset int64, err syscall.Errno) + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + newoffset, errno := seek(fd, offset, whence) + if errno != 0 { + return 0, errno + } + 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) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) = SYS_GETGROUPS32 +//sysnb setgroups(n int, list *_Gid_t) (err error) = SYS_SETGROUPS32 +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sysnb socketpair(domain int, typ int, flags int, fd *[2]int32) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) + +// 64-bit file system and 32-bit uid calls +// (16-bit uid calls are not always supported in newer kernels) +//sys Dup2(oldfd int, newfd int) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) = SYS_FCHOWN32 +//sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64 +//sysnb Getegid() (egid int) = SYS_GETEGID32 +//sysnb Geteuid() (euid int) = SYS_GETEUID32 +//sysnb Getgid() (gid int) = SYS_GETGID32 +//sysnb Getuid() (uid int) = SYS_GETUID32 +//sysnb InotifyInit() (fd int, err error) +//sys Lchown(path string, uid int, gid int) (err error) = SYS_LCHOWN32 +//sys Listen(s int, n int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64 +//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT +//sys Setfsgid(gid int) (err error) = SYS_SETFSGID32 +//sys Setfsuid(uid int) (err error) = SYS_SETFSUID32 +//sysnb Setregid(rgid int, egid int) (err error) = SYS_SETREGID32 +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) = SYS_SETRESGID32 +//sysnb Setresuid(ruid int, euid int, suid int) (err error) = SYS_SETRESUID32 +//sysnb Setreuid(ruid int, euid int) (err error) = SYS_SETREUID32 +//sys Shutdown(fd int, how int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) +//sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64 + +// Vsyscalls on amd64. +//sysnb Gettimeofday(tv *Timeval) (err error) +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) +//sys Pause() (err error) + +func Time(t *Time_t) (Time_t, error) { + var tv Timeval + err := Gettimeofday(&tv) + if err != nil { + return 0, err + } + if t != nil { + *t = Time_t(tv.Sec) + } + return Time_t(tv.Sec), nil +} + +func Utime(path string, buf *Utimbuf) error { + tv := []Timeval{ + {Sec: buf.Actime}, + {Sec: buf.Modtime}, + } + return Utimes(path, tv) +} + +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Truncate(path string, length int64) (err error) = SYS_TRUNCATE64 +//sys Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64 + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_ARM_FADVISE64_64, uintptr(fd), uintptr(advice), uintptr(offset), uintptr(offset>>32), uintptr(length), uintptr(length>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +//sys mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e := Syscall(SYS_FSTATFS64, uintptr(fd), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) + if e != 0 { + err = e + } + return +} + +func Statfs(path string, buf *Statfs_t) (err error) { + pathp, err := BytePtrFromString(path) + if err != nil { + return err + } + _, _, e := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(pathp)), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) + if e != 0 { + err = e + } + return +} + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + page := uintptr(offset / 4096) + if offset != int64(page)*4096 { + return 0, EINVAL + } + return mmap2(addr, length, prot, flags, fd, page) +} + +type rlimit32 struct { + Cur uint32 + Max uint32 +} + +//sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_UGETRLIMIT + +const rlimInf32 = ^uint32(0) +const rlimInf64 = ^uint64(0) + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + err = prlimit(0, resource, nil, rlim) + if err != ENOSYS { + return err + } + + rl := rlimit32{} + err = getrlimit(resource, &rl) + if err != nil { + return + } + + if rl.Cur == rlimInf32 { + rlim.Cur = rlimInf64 + } else { + rlim.Cur = uint64(rl.Cur) + } + + if rl.Max == rlimInf32 { + rlim.Max = rlimInf64 + } else { + rlim.Max = uint64(rl.Max) + } + return +} + +//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + err = prlimit(0, resource, rlim, nil) + if err != ENOSYS { + return err + } + + rl := rlimit32{} + if rlim.Cur == rlimInf64 { + rl.Cur = rlimInf32 + } else if rlim.Cur < uint64(rlimInf32) { + rl.Cur = uint32(rlim.Cur) + } else { + return EINVAL + } + if rlim.Max == rlimInf64 { + rl.Max = rlimInf32 + } else if rlim.Max < uint64(rlimInf32) { + rl.Max = uint32(rlim.Max) + } else { + return EINVAL + } + + return setrlimit(resource, &rl) +} + +func (r *PtraceRegs) PC() uint64 { return uint64(r.Uregs[15]) } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Uregs[15] = uint32(pc) } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go new file mode 100644 index 0000000..68cc975 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go @@ -0,0 +1,188 @@ +// Copyright 2015 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 arm64,linux + +package unix + +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) = SYS_EPOLL_PWAIT +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) +//sys Fstatfs(fd int, buf *Statfs_t) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (euid int) +//sysnb Getgid() (gid int) +//sysnb Getrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Getuid() (uid int) +//sys Listen(s int, n int) (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK +//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS_PSELECT6 +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) +//sys Setfsgid(gid int) (err error) +//sys Setfsuid(uid int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sys Shutdown(fd int, how int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) + +func Stat(path string, stat *Stat_t) (err error) { + return Fstatat(AT_FDCWD, path, stat, 0) +} + +func Lchown(path string, uid int, gid int) (err error) { + return Fchownat(AT_FDCWD, path, uid, gid, AT_SYMLINK_NOFOLLOW) +} + +func Lstat(path string, stat *Stat_t) (err error) { + return Fstatat(AT_FDCWD, path, stat, AT_SYMLINK_NOFOLLOW) +} + +//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) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) +//sysnb setgroups(n int, list *_Gid_t) (err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) + +//sysnb Gettimeofday(tv *Timeval) (err error) + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = nsec / 1e9 + ts.Nsec = nsec % 1e9 + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Sec = nsec / 1e9 + tv.Usec = nsec % 1e9 / 1e3 + return +} + +func Time(t *Time_t) (Time_t, error) { + var tv Timeval + err := Gettimeofday(&tv) + if err != nil { + return 0, err + } + if t != nil { + *t = Time_t(tv.Sec) + } + return Time_t(tv.Sec), nil +} + +func Utime(path string, buf *Utimbuf) error { + tv := []Timeval{ + {Sec: buf.Actime}, + {Sec: buf.Modtime}, + } + return Utimes(path, tv) +} + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, 0) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +func (r *PtraceRegs) PC() uint64 { return r.Pc } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Pc = pc } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint64(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint64(length) +} + +func InotifyInit() (fd int, err error) { + return InotifyInit1(0) +} + +func Dup2(oldfd int, newfd int) (err error) { + return Dup3(oldfd, newfd, 0) +} + +func Pause() (err error) { + _, _, e1 := Syscall6(SYS_PPOLL, 0, 0, 0, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// TODO(dfc): constants that should be in zsysnum_linux_arm64.go, remove +// these when the deprecated syscalls that the syscall package relies on +// are removed. +const ( + SYS_GETPGRP = 1060 + SYS_UTIMES = 1037 + SYS_FUTIMESAT = 1066 + SYS_PAUSE = 1061 + SYS_USTAT = 1070 + SYS_UTIME = 1063 + SYS_LCHOWN = 1032 + SYS_TIME = 1062 + SYS_EPOLL_CREATE = 1042 + SYS_EPOLL_WAIT = 1069 +) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + var ts *Timespec + if timeout >= 0 { + ts = new(Timespec) + *ts = NsecToTimespec(int64(timeout) * 1e6) + } + if len(fds) == 0 { + return ppoll(nil, 0, ts, nil) + } + return ppoll(&fds[0], len(fds), ts, nil) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go new file mode 100644 index 0000000..977df44 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go @@ -0,0 +1,207 @@ +// Copyright 2015 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 linux +// +build mips64 mips64le + +package unix + +//sys Dup2(oldfd int, newfd int) (err error) +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fstatfs(fd int, buf *Statfs_t) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (euid int) +//sysnb Getgid() (gid int) +//sysnb Getrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Getuid() (uid int) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Listen(s int, n int) (err error) +//sys Pause() (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK +//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS_PSELECT6 +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) +//sys Setfsgid(gid int) (err error) +//sys Setfsuid(uid int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sys Shutdown(fd int, how int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) +//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) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) +//sysnb setgroups(n int, list *_Gid_t) (err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) + +//sysnb Gettimeofday(tv *Timeval) (err error) + +func Time(t *Time_t) (tt Time_t, err error) { + var tv Timeval + err = Gettimeofday(&tv) + if err != nil { + return 0, err + } + if t != nil { + *t = Time_t(tv.Sec) + } + return Time_t(tv.Sec), nil +} + +//sys Utime(path string, buf *Utimbuf) (err error) + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = nsec / 1e9 + ts.Nsec = nsec % 1e9 + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Sec = nsec / 1e9 + tv.Usec = nsec % 1e9 / 1e3 + return +} + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, 0) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +func Ioperm(from int, num int, on int) (err error) { + return ENOSYS +} + +func Iopl(level int) (err error) { + return ENOSYS +} + +type stat_t struct { + Dev uint32 + Pad0 [3]int32 + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint32 + Pad1 [3]uint32 + Size int64 + Atime uint32 + Atime_nsec uint32 + Mtime uint32 + Mtime_nsec uint32 + Ctime uint32 + Ctime_nsec uint32 + Blksize uint32 + Pad2 uint32 + Blocks int64 +} + +//sys fstat(fd int, st *stat_t) (err error) +//sys lstat(path string, st *stat_t) (err error) +//sys stat(path string, st *stat_t) (err error) + +func Fstat(fd int, s *Stat_t) (err error) { + st := &stat_t{} + err = fstat(fd, st) + fillStat_t(s, st) + return +} + +func Lstat(path string, s *Stat_t) (err error) { + st := &stat_t{} + err = lstat(path, st) + fillStat_t(s, st) + return +} + +func Stat(path string, s *Stat_t) (err error) { + st := &stat_t{} + err = stat(path, st) + fillStat_t(s, st) + return +} + +func fillStat_t(s *Stat_t, st *stat_t) { + s.Dev = st.Dev + s.Ino = st.Ino + s.Mode = st.Mode + s.Nlink = st.Nlink + s.Uid = st.Uid + s.Gid = st.Gid + s.Rdev = st.Rdev + s.Size = st.Size + s.Atim = Timespec{int64(st.Atime), int64(st.Atime_nsec)} + s.Mtim = Timespec{int64(st.Mtime), int64(st.Mtime_nsec)} + s.Ctim = Timespec{int64(st.Ctime), int64(st.Ctime_nsec)} + s.Blksize = st.Blksize + s.Blocks = st.Blocks +} + +func (r *PtraceRegs) PC() uint64 { return r.Epc } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Epc = pc } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint64(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint64(length) +} + +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go new file mode 100644 index 0000000..25a5a0d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go @@ -0,0 +1,237 @@ +// 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. + +// +build linux +// +build mips mipsle + +package unix + +import ( + "syscall" + "unsafe" +) + +func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) + +//sys Dup2(oldfd int, newfd int) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64 +//sysnb Getegid() (egid int) +//sysnb Geteuid() (euid int) +//sysnb Getgid() (gid int) +//sysnb Getuid() (uid int) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Listen(s int, n int) (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64 +//sys Setfsgid(gid int) (err error) +//sys Setfsuid(uid int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) + +//sysnb Setreuid(ruid int, euid int) (err error) +//sys Shutdown(fd int, how int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) + +//sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) +//sys Truncate(path string, length int64) (err error) = SYS_TRUNCATE64 +//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) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) +//sysnb setgroups(n int, list *_Gid_t) (err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) + +//sysnb InotifyInit() (fd int, err error) +//sys Ioperm(from int, num int, on int) (err error) +//sys Iopl(level int) (err error) + +//sysnb Gettimeofday(tv *Timeval) (err error) +//sysnb Time(t *Time_t) (tt Time_t, err error) + +//sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 +//sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64 +//sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64 + +//sys Utime(path string, buf *Utimbuf) (err error) +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) +//sys Pause() (err error) + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e := Syscall(SYS_FSTATFS64, uintptr(fd), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) + if e != 0 { + err = errnoErr(e) + } + return +} + +func Statfs(path string, buf *Statfs_t) (err error) { + p, err := BytePtrFromString(path) + if err != nil { + return err + } + _, _, e := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(p)), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) + if e != 0 { + err = errnoErr(e) + } + return +} + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + _, _, e := Syscall6(SYS__LLSEEK, uintptr(fd), uintptr(offset>>32), uintptr(offset), uintptr(unsafe.Pointer(&off)), uintptr(whence), 0) + if e != 0 { + err = errnoErr(e) + } + return +} + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = int32(nsec / 1e9) + ts.Nsec = int32(nsec % 1e9) + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Sec = int32(nsec / 1e9) + tv.Usec = int32(nsec % 1e9 / 1e3) + return +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, 0) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sys mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + page := uintptr(offset / 4096) + if offset != int64(page)*4096 { + return 0, EINVAL + } + return mmap2(addr, length, prot, flags, fd, page) +} + +const rlimInf32 = ^uint32(0) +const rlimInf64 = ^uint64(0) + +type rlimit32 struct { + Cur uint32 + Max uint32 +} + +//sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_GETRLIMIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + err = prlimit(0, resource, nil, rlim) + if err != ENOSYS { + return err + } + + rl := rlimit32{} + err = getrlimit(resource, &rl) + if err != nil { + return + } + + if rl.Cur == rlimInf32 { + rlim.Cur = rlimInf64 + } else { + rlim.Cur = uint64(rl.Cur) + } + + if rl.Max == rlimInf32 { + rlim.Max = rlimInf64 + } else { + rlim.Max = uint64(rl.Max) + } + return +} + +//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + err = prlimit(0, resource, rlim, nil) + if err != ENOSYS { + return err + } + + rl := rlimit32{} + if rlim.Cur == rlimInf64 { + rl.Cur = rlimInf32 + } else if rlim.Cur < uint64(rlimInf32) { + rl.Cur = uint32(rlim.Cur) + } else { + return EINVAL + } + if rlim.Max == rlimInf64 { + rl.Max = rlimInf32 + } else if rlim.Max < uint64(rlimInf32) { + rl.Max = uint32(rlim.Max) + } else { + return EINVAL + } + + return setrlimit(resource, &rl) +} + +func (r *PtraceRegs) PC() uint64 { return r.Epc } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Epc = pc } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go new file mode 100644 index 0000000..a4a8e4e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go @@ -0,0 +1,133 @@ +// 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. + +// +build linux +// +build ppc64 ppc64le + +package unix + +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) +//sys Dup2(oldfd int, newfd int) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatfs(fd int, buf *Statfs_t) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (euid int) +//sysnb Getgid() (gid int) +//sysnb Getrlimit(resource int, rlim *Rlimit) (err error) = SYS_UGETRLIMIT +//sysnb Getuid() (uid int) +//sysnb InotifyInit() (fd int, err error) +//sys Ioperm(from int, num int, on int) (err error) +//sys Iopl(level int) (err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Listen(s int, n int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Pause() (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK +//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) +//sys Setfsgid(gid int) (err error) +//sys Setfsuid(uid int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sys Shutdown(fd int, how int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) +//sys Stat(path string, stat *Stat_t) (err error) +//sys Statfs(path string, buf *Statfs_t) (err error) +//sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) = SYS_SYNC_FILE_RANGE2 +//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) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) +//sysnb setgroups(n int, list *_Gid_t) (err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) + +//sysnb Gettimeofday(tv *Timeval) (err error) +//sysnb Time(t *Time_t) (tt Time_t, err error) + +//sys Utime(path string, buf *Utimbuf) (err error) + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = nsec / 1e9 + ts.Nsec = nsec % 1e9 + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Sec = nsec / 1e9 + tv.Usec = nsec % 1e9 / 1e3 + return +} + +func (r *PtraceRegs) PC() uint64 { return r.Nip } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Nip = pc } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint64(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint64(length) +} + +//sysnb pipe(p *[2]_C_int) (err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe(&pp) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go new file mode 100644 index 0000000..3845fc9 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go @@ -0,0 +1,326 @@ +// 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. + +// +build s390x,linux + +package unix + +import ( + "unsafe" +) + +//sys Dup2(oldfd int, newfd int) (err error) +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatfs(fd int, buf *Statfs_t) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (euid int) +//sysnb Getgid() (gid int) +//sysnb Getrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Getuid() (uid int) +//sysnb InotifyInit() (fd int, err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Pause() (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK +//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) +//sys Setfsgid(gid int) (err error) +//sys Setfsuid(uid int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) +//sys Stat(path string, stat *Stat_t) (err error) +//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) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) +//sysnb setgroups(n int, list *_Gid_t) (err error) + +//sysnb Gettimeofday(tv *Timeval) (err error) + +func Time(t *Time_t) (tt Time_t, err error) { + var tv Timeval + err = Gettimeofday(&tv) + if err != nil { + return 0, err + } + if t != nil { + *t = Time_t(tv.Sec) + } + return Time_t(tv.Sec), nil +} + +//sys Utime(path string, buf *Utimbuf) (err error) + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = nsec / 1e9 + ts.Nsec = nsec % 1e9 + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Sec = nsec / 1e9 + tv.Usec = nsec % 1e9 / 1e3 + return +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, 0) // pipe2 is the same as pipe when flags are set to 0. + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +func Ioperm(from int, num int, on int) (err error) { + return ENOSYS +} + +func Iopl(level int) (err error) { + return ENOSYS +} + +func (r *PtraceRegs) PC() uint64 { return r.Psw.Addr } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Psw.Addr = pc } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint64(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint64(length) +} + +// Linux on s390x uses the old mmap interface, which requires arguments to be passed in a struct. +// mmap2 also requires arguments to be passed in a struct; it is currently not exposed in . +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + mmap_args := [6]uintptr{addr, length, uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)} + r0, _, e1 := Syscall(SYS_MMAP, uintptr(unsafe.Pointer(&mmap_args[0])), 0, 0) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// On s390x Linux, all the socket calls go through an extra indirection. +// The arguments to the underlying system call (SYS_SOCKETCALL) are the +// number below and a pointer to an array of uintptr. +const ( + // see linux/net.h + netSocket = 1 + netBind = 2 + netConnect = 3 + netListen = 4 + netAccept = 5 + netGetSockName = 6 + netGetPeerName = 7 + netSocketPair = 8 + netSend = 9 + netRecv = 10 + netSendTo = 11 + netRecvFrom = 12 + netShutdown = 13 + netSetSockOpt = 14 + netGetSockOpt = 15 + netSendMsg = 16 + netRecvMsg = 17 + netAccept4 = 18 + netRecvMMsg = 19 + 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) + if err != 0 { + return 0, err + } + return int(fd), nil +} + +func getsockname(s int, rsa *RawSockaddrAny, addrlen *_Socklen) error { + args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))} + _, _, err := RawSyscall(SYS_SOCKETCALL, netGetSockName, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func getpeername(s int, rsa *RawSockaddrAny, addrlen *_Socklen) error { + args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))} + _, _, err := RawSyscall(SYS_SOCKETCALL, netGetPeerName, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func socketpair(domain int, typ int, flags int, fd *[2]int32) error { + args := [4]uintptr{uintptr(domain), uintptr(typ), uintptr(flags), uintptr(unsafe.Pointer(fd))} + _, _, err := RawSyscall(SYS_SOCKETCALL, netSocketPair, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) error { + args := [3]uintptr{uintptr(s), uintptr(addr), uintptr(addrlen)} + _, _, err := Syscall(SYS_SOCKETCALL, netBind, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) error { + args := [3]uintptr{uintptr(s), uintptr(addr), uintptr(addrlen)} + _, _, err := Syscall(SYS_SOCKETCALL, netConnect, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func socket(domain int, typ int, proto int) (int, error) { + args := [3]uintptr{uintptr(domain), uintptr(typ), uintptr(proto)} + fd, _, err := RawSyscall(SYS_SOCKETCALL, netSocket, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return 0, err + } + return int(fd), nil +} + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) error { + args := [5]uintptr{uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen))} + _, _, err := Syscall(SYS_SOCKETCALL, netGetSockOpt, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) error { + args := [4]uintptr{uintptr(s), uintptr(level), uintptr(name), uintptr(val)} + _, _, err := Syscall(SYS_SOCKETCALL, netSetSockOpt, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func recvfrom(s int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (int, error) { + var base uintptr + if len(p) > 0 { + base = uintptr(unsafe.Pointer(&p[0])) + } + args := [6]uintptr{uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))} + n, _, err := Syscall(SYS_SOCKETCALL, netRecvFrom, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return 0, err + } + return int(n), nil +} + +func sendto(s int, p []byte, flags int, to unsafe.Pointer, addrlen _Socklen) error { + var base uintptr + if len(p) > 0 { + base = uintptr(unsafe.Pointer(&p[0])) + } + args := [6]uintptr{uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(to), uintptr(addrlen)} + _, _, err := Syscall(SYS_SOCKETCALL, netSendTo, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func recvmsg(s int, msg *Msghdr, flags int) (int, error) { + args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)} + n, _, err := Syscall(SYS_SOCKETCALL, netRecvMsg, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return 0, err + } + return int(n), nil +} + +func sendmsg(s int, msg *Msghdr, flags int) (int, error) { + args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)} + n, _, err := Syscall(SYS_SOCKETCALL, netSendMsg, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return 0, err + } + return int(n), nil +} + +func Listen(s int, n int) error { + args := [2]uintptr{uintptr(s), uintptr(n)} + _, _, err := Syscall(SYS_SOCKETCALL, netListen, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func Shutdown(s, how int) error { + args := [2]uintptr{uintptr(s), uintptr(how)} + _, _, err := Syscall(SYS_SOCKETCALL, netShutdown, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go new file mode 100644 index 0000000..bd9de3e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go @@ -0,0 +1,149 @@ +// 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. + +// +build sparc64,linux + +package unix + +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) +//sys Dup2(oldfd int, newfd int) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatfs(fd int, buf *Statfs_t) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (euid int) +//sysnb Getgid() (gid int) +//sysnb Getrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Getuid() (uid int) +//sysnb InotifyInit() (fd int, err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Listen(s int, n int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Pause() (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK +//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) +//sys Setfsgid(gid int) (err error) +//sys Setfsuid(uid int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sys Shutdown(fd int, how int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) +//sys Stat(path string, stat *Stat_t) (err error) +//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) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) +//sysnb setgroups(n int, list *_Gid_t) (err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) + +func Ioperm(from int, num int, on int) (err error) { + return ENOSYS +} + +func Iopl(level int) (err error) { + return ENOSYS +} + +//sysnb Gettimeofday(tv *Timeval) (err error) + +func Time(t *Time_t) (tt Time_t, err error) { + var tv Timeval + err = Gettimeofday(&tv) + if err != nil { + return 0, err + } + if t != nil { + *t = Time_t(tv.Sec) + } + return Time_t(tv.Sec), nil +} + +//sys Utime(path string, buf *Utimbuf) (err error) + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = nsec / 1e9 + ts.Nsec = nsec % 1e9 + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Sec = nsec / 1e9 + tv.Usec = int32(nsec % 1e9 / 1e3) + return +} + +func (r *PtraceRegs) PC() uint64 { return r.Tpc } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Tpc = pc } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint64(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint64(length) +} + +//sysnb pipe(p *[2]_C_int) (err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe(&pp) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_test.go new file mode 100644 index 0000000..c0ab2db --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_linux_test.go @@ -0,0 +1,234 @@ +// 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. + +// +build linux + +package unix_test + +import ( + "io/ioutil" + "os" + "testing" + "time" + + "golang.org/x/sys/unix" +) + +func TestFchmodat(t *testing.T) { + defer chtmpdir(t)() + + touch(t, "file1") + os.Symlink("file1", "symlink1") + + err := unix.Fchmodat(unix.AT_FDCWD, "symlink1", 0444, 0) + if err != nil { + t.Fatalf("Fchmodat: unexpected error: %v", err) + } + + fi, err := os.Stat("file1") + if err != nil { + t.Fatal(err) + } + + if fi.Mode() != 0444 { + t.Errorf("Fchmodat: failed to change mode: expected %v, got %v", 0444, fi.Mode()) + } + + err = unix.Fchmodat(unix.AT_FDCWD, "symlink1", 0444, unix.AT_SYMLINK_NOFOLLOW) + if err != unix.EOPNOTSUPP { + t.Fatalf("Fchmodat: unexpected error: %v, expected EOPNOTSUPP", err) + } +} + +func TestIoctlGetInt(t *testing.T) { + f, err := os.Open("/dev/random") + if err != nil { + t.Fatalf("failed to open device: %v", err) + } + defer f.Close() + + v, err := unix.IoctlGetInt(int(f.Fd()), unix.RNDGETENTCNT) + if err != nil { + t.Fatalf("failed to perform ioctl: %v", err) + } + + t.Logf("%d bits of entropy available", v) +} + +func TestPoll(t *testing.T) { + f, cleanup := mktmpfifo(t) + defer cleanup() + + const timeout = 100 + + ok := make(chan bool, 1) + go func() { + select { + case <-time.After(10 * timeout * time.Millisecond): + t.Errorf("Poll: failed to timeout after %d milliseconds", 10*timeout) + case <-ok: + } + }() + + fds := []unix.PollFd{{Fd: int32(f.Fd()), Events: unix.POLLIN}} + n, err := unix.Poll(fds, timeout) + ok <- true + if err != nil { + t.Errorf("Poll: unexpected error: %v", err) + return + } + if n != 0 { + t.Errorf("Poll: wrong number of events: got %v, expected %v", n, 0) + return + } +} + +func TestPpoll(t *testing.T) { + f, cleanup := mktmpfifo(t) + defer cleanup() + + const timeout = 100 * time.Millisecond + + ok := make(chan bool, 1) + go func() { + select { + case <-time.After(10 * timeout): + t.Errorf("Ppoll: failed to timeout after %d", 10*timeout) + case <-ok: + } + }() + + fds := []unix.PollFd{{Fd: int32(f.Fd()), Events: unix.POLLIN}} + timeoutTs := unix.NsecToTimespec(int64(timeout)) + n, err := unix.Ppoll(fds, &timeoutTs, nil) + ok <- true + if err != nil { + t.Errorf("Ppoll: unexpected error: %v", err) + return + } + if n != 0 { + t.Errorf("Ppoll: wrong number of events: got %v, expected %v", n, 0) + return + } +} + +// mktmpfifo creates a temporary FIFO and provides a cleanup function. +func mktmpfifo(t *testing.T) (*os.File, func()) { + err := unix.Mkfifo("fifo", 0666) + if err != nil { + t.Fatalf("mktmpfifo: failed to create FIFO: %v", err) + } + + f, err := os.OpenFile("fifo", os.O_RDWR, 0666) + if err != nil { + os.Remove("fifo") + t.Fatalf("mktmpfifo: failed to open FIFO: %v", err) + } + + return f, func() { + f.Close() + os.Remove("fifo") + } +} + +func TestTime(t *testing.T) { + var ut unix.Time_t + ut2, err := unix.Time(&ut) + if err != nil { + t.Fatalf("Time: %v", err) + } + if ut != ut2 { + t.Errorf("Time: return value %v should be equal to argument %v", ut2, ut) + } + + var now time.Time + + for i := 0; i < 10; i++ { + ut, err = unix.Time(nil) + if err != nil { + t.Fatalf("Time: %v", err) + } + + now = time.Now() + + if int64(ut) == now.Unix() { + return + } + } + + t.Errorf("Time: return value %v should be nearly equal to time.Now().Unix() %v", ut, now.Unix()) +} + +func TestUtime(t *testing.T) { + defer chtmpdir(t)() + + touch(t, "file1") + + buf := &unix.Utimbuf{ + Modtime: 12345, + } + + err := unix.Utime("file1", buf) + if err != nil { + t.Fatalf("Utime: %v", err) + } + + fi, err := os.Stat("file1") + if err != nil { + t.Fatal(err) + } + + if fi.ModTime().Unix() != 12345 { + t.Errorf("Utime: failed to change modtime: expected %v, got %v", 12345, fi.ModTime().Unix()) + } +} + +func TestGetrlimit(t *testing.T) { + var rlim unix.Rlimit + err := unix.Getrlimit(unix.RLIMIT_AS, &rlim) + if err != nil { + t.Fatalf("Getrlimit: %v", err) + } +} + +func TestSelect(t *testing.T) { + _, err := unix.Select(0, nil, nil, nil, &unix.Timeval{0, 0}) + if err != nil { + t.Fatalf("Select: %v", err) + } +} + +// utilities taken from os/os_test.go + +func touch(t *testing.T, name string) { + f, err := os.Create(name) + if err != nil { + t.Fatal(err) + } + if err := f.Close(); err != nil { + t.Fatal(err) + } +} + +// chtmpdir changes the working directory to a new temporary directory and +// provides a cleanup function. Used when PWD is read-only. +func chtmpdir(t *testing.T) func() { + oldwd, err := os.Getwd() + if err != nil { + t.Fatalf("chtmpdir: %v", err) + } + d, err := ioutil.TempDir("", "test") + if err != nil { + t.Fatalf("chtmpdir: %v", err) + } + if err := os.Chdir(d); err != nil { + t.Fatalf("chtmpdir: %v", err) + } + return func() { + if err := os.Chdir(oldwd); err != nil { + t.Fatalf("chtmpdir: %v", err) + } + os.RemoveAll(d) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_netbsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_netbsd.go new file mode 100644 index 0000000..e129668 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_netbsd.go @@ -0,0 +1,472 @@ +// Copyright 2009,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. + +// NetBSD system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and wrap +// it in our own nicer implementation, either here or in +// syscall_bsd.go or syscall_unix.go. + +package unix + +import ( + "syscall" + "unsafe" +) + +type SockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 + raw RawSockaddrDatalink +} + +func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) + +func sysctlNodes(mib []_C_int) (nodes []Sysctlnode, err 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) (mib []_C_int, err 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:]) + + // 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, _C_int(node.Num)) + break + } + } + if len(mib) != partno+1 { + return nil, EINVAL + } + } + + return mib, nil +} + +func direntIno(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Fileno), unsafe.Sizeof(Dirent{}.Fileno)) +} + +func direntReclen(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen)) +} + +func direntNamlen(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen)) +} + +//sysnb pipe() (fd1 int, fd2 int, err error) +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + p[0], p[1], err = pipe() + return +} + +//sys getdents(fd int, buf []byte) (n int, err error) +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + return getdents(fd, buf) +} + +// TODO +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + return -1, ENOSYS +} + +/* + * Exposed directly + */ +//sys Access(path string, mode uint32) (err error) +//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) +//sys Chdir(path string) (err error) +//sys Chflags(path string, flags int) (err error) +//sys Chmod(path string, mode uint32) (err error) +//sys Chown(path string, uid int, gid int) (err error) +//sys Chroot(path string) (err error) +//sys Close(fd int) (err error) +//sys Dup(fd int) (nfd int, err error) +//sys Dup2(from int, to int) (err error) +//sys Exit(code int) +//sys Fchdir(fd int) (err error) +//sys Fchflags(fd int, flags int) (err error) +//sys Fchmod(fd int, mode uint32) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Flock(fd int, how int) (err error) +//sys Fpathconf(fd int, name int) (val int, err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fsync(fd int) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (uid int) +//sysnb Getgid() (gid int) +//sysnb Getpgid(pid int) (pgid int, err error) +//sysnb Getpgrp() (pgrp int) +//sysnb Getpid() (pid int) +//sysnb Getppid() (ppid int) +//sys Getpriority(which int, who int) (prio int, err error) +//sysnb Getrlimit(which int, lim *Rlimit) (err error) +//sysnb Getrusage(who int, rusage *Rusage) (err error) +//sysnb Getsid(pid int) (sid int, err error) +//sysnb Gettimeofday(tv *Timeval) (err error) +//sysnb Getuid() (uid int) +//sys Issetugid() (tainted bool) +//sys Kill(pid int, signum syscall.Signal) (err error) +//sys Kqueue() (fd int, err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Link(path string, link string) (err error) +//sys Listen(s int, backlog int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Mkdir(path string, mode uint32) (err error) +//sys Mkfifo(path string, mode uint32) (err error) +//sys Mknod(path string, mode uint32, dev int) (err error) +//sys Nanosleep(time *Timespec, leftover *Timespec) (err error) +//sys Open(path string, mode int, perm uint32) (fd int, err error) +//sys Pathconf(path string, name int) (val int, err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys read(fd int, p []byte) (n int, err error) +//sys Readlink(path string, buf []byte) (n int, err error) +//sys Rename(from string, to string) (err error) +//sys Revoke(path string) (err error) +//sys Rmdir(path string) (err error) +//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK +//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) +//sysnb Setegid(egid int) (err error) +//sysnb Seteuid(euid int) (err error) +//sysnb Setgid(gid int) (err error) +//sysnb Setpgid(pid int, pgid int) (err error) +//sys Setpriority(which int, who int, prio int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sysnb Setrlimit(which int, lim *Rlimit) (err error) +//sysnb Setsid() (pid int, err error) +//sysnb Settimeofday(tp *Timeval) (err error) +//sysnb Setuid(uid int) (err error) +//sys Stat(path string, stat *Stat_t) (err error) +//sys Symlink(path string, link string) (err error) +//sys Sync() (err error) +//sys Truncate(path string, length int64) (err error) +//sys Umask(newmask int) (oldmask int) +//sys Unlink(path string) (err error) +//sys Unmount(path string, flags int) (err error) +//sys write(fd int, p []byte) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) +//sys munmap(addr uintptr, length uintptr) (err error) +//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ +//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE +//sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) + +/* + * Unimplemented + */ +// ____semctl13 +// __clone +// __fhopen40 +// __fhstat40 +// __fhstatvfs140 +// __fstat30 +// __getcwd +// __getfh30 +// __getlogin +// __lstat30 +// __mount50 +// __msgctl13 +// __msync13 +// __ntp_gettime30 +// __posix_chown +// __posix_fadvise50 +// __posix_fchown +// __posix_lchown +// __posix_rename +// __setlogin +// __shmctl13 +// __sigaction_sigtramp +// __sigaltstack14 +// __sigpending14 +// __sigprocmask14 +// __sigsuspend14 +// __sigtimedwait +// __stat30 +// __syscall +// __vfork14 +// _ksem_close +// _ksem_destroy +// _ksem_getvalue +// _ksem_init +// _ksem_open +// _ksem_post +// _ksem_trywait +// _ksem_unlink +// _ksem_wait +// _lwp_continue +// _lwp_create +// _lwp_ctl +// _lwp_detach +// _lwp_exit +// _lwp_getname +// _lwp_getprivate +// _lwp_kill +// _lwp_park +// _lwp_self +// _lwp_setname +// _lwp_setprivate +// _lwp_suspend +// _lwp_unpark +// _lwp_unpark_all +// _lwp_wait +// _lwp_wakeup +// _pset_bind +// _sched_getaffinity +// _sched_getparam +// _sched_setaffinity +// _sched_setparam +// acct +// aio_cancel +// aio_error +// aio_fsync +// aio_read +// aio_return +// aio_suspend +// aio_write +// break +// clock_getres +// clock_gettime +// clock_settime +// compat_09_ogetdomainname +// compat_09_osetdomainname +// compat_09_ouname +// compat_10_omsgsys +// compat_10_osemsys +// compat_10_oshmsys +// compat_12_fstat12 +// compat_12_getdirentries +// compat_12_lstat12 +// compat_12_msync +// compat_12_oreboot +// compat_12_oswapon +// compat_12_stat12 +// compat_13_sigaction13 +// compat_13_sigaltstack13 +// compat_13_sigpending13 +// compat_13_sigprocmask13 +// compat_13_sigreturn13 +// compat_13_sigsuspend13 +// compat_14___semctl +// compat_14_msgctl +// compat_14_shmctl +// compat_16___sigaction14 +// compat_16___sigreturn14 +// compat_20_fhstatfs +// compat_20_fstatfs +// compat_20_getfsstat +// compat_20_statfs +// compat_30___fhstat30 +// compat_30___fstat13 +// compat_30___lstat13 +// compat_30___stat13 +// compat_30_fhopen +// compat_30_fhstat +// compat_30_fhstatvfs1 +// compat_30_getdents +// compat_30_getfh +// compat_30_ntp_gettime +// compat_30_socket +// compat_40_mount +// compat_43_fstat43 +// compat_43_lstat43 +// compat_43_oaccept +// compat_43_ocreat +// compat_43_oftruncate +// compat_43_ogetdirentries +// compat_43_ogetdtablesize +// compat_43_ogethostid +// compat_43_ogethostname +// compat_43_ogetkerninfo +// compat_43_ogetpagesize +// compat_43_ogetpeername +// compat_43_ogetrlimit +// compat_43_ogetsockname +// compat_43_okillpg +// compat_43_olseek +// compat_43_ommap +// compat_43_oquota +// compat_43_orecv +// compat_43_orecvfrom +// compat_43_orecvmsg +// compat_43_osend +// compat_43_osendmsg +// compat_43_osethostid +// compat_43_osethostname +// compat_43_osetrlimit +// compat_43_osigblock +// compat_43_osigsetmask +// compat_43_osigstack +// compat_43_osigvec +// compat_43_otruncate +// compat_43_owait +// compat_43_stat43 +// execve +// extattr_delete_fd +// extattr_delete_file +// extattr_delete_link +// extattr_get_fd +// extattr_get_file +// extattr_get_link +// extattr_list_fd +// extattr_list_file +// extattr_list_link +// extattr_set_fd +// extattr_set_file +// extattr_set_link +// extattrctl +// fchroot +// fdatasync +// fgetxattr +// fktrace +// flistxattr +// fork +// fremovexattr +// fsetxattr +// fstatvfs1 +// fsync_range +// getcontext +// getitimer +// getvfsstat +// getxattr +// ioctl +// ktrace +// lchflags +// lchmod +// lfs_bmapv +// lfs_markv +// lfs_segclean +// lfs_segwait +// lgetxattr +// lio_listio +// listxattr +// llistxattr +// lremovexattr +// lseek +// lsetxattr +// lutimes +// madvise +// mincore +// minherit +// modctl +// mq_close +// mq_getattr +// mq_notify +// mq_open +// mq_receive +// mq_send +// mq_setattr +// mq_timedreceive +// mq_timedsend +// mq_unlink +// mremap +// msgget +// msgrcv +// msgsnd +// nfssvc +// ntp_adjtime +// pmc_control +// pmc_get_info +// poll +// pollts +// preadv +// profil +// pselect +// pset_assign +// pset_create +// pset_destroy +// ptrace +// pwritev +// quotactl +// rasctl +// readv +// reboot +// removexattr +// sa_enable +// sa_preempt +// sa_register +// sa_setconcurrency +// sa_stacks +// sa_yield +// sbrk +// sched_yield +// semconfig +// semget +// semop +// setcontext +// setitimer +// setxattr +// shmat +// shmdt +// shmget +// sstk +// statvfs1 +// swapctl +// sysarch +// syscall +// timer_create +// timer_delete +// timer_getoverrun +// timer_gettime +// timer_settime +// undelete +// utrace +// uuidgen +// vadvise +// vfork +// writev diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go new file mode 100644 index 0000000..baefa41 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go @@ -0,0 +1,40 @@ +// 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. + +// +build 386,netbsd + +package unix + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = int64(nsec / 1e9) + ts.Nsec = int32(nsec % 1e9) + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Usec = int32(nsec % 1e9 / 1e3) + tv.Sec = int64(nsec / 1e9) + return +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = uint32(mode) + k.Flags = uint32(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go new file mode 100644 index 0000000..59c2ab7 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go @@ -0,0 +1,40 @@ +// 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. + +// +build amd64,netbsd + +package unix + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = int64(nsec / 1e9) + ts.Nsec = int64(nsec % 1e9) + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Usec = int32(nsec % 1e9 / 1e3) + tv.Sec = int64(nsec / 1e9) + return +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint64(fd) + k.Filter = uint32(mode) + k.Flags = uint32(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go new file mode 100644 index 0000000..7208108 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go @@ -0,0 +1,40 @@ +// 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. + +// +build arm,netbsd + +package unix + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = int64(nsec / 1e9) + ts.Nsec = int32(nsec % 1e9) + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Usec = int32(nsec % 1e9 / 1e3) + tv.Sec = int64(nsec / 1e9) + return +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = uint32(mode) + k.Flags = uint32(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_no_getwd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_no_getwd.go new file mode 100644 index 0000000..530792e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_no_getwd.go @@ -0,0 +1,11 @@ +// 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. + +// +build dragonfly freebsd netbsd openbsd + +package unix + +const ImplementsGetwd = false + +func Getwd() (string, error) { return "", ENOTSUP } diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_openbsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_openbsd.go new file mode 100644 index 0000000..408e630 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_openbsd.go @@ -0,0 +1,282 @@ +// Copyright 2009,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. + +// OpenBSD system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and wrap +// it in our own nicer implementation, either here or in +// syscall_bsd.go or syscall_unix.go. + +package unix + +import ( + "syscall" + "unsafe" +) + +type SockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [24]int8 + raw RawSockaddrDatalink +} + +func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) + +func nametomib(name string) (mib []_C_int, err error) { + + // Perform lookup via a binary search + left := 0 + right := len(sysctlMib) - 1 + for { + idx := left + (right-left)/2 + switch { + case name == sysctlMib[idx].ctlname: + return sysctlMib[idx].ctloid, nil + case name > sysctlMib[idx].ctlname: + left = idx + 1 + default: + right = idx - 1 + } + if left > right { + break + } + } + return nil, EINVAL +} + +func direntIno(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Fileno), unsafe.Sizeof(Dirent{}.Fileno)) +} + +func direntReclen(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen)) +} + +func direntNamlen(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen)) +} + +//sysnb pipe(p *[2]_C_int) (err error) +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe(&pp) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sys getdents(fd int, buf []byte) (n int, err error) +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + return getdents(fd, buf) +} + +// TODO +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + return -1, ENOSYS +} + +func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { + var _p0 unsafe.Pointer + var bufsize uintptr + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf)) + } + r0, _, e1 := Syscall(SYS_GETFSSTAT, uintptr(_p0), bufsize, uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +/* + * Exposed directly + */ +//sys Access(path string, mode uint32) (err error) +//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) +//sys Chdir(path string) (err error) +//sys Chflags(path string, flags int) (err error) +//sys Chmod(path string, mode uint32) (err error) +//sys Chown(path string, uid int, gid int) (err error) +//sys Chroot(path string) (err error) +//sys Close(fd int) (err error) +//sys Dup(fd int) (nfd int, err error) +//sys Dup2(from int, to int) (err error) +//sys Exit(code int) +//sys Fchdir(fd int) (err error) +//sys Fchflags(fd int, flags int) (err error) +//sys Fchmod(fd int, mode uint32) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Flock(fd int, how int) (err error) +//sys Fpathconf(fd int, name int) (val int, err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatfs(fd int, stat *Statfs_t) (err error) +//sys Fsync(fd int) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (uid int) +//sysnb Getgid() (gid int) +//sysnb Getpgid(pid int) (pgid int, err error) +//sysnb Getpgrp() (pgrp int) +//sysnb Getpid() (pid int) +//sysnb Getppid() (ppid int) +//sys Getpriority(which int, who int) (prio int, err error) +//sysnb Getrlimit(which int, lim *Rlimit) (err error) +//sysnb Getrusage(who int, rusage *Rusage) (err error) +//sysnb Getsid(pid int) (sid int, err error) +//sysnb Gettimeofday(tv *Timeval) (err error) +//sysnb Getuid() (uid int) +//sys Issetugid() (tainted bool) +//sys Kill(pid int, signum syscall.Signal) (err error) +//sys Kqueue() (fd int, err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Link(path string, link string) (err error) +//sys Listen(s int, backlog int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Mkdir(path string, mode uint32) (err error) +//sys Mkfifo(path string, mode uint32) (err error) +//sys Mknod(path string, mode uint32, dev int) (err error) +//sys Nanosleep(time *Timespec, leftover *Timespec) (err error) +//sys Open(path string, mode int, perm uint32) (fd int, err error) +//sys Pathconf(path string, name int) (val int, err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys read(fd int, p []byte) (n int, err error) +//sys Readlink(path string, buf []byte) (n int, err error) +//sys Rename(from string, to string) (err error) +//sys Revoke(path string) (err error) +//sys Rmdir(path string) (err error) +//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK +//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) +//sysnb Setegid(egid int) (err error) +//sysnb Seteuid(euid int) (err error) +//sysnb Setgid(gid int) (err error) +//sys Setlogin(name string) (err error) +//sysnb Setpgid(pid int, pgid int) (err error) +//sys Setpriority(which int, who int, prio int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(which int, lim *Rlimit) (err error) +//sysnb Setsid() (pid int, err error) +//sysnb Settimeofday(tp *Timeval) (err error) +//sysnb Setuid(uid int) (err error) +//sys Stat(path string, stat *Stat_t) (err error) +//sys Statfs(path string, stat *Statfs_t) (err error) +//sys Symlink(path string, link string) (err error) +//sys Sync() (err error) +//sys Truncate(path string, length int64) (err error) +//sys Umask(newmask int) (oldmask int) +//sys Unlink(path string) (err error) +//sys Unmount(path string, flags int) (err error) +//sys write(fd int, p []byte) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) +//sys munmap(addr uintptr, length uintptr) (err error) +//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ +//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE +//sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) + +/* + * Unimplemented + */ +// __getcwd +// __semctl +// __syscall +// __sysctl +// adjfreq +// break +// clock_getres +// clock_gettime +// clock_settime +// closefrom +// execve +// faccessat +// fchmodat +// fchownat +// fcntl +// fhopen +// fhstat +// fhstatfs +// fork +// fstatat +// futimens +// getfh +// getgid +// getitimer +// getlogin +// getresgid +// getresuid +// getrtable +// getthrid +// ioctl +// ktrace +// lfs_bmapv +// lfs_markv +// lfs_segclean +// lfs_segwait +// linkat +// mincore +// minherit +// mkdirat +// mkfifoat +// mknodat +// mount +// mquery +// msgctl +// msgget +// msgrcv +// msgsnd +// nfssvc +// nnpfspioctl +// openat +// poll +// preadv +// profil +// pwritev +// quotactl +// readlinkat +// readv +// reboot +// renameat +// rfork +// sched_yield +// semget +// semop +// setgroups +// setitimer +// setrtable +// setsockopt +// shmat +// shmctl +// shmdt +// shmget +// sigaction +// sigaltstack +// sigpending +// sigprocmask +// sigreturn +// sigsuspend +// symlinkat +// sysarch +// syscall +// threxit +// thrsigdivert +// thrsleep +// thrwakeup +// unlinkat +// vfork +// writev diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go new file mode 100644 index 0000000..d3809b4 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go @@ -0,0 +1,40 @@ +// 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. + +// +build 386,openbsd + +package unix + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = int64(nsec / 1e9) + ts.Nsec = int32(nsec % 1e9) + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Usec = int32(nsec % 1e9 / 1e3) + tv.Sec = int64(nsec / 1e9) + return +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go new file mode 100644 index 0000000..9a9dfce --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go @@ -0,0 +1,40 @@ +// 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. + +// +build amd64,openbsd + +package unix + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = nsec / 1e9 + ts.Nsec = nsec % 1e9 + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Usec = nsec % 1e9 / 1e3 + tv.Sec = nsec / 1e9 + return +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint64(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go new file mode 100644 index 0000000..ba86490 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go @@ -0,0 +1,40 @@ +// 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. + +// +build arm,openbsd + +package unix + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = int64(nsec / 1e9) + ts.Nsec = int32(nsec % 1e9) + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Usec = int32(nsec % 1e9 / 1e3) + tv.Sec = int64(nsec / 1e9) + return +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_solaris.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_solaris.go new file mode 100644 index 0000000..35e5d72 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_solaris.go @@ -0,0 +1,719 @@ +// 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. + +// Solaris system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and wrap +// it in our own nicer implementation, either here or in +// syscall_solaris.go or syscall_unix.go. + +package unix + +import ( + "syscall" + "unsafe" +) + +// Implemented in runtime/syscall_solaris.go. +type syscallFunc uintptr + +func rawSysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) +func sysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) + +type SockaddrDatalink struct { + Family uint16 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [244]int8 + raw RawSockaddrDatalink +} + +func clen(n []byte) int { + for i := 0; i < len(n); i++ { + if n[i] == 0 { + return i + } + } + return len(n) +} + +func direntIno(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino)) +} + +func direntReclen(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen)) +} + +func direntNamlen(buf []byte) (uint64, bool) { + reclen, ok := direntReclen(buf) + if !ok { + return 0, false + } + return reclen - uint64(unsafe.Offsetof(Dirent{}.Name)), true +} + +//sysnb pipe(p *[2]_C_int) (n int, err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + n, err := pipe(&pp) + if n != 0 { + return err + } + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return nil +} + +func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, EINVAL + } + sa.raw.Family = AF_INET + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), SizeofSockaddrInet4, nil +} + +func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, EINVAL + } + sa.raw.Family = AF_INET6 + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + sa.raw.Scope_id = sa.ZoneId + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), SizeofSockaddrInet6, nil +} + +func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) { + name := sa.Name + n := len(name) + if n >= len(sa.raw.Path) { + return nil, 0, EINVAL + } + sa.raw.Family = AF_UNIX + for i := 0; i < n; i++ { + sa.raw.Path[i] = int8(name[i]) + } + // length is family (uint16), name, NUL. + sl := _Socklen(2) + if n > 0 { + sl += _Socklen(n) + 1 + } + if sa.raw.Path[0] == '@' { + sa.raw.Path[0] = 0 + // Don't count trailing NUL for abstract address. + sl-- + } + + return unsafe.Pointer(&sa.raw), sl, nil +} + +//sys getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) = libsocket.getsockname + +func Getsockname(fd int) (sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + if err = getsockname(fd, &rsa, &len); err != nil { + return + } + return anyToSockaddr(&rsa) +} + +const ImplementsGetwd = true + +//sys Getcwd(buf []byte) (n int, err error) + +func Getwd() (wd string, err error) { + var buf [PathMax]byte + // Getcwd will return an error if it failed for any reason. + _, err = Getcwd(buf[0:]) + if err != nil { + return "", err + } + n := clen(buf[:]) + if n < 1 { + return "", EINVAL + } + return string(buf[:n]), nil +} + +/* + * Wrapped + */ + +//sysnb getgroups(ngid int, gid *_Gid_t) (n int, err error) +//sysnb setgroups(ngid int, gid *_Gid_t) (err error) + +func Getgroups() (gids []int, err error) { + n, err := getgroups(0, nil) + // Check for error and sanity check group count. Newer versions of + // Solaris allow up to 1024 (NGROUPS_MAX). + if n < 0 || n > 1024 { + if err != nil { + return nil, err + } + return nil, EINVAL + } else if n == 0 { + return nil, nil + } + + a := make([]_Gid_t, n) + n, err = getgroups(n, &a[0]) + if n == -1 { + return nil, err + } + gids = make([]int, n) + for i, v := range a[0:n] { + gids[i] = int(v) + } + return +} + +func Setgroups(gids []int) (err error) { + if len(gids) == 0 { + return setgroups(0, nil) + } + + a := make([]_Gid_t, len(gids)) + for i, v := range gids { + a[i] = _Gid_t(v) + } + return setgroups(len(a), &a[0]) +} + +func ReadDirent(fd int, buf []byte) (n int, err error) { + // Final argument is (basep *uintptr) and the syscall doesn't take nil. + // TODO(rsc): Can we use a single global basep for all calls? + return Getdents(fd, buf, new(uintptr)) +} + +// Wait status is 7 bits at bottom, either 0 (exited), +// 0x7F (stopped), or a signal number that caused an exit. +// The 0x80 bit is whether there was a core dump. +// An extra number (exit code, signal causing a stop) +// is in the high bits. + +type WaitStatus uint32 + +const ( + mask = 0x7F + core = 0x80 + shift = 8 + + exited = 0 + stopped = 0x7F +) + +func (w WaitStatus) Exited() bool { return w&mask == exited } + +func (w WaitStatus) ExitStatus() int { + if w&mask != exited { + return -1 + } + return int(w >> shift) +} + +func (w WaitStatus) Signaled() bool { return w&mask != stopped && w&mask != 0 } + +func (w WaitStatus) Signal() syscall.Signal { + sig := syscall.Signal(w & mask) + if sig == stopped || sig == 0 { + return -1 + } + return sig +} + +func (w WaitStatus) CoreDump() bool { return w.Signaled() && w&core != 0 } + +func (w WaitStatus) Stopped() bool { return w&mask == stopped && syscall.Signal(w>>shift) != SIGSTOP } + +func (w WaitStatus) Continued() bool { return w&mask == stopped && syscall.Signal(w>>shift) == SIGSTOP } + +func (w WaitStatus) StopSignal() syscall.Signal { + if !w.Stopped() { + return -1 + } + return syscall.Signal(w>>shift) & 0xFF +} + +func (w WaitStatus) TrapCause() int { return -1 } + +//sys wait4(pid int32, statusp *_C_int, options int, rusage *Rusage) (wpid int32, err error) + +func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (int, error) { + var status _C_int + rpid, err := wait4(int32(pid), &status, options, rusage) + wpid := int(rpid) + if wpid == -1 { + return wpid, err + } + if wstatus != nil { + *wstatus = WaitStatus(status) + } + return wpid, nil +} + +//sys gethostname(buf []byte) (n int, err error) + +func Gethostname() (name string, err error) { + var buf [MaxHostNameLen]byte + n, err := gethostname(buf[:]) + if n != 0 { + return "", err + } + n = clen(buf[:]) + if n < 1 { + return "", EFAULT + } + return string(buf[:n]), nil +} + +//sys utimes(path string, times *[2]Timeval) (err error) + +func Utimes(path string, tv []Timeval) (err error) { + if tv == nil { + return utimes(path, nil) + } + if len(tv) != 2 { + return EINVAL + } + return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +//sys utimensat(fd int, path string, times *[2]Timespec, flag int) (err error) + +func UtimesNano(path string, ts []Timespec) error { + if ts == nil { + return utimensat(AT_FDCWD, path, nil, 0) + } + if len(ts) != 2 { + return EINVAL + } + return utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) +} + +func UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) error { + if ts == nil { + return utimensat(dirfd, path, nil, flags) + } + if len(ts) != 2 { + return EINVAL + } + return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags) +} + +//sys fcntl(fd int, cmd int, arg int) (val int, err error) + +// FcntlFlock performs a fcntl syscall for the F_GETLK, F_SETLK or F_SETLKW command. +func FcntlFlock(fd uintptr, cmd int, lk *Flock_t) error { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procfcntl)), 3, uintptr(fd), uintptr(cmd), uintptr(unsafe.Pointer(lk)), 0, 0, 0) + if e1 != 0 { + return e1 + } + return nil +} + +//sys futimesat(fildes int, path *byte, times *[2]Timeval) (err error) + +func Futimesat(dirfd int, path string, tv []Timeval) error { + pathp, err := BytePtrFromString(path) + if err != nil { + return err + } + if tv == nil { + return futimesat(dirfd, pathp, nil) + } + if len(tv) != 2 { + return EINVAL + } + return futimesat(dirfd, pathp, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +// Solaris doesn't have an futimes function because it allows NULL to be +// specified as the path for futimesat. However, Go doesn't like +// NULL-style string interfaces, so this simple wrapper is provided. +func Futimes(fd int, tv []Timeval) error { + if tv == nil { + return futimesat(fd, nil, nil) + } + if len(tv) != 2 { + return EINVAL + } + return futimesat(fd, nil, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +func anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) { + switch rsa.Addr.Family { + case AF_UNIX: + pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa)) + sa := new(SockaddrUnix) + // Assume path ends at NUL. + // This is not technically the Solaris semantics for + // abstract Unix domain sockets -- they are supposed + // to be uninterpreted fixed-size binary blobs -- but + // everyone uses this convention. + n := 0 + for n < len(pp.Path) && pp.Path[n] != 0 { + n++ + } + bytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n] + sa.Name = string(bytes) + return sa, nil + + case AF_INET: + pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet4) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + + case AF_INET6: + pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet6) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + sa.ZoneId = pp.Scope_id + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + } + return nil, EAFNOSUPPORT +} + +//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) = libsocket.accept + +func Accept(fd int) (nfd int, sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + nfd, err = accept(fd, &rsa, &len) + if nfd == -1 { + return + } + sa, err = anyToSockaddr(&rsa) + if err != nil { + Close(nfd) + nfd = 0 + } + return +} + +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) = libsocket.__xnet_recvmsg + +func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { + var msg Msghdr + var rsa RawSockaddrAny + msg.Name = (*byte)(unsafe.Pointer(&rsa)) + msg.Namelen = uint32(SizeofSockaddrAny) + var iov Iovec + if len(p) > 0 { + iov.Base = (*int8)(unsafe.Pointer(&p[0])) + iov.SetLen(len(p)) + } + var dummy int8 + if len(oob) > 0 { + // receive at least one normal byte + if len(p) == 0 { + iov.Base = &dummy + iov.SetLen(1) + } + msg.Accrightslen = int32(len(oob)) + } + msg.Iov = &iov + msg.Iovlen = 1 + if n, err = recvmsg(fd, &msg, flags); n == -1 { + return + } + oobn = int(msg.Accrightslen) + // source address is only specified if the socket is unconnected + if rsa.Addr.Family != AF_UNSPEC { + from, err = anyToSockaddr(&rsa) + } + return +} + +func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { + _, err = SendmsgN(fd, p, oob, to, flags) + return +} + +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) = libsocket.__xnet_sendmsg + +func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { + var ptr unsafe.Pointer + var salen _Socklen + if to != nil { + ptr, salen, err = to.sockaddr() + if err != nil { + return 0, err + } + } + var msg Msghdr + msg.Name = (*byte)(unsafe.Pointer(ptr)) + msg.Namelen = uint32(salen) + var iov Iovec + if len(p) > 0 { + iov.Base = (*int8)(unsafe.Pointer(&p[0])) + iov.SetLen(len(p)) + } + var dummy int8 + if len(oob) > 0 { + // send at least one normal byte + if len(p) == 0 { + iov.Base = &dummy + iov.SetLen(1) + } + msg.Accrightslen = int32(len(oob)) + } + msg.Iov = &iov + msg.Iovlen = 1 + if n, err = sendmsg(fd, &msg, flags); err != nil { + return 0, err + } + if len(oob) > 0 && len(p) == 0 { + n = 0 + } + return n, nil +} + +//sys acct(path *byte) (err error) + +func Acct(path string) (err error) { + if len(path) == 0 { + // Assume caller wants to disable accounting. + return acct(nil) + } + + pathp, err := BytePtrFromString(path) + if err != nil { + return err + } + return acct(pathp) +} + +//sys __makedev(version int, major uint, minor uint) (val uint64) + +func Mkdev(major, minor uint32) uint64 { + return __makedev(NEWDEV, uint(major), uint(minor)) +} + +//sys __major(version int, dev uint64) (val uint) + +func Major(dev uint64) uint32 { + return uint32(__major(NEWDEV, dev)) +} + +//sys __minor(version int, dev uint64) (val uint) + +func Minor(dev uint64) uint32 { + return uint32(__minor(NEWDEV, dev)) +} + +/* + * Expose the ioctl function + */ + +//sys ioctl(fd int, req uint, arg uintptr) (err error) + +func IoctlSetInt(fd int, req uint, value int) (err error) { + return ioctl(fd, req, uintptr(value)) +} + +func IoctlSetWinsize(fd int, req uint, value *Winsize) (err error) { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlSetTermios(fd int, req uint, value *Termios) (err error) { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlSetTermio(fd int, req uint, value *Termio) (err error) { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlGetInt(fd int, req uint) (int, error) { + var value int + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return value, err +} + +func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { + var value Winsize + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermios(fd int, req uint) (*Termios, error) { + var value Termios + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermio(fd int, req uint) (*Termio, error) { + var value Termio + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +/* + * Exposed directly + */ +//sys Access(path string, mode uint32) (err error) +//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) +//sys Chdir(path string) (err error) +//sys Chmod(path string, mode uint32) (err error) +//sys Chown(path string, uid int, gid int) (err error) +//sys Chroot(path string) (err error) +//sys Close(fd int) (err error) +//sys Creat(path string, mode uint32) (fd int, err error) +//sys Dup(fd int) (nfd int, err error) +//sys Dup2(oldfd int, newfd int) (err error) +//sys Exit(code int) +//sys Fchdir(fd int) (err error) +//sys Fchmod(fd int, mode uint32) (err error) +//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) +//sys Fdatasync(fd int) (err error) +//sys Flock(fd int, how int) (err error) +//sys Fpathconf(fd int, name int) (val int, err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatvfs(fd int, vfsstat *Statvfs_t) (err error) +//sys Getdents(fd int, buf []byte, basep *uintptr) (n int, err error) +//sysnb Getgid() (gid int) +//sysnb Getpid() (pid int) +//sysnb Getpgid(pid int) (pgid int, err error) +//sysnb Getpgrp() (pgid int, err error) +//sys Geteuid() (euid int) +//sys Getegid() (egid int) +//sys Getppid() (ppid int) +//sys Getpriority(which int, who int) (n int, err error) +//sysnb Getrlimit(which int, lim *Rlimit) (err error) +//sysnb Getrusage(who int, rusage *Rusage) (err error) +//sysnb Gettimeofday(tv *Timeval) (err error) +//sysnb Getuid() (uid int) +//sys Kill(pid int, signum syscall.Signal) (err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Link(path string, link string) (err error) +//sys Listen(s int, backlog int) (err error) = libsocket.__xnet_llisten +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Madvise(b []byte, advice int) (err error) +//sys Mkdir(path string, mode uint32) (err error) +//sys Mkdirat(dirfd int, path string, mode uint32) (err error) +//sys Mkfifo(path string, mode uint32) (err error) +//sys Mkfifoat(dirfd int, path string, mode uint32) (err error) +//sys Mknod(path string, mode uint32, dev int) (err error) +//sys Mknodat(dirfd int, path string, mode uint32, dev int) (err error) +//sys Mlock(b []byte) (err error) +//sys Mlockall(flags int) (err error) +//sys Mprotect(b []byte, prot int) (err error) +//sys Msync(b []byte, flags int) (err error) +//sys Munlock(b []byte) (err error) +//sys Munlockall() (err error) +//sys Nanosleep(time *Timespec, leftover *Timespec) (err error) +//sys Open(path string, mode int, perm uint32) (fd int, err error) +//sys Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) +//sys Pathconf(path string, name int) (val int, err error) +//sys Pause() (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys read(fd int, p []byte) (n int, err error) +//sys Readlink(path string, buf []byte) (n int, err error) +//sys Rename(from string, to string) (err error) +//sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) +//sys Rmdir(path string) (err error) +//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = lseek +//sysnb Setegid(egid int) (err error) +//sysnb Seteuid(euid int) (err error) +//sysnb Setgid(gid int) (err error) +//sys Sethostname(p []byte) (err error) +//sysnb Setpgid(pid int, pgid int) (err error) +//sys Setpriority(which int, who int, prio int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sysnb Setrlimit(which int, lim *Rlimit) (err error) +//sysnb Setsid() (pid int, err error) +//sysnb Setuid(uid int) (err error) +//sys Shutdown(s int, how int) (err error) = libsocket.shutdown +//sys Stat(path string, stat *Stat_t) (err error) +//sys Statvfs(path string, vfsstat *Statvfs_t) (err error) +//sys Symlink(path string, link string) (err error) +//sys Sync() (err error) +//sysnb Times(tms *Tms) (ticks uintptr, err error) +//sys Truncate(path string, length int64) (err error) +//sys Fsync(fd int) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sys Umask(mask int) (oldmask int) +//sysnb Uname(buf *Utsname) (err error) +//sys Unmount(target string, flags int) (err error) = libc.umount +//sys Unlink(path string) (err error) +//sys Unlinkat(dirfd int, path string, flags int) (err error) +//sys Ustat(dev int, ubuf *Ustat_t) (err error) +//sys Utime(path string, buf *Utimbuf) (err error) +//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.__xnet_bind +//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.__xnet_connect +//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) +//sys munmap(addr uintptr, length uintptr) (err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.__xnet_sendto +//sys socket(domain int, typ int, proto int) (fd int, err error) = libsocket.__xnet_socket +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) = libsocket.__xnet_socketpair +//sys write(fd int, p []byte) (n int, err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) = libsocket.__xnet_getsockopt +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) = libsocket.getpeername +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) = libsocket.setsockopt +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) = libsocket.recvfrom + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procread)), 3, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procwrite)), 3, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +var mapper = &mmapper{ + active: make(map[*byte][]byte), + mmap: mmap, + munmap: munmap, +} + +func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { + return mapper.Mmap(fd, offset, length, prot, flags) +} + +func Munmap(b []byte) (err error) { + return mapper.Munmap(b) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go new file mode 100644 index 0000000..5aff62c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go @@ -0,0 +1,35 @@ +// 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. + +// +build amd64,solaris + +package unix + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = nsec / 1e9 + ts.Nsec = nsec % 1e9 + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Usec = nsec % 1e9 / 1e3 + tv.Sec = int64(nsec / 1e9) + return +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + // TODO(aram): implement this, see issue 5847. + panic("unimplemented") +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_solaris_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_solaris_test.go new file mode 100644 index 0000000..d3e7d2b --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_solaris_test.go @@ -0,0 +1,34 @@ +// 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. + +// +build solaris + +package unix_test + +import ( + "os/exec" + "testing" + + "golang.org/x/sys/unix" +) + +func TestStatvfs(t *testing.T) { + if err := unix.Statvfs("", nil); err == nil { + t.Fatal(`Statvfs("") expected failure`) + } + + statvfs := unix.Statvfs_t{} + if err := unix.Statvfs("/", &statvfs); err != nil { + t.Errorf(`Statvfs("/") failed: %v`, err) + } + + if t.Failed() { + mount, err := exec.Command("mount").CombinedOutput() + if err != nil { + t.Logf("mount: %v\n%s", err, mount) + } else { + t.Logf("mount: %s", mount) + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_test.go new file mode 100644 index 0000000..95eac92 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_test.go @@ -0,0 +1,50 @@ +// 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +package unix_test + +import ( + "fmt" + "testing" + + "golang.org/x/sys/unix" +) + +func testSetGetenv(t *testing.T, key, value string) { + err := unix.Setenv(key, value) + if err != nil { + t.Fatalf("Setenv failed to set %q: %v", value, err) + } + newvalue, found := unix.Getenv(key) + if !found { + t.Fatalf("Getenv failed to find %v variable (want value %q)", key, value) + } + if newvalue != value { + t.Fatalf("Getenv(%v) = %q; want %q", key, newvalue, value) + } +} + +func TestEnv(t *testing.T) { + testSetGetenv(t, "TESTENV", "AVALUE") + // make sure TESTENV gets set to "", not deleted + testSetGetenv(t, "TESTENV", "") +} + +func TestItoa(t *testing.T) { + // Make most negative integer: 0x8000... + i := 1 + for i<<1 != 0 { + i <<= 1 + } + if i >= 0 { + t.Fatal("bad math") + } + s := unix.Itoa(i) + f := fmt.Sprint(i) + if s != f { + t.Fatalf("itoa(%d) = %s, want %s", i, s, f) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_unix.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_unix.go new file mode 100644 index 0000000..3ed8a91 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_unix.go @@ -0,0 +1,293 @@ +// 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +package unix + +import ( + "runtime" + "sync" + "syscall" + "unsafe" +) + +var ( + Stdin = 0 + Stdout = 1 + Stderr = 2 +) + +const ( + darwin64Bit = runtime.GOOS == "darwin" && sizeofPtr == 8 + dragonfly64Bit = runtime.GOOS == "dragonfly" && sizeofPtr == 8 + netbsd32Bit = runtime.GOOS == "netbsd" && sizeofPtr == 4 + solaris64Bit = runtime.GOOS == "solaris" && sizeofPtr == 8 +) + +// Do the interface allocations only once for common +// Errno values. +var ( + errEAGAIN error = syscall.EAGAIN + errEINVAL error = syscall.EINVAL + errENOENT error = syscall.ENOENT +) + +// errnoErr returns common boxed Errno values, to prevent +// allocations at runtime. +func errnoErr(e syscall.Errno) error { + switch e { + case 0: + return nil + case EAGAIN: + return errEAGAIN + case EINVAL: + return errEINVAL + case ENOENT: + return errENOENT + } + return e +} + +// Mmap manager, for use by operating system-specific implementations. + +type mmapper struct { + sync.Mutex + active map[*byte][]byte // active mappings; key is last byte in mapping + mmap func(addr, length uintptr, prot, flags, fd int, offset int64) (uintptr, error) + munmap func(addr uintptr, length uintptr) error +} + +func (m *mmapper) Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { + if length <= 0 { + return nil, EINVAL + } + + // Map the requested memory. + addr, errno := m.mmap(0, uintptr(length), prot, flags, fd, offset) + if errno != nil { + return nil, errno + } + + // Slice memory layout + var sl = struct { + addr uintptr + len int + cap int + }{addr, length, length} + + // Use unsafe to turn sl into a []byte. + b := *(*[]byte)(unsafe.Pointer(&sl)) + + // Register mapping in m and return it. + p := &b[cap(b)-1] + m.Lock() + defer m.Unlock() + m.active[p] = b + return b, nil +} + +func (m *mmapper) Munmap(data []byte) (err error) { + if len(data) == 0 || len(data) != cap(data) { + return EINVAL + } + + // Find the base of the mapping. + p := &data[cap(data)-1] + m.Lock() + defer m.Unlock() + b := m.active[p] + if b == nil || &b[0] != &data[0] { + return EINVAL + } + + // Unmap the memory and update m. + if errno := m.munmap(uintptr(unsafe.Pointer(&b[0])), uintptr(len(b))); errno != nil { + return errno + } + delete(m.active, p) + return nil +} + +func Read(fd int, p []byte) (n int, err error) { + n, err = read(fd, p) + if raceenabled { + if n > 0 { + raceWriteRange(unsafe.Pointer(&p[0]), n) + } + if err == nil { + raceAcquire(unsafe.Pointer(&ioSync)) + } + } + return +} + +func Write(fd int, p []byte) (n int, err error) { + if raceenabled { + raceReleaseMerge(unsafe.Pointer(&ioSync)) + } + n, err = write(fd, p) + if raceenabled && n > 0 { + raceReadRange(unsafe.Pointer(&p[0]), n) + } + return +} + +// For testing: clients can set this flag to force +// creation of IPv6 sockets to return EAFNOSUPPORT. +var SocketDisableIPv6 bool + +type Sockaddr interface { + sockaddr() (ptr unsafe.Pointer, len _Socklen, err error) // lowercase; only we can define Sockaddrs +} + +type SockaddrInet4 struct { + Port int + Addr [4]byte + raw RawSockaddrInet4 +} + +type SockaddrInet6 struct { + Port int + ZoneId uint32 + Addr [16]byte + raw RawSockaddrInet6 +} + +type SockaddrUnix struct { + Name string + raw RawSockaddrUnix +} + +func Bind(fd int, sa Sockaddr) (err error) { + ptr, n, err := sa.sockaddr() + if err != nil { + return err + } + return bind(fd, ptr, n) +} + +func Connect(fd int, sa Sockaddr) (err error) { + ptr, n, err := sa.sockaddr() + if err != nil { + return err + } + return connect(fd, ptr, n) +} + +func Getpeername(fd int) (sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + if err = getpeername(fd, &rsa, &len); err != nil { + return + } + return anyToSockaddr(&rsa) +} + +func GetsockoptInt(fd, level, opt int) (value int, err error) { + var n int32 + vallen := _Socklen(4) + err = getsockopt(fd, level, opt, unsafe.Pointer(&n), &vallen) + return int(n), err +} + +func Recvfrom(fd int, p []byte, flags int) (n int, from Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + if n, err = recvfrom(fd, p, flags, &rsa, &len); err != nil { + return + } + if rsa.Addr.Family != AF_UNSPEC { + from, err = anyToSockaddr(&rsa) + } + return +} + +func Sendto(fd int, p []byte, flags int, to Sockaddr) (err error) { + ptr, n, err := to.sockaddr() + if err != nil { + return err + } + return sendto(fd, p, flags, ptr, n) +} + +func SetsockoptByte(fd, level, opt int, value byte) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(&value), 1) +} + +func SetsockoptInt(fd, level, opt int, value int) (err error) { + var n = int32(value) + return setsockopt(fd, level, opt, unsafe.Pointer(&n), 4) +} + +func SetsockoptInet4Addr(fd, level, opt int, value [4]byte) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(&value[0]), 4) +} + +func SetsockoptIPMreq(fd, level, opt int, mreq *IPMreq) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(mreq), SizeofIPMreq) +} + +func SetsockoptIPv6Mreq(fd, level, opt int, mreq *IPv6Mreq) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(mreq), SizeofIPv6Mreq) +} + +func SetsockoptICMPv6Filter(fd, level, opt int, filter *ICMPv6Filter) error { + return setsockopt(fd, level, opt, unsafe.Pointer(filter), SizeofICMPv6Filter) +} + +func SetsockoptLinger(fd, level, opt int, l *Linger) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(l), SizeofLinger) +} + +func SetsockoptString(fd, level, opt int, s string) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(&[]byte(s)[0]), uintptr(len(s))) +} + +func SetsockoptTimeval(fd, level, opt int, tv *Timeval) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(tv), unsafe.Sizeof(*tv)) +} + +func Socket(domain, typ, proto int) (fd int, err error) { + if domain == AF_INET6 && SocketDisableIPv6 { + return -1, EAFNOSUPPORT + } + fd, err = socket(domain, typ, proto) + return +} + +func Socketpair(domain, typ, proto int) (fd [2]int, err error) { + var fdx [2]int32 + err = socketpair(domain, typ, proto, &fdx) + if err == nil { + fd[0] = int(fdx[0]) + fd[1] = int(fdx[1]) + } + return +} + +func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + if raceenabled { + raceReleaseMerge(unsafe.Pointer(&ioSync)) + } + return sendfile(outfd, infd, offset, count) +} + +var ioSync int64 + +func CloseOnExec(fd int) { fcntl(fd, F_SETFD, FD_CLOEXEC) } + +func SetNonblock(fd int, nonblocking bool) (err error) { + flag, err := fcntl(fd, F_GETFL, 0) + if err != nil { + return err + } + if nonblocking { + flag |= O_NONBLOCK + } else { + flag &= ^O_NONBLOCK + } + _, err = fcntl(fd, F_SETFL, flag) + return err +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_unix_gc.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_unix_gc.go new file mode 100644 index 0000000..4cb8e8e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_unix_gc.go @@ -0,0 +1,15 @@ +// 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris +// +build !gccgo + +package unix + +import "syscall" + +func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) +func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) +func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) +func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_unix_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_unix_test.go new file mode 100644 index 0000000..394b350 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/syscall_unix_test.go @@ -0,0 +1,345 @@ +// 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +package unix_test + +import ( + "flag" + "fmt" + "io/ioutil" + "net" + "os" + "os/exec" + "path/filepath" + "runtime" + "testing" + "time" + + "golang.org/x/sys/unix" +) + +// Tests that below functions, structures and constants are consistent +// on all Unix-like systems. +func _() { + // program scheduling priority functions and constants + var ( + _ func(int, int, int) error = unix.Setpriority + _ func(int, int) (int, error) = unix.Getpriority + ) + const ( + _ int = unix.PRIO_USER + _ int = unix.PRIO_PROCESS + _ int = unix.PRIO_PGRP + ) + + // termios constants + const ( + _ int = unix.TCIFLUSH + _ int = unix.TCIOFLUSH + _ int = unix.TCOFLUSH + ) + + // fcntl file locking structure and constants + var ( + _ = unix.Flock_t{ + Type: int16(0), + Whence: int16(0), + Start: int64(0), + Len: int64(0), + Pid: int32(0), + } + ) + const ( + _ = unix.F_GETLK + _ = unix.F_SETLK + _ = unix.F_SETLKW + ) +} + +// TestFcntlFlock tests whether the file locking structure matches +// the calling convention of each kernel. +func TestFcntlFlock(t *testing.T) { + name := filepath.Join(os.TempDir(), "TestFcntlFlock") + fd, err := unix.Open(name, unix.O_CREAT|unix.O_RDWR|unix.O_CLOEXEC, 0) + if err != nil { + t.Fatalf("Open failed: %v", err) + } + defer unix.Unlink(name) + defer unix.Close(fd) + flock := unix.Flock_t{ + Type: unix.F_RDLCK, + Start: 0, Len: 0, Whence: 1, + } + if err := unix.FcntlFlock(uintptr(fd), unix.F_GETLK, &flock); err != nil { + t.Fatalf("FcntlFlock failed: %v", err) + } +} + +// TestPassFD tests passing a file descriptor over a Unix socket. +// +// This test involved both a parent and child process. The parent +// process is invoked as a normal test, with "go test", which then +// runs the child process by running the current test binary with args +// "-test.run=^TestPassFD$" and an environment variable used to signal +// that the test should become the child process instead. +func TestPassFD(t *testing.T) { + if os.Getenv("GO_WANT_HELPER_PROCESS") == "1" { + passFDChild() + return + } + + tempDir, err := ioutil.TempDir("", "TestPassFD") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(tempDir) + + fds, err := unix.Socketpair(unix.AF_LOCAL, unix.SOCK_STREAM, 0) + if err != nil { + t.Fatalf("Socketpair: %v", err) + } + defer unix.Close(fds[0]) + defer unix.Close(fds[1]) + writeFile := os.NewFile(uintptr(fds[0]), "child-writes") + readFile := os.NewFile(uintptr(fds[1]), "parent-reads") + defer writeFile.Close() + defer readFile.Close() + + cmd := exec.Command(os.Args[0], "-test.run=^TestPassFD$", "--", tempDir) + cmd.Env = []string{"GO_WANT_HELPER_PROCESS=1"} + if lp := os.Getenv("LD_LIBRARY_PATH"); lp != "" { + cmd.Env = append(cmd.Env, "LD_LIBRARY_PATH="+lp) + } + cmd.ExtraFiles = []*os.File{writeFile} + + out, err := cmd.CombinedOutput() + if len(out) > 0 || err != nil { + t.Fatalf("child process: %q, %v", out, err) + } + + c, err := net.FileConn(readFile) + if err != nil { + t.Fatalf("FileConn: %v", err) + } + defer c.Close() + + uc, ok := c.(*net.UnixConn) + if !ok { + t.Fatalf("unexpected FileConn type; expected UnixConn, got %T", c) + } + + buf := make([]byte, 32) // expect 1 byte + oob := make([]byte, 32) // expect 24 bytes + closeUnix := time.AfterFunc(5*time.Second, func() { + t.Logf("timeout reading from unix socket") + uc.Close() + }) + _, oobn, _, _, err := uc.ReadMsgUnix(buf, oob) + closeUnix.Stop() + + scms, err := unix.ParseSocketControlMessage(oob[:oobn]) + if err != nil { + t.Fatalf("ParseSocketControlMessage: %v", err) + } + if len(scms) != 1 { + t.Fatalf("expected 1 SocketControlMessage; got scms = %#v", scms) + } + scm := scms[0] + gotFds, err := unix.ParseUnixRights(&scm) + if err != nil { + t.Fatalf("unix.ParseUnixRights: %v", err) + } + if len(gotFds) != 1 { + t.Fatalf("wanted 1 fd; got %#v", gotFds) + } + + f := os.NewFile(uintptr(gotFds[0]), "fd-from-child") + defer f.Close() + + got, err := ioutil.ReadAll(f) + want := "Hello from child process!\n" + if string(got) != want { + t.Errorf("child process ReadAll: %q, %v; want %q", got, err, want) + } +} + +// passFDChild is the child process used by TestPassFD. +func passFDChild() { + defer os.Exit(0) + + // Look for our fd. It should be fd 3, but we work around an fd leak + // bug here (http://golang.org/issue/2603) to let it be elsewhere. + var uc *net.UnixConn + for fd := uintptr(3); fd <= 10; fd++ { + f := os.NewFile(fd, "unix-conn") + var ok bool + netc, _ := net.FileConn(f) + uc, ok = netc.(*net.UnixConn) + if ok { + break + } + } + if uc == nil { + fmt.Println("failed to find unix fd") + return + } + + // Make a file f to send to our parent process on uc. + // We make it in tempDir, which our parent will clean up. + flag.Parse() + tempDir := flag.Arg(0) + f, err := ioutil.TempFile(tempDir, "") + if err != nil { + fmt.Printf("TempFile: %v", err) + return + } + + f.Write([]byte("Hello from child process!\n")) + f.Seek(0, 0) + + rights := unix.UnixRights(int(f.Fd())) + dummyByte := []byte("x") + n, oobn, err := uc.WriteMsgUnix(dummyByte, rights, nil) + if err != nil { + fmt.Printf("WriteMsgUnix: %v", err) + return + } + if n != 1 || oobn != len(rights) { + fmt.Printf("WriteMsgUnix = %d, %d; want 1, %d", n, oobn, len(rights)) + return + } +} + +// TestUnixRightsRoundtrip tests that UnixRights, ParseSocketControlMessage, +// and ParseUnixRights are able to successfully round-trip lists of file descriptors. +func TestUnixRightsRoundtrip(t *testing.T) { + testCases := [...][][]int{ + {{42}}, + {{1, 2}}, + {{3, 4, 5}}, + {{}}, + {{1, 2}, {3, 4, 5}, {}, {7}}, + } + for _, testCase := range testCases { + b := []byte{} + var n int + for _, fds := range testCase { + // Last assignment to n wins + n = len(b) + unix.CmsgLen(4*len(fds)) + b = append(b, unix.UnixRights(fds...)...) + } + // Truncate b + b = b[:n] + + scms, err := unix.ParseSocketControlMessage(b) + if err != nil { + t.Fatalf("ParseSocketControlMessage: %v", err) + } + if len(scms) != len(testCase) { + t.Fatalf("expected %v SocketControlMessage; got scms = %#v", len(testCase), scms) + } + for i, scm := range scms { + gotFds, err := unix.ParseUnixRights(&scm) + if err != nil { + t.Fatalf("ParseUnixRights: %v", err) + } + wantFds := testCase[i] + if len(gotFds) != len(wantFds) { + t.Fatalf("expected %v fds, got %#v", len(wantFds), gotFds) + } + for j, fd := range gotFds { + if fd != wantFds[j] { + t.Fatalf("expected fd %v, got %v", wantFds[j], fd) + } + } + } + } +} + +func TestRlimit(t *testing.T) { + var rlimit, zero unix.Rlimit + err := unix.Getrlimit(unix.RLIMIT_NOFILE, &rlimit) + if err != nil { + t.Fatalf("Getrlimit: save failed: %v", err) + } + if zero == rlimit { + t.Fatalf("Getrlimit: save failed: got zero value %#v", rlimit) + } + set := rlimit + set.Cur = set.Max - 1 + err = unix.Setrlimit(unix.RLIMIT_NOFILE, &set) + if err != nil { + t.Fatalf("Setrlimit: set failed: %#v %v", set, err) + } + var get unix.Rlimit + err = unix.Getrlimit(unix.RLIMIT_NOFILE, &get) + if err != nil { + t.Fatalf("Getrlimit: get failed: %v", err) + } + set = rlimit + set.Cur = set.Max - 1 + if set != get { + // Seems like Darwin requires some privilege to + // increase the soft limit of rlimit sandbox, though + // Setrlimit never reports an error. + switch runtime.GOOS { + case "darwin": + default: + t.Fatalf("Rlimit: change failed: wanted %#v got %#v", set, get) + } + } + err = unix.Setrlimit(unix.RLIMIT_NOFILE, &rlimit) + if err != nil { + t.Fatalf("Setrlimit: restore failed: %#v %v", rlimit, err) + } +} + +func TestSeekFailure(t *testing.T) { + _, err := unix.Seek(-1, 0, 0) + if err == nil { + t.Fatalf("Seek(-1, 0, 0) did not fail") + } + str := err.Error() // used to crash on Linux + t.Logf("Seek: %v", str) + if str == "" { + t.Fatalf("Seek(-1, 0, 0) return error with empty message") + } +} + +func TestDup(t *testing.T) { + file, err := ioutil.TempFile("", "TestDup") + if err != nil { + t.Fatalf("Tempfile failed: %v", err) + } + defer os.Remove(file.Name()) + defer file.Close() + f := int(file.Fd()) + + newFd, err := unix.Dup(f) + if err != nil { + t.Fatalf("Dup: %v", err) + } + + err = unix.Dup2(newFd, newFd+1) + if err != nil { + t.Fatalf("Dup2: %v", err) + } + + b1 := []byte("Test123") + b2 := make([]byte, 7) + _, err = unix.Write(newFd+1, b1) + if err != nil { + t.Fatalf("Write to dup2 fd failed: %v", err) + } + _, err = unix.Seek(f, 0, 0) + _, err = unix.Read(f, b2) + if err != nil { + t.Fatalf("Read back failed: %v", err) + } + if string(b1) != string(b2) { + t.Errorf("Dup: stdout write not in file, expected %v, got %v", string(b1), string(b2)) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/types_darwin.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/types_darwin.go new file mode 100644 index 0000000..415124d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/types_darwin.go @@ -0,0 +1,254 @@ +// 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. + +// +build ignore + +/* +Input to cgo -godefs. See README.md +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define __DARWIN_UNIX03 0 +#define KERNEL +#define _DARWIN_USE_64_BIT_INODE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +*/ +import "C" + +// Machine characteristics; for internal use. + +const ( + sizeofPtr = C.sizeofPtr + sizeofShort = C.sizeof_short + sizeofInt = C.sizeof_int + sizeofLong = C.sizeof_long + sizeofLongLong = C.sizeof_longlong +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +type Timeval32 C.struct_timeval32 + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +type Stat_t C.struct_stat64 + +type Statfs_t C.struct_statfs64 + +type Flock_t C.struct_flock + +type Fstore_t C.struct_fstore + +type Radvisory_t C.struct_radvisory + +type Fbootstraptransfer_t C.struct_fbootstraptransfer + +type Log2phys_t C.struct_log2phys + +type Fsid C.struct_fsid + +type Dirent C.struct_dirent + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet4Pktinfo C.struct_in_pktinfo + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet4Pktinfo = C.sizeof_struct_in_pktinfo + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Ptrace requests + +const ( + PTRACE_TRACEME = C.PT_TRACE_ME + PTRACE_CONT = C.PT_CONTINUE + PTRACE_KILL = C.PT_KILL +) + +// Events (kqueue, kevent) + +type Kevent_t C.struct_kevent + +// Select + +type FdSet C.fd_set + +// Routing and interface messages + +const ( + SizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfData = C.sizeof_struct_if_data + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofIfmaMsghdr = C.sizeof_struct_ifma_msghdr + SizeofIfmaMsghdr2 = C.sizeof_struct_ifma_msghdr2 + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type IfMsghdr C.struct_if_msghdr + +type IfData C.struct_if_data + +type IfaMsghdr C.struct_ifa_msghdr + +type IfmaMsghdr C.struct_ifma_msghdr + +type IfmaMsghdr2 C.struct_ifma_msghdr2 + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfHdr C.struct_bpf_hdr + +// Terminal handling + +type Termios C.struct_termios + +type Winsize C.struct_winsize + +// fchmodat-like syscalls. + +const ( + AT_FDCWD = C.AT_FDCWD + AT_REMOVEDIR = C.AT_REMOVEDIR + AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/types_dragonfly.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/types_dragonfly.go new file mode 100644 index 0000000..80b2778 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/types_dragonfly.go @@ -0,0 +1,249 @@ +// 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. + +// +build ignore + +/* +Input to cgo -godefs. See README.md +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define KERNEL +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +*/ +import "C" + +// Machine characteristics; for internal use. + +const ( + sizeofPtr = C.sizeofPtr + sizeofShort = C.sizeof_short + sizeofInt = C.sizeof_int + sizeofLong = C.sizeof_long + sizeofLongLong = C.sizeof_longlong +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +const ( // Directory mode bits + S_IFMT = C.S_IFMT + S_IFIFO = C.S_IFIFO + S_IFCHR = C.S_IFCHR + S_IFDIR = C.S_IFDIR + S_IFBLK = C.S_IFBLK + S_IFREG = C.S_IFREG + S_IFLNK = C.S_IFLNK + S_IFSOCK = C.S_IFSOCK + S_ISUID = C.S_ISUID + S_ISGID = C.S_ISGID + S_ISVTX = C.S_ISVTX + S_IRUSR = C.S_IRUSR + S_IWUSR = C.S_IWUSR + S_IXUSR = C.S_IXUSR +) + +type Stat_t C.struct_stat + +type Statfs_t C.struct_statfs + +type Flock_t C.struct_flock + +type Dirent C.struct_dirent + +type Fsid C.struct_fsid + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Ptrace requests + +const ( + PTRACE_TRACEME = C.PT_TRACE_ME + PTRACE_CONT = C.PT_CONTINUE + PTRACE_KILL = C.PT_KILL +) + +// Events (kqueue, kevent) + +type Kevent_t C.struct_kevent + +// Select + +type FdSet C.fd_set + +// Routing and interface messages + +const ( + SizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfData = C.sizeof_struct_if_data + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofIfmaMsghdr = C.sizeof_struct_ifma_msghdr + SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type IfMsghdr C.struct_if_msghdr + +type IfData C.struct_if_data + +type IfaMsghdr C.struct_ifa_msghdr + +type IfmaMsghdr C.struct_ifma_msghdr + +type IfAnnounceMsghdr C.struct_if_announcemsghdr + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfHdr C.struct_bpf_hdr + +// Terminal handling + +type Termios C.struct_termios + +// fchmodat-like syscalls. + +const ( + AT_FDCWD = C.AT_FDCWD + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/types_freebsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/types_freebsd.go new file mode 100644 index 0000000..934fd7a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/types_freebsd.go @@ -0,0 +1,372 @@ +// 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. + +// +build ignore + +/* +Input to cgo -godefs. See README.md +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define KERNEL +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +// This structure is a duplicate of stat on FreeBSD 8-STABLE. +// See /usr/include/sys/stat.h. +struct stat8 { +#undef st_atimespec st_atim +#undef st_mtimespec st_mtim +#undef st_ctimespec st_ctim +#undef st_birthtimespec st_birthtim + __dev_t st_dev; + ino_t st_ino; + mode_t st_mode; + nlink_t st_nlink; + uid_t st_uid; + gid_t st_gid; + __dev_t st_rdev; +#if __BSD_VISIBLE + struct timespec st_atimespec; + struct timespec st_mtimespec; + struct timespec st_ctimespec; +#else + time_t st_atime; + long __st_atimensec; + time_t st_mtime; + long __st_mtimensec; + time_t st_ctime; + long __st_ctimensec; +#endif + off_t st_size; + blkcnt_t st_blocks; + blksize_t st_blksize; + fflags_t st_flags; + __uint32_t st_gen; + __int32_t st_lspare; +#if __BSD_VISIBLE + struct timespec st_birthtimespec; + unsigned int :(8 / 2) * (16 - (int)sizeof(struct timespec)); + unsigned int :(8 / 2) * (16 - (int)sizeof(struct timespec)); +#else + time_t st_birthtime; + long st_birthtimensec; + unsigned int :(8 / 2) * (16 - (int)sizeof(struct __timespec)); + unsigned int :(8 / 2) * (16 - (int)sizeof(struct __timespec)); +#endif +}; + +// This structure is a duplicate of if_data on FreeBSD 8-STABLE. +// See /usr/include/net/if.h. +struct if_data8 { + u_char ifi_type; + u_char ifi_physical; + u_char ifi_addrlen; + u_char ifi_hdrlen; + u_char ifi_link_state; + u_char ifi_spare_char1; + u_char ifi_spare_char2; + u_char ifi_datalen; + u_long ifi_mtu; + u_long ifi_metric; + u_long ifi_baudrate; + u_long ifi_ipackets; + u_long ifi_ierrors; + u_long ifi_opackets; + u_long ifi_oerrors; + u_long ifi_collisions; + u_long ifi_ibytes; + u_long ifi_obytes; + u_long ifi_imcasts; + u_long ifi_omcasts; + u_long ifi_iqdrops; + u_long ifi_noproto; + u_long ifi_hwassist; +// FIXME: these are now unions, so maybe need to change definitions? +#undef ifi_epoch + time_t ifi_epoch; +#undef ifi_lastchange + struct timeval ifi_lastchange; +}; + +// This structure is a duplicate of if_msghdr on FreeBSD 8-STABLE. +// See /usr/include/net/if.h. +struct if_msghdr8 { + u_short ifm_msglen; + u_char ifm_version; + u_char ifm_type; + int ifm_addrs; + int ifm_flags; + u_short ifm_index; + struct if_data8 ifm_data; +}; +*/ +import "C" + +// Machine characteristics; for internal use. + +const ( + sizeofPtr = C.sizeofPtr + sizeofShort = C.sizeof_short + sizeofInt = C.sizeof_int + sizeofLong = C.sizeof_long + sizeofLongLong = C.sizeof_longlong +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +const ( // Directory mode bits + S_IFMT = C.S_IFMT + S_IFIFO = C.S_IFIFO + S_IFCHR = C.S_IFCHR + S_IFDIR = C.S_IFDIR + S_IFBLK = C.S_IFBLK + S_IFREG = C.S_IFREG + S_IFLNK = C.S_IFLNK + S_IFSOCK = C.S_IFSOCK + S_ISUID = C.S_ISUID + S_ISGID = C.S_ISGID + S_ISVTX = C.S_ISVTX + S_IRUSR = C.S_IRUSR + S_IWUSR = C.S_IWUSR + S_IXUSR = C.S_IXUSR +) + +type Stat_t C.struct_stat8 + +type Statfs_t C.struct_statfs + +type Flock_t C.struct_flock + +type Dirent C.struct_dirent + +type Fsid C.struct_fsid + +// Advice to Fadvise + +const ( + FADV_NORMAL = C.POSIX_FADV_NORMAL + FADV_RANDOM = C.POSIX_FADV_RANDOM + FADV_SEQUENTIAL = C.POSIX_FADV_SEQUENTIAL + FADV_WILLNEED = C.POSIX_FADV_WILLNEED + FADV_DONTNEED = C.POSIX_FADV_DONTNEED + FADV_NOREUSE = C.POSIX_FADV_NOREUSE +) + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPMreqn C.struct_ip_mreqn + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPMreqn = C.sizeof_struct_ip_mreqn + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Ptrace requests + +const ( + PTRACE_TRACEME = C.PT_TRACE_ME + PTRACE_CONT = C.PT_CONTINUE + PTRACE_KILL = C.PT_KILL +) + +// Events (kqueue, kevent) + +type Kevent_t C.struct_kevent + +// Select + +type FdSet C.fd_set + +// Routing and interface messages + +const ( + sizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfMsghdr = C.sizeof_struct_if_msghdr8 + sizeofIfData = C.sizeof_struct_if_data + SizeofIfData = C.sizeof_struct_if_data8 + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofIfmaMsghdr = C.sizeof_struct_ifma_msghdr + SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type ifMsghdr C.struct_if_msghdr + +type IfMsghdr C.struct_if_msghdr8 + +type ifData C.struct_if_data + +type IfData C.struct_if_data8 + +type IfaMsghdr C.struct_ifa_msghdr + +type IfmaMsghdr C.struct_ifma_msghdr + +type IfAnnounceMsghdr C.struct_if_announcemsghdr + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfZbuf = C.sizeof_struct_bpf_zbuf + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr + SizeofBpfZbufHeader = C.sizeof_struct_bpf_zbuf_header +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfZbuf C.struct_bpf_zbuf + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfHdr C.struct_bpf_hdr + +type BpfZbufHeader C.struct_bpf_zbuf_header + +// Terminal handling + +type Termios C.struct_termios + +type Winsize C.struct_winsize + +// fchmodat-like syscalls. + +const ( + AT_FDCWD = C.AT_FDCWD + AT_REMOVEDIR = C.AT_REMOVEDIR + AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW +) + +// Capabilities + +type CapRights C.struct_cap_rights diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/types_netbsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/types_netbsd.go new file mode 100644 index 0000000..cb95c80 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/types_netbsd.go @@ -0,0 +1,239 @@ +// 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. + +// +build ignore + +/* +Input to cgo -godefs. See README.md +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define KERNEL +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +*/ +import "C" + +// Machine characteristics; for internal use. + +const ( + sizeofPtr = C.sizeofPtr + sizeofShort = C.sizeof_short + sizeofInt = C.sizeof_int + sizeofLong = C.sizeof_long + sizeofLongLong = C.sizeof_longlong +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +type Stat_t C.struct_stat + +type Statfs_t C.struct_statfs + +type Flock_t C.struct_flock + +type Dirent C.struct_dirent + +type Fsid C.fsid_t + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Ptrace requests + +const ( + PTRACE_TRACEME = C.PT_TRACE_ME + PTRACE_CONT = C.PT_CONTINUE + PTRACE_KILL = C.PT_KILL +) + +// Events (kqueue, kevent) + +type Kevent_t C.struct_kevent + +// Select + +type FdSet C.fd_set + +// Routing and interface messages + +const ( + SizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfData = C.sizeof_struct_if_data + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type IfMsghdr C.struct_if_msghdr + +type IfData C.struct_if_data + +type IfaMsghdr C.struct_ifa_msghdr + +type IfAnnounceMsghdr C.struct_if_announcemsghdr + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +type Mclpool C.struct_mclpool + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfHdr C.struct_bpf_hdr + +type BpfTimeval C.struct_bpf_timeval + +// Terminal handling + +type Termios C.struct_termios + +// fchmodat-like syscalls. + +const ( + AT_FDCWD = C.AT_FDCWD + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW +) + +// Sysctl + +type Sysctlnode C.struct_sysctlnode diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/types_openbsd.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/types_openbsd.go new file mode 100644 index 0000000..392da69 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/types_openbsd.go @@ -0,0 +1,251 @@ +// 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. + +// +build ignore + +/* +Input to cgo -godefs. See README.md +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define KERNEL +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +*/ +import "C" + +// Machine characteristics; for internal use. + +const ( + sizeofPtr = C.sizeofPtr + sizeofShort = C.sizeof_short + sizeofInt = C.sizeof_int + sizeofLong = C.sizeof_long + sizeofLongLong = C.sizeof_longlong +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +const ( // Directory mode bits + S_IFMT = C.S_IFMT + S_IFIFO = C.S_IFIFO + S_IFCHR = C.S_IFCHR + S_IFDIR = C.S_IFDIR + S_IFBLK = C.S_IFBLK + S_IFREG = C.S_IFREG + S_IFLNK = C.S_IFLNK + S_IFSOCK = C.S_IFSOCK + S_ISUID = C.S_ISUID + S_ISGID = C.S_ISGID + S_ISVTX = C.S_ISVTX + S_IRUSR = C.S_IRUSR + S_IWUSR = C.S_IWUSR + S_IXUSR = C.S_IXUSR +) + +type Stat_t C.struct_stat + +type Statfs_t C.struct_statfs + +type Flock_t C.struct_flock + +type Dirent C.struct_dirent + +type Fsid C.fsid_t + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Ptrace requests + +const ( + PTRACE_TRACEME = C.PT_TRACE_ME + PTRACE_CONT = C.PT_CONTINUE + PTRACE_KILL = C.PT_KILL +) + +// Events (kqueue, kevent) + +type Kevent_t C.struct_kevent + +// Select + +type FdSet C.fd_set + +// Routing and interface messages + +const ( + SizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfData = C.sizeof_struct_if_data + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type IfMsghdr C.struct_if_msghdr + +type IfData C.struct_if_data + +type IfaMsghdr C.struct_ifa_msghdr + +type IfAnnounceMsghdr C.struct_if_announcemsghdr + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +type Mclpool C.struct_mclpool + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfHdr C.struct_bpf_hdr + +type BpfTimeval C.struct_bpf_timeval + +// Terminal handling + +type Termios C.struct_termios + +// fchmodat-like syscalls. + +const ( + AT_FDCWD = C.AT_FDCWD + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/types_solaris.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/types_solaris.go new file mode 100644 index 0000000..6d74614 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/types_solaris.go @@ -0,0 +1,265 @@ +// 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. + +// +build ignore + +/* +Input to cgo -godefs. See README.md +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define KERNEL +// These defines ensure that builds done on newer versions of Solaris are +// backwards-compatible with older versions of Solaris and +// OpenSolaris-based derivatives. +#define __USE_SUNOS_SOCKETS__ // msghdr +#define __USE_LEGACY_PROTOTYPES__ // iovec +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +*/ +import "C" + +// Machine characteristics; for internal use. + +const ( + sizeofPtr = C.sizeofPtr + sizeofShort = C.sizeof_short + sizeofInt = C.sizeof_int + sizeofLong = C.sizeof_long + sizeofLongLong = C.sizeof_longlong + PathMax = C.PATH_MAX + MaxHostNameLen = C.MAXHOSTNAMELEN +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +type Timeval32 C.struct_timeval32 + +type Tms C.struct_tms + +type Utimbuf C.struct_utimbuf + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +const ( // Directory mode bits + S_IFMT = C.S_IFMT + S_IFIFO = C.S_IFIFO + S_IFCHR = C.S_IFCHR + S_IFDIR = C.S_IFDIR + S_IFBLK = C.S_IFBLK + S_IFREG = C.S_IFREG + S_IFLNK = C.S_IFLNK + S_IFSOCK = C.S_IFSOCK + S_ISUID = C.S_ISUID + S_ISGID = C.S_ISGID + S_ISVTX = C.S_ISVTX + S_IRUSR = C.S_IRUSR + S_IWUSR = C.S_IWUSR + S_IXUSR = C.S_IXUSR +) + +type Stat_t C.struct_stat + +type Flock_t C.struct_flock + +type Dirent C.struct_dirent + +// Filesystems + +type _Fsblkcnt_t C.fsblkcnt_t + +type Statvfs_t C.struct_statvfs + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Select + +type FdSet C.fd_set + +// Misc + +type Utsname C.struct_utsname + +type Ustat_t C.struct_ustat + +const ( + AT_FDCWD = C.AT_FDCWD + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW + AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW + AT_REMOVEDIR = C.AT_REMOVEDIR + AT_EACCESS = C.AT_EACCESS +) + +// Routing and interface messages + +const ( + SizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfData = C.sizeof_struct_if_data + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type IfMsghdr C.struct_if_msghdr + +type IfData C.struct_if_data + +type IfaMsghdr C.struct_ifa_msghdr + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfTimeval C.struct_bpf_timeval + +type BpfHdr C.struct_bpf_hdr + +// Terminal handling + +type Termios C.struct_termios + +type Termio C.struct_termio + +type Winsize C.struct_winsize diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_darwin_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_darwin_386.go new file mode 100644 index 0000000..1c68758 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_darwin_386.go @@ -0,0 +1,1673 @@ +// mkerrors.sh -m32 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,darwin + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m32 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1c + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1e + AF_IPX = 0x17 + AF_ISDN = 0x1c + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x28 + AF_NATM = 0x1f + AF_NDRV = 0x1b + AF_NETBIOS = 0x21 + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PPP = 0x22 + AF_PUP = 0x4 + AF_RESERVED_36 = 0x24 + AF_ROUTE = 0x11 + AF_SIP = 0x18 + AF_SNA = 0xb + AF_SYSTEM = 0x20 + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_UTUN = 0x26 + ALTWERASE = 0x200 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B9600 = 0x2580 + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc00c4279 + BIOCGETIF = 0x4020426b + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4008426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044278 + BIOCSETF = 0x80084267 + BIOCSETFNR = 0x8008427e + BIOCSETIF = 0x8020426c + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8008426d + BIOCSSEESENT = 0x80044277 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x8000 + BSDLY = 0x8000 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_MONOTONIC_RAW_APPROX = 0x5 + CLOCK_PROCESS_CPUTIME_ID = 0xc + CLOCK_REALTIME = 0x0 + CLOCK_THREAD_CPUTIME_ID = 0x10 + CLOCK_UPTIME_RAW = 0x8 + CLOCK_UPTIME_RAW_APPROX = 0x9 + CR0 = 0x0 + CR1 = 0x1000 + CR2 = 0x2000 + CR3 = 0x3000 + CRDLY = 0x3000 + CREAD = 0x800 + CRTSCTS = 0x30000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0xf5 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_EXCEPT = -0xf + EVFILT_FS = -0x9 + EVFILT_MACHPORT = -0x8 + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xf + EVFILT_THREADMARKER = 0xf + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xa + EVFILT_VM = -0xc + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_DISPATCH2 = 0x180 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG0 = 0x1000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_OOBAND = 0x2000 + EV_POLL = 0x1000 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EV_UDATA_SPECIFIC = 0x100 + EV_VANISHED = 0x200 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x4000 + FFDLY = 0x4000 + FLUSHO = 0x800000 + F_ADDFILESIGS = 0x3d + F_ADDFILESIGS_FOR_DYLD_SIM = 0x53 + F_ADDFILESIGS_RETURN = 0x61 + F_ADDSIGS = 0x3b + F_ALLOCATEALL = 0x4 + F_ALLOCATECONTIG = 0x2 + F_BARRIERFSYNC = 0x55 + F_CHECK_LV = 0x62 + F_CHKCLEAN = 0x29 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x43 + F_FINDSIGS = 0x4e + F_FLUSH_DATA = 0x28 + F_FREEZE_FS = 0x35 + F_FULLFSYNC = 0x33 + F_GETCODEDIR = 0x48 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETLKPID = 0x42 + F_GETNOSIGPIPE = 0x4a + F_GETOWN = 0x5 + F_GETPATH = 0x32 + F_GETPATH_MTMINFO = 0x47 + F_GETPROTECTIONCLASS = 0x3f + F_GETPROTECTIONLEVEL = 0x4d + F_GLOBAL_NOCACHE = 0x37 + F_LOG2PHYS = 0x31 + F_LOG2PHYS_EXT = 0x41 + F_NOCACHE = 0x30 + F_NODIRECT = 0x3e + F_OK = 0x0 + F_PATHPKG_CHECK = 0x34 + F_PEOFPOSMODE = 0x3 + F_PREALLOCATE = 0x2a + F_RDADVISE = 0x2c + F_RDAHEAD = 0x2d + F_RDLCK = 0x1 + F_SETBACKINGSTORE = 0x46 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETLKWTIMEOUT = 0xa + F_SETNOSIGPIPE = 0x49 + F_SETOWN = 0x6 + F_SETPROTECTIONCLASS = 0x40 + F_SETSIZE = 0x2b + F_SINGLE_WRITER = 0x4c + F_THAW_FS = 0x36 + F_TRANSCODEKEY = 0x4b + F_UNLCK = 0x2 + F_VOLPOSMODE = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_AAL5 = 0x31 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ATM = 0x25 + IFT_BRIDGE = 0xd1 + IFT_CARP = 0xf8 + IFT_CELLULAR = 0xff + IFT_CEPT = 0x13 + IFT_DS3 = 0x1e + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_ETHER = 0x6 + IFT_FAITH = 0x38 + IFT_FDDI = 0xf + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_GIF = 0x37 + IFT_HDH1822 = 0x3 + IFT_HIPPI = 0x2f + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IEEE1394 = 0x90 + IFT_IEEE8023ADLAG = 0x88 + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88026 = 0xa + IFT_L2VLAN = 0x87 + IFT_LAPB = 0x10 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_NSIP = 0x1b + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PDP = 0xff + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PKTAP = 0xfe + IFT_PPP = 0x17 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PTPSERIAL = 0x16 + IFT_RS232 = 0x21 + IFT_SDLC = 0x11 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_STARLAN = 0xb + IFT_STF = 0x39 + IFT_T1 = 0x12 + IFT_ULTRA = 0x1d + IFT_V35 = 0x2d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LINKLOCALNETNUM = 0xa9fe0000 + IN_LOOPBACKNET = 0x7f + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0xfe + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MEAS = 0x13 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEP = 0x21 + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_2292DSTOPTS = 0x17 + IPV6_2292HOPLIMIT = 0x14 + IPV6_2292HOPOPTS = 0x16 + IPV6_2292NEXTHOP = 0x15 + IPV6_2292PKTINFO = 0x13 + IPV6_2292PKTOPTIONS = 0x19 + IPV6_2292RTHDR = 0x18 + IPV6_BINDV6ONLY = 0x1b + IPV6_BOUND_IF = 0x7d + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x3c + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVTCLASS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x24 + IPV6_UNICAST_HOPS = 0x4 + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BLOCK_SOURCE = 0x48 + IP_BOUND_IF = 0x19 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FAITH = 0x16 + IP_FW_ADD = 0x28 + IP_FW_DEL = 0x29 + IP_FW_FLUSH = 0x2a + IP_FW_GET = 0x2c + IP_FW_RESETLOG = 0x2d + IP_FW_ZERO = 0x2b + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MF = 0x2000 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_IFINDEX = 0x42 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_NAT__XXX = 0x37 + IP_OFFMASK = 0x1fff + IP_OLD_FW_ADD = 0x32 + IP_OLD_FW_DEL = 0x33 + IP_OLD_FW_FLUSH = 0x34 + IP_OLD_FW_GET = 0x36 + IP_OLD_FW_RESETLOG = 0x38 + IP_OLD_FW_ZERO = 0x35 + IP_OPTIONS = 0x1 + IP_PKTINFO = 0x1a + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVPKTINFO = 0x1a + IP_RECVRETOPTS = 0x6 + IP_RECVTTL = 0x18 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_STRIPHDR = 0x17 + IP_TOS = 0x3 + IP_TRAFFIC_MGT_BACKGROUND = 0x41 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_CAN_REUSE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_FREE_REUSABLE = 0x7 + MADV_FREE_REUSE = 0x8 + MADV_NORMAL = 0x0 + MADV_PAGEOUT = 0xa + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MADV_ZERO_WIRED_PAGES = 0x6 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_JIT = 0x800 + MAP_NOCACHE = 0x400 + MAP_NOEXTEND = 0x100 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_RESERVED0080 = 0x80 + MAP_RESILIENT_CODESIGN = 0x2000 + MAP_RESILIENT_MEDIA = 0x4000 + MAP_SHARED = 0x1 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x400000 + MNT_CMDFLAGS = 0xf0000 + MNT_CPROTECT = 0x80 + MNT_DEFWRITE = 0x2000000 + MNT_DONTBROWSE = 0x100000 + MNT_DOVOLFS = 0x8000 + MNT_DWAIT = 0x4 + MNT_EXPORTED = 0x100 + MNT_FORCE = 0x80000 + MNT_IGNORE_OWNERSHIP = 0x200000 + MNT_JOURNALED = 0x800000 + MNT_LOCAL = 0x1000 + MNT_MULTILABEL = 0x4000000 + MNT_NOATIME = 0x10000000 + MNT_NOBLOCK = 0x20000 + MNT_NODEV = 0x10 + MNT_NOEXEC = 0x4 + MNT_NOSUID = 0x8 + MNT_NOUSERXATTR = 0x1000000 + MNT_NOWAIT = 0x2 + MNT_QUARANTINE = 0x400 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UNKNOWNPERMISSIONS = 0x200000 + MNT_UPDATE = 0x10000 + MNT_VISFLAGMASK = 0x17f0f5ff + MNT_WAIT = 0x1 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_FLUSH = 0x400 + MSG_HAVEMORE = 0x2000 + MSG_HOLD = 0x800 + MSG_NEEDSA = 0x10000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_RCVMORE = 0x4000 + MSG_SEND = 0x1000 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITSTREAM = 0x200 + MS_ASYNC = 0x1 + MS_DEACTIVATE = 0x8 + MS_INVALIDATE = 0x2 + MS_KILLPAGES = 0x4 + MS_SYNC = 0x10 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_DUMP2 = 0x7 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLIST2 = 0x6 + NET_RT_MAXID = 0xa + NET_RT_STAT = 0x4 + NET_RT_TRASH = 0x5 + NL0 = 0x0 + NL1 = 0x100 + NL2 = 0x200 + NL3 = 0x300 + NLDLY = 0x300 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ABSOLUTE = 0x8 + NOTE_ATTRIB = 0x8 + NOTE_BACKGROUND = 0x40 + NOTE_CHILD = 0x4 + NOTE_CRITICAL = 0x20 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXITSTATUS = 0x4000000 + NOTE_EXIT_CSERROR = 0x40000 + NOTE_EXIT_DECRYPTFAIL = 0x10000 + NOTE_EXIT_DETAIL = 0x2000000 + NOTE_EXIT_DETAIL_MASK = 0x70000 + NOTE_EXIT_MEMORY = 0x20000 + NOTE_EXIT_REPARENTED = 0x80000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FORK = 0x40000000 + NOTE_FUNLOCK = 0x100 + NOTE_LEEWAY = 0x10 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_MACH_CONTINUOUS_TIME = 0x80 + NOTE_NONE = 0x80 + NOTE_NSECONDS = 0x4 + NOTE_OOB = 0x2 + NOTE_PCTRLMASK = -0x100000 + NOTE_PDATAMASK = 0xfffff + NOTE_REAP = 0x10000000 + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_SIGNAL = 0x8000000 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x2 + NOTE_VM_ERROR = 0x10000000 + NOTE_VM_PRESSURE = 0x80000000 + NOTE_VM_PRESSURE_SUDDEN_TERMINATE = 0x20000000 + NOTE_VM_PRESSURE_TERMINATE = 0x40000000 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OFDEL = 0x20000 + OFILL = 0x80 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_ALERT = 0x20000000 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x1000000 + O_CREAT = 0x200 + O_DIRECTORY = 0x100000 + O_DP_GETRAWENCRYPTED = 0x1 + O_DP_GETRAWUNENCRYPTED = 0x2 + O_DSYNC = 0x400000 + O_EVTONLY = 0x8000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x20000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_POPUP = 0x80000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYMLINK = 0x200000 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PT_ATTACH = 0xa + PT_ATTACHEXC = 0xe + PT_CONTINUE = 0x7 + PT_DENY_ATTACH = 0x1f + PT_DETACH = 0xb + PT_FIRSTMACH = 0x20 + PT_FORCEQUOTA = 0x1e + PT_KILL = 0x8 + PT_READ_D = 0x2 + PT_READ_I = 0x1 + PT_READ_U = 0x3 + PT_SIGEXC = 0xc + PT_STEP = 0x9 + PT_THUPDATE = 0xd + PT_TRACE_ME = 0x0 + PT_WRITE_D = 0x5 + PT_WRITE_I = 0x4 + PT_WRITE_U = 0x6 + RLIMIT_AS = 0x5 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_CPU_USAGE_MONITOR = 0x2 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_CLONING = 0x100 + RTF_CONDEMNED = 0x2000000 + RTF_DELCLONE = 0x80 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_IFREF = 0x4000000 + RTF_IFSCOPE = 0x1000000 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_NOIFREF = 0x2000 + RTF_PINNED = 0x100000 + RTF_PRCLONING = 0x10000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_PROXY = 0x8000000 + RTF_REJECT = 0x8 + RTF_ROUTER = 0x10000000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_WASCLONED = 0x20000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_GET2 = 0x14 + RTM_IFINFO = 0xe + RTM_IFINFO2 = 0x12 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_NEWMADDR2 = 0x13 + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SCM_TIMESTAMP_MONOTONIC = 0x4 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCARPIPLL = 0xc0206928 + SIOCATMARK = 0x40047307 + SIOCAUTOADDR = 0xc0206926 + SIOCAUTONETMASK = 0x80206927 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFPHYADDR = 0x80206941 + SIOCGDRVSPEC = 0xc01c697b + SIOCGETVLAN = 0xc020697f + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFALTMTU = 0xc0206948 + SIOCGIFASYNCMAP = 0xc020697c + SIOCGIFBOND = 0xc0206947 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020695b + SIOCGIFCONF = 0xc0086924 + SIOCGIFDEVMTU = 0xc0206944 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFKPI = 0xc0206987 + SIOCGIFMAC = 0xc0206982 + SIOCGIFMEDIA = 0xc0286938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206940 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc020693f + SIOCGIFSTATUS = 0xc331693d + SIOCGIFVLAN = 0xc020697f + SIOCGIFWAKEFLAGS = 0xc0206988 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCIFCREATE = 0xc0206978 + SIOCIFCREATE2 = 0xc020697a + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc00c6981 + SIOCRSLVMULTI = 0xc008693b + SIOCSDRVSPEC = 0x801c697b + SIOCSETVLAN = 0x8020697e + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFALTMTU = 0x80206945 + SIOCSIFASYNCMAP = 0x8020697d + SIOCSIFBOND = 0x80206946 + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020695a + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFKPI = 0x80206986 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206983 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x8040693e + SIOCSIFPHYS = 0x80206936 + SIOCSIFVLAN = 0x8020697e + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_DONTTRUNC = 0x2000 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1010 + SO_LINGER = 0x80 + SO_LINGER_SEC = 0x1080 + SO_NETSVC_MARKING_LEVEL = 0x1119 + SO_NET_SERVICE_TYPE = 0x1116 + SO_NKE = 0x1021 + SO_NOADDRERR = 0x1023 + SO_NOSIGPIPE = 0x1022 + SO_NOTIFYCONFLICT = 0x1026 + SO_NP_EXTENSIONS = 0x1083 + SO_NREAD = 0x1020 + SO_NUMRCVPKT = 0x1112 + SO_NWRITE = 0x1024 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1011 + SO_RANDOMPORT = 0x1082 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_REUSESHAREUID = 0x1025 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TIMESTAMP_MONOTONIC = 0x800 + SO_TYPE = 0x1008 + SO_UPCALLCLOSEWAIT = 0x1027 + SO_USELOOPBACK = 0x40 + SO_WANTMORE = 0x4000 + SO_WANTOOBFLAG = 0x8000 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFWHT = 0xe000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x400 + TAB2 = 0x800 + TAB3 = 0x4 + TABDLY = 0xc04 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCP_CONNECTIONTIMEOUT = 0x20 + TCP_CONNECTION_INFO = 0x106 + TCP_ENABLE_ECN = 0x104 + TCP_FASTOPEN = 0x105 + TCP_KEEPALIVE = 0x10 + TCP_KEEPCNT = 0x102 + TCP_KEEPINTVL = 0x101 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MINMSS = 0xd8 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_NOTSENT_LOWAT = 0x201 + TCP_RXT_CONNDROPTIME = 0x80 + TCP_RXT_FINDROP = 0x100 + TCP_SENDMOREACKS = 0x103 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x40087458 + TIOCDRAIN = 0x2000745e + TIOCDSIMICROCODE = 0x20007455 + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGWINSZ = 0x40087468 + TIOCIXOFF = 0x20007480 + TIOCIXON = 0x20007481 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMODG = 0x40047403 + TIOCMODS = 0x80047404 + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTYGNAME = 0x40807453 + TIOCPTYGRANT = 0x20007454 + TIOCPTYUNLK = 0x20007452 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCONS = 0x20007463 + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2000745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40087459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VM_LOADAVG = 0x2 + VM_MACHFACTOR = 0x4 + VM_MAXID = 0x6 + VM_METER = 0x1 + VM_SWAPUSAGE = 0x5 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VT0 = 0x0 + VT1 = 0x10000 + VTDLY = 0x10000 + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x10 + WCOREFLAG = 0x80 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOWAIT = 0x20 + WORDSIZE = 0x20 + WSTOPPED = 0x8 + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADARCH = syscall.Errno(0x56) + EBADEXEC = syscall.Errno(0x55) + EBADF = syscall.Errno(0x9) + EBADMACHO = syscall.Errno(0x58) + EBADMSG = syscall.Errno(0x5e) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x59) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDEVERR = syscall.Errno(0x53) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x5a) + EILSEQ = syscall.Errno(0x5c) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x6a) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5f) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x5d) + ENOBUFS = syscall.Errno(0x37) + ENODATA = syscall.Errno(0x60) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x61) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x5b) + ENOPOLICY = syscall.Errno(0x67) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x62) + ENOSTR = syscall.Errno(0x63) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x68) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x66) + EOVERFLOW = syscall.Errno(0x54) + EOWNERDEAD = syscall.Errno(0x69) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x64) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + EPWROFF = syscall.Errno(0x52) + EQFULL = syscall.Errno(0x6a) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHLIBVERS = syscall.Errno(0x57) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIME = syscall.Errno(0x65) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "device not configured", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource deadlock avoided", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "resource busy", + 17: "file exists", + 18: "cross-device link", + 19: "operation not supported by device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "result too large", + 35: "resource temporarily unavailable", + 36: "operation now in progress", + 37: "operation already in progress", + 38: "socket operation on non-socket", + 39: "destination address required", + 40: "message too long", + 41: "protocol wrong type for socket", + 42: "protocol not available", + 43: "protocol not supported", + 44: "socket type not supported", + 45: "operation not supported", + 46: "protocol family not supported", + 47: "address family not supported by protocol family", + 48: "address already in use", + 49: "can't assign requested address", + 50: "network is down", + 51: "network is unreachable", + 52: "network dropped connection on reset", + 53: "software caused connection abort", + 54: "connection reset by peer", + 55: "no buffer space available", + 56: "socket is already connected", + 57: "socket is not connected", + 58: "can't send after socket shutdown", + 59: "too many references: can't splice", + 60: "operation timed out", + 61: "connection refused", + 62: "too many levels of symbolic links", + 63: "file name too long", + 64: "host is down", + 65: "no route to host", + 66: "directory not empty", + 67: "too many processes", + 68: "too many users", + 69: "disc quota exceeded", + 70: "stale NFS file handle", + 71: "too many levels of remote in path", + 72: "RPC struct is bad", + 73: "RPC version wrong", + 74: "RPC prog. not avail", + 75: "program version wrong", + 76: "bad procedure for program", + 77: "no locks available", + 78: "function not implemented", + 79: "inappropriate file type or format", + 80: "authentication error", + 81: "need authenticator", + 82: "device power is off", + 83: "device error", + 84: "value too large to be stored in data type", + 85: "bad executable (or shared library)", + 86: "bad CPU type in executable", + 87: "shared library version mismatch", + 88: "malformed Mach-o file", + 89: "operation canceled", + 90: "identifier removed", + 91: "no message of desired type", + 92: "illegal byte sequence", + 93: "attribute not found", + 94: "bad message", + 95: "EMULTIHOP (Reserved)", + 96: "no message available on STREAM", + 97: "ENOLINK (Reserved)", + 98: "no STREAM resources", + 99: "not a STREAM", + 100: "protocol error", + 101: "STREAM ioctl timeout", + 102: "operation not supported on socket", + 103: "policy not found", + 104: "state not recoverable", + 105: "previous owner died", + 106: "interface output queue is full", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/BPT trap", + 6: "abort trap", + 7: "EMT trap", + 8: "floating point exception", + 9: "killed", + 10: "bus error", + 11: "segmentation fault", + 12: "bad system call", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "urgent I/O condition", + 17: "suspended (signal)", + 18: "suspended", + 19: "continued", + 20: "child exited", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "I/O possible", + 24: "cputime limit exceeded", + 25: "filesize limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window size changes", + 29: "information request", + 30: "user defined signal 1", + 31: "user defined signal 2", +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go new file mode 100644 index 0000000..48f63d4 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go @@ -0,0 +1,1673 @@ +// mkerrors.sh -m64 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,darwin + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1c + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1e + AF_IPX = 0x17 + AF_ISDN = 0x1c + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x28 + AF_NATM = 0x1f + AF_NDRV = 0x1b + AF_NETBIOS = 0x21 + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PPP = 0x22 + AF_PUP = 0x4 + AF_RESERVED_36 = 0x24 + AF_ROUTE = 0x11 + AF_SIP = 0x18 + AF_SNA = 0xb + AF_SYSTEM = 0x20 + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_UTUN = 0x26 + ALTWERASE = 0x200 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B9600 = 0x2580 + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc00c4279 + BIOCGETIF = 0x4020426b + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044278 + BIOCSETF = 0x80104267 + BIOCSETFNR = 0x8010427e + BIOCSETIF = 0x8020426c + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8010426d + BIOCSSEESENT = 0x80044277 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x8000 + BSDLY = 0x8000 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_MONOTONIC_RAW_APPROX = 0x5 + CLOCK_PROCESS_CPUTIME_ID = 0xc + CLOCK_REALTIME = 0x0 + CLOCK_THREAD_CPUTIME_ID = 0x10 + CLOCK_UPTIME_RAW = 0x8 + CLOCK_UPTIME_RAW_APPROX = 0x9 + CR0 = 0x0 + CR1 = 0x1000 + CR2 = 0x2000 + CR3 = 0x3000 + CRDLY = 0x3000 + CREAD = 0x800 + CRTSCTS = 0x30000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0xf5 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_EXCEPT = -0xf + EVFILT_FS = -0x9 + EVFILT_MACHPORT = -0x8 + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xf + EVFILT_THREADMARKER = 0xf + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xa + EVFILT_VM = -0xc + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_DISPATCH2 = 0x180 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG0 = 0x1000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_OOBAND = 0x2000 + EV_POLL = 0x1000 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EV_UDATA_SPECIFIC = 0x100 + EV_VANISHED = 0x200 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x4000 + FFDLY = 0x4000 + FLUSHO = 0x800000 + F_ADDFILESIGS = 0x3d + F_ADDFILESIGS_FOR_DYLD_SIM = 0x53 + F_ADDFILESIGS_RETURN = 0x61 + F_ADDSIGS = 0x3b + F_ALLOCATEALL = 0x4 + F_ALLOCATECONTIG = 0x2 + F_BARRIERFSYNC = 0x55 + F_CHECK_LV = 0x62 + F_CHKCLEAN = 0x29 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x43 + F_FINDSIGS = 0x4e + F_FLUSH_DATA = 0x28 + F_FREEZE_FS = 0x35 + F_FULLFSYNC = 0x33 + F_GETCODEDIR = 0x48 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETLKPID = 0x42 + F_GETNOSIGPIPE = 0x4a + F_GETOWN = 0x5 + F_GETPATH = 0x32 + F_GETPATH_MTMINFO = 0x47 + F_GETPROTECTIONCLASS = 0x3f + F_GETPROTECTIONLEVEL = 0x4d + F_GLOBAL_NOCACHE = 0x37 + F_LOG2PHYS = 0x31 + F_LOG2PHYS_EXT = 0x41 + F_NOCACHE = 0x30 + F_NODIRECT = 0x3e + F_OK = 0x0 + F_PATHPKG_CHECK = 0x34 + F_PEOFPOSMODE = 0x3 + F_PREALLOCATE = 0x2a + F_RDADVISE = 0x2c + F_RDAHEAD = 0x2d + F_RDLCK = 0x1 + F_SETBACKINGSTORE = 0x46 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETLKWTIMEOUT = 0xa + F_SETNOSIGPIPE = 0x49 + F_SETOWN = 0x6 + F_SETPROTECTIONCLASS = 0x40 + F_SETSIZE = 0x2b + F_SINGLE_WRITER = 0x4c + F_THAW_FS = 0x36 + F_TRANSCODEKEY = 0x4b + F_UNLCK = 0x2 + F_VOLPOSMODE = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_AAL5 = 0x31 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ATM = 0x25 + IFT_BRIDGE = 0xd1 + IFT_CARP = 0xf8 + IFT_CELLULAR = 0xff + IFT_CEPT = 0x13 + IFT_DS3 = 0x1e + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_ETHER = 0x6 + IFT_FAITH = 0x38 + IFT_FDDI = 0xf + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_GIF = 0x37 + IFT_HDH1822 = 0x3 + IFT_HIPPI = 0x2f + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IEEE1394 = 0x90 + IFT_IEEE8023ADLAG = 0x88 + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88026 = 0xa + IFT_L2VLAN = 0x87 + IFT_LAPB = 0x10 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_NSIP = 0x1b + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PDP = 0xff + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PKTAP = 0xfe + IFT_PPP = 0x17 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PTPSERIAL = 0x16 + IFT_RS232 = 0x21 + IFT_SDLC = 0x11 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_STARLAN = 0xb + IFT_STF = 0x39 + IFT_T1 = 0x12 + IFT_ULTRA = 0x1d + IFT_V35 = 0x2d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LINKLOCALNETNUM = 0xa9fe0000 + IN_LOOPBACKNET = 0x7f + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0xfe + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MEAS = 0x13 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEP = 0x21 + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_2292DSTOPTS = 0x17 + IPV6_2292HOPLIMIT = 0x14 + IPV6_2292HOPOPTS = 0x16 + IPV6_2292NEXTHOP = 0x15 + IPV6_2292PKTINFO = 0x13 + IPV6_2292PKTOPTIONS = 0x19 + IPV6_2292RTHDR = 0x18 + IPV6_BINDV6ONLY = 0x1b + IPV6_BOUND_IF = 0x7d + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x3c + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVTCLASS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x24 + IPV6_UNICAST_HOPS = 0x4 + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BLOCK_SOURCE = 0x48 + IP_BOUND_IF = 0x19 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FAITH = 0x16 + IP_FW_ADD = 0x28 + IP_FW_DEL = 0x29 + IP_FW_FLUSH = 0x2a + IP_FW_GET = 0x2c + IP_FW_RESETLOG = 0x2d + IP_FW_ZERO = 0x2b + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MF = 0x2000 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_IFINDEX = 0x42 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_NAT__XXX = 0x37 + IP_OFFMASK = 0x1fff + IP_OLD_FW_ADD = 0x32 + IP_OLD_FW_DEL = 0x33 + IP_OLD_FW_FLUSH = 0x34 + IP_OLD_FW_GET = 0x36 + IP_OLD_FW_RESETLOG = 0x38 + IP_OLD_FW_ZERO = 0x35 + IP_OPTIONS = 0x1 + IP_PKTINFO = 0x1a + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVPKTINFO = 0x1a + IP_RECVRETOPTS = 0x6 + IP_RECVTTL = 0x18 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_STRIPHDR = 0x17 + IP_TOS = 0x3 + IP_TRAFFIC_MGT_BACKGROUND = 0x41 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_CAN_REUSE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_FREE_REUSABLE = 0x7 + MADV_FREE_REUSE = 0x8 + MADV_NORMAL = 0x0 + MADV_PAGEOUT = 0xa + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MADV_ZERO_WIRED_PAGES = 0x6 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_JIT = 0x800 + MAP_NOCACHE = 0x400 + MAP_NOEXTEND = 0x100 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_RESERVED0080 = 0x80 + MAP_RESILIENT_CODESIGN = 0x2000 + MAP_RESILIENT_MEDIA = 0x4000 + MAP_SHARED = 0x1 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x400000 + MNT_CMDFLAGS = 0xf0000 + MNT_CPROTECT = 0x80 + MNT_DEFWRITE = 0x2000000 + MNT_DONTBROWSE = 0x100000 + MNT_DOVOLFS = 0x8000 + MNT_DWAIT = 0x4 + MNT_EXPORTED = 0x100 + MNT_FORCE = 0x80000 + MNT_IGNORE_OWNERSHIP = 0x200000 + MNT_JOURNALED = 0x800000 + MNT_LOCAL = 0x1000 + MNT_MULTILABEL = 0x4000000 + MNT_NOATIME = 0x10000000 + MNT_NOBLOCK = 0x20000 + MNT_NODEV = 0x10 + MNT_NOEXEC = 0x4 + MNT_NOSUID = 0x8 + MNT_NOUSERXATTR = 0x1000000 + MNT_NOWAIT = 0x2 + MNT_QUARANTINE = 0x400 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UNKNOWNPERMISSIONS = 0x200000 + MNT_UPDATE = 0x10000 + MNT_VISFLAGMASK = 0x17f0f5ff + MNT_WAIT = 0x1 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_FLUSH = 0x400 + MSG_HAVEMORE = 0x2000 + MSG_HOLD = 0x800 + MSG_NEEDSA = 0x10000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_RCVMORE = 0x4000 + MSG_SEND = 0x1000 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITSTREAM = 0x200 + MS_ASYNC = 0x1 + MS_DEACTIVATE = 0x8 + MS_INVALIDATE = 0x2 + MS_KILLPAGES = 0x4 + MS_SYNC = 0x10 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_DUMP2 = 0x7 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLIST2 = 0x6 + NET_RT_MAXID = 0xa + NET_RT_STAT = 0x4 + NET_RT_TRASH = 0x5 + NL0 = 0x0 + NL1 = 0x100 + NL2 = 0x200 + NL3 = 0x300 + NLDLY = 0x300 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ABSOLUTE = 0x8 + NOTE_ATTRIB = 0x8 + NOTE_BACKGROUND = 0x40 + NOTE_CHILD = 0x4 + NOTE_CRITICAL = 0x20 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXITSTATUS = 0x4000000 + NOTE_EXIT_CSERROR = 0x40000 + NOTE_EXIT_DECRYPTFAIL = 0x10000 + NOTE_EXIT_DETAIL = 0x2000000 + NOTE_EXIT_DETAIL_MASK = 0x70000 + NOTE_EXIT_MEMORY = 0x20000 + NOTE_EXIT_REPARENTED = 0x80000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FORK = 0x40000000 + NOTE_FUNLOCK = 0x100 + NOTE_LEEWAY = 0x10 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_MACH_CONTINUOUS_TIME = 0x80 + NOTE_NONE = 0x80 + NOTE_NSECONDS = 0x4 + NOTE_OOB = 0x2 + NOTE_PCTRLMASK = -0x100000 + NOTE_PDATAMASK = 0xfffff + NOTE_REAP = 0x10000000 + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_SIGNAL = 0x8000000 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x2 + NOTE_VM_ERROR = 0x10000000 + NOTE_VM_PRESSURE = 0x80000000 + NOTE_VM_PRESSURE_SUDDEN_TERMINATE = 0x20000000 + NOTE_VM_PRESSURE_TERMINATE = 0x40000000 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OFDEL = 0x20000 + OFILL = 0x80 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_ALERT = 0x20000000 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x1000000 + O_CREAT = 0x200 + O_DIRECTORY = 0x100000 + O_DP_GETRAWENCRYPTED = 0x1 + O_DP_GETRAWUNENCRYPTED = 0x2 + O_DSYNC = 0x400000 + O_EVTONLY = 0x8000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x20000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_POPUP = 0x80000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYMLINK = 0x200000 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PT_ATTACH = 0xa + PT_ATTACHEXC = 0xe + PT_CONTINUE = 0x7 + PT_DENY_ATTACH = 0x1f + PT_DETACH = 0xb + PT_FIRSTMACH = 0x20 + PT_FORCEQUOTA = 0x1e + PT_KILL = 0x8 + PT_READ_D = 0x2 + PT_READ_I = 0x1 + PT_READ_U = 0x3 + PT_SIGEXC = 0xc + PT_STEP = 0x9 + PT_THUPDATE = 0xd + PT_TRACE_ME = 0x0 + PT_WRITE_D = 0x5 + PT_WRITE_I = 0x4 + PT_WRITE_U = 0x6 + RLIMIT_AS = 0x5 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_CPU_USAGE_MONITOR = 0x2 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_CLONING = 0x100 + RTF_CONDEMNED = 0x2000000 + RTF_DELCLONE = 0x80 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_IFREF = 0x4000000 + RTF_IFSCOPE = 0x1000000 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_NOIFREF = 0x2000 + RTF_PINNED = 0x100000 + RTF_PRCLONING = 0x10000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_PROXY = 0x8000000 + RTF_REJECT = 0x8 + RTF_ROUTER = 0x10000000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_WASCLONED = 0x20000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_GET2 = 0x14 + RTM_IFINFO = 0xe + RTM_IFINFO2 = 0x12 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_NEWMADDR2 = 0x13 + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SCM_TIMESTAMP_MONOTONIC = 0x4 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCARPIPLL = 0xc0206928 + SIOCATMARK = 0x40047307 + SIOCAUTOADDR = 0xc0206926 + SIOCAUTONETMASK = 0x80206927 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFPHYADDR = 0x80206941 + SIOCGDRVSPEC = 0xc028697b + SIOCGETVLAN = 0xc020697f + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFALTMTU = 0xc0206948 + SIOCGIFASYNCMAP = 0xc020697c + SIOCGIFBOND = 0xc0206947 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020695b + SIOCGIFCONF = 0xc00c6924 + SIOCGIFDEVMTU = 0xc0206944 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFKPI = 0xc0206987 + SIOCGIFMAC = 0xc0206982 + SIOCGIFMEDIA = 0xc02c6938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206940 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc020693f + SIOCGIFSTATUS = 0xc331693d + SIOCGIFVLAN = 0xc020697f + SIOCGIFWAKEFLAGS = 0xc0206988 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCIFCREATE = 0xc0206978 + SIOCIFCREATE2 = 0xc020697a + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc0106981 + SIOCRSLVMULTI = 0xc010693b + SIOCSDRVSPEC = 0x8028697b + SIOCSETVLAN = 0x8020697e + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFALTMTU = 0x80206945 + SIOCSIFASYNCMAP = 0x8020697d + SIOCSIFBOND = 0x80206946 + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020695a + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFKPI = 0x80206986 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206983 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x8040693e + SIOCSIFPHYS = 0x80206936 + SIOCSIFVLAN = 0x8020697e + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_DONTTRUNC = 0x2000 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1010 + SO_LINGER = 0x80 + SO_LINGER_SEC = 0x1080 + SO_NETSVC_MARKING_LEVEL = 0x1119 + SO_NET_SERVICE_TYPE = 0x1116 + SO_NKE = 0x1021 + SO_NOADDRERR = 0x1023 + SO_NOSIGPIPE = 0x1022 + SO_NOTIFYCONFLICT = 0x1026 + SO_NP_EXTENSIONS = 0x1083 + SO_NREAD = 0x1020 + SO_NUMRCVPKT = 0x1112 + SO_NWRITE = 0x1024 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1011 + SO_RANDOMPORT = 0x1082 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_REUSESHAREUID = 0x1025 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TIMESTAMP_MONOTONIC = 0x800 + SO_TYPE = 0x1008 + SO_UPCALLCLOSEWAIT = 0x1027 + SO_USELOOPBACK = 0x40 + SO_WANTMORE = 0x4000 + SO_WANTOOBFLAG = 0x8000 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFWHT = 0xe000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x400 + TAB2 = 0x800 + TAB3 = 0x4 + TABDLY = 0xc04 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCP_CONNECTIONTIMEOUT = 0x20 + TCP_CONNECTION_INFO = 0x106 + TCP_ENABLE_ECN = 0x104 + TCP_FASTOPEN = 0x105 + TCP_KEEPALIVE = 0x10 + TCP_KEEPCNT = 0x102 + TCP_KEEPINTVL = 0x101 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MINMSS = 0xd8 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_NOTSENT_LOWAT = 0x201 + TCP_RXT_CONNDROPTIME = 0x80 + TCP_RXT_FINDROP = 0x100 + TCP_SENDMOREACKS = 0x103 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x40107458 + TIOCDRAIN = 0x2000745e + TIOCDSIMICROCODE = 0x20007455 + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x40487413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGWINSZ = 0x40087468 + TIOCIXOFF = 0x20007480 + TIOCIXON = 0x20007481 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMODG = 0x40047403 + TIOCMODS = 0x80047404 + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTYGNAME = 0x40807453 + TIOCPTYGRANT = 0x20007454 + TIOCPTYUNLK = 0x20007452 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCONS = 0x20007463 + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x80487414 + TIOCSETAF = 0x80487416 + TIOCSETAW = 0x80487415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2000745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40107459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VM_LOADAVG = 0x2 + VM_MACHFACTOR = 0x4 + VM_MAXID = 0x6 + VM_METER = 0x1 + VM_SWAPUSAGE = 0x5 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VT0 = 0x0 + VT1 = 0x10000 + VTDLY = 0x10000 + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x10 + WCOREFLAG = 0x80 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOWAIT = 0x20 + WORDSIZE = 0x40 + WSTOPPED = 0x8 + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADARCH = syscall.Errno(0x56) + EBADEXEC = syscall.Errno(0x55) + EBADF = syscall.Errno(0x9) + EBADMACHO = syscall.Errno(0x58) + EBADMSG = syscall.Errno(0x5e) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x59) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDEVERR = syscall.Errno(0x53) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x5a) + EILSEQ = syscall.Errno(0x5c) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x6a) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5f) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x5d) + ENOBUFS = syscall.Errno(0x37) + ENODATA = syscall.Errno(0x60) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x61) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x5b) + ENOPOLICY = syscall.Errno(0x67) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x62) + ENOSTR = syscall.Errno(0x63) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x68) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x66) + EOVERFLOW = syscall.Errno(0x54) + EOWNERDEAD = syscall.Errno(0x69) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x64) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + EPWROFF = syscall.Errno(0x52) + EQFULL = syscall.Errno(0x6a) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHLIBVERS = syscall.Errno(0x57) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIME = syscall.Errno(0x65) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "device not configured", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource deadlock avoided", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "resource busy", + 17: "file exists", + 18: "cross-device link", + 19: "operation not supported by device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "result too large", + 35: "resource temporarily unavailable", + 36: "operation now in progress", + 37: "operation already in progress", + 38: "socket operation on non-socket", + 39: "destination address required", + 40: "message too long", + 41: "protocol wrong type for socket", + 42: "protocol not available", + 43: "protocol not supported", + 44: "socket type not supported", + 45: "operation not supported", + 46: "protocol family not supported", + 47: "address family not supported by protocol family", + 48: "address already in use", + 49: "can't assign requested address", + 50: "network is down", + 51: "network is unreachable", + 52: "network dropped connection on reset", + 53: "software caused connection abort", + 54: "connection reset by peer", + 55: "no buffer space available", + 56: "socket is already connected", + 57: "socket is not connected", + 58: "can't send after socket shutdown", + 59: "too many references: can't splice", + 60: "operation timed out", + 61: "connection refused", + 62: "too many levels of symbolic links", + 63: "file name too long", + 64: "host is down", + 65: "no route to host", + 66: "directory not empty", + 67: "too many processes", + 68: "too many users", + 69: "disc quota exceeded", + 70: "stale NFS file handle", + 71: "too many levels of remote in path", + 72: "RPC struct is bad", + 73: "RPC version wrong", + 74: "RPC prog. not avail", + 75: "program version wrong", + 76: "bad procedure for program", + 77: "no locks available", + 78: "function not implemented", + 79: "inappropriate file type or format", + 80: "authentication error", + 81: "need authenticator", + 82: "device power is off", + 83: "device error", + 84: "value too large to be stored in data type", + 85: "bad executable (or shared library)", + 86: "bad CPU type in executable", + 87: "shared library version mismatch", + 88: "malformed Mach-o file", + 89: "operation canceled", + 90: "identifier removed", + 91: "no message of desired type", + 92: "illegal byte sequence", + 93: "attribute not found", + 94: "bad message", + 95: "EMULTIHOP (Reserved)", + 96: "no message available on STREAM", + 97: "ENOLINK (Reserved)", + 98: "no STREAM resources", + 99: "not a STREAM", + 100: "protocol error", + 101: "STREAM ioctl timeout", + 102: "operation not supported on socket", + 103: "policy not found", + 104: "state not recoverable", + 105: "previous owner died", + 106: "interface output queue is full", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/BPT trap", + 6: "abort trap", + 7: "EMT trap", + 8: "floating point exception", + 9: "killed", + 10: "bus error", + 11: "segmentation fault", + 12: "bad system call", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "urgent I/O condition", + 17: "suspended (signal)", + 18: "suspended", + 19: "continued", + 20: "child exited", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "I/O possible", + 24: "cputime limit exceeded", + 25: "filesize limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window size changes", + 29: "information request", + 30: "user defined signal 1", + 31: "user defined signal 2", +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go new file mode 100644 index 0000000..24cb522 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go @@ -0,0 +1,1673 @@ +// mkerrors.sh +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,darwin + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1c + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1e + AF_IPX = 0x17 + AF_ISDN = 0x1c + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x28 + AF_NATM = 0x1f + AF_NDRV = 0x1b + AF_NETBIOS = 0x21 + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PPP = 0x22 + AF_PUP = 0x4 + AF_RESERVED_36 = 0x24 + AF_ROUTE = 0x11 + AF_SIP = 0x18 + AF_SNA = 0xb + AF_SYSTEM = 0x20 + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_UTUN = 0x26 + ALTWERASE = 0x200 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B9600 = 0x2580 + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc00c4279 + BIOCGETIF = 0x4020426b + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044278 + BIOCSETF = 0x80104267 + BIOCSETFNR = 0x8010427e + BIOCSETIF = 0x8020426c + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8010426d + BIOCSSEESENT = 0x80044277 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x8000 + BSDLY = 0x8000 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_MONOTONIC_RAW_APPROX = 0x5 + CLOCK_PROCESS_CPUTIME_ID = 0xc + CLOCK_REALTIME = 0x0 + CLOCK_THREAD_CPUTIME_ID = 0x10 + CLOCK_UPTIME_RAW = 0x8 + CLOCK_UPTIME_RAW_APPROX = 0x9 + CR0 = 0x0 + CR1 = 0x1000 + CR2 = 0x2000 + CR3 = 0x3000 + CRDLY = 0x3000 + CREAD = 0x800 + CRTSCTS = 0x30000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0xf5 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_EXCEPT = -0xf + EVFILT_FS = -0x9 + EVFILT_MACHPORT = -0x8 + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xf + EVFILT_THREADMARKER = 0xf + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xa + EVFILT_VM = -0xc + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_DISPATCH2 = 0x180 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG0 = 0x1000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_OOBAND = 0x2000 + EV_POLL = 0x1000 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EV_UDATA_SPECIFIC = 0x100 + EV_VANISHED = 0x200 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x4000 + FFDLY = 0x4000 + FLUSHO = 0x800000 + F_ADDFILESIGS = 0x3d + F_ADDFILESIGS_FOR_DYLD_SIM = 0x53 + F_ADDFILESIGS_RETURN = 0x61 + F_ADDSIGS = 0x3b + F_ALLOCATEALL = 0x4 + F_ALLOCATECONTIG = 0x2 + F_BARRIERFSYNC = 0x55 + F_CHECK_LV = 0x62 + F_CHKCLEAN = 0x29 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x43 + F_FINDSIGS = 0x4e + F_FLUSH_DATA = 0x28 + F_FREEZE_FS = 0x35 + F_FULLFSYNC = 0x33 + F_GETCODEDIR = 0x48 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETLKPID = 0x42 + F_GETNOSIGPIPE = 0x4a + F_GETOWN = 0x5 + F_GETPATH = 0x32 + F_GETPATH_MTMINFO = 0x47 + F_GETPROTECTIONCLASS = 0x3f + F_GETPROTECTIONLEVEL = 0x4d + F_GLOBAL_NOCACHE = 0x37 + F_LOG2PHYS = 0x31 + F_LOG2PHYS_EXT = 0x41 + F_NOCACHE = 0x30 + F_NODIRECT = 0x3e + F_OK = 0x0 + F_PATHPKG_CHECK = 0x34 + F_PEOFPOSMODE = 0x3 + F_PREALLOCATE = 0x2a + F_RDADVISE = 0x2c + F_RDAHEAD = 0x2d + F_RDLCK = 0x1 + F_SETBACKINGSTORE = 0x46 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETLKWTIMEOUT = 0xa + F_SETNOSIGPIPE = 0x49 + F_SETOWN = 0x6 + F_SETPROTECTIONCLASS = 0x40 + F_SETSIZE = 0x2b + F_SINGLE_WRITER = 0x4c + F_THAW_FS = 0x36 + F_TRANSCODEKEY = 0x4b + F_UNLCK = 0x2 + F_VOLPOSMODE = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_AAL5 = 0x31 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ATM = 0x25 + IFT_BRIDGE = 0xd1 + IFT_CARP = 0xf8 + IFT_CELLULAR = 0xff + IFT_CEPT = 0x13 + IFT_DS3 = 0x1e + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_ETHER = 0x6 + IFT_FAITH = 0x38 + IFT_FDDI = 0xf + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_GIF = 0x37 + IFT_HDH1822 = 0x3 + IFT_HIPPI = 0x2f + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IEEE1394 = 0x90 + IFT_IEEE8023ADLAG = 0x88 + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88026 = 0xa + IFT_L2VLAN = 0x87 + IFT_LAPB = 0x10 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_NSIP = 0x1b + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PDP = 0xff + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PKTAP = 0xfe + IFT_PPP = 0x17 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PTPSERIAL = 0x16 + IFT_RS232 = 0x21 + IFT_SDLC = 0x11 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_STARLAN = 0xb + IFT_STF = 0x39 + IFT_T1 = 0x12 + IFT_ULTRA = 0x1d + IFT_V35 = 0x2d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LINKLOCALNETNUM = 0xa9fe0000 + IN_LOOPBACKNET = 0x7f + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0xfe + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MEAS = 0x13 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEP = 0x21 + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_2292DSTOPTS = 0x17 + IPV6_2292HOPLIMIT = 0x14 + IPV6_2292HOPOPTS = 0x16 + IPV6_2292NEXTHOP = 0x15 + IPV6_2292PKTINFO = 0x13 + IPV6_2292PKTOPTIONS = 0x19 + IPV6_2292RTHDR = 0x18 + IPV6_BINDV6ONLY = 0x1b + IPV6_BOUND_IF = 0x7d + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x3c + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVTCLASS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x24 + IPV6_UNICAST_HOPS = 0x4 + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BLOCK_SOURCE = 0x48 + IP_BOUND_IF = 0x19 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FAITH = 0x16 + IP_FW_ADD = 0x28 + IP_FW_DEL = 0x29 + IP_FW_FLUSH = 0x2a + IP_FW_GET = 0x2c + IP_FW_RESETLOG = 0x2d + IP_FW_ZERO = 0x2b + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MF = 0x2000 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_IFINDEX = 0x42 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_NAT__XXX = 0x37 + IP_OFFMASK = 0x1fff + IP_OLD_FW_ADD = 0x32 + IP_OLD_FW_DEL = 0x33 + IP_OLD_FW_FLUSH = 0x34 + IP_OLD_FW_GET = 0x36 + IP_OLD_FW_RESETLOG = 0x38 + IP_OLD_FW_ZERO = 0x35 + IP_OPTIONS = 0x1 + IP_PKTINFO = 0x1a + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVPKTINFO = 0x1a + IP_RECVRETOPTS = 0x6 + IP_RECVTTL = 0x18 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_STRIPHDR = 0x17 + IP_TOS = 0x3 + IP_TRAFFIC_MGT_BACKGROUND = 0x41 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_CAN_REUSE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_FREE_REUSABLE = 0x7 + MADV_FREE_REUSE = 0x8 + MADV_NORMAL = 0x0 + MADV_PAGEOUT = 0xa + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MADV_ZERO_WIRED_PAGES = 0x6 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_JIT = 0x800 + MAP_NOCACHE = 0x400 + MAP_NOEXTEND = 0x100 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_RESERVED0080 = 0x80 + MAP_RESILIENT_CODESIGN = 0x2000 + MAP_RESILIENT_MEDIA = 0x4000 + MAP_SHARED = 0x1 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x400000 + MNT_CMDFLAGS = 0xf0000 + MNT_CPROTECT = 0x80 + MNT_DEFWRITE = 0x2000000 + MNT_DONTBROWSE = 0x100000 + MNT_DOVOLFS = 0x8000 + MNT_DWAIT = 0x4 + MNT_EXPORTED = 0x100 + MNT_FORCE = 0x80000 + MNT_IGNORE_OWNERSHIP = 0x200000 + MNT_JOURNALED = 0x800000 + MNT_LOCAL = 0x1000 + MNT_MULTILABEL = 0x4000000 + MNT_NOATIME = 0x10000000 + MNT_NOBLOCK = 0x20000 + MNT_NODEV = 0x10 + MNT_NOEXEC = 0x4 + MNT_NOSUID = 0x8 + MNT_NOUSERXATTR = 0x1000000 + MNT_NOWAIT = 0x2 + MNT_QUARANTINE = 0x400 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UNKNOWNPERMISSIONS = 0x200000 + MNT_UPDATE = 0x10000 + MNT_VISFLAGMASK = 0x17f0f5ff + MNT_WAIT = 0x1 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_FLUSH = 0x400 + MSG_HAVEMORE = 0x2000 + MSG_HOLD = 0x800 + MSG_NEEDSA = 0x10000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_RCVMORE = 0x4000 + MSG_SEND = 0x1000 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITSTREAM = 0x200 + MS_ASYNC = 0x1 + MS_DEACTIVATE = 0x8 + MS_INVALIDATE = 0x2 + MS_KILLPAGES = 0x4 + MS_SYNC = 0x10 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_DUMP2 = 0x7 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLIST2 = 0x6 + NET_RT_MAXID = 0xa + NET_RT_STAT = 0x4 + NET_RT_TRASH = 0x5 + NL0 = 0x0 + NL1 = 0x100 + NL2 = 0x200 + NL3 = 0x300 + NLDLY = 0x300 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ABSOLUTE = 0x8 + NOTE_ATTRIB = 0x8 + NOTE_BACKGROUND = 0x40 + NOTE_CHILD = 0x4 + NOTE_CRITICAL = 0x20 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXITSTATUS = 0x4000000 + NOTE_EXIT_CSERROR = 0x40000 + NOTE_EXIT_DECRYPTFAIL = 0x10000 + NOTE_EXIT_DETAIL = 0x2000000 + NOTE_EXIT_DETAIL_MASK = 0x70000 + NOTE_EXIT_MEMORY = 0x20000 + NOTE_EXIT_REPARENTED = 0x80000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FORK = 0x40000000 + NOTE_FUNLOCK = 0x100 + NOTE_LEEWAY = 0x10 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_MACH_CONTINUOUS_TIME = 0x80 + NOTE_NONE = 0x80 + NOTE_NSECONDS = 0x4 + NOTE_OOB = 0x2 + NOTE_PCTRLMASK = -0x100000 + NOTE_PDATAMASK = 0xfffff + NOTE_REAP = 0x10000000 + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_SIGNAL = 0x8000000 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x2 + NOTE_VM_ERROR = 0x10000000 + NOTE_VM_PRESSURE = 0x80000000 + NOTE_VM_PRESSURE_SUDDEN_TERMINATE = 0x20000000 + NOTE_VM_PRESSURE_TERMINATE = 0x40000000 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OFDEL = 0x20000 + OFILL = 0x80 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_ALERT = 0x20000000 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x1000000 + O_CREAT = 0x200 + O_DIRECTORY = 0x100000 + O_DP_GETRAWENCRYPTED = 0x1 + O_DP_GETRAWUNENCRYPTED = 0x2 + O_DSYNC = 0x400000 + O_EVTONLY = 0x8000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x20000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_POPUP = 0x80000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYMLINK = 0x200000 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PT_ATTACH = 0xa + PT_ATTACHEXC = 0xe + PT_CONTINUE = 0x7 + PT_DENY_ATTACH = 0x1f + PT_DETACH = 0xb + PT_FIRSTMACH = 0x20 + PT_FORCEQUOTA = 0x1e + PT_KILL = 0x8 + PT_READ_D = 0x2 + PT_READ_I = 0x1 + PT_READ_U = 0x3 + PT_SIGEXC = 0xc + PT_STEP = 0x9 + PT_THUPDATE = 0xd + PT_TRACE_ME = 0x0 + PT_WRITE_D = 0x5 + PT_WRITE_I = 0x4 + PT_WRITE_U = 0x6 + RLIMIT_AS = 0x5 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_CPU_USAGE_MONITOR = 0x2 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_CLONING = 0x100 + RTF_CONDEMNED = 0x2000000 + RTF_DELCLONE = 0x80 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_IFREF = 0x4000000 + RTF_IFSCOPE = 0x1000000 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_NOIFREF = 0x2000 + RTF_PINNED = 0x100000 + RTF_PRCLONING = 0x10000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_PROXY = 0x8000000 + RTF_REJECT = 0x8 + RTF_ROUTER = 0x10000000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_WASCLONED = 0x20000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_GET2 = 0x14 + RTM_IFINFO = 0xe + RTM_IFINFO2 = 0x12 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_NEWMADDR2 = 0x13 + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SCM_TIMESTAMP_MONOTONIC = 0x4 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCARPIPLL = 0xc0206928 + SIOCATMARK = 0x40047307 + SIOCAUTOADDR = 0xc0206926 + SIOCAUTONETMASK = 0x80206927 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFPHYADDR = 0x80206941 + SIOCGDRVSPEC = 0xc028697b + SIOCGETVLAN = 0xc020697f + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFALTMTU = 0xc0206948 + SIOCGIFASYNCMAP = 0xc020697c + SIOCGIFBOND = 0xc0206947 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020695b + SIOCGIFCONF = 0xc00c6924 + SIOCGIFDEVMTU = 0xc0206944 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFKPI = 0xc0206987 + SIOCGIFMAC = 0xc0206982 + SIOCGIFMEDIA = 0xc02c6938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206940 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc020693f + SIOCGIFSTATUS = 0xc331693d + SIOCGIFVLAN = 0xc020697f + SIOCGIFWAKEFLAGS = 0xc0206988 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCIFCREATE = 0xc0206978 + SIOCIFCREATE2 = 0xc020697a + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc0106981 + SIOCRSLVMULTI = 0xc010693b + SIOCSDRVSPEC = 0x8028697b + SIOCSETVLAN = 0x8020697e + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFALTMTU = 0x80206945 + SIOCSIFASYNCMAP = 0x8020697d + SIOCSIFBOND = 0x80206946 + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020695a + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFKPI = 0x80206986 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206983 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x8040693e + SIOCSIFPHYS = 0x80206936 + SIOCSIFVLAN = 0x8020697e + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_DONTTRUNC = 0x2000 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1010 + SO_LINGER = 0x80 + SO_LINGER_SEC = 0x1080 + SO_NETSVC_MARKING_LEVEL = 0x1119 + SO_NET_SERVICE_TYPE = 0x1116 + SO_NKE = 0x1021 + SO_NOADDRERR = 0x1023 + SO_NOSIGPIPE = 0x1022 + SO_NOTIFYCONFLICT = 0x1026 + SO_NP_EXTENSIONS = 0x1083 + SO_NREAD = 0x1020 + SO_NUMRCVPKT = 0x1112 + SO_NWRITE = 0x1024 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1011 + SO_RANDOMPORT = 0x1082 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_REUSESHAREUID = 0x1025 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TIMESTAMP_MONOTONIC = 0x800 + SO_TYPE = 0x1008 + SO_UPCALLCLOSEWAIT = 0x1027 + SO_USELOOPBACK = 0x40 + SO_WANTMORE = 0x4000 + SO_WANTOOBFLAG = 0x8000 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFWHT = 0xe000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x400 + TAB2 = 0x800 + TAB3 = 0x4 + TABDLY = 0xc04 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCP_CONNECTIONTIMEOUT = 0x20 + TCP_CONNECTION_INFO = 0x106 + TCP_ENABLE_ECN = 0x104 + TCP_FASTOPEN = 0x105 + TCP_KEEPALIVE = 0x10 + TCP_KEEPCNT = 0x102 + TCP_KEEPINTVL = 0x101 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MINMSS = 0xd8 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_NOTSENT_LOWAT = 0x201 + TCP_RXT_CONNDROPTIME = 0x80 + TCP_RXT_FINDROP = 0x100 + TCP_SENDMOREACKS = 0x103 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x40107458 + TIOCDRAIN = 0x2000745e + TIOCDSIMICROCODE = 0x20007455 + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x40487413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGWINSZ = 0x40087468 + TIOCIXOFF = 0x20007480 + TIOCIXON = 0x20007481 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMODG = 0x40047403 + TIOCMODS = 0x80047404 + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTYGNAME = 0x40807453 + TIOCPTYGRANT = 0x20007454 + TIOCPTYUNLK = 0x20007452 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCONS = 0x20007463 + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x80487414 + TIOCSETAF = 0x80487416 + TIOCSETAW = 0x80487415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2000745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40107459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VM_LOADAVG = 0x2 + VM_MACHFACTOR = 0x4 + VM_MAXID = 0x6 + VM_METER = 0x1 + VM_SWAPUSAGE = 0x5 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VT0 = 0x0 + VT1 = 0x10000 + VTDLY = 0x10000 + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x10 + WCOREFLAG = 0x80 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOWAIT = 0x20 + WORDSIZE = 0x40 + WSTOPPED = 0x8 + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADARCH = syscall.Errno(0x56) + EBADEXEC = syscall.Errno(0x55) + EBADF = syscall.Errno(0x9) + EBADMACHO = syscall.Errno(0x58) + EBADMSG = syscall.Errno(0x5e) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x59) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDEVERR = syscall.Errno(0x53) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x5a) + EILSEQ = syscall.Errno(0x5c) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x6a) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5f) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x5d) + ENOBUFS = syscall.Errno(0x37) + ENODATA = syscall.Errno(0x60) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x61) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x5b) + ENOPOLICY = syscall.Errno(0x67) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x62) + ENOSTR = syscall.Errno(0x63) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x68) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x66) + EOVERFLOW = syscall.Errno(0x54) + EOWNERDEAD = syscall.Errno(0x69) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x64) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + EPWROFF = syscall.Errno(0x52) + EQFULL = syscall.Errno(0x6a) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHLIBVERS = syscall.Errno(0x57) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIME = syscall.Errno(0x65) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "device not configured", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource deadlock avoided", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "resource busy", + 17: "file exists", + 18: "cross-device link", + 19: "operation not supported by device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "result too large", + 35: "resource temporarily unavailable", + 36: "operation now in progress", + 37: "operation already in progress", + 38: "socket operation on non-socket", + 39: "destination address required", + 40: "message too long", + 41: "protocol wrong type for socket", + 42: "protocol not available", + 43: "protocol not supported", + 44: "socket type not supported", + 45: "operation not supported", + 46: "protocol family not supported", + 47: "address family not supported by protocol family", + 48: "address already in use", + 49: "can't assign requested address", + 50: "network is down", + 51: "network is unreachable", + 52: "network dropped connection on reset", + 53: "software caused connection abort", + 54: "connection reset by peer", + 55: "no buffer space available", + 56: "socket is already connected", + 57: "socket is not connected", + 58: "can't send after socket shutdown", + 59: "too many references: can't splice", + 60: "operation timed out", + 61: "connection refused", + 62: "too many levels of symbolic links", + 63: "file name too long", + 64: "host is down", + 65: "no route to host", + 66: "directory not empty", + 67: "too many processes", + 68: "too many users", + 69: "disc quota exceeded", + 70: "stale NFS file handle", + 71: "too many levels of remote in path", + 72: "RPC struct is bad", + 73: "RPC version wrong", + 74: "RPC prog. not avail", + 75: "program version wrong", + 76: "bad procedure for program", + 77: "no locks available", + 78: "function not implemented", + 79: "inappropriate file type or format", + 80: "authentication error", + 81: "need authenticator", + 82: "device power is off", + 83: "device error", + 84: "value too large to be stored in data type", + 85: "bad executable (or shared library)", + 86: "bad CPU type in executable", + 87: "shared library version mismatch", + 88: "malformed Mach-o file", + 89: "operation canceled", + 90: "identifier removed", + 91: "no message of desired type", + 92: "illegal byte sequence", + 93: "attribute not found", + 94: "bad message", + 95: "EMULTIHOP (Reserved)", + 96: "no message available on STREAM", + 97: "ENOLINK (Reserved)", + 98: "no STREAM resources", + 99: "not a STREAM", + 100: "protocol error", + 101: "STREAM ioctl timeout", + 102: "operation not supported on socket", + 103: "policy not found", + 104: "state not recoverable", + 105: "previous owner died", + 106: "interface output queue is full", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/BPT trap", + 6: "abort trap", + 7: "EMT trap", + 8: "floating point exception", + 9: "killed", + 10: "bus error", + 11: "segmentation fault", + 12: "bad system call", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "urgent I/O condition", + 17: "suspended (signal)", + 18: "suspended", + 19: "continued", + 20: "child exited", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "I/O possible", + 24: "cputime limit exceeded", + 25: "filesize limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window size changes", + 29: "information request", + 30: "user defined signal 1", + 31: "user defined signal 2", +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go new file mode 100644 index 0000000..cc8cc5b --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go @@ -0,0 +1,1673 @@ +// mkerrors.sh -m64 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm64,darwin + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1c + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1e + AF_IPX = 0x17 + AF_ISDN = 0x1c + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x28 + AF_NATM = 0x1f + AF_NDRV = 0x1b + AF_NETBIOS = 0x21 + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PPP = 0x22 + AF_PUP = 0x4 + AF_RESERVED_36 = 0x24 + AF_ROUTE = 0x11 + AF_SIP = 0x18 + AF_SNA = 0xb + AF_SYSTEM = 0x20 + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_UTUN = 0x26 + ALTWERASE = 0x200 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B9600 = 0x2580 + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc00c4279 + BIOCGETIF = 0x4020426b + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044278 + BIOCSETF = 0x80104267 + BIOCSETFNR = 0x8010427e + BIOCSETIF = 0x8020426c + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8010426d + BIOCSSEESENT = 0x80044277 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x8000 + BSDLY = 0x8000 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_MONOTONIC_RAW_APPROX = 0x5 + CLOCK_PROCESS_CPUTIME_ID = 0xc + CLOCK_REALTIME = 0x0 + CLOCK_THREAD_CPUTIME_ID = 0x10 + CLOCK_UPTIME_RAW = 0x8 + CLOCK_UPTIME_RAW_APPROX = 0x9 + CR0 = 0x0 + CR1 = 0x1000 + CR2 = 0x2000 + CR3 = 0x3000 + CRDLY = 0x3000 + CREAD = 0x800 + CRTSCTS = 0x30000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0xf5 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_EXCEPT = -0xf + EVFILT_FS = -0x9 + EVFILT_MACHPORT = -0x8 + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xf + EVFILT_THREADMARKER = 0xf + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xa + EVFILT_VM = -0xc + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_DISPATCH2 = 0x180 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG0 = 0x1000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_OOBAND = 0x2000 + EV_POLL = 0x1000 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EV_UDATA_SPECIFIC = 0x100 + EV_VANISHED = 0x200 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x4000 + FFDLY = 0x4000 + FLUSHO = 0x800000 + F_ADDFILESIGS = 0x3d + F_ADDFILESIGS_FOR_DYLD_SIM = 0x53 + F_ADDFILESIGS_RETURN = 0x61 + F_ADDSIGS = 0x3b + F_ALLOCATEALL = 0x4 + F_ALLOCATECONTIG = 0x2 + F_BARRIERFSYNC = 0x55 + F_CHECK_LV = 0x62 + F_CHKCLEAN = 0x29 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x43 + F_FINDSIGS = 0x4e + F_FLUSH_DATA = 0x28 + F_FREEZE_FS = 0x35 + F_FULLFSYNC = 0x33 + F_GETCODEDIR = 0x48 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETLKPID = 0x42 + F_GETNOSIGPIPE = 0x4a + F_GETOWN = 0x5 + F_GETPATH = 0x32 + F_GETPATH_MTMINFO = 0x47 + F_GETPROTECTIONCLASS = 0x3f + F_GETPROTECTIONLEVEL = 0x4d + F_GLOBAL_NOCACHE = 0x37 + F_LOG2PHYS = 0x31 + F_LOG2PHYS_EXT = 0x41 + F_NOCACHE = 0x30 + F_NODIRECT = 0x3e + F_OK = 0x0 + F_PATHPKG_CHECK = 0x34 + F_PEOFPOSMODE = 0x3 + F_PREALLOCATE = 0x2a + F_RDADVISE = 0x2c + F_RDAHEAD = 0x2d + F_RDLCK = 0x1 + F_SETBACKINGSTORE = 0x46 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETLKWTIMEOUT = 0xa + F_SETNOSIGPIPE = 0x49 + F_SETOWN = 0x6 + F_SETPROTECTIONCLASS = 0x40 + F_SETSIZE = 0x2b + F_SINGLE_WRITER = 0x4c + F_THAW_FS = 0x36 + F_TRANSCODEKEY = 0x4b + F_UNLCK = 0x2 + F_VOLPOSMODE = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_AAL5 = 0x31 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ATM = 0x25 + IFT_BRIDGE = 0xd1 + IFT_CARP = 0xf8 + IFT_CELLULAR = 0xff + IFT_CEPT = 0x13 + IFT_DS3 = 0x1e + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_ETHER = 0x6 + IFT_FAITH = 0x38 + IFT_FDDI = 0xf + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_GIF = 0x37 + IFT_HDH1822 = 0x3 + IFT_HIPPI = 0x2f + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IEEE1394 = 0x90 + IFT_IEEE8023ADLAG = 0x88 + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88026 = 0xa + IFT_L2VLAN = 0x87 + IFT_LAPB = 0x10 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_NSIP = 0x1b + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PDP = 0xff + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PKTAP = 0xfe + IFT_PPP = 0x17 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PTPSERIAL = 0x16 + IFT_RS232 = 0x21 + IFT_SDLC = 0x11 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_STARLAN = 0xb + IFT_STF = 0x39 + IFT_T1 = 0x12 + IFT_ULTRA = 0x1d + IFT_V35 = 0x2d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LINKLOCALNETNUM = 0xa9fe0000 + IN_LOOPBACKNET = 0x7f + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0xfe + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MEAS = 0x13 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEP = 0x21 + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_2292DSTOPTS = 0x17 + IPV6_2292HOPLIMIT = 0x14 + IPV6_2292HOPOPTS = 0x16 + IPV6_2292NEXTHOP = 0x15 + IPV6_2292PKTINFO = 0x13 + IPV6_2292PKTOPTIONS = 0x19 + IPV6_2292RTHDR = 0x18 + IPV6_BINDV6ONLY = 0x1b + IPV6_BOUND_IF = 0x7d + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x3c + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVTCLASS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x24 + IPV6_UNICAST_HOPS = 0x4 + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BLOCK_SOURCE = 0x48 + IP_BOUND_IF = 0x19 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FAITH = 0x16 + IP_FW_ADD = 0x28 + IP_FW_DEL = 0x29 + IP_FW_FLUSH = 0x2a + IP_FW_GET = 0x2c + IP_FW_RESETLOG = 0x2d + IP_FW_ZERO = 0x2b + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MF = 0x2000 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_IFINDEX = 0x42 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_NAT__XXX = 0x37 + IP_OFFMASK = 0x1fff + IP_OLD_FW_ADD = 0x32 + IP_OLD_FW_DEL = 0x33 + IP_OLD_FW_FLUSH = 0x34 + IP_OLD_FW_GET = 0x36 + IP_OLD_FW_RESETLOG = 0x38 + IP_OLD_FW_ZERO = 0x35 + IP_OPTIONS = 0x1 + IP_PKTINFO = 0x1a + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVPKTINFO = 0x1a + IP_RECVRETOPTS = 0x6 + IP_RECVTTL = 0x18 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_STRIPHDR = 0x17 + IP_TOS = 0x3 + IP_TRAFFIC_MGT_BACKGROUND = 0x41 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_CAN_REUSE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_FREE_REUSABLE = 0x7 + MADV_FREE_REUSE = 0x8 + MADV_NORMAL = 0x0 + MADV_PAGEOUT = 0xa + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MADV_ZERO_WIRED_PAGES = 0x6 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_JIT = 0x800 + MAP_NOCACHE = 0x400 + MAP_NOEXTEND = 0x100 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_RESERVED0080 = 0x80 + MAP_RESILIENT_CODESIGN = 0x2000 + MAP_RESILIENT_MEDIA = 0x4000 + MAP_SHARED = 0x1 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x400000 + MNT_CMDFLAGS = 0xf0000 + MNT_CPROTECT = 0x80 + MNT_DEFWRITE = 0x2000000 + MNT_DONTBROWSE = 0x100000 + MNT_DOVOLFS = 0x8000 + MNT_DWAIT = 0x4 + MNT_EXPORTED = 0x100 + MNT_FORCE = 0x80000 + MNT_IGNORE_OWNERSHIP = 0x200000 + MNT_JOURNALED = 0x800000 + MNT_LOCAL = 0x1000 + MNT_MULTILABEL = 0x4000000 + MNT_NOATIME = 0x10000000 + MNT_NOBLOCK = 0x20000 + MNT_NODEV = 0x10 + MNT_NOEXEC = 0x4 + MNT_NOSUID = 0x8 + MNT_NOUSERXATTR = 0x1000000 + MNT_NOWAIT = 0x2 + MNT_QUARANTINE = 0x400 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UNKNOWNPERMISSIONS = 0x200000 + MNT_UPDATE = 0x10000 + MNT_VISFLAGMASK = 0x17f0f5ff + MNT_WAIT = 0x1 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_FLUSH = 0x400 + MSG_HAVEMORE = 0x2000 + MSG_HOLD = 0x800 + MSG_NEEDSA = 0x10000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_RCVMORE = 0x4000 + MSG_SEND = 0x1000 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITSTREAM = 0x200 + MS_ASYNC = 0x1 + MS_DEACTIVATE = 0x8 + MS_INVALIDATE = 0x2 + MS_KILLPAGES = 0x4 + MS_SYNC = 0x10 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_DUMP2 = 0x7 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLIST2 = 0x6 + NET_RT_MAXID = 0xa + NET_RT_STAT = 0x4 + NET_RT_TRASH = 0x5 + NL0 = 0x0 + NL1 = 0x100 + NL2 = 0x200 + NL3 = 0x300 + NLDLY = 0x300 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ABSOLUTE = 0x8 + NOTE_ATTRIB = 0x8 + NOTE_BACKGROUND = 0x40 + NOTE_CHILD = 0x4 + NOTE_CRITICAL = 0x20 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXITSTATUS = 0x4000000 + NOTE_EXIT_CSERROR = 0x40000 + NOTE_EXIT_DECRYPTFAIL = 0x10000 + NOTE_EXIT_DETAIL = 0x2000000 + NOTE_EXIT_DETAIL_MASK = 0x70000 + NOTE_EXIT_MEMORY = 0x20000 + NOTE_EXIT_REPARENTED = 0x80000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FORK = 0x40000000 + NOTE_FUNLOCK = 0x100 + NOTE_LEEWAY = 0x10 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_MACH_CONTINUOUS_TIME = 0x80 + NOTE_NONE = 0x80 + NOTE_NSECONDS = 0x4 + NOTE_OOB = 0x2 + NOTE_PCTRLMASK = -0x100000 + NOTE_PDATAMASK = 0xfffff + NOTE_REAP = 0x10000000 + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_SIGNAL = 0x8000000 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x2 + NOTE_VM_ERROR = 0x10000000 + NOTE_VM_PRESSURE = 0x80000000 + NOTE_VM_PRESSURE_SUDDEN_TERMINATE = 0x20000000 + NOTE_VM_PRESSURE_TERMINATE = 0x40000000 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OFDEL = 0x20000 + OFILL = 0x80 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_ALERT = 0x20000000 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x1000000 + O_CREAT = 0x200 + O_DIRECTORY = 0x100000 + O_DP_GETRAWENCRYPTED = 0x1 + O_DP_GETRAWUNENCRYPTED = 0x2 + O_DSYNC = 0x400000 + O_EVTONLY = 0x8000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x20000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_POPUP = 0x80000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYMLINK = 0x200000 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PT_ATTACH = 0xa + PT_ATTACHEXC = 0xe + PT_CONTINUE = 0x7 + PT_DENY_ATTACH = 0x1f + PT_DETACH = 0xb + PT_FIRSTMACH = 0x20 + PT_FORCEQUOTA = 0x1e + PT_KILL = 0x8 + PT_READ_D = 0x2 + PT_READ_I = 0x1 + PT_READ_U = 0x3 + PT_SIGEXC = 0xc + PT_STEP = 0x9 + PT_THUPDATE = 0xd + PT_TRACE_ME = 0x0 + PT_WRITE_D = 0x5 + PT_WRITE_I = 0x4 + PT_WRITE_U = 0x6 + RLIMIT_AS = 0x5 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_CPU_USAGE_MONITOR = 0x2 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_CLONING = 0x100 + RTF_CONDEMNED = 0x2000000 + RTF_DELCLONE = 0x80 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_IFREF = 0x4000000 + RTF_IFSCOPE = 0x1000000 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_NOIFREF = 0x2000 + RTF_PINNED = 0x100000 + RTF_PRCLONING = 0x10000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_PROXY = 0x8000000 + RTF_REJECT = 0x8 + RTF_ROUTER = 0x10000000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_WASCLONED = 0x20000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_GET2 = 0x14 + RTM_IFINFO = 0xe + RTM_IFINFO2 = 0x12 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_NEWMADDR2 = 0x13 + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SCM_TIMESTAMP_MONOTONIC = 0x4 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCARPIPLL = 0xc0206928 + SIOCATMARK = 0x40047307 + SIOCAUTOADDR = 0xc0206926 + SIOCAUTONETMASK = 0x80206927 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFPHYADDR = 0x80206941 + SIOCGDRVSPEC = 0xc028697b + SIOCGETVLAN = 0xc020697f + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFALTMTU = 0xc0206948 + SIOCGIFASYNCMAP = 0xc020697c + SIOCGIFBOND = 0xc0206947 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020695b + SIOCGIFCONF = 0xc00c6924 + SIOCGIFDEVMTU = 0xc0206944 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFKPI = 0xc0206987 + SIOCGIFMAC = 0xc0206982 + SIOCGIFMEDIA = 0xc02c6938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206940 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc020693f + SIOCGIFSTATUS = 0xc331693d + SIOCGIFVLAN = 0xc020697f + SIOCGIFWAKEFLAGS = 0xc0206988 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCIFCREATE = 0xc0206978 + SIOCIFCREATE2 = 0xc020697a + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc0106981 + SIOCRSLVMULTI = 0xc010693b + SIOCSDRVSPEC = 0x8028697b + SIOCSETVLAN = 0x8020697e + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFALTMTU = 0x80206945 + SIOCSIFASYNCMAP = 0x8020697d + SIOCSIFBOND = 0x80206946 + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020695a + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFKPI = 0x80206986 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206983 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x8040693e + SIOCSIFPHYS = 0x80206936 + SIOCSIFVLAN = 0x8020697e + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_DONTTRUNC = 0x2000 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1010 + SO_LINGER = 0x80 + SO_LINGER_SEC = 0x1080 + SO_NETSVC_MARKING_LEVEL = 0x1119 + SO_NET_SERVICE_TYPE = 0x1116 + SO_NKE = 0x1021 + SO_NOADDRERR = 0x1023 + SO_NOSIGPIPE = 0x1022 + SO_NOTIFYCONFLICT = 0x1026 + SO_NP_EXTENSIONS = 0x1083 + SO_NREAD = 0x1020 + SO_NUMRCVPKT = 0x1112 + SO_NWRITE = 0x1024 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1011 + SO_RANDOMPORT = 0x1082 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_REUSESHAREUID = 0x1025 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TIMESTAMP_MONOTONIC = 0x800 + SO_TYPE = 0x1008 + SO_UPCALLCLOSEWAIT = 0x1027 + SO_USELOOPBACK = 0x40 + SO_WANTMORE = 0x4000 + SO_WANTOOBFLAG = 0x8000 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFWHT = 0xe000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x400 + TAB2 = 0x800 + TAB3 = 0x4 + TABDLY = 0xc04 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCP_CONNECTIONTIMEOUT = 0x20 + TCP_CONNECTION_INFO = 0x106 + TCP_ENABLE_ECN = 0x104 + TCP_FASTOPEN = 0x105 + TCP_KEEPALIVE = 0x10 + TCP_KEEPCNT = 0x102 + TCP_KEEPINTVL = 0x101 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MINMSS = 0xd8 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_NOTSENT_LOWAT = 0x201 + TCP_RXT_CONNDROPTIME = 0x80 + TCP_RXT_FINDROP = 0x100 + TCP_SENDMOREACKS = 0x103 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x40107458 + TIOCDRAIN = 0x2000745e + TIOCDSIMICROCODE = 0x20007455 + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x40487413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGWINSZ = 0x40087468 + TIOCIXOFF = 0x20007480 + TIOCIXON = 0x20007481 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMODG = 0x40047403 + TIOCMODS = 0x80047404 + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTYGNAME = 0x40807453 + TIOCPTYGRANT = 0x20007454 + TIOCPTYUNLK = 0x20007452 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCONS = 0x20007463 + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x80487414 + TIOCSETAF = 0x80487416 + TIOCSETAW = 0x80487415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2000745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40107459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VM_LOADAVG = 0x2 + VM_MACHFACTOR = 0x4 + VM_MAXID = 0x6 + VM_METER = 0x1 + VM_SWAPUSAGE = 0x5 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VT0 = 0x0 + VT1 = 0x10000 + VTDLY = 0x10000 + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x10 + WCOREFLAG = 0x80 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOWAIT = 0x20 + WORDSIZE = 0x40 + WSTOPPED = 0x8 + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADARCH = syscall.Errno(0x56) + EBADEXEC = syscall.Errno(0x55) + EBADF = syscall.Errno(0x9) + EBADMACHO = syscall.Errno(0x58) + EBADMSG = syscall.Errno(0x5e) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x59) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDEVERR = syscall.Errno(0x53) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x5a) + EILSEQ = syscall.Errno(0x5c) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x6a) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5f) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x5d) + ENOBUFS = syscall.Errno(0x37) + ENODATA = syscall.Errno(0x60) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x61) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x5b) + ENOPOLICY = syscall.Errno(0x67) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x62) + ENOSTR = syscall.Errno(0x63) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x68) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x66) + EOVERFLOW = syscall.Errno(0x54) + EOWNERDEAD = syscall.Errno(0x69) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x64) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + EPWROFF = syscall.Errno(0x52) + EQFULL = syscall.Errno(0x6a) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHLIBVERS = syscall.Errno(0x57) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIME = syscall.Errno(0x65) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "device not configured", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource deadlock avoided", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "resource busy", + 17: "file exists", + 18: "cross-device link", + 19: "operation not supported by device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "result too large", + 35: "resource temporarily unavailable", + 36: "operation now in progress", + 37: "operation already in progress", + 38: "socket operation on non-socket", + 39: "destination address required", + 40: "message too long", + 41: "protocol wrong type for socket", + 42: "protocol not available", + 43: "protocol not supported", + 44: "socket type not supported", + 45: "operation not supported", + 46: "protocol family not supported", + 47: "address family not supported by protocol family", + 48: "address already in use", + 49: "can't assign requested address", + 50: "network is down", + 51: "network is unreachable", + 52: "network dropped connection on reset", + 53: "software caused connection abort", + 54: "connection reset by peer", + 55: "no buffer space available", + 56: "socket is already connected", + 57: "socket is not connected", + 58: "can't send after socket shutdown", + 59: "too many references: can't splice", + 60: "operation timed out", + 61: "connection refused", + 62: "too many levels of symbolic links", + 63: "file name too long", + 64: "host is down", + 65: "no route to host", + 66: "directory not empty", + 67: "too many processes", + 68: "too many users", + 69: "disc quota exceeded", + 70: "stale NFS file handle", + 71: "too many levels of remote in path", + 72: "RPC struct is bad", + 73: "RPC version wrong", + 74: "RPC prog. not avail", + 75: "program version wrong", + 76: "bad procedure for program", + 77: "no locks available", + 78: "function not implemented", + 79: "inappropriate file type or format", + 80: "authentication error", + 81: "need authenticator", + 82: "device power is off", + 83: "device error", + 84: "value too large to be stored in data type", + 85: "bad executable (or shared library)", + 86: "bad CPU type in executable", + 87: "shared library version mismatch", + 88: "malformed Mach-o file", + 89: "operation canceled", + 90: "identifier removed", + 91: "no message of desired type", + 92: "illegal byte sequence", + 93: "attribute not found", + 94: "bad message", + 95: "EMULTIHOP (Reserved)", + 96: "no message available on STREAM", + 97: "ENOLINK (Reserved)", + 98: "no STREAM resources", + 99: "not a STREAM", + 100: "protocol error", + 101: "STREAM ioctl timeout", + 102: "operation not supported on socket", + 103: "policy not found", + 104: "state not recoverable", + 105: "previous owner died", + 106: "interface output queue is full", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/BPT trap", + 6: "abort trap", + 7: "EMT trap", + 8: "floating point exception", + 9: "killed", + 10: "bus error", + 11: "segmentation fault", + 12: "bad system call", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "urgent I/O condition", + 17: "suspended (signal)", + 18: "suspended", + 19: "continued", + 20: "child exited", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "I/O possible", + 24: "cputime limit exceeded", + 25: "filesize limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window size changes", + 29: "information request", + 30: "user defined signal 1", + 31: "user defined signal 2", +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go new file mode 100644 index 0000000..8f40598 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go @@ -0,0 +1,1568 @@ +// mkerrors.sh -m64 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,dragonfly + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_ATM = 0x1e + AF_BLUETOOTH = 0x21 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x23 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1c + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x24 + AF_MPLS = 0x22 + AF_NATM = 0x1d + AF_NETBIOS = 0x6 + AF_NETGRAPH = 0x20 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SIP = 0x18 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + ALTWERASE = 0x200 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B9600 = 0x2580 + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0104279 + BIOCGETIF = 0x4020426b + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x2000427a + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044278 + BIOCSETF = 0x80104267 + BIOCSETIF = 0x8020426c + BIOCSETWF = 0x8010427b + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8010426d + BIOCSSEESENT = 0x80044277 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x8 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DEFAULTBUFSIZE = 0x1000 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MAX_CLONES = 0x80 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x4 + CLOCK_MONOTONIC_FAST = 0xc + CLOCK_MONOTONIC_PRECISE = 0xb + CLOCK_PROCESS_CPUTIME_ID = 0xf + CLOCK_PROF = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_FAST = 0xa + CLOCK_REALTIME_PRECISE = 0x9 + CLOCK_SECOND = 0xd + CLOCK_THREAD_CPUTIME_ID = 0xe + CLOCK_UPTIME = 0x5 + CLOCK_UPTIME_FAST = 0x8 + CLOCK_UPTIME_PRECISE = 0x7 + CLOCK_VIRTUAL = 0x1 + CREAD = 0x800 + CRTSCTS = 0x30000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DOCSIS = 0x8f + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_REDBACK_SMARTEDGE = 0x20 + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DBF = 0xf + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_EXCEPT = -0x8 + EVFILT_FS = -0xa + EVFILT_MARKER = 0xf + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xa + EVFILT_TIMER = -0x7 + EVFILT_USER = -0x9 + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_NODATA = 0x1000 + EV_ONESHOT = 0x10 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTEXIT_LWP = 0x10000 + EXTEXIT_PROC = 0x0 + EXTEXIT_SETINT = 0x1 + EXTEXIT_SIMPLE = 0x0 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_DUP2FD = 0xa + F_DUP2FD_CLOEXEC = 0x12 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x11 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETOWN = 0x5 + F_OK = 0x0 + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_WRLCK = 0x3 + HUPCL = 0x4000 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x118e72 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MONITOR = 0x40000 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NPOLLING = 0x100000 + IFF_OACTIVE = 0x400 + IFF_OACTIVE_COMPAT = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_POLLING = 0x10000 + IFF_POLLING_COMPAT = 0x10000 + IFF_PPROMISC = 0x20000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_SMART = 0x20 + IFF_STATICARP = 0x80000 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf8 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf2 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PLC = 0xae + IFT_POS = 0xab + IFT_PPP = 0x17 + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf1 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_STF = 0xf3 + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VOICEEM = 0x64 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CARP = 0x70 + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0xfe + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MEAS = 0x13 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MOBILE = 0x37 + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SDRP = 0x2a + IPPROTO_SEP = 0x21 + IPPROTO_SKIP = 0x39 + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TLSP = 0x38 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_UNKNOWN = 0x102 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_BINDV6ONLY = 0x1b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXPACKET = 0xffff + IPV6_MINHLIM = 0x28 + IPV6_MMTU = 0x500 + IPV6_MSFILTER = 0x4a + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PKTOPTIONS = 0x34 + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_PREFER_TEMPADDR = 0x3f + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FAITH = 0x16 + IP_FW_ADD = 0x32 + IP_FW_DEL = 0x33 + IP_FW_FLUSH = 0x34 + IP_FW_GET = 0x36 + IP_FW_RESETLOG = 0x37 + IP_FW_X = 0x31 + IP_FW_ZERO = 0x35 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x42 + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVTTL = 0x41 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_TOS = 0x3 + IP_TTL = 0x4 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_AUTOSYNC = 0x7 + MADV_CONTROL_END = 0xb + MADV_CONTROL_START = 0xa + MADV_CORE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_INVAL = 0xa + MADV_NOCORE = 0x8 + MADV_NORMAL = 0x0 + MADV_NOSYNC = 0x6 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_SETMAP = 0xb + MADV_WILLNEED = 0x3 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_INHERIT = 0x80 + MAP_NOCORE = 0x20000 + MAP_NOEXTEND = 0x100 + MAP_NORESERVE = 0x40 + MAP_NOSYNC = 0x800 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_SIZEALIGN = 0x40000 + MAP_STACK = 0x400 + MAP_TRYFIXED = 0x10000 + MAP_VPAGETABLE = 0x2000 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MSG_CMSG_CLOEXEC = 0x1000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_FBLOCKING = 0x10000 + MSG_FMASK = 0xffff0000 + MSG_FNONBLOCKING = 0x20000 + MSG_NOSIGNAL = 0x400 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_SYNC = 0x800 + MSG_TRUNC = 0x10 + MSG_UNUSED09 = 0x200 + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x0 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_MAXID = 0x4 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_OOB = 0x2 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x20000 + O_CREAT = 0x200 + O_DIRECT = 0x10000 + O_DIRECTORY = 0x8000000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FAPPEND = 0x100000 + O_FASYNCWRITE = 0x800000 + O_FBLOCKING = 0x40000 + O_FMASK = 0xfc0000 + O_FNONBLOCKING = 0x80000 + O_FOFFSET = 0x200000 + O_FSYNC = 0x80 + O_FSYNCWRITE = 0x400000 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x8 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0xb + RTAX_MPLS1 = 0x8 + RTAX_MPLS2 = 0x9 + RTAX_MPLS3 = 0xa + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_MPLS1 = 0x100 + RTA_MPLS2 = 0x200 + RTA_MPLS3 = 0x400 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MPLSOPS = 0x1000000 + RTF_MULTICAST = 0x800000 + RTF_PINNED = 0x100000 + RTF_PRCLONING = 0x10000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_REJECT = 0x8 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_WASCLONED = 0x20000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x12 + RTM_IFANNOUNCE = 0x11 + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x6 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_IWCAPSEGS = 0x400 + RTV_IWMAXSEGS = 0x200 + RTV_MSL = 0x100 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCADDRT = 0x8040720a + SIOCAIFADDR = 0x8040691a + SIOCALIFADDR = 0x8118691b + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80206932 + SIOCDELRT = 0x8040720b + SIOCDIFADDR = 0x80206919 + SIOCDIFPHYADDR = 0x80206949 + SIOCDLIFADDR = 0x8118691d + SIOCGDRVSPEC = 0xc028697b + SIOCGETSGCNT = 0xc0207210 + SIOCGETVIFCNT = 0xc028720f + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020691f + SIOCGIFCONF = 0xc0106924 + SIOCGIFDATA = 0xc0206926 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc028698a + SIOCGIFINDEX = 0xc0206920 + SIOCGIFMEDIA = 0xc0306938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206948 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPOLLCPU = 0xc020697e + SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFSTATUS = 0xc331693b + SIOCGIFTSOLEN = 0xc0206980 + SIOCGLIFADDR = 0xc118691c + SIOCGLIFPHYADDR = 0xc118694b + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGPRIVATE_0 = 0xc0206950 + SIOCGPRIVATE_1 = 0xc0206951 + SIOCIFCREATE = 0xc020697a + SIOCIFCREATE2 = 0xc020697c + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc0106978 + SIOCSDRVSPEC = 0x8028697b + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020691e + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNAME = 0x80206928 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSIFPHYS = 0x80206936 + SIOCSIFPOLLCPU = 0x8020697d + SIOCSIFTSOLEN = 0x8020697f + SIOCSLIFPHYADDR = 0x8118694a + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_NONBLOCK = 0x20000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BROADCAST = 0x20 + SO_CPUHINT = 0x1030 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_NOSIGPIPE = 0x800 + SO_OOBINLINE = 0x100 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDSPACE = 0x100a + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCP_FASTKEEP = 0x80 + TCP_KEEPCNT = 0x400 + TCP_KEEPIDLE = 0x100 + TCP_KEEPINIT = 0x20 + TCP_KEEPINTVL = 0x200 + TCP_MAXBURST = 0x4 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MINMSS = 0x100 + TCP_MIN_WINSHIFT = 0x5 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_SIGNATURE_ENABLE = 0x10 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x40107458 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGSID = 0x40047463 + TIOCGSIZE = 0x40087468 + TIOCGWINSZ = 0x40087468 + TIOCISPTMASTER = 0x20007455 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMODG = 0x40047403 + TIOCMODS = 0x80047404 + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2000745f + TIOCSPGRP = 0x80047476 + TIOCSSIZE = 0x80087467 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40107459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VCHECKPT = 0x13 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VERASE2 = 0x7 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VM_BCACHE_SIZE_MAX = 0x0 + VM_SWZONE_SIZE_MAX = 0x4000000000 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x4 + WCOREFLAG = 0x80 + WLINUXCLONE = 0x80000000 + WNOHANG = 0x1 + WSTOPPED = 0x7f + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EASYNC = syscall.Errno(0x63) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x59) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x55) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDOOFUS = syscall.Errno(0x58) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x52) + EILSEQ = syscall.Errno(0x56) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x63) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5a) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x57) + ENOBUFS = syscall.Errno(0x37) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x5b) + ENOMEDIUM = syscall.Errno(0x5d) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x53) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x54) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x5c) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUNUSED94 = syscall.Errno(0x5e) + EUNUSED95 = syscall.Errno(0x5f) + EUNUSED96 = syscall.Errno(0x60) + EUNUSED97 = syscall.Errno(0x61) + EUNUSED98 = syscall.Errno(0x62) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCKPT = syscall.Signal(0x21) + SIGCKPTEXIT = syscall.Signal(0x22) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHR = syscall.Signal(0x20) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "device not configured", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource deadlock avoided", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device busy", + 17: "file exists", + 18: "cross-device link", + 19: "operation not supported by device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "result too large", + 35: "resource temporarily unavailable", + 36: "operation now in progress", + 37: "operation already in progress", + 38: "socket operation on non-socket", + 39: "destination address required", + 40: "message too long", + 41: "protocol wrong type for socket", + 42: "protocol not available", + 43: "protocol not supported", + 44: "socket type not supported", + 45: "operation not supported", + 46: "protocol family not supported", + 47: "address family not supported by protocol family", + 48: "address already in use", + 49: "can't assign requested address", + 50: "network is down", + 51: "network is unreachable", + 52: "network dropped connection on reset", + 53: "software caused connection abort", + 54: "connection reset by peer", + 55: "no buffer space available", + 56: "socket is already connected", + 57: "socket is not connected", + 58: "can't send after socket shutdown", + 59: "too many references: can't splice", + 60: "operation timed out", + 61: "connection refused", + 62: "too many levels of symbolic links", + 63: "file name too long", + 64: "host is down", + 65: "no route to host", + 66: "directory not empty", + 67: "too many processes", + 68: "too many users", + 69: "disc quota exceeded", + 70: "stale NFS file handle", + 71: "too many levels of remote in path", + 72: "RPC struct is bad", + 73: "RPC version wrong", + 74: "RPC prog. not avail", + 75: "program version wrong", + 76: "bad procedure for program", + 77: "no locks available", + 78: "function not implemented", + 79: "inappropriate file type or format", + 80: "authentication error", + 81: "need authenticator", + 82: "identifier removed", + 83: "no message of desired type", + 84: "value too large to be stored in data type", + 85: "operation canceled", + 86: "illegal byte sequence", + 87: "attribute not found", + 88: "programming error", + 89: "bad message", + 90: "multihop attempted", + 91: "link has been severed", + 92: "protocol error", + 93: "no medium found", + 94: "unknown error: 94", + 95: "unknown error: 95", + 96: "unknown error: 96", + 97: "unknown error: 97", + 98: "unknown error: 98", + 99: "unknown error: 99", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/BPT trap", + 6: "abort trap", + 7: "EMT trap", + 8: "floating point exception", + 9: "killed", + 10: "bus error", + 11: "segmentation fault", + 12: "bad system call", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "urgent I/O condition", + 17: "suspended (signal)", + 18: "suspended", + 19: "continued", + 20: "child exited", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "I/O possible", + 24: "cputime limit exceeded", + 25: "filesize limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window size changes", + 29: "information request", + 30: "user defined signal 1", + 31: "user defined signal 2", + 32: "thread Scheduler", + 33: "checkPoint", + 34: "checkPointExit", +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go new file mode 100644 index 0000000..adf5eef --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go @@ -0,0 +1,1749 @@ +// mkerrors.sh -m32 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,freebsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m32 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_ARP = 0x23 + AF_ATM = 0x1e + AF_BLUETOOTH = 0x24 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1c + AF_INET6_SDP = 0x2a + AF_INET_SDP = 0x28 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x2a + AF_NATM = 0x1d + AF_NETBIOS = 0x6 + AF_NETGRAPH = 0x20 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SCLUSTER = 0x22 + AF_SIP = 0x18 + AF_SLOW = 0x21 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VENDOR00 = 0x27 + AF_VENDOR01 = 0x29 + AF_VENDOR02 = 0x2b + AF_VENDOR03 = 0x2d + AF_VENDOR04 = 0x2f + AF_VENDOR05 = 0x31 + AF_VENDOR06 = 0x33 + AF_VENDOR07 = 0x35 + AF_VENDOR08 = 0x37 + AF_VENDOR09 = 0x39 + AF_VENDOR10 = 0x3b + AF_VENDOR11 = 0x3d + AF_VENDOR12 = 0x3f + AF_VENDOR13 = 0x41 + AF_VENDOR14 = 0x43 + AF_VENDOR15 = 0x45 + AF_VENDOR16 = 0x47 + AF_VENDOR17 = 0x49 + AF_VENDOR18 = 0x4b + AF_VENDOR19 = 0x4d + AF_VENDOR20 = 0x4f + AF_VENDOR21 = 0x51 + AF_VENDOR22 = 0x53 + AF_VENDOR23 = 0x55 + AF_VENDOR24 = 0x57 + AF_VENDOR25 = 0x59 + AF_VENDOR26 = 0x5b + AF_VENDOR27 = 0x5d + AF_VENDOR28 = 0x5f + AF_VENDOR29 = 0x61 + AF_VENDOR30 = 0x63 + AF_VENDOR31 = 0x65 + AF_VENDOR32 = 0x67 + AF_VENDOR33 = 0x69 + AF_VENDOR34 = 0x6b + AF_VENDOR35 = 0x6d + AF_VENDOR36 = 0x6f + AF_VENDOR37 = 0x71 + AF_VENDOR38 = 0x73 + AF_VENDOR39 = 0x75 + AF_VENDOR40 = 0x77 + AF_VENDOR41 = 0x79 + AF_VENDOR42 = 0x7b + AF_VENDOR43 = 0x7d + AF_VENDOR44 = 0x7f + AF_VENDOR45 = 0x81 + AF_VENDOR46 = 0x83 + AF_VENDOR47 = 0x85 + ALTWERASE = 0x200 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B460800 = 0x70800 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B921600 = 0xe1000 + B9600 = 0x2580 + BIOCFEEDBACK = 0x8004427c + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDIRECTION = 0x40044276 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0084279 + BIOCGETBUFMODE = 0x4004427d + BIOCGETIF = 0x4020426b + BIOCGETZMAX = 0x4004427f + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4008426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCGTSTAMP = 0x40044283 + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x2000427a + BIOCPROMISC = 0x20004269 + BIOCROTZBUF = 0x400c4280 + BIOCSBLEN = 0xc0044266 + BIOCSDIRECTION = 0x80044277 + BIOCSDLT = 0x80044278 + BIOCSETBUFMODE = 0x8004427e + BIOCSETF = 0x80084267 + BIOCSETFNR = 0x80084282 + BIOCSETIF = 0x8020426c + BIOCSETWF = 0x8008427b + BIOCSETZBUF = 0x800c4281 + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8008426d + BIOCSSEESENT = 0x80044277 + BIOCSTSTAMP = 0x80044284 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_BUFMODE_BUFFER = 0x1 + BPF_BUFMODE_ZBUF = 0x2 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_T_BINTIME = 0x2 + BPF_T_BINTIME_FAST = 0x102 + BPF_T_BINTIME_MONOTONIC = 0x202 + BPF_T_BINTIME_MONOTONIC_FAST = 0x302 + BPF_T_FAST = 0x100 + BPF_T_FLAG_MASK = 0x300 + BPF_T_FORMAT_MASK = 0x3 + BPF_T_MICROTIME = 0x0 + BPF_T_MICROTIME_FAST = 0x100 + BPF_T_MICROTIME_MONOTONIC = 0x200 + BPF_T_MICROTIME_MONOTONIC_FAST = 0x300 + BPF_T_MONOTONIC = 0x200 + BPF_T_MONOTONIC_FAST = 0x300 + BPF_T_NANOTIME = 0x1 + BPF_T_NANOTIME_FAST = 0x101 + BPF_T_NANOTIME_MONOTONIC = 0x201 + BPF_T_NANOTIME_MONOTONIC_FAST = 0x301 + BPF_T_NONE = 0x3 + BPF_T_NORMAL = 0x0 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + CAP_ACCEPT = 0x200000020000000 + CAP_ACL_CHECK = 0x400000000010000 + CAP_ACL_DELETE = 0x400000000020000 + CAP_ACL_GET = 0x400000000040000 + CAP_ACL_SET = 0x400000000080000 + CAP_ALL0 = 0x20007ffffffffff + CAP_ALL1 = 0x4000000001fffff + CAP_BIND = 0x200000040000000 + CAP_BINDAT = 0x200008000000400 + CAP_CHFLAGSAT = 0x200000000001400 + CAP_CONNECT = 0x200000080000000 + CAP_CONNECTAT = 0x200010000000400 + CAP_CREATE = 0x200000000000040 + CAP_EVENT = 0x400000000000020 + CAP_EXTATTR_DELETE = 0x400000000001000 + CAP_EXTATTR_GET = 0x400000000002000 + CAP_EXTATTR_LIST = 0x400000000004000 + CAP_EXTATTR_SET = 0x400000000008000 + CAP_FCHDIR = 0x200000000000800 + CAP_FCHFLAGS = 0x200000000001000 + CAP_FCHMOD = 0x200000000002000 + CAP_FCHMODAT = 0x200000000002400 + CAP_FCHOWN = 0x200000000004000 + CAP_FCHOWNAT = 0x200000000004400 + CAP_FCNTL = 0x200000000008000 + CAP_FCNTL_ALL = 0x78 + CAP_FCNTL_GETFL = 0x8 + CAP_FCNTL_GETOWN = 0x20 + CAP_FCNTL_SETFL = 0x10 + CAP_FCNTL_SETOWN = 0x40 + CAP_FEXECVE = 0x200000000000080 + CAP_FLOCK = 0x200000000010000 + CAP_FPATHCONF = 0x200000000020000 + CAP_FSCK = 0x200000000040000 + CAP_FSTAT = 0x200000000080000 + CAP_FSTATAT = 0x200000000080400 + CAP_FSTATFS = 0x200000000100000 + CAP_FSYNC = 0x200000000000100 + CAP_FTRUNCATE = 0x200000000000200 + CAP_FUTIMES = 0x200000000200000 + CAP_FUTIMESAT = 0x200000000200400 + CAP_GETPEERNAME = 0x200000100000000 + CAP_GETSOCKNAME = 0x200000200000000 + CAP_GETSOCKOPT = 0x200000400000000 + CAP_IOCTL = 0x400000000000080 + CAP_IOCTLS_ALL = 0x7fffffff + CAP_KQUEUE = 0x400000000100040 + CAP_KQUEUE_CHANGE = 0x400000000100000 + CAP_KQUEUE_EVENT = 0x400000000000040 + CAP_LINKAT_SOURCE = 0x200020000000400 + CAP_LINKAT_TARGET = 0x200000000400400 + CAP_LISTEN = 0x200000800000000 + CAP_LOOKUP = 0x200000000000400 + CAP_MAC_GET = 0x400000000000001 + CAP_MAC_SET = 0x400000000000002 + CAP_MKDIRAT = 0x200000000800400 + CAP_MKFIFOAT = 0x200000001000400 + CAP_MKNODAT = 0x200000002000400 + CAP_MMAP = 0x200000000000010 + CAP_MMAP_R = 0x20000000000001d + CAP_MMAP_RW = 0x20000000000001f + CAP_MMAP_RWX = 0x20000000000003f + CAP_MMAP_RX = 0x20000000000003d + CAP_MMAP_W = 0x20000000000001e + CAP_MMAP_WX = 0x20000000000003e + CAP_MMAP_X = 0x20000000000003c + CAP_PDGETPID = 0x400000000000200 + CAP_PDKILL = 0x400000000000800 + CAP_PDWAIT = 0x400000000000400 + CAP_PEELOFF = 0x200001000000000 + CAP_POLL_EVENT = 0x400000000000020 + CAP_PREAD = 0x20000000000000d + CAP_PWRITE = 0x20000000000000e + CAP_READ = 0x200000000000001 + CAP_RECV = 0x200000000000001 + CAP_RENAMEAT_SOURCE = 0x200000004000400 + CAP_RENAMEAT_TARGET = 0x200040000000400 + CAP_RIGHTS_VERSION = 0x0 + CAP_RIGHTS_VERSION_00 = 0x0 + CAP_SEEK = 0x20000000000000c + CAP_SEEK_TELL = 0x200000000000004 + CAP_SEM_GETVALUE = 0x400000000000004 + CAP_SEM_POST = 0x400000000000008 + CAP_SEM_WAIT = 0x400000000000010 + CAP_SEND = 0x200000000000002 + CAP_SETSOCKOPT = 0x200002000000000 + CAP_SHUTDOWN = 0x200004000000000 + CAP_SOCK_CLIENT = 0x200007780000003 + CAP_SOCK_SERVER = 0x200007f60000003 + CAP_SYMLINKAT = 0x200000008000400 + CAP_TTYHOOK = 0x400000000000100 + CAP_UNLINKAT = 0x200000010000400 + CAP_UNUSED0_44 = 0x200080000000000 + CAP_UNUSED0_57 = 0x300000000000000 + CAP_UNUSED1_22 = 0x400000000200000 + CAP_UNUSED1_57 = 0x500000000000000 + CAP_WRITE = 0x200000000000002 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x4 + CLOCK_MONOTONIC_FAST = 0xc + CLOCK_MONOTONIC_PRECISE = 0xb + CLOCK_PROCESS_CPUTIME_ID = 0xf + CLOCK_PROF = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_FAST = 0xa + CLOCK_REALTIME_PRECISE = 0x9 + CLOCK_SECOND = 0xd + CLOCK_THREAD_CPUTIME_ID = 0xe + CLOCK_UPTIME = 0x5 + CLOCK_UPTIME_FAST = 0x8 + CLOCK_UPTIME_PRECISE = 0x7 + CLOCK_VIRTUAL = 0x1 + CREAD = 0x800 + CRTSCTS = 0x30000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_MAXNAME = 0x18 + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_BREDR_BB = 0xff + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_BLUETOOTH_LE_LL = 0xfb + DLT_BLUETOOTH_LE_LL_WITH_PHDR = 0x100 + DLT_BLUETOOTH_LINUX_MONITOR = 0xfe + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_EPON = 0x103 + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_INFINIBAND = 0xf7 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPMI_HPM_2 = 0x104 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0x104 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NETLINK = 0xfd + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x79 + DLT_PKTAP = 0x102 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PROFIBUS_DL = 0x101 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RIO = 0x7c + DLT_RTAC_SERIAL = 0xfa + DLT_SCCP = 0x8e + DLT_SCTP = 0xf8 + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USBPCAP = 0xf9 + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WIHART = 0xdf + DLT_WIRESHARK_UPPER_PDU = 0xfc + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_FS = -0x9 + EVFILT_LIO = -0xa + EVFILT_PROC = -0x5 + EVFILT_PROCDESC = -0x8 + EVFILT_READ = -0x1 + EVFILT_SENDFILE = -0xc + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xc + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xb + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_DROP = 0x1000 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_FLAG2 = 0x4000 + EV_FORCEONESHOT = 0x100 + EV_ONESHOT = 0x10 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTATTR_NAMESPACE_EMPTY = 0x0 + EXTATTR_NAMESPACE_SYSTEM = 0x2 + EXTATTR_NAMESPACE_USER = 0x1 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_CANCEL = 0x5 + F_DUP2FD = 0xa + F_DUP2FD_CLOEXEC = 0x12 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x11 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0xb + F_GETOWN = 0x5 + F_OGETLK = 0x7 + F_OK = 0x0 + F_OSETLK = 0x8 + F_OSETLKW = 0x9 + F_RDAHEAD = 0x10 + F_RDLCK = 0x1 + F_READAHEAD = 0xf + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0xc + F_SETLKW = 0xd + F_SETLK_REMOTE = 0xe + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_UNLCKSYS = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x218f52 + IFF_CANTCONFIG = 0x10000 + IFF_DEBUG = 0x4 + IFF_DRV_OACTIVE = 0x400 + IFF_DRV_RUNNING = 0x40 + IFF_DYING = 0x200000 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MONITOR = 0x40000 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PPROMISC = 0x20000 + IFF_PROMISC = 0x100 + IFF_RENAMING = 0x400000 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_STATICARP = 0x80000 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_BRIDGE = 0xd1 + IFT_CARP = 0xf8 + IFT_IEEE1394 = 0x90 + IFT_INFINIBAND = 0xc7 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_PPP = 0x17 + IFT_PROPVIRTUAL = 0x35 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IN_RFC3021_MASK = 0xfffffffe + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CARP = 0x70 + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0x102 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HIP = 0x8b + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MEAS = 0x13 + IPPROTO_MH = 0x87 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MOBILE = 0x37 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OLD_DIVERT = 0xfe + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_RESERVED_253 = 0xfd + IPPROTO_RESERVED_254 = 0xfe + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEND = 0x103 + IPPROTO_SEP = 0x21 + IPPROTO_SHIM6 = 0x8c + IPPROTO_SKIP = 0x39 + IPPROTO_SPACER = 0x7fff + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TLSP = 0x38 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_BINDANY = 0x40 + IPV6_BINDMULTI = 0x41 + IPV6_BINDV6ONLY = 0x1b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FLOWID = 0x43 + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FLOWTYPE = 0x44 + IPV6_FRAGTTL = 0x78 + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MSFILTER = 0x4a + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_PREFER_TEMPADDR = 0x3f + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVFLOWID = 0x46 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRSSBUCKETID = 0x47 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RSSBUCKETID = 0x45 + IPV6_RSS_LISTEN_BUCKET = 0x42 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BINDANY = 0x18 + IP_BINDMULTI = 0x19 + IP_BLOCK_SOURCE = 0x48 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DONTFRAG = 0x43 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET3 = 0x31 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FLOWID = 0x5a + IP_FLOWTYPE = 0x5b + IP_FW3 = 0x30 + IP_FW_ADD = 0x32 + IP_FW_DEL = 0x33 + IP_FW_FLUSH = 0x34 + IP_FW_GET = 0x36 + IP_FW_NAT_CFG = 0x38 + IP_FW_NAT_DEL = 0x39 + IP_FW_NAT_GET_CONFIG = 0x3a + IP_FW_NAT_GET_LOG = 0x3b + IP_FW_RESETLOG = 0x37 + IP_FW_TABLE_ADD = 0x28 + IP_FW_TABLE_DEL = 0x29 + IP_FW_TABLE_FLUSH = 0x2a + IP_FW_TABLE_GETSIZE = 0x2b + IP_FW_TABLE_LIST = 0x2c + IP_FW_ZERO = 0x35 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MAX_SOURCE_FILTER = 0x400 + IP_MF = 0x2000 + IP_MINTTL = 0x42 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_OFFMASK = 0x1fff + IP_ONESBCAST = 0x17 + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVFLOWID = 0x5d + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVRSSBUCKETID = 0x5e + IP_RECVTOS = 0x44 + IP_RECVTTL = 0x41 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSSBUCKETID = 0x5c + IP_RSS_LISTEN_BUCKET = 0x1a + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_SENDSRCADDR = 0x7 + IP_TOS = 0x3 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_AUTOSYNC = 0x7 + MADV_CORE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_NOCORE = 0x8 + MADV_NORMAL = 0x0 + MADV_NOSYNC = 0x6 + MADV_PROTECT = 0xa + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MAP_ALIGNED_SUPER = 0x1000000 + MAP_ALIGNMENT_MASK = -0x1000000 + MAP_ALIGNMENT_SHIFT = 0x18 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_EXCL = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_NOCORE = 0x20000 + MAP_NOSYNC = 0x800 + MAP_PREFAULT_READ = 0x40000 + MAP_PRIVATE = 0x2 + MAP_RESERVED0020 = 0x20 + MAP_RESERVED0040 = 0x40 + MAP_RESERVED0080 = 0x80 + MAP_RESERVED0100 = 0x100 + MAP_SHARED = 0x1 + MAP_STACK = 0x400 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ACLS = 0x8000000 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x200000000 + MNT_BYFSID = 0x8000000 + MNT_CMDFLAGS = 0xd0f0000 + MNT_DEFEXPORTED = 0x200 + MNT_DELEXPORT = 0x20000 + MNT_EXKERB = 0x800 + MNT_EXPORTANON = 0x400 + MNT_EXPORTED = 0x100 + MNT_EXPUBLIC = 0x20000000 + MNT_EXRDONLY = 0x80 + MNT_FORCE = 0x80000 + MNT_GJOURNAL = 0x2000000 + MNT_IGNORE = 0x800000 + MNT_LAZY = 0x3 + MNT_LOCAL = 0x1000 + MNT_MULTILABEL = 0x4000000 + MNT_NFS4ACLS = 0x10 + MNT_NOATIME = 0x10000000 + MNT_NOCLUSTERR = 0x40000000 + MNT_NOCLUSTERW = 0x80000000 + MNT_NOEXEC = 0x4 + MNT_NONBUSY = 0x4000000 + MNT_NOSUID = 0x8 + MNT_NOSYMFOLLOW = 0x400000 + MNT_NOWAIT = 0x2 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SNAPSHOT = 0x1000000 + MNT_SOFTDEP = 0x200000 + MNT_SUIDDIR = 0x100000 + MNT_SUJ = 0x100000000 + MNT_SUSPEND = 0x4 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UPDATE = 0x10000 + MNT_UPDATEMASK = 0x2d8d0807e + MNT_USER = 0x8000 + MNT_VISFLAGMASK = 0x3fef0ffff + MNT_WAIT = 0x1 + MSG_CMSG_CLOEXEC = 0x40000 + MSG_COMPAT = 0x8000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_NBIO = 0x4000 + MSG_NOSIGNAL = 0x20000 + MSG_NOTIFICATION = 0x2000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITFORONE = 0x80000 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x0 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLISTL = 0x5 + NET_RT_IFMALIST = 0x4 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_CLOSE = 0x100 + NOTE_CLOSE_WRITE = 0x200 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FILE_POLL = 0x2 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_MSECONDS = 0x2 + NOTE_NSECONDS = 0x8 + NOTE_OPEN = 0x80 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_READ = 0x400 + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x4 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x100000 + O_CREAT = 0x200 + O_DIRECT = 0x10000 + O_DIRECTORY = 0x20000 + O_EXCL = 0x800 + O_EXEC = 0x40000 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_TTY_INIT = 0x80000 + O_VERIFY = 0x200000 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_FIXEDMTU = 0x80000 + RTF_FMASK = 0x1004d808 + RTF_GATEWAY = 0x2 + RTF_GWFLAG_COMPAT = 0x80000000 + RTF_HOST = 0x4 + RTF_LLDATA = 0x400 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_PINNED = 0x100000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_REJECT = 0x8 + RTF_RNH_LOCKED = 0x40000000 + RTF_STATIC = 0x800 + RTF_STICKY = 0x10000000 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x12 + RTM_IFANNOUNCE = 0x11 + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RTV_WEIGHT = 0x100 + RT_ALL_FIBS = -0x1 + RT_BLACKHOLE = 0x40 + RT_CACHING_CONTEXT = 0x1 + RT_DEFAULT_FIB = 0x0 + RT_HAS_GW = 0x80 + RT_HAS_HEADER = 0x10 + RT_HAS_HEADER_BIT = 0x4 + RT_L2_ME = 0x4 + RT_L2_ME_BIT = 0x2 + RT_LLE_CACHE = 0x100 + RT_MAY_LOOP = 0x8 + RT_MAY_LOOP_BIT = 0x3 + RT_NORTREF = 0x2 + RT_REJECT = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_BINTIME = 0x4 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCAIFGROUP = 0x80246987 + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFGROUP = 0x80246989 + SIOCDIFPHYADDR = 0x80206949 + SIOCGDRVSPEC = 0xc01c697b + SIOCGETSGCNT = 0xc0147210 + SIOCGETVIFCNT = 0xc014720f + SIOCGHIWAT = 0x40047301 + SIOCGI2C = 0xc020693d + SIOCGIFADDR = 0xc0206921 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020691f + SIOCGIFCONF = 0xc0086924 + SIOCGIFDESCR = 0xc020692a + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFIB = 0xc020695c + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc024698a + SIOCGIFGROUP = 0xc0246988 + SIOCGIFINDEX = 0xc0206920 + SIOCGIFMAC = 0xc0206926 + SIOCGIFMEDIA = 0xc0286938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206948 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFSTATUS = 0xc331693b + SIOCGIFXMEDIA = 0xc028698b + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGPRIVATE_0 = 0xc0206950 + SIOCGPRIVATE_1 = 0xc0206951 + SIOCGTUNFIB = 0xc020695e + SIOCIFCREATE = 0xc020697a + SIOCIFCREATE2 = 0xc020697c + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc00c6978 + SIOCSDRVSPEC = 0x801c697b + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020691e + SIOCSIFDESCR = 0x80206929 + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFIB = 0x8020695d + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206927 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNAME = 0x80206928 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSIFPHYS = 0x80206936 + SIOCSIFRVNET = 0xc020695b + SIOCSIFVNET = 0xc020695a + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSTUNFIB = 0x8020695f + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_NONBLOCK = 0x20000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BINTIME = 0x2000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1009 + SO_LINGER = 0x80 + SO_LISTENINCQLEN = 0x1013 + SO_LISTENQLEN = 0x1012 + SO_LISTENQLIMIT = 0x1011 + SO_NOSIGPIPE = 0x800 + SO_NO_DDP = 0x8000 + SO_NO_OFFLOAD = 0x4000 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1010 + SO_PROTOCOL = 0x1016 + SO_PROTOTYPE = 0x1016 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SETFIB = 0x1014 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SO_USER_COOKIE = 0x1015 + SO_VENDOR = 0x80000000 + TAB0 = 0x0 + TAB3 = 0x4 + TABDLY = 0x4 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCP_CA_NAME_MAX = 0x10 + TCP_CCALGOOPT = 0x41 + TCP_CONGESTION = 0x40 + TCP_FASTOPEN = 0x401 + TCP_FUNCTION_BLK = 0x2000 + TCP_FUNCTION_NAME_LEN_MAX = 0x20 + TCP_INFO = 0x20 + TCP_KEEPCNT = 0x400 + TCP_KEEPIDLE = 0x100 + TCP_KEEPINIT = 0x80 + TCP_KEEPINTVL = 0x200 + TCP_MAXBURST = 0x4 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x10 + TCP_MINMSS = 0xd8 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_PCAP_IN = 0x1000 + TCP_PCAP_OUT = 0x800 + TCP_VENDOR = 0x80000000 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGPTN = 0x4004740f + TIOCGSID = 0x40047463 + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DCD = 0x40 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTMASTER = 0x2000741c + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2004745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40087459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VERASE2 = 0x7 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x4 + WCOREFLAG = 0x80 + WEXITED = 0x10 + WLINUXCLONE = 0x80000000 + WNOHANG = 0x1 + WNOWAIT = 0x8 + WSTOPPED = 0x2 + WTRAPPED = 0x20 + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x59) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x55) + ECAPMODE = syscall.Errno(0x5e) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDOOFUS = syscall.Errno(0x58) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x52) + EILSEQ = syscall.Errno(0x56) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x60) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5a) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x57) + ENOBUFS = syscall.Errno(0x37) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x5b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x53) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCAPABLE = syscall.Errno(0x5d) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x5f) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x54) + EOWNERDEAD = syscall.Errno(0x60) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x5c) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGLIBRT = syscall.Signal(0x21) + SIGLWP = syscall.Signal(0x20) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHR = syscall.Signal(0x20) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "device not configured", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource deadlock avoided", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device busy", + 17: "file exists", + 18: "cross-device link", + 19: "operation not supported by device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "result too large", + 35: "resource temporarily unavailable", + 36: "operation now in progress", + 37: "operation already in progress", + 38: "socket operation on non-socket", + 39: "destination address required", + 40: "message too long", + 41: "protocol wrong type for socket", + 42: "protocol not available", + 43: "protocol not supported", + 44: "socket type not supported", + 45: "operation not supported", + 46: "protocol family not supported", + 47: "address family not supported by protocol family", + 48: "address already in use", + 49: "can't assign requested address", + 50: "network is down", + 51: "network is unreachable", + 52: "network dropped connection on reset", + 53: "software caused connection abort", + 54: "connection reset by peer", + 55: "no buffer space available", + 56: "socket is already connected", + 57: "socket is not connected", + 58: "can't send after socket shutdown", + 59: "too many references: can't splice", + 60: "operation timed out", + 61: "connection refused", + 62: "too many levels of symbolic links", + 63: "file name too long", + 64: "host is down", + 65: "no route to host", + 66: "directory not empty", + 67: "too many processes", + 68: "too many users", + 69: "disc quota exceeded", + 70: "stale NFS file handle", + 71: "too many levels of remote in path", + 72: "RPC struct is bad", + 73: "RPC version wrong", + 74: "RPC prog. not avail", + 75: "program version wrong", + 76: "bad procedure for program", + 77: "no locks available", + 78: "function not implemented", + 79: "inappropriate file type or format", + 80: "authentication error", + 81: "need authenticator", + 82: "identifier removed", + 83: "no message of desired type", + 84: "value too large to be stored in data type", + 85: "operation canceled", + 86: "illegal byte sequence", + 87: "attribute not found", + 88: "programming error", + 89: "bad message", + 90: "multihop attempted", + 91: "link has been severed", + 92: "protocol error", + 93: "capabilities insufficient", + 94: "not permitted in capability mode", + 95: "state not recoverable", + 96: "previous owner died", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/BPT trap", + 6: "abort trap", + 7: "EMT trap", + 8: "floating point exception", + 9: "killed", + 10: "bus error", + 11: "segmentation fault", + 12: "bad system call", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "urgent I/O condition", + 17: "suspended (signal)", + 18: "suspended", + 19: "continued", + 20: "child exited", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "I/O possible", + 24: "cputime limit exceeded", + 25: "filesize limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window size changes", + 29: "information request", + 30: "user defined signal 1", + 31: "user defined signal 2", + 32: "unknown signal", + 33: "unknown signal", +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go new file mode 100644 index 0000000..360caff --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go @@ -0,0 +1,1750 @@ +// mkerrors.sh -m64 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,freebsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_ARP = 0x23 + AF_ATM = 0x1e + AF_BLUETOOTH = 0x24 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1c + AF_INET6_SDP = 0x2a + AF_INET_SDP = 0x28 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x2a + AF_NATM = 0x1d + AF_NETBIOS = 0x6 + AF_NETGRAPH = 0x20 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SCLUSTER = 0x22 + AF_SIP = 0x18 + AF_SLOW = 0x21 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VENDOR00 = 0x27 + AF_VENDOR01 = 0x29 + AF_VENDOR02 = 0x2b + AF_VENDOR03 = 0x2d + AF_VENDOR04 = 0x2f + AF_VENDOR05 = 0x31 + AF_VENDOR06 = 0x33 + AF_VENDOR07 = 0x35 + AF_VENDOR08 = 0x37 + AF_VENDOR09 = 0x39 + AF_VENDOR10 = 0x3b + AF_VENDOR11 = 0x3d + AF_VENDOR12 = 0x3f + AF_VENDOR13 = 0x41 + AF_VENDOR14 = 0x43 + AF_VENDOR15 = 0x45 + AF_VENDOR16 = 0x47 + AF_VENDOR17 = 0x49 + AF_VENDOR18 = 0x4b + AF_VENDOR19 = 0x4d + AF_VENDOR20 = 0x4f + AF_VENDOR21 = 0x51 + AF_VENDOR22 = 0x53 + AF_VENDOR23 = 0x55 + AF_VENDOR24 = 0x57 + AF_VENDOR25 = 0x59 + AF_VENDOR26 = 0x5b + AF_VENDOR27 = 0x5d + AF_VENDOR28 = 0x5f + AF_VENDOR29 = 0x61 + AF_VENDOR30 = 0x63 + AF_VENDOR31 = 0x65 + AF_VENDOR32 = 0x67 + AF_VENDOR33 = 0x69 + AF_VENDOR34 = 0x6b + AF_VENDOR35 = 0x6d + AF_VENDOR36 = 0x6f + AF_VENDOR37 = 0x71 + AF_VENDOR38 = 0x73 + AF_VENDOR39 = 0x75 + AF_VENDOR40 = 0x77 + AF_VENDOR41 = 0x79 + AF_VENDOR42 = 0x7b + AF_VENDOR43 = 0x7d + AF_VENDOR44 = 0x7f + AF_VENDOR45 = 0x81 + AF_VENDOR46 = 0x83 + AF_VENDOR47 = 0x85 + ALTWERASE = 0x200 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B460800 = 0x70800 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B921600 = 0xe1000 + B9600 = 0x2580 + BIOCFEEDBACK = 0x8004427c + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDIRECTION = 0x40044276 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0104279 + BIOCGETBUFMODE = 0x4004427d + BIOCGETIF = 0x4020426b + BIOCGETZMAX = 0x4008427f + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCGTSTAMP = 0x40044283 + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x2000427a + BIOCPROMISC = 0x20004269 + BIOCROTZBUF = 0x40184280 + BIOCSBLEN = 0xc0044266 + BIOCSDIRECTION = 0x80044277 + BIOCSDLT = 0x80044278 + BIOCSETBUFMODE = 0x8004427e + BIOCSETF = 0x80104267 + BIOCSETFNR = 0x80104282 + BIOCSETIF = 0x8020426c + BIOCSETWF = 0x8010427b + BIOCSETZBUF = 0x80184281 + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8010426d + BIOCSSEESENT = 0x80044277 + BIOCSTSTAMP = 0x80044284 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x8 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_BUFMODE_BUFFER = 0x1 + BPF_BUFMODE_ZBUF = 0x2 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_T_BINTIME = 0x2 + BPF_T_BINTIME_FAST = 0x102 + BPF_T_BINTIME_MONOTONIC = 0x202 + BPF_T_BINTIME_MONOTONIC_FAST = 0x302 + BPF_T_FAST = 0x100 + BPF_T_FLAG_MASK = 0x300 + BPF_T_FORMAT_MASK = 0x3 + BPF_T_MICROTIME = 0x0 + BPF_T_MICROTIME_FAST = 0x100 + BPF_T_MICROTIME_MONOTONIC = 0x200 + BPF_T_MICROTIME_MONOTONIC_FAST = 0x300 + BPF_T_MONOTONIC = 0x200 + BPF_T_MONOTONIC_FAST = 0x300 + BPF_T_NANOTIME = 0x1 + BPF_T_NANOTIME_FAST = 0x101 + BPF_T_NANOTIME_MONOTONIC = 0x201 + BPF_T_NANOTIME_MONOTONIC_FAST = 0x301 + BPF_T_NONE = 0x3 + BPF_T_NORMAL = 0x0 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + CAP_ACCEPT = 0x200000020000000 + CAP_ACL_CHECK = 0x400000000010000 + CAP_ACL_DELETE = 0x400000000020000 + CAP_ACL_GET = 0x400000000040000 + CAP_ACL_SET = 0x400000000080000 + CAP_ALL0 = 0x20007ffffffffff + CAP_ALL1 = 0x4000000001fffff + CAP_BIND = 0x200000040000000 + CAP_BINDAT = 0x200008000000400 + CAP_CHFLAGSAT = 0x200000000001400 + CAP_CONNECT = 0x200000080000000 + CAP_CONNECTAT = 0x200010000000400 + CAP_CREATE = 0x200000000000040 + CAP_EVENT = 0x400000000000020 + CAP_EXTATTR_DELETE = 0x400000000001000 + CAP_EXTATTR_GET = 0x400000000002000 + CAP_EXTATTR_LIST = 0x400000000004000 + CAP_EXTATTR_SET = 0x400000000008000 + CAP_FCHDIR = 0x200000000000800 + CAP_FCHFLAGS = 0x200000000001000 + CAP_FCHMOD = 0x200000000002000 + CAP_FCHMODAT = 0x200000000002400 + CAP_FCHOWN = 0x200000000004000 + CAP_FCHOWNAT = 0x200000000004400 + CAP_FCNTL = 0x200000000008000 + CAP_FCNTL_ALL = 0x78 + CAP_FCNTL_GETFL = 0x8 + CAP_FCNTL_GETOWN = 0x20 + CAP_FCNTL_SETFL = 0x10 + CAP_FCNTL_SETOWN = 0x40 + CAP_FEXECVE = 0x200000000000080 + CAP_FLOCK = 0x200000000010000 + CAP_FPATHCONF = 0x200000000020000 + CAP_FSCK = 0x200000000040000 + CAP_FSTAT = 0x200000000080000 + CAP_FSTATAT = 0x200000000080400 + CAP_FSTATFS = 0x200000000100000 + CAP_FSYNC = 0x200000000000100 + CAP_FTRUNCATE = 0x200000000000200 + CAP_FUTIMES = 0x200000000200000 + CAP_FUTIMESAT = 0x200000000200400 + CAP_GETPEERNAME = 0x200000100000000 + CAP_GETSOCKNAME = 0x200000200000000 + CAP_GETSOCKOPT = 0x200000400000000 + CAP_IOCTL = 0x400000000000080 + CAP_IOCTLS_ALL = 0x7fffffffffffffff + CAP_KQUEUE = 0x400000000100040 + CAP_KQUEUE_CHANGE = 0x400000000100000 + CAP_KQUEUE_EVENT = 0x400000000000040 + CAP_LINKAT_SOURCE = 0x200020000000400 + CAP_LINKAT_TARGET = 0x200000000400400 + CAP_LISTEN = 0x200000800000000 + CAP_LOOKUP = 0x200000000000400 + CAP_MAC_GET = 0x400000000000001 + CAP_MAC_SET = 0x400000000000002 + CAP_MKDIRAT = 0x200000000800400 + CAP_MKFIFOAT = 0x200000001000400 + CAP_MKNODAT = 0x200000002000400 + CAP_MMAP = 0x200000000000010 + CAP_MMAP_R = 0x20000000000001d + CAP_MMAP_RW = 0x20000000000001f + CAP_MMAP_RWX = 0x20000000000003f + CAP_MMAP_RX = 0x20000000000003d + CAP_MMAP_W = 0x20000000000001e + CAP_MMAP_WX = 0x20000000000003e + CAP_MMAP_X = 0x20000000000003c + CAP_PDGETPID = 0x400000000000200 + CAP_PDKILL = 0x400000000000800 + CAP_PDWAIT = 0x400000000000400 + CAP_PEELOFF = 0x200001000000000 + CAP_POLL_EVENT = 0x400000000000020 + CAP_PREAD = 0x20000000000000d + CAP_PWRITE = 0x20000000000000e + CAP_READ = 0x200000000000001 + CAP_RECV = 0x200000000000001 + CAP_RENAMEAT_SOURCE = 0x200000004000400 + CAP_RENAMEAT_TARGET = 0x200040000000400 + CAP_RIGHTS_VERSION = 0x0 + CAP_RIGHTS_VERSION_00 = 0x0 + CAP_SEEK = 0x20000000000000c + CAP_SEEK_TELL = 0x200000000000004 + CAP_SEM_GETVALUE = 0x400000000000004 + CAP_SEM_POST = 0x400000000000008 + CAP_SEM_WAIT = 0x400000000000010 + CAP_SEND = 0x200000000000002 + CAP_SETSOCKOPT = 0x200002000000000 + CAP_SHUTDOWN = 0x200004000000000 + CAP_SOCK_CLIENT = 0x200007780000003 + CAP_SOCK_SERVER = 0x200007f60000003 + CAP_SYMLINKAT = 0x200000008000400 + CAP_TTYHOOK = 0x400000000000100 + CAP_UNLINKAT = 0x200000010000400 + CAP_UNUSED0_44 = 0x200080000000000 + CAP_UNUSED0_57 = 0x300000000000000 + CAP_UNUSED1_22 = 0x400000000200000 + CAP_UNUSED1_57 = 0x500000000000000 + CAP_WRITE = 0x200000000000002 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x4 + CLOCK_MONOTONIC_FAST = 0xc + CLOCK_MONOTONIC_PRECISE = 0xb + CLOCK_PROCESS_CPUTIME_ID = 0xf + CLOCK_PROF = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_FAST = 0xa + CLOCK_REALTIME_PRECISE = 0x9 + CLOCK_SECOND = 0xd + CLOCK_THREAD_CPUTIME_ID = 0xe + CLOCK_UPTIME = 0x5 + CLOCK_UPTIME_FAST = 0x8 + CLOCK_UPTIME_PRECISE = 0x7 + CLOCK_VIRTUAL = 0x1 + CREAD = 0x800 + CRTSCTS = 0x30000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_MAXNAME = 0x18 + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_BREDR_BB = 0xff + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_BLUETOOTH_LE_LL = 0xfb + DLT_BLUETOOTH_LE_LL_WITH_PHDR = 0x100 + DLT_BLUETOOTH_LINUX_MONITOR = 0xfe + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_EPON = 0x103 + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_INFINIBAND = 0xf7 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPMI_HPM_2 = 0x104 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0x104 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NETLINK = 0xfd + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x79 + DLT_PKTAP = 0x102 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PROFIBUS_DL = 0x101 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RIO = 0x7c + DLT_RTAC_SERIAL = 0xfa + DLT_SCCP = 0x8e + DLT_SCTP = 0xf8 + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USBPCAP = 0xf9 + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WIHART = 0xdf + DLT_WIRESHARK_UPPER_PDU = 0xfc + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_FS = -0x9 + EVFILT_LIO = -0xa + EVFILT_PROC = -0x5 + EVFILT_PROCDESC = -0x8 + EVFILT_READ = -0x1 + EVFILT_SENDFILE = -0xc + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xc + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xb + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_DROP = 0x1000 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_FLAG2 = 0x4000 + EV_FORCEONESHOT = 0x100 + EV_ONESHOT = 0x10 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTATTR_NAMESPACE_EMPTY = 0x0 + EXTATTR_NAMESPACE_SYSTEM = 0x2 + EXTATTR_NAMESPACE_USER = 0x1 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_CANCEL = 0x5 + F_DUP2FD = 0xa + F_DUP2FD_CLOEXEC = 0x12 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x11 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0xb + F_GETOWN = 0x5 + F_OGETLK = 0x7 + F_OK = 0x0 + F_OSETLK = 0x8 + F_OSETLKW = 0x9 + F_RDAHEAD = 0x10 + F_RDLCK = 0x1 + F_READAHEAD = 0xf + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0xc + F_SETLKW = 0xd + F_SETLK_REMOTE = 0xe + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_UNLCKSYS = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x218f52 + IFF_CANTCONFIG = 0x10000 + IFF_DEBUG = 0x4 + IFF_DRV_OACTIVE = 0x400 + IFF_DRV_RUNNING = 0x40 + IFF_DYING = 0x200000 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MONITOR = 0x40000 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PPROMISC = 0x20000 + IFF_PROMISC = 0x100 + IFF_RENAMING = 0x400000 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_STATICARP = 0x80000 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_BRIDGE = 0xd1 + IFT_CARP = 0xf8 + IFT_IEEE1394 = 0x90 + IFT_INFINIBAND = 0xc7 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_PPP = 0x17 + IFT_PROPVIRTUAL = 0x35 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IN_RFC3021_MASK = 0xfffffffe + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CARP = 0x70 + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0x102 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HIP = 0x8b + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MEAS = 0x13 + IPPROTO_MH = 0x87 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MOBILE = 0x37 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OLD_DIVERT = 0xfe + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_RESERVED_253 = 0xfd + IPPROTO_RESERVED_254 = 0xfe + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEND = 0x103 + IPPROTO_SEP = 0x21 + IPPROTO_SHIM6 = 0x8c + IPPROTO_SKIP = 0x39 + IPPROTO_SPACER = 0x7fff + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TLSP = 0x38 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_BINDANY = 0x40 + IPV6_BINDMULTI = 0x41 + IPV6_BINDV6ONLY = 0x1b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FLOWID = 0x43 + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FLOWTYPE = 0x44 + IPV6_FRAGTTL = 0x78 + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MSFILTER = 0x4a + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_PREFER_TEMPADDR = 0x3f + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVFLOWID = 0x46 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRSSBUCKETID = 0x47 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RSSBUCKETID = 0x45 + IPV6_RSS_LISTEN_BUCKET = 0x42 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BINDANY = 0x18 + IP_BINDMULTI = 0x19 + IP_BLOCK_SOURCE = 0x48 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DONTFRAG = 0x43 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET3 = 0x31 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FLOWID = 0x5a + IP_FLOWTYPE = 0x5b + IP_FW3 = 0x30 + IP_FW_ADD = 0x32 + IP_FW_DEL = 0x33 + IP_FW_FLUSH = 0x34 + IP_FW_GET = 0x36 + IP_FW_NAT_CFG = 0x38 + IP_FW_NAT_DEL = 0x39 + IP_FW_NAT_GET_CONFIG = 0x3a + IP_FW_NAT_GET_LOG = 0x3b + IP_FW_RESETLOG = 0x37 + IP_FW_TABLE_ADD = 0x28 + IP_FW_TABLE_DEL = 0x29 + IP_FW_TABLE_FLUSH = 0x2a + IP_FW_TABLE_GETSIZE = 0x2b + IP_FW_TABLE_LIST = 0x2c + IP_FW_ZERO = 0x35 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MAX_SOURCE_FILTER = 0x400 + IP_MF = 0x2000 + IP_MINTTL = 0x42 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_OFFMASK = 0x1fff + IP_ONESBCAST = 0x17 + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVFLOWID = 0x5d + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVRSSBUCKETID = 0x5e + IP_RECVTOS = 0x44 + IP_RECVTTL = 0x41 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSSBUCKETID = 0x5c + IP_RSS_LISTEN_BUCKET = 0x1a + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_SENDSRCADDR = 0x7 + IP_TOS = 0x3 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_AUTOSYNC = 0x7 + MADV_CORE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_NOCORE = 0x8 + MADV_NORMAL = 0x0 + MADV_NOSYNC = 0x6 + MADV_PROTECT = 0xa + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MAP_32BIT = 0x80000 + MAP_ALIGNED_SUPER = 0x1000000 + MAP_ALIGNMENT_MASK = -0x1000000 + MAP_ALIGNMENT_SHIFT = 0x18 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_EXCL = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_NOCORE = 0x20000 + MAP_NOSYNC = 0x800 + MAP_PREFAULT_READ = 0x40000 + MAP_PRIVATE = 0x2 + MAP_RESERVED0020 = 0x20 + MAP_RESERVED0040 = 0x40 + MAP_RESERVED0080 = 0x80 + MAP_RESERVED0100 = 0x100 + MAP_SHARED = 0x1 + MAP_STACK = 0x400 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ACLS = 0x8000000 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x200000000 + MNT_BYFSID = 0x8000000 + MNT_CMDFLAGS = 0xd0f0000 + MNT_DEFEXPORTED = 0x200 + MNT_DELEXPORT = 0x20000 + MNT_EXKERB = 0x800 + MNT_EXPORTANON = 0x400 + MNT_EXPORTED = 0x100 + MNT_EXPUBLIC = 0x20000000 + MNT_EXRDONLY = 0x80 + MNT_FORCE = 0x80000 + MNT_GJOURNAL = 0x2000000 + MNT_IGNORE = 0x800000 + MNT_LAZY = 0x3 + MNT_LOCAL = 0x1000 + MNT_MULTILABEL = 0x4000000 + MNT_NFS4ACLS = 0x10 + MNT_NOATIME = 0x10000000 + MNT_NOCLUSTERR = 0x40000000 + MNT_NOCLUSTERW = 0x80000000 + MNT_NOEXEC = 0x4 + MNT_NONBUSY = 0x4000000 + MNT_NOSUID = 0x8 + MNT_NOSYMFOLLOW = 0x400000 + MNT_NOWAIT = 0x2 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SNAPSHOT = 0x1000000 + MNT_SOFTDEP = 0x200000 + MNT_SUIDDIR = 0x100000 + MNT_SUJ = 0x100000000 + MNT_SUSPEND = 0x4 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UPDATE = 0x10000 + MNT_UPDATEMASK = 0x2d8d0807e + MNT_USER = 0x8000 + MNT_VISFLAGMASK = 0x3fef0ffff + MNT_WAIT = 0x1 + MSG_CMSG_CLOEXEC = 0x40000 + MSG_COMPAT = 0x8000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_NBIO = 0x4000 + MSG_NOSIGNAL = 0x20000 + MSG_NOTIFICATION = 0x2000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITFORONE = 0x80000 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x0 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLISTL = 0x5 + NET_RT_IFMALIST = 0x4 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_CLOSE = 0x100 + NOTE_CLOSE_WRITE = 0x200 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FILE_POLL = 0x2 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_MSECONDS = 0x2 + NOTE_NSECONDS = 0x8 + NOTE_OPEN = 0x80 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_READ = 0x400 + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x4 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x100000 + O_CREAT = 0x200 + O_DIRECT = 0x10000 + O_DIRECTORY = 0x20000 + O_EXCL = 0x800 + O_EXEC = 0x40000 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_TTY_INIT = 0x80000 + O_VERIFY = 0x200000 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_FIXEDMTU = 0x80000 + RTF_FMASK = 0x1004d808 + RTF_GATEWAY = 0x2 + RTF_GWFLAG_COMPAT = 0x80000000 + RTF_HOST = 0x4 + RTF_LLDATA = 0x400 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_PINNED = 0x100000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_REJECT = 0x8 + RTF_RNH_LOCKED = 0x40000000 + RTF_STATIC = 0x800 + RTF_STICKY = 0x10000000 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x12 + RTM_IFANNOUNCE = 0x11 + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RTV_WEIGHT = 0x100 + RT_ALL_FIBS = -0x1 + RT_BLACKHOLE = 0x40 + RT_CACHING_CONTEXT = 0x1 + RT_DEFAULT_FIB = 0x0 + RT_HAS_GW = 0x80 + RT_HAS_HEADER = 0x10 + RT_HAS_HEADER_BIT = 0x4 + RT_L2_ME = 0x4 + RT_L2_ME_BIT = 0x2 + RT_LLE_CACHE = 0x100 + RT_MAY_LOOP = 0x8 + RT_MAY_LOOP_BIT = 0x3 + RT_NORTREF = 0x2 + RT_REJECT = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_BINTIME = 0x4 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCAIFGROUP = 0x80286987 + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFGROUP = 0x80286989 + SIOCDIFPHYADDR = 0x80206949 + SIOCGDRVSPEC = 0xc028697b + SIOCGETSGCNT = 0xc0207210 + SIOCGETVIFCNT = 0xc028720f + SIOCGHIWAT = 0x40047301 + SIOCGI2C = 0xc020693d + SIOCGIFADDR = 0xc0206921 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020691f + SIOCGIFCONF = 0xc0106924 + SIOCGIFDESCR = 0xc020692a + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFIB = 0xc020695c + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc028698a + SIOCGIFGROUP = 0xc0286988 + SIOCGIFINDEX = 0xc0206920 + SIOCGIFMAC = 0xc0206926 + SIOCGIFMEDIA = 0xc0306938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206948 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFSTATUS = 0xc331693b + SIOCGIFXMEDIA = 0xc030698b + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGPRIVATE_0 = 0xc0206950 + SIOCGPRIVATE_1 = 0xc0206951 + SIOCGTUNFIB = 0xc020695e + SIOCIFCREATE = 0xc020697a + SIOCIFCREATE2 = 0xc020697c + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc0106978 + SIOCSDRVSPEC = 0x8028697b + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020691e + SIOCSIFDESCR = 0x80206929 + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFIB = 0x8020695d + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206927 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNAME = 0x80206928 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSIFPHYS = 0x80206936 + SIOCSIFRVNET = 0xc020695b + SIOCSIFVNET = 0xc020695a + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSTUNFIB = 0x8020695f + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_NONBLOCK = 0x20000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BINTIME = 0x2000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1009 + SO_LINGER = 0x80 + SO_LISTENINCQLEN = 0x1013 + SO_LISTENQLEN = 0x1012 + SO_LISTENQLIMIT = 0x1011 + SO_NOSIGPIPE = 0x800 + SO_NO_DDP = 0x8000 + SO_NO_OFFLOAD = 0x4000 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1010 + SO_PROTOCOL = 0x1016 + SO_PROTOTYPE = 0x1016 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SETFIB = 0x1014 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SO_USER_COOKIE = 0x1015 + SO_VENDOR = 0x80000000 + TAB0 = 0x0 + TAB3 = 0x4 + TABDLY = 0x4 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCP_CA_NAME_MAX = 0x10 + TCP_CCALGOOPT = 0x41 + TCP_CONGESTION = 0x40 + TCP_FASTOPEN = 0x401 + TCP_FUNCTION_BLK = 0x2000 + TCP_FUNCTION_NAME_LEN_MAX = 0x20 + TCP_INFO = 0x20 + TCP_KEEPCNT = 0x400 + TCP_KEEPIDLE = 0x100 + TCP_KEEPINIT = 0x80 + TCP_KEEPINTVL = 0x200 + TCP_MAXBURST = 0x4 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x10 + TCP_MINMSS = 0xd8 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_PCAP_IN = 0x1000 + TCP_PCAP_OUT = 0x800 + TCP_VENDOR = 0x80000000 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGPTN = 0x4004740f + TIOCGSID = 0x40047463 + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DCD = 0x40 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTMASTER = 0x2000741c + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2004745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40107459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VERASE2 = 0x7 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x4 + WCOREFLAG = 0x80 + WEXITED = 0x10 + WLINUXCLONE = 0x80000000 + WNOHANG = 0x1 + WNOWAIT = 0x8 + WSTOPPED = 0x2 + WTRAPPED = 0x20 + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x59) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x55) + ECAPMODE = syscall.Errno(0x5e) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDOOFUS = syscall.Errno(0x58) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x52) + EILSEQ = syscall.Errno(0x56) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x60) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5a) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x57) + ENOBUFS = syscall.Errno(0x37) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x5b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x53) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCAPABLE = syscall.Errno(0x5d) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x5f) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x54) + EOWNERDEAD = syscall.Errno(0x60) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x5c) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGLIBRT = syscall.Signal(0x21) + SIGLWP = syscall.Signal(0x20) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHR = syscall.Signal(0x20) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "device not configured", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource deadlock avoided", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device busy", + 17: "file exists", + 18: "cross-device link", + 19: "operation not supported by device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "result too large", + 35: "resource temporarily unavailable", + 36: "operation now in progress", + 37: "operation already in progress", + 38: "socket operation on non-socket", + 39: "destination address required", + 40: "message too long", + 41: "protocol wrong type for socket", + 42: "protocol not available", + 43: "protocol not supported", + 44: "socket type not supported", + 45: "operation not supported", + 46: "protocol family not supported", + 47: "address family not supported by protocol family", + 48: "address already in use", + 49: "can't assign requested address", + 50: "network is down", + 51: "network is unreachable", + 52: "network dropped connection on reset", + 53: "software caused connection abort", + 54: "connection reset by peer", + 55: "no buffer space available", + 56: "socket is already connected", + 57: "socket is not connected", + 58: "can't send after socket shutdown", + 59: "too many references: can't splice", + 60: "operation timed out", + 61: "connection refused", + 62: "too many levels of symbolic links", + 63: "file name too long", + 64: "host is down", + 65: "no route to host", + 66: "directory not empty", + 67: "too many processes", + 68: "too many users", + 69: "disc quota exceeded", + 70: "stale NFS file handle", + 71: "too many levels of remote in path", + 72: "RPC struct is bad", + 73: "RPC version wrong", + 74: "RPC prog. not avail", + 75: "program version wrong", + 76: "bad procedure for program", + 77: "no locks available", + 78: "function not implemented", + 79: "inappropriate file type or format", + 80: "authentication error", + 81: "need authenticator", + 82: "identifier removed", + 83: "no message of desired type", + 84: "value too large to be stored in data type", + 85: "operation canceled", + 86: "illegal byte sequence", + 87: "attribute not found", + 88: "programming error", + 89: "bad message", + 90: "multihop attempted", + 91: "link has been severed", + 92: "protocol error", + 93: "capabilities insufficient", + 94: "not permitted in capability mode", + 95: "state not recoverable", + 96: "previous owner died", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/BPT trap", + 6: "abort trap", + 7: "EMT trap", + 8: "floating point exception", + 9: "killed", + 10: "bus error", + 11: "segmentation fault", + 12: "bad system call", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "urgent I/O condition", + 17: "suspended (signal)", + 18: "suspended", + 19: "continued", + 20: "child exited", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "I/O possible", + 24: "cputime limit exceeded", + 25: "filesize limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window size changes", + 29: "information request", + 30: "user defined signal 1", + 31: "user defined signal 2", + 32: "unknown signal", + 33: "unknown signal", +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go new file mode 100644 index 0000000..87deda9 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go @@ -0,0 +1,1758 @@ +// mkerrors.sh +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,freebsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_ARP = 0x23 + AF_ATM = 0x1e + AF_BLUETOOTH = 0x24 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1c + AF_INET6_SDP = 0x2a + AF_INET_SDP = 0x28 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x2a + AF_NATM = 0x1d + AF_NETBIOS = 0x6 + AF_NETGRAPH = 0x20 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SCLUSTER = 0x22 + AF_SIP = 0x18 + AF_SLOW = 0x21 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VENDOR00 = 0x27 + AF_VENDOR01 = 0x29 + AF_VENDOR02 = 0x2b + AF_VENDOR03 = 0x2d + AF_VENDOR04 = 0x2f + AF_VENDOR05 = 0x31 + AF_VENDOR06 = 0x33 + AF_VENDOR07 = 0x35 + AF_VENDOR08 = 0x37 + AF_VENDOR09 = 0x39 + AF_VENDOR10 = 0x3b + AF_VENDOR11 = 0x3d + AF_VENDOR12 = 0x3f + AF_VENDOR13 = 0x41 + AF_VENDOR14 = 0x43 + AF_VENDOR15 = 0x45 + AF_VENDOR16 = 0x47 + AF_VENDOR17 = 0x49 + AF_VENDOR18 = 0x4b + AF_VENDOR19 = 0x4d + AF_VENDOR20 = 0x4f + AF_VENDOR21 = 0x51 + AF_VENDOR22 = 0x53 + AF_VENDOR23 = 0x55 + AF_VENDOR24 = 0x57 + AF_VENDOR25 = 0x59 + AF_VENDOR26 = 0x5b + AF_VENDOR27 = 0x5d + AF_VENDOR28 = 0x5f + AF_VENDOR29 = 0x61 + AF_VENDOR30 = 0x63 + AF_VENDOR31 = 0x65 + AF_VENDOR32 = 0x67 + AF_VENDOR33 = 0x69 + AF_VENDOR34 = 0x6b + AF_VENDOR35 = 0x6d + AF_VENDOR36 = 0x6f + AF_VENDOR37 = 0x71 + AF_VENDOR38 = 0x73 + AF_VENDOR39 = 0x75 + AF_VENDOR40 = 0x77 + AF_VENDOR41 = 0x79 + AF_VENDOR42 = 0x7b + AF_VENDOR43 = 0x7d + AF_VENDOR44 = 0x7f + AF_VENDOR45 = 0x81 + AF_VENDOR46 = 0x83 + AF_VENDOR47 = 0x85 + ALTWERASE = 0x200 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B460800 = 0x70800 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B921600 = 0xe1000 + B9600 = 0x2580 + BIOCFEEDBACK = 0x8004427c + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDIRECTION = 0x40044276 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0084279 + BIOCGETBUFMODE = 0x4004427d + BIOCGETIF = 0x4020426b + BIOCGETZMAX = 0x4004427f + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCGTSTAMP = 0x40044283 + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x2000427a + BIOCPROMISC = 0x20004269 + BIOCROTZBUF = 0x400c4280 + BIOCSBLEN = 0xc0044266 + BIOCSDIRECTION = 0x80044277 + BIOCSDLT = 0x80044278 + BIOCSETBUFMODE = 0x8004427e + BIOCSETF = 0x80084267 + BIOCSETFNR = 0x80084282 + BIOCSETIF = 0x8020426c + BIOCSETWF = 0x8008427b + BIOCSETZBUF = 0x800c4281 + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8010426d + BIOCSSEESENT = 0x80044277 + BIOCSTSTAMP = 0x80044284 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_BUFMODE_BUFFER = 0x1 + BPF_BUFMODE_ZBUF = 0x2 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_T_BINTIME = 0x2 + BPF_T_BINTIME_FAST = 0x102 + BPF_T_BINTIME_MONOTONIC = 0x202 + BPF_T_BINTIME_MONOTONIC_FAST = 0x302 + BPF_T_FAST = 0x100 + BPF_T_FLAG_MASK = 0x300 + BPF_T_FORMAT_MASK = 0x3 + BPF_T_MICROTIME = 0x0 + BPF_T_MICROTIME_FAST = 0x100 + BPF_T_MICROTIME_MONOTONIC = 0x200 + BPF_T_MICROTIME_MONOTONIC_FAST = 0x300 + BPF_T_MONOTONIC = 0x200 + BPF_T_MONOTONIC_FAST = 0x300 + BPF_T_NANOTIME = 0x1 + BPF_T_NANOTIME_FAST = 0x101 + BPF_T_NANOTIME_MONOTONIC = 0x201 + BPF_T_NANOTIME_MONOTONIC_FAST = 0x301 + BPF_T_NONE = 0x3 + BPF_T_NORMAL = 0x0 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + CAP_ACCEPT = 0x200000020000000 + CAP_ACL_CHECK = 0x400000000010000 + CAP_ACL_DELETE = 0x400000000020000 + CAP_ACL_GET = 0x400000000040000 + CAP_ACL_SET = 0x400000000080000 + CAP_ALL0 = 0x20007ffffffffff + CAP_ALL1 = 0x4000000001fffff + CAP_BIND = 0x200000040000000 + CAP_BINDAT = 0x200008000000400 + CAP_CHFLAGSAT = 0x200000000001400 + CAP_CONNECT = 0x200000080000000 + CAP_CONNECTAT = 0x200010000000400 + CAP_CREATE = 0x200000000000040 + CAP_EVENT = 0x400000000000020 + CAP_EXTATTR_DELETE = 0x400000000001000 + CAP_EXTATTR_GET = 0x400000000002000 + CAP_EXTATTR_LIST = 0x400000000004000 + CAP_EXTATTR_SET = 0x400000000008000 + CAP_FCHDIR = 0x200000000000800 + CAP_FCHFLAGS = 0x200000000001000 + CAP_FCHMOD = 0x200000000002000 + CAP_FCHMODAT = 0x200000000002400 + CAP_FCHOWN = 0x200000000004000 + CAP_FCHOWNAT = 0x200000000004400 + CAP_FCNTL = 0x200000000008000 + CAP_FCNTL_ALL = 0x78 + CAP_FCNTL_GETFL = 0x8 + CAP_FCNTL_GETOWN = 0x20 + CAP_FCNTL_SETFL = 0x10 + CAP_FCNTL_SETOWN = 0x40 + CAP_FEXECVE = 0x200000000000080 + CAP_FLOCK = 0x200000000010000 + CAP_FPATHCONF = 0x200000000020000 + CAP_FSCK = 0x200000000040000 + CAP_FSTAT = 0x200000000080000 + CAP_FSTATAT = 0x200000000080400 + CAP_FSTATFS = 0x200000000100000 + CAP_FSYNC = 0x200000000000100 + CAP_FTRUNCATE = 0x200000000000200 + CAP_FUTIMES = 0x200000000200000 + CAP_FUTIMESAT = 0x200000000200400 + CAP_GETPEERNAME = 0x200000100000000 + CAP_GETSOCKNAME = 0x200000200000000 + CAP_GETSOCKOPT = 0x200000400000000 + CAP_IOCTL = 0x400000000000080 + CAP_IOCTLS_ALL = 0x7fffffff + CAP_KQUEUE = 0x400000000100040 + CAP_KQUEUE_CHANGE = 0x400000000100000 + CAP_KQUEUE_EVENT = 0x400000000000040 + CAP_LINKAT_SOURCE = 0x200020000000400 + CAP_LINKAT_TARGET = 0x200000000400400 + CAP_LISTEN = 0x200000800000000 + CAP_LOOKUP = 0x200000000000400 + CAP_MAC_GET = 0x400000000000001 + CAP_MAC_SET = 0x400000000000002 + CAP_MKDIRAT = 0x200000000800400 + CAP_MKFIFOAT = 0x200000001000400 + CAP_MKNODAT = 0x200000002000400 + CAP_MMAP = 0x200000000000010 + CAP_MMAP_R = 0x20000000000001d + CAP_MMAP_RW = 0x20000000000001f + CAP_MMAP_RWX = 0x20000000000003f + CAP_MMAP_RX = 0x20000000000003d + CAP_MMAP_W = 0x20000000000001e + CAP_MMAP_WX = 0x20000000000003e + CAP_MMAP_X = 0x20000000000003c + CAP_PDGETPID = 0x400000000000200 + CAP_PDKILL = 0x400000000000800 + CAP_PDWAIT = 0x400000000000400 + CAP_PEELOFF = 0x200001000000000 + CAP_POLL_EVENT = 0x400000000000020 + CAP_PREAD = 0x20000000000000d + CAP_PWRITE = 0x20000000000000e + CAP_READ = 0x200000000000001 + CAP_RECV = 0x200000000000001 + CAP_RENAMEAT_SOURCE = 0x200000004000400 + CAP_RENAMEAT_TARGET = 0x200040000000400 + CAP_RIGHTS_VERSION = 0x0 + CAP_RIGHTS_VERSION_00 = 0x0 + CAP_SEEK = 0x20000000000000c + CAP_SEEK_TELL = 0x200000000000004 + CAP_SEM_GETVALUE = 0x400000000000004 + CAP_SEM_POST = 0x400000000000008 + CAP_SEM_WAIT = 0x400000000000010 + CAP_SEND = 0x200000000000002 + CAP_SETSOCKOPT = 0x200002000000000 + CAP_SHUTDOWN = 0x200004000000000 + CAP_SOCK_CLIENT = 0x200007780000003 + CAP_SOCK_SERVER = 0x200007f60000003 + CAP_SYMLINKAT = 0x200000008000400 + CAP_TTYHOOK = 0x400000000000100 + CAP_UNLINKAT = 0x200000010000400 + CAP_UNUSED0_44 = 0x200080000000000 + CAP_UNUSED0_57 = 0x300000000000000 + CAP_UNUSED1_22 = 0x400000000200000 + CAP_UNUSED1_57 = 0x500000000000000 + CAP_WRITE = 0x200000000000002 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x4 + CLOCK_MONOTONIC_FAST = 0xc + CLOCK_MONOTONIC_PRECISE = 0xb + CLOCK_PROCESS_CPUTIME_ID = 0xf + CLOCK_PROF = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_FAST = 0xa + CLOCK_REALTIME_PRECISE = 0x9 + CLOCK_SECOND = 0xd + CLOCK_THREAD_CPUTIME_ID = 0xe + CLOCK_UPTIME = 0x5 + CLOCK_UPTIME_FAST = 0x8 + CLOCK_UPTIME_PRECISE = 0x7 + CLOCK_VIRTUAL = 0x1 + CREAD = 0x800 + CRTSCTS = 0x30000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_MAXNAME = 0x18 + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_BREDR_BB = 0xff + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_BLUETOOTH_LE_LL = 0xfb + DLT_BLUETOOTH_LE_LL_WITH_PHDR = 0x100 + DLT_BLUETOOTH_LINUX_MONITOR = 0xfe + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_CLASS_NETBSD_RAWAF = 0x2240000 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_EPON = 0x103 + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_INFINIBAND = 0xf7 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPMI_HPM_2 = 0x104 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_ISO_14443 = 0x108 + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0x109 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NETLINK = 0xfd + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x79 + DLT_PKTAP = 0x102 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0xe + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PROFIBUS_DL = 0x101 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RDS = 0x109 + DLT_REDBACK_SMARTEDGE = 0x20 + DLT_RIO = 0x7c + DLT_RTAC_SERIAL = 0xfa + DLT_SCCP = 0x8e + DLT_SCTP = 0xf8 + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xd + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USBPCAP = 0xf9 + DLT_USB_FREEBSD = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WATTSTOPPER_DLM = 0x107 + DLT_WIHART = 0xdf + DLT_WIRESHARK_UPPER_PDU = 0xfc + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DLT_ZWAVE_R1_R2 = 0x105 + DLT_ZWAVE_R3 = 0x106 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_FS = -0x9 + EVFILT_LIO = -0xa + EVFILT_PROC = -0x5 + EVFILT_PROCDESC = -0x8 + EVFILT_READ = -0x1 + EVFILT_SENDFILE = -0xc + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xc + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xb + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_DROP = 0x1000 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_FLAG2 = 0x4000 + EV_FORCEONESHOT = 0x100 + EV_ONESHOT = 0x10 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTATTR_NAMESPACE_EMPTY = 0x0 + EXTATTR_NAMESPACE_SYSTEM = 0x2 + EXTATTR_NAMESPACE_USER = 0x1 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_CANCEL = 0x5 + F_DUP2FD = 0xa + F_DUP2FD_CLOEXEC = 0x12 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x11 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0xb + F_GETOWN = 0x5 + F_OGETLK = 0x7 + F_OK = 0x0 + F_OSETLK = 0x8 + F_OSETLKW = 0x9 + F_RDAHEAD = 0x10 + F_RDLCK = 0x1 + F_READAHEAD = 0xf + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0xc + F_SETLKW = 0xd + F_SETLK_REMOTE = 0xe + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_UNLCKSYS = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x218f52 + IFF_CANTCONFIG = 0x10000 + IFF_DEBUG = 0x4 + IFF_DRV_OACTIVE = 0x400 + IFF_DRV_RUNNING = 0x40 + IFF_DYING = 0x200000 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MONITOR = 0x40000 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PPROMISC = 0x20000 + IFF_PROMISC = 0x100 + IFF_RENAMING = 0x400000 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_STATICARP = 0x80000 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_BRIDGE = 0xd1 + IFT_CARP = 0xf8 + IFT_IEEE1394 = 0x90 + IFT_INFINIBAND = 0xc7 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_PPP = 0x17 + IFT_PROPVIRTUAL = 0x35 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IN_RFC3021_MASK = 0xfffffffe + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CARP = 0x70 + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0x102 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HIP = 0x8b + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MEAS = 0x13 + IPPROTO_MH = 0x87 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MOBILE = 0x37 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OLD_DIVERT = 0xfe + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_RESERVED_253 = 0xfd + IPPROTO_RESERVED_254 = 0xfe + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEND = 0x103 + IPPROTO_SEP = 0x21 + IPPROTO_SHIM6 = 0x8c + IPPROTO_SKIP = 0x39 + IPPROTO_SPACER = 0x7fff + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TLSP = 0x38 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_BINDANY = 0x40 + IPV6_BINDMULTI = 0x41 + IPV6_BINDV6ONLY = 0x1b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FLOWID = 0x43 + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FLOWTYPE = 0x44 + IPV6_FRAGTTL = 0x78 + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MSFILTER = 0x4a + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_PREFER_TEMPADDR = 0x3f + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVFLOWID = 0x46 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRSSBUCKETID = 0x47 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RSSBUCKETID = 0x45 + IPV6_RSS_LISTEN_BUCKET = 0x42 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BINDANY = 0x18 + IP_BINDMULTI = 0x19 + IP_BLOCK_SOURCE = 0x48 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DONTFRAG = 0x43 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET3 = 0x31 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FLOWID = 0x5a + IP_FLOWTYPE = 0x5b + IP_FW3 = 0x30 + IP_FW_ADD = 0x32 + IP_FW_DEL = 0x33 + IP_FW_FLUSH = 0x34 + IP_FW_GET = 0x36 + IP_FW_NAT_CFG = 0x38 + IP_FW_NAT_DEL = 0x39 + IP_FW_NAT_GET_CONFIG = 0x3a + IP_FW_NAT_GET_LOG = 0x3b + IP_FW_RESETLOG = 0x37 + IP_FW_TABLE_ADD = 0x28 + IP_FW_TABLE_DEL = 0x29 + IP_FW_TABLE_FLUSH = 0x2a + IP_FW_TABLE_GETSIZE = 0x2b + IP_FW_TABLE_LIST = 0x2c + IP_FW_ZERO = 0x35 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MAX_SOURCE_FILTER = 0x400 + IP_MF = 0x2000 + IP_MINTTL = 0x42 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_OFFMASK = 0x1fff + IP_ONESBCAST = 0x17 + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVFLOWID = 0x5d + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVRSSBUCKETID = 0x5e + IP_RECVTOS = 0x44 + IP_RECVTTL = 0x41 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSSBUCKETID = 0x5c + IP_RSS_LISTEN_BUCKET = 0x1a + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_SENDSRCADDR = 0x7 + IP_TOS = 0x3 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_AUTOSYNC = 0x7 + MADV_CORE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_NOCORE = 0x8 + MADV_NORMAL = 0x0 + MADV_NOSYNC = 0x6 + MADV_PROTECT = 0xa + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MAP_ALIGNED_SUPER = 0x1000000 + MAP_ALIGNMENT_MASK = -0x1000000 + MAP_ALIGNMENT_SHIFT = 0x18 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_EXCL = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GUARD = 0x2000 + MAP_HASSEMAPHORE = 0x200 + MAP_NOCORE = 0x20000 + MAP_NOSYNC = 0x800 + MAP_PREFAULT_READ = 0x40000 + MAP_PRIVATE = 0x2 + MAP_RESERVED0020 = 0x20 + MAP_RESERVED0040 = 0x40 + MAP_RESERVED0080 = 0x80 + MAP_RESERVED0100 = 0x100 + MAP_SHARED = 0x1 + MAP_STACK = 0x400 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ACLS = 0x8000000 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x200000000 + MNT_BYFSID = 0x8000000 + MNT_CMDFLAGS = 0xd0f0000 + MNT_DEFEXPORTED = 0x200 + MNT_DELEXPORT = 0x20000 + MNT_EXKERB = 0x800 + MNT_EXPORTANON = 0x400 + MNT_EXPORTED = 0x100 + MNT_EXPUBLIC = 0x20000000 + MNT_EXRDONLY = 0x80 + MNT_FORCE = 0x80000 + MNT_GJOURNAL = 0x2000000 + MNT_IGNORE = 0x800000 + MNT_LAZY = 0x3 + MNT_LOCAL = 0x1000 + MNT_MULTILABEL = 0x4000000 + MNT_NFS4ACLS = 0x10 + MNT_NOATIME = 0x10000000 + MNT_NOCLUSTERR = 0x40000000 + MNT_NOCLUSTERW = 0x80000000 + MNT_NOEXEC = 0x4 + MNT_NONBUSY = 0x4000000 + MNT_NOSUID = 0x8 + MNT_NOSYMFOLLOW = 0x400000 + MNT_NOWAIT = 0x2 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SNAPSHOT = 0x1000000 + MNT_SOFTDEP = 0x200000 + MNT_SUIDDIR = 0x100000 + MNT_SUJ = 0x100000000 + MNT_SUSPEND = 0x4 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UPDATE = 0x10000 + MNT_UPDATEMASK = 0x2d8d0807e + MNT_USER = 0x8000 + MNT_VISFLAGMASK = 0x3fef0ffff + MNT_WAIT = 0x1 + MSG_CMSG_CLOEXEC = 0x40000 + MSG_COMPAT = 0x8000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_NBIO = 0x4000 + MSG_NOSIGNAL = 0x20000 + MSG_NOTIFICATION = 0x2000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITFORONE = 0x80000 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x0 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLISTL = 0x5 + NET_RT_IFMALIST = 0x4 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_CLOSE = 0x100 + NOTE_CLOSE_WRITE = 0x200 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FILE_POLL = 0x2 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_MSECONDS = 0x2 + NOTE_NSECONDS = 0x8 + NOTE_OPEN = 0x80 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_READ = 0x400 + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x4 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x100000 + O_CREAT = 0x200 + O_DIRECT = 0x10000 + O_DIRECTORY = 0x20000 + O_EXCL = 0x800 + O_EXEC = 0x40000 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_TTY_INIT = 0x80000 + O_VERIFY = 0x200000 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_FIXEDMTU = 0x80000 + RTF_FMASK = 0x1004d808 + RTF_GATEWAY = 0x2 + RTF_GWFLAG_COMPAT = 0x80000000 + RTF_HOST = 0x4 + RTF_LLDATA = 0x400 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_PINNED = 0x100000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_REJECT = 0x8 + RTF_RNH_LOCKED = 0x40000000 + RTF_STATIC = 0x800 + RTF_STICKY = 0x10000000 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x12 + RTM_IFANNOUNCE = 0x11 + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RTV_WEIGHT = 0x100 + RT_ALL_FIBS = -0x1 + RT_BLACKHOLE = 0x40 + RT_CACHING_CONTEXT = 0x1 + RT_DEFAULT_FIB = 0x0 + RT_HAS_GW = 0x80 + RT_HAS_HEADER = 0x10 + RT_HAS_HEADER_BIT = 0x4 + RT_L2_ME = 0x4 + RT_L2_ME_BIT = 0x2 + RT_LLE_CACHE = 0x100 + RT_MAY_LOOP = 0x8 + RT_MAY_LOOP_BIT = 0x3 + RT_NORTREF = 0x2 + RT_REJECT = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_BINTIME = 0x4 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCAIFGROUP = 0x80246987 + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFGROUP = 0x80246989 + SIOCDIFPHYADDR = 0x80206949 + SIOCGDRVSPEC = 0xc01c697b + SIOCGETSGCNT = 0xc0147210 + SIOCGETVIFCNT = 0xc014720f + SIOCGHIWAT = 0x40047301 + SIOCGHWADDR = 0xc020693e + SIOCGI2C = 0xc020693d + SIOCGIFADDR = 0xc0206921 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020691f + SIOCGIFCONF = 0xc0086924 + SIOCGIFDESCR = 0xc020692a + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFIB = 0xc020695c + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc024698a + SIOCGIFGROUP = 0xc0246988 + SIOCGIFINDEX = 0xc0206920 + SIOCGIFMAC = 0xc0206926 + SIOCGIFMEDIA = 0xc0286938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206948 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFSTATUS = 0xc331693b + SIOCGIFXMEDIA = 0xc028698b + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGPRIVATE_0 = 0xc0206950 + SIOCGPRIVATE_1 = 0xc0206951 + SIOCGTUNFIB = 0xc020695e + SIOCIFCREATE = 0xc020697a + SIOCIFCREATE2 = 0xc020697c + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc00c6978 + SIOCSDRVSPEC = 0x801c697b + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020691e + SIOCSIFDESCR = 0x80206929 + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFIB = 0x8020695d + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206927 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNAME = 0x80206928 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSIFPHYS = 0x80206936 + SIOCSIFRVNET = 0xc020695b + SIOCSIFVNET = 0xc020695a + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSTUNFIB = 0x8020695f + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_NONBLOCK = 0x20000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BINTIME = 0x2000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1009 + SO_LINGER = 0x80 + SO_LISTENINCQLEN = 0x1013 + SO_LISTENQLEN = 0x1012 + SO_LISTENQLIMIT = 0x1011 + SO_NOSIGPIPE = 0x800 + SO_NO_DDP = 0x8000 + SO_NO_OFFLOAD = 0x4000 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1010 + SO_PROTOCOL = 0x1016 + SO_PROTOTYPE = 0x1016 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SETFIB = 0x1014 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SO_USER_COOKIE = 0x1015 + SO_VENDOR = 0x80000000 + TAB0 = 0x0 + TAB3 = 0x4 + TABDLY = 0x4 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCP_CA_NAME_MAX = 0x10 + TCP_CCALGOOPT = 0x41 + TCP_CONGESTION = 0x40 + TCP_FASTOPEN = 0x401 + TCP_FUNCTION_BLK = 0x2000 + TCP_FUNCTION_NAME_LEN_MAX = 0x20 + TCP_INFO = 0x20 + TCP_KEEPCNT = 0x400 + TCP_KEEPIDLE = 0x100 + TCP_KEEPINIT = 0x80 + TCP_KEEPINTVL = 0x200 + TCP_MAXBURST = 0x4 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x10 + TCP_MINMSS = 0xd8 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_PCAP_IN = 0x1000 + TCP_PCAP_OUT = 0x800 + TCP_VENDOR = 0x80000000 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGPTN = 0x4004740f + TIOCGSID = 0x40047463 + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DCD = 0x40 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTMASTER = 0x2000741c + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2004745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40107459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VERASE2 = 0x7 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x4 + WCOREFLAG = 0x80 + WEXITED = 0x10 + WLINUXCLONE = 0x80000000 + WNOHANG = 0x1 + WNOWAIT = 0x8 + WSTOPPED = 0x2 + WTRAPPED = 0x20 + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x59) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x55) + ECAPMODE = syscall.Errno(0x5e) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDOOFUS = syscall.Errno(0x58) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x52) + EILSEQ = syscall.Errno(0x56) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x60) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5a) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x57) + ENOBUFS = syscall.Errno(0x37) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x5b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x53) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCAPABLE = syscall.Errno(0x5d) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x5f) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x54) + EOWNERDEAD = syscall.Errno(0x60) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x5c) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGLIBRT = syscall.Signal(0x21) + SIGLWP = syscall.Signal(0x20) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHR = syscall.Signal(0x20) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "device not configured", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource deadlock avoided", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device busy", + 17: "file exists", + 18: "cross-device link", + 19: "operation not supported by device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "result too large", + 35: "resource temporarily unavailable", + 36: "operation now in progress", + 37: "operation already in progress", + 38: "socket operation on non-socket", + 39: "destination address required", + 40: "message too long", + 41: "protocol wrong type for socket", + 42: "protocol not available", + 43: "protocol not supported", + 44: "socket type not supported", + 45: "operation not supported", + 46: "protocol family not supported", + 47: "address family not supported by protocol family", + 48: "address already in use", + 49: "can't assign requested address", + 50: "network is down", + 51: "network is unreachable", + 52: "network dropped connection on reset", + 53: "software caused connection abort", + 54: "connection reset by peer", + 55: "no buffer space available", + 56: "socket is already connected", + 57: "socket is not connected", + 58: "can't send after socket shutdown", + 59: "too many references: can't splice", + 60: "operation timed out", + 61: "connection refused", + 62: "too many levels of symbolic links", + 63: "file name too long", + 64: "host is down", + 65: "no route to host", + 66: "directory not empty", + 67: "too many processes", + 68: "too many users", + 69: "disc quota exceeded", + 70: "stale NFS file handle", + 71: "too many levels of remote in path", + 72: "RPC struct is bad", + 73: "RPC version wrong", + 74: "RPC prog. not avail", + 75: "program version wrong", + 76: "bad procedure for program", + 77: "no locks available", + 78: "function not implemented", + 79: "inappropriate file type or format", + 80: "authentication error", + 81: "need authenticator", + 82: "identifier removed", + 83: "no message of desired type", + 84: "value too large to be stored in data type", + 85: "operation canceled", + 86: "illegal byte sequence", + 87: "attribute not found", + 88: "programming error", + 89: "bad message", + 90: "multihop attempted", + 91: "link has been severed", + 92: "protocol error", + 93: "capabilities insufficient", + 94: "not permitted in capability mode", + 95: "state not recoverable", + 96: "previous owner died", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/BPT trap", + 6: "abort trap", + 7: "EMT trap", + 8: "floating point exception", + 9: "killed", + 10: "bus error", + 11: "segmentation fault", + 12: "bad system call", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "urgent I/O condition", + 17: "suspended (signal)", + 18: "suspended", + 19: "continued", + 20: "child exited", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "I/O possible", + 24: "cputime limit exceeded", + 25: "filesize limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window size changes", + 29: "information request", + 30: "user defined signal 1", + 31: "user defined signal 2", + 32: "unknown signal", + 33: "unknown signal", +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_386.go new file mode 100644 index 0000000..4066ad1 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_386.go @@ -0,0 +1,2231 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include -m32 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m32 _const.go + +package unix + +import "syscall" + +const ( + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BLKBSZGET = 0x80041270 + BLKBSZSET = 0x40041271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80041272 + BLKPBSZGET = 0x127b + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x1000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0xc + F_GETLK64 = 0xc + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0xd + F_SETLK64 = 0xd + F_SETLKW = 0xe + F_SETLKW64 = 0xe + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MAP_32BIT = 0x40 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x2000 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x4000 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x4000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x8000 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x2401 + PERF_EVENT_IOC_ENABLE = 0x2400 + PERF_EVENT_IOC_ID = 0x80042407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 + PERF_EVENT_IOC_PERIOD = 0x40082404 + PERF_EVENT_IOC_REFRESH = 0x2402 + PERF_EVENT_IOC_RESET = 0x2403 + PERF_EVENT_IOC_SET_BPF = 0x40042408 + PERF_EVENT_IOC_SET_FILTER = 0x40042406 + PERF_EVENT_IOC_SET_OUTPUT = 0x2405 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETFPXREGS = 0x12 + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPREGS = 0xf + PTRACE_SETFPXREGS = 0x13 + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SINGLEBLOCK = 0x21 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_SYSEMU = 0x1f + PTRACE_SYSEMU_SINGLESTEP = 0x20 + PTRACE_TRACEME = 0x0 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = -0x1 + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x10 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x541b + SIOCOUTQ = 0x5411 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x10 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x11 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x12 + SO_RCVTIMEO = 0x14 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x13 + SO_SNDTIMEO = 0x15 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x540b + TCGETA = 0x5405 + TCGETS = 0x5401 + TCGETS2 = 0x802c542a + TCGETX = 0x5432 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSBRKP = 0x5425 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETS2 = 0x402c542b + TCSETSF = 0x5404 + TCSETSF2 = 0x402c542d + TCSETSW = 0x5403 + TCSETSW2 = 0x402c542c + TCSETX = 0x5433 + TCSETXF = 0x5434 + TCSETXW = 0x5435 + TCXONC = 0x540a + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x80045432 + TIOCGETD = 0x5424 + TIOCGEXCL = 0x80045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x540f + TIOCGPKT = 0x80045438 + TIOCGPTLCK = 0x80045439 + TIOCGPTN = 0x80045430 + TIOCGPTPEER = 0x5441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x5413 + TIOCINQ = 0x541b + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x5411 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x5423 + TIOCSIG = 0x40045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x5410 + TIOCSPTLCK = 0x40045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTI = 0x5412 + TIOCSWINSZ = 0x5414 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x100 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x400854d5 + TUNDETACHFILTER = 0x400854d6 + TUNGETFEATURES = 0x800454cf + TUNGETFILTER = 0x800854db + TUNGETIFF = 0x800454d2 + TUNGETSNDBUF = 0x800454d3 + TUNGETVNETBE = 0x800454df + TUNGETVNETHDRSZ = 0x800454d7 + TUNGETVNETLE = 0x800454dd + TUNSETDEBUG = 0x400454c9 + TUNSETGROUP = 0x400454ce + TUNSETIFF = 0x400454ca + TUNSETIFINDEX = 0x400454da + TUNSETLINK = 0x400454cd + TUNSETNOCSUM = 0x400454c8 + TUNSETOFFLOAD = 0x400454d0 + TUNSETOWNER = 0x400454cc + TUNSETPERSIST = 0x400454cb + TUNSETQUEUE = 0x400454d9 + TUNSETSNDBUF = 0x400454d4 + TUNSETTXFILTER = 0x400454d1 + TUNSETVNETBE = 0x400454de + TUNSETVNETHDRSZ = 0x400454d8 + TUNSETVNETLE = 0x400454dc + UMOUNT_NOFOLLOW = 0x8 + VDISCARD = 0xd + VEOF = 0x4 + VEOL = 0xb + VEOL2 = 0x10 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x6 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x20 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XTABS = 0x1800 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x62) + EADDRNOTAVAIL = syscall.Errno(0x63) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x61) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x72) + EBADE = syscall.Errno(0x34) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x4d) + EBADMSG = syscall.Errno(0x4a) + EBADR = syscall.Errno(0x35) + EBADRQC = syscall.Errno(0x38) + EBADSLT = syscall.Errno(0x39) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7d) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x2c) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x67) + ECONNREFUSED = syscall.Errno(0x6f) + ECONNRESET = syscall.Errno(0x68) + EDEADLK = syscall.Errno(0x23) + EDEADLOCK = syscall.Errno(0x23) + EDESTADDRREQ = syscall.Errno(0x59) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x7a) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x70) + EHOSTUNREACH = syscall.Errno(0x71) + EHWPOISON = syscall.Errno(0x85) + EIDRM = syscall.Errno(0x2b) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x73) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x6a) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x7f) + EKEYREJECTED = syscall.Errno(0x81) + EKEYREVOKED = syscall.Errno(0x80) + EL2HLT = syscall.Errno(0x33) + EL2NSYNC = syscall.Errno(0x2d) + EL3HLT = syscall.Errno(0x2e) + EL3RST = syscall.Errno(0x2f) + ELIBACC = syscall.Errno(0x4f) + ELIBBAD = syscall.Errno(0x50) + ELIBEXEC = syscall.Errno(0x53) + ELIBMAX = syscall.Errno(0x52) + ELIBSCN = syscall.Errno(0x51) + ELNRNG = syscall.Errno(0x30) + ELOOP = syscall.Errno(0x28) + EMEDIUMTYPE = syscall.Errno(0x7c) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x5a) + EMULTIHOP = syscall.Errno(0x48) + ENAMETOOLONG = syscall.Errno(0x24) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x64) + ENETRESET = syscall.Errno(0x66) + ENETUNREACH = syscall.Errno(0x65) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x37) + ENOBUFS = syscall.Errno(0x69) + ENOCSI = syscall.Errno(0x32) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x7e) + ENOLCK = syscall.Errno(0x25) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x7b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x2a) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x5c) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x26) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x6b) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x27) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x83) + ENOTSOCK = syscall.Errno(0x58) + ENOTSUP = syscall.Errno(0x5f) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x4c) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x5f) + EOVERFLOW = syscall.Errno(0x4b) + EOWNERDEAD = syscall.Errno(0x82) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x60) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x5d) + EPROTOTYPE = syscall.Errno(0x5b) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x4e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x55) + ERFKILL = syscall.Errno(0x84) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x6c) + ESOCKTNOSUPPORT = syscall.Errno(0x5e) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x74) + ESTRPIPE = syscall.Errno(0x56) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x6e) + ETOOMANYREFS = syscall.Errno(0x6d) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x31) + EUSERS = syscall.Errno(0x57) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x36) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0x7) + SIGCHLD = syscall.Signal(0x11) + SIGCLD = syscall.Signal(0x11) + SIGCONT = syscall.Signal(0x12) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x1d) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x1d) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1e) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTKFLT = syscall.Signal(0x10) + SIGSTOP = syscall.Signal(0x13) + SIGSYS = syscall.Signal(0x1f) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x14) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x17) + SIGUSR1 = syscall.Signal(0xa) + SIGUSR2 = syscall.Signal(0xc) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "no such device or address", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource temporarily unavailable", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device or resource busy", + 17: "file exists", + 18: "invalid cross-device link", + 19: "no such device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "numerical result out of range", + 35: "resource deadlock avoided", + 36: "file name too long", + 37: "no locks available", + 38: "function not implemented", + 39: "directory not empty", + 40: "too many levels of symbolic links", + 42: "no message of desired type", + 43: "identifier removed", + 44: "channel number out of range", + 45: "level 2 not synchronized", + 46: "level 3 halted", + 47: "level 3 reset", + 48: "link number out of range", + 49: "protocol driver not attached", + 50: "no CSI structure available", + 51: "level 2 halted", + 52: "invalid exchange", + 53: "invalid request descriptor", + 54: "exchange full", + 55: "no anode", + 56: "invalid request code", + 57: "invalid slot", + 59: "bad font file format", + 60: "device not a stream", + 61: "no data available", + 62: "timer expired", + 63: "out of streams resources", + 64: "machine is not on the network", + 65: "package not installed", + 66: "object is remote", + 67: "link has been severed", + 68: "advertise error", + 69: "srmount error", + 70: "communication error on send", + 71: "protocol error", + 72: "multihop attempted", + 73: "RFS specific error", + 74: "bad message", + 75: "value too large for defined data type", + 76: "name not unique on network", + 77: "file descriptor in bad state", + 78: "remote address changed", + 79: "can not access a needed shared library", + 80: "accessing a corrupted shared library", + 81: ".lib section in a.out corrupted", + 82: "attempting to link in too many shared libraries", + 83: "cannot exec a shared library directly", + 84: "invalid or incomplete multibyte or wide character", + 85: "interrupted system call should be restarted", + 86: "streams pipe error", + 87: "too many users", + 88: "socket operation on non-socket", + 89: "destination address required", + 90: "message too long", + 91: "protocol wrong type for socket", + 92: "protocol not available", + 93: "protocol not supported", + 94: "socket type not supported", + 95: "operation not supported", + 96: "protocol family not supported", + 97: "address family not supported by protocol", + 98: "address already in use", + 99: "cannot assign requested address", + 100: "network is down", + 101: "network is unreachable", + 102: "network dropped connection on reset", + 103: "software caused connection abort", + 104: "connection reset by peer", + 105: "no buffer space available", + 106: "transport endpoint is already connected", + 107: "transport endpoint is not connected", + 108: "cannot send after transport endpoint shutdown", + 109: "too many references: cannot splice", + 110: "connection timed out", + 111: "connection refused", + 112: "host is down", + 113: "no route to host", + 114: "operation already in progress", + 115: "operation now in progress", + 116: "stale file handle", + 117: "structure needs cleaning", + 118: "not a XENIX named type file", + 119: "no XENIX semaphores available", + 120: "is a named type file", + 121: "remote I/O error", + 122: "disk quota exceeded", + 123: "no medium found", + 124: "wrong medium type", + 125: "operation canceled", + 126: "required key not available", + 127: "key has expired", + 128: "key has been revoked", + 129: "key was rejected by service", + 130: "owner died", + 131: "state not recoverable", + 132: "operation not possible due to RF-kill", + 133: "memory page has hardware error", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/breakpoint trap", + 6: "aborted", + 7: "bus error", + 8: "floating point exception", + 9: "killed", + 10: "user defined signal 1", + 11: "segmentation fault", + 12: "user defined signal 2", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "stack fault", + 17: "child exited", + 18: "continued", + 19: "stopped (signal)", + 20: "stopped", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "urgent I/O condition", + 24: "CPU time limit exceeded", + 25: "file size limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window changed", + 29: "I/O possible", + 30: "power failure", + 31: "bad system call", +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go new file mode 100644 index 0000000..c9f53b0 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go @@ -0,0 +1,2232 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include -m64 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BLKBSZGET = 0x80081270 + BLKBSZSET = 0x40081271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80081272 + BLKPBSZGET = 0x127b + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x1000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x5 + F_GETLK64 = 0x5 + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MAP_32BIT = 0x40 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x2000 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x4000 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x4000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x2401 + PERF_EVENT_IOC_ENABLE = 0x2400 + PERF_EVENT_IOC_ID = 0x80082407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 + PERF_EVENT_IOC_PERIOD = 0x40082404 + PERF_EVENT_IOC_REFRESH = 0x2402 + PERF_EVENT_IOC_RESET = 0x2403 + PERF_EVENT_IOC_SET_BPF = 0x40042408 + PERF_EVENT_IOC_SET_FILTER = 0x40082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x2405 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = -0x1 + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ARCH_PRCTL = 0x1e + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETFPXREGS = 0x12 + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPREGS = 0xf + PTRACE_SETFPXREGS = 0x13 + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SINGLEBLOCK = 0x21 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_SYSEMU = 0x1f + PTRACE_SYSEMU_SINGLESTEP = 0x20 + PTRACE_TRACEME = 0x0 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = -0x1 + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x10 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x541b + SIOCOUTQ = 0x5411 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x10 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x11 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x12 + SO_RCVTIMEO = 0x14 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x13 + SO_SNDTIMEO = 0x15 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x540b + TCGETA = 0x5405 + TCGETS = 0x5401 + TCGETS2 = 0x802c542a + TCGETX = 0x5432 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSBRKP = 0x5425 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETS2 = 0x402c542b + TCSETSF = 0x5404 + TCSETSF2 = 0x402c542d + TCSETSW = 0x5403 + TCSETSW2 = 0x402c542c + TCSETX = 0x5433 + TCSETXF = 0x5434 + TCSETXW = 0x5435 + TCXONC = 0x540a + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x80045432 + TIOCGETD = 0x5424 + TIOCGEXCL = 0x80045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x540f + TIOCGPKT = 0x80045438 + TIOCGPTLCK = 0x80045439 + TIOCGPTN = 0x80045430 + TIOCGPTPEER = 0x5441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x5413 + TIOCINQ = 0x541b + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x5411 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x5423 + TIOCSIG = 0x40045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x5410 + TIOCSPTLCK = 0x40045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTI = 0x5412 + TIOCSWINSZ = 0x5414 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x100 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x401054d5 + TUNDETACHFILTER = 0x401054d6 + TUNGETFEATURES = 0x800454cf + TUNGETFILTER = 0x801054db + TUNGETIFF = 0x800454d2 + TUNGETSNDBUF = 0x800454d3 + TUNGETVNETBE = 0x800454df + TUNGETVNETHDRSZ = 0x800454d7 + TUNGETVNETLE = 0x800454dd + TUNSETDEBUG = 0x400454c9 + TUNSETGROUP = 0x400454ce + TUNSETIFF = 0x400454ca + TUNSETIFINDEX = 0x400454da + TUNSETLINK = 0x400454cd + TUNSETNOCSUM = 0x400454c8 + TUNSETOFFLOAD = 0x400454d0 + TUNSETOWNER = 0x400454cc + TUNSETPERSIST = 0x400454cb + TUNSETQUEUE = 0x400454d9 + TUNSETSNDBUF = 0x400454d4 + TUNSETTXFILTER = 0x400454d1 + TUNSETVNETBE = 0x400454de + TUNSETVNETHDRSZ = 0x400454d8 + TUNSETVNETLE = 0x400454dc + UMOUNT_NOFOLLOW = 0x8 + VDISCARD = 0xd + VEOF = 0x4 + VEOL = 0xb + VEOL2 = 0x10 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x6 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XTABS = 0x1800 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x62) + EADDRNOTAVAIL = syscall.Errno(0x63) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x61) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x72) + EBADE = syscall.Errno(0x34) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x4d) + EBADMSG = syscall.Errno(0x4a) + EBADR = syscall.Errno(0x35) + EBADRQC = syscall.Errno(0x38) + EBADSLT = syscall.Errno(0x39) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7d) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x2c) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x67) + ECONNREFUSED = syscall.Errno(0x6f) + ECONNRESET = syscall.Errno(0x68) + EDEADLK = syscall.Errno(0x23) + EDEADLOCK = syscall.Errno(0x23) + EDESTADDRREQ = syscall.Errno(0x59) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x7a) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x70) + EHOSTUNREACH = syscall.Errno(0x71) + EHWPOISON = syscall.Errno(0x85) + EIDRM = syscall.Errno(0x2b) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x73) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x6a) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x7f) + EKEYREJECTED = syscall.Errno(0x81) + EKEYREVOKED = syscall.Errno(0x80) + EL2HLT = syscall.Errno(0x33) + EL2NSYNC = syscall.Errno(0x2d) + EL3HLT = syscall.Errno(0x2e) + EL3RST = syscall.Errno(0x2f) + ELIBACC = syscall.Errno(0x4f) + ELIBBAD = syscall.Errno(0x50) + ELIBEXEC = syscall.Errno(0x53) + ELIBMAX = syscall.Errno(0x52) + ELIBSCN = syscall.Errno(0x51) + ELNRNG = syscall.Errno(0x30) + ELOOP = syscall.Errno(0x28) + EMEDIUMTYPE = syscall.Errno(0x7c) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x5a) + EMULTIHOP = syscall.Errno(0x48) + ENAMETOOLONG = syscall.Errno(0x24) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x64) + ENETRESET = syscall.Errno(0x66) + ENETUNREACH = syscall.Errno(0x65) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x37) + ENOBUFS = syscall.Errno(0x69) + ENOCSI = syscall.Errno(0x32) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x7e) + ENOLCK = syscall.Errno(0x25) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x7b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x2a) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x5c) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x26) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x6b) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x27) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x83) + ENOTSOCK = syscall.Errno(0x58) + ENOTSUP = syscall.Errno(0x5f) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x4c) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x5f) + EOVERFLOW = syscall.Errno(0x4b) + EOWNERDEAD = syscall.Errno(0x82) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x60) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x5d) + EPROTOTYPE = syscall.Errno(0x5b) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x4e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x55) + ERFKILL = syscall.Errno(0x84) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x6c) + ESOCKTNOSUPPORT = syscall.Errno(0x5e) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x74) + ESTRPIPE = syscall.Errno(0x56) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x6e) + ETOOMANYREFS = syscall.Errno(0x6d) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x31) + EUSERS = syscall.Errno(0x57) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x36) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0x7) + SIGCHLD = syscall.Signal(0x11) + SIGCLD = syscall.Signal(0x11) + SIGCONT = syscall.Signal(0x12) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x1d) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x1d) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1e) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTKFLT = syscall.Signal(0x10) + SIGSTOP = syscall.Signal(0x13) + SIGSYS = syscall.Signal(0x1f) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x14) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x17) + SIGUSR1 = syscall.Signal(0xa) + SIGUSR2 = syscall.Signal(0xc) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "no such device or address", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource temporarily unavailable", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device or resource busy", + 17: "file exists", + 18: "invalid cross-device link", + 19: "no such device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "numerical result out of range", + 35: "resource deadlock avoided", + 36: "file name too long", + 37: "no locks available", + 38: "function not implemented", + 39: "directory not empty", + 40: "too many levels of symbolic links", + 42: "no message of desired type", + 43: "identifier removed", + 44: "channel number out of range", + 45: "level 2 not synchronized", + 46: "level 3 halted", + 47: "level 3 reset", + 48: "link number out of range", + 49: "protocol driver not attached", + 50: "no CSI structure available", + 51: "level 2 halted", + 52: "invalid exchange", + 53: "invalid request descriptor", + 54: "exchange full", + 55: "no anode", + 56: "invalid request code", + 57: "invalid slot", + 59: "bad font file format", + 60: "device not a stream", + 61: "no data available", + 62: "timer expired", + 63: "out of streams resources", + 64: "machine is not on the network", + 65: "package not installed", + 66: "object is remote", + 67: "link has been severed", + 68: "advertise error", + 69: "srmount error", + 70: "communication error on send", + 71: "protocol error", + 72: "multihop attempted", + 73: "RFS specific error", + 74: "bad message", + 75: "value too large for defined data type", + 76: "name not unique on network", + 77: "file descriptor in bad state", + 78: "remote address changed", + 79: "can not access a needed shared library", + 80: "accessing a corrupted shared library", + 81: ".lib section in a.out corrupted", + 82: "attempting to link in too many shared libraries", + 83: "cannot exec a shared library directly", + 84: "invalid or incomplete multibyte or wide character", + 85: "interrupted system call should be restarted", + 86: "streams pipe error", + 87: "too many users", + 88: "socket operation on non-socket", + 89: "destination address required", + 90: "message too long", + 91: "protocol wrong type for socket", + 92: "protocol not available", + 93: "protocol not supported", + 94: "socket type not supported", + 95: "operation not supported", + 96: "protocol family not supported", + 97: "address family not supported by protocol", + 98: "address already in use", + 99: "cannot assign requested address", + 100: "network is down", + 101: "network is unreachable", + 102: "network dropped connection on reset", + 103: "software caused connection abort", + 104: "connection reset by peer", + 105: "no buffer space available", + 106: "transport endpoint is already connected", + 107: "transport endpoint is not connected", + 108: "cannot send after transport endpoint shutdown", + 109: "too many references: cannot splice", + 110: "connection timed out", + 111: "connection refused", + 112: "host is down", + 113: "no route to host", + 114: "operation already in progress", + 115: "operation now in progress", + 116: "stale file handle", + 117: "structure needs cleaning", + 118: "not a XENIX named type file", + 119: "no XENIX semaphores available", + 120: "is a named type file", + 121: "remote I/O error", + 122: "disk quota exceeded", + 123: "no medium found", + 124: "wrong medium type", + 125: "operation canceled", + 126: "required key not available", + 127: "key has expired", + 128: "key has been revoked", + 129: "key was rejected by service", + 130: "owner died", + 131: "state not recoverable", + 132: "operation not possible due to RF-kill", + 133: "memory page has hardware error", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/breakpoint trap", + 6: "aborted", + 7: "bus error", + 8: "floating point exception", + 9: "killed", + 10: "user defined signal 1", + 11: "segmentation fault", + 12: "user defined signal 2", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "stack fault", + 17: "child exited", + 18: "continued", + 19: "stopped (signal)", + 20: "stopped", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "urgent I/O condition", + 24: "CPU time limit exceeded", + 25: "file size limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window changed", + 29: "I/O possible", + 30: "power failure", + 31: "bad system call", +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go new file mode 100644 index 0000000..3e8c2c7 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go @@ -0,0 +1,2236 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go + +package unix + +import "syscall" + +const ( + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BLKBSZGET = 0x80041270 + BLKBSZSET = 0x40041271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80041272 + BLKPBSZGET = 0x127b + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x1000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0xc + F_GETLK64 = 0xc + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0xd + F_SETLK64 = 0xd + F_SETLKW = 0xe + F_SETLKW64 = 0xe + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x2000 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x4000 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x10000 + O_DIRECTORY = 0x4000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x20000 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x8000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x404000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x2401 + PERF_EVENT_IOC_ENABLE = 0x2400 + PERF_EVENT_IOC_ID = 0x80042407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 + PERF_EVENT_IOC_PERIOD = 0x40082404 + PERF_EVENT_IOC_REFRESH = 0x2402 + PERF_EVENT_IOC_RESET = 0x2403 + PERF_EVENT_IOC_SET_BPF = 0x40042408 + PERF_EVENT_IOC_SET_FILTER = 0x40042406 + PERF_EVENT_IOC_SET_OUTPUT = 0x2405 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETCRUNCHREGS = 0x19 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETHBPREGS = 0x1d + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GETVFPREGS = 0x1b + PTRACE_GETWMMXREGS = 0x12 + PTRACE_GET_THREAD_AREA = 0x16 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SEIZE = 0x4206 + PTRACE_SETCRUNCHREGS = 0x1a + PTRACE_SETFPREGS = 0xf + PTRACE_SETHBPREGS = 0x1e + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SETVFPREGS = 0x1c + PTRACE_SETWMMXREGS = 0x13 + PTRACE_SET_SYSCALL = 0x17 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + PT_DATA_ADDR = 0x10004 + PT_TEXT_ADDR = 0x10000 + PT_TEXT_END_ADDR = 0x10008 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = -0x1 + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x10 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x541b + SIOCOUTQ = 0x5411 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x10 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x11 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x12 + SO_RCVTIMEO = 0x14 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x13 + SO_SNDTIMEO = 0x15 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x540b + TCGETA = 0x5405 + TCGETS = 0x5401 + TCGETS2 = 0x802c542a + TCGETX = 0x5432 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSBRKP = 0x5425 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETS2 = 0x402c542b + TCSETSF = 0x5404 + TCSETSF2 = 0x402c542d + TCSETSW = 0x5403 + TCSETSW2 = 0x402c542c + TCSETX = 0x5433 + TCSETXF = 0x5434 + TCSETXW = 0x5435 + TCXONC = 0x540a + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x80045432 + TIOCGETD = 0x5424 + TIOCGEXCL = 0x80045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x540f + TIOCGPKT = 0x80045438 + TIOCGPTLCK = 0x80045439 + TIOCGPTN = 0x80045430 + TIOCGPTPEER = 0x5441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x5413 + TIOCINQ = 0x541b + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x5411 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x5423 + TIOCSIG = 0x40045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x5410 + TIOCSPTLCK = 0x40045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTI = 0x5412 + TIOCSWINSZ = 0x5414 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x100 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x400854d5 + TUNDETACHFILTER = 0x400854d6 + TUNGETFEATURES = 0x800454cf + TUNGETFILTER = 0x800854db + TUNGETIFF = 0x800454d2 + TUNGETSNDBUF = 0x800454d3 + TUNGETVNETBE = 0x800454df + TUNGETVNETHDRSZ = 0x800454d7 + TUNGETVNETLE = 0x800454dd + TUNSETDEBUG = 0x400454c9 + TUNSETGROUP = 0x400454ce + TUNSETIFF = 0x400454ca + TUNSETIFINDEX = 0x400454da + TUNSETLINK = 0x400454cd + TUNSETNOCSUM = 0x400454c8 + TUNSETOFFLOAD = 0x400454d0 + TUNSETOWNER = 0x400454cc + TUNSETPERSIST = 0x400454cb + TUNSETQUEUE = 0x400454d9 + TUNSETSNDBUF = 0x400454d4 + TUNSETTXFILTER = 0x400454d1 + TUNSETVNETBE = 0x400454de + TUNSETVNETHDRSZ = 0x400454d8 + TUNSETVNETLE = 0x400454dc + UMOUNT_NOFOLLOW = 0x8 + VDISCARD = 0xd + VEOF = 0x4 + VEOL = 0xb + VEOL2 = 0x10 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x6 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x20 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XTABS = 0x1800 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x62) + EADDRNOTAVAIL = syscall.Errno(0x63) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x61) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x72) + EBADE = syscall.Errno(0x34) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x4d) + EBADMSG = syscall.Errno(0x4a) + EBADR = syscall.Errno(0x35) + EBADRQC = syscall.Errno(0x38) + EBADSLT = syscall.Errno(0x39) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7d) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x2c) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x67) + ECONNREFUSED = syscall.Errno(0x6f) + ECONNRESET = syscall.Errno(0x68) + EDEADLK = syscall.Errno(0x23) + EDEADLOCK = syscall.Errno(0x23) + EDESTADDRREQ = syscall.Errno(0x59) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x7a) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x70) + EHOSTUNREACH = syscall.Errno(0x71) + EHWPOISON = syscall.Errno(0x85) + EIDRM = syscall.Errno(0x2b) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x73) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x6a) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x7f) + EKEYREJECTED = syscall.Errno(0x81) + EKEYREVOKED = syscall.Errno(0x80) + EL2HLT = syscall.Errno(0x33) + EL2NSYNC = syscall.Errno(0x2d) + EL3HLT = syscall.Errno(0x2e) + EL3RST = syscall.Errno(0x2f) + ELIBACC = syscall.Errno(0x4f) + ELIBBAD = syscall.Errno(0x50) + ELIBEXEC = syscall.Errno(0x53) + ELIBMAX = syscall.Errno(0x52) + ELIBSCN = syscall.Errno(0x51) + ELNRNG = syscall.Errno(0x30) + ELOOP = syscall.Errno(0x28) + EMEDIUMTYPE = syscall.Errno(0x7c) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x5a) + EMULTIHOP = syscall.Errno(0x48) + ENAMETOOLONG = syscall.Errno(0x24) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x64) + ENETRESET = syscall.Errno(0x66) + ENETUNREACH = syscall.Errno(0x65) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x37) + ENOBUFS = syscall.Errno(0x69) + ENOCSI = syscall.Errno(0x32) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x7e) + ENOLCK = syscall.Errno(0x25) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x7b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x2a) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x5c) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x26) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x6b) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x27) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x83) + ENOTSOCK = syscall.Errno(0x58) + ENOTSUP = syscall.Errno(0x5f) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x4c) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x5f) + EOVERFLOW = syscall.Errno(0x4b) + EOWNERDEAD = syscall.Errno(0x82) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x60) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x5d) + EPROTOTYPE = syscall.Errno(0x5b) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x4e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x55) + ERFKILL = syscall.Errno(0x84) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x6c) + ESOCKTNOSUPPORT = syscall.Errno(0x5e) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x74) + ESTRPIPE = syscall.Errno(0x56) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x6e) + ETOOMANYREFS = syscall.Errno(0x6d) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x31) + EUSERS = syscall.Errno(0x57) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x36) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0x7) + SIGCHLD = syscall.Signal(0x11) + SIGCLD = syscall.Signal(0x11) + SIGCONT = syscall.Signal(0x12) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x1d) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x1d) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1e) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTKFLT = syscall.Signal(0x10) + SIGSTOP = syscall.Signal(0x13) + SIGSYS = syscall.Signal(0x1f) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x14) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x17) + SIGUSR1 = syscall.Signal(0xa) + SIGUSR2 = syscall.Signal(0xc) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "no such device or address", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource temporarily unavailable", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device or resource busy", + 17: "file exists", + 18: "invalid cross-device link", + 19: "no such device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "numerical result out of range", + 35: "resource deadlock avoided", + 36: "file name too long", + 37: "no locks available", + 38: "function not implemented", + 39: "directory not empty", + 40: "too many levels of symbolic links", + 42: "no message of desired type", + 43: "identifier removed", + 44: "channel number out of range", + 45: "level 2 not synchronized", + 46: "level 3 halted", + 47: "level 3 reset", + 48: "link number out of range", + 49: "protocol driver not attached", + 50: "no CSI structure available", + 51: "level 2 halted", + 52: "invalid exchange", + 53: "invalid request descriptor", + 54: "exchange full", + 55: "no anode", + 56: "invalid request code", + 57: "invalid slot", + 59: "bad font file format", + 60: "device not a stream", + 61: "no data available", + 62: "timer expired", + 63: "out of streams resources", + 64: "machine is not on the network", + 65: "package not installed", + 66: "object is remote", + 67: "link has been severed", + 68: "advertise error", + 69: "srmount error", + 70: "communication error on send", + 71: "protocol error", + 72: "multihop attempted", + 73: "RFS specific error", + 74: "bad message", + 75: "value too large for defined data type", + 76: "name not unique on network", + 77: "file descriptor in bad state", + 78: "remote address changed", + 79: "can not access a needed shared library", + 80: "accessing a corrupted shared library", + 81: ".lib section in a.out corrupted", + 82: "attempting to link in too many shared libraries", + 83: "cannot exec a shared library directly", + 84: "invalid or incomplete multibyte or wide character", + 85: "interrupted system call should be restarted", + 86: "streams pipe error", + 87: "too many users", + 88: "socket operation on non-socket", + 89: "destination address required", + 90: "message too long", + 91: "protocol wrong type for socket", + 92: "protocol not available", + 93: "protocol not supported", + 94: "socket type not supported", + 95: "operation not supported", + 96: "protocol family not supported", + 97: "address family not supported by protocol", + 98: "address already in use", + 99: "cannot assign requested address", + 100: "network is down", + 101: "network is unreachable", + 102: "network dropped connection on reset", + 103: "software caused connection abort", + 104: "connection reset by peer", + 105: "no buffer space available", + 106: "transport endpoint is already connected", + 107: "transport endpoint is not connected", + 108: "cannot send after transport endpoint shutdown", + 109: "too many references: cannot splice", + 110: "connection timed out", + 111: "connection refused", + 112: "host is down", + 113: "no route to host", + 114: "operation already in progress", + 115: "operation now in progress", + 116: "stale file handle", + 117: "structure needs cleaning", + 118: "not a XENIX named type file", + 119: "no XENIX semaphores available", + 120: "is a named type file", + 121: "remote I/O error", + 122: "disk quota exceeded", + 123: "no medium found", + 124: "wrong medium type", + 125: "operation canceled", + 126: "required key not available", + 127: "key has expired", + 128: "key has been revoked", + 129: "key was rejected by service", + 130: "owner died", + 131: "state not recoverable", + 132: "operation not possible due to RF-kill", + 133: "memory page has hardware error", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/breakpoint trap", + 6: "aborted", + 7: "bus error", + 8: "floating point exception", + 9: "killed", + 10: "user defined signal 1", + 11: "segmentation fault", + 12: "user defined signal 2", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "stack fault", + 17: "child exited", + 18: "continued", + 19: "stopped (signal)", + 20: "stopped", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "urgent I/O condition", + 24: "CPU time limit exceeded", + 25: "file size limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window changed", + 29: "I/O possible", + 30: "power failure", + 31: "bad system call", +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go new file mode 100644 index 0000000..3834533 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go @@ -0,0 +1,2222 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include -fsigned-char +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm64,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char _const.go + +package unix + +import "syscall" + +const ( + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BLKBSZGET = 0x80081270 + BLKBSZSET = 0x40081271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80081272 + BLKPBSZGET = 0x127b + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ESR_MAGIC = 0x45535201 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + EXTRA_MAGIC = 0x45585401 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x1000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x5 + F_GETLK64 = 0x5 + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x2000 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x4000 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x10000 + O_DIRECTORY = 0x4000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x8000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x404000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x2401 + PERF_EVENT_IOC_ENABLE = 0x2400 + PERF_EVENT_IOC_ID = 0x80082407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 + PERF_EVENT_IOC_PERIOD = 0x40082404 + PERF_EVENT_IOC_REFRESH = 0x2402 + PERF_EVENT_IOC_RESET = 0x2403 + PERF_EVENT_IOC_SET_BPF = 0x40042408 + PERF_EVENT_IOC_SET_FILTER = 0x40082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x2405 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = -0x1 + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SEIZE = 0x4206 + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = -0x1 + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x10 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x541b + SIOCOUTQ = 0x5411 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x10 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x11 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x12 + SO_RCVTIMEO = 0x14 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x13 + SO_SNDTIMEO = 0x15 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x540b + TCGETA = 0x5405 + TCGETS = 0x5401 + TCGETS2 = 0x802c542a + TCGETX = 0x5432 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSBRKP = 0x5425 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETS2 = 0x402c542b + TCSETSF = 0x5404 + TCSETSF2 = 0x402c542d + TCSETSW = 0x5403 + TCSETSW2 = 0x402c542c + TCSETX = 0x5433 + TCSETXF = 0x5434 + TCSETXW = 0x5435 + TCXONC = 0x540a + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x80045432 + TIOCGETD = 0x5424 + TIOCGEXCL = 0x80045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x540f + TIOCGPKT = 0x80045438 + TIOCGPTLCK = 0x80045439 + TIOCGPTN = 0x80045430 + TIOCGPTPEER = 0x5441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x5413 + TIOCINQ = 0x541b + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x5411 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x5423 + TIOCSIG = 0x40045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x5410 + TIOCSPTLCK = 0x40045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTI = 0x5412 + TIOCSWINSZ = 0x5414 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x100 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x401054d5 + TUNDETACHFILTER = 0x401054d6 + TUNGETFEATURES = 0x800454cf + TUNGETFILTER = 0x801054db + TUNGETIFF = 0x800454d2 + TUNGETSNDBUF = 0x800454d3 + TUNGETVNETBE = 0x800454df + TUNGETVNETHDRSZ = 0x800454d7 + TUNGETVNETLE = 0x800454dd + TUNSETDEBUG = 0x400454c9 + TUNSETGROUP = 0x400454ce + TUNSETIFF = 0x400454ca + TUNSETIFINDEX = 0x400454da + TUNSETLINK = 0x400454cd + TUNSETNOCSUM = 0x400454c8 + TUNSETOFFLOAD = 0x400454d0 + TUNSETOWNER = 0x400454cc + TUNSETPERSIST = 0x400454cb + TUNSETQUEUE = 0x400454d9 + TUNSETSNDBUF = 0x400454d4 + TUNSETTXFILTER = 0x400454d1 + TUNSETVNETBE = 0x400454de + TUNSETVNETHDRSZ = 0x400454d8 + TUNSETVNETLE = 0x400454dc + UMOUNT_NOFOLLOW = 0x8 + VDISCARD = 0xd + VEOF = 0x4 + VEOL = 0xb + VEOL2 = 0x10 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x6 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XTABS = 0x1800 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x62) + EADDRNOTAVAIL = syscall.Errno(0x63) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x61) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x72) + EBADE = syscall.Errno(0x34) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x4d) + EBADMSG = syscall.Errno(0x4a) + EBADR = syscall.Errno(0x35) + EBADRQC = syscall.Errno(0x38) + EBADSLT = syscall.Errno(0x39) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7d) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x2c) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x67) + ECONNREFUSED = syscall.Errno(0x6f) + ECONNRESET = syscall.Errno(0x68) + EDEADLK = syscall.Errno(0x23) + EDEADLOCK = syscall.Errno(0x23) + EDESTADDRREQ = syscall.Errno(0x59) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x7a) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x70) + EHOSTUNREACH = syscall.Errno(0x71) + EHWPOISON = syscall.Errno(0x85) + EIDRM = syscall.Errno(0x2b) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x73) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x6a) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x7f) + EKEYREJECTED = syscall.Errno(0x81) + EKEYREVOKED = syscall.Errno(0x80) + EL2HLT = syscall.Errno(0x33) + EL2NSYNC = syscall.Errno(0x2d) + EL3HLT = syscall.Errno(0x2e) + EL3RST = syscall.Errno(0x2f) + ELIBACC = syscall.Errno(0x4f) + ELIBBAD = syscall.Errno(0x50) + ELIBEXEC = syscall.Errno(0x53) + ELIBMAX = syscall.Errno(0x52) + ELIBSCN = syscall.Errno(0x51) + ELNRNG = syscall.Errno(0x30) + ELOOP = syscall.Errno(0x28) + EMEDIUMTYPE = syscall.Errno(0x7c) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x5a) + EMULTIHOP = syscall.Errno(0x48) + ENAMETOOLONG = syscall.Errno(0x24) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x64) + ENETRESET = syscall.Errno(0x66) + ENETUNREACH = syscall.Errno(0x65) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x37) + ENOBUFS = syscall.Errno(0x69) + ENOCSI = syscall.Errno(0x32) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x7e) + ENOLCK = syscall.Errno(0x25) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x7b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x2a) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x5c) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x26) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x6b) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x27) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x83) + ENOTSOCK = syscall.Errno(0x58) + ENOTSUP = syscall.Errno(0x5f) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x4c) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x5f) + EOVERFLOW = syscall.Errno(0x4b) + EOWNERDEAD = syscall.Errno(0x82) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x60) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x5d) + EPROTOTYPE = syscall.Errno(0x5b) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x4e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x55) + ERFKILL = syscall.Errno(0x84) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x6c) + ESOCKTNOSUPPORT = syscall.Errno(0x5e) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x74) + ESTRPIPE = syscall.Errno(0x56) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x6e) + ETOOMANYREFS = syscall.Errno(0x6d) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x31) + EUSERS = syscall.Errno(0x57) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x36) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0x7) + SIGCHLD = syscall.Signal(0x11) + SIGCLD = syscall.Signal(0x11) + SIGCONT = syscall.Signal(0x12) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x1d) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x1d) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1e) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTKFLT = syscall.Signal(0x10) + SIGSTOP = syscall.Signal(0x13) + SIGSYS = syscall.Signal(0x1f) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x14) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x17) + SIGUSR1 = syscall.Signal(0xa) + SIGUSR2 = syscall.Signal(0xc) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "no such device or address", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource temporarily unavailable", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device or resource busy", + 17: "file exists", + 18: "invalid cross-device link", + 19: "no such device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "numerical result out of range", + 35: "resource deadlock avoided", + 36: "file name too long", + 37: "no locks available", + 38: "function not implemented", + 39: "directory not empty", + 40: "too many levels of symbolic links", + 42: "no message of desired type", + 43: "identifier removed", + 44: "channel number out of range", + 45: "level 2 not synchronized", + 46: "level 3 halted", + 47: "level 3 reset", + 48: "link number out of range", + 49: "protocol driver not attached", + 50: "no CSI structure available", + 51: "level 2 halted", + 52: "invalid exchange", + 53: "invalid request descriptor", + 54: "exchange full", + 55: "no anode", + 56: "invalid request code", + 57: "invalid slot", + 59: "bad font file format", + 60: "device not a stream", + 61: "no data available", + 62: "timer expired", + 63: "out of streams resources", + 64: "machine is not on the network", + 65: "package not installed", + 66: "object is remote", + 67: "link has been severed", + 68: "advertise error", + 69: "srmount error", + 70: "communication error on send", + 71: "protocol error", + 72: "multihop attempted", + 73: "RFS specific error", + 74: "bad message", + 75: "value too large for defined data type", + 76: "name not unique on network", + 77: "file descriptor in bad state", + 78: "remote address changed", + 79: "can not access a needed shared library", + 80: "accessing a corrupted shared library", + 81: ".lib section in a.out corrupted", + 82: "attempting to link in too many shared libraries", + 83: "cannot exec a shared library directly", + 84: "invalid or incomplete multibyte or wide character", + 85: "interrupted system call should be restarted", + 86: "streams pipe error", + 87: "too many users", + 88: "socket operation on non-socket", + 89: "destination address required", + 90: "message too long", + 91: "protocol wrong type for socket", + 92: "protocol not available", + 93: "protocol not supported", + 94: "socket type not supported", + 95: "operation not supported", + 96: "protocol family not supported", + 97: "address family not supported by protocol", + 98: "address already in use", + 99: "cannot assign requested address", + 100: "network is down", + 101: "network is unreachable", + 102: "network dropped connection on reset", + 103: "software caused connection abort", + 104: "connection reset by peer", + 105: "no buffer space available", + 106: "transport endpoint is already connected", + 107: "transport endpoint is not connected", + 108: "cannot send after transport endpoint shutdown", + 109: "too many references: cannot splice", + 110: "connection timed out", + 111: "connection refused", + 112: "host is down", + 113: "no route to host", + 114: "operation already in progress", + 115: "operation now in progress", + 116: "stale file handle", + 117: "structure needs cleaning", + 118: "not a XENIX named type file", + 119: "no XENIX semaphores available", + 120: "is a named type file", + 121: "remote I/O error", + 122: "disk quota exceeded", + 123: "no medium found", + 124: "wrong medium type", + 125: "operation canceled", + 126: "required key not available", + 127: "key has expired", + 128: "key has been revoked", + 129: "key was rejected by service", + 130: "owner died", + 131: "state not recoverable", + 132: "operation not possible due to RF-kill", + 133: "memory page has hardware error", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/breakpoint trap", + 6: "aborted", + 7: "bus error", + 8: "floating point exception", + 9: "killed", + 10: "user defined signal 1", + 11: "segmentation fault", + 12: "user defined signal 2", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "stack fault", + 17: "child exited", + 18: "continued", + 19: "stopped (signal)", + 20: "stopped", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "urgent I/O condition", + 24: "CPU time limit exceeded", + 25: "file size limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window changed", + 29: "I/O possible", + 30: "power failure", + 31: "bad system call", +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go new file mode 100644 index 0000000..bde8f7d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go @@ -0,0 +1,2241 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mips,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go + +package unix + +import "syscall" + +const ( + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BLKBSZGET = 0x40041270 + BLKBSZSET = 0x80041271 + BLKFLSBUF = 0x20001261 + BLKFRAGET = 0x20001265 + BLKFRASET = 0x20001264 + BLKGETSIZE = 0x20001260 + BLKGETSIZE64 = 0x40041272 + BLKPBSZGET = 0x2000127b + BLKRAGET = 0x20001263 + BLKRASET = 0x20001262 + BLKROGET = 0x2000125e + BLKROSET = 0x2000125d + BLKRRPART = 0x2000125f + BLKSECTGET = 0x20001267 + BLKSECTSET = 0x20001266 + BLKSSZGET = 0x20001268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x80 + EFD_SEMAPHORE = 0x1 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x2000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x21 + F_GETLK64 = 0x21 + F_GETOWN = 0x17 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x22 + F_SETLK64 = 0x22 + F_SETLKW = 0x23 + F_SETLKW64 = 0x23 + F_SETOWN = 0x18 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x100 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x80 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MAP_ANON = 0x800 + MAP_ANONYMOUS = 0x800 + MAP_DENYWRITE = 0x2000 + MAP_EXECUTABLE = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x1000 + MAP_HUGETLB = 0x80000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x8000 + MAP_NONBLOCK = 0x20000 + MAP_NORESERVE = 0x400 + MAP_POPULATE = 0x10000 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x800 + MAP_SHARED = 0x1 + MAP_STACK = 0x40000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x1000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x100 + O_DIRECT = 0x8000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x10 + O_EXCL = 0x400 + O_FSYNC = 0x4010 + O_LARGEFILE = 0x2000 + O_NDELAY = 0x80 + O_NOATIME = 0x40000 + O_NOCTTY = 0x800 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x80 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x4010 + O_SYNC = 0x4010 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x20002401 + PERF_EVENT_IOC_ENABLE = 0x20002400 + PERF_EVENT_IOC_ID = 0x40042407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 + PERF_EVENT_IOC_PERIOD = 0x80082404 + PERF_EVENT_IOC_REFRESH = 0x20002402 + PERF_EVENT_IOC_RESET = 0x20002403 + PERF_EVENT_IOC_SET_BPF = 0x80042408 + PERF_EVENT_IOC_SET_FILTER = 0x80042406 + PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_GET_THREAD_AREA_3264 = 0xc4 + PTRACE_GET_WATCH_REGS = 0xd0 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKDATA_3264 = 0xc1 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKTEXT_3264 = 0xc0 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKEDATA_3264 = 0xc3 + PTRACE_POKETEXT = 0x4 + PTRACE_POKETEXT_3264 = 0xc2 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SET_WATCH_REGS = 0xd1 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + RLIMIT_AS = 0x6 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x9 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x5 + RLIMIT_NPROC = 0x8 + RLIMIT_RSS = 0x7 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = -0x1 + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x10 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x40047307 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x40047309 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x467f + SIOCOUTQ = 0x7472 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x80047308 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x1 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x80 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x2 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0xffff + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1009 + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x20 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x1029 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0x100 + SO_PASSCRED = 0x11 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x12 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1e + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x1028 + SO_RCVBUF = 0x1002 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x1001 + SO_SNDBUFFORCE = 0x1f + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_STYLE = 0x1008 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x1008 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x5407 + TCGETA = 0x5401 + TCGETS = 0x540d + TCGETS2 = 0x4030542a + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x5410 + TCSBRK = 0x5405 + TCSBRKP = 0x5486 + TCSETA = 0x5402 + TCSETAF = 0x5404 + TCSETAW = 0x5403 + TCSETS = 0x540e + TCSETS2 = 0x8030542b + TCSETSF = 0x5410 + TCSETSF2 = 0x8030542d + TCSETSW = 0x540f + TCSETSW2 = 0x8030542c + TCXONC = 0x5406 + TIOCCBRK = 0x5428 + TIOCCONS = 0x80047478 + TIOCEXCL = 0x740d + TIOCGDEV = 0x40045432 + TIOCGETD = 0x7400 + TIOCGETP = 0x7408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x5492 + TIOCGLCKTRMIOS = 0x548b + TIOCGLTC = 0x7474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGPTPEER = 0x20005441 + TIOCGRS485 = 0x4020542e + TIOCGSERIAL = 0x5484 + TIOCGSID = 0x7416 + TIOCGSOFTCAR = 0x5481 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x467f + TIOCLINUX = 0x5483 + TIOCMBIC = 0x741c + TIOCMBIS = 0x741b + TIOCMGET = 0x741d + TIOCMIWAIT = 0x5491 + TIOCMSET = 0x741a + TIOCM_CAR = 0x100 + TIOCM_CD = 0x100 + TIOCM_CTS = 0x40 + TIOCM_DSR = 0x400 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x200 + TIOCM_RNG = 0x200 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x20 + TIOCM_ST = 0x10 + TIOCNOTTY = 0x5471 + TIOCNXCL = 0x740e + TIOCOUTQ = 0x7472 + TIOCPKT = 0x5470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x5480 + TIOCSERCONFIG = 0x5488 + TIOCSERGETLSR = 0x548e + TIOCSERGETMULTI = 0x548f + TIOCSERGSTRUCT = 0x548d + TIOCSERGWILD = 0x5489 + TIOCSERSETMULTI = 0x5490 + TIOCSERSWILD = 0x548a + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x7401 + TIOCSETN = 0x740a + TIOCSETP = 0x7409 + TIOCSIG = 0x80045436 + TIOCSLCKTRMIOS = 0x548c + TIOCSLTC = 0x7475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0xc020542f + TIOCSSERIAL = 0x5485 + TIOCSSOFTCAR = 0x5482 + TIOCSTI = 0x5472 + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x8000 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x800854d5 + TUNDETACHFILTER = 0x800854d6 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x400854db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETDEBUG = 0x800454c9 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + UMOUNT_NOFOLLOW = 0x8 + VDISCARD = 0xd + VEOF = 0x10 + VEOL = 0x11 + VEOL2 = 0x6 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x4 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VSWTCH = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x20 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XTABS = 0x1800 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x7d) + EADDRNOTAVAIL = syscall.Errno(0x7e) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x7c) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x95) + EBADE = syscall.Errno(0x32) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x51) + EBADMSG = syscall.Errno(0x4d) + EBADR = syscall.Errno(0x33) + EBADRQC = syscall.Errno(0x36) + EBADSLT = syscall.Errno(0x37) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x9e) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x25) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x82) + ECONNREFUSED = syscall.Errno(0x92) + ECONNRESET = syscall.Errno(0x83) + EDEADLK = syscall.Errno(0x2d) + EDEADLOCK = syscall.Errno(0x38) + EDESTADDRREQ = syscall.Errno(0x60) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x46d) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x93) + EHOSTUNREACH = syscall.Errno(0x94) + EHWPOISON = syscall.Errno(0xa8) + EIDRM = syscall.Errno(0x24) + EILSEQ = syscall.Errno(0x58) + EINIT = syscall.Errno(0x8d) + EINPROGRESS = syscall.Errno(0x96) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x85) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x8b) + EKEYEXPIRED = syscall.Errno(0xa2) + EKEYREJECTED = syscall.Errno(0xa4) + EKEYREVOKED = syscall.Errno(0xa3) + EL2HLT = syscall.Errno(0x2c) + EL2NSYNC = syscall.Errno(0x26) + EL3HLT = syscall.Errno(0x27) + EL3RST = syscall.Errno(0x28) + ELIBACC = syscall.Errno(0x53) + ELIBBAD = syscall.Errno(0x54) + ELIBEXEC = syscall.Errno(0x57) + ELIBMAX = syscall.Errno(0x56) + ELIBSCN = syscall.Errno(0x55) + ELNRNG = syscall.Errno(0x29) + ELOOP = syscall.Errno(0x5a) + EMEDIUMTYPE = syscall.Errno(0xa0) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x61) + EMULTIHOP = syscall.Errno(0x4a) + ENAMETOOLONG = syscall.Errno(0x4e) + ENAVAIL = syscall.Errno(0x8a) + ENETDOWN = syscall.Errno(0x7f) + ENETRESET = syscall.Errno(0x81) + ENETUNREACH = syscall.Errno(0x80) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x35) + ENOBUFS = syscall.Errno(0x84) + ENOCSI = syscall.Errno(0x2b) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0xa1) + ENOLCK = syscall.Errno(0x2e) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x9f) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x23) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x63) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x59) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x86) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x5d) + ENOTNAM = syscall.Errno(0x89) + ENOTRECOVERABLE = syscall.Errno(0xa6) + ENOTSOCK = syscall.Errno(0x5f) + ENOTSUP = syscall.Errno(0x7a) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x50) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x7a) + EOVERFLOW = syscall.Errno(0x4f) + EOWNERDEAD = syscall.Errno(0xa5) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x7b) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x78) + EPROTOTYPE = syscall.Errno(0x62) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x52) + EREMDEV = syscall.Errno(0x8e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x8c) + ERESTART = syscall.Errno(0x5b) + ERFKILL = syscall.Errno(0xa7) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x8f) + ESOCKTNOSUPPORT = syscall.Errno(0x79) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x97) + ESTRPIPE = syscall.Errno(0x5c) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x91) + ETOOMANYREFS = syscall.Errno(0x90) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x87) + EUNATCH = syscall.Errno(0x2a) + EUSERS = syscall.Errno(0x5e) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x34) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x12) + SIGCLD = syscall.Signal(0x12) + SIGCONT = syscall.Signal(0x19) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x16) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x16) + SIGPROF = syscall.Signal(0x1d) + SIGPWR = syscall.Signal(0x13) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x17) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x18) + SIGTTIN = syscall.Signal(0x1a) + SIGTTOU = syscall.Signal(0x1b) + SIGURG = syscall.Signal(0x15) + SIGUSR1 = syscall.Signal(0x10) + SIGUSR2 = syscall.Signal(0x11) + SIGVTALRM = syscall.Signal(0x1c) + SIGWINCH = syscall.Signal(0x14) + SIGXCPU = syscall.Signal(0x1e) + SIGXFSZ = syscall.Signal(0x1f) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "no such device or address", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource temporarily unavailable", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device or resource busy", + 17: "file exists", + 18: "invalid cross-device link", + 19: "no such device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "numerical result out of range", + 35: "no message of desired type", + 36: "identifier removed", + 37: "channel number out of range", + 38: "level 2 not synchronized", + 39: "level 3 halted", + 40: "level 3 reset", + 41: "link number out of range", + 42: "protocol driver not attached", + 43: "no CSI structure available", + 44: "level 2 halted", + 45: "resource deadlock avoided", + 46: "no locks available", + 50: "invalid exchange", + 51: "invalid request descriptor", + 52: "exchange full", + 53: "no anode", + 54: "invalid request code", + 55: "invalid slot", + 56: "file locking deadlock error", + 59: "bad font file format", + 60: "device not a stream", + 61: "no data available", + 62: "timer expired", + 63: "out of streams resources", + 64: "machine is not on the network", + 65: "package not installed", + 66: "object is remote", + 67: "link has been severed", + 68: "advertise error", + 69: "srmount error", + 70: "communication error on send", + 71: "protocol error", + 73: "RFS specific error", + 74: "multihop attempted", + 77: "bad message", + 78: "file name too long", + 79: "value too large for defined data type", + 80: "name not unique on network", + 81: "file descriptor in bad state", + 82: "remote address changed", + 83: "can not access a needed shared library", + 84: "accessing a corrupted shared library", + 85: ".lib section in a.out corrupted", + 86: "attempting to link in too many shared libraries", + 87: "cannot exec a shared library directly", + 88: "invalid or incomplete multibyte or wide character", + 89: "function not implemented", + 90: "too many levels of symbolic links", + 91: "interrupted system call should be restarted", + 92: "streams pipe error", + 93: "directory not empty", + 94: "too many users", + 95: "socket operation on non-socket", + 96: "destination address required", + 97: "message too long", + 98: "protocol wrong type for socket", + 99: "protocol not available", + 120: "protocol not supported", + 121: "socket type not supported", + 122: "operation not supported", + 123: "protocol family not supported", + 124: "address family not supported by protocol", + 125: "address already in use", + 126: "cannot assign requested address", + 127: "network is down", + 128: "network is unreachable", + 129: "network dropped connection on reset", + 130: "software caused connection abort", + 131: "connection reset by peer", + 132: "no buffer space available", + 133: "transport endpoint is already connected", + 134: "transport endpoint is not connected", + 135: "structure needs cleaning", + 137: "not a XENIX named type file", + 138: "no XENIX semaphores available", + 139: "is a named type file", + 140: "remote I/O error", + 141: "unknown error 141", + 142: "unknown error 142", + 143: "cannot send after transport endpoint shutdown", + 144: "too many references: cannot splice", + 145: "connection timed out", + 146: "connection refused", + 147: "host is down", + 148: "no route to host", + 149: "operation already in progress", + 150: "operation now in progress", + 151: "stale file handle", + 158: "operation canceled", + 159: "no medium found", + 160: "wrong medium type", + 161: "required key not available", + 162: "key has expired", + 163: "key has been revoked", + 164: "key was rejected by service", + 165: "owner died", + 166: "state not recoverable", + 167: "operation not possible due to RF-kill", + 168: "memory page has hardware error", + 1133: "disk quota exceeded", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/breakpoint trap", + 6: "aborted", + 7: "EMT trap", + 8: "floating point exception", + 9: "killed", + 10: "bus error", + 11: "segmentation fault", + 12: "bad system call", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "user defined signal 1", + 17: "user defined signal 2", + 18: "child exited", + 19: "power failure", + 20: "window changed", + 21: "urgent I/O condition", + 22: "I/O possible", + 23: "stopped (signal)", + 24: "stopped", + 25: "continued", + 26: "stopped (tty input)", + 27: "stopped (tty output)", + 28: "virtual timer expired", + 29: "profiling timer expired", + 30: "CPU time limit exceeded", + 31: "file size limit exceeded", +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go new file mode 100644 index 0000000..42b6397 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go @@ -0,0 +1,2241 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mips64,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go + +package unix + +import "syscall" + +const ( + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BLKBSZGET = 0x40081270 + BLKBSZSET = 0x80081271 + BLKFLSBUF = 0x20001261 + BLKFRAGET = 0x20001265 + BLKFRASET = 0x20001264 + BLKGETSIZE = 0x20001260 + BLKGETSIZE64 = 0x40081272 + BLKPBSZGET = 0x2000127b + BLKRAGET = 0x20001263 + BLKRASET = 0x20001262 + BLKROGET = 0x2000125e + BLKROSET = 0x2000125d + BLKRRPART = 0x2000125f + BLKSECTGET = 0x20001267 + BLKSECTSET = 0x20001266 + BLKSSZGET = 0x20001268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x80 + EFD_SEMAPHORE = 0x1 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x2000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0xe + F_GETLK64 = 0xe + F_GETOWN = 0x17 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETOWN = 0x18 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x100 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x80 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MAP_ANON = 0x800 + MAP_ANONYMOUS = 0x800 + MAP_DENYWRITE = 0x2000 + MAP_EXECUTABLE = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x1000 + MAP_HUGETLB = 0x80000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x8000 + MAP_NONBLOCK = 0x20000 + MAP_NORESERVE = 0x400 + MAP_POPULATE = 0x10000 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x800 + MAP_SHARED = 0x1 + MAP_STACK = 0x40000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x1000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x100 + O_DIRECT = 0x8000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x10 + O_EXCL = 0x400 + O_FSYNC = 0x4010 + O_LARGEFILE = 0x0 + O_NDELAY = 0x80 + O_NOATIME = 0x40000 + O_NOCTTY = 0x800 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x80 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x4010 + O_SYNC = 0x4010 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x20002401 + PERF_EVENT_IOC_ENABLE = 0x20002400 + PERF_EVENT_IOC_ID = 0x40082407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 + PERF_EVENT_IOC_PERIOD = 0x80082404 + PERF_EVENT_IOC_REFRESH = 0x20002402 + PERF_EVENT_IOC_RESET = 0x20002403 + PERF_EVENT_IOC_SET_BPF = 0x80042408 + PERF_EVENT_IOC_SET_FILTER = 0x80082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = -0x1 + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_GET_THREAD_AREA_3264 = 0xc4 + PTRACE_GET_WATCH_REGS = 0xd0 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKDATA_3264 = 0xc1 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKTEXT_3264 = 0xc0 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKEDATA_3264 = 0xc3 + PTRACE_POKETEXT = 0x4 + PTRACE_POKETEXT_3264 = 0xc2 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SET_WATCH_REGS = 0xd1 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + RLIMIT_AS = 0x6 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x9 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x5 + RLIMIT_NPROC = 0x8 + RLIMIT_RSS = 0x7 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = -0x1 + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x10 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x40047307 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x40047309 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x467f + SIOCOUTQ = 0x7472 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x80047308 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x1 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x80 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x2 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0xffff + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1009 + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x20 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x1029 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0x100 + SO_PASSCRED = 0x11 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x12 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1e + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x1028 + SO_RCVBUF = 0x1002 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x1001 + SO_SNDBUFFORCE = 0x1f + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_STYLE = 0x1008 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x1008 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x5407 + TCGETA = 0x5401 + TCGETS = 0x540d + TCGETS2 = 0x4030542a + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x5410 + TCSBRK = 0x5405 + TCSBRKP = 0x5486 + TCSETA = 0x5402 + TCSETAF = 0x5404 + TCSETAW = 0x5403 + TCSETS = 0x540e + TCSETS2 = 0x8030542b + TCSETSF = 0x5410 + TCSETSF2 = 0x8030542d + TCSETSW = 0x540f + TCSETSW2 = 0x8030542c + TCXONC = 0x5406 + TIOCCBRK = 0x5428 + TIOCCONS = 0x80047478 + TIOCEXCL = 0x740d + TIOCGDEV = 0x40045432 + TIOCGETD = 0x7400 + TIOCGETP = 0x7408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x5492 + TIOCGLCKTRMIOS = 0x548b + TIOCGLTC = 0x7474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGPTPEER = 0x20005441 + TIOCGRS485 = 0x4020542e + TIOCGSERIAL = 0x5484 + TIOCGSID = 0x7416 + TIOCGSOFTCAR = 0x5481 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x467f + TIOCLINUX = 0x5483 + TIOCMBIC = 0x741c + TIOCMBIS = 0x741b + TIOCMGET = 0x741d + TIOCMIWAIT = 0x5491 + TIOCMSET = 0x741a + TIOCM_CAR = 0x100 + TIOCM_CD = 0x100 + TIOCM_CTS = 0x40 + TIOCM_DSR = 0x400 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x200 + TIOCM_RNG = 0x200 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x20 + TIOCM_ST = 0x10 + TIOCNOTTY = 0x5471 + TIOCNXCL = 0x740e + TIOCOUTQ = 0x7472 + TIOCPKT = 0x5470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x5480 + TIOCSERCONFIG = 0x5488 + TIOCSERGETLSR = 0x548e + TIOCSERGETMULTI = 0x548f + TIOCSERGSTRUCT = 0x548d + TIOCSERGWILD = 0x5489 + TIOCSERSETMULTI = 0x5490 + TIOCSERSWILD = 0x548a + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x7401 + TIOCSETN = 0x740a + TIOCSETP = 0x7409 + TIOCSIG = 0x80045436 + TIOCSLCKTRMIOS = 0x548c + TIOCSLTC = 0x7475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0xc020542f + TIOCSSERIAL = 0x5485 + TIOCSSOFTCAR = 0x5482 + TIOCSTI = 0x5472 + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x8000 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x801054d5 + TUNDETACHFILTER = 0x801054d6 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x401054db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETDEBUG = 0x800454c9 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + UMOUNT_NOFOLLOW = 0x8 + VDISCARD = 0xd + VEOF = 0x10 + VEOL = 0x11 + VEOL2 = 0x6 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x4 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VSWTCH = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XTABS = 0x1800 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x7d) + EADDRNOTAVAIL = syscall.Errno(0x7e) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x7c) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x95) + EBADE = syscall.Errno(0x32) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x51) + EBADMSG = syscall.Errno(0x4d) + EBADR = syscall.Errno(0x33) + EBADRQC = syscall.Errno(0x36) + EBADSLT = syscall.Errno(0x37) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x9e) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x25) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x82) + ECONNREFUSED = syscall.Errno(0x92) + ECONNRESET = syscall.Errno(0x83) + EDEADLK = syscall.Errno(0x2d) + EDEADLOCK = syscall.Errno(0x38) + EDESTADDRREQ = syscall.Errno(0x60) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x46d) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x93) + EHOSTUNREACH = syscall.Errno(0x94) + EHWPOISON = syscall.Errno(0xa8) + EIDRM = syscall.Errno(0x24) + EILSEQ = syscall.Errno(0x58) + EINIT = syscall.Errno(0x8d) + EINPROGRESS = syscall.Errno(0x96) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x85) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x8b) + EKEYEXPIRED = syscall.Errno(0xa2) + EKEYREJECTED = syscall.Errno(0xa4) + EKEYREVOKED = syscall.Errno(0xa3) + EL2HLT = syscall.Errno(0x2c) + EL2NSYNC = syscall.Errno(0x26) + EL3HLT = syscall.Errno(0x27) + EL3RST = syscall.Errno(0x28) + ELIBACC = syscall.Errno(0x53) + ELIBBAD = syscall.Errno(0x54) + ELIBEXEC = syscall.Errno(0x57) + ELIBMAX = syscall.Errno(0x56) + ELIBSCN = syscall.Errno(0x55) + ELNRNG = syscall.Errno(0x29) + ELOOP = syscall.Errno(0x5a) + EMEDIUMTYPE = syscall.Errno(0xa0) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x61) + EMULTIHOP = syscall.Errno(0x4a) + ENAMETOOLONG = syscall.Errno(0x4e) + ENAVAIL = syscall.Errno(0x8a) + ENETDOWN = syscall.Errno(0x7f) + ENETRESET = syscall.Errno(0x81) + ENETUNREACH = syscall.Errno(0x80) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x35) + ENOBUFS = syscall.Errno(0x84) + ENOCSI = syscall.Errno(0x2b) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0xa1) + ENOLCK = syscall.Errno(0x2e) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x9f) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x23) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x63) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x59) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x86) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x5d) + ENOTNAM = syscall.Errno(0x89) + ENOTRECOVERABLE = syscall.Errno(0xa6) + ENOTSOCK = syscall.Errno(0x5f) + ENOTSUP = syscall.Errno(0x7a) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x50) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x7a) + EOVERFLOW = syscall.Errno(0x4f) + EOWNERDEAD = syscall.Errno(0xa5) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x7b) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x78) + EPROTOTYPE = syscall.Errno(0x62) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x52) + EREMDEV = syscall.Errno(0x8e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x8c) + ERESTART = syscall.Errno(0x5b) + ERFKILL = syscall.Errno(0xa7) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x8f) + ESOCKTNOSUPPORT = syscall.Errno(0x79) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x97) + ESTRPIPE = syscall.Errno(0x5c) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x91) + ETOOMANYREFS = syscall.Errno(0x90) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x87) + EUNATCH = syscall.Errno(0x2a) + EUSERS = syscall.Errno(0x5e) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x34) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x12) + SIGCLD = syscall.Signal(0x12) + SIGCONT = syscall.Signal(0x19) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x16) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x16) + SIGPROF = syscall.Signal(0x1d) + SIGPWR = syscall.Signal(0x13) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x17) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x18) + SIGTTIN = syscall.Signal(0x1a) + SIGTTOU = syscall.Signal(0x1b) + SIGURG = syscall.Signal(0x15) + SIGUSR1 = syscall.Signal(0x10) + SIGUSR2 = syscall.Signal(0x11) + SIGVTALRM = syscall.Signal(0x1c) + SIGWINCH = syscall.Signal(0x14) + SIGXCPU = syscall.Signal(0x1e) + SIGXFSZ = syscall.Signal(0x1f) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "no such device or address", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource temporarily unavailable", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device or resource busy", + 17: "file exists", + 18: "invalid cross-device link", + 19: "no such device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "numerical result out of range", + 35: "no message of desired type", + 36: "identifier removed", + 37: "channel number out of range", + 38: "level 2 not synchronized", + 39: "level 3 halted", + 40: "level 3 reset", + 41: "link number out of range", + 42: "protocol driver not attached", + 43: "no CSI structure available", + 44: "level 2 halted", + 45: "resource deadlock avoided", + 46: "no locks available", + 50: "invalid exchange", + 51: "invalid request descriptor", + 52: "exchange full", + 53: "no anode", + 54: "invalid request code", + 55: "invalid slot", + 56: "file locking deadlock error", + 59: "bad font file format", + 60: "device not a stream", + 61: "no data available", + 62: "timer expired", + 63: "out of streams resources", + 64: "machine is not on the network", + 65: "package not installed", + 66: "object is remote", + 67: "link has been severed", + 68: "advertise error", + 69: "srmount error", + 70: "communication error on send", + 71: "protocol error", + 73: "RFS specific error", + 74: "multihop attempted", + 77: "bad message", + 78: "file name too long", + 79: "value too large for defined data type", + 80: "name not unique on network", + 81: "file descriptor in bad state", + 82: "remote address changed", + 83: "can not access a needed shared library", + 84: "accessing a corrupted shared library", + 85: ".lib section in a.out corrupted", + 86: "attempting to link in too many shared libraries", + 87: "cannot exec a shared library directly", + 88: "invalid or incomplete multibyte or wide character", + 89: "function not implemented", + 90: "too many levels of symbolic links", + 91: "interrupted system call should be restarted", + 92: "streams pipe error", + 93: "directory not empty", + 94: "too many users", + 95: "socket operation on non-socket", + 96: "destination address required", + 97: "message too long", + 98: "protocol wrong type for socket", + 99: "protocol not available", + 120: "protocol not supported", + 121: "socket type not supported", + 122: "operation not supported", + 123: "protocol family not supported", + 124: "address family not supported by protocol", + 125: "address already in use", + 126: "cannot assign requested address", + 127: "network is down", + 128: "network is unreachable", + 129: "network dropped connection on reset", + 130: "software caused connection abort", + 131: "connection reset by peer", + 132: "no buffer space available", + 133: "transport endpoint is already connected", + 134: "transport endpoint is not connected", + 135: "structure needs cleaning", + 137: "not a XENIX named type file", + 138: "no XENIX semaphores available", + 139: "is a named type file", + 140: "remote I/O error", + 141: "unknown error 141", + 142: "unknown error 142", + 143: "cannot send after transport endpoint shutdown", + 144: "too many references: cannot splice", + 145: "connection timed out", + 146: "connection refused", + 147: "host is down", + 148: "no route to host", + 149: "operation already in progress", + 150: "operation now in progress", + 151: "stale file handle", + 158: "operation canceled", + 159: "no medium found", + 160: "wrong medium type", + 161: "required key not available", + 162: "key has expired", + 163: "key has been revoked", + 164: "key was rejected by service", + 165: "owner died", + 166: "state not recoverable", + 167: "operation not possible due to RF-kill", + 168: "memory page has hardware error", + 1133: "disk quota exceeded", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/breakpoint trap", + 6: "aborted", + 7: "EMT trap", + 8: "floating point exception", + 9: "killed", + 10: "bus error", + 11: "segmentation fault", + 12: "bad system call", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "user defined signal 1", + 17: "user defined signal 2", + 18: "child exited", + 19: "power failure", + 20: "window changed", + 21: "urgent I/O condition", + 22: "I/O possible", + 23: "stopped (signal)", + 24: "stopped", + 25: "continued", + 26: "stopped (tty input)", + 27: "stopped (tty output)", + 28: "virtual timer expired", + 29: "profiling timer expired", + 30: "CPU time limit exceeded", + 31: "file size limit exceeded", +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go new file mode 100644 index 0000000..bd4ff81 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go @@ -0,0 +1,2241 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mips64le,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go + +package unix + +import "syscall" + +const ( + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BLKBSZGET = 0x40081270 + BLKBSZSET = 0x80081271 + BLKFLSBUF = 0x20001261 + BLKFRAGET = 0x20001265 + BLKFRASET = 0x20001264 + BLKGETSIZE = 0x20001260 + BLKGETSIZE64 = 0x40081272 + BLKPBSZGET = 0x2000127b + BLKRAGET = 0x20001263 + BLKRASET = 0x20001262 + BLKROGET = 0x2000125e + BLKROSET = 0x2000125d + BLKRRPART = 0x2000125f + BLKSECTGET = 0x20001267 + BLKSECTSET = 0x20001266 + BLKSSZGET = 0x20001268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x80 + EFD_SEMAPHORE = 0x1 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x2000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0xe + F_GETLK64 = 0xe + F_GETOWN = 0x17 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETOWN = 0x18 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x100 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x80 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MAP_ANON = 0x800 + MAP_ANONYMOUS = 0x800 + MAP_DENYWRITE = 0x2000 + MAP_EXECUTABLE = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x1000 + MAP_HUGETLB = 0x80000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x8000 + MAP_NONBLOCK = 0x20000 + MAP_NORESERVE = 0x400 + MAP_POPULATE = 0x10000 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x800 + MAP_SHARED = 0x1 + MAP_STACK = 0x40000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x1000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x100 + O_DIRECT = 0x8000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x10 + O_EXCL = 0x400 + O_FSYNC = 0x4010 + O_LARGEFILE = 0x0 + O_NDELAY = 0x80 + O_NOATIME = 0x40000 + O_NOCTTY = 0x800 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x80 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x4010 + O_SYNC = 0x4010 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x20002401 + PERF_EVENT_IOC_ENABLE = 0x20002400 + PERF_EVENT_IOC_ID = 0x40082407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 + PERF_EVENT_IOC_PERIOD = 0x80082404 + PERF_EVENT_IOC_REFRESH = 0x20002402 + PERF_EVENT_IOC_RESET = 0x20002403 + PERF_EVENT_IOC_SET_BPF = 0x80042408 + PERF_EVENT_IOC_SET_FILTER = 0x80082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = -0x1 + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_GET_THREAD_AREA_3264 = 0xc4 + PTRACE_GET_WATCH_REGS = 0xd0 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKDATA_3264 = 0xc1 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKTEXT_3264 = 0xc0 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKEDATA_3264 = 0xc3 + PTRACE_POKETEXT = 0x4 + PTRACE_POKETEXT_3264 = 0xc2 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SET_WATCH_REGS = 0xd1 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + RLIMIT_AS = 0x6 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x9 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x5 + RLIMIT_NPROC = 0x8 + RLIMIT_RSS = 0x7 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = -0x1 + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x10 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x40047307 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x40047309 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x467f + SIOCOUTQ = 0x7472 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x80047308 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x1 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x80 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x2 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0xffff + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1009 + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x20 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x1029 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0x100 + SO_PASSCRED = 0x11 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x12 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1e + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x1028 + SO_RCVBUF = 0x1002 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x1001 + SO_SNDBUFFORCE = 0x1f + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_STYLE = 0x1008 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x1008 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x5407 + TCGETA = 0x5401 + TCGETS = 0x540d + TCGETS2 = 0x4030542a + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x5410 + TCSBRK = 0x5405 + TCSBRKP = 0x5486 + TCSETA = 0x5402 + TCSETAF = 0x5404 + TCSETAW = 0x5403 + TCSETS = 0x540e + TCSETS2 = 0x8030542b + TCSETSF = 0x5410 + TCSETSF2 = 0x8030542d + TCSETSW = 0x540f + TCSETSW2 = 0x8030542c + TCXONC = 0x5406 + TIOCCBRK = 0x5428 + TIOCCONS = 0x80047478 + TIOCEXCL = 0x740d + TIOCGDEV = 0x40045432 + TIOCGETD = 0x7400 + TIOCGETP = 0x7408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x5492 + TIOCGLCKTRMIOS = 0x548b + TIOCGLTC = 0x7474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGPTPEER = 0x20005441 + TIOCGRS485 = 0x4020542e + TIOCGSERIAL = 0x5484 + TIOCGSID = 0x7416 + TIOCGSOFTCAR = 0x5481 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x467f + TIOCLINUX = 0x5483 + TIOCMBIC = 0x741c + TIOCMBIS = 0x741b + TIOCMGET = 0x741d + TIOCMIWAIT = 0x5491 + TIOCMSET = 0x741a + TIOCM_CAR = 0x100 + TIOCM_CD = 0x100 + TIOCM_CTS = 0x40 + TIOCM_DSR = 0x400 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x200 + TIOCM_RNG = 0x200 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x20 + TIOCM_ST = 0x10 + TIOCNOTTY = 0x5471 + TIOCNXCL = 0x740e + TIOCOUTQ = 0x7472 + TIOCPKT = 0x5470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x5480 + TIOCSERCONFIG = 0x5488 + TIOCSERGETLSR = 0x548e + TIOCSERGETMULTI = 0x548f + TIOCSERGSTRUCT = 0x548d + TIOCSERGWILD = 0x5489 + TIOCSERSETMULTI = 0x5490 + TIOCSERSWILD = 0x548a + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x7401 + TIOCSETN = 0x740a + TIOCSETP = 0x7409 + TIOCSIG = 0x80045436 + TIOCSLCKTRMIOS = 0x548c + TIOCSLTC = 0x7475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0xc020542f + TIOCSSERIAL = 0x5485 + TIOCSSOFTCAR = 0x5482 + TIOCSTI = 0x5472 + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x8000 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x801054d5 + TUNDETACHFILTER = 0x801054d6 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x401054db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETDEBUG = 0x800454c9 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + UMOUNT_NOFOLLOW = 0x8 + VDISCARD = 0xd + VEOF = 0x10 + VEOL = 0x11 + VEOL2 = 0x6 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x4 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VSWTCH = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XTABS = 0x1800 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x7d) + EADDRNOTAVAIL = syscall.Errno(0x7e) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x7c) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x95) + EBADE = syscall.Errno(0x32) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x51) + EBADMSG = syscall.Errno(0x4d) + EBADR = syscall.Errno(0x33) + EBADRQC = syscall.Errno(0x36) + EBADSLT = syscall.Errno(0x37) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x9e) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x25) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x82) + ECONNREFUSED = syscall.Errno(0x92) + ECONNRESET = syscall.Errno(0x83) + EDEADLK = syscall.Errno(0x2d) + EDEADLOCK = syscall.Errno(0x38) + EDESTADDRREQ = syscall.Errno(0x60) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x46d) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x93) + EHOSTUNREACH = syscall.Errno(0x94) + EHWPOISON = syscall.Errno(0xa8) + EIDRM = syscall.Errno(0x24) + EILSEQ = syscall.Errno(0x58) + EINIT = syscall.Errno(0x8d) + EINPROGRESS = syscall.Errno(0x96) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x85) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x8b) + EKEYEXPIRED = syscall.Errno(0xa2) + EKEYREJECTED = syscall.Errno(0xa4) + EKEYREVOKED = syscall.Errno(0xa3) + EL2HLT = syscall.Errno(0x2c) + EL2NSYNC = syscall.Errno(0x26) + EL3HLT = syscall.Errno(0x27) + EL3RST = syscall.Errno(0x28) + ELIBACC = syscall.Errno(0x53) + ELIBBAD = syscall.Errno(0x54) + ELIBEXEC = syscall.Errno(0x57) + ELIBMAX = syscall.Errno(0x56) + ELIBSCN = syscall.Errno(0x55) + ELNRNG = syscall.Errno(0x29) + ELOOP = syscall.Errno(0x5a) + EMEDIUMTYPE = syscall.Errno(0xa0) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x61) + EMULTIHOP = syscall.Errno(0x4a) + ENAMETOOLONG = syscall.Errno(0x4e) + ENAVAIL = syscall.Errno(0x8a) + ENETDOWN = syscall.Errno(0x7f) + ENETRESET = syscall.Errno(0x81) + ENETUNREACH = syscall.Errno(0x80) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x35) + ENOBUFS = syscall.Errno(0x84) + ENOCSI = syscall.Errno(0x2b) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0xa1) + ENOLCK = syscall.Errno(0x2e) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x9f) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x23) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x63) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x59) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x86) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x5d) + ENOTNAM = syscall.Errno(0x89) + ENOTRECOVERABLE = syscall.Errno(0xa6) + ENOTSOCK = syscall.Errno(0x5f) + ENOTSUP = syscall.Errno(0x7a) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x50) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x7a) + EOVERFLOW = syscall.Errno(0x4f) + EOWNERDEAD = syscall.Errno(0xa5) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x7b) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x78) + EPROTOTYPE = syscall.Errno(0x62) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x52) + EREMDEV = syscall.Errno(0x8e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x8c) + ERESTART = syscall.Errno(0x5b) + ERFKILL = syscall.Errno(0xa7) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x8f) + ESOCKTNOSUPPORT = syscall.Errno(0x79) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x97) + ESTRPIPE = syscall.Errno(0x5c) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x91) + ETOOMANYREFS = syscall.Errno(0x90) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x87) + EUNATCH = syscall.Errno(0x2a) + EUSERS = syscall.Errno(0x5e) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x34) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x12) + SIGCLD = syscall.Signal(0x12) + SIGCONT = syscall.Signal(0x19) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x16) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x16) + SIGPROF = syscall.Signal(0x1d) + SIGPWR = syscall.Signal(0x13) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x17) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x18) + SIGTTIN = syscall.Signal(0x1a) + SIGTTOU = syscall.Signal(0x1b) + SIGURG = syscall.Signal(0x15) + SIGUSR1 = syscall.Signal(0x10) + SIGUSR2 = syscall.Signal(0x11) + SIGVTALRM = syscall.Signal(0x1c) + SIGWINCH = syscall.Signal(0x14) + SIGXCPU = syscall.Signal(0x1e) + SIGXFSZ = syscall.Signal(0x1f) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "no such device or address", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource temporarily unavailable", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device or resource busy", + 17: "file exists", + 18: "invalid cross-device link", + 19: "no such device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "numerical result out of range", + 35: "no message of desired type", + 36: "identifier removed", + 37: "channel number out of range", + 38: "level 2 not synchronized", + 39: "level 3 halted", + 40: "level 3 reset", + 41: "link number out of range", + 42: "protocol driver not attached", + 43: "no CSI structure available", + 44: "level 2 halted", + 45: "resource deadlock avoided", + 46: "no locks available", + 50: "invalid exchange", + 51: "invalid request descriptor", + 52: "exchange full", + 53: "no anode", + 54: "invalid request code", + 55: "invalid slot", + 56: "file locking deadlock error", + 59: "bad font file format", + 60: "device not a stream", + 61: "no data available", + 62: "timer expired", + 63: "out of streams resources", + 64: "machine is not on the network", + 65: "package not installed", + 66: "object is remote", + 67: "link has been severed", + 68: "advertise error", + 69: "srmount error", + 70: "communication error on send", + 71: "protocol error", + 73: "RFS specific error", + 74: "multihop attempted", + 77: "bad message", + 78: "file name too long", + 79: "value too large for defined data type", + 80: "name not unique on network", + 81: "file descriptor in bad state", + 82: "remote address changed", + 83: "can not access a needed shared library", + 84: "accessing a corrupted shared library", + 85: ".lib section in a.out corrupted", + 86: "attempting to link in too many shared libraries", + 87: "cannot exec a shared library directly", + 88: "invalid or incomplete multibyte or wide character", + 89: "function not implemented", + 90: "too many levels of symbolic links", + 91: "interrupted system call should be restarted", + 92: "streams pipe error", + 93: "directory not empty", + 94: "too many users", + 95: "socket operation on non-socket", + 96: "destination address required", + 97: "message too long", + 98: "protocol wrong type for socket", + 99: "protocol not available", + 120: "protocol not supported", + 121: "socket type not supported", + 122: "operation not supported", + 123: "protocol family not supported", + 124: "address family not supported by protocol", + 125: "address already in use", + 126: "cannot assign requested address", + 127: "network is down", + 128: "network is unreachable", + 129: "network dropped connection on reset", + 130: "software caused connection abort", + 131: "connection reset by peer", + 132: "no buffer space available", + 133: "transport endpoint is already connected", + 134: "transport endpoint is not connected", + 135: "structure needs cleaning", + 137: "not a XENIX named type file", + 138: "no XENIX semaphores available", + 139: "is a named type file", + 140: "remote I/O error", + 141: "unknown error 141", + 142: "unknown error 142", + 143: "cannot send after transport endpoint shutdown", + 144: "too many references: cannot splice", + 145: "connection timed out", + 146: "connection refused", + 147: "host is down", + 148: "no route to host", + 149: "operation already in progress", + 150: "operation now in progress", + 151: "stale file handle", + 158: "operation canceled", + 159: "no medium found", + 160: "wrong medium type", + 161: "required key not available", + 162: "key has expired", + 163: "key has been revoked", + 164: "key was rejected by service", + 165: "owner died", + 166: "state not recoverable", + 167: "operation not possible due to RF-kill", + 168: "memory page has hardware error", + 1133: "disk quota exceeded", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/breakpoint trap", + 6: "aborted", + 7: "EMT trap", + 8: "floating point exception", + 9: "killed", + 10: "bus error", + 11: "segmentation fault", + 12: "bad system call", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "user defined signal 1", + 17: "user defined signal 2", + 18: "child exited", + 19: "power failure", + 20: "window changed", + 21: "urgent I/O condition", + 22: "I/O possible", + 23: "stopped (signal)", + 24: "stopped", + 25: "continued", + 26: "stopped (tty input)", + 27: "stopped (tty output)", + 28: "virtual timer expired", + 29: "profiling timer expired", + 30: "CPU time limit exceeded", + 31: "file size limit exceeded", +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go new file mode 100644 index 0000000..6dfc95c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go @@ -0,0 +1,2241 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mipsle,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go + +package unix + +import "syscall" + +const ( + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BLKBSZGET = 0x40041270 + BLKBSZSET = 0x80041271 + BLKFLSBUF = 0x20001261 + BLKFRAGET = 0x20001265 + BLKFRASET = 0x20001264 + BLKGETSIZE = 0x20001260 + BLKGETSIZE64 = 0x40041272 + BLKPBSZGET = 0x2000127b + BLKRAGET = 0x20001263 + BLKRASET = 0x20001262 + BLKROGET = 0x2000125e + BLKROSET = 0x2000125d + BLKRRPART = 0x2000125f + BLKSECTGET = 0x20001267 + BLKSECTSET = 0x20001266 + BLKSSZGET = 0x20001268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x80 + EFD_SEMAPHORE = 0x1 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x2000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x21 + F_GETLK64 = 0x21 + F_GETOWN = 0x17 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x22 + F_SETLK64 = 0x22 + F_SETLKW = 0x23 + F_SETLKW64 = 0x23 + F_SETOWN = 0x18 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x100 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x80 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MAP_ANON = 0x800 + MAP_ANONYMOUS = 0x800 + MAP_DENYWRITE = 0x2000 + MAP_EXECUTABLE = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x1000 + MAP_HUGETLB = 0x80000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x8000 + MAP_NONBLOCK = 0x20000 + MAP_NORESERVE = 0x400 + MAP_POPULATE = 0x10000 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x800 + MAP_SHARED = 0x1 + MAP_STACK = 0x40000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x1000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x100 + O_DIRECT = 0x8000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x10 + O_EXCL = 0x400 + O_FSYNC = 0x4010 + O_LARGEFILE = 0x2000 + O_NDELAY = 0x80 + O_NOATIME = 0x40000 + O_NOCTTY = 0x800 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x80 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x4010 + O_SYNC = 0x4010 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x20002401 + PERF_EVENT_IOC_ENABLE = 0x20002400 + PERF_EVENT_IOC_ID = 0x40042407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 + PERF_EVENT_IOC_PERIOD = 0x80082404 + PERF_EVENT_IOC_REFRESH = 0x20002402 + PERF_EVENT_IOC_RESET = 0x20002403 + PERF_EVENT_IOC_SET_BPF = 0x80042408 + PERF_EVENT_IOC_SET_FILTER = 0x80042406 + PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_GET_THREAD_AREA_3264 = 0xc4 + PTRACE_GET_WATCH_REGS = 0xd0 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKDATA_3264 = 0xc1 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKTEXT_3264 = 0xc0 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKEDATA_3264 = 0xc3 + PTRACE_POKETEXT = 0x4 + PTRACE_POKETEXT_3264 = 0xc2 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SET_WATCH_REGS = 0xd1 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + RLIMIT_AS = 0x6 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x9 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x5 + RLIMIT_NPROC = 0x8 + RLIMIT_RSS = 0x7 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = -0x1 + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x10 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x40047307 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x40047309 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x467f + SIOCOUTQ = 0x7472 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x80047308 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x1 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x80 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x2 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0xffff + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1009 + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x20 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x1029 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0x100 + SO_PASSCRED = 0x11 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x12 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1e + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x1028 + SO_RCVBUF = 0x1002 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x1001 + SO_SNDBUFFORCE = 0x1f + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_STYLE = 0x1008 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x1008 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x5407 + TCGETA = 0x5401 + TCGETS = 0x540d + TCGETS2 = 0x4030542a + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x5410 + TCSBRK = 0x5405 + TCSBRKP = 0x5486 + TCSETA = 0x5402 + TCSETAF = 0x5404 + TCSETAW = 0x5403 + TCSETS = 0x540e + TCSETS2 = 0x8030542b + TCSETSF = 0x5410 + TCSETSF2 = 0x8030542d + TCSETSW = 0x540f + TCSETSW2 = 0x8030542c + TCXONC = 0x5406 + TIOCCBRK = 0x5428 + TIOCCONS = 0x80047478 + TIOCEXCL = 0x740d + TIOCGDEV = 0x40045432 + TIOCGETD = 0x7400 + TIOCGETP = 0x7408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x5492 + TIOCGLCKTRMIOS = 0x548b + TIOCGLTC = 0x7474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGPTPEER = 0x20005441 + TIOCGRS485 = 0x4020542e + TIOCGSERIAL = 0x5484 + TIOCGSID = 0x7416 + TIOCGSOFTCAR = 0x5481 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x467f + TIOCLINUX = 0x5483 + TIOCMBIC = 0x741c + TIOCMBIS = 0x741b + TIOCMGET = 0x741d + TIOCMIWAIT = 0x5491 + TIOCMSET = 0x741a + TIOCM_CAR = 0x100 + TIOCM_CD = 0x100 + TIOCM_CTS = 0x40 + TIOCM_DSR = 0x400 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x200 + TIOCM_RNG = 0x200 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x20 + TIOCM_ST = 0x10 + TIOCNOTTY = 0x5471 + TIOCNXCL = 0x740e + TIOCOUTQ = 0x7472 + TIOCPKT = 0x5470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x5480 + TIOCSERCONFIG = 0x5488 + TIOCSERGETLSR = 0x548e + TIOCSERGETMULTI = 0x548f + TIOCSERGSTRUCT = 0x548d + TIOCSERGWILD = 0x5489 + TIOCSERSETMULTI = 0x5490 + TIOCSERSWILD = 0x548a + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x7401 + TIOCSETN = 0x740a + TIOCSETP = 0x7409 + TIOCSIG = 0x80045436 + TIOCSLCKTRMIOS = 0x548c + TIOCSLTC = 0x7475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0xc020542f + TIOCSSERIAL = 0x5485 + TIOCSSOFTCAR = 0x5482 + TIOCSTI = 0x5472 + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x8000 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x800854d5 + TUNDETACHFILTER = 0x800854d6 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x400854db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETDEBUG = 0x800454c9 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + UMOUNT_NOFOLLOW = 0x8 + VDISCARD = 0xd + VEOF = 0x10 + VEOL = 0x11 + VEOL2 = 0x6 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x4 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VSWTCH = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x20 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XTABS = 0x1800 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x7d) + EADDRNOTAVAIL = syscall.Errno(0x7e) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x7c) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x95) + EBADE = syscall.Errno(0x32) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x51) + EBADMSG = syscall.Errno(0x4d) + EBADR = syscall.Errno(0x33) + EBADRQC = syscall.Errno(0x36) + EBADSLT = syscall.Errno(0x37) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x9e) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x25) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x82) + ECONNREFUSED = syscall.Errno(0x92) + ECONNRESET = syscall.Errno(0x83) + EDEADLK = syscall.Errno(0x2d) + EDEADLOCK = syscall.Errno(0x38) + EDESTADDRREQ = syscall.Errno(0x60) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x46d) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x93) + EHOSTUNREACH = syscall.Errno(0x94) + EHWPOISON = syscall.Errno(0xa8) + EIDRM = syscall.Errno(0x24) + EILSEQ = syscall.Errno(0x58) + EINIT = syscall.Errno(0x8d) + EINPROGRESS = syscall.Errno(0x96) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x85) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x8b) + EKEYEXPIRED = syscall.Errno(0xa2) + EKEYREJECTED = syscall.Errno(0xa4) + EKEYREVOKED = syscall.Errno(0xa3) + EL2HLT = syscall.Errno(0x2c) + EL2NSYNC = syscall.Errno(0x26) + EL3HLT = syscall.Errno(0x27) + EL3RST = syscall.Errno(0x28) + ELIBACC = syscall.Errno(0x53) + ELIBBAD = syscall.Errno(0x54) + ELIBEXEC = syscall.Errno(0x57) + ELIBMAX = syscall.Errno(0x56) + ELIBSCN = syscall.Errno(0x55) + ELNRNG = syscall.Errno(0x29) + ELOOP = syscall.Errno(0x5a) + EMEDIUMTYPE = syscall.Errno(0xa0) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x61) + EMULTIHOP = syscall.Errno(0x4a) + ENAMETOOLONG = syscall.Errno(0x4e) + ENAVAIL = syscall.Errno(0x8a) + ENETDOWN = syscall.Errno(0x7f) + ENETRESET = syscall.Errno(0x81) + ENETUNREACH = syscall.Errno(0x80) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x35) + ENOBUFS = syscall.Errno(0x84) + ENOCSI = syscall.Errno(0x2b) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0xa1) + ENOLCK = syscall.Errno(0x2e) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x9f) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x23) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x63) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x59) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x86) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x5d) + ENOTNAM = syscall.Errno(0x89) + ENOTRECOVERABLE = syscall.Errno(0xa6) + ENOTSOCK = syscall.Errno(0x5f) + ENOTSUP = syscall.Errno(0x7a) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x50) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x7a) + EOVERFLOW = syscall.Errno(0x4f) + EOWNERDEAD = syscall.Errno(0xa5) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x7b) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x78) + EPROTOTYPE = syscall.Errno(0x62) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x52) + EREMDEV = syscall.Errno(0x8e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x8c) + ERESTART = syscall.Errno(0x5b) + ERFKILL = syscall.Errno(0xa7) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x8f) + ESOCKTNOSUPPORT = syscall.Errno(0x79) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x97) + ESTRPIPE = syscall.Errno(0x5c) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x91) + ETOOMANYREFS = syscall.Errno(0x90) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x87) + EUNATCH = syscall.Errno(0x2a) + EUSERS = syscall.Errno(0x5e) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x34) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x12) + SIGCLD = syscall.Signal(0x12) + SIGCONT = syscall.Signal(0x19) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x16) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x16) + SIGPROF = syscall.Signal(0x1d) + SIGPWR = syscall.Signal(0x13) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x17) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x18) + SIGTTIN = syscall.Signal(0x1a) + SIGTTOU = syscall.Signal(0x1b) + SIGURG = syscall.Signal(0x15) + SIGUSR1 = syscall.Signal(0x10) + SIGUSR2 = syscall.Signal(0x11) + SIGVTALRM = syscall.Signal(0x1c) + SIGWINCH = syscall.Signal(0x14) + SIGXCPU = syscall.Signal(0x1e) + SIGXFSZ = syscall.Signal(0x1f) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "no such device or address", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource temporarily unavailable", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device or resource busy", + 17: "file exists", + 18: "invalid cross-device link", + 19: "no such device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "numerical result out of range", + 35: "no message of desired type", + 36: "identifier removed", + 37: "channel number out of range", + 38: "level 2 not synchronized", + 39: "level 3 halted", + 40: "level 3 reset", + 41: "link number out of range", + 42: "protocol driver not attached", + 43: "no CSI structure available", + 44: "level 2 halted", + 45: "resource deadlock avoided", + 46: "no locks available", + 50: "invalid exchange", + 51: "invalid request descriptor", + 52: "exchange full", + 53: "no anode", + 54: "invalid request code", + 55: "invalid slot", + 56: "file locking deadlock error", + 59: "bad font file format", + 60: "device not a stream", + 61: "no data available", + 62: "timer expired", + 63: "out of streams resources", + 64: "machine is not on the network", + 65: "package not installed", + 66: "object is remote", + 67: "link has been severed", + 68: "advertise error", + 69: "srmount error", + 70: "communication error on send", + 71: "protocol error", + 73: "RFS specific error", + 74: "multihop attempted", + 77: "bad message", + 78: "file name too long", + 79: "value too large for defined data type", + 80: "name not unique on network", + 81: "file descriptor in bad state", + 82: "remote address changed", + 83: "can not access a needed shared library", + 84: "accessing a corrupted shared library", + 85: ".lib section in a.out corrupted", + 86: "attempting to link in too many shared libraries", + 87: "cannot exec a shared library directly", + 88: "invalid or incomplete multibyte or wide character", + 89: "function not implemented", + 90: "too many levels of symbolic links", + 91: "interrupted system call should be restarted", + 92: "streams pipe error", + 93: "directory not empty", + 94: "too many users", + 95: "socket operation on non-socket", + 96: "destination address required", + 97: "message too long", + 98: "protocol wrong type for socket", + 99: "protocol not available", + 120: "protocol not supported", + 121: "socket type not supported", + 122: "operation not supported", + 123: "protocol family not supported", + 124: "address family not supported by protocol", + 125: "address already in use", + 126: "cannot assign requested address", + 127: "network is down", + 128: "network is unreachable", + 129: "network dropped connection on reset", + 130: "software caused connection abort", + 131: "connection reset by peer", + 132: "no buffer space available", + 133: "transport endpoint is already connected", + 134: "transport endpoint is not connected", + 135: "structure needs cleaning", + 137: "not a XENIX named type file", + 138: "no XENIX semaphores available", + 139: "is a named type file", + 140: "remote I/O error", + 141: "unknown error 141", + 142: "unknown error 142", + 143: "cannot send after transport endpoint shutdown", + 144: "too many references: cannot splice", + 145: "connection timed out", + 146: "connection refused", + 147: "host is down", + 148: "no route to host", + 149: "operation already in progress", + 150: "operation now in progress", + 151: "stale file handle", + 158: "operation canceled", + 159: "no medium found", + 160: "wrong medium type", + 161: "required key not available", + 162: "key has expired", + 163: "key has been revoked", + 164: "key was rejected by service", + 165: "owner died", + 166: "state not recoverable", + 167: "operation not possible due to RF-kill", + 168: "memory page has hardware error", + 1133: "disk quota exceeded", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/breakpoint trap", + 6: "aborted", + 7: "EMT trap", + 8: "floating point exception", + 9: "killed", + 10: "bus error", + 11: "segmentation fault", + 12: "bad system call", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "user defined signal 1", + 17: "user defined signal 2", + 18: "child exited", + 19: "power failure", + 20: "window changed", + 21: "urgent I/O condition", + 22: "I/O possible", + 23: "stopped (signal)", + 24: "stopped", + 25: "continued", + 26: "stopped (tty input)", + 27: "stopped (tty output)", + 28: "virtual timer expired", + 29: "profiling timer expired", + 30: "CPU time limit exceeded", + 31: "file size limit exceeded", +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go new file mode 100644 index 0000000..46b09d3 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go @@ -0,0 +1,2294 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build ppc64,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go + +package unix + +import "syscall" + +const ( + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x17 + B110 = 0x3 + B115200 = 0x11 + B1152000 = 0x18 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x19 + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x1a + B230400 = 0x12 + B2400 = 0xb + B2500000 = 0x1b + B300 = 0x7 + B3000000 = 0x1c + B3500000 = 0x1d + B38400 = 0xf + B4000000 = 0x1e + B460800 = 0x13 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x14 + B57600 = 0x10 + B576000 = 0x15 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x16 + B9600 = 0xd + BLKBSZGET = 0x40081270 + BLKBSZSET = 0x80081271 + BLKFLSBUF = 0x20001261 + BLKFRAGET = 0x20001265 + BLKFRASET = 0x20001264 + BLKGETSIZE = 0x20001260 + BLKGETSIZE64 = 0x40081272 + BLKPBSZGET = 0x2000127b + BLKRAGET = 0x20001263 + BLKRASET = 0x20001262 + BLKROGET = 0x2000125e + BLKROSET = 0x2000125d + BLKRRPART = 0x2000125f + BLKSECTGET = 0x20001267 + BLKSECTSET = 0x20001266 + BLKSSZGET = 0x20001268 + BOTHER = 0x1f + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x8000 + BSDLY = 0x8000 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0xff + CBAUDEX = 0x0 + CFLUSH = 0xf + CIBAUD = 0xff0000 + CLOCAL = 0x8000 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x1000 + CR2 = 0x2000 + CR3 = 0x3000 + CRDLY = 0x3000 + CREAD = 0x800 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIGNAL = 0xff + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x4000 + FFDLY = 0x4000 + FLUSHO = 0x800000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x5 + F_GETLK64 = 0xc + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0xd + F_SETLKW = 0x7 + F_SETLKW64 = 0xe + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HUPCL = 0x4000 + IBSHIFT = 0x10 + ICANON = 0x100 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x400 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x80 + ISTRIP = 0x20 + IUCLC = 0x1000 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x80 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x40 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x2000 + MCL_FUTURE = 0x4000 + MCL_ONFAULT = 0x8000 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NL2 = 0x200 + NL3 = 0x300 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x300 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80000000 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x4 + ONLCR = 0x2 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x20000 + O_DIRECTORY = 0x4000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x8000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x404000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x1000 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PERF_EVENT_IOC_DISABLE = 0x20002401 + PERF_EVENT_IOC_ENABLE = 0x20002400 + PERF_EVENT_IOC_ID = 0x40082407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 + PERF_EVENT_IOC_PERIOD = 0x80082404 + PERF_EVENT_IOC_REFRESH = 0x20002402 + PERF_EVENT_IOC_RESET = 0x20002403 + PERF_EVENT_IOC_SET_BPF = 0x80042408 + PERF_EVENT_IOC_SET_FILTER = 0x80082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_SAO = 0x10 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = -0x1 + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETEVRREGS = 0x14 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGS64 = 0x16 + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GETVRREGS = 0x12 + PTRACE_GETVSRREGS = 0x1b + PTRACE_GET_DEBUGREG = 0x19 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SEIZE = 0x4206 + PTRACE_SETEVRREGS = 0x15 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGS64 = 0x17 + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SETVRREGS = 0x13 + PTRACE_SETVSRREGS = 0x1c + PTRACE_SET_DEBUGREG = 0x1a + PTRACE_SINGLEBLOCK = 0x100 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + PT_CCR = 0x26 + PT_CTR = 0x23 + PT_DAR = 0x29 + PT_DSCR = 0x2c + PT_DSISR = 0x2a + PT_FPR0 = 0x30 + PT_FPSCR = 0x50 + PT_LNK = 0x24 + PT_MSR = 0x21 + PT_NIP = 0x20 + PT_ORIG_R3 = 0x22 + PT_R0 = 0x0 + PT_R1 = 0x1 + PT_R10 = 0xa + PT_R11 = 0xb + PT_R12 = 0xc + PT_R13 = 0xd + PT_R14 = 0xe + PT_R15 = 0xf + PT_R16 = 0x10 + PT_R17 = 0x11 + PT_R18 = 0x12 + PT_R19 = 0x13 + PT_R2 = 0x2 + PT_R20 = 0x14 + PT_R21 = 0x15 + PT_R22 = 0x16 + PT_R23 = 0x17 + PT_R24 = 0x18 + PT_R25 = 0x19 + PT_R26 = 0x1a + PT_R27 = 0x1b + PT_R28 = 0x1c + PT_R29 = 0x1d + PT_R3 = 0x3 + PT_R30 = 0x1e + PT_R31 = 0x1f + PT_R4 = 0x4 + PT_R5 = 0x5 + PT_R6 = 0x6 + PT_R7 = 0x7 + PT_R8 = 0x8 + PT_R9 = 0x9 + PT_REGS_COUNT = 0x2c + PT_RESULT = 0x2b + PT_SOFTE = 0x27 + PT_TRAP = 0x28 + PT_VR0 = 0x52 + PT_VRSAVE = 0x94 + PT_VSCR = 0x93 + PT_VSR0 = 0x96 + PT_VSR31 = 0xd4 + PT_XER = 0x25 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = -0x1 + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x10 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x4004667f + SIOCOUTQ = 0x40047473 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x14 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x15 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x10 + SO_RCVTIMEO = 0x12 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x11 + SO_SNDTIMEO = 0x13 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x400 + TAB2 = 0x800 + TAB3 = 0xc00 + TABDLY = 0xc00 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x2000741f + TCGETA = 0x40147417 + TCGETS = 0x402c7413 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x2000741d + TCSBRKP = 0x5425 + TCSETA = 0x80147418 + TCSETAF = 0x8014741c + TCSETAW = 0x80147419 + TCSETS = 0x802c7414 + TCSETSF = 0x802c7416 + TCSETSW = 0x802c7415 + TCXONC = 0x2000741e + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x40045432 + TIOCGETC = 0x40067412 + TIOCGETD = 0x5424 + TIOCGETP = 0x40067408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGLTC = 0x40067474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGPTPEER = 0x20005441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x4004667f + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_LOOP = 0x8000 + TIOCM_OUT1 = 0x2000 + TIOCM_OUT2 = 0x4000 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETC = 0x80067411 + TIOCSETD = 0x5423 + TIOCSETN = 0x8006740a + TIOCSETP = 0x80067409 + TIOCSIG = 0x80045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSLTC = 0x80067475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTART = 0x2000746e + TIOCSTI = 0x5412 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x400000 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x801054d5 + TUNDETACHFILTER = 0x801054d6 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x401054db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETDEBUG = 0x800454c9 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + UMOUNT_NOFOLLOW = 0x8 + VDISCARD = 0x10 + VEOF = 0x4 + VEOL = 0x6 + VEOL2 = 0x8 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x5 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xb + VSTART = 0xd + VSTOP = 0xe + VSUSP = 0xc + VSWTC = 0x9 + VT0 = 0x0 + VT1 = 0x10000 + VTDLY = 0x10000 + VTIME = 0x7 + VWERASE = 0xa + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4000 + XTABS = 0xc00 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x62) + EADDRNOTAVAIL = syscall.Errno(0x63) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x61) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x72) + EBADE = syscall.Errno(0x34) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x4d) + EBADMSG = syscall.Errno(0x4a) + EBADR = syscall.Errno(0x35) + EBADRQC = syscall.Errno(0x38) + EBADSLT = syscall.Errno(0x39) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7d) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x2c) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x67) + ECONNREFUSED = syscall.Errno(0x6f) + ECONNRESET = syscall.Errno(0x68) + EDEADLK = syscall.Errno(0x23) + EDEADLOCK = syscall.Errno(0x3a) + EDESTADDRREQ = syscall.Errno(0x59) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x7a) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x70) + EHOSTUNREACH = syscall.Errno(0x71) + EHWPOISON = syscall.Errno(0x85) + EIDRM = syscall.Errno(0x2b) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x73) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x6a) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x7f) + EKEYREJECTED = syscall.Errno(0x81) + EKEYREVOKED = syscall.Errno(0x80) + EL2HLT = syscall.Errno(0x33) + EL2NSYNC = syscall.Errno(0x2d) + EL3HLT = syscall.Errno(0x2e) + EL3RST = syscall.Errno(0x2f) + ELIBACC = syscall.Errno(0x4f) + ELIBBAD = syscall.Errno(0x50) + ELIBEXEC = syscall.Errno(0x53) + ELIBMAX = syscall.Errno(0x52) + ELIBSCN = syscall.Errno(0x51) + ELNRNG = syscall.Errno(0x30) + ELOOP = syscall.Errno(0x28) + EMEDIUMTYPE = syscall.Errno(0x7c) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x5a) + EMULTIHOP = syscall.Errno(0x48) + ENAMETOOLONG = syscall.Errno(0x24) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x64) + ENETRESET = syscall.Errno(0x66) + ENETUNREACH = syscall.Errno(0x65) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x37) + ENOBUFS = syscall.Errno(0x69) + ENOCSI = syscall.Errno(0x32) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x7e) + ENOLCK = syscall.Errno(0x25) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x7b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x2a) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x5c) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x26) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x6b) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x27) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x83) + ENOTSOCK = syscall.Errno(0x58) + ENOTSUP = syscall.Errno(0x5f) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x4c) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x5f) + EOVERFLOW = syscall.Errno(0x4b) + EOWNERDEAD = syscall.Errno(0x82) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x60) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x5d) + EPROTOTYPE = syscall.Errno(0x5b) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x4e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x55) + ERFKILL = syscall.Errno(0x84) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x6c) + ESOCKTNOSUPPORT = syscall.Errno(0x5e) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x74) + ESTRPIPE = syscall.Errno(0x56) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x6e) + ETOOMANYREFS = syscall.Errno(0x6d) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x31) + EUSERS = syscall.Errno(0x57) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x36) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0x7) + SIGCHLD = syscall.Signal(0x11) + SIGCLD = syscall.Signal(0x11) + SIGCONT = syscall.Signal(0x12) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x1d) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x1d) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1e) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTKFLT = syscall.Signal(0x10) + SIGSTOP = syscall.Signal(0x13) + SIGSYS = syscall.Signal(0x1f) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x14) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x17) + SIGUSR1 = syscall.Signal(0xa) + SIGUSR2 = syscall.Signal(0xc) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "no such device or address", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource temporarily unavailable", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device or resource busy", + 17: "file exists", + 18: "invalid cross-device link", + 19: "no such device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "numerical result out of range", + 35: "resource deadlock avoided", + 36: "file name too long", + 37: "no locks available", + 38: "function not implemented", + 39: "directory not empty", + 40: "too many levels of symbolic links", + 42: "no message of desired type", + 43: "identifier removed", + 44: "channel number out of range", + 45: "level 2 not synchronized", + 46: "level 3 halted", + 47: "level 3 reset", + 48: "link number out of range", + 49: "protocol driver not attached", + 50: "no CSI structure available", + 51: "level 2 halted", + 52: "invalid exchange", + 53: "invalid request descriptor", + 54: "exchange full", + 55: "no anode", + 56: "invalid request code", + 57: "invalid slot", + 58: "file locking deadlock error", + 59: "bad font file format", + 60: "device not a stream", + 61: "no data available", + 62: "timer expired", + 63: "out of streams resources", + 64: "machine is not on the network", + 65: "package not installed", + 66: "object is remote", + 67: "link has been severed", + 68: "advertise error", + 69: "srmount error", + 70: "communication error on send", + 71: "protocol error", + 72: "multihop attempted", + 73: "RFS specific error", + 74: "bad message", + 75: "value too large for defined data type", + 76: "name not unique on network", + 77: "file descriptor in bad state", + 78: "remote address changed", + 79: "can not access a needed shared library", + 80: "accessing a corrupted shared library", + 81: ".lib section in a.out corrupted", + 82: "attempting to link in too many shared libraries", + 83: "cannot exec a shared library directly", + 84: "invalid or incomplete multibyte or wide character", + 85: "interrupted system call should be restarted", + 86: "streams pipe error", + 87: "too many users", + 88: "socket operation on non-socket", + 89: "destination address required", + 90: "message too long", + 91: "protocol wrong type for socket", + 92: "protocol not available", + 93: "protocol not supported", + 94: "socket type not supported", + 95: "operation not supported", + 96: "protocol family not supported", + 97: "address family not supported by protocol", + 98: "address already in use", + 99: "cannot assign requested address", + 100: "network is down", + 101: "network is unreachable", + 102: "network dropped connection on reset", + 103: "software caused connection abort", + 104: "connection reset by peer", + 105: "no buffer space available", + 106: "transport endpoint is already connected", + 107: "transport endpoint is not connected", + 108: "cannot send after transport endpoint shutdown", + 109: "too many references: cannot splice", + 110: "connection timed out", + 111: "connection refused", + 112: "host is down", + 113: "no route to host", + 114: "operation already in progress", + 115: "operation now in progress", + 116: "stale file handle", + 117: "structure needs cleaning", + 118: "not a XENIX named type file", + 119: "no XENIX semaphores available", + 120: "is a named type file", + 121: "remote I/O error", + 122: "disk quota exceeded", + 123: "no medium found", + 124: "wrong medium type", + 125: "operation canceled", + 126: "required key not available", + 127: "key has expired", + 128: "key has been revoked", + 129: "key was rejected by service", + 130: "owner died", + 131: "state not recoverable", + 132: "operation not possible due to RF-kill", + 133: "memory page has hardware error", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/breakpoint trap", + 6: "aborted", + 7: "bus error", + 8: "floating point exception", + 9: "killed", + 10: "user defined signal 1", + 11: "segmentation fault", + 12: "user defined signal 2", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "stack fault", + 17: "child exited", + 18: "continued", + 19: "stopped (signal)", + 20: "stopped", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "urgent I/O condition", + 24: "CPU time limit exceeded", + 25: "file size limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window changed", + 29: "I/O possible", + 30: "power failure", + 31: "bad system call", +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go new file mode 100644 index 0000000..08adb1d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go @@ -0,0 +1,2294 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build ppc64le,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go + +package unix + +import "syscall" + +const ( + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x17 + B110 = 0x3 + B115200 = 0x11 + B1152000 = 0x18 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x19 + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x1a + B230400 = 0x12 + B2400 = 0xb + B2500000 = 0x1b + B300 = 0x7 + B3000000 = 0x1c + B3500000 = 0x1d + B38400 = 0xf + B4000000 = 0x1e + B460800 = 0x13 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x14 + B57600 = 0x10 + B576000 = 0x15 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x16 + B9600 = 0xd + BLKBSZGET = 0x40081270 + BLKBSZSET = 0x80081271 + BLKFLSBUF = 0x20001261 + BLKFRAGET = 0x20001265 + BLKFRASET = 0x20001264 + BLKGETSIZE = 0x20001260 + BLKGETSIZE64 = 0x40081272 + BLKPBSZGET = 0x2000127b + BLKRAGET = 0x20001263 + BLKRASET = 0x20001262 + BLKROGET = 0x2000125e + BLKROSET = 0x2000125d + BLKRRPART = 0x2000125f + BLKSECTGET = 0x20001267 + BLKSECTSET = 0x20001266 + BLKSSZGET = 0x20001268 + BOTHER = 0x1f + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x8000 + BSDLY = 0x8000 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0xff + CBAUDEX = 0x0 + CFLUSH = 0xf + CIBAUD = 0xff0000 + CLOCAL = 0x8000 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x1000 + CR2 = 0x2000 + CR3 = 0x3000 + CRDLY = 0x3000 + CREAD = 0x800 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIGNAL = 0xff + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x4000 + FFDLY = 0x4000 + FLUSHO = 0x800000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x5 + F_GETLK64 = 0xc + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0xd + F_SETLKW = 0x7 + F_SETLKW64 = 0xe + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HUPCL = 0x4000 + IBSHIFT = 0x10 + ICANON = 0x100 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x400 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x80 + ISTRIP = 0x20 + IUCLC = 0x1000 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x80 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x40 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x2000 + MCL_FUTURE = 0x4000 + MCL_ONFAULT = 0x8000 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NL2 = 0x200 + NL3 = 0x300 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x300 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80000000 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x4 + ONLCR = 0x2 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x20000 + O_DIRECTORY = 0x4000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x8000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x404000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x1000 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PERF_EVENT_IOC_DISABLE = 0x20002401 + PERF_EVENT_IOC_ENABLE = 0x20002400 + PERF_EVENT_IOC_ID = 0x40082407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 + PERF_EVENT_IOC_PERIOD = 0x80082404 + PERF_EVENT_IOC_REFRESH = 0x20002402 + PERF_EVENT_IOC_RESET = 0x20002403 + PERF_EVENT_IOC_SET_BPF = 0x80042408 + PERF_EVENT_IOC_SET_FILTER = 0x80082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_SAO = 0x10 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = -0x1 + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETEVRREGS = 0x14 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGS64 = 0x16 + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GETVRREGS = 0x12 + PTRACE_GETVSRREGS = 0x1b + PTRACE_GET_DEBUGREG = 0x19 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SEIZE = 0x4206 + PTRACE_SETEVRREGS = 0x15 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGS64 = 0x17 + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SETVRREGS = 0x13 + PTRACE_SETVSRREGS = 0x1c + PTRACE_SET_DEBUGREG = 0x1a + PTRACE_SINGLEBLOCK = 0x100 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + PT_CCR = 0x26 + PT_CTR = 0x23 + PT_DAR = 0x29 + PT_DSCR = 0x2c + PT_DSISR = 0x2a + PT_FPR0 = 0x30 + PT_FPSCR = 0x50 + PT_LNK = 0x24 + PT_MSR = 0x21 + PT_NIP = 0x20 + PT_ORIG_R3 = 0x22 + PT_R0 = 0x0 + PT_R1 = 0x1 + PT_R10 = 0xa + PT_R11 = 0xb + PT_R12 = 0xc + PT_R13 = 0xd + PT_R14 = 0xe + PT_R15 = 0xf + PT_R16 = 0x10 + PT_R17 = 0x11 + PT_R18 = 0x12 + PT_R19 = 0x13 + PT_R2 = 0x2 + PT_R20 = 0x14 + PT_R21 = 0x15 + PT_R22 = 0x16 + PT_R23 = 0x17 + PT_R24 = 0x18 + PT_R25 = 0x19 + PT_R26 = 0x1a + PT_R27 = 0x1b + PT_R28 = 0x1c + PT_R29 = 0x1d + PT_R3 = 0x3 + PT_R30 = 0x1e + PT_R31 = 0x1f + PT_R4 = 0x4 + PT_R5 = 0x5 + PT_R6 = 0x6 + PT_R7 = 0x7 + PT_R8 = 0x8 + PT_R9 = 0x9 + PT_REGS_COUNT = 0x2c + PT_RESULT = 0x2b + PT_SOFTE = 0x27 + PT_TRAP = 0x28 + PT_VR0 = 0x52 + PT_VRSAVE = 0x94 + PT_VSCR = 0x93 + PT_VSR0 = 0x96 + PT_VSR31 = 0xd4 + PT_XER = 0x25 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = -0x1 + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x10 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x4004667f + SIOCOUTQ = 0x40047473 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x14 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x15 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x10 + SO_RCVTIMEO = 0x12 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x11 + SO_SNDTIMEO = 0x13 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x400 + TAB2 = 0x800 + TAB3 = 0xc00 + TABDLY = 0xc00 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x2000741f + TCGETA = 0x40147417 + TCGETS = 0x402c7413 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x2000741d + TCSBRKP = 0x5425 + TCSETA = 0x80147418 + TCSETAF = 0x8014741c + TCSETAW = 0x80147419 + TCSETS = 0x802c7414 + TCSETSF = 0x802c7416 + TCSETSW = 0x802c7415 + TCXONC = 0x2000741e + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x40045432 + TIOCGETC = 0x40067412 + TIOCGETD = 0x5424 + TIOCGETP = 0x40067408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGLTC = 0x40067474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGPTPEER = 0x20005441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x4004667f + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_LOOP = 0x8000 + TIOCM_OUT1 = 0x2000 + TIOCM_OUT2 = 0x4000 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETC = 0x80067411 + TIOCSETD = 0x5423 + TIOCSETN = 0x8006740a + TIOCSETP = 0x80067409 + TIOCSIG = 0x80045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSLTC = 0x80067475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTART = 0x2000746e + TIOCSTI = 0x5412 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x400000 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x801054d5 + TUNDETACHFILTER = 0x801054d6 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x401054db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETDEBUG = 0x800454c9 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + UMOUNT_NOFOLLOW = 0x8 + VDISCARD = 0x10 + VEOF = 0x4 + VEOL = 0x6 + VEOL2 = 0x8 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x5 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xb + VSTART = 0xd + VSTOP = 0xe + VSUSP = 0xc + VSWTC = 0x9 + VT0 = 0x0 + VT1 = 0x10000 + VTDLY = 0x10000 + VTIME = 0x7 + VWERASE = 0xa + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4000 + XTABS = 0xc00 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x62) + EADDRNOTAVAIL = syscall.Errno(0x63) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x61) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x72) + EBADE = syscall.Errno(0x34) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x4d) + EBADMSG = syscall.Errno(0x4a) + EBADR = syscall.Errno(0x35) + EBADRQC = syscall.Errno(0x38) + EBADSLT = syscall.Errno(0x39) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7d) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x2c) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x67) + ECONNREFUSED = syscall.Errno(0x6f) + ECONNRESET = syscall.Errno(0x68) + EDEADLK = syscall.Errno(0x23) + EDEADLOCK = syscall.Errno(0x3a) + EDESTADDRREQ = syscall.Errno(0x59) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x7a) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x70) + EHOSTUNREACH = syscall.Errno(0x71) + EHWPOISON = syscall.Errno(0x85) + EIDRM = syscall.Errno(0x2b) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x73) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x6a) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x7f) + EKEYREJECTED = syscall.Errno(0x81) + EKEYREVOKED = syscall.Errno(0x80) + EL2HLT = syscall.Errno(0x33) + EL2NSYNC = syscall.Errno(0x2d) + EL3HLT = syscall.Errno(0x2e) + EL3RST = syscall.Errno(0x2f) + ELIBACC = syscall.Errno(0x4f) + ELIBBAD = syscall.Errno(0x50) + ELIBEXEC = syscall.Errno(0x53) + ELIBMAX = syscall.Errno(0x52) + ELIBSCN = syscall.Errno(0x51) + ELNRNG = syscall.Errno(0x30) + ELOOP = syscall.Errno(0x28) + EMEDIUMTYPE = syscall.Errno(0x7c) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x5a) + EMULTIHOP = syscall.Errno(0x48) + ENAMETOOLONG = syscall.Errno(0x24) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x64) + ENETRESET = syscall.Errno(0x66) + ENETUNREACH = syscall.Errno(0x65) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x37) + ENOBUFS = syscall.Errno(0x69) + ENOCSI = syscall.Errno(0x32) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x7e) + ENOLCK = syscall.Errno(0x25) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x7b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x2a) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x5c) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x26) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x6b) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x27) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x83) + ENOTSOCK = syscall.Errno(0x58) + ENOTSUP = syscall.Errno(0x5f) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x4c) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x5f) + EOVERFLOW = syscall.Errno(0x4b) + EOWNERDEAD = syscall.Errno(0x82) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x60) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x5d) + EPROTOTYPE = syscall.Errno(0x5b) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x4e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x55) + ERFKILL = syscall.Errno(0x84) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x6c) + ESOCKTNOSUPPORT = syscall.Errno(0x5e) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x74) + ESTRPIPE = syscall.Errno(0x56) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x6e) + ETOOMANYREFS = syscall.Errno(0x6d) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x31) + EUSERS = syscall.Errno(0x57) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x36) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0x7) + SIGCHLD = syscall.Signal(0x11) + SIGCLD = syscall.Signal(0x11) + SIGCONT = syscall.Signal(0x12) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x1d) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x1d) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1e) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTKFLT = syscall.Signal(0x10) + SIGSTOP = syscall.Signal(0x13) + SIGSYS = syscall.Signal(0x1f) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x14) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x17) + SIGUSR1 = syscall.Signal(0xa) + SIGUSR2 = syscall.Signal(0xc) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "no such device or address", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource temporarily unavailable", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device or resource busy", + 17: "file exists", + 18: "invalid cross-device link", + 19: "no such device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "numerical result out of range", + 35: "resource deadlock avoided", + 36: "file name too long", + 37: "no locks available", + 38: "function not implemented", + 39: "directory not empty", + 40: "too many levels of symbolic links", + 42: "no message of desired type", + 43: "identifier removed", + 44: "channel number out of range", + 45: "level 2 not synchronized", + 46: "level 3 halted", + 47: "level 3 reset", + 48: "link number out of range", + 49: "protocol driver not attached", + 50: "no CSI structure available", + 51: "level 2 halted", + 52: "invalid exchange", + 53: "invalid request descriptor", + 54: "exchange full", + 55: "no anode", + 56: "invalid request code", + 57: "invalid slot", + 58: "file locking deadlock error", + 59: "bad font file format", + 60: "device not a stream", + 61: "no data available", + 62: "timer expired", + 63: "out of streams resources", + 64: "machine is not on the network", + 65: "package not installed", + 66: "object is remote", + 67: "link has been severed", + 68: "advertise error", + 69: "srmount error", + 70: "communication error on send", + 71: "protocol error", + 72: "multihop attempted", + 73: "RFS specific error", + 74: "bad message", + 75: "value too large for defined data type", + 76: "name not unique on network", + 77: "file descriptor in bad state", + 78: "remote address changed", + 79: "can not access a needed shared library", + 80: "accessing a corrupted shared library", + 81: ".lib section in a.out corrupted", + 82: "attempting to link in too many shared libraries", + 83: "cannot exec a shared library directly", + 84: "invalid or incomplete multibyte or wide character", + 85: "interrupted system call should be restarted", + 86: "streams pipe error", + 87: "too many users", + 88: "socket operation on non-socket", + 89: "destination address required", + 90: "message too long", + 91: "protocol wrong type for socket", + 92: "protocol not available", + 93: "protocol not supported", + 94: "socket type not supported", + 95: "operation not supported", + 96: "protocol family not supported", + 97: "address family not supported by protocol", + 98: "address already in use", + 99: "cannot assign requested address", + 100: "network is down", + 101: "network is unreachable", + 102: "network dropped connection on reset", + 103: "software caused connection abort", + 104: "connection reset by peer", + 105: "no buffer space available", + 106: "transport endpoint is already connected", + 107: "transport endpoint is not connected", + 108: "cannot send after transport endpoint shutdown", + 109: "too many references: cannot splice", + 110: "connection timed out", + 111: "connection refused", + 112: "host is down", + 113: "no route to host", + 114: "operation already in progress", + 115: "operation now in progress", + 116: "stale file handle", + 117: "structure needs cleaning", + 118: "not a XENIX named type file", + 119: "no XENIX semaphores available", + 120: "is a named type file", + 121: "remote I/O error", + 122: "disk quota exceeded", + 123: "no medium found", + 124: "wrong medium type", + 125: "operation canceled", + 126: "required key not available", + 127: "key has expired", + 128: "key has been revoked", + 129: "key was rejected by service", + 130: "owner died", + 131: "state not recoverable", + 132: "operation not possible due to RF-kill", + 133: "memory page has hardware error", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/breakpoint trap", + 6: "aborted", + 7: "bus error", + 8: "floating point exception", + 9: "killed", + 10: "user defined signal 1", + 11: "segmentation fault", + 12: "user defined signal 2", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "stack fault", + 17: "child exited", + 18: "continued", + 19: "stopped (signal)", + 20: "stopped", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "urgent I/O condition", + 24: "CPU time limit exceeded", + 25: "file size limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window changed", + 29: "I/O possible", + 30: "power failure", + 31: "bad system call", +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go new file mode 100644 index 0000000..70bc1a2 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go @@ -0,0 +1,2293 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include -fsigned-char +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build s390x,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char _const.go + +package unix + +import "syscall" + +const ( + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BLKBSZGET = 0x80081270 + BLKBSZSET = 0x40081271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80081272 + BLKPBSZGET = 0x127b + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x1000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x5 + F_GETLK64 = 0x5 + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x2000 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x4000 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x4000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x2401 + PERF_EVENT_IOC_ENABLE = 0x2400 + PERF_EVENT_IOC_ID = 0x80082407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 + PERF_EVENT_IOC_PERIOD = 0x40082404 + PERF_EVENT_IOC_REFRESH = 0x2402 + PERF_EVENT_IOC_RESET = 0x2403 + PERF_EVENT_IOC_SET_BPF = 0x40042408 + PERF_EVENT_IOC_SET_FILTER = 0x40082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x2405 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = -0x1 + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_DISABLE_TE = 0x5010 + PTRACE_ENABLE_TE = 0x5009 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_LAST_BREAK = 0x5006 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKDATA_AREA = 0x5003 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKTEXT_AREA = 0x5002 + PTRACE_PEEKUSR = 0x3 + PTRACE_PEEKUSR_AREA = 0x5000 + PTRACE_PEEK_SYSTEM_CALL = 0x5007 + PTRACE_POKEDATA = 0x5 + PTRACE_POKEDATA_AREA = 0x5005 + PTRACE_POKETEXT = 0x4 + PTRACE_POKETEXT_AREA = 0x5004 + PTRACE_POKEUSR = 0x6 + PTRACE_POKEUSR_AREA = 0x5001 + PTRACE_POKE_SYSTEM_CALL = 0x5008 + PTRACE_PROT = 0x15 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SEIZE = 0x4206 + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SINGLEBLOCK = 0xc + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TE_ABORT_RAND = 0x5011 + PTRACE_TRACEME = 0x0 + PT_ACR0 = 0x90 + PT_ACR1 = 0x94 + PT_ACR10 = 0xb8 + PT_ACR11 = 0xbc + PT_ACR12 = 0xc0 + PT_ACR13 = 0xc4 + PT_ACR14 = 0xc8 + PT_ACR15 = 0xcc + PT_ACR2 = 0x98 + PT_ACR3 = 0x9c + PT_ACR4 = 0xa0 + PT_ACR5 = 0xa4 + PT_ACR6 = 0xa8 + PT_ACR7 = 0xac + PT_ACR8 = 0xb0 + PT_ACR9 = 0xb4 + PT_CR_10 = 0x168 + PT_CR_11 = 0x170 + PT_CR_9 = 0x160 + PT_ENDREGS = 0x1af + PT_FPC = 0xd8 + PT_FPR0 = 0xe0 + PT_FPR1 = 0xe8 + PT_FPR10 = 0x130 + PT_FPR11 = 0x138 + PT_FPR12 = 0x140 + PT_FPR13 = 0x148 + PT_FPR14 = 0x150 + PT_FPR15 = 0x158 + PT_FPR2 = 0xf0 + PT_FPR3 = 0xf8 + PT_FPR4 = 0x100 + PT_FPR5 = 0x108 + PT_FPR6 = 0x110 + PT_FPR7 = 0x118 + PT_FPR8 = 0x120 + PT_FPR9 = 0x128 + PT_GPR0 = 0x10 + PT_GPR1 = 0x18 + PT_GPR10 = 0x60 + PT_GPR11 = 0x68 + PT_GPR12 = 0x70 + PT_GPR13 = 0x78 + PT_GPR14 = 0x80 + PT_GPR15 = 0x88 + PT_GPR2 = 0x20 + PT_GPR3 = 0x28 + PT_GPR4 = 0x30 + PT_GPR5 = 0x38 + PT_GPR6 = 0x40 + PT_GPR7 = 0x48 + PT_GPR8 = 0x50 + PT_GPR9 = 0x58 + PT_IEEE_IP = 0x1a8 + PT_LASTOFF = 0x1a8 + PT_ORIGGPR2 = 0xd0 + PT_PSWADDR = 0x8 + PT_PSWMASK = 0x0 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = -0x1 + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x10 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x541b + SIOCOUTQ = 0x5411 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x10 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x11 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x12 + SO_RCVTIMEO = 0x14 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x13 + SO_SNDTIMEO = 0x15 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x540b + TCGETA = 0x5405 + TCGETS = 0x5401 + TCGETS2 = 0x802c542a + TCGETX = 0x5432 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSBRKP = 0x5425 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETS2 = 0x402c542b + TCSETSF = 0x5404 + TCSETSF2 = 0x402c542d + TCSETSW = 0x5403 + TCSETSW2 = 0x402c542c + TCSETX = 0x5433 + TCSETXF = 0x5434 + TCSETXW = 0x5435 + TCXONC = 0x540a + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x80045432 + TIOCGETD = 0x5424 + TIOCGEXCL = 0x80045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x540f + TIOCGPKT = 0x80045438 + TIOCGPTLCK = 0x80045439 + TIOCGPTN = 0x80045430 + TIOCGPTPEER = 0x5441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x5413 + TIOCINQ = 0x541b + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x5411 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x5423 + TIOCSIG = 0x40045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x5410 + TIOCSPTLCK = 0x40045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTI = 0x5412 + TIOCSWINSZ = 0x5414 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x100 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x401054d5 + TUNDETACHFILTER = 0x401054d6 + TUNGETFEATURES = 0x800454cf + TUNGETFILTER = 0x801054db + TUNGETIFF = 0x800454d2 + TUNGETSNDBUF = 0x800454d3 + TUNGETVNETBE = 0x800454df + TUNGETVNETHDRSZ = 0x800454d7 + TUNGETVNETLE = 0x800454dd + TUNSETDEBUG = 0x400454c9 + TUNSETGROUP = 0x400454ce + TUNSETIFF = 0x400454ca + TUNSETIFINDEX = 0x400454da + TUNSETLINK = 0x400454cd + TUNSETNOCSUM = 0x400454c8 + TUNSETOFFLOAD = 0x400454d0 + TUNSETOWNER = 0x400454cc + TUNSETPERSIST = 0x400454cb + TUNSETQUEUE = 0x400454d9 + TUNSETSNDBUF = 0x400454d4 + TUNSETTXFILTER = 0x400454d1 + TUNSETVNETBE = 0x400454de + TUNSETVNETHDRSZ = 0x400454d8 + TUNSETVNETLE = 0x400454dc + UMOUNT_NOFOLLOW = 0x8 + VDISCARD = 0xd + VEOF = 0x4 + VEOL = 0xb + VEOL2 = 0x10 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x6 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XTABS = 0x1800 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x62) + EADDRNOTAVAIL = syscall.Errno(0x63) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x61) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x72) + EBADE = syscall.Errno(0x34) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x4d) + EBADMSG = syscall.Errno(0x4a) + EBADR = syscall.Errno(0x35) + EBADRQC = syscall.Errno(0x38) + EBADSLT = syscall.Errno(0x39) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7d) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x2c) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x67) + ECONNREFUSED = syscall.Errno(0x6f) + ECONNRESET = syscall.Errno(0x68) + EDEADLK = syscall.Errno(0x23) + EDEADLOCK = syscall.Errno(0x23) + EDESTADDRREQ = syscall.Errno(0x59) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x7a) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x70) + EHOSTUNREACH = syscall.Errno(0x71) + EHWPOISON = syscall.Errno(0x85) + EIDRM = syscall.Errno(0x2b) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x73) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x6a) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x7f) + EKEYREJECTED = syscall.Errno(0x81) + EKEYREVOKED = syscall.Errno(0x80) + EL2HLT = syscall.Errno(0x33) + EL2NSYNC = syscall.Errno(0x2d) + EL3HLT = syscall.Errno(0x2e) + EL3RST = syscall.Errno(0x2f) + ELIBACC = syscall.Errno(0x4f) + ELIBBAD = syscall.Errno(0x50) + ELIBEXEC = syscall.Errno(0x53) + ELIBMAX = syscall.Errno(0x52) + ELIBSCN = syscall.Errno(0x51) + ELNRNG = syscall.Errno(0x30) + ELOOP = syscall.Errno(0x28) + EMEDIUMTYPE = syscall.Errno(0x7c) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x5a) + EMULTIHOP = syscall.Errno(0x48) + ENAMETOOLONG = syscall.Errno(0x24) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x64) + ENETRESET = syscall.Errno(0x66) + ENETUNREACH = syscall.Errno(0x65) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x37) + ENOBUFS = syscall.Errno(0x69) + ENOCSI = syscall.Errno(0x32) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x7e) + ENOLCK = syscall.Errno(0x25) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x7b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x2a) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x5c) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x26) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x6b) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x27) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x83) + ENOTSOCK = syscall.Errno(0x58) + ENOTSUP = syscall.Errno(0x5f) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x4c) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x5f) + EOVERFLOW = syscall.Errno(0x4b) + EOWNERDEAD = syscall.Errno(0x82) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x60) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x5d) + EPROTOTYPE = syscall.Errno(0x5b) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x4e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x55) + ERFKILL = syscall.Errno(0x84) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x6c) + ESOCKTNOSUPPORT = syscall.Errno(0x5e) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x74) + ESTRPIPE = syscall.Errno(0x56) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x6e) + ETOOMANYREFS = syscall.Errno(0x6d) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x31) + EUSERS = syscall.Errno(0x57) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x36) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0x7) + SIGCHLD = syscall.Signal(0x11) + SIGCLD = syscall.Signal(0x11) + SIGCONT = syscall.Signal(0x12) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x1d) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x1d) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1e) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTKFLT = syscall.Signal(0x10) + SIGSTOP = syscall.Signal(0x13) + SIGSYS = syscall.Signal(0x1f) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x14) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x17) + SIGUSR1 = syscall.Signal(0xa) + SIGUSR2 = syscall.Signal(0xc) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "no such device or address", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource temporarily unavailable", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device or resource busy", + 17: "file exists", + 18: "invalid cross-device link", + 19: "no such device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "numerical result out of range", + 35: "resource deadlock avoided", + 36: "file name too long", + 37: "no locks available", + 38: "function not implemented", + 39: "directory not empty", + 40: "too many levels of symbolic links", + 42: "no message of desired type", + 43: "identifier removed", + 44: "channel number out of range", + 45: "level 2 not synchronized", + 46: "level 3 halted", + 47: "level 3 reset", + 48: "link number out of range", + 49: "protocol driver not attached", + 50: "no CSI structure available", + 51: "level 2 halted", + 52: "invalid exchange", + 53: "invalid request descriptor", + 54: "exchange full", + 55: "no anode", + 56: "invalid request code", + 57: "invalid slot", + 59: "bad font file format", + 60: "device not a stream", + 61: "no data available", + 62: "timer expired", + 63: "out of streams resources", + 64: "machine is not on the network", + 65: "package not installed", + 66: "object is remote", + 67: "link has been severed", + 68: "advertise error", + 69: "srmount error", + 70: "communication error on send", + 71: "protocol error", + 72: "multihop attempted", + 73: "RFS specific error", + 74: "bad message", + 75: "value too large for defined data type", + 76: "name not unique on network", + 77: "file descriptor in bad state", + 78: "remote address changed", + 79: "can not access a needed shared library", + 80: "accessing a corrupted shared library", + 81: ".lib section in a.out corrupted", + 82: "attempting to link in too many shared libraries", + 83: "cannot exec a shared library directly", + 84: "invalid or incomplete multibyte or wide character", + 85: "interrupted system call should be restarted", + 86: "streams pipe error", + 87: "too many users", + 88: "socket operation on non-socket", + 89: "destination address required", + 90: "message too long", + 91: "protocol wrong type for socket", + 92: "protocol not available", + 93: "protocol not supported", + 94: "socket type not supported", + 95: "operation not supported", + 96: "protocol family not supported", + 97: "address family not supported by protocol", + 98: "address already in use", + 99: "cannot assign requested address", + 100: "network is down", + 101: "network is unreachable", + 102: "network dropped connection on reset", + 103: "software caused connection abort", + 104: "connection reset by peer", + 105: "no buffer space available", + 106: "transport endpoint is already connected", + 107: "transport endpoint is not connected", + 108: "cannot send after transport endpoint shutdown", + 109: "too many references: cannot splice", + 110: "connection timed out", + 111: "connection refused", + 112: "host is down", + 113: "no route to host", + 114: "operation already in progress", + 115: "operation now in progress", + 116: "stale file handle", + 117: "structure needs cleaning", + 118: "not a XENIX named type file", + 119: "no XENIX semaphores available", + 120: "is a named type file", + 121: "remote I/O error", + 122: "disk quota exceeded", + 123: "no medium found", + 124: "wrong medium type", + 125: "operation canceled", + 126: "required key not available", + 127: "key has expired", + 128: "key has been revoked", + 129: "key was rejected by service", + 130: "owner died", + 131: "state not recoverable", + 132: "operation not possible due to RF-kill", + 133: "memory page has hardware error", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/breakpoint trap", + 6: "aborted", + 7: "bus error", + 8: "floating point exception", + 9: "killed", + 10: "user defined signal 1", + 11: "segmentation fault", + 12: "user defined signal 2", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "stack fault", + 17: "child exited", + 18: "continued", + 19: "stopped (signal)", + 20: "stopped", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "urgent I/O condition", + 24: "CPU time limit exceeded", + 25: "file size limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window changed", + 29: "I/O possible", + 30: "power failure", + 31: "bad system call", +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go new file mode 100644 index 0000000..95de199 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go @@ -0,0 +1,2142 @@ +// mkerrors.sh -m64 +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build sparc64,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2a + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_X25 = 0x10f + ASI_LEON_DFLUSH = 0x11 + ASI_LEON_IFLUSH = 0x10 + ASI_LEON_MMUFLUSH = 0x18 + B0 = 0x0 + B1000000 = 0x100c + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x100d + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100e + B153600 = 0x1006 + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100f + B230400 = 0x1003 + B2400 = 0xb + B300 = 0x7 + B307200 = 0x1007 + B38400 = 0xf + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x100a + B57600 = 0x1001 + B576000 = 0x100b + B600 = 0x8 + B614400 = 0x1008 + B75 = 0x2 + B76800 = 0x1005 + B921600 = 0x1009 + B9600 = 0xd + BLKBSZGET = 0x80081270 + BLKBSZSET = 0x40081271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80081272 + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + EMT_TAGOVF = 0x1 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x400000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x2000 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x7 + F_GETLK64 = 0x7 + F_GETOWN = 0x5 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x8 + F_SETLK64 = 0x8 + F_SETLKW = 0x9 + F_SETLKW64 = 0x9 + F_SETOWN = 0x6 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x3 + F_WRLCK = 0x2 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x400000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x4000 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_UNICAST_HOPS = 0x10 + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x200 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x100 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x40 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x2000 + MCL_FUTURE = 0x4000 + MCL_ONFAULT = 0x8000 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x400000 + O_CREAT = 0x200 + O_DIRECT = 0x100000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x2000 + O_EXCL = 0x800 + O_FSYNC = 0x802000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x4004 + O_NOATIME = 0x200000 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x4000 + O_PATH = 0x1000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x802000 + O_SYNC = 0x802000 + O_TMPFILE = 0x2010000 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = -0x1 + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPAREGS = 0x14 + PTRACE_GETFPREGS = 0xe + PTRACE_GETFPREGS64 = 0x19 + PTRACE_GETREGS = 0xc + PTRACE_GETREGS64 = 0x16 + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_READDATA = 0x10 + PTRACE_READTEXT = 0x12 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPAREGS = 0x15 + PTRACE_SETFPREGS = 0xf + PTRACE_SETFPREGS64 = 0x1a + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGS64 = 0x17 + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SINGLESTEP = 0x9 + PTRACE_SPARC_DETACH = 0xb + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + PTRACE_WRITEDATA = 0x11 + PTRACE_WRITETEXT = 0x13 + PT_FP = 0x48 + PT_G0 = 0x10 + PT_G1 = 0x14 + PT_G2 = 0x18 + PT_G3 = 0x1c + PT_G4 = 0x20 + PT_G5 = 0x24 + PT_G6 = 0x28 + PT_G7 = 0x2c + PT_I0 = 0x30 + PT_I1 = 0x34 + PT_I2 = 0x38 + PT_I3 = 0x3c + PT_I4 = 0x40 + PT_I5 = 0x44 + PT_I6 = 0x48 + PT_I7 = 0x4c + PT_NPC = 0x8 + PT_PC = 0x4 + PT_PSR = 0x0 + PT_REGS_MAGIC = 0x57ac6c00 + PT_TNPC = 0x90 + PT_TPC = 0x88 + PT_TSTATE = 0x80 + PT_V9_FP = 0x70 + PT_V9_G0 = 0x0 + PT_V9_G1 = 0x8 + PT_V9_G2 = 0x10 + PT_V9_G3 = 0x18 + PT_V9_G4 = 0x20 + PT_V9_G5 = 0x28 + PT_V9_G6 = 0x30 + PT_V9_G7 = 0x38 + PT_V9_I0 = 0x40 + PT_V9_I1 = 0x48 + PT_V9_I2 = 0x50 + PT_V9_I3 = 0x58 + PT_V9_I4 = 0x60 + PT_V9_I5 = 0x68 + PT_V9_I6 = 0x70 + PT_V9_I7 = 0x78 + PT_V9_MAGIC = 0x9c + PT_V9_TNPC = 0x90 + PT_V9_TPC = 0x88 + PT_V9_TSTATE = 0x80 + PT_V9_Y = 0x98 + PT_WIM = 0x10 + PT_Y = 0xc + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x6 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = -0x1 + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x10 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x18 + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x5f + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x14 + RTM_NR_MSGTYPES = 0x50 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x11 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x23 + SCM_TIMESTAMPNS = 0x21 + SCM_WIFI_STATUS = 0x25 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x4004667f + SIOCOUTQ = 0x40047473 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SOCK_CLOEXEC = 0x400000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_NONBLOCK = 0x4000 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0xffff + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x8000 + SO_ATTACH_BPF = 0x34 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x35 + SO_ATTACH_REUSEPORT_EBPF = 0x36 + SO_BINDTODEVICE = 0xd + SO_BPF_EXTENSIONS = 0x32 + SO_BROADCAST = 0x20 + SO_BSDCOMPAT = 0x400 + SO_BUSY_POLL = 0x30 + SO_CNX_ADVICE = 0x37 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x1029 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x33 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_LOCK_FILTER = 0x28 + SO_MARK = 0x22 + SO_MAX_PACING_RATE = 0x31 + SO_NOFCS = 0x27 + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0x100 + SO_PASSCRED = 0x2 + SO_PASSSEC = 0x1f + SO_PEEK_OFF = 0x26 + SO_PEERCRED = 0x40 + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1e + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x1028 + SO_RCVBUF = 0x1002 + SO_RCVBUFFORCE = 0x100b + SO_RCVLOWAT = 0x800 + SO_RCVTIMEO = 0x2000 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RXQ_OVFL = 0x24 + SO_SECURITY_AUTHENTICATION = 0x5001 + SO_SECURITY_ENCRYPTION_NETWORK = 0x5004 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x5002 + SO_SELECT_ERR_QUEUE = 0x29 + SO_SNDBUF = 0x1001 + SO_SNDBUFFORCE = 0x100a + SO_SNDLOWAT = 0x1000 + SO_SNDTIMEO = 0x4000 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x23 + SO_TIMESTAMPNS = 0x21 + SO_TYPE = 0x1008 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x25 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TCFLSH = 0x20005407 + TCGETA = 0x40125401 + TCGETS = 0x40245408 + TCGETS2 = 0x402c540c + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x20005405 + TCSBRKP = 0x5425 + TCSETA = 0x80125402 + TCSETAF = 0x80125404 + TCSETAW = 0x80125403 + TCSETS = 0x80245409 + TCSETS2 = 0x802c540d + TCSETSF = 0x8024540b + TCSETSF2 = 0x802c540f + TCSETSW = 0x8024540a + TCSETSW2 = 0x802c540e + TCXONC = 0x20005406 + TIOCCBRK = 0x2000747a + TIOCCONS = 0x20007424 + TIOCEXCL = 0x2000740d + TIOCGDEV = 0x40045432 + TIOCGETD = 0x40047400 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x40047483 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40047486 + TIOCGRS485 = 0x40205441 + TIOCGSERIAL = 0x541e + TIOCGSID = 0x40047485 + TIOCGSOFTCAR = 0x40047464 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x4004667f + TIOCLINUX = 0x541c + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGET = 0x4004746a + TIOCMIWAIT = 0x545c + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_LOOP = 0x8000 + TIOCM_OUT1 = 0x2000 + TIOCM_OUT2 = 0x4000 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007484 + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x80047401 + TIOCSIG = 0x80047488 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x80047482 + TIOCSPTLCK = 0x80047487 + TIOCSRS485 = 0xc0205442 + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x80047465 + TIOCSTART = 0x2000746e + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x20005437 + TOSTOP = 0x100 + TUNATTACHFILTER = 0x801054d5 + TUNDETACHFILTER = 0x801054d6 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x401054db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETDEBUG = 0x800454c9 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + VDISCARD = 0xd + VDSUSP = 0xb + VEOF = 0x4 + VEOL = 0x5 + VEOL2 = 0x6 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x4 + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WRAP = 0x20000 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XCASE = 0x4 + XTABS = 0x1800 + __TIOCFLUSH = 0x80047410 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EADV = syscall.Errno(0x53) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x25) + EBADE = syscall.Errno(0x66) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x5d) + EBADMSG = syscall.Errno(0x4c) + EBADR = syscall.Errno(0x67) + EBADRQC = syscall.Errno(0x6a) + EBADSLT = syscall.Errno(0x6b) + EBFONT = syscall.Errno(0x6d) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7f) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x5e) + ECOMM = syscall.Errno(0x55) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0x4e) + EDEADLOCK = syscall.Errno(0x6c) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x58) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EHWPOISON = syscall.Errno(0x87) + EIDRM = syscall.Errno(0x4d) + EILSEQ = syscall.Errno(0x7a) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x81) + EKEYREJECTED = syscall.Errno(0x83) + EKEYREVOKED = syscall.Errno(0x82) + EL2HLT = syscall.Errno(0x65) + EL2NSYNC = syscall.Errno(0x5f) + EL3HLT = syscall.Errno(0x60) + EL3RST = syscall.Errno(0x61) + ELIBACC = syscall.Errno(0x72) + ELIBBAD = syscall.Errno(0x70) + ELIBEXEC = syscall.Errno(0x6e) + ELIBMAX = syscall.Errno(0x7b) + ELIBSCN = syscall.Errno(0x7c) + ELNRNG = syscall.Errno(0x62) + ELOOP = syscall.Errno(0x3e) + EMEDIUMTYPE = syscall.Errno(0x7e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x57) + ENAMETOOLONG = syscall.Errno(0x3f) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x69) + ENOBUFS = syscall.Errno(0x37) + ENOCSI = syscall.Errno(0x64) + ENODATA = syscall.Errno(0x6f) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x80) + ENOLCK = syscall.Errno(0x4f) + ENOLINK = syscall.Errno(0x52) + ENOMEDIUM = syscall.Errno(0x7d) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x4b) + ENONET = syscall.Errno(0x50) + ENOPKG = syscall.Errno(0x71) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x4a) + ENOSTR = syscall.Errno(0x48) + ENOSYS = syscall.Errno(0x5a) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x85) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x73) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x5c) + EOWNERDEAD = syscall.Errno(0x84) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROTO = syscall.Errno(0x56) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x59) + EREMOTE = syscall.Errno(0x47) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x74) + ERFKILL = syscall.Errno(0x86) + EROFS = syscall.Errno(0x1e) + ERREMOTE = syscall.Errno(0x51) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x54) + ESTALE = syscall.Errno(0x46) + ESTRPIPE = syscall.Errno(0x5b) + ETIME = syscall.Errno(0x49) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x63) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x68) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGLOST = syscall.Signal(0x1d) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x17) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1d) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "no such device or address", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource temporarily unavailable", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device or resource busy", + 17: "file exists", + 18: "invalid cross-device link", + 19: "no such device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "numerical result out of range", + 36: "operation now in progress", + 37: "operation already in progress", + 38: "socket operation on non-socket", + 39: "destination address required", + 40: "message too long", + 41: "protocol wrong type for socket", + 42: "protocol not available", + 43: "protocol not supported", + 44: "socket type not supported", + 45: "operation not supported", + 46: "protocol family not supported", + 47: "address family not supported by protocol", + 48: "address already in use", + 49: "cannot assign requested address", + 50: "network is down", + 51: "network is unreachable", + 52: "network dropped connection on reset", + 53: "software caused connection abort", + 54: "connection reset by peer", + 55: "no buffer space available", + 56: "transport endpoint is already connected", + 57: "transport endpoint is not connected", + 58: "cannot send after transport endpoint shutdown", + 59: "too many references: cannot splice", + 60: "connection timed out", + 61: "connection refused", + 62: "too many levels of symbolic links", + 63: "file name too long", + 64: "host is down", + 65: "no route to host", + 66: "directory not empty", + 67: "too many processes", + 68: "too many users", + 69: "disk quota exceeded", + 70: "stale file handle", + 71: "object is remote", + 72: "device not a stream", + 73: "timer expired", + 74: "out of streams resources", + 75: "no message of desired type", + 76: "bad message", + 77: "identifier removed", + 78: "resource deadlock avoided", + 79: "no locks available", + 80: "machine is not on the network", + 81: "unknown error 81", + 82: "link has been severed", + 83: "advertise error", + 84: "srmount error", + 85: "communication error on send", + 86: "protocol error", + 87: "multihop attempted", + 88: "RFS specific error", + 89: "remote address changed", + 90: "function not implemented", + 91: "streams pipe error", + 92: "value too large for defined data type", + 93: "file descriptor in bad state", + 94: "channel number out of range", + 95: "level 2 not synchronized", + 96: "level 3 halted", + 97: "level 3 reset", + 98: "link number out of range", + 99: "protocol driver not attached", + 100: "no CSI structure available", + 101: "level 2 halted", + 102: "invalid exchange", + 103: "invalid request descriptor", + 104: "exchange full", + 105: "no anode", + 106: "invalid request code", + 107: "invalid slot", + 108: "file locking deadlock error", + 109: "bad font file format", + 110: "cannot exec a shared library directly", + 111: "no data available", + 112: "accessing a corrupted shared library", + 113: "package not installed", + 114: "can not access a needed shared library", + 115: "name not unique on network", + 116: "interrupted system call should be restarted", + 117: "structure needs cleaning", + 118: "not a XENIX named type file", + 119: "no XENIX semaphores available", + 120: "is a named type file", + 121: "remote I/O error", + 122: "invalid or incomplete multibyte or wide character", + 123: "attempting to link in too many shared libraries", + 124: ".lib section in a.out corrupted", + 125: "no medium found", + 126: "wrong medium type", + 127: "operation canceled", + 128: "required key not available", + 129: "key has expired", + 130: "key has been revoked", + 131: "key was rejected by service", + 132: "owner died", + 133: "state not recoverable", + 134: "operation not possible due to RF-kill", + 135: "memory page has hardware error", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/breakpoint trap", + 6: "aborted", + 7: "EMT trap", + 8: "floating point exception", + 9: "killed", + 10: "bus error", + 11: "segmentation fault", + 12: "bad system call", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "urgent I/O condition", + 17: "stopped (signal)", + 18: "stopped", + 19: "continued", + 20: "child exited", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "I/O possible", + 24: "CPU time limit exceeded", + 25: "file size limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window changed", + 29: "resource lost", + 30: "user defined signal 1", + 31: "user defined signal 2", +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go new file mode 100644 index 0000000..b4338d5 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go @@ -0,0 +1,1712 @@ +// mkerrors.sh -m32 +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build 386,netbsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m32 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_ARP = 0x1c + AF_BLUETOOTH = 0x1f + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x20 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x18 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x23 + AF_MPLS = 0x21 + AF_NATM = 0x1b + AF_NS = 0x6 + AF_OROUTE = 0x11 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x22 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + ARPHRD_ARCNET = 0x7 + ARPHRD_ETHER = 0x1 + ARPHRD_FRELAY = 0xf + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_STRIP = 0x17 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B460800 = 0x70800 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B921600 = 0xe1000 + B9600 = 0x2580 + BIOCFEEDBACK = 0x8004427d + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0084277 + BIOCGETIF = 0x4090426b + BIOCGFEEDBACK = 0x4004427c + BIOCGHDRCMPLT = 0x40044274 + BIOCGRTIMEOUT = 0x400c427b + BIOCGSEESENT = 0x40044278 + BIOCGSTATS = 0x4080426f + BIOCGSTATSOLD = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044276 + BIOCSETF = 0x80084267 + BIOCSETIF = 0x8090426c + BIOCSFEEDBACK = 0x8004427d + BIOCSHDRCMPLT = 0x80044275 + BIOCSRTIMEOUT = 0x800c427a + BIOCSSEESENT = 0x80044279 + BIOCSTCPF = 0x80084272 + BIOCSUDPF = 0x80084273 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALIGNMENT32 = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DFLTBUFSIZE = 0x100000 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x1000000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLONE_CSIGNAL = 0xff + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_PID = 0x1000 + CLONE_PTRACE = 0x2000 + CLONE_SIGHAND = 0x800 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CREAD = 0x800 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + CTL_QUERY = -0x2 + DIOCBSFLUSH = 0x20006478 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HDLC = 0x10 + DLT_HHDLC = 0x79 + DLT_HIPPI = 0xf + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0xe + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RAWAF_MASK = 0x2240000 + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xd + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EMUL_LINUX = 0x1 + EMUL_LINUX32 = 0x5 + EMUL_MAXID = 0x6 + EN_SW_CTL_INF = 0x1000 + EN_SW_CTL_PREC = 0x300 + EN_SW_CTL_ROUND = 0xc00 + EN_SW_DATACHAIN = 0x80 + EN_SW_DENORM = 0x2 + EN_SW_INVOP = 0x1 + EN_SW_OVERFLOW = 0x8 + EN_SW_PRECLOSS = 0x20 + EN_SW_UNDERFLOW = 0x10 + EN_SW_ZERODIV = 0x4 + ETHERCAP_JUMBO_MTU = 0x4 + ETHERCAP_VLAN_HWTAGGING = 0x2 + ETHERCAP_VLAN_MTU = 0x1 + ETHERMIN = 0x2e + ETHERMTU = 0x5dc + ETHERMTU_JUMBO = 0x2328 + ETHERTYPE_8023 = 0x4 + ETHERTYPE_AARP = 0x80f3 + ETHERTYPE_ACCTON = 0x8390 + ETHERTYPE_AEONIC = 0x8036 + ETHERTYPE_ALPHA = 0x814a + ETHERTYPE_AMBER = 0x6008 + ETHERTYPE_AMOEBA = 0x8145 + ETHERTYPE_APOLLO = 0x80f7 + ETHERTYPE_APOLLODOMAIN = 0x8019 + ETHERTYPE_APPLETALK = 0x809b + ETHERTYPE_APPLITEK = 0x80c7 + ETHERTYPE_ARGONAUT = 0x803a + ETHERTYPE_ARP = 0x806 + ETHERTYPE_AT = 0x809b + ETHERTYPE_ATALK = 0x809b + ETHERTYPE_ATOMIC = 0x86df + ETHERTYPE_ATT = 0x8069 + ETHERTYPE_ATTSTANFORD = 0x8008 + ETHERTYPE_AUTOPHON = 0x806a + ETHERTYPE_AXIS = 0x8856 + ETHERTYPE_BCLOOP = 0x9003 + ETHERTYPE_BOFL = 0x8102 + ETHERTYPE_CABLETRON = 0x7034 + ETHERTYPE_CHAOS = 0x804 + ETHERTYPE_COMDESIGN = 0x806c + ETHERTYPE_COMPUGRAPHIC = 0x806d + ETHERTYPE_COUNTERPOINT = 0x8062 + ETHERTYPE_CRONUS = 0x8004 + ETHERTYPE_CRONUSVLN = 0x8003 + ETHERTYPE_DCA = 0x1234 + ETHERTYPE_DDE = 0x807b + ETHERTYPE_DEBNI = 0xaaaa + ETHERTYPE_DECAM = 0x8048 + ETHERTYPE_DECCUST = 0x6006 + ETHERTYPE_DECDIAG = 0x6005 + ETHERTYPE_DECDNS = 0x803c + ETHERTYPE_DECDTS = 0x803e + ETHERTYPE_DECEXPER = 0x6000 + ETHERTYPE_DECLAST = 0x8041 + ETHERTYPE_DECLTM = 0x803f + ETHERTYPE_DECMUMPS = 0x6009 + ETHERTYPE_DECNETBIOS = 0x8040 + ETHERTYPE_DELTACON = 0x86de + ETHERTYPE_DIDDLE = 0x4321 + ETHERTYPE_DLOG1 = 0x660 + ETHERTYPE_DLOG2 = 0x661 + ETHERTYPE_DN = 0x6003 + ETHERTYPE_DOGFIGHT = 0x1989 + ETHERTYPE_DSMD = 0x8039 + ETHERTYPE_ECMA = 0x803 + ETHERTYPE_ENCRYPT = 0x803d + ETHERTYPE_ES = 0x805d + ETHERTYPE_EXCELAN = 0x8010 + ETHERTYPE_EXPERDATA = 0x8049 + ETHERTYPE_FLIP = 0x8146 + ETHERTYPE_FLOWCONTROL = 0x8808 + ETHERTYPE_FRARP = 0x808 + ETHERTYPE_GENDYN = 0x8068 + ETHERTYPE_HAYES = 0x8130 + ETHERTYPE_HIPPI_FP = 0x8180 + ETHERTYPE_HITACHI = 0x8820 + ETHERTYPE_HP = 0x8005 + ETHERTYPE_IEEEPUP = 0xa00 + ETHERTYPE_IEEEPUPAT = 0xa01 + ETHERTYPE_IMLBL = 0x4c42 + ETHERTYPE_IMLBLDIAG = 0x424c + ETHERTYPE_IP = 0x800 + ETHERTYPE_IPAS = 0x876c + ETHERTYPE_IPV6 = 0x86dd + ETHERTYPE_IPX = 0x8137 + ETHERTYPE_IPXNEW = 0x8037 + ETHERTYPE_KALPANA = 0x8582 + ETHERTYPE_LANBRIDGE = 0x8038 + ETHERTYPE_LANPROBE = 0x8888 + ETHERTYPE_LAT = 0x6004 + ETHERTYPE_LBACK = 0x9000 + ETHERTYPE_LITTLE = 0x8060 + ETHERTYPE_LOGICRAFT = 0x8148 + ETHERTYPE_LOOPBACK = 0x9000 + ETHERTYPE_MATRA = 0x807a + ETHERTYPE_MAX = 0xffff + ETHERTYPE_MERIT = 0x807c + ETHERTYPE_MICP = 0x873a + ETHERTYPE_MOPDL = 0x6001 + ETHERTYPE_MOPRC = 0x6002 + ETHERTYPE_MOTOROLA = 0x818d + ETHERTYPE_MPLS = 0x8847 + ETHERTYPE_MPLS_MCAST = 0x8848 + ETHERTYPE_MUMPS = 0x813f + ETHERTYPE_NBPCC = 0x3c04 + ETHERTYPE_NBPCLAIM = 0x3c09 + ETHERTYPE_NBPCLREQ = 0x3c05 + ETHERTYPE_NBPCLRSP = 0x3c06 + ETHERTYPE_NBPCREQ = 0x3c02 + ETHERTYPE_NBPCRSP = 0x3c03 + ETHERTYPE_NBPDG = 0x3c07 + ETHERTYPE_NBPDGB = 0x3c08 + ETHERTYPE_NBPDLTE = 0x3c0a + ETHERTYPE_NBPRAR = 0x3c0c + ETHERTYPE_NBPRAS = 0x3c0b + ETHERTYPE_NBPRST = 0x3c0d + ETHERTYPE_NBPSCD = 0x3c01 + ETHERTYPE_NBPVCD = 0x3c00 + ETHERTYPE_NBS = 0x802 + ETHERTYPE_NCD = 0x8149 + ETHERTYPE_NESTAR = 0x8006 + ETHERTYPE_NETBEUI = 0x8191 + ETHERTYPE_NOVELL = 0x8138 + ETHERTYPE_NS = 0x600 + ETHERTYPE_NSAT = 0x601 + ETHERTYPE_NSCOMPAT = 0x807 + ETHERTYPE_NTRAILER = 0x10 + ETHERTYPE_OS9 = 0x7007 + ETHERTYPE_OS9NET = 0x7009 + ETHERTYPE_PACER = 0x80c6 + ETHERTYPE_PAE = 0x888e + ETHERTYPE_PCS = 0x4242 + ETHERTYPE_PLANNING = 0x8044 + ETHERTYPE_PPP = 0x880b + ETHERTYPE_PPPOE = 0x8864 + ETHERTYPE_PPPOEDISC = 0x8863 + ETHERTYPE_PRIMENTS = 0x7031 + ETHERTYPE_PUP = 0x200 + ETHERTYPE_PUPAT = 0x200 + ETHERTYPE_RACAL = 0x7030 + ETHERTYPE_RATIONAL = 0x8150 + ETHERTYPE_RAWFR = 0x6559 + ETHERTYPE_RCL = 0x1995 + ETHERTYPE_RDP = 0x8739 + ETHERTYPE_RETIX = 0x80f2 + ETHERTYPE_REVARP = 0x8035 + ETHERTYPE_SCA = 0x6007 + ETHERTYPE_SECTRA = 0x86db + ETHERTYPE_SECUREDATA = 0x876d + ETHERTYPE_SGITW = 0x817e + ETHERTYPE_SG_BOUNCE = 0x8016 + ETHERTYPE_SG_DIAG = 0x8013 + ETHERTYPE_SG_NETGAMES = 0x8014 + ETHERTYPE_SG_RESV = 0x8015 + ETHERTYPE_SIMNET = 0x5208 + ETHERTYPE_SLOWPROTOCOLS = 0x8809 + ETHERTYPE_SNA = 0x80d5 + ETHERTYPE_SNMP = 0x814c + ETHERTYPE_SONIX = 0xfaf5 + ETHERTYPE_SPIDER = 0x809f + ETHERTYPE_SPRITE = 0x500 + ETHERTYPE_STP = 0x8181 + ETHERTYPE_TALARIS = 0x812b + ETHERTYPE_TALARISMC = 0x852b + ETHERTYPE_TCPCOMP = 0x876b + ETHERTYPE_TCPSM = 0x9002 + ETHERTYPE_TEC = 0x814f + ETHERTYPE_TIGAN = 0x802f + ETHERTYPE_TRAIL = 0x1000 + ETHERTYPE_TRANSETHER = 0x6558 + ETHERTYPE_TYMSHARE = 0x802e + ETHERTYPE_UBBST = 0x7005 + ETHERTYPE_UBDEBUG = 0x900 + ETHERTYPE_UBDIAGLOOP = 0x7002 + ETHERTYPE_UBDL = 0x7000 + ETHERTYPE_UBNIU = 0x7001 + ETHERTYPE_UBNMC = 0x7003 + ETHERTYPE_VALID = 0x1600 + ETHERTYPE_VARIAN = 0x80dd + ETHERTYPE_VAXELN = 0x803b + ETHERTYPE_VEECO = 0x8067 + ETHERTYPE_VEXP = 0x805b + ETHERTYPE_VGLAB = 0x8131 + ETHERTYPE_VINES = 0xbad + ETHERTYPE_VINESECHO = 0xbaf + ETHERTYPE_VINESLOOP = 0xbae + ETHERTYPE_VITAL = 0xff00 + ETHERTYPE_VLAN = 0x8100 + ETHERTYPE_VLTLMAN = 0x8080 + ETHERTYPE_VPROD = 0x805c + ETHERTYPE_VURESERVED = 0x8147 + ETHERTYPE_WATERLOO = 0x8130 + ETHERTYPE_WELLFLEET = 0x8103 + ETHERTYPE_X25 = 0x805 + ETHERTYPE_X75 = 0x801 + ETHERTYPE_XNSSM = 0x9001 + ETHERTYPE_XTP = 0x817d + ETHER_ADDR_LEN = 0x6 + ETHER_CRC_LEN = 0x4 + ETHER_CRC_POLY_BE = 0x4c11db6 + ETHER_CRC_POLY_LE = 0xedb88320 + ETHER_HDR_LEN = 0xe + ETHER_MAX_LEN = 0x5ee + ETHER_MAX_LEN_JUMBO = 0x233a + ETHER_MIN_LEN = 0x40 + ETHER_PPPOE_ENCAP_LEN = 0x8 + ETHER_TYPE_LEN = 0x2 + ETHER_VLAN_ENCAP_LEN = 0x4 + EVFILT_AIO = 0x2 + EVFILT_PROC = 0x4 + EVFILT_READ = 0x0 + EVFILT_SIGNAL = 0x5 + EVFILT_SYSCOUNT = 0x7 + EVFILT_TIMER = 0x6 + EVFILT_VNODE = 0x3 + EVFILT_WRITE = 0x1 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x100 + FLUSHO = 0x800000 + F_CLOSEM = 0xa + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0xc + F_FSCTL = -0x80000000 + F_FSDIRMASK = 0x70000000 + F_FSIN = 0x10000000 + F_FSINOUT = 0x30000000 + F_FSOUT = 0x20000000 + F_FSPRIV = 0x8000 + F_FSVOID = 0x40000000 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETNOSIGPIPE = 0xd + F_GETOWN = 0x5 + F_MAXFD = 0xb + F_OK = 0x0 + F_PARAM_MASK = 0xfff + F_PARAM_MAX = 0xfff + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETNOSIGPIPE = 0xe + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_WRLCK = 0x3 + HUPCL = 0x4000 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFA_ROUTE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x8f52 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf8 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ECONET = 0xce + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf2 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INFINIBAND = 0xc7 + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LINEGROUP = 0xd2 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PLC = 0xae + IFT_PON155 = 0xcf + IFT_PON622 = 0xd0 + IFT_POS = 0xab + IFT_PPP = 0x17 + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPATM = 0xc5 + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf1 + IFT_Q2931 = 0xc9 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SIPSIG = 0xcc + IFT_SIPTG = 0xcb + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_STF = 0xd7 + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TELINK = 0xc8 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VIRTUALTG = 0xca + IFT_VOICEDID = 0xd5 + IFT_VOICEEM = 0x64 + IFT_VOICEEMFGD = 0xd3 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFGDEANA = 0xd4 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERCABLE = 0xc6 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IPPROTO_AH = 0x33 + IPPROTO_CARP = 0x70 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPIP = 0x4 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IPV6_ICMP = 0x3a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MOBILE = 0x37 + IPPROTO_NONE = 0x3b + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_VRRP = 0x70 + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXPACKET = 0xffff + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_EF = 0x8000 + IP_ERRORMTU = 0x15 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x16 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINFRAGSIZE = 0x45 + IP_MINTTL = 0x18 + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVTTL = 0x17 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_TOS = 0x3 + IP_TTL = 0x4 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x6 + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_SPACEAVAIL = 0x5 + MADV_WILLNEED = 0x3 + MAP_ALIGNMENT_16MB = 0x18000000 + MAP_ALIGNMENT_1TB = 0x28000000 + MAP_ALIGNMENT_256TB = 0x30000000 + MAP_ALIGNMENT_4GB = 0x20000000 + MAP_ALIGNMENT_64KB = 0x10000000 + MAP_ALIGNMENT_64PB = 0x38000000 + MAP_ALIGNMENT_MASK = -0x1000000 + MAP_ALIGNMENT_SHIFT = 0x18 + MAP_ANON = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_INHERIT = 0x80 + MAP_INHERIT_COPY = 0x1 + MAP_INHERIT_DEFAULT = 0x1 + MAP_INHERIT_DONATE_COPY = 0x3 + MAP_INHERIT_NONE = 0x2 + MAP_INHERIT_SHARE = 0x0 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_STACK = 0x2000 + MAP_TRYFIXED = 0x400 + MAP_WIRED = 0x800 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MSG_BCAST = 0x100 + MSG_CMSG_CLOEXEC = 0x800 + MSG_CONTROLMBUF = 0x2000000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOR = 0x8 + MSG_IOVUSRSPACE = 0x4000000 + MSG_LENUSRSPACE = 0x8000000 + MSG_MCAST = 0x200 + MSG_NAMEMBUF = 0x1000000 + MSG_NBIO = 0x1000 + MSG_NOSIGNAL = 0x400 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_USERFLAGS = 0xffffff + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x4 + NAME_MAX = 0x1ff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x5 + NET_RT_MAXID = 0x6 + NET_RT_OIFLIST = 0x4 + NET_RT_OOIFLIST = 0x3 + NOFLSH = 0x80000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OFIOGETBMAP = 0xc004667a + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_ALT_IO = 0x40000 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x400000 + O_CREAT = 0x200 + O_DIRECT = 0x80000 + O_DIRECTORY = 0x200000 + O_DSYNC = 0x10000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_NOSIGPIPE = 0x1000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x20000 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PRI_IOFLUSH = 0x7c + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x8 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x9 + RTAX_NETMASK = 0x2 + RTAX_TAG = 0x8 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTA_TAG = 0x100 + RTF_ANNOUNCE = 0x20000 + RTF_BLACKHOLE = 0x1000 + RTF_CLONED = 0x2000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_MASK = 0x80 + RTF_MODIFIED = 0x20 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_REJECT = 0x8 + RTF_SRC = 0x10000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_CHGADDR = 0x15 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x11 + RTM_IFANNOUNCE = 0x10 + RTM_IFINFO = 0x14 + RTM_LLINFO_UPD = 0x13 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_OIFINFO = 0xf + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_OOIFINFO = 0xe + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_SETGATE = 0x12 + RTM_VERSION = 0x4 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x4 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x8 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80906931 + SIOCADDRT = 0x8030720a + SIOCAIFADDR = 0x8040691a + SIOCALIFADDR = 0x8118691c + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80906932 + SIOCDELRT = 0x8030720b + SIOCDIFADDR = 0x80906919 + SIOCDIFPHYADDR = 0x80906949 + SIOCDLIFADDR = 0x8118691e + SIOCGDRVSPEC = 0xc01c697b + SIOCGETPFSYNC = 0xc09069f8 + SIOCGETSGCNT = 0xc0147534 + SIOCGETVIFCNT = 0xc0147533 + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0906921 + SIOCGIFADDRPREF = 0xc0946920 + SIOCGIFALIAS = 0xc040691b + SIOCGIFBRDADDR = 0xc0906923 + SIOCGIFCAP = 0xc0206976 + SIOCGIFCONF = 0xc0086926 + SIOCGIFDATA = 0xc0946985 + SIOCGIFDLT = 0xc0906977 + SIOCGIFDSTADDR = 0xc0906922 + SIOCGIFFLAGS = 0xc0906911 + SIOCGIFGENERIC = 0xc090693a + SIOCGIFMEDIA = 0xc0286936 + SIOCGIFMETRIC = 0xc0906917 + SIOCGIFMTU = 0xc090697e + SIOCGIFNETMASK = 0xc0906925 + SIOCGIFPDSTADDR = 0xc0906948 + SIOCGIFPSRCADDR = 0xc0906947 + SIOCGLIFADDR = 0xc118691d + SIOCGLIFPHYADDR = 0xc118694b + SIOCGLINKSTR = 0xc01c6987 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGVH = 0xc0906983 + SIOCIFCREATE = 0x8090697a + SIOCIFDESTROY = 0x80906979 + SIOCIFGCLONERS = 0xc00c6978 + SIOCINITIFADDR = 0xc0446984 + SIOCSDRVSPEC = 0x801c697b + SIOCSETPFSYNC = 0x809069f7 + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8090690c + SIOCSIFADDRPREF = 0x8094691f + SIOCSIFBRDADDR = 0x80906913 + SIOCSIFCAP = 0x80206975 + SIOCSIFDSTADDR = 0x8090690e + SIOCSIFFLAGS = 0x80906910 + SIOCSIFGENERIC = 0x80906939 + SIOCSIFMEDIA = 0xc0906935 + SIOCSIFMETRIC = 0x80906918 + SIOCSIFMTU = 0x8090697f + SIOCSIFNETMASK = 0x80906916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSLIFPHYADDR = 0x8118694a + SIOCSLINKSTR = 0x801c6988 + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSVH = 0xc0906982 + SIOCZIFDATA = 0xc0946986 + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_FLAGS_MASK = 0xf0000000 + SOCK_NONBLOCK = 0x20000000 + SOCK_NOSIGPIPE = 0x40000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_NOHEADER = 0x100a + SO_NOSIGPIPE = 0x800 + SO_OOBINLINE = 0x100 + SO_OVERFLOWED = 0x1009 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x100c + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x100b + SO_TIMESTAMP = 0x2000 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SYSCTL_VERSION = 0x1000000 + SYSCTL_VERS_0 = 0x0 + SYSCTL_VERS_1 = 0x1000000 + SYSCTL_VERS_MASK = 0xff000000 + S_ARCH1 = 0x10000 + S_ARCH2 = 0x20000 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFWHT = 0xe000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + S_LOGIN_SET = 0x1 + TCIFLUSH = 0x1 + TCIOFLUSH = 0x3 + TCOFLUSH = 0x2 + TCP_CONGCTL = 0x20 + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x3 + TCP_KEEPINIT = 0x7 + TCP_KEEPINTVL = 0x5 + TCP_MAXBURST = 0x4 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x10 + TCP_MINMSS = 0xd8 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x400c7458 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLAG_CDTRCTS = 0x10 + TIOCFLAG_CLOCAL = 0x2 + TIOCFLAG_CRTSCTS = 0x4 + TIOCFLAG_MDMBUF = 0x8 + TIOCFLAG_SOFTCAR = 0x1 + TIOCFLUSH = 0x80047410 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGFLAGS = 0x4004745d + TIOCGLINED = 0x40207442 + TIOCGPGRP = 0x40047477 + TIOCGQSIZE = 0x40047481 + TIOCGRANTPT = 0x20007447 + TIOCGSID = 0x40047463 + TIOCGSIZE = 0x40087468 + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGET = 0x4004746a + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTMGET = 0x40287446 + TIOCPTSNAME = 0x40287448 + TIOCRCVFRAME = 0x80047445 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSFLAGS = 0x8004745c + TIOCSIG = 0x2000745f + TIOCSLINED = 0x80207443 + TIOCSPGRP = 0x80047476 + TIOCSQSIZE = 0x80047480 + TIOCSSIZE = 0x80087467 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x80047465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCUCNTL = 0x80047466 + TIOCXMTFRAME = 0x80047444 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WALL = 0x8 + WALLSIG = 0x8 + WALTSIG = 0x4 + WCLONE = 0x4 + WCOREFLAG = 0x80 + WNOHANG = 0x1 + WNOWAIT = 0x10000 + WNOZOMBIE = 0x20000 + WOPTSCHECKED = 0x40000 + WSTOPPED = 0x7f + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x58) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x57) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x52) + EILSEQ = syscall.Errno(0x55) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x60) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5e) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x5d) + ENOBUFS = syscall.Errno(0x37) + ENODATA = syscall.Errno(0x59) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x5f) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x53) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x5a) + ENOSTR = syscall.Errno(0x5b) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x56) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x54) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x60) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIME = syscall.Errno(0x5c) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x20) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "device not configured", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource deadlock avoided", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device busy", + 17: "file exists", + 18: "cross-device link", + 19: "operation not supported by device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "result too large or too small", + 35: "resource temporarily unavailable", + 36: "operation now in progress", + 37: "operation already in progress", + 38: "socket operation on non-socket", + 39: "destination address required", + 40: "message too long", + 41: "protocol wrong type for socket", + 42: "protocol option not available", + 43: "protocol not supported", + 44: "socket type not supported", + 45: "operation not supported", + 46: "protocol family not supported", + 47: "address family not supported by protocol family", + 48: "address already in use", + 49: "can't assign requested address", + 50: "network is down", + 51: "network is unreachable", + 52: "network dropped connection on reset", + 53: "software caused connection abort", + 54: "connection reset by peer", + 55: "no buffer space available", + 56: "socket is already connected", + 57: "socket is not connected", + 58: "can't send after socket shutdown", + 59: "too many references: can't splice", + 60: "connection timed out", + 61: "connection refused", + 62: "too many levels of symbolic links", + 63: "file name too long", + 64: "host is down", + 65: "no route to host", + 66: "directory not empty", + 67: "too many processes", + 68: "too many users", + 69: "disc quota exceeded", + 70: "stale NFS file handle", + 71: "too many levels of remote in path", + 72: "RPC struct is bad", + 73: "RPC version wrong", + 74: "RPC prog. not avail", + 75: "program version wrong", + 76: "bad procedure for program", + 77: "no locks available", + 78: "function not implemented", + 79: "inappropriate file type or format", + 80: "authentication error", + 81: "need authenticator", + 82: "identifier removed", + 83: "no message of desired type", + 84: "value too large to be stored in data type", + 85: "illegal byte sequence", + 86: "not supported", + 87: "operation Canceled", + 88: "bad or Corrupt message", + 89: "no message available", + 90: "no STREAM resources", + 91: "not a STREAM", + 92: "STREAM ioctl timeout", + 93: "attribute not found", + 94: "multihop attempted", + 95: "link has been severed", + 96: "protocol error", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/BPT trap", + 6: "abort trap", + 7: "EMT trap", + 8: "floating point exception", + 9: "killed", + 10: "bus error", + 11: "segmentation fault", + 12: "bad system call", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "urgent I/O condition", + 17: "stopped (signal)", + 18: "stopped", + 19: "continued", + 20: "child exited", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "I/O possible", + 24: "cputime limit exceeded", + 25: "filesize limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window size changes", + 29: "information request", + 30: "user defined signal 1", + 31: "user defined signal 2", + 32: "power fail/restart", +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go new file mode 100644 index 0000000..4994437 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go @@ -0,0 +1,1702 @@ +// mkerrors.sh -m64 +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build amd64,netbsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_ARP = 0x1c + AF_BLUETOOTH = 0x1f + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x20 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x18 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x23 + AF_MPLS = 0x21 + AF_NATM = 0x1b + AF_NS = 0x6 + AF_OROUTE = 0x11 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x22 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + ARPHRD_ARCNET = 0x7 + ARPHRD_ETHER = 0x1 + ARPHRD_FRELAY = 0xf + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_STRIP = 0x17 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B460800 = 0x70800 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B921600 = 0xe1000 + B9600 = 0x2580 + BIOCFEEDBACK = 0x8004427d + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0104277 + BIOCGETIF = 0x4090426b + BIOCGFEEDBACK = 0x4004427c + BIOCGHDRCMPLT = 0x40044274 + BIOCGRTIMEOUT = 0x4010427b + BIOCGSEESENT = 0x40044278 + BIOCGSTATS = 0x4080426f + BIOCGSTATSOLD = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044276 + BIOCSETF = 0x80104267 + BIOCSETIF = 0x8090426c + BIOCSFEEDBACK = 0x8004427d + BIOCSHDRCMPLT = 0x80044275 + BIOCSRTIMEOUT = 0x8010427a + BIOCSSEESENT = 0x80044279 + BIOCSTCPF = 0x80104272 + BIOCSUDPF = 0x80104273 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x8 + BPF_ALIGNMENT32 = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DFLTBUFSIZE = 0x100000 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x1000000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLONE_CSIGNAL = 0xff + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_PID = 0x1000 + CLONE_PTRACE = 0x2000 + CLONE_SIGHAND = 0x800 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CREAD = 0x800 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + CTL_QUERY = -0x2 + DIOCBSFLUSH = 0x20006478 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HDLC = 0x10 + DLT_HHDLC = 0x79 + DLT_HIPPI = 0xf + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0xe + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RAWAF_MASK = 0x2240000 + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xd + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EMUL_LINUX = 0x1 + EMUL_LINUX32 = 0x5 + EMUL_MAXID = 0x6 + ETHERCAP_JUMBO_MTU = 0x4 + ETHERCAP_VLAN_HWTAGGING = 0x2 + ETHERCAP_VLAN_MTU = 0x1 + ETHERMIN = 0x2e + ETHERMTU = 0x5dc + ETHERMTU_JUMBO = 0x2328 + ETHERTYPE_8023 = 0x4 + ETHERTYPE_AARP = 0x80f3 + ETHERTYPE_ACCTON = 0x8390 + ETHERTYPE_AEONIC = 0x8036 + ETHERTYPE_ALPHA = 0x814a + ETHERTYPE_AMBER = 0x6008 + ETHERTYPE_AMOEBA = 0x8145 + ETHERTYPE_APOLLO = 0x80f7 + ETHERTYPE_APOLLODOMAIN = 0x8019 + ETHERTYPE_APPLETALK = 0x809b + ETHERTYPE_APPLITEK = 0x80c7 + ETHERTYPE_ARGONAUT = 0x803a + ETHERTYPE_ARP = 0x806 + ETHERTYPE_AT = 0x809b + ETHERTYPE_ATALK = 0x809b + ETHERTYPE_ATOMIC = 0x86df + ETHERTYPE_ATT = 0x8069 + ETHERTYPE_ATTSTANFORD = 0x8008 + ETHERTYPE_AUTOPHON = 0x806a + ETHERTYPE_AXIS = 0x8856 + ETHERTYPE_BCLOOP = 0x9003 + ETHERTYPE_BOFL = 0x8102 + ETHERTYPE_CABLETRON = 0x7034 + ETHERTYPE_CHAOS = 0x804 + ETHERTYPE_COMDESIGN = 0x806c + ETHERTYPE_COMPUGRAPHIC = 0x806d + ETHERTYPE_COUNTERPOINT = 0x8062 + ETHERTYPE_CRONUS = 0x8004 + ETHERTYPE_CRONUSVLN = 0x8003 + ETHERTYPE_DCA = 0x1234 + ETHERTYPE_DDE = 0x807b + ETHERTYPE_DEBNI = 0xaaaa + ETHERTYPE_DECAM = 0x8048 + ETHERTYPE_DECCUST = 0x6006 + ETHERTYPE_DECDIAG = 0x6005 + ETHERTYPE_DECDNS = 0x803c + ETHERTYPE_DECDTS = 0x803e + ETHERTYPE_DECEXPER = 0x6000 + ETHERTYPE_DECLAST = 0x8041 + ETHERTYPE_DECLTM = 0x803f + ETHERTYPE_DECMUMPS = 0x6009 + ETHERTYPE_DECNETBIOS = 0x8040 + ETHERTYPE_DELTACON = 0x86de + ETHERTYPE_DIDDLE = 0x4321 + ETHERTYPE_DLOG1 = 0x660 + ETHERTYPE_DLOG2 = 0x661 + ETHERTYPE_DN = 0x6003 + ETHERTYPE_DOGFIGHT = 0x1989 + ETHERTYPE_DSMD = 0x8039 + ETHERTYPE_ECMA = 0x803 + ETHERTYPE_ENCRYPT = 0x803d + ETHERTYPE_ES = 0x805d + ETHERTYPE_EXCELAN = 0x8010 + ETHERTYPE_EXPERDATA = 0x8049 + ETHERTYPE_FLIP = 0x8146 + ETHERTYPE_FLOWCONTROL = 0x8808 + ETHERTYPE_FRARP = 0x808 + ETHERTYPE_GENDYN = 0x8068 + ETHERTYPE_HAYES = 0x8130 + ETHERTYPE_HIPPI_FP = 0x8180 + ETHERTYPE_HITACHI = 0x8820 + ETHERTYPE_HP = 0x8005 + ETHERTYPE_IEEEPUP = 0xa00 + ETHERTYPE_IEEEPUPAT = 0xa01 + ETHERTYPE_IMLBL = 0x4c42 + ETHERTYPE_IMLBLDIAG = 0x424c + ETHERTYPE_IP = 0x800 + ETHERTYPE_IPAS = 0x876c + ETHERTYPE_IPV6 = 0x86dd + ETHERTYPE_IPX = 0x8137 + ETHERTYPE_IPXNEW = 0x8037 + ETHERTYPE_KALPANA = 0x8582 + ETHERTYPE_LANBRIDGE = 0x8038 + ETHERTYPE_LANPROBE = 0x8888 + ETHERTYPE_LAT = 0x6004 + ETHERTYPE_LBACK = 0x9000 + ETHERTYPE_LITTLE = 0x8060 + ETHERTYPE_LOGICRAFT = 0x8148 + ETHERTYPE_LOOPBACK = 0x9000 + ETHERTYPE_MATRA = 0x807a + ETHERTYPE_MAX = 0xffff + ETHERTYPE_MERIT = 0x807c + ETHERTYPE_MICP = 0x873a + ETHERTYPE_MOPDL = 0x6001 + ETHERTYPE_MOPRC = 0x6002 + ETHERTYPE_MOTOROLA = 0x818d + ETHERTYPE_MPLS = 0x8847 + ETHERTYPE_MPLS_MCAST = 0x8848 + ETHERTYPE_MUMPS = 0x813f + ETHERTYPE_NBPCC = 0x3c04 + ETHERTYPE_NBPCLAIM = 0x3c09 + ETHERTYPE_NBPCLREQ = 0x3c05 + ETHERTYPE_NBPCLRSP = 0x3c06 + ETHERTYPE_NBPCREQ = 0x3c02 + ETHERTYPE_NBPCRSP = 0x3c03 + ETHERTYPE_NBPDG = 0x3c07 + ETHERTYPE_NBPDGB = 0x3c08 + ETHERTYPE_NBPDLTE = 0x3c0a + ETHERTYPE_NBPRAR = 0x3c0c + ETHERTYPE_NBPRAS = 0x3c0b + ETHERTYPE_NBPRST = 0x3c0d + ETHERTYPE_NBPSCD = 0x3c01 + ETHERTYPE_NBPVCD = 0x3c00 + ETHERTYPE_NBS = 0x802 + ETHERTYPE_NCD = 0x8149 + ETHERTYPE_NESTAR = 0x8006 + ETHERTYPE_NETBEUI = 0x8191 + ETHERTYPE_NOVELL = 0x8138 + ETHERTYPE_NS = 0x600 + ETHERTYPE_NSAT = 0x601 + ETHERTYPE_NSCOMPAT = 0x807 + ETHERTYPE_NTRAILER = 0x10 + ETHERTYPE_OS9 = 0x7007 + ETHERTYPE_OS9NET = 0x7009 + ETHERTYPE_PACER = 0x80c6 + ETHERTYPE_PAE = 0x888e + ETHERTYPE_PCS = 0x4242 + ETHERTYPE_PLANNING = 0x8044 + ETHERTYPE_PPP = 0x880b + ETHERTYPE_PPPOE = 0x8864 + ETHERTYPE_PPPOEDISC = 0x8863 + ETHERTYPE_PRIMENTS = 0x7031 + ETHERTYPE_PUP = 0x200 + ETHERTYPE_PUPAT = 0x200 + ETHERTYPE_RACAL = 0x7030 + ETHERTYPE_RATIONAL = 0x8150 + ETHERTYPE_RAWFR = 0x6559 + ETHERTYPE_RCL = 0x1995 + ETHERTYPE_RDP = 0x8739 + ETHERTYPE_RETIX = 0x80f2 + ETHERTYPE_REVARP = 0x8035 + ETHERTYPE_SCA = 0x6007 + ETHERTYPE_SECTRA = 0x86db + ETHERTYPE_SECUREDATA = 0x876d + ETHERTYPE_SGITW = 0x817e + ETHERTYPE_SG_BOUNCE = 0x8016 + ETHERTYPE_SG_DIAG = 0x8013 + ETHERTYPE_SG_NETGAMES = 0x8014 + ETHERTYPE_SG_RESV = 0x8015 + ETHERTYPE_SIMNET = 0x5208 + ETHERTYPE_SLOWPROTOCOLS = 0x8809 + ETHERTYPE_SNA = 0x80d5 + ETHERTYPE_SNMP = 0x814c + ETHERTYPE_SONIX = 0xfaf5 + ETHERTYPE_SPIDER = 0x809f + ETHERTYPE_SPRITE = 0x500 + ETHERTYPE_STP = 0x8181 + ETHERTYPE_TALARIS = 0x812b + ETHERTYPE_TALARISMC = 0x852b + ETHERTYPE_TCPCOMP = 0x876b + ETHERTYPE_TCPSM = 0x9002 + ETHERTYPE_TEC = 0x814f + ETHERTYPE_TIGAN = 0x802f + ETHERTYPE_TRAIL = 0x1000 + ETHERTYPE_TRANSETHER = 0x6558 + ETHERTYPE_TYMSHARE = 0x802e + ETHERTYPE_UBBST = 0x7005 + ETHERTYPE_UBDEBUG = 0x900 + ETHERTYPE_UBDIAGLOOP = 0x7002 + ETHERTYPE_UBDL = 0x7000 + ETHERTYPE_UBNIU = 0x7001 + ETHERTYPE_UBNMC = 0x7003 + ETHERTYPE_VALID = 0x1600 + ETHERTYPE_VARIAN = 0x80dd + ETHERTYPE_VAXELN = 0x803b + ETHERTYPE_VEECO = 0x8067 + ETHERTYPE_VEXP = 0x805b + ETHERTYPE_VGLAB = 0x8131 + ETHERTYPE_VINES = 0xbad + ETHERTYPE_VINESECHO = 0xbaf + ETHERTYPE_VINESLOOP = 0xbae + ETHERTYPE_VITAL = 0xff00 + ETHERTYPE_VLAN = 0x8100 + ETHERTYPE_VLTLMAN = 0x8080 + ETHERTYPE_VPROD = 0x805c + ETHERTYPE_VURESERVED = 0x8147 + ETHERTYPE_WATERLOO = 0x8130 + ETHERTYPE_WELLFLEET = 0x8103 + ETHERTYPE_X25 = 0x805 + ETHERTYPE_X75 = 0x801 + ETHERTYPE_XNSSM = 0x9001 + ETHERTYPE_XTP = 0x817d + ETHER_ADDR_LEN = 0x6 + ETHER_CRC_LEN = 0x4 + ETHER_CRC_POLY_BE = 0x4c11db6 + ETHER_CRC_POLY_LE = 0xedb88320 + ETHER_HDR_LEN = 0xe + ETHER_MAX_LEN = 0x5ee + ETHER_MAX_LEN_JUMBO = 0x233a + ETHER_MIN_LEN = 0x40 + ETHER_PPPOE_ENCAP_LEN = 0x8 + ETHER_TYPE_LEN = 0x2 + ETHER_VLAN_ENCAP_LEN = 0x4 + EVFILT_AIO = 0x2 + EVFILT_PROC = 0x4 + EVFILT_READ = 0x0 + EVFILT_SIGNAL = 0x5 + EVFILT_SYSCOUNT = 0x7 + EVFILT_TIMER = 0x6 + EVFILT_VNODE = 0x3 + EVFILT_WRITE = 0x1 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x100 + FLUSHO = 0x800000 + F_CLOSEM = 0xa + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0xc + F_FSCTL = -0x80000000 + F_FSDIRMASK = 0x70000000 + F_FSIN = 0x10000000 + F_FSINOUT = 0x30000000 + F_FSOUT = 0x20000000 + F_FSPRIV = 0x8000 + F_FSVOID = 0x40000000 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETNOSIGPIPE = 0xd + F_GETOWN = 0x5 + F_MAXFD = 0xb + F_OK = 0x0 + F_PARAM_MASK = 0xfff + F_PARAM_MAX = 0xfff + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETNOSIGPIPE = 0xe + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_WRLCK = 0x3 + HUPCL = 0x4000 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFA_ROUTE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x8f52 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf8 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ECONET = 0xce + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf2 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INFINIBAND = 0xc7 + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LINEGROUP = 0xd2 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PLC = 0xae + IFT_PON155 = 0xcf + IFT_PON622 = 0xd0 + IFT_POS = 0xab + IFT_PPP = 0x17 + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPATM = 0xc5 + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf1 + IFT_Q2931 = 0xc9 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SIPSIG = 0xcc + IFT_SIPTG = 0xcb + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_STF = 0xd7 + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TELINK = 0xc8 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VIRTUALTG = 0xca + IFT_VOICEDID = 0xd5 + IFT_VOICEEM = 0x64 + IFT_VOICEEMFGD = 0xd3 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFGDEANA = 0xd4 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERCABLE = 0xc6 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IPPROTO_AH = 0x33 + IPPROTO_CARP = 0x70 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPIP = 0x4 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IPV6_ICMP = 0x3a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MOBILE = 0x37 + IPPROTO_NONE = 0x3b + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_VRRP = 0x70 + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXPACKET = 0xffff + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_EF = 0x8000 + IP_ERRORMTU = 0x15 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x16 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINFRAGSIZE = 0x45 + IP_MINTTL = 0x18 + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVTTL = 0x17 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_TOS = 0x3 + IP_TTL = 0x4 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x6 + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_SPACEAVAIL = 0x5 + MADV_WILLNEED = 0x3 + MAP_ALIGNMENT_16MB = 0x18000000 + MAP_ALIGNMENT_1TB = 0x28000000 + MAP_ALIGNMENT_256TB = 0x30000000 + MAP_ALIGNMENT_4GB = 0x20000000 + MAP_ALIGNMENT_64KB = 0x10000000 + MAP_ALIGNMENT_64PB = 0x38000000 + MAP_ALIGNMENT_MASK = -0x1000000 + MAP_ALIGNMENT_SHIFT = 0x18 + MAP_ANON = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_INHERIT = 0x80 + MAP_INHERIT_COPY = 0x1 + MAP_INHERIT_DEFAULT = 0x1 + MAP_INHERIT_DONATE_COPY = 0x3 + MAP_INHERIT_NONE = 0x2 + MAP_INHERIT_SHARE = 0x0 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_STACK = 0x2000 + MAP_TRYFIXED = 0x400 + MAP_WIRED = 0x800 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MSG_BCAST = 0x100 + MSG_CMSG_CLOEXEC = 0x800 + MSG_CONTROLMBUF = 0x2000000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOR = 0x8 + MSG_IOVUSRSPACE = 0x4000000 + MSG_LENUSRSPACE = 0x8000000 + MSG_MCAST = 0x200 + MSG_NAMEMBUF = 0x1000000 + MSG_NBIO = 0x1000 + MSG_NOSIGNAL = 0x400 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_USERFLAGS = 0xffffff + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x4 + NAME_MAX = 0x1ff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x5 + NET_RT_MAXID = 0x6 + NET_RT_OIFLIST = 0x4 + NET_RT_OOIFLIST = 0x3 + NOFLSH = 0x80000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OFIOGETBMAP = 0xc004667a + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_ALT_IO = 0x40000 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x400000 + O_CREAT = 0x200 + O_DIRECT = 0x80000 + O_DIRECTORY = 0x200000 + O_DSYNC = 0x10000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_NOSIGPIPE = 0x1000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x20000 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PRI_IOFLUSH = 0x7c + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x8 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x9 + RTAX_NETMASK = 0x2 + RTAX_TAG = 0x8 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTA_TAG = 0x100 + RTF_ANNOUNCE = 0x20000 + RTF_BLACKHOLE = 0x1000 + RTF_CLONED = 0x2000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_MASK = 0x80 + RTF_MODIFIED = 0x20 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_REJECT = 0x8 + RTF_SRC = 0x10000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_CHGADDR = 0x15 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x11 + RTM_IFANNOUNCE = 0x10 + RTM_IFINFO = 0x14 + RTM_LLINFO_UPD = 0x13 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_OIFINFO = 0xf + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_OOIFINFO = 0xe + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_SETGATE = 0x12 + RTM_VERSION = 0x4 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x4 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x8 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80906931 + SIOCADDRT = 0x8038720a + SIOCAIFADDR = 0x8040691a + SIOCALIFADDR = 0x8118691c + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80906932 + SIOCDELRT = 0x8038720b + SIOCDIFADDR = 0x80906919 + SIOCDIFPHYADDR = 0x80906949 + SIOCDLIFADDR = 0x8118691e + SIOCGDRVSPEC = 0xc028697b + SIOCGETPFSYNC = 0xc09069f8 + SIOCGETSGCNT = 0xc0207534 + SIOCGETVIFCNT = 0xc0287533 + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0906921 + SIOCGIFADDRPREF = 0xc0986920 + SIOCGIFALIAS = 0xc040691b + SIOCGIFBRDADDR = 0xc0906923 + SIOCGIFCAP = 0xc0206976 + SIOCGIFCONF = 0xc0106926 + SIOCGIFDATA = 0xc0986985 + SIOCGIFDLT = 0xc0906977 + SIOCGIFDSTADDR = 0xc0906922 + SIOCGIFFLAGS = 0xc0906911 + SIOCGIFGENERIC = 0xc090693a + SIOCGIFMEDIA = 0xc0306936 + SIOCGIFMETRIC = 0xc0906917 + SIOCGIFMTU = 0xc090697e + SIOCGIFNETMASK = 0xc0906925 + SIOCGIFPDSTADDR = 0xc0906948 + SIOCGIFPSRCADDR = 0xc0906947 + SIOCGLIFADDR = 0xc118691d + SIOCGLIFPHYADDR = 0xc118694b + SIOCGLINKSTR = 0xc0286987 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGVH = 0xc0906983 + SIOCIFCREATE = 0x8090697a + SIOCIFDESTROY = 0x80906979 + SIOCIFGCLONERS = 0xc0106978 + SIOCINITIFADDR = 0xc0706984 + SIOCSDRVSPEC = 0x8028697b + SIOCSETPFSYNC = 0x809069f7 + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8090690c + SIOCSIFADDRPREF = 0x8098691f + SIOCSIFBRDADDR = 0x80906913 + SIOCSIFCAP = 0x80206975 + SIOCSIFDSTADDR = 0x8090690e + SIOCSIFFLAGS = 0x80906910 + SIOCSIFGENERIC = 0x80906939 + SIOCSIFMEDIA = 0xc0906935 + SIOCSIFMETRIC = 0x80906918 + SIOCSIFMTU = 0x8090697f + SIOCSIFNETMASK = 0x80906916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSLIFPHYADDR = 0x8118694a + SIOCSLINKSTR = 0x80286988 + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSVH = 0xc0906982 + SIOCZIFDATA = 0xc0986986 + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_FLAGS_MASK = 0xf0000000 + SOCK_NONBLOCK = 0x20000000 + SOCK_NOSIGPIPE = 0x40000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_NOHEADER = 0x100a + SO_NOSIGPIPE = 0x800 + SO_OOBINLINE = 0x100 + SO_OVERFLOWED = 0x1009 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x100c + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x100b + SO_TIMESTAMP = 0x2000 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SYSCTL_VERSION = 0x1000000 + SYSCTL_VERS_0 = 0x0 + SYSCTL_VERS_1 = 0x1000000 + SYSCTL_VERS_MASK = 0xff000000 + S_ARCH1 = 0x10000 + S_ARCH2 = 0x20000 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFWHT = 0xe000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + S_LOGIN_SET = 0x1 + TCIFLUSH = 0x1 + TCIOFLUSH = 0x3 + TCOFLUSH = 0x2 + TCP_CONGCTL = 0x20 + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x3 + TCP_KEEPINIT = 0x7 + TCP_KEEPINTVL = 0x5 + TCP_MAXBURST = 0x4 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x10 + TCP_MINMSS = 0xd8 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x40107458 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLAG_CDTRCTS = 0x10 + TIOCFLAG_CLOCAL = 0x2 + TIOCFLAG_CRTSCTS = 0x4 + TIOCFLAG_MDMBUF = 0x8 + TIOCFLAG_SOFTCAR = 0x1 + TIOCFLUSH = 0x80047410 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGFLAGS = 0x4004745d + TIOCGLINED = 0x40207442 + TIOCGPGRP = 0x40047477 + TIOCGQSIZE = 0x40047481 + TIOCGRANTPT = 0x20007447 + TIOCGSID = 0x40047463 + TIOCGSIZE = 0x40087468 + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGET = 0x4004746a + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTMGET = 0x40287446 + TIOCPTSNAME = 0x40287448 + TIOCRCVFRAME = 0x80087445 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSFLAGS = 0x8004745c + TIOCSIG = 0x2000745f + TIOCSLINED = 0x80207443 + TIOCSPGRP = 0x80047476 + TIOCSQSIZE = 0x80047480 + TIOCSSIZE = 0x80087467 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x80047465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCUCNTL = 0x80047466 + TIOCXMTFRAME = 0x80087444 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WALL = 0x8 + WALLSIG = 0x8 + WALTSIG = 0x4 + WCLONE = 0x4 + WCOREFLAG = 0x80 + WNOHANG = 0x1 + WNOWAIT = 0x10000 + WNOZOMBIE = 0x20000 + WOPTSCHECKED = 0x40000 + WSTOPPED = 0x7f + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x58) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x57) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x52) + EILSEQ = syscall.Errno(0x55) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x60) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5e) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x5d) + ENOBUFS = syscall.Errno(0x37) + ENODATA = syscall.Errno(0x59) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x5f) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x53) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x5a) + ENOSTR = syscall.Errno(0x5b) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x56) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x54) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x60) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIME = syscall.Errno(0x5c) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x20) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "device not configured", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource deadlock avoided", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device busy", + 17: "file exists", + 18: "cross-device link", + 19: "operation not supported by device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "result too large or too small", + 35: "resource temporarily unavailable", + 36: "operation now in progress", + 37: "operation already in progress", + 38: "socket operation on non-socket", + 39: "destination address required", + 40: "message too long", + 41: "protocol wrong type for socket", + 42: "protocol option not available", + 43: "protocol not supported", + 44: "socket type not supported", + 45: "operation not supported", + 46: "protocol family not supported", + 47: "address family not supported by protocol family", + 48: "address already in use", + 49: "can't assign requested address", + 50: "network is down", + 51: "network is unreachable", + 52: "network dropped connection on reset", + 53: "software caused connection abort", + 54: "connection reset by peer", + 55: "no buffer space available", + 56: "socket is already connected", + 57: "socket is not connected", + 58: "can't send after socket shutdown", + 59: "too many references: can't splice", + 60: "connection timed out", + 61: "connection refused", + 62: "too many levels of symbolic links", + 63: "file name too long", + 64: "host is down", + 65: "no route to host", + 66: "directory not empty", + 67: "too many processes", + 68: "too many users", + 69: "disc quota exceeded", + 70: "stale NFS file handle", + 71: "too many levels of remote in path", + 72: "RPC struct is bad", + 73: "RPC version wrong", + 74: "RPC prog. not avail", + 75: "program version wrong", + 76: "bad procedure for program", + 77: "no locks available", + 78: "function not implemented", + 79: "inappropriate file type or format", + 80: "authentication error", + 81: "need authenticator", + 82: "identifier removed", + 83: "no message of desired type", + 84: "value too large to be stored in data type", + 85: "illegal byte sequence", + 86: "not supported", + 87: "operation Canceled", + 88: "bad or Corrupt message", + 89: "no message available", + 90: "no STREAM resources", + 91: "not a STREAM", + 92: "STREAM ioctl timeout", + 93: "attribute not found", + 94: "multihop attempted", + 95: "link has been severed", + 96: "protocol error", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/BPT trap", + 6: "abort trap", + 7: "EMT trap", + 8: "floating point exception", + 9: "killed", + 10: "bus error", + 11: "segmentation fault", + 12: "bad system call", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "urgent I/O condition", + 17: "stopped (signal)", + 18: "stopped", + 19: "continued", + 20: "child exited", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "I/O possible", + 24: "cputime limit exceeded", + 25: "filesize limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window size changes", + 29: "information request", + 30: "user defined signal 1", + 31: "user defined signal 2", + 32: "power fail/restart", +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go new file mode 100644 index 0000000..206c75f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go @@ -0,0 +1,1691 @@ +// mkerrors.sh -marm +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build arm,netbsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -marm _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_ARP = 0x1c + AF_BLUETOOTH = 0x1f + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x20 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x18 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x23 + AF_MPLS = 0x21 + AF_NATM = 0x1b + AF_NS = 0x6 + AF_OROUTE = 0x11 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x22 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + ARPHRD_ARCNET = 0x7 + ARPHRD_ETHER = 0x1 + ARPHRD_FRELAY = 0xf + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_STRIP = 0x17 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B460800 = 0x70800 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B921600 = 0xe1000 + B9600 = 0x2580 + BIOCFEEDBACK = 0x8004427d + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0084277 + BIOCGETIF = 0x4090426b + BIOCGFEEDBACK = 0x4004427c + BIOCGHDRCMPLT = 0x40044274 + BIOCGRTIMEOUT = 0x400c427b + BIOCGSEESENT = 0x40044278 + BIOCGSTATS = 0x4080426f + BIOCGSTATSOLD = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044276 + BIOCSETF = 0x80084267 + BIOCSETIF = 0x8090426c + BIOCSFEEDBACK = 0x8004427d + BIOCSHDRCMPLT = 0x80044275 + BIOCSRTIMEOUT = 0x800c427a + BIOCSSEESENT = 0x80044279 + BIOCSTCPF = 0x80084272 + BIOCSUDPF = 0x80084273 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALIGNMENT32 = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DFLTBUFSIZE = 0x100000 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x1000000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CREAD = 0x800 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + CTL_QUERY = -0x2 + DIOCBSFLUSH = 0x20006478 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HDLC = 0x10 + DLT_HHDLC = 0x79 + DLT_HIPPI = 0xf + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0xe + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RAWAF_MASK = 0x2240000 + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xd + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EMUL_LINUX = 0x1 + EMUL_LINUX32 = 0x5 + EMUL_MAXID = 0x6 + ETHERCAP_JUMBO_MTU = 0x4 + ETHERCAP_VLAN_HWTAGGING = 0x2 + ETHERCAP_VLAN_MTU = 0x1 + ETHERMIN = 0x2e + ETHERMTU = 0x5dc + ETHERMTU_JUMBO = 0x2328 + ETHERTYPE_8023 = 0x4 + ETHERTYPE_AARP = 0x80f3 + ETHERTYPE_ACCTON = 0x8390 + ETHERTYPE_AEONIC = 0x8036 + ETHERTYPE_ALPHA = 0x814a + ETHERTYPE_AMBER = 0x6008 + ETHERTYPE_AMOEBA = 0x8145 + ETHERTYPE_APOLLO = 0x80f7 + ETHERTYPE_APOLLODOMAIN = 0x8019 + ETHERTYPE_APPLETALK = 0x809b + ETHERTYPE_APPLITEK = 0x80c7 + ETHERTYPE_ARGONAUT = 0x803a + ETHERTYPE_ARP = 0x806 + ETHERTYPE_AT = 0x809b + ETHERTYPE_ATALK = 0x809b + ETHERTYPE_ATOMIC = 0x86df + ETHERTYPE_ATT = 0x8069 + ETHERTYPE_ATTSTANFORD = 0x8008 + ETHERTYPE_AUTOPHON = 0x806a + ETHERTYPE_AXIS = 0x8856 + ETHERTYPE_BCLOOP = 0x9003 + ETHERTYPE_BOFL = 0x8102 + ETHERTYPE_CABLETRON = 0x7034 + ETHERTYPE_CHAOS = 0x804 + ETHERTYPE_COMDESIGN = 0x806c + ETHERTYPE_COMPUGRAPHIC = 0x806d + ETHERTYPE_COUNTERPOINT = 0x8062 + ETHERTYPE_CRONUS = 0x8004 + ETHERTYPE_CRONUSVLN = 0x8003 + ETHERTYPE_DCA = 0x1234 + ETHERTYPE_DDE = 0x807b + ETHERTYPE_DEBNI = 0xaaaa + ETHERTYPE_DECAM = 0x8048 + ETHERTYPE_DECCUST = 0x6006 + ETHERTYPE_DECDIAG = 0x6005 + ETHERTYPE_DECDNS = 0x803c + ETHERTYPE_DECDTS = 0x803e + ETHERTYPE_DECEXPER = 0x6000 + ETHERTYPE_DECLAST = 0x8041 + ETHERTYPE_DECLTM = 0x803f + ETHERTYPE_DECMUMPS = 0x6009 + ETHERTYPE_DECNETBIOS = 0x8040 + ETHERTYPE_DELTACON = 0x86de + ETHERTYPE_DIDDLE = 0x4321 + ETHERTYPE_DLOG1 = 0x660 + ETHERTYPE_DLOG2 = 0x661 + ETHERTYPE_DN = 0x6003 + ETHERTYPE_DOGFIGHT = 0x1989 + ETHERTYPE_DSMD = 0x8039 + ETHERTYPE_ECMA = 0x803 + ETHERTYPE_ENCRYPT = 0x803d + ETHERTYPE_ES = 0x805d + ETHERTYPE_EXCELAN = 0x8010 + ETHERTYPE_EXPERDATA = 0x8049 + ETHERTYPE_FLIP = 0x8146 + ETHERTYPE_FLOWCONTROL = 0x8808 + ETHERTYPE_FRARP = 0x808 + ETHERTYPE_GENDYN = 0x8068 + ETHERTYPE_HAYES = 0x8130 + ETHERTYPE_HIPPI_FP = 0x8180 + ETHERTYPE_HITACHI = 0x8820 + ETHERTYPE_HP = 0x8005 + ETHERTYPE_IEEEPUP = 0xa00 + ETHERTYPE_IEEEPUPAT = 0xa01 + ETHERTYPE_IMLBL = 0x4c42 + ETHERTYPE_IMLBLDIAG = 0x424c + ETHERTYPE_IP = 0x800 + ETHERTYPE_IPAS = 0x876c + ETHERTYPE_IPV6 = 0x86dd + ETHERTYPE_IPX = 0x8137 + ETHERTYPE_IPXNEW = 0x8037 + ETHERTYPE_KALPANA = 0x8582 + ETHERTYPE_LANBRIDGE = 0x8038 + ETHERTYPE_LANPROBE = 0x8888 + ETHERTYPE_LAT = 0x6004 + ETHERTYPE_LBACK = 0x9000 + ETHERTYPE_LITTLE = 0x8060 + ETHERTYPE_LOGICRAFT = 0x8148 + ETHERTYPE_LOOPBACK = 0x9000 + ETHERTYPE_MATRA = 0x807a + ETHERTYPE_MAX = 0xffff + ETHERTYPE_MERIT = 0x807c + ETHERTYPE_MICP = 0x873a + ETHERTYPE_MOPDL = 0x6001 + ETHERTYPE_MOPRC = 0x6002 + ETHERTYPE_MOTOROLA = 0x818d + ETHERTYPE_MPLS = 0x8847 + ETHERTYPE_MPLS_MCAST = 0x8848 + ETHERTYPE_MUMPS = 0x813f + ETHERTYPE_NBPCC = 0x3c04 + ETHERTYPE_NBPCLAIM = 0x3c09 + ETHERTYPE_NBPCLREQ = 0x3c05 + ETHERTYPE_NBPCLRSP = 0x3c06 + ETHERTYPE_NBPCREQ = 0x3c02 + ETHERTYPE_NBPCRSP = 0x3c03 + ETHERTYPE_NBPDG = 0x3c07 + ETHERTYPE_NBPDGB = 0x3c08 + ETHERTYPE_NBPDLTE = 0x3c0a + ETHERTYPE_NBPRAR = 0x3c0c + ETHERTYPE_NBPRAS = 0x3c0b + ETHERTYPE_NBPRST = 0x3c0d + ETHERTYPE_NBPSCD = 0x3c01 + ETHERTYPE_NBPVCD = 0x3c00 + ETHERTYPE_NBS = 0x802 + ETHERTYPE_NCD = 0x8149 + ETHERTYPE_NESTAR = 0x8006 + ETHERTYPE_NETBEUI = 0x8191 + ETHERTYPE_NOVELL = 0x8138 + ETHERTYPE_NS = 0x600 + ETHERTYPE_NSAT = 0x601 + ETHERTYPE_NSCOMPAT = 0x807 + ETHERTYPE_NTRAILER = 0x10 + ETHERTYPE_OS9 = 0x7007 + ETHERTYPE_OS9NET = 0x7009 + ETHERTYPE_PACER = 0x80c6 + ETHERTYPE_PAE = 0x888e + ETHERTYPE_PCS = 0x4242 + ETHERTYPE_PLANNING = 0x8044 + ETHERTYPE_PPP = 0x880b + ETHERTYPE_PPPOE = 0x8864 + ETHERTYPE_PPPOEDISC = 0x8863 + ETHERTYPE_PRIMENTS = 0x7031 + ETHERTYPE_PUP = 0x200 + ETHERTYPE_PUPAT = 0x200 + ETHERTYPE_RACAL = 0x7030 + ETHERTYPE_RATIONAL = 0x8150 + ETHERTYPE_RAWFR = 0x6559 + ETHERTYPE_RCL = 0x1995 + ETHERTYPE_RDP = 0x8739 + ETHERTYPE_RETIX = 0x80f2 + ETHERTYPE_REVARP = 0x8035 + ETHERTYPE_SCA = 0x6007 + ETHERTYPE_SECTRA = 0x86db + ETHERTYPE_SECUREDATA = 0x876d + ETHERTYPE_SGITW = 0x817e + ETHERTYPE_SG_BOUNCE = 0x8016 + ETHERTYPE_SG_DIAG = 0x8013 + ETHERTYPE_SG_NETGAMES = 0x8014 + ETHERTYPE_SG_RESV = 0x8015 + ETHERTYPE_SIMNET = 0x5208 + ETHERTYPE_SLOWPROTOCOLS = 0x8809 + ETHERTYPE_SNA = 0x80d5 + ETHERTYPE_SNMP = 0x814c + ETHERTYPE_SONIX = 0xfaf5 + ETHERTYPE_SPIDER = 0x809f + ETHERTYPE_SPRITE = 0x500 + ETHERTYPE_STP = 0x8181 + ETHERTYPE_TALARIS = 0x812b + ETHERTYPE_TALARISMC = 0x852b + ETHERTYPE_TCPCOMP = 0x876b + ETHERTYPE_TCPSM = 0x9002 + ETHERTYPE_TEC = 0x814f + ETHERTYPE_TIGAN = 0x802f + ETHERTYPE_TRAIL = 0x1000 + ETHERTYPE_TRANSETHER = 0x6558 + ETHERTYPE_TYMSHARE = 0x802e + ETHERTYPE_UBBST = 0x7005 + ETHERTYPE_UBDEBUG = 0x900 + ETHERTYPE_UBDIAGLOOP = 0x7002 + ETHERTYPE_UBDL = 0x7000 + ETHERTYPE_UBNIU = 0x7001 + ETHERTYPE_UBNMC = 0x7003 + ETHERTYPE_VALID = 0x1600 + ETHERTYPE_VARIAN = 0x80dd + ETHERTYPE_VAXELN = 0x803b + ETHERTYPE_VEECO = 0x8067 + ETHERTYPE_VEXP = 0x805b + ETHERTYPE_VGLAB = 0x8131 + ETHERTYPE_VINES = 0xbad + ETHERTYPE_VINESECHO = 0xbaf + ETHERTYPE_VINESLOOP = 0xbae + ETHERTYPE_VITAL = 0xff00 + ETHERTYPE_VLAN = 0x8100 + ETHERTYPE_VLTLMAN = 0x8080 + ETHERTYPE_VPROD = 0x805c + ETHERTYPE_VURESERVED = 0x8147 + ETHERTYPE_WATERLOO = 0x8130 + ETHERTYPE_WELLFLEET = 0x8103 + ETHERTYPE_X25 = 0x805 + ETHERTYPE_X75 = 0x801 + ETHERTYPE_XNSSM = 0x9001 + ETHERTYPE_XTP = 0x817d + ETHER_ADDR_LEN = 0x6 + ETHER_CRC_LEN = 0x4 + ETHER_CRC_POLY_BE = 0x4c11db6 + ETHER_CRC_POLY_LE = 0xedb88320 + ETHER_HDR_LEN = 0xe + ETHER_MAX_LEN = 0x5ee + ETHER_MAX_LEN_JUMBO = 0x233a + ETHER_MIN_LEN = 0x40 + ETHER_PPPOE_ENCAP_LEN = 0x8 + ETHER_TYPE_LEN = 0x2 + ETHER_VLAN_ENCAP_LEN = 0x4 + EVFILT_AIO = 0x2 + EVFILT_PROC = 0x4 + EVFILT_READ = 0x0 + EVFILT_SIGNAL = 0x5 + EVFILT_SYSCOUNT = 0x7 + EVFILT_TIMER = 0x6 + EVFILT_VNODE = 0x3 + EVFILT_WRITE = 0x1 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x100 + FLUSHO = 0x800000 + F_CLOSEM = 0xa + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0xc + F_FSCTL = -0x80000000 + F_FSDIRMASK = 0x70000000 + F_FSIN = 0x10000000 + F_FSINOUT = 0x30000000 + F_FSOUT = 0x20000000 + F_FSPRIV = 0x8000 + F_FSVOID = 0x40000000 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETNOSIGPIPE = 0xd + F_GETOWN = 0x5 + F_MAXFD = 0xb + F_OK = 0x0 + F_PARAM_MASK = 0xfff + F_PARAM_MAX = 0xfff + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETNOSIGPIPE = 0xe + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_WRLCK = 0x3 + HUPCL = 0x4000 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFA_ROUTE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x8f52 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf8 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ECONET = 0xce + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf2 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INFINIBAND = 0xc7 + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LINEGROUP = 0xd2 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PLC = 0xae + IFT_PON155 = 0xcf + IFT_PON622 = 0xd0 + IFT_POS = 0xab + IFT_PPP = 0x17 + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPATM = 0xc5 + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf1 + IFT_Q2931 = 0xc9 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SIPSIG = 0xcc + IFT_SIPTG = 0xcb + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_STF = 0xd7 + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TELINK = 0xc8 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VIRTUALTG = 0xca + IFT_VOICEDID = 0xd5 + IFT_VOICEEM = 0x64 + IFT_VOICEEMFGD = 0xd3 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFGDEANA = 0xd4 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERCABLE = 0xc6 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IPPROTO_AH = 0x33 + IPPROTO_CARP = 0x70 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPIP = 0x4 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IPV6_ICMP = 0x3a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MOBILE = 0x37 + IPPROTO_NONE = 0x3b + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_VRRP = 0x70 + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXPACKET = 0xffff + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_EF = 0x8000 + IP_ERRORMTU = 0x15 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x16 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINFRAGSIZE = 0x45 + IP_MINTTL = 0x18 + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVTTL = 0x17 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_TOS = 0x3 + IP_TTL = 0x4 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x6 + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_SPACEAVAIL = 0x5 + MADV_WILLNEED = 0x3 + MAP_ALIGNMENT_16MB = 0x18000000 + MAP_ALIGNMENT_1TB = 0x28000000 + MAP_ALIGNMENT_256TB = 0x30000000 + MAP_ALIGNMENT_4GB = 0x20000000 + MAP_ALIGNMENT_64KB = 0x10000000 + MAP_ALIGNMENT_64PB = 0x38000000 + MAP_ALIGNMENT_MASK = -0x1000000 + MAP_ALIGNMENT_SHIFT = 0x18 + MAP_ANON = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_INHERIT = 0x80 + MAP_INHERIT_COPY = 0x1 + MAP_INHERIT_DEFAULT = 0x1 + MAP_INHERIT_DONATE_COPY = 0x3 + MAP_INHERIT_NONE = 0x2 + MAP_INHERIT_SHARE = 0x0 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_STACK = 0x2000 + MAP_TRYFIXED = 0x400 + MAP_WIRED = 0x800 + MSG_BCAST = 0x100 + MSG_CMSG_CLOEXEC = 0x800 + MSG_CONTROLMBUF = 0x2000000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOR = 0x8 + MSG_IOVUSRSPACE = 0x4000000 + MSG_LENUSRSPACE = 0x8000000 + MSG_MCAST = 0x200 + MSG_NAMEMBUF = 0x1000000 + MSG_NBIO = 0x1000 + MSG_NOSIGNAL = 0x400 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_USERFLAGS = 0xffffff + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x4 + NAME_MAX = 0x1ff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x5 + NET_RT_MAXID = 0x6 + NET_RT_OIFLIST = 0x4 + NET_RT_OOIFLIST = 0x3 + NOFLSH = 0x80000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OFIOGETBMAP = 0xc004667a + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_ALT_IO = 0x40000 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x400000 + O_CREAT = 0x200 + O_DIRECT = 0x80000 + O_DIRECTORY = 0x200000 + O_DSYNC = 0x10000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_NOSIGPIPE = 0x1000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x20000 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PRI_IOFLUSH = 0x7c + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x8 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x9 + RTAX_NETMASK = 0x2 + RTAX_TAG = 0x8 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTA_TAG = 0x100 + RTF_ANNOUNCE = 0x20000 + RTF_BLACKHOLE = 0x1000 + RTF_CLONED = 0x2000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_MASK = 0x80 + RTF_MODIFIED = 0x20 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_REJECT = 0x8 + RTF_SRC = 0x10000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_CHGADDR = 0x15 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x11 + RTM_IFANNOUNCE = 0x10 + RTM_IFINFO = 0x14 + RTM_LLINFO_UPD = 0x13 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_OIFINFO = 0xf + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_OOIFINFO = 0xe + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_SETGATE = 0x12 + RTM_VERSION = 0x4 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x4 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x8 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80906931 + SIOCADDRT = 0x8030720a + SIOCAIFADDR = 0x8040691a + SIOCALIFADDR = 0x8118691c + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80906932 + SIOCDELRT = 0x8030720b + SIOCDIFADDR = 0x80906919 + SIOCDIFPHYADDR = 0x80906949 + SIOCDLIFADDR = 0x8118691e + SIOCGDRVSPEC = 0xc01c697b + SIOCGETPFSYNC = 0xc09069f8 + SIOCGETSGCNT = 0xc0147534 + SIOCGETVIFCNT = 0xc0147533 + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0906921 + SIOCGIFADDRPREF = 0xc0946920 + SIOCGIFALIAS = 0xc040691b + SIOCGIFBRDADDR = 0xc0906923 + SIOCGIFCAP = 0xc0206976 + SIOCGIFCONF = 0xc0086926 + SIOCGIFDATA = 0xc0946985 + SIOCGIFDLT = 0xc0906977 + SIOCGIFDSTADDR = 0xc0906922 + SIOCGIFFLAGS = 0xc0906911 + SIOCGIFGENERIC = 0xc090693a + SIOCGIFMEDIA = 0xc0286936 + SIOCGIFMETRIC = 0xc0906917 + SIOCGIFMTU = 0xc090697e + SIOCGIFNETMASK = 0xc0906925 + SIOCGIFPDSTADDR = 0xc0906948 + SIOCGIFPSRCADDR = 0xc0906947 + SIOCGLIFADDR = 0xc118691d + SIOCGLIFPHYADDR = 0xc118694b + SIOCGLINKSTR = 0xc01c6987 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGVH = 0xc0906983 + SIOCIFCREATE = 0x8090697a + SIOCIFDESTROY = 0x80906979 + SIOCIFGCLONERS = 0xc00c6978 + SIOCINITIFADDR = 0xc0446984 + SIOCSDRVSPEC = 0x801c697b + SIOCSETPFSYNC = 0x809069f7 + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8090690c + SIOCSIFADDRPREF = 0x8094691f + SIOCSIFBRDADDR = 0x80906913 + SIOCSIFCAP = 0x80206975 + SIOCSIFDSTADDR = 0x8090690e + SIOCSIFFLAGS = 0x80906910 + SIOCSIFGENERIC = 0x80906939 + SIOCSIFMEDIA = 0xc0906935 + SIOCSIFMETRIC = 0x80906918 + SIOCSIFMTU = 0x8090697f + SIOCSIFNETMASK = 0x80906916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSLIFPHYADDR = 0x8118694a + SIOCSLINKSTR = 0x801c6988 + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSVH = 0xc0906982 + SIOCZIFDATA = 0xc0946986 + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_FLAGS_MASK = 0xf0000000 + SOCK_NONBLOCK = 0x20000000 + SOCK_NOSIGPIPE = 0x40000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_NOHEADER = 0x100a + SO_NOSIGPIPE = 0x800 + SO_OOBINLINE = 0x100 + SO_OVERFLOWED = 0x1009 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x100c + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x100b + SO_TIMESTAMP = 0x2000 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SYSCTL_VERSION = 0x1000000 + SYSCTL_VERS_0 = 0x0 + SYSCTL_VERS_1 = 0x1000000 + SYSCTL_VERS_MASK = 0xff000000 + S_ARCH1 = 0x10000 + S_ARCH2 = 0x20000 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFWHT = 0xe000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TCIFLUSH = 0x1 + TCIOFLUSH = 0x3 + TCOFLUSH = 0x2 + TCP_CONGCTL = 0x20 + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x3 + TCP_KEEPINIT = 0x7 + TCP_KEEPINTVL = 0x5 + TCP_MAXBURST = 0x4 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x10 + TCP_MINMSS = 0xd8 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x400c7458 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLAG_CDTRCTS = 0x10 + TIOCFLAG_CLOCAL = 0x2 + TIOCFLAG_CRTSCTS = 0x4 + TIOCFLAG_MDMBUF = 0x8 + TIOCFLAG_SOFTCAR = 0x1 + TIOCFLUSH = 0x80047410 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGFLAGS = 0x4004745d + TIOCGLINED = 0x40207442 + TIOCGPGRP = 0x40047477 + TIOCGQSIZE = 0x40047481 + TIOCGRANTPT = 0x20007447 + TIOCGSID = 0x40047463 + TIOCGSIZE = 0x40087468 + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGET = 0x4004746a + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTMGET = 0x48087446 + TIOCPTSNAME = 0x48087448 + TIOCRCVFRAME = 0x80047445 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSFLAGS = 0x8004745c + TIOCSIG = 0x2000745f + TIOCSLINED = 0x80207443 + TIOCSPGRP = 0x80047476 + TIOCSQSIZE = 0x80047480 + TIOCSSIZE = 0x80087467 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x80047465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCUCNTL = 0x80047466 + TIOCXMTFRAME = 0x80047444 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WALL = 0x8 + WALLSIG = 0x8 + WALTSIG = 0x4 + WCLONE = 0x4 + WCOREFLAG = 0x80 + WNOHANG = 0x1 + WNOWAIT = 0x10000 + WNOZOMBIE = 0x20000 + WOPTSCHECKED = 0x40000 + WSTOPPED = 0x7f + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x58) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x57) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x52) + EILSEQ = syscall.Errno(0x55) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x60) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5e) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x5d) + ENOBUFS = syscall.Errno(0x37) + ENODATA = syscall.Errno(0x59) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x5f) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x53) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x5a) + ENOSTR = syscall.Errno(0x5b) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x56) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x54) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x60) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIME = syscall.Errno(0x5c) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x20) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "device not configured", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource deadlock avoided", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device busy", + 17: "file exists", + 18: "cross-device link", + 19: "operation not supported by device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "result too large or too small", + 35: "resource temporarily unavailable", + 36: "operation now in progress", + 37: "operation already in progress", + 38: "socket operation on non-socket", + 39: "destination address required", + 40: "message too long", + 41: "protocol wrong type for socket", + 42: "protocol option not available", + 43: "protocol not supported", + 44: "socket type not supported", + 45: "operation not supported", + 46: "protocol family not supported", + 47: "address family not supported by protocol family", + 48: "address already in use", + 49: "can't assign requested address", + 50: "network is down", + 51: "network is unreachable", + 52: "network dropped connection on reset", + 53: "software caused connection abort", + 54: "connection reset by peer", + 55: "no buffer space available", + 56: "socket is already connected", + 57: "socket is not connected", + 58: "can't send after socket shutdown", + 59: "too many references: can't splice", + 60: "connection timed out", + 61: "connection refused", + 62: "too many levels of symbolic links", + 63: "file name too long", + 64: "host is down", + 65: "no route to host", + 66: "directory not empty", + 67: "too many processes", + 68: "too many users", + 69: "disc quota exceeded", + 70: "stale NFS file handle", + 71: "too many levels of remote in path", + 72: "RPC struct is bad", + 73: "RPC version wrong", + 74: "RPC prog. not avail", + 75: "program version wrong", + 76: "bad procedure for program", + 77: "no locks available", + 78: "function not implemented", + 79: "inappropriate file type or format", + 80: "authentication error", + 81: "need authenticator", + 82: "identifier removed", + 83: "no message of desired type", + 84: "value too large to be stored in data type", + 85: "illegal byte sequence", + 86: "not supported", + 87: "operation Canceled", + 88: "bad or Corrupt message", + 89: "no message available", + 90: "no STREAM resources", + 91: "not a STREAM", + 92: "STREAM ioctl timeout", + 93: "attribute not found", + 94: "multihop attempted", + 95: "link has been severed", + 96: "protocol error", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/BPT trap", + 6: "abort trap", + 7: "EMT trap", + 8: "floating point exception", + 9: "killed", + 10: "bus error", + 11: "segmentation fault", + 12: "bad system call", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "urgent I/O condition", + 17: "stopped (signal)", + 18: "stopped", + 19: "continued", + 20: "child exited", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "I/O possible", + 24: "cputime limit exceeded", + 25: "filesize limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window size changes", + 29: "information request", + 30: "user defined signal 1", + 31: "user defined signal 2", + 32: "power fail/restart", +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go new file mode 100644 index 0000000..3322e99 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go @@ -0,0 +1,1584 @@ +// mkerrors.sh -m32 +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build 386,openbsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m32 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_BLUETOOTH = 0x20 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_ENCAP = 0x1c + AF_HYLINK = 0xf + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x18 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_KEY = 0x1e + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x24 + AF_MPLS = 0x21 + AF_NATM = 0x1b + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SIP = 0x1d + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + ARPHRD_ETHER = 0x1 + ARPHRD_FRELAY = 0xf + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B9600 = 0x2580 + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDIRFILT = 0x4004427c + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc008427b + BIOCGETIF = 0x4020426b + BIOCGFILDROP = 0x40044278 + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044273 + BIOCGRTIMEOUT = 0x400c426e + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x20004276 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDIRFILT = 0x8004427d + BIOCSDLT = 0x8004427a + BIOCSETF = 0x80084267 + BIOCSETIF = 0x8020426c + BIOCSETWF = 0x80084277 + BIOCSFILDROP = 0x80044279 + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044272 + BIOCSRTIMEOUT = 0x800c426d + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIRECTION_IN = 0x1 + BPF_DIRECTION_OUT = 0x2 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x200000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CREAD = 0x800 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0xff + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DIOCOSFPFLUSH = 0x2000444e + DLT_ARCNET = 0x7 + DLT_ATM_RFC1483 = 0xb + DLT_AX25 = 0x3 + DLT_CHAOS = 0x5 + DLT_C_HDLC = 0x68 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0xd + DLT_FDDI = 0xa + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_LOOP = 0xc + DLT_MPLS = 0xdb + DLT_NULL = 0x0 + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_SERIAL = 0x32 + DLT_PRONET = 0x4 + DLT_RAW = 0xe + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EMT_TAGOVF = 0x1 + EMUL_ENABLED = 0x1 + EMUL_NATIVE = 0x2 + ENDRUNDISC = 0x9 + ETHERMIN = 0x2e + ETHERMTU = 0x5dc + ETHERTYPE_8023 = 0x4 + ETHERTYPE_AARP = 0x80f3 + ETHERTYPE_ACCTON = 0x8390 + ETHERTYPE_AEONIC = 0x8036 + ETHERTYPE_ALPHA = 0x814a + ETHERTYPE_AMBER = 0x6008 + ETHERTYPE_AMOEBA = 0x8145 + ETHERTYPE_AOE = 0x88a2 + ETHERTYPE_APOLLO = 0x80f7 + ETHERTYPE_APOLLODOMAIN = 0x8019 + ETHERTYPE_APPLETALK = 0x809b + ETHERTYPE_APPLITEK = 0x80c7 + ETHERTYPE_ARGONAUT = 0x803a + ETHERTYPE_ARP = 0x806 + ETHERTYPE_AT = 0x809b + ETHERTYPE_ATALK = 0x809b + ETHERTYPE_ATOMIC = 0x86df + ETHERTYPE_ATT = 0x8069 + ETHERTYPE_ATTSTANFORD = 0x8008 + ETHERTYPE_AUTOPHON = 0x806a + ETHERTYPE_AXIS = 0x8856 + ETHERTYPE_BCLOOP = 0x9003 + ETHERTYPE_BOFL = 0x8102 + ETHERTYPE_CABLETRON = 0x7034 + ETHERTYPE_CHAOS = 0x804 + ETHERTYPE_COMDESIGN = 0x806c + ETHERTYPE_COMPUGRAPHIC = 0x806d + ETHERTYPE_COUNTERPOINT = 0x8062 + ETHERTYPE_CRONUS = 0x8004 + ETHERTYPE_CRONUSVLN = 0x8003 + ETHERTYPE_DCA = 0x1234 + ETHERTYPE_DDE = 0x807b + ETHERTYPE_DEBNI = 0xaaaa + ETHERTYPE_DECAM = 0x8048 + ETHERTYPE_DECCUST = 0x6006 + ETHERTYPE_DECDIAG = 0x6005 + ETHERTYPE_DECDNS = 0x803c + ETHERTYPE_DECDTS = 0x803e + ETHERTYPE_DECEXPER = 0x6000 + ETHERTYPE_DECLAST = 0x8041 + ETHERTYPE_DECLTM = 0x803f + ETHERTYPE_DECMUMPS = 0x6009 + ETHERTYPE_DECNETBIOS = 0x8040 + ETHERTYPE_DELTACON = 0x86de + ETHERTYPE_DIDDLE = 0x4321 + ETHERTYPE_DLOG1 = 0x660 + ETHERTYPE_DLOG2 = 0x661 + ETHERTYPE_DN = 0x6003 + ETHERTYPE_DOGFIGHT = 0x1989 + ETHERTYPE_DSMD = 0x8039 + ETHERTYPE_ECMA = 0x803 + ETHERTYPE_ENCRYPT = 0x803d + ETHERTYPE_ES = 0x805d + ETHERTYPE_EXCELAN = 0x8010 + ETHERTYPE_EXPERDATA = 0x8049 + ETHERTYPE_FLIP = 0x8146 + ETHERTYPE_FLOWCONTROL = 0x8808 + ETHERTYPE_FRARP = 0x808 + ETHERTYPE_GENDYN = 0x8068 + ETHERTYPE_HAYES = 0x8130 + ETHERTYPE_HIPPI_FP = 0x8180 + ETHERTYPE_HITACHI = 0x8820 + ETHERTYPE_HP = 0x8005 + ETHERTYPE_IEEEPUP = 0xa00 + ETHERTYPE_IEEEPUPAT = 0xa01 + ETHERTYPE_IMLBL = 0x4c42 + ETHERTYPE_IMLBLDIAG = 0x424c + ETHERTYPE_IP = 0x800 + ETHERTYPE_IPAS = 0x876c + ETHERTYPE_IPV6 = 0x86dd + ETHERTYPE_IPX = 0x8137 + ETHERTYPE_IPXNEW = 0x8037 + ETHERTYPE_KALPANA = 0x8582 + ETHERTYPE_LANBRIDGE = 0x8038 + ETHERTYPE_LANPROBE = 0x8888 + ETHERTYPE_LAT = 0x6004 + ETHERTYPE_LBACK = 0x9000 + ETHERTYPE_LITTLE = 0x8060 + ETHERTYPE_LLDP = 0x88cc + ETHERTYPE_LOGICRAFT = 0x8148 + ETHERTYPE_LOOPBACK = 0x9000 + ETHERTYPE_MATRA = 0x807a + ETHERTYPE_MAX = 0xffff + ETHERTYPE_MERIT = 0x807c + ETHERTYPE_MICP = 0x873a + ETHERTYPE_MOPDL = 0x6001 + ETHERTYPE_MOPRC = 0x6002 + ETHERTYPE_MOTOROLA = 0x818d + ETHERTYPE_MPLS = 0x8847 + ETHERTYPE_MPLS_MCAST = 0x8848 + ETHERTYPE_MUMPS = 0x813f + ETHERTYPE_NBPCC = 0x3c04 + ETHERTYPE_NBPCLAIM = 0x3c09 + ETHERTYPE_NBPCLREQ = 0x3c05 + ETHERTYPE_NBPCLRSP = 0x3c06 + ETHERTYPE_NBPCREQ = 0x3c02 + ETHERTYPE_NBPCRSP = 0x3c03 + ETHERTYPE_NBPDG = 0x3c07 + ETHERTYPE_NBPDGB = 0x3c08 + ETHERTYPE_NBPDLTE = 0x3c0a + ETHERTYPE_NBPRAR = 0x3c0c + ETHERTYPE_NBPRAS = 0x3c0b + ETHERTYPE_NBPRST = 0x3c0d + ETHERTYPE_NBPSCD = 0x3c01 + ETHERTYPE_NBPVCD = 0x3c00 + ETHERTYPE_NBS = 0x802 + ETHERTYPE_NCD = 0x8149 + ETHERTYPE_NESTAR = 0x8006 + ETHERTYPE_NETBEUI = 0x8191 + ETHERTYPE_NOVELL = 0x8138 + ETHERTYPE_NS = 0x600 + ETHERTYPE_NSAT = 0x601 + ETHERTYPE_NSCOMPAT = 0x807 + ETHERTYPE_NTRAILER = 0x10 + ETHERTYPE_OS9 = 0x7007 + ETHERTYPE_OS9NET = 0x7009 + ETHERTYPE_PACER = 0x80c6 + ETHERTYPE_PAE = 0x888e + ETHERTYPE_PCS = 0x4242 + ETHERTYPE_PLANNING = 0x8044 + ETHERTYPE_PPP = 0x880b + ETHERTYPE_PPPOE = 0x8864 + ETHERTYPE_PPPOEDISC = 0x8863 + ETHERTYPE_PRIMENTS = 0x7031 + ETHERTYPE_PUP = 0x200 + ETHERTYPE_PUPAT = 0x200 + ETHERTYPE_QINQ = 0x88a8 + ETHERTYPE_RACAL = 0x7030 + ETHERTYPE_RATIONAL = 0x8150 + ETHERTYPE_RAWFR = 0x6559 + ETHERTYPE_RCL = 0x1995 + ETHERTYPE_RDP = 0x8739 + ETHERTYPE_RETIX = 0x80f2 + ETHERTYPE_REVARP = 0x8035 + ETHERTYPE_SCA = 0x6007 + ETHERTYPE_SECTRA = 0x86db + ETHERTYPE_SECUREDATA = 0x876d + ETHERTYPE_SGITW = 0x817e + ETHERTYPE_SG_BOUNCE = 0x8016 + ETHERTYPE_SG_DIAG = 0x8013 + ETHERTYPE_SG_NETGAMES = 0x8014 + ETHERTYPE_SG_RESV = 0x8015 + ETHERTYPE_SIMNET = 0x5208 + ETHERTYPE_SLOW = 0x8809 + ETHERTYPE_SNA = 0x80d5 + ETHERTYPE_SNMP = 0x814c + ETHERTYPE_SONIX = 0xfaf5 + ETHERTYPE_SPIDER = 0x809f + ETHERTYPE_SPRITE = 0x500 + ETHERTYPE_STP = 0x8181 + ETHERTYPE_TALARIS = 0x812b + ETHERTYPE_TALARISMC = 0x852b + ETHERTYPE_TCPCOMP = 0x876b + ETHERTYPE_TCPSM = 0x9002 + ETHERTYPE_TEC = 0x814f + ETHERTYPE_TIGAN = 0x802f + ETHERTYPE_TRAIL = 0x1000 + ETHERTYPE_TRANSETHER = 0x6558 + ETHERTYPE_TYMSHARE = 0x802e + ETHERTYPE_UBBST = 0x7005 + ETHERTYPE_UBDEBUG = 0x900 + ETHERTYPE_UBDIAGLOOP = 0x7002 + ETHERTYPE_UBDL = 0x7000 + ETHERTYPE_UBNIU = 0x7001 + ETHERTYPE_UBNMC = 0x7003 + ETHERTYPE_VALID = 0x1600 + ETHERTYPE_VARIAN = 0x80dd + ETHERTYPE_VAXELN = 0x803b + ETHERTYPE_VEECO = 0x8067 + ETHERTYPE_VEXP = 0x805b + ETHERTYPE_VGLAB = 0x8131 + ETHERTYPE_VINES = 0xbad + ETHERTYPE_VINESECHO = 0xbaf + ETHERTYPE_VINESLOOP = 0xbae + ETHERTYPE_VITAL = 0xff00 + ETHERTYPE_VLAN = 0x8100 + ETHERTYPE_VLTLMAN = 0x8080 + ETHERTYPE_VPROD = 0x805c + ETHERTYPE_VURESERVED = 0x8147 + ETHERTYPE_WATERLOO = 0x8130 + ETHERTYPE_WELLFLEET = 0x8103 + ETHERTYPE_X25 = 0x805 + ETHERTYPE_X75 = 0x801 + ETHERTYPE_XNSSM = 0x9001 + ETHERTYPE_XTP = 0x817d + ETHER_ADDR_LEN = 0x6 + ETHER_ALIGN = 0x2 + ETHER_CRC_LEN = 0x4 + ETHER_CRC_POLY_BE = 0x4c11db6 + ETHER_CRC_POLY_LE = 0xedb88320 + ETHER_HDR_LEN = 0xe + ETHER_MAX_DIX_LEN = 0x600 + ETHER_MAX_LEN = 0x5ee + ETHER_MIN_LEN = 0x40 + ETHER_TYPE_LEN = 0x2 + ETHER_VLAN_ENCAP_LEN = 0x4 + EVFILT_AIO = -0x3 + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0x7 + EVFILT_TIMER = -0x7 + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0xa + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETOWN = 0x5 + F_OK = 0x0 + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_WRLCK = 0x3 + HUPCL = 0x4000 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFA_ROUTE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x8e52 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BLUETOOTH = 0xf8 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf7 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DUMMY = 0xf1 + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ECONET = 0xce + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf3 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INFINIBAND = 0xc7 + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LINEGROUP = 0xd2 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf5 + IFT_PFLOW = 0xf9 + IFT_PFSYNC = 0xf6 + IFT_PLC = 0xae + IFT_PON155 = 0xcf + IFT_PON622 = 0xd0 + IFT_POS = 0xab + IFT_PPP = 0x17 + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPATM = 0xc5 + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf2 + IFT_Q2931 = 0xc9 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SIPSIG = 0xcc + IFT_SIPTG = 0xcb + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TELINK = 0xc8 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VIRTUALTG = 0xca + IFT_VOICEDID = 0xd5 + IFT_VOICEEM = 0x64 + IFT_VOICEEMFGD = 0xd3 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFGDEANA = 0xd4 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERCABLE = 0xc6 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IN_RFC3021_HOST = 0x1 + IN_RFC3021_NET = 0xfffffffe + IN_RFC3021_NSHIFT = 0x1f + IPPROTO_AH = 0x33 + IPPROTO_CARP = 0x70 + IPPROTO_DIVERT = 0x102 + IPPROTO_DIVERT_INIT = 0x2 + IPPROTO_DIVERT_RESP = 0x1 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPIP = 0x4 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x103 + IPPROTO_MOBILE = 0x37 + IPPROTO_MPLS = 0x89 + IPPROTO_NONE = 0x3b + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPV6_AUTH_LEVEL = 0x35 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_ESP_NETWORK_LEVEL = 0x37 + IPV6_ESP_TRANS_LEVEL = 0x36 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPCOMP_LEVEL = 0x3c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXPACKET = 0xffff + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_OPTIONS = 0x1 + IPV6_PATHMTU = 0x2c + IPV6_PIPEX = 0x3f + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVDSTPORT = 0x40 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTABLE = 0x1021 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_AUTH_LEVEL = 0x14 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DIVERTFL = 0x1022 + IP_DROP_MEMBERSHIP = 0xd + IP_ESP_NETWORK_LEVEL = 0x16 + IP_ESP_TRANS_LEVEL = 0x15 + IP_HDRINCL = 0x2 + IP_IPCOMP_LEVEL = 0x1d + IP_IPSECFLOWINFO = 0x24 + IP_IPSEC_LOCAL_AUTH = 0x1b + IP_IPSEC_LOCAL_CRED = 0x19 + IP_IPSEC_LOCAL_ID = 0x17 + IP_IPSEC_REMOTE_AUTH = 0x1c + IP_IPSEC_REMOTE_CRED = 0x1a + IP_IPSEC_REMOTE_ID = 0x18 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0xfff + IP_MF = 0x2000 + IP_MINTTL = 0x20 + IP_MIN_MEMBERSHIPS = 0xf + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x1 + IP_PIPEX = 0x22 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVDSTPORT = 0x21 + IP_RECVIF = 0x1e + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVRTABLE = 0x23 + IP_RECVTTL = 0x1f + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RTABLE = 0x1021 + IP_TOS = 0x3 + IP_TTL = 0x4 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + LCNT_OVERLOAD_FLUSH = 0x6 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x6 + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_SPACEAVAIL = 0x5 + MADV_WILLNEED = 0x3 + MAP_ANON = 0x1000 + MAP_COPY = 0x4 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FLAGMASK = 0x1ff7 + MAP_HASSEMAPHORE = 0x200 + MAP_INHERIT = 0x80 + MAP_INHERIT_COPY = 0x1 + MAP_INHERIT_DONATE_COPY = 0x3 + MAP_INHERIT_NONE = 0x2 + MAP_INHERIT_SHARE = 0x0 + MAP_NOEXTEND = 0x100 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_TRYFIXED = 0x400 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MSG_BCAST = 0x100 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOR = 0x8 + MSG_MCAST = 0x200 + MSG_NOSIGNAL = 0x400 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x4 + MS_SYNC = 0x2 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_MAXID = 0x6 + NET_RT_STATS = 0x4 + NET_RT_TABLE = 0x5 + NOFLSH = 0x80000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + NOTE_EOF = 0x2 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRUNCATE = 0x80 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + ONLCR = 0x2 + ONLRET = 0x80 + ONOCR = 0x40 + ONOEOT = 0x8 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x10000 + O_CREAT = 0x200 + O_DIRECTORY = 0x20000 + O_DSYNC = 0x80 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x80 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PF_FLUSH = 0x1 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PT_MASK = 0x3ff000 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x8 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_LABEL = 0xa + RTAX_MAX = 0xb + RTAX_NETMASK = 0x2 + RTAX_SRC = 0x8 + RTAX_SRCMASK = 0x9 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_LABEL = 0x400 + RTA_NETMASK = 0x4 + RTA_SRC = 0x100 + RTA_SRCMASK = 0x200 + RTF_ANNOUNCE = 0x4000 + RTF_BLACKHOLE = 0x1000 + RTF_CLONED = 0x10000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_FMASK = 0x10f808 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_MASK = 0x80 + RTF_MODIFIED = 0x20 + RTF_MPATH = 0x40000 + RTF_MPLS = 0x100000 + RTF_PERMANENT_ARP = 0x2000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x2000 + RTF_REJECT = 0x8 + RTF_SOURCE = 0x20000 + RTF_STATIC = 0x800 + RTF_TUNNEL = 0x100000 + RTF_UP = 0x1 + RTF_USETRAILERS = 0x8000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DESYNC = 0x10 + RTM_GET = 0x4 + RTM_IFANNOUNCE = 0xf + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MAXSIZE = 0x800 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RT_TABLEID_MAX = 0xff + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x4 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCAIFGROUP = 0x80246987 + SIOCALIFADDR = 0x8218691c + SIOCATMARK = 0x40047307 + SIOCBRDGADD = 0x8054693c + SIOCBRDGADDS = 0x80546941 + SIOCBRDGARL = 0x806e694d + SIOCBRDGDADDR = 0x81286947 + SIOCBRDGDEL = 0x8054693d + SIOCBRDGDELS = 0x80546942 + SIOCBRDGFLUSH = 0x80546948 + SIOCBRDGFRL = 0x806e694e + SIOCBRDGGCACHE = 0xc0146941 + SIOCBRDGGFD = 0xc0146952 + SIOCBRDGGHT = 0xc0146951 + SIOCBRDGGIFFLGS = 0xc054693e + SIOCBRDGGMA = 0xc0146953 + SIOCBRDGGPARAM = 0xc03c6958 + SIOCBRDGGPRI = 0xc0146950 + SIOCBRDGGRL = 0xc028694f + SIOCBRDGGSIFS = 0xc054693c + SIOCBRDGGTO = 0xc0146946 + SIOCBRDGIFS = 0xc0546942 + SIOCBRDGRTS = 0xc0186943 + SIOCBRDGSADDR = 0xc1286944 + SIOCBRDGSCACHE = 0x80146940 + SIOCBRDGSFD = 0x80146952 + SIOCBRDGSHT = 0x80146951 + SIOCBRDGSIFCOST = 0x80546955 + SIOCBRDGSIFFLGS = 0x8054693f + SIOCBRDGSIFPRIO = 0x80546954 + SIOCBRDGSMA = 0x80146953 + SIOCBRDGSPRI = 0x80146950 + SIOCBRDGSPROTO = 0x8014695a + SIOCBRDGSTO = 0x80146945 + SIOCBRDGSTXHC = 0x80146959 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFGROUP = 0x80246989 + SIOCDIFPHYADDR = 0x80206949 + SIOCDLIFADDR = 0x8218691e + SIOCGETKALIVE = 0xc01869a4 + SIOCGETLABEL = 0x8020699a + SIOCGETPFLOW = 0xc02069fe + SIOCGETPFSYNC = 0xc02069f8 + SIOCGETSGCNT = 0xc0147534 + SIOCGETVIFCNT = 0xc0147533 + SIOCGETVLAN = 0xc0206990 + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFASYNCMAP = 0xc020697c + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCONF = 0xc0086924 + SIOCGIFDATA = 0xc020691b + SIOCGIFDESCR = 0xc0206981 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGATTR = 0xc024698b + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc024698a + SIOCGIFGROUP = 0xc0246988 + SIOCGIFHARDMTU = 0xc02069a5 + SIOCGIFMEDIA = 0xc0286936 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc020697e + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206948 + SIOCGIFPRIORITY = 0xc020699c + SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFRDOMAIN = 0xc02069a0 + SIOCGIFRTLABEL = 0xc0206983 + SIOCGIFTIMESLOT = 0xc0206986 + SIOCGIFXFLAGS = 0xc020699e + SIOCGLIFADDR = 0xc218691d + SIOCGLIFPHYADDR = 0xc218694b + SIOCGLIFPHYRTABLE = 0xc02069a2 + SIOCGLIFPHYTTL = 0xc02069a9 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGSPPPPARAMS = 0xc0206994 + SIOCGVH = 0xc02069f6 + SIOCGVNETID = 0xc02069a7 + SIOCIFCREATE = 0x8020697a + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc00c6978 + SIOCSETKALIVE = 0x801869a3 + SIOCSETLABEL = 0x80206999 + SIOCSETPFLOW = 0x802069fd + SIOCSETPFSYNC = 0x802069f7 + SIOCSETVLAN = 0x8020698f + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFASYNCMAP = 0x8020697d + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFDESCR = 0x80206980 + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGATTR = 0x8024698c + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020691f + SIOCSIFMEDIA = 0xc0206935 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x8020697f + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSIFPRIORITY = 0x8020699b + SIOCSIFRDOMAIN = 0x8020699f + SIOCSIFRTLABEL = 0x80206982 + SIOCSIFTIMESLOT = 0x80206985 + SIOCSIFXFLAGS = 0x8020699d + SIOCSLIFPHYADDR = 0x8218694a + SIOCSLIFPHYRTABLE = 0x802069a1 + SIOCSLIFPHYTTL = 0x802069a8 + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSSPPPPARAMS = 0x80206993 + SIOCSVH = 0xc02069f5 + SIOCSVNETID = 0x802069a6 + SOCK_DGRAM = 0x2 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_BINDANY = 0x1000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_NETPROC = 0x1020 + SO_OOBINLINE = 0x100 + SO_PEERCRED = 0x1022 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RTABLE = 0x1021 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_SPLICE = 0x1023 + SO_TIMESTAMP = 0x800 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + TCIFLUSH = 0x1 + TCIOFLUSH = 0x3 + TCOFLUSH = 0x2 + TCP_MAXBURST = 0x4 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x3 + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x4 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOPUSH = 0x10 + TCP_NSTATES = 0xb + TCP_SACK_ENABLE = 0x8 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLAG_CLOCAL = 0x2 + TIOCFLAG_CRTSCTS = 0x4 + TIOCFLAG_MDMBUF = 0x8 + TIOCFLAG_PPS = 0x10 + TIOCFLAG_SOFTCAR = 0x1 + TIOCFLUSH = 0x80047410 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGFLAGS = 0x4004745d + TIOCGPGRP = 0x40047477 + TIOCGSID = 0x40047463 + TIOCGTSTAMP = 0x400c745b + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGET = 0x4004746a + TIOCMODG = 0x4004746a + TIOCMODS = 0x8004746d + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSFLAGS = 0x8004745c + TIOCSIG = 0x8004745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x80047465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSTSTAMP = 0x8008745a + TIOCSWINSZ = 0x80087467 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WALTSIG = 0x4 + WCONTINUED = 0x8 + WCOREFLAG = 0x80 + WNOHANG = 0x1 + WSTOPPED = 0x7f + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x58) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x59) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EIPSEC = syscall.Errno(0x52) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x5b) + ELOOP = syscall.Errno(0x3e) + EMEDIUMTYPE = syscall.Errno(0x56) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x53) + ENOBUFS = syscall.Errno(0x37) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOMEDIUM = syscall.Errno(0x55) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x5a) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x5b) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x57) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHR = syscall.Signal(0x20) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "device not configured", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource deadlock avoided", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device busy", + 17: "file exists", + 18: "cross-device link", + 19: "operation not supported by device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "result too large", + 35: "resource temporarily unavailable", + 36: "operation now in progress", + 37: "operation already in progress", + 38: "socket operation on non-socket", + 39: "destination address required", + 40: "message too long", + 41: "protocol wrong type for socket", + 42: "protocol not available", + 43: "protocol not supported", + 44: "socket type not supported", + 45: "operation not supported", + 46: "protocol family not supported", + 47: "address family not supported by protocol family", + 48: "address already in use", + 49: "can't assign requested address", + 50: "network is down", + 51: "network is unreachable", + 52: "network dropped connection on reset", + 53: "software caused connection abort", + 54: "connection reset by peer", + 55: "no buffer space available", + 56: "socket is already connected", + 57: "socket is not connected", + 58: "can't send after socket shutdown", + 59: "too many references: can't splice", + 60: "connection timed out", + 61: "connection refused", + 62: "too many levels of symbolic links", + 63: "file name too long", + 64: "host is down", + 65: "no route to host", + 66: "directory not empty", + 67: "too many processes", + 68: "too many users", + 69: "disc quota exceeded", + 70: "stale NFS file handle", + 71: "too many levels of remote in path", + 72: "RPC struct is bad", + 73: "RPC version wrong", + 74: "RPC prog. not avail", + 75: "program version wrong", + 76: "bad procedure for program", + 77: "no locks available", + 78: "function not implemented", + 79: "inappropriate file type or format", + 80: "authentication error", + 81: "need authenticator", + 82: "IPsec processing failure", + 83: "attribute not found", + 84: "illegal byte sequence", + 85: "no medium found", + 86: "wrong medium type", + 87: "value too large to be stored in data type", + 88: "operation canceled", + 89: "identifier removed", + 90: "no message of desired type", + 91: "not supported", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/BPT trap", + 6: "abort trap", + 7: "EMT trap", + 8: "floating point exception", + 9: "killed", + 10: "bus error", + 11: "segmentation fault", + 12: "bad system call", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "urgent I/O condition", + 17: "stopped (signal)", + 18: "stopped", + 19: "continued", + 20: "child exited", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "I/O possible", + 24: "cputime limit exceeded", + 25: "filesize limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window size changes", + 29: "information request", + 30: "user defined signal 1", + 31: "user defined signal 2", + 32: "thread AST", +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go new file mode 100644 index 0000000..1758ecc --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go @@ -0,0 +1,1583 @@ +// mkerrors.sh -m64 +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build amd64,openbsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_BLUETOOTH = 0x20 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_ENCAP = 0x1c + AF_HYLINK = 0xf + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x18 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_KEY = 0x1e + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x24 + AF_MPLS = 0x21 + AF_NATM = 0x1b + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SIP = 0x1d + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + ARPHRD_ETHER = 0x1 + ARPHRD_FRELAY = 0xf + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B9600 = 0x2580 + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDIRFILT = 0x4004427c + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc010427b + BIOCGETIF = 0x4020426b + BIOCGFILDROP = 0x40044278 + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044273 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x20004276 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDIRFILT = 0x8004427d + BIOCSDLT = 0x8004427a + BIOCSETF = 0x80104267 + BIOCSETIF = 0x8020426c + BIOCSETWF = 0x80104277 + BIOCSFILDROP = 0x80044279 + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044272 + BIOCSRTIMEOUT = 0x8010426d + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIRECTION_IN = 0x1 + BPF_DIRECTION_OUT = 0x2 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x200000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CREAD = 0x800 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0xff + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DIOCOSFPFLUSH = 0x2000444e + DLT_ARCNET = 0x7 + DLT_ATM_RFC1483 = 0xb + DLT_AX25 = 0x3 + DLT_CHAOS = 0x5 + DLT_C_HDLC = 0x68 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0xd + DLT_FDDI = 0xa + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_LOOP = 0xc + DLT_MPLS = 0xdb + DLT_NULL = 0x0 + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_SERIAL = 0x32 + DLT_PRONET = 0x4 + DLT_RAW = 0xe + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EMT_TAGOVF = 0x1 + EMUL_ENABLED = 0x1 + EMUL_NATIVE = 0x2 + ENDRUNDISC = 0x9 + ETHERMIN = 0x2e + ETHERMTU = 0x5dc + ETHERTYPE_8023 = 0x4 + ETHERTYPE_AARP = 0x80f3 + ETHERTYPE_ACCTON = 0x8390 + ETHERTYPE_AEONIC = 0x8036 + ETHERTYPE_ALPHA = 0x814a + ETHERTYPE_AMBER = 0x6008 + ETHERTYPE_AMOEBA = 0x8145 + ETHERTYPE_AOE = 0x88a2 + ETHERTYPE_APOLLO = 0x80f7 + ETHERTYPE_APOLLODOMAIN = 0x8019 + ETHERTYPE_APPLETALK = 0x809b + ETHERTYPE_APPLITEK = 0x80c7 + ETHERTYPE_ARGONAUT = 0x803a + ETHERTYPE_ARP = 0x806 + ETHERTYPE_AT = 0x809b + ETHERTYPE_ATALK = 0x809b + ETHERTYPE_ATOMIC = 0x86df + ETHERTYPE_ATT = 0x8069 + ETHERTYPE_ATTSTANFORD = 0x8008 + ETHERTYPE_AUTOPHON = 0x806a + ETHERTYPE_AXIS = 0x8856 + ETHERTYPE_BCLOOP = 0x9003 + ETHERTYPE_BOFL = 0x8102 + ETHERTYPE_CABLETRON = 0x7034 + ETHERTYPE_CHAOS = 0x804 + ETHERTYPE_COMDESIGN = 0x806c + ETHERTYPE_COMPUGRAPHIC = 0x806d + ETHERTYPE_COUNTERPOINT = 0x8062 + ETHERTYPE_CRONUS = 0x8004 + ETHERTYPE_CRONUSVLN = 0x8003 + ETHERTYPE_DCA = 0x1234 + ETHERTYPE_DDE = 0x807b + ETHERTYPE_DEBNI = 0xaaaa + ETHERTYPE_DECAM = 0x8048 + ETHERTYPE_DECCUST = 0x6006 + ETHERTYPE_DECDIAG = 0x6005 + ETHERTYPE_DECDNS = 0x803c + ETHERTYPE_DECDTS = 0x803e + ETHERTYPE_DECEXPER = 0x6000 + ETHERTYPE_DECLAST = 0x8041 + ETHERTYPE_DECLTM = 0x803f + ETHERTYPE_DECMUMPS = 0x6009 + ETHERTYPE_DECNETBIOS = 0x8040 + ETHERTYPE_DELTACON = 0x86de + ETHERTYPE_DIDDLE = 0x4321 + ETHERTYPE_DLOG1 = 0x660 + ETHERTYPE_DLOG2 = 0x661 + ETHERTYPE_DN = 0x6003 + ETHERTYPE_DOGFIGHT = 0x1989 + ETHERTYPE_DSMD = 0x8039 + ETHERTYPE_ECMA = 0x803 + ETHERTYPE_ENCRYPT = 0x803d + ETHERTYPE_ES = 0x805d + ETHERTYPE_EXCELAN = 0x8010 + ETHERTYPE_EXPERDATA = 0x8049 + ETHERTYPE_FLIP = 0x8146 + ETHERTYPE_FLOWCONTROL = 0x8808 + ETHERTYPE_FRARP = 0x808 + ETHERTYPE_GENDYN = 0x8068 + ETHERTYPE_HAYES = 0x8130 + ETHERTYPE_HIPPI_FP = 0x8180 + ETHERTYPE_HITACHI = 0x8820 + ETHERTYPE_HP = 0x8005 + ETHERTYPE_IEEEPUP = 0xa00 + ETHERTYPE_IEEEPUPAT = 0xa01 + ETHERTYPE_IMLBL = 0x4c42 + ETHERTYPE_IMLBLDIAG = 0x424c + ETHERTYPE_IP = 0x800 + ETHERTYPE_IPAS = 0x876c + ETHERTYPE_IPV6 = 0x86dd + ETHERTYPE_IPX = 0x8137 + ETHERTYPE_IPXNEW = 0x8037 + ETHERTYPE_KALPANA = 0x8582 + ETHERTYPE_LANBRIDGE = 0x8038 + ETHERTYPE_LANPROBE = 0x8888 + ETHERTYPE_LAT = 0x6004 + ETHERTYPE_LBACK = 0x9000 + ETHERTYPE_LITTLE = 0x8060 + ETHERTYPE_LLDP = 0x88cc + ETHERTYPE_LOGICRAFT = 0x8148 + ETHERTYPE_LOOPBACK = 0x9000 + ETHERTYPE_MATRA = 0x807a + ETHERTYPE_MAX = 0xffff + ETHERTYPE_MERIT = 0x807c + ETHERTYPE_MICP = 0x873a + ETHERTYPE_MOPDL = 0x6001 + ETHERTYPE_MOPRC = 0x6002 + ETHERTYPE_MOTOROLA = 0x818d + ETHERTYPE_MPLS = 0x8847 + ETHERTYPE_MPLS_MCAST = 0x8848 + ETHERTYPE_MUMPS = 0x813f + ETHERTYPE_NBPCC = 0x3c04 + ETHERTYPE_NBPCLAIM = 0x3c09 + ETHERTYPE_NBPCLREQ = 0x3c05 + ETHERTYPE_NBPCLRSP = 0x3c06 + ETHERTYPE_NBPCREQ = 0x3c02 + ETHERTYPE_NBPCRSP = 0x3c03 + ETHERTYPE_NBPDG = 0x3c07 + ETHERTYPE_NBPDGB = 0x3c08 + ETHERTYPE_NBPDLTE = 0x3c0a + ETHERTYPE_NBPRAR = 0x3c0c + ETHERTYPE_NBPRAS = 0x3c0b + ETHERTYPE_NBPRST = 0x3c0d + ETHERTYPE_NBPSCD = 0x3c01 + ETHERTYPE_NBPVCD = 0x3c00 + ETHERTYPE_NBS = 0x802 + ETHERTYPE_NCD = 0x8149 + ETHERTYPE_NESTAR = 0x8006 + ETHERTYPE_NETBEUI = 0x8191 + ETHERTYPE_NOVELL = 0x8138 + ETHERTYPE_NS = 0x600 + ETHERTYPE_NSAT = 0x601 + ETHERTYPE_NSCOMPAT = 0x807 + ETHERTYPE_NTRAILER = 0x10 + ETHERTYPE_OS9 = 0x7007 + ETHERTYPE_OS9NET = 0x7009 + ETHERTYPE_PACER = 0x80c6 + ETHERTYPE_PAE = 0x888e + ETHERTYPE_PCS = 0x4242 + ETHERTYPE_PLANNING = 0x8044 + ETHERTYPE_PPP = 0x880b + ETHERTYPE_PPPOE = 0x8864 + ETHERTYPE_PPPOEDISC = 0x8863 + ETHERTYPE_PRIMENTS = 0x7031 + ETHERTYPE_PUP = 0x200 + ETHERTYPE_PUPAT = 0x200 + ETHERTYPE_QINQ = 0x88a8 + ETHERTYPE_RACAL = 0x7030 + ETHERTYPE_RATIONAL = 0x8150 + ETHERTYPE_RAWFR = 0x6559 + ETHERTYPE_RCL = 0x1995 + ETHERTYPE_RDP = 0x8739 + ETHERTYPE_RETIX = 0x80f2 + ETHERTYPE_REVARP = 0x8035 + ETHERTYPE_SCA = 0x6007 + ETHERTYPE_SECTRA = 0x86db + ETHERTYPE_SECUREDATA = 0x876d + ETHERTYPE_SGITW = 0x817e + ETHERTYPE_SG_BOUNCE = 0x8016 + ETHERTYPE_SG_DIAG = 0x8013 + ETHERTYPE_SG_NETGAMES = 0x8014 + ETHERTYPE_SG_RESV = 0x8015 + ETHERTYPE_SIMNET = 0x5208 + ETHERTYPE_SLOW = 0x8809 + ETHERTYPE_SNA = 0x80d5 + ETHERTYPE_SNMP = 0x814c + ETHERTYPE_SONIX = 0xfaf5 + ETHERTYPE_SPIDER = 0x809f + ETHERTYPE_SPRITE = 0x500 + ETHERTYPE_STP = 0x8181 + ETHERTYPE_TALARIS = 0x812b + ETHERTYPE_TALARISMC = 0x852b + ETHERTYPE_TCPCOMP = 0x876b + ETHERTYPE_TCPSM = 0x9002 + ETHERTYPE_TEC = 0x814f + ETHERTYPE_TIGAN = 0x802f + ETHERTYPE_TRAIL = 0x1000 + ETHERTYPE_TRANSETHER = 0x6558 + ETHERTYPE_TYMSHARE = 0x802e + ETHERTYPE_UBBST = 0x7005 + ETHERTYPE_UBDEBUG = 0x900 + ETHERTYPE_UBDIAGLOOP = 0x7002 + ETHERTYPE_UBDL = 0x7000 + ETHERTYPE_UBNIU = 0x7001 + ETHERTYPE_UBNMC = 0x7003 + ETHERTYPE_VALID = 0x1600 + ETHERTYPE_VARIAN = 0x80dd + ETHERTYPE_VAXELN = 0x803b + ETHERTYPE_VEECO = 0x8067 + ETHERTYPE_VEXP = 0x805b + ETHERTYPE_VGLAB = 0x8131 + ETHERTYPE_VINES = 0xbad + ETHERTYPE_VINESECHO = 0xbaf + ETHERTYPE_VINESLOOP = 0xbae + ETHERTYPE_VITAL = 0xff00 + ETHERTYPE_VLAN = 0x8100 + ETHERTYPE_VLTLMAN = 0x8080 + ETHERTYPE_VPROD = 0x805c + ETHERTYPE_VURESERVED = 0x8147 + ETHERTYPE_WATERLOO = 0x8130 + ETHERTYPE_WELLFLEET = 0x8103 + ETHERTYPE_X25 = 0x805 + ETHERTYPE_X75 = 0x801 + ETHERTYPE_XNSSM = 0x9001 + ETHERTYPE_XTP = 0x817d + ETHER_ADDR_LEN = 0x6 + ETHER_ALIGN = 0x2 + ETHER_CRC_LEN = 0x4 + ETHER_CRC_POLY_BE = 0x4c11db6 + ETHER_CRC_POLY_LE = 0xedb88320 + ETHER_HDR_LEN = 0xe + ETHER_MAX_DIX_LEN = 0x600 + ETHER_MAX_LEN = 0x5ee + ETHER_MIN_LEN = 0x40 + ETHER_TYPE_LEN = 0x2 + ETHER_VLAN_ENCAP_LEN = 0x4 + EVFILT_AIO = -0x3 + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0x7 + EVFILT_TIMER = -0x7 + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0xa + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETOWN = 0x5 + F_OK = 0x0 + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_WRLCK = 0x3 + HUPCL = 0x4000 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFA_ROUTE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x8e52 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BLUETOOTH = 0xf8 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf7 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DUMMY = 0xf1 + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ECONET = 0xce + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf3 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INFINIBAND = 0xc7 + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LINEGROUP = 0xd2 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf5 + IFT_PFLOW = 0xf9 + IFT_PFSYNC = 0xf6 + IFT_PLC = 0xae + IFT_PON155 = 0xcf + IFT_PON622 = 0xd0 + IFT_POS = 0xab + IFT_PPP = 0x17 + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPATM = 0xc5 + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf2 + IFT_Q2931 = 0xc9 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SIPSIG = 0xcc + IFT_SIPTG = 0xcb + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TELINK = 0xc8 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VIRTUALTG = 0xca + IFT_VOICEDID = 0xd5 + IFT_VOICEEM = 0x64 + IFT_VOICEEMFGD = 0xd3 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFGDEANA = 0xd4 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERCABLE = 0xc6 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IN_RFC3021_HOST = 0x1 + IN_RFC3021_NET = 0xfffffffe + IN_RFC3021_NSHIFT = 0x1f + IPPROTO_AH = 0x33 + IPPROTO_CARP = 0x70 + IPPROTO_DIVERT = 0x102 + IPPROTO_DIVERT_INIT = 0x2 + IPPROTO_DIVERT_RESP = 0x1 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPIP = 0x4 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x103 + IPPROTO_MOBILE = 0x37 + IPPROTO_MPLS = 0x89 + IPPROTO_NONE = 0x3b + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPV6_AUTH_LEVEL = 0x35 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_ESP_NETWORK_LEVEL = 0x37 + IPV6_ESP_TRANS_LEVEL = 0x36 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPCOMP_LEVEL = 0x3c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXPACKET = 0xffff + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_OPTIONS = 0x1 + IPV6_PATHMTU = 0x2c + IPV6_PIPEX = 0x3f + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVDSTPORT = 0x40 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTABLE = 0x1021 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_AUTH_LEVEL = 0x14 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DIVERTFL = 0x1022 + IP_DROP_MEMBERSHIP = 0xd + IP_ESP_NETWORK_LEVEL = 0x16 + IP_ESP_TRANS_LEVEL = 0x15 + IP_HDRINCL = 0x2 + IP_IPCOMP_LEVEL = 0x1d + IP_IPSECFLOWINFO = 0x24 + IP_IPSEC_LOCAL_AUTH = 0x1b + IP_IPSEC_LOCAL_CRED = 0x19 + IP_IPSEC_LOCAL_ID = 0x17 + IP_IPSEC_REMOTE_AUTH = 0x1c + IP_IPSEC_REMOTE_CRED = 0x1a + IP_IPSEC_REMOTE_ID = 0x18 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0xfff + IP_MF = 0x2000 + IP_MINTTL = 0x20 + IP_MIN_MEMBERSHIPS = 0xf + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x1 + IP_PIPEX = 0x22 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVDSTPORT = 0x21 + IP_RECVIF = 0x1e + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVRTABLE = 0x23 + IP_RECVTTL = 0x1f + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RTABLE = 0x1021 + IP_TOS = 0x3 + IP_TTL = 0x4 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + LCNT_OVERLOAD_FLUSH = 0x6 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x6 + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_SPACEAVAIL = 0x5 + MADV_WILLNEED = 0x3 + MAP_ANON = 0x1000 + MAP_COPY = 0x4 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FLAGMASK = 0x1ff7 + MAP_HASSEMAPHORE = 0x200 + MAP_INHERIT = 0x80 + MAP_INHERIT_COPY = 0x1 + MAP_INHERIT_DONATE_COPY = 0x3 + MAP_INHERIT_NONE = 0x2 + MAP_INHERIT_SHARE = 0x0 + MAP_NOEXTEND = 0x100 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_TRYFIXED = 0x400 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MSG_BCAST = 0x100 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOR = 0x8 + MSG_MCAST = 0x200 + MSG_NOSIGNAL = 0x400 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x4 + MS_SYNC = 0x2 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_MAXID = 0x6 + NET_RT_STATS = 0x4 + NET_RT_TABLE = 0x5 + NOFLSH = 0x80000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + NOTE_EOF = 0x2 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRUNCATE = 0x80 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + ONLCR = 0x2 + ONLRET = 0x80 + ONOCR = 0x40 + ONOEOT = 0x8 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x10000 + O_CREAT = 0x200 + O_DIRECTORY = 0x20000 + O_DSYNC = 0x80 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x80 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PF_FLUSH = 0x1 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x8 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_LABEL = 0xa + RTAX_MAX = 0xb + RTAX_NETMASK = 0x2 + RTAX_SRC = 0x8 + RTAX_SRCMASK = 0x9 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_LABEL = 0x400 + RTA_NETMASK = 0x4 + RTA_SRC = 0x100 + RTA_SRCMASK = 0x200 + RTF_ANNOUNCE = 0x4000 + RTF_BLACKHOLE = 0x1000 + RTF_CLONED = 0x10000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_FMASK = 0x10f808 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_MASK = 0x80 + RTF_MODIFIED = 0x20 + RTF_MPATH = 0x40000 + RTF_MPLS = 0x100000 + RTF_PERMANENT_ARP = 0x2000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x2000 + RTF_REJECT = 0x8 + RTF_SOURCE = 0x20000 + RTF_STATIC = 0x800 + RTF_TUNNEL = 0x100000 + RTF_UP = 0x1 + RTF_USETRAILERS = 0x8000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DESYNC = 0x10 + RTM_GET = 0x4 + RTM_IFANNOUNCE = 0xf + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MAXSIZE = 0x800 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RT_TABLEID_MAX = 0xff + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x4 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCAIFGROUP = 0x80286987 + SIOCALIFADDR = 0x8218691c + SIOCATMARK = 0x40047307 + SIOCBRDGADD = 0x8058693c + SIOCBRDGADDS = 0x80586941 + SIOCBRDGARL = 0x806e694d + SIOCBRDGDADDR = 0x81286947 + SIOCBRDGDEL = 0x8058693d + SIOCBRDGDELS = 0x80586942 + SIOCBRDGFLUSH = 0x80586948 + SIOCBRDGFRL = 0x806e694e + SIOCBRDGGCACHE = 0xc0146941 + SIOCBRDGGFD = 0xc0146952 + SIOCBRDGGHT = 0xc0146951 + SIOCBRDGGIFFLGS = 0xc058693e + SIOCBRDGGMA = 0xc0146953 + SIOCBRDGGPARAM = 0xc0406958 + SIOCBRDGGPRI = 0xc0146950 + SIOCBRDGGRL = 0xc030694f + SIOCBRDGGSIFS = 0xc058693c + SIOCBRDGGTO = 0xc0146946 + SIOCBRDGIFS = 0xc0586942 + SIOCBRDGRTS = 0xc0206943 + SIOCBRDGSADDR = 0xc1286944 + SIOCBRDGSCACHE = 0x80146940 + SIOCBRDGSFD = 0x80146952 + SIOCBRDGSHT = 0x80146951 + SIOCBRDGSIFCOST = 0x80586955 + SIOCBRDGSIFFLGS = 0x8058693f + SIOCBRDGSIFPRIO = 0x80586954 + SIOCBRDGSMA = 0x80146953 + SIOCBRDGSPRI = 0x80146950 + SIOCBRDGSPROTO = 0x8014695a + SIOCBRDGSTO = 0x80146945 + SIOCBRDGSTXHC = 0x80146959 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFGROUP = 0x80286989 + SIOCDIFPHYADDR = 0x80206949 + SIOCDLIFADDR = 0x8218691e + SIOCGETKALIVE = 0xc01869a4 + SIOCGETLABEL = 0x8020699a + SIOCGETPFLOW = 0xc02069fe + SIOCGETPFSYNC = 0xc02069f8 + SIOCGETSGCNT = 0xc0207534 + SIOCGETVIFCNT = 0xc0287533 + SIOCGETVLAN = 0xc0206990 + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFASYNCMAP = 0xc020697c + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCONF = 0xc0106924 + SIOCGIFDATA = 0xc020691b + SIOCGIFDESCR = 0xc0206981 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGATTR = 0xc028698b + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc028698a + SIOCGIFGROUP = 0xc0286988 + SIOCGIFHARDMTU = 0xc02069a5 + SIOCGIFMEDIA = 0xc0306936 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc020697e + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206948 + SIOCGIFPRIORITY = 0xc020699c + SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFRDOMAIN = 0xc02069a0 + SIOCGIFRTLABEL = 0xc0206983 + SIOCGIFTIMESLOT = 0xc0206986 + SIOCGIFXFLAGS = 0xc020699e + SIOCGLIFADDR = 0xc218691d + SIOCGLIFPHYADDR = 0xc218694b + SIOCGLIFPHYRTABLE = 0xc02069a2 + SIOCGLIFPHYTTL = 0xc02069a9 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGSPPPPARAMS = 0xc0206994 + SIOCGVH = 0xc02069f6 + SIOCGVNETID = 0xc02069a7 + SIOCIFCREATE = 0x8020697a + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc0106978 + SIOCSETKALIVE = 0x801869a3 + SIOCSETLABEL = 0x80206999 + SIOCSETPFLOW = 0x802069fd + SIOCSETPFSYNC = 0x802069f7 + SIOCSETVLAN = 0x8020698f + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFASYNCMAP = 0x8020697d + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFDESCR = 0x80206980 + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGATTR = 0x8028698c + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020691f + SIOCSIFMEDIA = 0xc0206935 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x8020697f + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSIFPRIORITY = 0x8020699b + SIOCSIFRDOMAIN = 0x8020699f + SIOCSIFRTLABEL = 0x80206982 + SIOCSIFTIMESLOT = 0x80206985 + SIOCSIFXFLAGS = 0x8020699d + SIOCSLIFPHYADDR = 0x8218694a + SIOCSLIFPHYRTABLE = 0x802069a1 + SIOCSLIFPHYTTL = 0x802069a8 + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSSPPPPARAMS = 0x80206993 + SIOCSVH = 0xc02069f5 + SIOCSVNETID = 0x802069a6 + SOCK_DGRAM = 0x2 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_BINDANY = 0x1000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_NETPROC = 0x1020 + SO_OOBINLINE = 0x100 + SO_PEERCRED = 0x1022 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RTABLE = 0x1021 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_SPLICE = 0x1023 + SO_TIMESTAMP = 0x800 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + TCIFLUSH = 0x1 + TCIOFLUSH = 0x3 + TCOFLUSH = 0x2 + TCP_MAXBURST = 0x4 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x3 + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x4 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOPUSH = 0x10 + TCP_NSTATES = 0xb + TCP_SACK_ENABLE = 0x8 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLAG_CLOCAL = 0x2 + TIOCFLAG_CRTSCTS = 0x4 + TIOCFLAG_MDMBUF = 0x8 + TIOCFLAG_PPS = 0x10 + TIOCFLAG_SOFTCAR = 0x1 + TIOCFLUSH = 0x80047410 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGFLAGS = 0x4004745d + TIOCGPGRP = 0x40047477 + TIOCGSID = 0x40047463 + TIOCGTSTAMP = 0x4010745b + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGET = 0x4004746a + TIOCMODG = 0x4004746a + TIOCMODS = 0x8004746d + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSFLAGS = 0x8004745c + TIOCSIG = 0x8004745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x80047465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSTSTAMP = 0x8008745a + TIOCSWINSZ = 0x80087467 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WALTSIG = 0x4 + WCONTINUED = 0x8 + WCOREFLAG = 0x80 + WNOHANG = 0x1 + WSTOPPED = 0x7f + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x58) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x59) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EIPSEC = syscall.Errno(0x52) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x5b) + ELOOP = syscall.Errno(0x3e) + EMEDIUMTYPE = syscall.Errno(0x56) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x53) + ENOBUFS = syscall.Errno(0x37) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOMEDIUM = syscall.Errno(0x55) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x5a) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x5b) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x57) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHR = syscall.Signal(0x20) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "device not configured", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource deadlock avoided", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device busy", + 17: "file exists", + 18: "cross-device link", + 19: "operation not supported by device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "result too large", + 35: "resource temporarily unavailable", + 36: "operation now in progress", + 37: "operation already in progress", + 38: "socket operation on non-socket", + 39: "destination address required", + 40: "message too long", + 41: "protocol wrong type for socket", + 42: "protocol not available", + 43: "protocol not supported", + 44: "socket type not supported", + 45: "operation not supported", + 46: "protocol family not supported", + 47: "address family not supported by protocol family", + 48: "address already in use", + 49: "can't assign requested address", + 50: "network is down", + 51: "network is unreachable", + 52: "network dropped connection on reset", + 53: "software caused connection abort", + 54: "connection reset by peer", + 55: "no buffer space available", + 56: "socket is already connected", + 57: "socket is not connected", + 58: "can't send after socket shutdown", + 59: "too many references: can't splice", + 60: "connection timed out", + 61: "connection refused", + 62: "too many levels of symbolic links", + 63: "file name too long", + 64: "host is down", + 65: "no route to host", + 66: "directory not empty", + 67: "too many processes", + 68: "too many users", + 69: "disc quota exceeded", + 70: "stale NFS file handle", + 71: "too many levels of remote in path", + 72: "RPC struct is bad", + 73: "RPC version wrong", + 74: "RPC prog. not avail", + 75: "program version wrong", + 76: "bad procedure for program", + 77: "no locks available", + 78: "function not implemented", + 79: "inappropriate file type or format", + 80: "authentication error", + 81: "need authenticator", + 82: "IPsec processing failure", + 83: "attribute not found", + 84: "illegal byte sequence", + 85: "no medium found", + 86: "wrong medium type", + 87: "value too large to be stored in data type", + 88: "operation canceled", + 89: "identifier removed", + 90: "no message of desired type", + 91: "not supported", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/BPT trap", + 6: "abort trap", + 7: "EMT trap", + 8: "floating point exception", + 9: "killed", + 10: "bus error", + 11: "segmentation fault", + 12: "bad system call", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "urgent I/O condition", + 17: "stopped (signal)", + 18: "stopped", + 19: "continued", + 20: "child exited", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "I/O possible", + 24: "cputime limit exceeded", + 25: "filesize limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window size changes", + 29: "information request", + 30: "user defined signal 1", + 31: "user defined signal 2", + 32: "thread AST", +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go new file mode 100644 index 0000000..3ed0b26 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go @@ -0,0 +1,1586 @@ +// mkerrors.sh +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- _const.go + +// +build arm,openbsd + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_BLUETOOTH = 0x20 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_ENCAP = 0x1c + AF_HYLINK = 0xf + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x18 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_KEY = 0x1e + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x24 + AF_MPLS = 0x21 + AF_NATM = 0x1b + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SIP = 0x1d + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + ARPHRD_ETHER = 0x1 + ARPHRD_FRELAY = 0xf + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B9600 = 0x2580 + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDIRFILT = 0x4004427c + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc008427b + BIOCGETIF = 0x4020426b + BIOCGFILDROP = 0x40044278 + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044273 + BIOCGRTIMEOUT = 0x400c426e + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x20004276 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDIRFILT = 0x8004427d + BIOCSDLT = 0x8004427a + BIOCSETF = 0x80084267 + BIOCSETIF = 0x8020426c + BIOCSETWF = 0x80084277 + BIOCSFILDROP = 0x80044279 + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044272 + BIOCSRTIMEOUT = 0x800c426d + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIRECTION_IN = 0x1 + BPF_DIRECTION_OUT = 0x2 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x200000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CREAD = 0x800 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0xff + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DIOCOSFPFLUSH = 0x2000444e + DLT_ARCNET = 0x7 + DLT_ATM_RFC1483 = 0xb + DLT_AX25 = 0x3 + DLT_CHAOS = 0x5 + DLT_C_HDLC = 0x68 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0xd + DLT_FDDI = 0xa + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_LOOP = 0xc + DLT_MPLS = 0xdb + DLT_NULL = 0x0 + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_SERIAL = 0x32 + DLT_PRONET = 0x4 + DLT_RAW = 0xe + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EMT_TAGOVF = 0x1 + EMUL_ENABLED = 0x1 + EMUL_NATIVE = 0x2 + ENDRUNDISC = 0x9 + ETHERMIN = 0x2e + ETHERMTU = 0x5dc + ETHERTYPE_8023 = 0x4 + ETHERTYPE_AARP = 0x80f3 + ETHERTYPE_ACCTON = 0x8390 + ETHERTYPE_AEONIC = 0x8036 + ETHERTYPE_ALPHA = 0x814a + ETHERTYPE_AMBER = 0x6008 + ETHERTYPE_AMOEBA = 0x8145 + ETHERTYPE_AOE = 0x88a2 + ETHERTYPE_APOLLO = 0x80f7 + ETHERTYPE_APOLLODOMAIN = 0x8019 + ETHERTYPE_APPLETALK = 0x809b + ETHERTYPE_APPLITEK = 0x80c7 + ETHERTYPE_ARGONAUT = 0x803a + ETHERTYPE_ARP = 0x806 + ETHERTYPE_AT = 0x809b + ETHERTYPE_ATALK = 0x809b + ETHERTYPE_ATOMIC = 0x86df + ETHERTYPE_ATT = 0x8069 + ETHERTYPE_ATTSTANFORD = 0x8008 + ETHERTYPE_AUTOPHON = 0x806a + ETHERTYPE_AXIS = 0x8856 + ETHERTYPE_BCLOOP = 0x9003 + ETHERTYPE_BOFL = 0x8102 + ETHERTYPE_CABLETRON = 0x7034 + ETHERTYPE_CHAOS = 0x804 + ETHERTYPE_COMDESIGN = 0x806c + ETHERTYPE_COMPUGRAPHIC = 0x806d + ETHERTYPE_COUNTERPOINT = 0x8062 + ETHERTYPE_CRONUS = 0x8004 + ETHERTYPE_CRONUSVLN = 0x8003 + ETHERTYPE_DCA = 0x1234 + ETHERTYPE_DDE = 0x807b + ETHERTYPE_DEBNI = 0xaaaa + ETHERTYPE_DECAM = 0x8048 + ETHERTYPE_DECCUST = 0x6006 + ETHERTYPE_DECDIAG = 0x6005 + ETHERTYPE_DECDNS = 0x803c + ETHERTYPE_DECDTS = 0x803e + ETHERTYPE_DECEXPER = 0x6000 + ETHERTYPE_DECLAST = 0x8041 + ETHERTYPE_DECLTM = 0x803f + ETHERTYPE_DECMUMPS = 0x6009 + ETHERTYPE_DECNETBIOS = 0x8040 + ETHERTYPE_DELTACON = 0x86de + ETHERTYPE_DIDDLE = 0x4321 + ETHERTYPE_DLOG1 = 0x660 + ETHERTYPE_DLOG2 = 0x661 + ETHERTYPE_DN = 0x6003 + ETHERTYPE_DOGFIGHT = 0x1989 + ETHERTYPE_DSMD = 0x8039 + ETHERTYPE_ECMA = 0x803 + ETHERTYPE_ENCRYPT = 0x803d + ETHERTYPE_ES = 0x805d + ETHERTYPE_EXCELAN = 0x8010 + ETHERTYPE_EXPERDATA = 0x8049 + ETHERTYPE_FLIP = 0x8146 + ETHERTYPE_FLOWCONTROL = 0x8808 + ETHERTYPE_FRARP = 0x808 + ETHERTYPE_GENDYN = 0x8068 + ETHERTYPE_HAYES = 0x8130 + ETHERTYPE_HIPPI_FP = 0x8180 + ETHERTYPE_HITACHI = 0x8820 + ETHERTYPE_HP = 0x8005 + ETHERTYPE_IEEEPUP = 0xa00 + ETHERTYPE_IEEEPUPAT = 0xa01 + ETHERTYPE_IMLBL = 0x4c42 + ETHERTYPE_IMLBLDIAG = 0x424c + ETHERTYPE_IP = 0x800 + ETHERTYPE_IPAS = 0x876c + ETHERTYPE_IPV6 = 0x86dd + ETHERTYPE_IPX = 0x8137 + ETHERTYPE_IPXNEW = 0x8037 + ETHERTYPE_KALPANA = 0x8582 + ETHERTYPE_LANBRIDGE = 0x8038 + ETHERTYPE_LANPROBE = 0x8888 + ETHERTYPE_LAT = 0x6004 + ETHERTYPE_LBACK = 0x9000 + ETHERTYPE_LITTLE = 0x8060 + ETHERTYPE_LLDP = 0x88cc + ETHERTYPE_LOGICRAFT = 0x8148 + ETHERTYPE_LOOPBACK = 0x9000 + ETHERTYPE_MATRA = 0x807a + ETHERTYPE_MAX = 0xffff + ETHERTYPE_MERIT = 0x807c + ETHERTYPE_MICP = 0x873a + ETHERTYPE_MOPDL = 0x6001 + ETHERTYPE_MOPRC = 0x6002 + ETHERTYPE_MOTOROLA = 0x818d + ETHERTYPE_MPLS = 0x8847 + ETHERTYPE_MPLS_MCAST = 0x8848 + ETHERTYPE_MUMPS = 0x813f + ETHERTYPE_NBPCC = 0x3c04 + ETHERTYPE_NBPCLAIM = 0x3c09 + ETHERTYPE_NBPCLREQ = 0x3c05 + ETHERTYPE_NBPCLRSP = 0x3c06 + ETHERTYPE_NBPCREQ = 0x3c02 + ETHERTYPE_NBPCRSP = 0x3c03 + ETHERTYPE_NBPDG = 0x3c07 + ETHERTYPE_NBPDGB = 0x3c08 + ETHERTYPE_NBPDLTE = 0x3c0a + ETHERTYPE_NBPRAR = 0x3c0c + ETHERTYPE_NBPRAS = 0x3c0b + ETHERTYPE_NBPRST = 0x3c0d + ETHERTYPE_NBPSCD = 0x3c01 + ETHERTYPE_NBPVCD = 0x3c00 + ETHERTYPE_NBS = 0x802 + ETHERTYPE_NCD = 0x8149 + ETHERTYPE_NESTAR = 0x8006 + ETHERTYPE_NETBEUI = 0x8191 + ETHERTYPE_NOVELL = 0x8138 + ETHERTYPE_NS = 0x600 + ETHERTYPE_NSAT = 0x601 + ETHERTYPE_NSCOMPAT = 0x807 + ETHERTYPE_NTRAILER = 0x10 + ETHERTYPE_OS9 = 0x7007 + ETHERTYPE_OS9NET = 0x7009 + ETHERTYPE_PACER = 0x80c6 + ETHERTYPE_PAE = 0x888e + ETHERTYPE_PCS = 0x4242 + ETHERTYPE_PLANNING = 0x8044 + ETHERTYPE_PPP = 0x880b + ETHERTYPE_PPPOE = 0x8864 + ETHERTYPE_PPPOEDISC = 0x8863 + ETHERTYPE_PRIMENTS = 0x7031 + ETHERTYPE_PUP = 0x200 + ETHERTYPE_PUPAT = 0x200 + ETHERTYPE_QINQ = 0x88a8 + ETHERTYPE_RACAL = 0x7030 + ETHERTYPE_RATIONAL = 0x8150 + ETHERTYPE_RAWFR = 0x6559 + ETHERTYPE_RCL = 0x1995 + ETHERTYPE_RDP = 0x8739 + ETHERTYPE_RETIX = 0x80f2 + ETHERTYPE_REVARP = 0x8035 + ETHERTYPE_SCA = 0x6007 + ETHERTYPE_SECTRA = 0x86db + ETHERTYPE_SECUREDATA = 0x876d + ETHERTYPE_SGITW = 0x817e + ETHERTYPE_SG_BOUNCE = 0x8016 + ETHERTYPE_SG_DIAG = 0x8013 + ETHERTYPE_SG_NETGAMES = 0x8014 + ETHERTYPE_SG_RESV = 0x8015 + ETHERTYPE_SIMNET = 0x5208 + ETHERTYPE_SLOW = 0x8809 + ETHERTYPE_SNA = 0x80d5 + ETHERTYPE_SNMP = 0x814c + ETHERTYPE_SONIX = 0xfaf5 + ETHERTYPE_SPIDER = 0x809f + ETHERTYPE_SPRITE = 0x500 + ETHERTYPE_STP = 0x8181 + ETHERTYPE_TALARIS = 0x812b + ETHERTYPE_TALARISMC = 0x852b + ETHERTYPE_TCPCOMP = 0x876b + ETHERTYPE_TCPSM = 0x9002 + ETHERTYPE_TEC = 0x814f + ETHERTYPE_TIGAN = 0x802f + ETHERTYPE_TRAIL = 0x1000 + ETHERTYPE_TRANSETHER = 0x6558 + ETHERTYPE_TYMSHARE = 0x802e + ETHERTYPE_UBBST = 0x7005 + ETHERTYPE_UBDEBUG = 0x900 + ETHERTYPE_UBDIAGLOOP = 0x7002 + ETHERTYPE_UBDL = 0x7000 + ETHERTYPE_UBNIU = 0x7001 + ETHERTYPE_UBNMC = 0x7003 + ETHERTYPE_VALID = 0x1600 + ETHERTYPE_VARIAN = 0x80dd + ETHERTYPE_VAXELN = 0x803b + ETHERTYPE_VEECO = 0x8067 + ETHERTYPE_VEXP = 0x805b + ETHERTYPE_VGLAB = 0x8131 + ETHERTYPE_VINES = 0xbad + ETHERTYPE_VINESECHO = 0xbaf + ETHERTYPE_VINESLOOP = 0xbae + ETHERTYPE_VITAL = 0xff00 + ETHERTYPE_VLAN = 0x8100 + ETHERTYPE_VLTLMAN = 0x8080 + ETHERTYPE_VPROD = 0x805c + ETHERTYPE_VURESERVED = 0x8147 + ETHERTYPE_WATERLOO = 0x8130 + ETHERTYPE_WELLFLEET = 0x8103 + ETHERTYPE_X25 = 0x805 + ETHERTYPE_X75 = 0x801 + ETHERTYPE_XNSSM = 0x9001 + ETHERTYPE_XTP = 0x817d + ETHER_ADDR_LEN = 0x6 + ETHER_ALIGN = 0x2 + ETHER_CRC_LEN = 0x4 + ETHER_CRC_POLY_BE = 0x4c11db6 + ETHER_CRC_POLY_LE = 0xedb88320 + ETHER_HDR_LEN = 0xe + ETHER_MAX_DIX_LEN = 0x600 + ETHER_MAX_LEN = 0x5ee + ETHER_MIN_LEN = 0x40 + ETHER_TYPE_LEN = 0x2 + ETHER_VLAN_ENCAP_LEN = 0x4 + EVFILT_AIO = -0x3 + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0x7 + EVFILT_TIMER = -0x7 + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0xa + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETOWN = 0x5 + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_WRLCK = 0x3 + HUPCL = 0x4000 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFA_ROUTE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x8e52 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BLUETOOTH = 0xf8 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf7 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DUMMY = 0xf1 + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ECONET = 0xce + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf3 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INFINIBAND = 0xc7 + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LINEGROUP = 0xd2 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf5 + IFT_PFLOW = 0xf9 + IFT_PFSYNC = 0xf6 + IFT_PLC = 0xae + IFT_PON155 = 0xcf + IFT_PON622 = 0xd0 + IFT_POS = 0xab + IFT_PPP = 0x17 + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPATM = 0xc5 + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf2 + IFT_Q2931 = 0xc9 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SIPSIG = 0xcc + IFT_SIPTG = 0xcb + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TELINK = 0xc8 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VIRTUALTG = 0xca + IFT_VOICEDID = 0xd5 + IFT_VOICEEM = 0x64 + IFT_VOICEEMFGD = 0xd3 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFGDEANA = 0xd4 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERCABLE = 0xc6 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IN_RFC3021_HOST = 0x1 + IN_RFC3021_NET = 0xfffffffe + IN_RFC3021_NSHIFT = 0x1f + IPPROTO_AH = 0x33 + IPPROTO_CARP = 0x70 + IPPROTO_DIVERT = 0x102 + IPPROTO_DIVERT_INIT = 0x2 + IPPROTO_DIVERT_RESP = 0x1 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPIP = 0x4 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x103 + IPPROTO_MOBILE = 0x37 + IPPROTO_MPLS = 0x89 + IPPROTO_NONE = 0x3b + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPV6_AUTH_LEVEL = 0x35 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_ESP_NETWORK_LEVEL = 0x37 + IPV6_ESP_TRANS_LEVEL = 0x36 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPCOMP_LEVEL = 0x3c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXPACKET = 0xffff + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_OPTIONS = 0x1 + IPV6_PATHMTU = 0x2c + IPV6_PIPEX = 0x3f + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVDSTPORT = 0x40 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTABLE = 0x1021 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_AUTH_LEVEL = 0x14 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DIVERTFL = 0x1022 + IP_DROP_MEMBERSHIP = 0xd + IP_ESP_NETWORK_LEVEL = 0x16 + IP_ESP_TRANS_LEVEL = 0x15 + IP_HDRINCL = 0x2 + IP_IPCOMP_LEVEL = 0x1d + IP_IPSECFLOWINFO = 0x24 + IP_IPSEC_LOCAL_AUTH = 0x1b + IP_IPSEC_LOCAL_CRED = 0x19 + IP_IPSEC_LOCAL_ID = 0x17 + IP_IPSEC_REMOTE_AUTH = 0x1c + IP_IPSEC_REMOTE_CRED = 0x1a + IP_IPSEC_REMOTE_ID = 0x18 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0xfff + IP_MF = 0x2000 + IP_MINTTL = 0x20 + IP_MIN_MEMBERSHIPS = 0xf + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x1 + IP_PIPEX = 0x22 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVDSTPORT = 0x21 + IP_RECVIF = 0x1e + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVRTABLE = 0x23 + IP_RECVTTL = 0x1f + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RTABLE = 0x1021 + IP_TOS = 0x3 + IP_TTL = 0x4 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + LCNT_OVERLOAD_FLUSH = 0x6 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x6 + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_SPACEAVAIL = 0x5 + MADV_WILLNEED = 0x3 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FLAGMASK = 0x3ff7 + MAP_HASSEMAPHORE = 0x0 + MAP_INHERIT = 0x0 + MAP_INHERIT_COPY = 0x1 + MAP_INHERIT_NONE = 0x2 + MAP_INHERIT_SHARE = 0x0 + MAP_INHERIT_ZERO = 0x3 + MAP_NOEXTEND = 0x0 + MAP_NORESERVE = 0x0 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x0 + MAP_SHARED = 0x1 + MAP_TRYFIXED = 0x0 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MSG_BCAST = 0x100 + MSG_CMSG_CLOEXEC = 0x800 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOR = 0x8 + MSG_MCAST = 0x200 + MSG_NOSIGNAL = 0x400 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x4 + MS_SYNC = 0x2 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_MAXID = 0x6 + NET_RT_STATS = 0x4 + NET_RT_TABLE = 0x5 + NOFLSH = 0x80000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + NOTE_EOF = 0x2 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRUNCATE = 0x80 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + ONLCR = 0x2 + ONLRET = 0x80 + ONOCR = 0x40 + ONOEOT = 0x8 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x10000 + O_CREAT = 0x200 + O_DIRECTORY = 0x20000 + O_DSYNC = 0x80 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x80 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PF_FLUSH = 0x1 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x8 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_LABEL = 0xa + RTAX_MAX = 0xb + RTAX_NETMASK = 0x2 + RTAX_SRC = 0x8 + RTAX_SRCMASK = 0x9 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_LABEL = 0x400 + RTA_NETMASK = 0x4 + RTA_SRC = 0x100 + RTA_SRCMASK = 0x200 + RTF_ANNOUNCE = 0x4000 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_CLONED = 0x10000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_FMASK = 0x70f808 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MASK = 0x80 + RTF_MODIFIED = 0x20 + RTF_MPATH = 0x40000 + RTF_MPLS = 0x100000 + RTF_PERMANENT_ARP = 0x2000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x2000 + RTF_REJECT = 0x8 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_USETRAILERS = 0x8000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DESYNC = 0x10 + RTM_GET = 0x4 + RTM_IFANNOUNCE = 0xf + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MAXSIZE = 0x800 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RT_TABLEID_MAX = 0xff + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x4 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCAIFGROUP = 0x80246987 + SIOCALIFADDR = 0x8218691c + SIOCATMARK = 0x40047307 + SIOCBRDGADD = 0x8054693c + SIOCBRDGADDS = 0x80546941 + SIOCBRDGARL = 0x806e694d + SIOCBRDGDADDR = 0x81286947 + SIOCBRDGDEL = 0x8054693d + SIOCBRDGDELS = 0x80546942 + SIOCBRDGFLUSH = 0x80546948 + SIOCBRDGFRL = 0x806e694e + SIOCBRDGGCACHE = 0xc0146941 + SIOCBRDGGFD = 0xc0146952 + SIOCBRDGGHT = 0xc0146951 + SIOCBRDGGIFFLGS = 0xc054693e + SIOCBRDGGMA = 0xc0146953 + SIOCBRDGGPARAM = 0xc03c6958 + SIOCBRDGGPRI = 0xc0146950 + SIOCBRDGGRL = 0xc028694f + SIOCBRDGGSIFS = 0xc054693c + SIOCBRDGGTO = 0xc0146946 + SIOCBRDGIFS = 0xc0546942 + SIOCBRDGRTS = 0xc0186943 + SIOCBRDGSADDR = 0xc1286944 + SIOCBRDGSCACHE = 0x80146940 + SIOCBRDGSFD = 0x80146952 + SIOCBRDGSHT = 0x80146951 + SIOCBRDGSIFCOST = 0x80546955 + SIOCBRDGSIFFLGS = 0x8054693f + SIOCBRDGSIFPRIO = 0x80546954 + SIOCBRDGSMA = 0x80146953 + SIOCBRDGSPRI = 0x80146950 + SIOCBRDGSPROTO = 0x8014695a + SIOCBRDGSTO = 0x80146945 + SIOCBRDGSTXHC = 0x80146959 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFGROUP = 0x80246989 + SIOCDIFPHYADDR = 0x80206949 + SIOCDLIFADDR = 0x8218691e + SIOCGETKALIVE = 0xc01869a4 + SIOCGETLABEL = 0x8020699a + SIOCGETPFLOW = 0xc02069fe + SIOCGETPFSYNC = 0xc02069f8 + SIOCGETSGCNT = 0xc0147534 + SIOCGETVIFCNT = 0xc0147533 + SIOCGETVLAN = 0xc0206990 + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFASYNCMAP = 0xc020697c + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCONF = 0xc0086924 + SIOCGIFDATA = 0xc020691b + SIOCGIFDESCR = 0xc0206981 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGATTR = 0xc024698b + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc024698a + SIOCGIFGROUP = 0xc0246988 + SIOCGIFHARDMTU = 0xc02069a5 + SIOCGIFMEDIA = 0xc0286936 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc020697e + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206948 + SIOCGIFPRIORITY = 0xc020699c + SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFRDOMAIN = 0xc02069a0 + SIOCGIFRTLABEL = 0xc0206983 + SIOCGIFRXR = 0x802069aa + SIOCGIFTIMESLOT = 0xc0206986 + SIOCGIFXFLAGS = 0xc020699e + SIOCGLIFADDR = 0xc218691d + SIOCGLIFPHYADDR = 0xc218694b + SIOCGLIFPHYRTABLE = 0xc02069a2 + SIOCGLIFPHYTTL = 0xc02069a9 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGSPPPPARAMS = 0xc0206994 + SIOCGVH = 0xc02069f6 + SIOCGVNETID = 0xc02069a7 + SIOCIFCREATE = 0x8020697a + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc00c6978 + SIOCSETKALIVE = 0x801869a3 + SIOCSETLABEL = 0x80206999 + SIOCSETPFLOW = 0x802069fd + SIOCSETPFSYNC = 0x802069f7 + SIOCSETVLAN = 0x8020698f + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFASYNCMAP = 0x8020697d + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFDESCR = 0x80206980 + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGATTR = 0x8024698c + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020691f + SIOCSIFMEDIA = 0xc0206935 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x8020697f + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSIFPRIORITY = 0x8020699b + SIOCSIFRDOMAIN = 0x8020699f + SIOCSIFRTLABEL = 0x80206982 + SIOCSIFTIMESLOT = 0x80206985 + SIOCSIFXFLAGS = 0x8020699d + SIOCSLIFPHYADDR = 0x8218694a + SIOCSLIFPHYRTABLE = 0x802069a1 + SIOCSLIFPHYTTL = 0x802069a8 + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSSPPPPARAMS = 0x80206993 + SIOCSVH = 0xc02069f5 + SIOCSVNETID = 0x802069a6 + SOCK_CLOEXEC = 0x8000 + SOCK_DGRAM = 0x2 + SOCK_NONBLOCK = 0x4000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_BINDANY = 0x1000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_NETPROC = 0x1020 + SO_OOBINLINE = 0x100 + SO_PEERCRED = 0x1022 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RTABLE = 0x1021 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_SPLICE = 0x1023 + SO_TIMESTAMP = 0x800 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + TCIFLUSH = 0x1 + TCIOFLUSH = 0x3 + TCOFLUSH = 0x2 + TCP_MAXBURST = 0x4 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x3 + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x4 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOPUSH = 0x10 + TCP_NSTATES = 0xb + TCP_SACK_ENABLE = 0x8 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLAG_CLOCAL = 0x2 + TIOCFLAG_CRTSCTS = 0x4 + TIOCFLAG_MDMBUF = 0x8 + TIOCFLAG_PPS = 0x10 + TIOCFLAG_SOFTCAR = 0x1 + TIOCFLUSH = 0x80047410 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGFLAGS = 0x4004745d + TIOCGPGRP = 0x40047477 + TIOCGSID = 0x40047463 + TIOCGTSTAMP = 0x400c745b + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGET = 0x4004746a + TIOCMODG = 0x4004746a + TIOCMODS = 0x8004746d + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSFLAGS = 0x8004745c + TIOCSIG = 0x8004745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x80047465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSTSTAMP = 0x8008745a + TIOCSWINSZ = 0x80087467 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WALTSIG = 0x4 + WCONTINUED = 0x8 + WCOREFLAG = 0x80 + WNOHANG = 0x1 + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x58) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x59) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EIPSEC = syscall.Errno(0x52) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x5b) + ELOOP = syscall.Errno(0x3e) + EMEDIUMTYPE = syscall.Errno(0x56) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x53) + ENOBUFS = syscall.Errno(0x37) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOMEDIUM = syscall.Errno(0x55) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x5a) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x5b) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x57) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHR = syscall.Signal(0x20) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "device not configured", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource deadlock avoided", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device busy", + 17: "file exists", + 18: "cross-device link", + 19: "operation not supported by device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "result too large", + 35: "resource temporarily unavailable", + 36: "operation now in progress", + 37: "operation already in progress", + 38: "socket operation on non-socket", + 39: "destination address required", + 40: "message too long", + 41: "protocol wrong type for socket", + 42: "protocol not available", + 43: "protocol not supported", + 44: "socket type not supported", + 45: "operation not supported", + 46: "protocol family not supported", + 47: "address family not supported by protocol family", + 48: "address already in use", + 49: "can't assign requested address", + 50: "network is down", + 51: "network is unreachable", + 52: "network dropped connection on reset", + 53: "software caused connection abort", + 54: "connection reset by peer", + 55: "no buffer space available", + 56: "socket is already connected", + 57: "socket is not connected", + 58: "can't send after socket shutdown", + 59: "too many references: can't splice", + 60: "connection timed out", + 61: "connection refused", + 62: "too many levels of symbolic links", + 63: "file name too long", + 64: "host is down", + 65: "no route to host", + 66: "directory not empty", + 67: "too many processes", + 68: "too many users", + 69: "disc quota exceeded", + 70: "stale NFS file handle", + 71: "too many levels of remote in path", + 72: "RPC struct is bad", + 73: "RPC version wrong", + 74: "RPC prog. not avail", + 75: "program version wrong", + 76: "bad procedure for program", + 77: "no locks available", + 78: "function not implemented", + 79: "inappropriate file type or format", + 80: "authentication error", + 81: "need authenticator", + 82: "IPsec processing failure", + 83: "attribute not found", + 84: "illegal byte sequence", + 85: "no medium found", + 86: "wrong medium type", + 87: "value too large to be stored in data type", + 88: "operation canceled", + 89: "identifier removed", + 90: "no message of desired type", + 91: "not supported", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/BPT trap", + 6: "abort trap", + 7: "EMT trap", + 8: "floating point exception", + 9: "killed", + 10: "bus error", + 11: "segmentation fault", + 12: "bad system call", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "urgent I/O condition", + 17: "stopped (signal)", + 18: "stopped", + 19: "continued", + 20: "child exited", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "I/O possible", + 24: "cputime limit exceeded", + 25: "filesize limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window size changes", + 29: "information request", + 30: "user defined signal 1", + 31: "user defined signal 2", + 32: "thread AST", +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go new file mode 100644 index 0000000..09eedb0 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go @@ -0,0 +1,1489 @@ +// mkerrors.sh -m64 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,solaris + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_802 = 0x12 + AF_APPLETALK = 0x10 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_ECMA = 0x8 + AF_FILE = 0x1 + AF_GOSIP = 0x16 + AF_HYLINK = 0xf + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1a + AF_INET_OFFLOAD = 0x1e + AF_IPX = 0x17 + AF_KEY = 0x1b + AF_LAT = 0xe + AF_LINK = 0x19 + AF_LOCAL = 0x1 + AF_MAX = 0x20 + AF_NBS = 0x7 + AF_NCA = 0x1c + AF_NIT = 0x11 + AF_NS = 0x6 + AF_OSI = 0x13 + AF_OSINET = 0x15 + AF_PACKET = 0x20 + AF_POLICY = 0x1d + AF_PUP = 0x4 + AF_ROUTE = 0x18 + AF_SNA = 0xb + AF_TRILL = 0x1f + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_X25 = 0x14 + ARPHRD_ARCNET = 0x7 + ARPHRD_ATM = 0x10 + ARPHRD_AX25 = 0x3 + ARPHRD_CHAOS = 0x5 + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_FC = 0x12 + ARPHRD_FRAME = 0xf + ARPHRD_HDLC = 0x11 + ARPHRD_IB = 0x20 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IPATM = 0x13 + ARPHRD_METRICOM = 0x17 + ARPHRD_TUNNEL = 0x1f + B0 = 0x0 + B110 = 0x3 + B115200 = 0x12 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B153600 = 0x13 + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B230400 = 0x14 + B2400 = 0xb + B300 = 0x7 + B307200 = 0x15 + B38400 = 0xf + B460800 = 0x16 + B4800 = 0xc + B50 = 0x1 + B57600 = 0x10 + B600 = 0x8 + B75 = 0x2 + B76800 = 0x11 + B921600 = 0x17 + B9600 = 0xd + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = -0x3fefbd89 + BIOCGDLTLIST32 = -0x3ff7bd89 + BIOCGETIF = 0x4020426b + BIOCGETLIF = 0x4078426b + BIOCGHDRCMPLT = 0x40044274 + BIOCGRTIMEOUT = 0x4010427b + BIOCGRTIMEOUT32 = 0x4008427b + BIOCGSEESENT = 0x40044278 + BIOCGSTATS = 0x4080426f + BIOCGSTATSOLD = 0x4008426f + BIOCIMMEDIATE = -0x7ffbbd90 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = -0x3ffbbd9a + BIOCSDLT = -0x7ffbbd8a + BIOCSETF = -0x7fefbd99 + BIOCSETF32 = -0x7ff7bd99 + BIOCSETIF = -0x7fdfbd94 + BIOCSETLIF = -0x7f87bd94 + BIOCSHDRCMPLT = -0x7ffbbd8b + BIOCSRTIMEOUT = -0x7fefbd86 + BIOCSRTIMEOUT32 = -0x7ff7bd86 + BIOCSSEESENT = -0x7ffbbd87 + BIOCSTCPF = -0x7fefbd8e + BIOCSUDPF = -0x7fefbd8d + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DFLTBUFSIZE = 0x100000 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x1000000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CBAUD = 0xf + CFLUSH = 0xf + CIBAUD = 0xf0000 + CLOCAL = 0x800 + CLOCK_HIGHRES = 0x4 + CLOCK_LEVEL = 0xa + CLOCK_MONOTONIC = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x5 + CLOCK_PROF = 0x2 + CLOCK_REALTIME = 0x3 + CLOCK_THREAD_CPUTIME_ID = 0x2 + CLOCK_VIRTUAL = 0x1 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + CSWTCH = 0x1a + DLT_AIRONET_HEADER = 0x78 + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_BACNET_MS_TP = 0xa5 + DLT_CHAOS = 0x5 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_DOCSIS = 0x8f + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FDDI = 0xa + DLT_FRELAY = 0x6b + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_HDLC = 0x10 + DLT_HHDLC = 0x79 + DLT_HIPPI = 0xf + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xa2 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0xe + DLT_PPP_PPPD = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAW = 0xc + DLT_RAWAF_MASK = 0x2240000 + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xd + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + EMPTY_SET = 0x0 + EMT_CPCOVF = 0x1 + EQUALITY_CHECK = 0x0 + EXTA = 0xe + EXTB = 0xf + FD_CLOEXEC = 0x1 + FD_NFDBITS = 0x40 + FD_SETSIZE = 0x10000 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHALL = 0x1 + FLUSHDATA = 0x0 + FLUSHO = 0x2000 + F_ALLOCSP = 0xa + F_ALLOCSP64 = 0xa + F_BADFD = 0x2e + F_BLKSIZE = 0x13 + F_BLOCKS = 0x12 + F_CHKFL = 0x8 + F_COMPAT = 0x8 + F_DUP2FD = 0x9 + F_DUP2FD_CLOEXEC = 0x24 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x25 + F_FLOCK = 0x35 + F_FLOCK64 = 0x35 + F_FLOCKW = 0x36 + F_FLOCKW64 = 0x36 + F_FREESP = 0xb + F_FREESP64 = 0xb + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0xe + F_GETLK64 = 0xe + F_GETOWN = 0x17 + F_GETXFL = 0x2d + F_HASREMOTELOCKS = 0x1a + F_ISSTREAM = 0xd + F_MANDDNY = 0x10 + F_MDACC = 0x20 + F_NODNY = 0x0 + F_NPRIV = 0x10 + F_OFD_GETLK = 0x2f + F_OFD_GETLK64 = 0x2f + F_OFD_SETLK = 0x30 + F_OFD_SETLK64 = 0x30 + F_OFD_SETLKW = 0x31 + F_OFD_SETLKW64 = 0x31 + F_PRIV = 0xf + F_QUOTACTL = 0x11 + F_RDACC = 0x1 + F_RDDNY = 0x1 + F_RDLCK = 0x1 + F_REVOKE = 0x19 + F_RMACC = 0x4 + F_RMDNY = 0x4 + F_RWACC = 0x3 + F_RWDNY = 0x3 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLK64_NBMAND = 0x2a + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETLK_NBMAND = 0x2a + F_SETOWN = 0x18 + F_SHARE = 0x28 + F_SHARE_NBMAND = 0x2b + F_UNLCK = 0x3 + F_UNLKSYS = 0x4 + F_UNSHARE = 0x29 + F_WRACC = 0x2 + F_WRDNY = 0x2 + F_WRLCK = 0x2 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFF_ADDRCONF = 0x80000 + IFF_ALLMULTI = 0x200 + IFF_ANYCAST = 0x400000 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x7f203003b5a + IFF_COS_ENABLED = 0x200000000 + IFF_DEBUG = 0x4 + IFF_DEPRECATED = 0x40000 + IFF_DHCPRUNNING = 0x4000 + IFF_DUPLICATE = 0x4000000000 + IFF_FAILED = 0x10000000 + IFF_FIXEDMTU = 0x1000000000 + IFF_INACTIVE = 0x40000000 + IFF_INTELLIGENT = 0x400 + IFF_IPMP = 0x8000000000 + IFF_IPMP_CANTCHANGE = 0x10000000 + IFF_IPMP_INVALID = 0x1ec200080 + IFF_IPV4 = 0x1000000 + IFF_IPV6 = 0x2000000 + IFF_L3PROTECT = 0x40000000000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x800 + IFF_MULTI_BCAST = 0x1000 + IFF_NOACCEPT = 0x4000000 + IFF_NOARP = 0x80 + IFF_NOFAILOVER = 0x8000000 + IFF_NOLINKLOCAL = 0x20000000000 + IFF_NOLOCAL = 0x20000 + IFF_NONUD = 0x200000 + IFF_NORTEXCH = 0x800000 + IFF_NOTRAILERS = 0x20 + IFF_NOXMIT = 0x10000 + IFF_OFFLINE = 0x80000000 + IFF_POINTOPOINT = 0x10 + IFF_PREFERRED = 0x400000000 + IFF_PRIVATE = 0x8000 + IFF_PROMISC = 0x100 + IFF_ROUTER = 0x100000 + IFF_RUNNING = 0x40 + IFF_STANDBY = 0x20000000 + IFF_TEMPORARY = 0x800000000 + IFF_UNNUMBERED = 0x2000 + IFF_UP = 0x1 + IFF_VIRTUAL = 0x2000000000 + IFF_VRRP = 0x10000000000 + IFF_XRESOLV = 0x100000000 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_6TO4 = 0xca + IFT_AAL5 = 0x31 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ATM = 0x25 + IFT_CEPT = 0x13 + IFT_DS3 = 0x1e + IFT_EON = 0x19 + IFT_ETHER = 0x6 + IFT_FDDI = 0xf + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_HDH1822 = 0x3 + IFT_HIPPI = 0x2f + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IB = 0xc7 + IFT_IPV4 = 0xc8 + IFT_IPV6 = 0xc9 + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88026 = 0xa + IFT_LAPB = 0x10 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_NSIP = 0x1b + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PPP = 0x17 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PTPSERIAL = 0x16 + IFT_RS232 = 0x21 + IFT_SDLC = 0x11 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_STARLAN = 0xb + IFT_T1 = 0x12 + IFT_ULTRA = 0x1d + IFT_V35 = 0x2d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_AUTOCONF_MASK = 0xffff0000 + IN_AUTOCONF_NET = 0xa9fe0000 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_CLASSE_NET = 0xffffffff + IN_LOOPBACKNET = 0x7f + IN_PRIVATE12_MASK = 0xfff00000 + IN_PRIVATE12_NET = 0xac100000 + IN_PRIVATE16_MASK = 0xffff0000 + IN_PRIVATE16_NET = 0xc0a80000 + IN_PRIVATE8_MASK = 0xff000000 + IN_PRIVATE8_NET = 0xa000000 + IPPROTO_AH = 0x33 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x4 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_HELLO = 0x3f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPV6 = 0x29 + IPPROTO_MAX = 0x100 + IPPROTO_ND = 0x4d + IPPROTO_NONE = 0x3b + IPPROTO_OSPF = 0x59 + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_UDP = 0x11 + IPV6_ADD_MEMBERSHIP = 0x9 + IPV6_BOUND_IF = 0x41 + IPV6_CHECKSUM = 0x18 + IPV6_DONTFRAG = 0x21 + IPV6_DROP_MEMBERSHIP = 0xa + IPV6_DSTOPTS = 0xf + IPV6_FLOWINFO_FLOWLABEL = 0xffff0f00 + IPV6_FLOWINFO_TCLASS = 0xf00f + IPV6_HOPLIMIT = 0xc + IPV6_HOPOPTS = 0xe + IPV6_JOIN_GROUP = 0x9 + IPV6_LEAVE_GROUP = 0xa + IPV6_MULTICAST_HOPS = 0x7 + IPV6_MULTICAST_IF = 0x6 + IPV6_MULTICAST_LOOP = 0x8 + IPV6_NEXTHOP = 0xd + IPV6_PAD1_OPT = 0x0 + IPV6_PATHMTU = 0x25 + IPV6_PKTINFO = 0xb + IPV6_PREFER_SRC_CGA = 0x20 + IPV6_PREFER_SRC_CGADEFAULT = 0x10 + IPV6_PREFER_SRC_CGAMASK = 0x30 + IPV6_PREFER_SRC_COA = 0x2 + IPV6_PREFER_SRC_DEFAULT = 0x15 + IPV6_PREFER_SRC_HOME = 0x1 + IPV6_PREFER_SRC_MASK = 0x3f + IPV6_PREFER_SRC_MIPDEFAULT = 0x1 + IPV6_PREFER_SRC_MIPMASK = 0x3 + IPV6_PREFER_SRC_NONCGA = 0x10 + IPV6_PREFER_SRC_PUBLIC = 0x4 + IPV6_PREFER_SRC_TMP = 0x8 + IPV6_PREFER_SRC_TMPDEFAULT = 0x4 + IPV6_PREFER_SRC_TMPMASK = 0xc + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVHOPLIMIT = 0x13 + IPV6_RECVHOPOPTS = 0x14 + IPV6_RECVPATHMTU = 0x24 + IPV6_RECVPKTINFO = 0x12 + IPV6_RECVRTHDR = 0x16 + IPV6_RECVRTHDRDSTOPTS = 0x17 + IPV6_RECVTCLASS = 0x19 + IPV6_RTHDR = 0x10 + IPV6_RTHDRDSTOPTS = 0x11 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SEC_OPT = 0x22 + IPV6_SRC_PREFERENCES = 0x23 + IPV6_TCLASS = 0x26 + IPV6_UNICAST_HOPS = 0x5 + IPV6_UNSPEC_SRC = 0x42 + IPV6_USE_MIN_MTU = 0x20 + IPV6_V6ONLY = 0x27 + IP_ADD_MEMBERSHIP = 0x13 + IP_ADD_SOURCE_MEMBERSHIP = 0x17 + IP_BLOCK_SOURCE = 0x15 + IP_BOUND_IF = 0x41 + IP_BROADCAST = 0x106 + IP_BROADCAST_TTL = 0x43 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DHCPINIT_IF = 0x45 + IP_DONTFRAG = 0x1b + IP_DONTROUTE = 0x105 + IP_DROP_MEMBERSHIP = 0x14 + IP_DROP_SOURCE_MEMBERSHIP = 0x18 + IP_HDRINCL = 0x2 + IP_MAXPACKET = 0xffff + IP_MF = 0x2000 + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x10 + IP_MULTICAST_LOOP = 0x12 + IP_MULTICAST_TTL = 0x11 + IP_NEXTHOP = 0x19 + IP_OPTIONS = 0x1 + IP_PKTINFO = 0x1a + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x9 + IP_RECVOPTS = 0x5 + IP_RECVPKTINFO = 0x1a + IP_RECVRETOPTS = 0x6 + IP_RECVSLLA = 0xa + IP_RECVTTL = 0xb + IP_RETOPTS = 0x8 + IP_REUSEADDR = 0x104 + IP_SEC_OPT = 0x22 + IP_TOS = 0x3 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x16 + IP_UNSPEC_SRC = 0x42 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_ACCESS_DEFAULT = 0x6 + MADV_ACCESS_LWP = 0x7 + MADV_ACCESS_MANY = 0x8 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_NORMAL = 0x0 + MADV_PURGE = 0x9 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MAP_32BIT = 0x80 + MAP_ALIGN = 0x200 + MAP_ANON = 0x100 + MAP_ANONYMOUS = 0x100 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_INITDATA = 0x800 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_TEXT = 0x400 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MSG_CTRUNC = 0x10 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_DUPCTRL = 0x800 + MSG_EOR = 0x8 + MSG_MAXIOVLEN = 0x10 + MSG_NOTIFICATION = 0x100 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x20 + MSG_WAITALL = 0x40 + MSG_XPG4_2 = 0x8000 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_OLDSYNC = 0x0 + MS_SYNC = 0x4 + M_FLUSH = 0x86 + NAME_MAX = 0xff + NEWDEV = 0x1 + NL0 = 0x0 + NL1 = 0x100 + NLDLY = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + OLDDEV = 0x0 + ONBITSMAJOR = 0x7 + ONBITSMINOR = 0x8 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPENFAIL = -0x1 + OPOST = 0x1 + O_ACCMODE = 0x600003 + O_APPEND = 0x8 + O_CLOEXEC = 0x800000 + O_CREAT = 0x100 + O_DSYNC = 0x40 + O_EXCL = 0x400 + O_EXEC = 0x400000 + O_LARGEFILE = 0x2000 + O_NDELAY = 0x4 + O_NOCTTY = 0x800 + O_NOFOLLOW = 0x20000 + O_NOLINKS = 0x40000 + O_NONBLOCK = 0x80 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x8000 + O_SEARCH = 0x200000 + O_SIOCGIFCONF = -0x3ff796ec + O_SIOCGLIFCONF = -0x3fef9688 + O_SYNC = 0x10 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + O_XATTR = 0x4000 + PARENB = 0x100 + PAREXT = 0x100000 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0x6 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = -0x3 + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x9 + RTAX_NETMASK = 0x2 + RTAX_SRC = 0x8 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTA_NUMBITS = 0x9 + RTA_SRC = 0x100 + RTF_BLACKHOLE = 0x1000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INDIRECT = 0x40000 + RTF_KERNEL = 0x80000 + RTF_LLINFO = 0x400 + RTF_MASK = 0x80 + RTF_MODIFIED = 0x20 + RTF_MULTIRT = 0x10000 + RTF_PRIVATE = 0x2000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_REJECT = 0x8 + RTF_SETSRC = 0x20000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTF_ZONE = 0x100000 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_CHGADDR = 0xf + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_FREEADDR = 0x10 + RTM_GET = 0x4 + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_VERSION = 0x3 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RT_AWARE = 0x1 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_RIGHTS = 0x1010 + SCM_TIMESTAMP = 0x1013 + SCM_UCRED = 0x1012 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIG2STR_MAX = 0x20 + SIOCADDMULTI = -0x7fdf96cf + SIOCADDRT = -0x7fcf8df6 + SIOCATMARK = 0x40047307 + SIOCDARP = -0x7fdb96e0 + SIOCDELMULTI = -0x7fdf96ce + SIOCDELRT = -0x7fcf8df5 + SIOCDXARP = -0x7fff9658 + SIOCGARP = -0x3fdb96e1 + SIOCGDSTINFO = -0x3fff965c + SIOCGENADDR = -0x3fdf96ab + SIOCGENPSTATS = -0x3fdf96c7 + SIOCGETLSGCNT = -0x3fef8deb + SIOCGETNAME = 0x40107334 + SIOCGETPEER = 0x40107335 + SIOCGETPROP = -0x3fff8f44 + SIOCGETSGCNT = -0x3feb8deb + SIOCGETSYNC = -0x3fdf96d3 + SIOCGETVIFCNT = -0x3feb8dec + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = -0x3fdf96f3 + SIOCGIFBRDADDR = -0x3fdf96e9 + SIOCGIFCONF = -0x3ff796a4 + SIOCGIFDSTADDR = -0x3fdf96f1 + SIOCGIFFLAGS = -0x3fdf96ef + SIOCGIFHWADDR = -0x3fdf9647 + SIOCGIFINDEX = -0x3fdf96a6 + SIOCGIFMEM = -0x3fdf96ed + SIOCGIFMETRIC = -0x3fdf96e5 + SIOCGIFMTU = -0x3fdf96ea + SIOCGIFMUXID = -0x3fdf96a8 + SIOCGIFNETMASK = -0x3fdf96e7 + SIOCGIFNUM = 0x40046957 + SIOCGIP6ADDRPOLICY = -0x3fff965e + SIOCGIPMSFILTER = -0x3ffb964c + SIOCGLIFADDR = -0x3f87968f + SIOCGLIFBINDING = -0x3f879666 + SIOCGLIFBRDADDR = -0x3f879685 + SIOCGLIFCONF = -0x3fef965b + SIOCGLIFDADSTATE = -0x3f879642 + SIOCGLIFDSTADDR = -0x3f87968d + SIOCGLIFFLAGS = -0x3f87968b + SIOCGLIFGROUPINFO = -0x3f4b9663 + SIOCGLIFGROUPNAME = -0x3f879664 + SIOCGLIFHWADDR = -0x3f879640 + SIOCGLIFINDEX = -0x3f87967b + SIOCGLIFLNKINFO = -0x3f879674 + SIOCGLIFMETRIC = -0x3f879681 + SIOCGLIFMTU = -0x3f879686 + SIOCGLIFMUXID = -0x3f87967d + SIOCGLIFNETMASK = -0x3f879683 + SIOCGLIFNUM = -0x3ff3967e + SIOCGLIFSRCOF = -0x3fef964f + SIOCGLIFSUBNET = -0x3f879676 + SIOCGLIFTOKEN = -0x3f879678 + SIOCGLIFUSESRC = -0x3f879651 + SIOCGLIFZONE = -0x3f879656 + SIOCGLOWAT = 0x40047303 + SIOCGMSFILTER = -0x3ffb964e + SIOCGPGRP = 0x40047309 + SIOCGSTAMP = -0x3fef9646 + SIOCGXARP = -0x3fff9659 + SIOCIFDETACH = -0x7fdf96c8 + SIOCILB = -0x3ffb9645 + SIOCLIFADDIF = -0x3f879691 + SIOCLIFDELND = -0x7f879673 + SIOCLIFGETND = -0x3f879672 + SIOCLIFREMOVEIF = -0x7f879692 + SIOCLIFSETND = -0x7f879671 + SIOCLOWER = -0x7fdf96d7 + SIOCSARP = -0x7fdb96e2 + SIOCSCTPGOPT = -0x3fef9653 + SIOCSCTPPEELOFF = -0x3ffb9652 + SIOCSCTPSOPT = -0x7fef9654 + SIOCSENABLESDP = -0x3ffb9649 + SIOCSETPROP = -0x7ffb8f43 + SIOCSETSYNC = -0x7fdf96d4 + SIOCSHIWAT = -0x7ffb8d00 + SIOCSIFADDR = -0x7fdf96f4 + SIOCSIFBRDADDR = -0x7fdf96e8 + SIOCSIFDSTADDR = -0x7fdf96f2 + SIOCSIFFLAGS = -0x7fdf96f0 + SIOCSIFINDEX = -0x7fdf96a5 + SIOCSIFMEM = -0x7fdf96ee + SIOCSIFMETRIC = -0x7fdf96e4 + SIOCSIFMTU = -0x7fdf96eb + SIOCSIFMUXID = -0x7fdf96a7 + SIOCSIFNAME = -0x7fdf96b7 + SIOCSIFNETMASK = -0x7fdf96e6 + SIOCSIP6ADDRPOLICY = -0x7fff965d + SIOCSIPMSFILTER = -0x7ffb964b + SIOCSLGETREQ = -0x3fdf96b9 + SIOCSLIFADDR = -0x7f879690 + SIOCSLIFBRDADDR = -0x7f879684 + SIOCSLIFDSTADDR = -0x7f87968e + SIOCSLIFFLAGS = -0x7f87968c + SIOCSLIFGROUPNAME = -0x7f879665 + SIOCSLIFINDEX = -0x7f87967a + SIOCSLIFLNKINFO = -0x7f879675 + SIOCSLIFMETRIC = -0x7f879680 + SIOCSLIFMTU = -0x7f879687 + SIOCSLIFMUXID = -0x7f87967c + SIOCSLIFNAME = -0x3f87967f + SIOCSLIFNETMASK = -0x7f879682 + SIOCSLIFPREFIX = -0x3f879641 + SIOCSLIFSUBNET = -0x7f879677 + SIOCSLIFTOKEN = -0x7f879679 + SIOCSLIFUSESRC = -0x7f879650 + SIOCSLIFZONE = -0x7f879655 + SIOCSLOWAT = -0x7ffb8cfe + SIOCSLSTAT = -0x7fdf96b8 + SIOCSMSFILTER = -0x7ffb964d + SIOCSPGRP = -0x7ffb8cf8 + SIOCSPROMISC = -0x7ffb96d0 + SIOCSQPTR = -0x3ffb9648 + SIOCSSDSTATS = -0x3fdf96d2 + SIOCSSESTATS = -0x3fdf96d1 + SIOCSXARP = -0x7fff965a + SIOCTMYADDR = -0x3ff79670 + SIOCTMYSITE = -0x3ff7966e + SIOCTONLINK = -0x3ff7966f + SIOCUPPER = -0x7fdf96d8 + SIOCX25RCV = -0x3fdf96c4 + SIOCX25TBL = -0x3fdf96c3 + SIOCX25XMT = -0x3fdf96c5 + SIOCXPROTO = 0x20007337 + SOCK_CLOEXEC = 0x80000 + SOCK_DGRAM = 0x1 + SOCK_NDELAY = 0x200000 + SOCK_NONBLOCK = 0x100000 + SOCK_RAW = 0x4 + SOCK_RDM = 0x5 + SOCK_SEQPACKET = 0x6 + SOCK_STREAM = 0x2 + SOCK_TYPE_MASK = 0xffff + SOL_FILTER = 0xfffc + SOL_PACKET = 0xfffd + SOL_ROUTE = 0xfffe + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ALL = 0x3f + SO_ALLZONES = 0x1014 + SO_ANON_MLP = 0x100a + SO_ATTACH_FILTER = 0x40000001 + SO_BAND = 0x4000 + SO_BROADCAST = 0x20 + SO_COPYOPT = 0x80000 + SO_DEBUG = 0x1 + SO_DELIM = 0x8000 + SO_DETACH_FILTER = 0x40000002 + SO_DGRAM_ERRIND = 0x200 + SO_DOMAIN = 0x100c + SO_DONTLINGER = -0x81 + SO_DONTROUTE = 0x10 + SO_ERROPT = 0x40000 + SO_ERROR = 0x1007 + SO_EXCLBIND = 0x1015 + SO_HIWAT = 0x10 + SO_ISNTTY = 0x800 + SO_ISTTY = 0x400 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_LOWAT = 0x20 + SO_MAC_EXEMPT = 0x100b + SO_MAC_IMPLICIT = 0x1016 + SO_MAXBLK = 0x100000 + SO_MAXPSZ = 0x8 + SO_MINPSZ = 0x4 + SO_MREADOFF = 0x80 + SO_MREADON = 0x40 + SO_NDELOFF = 0x200 + SO_NDELON = 0x100 + SO_NODELIM = 0x10000 + SO_OOBINLINE = 0x100 + SO_PROTOTYPE = 0x1009 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVPSH = 0x100d + SO_RCVTIMEO = 0x1006 + SO_READOPT = 0x1 + SO_RECVUCRED = 0x400 + SO_REUSEADDR = 0x4 + SO_SECATTR = 0x1011 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_STRHOLD = 0x20000 + SO_TAIL = 0x200000 + SO_TIMESTAMP = 0x1013 + SO_TONSTOP = 0x2000 + SO_TOSTOP = 0x1000 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SO_VRRP = 0x1017 + SO_WROFF = 0x2 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TCFLSH = 0x5407 + TCGETA = 0x5401 + TCGETS = 0x540d + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_ABORT_THRESHOLD = 0x11 + TCP_ANONPRIVBIND = 0x20 + TCP_CONN_ABORT_THRESHOLD = 0x13 + TCP_CONN_NOTIFY_THRESHOLD = 0x12 + TCP_CORK = 0x18 + TCP_EXCLBIND = 0x21 + TCP_INIT_CWND = 0x15 + TCP_KEEPALIVE = 0x8 + TCP_KEEPALIVE_ABORT_THRESHOLD = 0x17 + TCP_KEEPALIVE_THRESHOLD = 0x16 + TCP_KEEPCNT = 0x23 + TCP_KEEPIDLE = 0x22 + TCP_KEEPINTVL = 0x24 + TCP_LINGER2 = 0x1c + TCP_MAXSEG = 0x2 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCP_NOTIFY_THRESHOLD = 0x10 + TCP_RECVDSTADDR = 0x14 + TCP_RTO_INITIAL = 0x19 + TCP_RTO_MAX = 0x1b + TCP_RTO_MIN = 0x1a + TCSAFLUSH = 0x5410 + TCSBRK = 0x5405 + TCSETA = 0x5402 + TCSETAF = 0x5404 + TCSETAW = 0x5403 + TCSETS = 0x540e + TCSETSF = 0x5410 + TCSETSW = 0x540f + TCXONC = 0x5406 + TIOC = 0x5400 + TIOCCBRK = 0x747a + TIOCCDTR = 0x7478 + TIOCCILOOP = 0x746c + TIOCEXCL = 0x740d + TIOCFLUSH = 0x7410 + TIOCGETC = 0x7412 + TIOCGETD = 0x7400 + TIOCGETP = 0x7408 + TIOCGLTC = 0x7474 + TIOCGPGRP = 0x7414 + TIOCGPPS = 0x547d + TIOCGPPSEV = 0x547f + TIOCGSID = 0x7416 + TIOCGSOFTCAR = 0x5469 + TIOCGWINSZ = 0x5468 + TIOCHPCL = 0x7402 + TIOCKBOF = 0x5409 + TIOCKBON = 0x5408 + TIOCLBIC = 0x747e + TIOCLBIS = 0x747f + TIOCLGET = 0x747c + TIOCLSET = 0x747d + TIOCMBIC = 0x741c + TIOCMBIS = 0x741b + TIOCMGET = 0x741d + TIOCMSET = 0x741a + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x7471 + TIOCNXCL = 0x740e + TIOCOUTQ = 0x7473 + TIOCREMOTE = 0x741e + TIOCSBRK = 0x747b + TIOCSCTTY = 0x7484 + TIOCSDTR = 0x7479 + TIOCSETC = 0x7411 + TIOCSETD = 0x7401 + TIOCSETN = 0x740a + TIOCSETP = 0x7409 + TIOCSIGNAL = 0x741f + TIOCSILOOP = 0x746d + TIOCSLTC = 0x7475 + TIOCSPGRP = 0x7415 + TIOCSPPS = 0x547e + TIOCSSOFTCAR = 0x546a + TIOCSTART = 0x746e + TIOCSTI = 0x7417 + TIOCSTOP = 0x746f + TIOCSWINSZ = 0x5467 + TOSTOP = 0x100 + VCEOF = 0x8 + VCEOL = 0x9 + VDISCARD = 0xd + VDSUSP = 0xb + VEOF = 0x4 + VEOL = 0x5 + VEOL2 = 0x6 + VERASE = 0x2 + VERASE2 = 0x11 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMIN = 0x4 + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTATUS = 0x10 + VSTOP = 0x9 + VSUSP = 0xa + VSWTCH = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WCONTFLG = 0xffff + WCONTINUED = 0x8 + WCOREFLG = 0x80 + WEXITED = 0x1 + WNOHANG = 0x40 + WNOWAIT = 0x80 + WOPTMASK = 0xcf + WRAP = 0x20000 + WSIGMASK = 0x7f + WSTOPFLG = 0x7f + WSTOPPED = 0x4 + WTRAPPED = 0x2 + WUNTRACED = 0x4 + XCASE = 0x4 + XTABS = 0x1800 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x7d) + EADDRNOTAVAIL = syscall.Errno(0x7e) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x7c) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x95) + EBADE = syscall.Errno(0x32) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x51) + EBADMSG = syscall.Errno(0x4d) + EBADR = syscall.Errno(0x33) + EBADRQC = syscall.Errno(0x36) + EBADSLT = syscall.Errno(0x37) + EBFONT = syscall.Errno(0x39) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x2f) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x25) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x82) + ECONNREFUSED = syscall.Errno(0x92) + ECONNRESET = syscall.Errno(0x83) + EDEADLK = syscall.Errno(0x2d) + EDEADLOCK = syscall.Errno(0x38) + EDESTADDRREQ = syscall.Errno(0x60) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x31) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x93) + EHOSTUNREACH = syscall.Errno(0x94) + EIDRM = syscall.Errno(0x24) + EILSEQ = syscall.Errno(0x58) + EINPROGRESS = syscall.Errno(0x96) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x85) + EISDIR = syscall.Errno(0x15) + EL2HLT = syscall.Errno(0x2c) + EL2NSYNC = syscall.Errno(0x26) + EL3HLT = syscall.Errno(0x27) + EL3RST = syscall.Errno(0x28) + ELIBACC = syscall.Errno(0x53) + ELIBBAD = syscall.Errno(0x54) + ELIBEXEC = syscall.Errno(0x57) + ELIBMAX = syscall.Errno(0x56) + ELIBSCN = syscall.Errno(0x55) + ELNRNG = syscall.Errno(0x29) + ELOCKUNMAPPED = syscall.Errno(0x48) + ELOOP = syscall.Errno(0x5a) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x61) + EMULTIHOP = syscall.Errno(0x4a) + ENAMETOOLONG = syscall.Errno(0x4e) + ENETDOWN = syscall.Errno(0x7f) + ENETRESET = syscall.Errno(0x81) + ENETUNREACH = syscall.Errno(0x80) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x35) + ENOBUFS = syscall.Errno(0x84) + ENOCSI = syscall.Errno(0x2b) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x2e) + ENOLINK = syscall.Errno(0x43) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x23) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x63) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x59) + ENOTACTIVE = syscall.Errno(0x49) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x86) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x5d) + ENOTRECOVERABLE = syscall.Errno(0x3b) + ENOTSOCK = syscall.Errno(0x5f) + ENOTSUP = syscall.Errno(0x30) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x50) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x7a) + EOVERFLOW = syscall.Errno(0x4f) + EOWNERDEAD = syscall.Errno(0x3a) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x7b) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x78) + EPROTOTYPE = syscall.Errno(0x62) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x52) + EREMOTE = syscall.Errno(0x42) + ERESTART = syscall.Errno(0x5b) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x8f) + ESOCKTNOSUPPORT = syscall.Errno(0x79) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x97) + ESTRPIPE = syscall.Errno(0x5c) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x91) + ETOOMANYREFS = syscall.Errno(0x90) + ETXTBSY = syscall.Errno(0x1a) + EUNATCH = syscall.Errno(0x2a) + EUSERS = syscall.Errno(0x5e) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x34) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCANCEL = syscall.Signal(0x24) + SIGCHLD = syscall.Signal(0x12) + SIGCLD = syscall.Signal(0x12) + SIGCONT = syscall.Signal(0x19) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGFREEZE = syscall.Signal(0x22) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x29) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x16) + SIGIOT = syscall.Signal(0x6) + SIGJVM1 = syscall.Signal(0x27) + SIGJVM2 = syscall.Signal(0x28) + SIGKILL = syscall.Signal(0x9) + SIGLOST = syscall.Signal(0x25) + SIGLWP = syscall.Signal(0x21) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x16) + SIGPROF = syscall.Signal(0x1d) + SIGPWR = syscall.Signal(0x13) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x17) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHAW = syscall.Signal(0x23) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x18) + SIGTTIN = syscall.Signal(0x1a) + SIGTTOU = syscall.Signal(0x1b) + SIGURG = syscall.Signal(0x15) + SIGUSR1 = syscall.Signal(0x10) + SIGUSR2 = syscall.Signal(0x11) + SIGVTALRM = syscall.Signal(0x1c) + SIGWAITING = syscall.Signal(0x20) + SIGWINCH = syscall.Signal(0x14) + SIGXCPU = syscall.Signal(0x1e) + SIGXFSZ = syscall.Signal(0x1f) + SIGXRES = syscall.Signal(0x26) +) + +// Error table +var errors = [...]string{ + 1: "not owner", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "I/O error", + 6: "no such device or address", + 7: "arg list too long", + 8: "exec format error", + 9: "bad file number", + 10: "no child processes", + 11: "resource temporarily unavailable", + 12: "not enough space", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device busy", + 17: "file exists", + 18: "cross-device link", + 19: "no such device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "file table overflow", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "argument out of domain", + 34: "result too large", + 35: "no message of desired type", + 36: "identifier removed", + 37: "channel number out of range", + 38: "level 2 not synchronized", + 39: "level 3 halted", + 40: "level 3 reset", + 41: "link number out of range", + 42: "protocol driver not attached", + 43: "no CSI structure available", + 44: "level 2 halted", + 45: "deadlock situation detected/avoided", + 46: "no record locks available", + 47: "operation canceled", + 48: "operation not supported", + 49: "disc quota exceeded", + 50: "bad exchange descriptor", + 51: "bad request descriptor", + 52: "message tables full", + 53: "anode table overflow", + 54: "bad request code", + 55: "invalid slot", + 56: "file locking deadlock", + 57: "bad font file format", + 58: "owner of the lock died", + 59: "lock is not recoverable", + 60: "not a stream device", + 61: "no data available", + 62: "timer expired", + 63: "out of stream resources", + 64: "machine is not on the network", + 65: "package not installed", + 66: "object is remote", + 67: "link has been severed", + 68: "advertise error", + 69: "srmount error", + 70: "communication error on send", + 71: "protocol error", + 72: "locked lock was unmapped ", + 73: "facility is not active", + 74: "multihop attempted", + 77: "not a data message", + 78: "file name too long", + 79: "value too large for defined data type", + 80: "name not unique on network", + 81: "file descriptor in bad state", + 82: "remote address changed", + 83: "can not access a needed shared library", + 84: "accessing a corrupted shared library", + 85: ".lib section in a.out corrupted", + 86: "attempting to link in more shared libraries than system limit", + 87: "can not exec a shared library directly", + 88: "illegal byte sequence", + 89: "operation not applicable", + 90: "number of symbolic links encountered during path name traversal exceeds MAXSYMLINKS", + 91: "error 91", + 92: "error 92", + 93: "directory not empty", + 94: "too many users", + 95: "socket operation on non-socket", + 96: "destination address required", + 97: "message too long", + 98: "protocol wrong type for socket", + 99: "option not supported by protocol", + 120: "protocol not supported", + 121: "socket type not supported", + 122: "operation not supported on transport endpoint", + 123: "protocol family not supported", + 124: "address family not supported by protocol family", + 125: "address already in use", + 126: "cannot assign requested address", + 127: "network is down", + 128: "network is unreachable", + 129: "network dropped connection because of reset", + 130: "software caused connection abort", + 131: "connection reset by peer", + 132: "no buffer space available", + 133: "transport endpoint is already connected", + 134: "transport endpoint is not connected", + 143: "cannot send after socket shutdown", + 144: "too many references: cannot splice", + 145: "connection timed out", + 146: "connection refused", + 147: "host is down", + 148: "no route to host", + 149: "operation already in progress", + 150: "operation now in progress", + 151: "stale NFS file handle", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal Instruction", + 5: "trace/Breakpoint Trap", + 6: "abort", + 7: "emulation Trap", + 8: "arithmetic Exception", + 9: "killed", + 10: "bus Error", + 11: "segmentation Fault", + 12: "bad System Call", + 13: "broken Pipe", + 14: "alarm Clock", + 15: "terminated", + 16: "user Signal 1", + 17: "user Signal 2", + 18: "child Status Changed", + 19: "power-Fail/Restart", + 20: "window Size Change", + 21: "urgent Socket Condition", + 22: "pollable Event", + 23: "stopped (signal)", + 24: "stopped (user)", + 25: "continued", + 26: "stopped (tty input)", + 27: "stopped (tty output)", + 28: "virtual Timer Expired", + 29: "profiling Timer Expired", + 30: "cpu Limit Exceeded", + 31: "file Size Limit Exceeded", + 32: "no runnable lwp", + 33: "inter-lwp signal", + 34: "checkpoint Freeze", + 35: "checkpoint Thaw", + 36: "thread Cancellation", + 37: "resource Lost", + 38: "resource Control Exceeded", + 39: "reserved for JVM 1", + 40: "reserved for JVM 2", + 41: "information Request", +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go new file mode 100644 index 0000000..10491e9 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go @@ -0,0 +1,1609 @@ +// mksyscall.pl -l32 -tags darwin,386 syscall_bsd.go syscall_darwin.go syscall_darwin_386.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build darwin,386 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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 bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, 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) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (r int, w int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + r = int(r0) + w = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kill(pid int, signum int, posix int) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), uintptr(posix)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exchangedata(path1 string, path2 string, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path1) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(path2) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXCHANGEDATA, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), uintptr(length>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES64, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := RawSyscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(fromfd int, from string, tofd int, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(offset>>32), uintptr(whence), 0, 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := Syscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setprivexec(flag int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIVEXEC, uintptr(flag), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), uintptr(length>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos), uintptr(pos>>32), 0, 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func gettimeofday(tp *Timeval) (sec int32, usec int32, err error) { + r0, r1, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + sec = int32(r0) + usec = int32(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go new file mode 100644 index 0000000..5f1f6bf --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go @@ -0,0 +1,1609 @@ +// mksyscall.pl -tags darwin,amd64 syscall_bsd.go syscall_darwin.go syscall_darwin_amd64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build darwin,amd64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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 bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, 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) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (r int, w int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + r = int(r0) + w = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kill(pid int, signum int, posix int) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), uintptr(posix)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exchangedata(path1 string, path2 string, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path1) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(path2) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXCHANGEDATA, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES64, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := RawSyscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(fromfd int, from string, tofd int, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + newoffset = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := Syscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setprivexec(flag int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIVEXEC, uintptr(flag), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos)) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func gettimeofday(tp *Timeval) (sec int64, usec int32, err error) { + r0, r1, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + sec = int64(r0) + usec = int32(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go new file mode 100644 index 0000000..7a40974 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go @@ -0,0 +1,1609 @@ +// mksyscall.pl -tags darwin,arm syscall_bsd.go syscall_darwin.go syscall_darwin_arm.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build darwin,arm + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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 bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, 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) + } + _, _, e1 := Syscall6(SYS_SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (r int, w int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + r = int(r0) + w = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kill(pid int, signum int, posix int) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), uintptr(posix)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exchangedata(path1 string, path2 string, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path1) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(path2) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXCHANGEDATA, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), uintptr(length>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES64, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := RawSyscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(fromfd int, from string, tofd int, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(offset>>32), uintptr(whence), 0, 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := Syscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setprivexec(flag int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIVEXEC, uintptr(flag), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), uintptr(length>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos), uintptr(pos>>32), 0, 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func gettimeofday(tp *Timeval) (sec int32, usec int32, err error) { + r0, r1, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + sec = int32(r0) + usec = int32(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go new file mode 100644 index 0000000..07c6ebc --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go @@ -0,0 +1,1609 @@ +// mksyscall.pl -tags darwin,arm64 syscall_bsd.go syscall_darwin.go syscall_darwin_arm64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build darwin,arm64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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 bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, 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) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (r int, w int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + r = int(r0) + w = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kill(pid int, signum int, posix int) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), uintptr(posix)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exchangedata(path1 string, path2 string, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path1) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(path2) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXCHANGEDATA, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES64, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := RawSyscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(fromfd int, from string, tofd int, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + newoffset = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := Syscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setprivexec(flag int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIVEXEC, uintptr(flag), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos)) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func gettimeofday(tp *Timeval) (sec int64, usec int32, err error) { + r0, r1, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + sec = int64(r0) + usec = int32(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go new file mode 100644 index 0000000..7fa205c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go @@ -0,0 +1,1440 @@ +// mksyscall.pl -dragonfly -tags dragonfly,amd64 syscall_bsd.go syscall_dragonfly.go syscall_dragonfly_amd64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build dragonfly,amd64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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 bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, 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) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (r int, w int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + r = int(r0) + w = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func extpread(fd int, p []byte, flags int, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EXTPREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(offset), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func extpwrite(fd int, p []byte, flags int, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EXTPWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(offset), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(whence), 0, 0) + newoffset = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), 0, 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go new file mode 100644 index 0000000..1a0bb4c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go @@ -0,0 +1,1877 @@ +// mksyscall.pl -l32 -tags freebsd,386 syscall_bsd.go syscall_freebsd.go syscall_freebsd_386.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build freebsd,386 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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 bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, 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) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (r int, w int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + r = int(r0) + w = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CapEnter() (err error) { + _, _, e1 := Syscall(SYS_CAP_ENTER, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func capRightsGet(version int, fd int, rightsp *CapRights) (err error) { + _, _, e1 := Syscall(SYS___CAP_RIGHTS_GET, uintptr(version), uintptr(fd), uintptr(unsafe.Pointer(rightsp))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func capRightsLimit(fd int, rightsp *CapRights) (err error) { + _, _, e1 := Syscall(SYS_CAP_RIGHTS_LIMIT, uintptr(fd), uintptr(unsafe.Pointer(rightsp)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListFd(fd int, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FD, uintptr(fd), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_POSIX_FADVISE, uintptr(fd), uintptr(offset), uintptr(offset>>32), uintptr(length), uintptr(length>>32), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), uintptr(length>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Openat(fdat int, path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(fdat), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(fromfd int, from string, tofd int, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(offset>>32), uintptr(whence), 0, 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), uintptr(length>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos), uintptr(pos>>32), 0, 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go new file mode 100644 index 0000000..ac1e8e0 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go @@ -0,0 +1,1877 @@ +// mksyscall.pl -tags freebsd,amd64 syscall_bsd.go syscall_freebsd.go syscall_freebsd_amd64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build freebsd,amd64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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 bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, 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) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (r int, w int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + r = int(r0) + w = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CapEnter() (err error) { + _, _, e1 := Syscall(SYS_CAP_ENTER, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func capRightsGet(version int, fd int, rightsp *CapRights) (err error) { + _, _, e1 := Syscall(SYS___CAP_RIGHTS_GET, uintptr(version), uintptr(fd), uintptr(unsafe.Pointer(rightsp))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func capRightsLimit(fd int, rightsp *CapRights) (err error) { + _, _, e1 := Syscall(SYS_CAP_RIGHTS_LIMIT, uintptr(fd), uintptr(unsafe.Pointer(rightsp)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListFd(fd int, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FD, uintptr(fd), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_POSIX_FADVISE, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Openat(fdat int, path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(fdat), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(fromfd int, from string, tofd int, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + newoffset = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos)) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go new file mode 100644 index 0000000..2b4e6ac --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go @@ -0,0 +1,1877 @@ +// mksyscall.pl -l32 -arm -tags freebsd,arm syscall_bsd.go syscall_freebsd.go syscall_freebsd_arm.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build freebsd,arm + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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 bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, 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) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (r int, w int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + r = int(r0) + w = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CapEnter() (err error) { + _, _, e1 := Syscall(SYS_CAP_ENTER, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func capRightsGet(version int, fd int, rightsp *CapRights) (err error) { + _, _, e1 := Syscall(SYS___CAP_RIGHTS_GET, uintptr(version), uintptr(fd), uintptr(unsafe.Pointer(rightsp))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func capRightsLimit(fd int, rightsp *CapRights) (err error) { + _, _, e1 := Syscall(SYS_CAP_RIGHTS_LIMIT, uintptr(fd), uintptr(unsafe.Pointer(rightsp)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListFd(fd int, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FD, uintptr(fd), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall9(SYS_POSIX_FADVISE, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(length), uintptr(length>>32), uintptr(advice), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall6(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Openat(fdat int, path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(fdat), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(fromfd int, from string, tofd int, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(whence), 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), uintptr(pos>>32), 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go new file mode 100644 index 0000000..000a468 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go @@ -0,0 +1,1953 @@ +// mksyscall.pl -l32 -tags linux,386 syscall_linux.go syscall_linux_386.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,386 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(off>>32), uintptr(len), uintptr(len>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + Syscall(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, r1, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]_C_int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_FADVISE64_64, uintptr(fd), uintptr(offset), uintptr(offset>>32), uintptr(length), uintptr(length>>32), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN32, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE64, uintptr(fd), uintptr(length), uintptr(length>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID32, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _, _ := RawSyscall(SYS_GETEUID32, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID32, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID32, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ioperm(from int, num int, on int) (err error) { + _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Iopl(level int) (err error) { + _, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN32, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE64, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID32, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID32, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID32, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID32, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID32, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID32, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(off>>32), uintptr(n), uintptr(n>>32), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE64, uintptr(unsafe.Pointer(_p0)), uintptr(length), uintptr(length>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS32, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS32, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP2, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(pageOffset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getrlimit(resource int, rlim *rlimit32) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setrlimit(resource int, rlim *rlimit32) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Time(t *Time_t) (tt Time_t, err error) { + r0, _, e1 := RawSyscall(SYS_TIME, uintptr(unsafe.Pointer(t)), 0, 0) + tt = Time_t(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go new file mode 100644 index 0000000..712dffd --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go @@ -0,0 +1,2146 @@ +// mksyscall.pl -tags linux,amd64 syscall_linux.go syscall_linux_amd64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,amd64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + Syscall(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ioperm(from int, num int, on int) (err error) { + _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Iopl(level int) (err error) { + _, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, buf *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]_C_int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go new file mode 100644 index 0000000..338796d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go @@ -0,0 +1,2055 @@ +// mksyscall.pl -l32 -arm -tags linux,arm syscall_linux.go syscall_linux_arm.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,arm + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(off>>32), uintptr(len), uintptr(len>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + Syscall(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, r1, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS32, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS32, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, flags int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(flags), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN32, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID32, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _, _ := RawSyscall(SYS_GETEUID32, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID32, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID32, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN32, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE64, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID32, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID32, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID32, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID32, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID32, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID32, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_TRUNCATE64, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall6(SYS_FTRUNCATE64, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP2, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(pageOffset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getrlimit(resource int, rlim *rlimit32) (err error) { + _, _, e1 := RawSyscall(SYS_UGETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setrlimit(resource int, rlim *rlimit32) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go new file mode 100644 index 0000000..fc3006d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go @@ -0,0 +1,2029 @@ +// mksyscall.pl -tags linux,arm64 syscall_linux.go syscall_linux_arm64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,arm64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + Syscall(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_PWAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, buf *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go new file mode 100644 index 0000000..4b0ef20 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go @@ -0,0 +1,2111 @@ +// mksyscall.pl -b32 -arm -tags linux,mips syscall_linux.go syscall_linux_mipsx.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,mips + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off>>32), uintptr(off), uintptr(len>>32), uintptr(len)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + Syscall(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, r1, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(int64(r0)<<32 | int64(r1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall6(SYS_FTRUNCATE64, uintptr(fd), 0, uintptr(length>>32), uintptr(length), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset>>32), uintptr(offset)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset>>32), uintptr(offset)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE64, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, r1, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(int64(r0)<<32 | int64(r1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall9(SYS_SYNC_FILE_RANGE, uintptr(fd), 0, uintptr(off>>32), uintptr(off), uintptr(n>>32), uintptr(n), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_TRUNCATE64, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length>>32), uintptr(length), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ioperm(from int, num int, on int) (err error) { + _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Iopl(level int) (err error) { + _, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Time(t *Time_t) (tt Time_t, err error) { + r0, _, e1 := RawSyscall(SYS_TIME, uintptr(unsafe.Pointer(t)), 0, 0) + tt = Time_t(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP2, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(pageOffset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getrlimit(resource int, rlim *rlimit32) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setrlimit(resource int, rlim *rlimit32) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go new file mode 100644 index 0000000..31eb98c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go @@ -0,0 +1,2105 @@ +// mksyscall.pl -tags linux,mips64 syscall_linux.go syscall_linux_mips64x.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,mips64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + Syscall(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, buf *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fstat(fd int, st *stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(st)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func lstat(path string, st *stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(st)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func stat(path string, st *stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(st)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go new file mode 100644 index 0000000..875ffa3 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go @@ -0,0 +1,2105 @@ +// mksyscall.pl -tags linux,mips64le syscall_linux.go syscall_linux_mips64x.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,mips64le + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + Syscall(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, buf *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fstat(fd int, st *stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(st)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func lstat(path string, st *stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(st)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func stat(path string, st *stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(st)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go new file mode 100644 index 0000000..6863e81 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go @@ -0,0 +1,2111 @@ +// mksyscall.pl -l32 -arm -tags linux,mipsle syscall_linux.go syscall_linux_mipsx.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,mipsle + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(off>>32), uintptr(len), uintptr(len>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + Syscall(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, r1, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall6(SYS_FTRUNCATE64, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE64, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, r1, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall9(SYS_SYNC_FILE_RANGE, uintptr(fd), 0, uintptr(off), uintptr(off>>32), uintptr(n), uintptr(n>>32), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_TRUNCATE64, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ioperm(from int, num int, on int) (err error) { + _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Iopl(level int) (err error) { + _, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Time(t *Time_t) (tt Time_t, err error) { + r0, _, e1 := RawSyscall(SYS_TIME, uintptr(unsafe.Pointer(t)), 0, 0) + tt = Time_t(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP2, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(pageOffset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getrlimit(resource int, rlim *rlimit32) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setrlimit(resource int, rlim *rlimit32) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go new file mode 100644 index 0000000..2a32c6b --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go @@ -0,0 +1,2157 @@ +// mksyscall.pl -tags linux,ppc64 syscall_linux.go syscall_linux_ppc64x.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,ppc64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + Syscall(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_UGETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ioperm(from int, num int, on int) (err error) { + _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Iopl(level int) (err error) { + _, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, buf *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE2, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Time(t *Time_t) (tt Time_t, err error) { + r0, _, e1 := RawSyscall(SYS_TIME, uintptr(unsafe.Pointer(t)), 0, 0) + tt = Time_t(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]_C_int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go new file mode 100644 index 0000000..8172d35 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go @@ -0,0 +1,2157 @@ +// mksyscall.pl -tags linux,ppc64le syscall_linux.go syscall_linux_ppc64x.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,ppc64le + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + Syscall(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_UGETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ioperm(from int, num int, on int) (err error) { + _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Iopl(level int) (err error) { + _, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, buf *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE2, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Time(t *Time_t) (tt Time_t, err error) { + r0, _, e1 := RawSyscall(SYS_TIME, uintptr(unsafe.Pointer(t)), 0, 0) + tt = Time_t(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]_C_int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go new file mode 100644 index 0000000..4902196 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go @@ -0,0 +1,1937 @@ +// mksyscall.pl -tags linux,s390x syscall_linux.go syscall_linux_s390x.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,s390x + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + Syscall(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, buf *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go new file mode 100644 index 0000000..2dd9843 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go @@ -0,0 +1,1833 @@ +// mksyscall.pl -tags linux,sparc64 syscall_linux.go syscall_linux_sparc64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,sparc64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + Syscall(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, buf *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]_C_int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go new file mode 100644 index 0000000..db99fd0 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go @@ -0,0 +1,1346 @@ +// mksyscall.pl -l32 -netbsd -tags netbsd,386 syscall_bsd.go syscall_netbsd.go syscall_netbsd_386.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build netbsd,386 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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 bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, 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) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (fd1 int, fd2 int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + fd1 = int(r0) + fd2 = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall6(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(whence), 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), uintptr(pos>>32), 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go new file mode 100644 index 0000000..7b6c2c8 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go @@ -0,0 +1,1346 @@ +// mksyscall.pl -netbsd -tags netbsd,amd64 syscall_bsd.go syscall_netbsd.go syscall_netbsd_amd64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build netbsd,amd64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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 bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, 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) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (fd1 int, fd2 int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + fd1 = int(r0) + fd2 = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(whence), 0, 0) + newoffset = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), 0, 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go new file mode 100644 index 0000000..0f4cc3b --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go @@ -0,0 +1,1346 @@ +// mksyscall.pl -l32 -netbsd -arm -tags netbsd,arm syscall_bsd.go syscall_netbsd.go syscall_netbsd_arm.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build netbsd,arm + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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 bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, 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) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (fd1 int, fd2 int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + fd1 = int(r0) + fd2 = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall6(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(whence), 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), uintptr(pos>>32), 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go new file mode 100644 index 0000000..7baea87 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go @@ -0,0 +1,1404 @@ +// mksyscall.pl -l32 -openbsd -tags openbsd,386 syscall_bsd.go syscall_openbsd.go syscall_openbsd_386.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build openbsd,386 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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 bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, 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) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]_C_int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall6(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(whence), 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), uintptr(pos>>32), 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go new file mode 100644 index 0000000..0d69ce6 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go @@ -0,0 +1,1404 @@ +// mksyscall.pl -openbsd -tags openbsd,amd64 syscall_bsd.go syscall_openbsd.go syscall_openbsd_amd64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build openbsd,amd64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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 bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, 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) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]_C_int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(whence), 0, 0) + newoffset = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), 0, 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go new file mode 100644 index 0000000..41572c2 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go @@ -0,0 +1,1404 @@ +// mksyscall.pl -l32 -openbsd -arm -tags openbsd,arm syscall_bsd.go syscall_openbsd.go syscall_openbsd_arm.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build openbsd,arm + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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 bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, 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) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]_C_int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall6(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(whence), 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), uintptr(pos>>32), 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go new file mode 100644 index 0000000..98b2665 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go @@ -0,0 +1,1630 @@ +// mksyscall_solaris.pl -tags solaris,amd64 syscall_solaris.go syscall_solaris_amd64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build solaris,amd64 + +package unix + +import ( + "syscall" + "unsafe" +) + +//go:cgo_import_dynamic libc_pipe pipe "libc.so" +//go:cgo_import_dynamic libc_getsockname getsockname "libsocket.so" +//go:cgo_import_dynamic libc_getcwd getcwd "libc.so" +//go:cgo_import_dynamic libc_getgroups getgroups "libc.so" +//go:cgo_import_dynamic libc_setgroups setgroups "libc.so" +//go:cgo_import_dynamic libc_wait4 wait4 "libc.so" +//go:cgo_import_dynamic libc_gethostname gethostname "libc.so" +//go:cgo_import_dynamic libc_utimes utimes "libc.so" +//go:cgo_import_dynamic libc_utimensat utimensat "libc.so" +//go:cgo_import_dynamic libc_fcntl fcntl "libc.so" +//go:cgo_import_dynamic libc_futimesat futimesat "libc.so" +//go:cgo_import_dynamic libc_accept accept "libsocket.so" +//go:cgo_import_dynamic libc___xnet_recvmsg __xnet_recvmsg "libsocket.so" +//go:cgo_import_dynamic libc___xnet_sendmsg __xnet_sendmsg "libsocket.so" +//go:cgo_import_dynamic libc_acct acct "libc.so" +//go:cgo_import_dynamic libc___makedev __makedev "libc.so" +//go:cgo_import_dynamic libc___major __major "libc.so" +//go:cgo_import_dynamic libc___minor __minor "libc.so" +//go:cgo_import_dynamic libc_ioctl ioctl "libc.so" +//go:cgo_import_dynamic libc_access access "libc.so" +//go:cgo_import_dynamic libc_adjtime adjtime "libc.so" +//go:cgo_import_dynamic libc_chdir chdir "libc.so" +//go:cgo_import_dynamic libc_chmod chmod "libc.so" +//go:cgo_import_dynamic libc_chown chown "libc.so" +//go:cgo_import_dynamic libc_chroot chroot "libc.so" +//go:cgo_import_dynamic libc_close close "libc.so" +//go:cgo_import_dynamic libc_creat creat "libc.so" +//go:cgo_import_dynamic libc_dup dup "libc.so" +//go:cgo_import_dynamic libc_dup2 dup2 "libc.so" +//go:cgo_import_dynamic libc_exit exit "libc.so" +//go:cgo_import_dynamic libc_fchdir fchdir "libc.so" +//go:cgo_import_dynamic libc_fchmod fchmod "libc.so" +//go:cgo_import_dynamic libc_fchmodat fchmodat "libc.so" +//go:cgo_import_dynamic libc_fchown fchown "libc.so" +//go:cgo_import_dynamic libc_fchownat fchownat "libc.so" +//go:cgo_import_dynamic libc_fdatasync fdatasync "libc.so" +//go:cgo_import_dynamic libc_flock flock "libc.so" +//go:cgo_import_dynamic libc_fpathconf fpathconf "libc.so" +//go:cgo_import_dynamic libc_fstat fstat "libc.so" +//go:cgo_import_dynamic libc_fstatvfs fstatvfs "libc.so" +//go:cgo_import_dynamic libc_getdents getdents "libc.so" +//go:cgo_import_dynamic libc_getgid getgid "libc.so" +//go:cgo_import_dynamic libc_getpid getpid "libc.so" +//go:cgo_import_dynamic libc_getpgid getpgid "libc.so" +//go:cgo_import_dynamic libc_getpgrp getpgrp "libc.so" +//go:cgo_import_dynamic libc_geteuid geteuid "libc.so" +//go:cgo_import_dynamic libc_getegid getegid "libc.so" +//go:cgo_import_dynamic libc_getppid getppid "libc.so" +//go:cgo_import_dynamic libc_getpriority getpriority "libc.so" +//go:cgo_import_dynamic libc_getrlimit getrlimit "libc.so" +//go:cgo_import_dynamic libc_getrusage getrusage "libc.so" +//go:cgo_import_dynamic libc_gettimeofday gettimeofday "libc.so" +//go:cgo_import_dynamic libc_getuid getuid "libc.so" +//go:cgo_import_dynamic libc_kill kill "libc.so" +//go:cgo_import_dynamic libc_lchown lchown "libc.so" +//go:cgo_import_dynamic libc_link link "libc.so" +//go:cgo_import_dynamic libc___xnet_llisten __xnet_llisten "libsocket.so" +//go:cgo_import_dynamic libc_lstat lstat "libc.so" +//go:cgo_import_dynamic libc_madvise madvise "libc.so" +//go:cgo_import_dynamic libc_mkdir mkdir "libc.so" +//go:cgo_import_dynamic libc_mkdirat mkdirat "libc.so" +//go:cgo_import_dynamic libc_mkfifo mkfifo "libc.so" +//go:cgo_import_dynamic libc_mkfifoat mkfifoat "libc.so" +//go:cgo_import_dynamic libc_mknod mknod "libc.so" +//go:cgo_import_dynamic libc_mknodat mknodat "libc.so" +//go:cgo_import_dynamic libc_mlock mlock "libc.so" +//go:cgo_import_dynamic libc_mlockall mlockall "libc.so" +//go:cgo_import_dynamic libc_mprotect mprotect "libc.so" +//go:cgo_import_dynamic libc_msync msync "libc.so" +//go:cgo_import_dynamic libc_munlock munlock "libc.so" +//go:cgo_import_dynamic libc_munlockall munlockall "libc.so" +//go:cgo_import_dynamic libc_nanosleep nanosleep "libc.so" +//go:cgo_import_dynamic libc_open open "libc.so" +//go:cgo_import_dynamic libc_openat openat "libc.so" +//go:cgo_import_dynamic libc_pathconf pathconf "libc.so" +//go:cgo_import_dynamic libc_pause pause "libc.so" +//go:cgo_import_dynamic libc_pread pread "libc.so" +//go:cgo_import_dynamic libc_pwrite pwrite "libc.so" +//go:cgo_import_dynamic libc_read read "libc.so" +//go:cgo_import_dynamic libc_readlink readlink "libc.so" +//go:cgo_import_dynamic libc_rename rename "libc.so" +//go:cgo_import_dynamic libc_renameat renameat "libc.so" +//go:cgo_import_dynamic libc_rmdir rmdir "libc.so" +//go:cgo_import_dynamic libc_lseek lseek "libc.so" +//go:cgo_import_dynamic libc_setegid setegid "libc.so" +//go:cgo_import_dynamic libc_seteuid seteuid "libc.so" +//go:cgo_import_dynamic libc_setgid setgid "libc.so" +//go:cgo_import_dynamic libc_sethostname sethostname "libc.so" +//go:cgo_import_dynamic libc_setpgid setpgid "libc.so" +//go:cgo_import_dynamic libc_setpriority setpriority "libc.so" +//go:cgo_import_dynamic libc_setregid setregid "libc.so" +//go:cgo_import_dynamic libc_setreuid setreuid "libc.so" +//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.so" +//go:cgo_import_dynamic libc_setsid setsid "libc.so" +//go:cgo_import_dynamic libc_setuid setuid "libc.so" +//go:cgo_import_dynamic libc_shutdown shutdown "libsocket.so" +//go:cgo_import_dynamic libc_stat stat "libc.so" +//go:cgo_import_dynamic libc_statvfs statvfs "libc.so" +//go:cgo_import_dynamic libc_symlink symlink "libc.so" +//go:cgo_import_dynamic libc_sync sync "libc.so" +//go:cgo_import_dynamic libc_times times "libc.so" +//go:cgo_import_dynamic libc_truncate truncate "libc.so" +//go:cgo_import_dynamic libc_fsync fsync "libc.so" +//go:cgo_import_dynamic libc_ftruncate ftruncate "libc.so" +//go:cgo_import_dynamic libc_umask umask "libc.so" +//go:cgo_import_dynamic libc_uname uname "libc.so" +//go:cgo_import_dynamic libc_umount umount "libc.so" +//go:cgo_import_dynamic libc_unlink unlink "libc.so" +//go:cgo_import_dynamic libc_unlinkat unlinkat "libc.so" +//go:cgo_import_dynamic libc_ustat ustat "libc.so" +//go:cgo_import_dynamic libc_utime utime "libc.so" +//go:cgo_import_dynamic libc___xnet_bind __xnet_bind "libsocket.so" +//go:cgo_import_dynamic libc___xnet_connect __xnet_connect "libsocket.so" +//go:cgo_import_dynamic libc_mmap mmap "libc.so" +//go:cgo_import_dynamic libc_munmap munmap "libc.so" +//go:cgo_import_dynamic libc___xnet_sendto __xnet_sendto "libsocket.so" +//go:cgo_import_dynamic libc___xnet_socket __xnet_socket "libsocket.so" +//go:cgo_import_dynamic libc___xnet_socketpair __xnet_socketpair "libsocket.so" +//go:cgo_import_dynamic libc_write write "libc.so" +//go:cgo_import_dynamic libc___xnet_getsockopt __xnet_getsockopt "libsocket.so" +//go:cgo_import_dynamic libc_getpeername getpeername "libsocket.so" +//go:cgo_import_dynamic libc_setsockopt setsockopt "libsocket.so" +//go:cgo_import_dynamic libc_recvfrom recvfrom "libsocket.so" + +//go:linkname procpipe libc_pipe +//go:linkname procgetsockname libc_getsockname +//go:linkname procGetcwd libc_getcwd +//go:linkname procgetgroups libc_getgroups +//go:linkname procsetgroups libc_setgroups +//go:linkname procwait4 libc_wait4 +//go:linkname procgethostname libc_gethostname +//go:linkname procutimes libc_utimes +//go:linkname procutimensat libc_utimensat +//go:linkname procfcntl libc_fcntl +//go:linkname procfutimesat libc_futimesat +//go:linkname procaccept libc_accept +//go:linkname proc__xnet_recvmsg libc___xnet_recvmsg +//go:linkname proc__xnet_sendmsg libc___xnet_sendmsg +//go:linkname procacct libc_acct +//go:linkname proc__makedev libc___makedev +//go:linkname proc__major libc___major +//go:linkname proc__minor libc___minor +//go:linkname procioctl libc_ioctl +//go:linkname procAccess libc_access +//go:linkname procAdjtime libc_adjtime +//go:linkname procChdir libc_chdir +//go:linkname procChmod libc_chmod +//go:linkname procChown libc_chown +//go:linkname procChroot libc_chroot +//go:linkname procClose libc_close +//go:linkname procCreat libc_creat +//go:linkname procDup libc_dup +//go:linkname procDup2 libc_dup2 +//go:linkname procExit libc_exit +//go:linkname procFchdir libc_fchdir +//go:linkname procFchmod libc_fchmod +//go:linkname procFchmodat libc_fchmodat +//go:linkname procFchown libc_fchown +//go:linkname procFchownat libc_fchownat +//go:linkname procFdatasync libc_fdatasync +//go:linkname procFlock libc_flock +//go:linkname procFpathconf libc_fpathconf +//go:linkname procFstat libc_fstat +//go:linkname procFstatvfs libc_fstatvfs +//go:linkname procGetdents libc_getdents +//go:linkname procGetgid libc_getgid +//go:linkname procGetpid libc_getpid +//go:linkname procGetpgid libc_getpgid +//go:linkname procGetpgrp libc_getpgrp +//go:linkname procGeteuid libc_geteuid +//go:linkname procGetegid libc_getegid +//go:linkname procGetppid libc_getppid +//go:linkname procGetpriority libc_getpriority +//go:linkname procGetrlimit libc_getrlimit +//go:linkname procGetrusage libc_getrusage +//go:linkname procGettimeofday libc_gettimeofday +//go:linkname procGetuid libc_getuid +//go:linkname procKill libc_kill +//go:linkname procLchown libc_lchown +//go:linkname procLink libc_link +//go:linkname proc__xnet_llisten libc___xnet_llisten +//go:linkname procLstat libc_lstat +//go:linkname procMadvise libc_madvise +//go:linkname procMkdir libc_mkdir +//go:linkname procMkdirat libc_mkdirat +//go:linkname procMkfifo libc_mkfifo +//go:linkname procMkfifoat libc_mkfifoat +//go:linkname procMknod libc_mknod +//go:linkname procMknodat libc_mknodat +//go:linkname procMlock libc_mlock +//go:linkname procMlockall libc_mlockall +//go:linkname procMprotect libc_mprotect +//go:linkname procMsync libc_msync +//go:linkname procMunlock libc_munlock +//go:linkname procMunlockall libc_munlockall +//go:linkname procNanosleep libc_nanosleep +//go:linkname procOpen libc_open +//go:linkname procOpenat libc_openat +//go:linkname procPathconf libc_pathconf +//go:linkname procPause libc_pause +//go:linkname procPread libc_pread +//go:linkname procPwrite libc_pwrite +//go:linkname procread libc_read +//go:linkname procReadlink libc_readlink +//go:linkname procRename libc_rename +//go:linkname procRenameat libc_renameat +//go:linkname procRmdir libc_rmdir +//go:linkname proclseek libc_lseek +//go:linkname procSetegid libc_setegid +//go:linkname procSeteuid libc_seteuid +//go:linkname procSetgid libc_setgid +//go:linkname procSethostname libc_sethostname +//go:linkname procSetpgid libc_setpgid +//go:linkname procSetpriority libc_setpriority +//go:linkname procSetregid libc_setregid +//go:linkname procSetreuid libc_setreuid +//go:linkname procSetrlimit libc_setrlimit +//go:linkname procSetsid libc_setsid +//go:linkname procSetuid libc_setuid +//go:linkname procshutdown libc_shutdown +//go:linkname procStat libc_stat +//go:linkname procStatvfs libc_statvfs +//go:linkname procSymlink libc_symlink +//go:linkname procSync libc_sync +//go:linkname procTimes libc_times +//go:linkname procTruncate libc_truncate +//go:linkname procFsync libc_fsync +//go:linkname procFtruncate libc_ftruncate +//go:linkname procUmask libc_umask +//go:linkname procUname libc_uname +//go:linkname procumount libc_umount +//go:linkname procUnlink libc_unlink +//go:linkname procUnlinkat libc_unlinkat +//go:linkname procUstat libc_ustat +//go:linkname procUtime libc_utime +//go:linkname proc__xnet_bind libc___xnet_bind +//go:linkname proc__xnet_connect libc___xnet_connect +//go:linkname procmmap libc_mmap +//go:linkname procmunmap libc_munmap +//go:linkname proc__xnet_sendto libc___xnet_sendto +//go:linkname proc__xnet_socket libc___xnet_socket +//go:linkname proc__xnet_socketpair libc___xnet_socketpair +//go:linkname procwrite libc_write +//go:linkname proc__xnet_getsockopt libc___xnet_getsockopt +//go:linkname procgetpeername libc_getpeername +//go:linkname procsetsockopt libc_setsockopt +//go:linkname procrecvfrom libc_recvfrom + +var ( + procpipe, + procgetsockname, + procGetcwd, + procgetgroups, + procsetgroups, + procwait4, + procgethostname, + procutimes, + procutimensat, + procfcntl, + procfutimesat, + procaccept, + proc__xnet_recvmsg, + proc__xnet_sendmsg, + procacct, + proc__makedev, + proc__major, + proc__minor, + procioctl, + procAccess, + procAdjtime, + procChdir, + procChmod, + procChown, + procChroot, + procClose, + procCreat, + procDup, + procDup2, + procExit, + procFchdir, + procFchmod, + procFchmodat, + procFchown, + procFchownat, + procFdatasync, + procFlock, + procFpathconf, + procFstat, + procFstatvfs, + procGetdents, + procGetgid, + procGetpid, + procGetpgid, + procGetpgrp, + procGeteuid, + procGetegid, + procGetppid, + procGetpriority, + procGetrlimit, + procGetrusage, + procGettimeofday, + procGetuid, + procKill, + procLchown, + procLink, + proc__xnet_llisten, + procLstat, + procMadvise, + procMkdir, + procMkdirat, + procMkfifo, + procMkfifoat, + procMknod, + procMknodat, + procMlock, + procMlockall, + procMprotect, + procMsync, + procMunlock, + procMunlockall, + procNanosleep, + procOpen, + procOpenat, + procPathconf, + procPause, + procPread, + procPwrite, + procread, + procReadlink, + procRename, + procRenameat, + procRmdir, + proclseek, + procSetegid, + procSeteuid, + procSetgid, + procSethostname, + procSetpgid, + procSetpriority, + procSetregid, + procSetreuid, + procSetrlimit, + procSetsid, + procSetuid, + procshutdown, + procStat, + procStatvfs, + procSymlink, + procSync, + procTimes, + procTruncate, + procFsync, + procFtruncate, + procUmask, + procUname, + procumount, + procUnlink, + procUnlinkat, + procUstat, + procUtime, + proc__xnet_bind, + proc__xnet_connect, + procmmap, + procmunmap, + proc__xnet_sendto, + proc__xnet_socket, + proc__xnet_socketpair, + procwrite, + proc__xnet_getsockopt, + procgetpeername, + procsetsockopt, + procrecvfrom syscallFunc +) + +func pipe(p *[2]_C_int) (n int, err error) { + r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procpipe)), 1, uintptr(unsafe.Pointer(p)), 0, 0, 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procgetsockname)), 3, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Getcwd(buf []byte) (n int, err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procGetcwd)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), 0, 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procgetgroups)), 2, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0, 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procsetgroups)), 2, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func wait4(pid int32, statusp *_C_int, options int, rusage *Rusage) (wpid int32, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procwait4)), 4, uintptr(pid), uintptr(unsafe.Pointer(statusp)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int32(r0) + if e1 != 0 { + err = e1 + } + return +} + +func gethostname(buf []byte) (n int, err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procgethostname)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), 0, 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procutimes)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func utimensat(fd int, path string, times *[2]Timespec, flag int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procutimensat)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flag), 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procfcntl)), 3, uintptr(fd), uintptr(cmd), uintptr(arg), 0, 0, 0) + val = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func futimesat(fildes int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procfutimesat)), 3, uintptr(fildes), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times)), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procaccept)), 3, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_recvmsg)), 3, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_sendmsg)), 3, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func acct(path *byte) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procacct)), 1, uintptr(unsafe.Pointer(path)), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func __makedev(version int, major uint, minor uint) (val uint64) { + r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&proc__makedev)), 3, uintptr(version), uintptr(major), uintptr(minor), 0, 0, 0) + val = uint64(r0) + return +} + +func __major(version int, dev uint64) (val uint) { + r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&proc__major)), 2, uintptr(version), uintptr(dev), 0, 0, 0, 0) + val = uint(r0) + return +} + +func __minor(version int, dev uint64) (val uint) { + r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&proc__minor)), 2, uintptr(version), uintptr(dev), 0, 0, 0, 0) + val = uint(r0) + return +} + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procioctl)), 3, uintptr(fd), uintptr(req), uintptr(arg), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procAccess)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procAdjtime)), 2, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChdir)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChmod)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChown)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChroot)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Close(fd int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procClose)), 1, uintptr(fd), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Creat(path string, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procCreat)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procDup)), 1, uintptr(fd), 0, 0, 0, 0, 0) + nfd = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procDup2)), 2, uintptr(oldfd), uintptr(newfd), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Exit(code int) { + sysvicall6(uintptr(unsafe.Pointer(&procExit)), 1, uintptr(code), 0, 0, 0, 0, 0) + return +} + +func Fchdir(fd int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchdir)), 1, uintptr(fd), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchmod)), 2, uintptr(fd), uintptr(mode), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchmodat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchown)), 3, uintptr(fd), uintptr(uid), uintptr(gid), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchownat)), 5, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = e1 + } + return +} + +func Fdatasync(fd int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFdatasync)), 1, uintptr(fd), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Flock(fd int, how int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFlock)), 2, uintptr(fd), uintptr(how), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFpathconf)), 2, uintptr(fd), uintptr(name), 0, 0, 0, 0) + val = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFstat)), 2, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Fstatvfs(fd int, vfsstat *Statvfs_t) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFstatvfs)), 2, uintptr(fd), uintptr(unsafe.Pointer(vfsstat)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Getdents(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procGetdents)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Getgid() (gid int) { + r0, _, _ := rawSysvicall6(uintptr(unsafe.Pointer(&procGetgid)), 0, 0, 0, 0, 0, 0, 0) + gid = int(r0) + return +} + +func Getpid() (pid int) { + r0, _, _ := rawSysvicall6(uintptr(unsafe.Pointer(&procGetpid)), 0, 0, 0, 0, 0, 0, 0) + pid = int(r0) + return +} + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetpgid)), 1, uintptr(pid), 0, 0, 0, 0, 0) + pgid = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Getpgrp() (pgid int, err error) { + r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetpgrp)), 0, 0, 0, 0, 0, 0, 0) + pgid = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Geteuid() (euid int) { + r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procGeteuid)), 0, 0, 0, 0, 0, 0, 0) + euid = int(r0) + return +} + +func Getegid() (egid int) { + r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procGetegid)), 0, 0, 0, 0, 0, 0, 0) + egid = int(r0) + return +} + +func Getppid() (ppid int) { + r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procGetppid)), 0, 0, 0, 0, 0, 0, 0) + ppid = int(r0) + return +} + +func Getpriority(which int, who int) (n int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procGetpriority)), 2, uintptr(which), uintptr(who), 0, 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetrlimit)), 2, uintptr(which), uintptr(unsafe.Pointer(lim)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetrusage)), 2, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGettimeofday)), 1, uintptr(unsafe.Pointer(tv)), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Getuid() (uid int) { + r0, _, _ := rawSysvicall6(uintptr(unsafe.Pointer(&procGetuid)), 0, 0, 0, 0, 0, 0, 0) + uid = int(r0) + return +} + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procKill)), 2, uintptr(pid), uintptr(signum), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procLchown)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procLink)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Listen(s int, backlog int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_llisten)), 2, uintptr(s), uintptr(backlog), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procLstat)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Madvise(b []byte, advice int) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMadvise)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(advice), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkdir)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkdirat)), 3, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkfifo)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Mkfifoat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkfifoat)), 3, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMknod)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMknodat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Mlock(b []byte) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMlock)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Mlockall(flags int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMlockall)), 1, uintptr(flags), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Mprotect(b []byte, prot int) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMprotect)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(prot), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Msync(b []byte, flags int) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMsync)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(flags), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Munlock(b []byte) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMunlock)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Munlockall() (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMunlockall)), 0, 0, 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procNanosleep)), 2, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procOpen)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procOpenat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procPathconf)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0, 0, 0, 0) + val = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Pause() (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procPause)), 0, 0, 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procPread)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procPwrite)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func read(fd int, p []byte) (n int, err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procread)), 3, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + if len(buf) > 0 { + _p1 = &buf[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procReadlink)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(len(buf)), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procRename)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procRenameat)), 4, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procRmdir)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proclseek)), 3, uintptr(fd), uintptr(offset), uintptr(whence), 0, 0, 0) + newoffset = int64(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Setegid(egid int) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetegid)), 1, uintptr(egid), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Seteuid(euid int) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSeteuid)), 1, uintptr(euid), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Setgid(gid int) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetgid)), 1, uintptr(gid), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Sethostname(p []byte) (err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSethostname)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetpgid)), 2, uintptr(pid), uintptr(pgid), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSetpriority)), 3, uintptr(which), uintptr(who), uintptr(prio), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetregid)), 2, uintptr(rgid), uintptr(egid), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetreuid)), 2, uintptr(ruid), uintptr(euid), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetrlimit)), 2, uintptr(which), uintptr(unsafe.Pointer(lim)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Setsid() (pid int, err error) { + r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetsid)), 0, 0, 0, 0, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Setuid(uid int) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetuid)), 1, uintptr(uid), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Shutdown(s int, how int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procshutdown)), 2, uintptr(s), uintptr(how), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procStat)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Statvfs(path string, vfsstat *Statvfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procStatvfs)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(vfsstat)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSymlink)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Sync() (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSync)), 0, 0, 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procTimes)), 1, uintptr(unsafe.Pointer(tms)), 0, 0, 0, 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procTruncate)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Fsync(fd int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFsync)), 1, uintptr(fd), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFtruncate)), 2, uintptr(fd), uintptr(length), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Umask(mask int) (oldmask int) { + r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procUmask)), 1, uintptr(mask), 0, 0, 0, 0, 0) + oldmask = int(r0) + return +} + +func Uname(buf *Utsname) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procUname)), 1, uintptr(unsafe.Pointer(buf)), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procumount)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUnlink)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUnlinkat)), 3, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUstat)), 2, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUtime)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_bind)), 3, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_connect)), 3, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procmmap)), 6, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos)) + ret = uintptr(r0) + if e1 != 0 { + err = e1 + } + return +} + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procmunmap)), 2, uintptr(addr), uintptr(length), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_sendto)), 6, uintptr(s), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = e1 + } + return +} + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_socket)), 3, uintptr(domain), uintptr(typ), uintptr(proto), 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&proc__xnet_socketpair)), 4, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func write(fd int, p []byte) (n int, err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procwrite)), 3, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_getsockopt)), 5, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = e1 + } + return +} + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procgetpeername)), 3, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procsetsockopt)), 5, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = e1 + } + return +} + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procrecvfrom)), 6, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go new file mode 100644 index 0000000..83bb935 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go @@ -0,0 +1,270 @@ +// mksysctl_openbsd.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +package unix + +type mibentry struct { + ctlname string + ctloid []_C_int +} + +var sysctlMib = []mibentry{ + {"ddb.console", []_C_int{9, 6}}, + {"ddb.log", []_C_int{9, 7}}, + {"ddb.max_line", []_C_int{9, 3}}, + {"ddb.max_width", []_C_int{9, 2}}, + {"ddb.panic", []_C_int{9, 5}}, + {"ddb.radix", []_C_int{9, 1}}, + {"ddb.tab_stop_width", []_C_int{9, 4}}, + {"ddb.trigger", []_C_int{9, 8}}, + {"fs.posix.setuid", []_C_int{3, 1, 1}}, + {"hw.allowpowerdown", []_C_int{6, 22}}, + {"hw.byteorder", []_C_int{6, 4}}, + {"hw.cpuspeed", []_C_int{6, 12}}, + {"hw.diskcount", []_C_int{6, 10}}, + {"hw.disknames", []_C_int{6, 8}}, + {"hw.diskstats", []_C_int{6, 9}}, + {"hw.machine", []_C_int{6, 1}}, + {"hw.model", []_C_int{6, 2}}, + {"hw.ncpu", []_C_int{6, 3}}, + {"hw.ncpufound", []_C_int{6, 21}}, + {"hw.pagesize", []_C_int{6, 7}}, + {"hw.physmem", []_C_int{6, 19}}, + {"hw.product", []_C_int{6, 15}}, + {"hw.serialno", []_C_int{6, 17}}, + {"hw.setperf", []_C_int{6, 13}}, + {"hw.usermem", []_C_int{6, 20}}, + {"hw.uuid", []_C_int{6, 18}}, + {"hw.vendor", []_C_int{6, 14}}, + {"hw.version", []_C_int{6, 16}}, + {"kern.arandom", []_C_int{1, 37}}, + {"kern.argmax", []_C_int{1, 8}}, + {"kern.boottime", []_C_int{1, 21}}, + {"kern.bufcachepercent", []_C_int{1, 72}}, + {"kern.ccpu", []_C_int{1, 45}}, + {"kern.clockrate", []_C_int{1, 12}}, + {"kern.consdev", []_C_int{1, 75}}, + {"kern.cp_time", []_C_int{1, 40}}, + {"kern.cp_time2", []_C_int{1, 71}}, + {"kern.cryptodevallowsoft", []_C_int{1, 53}}, + {"kern.domainname", []_C_int{1, 22}}, + {"kern.file", []_C_int{1, 73}}, + {"kern.forkstat", []_C_int{1, 42}}, + {"kern.fscale", []_C_int{1, 46}}, + {"kern.fsync", []_C_int{1, 33}}, + {"kern.hostid", []_C_int{1, 11}}, + {"kern.hostname", []_C_int{1, 10}}, + {"kern.intrcnt.nintrcnt", []_C_int{1, 63, 1}}, + {"kern.job_control", []_C_int{1, 19}}, + {"kern.malloc.buckets", []_C_int{1, 39, 1}}, + {"kern.malloc.kmemnames", []_C_int{1, 39, 3}}, + {"kern.maxclusters", []_C_int{1, 67}}, + {"kern.maxfiles", []_C_int{1, 7}}, + {"kern.maxlocksperuid", []_C_int{1, 70}}, + {"kern.maxpartitions", []_C_int{1, 23}}, + {"kern.maxproc", []_C_int{1, 6}}, + {"kern.maxthread", []_C_int{1, 25}}, + {"kern.maxvnodes", []_C_int{1, 5}}, + {"kern.mbstat", []_C_int{1, 59}}, + {"kern.msgbuf", []_C_int{1, 48}}, + {"kern.msgbufsize", []_C_int{1, 38}}, + {"kern.nchstats", []_C_int{1, 41}}, + {"kern.netlivelocks", []_C_int{1, 76}}, + {"kern.nfiles", []_C_int{1, 56}}, + {"kern.ngroups", []_C_int{1, 18}}, + {"kern.nosuidcoredump", []_C_int{1, 32}}, + {"kern.nprocs", []_C_int{1, 47}}, + {"kern.nselcoll", []_C_int{1, 43}}, + {"kern.nthreads", []_C_int{1, 26}}, + {"kern.numvnodes", []_C_int{1, 58}}, + {"kern.osrelease", []_C_int{1, 2}}, + {"kern.osrevision", []_C_int{1, 3}}, + {"kern.ostype", []_C_int{1, 1}}, + {"kern.osversion", []_C_int{1, 27}}, + {"kern.pool_debug", []_C_int{1, 77}}, + {"kern.posix1version", []_C_int{1, 17}}, + {"kern.proc", []_C_int{1, 66}}, + {"kern.random", []_C_int{1, 31}}, + {"kern.rawpartition", []_C_int{1, 24}}, + {"kern.saved_ids", []_C_int{1, 20}}, + {"kern.securelevel", []_C_int{1, 9}}, + {"kern.seminfo", []_C_int{1, 61}}, + {"kern.shminfo", []_C_int{1, 62}}, + {"kern.somaxconn", []_C_int{1, 28}}, + {"kern.sominconn", []_C_int{1, 29}}, + {"kern.splassert", []_C_int{1, 54}}, + {"kern.stackgap_random", []_C_int{1, 50}}, + {"kern.sysvipc_info", []_C_int{1, 51}}, + {"kern.sysvmsg", []_C_int{1, 34}}, + {"kern.sysvsem", []_C_int{1, 35}}, + {"kern.sysvshm", []_C_int{1, 36}}, + {"kern.timecounter.choice", []_C_int{1, 69, 4}}, + {"kern.timecounter.hardware", []_C_int{1, 69, 3}}, + {"kern.timecounter.tick", []_C_int{1, 69, 1}}, + {"kern.timecounter.timestepwarnings", []_C_int{1, 69, 2}}, + {"kern.tty.maxptys", []_C_int{1, 44, 6}}, + {"kern.tty.nptys", []_C_int{1, 44, 7}}, + {"kern.tty.tk_cancc", []_C_int{1, 44, 4}}, + {"kern.tty.tk_nin", []_C_int{1, 44, 1}}, + {"kern.tty.tk_nout", []_C_int{1, 44, 2}}, + {"kern.tty.tk_rawcc", []_C_int{1, 44, 3}}, + {"kern.tty.ttyinfo", []_C_int{1, 44, 5}}, + {"kern.ttycount", []_C_int{1, 57}}, + {"kern.userasymcrypto", []_C_int{1, 60}}, + {"kern.usercrypto", []_C_int{1, 52}}, + {"kern.usermount", []_C_int{1, 30}}, + {"kern.version", []_C_int{1, 4}}, + {"kern.vnode", []_C_int{1, 13}}, + {"kern.watchdog.auto", []_C_int{1, 64, 2}}, + {"kern.watchdog.period", []_C_int{1, 64, 1}}, + {"net.bpf.bufsize", []_C_int{4, 31, 1}}, + {"net.bpf.maxbufsize", []_C_int{4, 31, 2}}, + {"net.inet.ah.enable", []_C_int{4, 2, 51, 1}}, + {"net.inet.ah.stats", []_C_int{4, 2, 51, 2}}, + {"net.inet.carp.allow", []_C_int{4, 2, 112, 1}}, + {"net.inet.carp.log", []_C_int{4, 2, 112, 3}}, + {"net.inet.carp.preempt", []_C_int{4, 2, 112, 2}}, + {"net.inet.carp.stats", []_C_int{4, 2, 112, 4}}, + {"net.inet.divert.recvspace", []_C_int{4, 2, 258, 1}}, + {"net.inet.divert.sendspace", []_C_int{4, 2, 258, 2}}, + {"net.inet.divert.stats", []_C_int{4, 2, 258, 3}}, + {"net.inet.esp.enable", []_C_int{4, 2, 50, 1}}, + {"net.inet.esp.stats", []_C_int{4, 2, 50, 4}}, + {"net.inet.esp.udpencap", []_C_int{4, 2, 50, 2}}, + {"net.inet.esp.udpencap_port", []_C_int{4, 2, 50, 3}}, + {"net.inet.etherip.allow", []_C_int{4, 2, 97, 1}}, + {"net.inet.etherip.stats", []_C_int{4, 2, 97, 2}}, + {"net.inet.gre.allow", []_C_int{4, 2, 47, 1}}, + {"net.inet.gre.wccp", []_C_int{4, 2, 47, 2}}, + {"net.inet.icmp.bmcastecho", []_C_int{4, 2, 1, 2}}, + {"net.inet.icmp.errppslimit", []_C_int{4, 2, 1, 3}}, + {"net.inet.icmp.maskrepl", []_C_int{4, 2, 1, 1}}, + {"net.inet.icmp.rediraccept", []_C_int{4, 2, 1, 4}}, + {"net.inet.icmp.redirtimeout", []_C_int{4, 2, 1, 5}}, + {"net.inet.icmp.stats", []_C_int{4, 2, 1, 7}}, + {"net.inet.icmp.tstamprepl", []_C_int{4, 2, 1, 6}}, + {"net.inet.igmp.stats", []_C_int{4, 2, 2, 1}}, + {"net.inet.ip.arpqueued", []_C_int{4, 2, 0, 36}}, + {"net.inet.ip.encdebug", []_C_int{4, 2, 0, 12}}, + {"net.inet.ip.forwarding", []_C_int{4, 2, 0, 1}}, + {"net.inet.ip.ifq.congestion", []_C_int{4, 2, 0, 30, 4}}, + {"net.inet.ip.ifq.drops", []_C_int{4, 2, 0, 30, 3}}, + {"net.inet.ip.ifq.len", []_C_int{4, 2, 0, 30, 1}}, + {"net.inet.ip.ifq.maxlen", []_C_int{4, 2, 0, 30, 2}}, + {"net.inet.ip.maxqueue", []_C_int{4, 2, 0, 11}}, + {"net.inet.ip.mforwarding", []_C_int{4, 2, 0, 31}}, + {"net.inet.ip.mrtproto", []_C_int{4, 2, 0, 34}}, + {"net.inet.ip.mrtstats", []_C_int{4, 2, 0, 35}}, + {"net.inet.ip.mtu", []_C_int{4, 2, 0, 4}}, + {"net.inet.ip.mtudisc", []_C_int{4, 2, 0, 27}}, + {"net.inet.ip.mtudisctimeout", []_C_int{4, 2, 0, 28}}, + {"net.inet.ip.multipath", []_C_int{4, 2, 0, 32}}, + {"net.inet.ip.portfirst", []_C_int{4, 2, 0, 7}}, + {"net.inet.ip.porthifirst", []_C_int{4, 2, 0, 9}}, + {"net.inet.ip.porthilast", []_C_int{4, 2, 0, 10}}, + {"net.inet.ip.portlast", []_C_int{4, 2, 0, 8}}, + {"net.inet.ip.redirect", []_C_int{4, 2, 0, 2}}, + {"net.inet.ip.sourceroute", []_C_int{4, 2, 0, 5}}, + {"net.inet.ip.stats", []_C_int{4, 2, 0, 33}}, + {"net.inet.ip.ttl", []_C_int{4, 2, 0, 3}}, + {"net.inet.ipcomp.enable", []_C_int{4, 2, 108, 1}}, + {"net.inet.ipcomp.stats", []_C_int{4, 2, 108, 2}}, + {"net.inet.ipip.allow", []_C_int{4, 2, 4, 1}}, + {"net.inet.ipip.stats", []_C_int{4, 2, 4, 2}}, + {"net.inet.mobileip.allow", []_C_int{4, 2, 55, 1}}, + {"net.inet.pfsync.stats", []_C_int{4, 2, 240, 1}}, + {"net.inet.pim.stats", []_C_int{4, 2, 103, 1}}, + {"net.inet.tcp.ackonpush", []_C_int{4, 2, 6, 13}}, + {"net.inet.tcp.always_keepalive", []_C_int{4, 2, 6, 22}}, + {"net.inet.tcp.baddynamic", []_C_int{4, 2, 6, 6}}, + {"net.inet.tcp.drop", []_C_int{4, 2, 6, 19}}, + {"net.inet.tcp.ecn", []_C_int{4, 2, 6, 14}}, + {"net.inet.tcp.ident", []_C_int{4, 2, 6, 9}}, + {"net.inet.tcp.keepidle", []_C_int{4, 2, 6, 3}}, + {"net.inet.tcp.keepinittime", []_C_int{4, 2, 6, 2}}, + {"net.inet.tcp.keepintvl", []_C_int{4, 2, 6, 4}}, + {"net.inet.tcp.mssdflt", []_C_int{4, 2, 6, 11}}, + {"net.inet.tcp.reasslimit", []_C_int{4, 2, 6, 18}}, + {"net.inet.tcp.rfc1323", []_C_int{4, 2, 6, 1}}, + {"net.inet.tcp.rfc3390", []_C_int{4, 2, 6, 17}}, + {"net.inet.tcp.rstppslimit", []_C_int{4, 2, 6, 12}}, + {"net.inet.tcp.sack", []_C_int{4, 2, 6, 10}}, + {"net.inet.tcp.sackholelimit", []_C_int{4, 2, 6, 20}}, + {"net.inet.tcp.slowhz", []_C_int{4, 2, 6, 5}}, + {"net.inet.tcp.stats", []_C_int{4, 2, 6, 21}}, + {"net.inet.tcp.synbucketlimit", []_C_int{4, 2, 6, 16}}, + {"net.inet.tcp.syncachelimit", []_C_int{4, 2, 6, 15}}, + {"net.inet.udp.baddynamic", []_C_int{4, 2, 17, 2}}, + {"net.inet.udp.checksum", []_C_int{4, 2, 17, 1}}, + {"net.inet.udp.recvspace", []_C_int{4, 2, 17, 3}}, + {"net.inet.udp.sendspace", []_C_int{4, 2, 17, 4}}, + {"net.inet.udp.stats", []_C_int{4, 2, 17, 5}}, + {"net.inet6.divert.recvspace", []_C_int{4, 24, 86, 1}}, + {"net.inet6.divert.sendspace", []_C_int{4, 24, 86, 2}}, + {"net.inet6.divert.stats", []_C_int{4, 24, 86, 3}}, + {"net.inet6.icmp6.errppslimit", []_C_int{4, 24, 30, 14}}, + {"net.inet6.icmp6.mtudisc_hiwat", []_C_int{4, 24, 30, 16}}, + {"net.inet6.icmp6.mtudisc_lowat", []_C_int{4, 24, 30, 17}}, + {"net.inet6.icmp6.nd6_debug", []_C_int{4, 24, 30, 18}}, + {"net.inet6.icmp6.nd6_delay", []_C_int{4, 24, 30, 8}}, + {"net.inet6.icmp6.nd6_maxnudhint", []_C_int{4, 24, 30, 15}}, + {"net.inet6.icmp6.nd6_mmaxtries", []_C_int{4, 24, 30, 10}}, + {"net.inet6.icmp6.nd6_prune", []_C_int{4, 24, 30, 6}}, + {"net.inet6.icmp6.nd6_umaxtries", []_C_int{4, 24, 30, 9}}, + {"net.inet6.icmp6.nd6_useloopback", []_C_int{4, 24, 30, 11}}, + {"net.inet6.icmp6.nodeinfo", []_C_int{4, 24, 30, 13}}, + {"net.inet6.icmp6.rediraccept", []_C_int{4, 24, 30, 2}}, + {"net.inet6.icmp6.redirtimeout", []_C_int{4, 24, 30, 3}}, + {"net.inet6.ip6.accept_rtadv", []_C_int{4, 24, 17, 12}}, + {"net.inet6.ip6.auto_flowlabel", []_C_int{4, 24, 17, 17}}, + {"net.inet6.ip6.dad_count", []_C_int{4, 24, 17, 16}}, + {"net.inet6.ip6.dad_pending", []_C_int{4, 24, 17, 49}}, + {"net.inet6.ip6.defmcasthlim", []_C_int{4, 24, 17, 18}}, + {"net.inet6.ip6.forwarding", []_C_int{4, 24, 17, 1}}, + {"net.inet6.ip6.forwsrcrt", []_C_int{4, 24, 17, 5}}, + {"net.inet6.ip6.hdrnestlimit", []_C_int{4, 24, 17, 15}}, + {"net.inet6.ip6.hlim", []_C_int{4, 24, 17, 3}}, + {"net.inet6.ip6.log_interval", []_C_int{4, 24, 17, 14}}, + {"net.inet6.ip6.maxdynroutes", []_C_int{4, 24, 17, 48}}, + {"net.inet6.ip6.maxfragpackets", []_C_int{4, 24, 17, 9}}, + {"net.inet6.ip6.maxfrags", []_C_int{4, 24, 17, 41}}, + {"net.inet6.ip6.maxifdefrouters", []_C_int{4, 24, 17, 47}}, + {"net.inet6.ip6.maxifprefixes", []_C_int{4, 24, 17, 46}}, + {"net.inet6.ip6.mforwarding", []_C_int{4, 24, 17, 42}}, + {"net.inet6.ip6.mrtproto", []_C_int{4, 24, 17, 8}}, + {"net.inet6.ip6.mtudisctimeout", []_C_int{4, 24, 17, 50}}, + {"net.inet6.ip6.multicast_mtudisc", []_C_int{4, 24, 17, 44}}, + {"net.inet6.ip6.multipath", []_C_int{4, 24, 17, 43}}, + {"net.inet6.ip6.neighborgcthresh", []_C_int{4, 24, 17, 45}}, + {"net.inet6.ip6.redirect", []_C_int{4, 24, 17, 2}}, + {"net.inet6.ip6.rr_prune", []_C_int{4, 24, 17, 22}}, + {"net.inet6.ip6.sourcecheck", []_C_int{4, 24, 17, 10}}, + {"net.inet6.ip6.sourcecheck_logint", []_C_int{4, 24, 17, 11}}, + {"net.inet6.ip6.use_deprecated", []_C_int{4, 24, 17, 21}}, + {"net.inet6.ip6.v6only", []_C_int{4, 24, 17, 24}}, + {"net.key.sadb_dump", []_C_int{4, 30, 1}}, + {"net.key.spd_dump", []_C_int{4, 30, 2}}, + {"net.mpls.ifq.congestion", []_C_int{4, 33, 3, 4}}, + {"net.mpls.ifq.drops", []_C_int{4, 33, 3, 3}}, + {"net.mpls.ifq.len", []_C_int{4, 33, 3, 1}}, + {"net.mpls.ifq.maxlen", []_C_int{4, 33, 3, 2}}, + {"net.mpls.mapttl_ip", []_C_int{4, 33, 5}}, + {"net.mpls.mapttl_ip6", []_C_int{4, 33, 6}}, + {"net.mpls.maxloop_inkernel", []_C_int{4, 33, 4}}, + {"net.mpls.ttl", []_C_int{4, 33, 2}}, + {"net.pflow.stats", []_C_int{4, 34, 1}}, + {"net.pipex.enable", []_C_int{4, 35, 1}}, + {"vm.anonmin", []_C_int{2, 7}}, + {"vm.loadavg", []_C_int{2, 2}}, + {"vm.maxslp", []_C_int{2, 10}}, + {"vm.nkmempages", []_C_int{2, 6}}, + {"vm.psstrings", []_C_int{2, 3}}, + {"vm.swapencrypt.enable", []_C_int{2, 5, 0}}, + {"vm.swapencrypt.keyscreated", []_C_int{2, 5, 1}}, + {"vm.swapencrypt.keysdeleted", []_C_int{2, 5, 2}}, + {"vm.uspace", []_C_int{2, 11}}, + {"vm.uvmexp", []_C_int{2, 4}}, + {"vm.vmmeter", []_C_int{2, 1}}, + {"vm.vnodemin", []_C_int{2, 9}}, + {"vm.vtextmin", []_C_int{2, 8}}, +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go new file mode 100644 index 0000000..83bb935 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go @@ -0,0 +1,270 @@ +// mksysctl_openbsd.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +package unix + +type mibentry struct { + ctlname string + ctloid []_C_int +} + +var sysctlMib = []mibentry{ + {"ddb.console", []_C_int{9, 6}}, + {"ddb.log", []_C_int{9, 7}}, + {"ddb.max_line", []_C_int{9, 3}}, + {"ddb.max_width", []_C_int{9, 2}}, + {"ddb.panic", []_C_int{9, 5}}, + {"ddb.radix", []_C_int{9, 1}}, + {"ddb.tab_stop_width", []_C_int{9, 4}}, + {"ddb.trigger", []_C_int{9, 8}}, + {"fs.posix.setuid", []_C_int{3, 1, 1}}, + {"hw.allowpowerdown", []_C_int{6, 22}}, + {"hw.byteorder", []_C_int{6, 4}}, + {"hw.cpuspeed", []_C_int{6, 12}}, + {"hw.diskcount", []_C_int{6, 10}}, + {"hw.disknames", []_C_int{6, 8}}, + {"hw.diskstats", []_C_int{6, 9}}, + {"hw.machine", []_C_int{6, 1}}, + {"hw.model", []_C_int{6, 2}}, + {"hw.ncpu", []_C_int{6, 3}}, + {"hw.ncpufound", []_C_int{6, 21}}, + {"hw.pagesize", []_C_int{6, 7}}, + {"hw.physmem", []_C_int{6, 19}}, + {"hw.product", []_C_int{6, 15}}, + {"hw.serialno", []_C_int{6, 17}}, + {"hw.setperf", []_C_int{6, 13}}, + {"hw.usermem", []_C_int{6, 20}}, + {"hw.uuid", []_C_int{6, 18}}, + {"hw.vendor", []_C_int{6, 14}}, + {"hw.version", []_C_int{6, 16}}, + {"kern.arandom", []_C_int{1, 37}}, + {"kern.argmax", []_C_int{1, 8}}, + {"kern.boottime", []_C_int{1, 21}}, + {"kern.bufcachepercent", []_C_int{1, 72}}, + {"kern.ccpu", []_C_int{1, 45}}, + {"kern.clockrate", []_C_int{1, 12}}, + {"kern.consdev", []_C_int{1, 75}}, + {"kern.cp_time", []_C_int{1, 40}}, + {"kern.cp_time2", []_C_int{1, 71}}, + {"kern.cryptodevallowsoft", []_C_int{1, 53}}, + {"kern.domainname", []_C_int{1, 22}}, + {"kern.file", []_C_int{1, 73}}, + {"kern.forkstat", []_C_int{1, 42}}, + {"kern.fscale", []_C_int{1, 46}}, + {"kern.fsync", []_C_int{1, 33}}, + {"kern.hostid", []_C_int{1, 11}}, + {"kern.hostname", []_C_int{1, 10}}, + {"kern.intrcnt.nintrcnt", []_C_int{1, 63, 1}}, + {"kern.job_control", []_C_int{1, 19}}, + {"kern.malloc.buckets", []_C_int{1, 39, 1}}, + {"kern.malloc.kmemnames", []_C_int{1, 39, 3}}, + {"kern.maxclusters", []_C_int{1, 67}}, + {"kern.maxfiles", []_C_int{1, 7}}, + {"kern.maxlocksperuid", []_C_int{1, 70}}, + {"kern.maxpartitions", []_C_int{1, 23}}, + {"kern.maxproc", []_C_int{1, 6}}, + {"kern.maxthread", []_C_int{1, 25}}, + {"kern.maxvnodes", []_C_int{1, 5}}, + {"kern.mbstat", []_C_int{1, 59}}, + {"kern.msgbuf", []_C_int{1, 48}}, + {"kern.msgbufsize", []_C_int{1, 38}}, + {"kern.nchstats", []_C_int{1, 41}}, + {"kern.netlivelocks", []_C_int{1, 76}}, + {"kern.nfiles", []_C_int{1, 56}}, + {"kern.ngroups", []_C_int{1, 18}}, + {"kern.nosuidcoredump", []_C_int{1, 32}}, + {"kern.nprocs", []_C_int{1, 47}}, + {"kern.nselcoll", []_C_int{1, 43}}, + {"kern.nthreads", []_C_int{1, 26}}, + {"kern.numvnodes", []_C_int{1, 58}}, + {"kern.osrelease", []_C_int{1, 2}}, + {"kern.osrevision", []_C_int{1, 3}}, + {"kern.ostype", []_C_int{1, 1}}, + {"kern.osversion", []_C_int{1, 27}}, + {"kern.pool_debug", []_C_int{1, 77}}, + {"kern.posix1version", []_C_int{1, 17}}, + {"kern.proc", []_C_int{1, 66}}, + {"kern.random", []_C_int{1, 31}}, + {"kern.rawpartition", []_C_int{1, 24}}, + {"kern.saved_ids", []_C_int{1, 20}}, + {"kern.securelevel", []_C_int{1, 9}}, + {"kern.seminfo", []_C_int{1, 61}}, + {"kern.shminfo", []_C_int{1, 62}}, + {"kern.somaxconn", []_C_int{1, 28}}, + {"kern.sominconn", []_C_int{1, 29}}, + {"kern.splassert", []_C_int{1, 54}}, + {"kern.stackgap_random", []_C_int{1, 50}}, + {"kern.sysvipc_info", []_C_int{1, 51}}, + {"kern.sysvmsg", []_C_int{1, 34}}, + {"kern.sysvsem", []_C_int{1, 35}}, + {"kern.sysvshm", []_C_int{1, 36}}, + {"kern.timecounter.choice", []_C_int{1, 69, 4}}, + {"kern.timecounter.hardware", []_C_int{1, 69, 3}}, + {"kern.timecounter.tick", []_C_int{1, 69, 1}}, + {"kern.timecounter.timestepwarnings", []_C_int{1, 69, 2}}, + {"kern.tty.maxptys", []_C_int{1, 44, 6}}, + {"kern.tty.nptys", []_C_int{1, 44, 7}}, + {"kern.tty.tk_cancc", []_C_int{1, 44, 4}}, + {"kern.tty.tk_nin", []_C_int{1, 44, 1}}, + {"kern.tty.tk_nout", []_C_int{1, 44, 2}}, + {"kern.tty.tk_rawcc", []_C_int{1, 44, 3}}, + {"kern.tty.ttyinfo", []_C_int{1, 44, 5}}, + {"kern.ttycount", []_C_int{1, 57}}, + {"kern.userasymcrypto", []_C_int{1, 60}}, + {"kern.usercrypto", []_C_int{1, 52}}, + {"kern.usermount", []_C_int{1, 30}}, + {"kern.version", []_C_int{1, 4}}, + {"kern.vnode", []_C_int{1, 13}}, + {"kern.watchdog.auto", []_C_int{1, 64, 2}}, + {"kern.watchdog.period", []_C_int{1, 64, 1}}, + {"net.bpf.bufsize", []_C_int{4, 31, 1}}, + {"net.bpf.maxbufsize", []_C_int{4, 31, 2}}, + {"net.inet.ah.enable", []_C_int{4, 2, 51, 1}}, + {"net.inet.ah.stats", []_C_int{4, 2, 51, 2}}, + {"net.inet.carp.allow", []_C_int{4, 2, 112, 1}}, + {"net.inet.carp.log", []_C_int{4, 2, 112, 3}}, + {"net.inet.carp.preempt", []_C_int{4, 2, 112, 2}}, + {"net.inet.carp.stats", []_C_int{4, 2, 112, 4}}, + {"net.inet.divert.recvspace", []_C_int{4, 2, 258, 1}}, + {"net.inet.divert.sendspace", []_C_int{4, 2, 258, 2}}, + {"net.inet.divert.stats", []_C_int{4, 2, 258, 3}}, + {"net.inet.esp.enable", []_C_int{4, 2, 50, 1}}, + {"net.inet.esp.stats", []_C_int{4, 2, 50, 4}}, + {"net.inet.esp.udpencap", []_C_int{4, 2, 50, 2}}, + {"net.inet.esp.udpencap_port", []_C_int{4, 2, 50, 3}}, + {"net.inet.etherip.allow", []_C_int{4, 2, 97, 1}}, + {"net.inet.etherip.stats", []_C_int{4, 2, 97, 2}}, + {"net.inet.gre.allow", []_C_int{4, 2, 47, 1}}, + {"net.inet.gre.wccp", []_C_int{4, 2, 47, 2}}, + {"net.inet.icmp.bmcastecho", []_C_int{4, 2, 1, 2}}, + {"net.inet.icmp.errppslimit", []_C_int{4, 2, 1, 3}}, + {"net.inet.icmp.maskrepl", []_C_int{4, 2, 1, 1}}, + {"net.inet.icmp.rediraccept", []_C_int{4, 2, 1, 4}}, + {"net.inet.icmp.redirtimeout", []_C_int{4, 2, 1, 5}}, + {"net.inet.icmp.stats", []_C_int{4, 2, 1, 7}}, + {"net.inet.icmp.tstamprepl", []_C_int{4, 2, 1, 6}}, + {"net.inet.igmp.stats", []_C_int{4, 2, 2, 1}}, + {"net.inet.ip.arpqueued", []_C_int{4, 2, 0, 36}}, + {"net.inet.ip.encdebug", []_C_int{4, 2, 0, 12}}, + {"net.inet.ip.forwarding", []_C_int{4, 2, 0, 1}}, + {"net.inet.ip.ifq.congestion", []_C_int{4, 2, 0, 30, 4}}, + {"net.inet.ip.ifq.drops", []_C_int{4, 2, 0, 30, 3}}, + {"net.inet.ip.ifq.len", []_C_int{4, 2, 0, 30, 1}}, + {"net.inet.ip.ifq.maxlen", []_C_int{4, 2, 0, 30, 2}}, + {"net.inet.ip.maxqueue", []_C_int{4, 2, 0, 11}}, + {"net.inet.ip.mforwarding", []_C_int{4, 2, 0, 31}}, + {"net.inet.ip.mrtproto", []_C_int{4, 2, 0, 34}}, + {"net.inet.ip.mrtstats", []_C_int{4, 2, 0, 35}}, + {"net.inet.ip.mtu", []_C_int{4, 2, 0, 4}}, + {"net.inet.ip.mtudisc", []_C_int{4, 2, 0, 27}}, + {"net.inet.ip.mtudisctimeout", []_C_int{4, 2, 0, 28}}, + {"net.inet.ip.multipath", []_C_int{4, 2, 0, 32}}, + {"net.inet.ip.portfirst", []_C_int{4, 2, 0, 7}}, + {"net.inet.ip.porthifirst", []_C_int{4, 2, 0, 9}}, + {"net.inet.ip.porthilast", []_C_int{4, 2, 0, 10}}, + {"net.inet.ip.portlast", []_C_int{4, 2, 0, 8}}, + {"net.inet.ip.redirect", []_C_int{4, 2, 0, 2}}, + {"net.inet.ip.sourceroute", []_C_int{4, 2, 0, 5}}, + {"net.inet.ip.stats", []_C_int{4, 2, 0, 33}}, + {"net.inet.ip.ttl", []_C_int{4, 2, 0, 3}}, + {"net.inet.ipcomp.enable", []_C_int{4, 2, 108, 1}}, + {"net.inet.ipcomp.stats", []_C_int{4, 2, 108, 2}}, + {"net.inet.ipip.allow", []_C_int{4, 2, 4, 1}}, + {"net.inet.ipip.stats", []_C_int{4, 2, 4, 2}}, + {"net.inet.mobileip.allow", []_C_int{4, 2, 55, 1}}, + {"net.inet.pfsync.stats", []_C_int{4, 2, 240, 1}}, + {"net.inet.pim.stats", []_C_int{4, 2, 103, 1}}, + {"net.inet.tcp.ackonpush", []_C_int{4, 2, 6, 13}}, + {"net.inet.tcp.always_keepalive", []_C_int{4, 2, 6, 22}}, + {"net.inet.tcp.baddynamic", []_C_int{4, 2, 6, 6}}, + {"net.inet.tcp.drop", []_C_int{4, 2, 6, 19}}, + {"net.inet.tcp.ecn", []_C_int{4, 2, 6, 14}}, + {"net.inet.tcp.ident", []_C_int{4, 2, 6, 9}}, + {"net.inet.tcp.keepidle", []_C_int{4, 2, 6, 3}}, + {"net.inet.tcp.keepinittime", []_C_int{4, 2, 6, 2}}, + {"net.inet.tcp.keepintvl", []_C_int{4, 2, 6, 4}}, + {"net.inet.tcp.mssdflt", []_C_int{4, 2, 6, 11}}, + {"net.inet.tcp.reasslimit", []_C_int{4, 2, 6, 18}}, + {"net.inet.tcp.rfc1323", []_C_int{4, 2, 6, 1}}, + {"net.inet.tcp.rfc3390", []_C_int{4, 2, 6, 17}}, + {"net.inet.tcp.rstppslimit", []_C_int{4, 2, 6, 12}}, + {"net.inet.tcp.sack", []_C_int{4, 2, 6, 10}}, + {"net.inet.tcp.sackholelimit", []_C_int{4, 2, 6, 20}}, + {"net.inet.tcp.slowhz", []_C_int{4, 2, 6, 5}}, + {"net.inet.tcp.stats", []_C_int{4, 2, 6, 21}}, + {"net.inet.tcp.synbucketlimit", []_C_int{4, 2, 6, 16}}, + {"net.inet.tcp.syncachelimit", []_C_int{4, 2, 6, 15}}, + {"net.inet.udp.baddynamic", []_C_int{4, 2, 17, 2}}, + {"net.inet.udp.checksum", []_C_int{4, 2, 17, 1}}, + {"net.inet.udp.recvspace", []_C_int{4, 2, 17, 3}}, + {"net.inet.udp.sendspace", []_C_int{4, 2, 17, 4}}, + {"net.inet.udp.stats", []_C_int{4, 2, 17, 5}}, + {"net.inet6.divert.recvspace", []_C_int{4, 24, 86, 1}}, + {"net.inet6.divert.sendspace", []_C_int{4, 24, 86, 2}}, + {"net.inet6.divert.stats", []_C_int{4, 24, 86, 3}}, + {"net.inet6.icmp6.errppslimit", []_C_int{4, 24, 30, 14}}, + {"net.inet6.icmp6.mtudisc_hiwat", []_C_int{4, 24, 30, 16}}, + {"net.inet6.icmp6.mtudisc_lowat", []_C_int{4, 24, 30, 17}}, + {"net.inet6.icmp6.nd6_debug", []_C_int{4, 24, 30, 18}}, + {"net.inet6.icmp6.nd6_delay", []_C_int{4, 24, 30, 8}}, + {"net.inet6.icmp6.nd6_maxnudhint", []_C_int{4, 24, 30, 15}}, + {"net.inet6.icmp6.nd6_mmaxtries", []_C_int{4, 24, 30, 10}}, + {"net.inet6.icmp6.nd6_prune", []_C_int{4, 24, 30, 6}}, + {"net.inet6.icmp6.nd6_umaxtries", []_C_int{4, 24, 30, 9}}, + {"net.inet6.icmp6.nd6_useloopback", []_C_int{4, 24, 30, 11}}, + {"net.inet6.icmp6.nodeinfo", []_C_int{4, 24, 30, 13}}, + {"net.inet6.icmp6.rediraccept", []_C_int{4, 24, 30, 2}}, + {"net.inet6.icmp6.redirtimeout", []_C_int{4, 24, 30, 3}}, + {"net.inet6.ip6.accept_rtadv", []_C_int{4, 24, 17, 12}}, + {"net.inet6.ip6.auto_flowlabel", []_C_int{4, 24, 17, 17}}, + {"net.inet6.ip6.dad_count", []_C_int{4, 24, 17, 16}}, + {"net.inet6.ip6.dad_pending", []_C_int{4, 24, 17, 49}}, + {"net.inet6.ip6.defmcasthlim", []_C_int{4, 24, 17, 18}}, + {"net.inet6.ip6.forwarding", []_C_int{4, 24, 17, 1}}, + {"net.inet6.ip6.forwsrcrt", []_C_int{4, 24, 17, 5}}, + {"net.inet6.ip6.hdrnestlimit", []_C_int{4, 24, 17, 15}}, + {"net.inet6.ip6.hlim", []_C_int{4, 24, 17, 3}}, + {"net.inet6.ip6.log_interval", []_C_int{4, 24, 17, 14}}, + {"net.inet6.ip6.maxdynroutes", []_C_int{4, 24, 17, 48}}, + {"net.inet6.ip6.maxfragpackets", []_C_int{4, 24, 17, 9}}, + {"net.inet6.ip6.maxfrags", []_C_int{4, 24, 17, 41}}, + {"net.inet6.ip6.maxifdefrouters", []_C_int{4, 24, 17, 47}}, + {"net.inet6.ip6.maxifprefixes", []_C_int{4, 24, 17, 46}}, + {"net.inet6.ip6.mforwarding", []_C_int{4, 24, 17, 42}}, + {"net.inet6.ip6.mrtproto", []_C_int{4, 24, 17, 8}}, + {"net.inet6.ip6.mtudisctimeout", []_C_int{4, 24, 17, 50}}, + {"net.inet6.ip6.multicast_mtudisc", []_C_int{4, 24, 17, 44}}, + {"net.inet6.ip6.multipath", []_C_int{4, 24, 17, 43}}, + {"net.inet6.ip6.neighborgcthresh", []_C_int{4, 24, 17, 45}}, + {"net.inet6.ip6.redirect", []_C_int{4, 24, 17, 2}}, + {"net.inet6.ip6.rr_prune", []_C_int{4, 24, 17, 22}}, + {"net.inet6.ip6.sourcecheck", []_C_int{4, 24, 17, 10}}, + {"net.inet6.ip6.sourcecheck_logint", []_C_int{4, 24, 17, 11}}, + {"net.inet6.ip6.use_deprecated", []_C_int{4, 24, 17, 21}}, + {"net.inet6.ip6.v6only", []_C_int{4, 24, 17, 24}}, + {"net.key.sadb_dump", []_C_int{4, 30, 1}}, + {"net.key.spd_dump", []_C_int{4, 30, 2}}, + {"net.mpls.ifq.congestion", []_C_int{4, 33, 3, 4}}, + {"net.mpls.ifq.drops", []_C_int{4, 33, 3, 3}}, + {"net.mpls.ifq.len", []_C_int{4, 33, 3, 1}}, + {"net.mpls.ifq.maxlen", []_C_int{4, 33, 3, 2}}, + {"net.mpls.mapttl_ip", []_C_int{4, 33, 5}}, + {"net.mpls.mapttl_ip6", []_C_int{4, 33, 6}}, + {"net.mpls.maxloop_inkernel", []_C_int{4, 33, 4}}, + {"net.mpls.ttl", []_C_int{4, 33, 2}}, + {"net.pflow.stats", []_C_int{4, 34, 1}}, + {"net.pipex.enable", []_C_int{4, 35, 1}}, + {"vm.anonmin", []_C_int{2, 7}}, + {"vm.loadavg", []_C_int{2, 2}}, + {"vm.maxslp", []_C_int{2, 10}}, + {"vm.nkmempages", []_C_int{2, 6}}, + {"vm.psstrings", []_C_int{2, 3}}, + {"vm.swapencrypt.enable", []_C_int{2, 5, 0}}, + {"vm.swapencrypt.keyscreated", []_C_int{2, 5, 1}}, + {"vm.swapencrypt.keysdeleted", []_C_int{2, 5, 2}}, + {"vm.uspace", []_C_int{2, 11}}, + {"vm.uvmexp", []_C_int{2, 4}}, + {"vm.vmmeter", []_C_int{2, 1}}, + {"vm.vnodemin", []_C_int{2, 9}}, + {"vm.vtextmin", []_C_int{2, 8}}, +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go new file mode 100644 index 0000000..83bb935 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go @@ -0,0 +1,270 @@ +// mksysctl_openbsd.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +package unix + +type mibentry struct { + ctlname string + ctloid []_C_int +} + +var sysctlMib = []mibentry{ + {"ddb.console", []_C_int{9, 6}}, + {"ddb.log", []_C_int{9, 7}}, + {"ddb.max_line", []_C_int{9, 3}}, + {"ddb.max_width", []_C_int{9, 2}}, + {"ddb.panic", []_C_int{9, 5}}, + {"ddb.radix", []_C_int{9, 1}}, + {"ddb.tab_stop_width", []_C_int{9, 4}}, + {"ddb.trigger", []_C_int{9, 8}}, + {"fs.posix.setuid", []_C_int{3, 1, 1}}, + {"hw.allowpowerdown", []_C_int{6, 22}}, + {"hw.byteorder", []_C_int{6, 4}}, + {"hw.cpuspeed", []_C_int{6, 12}}, + {"hw.diskcount", []_C_int{6, 10}}, + {"hw.disknames", []_C_int{6, 8}}, + {"hw.diskstats", []_C_int{6, 9}}, + {"hw.machine", []_C_int{6, 1}}, + {"hw.model", []_C_int{6, 2}}, + {"hw.ncpu", []_C_int{6, 3}}, + {"hw.ncpufound", []_C_int{6, 21}}, + {"hw.pagesize", []_C_int{6, 7}}, + {"hw.physmem", []_C_int{6, 19}}, + {"hw.product", []_C_int{6, 15}}, + {"hw.serialno", []_C_int{6, 17}}, + {"hw.setperf", []_C_int{6, 13}}, + {"hw.usermem", []_C_int{6, 20}}, + {"hw.uuid", []_C_int{6, 18}}, + {"hw.vendor", []_C_int{6, 14}}, + {"hw.version", []_C_int{6, 16}}, + {"kern.arandom", []_C_int{1, 37}}, + {"kern.argmax", []_C_int{1, 8}}, + {"kern.boottime", []_C_int{1, 21}}, + {"kern.bufcachepercent", []_C_int{1, 72}}, + {"kern.ccpu", []_C_int{1, 45}}, + {"kern.clockrate", []_C_int{1, 12}}, + {"kern.consdev", []_C_int{1, 75}}, + {"kern.cp_time", []_C_int{1, 40}}, + {"kern.cp_time2", []_C_int{1, 71}}, + {"kern.cryptodevallowsoft", []_C_int{1, 53}}, + {"kern.domainname", []_C_int{1, 22}}, + {"kern.file", []_C_int{1, 73}}, + {"kern.forkstat", []_C_int{1, 42}}, + {"kern.fscale", []_C_int{1, 46}}, + {"kern.fsync", []_C_int{1, 33}}, + {"kern.hostid", []_C_int{1, 11}}, + {"kern.hostname", []_C_int{1, 10}}, + {"kern.intrcnt.nintrcnt", []_C_int{1, 63, 1}}, + {"kern.job_control", []_C_int{1, 19}}, + {"kern.malloc.buckets", []_C_int{1, 39, 1}}, + {"kern.malloc.kmemnames", []_C_int{1, 39, 3}}, + {"kern.maxclusters", []_C_int{1, 67}}, + {"kern.maxfiles", []_C_int{1, 7}}, + {"kern.maxlocksperuid", []_C_int{1, 70}}, + {"kern.maxpartitions", []_C_int{1, 23}}, + {"kern.maxproc", []_C_int{1, 6}}, + {"kern.maxthread", []_C_int{1, 25}}, + {"kern.maxvnodes", []_C_int{1, 5}}, + {"kern.mbstat", []_C_int{1, 59}}, + {"kern.msgbuf", []_C_int{1, 48}}, + {"kern.msgbufsize", []_C_int{1, 38}}, + {"kern.nchstats", []_C_int{1, 41}}, + {"kern.netlivelocks", []_C_int{1, 76}}, + {"kern.nfiles", []_C_int{1, 56}}, + {"kern.ngroups", []_C_int{1, 18}}, + {"kern.nosuidcoredump", []_C_int{1, 32}}, + {"kern.nprocs", []_C_int{1, 47}}, + {"kern.nselcoll", []_C_int{1, 43}}, + {"kern.nthreads", []_C_int{1, 26}}, + {"kern.numvnodes", []_C_int{1, 58}}, + {"kern.osrelease", []_C_int{1, 2}}, + {"kern.osrevision", []_C_int{1, 3}}, + {"kern.ostype", []_C_int{1, 1}}, + {"kern.osversion", []_C_int{1, 27}}, + {"kern.pool_debug", []_C_int{1, 77}}, + {"kern.posix1version", []_C_int{1, 17}}, + {"kern.proc", []_C_int{1, 66}}, + {"kern.random", []_C_int{1, 31}}, + {"kern.rawpartition", []_C_int{1, 24}}, + {"kern.saved_ids", []_C_int{1, 20}}, + {"kern.securelevel", []_C_int{1, 9}}, + {"kern.seminfo", []_C_int{1, 61}}, + {"kern.shminfo", []_C_int{1, 62}}, + {"kern.somaxconn", []_C_int{1, 28}}, + {"kern.sominconn", []_C_int{1, 29}}, + {"kern.splassert", []_C_int{1, 54}}, + {"kern.stackgap_random", []_C_int{1, 50}}, + {"kern.sysvipc_info", []_C_int{1, 51}}, + {"kern.sysvmsg", []_C_int{1, 34}}, + {"kern.sysvsem", []_C_int{1, 35}}, + {"kern.sysvshm", []_C_int{1, 36}}, + {"kern.timecounter.choice", []_C_int{1, 69, 4}}, + {"kern.timecounter.hardware", []_C_int{1, 69, 3}}, + {"kern.timecounter.tick", []_C_int{1, 69, 1}}, + {"kern.timecounter.timestepwarnings", []_C_int{1, 69, 2}}, + {"kern.tty.maxptys", []_C_int{1, 44, 6}}, + {"kern.tty.nptys", []_C_int{1, 44, 7}}, + {"kern.tty.tk_cancc", []_C_int{1, 44, 4}}, + {"kern.tty.tk_nin", []_C_int{1, 44, 1}}, + {"kern.tty.tk_nout", []_C_int{1, 44, 2}}, + {"kern.tty.tk_rawcc", []_C_int{1, 44, 3}}, + {"kern.tty.ttyinfo", []_C_int{1, 44, 5}}, + {"kern.ttycount", []_C_int{1, 57}}, + {"kern.userasymcrypto", []_C_int{1, 60}}, + {"kern.usercrypto", []_C_int{1, 52}}, + {"kern.usermount", []_C_int{1, 30}}, + {"kern.version", []_C_int{1, 4}}, + {"kern.vnode", []_C_int{1, 13}}, + {"kern.watchdog.auto", []_C_int{1, 64, 2}}, + {"kern.watchdog.period", []_C_int{1, 64, 1}}, + {"net.bpf.bufsize", []_C_int{4, 31, 1}}, + {"net.bpf.maxbufsize", []_C_int{4, 31, 2}}, + {"net.inet.ah.enable", []_C_int{4, 2, 51, 1}}, + {"net.inet.ah.stats", []_C_int{4, 2, 51, 2}}, + {"net.inet.carp.allow", []_C_int{4, 2, 112, 1}}, + {"net.inet.carp.log", []_C_int{4, 2, 112, 3}}, + {"net.inet.carp.preempt", []_C_int{4, 2, 112, 2}}, + {"net.inet.carp.stats", []_C_int{4, 2, 112, 4}}, + {"net.inet.divert.recvspace", []_C_int{4, 2, 258, 1}}, + {"net.inet.divert.sendspace", []_C_int{4, 2, 258, 2}}, + {"net.inet.divert.stats", []_C_int{4, 2, 258, 3}}, + {"net.inet.esp.enable", []_C_int{4, 2, 50, 1}}, + {"net.inet.esp.stats", []_C_int{4, 2, 50, 4}}, + {"net.inet.esp.udpencap", []_C_int{4, 2, 50, 2}}, + {"net.inet.esp.udpencap_port", []_C_int{4, 2, 50, 3}}, + {"net.inet.etherip.allow", []_C_int{4, 2, 97, 1}}, + {"net.inet.etherip.stats", []_C_int{4, 2, 97, 2}}, + {"net.inet.gre.allow", []_C_int{4, 2, 47, 1}}, + {"net.inet.gre.wccp", []_C_int{4, 2, 47, 2}}, + {"net.inet.icmp.bmcastecho", []_C_int{4, 2, 1, 2}}, + {"net.inet.icmp.errppslimit", []_C_int{4, 2, 1, 3}}, + {"net.inet.icmp.maskrepl", []_C_int{4, 2, 1, 1}}, + {"net.inet.icmp.rediraccept", []_C_int{4, 2, 1, 4}}, + {"net.inet.icmp.redirtimeout", []_C_int{4, 2, 1, 5}}, + {"net.inet.icmp.stats", []_C_int{4, 2, 1, 7}}, + {"net.inet.icmp.tstamprepl", []_C_int{4, 2, 1, 6}}, + {"net.inet.igmp.stats", []_C_int{4, 2, 2, 1}}, + {"net.inet.ip.arpqueued", []_C_int{4, 2, 0, 36}}, + {"net.inet.ip.encdebug", []_C_int{4, 2, 0, 12}}, + {"net.inet.ip.forwarding", []_C_int{4, 2, 0, 1}}, + {"net.inet.ip.ifq.congestion", []_C_int{4, 2, 0, 30, 4}}, + {"net.inet.ip.ifq.drops", []_C_int{4, 2, 0, 30, 3}}, + {"net.inet.ip.ifq.len", []_C_int{4, 2, 0, 30, 1}}, + {"net.inet.ip.ifq.maxlen", []_C_int{4, 2, 0, 30, 2}}, + {"net.inet.ip.maxqueue", []_C_int{4, 2, 0, 11}}, + {"net.inet.ip.mforwarding", []_C_int{4, 2, 0, 31}}, + {"net.inet.ip.mrtproto", []_C_int{4, 2, 0, 34}}, + {"net.inet.ip.mrtstats", []_C_int{4, 2, 0, 35}}, + {"net.inet.ip.mtu", []_C_int{4, 2, 0, 4}}, + {"net.inet.ip.mtudisc", []_C_int{4, 2, 0, 27}}, + {"net.inet.ip.mtudisctimeout", []_C_int{4, 2, 0, 28}}, + {"net.inet.ip.multipath", []_C_int{4, 2, 0, 32}}, + {"net.inet.ip.portfirst", []_C_int{4, 2, 0, 7}}, + {"net.inet.ip.porthifirst", []_C_int{4, 2, 0, 9}}, + {"net.inet.ip.porthilast", []_C_int{4, 2, 0, 10}}, + {"net.inet.ip.portlast", []_C_int{4, 2, 0, 8}}, + {"net.inet.ip.redirect", []_C_int{4, 2, 0, 2}}, + {"net.inet.ip.sourceroute", []_C_int{4, 2, 0, 5}}, + {"net.inet.ip.stats", []_C_int{4, 2, 0, 33}}, + {"net.inet.ip.ttl", []_C_int{4, 2, 0, 3}}, + {"net.inet.ipcomp.enable", []_C_int{4, 2, 108, 1}}, + {"net.inet.ipcomp.stats", []_C_int{4, 2, 108, 2}}, + {"net.inet.ipip.allow", []_C_int{4, 2, 4, 1}}, + {"net.inet.ipip.stats", []_C_int{4, 2, 4, 2}}, + {"net.inet.mobileip.allow", []_C_int{4, 2, 55, 1}}, + {"net.inet.pfsync.stats", []_C_int{4, 2, 240, 1}}, + {"net.inet.pim.stats", []_C_int{4, 2, 103, 1}}, + {"net.inet.tcp.ackonpush", []_C_int{4, 2, 6, 13}}, + {"net.inet.tcp.always_keepalive", []_C_int{4, 2, 6, 22}}, + {"net.inet.tcp.baddynamic", []_C_int{4, 2, 6, 6}}, + {"net.inet.tcp.drop", []_C_int{4, 2, 6, 19}}, + {"net.inet.tcp.ecn", []_C_int{4, 2, 6, 14}}, + {"net.inet.tcp.ident", []_C_int{4, 2, 6, 9}}, + {"net.inet.tcp.keepidle", []_C_int{4, 2, 6, 3}}, + {"net.inet.tcp.keepinittime", []_C_int{4, 2, 6, 2}}, + {"net.inet.tcp.keepintvl", []_C_int{4, 2, 6, 4}}, + {"net.inet.tcp.mssdflt", []_C_int{4, 2, 6, 11}}, + {"net.inet.tcp.reasslimit", []_C_int{4, 2, 6, 18}}, + {"net.inet.tcp.rfc1323", []_C_int{4, 2, 6, 1}}, + {"net.inet.tcp.rfc3390", []_C_int{4, 2, 6, 17}}, + {"net.inet.tcp.rstppslimit", []_C_int{4, 2, 6, 12}}, + {"net.inet.tcp.sack", []_C_int{4, 2, 6, 10}}, + {"net.inet.tcp.sackholelimit", []_C_int{4, 2, 6, 20}}, + {"net.inet.tcp.slowhz", []_C_int{4, 2, 6, 5}}, + {"net.inet.tcp.stats", []_C_int{4, 2, 6, 21}}, + {"net.inet.tcp.synbucketlimit", []_C_int{4, 2, 6, 16}}, + {"net.inet.tcp.syncachelimit", []_C_int{4, 2, 6, 15}}, + {"net.inet.udp.baddynamic", []_C_int{4, 2, 17, 2}}, + {"net.inet.udp.checksum", []_C_int{4, 2, 17, 1}}, + {"net.inet.udp.recvspace", []_C_int{4, 2, 17, 3}}, + {"net.inet.udp.sendspace", []_C_int{4, 2, 17, 4}}, + {"net.inet.udp.stats", []_C_int{4, 2, 17, 5}}, + {"net.inet6.divert.recvspace", []_C_int{4, 24, 86, 1}}, + {"net.inet6.divert.sendspace", []_C_int{4, 24, 86, 2}}, + {"net.inet6.divert.stats", []_C_int{4, 24, 86, 3}}, + {"net.inet6.icmp6.errppslimit", []_C_int{4, 24, 30, 14}}, + {"net.inet6.icmp6.mtudisc_hiwat", []_C_int{4, 24, 30, 16}}, + {"net.inet6.icmp6.mtudisc_lowat", []_C_int{4, 24, 30, 17}}, + {"net.inet6.icmp6.nd6_debug", []_C_int{4, 24, 30, 18}}, + {"net.inet6.icmp6.nd6_delay", []_C_int{4, 24, 30, 8}}, + {"net.inet6.icmp6.nd6_maxnudhint", []_C_int{4, 24, 30, 15}}, + {"net.inet6.icmp6.nd6_mmaxtries", []_C_int{4, 24, 30, 10}}, + {"net.inet6.icmp6.nd6_prune", []_C_int{4, 24, 30, 6}}, + {"net.inet6.icmp6.nd6_umaxtries", []_C_int{4, 24, 30, 9}}, + {"net.inet6.icmp6.nd6_useloopback", []_C_int{4, 24, 30, 11}}, + {"net.inet6.icmp6.nodeinfo", []_C_int{4, 24, 30, 13}}, + {"net.inet6.icmp6.rediraccept", []_C_int{4, 24, 30, 2}}, + {"net.inet6.icmp6.redirtimeout", []_C_int{4, 24, 30, 3}}, + {"net.inet6.ip6.accept_rtadv", []_C_int{4, 24, 17, 12}}, + {"net.inet6.ip6.auto_flowlabel", []_C_int{4, 24, 17, 17}}, + {"net.inet6.ip6.dad_count", []_C_int{4, 24, 17, 16}}, + {"net.inet6.ip6.dad_pending", []_C_int{4, 24, 17, 49}}, + {"net.inet6.ip6.defmcasthlim", []_C_int{4, 24, 17, 18}}, + {"net.inet6.ip6.forwarding", []_C_int{4, 24, 17, 1}}, + {"net.inet6.ip6.forwsrcrt", []_C_int{4, 24, 17, 5}}, + {"net.inet6.ip6.hdrnestlimit", []_C_int{4, 24, 17, 15}}, + {"net.inet6.ip6.hlim", []_C_int{4, 24, 17, 3}}, + {"net.inet6.ip6.log_interval", []_C_int{4, 24, 17, 14}}, + {"net.inet6.ip6.maxdynroutes", []_C_int{4, 24, 17, 48}}, + {"net.inet6.ip6.maxfragpackets", []_C_int{4, 24, 17, 9}}, + {"net.inet6.ip6.maxfrags", []_C_int{4, 24, 17, 41}}, + {"net.inet6.ip6.maxifdefrouters", []_C_int{4, 24, 17, 47}}, + {"net.inet6.ip6.maxifprefixes", []_C_int{4, 24, 17, 46}}, + {"net.inet6.ip6.mforwarding", []_C_int{4, 24, 17, 42}}, + {"net.inet6.ip6.mrtproto", []_C_int{4, 24, 17, 8}}, + {"net.inet6.ip6.mtudisctimeout", []_C_int{4, 24, 17, 50}}, + {"net.inet6.ip6.multicast_mtudisc", []_C_int{4, 24, 17, 44}}, + {"net.inet6.ip6.multipath", []_C_int{4, 24, 17, 43}}, + {"net.inet6.ip6.neighborgcthresh", []_C_int{4, 24, 17, 45}}, + {"net.inet6.ip6.redirect", []_C_int{4, 24, 17, 2}}, + {"net.inet6.ip6.rr_prune", []_C_int{4, 24, 17, 22}}, + {"net.inet6.ip6.sourcecheck", []_C_int{4, 24, 17, 10}}, + {"net.inet6.ip6.sourcecheck_logint", []_C_int{4, 24, 17, 11}}, + {"net.inet6.ip6.use_deprecated", []_C_int{4, 24, 17, 21}}, + {"net.inet6.ip6.v6only", []_C_int{4, 24, 17, 24}}, + {"net.key.sadb_dump", []_C_int{4, 30, 1}}, + {"net.key.spd_dump", []_C_int{4, 30, 2}}, + {"net.mpls.ifq.congestion", []_C_int{4, 33, 3, 4}}, + {"net.mpls.ifq.drops", []_C_int{4, 33, 3, 3}}, + {"net.mpls.ifq.len", []_C_int{4, 33, 3, 1}}, + {"net.mpls.ifq.maxlen", []_C_int{4, 33, 3, 2}}, + {"net.mpls.mapttl_ip", []_C_int{4, 33, 5}}, + {"net.mpls.mapttl_ip6", []_C_int{4, 33, 6}}, + {"net.mpls.maxloop_inkernel", []_C_int{4, 33, 4}}, + {"net.mpls.ttl", []_C_int{4, 33, 2}}, + {"net.pflow.stats", []_C_int{4, 34, 1}}, + {"net.pipex.enable", []_C_int{4, 35, 1}}, + {"vm.anonmin", []_C_int{2, 7}}, + {"vm.loadavg", []_C_int{2, 2}}, + {"vm.maxslp", []_C_int{2, 10}}, + {"vm.nkmempages", []_C_int{2, 6}}, + {"vm.psstrings", []_C_int{2, 3}}, + {"vm.swapencrypt.enable", []_C_int{2, 5, 0}}, + {"vm.swapencrypt.keyscreated", []_C_int{2, 5, 1}}, + {"vm.swapencrypt.keysdeleted", []_C_int{2, 5, 2}}, + {"vm.uspace", []_C_int{2, 11}}, + {"vm.uvmexp", []_C_int{2, 4}}, + {"vm.vmmeter", []_C_int{2, 1}}, + {"vm.vnodemin", []_C_int{2, 9}}, + {"vm.vtextmin", []_C_int{2, 8}}, +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_darwin_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_darwin_386.go new file mode 100644 index 0000000..2786773 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_darwin_386.go @@ -0,0 +1,398 @@ +// mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/sys/syscall.h +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build 386,darwin + +package unix + +const ( + SYS_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_WAIT4 = 7 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_CHDIR = 12 + SYS_FCHDIR = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_CHOWN = 16 + SYS_GETFSSTAT = 18 + SYS_GETPID = 20 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_GETEUID = 25 + SYS_PTRACE = 26 + SYS_RECVMSG = 27 + SYS_SENDMSG = 28 + SYS_RECVFROM = 29 + SYS_ACCEPT = 30 + SYS_GETPEERNAME = 31 + SYS_GETSOCKNAME = 32 + SYS_ACCESS = 33 + SYS_CHFLAGS = 34 + SYS_FCHFLAGS = 35 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_GETPPID = 39 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_GETEGID = 43 + SYS_SIGACTION = 46 + SYS_GETGID = 47 + SYS_SIGPROCMASK = 48 + SYS_GETLOGIN = 49 + SYS_SETLOGIN = 50 + SYS_ACCT = 51 + SYS_SIGPENDING = 52 + SYS_SIGALTSTACK = 53 + SYS_IOCTL = 54 + SYS_REBOOT = 55 + SYS_REVOKE = 56 + SYS_SYMLINK = 57 + SYS_READLINK = 58 + SYS_EXECVE = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_MSYNC = 65 + SYS_VFORK = 66 + SYS_MUNMAP = 73 + SYS_MPROTECT = 74 + SYS_MADVISE = 75 + SYS_MINCORE = 78 + SYS_GETGROUPS = 79 + SYS_SETGROUPS = 80 + SYS_GETPGRP = 81 + SYS_SETPGID = 82 + SYS_SETITIMER = 83 + SYS_SWAPON = 85 + SYS_GETITIMER = 86 + SYS_GETDTABLESIZE = 89 + SYS_DUP2 = 90 + SYS_FCNTL = 92 + SYS_SELECT = 93 + SYS_FSYNC = 95 + SYS_SETPRIORITY = 96 + SYS_SOCKET = 97 + SYS_CONNECT = 98 + SYS_GETPRIORITY = 100 + SYS_BIND = 104 + SYS_SETSOCKOPT = 105 + SYS_LISTEN = 106 + SYS_SIGSUSPEND = 111 + SYS_GETTIMEOFDAY = 116 + SYS_GETRUSAGE = 117 + SYS_GETSOCKOPT = 118 + SYS_READV = 120 + SYS_WRITEV = 121 + SYS_SETTIMEOFDAY = 122 + SYS_FCHOWN = 123 + SYS_FCHMOD = 124 + SYS_SETREUID = 126 + SYS_SETREGID = 127 + SYS_RENAME = 128 + SYS_FLOCK = 131 + SYS_MKFIFO = 132 + SYS_SENDTO = 133 + SYS_SHUTDOWN = 134 + SYS_SOCKETPAIR = 135 + SYS_MKDIR = 136 + SYS_RMDIR = 137 + SYS_UTIMES = 138 + SYS_FUTIMES = 139 + SYS_ADJTIME = 140 + SYS_GETHOSTUUID = 142 + SYS_SETSID = 147 + SYS_GETPGID = 151 + SYS_SETPRIVEXEC = 152 + SYS_PREAD = 153 + SYS_PWRITE = 154 + SYS_NFSSVC = 155 + SYS_STATFS = 157 + SYS_FSTATFS = 158 + SYS_UNMOUNT = 159 + SYS_GETFH = 161 + SYS_QUOTACTL = 165 + SYS_MOUNT = 167 + SYS_CSOPS = 169 + SYS_CSOPS_AUDITTOKEN = 170 + SYS_WAITID = 173 + SYS_KDEBUG_TRACE64 = 179 + SYS_KDEBUG_TRACE = 180 + SYS_SETGID = 181 + SYS_SETEGID = 182 + SYS_SETEUID = 183 + SYS_SIGRETURN = 184 + SYS_CHUD = 185 + SYS_FDATASYNC = 187 + SYS_STAT = 188 + SYS_FSTAT = 189 + SYS_LSTAT = 190 + SYS_PATHCONF = 191 + SYS_FPATHCONF = 192 + SYS_GETRLIMIT = 194 + SYS_SETRLIMIT = 195 + SYS_GETDIRENTRIES = 196 + SYS_MMAP = 197 + SYS_LSEEK = 199 + SYS_TRUNCATE = 200 + SYS_FTRUNCATE = 201 + SYS_SYSCTL = 202 + SYS_MLOCK = 203 + SYS_MUNLOCK = 204 + SYS_UNDELETE = 205 + SYS_OPEN_DPROTECTED_NP = 216 + SYS_GETATTRLIST = 220 + SYS_SETATTRLIST = 221 + SYS_GETDIRENTRIESATTR = 222 + SYS_EXCHANGEDATA = 223 + SYS_SEARCHFS = 225 + SYS_DELETE = 226 + SYS_COPYFILE = 227 + SYS_FGETATTRLIST = 228 + SYS_FSETATTRLIST = 229 + SYS_POLL = 230 + SYS_WATCHEVENT = 231 + SYS_WAITEVENT = 232 + SYS_MODWATCH = 233 + SYS_GETXATTR = 234 + SYS_FGETXATTR = 235 + SYS_SETXATTR = 236 + SYS_FSETXATTR = 237 + SYS_REMOVEXATTR = 238 + SYS_FREMOVEXATTR = 239 + SYS_LISTXATTR = 240 + SYS_FLISTXATTR = 241 + SYS_FSCTL = 242 + SYS_INITGROUPS = 243 + SYS_POSIX_SPAWN = 244 + SYS_FFSCTL = 245 + SYS_NFSCLNT = 247 + SYS_FHOPEN = 248 + SYS_MINHERIT = 250 + SYS_SEMSYS = 251 + SYS_MSGSYS = 252 + SYS_SHMSYS = 253 + SYS_SEMCTL = 254 + SYS_SEMGET = 255 + SYS_SEMOP = 256 + SYS_MSGCTL = 258 + SYS_MSGGET = 259 + SYS_MSGSND = 260 + SYS_MSGRCV = 261 + SYS_SHMAT = 262 + SYS_SHMCTL = 263 + SYS_SHMDT = 264 + SYS_SHMGET = 265 + SYS_SHM_OPEN = 266 + SYS_SHM_UNLINK = 267 + SYS_SEM_OPEN = 268 + SYS_SEM_CLOSE = 269 + SYS_SEM_UNLINK = 270 + SYS_SEM_WAIT = 271 + SYS_SEM_TRYWAIT = 272 + SYS_SEM_POST = 273 + SYS_SYSCTLBYNAME = 274 + SYS_OPEN_EXTENDED = 277 + SYS_UMASK_EXTENDED = 278 + SYS_STAT_EXTENDED = 279 + SYS_LSTAT_EXTENDED = 280 + SYS_FSTAT_EXTENDED = 281 + SYS_CHMOD_EXTENDED = 282 + SYS_FCHMOD_EXTENDED = 283 + SYS_ACCESS_EXTENDED = 284 + SYS_SETTID = 285 + SYS_GETTID = 286 + SYS_SETSGROUPS = 287 + SYS_GETSGROUPS = 288 + SYS_SETWGROUPS = 289 + SYS_GETWGROUPS = 290 + SYS_MKFIFO_EXTENDED = 291 + SYS_MKDIR_EXTENDED = 292 + SYS_IDENTITYSVC = 293 + SYS_SHARED_REGION_CHECK_NP = 294 + SYS_VM_PRESSURE_MONITOR = 296 + SYS_PSYNCH_RW_LONGRDLOCK = 297 + SYS_PSYNCH_RW_YIELDWRLOCK = 298 + SYS_PSYNCH_RW_DOWNGRADE = 299 + SYS_PSYNCH_RW_UPGRADE = 300 + SYS_PSYNCH_MUTEXWAIT = 301 + SYS_PSYNCH_MUTEXDROP = 302 + SYS_PSYNCH_CVBROAD = 303 + SYS_PSYNCH_CVSIGNAL = 304 + SYS_PSYNCH_CVWAIT = 305 + SYS_PSYNCH_RW_RDLOCK = 306 + SYS_PSYNCH_RW_WRLOCK = 307 + SYS_PSYNCH_RW_UNLOCK = 308 + SYS_PSYNCH_RW_UNLOCK2 = 309 + SYS_GETSID = 310 + SYS_SETTID_WITH_PID = 311 + SYS_PSYNCH_CVCLRPREPOST = 312 + SYS_AIO_FSYNC = 313 + SYS_AIO_RETURN = 314 + SYS_AIO_SUSPEND = 315 + SYS_AIO_CANCEL = 316 + SYS_AIO_ERROR = 317 + SYS_AIO_READ = 318 + SYS_AIO_WRITE = 319 + SYS_LIO_LISTIO = 320 + SYS_IOPOLICYSYS = 322 + SYS_PROCESS_POLICY = 323 + SYS_MLOCKALL = 324 + SYS_MUNLOCKALL = 325 + SYS_ISSETUGID = 327 + SYS___PTHREAD_KILL = 328 + SYS___PTHREAD_SIGMASK = 329 + SYS___SIGWAIT = 330 + SYS___DISABLE_THREADSIGNAL = 331 + SYS___PTHREAD_MARKCANCEL = 332 + SYS___PTHREAD_CANCELED = 333 + SYS___SEMWAIT_SIGNAL = 334 + SYS_PROC_INFO = 336 + SYS_SENDFILE = 337 + SYS_STAT64 = 338 + SYS_FSTAT64 = 339 + SYS_LSTAT64 = 340 + SYS_STAT64_EXTENDED = 341 + SYS_LSTAT64_EXTENDED = 342 + SYS_FSTAT64_EXTENDED = 343 + SYS_GETDIRENTRIES64 = 344 + SYS_STATFS64 = 345 + SYS_FSTATFS64 = 346 + SYS_GETFSSTAT64 = 347 + SYS___PTHREAD_CHDIR = 348 + SYS___PTHREAD_FCHDIR = 349 + SYS_AUDIT = 350 + SYS_AUDITON = 351 + SYS_GETAUID = 353 + SYS_SETAUID = 354 + SYS_GETAUDIT_ADDR = 357 + SYS_SETAUDIT_ADDR = 358 + SYS_AUDITCTL = 359 + SYS_BSDTHREAD_CREATE = 360 + SYS_BSDTHREAD_TERMINATE = 361 + SYS_KQUEUE = 362 + SYS_KEVENT = 363 + SYS_LCHOWN = 364 + SYS_STACK_SNAPSHOT = 365 + SYS_BSDTHREAD_REGISTER = 366 + SYS_WORKQ_OPEN = 367 + SYS_WORKQ_KERNRETURN = 368 + SYS_KEVENT64 = 369 + SYS___OLD_SEMWAIT_SIGNAL = 370 + SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL = 371 + SYS_THREAD_SELFID = 372 + SYS_LEDGER = 373 + SYS___MAC_EXECVE = 380 + SYS___MAC_SYSCALL = 381 + SYS___MAC_GET_FILE = 382 + SYS___MAC_SET_FILE = 383 + SYS___MAC_GET_LINK = 384 + SYS___MAC_SET_LINK = 385 + SYS___MAC_GET_PROC = 386 + SYS___MAC_SET_PROC = 387 + SYS___MAC_GET_FD = 388 + SYS___MAC_SET_FD = 389 + SYS___MAC_GET_PID = 390 + SYS___MAC_GET_LCID = 391 + SYS___MAC_GET_LCTX = 392 + SYS___MAC_SET_LCTX = 393 + SYS_SETLCID = 394 + SYS_GETLCID = 395 + SYS_READ_NOCANCEL = 396 + SYS_WRITE_NOCANCEL = 397 + SYS_OPEN_NOCANCEL = 398 + SYS_CLOSE_NOCANCEL = 399 + SYS_WAIT4_NOCANCEL = 400 + SYS_RECVMSG_NOCANCEL = 401 + SYS_SENDMSG_NOCANCEL = 402 + SYS_RECVFROM_NOCANCEL = 403 + SYS_ACCEPT_NOCANCEL = 404 + SYS_MSYNC_NOCANCEL = 405 + SYS_FCNTL_NOCANCEL = 406 + SYS_SELECT_NOCANCEL = 407 + SYS_FSYNC_NOCANCEL = 408 + SYS_CONNECT_NOCANCEL = 409 + SYS_SIGSUSPEND_NOCANCEL = 410 + SYS_READV_NOCANCEL = 411 + SYS_WRITEV_NOCANCEL = 412 + SYS_SENDTO_NOCANCEL = 413 + SYS_PREAD_NOCANCEL = 414 + SYS_PWRITE_NOCANCEL = 415 + SYS_WAITID_NOCANCEL = 416 + SYS_POLL_NOCANCEL = 417 + SYS_MSGSND_NOCANCEL = 418 + SYS_MSGRCV_NOCANCEL = 419 + SYS_SEM_WAIT_NOCANCEL = 420 + SYS_AIO_SUSPEND_NOCANCEL = 421 + SYS___SIGWAIT_NOCANCEL = 422 + SYS___SEMWAIT_SIGNAL_NOCANCEL = 423 + SYS___MAC_MOUNT = 424 + SYS___MAC_GET_MOUNT = 425 + SYS___MAC_GETFSSTAT = 426 + SYS_FSGETPATH = 427 + SYS_AUDIT_SESSION_SELF = 428 + SYS_AUDIT_SESSION_JOIN = 429 + SYS_FILEPORT_MAKEPORT = 430 + SYS_FILEPORT_MAKEFD = 431 + SYS_AUDIT_SESSION_PORT = 432 + SYS_PID_SUSPEND = 433 + SYS_PID_RESUME = 434 + SYS_PID_HIBERNATE = 435 + SYS_PID_SHUTDOWN_SOCKETS = 436 + SYS_SHARED_REGION_MAP_AND_SLIDE_NP = 438 + SYS_KAS_INFO = 439 + SYS_MEMORYSTATUS_CONTROL = 440 + SYS_GUARDED_OPEN_NP = 441 + SYS_GUARDED_CLOSE_NP = 442 + SYS_GUARDED_KQUEUE_NP = 443 + SYS_CHANGE_FDGUARD_NP = 444 + SYS_PROC_RLIMIT_CONTROL = 446 + SYS_CONNECTX = 447 + SYS_DISCONNECTX = 448 + SYS_PEELOFF = 449 + SYS_SOCKET_DELEGATE = 450 + SYS_TELEMETRY = 451 + SYS_PROC_UUID_POLICY = 452 + SYS_MEMORYSTATUS_GET_LEVEL = 453 + SYS_SYSTEM_OVERRIDE = 454 + SYS_VFS_PURGE = 455 + SYS_SFI_CTL = 456 + SYS_SFI_PIDCTL = 457 + SYS_COALITION = 458 + SYS_COALITION_INFO = 459 + SYS_NECP_MATCH_POLICY = 460 + SYS_GETATTRLISTBULK = 461 + SYS_OPENAT = 463 + SYS_OPENAT_NOCANCEL = 464 + SYS_RENAMEAT = 465 + SYS_FACCESSAT = 466 + SYS_FCHMODAT = 467 + SYS_FCHOWNAT = 468 + SYS_FSTATAT = 469 + SYS_FSTATAT64 = 470 + SYS_LINKAT = 471 + SYS_UNLINKAT = 472 + SYS_READLINKAT = 473 + SYS_SYMLINKAT = 474 + SYS_MKDIRAT = 475 + SYS_GETATTRLISTAT = 476 + SYS_PROC_TRACE_LOG = 477 + SYS_BSDTHREAD_CTL = 478 + SYS_OPENBYID_NP = 479 + SYS_RECVMSG_X = 480 + SYS_SENDMSG_X = 481 + SYS_THREAD_SELFUSAGE = 482 + SYS_CSRCTL = 483 + SYS_GUARDED_OPEN_DPROTECTED_NP = 484 + SYS_GUARDED_WRITE_NP = 485 + SYS_GUARDED_PWRITE_NP = 486 + SYS_GUARDED_WRITEV_NP = 487 + SYS_RENAME_EXT = 488 + SYS_MREMAP_ENCRYPTED = 489 + SYS_MAXSYSCALL = 490 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go new file mode 100644 index 0000000..09de240 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go @@ -0,0 +1,398 @@ +// mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/sys/syscall.h +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build amd64,darwin + +package unix + +const ( + SYS_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_WAIT4 = 7 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_CHDIR = 12 + SYS_FCHDIR = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_CHOWN = 16 + SYS_GETFSSTAT = 18 + SYS_GETPID = 20 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_GETEUID = 25 + SYS_PTRACE = 26 + SYS_RECVMSG = 27 + SYS_SENDMSG = 28 + SYS_RECVFROM = 29 + SYS_ACCEPT = 30 + SYS_GETPEERNAME = 31 + SYS_GETSOCKNAME = 32 + SYS_ACCESS = 33 + SYS_CHFLAGS = 34 + SYS_FCHFLAGS = 35 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_GETPPID = 39 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_GETEGID = 43 + SYS_SIGACTION = 46 + SYS_GETGID = 47 + SYS_SIGPROCMASK = 48 + SYS_GETLOGIN = 49 + SYS_SETLOGIN = 50 + SYS_ACCT = 51 + SYS_SIGPENDING = 52 + SYS_SIGALTSTACK = 53 + SYS_IOCTL = 54 + SYS_REBOOT = 55 + SYS_REVOKE = 56 + SYS_SYMLINK = 57 + SYS_READLINK = 58 + SYS_EXECVE = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_MSYNC = 65 + SYS_VFORK = 66 + SYS_MUNMAP = 73 + SYS_MPROTECT = 74 + SYS_MADVISE = 75 + SYS_MINCORE = 78 + SYS_GETGROUPS = 79 + SYS_SETGROUPS = 80 + SYS_GETPGRP = 81 + SYS_SETPGID = 82 + SYS_SETITIMER = 83 + SYS_SWAPON = 85 + SYS_GETITIMER = 86 + SYS_GETDTABLESIZE = 89 + SYS_DUP2 = 90 + SYS_FCNTL = 92 + SYS_SELECT = 93 + SYS_FSYNC = 95 + SYS_SETPRIORITY = 96 + SYS_SOCKET = 97 + SYS_CONNECT = 98 + SYS_GETPRIORITY = 100 + SYS_BIND = 104 + SYS_SETSOCKOPT = 105 + SYS_LISTEN = 106 + SYS_SIGSUSPEND = 111 + SYS_GETTIMEOFDAY = 116 + SYS_GETRUSAGE = 117 + SYS_GETSOCKOPT = 118 + SYS_READV = 120 + SYS_WRITEV = 121 + SYS_SETTIMEOFDAY = 122 + SYS_FCHOWN = 123 + SYS_FCHMOD = 124 + SYS_SETREUID = 126 + SYS_SETREGID = 127 + SYS_RENAME = 128 + SYS_FLOCK = 131 + SYS_MKFIFO = 132 + SYS_SENDTO = 133 + SYS_SHUTDOWN = 134 + SYS_SOCKETPAIR = 135 + SYS_MKDIR = 136 + SYS_RMDIR = 137 + SYS_UTIMES = 138 + SYS_FUTIMES = 139 + SYS_ADJTIME = 140 + SYS_GETHOSTUUID = 142 + SYS_SETSID = 147 + SYS_GETPGID = 151 + SYS_SETPRIVEXEC = 152 + SYS_PREAD = 153 + SYS_PWRITE = 154 + SYS_NFSSVC = 155 + SYS_STATFS = 157 + SYS_FSTATFS = 158 + SYS_UNMOUNT = 159 + SYS_GETFH = 161 + SYS_QUOTACTL = 165 + SYS_MOUNT = 167 + SYS_CSOPS = 169 + SYS_CSOPS_AUDITTOKEN = 170 + SYS_WAITID = 173 + SYS_KDEBUG_TRACE64 = 179 + SYS_KDEBUG_TRACE = 180 + SYS_SETGID = 181 + SYS_SETEGID = 182 + SYS_SETEUID = 183 + SYS_SIGRETURN = 184 + SYS_CHUD = 185 + SYS_FDATASYNC = 187 + SYS_STAT = 188 + SYS_FSTAT = 189 + SYS_LSTAT = 190 + SYS_PATHCONF = 191 + SYS_FPATHCONF = 192 + SYS_GETRLIMIT = 194 + SYS_SETRLIMIT = 195 + SYS_GETDIRENTRIES = 196 + SYS_MMAP = 197 + SYS_LSEEK = 199 + SYS_TRUNCATE = 200 + SYS_FTRUNCATE = 201 + SYS_SYSCTL = 202 + SYS_MLOCK = 203 + SYS_MUNLOCK = 204 + SYS_UNDELETE = 205 + SYS_OPEN_DPROTECTED_NP = 216 + SYS_GETATTRLIST = 220 + SYS_SETATTRLIST = 221 + SYS_GETDIRENTRIESATTR = 222 + SYS_EXCHANGEDATA = 223 + SYS_SEARCHFS = 225 + SYS_DELETE = 226 + SYS_COPYFILE = 227 + SYS_FGETATTRLIST = 228 + SYS_FSETATTRLIST = 229 + SYS_POLL = 230 + SYS_WATCHEVENT = 231 + SYS_WAITEVENT = 232 + SYS_MODWATCH = 233 + SYS_GETXATTR = 234 + SYS_FGETXATTR = 235 + SYS_SETXATTR = 236 + SYS_FSETXATTR = 237 + SYS_REMOVEXATTR = 238 + SYS_FREMOVEXATTR = 239 + SYS_LISTXATTR = 240 + SYS_FLISTXATTR = 241 + SYS_FSCTL = 242 + SYS_INITGROUPS = 243 + SYS_POSIX_SPAWN = 244 + SYS_FFSCTL = 245 + SYS_NFSCLNT = 247 + SYS_FHOPEN = 248 + SYS_MINHERIT = 250 + SYS_SEMSYS = 251 + SYS_MSGSYS = 252 + SYS_SHMSYS = 253 + SYS_SEMCTL = 254 + SYS_SEMGET = 255 + SYS_SEMOP = 256 + SYS_MSGCTL = 258 + SYS_MSGGET = 259 + SYS_MSGSND = 260 + SYS_MSGRCV = 261 + SYS_SHMAT = 262 + SYS_SHMCTL = 263 + SYS_SHMDT = 264 + SYS_SHMGET = 265 + SYS_SHM_OPEN = 266 + SYS_SHM_UNLINK = 267 + SYS_SEM_OPEN = 268 + SYS_SEM_CLOSE = 269 + SYS_SEM_UNLINK = 270 + SYS_SEM_WAIT = 271 + SYS_SEM_TRYWAIT = 272 + SYS_SEM_POST = 273 + SYS_SYSCTLBYNAME = 274 + SYS_OPEN_EXTENDED = 277 + SYS_UMASK_EXTENDED = 278 + SYS_STAT_EXTENDED = 279 + SYS_LSTAT_EXTENDED = 280 + SYS_FSTAT_EXTENDED = 281 + SYS_CHMOD_EXTENDED = 282 + SYS_FCHMOD_EXTENDED = 283 + SYS_ACCESS_EXTENDED = 284 + SYS_SETTID = 285 + SYS_GETTID = 286 + SYS_SETSGROUPS = 287 + SYS_GETSGROUPS = 288 + SYS_SETWGROUPS = 289 + SYS_GETWGROUPS = 290 + SYS_MKFIFO_EXTENDED = 291 + SYS_MKDIR_EXTENDED = 292 + SYS_IDENTITYSVC = 293 + SYS_SHARED_REGION_CHECK_NP = 294 + SYS_VM_PRESSURE_MONITOR = 296 + SYS_PSYNCH_RW_LONGRDLOCK = 297 + SYS_PSYNCH_RW_YIELDWRLOCK = 298 + SYS_PSYNCH_RW_DOWNGRADE = 299 + SYS_PSYNCH_RW_UPGRADE = 300 + SYS_PSYNCH_MUTEXWAIT = 301 + SYS_PSYNCH_MUTEXDROP = 302 + SYS_PSYNCH_CVBROAD = 303 + SYS_PSYNCH_CVSIGNAL = 304 + SYS_PSYNCH_CVWAIT = 305 + SYS_PSYNCH_RW_RDLOCK = 306 + SYS_PSYNCH_RW_WRLOCK = 307 + SYS_PSYNCH_RW_UNLOCK = 308 + SYS_PSYNCH_RW_UNLOCK2 = 309 + SYS_GETSID = 310 + SYS_SETTID_WITH_PID = 311 + SYS_PSYNCH_CVCLRPREPOST = 312 + SYS_AIO_FSYNC = 313 + SYS_AIO_RETURN = 314 + SYS_AIO_SUSPEND = 315 + SYS_AIO_CANCEL = 316 + SYS_AIO_ERROR = 317 + SYS_AIO_READ = 318 + SYS_AIO_WRITE = 319 + SYS_LIO_LISTIO = 320 + SYS_IOPOLICYSYS = 322 + SYS_PROCESS_POLICY = 323 + SYS_MLOCKALL = 324 + SYS_MUNLOCKALL = 325 + SYS_ISSETUGID = 327 + SYS___PTHREAD_KILL = 328 + SYS___PTHREAD_SIGMASK = 329 + SYS___SIGWAIT = 330 + SYS___DISABLE_THREADSIGNAL = 331 + SYS___PTHREAD_MARKCANCEL = 332 + SYS___PTHREAD_CANCELED = 333 + SYS___SEMWAIT_SIGNAL = 334 + SYS_PROC_INFO = 336 + SYS_SENDFILE = 337 + SYS_STAT64 = 338 + SYS_FSTAT64 = 339 + SYS_LSTAT64 = 340 + SYS_STAT64_EXTENDED = 341 + SYS_LSTAT64_EXTENDED = 342 + SYS_FSTAT64_EXTENDED = 343 + SYS_GETDIRENTRIES64 = 344 + SYS_STATFS64 = 345 + SYS_FSTATFS64 = 346 + SYS_GETFSSTAT64 = 347 + SYS___PTHREAD_CHDIR = 348 + SYS___PTHREAD_FCHDIR = 349 + SYS_AUDIT = 350 + SYS_AUDITON = 351 + SYS_GETAUID = 353 + SYS_SETAUID = 354 + SYS_GETAUDIT_ADDR = 357 + SYS_SETAUDIT_ADDR = 358 + SYS_AUDITCTL = 359 + SYS_BSDTHREAD_CREATE = 360 + SYS_BSDTHREAD_TERMINATE = 361 + SYS_KQUEUE = 362 + SYS_KEVENT = 363 + SYS_LCHOWN = 364 + SYS_STACK_SNAPSHOT = 365 + SYS_BSDTHREAD_REGISTER = 366 + SYS_WORKQ_OPEN = 367 + SYS_WORKQ_KERNRETURN = 368 + SYS_KEVENT64 = 369 + SYS___OLD_SEMWAIT_SIGNAL = 370 + SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL = 371 + SYS_THREAD_SELFID = 372 + SYS_LEDGER = 373 + SYS___MAC_EXECVE = 380 + SYS___MAC_SYSCALL = 381 + SYS___MAC_GET_FILE = 382 + SYS___MAC_SET_FILE = 383 + SYS___MAC_GET_LINK = 384 + SYS___MAC_SET_LINK = 385 + SYS___MAC_GET_PROC = 386 + SYS___MAC_SET_PROC = 387 + SYS___MAC_GET_FD = 388 + SYS___MAC_SET_FD = 389 + SYS___MAC_GET_PID = 390 + SYS___MAC_GET_LCID = 391 + SYS___MAC_GET_LCTX = 392 + SYS___MAC_SET_LCTX = 393 + SYS_SETLCID = 394 + SYS_GETLCID = 395 + SYS_READ_NOCANCEL = 396 + SYS_WRITE_NOCANCEL = 397 + SYS_OPEN_NOCANCEL = 398 + SYS_CLOSE_NOCANCEL = 399 + SYS_WAIT4_NOCANCEL = 400 + SYS_RECVMSG_NOCANCEL = 401 + SYS_SENDMSG_NOCANCEL = 402 + SYS_RECVFROM_NOCANCEL = 403 + SYS_ACCEPT_NOCANCEL = 404 + SYS_MSYNC_NOCANCEL = 405 + SYS_FCNTL_NOCANCEL = 406 + SYS_SELECT_NOCANCEL = 407 + SYS_FSYNC_NOCANCEL = 408 + SYS_CONNECT_NOCANCEL = 409 + SYS_SIGSUSPEND_NOCANCEL = 410 + SYS_READV_NOCANCEL = 411 + SYS_WRITEV_NOCANCEL = 412 + SYS_SENDTO_NOCANCEL = 413 + SYS_PREAD_NOCANCEL = 414 + SYS_PWRITE_NOCANCEL = 415 + SYS_WAITID_NOCANCEL = 416 + SYS_POLL_NOCANCEL = 417 + SYS_MSGSND_NOCANCEL = 418 + SYS_MSGRCV_NOCANCEL = 419 + SYS_SEM_WAIT_NOCANCEL = 420 + SYS_AIO_SUSPEND_NOCANCEL = 421 + SYS___SIGWAIT_NOCANCEL = 422 + SYS___SEMWAIT_SIGNAL_NOCANCEL = 423 + SYS___MAC_MOUNT = 424 + SYS___MAC_GET_MOUNT = 425 + SYS___MAC_GETFSSTAT = 426 + SYS_FSGETPATH = 427 + SYS_AUDIT_SESSION_SELF = 428 + SYS_AUDIT_SESSION_JOIN = 429 + SYS_FILEPORT_MAKEPORT = 430 + SYS_FILEPORT_MAKEFD = 431 + SYS_AUDIT_SESSION_PORT = 432 + SYS_PID_SUSPEND = 433 + SYS_PID_RESUME = 434 + SYS_PID_HIBERNATE = 435 + SYS_PID_SHUTDOWN_SOCKETS = 436 + SYS_SHARED_REGION_MAP_AND_SLIDE_NP = 438 + SYS_KAS_INFO = 439 + SYS_MEMORYSTATUS_CONTROL = 440 + SYS_GUARDED_OPEN_NP = 441 + SYS_GUARDED_CLOSE_NP = 442 + SYS_GUARDED_KQUEUE_NP = 443 + SYS_CHANGE_FDGUARD_NP = 444 + SYS_PROC_RLIMIT_CONTROL = 446 + SYS_CONNECTX = 447 + SYS_DISCONNECTX = 448 + SYS_PEELOFF = 449 + SYS_SOCKET_DELEGATE = 450 + SYS_TELEMETRY = 451 + SYS_PROC_UUID_POLICY = 452 + SYS_MEMORYSTATUS_GET_LEVEL = 453 + SYS_SYSTEM_OVERRIDE = 454 + SYS_VFS_PURGE = 455 + SYS_SFI_CTL = 456 + SYS_SFI_PIDCTL = 457 + SYS_COALITION = 458 + SYS_COALITION_INFO = 459 + SYS_NECP_MATCH_POLICY = 460 + SYS_GETATTRLISTBULK = 461 + SYS_OPENAT = 463 + SYS_OPENAT_NOCANCEL = 464 + SYS_RENAMEAT = 465 + SYS_FACCESSAT = 466 + SYS_FCHMODAT = 467 + SYS_FCHOWNAT = 468 + SYS_FSTATAT = 469 + SYS_FSTATAT64 = 470 + SYS_LINKAT = 471 + SYS_UNLINKAT = 472 + SYS_READLINKAT = 473 + SYS_SYMLINKAT = 474 + SYS_MKDIRAT = 475 + SYS_GETATTRLISTAT = 476 + SYS_PROC_TRACE_LOG = 477 + SYS_BSDTHREAD_CTL = 478 + SYS_OPENBYID_NP = 479 + SYS_RECVMSG_X = 480 + SYS_SENDMSG_X = 481 + SYS_THREAD_SELFUSAGE = 482 + SYS_CSRCTL = 483 + SYS_GUARDED_OPEN_DPROTECTED_NP = 484 + SYS_GUARDED_WRITE_NP = 485 + SYS_GUARDED_PWRITE_NP = 486 + SYS_GUARDED_WRITEV_NP = 487 + SYS_RENAME_EXT = 488 + SYS_MREMAP_ENCRYPTED = 489 + SYS_MAXSYSCALL = 490 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm.go new file mode 100644 index 0000000..41cb6ed --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm.go @@ -0,0 +1,426 @@ +// mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.2.sdk/usr/include/sys/syscall.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,darwin + +package unix + +const ( + SYS_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_WAIT4 = 7 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_CHDIR = 12 + SYS_FCHDIR = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_CHOWN = 16 + SYS_GETFSSTAT = 18 + SYS_GETPID = 20 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_GETEUID = 25 + SYS_PTRACE = 26 + SYS_RECVMSG = 27 + SYS_SENDMSG = 28 + SYS_RECVFROM = 29 + SYS_ACCEPT = 30 + SYS_GETPEERNAME = 31 + SYS_GETSOCKNAME = 32 + SYS_ACCESS = 33 + SYS_CHFLAGS = 34 + SYS_FCHFLAGS = 35 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_GETPPID = 39 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_GETEGID = 43 + SYS_SIGACTION = 46 + SYS_GETGID = 47 + SYS_SIGPROCMASK = 48 + SYS_GETLOGIN = 49 + SYS_SETLOGIN = 50 + SYS_ACCT = 51 + SYS_SIGPENDING = 52 + SYS_SIGALTSTACK = 53 + SYS_IOCTL = 54 + SYS_REBOOT = 55 + SYS_REVOKE = 56 + SYS_SYMLINK = 57 + SYS_READLINK = 58 + SYS_EXECVE = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_MSYNC = 65 + SYS_VFORK = 66 + SYS_MUNMAP = 73 + SYS_MPROTECT = 74 + SYS_MADVISE = 75 + SYS_MINCORE = 78 + SYS_GETGROUPS = 79 + SYS_SETGROUPS = 80 + SYS_GETPGRP = 81 + SYS_SETPGID = 82 + SYS_SETITIMER = 83 + SYS_SWAPON = 85 + SYS_GETITIMER = 86 + SYS_GETDTABLESIZE = 89 + SYS_DUP2 = 90 + SYS_FCNTL = 92 + SYS_SELECT = 93 + SYS_FSYNC = 95 + SYS_SETPRIORITY = 96 + SYS_SOCKET = 97 + SYS_CONNECT = 98 + SYS_GETPRIORITY = 100 + SYS_BIND = 104 + SYS_SETSOCKOPT = 105 + SYS_LISTEN = 106 + SYS_SIGSUSPEND = 111 + SYS_GETTIMEOFDAY = 116 + SYS_GETRUSAGE = 117 + SYS_GETSOCKOPT = 118 + SYS_READV = 120 + SYS_WRITEV = 121 + SYS_SETTIMEOFDAY = 122 + SYS_FCHOWN = 123 + SYS_FCHMOD = 124 + SYS_SETREUID = 126 + SYS_SETREGID = 127 + SYS_RENAME = 128 + SYS_FLOCK = 131 + SYS_MKFIFO = 132 + SYS_SENDTO = 133 + SYS_SHUTDOWN = 134 + SYS_SOCKETPAIR = 135 + SYS_MKDIR = 136 + SYS_RMDIR = 137 + SYS_UTIMES = 138 + SYS_FUTIMES = 139 + SYS_ADJTIME = 140 + SYS_GETHOSTUUID = 142 + SYS_SETSID = 147 + SYS_GETPGID = 151 + SYS_SETPRIVEXEC = 152 + SYS_PREAD = 153 + SYS_PWRITE = 154 + SYS_NFSSVC = 155 + SYS_STATFS = 157 + SYS_FSTATFS = 158 + SYS_UNMOUNT = 159 + SYS_GETFH = 161 + SYS_QUOTACTL = 165 + SYS_MOUNT = 167 + SYS_CSOPS = 169 + SYS_CSOPS_AUDITTOKEN = 170 + SYS_WAITID = 173 + SYS_KDEBUG_TYPEFILTER = 177 + SYS_KDEBUG_TRACE_STRING = 178 + SYS_KDEBUG_TRACE64 = 179 + SYS_KDEBUG_TRACE = 180 + SYS_SETGID = 181 + SYS_SETEGID = 182 + SYS_SETEUID = 183 + SYS_SIGRETURN = 184 + SYS_FDATASYNC = 187 + SYS_STAT = 188 + SYS_FSTAT = 189 + SYS_LSTAT = 190 + SYS_PATHCONF = 191 + SYS_FPATHCONF = 192 + SYS_GETRLIMIT = 194 + SYS_SETRLIMIT = 195 + SYS_GETDIRENTRIES = 196 + SYS_MMAP = 197 + SYS_LSEEK = 199 + SYS_TRUNCATE = 200 + SYS_FTRUNCATE = 201 + SYS_SYSCTL = 202 + SYS_MLOCK = 203 + SYS_MUNLOCK = 204 + SYS_UNDELETE = 205 + SYS_OPEN_DPROTECTED_NP = 216 + SYS_GETATTRLIST = 220 + SYS_SETATTRLIST = 221 + SYS_GETDIRENTRIESATTR = 222 + SYS_EXCHANGEDATA = 223 + SYS_SEARCHFS = 225 + SYS_DELETE = 226 + SYS_COPYFILE = 227 + SYS_FGETATTRLIST = 228 + SYS_FSETATTRLIST = 229 + SYS_POLL = 230 + SYS_WATCHEVENT = 231 + SYS_WAITEVENT = 232 + SYS_MODWATCH = 233 + SYS_GETXATTR = 234 + SYS_FGETXATTR = 235 + SYS_SETXATTR = 236 + SYS_FSETXATTR = 237 + SYS_REMOVEXATTR = 238 + SYS_FREMOVEXATTR = 239 + SYS_LISTXATTR = 240 + SYS_FLISTXATTR = 241 + SYS_FSCTL = 242 + SYS_INITGROUPS = 243 + SYS_POSIX_SPAWN = 244 + SYS_FFSCTL = 245 + SYS_NFSCLNT = 247 + SYS_FHOPEN = 248 + SYS_MINHERIT = 250 + SYS_SEMSYS = 251 + SYS_MSGSYS = 252 + SYS_SHMSYS = 253 + SYS_SEMCTL = 254 + SYS_SEMGET = 255 + SYS_SEMOP = 256 + SYS_MSGCTL = 258 + SYS_MSGGET = 259 + SYS_MSGSND = 260 + SYS_MSGRCV = 261 + SYS_SHMAT = 262 + SYS_SHMCTL = 263 + SYS_SHMDT = 264 + SYS_SHMGET = 265 + SYS_SHM_OPEN = 266 + SYS_SHM_UNLINK = 267 + SYS_SEM_OPEN = 268 + SYS_SEM_CLOSE = 269 + SYS_SEM_UNLINK = 270 + SYS_SEM_WAIT = 271 + SYS_SEM_TRYWAIT = 272 + SYS_SEM_POST = 273 + SYS_SYSCTLBYNAME = 274 + SYS_OPEN_EXTENDED = 277 + SYS_UMASK_EXTENDED = 278 + SYS_STAT_EXTENDED = 279 + SYS_LSTAT_EXTENDED = 280 + SYS_FSTAT_EXTENDED = 281 + SYS_CHMOD_EXTENDED = 282 + SYS_FCHMOD_EXTENDED = 283 + SYS_ACCESS_EXTENDED = 284 + SYS_SETTID = 285 + SYS_GETTID = 286 + SYS_SETSGROUPS = 287 + SYS_GETSGROUPS = 288 + SYS_SETWGROUPS = 289 + SYS_GETWGROUPS = 290 + SYS_MKFIFO_EXTENDED = 291 + SYS_MKDIR_EXTENDED = 292 + SYS_IDENTITYSVC = 293 + SYS_SHARED_REGION_CHECK_NP = 294 + SYS_VM_PRESSURE_MONITOR = 296 + SYS_PSYNCH_RW_LONGRDLOCK = 297 + SYS_PSYNCH_RW_YIELDWRLOCK = 298 + SYS_PSYNCH_RW_DOWNGRADE = 299 + SYS_PSYNCH_RW_UPGRADE = 300 + SYS_PSYNCH_MUTEXWAIT = 301 + SYS_PSYNCH_MUTEXDROP = 302 + SYS_PSYNCH_CVBROAD = 303 + SYS_PSYNCH_CVSIGNAL = 304 + SYS_PSYNCH_CVWAIT = 305 + SYS_PSYNCH_RW_RDLOCK = 306 + SYS_PSYNCH_RW_WRLOCK = 307 + SYS_PSYNCH_RW_UNLOCK = 308 + SYS_PSYNCH_RW_UNLOCK2 = 309 + SYS_GETSID = 310 + SYS_SETTID_WITH_PID = 311 + SYS_PSYNCH_CVCLRPREPOST = 312 + SYS_AIO_FSYNC = 313 + SYS_AIO_RETURN = 314 + SYS_AIO_SUSPEND = 315 + SYS_AIO_CANCEL = 316 + SYS_AIO_ERROR = 317 + SYS_AIO_READ = 318 + SYS_AIO_WRITE = 319 + SYS_LIO_LISTIO = 320 + SYS_IOPOLICYSYS = 322 + SYS_PROCESS_POLICY = 323 + SYS_MLOCKALL = 324 + SYS_MUNLOCKALL = 325 + SYS_ISSETUGID = 327 + SYS___PTHREAD_KILL = 328 + SYS___PTHREAD_SIGMASK = 329 + SYS___SIGWAIT = 330 + SYS___DISABLE_THREADSIGNAL = 331 + SYS___PTHREAD_MARKCANCEL = 332 + SYS___PTHREAD_CANCELED = 333 + SYS___SEMWAIT_SIGNAL = 334 + SYS_PROC_INFO = 336 + SYS_SENDFILE = 337 + SYS_STAT64 = 338 + SYS_FSTAT64 = 339 + SYS_LSTAT64 = 340 + SYS_STAT64_EXTENDED = 341 + SYS_LSTAT64_EXTENDED = 342 + SYS_FSTAT64_EXTENDED = 343 + SYS_GETDIRENTRIES64 = 344 + SYS_STATFS64 = 345 + SYS_FSTATFS64 = 346 + SYS_GETFSSTAT64 = 347 + SYS___PTHREAD_CHDIR = 348 + SYS___PTHREAD_FCHDIR = 349 + SYS_AUDIT = 350 + SYS_AUDITON = 351 + SYS_GETAUID = 353 + SYS_SETAUID = 354 + SYS_GETAUDIT_ADDR = 357 + SYS_SETAUDIT_ADDR = 358 + SYS_AUDITCTL = 359 + SYS_BSDTHREAD_CREATE = 360 + SYS_BSDTHREAD_TERMINATE = 361 + SYS_KQUEUE = 362 + SYS_KEVENT = 363 + SYS_LCHOWN = 364 + SYS_BSDTHREAD_REGISTER = 366 + SYS_WORKQ_OPEN = 367 + SYS_WORKQ_KERNRETURN = 368 + SYS_KEVENT64 = 369 + SYS___OLD_SEMWAIT_SIGNAL = 370 + SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL = 371 + SYS_THREAD_SELFID = 372 + SYS_LEDGER = 373 + SYS_KEVENT_QOS = 374 + SYS___MAC_EXECVE = 380 + SYS___MAC_SYSCALL = 381 + SYS___MAC_GET_FILE = 382 + SYS___MAC_SET_FILE = 383 + SYS___MAC_GET_LINK = 384 + SYS___MAC_SET_LINK = 385 + SYS___MAC_GET_PROC = 386 + SYS___MAC_SET_PROC = 387 + SYS___MAC_GET_FD = 388 + SYS___MAC_SET_FD = 389 + SYS___MAC_GET_PID = 390 + SYS_PSELECT = 394 + SYS_PSELECT_NOCANCEL = 395 + SYS_READ_NOCANCEL = 396 + SYS_WRITE_NOCANCEL = 397 + SYS_OPEN_NOCANCEL = 398 + SYS_CLOSE_NOCANCEL = 399 + SYS_WAIT4_NOCANCEL = 400 + SYS_RECVMSG_NOCANCEL = 401 + SYS_SENDMSG_NOCANCEL = 402 + SYS_RECVFROM_NOCANCEL = 403 + SYS_ACCEPT_NOCANCEL = 404 + SYS_MSYNC_NOCANCEL = 405 + SYS_FCNTL_NOCANCEL = 406 + SYS_SELECT_NOCANCEL = 407 + SYS_FSYNC_NOCANCEL = 408 + SYS_CONNECT_NOCANCEL = 409 + SYS_SIGSUSPEND_NOCANCEL = 410 + SYS_READV_NOCANCEL = 411 + SYS_WRITEV_NOCANCEL = 412 + SYS_SENDTO_NOCANCEL = 413 + SYS_PREAD_NOCANCEL = 414 + SYS_PWRITE_NOCANCEL = 415 + SYS_WAITID_NOCANCEL = 416 + SYS_POLL_NOCANCEL = 417 + SYS_MSGSND_NOCANCEL = 418 + SYS_MSGRCV_NOCANCEL = 419 + SYS_SEM_WAIT_NOCANCEL = 420 + SYS_AIO_SUSPEND_NOCANCEL = 421 + SYS___SIGWAIT_NOCANCEL = 422 + SYS___SEMWAIT_SIGNAL_NOCANCEL = 423 + SYS___MAC_MOUNT = 424 + SYS___MAC_GET_MOUNT = 425 + SYS___MAC_GETFSSTAT = 426 + SYS_FSGETPATH = 427 + SYS_AUDIT_SESSION_SELF = 428 + SYS_AUDIT_SESSION_JOIN = 429 + SYS_FILEPORT_MAKEPORT = 430 + SYS_FILEPORT_MAKEFD = 431 + SYS_AUDIT_SESSION_PORT = 432 + SYS_PID_SUSPEND = 433 + SYS_PID_RESUME = 434 + SYS_PID_HIBERNATE = 435 + SYS_PID_SHUTDOWN_SOCKETS = 436 + SYS_SHARED_REGION_MAP_AND_SLIDE_NP = 438 + SYS_KAS_INFO = 439 + SYS_MEMORYSTATUS_CONTROL = 440 + SYS_GUARDED_OPEN_NP = 441 + SYS_GUARDED_CLOSE_NP = 442 + SYS_GUARDED_KQUEUE_NP = 443 + SYS_CHANGE_FDGUARD_NP = 444 + SYS_USRCTL = 445 + SYS_PROC_RLIMIT_CONTROL = 446 + SYS_CONNECTX = 447 + SYS_DISCONNECTX = 448 + SYS_PEELOFF = 449 + SYS_SOCKET_DELEGATE = 450 + SYS_TELEMETRY = 451 + SYS_PROC_UUID_POLICY = 452 + SYS_MEMORYSTATUS_GET_LEVEL = 453 + SYS_SYSTEM_OVERRIDE = 454 + SYS_VFS_PURGE = 455 + SYS_SFI_CTL = 456 + SYS_SFI_PIDCTL = 457 + SYS_COALITION = 458 + SYS_COALITION_INFO = 459 + SYS_NECP_MATCH_POLICY = 460 + SYS_GETATTRLISTBULK = 461 + SYS_CLONEFILEAT = 462 + SYS_OPENAT = 463 + SYS_OPENAT_NOCANCEL = 464 + SYS_RENAMEAT = 465 + SYS_FACCESSAT = 466 + SYS_FCHMODAT = 467 + SYS_FCHOWNAT = 468 + SYS_FSTATAT = 469 + SYS_FSTATAT64 = 470 + SYS_LINKAT = 471 + SYS_UNLINKAT = 472 + SYS_READLINKAT = 473 + SYS_SYMLINKAT = 474 + SYS_MKDIRAT = 475 + SYS_GETATTRLISTAT = 476 + SYS_PROC_TRACE_LOG = 477 + SYS_BSDTHREAD_CTL = 478 + SYS_OPENBYID_NP = 479 + SYS_RECVMSG_X = 480 + SYS_SENDMSG_X = 481 + SYS_THREAD_SELFUSAGE = 482 + SYS_CSRCTL = 483 + SYS_GUARDED_OPEN_DPROTECTED_NP = 484 + SYS_GUARDED_WRITE_NP = 485 + SYS_GUARDED_PWRITE_NP = 486 + SYS_GUARDED_WRITEV_NP = 487 + SYS_RENAMEATX_NP = 488 + SYS_MREMAP_ENCRYPTED = 489 + SYS_NETAGENT_TRIGGER = 490 + SYS_STACK_SNAPSHOT_WITH_CONFIG = 491 + SYS_MICROSTACKSHOT = 492 + SYS_GRAB_PGO_DATA = 493 + SYS_PERSONA = 494 + SYS_WORK_INTERVAL_CTL = 499 + SYS_GETENTROPY = 500 + SYS_NECP_OPEN = 501 + SYS_NECP_CLIENT_ACTION = 502 + SYS___NEXUS_OPEN = 503 + SYS___NEXUS_REGISTER = 504 + SYS___NEXUS_DEREGISTER = 505 + SYS___NEXUS_CREATE = 506 + SYS___NEXUS_DESTROY = 507 + SYS___NEXUS_GET_OPT = 508 + SYS___NEXUS_SET_OPT = 509 + SYS___CHANNEL_OPEN = 510 + SYS___CHANNEL_GET_INFO = 511 + SYS___CHANNEL_SYNC = 512 + SYS___CHANNEL_GET_OPT = 513 + SYS___CHANNEL_SET_OPT = 514 + SYS_ULOCK_WAIT = 515 + SYS_ULOCK_WAKE = 516 + SYS_FCLONEFILEAT = 517 + SYS_FS_SNAPSHOT = 518 + SYS_TERMINATE_WITH_PAYLOAD = 520 + SYS_ABORT_WITH_PAYLOAD = 521 + SYS_MAXSYSCALL = 522 + SYS_INVALID = 63 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go new file mode 100644 index 0000000..075816c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go @@ -0,0 +1,426 @@ +// mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.2.sdk/usr/include/sys/syscall.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm64,darwin + +package unix + +const ( + SYS_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_WAIT4 = 7 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_CHDIR = 12 + SYS_FCHDIR = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_CHOWN = 16 + SYS_GETFSSTAT = 18 + SYS_GETPID = 20 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_GETEUID = 25 + SYS_PTRACE = 26 + SYS_RECVMSG = 27 + SYS_SENDMSG = 28 + SYS_RECVFROM = 29 + SYS_ACCEPT = 30 + SYS_GETPEERNAME = 31 + SYS_GETSOCKNAME = 32 + SYS_ACCESS = 33 + SYS_CHFLAGS = 34 + SYS_FCHFLAGS = 35 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_GETPPID = 39 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_GETEGID = 43 + SYS_SIGACTION = 46 + SYS_GETGID = 47 + SYS_SIGPROCMASK = 48 + SYS_GETLOGIN = 49 + SYS_SETLOGIN = 50 + SYS_ACCT = 51 + SYS_SIGPENDING = 52 + SYS_SIGALTSTACK = 53 + SYS_IOCTL = 54 + SYS_REBOOT = 55 + SYS_REVOKE = 56 + SYS_SYMLINK = 57 + SYS_READLINK = 58 + SYS_EXECVE = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_MSYNC = 65 + SYS_VFORK = 66 + SYS_MUNMAP = 73 + SYS_MPROTECT = 74 + SYS_MADVISE = 75 + SYS_MINCORE = 78 + SYS_GETGROUPS = 79 + SYS_SETGROUPS = 80 + SYS_GETPGRP = 81 + SYS_SETPGID = 82 + SYS_SETITIMER = 83 + SYS_SWAPON = 85 + SYS_GETITIMER = 86 + SYS_GETDTABLESIZE = 89 + SYS_DUP2 = 90 + SYS_FCNTL = 92 + SYS_SELECT = 93 + SYS_FSYNC = 95 + SYS_SETPRIORITY = 96 + SYS_SOCKET = 97 + SYS_CONNECT = 98 + SYS_GETPRIORITY = 100 + SYS_BIND = 104 + SYS_SETSOCKOPT = 105 + SYS_LISTEN = 106 + SYS_SIGSUSPEND = 111 + SYS_GETTIMEOFDAY = 116 + SYS_GETRUSAGE = 117 + SYS_GETSOCKOPT = 118 + SYS_READV = 120 + SYS_WRITEV = 121 + SYS_SETTIMEOFDAY = 122 + SYS_FCHOWN = 123 + SYS_FCHMOD = 124 + SYS_SETREUID = 126 + SYS_SETREGID = 127 + SYS_RENAME = 128 + SYS_FLOCK = 131 + SYS_MKFIFO = 132 + SYS_SENDTO = 133 + SYS_SHUTDOWN = 134 + SYS_SOCKETPAIR = 135 + SYS_MKDIR = 136 + SYS_RMDIR = 137 + SYS_UTIMES = 138 + SYS_FUTIMES = 139 + SYS_ADJTIME = 140 + SYS_GETHOSTUUID = 142 + SYS_SETSID = 147 + SYS_GETPGID = 151 + SYS_SETPRIVEXEC = 152 + SYS_PREAD = 153 + SYS_PWRITE = 154 + SYS_NFSSVC = 155 + SYS_STATFS = 157 + SYS_FSTATFS = 158 + SYS_UNMOUNT = 159 + SYS_GETFH = 161 + SYS_QUOTACTL = 165 + SYS_MOUNT = 167 + SYS_CSOPS = 169 + SYS_CSOPS_AUDITTOKEN = 170 + SYS_WAITID = 173 + SYS_KDEBUG_TYPEFILTER = 177 + SYS_KDEBUG_TRACE_STRING = 178 + SYS_KDEBUG_TRACE64 = 179 + SYS_KDEBUG_TRACE = 180 + SYS_SETGID = 181 + SYS_SETEGID = 182 + SYS_SETEUID = 183 + SYS_SIGRETURN = 184 + SYS_FDATASYNC = 187 + SYS_STAT = 188 + SYS_FSTAT = 189 + SYS_LSTAT = 190 + SYS_PATHCONF = 191 + SYS_FPATHCONF = 192 + SYS_GETRLIMIT = 194 + SYS_SETRLIMIT = 195 + SYS_GETDIRENTRIES = 196 + SYS_MMAP = 197 + SYS_LSEEK = 199 + SYS_TRUNCATE = 200 + SYS_FTRUNCATE = 201 + SYS_SYSCTL = 202 + SYS_MLOCK = 203 + SYS_MUNLOCK = 204 + SYS_UNDELETE = 205 + SYS_OPEN_DPROTECTED_NP = 216 + SYS_GETATTRLIST = 220 + SYS_SETATTRLIST = 221 + SYS_GETDIRENTRIESATTR = 222 + SYS_EXCHANGEDATA = 223 + SYS_SEARCHFS = 225 + SYS_DELETE = 226 + SYS_COPYFILE = 227 + SYS_FGETATTRLIST = 228 + SYS_FSETATTRLIST = 229 + SYS_POLL = 230 + SYS_WATCHEVENT = 231 + SYS_WAITEVENT = 232 + SYS_MODWATCH = 233 + SYS_GETXATTR = 234 + SYS_FGETXATTR = 235 + SYS_SETXATTR = 236 + SYS_FSETXATTR = 237 + SYS_REMOVEXATTR = 238 + SYS_FREMOVEXATTR = 239 + SYS_LISTXATTR = 240 + SYS_FLISTXATTR = 241 + SYS_FSCTL = 242 + SYS_INITGROUPS = 243 + SYS_POSIX_SPAWN = 244 + SYS_FFSCTL = 245 + SYS_NFSCLNT = 247 + SYS_FHOPEN = 248 + SYS_MINHERIT = 250 + SYS_SEMSYS = 251 + SYS_MSGSYS = 252 + SYS_SHMSYS = 253 + SYS_SEMCTL = 254 + SYS_SEMGET = 255 + SYS_SEMOP = 256 + SYS_MSGCTL = 258 + SYS_MSGGET = 259 + SYS_MSGSND = 260 + SYS_MSGRCV = 261 + SYS_SHMAT = 262 + SYS_SHMCTL = 263 + SYS_SHMDT = 264 + SYS_SHMGET = 265 + SYS_SHM_OPEN = 266 + SYS_SHM_UNLINK = 267 + SYS_SEM_OPEN = 268 + SYS_SEM_CLOSE = 269 + SYS_SEM_UNLINK = 270 + SYS_SEM_WAIT = 271 + SYS_SEM_TRYWAIT = 272 + SYS_SEM_POST = 273 + SYS_SYSCTLBYNAME = 274 + SYS_OPEN_EXTENDED = 277 + SYS_UMASK_EXTENDED = 278 + SYS_STAT_EXTENDED = 279 + SYS_LSTAT_EXTENDED = 280 + SYS_FSTAT_EXTENDED = 281 + SYS_CHMOD_EXTENDED = 282 + SYS_FCHMOD_EXTENDED = 283 + SYS_ACCESS_EXTENDED = 284 + SYS_SETTID = 285 + SYS_GETTID = 286 + SYS_SETSGROUPS = 287 + SYS_GETSGROUPS = 288 + SYS_SETWGROUPS = 289 + SYS_GETWGROUPS = 290 + SYS_MKFIFO_EXTENDED = 291 + SYS_MKDIR_EXTENDED = 292 + SYS_IDENTITYSVC = 293 + SYS_SHARED_REGION_CHECK_NP = 294 + SYS_VM_PRESSURE_MONITOR = 296 + SYS_PSYNCH_RW_LONGRDLOCK = 297 + SYS_PSYNCH_RW_YIELDWRLOCK = 298 + SYS_PSYNCH_RW_DOWNGRADE = 299 + SYS_PSYNCH_RW_UPGRADE = 300 + SYS_PSYNCH_MUTEXWAIT = 301 + SYS_PSYNCH_MUTEXDROP = 302 + SYS_PSYNCH_CVBROAD = 303 + SYS_PSYNCH_CVSIGNAL = 304 + SYS_PSYNCH_CVWAIT = 305 + SYS_PSYNCH_RW_RDLOCK = 306 + SYS_PSYNCH_RW_WRLOCK = 307 + SYS_PSYNCH_RW_UNLOCK = 308 + SYS_PSYNCH_RW_UNLOCK2 = 309 + SYS_GETSID = 310 + SYS_SETTID_WITH_PID = 311 + SYS_PSYNCH_CVCLRPREPOST = 312 + SYS_AIO_FSYNC = 313 + SYS_AIO_RETURN = 314 + SYS_AIO_SUSPEND = 315 + SYS_AIO_CANCEL = 316 + SYS_AIO_ERROR = 317 + SYS_AIO_READ = 318 + SYS_AIO_WRITE = 319 + SYS_LIO_LISTIO = 320 + SYS_IOPOLICYSYS = 322 + SYS_PROCESS_POLICY = 323 + SYS_MLOCKALL = 324 + SYS_MUNLOCKALL = 325 + SYS_ISSETUGID = 327 + SYS___PTHREAD_KILL = 328 + SYS___PTHREAD_SIGMASK = 329 + SYS___SIGWAIT = 330 + SYS___DISABLE_THREADSIGNAL = 331 + SYS___PTHREAD_MARKCANCEL = 332 + SYS___PTHREAD_CANCELED = 333 + SYS___SEMWAIT_SIGNAL = 334 + SYS_PROC_INFO = 336 + SYS_SENDFILE = 337 + SYS_STAT64 = 338 + SYS_FSTAT64 = 339 + SYS_LSTAT64 = 340 + SYS_STAT64_EXTENDED = 341 + SYS_LSTAT64_EXTENDED = 342 + SYS_FSTAT64_EXTENDED = 343 + SYS_GETDIRENTRIES64 = 344 + SYS_STATFS64 = 345 + SYS_FSTATFS64 = 346 + SYS_GETFSSTAT64 = 347 + SYS___PTHREAD_CHDIR = 348 + SYS___PTHREAD_FCHDIR = 349 + SYS_AUDIT = 350 + SYS_AUDITON = 351 + SYS_GETAUID = 353 + SYS_SETAUID = 354 + SYS_GETAUDIT_ADDR = 357 + SYS_SETAUDIT_ADDR = 358 + SYS_AUDITCTL = 359 + SYS_BSDTHREAD_CREATE = 360 + SYS_BSDTHREAD_TERMINATE = 361 + SYS_KQUEUE = 362 + SYS_KEVENT = 363 + SYS_LCHOWN = 364 + SYS_BSDTHREAD_REGISTER = 366 + SYS_WORKQ_OPEN = 367 + SYS_WORKQ_KERNRETURN = 368 + SYS_KEVENT64 = 369 + SYS___OLD_SEMWAIT_SIGNAL = 370 + SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL = 371 + SYS_THREAD_SELFID = 372 + SYS_LEDGER = 373 + SYS_KEVENT_QOS = 374 + SYS___MAC_EXECVE = 380 + SYS___MAC_SYSCALL = 381 + SYS___MAC_GET_FILE = 382 + SYS___MAC_SET_FILE = 383 + SYS___MAC_GET_LINK = 384 + SYS___MAC_SET_LINK = 385 + SYS___MAC_GET_PROC = 386 + SYS___MAC_SET_PROC = 387 + SYS___MAC_GET_FD = 388 + SYS___MAC_SET_FD = 389 + SYS___MAC_GET_PID = 390 + SYS_PSELECT = 394 + SYS_PSELECT_NOCANCEL = 395 + SYS_READ_NOCANCEL = 396 + SYS_WRITE_NOCANCEL = 397 + SYS_OPEN_NOCANCEL = 398 + SYS_CLOSE_NOCANCEL = 399 + SYS_WAIT4_NOCANCEL = 400 + SYS_RECVMSG_NOCANCEL = 401 + SYS_SENDMSG_NOCANCEL = 402 + SYS_RECVFROM_NOCANCEL = 403 + SYS_ACCEPT_NOCANCEL = 404 + SYS_MSYNC_NOCANCEL = 405 + SYS_FCNTL_NOCANCEL = 406 + SYS_SELECT_NOCANCEL = 407 + SYS_FSYNC_NOCANCEL = 408 + SYS_CONNECT_NOCANCEL = 409 + SYS_SIGSUSPEND_NOCANCEL = 410 + SYS_READV_NOCANCEL = 411 + SYS_WRITEV_NOCANCEL = 412 + SYS_SENDTO_NOCANCEL = 413 + SYS_PREAD_NOCANCEL = 414 + SYS_PWRITE_NOCANCEL = 415 + SYS_WAITID_NOCANCEL = 416 + SYS_POLL_NOCANCEL = 417 + SYS_MSGSND_NOCANCEL = 418 + SYS_MSGRCV_NOCANCEL = 419 + SYS_SEM_WAIT_NOCANCEL = 420 + SYS_AIO_SUSPEND_NOCANCEL = 421 + SYS___SIGWAIT_NOCANCEL = 422 + SYS___SEMWAIT_SIGNAL_NOCANCEL = 423 + SYS___MAC_MOUNT = 424 + SYS___MAC_GET_MOUNT = 425 + SYS___MAC_GETFSSTAT = 426 + SYS_FSGETPATH = 427 + SYS_AUDIT_SESSION_SELF = 428 + SYS_AUDIT_SESSION_JOIN = 429 + SYS_FILEPORT_MAKEPORT = 430 + SYS_FILEPORT_MAKEFD = 431 + SYS_AUDIT_SESSION_PORT = 432 + SYS_PID_SUSPEND = 433 + SYS_PID_RESUME = 434 + SYS_PID_HIBERNATE = 435 + SYS_PID_SHUTDOWN_SOCKETS = 436 + SYS_SHARED_REGION_MAP_AND_SLIDE_NP = 438 + SYS_KAS_INFO = 439 + SYS_MEMORYSTATUS_CONTROL = 440 + SYS_GUARDED_OPEN_NP = 441 + SYS_GUARDED_CLOSE_NP = 442 + SYS_GUARDED_KQUEUE_NP = 443 + SYS_CHANGE_FDGUARD_NP = 444 + SYS_USRCTL = 445 + SYS_PROC_RLIMIT_CONTROL = 446 + SYS_CONNECTX = 447 + SYS_DISCONNECTX = 448 + SYS_PEELOFF = 449 + SYS_SOCKET_DELEGATE = 450 + SYS_TELEMETRY = 451 + SYS_PROC_UUID_POLICY = 452 + SYS_MEMORYSTATUS_GET_LEVEL = 453 + SYS_SYSTEM_OVERRIDE = 454 + SYS_VFS_PURGE = 455 + SYS_SFI_CTL = 456 + SYS_SFI_PIDCTL = 457 + SYS_COALITION = 458 + SYS_COALITION_INFO = 459 + SYS_NECP_MATCH_POLICY = 460 + SYS_GETATTRLISTBULK = 461 + SYS_CLONEFILEAT = 462 + SYS_OPENAT = 463 + SYS_OPENAT_NOCANCEL = 464 + SYS_RENAMEAT = 465 + SYS_FACCESSAT = 466 + SYS_FCHMODAT = 467 + SYS_FCHOWNAT = 468 + SYS_FSTATAT = 469 + SYS_FSTATAT64 = 470 + SYS_LINKAT = 471 + SYS_UNLINKAT = 472 + SYS_READLINKAT = 473 + SYS_SYMLINKAT = 474 + SYS_MKDIRAT = 475 + SYS_GETATTRLISTAT = 476 + SYS_PROC_TRACE_LOG = 477 + SYS_BSDTHREAD_CTL = 478 + SYS_OPENBYID_NP = 479 + SYS_RECVMSG_X = 480 + SYS_SENDMSG_X = 481 + SYS_THREAD_SELFUSAGE = 482 + SYS_CSRCTL = 483 + SYS_GUARDED_OPEN_DPROTECTED_NP = 484 + SYS_GUARDED_WRITE_NP = 485 + SYS_GUARDED_PWRITE_NP = 486 + SYS_GUARDED_WRITEV_NP = 487 + SYS_RENAMEATX_NP = 488 + SYS_MREMAP_ENCRYPTED = 489 + SYS_NETAGENT_TRIGGER = 490 + SYS_STACK_SNAPSHOT_WITH_CONFIG = 491 + SYS_MICROSTACKSHOT = 492 + SYS_GRAB_PGO_DATA = 493 + SYS_PERSONA = 494 + SYS_WORK_INTERVAL_CTL = 499 + SYS_GETENTROPY = 500 + SYS_NECP_OPEN = 501 + SYS_NECP_CLIENT_ACTION = 502 + SYS___NEXUS_OPEN = 503 + SYS___NEXUS_REGISTER = 504 + SYS___NEXUS_DEREGISTER = 505 + SYS___NEXUS_CREATE = 506 + SYS___NEXUS_DESTROY = 507 + SYS___NEXUS_GET_OPT = 508 + SYS___NEXUS_SET_OPT = 509 + SYS___CHANNEL_OPEN = 510 + SYS___CHANNEL_GET_INFO = 511 + SYS___CHANNEL_SYNC = 512 + SYS___CHANNEL_GET_OPT = 513 + SYS___CHANNEL_SET_OPT = 514 + SYS_ULOCK_WAIT = 515 + SYS_ULOCK_WAKE = 516 + SYS_FCLONEFILEAT = 517 + SYS_FS_SNAPSHOT = 518 + SYS_TERMINATE_WITH_PAYLOAD = 520 + SYS_ABORT_WITH_PAYLOAD = 521 + SYS_MAXSYSCALL = 522 + SYS_INVALID = 63 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go new file mode 100644 index 0000000..b2c9ef8 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go @@ -0,0 +1,315 @@ +// mksysnum_dragonfly.pl +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,dragonfly + +package unix + +const ( + // SYS_NOSYS = 0; // { int nosys(void); } syscall nosys_args int + SYS_EXIT = 1 // { void exit(int rval); } + SYS_FORK = 2 // { int fork(void); } + SYS_READ = 3 // { ssize_t read(int fd, void *buf, size_t nbyte); } + SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, size_t nbyte); } + SYS_OPEN = 5 // { int open(char *path, int flags, int mode); } + SYS_CLOSE = 6 // { int close(int fd); } + SYS_WAIT4 = 7 // { int wait4(int pid, int *status, int options, \ + SYS_LINK = 9 // { int link(char *path, char *link); } + SYS_UNLINK = 10 // { int unlink(char *path); } + SYS_CHDIR = 12 // { int chdir(char *path); } + SYS_FCHDIR = 13 // { int fchdir(int fd); } + SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } + SYS_CHMOD = 15 // { int chmod(char *path, int mode); } + SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } + SYS_OBREAK = 17 // { int obreak(char *nsize); } break obreak_args int + SYS_GETFSSTAT = 18 // { int getfsstat(struct statfs *buf, long bufsize, \ + SYS_GETPID = 20 // { pid_t getpid(void); } + SYS_MOUNT = 21 // { int mount(char *type, char *path, int flags, \ + SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } + SYS_SETUID = 23 // { int setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t getuid(void); } + SYS_GETEUID = 25 // { uid_t geteuid(void); } + SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, caddr_t addr, \ + SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, int flags); } + SYS_SENDMSG = 28 // { int sendmsg(int s, caddr_t msg, int flags); } + SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, size_t len, \ + SYS_ACCEPT = 30 // { int accept(int s, caddr_t name, int *anamelen); } + SYS_GETPEERNAME = 31 // { int getpeername(int fdes, caddr_t asa, int *alen); } + SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, caddr_t asa, int *alen); } + SYS_ACCESS = 33 // { int access(char *path, int flags); } + SYS_CHFLAGS = 34 // { int chflags(char *path, int flags); } + SYS_FCHFLAGS = 35 // { int fchflags(int fd, int flags); } + SYS_SYNC = 36 // { int sync(void); } + SYS_KILL = 37 // { int kill(int pid, int signum); } + SYS_GETPPID = 39 // { pid_t getppid(void); } + SYS_DUP = 41 // { int dup(int fd); } + SYS_PIPE = 42 // { int pipe(void); } + SYS_GETEGID = 43 // { gid_t getegid(void); } + SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, \ + SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, int facs, \ + SYS_GETGID = 47 // { gid_t getgid(void); } + SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int namelen); } + SYS_SETLOGIN = 50 // { int setlogin(char *namebuf); } + SYS_ACCT = 51 // { int acct(char *path); } + SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, stack_t *oss); } + SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, caddr_t data); } + SYS_REBOOT = 55 // { int reboot(int opt); } + SYS_REVOKE = 56 // { int revoke(char *path); } + SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } + SYS_READLINK = 58 // { int readlink(char *path, char *buf, int count); } + SYS_EXECVE = 59 // { int execve(char *fname, char **argv, char **envv); } + SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args int + SYS_CHROOT = 61 // { int chroot(char *path); } + SYS_MSYNC = 65 // { int msync(void *addr, size_t len, int flags); } + SYS_VFORK = 66 // { pid_t vfork(void); } + SYS_SBRK = 69 // { int sbrk(int incr); } + SYS_SSTK = 70 // { int sstk(int incr); } + SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int mprotect(void *addr, size_t len, int prot); } + SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, int behav); } + SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, \ + SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, gid_t *gidset); } + SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, gid_t *gidset); } + SYS_GETPGRP = 81 // { int getpgrp(void); } + SYS_SETPGID = 82 // { int setpgid(int pid, int pgid); } + SYS_SETITIMER = 83 // { int setitimer(u_int which, struct itimerval *itv, \ + SYS_SWAPON = 85 // { int swapon(char *name); } + SYS_GETITIMER = 86 // { int getitimer(u_int which, struct itimerval *itv); } + SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); } + SYS_DUP2 = 90 // { int dup2(int from, int to); } + SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); } + SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, \ + SYS_FSYNC = 95 // { int fsync(int fd); } + SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, int prio); } + SYS_SOCKET = 97 // { int socket(int domain, int type, int protocol); } + SYS_CONNECT = 98 // { int connect(int s, caddr_t name, int namelen); } + SYS_GETPRIORITY = 100 // { int getpriority(int which, int who); } + SYS_BIND = 104 // { int bind(int s, caddr_t name, int namelen); } + SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, \ + SYS_LISTEN = 106 // { int listen(int s, int backlog); } + SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, \ + SYS_GETRUSAGE = 117 // { int getrusage(int who, struct rusage *rusage); } + SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, \ + SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, u_int iovcnt); } + SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, \ + SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, \ + SYS_FCHOWN = 123 // { int fchown(int fd, int uid, int gid); } + SYS_FCHMOD = 124 // { int fchmod(int fd, int mode); } + SYS_SETREUID = 126 // { int setreuid(int ruid, int euid); } + SYS_SETREGID = 127 // { int setregid(int rgid, int egid); } + SYS_RENAME = 128 // { int rename(char *from, char *to); } + SYS_FLOCK = 131 // { int flock(int fd, int how); } + SYS_MKFIFO = 132 // { int mkfifo(char *path, int mode); } + SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, \ + SYS_SHUTDOWN = 134 // { int shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, int protocol, \ + SYS_MKDIR = 136 // { int mkdir(char *path, int mode); } + SYS_RMDIR = 137 // { int rmdir(char *path); } + SYS_UTIMES = 138 // { int utimes(char *path, struct timeval *tptr); } + SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, \ + SYS_SETSID = 147 // { int setsid(void); } + SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, \ + SYS_STATFS = 157 // { int statfs(char *path, struct statfs *buf); } + SYS_FSTATFS = 158 // { int fstatfs(int fd, struct statfs *buf); } + SYS_GETFH = 161 // { int getfh(char *fname, struct fhandle *fhp); } + SYS_GETDOMAINNAME = 162 // { int getdomainname(char *domainname, int len); } + SYS_SETDOMAINNAME = 163 // { int setdomainname(char *domainname, int len); } + SYS_UNAME = 164 // { int uname(struct utsname *name); } + SYS_SYSARCH = 165 // { int sysarch(int op, char *parms); } + SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, \ + SYS_EXTPREAD = 173 // { ssize_t extpread(int fd, void *buf, \ + SYS_EXTPWRITE = 174 // { ssize_t extpwrite(int fd, const void *buf, \ + SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } + SYS_SETGID = 181 // { int setgid(gid_t gid); } + SYS_SETEGID = 182 // { int setegid(gid_t egid); } + SYS_SETEUID = 183 // { int seteuid(uid_t euid); } + SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } + SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } + SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, \ + SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, \ + SYS_MMAP = 197 // { caddr_t mmap(caddr_t addr, size_t len, int prot, \ + // SYS_NOSYS = 198; // { int nosys(void); } __syscall __syscall_args int + SYS_LSEEK = 199 // { off_t lseek(int fd, int pad, off_t offset, \ + SYS_TRUNCATE = 200 // { int truncate(char *path, int pad, off_t length); } + SYS_FTRUNCATE = 201 // { int ftruncate(int fd, int pad, off_t length); } + SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, void *old, \ + SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } + SYS_UNDELETE = 205 // { int undelete(char *path); } + SYS_FUTIMES = 206 // { int futimes(int fd, struct timeval *tptr); } + SYS_GETPGID = 207 // { int getpgid(pid_t pid); } + SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, \ + SYS___SEMCTL = 220 // { int __semctl(int semid, int semnum, int cmd, \ + SYS_SEMGET = 221 // { int semget(key_t key, int nsems, int semflg); } + SYS_SEMOP = 222 // { int semop(int semid, struct sembuf *sops, \ + SYS_MSGCTL = 224 // { int msgctl(int msqid, int cmd, \ + SYS_MSGGET = 225 // { int msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int msgsnd(int msqid, const void *msgp, size_t msgsz, \ + SYS_MSGRCV = 227 // { int msgrcv(int msqid, void *msgp, size_t msgsz, \ + SYS_SHMAT = 228 // { caddr_t shmat(int shmid, const void *shmaddr, \ + SYS_SHMCTL = 229 // { int shmctl(int shmid, int cmd, \ + SYS_SHMDT = 230 // { int shmdt(const void *shmaddr); } + SYS_SHMGET = 231 // { int shmget(key_t key, size_t size, int shmflg); } + SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, \ + SYS_CLOCK_SETTIME = 233 // { int clock_settime(clockid_t clock_id, \ + SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, \ + SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, \ + SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, int inherit); } + SYS_RFORK = 251 // { int rfork(int flags); } + SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, u_int nfds, \ + SYS_ISSETUGID = 253 // { int issetugid(void); } + SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } + SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } + SYS_LUTIMES = 276 // { int lutimes(char *path, struct timeval *tptr); } + SYS_EXTPREADV = 289 // { ssize_t extpreadv(int fd, struct iovec *iovp, \ + SYS_EXTPWRITEV = 290 // { ssize_t extpwritev(int fd, struct iovec *iovp,\ + SYS_FHSTATFS = 297 // { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); } + SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, int flags); } + SYS_MODNEXT = 300 // { int modnext(int modid); } + SYS_MODSTAT = 301 // { int modstat(int modid, struct module_stat* stat); } + SYS_MODFNEXT = 302 // { int modfnext(int modid); } + SYS_MODFIND = 303 // { int modfind(const char *name); } + SYS_KLDLOAD = 304 // { int kldload(const char *file); } + SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } + SYS_KLDFIND = 306 // { int kldfind(const char *file); } + SYS_KLDNEXT = 307 // { int kldnext(int fileid); } + SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct kld_file_stat* stat); } + SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } + SYS_GETSID = 310 // { int getsid(pid_t pid); } + SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, uid_t suid); } + SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, gid_t sgid); } + SYS_AIO_RETURN = 314 // { int aio_return(struct aiocb *aiocbp); } + SYS_AIO_SUSPEND = 315 // { int aio_suspend(struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); } + SYS_AIO_CANCEL = 316 // { int aio_cancel(int fd, struct aiocb *aiocbp); } + SYS_AIO_ERROR = 317 // { int aio_error(struct aiocb *aiocbp); } + SYS_AIO_READ = 318 // { int aio_read(struct aiocb *aiocbp); } + SYS_AIO_WRITE = 319 // { int aio_write(struct aiocb *aiocbp); } + SYS_LIO_LISTIO = 320 // { int lio_listio(int mode, struct aiocb * const *acb_list, int nent, struct sigevent *sig); } + SYS_YIELD = 321 // { int yield(void); } + SYS_MLOCKALL = 324 // { int mlockall(int how); } + SYS_MUNLOCKALL = 325 // { int munlockall(void); } + SYS___GETCWD = 326 // { int __getcwd(u_char *buf, u_int buflen); } + SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, const struct sched_param *param); } + SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct sched_param *param); } + SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int policy, const struct sched_param *param); } + SYS_SCHED_GETSCHEDULER = 330 // { int sched_getscheduler (pid_t pid); } + SYS_SCHED_YIELD = 331 // { int sched_yield (void); } + SYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); } + SYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); } + SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, struct timespec *interval); } + SYS_UTRACE = 335 // { int utrace(const void *addr, size_t len); } + SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, void *data); } + SYS_JAIL = 338 // { int jail(struct jail *jail); } + SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, const sigset_t *set, \ + SYS_SIGSUSPEND = 341 // { int sigsuspend(const sigset_t *sigmask); } + SYS_SIGACTION = 342 // { int sigaction(int sig, const struct sigaction *act, \ + SYS_SIGPENDING = 343 // { int sigpending(sigset_t *set); } + SYS_SIGRETURN = 344 // { int sigreturn(ucontext_t *sigcntxp); } + SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set,\ + SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set,\ + SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, \ + SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, \ + SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, acl_type_t type, \ + SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, acl_type_t type, \ + SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, \ + SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, acl_type_t type); } + SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, \ + SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, acl_type_t type, \ + SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, \ + SYS_EXTATTR_SET_FILE = 356 // { int extattr_set_file(const char *path, \ + SYS_EXTATTR_GET_FILE = 357 // { int extattr_get_file(const char *path, \ + SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, \ + SYS_AIO_WAITCOMPLETE = 359 // { int aio_waitcomplete(struct aiocb **aiocbp, struct timespec *timeout); } + SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); } + SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); } + SYS_KQUEUE = 362 // { int kqueue(void); } + SYS_KEVENT = 363 // { int kevent(int fd, \ + SYS_KENV = 390 // { int kenv(int what, const char *name, char *value, int len); } + SYS_LCHFLAGS = 391 // { int lchflags(char *path, int flags); } + SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, int count); } + SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, size_t nbytes, \ + SYS_VARSYM_SET = 450 // { int varsym_set(int level, const char *name, const char *data); } + SYS_VARSYM_GET = 451 // { int varsym_get(int mask, const char *wild, char *buf, int bufsize); } + SYS_VARSYM_LIST = 452 // { int varsym_list(int level, char *buf, int maxsize, int *marker); } + SYS_EXEC_SYS_REGISTER = 465 // { int exec_sys_register(void *entry); } + SYS_EXEC_SYS_UNREGISTER = 466 // { int exec_sys_unregister(int id); } + SYS_SYS_CHECKPOINT = 467 // { int sys_checkpoint(int type, int fd, pid_t pid, int retval); } + SYS_MOUNTCTL = 468 // { int mountctl(const char *path, int op, int fd, const void *ctl, int ctllen, void *buf, int buflen); } + SYS_UMTX_SLEEP = 469 // { int umtx_sleep(volatile const int *ptr, int value, int timeout); } + SYS_UMTX_WAKEUP = 470 // { int umtx_wakeup(volatile const int *ptr, int count); } + SYS_JAIL_ATTACH = 471 // { int jail_attach(int jid); } + SYS_SET_TLS_AREA = 472 // { int set_tls_area(int which, struct tls_info *info, size_t infosize); } + SYS_GET_TLS_AREA = 473 // { int get_tls_area(int which, struct tls_info *info, size_t infosize); } + SYS_CLOSEFROM = 474 // { int closefrom(int fd); } + SYS_STAT = 475 // { int stat(const char *path, struct stat *ub); } + SYS_FSTAT = 476 // { int fstat(int fd, struct stat *sb); } + SYS_LSTAT = 477 // { int lstat(const char *path, struct stat *ub); } + SYS_FHSTAT = 478 // { int fhstat(const struct fhandle *u_fhp, struct stat *sb); } + SYS_GETDIRENTRIES = 479 // { int getdirentries(int fd, char *buf, u_int count, \ + SYS_GETDENTS = 480 // { int getdents(int fd, char *buf, size_t count); } + SYS_USCHED_SET = 481 // { int usched_set(pid_t pid, int cmd, void *data, \ + SYS_EXTACCEPT = 482 // { int extaccept(int s, int flags, caddr_t name, int *anamelen); } + SYS_EXTCONNECT = 483 // { int extconnect(int s, int flags, caddr_t name, int namelen); } + SYS_MCONTROL = 485 // { int mcontrol(void *addr, size_t len, int behav, off_t value); } + SYS_VMSPACE_CREATE = 486 // { int vmspace_create(void *id, int type, void *data); } + SYS_VMSPACE_DESTROY = 487 // { int vmspace_destroy(void *id); } + SYS_VMSPACE_CTL = 488 // { int vmspace_ctl(void *id, int cmd, \ + SYS_VMSPACE_MMAP = 489 // { int vmspace_mmap(void *id, void *addr, size_t len, \ + SYS_VMSPACE_MUNMAP = 490 // { int vmspace_munmap(void *id, void *addr, \ + SYS_VMSPACE_MCONTROL = 491 // { int vmspace_mcontrol(void *id, void *addr, \ + SYS_VMSPACE_PREAD = 492 // { ssize_t vmspace_pread(void *id, void *buf, \ + SYS_VMSPACE_PWRITE = 493 // { ssize_t vmspace_pwrite(void *id, const void *buf, \ + SYS_EXTEXIT = 494 // { void extexit(int how, int status, void *addr); } + SYS_LWP_CREATE = 495 // { int lwp_create(struct lwp_params *params); } + SYS_LWP_GETTID = 496 // { lwpid_t lwp_gettid(void); } + SYS_LWP_KILL = 497 // { int lwp_kill(pid_t pid, lwpid_t tid, int signum); } + SYS_LWP_RTPRIO = 498 // { int lwp_rtprio(int function, pid_t pid, lwpid_t tid, struct rtprio *rtp); } + SYS_PSELECT = 499 // { int pselect(int nd, fd_set *in, fd_set *ou, \ + SYS_STATVFS = 500 // { int statvfs(const char *path, struct statvfs *buf); } + SYS_FSTATVFS = 501 // { int fstatvfs(int fd, struct statvfs *buf); } + SYS_FHSTATVFS = 502 // { int fhstatvfs(const struct fhandle *u_fhp, struct statvfs *buf); } + SYS_GETVFSSTAT = 503 // { int getvfsstat(struct statfs *buf, \ + SYS_OPENAT = 504 // { int openat(int fd, char *path, int flags, int mode); } + SYS_FSTATAT = 505 // { int fstatat(int fd, char *path, \ + SYS_FCHMODAT = 506 // { int fchmodat(int fd, char *path, int mode, \ + SYS_FCHOWNAT = 507 // { int fchownat(int fd, char *path, int uid, int gid, \ + SYS_UNLINKAT = 508 // { int unlinkat(int fd, char *path, int flags); } + SYS_FACCESSAT = 509 // { int faccessat(int fd, char *path, int amode, \ + SYS_MQ_OPEN = 510 // { mqd_t mq_open(const char * name, int oflag, \ + SYS_MQ_CLOSE = 511 // { int mq_close(mqd_t mqdes); } + SYS_MQ_UNLINK = 512 // { int mq_unlink(const char *name); } + SYS_MQ_GETATTR = 513 // { int mq_getattr(mqd_t mqdes, \ + SYS_MQ_SETATTR = 514 // { int mq_setattr(mqd_t mqdes, \ + SYS_MQ_NOTIFY = 515 // { int mq_notify(mqd_t mqdes, \ + SYS_MQ_SEND = 516 // { int mq_send(mqd_t mqdes, const char *msg_ptr, \ + SYS_MQ_RECEIVE = 517 // { ssize_t mq_receive(mqd_t mqdes, char *msg_ptr, \ + SYS_MQ_TIMEDSEND = 518 // { int mq_timedsend(mqd_t mqdes, \ + SYS_MQ_TIMEDRECEIVE = 519 // { ssize_t mq_timedreceive(mqd_t mqdes, \ + SYS_IOPRIO_SET = 520 // { int ioprio_set(int which, int who, int prio); } + SYS_IOPRIO_GET = 521 // { int ioprio_get(int which, int who); } + SYS_CHROOT_KERNEL = 522 // { int chroot_kernel(char *path); } + SYS_RENAMEAT = 523 // { int renameat(int oldfd, char *old, int newfd, \ + SYS_MKDIRAT = 524 // { int mkdirat(int fd, char *path, mode_t mode); } + SYS_MKFIFOAT = 525 // { int mkfifoat(int fd, char *path, mode_t mode); } + SYS_MKNODAT = 526 // { int mknodat(int fd, char *path, mode_t mode, \ + SYS_READLINKAT = 527 // { int readlinkat(int fd, char *path, char *buf, \ + SYS_SYMLINKAT = 528 // { int symlinkat(char *path1, int fd, char *path2); } + SYS_SWAPOFF = 529 // { int swapoff(char *name); } + SYS_VQUOTACTL = 530 // { int vquotactl(const char *path, \ + SYS_LINKAT = 531 // { int linkat(int fd1, char *path1, int fd2, \ + SYS_EACCESS = 532 // { int eaccess(char *path, int flags); } + SYS_LPATHCONF = 533 // { int lpathconf(char *path, int name); } + SYS_VMM_GUEST_CTL = 534 // { int vmm_guest_ctl(int op, struct vmm_guest_options *options); } + SYS_VMM_GUEST_SYNC_ADDR = 535 // { int vmm_guest_sync_addr(long *dstaddr, long *srcaddr); } + SYS_PROCCTL = 536 // { int procctl(idtype_t idtype, id_t id, int cmd, void *data); } + SYS_CHFLAGSAT = 537 // { int chflagsat(int fd, const char *path, int flags, int atflags);} + SYS_PIPE2 = 538 // { int pipe2(int *fildes, int flags); } + SYS_UTIMENSAT = 539 // { int utimensat(int fd, const char *path, const struct timespec *ts, int flags); } + SYS_FUTIMENS = 540 // { int futimens(int fd, const struct timespec *ts); } + SYS_ACCEPT4 = 541 // { int accept4(int s, caddr_t name, int *anamelen, int flags); } + SYS_LWP_SETNAME = 542 // { int lwp_setname(lwpid_t tid, const char *name); } + SYS_PPOLL = 543 // { int ppoll(struct pollfd *fds, u_int nfds, \ + SYS_LWP_SETAFFINITY = 544 // { int lwp_setaffinity(pid_t pid, lwpid_t tid, const cpumask_t *mask); } + SYS_LWP_GETAFFINITY = 545 // { int lwp_getaffinity(pid_t pid, lwpid_t tid, cpumask_t *mask); } + SYS_LWP_CREATE2 = 546 // { int lwp_create2(struct lwp_params *params, const cpumask_t *mask); } +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go new file mode 100644 index 0000000..b64a812 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go @@ -0,0 +1,353 @@ +// mksysnum_freebsd.pl +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,freebsd + +package unix + +const ( + // SYS_NOSYS = 0; // { int nosys(void); } syscall nosys_args int + SYS_EXIT = 1 // { void sys_exit(int rval); } exit \ + SYS_FORK = 2 // { int fork(void); } + SYS_READ = 3 // { ssize_t read(int fd, void *buf, \ + SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, \ + SYS_OPEN = 5 // { int open(char *path, int flags, int mode); } + SYS_CLOSE = 6 // { int close(int fd); } + SYS_WAIT4 = 7 // { int wait4(int pid, int *status, \ + SYS_LINK = 9 // { int link(char *path, char *link); } + SYS_UNLINK = 10 // { int unlink(char *path); } + SYS_CHDIR = 12 // { int chdir(char *path); } + SYS_FCHDIR = 13 // { int fchdir(int fd); } + SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } + SYS_CHMOD = 15 // { int chmod(char *path, int mode); } + SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } + SYS_OBREAK = 17 // { int obreak(char *nsize); } break \ + SYS_GETPID = 20 // { pid_t getpid(void); } + SYS_MOUNT = 21 // { int mount(char *type, char *path, \ + SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } + SYS_SETUID = 23 // { int setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t getuid(void); } + SYS_GETEUID = 25 // { uid_t geteuid(void); } + SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, \ + SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, \ + SYS_SENDMSG = 28 // { int sendmsg(int s, struct msghdr *msg, \ + SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, \ + SYS_ACCEPT = 30 // { int accept(int s, \ + SYS_GETPEERNAME = 31 // { int getpeername(int fdes, \ + SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, \ + SYS_ACCESS = 33 // { int access(char *path, int amode); } + SYS_CHFLAGS = 34 // { int chflags(const char *path, u_long flags); } + SYS_FCHFLAGS = 35 // { int fchflags(int fd, u_long flags); } + SYS_SYNC = 36 // { int sync(void); } + SYS_KILL = 37 // { int kill(int pid, int signum); } + SYS_GETPPID = 39 // { pid_t getppid(void); } + SYS_DUP = 41 // { int dup(u_int fd); } + SYS_PIPE = 42 // { int pipe(void); } + SYS_GETEGID = 43 // { gid_t getegid(void); } + SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, \ + SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, \ + SYS_GETGID = 47 // { gid_t getgid(void); } + SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int \ + SYS_SETLOGIN = 50 // { int setlogin(char *namebuf); } + SYS_ACCT = 51 // { int acct(char *path); } + SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, \ + SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, \ + SYS_REBOOT = 55 // { int reboot(int opt); } + SYS_REVOKE = 56 // { int revoke(char *path); } + SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } + SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, \ + SYS_EXECVE = 59 // { int execve(char *fname, char **argv, \ + SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args \ + SYS_CHROOT = 61 // { int chroot(char *path); } + SYS_MSYNC = 65 // { int msync(void *addr, size_t len, \ + SYS_VFORK = 66 // { int vfork(void); } + SYS_SBRK = 69 // { int sbrk(int incr); } + SYS_SSTK = 70 // { int sstk(int incr); } + SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise \ + SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, \ + SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, \ + SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, \ + SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, \ + SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, \ + SYS_GETPGRP = 81 // { int getpgrp(void); } + SYS_SETPGID = 82 // { int setpgid(int pid, int pgid); } + SYS_SETITIMER = 83 // { int setitimer(u_int which, struct \ + SYS_SWAPON = 85 // { int swapon(char *name); } + SYS_GETITIMER = 86 // { int getitimer(u_int which, \ + SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); } + SYS_DUP2 = 90 // { int dup2(u_int from, u_int to); } + SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); } + SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, \ + SYS_FSYNC = 95 // { int fsync(int fd); } + SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, \ + SYS_SOCKET = 97 // { int socket(int domain, int type, \ + SYS_CONNECT = 98 // { int connect(int s, caddr_t name, \ + SYS_GETPRIORITY = 100 // { int getpriority(int which, int who); } + SYS_BIND = 104 // { int bind(int s, caddr_t name, \ + SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, \ + SYS_LISTEN = 106 // { int listen(int s, int backlog); } + SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, \ + SYS_GETRUSAGE = 117 // { int getrusage(int who, \ + SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, \ + SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, \ + SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, \ + SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, \ + SYS_FCHOWN = 123 // { int fchown(int fd, int uid, int gid); } + SYS_FCHMOD = 124 // { int fchmod(int fd, int mode); } + SYS_SETREUID = 126 // { int setreuid(int ruid, int euid); } + SYS_SETREGID = 127 // { int setregid(int rgid, int egid); } + SYS_RENAME = 128 // { int rename(char *from, char *to); } + SYS_FLOCK = 131 // { int flock(int fd, int how); } + SYS_MKFIFO = 132 // { int mkfifo(char *path, int mode); } + SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, \ + SYS_SHUTDOWN = 134 // { int shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, \ + SYS_MKDIR = 136 // { int mkdir(char *path, int mode); } + SYS_RMDIR = 137 // { int rmdir(char *path); } + SYS_UTIMES = 138 // { int utimes(char *path, \ + SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, \ + SYS_SETSID = 147 // { int setsid(void); } + SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, \ + SYS_LGETFH = 160 // { int lgetfh(char *fname, \ + SYS_GETFH = 161 // { int getfh(char *fname, \ + SYS_SYSARCH = 165 // { int sysarch(int op, char *parms); } + SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, \ + SYS_FREEBSD6_PREAD = 173 // { ssize_t freebsd6_pread(int fd, void *buf, \ + SYS_FREEBSD6_PWRITE = 174 // { ssize_t freebsd6_pwrite(int fd, \ + SYS_SETFIB = 175 // { int setfib(int fibnum); } + SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } + SYS_SETGID = 181 // { int setgid(gid_t gid); } + SYS_SETEGID = 182 // { int setegid(gid_t egid); } + SYS_SETEUID = 183 // { int seteuid(uid_t euid); } + SYS_STAT = 188 // { int stat(char *path, struct stat *ub); } + SYS_FSTAT = 189 // { int fstat(int fd, struct stat *sb); } + SYS_LSTAT = 190 // { int lstat(char *path, struct stat *ub); } + SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } + SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } + SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, \ + SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, \ + SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, \ + SYS_FREEBSD6_MMAP = 197 // { caddr_t freebsd6_mmap(caddr_t addr, \ + SYS_FREEBSD6_LSEEK = 199 // { off_t freebsd6_lseek(int fd, int pad, \ + SYS_FREEBSD6_TRUNCATE = 200 // { int freebsd6_truncate(char *path, int pad, \ + SYS_FREEBSD6_FTRUNCATE = 201 // { int freebsd6_ftruncate(int fd, int pad, \ + SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, \ + SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } + SYS_UNDELETE = 205 // { int undelete(char *path); } + SYS_FUTIMES = 206 // { int futimes(int fd, struct timeval *tptr); } + SYS_GETPGID = 207 // { int getpgid(pid_t pid); } + SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, \ + SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, \ + SYS_CLOCK_SETTIME = 233 // { int clock_settime( \ + SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, \ + SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, \ + SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); } + SYS_KTIMER_SETTIME = 237 // { int ktimer_settime(int timerid, int flags, \ + SYS_KTIMER_GETTIME = 238 // { int ktimer_gettime(int timerid, struct \ + SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); } + SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, \ + SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } + SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( \ + SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( \ + SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,\ + SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } + SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, \ + SYS_RFORK = 251 // { int rfork(int flags); } + SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, \ + SYS_ISSETUGID = 253 // { int issetugid(void); } + SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } + SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, \ + SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } + SYS_LUTIMES = 276 // { int lutimes(char *path, \ + SYS_NSTAT = 278 // { int nstat(char *path, struct nstat *ub); } + SYS_NFSTAT = 279 // { int nfstat(int fd, struct nstat *sb); } + SYS_NLSTAT = 280 // { int nlstat(char *path, struct nstat *ub); } + SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, \ + SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, \ + SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, \ + SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, \ + SYS_MODNEXT = 300 // { int modnext(int modid); } + SYS_MODSTAT = 301 // { int modstat(int modid, \ + SYS_MODFNEXT = 302 // { int modfnext(int modid); } + SYS_MODFIND = 303 // { int modfind(const char *name); } + SYS_KLDLOAD = 304 // { int kldload(const char *file); } + SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } + SYS_KLDFIND = 306 // { int kldfind(const char *file); } + SYS_KLDNEXT = 307 // { int kldnext(int fileid); } + SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct \ + SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } + SYS_GETSID = 310 // { int getsid(pid_t pid); } + SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, \ + SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, \ + SYS_YIELD = 321 // { int yield(void); } + SYS_MLOCKALL = 324 // { int mlockall(int how); } + SYS_MUNLOCKALL = 325 // { int munlockall(void); } + SYS___GETCWD = 326 // { int __getcwd(char *buf, u_int buflen); } + SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, \ + SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct \ + SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int \ + SYS_SCHED_GETSCHEDULER = 330 // { int sched_getscheduler (pid_t pid); } + SYS_SCHED_YIELD = 331 // { int sched_yield (void); } + SYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); } + SYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); } + SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, \ + SYS_UTRACE = 335 // { int utrace(const void *addr, size_t len); } + SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, \ + SYS_JAIL = 338 // { int jail(struct jail *jail); } + SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, \ + SYS_SIGSUSPEND = 341 // { int sigsuspend(const sigset_t *sigmask); } + SYS_SIGPENDING = 343 // { int sigpending(sigset_t *set); } + SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set, \ + SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set, \ + SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, \ + SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, \ + SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, \ + SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, \ + SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, \ + SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, \ + SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, \ + SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, \ + SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, \ + SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( \ + SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( \ + SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, \ + SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, \ + SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, \ + SYS_KQUEUE = 362 // { int kqueue(void); } + SYS_KEVENT = 363 // { int kevent(int fd, \ + SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, \ + SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, \ + SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, \ + SYS___SETUGID = 374 // { int __setugid(int flag); } + SYS_EACCESS = 376 // { int eaccess(char *path, int amode); } + SYS_NMOUNT = 378 // { int nmount(struct iovec *iovp, \ + SYS___MAC_GET_PROC = 384 // { int __mac_get_proc(struct mac *mac_p); } + SYS___MAC_SET_PROC = 385 // { int __mac_set_proc(struct mac *mac_p); } + SYS___MAC_GET_FD = 386 // { int __mac_get_fd(int fd, \ + SYS___MAC_GET_FILE = 387 // { int __mac_get_file(const char *path_p, \ + SYS___MAC_SET_FD = 388 // { int __mac_set_fd(int fd, \ + SYS___MAC_SET_FILE = 389 // { int __mac_set_file(const char *path_p, \ + SYS_KENV = 390 // { int kenv(int what, const char *name, \ + SYS_LCHFLAGS = 391 // { int lchflags(const char *path, \ + SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, \ + SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, \ + SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, \ + SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, \ + SYS_STATFS = 396 // { int statfs(char *path, \ + SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } + SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, \ + SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, \ + SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, \ + SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, \ + SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( \ + SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( \ + SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( \ + SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, \ + SYS_SIGACTION = 416 // { int sigaction(int sig, \ + SYS_SIGRETURN = 417 // { int sigreturn( \ + SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); } + SYS_SETCONTEXT = 422 // { int setcontext( \ + SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, \ + SYS_SWAPOFF = 424 // { int swapoff(const char *name); } + SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, \ + SYS___ACL_SET_LINK = 426 // { int __acl_set_link(const char *path, \ + SYS___ACL_DELETE_LINK = 427 // { int __acl_delete_link(const char *path, \ + SYS___ACL_ACLCHECK_LINK = 428 // { int __acl_aclcheck_link(const char *path, \ + SYS_SIGWAIT = 429 // { int sigwait(const sigset_t *set, \ + SYS_THR_CREATE = 430 // { int thr_create(ucontext_t *ctx, long *id, \ + SYS_THR_EXIT = 431 // { void thr_exit(long *state); } + SYS_THR_SELF = 432 // { int thr_self(long *id); } + SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } + SYS__UMTX_LOCK = 434 // { int _umtx_lock(struct umtx *umtx); } + SYS__UMTX_UNLOCK = 435 // { int _umtx_unlock(struct umtx *umtx); } + SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } + SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, \ + SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( \ + SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( \ + SYS_THR_SUSPEND = 442 // { int thr_suspend( \ + SYS_THR_WAKE = 443 // { int thr_wake(long id); } + SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); } + SYS_AUDIT = 445 // { int audit(const void *record, \ + SYS_AUDITON = 446 // { int auditon(int cmd, void *data, \ + SYS_GETAUID = 447 // { int getauid(uid_t *auid); } + SYS_SETAUID = 448 // { int setauid(uid_t *auid); } + SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); } + SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); } + SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( \ + SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( \ + SYS_AUDITCTL = 453 // { int auditctl(char *path); } + SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, \ + SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, \ + SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); } + SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); } + SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); } + SYS_RTPRIO_THREAD = 466 // { int rtprio_thread(int function, \ + SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, \ + SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, \ + SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, \ + SYS_LSEEK = 478 // { off_t lseek(int fd, off_t offset, \ + SYS_TRUNCATE = 479 // { int truncate(char *path, off_t length); } + SYS_FTRUNCATE = 480 // { int ftruncate(int fd, off_t length); } + SYS_THR_KILL2 = 481 // { int thr_kill2(pid_t pid, long id, int sig); } + SYS_SHM_OPEN = 482 // { int shm_open(const char *path, int flags, \ + SYS_SHM_UNLINK = 483 // { int shm_unlink(const char *path); } + SYS_CPUSET = 484 // { int cpuset(cpusetid_t *setid); } + SYS_CPUSET_SETID = 485 // { int cpuset_setid(cpuwhich_t which, id_t id, \ + SYS_CPUSET_GETID = 486 // { int cpuset_getid(cpulevel_t level, \ + SYS_CPUSET_GETAFFINITY = 487 // { int cpuset_getaffinity(cpulevel_t level, \ + SYS_CPUSET_SETAFFINITY = 488 // { int cpuset_setaffinity(cpulevel_t level, \ + SYS_FACCESSAT = 489 // { int faccessat(int fd, char *path, int amode, \ + SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, \ + SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, \ + SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, \ + SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, \ + SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, \ + SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, \ + SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); } + SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); } + SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, \ + SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, \ + SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, \ + SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, \ + SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, \ + SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); } + SYS_POSIX_OPENPT = 504 // { int posix_openpt(int flags); } + SYS_JAIL_GET = 506 // { int jail_get(struct iovec *iovp, \ + SYS_JAIL_SET = 507 // { int jail_set(struct iovec *iovp, \ + SYS_JAIL_REMOVE = 508 // { int jail_remove(int jid); } + SYS_CLOSEFROM = 509 // { int closefrom(int lowfd); } + SYS_LPATHCONF = 513 // { int lpathconf(char *path, int name); } + SYS___CAP_RIGHTS_GET = 515 // { int __cap_rights_get(int version, \ + SYS_CAP_ENTER = 516 // { int cap_enter(void); } + SYS_CAP_GETMODE = 517 // { int cap_getmode(u_int *modep); } + SYS_PDFORK = 518 // { int pdfork(int *fdp, int flags); } + SYS_PDKILL = 519 // { int pdkill(int fd, int signum); } + SYS_PDGETPID = 520 // { int pdgetpid(int fd, pid_t *pidp); } + SYS_PSELECT = 522 // { int pselect(int nd, fd_set *in, \ + SYS_GETLOGINCLASS = 523 // { int getloginclass(char *namebuf, \ + SYS_SETLOGINCLASS = 524 // { int setloginclass(const char *namebuf); } + SYS_RCTL_GET_RACCT = 525 // { int rctl_get_racct(const void *inbufp, \ + SYS_RCTL_GET_RULES = 526 // { int rctl_get_rules(const void *inbufp, \ + SYS_RCTL_GET_LIMITS = 527 // { int rctl_get_limits(const void *inbufp, \ + SYS_RCTL_ADD_RULE = 528 // { int rctl_add_rule(const void *inbufp, \ + SYS_RCTL_REMOVE_RULE = 529 // { int rctl_remove_rule(const void *inbufp, \ + SYS_POSIX_FALLOCATE = 530 // { int posix_fallocate(int fd, \ + SYS_POSIX_FADVISE = 531 // { int posix_fadvise(int fd, off_t offset, \ + SYS_WAIT6 = 532 // { int wait6(idtype_t idtype, id_t id, \ + SYS_CAP_RIGHTS_LIMIT = 533 // { int cap_rights_limit(int fd, \ + SYS_CAP_IOCTLS_LIMIT = 534 // { int cap_ioctls_limit(int fd, \ + SYS_CAP_IOCTLS_GET = 535 // { ssize_t cap_ioctls_get(int fd, \ + SYS_CAP_FCNTLS_LIMIT = 536 // { int cap_fcntls_limit(int fd, \ + SYS_CAP_FCNTLS_GET = 537 // { int cap_fcntls_get(int fd, \ + SYS_BINDAT = 538 // { int bindat(int fd, int s, caddr_t name, \ + SYS_CONNECTAT = 539 // { int connectat(int fd, int s, caddr_t name, \ + SYS_CHFLAGSAT = 540 // { int chflagsat(int fd, const char *path, \ + SYS_ACCEPT4 = 541 // { int accept4(int s, \ + SYS_PIPE2 = 542 // { int pipe2(int *fildes, int flags); } + SYS_PROCCTL = 544 // { int procctl(idtype_t idtype, id_t id, \ + SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, \ + SYS_FUTIMENS = 546 // { int futimens(int fd, \ + SYS_UTIMENSAT = 547 // { int utimensat(int fd, \ +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go new file mode 100644 index 0000000..81722ac --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go @@ -0,0 +1,353 @@ +// mksysnum_freebsd.pl +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,freebsd + +package unix + +const ( + // SYS_NOSYS = 0; // { int nosys(void); } syscall nosys_args int + SYS_EXIT = 1 // { void sys_exit(int rval); } exit \ + SYS_FORK = 2 // { int fork(void); } + SYS_READ = 3 // { ssize_t read(int fd, void *buf, \ + SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, \ + SYS_OPEN = 5 // { int open(char *path, int flags, int mode); } + SYS_CLOSE = 6 // { int close(int fd); } + SYS_WAIT4 = 7 // { int wait4(int pid, int *status, \ + SYS_LINK = 9 // { int link(char *path, char *link); } + SYS_UNLINK = 10 // { int unlink(char *path); } + SYS_CHDIR = 12 // { int chdir(char *path); } + SYS_FCHDIR = 13 // { int fchdir(int fd); } + SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } + SYS_CHMOD = 15 // { int chmod(char *path, int mode); } + SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } + SYS_OBREAK = 17 // { int obreak(char *nsize); } break \ + SYS_GETPID = 20 // { pid_t getpid(void); } + SYS_MOUNT = 21 // { int mount(char *type, char *path, \ + SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } + SYS_SETUID = 23 // { int setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t getuid(void); } + SYS_GETEUID = 25 // { uid_t geteuid(void); } + SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, \ + SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, \ + SYS_SENDMSG = 28 // { int sendmsg(int s, struct msghdr *msg, \ + SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, \ + SYS_ACCEPT = 30 // { int accept(int s, \ + SYS_GETPEERNAME = 31 // { int getpeername(int fdes, \ + SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, \ + SYS_ACCESS = 33 // { int access(char *path, int amode); } + SYS_CHFLAGS = 34 // { int chflags(const char *path, u_long flags); } + SYS_FCHFLAGS = 35 // { int fchflags(int fd, u_long flags); } + SYS_SYNC = 36 // { int sync(void); } + SYS_KILL = 37 // { int kill(int pid, int signum); } + SYS_GETPPID = 39 // { pid_t getppid(void); } + SYS_DUP = 41 // { int dup(u_int fd); } + SYS_PIPE = 42 // { int pipe(void); } + SYS_GETEGID = 43 // { gid_t getegid(void); } + SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, \ + SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, \ + SYS_GETGID = 47 // { gid_t getgid(void); } + SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int \ + SYS_SETLOGIN = 50 // { int setlogin(char *namebuf); } + SYS_ACCT = 51 // { int acct(char *path); } + SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, \ + SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, \ + SYS_REBOOT = 55 // { int reboot(int opt); } + SYS_REVOKE = 56 // { int revoke(char *path); } + SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } + SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, \ + SYS_EXECVE = 59 // { int execve(char *fname, char **argv, \ + SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args \ + SYS_CHROOT = 61 // { int chroot(char *path); } + SYS_MSYNC = 65 // { int msync(void *addr, size_t len, \ + SYS_VFORK = 66 // { int vfork(void); } + SYS_SBRK = 69 // { int sbrk(int incr); } + SYS_SSTK = 70 // { int sstk(int incr); } + SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise \ + SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, \ + SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, \ + SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, \ + SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, \ + SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, \ + SYS_GETPGRP = 81 // { int getpgrp(void); } + SYS_SETPGID = 82 // { int setpgid(int pid, int pgid); } + SYS_SETITIMER = 83 // { int setitimer(u_int which, struct \ + SYS_SWAPON = 85 // { int swapon(char *name); } + SYS_GETITIMER = 86 // { int getitimer(u_int which, \ + SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); } + SYS_DUP2 = 90 // { int dup2(u_int from, u_int to); } + SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); } + SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, \ + SYS_FSYNC = 95 // { int fsync(int fd); } + SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, \ + SYS_SOCKET = 97 // { int socket(int domain, int type, \ + SYS_CONNECT = 98 // { int connect(int s, caddr_t name, \ + SYS_GETPRIORITY = 100 // { int getpriority(int which, int who); } + SYS_BIND = 104 // { int bind(int s, caddr_t name, \ + SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, \ + SYS_LISTEN = 106 // { int listen(int s, int backlog); } + SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, \ + SYS_GETRUSAGE = 117 // { int getrusage(int who, \ + SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, \ + SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, \ + SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, \ + SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, \ + SYS_FCHOWN = 123 // { int fchown(int fd, int uid, int gid); } + SYS_FCHMOD = 124 // { int fchmod(int fd, int mode); } + SYS_SETREUID = 126 // { int setreuid(int ruid, int euid); } + SYS_SETREGID = 127 // { int setregid(int rgid, int egid); } + SYS_RENAME = 128 // { int rename(char *from, char *to); } + SYS_FLOCK = 131 // { int flock(int fd, int how); } + SYS_MKFIFO = 132 // { int mkfifo(char *path, int mode); } + SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, \ + SYS_SHUTDOWN = 134 // { int shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, \ + SYS_MKDIR = 136 // { int mkdir(char *path, int mode); } + SYS_RMDIR = 137 // { int rmdir(char *path); } + SYS_UTIMES = 138 // { int utimes(char *path, \ + SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, \ + SYS_SETSID = 147 // { int setsid(void); } + SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, \ + SYS_LGETFH = 160 // { int lgetfh(char *fname, \ + SYS_GETFH = 161 // { int getfh(char *fname, \ + SYS_SYSARCH = 165 // { int sysarch(int op, char *parms); } + SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, \ + SYS_FREEBSD6_PREAD = 173 // { ssize_t freebsd6_pread(int fd, void *buf, \ + SYS_FREEBSD6_PWRITE = 174 // { ssize_t freebsd6_pwrite(int fd, \ + SYS_SETFIB = 175 // { int setfib(int fibnum); } + SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } + SYS_SETGID = 181 // { int setgid(gid_t gid); } + SYS_SETEGID = 182 // { int setegid(gid_t egid); } + SYS_SETEUID = 183 // { int seteuid(uid_t euid); } + SYS_STAT = 188 // { int stat(char *path, struct stat *ub); } + SYS_FSTAT = 189 // { int fstat(int fd, struct stat *sb); } + SYS_LSTAT = 190 // { int lstat(char *path, struct stat *ub); } + SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } + SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } + SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, \ + SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, \ + SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, \ + SYS_FREEBSD6_MMAP = 197 // { caddr_t freebsd6_mmap(caddr_t addr, \ + SYS_FREEBSD6_LSEEK = 199 // { off_t freebsd6_lseek(int fd, int pad, \ + SYS_FREEBSD6_TRUNCATE = 200 // { int freebsd6_truncate(char *path, int pad, \ + SYS_FREEBSD6_FTRUNCATE = 201 // { int freebsd6_ftruncate(int fd, int pad, \ + SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, \ + SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } + SYS_UNDELETE = 205 // { int undelete(char *path); } + SYS_FUTIMES = 206 // { int futimes(int fd, struct timeval *tptr); } + SYS_GETPGID = 207 // { int getpgid(pid_t pid); } + SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, \ + SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, \ + SYS_CLOCK_SETTIME = 233 // { int clock_settime( \ + SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, \ + SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, \ + SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); } + SYS_KTIMER_SETTIME = 237 // { int ktimer_settime(int timerid, int flags, \ + SYS_KTIMER_GETTIME = 238 // { int ktimer_gettime(int timerid, struct \ + SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); } + SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, \ + SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } + SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( \ + SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( \ + SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,\ + SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } + SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, \ + SYS_RFORK = 251 // { int rfork(int flags); } + SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, \ + SYS_ISSETUGID = 253 // { int issetugid(void); } + SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } + SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, \ + SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } + SYS_LUTIMES = 276 // { int lutimes(char *path, \ + SYS_NSTAT = 278 // { int nstat(char *path, struct nstat *ub); } + SYS_NFSTAT = 279 // { int nfstat(int fd, struct nstat *sb); } + SYS_NLSTAT = 280 // { int nlstat(char *path, struct nstat *ub); } + SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, \ + SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, \ + SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, \ + SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, \ + SYS_MODNEXT = 300 // { int modnext(int modid); } + SYS_MODSTAT = 301 // { int modstat(int modid, \ + SYS_MODFNEXT = 302 // { int modfnext(int modid); } + SYS_MODFIND = 303 // { int modfind(const char *name); } + SYS_KLDLOAD = 304 // { int kldload(const char *file); } + SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } + SYS_KLDFIND = 306 // { int kldfind(const char *file); } + SYS_KLDNEXT = 307 // { int kldnext(int fileid); } + SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct \ + SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } + SYS_GETSID = 310 // { int getsid(pid_t pid); } + SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, \ + SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, \ + SYS_YIELD = 321 // { int yield(void); } + SYS_MLOCKALL = 324 // { int mlockall(int how); } + SYS_MUNLOCKALL = 325 // { int munlockall(void); } + SYS___GETCWD = 326 // { int __getcwd(char *buf, u_int buflen); } + SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, \ + SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct \ + SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int \ + SYS_SCHED_GETSCHEDULER = 330 // { int sched_getscheduler (pid_t pid); } + SYS_SCHED_YIELD = 331 // { int sched_yield (void); } + SYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); } + SYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); } + SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, \ + SYS_UTRACE = 335 // { int utrace(const void *addr, size_t len); } + SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, \ + SYS_JAIL = 338 // { int jail(struct jail *jail); } + SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, \ + SYS_SIGSUSPEND = 341 // { int sigsuspend(const sigset_t *sigmask); } + SYS_SIGPENDING = 343 // { int sigpending(sigset_t *set); } + SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set, \ + SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set, \ + SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, \ + SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, \ + SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, \ + SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, \ + SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, \ + SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, \ + SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, \ + SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, \ + SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, \ + SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( \ + SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( \ + SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, \ + SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, \ + SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, \ + SYS_KQUEUE = 362 // { int kqueue(void); } + SYS_KEVENT = 363 // { int kevent(int fd, \ + SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, \ + SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, \ + SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, \ + SYS___SETUGID = 374 // { int __setugid(int flag); } + SYS_EACCESS = 376 // { int eaccess(char *path, int amode); } + SYS_NMOUNT = 378 // { int nmount(struct iovec *iovp, \ + SYS___MAC_GET_PROC = 384 // { int __mac_get_proc(struct mac *mac_p); } + SYS___MAC_SET_PROC = 385 // { int __mac_set_proc(struct mac *mac_p); } + SYS___MAC_GET_FD = 386 // { int __mac_get_fd(int fd, \ + SYS___MAC_GET_FILE = 387 // { int __mac_get_file(const char *path_p, \ + SYS___MAC_SET_FD = 388 // { int __mac_set_fd(int fd, \ + SYS___MAC_SET_FILE = 389 // { int __mac_set_file(const char *path_p, \ + SYS_KENV = 390 // { int kenv(int what, const char *name, \ + SYS_LCHFLAGS = 391 // { int lchflags(const char *path, \ + SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, \ + SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, \ + SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, \ + SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, \ + SYS_STATFS = 396 // { int statfs(char *path, \ + SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } + SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, \ + SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, \ + SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, \ + SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, \ + SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( \ + SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( \ + SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( \ + SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, \ + SYS_SIGACTION = 416 // { int sigaction(int sig, \ + SYS_SIGRETURN = 417 // { int sigreturn( \ + SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); } + SYS_SETCONTEXT = 422 // { int setcontext( \ + SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, \ + SYS_SWAPOFF = 424 // { int swapoff(const char *name); } + SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, \ + SYS___ACL_SET_LINK = 426 // { int __acl_set_link(const char *path, \ + SYS___ACL_DELETE_LINK = 427 // { int __acl_delete_link(const char *path, \ + SYS___ACL_ACLCHECK_LINK = 428 // { int __acl_aclcheck_link(const char *path, \ + SYS_SIGWAIT = 429 // { int sigwait(const sigset_t *set, \ + SYS_THR_CREATE = 430 // { int thr_create(ucontext_t *ctx, long *id, \ + SYS_THR_EXIT = 431 // { void thr_exit(long *state); } + SYS_THR_SELF = 432 // { int thr_self(long *id); } + SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } + SYS__UMTX_LOCK = 434 // { int _umtx_lock(struct umtx *umtx); } + SYS__UMTX_UNLOCK = 435 // { int _umtx_unlock(struct umtx *umtx); } + SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } + SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, \ + SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( \ + SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( \ + SYS_THR_SUSPEND = 442 // { int thr_suspend( \ + SYS_THR_WAKE = 443 // { int thr_wake(long id); } + SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); } + SYS_AUDIT = 445 // { int audit(const void *record, \ + SYS_AUDITON = 446 // { int auditon(int cmd, void *data, \ + SYS_GETAUID = 447 // { int getauid(uid_t *auid); } + SYS_SETAUID = 448 // { int setauid(uid_t *auid); } + SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); } + SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); } + SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( \ + SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( \ + SYS_AUDITCTL = 453 // { int auditctl(char *path); } + SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, \ + SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, \ + SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); } + SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); } + SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); } + SYS_RTPRIO_THREAD = 466 // { int rtprio_thread(int function, \ + SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, \ + SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, \ + SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, \ + SYS_LSEEK = 478 // { off_t lseek(int fd, off_t offset, \ + SYS_TRUNCATE = 479 // { int truncate(char *path, off_t length); } + SYS_FTRUNCATE = 480 // { int ftruncate(int fd, off_t length); } + SYS_THR_KILL2 = 481 // { int thr_kill2(pid_t pid, long id, int sig); } + SYS_SHM_OPEN = 482 // { int shm_open(const char *path, int flags, \ + SYS_SHM_UNLINK = 483 // { int shm_unlink(const char *path); } + SYS_CPUSET = 484 // { int cpuset(cpusetid_t *setid); } + SYS_CPUSET_SETID = 485 // { int cpuset_setid(cpuwhich_t which, id_t id, \ + SYS_CPUSET_GETID = 486 // { int cpuset_getid(cpulevel_t level, \ + SYS_CPUSET_GETAFFINITY = 487 // { int cpuset_getaffinity(cpulevel_t level, \ + SYS_CPUSET_SETAFFINITY = 488 // { int cpuset_setaffinity(cpulevel_t level, \ + SYS_FACCESSAT = 489 // { int faccessat(int fd, char *path, int amode, \ + SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, \ + SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, \ + SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, \ + SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, \ + SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, \ + SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, \ + SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); } + SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); } + SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, \ + SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, \ + SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, \ + SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, \ + SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, \ + SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); } + SYS_POSIX_OPENPT = 504 // { int posix_openpt(int flags); } + SYS_JAIL_GET = 506 // { int jail_get(struct iovec *iovp, \ + SYS_JAIL_SET = 507 // { int jail_set(struct iovec *iovp, \ + SYS_JAIL_REMOVE = 508 // { int jail_remove(int jid); } + SYS_CLOSEFROM = 509 // { int closefrom(int lowfd); } + SYS_LPATHCONF = 513 // { int lpathconf(char *path, int name); } + SYS___CAP_RIGHTS_GET = 515 // { int __cap_rights_get(int version, \ + SYS_CAP_ENTER = 516 // { int cap_enter(void); } + SYS_CAP_GETMODE = 517 // { int cap_getmode(u_int *modep); } + SYS_PDFORK = 518 // { int pdfork(int *fdp, int flags); } + SYS_PDKILL = 519 // { int pdkill(int fd, int signum); } + SYS_PDGETPID = 520 // { int pdgetpid(int fd, pid_t *pidp); } + SYS_PSELECT = 522 // { int pselect(int nd, fd_set *in, \ + SYS_GETLOGINCLASS = 523 // { int getloginclass(char *namebuf, \ + SYS_SETLOGINCLASS = 524 // { int setloginclass(const char *namebuf); } + SYS_RCTL_GET_RACCT = 525 // { int rctl_get_racct(const void *inbufp, \ + SYS_RCTL_GET_RULES = 526 // { int rctl_get_rules(const void *inbufp, \ + SYS_RCTL_GET_LIMITS = 527 // { int rctl_get_limits(const void *inbufp, \ + SYS_RCTL_ADD_RULE = 528 // { int rctl_add_rule(const void *inbufp, \ + SYS_RCTL_REMOVE_RULE = 529 // { int rctl_remove_rule(const void *inbufp, \ + SYS_POSIX_FALLOCATE = 530 // { int posix_fallocate(int fd, \ + SYS_POSIX_FADVISE = 531 // { int posix_fadvise(int fd, off_t offset, \ + SYS_WAIT6 = 532 // { int wait6(idtype_t idtype, id_t id, \ + SYS_CAP_RIGHTS_LIMIT = 533 // { int cap_rights_limit(int fd, \ + SYS_CAP_IOCTLS_LIMIT = 534 // { int cap_ioctls_limit(int fd, \ + SYS_CAP_IOCTLS_GET = 535 // { ssize_t cap_ioctls_get(int fd, \ + SYS_CAP_FCNTLS_LIMIT = 536 // { int cap_fcntls_limit(int fd, \ + SYS_CAP_FCNTLS_GET = 537 // { int cap_fcntls_get(int fd, \ + SYS_BINDAT = 538 // { int bindat(int fd, int s, caddr_t name, \ + SYS_CONNECTAT = 539 // { int connectat(int fd, int s, caddr_t name, \ + SYS_CHFLAGSAT = 540 // { int chflagsat(int fd, const char *path, \ + SYS_ACCEPT4 = 541 // { int accept4(int s, \ + SYS_PIPE2 = 542 // { int pipe2(int *fildes, int flags); } + SYS_PROCCTL = 544 // { int procctl(idtype_t idtype, id_t id, \ + SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, \ + SYS_FUTIMENS = 546 // { int futimens(int fd, \ + SYS_UTIMENSAT = 547 // { int utimensat(int fd, \ +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go new file mode 100644 index 0000000..4488314 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go @@ -0,0 +1,353 @@ +// mksysnum_freebsd.pl +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,freebsd + +package unix + +const ( + // SYS_NOSYS = 0; // { int nosys(void); } syscall nosys_args int + SYS_EXIT = 1 // { void sys_exit(int rval); } exit \ + SYS_FORK = 2 // { int fork(void); } + SYS_READ = 3 // { ssize_t read(int fd, void *buf, \ + SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, \ + SYS_OPEN = 5 // { int open(char *path, int flags, int mode); } + SYS_CLOSE = 6 // { int close(int fd); } + SYS_WAIT4 = 7 // { int wait4(int pid, int *status, \ + SYS_LINK = 9 // { int link(char *path, char *link); } + SYS_UNLINK = 10 // { int unlink(char *path); } + SYS_CHDIR = 12 // { int chdir(char *path); } + SYS_FCHDIR = 13 // { int fchdir(int fd); } + SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } + SYS_CHMOD = 15 // { int chmod(char *path, int mode); } + SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } + SYS_OBREAK = 17 // { int obreak(char *nsize); } break \ + SYS_GETPID = 20 // { pid_t getpid(void); } + SYS_MOUNT = 21 // { int mount(char *type, char *path, \ + SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } + SYS_SETUID = 23 // { int setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t getuid(void); } + SYS_GETEUID = 25 // { uid_t geteuid(void); } + SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, \ + SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, \ + SYS_SENDMSG = 28 // { int sendmsg(int s, struct msghdr *msg, \ + SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, \ + SYS_ACCEPT = 30 // { int accept(int s, \ + SYS_GETPEERNAME = 31 // { int getpeername(int fdes, \ + SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, \ + SYS_ACCESS = 33 // { int access(char *path, int amode); } + SYS_CHFLAGS = 34 // { int chflags(const char *path, u_long flags); } + SYS_FCHFLAGS = 35 // { int fchflags(int fd, u_long flags); } + SYS_SYNC = 36 // { int sync(void); } + SYS_KILL = 37 // { int kill(int pid, int signum); } + SYS_GETPPID = 39 // { pid_t getppid(void); } + SYS_DUP = 41 // { int dup(u_int fd); } + SYS_PIPE = 42 // { int pipe(void); } + SYS_GETEGID = 43 // { gid_t getegid(void); } + SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, \ + SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, \ + SYS_GETGID = 47 // { gid_t getgid(void); } + SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int \ + SYS_SETLOGIN = 50 // { int setlogin(char *namebuf); } + SYS_ACCT = 51 // { int acct(char *path); } + SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, \ + SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, \ + SYS_REBOOT = 55 // { int reboot(int opt); } + SYS_REVOKE = 56 // { int revoke(char *path); } + SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } + SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, \ + SYS_EXECVE = 59 // { int execve(char *fname, char **argv, \ + SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args \ + SYS_CHROOT = 61 // { int chroot(char *path); } + SYS_MSYNC = 65 // { int msync(void *addr, size_t len, \ + SYS_VFORK = 66 // { int vfork(void); } + SYS_SBRK = 69 // { int sbrk(int incr); } + SYS_SSTK = 70 // { int sstk(int incr); } + SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise \ + SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, \ + SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, \ + SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, \ + SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, \ + SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, \ + SYS_GETPGRP = 81 // { int getpgrp(void); } + SYS_SETPGID = 82 // { int setpgid(int pid, int pgid); } + SYS_SETITIMER = 83 // { int setitimer(u_int which, struct \ + SYS_SWAPON = 85 // { int swapon(char *name); } + SYS_GETITIMER = 86 // { int getitimer(u_int which, \ + SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); } + SYS_DUP2 = 90 // { int dup2(u_int from, u_int to); } + SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); } + SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, \ + SYS_FSYNC = 95 // { int fsync(int fd); } + SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, \ + SYS_SOCKET = 97 // { int socket(int domain, int type, \ + SYS_CONNECT = 98 // { int connect(int s, caddr_t name, \ + SYS_GETPRIORITY = 100 // { int getpriority(int which, int who); } + SYS_BIND = 104 // { int bind(int s, caddr_t name, \ + SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, \ + SYS_LISTEN = 106 // { int listen(int s, int backlog); } + SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, \ + SYS_GETRUSAGE = 117 // { int getrusage(int who, \ + SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, \ + SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, \ + SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, \ + SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, \ + SYS_FCHOWN = 123 // { int fchown(int fd, int uid, int gid); } + SYS_FCHMOD = 124 // { int fchmod(int fd, int mode); } + SYS_SETREUID = 126 // { int setreuid(int ruid, int euid); } + SYS_SETREGID = 127 // { int setregid(int rgid, int egid); } + SYS_RENAME = 128 // { int rename(char *from, char *to); } + SYS_FLOCK = 131 // { int flock(int fd, int how); } + SYS_MKFIFO = 132 // { int mkfifo(char *path, int mode); } + SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, \ + SYS_SHUTDOWN = 134 // { int shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, \ + SYS_MKDIR = 136 // { int mkdir(char *path, int mode); } + SYS_RMDIR = 137 // { int rmdir(char *path); } + SYS_UTIMES = 138 // { int utimes(char *path, \ + SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, \ + SYS_SETSID = 147 // { int setsid(void); } + SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, \ + SYS_LGETFH = 160 // { int lgetfh(char *fname, \ + SYS_GETFH = 161 // { int getfh(char *fname, \ + SYS_SYSARCH = 165 // { int sysarch(int op, char *parms); } + SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, \ + SYS_FREEBSD6_PREAD = 173 // { ssize_t freebsd6_pread(int fd, void *buf, \ + SYS_FREEBSD6_PWRITE = 174 // { ssize_t freebsd6_pwrite(int fd, \ + SYS_SETFIB = 175 // { int setfib(int fibnum); } + SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } + SYS_SETGID = 181 // { int setgid(gid_t gid); } + SYS_SETEGID = 182 // { int setegid(gid_t egid); } + SYS_SETEUID = 183 // { int seteuid(uid_t euid); } + SYS_STAT = 188 // { int stat(char *path, struct stat *ub); } + SYS_FSTAT = 189 // { int fstat(int fd, struct stat *sb); } + SYS_LSTAT = 190 // { int lstat(char *path, struct stat *ub); } + SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } + SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } + SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, \ + SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, \ + SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, \ + SYS_FREEBSD6_MMAP = 197 // { caddr_t freebsd6_mmap(caddr_t addr, \ + SYS_FREEBSD6_LSEEK = 199 // { off_t freebsd6_lseek(int fd, int pad, \ + SYS_FREEBSD6_TRUNCATE = 200 // { int freebsd6_truncate(char *path, int pad, \ + SYS_FREEBSD6_FTRUNCATE = 201 // { int freebsd6_ftruncate(int fd, int pad, \ + SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, \ + SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } + SYS_UNDELETE = 205 // { int undelete(char *path); } + SYS_FUTIMES = 206 // { int futimes(int fd, struct timeval *tptr); } + SYS_GETPGID = 207 // { int getpgid(pid_t pid); } + SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, \ + SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, \ + SYS_CLOCK_SETTIME = 233 // { int clock_settime( \ + SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, \ + SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, \ + SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); } + SYS_KTIMER_SETTIME = 237 // { int ktimer_settime(int timerid, int flags, \ + SYS_KTIMER_GETTIME = 238 // { int ktimer_gettime(int timerid, struct \ + SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); } + SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, \ + SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } + SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( \ + SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( \ + SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,\ + SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } + SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, \ + SYS_RFORK = 251 // { int rfork(int flags); } + SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, \ + SYS_ISSETUGID = 253 // { int issetugid(void); } + SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } + SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, \ + SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } + SYS_LUTIMES = 276 // { int lutimes(char *path, \ + SYS_NSTAT = 278 // { int nstat(char *path, struct nstat *ub); } + SYS_NFSTAT = 279 // { int nfstat(int fd, struct nstat *sb); } + SYS_NLSTAT = 280 // { int nlstat(char *path, struct nstat *ub); } + SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, \ + SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, \ + SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, \ + SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, \ + SYS_MODNEXT = 300 // { int modnext(int modid); } + SYS_MODSTAT = 301 // { int modstat(int modid, \ + SYS_MODFNEXT = 302 // { int modfnext(int modid); } + SYS_MODFIND = 303 // { int modfind(const char *name); } + SYS_KLDLOAD = 304 // { int kldload(const char *file); } + SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } + SYS_KLDFIND = 306 // { int kldfind(const char *file); } + SYS_KLDNEXT = 307 // { int kldnext(int fileid); } + SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct \ + SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } + SYS_GETSID = 310 // { int getsid(pid_t pid); } + SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, \ + SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, \ + SYS_YIELD = 321 // { int yield(void); } + SYS_MLOCKALL = 324 // { int mlockall(int how); } + SYS_MUNLOCKALL = 325 // { int munlockall(void); } + SYS___GETCWD = 326 // { int __getcwd(char *buf, u_int buflen); } + SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, \ + SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct \ + SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int \ + SYS_SCHED_GETSCHEDULER = 330 // { int sched_getscheduler (pid_t pid); } + SYS_SCHED_YIELD = 331 // { int sched_yield (void); } + SYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); } + SYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); } + SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, \ + SYS_UTRACE = 335 // { int utrace(const void *addr, size_t len); } + SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, \ + SYS_JAIL = 338 // { int jail(struct jail *jail); } + SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, \ + SYS_SIGSUSPEND = 341 // { int sigsuspend(const sigset_t *sigmask); } + SYS_SIGPENDING = 343 // { int sigpending(sigset_t *set); } + SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set, \ + SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set, \ + SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, \ + SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, \ + SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, \ + SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, \ + SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, \ + SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, \ + SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, \ + SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, \ + SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, \ + SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( \ + SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( \ + SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, \ + SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, \ + SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, \ + SYS_KQUEUE = 362 // { int kqueue(void); } + SYS_KEVENT = 363 // { int kevent(int fd, \ + SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, \ + SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, \ + SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, \ + SYS___SETUGID = 374 // { int __setugid(int flag); } + SYS_EACCESS = 376 // { int eaccess(char *path, int amode); } + SYS_NMOUNT = 378 // { int nmount(struct iovec *iovp, \ + SYS___MAC_GET_PROC = 384 // { int __mac_get_proc(struct mac *mac_p); } + SYS___MAC_SET_PROC = 385 // { int __mac_set_proc(struct mac *mac_p); } + SYS___MAC_GET_FD = 386 // { int __mac_get_fd(int fd, \ + SYS___MAC_GET_FILE = 387 // { int __mac_get_file(const char *path_p, \ + SYS___MAC_SET_FD = 388 // { int __mac_set_fd(int fd, \ + SYS___MAC_SET_FILE = 389 // { int __mac_set_file(const char *path_p, \ + SYS_KENV = 390 // { int kenv(int what, const char *name, \ + SYS_LCHFLAGS = 391 // { int lchflags(const char *path, \ + SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, \ + SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, \ + SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, \ + SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, \ + SYS_STATFS = 396 // { int statfs(char *path, \ + SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } + SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, \ + SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, \ + SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, \ + SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, \ + SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( \ + SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( \ + SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( \ + SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, \ + SYS_SIGACTION = 416 // { int sigaction(int sig, \ + SYS_SIGRETURN = 417 // { int sigreturn( \ + SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); } + SYS_SETCONTEXT = 422 // { int setcontext( \ + SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, \ + SYS_SWAPOFF = 424 // { int swapoff(const char *name); } + SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, \ + SYS___ACL_SET_LINK = 426 // { int __acl_set_link(const char *path, \ + SYS___ACL_DELETE_LINK = 427 // { int __acl_delete_link(const char *path, \ + SYS___ACL_ACLCHECK_LINK = 428 // { int __acl_aclcheck_link(const char *path, \ + SYS_SIGWAIT = 429 // { int sigwait(const sigset_t *set, \ + SYS_THR_CREATE = 430 // { int thr_create(ucontext_t *ctx, long *id, \ + SYS_THR_EXIT = 431 // { void thr_exit(long *state); } + SYS_THR_SELF = 432 // { int thr_self(long *id); } + SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } + SYS__UMTX_LOCK = 434 // { int _umtx_lock(struct umtx *umtx); } + SYS__UMTX_UNLOCK = 435 // { int _umtx_unlock(struct umtx *umtx); } + SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } + SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, \ + SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( \ + SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( \ + SYS_THR_SUSPEND = 442 // { int thr_suspend( \ + SYS_THR_WAKE = 443 // { int thr_wake(long id); } + SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); } + SYS_AUDIT = 445 // { int audit(const void *record, \ + SYS_AUDITON = 446 // { int auditon(int cmd, void *data, \ + SYS_GETAUID = 447 // { int getauid(uid_t *auid); } + SYS_SETAUID = 448 // { int setauid(uid_t *auid); } + SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); } + SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); } + SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( \ + SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( \ + SYS_AUDITCTL = 453 // { int auditctl(char *path); } + SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, \ + SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, \ + SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); } + SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); } + SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); } + SYS_RTPRIO_THREAD = 466 // { int rtprio_thread(int function, \ + SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, \ + SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, \ + SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, \ + SYS_LSEEK = 478 // { off_t lseek(int fd, off_t offset, \ + SYS_TRUNCATE = 479 // { int truncate(char *path, off_t length); } + SYS_FTRUNCATE = 480 // { int ftruncate(int fd, off_t length); } + SYS_THR_KILL2 = 481 // { int thr_kill2(pid_t pid, long id, int sig); } + SYS_SHM_OPEN = 482 // { int shm_open(const char *path, int flags, \ + SYS_SHM_UNLINK = 483 // { int shm_unlink(const char *path); } + SYS_CPUSET = 484 // { int cpuset(cpusetid_t *setid); } + SYS_CPUSET_SETID = 485 // { int cpuset_setid(cpuwhich_t which, id_t id, \ + SYS_CPUSET_GETID = 486 // { int cpuset_getid(cpulevel_t level, \ + SYS_CPUSET_GETAFFINITY = 487 // { int cpuset_getaffinity(cpulevel_t level, \ + SYS_CPUSET_SETAFFINITY = 488 // { int cpuset_setaffinity(cpulevel_t level, \ + SYS_FACCESSAT = 489 // { int faccessat(int fd, char *path, int amode, \ + SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, \ + SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, \ + SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, \ + SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, \ + SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, \ + SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, \ + SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); } + SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); } + SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, \ + SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, \ + SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, \ + SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, \ + SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, \ + SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); } + SYS_POSIX_OPENPT = 504 // { int posix_openpt(int flags); } + SYS_JAIL_GET = 506 // { int jail_get(struct iovec *iovp, \ + SYS_JAIL_SET = 507 // { int jail_set(struct iovec *iovp, \ + SYS_JAIL_REMOVE = 508 // { int jail_remove(int jid); } + SYS_CLOSEFROM = 509 // { int closefrom(int lowfd); } + SYS_LPATHCONF = 513 // { int lpathconf(char *path, int name); } + SYS___CAP_RIGHTS_GET = 515 // { int __cap_rights_get(int version, \ + SYS_CAP_ENTER = 516 // { int cap_enter(void); } + SYS_CAP_GETMODE = 517 // { int cap_getmode(u_int *modep); } + SYS_PDFORK = 518 // { int pdfork(int *fdp, int flags); } + SYS_PDKILL = 519 // { int pdkill(int fd, int signum); } + SYS_PDGETPID = 520 // { int pdgetpid(int fd, pid_t *pidp); } + SYS_PSELECT = 522 // { int pselect(int nd, fd_set *in, \ + SYS_GETLOGINCLASS = 523 // { int getloginclass(char *namebuf, \ + SYS_SETLOGINCLASS = 524 // { int setloginclass(const char *namebuf); } + SYS_RCTL_GET_RACCT = 525 // { int rctl_get_racct(const void *inbufp, \ + SYS_RCTL_GET_RULES = 526 // { int rctl_get_rules(const void *inbufp, \ + SYS_RCTL_GET_LIMITS = 527 // { int rctl_get_limits(const void *inbufp, \ + SYS_RCTL_ADD_RULE = 528 // { int rctl_add_rule(const void *inbufp, \ + SYS_RCTL_REMOVE_RULE = 529 // { int rctl_remove_rule(const void *inbufp, \ + SYS_POSIX_FALLOCATE = 530 // { int posix_fallocate(int fd, \ + SYS_POSIX_FADVISE = 531 // { int posix_fadvise(int fd, off_t offset, \ + SYS_WAIT6 = 532 // { int wait6(idtype_t idtype, id_t id, \ + SYS_CAP_RIGHTS_LIMIT = 533 // { int cap_rights_limit(int fd, \ + SYS_CAP_IOCTLS_LIMIT = 534 // { int cap_ioctls_limit(int fd, \ + SYS_CAP_IOCTLS_GET = 535 // { ssize_t cap_ioctls_get(int fd, \ + SYS_CAP_FCNTLS_LIMIT = 536 // { int cap_fcntls_limit(int fd, \ + SYS_CAP_FCNTLS_GET = 537 // { int cap_fcntls_get(int fd, \ + SYS_BINDAT = 538 // { int bindat(int fd, int s, caddr_t name, \ + SYS_CONNECTAT = 539 // { int connectat(int fd, int s, caddr_t name, \ + SYS_CHFLAGSAT = 540 // { int chflagsat(int fd, const char *path, \ + SYS_ACCEPT4 = 541 // { int accept4(int s, \ + SYS_PIPE2 = 542 // { int pipe2(int *fildes, int flags); } + SYS_PROCCTL = 544 // { int procctl(idtype_t idtype, id_t id, \ + SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, \ + SYS_FUTIMENS = 546 // { int futimens(int fd, \ + SYS_UTIMENSAT = 547 // { int utimensat(int fd, \ +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go new file mode 100644 index 0000000..95ab129 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go @@ -0,0 +1,390 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include -m32 /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,linux + +package unix + +const ( + SYS_RESTART_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_WAITPID = 7 + SYS_CREAT = 8 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_EXECVE = 11 + SYS_CHDIR = 12 + SYS_TIME = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_LCHOWN = 16 + SYS_BREAK = 17 + SYS_OLDSTAT = 18 + SYS_LSEEK = 19 + SYS_GETPID = 20 + SYS_MOUNT = 21 + SYS_UMOUNT = 22 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_STIME = 25 + SYS_PTRACE = 26 + SYS_ALARM = 27 + SYS_OLDFSTAT = 28 + SYS_PAUSE = 29 + SYS_UTIME = 30 + SYS_STTY = 31 + SYS_GTTY = 32 + SYS_ACCESS = 33 + SYS_NICE = 34 + SYS_FTIME = 35 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_RENAME = 38 + SYS_MKDIR = 39 + SYS_RMDIR = 40 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_TIMES = 43 + SYS_PROF = 44 + SYS_BRK = 45 + SYS_SETGID = 46 + SYS_GETGID = 47 + SYS_SIGNAL = 48 + SYS_GETEUID = 49 + SYS_GETEGID = 50 + SYS_ACCT = 51 + SYS_UMOUNT2 = 52 + SYS_LOCK = 53 + SYS_IOCTL = 54 + SYS_FCNTL = 55 + SYS_MPX = 56 + SYS_SETPGID = 57 + SYS_ULIMIT = 58 + SYS_OLDOLDUNAME = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_USTAT = 62 + SYS_DUP2 = 63 + SYS_GETPPID = 64 + SYS_GETPGRP = 65 + SYS_SETSID = 66 + SYS_SIGACTION = 67 + SYS_SGETMASK = 68 + SYS_SSETMASK = 69 + SYS_SETREUID = 70 + SYS_SETREGID = 71 + SYS_SIGSUSPEND = 72 + SYS_SIGPENDING = 73 + SYS_SETHOSTNAME = 74 + SYS_SETRLIMIT = 75 + SYS_GETRLIMIT = 76 + SYS_GETRUSAGE = 77 + SYS_GETTIMEOFDAY = 78 + SYS_SETTIMEOFDAY = 79 + SYS_GETGROUPS = 80 + SYS_SETGROUPS = 81 + SYS_SELECT = 82 + SYS_SYMLINK = 83 + SYS_OLDLSTAT = 84 + SYS_READLINK = 85 + SYS_USELIB = 86 + SYS_SWAPON = 87 + SYS_REBOOT = 88 + SYS_READDIR = 89 + SYS_MMAP = 90 + SYS_MUNMAP = 91 + SYS_TRUNCATE = 92 + SYS_FTRUNCATE = 93 + SYS_FCHMOD = 94 + SYS_FCHOWN = 95 + SYS_GETPRIORITY = 96 + SYS_SETPRIORITY = 97 + SYS_PROFIL = 98 + SYS_STATFS = 99 + SYS_FSTATFS = 100 + SYS_IOPERM = 101 + SYS_SOCKETCALL = 102 + SYS_SYSLOG = 103 + SYS_SETITIMER = 104 + SYS_GETITIMER = 105 + SYS_STAT = 106 + SYS_LSTAT = 107 + SYS_FSTAT = 108 + SYS_OLDUNAME = 109 + SYS_IOPL = 110 + SYS_VHANGUP = 111 + SYS_IDLE = 112 + SYS_VM86OLD = 113 + SYS_WAIT4 = 114 + SYS_SWAPOFF = 115 + SYS_SYSINFO = 116 + SYS_IPC = 117 + SYS_FSYNC = 118 + SYS_SIGRETURN = 119 + SYS_CLONE = 120 + SYS_SETDOMAINNAME = 121 + SYS_UNAME = 122 + SYS_MODIFY_LDT = 123 + SYS_ADJTIMEX = 124 + SYS_MPROTECT = 125 + SYS_SIGPROCMASK = 126 + SYS_CREATE_MODULE = 127 + SYS_INIT_MODULE = 128 + SYS_DELETE_MODULE = 129 + SYS_GET_KERNEL_SYMS = 130 + SYS_QUOTACTL = 131 + SYS_GETPGID = 132 + SYS_FCHDIR = 133 + SYS_BDFLUSH = 134 + SYS_SYSFS = 135 + SYS_PERSONALITY = 136 + SYS_AFS_SYSCALL = 137 + SYS_SETFSUID = 138 + SYS_SETFSGID = 139 + SYS__LLSEEK = 140 + SYS_GETDENTS = 141 + SYS__NEWSELECT = 142 + SYS_FLOCK = 143 + SYS_MSYNC = 144 + SYS_READV = 145 + SYS_WRITEV = 146 + SYS_GETSID = 147 + SYS_FDATASYNC = 148 + SYS__SYSCTL = 149 + SYS_MLOCK = 150 + SYS_MUNLOCK = 151 + SYS_MLOCKALL = 152 + SYS_MUNLOCKALL = 153 + SYS_SCHED_SETPARAM = 154 + SYS_SCHED_GETPARAM = 155 + SYS_SCHED_SETSCHEDULER = 156 + SYS_SCHED_GETSCHEDULER = 157 + SYS_SCHED_YIELD = 158 + SYS_SCHED_GET_PRIORITY_MAX = 159 + SYS_SCHED_GET_PRIORITY_MIN = 160 + SYS_SCHED_RR_GET_INTERVAL = 161 + SYS_NANOSLEEP = 162 + SYS_MREMAP = 163 + SYS_SETRESUID = 164 + SYS_GETRESUID = 165 + SYS_VM86 = 166 + SYS_QUERY_MODULE = 167 + SYS_POLL = 168 + SYS_NFSSERVCTL = 169 + SYS_SETRESGID = 170 + SYS_GETRESGID = 171 + SYS_PRCTL = 172 + SYS_RT_SIGRETURN = 173 + SYS_RT_SIGACTION = 174 + SYS_RT_SIGPROCMASK = 175 + SYS_RT_SIGPENDING = 176 + SYS_RT_SIGTIMEDWAIT = 177 + SYS_RT_SIGQUEUEINFO = 178 + SYS_RT_SIGSUSPEND = 179 + SYS_PREAD64 = 180 + SYS_PWRITE64 = 181 + SYS_CHOWN = 182 + SYS_GETCWD = 183 + SYS_CAPGET = 184 + SYS_CAPSET = 185 + SYS_SIGALTSTACK = 186 + SYS_SENDFILE = 187 + SYS_GETPMSG = 188 + SYS_PUTPMSG = 189 + SYS_VFORK = 190 + SYS_UGETRLIMIT = 191 + SYS_MMAP2 = 192 + SYS_TRUNCATE64 = 193 + SYS_FTRUNCATE64 = 194 + SYS_STAT64 = 195 + SYS_LSTAT64 = 196 + SYS_FSTAT64 = 197 + SYS_LCHOWN32 = 198 + SYS_GETUID32 = 199 + SYS_GETGID32 = 200 + SYS_GETEUID32 = 201 + SYS_GETEGID32 = 202 + SYS_SETREUID32 = 203 + SYS_SETREGID32 = 204 + SYS_GETGROUPS32 = 205 + SYS_SETGROUPS32 = 206 + SYS_FCHOWN32 = 207 + SYS_SETRESUID32 = 208 + SYS_GETRESUID32 = 209 + SYS_SETRESGID32 = 210 + SYS_GETRESGID32 = 211 + SYS_CHOWN32 = 212 + SYS_SETUID32 = 213 + SYS_SETGID32 = 214 + SYS_SETFSUID32 = 215 + SYS_SETFSGID32 = 216 + SYS_PIVOT_ROOT = 217 + SYS_MINCORE = 218 + SYS_MADVISE = 219 + SYS_GETDENTS64 = 220 + SYS_FCNTL64 = 221 + SYS_GETTID = 224 + SYS_READAHEAD = 225 + SYS_SETXATTR = 226 + SYS_LSETXATTR = 227 + SYS_FSETXATTR = 228 + SYS_GETXATTR = 229 + SYS_LGETXATTR = 230 + SYS_FGETXATTR = 231 + SYS_LISTXATTR = 232 + SYS_LLISTXATTR = 233 + SYS_FLISTXATTR = 234 + SYS_REMOVEXATTR = 235 + SYS_LREMOVEXATTR = 236 + SYS_FREMOVEXATTR = 237 + SYS_TKILL = 238 + SYS_SENDFILE64 = 239 + SYS_FUTEX = 240 + SYS_SCHED_SETAFFINITY = 241 + SYS_SCHED_GETAFFINITY = 242 + SYS_SET_THREAD_AREA = 243 + SYS_GET_THREAD_AREA = 244 + SYS_IO_SETUP = 245 + SYS_IO_DESTROY = 246 + SYS_IO_GETEVENTS = 247 + SYS_IO_SUBMIT = 248 + SYS_IO_CANCEL = 249 + SYS_FADVISE64 = 250 + SYS_EXIT_GROUP = 252 + SYS_LOOKUP_DCOOKIE = 253 + SYS_EPOLL_CREATE = 254 + SYS_EPOLL_CTL = 255 + SYS_EPOLL_WAIT = 256 + SYS_REMAP_FILE_PAGES = 257 + SYS_SET_TID_ADDRESS = 258 + SYS_TIMER_CREATE = 259 + SYS_TIMER_SETTIME = 260 + SYS_TIMER_GETTIME = 261 + SYS_TIMER_GETOVERRUN = 262 + SYS_TIMER_DELETE = 263 + SYS_CLOCK_SETTIME = 264 + SYS_CLOCK_GETTIME = 265 + SYS_CLOCK_GETRES = 266 + SYS_CLOCK_NANOSLEEP = 267 + SYS_STATFS64 = 268 + SYS_FSTATFS64 = 269 + SYS_TGKILL = 270 + SYS_UTIMES = 271 + SYS_FADVISE64_64 = 272 + SYS_VSERVER = 273 + SYS_MBIND = 274 + SYS_GET_MEMPOLICY = 275 + SYS_SET_MEMPOLICY = 276 + SYS_MQ_OPEN = 277 + SYS_MQ_UNLINK = 278 + SYS_MQ_TIMEDSEND = 279 + SYS_MQ_TIMEDRECEIVE = 280 + SYS_MQ_NOTIFY = 281 + SYS_MQ_GETSETATTR = 282 + SYS_KEXEC_LOAD = 283 + SYS_WAITID = 284 + SYS_ADD_KEY = 286 + SYS_REQUEST_KEY = 287 + SYS_KEYCTL = 288 + SYS_IOPRIO_SET = 289 + SYS_IOPRIO_GET = 290 + SYS_INOTIFY_INIT = 291 + SYS_INOTIFY_ADD_WATCH = 292 + SYS_INOTIFY_RM_WATCH = 293 + SYS_MIGRATE_PAGES = 294 + SYS_OPENAT = 295 + SYS_MKDIRAT = 296 + SYS_MKNODAT = 297 + SYS_FCHOWNAT = 298 + SYS_FUTIMESAT = 299 + SYS_FSTATAT64 = 300 + SYS_UNLINKAT = 301 + SYS_RENAMEAT = 302 + SYS_LINKAT = 303 + SYS_SYMLINKAT = 304 + SYS_READLINKAT = 305 + SYS_FCHMODAT = 306 + SYS_FACCESSAT = 307 + SYS_PSELECT6 = 308 + SYS_PPOLL = 309 + SYS_UNSHARE = 310 + SYS_SET_ROBUST_LIST = 311 + SYS_GET_ROBUST_LIST = 312 + SYS_SPLICE = 313 + SYS_SYNC_FILE_RANGE = 314 + SYS_TEE = 315 + SYS_VMSPLICE = 316 + SYS_MOVE_PAGES = 317 + SYS_GETCPU = 318 + SYS_EPOLL_PWAIT = 319 + SYS_UTIMENSAT = 320 + SYS_SIGNALFD = 321 + SYS_TIMERFD_CREATE = 322 + SYS_EVENTFD = 323 + SYS_FALLOCATE = 324 + SYS_TIMERFD_SETTIME = 325 + SYS_TIMERFD_GETTIME = 326 + SYS_SIGNALFD4 = 327 + SYS_EVENTFD2 = 328 + SYS_EPOLL_CREATE1 = 329 + SYS_DUP3 = 330 + SYS_PIPE2 = 331 + SYS_INOTIFY_INIT1 = 332 + SYS_PREADV = 333 + SYS_PWRITEV = 334 + SYS_RT_TGSIGQUEUEINFO = 335 + SYS_PERF_EVENT_OPEN = 336 + SYS_RECVMMSG = 337 + SYS_FANOTIFY_INIT = 338 + SYS_FANOTIFY_MARK = 339 + SYS_PRLIMIT64 = 340 + SYS_NAME_TO_HANDLE_AT = 341 + SYS_OPEN_BY_HANDLE_AT = 342 + SYS_CLOCK_ADJTIME = 343 + SYS_SYNCFS = 344 + SYS_SENDMMSG = 345 + SYS_SETNS = 346 + SYS_PROCESS_VM_READV = 347 + SYS_PROCESS_VM_WRITEV = 348 + SYS_KCMP = 349 + SYS_FINIT_MODULE = 350 + SYS_SCHED_SETATTR = 351 + SYS_SCHED_GETATTR = 352 + SYS_RENAMEAT2 = 353 + SYS_SECCOMP = 354 + SYS_GETRANDOM = 355 + SYS_MEMFD_CREATE = 356 + SYS_BPF = 357 + SYS_EXECVEAT = 358 + SYS_SOCKET = 359 + SYS_SOCKETPAIR = 360 + SYS_BIND = 361 + SYS_CONNECT = 362 + SYS_LISTEN = 363 + SYS_ACCEPT4 = 364 + SYS_GETSOCKOPT = 365 + SYS_SETSOCKOPT = 366 + SYS_GETSOCKNAME = 367 + SYS_GETPEERNAME = 368 + SYS_SENDTO = 369 + SYS_SENDMSG = 370 + SYS_RECVFROM = 371 + SYS_RECVMSG = 372 + SYS_SHUTDOWN = 373 + SYS_USERFAULTFD = 374 + SYS_MEMBARRIER = 375 + SYS_MLOCK2 = 376 + SYS_COPY_FILE_RANGE = 377 + SYS_PREADV2 = 378 + SYS_PWRITEV2 = 379 + SYS_PKEY_MPROTECT = 380 + SYS_PKEY_ALLOC = 381 + SYS_PKEY_FREE = 382 + SYS_STATX = 383 + SYS_ARCH_PRCTL = 384 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go new file mode 100644 index 0000000..c5dabf2 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go @@ -0,0 +1,342 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include -m64 /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,linux + +package unix + +const ( + SYS_READ = 0 + SYS_WRITE = 1 + SYS_OPEN = 2 + SYS_CLOSE = 3 + SYS_STAT = 4 + SYS_FSTAT = 5 + SYS_LSTAT = 6 + SYS_POLL = 7 + SYS_LSEEK = 8 + SYS_MMAP = 9 + SYS_MPROTECT = 10 + SYS_MUNMAP = 11 + SYS_BRK = 12 + SYS_RT_SIGACTION = 13 + SYS_RT_SIGPROCMASK = 14 + SYS_RT_SIGRETURN = 15 + SYS_IOCTL = 16 + SYS_PREAD64 = 17 + SYS_PWRITE64 = 18 + SYS_READV = 19 + SYS_WRITEV = 20 + SYS_ACCESS = 21 + SYS_PIPE = 22 + SYS_SELECT = 23 + SYS_SCHED_YIELD = 24 + SYS_MREMAP = 25 + SYS_MSYNC = 26 + SYS_MINCORE = 27 + SYS_MADVISE = 28 + SYS_SHMGET = 29 + SYS_SHMAT = 30 + SYS_SHMCTL = 31 + SYS_DUP = 32 + SYS_DUP2 = 33 + SYS_PAUSE = 34 + SYS_NANOSLEEP = 35 + SYS_GETITIMER = 36 + SYS_ALARM = 37 + SYS_SETITIMER = 38 + SYS_GETPID = 39 + SYS_SENDFILE = 40 + SYS_SOCKET = 41 + SYS_CONNECT = 42 + SYS_ACCEPT = 43 + SYS_SENDTO = 44 + SYS_RECVFROM = 45 + SYS_SENDMSG = 46 + SYS_RECVMSG = 47 + SYS_SHUTDOWN = 48 + SYS_BIND = 49 + SYS_LISTEN = 50 + SYS_GETSOCKNAME = 51 + SYS_GETPEERNAME = 52 + SYS_SOCKETPAIR = 53 + SYS_SETSOCKOPT = 54 + SYS_GETSOCKOPT = 55 + SYS_CLONE = 56 + SYS_FORK = 57 + SYS_VFORK = 58 + SYS_EXECVE = 59 + SYS_EXIT = 60 + SYS_WAIT4 = 61 + SYS_KILL = 62 + SYS_UNAME = 63 + SYS_SEMGET = 64 + SYS_SEMOP = 65 + SYS_SEMCTL = 66 + SYS_SHMDT = 67 + SYS_MSGGET = 68 + SYS_MSGSND = 69 + SYS_MSGRCV = 70 + SYS_MSGCTL = 71 + SYS_FCNTL = 72 + SYS_FLOCK = 73 + SYS_FSYNC = 74 + SYS_FDATASYNC = 75 + SYS_TRUNCATE = 76 + SYS_FTRUNCATE = 77 + SYS_GETDENTS = 78 + SYS_GETCWD = 79 + SYS_CHDIR = 80 + SYS_FCHDIR = 81 + SYS_RENAME = 82 + SYS_MKDIR = 83 + SYS_RMDIR = 84 + SYS_CREAT = 85 + SYS_LINK = 86 + SYS_UNLINK = 87 + SYS_SYMLINK = 88 + SYS_READLINK = 89 + SYS_CHMOD = 90 + SYS_FCHMOD = 91 + SYS_CHOWN = 92 + SYS_FCHOWN = 93 + SYS_LCHOWN = 94 + SYS_UMASK = 95 + SYS_GETTIMEOFDAY = 96 + SYS_GETRLIMIT = 97 + SYS_GETRUSAGE = 98 + SYS_SYSINFO = 99 + SYS_TIMES = 100 + SYS_PTRACE = 101 + SYS_GETUID = 102 + SYS_SYSLOG = 103 + SYS_GETGID = 104 + SYS_SETUID = 105 + SYS_SETGID = 106 + SYS_GETEUID = 107 + SYS_GETEGID = 108 + SYS_SETPGID = 109 + SYS_GETPPID = 110 + SYS_GETPGRP = 111 + SYS_SETSID = 112 + SYS_SETREUID = 113 + SYS_SETREGID = 114 + SYS_GETGROUPS = 115 + SYS_SETGROUPS = 116 + SYS_SETRESUID = 117 + SYS_GETRESUID = 118 + SYS_SETRESGID = 119 + SYS_GETRESGID = 120 + SYS_GETPGID = 121 + SYS_SETFSUID = 122 + SYS_SETFSGID = 123 + SYS_GETSID = 124 + SYS_CAPGET = 125 + SYS_CAPSET = 126 + SYS_RT_SIGPENDING = 127 + SYS_RT_SIGTIMEDWAIT = 128 + SYS_RT_SIGQUEUEINFO = 129 + SYS_RT_SIGSUSPEND = 130 + SYS_SIGALTSTACK = 131 + SYS_UTIME = 132 + SYS_MKNOD = 133 + SYS_USELIB = 134 + SYS_PERSONALITY = 135 + SYS_USTAT = 136 + SYS_STATFS = 137 + SYS_FSTATFS = 138 + SYS_SYSFS = 139 + SYS_GETPRIORITY = 140 + SYS_SETPRIORITY = 141 + SYS_SCHED_SETPARAM = 142 + SYS_SCHED_GETPARAM = 143 + SYS_SCHED_SETSCHEDULER = 144 + SYS_SCHED_GETSCHEDULER = 145 + SYS_SCHED_GET_PRIORITY_MAX = 146 + SYS_SCHED_GET_PRIORITY_MIN = 147 + SYS_SCHED_RR_GET_INTERVAL = 148 + SYS_MLOCK = 149 + SYS_MUNLOCK = 150 + SYS_MLOCKALL = 151 + SYS_MUNLOCKALL = 152 + SYS_VHANGUP = 153 + SYS_MODIFY_LDT = 154 + SYS_PIVOT_ROOT = 155 + SYS__SYSCTL = 156 + SYS_PRCTL = 157 + SYS_ARCH_PRCTL = 158 + SYS_ADJTIMEX = 159 + SYS_SETRLIMIT = 160 + SYS_CHROOT = 161 + SYS_SYNC = 162 + SYS_ACCT = 163 + SYS_SETTIMEOFDAY = 164 + SYS_MOUNT = 165 + SYS_UMOUNT2 = 166 + SYS_SWAPON = 167 + SYS_SWAPOFF = 168 + SYS_REBOOT = 169 + SYS_SETHOSTNAME = 170 + SYS_SETDOMAINNAME = 171 + SYS_IOPL = 172 + SYS_IOPERM = 173 + SYS_CREATE_MODULE = 174 + SYS_INIT_MODULE = 175 + SYS_DELETE_MODULE = 176 + SYS_GET_KERNEL_SYMS = 177 + SYS_QUERY_MODULE = 178 + SYS_QUOTACTL = 179 + SYS_NFSSERVCTL = 180 + SYS_GETPMSG = 181 + SYS_PUTPMSG = 182 + SYS_AFS_SYSCALL = 183 + SYS_TUXCALL = 184 + SYS_SECURITY = 185 + SYS_GETTID = 186 + SYS_READAHEAD = 187 + SYS_SETXATTR = 188 + SYS_LSETXATTR = 189 + SYS_FSETXATTR = 190 + SYS_GETXATTR = 191 + SYS_LGETXATTR = 192 + SYS_FGETXATTR = 193 + SYS_LISTXATTR = 194 + SYS_LLISTXATTR = 195 + SYS_FLISTXATTR = 196 + SYS_REMOVEXATTR = 197 + SYS_LREMOVEXATTR = 198 + SYS_FREMOVEXATTR = 199 + SYS_TKILL = 200 + SYS_TIME = 201 + SYS_FUTEX = 202 + SYS_SCHED_SETAFFINITY = 203 + SYS_SCHED_GETAFFINITY = 204 + SYS_SET_THREAD_AREA = 205 + SYS_IO_SETUP = 206 + SYS_IO_DESTROY = 207 + SYS_IO_GETEVENTS = 208 + SYS_IO_SUBMIT = 209 + SYS_IO_CANCEL = 210 + SYS_GET_THREAD_AREA = 211 + SYS_LOOKUP_DCOOKIE = 212 + SYS_EPOLL_CREATE = 213 + SYS_EPOLL_CTL_OLD = 214 + SYS_EPOLL_WAIT_OLD = 215 + SYS_REMAP_FILE_PAGES = 216 + SYS_GETDENTS64 = 217 + SYS_SET_TID_ADDRESS = 218 + SYS_RESTART_SYSCALL = 219 + SYS_SEMTIMEDOP = 220 + SYS_FADVISE64 = 221 + SYS_TIMER_CREATE = 222 + SYS_TIMER_SETTIME = 223 + SYS_TIMER_GETTIME = 224 + SYS_TIMER_GETOVERRUN = 225 + SYS_TIMER_DELETE = 226 + SYS_CLOCK_SETTIME = 227 + SYS_CLOCK_GETTIME = 228 + SYS_CLOCK_GETRES = 229 + SYS_CLOCK_NANOSLEEP = 230 + SYS_EXIT_GROUP = 231 + SYS_EPOLL_WAIT = 232 + SYS_EPOLL_CTL = 233 + SYS_TGKILL = 234 + SYS_UTIMES = 235 + SYS_VSERVER = 236 + SYS_MBIND = 237 + SYS_SET_MEMPOLICY = 238 + SYS_GET_MEMPOLICY = 239 + SYS_MQ_OPEN = 240 + SYS_MQ_UNLINK = 241 + SYS_MQ_TIMEDSEND = 242 + SYS_MQ_TIMEDRECEIVE = 243 + SYS_MQ_NOTIFY = 244 + SYS_MQ_GETSETATTR = 245 + SYS_KEXEC_LOAD = 246 + SYS_WAITID = 247 + SYS_ADD_KEY = 248 + SYS_REQUEST_KEY = 249 + SYS_KEYCTL = 250 + SYS_IOPRIO_SET = 251 + SYS_IOPRIO_GET = 252 + SYS_INOTIFY_INIT = 253 + SYS_INOTIFY_ADD_WATCH = 254 + SYS_INOTIFY_RM_WATCH = 255 + SYS_MIGRATE_PAGES = 256 + SYS_OPENAT = 257 + SYS_MKDIRAT = 258 + SYS_MKNODAT = 259 + SYS_FCHOWNAT = 260 + SYS_FUTIMESAT = 261 + SYS_NEWFSTATAT = 262 + SYS_UNLINKAT = 263 + SYS_RENAMEAT = 264 + SYS_LINKAT = 265 + SYS_SYMLINKAT = 266 + SYS_READLINKAT = 267 + SYS_FCHMODAT = 268 + SYS_FACCESSAT = 269 + SYS_PSELECT6 = 270 + SYS_PPOLL = 271 + SYS_UNSHARE = 272 + SYS_SET_ROBUST_LIST = 273 + SYS_GET_ROBUST_LIST = 274 + SYS_SPLICE = 275 + SYS_TEE = 276 + SYS_SYNC_FILE_RANGE = 277 + SYS_VMSPLICE = 278 + SYS_MOVE_PAGES = 279 + SYS_UTIMENSAT = 280 + SYS_EPOLL_PWAIT = 281 + SYS_SIGNALFD = 282 + SYS_TIMERFD_CREATE = 283 + SYS_EVENTFD = 284 + SYS_FALLOCATE = 285 + SYS_TIMERFD_SETTIME = 286 + SYS_TIMERFD_GETTIME = 287 + SYS_ACCEPT4 = 288 + SYS_SIGNALFD4 = 289 + SYS_EVENTFD2 = 290 + SYS_EPOLL_CREATE1 = 291 + SYS_DUP3 = 292 + SYS_PIPE2 = 293 + SYS_INOTIFY_INIT1 = 294 + SYS_PREADV = 295 + SYS_PWRITEV = 296 + SYS_RT_TGSIGQUEUEINFO = 297 + SYS_PERF_EVENT_OPEN = 298 + SYS_RECVMMSG = 299 + SYS_FANOTIFY_INIT = 300 + SYS_FANOTIFY_MARK = 301 + SYS_PRLIMIT64 = 302 + SYS_NAME_TO_HANDLE_AT = 303 + SYS_OPEN_BY_HANDLE_AT = 304 + SYS_CLOCK_ADJTIME = 305 + SYS_SYNCFS = 306 + SYS_SENDMMSG = 307 + SYS_SETNS = 308 + SYS_GETCPU = 309 + SYS_PROCESS_VM_READV = 310 + SYS_PROCESS_VM_WRITEV = 311 + SYS_KCMP = 312 + SYS_FINIT_MODULE = 313 + SYS_SCHED_SETATTR = 314 + SYS_SCHED_GETATTR = 315 + SYS_RENAMEAT2 = 316 + SYS_SECCOMP = 317 + SYS_GETRANDOM = 318 + SYS_MEMFD_CREATE = 319 + SYS_KEXEC_FILE_LOAD = 320 + SYS_BPF = 321 + SYS_EXECVEAT = 322 + SYS_USERFAULTFD = 323 + SYS_MEMBARRIER = 324 + SYS_MLOCK2 = 325 + SYS_COPY_FILE_RANGE = 326 + SYS_PREADV2 = 327 + SYS_PWRITEV2 = 328 + SYS_PKEY_MPROTECT = 329 + SYS_PKEY_ALLOC = 330 + SYS_PKEY_FREE = 331 + SYS_STATX = 332 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go new file mode 100644 index 0000000..ab7fa5f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go @@ -0,0 +1,362 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,linux + +package unix + +const ( + SYS_RESTART_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_CREAT = 8 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_EXECVE = 11 + SYS_CHDIR = 12 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_LCHOWN = 16 + SYS_LSEEK = 19 + SYS_GETPID = 20 + SYS_MOUNT = 21 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_PTRACE = 26 + SYS_PAUSE = 29 + SYS_ACCESS = 33 + SYS_NICE = 34 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_RENAME = 38 + SYS_MKDIR = 39 + SYS_RMDIR = 40 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_TIMES = 43 + SYS_BRK = 45 + SYS_SETGID = 46 + SYS_GETGID = 47 + SYS_GETEUID = 49 + SYS_GETEGID = 50 + SYS_ACCT = 51 + SYS_UMOUNT2 = 52 + SYS_IOCTL = 54 + SYS_FCNTL = 55 + SYS_SETPGID = 57 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_USTAT = 62 + SYS_DUP2 = 63 + SYS_GETPPID = 64 + SYS_GETPGRP = 65 + SYS_SETSID = 66 + SYS_SIGACTION = 67 + SYS_SETREUID = 70 + SYS_SETREGID = 71 + SYS_SIGSUSPEND = 72 + SYS_SIGPENDING = 73 + SYS_SETHOSTNAME = 74 + SYS_SETRLIMIT = 75 + SYS_GETRUSAGE = 77 + SYS_GETTIMEOFDAY = 78 + SYS_SETTIMEOFDAY = 79 + SYS_GETGROUPS = 80 + SYS_SETGROUPS = 81 + SYS_SYMLINK = 83 + SYS_READLINK = 85 + SYS_USELIB = 86 + SYS_SWAPON = 87 + SYS_REBOOT = 88 + SYS_MUNMAP = 91 + SYS_TRUNCATE = 92 + SYS_FTRUNCATE = 93 + SYS_FCHMOD = 94 + SYS_FCHOWN = 95 + SYS_GETPRIORITY = 96 + SYS_SETPRIORITY = 97 + SYS_STATFS = 99 + SYS_FSTATFS = 100 + SYS_SYSLOG = 103 + SYS_SETITIMER = 104 + SYS_GETITIMER = 105 + SYS_STAT = 106 + SYS_LSTAT = 107 + SYS_FSTAT = 108 + SYS_VHANGUP = 111 + SYS_WAIT4 = 114 + SYS_SWAPOFF = 115 + SYS_SYSINFO = 116 + SYS_FSYNC = 118 + SYS_SIGRETURN = 119 + SYS_CLONE = 120 + SYS_SETDOMAINNAME = 121 + SYS_UNAME = 122 + SYS_ADJTIMEX = 124 + SYS_MPROTECT = 125 + SYS_SIGPROCMASK = 126 + SYS_INIT_MODULE = 128 + SYS_DELETE_MODULE = 129 + SYS_QUOTACTL = 131 + SYS_GETPGID = 132 + SYS_FCHDIR = 133 + SYS_BDFLUSH = 134 + SYS_SYSFS = 135 + SYS_PERSONALITY = 136 + SYS_SETFSUID = 138 + SYS_SETFSGID = 139 + SYS__LLSEEK = 140 + SYS_GETDENTS = 141 + SYS__NEWSELECT = 142 + SYS_FLOCK = 143 + SYS_MSYNC = 144 + SYS_READV = 145 + SYS_WRITEV = 146 + SYS_GETSID = 147 + SYS_FDATASYNC = 148 + SYS__SYSCTL = 149 + SYS_MLOCK = 150 + SYS_MUNLOCK = 151 + SYS_MLOCKALL = 152 + SYS_MUNLOCKALL = 153 + SYS_SCHED_SETPARAM = 154 + SYS_SCHED_GETPARAM = 155 + SYS_SCHED_SETSCHEDULER = 156 + SYS_SCHED_GETSCHEDULER = 157 + SYS_SCHED_YIELD = 158 + SYS_SCHED_GET_PRIORITY_MAX = 159 + SYS_SCHED_GET_PRIORITY_MIN = 160 + SYS_SCHED_RR_GET_INTERVAL = 161 + SYS_NANOSLEEP = 162 + SYS_MREMAP = 163 + SYS_SETRESUID = 164 + SYS_GETRESUID = 165 + SYS_POLL = 168 + SYS_NFSSERVCTL = 169 + SYS_SETRESGID = 170 + SYS_GETRESGID = 171 + SYS_PRCTL = 172 + SYS_RT_SIGRETURN = 173 + SYS_RT_SIGACTION = 174 + SYS_RT_SIGPROCMASK = 175 + SYS_RT_SIGPENDING = 176 + SYS_RT_SIGTIMEDWAIT = 177 + SYS_RT_SIGQUEUEINFO = 178 + SYS_RT_SIGSUSPEND = 179 + SYS_PREAD64 = 180 + SYS_PWRITE64 = 181 + SYS_CHOWN = 182 + SYS_GETCWD = 183 + SYS_CAPGET = 184 + SYS_CAPSET = 185 + SYS_SIGALTSTACK = 186 + SYS_SENDFILE = 187 + SYS_VFORK = 190 + SYS_UGETRLIMIT = 191 + SYS_MMAP2 = 192 + SYS_TRUNCATE64 = 193 + SYS_FTRUNCATE64 = 194 + SYS_STAT64 = 195 + SYS_LSTAT64 = 196 + SYS_FSTAT64 = 197 + SYS_LCHOWN32 = 198 + SYS_GETUID32 = 199 + SYS_GETGID32 = 200 + SYS_GETEUID32 = 201 + SYS_GETEGID32 = 202 + SYS_SETREUID32 = 203 + SYS_SETREGID32 = 204 + SYS_GETGROUPS32 = 205 + SYS_SETGROUPS32 = 206 + SYS_FCHOWN32 = 207 + SYS_SETRESUID32 = 208 + SYS_GETRESUID32 = 209 + SYS_SETRESGID32 = 210 + SYS_GETRESGID32 = 211 + SYS_CHOWN32 = 212 + SYS_SETUID32 = 213 + SYS_SETGID32 = 214 + SYS_SETFSUID32 = 215 + SYS_SETFSGID32 = 216 + SYS_GETDENTS64 = 217 + SYS_PIVOT_ROOT = 218 + SYS_MINCORE = 219 + SYS_MADVISE = 220 + SYS_FCNTL64 = 221 + SYS_GETTID = 224 + SYS_READAHEAD = 225 + SYS_SETXATTR = 226 + SYS_LSETXATTR = 227 + SYS_FSETXATTR = 228 + SYS_GETXATTR = 229 + SYS_LGETXATTR = 230 + SYS_FGETXATTR = 231 + SYS_LISTXATTR = 232 + SYS_LLISTXATTR = 233 + SYS_FLISTXATTR = 234 + SYS_REMOVEXATTR = 235 + SYS_LREMOVEXATTR = 236 + SYS_FREMOVEXATTR = 237 + SYS_TKILL = 238 + SYS_SENDFILE64 = 239 + SYS_FUTEX = 240 + SYS_SCHED_SETAFFINITY = 241 + SYS_SCHED_GETAFFINITY = 242 + SYS_IO_SETUP = 243 + SYS_IO_DESTROY = 244 + SYS_IO_GETEVENTS = 245 + SYS_IO_SUBMIT = 246 + SYS_IO_CANCEL = 247 + SYS_EXIT_GROUP = 248 + SYS_LOOKUP_DCOOKIE = 249 + SYS_EPOLL_CREATE = 250 + SYS_EPOLL_CTL = 251 + SYS_EPOLL_WAIT = 252 + SYS_REMAP_FILE_PAGES = 253 + SYS_SET_TID_ADDRESS = 256 + SYS_TIMER_CREATE = 257 + SYS_TIMER_SETTIME = 258 + SYS_TIMER_GETTIME = 259 + SYS_TIMER_GETOVERRUN = 260 + SYS_TIMER_DELETE = 261 + SYS_CLOCK_SETTIME = 262 + SYS_CLOCK_GETTIME = 263 + SYS_CLOCK_GETRES = 264 + SYS_CLOCK_NANOSLEEP = 265 + SYS_STATFS64 = 266 + SYS_FSTATFS64 = 267 + SYS_TGKILL = 268 + SYS_UTIMES = 269 + SYS_ARM_FADVISE64_64 = 270 + SYS_PCICONFIG_IOBASE = 271 + SYS_PCICONFIG_READ = 272 + SYS_PCICONFIG_WRITE = 273 + SYS_MQ_OPEN = 274 + SYS_MQ_UNLINK = 275 + SYS_MQ_TIMEDSEND = 276 + SYS_MQ_TIMEDRECEIVE = 277 + SYS_MQ_NOTIFY = 278 + SYS_MQ_GETSETATTR = 279 + SYS_WAITID = 280 + SYS_SOCKET = 281 + SYS_BIND = 282 + SYS_CONNECT = 283 + SYS_LISTEN = 284 + SYS_ACCEPT = 285 + SYS_GETSOCKNAME = 286 + SYS_GETPEERNAME = 287 + SYS_SOCKETPAIR = 288 + SYS_SEND = 289 + SYS_SENDTO = 290 + SYS_RECV = 291 + SYS_RECVFROM = 292 + SYS_SHUTDOWN = 293 + SYS_SETSOCKOPT = 294 + SYS_GETSOCKOPT = 295 + SYS_SENDMSG = 296 + SYS_RECVMSG = 297 + SYS_SEMOP = 298 + SYS_SEMGET = 299 + SYS_SEMCTL = 300 + SYS_MSGSND = 301 + SYS_MSGRCV = 302 + SYS_MSGGET = 303 + SYS_MSGCTL = 304 + SYS_SHMAT = 305 + SYS_SHMDT = 306 + SYS_SHMGET = 307 + SYS_SHMCTL = 308 + SYS_ADD_KEY = 309 + SYS_REQUEST_KEY = 310 + SYS_KEYCTL = 311 + SYS_SEMTIMEDOP = 312 + SYS_VSERVER = 313 + SYS_IOPRIO_SET = 314 + SYS_IOPRIO_GET = 315 + SYS_INOTIFY_INIT = 316 + SYS_INOTIFY_ADD_WATCH = 317 + SYS_INOTIFY_RM_WATCH = 318 + SYS_MBIND = 319 + SYS_GET_MEMPOLICY = 320 + SYS_SET_MEMPOLICY = 321 + SYS_OPENAT = 322 + SYS_MKDIRAT = 323 + SYS_MKNODAT = 324 + SYS_FCHOWNAT = 325 + SYS_FUTIMESAT = 326 + SYS_FSTATAT64 = 327 + SYS_UNLINKAT = 328 + SYS_RENAMEAT = 329 + SYS_LINKAT = 330 + SYS_SYMLINKAT = 331 + SYS_READLINKAT = 332 + SYS_FCHMODAT = 333 + SYS_FACCESSAT = 334 + SYS_PSELECT6 = 335 + SYS_PPOLL = 336 + SYS_UNSHARE = 337 + SYS_SET_ROBUST_LIST = 338 + SYS_GET_ROBUST_LIST = 339 + SYS_SPLICE = 340 + SYS_ARM_SYNC_FILE_RANGE = 341 + SYS_TEE = 342 + SYS_VMSPLICE = 343 + SYS_MOVE_PAGES = 344 + SYS_GETCPU = 345 + SYS_EPOLL_PWAIT = 346 + SYS_KEXEC_LOAD = 347 + SYS_UTIMENSAT = 348 + SYS_SIGNALFD = 349 + SYS_TIMERFD_CREATE = 350 + SYS_EVENTFD = 351 + SYS_FALLOCATE = 352 + SYS_TIMERFD_SETTIME = 353 + SYS_TIMERFD_GETTIME = 354 + SYS_SIGNALFD4 = 355 + SYS_EVENTFD2 = 356 + SYS_EPOLL_CREATE1 = 357 + SYS_DUP3 = 358 + SYS_PIPE2 = 359 + SYS_INOTIFY_INIT1 = 360 + SYS_PREADV = 361 + SYS_PWRITEV = 362 + SYS_RT_TGSIGQUEUEINFO = 363 + SYS_PERF_EVENT_OPEN = 364 + SYS_RECVMMSG = 365 + SYS_ACCEPT4 = 366 + SYS_FANOTIFY_INIT = 367 + SYS_FANOTIFY_MARK = 368 + SYS_PRLIMIT64 = 369 + SYS_NAME_TO_HANDLE_AT = 370 + SYS_OPEN_BY_HANDLE_AT = 371 + SYS_CLOCK_ADJTIME = 372 + SYS_SYNCFS = 373 + SYS_SENDMMSG = 374 + SYS_SETNS = 375 + SYS_PROCESS_VM_READV = 376 + SYS_PROCESS_VM_WRITEV = 377 + SYS_KCMP = 378 + SYS_FINIT_MODULE = 379 + SYS_SCHED_SETATTR = 380 + SYS_SCHED_GETATTR = 381 + SYS_RENAMEAT2 = 382 + SYS_SECCOMP = 383 + SYS_GETRANDOM = 384 + SYS_MEMFD_CREATE = 385 + SYS_BPF = 386 + SYS_EXECVEAT = 387 + SYS_USERFAULTFD = 388 + SYS_MEMBARRIER = 389 + SYS_MLOCK2 = 390 + SYS_COPY_FILE_RANGE = 391 + SYS_PREADV2 = 392 + SYS_PWRITEV2 = 393 + SYS_PKEY_MPROTECT = 394 + SYS_PKEY_ALLOC = 395 + SYS_PKEY_FREE = 396 + SYS_STATX = 397 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go new file mode 100644 index 0000000..b1c6b4b --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go @@ -0,0 +1,286 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include -fsigned-char /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm64,linux + +package unix + +const ( + SYS_IO_SETUP = 0 + SYS_IO_DESTROY = 1 + SYS_IO_SUBMIT = 2 + SYS_IO_CANCEL = 3 + SYS_IO_GETEVENTS = 4 + SYS_SETXATTR = 5 + SYS_LSETXATTR = 6 + SYS_FSETXATTR = 7 + SYS_GETXATTR = 8 + SYS_LGETXATTR = 9 + SYS_FGETXATTR = 10 + SYS_LISTXATTR = 11 + SYS_LLISTXATTR = 12 + SYS_FLISTXATTR = 13 + SYS_REMOVEXATTR = 14 + SYS_LREMOVEXATTR = 15 + SYS_FREMOVEXATTR = 16 + SYS_GETCWD = 17 + SYS_LOOKUP_DCOOKIE = 18 + SYS_EVENTFD2 = 19 + SYS_EPOLL_CREATE1 = 20 + SYS_EPOLL_CTL = 21 + SYS_EPOLL_PWAIT = 22 + SYS_DUP = 23 + SYS_DUP3 = 24 + SYS_FCNTL = 25 + SYS_INOTIFY_INIT1 = 26 + SYS_INOTIFY_ADD_WATCH = 27 + SYS_INOTIFY_RM_WATCH = 28 + SYS_IOCTL = 29 + SYS_IOPRIO_SET = 30 + SYS_IOPRIO_GET = 31 + SYS_FLOCK = 32 + SYS_MKNODAT = 33 + SYS_MKDIRAT = 34 + SYS_UNLINKAT = 35 + SYS_SYMLINKAT = 36 + SYS_LINKAT = 37 + SYS_RENAMEAT = 38 + SYS_UMOUNT2 = 39 + SYS_MOUNT = 40 + SYS_PIVOT_ROOT = 41 + SYS_NFSSERVCTL = 42 + SYS_STATFS = 43 + SYS_FSTATFS = 44 + SYS_TRUNCATE = 45 + SYS_FTRUNCATE = 46 + SYS_FALLOCATE = 47 + SYS_FACCESSAT = 48 + SYS_CHDIR = 49 + SYS_FCHDIR = 50 + SYS_CHROOT = 51 + SYS_FCHMOD = 52 + SYS_FCHMODAT = 53 + SYS_FCHOWNAT = 54 + SYS_FCHOWN = 55 + SYS_OPENAT = 56 + SYS_CLOSE = 57 + SYS_VHANGUP = 58 + SYS_PIPE2 = 59 + SYS_QUOTACTL = 60 + SYS_GETDENTS64 = 61 + SYS_LSEEK = 62 + SYS_READ = 63 + SYS_WRITE = 64 + SYS_READV = 65 + SYS_WRITEV = 66 + SYS_PREAD64 = 67 + SYS_PWRITE64 = 68 + SYS_PREADV = 69 + SYS_PWRITEV = 70 + SYS_SENDFILE = 71 + SYS_PSELECT6 = 72 + SYS_PPOLL = 73 + SYS_SIGNALFD4 = 74 + SYS_VMSPLICE = 75 + SYS_SPLICE = 76 + SYS_TEE = 77 + SYS_READLINKAT = 78 + SYS_FSTATAT = 79 + SYS_FSTAT = 80 + SYS_SYNC = 81 + SYS_FSYNC = 82 + SYS_FDATASYNC = 83 + SYS_SYNC_FILE_RANGE = 84 + SYS_TIMERFD_CREATE = 85 + SYS_TIMERFD_SETTIME = 86 + SYS_TIMERFD_GETTIME = 87 + SYS_UTIMENSAT = 88 + SYS_ACCT = 89 + SYS_CAPGET = 90 + SYS_CAPSET = 91 + SYS_PERSONALITY = 92 + SYS_EXIT = 93 + SYS_EXIT_GROUP = 94 + SYS_WAITID = 95 + SYS_SET_TID_ADDRESS = 96 + SYS_UNSHARE = 97 + SYS_FUTEX = 98 + SYS_SET_ROBUST_LIST = 99 + SYS_GET_ROBUST_LIST = 100 + SYS_NANOSLEEP = 101 + SYS_GETITIMER = 102 + SYS_SETITIMER = 103 + SYS_KEXEC_LOAD = 104 + SYS_INIT_MODULE = 105 + SYS_DELETE_MODULE = 106 + SYS_TIMER_CREATE = 107 + SYS_TIMER_GETTIME = 108 + SYS_TIMER_GETOVERRUN = 109 + SYS_TIMER_SETTIME = 110 + SYS_TIMER_DELETE = 111 + SYS_CLOCK_SETTIME = 112 + SYS_CLOCK_GETTIME = 113 + SYS_CLOCK_GETRES = 114 + SYS_CLOCK_NANOSLEEP = 115 + SYS_SYSLOG = 116 + SYS_PTRACE = 117 + SYS_SCHED_SETPARAM = 118 + SYS_SCHED_SETSCHEDULER = 119 + SYS_SCHED_GETSCHEDULER = 120 + SYS_SCHED_GETPARAM = 121 + SYS_SCHED_SETAFFINITY = 122 + SYS_SCHED_GETAFFINITY = 123 + SYS_SCHED_YIELD = 124 + SYS_SCHED_GET_PRIORITY_MAX = 125 + SYS_SCHED_GET_PRIORITY_MIN = 126 + SYS_SCHED_RR_GET_INTERVAL = 127 + SYS_RESTART_SYSCALL = 128 + SYS_KILL = 129 + SYS_TKILL = 130 + SYS_TGKILL = 131 + SYS_SIGALTSTACK = 132 + SYS_RT_SIGSUSPEND = 133 + SYS_RT_SIGACTION = 134 + SYS_RT_SIGPROCMASK = 135 + SYS_RT_SIGPENDING = 136 + SYS_RT_SIGTIMEDWAIT = 137 + SYS_RT_SIGQUEUEINFO = 138 + SYS_RT_SIGRETURN = 139 + SYS_SETPRIORITY = 140 + SYS_GETPRIORITY = 141 + SYS_REBOOT = 142 + SYS_SETREGID = 143 + SYS_SETGID = 144 + SYS_SETREUID = 145 + SYS_SETUID = 146 + SYS_SETRESUID = 147 + SYS_GETRESUID = 148 + SYS_SETRESGID = 149 + SYS_GETRESGID = 150 + SYS_SETFSUID = 151 + SYS_SETFSGID = 152 + SYS_TIMES = 153 + SYS_SETPGID = 154 + SYS_GETPGID = 155 + SYS_GETSID = 156 + SYS_SETSID = 157 + SYS_GETGROUPS = 158 + SYS_SETGROUPS = 159 + SYS_UNAME = 160 + SYS_SETHOSTNAME = 161 + SYS_SETDOMAINNAME = 162 + SYS_GETRLIMIT = 163 + SYS_SETRLIMIT = 164 + SYS_GETRUSAGE = 165 + SYS_UMASK = 166 + SYS_PRCTL = 167 + SYS_GETCPU = 168 + SYS_GETTIMEOFDAY = 169 + SYS_SETTIMEOFDAY = 170 + SYS_ADJTIMEX = 171 + SYS_GETPID = 172 + SYS_GETPPID = 173 + SYS_GETUID = 174 + SYS_GETEUID = 175 + SYS_GETGID = 176 + SYS_GETEGID = 177 + SYS_GETTID = 178 + SYS_SYSINFO = 179 + SYS_MQ_OPEN = 180 + SYS_MQ_UNLINK = 181 + SYS_MQ_TIMEDSEND = 182 + SYS_MQ_TIMEDRECEIVE = 183 + SYS_MQ_NOTIFY = 184 + SYS_MQ_GETSETATTR = 185 + SYS_MSGGET = 186 + SYS_MSGCTL = 187 + SYS_MSGRCV = 188 + SYS_MSGSND = 189 + SYS_SEMGET = 190 + SYS_SEMCTL = 191 + SYS_SEMTIMEDOP = 192 + SYS_SEMOP = 193 + SYS_SHMGET = 194 + SYS_SHMCTL = 195 + SYS_SHMAT = 196 + SYS_SHMDT = 197 + SYS_SOCKET = 198 + SYS_SOCKETPAIR = 199 + SYS_BIND = 200 + SYS_LISTEN = 201 + SYS_ACCEPT = 202 + SYS_CONNECT = 203 + SYS_GETSOCKNAME = 204 + SYS_GETPEERNAME = 205 + SYS_SENDTO = 206 + SYS_RECVFROM = 207 + SYS_SETSOCKOPT = 208 + SYS_GETSOCKOPT = 209 + SYS_SHUTDOWN = 210 + SYS_SENDMSG = 211 + SYS_RECVMSG = 212 + SYS_READAHEAD = 213 + SYS_BRK = 214 + SYS_MUNMAP = 215 + SYS_MREMAP = 216 + SYS_ADD_KEY = 217 + SYS_REQUEST_KEY = 218 + SYS_KEYCTL = 219 + SYS_CLONE = 220 + SYS_EXECVE = 221 + SYS_MMAP = 222 + SYS_FADVISE64 = 223 + SYS_SWAPON = 224 + SYS_SWAPOFF = 225 + SYS_MPROTECT = 226 + SYS_MSYNC = 227 + SYS_MLOCK = 228 + SYS_MUNLOCK = 229 + SYS_MLOCKALL = 230 + SYS_MUNLOCKALL = 231 + SYS_MINCORE = 232 + SYS_MADVISE = 233 + SYS_REMAP_FILE_PAGES = 234 + SYS_MBIND = 235 + SYS_GET_MEMPOLICY = 236 + SYS_SET_MEMPOLICY = 237 + SYS_MIGRATE_PAGES = 238 + SYS_MOVE_PAGES = 239 + SYS_RT_TGSIGQUEUEINFO = 240 + SYS_PERF_EVENT_OPEN = 241 + SYS_ACCEPT4 = 242 + SYS_RECVMMSG = 243 + SYS_ARCH_SPECIFIC_SYSCALL = 244 + SYS_WAIT4 = 260 + SYS_PRLIMIT64 = 261 + SYS_FANOTIFY_INIT = 262 + SYS_FANOTIFY_MARK = 263 + SYS_NAME_TO_HANDLE_AT = 264 + SYS_OPEN_BY_HANDLE_AT = 265 + SYS_CLOCK_ADJTIME = 266 + SYS_SYNCFS = 267 + SYS_SETNS = 268 + SYS_SENDMMSG = 269 + SYS_PROCESS_VM_READV = 270 + SYS_PROCESS_VM_WRITEV = 271 + SYS_KCMP = 272 + SYS_FINIT_MODULE = 273 + SYS_SCHED_SETATTR = 274 + SYS_SCHED_GETATTR = 275 + SYS_RENAMEAT2 = 276 + SYS_SECCOMP = 277 + SYS_GETRANDOM = 278 + SYS_MEMFD_CREATE = 279 + SYS_BPF = 280 + SYS_EXECVEAT = 281 + SYS_USERFAULTFD = 282 + SYS_MEMBARRIER = 283 + SYS_MLOCK2 = 284 + SYS_COPY_FILE_RANGE = 285 + SYS_PREADV2 = 286 + SYS_PWRITEV2 = 287 + SYS_PKEY_MPROTECT = 288 + SYS_PKEY_ALLOC = 289 + SYS_PKEY_FREE = 290 + SYS_STATX = 291 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go new file mode 100644 index 0000000..2e9aa7a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go @@ -0,0 +1,375 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mips,linux + +package unix + +const ( + SYS_SYSCALL = 4000 + SYS_EXIT = 4001 + SYS_FORK = 4002 + SYS_READ = 4003 + SYS_WRITE = 4004 + SYS_OPEN = 4005 + SYS_CLOSE = 4006 + SYS_WAITPID = 4007 + SYS_CREAT = 4008 + SYS_LINK = 4009 + SYS_UNLINK = 4010 + SYS_EXECVE = 4011 + SYS_CHDIR = 4012 + SYS_TIME = 4013 + SYS_MKNOD = 4014 + SYS_CHMOD = 4015 + SYS_LCHOWN = 4016 + SYS_BREAK = 4017 + SYS_UNUSED18 = 4018 + SYS_LSEEK = 4019 + SYS_GETPID = 4020 + SYS_MOUNT = 4021 + SYS_UMOUNT = 4022 + SYS_SETUID = 4023 + SYS_GETUID = 4024 + SYS_STIME = 4025 + SYS_PTRACE = 4026 + SYS_ALARM = 4027 + SYS_UNUSED28 = 4028 + SYS_PAUSE = 4029 + SYS_UTIME = 4030 + SYS_STTY = 4031 + SYS_GTTY = 4032 + SYS_ACCESS = 4033 + SYS_NICE = 4034 + SYS_FTIME = 4035 + SYS_SYNC = 4036 + SYS_KILL = 4037 + SYS_RENAME = 4038 + SYS_MKDIR = 4039 + SYS_RMDIR = 4040 + SYS_DUP = 4041 + SYS_PIPE = 4042 + SYS_TIMES = 4043 + SYS_PROF = 4044 + SYS_BRK = 4045 + SYS_SETGID = 4046 + SYS_GETGID = 4047 + SYS_SIGNAL = 4048 + SYS_GETEUID = 4049 + SYS_GETEGID = 4050 + SYS_ACCT = 4051 + SYS_UMOUNT2 = 4052 + SYS_LOCK = 4053 + SYS_IOCTL = 4054 + SYS_FCNTL = 4055 + SYS_MPX = 4056 + SYS_SETPGID = 4057 + SYS_ULIMIT = 4058 + SYS_UNUSED59 = 4059 + SYS_UMASK = 4060 + SYS_CHROOT = 4061 + SYS_USTAT = 4062 + SYS_DUP2 = 4063 + SYS_GETPPID = 4064 + SYS_GETPGRP = 4065 + SYS_SETSID = 4066 + SYS_SIGACTION = 4067 + SYS_SGETMASK = 4068 + SYS_SSETMASK = 4069 + SYS_SETREUID = 4070 + SYS_SETREGID = 4071 + SYS_SIGSUSPEND = 4072 + SYS_SIGPENDING = 4073 + SYS_SETHOSTNAME = 4074 + SYS_SETRLIMIT = 4075 + SYS_GETRLIMIT = 4076 + SYS_GETRUSAGE = 4077 + SYS_GETTIMEOFDAY = 4078 + SYS_SETTIMEOFDAY = 4079 + SYS_GETGROUPS = 4080 + SYS_SETGROUPS = 4081 + SYS_RESERVED82 = 4082 + SYS_SYMLINK = 4083 + SYS_UNUSED84 = 4084 + SYS_READLINK = 4085 + SYS_USELIB = 4086 + SYS_SWAPON = 4087 + SYS_REBOOT = 4088 + SYS_READDIR = 4089 + SYS_MMAP = 4090 + SYS_MUNMAP = 4091 + SYS_TRUNCATE = 4092 + SYS_FTRUNCATE = 4093 + SYS_FCHMOD = 4094 + SYS_FCHOWN = 4095 + SYS_GETPRIORITY = 4096 + SYS_SETPRIORITY = 4097 + SYS_PROFIL = 4098 + SYS_STATFS = 4099 + SYS_FSTATFS = 4100 + SYS_IOPERM = 4101 + SYS_SOCKETCALL = 4102 + SYS_SYSLOG = 4103 + SYS_SETITIMER = 4104 + SYS_GETITIMER = 4105 + SYS_STAT = 4106 + SYS_LSTAT = 4107 + SYS_FSTAT = 4108 + SYS_UNUSED109 = 4109 + SYS_IOPL = 4110 + SYS_VHANGUP = 4111 + SYS_IDLE = 4112 + SYS_VM86 = 4113 + SYS_WAIT4 = 4114 + SYS_SWAPOFF = 4115 + SYS_SYSINFO = 4116 + SYS_IPC = 4117 + SYS_FSYNC = 4118 + SYS_SIGRETURN = 4119 + SYS_CLONE = 4120 + SYS_SETDOMAINNAME = 4121 + SYS_UNAME = 4122 + SYS_MODIFY_LDT = 4123 + SYS_ADJTIMEX = 4124 + SYS_MPROTECT = 4125 + SYS_SIGPROCMASK = 4126 + SYS_CREATE_MODULE = 4127 + SYS_INIT_MODULE = 4128 + SYS_DELETE_MODULE = 4129 + SYS_GET_KERNEL_SYMS = 4130 + SYS_QUOTACTL = 4131 + SYS_GETPGID = 4132 + SYS_FCHDIR = 4133 + SYS_BDFLUSH = 4134 + SYS_SYSFS = 4135 + SYS_PERSONALITY = 4136 + SYS_AFS_SYSCALL = 4137 + SYS_SETFSUID = 4138 + SYS_SETFSGID = 4139 + SYS__LLSEEK = 4140 + SYS_GETDENTS = 4141 + SYS__NEWSELECT = 4142 + SYS_FLOCK = 4143 + SYS_MSYNC = 4144 + SYS_READV = 4145 + SYS_WRITEV = 4146 + SYS_CACHEFLUSH = 4147 + SYS_CACHECTL = 4148 + SYS_SYSMIPS = 4149 + SYS_UNUSED150 = 4150 + SYS_GETSID = 4151 + SYS_FDATASYNC = 4152 + SYS__SYSCTL = 4153 + SYS_MLOCK = 4154 + SYS_MUNLOCK = 4155 + SYS_MLOCKALL = 4156 + SYS_MUNLOCKALL = 4157 + SYS_SCHED_SETPARAM = 4158 + SYS_SCHED_GETPARAM = 4159 + SYS_SCHED_SETSCHEDULER = 4160 + SYS_SCHED_GETSCHEDULER = 4161 + SYS_SCHED_YIELD = 4162 + SYS_SCHED_GET_PRIORITY_MAX = 4163 + SYS_SCHED_GET_PRIORITY_MIN = 4164 + SYS_SCHED_RR_GET_INTERVAL = 4165 + SYS_NANOSLEEP = 4166 + SYS_MREMAP = 4167 + SYS_ACCEPT = 4168 + SYS_BIND = 4169 + SYS_CONNECT = 4170 + SYS_GETPEERNAME = 4171 + SYS_GETSOCKNAME = 4172 + SYS_GETSOCKOPT = 4173 + SYS_LISTEN = 4174 + SYS_RECV = 4175 + SYS_RECVFROM = 4176 + SYS_RECVMSG = 4177 + SYS_SEND = 4178 + SYS_SENDMSG = 4179 + SYS_SENDTO = 4180 + SYS_SETSOCKOPT = 4181 + SYS_SHUTDOWN = 4182 + SYS_SOCKET = 4183 + SYS_SOCKETPAIR = 4184 + SYS_SETRESUID = 4185 + SYS_GETRESUID = 4186 + SYS_QUERY_MODULE = 4187 + SYS_POLL = 4188 + SYS_NFSSERVCTL = 4189 + SYS_SETRESGID = 4190 + SYS_GETRESGID = 4191 + SYS_PRCTL = 4192 + SYS_RT_SIGRETURN = 4193 + SYS_RT_SIGACTION = 4194 + SYS_RT_SIGPROCMASK = 4195 + SYS_RT_SIGPENDING = 4196 + SYS_RT_SIGTIMEDWAIT = 4197 + SYS_RT_SIGQUEUEINFO = 4198 + SYS_RT_SIGSUSPEND = 4199 + SYS_PREAD64 = 4200 + SYS_PWRITE64 = 4201 + SYS_CHOWN = 4202 + SYS_GETCWD = 4203 + SYS_CAPGET = 4204 + SYS_CAPSET = 4205 + SYS_SIGALTSTACK = 4206 + SYS_SENDFILE = 4207 + SYS_GETPMSG = 4208 + SYS_PUTPMSG = 4209 + SYS_MMAP2 = 4210 + SYS_TRUNCATE64 = 4211 + SYS_FTRUNCATE64 = 4212 + SYS_STAT64 = 4213 + SYS_LSTAT64 = 4214 + SYS_FSTAT64 = 4215 + SYS_PIVOT_ROOT = 4216 + SYS_MINCORE = 4217 + SYS_MADVISE = 4218 + SYS_GETDENTS64 = 4219 + SYS_FCNTL64 = 4220 + SYS_RESERVED221 = 4221 + SYS_GETTID = 4222 + SYS_READAHEAD = 4223 + SYS_SETXATTR = 4224 + SYS_LSETXATTR = 4225 + SYS_FSETXATTR = 4226 + SYS_GETXATTR = 4227 + SYS_LGETXATTR = 4228 + SYS_FGETXATTR = 4229 + SYS_LISTXATTR = 4230 + SYS_LLISTXATTR = 4231 + SYS_FLISTXATTR = 4232 + SYS_REMOVEXATTR = 4233 + SYS_LREMOVEXATTR = 4234 + SYS_FREMOVEXATTR = 4235 + SYS_TKILL = 4236 + SYS_SENDFILE64 = 4237 + SYS_FUTEX = 4238 + SYS_SCHED_SETAFFINITY = 4239 + SYS_SCHED_GETAFFINITY = 4240 + SYS_IO_SETUP = 4241 + SYS_IO_DESTROY = 4242 + SYS_IO_GETEVENTS = 4243 + SYS_IO_SUBMIT = 4244 + SYS_IO_CANCEL = 4245 + SYS_EXIT_GROUP = 4246 + SYS_LOOKUP_DCOOKIE = 4247 + SYS_EPOLL_CREATE = 4248 + SYS_EPOLL_CTL = 4249 + SYS_EPOLL_WAIT = 4250 + SYS_REMAP_FILE_PAGES = 4251 + SYS_SET_TID_ADDRESS = 4252 + SYS_RESTART_SYSCALL = 4253 + SYS_FADVISE64 = 4254 + SYS_STATFS64 = 4255 + SYS_FSTATFS64 = 4256 + SYS_TIMER_CREATE = 4257 + SYS_TIMER_SETTIME = 4258 + SYS_TIMER_GETTIME = 4259 + SYS_TIMER_GETOVERRUN = 4260 + SYS_TIMER_DELETE = 4261 + SYS_CLOCK_SETTIME = 4262 + SYS_CLOCK_GETTIME = 4263 + SYS_CLOCK_GETRES = 4264 + SYS_CLOCK_NANOSLEEP = 4265 + SYS_TGKILL = 4266 + SYS_UTIMES = 4267 + SYS_MBIND = 4268 + SYS_GET_MEMPOLICY = 4269 + SYS_SET_MEMPOLICY = 4270 + SYS_MQ_OPEN = 4271 + SYS_MQ_UNLINK = 4272 + SYS_MQ_TIMEDSEND = 4273 + SYS_MQ_TIMEDRECEIVE = 4274 + SYS_MQ_NOTIFY = 4275 + SYS_MQ_GETSETATTR = 4276 + SYS_VSERVER = 4277 + SYS_WAITID = 4278 + SYS_ADD_KEY = 4280 + SYS_REQUEST_KEY = 4281 + SYS_KEYCTL = 4282 + SYS_SET_THREAD_AREA = 4283 + SYS_INOTIFY_INIT = 4284 + SYS_INOTIFY_ADD_WATCH = 4285 + SYS_INOTIFY_RM_WATCH = 4286 + SYS_MIGRATE_PAGES = 4287 + SYS_OPENAT = 4288 + SYS_MKDIRAT = 4289 + SYS_MKNODAT = 4290 + SYS_FCHOWNAT = 4291 + SYS_FUTIMESAT = 4292 + SYS_FSTATAT64 = 4293 + SYS_UNLINKAT = 4294 + SYS_RENAMEAT = 4295 + SYS_LINKAT = 4296 + SYS_SYMLINKAT = 4297 + SYS_READLINKAT = 4298 + SYS_FCHMODAT = 4299 + SYS_FACCESSAT = 4300 + SYS_PSELECT6 = 4301 + SYS_PPOLL = 4302 + SYS_UNSHARE = 4303 + SYS_SPLICE = 4304 + SYS_SYNC_FILE_RANGE = 4305 + SYS_TEE = 4306 + SYS_VMSPLICE = 4307 + SYS_MOVE_PAGES = 4308 + SYS_SET_ROBUST_LIST = 4309 + SYS_GET_ROBUST_LIST = 4310 + SYS_KEXEC_LOAD = 4311 + SYS_GETCPU = 4312 + SYS_EPOLL_PWAIT = 4313 + SYS_IOPRIO_SET = 4314 + SYS_IOPRIO_GET = 4315 + SYS_UTIMENSAT = 4316 + SYS_SIGNALFD = 4317 + SYS_TIMERFD = 4318 + SYS_EVENTFD = 4319 + SYS_FALLOCATE = 4320 + SYS_TIMERFD_CREATE = 4321 + SYS_TIMERFD_GETTIME = 4322 + SYS_TIMERFD_SETTIME = 4323 + SYS_SIGNALFD4 = 4324 + SYS_EVENTFD2 = 4325 + SYS_EPOLL_CREATE1 = 4326 + SYS_DUP3 = 4327 + SYS_PIPE2 = 4328 + SYS_INOTIFY_INIT1 = 4329 + SYS_PREADV = 4330 + SYS_PWRITEV = 4331 + SYS_RT_TGSIGQUEUEINFO = 4332 + SYS_PERF_EVENT_OPEN = 4333 + SYS_ACCEPT4 = 4334 + SYS_RECVMMSG = 4335 + SYS_FANOTIFY_INIT = 4336 + SYS_FANOTIFY_MARK = 4337 + SYS_PRLIMIT64 = 4338 + SYS_NAME_TO_HANDLE_AT = 4339 + SYS_OPEN_BY_HANDLE_AT = 4340 + SYS_CLOCK_ADJTIME = 4341 + SYS_SYNCFS = 4342 + SYS_SENDMMSG = 4343 + SYS_SETNS = 4344 + SYS_PROCESS_VM_READV = 4345 + SYS_PROCESS_VM_WRITEV = 4346 + SYS_KCMP = 4347 + SYS_FINIT_MODULE = 4348 + SYS_SCHED_SETATTR = 4349 + SYS_SCHED_GETATTR = 4350 + SYS_RENAMEAT2 = 4351 + SYS_SECCOMP = 4352 + SYS_GETRANDOM = 4353 + SYS_MEMFD_CREATE = 4354 + SYS_BPF = 4355 + SYS_EXECVEAT = 4356 + SYS_USERFAULTFD = 4357 + SYS_MEMBARRIER = 4358 + SYS_MLOCK2 = 4359 + SYS_COPY_FILE_RANGE = 4360 + SYS_PREADV2 = 4361 + SYS_PWRITEV2 = 4362 + SYS_PKEY_MPROTECT = 4363 + SYS_PKEY_ALLOC = 4364 + SYS_PKEY_FREE = 4365 + SYS_STATX = 4366 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go new file mode 100644 index 0000000..9282763 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go @@ -0,0 +1,335 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mips64,linux + +package unix + +const ( + SYS_READ = 5000 + SYS_WRITE = 5001 + SYS_OPEN = 5002 + SYS_CLOSE = 5003 + SYS_STAT = 5004 + SYS_FSTAT = 5005 + SYS_LSTAT = 5006 + SYS_POLL = 5007 + SYS_LSEEK = 5008 + SYS_MMAP = 5009 + SYS_MPROTECT = 5010 + SYS_MUNMAP = 5011 + SYS_BRK = 5012 + SYS_RT_SIGACTION = 5013 + SYS_RT_SIGPROCMASK = 5014 + SYS_IOCTL = 5015 + SYS_PREAD64 = 5016 + SYS_PWRITE64 = 5017 + SYS_READV = 5018 + SYS_WRITEV = 5019 + SYS_ACCESS = 5020 + SYS_PIPE = 5021 + SYS__NEWSELECT = 5022 + SYS_SCHED_YIELD = 5023 + SYS_MREMAP = 5024 + SYS_MSYNC = 5025 + SYS_MINCORE = 5026 + SYS_MADVISE = 5027 + SYS_SHMGET = 5028 + SYS_SHMAT = 5029 + SYS_SHMCTL = 5030 + SYS_DUP = 5031 + SYS_DUP2 = 5032 + SYS_PAUSE = 5033 + SYS_NANOSLEEP = 5034 + SYS_GETITIMER = 5035 + SYS_SETITIMER = 5036 + SYS_ALARM = 5037 + SYS_GETPID = 5038 + SYS_SENDFILE = 5039 + SYS_SOCKET = 5040 + SYS_CONNECT = 5041 + SYS_ACCEPT = 5042 + SYS_SENDTO = 5043 + SYS_RECVFROM = 5044 + SYS_SENDMSG = 5045 + SYS_RECVMSG = 5046 + SYS_SHUTDOWN = 5047 + SYS_BIND = 5048 + SYS_LISTEN = 5049 + SYS_GETSOCKNAME = 5050 + SYS_GETPEERNAME = 5051 + SYS_SOCKETPAIR = 5052 + SYS_SETSOCKOPT = 5053 + SYS_GETSOCKOPT = 5054 + SYS_CLONE = 5055 + SYS_FORK = 5056 + SYS_EXECVE = 5057 + SYS_EXIT = 5058 + SYS_WAIT4 = 5059 + SYS_KILL = 5060 + SYS_UNAME = 5061 + SYS_SEMGET = 5062 + SYS_SEMOP = 5063 + SYS_SEMCTL = 5064 + SYS_SHMDT = 5065 + SYS_MSGGET = 5066 + SYS_MSGSND = 5067 + SYS_MSGRCV = 5068 + SYS_MSGCTL = 5069 + SYS_FCNTL = 5070 + SYS_FLOCK = 5071 + SYS_FSYNC = 5072 + SYS_FDATASYNC = 5073 + SYS_TRUNCATE = 5074 + SYS_FTRUNCATE = 5075 + SYS_GETDENTS = 5076 + SYS_GETCWD = 5077 + SYS_CHDIR = 5078 + SYS_FCHDIR = 5079 + SYS_RENAME = 5080 + SYS_MKDIR = 5081 + SYS_RMDIR = 5082 + SYS_CREAT = 5083 + SYS_LINK = 5084 + SYS_UNLINK = 5085 + SYS_SYMLINK = 5086 + SYS_READLINK = 5087 + SYS_CHMOD = 5088 + SYS_FCHMOD = 5089 + SYS_CHOWN = 5090 + SYS_FCHOWN = 5091 + SYS_LCHOWN = 5092 + SYS_UMASK = 5093 + SYS_GETTIMEOFDAY = 5094 + SYS_GETRLIMIT = 5095 + SYS_GETRUSAGE = 5096 + SYS_SYSINFO = 5097 + SYS_TIMES = 5098 + SYS_PTRACE = 5099 + SYS_GETUID = 5100 + SYS_SYSLOG = 5101 + SYS_GETGID = 5102 + SYS_SETUID = 5103 + SYS_SETGID = 5104 + SYS_GETEUID = 5105 + SYS_GETEGID = 5106 + SYS_SETPGID = 5107 + SYS_GETPPID = 5108 + SYS_GETPGRP = 5109 + SYS_SETSID = 5110 + SYS_SETREUID = 5111 + SYS_SETREGID = 5112 + SYS_GETGROUPS = 5113 + SYS_SETGROUPS = 5114 + SYS_SETRESUID = 5115 + SYS_GETRESUID = 5116 + SYS_SETRESGID = 5117 + SYS_GETRESGID = 5118 + SYS_GETPGID = 5119 + SYS_SETFSUID = 5120 + SYS_SETFSGID = 5121 + SYS_GETSID = 5122 + SYS_CAPGET = 5123 + SYS_CAPSET = 5124 + SYS_RT_SIGPENDING = 5125 + SYS_RT_SIGTIMEDWAIT = 5126 + SYS_RT_SIGQUEUEINFO = 5127 + SYS_RT_SIGSUSPEND = 5128 + SYS_SIGALTSTACK = 5129 + SYS_UTIME = 5130 + SYS_MKNOD = 5131 + SYS_PERSONALITY = 5132 + SYS_USTAT = 5133 + SYS_STATFS = 5134 + SYS_FSTATFS = 5135 + SYS_SYSFS = 5136 + SYS_GETPRIORITY = 5137 + SYS_SETPRIORITY = 5138 + SYS_SCHED_SETPARAM = 5139 + SYS_SCHED_GETPARAM = 5140 + SYS_SCHED_SETSCHEDULER = 5141 + SYS_SCHED_GETSCHEDULER = 5142 + SYS_SCHED_GET_PRIORITY_MAX = 5143 + SYS_SCHED_GET_PRIORITY_MIN = 5144 + SYS_SCHED_RR_GET_INTERVAL = 5145 + SYS_MLOCK = 5146 + SYS_MUNLOCK = 5147 + SYS_MLOCKALL = 5148 + SYS_MUNLOCKALL = 5149 + SYS_VHANGUP = 5150 + SYS_PIVOT_ROOT = 5151 + SYS__SYSCTL = 5152 + SYS_PRCTL = 5153 + SYS_ADJTIMEX = 5154 + SYS_SETRLIMIT = 5155 + SYS_CHROOT = 5156 + SYS_SYNC = 5157 + SYS_ACCT = 5158 + SYS_SETTIMEOFDAY = 5159 + SYS_MOUNT = 5160 + SYS_UMOUNT2 = 5161 + SYS_SWAPON = 5162 + SYS_SWAPOFF = 5163 + SYS_REBOOT = 5164 + SYS_SETHOSTNAME = 5165 + SYS_SETDOMAINNAME = 5166 + SYS_CREATE_MODULE = 5167 + SYS_INIT_MODULE = 5168 + SYS_DELETE_MODULE = 5169 + SYS_GET_KERNEL_SYMS = 5170 + SYS_QUERY_MODULE = 5171 + SYS_QUOTACTL = 5172 + SYS_NFSSERVCTL = 5173 + SYS_GETPMSG = 5174 + SYS_PUTPMSG = 5175 + SYS_AFS_SYSCALL = 5176 + SYS_RESERVED177 = 5177 + SYS_GETTID = 5178 + SYS_READAHEAD = 5179 + SYS_SETXATTR = 5180 + SYS_LSETXATTR = 5181 + SYS_FSETXATTR = 5182 + SYS_GETXATTR = 5183 + SYS_LGETXATTR = 5184 + SYS_FGETXATTR = 5185 + SYS_LISTXATTR = 5186 + SYS_LLISTXATTR = 5187 + SYS_FLISTXATTR = 5188 + SYS_REMOVEXATTR = 5189 + SYS_LREMOVEXATTR = 5190 + SYS_FREMOVEXATTR = 5191 + SYS_TKILL = 5192 + SYS_RESERVED193 = 5193 + SYS_FUTEX = 5194 + SYS_SCHED_SETAFFINITY = 5195 + SYS_SCHED_GETAFFINITY = 5196 + SYS_CACHEFLUSH = 5197 + SYS_CACHECTL = 5198 + SYS_SYSMIPS = 5199 + SYS_IO_SETUP = 5200 + SYS_IO_DESTROY = 5201 + SYS_IO_GETEVENTS = 5202 + SYS_IO_SUBMIT = 5203 + SYS_IO_CANCEL = 5204 + SYS_EXIT_GROUP = 5205 + SYS_LOOKUP_DCOOKIE = 5206 + SYS_EPOLL_CREATE = 5207 + SYS_EPOLL_CTL = 5208 + SYS_EPOLL_WAIT = 5209 + SYS_REMAP_FILE_PAGES = 5210 + SYS_RT_SIGRETURN = 5211 + SYS_SET_TID_ADDRESS = 5212 + SYS_RESTART_SYSCALL = 5213 + SYS_SEMTIMEDOP = 5214 + SYS_FADVISE64 = 5215 + SYS_TIMER_CREATE = 5216 + SYS_TIMER_SETTIME = 5217 + SYS_TIMER_GETTIME = 5218 + SYS_TIMER_GETOVERRUN = 5219 + SYS_TIMER_DELETE = 5220 + SYS_CLOCK_SETTIME = 5221 + SYS_CLOCK_GETTIME = 5222 + SYS_CLOCK_GETRES = 5223 + SYS_CLOCK_NANOSLEEP = 5224 + SYS_TGKILL = 5225 + SYS_UTIMES = 5226 + SYS_MBIND = 5227 + SYS_GET_MEMPOLICY = 5228 + SYS_SET_MEMPOLICY = 5229 + SYS_MQ_OPEN = 5230 + SYS_MQ_UNLINK = 5231 + SYS_MQ_TIMEDSEND = 5232 + SYS_MQ_TIMEDRECEIVE = 5233 + SYS_MQ_NOTIFY = 5234 + SYS_MQ_GETSETATTR = 5235 + SYS_VSERVER = 5236 + SYS_WAITID = 5237 + SYS_ADD_KEY = 5239 + SYS_REQUEST_KEY = 5240 + SYS_KEYCTL = 5241 + SYS_SET_THREAD_AREA = 5242 + SYS_INOTIFY_INIT = 5243 + SYS_INOTIFY_ADD_WATCH = 5244 + SYS_INOTIFY_RM_WATCH = 5245 + SYS_MIGRATE_PAGES = 5246 + SYS_OPENAT = 5247 + SYS_MKDIRAT = 5248 + SYS_MKNODAT = 5249 + SYS_FCHOWNAT = 5250 + SYS_FUTIMESAT = 5251 + SYS_NEWFSTATAT = 5252 + SYS_UNLINKAT = 5253 + SYS_RENAMEAT = 5254 + SYS_LINKAT = 5255 + SYS_SYMLINKAT = 5256 + SYS_READLINKAT = 5257 + SYS_FCHMODAT = 5258 + SYS_FACCESSAT = 5259 + SYS_PSELECT6 = 5260 + SYS_PPOLL = 5261 + SYS_UNSHARE = 5262 + SYS_SPLICE = 5263 + SYS_SYNC_FILE_RANGE = 5264 + SYS_TEE = 5265 + SYS_VMSPLICE = 5266 + SYS_MOVE_PAGES = 5267 + SYS_SET_ROBUST_LIST = 5268 + SYS_GET_ROBUST_LIST = 5269 + SYS_KEXEC_LOAD = 5270 + SYS_GETCPU = 5271 + SYS_EPOLL_PWAIT = 5272 + SYS_IOPRIO_SET = 5273 + SYS_IOPRIO_GET = 5274 + SYS_UTIMENSAT = 5275 + SYS_SIGNALFD = 5276 + SYS_TIMERFD = 5277 + SYS_EVENTFD = 5278 + SYS_FALLOCATE = 5279 + SYS_TIMERFD_CREATE = 5280 + SYS_TIMERFD_GETTIME = 5281 + SYS_TIMERFD_SETTIME = 5282 + SYS_SIGNALFD4 = 5283 + SYS_EVENTFD2 = 5284 + SYS_EPOLL_CREATE1 = 5285 + SYS_DUP3 = 5286 + SYS_PIPE2 = 5287 + SYS_INOTIFY_INIT1 = 5288 + SYS_PREADV = 5289 + SYS_PWRITEV = 5290 + SYS_RT_TGSIGQUEUEINFO = 5291 + SYS_PERF_EVENT_OPEN = 5292 + SYS_ACCEPT4 = 5293 + SYS_RECVMMSG = 5294 + SYS_FANOTIFY_INIT = 5295 + SYS_FANOTIFY_MARK = 5296 + SYS_PRLIMIT64 = 5297 + SYS_NAME_TO_HANDLE_AT = 5298 + SYS_OPEN_BY_HANDLE_AT = 5299 + SYS_CLOCK_ADJTIME = 5300 + SYS_SYNCFS = 5301 + SYS_SENDMMSG = 5302 + SYS_SETNS = 5303 + SYS_PROCESS_VM_READV = 5304 + SYS_PROCESS_VM_WRITEV = 5305 + SYS_KCMP = 5306 + SYS_FINIT_MODULE = 5307 + SYS_GETDENTS64 = 5308 + SYS_SCHED_SETATTR = 5309 + SYS_SCHED_GETATTR = 5310 + SYS_RENAMEAT2 = 5311 + SYS_SECCOMP = 5312 + SYS_GETRANDOM = 5313 + SYS_MEMFD_CREATE = 5314 + SYS_BPF = 5315 + SYS_EXECVEAT = 5316 + SYS_USERFAULTFD = 5317 + SYS_MEMBARRIER = 5318 + SYS_MLOCK2 = 5319 + SYS_COPY_FILE_RANGE = 5320 + SYS_PREADV2 = 5321 + SYS_PWRITEV2 = 5322 + SYS_PKEY_MPROTECT = 5323 + SYS_PKEY_ALLOC = 5324 + SYS_PKEY_FREE = 5325 + SYS_STATX = 5326 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go new file mode 100644 index 0000000..45bd3fd --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go @@ -0,0 +1,335 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mips64le,linux + +package unix + +const ( + SYS_READ = 5000 + SYS_WRITE = 5001 + SYS_OPEN = 5002 + SYS_CLOSE = 5003 + SYS_STAT = 5004 + SYS_FSTAT = 5005 + SYS_LSTAT = 5006 + SYS_POLL = 5007 + SYS_LSEEK = 5008 + SYS_MMAP = 5009 + SYS_MPROTECT = 5010 + SYS_MUNMAP = 5011 + SYS_BRK = 5012 + SYS_RT_SIGACTION = 5013 + SYS_RT_SIGPROCMASK = 5014 + SYS_IOCTL = 5015 + SYS_PREAD64 = 5016 + SYS_PWRITE64 = 5017 + SYS_READV = 5018 + SYS_WRITEV = 5019 + SYS_ACCESS = 5020 + SYS_PIPE = 5021 + SYS__NEWSELECT = 5022 + SYS_SCHED_YIELD = 5023 + SYS_MREMAP = 5024 + SYS_MSYNC = 5025 + SYS_MINCORE = 5026 + SYS_MADVISE = 5027 + SYS_SHMGET = 5028 + SYS_SHMAT = 5029 + SYS_SHMCTL = 5030 + SYS_DUP = 5031 + SYS_DUP2 = 5032 + SYS_PAUSE = 5033 + SYS_NANOSLEEP = 5034 + SYS_GETITIMER = 5035 + SYS_SETITIMER = 5036 + SYS_ALARM = 5037 + SYS_GETPID = 5038 + SYS_SENDFILE = 5039 + SYS_SOCKET = 5040 + SYS_CONNECT = 5041 + SYS_ACCEPT = 5042 + SYS_SENDTO = 5043 + SYS_RECVFROM = 5044 + SYS_SENDMSG = 5045 + SYS_RECVMSG = 5046 + SYS_SHUTDOWN = 5047 + SYS_BIND = 5048 + SYS_LISTEN = 5049 + SYS_GETSOCKNAME = 5050 + SYS_GETPEERNAME = 5051 + SYS_SOCKETPAIR = 5052 + SYS_SETSOCKOPT = 5053 + SYS_GETSOCKOPT = 5054 + SYS_CLONE = 5055 + SYS_FORK = 5056 + SYS_EXECVE = 5057 + SYS_EXIT = 5058 + SYS_WAIT4 = 5059 + SYS_KILL = 5060 + SYS_UNAME = 5061 + SYS_SEMGET = 5062 + SYS_SEMOP = 5063 + SYS_SEMCTL = 5064 + SYS_SHMDT = 5065 + SYS_MSGGET = 5066 + SYS_MSGSND = 5067 + SYS_MSGRCV = 5068 + SYS_MSGCTL = 5069 + SYS_FCNTL = 5070 + SYS_FLOCK = 5071 + SYS_FSYNC = 5072 + SYS_FDATASYNC = 5073 + SYS_TRUNCATE = 5074 + SYS_FTRUNCATE = 5075 + SYS_GETDENTS = 5076 + SYS_GETCWD = 5077 + SYS_CHDIR = 5078 + SYS_FCHDIR = 5079 + SYS_RENAME = 5080 + SYS_MKDIR = 5081 + SYS_RMDIR = 5082 + SYS_CREAT = 5083 + SYS_LINK = 5084 + SYS_UNLINK = 5085 + SYS_SYMLINK = 5086 + SYS_READLINK = 5087 + SYS_CHMOD = 5088 + SYS_FCHMOD = 5089 + SYS_CHOWN = 5090 + SYS_FCHOWN = 5091 + SYS_LCHOWN = 5092 + SYS_UMASK = 5093 + SYS_GETTIMEOFDAY = 5094 + SYS_GETRLIMIT = 5095 + SYS_GETRUSAGE = 5096 + SYS_SYSINFO = 5097 + SYS_TIMES = 5098 + SYS_PTRACE = 5099 + SYS_GETUID = 5100 + SYS_SYSLOG = 5101 + SYS_GETGID = 5102 + SYS_SETUID = 5103 + SYS_SETGID = 5104 + SYS_GETEUID = 5105 + SYS_GETEGID = 5106 + SYS_SETPGID = 5107 + SYS_GETPPID = 5108 + SYS_GETPGRP = 5109 + SYS_SETSID = 5110 + SYS_SETREUID = 5111 + SYS_SETREGID = 5112 + SYS_GETGROUPS = 5113 + SYS_SETGROUPS = 5114 + SYS_SETRESUID = 5115 + SYS_GETRESUID = 5116 + SYS_SETRESGID = 5117 + SYS_GETRESGID = 5118 + SYS_GETPGID = 5119 + SYS_SETFSUID = 5120 + SYS_SETFSGID = 5121 + SYS_GETSID = 5122 + SYS_CAPGET = 5123 + SYS_CAPSET = 5124 + SYS_RT_SIGPENDING = 5125 + SYS_RT_SIGTIMEDWAIT = 5126 + SYS_RT_SIGQUEUEINFO = 5127 + SYS_RT_SIGSUSPEND = 5128 + SYS_SIGALTSTACK = 5129 + SYS_UTIME = 5130 + SYS_MKNOD = 5131 + SYS_PERSONALITY = 5132 + SYS_USTAT = 5133 + SYS_STATFS = 5134 + SYS_FSTATFS = 5135 + SYS_SYSFS = 5136 + SYS_GETPRIORITY = 5137 + SYS_SETPRIORITY = 5138 + SYS_SCHED_SETPARAM = 5139 + SYS_SCHED_GETPARAM = 5140 + SYS_SCHED_SETSCHEDULER = 5141 + SYS_SCHED_GETSCHEDULER = 5142 + SYS_SCHED_GET_PRIORITY_MAX = 5143 + SYS_SCHED_GET_PRIORITY_MIN = 5144 + SYS_SCHED_RR_GET_INTERVAL = 5145 + SYS_MLOCK = 5146 + SYS_MUNLOCK = 5147 + SYS_MLOCKALL = 5148 + SYS_MUNLOCKALL = 5149 + SYS_VHANGUP = 5150 + SYS_PIVOT_ROOT = 5151 + SYS__SYSCTL = 5152 + SYS_PRCTL = 5153 + SYS_ADJTIMEX = 5154 + SYS_SETRLIMIT = 5155 + SYS_CHROOT = 5156 + SYS_SYNC = 5157 + SYS_ACCT = 5158 + SYS_SETTIMEOFDAY = 5159 + SYS_MOUNT = 5160 + SYS_UMOUNT2 = 5161 + SYS_SWAPON = 5162 + SYS_SWAPOFF = 5163 + SYS_REBOOT = 5164 + SYS_SETHOSTNAME = 5165 + SYS_SETDOMAINNAME = 5166 + SYS_CREATE_MODULE = 5167 + SYS_INIT_MODULE = 5168 + SYS_DELETE_MODULE = 5169 + SYS_GET_KERNEL_SYMS = 5170 + SYS_QUERY_MODULE = 5171 + SYS_QUOTACTL = 5172 + SYS_NFSSERVCTL = 5173 + SYS_GETPMSG = 5174 + SYS_PUTPMSG = 5175 + SYS_AFS_SYSCALL = 5176 + SYS_RESERVED177 = 5177 + SYS_GETTID = 5178 + SYS_READAHEAD = 5179 + SYS_SETXATTR = 5180 + SYS_LSETXATTR = 5181 + SYS_FSETXATTR = 5182 + SYS_GETXATTR = 5183 + SYS_LGETXATTR = 5184 + SYS_FGETXATTR = 5185 + SYS_LISTXATTR = 5186 + SYS_LLISTXATTR = 5187 + SYS_FLISTXATTR = 5188 + SYS_REMOVEXATTR = 5189 + SYS_LREMOVEXATTR = 5190 + SYS_FREMOVEXATTR = 5191 + SYS_TKILL = 5192 + SYS_RESERVED193 = 5193 + SYS_FUTEX = 5194 + SYS_SCHED_SETAFFINITY = 5195 + SYS_SCHED_GETAFFINITY = 5196 + SYS_CACHEFLUSH = 5197 + SYS_CACHECTL = 5198 + SYS_SYSMIPS = 5199 + SYS_IO_SETUP = 5200 + SYS_IO_DESTROY = 5201 + SYS_IO_GETEVENTS = 5202 + SYS_IO_SUBMIT = 5203 + SYS_IO_CANCEL = 5204 + SYS_EXIT_GROUP = 5205 + SYS_LOOKUP_DCOOKIE = 5206 + SYS_EPOLL_CREATE = 5207 + SYS_EPOLL_CTL = 5208 + SYS_EPOLL_WAIT = 5209 + SYS_REMAP_FILE_PAGES = 5210 + SYS_RT_SIGRETURN = 5211 + SYS_SET_TID_ADDRESS = 5212 + SYS_RESTART_SYSCALL = 5213 + SYS_SEMTIMEDOP = 5214 + SYS_FADVISE64 = 5215 + SYS_TIMER_CREATE = 5216 + SYS_TIMER_SETTIME = 5217 + SYS_TIMER_GETTIME = 5218 + SYS_TIMER_GETOVERRUN = 5219 + SYS_TIMER_DELETE = 5220 + SYS_CLOCK_SETTIME = 5221 + SYS_CLOCK_GETTIME = 5222 + SYS_CLOCK_GETRES = 5223 + SYS_CLOCK_NANOSLEEP = 5224 + SYS_TGKILL = 5225 + SYS_UTIMES = 5226 + SYS_MBIND = 5227 + SYS_GET_MEMPOLICY = 5228 + SYS_SET_MEMPOLICY = 5229 + SYS_MQ_OPEN = 5230 + SYS_MQ_UNLINK = 5231 + SYS_MQ_TIMEDSEND = 5232 + SYS_MQ_TIMEDRECEIVE = 5233 + SYS_MQ_NOTIFY = 5234 + SYS_MQ_GETSETATTR = 5235 + SYS_VSERVER = 5236 + SYS_WAITID = 5237 + SYS_ADD_KEY = 5239 + SYS_REQUEST_KEY = 5240 + SYS_KEYCTL = 5241 + SYS_SET_THREAD_AREA = 5242 + SYS_INOTIFY_INIT = 5243 + SYS_INOTIFY_ADD_WATCH = 5244 + SYS_INOTIFY_RM_WATCH = 5245 + SYS_MIGRATE_PAGES = 5246 + SYS_OPENAT = 5247 + SYS_MKDIRAT = 5248 + SYS_MKNODAT = 5249 + SYS_FCHOWNAT = 5250 + SYS_FUTIMESAT = 5251 + SYS_NEWFSTATAT = 5252 + SYS_UNLINKAT = 5253 + SYS_RENAMEAT = 5254 + SYS_LINKAT = 5255 + SYS_SYMLINKAT = 5256 + SYS_READLINKAT = 5257 + SYS_FCHMODAT = 5258 + SYS_FACCESSAT = 5259 + SYS_PSELECT6 = 5260 + SYS_PPOLL = 5261 + SYS_UNSHARE = 5262 + SYS_SPLICE = 5263 + SYS_SYNC_FILE_RANGE = 5264 + SYS_TEE = 5265 + SYS_VMSPLICE = 5266 + SYS_MOVE_PAGES = 5267 + SYS_SET_ROBUST_LIST = 5268 + SYS_GET_ROBUST_LIST = 5269 + SYS_KEXEC_LOAD = 5270 + SYS_GETCPU = 5271 + SYS_EPOLL_PWAIT = 5272 + SYS_IOPRIO_SET = 5273 + SYS_IOPRIO_GET = 5274 + SYS_UTIMENSAT = 5275 + SYS_SIGNALFD = 5276 + SYS_TIMERFD = 5277 + SYS_EVENTFD = 5278 + SYS_FALLOCATE = 5279 + SYS_TIMERFD_CREATE = 5280 + SYS_TIMERFD_GETTIME = 5281 + SYS_TIMERFD_SETTIME = 5282 + SYS_SIGNALFD4 = 5283 + SYS_EVENTFD2 = 5284 + SYS_EPOLL_CREATE1 = 5285 + SYS_DUP3 = 5286 + SYS_PIPE2 = 5287 + SYS_INOTIFY_INIT1 = 5288 + SYS_PREADV = 5289 + SYS_PWRITEV = 5290 + SYS_RT_TGSIGQUEUEINFO = 5291 + SYS_PERF_EVENT_OPEN = 5292 + SYS_ACCEPT4 = 5293 + SYS_RECVMMSG = 5294 + SYS_FANOTIFY_INIT = 5295 + SYS_FANOTIFY_MARK = 5296 + SYS_PRLIMIT64 = 5297 + SYS_NAME_TO_HANDLE_AT = 5298 + SYS_OPEN_BY_HANDLE_AT = 5299 + SYS_CLOCK_ADJTIME = 5300 + SYS_SYNCFS = 5301 + SYS_SENDMMSG = 5302 + SYS_SETNS = 5303 + SYS_PROCESS_VM_READV = 5304 + SYS_PROCESS_VM_WRITEV = 5305 + SYS_KCMP = 5306 + SYS_FINIT_MODULE = 5307 + SYS_GETDENTS64 = 5308 + SYS_SCHED_SETATTR = 5309 + SYS_SCHED_GETATTR = 5310 + SYS_RENAMEAT2 = 5311 + SYS_SECCOMP = 5312 + SYS_GETRANDOM = 5313 + SYS_MEMFD_CREATE = 5314 + SYS_BPF = 5315 + SYS_EXECVEAT = 5316 + SYS_USERFAULTFD = 5317 + SYS_MEMBARRIER = 5318 + SYS_MLOCK2 = 5319 + SYS_COPY_FILE_RANGE = 5320 + SYS_PREADV2 = 5321 + SYS_PWRITEV2 = 5322 + SYS_PKEY_MPROTECT = 5323 + SYS_PKEY_ALLOC = 5324 + SYS_PKEY_FREE = 5325 + SYS_STATX = 5326 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go new file mode 100644 index 0000000..62ccac4 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go @@ -0,0 +1,375 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mipsle,linux + +package unix + +const ( + SYS_SYSCALL = 4000 + SYS_EXIT = 4001 + SYS_FORK = 4002 + SYS_READ = 4003 + SYS_WRITE = 4004 + SYS_OPEN = 4005 + SYS_CLOSE = 4006 + SYS_WAITPID = 4007 + SYS_CREAT = 4008 + SYS_LINK = 4009 + SYS_UNLINK = 4010 + SYS_EXECVE = 4011 + SYS_CHDIR = 4012 + SYS_TIME = 4013 + SYS_MKNOD = 4014 + SYS_CHMOD = 4015 + SYS_LCHOWN = 4016 + SYS_BREAK = 4017 + SYS_UNUSED18 = 4018 + SYS_LSEEK = 4019 + SYS_GETPID = 4020 + SYS_MOUNT = 4021 + SYS_UMOUNT = 4022 + SYS_SETUID = 4023 + SYS_GETUID = 4024 + SYS_STIME = 4025 + SYS_PTRACE = 4026 + SYS_ALARM = 4027 + SYS_UNUSED28 = 4028 + SYS_PAUSE = 4029 + SYS_UTIME = 4030 + SYS_STTY = 4031 + SYS_GTTY = 4032 + SYS_ACCESS = 4033 + SYS_NICE = 4034 + SYS_FTIME = 4035 + SYS_SYNC = 4036 + SYS_KILL = 4037 + SYS_RENAME = 4038 + SYS_MKDIR = 4039 + SYS_RMDIR = 4040 + SYS_DUP = 4041 + SYS_PIPE = 4042 + SYS_TIMES = 4043 + SYS_PROF = 4044 + SYS_BRK = 4045 + SYS_SETGID = 4046 + SYS_GETGID = 4047 + SYS_SIGNAL = 4048 + SYS_GETEUID = 4049 + SYS_GETEGID = 4050 + SYS_ACCT = 4051 + SYS_UMOUNT2 = 4052 + SYS_LOCK = 4053 + SYS_IOCTL = 4054 + SYS_FCNTL = 4055 + SYS_MPX = 4056 + SYS_SETPGID = 4057 + SYS_ULIMIT = 4058 + SYS_UNUSED59 = 4059 + SYS_UMASK = 4060 + SYS_CHROOT = 4061 + SYS_USTAT = 4062 + SYS_DUP2 = 4063 + SYS_GETPPID = 4064 + SYS_GETPGRP = 4065 + SYS_SETSID = 4066 + SYS_SIGACTION = 4067 + SYS_SGETMASK = 4068 + SYS_SSETMASK = 4069 + SYS_SETREUID = 4070 + SYS_SETREGID = 4071 + SYS_SIGSUSPEND = 4072 + SYS_SIGPENDING = 4073 + SYS_SETHOSTNAME = 4074 + SYS_SETRLIMIT = 4075 + SYS_GETRLIMIT = 4076 + SYS_GETRUSAGE = 4077 + SYS_GETTIMEOFDAY = 4078 + SYS_SETTIMEOFDAY = 4079 + SYS_GETGROUPS = 4080 + SYS_SETGROUPS = 4081 + SYS_RESERVED82 = 4082 + SYS_SYMLINK = 4083 + SYS_UNUSED84 = 4084 + SYS_READLINK = 4085 + SYS_USELIB = 4086 + SYS_SWAPON = 4087 + SYS_REBOOT = 4088 + SYS_READDIR = 4089 + SYS_MMAP = 4090 + SYS_MUNMAP = 4091 + SYS_TRUNCATE = 4092 + SYS_FTRUNCATE = 4093 + SYS_FCHMOD = 4094 + SYS_FCHOWN = 4095 + SYS_GETPRIORITY = 4096 + SYS_SETPRIORITY = 4097 + SYS_PROFIL = 4098 + SYS_STATFS = 4099 + SYS_FSTATFS = 4100 + SYS_IOPERM = 4101 + SYS_SOCKETCALL = 4102 + SYS_SYSLOG = 4103 + SYS_SETITIMER = 4104 + SYS_GETITIMER = 4105 + SYS_STAT = 4106 + SYS_LSTAT = 4107 + SYS_FSTAT = 4108 + SYS_UNUSED109 = 4109 + SYS_IOPL = 4110 + SYS_VHANGUP = 4111 + SYS_IDLE = 4112 + SYS_VM86 = 4113 + SYS_WAIT4 = 4114 + SYS_SWAPOFF = 4115 + SYS_SYSINFO = 4116 + SYS_IPC = 4117 + SYS_FSYNC = 4118 + SYS_SIGRETURN = 4119 + SYS_CLONE = 4120 + SYS_SETDOMAINNAME = 4121 + SYS_UNAME = 4122 + SYS_MODIFY_LDT = 4123 + SYS_ADJTIMEX = 4124 + SYS_MPROTECT = 4125 + SYS_SIGPROCMASK = 4126 + SYS_CREATE_MODULE = 4127 + SYS_INIT_MODULE = 4128 + SYS_DELETE_MODULE = 4129 + SYS_GET_KERNEL_SYMS = 4130 + SYS_QUOTACTL = 4131 + SYS_GETPGID = 4132 + SYS_FCHDIR = 4133 + SYS_BDFLUSH = 4134 + SYS_SYSFS = 4135 + SYS_PERSONALITY = 4136 + SYS_AFS_SYSCALL = 4137 + SYS_SETFSUID = 4138 + SYS_SETFSGID = 4139 + SYS__LLSEEK = 4140 + SYS_GETDENTS = 4141 + SYS__NEWSELECT = 4142 + SYS_FLOCK = 4143 + SYS_MSYNC = 4144 + SYS_READV = 4145 + SYS_WRITEV = 4146 + SYS_CACHEFLUSH = 4147 + SYS_CACHECTL = 4148 + SYS_SYSMIPS = 4149 + SYS_UNUSED150 = 4150 + SYS_GETSID = 4151 + SYS_FDATASYNC = 4152 + SYS__SYSCTL = 4153 + SYS_MLOCK = 4154 + SYS_MUNLOCK = 4155 + SYS_MLOCKALL = 4156 + SYS_MUNLOCKALL = 4157 + SYS_SCHED_SETPARAM = 4158 + SYS_SCHED_GETPARAM = 4159 + SYS_SCHED_SETSCHEDULER = 4160 + SYS_SCHED_GETSCHEDULER = 4161 + SYS_SCHED_YIELD = 4162 + SYS_SCHED_GET_PRIORITY_MAX = 4163 + SYS_SCHED_GET_PRIORITY_MIN = 4164 + SYS_SCHED_RR_GET_INTERVAL = 4165 + SYS_NANOSLEEP = 4166 + SYS_MREMAP = 4167 + SYS_ACCEPT = 4168 + SYS_BIND = 4169 + SYS_CONNECT = 4170 + SYS_GETPEERNAME = 4171 + SYS_GETSOCKNAME = 4172 + SYS_GETSOCKOPT = 4173 + SYS_LISTEN = 4174 + SYS_RECV = 4175 + SYS_RECVFROM = 4176 + SYS_RECVMSG = 4177 + SYS_SEND = 4178 + SYS_SENDMSG = 4179 + SYS_SENDTO = 4180 + SYS_SETSOCKOPT = 4181 + SYS_SHUTDOWN = 4182 + SYS_SOCKET = 4183 + SYS_SOCKETPAIR = 4184 + SYS_SETRESUID = 4185 + SYS_GETRESUID = 4186 + SYS_QUERY_MODULE = 4187 + SYS_POLL = 4188 + SYS_NFSSERVCTL = 4189 + SYS_SETRESGID = 4190 + SYS_GETRESGID = 4191 + SYS_PRCTL = 4192 + SYS_RT_SIGRETURN = 4193 + SYS_RT_SIGACTION = 4194 + SYS_RT_SIGPROCMASK = 4195 + SYS_RT_SIGPENDING = 4196 + SYS_RT_SIGTIMEDWAIT = 4197 + SYS_RT_SIGQUEUEINFO = 4198 + SYS_RT_SIGSUSPEND = 4199 + SYS_PREAD64 = 4200 + SYS_PWRITE64 = 4201 + SYS_CHOWN = 4202 + SYS_GETCWD = 4203 + SYS_CAPGET = 4204 + SYS_CAPSET = 4205 + SYS_SIGALTSTACK = 4206 + SYS_SENDFILE = 4207 + SYS_GETPMSG = 4208 + SYS_PUTPMSG = 4209 + SYS_MMAP2 = 4210 + SYS_TRUNCATE64 = 4211 + SYS_FTRUNCATE64 = 4212 + SYS_STAT64 = 4213 + SYS_LSTAT64 = 4214 + SYS_FSTAT64 = 4215 + SYS_PIVOT_ROOT = 4216 + SYS_MINCORE = 4217 + SYS_MADVISE = 4218 + SYS_GETDENTS64 = 4219 + SYS_FCNTL64 = 4220 + SYS_RESERVED221 = 4221 + SYS_GETTID = 4222 + SYS_READAHEAD = 4223 + SYS_SETXATTR = 4224 + SYS_LSETXATTR = 4225 + SYS_FSETXATTR = 4226 + SYS_GETXATTR = 4227 + SYS_LGETXATTR = 4228 + SYS_FGETXATTR = 4229 + SYS_LISTXATTR = 4230 + SYS_LLISTXATTR = 4231 + SYS_FLISTXATTR = 4232 + SYS_REMOVEXATTR = 4233 + SYS_LREMOVEXATTR = 4234 + SYS_FREMOVEXATTR = 4235 + SYS_TKILL = 4236 + SYS_SENDFILE64 = 4237 + SYS_FUTEX = 4238 + SYS_SCHED_SETAFFINITY = 4239 + SYS_SCHED_GETAFFINITY = 4240 + SYS_IO_SETUP = 4241 + SYS_IO_DESTROY = 4242 + SYS_IO_GETEVENTS = 4243 + SYS_IO_SUBMIT = 4244 + SYS_IO_CANCEL = 4245 + SYS_EXIT_GROUP = 4246 + SYS_LOOKUP_DCOOKIE = 4247 + SYS_EPOLL_CREATE = 4248 + SYS_EPOLL_CTL = 4249 + SYS_EPOLL_WAIT = 4250 + SYS_REMAP_FILE_PAGES = 4251 + SYS_SET_TID_ADDRESS = 4252 + SYS_RESTART_SYSCALL = 4253 + SYS_FADVISE64 = 4254 + SYS_STATFS64 = 4255 + SYS_FSTATFS64 = 4256 + SYS_TIMER_CREATE = 4257 + SYS_TIMER_SETTIME = 4258 + SYS_TIMER_GETTIME = 4259 + SYS_TIMER_GETOVERRUN = 4260 + SYS_TIMER_DELETE = 4261 + SYS_CLOCK_SETTIME = 4262 + SYS_CLOCK_GETTIME = 4263 + SYS_CLOCK_GETRES = 4264 + SYS_CLOCK_NANOSLEEP = 4265 + SYS_TGKILL = 4266 + SYS_UTIMES = 4267 + SYS_MBIND = 4268 + SYS_GET_MEMPOLICY = 4269 + SYS_SET_MEMPOLICY = 4270 + SYS_MQ_OPEN = 4271 + SYS_MQ_UNLINK = 4272 + SYS_MQ_TIMEDSEND = 4273 + SYS_MQ_TIMEDRECEIVE = 4274 + SYS_MQ_NOTIFY = 4275 + SYS_MQ_GETSETATTR = 4276 + SYS_VSERVER = 4277 + SYS_WAITID = 4278 + SYS_ADD_KEY = 4280 + SYS_REQUEST_KEY = 4281 + SYS_KEYCTL = 4282 + SYS_SET_THREAD_AREA = 4283 + SYS_INOTIFY_INIT = 4284 + SYS_INOTIFY_ADD_WATCH = 4285 + SYS_INOTIFY_RM_WATCH = 4286 + SYS_MIGRATE_PAGES = 4287 + SYS_OPENAT = 4288 + SYS_MKDIRAT = 4289 + SYS_MKNODAT = 4290 + SYS_FCHOWNAT = 4291 + SYS_FUTIMESAT = 4292 + SYS_FSTATAT64 = 4293 + SYS_UNLINKAT = 4294 + SYS_RENAMEAT = 4295 + SYS_LINKAT = 4296 + SYS_SYMLINKAT = 4297 + SYS_READLINKAT = 4298 + SYS_FCHMODAT = 4299 + SYS_FACCESSAT = 4300 + SYS_PSELECT6 = 4301 + SYS_PPOLL = 4302 + SYS_UNSHARE = 4303 + SYS_SPLICE = 4304 + SYS_SYNC_FILE_RANGE = 4305 + SYS_TEE = 4306 + SYS_VMSPLICE = 4307 + SYS_MOVE_PAGES = 4308 + SYS_SET_ROBUST_LIST = 4309 + SYS_GET_ROBUST_LIST = 4310 + SYS_KEXEC_LOAD = 4311 + SYS_GETCPU = 4312 + SYS_EPOLL_PWAIT = 4313 + SYS_IOPRIO_SET = 4314 + SYS_IOPRIO_GET = 4315 + SYS_UTIMENSAT = 4316 + SYS_SIGNALFD = 4317 + SYS_TIMERFD = 4318 + SYS_EVENTFD = 4319 + SYS_FALLOCATE = 4320 + SYS_TIMERFD_CREATE = 4321 + SYS_TIMERFD_GETTIME = 4322 + SYS_TIMERFD_SETTIME = 4323 + SYS_SIGNALFD4 = 4324 + SYS_EVENTFD2 = 4325 + SYS_EPOLL_CREATE1 = 4326 + SYS_DUP3 = 4327 + SYS_PIPE2 = 4328 + SYS_INOTIFY_INIT1 = 4329 + SYS_PREADV = 4330 + SYS_PWRITEV = 4331 + SYS_RT_TGSIGQUEUEINFO = 4332 + SYS_PERF_EVENT_OPEN = 4333 + SYS_ACCEPT4 = 4334 + SYS_RECVMMSG = 4335 + SYS_FANOTIFY_INIT = 4336 + SYS_FANOTIFY_MARK = 4337 + SYS_PRLIMIT64 = 4338 + SYS_NAME_TO_HANDLE_AT = 4339 + SYS_OPEN_BY_HANDLE_AT = 4340 + SYS_CLOCK_ADJTIME = 4341 + SYS_SYNCFS = 4342 + SYS_SENDMMSG = 4343 + SYS_SETNS = 4344 + SYS_PROCESS_VM_READV = 4345 + SYS_PROCESS_VM_WRITEV = 4346 + SYS_KCMP = 4347 + SYS_FINIT_MODULE = 4348 + SYS_SCHED_SETATTR = 4349 + SYS_SCHED_GETATTR = 4350 + SYS_RENAMEAT2 = 4351 + SYS_SECCOMP = 4352 + SYS_GETRANDOM = 4353 + SYS_MEMFD_CREATE = 4354 + SYS_BPF = 4355 + SYS_EXECVEAT = 4356 + SYS_USERFAULTFD = 4357 + SYS_MEMBARRIER = 4358 + SYS_MLOCK2 = 4359 + SYS_COPY_FILE_RANGE = 4360 + SYS_PREADV2 = 4361 + SYS_PWRITEV2 = 4362 + SYS_PKEY_MPROTECT = 4363 + SYS_PKEY_ALLOC = 4364 + SYS_PKEY_FREE = 4365 + SYS_STATX = 4366 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go new file mode 100644 index 0000000..dfe5dab --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go @@ -0,0 +1,370 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build ppc64,linux + +package unix + +const ( + SYS_RESTART_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_WAITPID = 7 + SYS_CREAT = 8 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_EXECVE = 11 + SYS_CHDIR = 12 + SYS_TIME = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_LCHOWN = 16 + SYS_BREAK = 17 + SYS_OLDSTAT = 18 + SYS_LSEEK = 19 + SYS_GETPID = 20 + SYS_MOUNT = 21 + SYS_UMOUNT = 22 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_STIME = 25 + SYS_PTRACE = 26 + SYS_ALARM = 27 + SYS_OLDFSTAT = 28 + SYS_PAUSE = 29 + SYS_UTIME = 30 + SYS_STTY = 31 + SYS_GTTY = 32 + SYS_ACCESS = 33 + SYS_NICE = 34 + SYS_FTIME = 35 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_RENAME = 38 + SYS_MKDIR = 39 + SYS_RMDIR = 40 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_TIMES = 43 + SYS_PROF = 44 + SYS_BRK = 45 + SYS_SETGID = 46 + SYS_GETGID = 47 + SYS_SIGNAL = 48 + SYS_GETEUID = 49 + SYS_GETEGID = 50 + SYS_ACCT = 51 + SYS_UMOUNT2 = 52 + SYS_LOCK = 53 + SYS_IOCTL = 54 + SYS_FCNTL = 55 + SYS_MPX = 56 + SYS_SETPGID = 57 + SYS_ULIMIT = 58 + SYS_OLDOLDUNAME = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_USTAT = 62 + SYS_DUP2 = 63 + SYS_GETPPID = 64 + SYS_GETPGRP = 65 + SYS_SETSID = 66 + SYS_SIGACTION = 67 + SYS_SGETMASK = 68 + SYS_SSETMASK = 69 + SYS_SETREUID = 70 + SYS_SETREGID = 71 + SYS_SIGSUSPEND = 72 + SYS_SIGPENDING = 73 + SYS_SETHOSTNAME = 74 + SYS_SETRLIMIT = 75 + SYS_GETRLIMIT = 76 + SYS_GETRUSAGE = 77 + SYS_GETTIMEOFDAY = 78 + SYS_SETTIMEOFDAY = 79 + SYS_GETGROUPS = 80 + SYS_SETGROUPS = 81 + SYS_SELECT = 82 + SYS_SYMLINK = 83 + SYS_OLDLSTAT = 84 + SYS_READLINK = 85 + SYS_USELIB = 86 + SYS_SWAPON = 87 + SYS_REBOOT = 88 + SYS_READDIR = 89 + SYS_MMAP = 90 + SYS_MUNMAP = 91 + SYS_TRUNCATE = 92 + SYS_FTRUNCATE = 93 + SYS_FCHMOD = 94 + SYS_FCHOWN = 95 + SYS_GETPRIORITY = 96 + SYS_SETPRIORITY = 97 + SYS_PROFIL = 98 + SYS_STATFS = 99 + SYS_FSTATFS = 100 + SYS_IOPERM = 101 + SYS_SOCKETCALL = 102 + SYS_SYSLOG = 103 + SYS_SETITIMER = 104 + SYS_GETITIMER = 105 + SYS_STAT = 106 + SYS_LSTAT = 107 + SYS_FSTAT = 108 + SYS_OLDUNAME = 109 + SYS_IOPL = 110 + SYS_VHANGUP = 111 + SYS_IDLE = 112 + SYS_VM86 = 113 + SYS_WAIT4 = 114 + SYS_SWAPOFF = 115 + SYS_SYSINFO = 116 + SYS_IPC = 117 + SYS_FSYNC = 118 + SYS_SIGRETURN = 119 + SYS_CLONE = 120 + SYS_SETDOMAINNAME = 121 + SYS_UNAME = 122 + SYS_MODIFY_LDT = 123 + SYS_ADJTIMEX = 124 + SYS_MPROTECT = 125 + SYS_SIGPROCMASK = 126 + SYS_CREATE_MODULE = 127 + SYS_INIT_MODULE = 128 + SYS_DELETE_MODULE = 129 + SYS_GET_KERNEL_SYMS = 130 + SYS_QUOTACTL = 131 + SYS_GETPGID = 132 + SYS_FCHDIR = 133 + SYS_BDFLUSH = 134 + SYS_SYSFS = 135 + SYS_PERSONALITY = 136 + SYS_AFS_SYSCALL = 137 + SYS_SETFSUID = 138 + SYS_SETFSGID = 139 + SYS__LLSEEK = 140 + SYS_GETDENTS = 141 + SYS__NEWSELECT = 142 + SYS_FLOCK = 143 + SYS_MSYNC = 144 + SYS_READV = 145 + SYS_WRITEV = 146 + SYS_GETSID = 147 + SYS_FDATASYNC = 148 + SYS__SYSCTL = 149 + SYS_MLOCK = 150 + SYS_MUNLOCK = 151 + SYS_MLOCKALL = 152 + SYS_MUNLOCKALL = 153 + SYS_SCHED_SETPARAM = 154 + SYS_SCHED_GETPARAM = 155 + SYS_SCHED_SETSCHEDULER = 156 + SYS_SCHED_GETSCHEDULER = 157 + SYS_SCHED_YIELD = 158 + SYS_SCHED_GET_PRIORITY_MAX = 159 + SYS_SCHED_GET_PRIORITY_MIN = 160 + SYS_SCHED_RR_GET_INTERVAL = 161 + SYS_NANOSLEEP = 162 + SYS_MREMAP = 163 + SYS_SETRESUID = 164 + SYS_GETRESUID = 165 + SYS_QUERY_MODULE = 166 + SYS_POLL = 167 + SYS_NFSSERVCTL = 168 + SYS_SETRESGID = 169 + SYS_GETRESGID = 170 + SYS_PRCTL = 171 + SYS_RT_SIGRETURN = 172 + SYS_RT_SIGACTION = 173 + SYS_RT_SIGPROCMASK = 174 + SYS_RT_SIGPENDING = 175 + SYS_RT_SIGTIMEDWAIT = 176 + SYS_RT_SIGQUEUEINFO = 177 + SYS_RT_SIGSUSPEND = 178 + SYS_PREAD64 = 179 + SYS_PWRITE64 = 180 + SYS_CHOWN = 181 + SYS_GETCWD = 182 + SYS_CAPGET = 183 + SYS_CAPSET = 184 + SYS_SIGALTSTACK = 185 + SYS_SENDFILE = 186 + SYS_GETPMSG = 187 + SYS_PUTPMSG = 188 + SYS_VFORK = 189 + SYS_UGETRLIMIT = 190 + SYS_READAHEAD = 191 + SYS_PCICONFIG_READ = 198 + SYS_PCICONFIG_WRITE = 199 + SYS_PCICONFIG_IOBASE = 200 + SYS_MULTIPLEXER = 201 + SYS_GETDENTS64 = 202 + SYS_PIVOT_ROOT = 203 + SYS_MADVISE = 205 + SYS_MINCORE = 206 + SYS_GETTID = 207 + SYS_TKILL = 208 + SYS_SETXATTR = 209 + SYS_LSETXATTR = 210 + SYS_FSETXATTR = 211 + SYS_GETXATTR = 212 + SYS_LGETXATTR = 213 + SYS_FGETXATTR = 214 + SYS_LISTXATTR = 215 + SYS_LLISTXATTR = 216 + SYS_FLISTXATTR = 217 + SYS_REMOVEXATTR = 218 + SYS_LREMOVEXATTR = 219 + SYS_FREMOVEXATTR = 220 + SYS_FUTEX = 221 + SYS_SCHED_SETAFFINITY = 222 + SYS_SCHED_GETAFFINITY = 223 + SYS_TUXCALL = 225 + SYS_IO_SETUP = 227 + SYS_IO_DESTROY = 228 + SYS_IO_GETEVENTS = 229 + SYS_IO_SUBMIT = 230 + SYS_IO_CANCEL = 231 + SYS_SET_TID_ADDRESS = 232 + SYS_FADVISE64 = 233 + SYS_EXIT_GROUP = 234 + SYS_LOOKUP_DCOOKIE = 235 + SYS_EPOLL_CREATE = 236 + SYS_EPOLL_CTL = 237 + SYS_EPOLL_WAIT = 238 + SYS_REMAP_FILE_PAGES = 239 + SYS_TIMER_CREATE = 240 + SYS_TIMER_SETTIME = 241 + SYS_TIMER_GETTIME = 242 + SYS_TIMER_GETOVERRUN = 243 + SYS_TIMER_DELETE = 244 + SYS_CLOCK_SETTIME = 245 + SYS_CLOCK_GETTIME = 246 + SYS_CLOCK_GETRES = 247 + SYS_CLOCK_NANOSLEEP = 248 + SYS_SWAPCONTEXT = 249 + SYS_TGKILL = 250 + SYS_UTIMES = 251 + SYS_STATFS64 = 252 + SYS_FSTATFS64 = 253 + SYS_RTAS = 255 + SYS_SYS_DEBUG_SETCONTEXT = 256 + SYS_MIGRATE_PAGES = 258 + SYS_MBIND = 259 + SYS_GET_MEMPOLICY = 260 + SYS_SET_MEMPOLICY = 261 + SYS_MQ_OPEN = 262 + SYS_MQ_UNLINK = 263 + SYS_MQ_TIMEDSEND = 264 + SYS_MQ_TIMEDRECEIVE = 265 + SYS_MQ_NOTIFY = 266 + SYS_MQ_GETSETATTR = 267 + SYS_KEXEC_LOAD = 268 + SYS_ADD_KEY = 269 + SYS_REQUEST_KEY = 270 + SYS_KEYCTL = 271 + SYS_WAITID = 272 + SYS_IOPRIO_SET = 273 + SYS_IOPRIO_GET = 274 + SYS_INOTIFY_INIT = 275 + SYS_INOTIFY_ADD_WATCH = 276 + SYS_INOTIFY_RM_WATCH = 277 + SYS_SPU_RUN = 278 + SYS_SPU_CREATE = 279 + SYS_PSELECT6 = 280 + SYS_PPOLL = 281 + SYS_UNSHARE = 282 + SYS_SPLICE = 283 + SYS_TEE = 284 + SYS_VMSPLICE = 285 + SYS_OPENAT = 286 + SYS_MKDIRAT = 287 + SYS_MKNODAT = 288 + SYS_FCHOWNAT = 289 + SYS_FUTIMESAT = 290 + SYS_NEWFSTATAT = 291 + SYS_UNLINKAT = 292 + SYS_RENAMEAT = 293 + SYS_LINKAT = 294 + SYS_SYMLINKAT = 295 + SYS_READLINKAT = 296 + SYS_FCHMODAT = 297 + SYS_FACCESSAT = 298 + SYS_GET_ROBUST_LIST = 299 + SYS_SET_ROBUST_LIST = 300 + SYS_MOVE_PAGES = 301 + SYS_GETCPU = 302 + SYS_EPOLL_PWAIT = 303 + SYS_UTIMENSAT = 304 + SYS_SIGNALFD = 305 + SYS_TIMERFD_CREATE = 306 + SYS_EVENTFD = 307 + SYS_SYNC_FILE_RANGE2 = 308 + SYS_FALLOCATE = 309 + SYS_SUBPAGE_PROT = 310 + SYS_TIMERFD_SETTIME = 311 + SYS_TIMERFD_GETTIME = 312 + SYS_SIGNALFD4 = 313 + SYS_EVENTFD2 = 314 + SYS_EPOLL_CREATE1 = 315 + SYS_DUP3 = 316 + SYS_PIPE2 = 317 + SYS_INOTIFY_INIT1 = 318 + SYS_PERF_EVENT_OPEN = 319 + SYS_PREADV = 320 + SYS_PWRITEV = 321 + SYS_RT_TGSIGQUEUEINFO = 322 + SYS_FANOTIFY_INIT = 323 + SYS_FANOTIFY_MARK = 324 + SYS_PRLIMIT64 = 325 + SYS_SOCKET = 326 + SYS_BIND = 327 + SYS_CONNECT = 328 + SYS_LISTEN = 329 + SYS_ACCEPT = 330 + SYS_GETSOCKNAME = 331 + SYS_GETPEERNAME = 332 + SYS_SOCKETPAIR = 333 + SYS_SEND = 334 + SYS_SENDTO = 335 + SYS_RECV = 336 + SYS_RECVFROM = 337 + SYS_SHUTDOWN = 338 + SYS_SETSOCKOPT = 339 + SYS_GETSOCKOPT = 340 + SYS_SENDMSG = 341 + SYS_RECVMSG = 342 + SYS_RECVMMSG = 343 + SYS_ACCEPT4 = 344 + SYS_NAME_TO_HANDLE_AT = 345 + SYS_OPEN_BY_HANDLE_AT = 346 + SYS_CLOCK_ADJTIME = 347 + SYS_SYNCFS = 348 + SYS_SENDMMSG = 349 + SYS_SETNS = 350 + SYS_PROCESS_VM_READV = 351 + SYS_PROCESS_VM_WRITEV = 352 + SYS_FINIT_MODULE = 353 + SYS_KCMP = 354 + SYS_SCHED_SETATTR = 355 + SYS_SCHED_GETATTR = 356 + SYS_RENAMEAT2 = 357 + SYS_SECCOMP = 358 + SYS_GETRANDOM = 359 + SYS_MEMFD_CREATE = 360 + SYS_BPF = 361 + SYS_EXECVEAT = 362 + SYS_SWITCH_ENDIAN = 363 + SYS_USERFAULTFD = 364 + SYS_MEMBARRIER = 365 + SYS_MLOCK2 = 378 + SYS_COPY_FILE_RANGE = 379 + SYS_PREADV2 = 380 + SYS_PWRITEV2 = 381 + SYS_KEXEC_FILE_LOAD = 382 + SYS_STATX = 383 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go new file mode 100644 index 0000000..eca97f7 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go @@ -0,0 +1,370 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build ppc64le,linux + +package unix + +const ( + SYS_RESTART_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_WAITPID = 7 + SYS_CREAT = 8 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_EXECVE = 11 + SYS_CHDIR = 12 + SYS_TIME = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_LCHOWN = 16 + SYS_BREAK = 17 + SYS_OLDSTAT = 18 + SYS_LSEEK = 19 + SYS_GETPID = 20 + SYS_MOUNT = 21 + SYS_UMOUNT = 22 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_STIME = 25 + SYS_PTRACE = 26 + SYS_ALARM = 27 + SYS_OLDFSTAT = 28 + SYS_PAUSE = 29 + SYS_UTIME = 30 + SYS_STTY = 31 + SYS_GTTY = 32 + SYS_ACCESS = 33 + SYS_NICE = 34 + SYS_FTIME = 35 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_RENAME = 38 + SYS_MKDIR = 39 + SYS_RMDIR = 40 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_TIMES = 43 + SYS_PROF = 44 + SYS_BRK = 45 + SYS_SETGID = 46 + SYS_GETGID = 47 + SYS_SIGNAL = 48 + SYS_GETEUID = 49 + SYS_GETEGID = 50 + SYS_ACCT = 51 + SYS_UMOUNT2 = 52 + SYS_LOCK = 53 + SYS_IOCTL = 54 + SYS_FCNTL = 55 + SYS_MPX = 56 + SYS_SETPGID = 57 + SYS_ULIMIT = 58 + SYS_OLDOLDUNAME = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_USTAT = 62 + SYS_DUP2 = 63 + SYS_GETPPID = 64 + SYS_GETPGRP = 65 + SYS_SETSID = 66 + SYS_SIGACTION = 67 + SYS_SGETMASK = 68 + SYS_SSETMASK = 69 + SYS_SETREUID = 70 + SYS_SETREGID = 71 + SYS_SIGSUSPEND = 72 + SYS_SIGPENDING = 73 + SYS_SETHOSTNAME = 74 + SYS_SETRLIMIT = 75 + SYS_GETRLIMIT = 76 + SYS_GETRUSAGE = 77 + SYS_GETTIMEOFDAY = 78 + SYS_SETTIMEOFDAY = 79 + SYS_GETGROUPS = 80 + SYS_SETGROUPS = 81 + SYS_SELECT = 82 + SYS_SYMLINK = 83 + SYS_OLDLSTAT = 84 + SYS_READLINK = 85 + SYS_USELIB = 86 + SYS_SWAPON = 87 + SYS_REBOOT = 88 + SYS_READDIR = 89 + SYS_MMAP = 90 + SYS_MUNMAP = 91 + SYS_TRUNCATE = 92 + SYS_FTRUNCATE = 93 + SYS_FCHMOD = 94 + SYS_FCHOWN = 95 + SYS_GETPRIORITY = 96 + SYS_SETPRIORITY = 97 + SYS_PROFIL = 98 + SYS_STATFS = 99 + SYS_FSTATFS = 100 + SYS_IOPERM = 101 + SYS_SOCKETCALL = 102 + SYS_SYSLOG = 103 + SYS_SETITIMER = 104 + SYS_GETITIMER = 105 + SYS_STAT = 106 + SYS_LSTAT = 107 + SYS_FSTAT = 108 + SYS_OLDUNAME = 109 + SYS_IOPL = 110 + SYS_VHANGUP = 111 + SYS_IDLE = 112 + SYS_VM86 = 113 + SYS_WAIT4 = 114 + SYS_SWAPOFF = 115 + SYS_SYSINFO = 116 + SYS_IPC = 117 + SYS_FSYNC = 118 + SYS_SIGRETURN = 119 + SYS_CLONE = 120 + SYS_SETDOMAINNAME = 121 + SYS_UNAME = 122 + SYS_MODIFY_LDT = 123 + SYS_ADJTIMEX = 124 + SYS_MPROTECT = 125 + SYS_SIGPROCMASK = 126 + SYS_CREATE_MODULE = 127 + SYS_INIT_MODULE = 128 + SYS_DELETE_MODULE = 129 + SYS_GET_KERNEL_SYMS = 130 + SYS_QUOTACTL = 131 + SYS_GETPGID = 132 + SYS_FCHDIR = 133 + SYS_BDFLUSH = 134 + SYS_SYSFS = 135 + SYS_PERSONALITY = 136 + SYS_AFS_SYSCALL = 137 + SYS_SETFSUID = 138 + SYS_SETFSGID = 139 + SYS__LLSEEK = 140 + SYS_GETDENTS = 141 + SYS__NEWSELECT = 142 + SYS_FLOCK = 143 + SYS_MSYNC = 144 + SYS_READV = 145 + SYS_WRITEV = 146 + SYS_GETSID = 147 + SYS_FDATASYNC = 148 + SYS__SYSCTL = 149 + SYS_MLOCK = 150 + SYS_MUNLOCK = 151 + SYS_MLOCKALL = 152 + SYS_MUNLOCKALL = 153 + SYS_SCHED_SETPARAM = 154 + SYS_SCHED_GETPARAM = 155 + SYS_SCHED_SETSCHEDULER = 156 + SYS_SCHED_GETSCHEDULER = 157 + SYS_SCHED_YIELD = 158 + SYS_SCHED_GET_PRIORITY_MAX = 159 + SYS_SCHED_GET_PRIORITY_MIN = 160 + SYS_SCHED_RR_GET_INTERVAL = 161 + SYS_NANOSLEEP = 162 + SYS_MREMAP = 163 + SYS_SETRESUID = 164 + SYS_GETRESUID = 165 + SYS_QUERY_MODULE = 166 + SYS_POLL = 167 + SYS_NFSSERVCTL = 168 + SYS_SETRESGID = 169 + SYS_GETRESGID = 170 + SYS_PRCTL = 171 + SYS_RT_SIGRETURN = 172 + SYS_RT_SIGACTION = 173 + SYS_RT_SIGPROCMASK = 174 + SYS_RT_SIGPENDING = 175 + SYS_RT_SIGTIMEDWAIT = 176 + SYS_RT_SIGQUEUEINFO = 177 + SYS_RT_SIGSUSPEND = 178 + SYS_PREAD64 = 179 + SYS_PWRITE64 = 180 + SYS_CHOWN = 181 + SYS_GETCWD = 182 + SYS_CAPGET = 183 + SYS_CAPSET = 184 + SYS_SIGALTSTACK = 185 + SYS_SENDFILE = 186 + SYS_GETPMSG = 187 + SYS_PUTPMSG = 188 + SYS_VFORK = 189 + SYS_UGETRLIMIT = 190 + SYS_READAHEAD = 191 + SYS_PCICONFIG_READ = 198 + SYS_PCICONFIG_WRITE = 199 + SYS_PCICONFIG_IOBASE = 200 + SYS_MULTIPLEXER = 201 + SYS_GETDENTS64 = 202 + SYS_PIVOT_ROOT = 203 + SYS_MADVISE = 205 + SYS_MINCORE = 206 + SYS_GETTID = 207 + SYS_TKILL = 208 + SYS_SETXATTR = 209 + SYS_LSETXATTR = 210 + SYS_FSETXATTR = 211 + SYS_GETXATTR = 212 + SYS_LGETXATTR = 213 + SYS_FGETXATTR = 214 + SYS_LISTXATTR = 215 + SYS_LLISTXATTR = 216 + SYS_FLISTXATTR = 217 + SYS_REMOVEXATTR = 218 + SYS_LREMOVEXATTR = 219 + SYS_FREMOVEXATTR = 220 + SYS_FUTEX = 221 + SYS_SCHED_SETAFFINITY = 222 + SYS_SCHED_GETAFFINITY = 223 + SYS_TUXCALL = 225 + SYS_IO_SETUP = 227 + SYS_IO_DESTROY = 228 + SYS_IO_GETEVENTS = 229 + SYS_IO_SUBMIT = 230 + SYS_IO_CANCEL = 231 + SYS_SET_TID_ADDRESS = 232 + SYS_FADVISE64 = 233 + SYS_EXIT_GROUP = 234 + SYS_LOOKUP_DCOOKIE = 235 + SYS_EPOLL_CREATE = 236 + SYS_EPOLL_CTL = 237 + SYS_EPOLL_WAIT = 238 + SYS_REMAP_FILE_PAGES = 239 + SYS_TIMER_CREATE = 240 + SYS_TIMER_SETTIME = 241 + SYS_TIMER_GETTIME = 242 + SYS_TIMER_GETOVERRUN = 243 + SYS_TIMER_DELETE = 244 + SYS_CLOCK_SETTIME = 245 + SYS_CLOCK_GETTIME = 246 + SYS_CLOCK_GETRES = 247 + SYS_CLOCK_NANOSLEEP = 248 + SYS_SWAPCONTEXT = 249 + SYS_TGKILL = 250 + SYS_UTIMES = 251 + SYS_STATFS64 = 252 + SYS_FSTATFS64 = 253 + SYS_RTAS = 255 + SYS_SYS_DEBUG_SETCONTEXT = 256 + SYS_MIGRATE_PAGES = 258 + SYS_MBIND = 259 + SYS_GET_MEMPOLICY = 260 + SYS_SET_MEMPOLICY = 261 + SYS_MQ_OPEN = 262 + SYS_MQ_UNLINK = 263 + SYS_MQ_TIMEDSEND = 264 + SYS_MQ_TIMEDRECEIVE = 265 + SYS_MQ_NOTIFY = 266 + SYS_MQ_GETSETATTR = 267 + SYS_KEXEC_LOAD = 268 + SYS_ADD_KEY = 269 + SYS_REQUEST_KEY = 270 + SYS_KEYCTL = 271 + SYS_WAITID = 272 + SYS_IOPRIO_SET = 273 + SYS_IOPRIO_GET = 274 + SYS_INOTIFY_INIT = 275 + SYS_INOTIFY_ADD_WATCH = 276 + SYS_INOTIFY_RM_WATCH = 277 + SYS_SPU_RUN = 278 + SYS_SPU_CREATE = 279 + SYS_PSELECT6 = 280 + SYS_PPOLL = 281 + SYS_UNSHARE = 282 + SYS_SPLICE = 283 + SYS_TEE = 284 + SYS_VMSPLICE = 285 + SYS_OPENAT = 286 + SYS_MKDIRAT = 287 + SYS_MKNODAT = 288 + SYS_FCHOWNAT = 289 + SYS_FUTIMESAT = 290 + SYS_NEWFSTATAT = 291 + SYS_UNLINKAT = 292 + SYS_RENAMEAT = 293 + SYS_LINKAT = 294 + SYS_SYMLINKAT = 295 + SYS_READLINKAT = 296 + SYS_FCHMODAT = 297 + SYS_FACCESSAT = 298 + SYS_GET_ROBUST_LIST = 299 + SYS_SET_ROBUST_LIST = 300 + SYS_MOVE_PAGES = 301 + SYS_GETCPU = 302 + SYS_EPOLL_PWAIT = 303 + SYS_UTIMENSAT = 304 + SYS_SIGNALFD = 305 + SYS_TIMERFD_CREATE = 306 + SYS_EVENTFD = 307 + SYS_SYNC_FILE_RANGE2 = 308 + SYS_FALLOCATE = 309 + SYS_SUBPAGE_PROT = 310 + SYS_TIMERFD_SETTIME = 311 + SYS_TIMERFD_GETTIME = 312 + SYS_SIGNALFD4 = 313 + SYS_EVENTFD2 = 314 + SYS_EPOLL_CREATE1 = 315 + SYS_DUP3 = 316 + SYS_PIPE2 = 317 + SYS_INOTIFY_INIT1 = 318 + SYS_PERF_EVENT_OPEN = 319 + SYS_PREADV = 320 + SYS_PWRITEV = 321 + SYS_RT_TGSIGQUEUEINFO = 322 + SYS_FANOTIFY_INIT = 323 + SYS_FANOTIFY_MARK = 324 + SYS_PRLIMIT64 = 325 + SYS_SOCKET = 326 + SYS_BIND = 327 + SYS_CONNECT = 328 + SYS_LISTEN = 329 + SYS_ACCEPT = 330 + SYS_GETSOCKNAME = 331 + SYS_GETPEERNAME = 332 + SYS_SOCKETPAIR = 333 + SYS_SEND = 334 + SYS_SENDTO = 335 + SYS_RECV = 336 + SYS_RECVFROM = 337 + SYS_SHUTDOWN = 338 + SYS_SETSOCKOPT = 339 + SYS_GETSOCKOPT = 340 + SYS_SENDMSG = 341 + SYS_RECVMSG = 342 + SYS_RECVMMSG = 343 + SYS_ACCEPT4 = 344 + SYS_NAME_TO_HANDLE_AT = 345 + SYS_OPEN_BY_HANDLE_AT = 346 + SYS_CLOCK_ADJTIME = 347 + SYS_SYNCFS = 348 + SYS_SENDMMSG = 349 + SYS_SETNS = 350 + SYS_PROCESS_VM_READV = 351 + SYS_PROCESS_VM_WRITEV = 352 + SYS_FINIT_MODULE = 353 + SYS_KCMP = 354 + SYS_SCHED_SETATTR = 355 + SYS_SCHED_GETATTR = 356 + SYS_RENAMEAT2 = 357 + SYS_SECCOMP = 358 + SYS_GETRANDOM = 359 + SYS_MEMFD_CREATE = 360 + SYS_BPF = 361 + SYS_EXECVEAT = 362 + SYS_SWITCH_ENDIAN = 363 + SYS_USERFAULTFD = 364 + SYS_MEMBARRIER = 365 + SYS_MLOCK2 = 378 + SYS_COPY_FILE_RANGE = 379 + SYS_PREADV2 = 380 + SYS_PWRITEV2 = 381 + SYS_KEXEC_FILE_LOAD = 382 + SYS_STATX = 383 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go new file mode 100644 index 0000000..8ea18e6 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go @@ -0,0 +1,333 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include -fsigned-char /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build s390x,linux + +package unix + +const ( + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_RESTART_SYSCALL = 7 + SYS_CREAT = 8 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_EXECVE = 11 + SYS_CHDIR = 12 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_LSEEK = 19 + SYS_GETPID = 20 + SYS_MOUNT = 21 + SYS_UMOUNT = 22 + SYS_PTRACE = 26 + SYS_ALARM = 27 + SYS_PAUSE = 29 + SYS_UTIME = 30 + SYS_ACCESS = 33 + SYS_NICE = 34 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_RENAME = 38 + SYS_MKDIR = 39 + SYS_RMDIR = 40 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_TIMES = 43 + SYS_BRK = 45 + SYS_SIGNAL = 48 + SYS_ACCT = 51 + SYS_UMOUNT2 = 52 + SYS_IOCTL = 54 + SYS_FCNTL = 55 + SYS_SETPGID = 57 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_USTAT = 62 + SYS_DUP2 = 63 + SYS_GETPPID = 64 + SYS_GETPGRP = 65 + SYS_SETSID = 66 + SYS_SIGACTION = 67 + SYS_SIGSUSPEND = 72 + SYS_SIGPENDING = 73 + SYS_SETHOSTNAME = 74 + SYS_SETRLIMIT = 75 + SYS_GETRUSAGE = 77 + SYS_GETTIMEOFDAY = 78 + SYS_SETTIMEOFDAY = 79 + SYS_SYMLINK = 83 + SYS_READLINK = 85 + SYS_USELIB = 86 + SYS_SWAPON = 87 + SYS_REBOOT = 88 + SYS_READDIR = 89 + SYS_MMAP = 90 + SYS_MUNMAP = 91 + SYS_TRUNCATE = 92 + SYS_FTRUNCATE = 93 + SYS_FCHMOD = 94 + SYS_GETPRIORITY = 96 + SYS_SETPRIORITY = 97 + SYS_STATFS = 99 + SYS_FSTATFS = 100 + SYS_SOCKETCALL = 102 + SYS_SYSLOG = 103 + SYS_SETITIMER = 104 + SYS_GETITIMER = 105 + SYS_STAT = 106 + SYS_LSTAT = 107 + SYS_FSTAT = 108 + SYS_LOOKUP_DCOOKIE = 110 + SYS_VHANGUP = 111 + SYS_IDLE = 112 + SYS_WAIT4 = 114 + SYS_SWAPOFF = 115 + SYS_SYSINFO = 116 + SYS_IPC = 117 + SYS_FSYNC = 118 + SYS_SIGRETURN = 119 + SYS_CLONE = 120 + SYS_SETDOMAINNAME = 121 + SYS_UNAME = 122 + SYS_ADJTIMEX = 124 + SYS_MPROTECT = 125 + SYS_SIGPROCMASK = 126 + SYS_CREATE_MODULE = 127 + SYS_INIT_MODULE = 128 + SYS_DELETE_MODULE = 129 + SYS_GET_KERNEL_SYMS = 130 + SYS_QUOTACTL = 131 + SYS_GETPGID = 132 + SYS_FCHDIR = 133 + SYS_BDFLUSH = 134 + SYS_SYSFS = 135 + SYS_PERSONALITY = 136 + SYS_AFS_SYSCALL = 137 + SYS_GETDENTS = 141 + SYS_FLOCK = 143 + SYS_MSYNC = 144 + SYS_READV = 145 + SYS_WRITEV = 146 + SYS_GETSID = 147 + SYS_FDATASYNC = 148 + SYS__SYSCTL = 149 + SYS_MLOCK = 150 + SYS_MUNLOCK = 151 + SYS_MLOCKALL = 152 + SYS_MUNLOCKALL = 153 + SYS_SCHED_SETPARAM = 154 + SYS_SCHED_GETPARAM = 155 + SYS_SCHED_SETSCHEDULER = 156 + SYS_SCHED_GETSCHEDULER = 157 + SYS_SCHED_YIELD = 158 + SYS_SCHED_GET_PRIORITY_MAX = 159 + SYS_SCHED_GET_PRIORITY_MIN = 160 + SYS_SCHED_RR_GET_INTERVAL = 161 + SYS_NANOSLEEP = 162 + SYS_MREMAP = 163 + SYS_QUERY_MODULE = 167 + SYS_POLL = 168 + SYS_NFSSERVCTL = 169 + SYS_PRCTL = 172 + SYS_RT_SIGRETURN = 173 + SYS_RT_SIGACTION = 174 + SYS_RT_SIGPROCMASK = 175 + SYS_RT_SIGPENDING = 176 + SYS_RT_SIGTIMEDWAIT = 177 + SYS_RT_SIGQUEUEINFO = 178 + SYS_RT_SIGSUSPEND = 179 + SYS_PREAD64 = 180 + SYS_PWRITE64 = 181 + SYS_GETCWD = 183 + SYS_CAPGET = 184 + SYS_CAPSET = 185 + SYS_SIGALTSTACK = 186 + SYS_SENDFILE = 187 + SYS_GETPMSG = 188 + SYS_PUTPMSG = 189 + SYS_VFORK = 190 + SYS_PIVOT_ROOT = 217 + SYS_MINCORE = 218 + SYS_MADVISE = 219 + SYS_GETDENTS64 = 220 + SYS_READAHEAD = 222 + SYS_SETXATTR = 224 + SYS_LSETXATTR = 225 + SYS_FSETXATTR = 226 + SYS_GETXATTR = 227 + SYS_LGETXATTR = 228 + SYS_FGETXATTR = 229 + SYS_LISTXATTR = 230 + SYS_LLISTXATTR = 231 + SYS_FLISTXATTR = 232 + SYS_REMOVEXATTR = 233 + SYS_LREMOVEXATTR = 234 + SYS_FREMOVEXATTR = 235 + SYS_GETTID = 236 + SYS_TKILL = 237 + SYS_FUTEX = 238 + SYS_SCHED_SETAFFINITY = 239 + SYS_SCHED_GETAFFINITY = 240 + SYS_TGKILL = 241 + SYS_IO_SETUP = 243 + SYS_IO_DESTROY = 244 + SYS_IO_GETEVENTS = 245 + SYS_IO_SUBMIT = 246 + SYS_IO_CANCEL = 247 + SYS_EXIT_GROUP = 248 + SYS_EPOLL_CREATE = 249 + SYS_EPOLL_CTL = 250 + SYS_EPOLL_WAIT = 251 + SYS_SET_TID_ADDRESS = 252 + SYS_FADVISE64 = 253 + SYS_TIMER_CREATE = 254 + SYS_TIMER_SETTIME = 255 + SYS_TIMER_GETTIME = 256 + SYS_TIMER_GETOVERRUN = 257 + SYS_TIMER_DELETE = 258 + SYS_CLOCK_SETTIME = 259 + SYS_CLOCK_GETTIME = 260 + SYS_CLOCK_GETRES = 261 + SYS_CLOCK_NANOSLEEP = 262 + SYS_STATFS64 = 265 + SYS_FSTATFS64 = 266 + SYS_REMAP_FILE_PAGES = 267 + SYS_MBIND = 268 + SYS_GET_MEMPOLICY = 269 + SYS_SET_MEMPOLICY = 270 + SYS_MQ_OPEN = 271 + SYS_MQ_UNLINK = 272 + SYS_MQ_TIMEDSEND = 273 + SYS_MQ_TIMEDRECEIVE = 274 + SYS_MQ_NOTIFY = 275 + SYS_MQ_GETSETATTR = 276 + SYS_KEXEC_LOAD = 277 + SYS_ADD_KEY = 278 + SYS_REQUEST_KEY = 279 + SYS_KEYCTL = 280 + SYS_WAITID = 281 + SYS_IOPRIO_SET = 282 + SYS_IOPRIO_GET = 283 + SYS_INOTIFY_INIT = 284 + SYS_INOTIFY_ADD_WATCH = 285 + SYS_INOTIFY_RM_WATCH = 286 + SYS_MIGRATE_PAGES = 287 + SYS_OPENAT = 288 + SYS_MKDIRAT = 289 + SYS_MKNODAT = 290 + SYS_FCHOWNAT = 291 + SYS_FUTIMESAT = 292 + SYS_UNLINKAT = 294 + SYS_RENAMEAT = 295 + SYS_LINKAT = 296 + SYS_SYMLINKAT = 297 + SYS_READLINKAT = 298 + SYS_FCHMODAT = 299 + SYS_FACCESSAT = 300 + SYS_PSELECT6 = 301 + SYS_PPOLL = 302 + SYS_UNSHARE = 303 + SYS_SET_ROBUST_LIST = 304 + SYS_GET_ROBUST_LIST = 305 + SYS_SPLICE = 306 + SYS_SYNC_FILE_RANGE = 307 + SYS_TEE = 308 + SYS_VMSPLICE = 309 + SYS_MOVE_PAGES = 310 + SYS_GETCPU = 311 + SYS_EPOLL_PWAIT = 312 + SYS_UTIMES = 313 + SYS_FALLOCATE = 314 + SYS_UTIMENSAT = 315 + SYS_SIGNALFD = 316 + SYS_TIMERFD = 317 + SYS_EVENTFD = 318 + SYS_TIMERFD_CREATE = 319 + SYS_TIMERFD_SETTIME = 320 + SYS_TIMERFD_GETTIME = 321 + SYS_SIGNALFD4 = 322 + SYS_EVENTFD2 = 323 + SYS_INOTIFY_INIT1 = 324 + SYS_PIPE2 = 325 + SYS_DUP3 = 326 + SYS_EPOLL_CREATE1 = 327 + SYS_PREADV = 328 + SYS_PWRITEV = 329 + SYS_RT_TGSIGQUEUEINFO = 330 + SYS_PERF_EVENT_OPEN = 331 + SYS_FANOTIFY_INIT = 332 + SYS_FANOTIFY_MARK = 333 + SYS_PRLIMIT64 = 334 + SYS_NAME_TO_HANDLE_AT = 335 + SYS_OPEN_BY_HANDLE_AT = 336 + SYS_CLOCK_ADJTIME = 337 + SYS_SYNCFS = 338 + SYS_SETNS = 339 + SYS_PROCESS_VM_READV = 340 + SYS_PROCESS_VM_WRITEV = 341 + SYS_S390_RUNTIME_INSTR = 342 + SYS_KCMP = 343 + SYS_FINIT_MODULE = 344 + SYS_SCHED_SETATTR = 345 + SYS_SCHED_GETATTR = 346 + SYS_RENAMEAT2 = 347 + SYS_SECCOMP = 348 + SYS_GETRANDOM = 349 + SYS_MEMFD_CREATE = 350 + SYS_BPF = 351 + SYS_S390_PCI_MMIO_WRITE = 352 + SYS_S390_PCI_MMIO_READ = 353 + SYS_EXECVEAT = 354 + SYS_USERFAULTFD = 355 + SYS_MEMBARRIER = 356 + SYS_RECVMMSG = 357 + SYS_SENDMMSG = 358 + SYS_SOCKET = 359 + SYS_SOCKETPAIR = 360 + SYS_BIND = 361 + SYS_CONNECT = 362 + SYS_LISTEN = 363 + SYS_ACCEPT4 = 364 + SYS_GETSOCKOPT = 365 + SYS_SETSOCKOPT = 366 + SYS_GETSOCKNAME = 367 + SYS_GETPEERNAME = 368 + SYS_SENDTO = 369 + SYS_SENDMSG = 370 + SYS_RECVFROM = 371 + SYS_RECVMSG = 372 + SYS_SHUTDOWN = 373 + SYS_MLOCK2 = 374 + SYS_COPY_FILE_RANGE = 375 + SYS_PREADV2 = 376 + SYS_PWRITEV2 = 377 + SYS_S390_GUARDED_STORAGE = 378 + SYS_STATX = 379 + SYS_SELECT = 142 + SYS_GETRLIMIT = 191 + SYS_LCHOWN = 198 + SYS_GETUID = 199 + SYS_GETGID = 200 + SYS_GETEUID = 201 + SYS_GETEGID = 202 + SYS_SETREUID = 203 + SYS_SETREGID = 204 + SYS_GETGROUPS = 205 + SYS_SETGROUPS = 206 + SYS_FCHOWN = 207 + SYS_SETRESUID = 208 + SYS_GETRESUID = 209 + SYS_SETRESGID = 210 + SYS_GETRESGID = 211 + SYS_CHOWN = 212 + SYS_SETUID = 213 + SYS_SETGID = 214 + SYS_SETFSUID = 215 + SYS_SETFSGID = 216 + SYS_NEWFSTATAT = 293 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go new file mode 100644 index 0000000..c9c129d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go @@ -0,0 +1,348 @@ +// mksysnum_linux.pl -Ilinux/usr/include -m64 -D__arch64__ linux/usr/include/asm/unistd.h +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build sparc64,linux + +package unix + +const ( + SYS_RESTART_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_WAIT4 = 7 + SYS_CREAT = 8 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_EXECV = 11 + SYS_CHDIR = 12 + SYS_CHOWN = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_LCHOWN = 16 + SYS_BRK = 17 + SYS_PERFCTR = 18 + SYS_LSEEK = 19 + SYS_GETPID = 20 + SYS_CAPGET = 21 + SYS_CAPSET = 22 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_VMSPLICE = 25 + SYS_PTRACE = 26 + SYS_ALARM = 27 + SYS_SIGALTSTACK = 28 + SYS_PAUSE = 29 + SYS_UTIME = 30 + SYS_ACCESS = 33 + SYS_NICE = 34 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_STAT = 38 + SYS_SENDFILE = 39 + SYS_LSTAT = 40 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_TIMES = 43 + SYS_UMOUNT2 = 45 + SYS_SETGID = 46 + SYS_GETGID = 47 + SYS_SIGNAL = 48 + SYS_GETEUID = 49 + SYS_GETEGID = 50 + SYS_ACCT = 51 + SYS_MEMORY_ORDERING = 52 + SYS_IOCTL = 54 + SYS_REBOOT = 55 + SYS_SYMLINK = 57 + SYS_READLINK = 58 + SYS_EXECVE = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_FSTAT = 62 + SYS_FSTAT64 = 63 + SYS_GETPAGESIZE = 64 + SYS_MSYNC = 65 + SYS_VFORK = 66 + SYS_PREAD64 = 67 + SYS_PWRITE64 = 68 + SYS_MMAP = 71 + SYS_MUNMAP = 73 + SYS_MPROTECT = 74 + SYS_MADVISE = 75 + SYS_VHANGUP = 76 + SYS_MINCORE = 78 + SYS_GETGROUPS = 79 + SYS_SETGROUPS = 80 + SYS_GETPGRP = 81 + SYS_SETITIMER = 83 + SYS_SWAPON = 85 + SYS_GETITIMER = 86 + SYS_SETHOSTNAME = 88 + SYS_DUP2 = 90 + SYS_FCNTL = 92 + SYS_SELECT = 93 + SYS_FSYNC = 95 + SYS_SETPRIORITY = 96 + SYS_SOCKET = 97 + SYS_CONNECT = 98 + SYS_ACCEPT = 99 + SYS_GETPRIORITY = 100 + SYS_RT_SIGRETURN = 101 + SYS_RT_SIGACTION = 102 + SYS_RT_SIGPROCMASK = 103 + SYS_RT_SIGPENDING = 104 + SYS_RT_SIGTIMEDWAIT = 105 + SYS_RT_SIGQUEUEINFO = 106 + SYS_RT_SIGSUSPEND = 107 + SYS_SETRESUID = 108 + SYS_GETRESUID = 109 + SYS_SETRESGID = 110 + SYS_GETRESGID = 111 + SYS_RECVMSG = 113 + SYS_SENDMSG = 114 + SYS_GETTIMEOFDAY = 116 + SYS_GETRUSAGE = 117 + SYS_GETSOCKOPT = 118 + SYS_GETCWD = 119 + SYS_READV = 120 + SYS_WRITEV = 121 + SYS_SETTIMEOFDAY = 122 + SYS_FCHOWN = 123 + SYS_FCHMOD = 124 + SYS_RECVFROM = 125 + SYS_SETREUID = 126 + SYS_SETREGID = 127 + SYS_RENAME = 128 + SYS_TRUNCATE = 129 + SYS_FTRUNCATE = 130 + SYS_FLOCK = 131 + SYS_LSTAT64 = 132 + SYS_SENDTO = 133 + SYS_SHUTDOWN = 134 + SYS_SOCKETPAIR = 135 + SYS_MKDIR = 136 + SYS_RMDIR = 137 + SYS_UTIMES = 138 + SYS_STAT64 = 139 + SYS_SENDFILE64 = 140 + SYS_GETPEERNAME = 141 + SYS_FUTEX = 142 + SYS_GETTID = 143 + SYS_GETRLIMIT = 144 + SYS_SETRLIMIT = 145 + SYS_PIVOT_ROOT = 146 + SYS_PRCTL = 147 + SYS_PCICONFIG_READ = 148 + SYS_PCICONFIG_WRITE = 149 + SYS_GETSOCKNAME = 150 + SYS_INOTIFY_INIT = 151 + SYS_INOTIFY_ADD_WATCH = 152 + SYS_POLL = 153 + SYS_GETDENTS64 = 154 + SYS_INOTIFY_RM_WATCH = 156 + SYS_STATFS = 157 + SYS_FSTATFS = 158 + SYS_UMOUNT = 159 + SYS_SCHED_SET_AFFINITY = 160 + SYS_SCHED_GET_AFFINITY = 161 + SYS_GETDOMAINNAME = 162 + SYS_SETDOMAINNAME = 163 + SYS_UTRAP_INSTALL = 164 + SYS_QUOTACTL = 165 + SYS_SET_TID_ADDRESS = 166 + SYS_MOUNT = 167 + SYS_USTAT = 168 + SYS_SETXATTR = 169 + SYS_LSETXATTR = 170 + SYS_FSETXATTR = 171 + SYS_GETXATTR = 172 + SYS_LGETXATTR = 173 + SYS_GETDENTS = 174 + SYS_SETSID = 175 + SYS_FCHDIR = 176 + SYS_FGETXATTR = 177 + SYS_LISTXATTR = 178 + SYS_LLISTXATTR = 179 + SYS_FLISTXATTR = 180 + SYS_REMOVEXATTR = 181 + SYS_LREMOVEXATTR = 182 + SYS_SIGPENDING = 183 + SYS_QUERY_MODULE = 184 + SYS_SETPGID = 185 + SYS_FREMOVEXATTR = 186 + SYS_TKILL = 187 + SYS_EXIT_GROUP = 188 + SYS_UNAME = 189 + SYS_INIT_MODULE = 190 + SYS_PERSONALITY = 191 + SYS_REMAP_FILE_PAGES = 192 + SYS_EPOLL_CREATE = 193 + SYS_EPOLL_CTL = 194 + SYS_EPOLL_WAIT = 195 + SYS_IOPRIO_SET = 196 + SYS_GETPPID = 197 + SYS_SIGACTION = 198 + SYS_SGETMASK = 199 + SYS_SSETMASK = 200 + SYS_SIGSUSPEND = 201 + SYS_OLDLSTAT = 202 + SYS_USELIB = 203 + SYS_READDIR = 204 + SYS_READAHEAD = 205 + SYS_SOCKETCALL = 206 + SYS_SYSLOG = 207 + SYS_LOOKUP_DCOOKIE = 208 + SYS_FADVISE64 = 209 + SYS_FADVISE64_64 = 210 + SYS_TGKILL = 211 + SYS_WAITPID = 212 + SYS_SWAPOFF = 213 + SYS_SYSINFO = 214 + SYS_IPC = 215 + SYS_SIGRETURN = 216 + SYS_CLONE = 217 + SYS_IOPRIO_GET = 218 + SYS_ADJTIMEX = 219 + SYS_SIGPROCMASK = 220 + SYS_CREATE_MODULE = 221 + SYS_DELETE_MODULE = 222 + SYS_GET_KERNEL_SYMS = 223 + SYS_GETPGID = 224 + SYS_BDFLUSH = 225 + SYS_SYSFS = 226 + SYS_AFS_SYSCALL = 227 + SYS_SETFSUID = 228 + SYS_SETFSGID = 229 + SYS__NEWSELECT = 230 + SYS_SPLICE = 232 + SYS_STIME = 233 + SYS_STATFS64 = 234 + SYS_FSTATFS64 = 235 + SYS__LLSEEK = 236 + SYS_MLOCK = 237 + SYS_MUNLOCK = 238 + SYS_MLOCKALL = 239 + SYS_MUNLOCKALL = 240 + SYS_SCHED_SETPARAM = 241 + SYS_SCHED_GETPARAM = 242 + SYS_SCHED_SETSCHEDULER = 243 + SYS_SCHED_GETSCHEDULER = 244 + SYS_SCHED_YIELD = 245 + SYS_SCHED_GET_PRIORITY_MAX = 246 + SYS_SCHED_GET_PRIORITY_MIN = 247 + SYS_SCHED_RR_GET_INTERVAL = 248 + SYS_NANOSLEEP = 249 + SYS_MREMAP = 250 + SYS__SYSCTL = 251 + SYS_GETSID = 252 + SYS_FDATASYNC = 253 + SYS_NFSSERVCTL = 254 + SYS_SYNC_FILE_RANGE = 255 + SYS_CLOCK_SETTIME = 256 + SYS_CLOCK_GETTIME = 257 + SYS_CLOCK_GETRES = 258 + SYS_CLOCK_NANOSLEEP = 259 + SYS_SCHED_GETAFFINITY = 260 + SYS_SCHED_SETAFFINITY = 261 + SYS_TIMER_SETTIME = 262 + SYS_TIMER_GETTIME = 263 + SYS_TIMER_GETOVERRUN = 264 + SYS_TIMER_DELETE = 265 + SYS_TIMER_CREATE = 266 + SYS_IO_SETUP = 268 + SYS_IO_DESTROY = 269 + SYS_IO_SUBMIT = 270 + SYS_IO_CANCEL = 271 + SYS_IO_GETEVENTS = 272 + SYS_MQ_OPEN = 273 + SYS_MQ_UNLINK = 274 + SYS_MQ_TIMEDSEND = 275 + SYS_MQ_TIMEDRECEIVE = 276 + SYS_MQ_NOTIFY = 277 + SYS_MQ_GETSETATTR = 278 + SYS_WAITID = 279 + SYS_TEE = 280 + SYS_ADD_KEY = 281 + SYS_REQUEST_KEY = 282 + SYS_KEYCTL = 283 + SYS_OPENAT = 284 + SYS_MKDIRAT = 285 + SYS_MKNODAT = 286 + SYS_FCHOWNAT = 287 + SYS_FUTIMESAT = 288 + SYS_FSTATAT64 = 289 + SYS_UNLINKAT = 290 + SYS_RENAMEAT = 291 + SYS_LINKAT = 292 + SYS_SYMLINKAT = 293 + SYS_READLINKAT = 294 + SYS_FCHMODAT = 295 + SYS_FACCESSAT = 296 + SYS_PSELECT6 = 297 + SYS_PPOLL = 298 + SYS_UNSHARE = 299 + SYS_SET_ROBUST_LIST = 300 + SYS_GET_ROBUST_LIST = 301 + SYS_MIGRATE_PAGES = 302 + SYS_MBIND = 303 + SYS_GET_MEMPOLICY = 304 + SYS_SET_MEMPOLICY = 305 + SYS_KEXEC_LOAD = 306 + SYS_MOVE_PAGES = 307 + SYS_GETCPU = 308 + SYS_EPOLL_PWAIT = 309 + SYS_UTIMENSAT = 310 + SYS_SIGNALFD = 311 + SYS_TIMERFD_CREATE = 312 + SYS_EVENTFD = 313 + SYS_FALLOCATE = 314 + SYS_TIMERFD_SETTIME = 315 + SYS_TIMERFD_GETTIME = 316 + SYS_SIGNALFD4 = 317 + SYS_EVENTFD2 = 318 + SYS_EPOLL_CREATE1 = 319 + SYS_DUP3 = 320 + SYS_PIPE2 = 321 + SYS_INOTIFY_INIT1 = 322 + SYS_ACCEPT4 = 323 + SYS_PREADV = 324 + SYS_PWRITEV = 325 + SYS_RT_TGSIGQUEUEINFO = 326 + SYS_PERF_EVENT_OPEN = 327 + SYS_RECVMMSG = 328 + SYS_FANOTIFY_INIT = 329 + SYS_FANOTIFY_MARK = 330 + SYS_PRLIMIT64 = 331 + SYS_NAME_TO_HANDLE_AT = 332 + SYS_OPEN_BY_HANDLE_AT = 333 + SYS_CLOCK_ADJTIME = 334 + SYS_SYNCFS = 335 + SYS_SENDMMSG = 336 + SYS_SETNS = 337 + SYS_PROCESS_VM_READV = 338 + SYS_PROCESS_VM_WRITEV = 339 + SYS_KERN_FEATURES = 340 + SYS_KCMP = 341 + SYS_FINIT_MODULE = 342 + SYS_SCHED_SETATTR = 343 + SYS_SCHED_GETATTR = 344 + SYS_RENAMEAT2 = 345 + SYS_SECCOMP = 346 + SYS_GETRANDOM = 347 + SYS_MEMFD_CREATE = 348 + SYS_BPF = 349 + SYS_EXECVEAT = 350 + SYS_MEMBARRIER = 351 + SYS_USERFAULTFD = 352 + SYS_BIND = 353 + SYS_LISTEN = 354 + SYS_SETSOCKOPT = 355 + SYS_MLOCK2 = 356 + SYS_COPY_FILE_RANGE = 357 + SYS_PREADV2 = 358 + SYS_PWRITEV2 = 359 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go new file mode 100644 index 0000000..8afda9c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go @@ -0,0 +1,274 @@ +// mksysnum_netbsd.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build 386,netbsd + +package unix + +const ( + SYS_EXIT = 1 // { void|sys||exit(int rval); } + SYS_FORK = 2 // { int|sys||fork(void); } + SYS_READ = 3 // { ssize_t|sys||read(int fd, void *buf, size_t nbyte); } + SYS_WRITE = 4 // { ssize_t|sys||write(int fd, const void *buf, size_t nbyte); } + SYS_OPEN = 5 // { int|sys||open(const char *path, int flags, ... mode_t mode); } + SYS_CLOSE = 6 // { int|sys||close(int fd); } + SYS_LINK = 9 // { int|sys||link(const char *path, const char *link); } + SYS_UNLINK = 10 // { int|sys||unlink(const char *path); } + SYS_CHDIR = 12 // { int|sys||chdir(const char *path); } + SYS_FCHDIR = 13 // { int|sys||fchdir(int fd); } + SYS_CHMOD = 15 // { int|sys||chmod(const char *path, mode_t mode); } + SYS_CHOWN = 16 // { int|sys||chown(const char *path, uid_t uid, gid_t gid); } + SYS_BREAK = 17 // { int|sys||obreak(char *nsize); } + SYS_GETPID = 20 // { pid_t|sys||getpid_with_ppid(void); } + SYS_UNMOUNT = 22 // { int|sys||unmount(const char *path, int flags); } + SYS_SETUID = 23 // { int|sys||setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t|sys||getuid_with_euid(void); } + SYS_GETEUID = 25 // { uid_t|sys||geteuid(void); } + SYS_PTRACE = 26 // { int|sys||ptrace(int req, pid_t pid, void *addr, int data); } + SYS_RECVMSG = 27 // { ssize_t|sys||recvmsg(int s, struct msghdr *msg, int flags); } + SYS_SENDMSG = 28 // { ssize_t|sys||sendmsg(int s, const struct msghdr *msg, int flags); } + SYS_RECVFROM = 29 // { ssize_t|sys||recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlenaddr); } + SYS_ACCEPT = 30 // { int|sys||accept(int s, struct sockaddr *name, socklen_t *anamelen); } + SYS_GETPEERNAME = 31 // { int|sys||getpeername(int fdes, struct sockaddr *asa, socklen_t *alen); } + SYS_GETSOCKNAME = 32 // { int|sys||getsockname(int fdes, struct sockaddr *asa, socklen_t *alen); } + SYS_ACCESS = 33 // { int|sys||access(const char *path, int flags); } + SYS_CHFLAGS = 34 // { int|sys||chflags(const char *path, u_long flags); } + SYS_FCHFLAGS = 35 // { int|sys||fchflags(int fd, u_long flags); } + SYS_SYNC = 36 // { void|sys||sync(void); } + SYS_KILL = 37 // { int|sys||kill(pid_t pid, int signum); } + SYS_GETPPID = 39 // { pid_t|sys||getppid(void); } + SYS_DUP = 41 // { int|sys||dup(int fd); } + SYS_PIPE = 42 // { int|sys||pipe(void); } + SYS_GETEGID = 43 // { gid_t|sys||getegid(void); } + SYS_PROFIL = 44 // { int|sys||profil(char *samples, size_t size, u_long offset, u_int scale); } + SYS_KTRACE = 45 // { int|sys||ktrace(const char *fname, int ops, int facs, pid_t pid); } + SYS_GETGID = 47 // { gid_t|sys||getgid_with_egid(void); } + SYS___GETLOGIN = 49 // { int|sys||__getlogin(char *namebuf, size_t namelen); } + SYS___SETLOGIN = 50 // { int|sys||__setlogin(const char *namebuf); } + SYS_ACCT = 51 // { int|sys||acct(const char *path); } + SYS_IOCTL = 54 // { int|sys||ioctl(int fd, u_long com, ... void *data); } + SYS_REVOKE = 56 // { int|sys||revoke(const char *path); } + SYS_SYMLINK = 57 // { int|sys||symlink(const char *path, const char *link); } + SYS_READLINK = 58 // { ssize_t|sys||readlink(const char *path, char *buf, size_t count); } + SYS_EXECVE = 59 // { int|sys||execve(const char *path, char * const *argp, char * const *envp); } + SYS_UMASK = 60 // { mode_t|sys||umask(mode_t newmask); } + SYS_CHROOT = 61 // { int|sys||chroot(const char *path); } + SYS_VFORK = 66 // { int|sys||vfork(void); } + SYS_SBRK = 69 // { int|sys||sbrk(intptr_t incr); } + SYS_SSTK = 70 // { int|sys||sstk(int incr); } + SYS_VADVISE = 72 // { int|sys||ovadvise(int anom); } + SYS_MUNMAP = 73 // { int|sys||munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int|sys||mprotect(void *addr, size_t len, int prot); } + SYS_MADVISE = 75 // { int|sys||madvise(void *addr, size_t len, int behav); } + SYS_MINCORE = 78 // { int|sys||mincore(void *addr, size_t len, char *vec); } + SYS_GETGROUPS = 79 // { int|sys||getgroups(int gidsetsize, gid_t *gidset); } + SYS_SETGROUPS = 80 // { int|sys||setgroups(int gidsetsize, const gid_t *gidset); } + SYS_GETPGRP = 81 // { int|sys||getpgrp(void); } + SYS_SETPGID = 82 // { int|sys||setpgid(pid_t pid, pid_t pgid); } + SYS_DUP2 = 90 // { int|sys||dup2(int from, int to); } + SYS_FCNTL = 92 // { int|sys||fcntl(int fd, int cmd, ... void *arg); } + SYS_FSYNC = 95 // { int|sys||fsync(int fd); } + SYS_SETPRIORITY = 96 // { int|sys||setpriority(int which, id_t who, int prio); } + SYS_CONNECT = 98 // { int|sys||connect(int s, const struct sockaddr *name, socklen_t namelen); } + SYS_GETPRIORITY = 100 // { int|sys||getpriority(int which, id_t who); } + SYS_BIND = 104 // { int|sys||bind(int s, const struct sockaddr *name, socklen_t namelen); } + SYS_SETSOCKOPT = 105 // { int|sys||setsockopt(int s, int level, int name, const void *val, socklen_t valsize); } + SYS_LISTEN = 106 // { int|sys||listen(int s, int backlog); } + SYS_GETSOCKOPT = 118 // { int|sys||getsockopt(int s, int level, int name, void *val, socklen_t *avalsize); } + SYS_READV = 120 // { ssize_t|sys||readv(int fd, const struct iovec *iovp, int iovcnt); } + SYS_WRITEV = 121 // { ssize_t|sys||writev(int fd, const struct iovec *iovp, int iovcnt); } + SYS_FCHOWN = 123 // { int|sys||fchown(int fd, uid_t uid, gid_t gid); } + SYS_FCHMOD = 124 // { int|sys||fchmod(int fd, mode_t mode); } + SYS_SETREUID = 126 // { int|sys||setreuid(uid_t ruid, uid_t euid); } + SYS_SETREGID = 127 // { int|sys||setregid(gid_t rgid, gid_t egid); } + SYS_RENAME = 128 // { int|sys||rename(const char *from, const char *to); } + SYS_FLOCK = 131 // { int|sys||flock(int fd, int how); } + SYS_MKFIFO = 132 // { int|sys||mkfifo(const char *path, mode_t mode); } + SYS_SENDTO = 133 // { ssize_t|sys||sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen); } + SYS_SHUTDOWN = 134 // { int|sys||shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int|sys||socketpair(int domain, int type, int protocol, int *rsv); } + SYS_MKDIR = 136 // { int|sys||mkdir(const char *path, mode_t mode); } + SYS_RMDIR = 137 // { int|sys||rmdir(const char *path); } + SYS_SETSID = 147 // { int|sys||setsid(void); } + SYS_SYSARCH = 165 // { int|sys||sysarch(int op, void *parms); } + SYS_PREAD = 173 // { ssize_t|sys||pread(int fd, void *buf, size_t nbyte, int PAD, off_t offset); } + SYS_PWRITE = 174 // { ssize_t|sys||pwrite(int fd, const void *buf, size_t nbyte, int PAD, off_t offset); } + SYS_NTP_ADJTIME = 176 // { int|sys||ntp_adjtime(struct timex *tp); } + SYS_SETGID = 181 // { int|sys||setgid(gid_t gid); } + SYS_SETEGID = 182 // { int|sys||setegid(gid_t egid); } + SYS_SETEUID = 183 // { int|sys||seteuid(uid_t euid); } + SYS_PATHCONF = 191 // { long|sys||pathconf(const char *path, int name); } + SYS_FPATHCONF = 192 // { long|sys||fpathconf(int fd, int name); } + SYS_GETRLIMIT = 194 // { int|sys||getrlimit(int which, struct rlimit *rlp); } + SYS_SETRLIMIT = 195 // { int|sys||setrlimit(int which, const struct rlimit *rlp); } + SYS_MMAP = 197 // { void *|sys||mmap(void *addr, size_t len, int prot, int flags, int fd, long PAD, off_t pos); } + SYS_LSEEK = 199 // { off_t|sys||lseek(int fd, int PAD, off_t offset, int whence); } + SYS_TRUNCATE = 200 // { int|sys||truncate(const char *path, int PAD, off_t length); } + SYS_FTRUNCATE = 201 // { int|sys||ftruncate(int fd, int PAD, off_t length); } + SYS___SYSCTL = 202 // { int|sys||__sysctl(const int *name, u_int namelen, void *old, size_t *oldlenp, const void *new, size_t newlen); } + SYS_MLOCK = 203 // { int|sys||mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int|sys||munlock(const void *addr, size_t len); } + SYS_UNDELETE = 205 // { int|sys||undelete(const char *path); } + SYS_GETPGID = 207 // { pid_t|sys||getpgid(pid_t pid); } + SYS_REBOOT = 208 // { int|sys||reboot(int opt, char *bootstr); } + SYS_POLL = 209 // { int|sys||poll(struct pollfd *fds, u_int nfds, int timeout); } + SYS_SEMGET = 221 // { int|sys||semget(key_t key, int nsems, int semflg); } + SYS_SEMOP = 222 // { int|sys||semop(int semid, struct sembuf *sops, size_t nsops); } + SYS_SEMCONFIG = 223 // { int|sys||semconfig(int flag); } + SYS_MSGGET = 225 // { int|sys||msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int|sys||msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); } + SYS_MSGRCV = 227 // { ssize_t|sys||msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } + SYS_SHMAT = 228 // { void *|sys||shmat(int shmid, const void *shmaddr, int shmflg); } + SYS_SHMDT = 230 // { int|sys||shmdt(const void *shmaddr); } + SYS_SHMGET = 231 // { int|sys||shmget(key_t key, size_t size, int shmflg); } + SYS_TIMER_CREATE = 235 // { int|sys||timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid); } + SYS_TIMER_DELETE = 236 // { int|sys||timer_delete(timer_t timerid); } + SYS_TIMER_GETOVERRUN = 239 // { int|sys||timer_getoverrun(timer_t timerid); } + SYS_FDATASYNC = 241 // { int|sys||fdatasync(int fd); } + SYS_MLOCKALL = 242 // { int|sys||mlockall(int flags); } + SYS_MUNLOCKALL = 243 // { int|sys||munlockall(void); } + SYS_SIGQUEUEINFO = 245 // { int|sys||sigqueueinfo(pid_t pid, const siginfo_t *info); } + SYS_MODCTL = 246 // { int|sys||modctl(int cmd, void *arg); } + SYS___POSIX_RENAME = 270 // { int|sys||__posix_rename(const char *from, const char *to); } + SYS_SWAPCTL = 271 // { int|sys||swapctl(int cmd, void *arg, int misc); } + SYS_MINHERIT = 273 // { int|sys||minherit(void *addr, size_t len, int inherit); } + SYS_LCHMOD = 274 // { int|sys||lchmod(const char *path, mode_t mode); } + SYS_LCHOWN = 275 // { int|sys||lchown(const char *path, uid_t uid, gid_t gid); } + SYS_MSYNC = 277 // { int|sys|13|msync(void *addr, size_t len, int flags); } + SYS___POSIX_CHOWN = 283 // { int|sys||__posix_chown(const char *path, uid_t uid, gid_t gid); } + SYS___POSIX_FCHOWN = 284 // { int|sys||__posix_fchown(int fd, uid_t uid, gid_t gid); } + SYS___POSIX_LCHOWN = 285 // { int|sys||__posix_lchown(const char *path, uid_t uid, gid_t gid); } + SYS_GETSID = 286 // { pid_t|sys||getsid(pid_t pid); } + SYS___CLONE = 287 // { pid_t|sys||__clone(int flags, void *stack); } + SYS_FKTRACE = 288 // { int|sys||fktrace(int fd, int ops, int facs, pid_t pid); } + SYS_PREADV = 289 // { ssize_t|sys||preadv(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } + SYS_PWRITEV = 290 // { ssize_t|sys||pwritev(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } + SYS___GETCWD = 296 // { int|sys||__getcwd(char *bufp, size_t length); } + SYS_FCHROOT = 297 // { int|sys||fchroot(int fd); } + SYS_LCHFLAGS = 304 // { int|sys||lchflags(const char *path, u_long flags); } + SYS_ISSETUGID = 305 // { int|sys||issetugid(void); } + SYS_UTRACE = 306 // { int|sys||utrace(const char *label, void *addr, size_t len); } + SYS_GETCONTEXT = 307 // { int|sys||getcontext(struct __ucontext *ucp); } + SYS_SETCONTEXT = 308 // { int|sys||setcontext(const struct __ucontext *ucp); } + SYS__LWP_CREATE = 309 // { int|sys||_lwp_create(const struct __ucontext *ucp, u_long flags, lwpid_t *new_lwp); } + SYS__LWP_EXIT = 310 // { int|sys||_lwp_exit(void); } + SYS__LWP_SELF = 311 // { lwpid_t|sys||_lwp_self(void); } + SYS__LWP_WAIT = 312 // { int|sys||_lwp_wait(lwpid_t wait_for, lwpid_t *departed); } + SYS__LWP_SUSPEND = 313 // { int|sys||_lwp_suspend(lwpid_t target); } + SYS__LWP_CONTINUE = 314 // { int|sys||_lwp_continue(lwpid_t target); } + SYS__LWP_WAKEUP = 315 // { int|sys||_lwp_wakeup(lwpid_t target); } + SYS__LWP_GETPRIVATE = 316 // { void *|sys||_lwp_getprivate(void); } + SYS__LWP_SETPRIVATE = 317 // { void|sys||_lwp_setprivate(void *ptr); } + SYS__LWP_KILL = 318 // { int|sys||_lwp_kill(lwpid_t target, int signo); } + SYS__LWP_DETACH = 319 // { int|sys||_lwp_detach(lwpid_t target); } + SYS__LWP_UNPARK = 321 // { int|sys||_lwp_unpark(lwpid_t target, const void *hint); } + SYS__LWP_UNPARK_ALL = 322 // { ssize_t|sys||_lwp_unpark_all(const lwpid_t *targets, size_t ntargets, const void *hint); } + SYS__LWP_SETNAME = 323 // { int|sys||_lwp_setname(lwpid_t target, const char *name); } + SYS__LWP_GETNAME = 324 // { int|sys||_lwp_getname(lwpid_t target, char *name, size_t len); } + SYS__LWP_CTL = 325 // { int|sys||_lwp_ctl(int features, struct lwpctl **address); } + SYS___SIGACTION_SIGTRAMP = 340 // { int|sys||__sigaction_sigtramp(int signum, const struct sigaction *nsa, struct sigaction *osa, const void *tramp, int vers); } + SYS_PMC_GET_INFO = 341 // { int|sys||pmc_get_info(int ctr, int op, void *args); } + SYS_PMC_CONTROL = 342 // { int|sys||pmc_control(int ctr, int op, void *args); } + SYS_RASCTL = 343 // { int|sys||rasctl(void *addr, size_t len, int op); } + SYS_KQUEUE = 344 // { int|sys||kqueue(void); } + SYS__SCHED_SETPARAM = 346 // { int|sys||_sched_setparam(pid_t pid, lwpid_t lid, int policy, const struct sched_param *params); } + SYS__SCHED_GETPARAM = 347 // { int|sys||_sched_getparam(pid_t pid, lwpid_t lid, int *policy, struct sched_param *params); } + SYS__SCHED_SETAFFINITY = 348 // { int|sys||_sched_setaffinity(pid_t pid, lwpid_t lid, size_t size, const cpuset_t *cpuset); } + SYS__SCHED_GETAFFINITY = 349 // { int|sys||_sched_getaffinity(pid_t pid, lwpid_t lid, size_t size, cpuset_t *cpuset); } + SYS_SCHED_YIELD = 350 // { int|sys||sched_yield(void); } + SYS_FSYNC_RANGE = 354 // { int|sys||fsync_range(int fd, int flags, off_t start, off_t length); } + SYS_UUIDGEN = 355 // { int|sys||uuidgen(struct uuid *store, int count); } + SYS_GETVFSSTAT = 356 // { int|sys||getvfsstat(struct statvfs *buf, size_t bufsize, int flags); } + SYS_STATVFS1 = 357 // { int|sys||statvfs1(const char *path, struct statvfs *buf, int flags); } + SYS_FSTATVFS1 = 358 // { int|sys||fstatvfs1(int fd, struct statvfs *buf, int flags); } + SYS_EXTATTRCTL = 360 // { int|sys||extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_FILE = 361 // { int|sys||extattr_set_file(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_FILE = 362 // { ssize_t|sys||extattr_get_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FILE = 363 // { int|sys||extattr_delete_file(const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_FD = 364 // { int|sys||extattr_set_fd(int fd, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_FD = 365 // { ssize_t|sys||extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FD = 366 // { int|sys||extattr_delete_fd(int fd, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_LINK = 367 // { int|sys||extattr_set_link(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_LINK = 368 // { ssize_t|sys||extattr_get_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_LINK = 369 // { int|sys||extattr_delete_link(const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_LIST_FD = 370 // { ssize_t|sys||extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_FILE = 371 // { ssize_t|sys||extattr_list_file(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_LINK = 372 // { ssize_t|sys||extattr_list_link(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_SETXATTR = 375 // { int|sys||setxattr(const char *path, const char *name, const void *value, size_t size, int flags); } + SYS_LSETXATTR = 376 // { int|sys||lsetxattr(const char *path, const char *name, const void *value, size_t size, int flags); } + SYS_FSETXATTR = 377 // { int|sys||fsetxattr(int fd, const char *name, const void *value, size_t size, int flags); } + SYS_GETXATTR = 378 // { int|sys||getxattr(const char *path, const char *name, void *value, size_t size); } + SYS_LGETXATTR = 379 // { int|sys||lgetxattr(const char *path, const char *name, void *value, size_t size); } + SYS_FGETXATTR = 380 // { int|sys||fgetxattr(int fd, const char *name, void *value, size_t size); } + SYS_LISTXATTR = 381 // { int|sys||listxattr(const char *path, char *list, size_t size); } + SYS_LLISTXATTR = 382 // { int|sys||llistxattr(const char *path, char *list, size_t size); } + SYS_FLISTXATTR = 383 // { int|sys||flistxattr(int fd, char *list, size_t size); } + SYS_REMOVEXATTR = 384 // { int|sys||removexattr(const char *path, const char *name); } + SYS_LREMOVEXATTR = 385 // { int|sys||lremovexattr(const char *path, const char *name); } + SYS_FREMOVEXATTR = 386 // { int|sys||fremovexattr(int fd, const char *name); } + SYS_GETDENTS = 390 // { int|sys|30|getdents(int fd, char *buf, size_t count); } + SYS_SOCKET = 394 // { int|sys|30|socket(int domain, int type, int protocol); } + SYS_GETFH = 395 // { int|sys|30|getfh(const char *fname, void *fhp, size_t *fh_size); } + SYS_MOUNT = 410 // { int|sys|50|mount(const char *type, const char *path, int flags, void *data, size_t data_len); } + SYS_MREMAP = 411 // { void *|sys||mremap(void *old_address, size_t old_size, void *new_address, size_t new_size, int flags); } + SYS_PSET_CREATE = 412 // { int|sys||pset_create(psetid_t *psid); } + SYS_PSET_DESTROY = 413 // { int|sys||pset_destroy(psetid_t psid); } + SYS_PSET_ASSIGN = 414 // { int|sys||pset_assign(psetid_t psid, cpuid_t cpuid, psetid_t *opsid); } + SYS__PSET_BIND = 415 // { int|sys||_pset_bind(idtype_t idtype, id_t first_id, id_t second_id, psetid_t psid, psetid_t *opsid); } + SYS_POSIX_FADVISE = 416 // { int|sys|50|posix_fadvise(int fd, int PAD, off_t offset, off_t len, int advice); } + SYS_SELECT = 417 // { int|sys|50|select(int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval *tv); } + SYS_GETTIMEOFDAY = 418 // { int|sys|50|gettimeofday(struct timeval *tp, void *tzp); } + SYS_SETTIMEOFDAY = 419 // { int|sys|50|settimeofday(const struct timeval *tv, const void *tzp); } + SYS_UTIMES = 420 // { int|sys|50|utimes(const char *path, const struct timeval *tptr); } + SYS_ADJTIME = 421 // { int|sys|50|adjtime(const struct timeval *delta, struct timeval *olddelta); } + SYS_FUTIMES = 423 // { int|sys|50|futimes(int fd, const struct timeval *tptr); } + SYS_LUTIMES = 424 // { int|sys|50|lutimes(const char *path, const struct timeval *tptr); } + SYS_SETITIMER = 425 // { int|sys|50|setitimer(int which, const struct itimerval *itv, struct itimerval *oitv); } + SYS_GETITIMER = 426 // { int|sys|50|getitimer(int which, struct itimerval *itv); } + SYS_CLOCK_GETTIME = 427 // { int|sys|50|clock_gettime(clockid_t clock_id, struct timespec *tp); } + SYS_CLOCK_SETTIME = 428 // { int|sys|50|clock_settime(clockid_t clock_id, const struct timespec *tp); } + SYS_CLOCK_GETRES = 429 // { int|sys|50|clock_getres(clockid_t clock_id, struct timespec *tp); } + SYS_NANOSLEEP = 430 // { int|sys|50|nanosleep(const struct timespec *rqtp, struct timespec *rmtp); } + SYS___SIGTIMEDWAIT = 431 // { int|sys|50|__sigtimedwait(const sigset_t *set, siginfo_t *info, struct timespec *timeout); } + SYS__LWP_PARK = 434 // { int|sys|50|_lwp_park(const struct timespec *ts, lwpid_t unpark, const void *hint, const void *unparkhint); } + SYS_KEVENT = 435 // { int|sys|50|kevent(int fd, const struct kevent *changelist, size_t nchanges, struct kevent *eventlist, size_t nevents, const struct timespec *timeout); } + SYS_PSELECT = 436 // { int|sys|50|pselect(int nd, fd_set *in, fd_set *ou, fd_set *ex, const struct timespec *ts, const sigset_t *mask); } + SYS_POLLTS = 437 // { int|sys|50|pollts(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *mask); } + SYS_STAT = 439 // { int|sys|50|stat(const char *path, struct stat *ub); } + SYS_FSTAT = 440 // { int|sys|50|fstat(int fd, struct stat *sb); } + SYS_LSTAT = 441 // { int|sys|50|lstat(const char *path, struct stat *ub); } + SYS___SEMCTL = 442 // { int|sys|50|__semctl(int semid, int semnum, int cmd, ... union __semun *arg); } + SYS_SHMCTL = 443 // { int|sys|50|shmctl(int shmid, int cmd, struct shmid_ds *buf); } + SYS_MSGCTL = 444 // { int|sys|50|msgctl(int msqid, int cmd, struct msqid_ds *buf); } + SYS_GETRUSAGE = 445 // { int|sys|50|getrusage(int who, struct rusage *rusage); } + SYS_TIMER_SETTIME = 446 // { int|sys|50|timer_settime(timer_t timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue); } + SYS_TIMER_GETTIME = 447 // { int|sys|50|timer_gettime(timer_t timerid, struct itimerspec *value); } + SYS_NTP_GETTIME = 448 // { int|sys|50|ntp_gettime(struct ntptimeval *ntvp); } + SYS_WAIT4 = 449 // { int|sys|50|wait4(pid_t pid, int *status, int options, struct rusage *rusage); } + SYS_MKNOD = 450 // { int|sys|50|mknod(const char *path, mode_t mode, dev_t dev); } + SYS_FHSTAT = 451 // { int|sys|50|fhstat(const void *fhp, size_t fh_size, struct stat *sb); } + SYS_PIPE2 = 453 // { int|sys||pipe2(int *fildes, int flags); } + SYS_DUP3 = 454 // { int|sys||dup3(int from, int to, int flags); } + SYS_KQUEUE1 = 455 // { int|sys||kqueue1(int flags); } + SYS_PACCEPT = 456 // { int|sys||paccept(int s, struct sockaddr *name, socklen_t *anamelen, const sigset_t *mask, int flags); } + SYS_LINKAT = 457 // { int|sys||linkat(int fd1, const char *name1, int fd2, const char *name2, int flags); } + SYS_RENAMEAT = 458 // { int|sys||renameat(int fromfd, const char *from, int tofd, const char *to); } + SYS_MKFIFOAT = 459 // { int|sys||mkfifoat(int fd, const char *path, mode_t mode); } + SYS_MKNODAT = 460 // { int|sys||mknodat(int fd, const char *path, mode_t mode, uint32_t dev); } + SYS_MKDIRAT = 461 // { int|sys||mkdirat(int fd, const char *path, mode_t mode); } + SYS_FACCESSAT = 462 // { int|sys||faccessat(int fd, const char *path, int amode, int flag); } + SYS_FCHMODAT = 463 // { int|sys||fchmodat(int fd, const char *path, mode_t mode, int flag); } + SYS_FCHOWNAT = 464 // { int|sys||fchownat(int fd, const char *path, uid_t owner, gid_t group, int flag); } + SYS_FEXECVE = 465 // { int|sys||fexecve(int fd, char * const *argp, char * const *envp); } + SYS_FSTATAT = 466 // { int|sys||fstatat(int fd, const char *path, struct stat *buf, int flag); } + SYS_UTIMENSAT = 467 // { int|sys||utimensat(int fd, const char *path, const struct timespec *tptr, int flag); } + SYS_OPENAT = 468 // { int|sys||openat(int fd, const char *path, int oflags, ... mode_t mode); } + SYS_READLINKAT = 469 // { int|sys||readlinkat(int fd, const char *path, char *buf, size_t bufsize); } + SYS_SYMLINKAT = 470 // { int|sys||symlinkat(const char *path1, int fd, const char *path2); } + SYS_UNLINKAT = 471 // { int|sys||unlinkat(int fd, const char *path, int flag); } + SYS_FUTIMENS = 472 // { int|sys||futimens(int fd, const struct timespec *tptr); } + SYS___QUOTACTL = 473 // { int|sys||__quotactl(const char *path, struct quotactl_args *args); } + SYS_POSIX_SPAWN = 474 // { int|sys||posix_spawn(pid_t *pid, const char *path, const struct posix_spawn_file_actions *file_actions, const struct posix_spawnattr *attrp, char *const *argv, char *const *envp); } + SYS_RECVMMSG = 475 // { int|sys||recvmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags, struct timespec *timeout); } + SYS_SENDMMSG = 476 // { int|sys||sendmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags); } +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go new file mode 100644 index 0000000..aea8dbe --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go @@ -0,0 +1,274 @@ +// mksysnum_netbsd.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build amd64,netbsd + +package unix + +const ( + SYS_EXIT = 1 // { void|sys||exit(int rval); } + SYS_FORK = 2 // { int|sys||fork(void); } + SYS_READ = 3 // { ssize_t|sys||read(int fd, void *buf, size_t nbyte); } + SYS_WRITE = 4 // { ssize_t|sys||write(int fd, const void *buf, size_t nbyte); } + SYS_OPEN = 5 // { int|sys||open(const char *path, int flags, ... mode_t mode); } + SYS_CLOSE = 6 // { int|sys||close(int fd); } + SYS_LINK = 9 // { int|sys||link(const char *path, const char *link); } + SYS_UNLINK = 10 // { int|sys||unlink(const char *path); } + SYS_CHDIR = 12 // { int|sys||chdir(const char *path); } + SYS_FCHDIR = 13 // { int|sys||fchdir(int fd); } + SYS_CHMOD = 15 // { int|sys||chmod(const char *path, mode_t mode); } + SYS_CHOWN = 16 // { int|sys||chown(const char *path, uid_t uid, gid_t gid); } + SYS_BREAK = 17 // { int|sys||obreak(char *nsize); } + SYS_GETPID = 20 // { pid_t|sys||getpid_with_ppid(void); } + SYS_UNMOUNT = 22 // { int|sys||unmount(const char *path, int flags); } + SYS_SETUID = 23 // { int|sys||setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t|sys||getuid_with_euid(void); } + SYS_GETEUID = 25 // { uid_t|sys||geteuid(void); } + SYS_PTRACE = 26 // { int|sys||ptrace(int req, pid_t pid, void *addr, int data); } + SYS_RECVMSG = 27 // { ssize_t|sys||recvmsg(int s, struct msghdr *msg, int flags); } + SYS_SENDMSG = 28 // { ssize_t|sys||sendmsg(int s, const struct msghdr *msg, int flags); } + SYS_RECVFROM = 29 // { ssize_t|sys||recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlenaddr); } + SYS_ACCEPT = 30 // { int|sys||accept(int s, struct sockaddr *name, socklen_t *anamelen); } + SYS_GETPEERNAME = 31 // { int|sys||getpeername(int fdes, struct sockaddr *asa, socklen_t *alen); } + SYS_GETSOCKNAME = 32 // { int|sys||getsockname(int fdes, struct sockaddr *asa, socklen_t *alen); } + SYS_ACCESS = 33 // { int|sys||access(const char *path, int flags); } + SYS_CHFLAGS = 34 // { int|sys||chflags(const char *path, u_long flags); } + SYS_FCHFLAGS = 35 // { int|sys||fchflags(int fd, u_long flags); } + SYS_SYNC = 36 // { void|sys||sync(void); } + SYS_KILL = 37 // { int|sys||kill(pid_t pid, int signum); } + SYS_GETPPID = 39 // { pid_t|sys||getppid(void); } + SYS_DUP = 41 // { int|sys||dup(int fd); } + SYS_PIPE = 42 // { int|sys||pipe(void); } + SYS_GETEGID = 43 // { gid_t|sys||getegid(void); } + SYS_PROFIL = 44 // { int|sys||profil(char *samples, size_t size, u_long offset, u_int scale); } + SYS_KTRACE = 45 // { int|sys||ktrace(const char *fname, int ops, int facs, pid_t pid); } + SYS_GETGID = 47 // { gid_t|sys||getgid_with_egid(void); } + SYS___GETLOGIN = 49 // { int|sys||__getlogin(char *namebuf, size_t namelen); } + SYS___SETLOGIN = 50 // { int|sys||__setlogin(const char *namebuf); } + SYS_ACCT = 51 // { int|sys||acct(const char *path); } + SYS_IOCTL = 54 // { int|sys||ioctl(int fd, u_long com, ... void *data); } + SYS_REVOKE = 56 // { int|sys||revoke(const char *path); } + SYS_SYMLINK = 57 // { int|sys||symlink(const char *path, const char *link); } + SYS_READLINK = 58 // { ssize_t|sys||readlink(const char *path, char *buf, size_t count); } + SYS_EXECVE = 59 // { int|sys||execve(const char *path, char * const *argp, char * const *envp); } + SYS_UMASK = 60 // { mode_t|sys||umask(mode_t newmask); } + SYS_CHROOT = 61 // { int|sys||chroot(const char *path); } + SYS_VFORK = 66 // { int|sys||vfork(void); } + SYS_SBRK = 69 // { int|sys||sbrk(intptr_t incr); } + SYS_SSTK = 70 // { int|sys||sstk(int incr); } + SYS_VADVISE = 72 // { int|sys||ovadvise(int anom); } + SYS_MUNMAP = 73 // { int|sys||munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int|sys||mprotect(void *addr, size_t len, int prot); } + SYS_MADVISE = 75 // { int|sys||madvise(void *addr, size_t len, int behav); } + SYS_MINCORE = 78 // { int|sys||mincore(void *addr, size_t len, char *vec); } + SYS_GETGROUPS = 79 // { int|sys||getgroups(int gidsetsize, gid_t *gidset); } + SYS_SETGROUPS = 80 // { int|sys||setgroups(int gidsetsize, const gid_t *gidset); } + SYS_GETPGRP = 81 // { int|sys||getpgrp(void); } + SYS_SETPGID = 82 // { int|sys||setpgid(pid_t pid, pid_t pgid); } + SYS_DUP2 = 90 // { int|sys||dup2(int from, int to); } + SYS_FCNTL = 92 // { int|sys||fcntl(int fd, int cmd, ... void *arg); } + SYS_FSYNC = 95 // { int|sys||fsync(int fd); } + SYS_SETPRIORITY = 96 // { int|sys||setpriority(int which, id_t who, int prio); } + SYS_CONNECT = 98 // { int|sys||connect(int s, const struct sockaddr *name, socklen_t namelen); } + SYS_GETPRIORITY = 100 // { int|sys||getpriority(int which, id_t who); } + SYS_BIND = 104 // { int|sys||bind(int s, const struct sockaddr *name, socklen_t namelen); } + SYS_SETSOCKOPT = 105 // { int|sys||setsockopt(int s, int level, int name, const void *val, socklen_t valsize); } + SYS_LISTEN = 106 // { int|sys||listen(int s, int backlog); } + SYS_GETSOCKOPT = 118 // { int|sys||getsockopt(int s, int level, int name, void *val, socklen_t *avalsize); } + SYS_READV = 120 // { ssize_t|sys||readv(int fd, const struct iovec *iovp, int iovcnt); } + SYS_WRITEV = 121 // { ssize_t|sys||writev(int fd, const struct iovec *iovp, int iovcnt); } + SYS_FCHOWN = 123 // { int|sys||fchown(int fd, uid_t uid, gid_t gid); } + SYS_FCHMOD = 124 // { int|sys||fchmod(int fd, mode_t mode); } + SYS_SETREUID = 126 // { int|sys||setreuid(uid_t ruid, uid_t euid); } + SYS_SETREGID = 127 // { int|sys||setregid(gid_t rgid, gid_t egid); } + SYS_RENAME = 128 // { int|sys||rename(const char *from, const char *to); } + SYS_FLOCK = 131 // { int|sys||flock(int fd, int how); } + SYS_MKFIFO = 132 // { int|sys||mkfifo(const char *path, mode_t mode); } + SYS_SENDTO = 133 // { ssize_t|sys||sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen); } + SYS_SHUTDOWN = 134 // { int|sys||shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int|sys||socketpair(int domain, int type, int protocol, int *rsv); } + SYS_MKDIR = 136 // { int|sys||mkdir(const char *path, mode_t mode); } + SYS_RMDIR = 137 // { int|sys||rmdir(const char *path); } + SYS_SETSID = 147 // { int|sys||setsid(void); } + SYS_SYSARCH = 165 // { int|sys||sysarch(int op, void *parms); } + SYS_PREAD = 173 // { ssize_t|sys||pread(int fd, void *buf, size_t nbyte, int PAD, off_t offset); } + SYS_PWRITE = 174 // { ssize_t|sys||pwrite(int fd, const void *buf, size_t nbyte, int PAD, off_t offset); } + SYS_NTP_ADJTIME = 176 // { int|sys||ntp_adjtime(struct timex *tp); } + SYS_SETGID = 181 // { int|sys||setgid(gid_t gid); } + SYS_SETEGID = 182 // { int|sys||setegid(gid_t egid); } + SYS_SETEUID = 183 // { int|sys||seteuid(uid_t euid); } + SYS_PATHCONF = 191 // { long|sys||pathconf(const char *path, int name); } + SYS_FPATHCONF = 192 // { long|sys||fpathconf(int fd, int name); } + SYS_GETRLIMIT = 194 // { int|sys||getrlimit(int which, struct rlimit *rlp); } + SYS_SETRLIMIT = 195 // { int|sys||setrlimit(int which, const struct rlimit *rlp); } + SYS_MMAP = 197 // { void *|sys||mmap(void *addr, size_t len, int prot, int flags, int fd, long PAD, off_t pos); } + SYS_LSEEK = 199 // { off_t|sys||lseek(int fd, int PAD, off_t offset, int whence); } + SYS_TRUNCATE = 200 // { int|sys||truncate(const char *path, int PAD, off_t length); } + SYS_FTRUNCATE = 201 // { int|sys||ftruncate(int fd, int PAD, off_t length); } + SYS___SYSCTL = 202 // { int|sys||__sysctl(const int *name, u_int namelen, void *old, size_t *oldlenp, const void *new, size_t newlen); } + SYS_MLOCK = 203 // { int|sys||mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int|sys||munlock(const void *addr, size_t len); } + SYS_UNDELETE = 205 // { int|sys||undelete(const char *path); } + SYS_GETPGID = 207 // { pid_t|sys||getpgid(pid_t pid); } + SYS_REBOOT = 208 // { int|sys||reboot(int opt, char *bootstr); } + SYS_POLL = 209 // { int|sys||poll(struct pollfd *fds, u_int nfds, int timeout); } + SYS_SEMGET = 221 // { int|sys||semget(key_t key, int nsems, int semflg); } + SYS_SEMOP = 222 // { int|sys||semop(int semid, struct sembuf *sops, size_t nsops); } + SYS_SEMCONFIG = 223 // { int|sys||semconfig(int flag); } + SYS_MSGGET = 225 // { int|sys||msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int|sys||msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); } + SYS_MSGRCV = 227 // { ssize_t|sys||msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } + SYS_SHMAT = 228 // { void *|sys||shmat(int shmid, const void *shmaddr, int shmflg); } + SYS_SHMDT = 230 // { int|sys||shmdt(const void *shmaddr); } + SYS_SHMGET = 231 // { int|sys||shmget(key_t key, size_t size, int shmflg); } + SYS_TIMER_CREATE = 235 // { int|sys||timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid); } + SYS_TIMER_DELETE = 236 // { int|sys||timer_delete(timer_t timerid); } + SYS_TIMER_GETOVERRUN = 239 // { int|sys||timer_getoverrun(timer_t timerid); } + SYS_FDATASYNC = 241 // { int|sys||fdatasync(int fd); } + SYS_MLOCKALL = 242 // { int|sys||mlockall(int flags); } + SYS_MUNLOCKALL = 243 // { int|sys||munlockall(void); } + SYS_SIGQUEUEINFO = 245 // { int|sys||sigqueueinfo(pid_t pid, const siginfo_t *info); } + SYS_MODCTL = 246 // { int|sys||modctl(int cmd, void *arg); } + SYS___POSIX_RENAME = 270 // { int|sys||__posix_rename(const char *from, const char *to); } + SYS_SWAPCTL = 271 // { int|sys||swapctl(int cmd, void *arg, int misc); } + SYS_MINHERIT = 273 // { int|sys||minherit(void *addr, size_t len, int inherit); } + SYS_LCHMOD = 274 // { int|sys||lchmod(const char *path, mode_t mode); } + SYS_LCHOWN = 275 // { int|sys||lchown(const char *path, uid_t uid, gid_t gid); } + SYS_MSYNC = 277 // { int|sys|13|msync(void *addr, size_t len, int flags); } + SYS___POSIX_CHOWN = 283 // { int|sys||__posix_chown(const char *path, uid_t uid, gid_t gid); } + SYS___POSIX_FCHOWN = 284 // { int|sys||__posix_fchown(int fd, uid_t uid, gid_t gid); } + SYS___POSIX_LCHOWN = 285 // { int|sys||__posix_lchown(const char *path, uid_t uid, gid_t gid); } + SYS_GETSID = 286 // { pid_t|sys||getsid(pid_t pid); } + SYS___CLONE = 287 // { pid_t|sys||__clone(int flags, void *stack); } + SYS_FKTRACE = 288 // { int|sys||fktrace(int fd, int ops, int facs, pid_t pid); } + SYS_PREADV = 289 // { ssize_t|sys||preadv(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } + SYS_PWRITEV = 290 // { ssize_t|sys||pwritev(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } + SYS___GETCWD = 296 // { int|sys||__getcwd(char *bufp, size_t length); } + SYS_FCHROOT = 297 // { int|sys||fchroot(int fd); } + SYS_LCHFLAGS = 304 // { int|sys||lchflags(const char *path, u_long flags); } + SYS_ISSETUGID = 305 // { int|sys||issetugid(void); } + SYS_UTRACE = 306 // { int|sys||utrace(const char *label, void *addr, size_t len); } + SYS_GETCONTEXT = 307 // { int|sys||getcontext(struct __ucontext *ucp); } + SYS_SETCONTEXT = 308 // { int|sys||setcontext(const struct __ucontext *ucp); } + SYS__LWP_CREATE = 309 // { int|sys||_lwp_create(const struct __ucontext *ucp, u_long flags, lwpid_t *new_lwp); } + SYS__LWP_EXIT = 310 // { int|sys||_lwp_exit(void); } + SYS__LWP_SELF = 311 // { lwpid_t|sys||_lwp_self(void); } + SYS__LWP_WAIT = 312 // { int|sys||_lwp_wait(lwpid_t wait_for, lwpid_t *departed); } + SYS__LWP_SUSPEND = 313 // { int|sys||_lwp_suspend(lwpid_t target); } + SYS__LWP_CONTINUE = 314 // { int|sys||_lwp_continue(lwpid_t target); } + SYS__LWP_WAKEUP = 315 // { int|sys||_lwp_wakeup(lwpid_t target); } + SYS__LWP_GETPRIVATE = 316 // { void *|sys||_lwp_getprivate(void); } + SYS__LWP_SETPRIVATE = 317 // { void|sys||_lwp_setprivate(void *ptr); } + SYS__LWP_KILL = 318 // { int|sys||_lwp_kill(lwpid_t target, int signo); } + SYS__LWP_DETACH = 319 // { int|sys||_lwp_detach(lwpid_t target); } + SYS__LWP_UNPARK = 321 // { int|sys||_lwp_unpark(lwpid_t target, const void *hint); } + SYS__LWP_UNPARK_ALL = 322 // { ssize_t|sys||_lwp_unpark_all(const lwpid_t *targets, size_t ntargets, const void *hint); } + SYS__LWP_SETNAME = 323 // { int|sys||_lwp_setname(lwpid_t target, const char *name); } + SYS__LWP_GETNAME = 324 // { int|sys||_lwp_getname(lwpid_t target, char *name, size_t len); } + SYS__LWP_CTL = 325 // { int|sys||_lwp_ctl(int features, struct lwpctl **address); } + SYS___SIGACTION_SIGTRAMP = 340 // { int|sys||__sigaction_sigtramp(int signum, const struct sigaction *nsa, struct sigaction *osa, const void *tramp, int vers); } + SYS_PMC_GET_INFO = 341 // { int|sys||pmc_get_info(int ctr, int op, void *args); } + SYS_PMC_CONTROL = 342 // { int|sys||pmc_control(int ctr, int op, void *args); } + SYS_RASCTL = 343 // { int|sys||rasctl(void *addr, size_t len, int op); } + SYS_KQUEUE = 344 // { int|sys||kqueue(void); } + SYS__SCHED_SETPARAM = 346 // { int|sys||_sched_setparam(pid_t pid, lwpid_t lid, int policy, const struct sched_param *params); } + SYS__SCHED_GETPARAM = 347 // { int|sys||_sched_getparam(pid_t pid, lwpid_t lid, int *policy, struct sched_param *params); } + SYS__SCHED_SETAFFINITY = 348 // { int|sys||_sched_setaffinity(pid_t pid, lwpid_t lid, size_t size, const cpuset_t *cpuset); } + SYS__SCHED_GETAFFINITY = 349 // { int|sys||_sched_getaffinity(pid_t pid, lwpid_t lid, size_t size, cpuset_t *cpuset); } + SYS_SCHED_YIELD = 350 // { int|sys||sched_yield(void); } + SYS_FSYNC_RANGE = 354 // { int|sys||fsync_range(int fd, int flags, off_t start, off_t length); } + SYS_UUIDGEN = 355 // { int|sys||uuidgen(struct uuid *store, int count); } + SYS_GETVFSSTAT = 356 // { int|sys||getvfsstat(struct statvfs *buf, size_t bufsize, int flags); } + SYS_STATVFS1 = 357 // { int|sys||statvfs1(const char *path, struct statvfs *buf, int flags); } + SYS_FSTATVFS1 = 358 // { int|sys||fstatvfs1(int fd, struct statvfs *buf, int flags); } + SYS_EXTATTRCTL = 360 // { int|sys||extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_FILE = 361 // { int|sys||extattr_set_file(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_FILE = 362 // { ssize_t|sys||extattr_get_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FILE = 363 // { int|sys||extattr_delete_file(const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_FD = 364 // { int|sys||extattr_set_fd(int fd, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_FD = 365 // { ssize_t|sys||extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FD = 366 // { int|sys||extattr_delete_fd(int fd, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_LINK = 367 // { int|sys||extattr_set_link(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_LINK = 368 // { ssize_t|sys||extattr_get_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_LINK = 369 // { int|sys||extattr_delete_link(const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_LIST_FD = 370 // { ssize_t|sys||extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_FILE = 371 // { ssize_t|sys||extattr_list_file(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_LINK = 372 // { ssize_t|sys||extattr_list_link(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_SETXATTR = 375 // { int|sys||setxattr(const char *path, const char *name, const void *value, size_t size, int flags); } + SYS_LSETXATTR = 376 // { int|sys||lsetxattr(const char *path, const char *name, const void *value, size_t size, int flags); } + SYS_FSETXATTR = 377 // { int|sys||fsetxattr(int fd, const char *name, const void *value, size_t size, int flags); } + SYS_GETXATTR = 378 // { int|sys||getxattr(const char *path, const char *name, void *value, size_t size); } + SYS_LGETXATTR = 379 // { int|sys||lgetxattr(const char *path, const char *name, void *value, size_t size); } + SYS_FGETXATTR = 380 // { int|sys||fgetxattr(int fd, const char *name, void *value, size_t size); } + SYS_LISTXATTR = 381 // { int|sys||listxattr(const char *path, char *list, size_t size); } + SYS_LLISTXATTR = 382 // { int|sys||llistxattr(const char *path, char *list, size_t size); } + SYS_FLISTXATTR = 383 // { int|sys||flistxattr(int fd, char *list, size_t size); } + SYS_REMOVEXATTR = 384 // { int|sys||removexattr(const char *path, const char *name); } + SYS_LREMOVEXATTR = 385 // { int|sys||lremovexattr(const char *path, const char *name); } + SYS_FREMOVEXATTR = 386 // { int|sys||fremovexattr(int fd, const char *name); } + SYS_GETDENTS = 390 // { int|sys|30|getdents(int fd, char *buf, size_t count); } + SYS_SOCKET = 394 // { int|sys|30|socket(int domain, int type, int protocol); } + SYS_GETFH = 395 // { int|sys|30|getfh(const char *fname, void *fhp, size_t *fh_size); } + SYS_MOUNT = 410 // { int|sys|50|mount(const char *type, const char *path, int flags, void *data, size_t data_len); } + SYS_MREMAP = 411 // { void *|sys||mremap(void *old_address, size_t old_size, void *new_address, size_t new_size, int flags); } + SYS_PSET_CREATE = 412 // { int|sys||pset_create(psetid_t *psid); } + SYS_PSET_DESTROY = 413 // { int|sys||pset_destroy(psetid_t psid); } + SYS_PSET_ASSIGN = 414 // { int|sys||pset_assign(psetid_t psid, cpuid_t cpuid, psetid_t *opsid); } + SYS__PSET_BIND = 415 // { int|sys||_pset_bind(idtype_t idtype, id_t first_id, id_t second_id, psetid_t psid, psetid_t *opsid); } + SYS_POSIX_FADVISE = 416 // { int|sys|50|posix_fadvise(int fd, int PAD, off_t offset, off_t len, int advice); } + SYS_SELECT = 417 // { int|sys|50|select(int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval *tv); } + SYS_GETTIMEOFDAY = 418 // { int|sys|50|gettimeofday(struct timeval *tp, void *tzp); } + SYS_SETTIMEOFDAY = 419 // { int|sys|50|settimeofday(const struct timeval *tv, const void *tzp); } + SYS_UTIMES = 420 // { int|sys|50|utimes(const char *path, const struct timeval *tptr); } + SYS_ADJTIME = 421 // { int|sys|50|adjtime(const struct timeval *delta, struct timeval *olddelta); } + SYS_FUTIMES = 423 // { int|sys|50|futimes(int fd, const struct timeval *tptr); } + SYS_LUTIMES = 424 // { int|sys|50|lutimes(const char *path, const struct timeval *tptr); } + SYS_SETITIMER = 425 // { int|sys|50|setitimer(int which, const struct itimerval *itv, struct itimerval *oitv); } + SYS_GETITIMER = 426 // { int|sys|50|getitimer(int which, struct itimerval *itv); } + SYS_CLOCK_GETTIME = 427 // { int|sys|50|clock_gettime(clockid_t clock_id, struct timespec *tp); } + SYS_CLOCK_SETTIME = 428 // { int|sys|50|clock_settime(clockid_t clock_id, const struct timespec *tp); } + SYS_CLOCK_GETRES = 429 // { int|sys|50|clock_getres(clockid_t clock_id, struct timespec *tp); } + SYS_NANOSLEEP = 430 // { int|sys|50|nanosleep(const struct timespec *rqtp, struct timespec *rmtp); } + SYS___SIGTIMEDWAIT = 431 // { int|sys|50|__sigtimedwait(const sigset_t *set, siginfo_t *info, struct timespec *timeout); } + SYS__LWP_PARK = 434 // { int|sys|50|_lwp_park(const struct timespec *ts, lwpid_t unpark, const void *hint, const void *unparkhint); } + SYS_KEVENT = 435 // { int|sys|50|kevent(int fd, const struct kevent *changelist, size_t nchanges, struct kevent *eventlist, size_t nevents, const struct timespec *timeout); } + SYS_PSELECT = 436 // { int|sys|50|pselect(int nd, fd_set *in, fd_set *ou, fd_set *ex, const struct timespec *ts, const sigset_t *mask); } + SYS_POLLTS = 437 // { int|sys|50|pollts(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *mask); } + SYS_STAT = 439 // { int|sys|50|stat(const char *path, struct stat *ub); } + SYS_FSTAT = 440 // { int|sys|50|fstat(int fd, struct stat *sb); } + SYS_LSTAT = 441 // { int|sys|50|lstat(const char *path, struct stat *ub); } + SYS___SEMCTL = 442 // { int|sys|50|__semctl(int semid, int semnum, int cmd, ... union __semun *arg); } + SYS_SHMCTL = 443 // { int|sys|50|shmctl(int shmid, int cmd, struct shmid_ds *buf); } + SYS_MSGCTL = 444 // { int|sys|50|msgctl(int msqid, int cmd, struct msqid_ds *buf); } + SYS_GETRUSAGE = 445 // { int|sys|50|getrusage(int who, struct rusage *rusage); } + SYS_TIMER_SETTIME = 446 // { int|sys|50|timer_settime(timer_t timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue); } + SYS_TIMER_GETTIME = 447 // { int|sys|50|timer_gettime(timer_t timerid, struct itimerspec *value); } + SYS_NTP_GETTIME = 448 // { int|sys|50|ntp_gettime(struct ntptimeval *ntvp); } + SYS_WAIT4 = 449 // { int|sys|50|wait4(pid_t pid, int *status, int options, struct rusage *rusage); } + SYS_MKNOD = 450 // { int|sys|50|mknod(const char *path, mode_t mode, dev_t dev); } + SYS_FHSTAT = 451 // { int|sys|50|fhstat(const void *fhp, size_t fh_size, struct stat *sb); } + SYS_PIPE2 = 453 // { int|sys||pipe2(int *fildes, int flags); } + SYS_DUP3 = 454 // { int|sys||dup3(int from, int to, int flags); } + SYS_KQUEUE1 = 455 // { int|sys||kqueue1(int flags); } + SYS_PACCEPT = 456 // { int|sys||paccept(int s, struct sockaddr *name, socklen_t *anamelen, const sigset_t *mask, int flags); } + SYS_LINKAT = 457 // { int|sys||linkat(int fd1, const char *name1, int fd2, const char *name2, int flags); } + SYS_RENAMEAT = 458 // { int|sys||renameat(int fromfd, const char *from, int tofd, const char *to); } + SYS_MKFIFOAT = 459 // { int|sys||mkfifoat(int fd, const char *path, mode_t mode); } + SYS_MKNODAT = 460 // { int|sys||mknodat(int fd, const char *path, mode_t mode, uint32_t dev); } + SYS_MKDIRAT = 461 // { int|sys||mkdirat(int fd, const char *path, mode_t mode); } + SYS_FACCESSAT = 462 // { int|sys||faccessat(int fd, const char *path, int amode, int flag); } + SYS_FCHMODAT = 463 // { int|sys||fchmodat(int fd, const char *path, mode_t mode, int flag); } + SYS_FCHOWNAT = 464 // { int|sys||fchownat(int fd, const char *path, uid_t owner, gid_t group, int flag); } + SYS_FEXECVE = 465 // { int|sys||fexecve(int fd, char * const *argp, char * const *envp); } + SYS_FSTATAT = 466 // { int|sys||fstatat(int fd, const char *path, struct stat *buf, int flag); } + SYS_UTIMENSAT = 467 // { int|sys||utimensat(int fd, const char *path, const struct timespec *tptr, int flag); } + SYS_OPENAT = 468 // { int|sys||openat(int fd, const char *path, int oflags, ... mode_t mode); } + SYS_READLINKAT = 469 // { int|sys||readlinkat(int fd, const char *path, char *buf, size_t bufsize); } + SYS_SYMLINKAT = 470 // { int|sys||symlinkat(const char *path1, int fd, const char *path2); } + SYS_UNLINKAT = 471 // { int|sys||unlinkat(int fd, const char *path, int flag); } + SYS_FUTIMENS = 472 // { int|sys||futimens(int fd, const struct timespec *tptr); } + SYS___QUOTACTL = 473 // { int|sys||__quotactl(const char *path, struct quotactl_args *args); } + SYS_POSIX_SPAWN = 474 // { int|sys||posix_spawn(pid_t *pid, const char *path, const struct posix_spawn_file_actions *file_actions, const struct posix_spawnattr *attrp, char *const *argv, char *const *envp); } + SYS_RECVMMSG = 475 // { int|sys||recvmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags, struct timespec *timeout); } + SYS_SENDMMSG = 476 // { int|sys||sendmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags); } +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go new file mode 100644 index 0000000..c6158a7 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go @@ -0,0 +1,274 @@ +// mksysnum_netbsd.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build arm,netbsd + +package unix + +const ( + SYS_EXIT = 1 // { void|sys||exit(int rval); } + SYS_FORK = 2 // { int|sys||fork(void); } + SYS_READ = 3 // { ssize_t|sys||read(int fd, void *buf, size_t nbyte); } + SYS_WRITE = 4 // { ssize_t|sys||write(int fd, const void *buf, size_t nbyte); } + SYS_OPEN = 5 // { int|sys||open(const char *path, int flags, ... mode_t mode); } + SYS_CLOSE = 6 // { int|sys||close(int fd); } + SYS_LINK = 9 // { int|sys||link(const char *path, const char *link); } + SYS_UNLINK = 10 // { int|sys||unlink(const char *path); } + SYS_CHDIR = 12 // { int|sys||chdir(const char *path); } + SYS_FCHDIR = 13 // { int|sys||fchdir(int fd); } + SYS_CHMOD = 15 // { int|sys||chmod(const char *path, mode_t mode); } + SYS_CHOWN = 16 // { int|sys||chown(const char *path, uid_t uid, gid_t gid); } + SYS_BREAK = 17 // { int|sys||obreak(char *nsize); } + SYS_GETPID = 20 // { pid_t|sys||getpid_with_ppid(void); } + SYS_UNMOUNT = 22 // { int|sys||unmount(const char *path, int flags); } + SYS_SETUID = 23 // { int|sys||setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t|sys||getuid_with_euid(void); } + SYS_GETEUID = 25 // { uid_t|sys||geteuid(void); } + SYS_PTRACE = 26 // { int|sys||ptrace(int req, pid_t pid, void *addr, int data); } + SYS_RECVMSG = 27 // { ssize_t|sys||recvmsg(int s, struct msghdr *msg, int flags); } + SYS_SENDMSG = 28 // { ssize_t|sys||sendmsg(int s, const struct msghdr *msg, int flags); } + SYS_RECVFROM = 29 // { ssize_t|sys||recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlenaddr); } + SYS_ACCEPT = 30 // { int|sys||accept(int s, struct sockaddr *name, socklen_t *anamelen); } + SYS_GETPEERNAME = 31 // { int|sys||getpeername(int fdes, struct sockaddr *asa, socklen_t *alen); } + SYS_GETSOCKNAME = 32 // { int|sys||getsockname(int fdes, struct sockaddr *asa, socklen_t *alen); } + SYS_ACCESS = 33 // { int|sys||access(const char *path, int flags); } + SYS_CHFLAGS = 34 // { int|sys||chflags(const char *path, u_long flags); } + SYS_FCHFLAGS = 35 // { int|sys||fchflags(int fd, u_long flags); } + SYS_SYNC = 36 // { void|sys||sync(void); } + SYS_KILL = 37 // { int|sys||kill(pid_t pid, int signum); } + SYS_GETPPID = 39 // { pid_t|sys||getppid(void); } + SYS_DUP = 41 // { int|sys||dup(int fd); } + SYS_PIPE = 42 // { int|sys||pipe(void); } + SYS_GETEGID = 43 // { gid_t|sys||getegid(void); } + SYS_PROFIL = 44 // { int|sys||profil(char *samples, size_t size, u_long offset, u_int scale); } + SYS_KTRACE = 45 // { int|sys||ktrace(const char *fname, int ops, int facs, pid_t pid); } + SYS_GETGID = 47 // { gid_t|sys||getgid_with_egid(void); } + SYS___GETLOGIN = 49 // { int|sys||__getlogin(char *namebuf, size_t namelen); } + SYS___SETLOGIN = 50 // { int|sys||__setlogin(const char *namebuf); } + SYS_ACCT = 51 // { int|sys||acct(const char *path); } + SYS_IOCTL = 54 // { int|sys||ioctl(int fd, u_long com, ... void *data); } + SYS_REVOKE = 56 // { int|sys||revoke(const char *path); } + SYS_SYMLINK = 57 // { int|sys||symlink(const char *path, const char *link); } + SYS_READLINK = 58 // { ssize_t|sys||readlink(const char *path, char *buf, size_t count); } + SYS_EXECVE = 59 // { int|sys||execve(const char *path, char * const *argp, char * const *envp); } + SYS_UMASK = 60 // { mode_t|sys||umask(mode_t newmask); } + SYS_CHROOT = 61 // { int|sys||chroot(const char *path); } + SYS_VFORK = 66 // { int|sys||vfork(void); } + SYS_SBRK = 69 // { int|sys||sbrk(intptr_t incr); } + SYS_SSTK = 70 // { int|sys||sstk(int incr); } + SYS_VADVISE = 72 // { int|sys||ovadvise(int anom); } + SYS_MUNMAP = 73 // { int|sys||munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int|sys||mprotect(void *addr, size_t len, int prot); } + SYS_MADVISE = 75 // { int|sys||madvise(void *addr, size_t len, int behav); } + SYS_MINCORE = 78 // { int|sys||mincore(void *addr, size_t len, char *vec); } + SYS_GETGROUPS = 79 // { int|sys||getgroups(int gidsetsize, gid_t *gidset); } + SYS_SETGROUPS = 80 // { int|sys||setgroups(int gidsetsize, const gid_t *gidset); } + SYS_GETPGRP = 81 // { int|sys||getpgrp(void); } + SYS_SETPGID = 82 // { int|sys||setpgid(pid_t pid, pid_t pgid); } + SYS_DUP2 = 90 // { int|sys||dup2(int from, int to); } + SYS_FCNTL = 92 // { int|sys||fcntl(int fd, int cmd, ... void *arg); } + SYS_FSYNC = 95 // { int|sys||fsync(int fd); } + SYS_SETPRIORITY = 96 // { int|sys||setpriority(int which, id_t who, int prio); } + SYS_CONNECT = 98 // { int|sys||connect(int s, const struct sockaddr *name, socklen_t namelen); } + SYS_GETPRIORITY = 100 // { int|sys||getpriority(int which, id_t who); } + SYS_BIND = 104 // { int|sys||bind(int s, const struct sockaddr *name, socklen_t namelen); } + SYS_SETSOCKOPT = 105 // { int|sys||setsockopt(int s, int level, int name, const void *val, socklen_t valsize); } + SYS_LISTEN = 106 // { int|sys||listen(int s, int backlog); } + SYS_GETSOCKOPT = 118 // { int|sys||getsockopt(int s, int level, int name, void *val, socklen_t *avalsize); } + SYS_READV = 120 // { ssize_t|sys||readv(int fd, const struct iovec *iovp, int iovcnt); } + SYS_WRITEV = 121 // { ssize_t|sys||writev(int fd, const struct iovec *iovp, int iovcnt); } + SYS_FCHOWN = 123 // { int|sys||fchown(int fd, uid_t uid, gid_t gid); } + SYS_FCHMOD = 124 // { int|sys||fchmod(int fd, mode_t mode); } + SYS_SETREUID = 126 // { int|sys||setreuid(uid_t ruid, uid_t euid); } + SYS_SETREGID = 127 // { int|sys||setregid(gid_t rgid, gid_t egid); } + SYS_RENAME = 128 // { int|sys||rename(const char *from, const char *to); } + SYS_FLOCK = 131 // { int|sys||flock(int fd, int how); } + SYS_MKFIFO = 132 // { int|sys||mkfifo(const char *path, mode_t mode); } + SYS_SENDTO = 133 // { ssize_t|sys||sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen); } + SYS_SHUTDOWN = 134 // { int|sys||shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int|sys||socketpair(int domain, int type, int protocol, int *rsv); } + SYS_MKDIR = 136 // { int|sys||mkdir(const char *path, mode_t mode); } + SYS_RMDIR = 137 // { int|sys||rmdir(const char *path); } + SYS_SETSID = 147 // { int|sys||setsid(void); } + SYS_SYSARCH = 165 // { int|sys||sysarch(int op, void *parms); } + SYS_PREAD = 173 // { ssize_t|sys||pread(int fd, void *buf, size_t nbyte, int PAD, off_t offset); } + SYS_PWRITE = 174 // { ssize_t|sys||pwrite(int fd, const void *buf, size_t nbyte, int PAD, off_t offset); } + SYS_NTP_ADJTIME = 176 // { int|sys||ntp_adjtime(struct timex *tp); } + SYS_SETGID = 181 // { int|sys||setgid(gid_t gid); } + SYS_SETEGID = 182 // { int|sys||setegid(gid_t egid); } + SYS_SETEUID = 183 // { int|sys||seteuid(uid_t euid); } + SYS_PATHCONF = 191 // { long|sys||pathconf(const char *path, int name); } + SYS_FPATHCONF = 192 // { long|sys||fpathconf(int fd, int name); } + SYS_GETRLIMIT = 194 // { int|sys||getrlimit(int which, struct rlimit *rlp); } + SYS_SETRLIMIT = 195 // { int|sys||setrlimit(int which, const struct rlimit *rlp); } + SYS_MMAP = 197 // { void *|sys||mmap(void *addr, size_t len, int prot, int flags, int fd, long PAD, off_t pos); } + SYS_LSEEK = 199 // { off_t|sys||lseek(int fd, int PAD, off_t offset, int whence); } + SYS_TRUNCATE = 200 // { int|sys||truncate(const char *path, int PAD, off_t length); } + SYS_FTRUNCATE = 201 // { int|sys||ftruncate(int fd, int PAD, off_t length); } + SYS___SYSCTL = 202 // { int|sys||__sysctl(const int *name, u_int namelen, void *old, size_t *oldlenp, const void *new, size_t newlen); } + SYS_MLOCK = 203 // { int|sys||mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int|sys||munlock(const void *addr, size_t len); } + SYS_UNDELETE = 205 // { int|sys||undelete(const char *path); } + SYS_GETPGID = 207 // { pid_t|sys||getpgid(pid_t pid); } + SYS_REBOOT = 208 // { int|sys||reboot(int opt, char *bootstr); } + SYS_POLL = 209 // { int|sys||poll(struct pollfd *fds, u_int nfds, int timeout); } + SYS_SEMGET = 221 // { int|sys||semget(key_t key, int nsems, int semflg); } + SYS_SEMOP = 222 // { int|sys||semop(int semid, struct sembuf *sops, size_t nsops); } + SYS_SEMCONFIG = 223 // { int|sys||semconfig(int flag); } + SYS_MSGGET = 225 // { int|sys||msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int|sys||msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); } + SYS_MSGRCV = 227 // { ssize_t|sys||msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } + SYS_SHMAT = 228 // { void *|sys||shmat(int shmid, const void *shmaddr, int shmflg); } + SYS_SHMDT = 230 // { int|sys||shmdt(const void *shmaddr); } + SYS_SHMGET = 231 // { int|sys||shmget(key_t key, size_t size, int shmflg); } + SYS_TIMER_CREATE = 235 // { int|sys||timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid); } + SYS_TIMER_DELETE = 236 // { int|sys||timer_delete(timer_t timerid); } + SYS_TIMER_GETOVERRUN = 239 // { int|sys||timer_getoverrun(timer_t timerid); } + SYS_FDATASYNC = 241 // { int|sys||fdatasync(int fd); } + SYS_MLOCKALL = 242 // { int|sys||mlockall(int flags); } + SYS_MUNLOCKALL = 243 // { int|sys||munlockall(void); } + SYS_SIGQUEUEINFO = 245 // { int|sys||sigqueueinfo(pid_t pid, const siginfo_t *info); } + SYS_MODCTL = 246 // { int|sys||modctl(int cmd, void *arg); } + SYS___POSIX_RENAME = 270 // { int|sys||__posix_rename(const char *from, const char *to); } + SYS_SWAPCTL = 271 // { int|sys||swapctl(int cmd, void *arg, int misc); } + SYS_MINHERIT = 273 // { int|sys||minherit(void *addr, size_t len, int inherit); } + SYS_LCHMOD = 274 // { int|sys||lchmod(const char *path, mode_t mode); } + SYS_LCHOWN = 275 // { int|sys||lchown(const char *path, uid_t uid, gid_t gid); } + SYS_MSYNC = 277 // { int|sys|13|msync(void *addr, size_t len, int flags); } + SYS___POSIX_CHOWN = 283 // { int|sys||__posix_chown(const char *path, uid_t uid, gid_t gid); } + SYS___POSIX_FCHOWN = 284 // { int|sys||__posix_fchown(int fd, uid_t uid, gid_t gid); } + SYS___POSIX_LCHOWN = 285 // { int|sys||__posix_lchown(const char *path, uid_t uid, gid_t gid); } + SYS_GETSID = 286 // { pid_t|sys||getsid(pid_t pid); } + SYS___CLONE = 287 // { pid_t|sys||__clone(int flags, void *stack); } + SYS_FKTRACE = 288 // { int|sys||fktrace(int fd, int ops, int facs, pid_t pid); } + SYS_PREADV = 289 // { ssize_t|sys||preadv(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } + SYS_PWRITEV = 290 // { ssize_t|sys||pwritev(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } + SYS___GETCWD = 296 // { int|sys||__getcwd(char *bufp, size_t length); } + SYS_FCHROOT = 297 // { int|sys||fchroot(int fd); } + SYS_LCHFLAGS = 304 // { int|sys||lchflags(const char *path, u_long flags); } + SYS_ISSETUGID = 305 // { int|sys||issetugid(void); } + SYS_UTRACE = 306 // { int|sys||utrace(const char *label, void *addr, size_t len); } + SYS_GETCONTEXT = 307 // { int|sys||getcontext(struct __ucontext *ucp); } + SYS_SETCONTEXT = 308 // { int|sys||setcontext(const struct __ucontext *ucp); } + SYS__LWP_CREATE = 309 // { int|sys||_lwp_create(const struct __ucontext *ucp, u_long flags, lwpid_t *new_lwp); } + SYS__LWP_EXIT = 310 // { int|sys||_lwp_exit(void); } + SYS__LWP_SELF = 311 // { lwpid_t|sys||_lwp_self(void); } + SYS__LWP_WAIT = 312 // { int|sys||_lwp_wait(lwpid_t wait_for, lwpid_t *departed); } + SYS__LWP_SUSPEND = 313 // { int|sys||_lwp_suspend(lwpid_t target); } + SYS__LWP_CONTINUE = 314 // { int|sys||_lwp_continue(lwpid_t target); } + SYS__LWP_WAKEUP = 315 // { int|sys||_lwp_wakeup(lwpid_t target); } + SYS__LWP_GETPRIVATE = 316 // { void *|sys||_lwp_getprivate(void); } + SYS__LWP_SETPRIVATE = 317 // { void|sys||_lwp_setprivate(void *ptr); } + SYS__LWP_KILL = 318 // { int|sys||_lwp_kill(lwpid_t target, int signo); } + SYS__LWP_DETACH = 319 // { int|sys||_lwp_detach(lwpid_t target); } + SYS__LWP_UNPARK = 321 // { int|sys||_lwp_unpark(lwpid_t target, const void *hint); } + SYS__LWP_UNPARK_ALL = 322 // { ssize_t|sys||_lwp_unpark_all(const lwpid_t *targets, size_t ntargets, const void *hint); } + SYS__LWP_SETNAME = 323 // { int|sys||_lwp_setname(lwpid_t target, const char *name); } + SYS__LWP_GETNAME = 324 // { int|sys||_lwp_getname(lwpid_t target, char *name, size_t len); } + SYS__LWP_CTL = 325 // { int|sys||_lwp_ctl(int features, struct lwpctl **address); } + SYS___SIGACTION_SIGTRAMP = 340 // { int|sys||__sigaction_sigtramp(int signum, const struct sigaction *nsa, struct sigaction *osa, const void *tramp, int vers); } + SYS_PMC_GET_INFO = 341 // { int|sys||pmc_get_info(int ctr, int op, void *args); } + SYS_PMC_CONTROL = 342 // { int|sys||pmc_control(int ctr, int op, void *args); } + SYS_RASCTL = 343 // { int|sys||rasctl(void *addr, size_t len, int op); } + SYS_KQUEUE = 344 // { int|sys||kqueue(void); } + SYS__SCHED_SETPARAM = 346 // { int|sys||_sched_setparam(pid_t pid, lwpid_t lid, int policy, const struct sched_param *params); } + SYS__SCHED_GETPARAM = 347 // { int|sys||_sched_getparam(pid_t pid, lwpid_t lid, int *policy, struct sched_param *params); } + SYS__SCHED_SETAFFINITY = 348 // { int|sys||_sched_setaffinity(pid_t pid, lwpid_t lid, size_t size, const cpuset_t *cpuset); } + SYS__SCHED_GETAFFINITY = 349 // { int|sys||_sched_getaffinity(pid_t pid, lwpid_t lid, size_t size, cpuset_t *cpuset); } + SYS_SCHED_YIELD = 350 // { int|sys||sched_yield(void); } + SYS_FSYNC_RANGE = 354 // { int|sys||fsync_range(int fd, int flags, off_t start, off_t length); } + SYS_UUIDGEN = 355 // { int|sys||uuidgen(struct uuid *store, int count); } + SYS_GETVFSSTAT = 356 // { int|sys||getvfsstat(struct statvfs *buf, size_t bufsize, int flags); } + SYS_STATVFS1 = 357 // { int|sys||statvfs1(const char *path, struct statvfs *buf, int flags); } + SYS_FSTATVFS1 = 358 // { int|sys||fstatvfs1(int fd, struct statvfs *buf, int flags); } + SYS_EXTATTRCTL = 360 // { int|sys||extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_FILE = 361 // { int|sys||extattr_set_file(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_FILE = 362 // { ssize_t|sys||extattr_get_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FILE = 363 // { int|sys||extattr_delete_file(const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_FD = 364 // { int|sys||extattr_set_fd(int fd, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_FD = 365 // { ssize_t|sys||extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FD = 366 // { int|sys||extattr_delete_fd(int fd, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_LINK = 367 // { int|sys||extattr_set_link(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_LINK = 368 // { ssize_t|sys||extattr_get_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_LINK = 369 // { int|sys||extattr_delete_link(const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_LIST_FD = 370 // { ssize_t|sys||extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_FILE = 371 // { ssize_t|sys||extattr_list_file(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_LINK = 372 // { ssize_t|sys||extattr_list_link(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_SETXATTR = 375 // { int|sys||setxattr(const char *path, const char *name, const void *value, size_t size, int flags); } + SYS_LSETXATTR = 376 // { int|sys||lsetxattr(const char *path, const char *name, const void *value, size_t size, int flags); } + SYS_FSETXATTR = 377 // { int|sys||fsetxattr(int fd, const char *name, const void *value, size_t size, int flags); } + SYS_GETXATTR = 378 // { int|sys||getxattr(const char *path, const char *name, void *value, size_t size); } + SYS_LGETXATTR = 379 // { int|sys||lgetxattr(const char *path, const char *name, void *value, size_t size); } + SYS_FGETXATTR = 380 // { int|sys||fgetxattr(int fd, const char *name, void *value, size_t size); } + SYS_LISTXATTR = 381 // { int|sys||listxattr(const char *path, char *list, size_t size); } + SYS_LLISTXATTR = 382 // { int|sys||llistxattr(const char *path, char *list, size_t size); } + SYS_FLISTXATTR = 383 // { int|sys||flistxattr(int fd, char *list, size_t size); } + SYS_REMOVEXATTR = 384 // { int|sys||removexattr(const char *path, const char *name); } + SYS_LREMOVEXATTR = 385 // { int|sys||lremovexattr(const char *path, const char *name); } + SYS_FREMOVEXATTR = 386 // { int|sys||fremovexattr(int fd, const char *name); } + SYS_GETDENTS = 390 // { int|sys|30|getdents(int fd, char *buf, size_t count); } + SYS_SOCKET = 394 // { int|sys|30|socket(int domain, int type, int protocol); } + SYS_GETFH = 395 // { int|sys|30|getfh(const char *fname, void *fhp, size_t *fh_size); } + SYS_MOUNT = 410 // { int|sys|50|mount(const char *type, const char *path, int flags, void *data, size_t data_len); } + SYS_MREMAP = 411 // { void *|sys||mremap(void *old_address, size_t old_size, void *new_address, size_t new_size, int flags); } + SYS_PSET_CREATE = 412 // { int|sys||pset_create(psetid_t *psid); } + SYS_PSET_DESTROY = 413 // { int|sys||pset_destroy(psetid_t psid); } + SYS_PSET_ASSIGN = 414 // { int|sys||pset_assign(psetid_t psid, cpuid_t cpuid, psetid_t *opsid); } + SYS__PSET_BIND = 415 // { int|sys||_pset_bind(idtype_t idtype, id_t first_id, id_t second_id, psetid_t psid, psetid_t *opsid); } + SYS_POSIX_FADVISE = 416 // { int|sys|50|posix_fadvise(int fd, int PAD, off_t offset, off_t len, int advice); } + SYS_SELECT = 417 // { int|sys|50|select(int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval *tv); } + SYS_GETTIMEOFDAY = 418 // { int|sys|50|gettimeofday(struct timeval *tp, void *tzp); } + SYS_SETTIMEOFDAY = 419 // { int|sys|50|settimeofday(const struct timeval *tv, const void *tzp); } + SYS_UTIMES = 420 // { int|sys|50|utimes(const char *path, const struct timeval *tptr); } + SYS_ADJTIME = 421 // { int|sys|50|adjtime(const struct timeval *delta, struct timeval *olddelta); } + SYS_FUTIMES = 423 // { int|sys|50|futimes(int fd, const struct timeval *tptr); } + SYS_LUTIMES = 424 // { int|sys|50|lutimes(const char *path, const struct timeval *tptr); } + SYS_SETITIMER = 425 // { int|sys|50|setitimer(int which, const struct itimerval *itv, struct itimerval *oitv); } + SYS_GETITIMER = 426 // { int|sys|50|getitimer(int which, struct itimerval *itv); } + SYS_CLOCK_GETTIME = 427 // { int|sys|50|clock_gettime(clockid_t clock_id, struct timespec *tp); } + SYS_CLOCK_SETTIME = 428 // { int|sys|50|clock_settime(clockid_t clock_id, const struct timespec *tp); } + SYS_CLOCK_GETRES = 429 // { int|sys|50|clock_getres(clockid_t clock_id, struct timespec *tp); } + SYS_NANOSLEEP = 430 // { int|sys|50|nanosleep(const struct timespec *rqtp, struct timespec *rmtp); } + SYS___SIGTIMEDWAIT = 431 // { int|sys|50|__sigtimedwait(const sigset_t *set, siginfo_t *info, struct timespec *timeout); } + SYS__LWP_PARK = 434 // { int|sys|50|_lwp_park(const struct timespec *ts, lwpid_t unpark, const void *hint, const void *unparkhint); } + SYS_KEVENT = 435 // { int|sys|50|kevent(int fd, const struct kevent *changelist, size_t nchanges, struct kevent *eventlist, size_t nevents, const struct timespec *timeout); } + SYS_PSELECT = 436 // { int|sys|50|pselect(int nd, fd_set *in, fd_set *ou, fd_set *ex, const struct timespec *ts, const sigset_t *mask); } + SYS_POLLTS = 437 // { int|sys|50|pollts(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *mask); } + SYS_STAT = 439 // { int|sys|50|stat(const char *path, struct stat *ub); } + SYS_FSTAT = 440 // { int|sys|50|fstat(int fd, struct stat *sb); } + SYS_LSTAT = 441 // { int|sys|50|lstat(const char *path, struct stat *ub); } + SYS___SEMCTL = 442 // { int|sys|50|__semctl(int semid, int semnum, int cmd, ... union __semun *arg); } + SYS_SHMCTL = 443 // { int|sys|50|shmctl(int shmid, int cmd, struct shmid_ds *buf); } + SYS_MSGCTL = 444 // { int|sys|50|msgctl(int msqid, int cmd, struct msqid_ds *buf); } + SYS_GETRUSAGE = 445 // { int|sys|50|getrusage(int who, struct rusage *rusage); } + SYS_TIMER_SETTIME = 446 // { int|sys|50|timer_settime(timer_t timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue); } + SYS_TIMER_GETTIME = 447 // { int|sys|50|timer_gettime(timer_t timerid, struct itimerspec *value); } + SYS_NTP_GETTIME = 448 // { int|sys|50|ntp_gettime(struct ntptimeval *ntvp); } + SYS_WAIT4 = 449 // { int|sys|50|wait4(pid_t pid, int *status, int options, struct rusage *rusage); } + SYS_MKNOD = 450 // { int|sys|50|mknod(const char *path, mode_t mode, dev_t dev); } + SYS_FHSTAT = 451 // { int|sys|50|fhstat(const void *fhp, size_t fh_size, struct stat *sb); } + SYS_PIPE2 = 453 // { int|sys||pipe2(int *fildes, int flags); } + SYS_DUP3 = 454 // { int|sys||dup3(int from, int to, int flags); } + SYS_KQUEUE1 = 455 // { int|sys||kqueue1(int flags); } + SYS_PACCEPT = 456 // { int|sys||paccept(int s, struct sockaddr *name, socklen_t *anamelen, const sigset_t *mask, int flags); } + SYS_LINKAT = 457 // { int|sys||linkat(int fd1, const char *name1, int fd2, const char *name2, int flags); } + SYS_RENAMEAT = 458 // { int|sys||renameat(int fromfd, const char *from, int tofd, const char *to); } + SYS_MKFIFOAT = 459 // { int|sys||mkfifoat(int fd, const char *path, mode_t mode); } + SYS_MKNODAT = 460 // { int|sys||mknodat(int fd, const char *path, mode_t mode, uint32_t dev); } + SYS_MKDIRAT = 461 // { int|sys||mkdirat(int fd, const char *path, mode_t mode); } + SYS_FACCESSAT = 462 // { int|sys||faccessat(int fd, const char *path, int amode, int flag); } + SYS_FCHMODAT = 463 // { int|sys||fchmodat(int fd, const char *path, mode_t mode, int flag); } + SYS_FCHOWNAT = 464 // { int|sys||fchownat(int fd, const char *path, uid_t owner, gid_t group, int flag); } + SYS_FEXECVE = 465 // { int|sys||fexecve(int fd, char * const *argp, char * const *envp); } + SYS_FSTATAT = 466 // { int|sys||fstatat(int fd, const char *path, struct stat *buf, int flag); } + SYS_UTIMENSAT = 467 // { int|sys||utimensat(int fd, const char *path, const struct timespec *tptr, int flag); } + SYS_OPENAT = 468 // { int|sys||openat(int fd, const char *path, int oflags, ... mode_t mode); } + SYS_READLINKAT = 469 // { int|sys||readlinkat(int fd, const char *path, char *buf, size_t bufsize); } + SYS_SYMLINKAT = 470 // { int|sys||symlinkat(const char *path1, int fd, const char *path2); } + SYS_UNLINKAT = 471 // { int|sys||unlinkat(int fd, const char *path, int flag); } + SYS_FUTIMENS = 472 // { int|sys||futimens(int fd, const struct timespec *tptr); } + SYS___QUOTACTL = 473 // { int|sys||__quotactl(const char *path, struct quotactl_args *args); } + SYS_POSIX_SPAWN = 474 // { int|sys||posix_spawn(pid_t *pid, const char *path, const struct posix_spawn_file_actions *file_actions, const struct posix_spawnattr *attrp, char *const *argv, char *const *envp); } + SYS_RECVMMSG = 475 // { int|sys||recvmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags, struct timespec *timeout); } + SYS_SENDMMSG = 476 // { int|sys||sendmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags); } +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go new file mode 100644 index 0000000..3e8ce2a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go @@ -0,0 +1,207 @@ +// mksysnum_openbsd.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build 386,openbsd + +package unix + +const ( + SYS_EXIT = 1 // { void sys_exit(int rval); } + SYS_FORK = 2 // { int sys_fork(void); } + SYS_READ = 3 // { ssize_t sys_read(int fd, void *buf, size_t nbyte); } + SYS_WRITE = 4 // { ssize_t sys_write(int fd, const void *buf, \ + SYS_OPEN = 5 // { int sys_open(const char *path, \ + SYS_CLOSE = 6 // { int sys_close(int fd); } + SYS___TFORK = 8 // { int sys___tfork(const struct __tfork *param, \ + SYS_LINK = 9 // { int sys_link(const char *path, const char *link); } + SYS_UNLINK = 10 // { int sys_unlink(const char *path); } + SYS_WAIT4 = 11 // { pid_t sys_wait4(pid_t pid, int *status, \ + SYS_CHDIR = 12 // { int sys_chdir(const char *path); } + SYS_FCHDIR = 13 // { int sys_fchdir(int fd); } + SYS_MKNOD = 14 // { int sys_mknod(const char *path, mode_t mode, \ + SYS_CHMOD = 15 // { int sys_chmod(const char *path, mode_t mode); } + SYS_CHOWN = 16 // { int sys_chown(const char *path, uid_t uid, \ + SYS_OBREAK = 17 // { int sys_obreak(char *nsize); } break + SYS_GETDTABLECOUNT = 18 // { int sys_getdtablecount(void); } + SYS_GETRUSAGE = 19 // { int sys_getrusage(int who, \ + SYS_GETPID = 20 // { pid_t sys_getpid(void); } + SYS_MOUNT = 21 // { int sys_mount(const char *type, const char *path, \ + SYS_UNMOUNT = 22 // { int sys_unmount(const char *path, int flags); } + SYS_SETUID = 23 // { int sys_setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t sys_getuid(void); } + SYS_GETEUID = 25 // { uid_t sys_geteuid(void); } + SYS_PTRACE = 26 // { int sys_ptrace(int req, pid_t pid, caddr_t addr, \ + SYS_RECVMSG = 27 // { ssize_t sys_recvmsg(int s, struct msghdr *msg, \ + SYS_SENDMSG = 28 // { ssize_t sys_sendmsg(int s, \ + SYS_RECVFROM = 29 // { ssize_t sys_recvfrom(int s, void *buf, size_t len, \ + SYS_ACCEPT = 30 // { int sys_accept(int s, struct sockaddr *name, \ + SYS_GETPEERNAME = 31 // { int sys_getpeername(int fdes, struct sockaddr *asa, \ + SYS_GETSOCKNAME = 32 // { int sys_getsockname(int fdes, struct sockaddr *asa, \ + SYS_ACCESS = 33 // { int sys_access(const char *path, int flags); } + SYS_CHFLAGS = 34 // { int sys_chflags(const char *path, u_int flags); } + SYS_FCHFLAGS = 35 // { int sys_fchflags(int fd, u_int flags); } + SYS_SYNC = 36 // { void sys_sync(void); } + SYS_KILL = 37 // { int sys_kill(int pid, int signum); } + SYS_STAT = 38 // { int sys_stat(const char *path, struct stat *ub); } + SYS_GETPPID = 39 // { pid_t sys_getppid(void); } + SYS_LSTAT = 40 // { int sys_lstat(const char *path, struct stat *ub); } + SYS_DUP = 41 // { int sys_dup(int fd); } + SYS_FSTATAT = 42 // { int sys_fstatat(int fd, const char *path, \ + SYS_GETEGID = 43 // { gid_t sys_getegid(void); } + SYS_PROFIL = 44 // { int sys_profil(caddr_t samples, size_t size, \ + SYS_KTRACE = 45 // { int sys_ktrace(const char *fname, int ops, \ + SYS_SIGACTION = 46 // { int sys_sigaction(int signum, \ + SYS_GETGID = 47 // { gid_t sys_getgid(void); } + SYS_SIGPROCMASK = 48 // { int sys_sigprocmask(int how, sigset_t mask); } + SYS_GETLOGIN = 49 // { int sys_getlogin(char *namebuf, u_int namelen); } + SYS_SETLOGIN = 50 // { int sys_setlogin(const char *namebuf); } + SYS_ACCT = 51 // { int sys_acct(const char *path); } + SYS_SIGPENDING = 52 // { int sys_sigpending(void); } + SYS_FSTAT = 53 // { int sys_fstat(int fd, struct stat *sb); } + SYS_IOCTL = 54 // { int sys_ioctl(int fd, \ + SYS_REBOOT = 55 // { int sys_reboot(int opt); } + SYS_REVOKE = 56 // { int sys_revoke(const char *path); } + SYS_SYMLINK = 57 // { int sys_symlink(const char *path, \ + SYS_READLINK = 58 // { int sys_readlink(const char *path, char *buf, \ + SYS_EXECVE = 59 // { int sys_execve(const char *path, \ + SYS_UMASK = 60 // { mode_t sys_umask(mode_t newmask); } + SYS_CHROOT = 61 // { int sys_chroot(const char *path); } + SYS_GETFSSTAT = 62 // { int sys_getfsstat(struct statfs *buf, size_t bufsize, \ + SYS_STATFS = 63 // { int sys_statfs(const char *path, \ + SYS_FSTATFS = 64 // { int sys_fstatfs(int fd, struct statfs *buf); } + SYS_FHSTATFS = 65 // { int sys_fhstatfs(const fhandle_t *fhp, \ + SYS_VFORK = 66 // { int sys_vfork(void); } + SYS_GETTIMEOFDAY = 67 // { int sys_gettimeofday(struct timeval *tp, \ + SYS_SETTIMEOFDAY = 68 // { int sys_settimeofday(const struct timeval *tv, \ + SYS_SETITIMER = 69 // { int sys_setitimer(int which, \ + SYS_GETITIMER = 70 // { int sys_getitimer(int which, \ + SYS_SELECT = 71 // { int sys_select(int nd, fd_set *in, fd_set *ou, \ + SYS_KEVENT = 72 // { int sys_kevent(int fd, \ + SYS_MUNMAP = 73 // { int sys_munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int sys_mprotect(void *addr, size_t len, \ + SYS_MADVISE = 75 // { int sys_madvise(void *addr, size_t len, \ + SYS_UTIMES = 76 // { int sys_utimes(const char *path, \ + SYS_FUTIMES = 77 // { int sys_futimes(int fd, \ + SYS_MINCORE = 78 // { int sys_mincore(void *addr, size_t len, \ + SYS_GETGROUPS = 79 // { int sys_getgroups(int gidsetsize, \ + SYS_SETGROUPS = 80 // { int sys_setgroups(int gidsetsize, \ + SYS_GETPGRP = 81 // { int sys_getpgrp(void); } + SYS_SETPGID = 82 // { int sys_setpgid(pid_t pid, int pgid); } + SYS_UTIMENSAT = 84 // { int sys_utimensat(int fd, const char *path, \ + SYS_FUTIMENS = 85 // { int sys_futimens(int fd, \ + SYS_CLOCK_GETTIME = 87 // { int sys_clock_gettime(clockid_t clock_id, \ + SYS_CLOCK_SETTIME = 88 // { int sys_clock_settime(clockid_t clock_id, \ + SYS_CLOCK_GETRES = 89 // { int sys_clock_getres(clockid_t clock_id, \ + SYS_DUP2 = 90 // { int sys_dup2(int from, int to); } + SYS_NANOSLEEP = 91 // { int sys_nanosleep(const struct timespec *rqtp, \ + SYS_FCNTL = 92 // { int sys_fcntl(int fd, int cmd, ... void *arg); } + SYS___THRSLEEP = 94 // { int sys___thrsleep(const volatile void *ident, \ + SYS_FSYNC = 95 // { int sys_fsync(int fd); } + SYS_SETPRIORITY = 96 // { int sys_setpriority(int which, id_t who, int prio); } + SYS_SOCKET = 97 // { int sys_socket(int domain, int type, int protocol); } + SYS_CONNECT = 98 // { int sys_connect(int s, const struct sockaddr *name, \ + SYS_GETDENTS = 99 // { int sys_getdents(int fd, void *buf, size_t buflen); } + SYS_GETPRIORITY = 100 // { int sys_getpriority(int which, id_t who); } + SYS_SIGRETURN = 103 // { int sys_sigreturn(struct sigcontext *sigcntxp); } + SYS_BIND = 104 // { int sys_bind(int s, const struct sockaddr *name, \ + SYS_SETSOCKOPT = 105 // { int sys_setsockopt(int s, int level, int name, \ + SYS_LISTEN = 106 // { int sys_listen(int s, int backlog); } + SYS_PPOLL = 109 // { int sys_ppoll(struct pollfd *fds, \ + SYS_PSELECT = 110 // { int sys_pselect(int nd, fd_set *in, fd_set *ou, \ + SYS_SIGSUSPEND = 111 // { int sys_sigsuspend(int mask); } + SYS_GETSOCKOPT = 118 // { int sys_getsockopt(int s, int level, int name, \ + SYS_READV = 120 // { ssize_t sys_readv(int fd, \ + SYS_WRITEV = 121 // { ssize_t sys_writev(int fd, \ + SYS_FCHOWN = 123 // { int sys_fchown(int fd, uid_t uid, gid_t gid); } + SYS_FCHMOD = 124 // { int sys_fchmod(int fd, mode_t mode); } + SYS_SETREUID = 126 // { int sys_setreuid(uid_t ruid, uid_t euid); } + SYS_SETREGID = 127 // { int sys_setregid(gid_t rgid, gid_t egid); } + SYS_RENAME = 128 // { int sys_rename(const char *from, const char *to); } + SYS_FLOCK = 131 // { int sys_flock(int fd, int how); } + SYS_MKFIFO = 132 // { int sys_mkfifo(const char *path, mode_t mode); } + SYS_SENDTO = 133 // { ssize_t sys_sendto(int s, const void *buf, \ + SYS_SHUTDOWN = 134 // { int sys_shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int sys_socketpair(int domain, int type, \ + SYS_MKDIR = 136 // { int sys_mkdir(const char *path, mode_t mode); } + SYS_RMDIR = 137 // { int sys_rmdir(const char *path); } + SYS_ADJTIME = 140 // { int sys_adjtime(const struct timeval *delta, \ + SYS_SETSID = 147 // { int sys_setsid(void); } + SYS_QUOTACTL = 148 // { int sys_quotactl(const char *path, int cmd, \ + SYS_NFSSVC = 155 // { int sys_nfssvc(int flag, void *argp); } + SYS_GETFH = 161 // { int sys_getfh(const char *fname, fhandle_t *fhp); } + SYS_SYSARCH = 165 // { int sys_sysarch(int op, void *parms); } + SYS_PREAD = 173 // { ssize_t sys_pread(int fd, void *buf, \ + SYS_PWRITE = 174 // { ssize_t sys_pwrite(int fd, const void *buf, \ + SYS_SETGID = 181 // { int sys_setgid(gid_t gid); } + SYS_SETEGID = 182 // { int sys_setegid(gid_t egid); } + SYS_SETEUID = 183 // { int sys_seteuid(uid_t euid); } + SYS_PATHCONF = 191 // { long sys_pathconf(const char *path, int name); } + SYS_FPATHCONF = 192 // { long sys_fpathconf(int fd, int name); } + SYS_SWAPCTL = 193 // { int sys_swapctl(int cmd, const void *arg, int misc); } + SYS_GETRLIMIT = 194 // { int sys_getrlimit(int which, \ + SYS_SETRLIMIT = 195 // { int sys_setrlimit(int which, \ + SYS_MMAP = 197 // { void *sys_mmap(void *addr, size_t len, int prot, \ + SYS_LSEEK = 199 // { off_t sys_lseek(int fd, int pad, off_t offset, \ + SYS_TRUNCATE = 200 // { int sys_truncate(const char *path, int pad, \ + SYS_FTRUNCATE = 201 // { int sys_ftruncate(int fd, int pad, off_t length); } + SYS___SYSCTL = 202 // { int sys___sysctl(const int *name, u_int namelen, \ + SYS_MLOCK = 203 // { int sys_mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int sys_munlock(const void *addr, size_t len); } + SYS_GETPGID = 207 // { pid_t sys_getpgid(pid_t pid); } + SYS_UTRACE = 209 // { int sys_utrace(const char *label, const void *addr, \ + SYS_SEMGET = 221 // { int sys_semget(key_t key, int nsems, int semflg); } + SYS_MSGGET = 225 // { int sys_msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int sys_msgsnd(int msqid, const void *msgp, size_t msgsz, \ + SYS_MSGRCV = 227 // { int sys_msgrcv(int msqid, void *msgp, size_t msgsz, \ + SYS_SHMAT = 228 // { void *sys_shmat(int shmid, const void *shmaddr, \ + SYS_SHMDT = 230 // { int sys_shmdt(const void *shmaddr); } + SYS_MINHERIT = 250 // { int sys_minherit(void *addr, size_t len, \ + SYS_POLL = 252 // { int sys_poll(struct pollfd *fds, \ + SYS_ISSETUGID = 253 // { int sys_issetugid(void); } + SYS_LCHOWN = 254 // { int sys_lchown(const char *path, uid_t uid, gid_t gid); } + SYS_GETSID = 255 // { pid_t sys_getsid(pid_t pid); } + SYS_MSYNC = 256 // { int sys_msync(void *addr, size_t len, int flags); } + SYS_PIPE = 263 // { int sys_pipe(int *fdp); } + SYS_FHOPEN = 264 // { int sys_fhopen(const fhandle_t *fhp, int flags); } + SYS_PREADV = 267 // { ssize_t sys_preadv(int fd, \ + SYS_PWRITEV = 268 // { ssize_t sys_pwritev(int fd, \ + SYS_KQUEUE = 269 // { int sys_kqueue(void); } + SYS_MLOCKALL = 271 // { int sys_mlockall(int flags); } + SYS_MUNLOCKALL = 272 // { int sys_munlockall(void); } + SYS_GETRESUID = 281 // { int sys_getresuid(uid_t *ruid, uid_t *euid, \ + SYS_SETRESUID = 282 // { int sys_setresuid(uid_t ruid, uid_t euid, \ + SYS_GETRESGID = 283 // { int sys_getresgid(gid_t *rgid, gid_t *egid, \ + SYS_SETRESGID = 284 // { int sys_setresgid(gid_t rgid, gid_t egid, \ + SYS_MQUERY = 286 // { void *sys_mquery(void *addr, size_t len, int prot, \ + SYS_CLOSEFROM = 287 // { int sys_closefrom(int fd); } + SYS_SIGALTSTACK = 288 // { int sys_sigaltstack(const struct sigaltstack *nss, \ + SYS_SHMGET = 289 // { int sys_shmget(key_t key, size_t size, int shmflg); } + SYS_SEMOP = 290 // { int sys_semop(int semid, struct sembuf *sops, \ + SYS_FHSTAT = 294 // { int sys_fhstat(const fhandle_t *fhp, \ + SYS___SEMCTL = 295 // { int sys___semctl(int semid, int semnum, int cmd, \ + SYS_SHMCTL = 296 // { int sys_shmctl(int shmid, int cmd, \ + SYS_MSGCTL = 297 // { int sys_msgctl(int msqid, int cmd, \ + SYS_SCHED_YIELD = 298 // { int sys_sched_yield(void); } + SYS_GETTHRID = 299 // { pid_t sys_getthrid(void); } + SYS___THRWAKEUP = 301 // { int sys___thrwakeup(const volatile void *ident, \ + SYS___THREXIT = 302 // { void sys___threxit(pid_t *notdead); } + SYS___THRSIGDIVERT = 303 // { int sys___thrsigdivert(sigset_t sigmask, \ + SYS___GETCWD = 304 // { int sys___getcwd(char *buf, size_t len); } + SYS_ADJFREQ = 305 // { int sys_adjfreq(const int64_t *freq, \ + SYS_SETRTABLE = 310 // { int sys_setrtable(int rtableid); } + SYS_GETRTABLE = 311 // { int sys_getrtable(void); } + SYS_FACCESSAT = 313 // { int sys_faccessat(int fd, const char *path, \ + SYS_FCHMODAT = 314 // { int sys_fchmodat(int fd, const char *path, \ + SYS_FCHOWNAT = 315 // { int sys_fchownat(int fd, const char *path, \ + SYS_LINKAT = 317 // { int sys_linkat(int fd1, const char *path1, int fd2, \ + SYS_MKDIRAT = 318 // { int sys_mkdirat(int fd, const char *path, \ + SYS_MKFIFOAT = 319 // { int sys_mkfifoat(int fd, const char *path, \ + SYS_MKNODAT = 320 // { int sys_mknodat(int fd, const char *path, \ + SYS_OPENAT = 321 // { int sys_openat(int fd, const char *path, int flags, \ + SYS_READLINKAT = 322 // { ssize_t sys_readlinkat(int fd, const char *path, \ + SYS_RENAMEAT = 323 // { int sys_renameat(int fromfd, const char *from, \ + SYS_SYMLINKAT = 324 // { int sys_symlinkat(const char *path, int fd, \ + SYS_UNLINKAT = 325 // { int sys_unlinkat(int fd, const char *path, \ + SYS___SET_TCB = 329 // { void sys___set_tcb(void *tcb); } + SYS___GET_TCB = 330 // { void *sys___get_tcb(void); } +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go new file mode 100644 index 0000000..bd28146 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go @@ -0,0 +1,207 @@ +// mksysnum_openbsd.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build amd64,openbsd + +package unix + +const ( + SYS_EXIT = 1 // { void sys_exit(int rval); } + SYS_FORK = 2 // { int sys_fork(void); } + SYS_READ = 3 // { ssize_t sys_read(int fd, void *buf, size_t nbyte); } + SYS_WRITE = 4 // { ssize_t sys_write(int fd, const void *buf, \ + SYS_OPEN = 5 // { int sys_open(const char *path, \ + SYS_CLOSE = 6 // { int sys_close(int fd); } + SYS___TFORK = 8 // { int sys___tfork(const struct __tfork *param, \ + SYS_LINK = 9 // { int sys_link(const char *path, const char *link); } + SYS_UNLINK = 10 // { int sys_unlink(const char *path); } + SYS_WAIT4 = 11 // { pid_t sys_wait4(pid_t pid, int *status, \ + SYS_CHDIR = 12 // { int sys_chdir(const char *path); } + SYS_FCHDIR = 13 // { int sys_fchdir(int fd); } + SYS_MKNOD = 14 // { int sys_mknod(const char *path, mode_t mode, \ + SYS_CHMOD = 15 // { int sys_chmod(const char *path, mode_t mode); } + SYS_CHOWN = 16 // { int sys_chown(const char *path, uid_t uid, \ + SYS_OBREAK = 17 // { int sys_obreak(char *nsize); } break + SYS_GETDTABLECOUNT = 18 // { int sys_getdtablecount(void); } + SYS_GETRUSAGE = 19 // { int sys_getrusage(int who, \ + SYS_GETPID = 20 // { pid_t sys_getpid(void); } + SYS_MOUNT = 21 // { int sys_mount(const char *type, const char *path, \ + SYS_UNMOUNT = 22 // { int sys_unmount(const char *path, int flags); } + SYS_SETUID = 23 // { int sys_setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t sys_getuid(void); } + SYS_GETEUID = 25 // { uid_t sys_geteuid(void); } + SYS_PTRACE = 26 // { int sys_ptrace(int req, pid_t pid, caddr_t addr, \ + SYS_RECVMSG = 27 // { ssize_t sys_recvmsg(int s, struct msghdr *msg, \ + SYS_SENDMSG = 28 // { ssize_t sys_sendmsg(int s, \ + SYS_RECVFROM = 29 // { ssize_t sys_recvfrom(int s, void *buf, size_t len, \ + SYS_ACCEPT = 30 // { int sys_accept(int s, struct sockaddr *name, \ + SYS_GETPEERNAME = 31 // { int sys_getpeername(int fdes, struct sockaddr *asa, \ + SYS_GETSOCKNAME = 32 // { int sys_getsockname(int fdes, struct sockaddr *asa, \ + SYS_ACCESS = 33 // { int sys_access(const char *path, int flags); } + SYS_CHFLAGS = 34 // { int sys_chflags(const char *path, u_int flags); } + SYS_FCHFLAGS = 35 // { int sys_fchflags(int fd, u_int flags); } + SYS_SYNC = 36 // { void sys_sync(void); } + SYS_KILL = 37 // { int sys_kill(int pid, int signum); } + SYS_STAT = 38 // { int sys_stat(const char *path, struct stat *ub); } + SYS_GETPPID = 39 // { pid_t sys_getppid(void); } + SYS_LSTAT = 40 // { int sys_lstat(const char *path, struct stat *ub); } + SYS_DUP = 41 // { int sys_dup(int fd); } + SYS_FSTATAT = 42 // { int sys_fstatat(int fd, const char *path, \ + SYS_GETEGID = 43 // { gid_t sys_getegid(void); } + SYS_PROFIL = 44 // { int sys_profil(caddr_t samples, size_t size, \ + SYS_KTRACE = 45 // { int sys_ktrace(const char *fname, int ops, \ + SYS_SIGACTION = 46 // { int sys_sigaction(int signum, \ + SYS_GETGID = 47 // { gid_t sys_getgid(void); } + SYS_SIGPROCMASK = 48 // { int sys_sigprocmask(int how, sigset_t mask); } + SYS_GETLOGIN = 49 // { int sys_getlogin(char *namebuf, u_int namelen); } + SYS_SETLOGIN = 50 // { int sys_setlogin(const char *namebuf); } + SYS_ACCT = 51 // { int sys_acct(const char *path); } + SYS_SIGPENDING = 52 // { int sys_sigpending(void); } + SYS_FSTAT = 53 // { int sys_fstat(int fd, struct stat *sb); } + SYS_IOCTL = 54 // { int sys_ioctl(int fd, \ + SYS_REBOOT = 55 // { int sys_reboot(int opt); } + SYS_REVOKE = 56 // { int sys_revoke(const char *path); } + SYS_SYMLINK = 57 // { int sys_symlink(const char *path, \ + SYS_READLINK = 58 // { int sys_readlink(const char *path, char *buf, \ + SYS_EXECVE = 59 // { int sys_execve(const char *path, \ + SYS_UMASK = 60 // { mode_t sys_umask(mode_t newmask); } + SYS_CHROOT = 61 // { int sys_chroot(const char *path); } + SYS_GETFSSTAT = 62 // { int sys_getfsstat(struct statfs *buf, size_t bufsize, \ + SYS_STATFS = 63 // { int sys_statfs(const char *path, \ + SYS_FSTATFS = 64 // { int sys_fstatfs(int fd, struct statfs *buf); } + SYS_FHSTATFS = 65 // { int sys_fhstatfs(const fhandle_t *fhp, \ + SYS_VFORK = 66 // { int sys_vfork(void); } + SYS_GETTIMEOFDAY = 67 // { int sys_gettimeofday(struct timeval *tp, \ + SYS_SETTIMEOFDAY = 68 // { int sys_settimeofday(const struct timeval *tv, \ + SYS_SETITIMER = 69 // { int sys_setitimer(int which, \ + SYS_GETITIMER = 70 // { int sys_getitimer(int which, \ + SYS_SELECT = 71 // { int sys_select(int nd, fd_set *in, fd_set *ou, \ + SYS_KEVENT = 72 // { int sys_kevent(int fd, \ + SYS_MUNMAP = 73 // { int sys_munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int sys_mprotect(void *addr, size_t len, \ + SYS_MADVISE = 75 // { int sys_madvise(void *addr, size_t len, \ + SYS_UTIMES = 76 // { int sys_utimes(const char *path, \ + SYS_FUTIMES = 77 // { int sys_futimes(int fd, \ + SYS_MINCORE = 78 // { int sys_mincore(void *addr, size_t len, \ + SYS_GETGROUPS = 79 // { int sys_getgroups(int gidsetsize, \ + SYS_SETGROUPS = 80 // { int sys_setgroups(int gidsetsize, \ + SYS_GETPGRP = 81 // { int sys_getpgrp(void); } + SYS_SETPGID = 82 // { int sys_setpgid(pid_t pid, int pgid); } + SYS_UTIMENSAT = 84 // { int sys_utimensat(int fd, const char *path, \ + SYS_FUTIMENS = 85 // { int sys_futimens(int fd, \ + SYS_CLOCK_GETTIME = 87 // { int sys_clock_gettime(clockid_t clock_id, \ + SYS_CLOCK_SETTIME = 88 // { int sys_clock_settime(clockid_t clock_id, \ + SYS_CLOCK_GETRES = 89 // { int sys_clock_getres(clockid_t clock_id, \ + SYS_DUP2 = 90 // { int sys_dup2(int from, int to); } + SYS_NANOSLEEP = 91 // { int sys_nanosleep(const struct timespec *rqtp, \ + SYS_FCNTL = 92 // { int sys_fcntl(int fd, int cmd, ... void *arg); } + SYS___THRSLEEP = 94 // { int sys___thrsleep(const volatile void *ident, \ + SYS_FSYNC = 95 // { int sys_fsync(int fd); } + SYS_SETPRIORITY = 96 // { int sys_setpriority(int which, id_t who, int prio); } + SYS_SOCKET = 97 // { int sys_socket(int domain, int type, int protocol); } + SYS_CONNECT = 98 // { int sys_connect(int s, const struct sockaddr *name, \ + SYS_GETDENTS = 99 // { int sys_getdents(int fd, void *buf, size_t buflen); } + SYS_GETPRIORITY = 100 // { int sys_getpriority(int which, id_t who); } + SYS_SIGRETURN = 103 // { int sys_sigreturn(struct sigcontext *sigcntxp); } + SYS_BIND = 104 // { int sys_bind(int s, const struct sockaddr *name, \ + SYS_SETSOCKOPT = 105 // { int sys_setsockopt(int s, int level, int name, \ + SYS_LISTEN = 106 // { int sys_listen(int s, int backlog); } + SYS_PPOLL = 109 // { int sys_ppoll(struct pollfd *fds, \ + SYS_PSELECT = 110 // { int sys_pselect(int nd, fd_set *in, fd_set *ou, \ + SYS_SIGSUSPEND = 111 // { int sys_sigsuspend(int mask); } + SYS_GETSOCKOPT = 118 // { int sys_getsockopt(int s, int level, int name, \ + SYS_READV = 120 // { ssize_t sys_readv(int fd, \ + SYS_WRITEV = 121 // { ssize_t sys_writev(int fd, \ + SYS_FCHOWN = 123 // { int sys_fchown(int fd, uid_t uid, gid_t gid); } + SYS_FCHMOD = 124 // { int sys_fchmod(int fd, mode_t mode); } + SYS_SETREUID = 126 // { int sys_setreuid(uid_t ruid, uid_t euid); } + SYS_SETREGID = 127 // { int sys_setregid(gid_t rgid, gid_t egid); } + SYS_RENAME = 128 // { int sys_rename(const char *from, const char *to); } + SYS_FLOCK = 131 // { int sys_flock(int fd, int how); } + SYS_MKFIFO = 132 // { int sys_mkfifo(const char *path, mode_t mode); } + SYS_SENDTO = 133 // { ssize_t sys_sendto(int s, const void *buf, \ + SYS_SHUTDOWN = 134 // { int sys_shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int sys_socketpair(int domain, int type, \ + SYS_MKDIR = 136 // { int sys_mkdir(const char *path, mode_t mode); } + SYS_RMDIR = 137 // { int sys_rmdir(const char *path); } + SYS_ADJTIME = 140 // { int sys_adjtime(const struct timeval *delta, \ + SYS_SETSID = 147 // { int sys_setsid(void); } + SYS_QUOTACTL = 148 // { int sys_quotactl(const char *path, int cmd, \ + SYS_NFSSVC = 155 // { int sys_nfssvc(int flag, void *argp); } + SYS_GETFH = 161 // { int sys_getfh(const char *fname, fhandle_t *fhp); } + SYS_SYSARCH = 165 // { int sys_sysarch(int op, void *parms); } + SYS_PREAD = 173 // { ssize_t sys_pread(int fd, void *buf, \ + SYS_PWRITE = 174 // { ssize_t sys_pwrite(int fd, const void *buf, \ + SYS_SETGID = 181 // { int sys_setgid(gid_t gid); } + SYS_SETEGID = 182 // { int sys_setegid(gid_t egid); } + SYS_SETEUID = 183 // { int sys_seteuid(uid_t euid); } + SYS_PATHCONF = 191 // { long sys_pathconf(const char *path, int name); } + SYS_FPATHCONF = 192 // { long sys_fpathconf(int fd, int name); } + SYS_SWAPCTL = 193 // { int sys_swapctl(int cmd, const void *arg, int misc); } + SYS_GETRLIMIT = 194 // { int sys_getrlimit(int which, \ + SYS_SETRLIMIT = 195 // { int sys_setrlimit(int which, \ + SYS_MMAP = 197 // { void *sys_mmap(void *addr, size_t len, int prot, \ + SYS_LSEEK = 199 // { off_t sys_lseek(int fd, int pad, off_t offset, \ + SYS_TRUNCATE = 200 // { int sys_truncate(const char *path, int pad, \ + SYS_FTRUNCATE = 201 // { int sys_ftruncate(int fd, int pad, off_t length); } + SYS___SYSCTL = 202 // { int sys___sysctl(const int *name, u_int namelen, \ + SYS_MLOCK = 203 // { int sys_mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int sys_munlock(const void *addr, size_t len); } + SYS_GETPGID = 207 // { pid_t sys_getpgid(pid_t pid); } + SYS_UTRACE = 209 // { int sys_utrace(const char *label, const void *addr, \ + SYS_SEMGET = 221 // { int sys_semget(key_t key, int nsems, int semflg); } + SYS_MSGGET = 225 // { int sys_msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int sys_msgsnd(int msqid, const void *msgp, size_t msgsz, \ + SYS_MSGRCV = 227 // { int sys_msgrcv(int msqid, void *msgp, size_t msgsz, \ + SYS_SHMAT = 228 // { void *sys_shmat(int shmid, const void *shmaddr, \ + SYS_SHMDT = 230 // { int sys_shmdt(const void *shmaddr); } + SYS_MINHERIT = 250 // { int sys_minherit(void *addr, size_t len, \ + SYS_POLL = 252 // { int sys_poll(struct pollfd *fds, \ + SYS_ISSETUGID = 253 // { int sys_issetugid(void); } + SYS_LCHOWN = 254 // { int sys_lchown(const char *path, uid_t uid, gid_t gid); } + SYS_GETSID = 255 // { pid_t sys_getsid(pid_t pid); } + SYS_MSYNC = 256 // { int sys_msync(void *addr, size_t len, int flags); } + SYS_PIPE = 263 // { int sys_pipe(int *fdp); } + SYS_FHOPEN = 264 // { int sys_fhopen(const fhandle_t *fhp, int flags); } + SYS_PREADV = 267 // { ssize_t sys_preadv(int fd, \ + SYS_PWRITEV = 268 // { ssize_t sys_pwritev(int fd, \ + SYS_KQUEUE = 269 // { int sys_kqueue(void); } + SYS_MLOCKALL = 271 // { int sys_mlockall(int flags); } + SYS_MUNLOCKALL = 272 // { int sys_munlockall(void); } + SYS_GETRESUID = 281 // { int sys_getresuid(uid_t *ruid, uid_t *euid, \ + SYS_SETRESUID = 282 // { int sys_setresuid(uid_t ruid, uid_t euid, \ + SYS_GETRESGID = 283 // { int sys_getresgid(gid_t *rgid, gid_t *egid, \ + SYS_SETRESGID = 284 // { int sys_setresgid(gid_t rgid, gid_t egid, \ + SYS_MQUERY = 286 // { void *sys_mquery(void *addr, size_t len, int prot, \ + SYS_CLOSEFROM = 287 // { int sys_closefrom(int fd); } + SYS_SIGALTSTACK = 288 // { int sys_sigaltstack(const struct sigaltstack *nss, \ + SYS_SHMGET = 289 // { int sys_shmget(key_t key, size_t size, int shmflg); } + SYS_SEMOP = 290 // { int sys_semop(int semid, struct sembuf *sops, \ + SYS_FHSTAT = 294 // { int sys_fhstat(const fhandle_t *fhp, \ + SYS___SEMCTL = 295 // { int sys___semctl(int semid, int semnum, int cmd, \ + SYS_SHMCTL = 296 // { int sys_shmctl(int shmid, int cmd, \ + SYS_MSGCTL = 297 // { int sys_msgctl(int msqid, int cmd, \ + SYS_SCHED_YIELD = 298 // { int sys_sched_yield(void); } + SYS_GETTHRID = 299 // { pid_t sys_getthrid(void); } + SYS___THRWAKEUP = 301 // { int sys___thrwakeup(const volatile void *ident, \ + SYS___THREXIT = 302 // { void sys___threxit(pid_t *notdead); } + SYS___THRSIGDIVERT = 303 // { int sys___thrsigdivert(sigset_t sigmask, \ + SYS___GETCWD = 304 // { int sys___getcwd(char *buf, size_t len); } + SYS_ADJFREQ = 305 // { int sys_adjfreq(const int64_t *freq, \ + SYS_SETRTABLE = 310 // { int sys_setrtable(int rtableid); } + SYS_GETRTABLE = 311 // { int sys_getrtable(void); } + SYS_FACCESSAT = 313 // { int sys_faccessat(int fd, const char *path, \ + SYS_FCHMODAT = 314 // { int sys_fchmodat(int fd, const char *path, \ + SYS_FCHOWNAT = 315 // { int sys_fchownat(int fd, const char *path, \ + SYS_LINKAT = 317 // { int sys_linkat(int fd1, const char *path1, int fd2, \ + SYS_MKDIRAT = 318 // { int sys_mkdirat(int fd, const char *path, \ + SYS_MKFIFOAT = 319 // { int sys_mkfifoat(int fd, const char *path, \ + SYS_MKNODAT = 320 // { int sys_mknodat(int fd, const char *path, \ + SYS_OPENAT = 321 // { int sys_openat(int fd, const char *path, int flags, \ + SYS_READLINKAT = 322 // { ssize_t sys_readlinkat(int fd, const char *path, \ + SYS_RENAMEAT = 323 // { int sys_renameat(int fromfd, const char *from, \ + SYS_SYMLINKAT = 324 // { int sys_symlinkat(const char *path, int fd, \ + SYS_UNLINKAT = 325 // { int sys_unlinkat(int fd, const char *path, \ + SYS___SET_TCB = 329 // { void sys___set_tcb(void *tcb); } + SYS___GET_TCB = 330 // { void *sys___get_tcb(void); } +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go new file mode 100644 index 0000000..32653e5 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go @@ -0,0 +1,213 @@ +// mksysnum_openbsd.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build arm,openbsd + +package unix + +const ( + SYS_EXIT = 1 // { void sys_exit(int rval); } + SYS_FORK = 2 // { int sys_fork(void); } + SYS_READ = 3 // { ssize_t sys_read(int fd, void *buf, size_t nbyte); } + SYS_WRITE = 4 // { ssize_t sys_write(int fd, const void *buf, \ + SYS_OPEN = 5 // { int sys_open(const char *path, \ + SYS_CLOSE = 6 // { int sys_close(int fd); } + SYS_GETENTROPY = 7 // { int sys_getentropy(void *buf, size_t nbyte); } + SYS___TFORK = 8 // { int sys___tfork(const struct __tfork *param, \ + SYS_LINK = 9 // { int sys_link(const char *path, const char *link); } + SYS_UNLINK = 10 // { int sys_unlink(const char *path); } + SYS_WAIT4 = 11 // { pid_t sys_wait4(pid_t pid, int *status, \ + SYS_CHDIR = 12 // { int sys_chdir(const char *path); } + SYS_FCHDIR = 13 // { int sys_fchdir(int fd); } + SYS_MKNOD = 14 // { int sys_mknod(const char *path, mode_t mode, \ + SYS_CHMOD = 15 // { int sys_chmod(const char *path, mode_t mode); } + SYS_CHOWN = 16 // { int sys_chown(const char *path, uid_t uid, \ + SYS_OBREAK = 17 // { int sys_obreak(char *nsize); } break + SYS_GETDTABLECOUNT = 18 // { int sys_getdtablecount(void); } + SYS_GETRUSAGE = 19 // { int sys_getrusage(int who, \ + SYS_GETPID = 20 // { pid_t sys_getpid(void); } + SYS_MOUNT = 21 // { int sys_mount(const char *type, const char *path, \ + SYS_UNMOUNT = 22 // { int sys_unmount(const char *path, int flags); } + SYS_SETUID = 23 // { int sys_setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t sys_getuid(void); } + SYS_GETEUID = 25 // { uid_t sys_geteuid(void); } + SYS_PTRACE = 26 // { int sys_ptrace(int req, pid_t pid, caddr_t addr, \ + SYS_RECVMSG = 27 // { ssize_t sys_recvmsg(int s, struct msghdr *msg, \ + SYS_SENDMSG = 28 // { ssize_t sys_sendmsg(int s, \ + SYS_RECVFROM = 29 // { ssize_t sys_recvfrom(int s, void *buf, size_t len, \ + SYS_ACCEPT = 30 // { int sys_accept(int s, struct sockaddr *name, \ + SYS_GETPEERNAME = 31 // { int sys_getpeername(int fdes, struct sockaddr *asa, \ + SYS_GETSOCKNAME = 32 // { int sys_getsockname(int fdes, struct sockaddr *asa, \ + SYS_ACCESS = 33 // { int sys_access(const char *path, int amode); } + SYS_CHFLAGS = 34 // { int sys_chflags(const char *path, u_int flags); } + SYS_FCHFLAGS = 35 // { int sys_fchflags(int fd, u_int flags); } + SYS_SYNC = 36 // { void sys_sync(void); } + SYS_STAT = 38 // { int sys_stat(const char *path, struct stat *ub); } + SYS_GETPPID = 39 // { pid_t sys_getppid(void); } + SYS_LSTAT = 40 // { int sys_lstat(const char *path, struct stat *ub); } + SYS_DUP = 41 // { int sys_dup(int fd); } + SYS_FSTATAT = 42 // { int sys_fstatat(int fd, const char *path, \ + SYS_GETEGID = 43 // { gid_t sys_getegid(void); } + SYS_PROFIL = 44 // { int sys_profil(caddr_t samples, size_t size, \ + SYS_KTRACE = 45 // { int sys_ktrace(const char *fname, int ops, \ + SYS_SIGACTION = 46 // { int sys_sigaction(int signum, \ + SYS_GETGID = 47 // { gid_t sys_getgid(void); } + SYS_SIGPROCMASK = 48 // { int sys_sigprocmask(int how, sigset_t mask); } + SYS_GETLOGIN = 49 // { int sys_getlogin(char *namebuf, u_int namelen); } + SYS_SETLOGIN = 50 // { int sys_setlogin(const char *namebuf); } + SYS_ACCT = 51 // { int sys_acct(const char *path); } + SYS_SIGPENDING = 52 // { int sys_sigpending(void); } + SYS_FSTAT = 53 // { int sys_fstat(int fd, struct stat *sb); } + SYS_IOCTL = 54 // { int sys_ioctl(int fd, \ + SYS_REBOOT = 55 // { int sys_reboot(int opt); } + SYS_REVOKE = 56 // { int sys_revoke(const char *path); } + SYS_SYMLINK = 57 // { int sys_symlink(const char *path, \ + SYS_READLINK = 58 // { ssize_t sys_readlink(const char *path, \ + SYS_EXECVE = 59 // { int sys_execve(const char *path, \ + SYS_UMASK = 60 // { mode_t sys_umask(mode_t newmask); } + SYS_CHROOT = 61 // { int sys_chroot(const char *path); } + SYS_GETFSSTAT = 62 // { int sys_getfsstat(struct statfs *buf, size_t bufsize, \ + SYS_STATFS = 63 // { int sys_statfs(const char *path, \ + SYS_FSTATFS = 64 // { int sys_fstatfs(int fd, struct statfs *buf); } + SYS_FHSTATFS = 65 // { int sys_fhstatfs(const fhandle_t *fhp, \ + SYS_VFORK = 66 // { int sys_vfork(void); } + SYS_GETTIMEOFDAY = 67 // { int sys_gettimeofday(struct timeval *tp, \ + SYS_SETTIMEOFDAY = 68 // { int sys_settimeofday(const struct timeval *tv, \ + SYS_SETITIMER = 69 // { int sys_setitimer(int which, \ + SYS_GETITIMER = 70 // { int sys_getitimer(int which, \ + SYS_SELECT = 71 // { int sys_select(int nd, fd_set *in, fd_set *ou, \ + SYS_KEVENT = 72 // { int sys_kevent(int fd, \ + SYS_MUNMAP = 73 // { int sys_munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int sys_mprotect(void *addr, size_t len, \ + SYS_MADVISE = 75 // { int sys_madvise(void *addr, size_t len, \ + SYS_UTIMES = 76 // { int sys_utimes(const char *path, \ + SYS_FUTIMES = 77 // { int sys_futimes(int fd, \ + SYS_MINCORE = 78 // { int sys_mincore(void *addr, size_t len, \ + SYS_GETGROUPS = 79 // { int sys_getgroups(int gidsetsize, \ + SYS_SETGROUPS = 80 // { int sys_setgroups(int gidsetsize, \ + SYS_GETPGRP = 81 // { int sys_getpgrp(void); } + SYS_SETPGID = 82 // { int sys_setpgid(pid_t pid, pid_t pgid); } + SYS_SENDSYSLOG = 83 // { int sys_sendsyslog(const void *buf, size_t nbyte); } + SYS_UTIMENSAT = 84 // { int sys_utimensat(int fd, const char *path, \ + SYS_FUTIMENS = 85 // { int sys_futimens(int fd, \ + SYS_CLOCK_GETTIME = 87 // { int sys_clock_gettime(clockid_t clock_id, \ + SYS_CLOCK_SETTIME = 88 // { int sys_clock_settime(clockid_t clock_id, \ + SYS_CLOCK_GETRES = 89 // { int sys_clock_getres(clockid_t clock_id, \ + SYS_DUP2 = 90 // { int sys_dup2(int from, int to); } + SYS_NANOSLEEP = 91 // { int sys_nanosleep(const struct timespec *rqtp, \ + SYS_FCNTL = 92 // { int sys_fcntl(int fd, int cmd, ... void *arg); } + SYS_ACCEPT4 = 93 // { int sys_accept4(int s, struct sockaddr *name, \ + SYS___THRSLEEP = 94 // { int sys___thrsleep(const volatile void *ident, \ + SYS_FSYNC = 95 // { int sys_fsync(int fd); } + SYS_SETPRIORITY = 96 // { int sys_setpriority(int which, id_t who, int prio); } + SYS_SOCKET = 97 // { int sys_socket(int domain, int type, int protocol); } + SYS_CONNECT = 98 // { int sys_connect(int s, const struct sockaddr *name, \ + SYS_GETDENTS = 99 // { int sys_getdents(int fd, void *buf, size_t buflen); } + SYS_GETPRIORITY = 100 // { int sys_getpriority(int which, id_t who); } + SYS_PIPE2 = 101 // { int sys_pipe2(int *fdp, int flags); } + SYS_DUP3 = 102 // { int sys_dup3(int from, int to, int flags); } + SYS_SIGRETURN = 103 // { int sys_sigreturn(struct sigcontext *sigcntxp); } + SYS_BIND = 104 // { int sys_bind(int s, const struct sockaddr *name, \ + SYS_SETSOCKOPT = 105 // { int sys_setsockopt(int s, int level, int name, \ + SYS_LISTEN = 106 // { int sys_listen(int s, int backlog); } + SYS_CHFLAGSAT = 107 // { int sys_chflagsat(int fd, const char *path, \ + SYS_PPOLL = 109 // { int sys_ppoll(struct pollfd *fds, \ + SYS_PSELECT = 110 // { int sys_pselect(int nd, fd_set *in, fd_set *ou, \ + SYS_SIGSUSPEND = 111 // { int sys_sigsuspend(int mask); } + SYS_GETSOCKOPT = 118 // { int sys_getsockopt(int s, int level, int name, \ + SYS_READV = 120 // { ssize_t sys_readv(int fd, \ + SYS_WRITEV = 121 // { ssize_t sys_writev(int fd, \ + SYS_KILL = 122 // { int sys_kill(int pid, int signum); } + SYS_FCHOWN = 123 // { int sys_fchown(int fd, uid_t uid, gid_t gid); } + SYS_FCHMOD = 124 // { int sys_fchmod(int fd, mode_t mode); } + SYS_SETREUID = 126 // { int sys_setreuid(uid_t ruid, uid_t euid); } + SYS_SETREGID = 127 // { int sys_setregid(gid_t rgid, gid_t egid); } + SYS_RENAME = 128 // { int sys_rename(const char *from, const char *to); } + SYS_FLOCK = 131 // { int sys_flock(int fd, int how); } + SYS_MKFIFO = 132 // { int sys_mkfifo(const char *path, mode_t mode); } + SYS_SENDTO = 133 // { ssize_t sys_sendto(int s, const void *buf, \ + SYS_SHUTDOWN = 134 // { int sys_shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int sys_socketpair(int domain, int type, \ + SYS_MKDIR = 136 // { int sys_mkdir(const char *path, mode_t mode); } + SYS_RMDIR = 137 // { int sys_rmdir(const char *path); } + SYS_ADJTIME = 140 // { int sys_adjtime(const struct timeval *delta, \ + SYS_SETSID = 147 // { int sys_setsid(void); } + SYS_QUOTACTL = 148 // { int sys_quotactl(const char *path, int cmd, \ + SYS_NFSSVC = 155 // { int sys_nfssvc(int flag, void *argp); } + SYS_GETFH = 161 // { int sys_getfh(const char *fname, fhandle_t *fhp); } + SYS_SYSARCH = 165 // { int sys_sysarch(int op, void *parms); } + SYS_PREAD = 173 // { ssize_t sys_pread(int fd, void *buf, \ + SYS_PWRITE = 174 // { ssize_t sys_pwrite(int fd, const void *buf, \ + SYS_SETGID = 181 // { int sys_setgid(gid_t gid); } + SYS_SETEGID = 182 // { int sys_setegid(gid_t egid); } + SYS_SETEUID = 183 // { int sys_seteuid(uid_t euid); } + SYS_PATHCONF = 191 // { long sys_pathconf(const char *path, int name); } + SYS_FPATHCONF = 192 // { long sys_fpathconf(int fd, int name); } + SYS_SWAPCTL = 193 // { int sys_swapctl(int cmd, const void *arg, int misc); } + SYS_GETRLIMIT = 194 // { int sys_getrlimit(int which, \ + SYS_SETRLIMIT = 195 // { int sys_setrlimit(int which, \ + SYS_MMAP = 197 // { void *sys_mmap(void *addr, size_t len, int prot, \ + SYS_LSEEK = 199 // { off_t sys_lseek(int fd, int pad, off_t offset, \ + SYS_TRUNCATE = 200 // { int sys_truncate(const char *path, int pad, \ + SYS_FTRUNCATE = 201 // { int sys_ftruncate(int fd, int pad, off_t length); } + SYS___SYSCTL = 202 // { int sys___sysctl(const int *name, u_int namelen, \ + SYS_MLOCK = 203 // { int sys_mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int sys_munlock(const void *addr, size_t len); } + SYS_GETPGID = 207 // { pid_t sys_getpgid(pid_t pid); } + SYS_UTRACE = 209 // { int sys_utrace(const char *label, const void *addr, \ + SYS_SEMGET = 221 // { int sys_semget(key_t key, int nsems, int semflg); } + SYS_MSGGET = 225 // { int sys_msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int sys_msgsnd(int msqid, const void *msgp, size_t msgsz, \ + SYS_MSGRCV = 227 // { int sys_msgrcv(int msqid, void *msgp, size_t msgsz, \ + SYS_SHMAT = 228 // { void *sys_shmat(int shmid, const void *shmaddr, \ + SYS_SHMDT = 230 // { int sys_shmdt(const void *shmaddr); } + SYS_MINHERIT = 250 // { int sys_minherit(void *addr, size_t len, \ + SYS_POLL = 252 // { int sys_poll(struct pollfd *fds, \ + SYS_ISSETUGID = 253 // { int sys_issetugid(void); } + SYS_LCHOWN = 254 // { int sys_lchown(const char *path, uid_t uid, gid_t gid); } + SYS_GETSID = 255 // { pid_t sys_getsid(pid_t pid); } + SYS_MSYNC = 256 // { int sys_msync(void *addr, size_t len, int flags); } + SYS_PIPE = 263 // { int sys_pipe(int *fdp); } + SYS_FHOPEN = 264 // { int sys_fhopen(const fhandle_t *fhp, int flags); } + SYS_PREADV = 267 // { ssize_t sys_preadv(int fd, \ + SYS_PWRITEV = 268 // { ssize_t sys_pwritev(int fd, \ + SYS_KQUEUE = 269 // { int sys_kqueue(void); } + SYS_MLOCKALL = 271 // { int sys_mlockall(int flags); } + SYS_MUNLOCKALL = 272 // { int sys_munlockall(void); } + SYS_GETRESUID = 281 // { int sys_getresuid(uid_t *ruid, uid_t *euid, \ + SYS_SETRESUID = 282 // { int sys_setresuid(uid_t ruid, uid_t euid, \ + SYS_GETRESGID = 283 // { int sys_getresgid(gid_t *rgid, gid_t *egid, \ + SYS_SETRESGID = 284 // { int sys_setresgid(gid_t rgid, gid_t egid, \ + SYS_MQUERY = 286 // { void *sys_mquery(void *addr, size_t len, int prot, \ + SYS_CLOSEFROM = 287 // { int sys_closefrom(int fd); } + SYS_SIGALTSTACK = 288 // { int sys_sigaltstack(const struct sigaltstack *nss, \ + SYS_SHMGET = 289 // { int sys_shmget(key_t key, size_t size, int shmflg); } + SYS_SEMOP = 290 // { int sys_semop(int semid, struct sembuf *sops, \ + SYS_FHSTAT = 294 // { int sys_fhstat(const fhandle_t *fhp, \ + SYS___SEMCTL = 295 // { int sys___semctl(int semid, int semnum, int cmd, \ + SYS_SHMCTL = 296 // { int sys_shmctl(int shmid, int cmd, \ + SYS_MSGCTL = 297 // { int sys_msgctl(int msqid, int cmd, \ + SYS_SCHED_YIELD = 298 // { int sys_sched_yield(void); } + SYS_GETTHRID = 299 // { pid_t sys_getthrid(void); } + SYS___THRWAKEUP = 301 // { int sys___thrwakeup(const volatile void *ident, \ + SYS___THREXIT = 302 // { void sys___threxit(pid_t *notdead); } + SYS___THRSIGDIVERT = 303 // { int sys___thrsigdivert(sigset_t sigmask, \ + SYS___GETCWD = 304 // { int sys___getcwd(char *buf, size_t len); } + SYS_ADJFREQ = 305 // { int sys_adjfreq(const int64_t *freq, \ + SYS_SETRTABLE = 310 // { int sys_setrtable(int rtableid); } + SYS_GETRTABLE = 311 // { int sys_getrtable(void); } + SYS_FACCESSAT = 313 // { int sys_faccessat(int fd, const char *path, \ + SYS_FCHMODAT = 314 // { int sys_fchmodat(int fd, const char *path, \ + SYS_FCHOWNAT = 315 // { int sys_fchownat(int fd, const char *path, \ + SYS_LINKAT = 317 // { int sys_linkat(int fd1, const char *path1, int fd2, \ + SYS_MKDIRAT = 318 // { int sys_mkdirat(int fd, const char *path, \ + SYS_MKFIFOAT = 319 // { int sys_mkfifoat(int fd, const char *path, \ + SYS_MKNODAT = 320 // { int sys_mknodat(int fd, const char *path, \ + SYS_OPENAT = 321 // { int sys_openat(int fd, const char *path, int flags, \ + SYS_READLINKAT = 322 // { ssize_t sys_readlinkat(int fd, const char *path, \ + SYS_RENAMEAT = 323 // { int sys_renameat(int fromfd, const char *from, \ + SYS_SYMLINKAT = 324 // { int sys_symlinkat(const char *path, int fd, \ + SYS_UNLINKAT = 325 // { int sys_unlinkat(int fd, const char *path, \ + SYS___SET_TCB = 329 // { void sys___set_tcb(void *tcb); } + SYS___GET_TCB = 330 // { void *sys___get_tcb(void); } +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_solaris_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_solaris_amd64.go new file mode 100644 index 0000000..c708659 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/zsysnum_solaris_amd64.go @@ -0,0 +1,13 @@ +// 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. + +// +build amd64,solaris + +package unix + +// TODO(aram): remove these before Go 1.3. +const ( + SYS_EXECVE = 59 + SYS_FCNTL = 62 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_darwin_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_darwin_386.go new file mode 100644 index 0000000..e61d78a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_darwin_386.go @@ -0,0 +1,462 @@ +// cgo -godefs types_darwin.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,darwin + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int32 + Nsec int32 +} + +type Timeval struct { + Sec int32 + Usec int32 +} + +type Timeval32 struct{} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev int32 + Mode uint16 + Nlink uint16 + Ino uint64 + Uid uint32 + Gid uint32 + Rdev int32 + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Birthtimespec Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + Lspare int32 + Qspare [2]int64 +} + +type Statfs_t struct { + Bsize uint32 + Iosize int32 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Owner uint32 + Type uint32 + Flags uint32 + Fssubtype uint32 + Fstypename [16]int8 + Mntonname [1024]int8 + Mntfromname [1024]int8 + Reserved [8]uint32 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Fstore_t struct { + Flags uint32 + Posmode int32 + Offset int64 + Length int64 + Bytesalloc int64 +} + +type Radvisory_t struct { + Offset int64 + Count int32 +} + +type Fbootstraptransfer_t struct { + Offset int64 + Length uint32 + Buffer *byte +} + +type Log2phys_t struct { + Flags uint32 + Contigbytes int64 + Devoffset int64 +} + +type Fsid struct { + Val [2]int32 +} + +type Dirent struct { + Ino uint64 + Seekoff uint64 + Reclen uint16 + Namlen uint16 + Type uint8 + Name [1024]int8 + Pad_cgo_0 [3]byte +} + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex uint32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x14 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter int16 + Flags uint16 + Fflags uint32 + Data int32 + Udata *byte +} + +type FdSet struct { + Bits [32]int32 +} + +const ( + SizeofIfMsghdr = 0x70 + SizeofIfData = 0x60 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfmaMsghdr2 = 0x14 + SizeofRtMsghdr = 0x5c + SizeofRtMetrics = 0x38 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Typelen uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Recvquota uint8 + Xmitquota uint8 + Unused1 uint8 + Mtu uint32 + Metric uint32 + Baudrate uint32 + Ipackets uint32 + Ierrors uint32 + Opackets uint32 + Oerrors uint32 + Collisions uint32 + Ibytes uint32 + Obytes uint32 + Imcasts uint32 + Omcasts uint32 + Iqdrops uint32 + Noproto uint32 + Recvtiming uint32 + Xmittiming uint32 + Lastchange Timeval + Unused2 uint32 + Hwassist uint32 + Reserved1 uint32 + Reserved2 uint32 +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte +} + +type IfmaMsghdr2 struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Refcount int32 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint32 + Mtu uint32 + Hopcount uint32 + Expire int32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pksent uint32 + Filler [4]uint32 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [2]byte +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x2 + AT_REMOVEDIR = 0x80 + AT_SYMLINK_FOLLOW = 0x40 + AT_SYMLINK_NOFOLLOW = 0x20 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go new file mode 100644 index 0000000..2619155 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go @@ -0,0 +1,472 @@ +// cgo -godefs types_darwin.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,darwin + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int32 + Pad_cgo_0 [4]byte +} + +type Timeval32 struct { + Sec int32 + Usec int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev int32 + Mode uint16 + Nlink uint16 + Ino uint64 + Uid uint32 + Gid uint32 + Rdev int32 + Pad_cgo_0 [4]byte + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Birthtimespec Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + Lspare int32 + Qspare [2]int64 +} + +type Statfs_t struct { + Bsize uint32 + Iosize int32 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Owner uint32 + Type uint32 + Flags uint32 + Fssubtype uint32 + Fstypename [16]int8 + Mntonname [1024]int8 + Mntfromname [1024]int8 + Reserved [8]uint32 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Fstore_t struct { + Flags uint32 + Posmode int32 + Offset int64 + Length int64 + Bytesalloc int64 +} + +type Radvisory_t struct { + Offset int64 + Count int32 + Pad_cgo_0 [4]byte +} + +type Fbootstraptransfer_t struct { + Offset int64 + Length uint64 + Buffer *byte +} + +type Log2phys_t struct { + Flags uint32 + Pad_cgo_0 [8]byte + Pad_cgo_1 [8]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Dirent struct { + Ino uint64 + Seekoff uint64 + Reclen uint16 + Namlen uint16 + Type uint8 + Name [1024]int8 + Pad_cgo_0 [3]byte +} + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *Iovec + Iovlen int32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex uint32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x14 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint64 + Filter int16 + Flags uint16 + Fflags uint32 + Data int64 + Udata *byte +} + +type FdSet struct { + Bits [32]int32 +} + +const ( + SizeofIfMsghdr = 0x70 + SizeofIfData = 0x60 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfmaMsghdr2 = 0x14 + SizeofRtMsghdr = 0x5c + SizeofRtMetrics = 0x38 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Typelen uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Recvquota uint8 + Xmitquota uint8 + Unused1 uint8 + Mtu uint32 + Metric uint32 + Baudrate uint32 + Ipackets uint32 + Ierrors uint32 + Opackets uint32 + Oerrors uint32 + Collisions uint32 + Ibytes uint32 + Obytes uint32 + Imcasts uint32 + Omcasts uint32 + Iqdrops uint32 + Noproto uint32 + Recvtiming uint32 + Xmittiming uint32 + Lastchange Timeval32 + Unused2 uint32 + Hwassist uint32 + Reserved1 uint32 + Reserved2 uint32 +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte +} + +type IfmaMsghdr2 struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Refcount int32 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint32 + Mtu uint32 + Hopcount uint32 + Expire int32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pksent uint32 + Filler [4]uint32 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfProgram = 0x10 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfProgram struct { + Len uint32 + Pad_cgo_0 [4]byte + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval32 + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [2]byte +} + +type Termios struct { + Iflag uint64 + Oflag uint64 + Cflag uint64 + Lflag uint64 + Cc [20]uint8 + Pad_cgo_0 [4]byte + Ispeed uint64 + Ospeed uint64 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x2 + AT_REMOVEDIR = 0x80 + AT_SYMLINK_FOLLOW = 0x40 + AT_SYMLINK_NOFOLLOW = 0x20 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go new file mode 100644 index 0000000..4dca0d4 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go @@ -0,0 +1,463 @@ +// NOTE: cgo can't generate struct Stat_t and struct Statfs_t yet +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_darwin.go + +// +build arm,darwin + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int32 + Nsec int32 +} + +type Timeval struct { + Sec int32 + Usec int32 +} + +type Timeval32 [0]byte + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev int32 + Mode uint16 + Nlink uint16 + Ino uint64 + Uid uint32 + Gid uint32 + Rdev int32 + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Birthtimespec Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + Lspare int32 + Qspare [2]int64 +} + +type Statfs_t struct { + Bsize uint32 + Iosize int32 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Owner uint32 + Type uint32 + Flags uint32 + Fssubtype uint32 + Fstypename [16]int8 + Mntonname [1024]int8 + Mntfromname [1024]int8 + Reserved [8]uint32 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Fstore_t struct { + Flags uint32 + Posmode int32 + Offset int64 + Length int64 + Bytesalloc int64 +} + +type Radvisory_t struct { + Offset int64 + Count int32 +} + +type Fbootstraptransfer_t struct { + Offset int64 + Length uint32 + Buffer *byte +} + +type Log2phys_t struct { + Flags uint32 + Contigbytes int64 + Devoffset int64 +} + +type Fsid struct { + Val [2]int32 +} + +type Dirent struct { + Ino uint64 + Seekoff uint64 + Reclen uint16 + Namlen uint16 + Type uint8 + Name [1024]int8 + Pad_cgo_0 [3]byte +} + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex uint32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x14 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter int16 + Flags uint16 + Fflags uint32 + Data int32 + Udata *byte +} + +type FdSet struct { + Bits [32]int32 +} + +const ( + SizeofIfMsghdr = 0x70 + SizeofIfData = 0x60 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfmaMsghdr2 = 0x14 + SizeofRtMsghdr = 0x5c + SizeofRtMetrics = 0x38 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Typelen uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Recvquota uint8 + Xmitquota uint8 + Unused1 uint8 + Mtu uint32 + Metric uint32 + Baudrate uint32 + Ipackets uint32 + Ierrors uint32 + Opackets uint32 + Oerrors uint32 + Collisions uint32 + Ibytes uint32 + Obytes uint32 + Imcasts uint32 + Omcasts uint32 + Iqdrops uint32 + Noproto uint32 + Recvtiming uint32 + Xmittiming uint32 + Lastchange Timeval + Unused2 uint32 + Hwassist uint32 + Reserved1 uint32 + Reserved2 uint32 +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte +} + +type IfmaMsghdr2 struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Refcount int32 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint32 + Mtu uint32 + Hopcount uint32 + Expire int32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pksent uint32 + Filler [4]uint32 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [2]byte +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x2 + AT_REMOVEDIR = 0x80 + AT_SYMLINK_FOLLOW = 0x40 + AT_SYMLINK_NOFOLLOW = 0x20 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go new file mode 100644 index 0000000..f2881fd --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go @@ -0,0 +1,471 @@ +// +build arm64,darwin +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_darwin.go + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int32 + Pad_cgo_0 [4]byte +} + +type Timeval32 struct { + Sec int32 + Usec int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev int32 + Mode uint16 + Nlink uint16 + Ino uint64 + Uid uint32 + Gid uint32 + Rdev int32 + Pad_cgo_0 [4]byte + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Birthtimespec Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + Lspare int32 + Qspare [2]int64 +} + +type Statfs_t struct { + Bsize uint32 + Iosize int32 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Owner uint32 + Type uint32 + Flags uint32 + Fssubtype uint32 + Fstypename [16]int8 + Mntonname [1024]int8 + Mntfromname [1024]int8 + Reserved [8]uint32 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Fstore_t struct { + Flags uint32 + Posmode int32 + Offset int64 + Length int64 + Bytesalloc int64 +} + +type Radvisory_t struct { + Offset int64 + Count int32 + Pad_cgo_0 [4]byte +} + +type Fbootstraptransfer_t struct { + Offset int64 + Length uint64 + Buffer *byte +} + +type Log2phys_t struct { + Flags uint32 + Pad_cgo_0 [8]byte + Pad_cgo_1 [8]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Dirent struct { + Ino uint64 + Seekoff uint64 + Reclen uint16 + Namlen uint16 + Type uint8 + Name [1024]int8 + Pad_cgo_0 [3]byte +} + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *Iovec + Iovlen int32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex uint32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x14 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint64 + Filter int16 + Flags uint16 + Fflags uint32 + Data int64 + Udata *byte +} + +type FdSet struct { + Bits [32]int32 +} + +const ( + SizeofIfMsghdr = 0x70 + SizeofIfData = 0x60 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfmaMsghdr2 = 0x14 + SizeofRtMsghdr = 0x5c + SizeofRtMetrics = 0x38 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Typelen uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Recvquota uint8 + Xmitquota uint8 + Unused1 uint8 + Mtu uint32 + Metric uint32 + Baudrate uint32 + Ipackets uint32 + Ierrors uint32 + Opackets uint32 + Oerrors uint32 + Collisions uint32 + Ibytes uint32 + Obytes uint32 + Imcasts uint32 + Omcasts uint32 + Iqdrops uint32 + Noproto uint32 + Recvtiming uint32 + Xmittiming uint32 + Lastchange Timeval32 + Unused2 uint32 + Hwassist uint32 + Reserved1 uint32 + Reserved2 uint32 +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte +} + +type IfmaMsghdr2 struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Refcount int32 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint32 + Mtu uint32 + Hopcount uint32 + Expire int32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pksent uint32 + Filler [4]uint32 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfProgram = 0x10 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfProgram struct { + Len uint32 + Pad_cgo_0 [4]byte + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval32 + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [2]byte +} + +type Termios struct { + Iflag uint64 + Oflag uint64 + Cflag uint64 + Lflag uint64 + Cc [20]uint8 + Pad_cgo_0 [4]byte + Ispeed uint64 + Ospeed uint64 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x2 + AT_REMOVEDIR = 0x80 + AT_SYMLINK_FOLLOW = 0x40 + AT_SYMLINK_NOFOLLOW = 0x20 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go new file mode 100644 index 0000000..67c6bf8 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go @@ -0,0 +1,448 @@ +// cgo -godefs types_dragonfly.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,dragonfly + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur int64 + Max int64 +} + +type _Gid_t uint32 + +const ( + S_IFMT = 0xf000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 + S_ISUID = 0x800 + S_ISGID = 0x400 + S_ISVTX = 0x200 + S_IRUSR = 0x100 + S_IWUSR = 0x80 + S_IXUSR = 0x40 +) + +type Stat_t struct { + Ino uint64 + Nlink uint32 + Dev uint32 + Mode uint16 + Padding1 uint16 + Uid uint32 + Gid uint32 + Rdev uint32 + Atim Timespec + Mtim Timespec + Ctim Timespec + Size int64 + Blocks int64 + Blksize uint32 + Flags uint32 + Gen uint32 + Lspare int32 + Qspare1 int64 + Qspare2 int64 +} + +type Statfs_t struct { + Spare2 int64 + Bsize int64 + Iosize int64 + Blocks int64 + Bfree int64 + Bavail int64 + Files int64 + Ffree int64 + Fsid Fsid + Owner uint32 + Type int32 + Flags int32 + Pad_cgo_0 [4]byte + Syncwrites int64 + Asyncwrites int64 + Fstypename [16]int8 + Mntonname [80]int8 + Syncreads int64 + Asyncreads int64 + Spares1 int16 + Mntfromname [80]int8 + Spares2 int16 + Pad_cgo_1 [4]byte + Spare [2]int64 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Dirent struct { + Fileno uint64 + Namlen uint16 + Type uint8 + Unused1 uint8 + Unused2 uint32 + Name [256]int8 +} + +type Fsid struct { + Val [2]int32 +} + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 + Rcf uint16 + Route [16]uint16 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *Iovec + Iovlen int32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x36 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint64 + Filter int16 + Flags uint16 + Fflags uint32 + Data int64 + Udata *byte +} + +type FdSet struct { + Bits [16]uint64 +} + +const ( + SizeofIfMsghdr = 0xb0 + SizeofIfData = 0xa0 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfAnnounceMsghdr = 0x18 + SizeofRtMsghdr = 0x98 + SizeofRtMetrics = 0x70 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Recvquota uint8 + Xmitquota uint8 + Pad_cgo_0 [2]byte + Mtu uint64 + Metric uint64 + Link_state uint64 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Hwassist uint64 + Oqdrops uint64 + Lastchange Timeval +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Name [16]int8 + What uint16 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits uint64 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint64 + Mtu uint64 + Pksent uint64 + Expire uint64 + Sendpipe uint64 + Ssthresh uint64 + Rtt uint64 + Rttvar uint64 + Recvpipe uint64 + Hopcount uint64 + Mssopt uint16 + Pad uint16 + Pad_cgo_0 [4]byte + Msl uint64 + Iwmaxsegs uint64 + Iwcapsegs uint64 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfProgram = 0x10 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x20 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfProgram struct { + Len uint32 + Pad_cgo_0 [4]byte + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [6]byte +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed uint32 + Ospeed uint32 +} + +const ( + AT_FDCWD = 0xfffafdcd + AT_SYMLINK_NOFOLLOW = 0x1 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go new file mode 100644 index 0000000..5b28bcb --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go @@ -0,0 +1,521 @@ +// cgo -godefs types_freebsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,freebsd + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int32 + Nsec int32 +} + +type Timeval struct { + Sec int32 + Usec int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur int64 + Max int64 +} + +type _Gid_t uint32 + +const ( + S_IFMT = 0xf000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 + S_ISUID = 0x800 + S_ISGID = 0x400 + S_ISVTX = 0x200 + S_IRUSR = 0x100 + S_IWUSR = 0x80 + S_IXUSR = 0x40 +) + +type Stat_t struct { + Dev uint32 + Ino uint32 + Mode uint16 + Nlink uint16 + Uid uint32 + Gid uint32 + Rdev uint32 + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + Lspare int32 + Birthtimespec Timespec + Pad_cgo_0 [8]byte +} + +type Statfs_t struct { + Version uint32 + Type uint32 + Flags uint64 + Bsize uint64 + Iosize uint64 + Blocks uint64 + Bfree uint64 + Bavail int64 + Files uint64 + Ffree int64 + Syncwrites uint64 + Asyncwrites uint64 + Syncreads uint64 + Asyncreads uint64 + Spare [10]uint64 + Namemax uint32 + Owner uint32 + Fsid Fsid + Charspare [80]int8 + Fstypename [16]int8 + Mntfromname [88]int8 + Mntonname [88]int8 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 + Sysid int32 +} + +type Dirent struct { + Fileno uint32 + Reclen uint16 + Type uint8 + Namlen uint8 + Name [256]int8 +} + +type Fsid struct { + Val [2]int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [46]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x36 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter int16 + Flags uint16 + Fflags uint32 + Data int32 + Udata *byte +} + +type FdSet struct { + X__fds_bits [32]uint32 +} + +const ( + sizeofIfMsghdr = 0xa8 + SizeofIfMsghdr = 0x60 + sizeofIfData = 0x98 + SizeofIfData = 0x50 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfAnnounceMsghdr = 0x18 + SizeofRtMsghdr = 0x5c + SizeofRtMetrics = 0x38 +) + +type ifMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data ifData +} + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData +} + +type ifData struct { + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Vhid uint8 + Datalen uint16 + Mtu uint32 + Metric uint32 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Oqdrops uint64 + Noproto uint64 + Hwassist uint64 + X__ifi_epoch [8]byte + X__ifi_lastchange [16]byte +} + +type IfData struct { + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Spare_char1 uint8 + Spare_char2 uint8 + Datalen uint8 + Mtu uint32 + Metric uint32 + Baudrate uint32 + Ipackets uint32 + Ierrors uint32 + Opackets uint32 + Oerrors uint32 + Collisions uint32 + Ibytes uint32 + Obytes uint32 + Imcasts uint32 + Omcasts uint32 + Iqdrops uint32 + Noproto uint32 + Hwassist uint32 + Epoch int32 + Lastchange Timeval +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Name [16]int8 + What uint16 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Fmask int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint32 + Mtu uint32 + Hopcount uint32 + Expire uint32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pksent uint32 + Weight uint32 + Filler [3]uint32 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfZbuf = 0xc + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 + SizeofBpfZbufHeader = 0x20 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfZbuf struct { + Bufa *byte + Bufb *byte + Buflen uint32 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [2]byte +} + +type BpfZbufHeader struct { + Kernel_gen uint32 + Kernel_len uint32 + User_gen uint32 + X_bzh_pad [5]uint32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_REMOVEDIR = 0x800 + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x200 +) + +type CapRights struct { + Rights [2]uint64 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go new file mode 100644 index 0000000..c65d89e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go @@ -0,0 +1,524 @@ +// cgo -godefs types_freebsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,freebsd + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur int64 + Max int64 +} + +type _Gid_t uint32 + +const ( + S_IFMT = 0xf000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 + S_ISUID = 0x800 + S_ISGID = 0x400 + S_ISVTX = 0x200 + S_IRUSR = 0x100 + S_IWUSR = 0x80 + S_IXUSR = 0x40 +) + +type Stat_t struct { + Dev uint32 + Ino uint32 + Mode uint16 + Nlink uint16 + Uid uint32 + Gid uint32 + Rdev uint32 + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + Lspare int32 + Birthtimespec Timespec +} + +type Statfs_t struct { + Version uint32 + Type uint32 + Flags uint64 + Bsize uint64 + Iosize uint64 + Blocks uint64 + Bfree uint64 + Bavail int64 + Files uint64 + Ffree int64 + Syncwrites uint64 + Asyncwrites uint64 + Syncreads uint64 + Asyncreads uint64 + Spare [10]uint64 + Namemax uint32 + Owner uint32 + Fsid Fsid + Charspare [80]int8 + Fstypename [16]int8 + Mntfromname [88]int8 + Mntonname [88]int8 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 + Sysid int32 + Pad_cgo_0 [4]byte +} + +type Dirent struct { + Fileno uint32 + Reclen uint16 + Type uint8 + Namlen uint8 + Name [256]int8 +} + +type Fsid struct { + Val [2]int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [46]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *Iovec + Iovlen int32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x36 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint64 + Filter int16 + Flags uint16 + Fflags uint32 + Data int64 + Udata *byte +} + +type FdSet struct { + X__fds_bits [16]uint64 +} + +const ( + sizeofIfMsghdr = 0xa8 + SizeofIfMsghdr = 0xa8 + sizeofIfData = 0x98 + SizeofIfData = 0x98 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfAnnounceMsghdr = 0x18 + SizeofRtMsghdr = 0x98 + SizeofRtMetrics = 0x70 +) + +type ifMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data ifData +} + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData +} + +type ifData struct { + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Vhid uint8 + Datalen uint16 + Mtu uint32 + Metric uint32 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Oqdrops uint64 + Noproto uint64 + Hwassist uint64 + X__ifi_epoch [8]byte + X__ifi_lastchange [16]byte +} + +type IfData struct { + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Spare_char1 uint8 + Spare_char2 uint8 + Datalen uint8 + Mtu uint64 + Metric uint64 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Hwassist uint64 + Epoch int64 + Lastchange Timeval +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Name [16]int8 + What uint16 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Fmask int32 + Inits uint64 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint64 + Mtu uint64 + Hopcount uint64 + Expire uint64 + Recvpipe uint64 + Sendpipe uint64 + Ssthresh uint64 + Rtt uint64 + Rttvar uint64 + Pksent uint64 + Weight uint64 + Filler [3]uint64 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfZbuf = 0x18 + SizeofBpfProgram = 0x10 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x20 + SizeofBpfZbufHeader = 0x20 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfZbuf struct { + Bufa *byte + Bufb *byte + Buflen uint64 +} + +type BpfProgram struct { + Len uint32 + Pad_cgo_0 [4]byte + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [6]byte +} + +type BpfZbufHeader struct { + Kernel_gen uint32 + Kernel_len uint32 + User_gen uint32 + X_bzh_pad [5]uint32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_REMOVEDIR = 0x800 + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x200 +) + +type CapRights struct { + Rights [2]uint64 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go new file mode 100644 index 0000000..42c0a50 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go @@ -0,0 +1,524 @@ +// cgo -godefs -- -fsigned-char types_freebsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,freebsd + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int32 + Pad_cgo_0 [4]byte +} + +type Timeval struct { + Sec int64 + Usec int32 + Pad_cgo_0 [4]byte +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur int64 + Max int64 +} + +type _Gid_t uint32 + +const ( + S_IFMT = 0xf000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 + S_ISUID = 0x800 + S_ISGID = 0x400 + S_ISVTX = 0x200 + S_IRUSR = 0x100 + S_IWUSR = 0x80 + S_IXUSR = 0x40 +) + +type Stat_t struct { + Dev uint32 + Ino uint32 + Mode uint16 + Nlink uint16 + Uid uint32 + Gid uint32 + Rdev uint32 + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + Lspare int32 + Birthtimespec Timespec +} + +type Statfs_t struct { + Version uint32 + Type uint32 + Flags uint64 + Bsize uint64 + Iosize uint64 + Blocks uint64 + Bfree uint64 + Bavail int64 + Files uint64 + Ffree int64 + Syncwrites uint64 + Asyncwrites uint64 + Syncreads uint64 + Asyncreads uint64 + Spare [10]uint64 + Namemax uint32 + Owner uint32 + Fsid Fsid + Charspare [80]int8 + Fstypename [16]int8 + Mntfromname [88]int8 + Mntonname [88]int8 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 + Sysid int32 + Pad_cgo_0 [4]byte +} + +type Dirent struct { + Fileno uint32 + Reclen uint16 + Type uint8 + Namlen uint8 + Name [256]int8 +} + +type Fsid struct { + Val [2]int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [46]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x36 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter int16 + Flags uint16 + Fflags uint32 + Data int32 + Udata *byte +} + +type FdSet struct { + X__fds_bits [32]uint32 +} + +const ( + sizeofIfMsghdr = 0xa8 + SizeofIfMsghdr = 0x70 + sizeofIfData = 0x98 + SizeofIfData = 0x60 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfAnnounceMsghdr = 0x18 + SizeofRtMsghdr = 0x5c + SizeofRtMetrics = 0x38 +) + +type ifMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data ifData +} + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData +} + +type ifData struct { + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Vhid uint8 + Datalen uint16 + Mtu uint32 + Metric uint32 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Oqdrops uint64 + Noproto uint64 + Hwassist uint64 + X__ifi_epoch [8]byte + X__ifi_lastchange [16]byte +} + +type IfData struct { + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Spare_char1 uint8 + Spare_char2 uint8 + Datalen uint8 + Mtu uint32 + Metric uint32 + Baudrate uint32 + Ipackets uint32 + Ierrors uint32 + Opackets uint32 + Oerrors uint32 + Collisions uint32 + Ibytes uint32 + Obytes uint32 + Imcasts uint32 + Omcasts uint32 + Iqdrops uint32 + Noproto uint32 + Hwassist uint32 + Pad_cgo_0 [4]byte + Epoch int64 + Lastchange Timeval +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Name [16]int8 + What uint16 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Fmask int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint32 + Mtu uint32 + Hopcount uint32 + Expire uint32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pksent uint32 + Weight uint32 + Filler [3]uint32 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfZbuf = 0xc + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x20 + SizeofBpfZbufHeader = 0x20 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfZbuf struct { + Bufa *byte + Bufb *byte + Buflen uint32 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [6]byte +} + +type BpfZbufHeader struct { + Kernel_gen uint32 + Kernel_len uint32 + User_gen uint32 + X_bzh_pad [5]uint32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_REMOVEDIR = 0x800 + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x200 +) + +type CapRights struct { + Rights [2]uint64 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_386.go new file mode 100644 index 0000000..8b30c69 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_386.go @@ -0,0 +1,793 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m32 linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,linux + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int32 + Nsec int32 +} + +type Timeval struct { + Sec int32 + Usec int32 +} + +type Timex struct { + Modes uint32 + Offset int32 + Freq int32 + Maxerror int32 + Esterror int32 + Status int32 + Constant int32 + Precision int32 + Tolerance int32 + Time Timeval + Tick int32 + Ppsfreq int32 + Jitter int32 + Shift int32 + Stabil int32 + Jitcnt int32 + Calcnt int32 + Errcnt int32 + Stbcnt int32 + Tai int32 + Pad_cgo_0 [44]byte +} + +type Time_t int32 + +type Tms struct { + Utime int32 + Stime int32 + Cutime int32 + Cstime int32 +} + +type Utimbuf struct { + Actime int32 + Modtime int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + X__pad1 uint16 + Pad_cgo_0 [2]byte + X__st_ino uint32 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint64 + X__pad2 uint16 + Pad_cgo_1 [2]byte + Size int64 + Blksize int32 + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Ino uint64 +} + +type Statfs_t struct { + Type int32 + Bsize int32 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen int32 + Frsize int32 + Flags int32 + Spare [4]int32 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + Pad_cgo_0 [1]byte +} + +type Fsid struct { + X__val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + Start int64 + Len int64 + Pid int32 +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrCAN struct { + Family uint16 + Pad_cgo_0 [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + Pad_cgo_0 [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_MAX = 0x2c + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + X__ifi_pad uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x8 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + Pad_cgo_0 [2]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Ebx int32 + Ecx int32 + Edx int32 + Esi int32 + Edi int32 + Ebp int32 + Eax int32 + Xds int32 + Xes int32 + Xfs int32 + Xgs int32 + Orig_eax int32 + Eip int32 + Xcs int32 + Eflags int32 + Esp int32 + Xss int32 +} + +type FdSet struct { + Bits [32]int32 +} + +type Sysinfo_t struct { + Uptime int32 + Loads [3]uint32 + Totalram uint32 + Freeram uint32 + Sharedram uint32 + Bufferram uint32 + Totalswap uint32 + Freeswap uint32 + Procs uint16 + Pad uint16 + Totalhigh uint32 + Freehigh uint32 + Unit uint32 + X_f [8]int8 +} + +type Utsname struct { + Sysname [65]int8 + Nodename [65]int8 + Release [65]int8 + Version [65]int8 + Machine [65]int8 + Domainname [65]int8 +} + +type Ustat_t struct { + Tfree int32 + Tinode uint32 + Fname [6]int8 + Fpack [6]int8 +} + +type EpollEvent struct { + Events uint32 + Fd int32 + Pad int32 +} + +const ( + AT_FDCWD = -0x64 + AT_REMOVEDIR = 0x200 + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + X__val [32]uint32 +} + +const RNDGETENTCNT = 0x80045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [19]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + Pad_cgo_0 [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + Pad_cgo_1 [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + Pad_cgo_2 [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + Pad_cgo_3 [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go new file mode 100644 index 0000000..cf03589 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go @@ -0,0 +1,811 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m64 linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,linux + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Timex struct { + Modes uint32 + Pad_cgo_0 [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + Pad_cgo_1 [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + Pad_cgo_2 [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + Pad_cgo_3 [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + Ino uint64 + Nlink uint64 + Mode uint32 + Uid uint32 + Gid uint32 + X__pad0 int32 + Rdev uint64 + Size int64 + Blksize int64 + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + _ [3]int64 +} + +type Statfs_t struct { + Type int64 + Bsize int64 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen int64 + Frsize int64 + Flags int64 + Spare [4]int64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + Pad_cgo_0 [5]byte +} + +type Fsid struct { + X__val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + Pad_cgo_0 [4]byte + Start int64 + Len int64 + Pid int32 + Pad_cgo_1 [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrCAN struct { + Family uint16 + Pad_cgo_0 [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + Pad_cgo_1 [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + Pad_cgo_0 [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x10 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_MAX = 0x2c + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + X__ifi_pad uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + R15 uint64 + R14 uint64 + R13 uint64 + R12 uint64 + Rbp uint64 + Rbx uint64 + R11 uint64 + R10 uint64 + R9 uint64 + R8 uint64 + Rax uint64 + Rcx uint64 + Rdx uint64 + Rsi uint64 + Rdi uint64 + Orig_rax uint64 + Rip uint64 + Cs uint64 + Eflags uint64 + Rsp uint64 + Ss uint64 + Fs_base uint64 + Gs_base uint64 + Ds uint64 + Es uint64 + Fs uint64 + Gs uint64 +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + Pad_cgo_0 [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + X_f [0]int8 + Pad_cgo_1 [4]byte +} + +type Utsname struct { + Sysname [65]int8 + Nodename [65]int8 + Release [65]int8 + Version [65]int8 + Machine [65]int8 + Domainname [65]int8 +} + +type Ustat_t struct { + Tfree int32 + Pad_cgo_0 [4]byte + Tinode uint64 + Fname [6]int8 + Fpack [6]int8 + Pad_cgo_1 [4]byte +} + +type EpollEvent struct { + Events uint32 + Fd int32 + Pad int32 +} + +const ( + AT_FDCWD = -0x64 + AT_REMOVEDIR = 0x200 + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + X__val [16]uint64 +} + +const RNDGETENTCNT = 0x80045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [19]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + Pad_cgo_0 [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + Pad_cgo_1 [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + Pad_cgo_2 [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + Pad_cgo_3 [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go new file mode 100644 index 0000000..8ef7d85 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go @@ -0,0 +1,782 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,linux + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int32 + Nsec int32 +} + +type Timeval struct { + Sec int32 + Usec int32 +} + +type Timex struct { + Modes uint32 + Offset int32 + Freq int32 + Maxerror int32 + Esterror int32 + Status int32 + Constant int32 + Precision int32 + Tolerance int32 + Time Timeval + Tick int32 + Ppsfreq int32 + Jitter int32 + Shift int32 + Stabil int32 + Jitcnt int32 + Calcnt int32 + Errcnt int32 + Stbcnt int32 + Tai int32 + Pad_cgo_0 [44]byte +} + +type Time_t int32 + +type Tms struct { + Utime int32 + Stime int32 + Cutime int32 + Cstime int32 +} + +type Utimbuf struct { + Actime int32 + Modtime int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + X__pad1 uint16 + Pad_cgo_0 [2]byte + X__st_ino uint32 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint64 + X__pad2 uint16 + Pad_cgo_1 [6]byte + Size int64 + Blksize int32 + Pad_cgo_2 [4]byte + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Ino uint64 +} + +type Statfs_t struct { + Type int32 + Bsize int32 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen int32 + Frsize int32 + Flags int32 + Spare [4]int32 + Pad_cgo_0 [4]byte +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]uint8 + Pad_cgo_0 [5]byte +} + +type Fsid struct { + X__val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + Pad_cgo_0 [4]byte + Start int64 + Len int64 + Pid int32 + Pad_cgo_1 [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrCAN struct { + Family uint16 + Pad_cgo_0 [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]uint8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]uint8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + Pad_cgo_0 [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_MAX = 0x2c + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + X__ifi_pad uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x8 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + Pad_cgo_0 [2]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Uregs [18]uint32 +} + +type FdSet struct { + Bits [32]int32 +} + +type Sysinfo_t struct { + Uptime int32 + Loads [3]uint32 + Totalram uint32 + Freeram uint32 + Sharedram uint32 + Bufferram uint32 + Totalswap uint32 + Freeswap uint32 + Procs uint16 + Pad uint16 + Totalhigh uint32 + Freehigh uint32 + Unit uint32 + X_f [8]uint8 +} + +type Utsname struct { + Sysname [65]uint8 + Nodename [65]uint8 + Release [65]uint8 + Version [65]uint8 + Machine [65]uint8 + Domainname [65]uint8 +} + +type Ustat_t struct { + Tfree int32 + Tinode uint32 + Fname [6]uint8 + Fpack [6]uint8 +} + +type EpollEvent struct { + Events uint32 + PadFd int32 + Fd int32 + Pad int32 +} + +const ( + AT_FDCWD = -0x64 + AT_REMOVEDIR = 0x200 + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + X__val [32]uint32 +} + +const RNDGETENTCNT = 0x80045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [19]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + Pad_cgo_0 [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + Pad_cgo_1 [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]uint8 + Ac_sched uint8 + Ac_pad [3]uint8 + Pad_cgo_2 [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + Pad_cgo_3 [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go new file mode 100644 index 0000000..3110268 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go @@ -0,0 +1,790 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm64,linux + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Timex struct { + Modes uint32 + Pad_cgo_0 [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + Pad_cgo_1 [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + Pad_cgo_2 [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + Pad_cgo_3 [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint64 + X__pad1 uint64 + Size int64 + Blksize int32 + X__pad2 int32 + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + _ [2]int32 +} + +type Statfs_t struct { + Type int64 + Bsize int64 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen int64 + Frsize int64 + Flags int64 + Spare [4]int64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + Pad_cgo_0 [5]byte +} + +type Fsid struct { + X__val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + Pad_cgo_0 [4]byte + Start int64 + Len int64 + Pid int32 + Pad_cgo_1 [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrCAN struct { + Family uint16 + Pad_cgo_0 [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + Pad_cgo_1 [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + Pad_cgo_0 [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x10 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_MAX = 0x2c + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + X__ifi_pad uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Regs [31]uint64 + Sp uint64 + Pc uint64 + Pstate uint64 +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + Pad_cgo_0 [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + X_f [0]int8 + Pad_cgo_1 [4]byte +} + +type Utsname struct { + Sysname [65]int8 + Nodename [65]int8 + Release [65]int8 + Version [65]int8 + Machine [65]int8 + Domainname [65]int8 +} + +type Ustat_t struct { + Tfree int32 + Pad_cgo_0 [4]byte + Tinode uint64 + Fname [6]int8 + Fpack [6]int8 + Pad_cgo_1 [4]byte +} + +type EpollEvent struct { + Events uint32 + PadFd int32 + Fd int32 + Pad int32 +} + +const ( + AT_FDCWD = -0x64 + AT_REMOVEDIR = 0x200 + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + X__val [16]uint64 +} + +const RNDGETENTCNT = 0x80045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [19]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + Pad_cgo_0 [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + Pad_cgo_1 [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + Pad_cgo_2 [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + Pad_cgo_3 [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go new file mode 100644 index 0000000..d2c1bc2 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go @@ -0,0 +1,787 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mips,linux + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int32 + Nsec int32 +} + +type Timeval struct { + Sec int32 + Usec int32 +} + +type Timex struct { + Modes uint32 + Offset int32 + Freq int32 + Maxerror int32 + Esterror int32 + Status int32 + Constant int32 + Precision int32 + Tolerance int32 + Time Timeval + Tick int32 + Ppsfreq int32 + Jitter int32 + Shift int32 + Stabil int32 + Jitcnt int32 + Calcnt int32 + Errcnt int32 + Stbcnt int32 + Tai int32 + Pad_cgo_0 [44]byte +} + +type Time_t int32 + +type Tms struct { + Utime int32 + Stime int32 + Cutime int32 + Cstime int32 +} + +type Utimbuf struct { + Actime int32 + Modtime int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint32 + Pad1 [3]int32 + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint32 + Pad2 [3]int32 + Size int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Blksize int32 + Pad4 int32 + Blocks int64 + Pad5 [14]int32 +} + +type Statfs_t struct { + Type int32 + Bsize int32 + Frsize int32 + Pad_cgo_0 [4]byte + Blocks uint64 + Bfree uint64 + Files uint64 + Ffree uint64 + Bavail uint64 + Fsid Fsid + Namelen int32 + Flags int32 + Spare [5]int32 + Pad_cgo_1 [4]byte +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + Pad_cgo_0 [5]byte +} + +type Fsid struct { + X__val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + Pad_cgo_0 [4]byte + Start int64 + Len int64 + Pid int32 + Pad_cgo_1 [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrCAN struct { + Family uint16 + Pad_cgo_0 [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + Pad_cgo_0 [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_MAX = 0x2c + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + X__ifi_pad uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x8 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + Pad_cgo_0 [2]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Regs [32]uint64 + Lo uint64 + Hi uint64 + Epc uint64 + Badvaddr uint64 + Status uint64 + Cause uint64 +} + +type FdSet struct { + Bits [32]int32 +} + +type Sysinfo_t struct { + Uptime int32 + Loads [3]uint32 + Totalram uint32 + Freeram uint32 + Sharedram uint32 + Bufferram uint32 + Totalswap uint32 + Freeswap uint32 + Procs uint16 + Pad uint16 + Totalhigh uint32 + Freehigh uint32 + Unit uint32 + X_f [8]int8 +} + +type Utsname struct { + Sysname [65]int8 + Nodename [65]int8 + Release [65]int8 + Version [65]int8 + Machine [65]int8 + Domainname [65]int8 +} + +type Ustat_t struct { + Tfree int32 + Tinode uint32 + Fname [6]int8 + Fpack [6]int8 +} + +type EpollEvent struct { + Events uint32 + PadFd int32 + Fd int32 + Pad int32 +} + +const ( + AT_FDCWD = -0x64 + AT_REMOVEDIR = 0x200 + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + X__val [32]uint32 +} + +const RNDGETENTCNT = 0x40045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [23]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + Pad_cgo_0 [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + Pad_cgo_1 [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + Pad_cgo_2 [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + Pad_cgo_3 [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go new file mode 100644 index 0000000..ec7a0cd --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go @@ -0,0 +1,792 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mips64,linux + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Timex struct { + Modes uint32 + Pad_cgo_0 [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + Pad_cgo_1 [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + Pad_cgo_2 [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + Pad_cgo_3 [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint32 + Pad1 [3]uint32 + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint32 + Pad2 [3]uint32 + Size int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Blksize uint32 + Pad4 uint32 + Blocks int64 +} + +type Statfs_t struct { + Type int64 + Bsize int64 + Frsize int64 + Blocks uint64 + Bfree uint64 + Files uint64 + Ffree uint64 + Bavail uint64 + Fsid Fsid + Namelen int64 + Flags int64 + Spare [5]int64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + Pad_cgo_0 [5]byte +} + +type Fsid struct { + X__val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + Pad_cgo_0 [4]byte + Start int64 + Len int64 + Pid int32 + Pad_cgo_1 [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrCAN struct { + Family uint16 + Pad_cgo_0 [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + Pad_cgo_1 [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + Pad_cgo_0 [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x10 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_MAX = 0x2c + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + X__ifi_pad uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Regs [32]uint64 + Lo uint64 + Hi uint64 + Epc uint64 + Badvaddr uint64 + Status uint64 + Cause uint64 +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + Pad_cgo_0 [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + X_f [0]int8 + Pad_cgo_1 [4]byte +} + +type Utsname struct { + Sysname [65]int8 + Nodename [65]int8 + Release [65]int8 + Version [65]int8 + Machine [65]int8 + Domainname [65]int8 +} + +type Ustat_t struct { + Tfree int32 + Pad_cgo_0 [4]byte + Tinode uint64 + Fname [6]int8 + Fpack [6]int8 + Pad_cgo_1 [4]byte +} + +type EpollEvent struct { + Events uint32 + Fd int32 + Pad int32 +} + +const ( + AT_FDCWD = -0x64 + AT_REMOVEDIR = 0x200 + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + X__val [16]uint64 +} + +const RNDGETENTCNT = 0x40045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [23]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + Pad_cgo_0 [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + Pad_cgo_1 [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + Pad_cgo_2 [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + Pad_cgo_3 [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go new file mode 100644 index 0000000..bbe08d7 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go @@ -0,0 +1,792 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mips64le,linux + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Timex struct { + Modes uint32 + Pad_cgo_0 [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + Pad_cgo_1 [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + Pad_cgo_2 [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + Pad_cgo_3 [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint32 + Pad1 [3]uint32 + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint32 + Pad2 [3]uint32 + Size int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Blksize uint32 + Pad4 uint32 + Blocks int64 +} + +type Statfs_t struct { + Type int64 + Bsize int64 + Frsize int64 + Blocks uint64 + Bfree uint64 + Files uint64 + Ffree uint64 + Bavail uint64 + Fsid Fsid + Namelen int64 + Flags int64 + Spare [5]int64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + Pad_cgo_0 [5]byte +} + +type Fsid struct { + X__val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + Pad_cgo_0 [4]byte + Start int64 + Len int64 + Pid int32 + Pad_cgo_1 [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrCAN struct { + Family uint16 + Pad_cgo_0 [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + Pad_cgo_1 [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + Pad_cgo_0 [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x10 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_MAX = 0x2c + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + X__ifi_pad uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Regs [32]uint64 + Lo uint64 + Hi uint64 + Epc uint64 + Badvaddr uint64 + Status uint64 + Cause uint64 +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + Pad_cgo_0 [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + X_f [0]int8 + Pad_cgo_1 [4]byte +} + +type Utsname struct { + Sysname [65]int8 + Nodename [65]int8 + Release [65]int8 + Version [65]int8 + Machine [65]int8 + Domainname [65]int8 +} + +type Ustat_t struct { + Tfree int32 + Pad_cgo_0 [4]byte + Tinode uint64 + Fname [6]int8 + Fpack [6]int8 + Pad_cgo_1 [4]byte +} + +type EpollEvent struct { + Events uint32 + Fd int32 + Pad int32 +} + +const ( + AT_FDCWD = -0x64 + AT_REMOVEDIR = 0x200 + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + X__val [16]uint64 +} + +const RNDGETENTCNT = 0x40045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [23]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + Pad_cgo_0 [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + Pad_cgo_1 [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + Pad_cgo_2 [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + Pad_cgo_3 [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go new file mode 100644 index 0000000..75ee05a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go @@ -0,0 +1,787 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mipsle,linux + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int32 + Nsec int32 +} + +type Timeval struct { + Sec int32 + Usec int32 +} + +type Timex struct { + Modes uint32 + Offset int32 + Freq int32 + Maxerror int32 + Esterror int32 + Status int32 + Constant int32 + Precision int32 + Tolerance int32 + Time Timeval + Tick int32 + Ppsfreq int32 + Jitter int32 + Shift int32 + Stabil int32 + Jitcnt int32 + Calcnt int32 + Errcnt int32 + Stbcnt int32 + Tai int32 + Pad_cgo_0 [44]byte +} + +type Time_t int32 + +type Tms struct { + Utime int32 + Stime int32 + Cutime int32 + Cstime int32 +} + +type Utimbuf struct { + Actime int32 + Modtime int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint32 + Pad1 [3]int32 + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint32 + Pad2 [3]int32 + Size int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Blksize int32 + Pad4 int32 + Blocks int64 + Pad5 [14]int32 +} + +type Statfs_t struct { + Type int32 + Bsize int32 + Frsize int32 + Pad_cgo_0 [4]byte + Blocks uint64 + Bfree uint64 + Files uint64 + Ffree uint64 + Bavail uint64 + Fsid Fsid + Namelen int32 + Flags int32 + Spare [5]int32 + Pad_cgo_1 [4]byte +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + Pad_cgo_0 [5]byte +} + +type Fsid struct { + X__val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + Pad_cgo_0 [4]byte + Start int64 + Len int64 + Pid int32 + Pad_cgo_1 [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrCAN struct { + Family uint16 + Pad_cgo_0 [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + Pad_cgo_0 [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_MAX = 0x2c + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + X__ifi_pad uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x8 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + Pad_cgo_0 [2]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Regs [32]uint64 + Lo uint64 + Hi uint64 + Epc uint64 + Badvaddr uint64 + Status uint64 + Cause uint64 +} + +type FdSet struct { + Bits [32]int32 +} + +type Sysinfo_t struct { + Uptime int32 + Loads [3]uint32 + Totalram uint32 + Freeram uint32 + Sharedram uint32 + Bufferram uint32 + Totalswap uint32 + Freeswap uint32 + Procs uint16 + Pad uint16 + Totalhigh uint32 + Freehigh uint32 + Unit uint32 + X_f [8]int8 +} + +type Utsname struct { + Sysname [65]int8 + Nodename [65]int8 + Release [65]int8 + Version [65]int8 + Machine [65]int8 + Domainname [65]int8 +} + +type Ustat_t struct { + Tfree int32 + Tinode uint32 + Fname [6]int8 + Fpack [6]int8 +} + +type EpollEvent struct { + Events uint32 + PadFd int32 + Fd int32 + Pad int32 +} + +const ( + AT_FDCWD = -0x64 + AT_REMOVEDIR = 0x200 + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + X__val [32]uint32 +} + +const RNDGETENTCNT = 0x40045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [23]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + Pad_cgo_0 [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + Pad_cgo_1 [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + Pad_cgo_2 [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + Pad_cgo_3 [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go new file mode 100644 index 0000000..30a257f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go @@ -0,0 +1,800 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build ppc64,linux + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Timex struct { + Modes uint32 + Pad_cgo_0 [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + Pad_cgo_1 [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + Pad_cgo_2 [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + Pad_cgo_3 [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + Ino uint64 + Nlink uint64 + Mode uint32 + Uid uint32 + Gid uint32 + X__pad2 int32 + Rdev uint64 + Size int64 + Blksize int64 + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + _ uint64 + _ uint64 + _ uint64 +} + +type Statfs_t struct { + Type int64 + Bsize int64 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen int64 + Frsize int64 + Flags int64 + Spare [4]int64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]uint8 + Pad_cgo_0 [5]byte +} + +type Fsid struct { + X__val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + Pad_cgo_0 [4]byte + Start int64 + Len int64 + Pid int32 + Pad_cgo_1 [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrCAN struct { + Family uint16 + Pad_cgo_0 [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]uint8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]uint8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + Pad_cgo_1 [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + Pad_cgo_0 [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x10 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_MAX = 0x2c + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + X__ifi_pad uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Gpr [32]uint64 + Nip uint64 + Msr uint64 + Orig_gpr3 uint64 + Ctr uint64 + Link uint64 + Xer uint64 + Ccr uint64 + Softe uint64 + Trap uint64 + Dar uint64 + Dsisr uint64 + Result uint64 +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + Pad_cgo_0 [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + X_f [0]uint8 + Pad_cgo_1 [4]byte +} + +type Utsname struct { + Sysname [65]uint8 + Nodename [65]uint8 + Release [65]uint8 + Version [65]uint8 + Machine [65]uint8 + Domainname [65]uint8 +} + +type Ustat_t struct { + Tfree int32 + Pad_cgo_0 [4]byte + Tinode uint64 + Fname [6]uint8 + Fpack [6]uint8 + Pad_cgo_1 [4]byte +} + +type EpollEvent struct { + Events uint32 + X_padFd int32 + Fd int32 + Pad int32 +} + +const ( + AT_FDCWD = -0x64 + AT_REMOVEDIR = 0x200 + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + X__val [16]uint64 +} + +const RNDGETENTCNT = 0x40045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [19]uint8 + Line uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + Pad_cgo_0 [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + Pad_cgo_1 [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]uint8 + Ac_sched uint8 + Ac_pad [3]uint8 + Pad_cgo_2 [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + Pad_cgo_3 [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go new file mode 100644 index 0000000..bebed6f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go @@ -0,0 +1,800 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build ppc64le,linux + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Timex struct { + Modes uint32 + Pad_cgo_0 [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + Pad_cgo_1 [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + Pad_cgo_2 [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + Pad_cgo_3 [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + Ino uint64 + Nlink uint64 + Mode uint32 + Uid uint32 + Gid uint32 + X__pad2 int32 + Rdev uint64 + Size int64 + Blksize int64 + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + _ uint64 + _ uint64 + _ uint64 +} + +type Statfs_t struct { + Type int64 + Bsize int64 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen int64 + Frsize int64 + Flags int64 + Spare [4]int64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]uint8 + Pad_cgo_0 [5]byte +} + +type Fsid struct { + X__val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + Pad_cgo_0 [4]byte + Start int64 + Len int64 + Pid int32 + Pad_cgo_1 [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrCAN struct { + Family uint16 + Pad_cgo_0 [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]uint8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]uint8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + Pad_cgo_1 [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + Pad_cgo_0 [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x10 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_MAX = 0x2c + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + X__ifi_pad uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Gpr [32]uint64 + Nip uint64 + Msr uint64 + Orig_gpr3 uint64 + Ctr uint64 + Link uint64 + Xer uint64 + Ccr uint64 + Softe uint64 + Trap uint64 + Dar uint64 + Dsisr uint64 + Result uint64 +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + Pad_cgo_0 [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + X_f [0]uint8 + Pad_cgo_1 [4]byte +} + +type Utsname struct { + Sysname [65]uint8 + Nodename [65]uint8 + Release [65]uint8 + Version [65]uint8 + Machine [65]uint8 + Domainname [65]uint8 +} + +type Ustat_t struct { + Tfree int32 + Pad_cgo_0 [4]byte + Tinode uint64 + Fname [6]uint8 + Fpack [6]uint8 + Pad_cgo_1 [4]byte +} + +type EpollEvent struct { + Events uint32 + X_padFd int32 + Fd int32 + Pad int32 +} + +const ( + AT_FDCWD = -0x64 + AT_REMOVEDIR = 0x200 + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + X__val [16]uint64 +} + +const RNDGETENTCNT = 0x40045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [19]uint8 + Line uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + Pad_cgo_0 [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + Pad_cgo_1 [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]uint8 + Ac_sched uint8 + Ac_pad [3]uint8 + Pad_cgo_2 [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + Pad_cgo_3 [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go new file mode 100644 index 0000000..286661b --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go @@ -0,0 +1,817 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build s390x,linux + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Timex struct { + Modes uint32 + _ [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + _ [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + _ [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + _ [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + Ino uint64 + Nlink uint64 + Mode uint32 + Uid uint32 + Gid uint32 + _ int32 + Rdev uint64 + Size int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Blksize int64 + Blocks int64 + _ [3]int64 +} + +type Statfs_t struct { + Type uint32 + Bsize uint32 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen uint32 + Frsize uint32 + Flags uint32 + Spare [4]uint32 + _ [4]byte +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + _ [5]byte +} + +type Fsid struct { + _ [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + _ [4]byte + Start int64 + Len int64 + Pid int32 + _ [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x6 + FADV_NOREUSE = 0x7 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrCAN struct { + Family uint16 + _ [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + _ [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + _ [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + _ [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x10 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_MAX = 0x2c + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + _ uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + _ [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Psw PtracePsw + Gprs [16]uint64 + Acrs [16]uint32 + Orig_gpr2 uint64 + Fp_regs PtraceFpregs + Per_info PtracePer + Ieee_instruction_pointer uint64 +} + +type PtracePsw struct { + Mask uint64 + Addr uint64 +} + +type PtraceFpregs struct { + Fpc uint32 + _ [4]byte + Fprs [16]float64 +} + +type PtracePer struct { + _ [0]uint64 + _ [24]byte + _ [8]byte + Starting_addr uint64 + Ending_addr uint64 + Perc_atmid uint16 + _ [6]byte + Address uint64 + Access_id uint8 + _ [7]byte +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + _ [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + _ [0]int8 + _ [4]byte +} + +type Utsname struct { + Sysname [65]int8 + Nodename [65]int8 + Release [65]int8 + Version [65]int8 + Machine [65]int8 + Domainname [65]int8 +} + +type Ustat_t struct { + Tfree int32 + _ [4]byte + Tinode uint64 + Fname [6]int8 + Fpack [6]int8 + _ [4]byte +} + +type EpollEvent struct { + Events uint32 + _ int32 + Fd int32 + Pad int32 +} + +const ( + AT_FDCWD = -0x64 + AT_REMOVEDIR = 0x200 + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + _ [16]uint64 +} + +const RNDGETENTCNT = 0x80045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [19]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + _ [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + _ [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + _ [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + _ [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go new file mode 100644 index 0000000..22bdab9 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go @@ -0,0 +1,666 @@ +// +build sparc64,linux +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_linux.go | go run mkpost.go + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int32 + Pad_cgo_0 [4]byte +} + +type Timex struct { + Modes uint32 + Pad_cgo_0 [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + Pad_cgo_1 [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + Pad_cgo_2 [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + Pad_cgo_3 [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + X__pad1 uint16 + Pad_cgo_0 [6]byte + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint64 + X__pad2 uint16 + Pad_cgo_1 [6]byte + Size int64 + Blksize int64 + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + X__glibc_reserved4 uint64 + X__glibc_reserved5 uint64 +} + +type Statfs_t struct { + Type int64 + Bsize int64 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen int64 + Frsize int64 + Flags int64 + Spare [4]int64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + Pad_cgo_0 [5]byte +} + +type Fsid struct { + X__val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + Pad_cgo_0 [4]byte + Start int64 + Len int64 + Pid int32 + X__glibc_reserved int16 + Pad_cgo_1 [2]byte +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrCAN struct { + Family uint16 + Pad_cgo_0 [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + Pad_cgo_1 [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + Pad_cgo_0 [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_MAX = 0x2a + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + X__ifi_pad uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Regs [16]uint64 + Tstate uint64 + Tpc uint64 + Tnpc uint64 + Y uint32 + Magic uint32 +} + +type ptracePsw struct { +} + +type ptraceFpregs struct { +} + +type ptracePer struct { +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + Pad_cgo_0 [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + X_f [0]int8 + Pad_cgo_1 [4]byte +} + +type Utsname struct { + Sysname [65]int8 + Nodename [65]int8 + Release [65]int8 + Version [65]int8 + Machine [65]int8 + Domainname [65]int8 +} + +type Ustat_t struct { + Tfree int32 + Pad_cgo_0 [4]byte + Tinode uint64 + Fname [6]int8 + Fpack [6]int8 + Pad_cgo_1 [4]byte +} + +type EpollEvent struct { + Events uint32 + X_padFd int32 + Fd int32 + Pad int32 +} + +const ( + AT_FDCWD = -0x64 + AT_REMOVEDIR = 0x200 + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x800 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + X__val [16]uint64 +} + +const _SC_PAGESIZE = 0x1e + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [19]uint8 + Ispeed uint32 + Ospeed uint32 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go new file mode 100644 index 0000000..42f99c0 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go @@ -0,0 +1,401 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_netbsd.go + +// +build 386,netbsd + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int32 +} + +type Timeval struct { + Sec int64 + Usec int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + Mode uint32 + Ino uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint64 + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Birthtimespec Timespec + Size int64 + Blocks int64 + Blksize uint32 + Flags uint32 + Gen uint32 + Spare [2]uint32 +} + +type Statfs_t [0]byte + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Dirent struct { + Fileno uint64 + Reclen uint16 + Namlen uint16 + Type uint8 + Name [512]int8 + Pad_cgo_0 [3]byte +} + +type Fsid struct { + X__fsid_val [2]int32 +} + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x14 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter uint32 + Flags uint32 + Fflags uint32 + Data int64 + Udata int32 +} + +type FdSet struct { + Bits [8]uint32 +} + +const ( + SizeofIfMsghdr = 0x98 + SizeofIfData = 0x84 + SizeofIfaMsghdr = 0x18 + SizeofIfAnnounceMsghdr = 0x18 + SizeofRtMsghdr = 0x78 + SizeofRtMetrics = 0x50 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData + Pad_cgo_1 [4]byte +} + +type IfData struct { + Type uint8 + Addrlen uint8 + Hdrlen uint8 + Pad_cgo_0 [1]byte + Link_state int32 + Mtu uint64 + Metric uint64 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Lastchange Timespec +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Metric int32 + Index uint16 + Pad_cgo_0 [6]byte +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Name [16]int8 + What uint16 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits int32 + Pad_cgo_1 [4]byte + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint64 + Mtu uint64 + Hopcount uint64 + Recvpipe uint64 + Sendpipe uint64 + Ssthresh uint64 + Rtt uint64 + Rttvar uint64 + Expire int64 + Pksent int64 +} + +type Mclpool [0]byte + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x80 + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint64 + Drop uint64 + Capt uint64 + Padding [13]uint64 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp BpfTimeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [2]byte +} + +type BpfTimeval struct { + Sec int32 + Usec int32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed int32 + Ospeed int32 +} + +const ( + AT_FDCWD = -0x64 + AT_SYMLINK_NOFOLLOW = 0x200 +) + +type Sysctlnode struct { + Flags uint32 + Num int32 + Name [32]int8 + Ver uint32 + X__rsvd uint32 + Un [16]byte + X_sysctl_size [8]byte + X_sysctl_func [8]byte + X_sysctl_parent [8]byte + X_sysctl_desc [8]byte +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go new file mode 100644 index 0000000..ff290ba --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go @@ -0,0 +1,408 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_netbsd.go + +// +build amd64,netbsd + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int32 + Pad_cgo_0 [4]byte +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + Mode uint32 + Pad_cgo_0 [4]byte + Ino uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Pad_cgo_1 [4]byte + Rdev uint64 + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Birthtimespec Timespec + Size int64 + Blocks int64 + Blksize uint32 + Flags uint32 + Gen uint32 + Spare [2]uint32 + Pad_cgo_2 [4]byte +} + +type Statfs_t [0]byte + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Dirent struct { + Fileno uint64 + Reclen uint16 + Namlen uint16 + Type uint8 + Name [512]int8 + Pad_cgo_0 [3]byte +} + +type Fsid struct { + X__fsid_val [2]int32 +} + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *Iovec + Iovlen int32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x14 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint64 + Filter uint32 + Flags uint32 + Fflags uint32 + Pad_cgo_0 [4]byte + Data int64 + Udata int64 +} + +type FdSet struct { + Bits [8]uint32 +} + +const ( + SizeofIfMsghdr = 0x98 + SizeofIfData = 0x88 + SizeofIfaMsghdr = 0x18 + SizeofIfAnnounceMsghdr = 0x18 + SizeofRtMsghdr = 0x78 + SizeofRtMetrics = 0x50 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Addrlen uint8 + Hdrlen uint8 + Pad_cgo_0 [1]byte + Link_state int32 + Mtu uint64 + Metric uint64 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Lastchange Timespec +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Metric int32 + Index uint16 + Pad_cgo_0 [6]byte +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Name [16]int8 + What uint16 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits int32 + Pad_cgo_1 [4]byte + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint64 + Mtu uint64 + Hopcount uint64 + Recvpipe uint64 + Sendpipe uint64 + Ssthresh uint64 + Rtt uint64 + Rttvar uint64 + Expire int64 + Pksent int64 +} + +type Mclpool [0]byte + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x80 + SizeofBpfProgram = 0x10 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x20 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint64 + Drop uint64 + Capt uint64 + Padding [13]uint64 +} + +type BpfProgram struct { + Len uint32 + Pad_cgo_0 [4]byte + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp BpfTimeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [6]byte +} + +type BpfTimeval struct { + Sec int64 + Usec int64 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed int32 + Ospeed int32 +} + +const ( + AT_FDCWD = -0x64 + AT_SYMLINK_NOFOLLOW = 0x200 +) + +type Sysctlnode struct { + Flags uint32 + Num int32 + Name [32]int8 + Ver uint32 + X__rsvd uint32 + Un [16]byte + X_sysctl_size [8]byte + X_sysctl_func [8]byte + X_sysctl_parent [8]byte + X_sysctl_desc [8]byte +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go new file mode 100644 index 0000000..66dbd7c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go @@ -0,0 +1,406 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_netbsd.go + +// +build arm,netbsd + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int32 + Pad_cgo_0 [4]byte +} + +type Timeval struct { + Sec int64 + Usec int32 + Pad_cgo_0 [4]byte +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + Mode uint32 + Pad_cgo_0 [4]byte + Ino uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Pad_cgo_1 [4]byte + Rdev uint64 + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Birthtimespec Timespec + Size int64 + Blocks int64 + Blksize uint32 + Flags uint32 + Gen uint32 + Spare [2]uint32 + Pad_cgo_2 [4]byte +} + +type Statfs_t [0]byte + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Dirent struct { + Fileno uint64 + Reclen uint16 + Namlen uint16 + Type uint8 + Name [512]int8 + Pad_cgo_0 [3]byte +} + +type Fsid struct { + X__fsid_val [2]int32 +} + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x14 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter uint32 + Flags uint32 + Fflags uint32 + Data int64 + Udata int32 + Pad_cgo_0 [4]byte +} + +type FdSet struct { + Bits [8]uint32 +} + +const ( + SizeofIfMsghdr = 0x98 + SizeofIfData = 0x88 + SizeofIfaMsghdr = 0x18 + SizeofIfAnnounceMsghdr = 0x18 + SizeofRtMsghdr = 0x78 + SizeofRtMetrics = 0x50 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Addrlen uint8 + Hdrlen uint8 + Pad_cgo_0 [1]byte + Link_state int32 + Mtu uint64 + Metric uint64 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Lastchange Timespec +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Metric int32 + Index uint16 + Pad_cgo_0 [6]byte +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Name [16]int8 + What uint16 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits int32 + Pad_cgo_1 [4]byte + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint64 + Mtu uint64 + Hopcount uint64 + Recvpipe uint64 + Sendpipe uint64 + Ssthresh uint64 + Rtt uint64 + Rttvar uint64 + Expire int64 + Pksent int64 +} + +type Mclpool [0]byte + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x80 + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint64 + Drop uint64 + Capt uint64 + Padding [13]uint64 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp BpfTimeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [2]byte +} + +type BpfTimeval struct { + Sec int32 + Usec int32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed int32 + Ospeed int32 +} + +const ( + AT_FDCWD = -0x64 + AT_SYMLINK_NOFOLLOW = 0x200 +) + +type Sysctlnode struct { + Flags uint32 + Num int32 + Name [32]int8 + Ver uint32 + X__rsvd uint32 + Un [16]byte + X_sysctl_size [8]byte + X_sysctl_func [8]byte + X_sysctl_parent [8]byte + X_sysctl_desc [8]byte +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go new file mode 100644 index 0000000..20fc9f4 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go @@ -0,0 +1,446 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_openbsd.go + +// +build 386,openbsd + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int32 +} + +type Timeval struct { + Sec int64 + Usec int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +const ( + S_IFMT = 0xf000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 + S_ISUID = 0x800 + S_ISGID = 0x400 + S_ISVTX = 0x200 + S_IRUSR = 0x100 + S_IWUSR = 0x80 + S_IXUSR = 0x40 +) + +type Stat_t struct { + Mode uint32 + Dev int32 + Ino uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev int32 + Atim Timespec + Mtim Timespec + Ctim Timespec + Size int64 + Blocks int64 + Blksize uint32 + Flags uint32 + Gen uint32 + X__st_birthtim Timespec +} + +type Statfs_t struct { + F_flags uint32 + F_bsize uint32 + F_iosize uint32 + F_blocks uint64 + F_bfree uint64 + F_bavail int64 + F_files uint64 + F_ffree uint64 + F_favail int64 + F_syncwrites uint64 + F_syncreads uint64 + F_asyncwrites uint64 + F_asyncreads uint64 + F_fsid Fsid + F_namemax uint32 + F_owner uint32 + F_ctime uint64 + F_fstypename [16]int8 + F_mntonname [90]int8 + F_mntfromname [90]int8 + F_mntfromspec [90]int8 + Pad_cgo_0 [2]byte + Mount_info [160]byte +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Dirent struct { + Fileno uint64 + Off int64 + Reclen uint16 + Type uint8 + Namlen uint8 + X__d_padding [4]uint8 + Name [256]int8 +} + +type Fsid struct { + Val [2]int32 +} + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [24]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x20 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter int16 + Flags uint16 + Fflags uint32 + Data int64 + Udata *byte +} + +type FdSet struct { + Bits [32]uint32 +} + +const ( + SizeofIfMsghdr = 0xec + SizeofIfData = 0xd4 + SizeofIfaMsghdr = 0x18 + SizeofIfAnnounceMsghdr = 0x1a + SizeofRtMsghdr = 0x60 + SizeofRtMetrics = 0x38 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Pad1 uint8 + Pad2 uint8 + Addrs int32 + Flags int32 + Xflags int32 + Data IfData +} + +type IfData struct { + Type uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Mtu uint32 + Metric uint32 + Pad uint32 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Capabilities uint32 + Lastchange Timeval + Mclpool [7]Mclpool +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Pad1 uint8 + Pad2 uint8 + Addrs int32 + Flags int32 + Metric int32 +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + What uint16 + Name [16]int8 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Priority uint8 + Mpls uint8 + Addrs int32 + Flags int32 + Fmask int32 + Pid int32 + Seq int32 + Errno int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Pksent uint64 + Expire int64 + Locks uint32 + Mtu uint32 + Refcnt uint32 + Hopcount uint32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pad uint32 +} + +type Mclpool struct { + Grown int32 + Alive uint16 + Hwm uint16 + Cwm uint16 + Lwm uint16 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp BpfTimeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [2]byte +} + +type BpfTimeval struct { + Sec uint32 + Usec uint32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed int32 + Ospeed int32 +} + +const ( + AT_FDCWD = -0x64 + AT_SYMLINK_NOFOLLOW = 0x2 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go new file mode 100644 index 0000000..46fe949 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go @@ -0,0 +1,453 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_openbsd.go + +// +build amd64,openbsd + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +const ( + S_IFMT = 0xf000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 + S_ISUID = 0x800 + S_ISGID = 0x400 + S_ISVTX = 0x200 + S_IRUSR = 0x100 + S_IWUSR = 0x80 + S_IXUSR = 0x40 +) + +type Stat_t struct { + Mode uint32 + Dev int32 + Ino uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev int32 + Atim Timespec + Mtim Timespec + Ctim Timespec + Size int64 + Blocks int64 + Blksize uint32 + Flags uint32 + Gen uint32 + Pad_cgo_0 [4]byte + X__st_birthtim Timespec +} + +type Statfs_t struct { + F_flags uint32 + F_bsize uint32 + F_iosize uint32 + Pad_cgo_0 [4]byte + F_blocks uint64 + F_bfree uint64 + F_bavail int64 + F_files uint64 + F_ffree uint64 + F_favail int64 + F_syncwrites uint64 + F_syncreads uint64 + F_asyncwrites uint64 + F_asyncreads uint64 + F_fsid Fsid + F_namemax uint32 + F_owner uint32 + F_ctime uint64 + F_fstypename [16]int8 + F_mntonname [90]int8 + F_mntfromname [90]int8 + F_mntfromspec [90]int8 + Pad_cgo_1 [2]byte + Mount_info [160]byte +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Dirent struct { + Fileno uint64 + Off int64 + Reclen uint16 + Type uint8 + Namlen uint8 + X__d_padding [4]uint8 + Name [256]int8 +} + +type Fsid struct { + Val [2]int32 +} + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [24]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *Iovec + Iovlen uint32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x20 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint64 + Filter int16 + Flags uint16 + Fflags uint32 + Data int64 + Udata *byte +} + +type FdSet struct { + Bits [32]uint32 +} + +const ( + SizeofIfMsghdr = 0xf8 + SizeofIfData = 0xe0 + SizeofIfaMsghdr = 0x18 + SizeofIfAnnounceMsghdr = 0x1a + SizeofRtMsghdr = 0x60 + SizeofRtMetrics = 0x38 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Pad1 uint8 + Pad2 uint8 + Addrs int32 + Flags int32 + Xflags int32 + Data IfData +} + +type IfData struct { + Type uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Mtu uint32 + Metric uint32 + Pad uint32 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Capabilities uint32 + Pad_cgo_0 [4]byte + Lastchange Timeval + Mclpool [7]Mclpool + Pad_cgo_1 [4]byte +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Pad1 uint8 + Pad2 uint8 + Addrs int32 + Flags int32 + Metric int32 +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + What uint16 + Name [16]int8 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Priority uint8 + Mpls uint8 + Addrs int32 + Flags int32 + Fmask int32 + Pid int32 + Seq int32 + Errno int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Pksent uint64 + Expire int64 + Locks uint32 + Mtu uint32 + Refcnt uint32 + Hopcount uint32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pad uint32 +} + +type Mclpool struct { + Grown int32 + Alive uint16 + Hwm uint16 + Cwm uint16 + Lwm uint16 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfProgram = 0x10 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfProgram struct { + Len uint32 + Pad_cgo_0 [4]byte + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp BpfTimeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [2]byte +} + +type BpfTimeval struct { + Sec uint32 + Usec uint32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed int32 + Ospeed int32 +} + +const ( + AT_FDCWD = -0x64 + AT_SYMLINK_NOFOLLOW = 0x2 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go new file mode 100644 index 0000000..62e1f7c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go @@ -0,0 +1,439 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_openbsd.go + +// +build arm,openbsd + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int32 +} + +type Timeval struct { + Sec int64 + Usec int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +const ( + S_IFMT = 0xf000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 + S_ISUID = 0x800 + S_ISGID = 0x400 + S_ISVTX = 0x200 + S_IRUSR = 0x100 + S_IWUSR = 0x80 + S_IXUSR = 0x40 +) + +type Stat_t struct { + Mode uint32 + Dev int32 + Ino uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev int32 + Atim Timespec + Mtim Timespec + Ctim Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + X__st_birthtim Timespec +} + +type Statfs_t struct { + F_flags uint32 + F_bsize uint32 + F_iosize uint32 + F_blocks uint64 + F_bfree uint64 + F_bavail int64 + F_files uint64 + F_ffree uint64 + F_favail int64 + F_syncwrites uint64 + F_syncreads uint64 + F_asyncwrites uint64 + F_asyncreads uint64 + F_fsid Fsid + F_namemax uint32 + F_owner uint32 + F_ctime uint64 + F_fstypename [16]uint8 + F_mntonname [90]uint8 + F_mntfromname [90]uint8 + F_mntfromspec [90]uint8 + Pad_cgo_0 [2]byte + Mount_info [160]byte +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Dirent struct { + Fileno uint64 + Off int64 + Reclen uint16 + Type uint8 + Namlen uint8 + X__d_padding [4]uint8 + Name [256]uint8 +} + +type Fsid struct { + Val [2]int32 +} + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [24]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x20 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter int16 + Flags uint16 + Fflags uint32 + Data int64 + Udata *byte +} + +type FdSet struct { + Bits [32]uint32 +} + +const ( + SizeofIfMsghdr = 0x98 + SizeofIfData = 0x80 + SizeofIfaMsghdr = 0x18 + SizeofIfAnnounceMsghdr = 0x1a + SizeofRtMsghdr = 0x60 + SizeofRtMetrics = 0x38 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Pad1 uint8 + Pad2 uint8 + Addrs int32 + Flags int32 + Xflags int32 + Data IfData +} + +type IfData struct { + Type uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Mtu uint32 + Metric uint32 + Pad uint32 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Capabilities uint32 + Lastchange Timeval +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Pad1 uint8 + Pad2 uint8 + Addrs int32 + Flags int32 + Metric int32 +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + What uint16 + Name [16]uint8 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Priority uint8 + Mpls uint8 + Addrs int32 + Flags int32 + Fmask int32 + Pid int32 + Seq int32 + Errno int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Pksent uint64 + Expire int64 + Locks uint32 + Mtu uint32 + Refcnt uint32 + Hopcount uint32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pad uint32 +} + +type Mclpool struct{} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp BpfTimeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [2]byte +} + +type BpfTimeval struct { + Sec uint32 + Usec uint32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed int32 + Ospeed int32 +} + +const ( + AT_FDCWD = -0x64 + AT_SYMLINK_NOFOLLOW = 0x2 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go new file mode 100644 index 0000000..a979a33 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go @@ -0,0 +1,440 @@ +// cgo -godefs types_solaris.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,solaris + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 + PathMax = 0x400 + MaxHostNameLen = 0x100 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Timeval32 struct { + Sec int32 + Usec int32 +} + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +const ( + S_IFMT = 0xf000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 + S_ISUID = 0x800 + S_ISGID = 0x400 + S_ISVTX = 0x200 + S_IRUSR = 0x100 + S_IWUSR = 0x80 + S_IXUSR = 0x40 +) + +type Stat_t struct { + Dev uint64 + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint64 + Size int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Blksize int32 + Pad_cgo_0 [4]byte + Blocks int64 + Fstype [16]int8 +} + +type Flock_t struct { + Type int16 + Whence int16 + Pad_cgo_0 [4]byte + Start int64 + Len int64 + Sysid int32 + Pid int32 + Pad [4]int64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Name [1]int8 + Pad_cgo_0 [5]byte +} + +type _Fsblkcnt_t uint64 + +type Statvfs_t struct { + Bsize uint64 + Frsize uint64 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Favail uint64 + Fsid uint64 + Basetype [16]int8 + Flag uint64 + Namemax uint64 + Fstr [32]int8 +} + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 + X__sin6_src_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrDatalink struct { + Family uint16 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [244]int8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [236]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *int8 + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *Iovec + Iovlen int32 + Pad_cgo_1 [4]byte + Accrights *int8 + Accrightslen int32 + Pad_cgo_2 [4]byte +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + X__icmp6_filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x20 + SizeofSockaddrAny = 0xfc + SizeofSockaddrUnix = 0x6e + SizeofSockaddrDatalink = 0xfc + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x24 + SizeofICMPv6Filter = 0x20 +) + +type FdSet struct { + Bits [1024]int64 +} + +type Utsname struct { + Sysname [257]int8 + Nodename [257]int8 + Release [257]int8 + Version [257]int8 + Machine [257]int8 +} + +type Ustat_t struct { + Tfree int64 + Tinode uint64 + Fname [6]int8 + Fpack [6]int8 + Pad_cgo_0 [4]byte +} + +const ( + AT_FDCWD = 0xffd19553 + AT_SYMLINK_NOFOLLOW = 0x1000 + AT_SYMLINK_FOLLOW = 0x2000 + AT_REMOVEDIR = 0x1 + AT_EACCESS = 0x4 +) + +const ( + SizeofIfMsghdr = 0x54 + SizeofIfData = 0x44 + SizeofIfaMsghdr = 0x14 + SizeofRtMsghdr = 0x4c + SizeofRtMetrics = 0x28 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Addrlen uint8 + Hdrlen uint8 + Pad_cgo_0 [1]byte + Mtu uint32 + Metric uint32 + Baudrate uint32 + Ipackets uint32 + Ierrors uint32 + Opackets uint32 + Oerrors uint32 + Collisions uint32 + Ibytes uint32 + Obytes uint32 + Imcasts uint32 + Omcasts uint32 + Iqdrops uint32 + Noproto uint32 + Lastchange Timeval32 +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Metric int32 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint32 + Mtu uint32 + Hopcount uint32 + Expire uint32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pksent uint32 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x80 + SizeofBpfProgram = 0x10 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint64 + Drop uint64 + Capt uint64 + Padding [13]uint64 +} + +type BpfProgram struct { + Len uint32 + Pad_cgo_0 [4]byte + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfTimeval struct { + Sec int32 + Usec int32 +} + +type BpfHdr struct { + Tstamp BpfTimeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [2]byte +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [19]uint8 + Pad_cgo_0 [1]byte +} + +type Termio struct { + Iflag uint16 + Oflag uint16 + Cflag uint16 + Lflag uint16 + Line int8 + Cc [8]uint8 + Pad_cgo_0 [1]byte +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/asm_windows_386.s b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/asm_windows_386.s new file mode 100644 index 0000000..1c20dd2 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/asm_windows_386.s @@ -0,0 +1,13 @@ +// 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. + +// +// System calls for 386, Windows are implemented in runtime/syscall_windows.goc +// + +TEXT ·getprocaddress(SB), 7, $0-8 + JMP syscall·getprocaddress(SB) + +TEXT ·loadlibrary(SB), 7, $0-4 + JMP syscall·loadlibrary(SB) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/asm_windows_amd64.s b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/asm_windows_amd64.s new file mode 100644 index 0000000..4d025ab --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/asm_windows_amd64.s @@ -0,0 +1,13 @@ +// 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. + +// +// System calls for amd64, Windows are implemented in runtime/syscall_windows.goc +// + +TEXT ·getprocaddress(SB), 7, $0-32 + JMP syscall·getprocaddress(SB) + +TEXT ·loadlibrary(SB), 7, $0-8 + JMP syscall·loadlibrary(SB) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/dll_windows.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/dll_windows.go new file mode 100644 index 0000000..e77a370 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/dll_windows.go @@ -0,0 +1,377 @@ +// 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 windows + +import ( + "sync" + "sync/atomic" + "syscall" + "unsafe" +) + +// DLLError describes reasons for DLL load failures. +type DLLError struct { + Err error + ObjName string + Msg string +} + +func (e *DLLError) Error() string { return e.Msg } + +// Implemented in runtime/syscall_windows.goc; we provide jumps to them in our assembly file. +func loadlibrary(filename *uint16) (handle uintptr, err syscall.Errno) +func getprocaddress(handle uintptr, procname *uint8) (proc uintptr, err syscall.Errno) + +// A DLL implements access to a single DLL. +type DLL struct { + Name string + Handle Handle +} + +// LoadDLL loads DLL file into memory. +// +// Warning: using LoadDLL without an absolute path name is subject to +// DLL preloading attacks. To safely load a system DLL, use LazyDLL +// with System set to true, or use LoadLibraryEx directly. +func LoadDLL(name string) (dll *DLL, err error) { + namep, err := UTF16PtrFromString(name) + if err != nil { + return nil, err + } + h, e := loadlibrary(namep) + if e != 0 { + return nil, &DLLError{ + Err: e, + ObjName: name, + Msg: "Failed to load " + name + ": " + e.Error(), + } + } + d := &DLL{ + Name: name, + Handle: Handle(h), + } + return d, nil +} + +// MustLoadDLL is like LoadDLL but panics if load operation failes. +func MustLoadDLL(name string) *DLL { + d, e := LoadDLL(name) + if e != nil { + panic(e) + } + return d +} + +// FindProc searches DLL d for procedure named name and returns *Proc +// if found. It returns an error if search fails. +func (d *DLL) FindProc(name string) (proc *Proc, err error) { + namep, err := BytePtrFromString(name) + if err != nil { + return nil, err + } + a, e := getprocaddress(uintptr(d.Handle), namep) + if e != 0 { + return nil, &DLLError{ + Err: e, + ObjName: name, + Msg: "Failed to find " + name + " procedure in " + d.Name + ": " + e.Error(), + } + } + p := &Proc{ + Dll: d, + Name: name, + addr: a, + } + return p, nil +} + +// MustFindProc is like FindProc but panics if search fails. +func (d *DLL) MustFindProc(name string) *Proc { + p, e := d.FindProc(name) + if e != nil { + panic(e) + } + return p +} + +// Release unloads DLL d from memory. +func (d *DLL) Release() (err error) { + return FreeLibrary(d.Handle) +} + +// A Proc implements access to a procedure inside a DLL. +type Proc struct { + Dll *DLL + Name string + addr uintptr +} + +// Addr returns the address of the procedure represented by p. +// The return value can be passed to Syscall to run the procedure. +func (p *Proc) Addr() uintptr { + return p.addr +} + +//go:uintptrescapes + +// Call executes procedure p with arguments a. It will panic, if more then 15 arguments +// are supplied. +// +// The returned error is always non-nil, constructed from the result of GetLastError. +// Callers must inspect the primary return value to decide whether an error occurred +// (according to the semantics of the specific function being called) before consulting +// the error. The error will be guaranteed to contain windows.Errno. +func (p *Proc) Call(a ...uintptr) (r1, r2 uintptr, lastErr error) { + switch len(a) { + case 0: + return syscall.Syscall(p.Addr(), uintptr(len(a)), 0, 0, 0) + case 1: + return syscall.Syscall(p.Addr(), uintptr(len(a)), a[0], 0, 0) + case 2: + return syscall.Syscall(p.Addr(), uintptr(len(a)), a[0], a[1], 0) + case 3: + return syscall.Syscall(p.Addr(), uintptr(len(a)), a[0], a[1], a[2]) + case 4: + return syscall.Syscall6(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], 0, 0) + case 5: + return syscall.Syscall6(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], 0) + case 6: + return syscall.Syscall6(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5]) + case 7: + return syscall.Syscall9(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], 0, 0) + case 8: + return syscall.Syscall9(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], 0) + case 9: + return syscall.Syscall9(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]) + case 10: + return syscall.Syscall12(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], 0, 0) + case 11: + return syscall.Syscall12(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], 0) + case 12: + return syscall.Syscall12(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11]) + case 13: + return syscall.Syscall15(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], 0, 0) + case 14: + return syscall.Syscall15(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], 0) + case 15: + return syscall.Syscall15(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14]) + default: + panic("Call " + p.Name + " with too many arguments " + itoa(len(a)) + ".") + } +} + +// A LazyDLL implements access to a single DLL. +// It will delay the load of the DLL until the first +// call to its Handle method or to one of its +// LazyProc's Addr method. +type LazyDLL struct { + Name string + + // System determines whether the DLL must be loaded from the + // Windows System directory, bypassing the normal DLL search + // path. + System bool + + mu sync.Mutex + dll *DLL // non nil once DLL is loaded +} + +// Load loads DLL file d.Name into memory. It returns an error if fails. +// Load will not try to load DLL, if it is already loaded into memory. +func (d *LazyDLL) Load() error { + // Non-racy version of: + // if d.dll != nil { + if atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(&d.dll))) != nil { + return nil + } + d.mu.Lock() + defer d.mu.Unlock() + if d.dll != nil { + return nil + } + + // kernel32.dll is special, since it's where LoadLibraryEx comes from. + // The kernel already special-cases its name, so it's always + // loaded from system32. + var dll *DLL + var err error + if d.Name == "kernel32.dll" { + dll, err = LoadDLL(d.Name) + } else { + dll, err = loadLibraryEx(d.Name, d.System) + } + if err != nil { + return err + } + + // Non-racy version of: + // d.dll = dll + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(&d.dll)), unsafe.Pointer(dll)) + return nil +} + +// mustLoad is like Load but panics if search fails. +func (d *LazyDLL) mustLoad() { + e := d.Load() + if e != nil { + panic(e) + } +} + +// Handle returns d's module handle. +func (d *LazyDLL) Handle() uintptr { + d.mustLoad() + return uintptr(d.dll.Handle) +} + +// NewProc returns a LazyProc for accessing the named procedure in the DLL d. +func (d *LazyDLL) NewProc(name string) *LazyProc { + return &LazyProc{l: d, Name: name} +} + +// NewLazyDLL creates new LazyDLL associated with DLL file. +func NewLazyDLL(name string) *LazyDLL { + return &LazyDLL{Name: name} +} + +// NewLazySystemDLL is like NewLazyDLL, but will only +// search Windows System directory for the DLL if name is +// a base name (like "advapi32.dll"). +func NewLazySystemDLL(name string) *LazyDLL { + return &LazyDLL{Name: name, System: true} +} + +// A LazyProc implements access to a procedure inside a LazyDLL. +// It delays the lookup until the Addr method is called. +type LazyProc struct { + Name string + + mu sync.Mutex + l *LazyDLL + proc *Proc +} + +// Find searches DLL for procedure named p.Name. It returns +// an error if search fails. Find will not search procedure, +// if it is already found and loaded into memory. +func (p *LazyProc) Find() error { + // Non-racy version of: + // if p.proc == nil { + if atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(&p.proc))) == nil { + p.mu.Lock() + defer p.mu.Unlock() + if p.proc == nil { + e := p.l.Load() + if e != nil { + return e + } + proc, e := p.l.dll.FindProc(p.Name) + if e != nil { + return e + } + // Non-racy version of: + // p.proc = proc + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(&p.proc)), unsafe.Pointer(proc)) + } + } + return nil +} + +// mustFind is like Find but panics if search fails. +func (p *LazyProc) mustFind() { + e := p.Find() + if e != nil { + panic(e) + } +} + +// Addr returns the address of the procedure represented by p. +// The return value can be passed to Syscall to run the procedure. +func (p *LazyProc) Addr() uintptr { + p.mustFind() + return p.proc.Addr() +} + +//go:uintptrescapes + +// Call executes procedure p with arguments a. It will panic, if more then 15 arguments +// are supplied. +// +// The returned error is always non-nil, constructed from the result of GetLastError. +// Callers must inspect the primary return value to decide whether an error occurred +// (according to the semantics of the specific function being called) before consulting +// the error. The error will be guaranteed to contain windows.Errno. +func (p *LazyProc) Call(a ...uintptr) (r1, r2 uintptr, lastErr error) { + p.mustFind() + return p.proc.Call(a...) +} + +var canDoSearchSystem32Once struct { + sync.Once + v bool +} + +func initCanDoSearchSystem32() { + // https://msdn.microsoft.com/en-us/library/ms684179(v=vs.85).aspx says: + // "Windows 7, Windows Server 2008 R2, Windows Vista, and Windows + // Server 2008: The LOAD_LIBRARY_SEARCH_* flags are available on + // systems that have KB2533623 installed. To determine whether the + // flags are available, use GetProcAddress to get the address of the + // AddDllDirectory, RemoveDllDirectory, or SetDefaultDllDirectories + // function. If GetProcAddress succeeds, the LOAD_LIBRARY_SEARCH_* + // flags can be used with LoadLibraryEx." + canDoSearchSystem32Once.v = (modkernel32.NewProc("AddDllDirectory").Find() == nil) +} + +func canDoSearchSystem32() bool { + canDoSearchSystem32Once.Do(initCanDoSearchSystem32) + return canDoSearchSystem32Once.v +} + +func isBaseName(name string) bool { + for _, c := range name { + if c == ':' || c == '/' || c == '\\' { + return false + } + } + return true +} + +// loadLibraryEx wraps the Windows LoadLibraryEx function. +// +// See https://msdn.microsoft.com/en-us/library/windows/desktop/ms684179(v=vs.85).aspx +// +// If name is not an absolute path, LoadLibraryEx searches for the DLL +// in a variety of automatic locations unless constrained by flags. +// See: https://msdn.microsoft.com/en-us/library/ff919712%28VS.85%29.aspx +func loadLibraryEx(name string, system bool) (*DLL, error) { + loadDLL := name + var flags uintptr + if system { + if canDoSearchSystem32() { + const LOAD_LIBRARY_SEARCH_SYSTEM32 = 0x00000800 + flags = LOAD_LIBRARY_SEARCH_SYSTEM32 + } else if isBaseName(name) { + // WindowsXP or unpatched Windows machine + // trying to load "foo.dll" out of the system + // folder, but LoadLibraryEx doesn't support + // that yet on their system, so emulate it. + windir, _ := Getenv("WINDIR") // old var; apparently works on XP + if windir == "" { + return nil, errString("%WINDIR% not defined") + } + loadDLL = windir + "\\System32\\" + name + } + } + h, err := LoadLibraryEx(loadDLL, 0, flags) + if err != nil { + return nil, err + } + return &DLL{Name: name, Handle: h}, nil +} + +type errString string + +func (s errString) Error() string { return string(s) } diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/env_unset.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/env_unset.go new file mode 100644 index 0000000..4ed03ae --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/env_unset.go @@ -0,0 +1,15 @@ +// 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. + +// +build windows +// +build go1.4 + +package windows + +import "syscall" + +func Unsetenv(key string) error { + // This was added in Go 1.4. + return syscall.Unsetenv(key) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/env_windows.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/env_windows.go new file mode 100644 index 0000000..a9d8ef4 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/env_windows.go @@ -0,0 +1,25 @@ +// 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. + +// Windows environment variables. + +package windows + +import "syscall" + +func Getenv(key string) (value string, found bool) { + return syscall.Getenv(key) +} + +func Setenv(key, value string) error { + return syscall.Setenv(key, value) +} + +func Clearenv() { + syscall.Clearenv() +} + +func Environ() []string { + return syscall.Environ() +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/eventlog.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/eventlog.go new file mode 100644 index 0000000..40af946 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/eventlog.go @@ -0,0 +1,20 @@ +// 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. + +// +build windows + +package windows + +const ( + EVENTLOG_SUCCESS = 0 + EVENTLOG_ERROR_TYPE = 1 + EVENTLOG_WARNING_TYPE = 2 + EVENTLOG_INFORMATION_TYPE = 4 + EVENTLOG_AUDIT_SUCCESS = 8 + EVENTLOG_AUDIT_FAILURE = 16 +) + +//sys RegisterEventSource(uncServerName *uint16, sourceName *uint16) (handle Handle, err error) [failretval==0] = advapi32.RegisterEventSourceW +//sys DeregisterEventSource(handle Handle) (err error) = advapi32.DeregisterEventSource +//sys ReportEvent(log Handle, etype uint16, category uint16, eventId uint32, usrSId uintptr, numStrings uint16, dataSize uint32, strings **uint16, rawData *byte) (err error) = advapi32.ReportEventW diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/exec_windows.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/exec_windows.go new file mode 100644 index 0000000..3606c3a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/exec_windows.go @@ -0,0 +1,97 @@ +// 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. + +// Fork, exec, wait, etc. + +package windows + +// EscapeArg rewrites command line argument s as prescribed +// in http://msdn.microsoft.com/en-us/library/ms880421. +// This function returns "" (2 double quotes) if s is empty. +// Alternatively, these transformations are done: +// - every back slash (\) is doubled, but only if immediately +// followed by double quote ("); +// - every double quote (") is escaped by back slash (\); +// - finally, s is wrapped with double quotes (arg -> "arg"), +// but only if there is space or tab inside s. +func EscapeArg(s string) string { + if len(s) == 0 { + return "\"\"" + } + n := len(s) + hasSpace := false + for i := 0; i < len(s); i++ { + switch s[i] { + case '"', '\\': + n++ + case ' ', '\t': + hasSpace = true + } + } + if hasSpace { + n += 2 + } + if n == len(s) { + return s + } + + qs := make([]byte, n) + j := 0 + if hasSpace { + qs[j] = '"' + j++ + } + slashes := 0 + for i := 0; i < len(s); i++ { + switch s[i] { + default: + slashes = 0 + qs[j] = s[i] + case '\\': + slashes++ + qs[j] = s[i] + case '"': + for ; slashes > 0; slashes-- { + qs[j] = '\\' + j++ + } + qs[j] = '\\' + j++ + qs[j] = s[i] + } + j++ + } + if hasSpace { + for ; slashes > 0; slashes-- { + qs[j] = '\\' + j++ + } + qs[j] = '"' + j++ + } + return string(qs[:j]) +} + +func CloseOnExec(fd Handle) { + SetHandleInformation(Handle(fd), HANDLE_FLAG_INHERIT, 0) +} + +// FullPath retrieves the full path of the specified file. +func FullPath(name string) (path string, err error) { + p, err := UTF16PtrFromString(name) + if err != nil { + return "", err + } + n := uint32(100) + for { + buf := make([]uint16, n) + n, err = GetFullPathName(p, uint32(len(buf)), &buf[0], nil) + if err != nil { + return "", err + } + if n <= uint32(len(buf)) { + return UTF16ToString(buf[:n]), nil + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/memory_windows.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/memory_windows.go new file mode 100644 index 0000000..f63e899 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/memory_windows.go @@ -0,0 +1,26 @@ +// 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 windows + +const ( + MEM_COMMIT = 0x00001000 + MEM_RESERVE = 0x00002000 + MEM_DECOMMIT = 0x00004000 + MEM_RELEASE = 0x00008000 + MEM_RESET = 0x00080000 + MEM_TOP_DOWN = 0x00100000 + MEM_WRITE_WATCH = 0x00200000 + MEM_PHYSICAL = 0x00400000 + MEM_RESET_UNDO = 0x01000000 + MEM_LARGE_PAGES = 0x20000000 + + PAGE_NOACCESS = 0x01 + PAGE_READONLY = 0x02 + PAGE_READWRITE = 0x04 + PAGE_WRITECOPY = 0x08 + PAGE_EXECUTE_READ = 0x20 + PAGE_EXECUTE_READWRITE = 0x40 + PAGE_EXECUTE_WRITECOPY = 0x80 +) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/mksyscall.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/mksyscall.go new file mode 100644 index 0000000..e1c88c9 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/mksyscall.go @@ -0,0 +1,7 @@ +// 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 windows + +//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go eventlog.go service.go syscall_windows.go security_windows.go diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/race.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/race.go new file mode 100644 index 0000000..343e18a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/race.go @@ -0,0 +1,30 @@ +// 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. + +// +build windows,race + +package windows + +import ( + "runtime" + "unsafe" +) + +const raceenabled = true + +func raceAcquire(addr unsafe.Pointer) { + runtime.RaceAcquire(addr) +} + +func raceReleaseMerge(addr unsafe.Pointer) { + runtime.RaceReleaseMerge(addr) +} + +func raceReadRange(addr unsafe.Pointer, len int) { + runtime.RaceReadRange(addr, len) +} + +func raceWriteRange(addr unsafe.Pointer, len int) { + runtime.RaceWriteRange(addr, len) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/race0.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/race0.go new file mode 100644 index 0000000..17af843 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/race0.go @@ -0,0 +1,25 @@ +// 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. + +// +build windows,!race + +package windows + +import ( + "unsafe" +) + +const raceenabled = false + +func raceAcquire(addr unsafe.Pointer) { +} + +func raceReleaseMerge(addr unsafe.Pointer) { +} + +func raceReadRange(addr unsafe.Pointer, len int) { +} + +func raceWriteRange(addr unsafe.Pointer, len int) { +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/registry/export_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/registry/export_test.go new file mode 100644 index 0000000..8badf6f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/registry/export_test.go @@ -0,0 +1,11 @@ +// Copyright 2015 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 windows + +package registry + +func (k Key) SetValue(name string, valtype uint32, data []byte) error { + return k.setValue(name, valtype, data) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/registry/key.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/registry/key.go new file mode 100644 index 0000000..d0beb19 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/registry/key.go @@ -0,0 +1,200 @@ +// Copyright 2015 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 windows + +// Package registry provides access to the Windows registry. +// +// Here is a simple example, opening a registry key and reading a string value from it. +// +// k, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\Windows NT\CurrentVersion`, registry.QUERY_VALUE) +// if err != nil { +// log.Fatal(err) +// } +// defer k.Close() +// +// s, _, err := k.GetStringValue("SystemRoot") +// if err != nil { +// log.Fatal(err) +// } +// fmt.Printf("Windows system root is %q\n", s) +// +package registry + +import ( + "io" + "syscall" + "time" +) + +const ( + // Registry key security and access rights. + // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms724878.aspx + // for details. + ALL_ACCESS = 0xf003f + CREATE_LINK = 0x00020 + CREATE_SUB_KEY = 0x00004 + ENUMERATE_SUB_KEYS = 0x00008 + EXECUTE = 0x20019 + NOTIFY = 0x00010 + QUERY_VALUE = 0x00001 + READ = 0x20019 + SET_VALUE = 0x00002 + WOW64_32KEY = 0x00200 + WOW64_64KEY = 0x00100 + WRITE = 0x20006 +) + +// Key is a handle to an open Windows registry key. +// Keys can be obtained by calling OpenKey; there are +// also some predefined root keys such as CURRENT_USER. +// Keys can be used directly in the Windows API. +type Key syscall.Handle + +const ( + // Windows defines some predefined root keys that are always open. + // An application can use these keys as entry points to the registry. + // Normally these keys are used in OpenKey to open new keys, + // but they can also be used anywhere a Key is required. + CLASSES_ROOT = Key(syscall.HKEY_CLASSES_ROOT) + CURRENT_USER = Key(syscall.HKEY_CURRENT_USER) + LOCAL_MACHINE = Key(syscall.HKEY_LOCAL_MACHINE) + USERS = Key(syscall.HKEY_USERS) + CURRENT_CONFIG = Key(syscall.HKEY_CURRENT_CONFIG) + PERFORMANCE_DATA = Key(syscall.HKEY_PERFORMANCE_DATA) +) + +// Close closes open key k. +func (k Key) Close() error { + return syscall.RegCloseKey(syscall.Handle(k)) +} + +// OpenKey opens a new key with path name relative to key k. +// It accepts any open key, including CURRENT_USER and others, +// and returns the new key and an error. +// The access parameter specifies desired access rights to the +// key to be opened. +func OpenKey(k Key, path string, access uint32) (Key, error) { + p, err := syscall.UTF16PtrFromString(path) + if err != nil { + return 0, err + } + var subkey syscall.Handle + err = syscall.RegOpenKeyEx(syscall.Handle(k), p, 0, access, &subkey) + if err != nil { + return 0, err + } + return Key(subkey), nil +} + +// OpenRemoteKey opens a predefined registry key on another +// computer pcname. The key to be opened is specified by k, but +// can only be one of LOCAL_MACHINE, PERFORMANCE_DATA or USERS. +// If pcname is "", OpenRemoteKey returns local computer key. +func OpenRemoteKey(pcname string, k Key) (Key, error) { + var err error + var p *uint16 + if pcname != "" { + p, err = syscall.UTF16PtrFromString(`\\` + pcname) + if err != nil { + return 0, err + } + } + var remoteKey syscall.Handle + err = regConnectRegistry(p, syscall.Handle(k), &remoteKey) + if err != nil { + return 0, err + } + return Key(remoteKey), nil +} + +// ReadSubKeyNames returns the names of subkeys of key k. +// The parameter n controls the number of returned names, +// analogous to the way os.File.Readdirnames works. +func (k Key) ReadSubKeyNames(n int) ([]string, error) { + ki, err := k.Stat() + if err != nil { + return nil, err + } + names := make([]string, 0, ki.SubKeyCount) + buf := make([]uint16, ki.MaxSubKeyLen+1) // extra room for terminating zero byte +loopItems: + for i := uint32(0); ; i++ { + if n > 0 { + if len(names) == n { + return names, nil + } + } + l := uint32(len(buf)) + for { + err := syscall.RegEnumKeyEx(syscall.Handle(k), i, &buf[0], &l, nil, nil, nil, nil) + if err == nil { + break + } + if err == syscall.ERROR_MORE_DATA { + // Double buffer size and try again. + l = uint32(2 * len(buf)) + buf = make([]uint16, l) + continue + } + if err == _ERROR_NO_MORE_ITEMS { + break loopItems + } + return names, err + } + names = append(names, syscall.UTF16ToString(buf[:l])) + } + if n > len(names) { + return names, io.EOF + } + return names, nil +} + +// CreateKey creates a key named path under open key k. +// CreateKey returns the new key and a boolean flag that reports +// whether the key already existed. +// The access parameter specifies the access rights for the key +// to be created. +func CreateKey(k Key, path string, access uint32) (newk Key, openedExisting bool, err error) { + var h syscall.Handle + var d uint32 + err = regCreateKeyEx(syscall.Handle(k), syscall.StringToUTF16Ptr(path), + 0, nil, _REG_OPTION_NON_VOLATILE, access, nil, &h, &d) + if err != nil { + return 0, false, err + } + return Key(h), d == _REG_OPENED_EXISTING_KEY, nil +} + +// DeleteKey deletes the subkey path of key k and its values. +func DeleteKey(k Key, path string) error { + return regDeleteKey(syscall.Handle(k), syscall.StringToUTF16Ptr(path)) +} + +// A KeyInfo describes the statistics of a key. It is returned by Stat. +type KeyInfo struct { + SubKeyCount uint32 + MaxSubKeyLen uint32 // size of the key's subkey with the longest name, in Unicode characters, not including the terminating zero byte + ValueCount uint32 + MaxValueNameLen uint32 // size of the key's longest value name, in Unicode characters, not including the terminating zero byte + MaxValueLen uint32 // longest data component among the key's values, in bytes + lastWriteTime syscall.Filetime +} + +// ModTime returns the key's last write time. +func (ki *KeyInfo) ModTime() time.Time { + return time.Unix(0, ki.lastWriteTime.Nanoseconds()) +} + +// Stat retrieves information about the open key k. +func (k Key) Stat() (*KeyInfo, error) { + var ki KeyInfo + err := syscall.RegQueryInfoKey(syscall.Handle(k), nil, nil, nil, + &ki.SubKeyCount, &ki.MaxSubKeyLen, nil, &ki.ValueCount, + &ki.MaxValueNameLen, &ki.MaxValueLen, nil, &ki.lastWriteTime) + if err != nil { + return nil, err + } + return &ki, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/registry/mksyscall.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/registry/mksyscall.go new file mode 100644 index 0000000..0ac95ff --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/registry/mksyscall.go @@ -0,0 +1,7 @@ +// Copyright 2015 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 registry + +//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go syscall.go diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/registry/registry_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/registry/registry_test.go new file mode 100644 index 0000000..3cb9771 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/registry/registry_test.go @@ -0,0 +1,756 @@ +// Copyright 2015 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 windows + +package registry_test + +import ( + "bytes" + "crypto/rand" + "os" + "syscall" + "testing" + "time" + "unsafe" + + "golang.org/x/sys/windows/registry" +) + +func randKeyName(prefix string) string { + const numbers = "0123456789" + buf := make([]byte, 10) + rand.Read(buf) + for i, b := range buf { + buf[i] = numbers[b%byte(len(numbers))] + } + return prefix + string(buf) +} + +func TestReadSubKeyNames(t *testing.T) { + k, err := registry.OpenKey(registry.CLASSES_ROOT, "TypeLib", registry.ENUMERATE_SUB_KEYS|registry.QUERY_VALUE) + if err != nil { + t.Fatal(err) + } + defer k.Close() + + names, err := k.ReadSubKeyNames(-1) + if err != nil { + t.Fatal(err) + } + var foundStdOle bool + for _, name := range names { + // Every PC has "stdole 2.0 OLE Automation" library installed. + if name == "{00020430-0000-0000-C000-000000000046}" { + foundStdOle = true + } + } + if !foundStdOle { + t.Fatal("could not find stdole 2.0 OLE Automation") + } +} + +func TestCreateOpenDeleteKey(t *testing.T) { + k, err := registry.OpenKey(registry.CURRENT_USER, "Software", registry.QUERY_VALUE) + if err != nil { + t.Fatal(err) + } + defer k.Close() + + testKName := randKeyName("TestCreateOpenDeleteKey_") + + testK, exist, err := registry.CreateKey(k, testKName, registry.CREATE_SUB_KEY) + if err != nil { + t.Fatal(err) + } + defer testK.Close() + + if exist { + t.Fatalf("key %q already exists", testKName) + } + + testKAgain, exist, err := registry.CreateKey(k, testKName, registry.CREATE_SUB_KEY) + if err != nil { + t.Fatal(err) + } + defer testKAgain.Close() + + if !exist { + t.Fatalf("key %q should already exist", testKName) + } + + testKOpened, err := registry.OpenKey(k, testKName, registry.ENUMERATE_SUB_KEYS) + if err != nil { + t.Fatal(err) + } + defer testKOpened.Close() + + err = registry.DeleteKey(k, testKName) + if err != nil { + t.Fatal(err) + } + + testKOpenedAgain, err := registry.OpenKey(k, testKName, registry.ENUMERATE_SUB_KEYS) + if err == nil { + defer testKOpenedAgain.Close() + t.Fatalf("key %q should already been deleted", testKName) + } + if err != registry.ErrNotExist { + t.Fatalf(`unexpected error ("not exist" expected): %v`, err) + } +} + +func equalStringSlice(a, b []string) bool { + if len(a) != len(b) { + return false + } + if a == nil { + return true + } + for i := range a { + if a[i] != b[i] { + return false + } + } + return true +} + +type ValueTest struct { + Type uint32 + Name string + Value interface{} + WillFail bool +} + +var ValueTests = []ValueTest{ + {Type: registry.SZ, Name: "String1", Value: ""}, + {Type: registry.SZ, Name: "String2", Value: "\000", WillFail: true}, + {Type: registry.SZ, Name: "String3", Value: "Hello World"}, + {Type: registry.SZ, Name: "String4", Value: "Hello World\000", WillFail: true}, + {Type: registry.EXPAND_SZ, Name: "ExpString1", Value: ""}, + {Type: registry.EXPAND_SZ, Name: "ExpString2", Value: "\000", WillFail: true}, + {Type: registry.EXPAND_SZ, Name: "ExpString3", Value: "Hello World"}, + {Type: registry.EXPAND_SZ, Name: "ExpString4", Value: "Hello\000World", WillFail: true}, + {Type: registry.EXPAND_SZ, Name: "ExpString5", Value: "%PATH%"}, + {Type: registry.EXPAND_SZ, Name: "ExpString6", Value: "%NO_SUCH_VARIABLE%"}, + {Type: registry.EXPAND_SZ, Name: "ExpString7", Value: "%PATH%;."}, + {Type: registry.BINARY, Name: "Binary1", Value: []byte{}}, + {Type: registry.BINARY, Name: "Binary2", Value: []byte{1, 2, 3}}, + {Type: registry.BINARY, Name: "Binary3", Value: []byte{3, 2, 1, 0, 1, 2, 3}}, + {Type: registry.DWORD, Name: "Dword1", Value: uint64(0)}, + {Type: registry.DWORD, Name: "Dword2", Value: uint64(1)}, + {Type: registry.DWORD, Name: "Dword3", Value: uint64(0xff)}, + {Type: registry.DWORD, Name: "Dword4", Value: uint64(0xffff)}, + {Type: registry.QWORD, Name: "Qword1", Value: uint64(0)}, + {Type: registry.QWORD, Name: "Qword2", Value: uint64(1)}, + {Type: registry.QWORD, Name: "Qword3", Value: uint64(0xff)}, + {Type: registry.QWORD, Name: "Qword4", Value: uint64(0xffff)}, + {Type: registry.QWORD, Name: "Qword5", Value: uint64(0xffffff)}, + {Type: registry.QWORD, Name: "Qword6", Value: uint64(0xffffffff)}, + {Type: registry.MULTI_SZ, Name: "MultiString1", Value: []string{"a", "b", "c"}}, + {Type: registry.MULTI_SZ, Name: "MultiString2", Value: []string{"abc", "", "cba"}}, + {Type: registry.MULTI_SZ, Name: "MultiString3", Value: []string{""}}, + {Type: registry.MULTI_SZ, Name: "MultiString4", Value: []string{"abcdef"}}, + {Type: registry.MULTI_SZ, Name: "MultiString5", Value: []string{"\000"}, WillFail: true}, + {Type: registry.MULTI_SZ, Name: "MultiString6", Value: []string{"a\000b"}, WillFail: true}, + {Type: registry.MULTI_SZ, Name: "MultiString7", Value: []string{"ab", "\000", "cd"}, WillFail: true}, + {Type: registry.MULTI_SZ, Name: "MultiString8", Value: []string{"\000", "cd"}, WillFail: true}, + {Type: registry.MULTI_SZ, Name: "MultiString9", Value: []string{"ab", "\000"}, WillFail: true}, +} + +func setValues(t *testing.T, k registry.Key) { + for _, test := range ValueTests { + var err error + switch test.Type { + case registry.SZ: + err = k.SetStringValue(test.Name, test.Value.(string)) + case registry.EXPAND_SZ: + err = k.SetExpandStringValue(test.Name, test.Value.(string)) + case registry.MULTI_SZ: + err = k.SetStringsValue(test.Name, test.Value.([]string)) + case registry.BINARY: + err = k.SetBinaryValue(test.Name, test.Value.([]byte)) + case registry.DWORD: + err = k.SetDWordValue(test.Name, uint32(test.Value.(uint64))) + case registry.QWORD: + err = k.SetQWordValue(test.Name, test.Value.(uint64)) + default: + t.Fatalf("unsupported type %d for %s value", test.Type, test.Name) + } + if test.WillFail { + if err == nil { + t.Fatalf("setting %s value %q should fail, but succeeded", test.Name, test.Value) + } + } else { + if err != nil { + t.Fatal(err) + } + } + } +} + +func enumerateValues(t *testing.T, k registry.Key) { + names, err := k.ReadValueNames(-1) + if err != nil { + t.Error(err) + return + } + haveNames := make(map[string]bool) + for _, n := range names { + haveNames[n] = false + } + for _, test := range ValueTests { + wantFound := !test.WillFail + _, haveFound := haveNames[test.Name] + if wantFound && !haveFound { + t.Errorf("value %s is not found while enumerating", test.Name) + } + if haveFound && !wantFound { + t.Errorf("value %s is found while enumerating, but expected to fail", test.Name) + } + if haveFound { + delete(haveNames, test.Name) + } + } + for n, v := range haveNames { + t.Errorf("value %s (%v) is found while enumerating, but has not been cretaed", n, v) + } +} + +func testErrNotExist(t *testing.T, name string, err error) { + if err == nil { + t.Errorf("%s value should not exist", name) + return + } + if err != registry.ErrNotExist { + t.Errorf("reading %s value should return 'not exist' error, but got: %s", name, err) + return + } +} + +func testErrUnexpectedType(t *testing.T, test ValueTest, gottype uint32, err error) { + if err == nil { + t.Errorf("GetXValue(%q) should not succeed", test.Name) + return + } + if err != registry.ErrUnexpectedType { + t.Errorf("reading %s value should return 'unexpected key value type' error, but got: %s", test.Name, err) + return + } + if gottype != test.Type { + t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype) + return + } +} + +func testGetStringValue(t *testing.T, k registry.Key, test ValueTest) { + got, gottype, err := k.GetStringValue(test.Name) + if err != nil { + t.Errorf("GetStringValue(%s) failed: %v", test.Name, err) + return + } + if got != test.Value { + t.Errorf("want %s value %q, got %q", test.Name, test.Value, got) + return + } + if gottype != test.Type { + t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype) + return + } + if gottype == registry.EXPAND_SZ { + _, err = registry.ExpandString(got) + if err != nil { + t.Errorf("ExpandString(%s) failed: %v", got, err) + return + } + } +} + +func testGetIntegerValue(t *testing.T, k registry.Key, test ValueTest) { + got, gottype, err := k.GetIntegerValue(test.Name) + if err != nil { + t.Errorf("GetIntegerValue(%s) failed: %v", test.Name, err) + return + } + if got != test.Value.(uint64) { + t.Errorf("want %s value %v, got %v", test.Name, test.Value, got) + return + } + if gottype != test.Type { + t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype) + return + } +} + +func testGetBinaryValue(t *testing.T, k registry.Key, test ValueTest) { + got, gottype, err := k.GetBinaryValue(test.Name) + if err != nil { + t.Errorf("GetBinaryValue(%s) failed: %v", test.Name, err) + return + } + if !bytes.Equal(got, test.Value.([]byte)) { + t.Errorf("want %s value %v, got %v", test.Name, test.Value, got) + return + } + if gottype != test.Type { + t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype) + return + } +} + +func testGetStringsValue(t *testing.T, k registry.Key, test ValueTest) { + got, gottype, err := k.GetStringsValue(test.Name) + if err != nil { + t.Errorf("GetStringsValue(%s) failed: %v", test.Name, err) + return + } + if !equalStringSlice(got, test.Value.([]string)) { + t.Errorf("want %s value %#v, got %#v", test.Name, test.Value, got) + return + } + if gottype != test.Type { + t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype) + return + } +} + +func testGetValue(t *testing.T, k registry.Key, test ValueTest, size int) { + if size <= 0 { + return + } + // read data with no buffer + gotsize, gottype, err := k.GetValue(test.Name, nil) + if err != nil { + t.Errorf("GetValue(%s, [%d]byte) failed: %v", test.Name, size, err) + return + } + if gotsize != size { + t.Errorf("want %s value size of %d, got %v", test.Name, size, gotsize) + return + } + if gottype != test.Type { + t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype) + return + } + // read data with short buffer + gotsize, gottype, err = k.GetValue(test.Name, make([]byte, size-1)) + if err == nil { + t.Errorf("GetValue(%s, [%d]byte) should fail, but succeeded", test.Name, size-1) + return + } + if err != registry.ErrShortBuffer { + t.Errorf("reading %s value should return 'short buffer' error, but got: %s", test.Name, err) + return + } + if gotsize != size { + t.Errorf("want %s value size of %d, got %v", test.Name, size, gotsize) + return + } + if gottype != test.Type { + t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype) + return + } + // read full data + gotsize, gottype, err = k.GetValue(test.Name, make([]byte, size)) + if err != nil { + t.Errorf("GetValue(%s, [%d]byte) failed: %v", test.Name, size, err) + return + } + if gotsize != size { + t.Errorf("want %s value size of %d, got %v", test.Name, size, gotsize) + return + } + if gottype != test.Type { + t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype) + return + } + // check GetValue returns ErrNotExist as required + _, _, err = k.GetValue(test.Name+"_not_there", make([]byte, size)) + if err == nil { + t.Errorf("GetValue(%q) should not succeed", test.Name) + return + } + if err != registry.ErrNotExist { + t.Errorf("GetValue(%q) should return 'not exist' error, but got: %s", test.Name, err) + return + } +} + +func testValues(t *testing.T, k registry.Key) { + for _, test := range ValueTests { + switch test.Type { + case registry.SZ, registry.EXPAND_SZ: + if test.WillFail { + _, _, err := k.GetStringValue(test.Name) + testErrNotExist(t, test.Name, err) + } else { + testGetStringValue(t, k, test) + _, gottype, err := k.GetIntegerValue(test.Name) + testErrUnexpectedType(t, test, gottype, err) + // Size of utf16 string in bytes is not perfect, + // but correct for current test values. + // Size also includes terminating 0. + testGetValue(t, k, test, (len(test.Value.(string))+1)*2) + } + _, _, err := k.GetStringValue(test.Name + "_string_not_created") + testErrNotExist(t, test.Name+"_string_not_created", err) + case registry.DWORD, registry.QWORD: + testGetIntegerValue(t, k, test) + _, gottype, err := k.GetBinaryValue(test.Name) + testErrUnexpectedType(t, test, gottype, err) + _, _, err = k.GetIntegerValue(test.Name + "_int_not_created") + testErrNotExist(t, test.Name+"_int_not_created", err) + size := 8 + if test.Type == registry.DWORD { + size = 4 + } + testGetValue(t, k, test, size) + case registry.BINARY: + testGetBinaryValue(t, k, test) + _, gottype, err := k.GetStringsValue(test.Name) + testErrUnexpectedType(t, test, gottype, err) + _, _, err = k.GetBinaryValue(test.Name + "_byte_not_created") + testErrNotExist(t, test.Name+"_byte_not_created", err) + testGetValue(t, k, test, len(test.Value.([]byte))) + case registry.MULTI_SZ: + if test.WillFail { + _, _, err := k.GetStringsValue(test.Name) + testErrNotExist(t, test.Name, err) + } else { + testGetStringsValue(t, k, test) + _, gottype, err := k.GetStringValue(test.Name) + testErrUnexpectedType(t, test, gottype, err) + size := 0 + for _, s := range test.Value.([]string) { + size += len(s) + 1 // nil terminated + } + size += 1 // extra nil at the end + size *= 2 // count bytes, not uint16 + testGetValue(t, k, test, size) + } + _, _, err := k.GetStringsValue(test.Name + "_strings_not_created") + testErrNotExist(t, test.Name+"_strings_not_created", err) + default: + t.Errorf("unsupported type %d for %s value", test.Type, test.Name) + continue + } + } +} + +func testStat(t *testing.T, k registry.Key) { + subk, _, err := registry.CreateKey(k, "subkey", registry.CREATE_SUB_KEY) + if err != nil { + t.Error(err) + return + } + defer subk.Close() + + defer registry.DeleteKey(k, "subkey") + + ki, err := k.Stat() + if err != nil { + t.Error(err) + return + } + if ki.SubKeyCount != 1 { + t.Error("key must have 1 subkey") + } + if ki.MaxSubKeyLen != 6 { + t.Error("key max subkey name length must be 6") + } + if ki.ValueCount != 24 { + t.Errorf("key must have 24 values, but is %d", ki.ValueCount) + } + if ki.MaxValueNameLen != 12 { + t.Errorf("key max value name length must be 10, but is %d", ki.MaxValueNameLen) + } + if ki.MaxValueLen != 38 { + t.Errorf("key max value length must be 38, but is %d", ki.MaxValueLen) + } + if mt, ct := ki.ModTime(), time.Now(); ct.Sub(mt) > 100*time.Millisecond { + t.Errorf("key mod time is not close to current time: mtime=%v current=%v delta=%v", mt, ct, ct.Sub(mt)) + } +} + +func deleteValues(t *testing.T, k registry.Key) { + for _, test := range ValueTests { + if test.WillFail { + continue + } + err := k.DeleteValue(test.Name) + if err != nil { + t.Error(err) + continue + } + } + names, err := k.ReadValueNames(-1) + if err != nil { + t.Error(err) + return + } + if len(names) != 0 { + t.Errorf("some values remain after deletion: %v", names) + } +} + +func TestValues(t *testing.T) { + softwareK, err := registry.OpenKey(registry.CURRENT_USER, "Software", registry.QUERY_VALUE) + if err != nil { + t.Fatal(err) + } + defer softwareK.Close() + + testKName := randKeyName("TestValues_") + + k, exist, err := registry.CreateKey(softwareK, testKName, registry.CREATE_SUB_KEY|registry.QUERY_VALUE|registry.SET_VALUE) + if err != nil { + t.Fatal(err) + } + defer k.Close() + + if exist { + t.Fatalf("key %q already exists", testKName) + } + + defer registry.DeleteKey(softwareK, testKName) + + setValues(t, k) + + enumerateValues(t, k) + + testValues(t, k) + + testStat(t, k) + + deleteValues(t, k) +} + +func walkKey(t *testing.T, k registry.Key, kname string) { + names, err := k.ReadValueNames(-1) + if err != nil { + t.Fatalf("reading value names of %s failed: %v", kname, err) + } + for _, name := range names { + _, valtype, err := k.GetValue(name, nil) + if err != nil { + t.Fatalf("reading value type of %s of %s failed: %v", name, kname, err) + } + switch valtype { + case registry.NONE: + case registry.SZ: + _, _, err := k.GetStringValue(name) + if err != nil { + t.Error(err) + } + case registry.EXPAND_SZ: + s, _, err := k.GetStringValue(name) + if err != nil { + t.Error(err) + } + _, err = registry.ExpandString(s) + if err != nil { + t.Error(err) + } + case registry.DWORD, registry.QWORD: + _, _, err := k.GetIntegerValue(name) + if err != nil { + t.Error(err) + } + case registry.BINARY: + _, _, err := k.GetBinaryValue(name) + if err != nil { + t.Error(err) + } + case registry.MULTI_SZ: + _, _, err := k.GetStringsValue(name) + if err != nil { + t.Error(err) + } + case registry.FULL_RESOURCE_DESCRIPTOR, registry.RESOURCE_LIST, registry.RESOURCE_REQUIREMENTS_LIST: + // TODO: not implemented + default: + t.Fatalf("value type %d of %s of %s failed: %v", valtype, name, kname, err) + } + } + + names, err = k.ReadSubKeyNames(-1) + if err != nil { + t.Fatalf("reading sub-keys of %s failed: %v", kname, err) + } + for _, name := range names { + func() { + subk, err := registry.OpenKey(k, name, registry.ENUMERATE_SUB_KEYS|registry.QUERY_VALUE) + if err != nil { + if err == syscall.ERROR_ACCESS_DENIED { + // ignore error, if we are not allowed to access this key + return + } + t.Fatalf("opening sub-keys %s of %s failed: %v", name, kname, err) + } + defer subk.Close() + + walkKey(t, subk, kname+`\`+name) + }() + } +} + +func TestWalkFullRegistry(t *testing.T) { + if testing.Short() { + t.Skip("skipping long running test in short mode") + } + walkKey(t, registry.CLASSES_ROOT, "CLASSES_ROOT") + walkKey(t, registry.CURRENT_USER, "CURRENT_USER") + walkKey(t, registry.LOCAL_MACHINE, "LOCAL_MACHINE") + walkKey(t, registry.USERS, "USERS") + walkKey(t, registry.CURRENT_CONFIG, "CURRENT_CONFIG") +} + +func TestExpandString(t *testing.T) { + got, err := registry.ExpandString("%PATH%") + if err != nil { + t.Fatal(err) + } + want := os.Getenv("PATH") + if got != want { + t.Errorf("want %q string expanded, got %q", want, got) + } +} + +func TestInvalidValues(t *testing.T) { + softwareK, err := registry.OpenKey(registry.CURRENT_USER, "Software", registry.QUERY_VALUE) + if err != nil { + t.Fatal(err) + } + defer softwareK.Close() + + testKName := randKeyName("TestInvalidValues_") + + k, exist, err := registry.CreateKey(softwareK, testKName, registry.CREATE_SUB_KEY|registry.QUERY_VALUE|registry.SET_VALUE) + if err != nil { + t.Fatal(err) + } + defer k.Close() + + if exist { + t.Fatalf("key %q already exists", testKName) + } + + defer registry.DeleteKey(softwareK, testKName) + + var tests = []struct { + Type uint32 + Name string + Data []byte + }{ + {registry.DWORD, "Dword1", nil}, + {registry.DWORD, "Dword2", []byte{1, 2, 3}}, + {registry.QWORD, "Qword1", nil}, + {registry.QWORD, "Qword2", []byte{1, 2, 3}}, + {registry.QWORD, "Qword3", []byte{1, 2, 3, 4, 5, 6, 7}}, + {registry.MULTI_SZ, "MultiString1", nil}, + {registry.MULTI_SZ, "MultiString2", []byte{0}}, + {registry.MULTI_SZ, "MultiString3", []byte{'a', 'b', 0}}, + {registry.MULTI_SZ, "MultiString4", []byte{'a', 0, 0, 'b', 0}}, + {registry.MULTI_SZ, "MultiString5", []byte{'a', 0, 0}}, + } + + for _, test := range tests { + err := k.SetValue(test.Name, test.Type, test.Data) + if err != nil { + t.Fatalf("SetValue for %q failed: %v", test.Name, err) + } + } + + for _, test := range tests { + switch test.Type { + case registry.DWORD, registry.QWORD: + value, valType, err := k.GetIntegerValue(test.Name) + if err == nil { + t.Errorf("GetIntegerValue(%q) succeeded. Returns type=%d value=%v", test.Name, valType, value) + } + case registry.MULTI_SZ: + value, valType, err := k.GetStringsValue(test.Name) + if err == nil { + if len(value) != 0 { + t.Errorf("GetStringsValue(%q) succeeded. Returns type=%d value=%v", test.Name, valType, value) + } + } + default: + t.Errorf("unsupported type %d for %s value", test.Type, test.Name) + } + } +} + +func TestGetMUIStringValue(t *testing.T) { + if err := registry.LoadRegLoadMUIString(); err != nil { + t.Skip("regLoadMUIString not supported; skipping") + } + if err := procGetDynamicTimeZoneInformation.Find(); err != nil { + t.Skipf("%s not supported; skipping", procGetDynamicTimeZoneInformation.Name) + } + var dtzi DynamicTimezoneinformation + if _, err := GetDynamicTimeZoneInformation(&dtzi); err != nil { + t.Fatal(err) + } + tzKeyName := syscall.UTF16ToString(dtzi.TimeZoneKeyName[:]) + timezoneK, err := registry.OpenKey(registry.LOCAL_MACHINE, + `SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\`+tzKeyName, registry.READ) + if err != nil { + t.Fatal(err) + } + defer timezoneK.Close() + + type testType struct { + name string + want string + } + var tests = []testType{ + {"MUI_Std", syscall.UTF16ToString(dtzi.StandardName[:])}, + } + if dtzi.DynamicDaylightTimeDisabled == 0 { + tests = append(tests, testType{"MUI_Dlt", syscall.UTF16ToString(dtzi.DaylightName[:])}) + } + + for _, test := range tests { + got, err := timezoneK.GetMUIStringValue(test.name) + if err != nil { + t.Error("GetMUIStringValue:", err) + } + + if got != test.want { + t.Errorf("GetMUIStringValue: %s: Got %q, want %q", test.name, got, test.want) + } + } +} + +type DynamicTimezoneinformation struct { + Bias int32 + StandardName [32]uint16 + StandardDate syscall.Systemtime + StandardBias int32 + DaylightName [32]uint16 + DaylightDate syscall.Systemtime + DaylightBias int32 + TimeZoneKeyName [128]uint16 + DynamicDaylightTimeDisabled uint8 +} + +var ( + kernel32DLL = syscall.NewLazyDLL("kernel32") + + procGetDynamicTimeZoneInformation = kernel32DLL.NewProc("GetDynamicTimeZoneInformation") +) + +func GetDynamicTimeZoneInformation(dtzi *DynamicTimezoneinformation) (rc uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetDynamicTimeZoneInformation.Addr(), 1, uintptr(unsafe.Pointer(dtzi)), 0, 0) + rc = uint32(r0) + if rc == 0xffffffff { + if e1 != 0 { + err = error(e1) + } else { + err = syscall.EINVAL + } + } + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/registry/syscall.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/registry/syscall.go new file mode 100644 index 0000000..e66643c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/registry/syscall.go @@ -0,0 +1,32 @@ +// Copyright 2015 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 windows + +package registry + +import "syscall" + +const ( + _REG_OPTION_NON_VOLATILE = 0 + + _REG_CREATED_NEW_KEY = 1 + _REG_OPENED_EXISTING_KEY = 2 + + _ERROR_NO_MORE_ITEMS syscall.Errno = 259 +) + +func LoadRegLoadMUIString() error { + return procRegLoadMUIStringW.Find() +} + +//sys regCreateKeyEx(key syscall.Handle, subkey *uint16, reserved uint32, class *uint16, options uint32, desired uint32, sa *syscall.SecurityAttributes, result *syscall.Handle, disposition *uint32) (regerrno error) = advapi32.RegCreateKeyExW +//sys regDeleteKey(key syscall.Handle, subkey *uint16) (regerrno error) = advapi32.RegDeleteKeyW +//sys regSetValueEx(key syscall.Handle, valueName *uint16, reserved uint32, vtype uint32, buf *byte, bufsize uint32) (regerrno error) = advapi32.RegSetValueExW +//sys regEnumValue(key syscall.Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) = advapi32.RegEnumValueW +//sys regDeleteValue(key syscall.Handle, name *uint16) (regerrno error) = advapi32.RegDeleteValueW +//sys regLoadMUIString(key syscall.Handle, name *uint16, buf *uint16, buflen uint32, buflenCopied *uint32, flags uint32, dir *uint16) (regerrno error) = advapi32.RegLoadMUIStringW +//sys regConnectRegistry(machinename *uint16, key syscall.Handle, result *syscall.Handle) (regerrno error) = advapi32.RegConnectRegistryW + +//sys expandEnvironmentStrings(src *uint16, dst *uint16, size uint32) (n uint32, err error) = kernel32.ExpandEnvironmentStringsW diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/registry/value.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/registry/value.go new file mode 100644 index 0000000..71d4e15 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/registry/value.go @@ -0,0 +1,384 @@ +// Copyright 2015 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 windows + +package registry + +import ( + "errors" + "io" + "syscall" + "unicode/utf16" + "unsafe" +) + +const ( + // Registry value types. + NONE = 0 + SZ = 1 + EXPAND_SZ = 2 + BINARY = 3 + DWORD = 4 + DWORD_BIG_ENDIAN = 5 + LINK = 6 + MULTI_SZ = 7 + RESOURCE_LIST = 8 + FULL_RESOURCE_DESCRIPTOR = 9 + RESOURCE_REQUIREMENTS_LIST = 10 + QWORD = 11 +) + +var ( + // ErrShortBuffer is returned when the buffer was too short for the operation. + ErrShortBuffer = syscall.ERROR_MORE_DATA + + // ErrNotExist is returned when a registry key or value does not exist. + ErrNotExist = syscall.ERROR_FILE_NOT_FOUND + + // ErrUnexpectedType is returned by Get*Value when the value's type was unexpected. + ErrUnexpectedType = errors.New("unexpected key value type") +) + +// GetValue retrieves the type and data for the specified value associated +// with an open key k. It fills up buffer buf and returns the retrieved +// byte count n. If buf is too small to fit the stored value it returns +// ErrShortBuffer error along with the required buffer size n. +// If no buffer is provided, it returns true and actual buffer size n. +// If no buffer is provided, GetValue returns the value's type only. +// If the value does not exist, the error returned is ErrNotExist. +// +// GetValue is a low level function. If value's type is known, use the appropriate +// Get*Value function instead. +func (k Key) GetValue(name string, buf []byte) (n int, valtype uint32, err error) { + pname, err := syscall.UTF16PtrFromString(name) + if err != nil { + return 0, 0, err + } + var pbuf *byte + if len(buf) > 0 { + pbuf = (*byte)(unsafe.Pointer(&buf[0])) + } + l := uint32(len(buf)) + err = syscall.RegQueryValueEx(syscall.Handle(k), pname, nil, &valtype, pbuf, &l) + if err != nil { + return int(l), valtype, err + } + return int(l), valtype, nil +} + +func (k Key) getValue(name string, buf []byte) (date []byte, valtype uint32, err error) { + p, err := syscall.UTF16PtrFromString(name) + if err != nil { + return nil, 0, err + } + var t uint32 + n := uint32(len(buf)) + for { + err = syscall.RegQueryValueEx(syscall.Handle(k), p, nil, &t, (*byte)(unsafe.Pointer(&buf[0])), &n) + if err == nil { + return buf[:n], t, nil + } + if err != syscall.ERROR_MORE_DATA { + return nil, 0, err + } + if n <= uint32(len(buf)) { + return nil, 0, err + } + buf = make([]byte, n) + } +} + +// GetStringValue retrieves the string value for the specified +// value name associated with an open key k. It also returns the value's type. +// If value does not exist, GetStringValue returns ErrNotExist. +// If value is not SZ or EXPAND_SZ, it will return the correct value +// type and ErrUnexpectedType. +func (k Key) GetStringValue(name string) (val string, valtype uint32, err error) { + data, typ, err2 := k.getValue(name, make([]byte, 64)) + if err2 != nil { + return "", typ, err2 + } + switch typ { + case SZ, EXPAND_SZ: + default: + return "", typ, ErrUnexpectedType + } + if len(data) == 0 { + return "", typ, nil + } + u := (*[1 << 29]uint16)(unsafe.Pointer(&data[0]))[:] + return syscall.UTF16ToString(u), typ, nil +} + +// GetMUIStringValue retrieves the localized string value for +// the specified value name associated with an open key k. +// If the value name doesn't exist or the localized string value +// can't be resolved, GetMUIStringValue returns ErrNotExist. +// GetMUIStringValue panics if the system doesn't support +// regLoadMUIString; use LoadRegLoadMUIString to check if +// regLoadMUIString is supported before calling this function. +func (k Key) GetMUIStringValue(name string) (string, error) { + pname, err := syscall.UTF16PtrFromString(name) + if err != nil { + return "", err + } + + buf := make([]uint16, 1024) + var buflen uint32 + var pdir *uint16 + + err = regLoadMUIString(syscall.Handle(k), pname, &buf[0], uint32(len(buf)), &buflen, 0, pdir) + if err == syscall.ERROR_FILE_NOT_FOUND { // Try fallback path + + // Try to resolve the string value using the system directory as + // a DLL search path; this assumes the string value is of the form + // @[path]\dllname,-strID but with no path given, e.g. @tzres.dll,-320. + + // This approach works with tzres.dll but may have to be revised + // in the future to allow callers to provide custom search paths. + + var s string + s, err = ExpandString("%SystemRoot%\\system32\\") + if err != nil { + return "", err + } + pdir, err = syscall.UTF16PtrFromString(s) + if err != nil { + return "", err + } + + err = regLoadMUIString(syscall.Handle(k), pname, &buf[0], uint32(len(buf)), &buflen, 0, pdir) + } + + for err == syscall.ERROR_MORE_DATA { // Grow buffer if needed + if buflen <= uint32(len(buf)) { + break // Buffer not growing, assume race; break + } + buf = make([]uint16, buflen) + err = regLoadMUIString(syscall.Handle(k), pname, &buf[0], uint32(len(buf)), &buflen, 0, pdir) + } + + if err != nil { + return "", err + } + + return syscall.UTF16ToString(buf), nil +} + +// ExpandString expands environment-variable strings and replaces +// them with the values defined for the current user. +// Use ExpandString to expand EXPAND_SZ strings. +func ExpandString(value string) (string, error) { + if value == "" { + return "", nil + } + p, err := syscall.UTF16PtrFromString(value) + if err != nil { + return "", err + } + r := make([]uint16, 100) + for { + n, err := expandEnvironmentStrings(p, &r[0], uint32(len(r))) + if err != nil { + return "", err + } + if n <= uint32(len(r)) { + u := (*[1 << 29]uint16)(unsafe.Pointer(&r[0]))[:] + return syscall.UTF16ToString(u), nil + } + r = make([]uint16, n) + } +} + +// GetStringsValue retrieves the []string value for the specified +// value name associated with an open key k. It also returns the value's type. +// If value does not exist, GetStringsValue returns ErrNotExist. +// If value is not MULTI_SZ, it will return the correct value +// type and ErrUnexpectedType. +func (k Key) GetStringsValue(name string) (val []string, valtype uint32, err error) { + data, typ, err2 := k.getValue(name, make([]byte, 64)) + if err2 != nil { + return nil, typ, err2 + } + if typ != MULTI_SZ { + return nil, typ, ErrUnexpectedType + } + if len(data) == 0 { + return nil, typ, nil + } + p := (*[1 << 29]uint16)(unsafe.Pointer(&data[0]))[:len(data)/2] + if len(p) == 0 { + return nil, typ, nil + } + if p[len(p)-1] == 0 { + p = p[:len(p)-1] // remove terminating null + } + val = make([]string, 0, 5) + from := 0 + for i, c := range p { + if c == 0 { + val = append(val, string(utf16.Decode(p[from:i]))) + from = i + 1 + } + } + return val, typ, nil +} + +// GetIntegerValue retrieves the integer value for the specified +// value name associated with an open key k. It also returns the value's type. +// If value does not exist, GetIntegerValue returns ErrNotExist. +// If value is not DWORD or QWORD, it will return the correct value +// type and ErrUnexpectedType. +func (k Key) GetIntegerValue(name string) (val uint64, valtype uint32, err error) { + data, typ, err2 := k.getValue(name, make([]byte, 8)) + if err2 != nil { + return 0, typ, err2 + } + switch typ { + case DWORD: + if len(data) != 4 { + return 0, typ, errors.New("DWORD value is not 4 bytes long") + } + return uint64(*(*uint32)(unsafe.Pointer(&data[0]))), DWORD, nil + case QWORD: + if len(data) != 8 { + return 0, typ, errors.New("QWORD value is not 8 bytes long") + } + return uint64(*(*uint64)(unsafe.Pointer(&data[0]))), QWORD, nil + default: + return 0, typ, ErrUnexpectedType + } +} + +// GetBinaryValue retrieves the binary value for the specified +// value name associated with an open key k. It also returns the value's type. +// If value does not exist, GetBinaryValue returns ErrNotExist. +// If value is not BINARY, it will return the correct value +// type and ErrUnexpectedType. +func (k Key) GetBinaryValue(name string) (val []byte, valtype uint32, err error) { + data, typ, err2 := k.getValue(name, make([]byte, 64)) + if err2 != nil { + return nil, typ, err2 + } + if typ != BINARY { + return nil, typ, ErrUnexpectedType + } + return data, typ, nil +} + +func (k Key) setValue(name string, valtype uint32, data []byte) error { + p, err := syscall.UTF16PtrFromString(name) + if err != nil { + return err + } + if len(data) == 0 { + return regSetValueEx(syscall.Handle(k), p, 0, valtype, nil, 0) + } + return regSetValueEx(syscall.Handle(k), p, 0, valtype, &data[0], uint32(len(data))) +} + +// SetDWordValue sets the data and type of a name value +// under key k to value and DWORD. +func (k Key) SetDWordValue(name string, value uint32) error { + return k.setValue(name, DWORD, (*[4]byte)(unsafe.Pointer(&value))[:]) +} + +// SetQWordValue sets the data and type of a name value +// under key k to value and QWORD. +func (k Key) SetQWordValue(name string, value uint64) error { + return k.setValue(name, QWORD, (*[8]byte)(unsafe.Pointer(&value))[:]) +} + +func (k Key) setStringValue(name string, valtype uint32, value string) error { + v, err := syscall.UTF16FromString(value) + if err != nil { + return err + } + buf := (*[1 << 29]byte)(unsafe.Pointer(&v[0]))[:len(v)*2] + return k.setValue(name, valtype, buf) +} + +// SetStringValue sets the data and type of a name value +// under key k to value and SZ. The value must not contain a zero byte. +func (k Key) SetStringValue(name, value string) error { + return k.setStringValue(name, SZ, value) +} + +// SetExpandStringValue sets the data and type of a name value +// under key k to value and EXPAND_SZ. The value must not contain a zero byte. +func (k Key) SetExpandStringValue(name, value string) error { + return k.setStringValue(name, EXPAND_SZ, value) +} + +// SetStringsValue sets the data and type of a name value +// under key k to value and MULTI_SZ. The value strings +// must not contain a zero byte. +func (k Key) SetStringsValue(name string, value []string) error { + ss := "" + for _, s := range value { + for i := 0; i < len(s); i++ { + if s[i] == 0 { + return errors.New("string cannot have 0 inside") + } + } + ss += s + "\x00" + } + v := utf16.Encode([]rune(ss + "\x00")) + buf := (*[1 << 29]byte)(unsafe.Pointer(&v[0]))[:len(v)*2] + return k.setValue(name, MULTI_SZ, buf) +} + +// SetBinaryValue sets the data and type of a name value +// under key k to value and BINARY. +func (k Key) SetBinaryValue(name string, value []byte) error { + return k.setValue(name, BINARY, value) +} + +// DeleteValue removes a named value from the key k. +func (k Key) DeleteValue(name string) error { + return regDeleteValue(syscall.Handle(k), syscall.StringToUTF16Ptr(name)) +} + +// ReadValueNames returns the value names of key k. +// The parameter n controls the number of returned names, +// analogous to the way os.File.Readdirnames works. +func (k Key) ReadValueNames(n int) ([]string, error) { + ki, err := k.Stat() + if err != nil { + return nil, err + } + names := make([]string, 0, ki.ValueCount) + buf := make([]uint16, ki.MaxValueNameLen+1) // extra room for terminating null character +loopItems: + for i := uint32(0); ; i++ { + if n > 0 { + if len(names) == n { + return names, nil + } + } + l := uint32(len(buf)) + for { + err := regEnumValue(syscall.Handle(k), i, &buf[0], &l, nil, nil, nil, nil) + if err == nil { + break + } + if err == syscall.ERROR_MORE_DATA { + // Double buffer size and try again. + l = uint32(2 * len(buf)) + buf = make([]uint16, l) + continue + } + if err == _ERROR_NO_MORE_ITEMS { + break loopItems + } + return names, err + } + names = append(names, syscall.UTF16ToString(buf[:l])) + } + if n > len(names) { + return names, io.EOF + } + return names, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/registry/zsyscall_windows.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/registry/zsyscall_windows.go new file mode 100644 index 0000000..ceebdd7 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/registry/zsyscall_windows.go @@ -0,0 +1,120 @@ +// MACHINE GENERATED BY 'go generate' COMMAND; DO NOT EDIT + +package registry + +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) +) + +// errnoErr returns common boxed Errno values, to prevent +// allocations at runtime. +func errnoErr(e syscall.Errno) error { + switch e { + case 0: + return nil + 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") + + procRegCreateKeyExW = modadvapi32.NewProc("RegCreateKeyExW") + procRegDeleteKeyW = modadvapi32.NewProc("RegDeleteKeyW") + procRegSetValueExW = modadvapi32.NewProc("RegSetValueExW") + procRegEnumValueW = modadvapi32.NewProc("RegEnumValueW") + procRegDeleteValueW = modadvapi32.NewProc("RegDeleteValueW") + procRegLoadMUIStringW = modadvapi32.NewProc("RegLoadMUIStringW") + procRegConnectRegistryW = modadvapi32.NewProc("RegConnectRegistryW") + procExpandEnvironmentStringsW = modkernel32.NewProc("ExpandEnvironmentStringsW") +) + +func regCreateKeyEx(key syscall.Handle, subkey *uint16, reserved uint32, class *uint16, options uint32, desired uint32, sa *syscall.SecurityAttributes, result *syscall.Handle, disposition *uint32) (regerrno error) { + r0, _, _ := syscall.Syscall9(procRegCreateKeyExW.Addr(), 9, uintptr(key), uintptr(unsafe.Pointer(subkey)), uintptr(reserved), uintptr(unsafe.Pointer(class)), uintptr(options), uintptr(desired), uintptr(unsafe.Pointer(sa)), uintptr(unsafe.Pointer(result)), uintptr(unsafe.Pointer(disposition))) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func regDeleteKey(key syscall.Handle, subkey *uint16) (regerrno error) { + r0, _, _ := syscall.Syscall(procRegDeleteKeyW.Addr(), 2, uintptr(key), uintptr(unsafe.Pointer(subkey)), 0) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func regSetValueEx(key syscall.Handle, valueName *uint16, reserved uint32, vtype uint32, buf *byte, bufsize uint32) (regerrno error) { + r0, _, _ := syscall.Syscall6(procRegSetValueExW.Addr(), 6, uintptr(key), uintptr(unsafe.Pointer(valueName)), uintptr(reserved), uintptr(vtype), uintptr(unsafe.Pointer(buf)), uintptr(bufsize)) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func regEnumValue(key syscall.Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) { + r0, _, _ := syscall.Syscall9(procRegEnumValueW.Addr(), 8, uintptr(key), uintptr(index), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(nameLen)), uintptr(unsafe.Pointer(reserved)), uintptr(unsafe.Pointer(valtype)), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(buflen)), 0) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func regDeleteValue(key syscall.Handle, name *uint16) (regerrno error) { + r0, _, _ := syscall.Syscall(procRegDeleteValueW.Addr(), 2, uintptr(key), uintptr(unsafe.Pointer(name)), 0) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func regLoadMUIString(key syscall.Handle, name *uint16, buf *uint16, buflen uint32, buflenCopied *uint32, flags uint32, dir *uint16) (regerrno error) { + r0, _, _ := syscall.Syscall9(procRegLoadMUIStringW.Addr(), 7, uintptr(key), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(buf)), uintptr(buflen), uintptr(unsafe.Pointer(buflenCopied)), uintptr(flags), uintptr(unsafe.Pointer(dir)), 0, 0) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func regConnectRegistry(machinename *uint16, key syscall.Handle, result *syscall.Handle) (regerrno error) { + r0, _, _ := syscall.Syscall(procRegConnectRegistryW.Addr(), 3, uintptr(unsafe.Pointer(machinename)), uintptr(key), uintptr(unsafe.Pointer(result))) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func expandEnvironmentStrings(src *uint16, dst *uint16, size uint32) (n uint32, err error) { + r0, _, e1 := syscall.Syscall(procExpandEnvironmentStringsW.Addr(), 3, uintptr(unsafe.Pointer(src)), uintptr(unsafe.Pointer(dst)), uintptr(size)) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/security_windows.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/security_windows.go new file mode 100644 index 0000000..ca09bdd --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/security_windows.go @@ -0,0 +1,435 @@ +// 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 windows + +import ( + "syscall" + "unsafe" +) + +const ( + STANDARD_RIGHTS_REQUIRED = 0xf0000 + STANDARD_RIGHTS_READ = 0x20000 + STANDARD_RIGHTS_WRITE = 0x20000 + STANDARD_RIGHTS_EXECUTE = 0x20000 + STANDARD_RIGHTS_ALL = 0x1F0000 +) + +const ( + NameUnknown = 0 + NameFullyQualifiedDN = 1 + NameSamCompatible = 2 + NameDisplay = 3 + NameUniqueId = 6 + NameCanonical = 7 + NameUserPrincipal = 8 + NameCanonicalEx = 9 + NameServicePrincipal = 10 + NameDnsDomain = 12 +) + +// This function returns 1 byte BOOLEAN rather than the 4 byte BOOL. +// http://blogs.msdn.com/b/drnick/archive/2007/12/19/windows-and-upn-format-credentials.aspx +//sys TranslateName(accName *uint16, accNameFormat uint32, desiredNameFormat uint32, translatedName *uint16, nSize *uint32) (err error) [failretval&0xff==0] = secur32.TranslateNameW +//sys GetUserNameEx(nameFormat uint32, nameBuffre *uint16, nSize *uint32) (err error) [failretval&0xff==0] = secur32.GetUserNameExW + +// TranslateAccountName converts a directory service +// object name from one format to another. +func TranslateAccountName(username string, from, to uint32, initSize int) (string, error) { + u, e := UTF16PtrFromString(username) + if e != nil { + return "", e + } + n := uint32(50) + for { + b := make([]uint16, n) + e = TranslateName(u, from, to, &b[0], &n) + if e == nil { + return UTF16ToString(b[:n]), nil + } + if e != ERROR_INSUFFICIENT_BUFFER { + return "", e + } + if n <= uint32(len(b)) { + return "", e + } + } +} + +const ( + // do not reorder + NetSetupUnknownStatus = iota + NetSetupUnjoined + NetSetupWorkgroupName + NetSetupDomainName +) + +type UserInfo10 struct { + Name *uint16 + Comment *uint16 + UsrComment *uint16 + FullName *uint16 +} + +//sys NetUserGetInfo(serverName *uint16, userName *uint16, level uint32, buf **byte) (neterr error) = netapi32.NetUserGetInfo +//sys NetGetJoinInformation(server *uint16, name **uint16, bufType *uint32) (neterr error) = netapi32.NetGetJoinInformation +//sys NetApiBufferFree(buf *byte) (neterr error) = netapi32.NetApiBufferFree + +const ( + // do not reorder + SidTypeUser = 1 + iota + SidTypeGroup + SidTypeDomain + SidTypeAlias + SidTypeWellKnownGroup + SidTypeDeletedAccount + SidTypeInvalid + SidTypeUnknown + SidTypeComputer + SidTypeLabel +) + +type SidIdentifierAuthority struct { + Value [6]byte +} + +var ( + SECURITY_NULL_SID_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 0}} + SECURITY_WORLD_SID_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 1}} + SECURITY_LOCAL_SID_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 2}} + SECURITY_CREATOR_SID_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 3}} + SECURITY_NON_UNIQUE_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 4}} + SECURITY_NT_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 5}} + SECURITY_MANDATORY_LABEL_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 16}} +) + +const ( + SECURITY_NULL_RID = 0 + SECURITY_WORLD_RID = 0 + SECURITY_LOCAL_RID = 0 + SECURITY_CREATOR_OWNER_RID = 0 + SECURITY_CREATOR_GROUP_RID = 1 + SECURITY_DIALUP_RID = 1 + SECURITY_NETWORK_RID = 2 + SECURITY_BATCH_RID = 3 + SECURITY_INTERACTIVE_RID = 4 + SECURITY_LOGON_IDS_RID = 5 + SECURITY_SERVICE_RID = 6 + SECURITY_LOCAL_SYSTEM_RID = 18 + SECURITY_BUILTIN_DOMAIN_RID = 32 + SECURITY_PRINCIPAL_SELF_RID = 10 + SECURITY_CREATOR_OWNER_SERVER_RID = 0x2 + SECURITY_CREATOR_GROUP_SERVER_RID = 0x3 + SECURITY_LOGON_IDS_RID_COUNT = 0x3 + SECURITY_ANONYMOUS_LOGON_RID = 0x7 + SECURITY_PROXY_RID = 0x8 + SECURITY_ENTERPRISE_CONTROLLERS_RID = 0x9 + SECURITY_SERVER_LOGON_RID = SECURITY_ENTERPRISE_CONTROLLERS_RID + SECURITY_AUTHENTICATED_USER_RID = 0xb + SECURITY_RESTRICTED_CODE_RID = 0xc + SECURITY_NT_NON_UNIQUE_RID = 0x15 +) + +//sys LookupAccountSid(systemName *uint16, sid *SID, name *uint16, nameLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *uint32) (err error) = advapi32.LookupAccountSidW +//sys LookupAccountName(systemName *uint16, accountName *uint16, sid *SID, sidLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *uint32) (err error) = advapi32.LookupAccountNameW +//sys ConvertSidToStringSid(sid *SID, stringSid **uint16) (err error) = advapi32.ConvertSidToStringSidW +//sys ConvertStringSidToSid(stringSid *uint16, sid **SID) (err error) = advapi32.ConvertStringSidToSidW +//sys GetLengthSid(sid *SID) (len uint32) = advapi32.GetLengthSid +//sys CopySid(destSidLen uint32, destSid *SID, srcSid *SID) (err error) = advapi32.CopySid +//sys AllocateAndInitializeSid(identAuth *SidIdentifierAuthority, subAuth byte, subAuth0 uint32, subAuth1 uint32, subAuth2 uint32, subAuth3 uint32, subAuth4 uint32, subAuth5 uint32, subAuth6 uint32, subAuth7 uint32, sid **SID) (err error) = advapi32.AllocateAndInitializeSid +//sys FreeSid(sid *SID) (err error) [failretval!=0] = advapi32.FreeSid +//sys EqualSid(sid1 *SID, sid2 *SID) (isEqual bool) = advapi32.EqualSid + +// The security identifier (SID) structure is a variable-length +// structure used to uniquely identify users or groups. +type SID struct{} + +// StringToSid converts a string-format security identifier +// sid into a valid, functional sid. +func StringToSid(s string) (*SID, error) { + var sid *SID + p, e := UTF16PtrFromString(s) + if e != nil { + return nil, e + } + e = ConvertStringSidToSid(p, &sid) + if e != nil { + return nil, e + } + defer LocalFree((Handle)(unsafe.Pointer(sid))) + return sid.Copy() +} + +// LookupSID retrieves a security identifier sid for the account +// and the name of the domain on which the account was found. +// System specify target computer to search. +func LookupSID(system, account string) (sid *SID, domain string, accType uint32, err error) { + if len(account) == 0 { + return nil, "", 0, syscall.EINVAL + } + acc, e := UTF16PtrFromString(account) + if e != nil { + return nil, "", 0, e + } + var sys *uint16 + if len(system) > 0 { + sys, e = UTF16PtrFromString(system) + if e != nil { + return nil, "", 0, e + } + } + n := uint32(50) + dn := uint32(50) + for { + b := make([]byte, n) + db := make([]uint16, dn) + sid = (*SID)(unsafe.Pointer(&b[0])) + e = LookupAccountName(sys, acc, sid, &n, &db[0], &dn, &accType) + if e == nil { + return sid, UTF16ToString(db), accType, nil + } + if e != ERROR_INSUFFICIENT_BUFFER { + return nil, "", 0, e + } + if n <= uint32(len(b)) { + return nil, "", 0, e + } + } +} + +// String converts sid to a string format +// suitable for display, storage, or transmission. +func (sid *SID) String() (string, error) { + var s *uint16 + e := ConvertSidToStringSid(sid, &s) + if e != nil { + return "", e + } + defer LocalFree((Handle)(unsafe.Pointer(s))) + return UTF16ToString((*[256]uint16)(unsafe.Pointer(s))[:]), nil +} + +// Len returns the length, in bytes, of a valid security identifier sid. +func (sid *SID) Len() int { + return int(GetLengthSid(sid)) +} + +// Copy creates a duplicate of security identifier sid. +func (sid *SID) Copy() (*SID, error) { + b := make([]byte, sid.Len()) + sid2 := (*SID)(unsafe.Pointer(&b[0])) + e := CopySid(uint32(len(b)), sid2, sid) + if e != nil { + return nil, e + } + return sid2, nil +} + +// LookupAccount retrieves the name of the account for this sid +// and the name of the first domain on which this sid is found. +// System specify target computer to search for. +func (sid *SID) LookupAccount(system string) (account, domain string, accType uint32, err error) { + var sys *uint16 + if len(system) > 0 { + sys, err = UTF16PtrFromString(system) + if err != nil { + return "", "", 0, err + } + } + n := uint32(50) + dn := uint32(50) + for { + b := make([]uint16, n) + db := make([]uint16, dn) + e := LookupAccountSid(sys, sid, &b[0], &n, &db[0], &dn, &accType) + if e == nil { + return UTF16ToString(b), UTF16ToString(db), accType, nil + } + if e != ERROR_INSUFFICIENT_BUFFER { + return "", "", 0, e + } + if n <= uint32(len(b)) { + return "", "", 0, e + } + } +} + +const ( + // do not reorder + TOKEN_ASSIGN_PRIMARY = 1 << iota + TOKEN_DUPLICATE + TOKEN_IMPERSONATE + TOKEN_QUERY + TOKEN_QUERY_SOURCE + TOKEN_ADJUST_PRIVILEGES + TOKEN_ADJUST_GROUPS + TOKEN_ADJUST_DEFAULT + + TOKEN_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | + TOKEN_ASSIGN_PRIMARY | + TOKEN_DUPLICATE | + TOKEN_IMPERSONATE | + TOKEN_QUERY | + TOKEN_QUERY_SOURCE | + TOKEN_ADJUST_PRIVILEGES | + TOKEN_ADJUST_GROUPS | + TOKEN_ADJUST_DEFAULT + TOKEN_READ = STANDARD_RIGHTS_READ | TOKEN_QUERY + TOKEN_WRITE = STANDARD_RIGHTS_WRITE | + TOKEN_ADJUST_PRIVILEGES | + TOKEN_ADJUST_GROUPS | + TOKEN_ADJUST_DEFAULT + TOKEN_EXECUTE = STANDARD_RIGHTS_EXECUTE +) + +const ( + // do not reorder + TokenUser = 1 + iota + TokenGroups + TokenPrivileges + TokenOwner + TokenPrimaryGroup + TokenDefaultDacl + TokenSource + TokenType + TokenImpersonationLevel + TokenStatistics + TokenRestrictedSids + TokenSessionId + TokenGroupsAndPrivileges + TokenSessionReference + TokenSandBoxInert + TokenAuditPolicy + TokenOrigin + TokenElevationType + TokenLinkedToken + TokenElevation + TokenHasRestrictions + TokenAccessInformation + TokenVirtualizationAllowed + TokenVirtualizationEnabled + TokenIntegrityLevel + TokenUIAccess + TokenMandatoryPolicy + TokenLogonSid + MaxTokenInfoClass +) + +type SIDAndAttributes struct { + Sid *SID + Attributes uint32 +} + +type Tokenuser struct { + User SIDAndAttributes +} + +type Tokenprimarygroup struct { + PrimaryGroup *SID +} + +type Tokengroups struct { + GroupCount uint32 + Groups [1]SIDAndAttributes +} + +//sys OpenProcessToken(h Handle, access uint32, token *Token) (err error) = advapi32.OpenProcessToken +//sys GetTokenInformation(t Token, infoClass uint32, info *byte, infoLen uint32, returnedLen *uint32) (err error) = advapi32.GetTokenInformation +//sys GetUserProfileDirectory(t Token, dir *uint16, dirLen *uint32) (err error) = userenv.GetUserProfileDirectoryW + +// An access token contains the security information for a logon session. +// The system creates an access token when a user logs on, and every +// process executed on behalf of the user has a copy of the token. +// The token identifies the user, the user's groups, and the user's +// privileges. The system uses the token to control access to securable +// objects and to control the ability of the user to perform various +// system-related operations on the local computer. +type Token Handle + +// OpenCurrentProcessToken opens the access token +// associated with current process. +func OpenCurrentProcessToken() (Token, error) { + p, e := GetCurrentProcess() + if e != nil { + return 0, e + } + var t Token + e = OpenProcessToken(p, TOKEN_QUERY, &t) + if e != nil { + return 0, e + } + return t, nil +} + +// Close releases access to access token. +func (t Token) Close() error { + return CloseHandle(Handle(t)) +} + +// getInfo retrieves a specified type of information about an access token. +func (t Token) getInfo(class uint32, initSize int) (unsafe.Pointer, error) { + n := uint32(initSize) + for { + b := make([]byte, n) + e := GetTokenInformation(t, class, &b[0], uint32(len(b)), &n) + if e == nil { + return unsafe.Pointer(&b[0]), nil + } + if e != ERROR_INSUFFICIENT_BUFFER { + return nil, e + } + if n <= uint32(len(b)) { + return nil, e + } + } +} + +// GetTokenUser retrieves access token t user account information. +func (t Token) GetTokenUser() (*Tokenuser, error) { + i, e := t.getInfo(TokenUser, 50) + if e != nil { + return nil, e + } + return (*Tokenuser)(i), nil +} + +// GetTokenGroups retrieves group accounts associated with access token t. +func (t Token) GetTokenGroups() (*Tokengroups, error) { + i, e := t.getInfo(TokenGroups, 50) + if e != nil { + return nil, e + } + return (*Tokengroups)(i), nil +} + +// GetTokenPrimaryGroup retrieves access token t primary group information. +// A pointer to a SID structure representing a group that will become +// the primary group of any objects created by a process using this access token. +func (t Token) GetTokenPrimaryGroup() (*Tokenprimarygroup, error) { + i, e := t.getInfo(TokenPrimaryGroup, 50) + if e != nil { + return nil, e + } + return (*Tokenprimarygroup)(i), nil +} + +// GetUserProfileDirectory retrieves path to the +// root directory of the access token t user's profile. +func (t Token) GetUserProfileDirectory() (string, error) { + n := uint32(100) + for { + b := make([]uint16, n) + e := GetUserProfileDirectory(t, &b[0], &n) + if e == nil { + return UTF16ToString(b), nil + } + if e != ERROR_INSUFFICIENT_BUFFER { + return "", e + } + if n <= uint32(len(b)) { + return "", e + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/service.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/service.go new file mode 100644 index 0000000..a500dd7 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/service.go @@ -0,0 +1,164 @@ +// 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. + +// +build windows + +package windows + +const ( + SC_MANAGER_CONNECT = 1 + SC_MANAGER_CREATE_SERVICE = 2 + SC_MANAGER_ENUMERATE_SERVICE = 4 + SC_MANAGER_LOCK = 8 + SC_MANAGER_QUERY_LOCK_STATUS = 16 + SC_MANAGER_MODIFY_BOOT_CONFIG = 32 + SC_MANAGER_ALL_ACCESS = 0xf003f +) + +//sys OpenSCManager(machineName *uint16, databaseName *uint16, access uint32) (handle Handle, err error) [failretval==0] = advapi32.OpenSCManagerW + +const ( + SERVICE_KERNEL_DRIVER = 1 + SERVICE_FILE_SYSTEM_DRIVER = 2 + SERVICE_ADAPTER = 4 + SERVICE_RECOGNIZER_DRIVER = 8 + SERVICE_WIN32_OWN_PROCESS = 16 + SERVICE_WIN32_SHARE_PROCESS = 32 + SERVICE_WIN32 = SERVICE_WIN32_OWN_PROCESS | SERVICE_WIN32_SHARE_PROCESS + SERVICE_INTERACTIVE_PROCESS = 256 + SERVICE_DRIVER = SERVICE_KERNEL_DRIVER | SERVICE_FILE_SYSTEM_DRIVER | SERVICE_RECOGNIZER_DRIVER + SERVICE_TYPE_ALL = SERVICE_WIN32 | SERVICE_ADAPTER | SERVICE_DRIVER | SERVICE_INTERACTIVE_PROCESS + + SERVICE_BOOT_START = 0 + SERVICE_SYSTEM_START = 1 + SERVICE_AUTO_START = 2 + SERVICE_DEMAND_START = 3 + SERVICE_DISABLED = 4 + + SERVICE_ERROR_IGNORE = 0 + SERVICE_ERROR_NORMAL = 1 + SERVICE_ERROR_SEVERE = 2 + SERVICE_ERROR_CRITICAL = 3 + + SC_STATUS_PROCESS_INFO = 0 + + SERVICE_STOPPED = 1 + SERVICE_START_PENDING = 2 + SERVICE_STOP_PENDING = 3 + SERVICE_RUNNING = 4 + SERVICE_CONTINUE_PENDING = 5 + SERVICE_PAUSE_PENDING = 6 + SERVICE_PAUSED = 7 + SERVICE_NO_CHANGE = 0xffffffff + + SERVICE_ACCEPT_STOP = 1 + SERVICE_ACCEPT_PAUSE_CONTINUE = 2 + SERVICE_ACCEPT_SHUTDOWN = 4 + SERVICE_ACCEPT_PARAMCHANGE = 8 + SERVICE_ACCEPT_NETBINDCHANGE = 16 + SERVICE_ACCEPT_HARDWAREPROFILECHANGE = 32 + SERVICE_ACCEPT_POWEREVENT = 64 + SERVICE_ACCEPT_SESSIONCHANGE = 128 + + SERVICE_CONTROL_STOP = 1 + SERVICE_CONTROL_PAUSE = 2 + SERVICE_CONTROL_CONTINUE = 3 + SERVICE_CONTROL_INTERROGATE = 4 + SERVICE_CONTROL_SHUTDOWN = 5 + SERVICE_CONTROL_PARAMCHANGE = 6 + SERVICE_CONTROL_NETBINDADD = 7 + SERVICE_CONTROL_NETBINDREMOVE = 8 + SERVICE_CONTROL_NETBINDENABLE = 9 + SERVICE_CONTROL_NETBINDDISABLE = 10 + SERVICE_CONTROL_DEVICEEVENT = 11 + SERVICE_CONTROL_HARDWAREPROFILECHANGE = 12 + SERVICE_CONTROL_POWEREVENT = 13 + SERVICE_CONTROL_SESSIONCHANGE = 14 + + SERVICE_ACTIVE = 1 + SERVICE_INACTIVE = 2 + SERVICE_STATE_ALL = 3 + + SERVICE_QUERY_CONFIG = 1 + SERVICE_CHANGE_CONFIG = 2 + SERVICE_QUERY_STATUS = 4 + SERVICE_ENUMERATE_DEPENDENTS = 8 + SERVICE_START = 16 + SERVICE_STOP = 32 + SERVICE_PAUSE_CONTINUE = 64 + SERVICE_INTERROGATE = 128 + SERVICE_USER_DEFINED_CONTROL = 256 + SERVICE_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SERVICE_QUERY_CONFIG | SERVICE_CHANGE_CONFIG | SERVICE_QUERY_STATUS | SERVICE_ENUMERATE_DEPENDENTS | SERVICE_START | SERVICE_STOP | SERVICE_PAUSE_CONTINUE | SERVICE_INTERROGATE | SERVICE_USER_DEFINED_CONTROL + SERVICE_RUNS_IN_SYSTEM_PROCESS = 1 + SERVICE_CONFIG_DESCRIPTION = 1 + SERVICE_CONFIG_FAILURE_ACTIONS = 2 + + NO_ERROR = 0 + + SC_ENUM_PROCESS_INFO = 0 +) + +type SERVICE_STATUS struct { + ServiceType uint32 + CurrentState uint32 + ControlsAccepted uint32 + Win32ExitCode uint32 + ServiceSpecificExitCode uint32 + CheckPoint uint32 + WaitHint uint32 +} + +type SERVICE_TABLE_ENTRY struct { + ServiceName *uint16 + ServiceProc uintptr +} + +type QUERY_SERVICE_CONFIG struct { + ServiceType uint32 + StartType uint32 + ErrorControl uint32 + BinaryPathName *uint16 + LoadOrderGroup *uint16 + TagId uint32 + Dependencies *uint16 + ServiceStartName *uint16 + DisplayName *uint16 +} + +type SERVICE_DESCRIPTION struct { + Description *uint16 +} + +type SERVICE_STATUS_PROCESS struct { + ServiceType uint32 + CurrentState uint32 + ControlsAccepted uint32 + Win32ExitCode uint32 + ServiceSpecificExitCode uint32 + CheckPoint uint32 + WaitHint uint32 + ProcessId uint32 + ServiceFlags uint32 +} + +type ENUM_SERVICE_STATUS_PROCESS struct { + ServiceName *uint16 + DisplayName *uint16 + ServiceStatusProcess SERVICE_STATUS_PROCESS +} + +//sys CloseServiceHandle(handle Handle) (err error) = advapi32.CloseServiceHandle +//sys CreateService(mgr Handle, serviceName *uint16, displayName *uint16, access uint32, srvType uint32, startType uint32, errCtl uint32, pathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16) (handle Handle, err error) [failretval==0] = advapi32.CreateServiceW +//sys OpenService(mgr Handle, serviceName *uint16, access uint32) (handle Handle, err error) [failretval==0] = advapi32.OpenServiceW +//sys DeleteService(service Handle) (err error) = advapi32.DeleteService +//sys StartService(service Handle, numArgs uint32, argVectors **uint16) (err error) = advapi32.StartServiceW +//sys QueryServiceStatus(service Handle, status *SERVICE_STATUS) (err error) = advapi32.QueryServiceStatus +//sys ControlService(service Handle, control uint32, status *SERVICE_STATUS) (err error) = advapi32.ControlService +//sys StartServiceCtrlDispatcher(serviceTable *SERVICE_TABLE_ENTRY) (err error) = advapi32.StartServiceCtrlDispatcherW +//sys SetServiceStatus(service Handle, serviceStatus *SERVICE_STATUS) (err error) = advapi32.SetServiceStatus +//sys ChangeServiceConfig(service Handle, serviceType uint32, startType uint32, errorControl uint32, binaryPathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16, displayName *uint16) (err error) = advapi32.ChangeServiceConfigW +//sys QueryServiceConfig(service Handle, serviceConfig *QUERY_SERVICE_CONFIG, bufSize uint32, bytesNeeded *uint32) (err error) = advapi32.QueryServiceConfigW +//sys ChangeServiceConfig2(service Handle, infoLevel uint32, info *byte) (err error) = advapi32.ChangeServiceConfig2W +//sys QueryServiceConfig2(service Handle, infoLevel uint32, buff *byte, buffSize uint32, bytesNeeded *uint32) (err error) = advapi32.QueryServiceConfig2W +//sys EnumServicesStatusEx(mgr Handle, infoLevel uint32, serviceType uint32, serviceState uint32, services *byte, bufSize uint32, bytesNeeded *uint32, servicesReturned *uint32, resumeHandle *uint32, groupName *uint16) (err error) = advapi32.EnumServicesStatusExW diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/str.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/str.go new file mode 100644 index 0000000..917cc2a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/str.go @@ -0,0 +1,22 @@ +// 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. + +// +build windows + +package windows + +func itoa(val int) string { // do it here rather than with fmt to avoid dependency + if val < 0 { + return "-" + itoa(-val) + } + var buf [32]byte // big enough for int64 + i := len(buf) - 1 + for val >= 10 { + buf[i] = byte(val%10 + '0') + i-- + val /= 10 + } + buf[i] = byte(val + '0') + return string(buf[i:]) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/debug/log.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/debug/log.go new file mode 100644 index 0000000..e51ab42 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/debug/log.go @@ -0,0 +1,56 @@ +// 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. + +// +build windows + +package debug + +import ( + "os" + "strconv" +) + +// Log interface allows different log implementations to be used. +type Log interface { + Close() error + Info(eid uint32, msg string) error + Warning(eid uint32, msg string) error + Error(eid uint32, msg string) error +} + +// ConsoleLog provides access to the console. +type ConsoleLog struct { + Name string +} + +// New creates new ConsoleLog. +func New(source string) *ConsoleLog { + return &ConsoleLog{Name: source} +} + +// Close closes console log l. +func (l *ConsoleLog) Close() error { + return nil +} + +func (l *ConsoleLog) report(kind string, eid uint32, msg string) error { + s := l.Name + "." + kind + "(" + strconv.Itoa(int(eid)) + "): " + msg + "\n" + _, err := os.Stdout.Write([]byte(s)) + return err +} + +// Info writes an information event msg with event id eid to the console l. +func (l *ConsoleLog) Info(eid uint32, msg string) error { + return l.report("info", eid, msg) +} + +// Warning writes an warning event msg with event id eid to the console l. +func (l *ConsoleLog) Warning(eid uint32, msg string) error { + return l.report("warn", eid, msg) +} + +// Error writes an error event msg with event id eid to the console l. +func (l *ConsoleLog) Error(eid uint32, msg string) error { + return l.report("error", eid, msg) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/debug/service.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/debug/service.go new file mode 100644 index 0000000..123df98 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/debug/service.go @@ -0,0 +1,45 @@ +// 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. + +// +build windows + +// Package debug provides facilities to execute svc.Handler on console. +// +package debug + +import ( + "os" + "os/signal" + "syscall" + + "golang.org/x/sys/windows/svc" +) + +// Run executes service name by calling appropriate handler function. +// The process is running on console, unlike real service. Use Ctrl+C to +// send "Stop" command to your service. +func Run(name string, handler svc.Handler) error { + cmds := make(chan svc.ChangeRequest) + changes := make(chan svc.Status) + + sig := make(chan os.Signal) + signal.Notify(sig) + + go func() { + status := svc.Status{State: svc.Stopped} + for { + select { + case <-sig: + cmds <- svc.ChangeRequest{svc.Stop, 0, 0, status} + case status = <-changes: + } + } + }() + + _, errno := handler.Execute([]string{name}, cmds, changes) + if errno != 0 { + return syscall.Errno(errno) + } + return nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/event.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/event.go new file mode 100644 index 0000000..0508e22 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/event.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. + +// +build windows + +package svc + +import ( + "errors" + + "golang.org/x/sys/windows" +) + +// event represents auto-reset, initially non-signaled Windows event. +// It is used to communicate between go and asm parts of this package. +type event struct { + h windows.Handle +} + +func newEvent() (*event, error) { + h, err := windows.CreateEvent(nil, 0, 0, nil) + if err != nil { + return nil, err + } + return &event{h: h}, nil +} + +func (e *event) Close() error { + return windows.CloseHandle(e.h) +} + +func (e *event) Set() error { + return windows.SetEvent(e.h) +} + +func (e *event) Wait() error { + s, err := windows.WaitForSingleObject(e.h, windows.INFINITE) + switch s { + case windows.WAIT_OBJECT_0: + break + case windows.WAIT_FAILED: + return err + default: + return errors.New("unexpected result from WaitForSingleObject") + } + return nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/eventlog/install.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/eventlog/install.go new file mode 100644 index 0000000..c76a376 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/eventlog/install.go @@ -0,0 +1,80 @@ +// 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. + +// +build windows + +package eventlog + +import ( + "errors" + + "golang.org/x/sys/windows" + "golang.org/x/sys/windows/registry" +) + +const ( + // Log levels. + Info = windows.EVENTLOG_INFORMATION_TYPE + Warning = windows.EVENTLOG_WARNING_TYPE + Error = windows.EVENTLOG_ERROR_TYPE +) + +const addKeyName = `SYSTEM\CurrentControlSet\Services\EventLog\Application` + +// Install modifies PC registry to allow logging with an event source src. +// It adds all required keys and values to the event log registry key. +// Install uses msgFile as the event message file. If useExpandKey is true, +// the event message file is installed as REG_EXPAND_SZ value, +// otherwise as REG_SZ. Use bitwise of log.Error, log.Warning and +// log.Info to specify events supported by the new event source. +func Install(src, msgFile string, useExpandKey bool, eventsSupported uint32) error { + appkey, err := registry.OpenKey(registry.LOCAL_MACHINE, addKeyName, registry.CREATE_SUB_KEY) + if err != nil { + return err + } + defer appkey.Close() + + sk, alreadyExist, err := registry.CreateKey(appkey, src, registry.SET_VALUE) + if err != nil { + return err + } + defer sk.Close() + if alreadyExist { + return errors.New(addKeyName + `\` + src + " registry key already exists") + } + + err = sk.SetDWordValue("CustomSource", 1) + if err != nil { + return err + } + if useExpandKey { + err = sk.SetExpandStringValue("EventMessageFile", msgFile) + } else { + err = sk.SetStringValue("EventMessageFile", msgFile) + } + if err != nil { + return err + } + err = sk.SetDWordValue("TypesSupported", eventsSupported) + if err != nil { + return err + } + return nil +} + +// InstallAsEventCreate is the same as Install, but uses +// %SystemRoot%\System32\EventCreate.exe as the event message file. +func InstallAsEventCreate(src string, eventsSupported uint32) error { + return Install(src, "%SystemRoot%\\System32\\EventCreate.exe", true, eventsSupported) +} + +// Remove deletes all registry elements installed by the correspondent Install. +func Remove(src string) error { + appkey, err := registry.OpenKey(registry.LOCAL_MACHINE, addKeyName, registry.SET_VALUE) + if err != nil { + return err + } + defer appkey.Close() + return registry.DeleteKey(appkey, src) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/eventlog/log.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/eventlog/log.go new file mode 100644 index 0000000..46e5153 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/eventlog/log.go @@ -0,0 +1,70 @@ +// 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. + +// +build windows + +// Package eventlog implements access to Windows event log. +// +package eventlog + +import ( + "errors" + "syscall" + + "golang.org/x/sys/windows" +) + +// Log provides access to the system log. +type Log struct { + Handle windows.Handle +} + +// Open retrieves a handle to the specified event log. +func Open(source string) (*Log, error) { + return OpenRemote("", source) +} + +// OpenRemote does the same as Open, but on different computer host. +func OpenRemote(host, source string) (*Log, error) { + if source == "" { + return nil, errors.New("Specify event log source") + } + var s *uint16 + if host != "" { + s = syscall.StringToUTF16Ptr(host) + } + h, err := windows.RegisterEventSource(s, syscall.StringToUTF16Ptr(source)) + if err != nil { + return nil, err + } + return &Log{Handle: h}, nil +} + +// Close closes event log l. +func (l *Log) Close() error { + return windows.DeregisterEventSource(l.Handle) +} + +func (l *Log) report(etype uint16, eid uint32, msg string) error { + ss := []*uint16{syscall.StringToUTF16Ptr(msg)} + return windows.ReportEvent(l.Handle, etype, 0, eid, 0, 1, 0, &ss[0], nil) +} + +// Info writes an information event msg with event id eid to the end of event log l. +// When EventCreate.exe is used, eid must be between 1 and 1000. +func (l *Log) Info(eid uint32, msg string) error { + return l.report(windows.EVENTLOG_INFORMATION_TYPE, eid, msg) +} + +// Warning writes an warning event msg with event id eid to the end of event log l. +// When EventCreate.exe is used, eid must be between 1 and 1000. +func (l *Log) Warning(eid uint32, msg string) error { + return l.report(windows.EVENTLOG_WARNING_TYPE, eid, msg) +} + +// Error writes an error event msg with event id eid to the end of event log l. +// When EventCreate.exe is used, eid must be between 1 and 1000. +func (l *Log) Error(eid uint32, msg string) error { + return l.report(windows.EVENTLOG_ERROR_TYPE, eid, msg) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/eventlog/log_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/eventlog/log_test.go new file mode 100644 index 0000000..4dd8ad9 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/eventlog/log_test.go @@ -0,0 +1,51 @@ +// 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. + +// +build windows + +package eventlog_test + +import ( + "testing" + + "golang.org/x/sys/windows/svc/eventlog" +) + +func TestLog(t *testing.T) { + if testing.Short() { + t.Skip("skipping test in short mode - it modifies system logs") + } + + const name = "mylog" + const supports = eventlog.Error | eventlog.Warning | eventlog.Info + err := eventlog.InstallAsEventCreate(name, supports) + if err != nil { + t.Fatalf("Install failed: %s", err) + } + defer func() { + err = eventlog.Remove(name) + if err != nil { + t.Fatalf("Remove failed: %s", err) + } + }() + + l, err := eventlog.Open(name) + if err != nil { + t.Fatalf("Open failed: %s", err) + } + defer l.Close() + + err = l.Info(1, "info") + if err != nil { + t.Fatalf("Info failed: %s", err) + } + err = l.Warning(2, "warning") + if err != nil { + t.Fatalf("Warning failed: %s", err) + } + err = l.Error(3, "error") + if err != nil { + t.Fatalf("Error failed: %s", err) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/example/beep.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/example/beep.go new file mode 100644 index 0000000..dcf2340 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/example/beep.go @@ -0,0 +1,22 @@ +// 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. + +// +build windows + +package main + +import ( + "syscall" +) + +// BUG(brainman): MessageBeep Windows api is broken on Windows 7, +// so this example does not beep when runs as service on Windows 7. + +var ( + beepFunc = syscall.MustLoadDLL("user32.dll").MustFindProc("MessageBeep") +) + +func beep() { + beepFunc.Call(0xffffffff) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/example/install.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/example/install.go new file mode 100644 index 0000000..39cb00d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/example/install.go @@ -0,0 +1,92 @@ +// 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. + +// +build windows + +package main + +import ( + "fmt" + "os" + "path/filepath" + + "golang.org/x/sys/windows/svc/eventlog" + "golang.org/x/sys/windows/svc/mgr" +) + +func exePath() (string, error) { + prog := os.Args[0] + p, err := filepath.Abs(prog) + if err != nil { + return "", err + } + fi, err := os.Stat(p) + if err == nil { + if !fi.Mode().IsDir() { + return p, nil + } + err = fmt.Errorf("%s is directory", p) + } + if filepath.Ext(p) == "" { + p += ".exe" + fi, err := os.Stat(p) + if err == nil { + if !fi.Mode().IsDir() { + return p, nil + } + err = fmt.Errorf("%s is directory", p) + } + } + return "", err +} + +func installService(name, desc string) error { + exepath, err := exePath() + if err != nil { + return err + } + m, err := mgr.Connect() + if err != nil { + return err + } + defer m.Disconnect() + s, err := m.OpenService(name) + if err == nil { + s.Close() + return fmt.Errorf("service %s already exists", name) + } + s, err = m.CreateService(name, exepath, mgr.Config{DisplayName: desc}, "is", "auto-started") + if err != nil { + return err + } + defer s.Close() + err = eventlog.InstallAsEventCreate(name, eventlog.Error|eventlog.Warning|eventlog.Info) + if err != nil { + s.Delete() + return fmt.Errorf("SetupEventLogSource() failed: %s", err) + } + return nil +} + +func removeService(name string) error { + m, err := mgr.Connect() + if err != nil { + return err + } + defer m.Disconnect() + s, err := m.OpenService(name) + if err != nil { + return fmt.Errorf("service %s is not installed", name) + } + defer s.Close() + err = s.Delete() + if err != nil { + return err + } + err = eventlog.Remove(name) + if err != nil { + return fmt.Errorf("RemoveEventLogSource() failed: %s", err) + } + return nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/example/main.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/example/main.go new file mode 100644 index 0000000..dc96c08 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/example/main.go @@ -0,0 +1,76 @@ +// 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. + +// +build windows + +// Example service program that beeps. +// +// The program demonstrates how to create Windows service and +// install / remove it on a computer. It also shows how to +// stop / start / pause / continue any service, and how to +// write to event log. It also shows how to use debug +// facilities available in debug package. +// +package main + +import ( + "fmt" + "log" + "os" + "strings" + + "golang.org/x/sys/windows/svc" +) + +func usage(errmsg string) { + fmt.Fprintf(os.Stderr, + "%s\n\n"+ + "usage: %s \n"+ + " where is one of\n"+ + " install, remove, debug, start, stop, pause or continue.\n", + errmsg, os.Args[0]) + os.Exit(2) +} + +func main() { + const svcName = "myservice" + + isIntSess, err := svc.IsAnInteractiveSession() + if err != nil { + log.Fatalf("failed to determine if we are running in an interactive session: %v", err) + } + if !isIntSess { + runService(svcName, false) + return + } + + if len(os.Args) < 2 { + usage("no command specified") + } + + cmd := strings.ToLower(os.Args[1]) + switch cmd { + case "debug": + runService(svcName, true) + return + case "install": + err = installService(svcName, "my service") + case "remove": + err = removeService(svcName) + case "start": + err = startService(svcName) + case "stop": + err = controlService(svcName, svc.Stop, svc.Stopped) + case "pause": + err = controlService(svcName, svc.Pause, svc.Paused) + case "continue": + err = controlService(svcName, svc.Continue, svc.Running) + default: + usage(fmt.Sprintf("invalid command %s", cmd)) + } + if err != nil { + log.Fatalf("failed to %s %s: %v", cmd, svcName, err) + } + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/example/manage.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/example/manage.go new file mode 100644 index 0000000..782dbd9 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/example/manage.go @@ -0,0 +1,62 @@ +// 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. + +// +build windows + +package main + +import ( + "fmt" + "time" + + "golang.org/x/sys/windows/svc" + "golang.org/x/sys/windows/svc/mgr" +) + +func startService(name string) error { + m, err := mgr.Connect() + if err != nil { + return err + } + defer m.Disconnect() + s, err := m.OpenService(name) + if err != nil { + return fmt.Errorf("could not access service: %v", err) + } + defer s.Close() + err = s.Start("is", "manual-started") + if err != nil { + return fmt.Errorf("could not start service: %v", err) + } + return nil +} + +func controlService(name string, c svc.Cmd, to svc.State) error { + m, err := mgr.Connect() + if err != nil { + return err + } + defer m.Disconnect() + s, err := m.OpenService(name) + if err != nil { + return fmt.Errorf("could not access service: %v", err) + } + defer s.Close() + status, err := s.Control(c) + if err != nil { + return fmt.Errorf("could not send control=%d: %v", c, err) + } + timeout := time.Now().Add(10 * time.Second) + for status.State != to { + if timeout.Before(time.Now()) { + return fmt.Errorf("timeout waiting for service to go to state=%d", to) + } + time.Sleep(300 * time.Millisecond) + status, err = s.Query() + if err != nil { + return fmt.Errorf("could not retrieve service status: %v", err) + } + } + return nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/example/service.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/example/service.go new file mode 100644 index 0000000..237e809 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/example/service.go @@ -0,0 +1,82 @@ +// 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. + +// +build windows + +package main + +import ( + "fmt" + "time" + + "golang.org/x/sys/windows/svc" + "golang.org/x/sys/windows/svc/debug" + "golang.org/x/sys/windows/svc/eventlog" +) + +var elog debug.Log + +type myservice struct{} + +func (m *myservice) Execute(args []string, r <-chan svc.ChangeRequest, changes chan<- svc.Status) (ssec bool, errno uint32) { + const cmdsAccepted = svc.AcceptStop | svc.AcceptShutdown | svc.AcceptPauseAndContinue + changes <- svc.Status{State: svc.StartPending} + fasttick := time.Tick(500 * time.Millisecond) + slowtick := time.Tick(2 * time.Second) + tick := fasttick + changes <- svc.Status{State: svc.Running, Accepts: cmdsAccepted} +loop: + for { + select { + case <-tick: + beep() + elog.Info(1, "beep") + case c := <-r: + switch c.Cmd { + case svc.Interrogate: + changes <- c.CurrentStatus + // Testing deadlock from https://code.google.com/p/winsvc/issues/detail?id=4 + time.Sleep(100 * time.Millisecond) + changes <- c.CurrentStatus + case svc.Stop, svc.Shutdown: + break loop + case svc.Pause: + changes <- svc.Status{State: svc.Paused, Accepts: cmdsAccepted} + tick = slowtick + case svc.Continue: + changes <- svc.Status{State: svc.Running, Accepts: cmdsAccepted} + tick = fasttick + default: + elog.Error(1, fmt.Sprintf("unexpected control request #%d", c)) + } + } + } + changes <- svc.Status{State: svc.StopPending} + return +} + +func runService(name string, isDebug bool) { + var err error + if isDebug { + elog = debug.New(name) + } else { + elog, err = eventlog.Open(name) + if err != nil { + return + } + } + defer elog.Close() + + elog.Info(1, fmt.Sprintf("starting %s service", name)) + run := svc.Run + if isDebug { + run = debug.Run + } + err = run(name, &myservice{}) + if err != nil { + elog.Error(1, fmt.Sprintf("%s service failed: %v", name, err)) + return + } + elog.Info(1, fmt.Sprintf("%s service stopped", name)) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/go12.c b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/go12.c new file mode 100644 index 0000000..6f1be1f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/go12.c @@ -0,0 +1,24 @@ +// 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. + +// +build windows +// +build !go1.3 + +// copied from pkg/runtime +typedef unsigned int uint32; +typedef unsigned long long int uint64; +#ifdef _64BIT +typedef uint64 uintptr; +#else +typedef uint32 uintptr; +#endif + +// from sys_386.s or sys_amd64.s +void ·servicemain(void); + +void +·getServiceMain(uintptr *r) +{ + *r = (uintptr)·servicemain; +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/go12.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/go12.go new file mode 100644 index 0000000..6f0a924 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/go12.go @@ -0,0 +1,11 @@ +// 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. + +// +build windows +// +build !go1.3 + +package svc + +// from go12.c +func getServiceMain(r *uintptr) diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/go13.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/go13.go new file mode 100644 index 0000000..432a9e7 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/go13.go @@ -0,0 +1,31 @@ +// 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. + +// +build windows +// +build go1.3 + +package svc + +import "unsafe" + +const ptrSize = 4 << (^uintptr(0) >> 63) // unsafe.Sizeof(uintptr(0)) but an ideal const + +// Should be a built-in for unsafe.Pointer? +func add(p unsafe.Pointer, x uintptr) unsafe.Pointer { + return unsafe.Pointer(uintptr(p) + x) +} + +// funcPC returns the entry PC of the function f. +// It assumes that f is a func value. Otherwise the behavior is undefined. +func funcPC(f interface{}) uintptr { + return **(**uintptr)(add(unsafe.Pointer(&f), ptrSize)) +} + +// from sys_386.s and sys_amd64.s +func servicectlhandler(ctl uint32) uintptr +func servicemain(argc uint32, argv **uint16) + +func getServiceMain(r *uintptr) { + *r = funcPC(servicemain) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/mgr/config.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/mgr/config.go new file mode 100644 index 0000000..0a6edba --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/mgr/config.go @@ -0,0 +1,139 @@ +// 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. + +// +build windows + +package mgr + +import ( + "syscall" + "unicode/utf16" + "unsafe" + + "golang.org/x/sys/windows" +) + +const ( + // Service start types. + StartManual = windows.SERVICE_DEMAND_START // the service must be started manually + StartAutomatic = windows.SERVICE_AUTO_START // the service will start by itself whenever the computer reboots + StartDisabled = windows.SERVICE_DISABLED // the service cannot be started + + // The severity of the error, and action taken, + // if this service fails to start. + ErrorCritical = windows.SERVICE_ERROR_CRITICAL + ErrorIgnore = windows.SERVICE_ERROR_IGNORE + ErrorNormal = windows.SERVICE_ERROR_NORMAL + ErrorSevere = windows.SERVICE_ERROR_SEVERE +) + +// TODO(brainman): Password is not returned by windows.QueryServiceConfig, not sure how to get it. + +type Config struct { + ServiceType uint32 + StartType uint32 + ErrorControl uint32 + BinaryPathName string // fully qualified path to the service binary file, can also include arguments for an auto-start service + LoadOrderGroup string + TagId uint32 + Dependencies []string + ServiceStartName string // name of the account under which the service should run + DisplayName string + Password string + Description string +} + +func toString(p *uint16) string { + if p == nil { + return "" + } + return syscall.UTF16ToString((*[4096]uint16)(unsafe.Pointer(p))[:]) +} + +func toStringSlice(ps *uint16) []string { + if ps == nil { + return nil + } + r := make([]string, 0) + for from, i, p := 0, 0, (*[1 << 24]uint16)(unsafe.Pointer(ps)); true; i++ { + if p[i] == 0 { + // empty string marks the end + if i <= from { + break + } + r = append(r, string(utf16.Decode(p[from:i]))) + from = i + 1 + } + } + return r +} + +// Config retrieves service s configuration paramteres. +func (s *Service) Config() (Config, error) { + var p *windows.QUERY_SERVICE_CONFIG + n := uint32(1024) + for { + b := make([]byte, n) + p = (*windows.QUERY_SERVICE_CONFIG)(unsafe.Pointer(&b[0])) + err := windows.QueryServiceConfig(s.Handle, p, n, &n) + if err == nil { + break + } + if err.(syscall.Errno) != syscall.ERROR_INSUFFICIENT_BUFFER { + return Config{}, err + } + if n <= uint32(len(b)) { + return Config{}, err + } + } + + var p2 *windows.SERVICE_DESCRIPTION + n = uint32(1024) + for { + b := make([]byte, n) + p2 = (*windows.SERVICE_DESCRIPTION)(unsafe.Pointer(&b[0])) + err := windows.QueryServiceConfig2(s.Handle, + windows.SERVICE_CONFIG_DESCRIPTION, &b[0], n, &n) + if err == nil { + break + } + if err.(syscall.Errno) != syscall.ERROR_INSUFFICIENT_BUFFER { + return Config{}, err + } + if n <= uint32(len(b)) { + return Config{}, err + } + } + + return Config{ + ServiceType: p.ServiceType, + StartType: p.StartType, + ErrorControl: p.ErrorControl, + BinaryPathName: toString(p.BinaryPathName), + LoadOrderGroup: toString(p.LoadOrderGroup), + TagId: p.TagId, + Dependencies: toStringSlice(p.Dependencies), + ServiceStartName: toString(p.ServiceStartName), + DisplayName: toString(p.DisplayName), + Description: toString(p2.Description), + }, nil +} + +func updateDescription(handle windows.Handle, desc string) error { + d := windows.SERVICE_DESCRIPTION{toPtr(desc)} + return windows.ChangeServiceConfig2(handle, + windows.SERVICE_CONFIG_DESCRIPTION, (*byte)(unsafe.Pointer(&d))) +} + +// UpdateConfig updates service s configuration parameters. +func (s *Service) UpdateConfig(c Config) error { + err := windows.ChangeServiceConfig(s.Handle, c.ServiceType, c.StartType, + c.ErrorControl, toPtr(c.BinaryPathName), toPtr(c.LoadOrderGroup), + nil, toStringBlock(c.Dependencies), toPtr(c.ServiceStartName), + toPtr(c.Password), toPtr(c.DisplayName)) + if err != nil { + return err + } + return updateDescription(s.Handle, c.Description) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/mgr/mgr.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/mgr/mgr.go new file mode 100644 index 0000000..76965b5 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/mgr/mgr.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. + +// +build windows + +// Package mgr can be used to manage Windows service programs. +// It can be used to install and remove them. It can also start, +// stop and pause them. The package can query / change current +// service state and config parameters. +// +package mgr + +import ( + "syscall" + "unicode/utf16" + "unsafe" + + "golang.org/x/sys/windows" +) + +// Mgr is used to manage Windows service. +type Mgr struct { + Handle windows.Handle +} + +// Connect establishes a connection to the service control manager. +func Connect() (*Mgr, error) { + return ConnectRemote("") +} + +// ConnectRemote establishes a connection to the +// service control manager on computer named host. +func ConnectRemote(host string) (*Mgr, error) { + var s *uint16 + if host != "" { + s = syscall.StringToUTF16Ptr(host) + } + h, err := windows.OpenSCManager(s, nil, windows.SC_MANAGER_ALL_ACCESS) + if err != nil { + return nil, err + } + return &Mgr{Handle: h}, nil +} + +// Disconnect closes connection to the service control manager m. +func (m *Mgr) Disconnect() error { + return windows.CloseServiceHandle(m.Handle) +} + +func toPtr(s string) *uint16 { + if len(s) == 0 { + return nil + } + return syscall.StringToUTF16Ptr(s) +} + +// toStringBlock terminates strings in ss with 0, and then +// concatenates them together. It also adds extra 0 at the end. +func toStringBlock(ss []string) *uint16 { + if len(ss) == 0 { + return nil + } + t := "" + for _, s := range ss { + if s != "" { + t += s + "\x00" + } + } + if t == "" { + return nil + } + t += "\x00" + return &utf16.Encode([]rune(t))[0] +} + +// CreateService installs new service name on the system. +// The service will be executed by running exepath binary. +// Use config c to specify service parameters. +// Any args will be passed as command-line arguments when +// the service is started; these arguments are distinct from +// the arguments passed to Service.Start or via the "Start +// parameters" field in the service's Properties dialog box. +func (m *Mgr) CreateService(name, exepath string, c Config, args ...string) (*Service, error) { + if c.StartType == 0 { + c.StartType = StartManual + } + if c.ErrorControl == 0 { + c.ErrorControl = ErrorNormal + } + if c.ServiceType == 0 { + c.ServiceType = windows.SERVICE_WIN32_OWN_PROCESS + } + s := syscall.EscapeArg(exepath) + for _, v := range args { + s += " " + syscall.EscapeArg(v) + } + h, err := windows.CreateService(m.Handle, toPtr(name), toPtr(c.DisplayName), + windows.SERVICE_ALL_ACCESS, c.ServiceType, + c.StartType, c.ErrorControl, toPtr(s), toPtr(c.LoadOrderGroup), + nil, toStringBlock(c.Dependencies), toPtr(c.ServiceStartName), toPtr(c.Password)) + if err != nil { + return nil, err + } + if c.Description != "" { + err = updateDescription(h, c.Description) + if err != nil { + return nil, err + } + } + return &Service{Name: name, Handle: h}, nil +} + +// OpenService retrieves access to service name, so it can +// be interrogated and controlled. +func (m *Mgr) OpenService(name string) (*Service, error) { + h, err := windows.OpenService(m.Handle, syscall.StringToUTF16Ptr(name), windows.SERVICE_ALL_ACCESS) + if err != nil { + return nil, err + } + return &Service{Name: name, Handle: h}, nil +} + +// ListServices enumerates services in the specified +// service control manager database m. +// If the caller does not have the SERVICE_QUERY_STATUS +// access right to a service, the service is silently +// omitted from the list of services returned. +func (m *Mgr) ListServices() ([]string, error) { + var err error + var bytesNeeded, servicesReturned uint32 + var buf []byte + for { + var p *byte + if len(buf) > 0 { + p = &buf[0] + } + err = windows.EnumServicesStatusEx(m.Handle, windows.SC_ENUM_PROCESS_INFO, + windows.SERVICE_WIN32, windows.SERVICE_STATE_ALL, + p, uint32(len(buf)), &bytesNeeded, &servicesReturned, nil, nil) + if err == nil { + break + } + if err != syscall.ERROR_MORE_DATA { + return nil, err + } + if bytesNeeded <= uint32(len(buf)) { + return nil, err + } + buf = make([]byte, bytesNeeded) + } + if servicesReturned == 0 { + return nil, nil + } + services := (*[1 << 20]windows.ENUM_SERVICE_STATUS_PROCESS)(unsafe.Pointer(&buf[0]))[:servicesReturned] + var names []string + for _, s := range services { + name := syscall.UTF16ToString((*[1 << 20]uint16)(unsafe.Pointer(s.ServiceName))[:]) + names = append(names, name) + } + return names, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/mgr/mgr_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/mgr/mgr_test.go new file mode 100644 index 0000000..e67407c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/mgr/mgr_test.go @@ -0,0 +1,169 @@ +// 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. + +// +build windows + +package mgr_test + +import ( + "os" + "path/filepath" + "sort" + "strings" + "syscall" + "testing" + "time" + + "golang.org/x/sys/windows/svc/mgr" +) + +func TestOpenLanManServer(t *testing.T) { + m, err := mgr.Connect() + if err != nil { + if errno, ok := err.(syscall.Errno); ok && errno == syscall.ERROR_ACCESS_DENIED { + t.Skip("Skipping test: we don't have rights to manage services.") + } + t.Fatalf("SCM connection failed: %s", err) + } + defer m.Disconnect() + + s, err := m.OpenService("LanmanServer") + if err != nil { + t.Fatalf("OpenService(lanmanserver) failed: %s", err) + } + defer s.Close() + + _, err = s.Config() + if err != nil { + t.Fatalf("Config failed: %s", err) + } +} + +func install(t *testing.T, m *mgr.Mgr, name, exepath string, c mgr.Config) { + // Sometimes it takes a while for the service to get + // removed after previous test run. + for i := 0; ; i++ { + s, err := m.OpenService(name) + if err != nil { + break + } + s.Close() + + if i > 10 { + t.Fatalf("service %s already exists", name) + } + time.Sleep(300 * time.Millisecond) + } + + s, err := m.CreateService(name, exepath, c) + if err != nil { + t.Fatalf("CreateService(%s) failed: %v", name, err) + } + defer s.Close() +} + +func depString(d []string) string { + if len(d) == 0 { + return "" + } + for i := range d { + d[i] = strings.ToLower(d[i]) + } + ss := sort.StringSlice(d) + ss.Sort() + return strings.Join([]string(ss), " ") +} + +func testConfig(t *testing.T, s *mgr.Service, should mgr.Config) mgr.Config { + is, err := s.Config() + if err != nil { + t.Fatalf("Config failed: %s", err) + } + if should.DisplayName != is.DisplayName { + t.Fatalf("config mismatch: DisplayName is %q, but should have %q", is.DisplayName, should.DisplayName) + } + if should.StartType != is.StartType { + t.Fatalf("config mismatch: StartType is %v, but should have %v", is.StartType, should.StartType) + } + if should.Description != is.Description { + t.Fatalf("config mismatch: Description is %q, but should have %q", is.Description, should.Description) + } + if depString(should.Dependencies) != depString(is.Dependencies) { + t.Fatalf("config mismatch: Dependencies is %v, but should have %v", is.Dependencies, should.Dependencies) + } + return is +} + +func remove(t *testing.T, s *mgr.Service) { + err := s.Delete() + if err != nil { + t.Fatalf("Delete failed: %s", err) + } +} + +func TestMyService(t *testing.T) { + if testing.Short() { + t.Skip("skipping test in short mode - it modifies system services") + } + + const name = "myservice" + + m, err := mgr.Connect() + if err != nil { + if errno, ok := err.(syscall.Errno); ok && errno == syscall.ERROR_ACCESS_DENIED { + t.Skip("Skipping test: we don't have rights to manage services.") + } + t.Fatalf("SCM connection failed: %s", err) + } + defer m.Disconnect() + + c := mgr.Config{ + StartType: mgr.StartDisabled, + DisplayName: "my service", + Description: "my service is just a test", + Dependencies: []string{"LanmanServer", "W32Time"}, + } + + exename := os.Args[0] + exepath, err := filepath.Abs(exename) + if err != nil { + t.Fatalf("filepath.Abs(%s) failed: %s", exename, err) + } + + install(t, m, name, exepath, c) + + s, err := m.OpenService(name) + if err != nil { + t.Fatalf("service %s is not installed", name) + } + defer s.Close() + + c.BinaryPathName = exepath + c = testConfig(t, s, c) + + c.StartType = mgr.StartManual + err = s.UpdateConfig(c) + if err != nil { + t.Fatalf("UpdateConfig failed: %v", err) + } + + testConfig(t, s, c) + + svcnames, err := m.ListServices() + if err != nil { + t.Fatalf("ListServices failed: %v", err) + } + var myserviceIsInstalled bool + for _, sn := range svcnames { + if sn == name { + myserviceIsInstalled = true + break + } + } + if !myserviceIsInstalled { + t.Errorf("ListServices failed to find %q service", name) + } + + remove(t, s) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/mgr/service.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/mgr/service.go new file mode 100644 index 0000000..fdc46af --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/mgr/service.go @@ -0,0 +1,72 @@ +// 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. + +// +build windows + +package mgr + +import ( + "syscall" + + "golang.org/x/sys/windows" + "golang.org/x/sys/windows/svc" +) + +// TODO(brainman): Use EnumDependentServices to enumerate dependent services. + +// Service is used to access Windows service. +type Service struct { + Name string + Handle windows.Handle +} + +// Delete marks service s for deletion from the service control manager database. +func (s *Service) Delete() error { + return windows.DeleteService(s.Handle) +} + +// Close relinquish access to the service s. +func (s *Service) Close() error { + return windows.CloseServiceHandle(s.Handle) +} + +// Start starts service s. +// args will be passed to svc.Handler.Execute. +func (s *Service) Start(args ...string) error { + var p **uint16 + if len(args) > 0 { + vs := make([]*uint16, len(args)) + for i := range vs { + vs[i] = syscall.StringToUTF16Ptr(args[i]) + } + p = &vs[0] + } + return windows.StartService(s.Handle, uint32(len(args)), p) +} + +// Control sends state change request c to the servce s. +func (s *Service) Control(c svc.Cmd) (svc.Status, error) { + var t windows.SERVICE_STATUS + err := windows.ControlService(s.Handle, uint32(c), &t) + if err != nil { + return svc.Status{}, err + } + return svc.Status{ + State: svc.State(t.CurrentState), + Accepts: svc.Accepted(t.ControlsAccepted), + }, nil +} + +// Query returns current status of service s. +func (s *Service) Query() (svc.Status, error) { + var t windows.SERVICE_STATUS + err := windows.QueryServiceStatus(s.Handle, &t) + if err != nil { + return svc.Status{}, err + } + return svc.Status{ + State: svc.State(t.CurrentState), + Accepts: svc.Accepted(t.ControlsAccepted), + }, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/security.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/security.go new file mode 100644 index 0000000..6fbc923 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/security.go @@ -0,0 +1,62 @@ +// 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. + +// +build windows + +package svc + +import ( + "unsafe" + + "golang.org/x/sys/windows" +) + +func allocSid(subAuth0 uint32) (*windows.SID, error) { + var sid *windows.SID + err := windows.AllocateAndInitializeSid(&windows.SECURITY_NT_AUTHORITY, + 1, subAuth0, 0, 0, 0, 0, 0, 0, 0, &sid) + if err != nil { + return nil, err + } + return sid, nil +} + +// IsAnInteractiveSession determines if calling process is running interactively. +// It queries the process token for membership in the Interactive group. +// http://stackoverflow.com/questions/2668851/how-do-i-detect-that-my-application-is-running-as-service-or-in-an-interactive-s +func IsAnInteractiveSession() (bool, error) { + interSid, err := allocSid(windows.SECURITY_INTERACTIVE_RID) + if err != nil { + return false, err + } + defer windows.FreeSid(interSid) + + serviceSid, err := allocSid(windows.SECURITY_SERVICE_RID) + if err != nil { + return false, err + } + defer windows.FreeSid(serviceSid) + + t, err := windows.OpenCurrentProcessToken() + if err != nil { + return false, err + } + defer t.Close() + + gs, err := t.GetTokenGroups() + if err != nil { + return false, err + } + p := unsafe.Pointer(&gs.Groups[0]) + groups := (*[2 << 20]windows.SIDAndAttributes)(p)[:gs.GroupCount] + for _, g := range groups { + if windows.EqualSid(g.Sid, interSid) { + return true, nil + } + if windows.EqualSid(g.Sid, serviceSid) { + return false, nil + } + } + return false, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/service.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/service.go new file mode 100644 index 0000000..903cba3 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/service.go @@ -0,0 +1,363 @@ +// 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. + +// +build windows + +// Package svc provides everything required to build Windows service. +// +package svc + +import ( + "errors" + "runtime" + "syscall" + "unsafe" + + "golang.org/x/sys/windows" +) + +// State describes service execution state (Stopped, Running and so on). +type State uint32 + +const ( + Stopped = State(windows.SERVICE_STOPPED) + StartPending = State(windows.SERVICE_START_PENDING) + StopPending = State(windows.SERVICE_STOP_PENDING) + Running = State(windows.SERVICE_RUNNING) + ContinuePending = State(windows.SERVICE_CONTINUE_PENDING) + PausePending = State(windows.SERVICE_PAUSE_PENDING) + Paused = State(windows.SERVICE_PAUSED) +) + +// Cmd represents service state change request. It is sent to a service +// by the service manager, and should be actioned upon by the service. +type Cmd uint32 + +const ( + Stop = Cmd(windows.SERVICE_CONTROL_STOP) + Pause = Cmd(windows.SERVICE_CONTROL_PAUSE) + Continue = Cmd(windows.SERVICE_CONTROL_CONTINUE) + Interrogate = Cmd(windows.SERVICE_CONTROL_INTERROGATE) + Shutdown = Cmd(windows.SERVICE_CONTROL_SHUTDOWN) + ParamChange = Cmd(windows.SERVICE_CONTROL_PARAMCHANGE) + NetBindAdd = Cmd(windows.SERVICE_CONTROL_NETBINDADD) + NetBindRemove = Cmd(windows.SERVICE_CONTROL_NETBINDREMOVE) + NetBindEnable = Cmd(windows.SERVICE_CONTROL_NETBINDENABLE) + NetBindDisable = Cmd(windows.SERVICE_CONTROL_NETBINDDISABLE) + DeviceEvent = Cmd(windows.SERVICE_CONTROL_DEVICEEVENT) + HardwareProfileChange = Cmd(windows.SERVICE_CONTROL_HARDWAREPROFILECHANGE) + PowerEvent = Cmd(windows.SERVICE_CONTROL_POWEREVENT) + SessionChange = Cmd(windows.SERVICE_CONTROL_SESSIONCHANGE) +) + +// Accepted is used to describe commands accepted by the service. +// Note that Interrogate is always accepted. +type Accepted uint32 + +const ( + AcceptStop = Accepted(windows.SERVICE_ACCEPT_STOP) + AcceptShutdown = Accepted(windows.SERVICE_ACCEPT_SHUTDOWN) + AcceptPauseAndContinue = Accepted(windows.SERVICE_ACCEPT_PAUSE_CONTINUE) + AcceptParamChange = Accepted(windows.SERVICE_ACCEPT_PARAMCHANGE) + AcceptNetBindChange = Accepted(windows.SERVICE_ACCEPT_NETBINDCHANGE) + AcceptHardwareProfileChange = Accepted(windows.SERVICE_ACCEPT_HARDWAREPROFILECHANGE) + AcceptPowerEvent = Accepted(windows.SERVICE_ACCEPT_POWEREVENT) + AcceptSessionChange = Accepted(windows.SERVICE_ACCEPT_SESSIONCHANGE) +) + +// Status combines State and Accepted commands to fully describe running service. +type Status struct { + State State + Accepts Accepted + CheckPoint uint32 // used to report progress during a lengthy operation + WaitHint uint32 // estimated time required for a pending operation, in milliseconds +} + +// ChangeRequest is sent to the service Handler to request service status change. +type ChangeRequest struct { + Cmd Cmd + EventType uint32 + EventData uintptr + CurrentStatus Status +} + +// Handler is the interface that must be implemented to build Windows service. +type Handler interface { + + // Execute will be called by the package code at the start of + // the service, and the service will exit once Execute completes. + // Inside Execute you must read service change requests from r and + // act accordingly. You must keep service control manager up to date + // about state of your service by writing into s as required. + // args contains service name followed by argument strings passed + // to the service. + // You can provide service exit code in exitCode return parameter, + // with 0 being "no error". You can also indicate if exit code, + // if any, is service specific or not by using svcSpecificEC + // parameter. + Execute(args []string, r <-chan ChangeRequest, s chan<- Status) (svcSpecificEC bool, exitCode uint32) +} + +var ( + // These are used by asm code. + goWaitsH uintptr + cWaitsH uintptr + ssHandle uintptr + sName *uint16 + sArgc uintptr + sArgv **uint16 + ctlHandlerExProc uintptr + cSetEvent uintptr + cWaitForSingleObject uintptr + cRegisterServiceCtrlHandlerExW uintptr +) + +func init() { + k := syscall.MustLoadDLL("kernel32.dll") + cSetEvent = k.MustFindProc("SetEvent").Addr() + cWaitForSingleObject = k.MustFindProc("WaitForSingleObject").Addr() + a := syscall.MustLoadDLL("advapi32.dll") + cRegisterServiceCtrlHandlerExW = a.MustFindProc("RegisterServiceCtrlHandlerExW").Addr() +} + +// The HandlerEx prototype also has a context pointer but since we don't use +// it at start-up time we don't have to pass it over either. +type ctlEvent struct { + cmd Cmd + eventType uint32 + eventData uintptr + errno uint32 +} + +// service provides access to windows service api. +type service struct { + name string + h windows.Handle + cWaits *event + goWaits *event + c chan ctlEvent + handler Handler +} + +func newService(name string, handler Handler) (*service, error) { + var s service + var err error + s.name = name + s.c = make(chan ctlEvent) + s.handler = handler + s.cWaits, err = newEvent() + if err != nil { + return nil, err + } + s.goWaits, err = newEvent() + if err != nil { + s.cWaits.Close() + return nil, err + } + return &s, nil +} + +func (s *service) close() error { + s.cWaits.Close() + s.goWaits.Close() + return nil +} + +type exitCode struct { + isSvcSpecific bool + errno uint32 +} + +func (s *service) updateStatus(status *Status, ec *exitCode) error { + if s.h == 0 { + return errors.New("updateStatus with no service status handle") + } + var t windows.SERVICE_STATUS + t.ServiceType = windows.SERVICE_WIN32_OWN_PROCESS + t.CurrentState = uint32(status.State) + if status.Accepts&AcceptStop != 0 { + t.ControlsAccepted |= windows.SERVICE_ACCEPT_STOP + } + if status.Accepts&AcceptShutdown != 0 { + t.ControlsAccepted |= windows.SERVICE_ACCEPT_SHUTDOWN + } + if status.Accepts&AcceptPauseAndContinue != 0 { + t.ControlsAccepted |= windows.SERVICE_ACCEPT_PAUSE_CONTINUE + } + if status.Accepts&AcceptParamChange != 0 { + t.ControlsAccepted |= windows.SERVICE_ACCEPT_PARAMCHANGE + } + if status.Accepts&AcceptNetBindChange != 0 { + t.ControlsAccepted |= windows.SERVICE_ACCEPT_NETBINDCHANGE + } + if status.Accepts&AcceptHardwareProfileChange != 0 { + t.ControlsAccepted |= windows.SERVICE_ACCEPT_HARDWAREPROFILECHANGE + } + if status.Accepts&AcceptPowerEvent != 0 { + t.ControlsAccepted |= windows.SERVICE_ACCEPT_POWEREVENT + } + if status.Accepts&AcceptSessionChange != 0 { + t.ControlsAccepted |= windows.SERVICE_ACCEPT_SESSIONCHANGE + } + if ec.errno == 0 { + t.Win32ExitCode = windows.NO_ERROR + t.ServiceSpecificExitCode = windows.NO_ERROR + } else if ec.isSvcSpecific { + t.Win32ExitCode = uint32(windows.ERROR_SERVICE_SPECIFIC_ERROR) + t.ServiceSpecificExitCode = ec.errno + } else { + t.Win32ExitCode = ec.errno + t.ServiceSpecificExitCode = windows.NO_ERROR + } + t.CheckPoint = status.CheckPoint + t.WaitHint = status.WaitHint + return windows.SetServiceStatus(s.h, &t) +} + +const ( + sysErrSetServiceStatusFailed = uint32(syscall.APPLICATION_ERROR) + iota + sysErrNewThreadInCallback +) + +func (s *service) run() { + s.goWaits.Wait() + s.h = windows.Handle(ssHandle) + argv := (*[100]*int16)(unsafe.Pointer(sArgv))[:sArgc] + args := make([]string, len(argv)) + for i, a := range argv { + args[i] = syscall.UTF16ToString((*[1 << 20]uint16)(unsafe.Pointer(a))[:]) + } + + cmdsToHandler := make(chan ChangeRequest) + changesFromHandler := make(chan Status) + exitFromHandler := make(chan exitCode) + + go func() { + ss, errno := s.handler.Execute(args, cmdsToHandler, changesFromHandler) + exitFromHandler <- exitCode{ss, errno} + }() + + status := Status{State: Stopped} + ec := exitCode{isSvcSpecific: true, errno: 0} + var outch chan ChangeRequest + inch := s.c + var cmd Cmd + var evtype uint32 + var evdata uintptr +loop: + for { + select { + case r := <-inch: + if r.errno != 0 { + ec.errno = r.errno + break loop + } + inch = nil + outch = cmdsToHandler + cmd = r.cmd + evtype = r.eventType + evdata = r.eventData + case outch <- ChangeRequest{cmd, evtype, evdata, status}: + inch = s.c + outch = nil + case c := <-changesFromHandler: + err := s.updateStatus(&c, &ec) + if err != nil { + // best suitable error number + ec.errno = sysErrSetServiceStatusFailed + if err2, ok := err.(syscall.Errno); ok { + ec.errno = uint32(err2) + } + break loop + } + status = c + case ec = <-exitFromHandler: + break loop + } + } + + s.updateStatus(&Status{State: Stopped}, &ec) + s.cWaits.Set() +} + +func newCallback(fn interface{}) (cb uintptr, err error) { + defer func() { + r := recover() + if r == nil { + return + } + cb = 0 + switch v := r.(type) { + case string: + err = errors.New(v) + case error: + err = v + default: + err = errors.New("unexpected panic in syscall.NewCallback") + } + }() + return syscall.NewCallback(fn), nil +} + +// BUG(brainman): There is no mechanism to run multiple services +// inside one single executable. Perhaps, it can be overcome by +// using RegisterServiceCtrlHandlerEx Windows api. + +// Run executes service name by calling appropriate handler function. +func Run(name string, handler Handler) error { + runtime.LockOSThread() + + tid := windows.GetCurrentThreadId() + + s, err := newService(name, handler) + if err != nil { + return err + } + + ctlHandler := func(ctl uint32, evtype uint32, evdata uintptr, context uintptr) uintptr { + e := ctlEvent{cmd: Cmd(ctl), eventType: evtype, eventData: evdata} + // We assume that this callback function is running on + // the same thread as Run. Nowhere in MS documentation + // I could find statement to guarantee that. So putting + // check here to verify, otherwise things will go bad + // quickly, if ignored. + i := windows.GetCurrentThreadId() + if i != tid { + e.errno = sysErrNewThreadInCallback + } + s.c <- e + // Always return NO_ERROR (0) for now. + return 0 + } + + var svcmain uintptr + getServiceMain(&svcmain) + t := []windows.SERVICE_TABLE_ENTRY{ + {syscall.StringToUTF16Ptr(s.name), svcmain}, + {nil, 0}, + } + + goWaitsH = uintptr(s.goWaits.h) + cWaitsH = uintptr(s.cWaits.h) + sName = t[0].ServiceName + ctlHandlerExProc, err = newCallback(ctlHandler) + if err != nil { + return err + } + + go s.run() + + err = windows.StartServiceCtrlDispatcher(&t[0]) + if err != nil { + return err + } + return nil +} + +// StatusHandle returns service status handle. It is safe to call this function +// from inside the Handler.Execute because then it is guaranteed to be set. +// This code will have to change once multiple services are possible per process. +func StatusHandle() windows.Handle { + return windows.Handle(ssHandle) +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/svc_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/svc_test.go new file mode 100644 index 0000000..764da54 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/svc_test.go @@ -0,0 +1,118 @@ +// 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. + +// +build windows + +package svc_test + +import ( + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "testing" + "time" + + "golang.org/x/sys/windows/svc" + "golang.org/x/sys/windows/svc/mgr" +) + +func getState(t *testing.T, s *mgr.Service) svc.State { + status, err := s.Query() + if err != nil { + t.Fatalf("Query(%s) failed: %s", s.Name, err) + } + return status.State +} + +func testState(t *testing.T, s *mgr.Service, want svc.State) { + have := getState(t, s) + if have != want { + t.Fatalf("%s state is=%d want=%d", s.Name, have, want) + } +} + +func waitState(t *testing.T, s *mgr.Service, want svc.State) { + for i := 0; ; i++ { + have := getState(t, s) + if have == want { + return + } + if i > 10 { + t.Fatalf("%s state is=%d, waiting timeout", s.Name, have) + } + time.Sleep(300 * time.Millisecond) + } +} + +func TestExample(t *testing.T) { + if testing.Short() { + t.Skip("skipping test in short mode - it modifies system services") + } + + const name = "myservice" + + m, err := mgr.Connect() + if err != nil { + t.Fatalf("SCM connection failed: %s", err) + } + defer m.Disconnect() + + dir, err := ioutil.TempDir("", "svc") + if err != nil { + t.Fatalf("failed to create temp directory: %v", err) + } + defer os.RemoveAll(dir) + + exepath := filepath.Join(dir, "a.exe") + o, err := exec.Command("go", "build", "-o", exepath, "golang.org/x/sys/windows/svc/example").CombinedOutput() + if err != nil { + t.Fatalf("failed to build service program: %v\n%v", err, string(o)) + } + + s, err := m.OpenService(name) + if err == nil { + err = s.Delete() + if err != nil { + s.Close() + t.Fatalf("Delete failed: %s", err) + } + s.Close() + } + s, err = m.CreateService(name, exepath, mgr.Config{DisplayName: "my service"}, "is", "auto-started") + if err != nil { + t.Fatalf("CreateService(%s) failed: %v", name, err) + } + defer s.Close() + + testState(t, s, svc.Stopped) + err = s.Start("is", "manual-started") + if err != nil { + t.Fatalf("Start(%s) failed: %s", s.Name, err) + } + waitState(t, s, svc.Running) + time.Sleep(1 * time.Second) + + // testing deadlock from issues 4. + _, err = s.Control(svc.Interrogate) + if err != nil { + t.Fatalf("Control(%s) failed: %s", s.Name, err) + } + _, err = s.Control(svc.Interrogate) + if err != nil { + t.Fatalf("Control(%s) failed: %s", s.Name, err) + } + time.Sleep(1 * time.Second) + + _, err = s.Control(svc.Stop) + if err != nil { + t.Fatalf("Control(%s) failed: %s", s.Name, err) + } + waitState(t, s, svc.Stopped) + + err = s.Delete() + if err != nil { + t.Fatalf("Delete failed: %s", err) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/sys_386.s b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/sys_386.s new file mode 100644 index 0000000..2c82a9d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/sys_386.s @@ -0,0 +1,68 @@ +// 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. + +// +build windows + +// func servicemain(argc uint32, argv **uint16) +TEXT ·servicemain(SB),7,$0 + MOVL argc+0(FP), AX + MOVL AX, ·sArgc(SB) + MOVL argv+4(FP), AX + MOVL AX, ·sArgv(SB) + + PUSHL BP + PUSHL BX + PUSHL SI + PUSHL DI + + SUBL $12, SP + + MOVL ·sName(SB), AX + MOVL AX, (SP) + MOVL $·servicectlhandler(SB), AX + MOVL AX, 4(SP) + MOVL $0, 8(SP) + MOVL ·cRegisterServiceCtrlHandlerExW(SB), AX + MOVL SP, BP + CALL AX + MOVL BP, SP + CMPL AX, $0 + JE exit + MOVL AX, ·ssHandle(SB) + + MOVL ·goWaitsH(SB), AX + MOVL AX, (SP) + MOVL ·cSetEvent(SB), AX + MOVL SP, BP + CALL AX + MOVL BP, SP + + MOVL ·cWaitsH(SB), AX + MOVL AX, (SP) + MOVL $-1, AX + MOVL AX, 4(SP) + MOVL ·cWaitForSingleObject(SB), AX + MOVL SP, BP + CALL AX + MOVL BP, SP + +exit: + ADDL $12, SP + + POPL DI + POPL SI + POPL BX + POPL BP + + MOVL 0(SP), CX + ADDL $12, SP + JMP CX + +// I do not know why, but this seems to be the only way to call +// ctlHandlerProc on Windows 7. + +// func servicectlhandler(ctl uint32, evtype uint32, evdata uintptr, context uintptr) uintptr { +TEXT ·servicectlhandler(SB),7,$0 + MOVL ·ctlHandlerExProc(SB), CX + JMP CX diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/sys_amd64.s b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/sys_amd64.s new file mode 100644 index 0000000..06b4259 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/svc/sys_amd64.s @@ -0,0 +1,42 @@ +// 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. + +// +build windows + +// func servicemain(argc uint32, argv **uint16) +TEXT ·servicemain(SB),7,$0 + MOVL CX, ·sArgc(SB) + MOVL DX, ·sArgv(SB) + + SUBQ $32, SP // stack for the first 4 syscall params + + MOVQ ·sName(SB), CX + MOVQ $·servicectlhandler(SB), DX + // BUG(pastarmovj): Figure out a way to pass in context in R8. + MOVQ ·cRegisterServiceCtrlHandlerExW(SB), AX + CALL AX + CMPQ AX, $0 + JE exit + MOVQ AX, ·ssHandle(SB) + + MOVQ ·goWaitsH(SB), CX + MOVQ ·cSetEvent(SB), AX + CALL AX + + MOVQ ·cWaitsH(SB), CX + MOVQ $4294967295, DX + MOVQ ·cWaitForSingleObject(SB), AX + CALL AX + +exit: + ADDQ $32, SP + RET + +// I do not know why, but this seems to be the only way to call +// ctlHandlerProc on Windows 7. + +// func ·servicectlhandler(ctl uint32, evtype uint32, evdata uintptr, context uintptr) uintptr { +TEXT ·servicectlhandler(SB),7,$0 + MOVQ ·ctlHandlerExProc(SB), AX + JMP AX diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/syscall.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/syscall.go new file mode 100644 index 0000000..4e2fbe8 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/syscall.go @@ -0,0 +1,71 @@ +// 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. + +// +build windows + +// Package windows contains an interface to the low-level operating system +// primitives. OS details vary depending on the underlying system, and +// by default, godoc will display the OS-specific documentation for the current +// system. If you want godoc to display syscall documentation for another +// system, set $GOOS and $GOARCH to the desired system. For example, if +// you want to view documentation for freebsd/arm on linux/amd64, set $GOOS +// to freebsd and $GOARCH to arm. +// The primary use of this package is inside other packages that provide a more +// portable interface to the system, such as "os", "time" and "net". Use +// those packages rather than this one if you can. +// For details of the functions and data types in this package consult +// the manuals for the appropriate operating system. +// These calls return err == nil to indicate success; otherwise +// err represents an operating system error describing the failure and +// holds a value of type syscall.Errno. +package windows // import "golang.org/x/sys/windows" + +import ( + "syscall" +) + +// ByteSliceFromString returns a NUL-terminated slice of bytes +// containing the text of s. If s contains a NUL byte at any +// location, it returns (nil, syscall.EINVAL). +func ByteSliceFromString(s string) ([]byte, error) { + for i := 0; i < len(s); i++ { + if s[i] == 0 { + return nil, syscall.EINVAL + } + } + a := make([]byte, len(s)+1) + copy(a, s) + return a, nil +} + +// BytePtrFromString returns a pointer to a NUL-terminated array of +// bytes containing the text of s. If s contains a NUL byte at any +// location, it returns (nil, syscall.EINVAL). +func BytePtrFromString(s string) (*byte, error) { + a, err := ByteSliceFromString(s) + if err != nil { + return nil, err + } + return &a[0], nil +} + +// Single-word zero for use when we need a valid pointer to 0 bytes. +// See mksyscall.pl. +var _zero uintptr + +func (ts *Timespec) Unix() (sec int64, nsec int64) { + return int64(ts.Sec), int64(ts.Nsec) +} + +func (tv *Timeval) Unix() (sec int64, nsec int64) { + return int64(tv.Sec), int64(tv.Usec) * 1000 +} + +func (ts *Timespec) Nano() int64 { + return int64(ts.Sec)*1e9 + int64(ts.Nsec) +} + +func (tv *Timeval) Nano() int64 { + return int64(tv.Sec)*1e9 + int64(tv.Usec)*1000 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/syscall_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/syscall_test.go new file mode 100644 index 0000000..62588b9 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/syscall_test.go @@ -0,0 +1,33 @@ +// 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. + +// +build windows + +package windows_test + +import ( + "testing" + + "golang.org/x/sys/windows" +) + +func testSetGetenv(t *testing.T, key, value string) { + err := windows.Setenv(key, value) + if err != nil { + t.Fatalf("Setenv failed to set %q: %v", value, err) + } + newvalue, found := windows.Getenv(key) + if !found { + t.Fatalf("Getenv failed to find %v variable (want value %q)", key, value) + } + if newvalue != value { + t.Fatalf("Getenv(%v) = %q; want %q", key, newvalue, value) + } +} + +func TestEnv(t *testing.T) { + testSetGetenv(t, "TESTENV", "AVALUE") + // make sure TESTENV gets set to "", not deleted + testSetGetenv(t, "TESTENV", "") +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/syscall_windows.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/syscall_windows.go new file mode 100644 index 0000000..9b5ed54 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/syscall_windows.go @@ -0,0 +1,1009 @@ +// 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. + +// Windows system calls. + +package windows + +import ( + errorspkg "errors" + "sync" + "syscall" + "unicode/utf16" + "unsafe" +) + +type Handle uintptr + +const InvalidHandle = ^Handle(0) + +// StringToUTF16 is deprecated. Use UTF16FromString instead. +// If s contains a NUL byte this function panics instead of +// returning an error. +func StringToUTF16(s string) []uint16 { + a, err := UTF16FromString(s) + if err != nil { + panic("windows: string with NUL passed to StringToUTF16") + } + return a +} + +// UTF16FromString returns the UTF-16 encoding of the UTF-8 string +// s, with a terminating NUL added. If s contains a NUL byte at any +// location, it returns (nil, syscall.EINVAL). +func UTF16FromString(s string) ([]uint16, error) { + for i := 0; i < len(s); i++ { + if s[i] == 0 { + return nil, syscall.EINVAL + } + } + return utf16.Encode([]rune(s + "\x00")), nil +} + +// UTF16ToString returns the UTF-8 encoding of the UTF-16 sequence s, +// with a terminating NUL removed. +func UTF16ToString(s []uint16) string { + for i, v := range s { + if v == 0 { + s = s[0:i] + break + } + } + return string(utf16.Decode(s)) +} + +// StringToUTF16Ptr is deprecated. Use UTF16PtrFromString instead. +// If s contains a NUL byte this function panics instead of +// returning an error. +func StringToUTF16Ptr(s string) *uint16 { return &StringToUTF16(s)[0] } + +// UTF16PtrFromString returns pointer to the UTF-16 encoding of +// the UTF-8 string s, with a terminating NUL added. If s +// contains a NUL byte at any location, it returns (nil, syscall.EINVAL). +func UTF16PtrFromString(s string) (*uint16, error) { + a, err := UTF16FromString(s) + if err != nil { + return nil, err + } + return &a[0], nil +} + +func Getpagesize() int { return 4096 } + +// NewCallback converts a Go function to a function pointer conforming to the stdcall calling convention. +// This is useful when interoperating with Windows code requiring callbacks. +func NewCallback(fn interface{}) uintptr { + return syscall.NewCallback(fn) +} + +// NewCallbackCDecl converts a Go function to a function pointer conforming to the cdecl calling convention. +// This is useful when interoperating with Windows code requiring callbacks. +func NewCallbackCDecl(fn interface{}) uintptr { + return syscall.NewCallbackCDecl(fn) +} + +// windows api calls + +//sys GetLastError() (lasterr error) +//sys LoadLibrary(libname string) (handle Handle, err error) = LoadLibraryW +//sys LoadLibraryEx(libname string, zero Handle, flags uintptr) (handle Handle, err error) = LoadLibraryExW +//sys FreeLibrary(handle Handle) (err error) +//sys GetProcAddress(module Handle, procname string) (proc uintptr, err error) +//sys GetVersion() (ver uint32, err error) +//sys FormatMessage(flags uint32, msgsrc uintptr, msgid uint32, langid uint32, buf []uint16, args *byte) (n uint32, err error) = FormatMessageW +//sys ExitProcess(exitcode uint32) +//sys CreateFile(name *uint16, access uint32, mode uint32, sa *SecurityAttributes, createmode uint32, attrs uint32, templatefile int32) (handle Handle, err error) [failretval==InvalidHandle] = CreateFileW +//sys ReadFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) +//sys WriteFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) +//sys SetFilePointer(handle Handle, lowoffset int32, highoffsetptr *int32, whence uint32) (newlowoffset uint32, err error) [failretval==0xffffffff] +//sys CloseHandle(handle Handle) (err error) +//sys GetStdHandle(stdhandle uint32) (handle Handle, err error) [failretval==InvalidHandle] +//sys SetStdHandle(stdhandle uint32, handle Handle) (err error) +//sys findFirstFile1(name *uint16, data *win32finddata1) (handle Handle, err error) [failretval==InvalidHandle] = FindFirstFileW +//sys findNextFile1(handle Handle, data *win32finddata1) (err error) = FindNextFileW +//sys FindClose(handle Handle) (err error) +//sys GetFileInformationByHandle(handle Handle, data *ByHandleFileInformation) (err error) +//sys GetCurrentDirectory(buflen uint32, buf *uint16) (n uint32, err error) = GetCurrentDirectoryW +//sys SetCurrentDirectory(path *uint16) (err error) = SetCurrentDirectoryW +//sys CreateDirectory(path *uint16, sa *SecurityAttributes) (err error) = CreateDirectoryW +//sys RemoveDirectory(path *uint16) (err error) = RemoveDirectoryW +//sys DeleteFile(path *uint16) (err error) = DeleteFileW +//sys MoveFile(from *uint16, to *uint16) (err error) = MoveFileW +//sys MoveFileEx(from *uint16, to *uint16, flags uint32) (err error) = MoveFileExW +//sys GetComputerName(buf *uint16, n *uint32) (err error) = GetComputerNameW +//sys GetComputerNameEx(nametype uint32, buf *uint16, n *uint32) (err error) = GetComputerNameExW +//sys SetEndOfFile(handle Handle) (err error) +//sys GetSystemTimeAsFileTime(time *Filetime) +//sys GetSystemTimePreciseAsFileTime(time *Filetime) +//sys GetTimeZoneInformation(tzi *Timezoneinformation) (rc uint32, err error) [failretval==0xffffffff] +//sys CreateIoCompletionPort(filehandle Handle, cphandle Handle, key uint32, threadcnt uint32) (handle Handle, err error) +//sys GetQueuedCompletionStatus(cphandle Handle, qty *uint32, key *uint32, overlapped **Overlapped, timeout uint32) (err error) +//sys PostQueuedCompletionStatus(cphandle Handle, qty uint32, key uint32, overlapped *Overlapped) (err error) +//sys CancelIo(s Handle) (err error) +//sys CancelIoEx(s Handle, o *Overlapped) (err error) +//sys CreateProcess(appName *uint16, commandLine *uint16, procSecurity *SecurityAttributes, threadSecurity *SecurityAttributes, inheritHandles bool, creationFlags uint32, env *uint16, currentDir *uint16, startupInfo *StartupInfo, outProcInfo *ProcessInformation) (err error) = CreateProcessW +//sys OpenProcess(da uint32, inheritHandle bool, pid uint32) (handle Handle, err error) +//sys TerminateProcess(handle Handle, exitcode uint32) (err error) +//sys GetExitCodeProcess(handle Handle, exitcode *uint32) (err error) +//sys GetStartupInfo(startupInfo *StartupInfo) (err error) = GetStartupInfoW +//sys GetCurrentProcess() (pseudoHandle Handle, err error) +//sys GetProcessTimes(handle Handle, creationTime *Filetime, exitTime *Filetime, kernelTime *Filetime, userTime *Filetime) (err error) +//sys DuplicateHandle(hSourceProcessHandle Handle, hSourceHandle Handle, hTargetProcessHandle Handle, lpTargetHandle *Handle, dwDesiredAccess uint32, bInheritHandle bool, dwOptions uint32) (err error) +//sys WaitForSingleObject(handle Handle, waitMilliseconds uint32) (event uint32, err error) [failretval==0xffffffff] +//sys GetTempPath(buflen uint32, buf *uint16) (n uint32, err error) = GetTempPathW +//sys CreatePipe(readhandle *Handle, writehandle *Handle, sa *SecurityAttributes, size uint32) (err error) +//sys GetFileType(filehandle Handle) (n uint32, err error) +//sys CryptAcquireContext(provhandle *Handle, container *uint16, provider *uint16, provtype uint32, flags uint32) (err error) = advapi32.CryptAcquireContextW +//sys CryptReleaseContext(provhandle Handle, flags uint32) (err error) = advapi32.CryptReleaseContext +//sys CryptGenRandom(provhandle Handle, buflen uint32, buf *byte) (err error) = advapi32.CryptGenRandom +//sys GetEnvironmentStrings() (envs *uint16, err error) [failretval==nil] = kernel32.GetEnvironmentStringsW +//sys FreeEnvironmentStrings(envs *uint16) (err error) = kernel32.FreeEnvironmentStringsW +//sys GetEnvironmentVariable(name *uint16, buffer *uint16, size uint32) (n uint32, err error) = kernel32.GetEnvironmentVariableW +//sys SetEnvironmentVariable(name *uint16, value *uint16) (err error) = kernel32.SetEnvironmentVariableW +//sys SetFileTime(handle Handle, ctime *Filetime, atime *Filetime, wtime *Filetime) (err error) +//sys GetFileAttributes(name *uint16) (attrs uint32, err error) [failretval==INVALID_FILE_ATTRIBUTES] = kernel32.GetFileAttributesW +//sys SetFileAttributes(name *uint16, attrs uint32) (err error) = kernel32.SetFileAttributesW +//sys GetFileAttributesEx(name *uint16, level uint32, info *byte) (err error) = kernel32.GetFileAttributesExW +//sys GetCommandLine() (cmd *uint16) = kernel32.GetCommandLineW +//sys CommandLineToArgv(cmd *uint16, argc *int32) (argv *[8192]*[8192]uint16, err error) [failretval==nil] = shell32.CommandLineToArgvW +//sys LocalFree(hmem Handle) (handle Handle, err error) [failretval!=0] +//sys SetHandleInformation(handle Handle, mask uint32, flags uint32) (err error) +//sys FlushFileBuffers(handle Handle) (err error) +//sys GetFullPathName(path *uint16, buflen uint32, buf *uint16, fname **uint16) (n uint32, err error) = kernel32.GetFullPathNameW +//sys GetLongPathName(path *uint16, buf *uint16, buflen uint32) (n uint32, err error) = kernel32.GetLongPathNameW +//sys GetShortPathName(longpath *uint16, shortpath *uint16, buflen uint32) (n uint32, err error) = kernel32.GetShortPathNameW +//sys CreateFileMapping(fhandle Handle, sa *SecurityAttributes, prot uint32, maxSizeHigh uint32, maxSizeLow uint32, name *uint16) (handle Handle, err error) = kernel32.CreateFileMappingW +//sys MapViewOfFile(handle Handle, access uint32, offsetHigh uint32, offsetLow uint32, length uintptr) (addr uintptr, err error) +//sys UnmapViewOfFile(addr uintptr) (err error) +//sys FlushViewOfFile(addr uintptr, length uintptr) (err error) +//sys VirtualLock(addr uintptr, length uintptr) (err error) +//sys VirtualUnlock(addr uintptr, length uintptr) (err error) +//sys VirtualAlloc(address uintptr, size uintptr, alloctype uint32, protect uint32) (value uintptr, err error) = kernel32.VirtualAlloc +//sys VirtualFree(address uintptr, size uintptr, freetype uint32) (err error) = kernel32.VirtualFree +//sys VirtualProtect(address uintptr, size uintptr, newprotect uint32, oldprotect *uint32) (err error) = kernel32.VirtualProtect +//sys TransmitFile(s Handle, handle Handle, bytesToWrite uint32, bytsPerSend uint32, overlapped *Overlapped, transmitFileBuf *TransmitFileBuffers, flags uint32) (err error) = mswsock.TransmitFile +//sys ReadDirectoryChanges(handle Handle, buf *byte, buflen uint32, watchSubTree bool, mask uint32, retlen *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) = kernel32.ReadDirectoryChangesW +//sys CertOpenSystemStore(hprov Handle, name *uint16) (store Handle, err error) = crypt32.CertOpenSystemStoreW +//sys CertOpenStore(storeProvider uintptr, msgAndCertEncodingType uint32, cryptProv uintptr, flags uint32, para uintptr) (handle Handle, err error) [failretval==InvalidHandle] = crypt32.CertOpenStore +//sys CertEnumCertificatesInStore(store Handle, prevContext *CertContext) (context *CertContext, err error) [failretval==nil] = crypt32.CertEnumCertificatesInStore +//sys CertAddCertificateContextToStore(store Handle, certContext *CertContext, addDisposition uint32, storeContext **CertContext) (err error) = crypt32.CertAddCertificateContextToStore +//sys CertCloseStore(store Handle, flags uint32) (err error) = crypt32.CertCloseStore +//sys CertGetCertificateChain(engine Handle, leaf *CertContext, time *Filetime, additionalStore Handle, para *CertChainPara, flags uint32, reserved uintptr, chainCtx **CertChainContext) (err error) = crypt32.CertGetCertificateChain +//sys CertFreeCertificateChain(ctx *CertChainContext) = crypt32.CertFreeCertificateChain +//sys CertCreateCertificateContext(certEncodingType uint32, certEncoded *byte, encodedLen uint32) (context *CertContext, err error) [failretval==nil] = crypt32.CertCreateCertificateContext +//sys CertFreeCertificateContext(ctx *CertContext) (err error) = crypt32.CertFreeCertificateContext +//sys CertVerifyCertificateChainPolicy(policyOID uintptr, chain *CertChainContext, para *CertChainPolicyPara, status *CertChainPolicyStatus) (err error) = crypt32.CertVerifyCertificateChainPolicy +//sys RegOpenKeyEx(key Handle, subkey *uint16, options uint32, desiredAccess uint32, result *Handle) (regerrno error) = advapi32.RegOpenKeyExW +//sys RegCloseKey(key Handle) (regerrno error) = advapi32.RegCloseKey +//sys RegQueryInfoKey(key Handle, class *uint16, classLen *uint32, reserved *uint32, subkeysLen *uint32, maxSubkeyLen *uint32, maxClassLen *uint32, valuesLen *uint32, maxValueNameLen *uint32, maxValueLen *uint32, saLen *uint32, lastWriteTime *Filetime) (regerrno error) = advapi32.RegQueryInfoKeyW +//sys RegEnumKeyEx(key Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, class *uint16, classLen *uint32, lastWriteTime *Filetime) (regerrno error) = advapi32.RegEnumKeyExW +//sys RegQueryValueEx(key Handle, name *uint16, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) = advapi32.RegQueryValueExW +//sys getCurrentProcessId() (pid uint32) = kernel32.GetCurrentProcessId +//sys GetConsoleMode(console Handle, mode *uint32) (err error) = kernel32.GetConsoleMode +//sys SetConsoleMode(console Handle, mode uint32) (err error) = kernel32.SetConsoleMode +//sys GetConsoleScreenBufferInfo(console Handle, info *ConsoleScreenBufferInfo) (err error) = kernel32.GetConsoleScreenBufferInfo +//sys WriteConsole(console Handle, buf *uint16, towrite uint32, written *uint32, reserved *byte) (err error) = kernel32.WriteConsoleW +//sys ReadConsole(console Handle, buf *uint16, toread uint32, read *uint32, inputControl *byte) (err error) = kernel32.ReadConsoleW +//sys CreateToolhelp32Snapshot(flags uint32, processId uint32) (handle Handle, err error) [failretval==InvalidHandle] = kernel32.CreateToolhelp32Snapshot +//sys Process32First(snapshot Handle, procEntry *ProcessEntry32) (err error) = kernel32.Process32FirstW +//sys Process32Next(snapshot Handle, procEntry *ProcessEntry32) (err error) = kernel32.Process32NextW +//sys DeviceIoControl(handle Handle, ioControlCode uint32, inBuffer *byte, inBufferSize uint32, outBuffer *byte, outBufferSize uint32, bytesReturned *uint32, overlapped *Overlapped) (err error) +// This function returns 1 byte BOOLEAN rather than the 4 byte BOOL. +//sys CreateSymbolicLink(symlinkfilename *uint16, targetfilename *uint16, flags uint32) (err error) [failretval&0xff==0] = CreateSymbolicLinkW +//sys CreateHardLink(filename *uint16, existingfilename *uint16, reserved uintptr) (err error) [failretval&0xff==0] = CreateHardLinkW +//sys GetCurrentThreadId() (id uint32) +//sys CreateEvent(eventAttrs *SecurityAttributes, manualReset uint32, initialState uint32, name *uint16) (handle Handle, err error) = kernel32.CreateEventW +//sys CreateEventEx(eventAttrs *SecurityAttributes, name *uint16, flags uint32, desiredAccess uint32) (handle Handle, err error) = kernel32.CreateEventExW +//sys OpenEvent(desiredAccess uint32, inheritHandle bool, name *uint16) (handle Handle, err error) = kernel32.OpenEventW +//sys SetEvent(event Handle) (err error) = kernel32.SetEvent +//sys ResetEvent(event Handle) (err error) = kernel32.ResetEvent +//sys PulseEvent(event Handle) (err error) = kernel32.PulseEvent + +// syscall interface implementation for other packages + +func Exit(code int) { ExitProcess(uint32(code)) } + +func makeInheritSa() *SecurityAttributes { + var sa SecurityAttributes + sa.Length = uint32(unsafe.Sizeof(sa)) + sa.InheritHandle = 1 + return &sa +} + +func Open(path string, mode int, perm uint32) (fd Handle, err error) { + if len(path) == 0 { + return InvalidHandle, ERROR_FILE_NOT_FOUND + } + pathp, err := UTF16PtrFromString(path) + if err != nil { + return InvalidHandle, err + } + var access uint32 + switch mode & (O_RDONLY | O_WRONLY | O_RDWR) { + case O_RDONLY: + access = GENERIC_READ + case O_WRONLY: + access = GENERIC_WRITE + case O_RDWR: + access = GENERIC_READ | GENERIC_WRITE + } + if mode&O_CREAT != 0 { + access |= GENERIC_WRITE + } + if mode&O_APPEND != 0 { + access &^= GENERIC_WRITE + access |= FILE_APPEND_DATA + } + sharemode := uint32(FILE_SHARE_READ | FILE_SHARE_WRITE) + var sa *SecurityAttributes + if mode&O_CLOEXEC == 0 { + sa = makeInheritSa() + } + var createmode uint32 + switch { + case mode&(O_CREAT|O_EXCL) == (O_CREAT | O_EXCL): + createmode = CREATE_NEW + case mode&(O_CREAT|O_TRUNC) == (O_CREAT | O_TRUNC): + createmode = CREATE_ALWAYS + case mode&O_CREAT == O_CREAT: + createmode = OPEN_ALWAYS + case mode&O_TRUNC == O_TRUNC: + createmode = TRUNCATE_EXISTING + default: + createmode = OPEN_EXISTING + } + h, e := CreateFile(pathp, access, sharemode, sa, createmode, FILE_ATTRIBUTE_NORMAL, 0) + return h, e +} + +func Read(fd Handle, p []byte) (n int, err error) { + var done uint32 + e := ReadFile(fd, p, &done, nil) + if e != nil { + if e == ERROR_BROKEN_PIPE { + // NOTE(brainman): work around ERROR_BROKEN_PIPE is returned on reading EOF from stdin + return 0, nil + } + return 0, e + } + if raceenabled { + if done > 0 { + raceWriteRange(unsafe.Pointer(&p[0]), int(done)) + } + raceAcquire(unsafe.Pointer(&ioSync)) + } + return int(done), nil +} + +func Write(fd Handle, p []byte) (n int, err error) { + if raceenabled { + raceReleaseMerge(unsafe.Pointer(&ioSync)) + } + var done uint32 + e := WriteFile(fd, p, &done, nil) + if e != nil { + return 0, e + } + if raceenabled && done > 0 { + raceReadRange(unsafe.Pointer(&p[0]), int(done)) + } + return int(done), nil +} + +var ioSync int64 + +func Seek(fd Handle, offset int64, whence int) (newoffset int64, err error) { + var w uint32 + switch whence { + case 0: + w = FILE_BEGIN + case 1: + w = FILE_CURRENT + case 2: + w = FILE_END + } + hi := int32(offset >> 32) + lo := int32(offset) + // use GetFileType to check pipe, pipe can't do seek + ft, _ := GetFileType(fd) + if ft == FILE_TYPE_PIPE { + return 0, syscall.EPIPE + } + rlo, e := SetFilePointer(fd, lo, &hi, w) + if e != nil { + return 0, e + } + return int64(hi)<<32 + int64(rlo), nil +} + +func Close(fd Handle) (err error) { + return CloseHandle(fd) +} + +var ( + Stdin = getStdHandle(STD_INPUT_HANDLE) + Stdout = getStdHandle(STD_OUTPUT_HANDLE) + Stderr = getStdHandle(STD_ERROR_HANDLE) +) + +func getStdHandle(stdhandle uint32) (fd Handle) { + r, _ := GetStdHandle(stdhandle) + CloseOnExec(r) + return r +} + +const ImplementsGetwd = true + +func Getwd() (wd string, err error) { + b := make([]uint16, 300) + n, e := GetCurrentDirectory(uint32(len(b)), &b[0]) + if e != nil { + return "", e + } + return string(utf16.Decode(b[0:n])), nil +} + +func Chdir(path string) (err error) { + pathp, err := UTF16PtrFromString(path) + if err != nil { + return err + } + return SetCurrentDirectory(pathp) +} + +func Mkdir(path string, mode uint32) (err error) { + pathp, err := UTF16PtrFromString(path) + if err != nil { + return err + } + return CreateDirectory(pathp, nil) +} + +func Rmdir(path string) (err error) { + pathp, err := UTF16PtrFromString(path) + if err != nil { + return err + } + return RemoveDirectory(pathp) +} + +func Unlink(path string) (err error) { + pathp, err := UTF16PtrFromString(path) + if err != nil { + return err + } + return DeleteFile(pathp) +} + +func Rename(oldpath, newpath string) (err error) { + from, err := UTF16PtrFromString(oldpath) + if err != nil { + return err + } + to, err := UTF16PtrFromString(newpath) + if err != nil { + return err + } + return MoveFileEx(from, to, MOVEFILE_REPLACE_EXISTING) +} + +func ComputerName() (name string, err error) { + var n uint32 = MAX_COMPUTERNAME_LENGTH + 1 + b := make([]uint16, n) + e := GetComputerName(&b[0], &n) + if e != nil { + return "", e + } + return string(utf16.Decode(b[0:n])), nil +} + +func Ftruncate(fd Handle, length int64) (err error) { + curoffset, e := Seek(fd, 0, 1) + if e != nil { + return e + } + defer Seek(fd, curoffset, 0) + _, e = Seek(fd, length, 0) + if e != nil { + return e + } + e = SetEndOfFile(fd) + if e != nil { + return e + } + return nil +} + +func Gettimeofday(tv *Timeval) (err error) { + var ft Filetime + GetSystemTimeAsFileTime(&ft) + *tv = NsecToTimeval(ft.Nanoseconds()) + return nil +} + +func Pipe(p []Handle) (err error) { + if len(p) != 2 { + return syscall.EINVAL + } + var r, w Handle + e := CreatePipe(&r, &w, makeInheritSa(), 0) + if e != nil { + return e + } + p[0] = r + p[1] = w + return nil +} + +func Utimes(path string, tv []Timeval) (err error) { + if len(tv) != 2 { + return syscall.EINVAL + } + pathp, e := UTF16PtrFromString(path) + if e != nil { + return e + } + h, e := CreateFile(pathp, + FILE_WRITE_ATTRIBUTES, FILE_SHARE_WRITE, nil, + OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0) + if e != nil { + return e + } + defer Close(h) + a := NsecToFiletime(tv[0].Nanoseconds()) + w := NsecToFiletime(tv[1].Nanoseconds()) + return SetFileTime(h, nil, &a, &w) +} + +func UtimesNano(path string, ts []Timespec) (err error) { + if len(ts) != 2 { + return syscall.EINVAL + } + pathp, e := UTF16PtrFromString(path) + if e != nil { + return e + } + h, e := CreateFile(pathp, + FILE_WRITE_ATTRIBUTES, FILE_SHARE_WRITE, nil, + OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0) + if e != nil { + return e + } + defer Close(h) + a := NsecToFiletime(TimespecToNsec(ts[0])) + w := NsecToFiletime(TimespecToNsec(ts[1])) + return SetFileTime(h, nil, &a, &w) +} + +func Fsync(fd Handle) (err error) { + return FlushFileBuffers(fd) +} + +func Chmod(path string, mode uint32) (err error) { + if mode == 0 { + return syscall.EINVAL + } + p, e := UTF16PtrFromString(path) + if e != nil { + return e + } + attrs, e := GetFileAttributes(p) + if e != nil { + return e + } + if mode&S_IWRITE != 0 { + attrs &^= FILE_ATTRIBUTE_READONLY + } else { + attrs |= FILE_ATTRIBUTE_READONLY + } + return SetFileAttributes(p, attrs) +} + +func LoadGetSystemTimePreciseAsFileTime() error { + return procGetSystemTimePreciseAsFileTime.Find() +} + +func LoadCancelIoEx() error { + return procCancelIoEx.Find() +} + +func LoadSetFileCompletionNotificationModes() error { + return procSetFileCompletionNotificationModes.Find() +} + +// net api calls + +const socket_error = uintptr(^uint32(0)) + +//sys WSAStartup(verreq uint32, data *WSAData) (sockerr error) = ws2_32.WSAStartup +//sys WSACleanup() (err error) [failretval==socket_error] = ws2_32.WSACleanup +//sys WSAIoctl(s Handle, iocc uint32, inbuf *byte, cbif uint32, outbuf *byte, cbob uint32, cbbr *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) [failretval==socket_error] = ws2_32.WSAIoctl +//sys socket(af int32, typ int32, protocol int32) (handle Handle, err error) [failretval==InvalidHandle] = ws2_32.socket +//sys Setsockopt(s Handle, level int32, optname int32, optval *byte, optlen int32) (err error) [failretval==socket_error] = ws2_32.setsockopt +//sys Getsockopt(s Handle, level int32, optname int32, optval *byte, optlen *int32) (err error) [failretval==socket_error] = ws2_32.getsockopt +//sys bind(s Handle, name unsafe.Pointer, namelen int32) (err error) [failretval==socket_error] = ws2_32.bind +//sys connect(s Handle, name unsafe.Pointer, namelen int32) (err error) [failretval==socket_error] = ws2_32.connect +//sys getsockname(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) [failretval==socket_error] = ws2_32.getsockname +//sys getpeername(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) [failretval==socket_error] = ws2_32.getpeername +//sys listen(s Handle, backlog int32) (err error) [failretval==socket_error] = ws2_32.listen +//sys shutdown(s Handle, how int32) (err error) [failretval==socket_error] = ws2_32.shutdown +//sys Closesocket(s Handle) (err error) [failretval==socket_error] = ws2_32.closesocket +//sys AcceptEx(ls Handle, as Handle, buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, recvd *uint32, overlapped *Overlapped) (err error) = mswsock.AcceptEx +//sys GetAcceptExSockaddrs(buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, lrsa **RawSockaddrAny, lrsalen *int32, rrsa **RawSockaddrAny, rrsalen *int32) = mswsock.GetAcceptExSockaddrs +//sys WSARecv(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSARecv +//sys WSASend(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSASend +//sys WSARecvFrom(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, from *RawSockaddrAny, fromlen *int32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSARecvFrom +//sys WSASendTo(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, to *RawSockaddrAny, tolen int32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSASendTo +//sys GetHostByName(name string) (h *Hostent, err error) [failretval==nil] = ws2_32.gethostbyname +//sys GetServByName(name string, proto string) (s *Servent, err error) [failretval==nil] = ws2_32.getservbyname +//sys Ntohs(netshort uint16) (u uint16) = ws2_32.ntohs +//sys GetProtoByName(name string) (p *Protoent, err error) [failretval==nil] = ws2_32.getprotobyname +//sys DnsQuery(name string, qtype uint16, options uint32, extra *byte, qrs **DNSRecord, pr *byte) (status error) = dnsapi.DnsQuery_W +//sys DnsRecordListFree(rl *DNSRecord, freetype uint32) = dnsapi.DnsRecordListFree +//sys DnsNameCompare(name1 *uint16, name2 *uint16) (same bool) = dnsapi.DnsNameCompare_W +//sys GetAddrInfoW(nodename *uint16, servicename *uint16, hints *AddrinfoW, result **AddrinfoW) (sockerr error) = ws2_32.GetAddrInfoW +//sys FreeAddrInfoW(addrinfo *AddrinfoW) = ws2_32.FreeAddrInfoW +//sys GetIfEntry(pIfRow *MibIfRow) (errcode error) = iphlpapi.GetIfEntry +//sys GetAdaptersInfo(ai *IpAdapterInfo, ol *uint32) (errcode error) = iphlpapi.GetAdaptersInfo +//sys SetFileCompletionNotificationModes(handle Handle, flags uint8) (err error) = kernel32.SetFileCompletionNotificationModes +//sys WSAEnumProtocols(protocols *int32, protocolBuffer *WSAProtocolInfo, bufferLength *uint32) (n int32, err error) [failretval==-1] = ws2_32.WSAEnumProtocolsW +//sys GetAdaptersAddresses(family uint32, flags uint32, reserved uintptr, adapterAddresses *IpAdapterAddresses, sizePointer *uint32) (errcode error) = iphlpapi.GetAdaptersAddresses +//sys GetACP() (acp uint32) = kernel32.GetACP +//sys MultiByteToWideChar(codePage uint32, dwFlags uint32, str *byte, nstr int32, wchar *uint16, nwchar int32) (nwrite int32, err error) = kernel32.MultiByteToWideChar + +// For testing: clients can set this flag to force +// creation of IPv6 sockets to return EAFNOSUPPORT. +var SocketDisableIPv6 bool + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type Sockaddr interface { + sockaddr() (ptr unsafe.Pointer, len int32, err error) // lowercase; only we can define Sockaddrs +} + +type SockaddrInet4 struct { + Port int + Addr [4]byte + raw RawSockaddrInet4 +} + +func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, int32, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, syscall.EINVAL + } + sa.raw.Family = AF_INET + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), int32(unsafe.Sizeof(sa.raw)), nil +} + +type SockaddrInet6 struct { + Port int + ZoneId uint32 + Addr [16]byte + raw RawSockaddrInet6 +} + +func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, int32, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, syscall.EINVAL + } + sa.raw.Family = AF_INET6 + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + sa.raw.Scope_id = sa.ZoneId + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), int32(unsafe.Sizeof(sa.raw)), nil +} + +type SockaddrUnix struct { + Name string +} + +func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, int32, error) { + // TODO(brainman): implement SockaddrUnix.sockaddr() + return nil, 0, syscall.EWINDOWS +} + +func (rsa *RawSockaddrAny) Sockaddr() (Sockaddr, error) { + switch rsa.Addr.Family { + case AF_UNIX: + return nil, syscall.EWINDOWS + + case AF_INET: + pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet4) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + + case AF_INET6: + pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet6) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + sa.ZoneId = pp.Scope_id + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + } + return nil, syscall.EAFNOSUPPORT +} + +func Socket(domain, typ, proto int) (fd Handle, err error) { + if domain == AF_INET6 && SocketDisableIPv6 { + return InvalidHandle, syscall.EAFNOSUPPORT + } + return socket(int32(domain), int32(typ), int32(proto)) +} + +func SetsockoptInt(fd Handle, level, opt int, value int) (err error) { + v := int32(value) + return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(&v)), int32(unsafe.Sizeof(v))) +} + +func Bind(fd Handle, sa Sockaddr) (err error) { + ptr, n, err := sa.sockaddr() + if err != nil { + return err + } + return bind(fd, ptr, n) +} + +func Connect(fd Handle, sa Sockaddr) (err error) { + ptr, n, err := sa.sockaddr() + if err != nil { + return err + } + return connect(fd, ptr, n) +} + +func Getsockname(fd Handle) (sa Sockaddr, err error) { + var rsa RawSockaddrAny + l := int32(unsafe.Sizeof(rsa)) + if err = getsockname(fd, &rsa, &l); err != nil { + return + } + return rsa.Sockaddr() +} + +func Getpeername(fd Handle) (sa Sockaddr, err error) { + var rsa RawSockaddrAny + l := int32(unsafe.Sizeof(rsa)) + if err = getpeername(fd, &rsa, &l); err != nil { + return + } + return rsa.Sockaddr() +} + +func Listen(s Handle, n int) (err error) { + return listen(s, int32(n)) +} + +func Shutdown(fd Handle, how int) (err error) { + return shutdown(fd, int32(how)) +} + +func WSASendto(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, to Sockaddr, overlapped *Overlapped, croutine *byte) (err error) { + rsa, l, err := to.sockaddr() + if err != nil { + return err + } + return WSASendTo(s, bufs, bufcnt, sent, flags, (*RawSockaddrAny)(unsafe.Pointer(rsa)), l, overlapped, croutine) +} + +func LoadGetAddrInfo() error { + return procGetAddrInfoW.Find() +} + +var connectExFunc struct { + once sync.Once + addr uintptr + err error +} + +func LoadConnectEx() error { + connectExFunc.once.Do(func() { + var s Handle + s, connectExFunc.err = Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) + if connectExFunc.err != nil { + return + } + defer CloseHandle(s) + var n uint32 + connectExFunc.err = WSAIoctl(s, + SIO_GET_EXTENSION_FUNCTION_POINTER, + (*byte)(unsafe.Pointer(&WSAID_CONNECTEX)), + uint32(unsafe.Sizeof(WSAID_CONNECTEX)), + (*byte)(unsafe.Pointer(&connectExFunc.addr)), + uint32(unsafe.Sizeof(connectExFunc.addr)), + &n, nil, 0) + }) + return connectExFunc.err +} + +func connectEx(s Handle, name unsafe.Pointer, namelen int32, sendBuf *byte, sendDataLen uint32, bytesSent *uint32, overlapped *Overlapped) (err error) { + r1, _, e1 := syscall.Syscall9(connectExFunc.addr, 7, uintptr(s), uintptr(name), uintptr(namelen), uintptr(unsafe.Pointer(sendBuf)), uintptr(sendDataLen), uintptr(unsafe.Pointer(bytesSent)), uintptr(unsafe.Pointer(overlapped)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = error(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ConnectEx(fd Handle, sa Sockaddr, sendBuf *byte, sendDataLen uint32, bytesSent *uint32, overlapped *Overlapped) error { + err := LoadConnectEx() + if err != nil { + return errorspkg.New("failed to find ConnectEx: " + err.Error()) + } + ptr, n, err := sa.sockaddr() + if err != nil { + return err + } + return connectEx(fd, ptr, n, sendBuf, sendDataLen, bytesSent, overlapped) +} + +// Invented structures to support what package os expects. +type Rusage struct { + CreationTime Filetime + ExitTime Filetime + KernelTime Filetime + UserTime Filetime +} + +type WaitStatus struct { + ExitCode uint32 +} + +func (w WaitStatus) Exited() bool { return true } + +func (w WaitStatus) ExitStatus() int { return int(w.ExitCode) } + +func (w WaitStatus) Signal() Signal { return -1 } + +func (w WaitStatus) CoreDump() bool { return false } + +func (w WaitStatus) Stopped() bool { return false } + +func (w WaitStatus) Continued() bool { return false } + +func (w WaitStatus) StopSignal() Signal { return -1 } + +func (w WaitStatus) Signaled() bool { return false } + +func (w WaitStatus) TrapCause() int { return -1 } + +// Timespec is an invented structure on Windows, but here for +// consistency with the corresponding package for other operating systems. +type Timespec struct { + Sec int64 + Nsec int64 +} + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = nsec / 1e9 + ts.Nsec = nsec % 1e9 + return +} + +// TODO(brainman): fix all needed for net + +func Accept(fd Handle) (nfd Handle, sa Sockaddr, err error) { return 0, nil, syscall.EWINDOWS } +func Recvfrom(fd Handle, p []byte, flags int) (n int, from Sockaddr, err error) { + return 0, nil, syscall.EWINDOWS +} +func Sendto(fd Handle, p []byte, flags int, to Sockaddr) (err error) { return syscall.EWINDOWS } +func SetsockoptTimeval(fd Handle, level, opt int, tv *Timeval) (err error) { return syscall.EWINDOWS } + +// The Linger struct is wrong but we only noticed after Go 1. +// sysLinger is the real system call structure. + +// BUG(brainman): The definition of Linger is not appropriate for direct use +// with Setsockopt and Getsockopt. +// Use SetsockoptLinger instead. + +type Linger struct { + Onoff int32 + Linger int32 +} + +type sysLinger struct { + Onoff uint16 + Linger uint16 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +func GetsockoptInt(fd Handle, level, opt int) (int, error) { return -1, syscall.EWINDOWS } + +func SetsockoptLinger(fd Handle, level, opt int, l *Linger) (err error) { + sys := sysLinger{Onoff: uint16(l.Onoff), Linger: uint16(l.Linger)} + return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(&sys)), int32(unsafe.Sizeof(sys))) +} + +func SetsockoptInet4Addr(fd Handle, level, opt int, value [4]byte) (err error) { + return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(&value[0])), 4) +} +func SetsockoptIPMreq(fd Handle, level, opt int, mreq *IPMreq) (err error) { + return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(mreq)), int32(unsafe.Sizeof(*mreq))) +} +func SetsockoptIPv6Mreq(fd Handle, level, opt int, mreq *IPv6Mreq) (err error) { + return syscall.EWINDOWS +} + +func Getpid() (pid int) { return int(getCurrentProcessId()) } + +func FindFirstFile(name *uint16, data *Win32finddata) (handle Handle, err error) { + // NOTE(rsc): The Win32finddata struct is wrong for the system call: + // the two paths are each one uint16 short. Use the correct struct, + // a win32finddata1, and then copy the results out. + // There is no loss of expressivity here, because the final + // uint16, if it is used, is supposed to be a NUL, and Go doesn't need that. + // For Go 1.1, we might avoid the allocation of win32finddata1 here + // by adding a final Bug [2]uint16 field to the struct and then + // adjusting the fields in the result directly. + var data1 win32finddata1 + handle, err = findFirstFile1(name, &data1) + if err == nil { + copyFindData(data, &data1) + } + return +} + +func FindNextFile(handle Handle, data *Win32finddata) (err error) { + var data1 win32finddata1 + err = findNextFile1(handle, &data1) + if err == nil { + copyFindData(data, &data1) + } + return +} + +func getProcessEntry(pid int) (*ProcessEntry32, error) { + snapshot, err := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0) + if err != nil { + return nil, err + } + defer CloseHandle(snapshot) + var procEntry ProcessEntry32 + procEntry.Size = uint32(unsafe.Sizeof(procEntry)) + if err = Process32First(snapshot, &procEntry); err != nil { + return nil, err + } + for { + if procEntry.ProcessID == uint32(pid) { + return &procEntry, nil + } + err = Process32Next(snapshot, &procEntry) + if err != nil { + return nil, err + } + } +} + +func Getppid() (ppid int) { + pe, err := getProcessEntry(Getpid()) + if err != nil { + return -1 + } + return int(pe.ParentProcessID) +} + +// TODO(brainman): fix all needed for os +func Fchdir(fd Handle) (err error) { return syscall.EWINDOWS } +func Link(oldpath, newpath string) (err error) { return syscall.EWINDOWS } +func Symlink(path, link string) (err error) { return syscall.EWINDOWS } + +func Fchmod(fd Handle, mode uint32) (err error) { return syscall.EWINDOWS } +func Chown(path string, uid int, gid int) (err error) { return syscall.EWINDOWS } +func Lchown(path string, uid int, gid int) (err error) { return syscall.EWINDOWS } +func Fchown(fd Handle, uid int, gid int) (err error) { return syscall.EWINDOWS } + +func Getuid() (uid int) { return -1 } +func Geteuid() (euid int) { return -1 } +func Getgid() (gid int) { return -1 } +func Getegid() (egid int) { return -1 } +func Getgroups() (gids []int, err error) { return nil, syscall.EWINDOWS } + +type Signal int + +func (s Signal) Signal() {} + +func (s Signal) String() string { + if 0 <= s && int(s) < len(signals) { + str := signals[s] + if str != "" { + return str + } + } + return "signal " + itoa(int(s)) +} + +func LoadCreateSymbolicLink() error { + return procCreateSymbolicLinkW.Find() +} + +// Readlink returns the destination of the named symbolic link. +func Readlink(path string, buf []byte) (n int, err error) { + fd, err := CreateFile(StringToUTF16Ptr(path), GENERIC_READ, 0, nil, OPEN_EXISTING, + FILE_FLAG_OPEN_REPARSE_POINT|FILE_FLAG_BACKUP_SEMANTICS, 0) + if err != nil { + return -1, err + } + defer CloseHandle(fd) + + rdbbuf := make([]byte, MAXIMUM_REPARSE_DATA_BUFFER_SIZE) + var bytesReturned uint32 + err = DeviceIoControl(fd, FSCTL_GET_REPARSE_POINT, nil, 0, &rdbbuf[0], uint32(len(rdbbuf)), &bytesReturned, nil) + if err != nil { + return -1, err + } + + rdb := (*reparseDataBuffer)(unsafe.Pointer(&rdbbuf[0])) + var s string + switch rdb.ReparseTag { + case IO_REPARSE_TAG_SYMLINK: + data := (*symbolicLinkReparseBuffer)(unsafe.Pointer(&rdb.reparseBuffer)) + p := (*[0xffff]uint16)(unsafe.Pointer(&data.PathBuffer[0])) + s = UTF16ToString(p[data.PrintNameOffset/2 : (data.PrintNameLength-data.PrintNameOffset)/2]) + case IO_REPARSE_TAG_MOUNT_POINT: + data := (*mountPointReparseBuffer)(unsafe.Pointer(&rdb.reparseBuffer)) + p := (*[0xffff]uint16)(unsafe.Pointer(&data.PathBuffer[0])) + s = UTF16ToString(p[data.PrintNameOffset/2 : (data.PrintNameLength-data.PrintNameOffset)/2]) + default: + // the path is not a symlink or junction but another type of reparse + // point + return -1, syscall.ENOENT + } + n = copy(buf, []byte(s)) + + return n, nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/syscall_windows_test.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/syscall_windows_test.go new file mode 100644 index 0000000..0f73c11 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/syscall_windows_test.go @@ -0,0 +1,107 @@ +// 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 windows_test + +import ( + "io/ioutil" + "os" + "path/filepath" + "syscall" + "testing" + "unsafe" + + "golang.org/x/sys/windows" +) + +func TestWin32finddata(t *testing.T) { + dir, err := ioutil.TempDir("", "go-build") + if err != nil { + t.Fatalf("failed to create temp directory: %v", err) + } + defer os.RemoveAll(dir) + + path := filepath.Join(dir, "long_name.and_extension") + f, err := os.Create(path) + if err != nil { + t.Fatalf("failed to create %v: %v", path, err) + } + f.Close() + + type X struct { + fd windows.Win32finddata + got byte + pad [10]byte // to protect ourselves + + } + var want byte = 2 // it is unlikely to have this character in the filename + x := X{got: want} + + pathp, _ := windows.UTF16PtrFromString(path) + h, err := windows.FindFirstFile(pathp, &(x.fd)) + if err != nil { + t.Fatalf("FindFirstFile failed: %v", err) + } + err = windows.FindClose(h) + if err != nil { + t.Fatalf("FindClose failed: %v", err) + } + + if x.got != want { + t.Fatalf("memory corruption: want=%d got=%d", want, x.got) + } +} + +func TestFormatMessage(t *testing.T) { + dll := windows.MustLoadDLL("pdh.dll") + + pdhOpenQuery := func(datasrc *uint16, userdata uint32, query *windows.Handle) (errno uintptr) { + r0, _, _ := syscall.Syscall(dll.MustFindProc("PdhOpenQueryW").Addr(), 3, uintptr(unsafe.Pointer(datasrc)), uintptr(userdata), uintptr(unsafe.Pointer(query))) + return r0 + } + + pdhCloseQuery := func(query windows.Handle) (errno uintptr) { + r0, _, _ := syscall.Syscall(dll.MustFindProc("PdhCloseQuery").Addr(), 1, uintptr(query), 0, 0) + return r0 + } + + var q windows.Handle + name, err := windows.UTF16PtrFromString("no_such_source") + if err != nil { + t.Fatal(err) + } + errno := pdhOpenQuery(name, 0, &q) + if errno == 0 { + pdhCloseQuery(q) + t.Fatal("PdhOpenQuery succeeded, but expected to fail.") + } + + const flags uint32 = syscall.FORMAT_MESSAGE_FROM_HMODULE | syscall.FORMAT_MESSAGE_ARGUMENT_ARRAY | syscall.FORMAT_MESSAGE_IGNORE_INSERTS + buf := make([]uint16, 300) + _, err = windows.FormatMessage(flags, uintptr(dll.Handle), uint32(errno), 0, buf, nil) + if err != nil { + t.Fatal("FormatMessage for handle=%x and errno=%x failed: %v", dll.Handle, errno, err) + } +} + +func abort(funcname string, err error) { + panic(funcname + " failed: " + err.Error()) +} + +func ExampleLoadLibrary() { + h, err := windows.LoadLibrary("kernel32.dll") + if err != nil { + abort("LoadLibrary", err) + } + defer windows.FreeLibrary(h) + proc, err := windows.GetProcAddress(h, "GetVersion") + if err != nil { + abort("GetProcAddress", err) + } + r, _, _ := syscall.Syscall(uintptr(proc), 0, 0, 0, 0) + major := byte(r) + minor := uint8(r >> 8) + build := uint16(r >> 16) + print("windows version ", major, ".", minor, " (Build ", build, ")\n") +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/types_windows.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/types_windows.go new file mode 100644 index 0000000..401a5f2 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/types_windows.go @@ -0,0 +1,1282 @@ +// 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 windows + +import "syscall" + +const ( + // Windows errors. + ERROR_FILE_NOT_FOUND syscall.Errno = 2 + ERROR_PATH_NOT_FOUND syscall.Errno = 3 + ERROR_ACCESS_DENIED syscall.Errno = 5 + ERROR_NO_MORE_FILES syscall.Errno = 18 + ERROR_HANDLE_EOF syscall.Errno = 38 + ERROR_NETNAME_DELETED syscall.Errno = 64 + ERROR_FILE_EXISTS syscall.Errno = 80 + ERROR_BROKEN_PIPE syscall.Errno = 109 + ERROR_BUFFER_OVERFLOW syscall.Errno = 111 + ERROR_INSUFFICIENT_BUFFER syscall.Errno = 122 + ERROR_MOD_NOT_FOUND syscall.Errno = 126 + ERROR_PROC_NOT_FOUND syscall.Errno = 127 + ERROR_ALREADY_EXISTS syscall.Errno = 183 + ERROR_ENVVAR_NOT_FOUND syscall.Errno = 203 + ERROR_MORE_DATA syscall.Errno = 234 + ERROR_OPERATION_ABORTED syscall.Errno = 995 + ERROR_IO_PENDING syscall.Errno = 997 + ERROR_SERVICE_SPECIFIC_ERROR syscall.Errno = 1066 + ERROR_NOT_FOUND syscall.Errno = 1168 + ERROR_PRIVILEGE_NOT_HELD syscall.Errno = 1314 + WSAEACCES syscall.Errno = 10013 + WSAECONNRESET syscall.Errno = 10054 +) + +const ( + // Invented values to support what package os expects. + O_RDONLY = 0x00000 + O_WRONLY = 0x00001 + O_RDWR = 0x00002 + O_CREAT = 0x00040 + O_EXCL = 0x00080 + O_NOCTTY = 0x00100 + O_TRUNC = 0x00200 + O_NONBLOCK = 0x00800 + O_APPEND = 0x00400 + O_SYNC = 0x01000 + O_ASYNC = 0x02000 + O_CLOEXEC = 0x80000 +) + +const ( + // More invented values for signals + SIGHUP = Signal(0x1) + SIGINT = Signal(0x2) + SIGQUIT = Signal(0x3) + SIGILL = Signal(0x4) + SIGTRAP = Signal(0x5) + SIGABRT = Signal(0x6) + SIGBUS = Signal(0x7) + SIGFPE = Signal(0x8) + SIGKILL = Signal(0x9) + SIGSEGV = Signal(0xb) + SIGPIPE = Signal(0xd) + SIGALRM = Signal(0xe) + SIGTERM = Signal(0xf) +) + +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/breakpoint trap", + 6: "aborted", + 7: "bus error", + 8: "floating point exception", + 9: "killed", + 10: "user defined signal 1", + 11: "segmentation fault", + 12: "user defined signal 2", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", +} + +const ( + GENERIC_READ = 0x80000000 + GENERIC_WRITE = 0x40000000 + GENERIC_EXECUTE = 0x20000000 + GENERIC_ALL = 0x10000000 + + FILE_LIST_DIRECTORY = 0x00000001 + FILE_APPEND_DATA = 0x00000004 + FILE_WRITE_ATTRIBUTES = 0x00000100 + + FILE_SHARE_READ = 0x00000001 + FILE_SHARE_WRITE = 0x00000002 + FILE_SHARE_DELETE = 0x00000004 + FILE_ATTRIBUTE_READONLY = 0x00000001 + FILE_ATTRIBUTE_HIDDEN = 0x00000002 + FILE_ATTRIBUTE_SYSTEM = 0x00000004 + FILE_ATTRIBUTE_DIRECTORY = 0x00000010 + FILE_ATTRIBUTE_ARCHIVE = 0x00000020 + FILE_ATTRIBUTE_NORMAL = 0x00000080 + FILE_ATTRIBUTE_REPARSE_POINT = 0x00000400 + + INVALID_FILE_ATTRIBUTES = 0xffffffff + + CREATE_NEW = 1 + CREATE_ALWAYS = 2 + OPEN_EXISTING = 3 + OPEN_ALWAYS = 4 + TRUNCATE_EXISTING = 5 + + FILE_FLAG_OPEN_REPARSE_POINT = 0x00200000 + FILE_FLAG_BACKUP_SEMANTICS = 0x02000000 + FILE_FLAG_OVERLAPPED = 0x40000000 + + HANDLE_FLAG_INHERIT = 0x00000001 + STARTF_USESTDHANDLES = 0x00000100 + STARTF_USESHOWWINDOW = 0x00000001 + DUPLICATE_CLOSE_SOURCE = 0x00000001 + DUPLICATE_SAME_ACCESS = 0x00000002 + + STD_INPUT_HANDLE = -10 & (1<<32 - 1) + STD_OUTPUT_HANDLE = -11 & (1<<32 - 1) + STD_ERROR_HANDLE = -12 & (1<<32 - 1) + + FILE_BEGIN = 0 + FILE_CURRENT = 1 + FILE_END = 2 + + LANG_ENGLISH = 0x09 + SUBLANG_ENGLISH_US = 0x01 + + FORMAT_MESSAGE_ALLOCATE_BUFFER = 256 + FORMAT_MESSAGE_IGNORE_INSERTS = 512 + FORMAT_MESSAGE_FROM_STRING = 1024 + FORMAT_MESSAGE_FROM_HMODULE = 2048 + FORMAT_MESSAGE_FROM_SYSTEM = 4096 + FORMAT_MESSAGE_ARGUMENT_ARRAY = 8192 + FORMAT_MESSAGE_MAX_WIDTH_MASK = 255 + + MAX_PATH = 260 + MAX_LONG_PATH = 32768 + + MAX_COMPUTERNAME_LENGTH = 15 + + TIME_ZONE_ID_UNKNOWN = 0 + TIME_ZONE_ID_STANDARD = 1 + + TIME_ZONE_ID_DAYLIGHT = 2 + IGNORE = 0 + INFINITE = 0xffffffff + + WAIT_TIMEOUT = 258 + WAIT_ABANDONED = 0x00000080 + WAIT_OBJECT_0 = 0x00000000 + WAIT_FAILED = 0xFFFFFFFF + + CREATE_NEW_PROCESS_GROUP = 0x00000200 + CREATE_UNICODE_ENVIRONMENT = 0x00000400 + + PROCESS_TERMINATE = 1 + PROCESS_QUERY_INFORMATION = 0x00000400 + SYNCHRONIZE = 0x00100000 + + FILE_MAP_COPY = 0x01 + FILE_MAP_WRITE = 0x02 + FILE_MAP_READ = 0x04 + FILE_MAP_EXECUTE = 0x20 + + CTRL_C_EVENT = 0 + CTRL_BREAK_EVENT = 1 + + // Windows reserves errors >= 1<<29 for application use. + APPLICATION_ERROR = 1 << 29 +) + +const ( + // flags for CreateToolhelp32Snapshot + TH32CS_SNAPHEAPLIST = 0x01 + TH32CS_SNAPPROCESS = 0x02 + TH32CS_SNAPTHREAD = 0x04 + TH32CS_SNAPMODULE = 0x08 + TH32CS_SNAPMODULE32 = 0x10 + TH32CS_SNAPALL = TH32CS_SNAPHEAPLIST | TH32CS_SNAPMODULE | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD + TH32CS_INHERIT = 0x80000000 +) + +const ( + // filters for ReadDirectoryChangesW + FILE_NOTIFY_CHANGE_FILE_NAME = 0x001 + FILE_NOTIFY_CHANGE_DIR_NAME = 0x002 + FILE_NOTIFY_CHANGE_ATTRIBUTES = 0x004 + FILE_NOTIFY_CHANGE_SIZE = 0x008 + FILE_NOTIFY_CHANGE_LAST_WRITE = 0x010 + FILE_NOTIFY_CHANGE_LAST_ACCESS = 0x020 + FILE_NOTIFY_CHANGE_CREATION = 0x040 + FILE_NOTIFY_CHANGE_SECURITY = 0x100 +) + +const ( + // do not reorder + FILE_ACTION_ADDED = iota + 1 + FILE_ACTION_REMOVED + FILE_ACTION_MODIFIED + FILE_ACTION_RENAMED_OLD_NAME + FILE_ACTION_RENAMED_NEW_NAME +) + +const ( + // wincrypt.h + PROV_RSA_FULL = 1 + PROV_RSA_SIG = 2 + PROV_DSS = 3 + PROV_FORTEZZA = 4 + PROV_MS_EXCHANGE = 5 + PROV_SSL = 6 + PROV_RSA_SCHANNEL = 12 + PROV_DSS_DH = 13 + PROV_EC_ECDSA_SIG = 14 + PROV_EC_ECNRA_SIG = 15 + PROV_EC_ECDSA_FULL = 16 + PROV_EC_ECNRA_FULL = 17 + PROV_DH_SCHANNEL = 18 + PROV_SPYRUS_LYNKS = 20 + PROV_RNG = 21 + PROV_INTEL_SEC = 22 + PROV_REPLACE_OWF = 23 + PROV_RSA_AES = 24 + CRYPT_VERIFYCONTEXT = 0xF0000000 + CRYPT_NEWKEYSET = 0x00000008 + CRYPT_DELETEKEYSET = 0x00000010 + CRYPT_MACHINE_KEYSET = 0x00000020 + CRYPT_SILENT = 0x00000040 + CRYPT_DEFAULT_CONTAINER_OPTIONAL = 0x00000080 + + USAGE_MATCH_TYPE_AND = 0 + USAGE_MATCH_TYPE_OR = 1 + + X509_ASN_ENCODING = 0x00000001 + PKCS_7_ASN_ENCODING = 0x00010000 + + CERT_STORE_PROV_MEMORY = 2 + + CERT_STORE_ADD_ALWAYS = 4 + + CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG = 0x00000004 + + CERT_TRUST_NO_ERROR = 0x00000000 + CERT_TRUST_IS_NOT_TIME_VALID = 0x00000001 + CERT_TRUST_IS_REVOKED = 0x00000004 + CERT_TRUST_IS_NOT_SIGNATURE_VALID = 0x00000008 + CERT_TRUST_IS_NOT_VALID_FOR_USAGE = 0x00000010 + CERT_TRUST_IS_UNTRUSTED_ROOT = 0x00000020 + CERT_TRUST_REVOCATION_STATUS_UNKNOWN = 0x00000040 + CERT_TRUST_IS_CYCLIC = 0x00000080 + CERT_TRUST_INVALID_EXTENSION = 0x00000100 + CERT_TRUST_INVALID_POLICY_CONSTRAINTS = 0x00000200 + CERT_TRUST_INVALID_BASIC_CONSTRAINTS = 0x00000400 + CERT_TRUST_INVALID_NAME_CONSTRAINTS = 0x00000800 + CERT_TRUST_HAS_NOT_SUPPORTED_NAME_CONSTRAINT = 0x00001000 + CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT = 0x00002000 + CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT = 0x00004000 + CERT_TRUST_HAS_EXCLUDED_NAME_CONSTRAINT = 0x00008000 + CERT_TRUST_IS_OFFLINE_REVOCATION = 0x01000000 + CERT_TRUST_NO_ISSUANCE_CHAIN_POLICY = 0x02000000 + CERT_TRUST_IS_EXPLICIT_DISTRUST = 0x04000000 + CERT_TRUST_HAS_NOT_SUPPORTED_CRITICAL_EXT = 0x08000000 + + CERT_CHAIN_POLICY_BASE = 1 + CERT_CHAIN_POLICY_AUTHENTICODE = 2 + CERT_CHAIN_POLICY_AUTHENTICODE_TS = 3 + CERT_CHAIN_POLICY_SSL = 4 + CERT_CHAIN_POLICY_BASIC_CONSTRAINTS = 5 + CERT_CHAIN_POLICY_NT_AUTH = 6 + CERT_CHAIN_POLICY_MICROSOFT_ROOT = 7 + CERT_CHAIN_POLICY_EV = 8 + + CERT_E_EXPIRED = 0x800B0101 + CERT_E_ROLE = 0x800B0103 + CERT_E_PURPOSE = 0x800B0106 + CERT_E_UNTRUSTEDROOT = 0x800B0109 + CERT_E_CN_NO_MATCH = 0x800B010F + + AUTHTYPE_CLIENT = 1 + AUTHTYPE_SERVER = 2 +) + +var ( + OID_PKIX_KP_SERVER_AUTH = []byte("1.3.6.1.5.5.7.3.1\x00") + OID_SERVER_GATED_CRYPTO = []byte("1.3.6.1.4.1.311.10.3.3\x00") + OID_SGC_NETSCAPE = []byte("2.16.840.1.113730.4.1\x00") +) + +// Invented values to support what package os expects. +type Timeval struct { + Sec int32 + Usec int32 +} + +func (tv *Timeval) Nanoseconds() int64 { + return (int64(tv.Sec)*1e6 + int64(tv.Usec)) * 1e3 +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + tv.Sec = int32(nsec / 1e9) + tv.Usec = int32(nsec % 1e9 / 1e3) + return +} + +type SecurityAttributes struct { + Length uint32 + SecurityDescriptor uintptr + InheritHandle uint32 +} + +type Overlapped struct { + Internal uintptr + InternalHigh uintptr + Offset uint32 + OffsetHigh uint32 + HEvent Handle +} + +type FileNotifyInformation struct { + NextEntryOffset uint32 + Action uint32 + FileNameLength uint32 + FileName uint16 +} + +type Filetime struct { + LowDateTime uint32 + HighDateTime uint32 +} + +// Nanoseconds returns Filetime ft in nanoseconds +// since Epoch (00:00:00 UTC, January 1, 1970). +func (ft *Filetime) Nanoseconds() int64 { + // 100-nanosecond intervals since January 1, 1601 + nsec := int64(ft.HighDateTime)<<32 + int64(ft.LowDateTime) + // change starting time to the Epoch (00:00:00 UTC, January 1, 1970) + nsec -= 116444736000000000 + // convert into nanoseconds + nsec *= 100 + return nsec +} + +func NsecToFiletime(nsec int64) (ft Filetime) { + // convert into 100-nanosecond + nsec /= 100 + // change starting time to January 1, 1601 + nsec += 116444736000000000 + // split into high / low + ft.LowDateTime = uint32(nsec & 0xffffffff) + ft.HighDateTime = uint32(nsec >> 32 & 0xffffffff) + return ft +} + +type Win32finddata struct { + FileAttributes uint32 + CreationTime Filetime + LastAccessTime Filetime + LastWriteTime Filetime + FileSizeHigh uint32 + FileSizeLow uint32 + Reserved0 uint32 + Reserved1 uint32 + FileName [MAX_PATH - 1]uint16 + AlternateFileName [13]uint16 +} + +// This is the actual system call structure. +// Win32finddata is what we committed to in Go 1. +type win32finddata1 struct { + FileAttributes uint32 + CreationTime Filetime + LastAccessTime Filetime + LastWriteTime Filetime + FileSizeHigh uint32 + FileSizeLow uint32 + Reserved0 uint32 + Reserved1 uint32 + FileName [MAX_PATH]uint16 + AlternateFileName [14]uint16 +} + +func copyFindData(dst *Win32finddata, src *win32finddata1) { + dst.FileAttributes = src.FileAttributes + dst.CreationTime = src.CreationTime + dst.LastAccessTime = src.LastAccessTime + dst.LastWriteTime = src.LastWriteTime + dst.FileSizeHigh = src.FileSizeHigh + dst.FileSizeLow = src.FileSizeLow + dst.Reserved0 = src.Reserved0 + dst.Reserved1 = src.Reserved1 + + // The src is 1 element bigger than dst, but it must be NUL. + copy(dst.FileName[:], src.FileName[:]) + copy(dst.AlternateFileName[:], src.AlternateFileName[:]) +} + +type ByHandleFileInformation struct { + FileAttributes uint32 + CreationTime Filetime + LastAccessTime Filetime + LastWriteTime Filetime + VolumeSerialNumber uint32 + FileSizeHigh uint32 + FileSizeLow uint32 + NumberOfLinks uint32 + FileIndexHigh uint32 + FileIndexLow uint32 +} + +const ( + GetFileExInfoStandard = 0 + GetFileExMaxInfoLevel = 1 +) + +type Win32FileAttributeData struct { + FileAttributes uint32 + CreationTime Filetime + LastAccessTime Filetime + LastWriteTime Filetime + FileSizeHigh uint32 + FileSizeLow uint32 +} + +// ShowWindow constants +const ( + // winuser.h + SW_HIDE = 0 + SW_NORMAL = 1 + SW_SHOWNORMAL = 1 + SW_SHOWMINIMIZED = 2 + SW_SHOWMAXIMIZED = 3 + SW_MAXIMIZE = 3 + SW_SHOWNOACTIVATE = 4 + SW_SHOW = 5 + SW_MINIMIZE = 6 + SW_SHOWMINNOACTIVE = 7 + SW_SHOWNA = 8 + SW_RESTORE = 9 + SW_SHOWDEFAULT = 10 + SW_FORCEMINIMIZE = 11 +) + +type StartupInfo struct { + Cb uint32 + _ *uint16 + Desktop *uint16 + Title *uint16 + X uint32 + Y uint32 + XSize uint32 + YSize uint32 + XCountChars uint32 + YCountChars uint32 + FillAttribute uint32 + Flags uint32 + ShowWindow uint16 + _ uint16 + _ *byte + StdInput Handle + StdOutput Handle + StdErr Handle +} + +type ProcessInformation struct { + Process Handle + Thread Handle + ProcessId uint32 + ThreadId uint32 +} + +type ProcessEntry32 struct { + Size uint32 + Usage uint32 + ProcessID uint32 + DefaultHeapID uintptr + ModuleID uint32 + Threads uint32 + ParentProcessID uint32 + PriClassBase int32 + Flags uint32 + ExeFile [MAX_PATH]uint16 +} + +type Systemtime struct { + Year uint16 + Month uint16 + DayOfWeek uint16 + Day uint16 + Hour uint16 + Minute uint16 + Second uint16 + Milliseconds uint16 +} + +type Timezoneinformation struct { + Bias int32 + StandardName [32]uint16 + StandardDate Systemtime + StandardBias int32 + DaylightName [32]uint16 + DaylightDate Systemtime + DaylightBias int32 +} + +// Socket related. + +const ( + AF_UNSPEC = 0 + AF_UNIX = 1 + AF_INET = 2 + AF_INET6 = 23 + AF_NETBIOS = 17 + + SOCK_STREAM = 1 + SOCK_DGRAM = 2 + SOCK_RAW = 3 + SOCK_SEQPACKET = 5 + + IPPROTO_IP = 0 + IPPROTO_IPV6 = 0x29 + IPPROTO_TCP = 6 + IPPROTO_UDP = 17 + + SOL_SOCKET = 0xffff + SO_REUSEADDR = 4 + SO_KEEPALIVE = 8 + SO_DONTROUTE = 16 + SO_BROADCAST = 32 + SO_LINGER = 128 + SO_RCVBUF = 0x1002 + SO_SNDBUF = 0x1001 + SO_UPDATE_ACCEPT_CONTEXT = 0x700b + SO_UPDATE_CONNECT_CONTEXT = 0x7010 + + IOC_OUT = 0x40000000 + IOC_IN = 0x80000000 + IOC_VENDOR = 0x18000000 + IOC_INOUT = IOC_IN | IOC_OUT + IOC_WS2 = 0x08000000 + SIO_GET_EXTENSION_FUNCTION_POINTER = IOC_INOUT | IOC_WS2 | 6 + SIO_KEEPALIVE_VALS = IOC_IN | IOC_VENDOR | 4 + SIO_UDP_CONNRESET = IOC_IN | IOC_VENDOR | 12 + + // cf. http://support.microsoft.com/default.aspx?scid=kb;en-us;257460 + + IP_TOS = 0x3 + IP_TTL = 0x4 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_LOOP = 0xb + IP_ADD_MEMBERSHIP = 0xc + IP_DROP_MEMBERSHIP = 0xd + + IPV6_V6ONLY = 0x1b + IPV6_UNICAST_HOPS = 0x4 + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_LOOP = 0xb + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + + SOMAXCONN = 0x7fffffff + + TCP_NODELAY = 1 + + SHUT_RD = 0 + SHUT_WR = 1 + SHUT_RDWR = 2 + + WSADESCRIPTION_LEN = 256 + WSASYS_STATUS_LEN = 128 +) + +type WSABuf struct { + Len uint32 + Buf *byte +} + +// Invented values to support what package os expects. +const ( + S_IFMT = 0x1f000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 + S_ISUID = 0x800 + S_ISGID = 0x400 + S_ISVTX = 0x200 + S_IRUSR = 0x100 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXUSR = 0x40 +) + +const ( + FILE_TYPE_CHAR = 0x0002 + FILE_TYPE_DISK = 0x0001 + FILE_TYPE_PIPE = 0x0003 + FILE_TYPE_REMOTE = 0x8000 + FILE_TYPE_UNKNOWN = 0x0000 +) + +type Hostent struct { + Name *byte + Aliases **byte + AddrType uint16 + Length uint16 + AddrList **byte +} + +type Protoent struct { + Name *byte + Aliases **byte + Proto uint16 +} + +const ( + DNS_TYPE_A = 0x0001 + DNS_TYPE_NS = 0x0002 + DNS_TYPE_MD = 0x0003 + DNS_TYPE_MF = 0x0004 + DNS_TYPE_CNAME = 0x0005 + DNS_TYPE_SOA = 0x0006 + DNS_TYPE_MB = 0x0007 + DNS_TYPE_MG = 0x0008 + DNS_TYPE_MR = 0x0009 + DNS_TYPE_NULL = 0x000a + DNS_TYPE_WKS = 0x000b + DNS_TYPE_PTR = 0x000c + DNS_TYPE_HINFO = 0x000d + DNS_TYPE_MINFO = 0x000e + DNS_TYPE_MX = 0x000f + DNS_TYPE_TEXT = 0x0010 + DNS_TYPE_RP = 0x0011 + DNS_TYPE_AFSDB = 0x0012 + DNS_TYPE_X25 = 0x0013 + DNS_TYPE_ISDN = 0x0014 + DNS_TYPE_RT = 0x0015 + DNS_TYPE_NSAP = 0x0016 + DNS_TYPE_NSAPPTR = 0x0017 + DNS_TYPE_SIG = 0x0018 + DNS_TYPE_KEY = 0x0019 + DNS_TYPE_PX = 0x001a + DNS_TYPE_GPOS = 0x001b + DNS_TYPE_AAAA = 0x001c + DNS_TYPE_LOC = 0x001d + DNS_TYPE_NXT = 0x001e + DNS_TYPE_EID = 0x001f + DNS_TYPE_NIMLOC = 0x0020 + DNS_TYPE_SRV = 0x0021 + DNS_TYPE_ATMA = 0x0022 + DNS_TYPE_NAPTR = 0x0023 + DNS_TYPE_KX = 0x0024 + DNS_TYPE_CERT = 0x0025 + DNS_TYPE_A6 = 0x0026 + DNS_TYPE_DNAME = 0x0027 + DNS_TYPE_SINK = 0x0028 + DNS_TYPE_OPT = 0x0029 + DNS_TYPE_DS = 0x002B + DNS_TYPE_RRSIG = 0x002E + DNS_TYPE_NSEC = 0x002F + DNS_TYPE_DNSKEY = 0x0030 + DNS_TYPE_DHCID = 0x0031 + DNS_TYPE_UINFO = 0x0064 + DNS_TYPE_UID = 0x0065 + DNS_TYPE_GID = 0x0066 + DNS_TYPE_UNSPEC = 0x0067 + DNS_TYPE_ADDRS = 0x00f8 + DNS_TYPE_TKEY = 0x00f9 + DNS_TYPE_TSIG = 0x00fa + DNS_TYPE_IXFR = 0x00fb + DNS_TYPE_AXFR = 0x00fc + DNS_TYPE_MAILB = 0x00fd + DNS_TYPE_MAILA = 0x00fe + DNS_TYPE_ALL = 0x00ff + DNS_TYPE_ANY = 0x00ff + DNS_TYPE_WINS = 0xff01 + DNS_TYPE_WINSR = 0xff02 + DNS_TYPE_NBSTAT = 0xff01 +) + +const ( + DNS_INFO_NO_RECORDS = 0x251D +) + +const ( + // flags inside DNSRecord.Dw + DnsSectionQuestion = 0x0000 + DnsSectionAnswer = 0x0001 + DnsSectionAuthority = 0x0002 + DnsSectionAdditional = 0x0003 +) + +type DNSSRVData struct { + Target *uint16 + Priority uint16 + Weight uint16 + Port uint16 + Pad uint16 +} + +type DNSPTRData struct { + Host *uint16 +} + +type DNSMXData struct { + NameExchange *uint16 + Preference uint16 + Pad uint16 +} + +type DNSTXTData struct { + StringCount uint16 + StringArray [1]*uint16 +} + +type DNSRecord struct { + Next *DNSRecord + Name *uint16 + Type uint16 + Length uint16 + Dw uint32 + Ttl uint32 + Reserved uint32 + Data [40]byte +} + +const ( + TF_DISCONNECT = 1 + TF_REUSE_SOCKET = 2 + TF_WRITE_BEHIND = 4 + TF_USE_DEFAULT_WORKER = 0 + TF_USE_SYSTEM_THREAD = 16 + TF_USE_KERNEL_APC = 32 +) + +type TransmitFileBuffers struct { + Head uintptr + HeadLength uint32 + Tail uintptr + TailLength uint32 +} + +const ( + IFF_UP = 1 + IFF_BROADCAST = 2 + IFF_LOOPBACK = 4 + IFF_POINTTOPOINT = 8 + IFF_MULTICAST = 16 +) + +const SIO_GET_INTERFACE_LIST = 0x4004747F + +// TODO(mattn): SockaddrGen is union of sockaddr/sockaddr_in/sockaddr_in6_old. +// will be fixed to change variable type as suitable. + +type SockaddrGen [24]byte + +type InterfaceInfo struct { + Flags uint32 + Address SockaddrGen + BroadcastAddress SockaddrGen + Netmask SockaddrGen +} + +type IpAddressString struct { + String [16]byte +} + +type IpMaskString IpAddressString + +type IpAddrString struct { + Next *IpAddrString + IpAddress IpAddressString + IpMask IpMaskString + Context uint32 +} + +const MAX_ADAPTER_NAME_LENGTH = 256 +const MAX_ADAPTER_DESCRIPTION_LENGTH = 128 +const MAX_ADAPTER_ADDRESS_LENGTH = 8 + +type IpAdapterInfo struct { + Next *IpAdapterInfo + ComboIndex uint32 + AdapterName [MAX_ADAPTER_NAME_LENGTH + 4]byte + Description [MAX_ADAPTER_DESCRIPTION_LENGTH + 4]byte + AddressLength uint32 + Address [MAX_ADAPTER_ADDRESS_LENGTH]byte + Index uint32 + Type uint32 + DhcpEnabled uint32 + CurrentIpAddress *IpAddrString + IpAddressList IpAddrString + GatewayList IpAddrString + DhcpServer IpAddrString + HaveWins bool + PrimaryWinsServer IpAddrString + SecondaryWinsServer IpAddrString + LeaseObtained int64 + LeaseExpires int64 +} + +const MAXLEN_PHYSADDR = 8 +const MAX_INTERFACE_NAME_LEN = 256 +const MAXLEN_IFDESCR = 256 + +type MibIfRow struct { + Name [MAX_INTERFACE_NAME_LEN]uint16 + Index uint32 + Type uint32 + Mtu uint32 + Speed uint32 + PhysAddrLen uint32 + PhysAddr [MAXLEN_PHYSADDR]byte + AdminStatus uint32 + OperStatus uint32 + LastChange uint32 + InOctets uint32 + InUcastPkts uint32 + InNUcastPkts uint32 + InDiscards uint32 + InErrors uint32 + InUnknownProtos uint32 + OutOctets uint32 + OutUcastPkts uint32 + OutNUcastPkts uint32 + OutDiscards uint32 + OutErrors uint32 + OutQLen uint32 + DescrLen uint32 + Descr [MAXLEN_IFDESCR]byte +} + +type CertContext struct { + EncodingType uint32 + EncodedCert *byte + Length uint32 + CertInfo uintptr + Store Handle +} + +type CertChainContext struct { + Size uint32 + TrustStatus CertTrustStatus + ChainCount uint32 + Chains **CertSimpleChain + LowerQualityChainCount uint32 + LowerQualityChains **CertChainContext + HasRevocationFreshnessTime uint32 + RevocationFreshnessTime uint32 +} + +type CertSimpleChain struct { + Size uint32 + TrustStatus CertTrustStatus + NumElements uint32 + Elements **CertChainElement + TrustListInfo uintptr + HasRevocationFreshnessTime uint32 + RevocationFreshnessTime uint32 +} + +type CertChainElement struct { + Size uint32 + CertContext *CertContext + TrustStatus CertTrustStatus + RevocationInfo *CertRevocationInfo + IssuanceUsage *CertEnhKeyUsage + ApplicationUsage *CertEnhKeyUsage + ExtendedErrorInfo *uint16 +} + +type CertRevocationInfo struct { + Size uint32 + RevocationResult uint32 + RevocationOid *byte + OidSpecificInfo uintptr + HasFreshnessTime uint32 + FreshnessTime uint32 + CrlInfo uintptr // *CertRevocationCrlInfo +} + +type CertTrustStatus struct { + ErrorStatus uint32 + InfoStatus uint32 +} + +type CertUsageMatch struct { + Type uint32 + Usage CertEnhKeyUsage +} + +type CertEnhKeyUsage struct { + Length uint32 + UsageIdentifiers **byte +} + +type CertChainPara struct { + Size uint32 + RequestedUsage CertUsageMatch + RequstedIssuancePolicy CertUsageMatch + URLRetrievalTimeout uint32 + CheckRevocationFreshnessTime uint32 + RevocationFreshnessTime uint32 + CacheResync *Filetime +} + +type CertChainPolicyPara struct { + Size uint32 + Flags uint32 + ExtraPolicyPara uintptr +} + +type SSLExtraCertChainPolicyPara struct { + Size uint32 + AuthType uint32 + Checks uint32 + ServerName *uint16 +} + +type CertChainPolicyStatus struct { + Size uint32 + Error uint32 + ChainIndex uint32 + ElementIndex uint32 + ExtraPolicyStatus uintptr +} + +const ( + // do not reorder + HKEY_CLASSES_ROOT = 0x80000000 + iota + HKEY_CURRENT_USER + HKEY_LOCAL_MACHINE + HKEY_USERS + HKEY_PERFORMANCE_DATA + HKEY_CURRENT_CONFIG + HKEY_DYN_DATA + + KEY_QUERY_VALUE = 1 + KEY_SET_VALUE = 2 + KEY_CREATE_SUB_KEY = 4 + KEY_ENUMERATE_SUB_KEYS = 8 + KEY_NOTIFY = 16 + KEY_CREATE_LINK = 32 + KEY_WRITE = 0x20006 + KEY_EXECUTE = 0x20019 + KEY_READ = 0x20019 + KEY_WOW64_64KEY = 0x0100 + KEY_WOW64_32KEY = 0x0200 + KEY_ALL_ACCESS = 0xf003f +) + +const ( + // do not reorder + REG_NONE = iota + REG_SZ + REG_EXPAND_SZ + REG_BINARY + REG_DWORD_LITTLE_ENDIAN + REG_DWORD_BIG_ENDIAN + REG_LINK + REG_MULTI_SZ + REG_RESOURCE_LIST + REG_FULL_RESOURCE_DESCRIPTOR + REG_RESOURCE_REQUIREMENTS_LIST + REG_QWORD_LITTLE_ENDIAN + REG_DWORD = REG_DWORD_LITTLE_ENDIAN + REG_QWORD = REG_QWORD_LITTLE_ENDIAN +) + +type AddrinfoW struct { + Flags int32 + Family int32 + Socktype int32 + Protocol int32 + Addrlen uintptr + Canonname *uint16 + Addr uintptr + Next *AddrinfoW +} + +const ( + AI_PASSIVE = 1 + AI_CANONNAME = 2 + AI_NUMERICHOST = 4 +) + +type GUID struct { + Data1 uint32 + Data2 uint16 + Data3 uint16 + Data4 [8]byte +} + +var WSAID_CONNECTEX = GUID{ + 0x25a207b9, + 0xddf3, + 0x4660, + [8]byte{0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e}, +} + +const ( + FILE_SKIP_COMPLETION_PORT_ON_SUCCESS = 1 + FILE_SKIP_SET_EVENT_ON_HANDLE = 2 +) + +const ( + WSAPROTOCOL_LEN = 255 + MAX_PROTOCOL_CHAIN = 7 + BASE_PROTOCOL = 1 + LAYERED_PROTOCOL = 0 + + XP1_CONNECTIONLESS = 0x00000001 + XP1_GUARANTEED_DELIVERY = 0x00000002 + XP1_GUARANTEED_ORDER = 0x00000004 + XP1_MESSAGE_ORIENTED = 0x00000008 + XP1_PSEUDO_STREAM = 0x00000010 + XP1_GRACEFUL_CLOSE = 0x00000020 + XP1_EXPEDITED_DATA = 0x00000040 + XP1_CONNECT_DATA = 0x00000080 + XP1_DISCONNECT_DATA = 0x00000100 + XP1_SUPPORT_BROADCAST = 0x00000200 + XP1_SUPPORT_MULTIPOINT = 0x00000400 + XP1_MULTIPOINT_CONTROL_PLANE = 0x00000800 + XP1_MULTIPOINT_DATA_PLANE = 0x00001000 + XP1_QOS_SUPPORTED = 0x00002000 + XP1_UNI_SEND = 0x00008000 + XP1_UNI_RECV = 0x00010000 + XP1_IFS_HANDLES = 0x00020000 + XP1_PARTIAL_MESSAGE = 0x00040000 + XP1_SAN_SUPPORT_SDP = 0x00080000 + + PFL_MULTIPLE_PROTO_ENTRIES = 0x00000001 + PFL_RECOMMENDED_PROTO_ENTRY = 0x00000002 + PFL_HIDDEN = 0x00000004 + PFL_MATCHES_PROTOCOL_ZERO = 0x00000008 + PFL_NETWORKDIRECT_PROVIDER = 0x00000010 +) + +type WSAProtocolInfo struct { + ServiceFlags1 uint32 + ServiceFlags2 uint32 + ServiceFlags3 uint32 + ServiceFlags4 uint32 + ProviderFlags uint32 + ProviderId GUID + CatalogEntryId uint32 + ProtocolChain WSAProtocolChain + Version int32 + AddressFamily int32 + MaxSockAddr int32 + MinSockAddr int32 + SocketType int32 + Protocol int32 + ProtocolMaxOffset int32 + NetworkByteOrder int32 + SecurityScheme int32 + MessageSize uint32 + ProviderReserved uint32 + ProtocolName [WSAPROTOCOL_LEN + 1]uint16 +} + +type WSAProtocolChain struct { + ChainLen int32 + ChainEntries [MAX_PROTOCOL_CHAIN]uint32 +} + +type TCPKeepalive struct { + OnOff uint32 + Time uint32 + Interval uint32 +} + +type symbolicLinkReparseBuffer struct { + SubstituteNameOffset uint16 + SubstituteNameLength uint16 + PrintNameOffset uint16 + PrintNameLength uint16 + Flags uint32 + PathBuffer [1]uint16 +} + +type mountPointReparseBuffer struct { + SubstituteNameOffset uint16 + SubstituteNameLength uint16 + PrintNameOffset uint16 + PrintNameLength uint16 + PathBuffer [1]uint16 +} + +type reparseDataBuffer struct { + ReparseTag uint32 + ReparseDataLength uint16 + Reserved uint16 + + // GenericReparseBuffer + reparseBuffer byte +} + +const ( + FSCTL_GET_REPARSE_POINT = 0x900A8 + MAXIMUM_REPARSE_DATA_BUFFER_SIZE = 16 * 1024 + IO_REPARSE_TAG_MOUNT_POINT = 0xA0000003 + IO_REPARSE_TAG_SYMLINK = 0xA000000C + SYMBOLIC_LINK_FLAG_DIRECTORY = 0x1 +) + +const ( + ComputerNameNetBIOS = 0 + ComputerNameDnsHostname = 1 + ComputerNameDnsDomain = 2 + ComputerNameDnsFullyQualified = 3 + ComputerNamePhysicalNetBIOS = 4 + ComputerNamePhysicalDnsHostname = 5 + ComputerNamePhysicalDnsDomain = 6 + ComputerNamePhysicalDnsFullyQualified = 7 + ComputerNameMax = 8 +) + +const ( + MOVEFILE_REPLACE_EXISTING = 0x1 + MOVEFILE_COPY_ALLOWED = 0x2 + MOVEFILE_DELAY_UNTIL_REBOOT = 0x4 + MOVEFILE_WRITE_THROUGH = 0x8 + MOVEFILE_CREATE_HARDLINK = 0x10 + MOVEFILE_FAIL_IF_NOT_TRACKABLE = 0x20 +) + +const GAA_FLAG_INCLUDE_PREFIX = 0x00000010 + +const ( + IF_TYPE_OTHER = 1 + IF_TYPE_ETHERNET_CSMACD = 6 + IF_TYPE_ISO88025_TOKENRING = 9 + IF_TYPE_PPP = 23 + IF_TYPE_SOFTWARE_LOOPBACK = 24 + IF_TYPE_ATM = 37 + IF_TYPE_IEEE80211 = 71 + IF_TYPE_TUNNEL = 131 + IF_TYPE_IEEE1394 = 144 +) + +type SocketAddress struct { + Sockaddr *syscall.RawSockaddrAny + SockaddrLength int32 +} + +type IpAdapterUnicastAddress struct { + Length uint32 + Flags uint32 + Next *IpAdapterUnicastAddress + Address SocketAddress + PrefixOrigin int32 + SuffixOrigin int32 + DadState int32 + ValidLifetime uint32 + PreferredLifetime uint32 + LeaseLifetime uint32 + OnLinkPrefixLength uint8 +} + +type IpAdapterAnycastAddress struct { + Length uint32 + Flags uint32 + Next *IpAdapterAnycastAddress + Address SocketAddress +} + +type IpAdapterMulticastAddress struct { + Length uint32 + Flags uint32 + Next *IpAdapterMulticastAddress + Address SocketAddress +} + +type IpAdapterDnsServerAdapter struct { + Length uint32 + Reserved uint32 + Next *IpAdapterDnsServerAdapter + Address SocketAddress +} + +type IpAdapterPrefix struct { + Length uint32 + Flags uint32 + Next *IpAdapterPrefix + Address SocketAddress + PrefixLength uint32 +} + +type IpAdapterAddresses struct { + Length uint32 + IfIndex uint32 + Next *IpAdapterAddresses + AdapterName *byte + FirstUnicastAddress *IpAdapterUnicastAddress + FirstAnycastAddress *IpAdapterAnycastAddress + FirstMulticastAddress *IpAdapterMulticastAddress + FirstDnsServerAddress *IpAdapterDnsServerAdapter + DnsSuffix *uint16 + Description *uint16 + FriendlyName *uint16 + PhysicalAddress [syscall.MAX_ADAPTER_ADDRESS_LENGTH]byte + PhysicalAddressLength uint32 + Flags uint32 + Mtu uint32 + IfType uint32 + OperStatus uint32 + Ipv6IfIndex uint32 + ZoneIndices [16]uint32 + FirstPrefix *IpAdapterPrefix + /* more fields might be present here. */ +} + +const ( + IfOperStatusUp = 1 + IfOperStatusDown = 2 + IfOperStatusTesting = 3 + IfOperStatusUnknown = 4 + IfOperStatusDormant = 5 + IfOperStatusNotPresent = 6 + IfOperStatusLowerLayerDown = 7 +) + +// Console related constants used for the mode parameter to SetConsoleMode. See +// https://docs.microsoft.com/en-us/windows/console/setconsolemode for details. + +const ( + ENABLE_PROCESSED_INPUT = 0x1 + ENABLE_LINE_INPUT = 0x2 + ENABLE_ECHO_INPUT = 0x4 + ENABLE_WINDOW_INPUT = 0x8 + ENABLE_MOUSE_INPUT = 0x10 + ENABLE_INSERT_MODE = 0x20 + ENABLE_QUICK_EDIT_MODE = 0x40 + ENABLE_EXTENDED_FLAGS = 0x80 + ENABLE_AUTO_POSITION = 0x100 + ENABLE_VIRTUAL_TERMINAL_INPUT = 0x200 + + ENABLE_PROCESSED_OUTPUT = 0x1 + ENABLE_WRAP_AT_EOL_OUTPUT = 0x2 + ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x4 + DISABLE_NEWLINE_AUTO_RETURN = 0x8 + ENABLE_LVB_GRID_WORLDWIDE = 0x10 +) + +type Coord struct { + X int16 + Y int16 +} + +type SmallRect struct { + Left int16 + Top int16 + Right int16 + Bottom int16 +} + +// Used with GetConsoleScreenBuffer to retreive information about a console +// screen buffer. See +// https://docs.microsoft.com/en-us/windows/console/console-screen-buffer-info-str +// for details. + +type ConsoleScreenBufferInfo struct { + Size Coord + CursorPosition Coord + Attributes uint16 + Window SmallRect + MaximumWindowSize Coord +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/types_windows_386.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/types_windows_386.go new file mode 100644 index 0000000..10f33be --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/types_windows_386.go @@ -0,0 +1,22 @@ +// 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 windows + +type WSAData struct { + Version uint16 + HighVersion uint16 + Description [WSADESCRIPTION_LEN + 1]byte + SystemStatus [WSASYS_STATUS_LEN + 1]byte + MaxSockets uint16 + MaxUdpDg uint16 + VendorInfo *byte +} + +type Servent struct { + Name *byte + Aliases **byte + Port uint16 + Proto *byte +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/types_windows_amd64.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/types_windows_amd64.go new file mode 100644 index 0000000..3f272c2 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/types_windows_amd64.go @@ -0,0 +1,22 @@ +// 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 windows + +type WSAData struct { + Version uint16 + HighVersion uint16 + MaxSockets uint16 + MaxUdpDg uint16 + VendorInfo *byte + Description [WSADESCRIPTION_LEN + 1]byte + SystemStatus [WSASYS_STATUS_LEN + 1]byte +} + +type Servent struct { + Name *byte + Aliases **byte + Proto *byte + Port uint16 +} diff --git a/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/zsyscall_windows.go b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/zsyscall_windows.go new file mode 100644 index 0000000..2f893d2 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/golang.org/x/sys/windows/zsyscall_windows.go @@ -0,0 +1,2428 @@ +// MACHINE GENERATED BY 'go generate' COMMAND; DO NOT EDIT + +package windows + +import ( + "syscall" + "unsafe" +) + +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) +) + +// errnoErr returns common boxed Errno values, to prevent +// allocations at runtime. +func errnoErr(e syscall.Errno) error { + switch e { + case 0: + return nil + 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 = NewLazySystemDLL("advapi32.dll") + modkernel32 = NewLazySystemDLL("kernel32.dll") + modshell32 = NewLazySystemDLL("shell32.dll") + modmswsock = NewLazySystemDLL("mswsock.dll") + modcrypt32 = NewLazySystemDLL("crypt32.dll") + modws2_32 = NewLazySystemDLL("ws2_32.dll") + moddnsapi = NewLazySystemDLL("dnsapi.dll") + modiphlpapi = NewLazySystemDLL("iphlpapi.dll") + modsecur32 = NewLazySystemDLL("secur32.dll") + modnetapi32 = NewLazySystemDLL("netapi32.dll") + moduserenv = NewLazySystemDLL("userenv.dll") + + procRegisterEventSourceW = modadvapi32.NewProc("RegisterEventSourceW") + procDeregisterEventSource = modadvapi32.NewProc("DeregisterEventSource") + procReportEventW = modadvapi32.NewProc("ReportEventW") + procOpenSCManagerW = modadvapi32.NewProc("OpenSCManagerW") + procCloseServiceHandle = modadvapi32.NewProc("CloseServiceHandle") + procCreateServiceW = modadvapi32.NewProc("CreateServiceW") + procOpenServiceW = modadvapi32.NewProc("OpenServiceW") + procDeleteService = modadvapi32.NewProc("DeleteService") + procStartServiceW = modadvapi32.NewProc("StartServiceW") + procQueryServiceStatus = modadvapi32.NewProc("QueryServiceStatus") + procControlService = modadvapi32.NewProc("ControlService") + procStartServiceCtrlDispatcherW = modadvapi32.NewProc("StartServiceCtrlDispatcherW") + procSetServiceStatus = modadvapi32.NewProc("SetServiceStatus") + procChangeServiceConfigW = modadvapi32.NewProc("ChangeServiceConfigW") + procQueryServiceConfigW = modadvapi32.NewProc("QueryServiceConfigW") + procChangeServiceConfig2W = modadvapi32.NewProc("ChangeServiceConfig2W") + procQueryServiceConfig2W = modadvapi32.NewProc("QueryServiceConfig2W") + procEnumServicesStatusExW = modadvapi32.NewProc("EnumServicesStatusExW") + procGetLastError = modkernel32.NewProc("GetLastError") + procLoadLibraryW = modkernel32.NewProc("LoadLibraryW") + procLoadLibraryExW = modkernel32.NewProc("LoadLibraryExW") + procFreeLibrary = modkernel32.NewProc("FreeLibrary") + procGetProcAddress = modkernel32.NewProc("GetProcAddress") + procGetVersion = modkernel32.NewProc("GetVersion") + procFormatMessageW = modkernel32.NewProc("FormatMessageW") + procExitProcess = modkernel32.NewProc("ExitProcess") + procCreateFileW = modkernel32.NewProc("CreateFileW") + procReadFile = modkernel32.NewProc("ReadFile") + procWriteFile = modkernel32.NewProc("WriteFile") + procSetFilePointer = modkernel32.NewProc("SetFilePointer") + procCloseHandle = modkernel32.NewProc("CloseHandle") + procGetStdHandle = modkernel32.NewProc("GetStdHandle") + procSetStdHandle = modkernel32.NewProc("SetStdHandle") + procFindFirstFileW = modkernel32.NewProc("FindFirstFileW") + procFindNextFileW = modkernel32.NewProc("FindNextFileW") + procFindClose = modkernel32.NewProc("FindClose") + procGetFileInformationByHandle = modkernel32.NewProc("GetFileInformationByHandle") + procGetCurrentDirectoryW = modkernel32.NewProc("GetCurrentDirectoryW") + procSetCurrentDirectoryW = modkernel32.NewProc("SetCurrentDirectoryW") + procCreateDirectoryW = modkernel32.NewProc("CreateDirectoryW") + procRemoveDirectoryW = modkernel32.NewProc("RemoveDirectoryW") + procDeleteFileW = modkernel32.NewProc("DeleteFileW") + procMoveFileW = modkernel32.NewProc("MoveFileW") + procMoveFileExW = modkernel32.NewProc("MoveFileExW") + procGetComputerNameW = modkernel32.NewProc("GetComputerNameW") + procGetComputerNameExW = modkernel32.NewProc("GetComputerNameExW") + procSetEndOfFile = modkernel32.NewProc("SetEndOfFile") + procGetSystemTimeAsFileTime = modkernel32.NewProc("GetSystemTimeAsFileTime") + procGetSystemTimePreciseAsFileTime = modkernel32.NewProc("GetSystemTimePreciseAsFileTime") + procGetTimeZoneInformation = modkernel32.NewProc("GetTimeZoneInformation") + procCreateIoCompletionPort = modkernel32.NewProc("CreateIoCompletionPort") + procGetQueuedCompletionStatus = modkernel32.NewProc("GetQueuedCompletionStatus") + procPostQueuedCompletionStatus = modkernel32.NewProc("PostQueuedCompletionStatus") + procCancelIo = modkernel32.NewProc("CancelIo") + procCancelIoEx = modkernel32.NewProc("CancelIoEx") + procCreateProcessW = modkernel32.NewProc("CreateProcessW") + procOpenProcess = modkernel32.NewProc("OpenProcess") + procTerminateProcess = modkernel32.NewProc("TerminateProcess") + procGetExitCodeProcess = modkernel32.NewProc("GetExitCodeProcess") + procGetStartupInfoW = modkernel32.NewProc("GetStartupInfoW") + procGetCurrentProcess = modkernel32.NewProc("GetCurrentProcess") + procGetProcessTimes = modkernel32.NewProc("GetProcessTimes") + procDuplicateHandle = modkernel32.NewProc("DuplicateHandle") + procWaitForSingleObject = modkernel32.NewProc("WaitForSingleObject") + procGetTempPathW = modkernel32.NewProc("GetTempPathW") + procCreatePipe = modkernel32.NewProc("CreatePipe") + procGetFileType = modkernel32.NewProc("GetFileType") + procCryptAcquireContextW = modadvapi32.NewProc("CryptAcquireContextW") + procCryptReleaseContext = modadvapi32.NewProc("CryptReleaseContext") + procCryptGenRandom = modadvapi32.NewProc("CryptGenRandom") + procGetEnvironmentStringsW = modkernel32.NewProc("GetEnvironmentStringsW") + procFreeEnvironmentStringsW = modkernel32.NewProc("FreeEnvironmentStringsW") + procGetEnvironmentVariableW = modkernel32.NewProc("GetEnvironmentVariableW") + procSetEnvironmentVariableW = modkernel32.NewProc("SetEnvironmentVariableW") + procSetFileTime = modkernel32.NewProc("SetFileTime") + procGetFileAttributesW = modkernel32.NewProc("GetFileAttributesW") + procSetFileAttributesW = modkernel32.NewProc("SetFileAttributesW") + procGetFileAttributesExW = modkernel32.NewProc("GetFileAttributesExW") + procGetCommandLineW = modkernel32.NewProc("GetCommandLineW") + procCommandLineToArgvW = modshell32.NewProc("CommandLineToArgvW") + procLocalFree = modkernel32.NewProc("LocalFree") + procSetHandleInformation = modkernel32.NewProc("SetHandleInformation") + procFlushFileBuffers = modkernel32.NewProc("FlushFileBuffers") + procGetFullPathNameW = modkernel32.NewProc("GetFullPathNameW") + procGetLongPathNameW = modkernel32.NewProc("GetLongPathNameW") + procGetShortPathNameW = modkernel32.NewProc("GetShortPathNameW") + procCreateFileMappingW = modkernel32.NewProc("CreateFileMappingW") + procMapViewOfFile = modkernel32.NewProc("MapViewOfFile") + procUnmapViewOfFile = modkernel32.NewProc("UnmapViewOfFile") + procFlushViewOfFile = modkernel32.NewProc("FlushViewOfFile") + procVirtualLock = modkernel32.NewProc("VirtualLock") + procVirtualUnlock = modkernel32.NewProc("VirtualUnlock") + procVirtualAlloc = modkernel32.NewProc("VirtualAlloc") + procVirtualFree = modkernel32.NewProc("VirtualFree") + procVirtualProtect = modkernel32.NewProc("VirtualProtect") + procTransmitFile = modmswsock.NewProc("TransmitFile") + procReadDirectoryChangesW = modkernel32.NewProc("ReadDirectoryChangesW") + procCertOpenSystemStoreW = modcrypt32.NewProc("CertOpenSystemStoreW") + procCertOpenStore = modcrypt32.NewProc("CertOpenStore") + procCertEnumCertificatesInStore = modcrypt32.NewProc("CertEnumCertificatesInStore") + procCertAddCertificateContextToStore = modcrypt32.NewProc("CertAddCertificateContextToStore") + procCertCloseStore = modcrypt32.NewProc("CertCloseStore") + procCertGetCertificateChain = modcrypt32.NewProc("CertGetCertificateChain") + procCertFreeCertificateChain = modcrypt32.NewProc("CertFreeCertificateChain") + procCertCreateCertificateContext = modcrypt32.NewProc("CertCreateCertificateContext") + procCertFreeCertificateContext = modcrypt32.NewProc("CertFreeCertificateContext") + procCertVerifyCertificateChainPolicy = modcrypt32.NewProc("CertVerifyCertificateChainPolicy") + procRegOpenKeyExW = modadvapi32.NewProc("RegOpenKeyExW") + procRegCloseKey = modadvapi32.NewProc("RegCloseKey") + procRegQueryInfoKeyW = modadvapi32.NewProc("RegQueryInfoKeyW") + procRegEnumKeyExW = modadvapi32.NewProc("RegEnumKeyExW") + procRegQueryValueExW = modadvapi32.NewProc("RegQueryValueExW") + procGetCurrentProcessId = modkernel32.NewProc("GetCurrentProcessId") + procGetConsoleMode = modkernel32.NewProc("GetConsoleMode") + procSetConsoleMode = modkernel32.NewProc("SetConsoleMode") + procGetConsoleScreenBufferInfo = modkernel32.NewProc("GetConsoleScreenBufferInfo") + procWriteConsoleW = modkernel32.NewProc("WriteConsoleW") + procReadConsoleW = modkernel32.NewProc("ReadConsoleW") + procCreateToolhelp32Snapshot = modkernel32.NewProc("CreateToolhelp32Snapshot") + procProcess32FirstW = modkernel32.NewProc("Process32FirstW") + procProcess32NextW = modkernel32.NewProc("Process32NextW") + procDeviceIoControl = modkernel32.NewProc("DeviceIoControl") + procCreateSymbolicLinkW = modkernel32.NewProc("CreateSymbolicLinkW") + procCreateHardLinkW = modkernel32.NewProc("CreateHardLinkW") + procGetCurrentThreadId = modkernel32.NewProc("GetCurrentThreadId") + procCreateEventW = modkernel32.NewProc("CreateEventW") + procCreateEventExW = modkernel32.NewProc("CreateEventExW") + procOpenEventW = modkernel32.NewProc("OpenEventW") + procSetEvent = modkernel32.NewProc("SetEvent") + procResetEvent = modkernel32.NewProc("ResetEvent") + procPulseEvent = modkernel32.NewProc("PulseEvent") + procWSAStartup = modws2_32.NewProc("WSAStartup") + procWSACleanup = modws2_32.NewProc("WSACleanup") + procWSAIoctl = modws2_32.NewProc("WSAIoctl") + procsocket = modws2_32.NewProc("socket") + procsetsockopt = modws2_32.NewProc("setsockopt") + procgetsockopt = modws2_32.NewProc("getsockopt") + procbind = modws2_32.NewProc("bind") + procconnect = modws2_32.NewProc("connect") + procgetsockname = modws2_32.NewProc("getsockname") + procgetpeername = modws2_32.NewProc("getpeername") + proclisten = modws2_32.NewProc("listen") + procshutdown = modws2_32.NewProc("shutdown") + procclosesocket = modws2_32.NewProc("closesocket") + procAcceptEx = modmswsock.NewProc("AcceptEx") + procGetAcceptExSockaddrs = modmswsock.NewProc("GetAcceptExSockaddrs") + procWSARecv = modws2_32.NewProc("WSARecv") + procWSASend = modws2_32.NewProc("WSASend") + procWSARecvFrom = modws2_32.NewProc("WSARecvFrom") + procWSASendTo = modws2_32.NewProc("WSASendTo") + procgethostbyname = modws2_32.NewProc("gethostbyname") + procgetservbyname = modws2_32.NewProc("getservbyname") + procntohs = modws2_32.NewProc("ntohs") + procgetprotobyname = modws2_32.NewProc("getprotobyname") + procDnsQuery_W = moddnsapi.NewProc("DnsQuery_W") + procDnsRecordListFree = moddnsapi.NewProc("DnsRecordListFree") + procDnsNameCompare_W = moddnsapi.NewProc("DnsNameCompare_W") + procGetAddrInfoW = modws2_32.NewProc("GetAddrInfoW") + procFreeAddrInfoW = modws2_32.NewProc("FreeAddrInfoW") + procGetIfEntry = modiphlpapi.NewProc("GetIfEntry") + procGetAdaptersInfo = modiphlpapi.NewProc("GetAdaptersInfo") + procSetFileCompletionNotificationModes = modkernel32.NewProc("SetFileCompletionNotificationModes") + procWSAEnumProtocolsW = modws2_32.NewProc("WSAEnumProtocolsW") + procGetAdaptersAddresses = modiphlpapi.NewProc("GetAdaptersAddresses") + procGetACP = modkernel32.NewProc("GetACP") + procMultiByteToWideChar = modkernel32.NewProc("MultiByteToWideChar") + procTranslateNameW = modsecur32.NewProc("TranslateNameW") + procGetUserNameExW = modsecur32.NewProc("GetUserNameExW") + procNetUserGetInfo = modnetapi32.NewProc("NetUserGetInfo") + procNetGetJoinInformation = modnetapi32.NewProc("NetGetJoinInformation") + procNetApiBufferFree = modnetapi32.NewProc("NetApiBufferFree") + procLookupAccountSidW = modadvapi32.NewProc("LookupAccountSidW") + procLookupAccountNameW = modadvapi32.NewProc("LookupAccountNameW") + procConvertSidToStringSidW = modadvapi32.NewProc("ConvertSidToStringSidW") + procConvertStringSidToSidW = modadvapi32.NewProc("ConvertStringSidToSidW") + procGetLengthSid = modadvapi32.NewProc("GetLengthSid") + procCopySid = modadvapi32.NewProc("CopySid") + procAllocateAndInitializeSid = modadvapi32.NewProc("AllocateAndInitializeSid") + procFreeSid = modadvapi32.NewProc("FreeSid") + procEqualSid = modadvapi32.NewProc("EqualSid") + procOpenProcessToken = modadvapi32.NewProc("OpenProcessToken") + procGetTokenInformation = modadvapi32.NewProc("GetTokenInformation") + procGetUserProfileDirectoryW = moduserenv.NewProc("GetUserProfileDirectoryW") +) + +func RegisterEventSource(uncServerName *uint16, sourceName *uint16) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procRegisterEventSourceW.Addr(), 2, uintptr(unsafe.Pointer(uncServerName)), uintptr(unsafe.Pointer(sourceName)), 0) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func DeregisterEventSource(handle Handle) (err error) { + r1, _, e1 := syscall.Syscall(procDeregisterEventSource.Addr(), 1, uintptr(handle), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ReportEvent(log Handle, etype uint16, category uint16, eventId uint32, usrSId uintptr, numStrings uint16, dataSize uint32, strings **uint16, rawData *byte) (err error) { + r1, _, e1 := syscall.Syscall9(procReportEventW.Addr(), 9, uintptr(log), uintptr(etype), uintptr(category), uintptr(eventId), uintptr(usrSId), uintptr(numStrings), uintptr(dataSize), uintptr(unsafe.Pointer(strings)), uintptr(unsafe.Pointer(rawData))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func OpenSCManager(machineName *uint16, databaseName *uint16, access uint32) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procOpenSCManagerW.Addr(), 3, uintptr(unsafe.Pointer(machineName)), uintptr(unsafe.Pointer(databaseName)), uintptr(access)) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CloseServiceHandle(handle Handle) (err error) { + r1, _, e1 := syscall.Syscall(procCloseServiceHandle.Addr(), 1, uintptr(handle), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreateService(mgr Handle, serviceName *uint16, displayName *uint16, access uint32, srvType uint32, startType uint32, errCtl uint32, pathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall15(procCreateServiceW.Addr(), 13, uintptr(mgr), uintptr(unsafe.Pointer(serviceName)), uintptr(unsafe.Pointer(displayName)), uintptr(access), uintptr(srvType), uintptr(startType), uintptr(errCtl), uintptr(unsafe.Pointer(pathName)), uintptr(unsafe.Pointer(loadOrderGroup)), uintptr(unsafe.Pointer(tagId)), uintptr(unsafe.Pointer(dependencies)), uintptr(unsafe.Pointer(serviceStartName)), uintptr(unsafe.Pointer(password)), 0, 0) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func OpenService(mgr Handle, serviceName *uint16, access uint32) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procOpenServiceW.Addr(), 3, uintptr(mgr), uintptr(unsafe.Pointer(serviceName)), uintptr(access)) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func DeleteService(service Handle) (err error) { + r1, _, e1 := syscall.Syscall(procDeleteService.Addr(), 1, uintptr(service), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func StartService(service Handle, numArgs uint32, argVectors **uint16) (err error) { + r1, _, e1 := syscall.Syscall(procStartServiceW.Addr(), 3, uintptr(service), uintptr(numArgs), uintptr(unsafe.Pointer(argVectors))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func QueryServiceStatus(service Handle, status *SERVICE_STATUS) (err error) { + r1, _, e1 := syscall.Syscall(procQueryServiceStatus.Addr(), 2, uintptr(service), uintptr(unsafe.Pointer(status)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ControlService(service Handle, control uint32, status *SERVICE_STATUS) (err error) { + r1, _, e1 := syscall.Syscall(procControlService.Addr(), 3, uintptr(service), uintptr(control), uintptr(unsafe.Pointer(status))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func StartServiceCtrlDispatcher(serviceTable *SERVICE_TABLE_ENTRY) (err error) { + r1, _, e1 := syscall.Syscall(procStartServiceCtrlDispatcherW.Addr(), 1, uintptr(unsafe.Pointer(serviceTable)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetServiceStatus(service Handle, serviceStatus *SERVICE_STATUS) (err error) { + r1, _, e1 := syscall.Syscall(procSetServiceStatus.Addr(), 2, uintptr(service), uintptr(unsafe.Pointer(serviceStatus)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ChangeServiceConfig(service Handle, serviceType uint32, startType uint32, errorControl uint32, binaryPathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16, displayName *uint16) (err error) { + r1, _, e1 := syscall.Syscall12(procChangeServiceConfigW.Addr(), 11, uintptr(service), uintptr(serviceType), uintptr(startType), uintptr(errorControl), uintptr(unsafe.Pointer(binaryPathName)), uintptr(unsafe.Pointer(loadOrderGroup)), uintptr(unsafe.Pointer(tagId)), uintptr(unsafe.Pointer(dependencies)), uintptr(unsafe.Pointer(serviceStartName)), uintptr(unsafe.Pointer(password)), uintptr(unsafe.Pointer(displayName)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func QueryServiceConfig(service Handle, serviceConfig *QUERY_SERVICE_CONFIG, bufSize uint32, bytesNeeded *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procQueryServiceConfigW.Addr(), 4, uintptr(service), uintptr(unsafe.Pointer(serviceConfig)), uintptr(bufSize), uintptr(unsafe.Pointer(bytesNeeded)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ChangeServiceConfig2(service Handle, infoLevel uint32, info *byte) (err error) { + r1, _, e1 := syscall.Syscall(procChangeServiceConfig2W.Addr(), 3, uintptr(service), uintptr(infoLevel), uintptr(unsafe.Pointer(info))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func QueryServiceConfig2(service Handle, infoLevel uint32, buff *byte, buffSize uint32, bytesNeeded *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procQueryServiceConfig2W.Addr(), 5, uintptr(service), uintptr(infoLevel), uintptr(unsafe.Pointer(buff)), uintptr(buffSize), uintptr(unsafe.Pointer(bytesNeeded)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func EnumServicesStatusEx(mgr Handle, infoLevel uint32, serviceType uint32, serviceState uint32, services *byte, bufSize uint32, bytesNeeded *uint32, servicesReturned *uint32, resumeHandle *uint32, groupName *uint16) (err error) { + r1, _, e1 := syscall.Syscall12(procEnumServicesStatusExW.Addr(), 10, uintptr(mgr), uintptr(infoLevel), uintptr(serviceType), uintptr(serviceState), uintptr(unsafe.Pointer(services)), uintptr(bufSize), uintptr(unsafe.Pointer(bytesNeeded)), uintptr(unsafe.Pointer(servicesReturned)), uintptr(unsafe.Pointer(resumeHandle)), uintptr(unsafe.Pointer(groupName)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetLastError() (lasterr error) { + r0, _, _ := syscall.Syscall(procGetLastError.Addr(), 0, 0, 0, 0) + if r0 != 0 { + lasterr = syscall.Errno(r0) + } + return +} + +func LoadLibrary(libname string) (handle Handle, err error) { + var _p0 *uint16 + _p0, err = syscall.UTF16PtrFromString(libname) + if err != nil { + return + } + return _LoadLibrary(_p0) +} + +func _LoadLibrary(libname *uint16) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procLoadLibraryW.Addr(), 1, uintptr(unsafe.Pointer(libname)), 0, 0) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func LoadLibraryEx(libname string, zero Handle, flags uintptr) (handle Handle, err error) { + var _p0 *uint16 + _p0, err = syscall.UTF16PtrFromString(libname) + if err != nil { + return + } + return _LoadLibraryEx(_p0, zero, flags) +} + +func _LoadLibraryEx(libname *uint16, zero Handle, flags uintptr) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procLoadLibraryExW.Addr(), 3, uintptr(unsafe.Pointer(libname)), uintptr(zero), uintptr(flags)) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FreeLibrary(handle Handle) (err error) { + r1, _, e1 := syscall.Syscall(procFreeLibrary.Addr(), 1, uintptr(handle), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetProcAddress(module Handle, procname string) (proc uintptr, err error) { + var _p0 *byte + _p0, err = syscall.BytePtrFromString(procname) + if err != nil { + return + } + return _GetProcAddress(module, _p0) +} + +func _GetProcAddress(module Handle, procname *byte) (proc uintptr, err error) { + r0, _, e1 := syscall.Syscall(procGetProcAddress.Addr(), 2, uintptr(module), uintptr(unsafe.Pointer(procname)), 0) + proc = uintptr(r0) + if proc == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetVersion() (ver uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetVersion.Addr(), 0, 0, 0, 0) + ver = uint32(r0) + if ver == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FormatMessage(flags uint32, msgsrc uintptr, msgid uint32, langid uint32, buf []uint16, args *byte) (n uint32, err error) { + var _p0 *uint16 + if len(buf) > 0 { + _p0 = &buf[0] + } + r0, _, e1 := syscall.Syscall9(procFormatMessageW.Addr(), 7, uintptr(flags), uintptr(msgsrc), uintptr(msgid), uintptr(langid), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(unsafe.Pointer(args)), 0, 0) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ExitProcess(exitcode uint32) { + syscall.Syscall(procExitProcess.Addr(), 1, uintptr(exitcode), 0, 0) + return +} + +func CreateFile(name *uint16, access uint32, mode uint32, sa *SecurityAttributes, createmode uint32, attrs uint32, templatefile int32) (handle 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 = Handle(r0) + if handle == InvalidHandle { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ReadFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + r1, _, e1 := syscall.Syscall6(procReadFile.Addr(), 5, uintptr(handle), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(unsafe.Pointer(done)), uintptr(unsafe.Pointer(overlapped)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func WriteFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + r1, _, e1 := syscall.Syscall6(procWriteFile.Addr(), 5, uintptr(handle), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(unsafe.Pointer(done)), uintptr(unsafe.Pointer(overlapped)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetFilePointer(handle Handle, lowoffset int32, highoffsetptr *int32, whence uint32) (newlowoffset uint32, err error) { + r0, _, e1 := syscall.Syscall6(procSetFilePointer.Addr(), 4, uintptr(handle), uintptr(lowoffset), uintptr(unsafe.Pointer(highoffsetptr)), uintptr(whence), 0, 0) + newlowoffset = uint32(r0) + if newlowoffset == 0xffffffff { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CloseHandle(handle Handle) (err error) { + r1, _, e1 := syscall.Syscall(procCloseHandle.Addr(), 1, uintptr(handle), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetStdHandle(stdhandle uint32) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procGetStdHandle.Addr(), 1, uintptr(stdhandle), 0, 0) + handle = Handle(r0) + if handle == InvalidHandle { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetStdHandle(stdhandle uint32, handle Handle) (err error) { + r1, _, e1 := syscall.Syscall(procSetStdHandle.Addr(), 2, uintptr(stdhandle), uintptr(handle), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func findFirstFile1(name *uint16, data *win32finddata1) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procFindFirstFileW.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(data)), 0) + handle = Handle(r0) + if handle == InvalidHandle { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func findNextFile1(handle Handle, data *win32finddata1) (err error) { + r1, _, e1 := syscall.Syscall(procFindNextFileW.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(data)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FindClose(handle Handle) (err error) { + r1, _, e1 := syscall.Syscall(procFindClose.Addr(), 1, uintptr(handle), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetFileInformationByHandle(handle Handle, data *ByHandleFileInformation) (err error) { + r1, _, e1 := syscall.Syscall(procGetFileInformationByHandle.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(data)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetCurrentDirectory(buflen uint32, buf *uint16) (n uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetCurrentDirectoryW.Addr(), 2, uintptr(buflen), uintptr(unsafe.Pointer(buf)), 0) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetCurrentDirectory(path *uint16) (err error) { + r1, _, e1 := syscall.Syscall(procSetCurrentDirectoryW.Addr(), 1, uintptr(unsafe.Pointer(path)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreateDirectory(path *uint16, sa *SecurityAttributes) (err error) { + r1, _, e1 := syscall.Syscall(procCreateDirectoryW.Addr(), 2, uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(sa)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func RemoveDirectory(path *uint16) (err error) { + r1, _, e1 := syscall.Syscall(procRemoveDirectoryW.Addr(), 1, uintptr(unsafe.Pointer(path)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func DeleteFile(path *uint16) (err error) { + r1, _, e1 := syscall.Syscall(procDeleteFileW.Addr(), 1, uintptr(unsafe.Pointer(path)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func MoveFile(from *uint16, to *uint16) (err error) { + r1, _, e1 := syscall.Syscall(procMoveFileW.Addr(), 2, uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(to)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func MoveFileEx(from *uint16, to *uint16, flags uint32) (err error) { + r1, _, e1 := syscall.Syscall(procMoveFileExW.Addr(), 3, uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(to)), uintptr(flags)) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetComputerName(buf *uint16, n *uint32) (err error) { + r1, _, e1 := syscall.Syscall(procGetComputerNameW.Addr(), 2, uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(n)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetComputerNameEx(nametype uint32, buf *uint16, n *uint32) (err error) { + r1, _, e1 := syscall.Syscall(procGetComputerNameExW.Addr(), 3, uintptr(nametype), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(n))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetEndOfFile(handle Handle) (err error) { + r1, _, e1 := syscall.Syscall(procSetEndOfFile.Addr(), 1, uintptr(handle), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetSystemTimeAsFileTime(time *Filetime) { + syscall.Syscall(procGetSystemTimeAsFileTime.Addr(), 1, uintptr(unsafe.Pointer(time)), 0, 0) + return +} + +func GetSystemTimePreciseAsFileTime(time *Filetime) { + syscall.Syscall(procGetSystemTimePreciseAsFileTime.Addr(), 1, uintptr(unsafe.Pointer(time)), 0, 0) + return +} + +func GetTimeZoneInformation(tzi *Timezoneinformation) (rc uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetTimeZoneInformation.Addr(), 1, uintptr(unsafe.Pointer(tzi)), 0, 0) + rc = uint32(r0) + if rc == 0xffffffff { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreateIoCompletionPort(filehandle Handle, cphandle Handle, key uint32, threadcnt uint32) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall6(procCreateIoCompletionPort.Addr(), 4, uintptr(filehandle), uintptr(cphandle), uintptr(key), uintptr(threadcnt), 0, 0) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetQueuedCompletionStatus(cphandle Handle, qty *uint32, key *uint32, overlapped **Overlapped, timeout uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procGetQueuedCompletionStatus.Addr(), 5, uintptr(cphandle), uintptr(unsafe.Pointer(qty)), uintptr(unsafe.Pointer(key)), uintptr(unsafe.Pointer(overlapped)), uintptr(timeout), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func PostQueuedCompletionStatus(cphandle Handle, qty uint32, key uint32, overlapped *Overlapped) (err error) { + r1, _, e1 := syscall.Syscall6(procPostQueuedCompletionStatus.Addr(), 4, uintptr(cphandle), uintptr(qty), uintptr(key), uintptr(unsafe.Pointer(overlapped)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CancelIo(s Handle) (err error) { + r1, _, e1 := syscall.Syscall(procCancelIo.Addr(), 1, uintptr(s), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CancelIoEx(s Handle, o *Overlapped) (err error) { + r1, _, e1 := syscall.Syscall(procCancelIoEx.Addr(), 2, uintptr(s), uintptr(unsafe.Pointer(o)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreateProcess(appName *uint16, commandLine *uint16, procSecurity *SecurityAttributes, threadSecurity *SecurityAttributes, inheritHandles bool, creationFlags uint32, env *uint16, currentDir *uint16, startupInfo *StartupInfo, outProcInfo *ProcessInformation) (err error) { + var _p0 uint32 + if inheritHandles { + _p0 = 1 + } else { + _p0 = 0 + } + r1, _, e1 := syscall.Syscall12(procCreateProcessW.Addr(), 10, uintptr(unsafe.Pointer(appName)), uintptr(unsafe.Pointer(commandLine)), uintptr(unsafe.Pointer(procSecurity)), uintptr(unsafe.Pointer(threadSecurity)), uintptr(_p0), uintptr(creationFlags), uintptr(unsafe.Pointer(env)), uintptr(unsafe.Pointer(currentDir)), uintptr(unsafe.Pointer(startupInfo)), uintptr(unsafe.Pointer(outProcInfo)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func OpenProcess(da uint32, inheritHandle bool, pid uint32) (handle Handle, err error) { + var _p0 uint32 + if inheritHandle { + _p0 = 1 + } else { + _p0 = 0 + } + r0, _, e1 := syscall.Syscall(procOpenProcess.Addr(), 3, uintptr(da), uintptr(_p0), uintptr(pid)) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func TerminateProcess(handle Handle, exitcode uint32) (err error) { + r1, _, e1 := syscall.Syscall(procTerminateProcess.Addr(), 2, uintptr(handle), uintptr(exitcode), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetExitCodeProcess(handle Handle, exitcode *uint32) (err error) { + r1, _, e1 := syscall.Syscall(procGetExitCodeProcess.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(exitcode)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetStartupInfo(startupInfo *StartupInfo) (err error) { + r1, _, e1 := syscall.Syscall(procGetStartupInfoW.Addr(), 1, uintptr(unsafe.Pointer(startupInfo)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetCurrentProcess() (pseudoHandle Handle, err error) { + r0, _, e1 := syscall.Syscall(procGetCurrentProcess.Addr(), 0, 0, 0, 0) + pseudoHandle = Handle(r0) + if pseudoHandle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetProcessTimes(handle Handle, creationTime *Filetime, exitTime *Filetime, kernelTime *Filetime, userTime *Filetime) (err error) { + r1, _, e1 := syscall.Syscall6(procGetProcessTimes.Addr(), 5, uintptr(handle), uintptr(unsafe.Pointer(creationTime)), uintptr(unsafe.Pointer(exitTime)), uintptr(unsafe.Pointer(kernelTime)), uintptr(unsafe.Pointer(userTime)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func DuplicateHandle(hSourceProcessHandle Handle, hSourceHandle Handle, hTargetProcessHandle Handle, lpTargetHandle *Handle, dwDesiredAccess uint32, bInheritHandle bool, dwOptions uint32) (err error) { + var _p0 uint32 + if bInheritHandle { + _p0 = 1 + } else { + _p0 = 0 + } + r1, _, e1 := syscall.Syscall9(procDuplicateHandle.Addr(), 7, uintptr(hSourceProcessHandle), uintptr(hSourceHandle), uintptr(hTargetProcessHandle), uintptr(unsafe.Pointer(lpTargetHandle)), uintptr(dwDesiredAccess), uintptr(_p0), uintptr(dwOptions), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func WaitForSingleObject(handle Handle, waitMilliseconds uint32) (event uint32, err error) { + r0, _, e1 := syscall.Syscall(procWaitForSingleObject.Addr(), 2, uintptr(handle), uintptr(waitMilliseconds), 0) + event = uint32(r0) + if event == 0xffffffff { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetTempPath(buflen uint32, buf *uint16) (n uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetTempPathW.Addr(), 2, uintptr(buflen), uintptr(unsafe.Pointer(buf)), 0) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreatePipe(readhandle *Handle, writehandle *Handle, sa *SecurityAttributes, size uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procCreatePipe.Addr(), 4, uintptr(unsafe.Pointer(readhandle)), uintptr(unsafe.Pointer(writehandle)), uintptr(unsafe.Pointer(sa)), uintptr(size), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetFileType(filehandle Handle) (n uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetFileType.Addr(), 1, uintptr(filehandle), 0, 0) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CryptAcquireContext(provhandle *Handle, container *uint16, provider *uint16, provtype uint32, flags uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procCryptAcquireContextW.Addr(), 5, uintptr(unsafe.Pointer(provhandle)), uintptr(unsafe.Pointer(container)), uintptr(unsafe.Pointer(provider)), uintptr(provtype), uintptr(flags), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CryptReleaseContext(provhandle Handle, flags uint32) (err error) { + r1, _, e1 := syscall.Syscall(procCryptReleaseContext.Addr(), 2, uintptr(provhandle), uintptr(flags), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CryptGenRandom(provhandle Handle, buflen uint32, buf *byte) (err error) { + r1, _, e1 := syscall.Syscall(procCryptGenRandom.Addr(), 3, uintptr(provhandle), uintptr(buflen), uintptr(unsafe.Pointer(buf))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetEnvironmentStrings() (envs *uint16, err error) { + r0, _, e1 := syscall.Syscall(procGetEnvironmentStringsW.Addr(), 0, 0, 0, 0) + envs = (*uint16)(unsafe.Pointer(r0)) + if envs == nil { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FreeEnvironmentStrings(envs *uint16) (err error) { + r1, _, e1 := syscall.Syscall(procFreeEnvironmentStringsW.Addr(), 1, uintptr(unsafe.Pointer(envs)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetEnvironmentVariable(name *uint16, buffer *uint16, size uint32) (n uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetEnvironmentVariableW.Addr(), 3, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(buffer)), uintptr(size)) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetEnvironmentVariable(name *uint16, value *uint16) (err error) { + r1, _, e1 := syscall.Syscall(procSetEnvironmentVariableW.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(value)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetFileTime(handle Handle, ctime *Filetime, atime *Filetime, wtime *Filetime) (err error) { + r1, _, e1 := syscall.Syscall6(procSetFileTime.Addr(), 4, uintptr(handle), uintptr(unsafe.Pointer(ctime)), uintptr(unsafe.Pointer(atime)), uintptr(unsafe.Pointer(wtime)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetFileAttributes(name *uint16) (attrs uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetFileAttributesW.Addr(), 1, uintptr(unsafe.Pointer(name)), 0, 0) + attrs = uint32(r0) + if attrs == INVALID_FILE_ATTRIBUTES { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetFileAttributes(name *uint16, attrs uint32) (err error) { + r1, _, e1 := syscall.Syscall(procSetFileAttributesW.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(attrs), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetFileAttributesEx(name *uint16, level uint32, info *byte) (err error) { + r1, _, e1 := syscall.Syscall(procGetFileAttributesExW.Addr(), 3, uintptr(unsafe.Pointer(name)), uintptr(level), uintptr(unsafe.Pointer(info))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetCommandLine() (cmd *uint16) { + r0, _, _ := syscall.Syscall(procGetCommandLineW.Addr(), 0, 0, 0, 0) + cmd = (*uint16)(unsafe.Pointer(r0)) + return +} + +func CommandLineToArgv(cmd *uint16, argc *int32) (argv *[8192]*[8192]uint16, err error) { + r0, _, e1 := syscall.Syscall(procCommandLineToArgvW.Addr(), 2, uintptr(unsafe.Pointer(cmd)), uintptr(unsafe.Pointer(argc)), 0) + argv = (*[8192]*[8192]uint16)(unsafe.Pointer(r0)) + if argv == nil { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func LocalFree(hmem Handle) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procLocalFree.Addr(), 1, uintptr(hmem), 0, 0) + handle = Handle(r0) + if handle != 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetHandleInformation(handle Handle, mask uint32, flags uint32) (err error) { + r1, _, e1 := syscall.Syscall(procSetHandleInformation.Addr(), 3, uintptr(handle), uintptr(mask), uintptr(flags)) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FlushFileBuffers(handle Handle) (err error) { + r1, _, e1 := syscall.Syscall(procFlushFileBuffers.Addr(), 1, uintptr(handle), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetFullPathName(path *uint16, buflen uint32, buf *uint16, fname **uint16) (n uint32, err error) { + r0, _, e1 := syscall.Syscall6(procGetFullPathNameW.Addr(), 4, uintptr(unsafe.Pointer(path)), uintptr(buflen), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(fname)), 0, 0) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetLongPathName(path *uint16, buf *uint16, buflen uint32) (n uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetLongPathNameW.Addr(), 3, uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(buf)), uintptr(buflen)) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetShortPathName(longpath *uint16, shortpath *uint16, buflen uint32) (n uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetShortPathNameW.Addr(), 3, uintptr(unsafe.Pointer(longpath)), uintptr(unsafe.Pointer(shortpath)), uintptr(buflen)) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreateFileMapping(fhandle Handle, sa *SecurityAttributes, prot uint32, maxSizeHigh uint32, maxSizeLow uint32, name *uint16) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall6(procCreateFileMappingW.Addr(), 6, uintptr(fhandle), uintptr(unsafe.Pointer(sa)), uintptr(prot), uintptr(maxSizeHigh), uintptr(maxSizeLow), uintptr(unsafe.Pointer(name))) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func MapViewOfFile(handle Handle, access uint32, offsetHigh uint32, offsetLow uint32, length uintptr) (addr uintptr, err error) { + r0, _, e1 := syscall.Syscall6(procMapViewOfFile.Addr(), 5, uintptr(handle), uintptr(access), uintptr(offsetHigh), uintptr(offsetLow), uintptr(length), 0) + addr = uintptr(r0) + if addr == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func UnmapViewOfFile(addr uintptr) (err error) { + r1, _, e1 := syscall.Syscall(procUnmapViewOfFile.Addr(), 1, uintptr(addr), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FlushViewOfFile(addr uintptr, length uintptr) (err error) { + r1, _, e1 := syscall.Syscall(procFlushViewOfFile.Addr(), 2, uintptr(addr), uintptr(length), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func VirtualLock(addr uintptr, length uintptr) (err error) { + r1, _, e1 := syscall.Syscall(procVirtualLock.Addr(), 2, uintptr(addr), uintptr(length), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func VirtualUnlock(addr uintptr, length uintptr) (err error) { + r1, _, e1 := syscall.Syscall(procVirtualUnlock.Addr(), 2, uintptr(addr), uintptr(length), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func VirtualAlloc(address uintptr, size uintptr, alloctype uint32, protect uint32) (value uintptr, err error) { + r0, _, e1 := syscall.Syscall6(procVirtualAlloc.Addr(), 4, uintptr(address), uintptr(size), uintptr(alloctype), uintptr(protect), 0, 0) + value = uintptr(r0) + if value == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func VirtualFree(address uintptr, size uintptr, freetype uint32) (err error) { + r1, _, e1 := syscall.Syscall(procVirtualFree.Addr(), 3, uintptr(address), uintptr(size), uintptr(freetype)) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func VirtualProtect(address uintptr, size uintptr, newprotect uint32, oldprotect *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procVirtualProtect.Addr(), 4, uintptr(address), uintptr(size), uintptr(newprotect), uintptr(unsafe.Pointer(oldprotect)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func TransmitFile(s Handle, handle Handle, bytesToWrite uint32, bytsPerSend uint32, overlapped *Overlapped, transmitFileBuf *TransmitFileBuffers, flags uint32) (err error) { + r1, _, e1 := syscall.Syscall9(procTransmitFile.Addr(), 7, uintptr(s), uintptr(handle), uintptr(bytesToWrite), uintptr(bytsPerSend), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(transmitFileBuf)), uintptr(flags), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ReadDirectoryChanges(handle Handle, buf *byte, buflen uint32, watchSubTree bool, mask uint32, retlen *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) { + var _p0 uint32 + if watchSubTree { + _p0 = 1 + } else { + _p0 = 0 + } + r1, _, e1 := syscall.Syscall9(procReadDirectoryChangesW.Addr(), 8, uintptr(handle), uintptr(unsafe.Pointer(buf)), uintptr(buflen), uintptr(_p0), uintptr(mask), uintptr(unsafe.Pointer(retlen)), uintptr(unsafe.Pointer(overlapped)), uintptr(completionRoutine), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CertOpenSystemStore(hprov Handle, name *uint16) (store Handle, err error) { + r0, _, e1 := syscall.Syscall(procCertOpenSystemStoreW.Addr(), 2, uintptr(hprov), uintptr(unsafe.Pointer(name)), 0) + store = Handle(r0) + if store == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CertOpenStore(storeProvider uintptr, msgAndCertEncodingType uint32, cryptProv uintptr, flags uint32, para uintptr) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall6(procCertOpenStore.Addr(), 5, uintptr(storeProvider), uintptr(msgAndCertEncodingType), uintptr(cryptProv), uintptr(flags), uintptr(para), 0) + handle = Handle(r0) + if handle == InvalidHandle { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CertEnumCertificatesInStore(store Handle, prevContext *CertContext) (context *CertContext, err error) { + r0, _, e1 := syscall.Syscall(procCertEnumCertificatesInStore.Addr(), 2, uintptr(store), uintptr(unsafe.Pointer(prevContext)), 0) + context = (*CertContext)(unsafe.Pointer(r0)) + if context == nil { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CertAddCertificateContextToStore(store Handle, certContext *CertContext, addDisposition uint32, storeContext **CertContext) (err error) { + r1, _, e1 := syscall.Syscall6(procCertAddCertificateContextToStore.Addr(), 4, uintptr(store), uintptr(unsafe.Pointer(certContext)), uintptr(addDisposition), uintptr(unsafe.Pointer(storeContext)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CertCloseStore(store Handle, flags uint32) (err error) { + r1, _, e1 := syscall.Syscall(procCertCloseStore.Addr(), 2, uintptr(store), uintptr(flags), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CertGetCertificateChain(engine Handle, leaf *CertContext, time *Filetime, additionalStore Handle, para *CertChainPara, flags uint32, reserved uintptr, chainCtx **CertChainContext) (err error) { + r1, _, e1 := syscall.Syscall9(procCertGetCertificateChain.Addr(), 8, uintptr(engine), uintptr(unsafe.Pointer(leaf)), uintptr(unsafe.Pointer(time)), uintptr(additionalStore), uintptr(unsafe.Pointer(para)), uintptr(flags), uintptr(reserved), uintptr(unsafe.Pointer(chainCtx)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CertFreeCertificateChain(ctx *CertChainContext) { + syscall.Syscall(procCertFreeCertificateChain.Addr(), 1, uintptr(unsafe.Pointer(ctx)), 0, 0) + return +} + +func CertCreateCertificateContext(certEncodingType uint32, certEncoded *byte, encodedLen uint32) (context *CertContext, err error) { + r0, _, e1 := syscall.Syscall(procCertCreateCertificateContext.Addr(), 3, uintptr(certEncodingType), uintptr(unsafe.Pointer(certEncoded)), uintptr(encodedLen)) + context = (*CertContext)(unsafe.Pointer(r0)) + if context == nil { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CertFreeCertificateContext(ctx *CertContext) (err error) { + r1, _, e1 := syscall.Syscall(procCertFreeCertificateContext.Addr(), 1, uintptr(unsafe.Pointer(ctx)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CertVerifyCertificateChainPolicy(policyOID uintptr, chain *CertChainContext, para *CertChainPolicyPara, status *CertChainPolicyStatus) (err error) { + r1, _, e1 := syscall.Syscall6(procCertVerifyCertificateChainPolicy.Addr(), 4, uintptr(policyOID), uintptr(unsafe.Pointer(chain)), uintptr(unsafe.Pointer(para)), uintptr(unsafe.Pointer(status)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func RegOpenKeyEx(key Handle, subkey *uint16, options uint32, desiredAccess uint32, result *Handle) (regerrno error) { + r0, _, _ := syscall.Syscall6(procRegOpenKeyExW.Addr(), 5, uintptr(key), uintptr(unsafe.Pointer(subkey)), uintptr(options), uintptr(desiredAccess), uintptr(unsafe.Pointer(result)), 0) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func RegCloseKey(key Handle) (regerrno error) { + r0, _, _ := syscall.Syscall(procRegCloseKey.Addr(), 1, uintptr(key), 0, 0) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func RegQueryInfoKey(key Handle, class *uint16, classLen *uint32, reserved *uint32, subkeysLen *uint32, maxSubkeyLen *uint32, maxClassLen *uint32, valuesLen *uint32, maxValueNameLen *uint32, maxValueLen *uint32, saLen *uint32, lastWriteTime *Filetime) (regerrno error) { + r0, _, _ := syscall.Syscall12(procRegQueryInfoKeyW.Addr(), 12, uintptr(key), uintptr(unsafe.Pointer(class)), uintptr(unsafe.Pointer(classLen)), uintptr(unsafe.Pointer(reserved)), uintptr(unsafe.Pointer(subkeysLen)), uintptr(unsafe.Pointer(maxSubkeyLen)), uintptr(unsafe.Pointer(maxClassLen)), uintptr(unsafe.Pointer(valuesLen)), uintptr(unsafe.Pointer(maxValueNameLen)), uintptr(unsafe.Pointer(maxValueLen)), uintptr(unsafe.Pointer(saLen)), uintptr(unsafe.Pointer(lastWriteTime))) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func RegEnumKeyEx(key Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, class *uint16, classLen *uint32, lastWriteTime *Filetime) (regerrno error) { + r0, _, _ := syscall.Syscall9(procRegEnumKeyExW.Addr(), 8, uintptr(key), uintptr(index), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(nameLen)), uintptr(unsafe.Pointer(reserved)), uintptr(unsafe.Pointer(class)), uintptr(unsafe.Pointer(classLen)), uintptr(unsafe.Pointer(lastWriteTime)), 0) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func RegQueryValueEx(key Handle, name *uint16, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) { + r0, _, _ := syscall.Syscall6(procRegQueryValueExW.Addr(), 6, uintptr(key), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(reserved)), uintptr(unsafe.Pointer(valtype)), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(buflen))) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func getCurrentProcessId() (pid uint32) { + r0, _, _ := syscall.Syscall(procGetCurrentProcessId.Addr(), 0, 0, 0, 0) + pid = uint32(r0) + return +} + +func GetConsoleMode(console Handle, mode *uint32) (err error) { + r1, _, e1 := syscall.Syscall(procGetConsoleMode.Addr(), 2, uintptr(console), uintptr(unsafe.Pointer(mode)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetConsoleMode(console Handle, mode uint32) (err error) { + r1, _, e1 := syscall.Syscall(procSetConsoleMode.Addr(), 2, uintptr(console), uintptr(mode), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetConsoleScreenBufferInfo(console Handle, info *ConsoleScreenBufferInfo) (err error) { + r1, _, e1 := syscall.Syscall(procGetConsoleScreenBufferInfo.Addr(), 2, uintptr(console), uintptr(unsafe.Pointer(info)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func WriteConsole(console Handle, buf *uint16, towrite uint32, written *uint32, reserved *byte) (err error) { + r1, _, e1 := syscall.Syscall6(procWriteConsoleW.Addr(), 5, uintptr(console), uintptr(unsafe.Pointer(buf)), uintptr(towrite), uintptr(unsafe.Pointer(written)), uintptr(unsafe.Pointer(reserved)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ReadConsole(console Handle, buf *uint16, toread uint32, read *uint32, inputControl *byte) (err error) { + r1, _, e1 := syscall.Syscall6(procReadConsoleW.Addr(), 5, uintptr(console), uintptr(unsafe.Pointer(buf)), uintptr(toread), uintptr(unsafe.Pointer(read)), uintptr(unsafe.Pointer(inputControl)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreateToolhelp32Snapshot(flags uint32, processId uint32) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procCreateToolhelp32Snapshot.Addr(), 2, uintptr(flags), uintptr(processId), 0) + handle = Handle(r0) + if handle == InvalidHandle { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func Process32First(snapshot Handle, procEntry *ProcessEntry32) (err error) { + r1, _, e1 := syscall.Syscall(procProcess32FirstW.Addr(), 2, uintptr(snapshot), uintptr(unsafe.Pointer(procEntry)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func Process32Next(snapshot Handle, procEntry *ProcessEntry32) (err error) { + r1, _, e1 := syscall.Syscall(procProcess32NextW.Addr(), 2, uintptr(snapshot), uintptr(unsafe.Pointer(procEntry)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func DeviceIoControl(handle Handle, ioControlCode uint32, inBuffer *byte, inBufferSize uint32, outBuffer *byte, outBufferSize uint32, bytesReturned *uint32, overlapped *Overlapped) (err error) { + r1, _, e1 := syscall.Syscall9(procDeviceIoControl.Addr(), 8, uintptr(handle), uintptr(ioControlCode), uintptr(unsafe.Pointer(inBuffer)), uintptr(inBufferSize), uintptr(unsafe.Pointer(outBuffer)), uintptr(outBufferSize), uintptr(unsafe.Pointer(bytesReturned)), uintptr(unsafe.Pointer(overlapped)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreateSymbolicLink(symlinkfilename *uint16, targetfilename *uint16, flags uint32) (err error) { + r1, _, e1 := syscall.Syscall(procCreateSymbolicLinkW.Addr(), 3, uintptr(unsafe.Pointer(symlinkfilename)), uintptr(unsafe.Pointer(targetfilename)), uintptr(flags)) + if r1&0xff == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreateHardLink(filename *uint16, existingfilename *uint16, reserved uintptr) (err error) { + r1, _, e1 := syscall.Syscall(procCreateHardLinkW.Addr(), 3, uintptr(unsafe.Pointer(filename)), uintptr(unsafe.Pointer(existingfilename)), uintptr(reserved)) + if r1&0xff == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetCurrentThreadId() (id uint32) { + r0, _, _ := syscall.Syscall(procGetCurrentThreadId.Addr(), 0, 0, 0, 0) + id = uint32(r0) + return +} + +func CreateEvent(eventAttrs *SecurityAttributes, manualReset uint32, initialState uint32, name *uint16) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall6(procCreateEventW.Addr(), 4, uintptr(unsafe.Pointer(eventAttrs)), uintptr(manualReset), uintptr(initialState), uintptr(unsafe.Pointer(name)), 0, 0) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreateEventEx(eventAttrs *SecurityAttributes, name *uint16, flags uint32, desiredAccess uint32) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall6(procCreateEventExW.Addr(), 4, uintptr(unsafe.Pointer(eventAttrs)), uintptr(unsafe.Pointer(name)), uintptr(flags), uintptr(desiredAccess), 0, 0) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func OpenEvent(desiredAccess uint32, inheritHandle bool, name *uint16) (handle Handle, err error) { + var _p0 uint32 + if inheritHandle { + _p0 = 1 + } else { + _p0 = 0 + } + r0, _, e1 := syscall.Syscall(procOpenEventW.Addr(), 3, uintptr(desiredAccess), uintptr(_p0), uintptr(unsafe.Pointer(name))) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetEvent(event Handle) (err error) { + r1, _, e1 := syscall.Syscall(procSetEvent.Addr(), 1, uintptr(event), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ResetEvent(event Handle) (err error) { + r1, _, e1 := syscall.Syscall(procResetEvent.Addr(), 1, uintptr(event), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func PulseEvent(event Handle) (err error) { + r1, _, e1 := syscall.Syscall(procPulseEvent.Addr(), 1, uintptr(event), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func WSAStartup(verreq uint32, data *WSAData) (sockerr error) { + r0, _, _ := syscall.Syscall(procWSAStartup.Addr(), 2, uintptr(verreq), uintptr(unsafe.Pointer(data)), 0) + if r0 != 0 { + sockerr = syscall.Errno(r0) + } + return +} + +func WSACleanup() (err error) { + r1, _, e1 := syscall.Syscall(procWSACleanup.Addr(), 0, 0, 0, 0) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func WSAIoctl(s Handle, iocc uint32, inbuf *byte, cbif uint32, outbuf *byte, cbob uint32, cbbr *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) { + r1, _, e1 := syscall.Syscall9(procWSAIoctl.Addr(), 9, uintptr(s), uintptr(iocc), uintptr(unsafe.Pointer(inbuf)), uintptr(cbif), uintptr(unsafe.Pointer(outbuf)), uintptr(cbob), uintptr(unsafe.Pointer(cbbr)), uintptr(unsafe.Pointer(overlapped)), uintptr(completionRoutine)) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func socket(af int32, typ int32, protocol int32) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procsocket.Addr(), 3, uintptr(af), uintptr(typ), uintptr(protocol)) + handle = Handle(r0) + if handle == InvalidHandle { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func Setsockopt(s Handle, level int32, optname int32, optval *byte, optlen int32) (err error) { + r1, _, e1 := syscall.Syscall6(procsetsockopt.Addr(), 5, uintptr(s), uintptr(level), uintptr(optname), uintptr(unsafe.Pointer(optval)), uintptr(optlen), 0) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func Getsockopt(s Handle, level int32, optname int32, optval *byte, optlen *int32) (err error) { + r1, _, e1 := syscall.Syscall6(procgetsockopt.Addr(), 5, uintptr(s), uintptr(level), uintptr(optname), uintptr(unsafe.Pointer(optval)), uintptr(unsafe.Pointer(optlen)), 0) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func bind(s Handle, name unsafe.Pointer, namelen int32) (err error) { + r1, _, e1 := syscall.Syscall(procbind.Addr(), 3, uintptr(s), uintptr(name), uintptr(namelen)) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func connect(s Handle, name unsafe.Pointer, namelen int32) (err error) { + r1, _, e1 := syscall.Syscall(procconnect.Addr(), 3, uintptr(s), uintptr(name), uintptr(namelen)) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func getsockname(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) { + r1, _, e1 := syscall.Syscall(procgetsockname.Addr(), 3, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func getpeername(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) { + r1, _, e1 := syscall.Syscall(procgetpeername.Addr(), 3, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func listen(s Handle, backlog int32) (err error) { + r1, _, e1 := syscall.Syscall(proclisten.Addr(), 2, uintptr(s), uintptr(backlog), 0) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func shutdown(s Handle, how int32) (err error) { + r1, _, e1 := syscall.Syscall(procshutdown.Addr(), 2, uintptr(s), uintptr(how), 0) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func Closesocket(s Handle) (err error) { + r1, _, e1 := syscall.Syscall(procclosesocket.Addr(), 1, uintptr(s), 0, 0) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func AcceptEx(ls Handle, as Handle, buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, recvd *uint32, overlapped *Overlapped) (err error) { + r1, _, e1 := syscall.Syscall9(procAcceptEx.Addr(), 8, uintptr(ls), uintptr(as), uintptr(unsafe.Pointer(buf)), uintptr(rxdatalen), uintptr(laddrlen), uintptr(raddrlen), uintptr(unsafe.Pointer(recvd)), uintptr(unsafe.Pointer(overlapped)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetAcceptExSockaddrs(buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, lrsa **RawSockaddrAny, lrsalen *int32, rrsa **RawSockaddrAny, rrsalen *int32) { + syscall.Syscall9(procGetAcceptExSockaddrs.Addr(), 8, uintptr(unsafe.Pointer(buf)), uintptr(rxdatalen), uintptr(laddrlen), uintptr(raddrlen), uintptr(unsafe.Pointer(lrsa)), uintptr(unsafe.Pointer(lrsalen)), uintptr(unsafe.Pointer(rrsa)), uintptr(unsafe.Pointer(rrsalen)), 0) + return +} + +func WSARecv(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, overlapped *Overlapped, croutine *byte) (err error) { + r1, _, e1 := syscall.Syscall9(procWSARecv.Addr(), 7, uintptr(s), uintptr(unsafe.Pointer(bufs)), uintptr(bufcnt), uintptr(unsafe.Pointer(recvd)), uintptr(unsafe.Pointer(flags)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)), 0, 0) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func WSASend(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, overlapped *Overlapped, croutine *byte) (err error) { + r1, _, e1 := syscall.Syscall9(procWSASend.Addr(), 7, uintptr(s), uintptr(unsafe.Pointer(bufs)), uintptr(bufcnt), uintptr(unsafe.Pointer(sent)), uintptr(flags), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)), 0, 0) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func WSARecvFrom(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, from *RawSockaddrAny, fromlen *int32, overlapped *Overlapped, croutine *byte) (err error) { + r1, _, e1 := syscall.Syscall9(procWSARecvFrom.Addr(), 9, uintptr(s), uintptr(unsafe.Pointer(bufs)), uintptr(bufcnt), uintptr(unsafe.Pointer(recvd)), uintptr(unsafe.Pointer(flags)), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine))) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func WSASendTo(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, to *RawSockaddrAny, tolen int32, overlapped *Overlapped, croutine *byte) (err error) { + r1, _, e1 := syscall.Syscall9(procWSASendTo.Addr(), 9, uintptr(s), uintptr(unsafe.Pointer(bufs)), uintptr(bufcnt), uintptr(unsafe.Pointer(sent)), uintptr(flags), uintptr(unsafe.Pointer(to)), uintptr(tolen), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine))) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetHostByName(name string) (h *Hostent, err error) { + var _p0 *byte + _p0, err = syscall.BytePtrFromString(name) + if err != nil { + return + } + return _GetHostByName(_p0) +} + +func _GetHostByName(name *byte) (h *Hostent, err error) { + r0, _, e1 := syscall.Syscall(procgethostbyname.Addr(), 1, uintptr(unsafe.Pointer(name)), 0, 0) + h = (*Hostent)(unsafe.Pointer(r0)) + if h == nil { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetServByName(name string, proto string) (s *Servent, err error) { + var _p0 *byte + _p0, err = syscall.BytePtrFromString(name) + if err != nil { + return + } + var _p1 *byte + _p1, err = syscall.BytePtrFromString(proto) + if err != nil { + return + } + return _GetServByName(_p0, _p1) +} + +func _GetServByName(name *byte, proto *byte) (s *Servent, err error) { + r0, _, e1 := syscall.Syscall(procgetservbyname.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(proto)), 0) + s = (*Servent)(unsafe.Pointer(r0)) + if s == nil { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func Ntohs(netshort uint16) (u uint16) { + r0, _, _ := syscall.Syscall(procntohs.Addr(), 1, uintptr(netshort), 0, 0) + u = uint16(r0) + return +} + +func GetProtoByName(name string) (p *Protoent, err error) { + var _p0 *byte + _p0, err = syscall.BytePtrFromString(name) + if err != nil { + return + } + return _GetProtoByName(_p0) +} + +func _GetProtoByName(name *byte) (p *Protoent, err error) { + r0, _, e1 := syscall.Syscall(procgetprotobyname.Addr(), 1, uintptr(unsafe.Pointer(name)), 0, 0) + p = (*Protoent)(unsafe.Pointer(r0)) + if p == nil { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func DnsQuery(name string, qtype uint16, options uint32, extra *byte, qrs **DNSRecord, pr *byte) (status error) { + var _p0 *uint16 + _p0, status = syscall.UTF16PtrFromString(name) + if status != nil { + return + } + return _DnsQuery(_p0, qtype, options, extra, qrs, pr) +} + +func _DnsQuery(name *uint16, qtype uint16, options uint32, extra *byte, qrs **DNSRecord, pr *byte) (status error) { + r0, _, _ := syscall.Syscall6(procDnsQuery_W.Addr(), 6, uintptr(unsafe.Pointer(name)), uintptr(qtype), uintptr(options), uintptr(unsafe.Pointer(extra)), uintptr(unsafe.Pointer(qrs)), uintptr(unsafe.Pointer(pr))) + if r0 != 0 { + status = syscall.Errno(r0) + } + return +} + +func DnsRecordListFree(rl *DNSRecord, freetype uint32) { + syscall.Syscall(procDnsRecordListFree.Addr(), 2, uintptr(unsafe.Pointer(rl)), uintptr(freetype), 0) + return +} + +func DnsNameCompare(name1 *uint16, name2 *uint16) (same bool) { + r0, _, _ := syscall.Syscall(procDnsNameCompare_W.Addr(), 2, uintptr(unsafe.Pointer(name1)), uintptr(unsafe.Pointer(name2)), 0) + same = r0 != 0 + return +} + +func GetAddrInfoW(nodename *uint16, servicename *uint16, hints *AddrinfoW, result **AddrinfoW) (sockerr error) { + r0, _, _ := syscall.Syscall6(procGetAddrInfoW.Addr(), 4, uintptr(unsafe.Pointer(nodename)), uintptr(unsafe.Pointer(servicename)), uintptr(unsafe.Pointer(hints)), uintptr(unsafe.Pointer(result)), 0, 0) + if r0 != 0 { + sockerr = syscall.Errno(r0) + } + return +} + +func FreeAddrInfoW(addrinfo *AddrinfoW) { + syscall.Syscall(procFreeAddrInfoW.Addr(), 1, uintptr(unsafe.Pointer(addrinfo)), 0, 0) + return +} + +func GetIfEntry(pIfRow *MibIfRow) (errcode error) { + r0, _, _ := syscall.Syscall(procGetIfEntry.Addr(), 1, uintptr(unsafe.Pointer(pIfRow)), 0, 0) + if r0 != 0 { + errcode = syscall.Errno(r0) + } + return +} + +func GetAdaptersInfo(ai *IpAdapterInfo, ol *uint32) (errcode error) { + r0, _, _ := syscall.Syscall(procGetAdaptersInfo.Addr(), 2, uintptr(unsafe.Pointer(ai)), uintptr(unsafe.Pointer(ol)), 0) + if r0 != 0 { + errcode = syscall.Errno(r0) + } + return +} + +func SetFileCompletionNotificationModes(handle Handle, flags uint8) (err error) { + r1, _, e1 := syscall.Syscall(procSetFileCompletionNotificationModes.Addr(), 2, uintptr(handle), uintptr(flags), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func WSAEnumProtocols(protocols *int32, protocolBuffer *WSAProtocolInfo, bufferLength *uint32) (n int32, err error) { + r0, _, e1 := syscall.Syscall(procWSAEnumProtocolsW.Addr(), 3, uintptr(unsafe.Pointer(protocols)), uintptr(unsafe.Pointer(protocolBuffer)), uintptr(unsafe.Pointer(bufferLength))) + n = int32(r0) + if n == -1 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetAdaptersAddresses(family uint32, flags uint32, reserved uintptr, adapterAddresses *IpAdapterAddresses, sizePointer *uint32) (errcode error) { + r0, _, _ := syscall.Syscall6(procGetAdaptersAddresses.Addr(), 5, uintptr(family), uintptr(flags), uintptr(reserved), uintptr(unsafe.Pointer(adapterAddresses)), uintptr(unsafe.Pointer(sizePointer)), 0) + if r0 != 0 { + errcode = syscall.Errno(r0) + } + return +} + +func GetACP() (acp uint32) { + r0, _, _ := syscall.Syscall(procGetACP.Addr(), 0, 0, 0, 0) + acp = uint32(r0) + return +} + +func MultiByteToWideChar(codePage uint32, dwFlags uint32, str *byte, nstr int32, wchar *uint16, nwchar int32) (nwrite int32, err error) { + r0, _, e1 := syscall.Syscall6(procMultiByteToWideChar.Addr(), 6, uintptr(codePage), uintptr(dwFlags), uintptr(unsafe.Pointer(str)), uintptr(nstr), uintptr(unsafe.Pointer(wchar)), uintptr(nwchar)) + nwrite = int32(r0) + if nwrite == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func TranslateName(accName *uint16, accNameFormat uint32, desiredNameFormat uint32, translatedName *uint16, nSize *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procTranslateNameW.Addr(), 5, uintptr(unsafe.Pointer(accName)), uintptr(accNameFormat), uintptr(desiredNameFormat), uintptr(unsafe.Pointer(translatedName)), uintptr(unsafe.Pointer(nSize)), 0) + if r1&0xff == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetUserNameEx(nameFormat uint32, nameBuffre *uint16, nSize *uint32) (err error) { + r1, _, e1 := syscall.Syscall(procGetUserNameExW.Addr(), 3, uintptr(nameFormat), uintptr(unsafe.Pointer(nameBuffre)), uintptr(unsafe.Pointer(nSize))) + if r1&0xff == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func NetUserGetInfo(serverName *uint16, userName *uint16, level uint32, buf **byte) (neterr error) { + r0, _, _ := syscall.Syscall6(procNetUserGetInfo.Addr(), 4, uintptr(unsafe.Pointer(serverName)), uintptr(unsafe.Pointer(userName)), uintptr(level), uintptr(unsafe.Pointer(buf)), 0, 0) + if r0 != 0 { + neterr = syscall.Errno(r0) + } + return +} + +func NetGetJoinInformation(server *uint16, name **uint16, bufType *uint32) (neterr error) { + r0, _, _ := syscall.Syscall(procNetGetJoinInformation.Addr(), 3, uintptr(unsafe.Pointer(server)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(bufType))) + if r0 != 0 { + neterr = syscall.Errno(r0) + } + return +} + +func NetApiBufferFree(buf *byte) (neterr error) { + r0, _, _ := syscall.Syscall(procNetApiBufferFree.Addr(), 1, uintptr(unsafe.Pointer(buf)), 0, 0) + if r0 != 0 { + neterr = syscall.Errno(r0) + } + return +} + +func LookupAccountSid(systemName *uint16, sid *SID, name *uint16, nameLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *uint32) (err error) { + r1, _, e1 := syscall.Syscall9(procLookupAccountSidW.Addr(), 7, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(nameLen)), uintptr(unsafe.Pointer(refdDomainName)), uintptr(unsafe.Pointer(refdDomainNameLen)), uintptr(unsafe.Pointer(use)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func LookupAccountName(systemName *uint16, accountName *uint16, sid *SID, sidLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *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(sidLen)), uintptr(unsafe.Pointer(refdDomainName)), uintptr(unsafe.Pointer(refdDomainNameLen)), uintptr(unsafe.Pointer(use)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ConvertSidToStringSid(sid *SID, stringSid **uint16) (err error) { + r1, _, e1 := syscall.Syscall(procConvertSidToStringSidW.Addr(), 2, uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(stringSid)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ConvertStringSidToSid(stringSid *uint16, sid **SID) (err error) { + r1, _, e1 := syscall.Syscall(procConvertStringSidToSidW.Addr(), 2, uintptr(unsafe.Pointer(stringSid)), uintptr(unsafe.Pointer(sid)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetLengthSid(sid *SID) (len uint32) { + r0, _, _ := syscall.Syscall(procGetLengthSid.Addr(), 1, uintptr(unsafe.Pointer(sid)), 0, 0) + len = uint32(r0) + return +} + +func CopySid(destSidLen uint32, destSid *SID, srcSid *SID) (err error) { + r1, _, e1 := syscall.Syscall(procCopySid.Addr(), 3, uintptr(destSidLen), uintptr(unsafe.Pointer(destSid)), uintptr(unsafe.Pointer(srcSid))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func AllocateAndInitializeSid(identAuth *SidIdentifierAuthority, subAuth byte, subAuth0 uint32, subAuth1 uint32, subAuth2 uint32, subAuth3 uint32, subAuth4 uint32, subAuth5 uint32, subAuth6 uint32, subAuth7 uint32, sid **SID) (err error) { + r1, _, e1 := syscall.Syscall12(procAllocateAndInitializeSid.Addr(), 11, uintptr(unsafe.Pointer(identAuth)), uintptr(subAuth), uintptr(subAuth0), uintptr(subAuth1), uintptr(subAuth2), uintptr(subAuth3), uintptr(subAuth4), uintptr(subAuth5), uintptr(subAuth6), uintptr(subAuth7), uintptr(unsafe.Pointer(sid)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FreeSid(sid *SID) (err error) { + r1, _, e1 := syscall.Syscall(procFreeSid.Addr(), 1, uintptr(unsafe.Pointer(sid)), 0, 0) + if r1 != 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func EqualSid(sid1 *SID, sid2 *SID) (isEqual bool) { + r0, _, _ := syscall.Syscall(procEqualSid.Addr(), 2, uintptr(unsafe.Pointer(sid1)), uintptr(unsafe.Pointer(sid2)), 0) + isEqual = r0 != 0 + return +} + +func OpenProcessToken(h Handle, access uint32, token *Token) (err error) { + r1, _, e1 := syscall.Syscall(procOpenProcessToken.Addr(), 3, uintptr(h), uintptr(access), uintptr(unsafe.Pointer(token))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetTokenInformation(t Token, infoClass uint32, info *byte, infoLen uint32, returnedLen *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procGetTokenInformation.Addr(), 5, uintptr(t), uintptr(infoClass), uintptr(unsafe.Pointer(info)), uintptr(infoLen), uintptr(unsafe.Pointer(returnedLen)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetUserProfileDirectory(t Token, dir *uint16, dirLen *uint32) (err error) { + r1, _, e1 := syscall.Syscall(procGetUserProfileDirectoryW.Addr(), 3, uintptr(t), uintptr(unsafe.Pointer(dir)), uintptr(unsafe.Pointer(dirLen))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/.travis.yml b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/.travis.yml new file mode 100644 index 0000000..e564b74 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/.travis.yml @@ -0,0 +1,4 @@ +sudo: false +language: go +install: go get -t -v ./... +go: 1.2 diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/COPYING b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/COPYING new file mode 100644 index 0000000..2993ec0 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/COPYING @@ -0,0 +1,19 @@ +Copyright (C) 2014 Alec Thomas + +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/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/README.md b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/README.md new file mode 100644 index 0000000..cd4edeb --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/README.md @@ -0,0 +1,674 @@ +# Kingpin - A Go (golang) command line and flag parser +[![](https://godoc.org/github.com/alecthomas/kingpin?status.svg)](http://godoc.org/github.com/alecthomas/kingpin) [![Build Status](https://travis-ci.org/alecthomas/kingpin.svg?branch=master)](https://travis-ci.org/alecthomas/kingpin) [![Gitter chat](https://badges.gitter.im/alecthomas.png)](https://gitter.im/alecthomas/Lobby) + + + + + +- [Overview](#overview) +- [Features](#features) +- [User-visible changes between v1 and v2](#user-visible-changes-between-v1-and-v2) + - [Flags can be used at any point after their definition.](#flags-can-be-used-at-any-point-after-their-definition) + - [Short flags can be combined with their parameters](#short-flags-can-be-combined-with-their-parameters) +- [API changes between v1 and v2](#api-changes-between-v1-and-v2) +- [Versions](#versions) + - [V2 is the current stable version](#v2-is-the-current-stable-version) + - [V1 is the OLD stable version](#v1-is-the-old-stable-version) +- [Change History](#change-history) +- [Examples](#examples) + - [Simple Example](#simple-example) + - [Complex Example](#complex-example) +- [Reference Documentation](#reference-documentation) + - [Displaying errors and usage information](#displaying-errors-and-usage-information) + - [Sub-commands](#sub-commands) + - [Custom Parsers](#custom-parsers) + - [Repeatable flags](#repeatable-flags) + - [Boolean Values](#boolean-values) + - [Default Values](#default-values) + - [Place-holders in Help](#place-holders-in-help) + - [Consuming all remaining arguments](#consuming-all-remaining-arguments) + - [Bash/ZSH Shell Completion](#bashzsh-shell-completion) + - [Supporting -h for help](#supporting--h-for-help) + - [Custom help](#custom-help) + + + +## Overview + +Kingpin is a [fluent-style](http://en.wikipedia.org/wiki/Fluent_interface), +type-safe command-line parser. It supports flags, nested commands, and +positional arguments. + +Install it with: + + $ go get gopkg.in/alecthomas/kingpin.v2 + +It looks like this: + +```go +var ( + verbose = kingpin.Flag("verbose", "Verbose mode.").Short('v').Bool() + name = kingpin.Arg("name", "Name of user.").Required().String() +) + +func main() { + kingpin.Parse() + fmt.Printf("%v, %s\n", *verbose, *name) +} +``` + +More [examples](https://github.com/alecthomas/kingpin/tree/master/_examples) are available. + +Second to parsing, providing the user with useful help is probably the most +important thing a command-line parser does. Kingpin tries to provide detailed +contextual help if `--help` is encountered at any point in the command line +(excluding after `--`). + +## Features + +- Help output that isn't as ugly as sin. +- Fully [customisable help](#custom-help), via Go templates. +- Parsed, type-safe flags (`kingpin.Flag("f", "help").Int()`) +- Parsed, type-safe positional arguments (`kingpin.Arg("a", "help").Int()`). +- Parsed, type-safe, arbitrarily deep commands (`kingpin.Command("c", "help")`). +- Support for required flags and required positional arguments (`kingpin.Flag("f", "").Required().Int()`). +- Support for arbitrarily nested default commands (`command.Default()`). +- Callbacks per command, flag and argument (`kingpin.Command("c", "").Action(myAction)`). +- POSIX-style short flag combining (`-a -b` -> `-ab`). +- Short-flag+parameter combining (`-a parm` -> `-aparm`). +- Read command-line from files (`@`). +- Automatically generate man pages (`--help-man`). + +## User-visible changes between v1 and v2 + +### Flags can be used at any point after their definition. + +Flags can be specified at any point after their definition, not just +*immediately after their associated command*. From the chat example below, the +following used to be required: + +``` +$ chat --server=chat.server.com:8080 post --image=~/Downloads/owls.jpg pics +``` + +But the following will now work: + +``` +$ chat post --server=chat.server.com:8080 --image=~/Downloads/owls.jpg pics +``` + +### Short flags can be combined with their parameters + +Previously, if a short flag was used, any argument to that flag would have to +be separated by a space. That is no longer the case. + +## API changes between v1 and v2 + +- `ParseWithFileExpansion()` is gone. The new parser directly supports expanding `@`. +- Added `FatalUsage()` and `FatalUsageContext()` for displaying an error + usage and terminating. +- `Dispatch()` renamed to `Action()`. +- Added `ParseContext()` for parsing a command line into its intermediate context form without executing. +- Added `Terminate()` function to override the termination function. +- Added `UsageForContextWithTemplate()` for printing usage via a custom template. +- Added `UsageTemplate()` for overriding the default template to use. Two templates are included: + 1. `DefaultUsageTemplate` - default template. + 2. `CompactUsageTemplate` - compact command template for larger applications. + +## Versions + +Kingpin uses [gopkg.in](https://gopkg.in/alecthomas/kingpin) for versioning. + +The current stable version is [gopkg.in/alecthomas/kingpin.v2](https://gopkg.in/alecthomas/kingpin.v2). The previous version, [gopkg.in/alecthomas/kingpin.v1](https://gopkg.in/alecthomas/kingpin.v1), is deprecated and in maintenance mode. + +### [V2](https://gopkg.in/alecthomas/kingpin.v2) is the current stable version + +Installation: + +```sh +$ go get gopkg.in/alecthomas/kingpin.v2 +``` + +### [V1](https://gopkg.in/alecthomas/kingpin.v1) is the OLD stable version + +Installation: + +```sh +$ go get gopkg.in/alecthomas/kingpin.v1 +``` + +## Change History + +- *2015-09-19* -- Stable v2.1.0 release. + - Added `command.Default()` to specify a default command to use if no other + command matches. This allows for convenient user shortcuts. + - Exposed `HelpFlag` and `VersionFlag` for further customisation. + - `Action()` and `PreAction()` added and both now support an arbitrary + number of callbacks. + - `kingpin.SeparateOptionalFlagsUsageTemplate`. + - `--help-long` and `--help-man` (hidden by default) flags. + - Flags are "interspersed" by default, but can be disabled with `app.Interspersed(false)`. + - Added flags for all simple builtin types (int8, uint16, etc.) and slice variants. + - Use `app.Writer(os.Writer)` to specify the default writer for all output functions. + - Dropped `os.Writer` prefix from all printf-like functions. + +- *2015-05-22* -- Stable v2.0.0 release. + - Initial stable release of v2.0.0. + - Fully supports interspersed flags, commands and arguments. + - Flags can be present at any point after their logical definition. + - Application.Parse() terminates if commands are present and a command is not parsed. + - Dispatch() -> Action(). + - Actions are dispatched after all values are populated. + - Override termination function (defaults to os.Exit). + - Override output stream (defaults to os.Stderr). + - Templatised usage help, with default and compact templates. + - Make error/usage functions more consistent. + - Support argument expansion from files by default (with @). + - Fully public data model is available via .Model(). + - Parser has been completely refactored. + - Parsing and execution has been split into distinct stages. + - Use `go generate` to generate repeated flags. + - Support combined short-flag+argument: -fARG. + +- *2015-01-23* -- Stable v1.3.4 release. + - Support "--" for separating flags from positional arguments. + - Support loading flags from files (ParseWithFileExpansion()). Use @FILE as an argument. + - Add post-app and post-cmd validation hooks. This allows arbitrary validation to be added. + - A bunch of improvements to help usage and formatting. + - Support arbitrarily nested sub-commands. + +- *2014-07-08* -- Stable v1.2.0 release. + - Pass any value through to `Strings()` when final argument. + Allows for values that look like flags to be processed. + - Allow `--help` to be used with commands. + - Support `Hidden()` flags. + - Parser for [units.Base2Bytes](https://github.com/alecthomas/units) + type. Allows for flags like `--ram=512MB` or `--ram=1GB`. + - Add an `Enum()` value, allowing only one of a set of values + to be selected. eg. `Flag(...).Enum("debug", "info", "warning")`. + +- *2014-06-27* -- Stable v1.1.0 release. + - Bug fixes. + - Always return an error (rather than panicing) when misconfigured. + - `OpenFile(flag, perm)` value type added, for finer control over opening files. + - Significantly improved usage formatting. + +- *2014-06-19* -- Stable v1.0.0 release. + - Support [cumulative positional](#consuming-all-remaining-arguments) arguments. + - Return error rather than panic when there are fatal errors not caught by + the type system. eg. when a default value is invalid. + - Use gokpg.in. + +- *2014-06-10* -- Place-holder streamlining. + - Renamed `MetaVar` to `PlaceHolder`. + - Removed `MetaVarFromDefault`. Kingpin now uses [heuristics](#place-holders-in-help) + to determine what to display. + +## Examples + +### Simple Example + +Kingpin can be used for simple flag+arg applications like so: + +``` +$ ping --help +usage: ping [] [] + +Flags: + --debug Enable debug mode. + --help Show help. + -t, --timeout=5s Timeout waiting for ping. + +Args: + IP address to ping. + [] Number of packets to send +$ ping 1.2.3.4 5 +Would ping: 1.2.3.4 with timeout 5s and count 0 +``` + +From the following source: + +```go +package main + +import ( + "fmt" + + "gopkg.in/alecthomas/kingpin.v2" +) + +var ( + debug = kingpin.Flag("debug", "Enable debug mode.").Bool() + timeout = kingpin.Flag("timeout", "Timeout waiting for ping.").Default("5s").OverrideDefaultFromEnvar("PING_TIMEOUT").Short('t').Duration() + ip = kingpin.Arg("ip", "IP address to ping.").Required().IP() + count = kingpin.Arg("count", "Number of packets to send").Int() +) + +func main() { + kingpin.Version("0.0.1") + kingpin.Parse() + fmt.Printf("Would ping: %s with timeout %s and count %d\n", *ip, *timeout, *count) +} +``` + +### Complex Example + +Kingpin can also produce complex command-line applications with global flags, +subcommands, and per-subcommand flags, like this: + +``` +$ chat --help +usage: chat [] [] [ ...] + +A command-line chat application. + +Flags: + --help Show help. + --debug Enable debug mode. + --server=127.0.0.1 Server address. + +Commands: + help [] + Show help for a command. + + register + Register a new user. + + post [] [] + Post a message to a channel. + +$ chat help post +usage: chat [] post [] [] + +Post a message to a channel. + +Flags: + --image=IMAGE Image to post. + +Args: + Channel to post to. + [] Text to post. + +$ chat post --image=~/Downloads/owls.jpg pics +... +``` + +From this code: + +```go +package main + +import ( + "os" + "strings" + "gopkg.in/alecthomas/kingpin.v2" +) + +var ( + app = kingpin.New("chat", "A command-line chat application.") + debug = app.Flag("debug", "Enable debug mode.").Bool() + serverIP = app.Flag("server", "Server address.").Default("127.0.0.1").IP() + + register = app.Command("register", "Register a new user.") + registerNick = register.Arg("nick", "Nickname for user.").Required().String() + registerName = register.Arg("name", "Name of user.").Required().String() + + post = app.Command("post", "Post a message to a channel.") + postImage = post.Flag("image", "Image to post.").File() + postChannel = post.Arg("channel", "Channel to post to.").Required().String() + postText = post.Arg("text", "Text to post.").Strings() +) + +func main() { + switch kingpin.MustParse(app.Parse(os.Args[1:])) { + // Register user + case register.FullCommand(): + println(*registerNick) + + // Post message + case post.FullCommand(): + if *postImage != nil { + } + text := strings.Join(*postText, " ") + println("Post:", text) + } +} +``` + +## Reference Documentation + +### Displaying errors and usage information + +Kingpin exports a set of functions to provide consistent errors and usage +information to the user. + +Error messages look something like this: + + : error: + +The functions on `Application` are: + +Function | Purpose +---------|-------------- +`Errorf(format, args)` | Display a printf formatted error to the user. +`Fatalf(format, args)` | As with Errorf, but also call the termination handler. +`FatalUsage(format, args)` | As with Fatalf, but also print contextual usage information. +`FatalUsageContext(context, format, args)` | As with Fatalf, but also print contextual usage information from a `ParseContext`. +`FatalIfError(err, format, args)` | Conditionally print an error prefixed with format+args, then call the termination handler + +There are equivalent global functions in the kingpin namespace for the default +`kingpin.CommandLine` instance. + +### Sub-commands + +Kingpin supports nested sub-commands, with separate flag and positional +arguments per sub-command. Note that positional arguments may only occur after +sub-commands. + +For example: + +```go +var ( + deleteCommand = kingpin.Command("delete", "Delete an object.") + deleteUserCommand = deleteCommand.Command("user", "Delete a user.") + deleteUserUIDFlag = deleteUserCommand.Flag("uid", "Delete user by UID rather than username.") + deleteUserUsername = deleteUserCommand.Arg("username", "Username to delete.") + deletePostCommand = deleteCommand.Command("post", "Delete a post.") +) + +func main() { + switch kingpin.Parse() { + case "delete user": + case "delete post": + } +} +``` + +### Custom Parsers + +Kingpin supports both flag and positional argument parsers for converting to +Go types. For example, some included parsers are `Int()`, `Float()`, +`Duration()` and `ExistingFile()` (see [parsers.go](./parsers.go) for a complete list of included parsers). + +Parsers conform to Go's [`flag.Value`](http://godoc.org/flag#Value) +interface, so any existing implementations will work. + +For example, a parser for accumulating HTTP header values might look like this: + +```go +type HTTPHeaderValue http.Header + +func (h *HTTPHeaderValue) Set(value string) error { + parts := strings.SplitN(value, ":", 2) + if len(parts) != 2 { + return fmt.Errorf("expected HEADER:VALUE got '%s'", value) + } + (*http.Header)(h).Add(parts[0], parts[1]) + return nil +} + +func (h *HTTPHeaderValue) String() string { + return "" +} +``` + +As a convenience, I would recommend something like this: + +```go +func HTTPHeader(s Settings) (target *http.Header) { + target = &http.Header{} + s.SetValue((*HTTPHeaderValue)(target)) + return +} +``` + +You would use it like so: + +```go +headers = HTTPHeader(kingpin.Flag("header", "Add a HTTP header to the request.").Short('H')) +``` + +### Repeatable flags + +Depending on the `Value` they hold, some flags may be repeated. The +`IsCumulative() bool` function on `Value` tells if it's safe to call `Set()` +multiple times or if an error should be raised if several values are passed. + +The built-in `Value`s returning slices and maps, as well as `Counter` are +examples of `Value`s that make a flag repeatable. + +### Boolean values + +Boolean values are uniquely managed by Kingpin. Each boolean flag will have a negative complement: +`--` and `--no-`. + +### Default Values + +The default value is the zero value for a type. This can be overridden with +the `Default(value...)` function on flags and arguments. This function accepts +one or several strings, which are parsed by the value itself, so they *must* +be compliant with the format expected. + +### Place-holders in Help + +The place-holder value for a flag is the value used in the help to describe +the value of a non-boolean flag. + +The value provided to PlaceHolder() is used if provided, then the value +provided by Default() if provided, then finally the capitalised flag name is +used. + +Here are some examples of flags with various permutations: + + --name=NAME // Flag(...).String() + --name="Harry" // Flag(...).Default("Harry").String() + --name=FULL-NAME // flag(...).PlaceHolder("FULL-NAME").Default("Harry").String() + +### Consuming all remaining arguments + +A common command-line idiom is to use all remaining arguments for some +purpose. eg. The following command accepts an arbitrary number of +IP addresses as positional arguments: + + ./cmd ping 10.1.1.1 192.168.1.1 + +Such arguments are similar to [repeatable flags](#repeatable-flags), but for +arguments. Therefore they use the same `IsCumulative() bool` function on the +underlying `Value`, so the built-in `Value`s for which the `Set()` function +can be called several times will consume multiple arguments. + +To implement the above example with a custom `Value`, we might do something +like this: + +```go +type ipList []net.IP + +func (i *ipList) Set(value string) error { + if ip := net.ParseIP(value); ip == nil { + return fmt.Errorf("'%s' is not an IP address", value) + } else { + *i = append(*i, ip) + return nil + } +} + +func (i *ipList) String() string { + return "" +} + +func (i *ipList) IsCumulative() bool { + return true +} + +func IPList(s Settings) (target *[]net.IP) { + target = new([]net.IP) + s.SetValue((*ipList)(target)) + return +} +``` + +And use it like so: + +```go +ips := IPList(kingpin.Arg("ips", "IP addresses to ping.")) +``` + +### Bash/ZSH Shell Completion + +By default, all flags and commands/subcommands generate completions +internally. + +Out of the box, CLI tools using kingpin should be able to take advantage +of completion hinting for flags and commands. By specifying +`--completion-bash` as the first argument, your CLI tool will show +possible subcommands. By ending your argv with `--`, hints for flags +will be shown. + +To allow your end users to take advantage you must package a +`/etc/bash_completion.d` script with your distribution (or the equivalent +for your target platform/shell). An alternative is to instruct your end +user to source a script from their `bash_profile` (or equivalent). + +Fortunately Kingpin makes it easy to generate or source a script for use +with end users shells. `./yourtool --completion-script-bash` and +`./yourtool --completion-script-zsh` will generate these scripts for you. + +**Installation by Package** + +For the best user experience, you should bundle your pre-created +completion script with your CLI tool and install it inside +`/etc/bash_completion.d` (or equivalent). A good suggestion is to add +this as an automated step to your build pipeline, in the implementation +is improved for bug fixed. + +**Installation by `bash_profile`** + +Alternatively, instruct your users to add an additional statement to +their `bash_profile` (or equivalent): + +``` +eval "$(your-cli-tool --completion-script-bash)" +``` + +Or for ZSH + +``` +eval "$(your-cli-tool --completion-script-zsh)" +``` + +#### Additional API +To provide more flexibility, a completion option API has been +exposed for flags to allow user defined completion options, to extend +completions further than just EnumVar/Enum. + + +**Provide Static Options** + +When using an `Enum` or `EnumVar`, users are limited to only the options +given. Maybe we wish to hint possible options to the user, but also +allow them to provide their own custom option. `HintOptions` gives +this functionality to flags. + +``` +app := kingpin.New("completion", "My application with bash completion.") +app.Flag("port", "Provide a port to connect to"). + Required(). + HintOptions("80", "443", "8080"). + IntVar(&c.port) +``` + +**Provide Dynamic Options** +Consider the case that you needed to read a local database or a file to +provide suggestions. You can dynamically generate the options + +``` +func listHosts() []string { + // Provide a dynamic list of hosts from a hosts file or otherwise + // for bash completion. In this example we simply return static slice. + + // You could use this functionality to reach into a hosts file to provide + // completion for a list of known hosts. + return []string{"sshhost.example", "webhost.example", "ftphost.example"} +} + +app := kingpin.New("completion", "My application with bash completion.") +app.Flag("flag-1", "").HintAction(listHosts).String() +``` + +**EnumVar/Enum** +When using `Enum` or `EnumVar`, any provided options will be automatically +used for bash autocompletion. However, if you wish to provide a subset or +different options, you can use `HintOptions` or `HintAction` which will override +the default completion options for `Enum`/`EnumVar`. + + +**Examples** +You can see an in depth example of the completion API within +`examples/completion/main.go` + + +### Supporting -h for help + +`kingpin.CommandLine.HelpFlag.Short('h')` + +### Custom help + +Kingpin v2 supports templatised help using the text/template library (actually, [a fork](https://github.com/alecthomas/template)). + +You can specify the template to use with the [Application.UsageTemplate()](http://godoc.org/gopkg.in/alecthomas/kingpin.v2#Application.UsageTemplate) function. + +There are four included templates: `kingpin.DefaultUsageTemplate` is the default, +`kingpin.CompactUsageTemplate` provides a more compact representation for more complex command-line structures, +`kingpin.SeparateOptionalFlagsUsageTemplate` looks like the default template, but splits required +and optional command flags into separate lists, and `kingpin.ManPageTemplate` is used to generate man pages. + +See the above templates for examples of usage, and the the function [UsageForContextWithTemplate()](https://github.com/alecthomas/kingpin/blob/master/usage.go#L198) method for details on the context. + +#### Default help template + +``` +$ go run ./examples/curl/curl.go --help +usage: curl [] [ ...] + +An example implementation of curl. + +Flags: + --help Show help. + -t, --timeout=5s Set connection timeout. + -H, --headers=HEADER=VALUE + Add HTTP headers to the request. + +Commands: + help [...] + Show help. + + get url + Retrieve a URL. + + get file + Retrieve a file. + + post [] + POST a resource. +``` + +#### Compact help template + +``` +$ go run ./examples/curl/curl.go --help +usage: curl [] [ ...] + +An example implementation of curl. + +Flags: + --help Show help. + -t, --timeout=5s Set connection timeout. + -H, --headers=HEADER=VALUE + Add HTTP headers to the request. + +Commands: + help [...] + get [] + url + file + post [] +``` diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/chat1/main.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/chat1/main.go new file mode 100644 index 0000000..2a233fc --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/chat1/main.go @@ -0,0 +1,20 @@ +package main + +import ( + "fmt" + + "gopkg.in/alecthomas/kingpin.v2" +) + +var ( + debug = kingpin.Flag("debug", "Enable debug mode.").Bool() + timeout = kingpin.Flag("timeout", "Timeout waiting for ping.").Default("5s").OverrideDefaultFromEnvar("PING_TIMEOUT").Short('t').Duration() + ip = kingpin.Arg("ip", "IP address to ping.").Required().IP() + count = kingpin.Arg("count", "Number of packets to send").Int() +) + +func main() { + kingpin.Version("0.0.1") + kingpin.Parse() + fmt.Printf("Would ping: %s with timeout %s and count %d", *ip, *timeout, *count) +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/chat2/main.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/chat2/main.go new file mode 100644 index 0000000..83891a7 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/chat2/main.go @@ -0,0 +1,38 @@ +package main + +import ( + "os" + "strings" + + "gopkg.in/alecthomas/kingpin.v2" +) + +var ( + app = kingpin.New("chat", "A command-line chat application.") + debug = app.Flag("debug", "Enable debug mode.").Bool() + serverIP = app.Flag("server", "Server address.").Default("127.0.0.1").IP() + + register = app.Command("register", "Register a new user.") + registerNick = register.Arg("nick", "Nickname for user.").Required().String() + registerName = register.Arg("name", "Name of user.").Required().String() + + post = app.Command("post", "Post a message to a channel.") + postImage = post.Flag("image", "Image to post.").File() + postChannel = post.Arg("channel", "Channel to post to.").Required().String() + postText = post.Arg("text", "Text to post.").Strings() +) + +func main() { + switch kingpin.MustParse(app.Parse(os.Args[1:])) { + // Register user + case register.FullCommand(): + println(*registerNick) + + // Post message + case post.FullCommand(): + if *postImage != nil { + } + text := strings.Join(*postText, " ") + println("Post:", text) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/completion/main.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/completion/main.go new file mode 100644 index 0000000..fe17b52 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/completion/main.go @@ -0,0 +1,96 @@ +package main + +import ( + "fmt" + "os" + + "github.com/alecthomas/kingpin" +) + +func listHosts() []string { + // Provide a dynamic list of hosts from a hosts file or otherwise + // for bash completion. In this example we simply return static slice. + + // You could use this functionality to reach into a hosts file to provide + // completion for a list of known hosts. + return []string{"sshhost.example", "webhost.example", "ftphost.example"} +} + +type NetcatCommand struct { + hostName string + port int + format string +} + +func (n *NetcatCommand) run(c *kingpin.ParseContext) error { + fmt.Printf("Would have run netcat to hostname %v, port %d, and output format %v\n", n.hostName, n.port, n.format) + return nil +} + +func configureNetcatCommand(app *kingpin.Application) { + c := &NetcatCommand{} + nc := app.Command("nc", "Connect to a Host").Action(c.run) + nc.Flag("nop-flag", "Example of a flag with no options").Bool() + + // You can provide hint options using a function to generate them + nc.Flag("host", "Provide a hostname to nc"). + Required(). + HintAction(listHosts). + StringVar(&c.hostName) + + // You can provide hint options statically + nc.Flag("port", "Provide a port to connect to"). + Required(). + HintOptions("80", "443", "8080"). + IntVar(&c.port) + + // Enum/EnumVar options will be turned into completion options automatically + nc.Flag("format", "Define the output format"). + Default("raw"). + EnumVar(&c.format, "raw", "json") + + // You can combine HintOptions with HintAction too + nc.Flag("host-with-multi", "Define a hostname"). + HintAction(listHosts). + HintOptions("myhost.com"). + String() + + // And combine with themselves + nc.Flag("host-with-multi-options", "Define a hostname"). + HintOptions("myhost.com"). + HintOptions("myhost2.com"). + String() + + // If you specify HintOptions/HintActions for Enum/EnumVar, the options + // provided for Enum/EnumVar will be overridden. + nc.Flag("format-with-override-1", "Define a format"). + HintAction(listHosts). + Enum("option1", "option2") + + nc.Flag("format-with-override-2", "Define a format"). + HintOptions("myhost.com", "myhost2.com"). + Enum("option1", "option2") +} + +func addSubCommand(app *kingpin.Application, name string, description string) { + c := app.Command(name, description).Action(func(c *kingpin.ParseContext) error { + fmt.Printf("Would have run command %s.\n", name) + return nil + }) + c.Flag("nop-flag", "Example of a flag with no options").Bool() +} + +func main() { + app := kingpin.New("completion", "My application with bash completion.") + app.Flag("flag-1", "").String() + app.Flag("flag-2", "").HintOptions("opt1", "opt2").String() + + configureNetcatCommand(app) + + // Add some additional top level commands + addSubCommand(app, "ls", "Additional top level command to show command completion") + addSubCommand(app, "ping", "Additional top level command to show command completion") + addSubCommand(app, "nmap", "Additional top level command to show command completion") + + kingpin.MustParse(app.Parse(os.Args[1:])) +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/curl/main.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/curl/main.go new file mode 100644 index 0000000..a877e7b --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/curl/main.go @@ -0,0 +1,105 @@ +// A curl-like HTTP command-line client. +package main + +import ( + "errors" + "fmt" + "io" + "net/http" + "os" + "strings" + + "gopkg.in/alecthomas/kingpin.v2" +) + +var ( + timeout = kingpin.Flag("timeout", "Set connection timeout.").Short('t').Default("5s").Duration() + headers = HTTPHeader(kingpin.Flag("headers", "Add HTTP headers to the request.").Short('H').PlaceHolder("HEADER=VALUE")) + + get = kingpin.Command("get", "GET a resource.").Default() + getFlag = get.Flag("test", "Test flag").Bool() + getURL = get.Command("url", "Retrieve a URL.").Default() + getURLURL = getURL.Arg("url", "URL to GET.").Required().URL() + getFile = get.Command("file", "Retrieve a file.") + getFileFile = getFile.Arg("file", "File to retrieve.").Required().ExistingFile() + + post = kingpin.Command("post", "POST a resource.") + postData = post.Flag("data", "Key-value data to POST").Short('d').PlaceHolder("KEY:VALUE").StringMap() + postBinaryFile = post.Flag("data-binary", "File with binary data to POST.").File() + postURL = post.Arg("url", "URL to POST to.").Required().URL() +) + +type HTTPHeaderValue http.Header + +func (h HTTPHeaderValue) Set(value string) error { + parts := strings.SplitN(value, "=", 2) + if len(parts) != 2 { + return fmt.Errorf("expected HEADER=VALUE got '%s'", value) + } + (http.Header)(h).Add(parts[0], parts[1]) + return nil +} + +func (h HTTPHeaderValue) String() string { + return "" +} + +func HTTPHeader(s kingpin.Settings) (target *http.Header) { + target = &http.Header{} + s.SetValue((*HTTPHeaderValue)(target)) + return +} + +func applyRequest(req *http.Request) error { + req.Header = *headers + resp, err := http.DefaultClient.Do(req) + if err != nil { + return err + } + defer resp.Body.Close() + if resp.StatusCode < 200 || resp.StatusCode > 299 { + return fmt.Errorf("HTTP request failed: %s", resp.Status) + } + _, err = io.Copy(os.Stdout, resp.Body) + return err +} + +func apply(method string, url string) error { + req, err := http.NewRequest(method, url, nil) + if err != nil { + return err + } + return applyRequest(req) +} + +func applyPOST() error { + req, err := http.NewRequest("POST", (*postURL).String(), nil) + if err != nil { + return err + } + if len(*postData) > 0 { + for key, value := range *postData { + req.Form.Set(key, value) + } + } else if postBinaryFile != nil { + if headers.Get("Content-Type") != "" { + headers.Set("Content-Type", "application/octet-stream") + } + req.Body = *postBinaryFile + } else { + return errors.New("--data or --data-binary must be provided to POST") + } + return applyRequest(req) +} + +func main() { + kingpin.UsageTemplate(kingpin.CompactUsageTemplate).Version("1.0").Author("Alec Thomas") + kingpin.CommandLine.Help = "An example implementation of curl." + switch kingpin.Parse() { + case "get url": + kingpin.FatalIfError(apply("GET", (*getURLURL).String()), "GET failed") + + case "post": + kingpin.FatalIfError(applyPOST(), "POST failed") + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/modular/main.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/modular/main.go new file mode 100644 index 0000000..34cfa0b --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/modular/main.go @@ -0,0 +1,30 @@ +package main + +import ( + "fmt" + "os" + + "gopkg.in/alecthomas/kingpin.v2" +) + +// Context for "ls" command +type LsCommand struct { + All bool +} + +func (l *LsCommand) run(c *kingpin.ParseContext) error { + fmt.Printf("all=%v\n", l.All) + return nil +} + +func configureLsCommand(app *kingpin.Application) { + c := &LsCommand{} + ls := app.Command("ls", "List files.").Action(c.run) + ls.Flag("all", "List all files.").Short('a').BoolVar(&c.All) +} + +func main() { + app := kingpin.New("modular", "My modular application.") + configureLsCommand(app) + kingpin.MustParse(app.Parse(os.Args[1:])) +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/ping/main.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/ping/main.go new file mode 100644 index 0000000..41ea263 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/ping/main.go @@ -0,0 +1,20 @@ +package main + +import ( + "fmt" + + "gopkg.in/alecthomas/kingpin.v2" +) + +var ( + debug = kingpin.Flag("debug", "Enable debug mode.").Bool() + timeout = kingpin.Flag("timeout", "Timeout waiting for ping.").OverrideDefaultFromEnvar("PING_TIMEOUT").Required().Short('t').Duration() + ip = kingpin.Arg("ip", "IP address to ping.").Required().IP() + count = kingpin.Arg("count", "Number of packets to send").Int() +) + +func main() { + kingpin.Version("0.0.1") + kingpin.Parse() + fmt.Printf("Would ping: %s with timeout %s and count %d", *ip, *timeout, *count) +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/actions.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/actions.go new file mode 100644 index 0000000..72d6cbd --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/actions.go @@ -0,0 +1,42 @@ +package kingpin + +// Action callback executed at various stages after all values are populated. +// The application, commands, arguments and flags all have corresponding +// actions. +type Action func(*ParseContext) error + +type actionMixin struct { + actions []Action + preActions []Action +} + +type actionApplier interface { + applyActions(*ParseContext) error + applyPreActions(*ParseContext) error +} + +func (a *actionMixin) addAction(action Action) { + a.actions = append(a.actions, action) +} + +func (a *actionMixin) addPreAction(action Action) { + a.preActions = append(a.preActions, action) +} + +func (a *actionMixin) applyActions(context *ParseContext) error { + for _, action := range a.actions { + if err := action(context); err != nil { + return err + } + } + return nil +} + +func (a *actionMixin) applyPreActions(context *ParseContext) error { + for _, preAction := range a.preActions { + if err := preAction(context); err != nil { + return err + } + } + return nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/app.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/app.go new file mode 100644 index 0000000..a5e8b80 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/app.go @@ -0,0 +1,685 @@ +package kingpin + +import ( + "fmt" + "io" + "os" + "regexp" + "strings" +) + +var ( + ErrCommandNotSpecified = fmt.Errorf("command not specified") +) + +var ( + envarTransformRegexp = regexp.MustCompile(`[^a-zA-Z0-9_]+`) +) + +type ApplicationValidator func(*Application) error + +// An Application contains the definitions of flags, arguments and commands +// for an application. +type Application struct { + cmdMixin + initialized bool + + Name string + Help string + + author string + version string + errorWriter io.Writer // Destination for errors. + usageWriter io.Writer // Destination for usage + usageTemplate string + validator ApplicationValidator + terminate func(status int) // See Terminate() + noInterspersed bool // can flags be interspersed with args (or must they come first) + defaultEnvars bool + completion bool + + // Help flag. Exposed for user customisation. + HelpFlag *FlagClause + // Help command. Exposed for user customisation. May be nil. + HelpCommand *CmdClause + // Version flag. Exposed for user customisation. May be nil. + VersionFlag *FlagClause +} + +// New creates a new Kingpin application instance. +func New(name, help string) *Application { + a := &Application{ + Name: name, + Help: help, + errorWriter: os.Stderr, // Left for backwards compatibility purposes. + usageWriter: os.Stderr, + usageTemplate: DefaultUsageTemplate, + terminate: os.Exit, + } + a.flagGroup = newFlagGroup() + a.argGroup = newArgGroup() + a.cmdGroup = newCmdGroup(a) + a.HelpFlag = a.Flag("help", "Show context-sensitive help (also try --help-long and --help-man).") + a.HelpFlag.Bool() + a.Flag("help-long", "Generate long help.").Hidden().PreAction(a.generateLongHelp).Bool() + a.Flag("help-man", "Generate a man page.").Hidden().PreAction(a.generateManPage).Bool() + a.Flag("completion-bash", "Output possible completions for the given args.").Hidden().BoolVar(&a.completion) + a.Flag("completion-script-bash", "Generate completion script for bash.").Hidden().PreAction(a.generateBashCompletionScript).Bool() + a.Flag("completion-script-zsh", "Generate completion script for ZSH.").Hidden().PreAction(a.generateZSHCompletionScript).Bool() + + return a +} + +func (a *Application) generateLongHelp(c *ParseContext) error { + a.Writer(os.Stdout) + if err := a.UsageForContextWithTemplate(c, 2, LongHelpTemplate); err != nil { + return err + } + a.terminate(0) + return nil +} + +func (a *Application) generateManPage(c *ParseContext) error { + a.Writer(os.Stdout) + if err := a.UsageForContextWithTemplate(c, 2, ManPageTemplate); err != nil { + return err + } + a.terminate(0) + return nil +} + +func (a *Application) generateBashCompletionScript(c *ParseContext) error { + a.Writer(os.Stdout) + if err := a.UsageForContextWithTemplate(c, 2, BashCompletionTemplate); err != nil { + return err + } + a.terminate(0) + return nil +} + +func (a *Application) generateZSHCompletionScript(c *ParseContext) error { + a.Writer(os.Stdout) + if err := a.UsageForContextWithTemplate(c, 2, ZshCompletionTemplate); err != nil { + return err + } + a.terminate(0) + return nil +} + +// DefaultEnvars configures all flags (that do not already have an associated +// envar) to use a default environment variable in the form "_". +// +// For example, if the application is named "foo" and a flag is named "bar- +// waz" the environment variable: "FOO_BAR_WAZ". +func (a *Application) DefaultEnvars() *Application { + a.defaultEnvars = true + return a +} + +// Terminate specifies the termination handler. Defaults to os.Exit(status). +// If nil is passed, a no-op function will be used. +func (a *Application) Terminate(terminate func(int)) *Application { + if terminate == nil { + terminate = func(int) {} + } + a.terminate = terminate + return a +} + +// Writer specifies the writer to use for usage and errors. Defaults to os.Stderr. +// DEPRECATED: See ErrorWriter and UsageWriter. +func (a *Application) Writer(w io.Writer) *Application { + a.errorWriter = w + a.usageWriter = w + return a +} + +// ErrorWriter sets the io.Writer to use for errors. +func (a *Application) ErrorWriter(w io.Writer) *Application { + a.errorWriter = w + return a +} + +// UsageWriter sets the io.Writer to use for errors. +func (a *Application) UsageWriter(w io.Writer) *Application { + a.usageWriter = w + return a +} + +// UsageTemplate specifies the text template to use when displaying usage +// information. The default is UsageTemplate. +func (a *Application) UsageTemplate(template string) *Application { + a.usageTemplate = template + return a +} + +// Validate sets a validation function to run when parsing. +func (a *Application) Validate(validator ApplicationValidator) *Application { + a.validator = validator + return a +} + +// ParseContext parses the given command line and returns the fully populated +// ParseContext. +func (a *Application) ParseContext(args []string) (*ParseContext, error) { + return a.parseContext(false, args) +} + +func (a *Application) parseContext(ignoreDefault bool, args []string) (*ParseContext, error) { + if err := a.init(); err != nil { + return nil, err + } + context := tokenize(args, ignoreDefault) + err := parse(context, a) + return context, err +} + +// Parse parses command-line arguments. It returns the selected command and an +// error. The selected command will be a space separated subcommand, if +// subcommands have been configured. +// +// This will populate all flag and argument values, call all callbacks, and so +// on. +func (a *Application) Parse(args []string) (command string, err error) { + + context, parseErr := a.ParseContext(args) + selected := []string{} + var setValuesErr error + + if context == nil { + // Since we do not throw error immediately, there could be a case + // where a context returns nil. Protect against that. + return "", parseErr + } + + if err = a.setDefaults(context); err != nil { + return "", err + } + + selected, setValuesErr = a.setValues(context) + + if err = a.applyPreActions(context, !a.completion); err != nil { + return "", err + } + + if a.completion { + a.generateBashCompletion(context) + a.terminate(0) + } else { + if parseErr != nil { + return "", parseErr + } + + a.maybeHelp(context) + if !context.EOL() { + return "", fmt.Errorf("unexpected argument '%s'", context.Peek()) + } + + if setValuesErr != nil { + return "", setValuesErr + } + + command, err = a.execute(context, selected) + if err == ErrCommandNotSpecified { + a.writeUsage(context, nil) + } + } + return command, err +} + +func (a *Application) writeUsage(context *ParseContext, err error) { + if err != nil { + a.Errorf("%s", err) + } + if err := a.UsageForContext(context); err != nil { + panic(err) + } + if err != nil { + a.terminate(1) + } else { + a.terminate(0) + } +} + +func (a *Application) maybeHelp(context *ParseContext) { + for _, element := range context.Elements { + if flag, ok := element.Clause.(*FlagClause); ok && flag == a.HelpFlag { + // Re-parse the command-line ignoring defaults, so that help works correctly. + context, _ = a.parseContext(true, context.rawArgs) + a.writeUsage(context, nil) + } + } +} + +// Version adds a --version flag for displaying the application version. +func (a *Application) Version(version string) *Application { + a.version = version + a.VersionFlag = a.Flag("version", "Show application version.").PreAction(func(*ParseContext) error { + fmt.Fprintln(a.usageWriter, version) + a.terminate(0) + return nil + }) + a.VersionFlag.Bool() + return a +} + +// Author sets the author output by some help templates. +func (a *Application) Author(author string) *Application { + a.author = author + return a +} + +// Action callback to call when all values are populated and parsing is +// complete, but before any command, flag or argument actions. +// +// All Action() callbacks are called in the order they are encountered on the +// command line. +func (a *Application) Action(action Action) *Application { + a.addAction(action) + return a +} + +// Action called after parsing completes but before validation and execution. +func (a *Application) PreAction(action Action) *Application { + a.addPreAction(action) + return a +} + +// Command adds a new top-level command. +func (a *Application) Command(name, help string) *CmdClause { + return a.addCommand(name, help) +} + +// Interspersed control if flags can be interspersed with positional arguments +// +// true (the default) means that they can, false means that all the flags must appear before the first positional arguments. +func (a *Application) Interspersed(interspersed bool) *Application { + a.noInterspersed = !interspersed + return a +} + +func (a *Application) defaultEnvarPrefix() string { + if a.defaultEnvars { + return a.Name + } + return "" +} + +func (a *Application) init() error { + if a.initialized { + return nil + } + if a.cmdGroup.have() && a.argGroup.have() { + return fmt.Errorf("can't mix top-level Arg()s with Command()s") + } + + // If we have subcommands, add a help command at the top-level. + if a.cmdGroup.have() { + var command []string + a.HelpCommand = a.Command("help", "Show help.").PreAction(func(context *ParseContext) error { + a.Usage(command) + a.terminate(0) + return nil + }) + a.HelpCommand.Arg("command", "Show help on command.").StringsVar(&command) + // Make help first command. + l := len(a.commandOrder) + a.commandOrder = append(a.commandOrder[l-1:l], a.commandOrder[:l-1]...) + } + + if err := a.flagGroup.init(a.defaultEnvarPrefix()); err != nil { + return err + } + if err := a.cmdGroup.init(); err != nil { + return err + } + if err := a.argGroup.init(); err != nil { + return err + } + for _, cmd := range a.commands { + if err := cmd.init(); err != nil { + return err + } + } + flagGroups := []*flagGroup{a.flagGroup} + for _, cmd := range a.commandOrder { + if err := checkDuplicateFlags(cmd, flagGroups); err != nil { + return err + } + } + a.initialized = true + return nil +} + +// Recursively check commands for duplicate flags. +func checkDuplicateFlags(current *CmdClause, flagGroups []*flagGroup) error { + // Check for duplicates. + for _, flags := range flagGroups { + for _, flag := range current.flagOrder { + if flag.shorthand != 0 { + if _, ok := flags.short[string(flag.shorthand)]; ok { + return fmt.Errorf("duplicate short flag -%c", flag.shorthand) + } + } + if _, ok := flags.long[flag.name]; ok { + return fmt.Errorf("duplicate long flag --%s", flag.name) + } + } + } + flagGroups = append(flagGroups, current.flagGroup) + // Check subcommands. + for _, subcmd := range current.commandOrder { + if err := checkDuplicateFlags(subcmd, flagGroups); err != nil { + return err + } + } + return nil +} + +func (a *Application) execute(context *ParseContext, selected []string) (string, error) { + var err error + + if err = a.validateRequired(context); err != nil { + return "", err + } + + if err = a.applyValidators(context); err != nil { + return "", err + } + + if err = a.applyActions(context); err != nil { + return "", err + } + + command := strings.Join(selected, " ") + if command == "" && a.cmdGroup.have() { + return "", ErrCommandNotSpecified + } + return command, err +} + +func (a *Application) setDefaults(context *ParseContext) error { + flagElements := map[string]*ParseElement{} + for _, element := range context.Elements { + if flag, ok := element.Clause.(*FlagClause); ok { + flagElements[flag.name] = element + } + } + + argElements := map[string]*ParseElement{} + for _, element := range context.Elements { + if arg, ok := element.Clause.(*ArgClause); ok { + argElements[arg.name] = element + } + } + + // Check required flags and set defaults. + for _, flag := range context.flags.long { + if flagElements[flag.name] == nil { + if err := flag.setDefault(); err != nil { + return err + } + } + } + + for _, arg := range context.arguments.args { + if argElements[arg.name] == nil { + if err := arg.setDefault(); err != nil { + return err + } + } + } + + return nil +} + +func (a *Application) validateRequired(context *ParseContext) error { + flagElements := map[string]*ParseElement{} + for _, element := range context.Elements { + if flag, ok := element.Clause.(*FlagClause); ok { + flagElements[flag.name] = element + } + } + + argElements := map[string]*ParseElement{} + for _, element := range context.Elements { + if arg, ok := element.Clause.(*ArgClause); ok { + argElements[arg.name] = element + } + } + + // Check required flags and set defaults. + for _, flag := range context.flags.long { + if flagElements[flag.name] == nil { + // Check required flags were provided. + if flag.needsValue() { + return fmt.Errorf("required flag --%s not provided", flag.name) + } + } + } + + for _, arg := range context.arguments.args { + if argElements[arg.name] == nil { + if arg.needsValue() { + return fmt.Errorf("required argument '%s' not provided", arg.name) + } + } + } + return nil +} + +func (a *Application) setValues(context *ParseContext) (selected []string, err error) { + // Set all arg and flag values. + var ( + lastCmd *CmdClause + flagSet = map[string]struct{}{} + ) + for _, element := range context.Elements { + switch clause := element.Clause.(type) { + case *FlagClause: + if _, ok := flagSet[clause.name]; ok { + if v, ok := clause.value.(repeatableFlag); !ok || !v.IsCumulative() { + return nil, fmt.Errorf("flag '%s' cannot be repeated", clause.name) + } + } + if err = clause.value.Set(*element.Value); err != nil { + return + } + flagSet[clause.name] = struct{}{} + + case *ArgClause: + if err = clause.value.Set(*element.Value); err != nil { + return + } + + case *CmdClause: + if clause.validator != nil { + if err = clause.validator(clause); err != nil { + return + } + } + selected = append(selected, clause.name) + lastCmd = clause + } + } + + if lastCmd != nil && len(lastCmd.commands) > 0 { + return nil, fmt.Errorf("must select a subcommand of '%s'", lastCmd.FullCommand()) + } + + return +} + +func (a *Application) applyValidators(context *ParseContext) (err error) { + // Call command validation functions. + for _, element := range context.Elements { + if cmd, ok := element.Clause.(*CmdClause); ok && cmd.validator != nil { + if err = cmd.validator(cmd); err != nil { + return err + } + } + } + + if a.validator != nil { + err = a.validator(a) + } + return err +} + +func (a *Application) applyPreActions(context *ParseContext, dispatch bool) error { + if err := a.actionMixin.applyPreActions(context); err != nil { + return err + } + // Dispatch to actions. + if dispatch { + for _, element := range context.Elements { + if applier, ok := element.Clause.(actionApplier); ok { + if err := applier.applyPreActions(context); err != nil { + return err + } + } + } + } + + return nil +} + +func (a *Application) applyActions(context *ParseContext) error { + if err := a.actionMixin.applyActions(context); err != nil { + return err + } + // Dispatch to actions. + for _, element := range context.Elements { + if applier, ok := element.Clause.(actionApplier); ok { + if err := applier.applyActions(context); err != nil { + return err + } + } + } + return nil +} + +// Errorf prints an error message to w in the format ": error: ". +func (a *Application) Errorf(format string, args ...interface{}) { + fmt.Fprintf(a.errorWriter, a.Name+": error: "+format+"\n", args...) +} + +// Fatalf writes a formatted error to w then terminates with exit status 1. +func (a *Application) Fatalf(format string, args ...interface{}) { + a.Errorf(format, args...) + a.terminate(1) +} + +// FatalUsage prints an error message followed by usage information, then +// exits with a non-zero status. +func (a *Application) FatalUsage(format string, args ...interface{}) { + a.Errorf(format, args...) + // Force usage to go to error output. + a.usageWriter = a.errorWriter + a.Usage([]string{}) + a.terminate(1) +} + +// FatalUsageContext writes a printf formatted error message to w, then usage +// information for the given ParseContext, before exiting. +func (a *Application) FatalUsageContext(context *ParseContext, format string, args ...interface{}) { + a.Errorf(format, args...) + if err := a.UsageForContext(context); err != nil { + panic(err) + } + a.terminate(1) +} + +// FatalIfError prints an error and exits if err is not nil. The error is printed +// with the given formatted string, if any. +func (a *Application) FatalIfError(err error, format string, args ...interface{}) { + if err != nil { + prefix := "" + if format != "" { + prefix = fmt.Sprintf(format, args...) + ": " + } + a.Errorf(prefix+"%s", err) + a.terminate(1) + } +} + +func (a *Application) completionOptions(context *ParseContext) []string { + args := context.rawArgs + + var ( + currArg string + prevArg string + target cmdMixin + ) + + numArgs := len(args) + if numArgs > 1 { + args = args[1:] + currArg = args[len(args)-1] + } + if numArgs > 2 { + prevArg = args[len(args)-2] + } + + target = a.cmdMixin + if context.SelectedCommand != nil { + // A subcommand was in use. We will use it as the target + target = context.SelectedCommand.cmdMixin + } + + if (currArg != "" && strings.HasPrefix(currArg, "--")) || strings.HasPrefix(prevArg, "--") { + // Perform completion for A flag. The last/current argument started with "-" + var ( + flagName string // The name of a flag if given (could be half complete) + flagValue string // The value assigned to a flag (if given) (could be half complete) + ) + + if strings.HasPrefix(prevArg, "--") && !strings.HasPrefix(currArg, "--") { + // Matches: ./myApp --flag value + // Wont Match: ./myApp --flag -- + flagName = prevArg[2:] // Strip the "--" + flagValue = currArg + } else if strings.HasPrefix(currArg, "--") { + // Matches: ./myApp --flag -- + // Matches: ./myApp --flag somevalue -- + // Matches: ./myApp -- + flagName = currArg[2:] // Strip the "--" + } + + options, flagMatched, valueMatched := target.FlagCompletion(flagName, flagValue) + if valueMatched { + // Value Matched. Show cmdCompletions + return target.CmdCompletion(context) + } + + // Add top level flags if we're not at the top level and no match was found. + if context.SelectedCommand != nil && !flagMatched { + topOptions, topFlagMatched, topValueMatched := a.FlagCompletion(flagName, flagValue) + if topValueMatched { + // Value Matched. Back to cmdCompletions + return target.CmdCompletion(context) + } + + if topFlagMatched { + // Top level had a flag which matched the input. Return it's options. + options = topOptions + } else { + // Add top level flags + options = append(options, topOptions...) + } + } + return options + } + + // Perform completion for sub commands and arguments. + return target.CmdCompletion(context) +} + +func (a *Application) generateBashCompletion(context *ParseContext) { + options := a.completionOptions(context) + fmt.Printf("%s", strings.Join(options, "\n")) +} + +func envarTransform(name string) string { + return strings.ToUpper(envarTransformRegexp.ReplaceAllString(name, "_")) +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/app_test.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/app_test.go new file mode 100644 index 0000000..993e25c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/app_test.go @@ -0,0 +1,404 @@ +package kingpin + +import ( + "io/ioutil" + + "github.com/alecthomas/assert" + + "sort" + "strings" + "testing" + "time" +) + +func newTestApp() *Application { + return New("test", "").Terminate(nil) +} + +func TestCommander(t *testing.T) { + c := newTestApp() + ping := c.Command("ping", "Ping an IP address.") + pingTTL := ping.Flag("ttl", "TTL for ICMP packets").Short('t').Default("5s").Duration() + + selected, err := c.Parse([]string{"ping"}) + assert.NoError(t, err) + assert.Equal(t, "ping", selected) + assert.Equal(t, 5*time.Second, *pingTTL) + + selected, err = c.Parse([]string{"ping", "--ttl=10s"}) + assert.NoError(t, err) + assert.Equal(t, "ping", selected) + assert.Equal(t, 10*time.Second, *pingTTL) +} + +func TestRequiredFlags(t *testing.T) { + c := newTestApp() + c.Flag("a", "a").String() + c.Flag("b", "b").Required().String() + + _, err := c.Parse([]string{"--a=foo"}) + assert.Error(t, err) + _, err = c.Parse([]string{"--b=foo"}) + assert.NoError(t, err) +} + +func TestRepeatableFlags(t *testing.T) { + c := newTestApp() + c.Flag("a", "a").String() + c.Flag("b", "b").Strings() + _, err := c.Parse([]string{"--a=foo", "--a=bar"}) + assert.Error(t, err) + _, err = c.Parse([]string{"--b=foo", "--b=bar"}) + assert.NoError(t, err) +} + +func TestInvalidDefaultFlagValueErrors(t *testing.T) { + c := newTestApp() + c.Flag("foo", "foo").Default("a").Int() + _, err := c.Parse([]string{}) + assert.Error(t, err) +} + +func TestInvalidDefaultArgValueErrors(t *testing.T) { + c := newTestApp() + cmd := c.Command("cmd", "cmd") + cmd.Arg("arg", "arg").Default("one").Int() + _, err := c.Parse([]string{"cmd"}) + assert.Error(t, err) +} + +func TestArgsRequiredAfterNonRequiredErrors(t *testing.T) { + c := newTestApp() + cmd := c.Command("cmd", "") + cmd.Arg("a", "a").String() + cmd.Arg("b", "b").Required().String() + _, err := c.Parse([]string{"cmd"}) + assert.Error(t, err) +} + +func TestArgsMultipleRequiredThenNonRequired(t *testing.T) { + c := newTestApp().Writer(ioutil.Discard) + cmd := c.Command("cmd", "") + cmd.Arg("a", "a").Required().String() + cmd.Arg("b", "b").Required().String() + cmd.Arg("c", "c").String() + cmd.Arg("d", "d").String() + _, err := c.Parse([]string{"cmd", "a", "b"}) + assert.NoError(t, err) + _, err = c.Parse([]string{}) + assert.Error(t, err) +} + +func TestDispatchCallbackIsCalled(t *testing.T) { + dispatched := false + c := newTestApp() + c.Command("cmd", "").Action(func(*ParseContext) error { + dispatched = true + return nil + }) + + _, err := c.Parse([]string{"cmd"}) + assert.NoError(t, err) + assert.True(t, dispatched) +} + +func TestTopLevelArgWorks(t *testing.T) { + c := newTestApp() + s := c.Arg("arg", "help").String() + _, err := c.Parse([]string{"foo"}) + assert.NoError(t, err) + assert.Equal(t, "foo", *s) +} + +func TestTopLevelArgCantBeUsedWithCommands(t *testing.T) { + c := newTestApp() + c.Arg("arg", "help").String() + c.Command("cmd", "help") + _, err := c.Parse([]string{}) + assert.Error(t, err) +} + +func TestTooManyArgs(t *testing.T) { + a := newTestApp() + a.Arg("a", "").String() + _, err := a.Parse([]string{"a", "b"}) + assert.Error(t, err) +} + +func TestTooManyArgsAfterCommand(t *testing.T) { + a := newTestApp() + a.Command("a", "") + assert.NoError(t, a.init()) + _, err := a.Parse([]string{"a", "b"}) + assert.Error(t, err) +} + +func TestArgsLooksLikeFlagsWithConsumeRemainder(t *testing.T) { + a := newTestApp() + a.Arg("opts", "").Required().Strings() + _, err := a.Parse([]string{"hello", "-world"}) + assert.Error(t, err) +} + +func TestCommandParseDoesNotResetFlagsToDefault(t *testing.T) { + app := newTestApp() + flag := app.Flag("flag", "").Default("default").String() + app.Command("cmd", "") + + _, err := app.Parse([]string{"--flag=123", "cmd"}) + assert.NoError(t, err) + assert.Equal(t, "123", *flag) +} + +func TestCommandParseDoesNotFailRequired(t *testing.T) { + app := newTestApp() + flag := app.Flag("flag", "").Required().String() + app.Command("cmd", "") + + _, err := app.Parse([]string{"cmd", "--flag=123"}) + assert.NoError(t, err) + assert.Equal(t, "123", *flag) +} + +func TestSelectedCommand(t *testing.T) { + app := newTestApp() + c0 := app.Command("c0", "") + c0.Command("c1", "") + s, err := app.Parse([]string{"c0", "c1"}) + assert.NoError(t, err) + assert.Equal(t, "c0 c1", s) +} + +func TestSubCommandRequired(t *testing.T) { + app := newTestApp() + c0 := app.Command("c0", "") + c0.Command("c1", "") + _, err := app.Parse([]string{"c0"}) + assert.Error(t, err) +} + +func TestInterspersedFalse(t *testing.T) { + app := newTestApp().Interspersed(false) + a1 := app.Arg("a1", "").String() + a2 := app.Arg("a2", "").String() + f1 := app.Flag("flag", "").String() + + _, err := app.Parse([]string{"a1", "--flag=flag"}) + assert.NoError(t, err) + assert.Equal(t, "a1", *a1) + assert.Equal(t, "--flag=flag", *a2) + assert.Equal(t, "", *f1) +} + +func TestInterspersedTrue(t *testing.T) { + // test once with the default value and once with explicit true + for i := 0; i < 2; i++ { + app := newTestApp() + if i != 0 { + t.Log("Setting explicit") + app.Interspersed(true) + } else { + t.Log("Using default") + } + a1 := app.Arg("a1", "").String() + a2 := app.Arg("a2", "").String() + f1 := app.Flag("flag", "").String() + + _, err := app.Parse([]string{"a1", "--flag=flag"}) + assert.NoError(t, err) + assert.Equal(t, "a1", *a1) + assert.Equal(t, "", *a2) + assert.Equal(t, "flag", *f1) + } +} + +func TestDefaultEnvars(t *testing.T) { + a := New("some-app", "").Terminate(nil).DefaultEnvars() + f0 := a.Flag("some-flag", "") + f0.Bool() + f1 := a.Flag("some-other-flag", "").NoEnvar() + f1.Bool() + f2 := a.Flag("a-1-flag", "") + f2.Bool() + _, err := a.Parse([]string{}) + assert.NoError(t, err) + assert.Equal(t, "SOME_APP_SOME_FLAG", f0.envar) + assert.Equal(t, "", f1.envar) + assert.Equal(t, "SOME_APP_A_1_FLAG", f2.envar) +} + +func TestBashCompletionOptionsWithEmptyApp(t *testing.T) { + a := newTestApp() + context, err := a.ParseContext([]string{"--completion-bash"}) + if err != nil { + t.Errorf("Unexpected error whilst parsing context: [%v]", err) + } + args := a.completionOptions(context) + assert.Equal(t, []string(nil), args) +} + +func TestBashCompletionOptions(t *testing.T) { + a := newTestApp() + a.Command("one", "") + a.Flag("flag-0", "").String() + a.Flag("flag-1", "").HintOptions("opt1", "opt2", "opt3").String() + + two := a.Command("two", "") + two.Flag("flag-2", "").String() + two.Flag("flag-3", "").HintOptions("opt4", "opt5", "opt6").String() + + three := a.Command("three", "") + three.Flag("flag-4", "").String() + three.Arg("arg-1", "").String() + three.Arg("arg-2", "").HintOptions("arg-2-opt-1", "arg-2-opt-2").String() + three.Arg("arg-3", "").String() + three.Arg("arg-4", "").HintAction(func() []string { + return []string{"arg-4-opt-1", "arg-4-opt-2"} + }).String() + + cases := []struct { + Args string + ExpectedOptions []string + }{ + { + Args: "--completion-bash", + ExpectedOptions: []string{"help", "one", "three", "two"}, + }, + { + Args: "--completion-bash --", + ExpectedOptions: []string{"--flag-0", "--flag-1", "--help"}, + }, + { + Args: "--completion-bash --fla", + ExpectedOptions: []string{"--flag-0", "--flag-1", "--help"}, + }, + { + // No options available for flag-0, return to cmd completion + Args: "--completion-bash --flag-0", + ExpectedOptions: []string{"help", "one", "three", "two"}, + }, + { + Args: "--completion-bash --flag-0 --", + ExpectedOptions: []string{"--flag-0", "--flag-1", "--help"}, + }, + { + Args: "--completion-bash --flag-1", + ExpectedOptions: []string{"opt1", "opt2", "opt3"}, + }, + { + Args: "--completion-bash --flag-1 opt", + ExpectedOptions: []string{"opt1", "opt2", "opt3"}, + }, + { + Args: "--completion-bash --flag-1 opt1", + ExpectedOptions: []string{"help", "one", "three", "two"}, + }, + { + Args: "--completion-bash --flag-1 opt1 --", + ExpectedOptions: []string{"--flag-0", "--flag-1", "--help"}, + }, + + // Try Subcommand + { + Args: "--completion-bash two", + ExpectedOptions: []string(nil), + }, + { + Args: "--completion-bash two --", + ExpectedOptions: []string{"--help", "--flag-2", "--flag-3", "--flag-0", "--flag-1"}, + }, + { + Args: "--completion-bash two --flag", + ExpectedOptions: []string{"--help", "--flag-2", "--flag-3", "--flag-0", "--flag-1"}, + }, + { + Args: "--completion-bash two --flag-2", + ExpectedOptions: []string(nil), + }, + { + // Top level flags carry downwards + Args: "--completion-bash two --flag-1", + ExpectedOptions: []string{"opt1", "opt2", "opt3"}, + }, + { + // Top level flags carry downwards + Args: "--completion-bash two --flag-1 opt", + ExpectedOptions: []string{"opt1", "opt2", "opt3"}, + }, + { + // Top level flags carry downwards + Args: "--completion-bash two --flag-1 opt1", + ExpectedOptions: []string(nil), + }, + { + Args: "--completion-bash two --flag-3", + ExpectedOptions: []string{"opt4", "opt5", "opt6"}, + }, + { + Args: "--completion-bash two --flag-3 opt", + ExpectedOptions: []string{"opt4", "opt5", "opt6"}, + }, + { + Args: "--completion-bash two --flag-3 opt4", + ExpectedOptions: []string(nil), + }, + { + Args: "--completion-bash two --flag-3 opt4 --", + ExpectedOptions: []string{"--help", "--flag-2", "--flag-3", "--flag-0", "--flag-1"}, + }, + + // Args complete + { + // After a command with an arg with no options, nothing should be + // shown + Args: "--completion-bash three ", + ExpectedOptions: []string(nil), + }, + { + // After a command with an arg, explicitly starting a flag should + // complete flags + Args: "--completion-bash three --", + ExpectedOptions: []string{"--flag-0", "--flag-1", "--flag-4", "--help"}, + }, + { + // After a command with an arg that does have completions, they + // should be shown + Args: "--completion-bash three arg1 ", + ExpectedOptions: []string{"arg-2-opt-1", "arg-2-opt-2"}, + }, + { + // After a command with an arg that does have completions, but a + // flag is started, flag options should be completed + Args: "--completion-bash three arg1 --", + ExpectedOptions: []string{"--flag-0", "--flag-1", "--flag-4", "--help"}, + }, + { + // After a command with an arg that has no completions, and isn't first, + // nothing should be shown + Args: "--completion-bash three arg1 arg2 ", + ExpectedOptions: []string(nil), + }, + { + // After a command with a different arg that also has completions, + // those different options should be shown + Args: "--completion-bash three arg1 arg2 arg3 ", + ExpectedOptions: []string{"arg-4-opt-1", "arg-4-opt-2"}, + }, + { + // After a command with all args listed, nothing should complete + Args: "--completion-bash three arg1 arg2 arg3 arg4", + ExpectedOptions: []string(nil), + }, + } + + for _, c := range cases { + context, _ := a.ParseContext(strings.Split(c.Args, " ")) + args := a.completionOptions(context) + + sort.Strings(args) + sort.Strings(c.ExpectedOptions) + + assert.Equal(t, c.ExpectedOptions, args, "Expected != Actual: [%v] != [%v]. \nInput was: [%v]", c.ExpectedOptions, args, c.Args) + } + +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/args.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/args.go new file mode 100644 index 0000000..3400694 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/args.go @@ -0,0 +1,184 @@ +package kingpin + +import ( + "fmt" +) + +type argGroup struct { + args []*ArgClause +} + +func newArgGroup() *argGroup { + return &argGroup{} +} + +func (a *argGroup) have() bool { + return len(a.args) > 0 +} + +// GetArg gets an argument definition. +// +// This allows existing arguments to be modified after definition but before parsing. Useful for +// modular applications. +func (a *argGroup) GetArg(name string) *ArgClause { + for _, arg := range a.args { + if arg.name == name { + return arg + } + } + return nil +} + +func (a *argGroup) Arg(name, help string) *ArgClause { + arg := newArg(name, help) + a.args = append(a.args, arg) + return arg +} + +func (a *argGroup) init() error { + required := 0 + seen := map[string]struct{}{} + previousArgMustBeLast := false + for i, arg := range a.args { + if previousArgMustBeLast { + return fmt.Errorf("Args() can't be followed by another argument '%s'", arg.name) + } + if arg.consumesRemainder() { + previousArgMustBeLast = true + } + if _, ok := seen[arg.name]; ok { + return fmt.Errorf("duplicate argument '%s'", arg.name) + } + seen[arg.name] = struct{}{} + if arg.required && required != i { + return fmt.Errorf("required arguments found after non-required") + } + if arg.required { + required++ + } + if err := arg.init(); err != nil { + return err + } + } + return nil +} + +type ArgClause struct { + actionMixin + parserMixin + completionsMixin + envarMixin + name string + help string + defaultValues []string + required bool +} + +func newArg(name, help string) *ArgClause { + a := &ArgClause{ + name: name, + help: help, + } + return a +} + +func (a *ArgClause) setDefault() error { + if a.HasEnvarValue() { + if v, ok := a.value.(remainderArg); !ok || !v.IsCumulative() { + // Use the value as-is + return a.value.Set(a.GetEnvarValue()) + } + for _, value := range a.GetSplitEnvarValue() { + if err := a.value.Set(value); err != nil { + return err + } + } + return nil + } + + if len(a.defaultValues) > 0 { + for _, defaultValue := range a.defaultValues { + if err := a.value.Set(defaultValue); err != nil { + return err + } + } + return nil + } + + return nil +} + +func (a *ArgClause) needsValue() bool { + haveDefault := len(a.defaultValues) > 0 + return a.required && !(haveDefault || a.HasEnvarValue()) +} + +func (a *ArgClause) consumesRemainder() bool { + if r, ok := a.value.(remainderArg); ok { + return r.IsCumulative() + } + return false +} + +// Required arguments must be input by the user. They can not have a Default() value provided. +func (a *ArgClause) Required() *ArgClause { + a.required = true + return a +} + +// Default values for this argument. They *must* be parseable by the value of the argument. +func (a *ArgClause) Default(values ...string) *ArgClause { + a.defaultValues = values + return a +} + +// Envar overrides the default value(s) for a flag from an environment variable, +// if it is set. Several default values can be provided by using new lines to +// separate them. +func (a *ArgClause) Envar(name string) *ArgClause { + a.envar = name + a.noEnvar = false + return a +} + +// NoEnvar forces environment variable defaults to be disabled for this flag. +// Most useful in conjunction with app.DefaultEnvars(). +func (a *ArgClause) NoEnvar() *ArgClause { + a.envar = "" + a.noEnvar = true + return a +} + +func (a *ArgClause) Action(action Action) *ArgClause { + a.addAction(action) + return a +} + +func (a *ArgClause) PreAction(action Action) *ArgClause { + a.addPreAction(action) + return a +} + +// HintAction registers a HintAction (function) for the arg to provide completions +func (a *ArgClause) HintAction(action HintAction) *ArgClause { + a.addHintAction(action) + return a +} + +// HintOptions registers any number of options for the flag to provide completions +func (a *ArgClause) HintOptions(options ...string) *ArgClause { + a.addHintAction(func() []string { + return options + }) + return a +} + +func (a *ArgClause) init() error { + if a.required && len(a.defaultValues) > 0 { + return fmt.Errorf("required argument '%s' with unusable default value", a.name) + } + if a.value == nil { + return fmt.Errorf("no parser defined for arg '%s'", a.name) + } + return nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/args_test.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/args_test.go new file mode 100644 index 0000000..f2837ec --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/args_test.go @@ -0,0 +1,84 @@ +package kingpin + +import ( + "io/ioutil" + "os" + "testing" + + "github.com/alecthomas/assert" +) + +func TestArgRemainder(t *testing.T) { + app := New("test", "") + v := app.Arg("test", "").Strings() + args := []string{"hello", "world"} + _, err := app.Parse(args) + assert.NoError(t, err) + assert.Equal(t, args, *v) +} + +func TestArgRemainderErrorsWhenNotLast(t *testing.T) { + a := newArgGroup() + a.Arg("test", "").Strings() + a.Arg("test2", "").String() + assert.Error(t, a.init()) +} + +func TestArgMultipleRequired(t *testing.T) { + terminated := false + app := New("test", "") + app.Version("0.0.0").Writer(ioutil.Discard) + app.Arg("a", "").Required().String() + app.Arg("b", "").Required().String() + app.Terminate(func(int) { terminated = true }) + + _, err := app.Parse([]string{}) + assert.Error(t, err) + _, err = app.Parse([]string{"A"}) + assert.Error(t, err) + _, err = app.Parse([]string{"A", "B"}) + assert.NoError(t, err) + _, err = app.Parse([]string{"--version"}) + assert.True(t, terminated) +} + +func TestInvalidArgsDefaultCanBeOverridden(t *testing.T) { + app := New("test", "") + app.Arg("a", "").Default("invalid").Bool() + _, err := app.Parse([]string{}) + assert.Error(t, err) +} + +func TestArgMultipleValuesDefault(t *testing.T) { + app := New("test", "") + a := app.Arg("a", "").Default("default1", "default2").Strings() + _, err := app.Parse([]string{}) + assert.NoError(t, err) + assert.Equal(t, []string{"default1", "default2"}, *a) +} + +func TestRequiredArgWithEnvarMissingErrors(t *testing.T) { + app := newTestApp() + app.Arg("t", "").Envar("TEST_ARG_ENVAR").Required().Int() + _, err := app.Parse([]string{}) + assert.Error(t, err) +} + +func TestArgRequiredWithEnvar(t *testing.T) { + os.Setenv("TEST_ARG_ENVAR", "123") + app := newTestApp() + flag := app.Arg("t", "").Envar("TEST_ARG_ENVAR").Required().Int() + _, err := app.Parse([]string{}) + assert.NoError(t, err) + assert.Equal(t, 123, *flag) +} + +func TestSubcommandArgRequiredWithEnvar(t *testing.T) { + os.Setenv("TEST_ARG_ENVAR", "123") + app := newTestApp() + cmd := app.Command("command", "") + flag := cmd.Arg("t", "").Envar("TEST_ARG_ENVAR").Required().Int() + _, err := app.Parse([]string{"command"}) + assert.NoError(t, err) + assert.Equal(t, 123, *flag) +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/cmd.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/cmd.go new file mode 100644 index 0000000..0473b87 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/cmd.go @@ -0,0 +1,274 @@ +package kingpin + +import ( + "fmt" + "strings" +) + +type cmdMixin struct { + *flagGroup + *argGroup + *cmdGroup + actionMixin +} + +// CmdCompletion returns completion options for arguments, if that's where +// parsing left off, or commands if there aren't any unsatisfied args. +func (c *cmdMixin) CmdCompletion(context *ParseContext) []string { + var options []string + + // Count args already satisfied - we won't complete those, and add any + // default commands' alternatives, since they weren't listed explicitly + // and the user may want to explicitly list something else. + argsSatisfied := 0 + for _, el := range context.Elements { + switch clause := el.Clause.(type) { + case *ArgClause: + if el.Value != nil && *el.Value != "" { + argsSatisfied++ + } + case *CmdClause: + options = append(options, clause.completionAlts...) + default: + } + } + + if argsSatisfied < len(c.argGroup.args) { + // Since not all args have been satisfied, show options for the current one + options = append(options, c.argGroup.args[argsSatisfied].resolveCompletions()...) + } else { + // If all args are satisfied, then go back to completing commands + for _, cmd := range c.cmdGroup.commandOrder { + if !cmd.hidden { + options = append(options, cmd.name) + } + } + } + + return options +} + +func (c *cmdMixin) FlagCompletion(flagName string, flagValue string) (choices []string, flagMatch bool, optionMatch bool) { + // Check if flagName matches a known flag. + // If it does, show the options for the flag + // Otherwise, show all flags + + options := []string{} + + for _, flag := range c.flagGroup.flagOrder { + // Loop through each flag and determine if a match exists + if flag.name == flagName { + // User typed entire flag. Need to look for flag options. + options = flag.resolveCompletions() + if len(options) == 0 { + // No Options to Choose From, Assume Match. + return options, true, true + } + + // Loop options to find if the user specified value matches + isPrefix := false + matched := false + + for _, opt := range options { + if flagValue == opt { + matched = true + } else if strings.HasPrefix(opt, flagValue) { + isPrefix = true + } + } + + // Matched Flag Directly + // Flag Value Not Prefixed, and Matched Directly + return options, true, !isPrefix && matched + } + + if !flag.hidden { + options = append(options, "--"+flag.name) + } + } + // No Flag directly matched. + return options, false, false + +} + +type cmdGroup struct { + app *Application + parent *CmdClause + commands map[string]*CmdClause + commandOrder []*CmdClause +} + +func (c *cmdGroup) defaultSubcommand() *CmdClause { + for _, cmd := range c.commandOrder { + if cmd.isDefault { + return cmd + } + } + return nil +} + +func (c *cmdGroup) cmdNames() []string { + names := make([]string, 0, len(c.commandOrder)) + for _, cmd := range c.commandOrder { + names = append(names, cmd.name) + } + return names +} + +// GetArg gets a command definition. +// +// This allows existing commands to be modified after definition but before parsing. Useful for +// modular applications. +func (c *cmdGroup) GetCommand(name string) *CmdClause { + return c.commands[name] +} + +func newCmdGroup(app *Application) *cmdGroup { + return &cmdGroup{ + app: app, + commands: make(map[string]*CmdClause), + } +} + +func (c *cmdGroup) flattenedCommands() (out []*CmdClause) { + for _, cmd := range c.commandOrder { + if len(cmd.commands) == 0 { + out = append(out, cmd) + } + out = append(out, cmd.flattenedCommands()...) + } + return +} + +func (c *cmdGroup) addCommand(name, help string) *CmdClause { + cmd := newCommand(c.app, name, help) + c.commands[name] = cmd + c.commandOrder = append(c.commandOrder, cmd) + return cmd +} + +func (c *cmdGroup) init() error { + seen := map[string]bool{} + if c.defaultSubcommand() != nil && !c.have() { + return fmt.Errorf("default subcommand %q provided but no subcommands defined", c.defaultSubcommand().name) + } + defaults := []string{} + for _, cmd := range c.commandOrder { + if cmd.isDefault { + defaults = append(defaults, cmd.name) + } + if seen[cmd.name] { + return fmt.Errorf("duplicate command %q", cmd.name) + } + seen[cmd.name] = true + for _, alias := range cmd.aliases { + if seen[alias] { + return fmt.Errorf("alias duplicates existing command %q", alias) + } + c.commands[alias] = cmd + } + if err := cmd.init(); err != nil { + return err + } + } + if len(defaults) > 1 { + return fmt.Errorf("more than one default subcommand exists: %s", strings.Join(defaults, ", ")) + } + return nil +} + +func (c *cmdGroup) have() bool { + return len(c.commands) > 0 +} + +type CmdClauseValidator func(*CmdClause) error + +// A CmdClause is a single top-level command. It encapsulates a set of flags +// and either subcommands or positional arguments. +type CmdClause struct { + cmdMixin + app *Application + name string + aliases []string + help string + isDefault bool + validator CmdClauseValidator + hidden bool + completionAlts []string +} + +func newCommand(app *Application, name, help string) *CmdClause { + c := &CmdClause{ + app: app, + name: name, + help: help, + } + c.flagGroup = newFlagGroup() + c.argGroup = newArgGroup() + c.cmdGroup = newCmdGroup(app) + return c +} + +// Add an Alias for this command. +func (c *CmdClause) Alias(name string) *CmdClause { + c.aliases = append(c.aliases, name) + return c +} + +// Validate sets a validation function to run when parsing. +func (c *CmdClause) Validate(validator CmdClauseValidator) *CmdClause { + c.validator = validator + return c +} + +func (c *CmdClause) FullCommand() string { + out := []string{c.name} + for p := c.parent; p != nil; p = p.parent { + out = append([]string{p.name}, out...) + } + return strings.Join(out, " ") +} + +// Command adds a new sub-command. +func (c *CmdClause) Command(name, help string) *CmdClause { + cmd := c.addCommand(name, help) + cmd.parent = c + return cmd +} + +// Default makes this command the default if commands don't match. +func (c *CmdClause) Default() *CmdClause { + c.isDefault = true + return c +} + +func (c *CmdClause) Action(action Action) *CmdClause { + c.addAction(action) + return c +} + +func (c *CmdClause) PreAction(action Action) *CmdClause { + c.addPreAction(action) + return c +} + +func (c *CmdClause) init() error { + if err := c.flagGroup.init(c.app.defaultEnvarPrefix()); err != nil { + return err + } + if c.argGroup.have() && c.cmdGroup.have() { + return fmt.Errorf("can't mix Arg()s with Command()s") + } + if err := c.argGroup.init(); err != nil { + return err + } + if err := c.cmdGroup.init(); err != nil { + return err + } + return nil +} + +func (c *CmdClause) Hidden() *CmdClause { + c.hidden = true + return c +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/cmd/genvalues/main.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/cmd/genvalues/main.go new file mode 100644 index 0000000..5d22ad0 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/cmd/genvalues/main.go @@ -0,0 +1,134 @@ +package main + +import ( + "encoding/json" + "os" + "os/exec" + "strings" + + "github.com/alecthomas/template" +) + +const ( + tmpl = `package kingpin + +// This file is autogenerated by "go generate .". Do not modify. + +{{range .}} +{{if not .NoValueParser}} +// -- {{.Type}} Value +type {{.|ValueName}} struct { v *{{.Type}} } + +func new{{.|Name}}Value(p *{{.Type}}) *{{.|ValueName}} { + return &{{.|ValueName}}{p} +} + +func (f *{{.|ValueName}}) Set(s string) error { + v, err := {{.Parser}} + if err == nil { + *f.v = ({{.Type}})(v) + } + return err +} + +func (f *{{.|ValueName}}) Get() interface{} { return ({{.Type}})(*f.v) } + +func (f *{{.|ValueName}}) String() string { return {{.|Format}} } + +{{if .Help}} +// {{.Help}} +{{else}}\ +// {{.|Name}} parses the next command-line value as {{.Type}}. +{{end}}\ +func (p *parserMixin) {{.|Name}}() (target *{{.Type}}) { + target = new({{.Type}}) + p.{{.|Name}}Var(target) + return +} + +func (p *parserMixin) {{.|Name}}Var(target *{{.Type}}) { + p.SetValue(new{{.|Name}}Value(target)) +} + +{{end}} +// {{.|Plural}} accumulates {{.Type}} values into a slice. +func (p *parserMixin) {{.|Plural}}() (target *[]{{.Type}}) { + target = new([]{{.Type}}) + p.{{.|Plural}}Var(target) + return +} + +func (p *parserMixin) {{.|Plural}}Var(target *[]{{.Type}}) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return new{{.|Name}}Value(v.(*{{.Type}})) + })) +} + +{{end}} +` +) + +type Value struct { + Name string `json:"name"` + NoValueParser bool `json:"no_value_parser"` + Type string `json:"type"` + Parser string `json:"parser"` + Format string `json:"format"` + Plural string `json:"plural"` + Help string `json:"help"` +} + +func fatalIfError(err error) { + if err != nil { + panic(err) + } +} + +func main() { + r, err := os.Open("values.json") + fatalIfError(err) + defer r.Close() + + v := []Value{} + err = json.NewDecoder(r).Decode(&v) + fatalIfError(err) + + valueName := func(v *Value) string { + if v.Name != "" { + return v.Name + } + return strings.Title(v.Type) + } + + t, err := template.New("genvalues").Funcs(template.FuncMap{ + "Lower": strings.ToLower, + "Format": func(v *Value) string { + if v.Format != "" { + return v.Format + } + return "fmt.Sprintf(\"%v\", *f.v)" + }, + "ValueName": func(v *Value) string { + name := valueName(v) + return strings.ToLower(name[0:1]) + name[1:] + "Value" + }, + "Name": valueName, + "Plural": func(v *Value) string { + if v.Plural != "" { + return v.Plural + } + return valueName(v) + "List" + }, + }).Parse(tmpl) + fatalIfError(err) + + w, err := os.Create("values_generated.go") + fatalIfError(err) + defer w.Close() + + err = t.Execute(w, v) + fatalIfError(err) + + err = exec.Command("goimports", "-w", "values_generated.go").Run() + fatalIfError(err) +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/cmd_test.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/cmd_test.go new file mode 100644 index 0000000..b1207be --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/cmd_test.go @@ -0,0 +1,374 @@ +package kingpin + +import ( + "sort" + "strings" + + "github.com/alecthomas/assert" + + "testing" +) + +func parseAndExecute(app *Application, context *ParseContext) (string, error) { + if err := parse(context, app); err != nil { + return "", err + } + + selected, err := app.setValues(context) + if err != nil { + return "", err + } + + return app.execute(context, selected) +} + +func complete(t *testing.T, app *Application, args ...string) []string { + context, err := app.ParseContext(args) + assert.NoError(t, err) + if err != nil { + return nil + } + + completions := app.completionOptions(context) + sort.Strings(completions) + + return completions +} + +func TestNestedCommands(t *testing.T) { + app := New("app", "") + sub1 := app.Command("sub1", "") + sub1.Flag("sub1", "") + subsub1 := sub1.Command("sub1sub1", "") + subsub1.Command("sub1sub1end", "") + + sub2 := app.Command("sub2", "") + sub2.Flag("sub2", "") + sub2.Command("sub2sub1", "") + + context := tokenize([]string{"sub1", "sub1sub1", "sub1sub1end"}, false) + selected, err := parseAndExecute(app, context) + assert.NoError(t, err) + assert.True(t, context.EOL()) + assert.Equal(t, "sub1 sub1sub1 sub1sub1end", selected) +} + +func TestNestedCommandsWithArgs(t *testing.T) { + app := New("app", "") + cmd := app.Command("a", "").Command("b", "") + a := cmd.Arg("a", "").String() + b := cmd.Arg("b", "").String() + context := tokenize([]string{"a", "b", "c", "d"}, false) + selected, err := parseAndExecute(app, context) + assert.NoError(t, err) + assert.True(t, context.EOL()) + assert.Equal(t, "a b", selected) + assert.Equal(t, "c", *a) + assert.Equal(t, "d", *b) +} + +func TestNestedCommandsWithFlags(t *testing.T) { + app := New("app", "") + cmd := app.Command("a", "").Command("b", "") + a := cmd.Flag("aaa", "").Short('a').String() + b := cmd.Flag("bbb", "").Short('b').String() + err := app.init() + assert.NoError(t, err) + context := tokenize(strings.Split("a b --aaa x -b x", " "), false) + selected, err := parseAndExecute(app, context) + assert.NoError(t, err) + assert.True(t, context.EOL()) + assert.Equal(t, "a b", selected) + assert.Equal(t, "x", *a) + assert.Equal(t, "x", *b) +} + +func TestNestedCommandWithMergedFlags(t *testing.T) { + app := New("app", "") + cmd0 := app.Command("a", "") + cmd0f0 := cmd0.Flag("aflag", "").Bool() + // cmd1 := app.Command("b", "") + // cmd1f0 := cmd0.Flag("bflag", "").Bool() + cmd00 := cmd0.Command("aa", "") + cmd00f0 := cmd00.Flag("aaflag", "").Bool() + err := app.init() + assert.NoError(t, err) + context := tokenize(strings.Split("a aa --aflag --aaflag", " "), false) + selected, err := parseAndExecute(app, context) + assert.NoError(t, err) + assert.True(t, *cmd0f0) + assert.True(t, *cmd00f0) + assert.Equal(t, "a aa", selected) +} + +func TestNestedCommandWithDuplicateFlagErrors(t *testing.T) { + app := New("app", "") + app.Flag("test", "").Bool() + app.Command("cmd0", "").Flag("test", "").Bool() + err := app.init() + assert.Error(t, err) +} + +func TestNestedCommandWithArgAndMergedFlags(t *testing.T) { + app := New("app", "") + cmd0 := app.Command("a", "") + cmd0f0 := cmd0.Flag("aflag", "").Bool() + // cmd1 := app.Command("b", "") + // cmd1f0 := cmd0.Flag("bflag", "").Bool() + cmd00 := cmd0.Command("aa", "") + cmd00a0 := cmd00.Arg("arg", "").String() + cmd00f0 := cmd00.Flag("aaflag", "").Bool() + err := app.init() + assert.NoError(t, err) + context := tokenize(strings.Split("a aa hello --aflag --aaflag", " "), false) + selected, err := parseAndExecute(app, context) + assert.NoError(t, err) + assert.True(t, *cmd0f0) + assert.True(t, *cmd00f0) + assert.Equal(t, "a aa", selected) + assert.Equal(t, "hello", *cmd00a0) +} + +func TestDefaultSubcommandEOL(t *testing.T) { + app := newTestApp() + c0 := app.Command("c0", "").Default() + c0.Command("c01", "").Default() + c0.Command("c02", "") + + cmd, err := app.Parse([]string{"c0"}) + assert.NoError(t, err) + assert.Equal(t, "c0 c01", cmd) +} + +func TestDefaultSubcommandWithArg(t *testing.T) { + app := newTestApp() + c0 := app.Command("c0", "").Default() + c01 := c0.Command("c01", "").Default() + c012 := c01.Command("c012", "").Default() + a0 := c012.Arg("a0", "").String() + c0.Command("c02", "") + + cmd, err := app.Parse([]string{"c0", "hello"}) + assert.NoError(t, err) + assert.Equal(t, "c0 c01 c012", cmd) + assert.Equal(t, "hello", *a0) +} + +func TestDefaultSubcommandWithFlags(t *testing.T) { + app := newTestApp() + c0 := app.Command("c0", "").Default() + _ = c0.Flag("f0", "").Int() + c0c1 := c0.Command("c1", "").Default() + c0c1f1 := c0c1.Flag("f1", "").Int() + selected, err := app.Parse([]string{"--f1=2"}) + assert.NoError(t, err) + assert.Equal(t, "c0 c1", selected) + assert.Equal(t, 2, *c0c1f1) + _, err = app.Parse([]string{"--f2"}) + assert.Error(t, err) +} + +func TestMultipleDefaultCommands(t *testing.T) { + app := newTestApp() + app.Command("c0", "").Default() + app.Command("c1", "").Default() + _, err := app.Parse([]string{}) + assert.Error(t, err) +} + +func TestAliasedCommand(t *testing.T) { + app := newTestApp() + app.Command("one", "").Alias("two") + selected, _ := app.Parse([]string{"one"}) + assert.Equal(t, "one", selected) + selected, _ = app.Parse([]string{"two"}) + assert.Equal(t, "one", selected) + // 2 due to "help" and "one" + assert.Equal(t, 2, len(app.Model().FlattenedCommands())) +} + +func TestDuplicateAlias(t *testing.T) { + app := newTestApp() + app.Command("one", "") + app.Command("two", "").Alias("one") + _, err := app.Parse([]string{"one"}) + assert.Error(t, err) +} + +func TestFlagCompletion(t *testing.T) { + app := newTestApp() + app.Command("one", "") + two := app.Command("two", "") + two.Flag("flag-1", "") + two.Flag("flag-2", "").HintOptions("opt1", "opt2", "opt3") + two.Flag("flag-3", "") + + cases := []struct { + target cmdMixin + flagName string + flagValue string + expectedFlagMatch bool + expectedOptionMatch bool + expectedFlags []string + }{ + { + // Test top level flags + target: app.cmdMixin, + flagName: "", + flagValue: "", + expectedFlagMatch: false, + expectedOptionMatch: false, + expectedFlags: []string{"--help"}, + }, + { + // Test no flag passed + target: two.cmdMixin, + flagName: "", + flagValue: "", + expectedFlagMatch: false, + expectedOptionMatch: false, + expectedFlags: []string{"--flag-1", "--flag-2", "--flag-3"}, + }, + { + // Test an incomplete flag. Should still give all options as if the flag wasn't given at all. + target: two.cmdMixin, + flagName: "flag-", + flagValue: "", + expectedFlagMatch: false, + expectedOptionMatch: false, + expectedFlags: []string{"--flag-1", "--flag-2", "--flag-3"}, + }, + { + // Test with a complete flag. Should show available choices for the flag + // This flag has no options. No options should be produced. + // Should also report an option was matched + target: two.cmdMixin, + flagName: "flag-1", + flagValue: "", + expectedFlagMatch: true, + expectedOptionMatch: true, + expectedFlags: []string(nil), + }, + { + // Test with a complete flag. Should show available choices for the flag + target: two.cmdMixin, + flagName: "flag-2", + flagValue: "", + expectedFlagMatch: true, + expectedOptionMatch: false, + expectedFlags: []string{"opt1", "opt2", "opt3"}, + }, + { + // Test with a complete flag and complete option for that flag. + target: two.cmdMixin, + flagName: "flag-2", + flagValue: "opt1", + expectedFlagMatch: true, + expectedOptionMatch: true, + expectedFlags: []string{"opt1", "opt2", "opt3"}, + }, + } + + for i, c := range cases { + choices, flagMatch, optionMatch := c.target.FlagCompletion(c.flagName, c.flagValue) + assert.Equal(t, c.expectedFlags, choices, "Test case %d: expectedFlags != actual flags", i+1) + assert.Equal(t, c.expectedFlagMatch, flagMatch, "Test case %d: expectedFlagMatch != flagMatch", i+1) + assert.Equal(t, c.expectedOptionMatch, optionMatch, "Test case %d: expectedOptionMatch != optionMatch", i+1) + } + +} + +func TestCmdCompletion(t *testing.T) { + app := newTestApp() + app.Command("one", "") + two := app.Command("two", "") + two.Command("sub1", "") + two.Command("sub2", "") + + assert.Equal(t, []string{"help", "one", "two"}, complete(t, app)) + assert.Equal(t, []string{"sub1", "sub2"}, complete(t, app, "two")) +} + +func TestHiddenCmdCompletion(t *testing.T) { + app := newTestApp() + + // top level visible & hidden cmds, with no sub-cmds + app.Command("visible1", "") + app.Command("hidden1", "").Hidden() + + // visible cmd with visible & hidden sub-cmds + visible2 := app.Command("visible2", "") + visible2.Command("visible2-visible", "") + visible2.Command("visible2-hidden", "").Hidden() + + // hidden cmd with visible & hidden sub-cmds + hidden2 := app.Command("hidden2", "").Hidden() + hidden2.Command("hidden2-visible", "") + hidden2.Command("hidden2-hidden", "").Hidden() + + // Only top level visible cmds should show + assert.Equal(t, []string{"help", "visible1", "visible2"}, complete(t, app)) + + // Only visible sub-cmds should show + assert.Equal(t, []string{"visible2-visible"}, complete(t, app, "visible2")) + + // Hidden commands should still complete visible sub-cmds + assert.Equal(t, []string{"hidden2-visible"}, complete(t, app, "hidden2")) +} + +func TestDefaultCmdCompletion(t *testing.T) { + app := newTestApp() + + cmd1 := app.Command("cmd1", "") + + cmd1Sub1 := cmd1.Command("cmd1-sub1", "") + cmd1Sub1.Arg("cmd1-sub1-arg1", "").HintOptions("cmd1-arg1").String() + + cmd2 := app.Command("cmd2", "").Default() + + cmd2.Command("cmd2-sub1", "") + + cmd2Sub2 := cmd2.Command("cmd2-sub2", "").Default() + + cmd2Sub2Sub1 := cmd2Sub2.Command("cmd2-sub2-sub1", "").Default() + cmd2Sub2Sub1.Arg("cmd2-sub2-sub1-arg1", "").HintOptions("cmd2-sub2-sub1-arg1").String() + cmd2Sub2Sub1.Arg("cmd2-sub2-sub1-arg2", "").HintOptions("cmd2-sub2-sub1-arg2").String() + + // Without args, should get: + // - root cmds (including implicit "help") + // - thread of default cmds + // - first arg hints for the final default cmd + assert.Equal(t, []string{"cmd1", "cmd2", "cmd2-sub1", "cmd2-sub2", "cmd2-sub2-sub1", "cmd2-sub2-sub1-arg1", "help"}, complete(t, app)) + + // With a non-default cmd already listed, should get: + // - sub cmds of that arg + assert.Equal(t, []string{"cmd1-sub1"}, complete(t, app, "cmd1")) + + // With an explicit default cmd listed, should get: + // - default child-cmds + // - first arg hints for the final default cmd + assert.Equal(t, []string{"cmd2-sub1", "cmd2-sub2", "cmd2-sub2-sub1", "cmd2-sub2-sub1-arg1"}, complete(t, app, "cmd2")) + + // Args should be completed when all preceding cmds are explicit, and when + // any of them are implicit (not listed). Check this by trying all possible + // combinations of choosing/excluding the three levels of cmds. This tests + // root-level default, middle default, and end default. + for i := 0; i < 8; i++ { + var cmdline []string + + if i&1 != 0 { + cmdline = append(cmdline, "cmd2") + } + if i&2 != 0 { + cmdline = append(cmdline, "cmd2-sub2") + } + if i&4 != 0 { + cmdline = append(cmdline, "cmd2-sub2-sub1") + } + + assert.Contains(t, complete(t, app, cmdline...), "cmd2-sub2-sub1-arg1", "with cmdline: %v", cmdline) + } + + // With both args of a default sub cmd, should get no completions + assert.Empty(t, complete(t, app, "arg1", "arg2")) +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/completions.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/completions.go new file mode 100644 index 0000000..6e7b409 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/completions.go @@ -0,0 +1,33 @@ +package kingpin + +// HintAction is a function type who is expected to return a slice of possible +// command line arguments. +type HintAction func() []string +type completionsMixin struct { + hintActions []HintAction + builtinHintActions []HintAction +} + +func (a *completionsMixin) addHintAction(action HintAction) { + a.hintActions = append(a.hintActions, action) +} + +// Allow adding of HintActions which are added internally, ie, EnumVar +func (a *completionsMixin) addHintActionBuiltin(action HintAction) { + a.builtinHintActions = append(a.builtinHintActions, action) +} + +func (a *completionsMixin) resolveCompletions() []string { + var hints []string + + options := a.builtinHintActions + if len(a.hintActions) > 0 { + // User specified their own hintActions. Use those instead. + options = a.hintActions + } + + for _, hintAction := range options { + hints = append(hints, hintAction()...) + } + return hints +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/completions_test.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/completions_test.go new file mode 100644 index 0000000..74656ea --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/completions_test.go @@ -0,0 +1,78 @@ +package kingpin + +import ( + "testing" + + "github.com/alecthomas/assert" +) + +func TestResolveWithBuiltin(t *testing.T) { + a := completionsMixin{} + + hintAction1 := func() []string { + return []string{"opt1", "opt2"} + } + hintAction2 := func() []string { + return []string{"opt3", "opt4"} + } + + a.builtinHintActions = []HintAction{hintAction1, hintAction2} + + args := a.resolveCompletions() + assert.Equal(t, []string{"opt1", "opt2", "opt3", "opt4"}, args) +} + +func TestResolveWithUser(t *testing.T) { + a := completionsMixin{} + hintAction1 := func() []string { + return []string{"opt1", "opt2"} + } + hintAction2 := func() []string { + return []string{"opt3", "opt4"} + } + + a.hintActions = []HintAction{hintAction1, hintAction2} + + args := a.resolveCompletions() + assert.Equal(t, []string{"opt1", "opt2", "opt3", "opt4"}, args) +} + +func TestResolveWithCombination(t *testing.T) { + a := completionsMixin{} + builtin := func() []string { + return []string{"opt1", "opt2"} + } + user := func() []string { + return []string{"opt3", "opt4"} + } + + a.builtinHintActions = []HintAction{builtin} + a.hintActions = []HintAction{user} + + args := a.resolveCompletions() + // User provided args take preference over builtin (enum-defined) args. + assert.Equal(t, []string{"opt3", "opt4"}, args) +} + +func TestAddHintAction(t *testing.T) { + a := completionsMixin{} + hintFunc := func() []string { + return []string{"opt1", "opt2"} + } + a.addHintAction(hintFunc) + + args := a.resolveCompletions() + assert.Equal(t, []string{"opt1", "opt2"}, args) +} + +func TestAddHintActionBuiltin(t *testing.T) { + a := completionsMixin{} + hintFunc := func() []string { + return []string{"opt1", "opt2"} + } + + a.addHintActionBuiltin(hintFunc) + + args := a.resolveCompletions() + assert.Equal(t, []string{"opt1", "opt2"}, args) +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/doc.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/doc.go new file mode 100644 index 0000000..cb951a8 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/doc.go @@ -0,0 +1,68 @@ +// Package kingpin provides command line interfaces like this: +// +// $ chat +// usage: chat [] [] [ ...] +// +// Flags: +// --debug enable debug mode +// --help Show help. +// --server=127.0.0.1 server address +// +// Commands: +// help +// Show help for a command. +// +// post [] +// Post a message to a channel. +// +// register +// Register a new user. +// +// $ chat help post +// usage: chat [] post [] [] +// +// Post a message to a channel. +// +// Flags: +// --image=IMAGE image to post +// +// Args: +// channel to post to +// [] text to post +// $ chat post --image=~/Downloads/owls.jpg pics +// +// From code like this: +// +// package main +// +// import "gopkg.in/alecthomas/kingpin.v2" +// +// var ( +// debug = kingpin.Flag("debug", "enable debug mode").Default("false").Bool() +// serverIP = kingpin.Flag("server", "server address").Default("127.0.0.1").IP() +// +// register = kingpin.Command("register", "Register a new user.") +// registerNick = register.Arg("nick", "nickname for user").Required().String() +// registerName = register.Arg("name", "name of user").Required().String() +// +// post = kingpin.Command("post", "Post a message to a channel.") +// postImage = post.Flag("image", "image to post").ExistingFile() +// postChannel = post.Arg("channel", "channel to post to").Required().String() +// postText = post.Arg("text", "text to post").String() +// ) +// +// func main() { +// switch kingpin.Parse() { +// // Register user +// case "register": +// println(*registerNick) +// +// // Post message +// case "post": +// if *postImage != nil { +// } +// if *postText != "" { +// } +// } +// } +package kingpin diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/envar.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/envar.go new file mode 100644 index 0000000..c01a27d --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/envar.go @@ -0,0 +1,45 @@ +package kingpin + +import ( + "os" + "regexp" +) + +var ( + envVarValuesSeparator = "\r?\n" + envVarValuesTrimmer = regexp.MustCompile(envVarValuesSeparator + "$") + envVarValuesSplitter = regexp.MustCompile(envVarValuesSeparator) +) + +type envarMixin struct { + envar string + noEnvar bool +} + +func (e *envarMixin) HasEnvarValue() bool { + return e.GetEnvarValue() != "" +} + +func (e *envarMixin) GetEnvarValue() string { + if e.noEnvar || e.envar == "" { + return "" + } + return os.Getenv(e.envar) +} + +func (e *envarMixin) GetSplitEnvarValue() []string { + values := make([]string, 0) + + envarValue := e.GetEnvarValue() + if envarValue == "" { + return values + } + + // Split by new line to extract multiple values, if any. + trimmed := envVarValuesTrimmer.ReplaceAllString(envarValue, "") + for _, value := range envVarValuesSplitter.Split(trimmed, -1) { + values = append(values, value) + } + + return values +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/examples_test.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/examples_test.go new file mode 100644 index 0000000..7c3e34f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/examples_test.go @@ -0,0 +1,46 @@ +package kingpin + +import ( + "fmt" + "net/http" + "strings" +) + +type HTTPHeaderValue http.Header + +func (h *HTTPHeaderValue) Set(value string) error { + parts := strings.SplitN(value, ":", 2) + if len(parts) != 2 { + return fmt.Errorf("expected HEADER:VALUE got '%s'", value) + } + (*http.Header)(h).Add(parts[0], parts[1]) + return nil +} + +func (h *HTTPHeaderValue) Get() interface{} { + return (http.Header)(*h) +} + +func (h *HTTPHeaderValue) String() string { + return "" +} + +func HTTPHeader(s Settings) (target *http.Header) { + target = new(http.Header) + s.SetValue((*HTTPHeaderValue)(target)) + return +} + +// This example ilustrates how to define custom parsers. HTTPHeader +// cumulatively parses each encountered --header flag into a http.Header struct. +func ExampleValue() { + var ( + curl = New("curl", "transfer a URL") + headers = HTTPHeader(curl.Flag("headers", "Add HTTP headers to the request.").Short('H').PlaceHolder("HEADER:VALUE")) + ) + + curl.Parse([]string{"-H Content-Type:application/octet-stream"}) + for key, value := range *headers { + fmt.Printf("%s = %s\n", key, value) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/flags.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/flags.go new file mode 100644 index 0000000..8f33721 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/flags.go @@ -0,0 +1,308 @@ +package kingpin + +import ( + "fmt" + "strings" +) + +type flagGroup struct { + short map[string]*FlagClause + long map[string]*FlagClause + flagOrder []*FlagClause +} + +func newFlagGroup() *flagGroup { + return &flagGroup{ + short: map[string]*FlagClause{}, + long: map[string]*FlagClause{}, + } +} + +// GetFlag gets a flag definition. +// +// This allows existing flags to be modified after definition but before parsing. Useful for +// modular applications. +func (f *flagGroup) GetFlag(name string) *FlagClause { + return f.long[name] +} + +// Flag defines a new flag with the given long name and help. +func (f *flagGroup) Flag(name, help string) *FlagClause { + flag := newFlag(name, help) + f.long[name] = flag + f.flagOrder = append(f.flagOrder, flag) + return flag +} + +func (f *flagGroup) init(defaultEnvarPrefix string) error { + if err := f.checkDuplicates(); err != nil { + return err + } + for _, flag := range f.long { + if defaultEnvarPrefix != "" && !flag.noEnvar && flag.envar == "" { + flag.envar = envarTransform(defaultEnvarPrefix + "_" + flag.name) + } + if err := flag.init(); err != nil { + return err + } + if flag.shorthand != 0 { + f.short[string(flag.shorthand)] = flag + } + } + return nil +} + +func (f *flagGroup) checkDuplicates() error { + seenShort := map[rune]bool{} + seenLong := map[string]bool{} + for _, flag := range f.flagOrder { + if flag.shorthand != 0 { + if _, ok := seenShort[flag.shorthand]; ok { + return fmt.Errorf("duplicate short flag -%c", flag.shorthand) + } + seenShort[flag.shorthand] = true + } + if _, ok := seenLong[flag.name]; ok { + return fmt.Errorf("duplicate long flag --%s", flag.name) + } + seenLong[flag.name] = true + } + return nil +} + +func (f *flagGroup) parse(context *ParseContext) (*FlagClause, error) { + var token *Token + +loop: + for { + token = context.Peek() + switch token.Type { + case TokenEOL: + break loop + + case TokenLong, TokenShort: + flagToken := token + defaultValue := "" + var flag *FlagClause + var ok bool + invert := false + + name := token.Value + if token.Type == TokenLong { + flag, ok = f.long[name] + if !ok { + if strings.HasPrefix(name, "no-") { + name = name[3:] + invert = true + } + flag, ok = f.long[name] + } + if !ok { + return nil, fmt.Errorf("unknown long flag '%s'", flagToken) + } + } else { + flag, ok = f.short[name] + if !ok { + return nil, fmt.Errorf("unknown short flag '%s'", flagToken) + } + } + + context.Next() + + fb, ok := flag.value.(boolFlag) + if ok && fb.IsBoolFlag() { + if invert { + defaultValue = "false" + } else { + defaultValue = "true" + } + } else { + if invert { + context.Push(token) + return nil, fmt.Errorf("unknown long flag '%s'", flagToken) + } + token = context.Peek() + if token.Type != TokenArg { + context.Push(token) + return nil, fmt.Errorf("expected argument for flag '%s'", flagToken) + } + context.Next() + defaultValue = token.Value + } + + context.matchedFlag(flag, defaultValue) + return flag, nil + + default: + break loop + } + } + return nil, nil +} + +// FlagClause is a fluid interface used to build flags. +type FlagClause struct { + parserMixin + actionMixin + completionsMixin + envarMixin + name string + shorthand rune + help string + defaultValues []string + placeholder string + hidden bool +} + +func newFlag(name, help string) *FlagClause { + f := &FlagClause{ + name: name, + help: help, + } + return f +} + +func (f *FlagClause) setDefault() error { + if f.HasEnvarValue() { + if v, ok := f.value.(repeatableFlag); !ok || !v.IsCumulative() { + // Use the value as-is + return f.value.Set(f.GetEnvarValue()) + } else { + for _, value := range f.GetSplitEnvarValue() { + if err := f.value.Set(value); err != nil { + return err + } + } + return nil + } + } + + if len(f.defaultValues) > 0 { + for _, defaultValue := range f.defaultValues { + if err := f.value.Set(defaultValue); err != nil { + return err + } + } + return nil + } + + return nil +} + +func (f *FlagClause) needsValue() bool { + haveDefault := len(f.defaultValues) > 0 + return f.required && !(haveDefault || f.HasEnvarValue()) +} + +func (f *FlagClause) init() error { + if f.required && len(f.defaultValues) > 0 { + return fmt.Errorf("required flag '--%s' with default value that will never be used", f.name) + } + if f.value == nil { + return fmt.Errorf("no type defined for --%s (eg. .String())", f.name) + } + if v, ok := f.value.(repeatableFlag); (!ok || !v.IsCumulative()) && len(f.defaultValues) > 1 { + return fmt.Errorf("invalid default for '--%s', expecting single value", f.name) + } + return nil +} + +// Dispatch to the given function after the flag is parsed and validated. +func (f *FlagClause) Action(action Action) *FlagClause { + f.addAction(action) + return f +} + +func (f *FlagClause) PreAction(action Action) *FlagClause { + f.addPreAction(action) + return f +} + +// HintAction registers a HintAction (function) for the flag to provide completions +func (a *FlagClause) HintAction(action HintAction) *FlagClause { + a.addHintAction(action) + return a +} + +// HintOptions registers any number of options for the flag to provide completions +func (a *FlagClause) HintOptions(options ...string) *FlagClause { + a.addHintAction(func() []string { + return options + }) + return a +} + +func (a *FlagClause) EnumVar(target *string, options ...string) { + a.parserMixin.EnumVar(target, options...) + a.addHintActionBuiltin(func() []string { + return options + }) +} + +func (a *FlagClause) Enum(options ...string) (target *string) { + a.addHintActionBuiltin(func() []string { + return options + }) + return a.parserMixin.Enum(options...) +} + +// Default values for this flag. They *must* be parseable by the value of the flag. +func (f *FlagClause) Default(values ...string) *FlagClause { + f.defaultValues = values + return f +} + +// DEPRECATED: Use Envar(name) instead. +func (f *FlagClause) OverrideDefaultFromEnvar(envar string) *FlagClause { + return f.Envar(envar) +} + +// Envar overrides the default value(s) for a flag from an environment variable, +// if it is set. Several default values can be provided by using new lines to +// separate them. +func (f *FlagClause) Envar(name string) *FlagClause { + f.envar = name + f.noEnvar = false + return f +} + +// NoEnvar forces environment variable defaults to be disabled for this flag. +// Most useful in conjunction with app.DefaultEnvars(). +func (f *FlagClause) NoEnvar() *FlagClause { + f.envar = "" + f.noEnvar = true + return f +} + +// PlaceHolder sets the place-holder string used for flag values in the help. The +// default behaviour is to use the value provided by Default() if provided, +// then fall back on the capitalized flag name. +func (f *FlagClause) PlaceHolder(placeholder string) *FlagClause { + f.placeholder = placeholder + return f +} + +// Hidden hides a flag from usage but still allows it to be used. +func (f *FlagClause) Hidden() *FlagClause { + f.hidden = true + return f +} + +// Required makes the flag required. You can not provide a Default() value to a Required() flag. +func (f *FlagClause) Required() *FlagClause { + f.required = true + return f +} + +// Short sets the short flag name. +func (f *FlagClause) Short(name rune) *FlagClause { + f.shorthand = name + return f +} + +// Bool makes this flag a boolean flag. +func (f *FlagClause) Bool() (target *bool) { + target = new(bool) + f.SetValue(newBoolValue(target)) + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/flags_test.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/flags_test.go new file mode 100644 index 0000000..9c83a1c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/flags_test.go @@ -0,0 +1,368 @@ +package kingpin + +import ( + "io/ioutil" + "os" + + "github.com/alecthomas/assert" + + "testing" +) + +func TestBool(t *testing.T) { + app := newTestApp() + b := app.Flag("b", "").Bool() + _, err := app.Parse([]string{"--b"}) + assert.NoError(t, err) + assert.True(t, *b) +} + +func TestNoBool(t *testing.T) { + fg := newFlagGroup() + f := fg.Flag("b", "").Default("true") + b := f.Bool() + fg.init("") + tokens := tokenize([]string{"--no-b"}, false) + _, err := fg.parse(tokens) + assert.NoError(t, err) + assert.False(t, *b) +} + +func TestNegateNonBool(t *testing.T) { + fg := newFlagGroup() + f := fg.Flag("b", "") + f.Int() + fg.init("") + tokens := tokenize([]string{"--no-b"}, false) + _, err := fg.parse(tokens) + assert.Error(t, err) +} + +func TestNegativePrefixLongFlag(t *testing.T) { + fg := newFlagGroup() + f := fg.Flag("no-comment", "") + b := f.Bool() + fg.init("") + tokens := tokenize([]string{"--no-comment"}, false) + _, err := fg.parse(tokens) + assert.NoError(t, err) + assert.False(t, *b) +} + +func TestInvalidFlagDefaultCanBeOverridden(t *testing.T) { + app := newTestApp() + app.Flag("a", "").Default("invalid").Bool() + _, err := app.Parse([]string{}) + assert.Error(t, err) +} + +func TestRequiredFlag(t *testing.T) { + app := newTestApp() + app.Version("0.0.0").Writer(ioutil.Discard) + exits := 0 + app.Terminate(func(int) { exits++ }) + app.Flag("a", "").Required().Bool() + _, err := app.Parse([]string{"--a"}) + assert.NoError(t, err) + _, err = app.Parse([]string{}) + assert.Error(t, err) + _, err = app.Parse([]string{"--version"}) + assert.Equal(t, 1, exits) +} + +func TestShortFlag(t *testing.T) { + app := newTestApp() + f := app.Flag("long", "").Short('s').Bool() + _, err := app.Parse([]string{"-s"}) + assert.NoError(t, err) + assert.True(t, *f) +} + +func TestUnicodeShortFlag(t *testing.T) { + app := newTestApp() + f := app.Flag("aaa", "").Short('ä').Bool() + _, err := app.Parse([]string{"-ä"}) + assert.NoError(t, err) + assert.True(t, *f) +} + +func TestCombinedShortFlags(t *testing.T) { + app := newTestApp() + a := app.Flag("short0", "").Short('0').Bool() + b := app.Flag("short1", "").Short('1').Bool() + c := app.Flag("short2", "").Short('2').Bool() + _, err := app.Parse([]string{"-01"}) + assert.NoError(t, err) + assert.True(t, *a) + assert.True(t, *b) + assert.False(t, *c) +} + +func TestCombinedUnicodeShortFlags(t *testing.T) { + app := newTestApp() + a := app.Flag("short0", "").Short('0').Bool() + b := app.Flag("short1", "").Short('1').Bool() + c := app.Flag("short2", "").Short('ä').Bool() + d := app.Flag("short3", "").Short('2').Bool() + _, err := app.Parse([]string{"-0ä1"}) + assert.NoError(t, err) + assert.True(t, *a) + assert.True(t, *b) + assert.True(t, *c) + assert.False(t, *d) +} + +func TestCombinedShortFlagArg(t *testing.T) { + a := newTestApp() + n := a.Flag("short", "").Short('s').Int() + _, err := a.Parse([]string{"-s10"}) + assert.NoError(t, err) + assert.Equal(t, 10, *n) +} + +func TestCombinedUnicodeShortFlagArg(t *testing.T) { + app := newTestApp() + a := app.Flag("short", "").Short('ä').Int() + _, err := app.Parse([]string{"-ä10"}) + assert.NoError(t, err) + assert.Equal(t, 10, *a) +} + +func TestCombinedUnicodeShortFlagUnicodeArg(t *testing.T) { + app := newTestApp() + a := app.Flag("short", "").Short('ä').String() + _, err := app.Parse([]string{"-äöö"}) + assert.NoError(t, err) + assert.Equal(t, "öö", *a) +} + +func TestEmptyShortFlagIsAnError(t *testing.T) { + _, err := newTestApp().Parse([]string{"-"}) + assert.Error(t, err) +} + +func TestRequiredWithEnvarMissingErrors(t *testing.T) { + app := newTestApp() + app.Flag("t", "").OverrideDefaultFromEnvar("TEST_ENVAR").Required().Int() + _, err := app.Parse([]string{}) + assert.Error(t, err) +} + +func TestRequiredWithEnvar(t *testing.T) { + os.Setenv("TEST_ENVAR", "123") + app := newTestApp() + flag := app.Flag("t", "").Envar("TEST_ENVAR").Required().Int() + _, err := app.Parse([]string{}) + assert.NoError(t, err) + assert.Equal(t, 123, *flag) +} + +func TestSubcommandFlagRequiredWithEnvar(t *testing.T) { + os.Setenv("TEST_ENVAR", "123") + app := newTestApp() + cmd := app.Command("command", "") + flag := cmd.Flag("t", "").Envar("TEST_ENVAR").Required().Int() + _, err := app.Parse([]string{"command"}) + assert.NoError(t, err) + assert.Equal(t, 123, *flag) +} + +func TestRegexp(t *testing.T) { + app := newTestApp() + flag := app.Flag("reg", "").Regexp() + _, err := app.Parse([]string{"--reg", "^abc$"}) + assert.NoError(t, err) + assert.NotNil(t, *flag) + assert.Equal(t, "^abc$", (*flag).String()) + assert.Regexp(t, *flag, "abc") + assert.NotRegexp(t, *flag, "abcd") +} + +func TestDuplicateShortFlag(t *testing.T) { + app := newTestApp() + app.Flag("a", "").Short('a').String() + app.Flag("b", "").Short('a').String() + _, err := app.Parse([]string{}) + assert.Error(t, err) +} + +func TestDuplicateLongFlag(t *testing.T) { + app := newTestApp() + app.Flag("a", "").String() + app.Flag("a", "").String() + _, err := app.Parse([]string{}) + assert.Error(t, err) +} + +func TestGetFlagAndOverrideDefault(t *testing.T) { + app := newTestApp() + a := app.Flag("a", "").Default("default").String() + _, err := app.Parse([]string{}) + assert.NoError(t, err) + assert.Equal(t, "default", *a) + app.GetFlag("a").Default("new") + _, err = app.Parse([]string{}) + assert.NoError(t, err) + assert.Equal(t, "new", *a) +} + +func TestEnvarOverrideDefault(t *testing.T) { + os.Setenv("TEST_ENVAR", "123") + app := newTestApp() + flag := app.Flag("t", "").Default("default").Envar("TEST_ENVAR").String() + _, err := app.Parse([]string{}) + assert.NoError(t, err) + assert.Equal(t, "123", *flag) +} + +func TestFlagMultipleValuesDefault(t *testing.T) { + app := newTestApp() + a := app.Flag("a", "").Default("default1", "default2").Strings() + _, err := app.Parse([]string{}) + assert.NoError(t, err) + assert.Equal(t, []string{"default1", "default2"}, *a) +} + +func TestFlagMultipleValuesDefaultNonRepeatable(t *testing.T) { + c := newTestApp() + c.Flag("foo", "foo").Default("a", "b").String() + _, err := c.Parse([]string{}) + assert.Error(t, err) +} + +func TestFlagMultipleValuesDefaultEnvarUnix(t *testing.T) { + app := newTestApp() + a := app.Flag("a", "").Envar("TEST_MULTIPLE_VALUES").Strings() + os.Setenv("TEST_MULTIPLE_VALUES", "123\n456\n") + _, err := app.Parse([]string{}) + assert.NoError(t, err) + assert.Equal(t, []string{"123", "456"}, *a) +} + +func TestFlagMultipleValuesDefaultEnvarWindows(t *testing.T) { + app := newTestApp() + a := app.Flag("a", "").Envar("TEST_MULTIPLE_VALUES").Strings() + os.Setenv("TEST_MULTIPLE_VALUES", "123\r\n456\r\n") + _, err := app.Parse([]string{}) + assert.NoError(t, err) + assert.Equal(t, []string{"123", "456"}, *a) +} + +func TestFlagMultipleValuesDefaultEnvarNonRepeatable(t *testing.T) { + c := newTestApp() + a := c.Flag("foo", "foo").Envar("TEST_MULTIPLE_VALUES_NON_REPEATABLE").String() + os.Setenv("TEST_MULTIPLE_VALUES_NON_REPEATABLE", "123\n456") + _, err := c.Parse([]string{}) + assert.NoError(t, err) + assert.Equal(t, "123\n456", *a) +} + +func TestFlagHintAction(t *testing.T) { + c := newTestApp() + + action := func() []string { + return []string{"opt1", "opt2"} + } + + a := c.Flag("foo", "foo").HintAction(action) + args := a.resolveCompletions() + assert.Equal(t, []string{"opt1", "opt2"}, args) +} + +func TestFlagHintOptions(t *testing.T) { + c := newTestApp() + + a := c.Flag("foo", "foo").HintOptions("opt1", "opt2") + args := a.resolveCompletions() + assert.Equal(t, []string{"opt1", "opt2"}, args) +} + +func TestFlagEnumVar(t *testing.T) { + c := newTestApp() + var bar string + + a := c.Flag("foo", "foo") + a.Enum("opt1", "opt2") + b := c.Flag("bar", "bar") + b.EnumVar(&bar, "opt3", "opt4") + + args := a.resolveCompletions() + assert.Equal(t, []string{"opt1", "opt2"}, args) + + args = b.resolveCompletions() + assert.Equal(t, []string{"opt3", "opt4"}, args) +} + +func TestMultiHintOptions(t *testing.T) { + c := newTestApp() + + a := c.Flag("foo", "foo").HintOptions("opt1").HintOptions("opt2") + args := a.resolveCompletions() + assert.Equal(t, []string{"opt1", "opt2"}, args) +} +func TestMultiHintActions(t *testing.T) { + c := newTestApp() + + a := c.Flag("foo", "foo"). + HintAction(func() []string { + return []string{"opt1"} + }). + HintAction(func() []string { + return []string{"opt2"} + }) + args := a.resolveCompletions() + assert.Equal(t, []string{"opt1", "opt2"}, args) +} + +func TestCombinationHintActionsOptions(t *testing.T) { + c := newTestApp() + + a := c.Flag("foo", "foo").HintAction(func() []string { + return []string{"opt1"} + }).HintOptions("opt2") + args := a.resolveCompletions() + assert.Equal(t, []string{"opt1", "opt2"}, args) +} + +func TestCombinationEnumActions(t *testing.T) { + c := newTestApp() + var foo string + + a := c.Flag("foo", "foo"). + HintAction(func() []string { + return []string{"opt1", "opt2"} + }) + a.Enum("opt3", "opt4") + + b := c.Flag("bar", "bar"). + HintAction(func() []string { + return []string{"opt5", "opt6"} + }) + b.EnumVar(&foo, "opt3", "opt4") + + // Provided HintActions should override automatically generated Enum options. + args := a.resolveCompletions() + assert.Equal(t, []string{"opt1", "opt2"}, args) + + args = b.resolveCompletions() + assert.Equal(t, []string{"opt5", "opt6"}, args) +} + +func TestCombinationEnumOptions(t *testing.T) { + c := newTestApp() + var foo string + + a := c.Flag("foo", "foo").HintOptions("opt1", "opt2") + a.Enum("opt3", "opt4") + + b := c.Flag("bar", "bar").HintOptions("opt5", "opt6") + b.EnumVar(&foo, "opt3", "opt4") + + // Provided HintOptions should override automatically generated Enum options. + args := a.resolveCompletions() + assert.Equal(t, []string{"opt1", "opt2"}, args) + + args = b.resolveCompletions() + assert.Equal(t, []string{"opt5", "opt6"}, args) + +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/global.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/global.go new file mode 100644 index 0000000..10a2913 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/global.go @@ -0,0 +1,94 @@ +package kingpin + +import ( + "os" + "path/filepath" +) + +var ( + // CommandLine is the default Kingpin parser. + CommandLine = New(filepath.Base(os.Args[0]), "") + // Global help flag. Exposed for user customisation. + HelpFlag = CommandLine.HelpFlag + // Top-level help command. Exposed for user customisation. May be nil. + HelpCommand = CommandLine.HelpCommand + // Global version flag. Exposed for user customisation. May be nil. + VersionFlag = CommandLine.VersionFlag +) + +// Command adds a new command to the default parser. +func Command(name, help string) *CmdClause { + return CommandLine.Command(name, help) +} + +// Flag adds a new flag to the default parser. +func Flag(name, help string) *FlagClause { + return CommandLine.Flag(name, help) +} + +// Arg adds a new argument to the top-level of the default parser. +func Arg(name, help string) *ArgClause { + return CommandLine.Arg(name, help) +} + +// Parse and return the selected command. Will call the termination handler if +// an error is encountered. +func Parse() string { + selected := MustParse(CommandLine.Parse(os.Args[1:])) + if selected == "" && CommandLine.cmdGroup.have() { + Usage() + CommandLine.terminate(0) + } + return selected +} + +// Errorf prints an error message to stderr. +func Errorf(format string, args ...interface{}) { + CommandLine.Errorf(format, args...) +} + +// Fatalf prints an error message to stderr and exits. +func Fatalf(format string, args ...interface{}) { + CommandLine.Fatalf(format, args...) +} + +// FatalIfError prints an error and exits if err is not nil. The error is printed +// with the given prefix. +func FatalIfError(err error, format string, args ...interface{}) { + CommandLine.FatalIfError(err, format, args...) +} + +// FatalUsage prints an error message followed by usage information, then +// exits with a non-zero status. +func FatalUsage(format string, args ...interface{}) { + CommandLine.FatalUsage(format, args...) +} + +// FatalUsageContext writes a printf formatted error message to stderr, then +// usage information for the given ParseContext, before exiting. +func FatalUsageContext(context *ParseContext, format string, args ...interface{}) { + CommandLine.FatalUsageContext(context, format, args...) +} + +// Usage prints usage to stderr. +func Usage() { + CommandLine.Usage(os.Args[1:]) +} + +// Set global usage template to use (defaults to DefaultUsageTemplate). +func UsageTemplate(template string) *Application { + return CommandLine.UsageTemplate(template) +} + +// MustParse can be used with app.Parse(args) to exit with an error if parsing fails. +func MustParse(command string, err error) string { + if err != nil { + Fatalf("%s, try --help", err) + } + return command +} + +// Version adds a flag for displaying the application version number. +func Version(version string) *Application { + return CommandLine.Version(version) +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/guesswidth.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/guesswidth.go new file mode 100644 index 0000000..a269531 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/guesswidth.go @@ -0,0 +1,9 @@ +// +build appengine !linux,!freebsd,!darwin,!dragonfly,!netbsd,!openbsd + +package kingpin + +import "io" + +func guessWidth(w io.Writer) int { + return 80 +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/guesswidth_unix.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/guesswidth_unix.go new file mode 100644 index 0000000..ad8163f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/guesswidth_unix.go @@ -0,0 +1,38 @@ +// +build !appengine,linux freebsd darwin dragonfly netbsd openbsd + +package kingpin + +import ( + "io" + "os" + "strconv" + "syscall" + "unsafe" +) + +func guessWidth(w io.Writer) int { + // check if COLUMNS env is set to comply with + // http://pubs.opengroup.org/onlinepubs/009604499/basedefs/xbd_chap08.html + colsStr := os.Getenv("COLUMNS") + if colsStr != "" { + if cols, err := strconv.Atoi(colsStr); err == nil { + return cols + } + } + + if t, ok := w.(*os.File); ok { + fd := t.Fd() + var dimensions [4]uint16 + + if _, _, err := syscall.Syscall6( + syscall.SYS_IOCTL, + uintptr(fd), + uintptr(syscall.TIOCGWINSZ), + uintptr(unsafe.Pointer(&dimensions)), + 0, 0, 0, + ); err == 0 { + return int(dimensions[1]) + } + } + return 80 +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/model.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/model.go new file mode 100644 index 0000000..a4ee83b --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/model.go @@ -0,0 +1,227 @@ +package kingpin + +import ( + "fmt" + "strconv" + "strings" +) + +// Data model for Kingpin command-line structure. + +type FlagGroupModel struct { + Flags []*FlagModel +} + +func (f *FlagGroupModel) FlagSummary() string { + out := []string{} + count := 0 + for _, flag := range f.Flags { + if flag.Name != "help" { + count++ + } + if flag.Required { + if flag.IsBoolFlag() { + out = append(out, fmt.Sprintf("--[no-]%s", flag.Name)) + } else { + out = append(out, fmt.Sprintf("--%s=%s", flag.Name, flag.FormatPlaceHolder())) + } + } + } + if count != len(out) { + out = append(out, "[]") + } + return strings.Join(out, " ") +} + +type FlagModel struct { + Name string + Help string + Short rune + Default []string + Envar string + PlaceHolder string + Required bool + Hidden bool + Value Value +} + +func (f *FlagModel) String() string { + return f.Value.String() +} + +func (f *FlagModel) IsBoolFlag() bool { + if fl, ok := f.Value.(boolFlag); ok { + return fl.IsBoolFlag() + } + return false +} + +func (f *FlagModel) FormatPlaceHolder() string { + if f.PlaceHolder != "" { + return f.PlaceHolder + } + if len(f.Default) > 0 { + ellipsis := "" + if len(f.Default) > 1 { + ellipsis = "..." + } + if _, ok := f.Value.(*stringValue); ok { + return strconv.Quote(f.Default[0]) + ellipsis + } + return f.Default[0] + ellipsis + } + return strings.ToUpper(f.Name) +} + +type ArgGroupModel struct { + Args []*ArgModel +} + +func (a *ArgGroupModel) ArgSummary() string { + depth := 0 + out := []string{} + for _, arg := range a.Args { + h := "<" + arg.Name + ">" + if !arg.Required { + h = "[" + h + depth++ + } + out = append(out, h) + } + out[len(out)-1] = out[len(out)-1] + strings.Repeat("]", depth) + return strings.Join(out, " ") +} + +type ArgModel struct { + Name string + Help string + Default []string + Envar string + Required bool + Value Value +} + +func (a *ArgModel) String() string { + return a.Value.String() +} + +type CmdGroupModel struct { + Commands []*CmdModel +} + +func (c *CmdGroupModel) FlattenedCommands() (out []*CmdModel) { + for _, cmd := range c.Commands { + if len(cmd.Commands) == 0 { + out = append(out, cmd) + } + out = append(out, cmd.FlattenedCommands()...) + } + return +} + +type CmdModel struct { + Name string + Aliases []string + Help string + FullCommand string + Depth int + Hidden bool + Default bool + *FlagGroupModel + *ArgGroupModel + *CmdGroupModel +} + +func (c *CmdModel) String() string { + return c.FullCommand +} + +type ApplicationModel struct { + Name string + Help string + Version string + Author string + *ArgGroupModel + *CmdGroupModel + *FlagGroupModel +} + +func (a *Application) Model() *ApplicationModel { + return &ApplicationModel{ + Name: a.Name, + Help: a.Help, + Version: a.version, + Author: a.author, + FlagGroupModel: a.flagGroup.Model(), + ArgGroupModel: a.argGroup.Model(), + CmdGroupModel: a.cmdGroup.Model(), + } +} + +func (a *argGroup) Model() *ArgGroupModel { + m := &ArgGroupModel{} + for _, arg := range a.args { + m.Args = append(m.Args, arg.Model()) + } + return m +} + +func (a *ArgClause) Model() *ArgModel { + return &ArgModel{ + Name: a.name, + Help: a.help, + Default: a.defaultValues, + Envar: a.envar, + Required: a.required, + Value: a.value, + } +} + +func (f *flagGroup) Model() *FlagGroupModel { + m := &FlagGroupModel{} + for _, fl := range f.flagOrder { + m.Flags = append(m.Flags, fl.Model()) + } + return m +} + +func (f *FlagClause) Model() *FlagModel { + return &FlagModel{ + Name: f.name, + Help: f.help, + Short: rune(f.shorthand), + Default: f.defaultValues, + Envar: f.envar, + PlaceHolder: f.placeholder, + Required: f.required, + Hidden: f.hidden, + Value: f.value, + } +} + +func (c *cmdGroup) Model() *CmdGroupModel { + m := &CmdGroupModel{} + for _, cm := range c.commandOrder { + m.Commands = append(m.Commands, cm.Model()) + } + return m +} + +func (c *CmdClause) Model() *CmdModel { + depth := 0 + for i := c; i != nil; i = i.parent { + depth++ + } + return &CmdModel{ + Name: c.name, + Aliases: c.aliases, + Help: c.help, + Depth: depth, + Hidden: c.hidden, + Default: c.isDefault, + FullCommand: c.FullCommand(), + FlagGroupModel: c.flagGroup.Model(), + ArgGroupModel: c.argGroup.Model(), + CmdGroupModel: c.cmdGroup.Model(), + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/parser.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/parser.go new file mode 100644 index 0000000..efa198a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/parser.go @@ -0,0 +1,382 @@ +package kingpin + +import ( + "bufio" + "fmt" + "os" + "strings" + "unicode/utf8" +) + +type TokenType int + +// Token types. +const ( + TokenShort TokenType = iota + TokenLong + TokenArg + TokenError + TokenEOL +) + +func (t TokenType) String() string { + switch t { + case TokenShort: + return "short flag" + case TokenLong: + return "long flag" + case TokenArg: + return "argument" + case TokenError: + return "error" + case TokenEOL: + return "" + } + return "?" +} + +var ( + TokenEOLMarker = Token{-1, TokenEOL, ""} +) + +type Token struct { + Index int + Type TokenType + Value string +} + +func (t *Token) Equal(o *Token) bool { + return t.Index == o.Index +} + +func (t *Token) IsFlag() bool { + return t.Type == TokenShort || t.Type == TokenLong +} + +func (t *Token) IsEOF() bool { + return t.Type == TokenEOL +} + +func (t *Token) String() string { + switch t.Type { + case TokenShort: + return "-" + t.Value + case TokenLong: + return "--" + t.Value + case TokenArg: + return t.Value + case TokenError: + return "error: " + t.Value + case TokenEOL: + return "" + default: + panic("unhandled type") + } +} + +// A union of possible elements in a parse stack. +type ParseElement struct { + // Clause is either *CmdClause, *ArgClause or *FlagClause. + Clause interface{} + // Value is corresponding value for an ArgClause or FlagClause (if any). + Value *string +} + +// ParseContext holds the current context of the parser. When passed to +// Action() callbacks Elements will be fully populated with *FlagClause, +// *ArgClause and *CmdClause values and their corresponding arguments (if +// any). +type ParseContext struct { + SelectedCommand *CmdClause + ignoreDefault bool + argsOnly bool + peek []*Token + argi int // Index of current command-line arg we're processing. + args []string + rawArgs []string + flags *flagGroup + arguments *argGroup + argumenti int // Cursor into arguments + // Flags, arguments and commands encountered and collected during parse. + Elements []*ParseElement +} + +func (p *ParseContext) nextArg() *ArgClause { + if p.argumenti >= len(p.arguments.args) { + return nil + } + arg := p.arguments.args[p.argumenti] + if !arg.consumesRemainder() { + p.argumenti++ + } + return arg +} + +func (p *ParseContext) next() { + p.argi++ + p.args = p.args[1:] +} + +// HasTrailingArgs returns true if there are unparsed command-line arguments. +// This can occur if the parser can not match remaining arguments. +func (p *ParseContext) HasTrailingArgs() bool { + return len(p.args) > 0 +} + +func tokenize(args []string, ignoreDefault bool) *ParseContext { + return &ParseContext{ + ignoreDefault: ignoreDefault, + args: args, + rawArgs: args, + flags: newFlagGroup(), + arguments: newArgGroup(), + } +} + +func (p *ParseContext) mergeFlags(flags *flagGroup) { + for _, flag := range flags.flagOrder { + if flag.shorthand != 0 { + p.flags.short[string(flag.shorthand)] = flag + } + p.flags.long[flag.name] = flag + p.flags.flagOrder = append(p.flags.flagOrder, flag) + } +} + +func (p *ParseContext) mergeArgs(args *argGroup) { + for _, arg := range args.args { + p.arguments.args = append(p.arguments.args, arg) + } +} + +func (p *ParseContext) EOL() bool { + return p.Peek().Type == TokenEOL +} + +// Next token in the parse context. +func (p *ParseContext) Next() *Token { + if len(p.peek) > 0 { + return p.pop() + } + + // End of tokens. + if len(p.args) == 0 { + return &Token{Index: p.argi, Type: TokenEOL} + } + + arg := p.args[0] + p.next() + + if p.argsOnly { + return &Token{p.argi, TokenArg, arg} + } + + // All remaining args are passed directly. + if arg == "--" { + p.argsOnly = true + return p.Next() + } + + if strings.HasPrefix(arg, "--") { + parts := strings.SplitN(arg[2:], "=", 2) + token := &Token{p.argi, TokenLong, parts[0]} + if len(parts) == 2 { + p.Push(&Token{p.argi, TokenArg, parts[1]}) + } + return token + } + + if strings.HasPrefix(arg, "-") { + if len(arg) == 1 { + return &Token{Index: p.argi, Type: TokenShort} + } + shortRune, size := utf8.DecodeRuneInString(arg[1:]) + short := string(shortRune) + flag, ok := p.flags.short[short] + // Not a known short flag, we'll just return it anyway. + if !ok { + } else if fb, ok := flag.value.(boolFlag); ok && fb.IsBoolFlag() { + // Bool short flag. + } else { + // Short flag with combined argument: -fARG + token := &Token{p.argi, TokenShort, short} + if len(arg) > size+1 { + p.Push(&Token{p.argi, TokenArg, arg[size+1:]}) + } + return token + } + + if len(arg) > size+1 { + p.args = append([]string{"-" + arg[size+1:]}, p.args...) + } + return &Token{p.argi, TokenShort, short} + } else if strings.HasPrefix(arg, "@") { + expanded, err := ExpandArgsFromFile(arg[1:]) + if err != nil { + return &Token{p.argi, TokenError, err.Error()} + } + if len(p.args) == 0 { + p.args = expanded + } else { + p.args = append(expanded, p.args...) + } + return p.Next() + } + + return &Token{p.argi, TokenArg, arg} +} + +func (p *ParseContext) Peek() *Token { + if len(p.peek) == 0 { + return p.Push(p.Next()) + } + return p.peek[len(p.peek)-1] +} + +func (p *ParseContext) Push(token *Token) *Token { + p.peek = append(p.peek, token) + return token +} + +func (p *ParseContext) pop() *Token { + end := len(p.peek) - 1 + token := p.peek[end] + p.peek = p.peek[0:end] + return token +} + +func (p *ParseContext) String() string { + return p.SelectedCommand.FullCommand() +} + +func (p *ParseContext) matchedFlag(flag *FlagClause, value string) { + p.Elements = append(p.Elements, &ParseElement{Clause: flag, Value: &value}) +} + +func (p *ParseContext) matchedArg(arg *ArgClause, value string) { + p.Elements = append(p.Elements, &ParseElement{Clause: arg, Value: &value}) +} + +func (p *ParseContext) matchedCmd(cmd *CmdClause) { + p.Elements = append(p.Elements, &ParseElement{Clause: cmd}) + p.mergeFlags(cmd.flagGroup) + p.mergeArgs(cmd.argGroup) + p.SelectedCommand = cmd +} + +// Expand arguments from a file. Lines starting with # will be treated as comments. +func ExpandArgsFromFile(filename string) (out []string, err error) { + r, err := os.Open(filename) + if err != nil { + return nil, err + } + defer r.Close() + scanner := bufio.NewScanner(r) + for scanner.Scan() { + line := scanner.Text() + if strings.HasPrefix(line, "#") { + continue + } + out = append(out, line) + } + err = scanner.Err() + return +} + +func parse(context *ParseContext, app *Application) (err error) { + context.mergeFlags(app.flagGroup) + context.mergeArgs(app.argGroup) + + cmds := app.cmdGroup + ignoreDefault := context.ignoreDefault + +loop: + for !context.EOL() { + token := context.Peek() + + switch token.Type { + case TokenLong, TokenShort: + if flag, err := context.flags.parse(context); err != nil { + if !ignoreDefault { + if cmd := cmds.defaultSubcommand(); cmd != nil { + cmd.completionAlts = cmds.cmdNames() + context.matchedCmd(cmd) + cmds = cmd.cmdGroup + break + } + } + return err + } else if flag == HelpFlag { + ignoreDefault = true + } + + case TokenArg: + if cmds.have() { + selectedDefault := false + cmd, ok := cmds.commands[token.String()] + if !ok { + if !ignoreDefault { + if cmd = cmds.defaultSubcommand(); cmd != nil { + cmd.completionAlts = cmds.cmdNames() + selectedDefault = true + } + } + if cmd == nil { + return fmt.Errorf("expected command but got %q", token) + } + } + if cmd == HelpCommand { + ignoreDefault = true + } + cmd.completionAlts = nil + context.matchedCmd(cmd) + cmds = cmd.cmdGroup + if !selectedDefault { + context.Next() + } + } else if context.arguments.have() { + if app.noInterspersed { + // no more flags + context.argsOnly = true + } + arg := context.nextArg() + if arg == nil { + break loop + } + context.matchedArg(arg, token.String()) + context.Next() + } else { + break loop + } + + case TokenEOL: + break loop + } + } + + // Move to innermost default command. + for !ignoreDefault { + if cmd := cmds.defaultSubcommand(); cmd != nil { + cmd.completionAlts = cmds.cmdNames() + context.matchedCmd(cmd) + cmds = cmd.cmdGroup + } else { + break + } + } + + if !context.EOL() { + return fmt.Errorf("unexpected %s", context.Peek()) + } + + // Set defaults for all remaining args. + for arg := context.nextArg(); arg != nil && !arg.consumesRemainder(); arg = context.nextArg() { + for _, defaultValue := range arg.defaultValues { + if err := arg.value.Set(defaultValue); err != nil { + return fmt.Errorf("invalid default value '%s' for argument '%s'", defaultValue, arg.name) + } + } + } + + return +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/parser_test.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/parser_test.go new file mode 100644 index 0000000..71bafe5 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/parser_test.go @@ -0,0 +1,122 @@ +package kingpin + +import ( + "io/ioutil" + "os" + "testing" + + "github.com/alecthomas/assert" +) + +func TestParserExpandFromFile(t *testing.T) { + f, err := ioutil.TempFile("", "") + assert.NoError(t, err) + defer os.Remove(f.Name()) + f.WriteString("hello\nworld\n") + f.Close() + + app := New("test", "") + arg0 := app.Arg("arg0", "").String() + arg1 := app.Arg("arg1", "").String() + + _, err = app.Parse([]string{"@" + f.Name()}) + assert.NoError(t, err) + assert.Equal(t, "hello", *arg0) + assert.Equal(t, "world", *arg1) +} + +func TestParserExpandFromFileLeadingArg(t *testing.T) { + f, err := ioutil.TempFile("", "") + assert.NoError(t, err) + defer os.Remove(f.Name()) + f.WriteString("hello\nworld\n") + f.Close() + + app := New("test", "") + arg0 := app.Arg("arg0", "").String() + arg1 := app.Arg("arg1", "").String() + arg2 := app.Arg("arg2", "").String() + + _, err = app.Parse([]string{"prefix", "@" + f.Name()}) + assert.NoError(t, err) + assert.Equal(t, "prefix", *arg0) + assert.Equal(t, "hello", *arg1) + assert.Equal(t, "world", *arg2) +} + +func TestParserExpandFromFileTrailingArg(t *testing.T) { + f, err := ioutil.TempFile("", "") + assert.NoError(t, err) + defer os.Remove(f.Name()) + f.WriteString("hello\nworld\n") + f.Close() + + app := New("test", "") + arg0 := app.Arg("arg0", "").String() + arg1 := app.Arg("arg1", "").String() + arg2 := app.Arg("arg2", "").String() + + _, err = app.Parse([]string{"@" + f.Name(), "suffix"}) + assert.NoError(t, err) + assert.Equal(t, "hello", *arg0) + assert.Equal(t, "world", *arg1) + assert.Equal(t, "suffix", *arg2) +} + +func TestParserExpandFromFileMultipleSurroundingArgs(t *testing.T) { + f, err := ioutil.TempFile("", "") + assert.NoError(t, err) + defer os.Remove(f.Name()) + f.WriteString("hello\nworld\n") + f.Close() + + app := New("test", "") + arg0 := app.Arg("arg0", "").String() + arg1 := app.Arg("arg1", "").String() + arg2 := app.Arg("arg2", "").String() + arg3 := app.Arg("arg3", "").String() + + _, err = app.Parse([]string{"prefix", "@" + f.Name(), "suffix"}) + assert.NoError(t, err) + assert.Equal(t, "prefix", *arg0) + assert.Equal(t, "hello", *arg1) + assert.Equal(t, "world", *arg2) + assert.Equal(t, "suffix", *arg3) +} + +func TestParserExpandFromFileMultipleFlags(t *testing.T) { + f, err := ioutil.TempFile("", "") + assert.NoError(t, err) + defer os.Remove(f.Name()) + f.WriteString("--flag1=f1\n--flag2=f2\n") + f.Close() + + app := New("test", "") + flag0 := app.Flag("flag0", "").String() + flag1 := app.Flag("flag1", "").String() + flag2 := app.Flag("flag2", "").String() + flag3 := app.Flag("flag3", "").String() + + _, err = app.Parse([]string{"--flag0=f0", "@" + f.Name(), "--flag3=f3"}) + assert.NoError(t, err) + assert.Equal(t, "f0", *flag0) + assert.Equal(t, "f1", *flag1) + assert.Equal(t, "f2", *flag2) + assert.Equal(t, "f3", *flag3) +} + +func TestParseContextPush(t *testing.T) { + app := New("test", "") + app.Command("foo", "").Command("bar", "") + c := tokenize([]string{"foo", "bar"}, false) + a := c.Next() + assert.Equal(t, TokenArg, a.Type) + b := c.Next() + assert.Equal(t, TokenArg, b.Type) + c.Push(b) + c.Push(a) + a = c.Next() + assert.Equal(t, "foo", a.Value) + b = c.Next() + assert.Equal(t, "bar", b.Value) +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/parsers.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/parsers.go new file mode 100644 index 0000000..d9ad57e --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/parsers.go @@ -0,0 +1,212 @@ +package kingpin + +import ( + "net" + "net/url" + "os" + "time" + + "github.com/alecthomas/units" +) + +type Settings interface { + SetValue(value Value) +} + +type parserMixin struct { + value Value + required bool +} + +func (p *parserMixin) SetValue(value Value) { + p.value = value +} + +// StringMap provides key=value parsing into a map. +func (p *parserMixin) StringMap() (target *map[string]string) { + target = &(map[string]string{}) + p.StringMapVar(target) + return +} + +// Duration sets the parser to a time.Duration parser. +func (p *parserMixin) Duration() (target *time.Duration) { + target = new(time.Duration) + p.DurationVar(target) + return +} + +// Bytes parses numeric byte units. eg. 1.5KB +func (p *parserMixin) Bytes() (target *units.Base2Bytes) { + target = new(units.Base2Bytes) + p.BytesVar(target) + return +} + +// IP sets the parser to a net.IP parser. +func (p *parserMixin) IP() (target *net.IP) { + target = new(net.IP) + p.IPVar(target) + return +} + +// TCP (host:port) address. +func (p *parserMixin) TCP() (target **net.TCPAddr) { + target = new(*net.TCPAddr) + p.TCPVar(target) + return +} + +// TCPVar (host:port) address. +func (p *parserMixin) TCPVar(target **net.TCPAddr) { + p.SetValue(newTCPAddrValue(target)) +} + +// ExistingFile sets the parser to one that requires and returns an existing file. +func (p *parserMixin) ExistingFile() (target *string) { + target = new(string) + p.ExistingFileVar(target) + return +} + +// ExistingDir sets the parser to one that requires and returns an existing directory. +func (p *parserMixin) ExistingDir() (target *string) { + target = new(string) + p.ExistingDirVar(target) + return +} + +// ExistingFileOrDir sets the parser to one that requires and returns an existing file OR directory. +func (p *parserMixin) ExistingFileOrDir() (target *string) { + target = new(string) + p.ExistingFileOrDirVar(target) + return +} + +// File returns an os.File against an existing file. +func (p *parserMixin) File() (target **os.File) { + target = new(*os.File) + p.FileVar(target) + return +} + +// File attempts to open a File with os.OpenFile(flag, perm). +func (p *parserMixin) OpenFile(flag int, perm os.FileMode) (target **os.File) { + target = new(*os.File) + p.OpenFileVar(target, flag, perm) + return +} + +// URL provides a valid, parsed url.URL. +func (p *parserMixin) URL() (target **url.URL) { + target = new(*url.URL) + p.URLVar(target) + return +} + +// StringMap provides key=value parsing into a map. +func (p *parserMixin) StringMapVar(target *map[string]string) { + p.SetValue(newStringMapValue(target)) +} + +// Float sets the parser to a float64 parser. +func (p *parserMixin) Float() (target *float64) { + return p.Float64() +} + +// Float sets the parser to a float64 parser. +func (p *parserMixin) FloatVar(target *float64) { + p.Float64Var(target) +} + +// Duration sets the parser to a time.Duration parser. +func (p *parserMixin) DurationVar(target *time.Duration) { + p.SetValue(newDurationValue(target)) +} + +// BytesVar parses numeric byte units. eg. 1.5KB +func (p *parserMixin) BytesVar(target *units.Base2Bytes) { + p.SetValue(newBytesValue(target)) +} + +// IP sets the parser to a net.IP parser. +func (p *parserMixin) IPVar(target *net.IP) { + p.SetValue(newIPValue(target)) +} + +// ExistingFile sets the parser to one that requires and returns an existing file. +func (p *parserMixin) ExistingFileVar(target *string) { + p.SetValue(newExistingFileValue(target)) +} + +// ExistingDir sets the parser to one that requires and returns an existing directory. +func (p *parserMixin) ExistingDirVar(target *string) { + p.SetValue(newExistingDirValue(target)) +} + +// ExistingDir sets the parser to one that requires and returns an existing directory. +func (p *parserMixin) ExistingFileOrDirVar(target *string) { + p.SetValue(newExistingFileOrDirValue(target)) +} + +// FileVar opens an existing file. +func (p *parserMixin) FileVar(target **os.File) { + p.SetValue(newFileValue(target, os.O_RDONLY, 0)) +} + +// OpenFileVar calls os.OpenFile(flag, perm) +func (p *parserMixin) OpenFileVar(target **os.File, flag int, perm os.FileMode) { + p.SetValue(newFileValue(target, flag, perm)) +} + +// URL provides a valid, parsed url.URL. +func (p *parserMixin) URLVar(target **url.URL) { + p.SetValue(newURLValue(target)) +} + +// URLList provides a parsed list of url.URL values. +func (p *parserMixin) URLList() (target *[]*url.URL) { + target = new([]*url.URL) + p.URLListVar(target) + return +} + +// URLListVar provides a parsed list of url.URL values. +func (p *parserMixin) URLListVar(target *[]*url.URL) { + p.SetValue(newURLListValue(target)) +} + +// Enum allows a value from a set of options. +func (p *parserMixin) Enum(options ...string) (target *string) { + target = new(string) + p.EnumVar(target, options...) + return +} + +// EnumVar allows a value from a set of options. +func (p *parserMixin) EnumVar(target *string, options ...string) { + p.SetValue(newEnumFlag(target, options...)) +} + +// Enums allows a set of values from a set of options. +func (p *parserMixin) Enums(options ...string) (target *[]string) { + target = new([]string) + p.EnumsVar(target, options...) + return +} + +// EnumVar allows a value from a set of options. +func (p *parserMixin) EnumsVar(target *[]string, options ...string) { + p.SetValue(newEnumsFlag(target, options...)) +} + +// A Counter increments a number each time it is encountered. +func (p *parserMixin) Counter() (target *int) { + target = new(int) + p.CounterVar(target) + return +} + +func (p *parserMixin) CounterVar(target *int) { + p.SetValue(newCounterValue(target)) +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/parsers_test.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/parsers_test.go new file mode 100644 index 0000000..04e836c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/parsers_test.go @@ -0,0 +1,98 @@ +package kingpin + +import ( + "io/ioutil" + "net" + "net/url" + "os" + + "github.com/alecthomas/assert" + + "testing" +) + +func TestParseStrings(t *testing.T) { + p := parserMixin{} + v := p.Strings() + p.value.Set("a") + p.value.Set("b") + assert.Equal(t, []string{"a", "b"}, *v) +} + +func TestStringsStringer(t *testing.T) { + target := []string{} + v := newAccumulator(&target, func(v interface{}) Value { return newStringValue(v.(*string)) }) + v.Set("hello") + v.Set("world") + assert.Equal(t, "hello,world", v.String()) +} + +func TestParseStringMap(t *testing.T) { + p := parserMixin{} + v := p.StringMap() + p.value.Set("a:b") + p.value.Set("b:c") + assert.Equal(t, map[string]string{"a": "b", "b": "c"}, *v) +} + +func TestParseIP(t *testing.T) { + p := parserMixin{} + v := p.IP() + p.value.Set("10.1.1.2") + ip := net.ParseIP("10.1.1.2") + assert.Equal(t, ip, *v) +} + +func TestParseURL(t *testing.T) { + p := parserMixin{} + v := p.URL() + p.value.Set("http://w3.org") + u, err := url.Parse("http://w3.org") + assert.NoError(t, err) + assert.Equal(t, *u, **v) +} + +func TestParseExistingFile(t *testing.T) { + f, err := ioutil.TempFile("", "") + if err != nil { + t.Fatal(err) + } + defer f.Close() + defer os.Remove(f.Name()) + + p := parserMixin{} + v := p.ExistingFile() + err = p.value.Set(f.Name()) + assert.NoError(t, err) + assert.Equal(t, f.Name(), *v) + err = p.value.Set("/etc/hostsDEFINITELYMISSING") + assert.Error(t, err) +} + +func TestParseTCPAddr(t *testing.T) { + p := parserMixin{} + v := p.TCP() + err := p.value.Set("127.0.0.1:1234") + assert.NoError(t, err) + expected, err := net.ResolveTCPAddr("tcp", "127.0.0.1:1234") + assert.NoError(t, err) + assert.Equal(t, *expected, **v) +} + +func TestParseTCPAddrList(t *testing.T) { + p := parserMixin{} + _ = p.TCPList() + err := p.value.Set("127.0.0.1:1234") + assert.NoError(t, err) + err = p.value.Set("127.0.0.1:1235") + assert.NoError(t, err) + assert.Equal(t, "127.0.0.1:1234,127.0.0.1:1235", p.value.String()) +} + +func TestFloat32(t *testing.T) { + p := parserMixin{} + v := p.Float32() + err := p.value.Set("123.45") + assert.NoError(t, err) + assert.InEpsilon(t, 123.45, *v, 0.001) +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/templates.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/templates.go new file mode 100644 index 0000000..97b5c9f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/templates.go @@ -0,0 +1,262 @@ +package kingpin + +// Default usage template. +var DefaultUsageTemplate = `{{define "FormatCommand"}}\ +{{if .FlagSummary}} {{.FlagSummary}}{{end}}\ +{{range .Args}} {{if not .Required}}[{{end}}<{{.Name}}>{{if .Value|IsCumulative}}...{{end}}{{if not .Required}}]{{end}}{{end}}\ +{{end}}\ + +{{define "FormatCommands"}}\ +{{range .FlattenedCommands}}\ +{{if not .Hidden}}\ + {{.FullCommand}}{{if .Default}}*{{end}}{{template "FormatCommand" .}} +{{.Help|Wrap 4}} +{{end}}\ +{{end}}\ +{{end}}\ + +{{define "FormatUsage"}}\ +{{template "FormatCommand" .}}{{if .Commands}} [ ...]{{end}} +{{if .Help}} +{{.Help|Wrap 0}}\ +{{end}}\ + +{{end}}\ + +{{if .Context.SelectedCommand}}\ +usage: {{.App.Name}} {{.Context.SelectedCommand}}{{template "FormatUsage" .Context.SelectedCommand}} +{{else}}\ +usage: {{.App.Name}}{{template "FormatUsage" .App}} +{{end}}\ +{{if .Context.Flags}}\ +Flags: +{{.Context.Flags|FlagsToTwoColumns|FormatTwoColumns}} +{{end}}\ +{{if .Context.Args}}\ +Args: +{{.Context.Args|ArgsToTwoColumns|FormatTwoColumns}} +{{end}}\ +{{if .Context.SelectedCommand}}\ +{{if len .Context.SelectedCommand.Commands}}\ +Subcommands: +{{template "FormatCommands" .Context.SelectedCommand}} +{{end}}\ +{{else if .App.Commands}}\ +Commands: +{{template "FormatCommands" .App}} +{{end}}\ +` + +// Usage template where command's optional flags are listed separately +var SeparateOptionalFlagsUsageTemplate = `{{define "FormatCommand"}}\ +{{if .FlagSummary}} {{.FlagSummary}}{{end}}\ +{{range .Args}} {{if not .Required}}[{{end}}<{{.Name}}>{{if .Value|IsCumulative}}...{{end}}{{if not .Required}}]{{end}}{{end}}\ +{{end}}\ + +{{define "FormatCommands"}}\ +{{range .FlattenedCommands}}\ +{{if not .Hidden}}\ + {{.FullCommand}}{{if .Default}}*{{end}}{{template "FormatCommand" .}} +{{.Help|Wrap 4}} +{{end}}\ +{{end}}\ +{{end}}\ + +{{define "FormatUsage"}}\ +{{template "FormatCommand" .}}{{if .Commands}} [ ...]{{end}} +{{if .Help}} +{{.Help|Wrap 0}}\ +{{end}}\ + +{{end}}\ +{{if .Context.SelectedCommand}}\ +usage: {{.App.Name}} {{.Context.SelectedCommand}}{{template "FormatUsage" .Context.SelectedCommand}} +{{else}}\ +usage: {{.App.Name}}{{template "FormatUsage" .App}} +{{end}}\ + +{{if .Context.Flags|RequiredFlags}}\ +Required flags: +{{.Context.Flags|RequiredFlags|FlagsToTwoColumns|FormatTwoColumns}} +{{end}}\ +{{if .Context.Flags|OptionalFlags}}\ +Optional flags: +{{.Context.Flags|OptionalFlags|FlagsToTwoColumns|FormatTwoColumns}} +{{end}}\ +{{if .Context.Args}}\ +Args: +{{.Context.Args|ArgsToTwoColumns|FormatTwoColumns}} +{{end}}\ +{{if .Context.SelectedCommand}}\ +Subcommands: +{{if .Context.SelectedCommand.Commands}}\ +{{template "FormatCommands" .Context.SelectedCommand}} +{{end}}\ +{{else if .App.Commands}}\ +Commands: +{{template "FormatCommands" .App}} +{{end}}\ +` + +// Usage template with compactly formatted commands. +var CompactUsageTemplate = `{{define "FormatCommand"}}\ +{{if .FlagSummary}} {{.FlagSummary}}{{end}}\ +{{range .Args}} {{if not .Required}}[{{end}}<{{.Name}}>{{if .Value|IsCumulative}}...{{end}}{{if not .Required}}]{{end}}{{end}}\ +{{end}}\ + +{{define "FormatCommandList"}}\ +{{range .}}\ +{{if not .Hidden}}\ +{{.Depth|Indent}}{{.Name}}{{if .Default}}*{{end}}{{template "FormatCommand" .}} +{{end}}\ +{{template "FormatCommandList" .Commands}}\ +{{end}}\ +{{end}}\ + +{{define "FormatUsage"}}\ +{{template "FormatCommand" .}}{{if .Commands}} [ ...]{{end}} +{{if .Help}} +{{.Help|Wrap 0}}\ +{{end}}\ + +{{end}}\ + +{{if .Context.SelectedCommand}}\ +usage: {{.App.Name}} {{.Context.SelectedCommand}}{{template "FormatUsage" .Context.SelectedCommand}} +{{else}}\ +usage: {{.App.Name}}{{template "FormatUsage" .App}} +{{end}}\ +{{if .Context.Flags}}\ +Flags: +{{.Context.Flags|FlagsToTwoColumns|FormatTwoColumns}} +{{end}}\ +{{if .Context.Args}}\ +Args: +{{.Context.Args|ArgsToTwoColumns|FormatTwoColumns}} +{{end}}\ +{{if .Context.SelectedCommand}}\ +{{if .Context.SelectedCommand.Commands}}\ +Commands: + {{.Context.SelectedCommand}} +{{template "FormatCommandList" .Context.SelectedCommand.Commands}} +{{end}}\ +{{else if .App.Commands}}\ +Commands: +{{template "FormatCommandList" .App.Commands}} +{{end}}\ +` + +var ManPageTemplate = `{{define "FormatFlags"}}\ +{{range .Flags}}\ +{{if not .Hidden}}\ +.TP +\fB{{if .Short}}-{{.Short|Char}}, {{end}}--{{.Name}}{{if not .IsBoolFlag}}={{.FormatPlaceHolder}}{{end}}\\fR +{{.Help}} +{{end}}\ +{{end}}\ +{{end}}\ + +{{define "FormatCommand"}}\ +{{if .FlagSummary}} {{.FlagSummary}}{{end}}\ +{{range .Args}} {{if not .Required}}[{{end}}<{{.Name}}{{if .Default}}*{{end}}>{{if .Value|IsCumulative}}...{{end}}{{if not .Required}}]{{end}}{{end}}\ +{{end}}\ + +{{define "FormatCommands"}}\ +{{range .FlattenedCommands}}\ +{{if not .Hidden}}\ +.SS +\fB{{.FullCommand}}{{template "FormatCommand" .}}\\fR +.PP +{{.Help}} +{{template "FormatFlags" .}}\ +{{end}}\ +{{end}}\ +{{end}}\ + +{{define "FormatUsage"}}\ +{{template "FormatCommand" .}}{{if .Commands}} [ ...]{{end}}\\fR +{{end}}\ + +.TH {{.App.Name}} 1 {{.App.Version}} "{{.App.Author}}" +.SH "NAME" +{{.App.Name}} +.SH "SYNOPSIS" +.TP +\fB{{.App.Name}}{{template "FormatUsage" .App}} +.SH "DESCRIPTION" +{{.App.Help}} +.SH "OPTIONS" +{{template "FormatFlags" .App}}\ +{{if .App.Commands}}\ +.SH "COMMANDS" +{{template "FormatCommands" .App}}\ +{{end}}\ +` + +// Default usage template. +var LongHelpTemplate = `{{define "FormatCommand"}}\ +{{if .FlagSummary}} {{.FlagSummary}}{{end}}\ +{{range .Args}} {{if not .Required}}[{{end}}<{{.Name}}>{{if .Value|IsCumulative}}...{{end}}{{if not .Required}}]{{end}}{{end}}\ +{{end}}\ + +{{define "FormatCommands"}}\ +{{range .FlattenedCommands}}\ +{{if not .Hidden}}\ + {{.FullCommand}}{{template "FormatCommand" .}} +{{.Help|Wrap 4}} +{{with .Flags|FlagsToTwoColumns}}{{FormatTwoColumnsWithIndent . 4 2}}{{end}} +{{end}}\ +{{end}}\ +{{end}}\ + +{{define "FormatUsage"}}\ +{{template "FormatCommand" .}}{{if .Commands}} [ ...]{{end}} +{{if .Help}} +{{.Help|Wrap 0}}\ +{{end}}\ + +{{end}}\ + +usage: {{.App.Name}}{{template "FormatUsage" .App}} +{{if .Context.Flags}}\ +Flags: +{{.Context.Flags|FlagsToTwoColumns|FormatTwoColumns}} +{{end}}\ +{{if .Context.Args}}\ +Args: +{{.Context.Args|ArgsToTwoColumns|FormatTwoColumns}} +{{end}}\ +{{if .App.Commands}}\ +Commands: +{{template "FormatCommands" .App}} +{{end}}\ +` + +var BashCompletionTemplate = ` +_{{.App.Name}}_bash_autocomplete() { + local cur prev opts base + COMPREPLY=() + cur="${COMP_WORDS[COMP_CWORD]}" + opts=$( ${COMP_WORDS[0]} --completion-bash ${COMP_WORDS[@]:1:$COMP_CWORD} ) + COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) + return 0 +} +complete -F _{{.App.Name}}_bash_autocomplete {{.App.Name}} + +` + +var ZshCompletionTemplate = ` +#compdef {{.App.Name}} +autoload -U compinit && compinit +autoload -U bashcompinit && bashcompinit + +_{{.App.Name}}_bash_autocomplete() { + local cur prev opts base + COMPREPLY=() + cur="${COMP_WORDS[COMP_CWORD]}" + opts=$( ${COMP_WORDS[0]} --completion-bash ${COMP_WORDS[@]:1:$COMP_CWORD} ) + COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) + return 0 +} +complete -F _{{.App.Name}}_bash_autocomplete {{.App.Name}} +` diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/usage.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/usage.go new file mode 100644 index 0000000..44af6f6 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/usage.go @@ -0,0 +1,211 @@ +package kingpin + +import ( + "bytes" + "fmt" + "go/doc" + "io" + "strings" + + "github.com/alecthomas/template" +) + +var ( + preIndent = " " +) + +func formatTwoColumns(w io.Writer, indent, padding, width int, rows [][2]string) { + // Find size of first column. + s := 0 + for _, row := range rows { + if c := len(row[0]); c > s && c < 30 { + s = c + } + } + + indentStr := strings.Repeat(" ", indent) + offsetStr := strings.Repeat(" ", s+padding) + + for _, row := range rows { + buf := bytes.NewBuffer(nil) + doc.ToText(buf, row[1], "", preIndent, width-s-padding-indent) + lines := strings.Split(strings.TrimRight(buf.String(), "\n"), "\n") + fmt.Fprintf(w, "%s%-*s%*s", indentStr, s, row[0], padding, "") + if len(row[0]) >= 30 { + fmt.Fprintf(w, "\n%s%s", indentStr, offsetStr) + } + fmt.Fprintf(w, "%s\n", lines[0]) + for _, line := range lines[1:] { + fmt.Fprintf(w, "%s%s%s\n", indentStr, offsetStr, line) + } + } +} + +// Usage writes application usage to w. It parses args to determine +// appropriate help context, such as which command to show help for. +func (a *Application) Usage(args []string) { + context, err := a.parseContext(true, args) + a.FatalIfError(err, "") + if err := a.UsageForContextWithTemplate(context, 2, a.usageTemplate); err != nil { + panic(err) + } +} + +func formatAppUsage(app *ApplicationModel) string { + s := []string{app.Name} + if len(app.Flags) > 0 { + s = append(s, app.FlagSummary()) + } + if len(app.Args) > 0 { + s = append(s, app.ArgSummary()) + } + return strings.Join(s, " ") +} + +func formatCmdUsage(app *ApplicationModel, cmd *CmdModel) string { + s := []string{app.Name, cmd.String()} + if len(app.Flags) > 0 { + s = append(s, app.FlagSummary()) + } + if len(app.Args) > 0 { + s = append(s, app.ArgSummary()) + } + return strings.Join(s, " ") +} + +func formatFlag(haveShort bool, flag *FlagModel) string { + flagString := "" + if flag.Short != 0 { + flagString += fmt.Sprintf("-%c, --%s", flag.Short, flag.Name) + } else { + if haveShort { + flagString += fmt.Sprintf(" --%s", flag.Name) + } else { + flagString += fmt.Sprintf("--%s", flag.Name) + } + } + if !flag.IsBoolFlag() { + flagString += fmt.Sprintf("=%s", flag.FormatPlaceHolder()) + } + if v, ok := flag.Value.(repeatableFlag); ok && v.IsCumulative() { + flagString += " ..." + } + return flagString +} + +type templateParseContext struct { + SelectedCommand *CmdModel + *FlagGroupModel + *ArgGroupModel +} + +type templateContext struct { + App *ApplicationModel + Width int + Context *templateParseContext +} + +// UsageForContext displays usage information from a ParseContext (obtained from +// Application.ParseContext() or Action(f) callbacks). +func (a *Application) UsageForContext(context *ParseContext) error { + return a.UsageForContextWithTemplate(context, 2, a.usageTemplate) +} + +// UsageForContextWithTemplate is the base usage function. You generally don't need to use this. +func (a *Application) UsageForContextWithTemplate(context *ParseContext, indent int, tmpl string) error { + width := guessWidth(a.usageWriter) + funcs := template.FuncMap{ + "Indent": func(level int) string { + return strings.Repeat(" ", level*indent) + }, + "Wrap": func(indent int, s string) string { + buf := bytes.NewBuffer(nil) + indentText := strings.Repeat(" ", indent) + doc.ToText(buf, s, indentText, " "+indentText, width-indent) + return buf.String() + }, + "FormatFlag": formatFlag, + "FlagsToTwoColumns": func(f []*FlagModel) [][2]string { + rows := [][2]string{} + haveShort := false + for _, flag := range f { + if flag.Short != 0 { + haveShort = true + break + } + } + for _, flag := range f { + if !flag.Hidden { + rows = append(rows, [2]string{formatFlag(haveShort, flag), flag.Help}) + } + } + return rows + }, + "RequiredFlags": func(f []*FlagModel) []*FlagModel { + requiredFlags := []*FlagModel{} + for _, flag := range f { + if flag.Required { + requiredFlags = append(requiredFlags, flag) + } + } + return requiredFlags + }, + "OptionalFlags": func(f []*FlagModel) []*FlagModel { + optionalFlags := []*FlagModel{} + for _, flag := range f { + if !flag.Required { + optionalFlags = append(optionalFlags, flag) + } + } + return optionalFlags + }, + "ArgsToTwoColumns": func(a []*ArgModel) [][2]string { + rows := [][2]string{} + for _, arg := range a { + s := "<" + arg.Name + ">" + if !arg.Required { + s = "[" + s + "]" + } + rows = append(rows, [2]string{s, arg.Help}) + } + return rows + }, + "FormatTwoColumns": func(rows [][2]string) string { + buf := bytes.NewBuffer(nil) + formatTwoColumns(buf, indent, indent, width, rows) + return buf.String() + }, + "FormatTwoColumnsWithIndent": func(rows [][2]string, indent, padding int) string { + buf := bytes.NewBuffer(nil) + formatTwoColumns(buf, indent, padding, width, rows) + return buf.String() + }, + "FormatAppUsage": formatAppUsage, + "FormatCommandUsage": formatCmdUsage, + "IsCumulative": func(value Value) bool { + r, ok := value.(remainderArg) + return ok && r.IsCumulative() + }, + "Char": func(c rune) string { + return string(c) + }, + } + t, err := template.New("usage").Funcs(funcs).Parse(tmpl) + if err != nil { + return err + } + var selectedCommand *CmdModel + if context.SelectedCommand != nil { + selectedCommand = context.SelectedCommand.Model() + } + ctx := templateContext{ + App: a.Model(), + Width: width, + Context: &templateParseContext{ + SelectedCommand: selectedCommand, + FlagGroupModel: context.flags.Model(), + ArgGroupModel: context.arguments.Model(), + }, + } + return t.Execute(a.usageWriter, ctx) +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/usage_test.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/usage_test.go new file mode 100644 index 0000000..441b90c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/usage_test.go @@ -0,0 +1,65 @@ +package kingpin + +import ( + "bytes" + "strings" + "testing" + + "github.com/alecthomas/assert" +) + +func TestFormatTwoColumns(t *testing.T) { + buf := bytes.NewBuffer(nil) + formatTwoColumns(buf, 2, 2, 20, [][2]string{ + {"--hello", "Hello world help with something that is cool."}, + }) + expected := ` --hello Hello + world + help with + something + that is + cool. +` + assert.Equal(t, expected, buf.String()) +} + +func TestFormatTwoColumnsWide(t *testing.T) { + samples := [][2]string{ + {strings.Repeat("x", 29), "29 chars"}, + {strings.Repeat("x", 30), "30 chars"}} + buf := bytes.NewBuffer(nil) + formatTwoColumns(buf, 0, 0, 200, samples) + expected := `xxxxxxxxxxxxxxxxxxxxxxxxxxxxx29 chars +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + 30 chars +` + assert.Equal(t, expected, buf.String()) +} + +func TestHiddenCommand(t *testing.T) { + templates := []struct{ name, template string }{ + {"default", DefaultUsageTemplate}, + {"Compact", CompactUsageTemplate}, + {"Long", LongHelpTemplate}, + {"Man", ManPageTemplate}, + } + + var buf bytes.Buffer + t.Log("1") + + a := New("test", "Test").Writer(&buf).Terminate(nil) + a.Command("visible", "visible") + a.Command("hidden", "hidden").Hidden() + + for _, tp := range templates { + buf.Reset() + a.UsageTemplate(tp.template) + a.Parse(nil) + // a.Parse([]string{"--help"}) + usage := buf.String() + t.Logf("Usage for %s is:\n%s\n", tp.name, usage) + + assert.NotContains(t, usage, "hidden") + assert.Contains(t, usage, "visible") + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/values.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/values.go new file mode 100644 index 0000000..7ee9a3b --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/values.go @@ -0,0 +1,470 @@ +package kingpin + +//go:generate go run ./cmd/genvalues/main.go + +import ( + "fmt" + "net" + "net/url" + "os" + "reflect" + "regexp" + "strings" + "time" + + "github.com/alecthomas/units" +) + +// NOTE: Most of the base type values were lifted from: +// http://golang.org/src/pkg/flag/flag.go?s=20146:20222 + +// Value is the interface to the dynamic value stored in a flag. +// (The default value is represented as a string.) +// +// If a Value has an IsBoolFlag() bool method returning true, the command-line +// parser makes --name equivalent to -name=true rather than using the next +// command-line argument, and adds a --no-name counterpart for negating the +// flag. +type Value interface { + String() string + Set(string) error +} + +// Getter is an interface that allows the contents of a Value to be retrieved. +// It wraps the Value interface, rather than being part of it, because it +// appeared after Go 1 and its compatibility rules. All Value types provided +// by this package satisfy the Getter interface. +type Getter interface { + Value + Get() interface{} +} + +// Optional interface to indicate boolean flags that don't accept a value, and +// implicitly have a --no- negation counterpart. +type boolFlag interface { + Value + IsBoolFlag() bool +} + +// Optional interface for arguments that cumulatively consume all remaining +// input. +type remainderArg interface { + Value + IsCumulative() bool +} + +// Optional interface for flags that can be repeated. +type repeatableFlag interface { + Value + IsCumulative() bool +} + +type accumulator struct { + element func(value interface{}) Value + typ reflect.Type + slice reflect.Value +} + +// Use reflection to accumulate values into a slice. +// +// target := []string{} +// newAccumulator(&target, func (value interface{}) Value { +// return newStringValue(value.(*string)) +// }) +func newAccumulator(slice interface{}, element func(value interface{}) Value) *accumulator { + typ := reflect.TypeOf(slice) + if typ.Kind() != reflect.Ptr || typ.Elem().Kind() != reflect.Slice { + panic("expected a pointer to a slice") + } + return &accumulator{ + element: element, + typ: typ.Elem().Elem(), + slice: reflect.ValueOf(slice), + } +} + +func (a *accumulator) String() string { + out := []string{} + s := a.slice.Elem() + for i := 0; i < s.Len(); i++ { + out = append(out, a.element(s.Index(i).Addr().Interface()).String()) + } + return strings.Join(out, ",") +} + +func (a *accumulator) Set(value string) error { + e := reflect.New(a.typ) + if err := a.element(e.Interface()).Set(value); err != nil { + return err + } + slice := reflect.Append(a.slice.Elem(), e.Elem()) + a.slice.Elem().Set(slice) + return nil +} + +func (a *accumulator) Get() interface{} { + return a.slice.Interface() +} + +func (a *accumulator) IsCumulative() bool { + return true +} + +func (b *boolValue) IsBoolFlag() bool { return true } + +// -- time.Duration Value +type durationValue time.Duration + +func newDurationValue(p *time.Duration) *durationValue { + return (*durationValue)(p) +} + +func (d *durationValue) Set(s string) error { + v, err := time.ParseDuration(s) + *d = durationValue(v) + return err +} + +func (d *durationValue) Get() interface{} { return time.Duration(*d) } + +func (d *durationValue) String() string { return (*time.Duration)(d).String() } + +// -- map[string]string Value +type stringMapValue map[string]string + +func newStringMapValue(p *map[string]string) *stringMapValue { + return (*stringMapValue)(p) +} + +var stringMapRegex = regexp.MustCompile("[:=]") + +func (s *stringMapValue) Set(value string) error { + parts := stringMapRegex.Split(value, 2) + if len(parts) != 2 { + return fmt.Errorf("expected KEY=VALUE got '%s'", value) + } + (*s)[parts[0]] = parts[1] + return nil +} + +func (s *stringMapValue) Get() interface{} { + return (map[string]string)(*s) +} + +func (s *stringMapValue) String() string { + return fmt.Sprintf("%s", map[string]string(*s)) +} + +func (s *stringMapValue) IsCumulative() bool { + return true +} + +// -- net.IP Value +type ipValue net.IP + +func newIPValue(p *net.IP) *ipValue { + return (*ipValue)(p) +} + +func (i *ipValue) Set(value string) error { + if ip := net.ParseIP(value); ip == nil { + return fmt.Errorf("'%s' is not an IP address", value) + } else { + *i = *(*ipValue)(&ip) + return nil + } +} + +func (i *ipValue) Get() interface{} { + return (net.IP)(*i) +} + +func (i *ipValue) String() string { + return (*net.IP)(i).String() +} + +// -- *net.TCPAddr Value +type tcpAddrValue struct { + addr **net.TCPAddr +} + +func newTCPAddrValue(p **net.TCPAddr) *tcpAddrValue { + return &tcpAddrValue{p} +} + +func (i *tcpAddrValue) Set(value string) error { + if addr, err := net.ResolveTCPAddr("tcp", value); err != nil { + return fmt.Errorf("'%s' is not a valid TCP address: %s", value, err) + } else { + *i.addr = addr + return nil + } +} + +func (t *tcpAddrValue) Get() interface{} { + return (*net.TCPAddr)(*t.addr) +} + +func (i *tcpAddrValue) String() string { + return (*i.addr).String() +} + +// -- existingFile Value + +type fileStatValue struct { + path *string + predicate func(os.FileInfo) error +} + +func newFileStatValue(p *string, predicate func(os.FileInfo) error) *fileStatValue { + return &fileStatValue{ + path: p, + predicate: predicate, + } +} + +func (e *fileStatValue) Set(value string) error { + if s, err := os.Stat(value); os.IsNotExist(err) { + return fmt.Errorf("path '%s' does not exist", value) + } else if err != nil { + return err + } else if err := e.predicate(s); err != nil { + return err + } + *e.path = value + return nil +} + +func (f *fileStatValue) Get() interface{} { + return (string)(*f.path) +} + +func (e *fileStatValue) String() string { + return *e.path +} + +// -- os.File value + +type fileValue struct { + f **os.File + flag int + perm os.FileMode +} + +func newFileValue(p **os.File, flag int, perm os.FileMode) *fileValue { + return &fileValue{p, flag, perm} +} + +func (f *fileValue) Set(value string) error { + if fd, err := os.OpenFile(value, f.flag, f.perm); err != nil { + return err + } else { + *f.f = fd + return nil + } +} + +func (f *fileValue) Get() interface{} { + return (*os.File)(*f.f) +} + +func (f *fileValue) String() string { + if *f.f == nil { + return "" + } + return (*f.f).Name() +} + +// -- url.URL Value +type urlValue struct { + u **url.URL +} + +func newURLValue(p **url.URL) *urlValue { + return &urlValue{p} +} + +func (u *urlValue) Set(value string) error { + if url, err := url.Parse(value); err != nil { + return fmt.Errorf("invalid URL: %s", err) + } else { + *u.u = url + return nil + } +} + +func (u *urlValue) Get() interface{} { + return (*url.URL)(*u.u) +} + +func (u *urlValue) String() string { + if *u.u == nil { + return "" + } + return (*u.u).String() +} + +// -- []*url.URL Value +type urlListValue []*url.URL + +func newURLListValue(p *[]*url.URL) *urlListValue { + return (*urlListValue)(p) +} + +func (u *urlListValue) Set(value string) error { + if url, err := url.Parse(value); err != nil { + return fmt.Errorf("invalid URL: %s", err) + } else { + *u = append(*u, url) + return nil + } +} + +func (u *urlListValue) Get() interface{} { + return ([]*url.URL)(*u) +} + +func (u *urlListValue) String() string { + out := []string{} + for _, url := range *u { + out = append(out, url.String()) + } + return strings.Join(out, ",") +} + +func (u *urlListValue) IsCumulative() bool { + return true +} + +// A flag whose value must be in a set of options. +type enumValue struct { + value *string + options []string +} + +func newEnumFlag(target *string, options ...string) *enumValue { + return &enumValue{ + value: target, + options: options, + } +} + +func (a *enumValue) String() string { + return *a.value +} + +func (a *enumValue) Set(value string) error { + for _, v := range a.options { + if v == value { + *a.value = value + return nil + } + } + return fmt.Errorf("enum value must be one of %s, got '%s'", strings.Join(a.options, ","), value) +} + +func (e *enumValue) Get() interface{} { + return (string)(*e.value) +} + +// -- []string Enum Value +type enumsValue struct { + value *[]string + options []string +} + +func newEnumsFlag(target *[]string, options ...string) *enumsValue { + return &enumsValue{ + value: target, + options: options, + } +} + +func (s *enumsValue) Set(value string) error { + for _, v := range s.options { + if v == value { + *s.value = append(*s.value, value) + return nil + } + } + return fmt.Errorf("enum value must be one of %s, got '%s'", strings.Join(s.options, ","), value) +} + +func (e *enumsValue) Get() interface{} { + return ([]string)(*e.value) +} + +func (s *enumsValue) String() string { + return strings.Join(*s.value, ",") +} + +func (s *enumsValue) IsCumulative() bool { + return true +} + +// -- units.Base2Bytes Value +type bytesValue units.Base2Bytes + +func newBytesValue(p *units.Base2Bytes) *bytesValue { + return (*bytesValue)(p) +} + +func (d *bytesValue) Set(s string) error { + v, err := units.ParseBase2Bytes(s) + *d = bytesValue(v) + return err +} + +func (d *bytesValue) Get() interface{} { return units.Base2Bytes(*d) } + +func (d *bytesValue) String() string { return (*units.Base2Bytes)(d).String() } + +func newExistingFileValue(target *string) *fileStatValue { + return newFileStatValue(target, func(s os.FileInfo) error { + if s.IsDir() { + return fmt.Errorf("'%s' is a directory", s.Name()) + } + return nil + }) +} + +func newExistingDirValue(target *string) *fileStatValue { + return newFileStatValue(target, func(s os.FileInfo) error { + if !s.IsDir() { + return fmt.Errorf("'%s' is a file", s.Name()) + } + return nil + }) +} + +func newExistingFileOrDirValue(target *string) *fileStatValue { + return newFileStatValue(target, func(s os.FileInfo) error { return nil }) +} + +type counterValue int + +func newCounterValue(n *int) *counterValue { + return (*counterValue)(n) +} + +func (c *counterValue) Set(s string) error { + *c++ + return nil +} + +func (c *counterValue) Get() interface{} { return (int)(*c) } +func (c *counterValue) IsBoolFlag() bool { return true } +func (c *counterValue) String() string { return fmt.Sprintf("%d", *c) } +func (c *counterValue) IsCumulative() bool { return true } + +func resolveHost(value string) (net.IP, error) { + if ip := net.ParseIP(value); ip != nil { + return ip, nil + } else { + if addr, err := net.ResolveIPAddr("ip", value); err != nil { + return nil, err + } else { + return addr.IP, nil + } + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/values.json b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/values.json new file mode 100644 index 0000000..23c6744 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/values.json @@ -0,0 +1,25 @@ +[ + {"type": "bool", "parser": "strconv.ParseBool(s)"}, + {"type": "string", "parser": "s, error(nil)", "format": "string(*f.v)", "plural": "Strings"}, + {"type": "uint", "parser": "strconv.ParseUint(s, 0, 64)", "plural": "Uints"}, + {"type": "uint8", "parser": "strconv.ParseUint(s, 0, 8)"}, + {"type": "uint16", "parser": "strconv.ParseUint(s, 0, 16)"}, + {"type": "uint32", "parser": "strconv.ParseUint(s, 0, 32)"}, + {"type": "uint64", "parser": "strconv.ParseUint(s, 0, 64)"}, + {"type": "int", "parser": "strconv.ParseFloat(s, 64)", "plural": "Ints"}, + {"type": "int8", "parser": "strconv.ParseInt(s, 0, 8)"}, + {"type": "int16", "parser": "strconv.ParseInt(s, 0, 16)"}, + {"type": "int32", "parser": "strconv.ParseInt(s, 0, 32)"}, + {"type": "int64", "parser": "strconv.ParseInt(s, 0, 64)"}, + {"type": "float64", "parser": "strconv.ParseFloat(s, 64)"}, + {"type": "float32", "parser": "strconv.ParseFloat(s, 32)"}, + {"name": "Duration", "type": "time.Duration", "no_value_parser": true}, + {"name": "IP", "type": "net.IP", "no_value_parser": true}, + {"name": "TCPAddr", "Type": "*net.TCPAddr", "plural": "TCPList", "no_value_parser": true}, + {"name": "ExistingFile", "Type": "string", "plural": "ExistingFiles", "no_value_parser": true}, + {"name": "ExistingDir", "Type": "string", "plural": "ExistingDirs", "no_value_parser": true}, + {"name": "ExistingFileOrDir", "Type": "string", "plural": "ExistingFilesOrDirs", "no_value_parser": true}, + {"name": "Regexp", "Type": "*regexp.Regexp", "parser": "regexp.Compile(s)"}, + {"name": "ResolvedIP", "Type": "net.IP", "parser": "resolveHost(s)", "help": "Resolve a hostname or IP to an IP."}, + {"name": "HexBytes", "Type": "[]byte", "parser": "hex.DecodeString(s)", "help": "Bytes as a hex string."} +] diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/values_generated.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/values_generated.go new file mode 100644 index 0000000..8d492bf --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/values_generated.go @@ -0,0 +1,821 @@ +package kingpin + +import ( + "encoding/hex" + "fmt" + "net" + "regexp" + "strconv" + "time" +) + +// This file is autogenerated by "go generate .". Do not modify. + +// -- bool Value +type boolValue struct{ v *bool } + +func newBoolValue(p *bool) *boolValue { + return &boolValue{p} +} + +func (f *boolValue) Set(s string) error { + v, err := strconv.ParseBool(s) + if err == nil { + *f.v = (bool)(v) + } + return err +} + +func (f *boolValue) Get() interface{} { return (bool)(*f.v) } + +func (f *boolValue) String() string { return fmt.Sprintf("%v", *f.v) } + +// Bool parses the next command-line value as bool. +func (p *parserMixin) Bool() (target *bool) { + target = new(bool) + p.BoolVar(target) + return +} + +func (p *parserMixin) BoolVar(target *bool) { + p.SetValue(newBoolValue(target)) +} + +// BoolList accumulates bool values into a slice. +func (p *parserMixin) BoolList() (target *[]bool) { + target = new([]bool) + p.BoolListVar(target) + return +} + +func (p *parserMixin) BoolListVar(target *[]bool) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newBoolValue(v.(*bool)) + })) +} + +// -- string Value +type stringValue struct{ v *string } + +func newStringValue(p *string) *stringValue { + return &stringValue{p} +} + +func (f *stringValue) Set(s string) error { + v, err := s, error(nil) + if err == nil { + *f.v = (string)(v) + } + return err +} + +func (f *stringValue) Get() interface{} { return (string)(*f.v) } + +func (f *stringValue) String() string { return string(*f.v) } + +// String parses the next command-line value as string. +func (p *parserMixin) String() (target *string) { + target = new(string) + p.StringVar(target) + return +} + +func (p *parserMixin) StringVar(target *string) { + p.SetValue(newStringValue(target)) +} + +// Strings accumulates string values into a slice. +func (p *parserMixin) Strings() (target *[]string) { + target = new([]string) + p.StringsVar(target) + return +} + +func (p *parserMixin) StringsVar(target *[]string) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newStringValue(v.(*string)) + })) +} + +// -- uint Value +type uintValue struct{ v *uint } + +func newUintValue(p *uint) *uintValue { + return &uintValue{p} +} + +func (f *uintValue) Set(s string) error { + v, err := strconv.ParseUint(s, 0, 64) + if err == nil { + *f.v = (uint)(v) + } + return err +} + +func (f *uintValue) Get() interface{} { return (uint)(*f.v) } + +func (f *uintValue) String() string { return fmt.Sprintf("%v", *f.v) } + +// Uint parses the next command-line value as uint. +func (p *parserMixin) Uint() (target *uint) { + target = new(uint) + p.UintVar(target) + return +} + +func (p *parserMixin) UintVar(target *uint) { + p.SetValue(newUintValue(target)) +} + +// Uints accumulates uint values into a slice. +func (p *parserMixin) Uints() (target *[]uint) { + target = new([]uint) + p.UintsVar(target) + return +} + +func (p *parserMixin) UintsVar(target *[]uint) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newUintValue(v.(*uint)) + })) +} + +// -- uint8 Value +type uint8Value struct{ v *uint8 } + +func newUint8Value(p *uint8) *uint8Value { + return &uint8Value{p} +} + +func (f *uint8Value) Set(s string) error { + v, err := strconv.ParseUint(s, 0, 8) + if err == nil { + *f.v = (uint8)(v) + } + return err +} + +func (f *uint8Value) Get() interface{} { return (uint8)(*f.v) } + +func (f *uint8Value) String() string { return fmt.Sprintf("%v", *f.v) } + +// Uint8 parses the next command-line value as uint8. +func (p *parserMixin) Uint8() (target *uint8) { + target = new(uint8) + p.Uint8Var(target) + return +} + +func (p *parserMixin) Uint8Var(target *uint8) { + p.SetValue(newUint8Value(target)) +} + +// Uint8List accumulates uint8 values into a slice. +func (p *parserMixin) Uint8List() (target *[]uint8) { + target = new([]uint8) + p.Uint8ListVar(target) + return +} + +func (p *parserMixin) Uint8ListVar(target *[]uint8) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newUint8Value(v.(*uint8)) + })) +} + +// -- uint16 Value +type uint16Value struct{ v *uint16 } + +func newUint16Value(p *uint16) *uint16Value { + return &uint16Value{p} +} + +func (f *uint16Value) Set(s string) error { + v, err := strconv.ParseUint(s, 0, 16) + if err == nil { + *f.v = (uint16)(v) + } + return err +} + +func (f *uint16Value) Get() interface{} { return (uint16)(*f.v) } + +func (f *uint16Value) String() string { return fmt.Sprintf("%v", *f.v) } + +// Uint16 parses the next command-line value as uint16. +func (p *parserMixin) Uint16() (target *uint16) { + target = new(uint16) + p.Uint16Var(target) + return +} + +func (p *parserMixin) Uint16Var(target *uint16) { + p.SetValue(newUint16Value(target)) +} + +// Uint16List accumulates uint16 values into a slice. +func (p *parserMixin) Uint16List() (target *[]uint16) { + target = new([]uint16) + p.Uint16ListVar(target) + return +} + +func (p *parserMixin) Uint16ListVar(target *[]uint16) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newUint16Value(v.(*uint16)) + })) +} + +// -- uint32 Value +type uint32Value struct{ v *uint32 } + +func newUint32Value(p *uint32) *uint32Value { + return &uint32Value{p} +} + +func (f *uint32Value) Set(s string) error { + v, err := strconv.ParseUint(s, 0, 32) + if err == nil { + *f.v = (uint32)(v) + } + return err +} + +func (f *uint32Value) Get() interface{} { return (uint32)(*f.v) } + +func (f *uint32Value) String() string { return fmt.Sprintf("%v", *f.v) } + +// Uint32 parses the next command-line value as uint32. +func (p *parserMixin) Uint32() (target *uint32) { + target = new(uint32) + p.Uint32Var(target) + return +} + +func (p *parserMixin) Uint32Var(target *uint32) { + p.SetValue(newUint32Value(target)) +} + +// Uint32List accumulates uint32 values into a slice. +func (p *parserMixin) Uint32List() (target *[]uint32) { + target = new([]uint32) + p.Uint32ListVar(target) + return +} + +func (p *parserMixin) Uint32ListVar(target *[]uint32) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newUint32Value(v.(*uint32)) + })) +} + +// -- uint64 Value +type uint64Value struct{ v *uint64 } + +func newUint64Value(p *uint64) *uint64Value { + return &uint64Value{p} +} + +func (f *uint64Value) Set(s string) error { + v, err := strconv.ParseUint(s, 0, 64) + if err == nil { + *f.v = (uint64)(v) + } + return err +} + +func (f *uint64Value) Get() interface{} { return (uint64)(*f.v) } + +func (f *uint64Value) String() string { return fmt.Sprintf("%v", *f.v) } + +// Uint64 parses the next command-line value as uint64. +func (p *parserMixin) Uint64() (target *uint64) { + target = new(uint64) + p.Uint64Var(target) + return +} + +func (p *parserMixin) Uint64Var(target *uint64) { + p.SetValue(newUint64Value(target)) +} + +// Uint64List accumulates uint64 values into a slice. +func (p *parserMixin) Uint64List() (target *[]uint64) { + target = new([]uint64) + p.Uint64ListVar(target) + return +} + +func (p *parserMixin) Uint64ListVar(target *[]uint64) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newUint64Value(v.(*uint64)) + })) +} + +// -- int Value +type intValue struct{ v *int } + +func newIntValue(p *int) *intValue { + return &intValue{p} +} + +func (f *intValue) Set(s string) error { + v, err := strconv.ParseFloat(s, 64) + if err == nil { + *f.v = (int)(v) + } + return err +} + +func (f *intValue) Get() interface{} { return (int)(*f.v) } + +func (f *intValue) String() string { return fmt.Sprintf("%v", *f.v) } + +// Int parses the next command-line value as int. +func (p *parserMixin) Int() (target *int) { + target = new(int) + p.IntVar(target) + return +} + +func (p *parserMixin) IntVar(target *int) { + p.SetValue(newIntValue(target)) +} + +// Ints accumulates int values into a slice. +func (p *parserMixin) Ints() (target *[]int) { + target = new([]int) + p.IntsVar(target) + return +} + +func (p *parserMixin) IntsVar(target *[]int) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newIntValue(v.(*int)) + })) +} + +// -- int8 Value +type int8Value struct{ v *int8 } + +func newInt8Value(p *int8) *int8Value { + return &int8Value{p} +} + +func (f *int8Value) Set(s string) error { + v, err := strconv.ParseInt(s, 0, 8) + if err == nil { + *f.v = (int8)(v) + } + return err +} + +func (f *int8Value) Get() interface{} { return (int8)(*f.v) } + +func (f *int8Value) String() string { return fmt.Sprintf("%v", *f.v) } + +// Int8 parses the next command-line value as int8. +func (p *parserMixin) Int8() (target *int8) { + target = new(int8) + p.Int8Var(target) + return +} + +func (p *parserMixin) Int8Var(target *int8) { + p.SetValue(newInt8Value(target)) +} + +// Int8List accumulates int8 values into a slice. +func (p *parserMixin) Int8List() (target *[]int8) { + target = new([]int8) + p.Int8ListVar(target) + return +} + +func (p *parserMixin) Int8ListVar(target *[]int8) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newInt8Value(v.(*int8)) + })) +} + +// -- int16 Value +type int16Value struct{ v *int16 } + +func newInt16Value(p *int16) *int16Value { + return &int16Value{p} +} + +func (f *int16Value) Set(s string) error { + v, err := strconv.ParseInt(s, 0, 16) + if err == nil { + *f.v = (int16)(v) + } + return err +} + +func (f *int16Value) Get() interface{} { return (int16)(*f.v) } + +func (f *int16Value) String() string { return fmt.Sprintf("%v", *f.v) } + +// Int16 parses the next command-line value as int16. +func (p *parserMixin) Int16() (target *int16) { + target = new(int16) + p.Int16Var(target) + return +} + +func (p *parserMixin) Int16Var(target *int16) { + p.SetValue(newInt16Value(target)) +} + +// Int16List accumulates int16 values into a slice. +func (p *parserMixin) Int16List() (target *[]int16) { + target = new([]int16) + p.Int16ListVar(target) + return +} + +func (p *parserMixin) Int16ListVar(target *[]int16) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newInt16Value(v.(*int16)) + })) +} + +// -- int32 Value +type int32Value struct{ v *int32 } + +func newInt32Value(p *int32) *int32Value { + return &int32Value{p} +} + +func (f *int32Value) Set(s string) error { + v, err := strconv.ParseInt(s, 0, 32) + if err == nil { + *f.v = (int32)(v) + } + return err +} + +func (f *int32Value) Get() interface{} { return (int32)(*f.v) } + +func (f *int32Value) String() string { return fmt.Sprintf("%v", *f.v) } + +// Int32 parses the next command-line value as int32. +func (p *parserMixin) Int32() (target *int32) { + target = new(int32) + p.Int32Var(target) + return +} + +func (p *parserMixin) Int32Var(target *int32) { + p.SetValue(newInt32Value(target)) +} + +// Int32List accumulates int32 values into a slice. +func (p *parserMixin) Int32List() (target *[]int32) { + target = new([]int32) + p.Int32ListVar(target) + return +} + +func (p *parserMixin) Int32ListVar(target *[]int32) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newInt32Value(v.(*int32)) + })) +} + +// -- int64 Value +type int64Value struct{ v *int64 } + +func newInt64Value(p *int64) *int64Value { + return &int64Value{p} +} + +func (f *int64Value) Set(s string) error { + v, err := strconv.ParseInt(s, 0, 64) + if err == nil { + *f.v = (int64)(v) + } + return err +} + +func (f *int64Value) Get() interface{} { return (int64)(*f.v) } + +func (f *int64Value) String() string { return fmt.Sprintf("%v", *f.v) } + +// Int64 parses the next command-line value as int64. +func (p *parserMixin) Int64() (target *int64) { + target = new(int64) + p.Int64Var(target) + return +} + +func (p *parserMixin) Int64Var(target *int64) { + p.SetValue(newInt64Value(target)) +} + +// Int64List accumulates int64 values into a slice. +func (p *parserMixin) Int64List() (target *[]int64) { + target = new([]int64) + p.Int64ListVar(target) + return +} + +func (p *parserMixin) Int64ListVar(target *[]int64) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newInt64Value(v.(*int64)) + })) +} + +// -- float64 Value +type float64Value struct{ v *float64 } + +func newFloat64Value(p *float64) *float64Value { + return &float64Value{p} +} + +func (f *float64Value) Set(s string) error { + v, err := strconv.ParseFloat(s, 64) + if err == nil { + *f.v = (float64)(v) + } + return err +} + +func (f *float64Value) Get() interface{} { return (float64)(*f.v) } + +func (f *float64Value) String() string { return fmt.Sprintf("%v", *f.v) } + +// Float64 parses the next command-line value as float64. +func (p *parserMixin) Float64() (target *float64) { + target = new(float64) + p.Float64Var(target) + return +} + +func (p *parserMixin) Float64Var(target *float64) { + p.SetValue(newFloat64Value(target)) +} + +// Float64List accumulates float64 values into a slice. +func (p *parserMixin) Float64List() (target *[]float64) { + target = new([]float64) + p.Float64ListVar(target) + return +} + +func (p *parserMixin) Float64ListVar(target *[]float64) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newFloat64Value(v.(*float64)) + })) +} + +// -- float32 Value +type float32Value struct{ v *float32 } + +func newFloat32Value(p *float32) *float32Value { + return &float32Value{p} +} + +func (f *float32Value) Set(s string) error { + v, err := strconv.ParseFloat(s, 32) + if err == nil { + *f.v = (float32)(v) + } + return err +} + +func (f *float32Value) Get() interface{} { return (float32)(*f.v) } + +func (f *float32Value) String() string { return fmt.Sprintf("%v", *f.v) } + +// Float32 parses the next command-line value as float32. +func (p *parserMixin) Float32() (target *float32) { + target = new(float32) + p.Float32Var(target) + return +} + +func (p *parserMixin) Float32Var(target *float32) { + p.SetValue(newFloat32Value(target)) +} + +// Float32List accumulates float32 values into a slice. +func (p *parserMixin) Float32List() (target *[]float32) { + target = new([]float32) + p.Float32ListVar(target) + return +} + +func (p *parserMixin) Float32ListVar(target *[]float32) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newFloat32Value(v.(*float32)) + })) +} + +// DurationList accumulates time.Duration values into a slice. +func (p *parserMixin) DurationList() (target *[]time.Duration) { + target = new([]time.Duration) + p.DurationListVar(target) + return +} + +func (p *parserMixin) DurationListVar(target *[]time.Duration) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newDurationValue(v.(*time.Duration)) + })) +} + +// IPList accumulates net.IP values into a slice. +func (p *parserMixin) IPList() (target *[]net.IP) { + target = new([]net.IP) + p.IPListVar(target) + return +} + +func (p *parserMixin) IPListVar(target *[]net.IP) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newIPValue(v.(*net.IP)) + })) +} + +// TCPList accumulates *net.TCPAddr values into a slice. +func (p *parserMixin) TCPList() (target *[]*net.TCPAddr) { + target = new([]*net.TCPAddr) + p.TCPListVar(target) + return +} + +func (p *parserMixin) TCPListVar(target *[]*net.TCPAddr) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newTCPAddrValue(v.(**net.TCPAddr)) + })) +} + +// ExistingFiles accumulates string values into a slice. +func (p *parserMixin) ExistingFiles() (target *[]string) { + target = new([]string) + p.ExistingFilesVar(target) + return +} + +func (p *parserMixin) ExistingFilesVar(target *[]string) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newExistingFileValue(v.(*string)) + })) +} + +// ExistingDirs accumulates string values into a slice. +func (p *parserMixin) ExistingDirs() (target *[]string) { + target = new([]string) + p.ExistingDirsVar(target) + return +} + +func (p *parserMixin) ExistingDirsVar(target *[]string) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newExistingDirValue(v.(*string)) + })) +} + +// ExistingFilesOrDirs accumulates string values into a slice. +func (p *parserMixin) ExistingFilesOrDirs() (target *[]string) { + target = new([]string) + p.ExistingFilesOrDirsVar(target) + return +} + +func (p *parserMixin) ExistingFilesOrDirsVar(target *[]string) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newExistingFileOrDirValue(v.(*string)) + })) +} + +// -- *regexp.Regexp Value +type regexpValue struct{ v **regexp.Regexp } + +func newRegexpValue(p **regexp.Regexp) *regexpValue { + return ®expValue{p} +} + +func (f *regexpValue) Set(s string) error { + v, err := regexp.Compile(s) + if err == nil { + *f.v = (*regexp.Regexp)(v) + } + return err +} + +func (f *regexpValue) Get() interface{} { return (*regexp.Regexp)(*f.v) } + +func (f *regexpValue) String() string { return fmt.Sprintf("%v", *f.v) } + +// Regexp parses the next command-line value as *regexp.Regexp. +func (p *parserMixin) Regexp() (target **regexp.Regexp) { + target = new(*regexp.Regexp) + p.RegexpVar(target) + return +} + +func (p *parserMixin) RegexpVar(target **regexp.Regexp) { + p.SetValue(newRegexpValue(target)) +} + +// RegexpList accumulates *regexp.Regexp values into a slice. +func (p *parserMixin) RegexpList() (target *[]*regexp.Regexp) { + target = new([]*regexp.Regexp) + p.RegexpListVar(target) + return +} + +func (p *parserMixin) RegexpListVar(target *[]*regexp.Regexp) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newRegexpValue(v.(**regexp.Regexp)) + })) +} + +// -- net.IP Value +type resolvedIPValue struct{ v *net.IP } + +func newResolvedIPValue(p *net.IP) *resolvedIPValue { + return &resolvedIPValue{p} +} + +func (f *resolvedIPValue) Set(s string) error { + v, err := resolveHost(s) + if err == nil { + *f.v = (net.IP)(v) + } + return err +} + +func (f *resolvedIPValue) Get() interface{} { return (net.IP)(*f.v) } + +func (f *resolvedIPValue) String() string { return fmt.Sprintf("%v", *f.v) } + +// Resolve a hostname or IP to an IP. +func (p *parserMixin) ResolvedIP() (target *net.IP) { + target = new(net.IP) + p.ResolvedIPVar(target) + return +} + +func (p *parserMixin) ResolvedIPVar(target *net.IP) { + p.SetValue(newResolvedIPValue(target)) +} + +// ResolvedIPList accumulates net.IP values into a slice. +func (p *parserMixin) ResolvedIPList() (target *[]net.IP) { + target = new([]net.IP) + p.ResolvedIPListVar(target) + return +} + +func (p *parserMixin) ResolvedIPListVar(target *[]net.IP) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newResolvedIPValue(v.(*net.IP)) + })) +} + +// -- []byte Value +type hexBytesValue struct{ v *[]byte } + +func newHexBytesValue(p *[]byte) *hexBytesValue { + return &hexBytesValue{p} +} + +func (f *hexBytesValue) Set(s string) error { + v, err := hex.DecodeString(s) + if err == nil { + *f.v = ([]byte)(v) + } + return err +} + +func (f *hexBytesValue) Get() interface{} { return ([]byte)(*f.v) } + +func (f *hexBytesValue) String() string { return fmt.Sprintf("%v", *f.v) } + +// Bytes as a hex string. +func (p *parserMixin) HexBytes() (target *[]byte) { + target = new([]byte) + p.HexBytesVar(target) + return +} + +func (p *parserMixin) HexBytesVar(target *[]byte) { + p.SetValue(newHexBytesValue(target)) +} + +// HexBytesList accumulates []byte values into a slice. +func (p *parserMixin) HexBytesList() (target *[][]byte) { + target = new([][]byte) + p.HexBytesListVar(target) + return +} + +func (p *parserMixin) HexBytesListVar(target *[][]byte) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newHexBytesValue(v.(*[]byte)) + })) +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/values_test.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/values_test.go new file mode 100644 index 0000000..d88f667 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/alecthomas/kingpin.v2/values_test.go @@ -0,0 +1,98 @@ +package kingpin + +import ( + "net" + + "github.com/alecthomas/assert" + + "testing" +) + +func TestAccumulatorStrings(t *testing.T) { + target := []string{} + acc := newAccumulator(&target, func(v interface{}) Value { return newStringValue(v.(*string)) }) + acc.Set("a") + assert.Equal(t, []string{"a"}, target) + acc.Set("b") + assert.Equal(t, []string{"a", "b"}, target) +} + +func TestStrings(t *testing.T) { + app := New("", "") + app.Arg("a", "").Required().String() + app.Arg("b", "").Required().String() + c := app.Arg("c", "").Required().Strings() + app.Parse([]string{"a", "b", "a", "b"}) + assert.Equal(t, []string{"a", "b"}, *c) +} + +func TestEnum(t *testing.T) { + app := New("", "") + a := app.Arg("a", "").Enum("one", "two", "three") + _, err := app.Parse([]string{"moo"}) + assert.Error(t, err) + _, err = app.Parse([]string{"one"}) + assert.NoError(t, err) + assert.Equal(t, "one", *a) +} + +func TestEnumVar(t *testing.T) { + app := New("", "") + var a string + app.Arg("a", "").EnumVar(&a, "one", "two", "three") + _, err := app.Parse([]string{"moo"}) + assert.Error(t, err) + _, err = app.Parse([]string{"one"}) + assert.NoError(t, err) + assert.Equal(t, "one", a) +} + +func TestCounter(t *testing.T) { + app := New("", "") + c := app.Flag("f", "").Counter() + _, err := app.Parse([]string{"--f", "--f", "--f"}) + assert.NoError(t, err) + assert.Equal(t, 3, *c) +} + +func TestIPv4Addr(t *testing.T) { + app := newTestApp() + flag := app.Flag("addr", "").ResolvedIP() + _, err := app.Parse([]string{"--addr", net.IPv4(1, 2, 3, 4).String()}) + assert.NoError(t, err) + assert.NotNil(t, *flag) + assert.Equal(t, net.IPv4(1, 2, 3, 4), *flag) +} + +func TestInvalidIPv4Addr(t *testing.T) { + app := newTestApp() + app.Flag("addr", "").ResolvedIP() + _, err := app.Parse([]string{"--addr", "1.2.3.256"}) + assert.Error(t, err) +} + +func TestIPv6Addr(t *testing.T) { + app := newTestApp() + flag := app.Flag("addr", "").ResolvedIP() + _, err := app.Parse([]string{"--addr", net.IPv6interfacelocalallnodes.String()}) + assert.NoError(t, err) + assert.NotNil(t, *flag) + assert.Equal(t, net.IPv6interfacelocalallnodes, *flag) +} + +func TestHexBytes(t *testing.T) { + app := newTestApp() + actual := app.Arg("bytes", "").HexBytes() + _, err := app.Parse([]string{"01020aff"}) + assert.NoError(t, err) + assert.Equal(t, []byte{0x01, 0x02, 0x0a, 0xff}, *actual) +} + +func TestSetValueDoesNotReset(t *testing.T) { + app := newTestApp() + mapping := map[string]string{ + "key": "value", + } + app.Flag("set", "").StringMapVar(&mapping) + assert.NotEmpty(t, mapping) +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/.editorconfig b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/.editorconfig new file mode 100644 index 0000000..ba49e3c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/.editorconfig @@ -0,0 +1,5 @@ +root = true + +[*] +indent_style = tab +indent_size = 4 diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/.github/ISSUE_TEMPLATE.md b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..4ad1aed --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,11 @@ +Before reporting an issue, please ensure you are using the latest release of fsnotify. + +### Which operating system (GOOS) and version are you using? + +Linux: lsb_release -a +macOS: sw_vers +Windows: systeminfo | findstr /B /C:OS + +### Please describe the issue that occurred. + +### Are you able to reproduce the issue? Please provide steps to reproduce and a code sample if possible. diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/.github/PULL_REQUEST_TEMPLATE.md b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..64ddf7c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,8 @@ +#### What does this pull request do? + + +#### Where should the reviewer start? + + +#### How should this be manually tested? + diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/.gitignore b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/.gitignore new file mode 100644 index 0000000..4cd0cba --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/.gitignore @@ -0,0 +1,6 @@ +# Setup a Global .gitignore for OS and editor generated files: +# https://help.github.com/articles/ignoring-files +# git config --global core.excludesfile ~/.gitignore_global + +.vagrant +*.sublime-project diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/.travis.yml b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/.travis.yml new file mode 100644 index 0000000..3a5c933 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/.travis.yml @@ -0,0 +1,28 @@ +sudo: false +language: go + +go: + - 1.6.3 + - tip + +matrix: + allow_failures: + - go: tip + +before_script: + - go get -u github.com/golang/lint/golint + +script: + - go test -v --race ./... + +after_script: + - test -z "$(gofmt -s -l -w . | tee /dev/stderr)" + - test -z "$(golint ./... | tee /dev/stderr)" + - go vet ./... + +os: + - linux + - osx + +notifications: + email: false diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/AUTHORS b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/AUTHORS new file mode 100644 index 0000000..0a5bf8f --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/AUTHORS @@ -0,0 +1,46 @@ +# Names should be added to this file as +# Name or Organization +# The email address is not required for organizations. + +# You can update this list using the following command: +# +# $ git shortlog -se | awk '{print $2 " " $3 " " $4}' + +# Please keep the list sorted. + +Adrien Bustany +Amit Krishnan +Bjørn Erik Pedersen +Bruno Bigras +Caleb Spare +Case Nelson +Chris Howey +Christoffer Buchholz +Daniel Wagner-Hall +Dave Cheney +Evan Phoenix +Francisco Souza +Hari haran +John C Barstow +Kelvin Fo +Ken-ichirou MATSUZAWA +Matt Layher +Nathan Youngman +Patrick +Paul Hammond +Pawel Knap +Pieter Droogendijk +Pursuit92 +Riku Voipio +Rob Figueiredo +Slawek Ligus +Soge Zhang +Tiffany Jernigan +Tilak Sharma +Travis Cline +Tudor Golubenco +Yukang +bronze1man +debrando +henrikedwards +铁哥 diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/CHANGELOG.md b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/CHANGELOG.md new file mode 100644 index 0000000..40d7660 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/CHANGELOG.md @@ -0,0 +1,307 @@ +# Changelog + +## v1.4.2 / 2016-10-10 + +* Linux: use InotifyInit1 with IN_CLOEXEC to stop leaking a file descriptor to a child process when using fork/exec [#178](https://github.com/fsnotify/fsnotify/pull/178) (thanks @pattyshack) + +## v1.4.1 / 2016-10-04 + +* Fix flaky inotify stress test on Linux [#177](https://github.com/fsnotify/fsnotify/pull/177) (thanks @pattyshack) + +## v1.4.0 / 2016-10-01 + +* add a String() method to Event.Op [#165](https://github.com/fsnotify/fsnotify/pull/165) (thanks @oozie) + +## v1.3.1 / 2016-06-28 + +* Windows: fix for double backslash when watching the root of a drive [#151](https://github.com/fsnotify/fsnotify/issues/151) (thanks @brunoqc) + +## v1.3.0 / 2016-04-19 + +* Support linux/arm64 by [patching](https://go-review.googlesource.com/#/c/21971/) x/sys/unix and switching to to it from syscall (thanks @suihkulokki) [#135](https://github.com/fsnotify/fsnotify/pull/135) + +## v1.2.10 / 2016-03-02 + +* Fix golint errors in windows.go [#121](https://github.com/fsnotify/fsnotify/pull/121) (thanks @tiffanyfj) + +## v1.2.9 / 2016-01-13 + +kqueue: Fix logic for CREATE after REMOVE [#111](https://github.com/fsnotify/fsnotify/pull/111) (thanks @bep) + +## v1.2.8 / 2015-12-17 + +* kqueue: fix race condition in Close [#105](https://github.com/fsnotify/fsnotify/pull/105) (thanks @djui for reporting the issue and @ppknap for writing a failing test) +* inotify: fix race in test +* enable race detection for continuous integration (Linux, Mac, Windows) + +## v1.2.5 / 2015-10-17 + +* inotify: use epoll_create1 for arm64 support (requires Linux 2.6.27 or later) [#100](https://github.com/fsnotify/fsnotify/pull/100) (thanks @suihkulokki) +* inotify: fix path leaks [#73](https://github.com/fsnotify/fsnotify/pull/73) (thanks @chamaken) +* kqueue: watch for rename events on subdirectories [#83](https://github.com/fsnotify/fsnotify/pull/83) (thanks @guotie) +* kqueue: avoid infinite loops from symlinks cycles [#101](https://github.com/fsnotify/fsnotify/pull/101) (thanks @illicitonion) + +## v1.2.1 / 2015-10-14 + +* kqueue: don't watch named pipes [#98](https://github.com/fsnotify/fsnotify/pull/98) (thanks @evanphx) + +## v1.2.0 / 2015-02-08 + +* inotify: use epoll to wake up readEvents [#66](https://github.com/fsnotify/fsnotify/pull/66) (thanks @PieterD) +* inotify: closing watcher should now always shut down goroutine [#63](https://github.com/fsnotify/fsnotify/pull/63) (thanks @PieterD) +* kqueue: close kqueue after removing watches, fixes [#59](https://github.com/fsnotify/fsnotify/issues/59) + +## v1.1.1 / 2015-02-05 + +* inotify: Retry read on EINTR [#61](https://github.com/fsnotify/fsnotify/issues/61) (thanks @PieterD) + +## v1.1.0 / 2014-12-12 + +* kqueue: rework internals [#43](https://github.com/fsnotify/fsnotify/pull/43) + * add low-level functions + * only need to store flags on directories + * less mutexes [#13](https://github.com/fsnotify/fsnotify/issues/13) + * done can be an unbuffered channel + * remove calls to os.NewSyscallError +* More efficient string concatenation for Event.String() [#52](https://github.com/fsnotify/fsnotify/pull/52) (thanks @mdlayher) +* kqueue: fix regression in rework causing subdirectories to be watched [#48](https://github.com/fsnotify/fsnotify/issues/48) +* kqueue: cleanup internal watch before sending remove event [#51](https://github.com/fsnotify/fsnotify/issues/51) + +## v1.0.4 / 2014-09-07 + +* kqueue: add dragonfly to the build tags. +* Rename source code files, rearrange code so exported APIs are at the top. +* Add done channel to example code. [#37](https://github.com/fsnotify/fsnotify/pull/37) (thanks @chenyukang) + +## v1.0.3 / 2014-08-19 + +* [Fix] Windows MOVED_TO now translates to Create like on BSD and Linux. [#36](https://github.com/fsnotify/fsnotify/issues/36) + +## v1.0.2 / 2014-08-17 + +* [Fix] Missing create events on OS X. [#14](https://github.com/fsnotify/fsnotify/issues/14) (thanks @zhsso) +* [Fix] Make ./path and path equivalent. (thanks @zhsso) + +## v1.0.0 / 2014-08-15 + +* [API] Remove AddWatch on Windows, use Add. +* Improve documentation for exported identifiers. [#30](https://github.com/fsnotify/fsnotify/issues/30) +* Minor updates based on feedback from golint. + +## dev / 2014-07-09 + +* Moved to [github.com/fsnotify/fsnotify](https://github.com/fsnotify/fsnotify). +* Use os.NewSyscallError instead of returning errno (thanks @hariharan-uno) + +## dev / 2014-07-04 + +* kqueue: fix incorrect mutex used in Close() +* Update example to demonstrate usage of Op. + +## dev / 2014-06-28 + +* [API] Don't set the Write Op for attribute notifications [#4](https://github.com/fsnotify/fsnotify/issues/4) +* Fix for String() method on Event (thanks Alex Brainman) +* Don't build on Plan 9 or Solaris (thanks @4ad) + +## dev / 2014-06-21 + +* Events channel of type Event rather than *Event. +* [internal] use syscall constants directly for inotify and kqueue. +* [internal] kqueue: rename events to kevents and fileEvent to event. + +## dev / 2014-06-19 + +* Go 1.3+ required on Windows (uses syscall.ERROR_MORE_DATA internally). +* [internal] remove cookie from Event struct (unused). +* [internal] Event struct has the same definition across every OS. +* [internal] remove internal watch and removeWatch methods. + +## dev / 2014-06-12 + +* [API] Renamed Watch() to Add() and RemoveWatch() to Remove(). +* [API] Pluralized channel names: Events and Errors. +* [API] Renamed FileEvent struct to Event. +* [API] Op constants replace methods like IsCreate(). + +## dev / 2014-06-12 + +* Fix data race on kevent buffer (thanks @tilaks) [#98](https://github.com/howeyc/fsnotify/pull/98) + +## dev / 2014-05-23 + +* [API] Remove current implementation of WatchFlags. + * current implementation doesn't take advantage of OS for efficiency + * provides little benefit over filtering events as they are received, but has extra bookkeeping and mutexes + * no tests for the current implementation + * not fully implemented on Windows [#93](https://github.com/howeyc/fsnotify/issues/93#issuecomment-39285195) + +## v0.9.3 / 2014-12-31 + +* kqueue: cleanup internal watch before sending remove event [#51](https://github.com/fsnotify/fsnotify/issues/51) + +## v0.9.2 / 2014-08-17 + +* [Backport] Fix missing create events on OS X. [#14](https://github.com/fsnotify/fsnotify/issues/14) (thanks @zhsso) + +## v0.9.1 / 2014-06-12 + +* Fix data race on kevent buffer (thanks @tilaks) [#98](https://github.com/howeyc/fsnotify/pull/98) + +## v0.9.0 / 2014-01-17 + +* IsAttrib() for events that only concern a file's metadata [#79][] (thanks @abustany) +* [Fix] kqueue: fix deadlock [#77][] (thanks @cespare) +* [NOTICE] Development has moved to `code.google.com/p/go.exp/fsnotify` in preparation for inclusion in the Go standard library. + +## v0.8.12 / 2013-11-13 + +* [API] Remove FD_SET and friends from Linux adapter + +## v0.8.11 / 2013-11-02 + +* [Doc] Add Changelog [#72][] (thanks @nathany) +* [Doc] Spotlight and double modify events on OS X [#62][] (reported by @paulhammond) + +## v0.8.10 / 2013-10-19 + +* [Fix] kqueue: remove file watches when parent directory is removed [#71][] (reported by @mdwhatcott) +* [Fix] kqueue: race between Close and readEvents [#70][] (reported by @bernerdschaefer) +* [Doc] specify OS-specific limits in README (thanks @debrando) + +## v0.8.9 / 2013-09-08 + +* [Doc] Contributing (thanks @nathany) +* [Doc] update package path in example code [#63][] (thanks @paulhammond) +* [Doc] GoCI badge in README (Linux only) [#60][] +* [Doc] Cross-platform testing with Vagrant [#59][] (thanks @nathany) + +## v0.8.8 / 2013-06-17 + +* [Fix] Windows: handle `ERROR_MORE_DATA` on Windows [#49][] (thanks @jbowtie) + +## v0.8.7 / 2013-06-03 + +* [API] Make syscall flags internal +* [Fix] inotify: ignore event changes +* [Fix] race in symlink test [#45][] (reported by @srid) +* [Fix] tests on Windows +* lower case error messages + +## v0.8.6 / 2013-05-23 + +* kqueue: Use EVT_ONLY flag on Darwin +* [Doc] Update README with full example + +## v0.8.5 / 2013-05-09 + +* [Fix] inotify: allow monitoring of "broken" symlinks (thanks @tsg) + +## v0.8.4 / 2013-04-07 + +* [Fix] kqueue: watch all file events [#40][] (thanks @ChrisBuchholz) + +## v0.8.3 / 2013-03-13 + +* [Fix] inoitfy/kqueue memory leak [#36][] (reported by @nbkolchin) +* [Fix] kqueue: use fsnFlags for watching a directory [#33][] (reported by @nbkolchin) + +## v0.8.2 / 2013-02-07 + +* [Doc] add Authors +* [Fix] fix data races for map access [#29][] (thanks @fsouza) + +## v0.8.1 / 2013-01-09 + +* [Fix] Windows path separators +* [Doc] BSD License + +## v0.8.0 / 2012-11-09 + +* kqueue: directory watching improvements (thanks @vmirage) +* inotify: add `IN_MOVED_TO` [#25][] (requested by @cpisto) +* [Fix] kqueue: deleting watched directory [#24][] (reported by @jakerr) + +## v0.7.4 / 2012-10-09 + +* [Fix] inotify: fixes from https://codereview.appspot.com/5418045/ (ugorji) +* [Fix] kqueue: preserve watch flags when watching for delete [#21][] (reported by @robfig) +* [Fix] kqueue: watch the directory even if it isn't a new watch (thanks @robfig) +* [Fix] kqueue: modify after recreation of file + +## v0.7.3 / 2012-09-27 + +* [Fix] kqueue: watch with an existing folder inside the watched folder (thanks @vmirage) +* [Fix] kqueue: no longer get duplicate CREATE events + +## v0.7.2 / 2012-09-01 + +* kqueue: events for created directories + +## v0.7.1 / 2012-07-14 + +* [Fix] for renaming files + +## v0.7.0 / 2012-07-02 + +* [Feature] FSNotify flags +* [Fix] inotify: Added file name back to event path + +## v0.6.0 / 2012-06-06 + +* kqueue: watch files after directory created (thanks @tmc) + +## v0.5.1 / 2012-05-22 + +* [Fix] inotify: remove all watches before Close() + +## v0.5.0 / 2012-05-03 + +* [API] kqueue: return errors during watch instead of sending over channel +* kqueue: match symlink behavior on Linux +* inotify: add `DELETE_SELF` (requested by @taralx) +* [Fix] kqueue: handle EINTR (reported by @robfig) +* [Doc] Godoc example [#1][] (thanks @davecheney) + +## v0.4.0 / 2012-03-30 + +* Go 1 released: build with go tool +* [Feature] Windows support using winfsnotify +* Windows does not have attribute change notifications +* Roll attribute notifications into IsModify + +## v0.3.0 / 2012-02-19 + +* kqueue: add files when watch directory + +## v0.2.0 / 2011-12-30 + +* update to latest Go weekly code + +## v0.1.0 / 2011-10-19 + +* kqueue: add watch on file creation to match inotify +* kqueue: create file event +* inotify: ignore `IN_IGNORED` events +* event String() +* linux: common FileEvent functions +* initial commit + +[#79]: https://github.com/howeyc/fsnotify/pull/79 +[#77]: https://github.com/howeyc/fsnotify/pull/77 +[#72]: https://github.com/howeyc/fsnotify/issues/72 +[#71]: https://github.com/howeyc/fsnotify/issues/71 +[#70]: https://github.com/howeyc/fsnotify/issues/70 +[#63]: https://github.com/howeyc/fsnotify/issues/63 +[#62]: https://github.com/howeyc/fsnotify/issues/62 +[#60]: https://github.com/howeyc/fsnotify/issues/60 +[#59]: https://github.com/howeyc/fsnotify/issues/59 +[#49]: https://github.com/howeyc/fsnotify/issues/49 +[#45]: https://github.com/howeyc/fsnotify/issues/45 +[#40]: https://github.com/howeyc/fsnotify/issues/40 +[#36]: https://github.com/howeyc/fsnotify/issues/36 +[#33]: https://github.com/howeyc/fsnotify/issues/33 +[#29]: https://github.com/howeyc/fsnotify/issues/29 +[#25]: https://github.com/howeyc/fsnotify/issues/25 +[#24]: https://github.com/howeyc/fsnotify/issues/24 +[#21]: https://github.com/howeyc/fsnotify/issues/21 diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/CONTRIBUTING.md b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/CONTRIBUTING.md new file mode 100644 index 0000000..6a81ba4 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/CONTRIBUTING.md @@ -0,0 +1,77 @@ +# Contributing + +## Issues + +* Request features and report bugs using the [GitHub Issue Tracker](https://github.com/fsnotify/fsnotify/issues). +* Please indicate the platform you are using fsnotify on. +* A code example to reproduce the problem is appreciated. + +## Pull Requests + +### Contributor License Agreement + +fsnotify is derived from code in the [golang.org/x/exp](https://godoc.org/golang.org/x/exp) package and it may be included [in the standard library](https://github.com/fsnotify/fsnotify/issues/1) in the future. Therefore fsnotify carries the same [LICENSE](https://github.com/fsnotify/fsnotify/blob/master/LICENSE) as Go. Contributors retain their copyright, so you need to fill out a short form before we can accept your contribution: [Google Individual Contributor License Agreement](https://developers.google.com/open-source/cla/individual). + +Please indicate that you have signed the CLA in your pull request. + +### How fsnotify is Developed + +* Development is done on feature branches. +* Tests are run on BSD, Linux, OS X and Windows. +* Pull requests are reviewed and [applied to master][am] using [hub][]. + * Maintainers may modify or squash commits rather than asking contributors to. +* To issue a new release, the maintainers will: + * Update the CHANGELOG + * Tag a version, which will become available through gopkg.in. + +### How to Fork + +For smooth sailing, always use the original import path. Installing with `go get` makes this easy. + +1. Install from GitHub (`go get -u github.com/fsnotify/fsnotify`) +2. Create your feature branch (`git checkout -b my-new-feature`) +3. Ensure everything works and the tests pass (see below) +4. Commit your changes (`git commit -am 'Add some feature'`) + +Contribute upstream: + +1. Fork fsnotify on GitHub +2. Add your remote (`git remote add fork git@github.com:mycompany/repo.git`) +3. Push to the branch (`git push fork my-new-feature`) +4. Create a new Pull Request on GitHub + +This workflow is [thoroughly explained by Katrina Owen](https://splice.com/blog/contributing-open-source-git-repositories-go/). + +### Testing + +fsnotify uses build tags to compile different code on Linux, BSD, OS X, and Windows. + +Before doing a pull request, please do your best to test your changes on multiple platforms, and list which platforms you were able/unable to test on. + +To aid in cross-platform testing there is a Vagrantfile for Linux and BSD. + +* Install [Vagrant](http://www.vagrantup.com/) and [VirtualBox](https://www.virtualbox.org/) +* Setup [Vagrant Gopher](https://github.com/nathany/vagrant-gopher) in your `src` folder. +* Run `vagrant up` from the project folder. You can also setup just one box with `vagrant up linux` or `vagrant up bsd` (note: the BSD box doesn't support Windows hosts at this time, and NFS may prompt for your host OS password) +* Once setup, you can run the test suite on a given OS with a single command `vagrant ssh linux -c 'cd fsnotify/fsnotify; go test'`. +* When you're done, you will want to halt or destroy the Vagrant boxes. + +Notice: fsnotify file system events won't trigger in shared folders. The tests get around this limitation by using the /tmp directory. + +Right now there is no equivalent solution for Windows and OS X, but there are Windows VMs [freely available from Microsoft](http://www.modern.ie/en-us/virtualization-tools#downloads). + +### Maintainers + +Help maintaining fsnotify is welcome. To be a maintainer: + +* Submit a pull request and sign the CLA as above. +* You must be able to run the test suite on Mac, Windows, Linux and BSD. + +To keep master clean, the fsnotify project uses the "apply mail" workflow outlined in Nathaniel Talbott's post ["Merge pull request" Considered Harmful][am]. This requires installing [hub][]. + +All code changes should be internal pull requests. + +Releases are tagged using [Semantic Versioning](http://semver.org/). + +[hub]: https://github.com/github/hub +[am]: http://blog.spreedly.com/2014/06/24/merge-pull-request-considered-harmful/#.VGa5yZPF_Zs diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/LICENSE b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/LICENSE new file mode 100644 index 0000000..f21e540 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2012 The Go Authors. All rights reserved. +Copyright (c) 2012 fsnotify 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/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/README.md b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/README.md new file mode 100644 index 0000000..3c891e3 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/README.md @@ -0,0 +1,50 @@ +# File system notifications for Go + +[![GoDoc](https://godoc.org/github.com/fsnotify/fsnotify?status.svg)](https://godoc.org/github.com/fsnotify/fsnotify) [![Go Report Card](https://goreportcard.com/badge/github.com/fsnotify/fsnotify)](https://goreportcard.com/report/github.com/fsnotify/fsnotify) + +fsnotify utilizes [golang.org/x/sys](https://godoc.org/golang.org/x/sys) rather than `syscall` from the standard library. Ensure you have the latest version installed by running: + +```console +go get -u golang.org/x/sys/... +``` + +Cross platform: Windows, Linux, BSD and OS X. + +|Adapter |OS |Status | +|----------|----------|----------| +|inotify |Linux 2.6.27 or later, Android\*|Supported [![Build Status](https://travis-ci.org/fsnotify/fsnotify.svg?branch=master)](https://travis-ci.org/fsnotify/fsnotify)| +|kqueue |BSD, OS X, iOS\*|Supported [![Build Status](https://travis-ci.org/fsnotify/fsnotify.svg?branch=master)](https://travis-ci.org/fsnotify/fsnotify)| +|ReadDirectoryChangesW|Windows|Supported [![Build status](https://ci.appveyor.com/api/projects/status/ivwjubaih4r0udeh/branch/master?svg=true)](https://ci.appveyor.com/project/NathanYoungman/fsnotify/branch/master)| +|FSEvents |OS X |[Planned](https://github.com/fsnotify/fsnotify/issues/11)| +|FEN |Solaris 11 |[In Progress](https://github.com/fsnotify/fsnotify/issues/12)| +|fanotify |Linux 2.6.37+ | | +|USN Journals |Windows |[Maybe](https://github.com/fsnotify/fsnotify/issues/53)| +|Polling |*All* |[Maybe](https://github.com/fsnotify/fsnotify/issues/9)| + +\* Android and iOS are untested. + +Please see [the documentation](https://godoc.org/github.com/fsnotify/fsnotify) for usage. Consult the [Wiki](https://github.com/fsnotify/fsnotify/wiki) for the FAQ and further information. + +## API stability + +fsnotify is a fork of [howeyc/fsnotify](https://godoc.org/github.com/howeyc/fsnotify) with a new API as of v1.0. The API is based on [this design document](http://goo.gl/MrYxyA). + +All [releases](https://github.com/fsnotify/fsnotify/releases) are tagged based on [Semantic Versioning](http://semver.org/). Further API changes are [planned](https://github.com/fsnotify/fsnotify/milestones), and will be tagged with a new major revision number. + +Go 1.6 supports dependencies located in the `vendor/` folder. Unless you are creating a library, it is recommended that you copy fsnotify into `vendor/github.com/fsnotify/fsnotify` within your project, and likewise for `golang.org/x/sys`. + +## Contributing + +Please refer to [CONTRIBUTING][] before opening an issue or pull request. + +## Example + +See [example_test.go](https://github.com/fsnotify/fsnotify/blob/master/example_test.go). + +[contributing]: https://github.com/fsnotify/fsnotify/blob/master/CONTRIBUTING.md + +## Related Projects + +* [notify](https://github.com/rjeczalik/notify) +* [fsevents](https://github.com/fsnotify/fsevents) + diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/example_test.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/example_test.go new file mode 100644 index 0000000..700502c --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/example_test.go @@ -0,0 +1,42 @@ +// 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. + +// +build !plan9 + +package fsnotify_test + +import ( + "log" + + "github.com/fsnotify/fsnotify" +) + +func ExampleNewWatcher() { + watcher, err := fsnotify.NewWatcher() + if err != nil { + log.Fatal(err) + } + defer watcher.Close() + + done := make(chan bool) + go func() { + for { + select { + case event := <-watcher.Events: + log.Println("event:", event) + if event.Op&fsnotify.Write == fsnotify.Write { + log.Println("modified file:", event.Name) + } + case err := <-watcher.Errors: + log.Println("error:", err) + } + } + }() + + err = watcher.Add("/tmp/foo") + if err != nil { + log.Fatal(err) + } + <-done +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/fen.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/fen.go new file mode 100644 index 0000000..ced39cb --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/fen.go @@ -0,0 +1,37 @@ +// 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. + +// +build solaris + +package fsnotify + +import ( + "errors" +) + +// Watcher watches a set of files, delivering events to a channel. +type Watcher struct { + Events chan Event + Errors chan error +} + +// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events. +func NewWatcher() (*Watcher, error) { + return nil, errors.New("FEN based watcher not yet supported for fsnotify\n") +} + +// Close removes all watches and closes the events channel. +func (w *Watcher) Close() error { + return nil +} + +// Add starts watching the named file or directory (non-recursively). +func (w *Watcher) Add(name string) error { + return nil +} + +// Remove stops watching the the named file or directory (non-recursively). +func (w *Watcher) Remove(name string) error { + return nil +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/fsnotify.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/fsnotify.go new file mode 100644 index 0000000..e7f55fe --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/fsnotify.go @@ -0,0 +1,62 @@ +// 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. + +// +build !plan9 + +// Package fsnotify provides a platform-independent interface for file system notifications. +package fsnotify + +import ( + "bytes" + "fmt" +) + +// Event represents a single file system notification. +type Event struct { + Name string // Relative path to the file or directory. + Op Op // File operation that triggered the event. +} + +// Op describes a set of file operations. +type Op uint32 + +// These are the generalized file operations that can trigger a notification. +const ( + Create Op = 1 << iota + Write + Remove + Rename + Chmod +) + +func (op Op) String() string { + // Use a buffer for efficient string concatenation + var buffer bytes.Buffer + + if op&Create == Create { + buffer.WriteString("|CREATE") + } + if op&Remove == Remove { + buffer.WriteString("|REMOVE") + } + if op&Write == Write { + buffer.WriteString("|WRITE") + } + if op&Rename == Rename { + buffer.WriteString("|RENAME") + } + if op&Chmod == Chmod { + buffer.WriteString("|CHMOD") + } + if buffer.Len() == 0 { + return "" + } + return buffer.String()[1:] // Strip leading pipe +} + +// String returns a string representation of the event in the form +// "file: REMOVE|WRITE|..." +func (e Event) String() string { + return fmt.Sprintf("%q: %s", e.Name, e.Op.String()) +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/fsnotify_test.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/fsnotify_test.go new file mode 100644 index 0000000..9d6d72a --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/fsnotify_test.go @@ -0,0 +1,40 @@ +// 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. + +// +build !plan9 + +package fsnotify + +import "testing" + +func TestEventStringWithValue(t *testing.T) { + for opMask, expectedString := range map[Op]string{ + Chmod | Create: `"/usr/someFile": CREATE|CHMOD`, + Rename: `"/usr/someFile": RENAME`, + Remove: `"/usr/someFile": REMOVE`, + Write | Chmod: `"/usr/someFile": WRITE|CHMOD`, + } { + event := Event{Name: "/usr/someFile", Op: opMask} + if event.String() != expectedString { + t.Fatalf("Expected %s, got: %v", expectedString, event.String()) + } + + } +} + +func TestEventOpStringWithValue(t *testing.T) { + expectedOpString := "WRITE|CHMOD" + event := Event{Name: "someFile", Op: Write | Chmod} + if event.Op.String() != expectedOpString { + t.Fatalf("Expected %s, got: %v", expectedOpString, event.Op.String()) + } +} + +func TestEventOpStringWithNoValue(t *testing.T) { + expectedOpString := "" + event := Event{Name: "testFile", Op: 0} + if event.Op.String() != expectedOpString { + t.Fatalf("Expected %s, got: %v", expectedOpString, event.Op.String()) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/inotify.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/inotify.go new file mode 100644 index 0000000..f3b74c5 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/inotify.go @@ -0,0 +1,325 @@ +// 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. + +// +build linux + +package fsnotify + +import ( + "errors" + "fmt" + "io" + "os" + "path/filepath" + "strings" + "sync" + "unsafe" + + "golang.org/x/sys/unix" +) + +// Watcher watches a set of files, delivering events to a channel. +type Watcher struct { + Events chan Event + Errors chan error + mu sync.Mutex // Map access + cv *sync.Cond // sync removing on rm_watch with IN_IGNORE + fd int + poller *fdPoller + watches map[string]*watch // Map of inotify watches (key: path) + paths map[int]string // Map of watched paths (key: watch descriptor) + done chan struct{} // Channel for sending a "quit message" to the reader goroutine + doneResp chan struct{} // Channel to respond to Close +} + +// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events. +func NewWatcher() (*Watcher, error) { + // Create inotify fd + fd, errno := unix.InotifyInit1(unix.IN_CLOEXEC) + if fd == -1 { + return nil, errno + } + // Create epoll + poller, err := newFdPoller(fd) + if err != nil { + unix.Close(fd) + return nil, err + } + w := &Watcher{ + fd: fd, + poller: poller, + watches: make(map[string]*watch), + paths: make(map[int]string), + Events: make(chan Event), + Errors: make(chan error), + done: make(chan struct{}), + doneResp: make(chan struct{}), + } + w.cv = sync.NewCond(&w.mu) + + go w.readEvents() + return w, nil +} + +func (w *Watcher) isClosed() bool { + select { + case <-w.done: + return true + default: + return false + } +} + +// Close removes all watches and closes the events channel. +func (w *Watcher) Close() error { + if w.isClosed() { + return nil + } + + // Send 'close' signal to goroutine, and set the Watcher to closed. + close(w.done) + + // Wake up goroutine + w.poller.wake() + + // Wait for goroutine to close + <-w.doneResp + + return nil +} + +// Add starts watching the named file or directory (non-recursively). +func (w *Watcher) Add(name string) error { + name = filepath.Clean(name) + if w.isClosed() { + return errors.New("inotify instance already closed") + } + + const agnosticEvents = unix.IN_MOVED_TO | unix.IN_MOVED_FROM | + unix.IN_CREATE | unix.IN_ATTRIB | unix.IN_MODIFY | + unix.IN_MOVE_SELF | unix.IN_DELETE | unix.IN_DELETE_SELF + + var flags uint32 = agnosticEvents + + w.mu.Lock() + watchEntry, found := w.watches[name] + w.mu.Unlock() + if found { + watchEntry.flags |= flags + flags |= unix.IN_MASK_ADD + } + wd, errno := unix.InotifyAddWatch(w.fd, name, flags) + if wd == -1 { + return errno + } + + w.mu.Lock() + w.watches[name] = &watch{wd: uint32(wd), flags: flags} + w.paths[wd] = name + w.mu.Unlock() + + return nil +} + +// Remove stops watching the named file or directory (non-recursively). +func (w *Watcher) Remove(name string) error { + name = filepath.Clean(name) + + // Fetch the watch. + w.mu.Lock() + defer w.mu.Unlock() + watch, ok := w.watches[name] + + // Remove it from inotify. + if !ok { + return fmt.Errorf("can't remove non-existent inotify watch for: %s", name) + } + // inotify_rm_watch will return EINVAL if the file has been deleted; + // the inotify will already have been removed. + // watches and pathes are deleted in ignoreLinux() implicitly and asynchronously + // by calling inotify_rm_watch() below. e.g. readEvents() goroutine receives IN_IGNORE + // so that EINVAL means that the wd is being rm_watch()ed or its file removed + // by another thread and we have not received IN_IGNORE event. + success, errno := unix.InotifyRmWatch(w.fd, watch.wd) + if success == -1 { + // TODO: Perhaps it's not helpful to return an error here in every case. + // the only two possible errors are: + // EBADF, which happens when w.fd is not a valid file descriptor of any kind. + // EINVAL, which is when fd is not an inotify descriptor or wd is not a valid watch descriptor. + // Watch descriptors are invalidated when they are removed explicitly or implicitly; + // explicitly by inotify_rm_watch, implicitly when the file they are watching is deleted. + return errno + } + + // wait until ignoreLinux() deleting maps + exists := true + for exists { + w.cv.Wait() + _, exists = w.watches[name] + } + + return nil +} + +type watch struct { + wd uint32 // Watch descriptor (as returned by the inotify_add_watch() syscall) + flags uint32 // inotify flags of this watch (see inotify(7) for the list of valid flags) +} + +// readEvents reads from the inotify file descriptor, converts the +// received events into Event objects and sends them via the Events channel +func (w *Watcher) readEvents() { + var ( + buf [unix.SizeofInotifyEvent * 4096]byte // Buffer for a maximum of 4096 raw events + n int // Number of bytes read with read() + errno error // Syscall errno + ok bool // For poller.wait + ) + + defer close(w.doneResp) + defer close(w.Errors) + defer close(w.Events) + defer unix.Close(w.fd) + defer w.poller.close() + + for { + // See if we have been closed. + if w.isClosed() { + return + } + + ok, errno = w.poller.wait() + if errno != nil { + select { + case w.Errors <- errno: + case <-w.done: + return + } + continue + } + + if !ok { + continue + } + + n, errno = unix.Read(w.fd, buf[:]) + // If a signal interrupted execution, see if we've been asked to close, and try again. + // http://man7.org/linux/man-pages/man7/signal.7.html : + // "Before Linux 3.8, reads from an inotify(7) file descriptor were not restartable" + if errno == unix.EINTR { + continue + } + + // unix.Read might have been woken up by Close. If so, we're done. + if w.isClosed() { + return + } + + if n < unix.SizeofInotifyEvent { + var err error + if n == 0 { + // If EOF is received. This should really never happen. + err = io.EOF + } else if n < 0 { + // If an error occurred while reading. + err = errno + } else { + // Read was too short. + err = errors.New("notify: short read in readEvents()") + } + select { + case w.Errors <- err: + case <-w.done: + return + } + continue + } + + var offset uint32 + // We don't know how many events we just read into the buffer + // While the offset points to at least one whole event... + for offset <= uint32(n-unix.SizeofInotifyEvent) { + // Point "raw" to the event in the buffer + raw := (*unix.InotifyEvent)(unsafe.Pointer(&buf[offset])) + + mask := uint32(raw.Mask) + nameLen := uint32(raw.Len) + // If the event happened to the watched directory or the watched file, the kernel + // doesn't append the filename to the event, but we would like to always fill the + // the "Name" field with a valid filename. We retrieve the path of the watch from + // the "paths" map. + w.mu.Lock() + name := w.paths[int(raw.Wd)] + w.mu.Unlock() + if nameLen > 0 { + // Point "bytes" at the first byte of the filename + bytes := (*[unix.PathMax]byte)(unsafe.Pointer(&buf[offset+unix.SizeofInotifyEvent])) + // The filename is padded with NULL bytes. TrimRight() gets rid of those. + name += "/" + strings.TrimRight(string(bytes[0:nameLen]), "\000") + } + + event := newEvent(name, mask) + + // Send the events that are not ignored on the events channel + if !event.ignoreLinux(w, raw.Wd, mask) { + select { + case w.Events <- event: + case <-w.done: + return + } + } + + // Move to the next event in the buffer + offset += unix.SizeofInotifyEvent + nameLen + } + } +} + +// Certain types of events can be "ignored" and not sent over the Events +// channel. Such as events marked ignore by the kernel, or MODIFY events +// against files that do not exist. +func (e *Event) ignoreLinux(w *Watcher, wd int32, mask uint32) bool { + // Ignore anything the inotify API says to ignore + if mask&unix.IN_IGNORED == unix.IN_IGNORED { + w.mu.Lock() + defer w.mu.Unlock() + name := w.paths[int(wd)] + delete(w.paths, int(wd)) + delete(w.watches, name) + w.cv.Broadcast() + return true + } + + // If the event is not a DELETE or RENAME, the file must exist. + // Otherwise the event is ignored. + // *Note*: this was put in place because it was seen that a MODIFY + // event was sent after the DELETE. This ignores that MODIFY and + // assumes a DELETE will come or has come if the file doesn't exist. + if !(e.Op&Remove == Remove || e.Op&Rename == Rename) { + _, statErr := os.Lstat(e.Name) + return os.IsNotExist(statErr) + } + return false +} + +// newEvent returns an platform-independent Event based on an inotify mask. +func newEvent(name string, mask uint32) Event { + e := Event{Name: name} + if mask&unix.IN_CREATE == unix.IN_CREATE || mask&unix.IN_MOVED_TO == unix.IN_MOVED_TO { + e.Op |= Create + } + if mask&unix.IN_DELETE_SELF == unix.IN_DELETE_SELF || mask&unix.IN_DELETE == unix.IN_DELETE { + e.Op |= Remove + } + if mask&unix.IN_MODIFY == unix.IN_MODIFY { + e.Op |= Write + } + if mask&unix.IN_MOVE_SELF == unix.IN_MOVE_SELF || mask&unix.IN_MOVED_FROM == unix.IN_MOVED_FROM { + e.Op |= Rename + } + if mask&unix.IN_ATTRIB == unix.IN_ATTRIB { + e.Op |= Chmod + } + return e +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/inotify_poller.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/inotify_poller.go new file mode 100644 index 0000000..cc7db4b --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/inotify_poller.go @@ -0,0 +1,187 @@ +// Copyright 2015 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 linux + +package fsnotify + +import ( + "errors" + + "golang.org/x/sys/unix" +) + +type fdPoller struct { + fd int // File descriptor (as returned by the inotify_init() syscall) + epfd int // Epoll file descriptor + pipe [2]int // Pipe for waking up +} + +func emptyPoller(fd int) *fdPoller { + poller := new(fdPoller) + poller.fd = fd + poller.epfd = -1 + poller.pipe[0] = -1 + poller.pipe[1] = -1 + return poller +} + +// Create a new inotify poller. +// This creates an inotify handler, and an epoll handler. +func newFdPoller(fd int) (*fdPoller, error) { + var errno error + poller := emptyPoller(fd) + defer func() { + if errno != nil { + poller.close() + } + }() + poller.fd = fd + + // Create epoll fd + poller.epfd, errno = unix.EpollCreate1(0) + if poller.epfd == -1 { + return nil, errno + } + // Create pipe; pipe[0] is the read end, pipe[1] the write end. + errno = unix.Pipe2(poller.pipe[:], unix.O_NONBLOCK) + if errno != nil { + return nil, errno + } + + // Register inotify fd with epoll + event := unix.EpollEvent{ + Fd: int32(poller.fd), + Events: unix.EPOLLIN, + } + errno = unix.EpollCtl(poller.epfd, unix.EPOLL_CTL_ADD, poller.fd, &event) + if errno != nil { + return nil, errno + } + + // Register pipe fd with epoll + event = unix.EpollEvent{ + Fd: int32(poller.pipe[0]), + Events: unix.EPOLLIN, + } + errno = unix.EpollCtl(poller.epfd, unix.EPOLL_CTL_ADD, poller.pipe[0], &event) + if errno != nil { + return nil, errno + } + + return poller, nil +} + +// Wait using epoll. +// Returns true if something is ready to be read, +// false if there is not. +func (poller *fdPoller) wait() (bool, error) { + // 3 possible events per fd, and 2 fds, makes a maximum of 6 events. + // I don't know whether epoll_wait returns the number of events returned, + // or the total number of events ready. + // I decided to catch both by making the buffer one larger than the maximum. + events := make([]unix.EpollEvent, 7) + for { + n, errno := unix.EpollWait(poller.epfd, events, -1) + if n == -1 { + if errno == unix.EINTR { + continue + } + return false, errno + } + if n == 0 { + // If there are no events, try again. + continue + } + if n > 6 { + // This should never happen. More events were returned than should be possible. + return false, errors.New("epoll_wait returned more events than I know what to do with") + } + ready := events[:n] + epollhup := false + epollerr := false + epollin := false + for _, event := range ready { + if event.Fd == int32(poller.fd) { + if event.Events&unix.EPOLLHUP != 0 { + // This should not happen, but if it does, treat it as a wakeup. + epollhup = true + } + if event.Events&unix.EPOLLERR != 0 { + // If an error is waiting on the file descriptor, we should pretend + // something is ready to read, and let unix.Read pick up the error. + epollerr = true + } + if event.Events&unix.EPOLLIN != 0 { + // There is data to read. + epollin = true + } + } + if event.Fd == int32(poller.pipe[0]) { + if event.Events&unix.EPOLLHUP != 0 { + // Write pipe descriptor was closed, by us. This means we're closing down the + // watcher, and we should wake up. + } + if event.Events&unix.EPOLLERR != 0 { + // If an error is waiting on the pipe file descriptor. + // This is an absolute mystery, and should never ever happen. + return false, errors.New("Error on the pipe descriptor.") + } + if event.Events&unix.EPOLLIN != 0 { + // This is a regular wakeup, so we have to clear the buffer. + err := poller.clearWake() + if err != nil { + return false, err + } + } + } + } + + if epollhup || epollerr || epollin { + return true, nil + } + return false, nil + } +} + +// Close the write end of the poller. +func (poller *fdPoller) wake() error { + buf := make([]byte, 1) + n, errno := unix.Write(poller.pipe[1], buf) + if n == -1 { + if errno == unix.EAGAIN { + // Buffer is full, poller will wake. + return nil + } + return errno + } + return nil +} + +func (poller *fdPoller) clearWake() error { + // You have to be woken up a LOT in order to get to 100! + buf := make([]byte, 100) + n, errno := unix.Read(poller.pipe[0], buf) + if n == -1 { + if errno == unix.EAGAIN { + // Buffer is empty, someone else cleared our wake. + return nil + } + return errno + } + return nil +} + +// Close all poller file descriptors, but not the one passed to it. +func (poller *fdPoller) close() { + if poller.pipe[1] != -1 { + unix.Close(poller.pipe[1]) + } + if poller.pipe[0] != -1 { + unix.Close(poller.pipe[0]) + } + if poller.epfd != -1 { + unix.Close(poller.epfd) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/inotify_poller_test.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/inotify_poller_test.go new file mode 100644 index 0000000..26623ef --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/inotify_poller_test.go @@ -0,0 +1,229 @@ +// Copyright 2015 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 linux + +package fsnotify + +import ( + "testing" + "time" + + "golang.org/x/sys/unix" +) + +type testFd [2]int + +func makeTestFd(t *testing.T) testFd { + var tfd testFd + errno := unix.Pipe(tfd[:]) + if errno != nil { + t.Fatalf("Failed to create pipe: %v", errno) + } + return tfd +} + +func (tfd testFd) fd() int { + return tfd[0] +} + +func (tfd testFd) closeWrite(t *testing.T) { + errno := unix.Close(tfd[1]) + if errno != nil { + t.Fatalf("Failed to close write end of pipe: %v", errno) + } +} + +func (tfd testFd) put(t *testing.T) { + buf := make([]byte, 10) + _, errno := unix.Write(tfd[1], buf) + if errno != nil { + t.Fatalf("Failed to write to pipe: %v", errno) + } +} + +func (tfd testFd) get(t *testing.T) { + buf := make([]byte, 10) + _, errno := unix.Read(tfd[0], buf) + if errno != nil { + t.Fatalf("Failed to read from pipe: %v", errno) + } +} + +func (tfd testFd) close() { + unix.Close(tfd[1]) + unix.Close(tfd[0]) +} + +func makePoller(t *testing.T) (testFd, *fdPoller) { + tfd := makeTestFd(t) + poller, err := newFdPoller(tfd.fd()) + if err != nil { + t.Fatalf("Failed to create poller: %v", err) + } + return tfd, poller +} + +func TestPollerWithBadFd(t *testing.T) { + _, err := newFdPoller(-1) + if err != unix.EBADF { + t.Fatalf("Expected EBADF, got: %v", err) + } +} + +func TestPollerWithData(t *testing.T) { + tfd, poller := makePoller(t) + defer tfd.close() + defer poller.close() + + tfd.put(t) + ok, err := poller.wait() + if err != nil { + t.Fatalf("poller failed: %v", err) + } + if !ok { + t.Fatalf("expected poller to return true") + } + tfd.get(t) +} + +func TestPollerWithWakeup(t *testing.T) { + tfd, poller := makePoller(t) + defer tfd.close() + defer poller.close() + + err := poller.wake() + if err != nil { + t.Fatalf("wake failed: %v", err) + } + ok, err := poller.wait() + if err != nil { + t.Fatalf("poller failed: %v", err) + } + if ok { + t.Fatalf("expected poller to return false") + } +} + +func TestPollerWithClose(t *testing.T) { + tfd, poller := makePoller(t) + defer tfd.close() + defer poller.close() + + tfd.closeWrite(t) + ok, err := poller.wait() + if err != nil { + t.Fatalf("poller failed: %v", err) + } + if !ok { + t.Fatalf("expected poller to return true") + } +} + +func TestPollerWithWakeupAndData(t *testing.T) { + tfd, poller := makePoller(t) + defer tfd.close() + defer poller.close() + + tfd.put(t) + err := poller.wake() + if err != nil { + t.Fatalf("wake failed: %v", err) + } + + // both data and wakeup + ok, err := poller.wait() + if err != nil { + t.Fatalf("poller failed: %v", err) + } + if !ok { + t.Fatalf("expected poller to return true") + } + + // data is still in the buffer, wakeup is cleared + ok, err = poller.wait() + if err != nil { + t.Fatalf("poller failed: %v", err) + } + if !ok { + t.Fatalf("expected poller to return true") + } + + tfd.get(t) + // data is gone, only wakeup now + err = poller.wake() + if err != nil { + t.Fatalf("wake failed: %v", err) + } + ok, err = poller.wait() + if err != nil { + t.Fatalf("poller failed: %v", err) + } + if ok { + t.Fatalf("expected poller to return false") + } +} + +func TestPollerConcurrent(t *testing.T) { + tfd, poller := makePoller(t) + defer tfd.close() + defer poller.close() + + oks := make(chan bool) + live := make(chan bool) + defer close(live) + go func() { + defer close(oks) + for { + ok, err := poller.wait() + if err != nil { + t.Fatalf("poller failed: %v", err) + } + oks <- ok + if !<-live { + return + } + } + }() + + // Try a write + select { + case <-time.After(50 * time.Millisecond): + case <-oks: + t.Fatalf("poller did not wait") + } + tfd.put(t) + if !<-oks { + t.Fatalf("expected true") + } + tfd.get(t) + live <- true + + // Try a wakeup + select { + case <-time.After(50 * time.Millisecond): + case <-oks: + t.Fatalf("poller did not wait") + } + err := poller.wake() + if err != nil { + t.Fatalf("wake failed: %v", err) + } + if <-oks { + t.Fatalf("expected false") + } + live <- true + + // Try a close + select { + case <-time.After(50 * time.Millisecond): + case <-oks: + t.Fatalf("poller did not wait") + } + tfd.closeWrite(t) + if !<-oks { + t.Fatalf("expected true") + } + tfd.get(t) +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/inotify_test.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/inotify_test.go new file mode 100644 index 0000000..a4bb202 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/inotify_test.go @@ -0,0 +1,360 @@ +// Copyright 2015 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 linux + +package fsnotify + +import ( + "fmt" + "os" + "path/filepath" + "strings" + "testing" + "time" +) + +func TestInotifyCloseRightAway(t *testing.T) { + w, err := NewWatcher() + if err != nil { + t.Fatalf("Failed to create watcher") + } + + // Close immediately; it won't even reach the first unix.Read. + w.Close() + + // Wait for the close to complete. + <-time.After(50 * time.Millisecond) + isWatcherReallyClosed(t, w) +} + +func TestInotifyCloseSlightlyLater(t *testing.T) { + w, err := NewWatcher() + if err != nil { + t.Fatalf("Failed to create watcher") + } + + // Wait until readEvents has reached unix.Read, and Close. + <-time.After(50 * time.Millisecond) + w.Close() + + // Wait for the close to complete. + <-time.After(50 * time.Millisecond) + isWatcherReallyClosed(t, w) +} + +func TestInotifyCloseSlightlyLaterWithWatch(t *testing.T) { + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + + w, err := NewWatcher() + if err != nil { + t.Fatalf("Failed to create watcher") + } + w.Add(testDir) + + // Wait until readEvents has reached unix.Read, and Close. + <-time.After(50 * time.Millisecond) + w.Close() + + // Wait for the close to complete. + <-time.After(50 * time.Millisecond) + isWatcherReallyClosed(t, w) +} + +func TestInotifyCloseAfterRead(t *testing.T) { + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + + w, err := NewWatcher() + if err != nil { + t.Fatalf("Failed to create watcher") + } + + err = w.Add(testDir) + if err != nil { + t.Fatalf("Failed to add .") + } + + // Generate an event. + os.Create(filepath.Join(testDir, "somethingSOMETHINGsomethingSOMETHING")) + + // Wait for readEvents to read the event, then close the watcher. + <-time.After(50 * time.Millisecond) + w.Close() + + // Wait for the close to complete. + <-time.After(50 * time.Millisecond) + isWatcherReallyClosed(t, w) +} + +func isWatcherReallyClosed(t *testing.T, w *Watcher) { + select { + case err, ok := <-w.Errors: + if ok { + t.Fatalf("w.Errors is not closed; readEvents is still alive after closing (error: %v)", err) + } + default: + t.Fatalf("w.Errors would have blocked; readEvents is still alive!") + } + + select { + case _, ok := <-w.Events: + if ok { + t.Fatalf("w.Events is not closed; readEvents is still alive after closing") + } + default: + t.Fatalf("w.Events would have blocked; readEvents is still alive!") + } +} + +func TestInotifyCloseCreate(t *testing.T) { + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + + w, err := NewWatcher() + if err != nil { + t.Fatalf("Failed to create watcher: %v", err) + } + defer w.Close() + + err = w.Add(testDir) + if err != nil { + t.Fatalf("Failed to add testDir: %v", err) + } + h, err := os.Create(filepath.Join(testDir, "testfile")) + if err != nil { + t.Fatalf("Failed to create file in testdir: %v", err) + } + h.Close() + select { + case _ = <-w.Events: + case err := <-w.Errors: + t.Fatalf("Error from watcher: %v", err) + case <-time.After(50 * time.Millisecond): + t.Fatalf("Took too long to wait for event") + } + + // At this point, we've received one event, so the goroutine is ready. + // It's also blocking on unix.Read. + // Now we try to swap the file descriptor under its nose. + w.Close() + w, err = NewWatcher() + defer w.Close() + if err != nil { + t.Fatalf("Failed to create second watcher: %v", err) + } + + <-time.After(50 * time.Millisecond) + err = w.Add(testDir) + if err != nil { + t.Fatalf("Error adding testDir again: %v", err) + } +} + +// This test verifies the watcher can keep up with file creations/deletions +// when under load. +func TestInotifyStress(t *testing.T) { + maxNumToCreate := 1000 + + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + testFilePrefix := filepath.Join(testDir, "testfile") + + w, err := NewWatcher() + if err != nil { + t.Fatalf("Failed to create watcher: %v", err) + } + defer w.Close() + + err = w.Add(testDir) + if err != nil { + t.Fatalf("Failed to add testDir: %v", err) + } + + doneChan := make(chan struct{}) + // The buffer ensures that the file generation goroutine is never blocked. + errChan := make(chan error, 2*maxNumToCreate) + + go func() { + for i := 0; i < maxNumToCreate; i++ { + testFile := fmt.Sprintf("%s%d", testFilePrefix, i) + + handle, err := os.Create(testFile) + if err != nil { + errChan <- fmt.Errorf("Create failed: %v", err) + continue + } + + err = handle.Close() + if err != nil { + errChan <- fmt.Errorf("Close failed: %v", err) + continue + } + } + + // If we delete a newly created file too quickly, inotify will skip the + // create event and only send the delete event. + time.Sleep(100 * time.Millisecond) + + for i := 0; i < maxNumToCreate; i++ { + testFile := fmt.Sprintf("%s%d", testFilePrefix, i) + err = os.Remove(testFile) + if err != nil { + errChan <- fmt.Errorf("Remove failed: %v", err) + } + } + + close(doneChan) + }() + + creates := 0 + removes := 0 + + finished := false + after := time.After(10 * time.Second) + for !finished { + select { + case <-after: + t.Fatalf("Not done") + case <-doneChan: + finished = true + case err := <-errChan: + t.Fatalf("Got an error from file creator goroutine: %v", err) + case err := <-w.Errors: + t.Fatalf("Got an error from watcher: %v", err) + case evt := <-w.Events: + if !strings.HasPrefix(evt.Name, testFilePrefix) { + t.Fatalf("Got an event for an unknown file: %s", evt.Name) + } + if evt.Op == Create { + creates++ + } + if evt.Op == Remove { + removes++ + } + } + } + + // Drain remaining events from channels + count := 0 + for count < 10 { + select { + case err := <-errChan: + t.Fatalf("Got an error from file creator goroutine: %v", err) + case err := <-w.Errors: + t.Fatalf("Got an error from watcher: %v", err) + case evt := <-w.Events: + if !strings.HasPrefix(evt.Name, testFilePrefix) { + t.Fatalf("Got an event for an unknown file: %s", evt.Name) + } + if evt.Op == Create { + creates++ + } + if evt.Op == Remove { + removes++ + } + count = 0 + default: + count++ + // Give the watcher chances to fill the channels. + time.Sleep(time.Millisecond) + } + } + + if creates-removes > 1 || creates-removes < -1 { + t.Fatalf("Creates and removes should not be off by more than one: %d creates, %d removes", creates, removes) + } + if creates < 50 { + t.Fatalf("Expected at least 50 creates, got %d", creates) + } +} + +func TestInotifyRemoveTwice(t *testing.T) { + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + testFile := filepath.Join(testDir, "testfile") + + handle, err := os.Create(testFile) + if err != nil { + t.Fatalf("Create failed: %v", err) + } + handle.Close() + + w, err := NewWatcher() + if err != nil { + t.Fatalf("Failed to create watcher: %v", err) + } + defer w.Close() + + err = w.Add(testFile) + if err != nil { + t.Fatalf("Failed to add testFile: %v", err) + } + + err = os.Remove(testFile) + if err != nil { + t.Fatalf("Failed to remove testFile: %v", err) + } + + err = w.Remove(testFile) + if err == nil { + t.Fatalf("no error on removing invalid file") + } + s1 := fmt.Sprintf("%s", err) + + err = w.Remove(testFile) + if err == nil { + t.Fatalf("no error on removing invalid file") + } + s2 := fmt.Sprintf("%s", err) + + if s1 != s2 { + t.Fatalf("receive different error - %s / %s", s1, s2) + } +} + +func TestInotifyInnerMapLength(t *testing.T) { + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + testFile := filepath.Join(testDir, "testfile") + + handle, err := os.Create(testFile) + if err != nil { + t.Fatalf("Create failed: %v", err) + } + handle.Close() + + w, err := NewWatcher() + if err != nil { + t.Fatalf("Failed to create watcher: %v", err) + } + defer w.Close() + + err = w.Add(testFile) + if err != nil { + t.Fatalf("Failed to add testFile: %v", err) + } + go func() { + for err := range w.Errors { + t.Fatalf("error received: %s", err) + } + }() + + err = os.Remove(testFile) + if err != nil { + t.Fatalf("Failed to remove testFile: %v", err) + } + _ = <-w.Events // consume Remove event + <-time.After(50 * time.Millisecond) // wait IN_IGNORE propagated + + w.mu.Lock() + defer w.mu.Unlock() + if len(w.watches) != 0 { + t.Fatalf("Expected watches len is 0, but got: %d, %v", len(w.watches), w.watches) + } + if len(w.paths) != 0 { + t.Fatalf("Expected paths len is 0, but got: %d, %v", len(w.paths), w.paths) + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/integration_darwin_test.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/integration_darwin_test.go new file mode 100644 index 0000000..5564554 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/integration_darwin_test.go @@ -0,0 +1,147 @@ +// 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 fsnotify + +import ( + "os" + "path/filepath" + "testing" + "time" + + "golang.org/x/sys/unix" +) + +// testExchangedataForWatcher tests the watcher with the exchangedata operation on OS X. +// +// This is widely used for atomic saves on OS X, e.g. TextMate and in Apple's NSDocument. +// +// See https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man2/exchangedata.2.html +// Also see: https://github.com/textmate/textmate/blob/cd016be29489eba5f3c09b7b70b06da134dda550/Frameworks/io/src/swap_file_data.cc#L20 +func testExchangedataForWatcher(t *testing.T, watchDir bool) { + // Create directory to watch + testDir1 := tempMkdir(t) + + // For the intermediate file + testDir2 := tempMkdir(t) + + defer os.RemoveAll(testDir1) + defer os.RemoveAll(testDir2) + + resolvedFilename := "TestFsnotifyEvents.file" + + // TextMate does: + // + // 1. exchangedata (intermediate, resolved) + // 2. unlink intermediate + // + // Let's try to simulate that: + resolved := filepath.Join(testDir1, resolvedFilename) + intermediate := filepath.Join(testDir2, resolvedFilename+"~") + + // Make sure we create the file before we start watching + createAndSyncFile(t, resolved) + + watcher := newWatcher(t) + + // Test both variants in isolation + if watchDir { + addWatch(t, watcher, testDir1) + } else { + addWatch(t, watcher, resolved) + } + + // Receive errors on the error channel on a separate goroutine + go func() { + for err := range watcher.Errors { + t.Fatalf("error received: %s", err) + } + }() + + // Receive events on the event channel on a separate goroutine + eventstream := watcher.Events + var removeReceived counter + var createReceived counter + + done := make(chan bool) + + go func() { + for event := range eventstream { + // Only count relevant events + if event.Name == filepath.Clean(resolved) { + if event.Op&Remove == Remove { + removeReceived.increment() + } + if event.Op&Create == Create { + createReceived.increment() + } + } + t.Logf("event received: %s", event) + } + done <- true + }() + + // Repeat to make sure the watched file/directory "survives" the REMOVE/CREATE loop. + for i := 1; i <= 3; i++ { + // The intermediate file is created in a folder outside the watcher + createAndSyncFile(t, intermediate) + + // 1. Swap + if err := unix.Exchangedata(intermediate, resolved, 0); err != nil { + t.Fatalf("[%d] exchangedata failed: %s", i, err) + } + + time.Sleep(50 * time.Millisecond) + + // 2. Delete the intermediate file + err := os.Remove(intermediate) + + if err != nil { + t.Fatalf("[%d] remove %s failed: %s", i, intermediate, err) + } + + time.Sleep(50 * time.Millisecond) + + } + + // We expect this event to be received almost immediately, but let's wait 500 ms to be sure + time.Sleep(500 * time.Millisecond) + + // The events will be (CHMOD + REMOVE + CREATE) X 2. Let's focus on the last two: + if removeReceived.value() < 3 { + t.Fatal("fsnotify remove events have not been received after 500 ms") + } + + if createReceived.value() < 3 { + t.Fatal("fsnotify create events have not been received after 500 ms") + } + + watcher.Close() + t.Log("waiting for the event channel to become closed...") + select { + case <-done: + t.Log("event channel closed") + case <-time.After(2 * time.Second): + t.Fatal("event stream was not closed after 2 seconds") + } +} + +// TestExchangedataInWatchedDir test exchangedata operation on file in watched dir. +func TestExchangedataInWatchedDir(t *testing.T) { + testExchangedataForWatcher(t, true) +} + +// TestExchangedataInWatchedDir test exchangedata operation on watched file. +func TestExchangedataInWatchedFile(t *testing.T) { + testExchangedataForWatcher(t, false) +} + +func createAndSyncFile(t *testing.T, filepath string) { + f1, err := os.OpenFile(filepath, os.O_WRONLY|os.O_CREATE, 0666) + if err != nil { + t.Fatalf("creating %s failed: %s", filepath, err) + } + f1.Sync() + f1.Close() +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/integration_test.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/integration_test.go new file mode 100644 index 0000000..8b7e9d3 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/integration_test.go @@ -0,0 +1,1237 @@ +// 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. + +// +build !plan9,!solaris + +package fsnotify + +import ( + "io/ioutil" + "os" + "os/exec" + "path" + "path/filepath" + "runtime" + "sync/atomic" + "testing" + "time" +) + +// An atomic counter +type counter struct { + val int32 +} + +func (c *counter) increment() { + atomic.AddInt32(&c.val, 1) +} + +func (c *counter) value() int32 { + return atomic.LoadInt32(&c.val) +} + +func (c *counter) reset() { + atomic.StoreInt32(&c.val, 0) +} + +// tempMkdir makes a temporary directory +func tempMkdir(t *testing.T) string { + dir, err := ioutil.TempDir("", "fsnotify") + if err != nil { + t.Fatalf("failed to create test directory: %s", err) + } + return dir +} + +// tempMkFile makes a temporary file. +func tempMkFile(t *testing.T, dir string) string { + f, err := ioutil.TempFile(dir, "fsnotify") + if err != nil { + t.Fatalf("failed to create test file: %v", err) + } + defer f.Close() + return f.Name() +} + +// newWatcher initializes an fsnotify Watcher instance. +func newWatcher(t *testing.T) *Watcher { + watcher, err := NewWatcher() + if err != nil { + t.Fatalf("NewWatcher() failed: %s", err) + } + return watcher +} + +// addWatch adds a watch for a directory +func addWatch(t *testing.T, watcher *Watcher, dir string) { + if err := watcher.Add(dir); err != nil { + t.Fatalf("watcher.Add(%q) failed: %s", dir, err) + } +} + +func TestFsnotifyMultipleOperations(t *testing.T) { + watcher := newWatcher(t) + + // Receive errors on the error channel on a separate goroutine + go func() { + for err := range watcher.Errors { + t.Fatalf("error received: %s", err) + } + }() + + // Create directory to watch + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + + // Create directory that's not watched + testDirToMoveFiles := tempMkdir(t) + defer os.RemoveAll(testDirToMoveFiles) + + testFile := filepath.Join(testDir, "TestFsnotifySeq.testfile") + testFileRenamed := filepath.Join(testDirToMoveFiles, "TestFsnotifySeqRename.testfile") + + addWatch(t, watcher, testDir) + + // Receive events on the event channel on a separate goroutine + eventstream := watcher.Events + var createReceived, modifyReceived, deleteReceived, renameReceived counter + done := make(chan bool) + go func() { + for event := range eventstream { + // Only count relevant events + if event.Name == filepath.Clean(testDir) || event.Name == filepath.Clean(testFile) { + t.Logf("event received: %s", event) + if event.Op&Remove == Remove { + deleteReceived.increment() + } + if event.Op&Write == Write { + modifyReceived.increment() + } + if event.Op&Create == Create { + createReceived.increment() + } + if event.Op&Rename == Rename { + renameReceived.increment() + } + } else { + t.Logf("unexpected event received: %s", event) + } + } + done <- true + }() + + // Create a file + // This should add at least one event to the fsnotify event queue + var f *os.File + f, err := os.OpenFile(testFile, os.O_WRONLY|os.O_CREATE, 0666) + if err != nil { + t.Fatalf("creating test file failed: %s", err) + } + f.Sync() + + time.Sleep(time.Millisecond) + f.WriteString("data") + f.Sync() + f.Close() + + time.Sleep(50 * time.Millisecond) // give system time to sync write change before delete + + if err := testRename(testFile, testFileRenamed); err != nil { + t.Fatalf("rename failed: %s", err) + } + + // Modify the file outside of the watched dir + f, err = os.Open(testFileRenamed) + if err != nil { + t.Fatalf("open test renamed file failed: %s", err) + } + f.WriteString("data") + f.Sync() + f.Close() + + time.Sleep(50 * time.Millisecond) // give system time to sync write change before delete + + // Recreate the file that was moved + f, err = os.OpenFile(testFile, os.O_WRONLY|os.O_CREATE, 0666) + if err != nil { + t.Fatalf("creating test file failed: %s", err) + } + f.Close() + time.Sleep(50 * time.Millisecond) // give system time to sync write change before delete + + // We expect this event to be received almost immediately, but let's wait 500 ms to be sure + time.Sleep(500 * time.Millisecond) + cReceived := createReceived.value() + if cReceived != 2 { + t.Fatalf("incorrect number of create events received after 500 ms (%d vs %d)", cReceived, 2) + } + mReceived := modifyReceived.value() + if mReceived != 1 { + t.Fatalf("incorrect number of modify events received after 500 ms (%d vs %d)", mReceived, 1) + } + dReceived := deleteReceived.value() + rReceived := renameReceived.value() + if dReceived+rReceived != 1 { + t.Fatalf("incorrect number of rename+delete events received after 500 ms (%d vs %d)", rReceived+dReceived, 1) + } + + // Try closing the fsnotify instance + t.Log("calling Close()") + watcher.Close() + t.Log("waiting for the event channel to become closed...") + select { + case <-done: + t.Log("event channel closed") + case <-time.After(2 * time.Second): + t.Fatal("event stream was not closed after 2 seconds") + } +} + +func TestFsnotifyMultipleCreates(t *testing.T) { + watcher := newWatcher(t) + + // Receive errors on the error channel on a separate goroutine + go func() { + for err := range watcher.Errors { + t.Fatalf("error received: %s", err) + } + }() + + // Create directory to watch + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + + testFile := filepath.Join(testDir, "TestFsnotifySeq.testfile") + + addWatch(t, watcher, testDir) + + // Receive events on the event channel on a separate goroutine + eventstream := watcher.Events + var createReceived, modifyReceived, deleteReceived counter + done := make(chan bool) + go func() { + for event := range eventstream { + // Only count relevant events + if event.Name == filepath.Clean(testDir) || event.Name == filepath.Clean(testFile) { + t.Logf("event received: %s", event) + if event.Op&Remove == Remove { + deleteReceived.increment() + } + if event.Op&Create == Create { + createReceived.increment() + } + if event.Op&Write == Write { + modifyReceived.increment() + } + } else { + t.Logf("unexpected event received: %s", event) + } + } + done <- true + }() + + // Create a file + // This should add at least one event to the fsnotify event queue + var f *os.File + f, err := os.OpenFile(testFile, os.O_WRONLY|os.O_CREATE, 0666) + if err != nil { + t.Fatalf("creating test file failed: %s", err) + } + f.Sync() + + time.Sleep(time.Millisecond) + f.WriteString("data") + f.Sync() + f.Close() + + time.Sleep(50 * time.Millisecond) // give system time to sync write change before delete + + os.Remove(testFile) + + time.Sleep(50 * time.Millisecond) // give system time to sync write change before delete + + // Recreate the file + f, err = os.OpenFile(testFile, os.O_WRONLY|os.O_CREATE, 0666) + if err != nil { + t.Fatalf("creating test file failed: %s", err) + } + f.Close() + time.Sleep(50 * time.Millisecond) // give system time to sync write change before delete + + // Modify + f, err = os.OpenFile(testFile, os.O_WRONLY, 0666) + if err != nil { + t.Fatalf("creating test file failed: %s", err) + } + f.Sync() + + time.Sleep(time.Millisecond) + f.WriteString("data") + f.Sync() + f.Close() + + time.Sleep(50 * time.Millisecond) // give system time to sync write change before delete + + // Modify + f, err = os.OpenFile(testFile, os.O_WRONLY, 0666) + if err != nil { + t.Fatalf("creating test file failed: %s", err) + } + f.Sync() + + time.Sleep(time.Millisecond) + f.WriteString("data") + f.Sync() + f.Close() + + time.Sleep(50 * time.Millisecond) // give system time to sync write change before delete + + // We expect this event to be received almost immediately, but let's wait 500 ms to be sure + time.Sleep(500 * time.Millisecond) + cReceived := createReceived.value() + if cReceived != 2 { + t.Fatalf("incorrect number of create events received after 500 ms (%d vs %d)", cReceived, 2) + } + mReceived := modifyReceived.value() + if mReceived < 3 { + t.Fatalf("incorrect number of modify events received after 500 ms (%d vs atleast %d)", mReceived, 3) + } + dReceived := deleteReceived.value() + if dReceived != 1 { + t.Fatalf("incorrect number of rename+delete events received after 500 ms (%d vs %d)", dReceived, 1) + } + + // Try closing the fsnotify instance + t.Log("calling Close()") + watcher.Close() + t.Log("waiting for the event channel to become closed...") + select { + case <-done: + t.Log("event channel closed") + case <-time.After(2 * time.Second): + t.Fatal("event stream was not closed after 2 seconds") + } +} + +func TestFsnotifyDirOnly(t *testing.T) { + watcher := newWatcher(t) + + // Create directory to watch + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + + // Create a file before watching directory + // This should NOT add any events to the fsnotify event queue + testFileAlreadyExists := filepath.Join(testDir, "TestFsnotifyEventsExisting.testfile") + { + var f *os.File + f, err := os.OpenFile(testFileAlreadyExists, os.O_WRONLY|os.O_CREATE, 0666) + if err != nil { + t.Fatalf("creating test file failed: %s", err) + } + f.Sync() + f.Close() + } + + addWatch(t, watcher, testDir) + + // Receive errors on the error channel on a separate goroutine + go func() { + for err := range watcher.Errors { + t.Fatalf("error received: %s", err) + } + }() + + testFile := filepath.Join(testDir, "TestFsnotifyDirOnly.testfile") + + // Receive events on the event channel on a separate goroutine + eventstream := watcher.Events + var createReceived, modifyReceived, deleteReceived counter + done := make(chan bool) + go func() { + for event := range eventstream { + // Only count relevant events + if event.Name == filepath.Clean(testDir) || event.Name == filepath.Clean(testFile) || event.Name == filepath.Clean(testFileAlreadyExists) { + t.Logf("event received: %s", event) + if event.Op&Remove == Remove { + deleteReceived.increment() + } + if event.Op&Write == Write { + modifyReceived.increment() + } + if event.Op&Create == Create { + createReceived.increment() + } + } else { + t.Logf("unexpected event received: %s", event) + } + } + done <- true + }() + + // Create a file + // This should add at least one event to the fsnotify event queue + var f *os.File + f, err := os.OpenFile(testFile, os.O_WRONLY|os.O_CREATE, 0666) + if err != nil { + t.Fatalf("creating test file failed: %s", err) + } + f.Sync() + + time.Sleep(time.Millisecond) + f.WriteString("data") + f.Sync() + f.Close() + + time.Sleep(50 * time.Millisecond) // give system time to sync write change before delete + + os.Remove(testFile) + os.Remove(testFileAlreadyExists) + + // We expect this event to be received almost immediately, but let's wait 500 ms to be sure + time.Sleep(500 * time.Millisecond) + cReceived := createReceived.value() + if cReceived != 1 { + t.Fatalf("incorrect number of create events received after 500 ms (%d vs %d)", cReceived, 1) + } + mReceived := modifyReceived.value() + if mReceived != 1 { + t.Fatalf("incorrect number of modify events received after 500 ms (%d vs %d)", mReceived, 1) + } + dReceived := deleteReceived.value() + if dReceived != 2 { + t.Fatalf("incorrect number of delete events received after 500 ms (%d vs %d)", dReceived, 2) + } + + // Try closing the fsnotify instance + t.Log("calling Close()") + watcher.Close() + t.Log("waiting for the event channel to become closed...") + select { + case <-done: + t.Log("event channel closed") + case <-time.After(2 * time.Second): + t.Fatal("event stream was not closed after 2 seconds") + } +} + +func TestFsnotifyDeleteWatchedDir(t *testing.T) { + watcher := newWatcher(t) + defer watcher.Close() + + // Create directory to watch + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + + // Create a file before watching directory + testFileAlreadyExists := filepath.Join(testDir, "TestFsnotifyEventsExisting.testfile") + { + var f *os.File + f, err := os.OpenFile(testFileAlreadyExists, os.O_WRONLY|os.O_CREATE, 0666) + if err != nil { + t.Fatalf("creating test file failed: %s", err) + } + f.Sync() + f.Close() + } + + addWatch(t, watcher, testDir) + + // Add a watch for testFile + addWatch(t, watcher, testFileAlreadyExists) + + // Receive errors on the error channel on a separate goroutine + go func() { + for err := range watcher.Errors { + t.Fatalf("error received: %s", err) + } + }() + + // Receive events on the event channel on a separate goroutine + eventstream := watcher.Events + var deleteReceived counter + go func() { + for event := range eventstream { + // Only count relevant events + if event.Name == filepath.Clean(testDir) || event.Name == filepath.Clean(testFileAlreadyExists) { + t.Logf("event received: %s", event) + if event.Op&Remove == Remove { + deleteReceived.increment() + } + } else { + t.Logf("unexpected event received: %s", event) + } + } + }() + + os.RemoveAll(testDir) + + // We expect this event to be received almost immediately, but let's wait 500 ms to be sure + time.Sleep(500 * time.Millisecond) + dReceived := deleteReceived.value() + if dReceived < 2 { + t.Fatalf("did not receive at least %d delete events, received %d after 500 ms", 2, dReceived) + } +} + +func TestFsnotifySubDir(t *testing.T) { + watcher := newWatcher(t) + + // Create directory to watch + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + + testFile1 := filepath.Join(testDir, "TestFsnotifyFile1.testfile") + testSubDir := filepath.Join(testDir, "sub") + testSubDirFile := filepath.Join(testDir, "sub/TestFsnotifyFile1.testfile") + + // Receive errors on the error channel on a separate goroutine + go func() { + for err := range watcher.Errors { + t.Fatalf("error received: %s", err) + } + }() + + // Receive events on the event channel on a separate goroutine + eventstream := watcher.Events + var createReceived, deleteReceived counter + done := make(chan bool) + go func() { + for event := range eventstream { + // Only count relevant events + if event.Name == filepath.Clean(testDir) || event.Name == filepath.Clean(testSubDir) || event.Name == filepath.Clean(testFile1) { + t.Logf("event received: %s", event) + if event.Op&Create == Create { + createReceived.increment() + } + if event.Op&Remove == Remove { + deleteReceived.increment() + } + } else { + t.Logf("unexpected event received: %s", event) + } + } + done <- true + }() + + addWatch(t, watcher, testDir) + + // Create sub-directory + if err := os.Mkdir(testSubDir, 0777); err != nil { + t.Fatalf("failed to create test sub-directory: %s", err) + } + + // Create a file + var f *os.File + f, err := os.OpenFile(testFile1, os.O_WRONLY|os.O_CREATE, 0666) + if err != nil { + t.Fatalf("creating test file failed: %s", err) + } + f.Sync() + f.Close() + + // Create a file (Should not see this! we are not watching subdir) + var fs *os.File + fs, err = os.OpenFile(testSubDirFile, os.O_WRONLY|os.O_CREATE, 0666) + if err != nil { + t.Fatalf("creating test file failed: %s", err) + } + fs.Sync() + fs.Close() + + time.Sleep(200 * time.Millisecond) + + // Make sure receive deletes for both file and sub-directory + os.RemoveAll(testSubDir) + os.Remove(testFile1) + + // We expect this event to be received almost immediately, but let's wait 500 ms to be sure + time.Sleep(500 * time.Millisecond) + cReceived := createReceived.value() + if cReceived != 2 { + t.Fatalf("incorrect number of create events received after 500 ms (%d vs %d)", cReceived, 2) + } + dReceived := deleteReceived.value() + if dReceived != 2 { + t.Fatalf("incorrect number of delete events received after 500 ms (%d vs %d)", dReceived, 2) + } + + // Try closing the fsnotify instance + t.Log("calling Close()") + watcher.Close() + t.Log("waiting for the event channel to become closed...") + select { + case <-done: + t.Log("event channel closed") + case <-time.After(2 * time.Second): + t.Fatal("event stream was not closed after 2 seconds") + } +} + +func TestFsnotifyRename(t *testing.T) { + watcher := newWatcher(t) + + // Create directory to watch + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + + addWatch(t, watcher, testDir) + + // Receive errors on the error channel on a separate goroutine + go func() { + for err := range watcher.Errors { + t.Fatalf("error received: %s", err) + } + }() + + testFile := filepath.Join(testDir, "TestFsnotifyEvents.testfile") + testFileRenamed := filepath.Join(testDir, "TestFsnotifyEvents.testfileRenamed") + + // Receive events on the event channel on a separate goroutine + eventstream := watcher.Events + var renameReceived counter + done := make(chan bool) + go func() { + for event := range eventstream { + // Only count relevant events + if event.Name == filepath.Clean(testDir) || event.Name == filepath.Clean(testFile) || event.Name == filepath.Clean(testFileRenamed) { + if event.Op&Rename == Rename { + renameReceived.increment() + } + t.Logf("event received: %s", event) + } else { + t.Logf("unexpected event received: %s", event) + } + } + done <- true + }() + + // Create a file + // This should add at least one event to the fsnotify event queue + var f *os.File + f, err := os.OpenFile(testFile, os.O_WRONLY|os.O_CREATE, 0666) + if err != nil { + t.Fatalf("creating test file failed: %s", err) + } + f.Sync() + + f.WriteString("data") + f.Sync() + f.Close() + + // Add a watch for testFile + addWatch(t, watcher, testFile) + + if err := testRename(testFile, testFileRenamed); err != nil { + t.Fatalf("rename failed: %s", err) + } + + // We expect this event to be received almost immediately, but let's wait 500 ms to be sure + time.Sleep(500 * time.Millisecond) + if renameReceived.value() == 0 { + t.Fatal("fsnotify rename events have not been received after 500 ms") + } + + // Try closing the fsnotify instance + t.Log("calling Close()") + watcher.Close() + t.Log("waiting for the event channel to become closed...") + select { + case <-done: + t.Log("event channel closed") + case <-time.After(2 * time.Second): + t.Fatal("event stream was not closed after 2 seconds") + } + + os.Remove(testFileRenamed) +} + +func TestFsnotifyRenameToCreate(t *testing.T) { + watcher := newWatcher(t) + + // Create directory to watch + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + + // Create directory to get file + testDirFrom := tempMkdir(t) + defer os.RemoveAll(testDirFrom) + + addWatch(t, watcher, testDir) + + // Receive errors on the error channel on a separate goroutine + go func() { + for err := range watcher.Errors { + t.Fatalf("error received: %s", err) + } + }() + + testFile := filepath.Join(testDirFrom, "TestFsnotifyEvents.testfile") + testFileRenamed := filepath.Join(testDir, "TestFsnotifyEvents.testfileRenamed") + + // Receive events on the event channel on a separate goroutine + eventstream := watcher.Events + var createReceived counter + done := make(chan bool) + go func() { + for event := range eventstream { + // Only count relevant events + if event.Name == filepath.Clean(testDir) || event.Name == filepath.Clean(testFile) || event.Name == filepath.Clean(testFileRenamed) { + if event.Op&Create == Create { + createReceived.increment() + } + t.Logf("event received: %s", event) + } else { + t.Logf("unexpected event received: %s", event) + } + } + done <- true + }() + + // Create a file + // This should add at least one event to the fsnotify event queue + var f *os.File + f, err := os.OpenFile(testFile, os.O_WRONLY|os.O_CREATE, 0666) + if err != nil { + t.Fatalf("creating test file failed: %s", err) + } + f.Sync() + f.Close() + + if err := testRename(testFile, testFileRenamed); err != nil { + t.Fatalf("rename failed: %s", err) + } + + // We expect this event to be received almost immediately, but let's wait 500 ms to be sure + time.Sleep(500 * time.Millisecond) + if createReceived.value() == 0 { + t.Fatal("fsnotify create events have not been received after 500 ms") + } + + // Try closing the fsnotify instance + t.Log("calling Close()") + watcher.Close() + t.Log("waiting for the event channel to become closed...") + select { + case <-done: + t.Log("event channel closed") + case <-time.After(2 * time.Second): + t.Fatal("event stream was not closed after 2 seconds") + } + + os.Remove(testFileRenamed) +} + +func TestFsnotifyRenameToOverwrite(t *testing.T) { + switch runtime.GOOS { + case "plan9", "windows": + t.Skipf("skipping test on %q (os.Rename over existing file does not create event).", runtime.GOOS) + } + + watcher := newWatcher(t) + + // Create directory to watch + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + + // Create directory to get file + testDirFrom := tempMkdir(t) + defer os.RemoveAll(testDirFrom) + + testFile := filepath.Join(testDirFrom, "TestFsnotifyEvents.testfile") + testFileRenamed := filepath.Join(testDir, "TestFsnotifyEvents.testfileRenamed") + + // Create a file + var fr *os.File + fr, err := os.OpenFile(testFileRenamed, os.O_WRONLY|os.O_CREATE, 0666) + if err != nil { + t.Fatalf("creating test file failed: %s", err) + } + fr.Sync() + fr.Close() + + addWatch(t, watcher, testDir) + + // Receive errors on the error channel on a separate goroutine + go func() { + for err := range watcher.Errors { + t.Fatalf("error received: %s", err) + } + }() + + // Receive events on the event channel on a separate goroutine + eventstream := watcher.Events + var eventReceived counter + done := make(chan bool) + go func() { + for event := range eventstream { + // Only count relevant events + if event.Name == filepath.Clean(testFileRenamed) { + eventReceived.increment() + t.Logf("event received: %s", event) + } else { + t.Logf("unexpected event received: %s", event) + } + } + done <- true + }() + + // Create a file + // This should add at least one event to the fsnotify event queue + var f *os.File + f, err = os.OpenFile(testFile, os.O_WRONLY|os.O_CREATE, 0666) + if err != nil { + t.Fatalf("creating test file failed: %s", err) + } + f.Sync() + f.Close() + + if err := testRename(testFile, testFileRenamed); err != nil { + t.Fatalf("rename failed: %s", err) + } + + // We expect this event to be received almost immediately, but let's wait 500 ms to be sure + time.Sleep(500 * time.Millisecond) + if eventReceived.value() == 0 { + t.Fatal("fsnotify events have not been received after 500 ms") + } + + // Try closing the fsnotify instance + t.Log("calling Close()") + watcher.Close() + t.Log("waiting for the event channel to become closed...") + select { + case <-done: + t.Log("event channel closed") + case <-time.After(2 * time.Second): + t.Fatal("event stream was not closed after 2 seconds") + } + + os.Remove(testFileRenamed) +} + +func TestRemovalOfWatch(t *testing.T) { + // Create directory to watch + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + + // Create a file before watching directory + testFileAlreadyExists := filepath.Join(testDir, "TestFsnotifyEventsExisting.testfile") + { + var f *os.File + f, err := os.OpenFile(testFileAlreadyExists, os.O_WRONLY|os.O_CREATE, 0666) + if err != nil { + t.Fatalf("creating test file failed: %s", err) + } + f.Sync() + f.Close() + } + + watcher := newWatcher(t) + defer watcher.Close() + + addWatch(t, watcher, testDir) + if err := watcher.Remove(testDir); err != nil { + t.Fatalf("Could not remove the watch: %v\n", err) + } + + go func() { + select { + case ev := <-watcher.Events: + t.Fatalf("We received event: %v\n", ev) + case <-time.After(500 * time.Millisecond): + t.Log("No event received, as expected.") + } + }() + + time.Sleep(200 * time.Millisecond) + // Modify the file outside of the watched dir + f, err := os.Open(testFileAlreadyExists) + if err != nil { + t.Fatalf("Open test file failed: %s", err) + } + f.WriteString("data") + f.Sync() + f.Close() + if err := os.Chmod(testFileAlreadyExists, 0700); err != nil { + t.Fatalf("chmod failed: %s", err) + } + time.Sleep(400 * time.Millisecond) +} + +func TestFsnotifyAttrib(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("attributes don't work on Windows.") + } + + watcher := newWatcher(t) + + // Create directory to watch + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + + // Receive errors on the error channel on a separate goroutine + go func() { + for err := range watcher.Errors { + t.Fatalf("error received: %s", err) + } + }() + + testFile := filepath.Join(testDir, "TestFsnotifyAttrib.testfile") + + // Receive events on the event channel on a separate goroutine + eventstream := watcher.Events + // The modifyReceived counter counts IsModify events that are not IsAttrib, + // and the attribReceived counts IsAttrib events (which are also IsModify as + // a consequence). + var modifyReceived counter + var attribReceived counter + done := make(chan bool) + go func() { + for event := range eventstream { + // Only count relevant events + if event.Name == filepath.Clean(testDir) || event.Name == filepath.Clean(testFile) { + if event.Op&Write == Write { + modifyReceived.increment() + } + if event.Op&Chmod == Chmod { + attribReceived.increment() + } + t.Logf("event received: %s", event) + } else { + t.Logf("unexpected event received: %s", event) + } + } + done <- true + }() + + // Create a file + // This should add at least one event to the fsnotify event queue + var f *os.File + f, err := os.OpenFile(testFile, os.O_WRONLY|os.O_CREATE, 0666) + if err != nil { + t.Fatalf("creating test file failed: %s", err) + } + f.Sync() + + f.WriteString("data") + f.Sync() + f.Close() + + // Add a watch for testFile + addWatch(t, watcher, testFile) + + if err := os.Chmod(testFile, 0700); err != nil { + t.Fatalf("chmod failed: %s", err) + } + + // We expect this event to be received almost immediately, but let's wait 500 ms to be sure + // Creating/writing a file changes also the mtime, so IsAttrib should be set to true here + time.Sleep(500 * time.Millisecond) + if modifyReceived.value() != 0 { + t.Fatal("received an unexpected modify event when creating a test file") + } + if attribReceived.value() == 0 { + t.Fatal("fsnotify attribute events have not received after 500 ms") + } + + // Modifying the contents of the file does not set the attrib flag (although eg. the mtime + // might have been modified). + modifyReceived.reset() + attribReceived.reset() + + f, err = os.OpenFile(testFile, os.O_WRONLY, 0) + if err != nil { + t.Fatalf("reopening test file failed: %s", err) + } + + f.WriteString("more data") + f.Sync() + f.Close() + + time.Sleep(500 * time.Millisecond) + + if modifyReceived.value() != 1 { + t.Fatal("didn't receive a modify event after changing test file contents") + } + + if attribReceived.value() != 0 { + t.Fatal("did receive an unexpected attrib event after changing test file contents") + } + + modifyReceived.reset() + attribReceived.reset() + + // Doing a chmod on the file should trigger an event with the "attrib" flag set (the contents + // of the file are not changed though) + if err := os.Chmod(testFile, 0600); err != nil { + t.Fatalf("chmod failed: %s", err) + } + + time.Sleep(500 * time.Millisecond) + + if attribReceived.value() != 1 { + t.Fatal("didn't receive an attribute change after 500ms") + } + + // Try closing the fsnotify instance + t.Log("calling Close()") + watcher.Close() + t.Log("waiting for the event channel to become closed...") + select { + case <-done: + t.Log("event channel closed") + case <-time.After(1e9): + t.Fatal("event stream was not closed after 1 second") + } + + os.Remove(testFile) +} + +func TestFsnotifyClose(t *testing.T) { + watcher := newWatcher(t) + watcher.Close() + + var done int32 + go func() { + watcher.Close() + atomic.StoreInt32(&done, 1) + }() + + time.Sleep(50e6) // 50 ms + if atomic.LoadInt32(&done) == 0 { + t.Fatal("double Close() test failed: second Close() call didn't return") + } + + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + + if err := watcher.Add(testDir); err == nil { + t.Fatal("expected error on Watch() after Close(), got nil") + } +} + +func TestFsnotifyFakeSymlink(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("symlinks don't work on Windows.") + } + + watcher := newWatcher(t) + + // Create directory to watch + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + + var errorsReceived counter + // Receive errors on the error channel on a separate goroutine + go func() { + for errors := range watcher.Errors { + t.Logf("Received error: %s", errors) + errorsReceived.increment() + } + }() + + // Count the CREATE events received + var createEventsReceived, otherEventsReceived counter + go func() { + for ev := range watcher.Events { + t.Logf("event received: %s", ev) + if ev.Op&Create == Create { + createEventsReceived.increment() + } else { + otherEventsReceived.increment() + } + } + }() + + addWatch(t, watcher, testDir) + + if err := os.Symlink(filepath.Join(testDir, "zzz"), filepath.Join(testDir, "zzznew")); err != nil { + t.Fatalf("Failed to create bogus symlink: %s", err) + } + t.Logf("Created bogus symlink") + + // We expect this event to be received almost immediately, but let's wait 500 ms to be sure + time.Sleep(500 * time.Millisecond) + + // Should not be error, just no events for broken links (watching nothing) + if errorsReceived.value() > 0 { + t.Fatal("fsnotify errors have been received.") + } + if otherEventsReceived.value() > 0 { + t.Fatal("fsnotify other events received on the broken link") + } + + // Except for 1 create event (for the link itself) + if createEventsReceived.value() == 0 { + t.Fatal("fsnotify create events were not received after 500 ms") + } + if createEventsReceived.value() > 1 { + t.Fatal("fsnotify more create events received than expected") + } + + // Try closing the fsnotify instance + t.Log("calling Close()") + watcher.Close() +} + +func TestCyclicSymlink(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("symlinks don't work on Windows.") + } + + watcher := newWatcher(t) + + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + + link := path.Join(testDir, "link") + if err := os.Symlink(".", link); err != nil { + t.Fatalf("could not make symlink: %v", err) + } + addWatch(t, watcher, testDir) + + var createEventsReceived counter + go func() { + for ev := range watcher.Events { + if ev.Op&Create == Create { + createEventsReceived.increment() + } + } + }() + + if err := os.Remove(link); err != nil { + t.Fatalf("Error removing link: %v", err) + } + + // It would be nice to be able to expect a delete event here, but kqueue has + // no way for us to get events on symlinks themselves, because opening them + // opens an fd to the file to which they point. + + if err := ioutil.WriteFile(link, []byte("foo"), 0700); err != nil { + t.Fatalf("could not make symlink: %v", err) + } + + // We expect this event to be received almost immediately, but let's wait 500 ms to be sure + time.Sleep(500 * time.Millisecond) + + if got := createEventsReceived.value(); got == 0 { + t.Errorf("want at least 1 create event got %v", got) + } + + watcher.Close() +} + +// TestConcurrentRemovalOfWatch tests that concurrent calls to RemoveWatch do not race. +// See https://codereview.appspot.com/103300045/ +// go test -test.run=TestConcurrentRemovalOfWatch -test.cpu=1,1,1,1,1 -race +func TestConcurrentRemovalOfWatch(t *testing.T) { + if runtime.GOOS != "darwin" { + t.Skip("regression test for race only present on darwin") + } + + // Create directory to watch + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + + // Create a file before watching directory + testFileAlreadyExists := filepath.Join(testDir, "TestFsnotifyEventsExisting.testfile") + { + var f *os.File + f, err := os.OpenFile(testFileAlreadyExists, os.O_WRONLY|os.O_CREATE, 0666) + if err != nil { + t.Fatalf("creating test file failed: %s", err) + } + f.Sync() + f.Close() + } + + watcher := newWatcher(t) + defer watcher.Close() + + addWatch(t, watcher, testDir) + + // Test that RemoveWatch can be invoked concurrently, with no data races. + removed1 := make(chan struct{}) + go func() { + defer close(removed1) + watcher.Remove(testDir) + }() + removed2 := make(chan struct{}) + go func() { + close(removed2) + watcher.Remove(testDir) + }() + <-removed1 + <-removed2 +} + +func TestClose(t *testing.T) { + // Regression test for #59 bad file descriptor from Close + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + + watcher := newWatcher(t) + if err := watcher.Add(testDir); err != nil { + t.Fatalf("Expected no error on Add, got %v", err) + } + err := watcher.Close() + if err != nil { + t.Fatalf("Expected no error on Close, got %v.", err) + } +} + +// TestRemoveWithClose tests if one can handle Remove events and, at the same +// time, close Watcher object without any data races. +func TestRemoveWithClose(t *testing.T) { + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + + const fileN = 200 + tempFiles := make([]string, 0, fileN) + for i := 0; i < fileN; i++ { + tempFiles = append(tempFiles, tempMkFile(t, testDir)) + } + watcher := newWatcher(t) + if err := watcher.Add(testDir); err != nil { + t.Fatalf("Expected no error on Add, got %v", err) + } + startC, stopC := make(chan struct{}), make(chan struct{}) + errC := make(chan error) + go func() { + for { + select { + case <-watcher.Errors: + case <-watcher.Events: + case <-stopC: + return + } + } + }() + go func() { + <-startC + for _, fileName := range tempFiles { + os.Remove(fileName) + } + }() + go func() { + <-startC + errC <- watcher.Close() + }() + close(startC) + defer close(stopC) + if err := <-errC; err != nil { + t.Fatalf("Expected no error on Close, got %v.", err) + } +} + +func testRename(file1, file2 string) error { + switch runtime.GOOS { + case "windows", "plan9": + return os.Rename(file1, file2) + default: + cmd := exec.Command("mv", file1, file2) + return cmd.Run() + } +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/kqueue.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/kqueue.go new file mode 100644 index 0000000..c2b4acb --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/kqueue.go @@ -0,0 +1,503 @@ +// 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. + +// +build freebsd openbsd netbsd dragonfly darwin + +package fsnotify + +import ( + "errors" + "fmt" + "io/ioutil" + "os" + "path/filepath" + "sync" + "time" + + "golang.org/x/sys/unix" +) + +// Watcher watches a set of files, delivering events to a channel. +type Watcher struct { + Events chan Event + Errors chan error + done chan bool // Channel for sending a "quit message" to the reader goroutine + + kq int // File descriptor (as returned by the kqueue() syscall). + + mu sync.Mutex // Protects access to watcher data + watches map[string]int // Map of watched file descriptors (key: path). + externalWatches map[string]bool // Map of watches added by user of the library. + dirFlags map[string]uint32 // Map of watched directories to fflags used in kqueue. + paths map[int]pathInfo // Map file descriptors to path names for processing kqueue events. + fileExists map[string]bool // Keep track of if we know this file exists (to stop duplicate create events). + isClosed bool // Set to true when Close() is first called +} + +type pathInfo struct { + name string + isDir bool +} + +// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events. +func NewWatcher() (*Watcher, error) { + kq, err := kqueue() + if err != nil { + return nil, err + } + + w := &Watcher{ + kq: kq, + watches: make(map[string]int), + dirFlags: make(map[string]uint32), + paths: make(map[int]pathInfo), + fileExists: make(map[string]bool), + externalWatches: make(map[string]bool), + Events: make(chan Event), + Errors: make(chan error), + done: make(chan bool), + } + + go w.readEvents() + return w, nil +} + +// Close removes all watches and closes the events channel. +func (w *Watcher) Close() error { + w.mu.Lock() + if w.isClosed { + w.mu.Unlock() + return nil + } + w.isClosed = true + w.mu.Unlock() + + // copy paths to remove while locked + w.mu.Lock() + var pathsToRemove = make([]string, 0, len(w.watches)) + for name := range w.watches { + pathsToRemove = append(pathsToRemove, name) + } + w.mu.Unlock() + // unlock before calling Remove, which also locks + + var err error + for _, name := range pathsToRemove { + if e := w.Remove(name); e != nil && err == nil { + err = e + } + } + + // Send "quit" message to the reader goroutine: + w.done <- true + + return nil +} + +// Add starts watching the named file or directory (non-recursively). +func (w *Watcher) Add(name string) error { + w.mu.Lock() + w.externalWatches[name] = true + w.mu.Unlock() + _, err := w.addWatch(name, noteAllEvents) + return err +} + +// Remove stops watching the the named file or directory (non-recursively). +func (w *Watcher) Remove(name string) error { + name = filepath.Clean(name) + w.mu.Lock() + watchfd, ok := w.watches[name] + w.mu.Unlock() + if !ok { + return fmt.Errorf("can't remove non-existent kevent watch for: %s", name) + } + + const registerRemove = unix.EV_DELETE + if err := register(w.kq, []int{watchfd}, registerRemove, 0); err != nil { + return err + } + + unix.Close(watchfd) + + w.mu.Lock() + isDir := w.paths[watchfd].isDir + delete(w.watches, name) + delete(w.paths, watchfd) + delete(w.dirFlags, name) + w.mu.Unlock() + + // Find all watched paths that are in this directory that are not external. + if isDir { + var pathsToRemove []string + w.mu.Lock() + for _, path := range w.paths { + wdir, _ := filepath.Split(path.name) + if filepath.Clean(wdir) == name { + if !w.externalWatches[path.name] { + pathsToRemove = append(pathsToRemove, path.name) + } + } + } + w.mu.Unlock() + for _, name := range pathsToRemove { + // Since these are internal, not much sense in propagating error + // to the user, as that will just confuse them with an error about + // a path they did not explicitly watch themselves. + w.Remove(name) + } + } + + return nil +} + +// Watch all events (except NOTE_EXTEND, NOTE_LINK, NOTE_REVOKE) +const noteAllEvents = unix.NOTE_DELETE | unix.NOTE_WRITE | unix.NOTE_ATTRIB | unix.NOTE_RENAME + +// keventWaitTime to block on each read from kevent +var keventWaitTime = durationToTimespec(100 * time.Millisecond) + +// addWatch adds name to the watched file set. +// The flags are interpreted as described in kevent(2). +// Returns the real path to the file which was added, if any, which may be different from the one passed in the case of symlinks. +func (w *Watcher) addWatch(name string, flags uint32) (string, error) { + var isDir bool + // Make ./name and name equivalent + name = filepath.Clean(name) + + w.mu.Lock() + if w.isClosed { + w.mu.Unlock() + return "", errors.New("kevent instance already closed") + } + watchfd, alreadyWatching := w.watches[name] + // We already have a watch, but we can still override flags. + if alreadyWatching { + isDir = w.paths[watchfd].isDir + } + w.mu.Unlock() + + if !alreadyWatching { + fi, err := os.Lstat(name) + if err != nil { + return "", err + } + + // Don't watch sockets. + if fi.Mode()&os.ModeSocket == os.ModeSocket { + return "", nil + } + + // Don't watch named pipes. + if fi.Mode()&os.ModeNamedPipe == os.ModeNamedPipe { + return "", nil + } + + // Follow Symlinks + // Unfortunately, Linux can add bogus symlinks to watch list without + // issue, and Windows can't do symlinks period (AFAIK). To maintain + // consistency, we will act like everything is fine. There will simply + // be no file events for broken symlinks. + // Hence the returns of nil on errors. + if fi.Mode()&os.ModeSymlink == os.ModeSymlink { + name, err = filepath.EvalSymlinks(name) + if err != nil { + return "", nil + } + + w.mu.Lock() + _, alreadyWatching = w.watches[name] + w.mu.Unlock() + + if alreadyWatching { + return name, nil + } + + fi, err = os.Lstat(name) + if err != nil { + return "", nil + } + } + + watchfd, err = unix.Open(name, openMode, 0700) + if watchfd == -1 { + return "", err + } + + isDir = fi.IsDir() + } + + const registerAdd = unix.EV_ADD | unix.EV_CLEAR | unix.EV_ENABLE + if err := register(w.kq, []int{watchfd}, registerAdd, flags); err != nil { + unix.Close(watchfd) + return "", err + } + + if !alreadyWatching { + w.mu.Lock() + w.watches[name] = watchfd + w.paths[watchfd] = pathInfo{name: name, isDir: isDir} + w.mu.Unlock() + } + + if isDir { + // Watch the directory if it has not been watched before, + // or if it was watched before, but perhaps only a NOTE_DELETE (watchDirectoryFiles) + w.mu.Lock() + + watchDir := (flags&unix.NOTE_WRITE) == unix.NOTE_WRITE && + (!alreadyWatching || (w.dirFlags[name]&unix.NOTE_WRITE) != unix.NOTE_WRITE) + // Store flags so this watch can be updated later + w.dirFlags[name] = flags + w.mu.Unlock() + + if watchDir { + if err := w.watchDirectoryFiles(name); err != nil { + return "", err + } + } + } + return name, nil +} + +// readEvents reads from kqueue and converts the received kevents into +// Event values that it sends down the Events channel. +func (w *Watcher) readEvents() { + eventBuffer := make([]unix.Kevent_t, 10) + + for { + // See if there is a message on the "done" channel + select { + case <-w.done: + err := unix.Close(w.kq) + if err != nil { + w.Errors <- err + } + close(w.Events) + close(w.Errors) + return + default: + } + + // Get new events + kevents, err := read(w.kq, eventBuffer, &keventWaitTime) + // EINTR is okay, the syscall was interrupted before timeout expired. + if err != nil && err != unix.EINTR { + w.Errors <- err + continue + } + + // Flush the events we received to the Events channel + for len(kevents) > 0 { + kevent := &kevents[0] + watchfd := int(kevent.Ident) + mask := uint32(kevent.Fflags) + w.mu.Lock() + path := w.paths[watchfd] + w.mu.Unlock() + event := newEvent(path.name, mask) + + if path.isDir && !(event.Op&Remove == Remove) { + // Double check to make sure the directory exists. This can happen when + // we do a rm -fr on a recursively watched folders and we receive a + // modification event first but the folder has been deleted and later + // receive the delete event + if _, err := os.Lstat(event.Name); os.IsNotExist(err) { + // mark is as delete event + event.Op |= Remove + } + } + + if event.Op&Rename == Rename || event.Op&Remove == Remove { + w.Remove(event.Name) + w.mu.Lock() + delete(w.fileExists, event.Name) + w.mu.Unlock() + } + + if path.isDir && event.Op&Write == Write && !(event.Op&Remove == Remove) { + w.sendDirectoryChangeEvents(event.Name) + } else { + // Send the event on the Events channel + w.Events <- event + } + + if event.Op&Remove == Remove { + // Look for a file that may have overwritten this. + // For example, mv f1 f2 will delete f2, then create f2. + if path.isDir { + fileDir := filepath.Clean(event.Name) + w.mu.Lock() + _, found := w.watches[fileDir] + w.mu.Unlock() + if found { + // make sure the directory exists before we watch for changes. When we + // do a recursive watch and perform rm -fr, the parent directory might + // have gone missing, ignore the missing directory and let the + // upcoming delete event remove the watch from the parent directory. + if _, err := os.Lstat(fileDir); err == nil { + w.sendDirectoryChangeEvents(fileDir) + } + } + } else { + filePath := filepath.Clean(event.Name) + if fileInfo, err := os.Lstat(filePath); err == nil { + w.sendFileCreatedEventIfNew(filePath, fileInfo) + } + } + } + + // Move to next event + kevents = kevents[1:] + } + } +} + +// newEvent returns an platform-independent Event based on kqueue Fflags. +func newEvent(name string, mask uint32) Event { + e := Event{Name: name} + if mask&unix.NOTE_DELETE == unix.NOTE_DELETE { + e.Op |= Remove + } + if mask&unix.NOTE_WRITE == unix.NOTE_WRITE { + e.Op |= Write + } + if mask&unix.NOTE_RENAME == unix.NOTE_RENAME { + e.Op |= Rename + } + if mask&unix.NOTE_ATTRIB == unix.NOTE_ATTRIB { + e.Op |= Chmod + } + return e +} + +func newCreateEvent(name string) Event { + return Event{Name: name, Op: Create} +} + +// watchDirectoryFiles to mimic inotify when adding a watch on a directory +func (w *Watcher) watchDirectoryFiles(dirPath string) error { + // Get all files + files, err := ioutil.ReadDir(dirPath) + if err != nil { + return err + } + + for _, fileInfo := range files { + filePath := filepath.Join(dirPath, fileInfo.Name()) + filePath, err = w.internalWatch(filePath, fileInfo) + if err != nil { + return err + } + + w.mu.Lock() + w.fileExists[filePath] = true + w.mu.Unlock() + } + + return nil +} + +// sendDirectoryEvents searches the directory for newly created files +// and sends them over the event channel. This functionality is to have +// the BSD version of fsnotify match Linux inotify which provides a +// create event for files created in a watched directory. +func (w *Watcher) sendDirectoryChangeEvents(dirPath string) { + // Get all files + files, err := ioutil.ReadDir(dirPath) + if err != nil { + w.Errors <- err + } + + // Search for new files + for _, fileInfo := range files { + filePath := filepath.Join(dirPath, fileInfo.Name()) + err := w.sendFileCreatedEventIfNew(filePath, fileInfo) + + if err != nil { + return + } + } +} + +// sendFileCreatedEvent sends a create event if the file isn't already being tracked. +func (w *Watcher) sendFileCreatedEventIfNew(filePath string, fileInfo os.FileInfo) (err error) { + w.mu.Lock() + _, doesExist := w.fileExists[filePath] + w.mu.Unlock() + if !doesExist { + // Send create event + w.Events <- newCreateEvent(filePath) + } + + // like watchDirectoryFiles (but without doing another ReadDir) + filePath, err = w.internalWatch(filePath, fileInfo) + if err != nil { + return err + } + + w.mu.Lock() + w.fileExists[filePath] = true + w.mu.Unlock() + + return nil +} + +func (w *Watcher) internalWatch(name string, fileInfo os.FileInfo) (string, error) { + if fileInfo.IsDir() { + // mimic Linux providing delete events for subdirectories + // but preserve the flags used if currently watching subdirectory + w.mu.Lock() + flags := w.dirFlags[name] + w.mu.Unlock() + + flags |= unix.NOTE_DELETE | unix.NOTE_RENAME + return w.addWatch(name, flags) + } + + // watch file to mimic Linux inotify + return w.addWatch(name, noteAllEvents) +} + +// kqueue creates a new kernel event queue and returns a descriptor. +func kqueue() (kq int, err error) { + kq, err = unix.Kqueue() + if kq == -1 { + return kq, err + } + return kq, nil +} + +// register events with the queue +func register(kq int, fds []int, flags int, fflags uint32) error { + changes := make([]unix.Kevent_t, len(fds)) + + for i, fd := range fds { + // SetKevent converts int to the platform-specific types: + unix.SetKevent(&changes[i], fd, unix.EVFILT_VNODE, flags) + changes[i].Fflags = fflags + } + + // register the events + success, err := unix.Kevent(kq, changes, nil, nil) + if success == -1 { + return err + } + return nil +} + +// read retrieves pending events, or waits until an event occurs. +// A timeout of nil blocks indefinitely, while 0 polls the queue. +func read(kq int, events []unix.Kevent_t, timeout *unix.Timespec) ([]unix.Kevent_t, error) { + n, err := unix.Kevent(kq, nil, events, timeout) + if err != nil { + return nil, err + } + return events[0:n], nil +} + +// durationToTimespec prepares a timeout value +func durationToTimespec(d time.Duration) unix.Timespec { + return unix.NsecToTimespec(d.Nanoseconds()) +} diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/open_mode_bsd.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/open_mode_bsd.go new file mode 100644 index 0000000..7d8de14 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/open_mode_bsd.go @@ -0,0 +1,11 @@ +// 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. + +// +build freebsd openbsd netbsd dragonfly + +package fsnotify + +import "golang.org/x/sys/unix" + +const openMode = unix.O_NONBLOCK | unix.O_RDONLY diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/open_mode_darwin.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/open_mode_darwin.go new file mode 100644 index 0000000..9139e17 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/open_mode_darwin.go @@ -0,0 +1,12 @@ +// 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. + +// +build darwin + +package fsnotify + +import "golang.org/x/sys/unix" + +// note: this constant is not defined on BSD +const openMode = unix.O_EVTONLY diff --git a/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/windows.go b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/windows.go new file mode 100644 index 0000000..09436f3 --- /dev/null +++ b/api/cmd/k8s-config-reloader/vendor/gopkg.in/fsnotify.v1/windows.go @@ -0,0 +1,561 @@ +// 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. + +// +build windows + +package fsnotify + +import ( + "errors" + "fmt" + "os" + "path/filepath" + "runtime" + "sync" + "syscall" + "unsafe" +) + +// Watcher watches a set of files, delivering events to a channel. +type Watcher struct { + Events chan Event + Errors chan error + isClosed bool // Set to true when Close() is first called + mu sync.Mutex // Map access + port syscall.Handle // Handle to completion port + watches watchMap // Map of watches (key: i-number) + input chan *input // Inputs to the reader are sent on this channel + quit chan chan<- error +} + +// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events. +func NewWatcher() (*Watcher, error) { + port, e := syscall.CreateIoCompletionPort(syscall.InvalidHandle, 0, 0, 0) + if e != nil { + return nil, os.NewSyscallError("CreateIoCompletionPort", e) + } + w := &Watcher{ + port: port, + watches: make(watchMap), + input: make(chan *input, 1), + Events: make(chan Event, 50), + Errors: make(chan error), + quit: make(chan chan<- error, 1), + } + go w.readEvents() + return w, nil +} + +// Close removes all watches and closes the events channel. +func (w *Watcher) Close() error { + if w.isClosed { + return nil + } + w.isClosed = true + + // Send "quit" message to the reader goroutine + ch := make(chan error) + w.quit <- ch + if err := w.wakeupReader(); err != nil { + return err + } + return <-ch +} + +// Add starts watching the named file or directory (non-recursively). +func (w *Watcher) Add(name string) error { + if w.isClosed { + return errors.New("watcher already closed") + } + in := &input{ + op: opAddWatch, + path: filepath.Clean(name), + flags: sysFSALLEVENTS, + reply: make(chan error), + } + w.input <- in + if err := w.wakeupReader(); err != nil { + return err + } + return <-in.reply +} + +// Remove stops watching the the named file or directory (non-recursively). +func (w *Watcher) Remove(name string) error { + in := &input{ + op: opRemoveWatch, + path: filepath.Clean(name), + reply: make(chan error), + } + w.input <- in + if err := w.wakeupReader(); err != nil { + return err + } + return <-in.reply +} + +const ( + // Options for AddWatch + sysFSONESHOT = 0x80000000 + sysFSONLYDIR = 0x1000000 + + // Events + sysFSACCESS = 0x1 + sysFSALLEVENTS = 0xfff + sysFSATTRIB = 0x4 + sysFSCLOSE = 0x18 + sysFSCREATE = 0x100 + sysFSDELETE = 0x200 + sysFSDELETESELF = 0x400 + sysFSMODIFY = 0x2 + sysFSMOVE = 0xc0 + sysFSMOVEDFROM = 0x40 + sysFSMOVEDTO = 0x80 + sysFSMOVESELF = 0x800 + + // Special events + sysFSIGNORED = 0x8000 + sysFSQOVERFLOW = 0x4000 +) + +func newEvent(name string, mask uint32) Event { + e := Event{Name: name} + if mask&sysFSCREATE == sysFSCREATE || mask&sysFSMOVEDTO == sysFSMOVEDTO { + e.Op |= Create + } + if mask&sysFSDELETE == sysFSDELETE || mask&sysFSDELETESELF == sysFSDELETESELF { + e.Op |= Remove + } + if mask&sysFSMODIFY == sysFSMODIFY { + e.Op |= Write + } + if mask&sysFSMOVE == sysFSMOVE || mask&sysFSMOVESELF == sysFSMOVESELF || mask&sysFSMOVEDFROM == sysFSMOVEDFROM { + e.Op |= Rename + } + if mask&sysFSATTRIB == sysFSATTRIB { + e.Op |= Chmod + } + return e +} + +const ( + opAddWatch = iota + opRemoveWatch +) + +const ( + provisional uint64 = 1 << (32 + iota) +) + +type input struct { + op int + path string + flags uint32 + reply chan error +} + +type inode struct { + handle syscall.Handle + volume uint32 + index uint64 +} + +type watch struct { + ov syscall.Overlapped + ino *inode // i-number + path string // Directory path + mask uint64 // Directory itself is being watched with these notify flags + names map[string]uint64 // Map of names being watched and their notify flags + rename string // Remembers the old name while renaming a file + buf [4096]byte +} + +type indexMap map[uint64]*watch +type watchMap map[uint32]indexMap + +func (w *Watcher) wakeupReader() error { + e := syscall.PostQueuedCompletionStatus(w.port, 0, 0, nil) + if e != nil { + return os.NewSyscallError("PostQueuedCompletionStatus", e) + } + return nil +} + +func getDir(pathname string) (dir string, err error) { + attr, e := syscall.GetFileAttributes(syscall.StringToUTF16Ptr(pathname)) + if e != nil { + return "", os.NewSyscallError("GetFileAttributes", e) + } + if attr&syscall.FILE_ATTRIBUTE_DIRECTORY != 0 { + dir = pathname + } else { + dir, _ = filepath.Split(pathname) + dir = filepath.Clean(dir) + } + return +} + +func getIno(path string) (ino *inode, err error) { + h, e := syscall.CreateFile(syscall.StringToUTF16Ptr(path), + syscall.FILE_LIST_DIRECTORY, + syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE, + nil, syscall.OPEN_EXISTING, + syscall.FILE_FLAG_BACKUP_SEMANTICS|syscall.FILE_FLAG_OVERLAPPED, 0) + if e != nil { + return nil, os.NewSyscallError("CreateFile", e) + } + var fi syscall.ByHandleFileInformation + if e = syscall.GetFileInformationByHandle(h, &fi); e != nil { + syscall.CloseHandle(h) + return nil, os.NewSyscallError("GetFileInformationByHandle", e) + } + ino = &inode{ + handle: h, + volume: fi.VolumeSerialNumber, + index: uint64(fi.FileIndexHigh)<<32 | uint64(fi.FileIndexLow), + } + return ino, nil +} + +// Must run within the I/O thread. +func (m watchMap) get(ino *inode) *watch { + if i := m[ino.volume]; i != nil { + return i[ino.index] + } + return nil +} + +// Must run within the I/O thread. +func (m watchMap) set(ino *inode, watch *watch) { + i := m[ino.volume] + if i == nil { + i = make(indexMap) + m[ino.volume] = i + } + i[ino.index] = watch +} + +// Must run within the I/O thread. +func (w *Watcher) addWatch(pathname string, flags uint64) error { + dir, err := getDir(pathname) + if err != nil { + return err + } + if flags&sysFSONLYDIR != 0 && pathname != dir { + return nil + } + ino, err := getIno(dir) + if err != nil { + return err + } + w.mu.Lock() + watchEntry := w.watches.get(ino) + w.mu.Unlock() + if watchEntry == nil { + if _, e := syscall.CreateIoCompletionPort(ino.handle, w.port, 0, 0); e != nil { + syscall.CloseHandle(ino.handle) + return os.NewSyscallError("CreateIoCompletionPort", e) + } + watchEntry = &watch{ + ino: ino, + path: dir, + names: make(map[string]uint64), + } + w.mu.Lock() + w.watches.set(ino, watchEntry) + w.mu.Unlock() + flags |= provisional + } else { + syscall.CloseHandle(ino.handle) + } + if pathname == dir { + watchEntry.mask |= flags + } else { + watchEntry.names[filepath.Base(pathname)] |= flags + } + if err = w.startRead(watchEntry); err != nil { + return err + } + if pathname == dir { + watchEntry.mask &= ^provisional + } else { + watchEntry.names[filepath.Base(pathname)] &= ^provisional + } + return nil +} + +// Must run within the I/O thread. +func (w *Watcher) remWatch(pathname string) error { + dir, err := getDir(pathname) + if err != nil { + return err + } + ino, err := getIno(dir) + if err != nil { + return err + } + w.mu.Lock() + watch := w.watches.get(ino) + w.mu.Unlock() + if watch == nil { + return fmt.Errorf("can't remove non-existent watch for: %s", pathname) + } + if pathname == dir { + w.sendEvent(watch.path, watch.mask&sysFSIGNORED) + watch.mask = 0 + } else { + name := filepath.Base(pathname) + w.sendEvent(filepath.Join(watch.path, name), watch.names[name]&sysFSIGNORED) + delete(watch.names, name) + } + return w.startRead(watch) +} + +// Must run within the I/O thread. +func (w *Watcher) deleteWatch(watch *watch) { + for name, mask := range watch.names { + if mask&provisional == 0 { + w.sendEvent(filepath.Join(watch.path, name), mask&sysFSIGNORED) + } + delete(watch.names, name) + } + if watch.mask != 0 { + if watch.mask&provisional == 0 { + w.sendEvent(watch.path, watch.mask&sysFSIGNORED) + } + watch.mask = 0 + } +} + +// Must run within the I/O thread. +func (w *Watcher) startRead(watch *watch) error { + if e := syscall.CancelIo(watch.ino.handle); e != nil { + w.Errors <- os.NewSyscallError("CancelIo", e) + w.deleteWatch(watch) + } + mask := toWindowsFlags(watch.mask) + for _, m := range watch.names { + mask |= toWindowsFlags(m) + } + if mask == 0 { + if e := syscall.CloseHandle(watch.ino.handle); e != nil { + w.Errors <- os.NewSyscallError("CloseHandle", e) + } + w.mu.Lock() + delete(w.watches[watch.ino.volume], watch.ino.index) + w.mu.Unlock() + return nil + } + e := syscall.ReadDirectoryChanges(watch.ino.handle, &watch.buf[0], + uint32(unsafe.Sizeof(watch.buf)), false, mask, nil, &watch.ov, 0) + if e != nil { + err := os.NewSyscallError("ReadDirectoryChanges", e) + if e == syscall.ERROR_ACCESS_DENIED && watch.mask&provisional == 0 { + // Watched directory was probably removed + if w.sendEvent(watch.path, watch.mask&sysFSDELETESELF) { + if watch.mask&sysFSONESHOT != 0 { + watch.mask = 0 + } + } + err = nil + } + w.deleteWatch(watch) + w.startRead(watch) + return err + } + return nil +} + +// readEvents reads from the I/O completion port, converts the +// received events into Event objects and sends them via the Events channel. +// Entry point to the I/O thread. +func (w *Watcher) readEvents() { + var ( + n, key uint32 + ov *syscall.Overlapped + ) + runtime.LockOSThread() + + for { + e := syscall.GetQueuedCompletionStatus(w.port, &n, &key, &ov, syscall.INFINITE) + watch := (*watch)(unsafe.Pointer(ov)) + + if watch == nil { + select { + case ch := <-w.quit: + w.mu.Lock() + var indexes []indexMap + for _, index := range w.watches { + indexes = append(indexes, index) + } + w.mu.Unlock() + for _, index := range indexes { + for _, watch := range index { + w.deleteWatch(watch) + w.startRead(watch) + } + } + var err error + if e := syscall.CloseHandle(w.port); e != nil { + err = os.NewSyscallError("CloseHandle", e) + } + close(w.Events) + close(w.Errors) + ch <- err + return + case in := <-w.input: + switch in.op { + case opAddWatch: + in.reply <- w.addWatch(in.path, uint64(in.flags)) + case opRemoveWatch: + in.reply <- w.remWatch(in.path) + } + default: + } + continue + } + + switch e { + case syscall.ERROR_MORE_DATA: + if watch == nil { + w.Errors <- errors.New("ERROR_MORE_DATA has unexpectedly null lpOverlapped buffer") + } else { + // The i/o succeeded but the buffer is full. + // In theory we should be building up a full packet. + // In practice we can get away with just carrying on. + n = uint32(unsafe.Sizeof(watch.buf)) + } + case syscall.ERROR_ACCESS_DENIED: + // Watched directory was probably removed + w.sendEvent(watch.path, watch.mask&sysFSDELETESELF) + w.deleteWatch(watch) + w.startRead(watch) + continue + case syscall.ERROR_OPERATION_ABORTED: + // CancelIo was called on this handle + continue + default: + w.Errors <- os.NewSyscallError("GetQueuedCompletionPort", e) + continue + case nil: + } + + var offset uint32 + for { + if n == 0 { + w.Events <- newEvent("", sysFSQOVERFLOW) + w.Errors <- errors.New("short read in readEvents()") + break + } + + // Point "raw" to the event in the buffer + raw := (*syscall.FileNotifyInformation)(unsafe.Pointer(&watch.buf[offset])) + buf := (*[syscall.MAX_PATH]uint16)(unsafe.Pointer(&raw.FileName)) + name := syscall.UTF16ToString(buf[:raw.FileNameLength/2]) + fullname := filepath.Join(watch.path, name) + + var mask uint64 + switch raw.Action { + case syscall.FILE_ACTION_REMOVED: + mask = sysFSDELETESELF + case syscall.FILE_ACTION_MODIFIED: + mask = sysFSMODIFY + case syscall.FILE_ACTION_RENAMED_OLD_NAME: + watch.rename = name + case syscall.FILE_ACTION_RENAMED_NEW_NAME: + if watch.names[watch.rename] != 0 { + watch.names[name] |= watch.names[watch.rename] + delete(watch.names, watch.rename) + mask = sysFSMOVESELF + } + } + + sendNameEvent := func() { + if w.sendEvent(fullname, watch.names[name]&mask) { + if watch.names[name]&sysFSONESHOT != 0 { + delete(watch.names, name) + } + } + } + if raw.Action != syscall.FILE_ACTION_RENAMED_NEW_NAME { + sendNameEvent() + } + if raw.Action == syscall.FILE_ACTION_REMOVED { + w.sendEvent(fullname, watch.names[name]&sysFSIGNORED) + delete(watch.names, name) + } + if w.sendEvent(fullname, watch.mask&toFSnotifyFlags(raw.Action)) { + if watch.mask&sysFSONESHOT != 0 { + watch.mask = 0 + } + } + if raw.Action == syscall.FILE_ACTION_RENAMED_NEW_NAME { + fullname = filepath.Join(watch.path, watch.rename) + sendNameEvent() + } + + // Move to the next event in the buffer + if raw.NextEntryOffset == 0 { + break + } + offset += raw.NextEntryOffset + + // Error! + if offset >= n { + w.Errors <- errors.New("Windows system assumed buffer larger than it is, events have likely been missed.") + break + } + } + + if err := w.startRead(watch); err != nil { + w.Errors <- err + } + } +} + +func (w *Watcher) sendEvent(name string, mask uint64) bool { + if mask == 0 { + return false + } + event := newEvent(name, uint32(mask)) + select { + case ch := <-w.quit: + w.quit <- ch + case w.Events <- event: + } + return true +} + +func toWindowsFlags(mask uint64) uint32 { + var m uint32 + if mask&sysFSACCESS != 0 { + m |= syscall.FILE_NOTIFY_CHANGE_LAST_ACCESS + } + if mask&sysFSMODIFY != 0 { + m |= syscall.FILE_NOTIFY_CHANGE_LAST_WRITE + } + if mask&sysFSATTRIB != 0 { + m |= syscall.FILE_NOTIFY_CHANGE_ATTRIBUTES + } + if mask&(sysFSMOVE|sysFSCREATE|sysFSDELETE) != 0 { + m |= syscall.FILE_NOTIFY_CHANGE_FILE_NAME | syscall.FILE_NOTIFY_CHANGE_DIR_NAME + } + return m +} + +func toFSnotifyFlags(action uint32) uint64 { + switch action { + case syscall.FILE_ACTION_ADDED: + return sysFSCREATE + case syscall.FILE_ACTION_REMOVED: + return sysFSDELETE + case syscall.FILE_ACTION_MODIFIED: + return sysFSMODIFY + case syscall.FILE_ACTION_RENAMED_OLD_NAME: + return sysFSMOVEDFROM + case syscall.FILE_ACTION_RENAMED_NEW_NAME: + return sysFSMOVEDTO + } + return 0 +} diff --git a/api/cmd/vistio/main.go b/api/cmd/vistio/main.go new file mode 100644 index 0000000..75a0aff --- /dev/null +++ b/api/cmd/vistio/main.go @@ -0,0 +1,195 @@ +package main + +import ( + "fmt" + "os" + "os/signal" + "path/filepath" + "syscall" + + "github.com/nmnellis/vistio/api/api" + "github.com/nmnellis/vistio/api/cache" + "github.com/nmnellis/vistio/api/config" + "github.com/nmnellis/vistio/api/retrieval" + "github.com/nmnellis/vistio/api/storage" + "github.com/nmnellis/vistio/api/version" + "github.com/prometheus/client_golang/prometheus" + "go.uber.org/zap" + "gopkg.in/alecthomas/kingpin.v2" +) + +var ( + configSuccess = prometheus.NewGauge(prometheus.GaugeOpts{ + Namespace: "vistio", + Name: "config_last_reload_successful", + Help: "Whether the last configuration reload attempt was successful.", + }) +) + +func main() { + cfg := struct { + configFile string + logLevel string + storagePath string + + api api.Options + retrieval retrieval.Options + cache cache.Options + storage storage.Options + }{} + + a := kingpin.New(filepath.Base(os.Args[0]), "The Vistio server") + a.Version(version.Version) + a.HelpFlag.Short('h') + + a.Flag("config.file", "Vistio configuration file path."). + Default("/etc/vistio/vistio.yaml").StringVar(&cfg.configFile) + + a.Flag("log.level", "The level of logging."). + Default("info").StringVar(&cfg.logLevel) + + a.Flag("api.port", "Port to listen on for API requests."). + Default("9091").IntVar(&cfg.api.ListenPort) + + a.Flag("retrieval.scrape-interval", "How frequently to scrape metrics from prometheus servers."). + Default("10s").DurationVar(&cfg.retrieval.ScrapeInterval) + + a.Flag("retrieval.scrape-timeout", "How long until a scrape request times out."). + Default("8s").DurationVar(&cfg.retrieval.ScrapeTimeout) + + a.Flag("cache.size", "The maximum number of snapshots can be cached."). + Default("100").IntVar(&cfg.cache.Size) + + a.Flag("storage.path", "Base path of local storage for graph data."). + Default("/vistio").StringVar(&cfg.storagePath) + + a.Flag("storage.retention", "How long to retain graph data in the storage."). + Default("168h").DurationVar(&cfg.storage.Retention) + + _, err := a.Parse(os.Args[1:]) + if err != nil { + fmt.Printf("Failed to parse arguments: %v\n", err) + a.Usage(os.Args[1:]) + os.Exit(2) + } + + // TODO: log lever + logger, err := zap.NewProduction() + if err != nil { + os.Exit(2) + } + defer logger.Sync() + + registry := prometheus.NewRegistry() + registry.MustRegister( + prometheus.NewGoCollector(), + configSuccess) + + storageReady := make(chan struct{}) + var db storage.Storage + go func() { + defer close(storageReady) + var err error + db, err = storage.Open( + cfg.storagePath, + logger.With(zap.String("component", "storage")), + registry, + &cfg.storage, + ) + if err != nil { + logger.Error("Failed to open db", zap.Error(err)) + os.Exit(1) + } + }() + <-storageReady + defer db.Close() + + cfg.api.ConfigFile = cfg.configFile + cfg.api.Querier = db + cfg.retrieval.Appender = db + + retriever := retrieval.NewRetriever( + logger.With(zap.String("component", "retrieval")), + registry, + &cfg.retrieval, + ) + + if err := reloadConfig(cfg.configFile, logger, retriever); err != nil { + logger.Error("Failed to run first reloading config", zap.Error(err)) + } + + go retriever.Run() + defer retriever.Stop() + + cache := cache.NewCache( + logger.With(zap.String("component", "cache")), + registry, + &cfg.cache, + ) + defer cache.Reset() + + cfg.api.Cache = cache + apiHandler := api.NewHandler( + logger.With(zap.String("component", "api")), + registry, + &cfg.api, + ) + + logger.Info("Starting vistio", zap.String("info", version.String())) + errCh := make(chan error) + + go func() { + if err := apiHandler.Run(registry); err != nil { + errCh <- err + } + }() + defer apiHandler.Stop() + + go func() { + for { + rc := <-apiHandler.Reload() + if err := reloadConfig(cfg.configFile, logger, retriever); err != nil { + logger.Error("Failed to reload config", zap.Error(err)) + rc <- err + } else { + rc <- nil + } + } + }() + + sigCh := make(chan os.Signal, 1) + signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM) + + select { + case <-sigCh: + logger.Warn("Received SIGTERM, exiting gracefully...") + case err := <-errCh: + logger.Error("Got an error from errCh, exiting gracefully", zap.Error(err)) + } +} + +type Reloadable interface { + ApplyConfig(*config.Config) error +} + +func reloadConfig(path string, logger *zap.Logger, rl Reloadable) (err error) { + logger.Info("Loading configuration file", zap.String("filepath", path)) + + defer func() { + if err != nil { + configSuccess.Set(0) + } else { + configSuccess.Set(1) + } + }() + + cfg, err := config.LoadFile(path) + if err != nil { + return fmt.Errorf("Failed to load configuration (--config.file=%s): %v", path, err) + } + err = rl.ApplyConfig(cfg) + if err != nil { + return err + } + return nil +} diff --git a/api/config/config.go b/api/config/config.go new file mode 100644 index 0000000..e2421dc --- /dev/null +++ b/api/config/config.go @@ -0,0 +1,177 @@ +package config + +import ( + "fmt" + "io/ioutil" + "net/url" + "regexp" + "strings" + + yaml "gopkg.in/yaml.v2" +) + +func LoadFile(path string) (*Config, error) { + content, err := ioutil.ReadFile(path) + if err != nil { + return nil, err + } + cfg := &Config{} + *cfg = DefaultConfig + + err = yaml.Unmarshal(content, cfg) + if err != nil { + return nil, err + } + return cfg, nil +} + +var ( + DefaultConfig = Config{ + GraphName: "vistio", + } + + DefaultNodeMapping = NodeMapping{ + Label: "", + Regex: MustNewRegexp("(.*)"), + Replacement: "$1", + Class: "default", + } + + DefaultClass = Class{ + Name: "default", + Color: "rgb(186, 213, 237)", + } +) + +type Config struct { + GraphName string `yaml:"graphName"` + GlobalLevel GlobalLevel `yaml:"globalLevel"` + ClusterLevel []*Cluster `yaml:"clusterLevel"` + Classes []*Class `yaml:"classes,omitempty"` +} + +type GlobalLevel struct { + MaxVolume float64 `yaml:"maxVolume,omitempty"` + Connections []*Connection `yaml:"clusterConnections,omitempty"` +} + +type Cluster struct { + Cluster string `yaml:"cluster"` + MaxVolume float64 `yaml:"maxVolume,omitempty"` + Connections []*Connection `yaml:"serviceConnections,omitempty"` + NodeNotices []*NodeNotice `yaml:"serviceNotices,omitempty"` +} + +type Connection struct { + Query string `yaml:"query,omitempty"` + PrometheusURL string `yaml:"prometheusURL,omitempty"` + Source *NodeMapping `yaml:"source,omitempty"` + Target *NodeMapping `yaml:"target,omitempty"` + Status *Status `yaml:"status,omitempty"` + Notices []*ConnectionNotice `yaml:"notices,omitempty"` +} + +func (c *Connection) QueryLink() string { + promURL := strings.TrimSuffix(c.PrometheusURL, "/") + escapedQuery := url.QueryEscape(c.Query) + + return fmt.Sprintf("%s/graph?g0.expr=%s", promURL, escapedQuery) +} + +type Class struct { + Name string `yaml:"name"` + Color string `yaml:"color,omitempty"` +} + +type NodeNotice struct { + Title string `yaml:"title"` + SubTitle string `yaml:"subtitle"` + Link string `yaml:"link"` + Query string `yaml:"query,omitempty"` + PrometheusURL string `yaml:"prometheusURL,omitempty"` + SeverityThreshold SeverityThreshold `yaml:"severityThreshold"` + Service *NodeMapping `yaml:"service,omitempty"` +} + +func (nn *NodeNotice) QueryLink() string { + if nn.Link != "" { + return nn.Link + } + + promURL := strings.TrimSuffix(nn.PrometheusURL, "/") + escapedQuery := url.QueryEscape(nn.Query) + return fmt.Sprintf("%s/graph?g0.expr=%s", promURL, escapedQuery) +} + +type NodeMapping struct { + Label string `yaml:"label,omitempty"` + Regex Regexp `yaml:"regex,omitempty"` + Replacement string `yaml:"replacement,omitempty"` + Class string `yaml:"class,omitempty"` +} + +type Status struct { + Label string `yaml:"label"` + WarningRegex *Regexp `yaml:"warningRegex,omitempty"` + DangerRegex *Regexp `yaml:"dangerRegex,omitempty"` +} + +type ConnectionNotice struct { + Title string `yaml:"title"` + SubTitle string `yaml:"subtitle"` + Link string `yaml:"link"` + StatusType string `yaml:"statusType"` + SeverityThreshold SeverityThreshold `yaml:"severityThreshold"` +} + +type SeverityThreshold struct { + Info float64 `yaml:"info,omitempty"` + Warning float64 `yaml:"warning,omitempty"` + Error float64 `yaml:"error,omitempty"` +} + +type Regexp struct { + *regexp.Regexp + Original string +} + +func NewRegexp(s string) (Regexp, error) { + regex, err := regexp.Compile(s) + return Regexp{ + Regexp: regex, + Original: s, + }, err +} + +func MustNewRegexp(s string) Regexp { + re, err := NewRegexp(s) + if err != nil { + panic(err) + } + return re +} + +func (re *Regexp) UnmarshalYAML(unmarshal func(interface{}) error) error { + var s string + if err := unmarshal(&s); err != nil { + return err + } + r, err := NewRegexp(s) + if err != nil { + return err + } + *re = r + return nil +} + +func (nm *NodeMapping) UnmarshalYAML(unmarshal func(interface{}) error) error { + *nm = DefaultNodeMapping + type plain NodeMapping + if err := unmarshal((*plain)(nm)); err != nil { + return err + } + if nm.Label == "" && nm.Replacement == "" { + return fmt.Errorf("Invalid node mapping") + } + return nil +} diff --git a/api/config/config_test.go b/api/config/config_test.go new file mode 100644 index 0000000..043e073 --- /dev/null +++ b/api/config/config_test.go @@ -0,0 +1,26 @@ +package config + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestLoadSimpleConfig(t *testing.T) { + path := "testdata/good_simple.yaml" + cfg, err := LoadFile(path) + require.NoError(t, err) + require.NotNil(t, cfg) + + assert.Equal(t, "SimpleDemo", cfg.GraphName) +} + +func TestLoadFullConfig(t *testing.T) { + path := "testdata/good_full.yaml" + cfg, err := LoadFile(path) + require.NoError(t, err) + require.NotNil(t, cfg) + + assert.Equal(t, "Demo", cfg.GraphName) +} diff --git a/api/config/testdata/good_full.yaml b/api/config/testdata/good_full.yaml new file mode 100644 index 0000000..30a2c6c --- /dev/null +++ b/api/config/testdata/good_full.yaml @@ -0,0 +1,92 @@ +graphName: Demo + +globalLevel: + maxVolumeRate: 0.67 + clusterConnections: + - name: cluster + query: cluster:http_requests_total:rate2m + prometheusURL: http://localhost:9090 + source: + label: source + target: + label: target + status: + label: status + warningRegex: ^4..$ + dangerRegex: ^5..$ + +clusterLevel: + - cluster: demo-cluster-1 + maxVolumeRate: 0.04 + serviceConnections: + - name: http + query: status:http_requests_total:rate2m + prometheusURL: http://localhost:9090 + source: + replacement: INTERNET + target: + label: service + class: http-server + status: + label: status + warningRegex: ^4..$ + dangerRegex: ^5..$ + notices: + - name: highErrorRate + statusType: danger + threshold: 0.01 + title: HighErrorRate + severity: 1 + - name: grpc + query: client_code:grpc_server_requests_total:rate2m{client!=""} + prometheusURL: http://localhost:9090 + source: + label: client + target: + label: service + class: grpc-server + status: + label: code + dangerRegex: Internal + warningRegex: Unavailable|DataLoss + - name: redis + query: status:redis_client_cmds_total:rate2m + prometheusURL: http://localhost:9090 + source: + label: service + target: + label: dbname + class: redis + status: + label: status + dangerRegex: failed + - name: mongodb + query: status:mongodb_client_ops_total:rate2m + prometheusURL: http://localhost:9090 + source: + label: service + target: + label: dbname + class: mongodb + status: + label: status + dangerRegex: failed + serviceNotices: + - name: RedisHighErrorRate + title: High error rate + severity: 1 + link: http://localhost:9090 + query: sum by (dbname)(status:redis_client_cmds_total:rate2m{status="redis_nil"}) > 0 + prometheusURL: http://localhost:9090 + node: + label: dbname + +classes: + - name: http-server + color: rgb(128, 128, 150) + - name: grpc-server + color: rgb(128, 150, 128) + - name: redis + color: rgb(150, 128, 128) + - name: mongodb + color: rgb(128, 128, 128) \ No newline at end of file diff --git a/api/config/testdata/good_simple.yaml b/api/config/testdata/good_simple.yaml new file mode 100644 index 0000000..8c500ec --- /dev/null +++ b/api/config/testdata/good_simple.yaml @@ -0,0 +1,38 @@ +graphName: SimpleDemo + +globalLevel: + maxVolumeRate: 0.67 + clusterConnections: + - name: cluster + query: cluster:http_requests_total:rate2m + prometheusURL: http://localhost:9090 + source: + label: source + target: + label: target + status: + label: status + warningRegex: ^4..$ + dangerRegex: ^5..$ + +clusterLevel: + - cluster: demo-cluster-1 + maxVolumeRate: 0.04 + serviceConnections: + - name: http + query: status:http_requests_total:rate2m + prometheusURL: http://localhost:9090 + source: + replacement: INTERNET + target: + label: service + status: + label: status + warningRegex: ^4..$ + dangerRegex: ^5..$ + notices: + - name: highErrorRate + statusType: danger + threshold: 0.01 + title: HighErrorRate + severity: 1 \ No newline at end of file diff --git a/api/model/snapshot.go b/api/model/snapshot.go new file mode 100644 index 0000000..707ed43 --- /dev/null +++ b/api/model/snapshot.go @@ -0,0 +1,10 @@ +package model + +import ( + "time" +) + +type Snapshot struct { + Timestamp time.Time `json:"timestamp"` + GraphJSON string `json:"graphJSON"` +} diff --git a/api/model/snapshot_test.go b/api/model/snapshot_test.go new file mode 100644 index 0000000..8b53790 --- /dev/null +++ b/api/model/snapshot_test.go @@ -0,0 +1 @@ +package model diff --git a/api/model/vizceral.go b/api/model/vizceral.go new file mode 100644 index 0000000..d9a2c94 --- /dev/null +++ b/api/model/vizceral.go @@ -0,0 +1,61 @@ +package model + +type VizceralGraph struct { + Renderer string `json:"renderer"` + Name string `json:"name"` + MaxVolume float64 `json:"maxVolume,omitempty"` + ServerUpdateTime int64 `json:"serverUpdateTime"` + Nodes []*Node `json:"nodes"` + Connections []*Connection `json:"connections"` + Classes []*Class `json:"classes"` +} + +type Node struct { + Name string `json:"name"` + Renderer string `json:"renderer,omitempty"` + DisplayName string `json:"displayName,omitempty"` + Updated int64 `json:"updated,omitempty"` + MaxVolume float64 `json:"maxVolume,omitempty"` + Class string `json:"class,omitempty"` + Metadata *Metadata `json:"metadata"` + Nodes []*Node `json:"nodes,omitempty"` + Connections []*Connection `json:"connections"` + Notices []*Notice `json:"notices"` + // Props +} + +type Connection struct { + Source string `json:"source"` + Target string `json:"target"` + Class string `json:"class,omitempty"` + Metadata *Metadata `json:"metadata"` + Metrics *Metrics `json:"metrics"` + Notices []*Notice `json:"notices"` +} + +type Metadata struct { + Streaming int `json:"streaming"` +} + +type Notice struct { + Title string `json:"title"` + Subtitle string `json:"subtitle,omitempty"` + Link string `json:"link,omitempty"` + Severity int `json:"severity"` +} + +type Metrics struct { + Danger float64 `json:"danger"` + Warning float64 `json:"warning"` + Normal float64 `json:"normal"` +} + +type Class struct { + Name string `json:"name"` + Color string `json:"color"` +} + +type NodeConnectionSet struct { + Nodes []*Node + Connections []*Connection +} diff --git a/api/model/vizceral_test.go b/api/model/vizceral_test.go new file mode 100644 index 0000000..8b53790 --- /dev/null +++ b/api/model/vizceral_test.go @@ -0,0 +1 @@ +package model diff --git a/api/retrieval/generator.go b/api/retrieval/generator.go new file mode 100644 index 0000000..8ab078e --- /dev/null +++ b/api/retrieval/generator.go @@ -0,0 +1,478 @@ +package retrieval + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "html/template" + "time" + + "github.com/nmnellis/vistio/api/config" + "github.com/nmnellis/vistio/api/model" + prommodel "github.com/prometheus/common/model" + "go.uber.org/zap" + "golang.org/x/sync/errgroup" +) + +type generator struct { + logger *zap.Logger + cfg *config.Config + querier querier +} + +func (g *generator) generateSnapshot(ctx context.Context, ts time.Time) (*model.Snapshot, error) { + group, groupCtx := errgroup.WithContext(ctx) + var clusters *model.NodeConnectionSet + services := make(map[string]*model.NodeConnectionSet) + clusterMap := make(map[string]*config.Cluster, len(g.cfg.ClusterLevel)) + + group.Go(func() error { + cs, err := g.generateNodeConnectionSet(groupCtx, g.cfg.GlobalLevel.Connections, nil, ts, newClusterNode) + if err != nil { + return err + } + clusters = cs + return nil + }) + + for _, cluster := range g.cfg.ClusterLevel { + cluster := cluster + clusterMap[cluster.Cluster] = cluster + + group.Go(func() error { + ss, err := g.generateNodeConnectionSet(groupCtx, cluster.Connections, cluster.NodeNotices, ts, newServiceNode) + if err != nil { + return err + } + services[cluster.Cluster] = ss + return nil + }) + } + + if err := group.Wait(); err != nil { + return nil, err + } + + classes := make([]*model.Class, 0, len(g.cfg.Classes)) + found := false + for _, c := range g.cfg.Classes { + if c.Name == "default" { + found = true + } + classes = append(classes, &model.Class{ + Name: c.Name, + Color: c.Color, + }) + } + if !found { + classes = append(classes, &model.Class{ + Name: config.DefaultClass.Name, + Color: config.DefaultClass.Color, + }) + } + + for _, n := range clusters.Nodes { + if cluster, ok := services[n.Name]; ok { + n.Nodes = cluster.Nodes + n.Connections = cluster.Connections + n.MaxVolume = clusterMap[n.Name].MaxVolume // calculateMaxVolume(cluster.Nodes, cluster.Connections, clusterMap[n.Name].MaxVolumeRate) + } + } + + graph := &model.VizceralGraph{ + Renderer: "global", + Name: g.cfg.GraphName, + MaxVolume: g.cfg.GlobalLevel.MaxVolume, // calculateMaxVolume(clusters.Nodes, clusters.Connections, g.cfg.GlobalLevel.MaxVolumeRate), + ServerUpdateTime: ts.Unix(), + Nodes: clusters.Nodes, + Connections: clusters.Connections, + Classes: classes, + } + jsondata, err := json.Marshal(graph) + if err != nil { + return nil, err + } + + snapshot := &model.Snapshot{ + Timestamp: ts, + GraphJSON: string(jsondata), + } + + return snapshot, nil +} + +func (g *generator) generateNodeConnectionSet(ctx context.Context, cfgConns []*config.Connection, cfgNotices []*config.NodeNotice, ts time.Time, nodeFactory func(string) *model.Node) (*model.NodeConnectionSet, error) { + group, groupCtx := errgroup.WithContext(ctx) + groupConns := make([]([]*model.Connection), len(cfgConns), len(cfgConns)) + + for i, cfgConn := range cfgConns { + i, cfgConn := i, cfgConn + group.Go(func() error { + value, err := g.querier.Query(groupCtx, cfgConn.PrometheusURL, cfgConn.Query, ts) + if err != nil { + g.logger.Error("Failed to send prom query", + zap.Error(err), + zap.String("prometheusURL", cfgConn.PrometheusURL), + zap.String("query", cfgConn.Query), + ) + return err + } + vector, ok := value.(prommodel.Vector) + if !ok { + g.logger.Info("Unexpected type", zap.Any("value", value)) + return nil + } + groupConns[i] = g.generateConnections(vector, cfgConn) + return nil + }) + } + + groupNotices := make([](map[string][]*model.Notice), len(cfgNotices), len(cfgNotices)) + + for i, cfgNoti := range cfgNotices { + i, cfgNoti := i, cfgNoti + group.Go(func() error { + value, err := g.querier.Query(groupCtx, cfgNoti.PrometheusURL, cfgNoti.Query, ts) + if err != nil { + g.logger.Error("Failed to send promQuery", + zap.Error(err), + zap.String("prometheusURL", cfgNoti.PrometheusURL), + zap.String("query", cfgNoti.Query), + ) + // TODO: return nil or error + return nil + } + vector, ok := value.(prommodel.Vector) + if !ok { + g.logger.Info("Unexpected type", zap.Any("value", value)) + return nil + } + groupNotices[i] = g.generateNodeNotices(vector, cfgNoti) + return nil + }) + } + + if err := group.Wait(); err != nil { + g.logger.Error("Failed to generate NodeConnectionSet", zap.Error(err)) + // TODO: should fast return or not + // return nil, err + } + + nodeMap := make(map[string]*model.Node) + + for i, cfgConn := range cfgConns { + for _, conn := range groupConns[i] { + ns := []struct { + Name string + Class string + }{ + {conn.Source, cfgConn.Source.Class}, + {conn.Target, cfgConn.Target.Class}, + } + for _, n := range ns { + if _, ok := nodeMap[n.Name]; !ok { + nodeMap[n.Name] = nodeFactory(n.Name) + } + if n.Class != "" && (nodeMap[n.Name].Class == "" || nodeMap[n.Name].Class == "default") { + nodeMap[n.Name].Class = n.Class + } + } + } + } + + for i := range groupNotices { + for k, noti := range groupNotices[i] { + if node, ok := nodeMap[k]; ok { + node.Notices = append(node.Notices, noti...) + } + } + } + + nodes := make([]*model.Node, 0, len(nodeMap)) + for _, n := range nodeMap { + nodes = append(nodes, n) + } + + connections := make([]*model.Connection, 0) + for i := range groupConns { + connections = append(connections, groupConns[i]...) + } + + set := &model.NodeConnectionSet{ + Nodes: nodes, + Connections: connections, + } + + return set, nil +} + +func (g *generator) generateConnections(vector prommodel.Vector, conn *config.Connection) []*model.Connection { + type metrics struct { + Source string + Target string + All float64 + Normal float64 + Danger float64 + Warning float64 + } + metricMap := make(map[string]*metrics) + + for _, s := range vector { + source, err := extractNodeName(s, conn.Source) + if err != nil { + g.logger.Warn("Could not determine source node", + zap.Error(err), + zap.Any("source", conn.Source), + zap.Any("sample", s)) + continue + } + + target, err := extractNodeName(s, conn.Target) + if err != nil { + g.logger.Warn("Could not determine target node", + zap.Error(err), + zap.Any("target", conn.Target), zap.Error(err), + zap.Any("sample", s)) + continue + } + + key := fmt.Sprintf("%s/%s", source, target) + m, ok := metricMap[key] + if !ok { + m = &metrics{ + Source: string(source), + Target: string(target), + } + metricMap[key] = m + } + + m.All += float64(s.Value) + matched := false + if conn.Status != nil { + if status, ok := s.Metric[prommodel.LabelName(conn.Status.Label)]; ok { + if conn.Status.DangerRegex != nil { + if conn.Status.DangerRegex.Match([]byte(status)) { + m.Danger += float64(s.Value) + matched = true + } + } + if conn.Status.WarningRegex != nil && !matched { + if conn.Status.WarningRegex.Match([]byte(status)) { + m.Warning += float64(s.Value) + matched = true + } + } + } else { + g.logger.Warn("Could not find status label", + zap.String("label", conn.Status.Label), + zap.Any("sample", s)) + } + } + if !matched { + m.Normal += float64(s.Value) + } + } + + connections := make([]*model.Connection, 0, len(metricMap)) + for _, m := range metricMap { + vconn := &model.Connection{ + Source: m.Source, + Target: m.Target, + Metadata: &model.Metadata{ + Streaming: 1, + }, + Metrics: &model.Metrics{ + Normal: m.Normal, + Danger: m.Danger, + Warning: m.Warning, + }, + Notices: []*model.Notice{}, + } + + for _, notice := range conn.Notices { + rate := 0.0 + switch notice.StatusType { + case "danger": + rate = m.Danger / m.All + case "warning": + rate = m.Warning / m.All + } + + severity := -1 + switch { + case notice.SeverityThreshold.Error > 0 && rate >= notice.SeverityThreshold.Error: + severity = 2 + case notice.SeverityThreshold.Warning > 0 && rate >= notice.SeverityThreshold.Warning: + severity = 1 + case notice.SeverityThreshold.Info > 0 && rate >= notice.SeverityThreshold.Info: + severity = 0 + } + if severity < 0 { + continue + } + + t, err := template.New("title").Parse(notice.Title) + if err != nil { + continue + } + + title := notice.Title + var buf bytes.Buffer + labelMap := map[string]string{ + "value": fmt.Sprintf("%.5f", rate), + } + + if err = t.Execute(&buf, labelMap); err != nil { + g.logger.Error("Failed to execute rendering notice template", + zap.Error(err), + zap.String("title", title), + zap.Any("labelMap", labelMap)) + } + title = buf.String() + link := notice.Link + if link == "" { + link = conn.QueryLink() + } + + vconn.Notices = append(vconn.Notices, &model.Notice{ + Title: title, + Subtitle: notice.SubTitle, + Link: link, + Severity: severity, + }) + } + + connections = append(connections, vconn) + } + return connections +} + +func (g *generator) generateNodeNotices(vector prommodel.Vector, noti *config.NodeNotice) map[string][]*model.Notice { + notices := make(map[string][]*model.Notice) + for _, s := range vector { + logger := g.logger.With( + zap.Any("noti", noti), + zap.Any("sample", s)) + + node, err := extractNodeName(s, noti.Service) + if err != nil { + logger.Warn("Could not determine node", zap.Error(err)) + continue + } + + value := float64(s.Value) + severity := -1 + + switch { + case noti.SeverityThreshold.Error > 0 && value >= noti.SeverityThreshold.Error: + severity = 2 + case noti.SeverityThreshold.Warning > 0 && value >= noti.SeverityThreshold.Warning: + severity = 1 + case noti.SeverityThreshold.Info > 0 && value >= noti.SeverityThreshold.Info: + severity = 0 + } + if severity < 0 { + continue + } + + t, err := template.New("title").Parse(noti.Title) + if err != nil { + logger.Warn("Failed to parse notice title", zap.Error(err)) + continue + } + + title := noti.Title + labelMap := make(map[string]string, len(s.Metric)+1) + for k, v := range s.Metric { + labelMap[string(k)] = string(v) + } + labelMap["value"] = fmt.Sprintf("%.5f", value) + var buf bytes.Buffer + + if err = t.Execute(&buf, labelMap); err != nil { + logger.Error("Failed to execute rendering notice template", + zap.Error(err), + zap.Any("labelMap", labelMap)) + continue + } + title = buf.String() + + if _, ok := notices[node]; !ok { + notices[node] = make([]*model.Notice, 0) + } + + notices[node] = append(notices[node], &model.Notice{ + Title: title, + Subtitle: noti.SubTitle, + Link: noti.QueryLink(), + Severity: severity, + }) + } + return notices +} + +func extractNodeName(sample *prommodel.Sample, mapping *config.NodeMapping) (string, error) { + if mapping.Label == "" { + return mapping.Replacement, nil + } + + pv, ok := sample.Metric[prommodel.LabelName(mapping.Label)] + if !ok { + return "", fmt.Errorf("Not found label %s", mapping.Label) + } + value := string(pv) + if value == "" { + return "", fmt.Errorf("The value of label (%s) is empty", mapping.Label) + } + + indexes := mapping.Regex.FindStringSubmatchIndex(value) + res := mapping.Regex.ExpandString([]byte{}, mapping.Replacement, value, indexes) + return string(res), nil +} + +func calculateMaxVolume(nodes []*model.Node, connections []*model.Connection, maxVolumeRate float64) float64 { + if len(nodes) == 0 { + return 0 + } + + nodeMap := make(map[string]int, len(nodes)) + for _, c := range connections { + if c.Metrics != nil { + nodeMap[c.Source] += int(c.Metrics.Danger + c.Metrics.Warning + c.Metrics.Normal) + } + } + + max := 0 + for _, n := range nodeMap { + if max < n { + max = n + } + } + + if maxVolumeRate <= 0 || maxVolumeRate > 1 { + maxVolumeRate = 0.5 + } + + return float64(max) / maxVolumeRate +} + +func newServiceNode(name string) *model.Node { + return &model.Node{ + Name: name, + Renderer: "focusedChild", + Metadata: &model.Metadata{ + Streaming: 1, + }, + } +} + +func newClusterNode(name string) *model.Node { + return &model.Node{ + Name: name, + Renderer: "region", + Metadata: &model.Metadata{ + Streaming: 1, + }, + } +} diff --git a/api/retrieval/generator_test.go b/api/retrieval/generator_test.go new file mode 100644 index 0000000..9d8f040 --- /dev/null +++ b/api/retrieval/generator_test.go @@ -0,0 +1 @@ +package retrieval diff --git a/api/retrieval/promquery.go b/api/retrieval/promquery.go new file mode 100644 index 0000000..4da1ef5 --- /dev/null +++ b/api/retrieval/promquery.go @@ -0,0 +1,78 @@ +package retrieval + +import ( + "context" + "fmt" + "sync" + "time" + + "github.com/nmnellis/vistio/api/config" + "github.com/prometheus/client_golang/api/prometheus" + prommodel "github.com/prometheus/common/model" + "go.uber.org/zap" +) + +type querier interface { + Query(context.Context, string, string, time.Time) (prommodel.Value, error) + Stop() error +} + +type promClient struct { + addr string + client prometheus.Client + queryAPI prometheus.QueryAPI +} + +type prompool struct { + clients map[string]*promClient + mtx sync.Mutex +} + +func newQuerier(logger *zap.Logger, cfg *config.Config) (*prompool, error) { + addrs := make(map[string]struct{}, 0) + for _, conn := range cfg.GlobalLevel.Connections { + addrs[conn.PrometheusURL] = struct{}{} + } + for _, cluster := range cfg.ClusterLevel { + for _, conn := range cluster.Connections { + addrs[conn.PrometheusURL] = struct{}{} + } + for _, notice := range cluster.NodeNotices { + addrs[notice.PrometheusURL] = struct{}{} + } + } + delete(addrs, "") + + pq := &prompool{ + clients: make(map[string]*promClient, len(addrs)), + } + + for addr := range addrs { + c, err := prometheus.New(prometheus.Config{Address: addr}) + if err != nil { + return nil, err + } + a := prometheus.NewQueryAPI(c) + pq.clients[addr] = &promClient{ + addr: addr, + client: c, + queryAPI: a, + } + } + return pq, nil +} + +func (pp *prompool) Query(ctx context.Context, addr string, query string, ts time.Time) (prommodel.Value, error) { + pp.mtx.Lock() + client, _ := pp.clients[addr] + pp.mtx.Unlock() + + if client == nil { + return nil, fmt.Errorf("Could not send a query to unknown prometheus addr (addr=%s)", addr) + } + return client.queryAPI.Query(ctx, query, ts) +} + +func (pp *prompool) Stop() error { + return nil +} diff --git a/api/retrieval/promquery_test.go b/api/retrieval/promquery_test.go new file mode 100644 index 0000000..9d8f040 --- /dev/null +++ b/api/retrieval/promquery_test.go @@ -0,0 +1 @@ +package retrieval diff --git a/api/retrieval/retriever.go b/api/retrieval/retriever.go new file mode 100644 index 0000000..fd113f5 --- /dev/null +++ b/api/retrieval/retriever.go @@ -0,0 +1,212 @@ +package retrieval + +import ( + "context" + "errors" + "strconv" + "sync" + "time" + + "github.com/nmnellis/vistio/api/config" + "github.com/nmnellis/vistio/api/storage" + "github.com/prometheus/client_golang/prometheus" + "go.uber.org/zap" +) + +var ( + namespace = "vistio" + subsystem = "retriver" + + ErrConfigNotSet = errors.New("Config has been not set") +) + +type Retriever interface { + Run() + Stop() + ApplyConfig(*config.Config) error +} + +type Options struct { + ScrapeInterval time.Duration + ScrapeTimeout time.Duration + Appender storage.Appender +} + +type retrieverMetrics struct { + ops *prometheus.CounterVec + opLatency *prometheus.SummaryVec +} + +func newRetrieverMetrics(r prometheus.Registerer) *retrieverMetrics { + m := &retrieverMetrics{ + ops: prometheus.NewCounterVec(prometheus.CounterOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "ops_total", + Help: "Total number of handled ops.", + }, + []string{"op", "status"}, + ), + opLatency: prometheus.NewSummaryVec(prometheus.SummaryOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "op_latency_seconds", + Help: "Latency for handling op.", + }, + []string{"op", "status"}, + ), + } + + if r != nil { + r.MustRegister( + m.ops, + m.opLatency, + ) + } + return m +} + +type retriever struct { + logger *zap.Logger + options *Options + config *config.Config + metrics *retrieverMetrics + + appender storage.Appender + querier querier + queue chan time.Time + + mtx sync.RWMutex + ctx context.Context + cancel func() + doneCh chan struct{} +} + +func NewRetriever(logger *zap.Logger, r prometheus.Registerer, opts *Options) Retriever { + ctx, cancel := context.WithCancel(context.Background()) + + return &retriever{ + logger: logger, + options: opts, + metrics: newRetrieverMetrics(r), + + appender: opts.Appender, + queue: make(chan time.Time, 10), + + ctx: ctx, + cancel: cancel, + doneCh: make(chan struct{}), + } +} + +func (r *retriever) Run() { + r.logger.Info("Starting retriever...") + defer close(r.doneCh) + + retrieve := func(ts time.Time) { + r.logger.Info("Retrieve prometheus data and generate graph data") + ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(r.options.ScrapeTimeout)) + r.retrieve(ctx, ts) + cancel() + } + retrieve(time.Now()) + + go func() { + for { + select { + case <-r.ctx.Done(): + return + + case ts := <-r.queue: + retrieve(ts) + } + } + }() + + ticker := time.NewTicker(r.options.ScrapeInterval) + defer ticker.Stop() + + for { + select { + case <-r.ctx.Done(): + return + case ts := <-ticker.C: + r.queue <- ts + } + } +} + +func (r *retriever) Stop() { + r.mtx.Lock() + defer r.mtx.Unlock() + + select { + case <-r.doneCh: + r.logger.Warn("Already stopped") + return + default: + } + + r.logger.Info("Stopping retriever...") + r.cancel() + <-r.doneCh +} + +func (r *retriever) ApplyConfig(cfg *config.Config) error { + q, err := newQuerier(r.logger, cfg) + if err != nil { + return err + } + + r.mtx.Lock() + defer r.mtx.Unlock() + + r.config = cfg + r.querier = q + r.logger.Info("Applied new configuration") + + return nil +} + +func (r *retriever) retrieve(ctx context.Context, ts time.Time) (err error) { + defer track(r.metrics, "Retrieve")(&err) + + r.mtx.RLock() + cfg := r.config + querier := r.querier + r.mtx.RUnlock() + + if cfg == nil { + r.logger.Warn("Config has not been set") + return ErrConfigNotSet + } + + g := &generator{ + logger: r.logger, + cfg: cfg, + querier: querier, + } + + snapshot, err := g.generateSnapshot(ctx, ts) + if err != nil { + r.logger.Error("Failed to generate graph data", zap.Error(err)) + return + } + + err = r.appender.Add(snapshot) + if err != nil { + r.logger.Error("Failed to add snapshot to storage", zap.Error(err)) + return + } + + return +} + +func track(metrics *retrieverMetrics, op string) func(*error) { + start := time.Now() + return func(err *error) { + s := strconv.FormatBool(*err == nil) + metrics.ops.WithLabelValues(op, s).Inc() + metrics.opLatency.WithLabelValues(op, s).Observe(time.Since(start).Seconds()) + } +} diff --git a/api/retrieval/retriever_test.go b/api/retrieval/retriever_test.go new file mode 100644 index 0000000..9d8f040 --- /dev/null +++ b/api/retrieval/retriever_test.go @@ -0,0 +1 @@ +package retrieval diff --git a/api/storage/chunk.go b/api/storage/chunk.go new file mode 100644 index 0000000..3357db6 --- /dev/null +++ b/api/storage/chunk.go @@ -0,0 +1,117 @@ +package storage + +import ( + "encoding/json" + "errors" + "time" + + "github.com/nmnellis/vistio/api/model" +) + +const ChunkLength = 5 * time.Minute + +var ErrAddToCompletedChunk = errors.New("Unabled to add a new snapshot into a completed chunk") + +type Chunk interface { + ID() int64 + SetCompleted(bool) + IsCompleted() bool + Len() int + Clone() Chunk + + Add(*model.Snapshot) error + + Iterator() ChunkIterator + + Marshal() ([]byte, error) + Unmarshal([]byte) error +} + +type ChunkIterator interface { + FindBestSnapshot(time.Time) *model.Snapshot +} + +type chunk struct { + TimestampID int64 `json:"id"` + SortedSnapshots []*model.Snapshot `json:"snapshots"` + Completed bool `json:"completed"` +} + +func NewChunk(id int64) Chunk { + return &chunk{ + TimestampID: id, + SortedSnapshots: make([]*model.Snapshot, 0), + } +} + +func ChunkID(ts time.Time) int64 { + length := int64(ChunkLength / time.Second) + return (ts.Unix() / length) * length +} + +func (c *chunk) ID() int64 { + return c.TimestampID +} + +func (c *chunk) SetCompleted(completed bool) { + c.Completed = completed +} + +func (c *chunk) IsCompleted() bool { + return c.Completed +} + +func (c *chunk) Len() int { + return len(c.SortedSnapshots) +} + +func (c *chunk) Clone() Chunk { + nc := NewChunk(c.TimestampID).(*chunk) + for _, ss := range c.SortedSnapshots { + snapshot := &model.Snapshot{} + *snapshot = *ss + nc.SortedSnapshots = append(nc.SortedSnapshots, snapshot) + } + return nc +} + +func (c *chunk) Add(snapshot *model.Snapshot) error { + if c.Completed { + return ErrAddToCompletedChunk + } + + c.SortedSnapshots = append(c.SortedSnapshots, snapshot) + for i := len(c.SortedSnapshots) - 1; i > 0; i-- { + if c.SortedSnapshots[i].Timestamp.Before(c.SortedSnapshots[i-1].Timestamp) { + tmp := c.SortedSnapshots[i-1] + c.SortedSnapshots[i-1] = c.SortedSnapshots[i] + c.SortedSnapshots[i] = tmp + } + } + return nil +} + +func (c *chunk) Iterator() ChunkIterator { + return c +} + +func (c *chunk) FindBestSnapshot(ts time.Time) *model.Snapshot { + if len(c.SortedSnapshots) == 0 { + return nil + } + for i := len(c.SortedSnapshots) - 1; i >= 0; i-- { + if ts.After(c.SortedSnapshots[i].Timestamp) { + return c.SortedSnapshots[i] + } + } + // TODO: should returns nil and load pre chunk to get more better one + return c.SortedSnapshots[0] +} + +func (c *chunk) Marshal() ([]byte, error) { + return json.Marshal(c) +} + +func (c *chunk) Unmarshal(data []byte) error { + return json.Unmarshal(data, c) +} diff --git a/api/storage/chunk_test.go b/api/storage/chunk_test.go new file mode 100644 index 0000000..82be054 --- /dev/null +++ b/api/storage/chunk_test.go @@ -0,0 +1 @@ +package storage diff --git a/api/storage/interface.go b/api/storage/interface.go new file mode 100644 index 0000000..2d2c876 --- /dev/null +++ b/api/storage/interface.go @@ -0,0 +1,20 @@ +package storage + +import ( + "github.com/nmnellis/vistio/api/model" +) + +type Storage interface { + Appender + Querier + Close() error +} + +type Appender interface { + Add(*model.Snapshot) error +} + +type Querier interface { + GetChunk(int64) (Chunk, error) + GetLatestSnapshot() (*model.Snapshot, error) +} diff --git a/api/storage/storage.go b/api/storage/storage.go new file mode 100644 index 0000000..0e927d4 --- /dev/null +++ b/api/storage/storage.go @@ -0,0 +1,329 @@ +package storage + +import ( + "context" + "errors" + "fmt" + "io/ioutil" + "os" + "path/filepath" + "strconv" + "strings" + "sync" + "time" + + "github.com/nmnellis/vistio/api/model" + "github.com/prometheus/client_golang/prometheus" + "go.uber.org/zap" +) + +const chunkBlockLength = time.Hour + +var ( + namespace = "vistio" + subsystem = "storage" + + ErrNotFound = errors.New("Not found") + ErrDBClosed = errors.New("DB already closed") +) + +type storageMetrics struct { + ops *prometheus.CounterVec + opLatency *prometheus.SummaryVec +} + +func newStorageMetrics(r prometheus.Registerer) *storageMetrics { + m := &storageMetrics{ + ops: prometheus.NewCounterVec(prometheus.CounterOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "ops_total", + Help: "Total number of handled ops.", + }, + []string{"op", "status"}, + ), + opLatency: prometheus.NewSummaryVec(prometheus.SummaryOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "op_latency_seconds", + Help: "Latency for handling op.", + }, + []string{"op", "status"}, + ), + } + + if r != nil { + r.MustRegister( + m.ops, + m.opLatency, + ) + } + return m +} + +type Options struct { + Retention time.Duration +} + +type storage struct { + dbDir string + logger *zap.Logger + options *Options + metrics *storageMetrics + + latestSnapshot *model.Snapshot + latestChunk Chunk + + mtx sync.RWMutex + ctx context.Context + cancel func() + doneCh chan struct{} +} + +func Open(path string, logger *zap.Logger, r prometheus.Registerer, opts *Options) (Storage, error) { + dbDir := strings.TrimSuffix(path, "/") + if err := mkdirIfNotExist(dbDir); err != nil { + return nil, err + } + ctx, cancel := context.WithCancel(context.Background()) + + s := &storage{ + dbDir: dbDir, + logger: logger, + options: opts, + metrics: newStorageMetrics(r), + ctx: ctx, + cancel: cancel, + doneCh: make(chan struct{}), + } + + chunkID := ChunkID(time.Now()) + latestChunk, err := s.loadChunk(chunkID) + if err != nil { + s.logger.Info("Not found current chunk from disk. (A new chunk will be created)", zap.Error(err)) + latestChunk = NewChunk(chunkID) + } + + latestChunk.SetCompleted(false) + s.latestChunk = latestChunk + go s.Run() + + return s, nil +} + +func (s *storage) Add(snapshot *model.Snapshot) (err error) { + defer track(s.metrics, "Add")(&err) + if snapshot == nil { + s.logger.Error("Snapshot is nil") + return + } + + chunkID := ChunkID(snapshot.Timestamp) + s.mtx.Lock() + defer s.mtx.Unlock() + + select { + case <-s.ctx.Done(): + return ErrDBClosed + default: + } + + logger := s.logger.With( + zap.Time("ts", snapshot.Timestamp), + zap.Int64("chunkID", chunkID)) + + old := s.latestSnapshot != nil && s.latestSnapshot.Timestamp.After(snapshot.Timestamp) + if !old { + s.latestSnapshot = snapshot + } + + if s.latestChunk == nil { + s.latestChunk = NewChunk(chunkID) + } + + switch { + case s.latestChunk.ID() == chunkID: + if err = s.latestChunk.Add(snapshot); err != nil { + logger.Error("Failed to add a new snapshot into a chunk", zap.Error(err)) + return + } + + case s.latestChunk.ID() < chunkID: + s.latestChunk.SetCompleted(true) + s.saveChunk(s.latestChunk) + s.latestChunk = NewChunk(chunkID) + s.latestChunk.Add(snapshot) + + default: + logger.Warn("Unabled to add too old snapshot") + } + + return +} + +func (s *storage) GetChunk(chunkID int64) (chunk Chunk, err error) { + defer track(s.metrics, "GetChunk")(&err) + s.mtx.RLock() + defer s.mtx.RUnlock() + + if s.latestChunk.ID() == chunkID { + chunk = s.latestChunk.Clone() + return + } + chunk, err = s.loadChunk(chunkID) + return +} + +func (s *storage) GetLatestSnapshot() (snapshot *model.Snapshot, err error) { + defer track(s.metrics, "GetLatestSnapshot")(&err) + s.mtx.RLock() + defer s.mtx.RUnlock() + + snapshot = s.latestSnapshot + if snapshot == nil { + err = ErrNotFound + } + return +} + +func (s *storage) Run() { + ticker := time.NewTicker(30 * time.Minute) + defer func() { + ticker.Stop() + close(s.doneCh) + }() + + for { + select { + case <-s.ctx.Done(): + return + + case <-ticker.C: + s.retentionCutoff() + } + } +} + +func (s *storage) Close() error { + s.mtx.Lock() + defer s.mtx.Unlock() + + select { + case <-s.doneCh: + s.logger.Warn("Already closed") + return ErrDBClosed + default: + } + s.cancel() + + s.latestChunk.SetCompleted(true) + err := s.saveChunk(s.latestChunk) + if err != nil { + s.logger.Error("Failed to save chunk to disk", zap.Error(err)) + } + <-s.doneCh + + return err +} + +func (s *storage) saveChunk(chunk Chunk) error { + data, err := chunk.Marshal() + if err != nil { + s.logger.Error("Failed to marshal chunk", + zap.Error(err), + zap.Any("chunk", chunk)) + return err + } + + bpath, cpath := chunkPath(s.dbDir, chunk.ID()) + if err := mkdirIfNotExist(bpath); err != nil { + s.logger.Error("Failed to create block directory", zap.Error(err)) + return err + } + + if err := ioutil.WriteFile(cpath, data, 0644); err != nil { + s.logger.Error("Failed to write chunk to disk", zap.Error(err)) + return err + } + return nil +} + +func (s *storage) loadChunk(chunkID int64) (Chunk, error) { + _, cpath := chunkPath(s.dbDir, chunkID) + data, err := ioutil.ReadFile(cpath) + if err != nil { + return nil, err + } + + chunk := NewChunk(chunkID) + if err = chunk.Unmarshal(data); err != nil { + return nil, err + } + + return chunk, nil +} + +func chunkPath(dbDir string, chunkID int64) (blockPath string, chunkPath string) { + bl := int64(chunkBlockLength.Seconds()) + blockTs := (chunkID / bl) * bl + + blockPath = fmt.Sprintf("%s/%d", dbDir, blockTs) + chunkPath = fmt.Sprintf("%s/%d.json", blockPath, chunkID) + return +} + +func (s *storage) retentionCutoff() (err error) { + defer track(s.metrics, "RetentionCutoff")(&err) + mints := time.Now().Add(-s.options.Retention - chunkBlockLength).Unix() + + if err = retentionCutoff(s.dbDir, mints); err != nil { + s.logger.Error("Failed to cutoff old data", zap.Error(err)) + return + } + return +} + +func retentionCutoff(dbDir string, mints int64) error { + files, err := ioutil.ReadDir(dbDir) + if err != nil { + return err + } + var dirs []string + + for _, f := range files { + if !f.IsDir() { + continue + } + ts, err := strconv.ParseInt(f.Name(), 10, 64) + if err != nil { + continue + } + if ts > mints { + continue + } + dirs = append(dirs, filepath.Join(dbDir, f.Name())) + } + + for _, dir := range dirs { + if err := os.RemoveAll(dir); err != nil { + return err + } + } + return nil +} + +func mkdirIfNotExist(dir string) error { + if _, err := os.Stat(dir); os.IsNotExist(err) { + return os.MkdirAll(dir, 0755) + } + return nil +} + +func track(metrics *storageMetrics, op string) func(*error) { + start := time.Now() + return func(err *error) { + s := strconv.FormatBool(*err == nil) + metrics.ops.WithLabelValues(op, s).Inc() + metrics.opLatency.WithLabelValues(op, s).Observe(time.Since(start).Seconds()) + } +} diff --git a/api/storage/storage_test.go b/api/storage/storage_test.go new file mode 100644 index 0000000..82be054 --- /dev/null +++ b/api/storage/storage_test.go @@ -0,0 +1 @@ +package storage diff --git a/api/storage/storagemock/Storage.go b/api/storage/storagemock/Storage.go new file mode 100644 index 0000000..c9f8e8f --- /dev/null +++ b/api/storage/storagemock/Storage.go @@ -0,0 +1,86 @@ +package storagemock + +import mock "github.com/stretchr/testify/mock" +import model "github.com/nmnellis/vistio/api/model" +import storage "github.com/nmnellis/vistio/api/storage" + +// Storage is an autogenerated mock type for the Storage type +type Storage struct { + mock.Mock +} + +// Add provides a mock function with given fields: _a0 +func (_m *Storage) Add(_a0 *model.Snapshot) error { + ret := _m.Called(_a0) + + var r0 error + if rf, ok := ret.Get(0).(func(*model.Snapshot) error); ok { + r0 = rf(_a0) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// Close provides a mock function with given fields: +func (_m *Storage) Close() error { + ret := _m.Called() + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// GetChunk provides a mock function with given fields: _a0 +func (_m *Storage) GetChunk(_a0 int64) (storage.Chunk, error) { + ret := _m.Called(_a0) + + var r0 storage.Chunk + if rf, ok := ret.Get(0).(func(int64) storage.Chunk); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(storage.Chunk) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(int64) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetLatestSnapshot provides a mock function with given fields: +func (_m *Storage) GetLatestSnapshot() (*model.Snapshot, error) { + ret := _m.Called() + + var r0 *model.Snapshot + if rf, ok := ret.Get(0).(func() *model.Snapshot); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*model.Snapshot) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +var _ storage.Storage = (*Storage)(nil) diff --git a/api/vendor/github.com/alecthomas/template/LICENSE b/api/vendor/github.com/alecthomas/template/LICENSE new file mode 100644 index 0000000..7448756 --- /dev/null +++ b/api/vendor/github.com/alecthomas/template/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2012 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/api/vendor/github.com/alecthomas/template/README.md b/api/vendor/github.com/alecthomas/template/README.md new file mode 100644 index 0000000..ef6a8ee --- /dev/null +++ b/api/vendor/github.com/alecthomas/template/README.md @@ -0,0 +1,25 @@ +# Go's `text/template` package with newline elision + +This is a fork of Go 1.4's [text/template](http://golang.org/pkg/text/template/) package with one addition: a backslash immediately after a closing delimiter will delete all subsequent newlines until a non-newline. + +eg. + +``` +{{if true}}\ +hello +{{end}}\ +``` + +Will result in: + +``` +hello\n +``` + +Rather than: + +``` +\n +hello\n +\n +``` diff --git a/api/vendor/github.com/alecthomas/template/doc.go b/api/vendor/github.com/alecthomas/template/doc.go new file mode 100644 index 0000000..223c595 --- /dev/null +++ b/api/vendor/github.com/alecthomas/template/doc.go @@ -0,0 +1,406 @@ +// 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 template implements data-driven templates for generating textual output. + +To generate HTML output, see package html/template, which has the same interface +as this package but automatically secures HTML output against certain attacks. + +Templates are executed by applying them to a data structure. Annotations in the +template refer to elements of the data structure (typically a field of a struct +or a key in a map) to control execution and derive values to be displayed. +Execution of the template walks the structure and sets the cursor, represented +by a period '.' and called "dot", to the value at the current location in the +structure as execution proceeds. + +The input text for a template is UTF-8-encoded text in any format. +"Actions"--data evaluations or control structures--are delimited by +"{{" and "}}"; all text outside actions is copied to the output unchanged. +Actions may not span newlines, although comments can. + +Once parsed, a template may be executed safely in parallel. + +Here is a trivial example that prints "17 items are made of wool". + + type Inventory struct { + Material string + Count uint + } + sweaters := Inventory{"wool", 17} + tmpl, err := template.New("test").Parse("{{.Count}} items are made of {{.Material}}") + if err != nil { panic(err) } + err = tmpl.Execute(os.Stdout, sweaters) + if err != nil { panic(err) } + +More intricate examples appear below. + +Actions + +Here is the list of actions. "Arguments" and "pipelines" are evaluations of +data, defined in detail below. + +*/ +// {{/* a comment */}} +// A comment; discarded. May contain newlines. +// Comments do not nest and must start and end at the +// delimiters, as shown here. +/* + + {{pipeline}} + The default textual representation of the value of the pipeline + is copied to the output. + + {{if pipeline}} T1 {{end}} + If the value of the pipeline is empty, no output is generated; + otherwise, T1 is executed. The empty values are false, 0, any + nil pointer or interface value, and any array, slice, map, or + string of length zero. + Dot is unaffected. + + {{if pipeline}} T1 {{else}} T0 {{end}} + If the value of the pipeline is empty, T0 is executed; + otherwise, T1 is executed. Dot is unaffected. + + {{if pipeline}} T1 {{else if pipeline}} T0 {{end}} + To simplify the appearance of if-else chains, the else action + of an if may include another if directly; the effect is exactly + the same as writing + {{if pipeline}} T1 {{else}}{{if pipeline}} T0 {{end}}{{end}} + + {{range pipeline}} T1 {{end}} + The value of the pipeline must be an array, slice, map, or channel. + If the value of the pipeline has length zero, nothing is output; + otherwise, dot is set to the successive elements of the array, + slice, or map and T1 is executed. If the value is a map and the + keys are of basic type with a defined order ("comparable"), the + elements will be visited in sorted key order. + + {{range pipeline}} T1 {{else}} T0 {{end}} + The value of the pipeline must be an array, slice, map, or channel. + If the value of the pipeline has length zero, dot is unaffected and + T0 is executed; otherwise, dot is set to the successive elements + of the array, slice, or map and T1 is executed. + + {{template "name"}} + The template with the specified name is executed with nil data. + + {{template "name" pipeline}} + The template with the specified name is executed with dot set + to the value of the pipeline. + + {{with pipeline}} T1 {{end}} + If the value of the pipeline is empty, no output is generated; + otherwise, dot is set to the value of the pipeline and T1 is + executed. + + {{with pipeline}} T1 {{else}} T0 {{end}} + If the value of the pipeline is empty, dot is unaffected and T0 + is executed; otherwise, dot is set to the value of the pipeline + and T1 is executed. + +Arguments + +An argument is a simple value, denoted by one of the following. + + - A boolean, string, character, integer, floating-point, imaginary + or complex constant in Go syntax. These behave like Go's untyped + constants, although raw strings may not span newlines. + - The keyword nil, representing an untyped Go nil. + - The character '.' (period): + . + The result is the value of dot. + - A variable name, which is a (possibly empty) alphanumeric string + preceded by a dollar sign, such as + $piOver2 + or + $ + The result is the value of the variable. + Variables are described below. + - The name of a field of the data, which must be a struct, preceded + by a period, such as + .Field + The result is the value of the field. Field invocations may be + chained: + .Field1.Field2 + Fields can also be evaluated on variables, including chaining: + $x.Field1.Field2 + - The name of a key of the data, which must be a map, preceded + by a period, such as + .Key + The result is the map element value indexed by the key. + Key invocations may be chained and combined with fields to any + depth: + .Field1.Key1.Field2.Key2 + Although the key must be an alphanumeric identifier, unlike with + field names they do not need to start with an upper case letter. + Keys can also be evaluated on variables, including chaining: + $x.key1.key2 + - The name of a niladic method of the data, preceded by a period, + such as + .Method + The result is the value of invoking the method with dot as the + receiver, dot.Method(). Such a method must have one return value (of + any type) or two return values, the second of which is an error. + If it has two and the returned error is non-nil, execution terminates + and an error is returned to the caller as the value of Execute. + Method invocations may be chained and combined with fields and keys + to any depth: + .Field1.Key1.Method1.Field2.Key2.Method2 + Methods can also be evaluated on variables, including chaining: + $x.Method1.Field + - The name of a niladic function, such as + fun + The result is the value of invoking the function, fun(). The return + types and values behave as in methods. Functions and function + names are described below. + - A parenthesized instance of one the above, for grouping. The result + may be accessed by a field or map key invocation. + print (.F1 arg1) (.F2 arg2) + (.StructValuedMethod "arg").Field + +Arguments may evaluate to any type; if they are pointers the implementation +automatically indirects to the base type when required. +If an evaluation yields a function value, such as a function-valued +field of a struct, the function is not invoked automatically, but it +can be used as a truth value for an if action and the like. To invoke +it, use the call function, defined below. + +A pipeline is a possibly chained sequence of "commands". A command is a simple +value (argument) or a function or method call, possibly with multiple arguments: + + Argument + The result is the value of evaluating the argument. + .Method [Argument...] + The method can be alone or the last element of a chain but, + unlike methods in the middle of a chain, it can take arguments. + The result is the value of calling the method with the + arguments: + dot.Method(Argument1, etc.) + functionName [Argument...] + The result is the value of calling the function associated + with the name: + function(Argument1, etc.) + Functions and function names are described below. + +Pipelines + +A pipeline may be "chained" by separating a sequence of commands with pipeline +characters '|'. In a chained pipeline, the result of the each command is +passed as the last argument of the following command. The output of the final +command in the pipeline is the value of the pipeline. + +The output of a command will be either one value or two values, the second of +which has type error. If that second value is present and evaluates to +non-nil, execution terminates and the error is returned to the caller of +Execute. + +Variables + +A pipeline inside an action may initialize a variable to capture the result. +The initialization has syntax + + $variable := pipeline + +where $variable is the name of the variable. An action that declares a +variable produces no output. + +If a "range" action initializes a variable, the variable is set to the +successive elements of the iteration. Also, a "range" may declare two +variables, separated by a comma: + + range $index, $element := pipeline + +in which case $index and $element are set to the successive values of the +array/slice index or map key and element, respectively. Note that if there is +only one variable, it is assigned the element; this is opposite to the +convention in Go range clauses. + +A variable's scope extends to the "end" action of the control structure ("if", +"with", or "range") in which it is declared, or to the end of the template if +there is no such control structure. A template invocation does not inherit +variables from the point of its invocation. + +When execution begins, $ is set to the data argument passed to Execute, that is, +to the starting value of dot. + +Examples + +Here are some example one-line templates demonstrating pipelines and variables. +All produce the quoted word "output": + + {{"\"output\""}} + A string constant. + {{`"output"`}} + A raw string constant. + {{printf "%q" "output"}} + A function call. + {{"output" | printf "%q"}} + A function call whose final argument comes from the previous + command. + {{printf "%q" (print "out" "put")}} + A parenthesized argument. + {{"put" | printf "%s%s" "out" | printf "%q"}} + A more elaborate call. + {{"output" | printf "%s" | printf "%q"}} + A longer chain. + {{with "output"}}{{printf "%q" .}}{{end}} + A with action using dot. + {{with $x := "output" | printf "%q"}}{{$x}}{{end}} + A with action that creates and uses a variable. + {{with $x := "output"}}{{printf "%q" $x}}{{end}} + A with action that uses the variable in another action. + {{with $x := "output"}}{{$x | printf "%q"}}{{end}} + The same, but pipelined. + +Functions + +During execution functions are found in two function maps: first in the +template, then in the global function map. By default, no functions are defined +in the template but the Funcs method can be used to add them. + +Predefined global functions are named as follows. + + and + Returns the boolean AND of its arguments by returning the + first empty argument or the last argument, that is, + "and x y" behaves as "if x then y else x". All the + arguments are evaluated. + call + Returns the result of calling the first argument, which + must be a function, with the remaining arguments as parameters. + Thus "call .X.Y 1 2" is, in Go notation, dot.X.Y(1, 2) where + Y is a func-valued field, map entry, or the like. + The first argument must be the result of an evaluation + that yields a value of function type (as distinct from + a predefined function such as print). The function must + return either one or two result values, the second of which + is of type error. If the arguments don't match the function + or the returned error value is non-nil, execution stops. + html + Returns the escaped HTML equivalent of the textual + representation of its arguments. + index + Returns the result of indexing its first argument by the + following arguments. Thus "index x 1 2 3" is, in Go syntax, + x[1][2][3]. Each indexed item must be a map, slice, or array. + js + Returns the escaped JavaScript equivalent of the textual + representation of its arguments. + len + Returns the integer length of its argument. + not + Returns the boolean negation of its single argument. + or + Returns the boolean OR of its arguments by returning the + first non-empty argument or the last argument, that is, + "or x y" behaves as "if x then x else y". All the + arguments are evaluated. + print + An alias for fmt.Sprint + printf + An alias for fmt.Sprintf + println + An alias for fmt.Sprintln + urlquery + Returns the escaped value of the textual representation of + its arguments in a form suitable for embedding in a URL query. + +The boolean functions take any zero value to be false and a non-zero +value to be true. + +There is also a set of binary comparison operators defined as +functions: + + eq + Returns the boolean truth of arg1 == arg2 + ne + Returns the boolean truth of arg1 != arg2 + lt + Returns the boolean truth of arg1 < arg2 + le + Returns the boolean truth of arg1 <= arg2 + gt + Returns the boolean truth of arg1 > arg2 + ge + Returns the boolean truth of arg1 >= arg2 + +For simpler multi-way equality tests, eq (only) accepts two or more +arguments and compares the second and subsequent to the first, +returning in effect + + arg1==arg2 || arg1==arg3 || arg1==arg4 ... + +(Unlike with || in Go, however, eq is a function call and all the +arguments will be evaluated.) + +The comparison functions work on basic types only (or named basic +types, such as "type Celsius float32"). They implement the Go rules +for comparison of values, except that size and exact type are +ignored, so any integer value, signed or unsigned, may be compared +with any other integer value. (The arithmetic value is compared, +not the bit pattern, so all negative integers are less than all +unsigned integers.) However, as usual, one may not compare an int +with a float32 and so on. + +Associated templates + +Each template is named by a string specified when it is created. Also, each +template is associated with zero or more other templates that it may invoke by +name; such associations are transitive and form a name space of templates. + +A template may use a template invocation to instantiate another associated +template; see the explanation of the "template" action above. The name must be +that of a template associated with the template that contains the invocation. + +Nested template definitions + +When parsing a template, another template may be defined and associated with the +template being parsed. Template definitions must appear at the top level of the +template, much like global variables in a Go program. + +The syntax of such definitions is to surround each template declaration with a +"define" and "end" action. + +The define action names the template being created by providing a string +constant. Here is a simple example: + + `{{define "T1"}}ONE{{end}} + {{define "T2"}}TWO{{end}} + {{define "T3"}}{{template "T1"}} {{template "T2"}}{{end}} + {{template "T3"}}` + +This defines two templates, T1 and T2, and a third T3 that invokes the other two +when it is executed. Finally it invokes T3. If executed this template will +produce the text + + ONE TWO + +By construction, a template may reside in only one association. If it's +necessary to have a template addressable from multiple associations, the +template definition must be parsed multiple times to create distinct *Template +values, or must be copied with the Clone or AddParseTree method. + +Parse may be called multiple times to assemble the various associated templates; +see the ParseFiles and ParseGlob functions and methods for simple ways to parse +related templates stored in files. + +A template may be executed directly or through ExecuteTemplate, which executes +an associated template identified by name. To invoke our example above, we +might write, + + err := tmpl.Execute(os.Stdout, "no data needed") + if err != nil { + log.Fatalf("execution failed: %s", err) + } + +or to invoke a particular template explicitly by name, + + err := tmpl.ExecuteTemplate(os.Stdout, "T2", "no data needed") + if err != nil { + log.Fatalf("execution failed: %s", err) + } + +*/ +package template diff --git a/api/vendor/github.com/alecthomas/template/example_test.go b/api/vendor/github.com/alecthomas/template/example_test.go new file mode 100644 index 0000000..461ec05 --- /dev/null +++ b/api/vendor/github.com/alecthomas/template/example_test.go @@ -0,0 +1,72 @@ +// 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 template_test + +import ( + "log" + "os" + + "github.com/alecthomas/template" +) + +func ExampleTemplate() { + // Define a template. + const letter = ` +Dear {{.Name}}, +{{if .Attended}} +It was a pleasure to see you at the wedding.{{else}} +It is a shame you couldn't make it to the wedding.{{end}} +{{with .Gift}}Thank you for the lovely {{.}}. +{{end}} +Best wishes, +Josie +` + + // Prepare some data to insert into the template. + type Recipient struct { + Name, Gift string + Attended bool + } + var recipients = []Recipient{ + {"Aunt Mildred", "bone china tea set", true}, + {"Uncle John", "moleskin pants", false}, + {"Cousin Rodney", "", false}, + } + + // Create a new template and parse the letter into it. + t := template.Must(template.New("letter").Parse(letter)) + + // Execute the template for each recipient. + for _, r := range recipients { + err := t.Execute(os.Stdout, r) + if err != nil { + log.Println("executing template:", err) + } + } + + // Output: + // Dear Aunt Mildred, + // + // It was a pleasure to see you at the wedding. + // Thank you for the lovely bone china tea set. + // + // Best wishes, + // Josie + // + // Dear Uncle John, + // + // It is a shame you couldn't make it to the wedding. + // Thank you for the lovely moleskin pants. + // + // Best wishes, + // Josie + // + // Dear Cousin Rodney, + // + // It is a shame you couldn't make it to the wedding. + // + // Best wishes, + // Josie +} diff --git a/api/vendor/github.com/alecthomas/template/examplefiles_test.go b/api/vendor/github.com/alecthomas/template/examplefiles_test.go new file mode 100644 index 0000000..0c7181d --- /dev/null +++ b/api/vendor/github.com/alecthomas/template/examplefiles_test.go @@ -0,0 +1,183 @@ +// 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 template_test + +import ( + "io" + "io/ioutil" + "log" + "os" + "path/filepath" + + "github.com/alecthomas/template" +) + +// templateFile defines the contents of a template to be stored in a file, for testing. +type templateFile struct { + name string + contents string +} + +func createTestDir(files []templateFile) string { + dir, err := ioutil.TempDir("", "template") + if err != nil { + log.Fatal(err) + } + for _, file := range files { + f, err := os.Create(filepath.Join(dir, file.name)) + if err != nil { + log.Fatal(err) + } + defer f.Close() + _, err = io.WriteString(f, file.contents) + if err != nil { + log.Fatal(err) + } + } + return dir +} + +// Here we demonstrate loading a set of templates from a directory. +func ExampleTemplate_glob() { + // Here we create a temporary directory and populate it with our sample + // template definition files; usually the template files would already + // exist in some location known to the program. + dir := createTestDir([]templateFile{ + // T0.tmpl is a plain template file that just invokes T1. + {"T0.tmpl", `T0 invokes T1: ({{template "T1"}})`}, + // T1.tmpl defines a template, T1 that invokes T2. + {"T1.tmpl", `{{define "T1"}}T1 invokes T2: ({{template "T2"}}){{end}}`}, + // T2.tmpl defines a template T2. + {"T2.tmpl", `{{define "T2"}}This is T2{{end}}`}, + }) + // Clean up after the test; another quirk of running as an example. + defer os.RemoveAll(dir) + + // pattern is the glob pattern used to find all the template files. + pattern := filepath.Join(dir, "*.tmpl") + + // Here starts the example proper. + // T0.tmpl is the first name matched, so it becomes the starting template, + // the value returned by ParseGlob. + tmpl := template.Must(template.ParseGlob(pattern)) + + err := tmpl.Execute(os.Stdout, nil) + if err != nil { + log.Fatalf("template execution: %s", err) + } + // Output: + // T0 invokes T1: (T1 invokes T2: (This is T2)) +} + +// This example demonstrates one way to share some templates +// and use them in different contexts. In this variant we add multiple driver +// templates by hand to an existing bundle of templates. +func ExampleTemplate_helpers() { + // Here we create a temporary directory and populate it with our sample + // template definition files; usually the template files would already + // exist in some location known to the program. + dir := createTestDir([]templateFile{ + // T1.tmpl defines a template, T1 that invokes T2. + {"T1.tmpl", `{{define "T1"}}T1 invokes T2: ({{template "T2"}}){{end}}`}, + // T2.tmpl defines a template T2. + {"T2.tmpl", `{{define "T2"}}This is T2{{end}}`}, + }) + // Clean up after the test; another quirk of running as an example. + defer os.RemoveAll(dir) + + // pattern is the glob pattern used to find all the template files. + pattern := filepath.Join(dir, "*.tmpl") + + // Here starts the example proper. + // Load the helpers. + templates := template.Must(template.ParseGlob(pattern)) + // Add one driver template to the bunch; we do this with an explicit template definition. + _, err := templates.Parse("{{define `driver1`}}Driver 1 calls T1: ({{template `T1`}})\n{{end}}") + if err != nil { + log.Fatal("parsing driver1: ", err) + } + // Add another driver template. + _, err = templates.Parse("{{define `driver2`}}Driver 2 calls T2: ({{template `T2`}})\n{{end}}") + if err != nil { + log.Fatal("parsing driver2: ", err) + } + // We load all the templates before execution. This package does not require + // that behavior but html/template's escaping does, so it's a good habit. + err = templates.ExecuteTemplate(os.Stdout, "driver1", nil) + if err != nil { + log.Fatalf("driver1 execution: %s", err) + } + err = templates.ExecuteTemplate(os.Stdout, "driver2", nil) + if err != nil { + log.Fatalf("driver2 execution: %s", err) + } + // Output: + // Driver 1 calls T1: (T1 invokes T2: (This is T2)) + // Driver 2 calls T2: (This is T2) +} + +// This example demonstrates how to use one group of driver +// templates with distinct sets of helper templates. +func ExampleTemplate_share() { + // Here we create a temporary directory and populate it with our sample + // template definition files; usually the template files would already + // exist in some location known to the program. + dir := createTestDir([]templateFile{ + // T0.tmpl is a plain template file that just invokes T1. + {"T0.tmpl", "T0 ({{.}} version) invokes T1: ({{template `T1`}})\n"}, + // T1.tmpl defines a template, T1 that invokes T2. Note T2 is not defined + {"T1.tmpl", `{{define "T1"}}T1 invokes T2: ({{template "T2"}}){{end}}`}, + }) + // Clean up after the test; another quirk of running as an example. + defer os.RemoveAll(dir) + + // pattern is the glob pattern used to find all the template files. + pattern := filepath.Join(dir, "*.tmpl") + + // Here starts the example proper. + // Load the drivers. + drivers := template.Must(template.ParseGlob(pattern)) + + // We must define an implementation of the T2 template. First we clone + // the drivers, then add a definition of T2 to the template name space. + + // 1. Clone the helper set to create a new name space from which to run them. + first, err := drivers.Clone() + if err != nil { + log.Fatal("cloning helpers: ", err) + } + // 2. Define T2, version A, and parse it. + _, err = first.Parse("{{define `T2`}}T2, version A{{end}}") + if err != nil { + log.Fatal("parsing T2: ", err) + } + + // Now repeat the whole thing, using a different version of T2. + // 1. Clone the drivers. + second, err := drivers.Clone() + if err != nil { + log.Fatal("cloning drivers: ", err) + } + // 2. Define T2, version B, and parse it. + _, err = second.Parse("{{define `T2`}}T2, version B{{end}}") + if err != nil { + log.Fatal("parsing T2: ", err) + } + + // Execute the templates in the reverse order to verify the + // first is unaffected by the second. + err = second.ExecuteTemplate(os.Stdout, "T0.tmpl", "second") + if err != nil { + log.Fatalf("second execution: %s", err) + } + err = first.ExecuteTemplate(os.Stdout, "T0.tmpl", "first") + if err != nil { + log.Fatalf("first: execution: %s", err) + } + + // Output: + // T0 (second version) invokes T1: (T1 invokes T2: (T2, version B)) + // T0 (first version) invokes T1: (T1 invokes T2: (T2, version A)) +} diff --git a/api/vendor/github.com/alecthomas/template/examplefunc_test.go b/api/vendor/github.com/alecthomas/template/examplefunc_test.go new file mode 100644 index 0000000..8767cfd --- /dev/null +++ b/api/vendor/github.com/alecthomas/template/examplefunc_test.go @@ -0,0 +1,55 @@ +// 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 template_test + +import ( + "log" + "os" + "strings" + + "github.com/alecthomas/template" +) + +// This example demonstrates a custom function to process template text. +// It installs the strings.Title function and uses it to +// Make Title Text Look Good In Our Template's Output. +func ExampleTemplate_func() { + // First we create a FuncMap with which to register the function. + funcMap := template.FuncMap{ + // The name "title" is what the function will be called in the template text. + "title": strings.Title, + } + + // A simple template definition to test our function. + // We print the input text several ways: + // - the original + // - title-cased + // - title-cased and then printed with %q + // - printed with %q and then title-cased. + const templateText = ` +Input: {{printf "%q" .}} +Output 0: {{title .}} +Output 1: {{title . | printf "%q"}} +Output 2: {{printf "%q" . | title}} +` + + // Create a template, add the function map, and parse the text. + tmpl, err := template.New("titleTest").Funcs(funcMap).Parse(templateText) + if err != nil { + log.Fatalf("parsing: %s", err) + } + + // Run the template to verify the output. + err = tmpl.Execute(os.Stdout, "the go programming language") + if err != nil { + log.Fatalf("execution: %s", err) + } + + // Output: + // Input: "the go programming language" + // Output 0: The Go Programming Language + // Output 1: "The Go Programming Language" + // Output 2: "The Go Programming Language" +} diff --git a/api/vendor/github.com/alecthomas/template/exec.go b/api/vendor/github.com/alecthomas/template/exec.go new file mode 100644 index 0000000..c3078e5 --- /dev/null +++ b/api/vendor/github.com/alecthomas/template/exec.go @@ -0,0 +1,845 @@ +// 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 template + +import ( + "bytes" + "fmt" + "io" + "reflect" + "runtime" + "sort" + "strings" + + "github.com/alecthomas/template/parse" +) + +// state represents the state of an execution. It's not part of the +// template so that multiple executions of the same template +// can execute in parallel. +type state struct { + tmpl *Template + wr io.Writer + node parse.Node // current node, for errors + vars []variable // push-down stack of variable values. +} + +// variable holds the dynamic value of a variable such as $, $x etc. +type variable struct { + name string + value reflect.Value +} + +// push pushes a new variable on the stack. +func (s *state) push(name string, value reflect.Value) { + s.vars = append(s.vars, variable{name, value}) +} + +// mark returns the length of the variable stack. +func (s *state) mark() int { + return len(s.vars) +} + +// pop pops the variable stack up to the mark. +func (s *state) pop(mark int) { + s.vars = s.vars[0:mark] +} + +// setVar overwrites the top-nth variable on the stack. Used by range iterations. +func (s *state) setVar(n int, value reflect.Value) { + s.vars[len(s.vars)-n].value = value +} + +// varValue returns the value of the named variable. +func (s *state) varValue(name string) reflect.Value { + for i := s.mark() - 1; i >= 0; i-- { + if s.vars[i].name == name { + return s.vars[i].value + } + } + s.errorf("undefined variable: %s", name) + return zero +} + +var zero reflect.Value + +// at marks the state to be on node n, for error reporting. +func (s *state) at(node parse.Node) { + s.node = node +} + +// doublePercent returns the string with %'s replaced by %%, if necessary, +// so it can be used safely inside a Printf format string. +func doublePercent(str string) string { + if strings.Contains(str, "%") { + str = strings.Replace(str, "%", "%%", -1) + } + return str +} + +// errorf formats the error and terminates processing. +func (s *state) errorf(format string, args ...interface{}) { + name := doublePercent(s.tmpl.Name()) + if s.node == nil { + format = fmt.Sprintf("template: %s: %s", name, format) + } else { + location, context := s.tmpl.ErrorContext(s.node) + format = fmt.Sprintf("template: %s: executing %q at <%s>: %s", location, name, doublePercent(context), format) + } + panic(fmt.Errorf(format, args...)) +} + +// errRecover is the handler that turns panics into returns from the top +// level of Parse. +func errRecover(errp *error) { + e := recover() + if e != nil { + switch err := e.(type) { + case runtime.Error: + panic(e) + case error: + *errp = err + default: + panic(e) + } + } +} + +// ExecuteTemplate applies the template associated with t that has the given name +// to the specified data object and writes the output to wr. +// If an error occurs executing the template or writing its output, +// execution stops, but partial results may already have been written to +// the output writer. +// A template may be executed safely in parallel. +func (t *Template) ExecuteTemplate(wr io.Writer, name string, data interface{}) error { + tmpl := t.tmpl[name] + if tmpl == nil { + return fmt.Errorf("template: no template %q associated with template %q", name, t.name) + } + return tmpl.Execute(wr, data) +} + +// Execute applies a parsed template to the specified data object, +// and writes the output to wr. +// If an error occurs executing the template or writing its output, +// execution stops, but partial results may already have been written to +// the output writer. +// A template may be executed safely in parallel. +func (t *Template) Execute(wr io.Writer, data interface{}) (err error) { + defer errRecover(&err) + value := reflect.ValueOf(data) + state := &state{ + tmpl: t, + wr: wr, + vars: []variable{{"$", value}}, + } + t.init() + if t.Tree == nil || t.Root == nil { + var b bytes.Buffer + for name, tmpl := range t.tmpl { + if tmpl.Tree == nil || tmpl.Root == nil { + continue + } + if b.Len() > 0 { + b.WriteString(", ") + } + fmt.Fprintf(&b, "%q", name) + } + var s string + if b.Len() > 0 { + s = "; defined templates are: " + b.String() + } + state.errorf("%q is an incomplete or empty template%s", t.Name(), s) + } + state.walk(value, t.Root) + return +} + +// Walk functions step through the major pieces of the template structure, +// generating output as they go. +func (s *state) walk(dot reflect.Value, node parse.Node) { + s.at(node) + switch node := node.(type) { + case *parse.ActionNode: + // Do not pop variables so they persist until next end. + // Also, if the action declares variables, don't print the result. + val := s.evalPipeline(dot, node.Pipe) + if len(node.Pipe.Decl) == 0 { + s.printValue(node, val) + } + case *parse.IfNode: + s.walkIfOrWith(parse.NodeIf, dot, node.Pipe, node.List, node.ElseList) + case *parse.ListNode: + for _, node := range node.Nodes { + s.walk(dot, node) + } + case *parse.RangeNode: + s.walkRange(dot, node) + case *parse.TemplateNode: + s.walkTemplate(dot, node) + case *parse.TextNode: + if _, err := s.wr.Write(node.Text); err != nil { + s.errorf("%s", err) + } + case *parse.WithNode: + s.walkIfOrWith(parse.NodeWith, dot, node.Pipe, node.List, node.ElseList) + default: + s.errorf("unknown node: %s", node) + } +} + +// walkIfOrWith walks an 'if' or 'with' node. The two control structures +// are identical in behavior except that 'with' sets dot. +func (s *state) walkIfOrWith(typ parse.NodeType, dot reflect.Value, pipe *parse.PipeNode, list, elseList *parse.ListNode) { + defer s.pop(s.mark()) + val := s.evalPipeline(dot, pipe) + truth, ok := isTrue(val) + if !ok { + s.errorf("if/with can't use %v", val) + } + if truth { + if typ == parse.NodeWith { + s.walk(val, list) + } else { + s.walk(dot, list) + } + } else if elseList != nil { + s.walk(dot, elseList) + } +} + +// isTrue reports whether the value is 'true', in the sense of not the zero of its type, +// and whether the value has a meaningful truth value. +func isTrue(val reflect.Value) (truth, ok bool) { + if !val.IsValid() { + // Something like var x interface{}, never set. It's a form of nil. + return false, true + } + switch val.Kind() { + case reflect.Array, reflect.Map, reflect.Slice, reflect.String: + truth = val.Len() > 0 + case reflect.Bool: + truth = val.Bool() + case reflect.Complex64, reflect.Complex128: + truth = val.Complex() != 0 + case reflect.Chan, reflect.Func, reflect.Ptr, reflect.Interface: + truth = !val.IsNil() + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + truth = val.Int() != 0 + case reflect.Float32, reflect.Float64: + truth = val.Float() != 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + truth = val.Uint() != 0 + case reflect.Struct: + truth = true // Struct values are always true. + default: + return + } + return truth, true +} + +func (s *state) walkRange(dot reflect.Value, r *parse.RangeNode) { + s.at(r) + defer s.pop(s.mark()) + val, _ := indirect(s.evalPipeline(dot, r.Pipe)) + // mark top of stack before any variables in the body are pushed. + mark := s.mark() + oneIteration := func(index, elem reflect.Value) { + // Set top var (lexically the second if there are two) to the element. + if len(r.Pipe.Decl) > 0 { + s.setVar(1, elem) + } + // Set next var (lexically the first if there are two) to the index. + if len(r.Pipe.Decl) > 1 { + s.setVar(2, index) + } + s.walk(elem, r.List) + s.pop(mark) + } + switch val.Kind() { + case reflect.Array, reflect.Slice: + if val.Len() == 0 { + break + } + for i := 0; i < val.Len(); i++ { + oneIteration(reflect.ValueOf(i), val.Index(i)) + } + return + case reflect.Map: + if val.Len() == 0 { + break + } + for _, key := range sortKeys(val.MapKeys()) { + oneIteration(key, val.MapIndex(key)) + } + return + case reflect.Chan: + if val.IsNil() { + break + } + i := 0 + for ; ; i++ { + elem, ok := val.Recv() + if !ok { + break + } + oneIteration(reflect.ValueOf(i), elem) + } + if i == 0 { + break + } + return + case reflect.Invalid: + break // An invalid value is likely a nil map, etc. and acts like an empty map. + default: + s.errorf("range can't iterate over %v", val) + } + if r.ElseList != nil { + s.walk(dot, r.ElseList) + } +} + +func (s *state) walkTemplate(dot reflect.Value, t *parse.TemplateNode) { + s.at(t) + tmpl := s.tmpl.tmpl[t.Name] + if tmpl == nil { + s.errorf("template %q not defined", t.Name) + } + // Variables declared by the pipeline persist. + dot = s.evalPipeline(dot, t.Pipe) + newState := *s + newState.tmpl = tmpl + // No dynamic scoping: template invocations inherit no variables. + newState.vars = []variable{{"$", dot}} + newState.walk(dot, tmpl.Root) +} + +// Eval functions evaluate pipelines, commands, and their elements and extract +// values from the data structure by examining fields, calling methods, and so on. +// The printing of those values happens only through walk functions. + +// evalPipeline returns the value acquired by evaluating a pipeline. If the +// pipeline has a variable declaration, the variable will be pushed on the +// stack. Callers should therefore pop the stack after they are finished +// executing commands depending on the pipeline value. +func (s *state) evalPipeline(dot reflect.Value, pipe *parse.PipeNode) (value reflect.Value) { + if pipe == nil { + return + } + s.at(pipe) + for _, cmd := range pipe.Cmds { + value = s.evalCommand(dot, cmd, value) // previous value is this one's final arg. + // If the object has type interface{}, dig down one level to the thing inside. + if value.Kind() == reflect.Interface && value.Type().NumMethod() == 0 { + value = reflect.ValueOf(value.Interface()) // lovely! + } + } + for _, variable := range pipe.Decl { + s.push(variable.Ident[0], value) + } + return value +} + +func (s *state) notAFunction(args []parse.Node, final reflect.Value) { + if len(args) > 1 || final.IsValid() { + s.errorf("can't give argument to non-function %s", args[0]) + } +} + +func (s *state) evalCommand(dot reflect.Value, cmd *parse.CommandNode, final reflect.Value) reflect.Value { + firstWord := cmd.Args[0] + switch n := firstWord.(type) { + case *parse.FieldNode: + return s.evalFieldNode(dot, n, cmd.Args, final) + case *parse.ChainNode: + return s.evalChainNode(dot, n, cmd.Args, final) + case *parse.IdentifierNode: + // Must be a function. + return s.evalFunction(dot, n, cmd, cmd.Args, final) + case *parse.PipeNode: + // Parenthesized pipeline. The arguments are all inside the pipeline; final is ignored. + return s.evalPipeline(dot, n) + case *parse.VariableNode: + return s.evalVariableNode(dot, n, cmd.Args, final) + } + s.at(firstWord) + s.notAFunction(cmd.Args, final) + switch word := firstWord.(type) { + case *parse.BoolNode: + return reflect.ValueOf(word.True) + case *parse.DotNode: + return dot + case *parse.NilNode: + s.errorf("nil is not a command") + case *parse.NumberNode: + return s.idealConstant(word) + case *parse.StringNode: + return reflect.ValueOf(word.Text) + } + s.errorf("can't evaluate command %q", firstWord) + panic("not reached") +} + +// idealConstant is called to return the value of a number in a context where +// we don't know the type. In that case, the syntax of the number tells us +// its type, and we use Go rules to resolve. Note there is no such thing as +// a uint ideal constant in this situation - the value must be of int type. +func (s *state) idealConstant(constant *parse.NumberNode) reflect.Value { + // These are ideal constants but we don't know the type + // and we have no context. (If it was a method argument, + // we'd know what we need.) The syntax guides us to some extent. + s.at(constant) + switch { + case constant.IsComplex: + return reflect.ValueOf(constant.Complex128) // incontrovertible. + case constant.IsFloat && !isHexConstant(constant.Text) && strings.IndexAny(constant.Text, ".eE") >= 0: + return reflect.ValueOf(constant.Float64) + case constant.IsInt: + n := int(constant.Int64) + if int64(n) != constant.Int64 { + s.errorf("%s overflows int", constant.Text) + } + return reflect.ValueOf(n) + case constant.IsUint: + s.errorf("%s overflows int", constant.Text) + } + return zero +} + +func isHexConstant(s string) bool { + return len(s) > 2 && s[0] == '0' && (s[1] == 'x' || s[1] == 'X') +} + +func (s *state) evalFieldNode(dot reflect.Value, field *parse.FieldNode, args []parse.Node, final reflect.Value) reflect.Value { + s.at(field) + return s.evalFieldChain(dot, dot, field, field.Ident, args, final) +} + +func (s *state) evalChainNode(dot reflect.Value, chain *parse.ChainNode, args []parse.Node, final reflect.Value) reflect.Value { + s.at(chain) + // (pipe).Field1.Field2 has pipe as .Node, fields as .Field. Eval the pipeline, then the fields. + pipe := s.evalArg(dot, nil, chain.Node) + if len(chain.Field) == 0 { + s.errorf("internal error: no fields in evalChainNode") + } + return s.evalFieldChain(dot, pipe, chain, chain.Field, args, final) +} + +func (s *state) evalVariableNode(dot reflect.Value, variable *parse.VariableNode, args []parse.Node, final reflect.Value) reflect.Value { + // $x.Field has $x as the first ident, Field as the second. Eval the var, then the fields. + s.at(variable) + value := s.varValue(variable.Ident[0]) + if len(variable.Ident) == 1 { + s.notAFunction(args, final) + return value + } + return s.evalFieldChain(dot, value, variable, variable.Ident[1:], args, final) +} + +// evalFieldChain evaluates .X.Y.Z possibly followed by arguments. +// dot is the environment in which to evaluate arguments, while +// receiver is the value being walked along the chain. +func (s *state) evalFieldChain(dot, receiver reflect.Value, node parse.Node, ident []string, args []parse.Node, final reflect.Value) reflect.Value { + n := len(ident) + for i := 0; i < n-1; i++ { + receiver = s.evalField(dot, ident[i], node, nil, zero, receiver) + } + // Now if it's a method, it gets the arguments. + return s.evalField(dot, ident[n-1], node, args, final, receiver) +} + +func (s *state) evalFunction(dot reflect.Value, node *parse.IdentifierNode, cmd parse.Node, args []parse.Node, final reflect.Value) reflect.Value { + s.at(node) + name := node.Ident + function, ok := findFunction(name, s.tmpl) + if !ok { + s.errorf("%q is not a defined function", name) + } + return s.evalCall(dot, function, cmd, name, args, final) +} + +// evalField evaluates an expression like (.Field) or (.Field arg1 arg2). +// The 'final' argument represents the return value from the preceding +// value of the pipeline, if any. +func (s *state) evalField(dot reflect.Value, fieldName string, node parse.Node, args []parse.Node, final, receiver reflect.Value) reflect.Value { + if !receiver.IsValid() { + return zero + } + typ := receiver.Type() + receiver, _ = indirect(receiver) + // Unless it's an interface, need to get to a value of type *T to guarantee + // we see all methods of T and *T. + ptr := receiver + if ptr.Kind() != reflect.Interface && ptr.CanAddr() { + ptr = ptr.Addr() + } + if method := ptr.MethodByName(fieldName); method.IsValid() { + return s.evalCall(dot, method, node, fieldName, args, final) + } + hasArgs := len(args) > 1 || final.IsValid() + // It's not a method; must be a field of a struct or an element of a map. The receiver must not be nil. + receiver, isNil := indirect(receiver) + if isNil { + s.errorf("nil pointer evaluating %s.%s", typ, fieldName) + } + switch receiver.Kind() { + case reflect.Struct: + tField, ok := receiver.Type().FieldByName(fieldName) + if ok { + field := receiver.FieldByIndex(tField.Index) + if tField.PkgPath != "" { // field is unexported + s.errorf("%s is an unexported field of struct type %s", fieldName, typ) + } + // If it's a function, we must call it. + if hasArgs { + s.errorf("%s has arguments but cannot be invoked as function", fieldName) + } + return field + } + s.errorf("%s is not a field of struct type %s", fieldName, typ) + case reflect.Map: + // If it's a map, attempt to use the field name as a key. + nameVal := reflect.ValueOf(fieldName) + if nameVal.Type().AssignableTo(receiver.Type().Key()) { + if hasArgs { + s.errorf("%s is not a method but has arguments", fieldName) + } + return receiver.MapIndex(nameVal) + } + } + s.errorf("can't evaluate field %s in type %s", fieldName, typ) + panic("not reached") +} + +var ( + errorType = reflect.TypeOf((*error)(nil)).Elem() + fmtStringerType = reflect.TypeOf((*fmt.Stringer)(nil)).Elem() +) + +// evalCall executes a function or method call. If it's a method, fun already has the receiver bound, so +// it looks just like a function call. The arg list, if non-nil, includes (in the manner of the shell), arg[0] +// as the function itself. +func (s *state) evalCall(dot, fun reflect.Value, node parse.Node, name string, args []parse.Node, final reflect.Value) reflect.Value { + if args != nil { + args = args[1:] // Zeroth arg is function name/node; not passed to function. + } + typ := fun.Type() + numIn := len(args) + if final.IsValid() { + numIn++ + } + numFixed := len(args) + if typ.IsVariadic() { + numFixed = typ.NumIn() - 1 // last arg is the variadic one. + if numIn < numFixed { + s.errorf("wrong number of args for %s: want at least %d got %d", name, typ.NumIn()-1, len(args)) + } + } else if numIn < typ.NumIn()-1 || !typ.IsVariadic() && numIn != typ.NumIn() { + s.errorf("wrong number of args for %s: want %d got %d", name, typ.NumIn(), len(args)) + } + if !goodFunc(typ) { + // TODO: This could still be a confusing error; maybe goodFunc should provide info. + s.errorf("can't call method/function %q with %d results", name, typ.NumOut()) + } + // Build the arg list. + argv := make([]reflect.Value, numIn) + // Args must be evaluated. Fixed args first. + i := 0 + for ; i < numFixed && i < len(args); i++ { + argv[i] = s.evalArg(dot, typ.In(i), args[i]) + } + // Now the ... args. + if typ.IsVariadic() { + argType := typ.In(typ.NumIn() - 1).Elem() // Argument is a slice. + for ; i < len(args); i++ { + argv[i] = s.evalArg(dot, argType, args[i]) + } + } + // Add final value if necessary. + if final.IsValid() { + t := typ.In(typ.NumIn() - 1) + if typ.IsVariadic() { + t = t.Elem() + } + argv[i] = s.validateType(final, t) + } + result := fun.Call(argv) + // If we have an error that is not nil, stop execution and return that error to the caller. + if len(result) == 2 && !result[1].IsNil() { + s.at(node) + s.errorf("error calling %s: %s", name, result[1].Interface().(error)) + } + return result[0] +} + +// canBeNil reports whether an untyped nil can be assigned to the type. See reflect.Zero. +func canBeNil(typ reflect.Type) bool { + switch typ.Kind() { + case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: + return true + } + return false +} + +// validateType guarantees that the value is valid and assignable to the type. +func (s *state) validateType(value reflect.Value, typ reflect.Type) reflect.Value { + if !value.IsValid() { + if typ == nil || canBeNil(typ) { + // An untyped nil interface{}. Accept as a proper nil value. + return reflect.Zero(typ) + } + s.errorf("invalid value; expected %s", typ) + } + if typ != nil && !value.Type().AssignableTo(typ) { + if value.Kind() == reflect.Interface && !value.IsNil() { + value = value.Elem() + if value.Type().AssignableTo(typ) { + return value + } + // fallthrough + } + // Does one dereference or indirection work? We could do more, as we + // do with method receivers, but that gets messy and method receivers + // are much more constrained, so it makes more sense there than here. + // Besides, one is almost always all you need. + switch { + case value.Kind() == reflect.Ptr && value.Type().Elem().AssignableTo(typ): + value = value.Elem() + if !value.IsValid() { + s.errorf("dereference of nil pointer of type %s", typ) + } + case reflect.PtrTo(value.Type()).AssignableTo(typ) && value.CanAddr(): + value = value.Addr() + default: + s.errorf("wrong type for value; expected %s; got %s", typ, value.Type()) + } + } + return value +} + +func (s *state) evalArg(dot reflect.Value, typ reflect.Type, n parse.Node) reflect.Value { + s.at(n) + switch arg := n.(type) { + case *parse.DotNode: + return s.validateType(dot, typ) + case *parse.NilNode: + if canBeNil(typ) { + return reflect.Zero(typ) + } + s.errorf("cannot assign nil to %s", typ) + case *parse.FieldNode: + return s.validateType(s.evalFieldNode(dot, arg, []parse.Node{n}, zero), typ) + case *parse.VariableNode: + return s.validateType(s.evalVariableNode(dot, arg, nil, zero), typ) + case *parse.PipeNode: + return s.validateType(s.evalPipeline(dot, arg), typ) + case *parse.IdentifierNode: + return s.evalFunction(dot, arg, arg, nil, zero) + case *parse.ChainNode: + return s.validateType(s.evalChainNode(dot, arg, nil, zero), typ) + } + switch typ.Kind() { + case reflect.Bool: + return s.evalBool(typ, n) + case reflect.Complex64, reflect.Complex128: + return s.evalComplex(typ, n) + case reflect.Float32, reflect.Float64: + return s.evalFloat(typ, n) + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return s.evalInteger(typ, n) + case reflect.Interface: + if typ.NumMethod() == 0 { + return s.evalEmptyInterface(dot, n) + } + case reflect.String: + return s.evalString(typ, n) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return s.evalUnsignedInteger(typ, n) + } + s.errorf("can't handle %s for arg of type %s", n, typ) + panic("not reached") +} + +func (s *state) evalBool(typ reflect.Type, n parse.Node) reflect.Value { + s.at(n) + if n, ok := n.(*parse.BoolNode); ok { + value := reflect.New(typ).Elem() + value.SetBool(n.True) + return value + } + s.errorf("expected bool; found %s", n) + panic("not reached") +} + +func (s *state) evalString(typ reflect.Type, n parse.Node) reflect.Value { + s.at(n) + if n, ok := n.(*parse.StringNode); ok { + value := reflect.New(typ).Elem() + value.SetString(n.Text) + return value + } + s.errorf("expected string; found %s", n) + panic("not reached") +} + +func (s *state) evalInteger(typ reflect.Type, n parse.Node) reflect.Value { + s.at(n) + if n, ok := n.(*parse.NumberNode); ok && n.IsInt { + value := reflect.New(typ).Elem() + value.SetInt(n.Int64) + return value + } + s.errorf("expected integer; found %s", n) + panic("not reached") +} + +func (s *state) evalUnsignedInteger(typ reflect.Type, n parse.Node) reflect.Value { + s.at(n) + if n, ok := n.(*parse.NumberNode); ok && n.IsUint { + value := reflect.New(typ).Elem() + value.SetUint(n.Uint64) + return value + } + s.errorf("expected unsigned integer; found %s", n) + panic("not reached") +} + +func (s *state) evalFloat(typ reflect.Type, n parse.Node) reflect.Value { + s.at(n) + if n, ok := n.(*parse.NumberNode); ok && n.IsFloat { + value := reflect.New(typ).Elem() + value.SetFloat(n.Float64) + return value + } + s.errorf("expected float; found %s", n) + panic("not reached") +} + +func (s *state) evalComplex(typ reflect.Type, n parse.Node) reflect.Value { + if n, ok := n.(*parse.NumberNode); ok && n.IsComplex { + value := reflect.New(typ).Elem() + value.SetComplex(n.Complex128) + return value + } + s.errorf("expected complex; found %s", n) + panic("not reached") +} + +func (s *state) evalEmptyInterface(dot reflect.Value, n parse.Node) reflect.Value { + s.at(n) + switch n := n.(type) { + case *parse.BoolNode: + return reflect.ValueOf(n.True) + case *parse.DotNode: + return dot + case *parse.FieldNode: + return s.evalFieldNode(dot, n, nil, zero) + case *parse.IdentifierNode: + return s.evalFunction(dot, n, n, nil, zero) + case *parse.NilNode: + // NilNode is handled in evalArg, the only place that calls here. + s.errorf("evalEmptyInterface: nil (can't happen)") + case *parse.NumberNode: + return s.idealConstant(n) + case *parse.StringNode: + return reflect.ValueOf(n.Text) + case *parse.VariableNode: + return s.evalVariableNode(dot, n, nil, zero) + case *parse.PipeNode: + return s.evalPipeline(dot, n) + } + s.errorf("can't handle assignment of %s to empty interface argument", n) + panic("not reached") +} + +// indirect returns the item at the end of indirection, and a bool to indicate if it's nil. +// We indirect through pointers and empty interfaces (only) because +// non-empty interfaces have methods we might need. +func indirect(v reflect.Value) (rv reflect.Value, isNil bool) { + for ; v.Kind() == reflect.Ptr || v.Kind() == reflect.Interface; v = v.Elem() { + if v.IsNil() { + return v, true + } + if v.Kind() == reflect.Interface && v.NumMethod() > 0 { + break + } + } + return v, false +} + +// printValue writes the textual representation of the value to the output of +// the template. +func (s *state) printValue(n parse.Node, v reflect.Value) { + s.at(n) + iface, ok := printableValue(v) + if !ok { + s.errorf("can't print %s of type %s", n, v.Type()) + } + fmt.Fprint(s.wr, iface) +} + +// printableValue returns the, possibly indirected, interface value inside v that +// is best for a call to formatted printer. +func printableValue(v reflect.Value) (interface{}, bool) { + if v.Kind() == reflect.Ptr { + v, _ = indirect(v) // fmt.Fprint handles nil. + } + if !v.IsValid() { + return "", true + } + + if !v.Type().Implements(errorType) && !v.Type().Implements(fmtStringerType) { + if v.CanAddr() && (reflect.PtrTo(v.Type()).Implements(errorType) || reflect.PtrTo(v.Type()).Implements(fmtStringerType)) { + v = v.Addr() + } else { + switch v.Kind() { + case reflect.Chan, reflect.Func: + return nil, false + } + } + } + return v.Interface(), true +} + +// Types to help sort the keys in a map for reproducible output. + +type rvs []reflect.Value + +func (x rvs) Len() int { return len(x) } +func (x rvs) Swap(i, j int) { x[i], x[j] = x[j], x[i] } + +type rvInts struct{ rvs } + +func (x rvInts) Less(i, j int) bool { return x.rvs[i].Int() < x.rvs[j].Int() } + +type rvUints struct{ rvs } + +func (x rvUints) Less(i, j int) bool { return x.rvs[i].Uint() < x.rvs[j].Uint() } + +type rvFloats struct{ rvs } + +func (x rvFloats) Less(i, j int) bool { return x.rvs[i].Float() < x.rvs[j].Float() } + +type rvStrings struct{ rvs } + +func (x rvStrings) Less(i, j int) bool { return x.rvs[i].String() < x.rvs[j].String() } + +// sortKeys sorts (if it can) the slice of reflect.Values, which is a slice of map keys. +func sortKeys(v []reflect.Value) []reflect.Value { + if len(v) <= 1 { + return v + } + switch v[0].Kind() { + case reflect.Float32, reflect.Float64: + sort.Sort(rvFloats{v}) + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + sort.Sort(rvInts{v}) + case reflect.String: + sort.Sort(rvStrings{v}) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + sort.Sort(rvUints{v}) + } + return v +} diff --git a/api/vendor/github.com/alecthomas/template/exec_test.go b/api/vendor/github.com/alecthomas/template/exec_test.go new file mode 100644 index 0000000..69c213e --- /dev/null +++ b/api/vendor/github.com/alecthomas/template/exec_test.go @@ -0,0 +1,1044 @@ +// 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 template + +import ( + "bytes" + "errors" + "flag" + "fmt" + "reflect" + "strings" + "testing" +) + +var debug = flag.Bool("debug", false, "show the errors produced by the tests") + +// T has lots of interesting pieces to use to test execution. +type T struct { + // Basics + True bool + I int + U16 uint16 + X string + FloatZero float64 + ComplexZero complex128 + // Nested structs. + U *U + // Struct with String method. + V0 V + V1, V2 *V + // Struct with Error method. + W0 W + W1, W2 *W + // Slices + SI []int + SIEmpty []int + SB []bool + // Maps + MSI map[string]int + MSIone map[string]int // one element, for deterministic output + MSIEmpty map[string]int + MXI map[interface{}]int + MII map[int]int + SMSI []map[string]int + // Empty interfaces; used to see if we can dig inside one. + Empty0 interface{} // nil + Empty1 interface{} + Empty2 interface{} + Empty3 interface{} + Empty4 interface{} + // Non-empty interface. + NonEmptyInterface I + // Stringer. + Str fmt.Stringer + Err error + // Pointers + PI *int + PS *string + PSI *[]int + NIL *int + // Function (not method) + BinaryFunc func(string, string) string + VariadicFunc func(...string) string + VariadicFuncInt func(int, ...string) string + NilOKFunc func(*int) bool + ErrFunc func() (string, error) + // Template to test evaluation of templates. + Tmpl *Template + // Unexported field; cannot be accessed by template. + unexported int +} + +type U struct { + V string +} + +type V struct { + j int +} + +func (v *V) String() string { + if v == nil { + return "nilV" + } + return fmt.Sprintf("<%d>", v.j) +} + +type W struct { + k int +} + +func (w *W) Error() string { + if w == nil { + return "nilW" + } + return fmt.Sprintf("[%d]", w.k) +} + +var tVal = &T{ + True: true, + I: 17, + U16: 16, + X: "x", + U: &U{"v"}, + V0: V{6666}, + V1: &V{7777}, // leave V2 as nil + W0: W{888}, + W1: &W{999}, // leave W2 as nil + SI: []int{3, 4, 5}, + SB: []bool{true, false}, + MSI: map[string]int{"one": 1, "two": 2, "three": 3}, + MSIone: map[string]int{"one": 1}, + MXI: map[interface{}]int{"one": 1}, + MII: map[int]int{1: 1}, + SMSI: []map[string]int{ + {"one": 1, "two": 2}, + {"eleven": 11, "twelve": 12}, + }, + Empty1: 3, + Empty2: "empty2", + Empty3: []int{7, 8}, + Empty4: &U{"UinEmpty"}, + NonEmptyInterface: new(T), + Str: bytes.NewBuffer([]byte("foozle")), + Err: errors.New("erroozle"), + PI: newInt(23), + PS: newString("a string"), + PSI: newIntSlice(21, 22, 23), + BinaryFunc: func(a, b string) string { return fmt.Sprintf("[%s=%s]", a, b) }, + VariadicFunc: func(s ...string) string { return fmt.Sprint("<", strings.Join(s, "+"), ">") }, + VariadicFuncInt: func(a int, s ...string) string { return fmt.Sprint(a, "=<", strings.Join(s, "+"), ">") }, + NilOKFunc: func(s *int) bool { return s == nil }, + ErrFunc: func() (string, error) { return "bla", nil }, + Tmpl: Must(New("x").Parse("test template")), // "x" is the value of .X +} + +// A non-empty interface. +type I interface { + Method0() string +} + +var iVal I = tVal + +// Helpers for creation. +func newInt(n int) *int { + return &n +} + +func newString(s string) *string { + return &s +} + +func newIntSlice(n ...int) *[]int { + p := new([]int) + *p = make([]int, len(n)) + copy(*p, n) + return p +} + +// Simple methods with and without arguments. +func (t *T) Method0() string { + return "M0" +} + +func (t *T) Method1(a int) int { + return a +} + +func (t *T) Method2(a uint16, b string) string { + return fmt.Sprintf("Method2: %d %s", a, b) +} + +func (t *T) Method3(v interface{}) string { + return fmt.Sprintf("Method3: %v", v) +} + +func (t *T) Copy() *T { + n := new(T) + *n = *t + return n +} + +func (t *T) MAdd(a int, b []int) []int { + v := make([]int, len(b)) + for i, x := range b { + v[i] = x + a + } + return v +} + +var myError = errors.New("my error") + +// MyError returns a value and an error according to its argument. +func (t *T) MyError(error bool) (bool, error) { + if error { + return true, myError + } + return false, nil +} + +// A few methods to test chaining. +func (t *T) GetU() *U { + return t.U +} + +func (u *U) TrueFalse(b bool) string { + if b { + return "true" + } + return "" +} + +func typeOf(arg interface{}) string { + return fmt.Sprintf("%T", arg) +} + +type execTest struct { + name string + input string + output string + data interface{} + ok bool +} + +// bigInt and bigUint are hex string representing numbers either side +// of the max int boundary. +// We do it this way so the test doesn't depend on ints being 32 bits. +var ( + bigInt = fmt.Sprintf("0x%x", int(1<", tVal, true}, + {"map .one interface", "{{.MXI.one}}", "1", tVal, true}, + {"map .WRONG args", "{{.MSI.one 1}}", "", tVal, false}, + {"map .WRONG type", "{{.MII.one}}", "", tVal, false}, + + // Dots of all kinds to test basic evaluation. + {"dot int", "<{{.}}>", "<13>", 13, true}, + {"dot uint", "<{{.}}>", "<14>", uint(14), true}, + {"dot float", "<{{.}}>", "<15.1>", 15.1, true}, + {"dot bool", "<{{.}}>", "", true, true}, + {"dot complex", "<{{.}}>", "<(16.2-17i)>", 16.2 - 17i, true}, + {"dot string", "<{{.}}>", "", "hello", true}, + {"dot slice", "<{{.}}>", "<[-1 -2 -3]>", []int{-1, -2, -3}, true}, + {"dot map", "<{{.}}>", "", map[string]int{"two": 22}, true}, + {"dot struct", "<{{.}}>", "<{7 seven}>", struct { + a int + b string + }{7, "seven"}, true}, + + // Variables. + {"$ int", "{{$}}", "123", 123, true}, + {"$.I", "{{$.I}}", "17", tVal, true}, + {"$.U.V", "{{$.U.V}}", "v", tVal, true}, + {"declare in action", "{{$x := $.U.V}}{{$x}}", "v", tVal, true}, + + // Type with String method. + {"V{6666}.String()", "-{{.V0}}-", "-<6666>-", tVal, true}, + {"&V{7777}.String()", "-{{.V1}}-", "-<7777>-", tVal, true}, + {"(*V)(nil).String()", "-{{.V2}}-", "-nilV-", tVal, true}, + + // Type with Error method. + {"W{888}.Error()", "-{{.W0}}-", "-[888]-", tVal, true}, + {"&W{999}.Error()", "-{{.W1}}-", "-[999]-", tVal, true}, + {"(*W)(nil).Error()", "-{{.W2}}-", "-nilW-", tVal, true}, + + // Pointers. + {"*int", "{{.PI}}", "23", tVal, true}, + {"*string", "{{.PS}}", "a string", tVal, true}, + {"*[]int", "{{.PSI}}", "[21 22 23]", tVal, true}, + {"*[]int[1]", "{{index .PSI 1}}", "22", tVal, true}, + {"NIL", "{{.NIL}}", "", tVal, true}, + + // Empty interfaces holding values. + {"empty nil", "{{.Empty0}}", "", tVal, true}, + {"empty with int", "{{.Empty1}}", "3", tVal, true}, + {"empty with string", "{{.Empty2}}", "empty2", tVal, true}, + {"empty with slice", "{{.Empty3}}", "[7 8]", tVal, true}, + {"empty with struct", "{{.Empty4}}", "{UinEmpty}", tVal, true}, + {"empty with struct, field", "{{.Empty4.V}}", "UinEmpty", tVal, true}, + + // Method calls. + {".Method0", "-{{.Method0}}-", "-M0-", tVal, true}, + {".Method1(1234)", "-{{.Method1 1234}}-", "-1234-", tVal, true}, + {".Method1(.I)", "-{{.Method1 .I}}-", "-17-", tVal, true}, + {".Method2(3, .X)", "-{{.Method2 3 .X}}-", "-Method2: 3 x-", tVal, true}, + {".Method2(.U16, `str`)", "-{{.Method2 .U16 `str`}}-", "-Method2: 16 str-", tVal, true}, + {".Method2(.U16, $x)", "{{if $x := .X}}-{{.Method2 .U16 $x}}{{end}}-", "-Method2: 16 x-", tVal, true}, + {".Method3(nil constant)", "-{{.Method3 nil}}-", "-Method3: -", tVal, true}, + {".Method3(nil value)", "-{{.Method3 .MXI.unset}}-", "-Method3: -", tVal, true}, + {"method on var", "{{if $x := .}}-{{$x.Method2 .U16 $x.X}}{{end}}-", "-Method2: 16 x-", tVal, true}, + {"method on chained var", + "{{range .MSIone}}{{if $.U.TrueFalse $.True}}{{$.U.TrueFalse $.True}}{{else}}WRONG{{end}}{{end}}", + "true", tVal, true}, + {"chained method", + "{{range .MSIone}}{{if $.GetU.TrueFalse $.True}}{{$.U.TrueFalse $.True}}{{else}}WRONG{{end}}{{end}}", + "true", tVal, true}, + {"chained method on variable", + "{{with $x := .}}{{with .SI}}{{$.GetU.TrueFalse $.True}}{{end}}{{end}}", + "true", tVal, true}, + {".NilOKFunc not nil", "{{call .NilOKFunc .PI}}", "false", tVal, true}, + {".NilOKFunc nil", "{{call .NilOKFunc nil}}", "true", tVal, true}, + + // Function call builtin. + {".BinaryFunc", "{{call .BinaryFunc `1` `2`}}", "[1=2]", tVal, true}, + {".VariadicFunc0", "{{call .VariadicFunc}}", "<>", tVal, true}, + {".VariadicFunc2", "{{call .VariadicFunc `he` `llo`}}", "", tVal, true}, + {".VariadicFuncInt", "{{call .VariadicFuncInt 33 `he` `llo`}}", "33=", tVal, true}, + {"if .BinaryFunc call", "{{ if .BinaryFunc}}{{call .BinaryFunc `1` `2`}}{{end}}", "[1=2]", tVal, true}, + {"if not .BinaryFunc call", "{{ if not .BinaryFunc}}{{call .BinaryFunc `1` `2`}}{{else}}No{{end}}", "No", tVal, true}, + {"Interface Call", `{{stringer .S}}`, "foozle", map[string]interface{}{"S": bytes.NewBufferString("foozle")}, true}, + {".ErrFunc", "{{call .ErrFunc}}", "bla", tVal, true}, + + // Erroneous function calls (check args). + {".BinaryFuncTooFew", "{{call .BinaryFunc `1`}}", "", tVal, false}, + {".BinaryFuncTooMany", "{{call .BinaryFunc `1` `2` `3`}}", "", tVal, false}, + {".BinaryFuncBad0", "{{call .BinaryFunc 1 3}}", "", tVal, false}, + {".BinaryFuncBad1", "{{call .BinaryFunc `1` 3}}", "", tVal, false}, + {".VariadicFuncBad0", "{{call .VariadicFunc 3}}", "", tVal, false}, + {".VariadicFuncIntBad0", "{{call .VariadicFuncInt}}", "", tVal, false}, + {".VariadicFuncIntBad`", "{{call .VariadicFuncInt `x`}}", "", tVal, false}, + {".VariadicFuncNilBad", "{{call .VariadicFunc nil}}", "", tVal, false}, + + // Pipelines. + {"pipeline", "-{{.Method0 | .Method2 .U16}}-", "-Method2: 16 M0-", tVal, true}, + {"pipeline func", "-{{call .VariadicFunc `llo` | call .VariadicFunc `he` }}-", "->-", tVal, true}, + + // Parenthesized expressions + {"parens in pipeline", "{{printf `%d %d %d` (1) (2 | add 3) (add 4 (add 5 6))}}", "1 5 15", tVal, true}, + + // Parenthesized expressions with field accesses + {"parens: $ in paren", "{{($).X}}", "x", tVal, true}, + {"parens: $.GetU in paren", "{{($.GetU).V}}", "v", tVal, true}, + {"parens: $ in paren in pipe", "{{($ | echo).X}}", "x", tVal, true}, + {"parens: spaces and args", `{{(makemap "up" "down" "left" "right").left}}`, "right", tVal, true}, + + // If. + {"if true", "{{if true}}TRUE{{end}}", "TRUE", tVal, true}, + {"if false", "{{if false}}TRUE{{else}}FALSE{{end}}", "FALSE", tVal, true}, + {"if nil", "{{if nil}}TRUE{{end}}", "", tVal, false}, + {"if 1", "{{if 1}}NON-ZERO{{else}}ZERO{{end}}", "NON-ZERO", tVal, true}, + {"if 0", "{{if 0}}NON-ZERO{{else}}ZERO{{end}}", "ZERO", tVal, true}, + {"if 1.5", "{{if 1.5}}NON-ZERO{{else}}ZERO{{end}}", "NON-ZERO", tVal, true}, + {"if 0.0", "{{if .FloatZero}}NON-ZERO{{else}}ZERO{{end}}", "ZERO", tVal, true}, + {"if 1.5i", "{{if 1.5i}}NON-ZERO{{else}}ZERO{{end}}", "NON-ZERO", tVal, true}, + {"if 0.0i", "{{if .ComplexZero}}NON-ZERO{{else}}ZERO{{end}}", "ZERO", tVal, true}, + {"if emptystring", "{{if ``}}NON-EMPTY{{else}}EMPTY{{end}}", "EMPTY", tVal, true}, + {"if string", "{{if `notempty`}}NON-EMPTY{{else}}EMPTY{{end}}", "NON-EMPTY", tVal, true}, + {"if emptyslice", "{{if .SIEmpty}}NON-EMPTY{{else}}EMPTY{{end}}", "EMPTY", tVal, true}, + {"if slice", "{{if .SI}}NON-EMPTY{{else}}EMPTY{{end}}", "NON-EMPTY", tVal, true}, + {"if emptymap", "{{if .MSIEmpty}}NON-EMPTY{{else}}EMPTY{{end}}", "EMPTY", tVal, true}, + {"if map", "{{if .MSI}}NON-EMPTY{{else}}EMPTY{{end}}", "NON-EMPTY", tVal, true}, + {"if map unset", "{{if .MXI.none}}NON-ZERO{{else}}ZERO{{end}}", "ZERO", tVal, true}, + {"if map not unset", "{{if not .MXI.none}}ZERO{{else}}NON-ZERO{{end}}", "ZERO", tVal, true}, + {"if $x with $y int", "{{if $x := true}}{{with $y := .I}}{{$x}},{{$y}}{{end}}{{end}}", "true,17", tVal, true}, + {"if $x with $x int", "{{if $x := true}}{{with $x := .I}}{{$x}},{{end}}{{$x}}{{end}}", "17,true", tVal, true}, + {"if else if", "{{if false}}FALSE{{else if true}}TRUE{{end}}", "TRUE", tVal, true}, + {"if else chain", "{{if eq 1 3}}1{{else if eq 2 3}}2{{else if eq 3 3}}3{{end}}", "3", tVal, true}, + + // Print etc. + {"print", `{{print "hello, print"}}`, "hello, print", tVal, true}, + {"print 123", `{{print 1 2 3}}`, "1 2 3", tVal, true}, + {"print nil", `{{print nil}}`, "", tVal, true}, + {"println", `{{println 1 2 3}}`, "1 2 3\n", tVal, true}, + {"printf int", `{{printf "%04x" 127}}`, "007f", tVal, true}, + {"printf float", `{{printf "%g" 3.5}}`, "3.5", tVal, true}, + {"printf complex", `{{printf "%g" 1+7i}}`, "(1+7i)", tVal, true}, + {"printf string", `{{printf "%s" "hello"}}`, "hello", tVal, true}, + {"printf function", `{{printf "%#q" zeroArgs}}`, "`zeroArgs`", tVal, true}, + {"printf field", `{{printf "%s" .U.V}}`, "v", tVal, true}, + {"printf method", `{{printf "%s" .Method0}}`, "M0", tVal, true}, + {"printf dot", `{{with .I}}{{printf "%d" .}}{{end}}`, "17", tVal, true}, + {"printf var", `{{with $x := .I}}{{printf "%d" $x}}{{end}}`, "17", tVal, true}, + {"printf lots", `{{printf "%d %s %g %s" 127 "hello" 7-3i .Method0}}`, "127 hello (7-3i) M0", tVal, true}, + + // HTML. + {"html", `{{html ""}}`, + "<script>alert("XSS");</script>", nil, true}, + {"html pipeline", `{{printf "" | html}}`, + "<script>alert("XSS");</script>", nil, true}, + {"html", `{{html .PS}}`, "a string", tVal, true}, + + // JavaScript. + {"js", `{{js .}}`, `It\'d be nice.`, `It'd be nice.`, true}, + + // URL query. + {"urlquery", `{{"http://www.example.org/"|urlquery}}`, "http%3A%2F%2Fwww.example.org%2F", nil, true}, + + // Booleans + {"not", "{{not true}} {{not false}}", "false true", nil, true}, + {"and", "{{and false 0}} {{and 1 0}} {{and 0 true}} {{and 1 1}}", "false 0 0 1", nil, true}, + {"or", "{{or 0 0}} {{or 1 0}} {{or 0 true}} {{or 1 1}}", "0 1 true 1", nil, true}, + {"boolean if", "{{if and true 1 `hi`}}TRUE{{else}}FALSE{{end}}", "TRUE", tVal, true}, + {"boolean if not", "{{if and true 1 `hi` | not}}TRUE{{else}}FALSE{{end}}", "FALSE", nil, true}, + + // Indexing. + {"slice[0]", "{{index .SI 0}}", "3", tVal, true}, + {"slice[1]", "{{index .SI 1}}", "4", tVal, true}, + {"slice[HUGE]", "{{index .SI 10}}", "", tVal, false}, + {"slice[WRONG]", "{{index .SI `hello`}}", "", tVal, false}, + {"map[one]", "{{index .MSI `one`}}", "1", tVal, true}, + {"map[two]", "{{index .MSI `two`}}", "2", tVal, true}, + {"map[NO]", "{{index .MSI `XXX`}}", "0", tVal, true}, + {"map[nil]", "{{index .MSI nil}}", "0", tVal, true}, + {"map[WRONG]", "{{index .MSI 10}}", "", tVal, false}, + {"double index", "{{index .SMSI 1 `eleven`}}", "11", tVal, true}, + + // Len. + {"slice", "{{len .SI}}", "3", tVal, true}, + {"map", "{{len .MSI }}", "3", tVal, true}, + {"len of int", "{{len 3}}", "", tVal, false}, + {"len of nothing", "{{len .Empty0}}", "", tVal, false}, + + // With. + {"with true", "{{with true}}{{.}}{{end}}", "true", tVal, true}, + {"with false", "{{with false}}{{.}}{{else}}FALSE{{end}}", "FALSE", tVal, true}, + {"with 1", "{{with 1}}{{.}}{{else}}ZERO{{end}}", "1", tVal, true}, + {"with 0", "{{with 0}}{{.}}{{else}}ZERO{{end}}", "ZERO", tVal, true}, + {"with 1.5", "{{with 1.5}}{{.}}{{else}}ZERO{{end}}", "1.5", tVal, true}, + {"with 0.0", "{{with .FloatZero}}{{.}}{{else}}ZERO{{end}}", "ZERO", tVal, true}, + {"with 1.5i", "{{with 1.5i}}{{.}}{{else}}ZERO{{end}}", "(0+1.5i)", tVal, true}, + {"with 0.0i", "{{with .ComplexZero}}{{.}}{{else}}ZERO{{end}}", "ZERO", tVal, true}, + {"with emptystring", "{{with ``}}{{.}}{{else}}EMPTY{{end}}", "EMPTY", tVal, true}, + {"with string", "{{with `notempty`}}{{.}}{{else}}EMPTY{{end}}", "notempty", tVal, true}, + {"with emptyslice", "{{with .SIEmpty}}{{.}}{{else}}EMPTY{{end}}", "EMPTY", tVal, true}, + {"with slice", "{{with .SI}}{{.}}{{else}}EMPTY{{end}}", "[3 4 5]", tVal, true}, + {"with emptymap", "{{with .MSIEmpty}}{{.}}{{else}}EMPTY{{end}}", "EMPTY", tVal, true}, + {"with map", "{{with .MSIone}}{{.}}{{else}}EMPTY{{end}}", "map[one:1]", tVal, true}, + {"with empty interface, struct field", "{{with .Empty4}}{{.V}}{{end}}", "UinEmpty", tVal, true}, + {"with $x int", "{{with $x := .I}}{{$x}}{{end}}", "17", tVal, true}, + {"with $x struct.U.V", "{{with $x := $}}{{$x.U.V}}{{end}}", "v", tVal, true}, + {"with variable and action", "{{with $x := $}}{{$y := $.U.V}}{{$y}}{{end}}", "v", tVal, true}, + + // Range. + {"range []int", "{{range .SI}}-{{.}}-{{end}}", "-3--4--5-", tVal, true}, + {"range empty no else", "{{range .SIEmpty}}-{{.}}-{{end}}", "", tVal, true}, + {"range []int else", "{{range .SI}}-{{.}}-{{else}}EMPTY{{end}}", "-3--4--5-", tVal, true}, + {"range empty else", "{{range .SIEmpty}}-{{.}}-{{else}}EMPTY{{end}}", "EMPTY", tVal, true}, + {"range []bool", "{{range .SB}}-{{.}}-{{end}}", "-true--false-", tVal, true}, + {"range []int method", "{{range .SI | .MAdd .I}}-{{.}}-{{end}}", "-20--21--22-", tVal, true}, + {"range map", "{{range .MSI}}-{{.}}-{{end}}", "-1--3--2-", tVal, true}, + {"range empty map no else", "{{range .MSIEmpty}}-{{.}}-{{end}}", "", tVal, true}, + {"range map else", "{{range .MSI}}-{{.}}-{{else}}EMPTY{{end}}", "-1--3--2-", tVal, true}, + {"range empty map else", "{{range .MSIEmpty}}-{{.}}-{{else}}EMPTY{{end}}", "EMPTY", tVal, true}, + {"range empty interface", "{{range .Empty3}}-{{.}}-{{else}}EMPTY{{end}}", "-7--8-", tVal, true}, + {"range empty nil", "{{range .Empty0}}-{{.}}-{{end}}", "", tVal, true}, + {"range $x SI", "{{range $x := .SI}}<{{$x}}>{{end}}", "<3><4><5>", tVal, true}, + {"range $x $y SI", "{{range $x, $y := .SI}}<{{$x}}={{$y}}>{{end}}", "<0=3><1=4><2=5>", tVal, true}, + {"range $x MSIone", "{{range $x := .MSIone}}<{{$x}}>{{end}}", "<1>", tVal, true}, + {"range $x $y MSIone", "{{range $x, $y := .MSIone}}<{{$x}}={{$y}}>{{end}}", "", tVal, true}, + {"range $x PSI", "{{range $x := .PSI}}<{{$x}}>{{end}}", "<21><22><23>", tVal, true}, + {"declare in range", "{{range $x := .PSI}}<{{$foo:=$x}}{{$x}}>{{end}}", "<21><22><23>", tVal, true}, + {"range count", `{{range $i, $x := count 5}}[{{$i}}]{{$x}}{{end}}`, "[0]a[1]b[2]c[3]d[4]e", tVal, true}, + {"range nil count", `{{range $i, $x := count 0}}{{else}}empty{{end}}`, "empty", tVal, true}, + + // Cute examples. + {"or as if true", `{{or .SI "slice is empty"}}`, "[3 4 5]", tVal, true}, + {"or as if false", `{{or .SIEmpty "slice is empty"}}`, "slice is empty", tVal, true}, + + // Error handling. + {"error method, error", "{{.MyError true}}", "", tVal, false}, + {"error method, no error", "{{.MyError false}}", "false", tVal, true}, + + // Fixed bugs. + // Must separate dot and receiver; otherwise args are evaluated with dot set to variable. + {"bug0", "{{range .MSIone}}{{if $.Method1 .}}X{{end}}{{end}}", "X", tVal, true}, + // Do not loop endlessly in indirect for non-empty interfaces. + // The bug appears with *interface only; looped forever. + {"bug1", "{{.Method0}}", "M0", &iVal, true}, + // Was taking address of interface field, so method set was empty. + {"bug2", "{{$.NonEmptyInterface.Method0}}", "M0", tVal, true}, + // Struct values were not legal in with - mere oversight. + {"bug3", "{{with $}}{{.Method0}}{{end}}", "M0", tVal, true}, + // Nil interface values in if. + {"bug4", "{{if .Empty0}}non-nil{{else}}nil{{end}}", "nil", tVal, true}, + // Stringer. + {"bug5", "{{.Str}}", "foozle", tVal, true}, + {"bug5a", "{{.Err}}", "erroozle", tVal, true}, + // Args need to be indirected and dereferenced sometimes. + {"bug6a", "{{vfunc .V0 .V1}}", "vfunc", tVal, true}, + {"bug6b", "{{vfunc .V0 .V0}}", "vfunc", tVal, true}, + {"bug6c", "{{vfunc .V1 .V0}}", "vfunc", tVal, true}, + {"bug6d", "{{vfunc .V1 .V1}}", "vfunc", tVal, true}, + // Legal parse but illegal execution: non-function should have no arguments. + {"bug7a", "{{3 2}}", "", tVal, false}, + {"bug7b", "{{$x := 1}}{{$x 2}}", "", tVal, false}, + {"bug7c", "{{$x := 1}}{{3 | $x}}", "", tVal, false}, + // Pipelined arg was not being type-checked. + {"bug8a", "{{3|oneArg}}", "", tVal, false}, + {"bug8b", "{{4|dddArg 3}}", "", tVal, false}, + // A bug was introduced that broke map lookups for lower-case names. + {"bug9", "{{.cause}}", "neglect", map[string]string{"cause": "neglect"}, true}, + // Field chain starting with function did not work. + {"bug10", "{{mapOfThree.three}}-{{(mapOfThree).three}}", "3-3", 0, true}, + // Dereferencing nil pointer while evaluating function arguments should not panic. Issue 7333. + {"bug11", "{{valueString .PS}}", "", T{}, false}, + // 0xef gave constant type float64. Issue 8622. + {"bug12xe", "{{printf `%T` 0xef}}", "int", T{}, true}, + {"bug12xE", "{{printf `%T` 0xEE}}", "int", T{}, true}, + {"bug12Xe", "{{printf `%T` 0Xef}}", "int", T{}, true}, + {"bug12XE", "{{printf `%T` 0XEE}}", "int", T{}, true}, + // Chained nodes did not work as arguments. Issue 8473. + {"bug13", "{{print (.Copy).I}}", "17", tVal, true}, +} + +func zeroArgs() string { + return "zeroArgs" +} + +func oneArg(a string) string { + return "oneArg=" + a +} + +func dddArg(a int, b ...string) string { + return fmt.Sprintln(a, b) +} + +// count returns a channel that will deliver n sequential 1-letter strings starting at "a" +func count(n int) chan string { + if n == 0 { + return nil + } + c := make(chan string) + go func() { + for i := 0; i < n; i++ { + c <- "abcdefghijklmnop"[i : i+1] + } + close(c) + }() + return c +} + +// vfunc takes a *V and a V +func vfunc(V, *V) string { + return "vfunc" +} + +// valueString takes a string, not a pointer. +func valueString(v string) string { + return "value is ignored" +} + +func add(args ...int) int { + sum := 0 + for _, x := range args { + sum += x + } + return sum +} + +func echo(arg interface{}) interface{} { + return arg +} + +func makemap(arg ...string) map[string]string { + if len(arg)%2 != 0 { + panic("bad makemap") + } + m := make(map[string]string) + for i := 0; i < len(arg); i += 2 { + m[arg[i]] = arg[i+1] + } + return m +} + +func stringer(s fmt.Stringer) string { + return s.String() +} + +func mapOfThree() interface{} { + return map[string]int{"three": 3} +} + +func testExecute(execTests []execTest, template *Template, t *testing.T) { + b := new(bytes.Buffer) + funcs := FuncMap{ + "add": add, + "count": count, + "dddArg": dddArg, + "echo": echo, + "makemap": makemap, + "mapOfThree": mapOfThree, + "oneArg": oneArg, + "stringer": stringer, + "typeOf": typeOf, + "valueString": valueString, + "vfunc": vfunc, + "zeroArgs": zeroArgs, + } + for _, test := range execTests { + var tmpl *Template + var err error + if template == nil { + tmpl, err = New(test.name).Funcs(funcs).Parse(test.input) + } else { + tmpl, err = template.New(test.name).Funcs(funcs).Parse(test.input) + } + if err != nil { + t.Errorf("%s: parse error: %s", test.name, err) + continue + } + b.Reset() + err = tmpl.Execute(b, test.data) + switch { + case !test.ok && err == nil: + t.Errorf("%s: expected error; got none", test.name) + continue + case test.ok && err != nil: + t.Errorf("%s: unexpected execute error: %s", test.name, err) + continue + case !test.ok && err != nil: + // expected error, got one + if *debug { + fmt.Printf("%s: %s\n\t%s\n", test.name, test.input, err) + } + } + result := b.String() + if result != test.output { + t.Errorf("%s: expected\n\t%q\ngot\n\t%q", test.name, test.output, result) + } + } +} + +func TestExecute(t *testing.T) { + testExecute(execTests, nil, t) +} + +var delimPairs = []string{ + "", "", // default + "{{", "}}", // same as default + "<<", ">>", // distinct + "|", "|", // same + "(日)", "(本)", // peculiar +} + +func TestDelims(t *testing.T) { + const hello = "Hello, world" + var value = struct{ Str string }{hello} + for i := 0; i < len(delimPairs); i += 2 { + text := ".Str" + left := delimPairs[i+0] + trueLeft := left + right := delimPairs[i+1] + trueRight := right + if left == "" { // default case + trueLeft = "{{" + } + if right == "" { // default case + trueRight = "}}" + } + text = trueLeft + text + trueRight + // Now add a comment + text += trueLeft + "/*comment*/" + trueRight + // Now add an action containing a string. + text += trueLeft + `"` + trueLeft + `"` + trueRight + // At this point text looks like `{{.Str}}{{/*comment*/}}{{"{{"}}`. + tmpl, err := New("delims").Delims(left, right).Parse(text) + if err != nil { + t.Fatalf("delim %q text %q parse err %s", left, text, err) + } + var b = new(bytes.Buffer) + err = tmpl.Execute(b, value) + if err != nil { + t.Fatalf("delim %q exec err %s", left, err) + } + if b.String() != hello+trueLeft { + t.Errorf("expected %q got %q", hello+trueLeft, b.String()) + } + } +} + +// Check that an error from a method flows back to the top. +func TestExecuteError(t *testing.T) { + b := new(bytes.Buffer) + tmpl := New("error") + _, err := tmpl.Parse("{{.MyError true}}") + if err != nil { + t.Fatalf("parse error: %s", err) + } + err = tmpl.Execute(b, tVal) + if err == nil { + t.Errorf("expected error; got none") + } else if !strings.Contains(err.Error(), myError.Error()) { + if *debug { + fmt.Printf("test execute error: %s\n", err) + } + t.Errorf("expected myError; got %s", err) + } +} + +const execErrorText = `line 1 +line 2 +line 3 +{{template "one" .}} +{{define "one"}}{{template "two" .}}{{end}} +{{define "two"}}{{template "three" .}}{{end}} +{{define "three"}}{{index "hi" $}}{{end}}` + +// Check that an error from a nested template contains all the relevant information. +func TestExecError(t *testing.T) { + tmpl, err := New("top").Parse(execErrorText) + if err != nil { + t.Fatal("parse error:", err) + } + var b bytes.Buffer + err = tmpl.Execute(&b, 5) // 5 is out of range indexing "hi" + if err == nil { + t.Fatal("expected error") + } + const want = `template: top:7:20: executing "three" at : error calling index: index out of range: 5` + got := err.Error() + if got != want { + t.Errorf("expected\n%q\ngot\n%q", want, got) + } +} + +func TestJSEscaping(t *testing.T) { + testCases := []struct { + in, exp string + }{ + {`a`, `a`}, + {`'foo`, `\'foo`}, + {`Go "jump" \`, `Go \"jump\" \\`}, + {`Yukihiro says "今日は世界"`, `Yukihiro says \"今日は世界\"`}, + {"unprintable \uFDFF", `unprintable \uFDFF`}, + {``, `\x3Chtml\x3E`}, + } + for _, tc := range testCases { + s := JSEscapeString(tc.in) + if s != tc.exp { + t.Errorf("JS escaping [%s] got [%s] want [%s]", tc.in, s, tc.exp) + } + } +} + +// A nice example: walk a binary tree. + +type Tree struct { + Val int + Left, Right *Tree +} + +// Use different delimiters to test Set.Delims. +const treeTemplate = ` + (define "tree") + [ + (.Val) + (with .Left) + (template "tree" .) + (end) + (with .Right) + (template "tree" .) + (end) + ] + (end) +` + +func TestTree(t *testing.T) { + var tree = &Tree{ + 1, + &Tree{ + 2, &Tree{ + 3, + &Tree{ + 4, nil, nil, + }, + nil, + }, + &Tree{ + 5, + &Tree{ + 6, nil, nil, + }, + nil, + }, + }, + &Tree{ + 7, + &Tree{ + 8, + &Tree{ + 9, nil, nil, + }, + nil, + }, + &Tree{ + 10, + &Tree{ + 11, nil, nil, + }, + nil, + }, + }, + } + tmpl, err := New("root").Delims("(", ")").Parse(treeTemplate) + if err != nil { + t.Fatal("parse error:", err) + } + var b bytes.Buffer + stripSpace := func(r rune) rune { + if r == '\t' || r == '\n' { + return -1 + } + return r + } + const expect = "[1[2[3[4]][5[6]]][7[8[9]][10[11]]]]" + // First by looking up the template. + err = tmpl.Lookup("tree").Execute(&b, tree) + if err != nil { + t.Fatal("exec error:", err) + } + result := strings.Map(stripSpace, b.String()) + if result != expect { + t.Errorf("expected %q got %q", expect, result) + } + // Then direct to execution. + b.Reset() + err = tmpl.ExecuteTemplate(&b, "tree", tree) + if err != nil { + t.Fatal("exec error:", err) + } + result = strings.Map(stripSpace, b.String()) + if result != expect { + t.Errorf("expected %q got %q", expect, result) + } +} + +func TestExecuteOnNewTemplate(t *testing.T) { + // This is issue 3872. + _ = New("Name").Templates() +} + +const testTemplates = `{{define "one"}}one{{end}}{{define "two"}}two{{end}}` + +func TestMessageForExecuteEmpty(t *testing.T) { + // Test a truly empty template. + tmpl := New("empty") + var b bytes.Buffer + err := tmpl.Execute(&b, 0) + if err == nil { + t.Fatal("expected initial error") + } + got := err.Error() + want := `template: empty: "empty" is an incomplete or empty template` + if got != want { + t.Errorf("expected error %s got %s", want, got) + } + // Add a non-empty template to check that the error is helpful. + tests, err := New("").Parse(testTemplates) + if err != nil { + t.Fatal(err) + } + tmpl.AddParseTree("secondary", tests.Tree) + err = tmpl.Execute(&b, 0) + if err == nil { + t.Fatal("expected second error") + } + got = err.Error() + want = `template: empty: "empty" is an incomplete or empty template; defined templates are: "secondary"` + if got != want { + t.Errorf("expected error %s got %s", want, got) + } + // Make sure we can execute the secondary. + err = tmpl.ExecuteTemplate(&b, "secondary", 0) + if err != nil { + t.Fatal(err) + } +} + +func TestFinalForPrintf(t *testing.T) { + tmpl, err := New("").Parse(`{{"x" | printf}}`) + if err != nil { + t.Fatal(err) + } + var b bytes.Buffer + err = tmpl.Execute(&b, 0) + if err != nil { + t.Fatal(err) + } +} + +type cmpTest struct { + expr string + truth string + ok bool +} + +var cmpTests = []cmpTest{ + {"eq true true", "true", true}, + {"eq true false", "false", true}, + {"eq 1+2i 1+2i", "true", true}, + {"eq 1+2i 1+3i", "false", true}, + {"eq 1.5 1.5", "true", true}, + {"eq 1.5 2.5", "false", true}, + {"eq 1 1", "true", true}, + {"eq 1 2", "false", true}, + {"eq `xy` `xy`", "true", true}, + {"eq `xy` `xyz`", "false", true}, + {"eq .Uthree .Uthree", "true", true}, + {"eq .Uthree .Ufour", "false", true}, + {"eq 3 4 5 6 3", "true", true}, + {"eq 3 4 5 6 7", "false", true}, + {"ne true true", "false", true}, + {"ne true false", "true", true}, + {"ne 1+2i 1+2i", "false", true}, + {"ne 1+2i 1+3i", "true", true}, + {"ne 1.5 1.5", "false", true}, + {"ne 1.5 2.5", "true", true}, + {"ne 1 1", "false", true}, + {"ne 1 2", "true", true}, + {"ne `xy` `xy`", "false", true}, + {"ne `xy` `xyz`", "true", true}, + {"ne .Uthree .Uthree", "false", true}, + {"ne .Uthree .Ufour", "true", true}, + {"lt 1.5 1.5", "false", true}, + {"lt 1.5 2.5", "true", true}, + {"lt 1 1", "false", true}, + {"lt 1 2", "true", true}, + {"lt `xy` `xy`", "false", true}, + {"lt `xy` `xyz`", "true", true}, + {"lt .Uthree .Uthree", "false", true}, + {"lt .Uthree .Ufour", "true", true}, + {"le 1.5 1.5", "true", true}, + {"le 1.5 2.5", "true", true}, + {"le 2.5 1.5", "false", true}, + {"le 1 1", "true", true}, + {"le 1 2", "true", true}, + {"le 2 1", "false", true}, + {"le `xy` `xy`", "true", true}, + {"le `xy` `xyz`", "true", true}, + {"le `xyz` `xy`", "false", true}, + {"le .Uthree .Uthree", "true", true}, + {"le .Uthree .Ufour", "true", true}, + {"le .Ufour .Uthree", "false", true}, + {"gt 1.5 1.5", "false", true}, + {"gt 1.5 2.5", "false", true}, + {"gt 1 1", "false", true}, + {"gt 2 1", "true", true}, + {"gt 1 2", "false", true}, + {"gt `xy` `xy`", "false", true}, + {"gt `xy` `xyz`", "false", true}, + {"gt .Uthree .Uthree", "false", true}, + {"gt .Uthree .Ufour", "false", true}, + {"gt .Ufour .Uthree", "true", true}, + {"ge 1.5 1.5", "true", true}, + {"ge 1.5 2.5", "false", true}, + {"ge 2.5 1.5", "true", true}, + {"ge 1 1", "true", true}, + {"ge 1 2", "false", true}, + {"ge 2 1", "true", true}, + {"ge `xy` `xy`", "true", true}, + {"ge `xy` `xyz`", "false", true}, + {"ge `xyz` `xy`", "true", true}, + {"ge .Uthree .Uthree", "true", true}, + {"ge .Uthree .Ufour", "false", true}, + {"ge .Ufour .Uthree", "true", true}, + // Mixing signed and unsigned integers. + {"eq .Uthree .Three", "true", true}, + {"eq .Three .Uthree", "true", true}, + {"le .Uthree .Three", "true", true}, + {"le .Three .Uthree", "true", true}, + {"ge .Uthree .Three", "true", true}, + {"ge .Three .Uthree", "true", true}, + {"lt .Uthree .Three", "false", true}, + {"lt .Three .Uthree", "false", true}, + {"gt .Uthree .Three", "false", true}, + {"gt .Three .Uthree", "false", true}, + {"eq .Ufour .Three", "false", true}, + {"lt .Ufour .Three", "false", true}, + {"gt .Ufour .Three", "true", true}, + {"eq .NegOne .Uthree", "false", true}, + {"eq .Uthree .NegOne", "false", true}, + {"ne .NegOne .Uthree", "true", true}, + {"ne .Uthree .NegOne", "true", true}, + {"lt .NegOne .Uthree", "true", true}, + {"lt .Uthree .NegOne", "false", true}, + {"le .NegOne .Uthree", "true", true}, + {"le .Uthree .NegOne", "false", true}, + {"gt .NegOne .Uthree", "false", true}, + {"gt .Uthree .NegOne", "true", true}, + {"ge .NegOne .Uthree", "false", true}, + {"ge .Uthree .NegOne", "true", true}, + {"eq (index `x` 0) 'x'", "true", true}, // The example that triggered this rule. + {"eq (index `x` 0) 'y'", "false", true}, + // Errors + {"eq `xy` 1", "", false}, // Different types. + {"eq 2 2.0", "", false}, // Different types. + {"lt true true", "", false}, // Unordered types. + {"lt 1+0i 1+0i", "", false}, // Unordered types. +} + +func TestComparison(t *testing.T) { + b := new(bytes.Buffer) + var cmpStruct = struct { + Uthree, Ufour uint + NegOne, Three int + }{3, 4, -1, 3} + for _, test := range cmpTests { + text := fmt.Sprintf("{{if %s}}true{{else}}false{{end}}", test.expr) + tmpl, err := New("empty").Parse(text) + if err != nil { + t.Fatalf("%q: %s", test.expr, err) + } + b.Reset() + err = tmpl.Execute(b, &cmpStruct) + if test.ok && err != nil { + t.Errorf("%s errored incorrectly: %s", test.expr, err) + continue + } + if !test.ok && err == nil { + t.Errorf("%s did not error", test.expr) + continue + } + if b.String() != test.truth { + t.Errorf("%s: want %s; got %s", test.expr, test.truth, b.String()) + } + } +} diff --git a/api/vendor/github.com/alecthomas/template/funcs.go b/api/vendor/github.com/alecthomas/template/funcs.go new file mode 100644 index 0000000..39ee5ed --- /dev/null +++ b/api/vendor/github.com/alecthomas/template/funcs.go @@ -0,0 +1,598 @@ +// 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 template + +import ( + "bytes" + "errors" + "fmt" + "io" + "net/url" + "reflect" + "strings" + "unicode" + "unicode/utf8" +) + +// FuncMap is the type of the map defining the mapping from names to functions. +// Each function must have either a single return value, or two return values of +// which the second has type error. In that case, if the second (error) +// return value evaluates to non-nil during execution, execution terminates and +// Execute returns that error. +type FuncMap map[string]interface{} + +var builtins = FuncMap{ + "and": and, + "call": call, + "html": HTMLEscaper, + "index": index, + "js": JSEscaper, + "len": length, + "not": not, + "or": or, + "print": fmt.Sprint, + "printf": fmt.Sprintf, + "println": fmt.Sprintln, + "urlquery": URLQueryEscaper, + + // Comparisons + "eq": eq, // == + "ge": ge, // >= + "gt": gt, // > + "le": le, // <= + "lt": lt, // < + "ne": ne, // != +} + +var builtinFuncs = createValueFuncs(builtins) + +// createValueFuncs turns a FuncMap into a map[string]reflect.Value +func createValueFuncs(funcMap FuncMap) map[string]reflect.Value { + m := make(map[string]reflect.Value) + addValueFuncs(m, funcMap) + return m +} + +// addValueFuncs adds to values the functions in funcs, converting them to reflect.Values. +func addValueFuncs(out map[string]reflect.Value, in FuncMap) { + for name, fn := range in { + v := reflect.ValueOf(fn) + if v.Kind() != reflect.Func { + panic("value for " + name + " not a function") + } + if !goodFunc(v.Type()) { + panic(fmt.Errorf("can't install method/function %q with %d results", name, v.Type().NumOut())) + } + out[name] = v + } +} + +// addFuncs adds to values the functions in funcs. It does no checking of the input - +// call addValueFuncs first. +func addFuncs(out, in FuncMap) { + for name, fn := range in { + out[name] = fn + } +} + +// goodFunc checks that the function or method has the right result signature. +func goodFunc(typ reflect.Type) bool { + // We allow functions with 1 result or 2 results where the second is an error. + switch { + case typ.NumOut() == 1: + return true + case typ.NumOut() == 2 && typ.Out(1) == errorType: + return true + } + return false +} + +// findFunction looks for a function in the template, and global map. +func findFunction(name string, tmpl *Template) (reflect.Value, bool) { + if tmpl != nil && tmpl.common != nil { + if fn := tmpl.execFuncs[name]; fn.IsValid() { + return fn, true + } + } + if fn := builtinFuncs[name]; fn.IsValid() { + return fn, true + } + return reflect.Value{}, false +} + +// Indexing. + +// index returns the result of indexing its first argument by the following +// arguments. Thus "index x 1 2 3" is, in Go syntax, x[1][2][3]. Each +// indexed item must be a map, slice, or array. +func index(item interface{}, indices ...interface{}) (interface{}, error) { + v := reflect.ValueOf(item) + for _, i := range indices { + index := reflect.ValueOf(i) + var isNil bool + if v, isNil = indirect(v); isNil { + return nil, fmt.Errorf("index of nil pointer") + } + switch v.Kind() { + case reflect.Array, reflect.Slice, reflect.String: + var x int64 + switch index.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + x = index.Int() + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + x = int64(index.Uint()) + default: + return nil, fmt.Errorf("cannot index slice/array with type %s", index.Type()) + } + if x < 0 || x >= int64(v.Len()) { + return nil, fmt.Errorf("index out of range: %d", x) + } + v = v.Index(int(x)) + case reflect.Map: + if !index.IsValid() { + index = reflect.Zero(v.Type().Key()) + } + if !index.Type().AssignableTo(v.Type().Key()) { + return nil, fmt.Errorf("%s is not index type for %s", index.Type(), v.Type()) + } + if x := v.MapIndex(index); x.IsValid() { + v = x + } else { + v = reflect.Zero(v.Type().Elem()) + } + default: + return nil, fmt.Errorf("can't index item of type %s", v.Type()) + } + } + return v.Interface(), nil +} + +// Length + +// length returns the length of the item, with an error if it has no defined length. +func length(item interface{}) (int, error) { + v, isNil := indirect(reflect.ValueOf(item)) + if isNil { + return 0, fmt.Errorf("len of nil pointer") + } + switch v.Kind() { + case reflect.Array, reflect.Chan, reflect.Map, reflect.Slice, reflect.String: + return v.Len(), nil + } + return 0, fmt.Errorf("len of type %s", v.Type()) +} + +// Function invocation + +// call returns the result of evaluating the first argument as a function. +// The function must return 1 result, or 2 results, the second of which is an error. +func call(fn interface{}, args ...interface{}) (interface{}, error) { + v := reflect.ValueOf(fn) + typ := v.Type() + if typ.Kind() != reflect.Func { + return nil, fmt.Errorf("non-function of type %s", typ) + } + if !goodFunc(typ) { + return nil, fmt.Errorf("function called with %d args; should be 1 or 2", typ.NumOut()) + } + numIn := typ.NumIn() + var dddType reflect.Type + if typ.IsVariadic() { + if len(args) < numIn-1 { + return nil, fmt.Errorf("wrong number of args: got %d want at least %d", len(args), numIn-1) + } + dddType = typ.In(numIn - 1).Elem() + } else { + if len(args) != numIn { + return nil, fmt.Errorf("wrong number of args: got %d want %d", len(args), numIn) + } + } + argv := make([]reflect.Value, len(args)) + for i, arg := range args { + value := reflect.ValueOf(arg) + // Compute the expected type. Clumsy because of variadics. + var argType reflect.Type + if !typ.IsVariadic() || i < numIn-1 { + argType = typ.In(i) + } else { + argType = dddType + } + if !value.IsValid() && canBeNil(argType) { + value = reflect.Zero(argType) + } + if !value.Type().AssignableTo(argType) { + return nil, fmt.Errorf("arg %d has type %s; should be %s", i, value.Type(), argType) + } + argv[i] = value + } + result := v.Call(argv) + if len(result) == 2 && !result[1].IsNil() { + return result[0].Interface(), result[1].Interface().(error) + } + return result[0].Interface(), nil +} + +// Boolean logic. + +func truth(a interface{}) bool { + t, _ := isTrue(reflect.ValueOf(a)) + return t +} + +// and computes the Boolean AND of its arguments, returning +// the first false argument it encounters, or the last argument. +func and(arg0 interface{}, args ...interface{}) interface{} { + if !truth(arg0) { + return arg0 + } + for i := range args { + arg0 = args[i] + if !truth(arg0) { + break + } + } + return arg0 +} + +// or computes the Boolean OR of its arguments, returning +// the first true argument it encounters, or the last argument. +func or(arg0 interface{}, args ...interface{}) interface{} { + if truth(arg0) { + return arg0 + } + for i := range args { + arg0 = args[i] + if truth(arg0) { + break + } + } + return arg0 +} + +// not returns the Boolean negation of its argument. +func not(arg interface{}) (truth bool) { + truth, _ = isTrue(reflect.ValueOf(arg)) + return !truth +} + +// Comparison. + +// TODO: Perhaps allow comparison between signed and unsigned integers. + +var ( + errBadComparisonType = errors.New("invalid type for comparison") + errBadComparison = errors.New("incompatible types for comparison") + errNoComparison = errors.New("missing argument for comparison") +) + +type kind int + +const ( + invalidKind kind = iota + boolKind + complexKind + intKind + floatKind + integerKind + stringKind + uintKind +) + +func basicKind(v reflect.Value) (kind, error) { + switch v.Kind() { + case reflect.Bool: + return boolKind, nil + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return intKind, nil + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return uintKind, nil + case reflect.Float32, reflect.Float64: + return floatKind, nil + case reflect.Complex64, reflect.Complex128: + return complexKind, nil + case reflect.String: + return stringKind, nil + } + return invalidKind, errBadComparisonType +} + +// eq evaluates the comparison a == b || a == c || ... +func eq(arg1 interface{}, arg2 ...interface{}) (bool, error) { + v1 := reflect.ValueOf(arg1) + k1, err := basicKind(v1) + if err != nil { + return false, err + } + if len(arg2) == 0 { + return false, errNoComparison + } + for _, arg := range arg2 { + v2 := reflect.ValueOf(arg) + k2, err := basicKind(v2) + if err != nil { + return false, err + } + truth := false + if k1 != k2 { + // Special case: Can compare integer values regardless of type's sign. + switch { + case k1 == intKind && k2 == uintKind: + truth = v1.Int() >= 0 && uint64(v1.Int()) == v2.Uint() + case k1 == uintKind && k2 == intKind: + truth = v2.Int() >= 0 && v1.Uint() == uint64(v2.Int()) + default: + return false, errBadComparison + } + } else { + switch k1 { + case boolKind: + truth = v1.Bool() == v2.Bool() + case complexKind: + truth = v1.Complex() == v2.Complex() + case floatKind: + truth = v1.Float() == v2.Float() + case intKind: + truth = v1.Int() == v2.Int() + case stringKind: + truth = v1.String() == v2.String() + case uintKind: + truth = v1.Uint() == v2.Uint() + default: + panic("invalid kind") + } + } + if truth { + return true, nil + } + } + return false, nil +} + +// ne evaluates the comparison a != b. +func ne(arg1, arg2 interface{}) (bool, error) { + // != is the inverse of ==. + equal, err := eq(arg1, arg2) + return !equal, err +} + +// lt evaluates the comparison a < b. +func lt(arg1, arg2 interface{}) (bool, error) { + v1 := reflect.ValueOf(arg1) + k1, err := basicKind(v1) + if err != nil { + return false, err + } + v2 := reflect.ValueOf(arg2) + k2, err := basicKind(v2) + if err != nil { + return false, err + } + truth := false + if k1 != k2 { + // Special case: Can compare integer values regardless of type's sign. + switch { + case k1 == intKind && k2 == uintKind: + truth = v1.Int() < 0 || uint64(v1.Int()) < v2.Uint() + case k1 == uintKind && k2 == intKind: + truth = v2.Int() >= 0 && v1.Uint() < uint64(v2.Int()) + default: + return false, errBadComparison + } + } else { + switch k1 { + case boolKind, complexKind: + return false, errBadComparisonType + case floatKind: + truth = v1.Float() < v2.Float() + case intKind: + truth = v1.Int() < v2.Int() + case stringKind: + truth = v1.String() < v2.String() + case uintKind: + truth = v1.Uint() < v2.Uint() + default: + panic("invalid kind") + } + } + return truth, nil +} + +// le evaluates the comparison <= b. +func le(arg1, arg2 interface{}) (bool, error) { + // <= is < or ==. + lessThan, err := lt(arg1, arg2) + if lessThan || err != nil { + return lessThan, err + } + return eq(arg1, arg2) +} + +// gt evaluates the comparison a > b. +func gt(arg1, arg2 interface{}) (bool, error) { + // > is the inverse of <=. + lessOrEqual, err := le(arg1, arg2) + if err != nil { + return false, err + } + return !lessOrEqual, nil +} + +// ge evaluates the comparison a >= b. +func ge(arg1, arg2 interface{}) (bool, error) { + // >= is the inverse of <. + lessThan, err := lt(arg1, arg2) + if err != nil { + return false, err + } + return !lessThan, nil +} + +// HTML escaping. + +var ( + htmlQuot = []byte(""") // shorter than """ + htmlApos = []byte("'") // shorter than "'" and apos was not in HTML until HTML5 + htmlAmp = []byte("&") + htmlLt = []byte("<") + htmlGt = []byte(">") +) + +// HTMLEscape writes to w the escaped HTML equivalent of the plain text data b. +func HTMLEscape(w io.Writer, b []byte) { + last := 0 + for i, c := range b { + var html []byte + switch c { + case '"': + html = htmlQuot + case '\'': + html = htmlApos + case '&': + html = htmlAmp + case '<': + html = htmlLt + case '>': + html = htmlGt + default: + continue + } + w.Write(b[last:i]) + w.Write(html) + last = i + 1 + } + w.Write(b[last:]) +} + +// HTMLEscapeString returns the escaped HTML equivalent of the plain text data s. +func HTMLEscapeString(s string) string { + // Avoid allocation if we can. + if strings.IndexAny(s, `'"&<>`) < 0 { + return s + } + var b bytes.Buffer + HTMLEscape(&b, []byte(s)) + return b.String() +} + +// HTMLEscaper returns the escaped HTML equivalent of the textual +// representation of its arguments. +func HTMLEscaper(args ...interface{}) string { + return HTMLEscapeString(evalArgs(args)) +} + +// JavaScript escaping. + +var ( + jsLowUni = []byte(`\u00`) + hex = []byte("0123456789ABCDEF") + + jsBackslash = []byte(`\\`) + jsApos = []byte(`\'`) + jsQuot = []byte(`\"`) + jsLt = []byte(`\x3C`) + jsGt = []byte(`\x3E`) +) + +// JSEscape writes to w the escaped JavaScript equivalent of the plain text data b. +func JSEscape(w io.Writer, b []byte) { + last := 0 + for i := 0; i < len(b); i++ { + c := b[i] + + if !jsIsSpecial(rune(c)) { + // fast path: nothing to do + continue + } + w.Write(b[last:i]) + + if c < utf8.RuneSelf { + // Quotes, slashes and angle brackets get quoted. + // Control characters get written as \u00XX. + switch c { + case '\\': + w.Write(jsBackslash) + case '\'': + w.Write(jsApos) + case '"': + w.Write(jsQuot) + case '<': + w.Write(jsLt) + case '>': + w.Write(jsGt) + default: + w.Write(jsLowUni) + t, b := c>>4, c&0x0f + w.Write(hex[t : t+1]) + w.Write(hex[b : b+1]) + } + } else { + // Unicode rune. + r, size := utf8.DecodeRune(b[i:]) + if unicode.IsPrint(r) { + w.Write(b[i : i+size]) + } else { + fmt.Fprintf(w, "\\u%04X", r) + } + i += size - 1 + } + last = i + 1 + } + w.Write(b[last:]) +} + +// JSEscapeString returns the escaped JavaScript equivalent of the plain text data s. +func JSEscapeString(s string) string { + // Avoid allocation if we can. + if strings.IndexFunc(s, jsIsSpecial) < 0 { + return s + } + var b bytes.Buffer + JSEscape(&b, []byte(s)) + return b.String() +} + +func jsIsSpecial(r rune) bool { + switch r { + case '\\', '\'', '"', '<', '>': + return true + } + return r < ' ' || utf8.RuneSelf <= r +} + +// JSEscaper returns the escaped JavaScript equivalent of the textual +// representation of its arguments. +func JSEscaper(args ...interface{}) string { + return JSEscapeString(evalArgs(args)) +} + +// URLQueryEscaper returns the escaped value of the textual representation of +// its arguments in a form suitable for embedding in a URL query. +func URLQueryEscaper(args ...interface{}) string { + return url.QueryEscape(evalArgs(args)) +} + +// evalArgs formats the list of arguments into a string. It is therefore equivalent to +// fmt.Sprint(args...) +// except that each argument is indirected (if a pointer), as required, +// using the same rules as the default string evaluation during template +// execution. +func evalArgs(args []interface{}) string { + ok := false + var s string + // Fast path for simple common case. + if len(args) == 1 { + s, ok = args[0].(string) + } + if !ok { + for i, arg := range args { + a, ok := printableValue(reflect.ValueOf(arg)) + if ok { + args[i] = a + } // else left fmt do its thing + } + s = fmt.Sprint(args...) + } + return s +} diff --git a/api/vendor/github.com/alecthomas/template/helper.go b/api/vendor/github.com/alecthomas/template/helper.go new file mode 100644 index 0000000..3636fb5 --- /dev/null +++ b/api/vendor/github.com/alecthomas/template/helper.go @@ -0,0 +1,108 @@ +// 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. + +// Helper functions to make constructing templates easier. + +package template + +import ( + "fmt" + "io/ioutil" + "path/filepath" +) + +// Functions and methods to parse templates. + +// Must is a helper that wraps a call to a function returning (*Template, error) +// and panics if the error is non-nil. It is intended for use in variable +// initializations such as +// var t = template.Must(template.New("name").Parse("text")) +func Must(t *Template, err error) *Template { + if err != nil { + panic(err) + } + return t +} + +// ParseFiles creates a new Template and parses the template definitions from +// the named files. The returned template's name will have the (base) name and +// (parsed) contents of the first file. There must be at least one file. +// If an error occurs, parsing stops and the returned *Template is nil. +func ParseFiles(filenames ...string) (*Template, error) { + return parseFiles(nil, filenames...) +} + +// ParseFiles parses the named files and associates the resulting templates with +// t. If an error occurs, parsing stops and the returned template is nil; +// otherwise it is t. There must be at least one file. +func (t *Template) ParseFiles(filenames ...string) (*Template, error) { + return parseFiles(t, filenames...) +} + +// parseFiles is the helper for the method and function. If the argument +// template is nil, it is created from the first file. +func parseFiles(t *Template, filenames ...string) (*Template, error) { + if len(filenames) == 0 { + // Not really a problem, but be consistent. + return nil, fmt.Errorf("template: no files named in call to ParseFiles") + } + for _, filename := range filenames { + b, err := ioutil.ReadFile(filename) + if err != nil { + return nil, err + } + s := string(b) + name := filepath.Base(filename) + // First template becomes return value if not already defined, + // and we use that one for subsequent New calls to associate + // all the templates together. Also, if this file has the same name + // as t, this file becomes the contents of t, so + // t, err := New(name).Funcs(xxx).ParseFiles(name) + // works. Otherwise we create a new template associated with t. + var tmpl *Template + if t == nil { + t = New(name) + } + if name == t.Name() { + tmpl = t + } else { + tmpl = t.New(name) + } + _, err = tmpl.Parse(s) + if err != nil { + return nil, err + } + } + return t, nil +} + +// ParseGlob creates a new Template and parses the template definitions from the +// files identified by the pattern, which must match at least one file. The +// returned template will have the (base) name and (parsed) contents of the +// first file matched by the pattern. ParseGlob is equivalent to calling +// ParseFiles with the list of files matched by the pattern. +func ParseGlob(pattern string) (*Template, error) { + return parseGlob(nil, pattern) +} + +// ParseGlob parses the template definitions in the files identified by the +// pattern and associates the resulting templates with t. The pattern is +// processed by filepath.Glob and must match at least one file. ParseGlob is +// equivalent to calling t.ParseFiles with the list of files matched by the +// pattern. +func (t *Template) ParseGlob(pattern string) (*Template, error) { + return parseGlob(t, pattern) +} + +// parseGlob is the implementation of the function and method ParseGlob. +func parseGlob(t *Template, pattern string) (*Template, error) { + filenames, err := filepath.Glob(pattern) + if err != nil { + return nil, err + } + if len(filenames) == 0 { + return nil, fmt.Errorf("template: pattern matches no files: %#q", pattern) + } + return parseFiles(t, filenames...) +} diff --git a/api/vendor/github.com/alecthomas/template/multi_test.go b/api/vendor/github.com/alecthomas/template/multi_test.go new file mode 100644 index 0000000..8d10362 --- /dev/null +++ b/api/vendor/github.com/alecthomas/template/multi_test.go @@ -0,0 +1,293 @@ +// 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 template + +// Tests for mulitple-template parsing and execution. + +import ( + "bytes" + "fmt" + "strings" + "testing" + + "github.com/alecthomas/template/parse" +) + +const ( + noError = true + hasError = false +) + +type multiParseTest struct { + name string + input string + ok bool + names []string + results []string +} + +var multiParseTests = []multiParseTest{ + {"empty", "", noError, + nil, + nil}, + {"one", `{{define "foo"}} FOO {{end}}`, noError, + []string{"foo"}, + []string{" FOO "}}, + {"two", `{{define "foo"}} FOO {{end}}{{define "bar"}} BAR {{end}}`, noError, + []string{"foo", "bar"}, + []string{" FOO ", " BAR "}}, + // errors + {"missing end", `{{define "foo"}} FOO `, hasError, + nil, + nil}, + {"malformed name", `{{define "foo}} FOO `, hasError, + nil, + nil}, +} + +func TestMultiParse(t *testing.T) { + for _, test := range multiParseTests { + template, err := New("root").Parse(test.input) + switch { + case err == nil && !test.ok: + t.Errorf("%q: expected error; got none", test.name) + continue + case err != nil && test.ok: + t.Errorf("%q: unexpected error: %v", test.name, err) + continue + case err != nil && !test.ok: + // expected error, got one + if *debug { + fmt.Printf("%s: %s\n\t%s\n", test.name, test.input, err) + } + continue + } + if template == nil { + continue + } + if len(template.tmpl) != len(test.names)+1 { // +1 for root + t.Errorf("%s: wrong number of templates; wanted %d got %d", test.name, len(test.names), len(template.tmpl)) + continue + } + for i, name := range test.names { + tmpl, ok := template.tmpl[name] + if !ok { + t.Errorf("%s: can't find template %q", test.name, name) + continue + } + result := tmpl.Root.String() + if result != test.results[i] { + t.Errorf("%s=(%q): got\n\t%v\nexpected\n\t%v", test.name, test.input, result, test.results[i]) + } + } + } +} + +var multiExecTests = []execTest{ + {"empty", "", "", nil, true}, + {"text", "some text", "some text", nil, true}, + {"invoke x", `{{template "x" .SI}}`, "TEXT", tVal, true}, + {"invoke x no args", `{{template "x"}}`, "TEXT", tVal, true}, + {"invoke dot int", `{{template "dot" .I}}`, "17", tVal, true}, + {"invoke dot []int", `{{template "dot" .SI}}`, "[3 4 5]", tVal, true}, + {"invoke dotV", `{{template "dotV" .U}}`, "v", tVal, true}, + {"invoke nested int", `{{template "nested" .I}}`, "17", tVal, true}, + {"variable declared by template", `{{template "nested" $x:=.SI}},{{index $x 1}}`, "[3 4 5],4", tVal, true}, + + // User-defined function: test argument evaluator. + {"testFunc literal", `{{oneArg "joe"}}`, "oneArg=joe", tVal, true}, + {"testFunc .", `{{oneArg .}}`, "oneArg=joe", "joe", true}, +} + +// These strings are also in testdata/*. +const multiText1 = ` + {{define "x"}}TEXT{{end}} + {{define "dotV"}}{{.V}}{{end}} +` + +const multiText2 = ` + {{define "dot"}}{{.}}{{end}} + {{define "nested"}}{{template "dot" .}}{{end}} +` + +func TestMultiExecute(t *testing.T) { + // Declare a couple of templates first. + template, err := New("root").Parse(multiText1) + if err != nil { + t.Fatalf("parse error for 1: %s", err) + } + _, err = template.Parse(multiText2) + if err != nil { + t.Fatalf("parse error for 2: %s", err) + } + testExecute(multiExecTests, template, t) +} + +func TestParseFiles(t *testing.T) { + _, err := ParseFiles("DOES NOT EXIST") + if err == nil { + t.Error("expected error for non-existent file; got none") + } + template := New("root") + _, err = template.ParseFiles("testdata/file1.tmpl", "testdata/file2.tmpl") + if err != nil { + t.Fatalf("error parsing files: %v", err) + } + testExecute(multiExecTests, template, t) +} + +func TestParseGlob(t *testing.T) { + _, err := ParseGlob("DOES NOT EXIST") + if err == nil { + t.Error("expected error for non-existent file; got none") + } + _, err = New("error").ParseGlob("[x") + if err == nil { + t.Error("expected error for bad pattern; got none") + } + template := New("root") + _, err = template.ParseGlob("testdata/file*.tmpl") + if err != nil { + t.Fatalf("error parsing files: %v", err) + } + testExecute(multiExecTests, template, t) +} + +// In these tests, actual content (not just template definitions) comes from the parsed files. + +var templateFileExecTests = []execTest{ + {"test", `{{template "tmpl1.tmpl"}}{{template "tmpl2.tmpl"}}`, "template1\n\ny\ntemplate2\n\nx\n", 0, true}, +} + +func TestParseFilesWithData(t *testing.T) { + template, err := New("root").ParseFiles("testdata/tmpl1.tmpl", "testdata/tmpl2.tmpl") + if err != nil { + t.Fatalf("error parsing files: %v", err) + } + testExecute(templateFileExecTests, template, t) +} + +func TestParseGlobWithData(t *testing.T) { + template, err := New("root").ParseGlob("testdata/tmpl*.tmpl") + if err != nil { + t.Fatalf("error parsing files: %v", err) + } + testExecute(templateFileExecTests, template, t) +} + +const ( + cloneText1 = `{{define "a"}}{{template "b"}}{{template "c"}}{{end}}` + cloneText2 = `{{define "b"}}b{{end}}` + cloneText3 = `{{define "c"}}root{{end}}` + cloneText4 = `{{define "c"}}clone{{end}}` +) + +func TestClone(t *testing.T) { + // Create some templates and clone the root. + root, err := New("root").Parse(cloneText1) + if err != nil { + t.Fatal(err) + } + _, err = root.Parse(cloneText2) + if err != nil { + t.Fatal(err) + } + clone := Must(root.Clone()) + // Add variants to both. + _, err = root.Parse(cloneText3) + if err != nil { + t.Fatal(err) + } + _, err = clone.Parse(cloneText4) + if err != nil { + t.Fatal(err) + } + // Verify that the clone is self-consistent. + for k, v := range clone.tmpl { + if k == clone.name && v.tmpl[k] != clone { + t.Error("clone does not contain root") + } + if v != v.tmpl[v.name] { + t.Errorf("clone does not contain self for %q", k) + } + } + // Execute root. + var b bytes.Buffer + err = root.ExecuteTemplate(&b, "a", 0) + if err != nil { + t.Fatal(err) + } + if b.String() != "broot" { + t.Errorf("expected %q got %q", "broot", b.String()) + } + // Execute copy. + b.Reset() + err = clone.ExecuteTemplate(&b, "a", 0) + if err != nil { + t.Fatal(err) + } + if b.String() != "bclone" { + t.Errorf("expected %q got %q", "bclone", b.String()) + } +} + +func TestAddParseTree(t *testing.T) { + // Create some templates. + root, err := New("root").Parse(cloneText1) + if err != nil { + t.Fatal(err) + } + _, err = root.Parse(cloneText2) + if err != nil { + t.Fatal(err) + } + // Add a new parse tree. + tree, err := parse.Parse("cloneText3", cloneText3, "", "", nil, builtins) + if err != nil { + t.Fatal(err) + } + added, err := root.AddParseTree("c", tree["c"]) + // Execute. + var b bytes.Buffer + err = added.ExecuteTemplate(&b, "a", 0) + if err != nil { + t.Fatal(err) + } + if b.String() != "broot" { + t.Errorf("expected %q got %q", "broot", b.String()) + } +} + +// Issue 7032 +func TestAddParseTreeToUnparsedTemplate(t *testing.T) { + master := "{{define \"master\"}}{{end}}" + tmpl := New("master") + tree, err := parse.Parse("master", master, "", "", nil) + if err != nil { + t.Fatalf("unexpected parse err: %v", err) + } + masterTree := tree["master"] + tmpl.AddParseTree("master", masterTree) // used to panic +} + +func TestRedefinition(t *testing.T) { + var tmpl *Template + var err error + if tmpl, err = New("tmpl1").Parse(`{{define "test"}}foo{{end}}`); err != nil { + t.Fatalf("parse 1: %v", err) + } + if _, err = tmpl.Parse(`{{define "test"}}bar{{end}}`); err == nil { + t.Fatal("expected error") + } + if !strings.Contains(err.Error(), "redefinition") { + t.Fatalf("expected redefinition error; got %v", err) + } + if _, err = tmpl.New("tmpl2").Parse(`{{define "test"}}bar{{end}}`); err == nil { + t.Fatal("expected error") + } + if !strings.Contains(err.Error(), "redefinition") { + t.Fatalf("expected redefinition error; got %v", err) + } +} diff --git a/api/vendor/github.com/alecthomas/template/parse/lex.go b/api/vendor/github.com/alecthomas/template/parse/lex.go new file mode 100644 index 0000000..55f1c05 --- /dev/null +++ b/api/vendor/github.com/alecthomas/template/parse/lex.go @@ -0,0 +1,556 @@ +// 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 parse + +import ( + "fmt" + "strings" + "unicode" + "unicode/utf8" +) + +// item represents a token or text string returned from the scanner. +type item struct { + typ itemType // The type of this item. + pos Pos // The starting position, in bytes, of this item in the input string. + val string // The value of this item. +} + +func (i item) String() string { + switch { + case i.typ == itemEOF: + return "EOF" + case i.typ == itemError: + return i.val + case i.typ > itemKeyword: + return fmt.Sprintf("<%s>", i.val) + case len(i.val) > 10: + return fmt.Sprintf("%.10q...", i.val) + } + return fmt.Sprintf("%q", i.val) +} + +// itemType identifies the type of lex items. +type itemType int + +const ( + itemError itemType = iota // error occurred; value is text of error + itemBool // boolean constant + itemChar // printable ASCII character; grab bag for comma etc. + itemCharConstant // character constant + itemComplex // complex constant (1+2i); imaginary is just a number + itemColonEquals // colon-equals (':=') introducing a declaration + itemEOF + itemField // alphanumeric identifier starting with '.' + itemIdentifier // alphanumeric identifier not starting with '.' + itemLeftDelim // left action delimiter + itemLeftParen // '(' inside action + itemNumber // simple number, including imaginary + itemPipe // pipe symbol + itemRawString // raw quoted string (includes quotes) + itemRightDelim // right action delimiter + itemElideNewline // elide newline after right delim + itemRightParen // ')' inside action + itemSpace // run of spaces separating arguments + itemString // quoted string (includes quotes) + itemText // plain text + itemVariable // variable starting with '$', such as '$' or '$1' or '$hello' + // Keywords appear after all the rest. + itemKeyword // used only to delimit the keywords + itemDot // the cursor, spelled '.' + itemDefine // define keyword + itemElse // else keyword + itemEnd // end keyword + itemIf // if keyword + itemNil // the untyped nil constant, easiest to treat as a keyword + itemRange // range keyword + itemTemplate // template keyword + itemWith // with keyword +) + +var key = map[string]itemType{ + ".": itemDot, + "define": itemDefine, + "else": itemElse, + "end": itemEnd, + "if": itemIf, + "range": itemRange, + "nil": itemNil, + "template": itemTemplate, + "with": itemWith, +} + +const eof = -1 + +// stateFn represents the state of the scanner as a function that returns the next state. +type stateFn func(*lexer) stateFn + +// lexer holds the state of the scanner. +type lexer struct { + name string // the name of the input; used only for error reports + input string // the string being scanned + leftDelim string // start of action + rightDelim string // end of action + state stateFn // the next lexing function to enter + pos Pos // current position in the input + start Pos // start position of this item + width Pos // width of last rune read from input + lastPos Pos // position of most recent item returned by nextItem + items chan item // channel of scanned items + parenDepth int // nesting depth of ( ) exprs +} + +// next returns the next rune in the input. +func (l *lexer) next() rune { + if int(l.pos) >= len(l.input) { + l.width = 0 + return eof + } + r, w := utf8.DecodeRuneInString(l.input[l.pos:]) + l.width = Pos(w) + l.pos += l.width + return r +} + +// peek returns but does not consume the next rune in the input. +func (l *lexer) peek() rune { + r := l.next() + l.backup() + return r +} + +// backup steps back one rune. Can only be called once per call of next. +func (l *lexer) backup() { + l.pos -= l.width +} + +// emit passes an item back to the client. +func (l *lexer) emit(t itemType) { + l.items <- item{t, l.start, l.input[l.start:l.pos]} + l.start = l.pos +} + +// ignore skips over the pending input before this point. +func (l *lexer) ignore() { + l.start = l.pos +} + +// accept consumes the next rune if it's from the valid set. +func (l *lexer) accept(valid string) bool { + if strings.IndexRune(valid, l.next()) >= 0 { + return true + } + l.backup() + return false +} + +// acceptRun consumes a run of runes from the valid set. +func (l *lexer) acceptRun(valid string) { + for strings.IndexRune(valid, l.next()) >= 0 { + } + l.backup() +} + +// lineNumber reports which line we're on, based on the position of +// the previous item returned by nextItem. Doing it this way +// means we don't have to worry about peek double counting. +func (l *lexer) lineNumber() int { + return 1 + strings.Count(l.input[:l.lastPos], "\n") +} + +// errorf returns an error token and terminates the scan by passing +// back a nil pointer that will be the next state, terminating l.nextItem. +func (l *lexer) errorf(format string, args ...interface{}) stateFn { + l.items <- item{itemError, l.start, fmt.Sprintf(format, args...)} + return nil +} + +// nextItem returns the next item from the input. +func (l *lexer) nextItem() item { + item := <-l.items + l.lastPos = item.pos + return item +} + +// lex creates a new scanner for the input string. +func lex(name, input, left, right string) *lexer { + if left == "" { + left = leftDelim + } + if right == "" { + right = rightDelim + } + l := &lexer{ + name: name, + input: input, + leftDelim: left, + rightDelim: right, + items: make(chan item), + } + go l.run() + return l +} + +// run runs the state machine for the lexer. +func (l *lexer) run() { + for l.state = lexText; l.state != nil; { + l.state = l.state(l) + } +} + +// state functions + +const ( + leftDelim = "{{" + rightDelim = "}}" + leftComment = "/*" + rightComment = "*/" +) + +// lexText scans until an opening action delimiter, "{{". +func lexText(l *lexer) stateFn { + for { + if strings.HasPrefix(l.input[l.pos:], l.leftDelim) { + if l.pos > l.start { + l.emit(itemText) + } + return lexLeftDelim + } + if l.next() == eof { + break + } + } + // Correctly reached EOF. + if l.pos > l.start { + l.emit(itemText) + } + l.emit(itemEOF) + return nil +} + +// lexLeftDelim scans the left delimiter, which is known to be present. +func lexLeftDelim(l *lexer) stateFn { + l.pos += Pos(len(l.leftDelim)) + if strings.HasPrefix(l.input[l.pos:], leftComment) { + return lexComment + } + l.emit(itemLeftDelim) + l.parenDepth = 0 + return lexInsideAction +} + +// lexComment scans a comment. The left comment marker is known to be present. +func lexComment(l *lexer) stateFn { + l.pos += Pos(len(leftComment)) + i := strings.Index(l.input[l.pos:], rightComment) + if i < 0 { + return l.errorf("unclosed comment") + } + l.pos += Pos(i + len(rightComment)) + if !strings.HasPrefix(l.input[l.pos:], l.rightDelim) { + return l.errorf("comment ends before closing delimiter") + + } + l.pos += Pos(len(l.rightDelim)) + l.ignore() + return lexText +} + +// lexRightDelim scans the right delimiter, which is known to be present. +func lexRightDelim(l *lexer) stateFn { + l.pos += Pos(len(l.rightDelim)) + l.emit(itemRightDelim) + if l.peek() == '\\' { + l.pos++ + l.emit(itemElideNewline) + } + return lexText +} + +// lexInsideAction scans the elements inside action delimiters. +func lexInsideAction(l *lexer) stateFn { + // Either number, quoted string, or identifier. + // Spaces separate arguments; runs of spaces turn into itemSpace. + // Pipe symbols separate and are emitted. + if strings.HasPrefix(l.input[l.pos:], l.rightDelim+"\\") || strings.HasPrefix(l.input[l.pos:], l.rightDelim) { + if l.parenDepth == 0 { + return lexRightDelim + } + return l.errorf("unclosed left paren") + } + switch r := l.next(); { + case r == eof || isEndOfLine(r): + return l.errorf("unclosed action") + case isSpace(r): + return lexSpace + case r == ':': + if l.next() != '=' { + return l.errorf("expected :=") + } + l.emit(itemColonEquals) + case r == '|': + l.emit(itemPipe) + case r == '"': + return lexQuote + case r == '`': + return lexRawQuote + case r == '$': + return lexVariable + case r == '\'': + return lexChar + case r == '.': + // special look-ahead for ".field" so we don't break l.backup(). + if l.pos < Pos(len(l.input)) { + r := l.input[l.pos] + if r < '0' || '9' < r { + return lexField + } + } + fallthrough // '.' can start a number. + case r == '+' || r == '-' || ('0' <= r && r <= '9'): + l.backup() + return lexNumber + case isAlphaNumeric(r): + l.backup() + return lexIdentifier + case r == '(': + l.emit(itemLeftParen) + l.parenDepth++ + return lexInsideAction + case r == ')': + l.emit(itemRightParen) + l.parenDepth-- + if l.parenDepth < 0 { + return l.errorf("unexpected right paren %#U", r) + } + return lexInsideAction + case r <= unicode.MaxASCII && unicode.IsPrint(r): + l.emit(itemChar) + return lexInsideAction + default: + return l.errorf("unrecognized character in action: %#U", r) + } + return lexInsideAction +} + +// lexSpace scans a run of space characters. +// One space has already been seen. +func lexSpace(l *lexer) stateFn { + for isSpace(l.peek()) { + l.next() + } + l.emit(itemSpace) + return lexInsideAction +} + +// lexIdentifier scans an alphanumeric. +func lexIdentifier(l *lexer) stateFn { +Loop: + for { + switch r := l.next(); { + case isAlphaNumeric(r): + // absorb. + default: + l.backup() + word := l.input[l.start:l.pos] + if !l.atTerminator() { + return l.errorf("bad character %#U", r) + } + switch { + case key[word] > itemKeyword: + l.emit(key[word]) + case word[0] == '.': + l.emit(itemField) + case word == "true", word == "false": + l.emit(itemBool) + default: + l.emit(itemIdentifier) + } + break Loop + } + } + return lexInsideAction +} + +// lexField scans a field: .Alphanumeric. +// The . has been scanned. +func lexField(l *lexer) stateFn { + return lexFieldOrVariable(l, itemField) +} + +// lexVariable scans a Variable: $Alphanumeric. +// The $ has been scanned. +func lexVariable(l *lexer) stateFn { + if l.atTerminator() { // Nothing interesting follows -> "$". + l.emit(itemVariable) + return lexInsideAction + } + return lexFieldOrVariable(l, itemVariable) +} + +// lexVariable scans a field or variable: [.$]Alphanumeric. +// The . or $ has been scanned. +func lexFieldOrVariable(l *lexer, typ itemType) stateFn { + if l.atTerminator() { // Nothing interesting follows -> "." or "$". + if typ == itemVariable { + l.emit(itemVariable) + } else { + l.emit(itemDot) + } + return lexInsideAction + } + var r rune + for { + r = l.next() + if !isAlphaNumeric(r) { + l.backup() + break + } + } + if !l.atTerminator() { + return l.errorf("bad character %#U", r) + } + l.emit(typ) + return lexInsideAction +} + +// atTerminator reports whether the input is at valid termination character to +// appear after an identifier. Breaks .X.Y into two pieces. Also catches cases +// like "$x+2" not being acceptable without a space, in case we decide one +// day to implement arithmetic. +func (l *lexer) atTerminator() bool { + r := l.peek() + if isSpace(r) || isEndOfLine(r) { + return true + } + switch r { + case eof, '.', ',', '|', ':', ')', '(': + return true + } + // Does r start the delimiter? This can be ambiguous (with delim=="//", $x/2 will + // succeed but should fail) but only in extremely rare cases caused by willfully + // bad choice of delimiter. + if rd, _ := utf8.DecodeRuneInString(l.rightDelim); rd == r { + return true + } + return false +} + +// lexChar scans a character constant. The initial quote is already +// scanned. Syntax checking is done by the parser. +func lexChar(l *lexer) stateFn { +Loop: + for { + switch l.next() { + case '\\': + if r := l.next(); r != eof && r != '\n' { + break + } + fallthrough + case eof, '\n': + return l.errorf("unterminated character constant") + case '\'': + break Loop + } + } + l.emit(itemCharConstant) + return lexInsideAction +} + +// lexNumber scans a number: decimal, octal, hex, float, or imaginary. This +// isn't a perfect number scanner - for instance it accepts "." and "0x0.2" +// and "089" - but when it's wrong the input is invalid and the parser (via +// strconv) will notice. +func lexNumber(l *lexer) stateFn { + if !l.scanNumber() { + return l.errorf("bad number syntax: %q", l.input[l.start:l.pos]) + } + if sign := l.peek(); sign == '+' || sign == '-' { + // Complex: 1+2i. No spaces, must end in 'i'. + if !l.scanNumber() || l.input[l.pos-1] != 'i' { + return l.errorf("bad number syntax: %q", l.input[l.start:l.pos]) + } + l.emit(itemComplex) + } else { + l.emit(itemNumber) + } + return lexInsideAction +} + +func (l *lexer) scanNumber() bool { + // Optional leading sign. + l.accept("+-") + // Is it hex? + digits := "0123456789" + if l.accept("0") && l.accept("xX") { + digits = "0123456789abcdefABCDEF" + } + l.acceptRun(digits) + if l.accept(".") { + l.acceptRun(digits) + } + if l.accept("eE") { + l.accept("+-") + l.acceptRun("0123456789") + } + // Is it imaginary? + l.accept("i") + // Next thing mustn't be alphanumeric. + if isAlphaNumeric(l.peek()) { + l.next() + return false + } + return true +} + +// lexQuote scans a quoted string. +func lexQuote(l *lexer) stateFn { +Loop: + for { + switch l.next() { + case '\\': + if r := l.next(); r != eof && r != '\n' { + break + } + fallthrough + case eof, '\n': + return l.errorf("unterminated quoted string") + case '"': + break Loop + } + } + l.emit(itemString) + return lexInsideAction +} + +// lexRawQuote scans a raw quoted string. +func lexRawQuote(l *lexer) stateFn { +Loop: + for { + switch l.next() { + case eof, '\n': + return l.errorf("unterminated raw quoted string") + case '`': + break Loop + } + } + l.emit(itemRawString) + return lexInsideAction +} + +// isSpace reports whether r is a space character. +func isSpace(r rune) bool { + return r == ' ' || r == '\t' +} + +// isEndOfLine reports whether r is an end-of-line character. +func isEndOfLine(r rune) bool { + return r == '\r' || r == '\n' +} + +// isAlphaNumeric reports whether r is an alphabetic, digit, or underscore. +func isAlphaNumeric(r rune) bool { + return r == '_' || unicode.IsLetter(r) || unicode.IsDigit(r) +} diff --git a/api/vendor/github.com/alecthomas/template/parse/lex_test.go b/api/vendor/github.com/alecthomas/template/parse/lex_test.go new file mode 100644 index 0000000..3b92107 --- /dev/null +++ b/api/vendor/github.com/alecthomas/template/parse/lex_test.go @@ -0,0 +1,468 @@ +// 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 parse + +import ( + "fmt" + "testing" +) + +// Make the types prettyprint. +var itemName = map[itemType]string{ + itemError: "error", + itemBool: "bool", + itemChar: "char", + itemCharConstant: "charconst", + itemComplex: "complex", + itemColonEquals: ":=", + itemEOF: "EOF", + itemField: "field", + itemIdentifier: "identifier", + itemLeftDelim: "left delim", + itemLeftParen: "(", + itemNumber: "number", + itemPipe: "pipe", + itemRawString: "raw string", + itemRightDelim: "right delim", + itemElideNewline: "elide newline", + itemRightParen: ")", + itemSpace: "space", + itemString: "string", + itemVariable: "variable", + + // keywords + itemDot: ".", + itemDefine: "define", + itemElse: "else", + itemIf: "if", + itemEnd: "end", + itemNil: "nil", + itemRange: "range", + itemTemplate: "template", + itemWith: "with", +} + +func (i itemType) String() string { + s := itemName[i] + if s == "" { + return fmt.Sprintf("item%d", int(i)) + } + return s +} + +type lexTest struct { + name string + input string + items []item +} + +var ( + tEOF = item{itemEOF, 0, ""} + tFor = item{itemIdentifier, 0, "for"} + tLeft = item{itemLeftDelim, 0, "{{"} + tLpar = item{itemLeftParen, 0, "("} + tPipe = item{itemPipe, 0, "|"} + tQuote = item{itemString, 0, `"abc \n\t\" "`} + tRange = item{itemRange, 0, "range"} + tRight = item{itemRightDelim, 0, "}}"} + tElideNewline = item{itemElideNewline, 0, "\\"} + tRpar = item{itemRightParen, 0, ")"} + tSpace = item{itemSpace, 0, " "} + raw = "`" + `abc\n\t\" ` + "`" + tRawQuote = item{itemRawString, 0, raw} +) + +var lexTests = []lexTest{ + {"empty", "", []item{tEOF}}, + {"spaces", " \t\n", []item{{itemText, 0, " \t\n"}, tEOF}}, + {"text", `now is the time`, []item{{itemText, 0, "now is the time"}, tEOF}}, + {"elide newline", "{{}}\\", []item{tLeft, tRight, tElideNewline, tEOF}}, + {"text with comment", "hello-{{/* this is a comment */}}-world", []item{ + {itemText, 0, "hello-"}, + {itemText, 0, "-world"}, + tEOF, + }}, + {"punctuation", "{{,@% }}", []item{ + tLeft, + {itemChar, 0, ","}, + {itemChar, 0, "@"}, + {itemChar, 0, "%"}, + tSpace, + tRight, + tEOF, + }}, + {"parens", "{{((3))}}", []item{ + tLeft, + tLpar, + tLpar, + {itemNumber, 0, "3"}, + tRpar, + tRpar, + tRight, + tEOF, + }}, + {"empty action", `{{}}`, []item{tLeft, tRight, tEOF}}, + {"for", `{{for}}`, []item{tLeft, tFor, tRight, tEOF}}, + {"quote", `{{"abc \n\t\" "}}`, []item{tLeft, tQuote, tRight, tEOF}}, + {"raw quote", "{{" + raw + "}}", []item{tLeft, tRawQuote, tRight, tEOF}}, + {"numbers", "{{1 02 0x14 -7.2i 1e3 +1.2e-4 4.2i 1+2i}}", []item{ + tLeft, + {itemNumber, 0, "1"}, + tSpace, + {itemNumber, 0, "02"}, + tSpace, + {itemNumber, 0, "0x14"}, + tSpace, + {itemNumber, 0, "-7.2i"}, + tSpace, + {itemNumber, 0, "1e3"}, + tSpace, + {itemNumber, 0, "+1.2e-4"}, + tSpace, + {itemNumber, 0, "4.2i"}, + tSpace, + {itemComplex, 0, "1+2i"}, + tRight, + tEOF, + }}, + {"characters", `{{'a' '\n' '\'' '\\' '\u00FF' '\xFF' '本'}}`, []item{ + tLeft, + {itemCharConstant, 0, `'a'`}, + tSpace, + {itemCharConstant, 0, `'\n'`}, + tSpace, + {itemCharConstant, 0, `'\''`}, + tSpace, + {itemCharConstant, 0, `'\\'`}, + tSpace, + {itemCharConstant, 0, `'\u00FF'`}, + tSpace, + {itemCharConstant, 0, `'\xFF'`}, + tSpace, + {itemCharConstant, 0, `'本'`}, + tRight, + tEOF, + }}, + {"bools", "{{true false}}", []item{ + tLeft, + {itemBool, 0, "true"}, + tSpace, + {itemBool, 0, "false"}, + tRight, + tEOF, + }}, + {"dot", "{{.}}", []item{ + tLeft, + {itemDot, 0, "."}, + tRight, + tEOF, + }}, + {"nil", "{{nil}}", []item{ + tLeft, + {itemNil, 0, "nil"}, + tRight, + tEOF, + }}, + {"dots", "{{.x . .2 .x.y.z}}", []item{ + tLeft, + {itemField, 0, ".x"}, + tSpace, + {itemDot, 0, "."}, + tSpace, + {itemNumber, 0, ".2"}, + tSpace, + {itemField, 0, ".x"}, + {itemField, 0, ".y"}, + {itemField, 0, ".z"}, + tRight, + tEOF, + }}, + {"keywords", "{{range if else end with}}", []item{ + tLeft, + {itemRange, 0, "range"}, + tSpace, + {itemIf, 0, "if"}, + tSpace, + {itemElse, 0, "else"}, + tSpace, + {itemEnd, 0, "end"}, + tSpace, + {itemWith, 0, "with"}, + tRight, + tEOF, + }}, + {"variables", "{{$c := printf $ $hello $23 $ $var.Field .Method}}", []item{ + tLeft, + {itemVariable, 0, "$c"}, + tSpace, + {itemColonEquals, 0, ":="}, + tSpace, + {itemIdentifier, 0, "printf"}, + tSpace, + {itemVariable, 0, "$"}, + tSpace, + {itemVariable, 0, "$hello"}, + tSpace, + {itemVariable, 0, "$23"}, + tSpace, + {itemVariable, 0, "$"}, + tSpace, + {itemVariable, 0, "$var"}, + {itemField, 0, ".Field"}, + tSpace, + {itemField, 0, ".Method"}, + tRight, + tEOF, + }}, + {"variable invocation", "{{$x 23}}", []item{ + tLeft, + {itemVariable, 0, "$x"}, + tSpace, + {itemNumber, 0, "23"}, + tRight, + tEOF, + }}, + {"pipeline", `intro {{echo hi 1.2 |noargs|args 1 "hi"}} outro`, []item{ + {itemText, 0, "intro "}, + tLeft, + {itemIdentifier, 0, "echo"}, + tSpace, + {itemIdentifier, 0, "hi"}, + tSpace, + {itemNumber, 0, "1.2"}, + tSpace, + tPipe, + {itemIdentifier, 0, "noargs"}, + tPipe, + {itemIdentifier, 0, "args"}, + tSpace, + {itemNumber, 0, "1"}, + tSpace, + {itemString, 0, `"hi"`}, + tRight, + {itemText, 0, " outro"}, + tEOF, + }}, + {"declaration", "{{$v := 3}}", []item{ + tLeft, + {itemVariable, 0, "$v"}, + tSpace, + {itemColonEquals, 0, ":="}, + tSpace, + {itemNumber, 0, "3"}, + tRight, + tEOF, + }}, + {"2 declarations", "{{$v , $w := 3}}", []item{ + tLeft, + {itemVariable, 0, "$v"}, + tSpace, + {itemChar, 0, ","}, + tSpace, + {itemVariable, 0, "$w"}, + tSpace, + {itemColonEquals, 0, ":="}, + tSpace, + {itemNumber, 0, "3"}, + tRight, + tEOF, + }}, + {"field of parenthesized expression", "{{(.X).Y}}", []item{ + tLeft, + tLpar, + {itemField, 0, ".X"}, + tRpar, + {itemField, 0, ".Y"}, + tRight, + tEOF, + }}, + // errors + {"badchar", "#{{\x01}}", []item{ + {itemText, 0, "#"}, + tLeft, + {itemError, 0, "unrecognized character in action: U+0001"}, + }}, + {"unclosed action", "{{\n}}", []item{ + tLeft, + {itemError, 0, "unclosed action"}, + }}, + {"EOF in action", "{{range", []item{ + tLeft, + tRange, + {itemError, 0, "unclosed action"}, + }}, + {"unclosed quote", "{{\"\n\"}}", []item{ + tLeft, + {itemError, 0, "unterminated quoted string"}, + }}, + {"unclosed raw quote", "{{`xx\n`}}", []item{ + tLeft, + {itemError, 0, "unterminated raw quoted string"}, + }}, + {"unclosed char constant", "{{'\n}}", []item{ + tLeft, + {itemError, 0, "unterminated character constant"}, + }}, + {"bad number", "{{3k}}", []item{ + tLeft, + {itemError, 0, `bad number syntax: "3k"`}, + }}, + {"unclosed paren", "{{(3}}", []item{ + tLeft, + tLpar, + {itemNumber, 0, "3"}, + {itemError, 0, `unclosed left paren`}, + }}, + {"extra right paren", "{{3)}}", []item{ + tLeft, + {itemNumber, 0, "3"}, + tRpar, + {itemError, 0, `unexpected right paren U+0029 ')'`}, + }}, + + // Fixed bugs + // Many elements in an action blew the lookahead until + // we made lexInsideAction not loop. + {"long pipeline deadlock", "{{|||||}}", []item{ + tLeft, + tPipe, + tPipe, + tPipe, + tPipe, + tPipe, + tRight, + tEOF, + }}, + {"text with bad comment", "hello-{{/*/}}-world", []item{ + {itemText, 0, "hello-"}, + {itemError, 0, `unclosed comment`}, + }}, + {"text with comment close separted from delim", "hello-{{/* */ }}-world", []item{ + {itemText, 0, "hello-"}, + {itemError, 0, `comment ends before closing delimiter`}, + }}, + // This one is an error that we can't catch because it breaks templates with + // minimized JavaScript. Should have fixed it before Go 1.1. + {"unmatched right delimiter", "hello-{.}}-world", []item{ + {itemText, 0, "hello-{.}}-world"}, + tEOF, + }}, +} + +// collect gathers the emitted items into a slice. +func collect(t *lexTest, left, right string) (items []item) { + l := lex(t.name, t.input, left, right) + for { + item := l.nextItem() + items = append(items, item) + if item.typ == itemEOF || item.typ == itemError { + break + } + } + return +} + +func equal(i1, i2 []item, checkPos bool) bool { + if len(i1) != len(i2) { + return false + } + for k := range i1 { + if i1[k].typ != i2[k].typ { + return false + } + if i1[k].val != i2[k].val { + return false + } + if checkPos && i1[k].pos != i2[k].pos { + return false + } + } + return true +} + +func TestLex(t *testing.T) { + for _, test := range lexTests { + items := collect(&test, "", "") + if !equal(items, test.items, false) { + t.Errorf("%s: got\n\t%+v\nexpected\n\t%v", test.name, items, test.items) + } + } +} + +// Some easy cases from above, but with delimiters $$ and @@ +var lexDelimTests = []lexTest{ + {"punctuation", "$$,@%{{}}@@", []item{ + tLeftDelim, + {itemChar, 0, ","}, + {itemChar, 0, "@"}, + {itemChar, 0, "%"}, + {itemChar, 0, "{"}, + {itemChar, 0, "{"}, + {itemChar, 0, "}"}, + {itemChar, 0, "}"}, + tRightDelim, + tEOF, + }}, + {"empty action", `$$@@`, []item{tLeftDelim, tRightDelim, tEOF}}, + {"for", `$$for@@`, []item{tLeftDelim, tFor, tRightDelim, tEOF}}, + {"quote", `$$"abc \n\t\" "@@`, []item{tLeftDelim, tQuote, tRightDelim, tEOF}}, + {"raw quote", "$$" + raw + "@@", []item{tLeftDelim, tRawQuote, tRightDelim, tEOF}}, +} + +var ( + tLeftDelim = item{itemLeftDelim, 0, "$$"} + tRightDelim = item{itemRightDelim, 0, "@@"} +) + +func TestDelims(t *testing.T) { + for _, test := range lexDelimTests { + items := collect(&test, "$$", "@@") + if !equal(items, test.items, false) { + t.Errorf("%s: got\n\t%v\nexpected\n\t%v", test.name, items, test.items) + } + } +} + +var lexPosTests = []lexTest{ + {"empty", "", []item{tEOF}}, + {"punctuation", "{{,@%#}}", []item{ + {itemLeftDelim, 0, "{{"}, + {itemChar, 2, ","}, + {itemChar, 3, "@"}, + {itemChar, 4, "%"}, + {itemChar, 5, "#"}, + {itemRightDelim, 6, "}}"}, + {itemEOF, 8, ""}, + }}, + {"sample", "0123{{hello}}xyz", []item{ + {itemText, 0, "0123"}, + {itemLeftDelim, 4, "{{"}, + {itemIdentifier, 6, "hello"}, + {itemRightDelim, 11, "}}"}, + {itemText, 13, "xyz"}, + {itemEOF, 16, ""}, + }}, +} + +// The other tests don't check position, to make the test cases easier to construct. +// This one does. +func TestPos(t *testing.T) { + for _, test := range lexPosTests { + items := collect(&test, "", "") + if !equal(items, test.items, true) { + t.Errorf("%s: got\n\t%v\nexpected\n\t%v", test.name, items, test.items) + if len(items) == len(test.items) { + // Detailed print; avoid item.String() to expose the position value. + for i := range items { + if !equal(items[i:i+1], test.items[i:i+1], true) { + i1 := items[i] + i2 := test.items[i] + t.Errorf("\t#%d: got {%v %d %q} expected {%v %d %q}", i, i1.typ, i1.pos, i1.val, i2.typ, i2.pos, i2.val) + } + } + } + } + } +} diff --git a/api/vendor/github.com/alecthomas/template/parse/node.go b/api/vendor/github.com/alecthomas/template/parse/node.go new file mode 100644 index 0000000..55c37f6 --- /dev/null +++ b/api/vendor/github.com/alecthomas/template/parse/node.go @@ -0,0 +1,834 @@ +// 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. + +// Parse nodes. + +package parse + +import ( + "bytes" + "fmt" + "strconv" + "strings" +) + +var textFormat = "%s" // Changed to "%q" in tests for better error messages. + +// A Node is an element in the parse tree. The interface is trivial. +// The interface contains an unexported method so that only +// types local to this package can satisfy it. +type Node interface { + Type() NodeType + String() string + // Copy does a deep copy of the Node and all its components. + // To avoid type assertions, some XxxNodes also have specialized + // CopyXxx methods that return *XxxNode. + Copy() Node + Position() Pos // byte position of start of node in full original input string + // tree returns the containing *Tree. + // It is unexported so all implementations of Node are in this package. + tree() *Tree +} + +// NodeType identifies the type of a parse tree node. +type NodeType int + +// Pos represents a byte position in the original input text from which +// this template was parsed. +type Pos int + +func (p Pos) Position() Pos { + return p +} + +// Type returns itself and provides an easy default implementation +// for embedding in a Node. Embedded in all non-trivial Nodes. +func (t NodeType) Type() NodeType { + return t +} + +const ( + NodeText NodeType = iota // Plain text. + NodeAction // A non-control action such as a field evaluation. + NodeBool // A boolean constant. + NodeChain // A sequence of field accesses. + NodeCommand // An element of a pipeline. + NodeDot // The cursor, dot. + nodeElse // An else action. Not added to tree. + nodeEnd // An end action. Not added to tree. + NodeField // A field or method name. + NodeIdentifier // An identifier; always a function name. + NodeIf // An if action. + NodeList // A list of Nodes. + NodeNil // An untyped nil constant. + NodeNumber // A numerical constant. + NodePipe // A pipeline of commands. + NodeRange // A range action. + NodeString // A string constant. + NodeTemplate // A template invocation action. + NodeVariable // A $ variable. + NodeWith // A with action. +) + +// Nodes. + +// ListNode holds a sequence of nodes. +type ListNode struct { + NodeType + Pos + tr *Tree + Nodes []Node // The element nodes in lexical order. +} + +func (t *Tree) newList(pos Pos) *ListNode { + return &ListNode{tr: t, NodeType: NodeList, Pos: pos} +} + +func (l *ListNode) append(n Node) { + l.Nodes = append(l.Nodes, n) +} + +func (l *ListNode) tree() *Tree { + return l.tr +} + +func (l *ListNode) String() string { + b := new(bytes.Buffer) + for _, n := range l.Nodes { + fmt.Fprint(b, n) + } + return b.String() +} + +func (l *ListNode) CopyList() *ListNode { + if l == nil { + return l + } + n := l.tr.newList(l.Pos) + for _, elem := range l.Nodes { + n.append(elem.Copy()) + } + return n +} + +func (l *ListNode) Copy() Node { + return l.CopyList() +} + +// TextNode holds plain text. +type TextNode struct { + NodeType + Pos + tr *Tree + Text []byte // The text; may span newlines. +} + +func (t *Tree) newText(pos Pos, text string) *TextNode { + return &TextNode{tr: t, NodeType: NodeText, Pos: pos, Text: []byte(text)} +} + +func (t *TextNode) String() string { + return fmt.Sprintf(textFormat, t.Text) +} + +func (t *TextNode) tree() *Tree { + return t.tr +} + +func (t *TextNode) Copy() Node { + return &TextNode{tr: t.tr, NodeType: NodeText, Pos: t.Pos, Text: append([]byte{}, t.Text...)} +} + +// PipeNode holds a pipeline with optional declaration +type PipeNode struct { + NodeType + Pos + tr *Tree + Line int // The line number in the input (deprecated; kept for compatibility) + Decl []*VariableNode // Variable declarations in lexical order. + Cmds []*CommandNode // The commands in lexical order. +} + +func (t *Tree) newPipeline(pos Pos, line int, decl []*VariableNode) *PipeNode { + return &PipeNode{tr: t, NodeType: NodePipe, Pos: pos, Line: line, Decl: decl} +} + +func (p *PipeNode) append(command *CommandNode) { + p.Cmds = append(p.Cmds, command) +} + +func (p *PipeNode) String() string { + s := "" + if len(p.Decl) > 0 { + for i, v := range p.Decl { + if i > 0 { + s += ", " + } + s += v.String() + } + s += " := " + } + for i, c := range p.Cmds { + if i > 0 { + s += " | " + } + s += c.String() + } + return s +} + +func (p *PipeNode) tree() *Tree { + return p.tr +} + +func (p *PipeNode) CopyPipe() *PipeNode { + if p == nil { + return p + } + var decl []*VariableNode + for _, d := range p.Decl { + decl = append(decl, d.Copy().(*VariableNode)) + } + n := p.tr.newPipeline(p.Pos, p.Line, decl) + for _, c := range p.Cmds { + n.append(c.Copy().(*CommandNode)) + } + return n +} + +func (p *PipeNode) Copy() Node { + return p.CopyPipe() +} + +// ActionNode holds an action (something bounded by delimiters). +// Control actions have their own nodes; ActionNode represents simple +// ones such as field evaluations and parenthesized pipelines. +type ActionNode struct { + NodeType + Pos + tr *Tree + Line int // The line number in the input (deprecated; kept for compatibility) + Pipe *PipeNode // The pipeline in the action. +} + +func (t *Tree) newAction(pos Pos, line int, pipe *PipeNode) *ActionNode { + return &ActionNode{tr: t, NodeType: NodeAction, Pos: pos, Line: line, Pipe: pipe} +} + +func (a *ActionNode) String() string { + return fmt.Sprintf("{{%s}}", a.Pipe) + +} + +func (a *ActionNode) tree() *Tree { + return a.tr +} + +func (a *ActionNode) Copy() Node { + return a.tr.newAction(a.Pos, a.Line, a.Pipe.CopyPipe()) + +} + +// CommandNode holds a command (a pipeline inside an evaluating action). +type CommandNode struct { + NodeType + Pos + tr *Tree + Args []Node // Arguments in lexical order: Identifier, field, or constant. +} + +func (t *Tree) newCommand(pos Pos) *CommandNode { + return &CommandNode{tr: t, NodeType: NodeCommand, Pos: pos} +} + +func (c *CommandNode) append(arg Node) { + c.Args = append(c.Args, arg) +} + +func (c *CommandNode) String() string { + s := "" + for i, arg := range c.Args { + if i > 0 { + s += " " + } + if arg, ok := arg.(*PipeNode); ok { + s += "(" + arg.String() + ")" + continue + } + s += arg.String() + } + return s +} + +func (c *CommandNode) tree() *Tree { + return c.tr +} + +func (c *CommandNode) Copy() Node { + if c == nil { + return c + } + n := c.tr.newCommand(c.Pos) + for _, c := range c.Args { + n.append(c.Copy()) + } + return n +} + +// IdentifierNode holds an identifier. +type IdentifierNode struct { + NodeType + Pos + tr *Tree + Ident string // The identifier's name. +} + +// NewIdentifier returns a new IdentifierNode with the given identifier name. +func NewIdentifier(ident string) *IdentifierNode { + return &IdentifierNode{NodeType: NodeIdentifier, Ident: ident} +} + +// SetPos sets the position. NewIdentifier is a public method so we can't modify its signature. +// Chained for convenience. +// TODO: fix one day? +func (i *IdentifierNode) SetPos(pos Pos) *IdentifierNode { + i.Pos = pos + return i +} + +// SetTree sets the parent tree for the node. NewIdentifier is a public method so we can't modify its signature. +// Chained for convenience. +// TODO: fix one day? +func (i *IdentifierNode) SetTree(t *Tree) *IdentifierNode { + i.tr = t + return i +} + +func (i *IdentifierNode) String() string { + return i.Ident +} + +func (i *IdentifierNode) tree() *Tree { + return i.tr +} + +func (i *IdentifierNode) Copy() Node { + return NewIdentifier(i.Ident).SetTree(i.tr).SetPos(i.Pos) +} + +// VariableNode holds a list of variable names, possibly with chained field +// accesses. The dollar sign is part of the (first) name. +type VariableNode struct { + NodeType + Pos + tr *Tree + Ident []string // Variable name and fields in lexical order. +} + +func (t *Tree) newVariable(pos Pos, ident string) *VariableNode { + return &VariableNode{tr: t, NodeType: NodeVariable, Pos: pos, Ident: strings.Split(ident, ".")} +} + +func (v *VariableNode) String() string { + s := "" + for i, id := range v.Ident { + if i > 0 { + s += "." + } + s += id + } + return s +} + +func (v *VariableNode) tree() *Tree { + return v.tr +} + +func (v *VariableNode) Copy() Node { + return &VariableNode{tr: v.tr, NodeType: NodeVariable, Pos: v.Pos, Ident: append([]string{}, v.Ident...)} +} + +// DotNode holds the special identifier '.'. +type DotNode struct { + NodeType + Pos + tr *Tree +} + +func (t *Tree) newDot(pos Pos) *DotNode { + return &DotNode{tr: t, NodeType: NodeDot, Pos: pos} +} + +func (d *DotNode) Type() NodeType { + // Override method on embedded NodeType for API compatibility. + // TODO: Not really a problem; could change API without effect but + // api tool complains. + return NodeDot +} + +func (d *DotNode) String() string { + return "." +} + +func (d *DotNode) tree() *Tree { + return d.tr +} + +func (d *DotNode) Copy() Node { + return d.tr.newDot(d.Pos) +} + +// NilNode holds the special identifier 'nil' representing an untyped nil constant. +type NilNode struct { + NodeType + Pos + tr *Tree +} + +func (t *Tree) newNil(pos Pos) *NilNode { + return &NilNode{tr: t, NodeType: NodeNil, Pos: pos} +} + +func (n *NilNode) Type() NodeType { + // Override method on embedded NodeType for API compatibility. + // TODO: Not really a problem; could change API without effect but + // api tool complains. + return NodeNil +} + +func (n *NilNode) String() string { + return "nil" +} + +func (n *NilNode) tree() *Tree { + return n.tr +} + +func (n *NilNode) Copy() Node { + return n.tr.newNil(n.Pos) +} + +// FieldNode holds a field (identifier starting with '.'). +// The names may be chained ('.x.y'). +// The period is dropped from each ident. +type FieldNode struct { + NodeType + Pos + tr *Tree + Ident []string // The identifiers in lexical order. +} + +func (t *Tree) newField(pos Pos, ident string) *FieldNode { + return &FieldNode{tr: t, NodeType: NodeField, Pos: pos, Ident: strings.Split(ident[1:], ".")} // [1:] to drop leading period +} + +func (f *FieldNode) String() string { + s := "" + for _, id := range f.Ident { + s += "." + id + } + return s +} + +func (f *FieldNode) tree() *Tree { + return f.tr +} + +func (f *FieldNode) Copy() Node { + return &FieldNode{tr: f.tr, NodeType: NodeField, Pos: f.Pos, Ident: append([]string{}, f.Ident...)} +} + +// ChainNode holds a term followed by a chain of field accesses (identifier starting with '.'). +// The names may be chained ('.x.y'). +// The periods are dropped from each ident. +type ChainNode struct { + NodeType + Pos + tr *Tree + Node Node + Field []string // The identifiers in lexical order. +} + +func (t *Tree) newChain(pos Pos, node Node) *ChainNode { + return &ChainNode{tr: t, NodeType: NodeChain, Pos: pos, Node: node} +} + +// Add adds the named field (which should start with a period) to the end of the chain. +func (c *ChainNode) Add(field string) { + if len(field) == 0 || field[0] != '.' { + panic("no dot in field") + } + field = field[1:] // Remove leading dot. + if field == "" { + panic("empty field") + } + c.Field = append(c.Field, field) +} + +func (c *ChainNode) String() string { + s := c.Node.String() + if _, ok := c.Node.(*PipeNode); ok { + s = "(" + s + ")" + } + for _, field := range c.Field { + s += "." + field + } + return s +} + +func (c *ChainNode) tree() *Tree { + return c.tr +} + +func (c *ChainNode) Copy() Node { + return &ChainNode{tr: c.tr, NodeType: NodeChain, Pos: c.Pos, Node: c.Node, Field: append([]string{}, c.Field...)} +} + +// BoolNode holds a boolean constant. +type BoolNode struct { + NodeType + Pos + tr *Tree + True bool // The value of the boolean constant. +} + +func (t *Tree) newBool(pos Pos, true bool) *BoolNode { + return &BoolNode{tr: t, NodeType: NodeBool, Pos: pos, True: true} +} + +func (b *BoolNode) String() string { + if b.True { + return "true" + } + return "false" +} + +func (b *BoolNode) tree() *Tree { + return b.tr +} + +func (b *BoolNode) Copy() Node { + return b.tr.newBool(b.Pos, b.True) +} + +// NumberNode holds a number: signed or unsigned integer, float, or complex. +// The value is parsed and stored under all the types that can represent the value. +// This simulates in a small amount of code the behavior of Go's ideal constants. +type NumberNode struct { + NodeType + Pos + tr *Tree + IsInt bool // Number has an integral value. + IsUint bool // Number has an unsigned integral value. + IsFloat bool // Number has a floating-point value. + IsComplex bool // Number is complex. + Int64 int64 // The signed integer value. + Uint64 uint64 // The unsigned integer value. + Float64 float64 // The floating-point value. + Complex128 complex128 // The complex value. + Text string // The original textual representation from the input. +} + +func (t *Tree) newNumber(pos Pos, text string, typ itemType) (*NumberNode, error) { + n := &NumberNode{tr: t, NodeType: NodeNumber, Pos: pos, Text: text} + switch typ { + case itemCharConstant: + rune, _, tail, err := strconv.UnquoteChar(text[1:], text[0]) + if err != nil { + return nil, err + } + if tail != "'" { + return nil, fmt.Errorf("malformed character constant: %s", text) + } + n.Int64 = int64(rune) + n.IsInt = true + n.Uint64 = uint64(rune) + n.IsUint = true + n.Float64 = float64(rune) // odd but those are the rules. + n.IsFloat = true + return n, nil + case itemComplex: + // fmt.Sscan can parse the pair, so let it do the work. + if _, err := fmt.Sscan(text, &n.Complex128); err != nil { + return nil, err + } + n.IsComplex = true + n.simplifyComplex() + return n, nil + } + // Imaginary constants can only be complex unless they are zero. + if len(text) > 0 && text[len(text)-1] == 'i' { + f, err := strconv.ParseFloat(text[:len(text)-1], 64) + if err == nil { + n.IsComplex = true + n.Complex128 = complex(0, f) + n.simplifyComplex() + return n, nil + } + } + // Do integer test first so we get 0x123 etc. + u, err := strconv.ParseUint(text, 0, 64) // will fail for -0; fixed below. + if err == nil { + n.IsUint = true + n.Uint64 = u + } + i, err := strconv.ParseInt(text, 0, 64) + if err == nil { + n.IsInt = true + n.Int64 = i + if i == 0 { + n.IsUint = true // in case of -0. + n.Uint64 = u + } + } + // If an integer extraction succeeded, promote the float. + if n.IsInt { + n.IsFloat = true + n.Float64 = float64(n.Int64) + } else if n.IsUint { + n.IsFloat = true + n.Float64 = float64(n.Uint64) + } else { + f, err := strconv.ParseFloat(text, 64) + if err == nil { + n.IsFloat = true + n.Float64 = f + // If a floating-point extraction succeeded, extract the int if needed. + if !n.IsInt && float64(int64(f)) == f { + n.IsInt = true + n.Int64 = int64(f) + } + if !n.IsUint && float64(uint64(f)) == f { + n.IsUint = true + n.Uint64 = uint64(f) + } + } + } + if !n.IsInt && !n.IsUint && !n.IsFloat { + return nil, fmt.Errorf("illegal number syntax: %q", text) + } + return n, nil +} + +// simplifyComplex pulls out any other types that are represented by the complex number. +// These all require that the imaginary part be zero. +func (n *NumberNode) simplifyComplex() { + n.IsFloat = imag(n.Complex128) == 0 + if n.IsFloat { + n.Float64 = real(n.Complex128) + n.IsInt = float64(int64(n.Float64)) == n.Float64 + if n.IsInt { + n.Int64 = int64(n.Float64) + } + n.IsUint = float64(uint64(n.Float64)) == n.Float64 + if n.IsUint { + n.Uint64 = uint64(n.Float64) + } + } +} + +func (n *NumberNode) String() string { + return n.Text +} + +func (n *NumberNode) tree() *Tree { + return n.tr +} + +func (n *NumberNode) Copy() Node { + nn := new(NumberNode) + *nn = *n // Easy, fast, correct. + return nn +} + +// StringNode holds a string constant. The value has been "unquoted". +type StringNode struct { + NodeType + Pos + tr *Tree + Quoted string // The original text of the string, with quotes. + Text string // The string, after quote processing. +} + +func (t *Tree) newString(pos Pos, orig, text string) *StringNode { + return &StringNode{tr: t, NodeType: NodeString, Pos: pos, Quoted: orig, Text: text} +} + +func (s *StringNode) String() string { + return s.Quoted +} + +func (s *StringNode) tree() *Tree { + return s.tr +} + +func (s *StringNode) Copy() Node { + return s.tr.newString(s.Pos, s.Quoted, s.Text) +} + +// endNode represents an {{end}} action. +// It does not appear in the final parse tree. +type endNode struct { + NodeType + Pos + tr *Tree +} + +func (t *Tree) newEnd(pos Pos) *endNode { + return &endNode{tr: t, NodeType: nodeEnd, Pos: pos} +} + +func (e *endNode) String() string { + return "{{end}}" +} + +func (e *endNode) tree() *Tree { + return e.tr +} + +func (e *endNode) Copy() Node { + return e.tr.newEnd(e.Pos) +} + +// elseNode represents an {{else}} action. Does not appear in the final tree. +type elseNode struct { + NodeType + Pos + tr *Tree + Line int // The line number in the input (deprecated; kept for compatibility) +} + +func (t *Tree) newElse(pos Pos, line int) *elseNode { + return &elseNode{tr: t, NodeType: nodeElse, Pos: pos, Line: line} +} + +func (e *elseNode) Type() NodeType { + return nodeElse +} + +func (e *elseNode) String() string { + return "{{else}}" +} + +func (e *elseNode) tree() *Tree { + return e.tr +} + +func (e *elseNode) Copy() Node { + return e.tr.newElse(e.Pos, e.Line) +} + +// BranchNode is the common representation of if, range, and with. +type BranchNode struct { + NodeType + Pos + tr *Tree + Line int // The line number in the input (deprecated; kept for compatibility) + Pipe *PipeNode // The pipeline to be evaluated. + List *ListNode // What to execute if the value is non-empty. + ElseList *ListNode // What to execute if the value is empty (nil if absent). +} + +func (b *BranchNode) String() string { + name := "" + switch b.NodeType { + case NodeIf: + name = "if" + case NodeRange: + name = "range" + case NodeWith: + name = "with" + default: + panic("unknown branch type") + } + if b.ElseList != nil { + return fmt.Sprintf("{{%s %s}}%s{{else}}%s{{end}}", name, b.Pipe, b.List, b.ElseList) + } + return fmt.Sprintf("{{%s %s}}%s{{end}}", name, b.Pipe, b.List) +} + +func (b *BranchNode) tree() *Tree { + return b.tr +} + +func (b *BranchNode) Copy() Node { + switch b.NodeType { + case NodeIf: + return b.tr.newIf(b.Pos, b.Line, b.Pipe, b.List, b.ElseList) + case NodeRange: + return b.tr.newRange(b.Pos, b.Line, b.Pipe, b.List, b.ElseList) + case NodeWith: + return b.tr.newWith(b.Pos, b.Line, b.Pipe, b.List, b.ElseList) + default: + panic("unknown branch type") + } +} + +// IfNode represents an {{if}} action and its commands. +type IfNode struct { + BranchNode +} + +func (t *Tree) newIf(pos Pos, line int, pipe *PipeNode, list, elseList *ListNode) *IfNode { + return &IfNode{BranchNode{tr: t, NodeType: NodeIf, Pos: pos, Line: line, Pipe: pipe, List: list, ElseList: elseList}} +} + +func (i *IfNode) Copy() Node { + return i.tr.newIf(i.Pos, i.Line, i.Pipe.CopyPipe(), i.List.CopyList(), i.ElseList.CopyList()) +} + +// RangeNode represents a {{range}} action and its commands. +type RangeNode struct { + BranchNode +} + +func (t *Tree) newRange(pos Pos, line int, pipe *PipeNode, list, elseList *ListNode) *RangeNode { + return &RangeNode{BranchNode{tr: t, NodeType: NodeRange, Pos: pos, Line: line, Pipe: pipe, List: list, ElseList: elseList}} +} + +func (r *RangeNode) Copy() Node { + return r.tr.newRange(r.Pos, r.Line, r.Pipe.CopyPipe(), r.List.CopyList(), r.ElseList.CopyList()) +} + +// WithNode represents a {{with}} action and its commands. +type WithNode struct { + BranchNode +} + +func (t *Tree) newWith(pos Pos, line int, pipe *PipeNode, list, elseList *ListNode) *WithNode { + return &WithNode{BranchNode{tr: t, NodeType: NodeWith, Pos: pos, Line: line, Pipe: pipe, List: list, ElseList: elseList}} +} + +func (w *WithNode) Copy() Node { + return w.tr.newWith(w.Pos, w.Line, w.Pipe.CopyPipe(), w.List.CopyList(), w.ElseList.CopyList()) +} + +// TemplateNode represents a {{template}} action. +type TemplateNode struct { + NodeType + Pos + tr *Tree + Line int // The line number in the input (deprecated; kept for compatibility) + Name string // The name of the template (unquoted). + Pipe *PipeNode // The command to evaluate as dot for the template. +} + +func (t *Tree) newTemplate(pos Pos, line int, name string, pipe *PipeNode) *TemplateNode { + return &TemplateNode{tr: t, NodeType: NodeTemplate, Pos: pos, Line: line, Name: name, Pipe: pipe} +} + +func (t *TemplateNode) String() string { + if t.Pipe == nil { + return fmt.Sprintf("{{template %q}}", t.Name) + } + return fmt.Sprintf("{{template %q %s}}", t.Name, t.Pipe) +} + +func (t *TemplateNode) tree() *Tree { + return t.tr +} + +func (t *TemplateNode) Copy() Node { + return t.tr.newTemplate(t.Pos, t.Line, t.Name, t.Pipe.CopyPipe()) +} diff --git a/api/vendor/github.com/alecthomas/template/parse/parse.go b/api/vendor/github.com/alecthomas/template/parse/parse.go new file mode 100644 index 0000000..0d77ade --- /dev/null +++ b/api/vendor/github.com/alecthomas/template/parse/parse.go @@ -0,0 +1,700 @@ +// 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 parse builds parse trees for templates as defined by text/template +// and html/template. Clients should use those packages to construct templates +// rather than this one, which provides shared internal data structures not +// intended for general use. +package parse + +import ( + "bytes" + "fmt" + "runtime" + "strconv" + "strings" +) + +// Tree is the representation of a single parsed template. +type Tree struct { + Name string // name of the template represented by the tree. + ParseName string // name of the top-level template during parsing, for error messages. + Root *ListNode // top-level root of the tree. + text string // text parsed to create the template (or its parent) + // Parsing only; cleared after parse. + funcs []map[string]interface{} + lex *lexer + token [3]item // three-token lookahead for parser. + peekCount int + vars []string // variables defined at the moment. +} + +// Copy returns a copy of the Tree. Any parsing state is discarded. +func (t *Tree) Copy() *Tree { + if t == nil { + return nil + } + return &Tree{ + Name: t.Name, + ParseName: t.ParseName, + Root: t.Root.CopyList(), + text: t.text, + } +} + +// Parse returns a map from template name to parse.Tree, created by parsing the +// templates described in the argument string. The top-level template will be +// given the specified name. If an error is encountered, parsing stops and an +// empty map is returned with the error. +func Parse(name, text, leftDelim, rightDelim string, funcs ...map[string]interface{}) (treeSet map[string]*Tree, err error) { + treeSet = make(map[string]*Tree) + t := New(name) + t.text = text + _, err = t.Parse(text, leftDelim, rightDelim, treeSet, funcs...) + return +} + +// next returns the next token. +func (t *Tree) next() item { + if t.peekCount > 0 { + t.peekCount-- + } else { + t.token[0] = t.lex.nextItem() + } + return t.token[t.peekCount] +} + +// backup backs the input stream up one token. +func (t *Tree) backup() { + t.peekCount++ +} + +// backup2 backs the input stream up two tokens. +// The zeroth token is already there. +func (t *Tree) backup2(t1 item) { + t.token[1] = t1 + t.peekCount = 2 +} + +// backup3 backs the input stream up three tokens +// The zeroth token is already there. +func (t *Tree) backup3(t2, t1 item) { // Reverse order: we're pushing back. + t.token[1] = t1 + t.token[2] = t2 + t.peekCount = 3 +} + +// peek returns but does not consume the next token. +func (t *Tree) peek() item { + if t.peekCount > 0 { + return t.token[t.peekCount-1] + } + t.peekCount = 1 + t.token[0] = t.lex.nextItem() + return t.token[0] +} + +// nextNonSpace returns the next non-space token. +func (t *Tree) nextNonSpace() (token item) { + for { + token = t.next() + if token.typ != itemSpace { + break + } + } + return token +} + +// peekNonSpace returns but does not consume the next non-space token. +func (t *Tree) peekNonSpace() (token item) { + for { + token = t.next() + if token.typ != itemSpace { + break + } + } + t.backup() + return token +} + +// Parsing. + +// New allocates a new parse tree with the given name. +func New(name string, funcs ...map[string]interface{}) *Tree { + return &Tree{ + Name: name, + funcs: funcs, + } +} + +// ErrorContext returns a textual representation of the location of the node in the input text. +// The receiver is only used when the node does not have a pointer to the tree inside, +// which can occur in old code. +func (t *Tree) ErrorContext(n Node) (location, context string) { + pos := int(n.Position()) + tree := n.tree() + if tree == nil { + tree = t + } + text := tree.text[:pos] + byteNum := strings.LastIndex(text, "\n") + if byteNum == -1 { + byteNum = pos // On first line. + } else { + byteNum++ // After the newline. + byteNum = pos - byteNum + } + lineNum := 1 + strings.Count(text, "\n") + context = n.String() + if len(context) > 20 { + context = fmt.Sprintf("%.20s...", context) + } + return fmt.Sprintf("%s:%d:%d", tree.ParseName, lineNum, byteNum), context +} + +// errorf formats the error and terminates processing. +func (t *Tree) errorf(format string, args ...interface{}) { + t.Root = nil + format = fmt.Sprintf("template: %s:%d: %s", t.ParseName, t.lex.lineNumber(), format) + panic(fmt.Errorf(format, args...)) +} + +// error terminates processing. +func (t *Tree) error(err error) { + t.errorf("%s", err) +} + +// expect consumes the next token and guarantees it has the required type. +func (t *Tree) expect(expected itemType, context string) item { + token := t.nextNonSpace() + if token.typ != expected { + t.unexpected(token, context) + } + return token +} + +// expectOneOf consumes the next token and guarantees it has one of the required types. +func (t *Tree) expectOneOf(expected1, expected2 itemType, context string) item { + token := t.nextNonSpace() + if token.typ != expected1 && token.typ != expected2 { + t.unexpected(token, context) + } + return token +} + +// unexpected complains about the token and terminates processing. +func (t *Tree) unexpected(token item, context string) { + t.errorf("unexpected %s in %s", token, context) +} + +// recover is the handler that turns panics into returns from the top level of Parse. +func (t *Tree) recover(errp *error) { + e := recover() + if e != nil { + if _, ok := e.(runtime.Error); ok { + panic(e) + } + if t != nil { + t.stopParse() + } + *errp = e.(error) + } + return +} + +// startParse initializes the parser, using the lexer. +func (t *Tree) startParse(funcs []map[string]interface{}, lex *lexer) { + t.Root = nil + t.lex = lex + t.vars = []string{"$"} + t.funcs = funcs +} + +// stopParse terminates parsing. +func (t *Tree) stopParse() { + t.lex = nil + t.vars = nil + t.funcs = nil +} + +// Parse parses the template definition string to construct a representation of +// the template for execution. If either action delimiter string is empty, the +// default ("{{" or "}}") is used. Embedded template definitions are added to +// the treeSet map. +func (t *Tree) Parse(text, leftDelim, rightDelim string, treeSet map[string]*Tree, funcs ...map[string]interface{}) (tree *Tree, err error) { + defer t.recover(&err) + t.ParseName = t.Name + t.startParse(funcs, lex(t.Name, text, leftDelim, rightDelim)) + t.text = text + t.parse(treeSet) + t.add(treeSet) + t.stopParse() + return t, nil +} + +// add adds tree to the treeSet. +func (t *Tree) add(treeSet map[string]*Tree) { + tree := treeSet[t.Name] + if tree == nil || IsEmptyTree(tree.Root) { + treeSet[t.Name] = t + return + } + if !IsEmptyTree(t.Root) { + t.errorf("template: multiple definition of template %q", t.Name) + } +} + +// IsEmptyTree reports whether this tree (node) is empty of everything but space. +func IsEmptyTree(n Node) bool { + switch n := n.(type) { + case nil: + return true + case *ActionNode: + case *IfNode: + case *ListNode: + for _, node := range n.Nodes { + if !IsEmptyTree(node) { + return false + } + } + return true + case *RangeNode: + case *TemplateNode: + case *TextNode: + return len(bytes.TrimSpace(n.Text)) == 0 + case *WithNode: + default: + panic("unknown node: " + n.String()) + } + return false +} + +// parse is the top-level parser for a template, essentially the same +// as itemList except it also parses {{define}} actions. +// It runs to EOF. +func (t *Tree) parse(treeSet map[string]*Tree) (next Node) { + t.Root = t.newList(t.peek().pos) + for t.peek().typ != itemEOF { + if t.peek().typ == itemLeftDelim { + delim := t.next() + if t.nextNonSpace().typ == itemDefine { + newT := New("definition") // name will be updated once we know it. + newT.text = t.text + newT.ParseName = t.ParseName + newT.startParse(t.funcs, t.lex) + newT.parseDefinition(treeSet) + continue + } + t.backup2(delim) + } + n := t.textOrAction() + if n.Type() == nodeEnd { + t.errorf("unexpected %s", n) + } + t.Root.append(n) + } + return nil +} + +// parseDefinition parses a {{define}} ... {{end}} template definition and +// installs the definition in the treeSet map. The "define" keyword has already +// been scanned. +func (t *Tree) parseDefinition(treeSet map[string]*Tree) { + const context = "define clause" + name := t.expectOneOf(itemString, itemRawString, context) + var err error + t.Name, err = strconv.Unquote(name.val) + if err != nil { + t.error(err) + } + t.expect(itemRightDelim, context) + var end Node + t.Root, end = t.itemList() + if end.Type() != nodeEnd { + t.errorf("unexpected %s in %s", end, context) + } + t.add(treeSet) + t.stopParse() +} + +// itemList: +// textOrAction* +// Terminates at {{end}} or {{else}}, returned separately. +func (t *Tree) itemList() (list *ListNode, next Node) { + list = t.newList(t.peekNonSpace().pos) + for t.peekNonSpace().typ != itemEOF { + n := t.textOrAction() + switch n.Type() { + case nodeEnd, nodeElse: + return list, n + } + list.append(n) + } + t.errorf("unexpected EOF") + return +} + +// textOrAction: +// text | action +func (t *Tree) textOrAction() Node { + switch token := t.nextNonSpace(); token.typ { + case itemElideNewline: + return t.elideNewline() + case itemText: + return t.newText(token.pos, token.val) + case itemLeftDelim: + return t.action() + default: + t.unexpected(token, "input") + } + return nil +} + +// elideNewline: +// Remove newlines trailing rightDelim if \\ is present. +func (t *Tree) elideNewline() Node { + token := t.peek() + if token.typ != itemText { + t.unexpected(token, "input") + return nil + } + + t.next() + stripped := strings.TrimLeft(token.val, "\n\r") + diff := len(token.val) - len(stripped) + if diff > 0 { + // This is a bit nasty. We mutate the token in-place to remove + // preceding newlines. + token.pos += Pos(diff) + token.val = stripped + } + return t.newText(token.pos, token.val) +} + +// Action: +// control +// command ("|" command)* +// Left delim is past. Now get actions. +// First word could be a keyword such as range. +func (t *Tree) action() (n Node) { + switch token := t.nextNonSpace(); token.typ { + case itemElse: + return t.elseControl() + case itemEnd: + return t.endControl() + case itemIf: + return t.ifControl() + case itemRange: + return t.rangeControl() + case itemTemplate: + return t.templateControl() + case itemWith: + return t.withControl() + } + t.backup() + // Do not pop variables; they persist until "end". + return t.newAction(t.peek().pos, t.lex.lineNumber(), t.pipeline("command")) +} + +// Pipeline: +// declarations? command ('|' command)* +func (t *Tree) pipeline(context string) (pipe *PipeNode) { + var decl []*VariableNode + pos := t.peekNonSpace().pos + // Are there declarations? + for { + if v := t.peekNonSpace(); v.typ == itemVariable { + t.next() + // Since space is a token, we need 3-token look-ahead here in the worst case: + // in "$x foo" we need to read "foo" (as opposed to ":=") to know that $x is an + // argument variable rather than a declaration. So remember the token + // adjacent to the variable so we can push it back if necessary. + tokenAfterVariable := t.peek() + if next := t.peekNonSpace(); next.typ == itemColonEquals || (next.typ == itemChar && next.val == ",") { + t.nextNonSpace() + variable := t.newVariable(v.pos, v.val) + decl = append(decl, variable) + t.vars = append(t.vars, v.val) + if next.typ == itemChar && next.val == "," { + if context == "range" && len(decl) < 2 { + continue + } + t.errorf("too many declarations in %s", context) + } + } else if tokenAfterVariable.typ == itemSpace { + t.backup3(v, tokenAfterVariable) + } else { + t.backup2(v) + } + } + break + } + pipe = t.newPipeline(pos, t.lex.lineNumber(), decl) + for { + switch token := t.nextNonSpace(); token.typ { + case itemRightDelim, itemRightParen: + if len(pipe.Cmds) == 0 { + t.errorf("missing value for %s", context) + } + if token.typ == itemRightParen { + t.backup() + } + return + case itemBool, itemCharConstant, itemComplex, itemDot, itemField, itemIdentifier, + itemNumber, itemNil, itemRawString, itemString, itemVariable, itemLeftParen: + t.backup() + pipe.append(t.command()) + default: + t.unexpected(token, context) + } + } +} + +func (t *Tree) parseControl(allowElseIf bool, context string) (pos Pos, line int, pipe *PipeNode, list, elseList *ListNode) { + defer t.popVars(len(t.vars)) + line = t.lex.lineNumber() + pipe = t.pipeline(context) + var next Node + list, next = t.itemList() + switch next.Type() { + case nodeEnd: //done + case nodeElse: + if allowElseIf { + // Special case for "else if". If the "else" is followed immediately by an "if", + // the elseControl will have left the "if" token pending. Treat + // {{if a}}_{{else if b}}_{{end}} + // as + // {{if a}}_{{else}}{{if b}}_{{end}}{{end}}. + // To do this, parse the if as usual and stop at it {{end}}; the subsequent{{end}} + // is assumed. This technique works even for long if-else-if chains. + // TODO: Should we allow else-if in with and range? + if t.peek().typ == itemIf { + t.next() // Consume the "if" token. + elseList = t.newList(next.Position()) + elseList.append(t.ifControl()) + // Do not consume the next item - only one {{end}} required. + break + } + } + elseList, next = t.itemList() + if next.Type() != nodeEnd { + t.errorf("expected end; found %s", next) + } + } + return pipe.Position(), line, pipe, list, elseList +} + +// If: +// {{if pipeline}} itemList {{end}} +// {{if pipeline}} itemList {{else}} itemList {{end}} +// If keyword is past. +func (t *Tree) ifControl() Node { + return t.newIf(t.parseControl(true, "if")) +} + +// Range: +// {{range pipeline}} itemList {{end}} +// {{range pipeline}} itemList {{else}} itemList {{end}} +// Range keyword is past. +func (t *Tree) rangeControl() Node { + return t.newRange(t.parseControl(false, "range")) +} + +// With: +// {{with pipeline}} itemList {{end}} +// {{with pipeline}} itemList {{else}} itemList {{end}} +// If keyword is past. +func (t *Tree) withControl() Node { + return t.newWith(t.parseControl(false, "with")) +} + +// End: +// {{end}} +// End keyword is past. +func (t *Tree) endControl() Node { + return t.newEnd(t.expect(itemRightDelim, "end").pos) +} + +// Else: +// {{else}} +// Else keyword is past. +func (t *Tree) elseControl() Node { + // Special case for "else if". + peek := t.peekNonSpace() + if peek.typ == itemIf { + // We see "{{else if ... " but in effect rewrite it to {{else}}{{if ... ". + return t.newElse(peek.pos, t.lex.lineNumber()) + } + return t.newElse(t.expect(itemRightDelim, "else").pos, t.lex.lineNumber()) +} + +// Template: +// {{template stringValue pipeline}} +// Template keyword is past. The name must be something that can evaluate +// to a string. +func (t *Tree) templateControl() Node { + var name string + token := t.nextNonSpace() + switch token.typ { + case itemString, itemRawString: + s, err := strconv.Unquote(token.val) + if err != nil { + t.error(err) + } + name = s + default: + t.unexpected(token, "template invocation") + } + var pipe *PipeNode + if t.nextNonSpace().typ != itemRightDelim { + t.backup() + // Do not pop variables; they persist until "end". + pipe = t.pipeline("template") + } + return t.newTemplate(token.pos, t.lex.lineNumber(), name, pipe) +} + +// command: +// operand (space operand)* +// space-separated arguments up to a pipeline character or right delimiter. +// we consume the pipe character but leave the right delim to terminate the action. +func (t *Tree) command() *CommandNode { + cmd := t.newCommand(t.peekNonSpace().pos) + for { + t.peekNonSpace() // skip leading spaces. + operand := t.operand() + if operand != nil { + cmd.append(operand) + } + switch token := t.next(); token.typ { + case itemSpace: + continue + case itemError: + t.errorf("%s", token.val) + case itemRightDelim, itemRightParen: + t.backup() + case itemPipe: + default: + t.errorf("unexpected %s in operand; missing space?", token) + } + break + } + if len(cmd.Args) == 0 { + t.errorf("empty command") + } + return cmd +} + +// operand: +// term .Field* +// An operand is a space-separated component of a command, +// a term possibly followed by field accesses. +// A nil return means the next item is not an operand. +func (t *Tree) operand() Node { + node := t.term() + if node == nil { + return nil + } + if t.peek().typ == itemField { + chain := t.newChain(t.peek().pos, node) + for t.peek().typ == itemField { + chain.Add(t.next().val) + } + // Compatibility with original API: If the term is of type NodeField + // or NodeVariable, just put more fields on the original. + // Otherwise, keep the Chain node. + // TODO: Switch to Chains always when we can. + switch node.Type() { + case NodeField: + node = t.newField(chain.Position(), chain.String()) + case NodeVariable: + node = t.newVariable(chain.Position(), chain.String()) + default: + node = chain + } + } + return node +} + +// term: +// literal (number, string, nil, boolean) +// function (identifier) +// . +// .Field +// $ +// '(' pipeline ')' +// A term is a simple "expression". +// A nil return means the next item is not a term. +func (t *Tree) term() Node { + switch token := t.nextNonSpace(); token.typ { + case itemError: + t.errorf("%s", token.val) + case itemIdentifier: + if !t.hasFunction(token.val) { + t.errorf("function %q not defined", token.val) + } + return NewIdentifier(token.val).SetTree(t).SetPos(token.pos) + case itemDot: + return t.newDot(token.pos) + case itemNil: + return t.newNil(token.pos) + case itemVariable: + return t.useVar(token.pos, token.val) + case itemField: + return t.newField(token.pos, token.val) + case itemBool: + return t.newBool(token.pos, token.val == "true") + case itemCharConstant, itemComplex, itemNumber: + number, err := t.newNumber(token.pos, token.val, token.typ) + if err != nil { + t.error(err) + } + return number + case itemLeftParen: + pipe := t.pipeline("parenthesized pipeline") + if token := t.next(); token.typ != itemRightParen { + t.errorf("unclosed right paren: unexpected %s", token) + } + return pipe + case itemString, itemRawString: + s, err := strconv.Unquote(token.val) + if err != nil { + t.error(err) + } + return t.newString(token.pos, token.val, s) + } + t.backup() + return nil +} + +// hasFunction reports if a function name exists in the Tree's maps. +func (t *Tree) hasFunction(name string) bool { + for _, funcMap := range t.funcs { + if funcMap == nil { + continue + } + if funcMap[name] != nil { + return true + } + } + return false +} + +// popVars trims the variable list to the specified length +func (t *Tree) popVars(n int) { + t.vars = t.vars[:n] +} + +// useVar returns a node for a variable reference. It errors if the +// variable is not defined. +func (t *Tree) useVar(pos Pos, name string) Node { + v := t.newVariable(pos, name) + for _, varName := range t.vars { + if varName == v.Ident[0] { + return v + } + } + t.errorf("undefined variable %q", v.Ident[0]) + return nil +} diff --git a/api/vendor/github.com/alecthomas/template/parse/parse_test.go b/api/vendor/github.com/alecthomas/template/parse/parse_test.go new file mode 100644 index 0000000..c73640f --- /dev/null +++ b/api/vendor/github.com/alecthomas/template/parse/parse_test.go @@ -0,0 +1,426 @@ +// 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 parse + +import ( + "flag" + "fmt" + "strings" + "testing" +) + +var debug = flag.Bool("debug", false, "show the errors produced by the main tests") + +type numberTest struct { + text string + isInt bool + isUint bool + isFloat bool + isComplex bool + int64 + uint64 + float64 + complex128 +} + +var numberTests = []numberTest{ + // basics + {"0", true, true, true, false, 0, 0, 0, 0}, + {"-0", true, true, true, false, 0, 0, 0, 0}, // check that -0 is a uint. + {"73", true, true, true, false, 73, 73, 73, 0}, + {"073", true, true, true, false, 073, 073, 073, 0}, + {"0x73", true, true, true, false, 0x73, 0x73, 0x73, 0}, + {"-73", true, false, true, false, -73, 0, -73, 0}, + {"+73", true, false, true, false, 73, 0, 73, 0}, + {"100", true, true, true, false, 100, 100, 100, 0}, + {"1e9", true, true, true, false, 1e9, 1e9, 1e9, 0}, + {"-1e9", true, false, true, false, -1e9, 0, -1e9, 0}, + {"-1.2", false, false, true, false, 0, 0, -1.2, 0}, + {"1e19", false, true, true, false, 0, 1e19, 1e19, 0}, + {"-1e19", false, false, true, false, 0, 0, -1e19, 0}, + {"4i", false, false, false, true, 0, 0, 0, 4i}, + {"-1.2+4.2i", false, false, false, true, 0, 0, 0, -1.2 + 4.2i}, + {"073i", false, false, false, true, 0, 0, 0, 73i}, // not octal! + // complex with 0 imaginary are float (and maybe integer) + {"0i", true, true, true, true, 0, 0, 0, 0}, + {"-1.2+0i", false, false, true, true, 0, 0, -1.2, -1.2}, + {"-12+0i", true, false, true, true, -12, 0, -12, -12}, + {"13+0i", true, true, true, true, 13, 13, 13, 13}, + // funny bases + {"0123", true, true, true, false, 0123, 0123, 0123, 0}, + {"-0x0", true, true, true, false, 0, 0, 0, 0}, + {"0xdeadbeef", true, true, true, false, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0}, + // character constants + {`'a'`, true, true, true, false, 'a', 'a', 'a', 0}, + {`'\n'`, true, true, true, false, '\n', '\n', '\n', 0}, + {`'\\'`, true, true, true, false, '\\', '\\', '\\', 0}, + {`'\''`, true, true, true, false, '\'', '\'', '\'', 0}, + {`'\xFF'`, true, true, true, false, 0xFF, 0xFF, 0xFF, 0}, + {`'パ'`, true, true, true, false, 0x30d1, 0x30d1, 0x30d1, 0}, + {`'\u30d1'`, true, true, true, false, 0x30d1, 0x30d1, 0x30d1, 0}, + {`'\U000030d1'`, true, true, true, false, 0x30d1, 0x30d1, 0x30d1, 0}, + // some broken syntax + {text: "+-2"}, + {text: "0x123."}, + {text: "1e."}, + {text: "0xi."}, + {text: "1+2."}, + {text: "'x"}, + {text: "'xx'"}, + // Issue 8622 - 0xe parsed as floating point. Very embarrassing. + {"0xef", true, true, true, false, 0xef, 0xef, 0xef, 0}, +} + +func TestNumberParse(t *testing.T) { + for _, test := range numberTests { + // If fmt.Sscan thinks it's complex, it's complex. We can't trust the output + // because imaginary comes out as a number. + var c complex128 + typ := itemNumber + var tree *Tree + if test.text[0] == '\'' { + typ = itemCharConstant + } else { + _, err := fmt.Sscan(test.text, &c) + if err == nil { + typ = itemComplex + } + } + n, err := tree.newNumber(0, test.text, typ) + ok := test.isInt || test.isUint || test.isFloat || test.isComplex + if ok && err != nil { + t.Errorf("unexpected error for %q: %s", test.text, err) + continue + } + if !ok && err == nil { + t.Errorf("expected error for %q", test.text) + continue + } + if !ok { + if *debug { + fmt.Printf("%s\n\t%s\n", test.text, err) + } + continue + } + if n.IsComplex != test.isComplex { + t.Errorf("complex incorrect for %q; should be %t", test.text, test.isComplex) + } + if test.isInt { + if !n.IsInt { + t.Errorf("expected integer for %q", test.text) + } + if n.Int64 != test.int64 { + t.Errorf("int64 for %q should be %d Is %d", test.text, test.int64, n.Int64) + } + } else if n.IsInt { + t.Errorf("did not expect integer for %q", test.text) + } + if test.isUint { + if !n.IsUint { + t.Errorf("expected unsigned integer for %q", test.text) + } + if n.Uint64 != test.uint64 { + t.Errorf("uint64 for %q should be %d Is %d", test.text, test.uint64, n.Uint64) + } + } else if n.IsUint { + t.Errorf("did not expect unsigned integer for %q", test.text) + } + if test.isFloat { + if !n.IsFloat { + t.Errorf("expected float for %q", test.text) + } + if n.Float64 != test.float64 { + t.Errorf("float64 for %q should be %g Is %g", test.text, test.float64, n.Float64) + } + } else if n.IsFloat { + t.Errorf("did not expect float for %q", test.text) + } + if test.isComplex { + if !n.IsComplex { + t.Errorf("expected complex for %q", test.text) + } + if n.Complex128 != test.complex128 { + t.Errorf("complex128 for %q should be %g Is %g", test.text, test.complex128, n.Complex128) + } + } else if n.IsComplex { + t.Errorf("did not expect complex for %q", test.text) + } + } +} + +type parseTest struct { + name string + input string + ok bool + result string // what the user would see in an error message. +} + +const ( + noError = true + hasError = false +) + +var parseTests = []parseTest{ + {"empty", "", noError, + ``}, + {"comment", "{{/*\n\n\n*/}}", noError, + ``}, + {"spaces", " \t\n", noError, + `" \t\n"`}, + {"text", "some text", noError, + `"some text"`}, + {"emptyAction", "{{}}", hasError, + `{{}}`}, + {"field", "{{.X}}", noError, + `{{.X}}`}, + {"simple command", "{{printf}}", noError, + `{{printf}}`}, + {"$ invocation", "{{$}}", noError, + "{{$}}"}, + {"variable invocation", "{{with $x := 3}}{{$x 23}}{{end}}", noError, + "{{with $x := 3}}{{$x 23}}{{end}}"}, + {"variable with fields", "{{$.I}}", noError, + "{{$.I}}"}, + {"multi-word command", "{{printf `%d` 23}}", noError, + "{{printf `%d` 23}}"}, + {"pipeline", "{{.X|.Y}}", noError, + `{{.X | .Y}}`}, + {"pipeline with decl", "{{$x := .X|.Y}}", noError, + `{{$x := .X | .Y}}`}, + {"nested pipeline", "{{.X (.Y .Z) (.A | .B .C) (.E)}}", noError, + `{{.X (.Y .Z) (.A | .B .C) (.E)}}`}, + {"field applied to parentheses", "{{(.Y .Z).Field}}", noError, + `{{(.Y .Z).Field}}`}, + {"simple if", "{{if .X}}hello{{end}}", noError, + `{{if .X}}"hello"{{end}}`}, + {"if with else", "{{if .X}}true{{else}}false{{end}}", noError, + `{{if .X}}"true"{{else}}"false"{{end}}`}, + {"if with else if", "{{if .X}}true{{else if .Y}}false{{end}}", noError, + `{{if .X}}"true"{{else}}{{if .Y}}"false"{{end}}{{end}}`}, + {"if else chain", "+{{if .X}}X{{else if .Y}}Y{{else if .Z}}Z{{end}}+", noError, + `"+"{{if .X}}"X"{{else}}{{if .Y}}"Y"{{else}}{{if .Z}}"Z"{{end}}{{end}}{{end}}"+"`}, + {"simple range", "{{range .X}}hello{{end}}", noError, + `{{range .X}}"hello"{{end}}`}, + {"chained field range", "{{range .X.Y.Z}}hello{{end}}", noError, + `{{range .X.Y.Z}}"hello"{{end}}`}, + {"nested range", "{{range .X}}hello{{range .Y}}goodbye{{end}}{{end}}", noError, + `{{range .X}}"hello"{{range .Y}}"goodbye"{{end}}{{end}}`}, + {"range with else", "{{range .X}}true{{else}}false{{end}}", noError, + `{{range .X}}"true"{{else}}"false"{{end}}`}, + {"range over pipeline", "{{range .X|.M}}true{{else}}false{{end}}", noError, + `{{range .X | .M}}"true"{{else}}"false"{{end}}`}, + {"range []int", "{{range .SI}}{{.}}{{end}}", noError, + `{{range .SI}}{{.}}{{end}}`}, + {"range 1 var", "{{range $x := .SI}}{{.}}{{end}}", noError, + `{{range $x := .SI}}{{.}}{{end}}`}, + {"range 2 vars", "{{range $x, $y := .SI}}{{.}}{{end}}", noError, + `{{range $x, $y := .SI}}{{.}}{{end}}`}, + {"constants", "{{range .SI 1 -3.2i true false 'a' nil}}{{end}}", noError, + `{{range .SI 1 -3.2i true false 'a' nil}}{{end}}`}, + {"template", "{{template `x`}}", noError, + `{{template "x"}}`}, + {"template with arg", "{{template `x` .Y}}", noError, + `{{template "x" .Y}}`}, + {"with", "{{with .X}}hello{{end}}", noError, + `{{with .X}}"hello"{{end}}`}, + {"with with else", "{{with .X}}hello{{else}}goodbye{{end}}", noError, + `{{with .X}}"hello"{{else}}"goodbye"{{end}}`}, + {"elide newline", "{{true}}\\\n ", noError, + `{{true}}" "`}, + // Errors. + {"unclosed action", "hello{{range", hasError, ""}, + {"unmatched end", "{{end}}", hasError, ""}, + {"missing end", "hello{{range .x}}", hasError, ""}, + {"missing end after else", "hello{{range .x}}{{else}}", hasError, ""}, + {"undefined function", "hello{{undefined}}", hasError, ""}, + {"undefined variable", "{{$x}}", hasError, ""}, + {"variable undefined after end", "{{with $x := 4}}{{end}}{{$x}}", hasError, ""}, + {"variable undefined in template", "{{template $v}}", hasError, ""}, + {"declare with field", "{{with $x.Y := 4}}{{end}}", hasError, ""}, + {"template with field ref", "{{template .X}}", hasError, ""}, + {"template with var", "{{template $v}}", hasError, ""}, + {"invalid punctuation", "{{printf 3, 4}}", hasError, ""}, + {"multidecl outside range", "{{with $v, $u := 3}}{{end}}", hasError, ""}, + {"too many decls in range", "{{range $u, $v, $w := 3}}{{end}}", hasError, ""}, + {"dot applied to parentheses", "{{printf (printf .).}}", hasError, ""}, + {"adjacent args", "{{printf 3`x`}}", hasError, ""}, + {"adjacent args with .", "{{printf `x`.}}", hasError, ""}, + {"extra end after if", "{{if .X}}a{{else if .Y}}b{{end}}{{end}}", hasError, ""}, + {"invalid newline elision", "{{true}}\\{{true}}", hasError, ""}, + // Equals (and other chars) do not assignments make (yet). + {"bug0a", "{{$x := 0}}{{$x}}", noError, "{{$x := 0}}{{$x}}"}, + {"bug0b", "{{$x = 1}}{{$x}}", hasError, ""}, + {"bug0c", "{{$x ! 2}}{{$x}}", hasError, ""}, + {"bug0d", "{{$x % 3}}{{$x}}", hasError, ""}, + // Check the parse fails for := rather than comma. + {"bug0e", "{{range $x := $y := 3}}{{end}}", hasError, ""}, + // Another bug: variable read must ignore following punctuation. + {"bug1a", "{{$x:=.}}{{$x!2}}", hasError, ""}, // ! is just illegal here. + {"bug1b", "{{$x:=.}}{{$x+2}}", hasError, ""}, // $x+2 should not parse as ($x) (+2). + {"bug1c", "{{$x:=.}}{{$x +2}}", noError, "{{$x := .}}{{$x +2}}"}, // It's OK with a space. +} + +var builtins = map[string]interface{}{ + "printf": fmt.Sprintf, +} + +func testParse(doCopy bool, t *testing.T) { + textFormat = "%q" + defer func() { textFormat = "%s" }() + for _, test := range parseTests { + tmpl, err := New(test.name).Parse(test.input, "", "", make(map[string]*Tree), builtins) + switch { + case err == nil && !test.ok: + t.Errorf("%q: expected error; got none", test.name) + continue + case err != nil && test.ok: + t.Errorf("%q: unexpected error: %v", test.name, err) + continue + case err != nil && !test.ok: + // expected error, got one + if *debug { + fmt.Printf("%s: %s\n\t%s\n", test.name, test.input, err) + } + continue + } + var result string + if doCopy { + result = tmpl.Root.Copy().String() + } else { + result = tmpl.Root.String() + } + if result != test.result { + t.Errorf("%s=(%q): got\n\t%v\nexpected\n\t%v", test.name, test.input, result, test.result) + } + } +} + +func TestParse(t *testing.T) { + testParse(false, t) +} + +// Same as TestParse, but we copy the node first +func TestParseCopy(t *testing.T) { + testParse(true, t) +} + +type isEmptyTest struct { + name string + input string + empty bool +} + +var isEmptyTests = []isEmptyTest{ + {"empty", ``, true}, + {"nonempty", `hello`, false}, + {"spaces only", " \t\n \t\n", true}, + {"definition", `{{define "x"}}something{{end}}`, true}, + {"definitions and space", "{{define `x`}}something{{end}}\n\n{{define `y`}}something{{end}}\n\n", true}, + {"definitions and text", "{{define `x`}}something{{end}}\nx\n{{define `y`}}something{{end}}\ny\n", false}, + {"definition and action", "{{define `x`}}something{{end}}{{if 3}}foo{{end}}", false}, +} + +func TestIsEmpty(t *testing.T) { + if !IsEmptyTree(nil) { + t.Errorf("nil tree is not empty") + } + for _, test := range isEmptyTests { + tree, err := New("root").Parse(test.input, "", "", make(map[string]*Tree), nil) + if err != nil { + t.Errorf("%q: unexpected error: %v", test.name, err) + continue + } + if empty := IsEmptyTree(tree.Root); empty != test.empty { + t.Errorf("%q: expected %t got %t", test.name, test.empty, empty) + } + } +} + +func TestErrorContextWithTreeCopy(t *testing.T) { + tree, err := New("root").Parse("{{if true}}{{end}}", "", "", make(map[string]*Tree), nil) + if err != nil { + t.Fatalf("unexpected tree parse failure: %v", err) + } + treeCopy := tree.Copy() + wantLocation, wantContext := tree.ErrorContext(tree.Root.Nodes[0]) + gotLocation, gotContext := treeCopy.ErrorContext(treeCopy.Root.Nodes[0]) + if wantLocation != gotLocation { + t.Errorf("wrong error location want %q got %q", wantLocation, gotLocation) + } + if wantContext != gotContext { + t.Errorf("wrong error location want %q got %q", wantContext, gotContext) + } +} + +// All failures, and the result is a string that must appear in the error message. +var errorTests = []parseTest{ + // Check line numbers are accurate. + {"unclosed1", + "line1\n{{", + hasError, `unclosed1:2: unexpected unclosed action in command`}, + {"unclosed2", + "line1\n{{define `x`}}line2\n{{", + hasError, `unclosed2:3: unexpected unclosed action in command`}, + // Specific errors. + {"function", + "{{foo}}", + hasError, `function "foo" not defined`}, + {"comment", + "{{/*}}", + hasError, `unclosed comment`}, + {"lparen", + "{{.X (1 2 3}}", + hasError, `unclosed left paren`}, + {"rparen", + "{{.X 1 2 3)}}", + hasError, `unexpected ")"`}, + {"space", + "{{`x`3}}", + hasError, `missing space?`}, + {"idchar", + "{{a#}}", + hasError, `'#'`}, + {"charconst", + "{{'a}}", + hasError, `unterminated character constant`}, + {"stringconst", + `{{"a}}`, + hasError, `unterminated quoted string`}, + {"rawstringconst", + "{{`a}}", + hasError, `unterminated raw quoted string`}, + {"number", + "{{0xi}}", + hasError, `number syntax`}, + {"multidefine", + "{{define `a`}}a{{end}}{{define `a`}}b{{end}}", + hasError, `multiple definition of template`}, + {"eof", + "{{range .X}}", + hasError, `unexpected EOF`}, + {"variable", + // Declare $x so it's defined, to avoid that error, and then check we don't parse a declaration. + "{{$x := 23}}{{with $x.y := 3}}{{$x 23}}{{end}}", + hasError, `unexpected ":="`}, + {"multidecl", + "{{$a,$b,$c := 23}}", + hasError, `too many declarations`}, + {"undefvar", + "{{$a}}", + hasError, `undefined variable`}, +} + +func TestErrors(t *testing.T) { + for _, test := range errorTests { + _, err := New(test.name).Parse(test.input, "", "", make(map[string]*Tree)) + if err == nil { + t.Errorf("%q: expected error", test.name) + continue + } + if !strings.Contains(err.Error(), test.result) { + t.Errorf("%q: error %q does not contain %q", test.name, err, test.result) + } + } +} diff --git a/api/vendor/github.com/alecthomas/template/template.go b/api/vendor/github.com/alecthomas/template/template.go new file mode 100644 index 0000000..447ed2a --- /dev/null +++ b/api/vendor/github.com/alecthomas/template/template.go @@ -0,0 +1,218 @@ +// 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 template + +import ( + "fmt" + "reflect" + + "github.com/alecthomas/template/parse" +) + +// common holds the information shared by related templates. +type common struct { + tmpl map[string]*Template + // We use two maps, one for parsing and one for execution. + // This separation makes the API cleaner since it doesn't + // expose reflection to the client. + parseFuncs FuncMap + execFuncs map[string]reflect.Value +} + +// Template is the representation of a parsed template. The *parse.Tree +// field is exported only for use by html/template and should be treated +// as unexported by all other clients. +type Template struct { + name string + *parse.Tree + *common + leftDelim string + rightDelim string +} + +// New allocates a new template with the given name. +func New(name string) *Template { + return &Template{ + name: name, + } +} + +// Name returns the name of the template. +func (t *Template) Name() string { + return t.name +} + +// New allocates a new template associated with the given one and with the same +// delimiters. The association, which is transitive, allows one template to +// invoke another with a {{template}} action. +func (t *Template) New(name string) *Template { + t.init() + return &Template{ + name: name, + common: t.common, + leftDelim: t.leftDelim, + rightDelim: t.rightDelim, + } +} + +func (t *Template) init() { + if t.common == nil { + t.common = new(common) + t.tmpl = make(map[string]*Template) + t.parseFuncs = make(FuncMap) + t.execFuncs = make(map[string]reflect.Value) + } +} + +// Clone returns a duplicate of the template, including all associated +// templates. The actual representation is not copied, but the name space of +// associated templates is, so further calls to Parse in the copy will add +// templates to the copy but not to the original. Clone can be used to prepare +// common templates and use them with variant definitions for other templates +// by adding the variants after the clone is made. +func (t *Template) Clone() (*Template, error) { + nt := t.copy(nil) + nt.init() + nt.tmpl[t.name] = nt + for k, v := range t.tmpl { + if k == t.name { // Already installed. + continue + } + // The associated templates share nt's common structure. + tmpl := v.copy(nt.common) + nt.tmpl[k] = tmpl + } + for k, v := range t.parseFuncs { + nt.parseFuncs[k] = v + } + for k, v := range t.execFuncs { + nt.execFuncs[k] = v + } + return nt, nil +} + +// copy returns a shallow copy of t, with common set to the argument. +func (t *Template) copy(c *common) *Template { + nt := New(t.name) + nt.Tree = t.Tree + nt.common = c + nt.leftDelim = t.leftDelim + nt.rightDelim = t.rightDelim + return nt +} + +// AddParseTree creates a new template with the name and parse tree +// and associates it with t. +func (t *Template) AddParseTree(name string, tree *parse.Tree) (*Template, error) { + if t.common != nil && t.tmpl[name] != nil { + return nil, fmt.Errorf("template: redefinition of template %q", name) + } + nt := t.New(name) + nt.Tree = tree + t.tmpl[name] = nt + return nt, nil +} + +// Templates returns a slice of the templates associated with t, including t +// itself. +func (t *Template) Templates() []*Template { + if t.common == nil { + return nil + } + // Return a slice so we don't expose the map. + m := make([]*Template, 0, len(t.tmpl)) + for _, v := range t.tmpl { + m = append(m, v) + } + return m +} + +// Delims sets the action delimiters to the specified strings, to be used in +// subsequent calls to Parse, ParseFiles, or ParseGlob. Nested template +// definitions will inherit the settings. An empty delimiter stands for the +// corresponding default: {{ or }}. +// The return value is the template, so calls can be chained. +func (t *Template) Delims(left, right string) *Template { + t.leftDelim = left + t.rightDelim = right + return t +} + +// Funcs adds the elements of the argument map to the template's function map. +// It panics if a value in the map is not a function with appropriate return +// type. However, it is legal to overwrite elements of the map. The return +// value is the template, so calls can be chained. +func (t *Template) Funcs(funcMap FuncMap) *Template { + t.init() + addValueFuncs(t.execFuncs, funcMap) + addFuncs(t.parseFuncs, funcMap) + return t +} + +// Lookup returns the template with the given name that is associated with t, +// or nil if there is no such template. +func (t *Template) Lookup(name string) *Template { + if t.common == nil { + return nil + } + return t.tmpl[name] +} + +// Parse parses a string into a template. Nested template definitions will be +// associated with the top-level template t. Parse may be called multiple times +// to parse definitions of templates to associate with t. It is an error if a +// resulting template is non-empty (contains content other than template +// definitions) and would replace a non-empty template with the same name. +// (In multiple calls to Parse with the same receiver template, only one call +// can contain text other than space, comments, and template definitions.) +func (t *Template) Parse(text string) (*Template, error) { + t.init() + trees, err := parse.Parse(t.name, text, t.leftDelim, t.rightDelim, t.parseFuncs, builtins) + if err != nil { + return nil, err + } + // Add the newly parsed trees, including the one for t, into our common structure. + for name, tree := range trees { + // If the name we parsed is the name of this template, overwrite this template. + // The associate method checks it's not a redefinition. + tmpl := t + if name != t.name { + tmpl = t.New(name) + } + // Even if t == tmpl, we need to install it in the common.tmpl map. + if replace, err := t.associate(tmpl, tree); err != nil { + return nil, err + } else if replace { + tmpl.Tree = tree + } + tmpl.leftDelim = t.leftDelim + tmpl.rightDelim = t.rightDelim + } + return t, nil +} + +// associate installs the new template into the group of templates associated +// with t. It is an error to reuse a name except to overwrite an empty +// template. The two are already known to share the common structure. +// The boolean return value reports wither to store this tree as t.Tree. +func (t *Template) associate(new *Template, tree *parse.Tree) (bool, error) { + if new.common != t.common { + panic("internal error: associate not common") + } + name := new.name + if old := t.tmpl[name]; old != nil { + oldIsEmpty := parse.IsEmptyTree(old.Root) + newIsEmpty := parse.IsEmptyTree(tree.Root) + if newIsEmpty { + // Whether old is empty or not, new is empty; no reason to replace old. + return false, nil + } + if !oldIsEmpty { + return false, fmt.Errorf("template: redefinition of template %q", name) + } + } + t.tmpl[name] = new + return true, nil +} diff --git a/api/vendor/github.com/alecthomas/template/testdata/file1.tmpl b/api/vendor/github.com/alecthomas/template/testdata/file1.tmpl new file mode 100644 index 0000000..febf9d9 --- /dev/null +++ b/api/vendor/github.com/alecthomas/template/testdata/file1.tmpl @@ -0,0 +1,2 @@ +{{define "x"}}TEXT{{end}} +{{define "dotV"}}{{.V}}{{end}} diff --git a/api/vendor/github.com/alecthomas/template/testdata/file2.tmpl b/api/vendor/github.com/alecthomas/template/testdata/file2.tmpl new file mode 100644 index 0000000..39bf6fb --- /dev/null +++ b/api/vendor/github.com/alecthomas/template/testdata/file2.tmpl @@ -0,0 +1,2 @@ +{{define "dot"}}{{.}}{{end}} +{{define "nested"}}{{template "dot" .}}{{end}} diff --git a/api/vendor/github.com/alecthomas/template/testdata/tmpl1.tmpl b/api/vendor/github.com/alecthomas/template/testdata/tmpl1.tmpl new file mode 100644 index 0000000..b72b3a3 --- /dev/null +++ b/api/vendor/github.com/alecthomas/template/testdata/tmpl1.tmpl @@ -0,0 +1,3 @@ +template1 +{{define "x"}}x{{end}} +{{template "y"}} diff --git a/api/vendor/github.com/alecthomas/template/testdata/tmpl2.tmpl b/api/vendor/github.com/alecthomas/template/testdata/tmpl2.tmpl new file mode 100644 index 0000000..16beba6 --- /dev/null +++ b/api/vendor/github.com/alecthomas/template/testdata/tmpl2.tmpl @@ -0,0 +1,3 @@ +template2 +{{define "y"}}y{{end}} +{{template "x"}} diff --git a/api/vendor/github.com/alecthomas/units/COPYING b/api/vendor/github.com/alecthomas/units/COPYING new file mode 100644 index 0000000..2993ec0 --- /dev/null +++ b/api/vendor/github.com/alecthomas/units/COPYING @@ -0,0 +1,19 @@ +Copyright (C) 2014 Alec Thomas + +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/api/vendor/github.com/alecthomas/units/README.md b/api/vendor/github.com/alecthomas/units/README.md new file mode 100644 index 0000000..bee884e --- /dev/null +++ b/api/vendor/github.com/alecthomas/units/README.md @@ -0,0 +1,11 @@ +# Units - Helpful unit multipliers and functions for Go + +The goal of this package is to have functionality similar to the [time](http://golang.org/pkg/time/) package. + +It allows for code like this: + +```go +n, err := ParseBase2Bytes("1KB") +// n == 1024 +n = units.Mebibyte * 512 +``` diff --git a/api/vendor/github.com/alecthomas/units/bytes.go b/api/vendor/github.com/alecthomas/units/bytes.go new file mode 100644 index 0000000..eaadeb8 --- /dev/null +++ b/api/vendor/github.com/alecthomas/units/bytes.go @@ -0,0 +1,83 @@ +package units + +// Base2Bytes is the old non-SI power-of-2 byte scale (1024 bytes in a kilobyte, +// etc.). +type Base2Bytes int64 + +// Base-2 byte units. +const ( + Kibibyte Base2Bytes = 1024 + KiB = Kibibyte + Mebibyte = Kibibyte * 1024 + MiB = Mebibyte + Gibibyte = Mebibyte * 1024 + GiB = Gibibyte + Tebibyte = Gibibyte * 1024 + TiB = Tebibyte + Pebibyte = Tebibyte * 1024 + PiB = Pebibyte + Exbibyte = Pebibyte * 1024 + EiB = Exbibyte +) + +var ( + bytesUnitMap = MakeUnitMap("iB", "B", 1024) + oldBytesUnitMap = MakeUnitMap("B", "B", 1024) +) + +// ParseBase2Bytes supports both iB and B in base-2 multipliers. That is, KB +// and KiB are both 1024. +func ParseBase2Bytes(s string) (Base2Bytes, error) { + n, err := ParseUnit(s, bytesUnitMap) + if err != nil { + n, err = ParseUnit(s, oldBytesUnitMap) + } + return Base2Bytes(n), err +} + +func (b Base2Bytes) String() string { + return ToString(int64(b), 1024, "iB", "B") +} + +var ( + metricBytesUnitMap = MakeUnitMap("B", "B", 1000) +) + +// MetricBytes are SI byte units (1000 bytes in a kilobyte). +type MetricBytes SI + +// SI base-10 byte units. +const ( + Kilobyte MetricBytes = 1000 + KB = Kilobyte + Megabyte = Kilobyte * 1000 + MB = Megabyte + Gigabyte = Megabyte * 1000 + GB = Gigabyte + Terabyte = Gigabyte * 1000 + TB = Terabyte + Petabyte = Terabyte * 1000 + PB = Petabyte + Exabyte = Petabyte * 1000 + EB = Exabyte +) + +// ParseMetricBytes parses base-10 metric byte units. That is, KB is 1000 bytes. +func ParseMetricBytes(s string) (MetricBytes, error) { + n, err := ParseUnit(s, metricBytesUnitMap) + return MetricBytes(n), err +} + +func (m MetricBytes) String() string { + return ToString(int64(m), 1000, "B", "B") +} + +// ParseStrictBytes supports both iB and B suffixes for base 2 and metric, +// respectively. That is, KiB represents 1024 and KB represents 1000. +func ParseStrictBytes(s string) (int64, error) { + n, err := ParseUnit(s, bytesUnitMap) + if err != nil { + n, err = ParseUnit(s, metricBytesUnitMap) + } + return int64(n), err +} diff --git a/api/vendor/github.com/alecthomas/units/bytes_test.go b/api/vendor/github.com/alecthomas/units/bytes_test.go new file mode 100644 index 0000000..6cbc79d --- /dev/null +++ b/api/vendor/github.com/alecthomas/units/bytes_test.go @@ -0,0 +1,49 @@ +package units + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestBase2BytesString(t *testing.T) { + assert.Equal(t, Base2Bytes(0).String(), "0B") + assert.Equal(t, Base2Bytes(1025).String(), "1KiB1B") + assert.Equal(t, Base2Bytes(1048577).String(), "1MiB1B") +} + +func TestParseBase2Bytes(t *testing.T) { + n, err := ParseBase2Bytes("0B") + assert.NoError(t, err) + assert.Equal(t, 0, int(n)) + n, err = ParseBase2Bytes("1KB") + assert.NoError(t, err) + assert.Equal(t, 1024, int(n)) + n, err = ParseBase2Bytes("1MB1KB25B") + assert.NoError(t, err) + assert.Equal(t, 1049625, int(n)) + n, err = ParseBase2Bytes("1.5MB") + assert.NoError(t, err) + assert.Equal(t, 1572864, int(n)) +} + +func TestMetricBytesString(t *testing.T) { + assert.Equal(t, MetricBytes(0).String(), "0B") + assert.Equal(t, MetricBytes(1001).String(), "1KB1B") + assert.Equal(t, MetricBytes(1001025).String(), "1MB1KB25B") +} + +func TestParseMetricBytes(t *testing.T) { + n, err := ParseMetricBytes("0B") + assert.NoError(t, err) + assert.Equal(t, 0, int(n)) + n, err = ParseMetricBytes("1KB1B") + assert.NoError(t, err) + assert.Equal(t, 1001, int(n)) + n, err = ParseMetricBytes("1MB1KB25B") + assert.NoError(t, err) + assert.Equal(t, 1001025, int(n)) + n, err = ParseMetricBytes("1.5MB") + assert.NoError(t, err) + assert.Equal(t, 1500000, int(n)) +} diff --git a/api/vendor/github.com/alecthomas/units/doc.go b/api/vendor/github.com/alecthomas/units/doc.go new file mode 100644 index 0000000..156ae38 --- /dev/null +++ b/api/vendor/github.com/alecthomas/units/doc.go @@ -0,0 +1,13 @@ +// Package units provides helpful unit multipliers and functions for Go. +// +// The goal of this package is to have functionality similar to the time [1] package. +// +// +// [1] http://golang.org/pkg/time/ +// +// It allows for code like this: +// +// n, err := ParseBase2Bytes("1KB") +// // n == 1024 +// n = units.Mebibyte * 512 +package units diff --git a/api/vendor/github.com/alecthomas/units/si.go b/api/vendor/github.com/alecthomas/units/si.go new file mode 100644 index 0000000..8234a9d --- /dev/null +++ b/api/vendor/github.com/alecthomas/units/si.go @@ -0,0 +1,26 @@ +package units + +// SI units. +type SI int64 + +// SI unit multiples. +const ( + Kilo SI = 1000 + Mega = Kilo * 1000 + Giga = Mega * 1000 + Tera = Giga * 1000 + Peta = Tera * 1000 + Exa = Peta * 1000 +) + +func MakeUnitMap(suffix, shortSuffix string, scale int64) map[string]float64 { + return map[string]float64{ + shortSuffix: 1, + "K" + suffix: float64(scale), + "M" + suffix: float64(scale * scale), + "G" + suffix: float64(scale * scale * scale), + "T" + suffix: float64(scale * scale * scale * scale), + "P" + suffix: float64(scale * scale * scale * scale * scale), + "E" + suffix: float64(scale * scale * scale * scale * scale * scale), + } +} diff --git a/api/vendor/github.com/alecthomas/units/util.go b/api/vendor/github.com/alecthomas/units/util.go new file mode 100644 index 0000000..6527e92 --- /dev/null +++ b/api/vendor/github.com/alecthomas/units/util.go @@ -0,0 +1,138 @@ +package units + +import ( + "errors" + "fmt" + "strings" +) + +var ( + siUnits = []string{"", "K", "M", "G", "T", "P", "E"} +) + +func ToString(n int64, scale int64, suffix, baseSuffix string) string { + mn := len(siUnits) + out := make([]string, mn) + for i, m := range siUnits { + if n%scale != 0 || i == 0 && n == 0 { + s := suffix + if i == 0 { + s = baseSuffix + } + out[mn-1-i] = fmt.Sprintf("%d%s%s", n%scale, m, s) + } + n /= scale + if n == 0 { + break + } + } + return strings.Join(out, "") +} + +// Below code ripped straight from http://golang.org/src/pkg/time/format.go?s=33392:33438#L1123 +var errLeadingInt = errors.New("units: bad [0-9]*") // never printed + +// leadingInt consumes the leading [0-9]* from s. +func leadingInt(s string) (x int64, rem string, err error) { + i := 0 + for ; i < len(s); i++ { + c := s[i] + if c < '0' || c > '9' { + break + } + if x >= (1<<63-10)/10 { + // overflow + return 0, "", errLeadingInt + } + x = x*10 + int64(c) - '0' + } + return x, s[i:], nil +} + +func ParseUnit(s string, unitMap map[string]float64) (int64, error) { + // [-+]?([0-9]*(\.[0-9]*)?[a-z]+)+ + orig := s + f := float64(0) + neg := false + + // Consume [-+]? + if s != "" { + c := s[0] + if c == '-' || c == '+' { + neg = c == '-' + s = s[1:] + } + } + // Special case: if all that is left is "0", this is zero. + if s == "0" { + return 0, nil + } + if s == "" { + return 0, errors.New("units: invalid " + orig) + } + for s != "" { + g := float64(0) // this element of the sequence + + var x int64 + var err error + + // The next character must be [0-9.] + if !(s[0] == '.' || ('0' <= s[0] && s[0] <= '9')) { + return 0, errors.New("units: invalid " + orig) + } + // Consume [0-9]* + pl := len(s) + x, s, err = leadingInt(s) + if err != nil { + return 0, errors.New("units: invalid " + orig) + } + g = float64(x) + pre := pl != len(s) // whether we consumed anything before a period + + // Consume (\.[0-9]*)? + post := false + if s != "" && s[0] == '.' { + s = s[1:] + pl := len(s) + x, s, err = leadingInt(s) + if err != nil { + return 0, errors.New("units: invalid " + orig) + } + scale := 1.0 + for n := pl - len(s); n > 0; n-- { + scale *= 10 + } + g += float64(x) / scale + post = pl != len(s) + } + if !pre && !post { + // no digits (e.g. ".s" or "-.s") + return 0, errors.New("units: invalid " + orig) + } + + // Consume unit. + i := 0 + for ; i < len(s); i++ { + c := s[i] + if c == '.' || ('0' <= c && c <= '9') { + break + } + } + u := s[:i] + s = s[i:] + unit, ok := unitMap[u] + if !ok { + return 0, errors.New("units: unknown unit " + u + " in " + orig) + } + + f += g * unit + } + + if neg { + f = -f + } + if f < float64(-1<<63) || f > float64(1<<63-1) { + return 0, errors.New("units: overflow parsing unit") + } + return int64(f), nil +} diff --git a/api/vendor/github.com/beorn7/perks/.gitignore b/api/vendor/github.com/beorn7/perks/.gitignore new file mode 100644 index 0000000..1bd9209 --- /dev/null +++ b/api/vendor/github.com/beorn7/perks/.gitignore @@ -0,0 +1,2 @@ +*.test +*.prof diff --git a/api/vendor/github.com/beorn7/perks/LICENSE b/api/vendor/github.com/beorn7/perks/LICENSE new file mode 100644 index 0000000..339177b --- /dev/null +++ b/api/vendor/github.com/beorn7/perks/LICENSE @@ -0,0 +1,20 @@ +Copyright (C) 2013 Blake Mizerany + +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/api/vendor/github.com/beorn7/perks/README.md b/api/vendor/github.com/beorn7/perks/README.md new file mode 100644 index 0000000..fc05777 --- /dev/null +++ b/api/vendor/github.com/beorn7/perks/README.md @@ -0,0 +1,31 @@ +# Perks for Go (golang.org) + +Perks contains the Go package quantile that computes approximate quantiles over +an unbounded data stream within low memory and CPU bounds. + +For more information and examples, see: +http://godoc.org/github.com/bmizerany/perks + +A very special thank you and shout out to Graham Cormode (Rutgers University), +Flip Korn (AT&T Labs–Research), S. Muthukrishnan (Rutgers University), and +Divesh Srivastava (AT&T Labs–Research) for their research and publication of +[Effective Computation of Biased Quantiles over Data Streams](http://www.cs.rutgers.edu/~muthu/bquant.pdf) + +Thank you, also: +* Armon Dadgar (@armon) +* Andrew Gerrand (@nf) +* Brad Fitzpatrick (@bradfitz) +* Keith Rarick (@kr) + +FAQ: + +Q: Why not move the quantile package into the project root? +A: I want to add more packages to perks later. + +Copyright (C) 2013 Blake Mizerany + +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/api/vendor/github.com/beorn7/perks/histogram/bench_test.go b/api/vendor/github.com/beorn7/perks/histogram/bench_test.go new file mode 100644 index 0000000..56c7e55 --- /dev/null +++ b/api/vendor/github.com/beorn7/perks/histogram/bench_test.go @@ -0,0 +1,26 @@ +package histogram + +import ( + "math/rand" + "testing" +) + +func BenchmarkInsert10Bins(b *testing.B) { + b.StopTimer() + h := New(10) + b.StartTimer() + for i := 0; i < b.N; i++ { + f := rand.ExpFloat64() + h.Insert(f) + } +} + +func BenchmarkInsert100Bins(b *testing.B) { + b.StopTimer() + h := New(100) + b.StartTimer() + for i := 0; i < b.N; i++ { + f := rand.ExpFloat64() + h.Insert(f) + } +} diff --git a/api/vendor/github.com/beorn7/perks/histogram/histogram.go b/api/vendor/github.com/beorn7/perks/histogram/histogram.go new file mode 100644 index 0000000..bef05c7 --- /dev/null +++ b/api/vendor/github.com/beorn7/perks/histogram/histogram.go @@ -0,0 +1,108 @@ +// Package histogram provides a Go implementation of BigML's histogram package +// for Clojure/Java. It is currently experimental. +package histogram + +import ( + "container/heap" + "math" + "sort" +) + +type Bin struct { + Count int + Sum float64 +} + +func (b *Bin) Update(x *Bin) { + b.Count += x.Count + b.Sum += x.Sum +} + +func (b *Bin) Mean() float64 { + return b.Sum / float64(b.Count) +} + +type Bins []*Bin + +func (bs Bins) Len() int { return len(bs) } +func (bs Bins) Less(i, j int) bool { return bs[i].Mean() < bs[j].Mean() } +func (bs Bins) Swap(i, j int) { bs[i], bs[j] = bs[j], bs[i] } + +func (bs *Bins) Push(x interface{}) { + *bs = append(*bs, x.(*Bin)) +} + +func (bs *Bins) Pop() interface{} { + return bs.remove(len(*bs) - 1) +} + +func (bs *Bins) remove(n int) *Bin { + if n < 0 || len(*bs) < n { + return nil + } + x := (*bs)[n] + *bs = append((*bs)[:n], (*bs)[n+1:]...) + return x +} + +type Histogram struct { + res *reservoir +} + +func New(maxBins int) *Histogram { + return &Histogram{res: newReservoir(maxBins)} +} + +func (h *Histogram) Insert(f float64) { + h.res.insert(&Bin{1, f}) + h.res.compress() +} + +func (h *Histogram) Bins() Bins { + return h.res.bins +} + +type reservoir struct { + n int + maxBins int + bins Bins +} + +func newReservoir(maxBins int) *reservoir { + return &reservoir{maxBins: maxBins} +} + +func (r *reservoir) insert(bin *Bin) { + r.n += bin.Count + i := sort.Search(len(r.bins), func(i int) bool { + return r.bins[i].Mean() >= bin.Mean() + }) + if i < 0 || i == r.bins.Len() { + // TODO(blake): Maybe use an .insert(i, bin) instead of + // performing the extra work of a heap.Push. + heap.Push(&r.bins, bin) + return + } + r.bins[i].Update(bin) +} + +func (r *reservoir) compress() { + for r.bins.Len() > r.maxBins { + minGapIndex := -1 + minGap := math.MaxFloat64 + for i := 0; i < r.bins.Len()-1; i++ { + gap := gapWeight(r.bins[i], r.bins[i+1]) + if minGap > gap { + minGap = gap + minGapIndex = i + } + } + prev := r.bins[minGapIndex] + next := r.bins.remove(minGapIndex + 1) + prev.Update(next) + } +} + +func gapWeight(prev, next *Bin) float64 { + return next.Mean() - prev.Mean() +} diff --git a/api/vendor/github.com/beorn7/perks/histogram/histogram_test.go b/api/vendor/github.com/beorn7/perks/histogram/histogram_test.go new file mode 100644 index 0000000..0575ebe --- /dev/null +++ b/api/vendor/github.com/beorn7/perks/histogram/histogram_test.go @@ -0,0 +1,38 @@ +package histogram + +import ( + "math/rand" + "testing" +) + +func TestHistogram(t *testing.T) { + const numPoints = 1e6 + const maxBins = 3 + + h := New(maxBins) + for i := 0; i < numPoints; i++ { + f := rand.ExpFloat64() + h.Insert(f) + } + + bins := h.Bins() + if g := len(bins); g > maxBins { + t.Fatalf("got %d bins, wanted <= %d", g, maxBins) + } + + for _, b := range bins { + t.Logf("%+v", b) + } + + if g := count(h.Bins()); g != numPoints { + t.Fatalf("binned %d points, wanted %d", g, numPoints) + } +} + +func count(bins Bins) int { + binCounts := 0 + for _, b := range bins { + binCounts += b.Count + } + return binCounts +} diff --git a/api/vendor/github.com/beorn7/perks/quantile/bench_test.go b/api/vendor/github.com/beorn7/perks/quantile/bench_test.go new file mode 100644 index 0000000..0bd0e4e --- /dev/null +++ b/api/vendor/github.com/beorn7/perks/quantile/bench_test.go @@ -0,0 +1,63 @@ +package quantile + +import ( + "testing" +) + +func BenchmarkInsertTargeted(b *testing.B) { + b.ReportAllocs() + + s := NewTargeted(Targets) + b.ResetTimer() + for i := float64(0); i < float64(b.N); i++ { + s.Insert(i) + } +} + +func BenchmarkInsertTargetedSmallEpsilon(b *testing.B) { + s := NewTargeted(TargetsSmallEpsilon) + b.ResetTimer() + for i := float64(0); i < float64(b.N); i++ { + s.Insert(i) + } +} + +func BenchmarkInsertBiased(b *testing.B) { + s := NewLowBiased(0.01) + b.ResetTimer() + for i := float64(0); i < float64(b.N); i++ { + s.Insert(i) + } +} + +func BenchmarkInsertBiasedSmallEpsilon(b *testing.B) { + s := NewLowBiased(0.0001) + b.ResetTimer() + for i := float64(0); i < float64(b.N); i++ { + s.Insert(i) + } +} + +func BenchmarkQuery(b *testing.B) { + s := NewTargeted(Targets) + for i := float64(0); i < 1e6; i++ { + s.Insert(i) + } + b.ResetTimer() + n := float64(b.N) + for i := float64(0); i < n; i++ { + s.Query(i / n) + } +} + +func BenchmarkQuerySmallEpsilon(b *testing.B) { + s := NewTargeted(TargetsSmallEpsilon) + for i := float64(0); i < 1e6; i++ { + s.Insert(i) + } + b.ResetTimer() + n := float64(b.N) + for i := float64(0); i < n; i++ { + s.Query(i / n) + } +} diff --git a/api/vendor/github.com/beorn7/perks/quantile/example_test.go b/api/vendor/github.com/beorn7/perks/quantile/example_test.go new file mode 100644 index 0000000..ab3293a --- /dev/null +++ b/api/vendor/github.com/beorn7/perks/quantile/example_test.go @@ -0,0 +1,121 @@ +// +build go1.1 + +package quantile_test + +import ( + "bufio" + "fmt" + "log" + "os" + "strconv" + "time" + + "github.com/beorn7/perks/quantile" +) + +func Example_simple() { + ch := make(chan float64) + go sendFloats(ch) + + // Compute the 50th, 90th, and 99th percentile. + q := quantile.NewTargeted(map[float64]float64{ + 0.50: 0.005, + 0.90: 0.001, + 0.99: 0.0001, + }) + for v := range ch { + q.Insert(v) + } + + fmt.Println("perc50:", q.Query(0.50)) + fmt.Println("perc90:", q.Query(0.90)) + fmt.Println("perc99:", q.Query(0.99)) + fmt.Println("count:", q.Count()) + // Output: + // perc50: 5 + // perc90: 16 + // perc99: 223 + // count: 2388 +} + +func Example_mergeMultipleStreams() { + // Scenario: + // We have multiple database shards. On each shard, there is a process + // collecting query response times from the database logs and inserting + // them into a Stream (created via NewTargeted(0.90)), much like the + // Simple example. These processes expose a network interface for us to + // ask them to serialize and send us the results of their + // Stream.Samples so we may Merge and Query them. + // + // NOTES: + // * These sample sets are small, allowing us to get them + // across the network much faster than sending the entire list of data + // points. + // + // * For this to work correctly, we must supply the same quantiles + // a priori the process collecting the samples supplied to NewTargeted, + // even if we do not plan to query them all here. + ch := make(chan quantile.Samples) + getDBQuerySamples(ch) + q := quantile.NewTargeted(map[float64]float64{0.90: 0.001}) + for samples := range ch { + q.Merge(samples) + } + fmt.Println("perc90:", q.Query(0.90)) +} + +func Example_window() { + // Scenario: We want the 90th, 95th, and 99th percentiles for each + // minute. + + ch := make(chan float64) + go sendStreamValues(ch) + + tick := time.NewTicker(1 * time.Minute) + q := quantile.NewTargeted(map[float64]float64{ + 0.90: 0.001, + 0.95: 0.0005, + 0.99: 0.0001, + }) + for { + select { + case t := <-tick.C: + flushToDB(t, q.Samples()) + q.Reset() + case v := <-ch: + q.Insert(v) + } + } +} + +func sendStreamValues(ch chan float64) { + // Use your imagination +} + +func flushToDB(t time.Time, samples quantile.Samples) { + // Use your imagination +} + +// This is a stub for the above example. In reality this would hit the remote +// servers via http or something like it. +func getDBQuerySamples(ch chan quantile.Samples) {} + +func sendFloats(ch chan<- float64) { + f, err := os.Open("exampledata.txt") + if err != nil { + log.Fatal(err) + } + sc := bufio.NewScanner(f) + for sc.Scan() { + b := sc.Bytes() + v, err := strconv.ParseFloat(string(b), 64) + if err != nil { + log.Fatal(err) + } + ch <- v + } + if sc.Err() != nil { + log.Fatal(sc.Err()) + } + close(ch) +} diff --git a/api/vendor/github.com/beorn7/perks/quantile/exampledata.txt b/api/vendor/github.com/beorn7/perks/quantile/exampledata.txt new file mode 100644 index 0000000..1602287 --- /dev/null +++ b/api/vendor/github.com/beorn7/perks/quantile/exampledata.txt @@ -0,0 +1,2388 @@ +8 +5 +26 +12 +5 +235 +13 +6 +28 +30 +3 +3 +3 +3 +5 +2 +33 +7 +2 +4 +7 +12 +14 +5 +8 +3 +10 +4 +5 +3 +6 +6 +209 +20 +3 +10 +14 +3 +4 +6 +8 +5 +11 +7 +3 +2 +3 +3 +212 +5 +222 +4 +10 +10 +5 +6 +3 +8 +3 +10 +254 +220 +2 +3 +5 +24 +5 +4 +222 +7 +3 +3 +223 +8 +15 +12 +14 +14 +3 +2 +2 +3 +13 +3 +11 +4 +4 +6 +5 +7 +13 +5 +3 +5 +2 +5 +3 +5 +2 +7 +15 +17 +14 +3 +6 +6 +3 +17 +5 +4 +7 +6 +4 +4 +8 +6 +8 +3 +9 +3 +6 +3 +4 +5 +3 +3 +660 +4 +6 +10 +3 +6 +3 +2 +5 +13 +2 +4 +4 +10 +4 +8 +4 +3 +7 +9 +9 +3 +10 +37 +3 +13 +4 +12 +3 +6 +10 +8 +5 +21 +2 +3 +8 +3 +2 +3 +3 +4 +12 +2 +4 +8 +8 +4 +3 +2 +20 +1 +6 +32 +2 +11 +6 +18 +3 +8 +11 +3 +212 +3 +4 +2 +6 +7 +12 +11 +3 +2 +16 +10 +6 +4 +6 +3 +2 +7 +3 +2 +2 +2 +2 +5 +6 +4 +3 +10 +3 +4 +6 +5 +3 +4 +4 +5 +6 +4 +3 +4 +4 +5 +7 +5 +5 +3 +2 +7 +2 +4 +12 +4 +5 +6 +2 +4 +4 +8 +4 +15 +13 +7 +16 +5 +3 +23 +5 +5 +7 +3 +2 +9 +8 +7 +5 +8 +11 +4 +10 +76 +4 +47 +4 +3 +2 +7 +4 +2 +3 +37 +10 +4 +2 +20 +5 +4 +4 +10 +10 +4 +3 +7 +23 +240 +7 +13 +5 +5 +3 +3 +2 +5 +4 +2 +8 +7 +19 +2 +23 +8 +7 +2 +5 +3 +8 +3 +8 +13 +5 +5 +5 +2 +3 +23 +4 +9 +8 +4 +3 +3 +5 +220 +2 +3 +4 +6 +14 +3 +53 +6 +2 +5 +18 +6 +3 +219 +6 +5 +2 +5 +3 +6 +5 +15 +4 +3 +17 +3 +2 +4 +7 +2 +3 +3 +4 +4 +3 +2 +664 +6 +3 +23 +5 +5 +16 +5 +8 +2 +4 +2 +24 +12 +3 +2 +3 +5 +8 +3 +5 +4 +3 +14 +3 +5 +8 +2 +3 +7 +9 +4 +2 +3 +6 +8 +4 +3 +4 +6 +5 +3 +3 +6 +3 +19 +4 +4 +6 +3 +6 +3 +5 +22 +5 +4 +4 +3 +8 +11 +4 +9 +7 +6 +13 +4 +4 +4 +6 +17 +9 +3 +3 +3 +4 +3 +221 +5 +11 +3 +4 +2 +12 +6 +3 +5 +7 +5 +7 +4 +9 +7 +14 +37 +19 +217 +16 +3 +5 +2 +2 +7 +19 +7 +6 +7 +4 +24 +5 +11 +4 +7 +7 +9 +13 +3 +4 +3 +6 +28 +4 +4 +5 +5 +2 +5 +6 +4 +4 +6 +10 +5 +4 +3 +2 +3 +3 +6 +5 +5 +4 +3 +2 +3 +7 +4 +6 +18 +16 +8 +16 +4 +5 +8 +6 +9 +13 +1545 +6 +215 +6 +5 +6 +3 +45 +31 +5 +2 +2 +4 +3 +3 +2 +5 +4 +3 +5 +7 +7 +4 +5 +8 +5 +4 +749 +2 +31 +9 +11 +2 +11 +5 +4 +4 +7 +9 +11 +4 +5 +4 +7 +3 +4 +6 +2 +15 +3 +4 +3 +4 +3 +5 +2 +13 +5 +5 +3 +3 +23 +4 +4 +5 +7 +4 +13 +2 +4 +3 +4 +2 +6 +2 +7 +3 +5 +5 +3 +29 +5 +4 +4 +3 +10 +2 +3 +79 +16 +6 +6 +7 +7 +3 +5 +5 +7 +4 +3 +7 +9 +5 +6 +5 +9 +6 +3 +6 +4 +17 +2 +10 +9 +3 +6 +2 +3 +21 +22 +5 +11 +4 +2 +17 +2 +224 +2 +14 +3 +4 +4 +2 +4 +4 +4 +4 +5 +3 +4 +4 +10 +2 +6 +3 +3 +5 +7 +2 +7 +5 +6 +3 +218 +2 +2 +5 +2 +6 +3 +5 +222 +14 +6 +33 +3 +2 +5 +3 +3 +3 +9 +5 +3 +3 +2 +7 +4 +3 +4 +3 +5 +6 +5 +26 +4 +13 +9 +7 +3 +221 +3 +3 +4 +4 +4 +4 +2 +18 +5 +3 +7 +9 +6 +8 +3 +10 +3 +11 +9 +5 +4 +17 +5 +5 +6 +6 +3 +2 +4 +12 +17 +6 +7 +218 +4 +2 +4 +10 +3 +5 +15 +3 +9 +4 +3 +3 +6 +29 +3 +3 +4 +5 +5 +3 +8 +5 +6 +6 +7 +5 +3 +5 +3 +29 +2 +31 +5 +15 +24 +16 +5 +207 +4 +3 +3 +2 +15 +4 +4 +13 +5 +5 +4 +6 +10 +2 +7 +8 +4 +6 +20 +5 +3 +4 +3 +12 +12 +5 +17 +7 +3 +3 +3 +6 +10 +3 +5 +25 +80 +4 +9 +3 +2 +11 +3 +3 +2 +3 +8 +7 +5 +5 +19 +5 +3 +3 +12 +11 +2 +6 +5 +5 +5 +3 +3 +3 +4 +209 +14 +3 +2 +5 +19 +4 +4 +3 +4 +14 +5 +6 +4 +13 +9 +7 +4 +7 +10 +2 +9 +5 +7 +2 +8 +4 +6 +5 +5 +222 +8 +7 +12 +5 +216 +3 +4 +4 +6 +3 +14 +8 +7 +13 +4 +3 +3 +3 +3 +17 +5 +4 +3 +33 +6 +6 +33 +7 +5 +3 +8 +7 +5 +2 +9 +4 +2 +233 +24 +7 +4 +8 +10 +3 +4 +15 +2 +16 +3 +3 +13 +12 +7 +5 +4 +207 +4 +2 +4 +27 +15 +2 +5 +2 +25 +6 +5 +5 +6 +13 +6 +18 +6 +4 +12 +225 +10 +7 +5 +2 +2 +11 +4 +14 +21 +8 +10 +3 +5 +4 +232 +2 +5 +5 +3 +7 +17 +11 +6 +6 +23 +4 +6 +3 +5 +4 +2 +17 +3 +6 +5 +8 +3 +2 +2 +14 +9 +4 +4 +2 +5 +5 +3 +7 +6 +12 +6 +10 +3 +6 +2 +2 +19 +5 +4 +4 +9 +2 +4 +13 +3 +5 +6 +3 +6 +5 +4 +9 +6 +3 +5 +7 +3 +6 +6 +4 +3 +10 +6 +3 +221 +3 +5 +3 +6 +4 +8 +5 +3 +6 +4 +4 +2 +54 +5 +6 +11 +3 +3 +4 +4 +4 +3 +7 +3 +11 +11 +7 +10 +6 +13 +223 +213 +15 +231 +7 +3 +7 +228 +2 +3 +4 +4 +5 +6 +7 +4 +13 +3 +4 +5 +3 +6 +4 +6 +7 +2 +4 +3 +4 +3 +3 +6 +3 +7 +3 +5 +18 +5 +6 +8 +10 +3 +3 +3 +2 +4 +2 +4 +4 +5 +6 +6 +4 +10 +13 +3 +12 +5 +12 +16 +8 +4 +19 +11 +2 +4 +5 +6 +8 +5 +6 +4 +18 +10 +4 +2 +216 +6 +6 +6 +2 +4 +12 +8 +3 +11 +5 +6 +14 +5 +3 +13 +4 +5 +4 +5 +3 +28 +6 +3 +7 +219 +3 +9 +7 +3 +10 +6 +3 +4 +19 +5 +7 +11 +6 +15 +19 +4 +13 +11 +3 +7 +5 +10 +2 +8 +11 +2 +6 +4 +6 +24 +6 +3 +3 +3 +3 +6 +18 +4 +11 +4 +2 +5 +10 +8 +3 +9 +5 +3 +4 +5 +6 +2 +5 +7 +4 +4 +14 +6 +4 +4 +5 +5 +7 +2 +4 +3 +7 +3 +3 +6 +4 +5 +4 +4 +4 +3 +3 +3 +3 +8 +14 +2 +3 +5 +3 +2 +4 +5 +3 +7 +3 +3 +18 +3 +4 +4 +5 +7 +3 +3 +3 +13 +5 +4 +8 +211 +5 +5 +3 +5 +2 +5 +4 +2 +655 +6 +3 +5 +11 +2 +5 +3 +12 +9 +15 +11 +5 +12 +217 +2 +6 +17 +3 +3 +207 +5 +5 +4 +5 +9 +3 +2 +8 +5 +4 +3 +2 +5 +12 +4 +14 +5 +4 +2 +13 +5 +8 +4 +225 +4 +3 +4 +5 +4 +3 +3 +6 +23 +9 +2 +6 +7 +233 +4 +4 +6 +18 +3 +4 +6 +3 +4 +4 +2 +3 +7 +4 +13 +227 +4 +3 +5 +4 +2 +12 +9 +17 +3 +7 +14 +6 +4 +5 +21 +4 +8 +9 +2 +9 +25 +16 +3 +6 +4 +7 +8 +5 +2 +3 +5 +4 +3 +3 +5 +3 +3 +3 +2 +3 +19 +2 +4 +3 +4 +2 +3 +4 +4 +2 +4 +3 +3 +3 +2 +6 +3 +17 +5 +6 +4 +3 +13 +5 +3 +3 +3 +4 +9 +4 +2 +14 +12 +4 +5 +24 +4 +3 +37 +12 +11 +21 +3 +4 +3 +13 +4 +2 +3 +15 +4 +11 +4 +4 +3 +8 +3 +4 +4 +12 +8 +5 +3 +3 +4 +2 +220 +3 +5 +223 +3 +3 +3 +10 +3 +15 +4 +241 +9 +7 +3 +6 +6 +23 +4 +13 +7 +3 +4 +7 +4 +9 +3 +3 +4 +10 +5 +5 +1 +5 +24 +2 +4 +5 +5 +6 +14 +3 +8 +2 +3 +5 +13 +13 +3 +5 +2 +3 +15 +3 +4 +2 +10 +4 +4 +4 +5 +5 +3 +5 +3 +4 +7 +4 +27 +3 +6 +4 +15 +3 +5 +6 +6 +5 +4 +8 +3 +9 +2 +6 +3 +4 +3 +7 +4 +18 +3 +11 +3 +3 +8 +9 +7 +24 +3 +219 +7 +10 +4 +5 +9 +12 +2 +5 +4 +4 +4 +3 +3 +19 +5 +8 +16 +8 +6 +22 +3 +23 +3 +242 +9 +4 +3 +3 +5 +7 +3 +3 +5 +8 +3 +7 +5 +14 +8 +10 +3 +4 +3 +7 +4 +6 +7 +4 +10 +4 +3 +11 +3 +7 +10 +3 +13 +6 +8 +12 +10 +5 +7 +9 +3 +4 +7 +7 +10 +8 +30 +9 +19 +4 +3 +19 +15 +4 +13 +3 +215 +223 +4 +7 +4 +8 +17 +16 +3 +7 +6 +5 +5 +4 +12 +3 +7 +4 +4 +13 +4 +5 +2 +5 +6 +5 +6 +6 +7 +10 +18 +23 +9 +3 +3 +6 +5 +2 +4 +2 +7 +3 +3 +2 +5 +5 +14 +10 +224 +6 +3 +4 +3 +7 +5 +9 +3 +6 +4 +2 +5 +11 +4 +3 +3 +2 +8 +4 +7 +4 +10 +7 +3 +3 +18 +18 +17 +3 +3 +3 +4 +5 +3 +3 +4 +12 +7 +3 +11 +13 +5 +4 +7 +13 +5 +4 +11 +3 +12 +3 +6 +4 +4 +21 +4 +6 +9 +5 +3 +10 +8 +4 +6 +4 +4 +6 +5 +4 +8 +6 +4 +6 +4 +4 +5 +9 +6 +3 +4 +2 +9 +3 +18 +2 +4 +3 +13 +3 +6 +6 +8 +7 +9 +3 +2 +16 +3 +4 +6 +3 +2 +33 +22 +14 +4 +9 +12 +4 +5 +6 +3 +23 +9 +4 +3 +5 +5 +3 +4 +5 +3 +5 +3 +10 +4 +5 +5 +8 +4 +4 +6 +8 +5 +4 +3 +4 +6 +3 +3 +3 +5 +9 +12 +6 +5 +9 +3 +5 +3 +2 +2 +2 +18 +3 +2 +21 +2 +5 +4 +6 +4 +5 +10 +3 +9 +3 +2 +10 +7 +3 +6 +6 +4 +4 +8 +12 +7 +3 +7 +3 +3 +9 +3 +4 +5 +4 +4 +5 +5 +10 +15 +4 +4 +14 +6 +227 +3 +14 +5 +216 +22 +5 +4 +2 +2 +6 +3 +4 +2 +9 +9 +4 +3 +28 +13 +11 +4 +5 +3 +3 +2 +3 +3 +5 +3 +4 +3 +5 +23 +26 +3 +4 +5 +6 +4 +6 +3 +5 +5 +3 +4 +3 +2 +2 +2 +7 +14 +3 +6 +7 +17 +2 +2 +15 +14 +16 +4 +6 +7 +13 +6 +4 +5 +6 +16 +3 +3 +28 +3 +6 +15 +3 +9 +2 +4 +6 +3 +3 +22 +4 +12 +6 +7 +2 +5 +4 +10 +3 +16 +6 +9 +2 +5 +12 +7 +5 +5 +5 +5 +2 +11 +9 +17 +4 +3 +11 +7 +3 +5 +15 +4 +3 +4 +211 +8 +7 +5 +4 +7 +6 +7 +6 +3 +6 +5 +6 +5 +3 +4 +4 +26 +4 +6 +10 +4 +4 +3 +2 +3 +3 +4 +5 +9 +3 +9 +4 +4 +5 +5 +8 +2 +4 +2 +3 +8 +4 +11 +19 +5 +8 +6 +3 +5 +6 +12 +3 +2 +4 +16 +12 +3 +4 +4 +8 +6 +5 +6 +6 +219 +8 +222 +6 +16 +3 +13 +19 +5 +4 +3 +11 +6 +10 +4 +7 +7 +12 +5 +3 +3 +5 +6 +10 +3 +8 +2 +5 +4 +7 +2 +4 +4 +2 +12 +9 +6 +4 +2 +40 +2 +4 +10 +4 +223 +4 +2 +20 +6 +7 +24 +5 +4 +5 +2 +20 +16 +6 +5 +13 +2 +3 +3 +19 +3 +2 +4 +5 +6 +7 +11 +12 +5 +6 +7 +7 +3 +5 +3 +5 +3 +14 +3 +4 +4 +2 +11 +1 +7 +3 +9 +6 +11 +12 +5 +8 +6 +221 +4 +2 +12 +4 +3 +15 +4 +5 +226 +7 +218 +7 +5 +4 +5 +18 +4 +5 +9 +4 +4 +2 +9 +18 +18 +9 +5 +6 +6 +3 +3 +7 +3 +5 +4 +4 +4 +12 +3 +6 +31 +5 +4 +7 +3 +6 +5 +6 +5 +11 +2 +2 +11 +11 +6 +7 +5 +8 +7 +10 +5 +23 +7 +4 +3 +5 +34 +2 +5 +23 +7 +3 +6 +8 +4 +4 +4 +2 +5 +3 +8 +5 +4 +8 +25 +2 +3 +17 +8 +3 +4 +8 +7 +3 +15 +6 +5 +7 +21 +9 +5 +6 +6 +5 +3 +2 +3 +10 +3 +6 +3 +14 +7 +4 +4 +8 +7 +8 +2 +6 +12 +4 +213 +6 +5 +21 +8 +2 +5 +23 +3 +11 +2 +3 +6 +25 +2 +3 +6 +7 +6 +6 +4 +4 +6 +3 +17 +9 +7 +6 +4 +3 +10 +7 +2 +3 +3 +3 +11 +8 +3 +7 +6 +4 +14 +36 +3 +4 +3 +3 +22 +13 +21 +4 +2 +7 +4 +4 +17 +15 +3 +7 +11 +2 +4 +7 +6 +209 +6 +3 +2 +2 +24 +4 +9 +4 +3 +3 +3 +29 +2 +2 +4 +3 +3 +5 +4 +6 +3 +3 +2 +4 diff --git a/api/vendor/github.com/beorn7/perks/quantile/stream.go b/api/vendor/github.com/beorn7/perks/quantile/stream.go new file mode 100644 index 0000000..d7d14f8 --- /dev/null +++ b/api/vendor/github.com/beorn7/perks/quantile/stream.go @@ -0,0 +1,316 @@ +// Package quantile computes approximate quantiles over an unbounded data +// stream within low memory and CPU bounds. +// +// A small amount of accuracy is traded to achieve the above properties. +// +// Multiple streams can be merged before calling Query to generate a single set +// of results. This is meaningful when the streams represent the same type of +// data. See Merge and Samples. +// +// For more detailed information about the algorithm used, see: +// +// Effective Computation of Biased Quantiles over Data Streams +// +// http://www.cs.rutgers.edu/~muthu/bquant.pdf +package quantile + +import ( + "math" + "sort" +) + +// Sample holds an observed value and meta information for compression. JSON +// tags have been added for convenience. +type Sample struct { + Value float64 `json:",string"` + Width float64 `json:",string"` + Delta float64 `json:",string"` +} + +// Samples represents a slice of samples. It implements sort.Interface. +type Samples []Sample + +func (a Samples) Len() int { return len(a) } +func (a Samples) Less(i, j int) bool { return a[i].Value < a[j].Value } +func (a Samples) Swap(i, j int) { a[i], a[j] = a[j], a[i] } + +type invariant func(s *stream, r float64) float64 + +// NewLowBiased returns an initialized Stream for low-biased quantiles +// (e.g. 0.01, 0.1, 0.5) where the needed quantiles are not known a priori, but +// error guarantees can still be given even for the lower ranks of the data +// distribution. +// +// The provided epsilon is a relative error, i.e. the true quantile of a value +// returned by a query is guaranteed to be within (1±Epsilon)*Quantile. +// +// See http://www.cs.rutgers.edu/~muthu/bquant.pdf for time, space, and error +// properties. +func NewLowBiased(epsilon float64) *Stream { + ƒ := func(s *stream, r float64) float64 { + return 2 * epsilon * r + } + return newStream(ƒ) +} + +// NewHighBiased returns an initialized Stream for high-biased quantiles +// (e.g. 0.01, 0.1, 0.5) where the needed quantiles are not known a priori, but +// error guarantees can still be given even for the higher ranks of the data +// distribution. +// +// The provided epsilon is a relative error, i.e. the true quantile of a value +// returned by a query is guaranteed to be within 1-(1±Epsilon)*(1-Quantile). +// +// See http://www.cs.rutgers.edu/~muthu/bquant.pdf for time, space, and error +// properties. +func NewHighBiased(epsilon float64) *Stream { + ƒ := func(s *stream, r float64) float64 { + return 2 * epsilon * (s.n - r) + } + return newStream(ƒ) +} + +// NewTargeted returns an initialized Stream concerned with a particular set of +// quantile values that are supplied a priori. Knowing these a priori reduces +// space and computation time. The targets map maps the desired quantiles to +// their absolute errors, i.e. the true quantile of a value returned by a query +// is guaranteed to be within (Quantile±Epsilon). +// +// See http://www.cs.rutgers.edu/~muthu/bquant.pdf for time, space, and error properties. +func NewTargeted(targetMap map[float64]float64) *Stream { + // Convert map to slice to avoid slow iterations on a map. + // ƒ is called on the hot path, so converting the map to a slice + // beforehand results in significant CPU savings. + targets := targetMapToSlice(targetMap) + + ƒ := func(s *stream, r float64) float64 { + var m = math.MaxFloat64 + var f float64 + for _, t := range targets { + if t.quantile*s.n <= r { + f = (2 * t.epsilon * r) / t.quantile + } else { + f = (2 * t.epsilon * (s.n - r)) / (1 - t.quantile) + } + if f < m { + m = f + } + } + return m + } + return newStream(ƒ) +} + +type target struct { + quantile float64 + epsilon float64 +} + +func targetMapToSlice(targetMap map[float64]float64) []target { + targets := make([]target, 0, len(targetMap)) + + for quantile, epsilon := range targetMap { + t := target{ + quantile: quantile, + epsilon: epsilon, + } + targets = append(targets, t) + } + + return targets +} + +// Stream computes quantiles for a stream of float64s. It is not thread-safe by +// design. Take care when using across multiple goroutines. +type Stream struct { + *stream + b Samples + sorted bool +} + +func newStream(ƒ invariant) *Stream { + x := &stream{ƒ: ƒ} + return &Stream{x, make(Samples, 0, 500), true} +} + +// Insert inserts v into the stream. +func (s *Stream) Insert(v float64) { + s.insert(Sample{Value: v, Width: 1}) +} + +func (s *Stream) insert(sample Sample) { + s.b = append(s.b, sample) + s.sorted = false + if len(s.b) == cap(s.b) { + s.flush() + } +} + +// Query returns the computed qth percentiles value. If s was created with +// NewTargeted, and q is not in the set of quantiles provided a priori, Query +// will return an unspecified result. +func (s *Stream) Query(q float64) float64 { + if !s.flushed() { + // Fast path when there hasn't been enough data for a flush; + // this also yields better accuracy for small sets of data. + l := len(s.b) + if l == 0 { + return 0 + } + i := int(math.Ceil(float64(l) * q)) + if i > 0 { + i -= 1 + } + s.maybeSort() + return s.b[i].Value + } + s.flush() + return s.stream.query(q) +} + +// Merge merges samples into the underlying streams samples. This is handy when +// merging multiple streams from separate threads, database shards, etc. +// +// ATTENTION: This method is broken and does not yield correct results. The +// underlying algorithm is not capable of merging streams correctly. +func (s *Stream) Merge(samples Samples) { + sort.Sort(samples) + s.stream.merge(samples) +} + +// Reset reinitializes and clears the list reusing the samples buffer memory. +func (s *Stream) Reset() { + s.stream.reset() + s.b = s.b[:0] +} + +// Samples returns stream samples held by s. +func (s *Stream) Samples() Samples { + if !s.flushed() { + return s.b + } + s.flush() + return s.stream.samples() +} + +// Count returns the total number of samples observed in the stream +// since initialization. +func (s *Stream) Count() int { + return len(s.b) + s.stream.count() +} + +func (s *Stream) flush() { + s.maybeSort() + s.stream.merge(s.b) + s.b = s.b[:0] +} + +func (s *Stream) maybeSort() { + if !s.sorted { + s.sorted = true + sort.Sort(s.b) + } +} + +func (s *Stream) flushed() bool { + return len(s.stream.l) > 0 +} + +type stream struct { + n float64 + l []Sample + ƒ invariant +} + +func (s *stream) reset() { + s.l = s.l[:0] + s.n = 0 +} + +func (s *stream) insert(v float64) { + s.merge(Samples{{v, 1, 0}}) +} + +func (s *stream) merge(samples Samples) { + // TODO(beorn7): This tries to merge not only individual samples, but + // whole summaries. The paper doesn't mention merging summaries at + // all. Unittests show that the merging is inaccurate. Find out how to + // do merges properly. + var r float64 + i := 0 + for _, sample := range samples { + for ; i < len(s.l); i++ { + c := s.l[i] + if c.Value > sample.Value { + // Insert at position i. + s.l = append(s.l, Sample{}) + copy(s.l[i+1:], s.l[i:]) + s.l[i] = Sample{ + sample.Value, + sample.Width, + math.Max(sample.Delta, math.Floor(s.ƒ(s, r))-1), + // TODO(beorn7): How to calculate delta correctly? + } + i++ + goto inserted + } + r += c.Width + } + s.l = append(s.l, Sample{sample.Value, sample.Width, 0}) + i++ + inserted: + s.n += sample.Width + r += sample.Width + } + s.compress() +} + +func (s *stream) count() int { + return int(s.n) +} + +func (s *stream) query(q float64) float64 { + t := math.Ceil(q * s.n) + t += math.Ceil(s.ƒ(s, t) / 2) + p := s.l[0] + var r float64 + for _, c := range s.l[1:] { + r += p.Width + if r+c.Width+c.Delta > t { + return p.Value + } + p = c + } + return p.Value +} + +func (s *stream) compress() { + if len(s.l) < 2 { + return + } + x := s.l[len(s.l)-1] + xi := len(s.l) - 1 + r := s.n - 1 - x.Width + + for i := len(s.l) - 2; i >= 0; i-- { + c := s.l[i] + if c.Width+x.Width+x.Delta <= s.ƒ(s, r) { + x.Width += c.Width + s.l[xi] = x + // Remove element at i. + copy(s.l[i:], s.l[i+1:]) + s.l = s.l[:len(s.l)-1] + xi -= 1 + } else { + x = c + xi = i + } + r -= c.Width + } +} + +func (s *stream) samples() Samples { + samples := make(Samples, len(s.l)) + copy(samples, s.l) + return samples +} diff --git a/api/vendor/github.com/beorn7/perks/quantile/stream_test.go b/api/vendor/github.com/beorn7/perks/quantile/stream_test.go new file mode 100644 index 0000000..8551950 --- /dev/null +++ b/api/vendor/github.com/beorn7/perks/quantile/stream_test.go @@ -0,0 +1,215 @@ +package quantile + +import ( + "math" + "math/rand" + "sort" + "testing" +) + +var ( + Targets = map[float64]float64{ + 0.01: 0.001, + 0.10: 0.01, + 0.50: 0.05, + 0.90: 0.01, + 0.99: 0.001, + } + TargetsSmallEpsilon = map[float64]float64{ + 0.01: 0.0001, + 0.10: 0.001, + 0.50: 0.005, + 0.90: 0.001, + 0.99: 0.0001, + } + LowQuantiles = []float64{0.01, 0.1, 0.5} + HighQuantiles = []float64{0.99, 0.9, 0.5} +) + +const RelativeEpsilon = 0.01 + +func verifyPercsWithAbsoluteEpsilon(t *testing.T, a []float64, s *Stream) { + sort.Float64s(a) + for quantile, epsilon := range Targets { + n := float64(len(a)) + k := int(quantile * n) + if k < 1 { + k = 1 + } + lower := int((quantile - epsilon) * n) + if lower < 1 { + lower = 1 + } + upper := int(math.Ceil((quantile + epsilon) * n)) + if upper > len(a) { + upper = len(a) + } + w, min, max := a[k-1], a[lower-1], a[upper-1] + if g := s.Query(quantile); g < min || g > max { + t.Errorf("q=%f: want %v [%f,%f], got %v", quantile, w, min, max, g) + } + } +} + +func verifyLowPercsWithRelativeEpsilon(t *testing.T, a []float64, s *Stream) { + sort.Float64s(a) + for _, qu := range LowQuantiles { + n := float64(len(a)) + k := int(qu * n) + + lowerRank := int((1 - RelativeEpsilon) * qu * n) + upperRank := int(math.Ceil((1 + RelativeEpsilon) * qu * n)) + w, min, max := a[k-1], a[lowerRank-1], a[upperRank-1] + if g := s.Query(qu); g < min || g > max { + t.Errorf("q=%f: want %v [%f,%f], got %v", qu, w, min, max, g) + } + } +} + +func verifyHighPercsWithRelativeEpsilon(t *testing.T, a []float64, s *Stream) { + sort.Float64s(a) + for _, qu := range HighQuantiles { + n := float64(len(a)) + k := int(qu * n) + + lowerRank := int((1 - (1+RelativeEpsilon)*(1-qu)) * n) + upperRank := int(math.Ceil((1 - (1-RelativeEpsilon)*(1-qu)) * n)) + w, min, max := a[k-1], a[lowerRank-1], a[upperRank-1] + if g := s.Query(qu); g < min || g > max { + t.Errorf("q=%f: want %v [%f,%f], got %v", qu, w, min, max, g) + } + } +} + +func populateStream(s *Stream) []float64 { + a := make([]float64, 0, 1e5+100) + for i := 0; i < cap(a); i++ { + v := rand.NormFloat64() + // Add 5% asymmetric outliers. + if i%20 == 0 { + v = v*v + 1 + } + s.Insert(v) + a = append(a, v) + } + return a +} + +func TestTargetedQuery(t *testing.T) { + rand.Seed(42) + s := NewTargeted(Targets) + a := populateStream(s) + verifyPercsWithAbsoluteEpsilon(t, a, s) +} + +func TestTargetedQuerySmallSampleSize(t *testing.T) { + rand.Seed(42) + s := NewTargeted(TargetsSmallEpsilon) + a := []float64{1, 2, 3, 4, 5} + for _, v := range a { + s.Insert(v) + } + verifyPercsWithAbsoluteEpsilon(t, a, s) + // If not yet flushed, results should be precise: + if !s.flushed() { + for φ, want := range map[float64]float64{ + 0.01: 1, + 0.10: 1, + 0.50: 3, + 0.90: 5, + 0.99: 5, + } { + if got := s.Query(φ); got != want { + t.Errorf("want %f for φ=%f, got %f", want, φ, got) + } + } + } +} + +func TestLowBiasedQuery(t *testing.T) { + rand.Seed(42) + s := NewLowBiased(RelativeEpsilon) + a := populateStream(s) + verifyLowPercsWithRelativeEpsilon(t, a, s) +} + +func TestHighBiasedQuery(t *testing.T) { + rand.Seed(42) + s := NewHighBiased(RelativeEpsilon) + a := populateStream(s) + verifyHighPercsWithRelativeEpsilon(t, a, s) +} + +// BrokenTestTargetedMerge is broken, see Merge doc comment. +func BrokenTestTargetedMerge(t *testing.T) { + rand.Seed(42) + s1 := NewTargeted(Targets) + s2 := NewTargeted(Targets) + a := populateStream(s1) + a = append(a, populateStream(s2)...) + s1.Merge(s2.Samples()) + verifyPercsWithAbsoluteEpsilon(t, a, s1) +} + +// BrokenTestLowBiasedMerge is broken, see Merge doc comment. +func BrokenTestLowBiasedMerge(t *testing.T) { + rand.Seed(42) + s1 := NewLowBiased(RelativeEpsilon) + s2 := NewLowBiased(RelativeEpsilon) + a := populateStream(s1) + a = append(a, populateStream(s2)...) + s1.Merge(s2.Samples()) + verifyLowPercsWithRelativeEpsilon(t, a, s2) +} + +// BrokenTestHighBiasedMerge is broken, see Merge doc comment. +func BrokenTestHighBiasedMerge(t *testing.T) { + rand.Seed(42) + s1 := NewHighBiased(RelativeEpsilon) + s2 := NewHighBiased(RelativeEpsilon) + a := populateStream(s1) + a = append(a, populateStream(s2)...) + s1.Merge(s2.Samples()) + verifyHighPercsWithRelativeEpsilon(t, a, s2) +} + +func TestUncompressed(t *testing.T) { + q := NewTargeted(Targets) + for i := 100; i > 0; i-- { + q.Insert(float64(i)) + } + if g := q.Count(); g != 100 { + t.Errorf("want count 100, got %d", g) + } + // Before compression, Query should have 100% accuracy. + for quantile := range Targets { + w := quantile * 100 + if g := q.Query(quantile); g != w { + t.Errorf("want %f, got %f", w, g) + } + } +} + +func TestUncompressedSamples(t *testing.T) { + q := NewTargeted(map[float64]float64{0.99: 0.001}) + for i := 1; i <= 100; i++ { + q.Insert(float64(i)) + } + if g := q.Samples().Len(); g != 100 { + t.Errorf("want count 100, got %d", g) + } +} + +func TestUncompressedOne(t *testing.T) { + q := NewTargeted(map[float64]float64{0.99: 0.01}) + q.Insert(3.14) + if g := q.Query(0.90); g != 3.14 { + t.Error("want PI, got", g) + } +} + +func TestDefaults(t *testing.T) { + if g := NewTargeted(map[float64]float64{0.99: 0.001}).Query(0.99); g != 0 { + t.Errorf("want 0, got %f", g) + } +} diff --git a/api/vendor/github.com/beorn7/perks/topk/topk.go b/api/vendor/github.com/beorn7/perks/topk/topk.go new file mode 100644 index 0000000..5ac3d99 --- /dev/null +++ b/api/vendor/github.com/beorn7/perks/topk/topk.go @@ -0,0 +1,90 @@ +package topk + +import ( + "sort" +) + +// http://www.cs.ucsb.edu/research/tech_reports/reports/2005-23.pdf + +type Element struct { + Value string + Count int +} + +type Samples []*Element + +func (sm Samples) Len() int { + return len(sm) +} + +func (sm Samples) Less(i, j int) bool { + return sm[i].Count < sm[j].Count +} + +func (sm Samples) Swap(i, j int) { + sm[i], sm[j] = sm[j], sm[i] +} + +type Stream struct { + k int + mon map[string]*Element + + // the minimum Element + min *Element +} + +func New(k int) *Stream { + s := new(Stream) + s.k = k + s.mon = make(map[string]*Element) + s.min = &Element{} + + // Track k+1 so that less frequenet items contended for that spot, + // resulting in k being more accurate. + return s +} + +func (s *Stream) Insert(x string) { + s.insert(&Element{x, 1}) +} + +func (s *Stream) Merge(sm Samples) { + for _, e := range sm { + s.insert(e) + } +} + +func (s *Stream) insert(in *Element) { + e := s.mon[in.Value] + if e != nil { + e.Count++ + } else { + if len(s.mon) < s.k+1 { + e = &Element{in.Value, in.Count} + s.mon[in.Value] = e + } else { + e = s.min + delete(s.mon, e.Value) + e.Value = in.Value + e.Count += in.Count + s.min = e + } + } + if e.Count < s.min.Count { + s.min = e + } +} + +func (s *Stream) Query() Samples { + var sm Samples + for _, e := range s.mon { + sm = append(sm, e) + } + sort.Sort(sort.Reverse(sm)) + + if len(sm) < s.k { + return sm + } + + return sm[:s.k] +} diff --git a/api/vendor/github.com/beorn7/perks/topk/topk_test.go b/api/vendor/github.com/beorn7/perks/topk/topk_test.go new file mode 100644 index 0000000..c24f0f7 --- /dev/null +++ b/api/vendor/github.com/beorn7/perks/topk/topk_test.go @@ -0,0 +1,57 @@ +package topk + +import ( + "fmt" + "math/rand" + "sort" + "testing" +) + +func TestTopK(t *testing.T) { + stream := New(10) + ss := []*Stream{New(10), New(10), New(10)} + m := make(map[string]int) + for _, s := range ss { + for i := 0; i < 1e6; i++ { + v := fmt.Sprintf("%x", int8(rand.ExpFloat64())) + s.Insert(v) + m[v]++ + } + stream.Merge(s.Query()) + } + + var sm Samples + for x, s := range m { + sm = append(sm, &Element{x, s}) + } + sort.Sort(sort.Reverse(sm)) + + g := stream.Query() + if len(g) != 10 { + t.Fatalf("got %d, want 10", len(g)) + } + for i, e := range g { + if sm[i].Value != e.Value { + t.Errorf("at %d: want %q, got %q", i, sm[i].Value, e.Value) + } + } +} + +func TestQuery(t *testing.T) { + queryTests := []struct { + value string + expected int + }{ + {"a", 1}, + {"b", 2}, + {"c", 2}, + } + + stream := New(2) + for _, tt := range queryTests { + stream.Insert(tt.value) + if n := len(stream.Query()); n != tt.expected { + t.Errorf("want %d, got %d", tt.expected, n) + } + } +} diff --git a/api/vendor/github.com/cenkalti/backoff/.gitignore b/api/vendor/github.com/cenkalti/backoff/.gitignore new file mode 100644 index 0000000..0026861 --- /dev/null +++ b/api/vendor/github.com/cenkalti/backoff/.gitignore @@ -0,0 +1,22 @@ +# 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 diff --git a/api/vendor/github.com/cenkalti/backoff/.travis.yml b/api/vendor/github.com/cenkalti/backoff/.travis.yml new file mode 100644 index 0000000..d6f85ad --- /dev/null +++ b/api/vendor/github.com/cenkalti/backoff/.travis.yml @@ -0,0 +1,10 @@ +language: go +go: + - 1.3.3 + - 1.x + - tip +before_install: + - go get github.com/mattn/goveralls + - go get golang.org/x/tools/cmd/cover +script: + - $HOME/gopath/bin/goveralls -service=travis-ci diff --git a/api/vendor/github.com/cenkalti/backoff/LICENSE b/api/vendor/github.com/cenkalti/backoff/LICENSE new file mode 100644 index 0000000..89b8179 --- /dev/null +++ b/api/vendor/github.com/cenkalti/backoff/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2014 Cenk Altı + +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/api/vendor/github.com/cenkalti/backoff/README.md b/api/vendor/github.com/cenkalti/backoff/README.md new file mode 100644 index 0000000..13b347f --- /dev/null +++ b/api/vendor/github.com/cenkalti/backoff/README.md @@ -0,0 +1,30 @@ +# Exponential Backoff [![GoDoc][godoc image]][godoc] [![Build Status][travis image]][travis] [![Coverage Status][coveralls image]][coveralls] + +This is a Go port of the exponential backoff algorithm from [Google's HTTP Client Library for Java][google-http-java-client]. + +[Exponential backoff][exponential backoff wiki] +is an algorithm that uses feedback to multiplicatively decrease the rate of some process, +in order to gradually find an acceptable rate. +The retries exponentially increase and stop increasing when a certain threshold is met. + +## Usage + +See https://godoc.org/github.com/cenkalti/backoff#pkg-examples + +## Contributing + +* I would like to keep this library as small as possible. +* Please don't send a PR without opening an issue and discussing it first. +* If proposed change is not a common use case, I will probably not accept it. + +[godoc]: https://godoc.org/github.com/cenkalti/backoff +[godoc image]: https://godoc.org/github.com/cenkalti/backoff?status.png +[travis]: https://travis-ci.org/cenkalti/backoff +[travis image]: https://travis-ci.org/cenkalti/backoff.png?branch=master +[coveralls]: https://coveralls.io/github/cenkalti/backoff?branch=master +[coveralls image]: https://coveralls.io/repos/github/cenkalti/backoff/badge.svg?branch=master + +[google-http-java-client]: https://github.com/google/google-http-java-client +[exponential backoff wiki]: http://en.wikipedia.org/wiki/Exponential_backoff + +[advanced example]: https://godoc.org/github.com/cenkalti/backoff#example_ diff --git a/api/vendor/github.com/cenkalti/backoff/backoff.go b/api/vendor/github.com/cenkalti/backoff/backoff.go new file mode 100644 index 0000000..3676ee4 --- /dev/null +++ b/api/vendor/github.com/cenkalti/backoff/backoff.go @@ -0,0 +1,66 @@ +// Package backoff implements backoff algorithms for retrying operations. +// +// Use Retry function for retrying operations that may fail. +// If Retry does not meet your needs, +// copy/paste the function into your project and modify as you wish. +// +// There is also Ticker type similar to time.Ticker. +// You can use it if you need to work with channels. +// +// See Examples section below for usage examples. +package backoff + +import "time" + +// BackOff is a backoff policy for retrying an operation. +type BackOff interface { + // NextBackOff returns the duration to wait before retrying the operation, + // or backoff. Stop to indicate that no more retries should be made. + // + // Example usage: + // + // duration := backoff.NextBackOff(); + // if (duration == backoff.Stop) { + // // Do not retry operation. + // } else { + // // Sleep for duration and retry operation. + // } + // + NextBackOff() time.Duration + + // Reset to initial state. + Reset() +} + +// Stop indicates that no more retries should be made for use in NextBackOff(). +const Stop time.Duration = -1 + +// ZeroBackOff is a fixed backoff policy whose backoff time is always zero, +// meaning that the operation is retried immediately without waiting, indefinitely. +type ZeroBackOff struct{} + +func (b *ZeroBackOff) Reset() {} + +func (b *ZeroBackOff) NextBackOff() time.Duration { return 0 } + +// StopBackOff is a fixed backoff policy that always returns backoff.Stop for +// NextBackOff(), meaning that the operation should never be retried. +type StopBackOff struct{} + +func (b *StopBackOff) Reset() {} + +func (b *StopBackOff) NextBackOff() time.Duration { return Stop } + +// ConstantBackOff is a backoff policy that always returns the same backoff delay. +// This is in contrast to an exponential backoff policy, +// which returns a delay that grows longer as you call NextBackOff() over and over again. +type ConstantBackOff struct { + Interval time.Duration +} + +func (b *ConstantBackOff) Reset() {} +func (b *ConstantBackOff) NextBackOff() time.Duration { return b.Interval } + +func NewConstantBackOff(d time.Duration) *ConstantBackOff { + return &ConstantBackOff{Interval: d} +} diff --git a/api/vendor/github.com/cenkalti/backoff/backoff_test.go b/api/vendor/github.com/cenkalti/backoff/backoff_test.go new file mode 100644 index 0000000..91f27c4 --- /dev/null +++ b/api/vendor/github.com/cenkalti/backoff/backoff_test.go @@ -0,0 +1,27 @@ +package backoff + +import ( + "testing" + "time" +) + +func TestNextBackOffMillis(t *testing.T) { + subtestNextBackOff(t, 0, new(ZeroBackOff)) + subtestNextBackOff(t, Stop, new(StopBackOff)) +} + +func subtestNextBackOff(t *testing.T, expectedValue time.Duration, backOffPolicy BackOff) { + for i := 0; i < 10; i++ { + next := backOffPolicy.NextBackOff() + if next != expectedValue { + t.Errorf("got: %d expected: %d", next, expectedValue) + } + } +} + +func TestConstantBackOff(t *testing.T) { + backoff := NewConstantBackOff(time.Second) + if backoff.NextBackOff() != time.Second { + t.Error("invalid interval") + } +} diff --git a/api/vendor/github.com/cenkalti/backoff/context.go b/api/vendor/github.com/cenkalti/backoff/context.go new file mode 100644 index 0000000..5d15709 --- /dev/null +++ b/api/vendor/github.com/cenkalti/backoff/context.go @@ -0,0 +1,60 @@ +package backoff + +import ( + "time" + + "golang.org/x/net/context" +) + +// BackOffContext is a backoff policy that stops retrying after the context +// is canceled. +type BackOffContext interface { + BackOff + Context() context.Context +} + +type backOffContext struct { + BackOff + ctx context.Context +} + +// WithContext returns a BackOffContext with context ctx +// +// ctx must not be nil +func WithContext(b BackOff, ctx context.Context) BackOffContext { + if ctx == nil { + panic("nil context") + } + + if b, ok := b.(*backOffContext); ok { + return &backOffContext{ + BackOff: b.BackOff, + ctx: ctx, + } + } + + return &backOffContext{ + BackOff: b, + ctx: ctx, + } +} + +func ensureContext(b BackOff) BackOffContext { + if cb, ok := b.(BackOffContext); ok { + return cb + } + return WithContext(b, context.Background()) +} + +func (b *backOffContext) Context() context.Context { + return b.ctx +} + +func (b *backOffContext) NextBackOff() time.Duration { + select { + case <-b.Context().Done(): + return Stop + default: + return b.BackOff.NextBackOff() + } +} diff --git a/api/vendor/github.com/cenkalti/backoff/context_test.go b/api/vendor/github.com/cenkalti/backoff/context_test.go new file mode 100644 index 0000000..993fa61 --- /dev/null +++ b/api/vendor/github.com/cenkalti/backoff/context_test.go @@ -0,0 +1,26 @@ +package backoff + +import ( + "testing" + "time" + + "golang.org/x/net/context" +) + +func TestContext(t *testing.T) { + b := NewConstantBackOff(time.Millisecond) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + cb := WithContext(b, ctx) + + if cb.Context() != ctx { + t.Error("invalid context") + } + + cancel() + + if cb.NextBackOff() != Stop { + t.Error("invalid next back off") + } +} diff --git a/api/vendor/github.com/cenkalti/backoff/example_test.go b/api/vendor/github.com/cenkalti/backoff/example_test.go new file mode 100644 index 0000000..d97a8db --- /dev/null +++ b/api/vendor/github.com/cenkalti/backoff/example_test.go @@ -0,0 +1,73 @@ +package backoff + +import ( + "log" + + "golang.org/x/net/context" +) + +func ExampleRetry() { + // An operation that may fail. + operation := func() error { + return nil // or an error + } + + err := Retry(operation, NewExponentialBackOff()) + if err != nil { + // Handle error. + return + } + + // Operation is successful. +} + +func ExampleRetryContext() { + // A context + ctx := context.Background() + + // An operation that may fail. + operation := func() error { + return nil // or an error + } + + b := WithContext(NewExponentialBackOff(), ctx) + + err := Retry(operation, b) + if err != nil { + // Handle error. + return + } + + // Operation is successful. +} + +func ExampleTicker() { + // An operation that may fail. + operation := func() error { + return nil // or an error + } + + ticker := NewTicker(NewExponentialBackOff()) + + var err error + + // Ticks will continue to arrive when the previous operation is still running, + // so operations that take a while to fail could run in quick succession. + for _ = range ticker.C { + if err = operation(); err != nil { + log.Println(err, "will retry...") + continue + } + + ticker.Stop() + break + } + + if err != nil { + // Operation has failed. + return + } + + // Operation is successful. + return +} diff --git a/api/vendor/github.com/cenkalti/backoff/exponential.go b/api/vendor/github.com/cenkalti/backoff/exponential.go new file mode 100644 index 0000000..d9de15a --- /dev/null +++ b/api/vendor/github.com/cenkalti/backoff/exponential.go @@ -0,0 +1,158 @@ +package backoff + +import ( + "math/rand" + "time" +) + +/* +ExponentialBackOff is a backoff implementation that increases the backoff +period for each retry attempt using a randomization function that grows exponentially. + +NextBackOff() is calculated using the following formula: + + randomized interval = + RetryInterval * (random value in range [1 - RandomizationFactor, 1 + RandomizationFactor]) + +In other words NextBackOff() will range between the randomization factor +percentage below and above the retry interval. + +For example, given the following parameters: + + RetryInterval = 2 + RandomizationFactor = 0.5 + Multiplier = 2 + +the actual backoff period used in the next retry attempt will range between 1 and 3 seconds, +multiplied by the exponential, that is, between 2 and 6 seconds. + +Note: MaxInterval caps the RetryInterval and not the randomized interval. + +If the time elapsed since an ExponentialBackOff instance is created goes past the +MaxElapsedTime, then the method NextBackOff() starts returning backoff.Stop. + +The elapsed time can be reset by calling Reset(). + +Example: Given the following default arguments, for 10 tries the sequence will be, +and assuming we go over the MaxElapsedTime on the 10th try: + + Request # RetryInterval (seconds) Randomized Interval (seconds) + + 1 0.5 [0.25, 0.75] + 2 0.75 [0.375, 1.125] + 3 1.125 [0.562, 1.687] + 4 1.687 [0.8435, 2.53] + 5 2.53 [1.265, 3.795] + 6 3.795 [1.897, 5.692] + 7 5.692 [2.846, 8.538] + 8 8.538 [4.269, 12.807] + 9 12.807 [6.403, 19.210] + 10 19.210 backoff.Stop + +Note: Implementation is not thread-safe. +*/ +type ExponentialBackOff struct { + InitialInterval time.Duration + RandomizationFactor float64 + Multiplier float64 + MaxInterval time.Duration + // After MaxElapsedTime the ExponentialBackOff stops. + // It never stops if MaxElapsedTime == 0. + MaxElapsedTime time.Duration + Clock Clock + + currentInterval time.Duration + startTime time.Time + random *rand.Rand +} + +// Clock is an interface that returns current time for BackOff. +type Clock interface { + Now() time.Time +} + +// Default values for ExponentialBackOff. +const ( + DefaultInitialInterval = 500 * time.Millisecond + DefaultRandomizationFactor = 0.5 + DefaultMultiplier = 1.5 + DefaultMaxInterval = 60 * time.Second + DefaultMaxElapsedTime = 15 * time.Minute +) + +// NewExponentialBackOff creates an instance of ExponentialBackOff using default values. +func NewExponentialBackOff() *ExponentialBackOff { + b := &ExponentialBackOff{ + InitialInterval: DefaultInitialInterval, + RandomizationFactor: DefaultRandomizationFactor, + Multiplier: DefaultMultiplier, + MaxInterval: DefaultMaxInterval, + MaxElapsedTime: DefaultMaxElapsedTime, + Clock: SystemClock, + random: rand.New(rand.NewSource(time.Now().UnixNano())), + } + b.Reset() + return b +} + +type systemClock struct{} + +func (t systemClock) Now() time.Time { + return time.Now() +} + +// SystemClock implements Clock interface that uses time.Now(). +var SystemClock = systemClock{} + +// Reset the interval back to the initial retry interval and restarts the timer. +func (b *ExponentialBackOff) Reset() { + b.currentInterval = b.InitialInterval + b.startTime = b.Clock.Now() +} + +// NextBackOff calculates the next backoff interval using the formula: +// Randomized interval = RetryInterval +/- (RandomizationFactor * RetryInterval) +func (b *ExponentialBackOff) NextBackOff() time.Duration { + // Make sure we have not gone over the maximum elapsed time. + if b.MaxElapsedTime != 0 && b.GetElapsedTime() > b.MaxElapsedTime { + return Stop + } + defer b.incrementCurrentInterval() + if b.random == nil { + b.random = rand.New(rand.NewSource(time.Now().UnixNano())) + } + return getRandomValueFromInterval(b.RandomizationFactor, b.random.Float64(), b.currentInterval) +} + +// GetElapsedTime returns the elapsed time since an ExponentialBackOff instance +// is created and is reset when Reset() is called. +// +// The elapsed time is computed using time.Now().UnixNano(). It is +// safe to call even while the backoff policy is used by a running +// ticker. +func (b *ExponentialBackOff) GetElapsedTime() time.Duration { + return b.Clock.Now().Sub(b.startTime) +} + +// Increments the current interval by multiplying it with the multiplier. +func (b *ExponentialBackOff) incrementCurrentInterval() { + // Check for overflow, if overflow is detected set the current interval to the max interval. + if float64(b.currentInterval) >= float64(b.MaxInterval)/b.Multiplier { + b.currentInterval = b.MaxInterval + } else { + b.currentInterval = time.Duration(float64(b.currentInterval) * b.Multiplier) + } +} + +// Returns a random value from the following interval: +// [randomizationFactor * currentInterval, randomizationFactor * currentInterval]. +func getRandomValueFromInterval(randomizationFactor, random float64, currentInterval time.Duration) time.Duration { + var delta = randomizationFactor * float64(currentInterval) + var minInterval = float64(currentInterval) - delta + var maxInterval = float64(currentInterval) + delta + + // Get a random value from the range [minInterval, maxInterval]. + // The formula used below has a +1 because if the minInterval is 1 and the maxInterval is 3 then + // we want a 33% chance for selecting either 1, 2 or 3. + return time.Duration(minInterval + (random * (maxInterval - minInterval + 1))) +} diff --git a/api/vendor/github.com/cenkalti/backoff/exponential_test.go b/api/vendor/github.com/cenkalti/backoff/exponential_test.go new file mode 100644 index 0000000..11b95e4 --- /dev/null +++ b/api/vendor/github.com/cenkalti/backoff/exponential_test.go @@ -0,0 +1,108 @@ +package backoff + +import ( + "math" + "testing" + "time" +) + +func TestBackOff(t *testing.T) { + var ( + testInitialInterval = 500 * time.Millisecond + testRandomizationFactor = 0.1 + testMultiplier = 2.0 + testMaxInterval = 5 * time.Second + testMaxElapsedTime = 15 * time.Minute + ) + + exp := NewExponentialBackOff() + exp.InitialInterval = testInitialInterval + exp.RandomizationFactor = testRandomizationFactor + exp.Multiplier = testMultiplier + exp.MaxInterval = testMaxInterval + exp.MaxElapsedTime = testMaxElapsedTime + exp.Reset() + + var expectedResults = []time.Duration{500, 1000, 2000, 4000, 5000, 5000, 5000, 5000, 5000, 5000} + for i, d := range expectedResults { + expectedResults[i] = d * time.Millisecond + } + + for _, expected := range expectedResults { + assertEquals(t, expected, exp.currentInterval) + // Assert that the next backoff falls in the expected range. + var minInterval = expected - time.Duration(testRandomizationFactor*float64(expected)) + var maxInterval = expected + time.Duration(testRandomizationFactor*float64(expected)) + var actualInterval = exp.NextBackOff() + if !(minInterval <= actualInterval && actualInterval <= maxInterval) { + t.Error("error") + } + } +} + +func TestGetRandomizedInterval(t *testing.T) { + // 33% chance of being 1. + assertEquals(t, 1, getRandomValueFromInterval(0.5, 0, 2)) + assertEquals(t, 1, getRandomValueFromInterval(0.5, 0.33, 2)) + // 33% chance of being 2. + assertEquals(t, 2, getRandomValueFromInterval(0.5, 0.34, 2)) + assertEquals(t, 2, getRandomValueFromInterval(0.5, 0.66, 2)) + // 33% chance of being 3. + assertEquals(t, 3, getRandomValueFromInterval(0.5, 0.67, 2)) + assertEquals(t, 3, getRandomValueFromInterval(0.5, 0.99, 2)) +} + +type TestClock struct { + i time.Duration + start time.Time +} + +func (c *TestClock) Now() time.Time { + t := c.start.Add(c.i) + c.i += time.Second + return t +} + +func TestGetElapsedTime(t *testing.T) { + var exp = NewExponentialBackOff() + exp.Clock = &TestClock{} + exp.Reset() + + var elapsedTime = exp.GetElapsedTime() + if elapsedTime != time.Second { + t.Errorf("elapsedTime=%d", elapsedTime) + } +} + +func TestMaxElapsedTime(t *testing.T) { + var exp = NewExponentialBackOff() + exp.Clock = &TestClock{start: time.Time{}.Add(10000 * time.Second)} + // Change the currentElapsedTime to be 0 ensuring that the elapsed time will be greater + // than the max elapsed time. + exp.startTime = time.Time{} + assertEquals(t, Stop, exp.NextBackOff()) +} + +func TestBackOffOverflow(t *testing.T) { + var ( + testInitialInterval time.Duration = math.MaxInt64 / 2 + testMaxInterval time.Duration = math.MaxInt64 + testMultiplier = 2.1 + ) + + exp := NewExponentialBackOff() + exp.InitialInterval = testInitialInterval + exp.Multiplier = testMultiplier + exp.MaxInterval = testMaxInterval + exp.Reset() + + exp.NextBackOff() + // Assert that when an overflow is possible the current varerval time.Duration is set to the max varerval time.Duration . + assertEquals(t, testMaxInterval, exp.currentInterval) +} + +func assertEquals(t *testing.T, expected, value time.Duration) { + if expected != value { + t.Errorf("got: %d, expected: %d", value, expected) + } +} diff --git a/api/vendor/github.com/cenkalti/backoff/retry.go b/api/vendor/github.com/cenkalti/backoff/retry.go new file mode 100644 index 0000000..5dbd825 --- /dev/null +++ b/api/vendor/github.com/cenkalti/backoff/retry.go @@ -0,0 +1,78 @@ +package backoff + +import "time" + +// An Operation is executing by Retry() or RetryNotify(). +// The operation will be retried using a backoff policy if it returns an error. +type Operation func() error + +// Notify is a notify-on-error function. It receives an operation error and +// backoff delay if the operation failed (with an error). +// +// NOTE that if the backoff policy stated to stop retrying, +// the notify function isn't called. +type Notify func(error, time.Duration) + +// Retry the operation o until it does not return error or BackOff stops. +// o is guaranteed to be run at least once. +// It is the caller's responsibility to reset b after Retry returns. +// +// If o returns a *PermanentError, the operation is not retried, and the +// wrapped error is returned. +// +// Retry sleeps the goroutine for the duration returned by BackOff after a +// failed operation returns. +func Retry(o Operation, b BackOff) error { return RetryNotify(o, b, nil) } + +// RetryNotify calls notify function with the error and wait duration +// for each failed attempt before sleep. +func RetryNotify(operation Operation, b BackOff, notify Notify) error { + var err error + var next time.Duration + + cb := ensureContext(b) + + b.Reset() + for { + if err = operation(); err == nil { + return nil + } + + if permanent, ok := err.(*PermanentError); ok { + return permanent.Err + } + + if next = b.NextBackOff(); next == Stop { + return err + } + + if notify != nil { + notify(err, next) + } + + t := time.NewTimer(next) + + select { + case <-cb.Context().Done(): + t.Stop() + return err + case <-t.C: + } + } +} + +// PermanentError signals that the operation should not be retried. +type PermanentError struct { + Err error +} + +func (e *PermanentError) Error() string { + return e.Err.Error() +} + +// Permanent wraps the given err in a *PermanentError. +func Permanent(err error) *PermanentError { + return &PermanentError{ + Err: err, + } +} diff --git a/api/vendor/github.com/cenkalti/backoff/retry_test.go b/api/vendor/github.com/cenkalti/backoff/retry_test.go new file mode 100644 index 0000000..5af2888 --- /dev/null +++ b/api/vendor/github.com/cenkalti/backoff/retry_test.go @@ -0,0 +1,99 @@ +package backoff + +import ( + "errors" + "fmt" + "log" + "testing" + "time" + + "golang.org/x/net/context" +) + +func TestRetry(t *testing.T) { + const successOn = 3 + var i = 0 + + // This function is successful on "successOn" calls. + f := func() error { + i++ + log.Printf("function is called %d. time\n", i) + + if i == successOn { + log.Println("OK") + return nil + } + + log.Println("error") + return errors.New("error") + } + + err := Retry(f, NewExponentialBackOff()) + if err != nil { + t.Errorf("unexpected error: %s", err.Error()) + } + if i != successOn { + t.Errorf("invalid number of retries: %d", i) + } +} + +func TestRetryContext(t *testing.T) { + var cancelOn = 3 + var i = 0 + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + // This function cancels context on "cancelOn" calls. + f := func() error { + i++ + log.Printf("function is called %d. time\n", i) + + // cancelling the context in the operation function is not a typical + // use-case, however it allows to get predictable test results. + if i == cancelOn { + cancel() + } + + log.Println("error") + return fmt.Errorf("error (%d)", i) + } + + err := Retry(f, WithContext(NewConstantBackOff(time.Millisecond), ctx)) + if err == nil { + t.Errorf("error is unexpectedly nil") + } + if err.Error() != "error (3)" { + t.Errorf("unexpected error: %s", err.Error()) + } + if i != cancelOn { + t.Errorf("invalid number of retries: %d", i) + } +} + +func TestRetryPermenent(t *testing.T) { + const permanentOn = 3 + var i = 0 + + // This function fails permanently after permanentOn tries + f := func() error { + i++ + log.Printf("function is called %d. time\n", i) + + if i == permanentOn { + log.Println("permanent error") + return Permanent(errors.New("permanent error")) + } + + log.Println("error") + return errors.New("error") + } + + err := Retry(f, NewExponentialBackOff()) + if err == nil || err.Error() != "permanent error" { + t.Errorf("unexpected error: %s", err) + } + if i != permanentOn { + t.Errorf("invalid number of retries: %d", i) + } +} diff --git a/api/vendor/github.com/cenkalti/backoff/ticker.go b/api/vendor/github.com/cenkalti/backoff/ticker.go new file mode 100644 index 0000000..e742512 --- /dev/null +++ b/api/vendor/github.com/cenkalti/backoff/ticker.go @@ -0,0 +1,84 @@ +package backoff + +import ( + "runtime" + "sync" + "time" +) + +// Ticker holds a channel that delivers `ticks' of a clock at times reported by a BackOff. +// +// Ticks will continue to arrive when the previous operation is still running, +// so operations that take a while to fail could run in quick succession. +type Ticker struct { + C <-chan time.Time + c chan time.Time + b BackOffContext + stop chan struct{} + stopOnce sync.Once +} + +// NewTicker returns a new Ticker containing a channel that will send +// the time at times specified by the BackOff argument. Ticker is +// guaranteed to tick at least once. The channel is closed when Stop +// method is called or BackOff stops. It is not safe to manipulate the +// provided backoff policy (notably calling NextBackOff or Reset) +// while the ticker is running. +func NewTicker(b BackOff) *Ticker { + c := make(chan time.Time) + t := &Ticker{ + C: c, + c: c, + b: ensureContext(b), + stop: make(chan struct{}), + } + t.b.Reset() + go t.run() + runtime.SetFinalizer(t, (*Ticker).Stop) + return t +} + +// Stop turns off a ticker. After Stop, no more ticks will be sent. +func (t *Ticker) Stop() { + t.stopOnce.Do(func() { close(t.stop) }) +} + +func (t *Ticker) run() { + c := t.c + defer close(c) + + // Ticker is guaranteed to tick at least once. + afterC := t.send(time.Now()) + + for { + if afterC == nil { + return + } + + select { + case tick := <-afterC: + afterC = t.send(tick) + case <-t.stop: + t.c = nil // Prevent future ticks from being sent to the channel. + return + case <-t.b.Context().Done(): + return + } + } +} + +func (t *Ticker) send(tick time.Time) <-chan time.Time { + select { + case t.c <- tick: + case <-t.stop: + return nil + } + + next := t.b.NextBackOff() + if next == Stop { + t.Stop() + return nil + } + + return time.After(next) +} diff --git a/api/vendor/github.com/cenkalti/backoff/ticker_test.go b/api/vendor/github.com/cenkalti/backoff/ticker_test.go new file mode 100644 index 0000000..6aae254 --- /dev/null +++ b/api/vendor/github.com/cenkalti/backoff/ticker_test.go @@ -0,0 +1,98 @@ +package backoff + +import ( + "errors" + "fmt" + "log" + "testing" + "time" + + "golang.org/x/net/context" +) + +func TestTicker(t *testing.T) { + const successOn = 3 + var i = 0 + + // This function is successful on "successOn" calls. + f := func() error { + i++ + log.Printf("function is called %d. time\n", i) + + if i == successOn { + log.Println("OK") + return nil + } + + log.Println("error") + return errors.New("error") + } + + b := NewExponentialBackOff() + ticker := NewTicker(b) + elapsed := b.GetElapsedTime() + if elapsed > time.Second { + t.Errorf("elapsed time too large: %v", elapsed) + } + + var err error + for _ = range ticker.C { + if err = f(); err != nil { + t.Log(err) + continue + } + + break + } + if err != nil { + t.Errorf("unexpected error: %s", err.Error()) + } + if i != successOn { + t.Errorf("invalid number of retries: %d", i) + } +} + +func TestTickerContext(t *testing.T) { + const cancelOn = 3 + var i = 0 + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + // This function cancels context on "cancelOn" calls. + f := func() error { + i++ + log.Printf("function is called %d. time\n", i) + + // cancelling the context in the operation function is not a typical + // use-case, however it allows to get predictable test results. + if i == cancelOn { + cancel() + } + + log.Println("error") + return fmt.Errorf("error (%d)", i) + } + + b := WithContext(NewConstantBackOff(time.Millisecond), ctx) + ticker := NewTicker(b) + + var err error + for _ = range ticker.C { + if err = f(); err != nil { + t.Log(err) + continue + } + + break + } + if err == nil { + t.Errorf("error is unexpectedly nil") + } + if err.Error() != "error (3)" { + t.Errorf("unexpected error: %s", err.Error()) + } + if i != cancelOn { + t.Errorf("invalid number of retries: %d", i) + } +} diff --git a/api/vendor/github.com/cenkalti/backoff/tries.go b/api/vendor/github.com/cenkalti/backoff/tries.go new file mode 100644 index 0000000..cfeefd9 --- /dev/null +++ b/api/vendor/github.com/cenkalti/backoff/tries.go @@ -0,0 +1,35 @@ +package backoff + +import "time" + +/* +WithMaxRetries creates a wrapper around another BackOff, which will +return Stop if NextBackOff() has been called too many times since +the last time Reset() was called + +Note: Implementation is not thread-safe. +*/ +func WithMaxRetries(b BackOff, max uint64) BackOff { + return &backOffTries{delegate: b, maxTries: max} +} + +type backOffTries struct { + delegate BackOff + maxTries uint64 + numTries uint64 +} + +func (b *backOffTries) NextBackOff() time.Duration { + if b.maxTries > 0 { + if b.maxTries <= b.numTries { + return Stop + } + b.numTries++ + } + return b.delegate.NextBackOff() +} + +func (b *backOffTries) Reset() { + b.numTries = 0 + b.delegate.Reset() +} diff --git a/api/vendor/github.com/cenkalti/backoff/tries_test.go b/api/vendor/github.com/cenkalti/backoff/tries_test.go new file mode 100644 index 0000000..f83c130 --- /dev/null +++ b/api/vendor/github.com/cenkalti/backoff/tries_test.go @@ -0,0 +1,55 @@ +package backoff + +import ( + "math/rand" + "testing" + "time" +) + +func TestMaxTriesHappy(t *testing.T) { + r := rand.New(rand.NewSource(time.Now().UnixNano())) + max := 17 + r.Intn(13) + bo := WithMaxRetries(&ZeroBackOff{}, uint64(max)) + + // Load up the tries count, but reset should clear the record + for ix := 0; ix < max/2; ix++ { + bo.NextBackOff() + } + bo.Reset() + + // Now fill the tries count all the way up + for ix := 0; ix < max; ix++ { + d := bo.NextBackOff() + if d == Stop { + t.Errorf("returned Stop on try %d", ix) + } + } + + // We have now called the BackOff max number of times, we expect + // the next result to be Stop, even if we try it multiple times + for ix := 0; ix < 7; ix++ { + d := bo.NextBackOff() + if d != Stop { + t.Error("invalid next back off") + } + } + + // Reset makes it all work again + bo.Reset() + d := bo.NextBackOff() + if d == Stop { + t.Error("returned Stop after reset") + } + +} + +func TestMaxTriesZero(t *testing.T) { + // It might not make sense, but its okay to send a zero + bo := WithMaxRetries(&ZeroBackOff{}, uint64(0)) + for ix := 0; ix < 11; ix++ { + d := bo.NextBackOff() + if d == Stop { + t.Errorf("returned Stop on try %d", ix) + } + } +} diff --git a/api/vendor/github.com/davecgh/go-spew/.gitignore b/api/vendor/github.com/davecgh/go-spew/.gitignore new file mode 100644 index 0000000..0026861 --- /dev/null +++ b/api/vendor/github.com/davecgh/go-spew/.gitignore @@ -0,0 +1,22 @@ +# 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 diff --git a/api/vendor/github.com/davecgh/go-spew/.travis.yml b/api/vendor/github.com/davecgh/go-spew/.travis.yml new file mode 100644 index 0000000..984e073 --- /dev/null +++ b/api/vendor/github.com/davecgh/go-spew/.travis.yml @@ -0,0 +1,14 @@ +language: go +go: + - 1.5.4 + - 1.6.3 + - 1.7 +install: + - go get -v golang.org/x/tools/cmd/cover +script: + - go test -v -tags=safe ./spew + - go test -v -tags=testcgo ./spew -covermode=count -coverprofile=profile.cov +after_success: + - go get -v github.com/mattn/goveralls + - export PATH=$PATH:$HOME/gopath/bin + - goveralls -coverprofile=profile.cov -service=travis-ci diff --git a/api/vendor/github.com/davecgh/go-spew/LICENSE b/api/vendor/github.com/davecgh/go-spew/LICENSE new file mode 100644 index 0000000..c836416 --- /dev/null +++ b/api/vendor/github.com/davecgh/go-spew/LICENSE @@ -0,0 +1,15 @@ +ISC License + +Copyright (c) 2012-2016 Dave Collins + +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/api/vendor/github.com/davecgh/go-spew/README.md b/api/vendor/github.com/davecgh/go-spew/README.md new file mode 100644 index 0000000..2624304 --- /dev/null +++ b/api/vendor/github.com/davecgh/go-spew/README.md @@ -0,0 +1,205 @@ +go-spew +======= + +[![Build Status](https://img.shields.io/travis/davecgh/go-spew.svg)] +(https://travis-ci.org/davecgh/go-spew) [![ISC License] +(http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) [![Coverage Status] +(https://img.shields.io/coveralls/davecgh/go-spew.svg)] +(https://coveralls.io/r/davecgh/go-spew?branch=master) + + +Go-spew implements a deep pretty printer for Go data structures to aid in +debugging. A comprehensive suite of tests with 100% test coverage is provided +to ensure proper functionality. See `test_coverage.txt` for the gocov coverage +report. Go-spew is licensed under the liberal ISC license, so it may be used in +open source or commercial projects. + +If you're interested in reading about how this package came to life and some +of the challenges involved in providing a deep pretty printer, there is a blog +post about it +[here](https://web.archive.org/web/20160304013555/https://blog.cyphertite.com/go-spew-a-journey-into-dumping-go-data-structures/). + +## Documentation + +[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)] +(http://godoc.org/github.com/davecgh/go-spew/spew) + +Full `go doc` style documentation for the project can be viewed online without +installing this package by using the excellent GoDoc site here: +http://godoc.org/github.com/davecgh/go-spew/spew + +You can also view the documentation locally once the package is installed with +the `godoc` tool by running `godoc -http=":6060"` and pointing your browser to +http://localhost:6060/pkg/github.com/davecgh/go-spew/spew + +## Installation + +```bash +$ go get -u github.com/davecgh/go-spew/spew +``` + +## Quick Start + +Add this import line to the file you're working in: + +```Go +import "github.com/davecgh/go-spew/spew" +``` + +To dump a variable with full newlines, indentation, type, and pointer +information use Dump, Fdump, or Sdump: + +```Go +spew.Dump(myVar1, myVar2, ...) +spew.Fdump(someWriter, myVar1, myVar2, ...) +str := spew.Sdump(myVar1, myVar2, ...) +``` + +Alternatively, if you would prefer to use format strings with a compacted inline +printing style, use the convenience wrappers Printf, Fprintf, etc with %v (most +compact), %+v (adds pointer addresses), %#v (adds types), or %#+v (adds types +and pointer addresses): + +```Go +spew.Printf("myVar1: %v -- myVar2: %+v", myVar1, myVar2) +spew.Printf("myVar3: %#v -- myVar4: %#+v", myVar3, myVar4) +spew.Fprintf(someWriter, "myVar1: %v -- myVar2: %+v", myVar1, myVar2) +spew.Fprintf(someWriter, "myVar3: %#v -- myVar4: %#+v", myVar3, myVar4) +``` + +## Debugging a Web Application Example + +Here is an example of how you can use `spew.Sdump()` to help debug a web application. Please be sure to wrap your output using the `html.EscapeString()` function for safety reasons. You should also only use this debugging technique in a development environment, never in production. + +```Go +package main + +import ( + "fmt" + "html" + "net/http" + + "github.com/davecgh/go-spew/spew" +) + +func handler(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/html") + fmt.Fprintf(w, "Hi there, %s!", r.URL.Path[1:]) + fmt.Fprintf(w, "") +} + +func main() { + http.HandleFunc("/", handler) + http.ListenAndServe(":8080", nil) +} +``` + +## Sample Dump Output + +``` +(main.Foo) { + unexportedField: (*main.Bar)(0xf84002e210)({ + flag: (main.Flag) flagTwo, + data: (uintptr) + }), + ExportedField: (map[interface {}]interface {}) { + (string) "one": (bool) true + } +} +([]uint8) { + 00000000 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 |............... | + 00000010 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 |!"#$%&'()*+,-./0| + 00000020 31 32 |12| +} +``` + +## Sample Formatter Output + +Double pointer to a uint8: +``` + %v: <**>5 + %+v: <**>(0xf8400420d0->0xf8400420c8)5 + %#v: (**uint8)5 + %#+v: (**uint8)(0xf8400420d0->0xf8400420c8)5 +``` + +Pointer to circular struct with a uint8 field and a pointer to itself: +``` + %v: <*>{1 <*>} + %+v: <*>(0xf84003e260){ui8:1 c:<*>(0xf84003e260)} + %#v: (*main.circular){ui8:(uint8)1 c:(*main.circular)} + %#+v: (*main.circular)(0xf84003e260){ui8:(uint8)1 c:(*main.circular)(0xf84003e260)} +``` + +## Configuration Options + +Configuration of spew is handled by fields in the ConfigState type. For +convenience, all of the top-level functions use a global state available via the +spew.Config global. + +It is also possible to create a ConfigState instance that provides methods +equivalent to the top-level functions. This allows concurrent configuration +options. See the ConfigState documentation for more details. + +``` +* Indent + String to use for each indentation level for Dump functions. + It is a single space by default. A popular alternative is "\t". + +* MaxDepth + Maximum number of levels to descend into nested data structures. + There is no limit by default. + +* DisableMethods + Disables invocation of error and Stringer interface methods. + Method invocation is enabled by default. + +* DisablePointerMethods + Disables invocation of error and Stringer interface methods on types + which only accept pointer receivers from non-pointer variables. This option + relies on access to the unsafe package, so it will not have any effect when + running in environments without access to the unsafe package such as Google + App Engine or with the "safe" build tag specified. + Pointer method invocation is enabled by default. + +* DisablePointerAddresses + DisablePointerAddresses specifies whether to disable the printing of + pointer addresses. This is useful when diffing data structures in tests. + +* DisableCapacities + DisableCapacities specifies whether to disable the printing of capacities + for arrays, slices, maps and channels. This is useful when diffing data + structures in tests. + +* ContinueOnMethod + Enables recursion into types after invoking error and Stringer interface + methods. Recursion after method invocation is disabled by default. + +* SortKeys + Specifies map keys should be sorted before being printed. Use + this to have a more deterministic, diffable output. Note that + only native types (bool, int, uint, floats, uintptr and string) + and types which implement error or Stringer interfaces are supported, + with other types sorted according to the reflect.Value.String() output + which guarantees display stability. Natural map order is used by + default. + +* SpewKeys + SpewKeys specifies that, as a last resort attempt, map keys should be + spewed to strings and sorted by those strings. This is only considered + if SortKeys is true. + +``` + +## Unsafe Package Dependency + +This package relies on the unsafe package to perform some of the more advanced +features, however it also supports a "limited" mode which allows it to work in +environments where the unsafe package is not available. By default, it will +operate in this mode on Google App Engine and when compiled with GopherJS. The +"safe" build tag may also be specified to force the package to build without +using the unsafe package. + +## License + +Go-spew is licensed under the [copyfree](http://copyfree.org) ISC License. diff --git a/api/vendor/github.com/davecgh/go-spew/cov_report.sh b/api/vendor/github.com/davecgh/go-spew/cov_report.sh new file mode 100644 index 0000000..9579497 --- /dev/null +++ b/api/vendor/github.com/davecgh/go-spew/cov_report.sh @@ -0,0 +1,22 @@ +#!/bin/sh + +# This script uses gocov to generate a test coverage report. +# The gocov tool my be obtained with the following command: +# go get github.com/axw/gocov/gocov +# +# It will be installed to $GOPATH/bin, so ensure that location is in your $PATH. + +# Check for gocov. +if ! type gocov >/dev/null 2>&1; then + echo >&2 "This script requires the gocov tool." + echo >&2 "You may obtain it with the following command:" + echo >&2 "go get github.com/axw/gocov/gocov" + exit 1 +fi + +# Only run the cgo tests if gcc is installed. +if type gcc >/dev/null 2>&1; then + (cd spew && gocov test -tags testcgo | gocov report) +else + (cd spew && gocov test | gocov report) +fi diff --git a/api/vendor/github.com/davecgh/go-spew/spew/bypass.go b/api/vendor/github.com/davecgh/go-spew/spew/bypass.go new file mode 100644 index 0000000..8a4a658 --- /dev/null +++ b/api/vendor/github.com/davecgh/go-spew/spew/bypass.go @@ -0,0 +1,152 @@ +// Copyright (c) 2015-2016 Dave Collins +// +// 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. + +// NOTE: Due to the following build constraints, this file will only be compiled +// when the code is not running on Google App Engine, compiled by GopherJS, and +// "-tags safe" is not added to the go build command line. The "disableunsafe" +// tag is deprecated and thus should not be used. +// +build !js,!appengine,!safe,!disableunsafe + +package spew + +import ( + "reflect" + "unsafe" +) + +const ( + // UnsafeDisabled is a build-time constant which specifies whether or + // not access to the unsafe package is available. + UnsafeDisabled = false + + // ptrSize is the size of a pointer on the current arch. + ptrSize = unsafe.Sizeof((*byte)(nil)) +) + +var ( + // offsetPtr, offsetScalar, and offsetFlag are the offsets for the + // internal reflect.Value fields. These values are valid before golang + // commit ecccf07e7f9d which changed the format. The are also valid + // after commit 82f48826c6c7 which changed the format again to mirror + // the original format. Code in the init function updates these offsets + // as necessary. + offsetPtr = uintptr(ptrSize) + offsetScalar = uintptr(0) + offsetFlag = uintptr(ptrSize * 2) + + // flagKindWidth and flagKindShift indicate various bits that the + // reflect package uses internally to track kind information. + // + // flagRO indicates whether or not the value field of a reflect.Value is + // read-only. + // + // flagIndir indicates whether the value field of a reflect.Value is + // the actual data or a pointer to the data. + // + // These values are valid before golang commit 90a7c3c86944 which + // changed their positions. Code in the init function updates these + // flags as necessary. + flagKindWidth = uintptr(5) + flagKindShift = uintptr(flagKindWidth - 1) + flagRO = uintptr(1 << 0) + flagIndir = uintptr(1 << 1) +) + +func init() { + // Older versions of reflect.Value stored small integers directly in the + // ptr field (which is named val in the older versions). Versions + // between commits ecccf07e7f9d and 82f48826c6c7 added a new field named + // scalar for this purpose which unfortunately came before the flag + // field, so the offset of the flag field is different for those + // versions. + // + // This code constructs a new reflect.Value from a known small integer + // and checks if the size of the reflect.Value struct indicates it has + // the scalar field. When it does, the offsets are updated accordingly. + vv := reflect.ValueOf(0xf00) + if unsafe.Sizeof(vv) == (ptrSize * 4) { + offsetScalar = ptrSize * 2 + offsetFlag = ptrSize * 3 + } + + // Commit 90a7c3c86944 changed the flag positions such that the low + // order bits are the kind. This code extracts the kind from the flags + // field and ensures it's the correct type. When it's not, the flag + // order has been changed to the newer format, so the flags are updated + // accordingly. + upf := unsafe.Pointer(uintptr(unsafe.Pointer(&vv)) + offsetFlag) + upfv := *(*uintptr)(upf) + flagKindMask := uintptr((1<>flagKindShift != uintptr(reflect.Int) { + flagKindShift = 0 + flagRO = 1 << 5 + flagIndir = 1 << 6 + + // Commit adf9b30e5594 modified the flags to separate the + // flagRO flag into two bits which specifies whether or not the + // field is embedded. This causes flagIndir to move over a bit + // and means that flagRO is the combination of either of the + // original flagRO bit and the new bit. + // + // This code detects the change by extracting what used to be + // the indirect bit to ensure it's set. When it's not, the flag + // order has been changed to the newer format, so the flags are + // updated accordingly. + if upfv&flagIndir == 0 { + flagRO = 3 << 5 + flagIndir = 1 << 7 + } + } +} + +// unsafeReflectValue converts the passed reflect.Value into a one that bypasses +// the typical safety restrictions preventing access to unaddressable and +// unexported data. It works by digging the raw pointer to the underlying +// value out of the protected value and generating a new unprotected (unsafe) +// reflect.Value to it. +// +// This allows us to check for implementations of the Stringer and error +// interfaces to be used for pretty printing ordinarily unaddressable and +// inaccessible values such as unexported struct fields. +func unsafeReflectValue(v reflect.Value) (rv reflect.Value) { + indirects := 1 + vt := v.Type() + upv := unsafe.Pointer(uintptr(unsafe.Pointer(&v)) + offsetPtr) + rvf := *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&v)) + offsetFlag)) + if rvf&flagIndir != 0 { + vt = reflect.PtrTo(v.Type()) + indirects++ + } else if offsetScalar != 0 { + // The value is in the scalar field when it's not one of the + // reference types. + switch vt.Kind() { + case reflect.Uintptr: + case reflect.Chan: + case reflect.Func: + case reflect.Map: + case reflect.Ptr: + case reflect.UnsafePointer: + default: + upv = unsafe.Pointer(uintptr(unsafe.Pointer(&v)) + + offsetScalar) + } + } + + pv := reflect.NewAt(vt, upv) + rv = pv + for i := 0; i < indirects; i++ { + rv = rv.Elem() + } + return rv +} diff --git a/api/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go b/api/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go new file mode 100644 index 0000000..1fe3cf3 --- /dev/null +++ b/api/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go @@ -0,0 +1,38 @@ +// Copyright (c) 2015-2016 Dave Collins +// +// 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. + +// NOTE: Due to the following build constraints, this file will only be compiled +// when the code is running on Google App Engine, compiled by GopherJS, or +// "-tags safe" is added to the go build command line. The "disableunsafe" +// tag is deprecated and thus should not be used. +// +build js appengine safe disableunsafe + +package spew + +import "reflect" + +const ( + // UnsafeDisabled is a build-time constant which specifies whether or + // not access to the unsafe package is available. + UnsafeDisabled = true +) + +// unsafeReflectValue typically converts the passed reflect.Value into a one +// that bypasses the typical safety restrictions preventing access to +// unaddressable and unexported data. However, doing this relies on access to +// the unsafe package. This is a stub version which simply returns the passed +// reflect.Value when the unsafe package is not available. +func unsafeReflectValue(v reflect.Value) reflect.Value { + return v +} diff --git a/api/vendor/github.com/davecgh/go-spew/spew/common.go b/api/vendor/github.com/davecgh/go-spew/spew/common.go new file mode 100644 index 0000000..7c519ff --- /dev/null +++ b/api/vendor/github.com/davecgh/go-spew/spew/common.go @@ -0,0 +1,341 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * 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 spew + +import ( + "bytes" + "fmt" + "io" + "reflect" + "sort" + "strconv" +) + +// Some constants in the form of bytes to avoid string overhead. This mirrors +// the technique used in the fmt package. +var ( + panicBytes = []byte("(PANIC=") + plusBytes = []byte("+") + iBytes = []byte("i") + trueBytes = []byte("true") + falseBytes = []byte("false") + interfaceBytes = []byte("(interface {})") + commaNewlineBytes = []byte(",\n") + newlineBytes = []byte("\n") + openBraceBytes = []byte("{") + openBraceNewlineBytes = []byte("{\n") + closeBraceBytes = []byte("}") + asteriskBytes = []byte("*") + colonBytes = []byte(":") + colonSpaceBytes = []byte(": ") + openParenBytes = []byte("(") + closeParenBytes = []byte(")") + spaceBytes = []byte(" ") + pointerChainBytes = []byte("->") + nilAngleBytes = []byte("") + maxNewlineBytes = []byte("\n") + maxShortBytes = []byte("") + circularBytes = []byte("") + circularShortBytes = []byte("") + invalidAngleBytes = []byte("") + openBracketBytes = []byte("[") + closeBracketBytes = []byte("]") + percentBytes = []byte("%") + precisionBytes = []byte(".") + openAngleBytes = []byte("<") + closeAngleBytes = []byte(">") + openMapBytes = []byte("map[") + closeMapBytes = []byte("]") + lenEqualsBytes = []byte("len=") + capEqualsBytes = []byte("cap=") +) + +// hexDigits is used to map a decimal value to a hex digit. +var hexDigits = "0123456789abcdef" + +// catchPanic handles any panics that might occur during the handleMethods +// calls. +func catchPanic(w io.Writer, v reflect.Value) { + if err := recover(); err != nil { + w.Write(panicBytes) + fmt.Fprintf(w, "%v", err) + w.Write(closeParenBytes) + } +} + +// handleMethods attempts to call the Error and String methods on the underlying +// type the passed reflect.Value represents and outputes the result to Writer w. +// +// It handles panics in any called methods by catching and displaying the error +// as the formatted value. +func handleMethods(cs *ConfigState, w io.Writer, v reflect.Value) (handled bool) { + // We need an interface to check if the type implements the error or + // Stringer interface. However, the reflect package won't give us an + // interface on certain things like unexported struct fields in order + // to enforce visibility rules. We use unsafe, when it's available, + // to bypass these restrictions since this package does not mutate the + // values. + if !v.CanInterface() { + if UnsafeDisabled { + return false + } + + v = unsafeReflectValue(v) + } + + // Choose whether or not to do error and Stringer interface lookups against + // the base type or a pointer to the base type depending on settings. + // Technically calling one of these methods with a pointer receiver can + // mutate the value, however, types which choose to satisify an error or + // Stringer interface with a pointer receiver should not be mutating their + // state inside these interface methods. + if !cs.DisablePointerMethods && !UnsafeDisabled && !v.CanAddr() { + v = unsafeReflectValue(v) + } + if v.CanAddr() { + v = v.Addr() + } + + // Is it an error or Stringer? + switch iface := v.Interface().(type) { + case error: + defer catchPanic(w, v) + if cs.ContinueOnMethod { + w.Write(openParenBytes) + w.Write([]byte(iface.Error())) + w.Write(closeParenBytes) + w.Write(spaceBytes) + return false + } + + w.Write([]byte(iface.Error())) + return true + + case fmt.Stringer: + defer catchPanic(w, v) + if cs.ContinueOnMethod { + w.Write(openParenBytes) + w.Write([]byte(iface.String())) + w.Write(closeParenBytes) + w.Write(spaceBytes) + return false + } + w.Write([]byte(iface.String())) + return true + } + return false +} + +// printBool outputs a boolean value as true or false to Writer w. +func printBool(w io.Writer, val bool) { + if val { + w.Write(trueBytes) + } else { + w.Write(falseBytes) + } +} + +// printInt outputs a signed integer value to Writer w. +func printInt(w io.Writer, val int64, base int) { + w.Write([]byte(strconv.FormatInt(val, base))) +} + +// printUint outputs an unsigned integer value to Writer w. +func printUint(w io.Writer, val uint64, base int) { + w.Write([]byte(strconv.FormatUint(val, base))) +} + +// printFloat outputs a floating point value using the specified precision, +// which is expected to be 32 or 64bit, to Writer w. +func printFloat(w io.Writer, val float64, precision int) { + w.Write([]byte(strconv.FormatFloat(val, 'g', -1, precision))) +} + +// printComplex outputs a complex value using the specified float precision +// for the real and imaginary parts to Writer w. +func printComplex(w io.Writer, c complex128, floatPrecision int) { + r := real(c) + w.Write(openParenBytes) + w.Write([]byte(strconv.FormatFloat(r, 'g', -1, floatPrecision))) + i := imag(c) + if i >= 0 { + w.Write(plusBytes) + } + w.Write([]byte(strconv.FormatFloat(i, 'g', -1, floatPrecision))) + w.Write(iBytes) + w.Write(closeParenBytes) +} + +// printHexPtr outputs a uintptr formatted as hexidecimal with a leading '0x' +// prefix to Writer w. +func printHexPtr(w io.Writer, p uintptr) { + // Null pointer. + num := uint64(p) + if num == 0 { + w.Write(nilAngleBytes) + return + } + + // Max uint64 is 16 bytes in hex + 2 bytes for '0x' prefix + buf := make([]byte, 18) + + // It's simpler to construct the hex string right to left. + base := uint64(16) + i := len(buf) - 1 + for num >= base { + buf[i] = hexDigits[num%base] + num /= base + i-- + } + buf[i] = hexDigits[num] + + // Add '0x' prefix. + i-- + buf[i] = 'x' + i-- + buf[i] = '0' + + // Strip unused leading bytes. + buf = buf[i:] + w.Write(buf) +} + +// valuesSorter implements sort.Interface to allow a slice of reflect.Value +// elements to be sorted. +type valuesSorter struct { + values []reflect.Value + strings []string // either nil or same len and values + cs *ConfigState +} + +// newValuesSorter initializes a valuesSorter instance, which holds a set of +// surrogate keys on which the data should be sorted. It uses flags in +// ConfigState to decide if and how to populate those surrogate keys. +func newValuesSorter(values []reflect.Value, cs *ConfigState) sort.Interface { + vs := &valuesSorter{values: values, cs: cs} + if canSortSimply(vs.values[0].Kind()) { + return vs + } + if !cs.DisableMethods { + vs.strings = make([]string, len(values)) + for i := range vs.values { + b := bytes.Buffer{} + if !handleMethods(cs, &b, vs.values[i]) { + vs.strings = nil + break + } + vs.strings[i] = b.String() + } + } + if vs.strings == nil && cs.SpewKeys { + vs.strings = make([]string, len(values)) + for i := range vs.values { + vs.strings[i] = Sprintf("%#v", vs.values[i].Interface()) + } + } + return vs +} + +// canSortSimply tests whether a reflect.Kind is a primitive that can be sorted +// directly, or whether it should be considered for sorting by surrogate keys +// (if the ConfigState allows it). +func canSortSimply(kind reflect.Kind) bool { + // This switch parallels valueSortLess, except for the default case. + switch kind { + case reflect.Bool: + return true + case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int: + return true + case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: + return true + case reflect.Float32, reflect.Float64: + return true + case reflect.String: + return true + case reflect.Uintptr: + return true + case reflect.Array: + return true + } + return false +} + +// Len returns the number of values in the slice. It is part of the +// sort.Interface implementation. +func (s *valuesSorter) Len() int { + return len(s.values) +} + +// Swap swaps the values at the passed indices. It is part of the +// sort.Interface implementation. +func (s *valuesSorter) Swap(i, j int) { + s.values[i], s.values[j] = s.values[j], s.values[i] + if s.strings != nil { + s.strings[i], s.strings[j] = s.strings[j], s.strings[i] + } +} + +// valueSortLess returns whether the first value should sort before the second +// value. It is used by valueSorter.Less as part of the sort.Interface +// implementation. +func valueSortLess(a, b reflect.Value) bool { + switch a.Kind() { + case reflect.Bool: + return !a.Bool() && b.Bool() + case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int: + return a.Int() < b.Int() + case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: + return a.Uint() < b.Uint() + case reflect.Float32, reflect.Float64: + return a.Float() < b.Float() + case reflect.String: + return a.String() < b.String() + case reflect.Uintptr: + return a.Uint() < b.Uint() + case reflect.Array: + // Compare the contents of both arrays. + l := a.Len() + for i := 0; i < l; i++ { + av := a.Index(i) + bv := b.Index(i) + if av.Interface() == bv.Interface() { + continue + } + return valueSortLess(av, bv) + } + } + return a.String() < b.String() +} + +// Less returns whether the value at index i should sort before the +// value at index j. It is part of the sort.Interface implementation. +func (s *valuesSorter) Less(i, j int) bool { + if s.strings == nil { + return valueSortLess(s.values[i], s.values[j]) + } + return s.strings[i] < s.strings[j] +} + +// sortValues is a sort function that handles both native types and any type that +// can be converted to error or Stringer. Other inputs are sorted according to +// their Value.String() value to ensure display stability. +func sortValues(values []reflect.Value, cs *ConfigState) { + if len(values) == 0 { + return + } + sort.Sort(newValuesSorter(values, cs)) +} diff --git a/api/vendor/github.com/davecgh/go-spew/spew/common_test.go b/api/vendor/github.com/davecgh/go-spew/spew/common_test.go new file mode 100644 index 0000000..0f5ce47 --- /dev/null +++ b/api/vendor/github.com/davecgh/go-spew/spew/common_test.go @@ -0,0 +1,298 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * 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 spew_test + +import ( + "fmt" + "reflect" + "testing" + + "github.com/davecgh/go-spew/spew" +) + +// custom type to test Stinger interface on non-pointer receiver. +type stringer string + +// String implements the Stringer interface for testing invocation of custom +// stringers on types with non-pointer receivers. +func (s stringer) String() string { + return "stringer " + string(s) +} + +// custom type to test Stinger interface on pointer receiver. +type pstringer string + +// String implements the Stringer interface for testing invocation of custom +// stringers on types with only pointer receivers. +func (s *pstringer) String() string { + return "stringer " + string(*s) +} + +// xref1 and xref2 are cross referencing structs for testing circular reference +// detection. +type xref1 struct { + ps2 *xref2 +} +type xref2 struct { + ps1 *xref1 +} + +// indirCir1, indirCir2, and indirCir3 are used to generate an indirect circular +// reference for testing detection. +type indirCir1 struct { + ps2 *indirCir2 +} +type indirCir2 struct { + ps3 *indirCir3 +} +type indirCir3 struct { + ps1 *indirCir1 +} + +// embed is used to test embedded structures. +type embed struct { + a string +} + +// embedwrap is used to test embedded structures. +type embedwrap struct { + *embed + e *embed +} + +// panicer is used to intentionally cause a panic for testing spew properly +// handles them +type panicer int + +func (p panicer) String() string { + panic("test panic") +} + +// customError is used to test custom error interface invocation. +type customError int + +func (e customError) Error() string { + return fmt.Sprintf("error: %d", int(e)) +} + +// stringizeWants converts a slice of wanted test output into a format suitable +// for a test error message. +func stringizeWants(wants []string) string { + s := "" + for i, want := range wants { + if i > 0 { + s += fmt.Sprintf("want%d: %s", i+1, want) + } else { + s += "want: " + want + } + } + return s +} + +// testFailed returns whether or not a test failed by checking if the result +// of the test is in the slice of wanted strings. +func testFailed(result string, wants []string) bool { + for _, want := range wants { + if result == want { + return false + } + } + return true +} + +type sortableStruct struct { + x int +} + +func (ss sortableStruct) String() string { + return fmt.Sprintf("ss.%d", ss.x) +} + +type unsortableStruct struct { + x int +} + +type sortTestCase struct { + input []reflect.Value + expected []reflect.Value +} + +func helpTestSortValues(tests []sortTestCase, cs *spew.ConfigState, t *testing.T) { + getInterfaces := func(values []reflect.Value) []interface{} { + interfaces := []interface{}{} + for _, v := range values { + interfaces = append(interfaces, v.Interface()) + } + return interfaces + } + + for _, test := range tests { + spew.SortValues(test.input, cs) + // reflect.DeepEqual cannot really make sense of reflect.Value, + // probably because of all the pointer tricks. For instance, + // v(2.0) != v(2.0) on a 32-bits system. Turn them into interface{} + // instead. + input := getInterfaces(test.input) + expected := getInterfaces(test.expected) + if !reflect.DeepEqual(input, expected) { + t.Errorf("Sort mismatch:\n %v != %v", input, expected) + } + } +} + +// TestSortValues ensures the sort functionality for relect.Value based sorting +// works as intended. +func TestSortValues(t *testing.T) { + v := reflect.ValueOf + + a := v("a") + b := v("b") + c := v("c") + embedA := v(embed{"a"}) + embedB := v(embed{"b"}) + embedC := v(embed{"c"}) + tests := []sortTestCase{ + // No values. + { + []reflect.Value{}, + []reflect.Value{}, + }, + // Bools. + { + []reflect.Value{v(false), v(true), v(false)}, + []reflect.Value{v(false), v(false), v(true)}, + }, + // Ints. + { + []reflect.Value{v(2), v(1), v(3)}, + []reflect.Value{v(1), v(2), v(3)}, + }, + // Uints. + { + []reflect.Value{v(uint8(2)), v(uint8(1)), v(uint8(3))}, + []reflect.Value{v(uint8(1)), v(uint8(2)), v(uint8(3))}, + }, + // Floats. + { + []reflect.Value{v(2.0), v(1.0), v(3.0)}, + []reflect.Value{v(1.0), v(2.0), v(3.0)}, + }, + // Strings. + { + []reflect.Value{b, a, c}, + []reflect.Value{a, b, c}, + }, + // Array + { + []reflect.Value{v([3]int{3, 2, 1}), v([3]int{1, 3, 2}), v([3]int{1, 2, 3})}, + []reflect.Value{v([3]int{1, 2, 3}), v([3]int{1, 3, 2}), v([3]int{3, 2, 1})}, + }, + // Uintptrs. + { + []reflect.Value{v(uintptr(2)), v(uintptr(1)), v(uintptr(3))}, + []reflect.Value{v(uintptr(1)), v(uintptr(2)), v(uintptr(3))}, + }, + // SortableStructs. + { + // Note: not sorted - DisableMethods is set. + []reflect.Value{v(sortableStruct{2}), v(sortableStruct{1}), v(sortableStruct{3})}, + []reflect.Value{v(sortableStruct{2}), v(sortableStruct{1}), v(sortableStruct{3})}, + }, + // UnsortableStructs. + { + // Note: not sorted - SpewKeys is false. + []reflect.Value{v(unsortableStruct{2}), v(unsortableStruct{1}), v(unsortableStruct{3})}, + []reflect.Value{v(unsortableStruct{2}), v(unsortableStruct{1}), v(unsortableStruct{3})}, + }, + // Invalid. + { + []reflect.Value{embedB, embedA, embedC}, + []reflect.Value{embedB, embedA, embedC}, + }, + } + cs := spew.ConfigState{DisableMethods: true, SpewKeys: false} + helpTestSortValues(tests, &cs, t) +} + +// TestSortValuesWithMethods ensures the sort functionality for relect.Value +// based sorting works as intended when using string methods. +func TestSortValuesWithMethods(t *testing.T) { + v := reflect.ValueOf + + a := v("a") + b := v("b") + c := v("c") + tests := []sortTestCase{ + // Ints. + { + []reflect.Value{v(2), v(1), v(3)}, + []reflect.Value{v(1), v(2), v(3)}, + }, + // Strings. + { + []reflect.Value{b, a, c}, + []reflect.Value{a, b, c}, + }, + // SortableStructs. + { + []reflect.Value{v(sortableStruct{2}), v(sortableStruct{1}), v(sortableStruct{3})}, + []reflect.Value{v(sortableStruct{1}), v(sortableStruct{2}), v(sortableStruct{3})}, + }, + // UnsortableStructs. + { + // Note: not sorted - SpewKeys is false. + []reflect.Value{v(unsortableStruct{2}), v(unsortableStruct{1}), v(unsortableStruct{3})}, + []reflect.Value{v(unsortableStruct{2}), v(unsortableStruct{1}), v(unsortableStruct{3})}, + }, + } + cs := spew.ConfigState{DisableMethods: false, SpewKeys: false} + helpTestSortValues(tests, &cs, t) +} + +// TestSortValuesWithSpew ensures the sort functionality for relect.Value +// based sorting works as intended when using spew to stringify keys. +func TestSortValuesWithSpew(t *testing.T) { + v := reflect.ValueOf + + a := v("a") + b := v("b") + c := v("c") + tests := []sortTestCase{ + // Ints. + { + []reflect.Value{v(2), v(1), v(3)}, + []reflect.Value{v(1), v(2), v(3)}, + }, + // Strings. + { + []reflect.Value{b, a, c}, + []reflect.Value{a, b, c}, + }, + // SortableStructs. + { + []reflect.Value{v(sortableStruct{2}), v(sortableStruct{1}), v(sortableStruct{3})}, + []reflect.Value{v(sortableStruct{1}), v(sortableStruct{2}), v(sortableStruct{3})}, + }, + // UnsortableStructs. + { + []reflect.Value{v(unsortableStruct{2}), v(unsortableStruct{1}), v(unsortableStruct{3})}, + []reflect.Value{v(unsortableStruct{1}), v(unsortableStruct{2}), v(unsortableStruct{3})}, + }, + } + cs := spew.ConfigState{DisableMethods: true, SpewKeys: true} + helpTestSortValues(tests, &cs, t) +} diff --git a/api/vendor/github.com/davecgh/go-spew/spew/config.go b/api/vendor/github.com/davecgh/go-spew/spew/config.go new file mode 100644 index 0000000..2e3d22f --- /dev/null +++ b/api/vendor/github.com/davecgh/go-spew/spew/config.go @@ -0,0 +1,306 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * 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 spew + +import ( + "bytes" + "fmt" + "io" + "os" +) + +// ConfigState houses the configuration options used by spew to format and +// display values. There is a global instance, Config, that is used to control +// all top-level Formatter and Dump functionality. Each ConfigState instance +// provides methods equivalent to the top-level functions. +// +// The zero value for ConfigState provides no indentation. You would typically +// want to set it to a space or a tab. +// +// Alternatively, you can use NewDefaultConfig to get a ConfigState instance +// with default settings. See the documentation of NewDefaultConfig for default +// values. +type ConfigState struct { + // Indent specifies the string to use for each indentation level. The + // global config instance that all top-level functions use set this to a + // single space by default. If you would like more indentation, you might + // set this to a tab with "\t" or perhaps two spaces with " ". + Indent string + + // MaxDepth controls the maximum number of levels to descend into nested + // data structures. The default, 0, means there is no limit. + // + // NOTE: Circular data structures are properly detected, so it is not + // necessary to set this value unless you specifically want to limit deeply + // nested data structures. + MaxDepth int + + // DisableMethods specifies whether or not error and Stringer interfaces are + // invoked for types that implement them. + DisableMethods bool + + // DisablePointerMethods specifies whether or not to check for and invoke + // error and Stringer interfaces on types which only accept a pointer + // receiver when the current type is not a pointer. + // + // NOTE: This might be an unsafe action since calling one of these methods + // with a pointer receiver could technically mutate the value, however, + // in practice, types which choose to satisify an error or Stringer + // interface with a pointer receiver should not be mutating their state + // inside these interface methods. As a result, this option relies on + // access to the unsafe package, so it will not have any effect when + // running in environments without access to the unsafe package such as + // Google App Engine or with the "safe" build tag specified. + DisablePointerMethods bool + + // DisablePointerAddresses specifies whether to disable the printing of + // pointer addresses. This is useful when diffing data structures in tests. + DisablePointerAddresses bool + + // DisableCapacities specifies whether to disable the printing of capacities + // for arrays, slices, maps and channels. This is useful when diffing + // data structures in tests. + DisableCapacities bool + + // ContinueOnMethod specifies whether or not recursion should continue once + // a custom error or Stringer interface is invoked. The default, false, + // means it will print the results of invoking the custom error or Stringer + // interface and return immediately instead of continuing to recurse into + // the internals of the data type. + // + // NOTE: This flag does not have any effect if method invocation is disabled + // via the DisableMethods or DisablePointerMethods options. + ContinueOnMethod bool + + // SortKeys specifies map keys should be sorted before being printed. Use + // this to have a more deterministic, diffable output. Note that only + // native types (bool, int, uint, floats, uintptr and string) and types + // that support the error or Stringer interfaces (if methods are + // enabled) are supported, with other types sorted according to the + // reflect.Value.String() output which guarantees display stability. + SortKeys bool + + // SpewKeys specifies that, as a last resort attempt, map keys should + // be spewed to strings and sorted by those strings. This is only + // considered if SortKeys is true. + SpewKeys bool +} + +// Config is the active configuration of the top-level functions. +// The configuration can be changed by modifying the contents of spew.Config. +var Config = ConfigState{Indent: " "} + +// Errorf is a wrapper for fmt.Errorf that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the formatted string as a value that satisfies error. See NewFormatter +// for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Errorf(format, c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Errorf(format string, a ...interface{}) (err error) { + return fmt.Errorf(format, c.convertArgs(a)...) +} + +// Fprint is a wrapper for fmt.Fprint that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Fprint(w, c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Fprint(w io.Writer, a ...interface{}) (n int, err error) { + return fmt.Fprint(w, c.convertArgs(a)...) +} + +// Fprintf is a wrapper for fmt.Fprintf that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Fprintf(w, format, c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) { + return fmt.Fprintf(w, format, c.convertArgs(a)...) +} + +// Fprintln is a wrapper for fmt.Fprintln that treats each argument as if it +// passed with a Formatter interface returned by c.NewFormatter. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Fprintln(w, c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Fprintln(w io.Writer, a ...interface{}) (n int, err error) { + return fmt.Fprintln(w, c.convertArgs(a)...) +} + +// Print is a wrapper for fmt.Print that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Print(c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Print(a ...interface{}) (n int, err error) { + return fmt.Print(c.convertArgs(a)...) +} + +// Printf is a wrapper for fmt.Printf that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Printf(format, c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Printf(format string, a ...interface{}) (n int, err error) { + return fmt.Printf(format, c.convertArgs(a)...) +} + +// Println is a wrapper for fmt.Println that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Println(c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Println(a ...interface{}) (n int, err error) { + return fmt.Println(c.convertArgs(a)...) +} + +// Sprint is a wrapper for fmt.Sprint that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the resulting string. See NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Sprint(c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Sprint(a ...interface{}) string { + return fmt.Sprint(c.convertArgs(a)...) +} + +// Sprintf is a wrapper for fmt.Sprintf that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the resulting string. See NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Sprintf(format, c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Sprintf(format string, a ...interface{}) string { + return fmt.Sprintf(format, c.convertArgs(a)...) +} + +// Sprintln is a wrapper for fmt.Sprintln that treats each argument as if it +// were passed with a Formatter interface returned by c.NewFormatter. It +// returns the resulting string. See NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Sprintln(c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Sprintln(a ...interface{}) string { + return fmt.Sprintln(c.convertArgs(a)...) +} + +/* +NewFormatter returns a custom formatter that satisfies the fmt.Formatter +interface. As a result, it integrates cleanly with standard fmt package +printing functions. The formatter is useful for inline printing of smaller data +types similar to the standard %v format specifier. + +The custom formatter only responds to the %v (most compact), %+v (adds pointer +addresses), %#v (adds types), and %#+v (adds types and pointer addresses) verb +combinations. Any other verbs such as %x and %q will be sent to the the +standard fmt package for formatting. In addition, the custom formatter ignores +the width and precision arguments (however they will still work on the format +specifiers not handled by the custom formatter). + +Typically this function shouldn't be called directly. It is much easier to make +use of the custom formatter by calling one of the convenience functions such as +c.Printf, c.Println, or c.Printf. +*/ +func (c *ConfigState) NewFormatter(v interface{}) fmt.Formatter { + return newFormatter(c, v) +} + +// Fdump formats and displays the passed arguments to io.Writer w. It formats +// exactly the same as Dump. +func (c *ConfigState) Fdump(w io.Writer, a ...interface{}) { + fdump(c, w, a...) +} + +/* +Dump displays the passed parameters to standard out with newlines, customizable +indentation, and additional debug information such as complete types and all +pointer addresses used to indirect to the final value. It provides the +following features over the built-in printing facilities provided by the fmt +package: + + * Pointers are dereferenced and followed + * Circular data structures are detected and handled properly + * Custom Stringer/error interfaces are optionally invoked, including + on unexported types + * Custom types which only implement the Stringer/error interfaces via + a pointer receiver are optionally invoked when passing non-pointer + variables + * Byte arrays and slices are dumped like the hexdump -C command which + includes offsets, byte values in hex, and ASCII output + +The configuration options are controlled by modifying the public members +of c. See ConfigState for options documentation. + +See Fdump if you would prefer dumping to an arbitrary io.Writer or Sdump to +get the formatted result as a string. +*/ +func (c *ConfigState) Dump(a ...interface{}) { + fdump(c, os.Stdout, a...) +} + +// Sdump returns a string with the passed arguments formatted exactly the same +// as Dump. +func (c *ConfigState) Sdump(a ...interface{}) string { + var buf bytes.Buffer + fdump(c, &buf, a...) + return buf.String() +} + +// convertArgs accepts a slice of arguments and returns a slice of the same +// length with each argument converted to a spew Formatter interface using +// the ConfigState associated with s. +func (c *ConfigState) convertArgs(args []interface{}) (formatters []interface{}) { + formatters = make([]interface{}, len(args)) + for index, arg := range args { + formatters[index] = newFormatter(c, arg) + } + return formatters +} + +// NewDefaultConfig returns a ConfigState with the following default settings. +// +// Indent: " " +// MaxDepth: 0 +// DisableMethods: false +// DisablePointerMethods: false +// ContinueOnMethod: false +// SortKeys: false +func NewDefaultConfig() *ConfigState { + return &ConfigState{Indent: " "} +} diff --git a/api/vendor/github.com/davecgh/go-spew/spew/doc.go b/api/vendor/github.com/davecgh/go-spew/spew/doc.go new file mode 100644 index 0000000..aacaac6 --- /dev/null +++ b/api/vendor/github.com/davecgh/go-spew/spew/doc.go @@ -0,0 +1,211 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * 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 spew implements a deep pretty printer for Go data structures to aid in +debugging. + +A quick overview of the additional features spew provides over the built-in +printing facilities for Go data types are as follows: + + * Pointers are dereferenced and followed + * Circular data structures are detected and handled properly + * Custom Stringer/error interfaces are optionally invoked, including + on unexported types + * Custom types which only implement the Stringer/error interfaces via + a pointer receiver are optionally invoked when passing non-pointer + variables + * Byte arrays and slices are dumped like the hexdump -C command which + includes offsets, byte values in hex, and ASCII output (only when using + Dump style) + +There are two different approaches spew allows for dumping Go data structures: + + * Dump style which prints with newlines, customizable indentation, + and additional debug information such as types and all pointer addresses + used to indirect to the final value + * A custom Formatter interface that integrates cleanly with the standard fmt + package and replaces %v, %+v, %#v, and %#+v to provide inline printing + similar to the default %v while providing the additional functionality + outlined above and passing unsupported format verbs such as %x and %q + along to fmt + +Quick Start + +This section demonstrates how to quickly get started with spew. See the +sections below for further details on formatting and configuration options. + +To dump a variable with full newlines, indentation, type, and pointer +information use Dump, Fdump, or Sdump: + spew.Dump(myVar1, myVar2, ...) + spew.Fdump(someWriter, myVar1, myVar2, ...) + str := spew.Sdump(myVar1, myVar2, ...) + +Alternatively, if you would prefer to use format strings with a compacted inline +printing style, use the convenience wrappers Printf, Fprintf, etc with +%v (most compact), %+v (adds pointer addresses), %#v (adds types), or +%#+v (adds types and pointer addresses): + spew.Printf("myVar1: %v -- myVar2: %+v", myVar1, myVar2) + spew.Printf("myVar3: %#v -- myVar4: %#+v", myVar3, myVar4) + spew.Fprintf(someWriter, "myVar1: %v -- myVar2: %+v", myVar1, myVar2) + spew.Fprintf(someWriter, "myVar3: %#v -- myVar4: %#+v", myVar3, myVar4) + +Configuration Options + +Configuration of spew is handled by fields in the ConfigState type. For +convenience, all of the top-level functions use a global state available +via the spew.Config global. + +It is also possible to create a ConfigState instance that provides methods +equivalent to the top-level functions. This allows concurrent configuration +options. See the ConfigState documentation for more details. + +The following configuration options are available: + * Indent + String to use for each indentation level for Dump functions. + It is a single space by default. A popular alternative is "\t". + + * MaxDepth + Maximum number of levels to descend into nested data structures. + There is no limit by default. + + * DisableMethods + Disables invocation of error and Stringer interface methods. + Method invocation is enabled by default. + + * DisablePointerMethods + Disables invocation of error and Stringer interface methods on types + which only accept pointer receivers from non-pointer variables. + Pointer method invocation is enabled by default. + + * DisablePointerAddresses + DisablePointerAddresses specifies whether to disable the printing of + pointer addresses. This is useful when diffing data structures in tests. + + * DisableCapacities + DisableCapacities specifies whether to disable the printing of + capacities for arrays, slices, maps and channels. This is useful when + diffing data structures in tests. + + * ContinueOnMethod + Enables recursion into types after invoking error and Stringer interface + methods. Recursion after method invocation is disabled by default. + + * SortKeys + Specifies map keys should be sorted before being printed. Use + this to have a more deterministic, diffable output. Note that + only native types (bool, int, uint, floats, uintptr and string) + and types which implement error or Stringer interfaces are + supported with other types sorted according to the + reflect.Value.String() output which guarantees display + stability. Natural map order is used by default. + + * SpewKeys + Specifies that, as a last resort attempt, map keys should be + spewed to strings and sorted by those strings. This is only + considered if SortKeys is true. + +Dump Usage + +Simply call spew.Dump with a list of variables you want to dump: + + spew.Dump(myVar1, myVar2, ...) + +You may also call spew.Fdump if you would prefer to output to an arbitrary +io.Writer. For example, to dump to standard error: + + spew.Fdump(os.Stderr, myVar1, myVar2, ...) + +A third option is to call spew.Sdump to get the formatted output as a string: + + str := spew.Sdump(myVar1, myVar2, ...) + +Sample Dump Output + +See the Dump example for details on the setup of the types and variables being +shown here. + + (main.Foo) { + unexportedField: (*main.Bar)(0xf84002e210)({ + flag: (main.Flag) flagTwo, + data: (uintptr) + }), + ExportedField: (map[interface {}]interface {}) (len=1) { + (string) (len=3) "one": (bool) true + } + } + +Byte (and uint8) arrays and slices are displayed uniquely like the hexdump -C +command as shown. + ([]uint8) (len=32 cap=32) { + 00000000 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 |............... | + 00000010 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 |!"#$%&'()*+,-./0| + 00000020 31 32 |12| + } + +Custom Formatter + +Spew provides a custom formatter that implements the fmt.Formatter interface +so that it integrates cleanly with standard fmt package printing functions. The +formatter is useful for inline printing of smaller data types similar to the +standard %v format specifier. + +The custom formatter only responds to the %v (most compact), %+v (adds pointer +addresses), %#v (adds types), or %#+v (adds types and pointer addresses) verb +combinations. Any other verbs such as %x and %q will be sent to the the +standard fmt package for formatting. In addition, the custom formatter ignores +the width and precision arguments (however they will still work on the format +specifiers not handled by the custom formatter). + +Custom Formatter Usage + +The simplest way to make use of the spew custom formatter is to call one of the +convenience functions such as spew.Printf, spew.Println, or spew.Printf. The +functions have syntax you are most likely already familiar with: + + spew.Printf("myVar1: %v -- myVar2: %+v", myVar1, myVar2) + spew.Printf("myVar3: %#v -- myVar4: %#+v", myVar3, myVar4) + spew.Println(myVar, myVar2) + spew.Fprintf(os.Stderr, "myVar1: %v -- myVar2: %+v", myVar1, myVar2) + spew.Fprintf(os.Stderr, "myVar3: %#v -- myVar4: %#+v", myVar3, myVar4) + +See the Index for the full list convenience functions. + +Sample Formatter Output + +Double pointer to a uint8: + %v: <**>5 + %+v: <**>(0xf8400420d0->0xf8400420c8)5 + %#v: (**uint8)5 + %#+v: (**uint8)(0xf8400420d0->0xf8400420c8)5 + +Pointer to circular struct with a uint8 field and a pointer to itself: + %v: <*>{1 <*>} + %+v: <*>(0xf84003e260){ui8:1 c:<*>(0xf84003e260)} + %#v: (*main.circular){ui8:(uint8)1 c:(*main.circular)} + %#+v: (*main.circular)(0xf84003e260){ui8:(uint8)1 c:(*main.circular)(0xf84003e260)} + +See the Printf example for details on the setup of variables being shown +here. + +Errors + +Since it is possible for custom Stringer/error interfaces to panic, spew +detects them and handles them internally by printing the panic information +inline with the output. Since spew is intended to provide deep pretty printing +capabilities on structures, it intentionally does not return any errors. +*/ +package spew diff --git a/api/vendor/github.com/davecgh/go-spew/spew/dump.go b/api/vendor/github.com/davecgh/go-spew/spew/dump.go new file mode 100644 index 0000000..df1d582 --- /dev/null +++ b/api/vendor/github.com/davecgh/go-spew/spew/dump.go @@ -0,0 +1,509 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * 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 spew + +import ( + "bytes" + "encoding/hex" + "fmt" + "io" + "os" + "reflect" + "regexp" + "strconv" + "strings" +) + +var ( + // uint8Type is a reflect.Type representing a uint8. It is used to + // convert cgo types to uint8 slices for hexdumping. + uint8Type = reflect.TypeOf(uint8(0)) + + // cCharRE is a regular expression that matches a cgo char. + // It is used to detect character arrays to hexdump them. + cCharRE = regexp.MustCompile("^.*\\._Ctype_char$") + + // cUnsignedCharRE is a regular expression that matches a cgo unsigned + // char. It is used to detect unsigned character arrays to hexdump + // them. + cUnsignedCharRE = regexp.MustCompile("^.*\\._Ctype_unsignedchar$") + + // cUint8tCharRE is a regular expression that matches a cgo uint8_t. + // It is used to detect uint8_t arrays to hexdump them. + cUint8tCharRE = regexp.MustCompile("^.*\\._Ctype_uint8_t$") +) + +// dumpState contains information about the state of a dump operation. +type dumpState struct { + w io.Writer + depth int + pointers map[uintptr]int + ignoreNextType bool + ignoreNextIndent bool + cs *ConfigState +} + +// indent performs indentation according to the depth level and cs.Indent +// option. +func (d *dumpState) indent() { + if d.ignoreNextIndent { + d.ignoreNextIndent = false + return + } + d.w.Write(bytes.Repeat([]byte(d.cs.Indent), d.depth)) +} + +// unpackValue returns values inside of non-nil interfaces when possible. +// This is useful for data types like structs, arrays, slices, and maps which +// can contain varying types packed inside an interface. +func (d *dumpState) unpackValue(v reflect.Value) reflect.Value { + if v.Kind() == reflect.Interface && !v.IsNil() { + v = v.Elem() + } + return v +} + +// dumpPtr handles formatting of pointers by indirecting them as necessary. +func (d *dumpState) dumpPtr(v reflect.Value) { + // Remove pointers at or below the current depth from map used to detect + // circular refs. + for k, depth := range d.pointers { + if depth >= d.depth { + delete(d.pointers, k) + } + } + + // Keep list of all dereferenced pointers to show later. + pointerChain := make([]uintptr, 0) + + // Figure out how many levels of indirection there are by dereferencing + // pointers and unpacking interfaces down the chain while detecting circular + // references. + nilFound := false + cycleFound := false + indirects := 0 + ve := v + for ve.Kind() == reflect.Ptr { + if ve.IsNil() { + nilFound = true + break + } + indirects++ + addr := ve.Pointer() + pointerChain = append(pointerChain, addr) + if pd, ok := d.pointers[addr]; ok && pd < d.depth { + cycleFound = true + indirects-- + break + } + d.pointers[addr] = d.depth + + ve = ve.Elem() + if ve.Kind() == reflect.Interface { + if ve.IsNil() { + nilFound = true + break + } + ve = ve.Elem() + } + } + + // Display type information. + d.w.Write(openParenBytes) + d.w.Write(bytes.Repeat(asteriskBytes, indirects)) + d.w.Write([]byte(ve.Type().String())) + d.w.Write(closeParenBytes) + + // Display pointer information. + if !d.cs.DisablePointerAddresses && len(pointerChain) > 0 { + d.w.Write(openParenBytes) + for i, addr := range pointerChain { + if i > 0 { + d.w.Write(pointerChainBytes) + } + printHexPtr(d.w, addr) + } + d.w.Write(closeParenBytes) + } + + // Display dereferenced value. + d.w.Write(openParenBytes) + switch { + case nilFound == true: + d.w.Write(nilAngleBytes) + + case cycleFound == true: + d.w.Write(circularBytes) + + default: + d.ignoreNextType = true + d.dump(ve) + } + d.w.Write(closeParenBytes) +} + +// dumpSlice handles formatting of arrays and slices. Byte (uint8 under +// reflection) arrays and slices are dumped in hexdump -C fashion. +func (d *dumpState) dumpSlice(v reflect.Value) { + // Determine whether this type should be hex dumped or not. Also, + // for types which should be hexdumped, try to use the underlying data + // first, then fall back to trying to convert them to a uint8 slice. + var buf []uint8 + doConvert := false + doHexDump := false + numEntries := v.Len() + if numEntries > 0 { + vt := v.Index(0).Type() + vts := vt.String() + switch { + // C types that need to be converted. + case cCharRE.MatchString(vts): + fallthrough + case cUnsignedCharRE.MatchString(vts): + fallthrough + case cUint8tCharRE.MatchString(vts): + doConvert = true + + // Try to use existing uint8 slices and fall back to converting + // and copying if that fails. + case vt.Kind() == reflect.Uint8: + // We need an addressable interface to convert the type + // to a byte slice. However, the reflect package won't + // give us an interface on certain things like + // unexported struct fields in order to enforce + // visibility rules. We use unsafe, when available, to + // bypass these restrictions since this package does not + // mutate the values. + vs := v + if !vs.CanInterface() || !vs.CanAddr() { + vs = unsafeReflectValue(vs) + } + if !UnsafeDisabled { + vs = vs.Slice(0, numEntries) + + // Use the existing uint8 slice if it can be + // type asserted. + iface := vs.Interface() + if slice, ok := iface.([]uint8); ok { + buf = slice + doHexDump = true + break + } + } + + // The underlying data needs to be converted if it can't + // be type asserted to a uint8 slice. + doConvert = true + } + + // Copy and convert the underlying type if needed. + if doConvert && vt.ConvertibleTo(uint8Type) { + // Convert and copy each element into a uint8 byte + // slice. + buf = make([]uint8, numEntries) + for i := 0; i < numEntries; i++ { + vv := v.Index(i) + buf[i] = uint8(vv.Convert(uint8Type).Uint()) + } + doHexDump = true + } + } + + // Hexdump the entire slice as needed. + if doHexDump { + indent := strings.Repeat(d.cs.Indent, d.depth) + str := indent + hex.Dump(buf) + str = strings.Replace(str, "\n", "\n"+indent, -1) + str = strings.TrimRight(str, d.cs.Indent) + d.w.Write([]byte(str)) + return + } + + // Recursively call dump for each item. + for i := 0; i < numEntries; i++ { + d.dump(d.unpackValue(v.Index(i))) + if i < (numEntries - 1) { + d.w.Write(commaNewlineBytes) + } else { + d.w.Write(newlineBytes) + } + } +} + +// dump is the main workhorse for dumping a value. It uses the passed reflect +// value to figure out what kind of object we are dealing with and formats it +// appropriately. It is a recursive function, however circular data structures +// are detected and handled properly. +func (d *dumpState) dump(v reflect.Value) { + // Handle invalid reflect values immediately. + kind := v.Kind() + if kind == reflect.Invalid { + d.w.Write(invalidAngleBytes) + return + } + + // Handle pointers specially. + if kind == reflect.Ptr { + d.indent() + d.dumpPtr(v) + return + } + + // Print type information unless already handled elsewhere. + if !d.ignoreNextType { + d.indent() + d.w.Write(openParenBytes) + d.w.Write([]byte(v.Type().String())) + d.w.Write(closeParenBytes) + d.w.Write(spaceBytes) + } + d.ignoreNextType = false + + // Display length and capacity if the built-in len and cap functions + // work with the value's kind and the len/cap itself is non-zero. + valueLen, valueCap := 0, 0 + switch v.Kind() { + case reflect.Array, reflect.Slice, reflect.Chan: + valueLen, valueCap = v.Len(), v.Cap() + case reflect.Map, reflect.String: + valueLen = v.Len() + } + if valueLen != 0 || !d.cs.DisableCapacities && valueCap != 0 { + d.w.Write(openParenBytes) + if valueLen != 0 { + d.w.Write(lenEqualsBytes) + printInt(d.w, int64(valueLen), 10) + } + if !d.cs.DisableCapacities && valueCap != 0 { + if valueLen != 0 { + d.w.Write(spaceBytes) + } + d.w.Write(capEqualsBytes) + printInt(d.w, int64(valueCap), 10) + } + d.w.Write(closeParenBytes) + d.w.Write(spaceBytes) + } + + // Call Stringer/error interfaces if they exist and the handle methods flag + // is enabled + if !d.cs.DisableMethods { + if (kind != reflect.Invalid) && (kind != reflect.Interface) { + if handled := handleMethods(d.cs, d.w, v); handled { + return + } + } + } + + switch kind { + case reflect.Invalid: + // Do nothing. We should never get here since invalid has already + // been handled above. + + case reflect.Bool: + printBool(d.w, v.Bool()) + + case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int: + printInt(d.w, v.Int(), 10) + + case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: + printUint(d.w, v.Uint(), 10) + + case reflect.Float32: + printFloat(d.w, v.Float(), 32) + + case reflect.Float64: + printFloat(d.w, v.Float(), 64) + + case reflect.Complex64: + printComplex(d.w, v.Complex(), 32) + + case reflect.Complex128: + printComplex(d.w, v.Complex(), 64) + + case reflect.Slice: + if v.IsNil() { + d.w.Write(nilAngleBytes) + break + } + fallthrough + + case reflect.Array: + d.w.Write(openBraceNewlineBytes) + d.depth++ + if (d.cs.MaxDepth != 0) && (d.depth > d.cs.MaxDepth) { + d.indent() + d.w.Write(maxNewlineBytes) + } else { + d.dumpSlice(v) + } + d.depth-- + d.indent() + d.w.Write(closeBraceBytes) + + case reflect.String: + d.w.Write([]byte(strconv.Quote(v.String()))) + + case reflect.Interface: + // The only time we should get here is for nil interfaces due to + // unpackValue calls. + if v.IsNil() { + d.w.Write(nilAngleBytes) + } + + case reflect.Ptr: + // Do nothing. We should never get here since pointers have already + // been handled above. + + case reflect.Map: + // nil maps should be indicated as different than empty maps + if v.IsNil() { + d.w.Write(nilAngleBytes) + break + } + + d.w.Write(openBraceNewlineBytes) + d.depth++ + if (d.cs.MaxDepth != 0) && (d.depth > d.cs.MaxDepth) { + d.indent() + d.w.Write(maxNewlineBytes) + } else { + numEntries := v.Len() + keys := v.MapKeys() + if d.cs.SortKeys { + sortValues(keys, d.cs) + } + for i, key := range keys { + d.dump(d.unpackValue(key)) + d.w.Write(colonSpaceBytes) + d.ignoreNextIndent = true + d.dump(d.unpackValue(v.MapIndex(key))) + if i < (numEntries - 1) { + d.w.Write(commaNewlineBytes) + } else { + d.w.Write(newlineBytes) + } + } + } + d.depth-- + d.indent() + d.w.Write(closeBraceBytes) + + case reflect.Struct: + d.w.Write(openBraceNewlineBytes) + d.depth++ + if (d.cs.MaxDepth != 0) && (d.depth > d.cs.MaxDepth) { + d.indent() + d.w.Write(maxNewlineBytes) + } else { + vt := v.Type() + numFields := v.NumField() + for i := 0; i < numFields; i++ { + d.indent() + vtf := vt.Field(i) + d.w.Write([]byte(vtf.Name)) + d.w.Write(colonSpaceBytes) + d.ignoreNextIndent = true + d.dump(d.unpackValue(v.Field(i))) + if i < (numFields - 1) { + d.w.Write(commaNewlineBytes) + } else { + d.w.Write(newlineBytes) + } + } + } + d.depth-- + d.indent() + d.w.Write(closeBraceBytes) + + case reflect.Uintptr: + printHexPtr(d.w, uintptr(v.Uint())) + + case reflect.UnsafePointer, reflect.Chan, reflect.Func: + printHexPtr(d.w, v.Pointer()) + + // There were not any other types at the time this code was written, but + // fall back to letting the default fmt package handle it in case any new + // types are added. + default: + if v.CanInterface() { + fmt.Fprintf(d.w, "%v", v.Interface()) + } else { + fmt.Fprintf(d.w, "%v", v.String()) + } + } +} + +// fdump is a helper function to consolidate the logic from the various public +// methods which take varying writers and config states. +func fdump(cs *ConfigState, w io.Writer, a ...interface{}) { + for _, arg := range a { + if arg == nil { + w.Write(interfaceBytes) + w.Write(spaceBytes) + w.Write(nilAngleBytes) + w.Write(newlineBytes) + continue + } + + d := dumpState{w: w, cs: cs} + d.pointers = make(map[uintptr]int) + d.dump(reflect.ValueOf(arg)) + d.w.Write(newlineBytes) + } +} + +// Fdump formats and displays the passed arguments to io.Writer w. It formats +// exactly the same as Dump. +func Fdump(w io.Writer, a ...interface{}) { + fdump(&Config, w, a...) +} + +// Sdump returns a string with the passed arguments formatted exactly the same +// as Dump. +func Sdump(a ...interface{}) string { + var buf bytes.Buffer + fdump(&Config, &buf, a...) + return buf.String() +} + +/* +Dump displays the passed parameters to standard out with newlines, customizable +indentation, and additional debug information such as complete types and all +pointer addresses used to indirect to the final value. It provides the +following features over the built-in printing facilities provided by the fmt +package: + + * Pointers are dereferenced and followed + * Circular data structures are detected and handled properly + * Custom Stringer/error interfaces are optionally invoked, including + on unexported types + * Custom types which only implement the Stringer/error interfaces via + a pointer receiver are optionally invoked when passing non-pointer + variables + * Byte arrays and slices are dumped like the hexdump -C command which + includes offsets, byte values in hex, and ASCII output + +The configuration options are controlled by an exported package global, +spew.Config. See ConfigState for options documentation. + +See Fdump if you would prefer dumping to an arbitrary io.Writer or Sdump to +get the formatted result as a string. +*/ +func Dump(a ...interface{}) { + fdump(&Config, os.Stdout, a...) +} diff --git a/api/vendor/github.com/davecgh/go-spew/spew/dump_test.go b/api/vendor/github.com/davecgh/go-spew/spew/dump_test.go new file mode 100644 index 0000000..5aad9c7 --- /dev/null +++ b/api/vendor/github.com/davecgh/go-spew/spew/dump_test.go @@ -0,0 +1,1042 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * 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. + */ + +/* +Test Summary: +NOTE: For each test, a nil pointer, a single pointer and double pointer to the +base test element are also tested to ensure proper indirection across all types. + +- Max int8, int16, int32, int64, int +- Max uint8, uint16, uint32, uint64, uint +- Boolean true and false +- Standard complex64 and complex128 +- Array containing standard ints +- Array containing type with custom formatter on pointer receiver only +- Array containing interfaces +- Array containing bytes +- Slice containing standard float32 values +- Slice containing type with custom formatter on pointer receiver only +- Slice containing interfaces +- Slice containing bytes +- Nil slice +- Standard string +- Nil interface +- Sub-interface +- Map with string keys and int vals +- Map with custom formatter type on pointer receiver only keys and vals +- Map with interface keys and values +- Map with nil interface value +- Struct with primitives +- Struct that contains another struct +- Struct that contains custom type with Stringer pointer interface via both + exported and unexported fields +- Struct that contains embedded struct and field to same struct +- Uintptr to 0 (null pointer) +- Uintptr address of real variable +- Unsafe.Pointer to 0 (null pointer) +- Unsafe.Pointer to address of real variable +- Nil channel +- Standard int channel +- Function with no params and no returns +- Function with param and no returns +- Function with multiple params and multiple returns +- Struct that is circular through self referencing +- Structs that are circular through cross referencing +- Structs that are indirectly circular +- Type that panics in its Stringer interface +*/ + +package spew_test + +import ( + "bytes" + "fmt" + "testing" + "unsafe" + + "github.com/davecgh/go-spew/spew" +) + +// dumpTest is used to describe a test to be performed against the Dump method. +type dumpTest struct { + in interface{} + wants []string +} + +// dumpTests houses all of the tests to be performed against the Dump method. +var dumpTests = make([]dumpTest, 0) + +// addDumpTest is a helper method to append the passed input and desired result +// to dumpTests +func addDumpTest(in interface{}, wants ...string) { + test := dumpTest{in, wants} + dumpTests = append(dumpTests, test) +} + +func addIntDumpTests() { + // Max int8. + v := int8(127) + nv := (*int8)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "int8" + vs := "127" + addDumpTest(v, "("+vt+") "+vs+"\n") + addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") + addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") + addDumpTest(nv, "(*"+vt+")()\n") + + // Max int16. + v2 := int16(32767) + nv2 := (*int16)(nil) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "int16" + v2s := "32767" + addDumpTest(v2, "("+v2t+") "+v2s+"\n") + addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") + addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") + addDumpTest(nv2, "(*"+v2t+")()\n") + + // Max int32. + v3 := int32(2147483647) + nv3 := (*int32)(nil) + pv3 := &v3 + v3Addr := fmt.Sprintf("%p", pv3) + pv3Addr := fmt.Sprintf("%p", &pv3) + v3t := "int32" + v3s := "2147483647" + addDumpTest(v3, "("+v3t+") "+v3s+"\n") + addDumpTest(pv3, "(*"+v3t+")("+v3Addr+")("+v3s+")\n") + addDumpTest(&pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")("+v3s+")\n") + addDumpTest(nv3, "(*"+v3t+")()\n") + + // Max int64. + v4 := int64(9223372036854775807) + nv4 := (*int64)(nil) + pv4 := &v4 + v4Addr := fmt.Sprintf("%p", pv4) + pv4Addr := fmt.Sprintf("%p", &pv4) + v4t := "int64" + v4s := "9223372036854775807" + addDumpTest(v4, "("+v4t+") "+v4s+"\n") + addDumpTest(pv4, "(*"+v4t+")("+v4Addr+")("+v4s+")\n") + addDumpTest(&pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")("+v4s+")\n") + addDumpTest(nv4, "(*"+v4t+")()\n") + + // Max int. + v5 := int(2147483647) + nv5 := (*int)(nil) + pv5 := &v5 + v5Addr := fmt.Sprintf("%p", pv5) + pv5Addr := fmt.Sprintf("%p", &pv5) + v5t := "int" + v5s := "2147483647" + addDumpTest(v5, "("+v5t+") "+v5s+"\n") + addDumpTest(pv5, "(*"+v5t+")("+v5Addr+")("+v5s+")\n") + addDumpTest(&pv5, "(**"+v5t+")("+pv5Addr+"->"+v5Addr+")("+v5s+")\n") + addDumpTest(nv5, "(*"+v5t+")()\n") +} + +func addUintDumpTests() { + // Max uint8. + v := uint8(255) + nv := (*uint8)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "uint8" + vs := "255" + addDumpTest(v, "("+vt+") "+vs+"\n") + addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") + addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") + addDumpTest(nv, "(*"+vt+")()\n") + + // Max uint16. + v2 := uint16(65535) + nv2 := (*uint16)(nil) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "uint16" + v2s := "65535" + addDumpTest(v2, "("+v2t+") "+v2s+"\n") + addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") + addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") + addDumpTest(nv2, "(*"+v2t+")()\n") + + // Max uint32. + v3 := uint32(4294967295) + nv3 := (*uint32)(nil) + pv3 := &v3 + v3Addr := fmt.Sprintf("%p", pv3) + pv3Addr := fmt.Sprintf("%p", &pv3) + v3t := "uint32" + v3s := "4294967295" + addDumpTest(v3, "("+v3t+") "+v3s+"\n") + addDumpTest(pv3, "(*"+v3t+")("+v3Addr+")("+v3s+")\n") + addDumpTest(&pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")("+v3s+")\n") + addDumpTest(nv3, "(*"+v3t+")()\n") + + // Max uint64. + v4 := uint64(18446744073709551615) + nv4 := (*uint64)(nil) + pv4 := &v4 + v4Addr := fmt.Sprintf("%p", pv4) + pv4Addr := fmt.Sprintf("%p", &pv4) + v4t := "uint64" + v4s := "18446744073709551615" + addDumpTest(v4, "("+v4t+") "+v4s+"\n") + addDumpTest(pv4, "(*"+v4t+")("+v4Addr+")("+v4s+")\n") + addDumpTest(&pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")("+v4s+")\n") + addDumpTest(nv4, "(*"+v4t+")()\n") + + // Max uint. + v5 := uint(4294967295) + nv5 := (*uint)(nil) + pv5 := &v5 + v5Addr := fmt.Sprintf("%p", pv5) + pv5Addr := fmt.Sprintf("%p", &pv5) + v5t := "uint" + v5s := "4294967295" + addDumpTest(v5, "("+v5t+") "+v5s+"\n") + addDumpTest(pv5, "(*"+v5t+")("+v5Addr+")("+v5s+")\n") + addDumpTest(&pv5, "(**"+v5t+")("+pv5Addr+"->"+v5Addr+")("+v5s+")\n") + addDumpTest(nv5, "(*"+v5t+")()\n") +} + +func addBoolDumpTests() { + // Boolean true. + v := bool(true) + nv := (*bool)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "bool" + vs := "true" + addDumpTest(v, "("+vt+") "+vs+"\n") + addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") + addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") + addDumpTest(nv, "(*"+vt+")()\n") + + // Boolean false. + v2 := bool(false) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "bool" + v2s := "false" + addDumpTest(v2, "("+v2t+") "+v2s+"\n") + addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") + addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") +} + +func addFloatDumpTests() { + // Standard float32. + v := float32(3.1415) + nv := (*float32)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "float32" + vs := "3.1415" + addDumpTest(v, "("+vt+") "+vs+"\n") + addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") + addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") + addDumpTest(nv, "(*"+vt+")()\n") + + // Standard float64. + v2 := float64(3.1415926) + nv2 := (*float64)(nil) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "float64" + v2s := "3.1415926" + addDumpTest(v2, "("+v2t+") "+v2s+"\n") + addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") + addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") + addDumpTest(nv2, "(*"+v2t+")()\n") +} + +func addComplexDumpTests() { + // Standard complex64. + v := complex(float32(6), -2) + nv := (*complex64)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "complex64" + vs := "(6-2i)" + addDumpTest(v, "("+vt+") "+vs+"\n") + addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") + addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") + addDumpTest(nv, "(*"+vt+")()\n") + + // Standard complex128. + v2 := complex(float64(-6), 2) + nv2 := (*complex128)(nil) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "complex128" + v2s := "(-6+2i)" + addDumpTest(v2, "("+v2t+") "+v2s+"\n") + addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") + addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") + addDumpTest(nv2, "(*"+v2t+")()\n") +} + +func addArrayDumpTests() { + // Array containing standard ints. + v := [3]int{1, 2, 3} + vLen := fmt.Sprintf("%d", len(v)) + vCap := fmt.Sprintf("%d", cap(v)) + nv := (*[3]int)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "int" + vs := "(len=" + vLen + " cap=" + vCap + ") {\n (" + vt + ") 1,\n (" + + vt + ") 2,\n (" + vt + ") 3\n}" + addDumpTest(v, "([3]"+vt+") "+vs+"\n") + addDumpTest(pv, "(*[3]"+vt+")("+vAddr+")("+vs+")\n") + addDumpTest(&pv, "(**[3]"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") + addDumpTest(nv, "(*[3]"+vt+")()\n") + + // Array containing type with custom formatter on pointer receiver only. + v2i0 := pstringer("1") + v2i1 := pstringer("2") + v2i2 := pstringer("3") + v2 := [3]pstringer{v2i0, v2i1, v2i2} + v2i0Len := fmt.Sprintf("%d", len(v2i0)) + v2i1Len := fmt.Sprintf("%d", len(v2i1)) + v2i2Len := fmt.Sprintf("%d", len(v2i2)) + v2Len := fmt.Sprintf("%d", len(v2)) + v2Cap := fmt.Sprintf("%d", cap(v2)) + nv2 := (*[3]pstringer)(nil) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "spew_test.pstringer" + v2sp := "(len=" + v2Len + " cap=" + v2Cap + ") {\n (" + v2t + + ") (len=" + v2i0Len + ") stringer 1,\n (" + v2t + + ") (len=" + v2i1Len + ") stringer 2,\n (" + v2t + + ") (len=" + v2i2Len + ") " + "stringer 3\n}" + v2s := v2sp + if spew.UnsafeDisabled { + v2s = "(len=" + v2Len + " cap=" + v2Cap + ") {\n (" + v2t + + ") (len=" + v2i0Len + ") \"1\",\n (" + v2t + ") (len=" + + v2i1Len + ") \"2\",\n (" + v2t + ") (len=" + v2i2Len + + ") " + "\"3\"\n}" + } + addDumpTest(v2, "([3]"+v2t+") "+v2s+"\n") + addDumpTest(pv2, "(*[3]"+v2t+")("+v2Addr+")("+v2sp+")\n") + addDumpTest(&pv2, "(**[3]"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2sp+")\n") + addDumpTest(nv2, "(*[3]"+v2t+")()\n") + + // Array containing interfaces. + v3i0 := "one" + v3 := [3]interface{}{v3i0, int(2), uint(3)} + v3i0Len := fmt.Sprintf("%d", len(v3i0)) + v3Len := fmt.Sprintf("%d", len(v3)) + v3Cap := fmt.Sprintf("%d", cap(v3)) + nv3 := (*[3]interface{})(nil) + pv3 := &v3 + v3Addr := fmt.Sprintf("%p", pv3) + pv3Addr := fmt.Sprintf("%p", &pv3) + v3t := "[3]interface {}" + v3t2 := "string" + v3t3 := "int" + v3t4 := "uint" + v3s := "(len=" + v3Len + " cap=" + v3Cap + ") {\n (" + v3t2 + ") " + + "(len=" + v3i0Len + ") \"one\",\n (" + v3t3 + ") 2,\n (" + + v3t4 + ") 3\n}" + addDumpTest(v3, "("+v3t+") "+v3s+"\n") + addDumpTest(pv3, "(*"+v3t+")("+v3Addr+")("+v3s+")\n") + addDumpTest(&pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")("+v3s+")\n") + addDumpTest(nv3, "(*"+v3t+")()\n") + + // Array containing bytes. + v4 := [34]byte{ + 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, + 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, + 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, + 0x31, 0x32, + } + v4Len := fmt.Sprintf("%d", len(v4)) + v4Cap := fmt.Sprintf("%d", cap(v4)) + nv4 := (*[34]byte)(nil) + pv4 := &v4 + v4Addr := fmt.Sprintf("%p", pv4) + pv4Addr := fmt.Sprintf("%p", &pv4) + v4t := "[34]uint8" + v4s := "(len=" + v4Len + " cap=" + v4Cap + ") " + + "{\n 00000000 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20" + + " |............... |\n" + + " 00000010 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30" + + " |!\"#$%&'()*+,-./0|\n" + + " 00000020 31 32 " + + " |12|\n}" + addDumpTest(v4, "("+v4t+") "+v4s+"\n") + addDumpTest(pv4, "(*"+v4t+")("+v4Addr+")("+v4s+")\n") + addDumpTest(&pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")("+v4s+")\n") + addDumpTest(nv4, "(*"+v4t+")()\n") +} + +func addSliceDumpTests() { + // Slice containing standard float32 values. + v := []float32{3.14, 6.28, 12.56} + vLen := fmt.Sprintf("%d", len(v)) + vCap := fmt.Sprintf("%d", cap(v)) + nv := (*[]float32)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "float32" + vs := "(len=" + vLen + " cap=" + vCap + ") {\n (" + vt + ") 3.14,\n (" + + vt + ") 6.28,\n (" + vt + ") 12.56\n}" + addDumpTest(v, "([]"+vt+") "+vs+"\n") + addDumpTest(pv, "(*[]"+vt+")("+vAddr+")("+vs+")\n") + addDumpTest(&pv, "(**[]"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") + addDumpTest(nv, "(*[]"+vt+")()\n") + + // Slice containing type with custom formatter on pointer receiver only. + v2i0 := pstringer("1") + v2i1 := pstringer("2") + v2i2 := pstringer("3") + v2 := []pstringer{v2i0, v2i1, v2i2} + v2i0Len := fmt.Sprintf("%d", len(v2i0)) + v2i1Len := fmt.Sprintf("%d", len(v2i1)) + v2i2Len := fmt.Sprintf("%d", len(v2i2)) + v2Len := fmt.Sprintf("%d", len(v2)) + v2Cap := fmt.Sprintf("%d", cap(v2)) + nv2 := (*[]pstringer)(nil) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "spew_test.pstringer" + v2s := "(len=" + v2Len + " cap=" + v2Cap + ") {\n (" + v2t + ") (len=" + + v2i0Len + ") stringer 1,\n (" + v2t + ") (len=" + v2i1Len + + ") stringer 2,\n (" + v2t + ") (len=" + v2i2Len + ") " + + "stringer 3\n}" + addDumpTest(v2, "([]"+v2t+") "+v2s+"\n") + addDumpTest(pv2, "(*[]"+v2t+")("+v2Addr+")("+v2s+")\n") + addDumpTest(&pv2, "(**[]"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") + addDumpTest(nv2, "(*[]"+v2t+")()\n") + + // Slice containing interfaces. + v3i0 := "one" + v3 := []interface{}{v3i0, int(2), uint(3), nil} + v3i0Len := fmt.Sprintf("%d", len(v3i0)) + v3Len := fmt.Sprintf("%d", len(v3)) + v3Cap := fmt.Sprintf("%d", cap(v3)) + nv3 := (*[]interface{})(nil) + pv3 := &v3 + v3Addr := fmt.Sprintf("%p", pv3) + pv3Addr := fmt.Sprintf("%p", &pv3) + v3t := "[]interface {}" + v3t2 := "string" + v3t3 := "int" + v3t4 := "uint" + v3t5 := "interface {}" + v3s := "(len=" + v3Len + " cap=" + v3Cap + ") {\n (" + v3t2 + ") " + + "(len=" + v3i0Len + ") \"one\",\n (" + v3t3 + ") 2,\n (" + + v3t4 + ") 3,\n (" + v3t5 + ") \n}" + addDumpTest(v3, "("+v3t+") "+v3s+"\n") + addDumpTest(pv3, "(*"+v3t+")("+v3Addr+")("+v3s+")\n") + addDumpTest(&pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")("+v3s+")\n") + addDumpTest(nv3, "(*"+v3t+")()\n") + + // Slice containing bytes. + v4 := []byte{ + 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, + 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, + 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, + 0x31, 0x32, + } + v4Len := fmt.Sprintf("%d", len(v4)) + v4Cap := fmt.Sprintf("%d", cap(v4)) + nv4 := (*[]byte)(nil) + pv4 := &v4 + v4Addr := fmt.Sprintf("%p", pv4) + pv4Addr := fmt.Sprintf("%p", &pv4) + v4t := "[]uint8" + v4s := "(len=" + v4Len + " cap=" + v4Cap + ") " + + "{\n 00000000 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20" + + " |............... |\n" + + " 00000010 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30" + + " |!\"#$%&'()*+,-./0|\n" + + " 00000020 31 32 " + + " |12|\n}" + addDumpTest(v4, "("+v4t+") "+v4s+"\n") + addDumpTest(pv4, "(*"+v4t+")("+v4Addr+")("+v4s+")\n") + addDumpTest(&pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")("+v4s+")\n") + addDumpTest(nv4, "(*"+v4t+")()\n") + + // Nil slice. + v5 := []int(nil) + nv5 := (*[]int)(nil) + pv5 := &v5 + v5Addr := fmt.Sprintf("%p", pv5) + pv5Addr := fmt.Sprintf("%p", &pv5) + v5t := "[]int" + v5s := "" + addDumpTest(v5, "("+v5t+") "+v5s+"\n") + addDumpTest(pv5, "(*"+v5t+")("+v5Addr+")("+v5s+")\n") + addDumpTest(&pv5, "(**"+v5t+")("+pv5Addr+"->"+v5Addr+")("+v5s+")\n") + addDumpTest(nv5, "(*"+v5t+")()\n") +} + +func addStringDumpTests() { + // Standard string. + v := "test" + vLen := fmt.Sprintf("%d", len(v)) + nv := (*string)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "string" + vs := "(len=" + vLen + ") \"test\"" + addDumpTest(v, "("+vt+") "+vs+"\n") + addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") + addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") + addDumpTest(nv, "(*"+vt+")()\n") +} + +func addInterfaceDumpTests() { + // Nil interface. + var v interface{} + nv := (*interface{})(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "interface {}" + vs := "" + addDumpTest(v, "("+vt+") "+vs+"\n") + addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") + addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") + addDumpTest(nv, "(*"+vt+")()\n") + + // Sub-interface. + v2 := interface{}(uint16(65535)) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "uint16" + v2s := "65535" + addDumpTest(v2, "("+v2t+") "+v2s+"\n") + addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") + addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") +} + +func addMapDumpTests() { + // Map with string keys and int vals. + k := "one" + kk := "two" + m := map[string]int{k: 1, kk: 2} + klen := fmt.Sprintf("%d", len(k)) // not kLen to shut golint up + kkLen := fmt.Sprintf("%d", len(kk)) + mLen := fmt.Sprintf("%d", len(m)) + nilMap := map[string]int(nil) + nm := (*map[string]int)(nil) + pm := &m + mAddr := fmt.Sprintf("%p", pm) + pmAddr := fmt.Sprintf("%p", &pm) + mt := "map[string]int" + mt1 := "string" + mt2 := "int" + ms := "(len=" + mLen + ") {\n (" + mt1 + ") (len=" + klen + ") " + + "\"one\": (" + mt2 + ") 1,\n (" + mt1 + ") (len=" + kkLen + + ") \"two\": (" + mt2 + ") 2\n}" + ms2 := "(len=" + mLen + ") {\n (" + mt1 + ") (len=" + kkLen + ") " + + "\"two\": (" + mt2 + ") 2,\n (" + mt1 + ") (len=" + klen + + ") \"one\": (" + mt2 + ") 1\n}" + addDumpTest(m, "("+mt+") "+ms+"\n", "("+mt+") "+ms2+"\n") + addDumpTest(pm, "(*"+mt+")("+mAddr+")("+ms+")\n", + "(*"+mt+")("+mAddr+")("+ms2+")\n") + addDumpTest(&pm, "(**"+mt+")("+pmAddr+"->"+mAddr+")("+ms+")\n", + "(**"+mt+")("+pmAddr+"->"+mAddr+")("+ms2+")\n") + addDumpTest(nm, "(*"+mt+")()\n") + addDumpTest(nilMap, "("+mt+") \n") + + // Map with custom formatter type on pointer receiver only keys and vals. + k2 := pstringer("one") + v2 := pstringer("1") + m2 := map[pstringer]pstringer{k2: v2} + k2Len := fmt.Sprintf("%d", len(k2)) + v2Len := fmt.Sprintf("%d", len(v2)) + m2Len := fmt.Sprintf("%d", len(m2)) + nilMap2 := map[pstringer]pstringer(nil) + nm2 := (*map[pstringer]pstringer)(nil) + pm2 := &m2 + m2Addr := fmt.Sprintf("%p", pm2) + pm2Addr := fmt.Sprintf("%p", &pm2) + m2t := "map[spew_test.pstringer]spew_test.pstringer" + m2t1 := "spew_test.pstringer" + m2t2 := "spew_test.pstringer" + m2s := "(len=" + m2Len + ") {\n (" + m2t1 + ") (len=" + k2Len + ") " + + "stringer one: (" + m2t2 + ") (len=" + v2Len + ") stringer 1\n}" + if spew.UnsafeDisabled { + m2s = "(len=" + m2Len + ") {\n (" + m2t1 + ") (len=" + k2Len + + ") " + "\"one\": (" + m2t2 + ") (len=" + v2Len + + ") \"1\"\n}" + } + addDumpTest(m2, "("+m2t+") "+m2s+"\n") + addDumpTest(pm2, "(*"+m2t+")("+m2Addr+")("+m2s+")\n") + addDumpTest(&pm2, "(**"+m2t+")("+pm2Addr+"->"+m2Addr+")("+m2s+")\n") + addDumpTest(nm2, "(*"+m2t+")()\n") + addDumpTest(nilMap2, "("+m2t+") \n") + + // Map with interface keys and values. + k3 := "one" + k3Len := fmt.Sprintf("%d", len(k3)) + m3 := map[interface{}]interface{}{k3: 1} + m3Len := fmt.Sprintf("%d", len(m3)) + nilMap3 := map[interface{}]interface{}(nil) + nm3 := (*map[interface{}]interface{})(nil) + pm3 := &m3 + m3Addr := fmt.Sprintf("%p", pm3) + pm3Addr := fmt.Sprintf("%p", &pm3) + m3t := "map[interface {}]interface {}" + m3t1 := "string" + m3t2 := "int" + m3s := "(len=" + m3Len + ") {\n (" + m3t1 + ") (len=" + k3Len + ") " + + "\"one\": (" + m3t2 + ") 1\n}" + addDumpTest(m3, "("+m3t+") "+m3s+"\n") + addDumpTest(pm3, "(*"+m3t+")("+m3Addr+")("+m3s+")\n") + addDumpTest(&pm3, "(**"+m3t+")("+pm3Addr+"->"+m3Addr+")("+m3s+")\n") + addDumpTest(nm3, "(*"+m3t+")()\n") + addDumpTest(nilMap3, "("+m3t+") \n") + + // Map with nil interface value. + k4 := "nil" + k4Len := fmt.Sprintf("%d", len(k4)) + m4 := map[string]interface{}{k4: nil} + m4Len := fmt.Sprintf("%d", len(m4)) + nilMap4 := map[string]interface{}(nil) + nm4 := (*map[string]interface{})(nil) + pm4 := &m4 + m4Addr := fmt.Sprintf("%p", pm4) + pm4Addr := fmt.Sprintf("%p", &pm4) + m4t := "map[string]interface {}" + m4t1 := "string" + m4t2 := "interface {}" + m4s := "(len=" + m4Len + ") {\n (" + m4t1 + ") (len=" + k4Len + ")" + + " \"nil\": (" + m4t2 + ") \n}" + addDumpTest(m4, "("+m4t+") "+m4s+"\n") + addDumpTest(pm4, "(*"+m4t+")("+m4Addr+")("+m4s+")\n") + addDumpTest(&pm4, "(**"+m4t+")("+pm4Addr+"->"+m4Addr+")("+m4s+")\n") + addDumpTest(nm4, "(*"+m4t+")()\n") + addDumpTest(nilMap4, "("+m4t+") \n") +} + +func addStructDumpTests() { + // Struct with primitives. + type s1 struct { + a int8 + b uint8 + } + v := s1{127, 255} + nv := (*s1)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "spew_test.s1" + vt2 := "int8" + vt3 := "uint8" + vs := "{\n a: (" + vt2 + ") 127,\n b: (" + vt3 + ") 255\n}" + addDumpTest(v, "("+vt+") "+vs+"\n") + addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") + addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") + addDumpTest(nv, "(*"+vt+")()\n") + + // Struct that contains another struct. + type s2 struct { + s1 s1 + b bool + } + v2 := s2{s1{127, 255}, true} + nv2 := (*s2)(nil) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "spew_test.s2" + v2t2 := "spew_test.s1" + v2t3 := "int8" + v2t4 := "uint8" + v2t5 := "bool" + v2s := "{\n s1: (" + v2t2 + ") {\n a: (" + v2t3 + ") 127,\n b: (" + + v2t4 + ") 255\n },\n b: (" + v2t5 + ") true\n}" + addDumpTest(v2, "("+v2t+") "+v2s+"\n") + addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") + addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") + addDumpTest(nv2, "(*"+v2t+")()\n") + + // Struct that contains custom type with Stringer pointer interface via both + // exported and unexported fields. + type s3 struct { + s pstringer + S pstringer + } + v3 := s3{"test", "test2"} + nv3 := (*s3)(nil) + pv3 := &v3 + v3Addr := fmt.Sprintf("%p", pv3) + pv3Addr := fmt.Sprintf("%p", &pv3) + v3t := "spew_test.s3" + v3t2 := "spew_test.pstringer" + v3s := "{\n s: (" + v3t2 + ") (len=4) stringer test,\n S: (" + v3t2 + + ") (len=5) stringer test2\n}" + v3sp := v3s + if spew.UnsafeDisabled { + v3s = "{\n s: (" + v3t2 + ") (len=4) \"test\",\n S: (" + + v3t2 + ") (len=5) \"test2\"\n}" + v3sp = "{\n s: (" + v3t2 + ") (len=4) \"test\",\n S: (" + + v3t2 + ") (len=5) stringer test2\n}" + } + addDumpTest(v3, "("+v3t+") "+v3s+"\n") + addDumpTest(pv3, "(*"+v3t+")("+v3Addr+")("+v3sp+")\n") + addDumpTest(&pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")("+v3sp+")\n") + addDumpTest(nv3, "(*"+v3t+")()\n") + + // Struct that contains embedded struct and field to same struct. + e := embed{"embedstr"} + eLen := fmt.Sprintf("%d", len("embedstr")) + v4 := embedwrap{embed: &e, e: &e} + nv4 := (*embedwrap)(nil) + pv4 := &v4 + eAddr := fmt.Sprintf("%p", &e) + v4Addr := fmt.Sprintf("%p", pv4) + pv4Addr := fmt.Sprintf("%p", &pv4) + v4t := "spew_test.embedwrap" + v4t2 := "spew_test.embed" + v4t3 := "string" + v4s := "{\n embed: (*" + v4t2 + ")(" + eAddr + ")({\n a: (" + v4t3 + + ") (len=" + eLen + ") \"embedstr\"\n }),\n e: (*" + v4t2 + + ")(" + eAddr + ")({\n a: (" + v4t3 + ") (len=" + eLen + ")" + + " \"embedstr\"\n })\n}" + addDumpTest(v4, "("+v4t+") "+v4s+"\n") + addDumpTest(pv4, "(*"+v4t+")("+v4Addr+")("+v4s+")\n") + addDumpTest(&pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")("+v4s+")\n") + addDumpTest(nv4, "(*"+v4t+")()\n") +} + +func addUintptrDumpTests() { + // Null pointer. + v := uintptr(0) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "uintptr" + vs := "" + addDumpTest(v, "("+vt+") "+vs+"\n") + addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") + addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") + + // Address of real variable. + i := 1 + v2 := uintptr(unsafe.Pointer(&i)) + nv2 := (*uintptr)(nil) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "uintptr" + v2s := fmt.Sprintf("%p", &i) + addDumpTest(v2, "("+v2t+") "+v2s+"\n") + addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") + addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") + addDumpTest(nv2, "(*"+v2t+")()\n") +} + +func addUnsafePointerDumpTests() { + // Null pointer. + v := unsafe.Pointer(uintptr(0)) + nv := (*unsafe.Pointer)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "unsafe.Pointer" + vs := "" + addDumpTest(v, "("+vt+") "+vs+"\n") + addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") + addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") + addDumpTest(nv, "(*"+vt+")()\n") + + // Address of real variable. + i := 1 + v2 := unsafe.Pointer(&i) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "unsafe.Pointer" + v2s := fmt.Sprintf("%p", &i) + addDumpTest(v2, "("+v2t+") "+v2s+"\n") + addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") + addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") + addDumpTest(nv, "(*"+vt+")()\n") +} + +func addChanDumpTests() { + // Nil channel. + var v chan int + pv := &v + nv := (*chan int)(nil) + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "chan int" + vs := "" + addDumpTest(v, "("+vt+") "+vs+"\n") + addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") + addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") + addDumpTest(nv, "(*"+vt+")()\n") + + // Real channel. + v2 := make(chan int) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "chan int" + v2s := fmt.Sprintf("%p", v2) + addDumpTest(v2, "("+v2t+") "+v2s+"\n") + addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") + addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") +} + +func addFuncDumpTests() { + // Function with no params and no returns. + v := addIntDumpTests + nv := (*func())(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "func()" + vs := fmt.Sprintf("%p", v) + addDumpTest(v, "("+vt+") "+vs+"\n") + addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") + addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") + addDumpTest(nv, "(*"+vt+")()\n") + + // Function with param and no returns. + v2 := TestDump + nv2 := (*func(*testing.T))(nil) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "func(*testing.T)" + v2s := fmt.Sprintf("%p", v2) + addDumpTest(v2, "("+v2t+") "+v2s+"\n") + addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") + addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") + addDumpTest(nv2, "(*"+v2t+")()\n") + + // Function with multiple params and multiple returns. + var v3 = func(i int, s string) (b bool, err error) { + return true, nil + } + nv3 := (*func(int, string) (bool, error))(nil) + pv3 := &v3 + v3Addr := fmt.Sprintf("%p", pv3) + pv3Addr := fmt.Sprintf("%p", &pv3) + v3t := "func(int, string) (bool, error)" + v3s := fmt.Sprintf("%p", v3) + addDumpTest(v3, "("+v3t+") "+v3s+"\n") + addDumpTest(pv3, "(*"+v3t+")("+v3Addr+")("+v3s+")\n") + addDumpTest(&pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")("+v3s+")\n") + addDumpTest(nv3, "(*"+v3t+")()\n") +} + +func addCircularDumpTests() { + // Struct that is circular through self referencing. + type circular struct { + c *circular + } + v := circular{nil} + v.c = &v + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "spew_test.circular" + vs := "{\n c: (*" + vt + ")(" + vAddr + ")({\n c: (*" + vt + ")(" + + vAddr + ")()\n })\n}" + vs2 := "{\n c: (*" + vt + ")(" + vAddr + ")()\n}" + addDumpTest(v, "("+vt+") "+vs+"\n") + addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs2+")\n") + addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs2+")\n") + + // Structs that are circular through cross referencing. + v2 := xref1{nil} + ts2 := xref2{&v2} + v2.ps2 = &ts2 + pv2 := &v2 + ts2Addr := fmt.Sprintf("%p", &ts2) + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "spew_test.xref1" + v2t2 := "spew_test.xref2" + v2s := "{\n ps2: (*" + v2t2 + ")(" + ts2Addr + ")({\n ps1: (*" + v2t + + ")(" + v2Addr + ")({\n ps2: (*" + v2t2 + ")(" + ts2Addr + + ")()\n })\n })\n}" + v2s2 := "{\n ps2: (*" + v2t2 + ")(" + ts2Addr + ")({\n ps1: (*" + v2t + + ")(" + v2Addr + ")()\n })\n}" + addDumpTest(v2, "("+v2t+") "+v2s+"\n") + addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s2+")\n") + addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s2+")\n") + + // Structs that are indirectly circular. + v3 := indirCir1{nil} + tic2 := indirCir2{nil} + tic3 := indirCir3{&v3} + tic2.ps3 = &tic3 + v3.ps2 = &tic2 + pv3 := &v3 + tic2Addr := fmt.Sprintf("%p", &tic2) + tic3Addr := fmt.Sprintf("%p", &tic3) + v3Addr := fmt.Sprintf("%p", pv3) + pv3Addr := fmt.Sprintf("%p", &pv3) + v3t := "spew_test.indirCir1" + v3t2 := "spew_test.indirCir2" + v3t3 := "spew_test.indirCir3" + v3s := "{\n ps2: (*" + v3t2 + ")(" + tic2Addr + ")({\n ps3: (*" + v3t3 + + ")(" + tic3Addr + ")({\n ps1: (*" + v3t + ")(" + v3Addr + + ")({\n ps2: (*" + v3t2 + ")(" + tic2Addr + + ")()\n })\n })\n })\n}" + v3s2 := "{\n ps2: (*" + v3t2 + ")(" + tic2Addr + ")({\n ps3: (*" + v3t3 + + ")(" + tic3Addr + ")({\n ps1: (*" + v3t + ")(" + v3Addr + + ")()\n })\n })\n}" + addDumpTest(v3, "("+v3t+") "+v3s+"\n") + addDumpTest(pv3, "(*"+v3t+")("+v3Addr+")("+v3s2+")\n") + addDumpTest(&pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")("+v3s2+")\n") +} + +func addPanicDumpTests() { + // Type that panics in its Stringer interface. + v := panicer(127) + nv := (*panicer)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "spew_test.panicer" + vs := "(PANIC=test panic)127" + addDumpTest(v, "("+vt+") "+vs+"\n") + addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") + addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") + addDumpTest(nv, "(*"+vt+")()\n") +} + +func addErrorDumpTests() { + // Type that has a custom Error interface. + v := customError(127) + nv := (*customError)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "spew_test.customError" + vs := "error: 127" + addDumpTest(v, "("+vt+") "+vs+"\n") + addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") + addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") + addDumpTest(nv, "(*"+vt+")()\n") +} + +// TestDump executes all of the tests described by dumpTests. +func TestDump(t *testing.T) { + // Setup tests. + addIntDumpTests() + addUintDumpTests() + addBoolDumpTests() + addFloatDumpTests() + addComplexDumpTests() + addArrayDumpTests() + addSliceDumpTests() + addStringDumpTests() + addInterfaceDumpTests() + addMapDumpTests() + addStructDumpTests() + addUintptrDumpTests() + addUnsafePointerDumpTests() + addChanDumpTests() + addFuncDumpTests() + addCircularDumpTests() + addPanicDumpTests() + addErrorDumpTests() + addCgoDumpTests() + + t.Logf("Running %d tests", len(dumpTests)) + for i, test := range dumpTests { + buf := new(bytes.Buffer) + spew.Fdump(buf, test.in) + s := buf.String() + if testFailed(s, test.wants) { + t.Errorf("Dump #%d\n got: %s %s", i, s, stringizeWants(test.wants)) + continue + } + } +} + +func TestDumpSortedKeys(t *testing.T) { + cfg := spew.ConfigState{SortKeys: true} + s := cfg.Sdump(map[int]string{1: "1", 3: "3", 2: "2"}) + expected := "(map[int]string) (len=3) {\n(int) 1: (string) (len=1) " + + "\"1\",\n(int) 2: (string) (len=1) \"2\",\n(int) 3: (string) " + + "(len=1) \"3\"\n" + + "}\n" + if s != expected { + t.Errorf("Sorted keys mismatch:\n %v %v", s, expected) + } + + s = cfg.Sdump(map[stringer]int{"1": 1, "3": 3, "2": 2}) + expected = "(map[spew_test.stringer]int) (len=3) {\n" + + "(spew_test.stringer) (len=1) stringer 1: (int) 1,\n" + + "(spew_test.stringer) (len=1) stringer 2: (int) 2,\n" + + "(spew_test.stringer) (len=1) stringer 3: (int) 3\n" + + "}\n" + if s != expected { + t.Errorf("Sorted keys mismatch:\n %v %v", s, expected) + } + + s = cfg.Sdump(map[pstringer]int{pstringer("1"): 1, pstringer("3"): 3, pstringer("2"): 2}) + expected = "(map[spew_test.pstringer]int) (len=3) {\n" + + "(spew_test.pstringer) (len=1) stringer 1: (int) 1,\n" + + "(spew_test.pstringer) (len=1) stringer 2: (int) 2,\n" + + "(spew_test.pstringer) (len=1) stringer 3: (int) 3\n" + + "}\n" + if spew.UnsafeDisabled { + expected = "(map[spew_test.pstringer]int) (len=3) {\n" + + "(spew_test.pstringer) (len=1) \"1\": (int) 1,\n" + + "(spew_test.pstringer) (len=1) \"2\": (int) 2,\n" + + "(spew_test.pstringer) (len=1) \"3\": (int) 3\n" + + "}\n" + } + if s != expected { + t.Errorf("Sorted keys mismatch:\n %v %v", s, expected) + } + + s = cfg.Sdump(map[customError]int{customError(1): 1, customError(3): 3, customError(2): 2}) + expected = "(map[spew_test.customError]int) (len=3) {\n" + + "(spew_test.customError) error: 1: (int) 1,\n" + + "(spew_test.customError) error: 2: (int) 2,\n" + + "(spew_test.customError) error: 3: (int) 3\n" + + "}\n" + if s != expected { + t.Errorf("Sorted keys mismatch:\n %v %v", s, expected) + } + +} diff --git a/api/vendor/github.com/davecgh/go-spew/spew/dumpcgo_test.go b/api/vendor/github.com/davecgh/go-spew/spew/dumpcgo_test.go new file mode 100644 index 0000000..6ab1808 --- /dev/null +++ b/api/vendor/github.com/davecgh/go-spew/spew/dumpcgo_test.go @@ -0,0 +1,99 @@ +// Copyright (c) 2013-2016 Dave Collins +// +// 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. + +// NOTE: Due to the following build constraints, this file will only be compiled +// when both cgo is supported and "-tags testcgo" is added to the go test +// command line. This means the cgo tests are only added (and hence run) when +// specifially requested. This configuration is used because spew itself +// does not require cgo to run even though it does handle certain cgo types +// specially. Rather than forcing all clients to require cgo and an external +// C compiler just to run the tests, this scheme makes them optional. +// +build cgo,testcgo + +package spew_test + +import ( + "fmt" + + "github.com/davecgh/go-spew/spew/testdata" +) + +func addCgoDumpTests() { + // C char pointer. + v := testdata.GetCgoCharPointer() + nv := testdata.GetCgoNullCharPointer() + pv := &v + vcAddr := fmt.Sprintf("%p", v) + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "*testdata._Ctype_char" + vs := "116" + addDumpTest(v, "("+vt+")("+vcAddr+")("+vs+")\n") + addDumpTest(pv, "(*"+vt+")("+vAddr+"->"+vcAddr+")("+vs+")\n") + addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+"->"+vcAddr+")("+vs+")\n") + addDumpTest(nv, "("+vt+")()\n") + + // C char array. + v2, v2l, v2c := testdata.GetCgoCharArray() + v2Len := fmt.Sprintf("%d", v2l) + v2Cap := fmt.Sprintf("%d", v2c) + v2t := "[6]testdata._Ctype_char" + v2s := "(len=" + v2Len + " cap=" + v2Cap + ") " + + "{\n 00000000 74 65 73 74 32 00 " + + " |test2.|\n}" + addDumpTest(v2, "("+v2t+") "+v2s+"\n") + + // C unsigned char array. + v3, v3l, v3c := testdata.GetCgoUnsignedCharArray() + v3Len := fmt.Sprintf("%d", v3l) + v3Cap := fmt.Sprintf("%d", v3c) + v3t := "[6]testdata._Ctype_unsignedchar" + v3t2 := "[6]testdata._Ctype_uchar" + v3s := "(len=" + v3Len + " cap=" + v3Cap + ") " + + "{\n 00000000 74 65 73 74 33 00 " + + " |test3.|\n}" + addDumpTest(v3, "("+v3t+") "+v3s+"\n", "("+v3t2+") "+v3s+"\n") + + // C signed char array. + v4, v4l, v4c := testdata.GetCgoSignedCharArray() + v4Len := fmt.Sprintf("%d", v4l) + v4Cap := fmt.Sprintf("%d", v4c) + v4t := "[6]testdata._Ctype_schar" + v4t2 := "testdata._Ctype_schar" + v4s := "(len=" + v4Len + " cap=" + v4Cap + ") " + + "{\n (" + v4t2 + ") 116,\n (" + v4t2 + ") 101,\n (" + v4t2 + + ") 115,\n (" + v4t2 + ") 116,\n (" + v4t2 + ") 52,\n (" + v4t2 + + ") 0\n}" + addDumpTest(v4, "("+v4t+") "+v4s+"\n") + + // C uint8_t array. + v5, v5l, v5c := testdata.GetCgoUint8tArray() + v5Len := fmt.Sprintf("%d", v5l) + v5Cap := fmt.Sprintf("%d", v5c) + v5t := "[6]testdata._Ctype_uint8_t" + v5s := "(len=" + v5Len + " cap=" + v5Cap + ") " + + "{\n 00000000 74 65 73 74 35 00 " + + " |test5.|\n}" + addDumpTest(v5, "("+v5t+") "+v5s+"\n") + + // C typedefed unsigned char array. + v6, v6l, v6c := testdata.GetCgoTypdefedUnsignedCharArray() + v6Len := fmt.Sprintf("%d", v6l) + v6Cap := fmt.Sprintf("%d", v6c) + v6t := "[6]testdata._Ctype_custom_uchar_t" + v6s := "(len=" + v6Len + " cap=" + v6Cap + ") " + + "{\n 00000000 74 65 73 74 36 00 " + + " |test6.|\n}" + addDumpTest(v6, "("+v6t+") "+v6s+"\n") +} diff --git a/api/vendor/github.com/davecgh/go-spew/spew/dumpnocgo_test.go b/api/vendor/github.com/davecgh/go-spew/spew/dumpnocgo_test.go new file mode 100644 index 0000000..52a0971 --- /dev/null +++ b/api/vendor/github.com/davecgh/go-spew/spew/dumpnocgo_test.go @@ -0,0 +1,26 @@ +// Copyright (c) 2013 Dave Collins +// +// 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. + +// NOTE: Due to the following build constraints, this file will only be compiled +// when either cgo is not supported or "-tags testcgo" is not added to the go +// test command line. This file intentionally does not setup any cgo tests in +// this scenario. +// +build !cgo !testcgo + +package spew_test + +func addCgoDumpTests() { + // Don't add any tests for cgo since this file is only compiled when + // there should not be any cgo tests. +} diff --git a/api/vendor/github.com/davecgh/go-spew/spew/example_test.go b/api/vendor/github.com/davecgh/go-spew/spew/example_test.go new file mode 100644 index 0000000..c6ec8c6 --- /dev/null +++ b/api/vendor/github.com/davecgh/go-spew/spew/example_test.go @@ -0,0 +1,226 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * 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 spew_test + +import ( + "fmt" + + "github.com/davecgh/go-spew/spew" +) + +type Flag int + +const ( + flagOne Flag = iota + flagTwo +) + +var flagStrings = map[Flag]string{ + flagOne: "flagOne", + flagTwo: "flagTwo", +} + +func (f Flag) String() string { + if s, ok := flagStrings[f]; ok { + return s + } + return fmt.Sprintf("Unknown flag (%d)", int(f)) +} + +type Bar struct { + data uintptr +} + +type Foo struct { + unexportedField Bar + ExportedField map[interface{}]interface{} +} + +// This example demonstrates how to use Dump to dump variables to stdout. +func ExampleDump() { + // The following package level declarations are assumed for this example: + /* + type Flag int + + const ( + flagOne Flag = iota + flagTwo + ) + + var flagStrings = map[Flag]string{ + flagOne: "flagOne", + flagTwo: "flagTwo", + } + + func (f Flag) String() string { + if s, ok := flagStrings[f]; ok { + return s + } + return fmt.Sprintf("Unknown flag (%d)", int(f)) + } + + type Bar struct { + data uintptr + } + + type Foo struct { + unexportedField Bar + ExportedField map[interface{}]interface{} + } + */ + + // Setup some sample data structures for the example. + bar := Bar{uintptr(0)} + s1 := Foo{bar, map[interface{}]interface{}{"one": true}} + f := Flag(5) + b := []byte{ + 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, + 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, + 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, + 0x31, 0x32, + } + + // Dump! + spew.Dump(s1, f, b) + + // Output: + // (spew_test.Foo) { + // unexportedField: (spew_test.Bar) { + // data: (uintptr) + // }, + // ExportedField: (map[interface {}]interface {}) (len=1) { + // (string) (len=3) "one": (bool) true + // } + // } + // (spew_test.Flag) Unknown flag (5) + // ([]uint8) (len=34 cap=34) { + // 00000000 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 |............... | + // 00000010 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 |!"#$%&'()*+,-./0| + // 00000020 31 32 |12| + // } + // +} + +// This example demonstrates how to use Printf to display a variable with a +// format string and inline formatting. +func ExamplePrintf() { + // Create a double pointer to a uint 8. + ui8 := uint8(5) + pui8 := &ui8 + ppui8 := &pui8 + + // Create a circular data type. + type circular struct { + ui8 uint8 + c *circular + } + c := circular{ui8: 1} + c.c = &c + + // Print! + spew.Printf("ppui8: %v\n", ppui8) + spew.Printf("circular: %v\n", c) + + // Output: + // ppui8: <**>5 + // circular: {1 <*>{1 <*>}} +} + +// This example demonstrates how to use a ConfigState. +func ExampleConfigState() { + // Modify the indent level of the ConfigState only. The global + // configuration is not modified. + scs := spew.ConfigState{Indent: "\t"} + + // Output using the ConfigState instance. + v := map[string]int{"one": 1} + scs.Printf("v: %v\n", v) + scs.Dump(v) + + // Output: + // v: map[one:1] + // (map[string]int) (len=1) { + // (string) (len=3) "one": (int) 1 + // } +} + +// This example demonstrates how to use ConfigState.Dump to dump variables to +// stdout +func ExampleConfigState_Dump() { + // See the top-level Dump example for details on the types used in this + // example. + + // Create two ConfigState instances with different indentation. + scs := spew.ConfigState{Indent: "\t"} + scs2 := spew.ConfigState{Indent: " "} + + // Setup some sample data structures for the example. + bar := Bar{uintptr(0)} + s1 := Foo{bar, map[interface{}]interface{}{"one": true}} + + // Dump using the ConfigState instances. + scs.Dump(s1) + scs2.Dump(s1) + + // Output: + // (spew_test.Foo) { + // unexportedField: (spew_test.Bar) { + // data: (uintptr) + // }, + // ExportedField: (map[interface {}]interface {}) (len=1) { + // (string) (len=3) "one": (bool) true + // } + // } + // (spew_test.Foo) { + // unexportedField: (spew_test.Bar) { + // data: (uintptr) + // }, + // ExportedField: (map[interface {}]interface {}) (len=1) { + // (string) (len=3) "one": (bool) true + // } + // } + // +} + +// This example demonstrates how to use ConfigState.Printf to display a variable +// with a format string and inline formatting. +func ExampleConfigState_Printf() { + // See the top-level Dump example for details on the types used in this + // example. + + // Create two ConfigState instances and modify the method handling of the + // first ConfigState only. + scs := spew.NewDefaultConfig() + scs2 := spew.NewDefaultConfig() + scs.DisableMethods = true + + // Alternatively + // scs := spew.ConfigState{Indent: " ", DisableMethods: true} + // scs2 := spew.ConfigState{Indent: " "} + + // This is of type Flag which implements a Stringer and has raw value 1. + f := flagTwo + + // Dump using the ConfigState instances. + scs.Printf("f: %v\n", f) + scs2.Printf("f: %v\n", f) + + // Output: + // f: 1 + // f: flagTwo +} diff --git a/api/vendor/github.com/davecgh/go-spew/spew/format.go b/api/vendor/github.com/davecgh/go-spew/spew/format.go new file mode 100644 index 0000000..c49875b --- /dev/null +++ b/api/vendor/github.com/davecgh/go-spew/spew/format.go @@ -0,0 +1,419 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * 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 spew + +import ( + "bytes" + "fmt" + "reflect" + "strconv" + "strings" +) + +// supportedFlags is a list of all the character flags supported by fmt package. +const supportedFlags = "0-+# " + +// formatState implements the fmt.Formatter interface and contains information +// about the state of a formatting operation. The NewFormatter function can +// be used to get a new Formatter which can be used directly as arguments +// in standard fmt package printing calls. +type formatState struct { + value interface{} + fs fmt.State + depth int + pointers map[uintptr]int + ignoreNextType bool + cs *ConfigState +} + +// buildDefaultFormat recreates the original format string without precision +// and width information to pass in to fmt.Sprintf in the case of an +// unrecognized type. Unless new types are added to the language, this +// function won't ever be called. +func (f *formatState) buildDefaultFormat() (format string) { + buf := bytes.NewBuffer(percentBytes) + + for _, flag := range supportedFlags { + if f.fs.Flag(int(flag)) { + buf.WriteRune(flag) + } + } + + buf.WriteRune('v') + + format = buf.String() + return format +} + +// constructOrigFormat recreates the original format string including precision +// and width information to pass along to the standard fmt package. This allows +// automatic deferral of all format strings this package doesn't support. +func (f *formatState) constructOrigFormat(verb rune) (format string) { + buf := bytes.NewBuffer(percentBytes) + + for _, flag := range supportedFlags { + if f.fs.Flag(int(flag)) { + buf.WriteRune(flag) + } + } + + if width, ok := f.fs.Width(); ok { + buf.WriteString(strconv.Itoa(width)) + } + + if precision, ok := f.fs.Precision(); ok { + buf.Write(precisionBytes) + buf.WriteString(strconv.Itoa(precision)) + } + + buf.WriteRune(verb) + + format = buf.String() + return format +} + +// unpackValue returns values inside of non-nil interfaces when possible and +// ensures that types for values which have been unpacked from an interface +// are displayed when the show types flag is also set. +// This is useful for data types like structs, arrays, slices, and maps which +// can contain varying types packed inside an interface. +func (f *formatState) unpackValue(v reflect.Value) reflect.Value { + if v.Kind() == reflect.Interface { + f.ignoreNextType = false + if !v.IsNil() { + v = v.Elem() + } + } + return v +} + +// formatPtr handles formatting of pointers by indirecting them as necessary. +func (f *formatState) formatPtr(v reflect.Value) { + // Display nil if top level pointer is nil. + showTypes := f.fs.Flag('#') + if v.IsNil() && (!showTypes || f.ignoreNextType) { + f.fs.Write(nilAngleBytes) + return + } + + // Remove pointers at or below the current depth from map used to detect + // circular refs. + for k, depth := range f.pointers { + if depth >= f.depth { + delete(f.pointers, k) + } + } + + // Keep list of all dereferenced pointers to possibly show later. + pointerChain := make([]uintptr, 0) + + // Figure out how many levels of indirection there are by derferencing + // pointers and unpacking interfaces down the chain while detecting circular + // references. + nilFound := false + cycleFound := false + indirects := 0 + ve := v + for ve.Kind() == reflect.Ptr { + if ve.IsNil() { + nilFound = true + break + } + indirects++ + addr := ve.Pointer() + pointerChain = append(pointerChain, addr) + if pd, ok := f.pointers[addr]; ok && pd < f.depth { + cycleFound = true + indirects-- + break + } + f.pointers[addr] = f.depth + + ve = ve.Elem() + if ve.Kind() == reflect.Interface { + if ve.IsNil() { + nilFound = true + break + } + ve = ve.Elem() + } + } + + // Display type or indirection level depending on flags. + if showTypes && !f.ignoreNextType { + f.fs.Write(openParenBytes) + f.fs.Write(bytes.Repeat(asteriskBytes, indirects)) + f.fs.Write([]byte(ve.Type().String())) + f.fs.Write(closeParenBytes) + } else { + if nilFound || cycleFound { + indirects += strings.Count(ve.Type().String(), "*") + } + f.fs.Write(openAngleBytes) + f.fs.Write([]byte(strings.Repeat("*", indirects))) + f.fs.Write(closeAngleBytes) + } + + // Display pointer information depending on flags. + if f.fs.Flag('+') && (len(pointerChain) > 0) { + f.fs.Write(openParenBytes) + for i, addr := range pointerChain { + if i > 0 { + f.fs.Write(pointerChainBytes) + } + printHexPtr(f.fs, addr) + } + f.fs.Write(closeParenBytes) + } + + // Display dereferenced value. + switch { + case nilFound == true: + f.fs.Write(nilAngleBytes) + + case cycleFound == true: + f.fs.Write(circularShortBytes) + + default: + f.ignoreNextType = true + f.format(ve) + } +} + +// format is the main workhorse for providing the Formatter interface. It +// uses the passed reflect value to figure out what kind of object we are +// dealing with and formats it appropriately. It is a recursive function, +// however circular data structures are detected and handled properly. +func (f *formatState) format(v reflect.Value) { + // Handle invalid reflect values immediately. + kind := v.Kind() + if kind == reflect.Invalid { + f.fs.Write(invalidAngleBytes) + return + } + + // Handle pointers specially. + if kind == reflect.Ptr { + f.formatPtr(v) + return + } + + // Print type information unless already handled elsewhere. + if !f.ignoreNextType && f.fs.Flag('#') { + f.fs.Write(openParenBytes) + f.fs.Write([]byte(v.Type().String())) + f.fs.Write(closeParenBytes) + } + f.ignoreNextType = false + + // Call Stringer/error interfaces if they exist and the handle methods + // flag is enabled. + if !f.cs.DisableMethods { + if (kind != reflect.Invalid) && (kind != reflect.Interface) { + if handled := handleMethods(f.cs, f.fs, v); handled { + return + } + } + } + + switch kind { + case reflect.Invalid: + // Do nothing. We should never get here since invalid has already + // been handled above. + + case reflect.Bool: + printBool(f.fs, v.Bool()) + + case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int: + printInt(f.fs, v.Int(), 10) + + case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: + printUint(f.fs, v.Uint(), 10) + + case reflect.Float32: + printFloat(f.fs, v.Float(), 32) + + case reflect.Float64: + printFloat(f.fs, v.Float(), 64) + + case reflect.Complex64: + printComplex(f.fs, v.Complex(), 32) + + case reflect.Complex128: + printComplex(f.fs, v.Complex(), 64) + + case reflect.Slice: + if v.IsNil() { + f.fs.Write(nilAngleBytes) + break + } + fallthrough + + case reflect.Array: + f.fs.Write(openBracketBytes) + f.depth++ + if (f.cs.MaxDepth != 0) && (f.depth > f.cs.MaxDepth) { + f.fs.Write(maxShortBytes) + } else { + numEntries := v.Len() + for i := 0; i < numEntries; i++ { + if i > 0 { + f.fs.Write(spaceBytes) + } + f.ignoreNextType = true + f.format(f.unpackValue(v.Index(i))) + } + } + f.depth-- + f.fs.Write(closeBracketBytes) + + case reflect.String: + f.fs.Write([]byte(v.String())) + + case reflect.Interface: + // The only time we should get here is for nil interfaces due to + // unpackValue calls. + if v.IsNil() { + f.fs.Write(nilAngleBytes) + } + + case reflect.Ptr: + // Do nothing. We should never get here since pointers have already + // been handled above. + + case reflect.Map: + // nil maps should be indicated as different than empty maps + if v.IsNil() { + f.fs.Write(nilAngleBytes) + break + } + + f.fs.Write(openMapBytes) + f.depth++ + if (f.cs.MaxDepth != 0) && (f.depth > f.cs.MaxDepth) { + f.fs.Write(maxShortBytes) + } else { + keys := v.MapKeys() + if f.cs.SortKeys { + sortValues(keys, f.cs) + } + for i, key := range keys { + if i > 0 { + f.fs.Write(spaceBytes) + } + f.ignoreNextType = true + f.format(f.unpackValue(key)) + f.fs.Write(colonBytes) + f.ignoreNextType = true + f.format(f.unpackValue(v.MapIndex(key))) + } + } + f.depth-- + f.fs.Write(closeMapBytes) + + case reflect.Struct: + numFields := v.NumField() + f.fs.Write(openBraceBytes) + f.depth++ + if (f.cs.MaxDepth != 0) && (f.depth > f.cs.MaxDepth) { + f.fs.Write(maxShortBytes) + } else { + vt := v.Type() + for i := 0; i < numFields; i++ { + if i > 0 { + f.fs.Write(spaceBytes) + } + vtf := vt.Field(i) + if f.fs.Flag('+') || f.fs.Flag('#') { + f.fs.Write([]byte(vtf.Name)) + f.fs.Write(colonBytes) + } + f.format(f.unpackValue(v.Field(i))) + } + } + f.depth-- + f.fs.Write(closeBraceBytes) + + case reflect.Uintptr: + printHexPtr(f.fs, uintptr(v.Uint())) + + case reflect.UnsafePointer, reflect.Chan, reflect.Func: + printHexPtr(f.fs, v.Pointer()) + + // There were not any other types at the time this code was written, but + // fall back to letting the default fmt package handle it if any get added. + default: + format := f.buildDefaultFormat() + if v.CanInterface() { + fmt.Fprintf(f.fs, format, v.Interface()) + } else { + fmt.Fprintf(f.fs, format, v.String()) + } + } +} + +// Format satisfies the fmt.Formatter interface. See NewFormatter for usage +// details. +func (f *formatState) Format(fs fmt.State, verb rune) { + f.fs = fs + + // Use standard formatting for verbs that are not v. + if verb != 'v' { + format := f.constructOrigFormat(verb) + fmt.Fprintf(fs, format, f.value) + return + } + + if f.value == nil { + if fs.Flag('#') { + fs.Write(interfaceBytes) + } + fs.Write(nilAngleBytes) + return + } + + f.format(reflect.ValueOf(f.value)) +} + +// newFormatter is a helper function to consolidate the logic from the various +// public methods which take varying config states. +func newFormatter(cs *ConfigState, v interface{}) fmt.Formatter { + fs := &formatState{value: v, cs: cs} + fs.pointers = make(map[uintptr]int) + return fs +} + +/* +NewFormatter returns a custom formatter that satisfies the fmt.Formatter +interface. As a result, it integrates cleanly with standard fmt package +printing functions. The formatter is useful for inline printing of smaller data +types similar to the standard %v format specifier. + +The custom formatter only responds to the %v (most compact), %+v (adds pointer +addresses), %#v (adds types), or %#+v (adds types and pointer addresses) verb +combinations. Any other verbs such as %x and %q will be sent to the the +standard fmt package for formatting. In addition, the custom formatter ignores +the width and precision arguments (however they will still work on the format +specifiers not handled by the custom formatter). + +Typically this function shouldn't be called directly. It is much easier to make +use of the custom formatter by calling one of the convenience functions such as +Printf, Println, or Fprintf. +*/ +func NewFormatter(v interface{}) fmt.Formatter { + return newFormatter(&Config, v) +} diff --git a/api/vendor/github.com/davecgh/go-spew/spew/format_test.go b/api/vendor/github.com/davecgh/go-spew/spew/format_test.go new file mode 100644 index 0000000..f9b93ab --- /dev/null +++ b/api/vendor/github.com/davecgh/go-spew/spew/format_test.go @@ -0,0 +1,1558 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * 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. + */ + +/* +Test Summary: +NOTE: For each test, a nil pointer, a single pointer and double pointer to the +base test element are also tested to ensure proper indirection across all types. + +- Max int8, int16, int32, int64, int +- Max uint8, uint16, uint32, uint64, uint +- Boolean true and false +- Standard complex64 and complex128 +- Array containing standard ints +- Array containing type with custom formatter on pointer receiver only +- Array containing interfaces +- Slice containing standard float32 values +- Slice containing type with custom formatter on pointer receiver only +- Slice containing interfaces +- Nil slice +- Standard string +- Nil interface +- Sub-interface +- Map with string keys and int vals +- Map with custom formatter type on pointer receiver only keys and vals +- Map with interface keys and values +- Map with nil interface value +- Struct with primitives +- Struct that contains another struct +- Struct that contains custom type with Stringer pointer interface via both + exported and unexported fields +- Struct that contains embedded struct and field to same struct +- Uintptr to 0 (null pointer) +- Uintptr address of real variable +- Unsafe.Pointer to 0 (null pointer) +- Unsafe.Pointer to address of real variable +- Nil channel +- Standard int channel +- Function with no params and no returns +- Function with param and no returns +- Function with multiple params and multiple returns +- Struct that is circular through self referencing +- Structs that are circular through cross referencing +- Structs that are indirectly circular +- Type that panics in its Stringer interface +- Type that has a custom Error interface +- %x passthrough with uint +- %#x passthrough with uint +- %f passthrough with precision +- %f passthrough with width and precision +- %d passthrough with width +- %q passthrough with string +*/ + +package spew_test + +import ( + "bytes" + "fmt" + "testing" + "unsafe" + + "github.com/davecgh/go-spew/spew" +) + +// formatterTest is used to describe a test to be performed against NewFormatter. +type formatterTest struct { + format string + in interface{} + wants []string +} + +// formatterTests houses all of the tests to be performed against NewFormatter. +var formatterTests = make([]formatterTest, 0) + +// addFormatterTest is a helper method to append the passed input and desired +// result to formatterTests. +func addFormatterTest(format string, in interface{}, wants ...string) { + test := formatterTest{format, in, wants} + formatterTests = append(formatterTests, test) +} + +func addIntFormatterTests() { + // Max int8. + v := int8(127) + nv := (*int8)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "int8" + vs := "127" + addFormatterTest("%v", v, vs) + addFormatterTest("%v", pv, "<*>"+vs) + addFormatterTest("%v", &pv, "<**>"+vs) + addFormatterTest("%v", nv, "") + addFormatterTest("%+v", v, vs) + addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) + addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%#v", v, "("+vt+")"+vs) + addFormatterTest("%#v", pv, "(*"+vt+")"+vs) + addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) + addFormatterTest("%#v", nv, "(*"+vt+")"+"") + addFormatterTest("%#+v", v, "("+vt+")"+vs) + addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) + addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%#+v", nv, "(*"+vt+")"+"") + + // Max int16. + v2 := int16(32767) + nv2 := (*int16)(nil) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "int16" + v2s := "32767" + addFormatterTest("%v", v2, v2s) + addFormatterTest("%v", pv2, "<*>"+v2s) + addFormatterTest("%v", &pv2, "<**>"+v2s) + addFormatterTest("%v", nv2, "") + addFormatterTest("%+v", v2, v2s) + addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) + addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) + addFormatterTest("%+v", nv2, "") + addFormatterTest("%#v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) + addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) + addFormatterTest("%#v", nv2, "(*"+v2t+")"+"") + addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) + addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) + addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"") + + // Max int32. + v3 := int32(2147483647) + nv3 := (*int32)(nil) + pv3 := &v3 + v3Addr := fmt.Sprintf("%p", pv3) + pv3Addr := fmt.Sprintf("%p", &pv3) + v3t := "int32" + v3s := "2147483647" + addFormatterTest("%v", v3, v3s) + addFormatterTest("%v", pv3, "<*>"+v3s) + addFormatterTest("%v", &pv3, "<**>"+v3s) + addFormatterTest("%v", nv3, "") + addFormatterTest("%+v", v3, v3s) + addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s) + addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s) + addFormatterTest("%+v", nv3, "") + addFormatterTest("%#v", v3, "("+v3t+")"+v3s) + addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s) + addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s) + addFormatterTest("%#v", nv3, "(*"+v3t+")"+"") + addFormatterTest("%#+v", v3, "("+v3t+")"+v3s) + addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s) + addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s) + addFormatterTest("%#v", nv3, "(*"+v3t+")"+"") + + // Max int64. + v4 := int64(9223372036854775807) + nv4 := (*int64)(nil) + pv4 := &v4 + v4Addr := fmt.Sprintf("%p", pv4) + pv4Addr := fmt.Sprintf("%p", &pv4) + v4t := "int64" + v4s := "9223372036854775807" + addFormatterTest("%v", v4, v4s) + addFormatterTest("%v", pv4, "<*>"+v4s) + addFormatterTest("%v", &pv4, "<**>"+v4s) + addFormatterTest("%v", nv4, "") + addFormatterTest("%+v", v4, v4s) + addFormatterTest("%+v", pv4, "<*>("+v4Addr+")"+v4s) + addFormatterTest("%+v", &pv4, "<**>("+pv4Addr+"->"+v4Addr+")"+v4s) + addFormatterTest("%+v", nv4, "") + addFormatterTest("%#v", v4, "("+v4t+")"+v4s) + addFormatterTest("%#v", pv4, "(*"+v4t+")"+v4s) + addFormatterTest("%#v", &pv4, "(**"+v4t+")"+v4s) + addFormatterTest("%#v", nv4, "(*"+v4t+")"+"") + addFormatterTest("%#+v", v4, "("+v4t+")"+v4s) + addFormatterTest("%#+v", pv4, "(*"+v4t+")("+v4Addr+")"+v4s) + addFormatterTest("%#+v", &pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")"+v4s) + addFormatterTest("%#+v", nv4, "(*"+v4t+")"+"") + + // Max int. + v5 := int(2147483647) + nv5 := (*int)(nil) + pv5 := &v5 + v5Addr := fmt.Sprintf("%p", pv5) + pv5Addr := fmt.Sprintf("%p", &pv5) + v5t := "int" + v5s := "2147483647" + addFormatterTest("%v", v5, v5s) + addFormatterTest("%v", pv5, "<*>"+v5s) + addFormatterTest("%v", &pv5, "<**>"+v5s) + addFormatterTest("%v", nv5, "") + addFormatterTest("%+v", v5, v5s) + addFormatterTest("%+v", pv5, "<*>("+v5Addr+")"+v5s) + addFormatterTest("%+v", &pv5, "<**>("+pv5Addr+"->"+v5Addr+")"+v5s) + addFormatterTest("%+v", nv5, "") + addFormatterTest("%#v", v5, "("+v5t+")"+v5s) + addFormatterTest("%#v", pv5, "(*"+v5t+")"+v5s) + addFormatterTest("%#v", &pv5, "(**"+v5t+")"+v5s) + addFormatterTest("%#v", nv5, "(*"+v5t+")"+"") + addFormatterTest("%#+v", v5, "("+v5t+")"+v5s) + addFormatterTest("%#+v", pv5, "(*"+v5t+")("+v5Addr+")"+v5s) + addFormatterTest("%#+v", &pv5, "(**"+v5t+")("+pv5Addr+"->"+v5Addr+")"+v5s) + addFormatterTest("%#+v", nv5, "(*"+v5t+")"+"") +} + +func addUintFormatterTests() { + // Max uint8. + v := uint8(255) + nv := (*uint8)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "uint8" + vs := "255" + addFormatterTest("%v", v, vs) + addFormatterTest("%v", pv, "<*>"+vs) + addFormatterTest("%v", &pv, "<**>"+vs) + addFormatterTest("%v", nv, "") + addFormatterTest("%+v", v, vs) + addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) + addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%#v", v, "("+vt+")"+vs) + addFormatterTest("%#v", pv, "(*"+vt+")"+vs) + addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) + addFormatterTest("%#v", nv, "(*"+vt+")"+"") + addFormatterTest("%#+v", v, "("+vt+")"+vs) + addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) + addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%#+v", nv, "(*"+vt+")"+"") + + // Max uint16. + v2 := uint16(65535) + nv2 := (*uint16)(nil) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "uint16" + v2s := "65535" + addFormatterTest("%v", v2, v2s) + addFormatterTest("%v", pv2, "<*>"+v2s) + addFormatterTest("%v", &pv2, "<**>"+v2s) + addFormatterTest("%v", nv2, "") + addFormatterTest("%+v", v2, v2s) + addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) + addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) + addFormatterTest("%+v", nv2, "") + addFormatterTest("%#v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) + addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) + addFormatterTest("%#v", nv2, "(*"+v2t+")"+"") + addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) + addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) + addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"") + + // Max uint32. + v3 := uint32(4294967295) + nv3 := (*uint32)(nil) + pv3 := &v3 + v3Addr := fmt.Sprintf("%p", pv3) + pv3Addr := fmt.Sprintf("%p", &pv3) + v3t := "uint32" + v3s := "4294967295" + addFormatterTest("%v", v3, v3s) + addFormatterTest("%v", pv3, "<*>"+v3s) + addFormatterTest("%v", &pv3, "<**>"+v3s) + addFormatterTest("%v", nv3, "") + addFormatterTest("%+v", v3, v3s) + addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s) + addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s) + addFormatterTest("%+v", nv3, "") + addFormatterTest("%#v", v3, "("+v3t+")"+v3s) + addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s) + addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s) + addFormatterTest("%#v", nv3, "(*"+v3t+")"+"") + addFormatterTest("%#+v", v3, "("+v3t+")"+v3s) + addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s) + addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s) + addFormatterTest("%#v", nv3, "(*"+v3t+")"+"") + + // Max uint64. + v4 := uint64(18446744073709551615) + nv4 := (*uint64)(nil) + pv4 := &v4 + v4Addr := fmt.Sprintf("%p", pv4) + pv4Addr := fmt.Sprintf("%p", &pv4) + v4t := "uint64" + v4s := "18446744073709551615" + addFormatterTest("%v", v4, v4s) + addFormatterTest("%v", pv4, "<*>"+v4s) + addFormatterTest("%v", &pv4, "<**>"+v4s) + addFormatterTest("%v", nv4, "") + addFormatterTest("%+v", v4, v4s) + addFormatterTest("%+v", pv4, "<*>("+v4Addr+")"+v4s) + addFormatterTest("%+v", &pv4, "<**>("+pv4Addr+"->"+v4Addr+")"+v4s) + addFormatterTest("%+v", nv4, "") + addFormatterTest("%#v", v4, "("+v4t+")"+v4s) + addFormatterTest("%#v", pv4, "(*"+v4t+")"+v4s) + addFormatterTest("%#v", &pv4, "(**"+v4t+")"+v4s) + addFormatterTest("%#v", nv4, "(*"+v4t+")"+"") + addFormatterTest("%#+v", v4, "("+v4t+")"+v4s) + addFormatterTest("%#+v", pv4, "(*"+v4t+")("+v4Addr+")"+v4s) + addFormatterTest("%#+v", &pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")"+v4s) + addFormatterTest("%#+v", nv4, "(*"+v4t+")"+"") + + // Max uint. + v5 := uint(4294967295) + nv5 := (*uint)(nil) + pv5 := &v5 + v5Addr := fmt.Sprintf("%p", pv5) + pv5Addr := fmt.Sprintf("%p", &pv5) + v5t := "uint" + v5s := "4294967295" + addFormatterTest("%v", v5, v5s) + addFormatterTest("%v", pv5, "<*>"+v5s) + addFormatterTest("%v", &pv5, "<**>"+v5s) + addFormatterTest("%v", nv5, "") + addFormatterTest("%+v", v5, v5s) + addFormatterTest("%+v", pv5, "<*>("+v5Addr+")"+v5s) + addFormatterTest("%+v", &pv5, "<**>("+pv5Addr+"->"+v5Addr+")"+v5s) + addFormatterTest("%+v", nv5, "") + addFormatterTest("%#v", v5, "("+v5t+")"+v5s) + addFormatterTest("%#v", pv5, "(*"+v5t+")"+v5s) + addFormatterTest("%#v", &pv5, "(**"+v5t+")"+v5s) + addFormatterTest("%#v", nv5, "(*"+v5t+")"+"") + addFormatterTest("%#+v", v5, "("+v5t+")"+v5s) + addFormatterTest("%#+v", pv5, "(*"+v5t+")("+v5Addr+")"+v5s) + addFormatterTest("%#+v", &pv5, "(**"+v5t+")("+pv5Addr+"->"+v5Addr+")"+v5s) + addFormatterTest("%#v", nv5, "(*"+v5t+")"+"") +} + +func addBoolFormatterTests() { + // Boolean true. + v := bool(true) + nv := (*bool)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "bool" + vs := "true" + addFormatterTest("%v", v, vs) + addFormatterTest("%v", pv, "<*>"+vs) + addFormatterTest("%v", &pv, "<**>"+vs) + addFormatterTest("%v", nv, "") + addFormatterTest("%+v", v, vs) + addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) + addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%#v", v, "("+vt+")"+vs) + addFormatterTest("%#v", pv, "(*"+vt+")"+vs) + addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) + addFormatterTest("%#v", nv, "(*"+vt+")"+"") + addFormatterTest("%#+v", v, "("+vt+")"+vs) + addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) + addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%#+v", nv, "(*"+vt+")"+"") + + // Boolean false. + v2 := bool(false) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "bool" + v2s := "false" + addFormatterTest("%v", v2, v2s) + addFormatterTest("%v", pv2, "<*>"+v2s) + addFormatterTest("%v", &pv2, "<**>"+v2s) + addFormatterTest("%+v", v2, v2s) + addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) + addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) + addFormatterTest("%#v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) + addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) + addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) + addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) +} + +func addFloatFormatterTests() { + // Standard float32. + v := float32(3.1415) + nv := (*float32)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "float32" + vs := "3.1415" + addFormatterTest("%v", v, vs) + addFormatterTest("%v", pv, "<*>"+vs) + addFormatterTest("%v", &pv, "<**>"+vs) + addFormatterTest("%v", nv, "") + addFormatterTest("%+v", v, vs) + addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) + addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%#v", v, "("+vt+")"+vs) + addFormatterTest("%#v", pv, "(*"+vt+")"+vs) + addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) + addFormatterTest("%#v", nv, "(*"+vt+")"+"") + addFormatterTest("%#+v", v, "("+vt+")"+vs) + addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) + addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%#+v", nv, "(*"+vt+")"+"") + + // Standard float64. + v2 := float64(3.1415926) + nv2 := (*float64)(nil) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "float64" + v2s := "3.1415926" + addFormatterTest("%v", v2, v2s) + addFormatterTest("%v", pv2, "<*>"+v2s) + addFormatterTest("%v", &pv2, "<**>"+v2s) + addFormatterTest("%+v", nv2, "") + addFormatterTest("%+v", v2, v2s) + addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) + addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) + addFormatterTest("%+v", nv2, "") + addFormatterTest("%#v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) + addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) + addFormatterTest("%#v", nv2, "(*"+v2t+")"+"") + addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) + addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) + addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"") +} + +func addComplexFormatterTests() { + // Standard complex64. + v := complex(float32(6), -2) + nv := (*complex64)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "complex64" + vs := "(6-2i)" + addFormatterTest("%v", v, vs) + addFormatterTest("%v", pv, "<*>"+vs) + addFormatterTest("%v", &pv, "<**>"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%+v", v, vs) + addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) + addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%#v", v, "("+vt+")"+vs) + addFormatterTest("%#v", pv, "(*"+vt+")"+vs) + addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) + addFormatterTest("%#v", nv, "(*"+vt+")"+"") + addFormatterTest("%#+v", v, "("+vt+")"+vs) + addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) + addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%#+v", nv, "(*"+vt+")"+"") + + // Standard complex128. + v2 := complex(float64(-6), 2) + nv2 := (*complex128)(nil) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "complex128" + v2s := "(-6+2i)" + addFormatterTest("%v", v2, v2s) + addFormatterTest("%v", pv2, "<*>"+v2s) + addFormatterTest("%v", &pv2, "<**>"+v2s) + addFormatterTest("%+v", nv2, "") + addFormatterTest("%+v", v2, v2s) + addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) + addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) + addFormatterTest("%+v", nv2, "") + addFormatterTest("%#v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) + addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) + addFormatterTest("%#v", nv2, "(*"+v2t+")"+"") + addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) + addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) + addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"") +} + +func addArrayFormatterTests() { + // Array containing standard ints. + v := [3]int{1, 2, 3} + nv := (*[3]int)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "[3]int" + vs := "[1 2 3]" + addFormatterTest("%v", v, vs) + addFormatterTest("%v", pv, "<*>"+vs) + addFormatterTest("%v", &pv, "<**>"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%+v", v, vs) + addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) + addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%#v", v, "("+vt+")"+vs) + addFormatterTest("%#v", pv, "(*"+vt+")"+vs) + addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) + addFormatterTest("%#v", nv, "(*"+vt+")"+"") + addFormatterTest("%#+v", v, "("+vt+")"+vs) + addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) + addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%#+v", nv, "(*"+vt+")"+"") + + // Array containing type with custom formatter on pointer receiver only. + v2 := [3]pstringer{"1", "2", "3"} + nv2 := (*[3]pstringer)(nil) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "[3]spew_test.pstringer" + v2sp := "[stringer 1 stringer 2 stringer 3]" + v2s := v2sp + if spew.UnsafeDisabled { + v2s = "[1 2 3]" + } + addFormatterTest("%v", v2, v2s) + addFormatterTest("%v", pv2, "<*>"+v2sp) + addFormatterTest("%v", &pv2, "<**>"+v2sp) + addFormatterTest("%+v", nv2, "") + addFormatterTest("%+v", v2, v2s) + addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2sp) + addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2sp) + addFormatterTest("%+v", nv2, "") + addFormatterTest("%#v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2sp) + addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2sp) + addFormatterTest("%#v", nv2, "(*"+v2t+")"+"") + addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2sp) + addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2sp) + addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"") + + // Array containing interfaces. + v3 := [3]interface{}{"one", int(2), uint(3)} + nv3 := (*[3]interface{})(nil) + pv3 := &v3 + v3Addr := fmt.Sprintf("%p", pv3) + pv3Addr := fmt.Sprintf("%p", &pv3) + v3t := "[3]interface {}" + v3t2 := "string" + v3t3 := "int" + v3t4 := "uint" + v3s := "[one 2 3]" + v3s2 := "[(" + v3t2 + ")one (" + v3t3 + ")2 (" + v3t4 + ")3]" + addFormatterTest("%v", v3, v3s) + addFormatterTest("%v", pv3, "<*>"+v3s) + addFormatterTest("%v", &pv3, "<**>"+v3s) + addFormatterTest("%+v", nv3, "") + addFormatterTest("%+v", v3, v3s) + addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s) + addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s) + addFormatterTest("%+v", nv3, "") + addFormatterTest("%#v", v3, "("+v3t+")"+v3s2) + addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s2) + addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s2) + addFormatterTest("%#v", nv3, "(*"+v3t+")"+"") + addFormatterTest("%#+v", v3, "("+v3t+")"+v3s2) + addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s2) + addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s2) + addFormatterTest("%#+v", nv3, "(*"+v3t+")"+"") +} + +func addSliceFormatterTests() { + // Slice containing standard float32 values. + v := []float32{3.14, 6.28, 12.56} + nv := (*[]float32)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "[]float32" + vs := "[3.14 6.28 12.56]" + addFormatterTest("%v", v, vs) + addFormatterTest("%v", pv, "<*>"+vs) + addFormatterTest("%v", &pv, "<**>"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%+v", v, vs) + addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) + addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%#v", v, "("+vt+")"+vs) + addFormatterTest("%#v", pv, "(*"+vt+")"+vs) + addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) + addFormatterTest("%#v", nv, "(*"+vt+")"+"") + addFormatterTest("%#+v", v, "("+vt+")"+vs) + addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) + addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%#+v", nv, "(*"+vt+")"+"") + + // Slice containing type with custom formatter on pointer receiver only. + v2 := []pstringer{"1", "2", "3"} + nv2 := (*[]pstringer)(nil) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "[]spew_test.pstringer" + v2s := "[stringer 1 stringer 2 stringer 3]" + addFormatterTest("%v", v2, v2s) + addFormatterTest("%v", pv2, "<*>"+v2s) + addFormatterTest("%v", &pv2, "<**>"+v2s) + addFormatterTest("%+v", nv2, "") + addFormatterTest("%+v", v2, v2s) + addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) + addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) + addFormatterTest("%+v", nv2, "") + addFormatterTest("%#v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) + addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) + addFormatterTest("%#v", nv2, "(*"+v2t+")"+"") + addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) + addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) + addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"") + + // Slice containing interfaces. + v3 := []interface{}{"one", int(2), uint(3), nil} + nv3 := (*[]interface{})(nil) + pv3 := &v3 + v3Addr := fmt.Sprintf("%p", pv3) + pv3Addr := fmt.Sprintf("%p", &pv3) + v3t := "[]interface {}" + v3t2 := "string" + v3t3 := "int" + v3t4 := "uint" + v3t5 := "interface {}" + v3s := "[one 2 3 ]" + v3s2 := "[(" + v3t2 + ")one (" + v3t3 + ")2 (" + v3t4 + ")3 (" + v3t5 + + ")]" + addFormatterTest("%v", v3, v3s) + addFormatterTest("%v", pv3, "<*>"+v3s) + addFormatterTest("%v", &pv3, "<**>"+v3s) + addFormatterTest("%+v", nv3, "") + addFormatterTest("%+v", v3, v3s) + addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s) + addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s) + addFormatterTest("%+v", nv3, "") + addFormatterTest("%#v", v3, "("+v3t+")"+v3s2) + addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s2) + addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s2) + addFormatterTest("%#v", nv3, "(*"+v3t+")"+"") + addFormatterTest("%#+v", v3, "("+v3t+")"+v3s2) + addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s2) + addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s2) + addFormatterTest("%#+v", nv3, "(*"+v3t+")"+"") + + // Nil slice. + var v4 []int + nv4 := (*[]int)(nil) + pv4 := &v4 + v4Addr := fmt.Sprintf("%p", pv4) + pv4Addr := fmt.Sprintf("%p", &pv4) + v4t := "[]int" + v4s := "" + addFormatterTest("%v", v4, v4s) + addFormatterTest("%v", pv4, "<*>"+v4s) + addFormatterTest("%v", &pv4, "<**>"+v4s) + addFormatterTest("%+v", nv4, "") + addFormatterTest("%+v", v4, v4s) + addFormatterTest("%+v", pv4, "<*>("+v4Addr+")"+v4s) + addFormatterTest("%+v", &pv4, "<**>("+pv4Addr+"->"+v4Addr+")"+v4s) + addFormatterTest("%+v", nv4, "") + addFormatterTest("%#v", v4, "("+v4t+")"+v4s) + addFormatterTest("%#v", pv4, "(*"+v4t+")"+v4s) + addFormatterTest("%#v", &pv4, "(**"+v4t+")"+v4s) + addFormatterTest("%#v", nv4, "(*"+v4t+")"+"") + addFormatterTest("%#+v", v4, "("+v4t+")"+v4s) + addFormatterTest("%#+v", pv4, "(*"+v4t+")("+v4Addr+")"+v4s) + addFormatterTest("%#+v", &pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")"+v4s) + addFormatterTest("%#+v", nv4, "(*"+v4t+")"+"") +} + +func addStringFormatterTests() { + // Standard string. + v := "test" + nv := (*string)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "string" + vs := "test" + addFormatterTest("%v", v, vs) + addFormatterTest("%v", pv, "<*>"+vs) + addFormatterTest("%v", &pv, "<**>"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%+v", v, vs) + addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) + addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%#v", v, "("+vt+")"+vs) + addFormatterTest("%#v", pv, "(*"+vt+")"+vs) + addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) + addFormatterTest("%#v", nv, "(*"+vt+")"+"") + addFormatterTest("%#+v", v, "("+vt+")"+vs) + addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) + addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%#+v", nv, "(*"+vt+")"+"") +} + +func addInterfaceFormatterTests() { + // Nil interface. + var v interface{} + nv := (*interface{})(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "interface {}" + vs := "" + addFormatterTest("%v", v, vs) + addFormatterTest("%v", pv, "<*>"+vs) + addFormatterTest("%v", &pv, "<**>"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%+v", v, vs) + addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) + addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%#v", v, "("+vt+")"+vs) + addFormatterTest("%#v", pv, "(*"+vt+")"+vs) + addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) + addFormatterTest("%#v", nv, "(*"+vt+")"+"") + addFormatterTest("%#+v", v, "("+vt+")"+vs) + addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) + addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%#+v", nv, "(*"+vt+")"+"") + + // Sub-interface. + v2 := interface{}(uint16(65535)) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "uint16" + v2s := "65535" + addFormatterTest("%v", v2, v2s) + addFormatterTest("%v", pv2, "<*>"+v2s) + addFormatterTest("%v", &pv2, "<**>"+v2s) + addFormatterTest("%+v", v2, v2s) + addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) + addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) + addFormatterTest("%#v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) + addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) + addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) + addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) +} + +func addMapFormatterTests() { + // Map with string keys and int vals. + v := map[string]int{"one": 1, "two": 2} + nilMap := map[string]int(nil) + nv := (*map[string]int)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "map[string]int" + vs := "map[one:1 two:2]" + vs2 := "map[two:2 one:1]" + addFormatterTest("%v", v, vs, vs2) + addFormatterTest("%v", pv, "<*>"+vs, "<*>"+vs2) + addFormatterTest("%v", &pv, "<**>"+vs, "<**>"+vs2) + addFormatterTest("%+v", nilMap, "") + addFormatterTest("%+v", nv, "") + addFormatterTest("%+v", v, vs, vs2) + addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs, "<*>("+vAddr+")"+vs2) + addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs, + "<**>("+pvAddr+"->"+vAddr+")"+vs2) + addFormatterTest("%+v", nilMap, "") + addFormatterTest("%+v", nv, "") + addFormatterTest("%#v", v, "("+vt+")"+vs, "("+vt+")"+vs2) + addFormatterTest("%#v", pv, "(*"+vt+")"+vs, "(*"+vt+")"+vs2) + addFormatterTest("%#v", &pv, "(**"+vt+")"+vs, "(**"+vt+")"+vs2) + addFormatterTest("%#v", nilMap, "("+vt+")"+"") + addFormatterTest("%#v", nv, "(*"+vt+")"+"") + addFormatterTest("%#+v", v, "("+vt+")"+vs, "("+vt+")"+vs2) + addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs, + "(*"+vt+")("+vAddr+")"+vs2) + addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs, + "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs2) + addFormatterTest("%#+v", nilMap, "("+vt+")"+"") + addFormatterTest("%#+v", nv, "(*"+vt+")"+"") + + // Map with custom formatter type on pointer receiver only keys and vals. + v2 := map[pstringer]pstringer{"one": "1"} + nv2 := (*map[pstringer]pstringer)(nil) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "map[spew_test.pstringer]spew_test.pstringer" + v2s := "map[stringer one:stringer 1]" + if spew.UnsafeDisabled { + v2s = "map[one:1]" + } + addFormatterTest("%v", v2, v2s) + addFormatterTest("%v", pv2, "<*>"+v2s) + addFormatterTest("%v", &pv2, "<**>"+v2s) + addFormatterTest("%+v", nv2, "") + addFormatterTest("%+v", v2, v2s) + addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) + addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) + addFormatterTest("%+v", nv2, "") + addFormatterTest("%#v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) + addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) + addFormatterTest("%#v", nv2, "(*"+v2t+")"+"") + addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) + addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) + addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"") + + // Map with interface keys and values. + v3 := map[interface{}]interface{}{"one": 1} + nv3 := (*map[interface{}]interface{})(nil) + pv3 := &v3 + v3Addr := fmt.Sprintf("%p", pv3) + pv3Addr := fmt.Sprintf("%p", &pv3) + v3t := "map[interface {}]interface {}" + v3t1 := "string" + v3t2 := "int" + v3s := "map[one:1]" + v3s2 := "map[(" + v3t1 + ")one:(" + v3t2 + ")1]" + addFormatterTest("%v", v3, v3s) + addFormatterTest("%v", pv3, "<*>"+v3s) + addFormatterTest("%v", &pv3, "<**>"+v3s) + addFormatterTest("%+v", nv3, "") + addFormatterTest("%+v", v3, v3s) + addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s) + addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s) + addFormatterTest("%+v", nv3, "") + addFormatterTest("%#v", v3, "("+v3t+")"+v3s2) + addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s2) + addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s2) + addFormatterTest("%#v", nv3, "(*"+v3t+")"+"") + addFormatterTest("%#+v", v3, "("+v3t+")"+v3s2) + addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s2) + addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s2) + addFormatterTest("%#+v", nv3, "(*"+v3t+")"+"") + + // Map with nil interface value + v4 := map[string]interface{}{"nil": nil} + nv4 := (*map[string]interface{})(nil) + pv4 := &v4 + v4Addr := fmt.Sprintf("%p", pv4) + pv4Addr := fmt.Sprintf("%p", &pv4) + v4t := "map[string]interface {}" + v4t1 := "interface {}" + v4s := "map[nil:]" + v4s2 := "map[nil:(" + v4t1 + ")]" + addFormatterTest("%v", v4, v4s) + addFormatterTest("%v", pv4, "<*>"+v4s) + addFormatterTest("%v", &pv4, "<**>"+v4s) + addFormatterTest("%+v", nv4, "") + addFormatterTest("%+v", v4, v4s) + addFormatterTest("%+v", pv4, "<*>("+v4Addr+")"+v4s) + addFormatterTest("%+v", &pv4, "<**>("+pv4Addr+"->"+v4Addr+")"+v4s) + addFormatterTest("%+v", nv4, "") + addFormatterTest("%#v", v4, "("+v4t+")"+v4s2) + addFormatterTest("%#v", pv4, "(*"+v4t+")"+v4s2) + addFormatterTest("%#v", &pv4, "(**"+v4t+")"+v4s2) + addFormatterTest("%#v", nv4, "(*"+v4t+")"+"") + addFormatterTest("%#+v", v4, "("+v4t+")"+v4s2) + addFormatterTest("%#+v", pv4, "(*"+v4t+")("+v4Addr+")"+v4s2) + addFormatterTest("%#+v", &pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")"+v4s2) + addFormatterTest("%#+v", nv4, "(*"+v4t+")"+"") +} + +func addStructFormatterTests() { + // Struct with primitives. + type s1 struct { + a int8 + b uint8 + } + v := s1{127, 255} + nv := (*s1)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "spew_test.s1" + vt2 := "int8" + vt3 := "uint8" + vs := "{127 255}" + vs2 := "{a:127 b:255}" + vs3 := "{a:(" + vt2 + ")127 b:(" + vt3 + ")255}" + addFormatterTest("%v", v, vs) + addFormatterTest("%v", pv, "<*>"+vs) + addFormatterTest("%v", &pv, "<**>"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%+v", v, vs2) + addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs2) + addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs2) + addFormatterTest("%+v", nv, "") + addFormatterTest("%#v", v, "("+vt+")"+vs3) + addFormatterTest("%#v", pv, "(*"+vt+")"+vs3) + addFormatterTest("%#v", &pv, "(**"+vt+")"+vs3) + addFormatterTest("%#v", nv, "(*"+vt+")"+"") + addFormatterTest("%#+v", v, "("+vt+")"+vs3) + addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs3) + addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs3) + addFormatterTest("%#+v", nv, "(*"+vt+")"+"") + + // Struct that contains another struct. + type s2 struct { + s1 s1 + b bool + } + v2 := s2{s1{127, 255}, true} + nv2 := (*s2)(nil) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "spew_test.s2" + v2t2 := "spew_test.s1" + v2t3 := "int8" + v2t4 := "uint8" + v2t5 := "bool" + v2s := "{{127 255} true}" + v2s2 := "{s1:{a:127 b:255} b:true}" + v2s3 := "{s1:(" + v2t2 + "){a:(" + v2t3 + ")127 b:(" + v2t4 + ")255} b:(" + + v2t5 + ")true}" + addFormatterTest("%v", v2, v2s) + addFormatterTest("%v", pv2, "<*>"+v2s) + addFormatterTest("%v", &pv2, "<**>"+v2s) + addFormatterTest("%+v", nv2, "") + addFormatterTest("%+v", v2, v2s2) + addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s2) + addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s2) + addFormatterTest("%+v", nv2, "") + addFormatterTest("%#v", v2, "("+v2t+")"+v2s3) + addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s3) + addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s3) + addFormatterTest("%#v", nv2, "(*"+v2t+")"+"") + addFormatterTest("%#+v", v2, "("+v2t+")"+v2s3) + addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s3) + addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s3) + addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"") + + // Struct that contains custom type with Stringer pointer interface via both + // exported and unexported fields. + type s3 struct { + s pstringer + S pstringer + } + v3 := s3{"test", "test2"} + nv3 := (*s3)(nil) + pv3 := &v3 + v3Addr := fmt.Sprintf("%p", pv3) + pv3Addr := fmt.Sprintf("%p", &pv3) + v3t := "spew_test.s3" + v3t2 := "spew_test.pstringer" + v3s := "{stringer test stringer test2}" + v3sp := v3s + v3s2 := "{s:stringer test S:stringer test2}" + v3s2p := v3s2 + v3s3 := "{s:(" + v3t2 + ")stringer test S:(" + v3t2 + ")stringer test2}" + v3s3p := v3s3 + if spew.UnsafeDisabled { + v3s = "{test test2}" + v3sp = "{test stringer test2}" + v3s2 = "{s:test S:test2}" + v3s2p = "{s:test S:stringer test2}" + v3s3 = "{s:(" + v3t2 + ")test S:(" + v3t2 + ")test2}" + v3s3p = "{s:(" + v3t2 + ")test S:(" + v3t2 + ")stringer test2}" + } + addFormatterTest("%v", v3, v3s) + addFormatterTest("%v", pv3, "<*>"+v3sp) + addFormatterTest("%v", &pv3, "<**>"+v3sp) + addFormatterTest("%+v", nv3, "") + addFormatterTest("%+v", v3, v3s2) + addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s2p) + addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s2p) + addFormatterTest("%+v", nv3, "") + addFormatterTest("%#v", v3, "("+v3t+")"+v3s3) + addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s3p) + addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s3p) + addFormatterTest("%#v", nv3, "(*"+v3t+")"+"") + addFormatterTest("%#+v", v3, "("+v3t+")"+v3s3) + addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s3p) + addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s3p) + addFormatterTest("%#+v", nv3, "(*"+v3t+")"+"") + + // Struct that contains embedded struct and field to same struct. + e := embed{"embedstr"} + v4 := embedwrap{embed: &e, e: &e} + nv4 := (*embedwrap)(nil) + pv4 := &v4 + eAddr := fmt.Sprintf("%p", &e) + v4Addr := fmt.Sprintf("%p", pv4) + pv4Addr := fmt.Sprintf("%p", &pv4) + v4t := "spew_test.embedwrap" + v4t2 := "spew_test.embed" + v4t3 := "string" + v4s := "{<*>{embedstr} <*>{embedstr}}" + v4s2 := "{embed:<*>(" + eAddr + "){a:embedstr} e:<*>(" + eAddr + + "){a:embedstr}}" + v4s3 := "{embed:(*" + v4t2 + "){a:(" + v4t3 + ")embedstr} e:(*" + v4t2 + + "){a:(" + v4t3 + ")embedstr}}" + v4s4 := "{embed:(*" + v4t2 + ")(" + eAddr + "){a:(" + v4t3 + + ")embedstr} e:(*" + v4t2 + ")(" + eAddr + "){a:(" + v4t3 + ")embedstr}}" + addFormatterTest("%v", v4, v4s) + addFormatterTest("%v", pv4, "<*>"+v4s) + addFormatterTest("%v", &pv4, "<**>"+v4s) + addFormatterTest("%+v", nv4, "") + addFormatterTest("%+v", v4, v4s2) + addFormatterTest("%+v", pv4, "<*>("+v4Addr+")"+v4s2) + addFormatterTest("%+v", &pv4, "<**>("+pv4Addr+"->"+v4Addr+")"+v4s2) + addFormatterTest("%+v", nv4, "") + addFormatterTest("%#v", v4, "("+v4t+")"+v4s3) + addFormatterTest("%#v", pv4, "(*"+v4t+")"+v4s3) + addFormatterTest("%#v", &pv4, "(**"+v4t+")"+v4s3) + addFormatterTest("%#v", nv4, "(*"+v4t+")"+"") + addFormatterTest("%#+v", v4, "("+v4t+")"+v4s4) + addFormatterTest("%#+v", pv4, "(*"+v4t+")("+v4Addr+")"+v4s4) + addFormatterTest("%#+v", &pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")"+v4s4) + addFormatterTest("%#+v", nv4, "(*"+v4t+")"+"") +} + +func addUintptrFormatterTests() { + // Null pointer. + v := uintptr(0) + nv := (*uintptr)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "uintptr" + vs := "" + addFormatterTest("%v", v, vs) + addFormatterTest("%v", pv, "<*>"+vs) + addFormatterTest("%v", &pv, "<**>"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%+v", v, vs) + addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) + addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%#v", v, "("+vt+")"+vs) + addFormatterTest("%#v", pv, "(*"+vt+")"+vs) + addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) + addFormatterTest("%#v", nv, "(*"+vt+")"+"") + addFormatterTest("%#+v", v, "("+vt+")"+vs) + addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) + addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%#+v", nv, "(*"+vt+")"+"") + + // Address of real variable. + i := 1 + v2 := uintptr(unsafe.Pointer(&i)) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "uintptr" + v2s := fmt.Sprintf("%p", &i) + addFormatterTest("%v", v2, v2s) + addFormatterTest("%v", pv2, "<*>"+v2s) + addFormatterTest("%v", &pv2, "<**>"+v2s) + addFormatterTest("%+v", v2, v2s) + addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) + addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) + addFormatterTest("%#v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) + addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) + addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) + addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) +} + +func addUnsafePointerFormatterTests() { + // Null pointer. + v := unsafe.Pointer(uintptr(0)) + nv := (*unsafe.Pointer)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "unsafe.Pointer" + vs := "" + addFormatterTest("%v", v, vs) + addFormatterTest("%v", pv, "<*>"+vs) + addFormatterTest("%v", &pv, "<**>"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%+v", v, vs) + addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) + addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%#v", v, "("+vt+")"+vs) + addFormatterTest("%#v", pv, "(*"+vt+")"+vs) + addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) + addFormatterTest("%#v", nv, "(*"+vt+")"+"") + addFormatterTest("%#+v", v, "("+vt+")"+vs) + addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) + addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%#+v", nv, "(*"+vt+")"+"") + + // Address of real variable. + i := 1 + v2 := unsafe.Pointer(&i) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "unsafe.Pointer" + v2s := fmt.Sprintf("%p", &i) + addFormatterTest("%v", v2, v2s) + addFormatterTest("%v", pv2, "<*>"+v2s) + addFormatterTest("%v", &pv2, "<**>"+v2s) + addFormatterTest("%+v", v2, v2s) + addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) + addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) + addFormatterTest("%#v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) + addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) + addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) + addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) +} + +func addChanFormatterTests() { + // Nil channel. + var v chan int + pv := &v + nv := (*chan int)(nil) + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "chan int" + vs := "" + addFormatterTest("%v", v, vs) + addFormatterTest("%v", pv, "<*>"+vs) + addFormatterTest("%v", &pv, "<**>"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%+v", v, vs) + addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) + addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%#v", v, "("+vt+")"+vs) + addFormatterTest("%#v", pv, "(*"+vt+")"+vs) + addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) + addFormatterTest("%#v", nv, "(*"+vt+")"+"") + addFormatterTest("%#+v", v, "("+vt+")"+vs) + addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) + addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%#+v", nv, "(*"+vt+")"+"") + + // Real channel. + v2 := make(chan int) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "chan int" + v2s := fmt.Sprintf("%p", v2) + addFormatterTest("%v", v2, v2s) + addFormatterTest("%v", pv2, "<*>"+v2s) + addFormatterTest("%v", &pv2, "<**>"+v2s) + addFormatterTest("%+v", v2, v2s) + addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) + addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) + addFormatterTest("%#v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) + addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) + addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) + addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) +} + +func addFuncFormatterTests() { + // Function with no params and no returns. + v := addIntFormatterTests + nv := (*func())(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "func()" + vs := fmt.Sprintf("%p", v) + addFormatterTest("%v", v, vs) + addFormatterTest("%v", pv, "<*>"+vs) + addFormatterTest("%v", &pv, "<**>"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%+v", v, vs) + addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) + addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%#v", v, "("+vt+")"+vs) + addFormatterTest("%#v", pv, "(*"+vt+")"+vs) + addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) + addFormatterTest("%#v", nv, "(*"+vt+")"+"") + addFormatterTest("%#+v", v, "("+vt+")"+vs) + addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) + addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%#+v", nv, "(*"+vt+")"+"") + + // Function with param and no returns. + v2 := TestFormatter + nv2 := (*func(*testing.T))(nil) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "func(*testing.T)" + v2s := fmt.Sprintf("%p", v2) + addFormatterTest("%v", v2, v2s) + addFormatterTest("%v", pv2, "<*>"+v2s) + addFormatterTest("%v", &pv2, "<**>"+v2s) + addFormatterTest("%+v", nv2, "") + addFormatterTest("%+v", v2, v2s) + addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) + addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) + addFormatterTest("%+v", nv2, "") + addFormatterTest("%#v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) + addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) + addFormatterTest("%#v", nv2, "(*"+v2t+")"+"") + addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) + addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) + addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"") + + // Function with multiple params and multiple returns. + var v3 = func(i int, s string) (b bool, err error) { + return true, nil + } + nv3 := (*func(int, string) (bool, error))(nil) + pv3 := &v3 + v3Addr := fmt.Sprintf("%p", pv3) + pv3Addr := fmt.Sprintf("%p", &pv3) + v3t := "func(int, string) (bool, error)" + v3s := fmt.Sprintf("%p", v3) + addFormatterTest("%v", v3, v3s) + addFormatterTest("%v", pv3, "<*>"+v3s) + addFormatterTest("%v", &pv3, "<**>"+v3s) + addFormatterTest("%+v", nv3, "") + addFormatterTest("%+v", v3, v3s) + addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s) + addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s) + addFormatterTest("%+v", nv3, "") + addFormatterTest("%#v", v3, "("+v3t+")"+v3s) + addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s) + addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s) + addFormatterTest("%#v", nv3, "(*"+v3t+")"+"") + addFormatterTest("%#+v", v3, "("+v3t+")"+v3s) + addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s) + addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s) + addFormatterTest("%#+v", nv3, "(*"+v3t+")"+"") +} + +func addCircularFormatterTests() { + // Struct that is circular through self referencing. + type circular struct { + c *circular + } + v := circular{nil} + v.c = &v + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "spew_test.circular" + vs := "{<*>{<*>}}" + vs2 := "{<*>}" + vs3 := "{c:<*>(" + vAddr + "){c:<*>(" + vAddr + ")}}" + vs4 := "{c:<*>(" + vAddr + ")}" + vs5 := "{c:(*" + vt + "){c:(*" + vt + ")}}" + vs6 := "{c:(*" + vt + ")}" + vs7 := "{c:(*" + vt + ")(" + vAddr + "){c:(*" + vt + ")(" + vAddr + + ")}}" + vs8 := "{c:(*" + vt + ")(" + vAddr + ")}" + addFormatterTest("%v", v, vs) + addFormatterTest("%v", pv, "<*>"+vs2) + addFormatterTest("%v", &pv, "<**>"+vs2) + addFormatterTest("%+v", v, vs3) + addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs4) + addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs4) + addFormatterTest("%#v", v, "("+vt+")"+vs5) + addFormatterTest("%#v", pv, "(*"+vt+")"+vs6) + addFormatterTest("%#v", &pv, "(**"+vt+")"+vs6) + addFormatterTest("%#+v", v, "("+vt+")"+vs7) + addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs8) + addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs8) + + // Structs that are circular through cross referencing. + v2 := xref1{nil} + ts2 := xref2{&v2} + v2.ps2 = &ts2 + pv2 := &v2 + ts2Addr := fmt.Sprintf("%p", &ts2) + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "spew_test.xref1" + v2t2 := "spew_test.xref2" + v2s := "{<*>{<*>{<*>}}}" + v2s2 := "{<*>{<*>}}" + v2s3 := "{ps2:<*>(" + ts2Addr + "){ps1:<*>(" + v2Addr + "){ps2:<*>(" + + ts2Addr + ")}}}" + v2s4 := "{ps2:<*>(" + ts2Addr + "){ps1:<*>(" + v2Addr + ")}}" + v2s5 := "{ps2:(*" + v2t2 + "){ps1:(*" + v2t + "){ps2:(*" + v2t2 + + ")}}}" + v2s6 := "{ps2:(*" + v2t2 + "){ps1:(*" + v2t + ")}}" + v2s7 := "{ps2:(*" + v2t2 + ")(" + ts2Addr + "){ps1:(*" + v2t + + ")(" + v2Addr + "){ps2:(*" + v2t2 + ")(" + ts2Addr + + ")}}}" + v2s8 := "{ps2:(*" + v2t2 + ")(" + ts2Addr + "){ps1:(*" + v2t + + ")(" + v2Addr + ")}}" + addFormatterTest("%v", v2, v2s) + addFormatterTest("%v", pv2, "<*>"+v2s2) + addFormatterTest("%v", &pv2, "<**>"+v2s2) + addFormatterTest("%+v", v2, v2s3) + addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s4) + addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s4) + addFormatterTest("%#v", v2, "("+v2t+")"+v2s5) + addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s6) + addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s6) + addFormatterTest("%#+v", v2, "("+v2t+")"+v2s7) + addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s8) + addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s8) + + // Structs that are indirectly circular. + v3 := indirCir1{nil} + tic2 := indirCir2{nil} + tic3 := indirCir3{&v3} + tic2.ps3 = &tic3 + v3.ps2 = &tic2 + pv3 := &v3 + tic2Addr := fmt.Sprintf("%p", &tic2) + tic3Addr := fmt.Sprintf("%p", &tic3) + v3Addr := fmt.Sprintf("%p", pv3) + pv3Addr := fmt.Sprintf("%p", &pv3) + v3t := "spew_test.indirCir1" + v3t2 := "spew_test.indirCir2" + v3t3 := "spew_test.indirCir3" + v3s := "{<*>{<*>{<*>{<*>}}}}" + v3s2 := "{<*>{<*>{<*>}}}" + v3s3 := "{ps2:<*>(" + tic2Addr + "){ps3:<*>(" + tic3Addr + "){ps1:<*>(" + + v3Addr + "){ps2:<*>(" + tic2Addr + ")}}}}" + v3s4 := "{ps2:<*>(" + tic2Addr + "){ps3:<*>(" + tic3Addr + "){ps1:<*>(" + + v3Addr + ")}}}" + v3s5 := "{ps2:(*" + v3t2 + "){ps3:(*" + v3t3 + "){ps1:(*" + v3t + + "){ps2:(*" + v3t2 + ")}}}}" + v3s6 := "{ps2:(*" + v3t2 + "){ps3:(*" + v3t3 + "){ps1:(*" + v3t + + ")}}}" + v3s7 := "{ps2:(*" + v3t2 + ")(" + tic2Addr + "){ps3:(*" + v3t3 + ")(" + + tic3Addr + "){ps1:(*" + v3t + ")(" + v3Addr + "){ps2:(*" + v3t2 + + ")(" + tic2Addr + ")}}}}" + v3s8 := "{ps2:(*" + v3t2 + ")(" + tic2Addr + "){ps3:(*" + v3t3 + ")(" + + tic3Addr + "){ps1:(*" + v3t + ")(" + v3Addr + ")}}}" + addFormatterTest("%v", v3, v3s) + addFormatterTest("%v", pv3, "<*>"+v3s2) + addFormatterTest("%v", &pv3, "<**>"+v3s2) + addFormatterTest("%+v", v3, v3s3) + addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s4) + addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s4) + addFormatterTest("%#v", v3, "("+v3t+")"+v3s5) + addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s6) + addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s6) + addFormatterTest("%#+v", v3, "("+v3t+")"+v3s7) + addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s8) + addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s8) +} + +func addPanicFormatterTests() { + // Type that panics in its Stringer interface. + v := panicer(127) + nv := (*panicer)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "spew_test.panicer" + vs := "(PANIC=test panic)127" + addFormatterTest("%v", v, vs) + addFormatterTest("%v", pv, "<*>"+vs) + addFormatterTest("%v", &pv, "<**>"+vs) + addFormatterTest("%v", nv, "") + addFormatterTest("%+v", v, vs) + addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) + addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%#v", v, "("+vt+")"+vs) + addFormatterTest("%#v", pv, "(*"+vt+")"+vs) + addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) + addFormatterTest("%#v", nv, "(*"+vt+")"+"") + addFormatterTest("%#+v", v, "("+vt+")"+vs) + addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) + addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%#+v", nv, "(*"+vt+")"+"") +} + +func addErrorFormatterTests() { + // Type that has a custom Error interface. + v := customError(127) + nv := (*customError)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "spew_test.customError" + vs := "error: 127" + addFormatterTest("%v", v, vs) + addFormatterTest("%v", pv, "<*>"+vs) + addFormatterTest("%v", &pv, "<**>"+vs) + addFormatterTest("%v", nv, "") + addFormatterTest("%+v", v, vs) + addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) + addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%#v", v, "("+vt+")"+vs) + addFormatterTest("%#v", pv, "(*"+vt+")"+vs) + addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) + addFormatterTest("%#v", nv, "(*"+vt+")"+"") + addFormatterTest("%#+v", v, "("+vt+")"+vs) + addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) + addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%#+v", nv, "(*"+vt+")"+"") +} + +func addPassthroughFormatterTests() { + // %x passthrough with uint. + v := uint(4294967295) + pv := &v + vAddr := fmt.Sprintf("%x", pv) + pvAddr := fmt.Sprintf("%x", &pv) + vs := "ffffffff" + addFormatterTest("%x", v, vs) + addFormatterTest("%x", pv, vAddr) + addFormatterTest("%x", &pv, pvAddr) + + // %#x passthrough with uint. + v2 := int(2147483647) + pv2 := &v2 + v2Addr := fmt.Sprintf("%#x", pv2) + pv2Addr := fmt.Sprintf("%#x", &pv2) + v2s := "0x7fffffff" + addFormatterTest("%#x", v2, v2s) + addFormatterTest("%#x", pv2, v2Addr) + addFormatterTest("%#x", &pv2, pv2Addr) + + // %f passthrough with precision. + addFormatterTest("%.2f", 3.1415, "3.14") + addFormatterTest("%.3f", 3.1415, "3.142") + addFormatterTest("%.4f", 3.1415, "3.1415") + + // %f passthrough with width and precision. + addFormatterTest("%5.2f", 3.1415, " 3.14") + addFormatterTest("%6.3f", 3.1415, " 3.142") + addFormatterTest("%7.4f", 3.1415, " 3.1415") + + // %d passthrough with width. + addFormatterTest("%3d", 127, "127") + addFormatterTest("%4d", 127, " 127") + addFormatterTest("%5d", 127, " 127") + + // %q passthrough with string. + addFormatterTest("%q", "test", "\"test\"") +} + +// TestFormatter executes all of the tests described by formatterTests. +func TestFormatter(t *testing.T) { + // Setup tests. + addIntFormatterTests() + addUintFormatterTests() + addBoolFormatterTests() + addFloatFormatterTests() + addComplexFormatterTests() + addArrayFormatterTests() + addSliceFormatterTests() + addStringFormatterTests() + addInterfaceFormatterTests() + addMapFormatterTests() + addStructFormatterTests() + addUintptrFormatterTests() + addUnsafePointerFormatterTests() + addChanFormatterTests() + addFuncFormatterTests() + addCircularFormatterTests() + addPanicFormatterTests() + addErrorFormatterTests() + addPassthroughFormatterTests() + + t.Logf("Running %d tests", len(formatterTests)) + for i, test := range formatterTests { + buf := new(bytes.Buffer) + spew.Fprintf(buf, test.format, test.in) + s := buf.String() + if testFailed(s, test.wants) { + t.Errorf("Formatter #%d format: %s got: %s %s", i, test.format, s, + stringizeWants(test.wants)) + continue + } + } +} + +type testStruct struct { + x int +} + +func (ts testStruct) String() string { + return fmt.Sprintf("ts.%d", ts.x) +} + +type testStructP struct { + x int +} + +func (ts *testStructP) String() string { + return fmt.Sprintf("ts.%d", ts.x) +} + +func TestPrintSortedKeys(t *testing.T) { + cfg := spew.ConfigState{SortKeys: true} + s := cfg.Sprint(map[int]string{1: "1", 3: "3", 2: "2"}) + expected := "map[1:1 2:2 3:3]" + if s != expected { + t.Errorf("Sorted keys mismatch 1:\n %v %v", s, expected) + } + + s = cfg.Sprint(map[stringer]int{"1": 1, "3": 3, "2": 2}) + expected = "map[stringer 1:1 stringer 2:2 stringer 3:3]" + if s != expected { + t.Errorf("Sorted keys mismatch 2:\n %v %v", s, expected) + } + + s = cfg.Sprint(map[pstringer]int{pstringer("1"): 1, pstringer("3"): 3, pstringer("2"): 2}) + expected = "map[stringer 1:1 stringer 2:2 stringer 3:3]" + if spew.UnsafeDisabled { + expected = "map[1:1 2:2 3:3]" + } + if s != expected { + t.Errorf("Sorted keys mismatch 3:\n %v %v", s, expected) + } + + s = cfg.Sprint(map[testStruct]int{testStruct{1}: 1, testStruct{3}: 3, testStruct{2}: 2}) + expected = "map[ts.1:1 ts.2:2 ts.3:3]" + if s != expected { + t.Errorf("Sorted keys mismatch 4:\n %v %v", s, expected) + } + + if !spew.UnsafeDisabled { + s = cfg.Sprint(map[testStructP]int{testStructP{1}: 1, testStructP{3}: 3, testStructP{2}: 2}) + expected = "map[ts.1:1 ts.2:2 ts.3:3]" + if s != expected { + t.Errorf("Sorted keys mismatch 5:\n %v %v", s, expected) + } + } + + s = cfg.Sprint(map[customError]int{customError(1): 1, customError(3): 3, customError(2): 2}) + expected = "map[error: 1:1 error: 2:2 error: 3:3]" + if s != expected { + t.Errorf("Sorted keys mismatch 6:\n %v %v", s, expected) + } +} diff --git a/api/vendor/github.com/davecgh/go-spew/spew/internal_test.go b/api/vendor/github.com/davecgh/go-spew/spew/internal_test.go new file mode 100644 index 0000000..20a9cfe --- /dev/null +++ b/api/vendor/github.com/davecgh/go-spew/spew/internal_test.go @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * 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. + */ + +/* +This test file is part of the spew package rather than than the spew_test +package because it needs access to internals to properly test certain cases +which are not possible via the public interface since they should never happen. +*/ + +package spew + +import ( + "bytes" + "reflect" + "testing" +) + +// dummyFmtState implements a fake fmt.State to use for testing invalid +// reflect.Value handling. This is necessary because the fmt package catches +// invalid values before invoking the formatter on them. +type dummyFmtState struct { + bytes.Buffer +} + +func (dfs *dummyFmtState) Flag(f int) bool { + if f == int('+') { + return true + } + return false +} + +func (dfs *dummyFmtState) Precision() (int, bool) { + return 0, false +} + +func (dfs *dummyFmtState) Width() (int, bool) { + return 0, false +} + +// TestInvalidReflectValue ensures the dump and formatter code handles an +// invalid reflect value properly. This needs access to internal state since it +// should never happen in real code and therefore can't be tested via the public +// API. +func TestInvalidReflectValue(t *testing.T) { + i := 1 + + // Dump invalid reflect value. + v := new(reflect.Value) + buf := new(bytes.Buffer) + d := dumpState{w: buf, cs: &Config} + d.dump(*v) + s := buf.String() + want := "" + if s != want { + t.Errorf("InvalidReflectValue #%d\n got: %s want: %s", i, s, want) + } + i++ + + // Formatter invalid reflect value. + buf2 := new(dummyFmtState) + f := formatState{value: *v, cs: &Config, fs: buf2} + f.format(*v) + s = buf2.String() + want = "" + if s != want { + t.Errorf("InvalidReflectValue #%d got: %s want: %s", i, s, want) + } +} + +// SortValues makes the internal sortValues function available to the test +// package. +func SortValues(values []reflect.Value, cs *ConfigState) { + sortValues(values, cs) +} diff --git a/api/vendor/github.com/davecgh/go-spew/spew/internalunsafe_test.go b/api/vendor/github.com/davecgh/go-spew/spew/internalunsafe_test.go new file mode 100644 index 0000000..a0c612e --- /dev/null +++ b/api/vendor/github.com/davecgh/go-spew/spew/internalunsafe_test.go @@ -0,0 +1,102 @@ +// Copyright (c) 2013-2016 Dave Collins + +// 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. + +// NOTE: Due to the following build constraints, this file will only be compiled +// when the code is not running on Google App Engine, compiled by GopherJS, and +// "-tags safe" is not added to the go build command line. The "disableunsafe" +// tag is deprecated and thus should not be used. +// +build !js,!appengine,!safe,!disableunsafe + +/* +This test file is part of the spew package rather than than the spew_test +package because it needs access to internals to properly test certain cases +which are not possible via the public interface since they should never happen. +*/ + +package spew + +import ( + "bytes" + "reflect" + "testing" + "unsafe" +) + +// changeKind uses unsafe to intentionally change the kind of a reflect.Value to +// the maximum kind value which does not exist. This is needed to test the +// fallback code which punts to the standard fmt library for new types that +// might get added to the language. +func changeKind(v *reflect.Value, readOnly bool) { + rvf := (*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(v)) + offsetFlag)) + *rvf = *rvf | ((1< + * + * 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 spew + +import ( + "fmt" + "io" +) + +// Errorf is a wrapper for fmt.Errorf that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the formatted string as a value that satisfies error. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Errorf(format, spew.NewFormatter(a), spew.NewFormatter(b)) +func Errorf(format string, a ...interface{}) (err error) { + return fmt.Errorf(format, convertArgs(a)...) +} + +// Fprint is a wrapper for fmt.Fprint that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Fprint(w, spew.NewFormatter(a), spew.NewFormatter(b)) +func Fprint(w io.Writer, a ...interface{}) (n int, err error) { + return fmt.Fprint(w, convertArgs(a)...) +} + +// Fprintf is a wrapper for fmt.Fprintf that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Fprintf(w, format, spew.NewFormatter(a), spew.NewFormatter(b)) +func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) { + return fmt.Fprintf(w, format, convertArgs(a)...) +} + +// Fprintln is a wrapper for fmt.Fprintln that treats each argument as if it +// passed with a default Formatter interface returned by NewFormatter. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Fprintln(w, spew.NewFormatter(a), spew.NewFormatter(b)) +func Fprintln(w io.Writer, a ...interface{}) (n int, err error) { + return fmt.Fprintln(w, convertArgs(a)...) +} + +// Print is a wrapper for fmt.Print that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Print(spew.NewFormatter(a), spew.NewFormatter(b)) +func Print(a ...interface{}) (n int, err error) { + return fmt.Print(convertArgs(a)...) +} + +// Printf is a wrapper for fmt.Printf that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Printf(format, spew.NewFormatter(a), spew.NewFormatter(b)) +func Printf(format string, a ...interface{}) (n int, err error) { + return fmt.Printf(format, convertArgs(a)...) +} + +// Println is a wrapper for fmt.Println that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Println(spew.NewFormatter(a), spew.NewFormatter(b)) +func Println(a ...interface{}) (n int, err error) { + return fmt.Println(convertArgs(a)...) +} + +// Sprint is a wrapper for fmt.Sprint that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the resulting string. See NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Sprint(spew.NewFormatter(a), spew.NewFormatter(b)) +func Sprint(a ...interface{}) string { + return fmt.Sprint(convertArgs(a)...) +} + +// Sprintf is a wrapper for fmt.Sprintf that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the resulting string. See NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Sprintf(format, spew.NewFormatter(a), spew.NewFormatter(b)) +func Sprintf(format string, a ...interface{}) string { + return fmt.Sprintf(format, convertArgs(a)...) +} + +// Sprintln is a wrapper for fmt.Sprintln that treats each argument as if it +// were passed with a default Formatter interface returned by NewFormatter. It +// returns the resulting string. See NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Sprintln(spew.NewFormatter(a), spew.NewFormatter(b)) +func Sprintln(a ...interface{}) string { + return fmt.Sprintln(convertArgs(a)...) +} + +// convertArgs accepts a slice of arguments and returns a slice of the same +// length with each argument converted to a default spew Formatter interface. +func convertArgs(args []interface{}) (formatters []interface{}) { + formatters = make([]interface{}, len(args)) + for index, arg := range args { + formatters[index] = NewFormatter(arg) + } + return formatters +} diff --git a/api/vendor/github.com/davecgh/go-spew/spew/spew_test.go b/api/vendor/github.com/davecgh/go-spew/spew/spew_test.go new file mode 100644 index 0000000..b70466c --- /dev/null +++ b/api/vendor/github.com/davecgh/go-spew/spew/spew_test.go @@ -0,0 +1,320 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * 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 spew_test + +import ( + "bytes" + "fmt" + "io/ioutil" + "os" + "testing" + + "github.com/davecgh/go-spew/spew" +) + +// spewFunc is used to identify which public function of the spew package or +// ConfigState a test applies to. +type spewFunc int + +const ( + fCSFdump spewFunc = iota + fCSFprint + fCSFprintf + fCSFprintln + fCSPrint + fCSPrintln + fCSSdump + fCSSprint + fCSSprintf + fCSSprintln + fCSErrorf + fCSNewFormatter + fErrorf + fFprint + fFprintln + fPrint + fPrintln + fSdump + fSprint + fSprintf + fSprintln +) + +// Map of spewFunc values to names for pretty printing. +var spewFuncStrings = map[spewFunc]string{ + fCSFdump: "ConfigState.Fdump", + fCSFprint: "ConfigState.Fprint", + fCSFprintf: "ConfigState.Fprintf", + fCSFprintln: "ConfigState.Fprintln", + fCSSdump: "ConfigState.Sdump", + fCSPrint: "ConfigState.Print", + fCSPrintln: "ConfigState.Println", + fCSSprint: "ConfigState.Sprint", + fCSSprintf: "ConfigState.Sprintf", + fCSSprintln: "ConfigState.Sprintln", + fCSErrorf: "ConfigState.Errorf", + fCSNewFormatter: "ConfigState.NewFormatter", + fErrorf: "spew.Errorf", + fFprint: "spew.Fprint", + fFprintln: "spew.Fprintln", + fPrint: "spew.Print", + fPrintln: "spew.Println", + fSdump: "spew.Sdump", + fSprint: "spew.Sprint", + fSprintf: "spew.Sprintf", + fSprintln: "spew.Sprintln", +} + +func (f spewFunc) String() string { + if s, ok := spewFuncStrings[f]; ok { + return s + } + return fmt.Sprintf("Unknown spewFunc (%d)", int(f)) +} + +// spewTest is used to describe a test to be performed against the public +// functions of the spew package or ConfigState. +type spewTest struct { + cs *spew.ConfigState + f spewFunc + format string + in interface{} + want string +} + +// spewTests houses the tests to be performed against the public functions of +// the spew package and ConfigState. +// +// These tests are only intended to ensure the public functions are exercised +// and are intentionally not exhaustive of types. The exhaustive type +// tests are handled in the dump and format tests. +var spewTests []spewTest + +// redirStdout is a helper function to return the standard output from f as a +// byte slice. +func redirStdout(f func()) ([]byte, error) { + tempFile, err := ioutil.TempFile("", "ss-test") + if err != nil { + return nil, err + } + fileName := tempFile.Name() + defer os.Remove(fileName) // Ignore error + + origStdout := os.Stdout + os.Stdout = tempFile + f() + os.Stdout = origStdout + tempFile.Close() + + return ioutil.ReadFile(fileName) +} + +func initSpewTests() { + // Config states with various settings. + scsDefault := spew.NewDefaultConfig() + scsNoMethods := &spew.ConfigState{Indent: " ", DisableMethods: true} + scsNoPmethods := &spew.ConfigState{Indent: " ", DisablePointerMethods: true} + scsMaxDepth := &spew.ConfigState{Indent: " ", MaxDepth: 1} + scsContinue := &spew.ConfigState{Indent: " ", ContinueOnMethod: true} + scsNoPtrAddr := &spew.ConfigState{DisablePointerAddresses: true} + scsNoCap := &spew.ConfigState{DisableCapacities: true} + + // Variables for tests on types which implement Stringer interface with and + // without a pointer receiver. + ts := stringer("test") + tps := pstringer("test") + + type ptrTester struct { + s *struct{} + } + tptr := &ptrTester{s: &struct{}{}} + + // depthTester is used to test max depth handling for structs, array, slices + // and maps. + type depthTester struct { + ic indirCir1 + arr [1]string + slice []string + m map[string]int + } + dt := depthTester{indirCir1{nil}, [1]string{"arr"}, []string{"slice"}, + map[string]int{"one": 1}} + + // Variable for tests on types which implement error interface. + te := customError(10) + + spewTests = []spewTest{ + {scsDefault, fCSFdump, "", int8(127), "(int8) 127\n"}, + {scsDefault, fCSFprint, "", int16(32767), "32767"}, + {scsDefault, fCSFprintf, "%v", int32(2147483647), "2147483647"}, + {scsDefault, fCSFprintln, "", int(2147483647), "2147483647\n"}, + {scsDefault, fCSPrint, "", int64(9223372036854775807), "9223372036854775807"}, + {scsDefault, fCSPrintln, "", uint8(255), "255\n"}, + {scsDefault, fCSSdump, "", uint8(64), "(uint8) 64\n"}, + {scsDefault, fCSSprint, "", complex(1, 2), "(1+2i)"}, + {scsDefault, fCSSprintf, "%v", complex(float32(3), 4), "(3+4i)"}, + {scsDefault, fCSSprintln, "", complex(float64(5), 6), "(5+6i)\n"}, + {scsDefault, fCSErrorf, "%#v", uint16(65535), "(uint16)65535"}, + {scsDefault, fCSNewFormatter, "%v", uint32(4294967295), "4294967295"}, + {scsDefault, fErrorf, "%v", uint64(18446744073709551615), "18446744073709551615"}, + {scsDefault, fFprint, "", float32(3.14), "3.14"}, + {scsDefault, fFprintln, "", float64(6.28), "6.28\n"}, + {scsDefault, fPrint, "", true, "true"}, + {scsDefault, fPrintln, "", false, "false\n"}, + {scsDefault, fSdump, "", complex(-10, -20), "(complex128) (-10-20i)\n"}, + {scsDefault, fSprint, "", complex(-1, -2), "(-1-2i)"}, + {scsDefault, fSprintf, "%v", complex(float32(-3), -4), "(-3-4i)"}, + {scsDefault, fSprintln, "", complex(float64(-5), -6), "(-5-6i)\n"}, + {scsNoMethods, fCSFprint, "", ts, "test"}, + {scsNoMethods, fCSFprint, "", &ts, "<*>test"}, + {scsNoMethods, fCSFprint, "", tps, "test"}, + {scsNoMethods, fCSFprint, "", &tps, "<*>test"}, + {scsNoPmethods, fCSFprint, "", ts, "stringer test"}, + {scsNoPmethods, fCSFprint, "", &ts, "<*>stringer test"}, + {scsNoPmethods, fCSFprint, "", tps, "test"}, + {scsNoPmethods, fCSFprint, "", &tps, "<*>stringer test"}, + {scsMaxDepth, fCSFprint, "", dt, "{{} [] [] map[]}"}, + {scsMaxDepth, fCSFdump, "", dt, "(spew_test.depthTester) {\n" + + " ic: (spew_test.indirCir1) {\n \n },\n" + + " arr: ([1]string) (len=1 cap=1) {\n \n },\n" + + " slice: ([]string) (len=1 cap=1) {\n \n },\n" + + " m: (map[string]int) (len=1) {\n \n }\n}\n"}, + {scsContinue, fCSFprint, "", ts, "(stringer test) test"}, + {scsContinue, fCSFdump, "", ts, "(spew_test.stringer) " + + "(len=4) (stringer test) \"test\"\n"}, + {scsContinue, fCSFprint, "", te, "(error: 10) 10"}, + {scsContinue, fCSFdump, "", te, "(spew_test.customError) " + + "(error: 10) 10\n"}, + {scsNoPtrAddr, fCSFprint, "", tptr, "<*>{<*>{}}"}, + {scsNoPtrAddr, fCSSdump, "", tptr, "(*spew_test.ptrTester)({\ns: (*struct {})({\n})\n})\n"}, + {scsNoCap, fCSSdump, "", make([]string, 0, 10), "([]string) {\n}\n"}, + {scsNoCap, fCSSdump, "", make([]string, 1, 10), "([]string) (len=1) {\n(string) \"\"\n}\n"}, + } +} + +// TestSpew executes all of the tests described by spewTests. +func TestSpew(t *testing.T) { + initSpewTests() + + t.Logf("Running %d tests", len(spewTests)) + for i, test := range spewTests { + buf := new(bytes.Buffer) + switch test.f { + case fCSFdump: + test.cs.Fdump(buf, test.in) + + case fCSFprint: + test.cs.Fprint(buf, test.in) + + case fCSFprintf: + test.cs.Fprintf(buf, test.format, test.in) + + case fCSFprintln: + test.cs.Fprintln(buf, test.in) + + case fCSPrint: + b, err := redirStdout(func() { test.cs.Print(test.in) }) + if err != nil { + t.Errorf("%v #%d %v", test.f, i, err) + continue + } + buf.Write(b) + + case fCSPrintln: + b, err := redirStdout(func() { test.cs.Println(test.in) }) + if err != nil { + t.Errorf("%v #%d %v", test.f, i, err) + continue + } + buf.Write(b) + + case fCSSdump: + str := test.cs.Sdump(test.in) + buf.WriteString(str) + + case fCSSprint: + str := test.cs.Sprint(test.in) + buf.WriteString(str) + + case fCSSprintf: + str := test.cs.Sprintf(test.format, test.in) + buf.WriteString(str) + + case fCSSprintln: + str := test.cs.Sprintln(test.in) + buf.WriteString(str) + + case fCSErrorf: + err := test.cs.Errorf(test.format, test.in) + buf.WriteString(err.Error()) + + case fCSNewFormatter: + fmt.Fprintf(buf, test.format, test.cs.NewFormatter(test.in)) + + case fErrorf: + err := spew.Errorf(test.format, test.in) + buf.WriteString(err.Error()) + + case fFprint: + spew.Fprint(buf, test.in) + + case fFprintln: + spew.Fprintln(buf, test.in) + + case fPrint: + b, err := redirStdout(func() { spew.Print(test.in) }) + if err != nil { + t.Errorf("%v #%d %v", test.f, i, err) + continue + } + buf.Write(b) + + case fPrintln: + b, err := redirStdout(func() { spew.Println(test.in) }) + if err != nil { + t.Errorf("%v #%d %v", test.f, i, err) + continue + } + buf.Write(b) + + case fSdump: + str := spew.Sdump(test.in) + buf.WriteString(str) + + case fSprint: + str := spew.Sprint(test.in) + buf.WriteString(str) + + case fSprintf: + str := spew.Sprintf(test.format, test.in) + buf.WriteString(str) + + case fSprintln: + str := spew.Sprintln(test.in) + buf.WriteString(str) + + default: + t.Errorf("%v #%d unrecognized function", test.f, i) + continue + } + s := buf.String() + if test.want != s { + t.Errorf("ConfigState #%d\n got: %s want: %s", i, s, test.want) + continue + } + } +} diff --git a/api/vendor/github.com/davecgh/go-spew/spew/testdata/dumpcgo.go b/api/vendor/github.com/davecgh/go-spew/spew/testdata/dumpcgo.go new file mode 100644 index 0000000..5c87dd4 --- /dev/null +++ b/api/vendor/github.com/davecgh/go-spew/spew/testdata/dumpcgo.go @@ -0,0 +1,82 @@ +// Copyright (c) 2013 Dave Collins +// +// 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. + +// NOTE: Due to the following build constraints, this file will only be compiled +// when both cgo is supported and "-tags testcgo" is added to the go test +// command line. This code should really only be in the dumpcgo_test.go file, +// but unfortunately Go will not allow cgo in test files, so this is a +// workaround to allow cgo types to be tested. This configuration is used +// because spew itself does not require cgo to run even though it does handle +// certain cgo types specially. Rather than forcing all clients to require cgo +// and an external C compiler just to run the tests, this scheme makes them +// optional. +// +build cgo,testcgo + +package testdata + +/* +#include +typedef unsigned char custom_uchar_t; + +char *ncp = 0; +char *cp = "test"; +char ca[6] = {'t', 'e', 's', 't', '2', '\0'}; +unsigned char uca[6] = {'t', 'e', 's', 't', '3', '\0'}; +signed char sca[6] = {'t', 'e', 's', 't', '4', '\0'}; +uint8_t ui8ta[6] = {'t', 'e', 's', 't', '5', '\0'}; +custom_uchar_t tuca[6] = {'t', 'e', 's', 't', '6', '\0'}; +*/ +import "C" + +// GetCgoNullCharPointer returns a null char pointer via cgo. This is only +// used for tests. +func GetCgoNullCharPointer() interface{} { + return C.ncp +} + +// GetCgoCharPointer returns a char pointer via cgo. This is only used for +// tests. +func GetCgoCharPointer() interface{} { + return C.cp +} + +// GetCgoCharArray returns a char array via cgo and the array's len and cap. +// This is only used for tests. +func GetCgoCharArray() (interface{}, int, int) { + return C.ca, len(C.ca), cap(C.ca) +} + +// GetCgoUnsignedCharArray returns an unsigned char array via cgo and the +// array's len and cap. This is only used for tests. +func GetCgoUnsignedCharArray() (interface{}, int, int) { + return C.uca, len(C.uca), cap(C.uca) +} + +// GetCgoSignedCharArray returns a signed char array via cgo and the array's len +// and cap. This is only used for tests. +func GetCgoSignedCharArray() (interface{}, int, int) { + return C.sca, len(C.sca), cap(C.sca) +} + +// GetCgoUint8tArray returns a uint8_t array via cgo and the array's len and +// cap. This is only used for tests. +func GetCgoUint8tArray() (interface{}, int, int) { + return C.ui8ta, len(C.ui8ta), cap(C.ui8ta) +} + +// GetCgoTypdefedUnsignedCharArray returns a typedefed unsigned char array via +// cgo and the array's len and cap. This is only used for tests. +func GetCgoTypdefedUnsignedCharArray() (interface{}, int, int) { + return C.tuca, len(C.tuca), cap(C.tuca) +} diff --git a/api/vendor/github.com/davecgh/go-spew/test_coverage.txt b/api/vendor/github.com/davecgh/go-spew/test_coverage.txt new file mode 100644 index 0000000..2cd087a --- /dev/null +++ b/api/vendor/github.com/davecgh/go-spew/test_coverage.txt @@ -0,0 +1,61 @@ + +github.com/davecgh/go-spew/spew/dump.go dumpState.dump 100.00% (88/88) +github.com/davecgh/go-spew/spew/format.go formatState.format 100.00% (82/82) +github.com/davecgh/go-spew/spew/format.go formatState.formatPtr 100.00% (52/52) +github.com/davecgh/go-spew/spew/dump.go dumpState.dumpPtr 100.00% (44/44) +github.com/davecgh/go-spew/spew/dump.go dumpState.dumpSlice 100.00% (39/39) +github.com/davecgh/go-spew/spew/common.go handleMethods 100.00% (30/30) +github.com/davecgh/go-spew/spew/common.go printHexPtr 100.00% (18/18) +github.com/davecgh/go-spew/spew/common.go unsafeReflectValue 100.00% (13/13) +github.com/davecgh/go-spew/spew/format.go formatState.constructOrigFormat 100.00% (12/12) +github.com/davecgh/go-spew/spew/dump.go fdump 100.00% (11/11) +github.com/davecgh/go-spew/spew/format.go formatState.Format 100.00% (11/11) +github.com/davecgh/go-spew/spew/common.go init 100.00% (10/10) +github.com/davecgh/go-spew/spew/common.go printComplex 100.00% (9/9) +github.com/davecgh/go-spew/spew/common.go valuesSorter.Less 100.00% (8/8) +github.com/davecgh/go-spew/spew/format.go formatState.buildDefaultFormat 100.00% (7/7) +github.com/davecgh/go-spew/spew/format.go formatState.unpackValue 100.00% (5/5) +github.com/davecgh/go-spew/spew/dump.go dumpState.indent 100.00% (4/4) +github.com/davecgh/go-spew/spew/common.go catchPanic 100.00% (4/4) +github.com/davecgh/go-spew/spew/config.go ConfigState.convertArgs 100.00% (4/4) +github.com/davecgh/go-spew/spew/spew.go convertArgs 100.00% (4/4) +github.com/davecgh/go-spew/spew/format.go newFormatter 100.00% (3/3) +github.com/davecgh/go-spew/spew/dump.go Sdump 100.00% (3/3) +github.com/davecgh/go-spew/spew/common.go printBool 100.00% (3/3) +github.com/davecgh/go-spew/spew/common.go sortValues 100.00% (3/3) +github.com/davecgh/go-spew/spew/config.go ConfigState.Sdump 100.00% (3/3) +github.com/davecgh/go-spew/spew/dump.go dumpState.unpackValue 100.00% (3/3) +github.com/davecgh/go-spew/spew/spew.go Printf 100.00% (1/1) +github.com/davecgh/go-spew/spew/spew.go Println 100.00% (1/1) +github.com/davecgh/go-spew/spew/spew.go Sprint 100.00% (1/1) +github.com/davecgh/go-spew/spew/spew.go Sprintf 100.00% (1/1) +github.com/davecgh/go-spew/spew/spew.go Sprintln 100.00% (1/1) +github.com/davecgh/go-spew/spew/common.go printFloat 100.00% (1/1) +github.com/davecgh/go-spew/spew/config.go NewDefaultConfig 100.00% (1/1) +github.com/davecgh/go-spew/spew/common.go printInt 100.00% (1/1) +github.com/davecgh/go-spew/spew/common.go printUint 100.00% (1/1) +github.com/davecgh/go-spew/spew/common.go valuesSorter.Len 100.00% (1/1) +github.com/davecgh/go-spew/spew/common.go valuesSorter.Swap 100.00% (1/1) +github.com/davecgh/go-spew/spew/config.go ConfigState.Errorf 100.00% (1/1) +github.com/davecgh/go-spew/spew/config.go ConfigState.Fprint 100.00% (1/1) +github.com/davecgh/go-spew/spew/config.go ConfigState.Fprintf 100.00% (1/1) +github.com/davecgh/go-spew/spew/config.go ConfigState.Fprintln 100.00% (1/1) +github.com/davecgh/go-spew/spew/config.go ConfigState.Print 100.00% (1/1) +github.com/davecgh/go-spew/spew/config.go ConfigState.Printf 100.00% (1/1) +github.com/davecgh/go-spew/spew/config.go ConfigState.Println 100.00% (1/1) +github.com/davecgh/go-spew/spew/config.go ConfigState.Sprint 100.00% (1/1) +github.com/davecgh/go-spew/spew/config.go ConfigState.Sprintf 100.00% (1/1) +github.com/davecgh/go-spew/spew/config.go ConfigState.Sprintln 100.00% (1/1) +github.com/davecgh/go-spew/spew/config.go ConfigState.NewFormatter 100.00% (1/1) +github.com/davecgh/go-spew/spew/config.go ConfigState.Fdump 100.00% (1/1) +github.com/davecgh/go-spew/spew/config.go ConfigState.Dump 100.00% (1/1) +github.com/davecgh/go-spew/spew/dump.go Fdump 100.00% (1/1) +github.com/davecgh/go-spew/spew/dump.go Dump 100.00% (1/1) +github.com/davecgh/go-spew/spew/spew.go Fprintln 100.00% (1/1) +github.com/davecgh/go-spew/spew/format.go NewFormatter 100.00% (1/1) +github.com/davecgh/go-spew/spew/spew.go Errorf 100.00% (1/1) +github.com/davecgh/go-spew/spew/spew.go Fprint 100.00% (1/1) +github.com/davecgh/go-spew/spew/spew.go Fprintf 100.00% (1/1) +github.com/davecgh/go-spew/spew/spew.go Print 100.00% (1/1) +github.com/davecgh/go-spew/spew ------------------------------- 100.00% (505/505) + diff --git a/api/vendor/github.com/golang/protobuf/.gitignore b/api/vendor/github.com/golang/protobuf/.gitignore new file mode 100644 index 0000000..c7dd405 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/.gitignore @@ -0,0 +1,17 @@ +.DS_Store +*.[568ao] +*.ao +*.so +*.pyc +._* +.nfs.* +[568a].out +*~ +*.orig +core +_obj +_test +_testmain.go + +# Conformance test output and transient files. +conformance/failing_tests.txt diff --git a/api/vendor/github.com/golang/protobuf/.travis.yml b/api/vendor/github.com/golang/protobuf/.travis.yml new file mode 100644 index 0000000..455fa66 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/.travis.yml @@ -0,0 +1,30 @@ +sudo: false +language: go +go: +- 1.6.x +- 1.10.x +- 1.x + +install: + - go get -v -d -t github.com/golang/protobuf/... + - curl -L https://github.com/google/protobuf/releases/download/v3.5.1/protoc-3.5.1-linux-x86_64.zip -o /tmp/protoc.zip + - unzip /tmp/protoc.zip -d "$HOME"/protoc + - mkdir -p "$HOME"/src && ln -s "$HOME"/protoc "$HOME"/src/protobuf + +env: + - PATH=$HOME/protoc/bin:$PATH + +script: + - make all + - make regenerate + # TODO(tamird): When https://github.com/travis-ci/gimme/pull/130 is + # released, make this look for "1.x". + - if [[ "$TRAVIS_GO_VERSION" == 1.10* ]]; then + if [[ "$(git status --porcelain 2>&1)" != "" ]]; then + git status >&2; + git diff -a >&2; + exit 1; + fi; + echo "git status is clean."; + fi; + - make test diff --git a/api/vendor/github.com/golang/protobuf/AUTHORS b/api/vendor/github.com/golang/protobuf/AUTHORS new file mode 100644 index 0000000..15167cd --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/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 http://tip.golang.org/AUTHORS. diff --git a/api/vendor/github.com/golang/protobuf/CONTRIBUTORS b/api/vendor/github.com/golang/protobuf/CONTRIBUTORS new file mode 100644 index 0000000..1c4577e --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/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 http://tip.golang.org/CONTRIBUTORS. diff --git a/api/vendor/github.com/golang/protobuf/LICENSE b/api/vendor/github.com/golang/protobuf/LICENSE new file mode 100644 index 0000000..1b1b192 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/LICENSE @@ -0,0 +1,31 @@ +Go support for Protocol Buffers - Google's data interchange format + +Copyright 2010 The Go Authors. All rights reserved. +https://github.com/golang/protobuf + +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/api/vendor/github.com/golang/protobuf/Makefile b/api/vendor/github.com/golang/protobuf/Makefile new file mode 100644 index 0000000..2bc2621 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/Makefile @@ -0,0 +1,48 @@ +# Go support for Protocol Buffers - Google's data interchange format +# +# Copyright 2010 The Go Authors. All rights reserved. +# https://github.com/golang/protobuf +# +# 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. + +all: install + +install: + go install ./proto ./jsonpb ./ptypes ./protoc-gen-go + +test: + go test ./... ./protoc-gen-go/testdata + make -C conformance test + +clean: + go clean ./... + +nuke: + go clean -i ./... + +regenerate: + ./regenerate.sh diff --git a/api/vendor/github.com/golang/protobuf/README.md b/api/vendor/github.com/golang/protobuf/README.md new file mode 100644 index 0000000..01b29da --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/README.md @@ -0,0 +1,283 @@ +# Go support for Protocol Buffers + +[![Build Status](https://travis-ci.org/golang/protobuf.svg?branch=master)](https://travis-ci.org/golang/protobuf) +[![GoDoc](https://godoc.org/github.com/golang/protobuf?status.svg)](https://godoc.org/github.com/golang/protobuf) + +Google's data interchange format. +Copyright 2010 The Go Authors. +https://github.com/golang/protobuf + +This package and the code it generates requires at least Go 1.6. + +This software implements Go bindings for protocol buffers. For +information about protocol buffers themselves, see + https://developers.google.com/protocol-buffers/ + +## Installation ## + +To use this software, you must: +- Install the standard C++ implementation of protocol buffers from + https://developers.google.com/protocol-buffers/ +- Of course, install the Go compiler and tools from + https://golang.org/ + See + https://golang.org/doc/install + for details or, if you are using gccgo, follow the instructions at + https://golang.org/doc/install/gccgo +- Grab the code from the repository and install the proto package. + The simplest way is to run `go get -u github.com/golang/protobuf/protoc-gen-go`. + The compiler plugin, protoc-gen-go, will be installed in $GOBIN, + defaulting to $GOPATH/bin. It must be in your $PATH for the protocol + compiler, protoc, to find it. + +This software has two parts: a 'protocol compiler plugin' that +generates Go source files that, once compiled, can access and manage +protocol buffers; and a library that implements run-time support for +encoding (marshaling), decoding (unmarshaling), and accessing protocol +buffers. + +There is support for gRPC in Go using protocol buffers. +See the note at the bottom of this file for details. + +There are no insertion points in the plugin. + + +## Using protocol buffers with Go ## + +Once the software is installed, there are two steps to using it. +First you must compile the protocol buffer definitions and then import +them, with the support library, into your program. + +To compile the protocol buffer definition, run protoc with the --go_out +parameter set to the directory you want to output the Go code to. + + protoc --go_out=. *.proto + +The generated files will be suffixed .pb.go. See the Test code below +for an example using such a file. + +## Packages and input paths ## + +The protocol buffer language has a concept of "packages" which does not +correspond well to the Go notion of packages. In generated Go code, +each source `.proto` file is associated with a single Go package. The +name and import path for this package is specified with the `go_package` +proto option: + + option go_package = "github.com/golang/protobuf/ptypes/any"; + +The protocol buffer compiler will attempt to derive a package name and +import path if a `go_package` option is not present, but it is +best to always specify one explicitly. + +There is a one-to-one relationship between source `.proto` files and +generated `.pb.go` files, but any number of `.pb.go` files may be +contained in the same Go package. + +The output name of a generated file is produced by replacing the +`.proto` suffix with `.pb.go` (e.g., `foo.proto` produces `foo.pb.go`). +However, the output directory is selected in one of two ways. Let +us say we have `inputs/x.proto` with a `go_package` option of +`github.com/golang/protobuf/p`. The corresponding output file may +be: + +- Relative to the import path: + + protoc --go_out=. inputs/x.proto + # writes ./github.com/golang/protobuf/p/x.pb.go + + (This can work well with `--go_out=$GOPATH`.) + +- Relative to the input file: + + protoc --go_out=paths=source_relative:. inputs/x.proto + # generate ./inputs/x.pb.go + +## Generated code ## + +The package comment for the proto library contains text describing +the interface provided in Go for protocol buffers. Here is an edited +version. + +The proto package converts data structures to and from the +wire format of protocol buffers. It works in concert with the +Go source code generated for .proto files by the protocol compiler. + +A summary of the properties of the protocol buffer interface +for a protocol buffer variable v: + + - Names are turned from camel_case to CamelCase for export. + - There are no methods on v to set fields; just treat + them as structure fields. + - There are getters that return a field's value if set, + and return the field's default value if unset. + The getters work even if the receiver is a nil message. + - The zero value for a struct is its correct initialization state. + All desired fields must be set before marshaling. + - A Reset() method will restore a protobuf struct to its zero state. + - Non-repeated fields are pointers to the values; nil means unset. + That is, optional or required field int32 f becomes F *int32. + - Repeated fields are slices. + - Helper functions are available to aid the setting of fields. + Helpers for getting values are superseded by the + GetFoo methods and their use is deprecated. + msg.Foo = proto.String("hello") // set field + - Constants are defined to hold the default values of all fields that + have them. They have the form Default_StructName_FieldName. + Because the getter methods handle defaulted values, + direct use of these constants should be rare. + - Enums are given type names and maps from names to values. + Enum values are prefixed with the enum's type name. Enum types have + a String method, and a Enum method to assist in message construction. + - Nested groups and enums have type names prefixed with the name of + the surrounding message type. + - Extensions are given descriptor names that start with E_, + followed by an underscore-delimited list of the nested messages + that contain it (if any) followed by the CamelCased name of the + extension field itself. HasExtension, ClearExtension, GetExtension + and SetExtension are functions for manipulating extensions. + - Oneof field sets are given a single field in their message, + with distinguished wrapper types for each possible field value. + - Marshal and Unmarshal are functions to encode and decode the wire format. + +When the .proto file specifies `syntax="proto3"`, there are some differences: + + - Non-repeated fields of non-message type are values instead of pointers. + - Enum types do not get an Enum method. + +Consider file test.proto, containing + +```proto + syntax = "proto2"; + package example; + + enum FOO { X = 17; }; + + message Test { + required string label = 1; + optional int32 type = 2 [default=77]; + repeated int64 reps = 3; + optional group OptionalGroup = 4 { + required string RequiredField = 5; + } + } +``` + +To create and play with a Test object from the example package, + +```go + package main + + import ( + "log" + + "github.com/golang/protobuf/proto" + "path/to/example" + ) + + func main() { + test := &example.Test { + Label: proto.String("hello"), + Type: proto.Int32(17), + Reps: []int64{1, 2, 3}, + Optionalgroup: &example.Test_OptionalGroup { + RequiredField: proto.String("good bye"), + }, + } + data, err := proto.Marshal(test) + if err != nil { + log.Fatal("marshaling error: ", err) + } + newTest := &example.Test{} + err = proto.Unmarshal(data, newTest) + if err != nil { + log.Fatal("unmarshaling error: ", err) + } + // Now test and newTest contain the same data. + if test.GetLabel() != newTest.GetLabel() { + log.Fatalf("data mismatch %q != %q", test.GetLabel(), newTest.GetLabel()) + } + // etc. + } +``` + +## Parameters ## + +To pass extra parameters to the plugin, use a comma-separated +parameter list separated from the output directory by a colon: + + protoc --go_out=plugins=grpc,import_path=mypackage:. *.proto + +- `paths=(import | source_relative)` - specifies how the paths of + generated files are structured. See the "Packages and imports paths" + section above. The default is `import`. +- `plugins=plugin1+plugin2` - specifies the list of sub-plugins to + load. The only plugin in this repo is `grpc`. +- `Mfoo/bar.proto=quux/shme` - declares that foo/bar.proto is + associated with Go package quux/shme. This is subject to the + import_prefix parameter. + +The following parameters are deprecated and should not be used: + +- `import_prefix=xxx` - a prefix that is added onto the beginning of + all imports. +- `import_path=foo/bar` - used as the package if no input files + declare `go_package`. If it contains slashes, everything up to the + rightmost slash is ignored. + +## gRPC Support ## + +If a proto file specifies RPC services, protoc-gen-go can be instructed to +generate code compatible with gRPC (http://www.grpc.io/). To do this, pass +the `plugins` parameter to protoc-gen-go; the usual way is to insert it into +the --go_out argument to protoc: + + protoc --go_out=plugins=grpc:. *.proto + +## Compatibility ## + +The library and the generated code are expected to be stable over time. +However, we reserve the right to make breaking changes without notice for the +following reasons: + +- Security. A security issue in the specification or implementation may come to + light whose resolution requires breaking compatibility. We reserve the right + to address such security issues. +- Unspecified behavior. There are some aspects of the Protocol Buffers + specification that are undefined. Programs that depend on such unspecified + behavior may break in future releases. +- Specification errors or changes. If it becomes necessary to address an + inconsistency, incompleteness, or change in the Protocol Buffers + specification, resolving the issue could affect the meaning or legality of + existing programs. We reserve the right to address such issues, including + updating the implementations. +- Bugs. If the library has a bug that violates the specification, a program + that depends on the buggy behavior may break if the bug is fixed. We reserve + the right to fix such bugs. +- Adding methods or fields to generated structs. These may conflict with field + names that already exist in a schema, causing applications to break. When the + code generator encounters a field in the schema that would collide with a + generated field or method name, the code generator will append an underscore + to the generated field or method name. +- Adding, removing, or changing methods or fields in generated structs that + start with `XXX`. These parts of the generated code are exported out of + necessity, but should not be considered part of the public API. +- Adding, removing, or changing unexported symbols in generated code. + +Any breaking changes outside of these will be announced 6 months in advance to +protobuf@googlegroups.com. + +You should, whenever possible, use generated code created by the `protoc-gen-go` +tool built at the same commit as the `proto` package. The `proto` package +declares package-level constants in the form `ProtoPackageIsVersionX`. +Application code and generated code may depend on one of these constants to +ensure that compilation will fail if the available version of the proto library +is too old. Whenever we make a change to the generated code that requires newer +library support, in the same commit we will increment the version number of the +generated code and declare a new package-level constant whose name incorporates +the latest version number. Removing a compatibility constant is considered a +breaking change and would be subject to the announcement policy stated above. + +The `protoc-gen-go/generator` package exposes a plugin interface, +which is used by the gRPC code generation. This interface is not +supported and is subject to incompatible changes without notice. diff --git a/api/vendor/github.com/golang/protobuf/conformance/Makefile b/api/vendor/github.com/golang/protobuf/conformance/Makefile new file mode 100644 index 0000000..b99e4ed --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/conformance/Makefile @@ -0,0 +1,49 @@ +# Go support for Protocol Buffers - Google's data interchange format +# +# Copyright 2016 The Go Authors. All rights reserved. +# https://github.com/golang/protobuf +# +# 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. + +PROTOBUF_ROOT=$(HOME)/src/protobuf + +all: + @echo To run the tests in this directory, acquire the main protobuf + @echo distribution from: + @echo + @echo ' https://github.com/google/protobuf' + @echo + @echo Build the test runner with: + @echo + @echo ' cd conformance && make conformance-test-runner' + @echo + @echo And run the tests in this directory with: + @echo + @echo ' make test PROTOBUF_ROOT=' + +test: + ./test.sh $(PROTOBUF_ROOT) diff --git a/api/vendor/github.com/golang/protobuf/conformance/conformance.go b/api/vendor/github.com/golang/protobuf/conformance/conformance.go new file mode 100644 index 0000000..3029312 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/conformance/conformance.go @@ -0,0 +1,154 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +// conformance implements the conformance test subprocess protocol as +// documented in conformance.proto. +package main + +import ( + "encoding/binary" + "fmt" + "io" + "os" + + pb "github.com/golang/protobuf/conformance/internal/conformance_proto" + "github.com/golang/protobuf/jsonpb" + "github.com/golang/protobuf/proto" +) + +func main() { + var sizeBuf [4]byte + inbuf := make([]byte, 0, 4096) + outbuf := proto.NewBuffer(nil) + for { + if _, err := io.ReadFull(os.Stdin, sizeBuf[:]); err == io.EOF { + break + } else if err != nil { + fmt.Fprintln(os.Stderr, "go conformance: read request:", err) + os.Exit(1) + } + size := binary.LittleEndian.Uint32(sizeBuf[:]) + if int(size) > cap(inbuf) { + inbuf = make([]byte, size) + } + inbuf = inbuf[:size] + if _, err := io.ReadFull(os.Stdin, inbuf); err != nil { + fmt.Fprintln(os.Stderr, "go conformance: read request:", err) + os.Exit(1) + } + + req := new(pb.ConformanceRequest) + if err := proto.Unmarshal(inbuf, req); err != nil { + fmt.Fprintln(os.Stderr, "go conformance: parse request:", err) + os.Exit(1) + } + res := handle(req) + + if err := outbuf.Marshal(res); err != nil { + fmt.Fprintln(os.Stderr, "go conformance: marshal response:", err) + os.Exit(1) + } + binary.LittleEndian.PutUint32(sizeBuf[:], uint32(len(outbuf.Bytes()))) + if _, err := os.Stdout.Write(sizeBuf[:]); err != nil { + fmt.Fprintln(os.Stderr, "go conformance: write response:", err) + os.Exit(1) + } + if _, err := os.Stdout.Write(outbuf.Bytes()); err != nil { + fmt.Fprintln(os.Stderr, "go conformance: write response:", err) + os.Exit(1) + } + outbuf.Reset() + } +} + +var jsonMarshaler = jsonpb.Marshaler{ + OrigName: true, +} + +func handle(req *pb.ConformanceRequest) *pb.ConformanceResponse { + var err error + var msg pb.TestAllTypes + switch p := req.Payload.(type) { + case *pb.ConformanceRequest_ProtobufPayload: + err = proto.Unmarshal(p.ProtobufPayload, &msg) + case *pb.ConformanceRequest_JsonPayload: + err = jsonpb.UnmarshalString(p.JsonPayload, &msg) + default: + return &pb.ConformanceResponse{ + Result: &pb.ConformanceResponse_RuntimeError{ + RuntimeError: "unknown request payload type", + }, + } + } + if err != nil { + return &pb.ConformanceResponse{ + Result: &pb.ConformanceResponse_ParseError{ + ParseError: err.Error(), + }, + } + } + switch req.RequestedOutputFormat { + case pb.WireFormat_PROTOBUF: + p, err := proto.Marshal(&msg) + if err != nil { + return &pb.ConformanceResponse{ + Result: &pb.ConformanceResponse_SerializeError{ + SerializeError: err.Error(), + }, + } + } + return &pb.ConformanceResponse{ + Result: &pb.ConformanceResponse_ProtobufPayload{ + ProtobufPayload: p, + }, + } + case pb.WireFormat_JSON: + p, err := jsonMarshaler.MarshalToString(&msg) + if err != nil { + return &pb.ConformanceResponse{ + Result: &pb.ConformanceResponse_SerializeError{ + SerializeError: err.Error(), + }, + } + } + return &pb.ConformanceResponse{ + Result: &pb.ConformanceResponse_JsonPayload{ + JsonPayload: p, + }, + } + default: + return &pb.ConformanceResponse{ + Result: &pb.ConformanceResponse_RuntimeError{ + RuntimeError: "unknown output format", + }, + } + } +} diff --git a/api/vendor/github.com/golang/protobuf/conformance/conformance.sh b/api/vendor/github.com/golang/protobuf/conformance/conformance.sh new file mode 100755 index 0000000..8532f57 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/conformance/conformance.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +cd $(dirname $0) +exec go run conformance.go $* diff --git a/api/vendor/github.com/golang/protobuf/conformance/failure_list_go.txt b/api/vendor/github.com/golang/protobuf/conformance/failure_list_go.txt new file mode 100644 index 0000000..d372808 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/conformance/failure_list_go.txt @@ -0,0 +1,61 @@ +# This is the list of conformance tests that are known ot fail right now. +# TODO: These should be fixed. + +DurationProtoInputTooLarge.JsonOutput +DurationProtoInputTooSmall.JsonOutput +FieldMaskNumbersDontRoundTrip.JsonOutput +FieldMaskPathsDontRoundTrip.JsonOutput +FieldMaskTooManyUnderscore.JsonOutput +JsonInput.AnyWithFieldMask.JsonOutput +JsonInput.AnyWithFieldMask.ProtobufOutput +JsonInput.DoubleFieldQuotedValue.JsonOutput +JsonInput.DoubleFieldQuotedValue.ProtobufOutput +JsonInput.DurationHas3FractionalDigits.Validator +JsonInput.DurationHas6FractionalDigits.Validator +JsonInput.DurationHas9FractionalDigits.Validator +JsonInput.DurationHasZeroFractionalDigit.Validator +JsonInput.DurationMaxValue.JsonOutput +JsonInput.DurationMaxValue.ProtobufOutput +JsonInput.DurationMinValue.JsonOutput +JsonInput.DurationMinValue.ProtobufOutput +JsonInput.EnumFieldUnknownValue.Validator +JsonInput.FieldMask.JsonOutput +JsonInput.FieldMask.ProtobufOutput +JsonInput.FieldNameInLowerCamelCase.Validator +JsonInput.FieldNameWithMixedCases.JsonOutput +JsonInput.FieldNameWithMixedCases.ProtobufOutput +JsonInput.FieldNameWithMixedCases.Validator +JsonInput.FieldNameWithNumbers.Validator +JsonInput.FloatFieldQuotedValue.JsonOutput +JsonInput.FloatFieldQuotedValue.ProtobufOutput +JsonInput.Int32FieldExponentialFormat.JsonOutput +JsonInput.Int32FieldExponentialFormat.ProtobufOutput +JsonInput.Int32FieldFloatTrailingZero.JsonOutput +JsonInput.Int32FieldFloatTrailingZero.ProtobufOutput +JsonInput.Int32FieldMaxFloatValue.JsonOutput +JsonInput.Int32FieldMaxFloatValue.ProtobufOutput +JsonInput.Int32FieldMinFloatValue.JsonOutput +JsonInput.Int32FieldMinFloatValue.ProtobufOutput +JsonInput.Int32FieldStringValue.JsonOutput +JsonInput.Int32FieldStringValue.ProtobufOutput +JsonInput.Int32FieldStringValueEscaped.JsonOutput +JsonInput.Int32FieldStringValueEscaped.ProtobufOutput +JsonInput.Int64FieldBeString.Validator +JsonInput.MapFieldValueIsNull +JsonInput.OneofFieldDuplicate +JsonInput.RepeatedFieldMessageElementIsNull +JsonInput.RepeatedFieldPrimitiveElementIsNull +JsonInput.StringFieldSurrogateInWrongOrder +JsonInput.StringFieldUnpairedHighSurrogate +JsonInput.StringFieldUnpairedLowSurrogate +JsonInput.TimestampHas3FractionalDigits.Validator +JsonInput.TimestampHas6FractionalDigits.Validator +JsonInput.TimestampHas9FractionalDigits.Validator +JsonInput.TimestampHasZeroFractionalDigit.Validator +JsonInput.TimestampJsonInputTooSmall +JsonInput.TimestampZeroNormalized.Validator +JsonInput.Uint32FieldMaxFloatValue.JsonOutput +JsonInput.Uint32FieldMaxFloatValue.ProtobufOutput +JsonInput.Uint64FieldBeString.Validator +TimestampProtoInputTooLarge.JsonOutput +TimestampProtoInputTooSmall.JsonOutput diff --git a/api/vendor/github.com/golang/protobuf/conformance/internal/conformance_proto/conformance.pb.go b/api/vendor/github.com/golang/protobuf/conformance/internal/conformance_proto/conformance.pb.go new file mode 100644 index 0000000..82d4541 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/conformance/internal/conformance_proto/conformance.pb.go @@ -0,0 +1,1816 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: conformance.proto + +package conformance + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" +import any "github.com/golang/protobuf/ptypes/any" +import duration "github.com/golang/protobuf/ptypes/duration" +import _struct "github.com/golang/protobuf/ptypes/struct" +import timestamp "github.com/golang/protobuf/ptypes/timestamp" +import wrappers "github.com/golang/protobuf/ptypes/wrappers" +import field_mask "google.golang.org/genproto/protobuf/field_mask" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type WireFormat int32 + +const ( + WireFormat_UNSPECIFIED WireFormat = 0 + WireFormat_PROTOBUF WireFormat = 1 + WireFormat_JSON WireFormat = 2 +) + +var WireFormat_name = map[int32]string{ + 0: "UNSPECIFIED", + 1: "PROTOBUF", + 2: "JSON", +} +var WireFormat_value = map[string]int32{ + "UNSPECIFIED": 0, + "PROTOBUF": 1, + "JSON": 2, +} + +func (x WireFormat) String() string { + return proto.EnumName(WireFormat_name, int32(x)) +} +func (WireFormat) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_conformance_48ac832451f5d6c3, []int{0} +} + +type ForeignEnum int32 + +const ( + ForeignEnum_FOREIGN_FOO ForeignEnum = 0 + ForeignEnum_FOREIGN_BAR ForeignEnum = 1 + ForeignEnum_FOREIGN_BAZ ForeignEnum = 2 +) + +var ForeignEnum_name = map[int32]string{ + 0: "FOREIGN_FOO", + 1: "FOREIGN_BAR", + 2: "FOREIGN_BAZ", +} +var ForeignEnum_value = map[string]int32{ + "FOREIGN_FOO": 0, + "FOREIGN_BAR": 1, + "FOREIGN_BAZ": 2, +} + +func (x ForeignEnum) String() string { + return proto.EnumName(ForeignEnum_name, int32(x)) +} +func (ForeignEnum) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_conformance_48ac832451f5d6c3, []int{1} +} + +type TestAllTypes_NestedEnum int32 + +const ( + TestAllTypes_FOO TestAllTypes_NestedEnum = 0 + TestAllTypes_BAR TestAllTypes_NestedEnum = 1 + TestAllTypes_BAZ TestAllTypes_NestedEnum = 2 + TestAllTypes_NEG TestAllTypes_NestedEnum = -1 +) + +var TestAllTypes_NestedEnum_name = map[int32]string{ + 0: "FOO", + 1: "BAR", + 2: "BAZ", + -1: "NEG", +} +var TestAllTypes_NestedEnum_value = map[string]int32{ + "FOO": 0, + "BAR": 1, + "BAZ": 2, + "NEG": -1, +} + +func (x TestAllTypes_NestedEnum) String() string { + return proto.EnumName(TestAllTypes_NestedEnum_name, int32(x)) +} +func (TestAllTypes_NestedEnum) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_conformance_48ac832451f5d6c3, []int{2, 0} +} + +// Represents a single test case's input. The testee should: +// +// 1. parse this proto (which should always succeed) +// 2. parse the protobuf or JSON payload in "payload" (which may fail) +// 3. if the parse succeeded, serialize the message in the requested format. +type ConformanceRequest struct { + // The payload (whether protobuf of JSON) is always for a TestAllTypes proto + // (see below). + // + // Types that are valid to be assigned to Payload: + // *ConformanceRequest_ProtobufPayload + // *ConformanceRequest_JsonPayload + Payload isConformanceRequest_Payload `protobuf_oneof:"payload"` + // Which format should the testee serialize its message to? + RequestedOutputFormat WireFormat `protobuf:"varint,3,opt,name=requested_output_format,json=requestedOutputFormat,enum=conformance.WireFormat" json:"requested_output_format,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ConformanceRequest) Reset() { *m = ConformanceRequest{} } +func (m *ConformanceRequest) String() string { return proto.CompactTextString(m) } +func (*ConformanceRequest) ProtoMessage() {} +func (*ConformanceRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_conformance_48ac832451f5d6c3, []int{0} +} +func (m *ConformanceRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ConformanceRequest.Unmarshal(m, b) +} +func (m *ConformanceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ConformanceRequest.Marshal(b, m, deterministic) +} +func (dst *ConformanceRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ConformanceRequest.Merge(dst, src) +} +func (m *ConformanceRequest) XXX_Size() int { + return xxx_messageInfo_ConformanceRequest.Size(m) +} +func (m *ConformanceRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ConformanceRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_ConformanceRequest proto.InternalMessageInfo + +type isConformanceRequest_Payload interface { + isConformanceRequest_Payload() +} + +type ConformanceRequest_ProtobufPayload struct { + ProtobufPayload []byte `protobuf:"bytes,1,opt,name=protobuf_payload,json=protobufPayload,proto3,oneof"` +} +type ConformanceRequest_JsonPayload struct { + JsonPayload string `protobuf:"bytes,2,opt,name=json_payload,json=jsonPayload,oneof"` +} + +func (*ConformanceRequest_ProtobufPayload) isConformanceRequest_Payload() {} +func (*ConformanceRequest_JsonPayload) isConformanceRequest_Payload() {} + +func (m *ConformanceRequest) GetPayload() isConformanceRequest_Payload { + if m != nil { + return m.Payload + } + return nil +} + +func (m *ConformanceRequest) GetProtobufPayload() []byte { + if x, ok := m.GetPayload().(*ConformanceRequest_ProtobufPayload); ok { + return x.ProtobufPayload + } + return nil +} + +func (m *ConformanceRequest) GetJsonPayload() string { + if x, ok := m.GetPayload().(*ConformanceRequest_JsonPayload); ok { + return x.JsonPayload + } + return "" +} + +func (m *ConformanceRequest) GetRequestedOutputFormat() WireFormat { + if m != nil { + return m.RequestedOutputFormat + } + return WireFormat_UNSPECIFIED +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*ConformanceRequest) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _ConformanceRequest_OneofMarshaler, _ConformanceRequest_OneofUnmarshaler, _ConformanceRequest_OneofSizer, []interface{}{ + (*ConformanceRequest_ProtobufPayload)(nil), + (*ConformanceRequest_JsonPayload)(nil), + } +} + +func _ConformanceRequest_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*ConformanceRequest) + // payload + switch x := m.Payload.(type) { + case *ConformanceRequest_ProtobufPayload: + b.EncodeVarint(1<<3 | proto.WireBytes) + b.EncodeRawBytes(x.ProtobufPayload) + case *ConformanceRequest_JsonPayload: + b.EncodeVarint(2<<3 | proto.WireBytes) + b.EncodeStringBytes(x.JsonPayload) + case nil: + default: + return fmt.Errorf("ConformanceRequest.Payload has unexpected type %T", x) + } + return nil +} + +func _ConformanceRequest_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*ConformanceRequest) + switch tag { + case 1: // payload.protobuf_payload + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeRawBytes(true) + m.Payload = &ConformanceRequest_ProtobufPayload{x} + return true, err + case 2: // payload.json_payload + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeStringBytes() + m.Payload = &ConformanceRequest_JsonPayload{x} + return true, err + default: + return false, nil + } +} + +func _ConformanceRequest_OneofSizer(msg proto.Message) (n int) { + m := msg.(*ConformanceRequest) + // payload + switch x := m.Payload.(type) { + case *ConformanceRequest_ProtobufPayload: + n += 1 // tag and wire + n += proto.SizeVarint(uint64(len(x.ProtobufPayload))) + n += len(x.ProtobufPayload) + case *ConformanceRequest_JsonPayload: + n += 1 // tag and wire + n += proto.SizeVarint(uint64(len(x.JsonPayload))) + n += len(x.JsonPayload) + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +// Represents a single test case's output. +type ConformanceResponse struct { + // Types that are valid to be assigned to Result: + // *ConformanceResponse_ParseError + // *ConformanceResponse_SerializeError + // *ConformanceResponse_RuntimeError + // *ConformanceResponse_ProtobufPayload + // *ConformanceResponse_JsonPayload + // *ConformanceResponse_Skipped + Result isConformanceResponse_Result `protobuf_oneof:"result"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ConformanceResponse) Reset() { *m = ConformanceResponse{} } +func (m *ConformanceResponse) String() string { return proto.CompactTextString(m) } +func (*ConformanceResponse) ProtoMessage() {} +func (*ConformanceResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_conformance_48ac832451f5d6c3, []int{1} +} +func (m *ConformanceResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ConformanceResponse.Unmarshal(m, b) +} +func (m *ConformanceResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ConformanceResponse.Marshal(b, m, deterministic) +} +func (dst *ConformanceResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_ConformanceResponse.Merge(dst, src) +} +func (m *ConformanceResponse) XXX_Size() int { + return xxx_messageInfo_ConformanceResponse.Size(m) +} +func (m *ConformanceResponse) XXX_DiscardUnknown() { + xxx_messageInfo_ConformanceResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_ConformanceResponse proto.InternalMessageInfo + +type isConformanceResponse_Result interface { + isConformanceResponse_Result() +} + +type ConformanceResponse_ParseError struct { + ParseError string `protobuf:"bytes,1,opt,name=parse_error,json=parseError,oneof"` +} +type ConformanceResponse_SerializeError struct { + SerializeError string `protobuf:"bytes,6,opt,name=serialize_error,json=serializeError,oneof"` +} +type ConformanceResponse_RuntimeError struct { + RuntimeError string `protobuf:"bytes,2,opt,name=runtime_error,json=runtimeError,oneof"` +} +type ConformanceResponse_ProtobufPayload struct { + ProtobufPayload []byte `protobuf:"bytes,3,opt,name=protobuf_payload,json=protobufPayload,proto3,oneof"` +} +type ConformanceResponse_JsonPayload struct { + JsonPayload string `protobuf:"bytes,4,opt,name=json_payload,json=jsonPayload,oneof"` +} +type ConformanceResponse_Skipped struct { + Skipped string `protobuf:"bytes,5,opt,name=skipped,oneof"` +} + +func (*ConformanceResponse_ParseError) isConformanceResponse_Result() {} +func (*ConformanceResponse_SerializeError) isConformanceResponse_Result() {} +func (*ConformanceResponse_RuntimeError) isConformanceResponse_Result() {} +func (*ConformanceResponse_ProtobufPayload) isConformanceResponse_Result() {} +func (*ConformanceResponse_JsonPayload) isConformanceResponse_Result() {} +func (*ConformanceResponse_Skipped) isConformanceResponse_Result() {} + +func (m *ConformanceResponse) GetResult() isConformanceResponse_Result { + if m != nil { + return m.Result + } + return nil +} + +func (m *ConformanceResponse) GetParseError() string { + if x, ok := m.GetResult().(*ConformanceResponse_ParseError); ok { + return x.ParseError + } + return "" +} + +func (m *ConformanceResponse) GetSerializeError() string { + if x, ok := m.GetResult().(*ConformanceResponse_SerializeError); ok { + return x.SerializeError + } + return "" +} + +func (m *ConformanceResponse) GetRuntimeError() string { + if x, ok := m.GetResult().(*ConformanceResponse_RuntimeError); ok { + return x.RuntimeError + } + return "" +} + +func (m *ConformanceResponse) GetProtobufPayload() []byte { + if x, ok := m.GetResult().(*ConformanceResponse_ProtobufPayload); ok { + return x.ProtobufPayload + } + return nil +} + +func (m *ConformanceResponse) GetJsonPayload() string { + if x, ok := m.GetResult().(*ConformanceResponse_JsonPayload); ok { + return x.JsonPayload + } + return "" +} + +func (m *ConformanceResponse) GetSkipped() string { + if x, ok := m.GetResult().(*ConformanceResponse_Skipped); ok { + return x.Skipped + } + return "" +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*ConformanceResponse) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _ConformanceResponse_OneofMarshaler, _ConformanceResponse_OneofUnmarshaler, _ConformanceResponse_OneofSizer, []interface{}{ + (*ConformanceResponse_ParseError)(nil), + (*ConformanceResponse_SerializeError)(nil), + (*ConformanceResponse_RuntimeError)(nil), + (*ConformanceResponse_ProtobufPayload)(nil), + (*ConformanceResponse_JsonPayload)(nil), + (*ConformanceResponse_Skipped)(nil), + } +} + +func _ConformanceResponse_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*ConformanceResponse) + // result + switch x := m.Result.(type) { + case *ConformanceResponse_ParseError: + b.EncodeVarint(1<<3 | proto.WireBytes) + b.EncodeStringBytes(x.ParseError) + case *ConformanceResponse_SerializeError: + b.EncodeVarint(6<<3 | proto.WireBytes) + b.EncodeStringBytes(x.SerializeError) + case *ConformanceResponse_RuntimeError: + b.EncodeVarint(2<<3 | proto.WireBytes) + b.EncodeStringBytes(x.RuntimeError) + case *ConformanceResponse_ProtobufPayload: + b.EncodeVarint(3<<3 | proto.WireBytes) + b.EncodeRawBytes(x.ProtobufPayload) + case *ConformanceResponse_JsonPayload: + b.EncodeVarint(4<<3 | proto.WireBytes) + b.EncodeStringBytes(x.JsonPayload) + case *ConformanceResponse_Skipped: + b.EncodeVarint(5<<3 | proto.WireBytes) + b.EncodeStringBytes(x.Skipped) + case nil: + default: + return fmt.Errorf("ConformanceResponse.Result has unexpected type %T", x) + } + return nil +} + +func _ConformanceResponse_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*ConformanceResponse) + switch tag { + case 1: // result.parse_error + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeStringBytes() + m.Result = &ConformanceResponse_ParseError{x} + return true, err + case 6: // result.serialize_error + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeStringBytes() + m.Result = &ConformanceResponse_SerializeError{x} + return true, err + case 2: // result.runtime_error + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeStringBytes() + m.Result = &ConformanceResponse_RuntimeError{x} + return true, err + case 3: // result.protobuf_payload + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeRawBytes(true) + m.Result = &ConformanceResponse_ProtobufPayload{x} + return true, err + case 4: // result.json_payload + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeStringBytes() + m.Result = &ConformanceResponse_JsonPayload{x} + return true, err + case 5: // result.skipped + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeStringBytes() + m.Result = &ConformanceResponse_Skipped{x} + return true, err + default: + return false, nil + } +} + +func _ConformanceResponse_OneofSizer(msg proto.Message) (n int) { + m := msg.(*ConformanceResponse) + // result + switch x := m.Result.(type) { + case *ConformanceResponse_ParseError: + n += 1 // tag and wire + n += proto.SizeVarint(uint64(len(x.ParseError))) + n += len(x.ParseError) + case *ConformanceResponse_SerializeError: + n += 1 // tag and wire + n += proto.SizeVarint(uint64(len(x.SerializeError))) + n += len(x.SerializeError) + case *ConformanceResponse_RuntimeError: + n += 1 // tag and wire + n += proto.SizeVarint(uint64(len(x.RuntimeError))) + n += len(x.RuntimeError) + case *ConformanceResponse_ProtobufPayload: + n += 1 // tag and wire + n += proto.SizeVarint(uint64(len(x.ProtobufPayload))) + n += len(x.ProtobufPayload) + case *ConformanceResponse_JsonPayload: + n += 1 // tag and wire + n += proto.SizeVarint(uint64(len(x.JsonPayload))) + n += len(x.JsonPayload) + case *ConformanceResponse_Skipped: + n += 1 // tag and wire + n += proto.SizeVarint(uint64(len(x.Skipped))) + n += len(x.Skipped) + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +// This proto includes every type of field in both singular and repeated +// forms. +type TestAllTypes struct { + // Singular + OptionalInt32 int32 `protobuf:"varint,1,opt,name=optional_int32,json=optionalInt32" json:"optional_int32,omitempty"` + OptionalInt64 int64 `protobuf:"varint,2,opt,name=optional_int64,json=optionalInt64" json:"optional_int64,omitempty"` + OptionalUint32 uint32 `protobuf:"varint,3,opt,name=optional_uint32,json=optionalUint32" json:"optional_uint32,omitempty"` + OptionalUint64 uint64 `protobuf:"varint,4,opt,name=optional_uint64,json=optionalUint64" json:"optional_uint64,omitempty"` + OptionalSint32 int32 `protobuf:"zigzag32,5,opt,name=optional_sint32,json=optionalSint32" json:"optional_sint32,omitempty"` + OptionalSint64 int64 `protobuf:"zigzag64,6,opt,name=optional_sint64,json=optionalSint64" json:"optional_sint64,omitempty"` + OptionalFixed32 uint32 `protobuf:"fixed32,7,opt,name=optional_fixed32,json=optionalFixed32" json:"optional_fixed32,omitempty"` + OptionalFixed64 uint64 `protobuf:"fixed64,8,opt,name=optional_fixed64,json=optionalFixed64" json:"optional_fixed64,omitempty"` + OptionalSfixed32 int32 `protobuf:"fixed32,9,opt,name=optional_sfixed32,json=optionalSfixed32" json:"optional_sfixed32,omitempty"` + OptionalSfixed64 int64 `protobuf:"fixed64,10,opt,name=optional_sfixed64,json=optionalSfixed64" json:"optional_sfixed64,omitempty"` + OptionalFloat float32 `protobuf:"fixed32,11,opt,name=optional_float,json=optionalFloat" json:"optional_float,omitempty"` + OptionalDouble float64 `protobuf:"fixed64,12,opt,name=optional_double,json=optionalDouble" json:"optional_double,omitempty"` + OptionalBool bool `protobuf:"varint,13,opt,name=optional_bool,json=optionalBool" json:"optional_bool,omitempty"` + OptionalString string `protobuf:"bytes,14,opt,name=optional_string,json=optionalString" json:"optional_string,omitempty"` + OptionalBytes []byte `protobuf:"bytes,15,opt,name=optional_bytes,json=optionalBytes,proto3" json:"optional_bytes,omitempty"` + OptionalNestedMessage *TestAllTypes_NestedMessage `protobuf:"bytes,18,opt,name=optional_nested_message,json=optionalNestedMessage" json:"optional_nested_message,omitempty"` + OptionalForeignMessage *ForeignMessage `protobuf:"bytes,19,opt,name=optional_foreign_message,json=optionalForeignMessage" json:"optional_foreign_message,omitempty"` + OptionalNestedEnum TestAllTypes_NestedEnum `protobuf:"varint,21,opt,name=optional_nested_enum,json=optionalNestedEnum,enum=conformance.TestAllTypes_NestedEnum" json:"optional_nested_enum,omitempty"` + OptionalForeignEnum ForeignEnum `protobuf:"varint,22,opt,name=optional_foreign_enum,json=optionalForeignEnum,enum=conformance.ForeignEnum" json:"optional_foreign_enum,omitempty"` + OptionalStringPiece string `protobuf:"bytes,24,opt,name=optional_string_piece,json=optionalStringPiece" json:"optional_string_piece,omitempty"` + OptionalCord string `protobuf:"bytes,25,opt,name=optional_cord,json=optionalCord" json:"optional_cord,omitempty"` + RecursiveMessage *TestAllTypes `protobuf:"bytes,27,opt,name=recursive_message,json=recursiveMessage" json:"recursive_message,omitempty"` + // Repeated + RepeatedInt32 []int32 `protobuf:"varint,31,rep,packed,name=repeated_int32,json=repeatedInt32" json:"repeated_int32,omitempty"` + RepeatedInt64 []int64 `protobuf:"varint,32,rep,packed,name=repeated_int64,json=repeatedInt64" json:"repeated_int64,omitempty"` + RepeatedUint32 []uint32 `protobuf:"varint,33,rep,packed,name=repeated_uint32,json=repeatedUint32" json:"repeated_uint32,omitempty"` + RepeatedUint64 []uint64 `protobuf:"varint,34,rep,packed,name=repeated_uint64,json=repeatedUint64" json:"repeated_uint64,omitempty"` + RepeatedSint32 []int32 `protobuf:"zigzag32,35,rep,packed,name=repeated_sint32,json=repeatedSint32" json:"repeated_sint32,omitempty"` + RepeatedSint64 []int64 `protobuf:"zigzag64,36,rep,packed,name=repeated_sint64,json=repeatedSint64" json:"repeated_sint64,omitempty"` + RepeatedFixed32 []uint32 `protobuf:"fixed32,37,rep,packed,name=repeated_fixed32,json=repeatedFixed32" json:"repeated_fixed32,omitempty"` + RepeatedFixed64 []uint64 `protobuf:"fixed64,38,rep,packed,name=repeated_fixed64,json=repeatedFixed64" json:"repeated_fixed64,omitempty"` + RepeatedSfixed32 []int32 `protobuf:"fixed32,39,rep,packed,name=repeated_sfixed32,json=repeatedSfixed32" json:"repeated_sfixed32,omitempty"` + RepeatedSfixed64 []int64 `protobuf:"fixed64,40,rep,packed,name=repeated_sfixed64,json=repeatedSfixed64" json:"repeated_sfixed64,omitempty"` + RepeatedFloat []float32 `protobuf:"fixed32,41,rep,packed,name=repeated_float,json=repeatedFloat" json:"repeated_float,omitempty"` + RepeatedDouble []float64 `protobuf:"fixed64,42,rep,packed,name=repeated_double,json=repeatedDouble" json:"repeated_double,omitempty"` + RepeatedBool []bool `protobuf:"varint,43,rep,packed,name=repeated_bool,json=repeatedBool" json:"repeated_bool,omitempty"` + RepeatedString []string `protobuf:"bytes,44,rep,name=repeated_string,json=repeatedString" json:"repeated_string,omitempty"` + RepeatedBytes [][]byte `protobuf:"bytes,45,rep,name=repeated_bytes,json=repeatedBytes,proto3" json:"repeated_bytes,omitempty"` + RepeatedNestedMessage []*TestAllTypes_NestedMessage `protobuf:"bytes,48,rep,name=repeated_nested_message,json=repeatedNestedMessage" json:"repeated_nested_message,omitempty"` + RepeatedForeignMessage []*ForeignMessage `protobuf:"bytes,49,rep,name=repeated_foreign_message,json=repeatedForeignMessage" json:"repeated_foreign_message,omitempty"` + RepeatedNestedEnum []TestAllTypes_NestedEnum `protobuf:"varint,51,rep,packed,name=repeated_nested_enum,json=repeatedNestedEnum,enum=conformance.TestAllTypes_NestedEnum" json:"repeated_nested_enum,omitempty"` + RepeatedForeignEnum []ForeignEnum `protobuf:"varint,52,rep,packed,name=repeated_foreign_enum,json=repeatedForeignEnum,enum=conformance.ForeignEnum" json:"repeated_foreign_enum,omitempty"` + RepeatedStringPiece []string `protobuf:"bytes,54,rep,name=repeated_string_piece,json=repeatedStringPiece" json:"repeated_string_piece,omitempty"` + RepeatedCord []string `protobuf:"bytes,55,rep,name=repeated_cord,json=repeatedCord" json:"repeated_cord,omitempty"` + // Map + MapInt32Int32 map[int32]int32 `protobuf:"bytes,56,rep,name=map_int32_int32,json=mapInt32Int32" json:"map_int32_int32,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"` + MapInt64Int64 map[int64]int64 `protobuf:"bytes,57,rep,name=map_int64_int64,json=mapInt64Int64" json:"map_int64_int64,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"` + MapUint32Uint32 map[uint32]uint32 `protobuf:"bytes,58,rep,name=map_uint32_uint32,json=mapUint32Uint32" json:"map_uint32_uint32,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"` + MapUint64Uint64 map[uint64]uint64 `protobuf:"bytes,59,rep,name=map_uint64_uint64,json=mapUint64Uint64" json:"map_uint64_uint64,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"` + MapSint32Sint32 map[int32]int32 `protobuf:"bytes,60,rep,name=map_sint32_sint32,json=mapSint32Sint32" json:"map_sint32_sint32,omitempty" protobuf_key:"zigzag32,1,opt,name=key" protobuf_val:"zigzag32,2,opt,name=value"` + MapSint64Sint64 map[int64]int64 `protobuf:"bytes,61,rep,name=map_sint64_sint64,json=mapSint64Sint64" json:"map_sint64_sint64,omitempty" protobuf_key:"zigzag64,1,opt,name=key" protobuf_val:"zigzag64,2,opt,name=value"` + MapFixed32Fixed32 map[uint32]uint32 `protobuf:"bytes,62,rep,name=map_fixed32_fixed32,json=mapFixed32Fixed32" json:"map_fixed32_fixed32,omitempty" protobuf_key:"fixed32,1,opt,name=key" protobuf_val:"fixed32,2,opt,name=value"` + MapFixed64Fixed64 map[uint64]uint64 `protobuf:"bytes,63,rep,name=map_fixed64_fixed64,json=mapFixed64Fixed64" json:"map_fixed64_fixed64,omitempty" protobuf_key:"fixed64,1,opt,name=key" protobuf_val:"fixed64,2,opt,name=value"` + MapSfixed32Sfixed32 map[int32]int32 `protobuf:"bytes,64,rep,name=map_sfixed32_sfixed32,json=mapSfixed32Sfixed32" json:"map_sfixed32_sfixed32,omitempty" protobuf_key:"fixed32,1,opt,name=key" protobuf_val:"fixed32,2,opt,name=value"` + MapSfixed64Sfixed64 map[int64]int64 `protobuf:"bytes,65,rep,name=map_sfixed64_sfixed64,json=mapSfixed64Sfixed64" json:"map_sfixed64_sfixed64,omitempty" protobuf_key:"fixed64,1,opt,name=key" protobuf_val:"fixed64,2,opt,name=value"` + MapInt32Float map[int32]float32 `protobuf:"bytes,66,rep,name=map_int32_float,json=mapInt32Float" json:"map_int32_float,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"fixed32,2,opt,name=value"` + MapInt32Double map[int32]float64 `protobuf:"bytes,67,rep,name=map_int32_double,json=mapInt32Double" json:"map_int32_double,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"fixed64,2,opt,name=value"` + MapBoolBool map[bool]bool `protobuf:"bytes,68,rep,name=map_bool_bool,json=mapBoolBool" json:"map_bool_bool,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"` + MapStringString map[string]string `protobuf:"bytes,69,rep,name=map_string_string,json=mapStringString" json:"map_string_string,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + MapStringBytes map[string][]byte `protobuf:"bytes,70,rep,name=map_string_bytes,json=mapStringBytes" json:"map_string_bytes,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value,proto3"` + MapStringNestedMessage map[string]*TestAllTypes_NestedMessage `protobuf:"bytes,71,rep,name=map_string_nested_message,json=mapStringNestedMessage" json:"map_string_nested_message,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + MapStringForeignMessage map[string]*ForeignMessage `protobuf:"bytes,72,rep,name=map_string_foreign_message,json=mapStringForeignMessage" json:"map_string_foreign_message,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + MapStringNestedEnum map[string]TestAllTypes_NestedEnum `protobuf:"bytes,73,rep,name=map_string_nested_enum,json=mapStringNestedEnum" json:"map_string_nested_enum,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"varint,2,opt,name=value,enum=conformance.TestAllTypes_NestedEnum"` + MapStringForeignEnum map[string]ForeignEnum `protobuf:"bytes,74,rep,name=map_string_foreign_enum,json=mapStringForeignEnum" json:"map_string_foreign_enum,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"varint,2,opt,name=value,enum=conformance.ForeignEnum"` + // Types that are valid to be assigned to OneofField: + // *TestAllTypes_OneofUint32 + // *TestAllTypes_OneofNestedMessage + // *TestAllTypes_OneofString + // *TestAllTypes_OneofBytes + OneofField isTestAllTypes_OneofField `protobuf_oneof:"oneof_field"` + // Well-known types + OptionalBoolWrapper *wrappers.BoolValue `protobuf:"bytes,201,opt,name=optional_bool_wrapper,json=optionalBoolWrapper" json:"optional_bool_wrapper,omitempty"` + OptionalInt32Wrapper *wrappers.Int32Value `protobuf:"bytes,202,opt,name=optional_int32_wrapper,json=optionalInt32Wrapper" json:"optional_int32_wrapper,omitempty"` + OptionalInt64Wrapper *wrappers.Int64Value `protobuf:"bytes,203,opt,name=optional_int64_wrapper,json=optionalInt64Wrapper" json:"optional_int64_wrapper,omitempty"` + OptionalUint32Wrapper *wrappers.UInt32Value `protobuf:"bytes,204,opt,name=optional_uint32_wrapper,json=optionalUint32Wrapper" json:"optional_uint32_wrapper,omitempty"` + OptionalUint64Wrapper *wrappers.UInt64Value `protobuf:"bytes,205,opt,name=optional_uint64_wrapper,json=optionalUint64Wrapper" json:"optional_uint64_wrapper,omitempty"` + OptionalFloatWrapper *wrappers.FloatValue `protobuf:"bytes,206,opt,name=optional_float_wrapper,json=optionalFloatWrapper" json:"optional_float_wrapper,omitempty"` + OptionalDoubleWrapper *wrappers.DoubleValue `protobuf:"bytes,207,opt,name=optional_double_wrapper,json=optionalDoubleWrapper" json:"optional_double_wrapper,omitempty"` + OptionalStringWrapper *wrappers.StringValue `protobuf:"bytes,208,opt,name=optional_string_wrapper,json=optionalStringWrapper" json:"optional_string_wrapper,omitempty"` + OptionalBytesWrapper *wrappers.BytesValue `protobuf:"bytes,209,opt,name=optional_bytes_wrapper,json=optionalBytesWrapper" json:"optional_bytes_wrapper,omitempty"` + RepeatedBoolWrapper []*wrappers.BoolValue `protobuf:"bytes,211,rep,name=repeated_bool_wrapper,json=repeatedBoolWrapper" json:"repeated_bool_wrapper,omitempty"` + RepeatedInt32Wrapper []*wrappers.Int32Value `protobuf:"bytes,212,rep,name=repeated_int32_wrapper,json=repeatedInt32Wrapper" json:"repeated_int32_wrapper,omitempty"` + RepeatedInt64Wrapper []*wrappers.Int64Value `protobuf:"bytes,213,rep,name=repeated_int64_wrapper,json=repeatedInt64Wrapper" json:"repeated_int64_wrapper,omitempty"` + RepeatedUint32Wrapper []*wrappers.UInt32Value `protobuf:"bytes,214,rep,name=repeated_uint32_wrapper,json=repeatedUint32Wrapper" json:"repeated_uint32_wrapper,omitempty"` + RepeatedUint64Wrapper []*wrappers.UInt64Value `protobuf:"bytes,215,rep,name=repeated_uint64_wrapper,json=repeatedUint64Wrapper" json:"repeated_uint64_wrapper,omitempty"` + RepeatedFloatWrapper []*wrappers.FloatValue `protobuf:"bytes,216,rep,name=repeated_float_wrapper,json=repeatedFloatWrapper" json:"repeated_float_wrapper,omitempty"` + RepeatedDoubleWrapper []*wrappers.DoubleValue `protobuf:"bytes,217,rep,name=repeated_double_wrapper,json=repeatedDoubleWrapper" json:"repeated_double_wrapper,omitempty"` + RepeatedStringWrapper []*wrappers.StringValue `protobuf:"bytes,218,rep,name=repeated_string_wrapper,json=repeatedStringWrapper" json:"repeated_string_wrapper,omitempty"` + RepeatedBytesWrapper []*wrappers.BytesValue `protobuf:"bytes,219,rep,name=repeated_bytes_wrapper,json=repeatedBytesWrapper" json:"repeated_bytes_wrapper,omitempty"` + OptionalDuration *duration.Duration `protobuf:"bytes,301,opt,name=optional_duration,json=optionalDuration" json:"optional_duration,omitempty"` + OptionalTimestamp *timestamp.Timestamp `protobuf:"bytes,302,opt,name=optional_timestamp,json=optionalTimestamp" json:"optional_timestamp,omitempty"` + OptionalFieldMask *field_mask.FieldMask `protobuf:"bytes,303,opt,name=optional_field_mask,json=optionalFieldMask" json:"optional_field_mask,omitempty"` + OptionalStruct *_struct.Struct `protobuf:"bytes,304,opt,name=optional_struct,json=optionalStruct" json:"optional_struct,omitempty"` + OptionalAny *any.Any `protobuf:"bytes,305,opt,name=optional_any,json=optionalAny" json:"optional_any,omitempty"` + OptionalValue *_struct.Value `protobuf:"bytes,306,opt,name=optional_value,json=optionalValue" json:"optional_value,omitempty"` + RepeatedDuration []*duration.Duration `protobuf:"bytes,311,rep,name=repeated_duration,json=repeatedDuration" json:"repeated_duration,omitempty"` + RepeatedTimestamp []*timestamp.Timestamp `protobuf:"bytes,312,rep,name=repeated_timestamp,json=repeatedTimestamp" json:"repeated_timestamp,omitempty"` + RepeatedFieldmask []*field_mask.FieldMask `protobuf:"bytes,313,rep,name=repeated_fieldmask,json=repeatedFieldmask" json:"repeated_fieldmask,omitempty"` + RepeatedStruct []*_struct.Struct `protobuf:"bytes,324,rep,name=repeated_struct,json=repeatedStruct" json:"repeated_struct,omitempty"` + RepeatedAny []*any.Any `protobuf:"bytes,315,rep,name=repeated_any,json=repeatedAny" json:"repeated_any,omitempty"` + RepeatedValue []*_struct.Value `protobuf:"bytes,316,rep,name=repeated_value,json=repeatedValue" json:"repeated_value,omitempty"` + // Test field-name-to-JSON-name convention. + Fieldname1 int32 `protobuf:"varint,401,opt,name=fieldname1" json:"fieldname1,omitempty"` + FieldName2 int32 `protobuf:"varint,402,opt,name=field_name2,json=fieldName2" json:"field_name2,omitempty"` + XFieldName3 int32 `protobuf:"varint,403,opt,name=_field_name3,json=FieldName3" json:"_field_name3,omitempty"` + Field_Name4_ int32 `protobuf:"varint,404,opt,name=field__name4_,json=fieldName4" json:"field__name4_,omitempty"` + Field0Name5 int32 `protobuf:"varint,405,opt,name=field0name5" json:"field0name5,omitempty"` + Field_0Name6 int32 `protobuf:"varint,406,opt,name=field_0_name6,json=field0Name6" json:"field_0_name6,omitempty"` + FieldName7 int32 `protobuf:"varint,407,opt,name=fieldName7" json:"fieldName7,omitempty"` + FieldName8 int32 `protobuf:"varint,408,opt,name=FieldName8" json:"FieldName8,omitempty"` + Field_Name9 int32 `protobuf:"varint,409,opt,name=field_Name9,json=fieldName9" json:"field_Name9,omitempty"` + Field_Name10 int32 `protobuf:"varint,410,opt,name=Field_Name10,json=FieldName10" json:"Field_Name10,omitempty"` + FIELD_NAME11 int32 `protobuf:"varint,411,opt,name=FIELD_NAME11,json=FIELDNAME11" json:"FIELD_NAME11,omitempty"` + FIELDName12 int32 `protobuf:"varint,412,opt,name=FIELD_name12,json=FIELDName12" json:"FIELD_name12,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *TestAllTypes) Reset() { *m = TestAllTypes{} } +func (m *TestAllTypes) String() string { return proto.CompactTextString(m) } +func (*TestAllTypes) ProtoMessage() {} +func (*TestAllTypes) Descriptor() ([]byte, []int) { + return fileDescriptor_conformance_48ac832451f5d6c3, []int{2} +} +func (m *TestAllTypes) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_TestAllTypes.Unmarshal(m, b) +} +func (m *TestAllTypes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_TestAllTypes.Marshal(b, m, deterministic) +} +func (dst *TestAllTypes) XXX_Merge(src proto.Message) { + xxx_messageInfo_TestAllTypes.Merge(dst, src) +} +func (m *TestAllTypes) XXX_Size() int { + return xxx_messageInfo_TestAllTypes.Size(m) +} +func (m *TestAllTypes) XXX_DiscardUnknown() { + xxx_messageInfo_TestAllTypes.DiscardUnknown(m) +} + +var xxx_messageInfo_TestAllTypes proto.InternalMessageInfo + +type isTestAllTypes_OneofField interface { + isTestAllTypes_OneofField() +} + +type TestAllTypes_OneofUint32 struct { + OneofUint32 uint32 `protobuf:"varint,111,opt,name=oneof_uint32,json=oneofUint32,oneof"` +} +type TestAllTypes_OneofNestedMessage struct { + OneofNestedMessage *TestAllTypes_NestedMessage `protobuf:"bytes,112,opt,name=oneof_nested_message,json=oneofNestedMessage,oneof"` +} +type TestAllTypes_OneofString struct { + OneofString string `protobuf:"bytes,113,opt,name=oneof_string,json=oneofString,oneof"` +} +type TestAllTypes_OneofBytes struct { + OneofBytes []byte `protobuf:"bytes,114,opt,name=oneof_bytes,json=oneofBytes,proto3,oneof"` +} + +func (*TestAllTypes_OneofUint32) isTestAllTypes_OneofField() {} +func (*TestAllTypes_OneofNestedMessage) isTestAllTypes_OneofField() {} +func (*TestAllTypes_OneofString) isTestAllTypes_OneofField() {} +func (*TestAllTypes_OneofBytes) isTestAllTypes_OneofField() {} + +func (m *TestAllTypes) GetOneofField() isTestAllTypes_OneofField { + if m != nil { + return m.OneofField + } + return nil +} + +func (m *TestAllTypes) GetOptionalInt32() int32 { + if m != nil { + return m.OptionalInt32 + } + return 0 +} + +func (m *TestAllTypes) GetOptionalInt64() int64 { + if m != nil { + return m.OptionalInt64 + } + return 0 +} + +func (m *TestAllTypes) GetOptionalUint32() uint32 { + if m != nil { + return m.OptionalUint32 + } + return 0 +} + +func (m *TestAllTypes) GetOptionalUint64() uint64 { + if m != nil { + return m.OptionalUint64 + } + return 0 +} + +func (m *TestAllTypes) GetOptionalSint32() int32 { + if m != nil { + return m.OptionalSint32 + } + return 0 +} + +func (m *TestAllTypes) GetOptionalSint64() int64 { + if m != nil { + return m.OptionalSint64 + } + return 0 +} + +func (m *TestAllTypes) GetOptionalFixed32() uint32 { + if m != nil { + return m.OptionalFixed32 + } + return 0 +} + +func (m *TestAllTypes) GetOptionalFixed64() uint64 { + if m != nil { + return m.OptionalFixed64 + } + return 0 +} + +func (m *TestAllTypes) GetOptionalSfixed32() int32 { + if m != nil { + return m.OptionalSfixed32 + } + return 0 +} + +func (m *TestAllTypes) GetOptionalSfixed64() int64 { + if m != nil { + return m.OptionalSfixed64 + } + return 0 +} + +func (m *TestAllTypes) GetOptionalFloat() float32 { + if m != nil { + return m.OptionalFloat + } + return 0 +} + +func (m *TestAllTypes) GetOptionalDouble() float64 { + if m != nil { + return m.OptionalDouble + } + return 0 +} + +func (m *TestAllTypes) GetOptionalBool() bool { + if m != nil { + return m.OptionalBool + } + return false +} + +func (m *TestAllTypes) GetOptionalString() string { + if m != nil { + return m.OptionalString + } + return "" +} + +func (m *TestAllTypes) GetOptionalBytes() []byte { + if m != nil { + return m.OptionalBytes + } + return nil +} + +func (m *TestAllTypes) GetOptionalNestedMessage() *TestAllTypes_NestedMessage { + if m != nil { + return m.OptionalNestedMessage + } + return nil +} + +func (m *TestAllTypes) GetOptionalForeignMessage() *ForeignMessage { + if m != nil { + return m.OptionalForeignMessage + } + return nil +} + +func (m *TestAllTypes) GetOptionalNestedEnum() TestAllTypes_NestedEnum { + if m != nil { + return m.OptionalNestedEnum + } + return TestAllTypes_FOO +} + +func (m *TestAllTypes) GetOptionalForeignEnum() ForeignEnum { + if m != nil { + return m.OptionalForeignEnum + } + return ForeignEnum_FOREIGN_FOO +} + +func (m *TestAllTypes) GetOptionalStringPiece() string { + if m != nil { + return m.OptionalStringPiece + } + return "" +} + +func (m *TestAllTypes) GetOptionalCord() string { + if m != nil { + return m.OptionalCord + } + return "" +} + +func (m *TestAllTypes) GetRecursiveMessage() *TestAllTypes { + if m != nil { + return m.RecursiveMessage + } + return nil +} + +func (m *TestAllTypes) GetRepeatedInt32() []int32 { + if m != nil { + return m.RepeatedInt32 + } + return nil +} + +func (m *TestAllTypes) GetRepeatedInt64() []int64 { + if m != nil { + return m.RepeatedInt64 + } + return nil +} + +func (m *TestAllTypes) GetRepeatedUint32() []uint32 { + if m != nil { + return m.RepeatedUint32 + } + return nil +} + +func (m *TestAllTypes) GetRepeatedUint64() []uint64 { + if m != nil { + return m.RepeatedUint64 + } + return nil +} + +func (m *TestAllTypes) GetRepeatedSint32() []int32 { + if m != nil { + return m.RepeatedSint32 + } + return nil +} + +func (m *TestAllTypes) GetRepeatedSint64() []int64 { + if m != nil { + return m.RepeatedSint64 + } + return nil +} + +func (m *TestAllTypes) GetRepeatedFixed32() []uint32 { + if m != nil { + return m.RepeatedFixed32 + } + return nil +} + +func (m *TestAllTypes) GetRepeatedFixed64() []uint64 { + if m != nil { + return m.RepeatedFixed64 + } + return nil +} + +func (m *TestAllTypes) GetRepeatedSfixed32() []int32 { + if m != nil { + return m.RepeatedSfixed32 + } + return nil +} + +func (m *TestAllTypes) GetRepeatedSfixed64() []int64 { + if m != nil { + return m.RepeatedSfixed64 + } + return nil +} + +func (m *TestAllTypes) GetRepeatedFloat() []float32 { + if m != nil { + return m.RepeatedFloat + } + return nil +} + +func (m *TestAllTypes) GetRepeatedDouble() []float64 { + if m != nil { + return m.RepeatedDouble + } + return nil +} + +func (m *TestAllTypes) GetRepeatedBool() []bool { + if m != nil { + return m.RepeatedBool + } + return nil +} + +func (m *TestAllTypes) GetRepeatedString() []string { + if m != nil { + return m.RepeatedString + } + return nil +} + +func (m *TestAllTypes) GetRepeatedBytes() [][]byte { + if m != nil { + return m.RepeatedBytes + } + return nil +} + +func (m *TestAllTypes) GetRepeatedNestedMessage() []*TestAllTypes_NestedMessage { + if m != nil { + return m.RepeatedNestedMessage + } + return nil +} + +func (m *TestAllTypes) GetRepeatedForeignMessage() []*ForeignMessage { + if m != nil { + return m.RepeatedForeignMessage + } + return nil +} + +func (m *TestAllTypes) GetRepeatedNestedEnum() []TestAllTypes_NestedEnum { + if m != nil { + return m.RepeatedNestedEnum + } + return nil +} + +func (m *TestAllTypes) GetRepeatedForeignEnum() []ForeignEnum { + if m != nil { + return m.RepeatedForeignEnum + } + return nil +} + +func (m *TestAllTypes) GetRepeatedStringPiece() []string { + if m != nil { + return m.RepeatedStringPiece + } + return nil +} + +func (m *TestAllTypes) GetRepeatedCord() []string { + if m != nil { + return m.RepeatedCord + } + return nil +} + +func (m *TestAllTypes) GetMapInt32Int32() map[int32]int32 { + if m != nil { + return m.MapInt32Int32 + } + return nil +} + +func (m *TestAllTypes) GetMapInt64Int64() map[int64]int64 { + if m != nil { + return m.MapInt64Int64 + } + return nil +} + +func (m *TestAllTypes) GetMapUint32Uint32() map[uint32]uint32 { + if m != nil { + return m.MapUint32Uint32 + } + return nil +} + +func (m *TestAllTypes) GetMapUint64Uint64() map[uint64]uint64 { + if m != nil { + return m.MapUint64Uint64 + } + return nil +} + +func (m *TestAllTypes) GetMapSint32Sint32() map[int32]int32 { + if m != nil { + return m.MapSint32Sint32 + } + return nil +} + +func (m *TestAllTypes) GetMapSint64Sint64() map[int64]int64 { + if m != nil { + return m.MapSint64Sint64 + } + return nil +} + +func (m *TestAllTypes) GetMapFixed32Fixed32() map[uint32]uint32 { + if m != nil { + return m.MapFixed32Fixed32 + } + return nil +} + +func (m *TestAllTypes) GetMapFixed64Fixed64() map[uint64]uint64 { + if m != nil { + return m.MapFixed64Fixed64 + } + return nil +} + +func (m *TestAllTypes) GetMapSfixed32Sfixed32() map[int32]int32 { + if m != nil { + return m.MapSfixed32Sfixed32 + } + return nil +} + +func (m *TestAllTypes) GetMapSfixed64Sfixed64() map[int64]int64 { + if m != nil { + return m.MapSfixed64Sfixed64 + } + return nil +} + +func (m *TestAllTypes) GetMapInt32Float() map[int32]float32 { + if m != nil { + return m.MapInt32Float + } + return nil +} + +func (m *TestAllTypes) GetMapInt32Double() map[int32]float64 { + if m != nil { + return m.MapInt32Double + } + return nil +} + +func (m *TestAllTypes) GetMapBoolBool() map[bool]bool { + if m != nil { + return m.MapBoolBool + } + return nil +} + +func (m *TestAllTypes) GetMapStringString() map[string]string { + if m != nil { + return m.MapStringString + } + return nil +} + +func (m *TestAllTypes) GetMapStringBytes() map[string][]byte { + if m != nil { + return m.MapStringBytes + } + return nil +} + +func (m *TestAllTypes) GetMapStringNestedMessage() map[string]*TestAllTypes_NestedMessage { + if m != nil { + return m.MapStringNestedMessage + } + return nil +} + +func (m *TestAllTypes) GetMapStringForeignMessage() map[string]*ForeignMessage { + if m != nil { + return m.MapStringForeignMessage + } + return nil +} + +func (m *TestAllTypes) GetMapStringNestedEnum() map[string]TestAllTypes_NestedEnum { + if m != nil { + return m.MapStringNestedEnum + } + return nil +} + +func (m *TestAllTypes) GetMapStringForeignEnum() map[string]ForeignEnum { + if m != nil { + return m.MapStringForeignEnum + } + return nil +} + +func (m *TestAllTypes) GetOneofUint32() uint32 { + if x, ok := m.GetOneofField().(*TestAllTypes_OneofUint32); ok { + return x.OneofUint32 + } + return 0 +} + +func (m *TestAllTypes) GetOneofNestedMessage() *TestAllTypes_NestedMessage { + if x, ok := m.GetOneofField().(*TestAllTypes_OneofNestedMessage); ok { + return x.OneofNestedMessage + } + return nil +} + +func (m *TestAllTypes) GetOneofString() string { + if x, ok := m.GetOneofField().(*TestAllTypes_OneofString); ok { + return x.OneofString + } + return "" +} + +func (m *TestAllTypes) GetOneofBytes() []byte { + if x, ok := m.GetOneofField().(*TestAllTypes_OneofBytes); ok { + return x.OneofBytes + } + return nil +} + +func (m *TestAllTypes) GetOptionalBoolWrapper() *wrappers.BoolValue { + if m != nil { + return m.OptionalBoolWrapper + } + return nil +} + +func (m *TestAllTypes) GetOptionalInt32Wrapper() *wrappers.Int32Value { + if m != nil { + return m.OptionalInt32Wrapper + } + return nil +} + +func (m *TestAllTypes) GetOptionalInt64Wrapper() *wrappers.Int64Value { + if m != nil { + return m.OptionalInt64Wrapper + } + return nil +} + +func (m *TestAllTypes) GetOptionalUint32Wrapper() *wrappers.UInt32Value { + if m != nil { + return m.OptionalUint32Wrapper + } + return nil +} + +func (m *TestAllTypes) GetOptionalUint64Wrapper() *wrappers.UInt64Value { + if m != nil { + return m.OptionalUint64Wrapper + } + return nil +} + +func (m *TestAllTypes) GetOptionalFloatWrapper() *wrappers.FloatValue { + if m != nil { + return m.OptionalFloatWrapper + } + return nil +} + +func (m *TestAllTypes) GetOptionalDoubleWrapper() *wrappers.DoubleValue { + if m != nil { + return m.OptionalDoubleWrapper + } + return nil +} + +func (m *TestAllTypes) GetOptionalStringWrapper() *wrappers.StringValue { + if m != nil { + return m.OptionalStringWrapper + } + return nil +} + +func (m *TestAllTypes) GetOptionalBytesWrapper() *wrappers.BytesValue { + if m != nil { + return m.OptionalBytesWrapper + } + return nil +} + +func (m *TestAllTypes) GetRepeatedBoolWrapper() []*wrappers.BoolValue { + if m != nil { + return m.RepeatedBoolWrapper + } + return nil +} + +func (m *TestAllTypes) GetRepeatedInt32Wrapper() []*wrappers.Int32Value { + if m != nil { + return m.RepeatedInt32Wrapper + } + return nil +} + +func (m *TestAllTypes) GetRepeatedInt64Wrapper() []*wrappers.Int64Value { + if m != nil { + return m.RepeatedInt64Wrapper + } + return nil +} + +func (m *TestAllTypes) GetRepeatedUint32Wrapper() []*wrappers.UInt32Value { + if m != nil { + return m.RepeatedUint32Wrapper + } + return nil +} + +func (m *TestAllTypes) GetRepeatedUint64Wrapper() []*wrappers.UInt64Value { + if m != nil { + return m.RepeatedUint64Wrapper + } + return nil +} + +func (m *TestAllTypes) GetRepeatedFloatWrapper() []*wrappers.FloatValue { + if m != nil { + return m.RepeatedFloatWrapper + } + return nil +} + +func (m *TestAllTypes) GetRepeatedDoubleWrapper() []*wrappers.DoubleValue { + if m != nil { + return m.RepeatedDoubleWrapper + } + return nil +} + +func (m *TestAllTypes) GetRepeatedStringWrapper() []*wrappers.StringValue { + if m != nil { + return m.RepeatedStringWrapper + } + return nil +} + +func (m *TestAllTypes) GetRepeatedBytesWrapper() []*wrappers.BytesValue { + if m != nil { + return m.RepeatedBytesWrapper + } + return nil +} + +func (m *TestAllTypes) GetOptionalDuration() *duration.Duration { + if m != nil { + return m.OptionalDuration + } + return nil +} + +func (m *TestAllTypes) GetOptionalTimestamp() *timestamp.Timestamp { + if m != nil { + return m.OptionalTimestamp + } + return nil +} + +func (m *TestAllTypes) GetOptionalFieldMask() *field_mask.FieldMask { + if m != nil { + return m.OptionalFieldMask + } + return nil +} + +func (m *TestAllTypes) GetOptionalStruct() *_struct.Struct { + if m != nil { + return m.OptionalStruct + } + return nil +} + +func (m *TestAllTypes) GetOptionalAny() *any.Any { + if m != nil { + return m.OptionalAny + } + return nil +} + +func (m *TestAllTypes) GetOptionalValue() *_struct.Value { + if m != nil { + return m.OptionalValue + } + return nil +} + +func (m *TestAllTypes) GetRepeatedDuration() []*duration.Duration { + if m != nil { + return m.RepeatedDuration + } + return nil +} + +func (m *TestAllTypes) GetRepeatedTimestamp() []*timestamp.Timestamp { + if m != nil { + return m.RepeatedTimestamp + } + return nil +} + +func (m *TestAllTypes) GetRepeatedFieldmask() []*field_mask.FieldMask { + if m != nil { + return m.RepeatedFieldmask + } + return nil +} + +func (m *TestAllTypes) GetRepeatedStruct() []*_struct.Struct { + if m != nil { + return m.RepeatedStruct + } + return nil +} + +func (m *TestAllTypes) GetRepeatedAny() []*any.Any { + if m != nil { + return m.RepeatedAny + } + return nil +} + +func (m *TestAllTypes) GetRepeatedValue() []*_struct.Value { + if m != nil { + return m.RepeatedValue + } + return nil +} + +func (m *TestAllTypes) GetFieldname1() int32 { + if m != nil { + return m.Fieldname1 + } + return 0 +} + +func (m *TestAllTypes) GetFieldName2() int32 { + if m != nil { + return m.FieldName2 + } + return 0 +} + +func (m *TestAllTypes) GetXFieldName3() int32 { + if m != nil { + return m.XFieldName3 + } + return 0 +} + +func (m *TestAllTypes) GetField_Name4_() int32 { + if m != nil { + return m.Field_Name4_ + } + return 0 +} + +func (m *TestAllTypes) GetField0Name5() int32 { + if m != nil { + return m.Field0Name5 + } + return 0 +} + +func (m *TestAllTypes) GetField_0Name6() int32 { + if m != nil { + return m.Field_0Name6 + } + return 0 +} + +func (m *TestAllTypes) GetFieldName7() int32 { + if m != nil { + return m.FieldName7 + } + return 0 +} + +func (m *TestAllTypes) GetFieldName8() int32 { + if m != nil { + return m.FieldName8 + } + return 0 +} + +func (m *TestAllTypes) GetField_Name9() int32 { + if m != nil { + return m.Field_Name9 + } + return 0 +} + +func (m *TestAllTypes) GetField_Name10() int32 { + if m != nil { + return m.Field_Name10 + } + return 0 +} + +func (m *TestAllTypes) GetFIELD_NAME11() int32 { + if m != nil { + return m.FIELD_NAME11 + } + return 0 +} + +func (m *TestAllTypes) GetFIELDName12() int32 { + if m != nil { + return m.FIELDName12 + } + return 0 +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*TestAllTypes) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _TestAllTypes_OneofMarshaler, _TestAllTypes_OneofUnmarshaler, _TestAllTypes_OneofSizer, []interface{}{ + (*TestAllTypes_OneofUint32)(nil), + (*TestAllTypes_OneofNestedMessage)(nil), + (*TestAllTypes_OneofString)(nil), + (*TestAllTypes_OneofBytes)(nil), + } +} + +func _TestAllTypes_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*TestAllTypes) + // oneof_field + switch x := m.OneofField.(type) { + case *TestAllTypes_OneofUint32: + b.EncodeVarint(111<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.OneofUint32)) + case *TestAllTypes_OneofNestedMessage: + b.EncodeVarint(112<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.OneofNestedMessage); err != nil { + return err + } + case *TestAllTypes_OneofString: + b.EncodeVarint(113<<3 | proto.WireBytes) + b.EncodeStringBytes(x.OneofString) + case *TestAllTypes_OneofBytes: + b.EncodeVarint(114<<3 | proto.WireBytes) + b.EncodeRawBytes(x.OneofBytes) + case nil: + default: + return fmt.Errorf("TestAllTypes.OneofField has unexpected type %T", x) + } + return nil +} + +func _TestAllTypes_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*TestAllTypes) + switch tag { + case 111: // oneof_field.oneof_uint32 + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.OneofField = &TestAllTypes_OneofUint32{uint32(x)} + return true, err + case 112: // oneof_field.oneof_nested_message + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(TestAllTypes_NestedMessage) + err := b.DecodeMessage(msg) + m.OneofField = &TestAllTypes_OneofNestedMessage{msg} + return true, err + case 113: // oneof_field.oneof_string + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeStringBytes() + m.OneofField = &TestAllTypes_OneofString{x} + return true, err + case 114: // oneof_field.oneof_bytes + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeRawBytes(true) + m.OneofField = &TestAllTypes_OneofBytes{x} + return true, err + default: + return false, nil + } +} + +func _TestAllTypes_OneofSizer(msg proto.Message) (n int) { + m := msg.(*TestAllTypes) + // oneof_field + switch x := m.OneofField.(type) { + case *TestAllTypes_OneofUint32: + n += 2 // tag and wire + n += proto.SizeVarint(uint64(x.OneofUint32)) + case *TestAllTypes_OneofNestedMessage: + s := proto.Size(x.OneofNestedMessage) + n += 2 // tag and wire + n += proto.SizeVarint(uint64(s)) + n += s + case *TestAllTypes_OneofString: + n += 2 // tag and wire + n += proto.SizeVarint(uint64(len(x.OneofString))) + n += len(x.OneofString) + case *TestAllTypes_OneofBytes: + n += 2 // tag and wire + n += proto.SizeVarint(uint64(len(x.OneofBytes))) + n += len(x.OneofBytes) + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +type TestAllTypes_NestedMessage struct { + A int32 `protobuf:"varint,1,opt,name=a" json:"a,omitempty"` + Corecursive *TestAllTypes `protobuf:"bytes,2,opt,name=corecursive" json:"corecursive,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *TestAllTypes_NestedMessage) Reset() { *m = TestAllTypes_NestedMessage{} } +func (m *TestAllTypes_NestedMessage) String() string { return proto.CompactTextString(m) } +func (*TestAllTypes_NestedMessage) ProtoMessage() {} +func (*TestAllTypes_NestedMessage) Descriptor() ([]byte, []int) { + return fileDescriptor_conformance_48ac832451f5d6c3, []int{2, 0} +} +func (m *TestAllTypes_NestedMessage) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_TestAllTypes_NestedMessage.Unmarshal(m, b) +} +func (m *TestAllTypes_NestedMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_TestAllTypes_NestedMessage.Marshal(b, m, deterministic) +} +func (dst *TestAllTypes_NestedMessage) XXX_Merge(src proto.Message) { + xxx_messageInfo_TestAllTypes_NestedMessage.Merge(dst, src) +} +func (m *TestAllTypes_NestedMessage) XXX_Size() int { + return xxx_messageInfo_TestAllTypes_NestedMessage.Size(m) +} +func (m *TestAllTypes_NestedMessage) XXX_DiscardUnknown() { + xxx_messageInfo_TestAllTypes_NestedMessage.DiscardUnknown(m) +} + +var xxx_messageInfo_TestAllTypes_NestedMessage proto.InternalMessageInfo + +func (m *TestAllTypes_NestedMessage) GetA() int32 { + if m != nil { + return m.A + } + return 0 +} + +func (m *TestAllTypes_NestedMessage) GetCorecursive() *TestAllTypes { + if m != nil { + return m.Corecursive + } + return nil +} + +type ForeignMessage struct { + C int32 `protobuf:"varint,1,opt,name=c" json:"c,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ForeignMessage) Reset() { *m = ForeignMessage{} } +func (m *ForeignMessage) String() string { return proto.CompactTextString(m) } +func (*ForeignMessage) ProtoMessage() {} +func (*ForeignMessage) Descriptor() ([]byte, []int) { + return fileDescriptor_conformance_48ac832451f5d6c3, []int{3} +} +func (m *ForeignMessage) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ForeignMessage.Unmarshal(m, b) +} +func (m *ForeignMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ForeignMessage.Marshal(b, m, deterministic) +} +func (dst *ForeignMessage) XXX_Merge(src proto.Message) { + xxx_messageInfo_ForeignMessage.Merge(dst, src) +} +func (m *ForeignMessage) XXX_Size() int { + return xxx_messageInfo_ForeignMessage.Size(m) +} +func (m *ForeignMessage) XXX_DiscardUnknown() { + xxx_messageInfo_ForeignMessage.DiscardUnknown(m) +} + +var xxx_messageInfo_ForeignMessage proto.InternalMessageInfo + +func (m *ForeignMessage) GetC() int32 { + if m != nil { + return m.C + } + return 0 +} + +func init() { + proto.RegisterType((*ConformanceRequest)(nil), "conformance.ConformanceRequest") + proto.RegisterType((*ConformanceResponse)(nil), "conformance.ConformanceResponse") + proto.RegisterType((*TestAllTypes)(nil), "conformance.TestAllTypes") + proto.RegisterMapType((map[bool]bool)(nil), "conformance.TestAllTypes.MapBoolBoolEntry") + proto.RegisterMapType((map[uint32]uint32)(nil), "conformance.TestAllTypes.MapFixed32Fixed32Entry") + proto.RegisterMapType((map[uint64]uint64)(nil), "conformance.TestAllTypes.MapFixed64Fixed64Entry") + proto.RegisterMapType((map[int32]float64)(nil), "conformance.TestAllTypes.MapInt32DoubleEntry") + proto.RegisterMapType((map[int32]float32)(nil), "conformance.TestAllTypes.MapInt32FloatEntry") + proto.RegisterMapType((map[int32]int32)(nil), "conformance.TestAllTypes.MapInt32Int32Entry") + proto.RegisterMapType((map[int64]int64)(nil), "conformance.TestAllTypes.MapInt64Int64Entry") + proto.RegisterMapType((map[int32]int32)(nil), "conformance.TestAllTypes.MapSfixed32Sfixed32Entry") + proto.RegisterMapType((map[int64]int64)(nil), "conformance.TestAllTypes.MapSfixed64Sfixed64Entry") + proto.RegisterMapType((map[int32]int32)(nil), "conformance.TestAllTypes.MapSint32Sint32Entry") + proto.RegisterMapType((map[int64]int64)(nil), "conformance.TestAllTypes.MapSint64Sint64Entry") + proto.RegisterMapType((map[string][]byte)(nil), "conformance.TestAllTypes.MapStringBytesEntry") + proto.RegisterMapType((map[string]ForeignEnum)(nil), "conformance.TestAllTypes.MapStringForeignEnumEntry") + proto.RegisterMapType((map[string]*ForeignMessage)(nil), "conformance.TestAllTypes.MapStringForeignMessageEntry") + proto.RegisterMapType((map[string]TestAllTypes_NestedEnum)(nil), "conformance.TestAllTypes.MapStringNestedEnumEntry") + proto.RegisterMapType((map[string]*TestAllTypes_NestedMessage)(nil), "conformance.TestAllTypes.MapStringNestedMessageEntry") + proto.RegisterMapType((map[string]string)(nil), "conformance.TestAllTypes.MapStringStringEntry") + proto.RegisterMapType((map[uint32]uint32)(nil), "conformance.TestAllTypes.MapUint32Uint32Entry") + proto.RegisterMapType((map[uint64]uint64)(nil), "conformance.TestAllTypes.MapUint64Uint64Entry") + proto.RegisterType((*TestAllTypes_NestedMessage)(nil), "conformance.TestAllTypes.NestedMessage") + proto.RegisterType((*ForeignMessage)(nil), "conformance.ForeignMessage") + proto.RegisterEnum("conformance.WireFormat", WireFormat_name, WireFormat_value) + proto.RegisterEnum("conformance.ForeignEnum", ForeignEnum_name, ForeignEnum_value) + proto.RegisterEnum("conformance.TestAllTypes_NestedEnum", TestAllTypes_NestedEnum_name, TestAllTypes_NestedEnum_value) +} + +func init() { proto.RegisterFile("conformance.proto", fileDescriptor_conformance_48ac832451f5d6c3) } + +var fileDescriptor_conformance_48ac832451f5d6c3 = []byte{ + // 2600 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x5a, 0x5b, 0x73, 0x13, 0xc9, + 0x15, 0xf6, 0x68, 0xc0, 0x36, 0x2d, 0xd9, 0x96, 0xdb, 0xb7, 0xc6, 0x50, 0xcb, 0x60, 0x96, 0x20, + 0x60, 0xd7, 0xeb, 0xcb, 0x30, 0x5c, 0x36, 0x4b, 0xb0, 0xc0, 0x02, 0x93, 0xc5, 0xa2, 0xc6, 0x78, + 0xa9, 0x22, 0x0f, 0xca, 0x20, 0x8f, 0x5d, 0x5a, 0x24, 0x8d, 0x76, 0x66, 0xb4, 0x89, 0xf3, 0x98, + 0x7f, 0x90, 0xfb, 0xf5, 0x2f, 0xe4, 0x5a, 0x95, 0x4a, 0x52, 0xc9, 0x53, 0x2a, 0x2f, 0xb9, 0x27, + 0x95, 0x7b, 0xf2, 0x63, 0x92, 0xea, 0xeb, 0x74, 0xb7, 0x7a, 0x64, 0xb1, 0x55, 0x2b, 0x5b, 0xa7, + 0xbf, 0xfe, 0xce, 0xe9, 0xd3, 0x67, 0xbe, 0x76, 0x9f, 0x01, 0xcc, 0x36, 0xa3, 0xee, 0x61, 0x14, + 0x77, 0x82, 0x6e, 0x33, 0x5c, 0xed, 0xc5, 0x51, 0x1a, 0xc1, 0xa2, 0x64, 0x5a, 0x3e, 0x7b, 0x14, + 0x45, 0x47, 0xed, 0xf0, 0x1d, 0x32, 0xf4, 0xb2, 0x7f, 0xf8, 0x4e, 0xd0, 0x3d, 0xa6, 0xb8, 0xe5, + 0x37, 0xf4, 0xa1, 0x83, 0x7e, 0x1c, 0xa4, 0xad, 0xa8, 0xcb, 0xc6, 0x1d, 0x7d, 0xfc, 0xb0, 0x15, + 0xb6, 0x0f, 0x1a, 0x9d, 0x20, 0x79, 0xc5, 0x10, 0xe7, 0x75, 0x44, 0x92, 0xc6, 0xfd, 0x66, 0xca, + 0x46, 0x2f, 0xe8, 0xa3, 0x69, 0xab, 0x13, 0x26, 0x69, 0xd0, 0xe9, 0xe5, 0x05, 0xf0, 0xb9, 0x38, + 0xe8, 0xf5, 0xc2, 0x38, 0xa1, 0xe3, 0x2b, 0xbf, 0xb2, 0x00, 0xbc, 0x9f, 0xad, 0xc5, 0x0f, 0x3f, + 0xea, 0x87, 0x49, 0x0a, 0xaf, 0x83, 0x32, 0x9f, 0xd1, 0xe8, 0x05, 0xc7, 0xed, 0x28, 0x38, 0x40, + 0x96, 0x63, 0x55, 0x4a, 0x8f, 0xc6, 0xfc, 0x19, 0x3e, 0xf2, 0x94, 0x0e, 0xc0, 0x4b, 0xa0, 0xf4, + 0x61, 0x12, 0x75, 0x05, 0xb0, 0xe0, 0x58, 0x95, 0x33, 0x8f, 0xc6, 0xfc, 0x22, 0xb6, 0x72, 0x50, + 0x1d, 0x2c, 0xc5, 0x94, 0x3c, 0x3c, 0x68, 0x44, 0xfd, 0xb4, 0xd7, 0x4f, 0x1b, 0xc4, 0x6b, 0x8a, + 0x6c, 0xc7, 0xaa, 0x4c, 0x6f, 0x2c, 0xad, 0xca, 0x69, 0x7e, 0xde, 0x8a, 0xc3, 0x1a, 0x19, 0xf6, + 0x17, 0xc4, 0xbc, 0x3a, 0x99, 0x46, 0xcd, 0xd5, 0x33, 0x60, 0x82, 0x39, 0x5c, 0xf9, 0x62, 0x01, + 0xcc, 0x29, 0x8b, 0x48, 0x7a, 0x51, 0x37, 0x09, 0xe1, 0x45, 0x50, 0xec, 0x05, 0x71, 0x12, 0x36, + 0xc2, 0x38, 0x8e, 0x62, 0xb2, 0x00, 0x1c, 0x17, 0x20, 0xc6, 0x6d, 0x6c, 0x83, 0x57, 0xc1, 0x4c, + 0x12, 0xc6, 0xad, 0xa0, 0xdd, 0xfa, 0x02, 0x87, 0x8d, 0x33, 0xd8, 0xb4, 0x18, 0xa0, 0xd0, 0xcb, + 0x60, 0x2a, 0xee, 0x77, 0x71, 0x82, 0x19, 0x90, 0xaf, 0xb3, 0xc4, 0xcc, 0x14, 0x66, 0x4a, 0x9d, + 0x3d, 0x6a, 0xea, 0x4e, 0x99, 0x52, 0xb7, 0x0c, 0x26, 0x92, 0x57, 0xad, 0x5e, 0x2f, 0x3c, 0x40, + 0xa7, 0xd9, 0x38, 0x37, 0x54, 0x27, 0xc1, 0x78, 0x1c, 0x26, 0xfd, 0x76, 0xba, 0xf2, 0x93, 0xfb, + 0xa0, 0xf4, 0x2c, 0x4c, 0xd2, 0xad, 0x76, 0xfb, 0xd9, 0x71, 0x2f, 0x4c, 0xe0, 0x65, 0x30, 0x1d, + 0xf5, 0x70, 0xad, 0x05, 0xed, 0x46, 0xab, 0x9b, 0x6e, 0x6e, 0x90, 0x04, 0x9c, 0xf6, 0xa7, 0xb8, + 0x75, 0x07, 0x1b, 0x75, 0x98, 0xe7, 0x92, 0x75, 0xd9, 0x0a, 0xcc, 0x73, 0xe1, 0x15, 0x30, 0x23, + 0x60, 0x7d, 0x4a, 0x87, 0x57, 0x35, 0xe5, 0x8b, 0xd9, 0xfb, 0xc4, 0x3a, 0x00, 0xf4, 0x5c, 0xb2, + 0xaa, 0x53, 0x2a, 0x50, 0x63, 0x4c, 0x28, 0x23, 0x5e, 0xde, 0x6c, 0x06, 0xdc, 0x1b, 0x64, 0x4c, + 0x28, 0x23, 0xde, 0x23, 0xa8, 0x02, 0x3d, 0x17, 0x5e, 0x05, 0x65, 0x01, 0x3c, 0x6c, 0x7d, 0x3e, + 0x3c, 0xd8, 0xdc, 0x40, 0x13, 0x8e, 0x55, 0x99, 0xf0, 0x05, 0x41, 0x8d, 0x9a, 0x07, 0xa1, 0x9e, + 0x8b, 0x26, 0x1d, 0xab, 0x32, 0xae, 0x41, 0x3d, 0x17, 0x5e, 0x07, 0xb3, 0x99, 0x7b, 0x4e, 0x7b, + 0xc6, 0xb1, 0x2a, 0x33, 0xbe, 0xe0, 0xd8, 0x63, 0x76, 0x03, 0xd8, 0x73, 0x11, 0x70, 0xac, 0x4a, + 0x59, 0x07, 0x7b, 0xae, 0x92, 0xfa, 0xc3, 0x76, 0x14, 0xa4, 0xa8, 0xe8, 0x58, 0x95, 0x42, 0x96, + 0xfa, 0x1a, 0x36, 0x2a, 0xeb, 0x3f, 0x88, 0xfa, 0x2f, 0xdb, 0x21, 0x2a, 0x39, 0x56, 0xc5, 0xca, + 0xd6, 0xff, 0x80, 0x58, 0xe1, 0x25, 0x20, 0x66, 0x36, 0x5e, 0x46, 0x51, 0x1b, 0x4d, 0x39, 0x56, + 0x65, 0xd2, 0x2f, 0x71, 0x63, 0x35, 0x8a, 0xda, 0x6a, 0x36, 0xd3, 0xb8, 0xd5, 0x3d, 0x42, 0xd3, + 0xb8, 0xaa, 0xa4, 0x6c, 0x12, 0xab, 0x12, 0xdd, 0xcb, 0xe3, 0x34, 0x4c, 0xd0, 0x0c, 0x2e, 0xe3, + 0x2c, 0xba, 0x2a, 0x36, 0xc2, 0x06, 0x58, 0x12, 0xb0, 0x2e, 0x7d, 0xbc, 0x3b, 0x61, 0x92, 0x04, + 0x47, 0x21, 0x82, 0x8e, 0x55, 0x29, 0x6e, 0x5c, 0x51, 0x1e, 0x6c, 0xb9, 0x44, 0x57, 0x77, 0x09, + 0xfe, 0x09, 0x85, 0xfb, 0x0b, 0x9c, 0x47, 0x31, 0xc3, 0x7d, 0x80, 0xb2, 0x2c, 0x45, 0x71, 0xd8, + 0x3a, 0xea, 0x0a, 0x0f, 0x73, 0xc4, 0xc3, 0x39, 0xc5, 0x43, 0x8d, 0x62, 0x38, 0xeb, 0xa2, 0x48, + 0xa6, 0x62, 0x87, 0x1f, 0x80, 0x79, 0x3d, 0xee, 0xb0, 0xdb, 0xef, 0xa0, 0x05, 0xa2, 0x46, 0x6f, + 0x9e, 0x14, 0xf4, 0x76, 0xb7, 0xdf, 0xf1, 0xa1, 0x1a, 0x31, 0xb6, 0xc1, 0xf7, 0xc1, 0xc2, 0x40, + 0xb8, 0x84, 0x78, 0x91, 0x10, 0x23, 0x53, 0xac, 0x84, 0x6c, 0x4e, 0x0b, 0x94, 0xb0, 0x79, 0x12, + 0x1b, 0xdd, 0xad, 0x46, 0xaf, 0x15, 0x36, 0x43, 0x84, 0xf0, 0x9e, 0x55, 0x0b, 0x93, 0x85, 0x6c, + 0x1e, 0xdd, 0xb7, 0xa7, 0x78, 0x18, 0x5e, 0x91, 0x4a, 0xa1, 0x19, 0xc5, 0x07, 0xe8, 0x2c, 0xc3, + 0x5b, 0x59, 0x39, 0xdc, 0x8f, 0xe2, 0x03, 0x58, 0x03, 0xb3, 0x71, 0xd8, 0xec, 0xc7, 0x49, 0xeb, + 0xe3, 0x50, 0xa4, 0xf5, 0x1c, 0x49, 0xeb, 0xd9, 0xdc, 0x1c, 0xf8, 0x65, 0x31, 0x87, 0xa7, 0xf3, + 0x32, 0x98, 0x8e, 0xc3, 0x5e, 0x18, 0xe0, 0x3c, 0xd2, 0x87, 0xf9, 0x82, 0x63, 0x63, 0xb5, 0xe1, + 0x56, 0xa1, 0x36, 0x32, 0xcc, 0x73, 0x91, 0xe3, 0xd8, 0x58, 0x6d, 0x24, 0x18, 0xd5, 0x06, 0x01, + 0x63, 0x6a, 0x73, 0xd1, 0xb1, 0xb1, 0xda, 0x70, 0x73, 0xa6, 0x36, 0x0a, 0xd0, 0x73, 0xd1, 0x8a, + 0x63, 0x63, 0xb5, 0x91, 0x81, 0x1a, 0x23, 0x53, 0x9b, 0x4b, 0x8e, 0x8d, 0xd5, 0x86, 0x9b, 0xf7, + 0x06, 0x19, 0x99, 0xda, 0xbc, 0xe9, 0xd8, 0x58, 0x6d, 0x64, 0x20, 0x55, 0x1b, 0x01, 0xe4, 0xb2, + 0x70, 0xd9, 0xb1, 0xb1, 0xda, 0x70, 0xbb, 0xa4, 0x36, 0x2a, 0xd4, 0x73, 0xd1, 0x27, 0x1c, 0x1b, + 0xab, 0x8d, 0x02, 0xa5, 0x6a, 0x93, 0xb9, 0xe7, 0xb4, 0x57, 0x1c, 0x1b, 0xab, 0x8d, 0x08, 0x40, + 0x52, 0x1b, 0x0d, 0xec, 0xb9, 0xa8, 0xe2, 0xd8, 0x58, 0x6d, 0x54, 0x30, 0x55, 0x9b, 0x2c, 0x08, + 0xa2, 0x36, 0x57, 0x1d, 0x1b, 0xab, 0x8d, 0x08, 0x81, 0xab, 0x8d, 0x80, 0x31, 0xb5, 0xb9, 0xe6, + 0xd8, 0x58, 0x6d, 0xb8, 0x39, 0x53, 0x1b, 0x01, 0x24, 0x6a, 0x73, 0xdd, 0xb1, 0xb1, 0xda, 0x70, + 0x23, 0x57, 0x9b, 0x2c, 0x42, 0xaa, 0x36, 0x6f, 0x39, 0x36, 0x56, 0x1b, 0x11, 0x9f, 0x50, 0x9b, + 0x8c, 0x8d, 0xa8, 0xcd, 0xdb, 0x8e, 0x8d, 0xd5, 0x46, 0xd0, 0x71, 0xb5, 0x11, 0x30, 0x4d, 0x6d, + 0xd6, 0x1c, 0xfb, 0xb5, 0xd4, 0x86, 0xf3, 0x0c, 0xa8, 0x4d, 0x96, 0x25, 0x4d, 0x6d, 0xd6, 0x89, + 0x87, 0xe1, 0x6a, 0x23, 0x92, 0x39, 0xa0, 0x36, 0x7a, 0xdc, 0x44, 0x14, 0x36, 0x1d, 0x7b, 0x74, + 0xb5, 0x51, 0x23, 0xe6, 0x6a, 0x33, 0x10, 0x2e, 0x21, 0x76, 0x09, 0xf1, 0x10, 0xb5, 0xd1, 0x02, + 0xe5, 0x6a, 0xa3, 0xed, 0x16, 0x53, 0x1b, 0x0f, 0xef, 0x19, 0x55, 0x1b, 0x75, 0xdf, 0x84, 0xda, + 0x88, 0x79, 0x44, 0x6d, 0x6e, 0x32, 0xbc, 0x95, 0x95, 0x03, 0x51, 0x9b, 0x67, 0x60, 0xa6, 0x13, + 0xf4, 0xa8, 0x40, 0x30, 0x99, 0xb8, 0x45, 0x92, 0xfa, 0x56, 0x7e, 0x06, 0x9e, 0x04, 0x3d, 0xa2, + 0x1d, 0xe4, 0x63, 0xbb, 0x9b, 0xc6, 0xc7, 0xfe, 0x54, 0x47, 0xb6, 0x49, 0xac, 0x9e, 0xcb, 0x54, + 0xe5, 0xf6, 0x68, 0xac, 0x9e, 0x4b, 0x3e, 0x14, 0x56, 0x66, 0x83, 0x2f, 0xc0, 0x2c, 0x66, 0xa5, + 0xf2, 0xc3, 0x55, 0xe8, 0x0e, 0xe1, 0x5d, 0x1d, 0xca, 0x4b, 0xa5, 0x89, 0x7e, 0x52, 0x66, 0x1c, + 0x9e, 0x6c, 0x95, 0xb9, 0x3d, 0x97, 0x0b, 0xd7, 0xbb, 0x23, 0x72, 0x7b, 0x2e, 0xfd, 0x54, 0xb9, + 0xb9, 0x95, 0x73, 0x53, 0x91, 0xe3, 0x5a, 0xf7, 0xc9, 0x11, 0xb8, 0xa9, 0x00, 0xee, 0x69, 0x71, + 0xcb, 0x56, 0x99, 0xdb, 0x73, 0xb9, 0x3c, 0xbe, 0x37, 0x22, 0xb7, 0xe7, 0xee, 0x69, 0x71, 0xcb, + 0x56, 0xf8, 0x59, 0x30, 0x87, 0xb9, 0x99, 0xb6, 0x09, 0x49, 0xbd, 0x4b, 0xd8, 0xd7, 0x86, 0xb2, + 0x33, 0x9d, 0x65, 0x3f, 0x28, 0x3f, 0x0e, 0x54, 0xb5, 0x2b, 0x1e, 0x3c, 0x57, 0x28, 0xf1, 0xa7, + 0x46, 0xf5, 0xe0, 0xb9, 0xec, 0x87, 0xe6, 0x41, 0xd8, 0xe1, 0x21, 0x58, 0x20, 0xf9, 0xe1, 0x8b, + 0x10, 0x0a, 0x7e, 0x8f, 0xf8, 0xd8, 0x18, 0x9e, 0x23, 0x06, 0xe6, 0x3f, 0xa9, 0x17, 0x1c, 0xb2, + 0x3e, 0xa2, 0xfa, 0xc1, 0x3b, 0xc1, 0xd7, 0xb2, 0x35, 0xb2, 0x1f, 0xcf, 0xe5, 0x3f, 0x75, 0x3f, + 0xd9, 0x88, 0xfa, 0xbc, 0xd2, 0x43, 0xa3, 0x3a, 0xea, 0xf3, 0x4a, 0x8e, 0x13, 0xed, 0x79, 0xa5, + 0x47, 0xcc, 0x73, 0x50, 0xce, 0x58, 0xd9, 0x19, 0x73, 0x9f, 0xd0, 0xbe, 0x7d, 0x32, 0x2d, 0x3d, + 0x7d, 0x28, 0xef, 0x74, 0x47, 0x31, 0xc2, 0x5d, 0x80, 0x3d, 0x91, 0xd3, 0x88, 0x1e, 0x49, 0x0f, + 0x08, 0xeb, 0xb5, 0xa1, 0xac, 0xf8, 0x9c, 0xc2, 0xff, 0x53, 0xca, 0x62, 0x27, 0xb3, 0x88, 0x72, + 0xa7, 0x52, 0xc8, 0xce, 0xaf, 0xed, 0x51, 0xca, 0x9d, 0x40, 0xe9, 0xa7, 0x54, 0xee, 0x92, 0x95, + 0x27, 0x81, 0x71, 0xd3, 0x23, 0xaf, 0x36, 0x42, 0x12, 0xe8, 0x74, 0x72, 0x1a, 0x66, 0x49, 0x90, + 0x8c, 0xb0, 0x07, 0xce, 0x4a, 0xc4, 0xda, 0x21, 0xf9, 0x90, 0x78, 0xb8, 0x31, 0x82, 0x07, 0xe5, + 0x58, 0xa4, 0x9e, 0x16, 0x3b, 0xc6, 0x41, 0x98, 0x80, 0x65, 0xc9, 0xa3, 0x7e, 0x6a, 0x3e, 0x22, + 0x2e, 0xbd, 0x11, 0x5c, 0xaa, 0x67, 0x26, 0xf5, 0xb9, 0xd4, 0x31, 0x8f, 0xc2, 0x23, 0xb0, 0x38, + 0xb8, 0x4c, 0x72, 0xf4, 0xed, 0x8c, 0xf2, 0x0c, 0x48, 0xcb, 0xc0, 0x47, 0x9f, 0xf4, 0x0c, 0x68, + 0x23, 0xf0, 0x43, 0xb0, 0x64, 0x58, 0x1d, 0xf1, 0xf4, 0x98, 0x78, 0xda, 0x1c, 0x7d, 0x69, 0x99, + 0xab, 0xf9, 0x8e, 0x61, 0x08, 0x5e, 0x02, 0xa5, 0xa8, 0x1b, 0x46, 0x87, 0xfc, 0xb8, 0x89, 0xf0, + 0x15, 0xfb, 0xd1, 0x98, 0x5f, 0x24, 0x56, 0x76, 0x78, 0x7c, 0x06, 0xcc, 0x53, 0x90, 0xb6, 0xb7, + 0xbd, 0xd7, 0xba, 0x6e, 0x3d, 0x1a, 0xf3, 0x21, 0xa1, 0x51, 0xf7, 0x52, 0x44, 0xc0, 0xaa, 0xfd, + 0x23, 0xde, 0x91, 0x20, 0x56, 0x56, 0xbb, 0x17, 0x01, 0xfd, 0xca, 0xca, 0x36, 0x66, 0xed, 0x0d, + 0x40, 0x8c, 0xb4, 0x0a, 0xeb, 0xd2, 0xc5, 0x85, 0x3c, 0x8f, 0xac, 0xf1, 0x84, 0x7e, 0x63, 0x91, + 0x30, 0x97, 0x57, 0x69, 0x67, 0x6a, 0x95, 0xb7, 0x44, 0x56, 0xf1, 0x13, 0xf7, 0x41, 0xd0, 0xee, + 0x87, 0xd9, 0x8d, 0x06, 0x9b, 0x9e, 0xd3, 0x79, 0xd0, 0x07, 0x8b, 0x6a, 0x3b, 0x43, 0x30, 0xfe, + 0xd6, 0x62, 0xb7, 0x40, 0x9d, 0x91, 0x48, 0x03, 0xa5, 0x9c, 0x57, 0x9a, 0x1e, 0x39, 0x9c, 0x9e, + 0x2b, 0x38, 0x7f, 0x37, 0x84, 0xd3, 0x73, 0x07, 0x39, 0x3d, 0x97, 0x73, 0xee, 0x4b, 0xf7, 0xe1, + 0xbe, 0x1a, 0xe8, 0xef, 0x29, 0xe9, 0xf9, 0x01, 0xd2, 0x7d, 0x29, 0xd2, 0x05, 0xb5, 0x9f, 0x92, + 0x47, 0x2b, 0xc5, 0xfa, 0x87, 0x61, 0xb4, 0x3c, 0xd8, 0x05, 0xb5, 0xfb, 0x62, 0xca, 0x00, 0xd1, + 0x77, 0xc1, 0xfa, 0xc7, 0xbc, 0x0c, 0x10, 0x0d, 0xd7, 0x32, 0x40, 0x6c, 0xa6, 0x50, 0xa9, 0xba, + 0x0b, 0xd2, 0x3f, 0xe5, 0x85, 0x4a, 0x05, 0x5c, 0x0b, 0x95, 0x1a, 0x4d, 0xb4, 0xec, 0x61, 0xe4, + 0xb4, 0x7f, 0xce, 0xa3, 0xa5, 0xf5, 0xaa, 0xd1, 0x52, 0xa3, 0x29, 0x03, 0xa4, 0x9c, 0x05, 0xeb, + 0x5f, 0xf2, 0x32, 0x40, 0x2a, 0x5c, 0xcb, 0x00, 0xb1, 0x71, 0xce, 0xba, 0xf4, 0x77, 0xb4, 0x52, + 0xfc, 0x7f, 0xb5, 0x88, 0x62, 0x0c, 0x2d, 0x7e, 0xf9, 0xfe, 0x24, 0x05, 0xa9, 0xde, 0xae, 0x05, + 0xe3, 0xdf, 0x2c, 0x76, 0x29, 0x19, 0x56, 0xfc, 0xca, 0x1d, 0x3c, 0x87, 0x53, 0x2a, 0xa8, 0xbf, + 0x0f, 0xe1, 0x14, 0xc5, 0xaf, 0x5c, 0xd8, 0xa5, 0x3d, 0xd2, 0xee, 0xed, 0x82, 0xf4, 0x1f, 0x94, + 0xf4, 0x84, 0xe2, 0x57, 0xaf, 0xf7, 0x79, 0xb4, 0x52, 0xac, 0xff, 0x1c, 0x46, 0x2b, 0x8a, 0x5f, + 0x6d, 0x06, 0x98, 0x32, 0xa0, 0x16, 0xff, 0xbf, 0xf2, 0x32, 0x20, 0x17, 0xbf, 0x72, 0x6f, 0x36, + 0x85, 0xaa, 0x15, 0xff, 0xbf, 0xf3, 0x42, 0x55, 0x8a, 0x5f, 0xbd, 0x65, 0x9b, 0x68, 0xb5, 0xe2, + 0xff, 0x4f, 0x1e, 0xad, 0x52, 0xfc, 0xea, 0xb5, 0xcd, 0x94, 0x01, 0xb5, 0xf8, 0xff, 0x9b, 0x97, + 0x01, 0xb9, 0xf8, 0x95, 0xbb, 0x39, 0xe7, 0x7c, 0x28, 0xb5, 0x40, 0xf9, 0xeb, 0x0e, 0xf4, 0xbd, + 0x02, 0x6b, 0x29, 0x0d, 0xac, 0x9d, 0x21, 0xb2, 0xf6, 0x28, 0xb7, 0xc0, 0xc7, 0x40, 0xf4, 0xd7, + 0x1a, 0xe2, 0xbd, 0x06, 0xfa, 0x7e, 0x21, 0xe7, 0xfc, 0x78, 0xc6, 0x21, 0xbe, 0xf0, 0x2f, 0x4c, + 0xf0, 0xd3, 0x60, 0x4e, 0xea, 0xf7, 0xf2, 0x77, 0x2c, 0xe8, 0x07, 0x79, 0x64, 0x35, 0x8c, 0x79, + 0x12, 0x24, 0xaf, 0x32, 0x32, 0x61, 0x82, 0x5b, 0x6a, 0x0b, 0xb5, 0xdf, 0x4c, 0xd1, 0x0f, 0x29, + 0xd1, 0x92, 0x69, 0x13, 0xfa, 0xcd, 0x54, 0x69, 0xae, 0xf6, 0x9b, 0x29, 0xbc, 0x05, 0x44, 0x1b, + 0xae, 0x11, 0x74, 0x8f, 0xd1, 0x8f, 0xe8, 0xfc, 0xf9, 0x81, 0xf9, 0x5b, 0xdd, 0x63, 0xbf, 0xc8, + 0xa1, 0x5b, 0xdd, 0x63, 0x78, 0x57, 0x6a, 0xcb, 0x7e, 0x8c, 0xb7, 0x01, 0xfd, 0x98, 0xce, 0x5d, + 0x1c, 0x98, 0x4b, 0x77, 0x49, 0x34, 0x02, 0xc9, 0x57, 0xbc, 0x3d, 0x59, 0x81, 0xf2, 0xed, 0xf9, + 0x69, 0x81, 0xec, 0xf6, 0xb0, 0xed, 0x11, 0x75, 0x29, 0x6d, 0x8f, 0x20, 0xca, 0xb6, 0xe7, 0x67, + 0x85, 0x1c, 0x85, 0x93, 0xb6, 0x87, 0x4f, 0xcb, 0xb6, 0x47, 0xe6, 0x22, 0xdb, 0x43, 0x76, 0xe7, + 0xe7, 0x79, 0x5c, 0xd2, 0xee, 0x64, 0xfd, 0x33, 0x36, 0x0b, 0xef, 0x8e, 0xfc, 0xa8, 0xe0, 0xdd, + 0xf9, 0x35, 0x25, 0xca, 0xdf, 0x1d, 0xe9, 0xe9, 0x60, 0xbb, 0x23, 0x28, 0xf0, 0xee, 0xfc, 0x82, + 0xce, 0xcf, 0xd9, 0x1d, 0x0e, 0x65, 0xbb, 0x23, 0x66, 0xd2, 0xdd, 0xf9, 0x25, 0x9d, 0x9b, 0xbb, + 0x3b, 0x1c, 0x4e, 0x77, 0xe7, 0x02, 0x00, 0x64, 0xfd, 0xdd, 0xa0, 0x13, 0xae, 0xa3, 0x2f, 0xd9, + 0xe4, 0x8d, 0x8d, 0x64, 0x82, 0x0e, 0x28, 0xd2, 0xfa, 0xc5, 0x5f, 0x37, 0xd0, 0x97, 0x65, 0xc4, + 0x2e, 0x36, 0xc1, 0x8b, 0xa0, 0xd4, 0xc8, 0x20, 0x9b, 0xe8, 0x2b, 0x0c, 0x52, 0xe3, 0x90, 0x4d, + 0xb8, 0x02, 0xa6, 0x28, 0x82, 0x40, 0xdc, 0x06, 0xfa, 0xaa, 0x4e, 0xe3, 0xe2, 0xbf, 0xf1, 0xc8, + 0xb7, 0x35, 0x0c, 0xb9, 0x81, 0xbe, 0x46, 0x11, 0xb2, 0x0d, 0x5e, 0xe2, 0x34, 0x6b, 0x84, 0xc7, + 0x43, 0x5f, 0x57, 0x40, 0x98, 0xc7, 0x13, 0x2b, 0xc2, 0xdf, 0x6e, 0xa2, 0x6f, 0xe8, 0x8e, 0x6e, + 0x62, 0x80, 0x08, 0xed, 0x16, 0xfa, 0xa6, 0x1e, 0xed, 0xad, 0x6c, 0xc9, 0xf8, 0xeb, 0x6d, 0xf4, + 0x2d, 0x9d, 0xe2, 0x36, 0x5c, 0x01, 0xa5, 0x9a, 0x40, 0xac, 0xaf, 0xa1, 0x6f, 0xb3, 0x38, 0x04, + 0xc9, 0xfa, 0x1a, 0xc1, 0xec, 0x6c, 0xbf, 0xff, 0xa0, 0xb1, 0xbb, 0xf5, 0x64, 0x7b, 0x7d, 0x1d, + 0x7d, 0x87, 0x63, 0xb0, 0x91, 0xda, 0x32, 0x0c, 0xc9, 0xf5, 0x06, 0xfa, 0xae, 0x82, 0x21, 0xb6, + 0xe5, 0x17, 0x60, 0x4a, 0xfd, 0x8b, 0xb9, 0x04, 0xac, 0x80, 0xbd, 0x5a, 0xb3, 0x02, 0xf8, 0x2e, + 0x28, 0x36, 0x23, 0xd1, 0x1d, 0x47, 0x85, 0x93, 0x3a, 0xe9, 0x32, 0x7a, 0xf9, 0x1e, 0x80, 0x83, + 0xdd, 0x2e, 0x58, 0x06, 0xf6, 0xab, 0xf0, 0x98, 0xb9, 0xc0, 0xbf, 0xc2, 0x79, 0x70, 0x9a, 0x16, + 0x57, 0x81, 0xd8, 0xe8, 0x97, 0x3b, 0x85, 0x5b, 0x56, 0xc6, 0x20, 0x77, 0xb6, 0x64, 0x06, 0xdb, + 0xc0, 0x60, 0xcb, 0x0c, 0x55, 0x30, 0x6f, 0xea, 0x61, 0xc9, 0x1c, 0x53, 0x06, 0x8e, 0x29, 0x33, + 0x87, 0xd2, 0xab, 0x92, 0x39, 0x4e, 0x19, 0x38, 0x4e, 0x0d, 0x72, 0x0c, 0xf4, 0xa4, 0x64, 0x8e, + 0x59, 0x03, 0xc7, 0xac, 0x99, 0x43, 0xe9, 0x3d, 0xc9, 0x1c, 0xd0, 0xc0, 0x01, 0x65, 0x8e, 0x07, + 0x60, 0xd1, 0xdc, 0x61, 0x92, 0x59, 0x26, 0x0c, 0x2c, 0x13, 0x39, 0x2c, 0x6a, 0x17, 0x49, 0x66, + 0x19, 0x37, 0xb0, 0x8c, 0xcb, 0x2c, 0x35, 0x80, 0xf2, 0xfa, 0x44, 0x32, 0xcf, 0x8c, 0x81, 0x67, + 0x26, 0x8f, 0x47, 0xeb, 0x03, 0xc9, 0x3c, 0x65, 0x03, 0x4f, 0xd9, 0x58, 0x6d, 0x72, 0xb7, 0xe7, + 0xa4, 0x7a, 0x2d, 0xc8, 0x0c, 0x5b, 0x60, 0xce, 0xd0, 0xd8, 0x39, 0x89, 0xc2, 0x92, 0x29, 0xee, + 0x82, 0xb2, 0xde, 0xc5, 0x91, 0xe7, 0x4f, 0x1a, 0xe6, 0x4f, 0x1a, 0x8a, 0x44, 0xef, 0xd8, 0xc8, + 0x1c, 0x67, 0x0c, 0x1c, 0x67, 0x06, 0x97, 0xa1, 0xb7, 0x66, 0x4e, 0xa2, 0x28, 0xc9, 0x14, 0x31, + 0x38, 0x37, 0xa4, 0xf7, 0x62, 0xa0, 0x7a, 0x4f, 0xa6, 0x7a, 0x8d, 0x17, 0x1f, 0x92, 0xcf, 0x23, + 0x70, 0x7e, 0x58, 0xf3, 0xc5, 0xe0, 0x74, 0x5d, 0x75, 0x3a, 0xf4, 0x5d, 0x88, 0xe4, 0xa8, 0x4d, + 0x0b, 0xce, 0xd4, 0x74, 0x31, 0x38, 0xb9, 0x23, 0x3b, 0x19, 0xf5, 0xed, 0x88, 0xe4, 0x2d, 0x00, + 0x67, 0x73, 0x1b, 0x2f, 0x06, 0x77, 0xab, 0xaa, 0xbb, 0xfc, 0x77, 0x26, 0x99, 0x8b, 0x95, 0xdb, + 0x00, 0x48, 0x2d, 0xa2, 0x09, 0x60, 0xd7, 0xea, 0xf5, 0xf2, 0x18, 0xfe, 0xa5, 0xba, 0xe5, 0x97, + 0x2d, 0xfa, 0xcb, 0x8b, 0x72, 0x01, 0xbb, 0xdb, 0xdd, 0x7e, 0x58, 0xfe, 0x1f, 0xff, 0xcf, 0xaa, + 0x4e, 0xf1, 0xe6, 0x09, 0x39, 0xc0, 0x56, 0xde, 0x00, 0xd3, 0x5a, 0x67, 0xab, 0x04, 0xac, 0x26, + 0x3f, 0x50, 0x9a, 0xd7, 0x6e, 0x00, 0x90, 0xfd, 0x63, 0x18, 0x38, 0x03, 0x8a, 0xfb, 0xbb, 0x7b, + 0x4f, 0xb7, 0xef, 0xef, 0xd4, 0x76, 0xb6, 0x1f, 0x94, 0xc7, 0x60, 0x09, 0x4c, 0x3e, 0xf5, 0xeb, + 0xcf, 0xea, 0xd5, 0xfd, 0x5a, 0xd9, 0x82, 0x93, 0xe0, 0xd4, 0xe3, 0xbd, 0xfa, 0x6e, 0xb9, 0x70, + 0xed, 0x1e, 0x28, 0xca, 0x8d, 0xa5, 0x19, 0x50, 0xac, 0xd5, 0xfd, 0xed, 0x9d, 0x87, 0xbb, 0x0d, + 0x1a, 0xa9, 0x64, 0xa0, 0x11, 0x2b, 0x86, 0x17, 0xe5, 0x42, 0xf5, 0x22, 0xb8, 0xd0, 0x8c, 0x3a, + 0x03, 0x7f, 0xb6, 0x48, 0xc9, 0x79, 0x39, 0x4e, 0xac, 0x9b, 0xff, 0x0f, 0x00, 0x00, 0xff, 0xff, + 0x29, 0x30, 0x51, 0x54, 0x22, 0x25, 0x00, 0x00, +} diff --git a/api/vendor/github.com/golang/protobuf/conformance/internal/conformance_proto/conformance.proto b/api/vendor/github.com/golang/protobuf/conformance/internal/conformance_proto/conformance.proto new file mode 100644 index 0000000..fc96074 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/conformance/internal/conformance_proto/conformance.proto @@ -0,0 +1,273 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// 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. + +syntax = "proto3"; +package conformance; +option java_package = "com.google.protobuf.conformance"; + +import "google/protobuf/any.proto"; +import "google/protobuf/duration.proto"; +import "google/protobuf/field_mask.proto"; +import "google/protobuf/struct.proto"; +import "google/protobuf/timestamp.proto"; +import "google/protobuf/wrappers.proto"; + +// This defines the conformance testing protocol. This protocol exists between +// the conformance test suite itself and the code being tested. For each test, +// the suite will send a ConformanceRequest message and expect a +// ConformanceResponse message. +// +// You can either run the tests in two different ways: +// +// 1. in-process (using the interface in conformance_test.h). +// +// 2. as a sub-process communicating over a pipe. Information about how to +// do this is in conformance_test_runner.cc. +// +// Pros/cons of the two approaches: +// +// - running as a sub-process is much simpler for languages other than C/C++. +// +// - running as a sub-process may be more tricky in unusual environments like +// iOS apps, where fork/stdin/stdout are not available. + +enum WireFormat { + UNSPECIFIED = 0; + PROTOBUF = 1; + JSON = 2; +} + +// Represents a single test case's input. The testee should: +// +// 1. parse this proto (which should always succeed) +// 2. parse the protobuf or JSON payload in "payload" (which may fail) +// 3. if the parse succeeded, serialize the message in the requested format. +message ConformanceRequest { + // The payload (whether protobuf of JSON) is always for a TestAllTypes proto + // (see below). + oneof payload { + bytes protobuf_payload = 1; + string json_payload = 2; + } + + // Which format should the testee serialize its message to? + WireFormat requested_output_format = 3; +} + +// Represents a single test case's output. +message ConformanceResponse { + oneof result { + // This string should be set to indicate parsing failed. The string can + // provide more information about the parse error if it is available. + // + // Setting this string does not necessarily mean the testee failed the + // test. Some of the test cases are intentionally invalid input. + string parse_error = 1; + + // If the input was successfully parsed but errors occurred when + // serializing it to the requested output format, set the error message in + // this field. + string serialize_error = 6; + + // This should be set if some other error occurred. This will always + // indicate that the test failed. The string can provide more information + // about the failure. + string runtime_error = 2; + + // If the input was successfully parsed and the requested output was + // protobuf, serialize it to protobuf and set it in this field. + bytes protobuf_payload = 3; + + // If the input was successfully parsed and the requested output was JSON, + // serialize to JSON and set it in this field. + string json_payload = 4; + + // For when the testee skipped the test, likely because a certain feature + // wasn't supported, like JSON input/output. + string skipped = 5; + } +} + +// This proto includes every type of field in both singular and repeated +// forms. +message TestAllTypes { + message NestedMessage { + int32 a = 1; + TestAllTypes corecursive = 2; + } + + enum NestedEnum { + FOO = 0; + BAR = 1; + BAZ = 2; + NEG = -1; // Intentionally negative. + } + + // Singular + int32 optional_int32 = 1; + int64 optional_int64 = 2; + uint32 optional_uint32 = 3; + uint64 optional_uint64 = 4; + sint32 optional_sint32 = 5; + sint64 optional_sint64 = 6; + fixed32 optional_fixed32 = 7; + fixed64 optional_fixed64 = 8; + sfixed32 optional_sfixed32 = 9; + sfixed64 optional_sfixed64 = 10; + float optional_float = 11; + double optional_double = 12; + bool optional_bool = 13; + string optional_string = 14; + bytes optional_bytes = 15; + + NestedMessage optional_nested_message = 18; + ForeignMessage optional_foreign_message = 19; + + NestedEnum optional_nested_enum = 21; + ForeignEnum optional_foreign_enum = 22; + + string optional_string_piece = 24 [ctype=STRING_PIECE]; + string optional_cord = 25 [ctype=CORD]; + + TestAllTypes recursive_message = 27; + + // Repeated + repeated int32 repeated_int32 = 31; + repeated int64 repeated_int64 = 32; + repeated uint32 repeated_uint32 = 33; + repeated uint64 repeated_uint64 = 34; + repeated sint32 repeated_sint32 = 35; + repeated sint64 repeated_sint64 = 36; + repeated fixed32 repeated_fixed32 = 37; + repeated fixed64 repeated_fixed64 = 38; + repeated sfixed32 repeated_sfixed32 = 39; + repeated sfixed64 repeated_sfixed64 = 40; + repeated float repeated_float = 41; + repeated double repeated_double = 42; + repeated bool repeated_bool = 43; + repeated string repeated_string = 44; + repeated bytes repeated_bytes = 45; + + repeated NestedMessage repeated_nested_message = 48; + repeated ForeignMessage repeated_foreign_message = 49; + + repeated NestedEnum repeated_nested_enum = 51; + repeated ForeignEnum repeated_foreign_enum = 52; + + repeated string repeated_string_piece = 54 [ctype=STRING_PIECE]; + repeated string repeated_cord = 55 [ctype=CORD]; + + // Map + map < int32, int32> map_int32_int32 = 56; + map < int64, int64> map_int64_int64 = 57; + map < uint32, uint32> map_uint32_uint32 = 58; + map < uint64, uint64> map_uint64_uint64 = 59; + map < sint32, sint32> map_sint32_sint32 = 60; + map < sint64, sint64> map_sint64_sint64 = 61; + map < fixed32, fixed32> map_fixed32_fixed32 = 62; + map < fixed64, fixed64> map_fixed64_fixed64 = 63; + map map_sfixed32_sfixed32 = 64; + map map_sfixed64_sfixed64 = 65; + map < int32, float> map_int32_float = 66; + map < int32, double> map_int32_double = 67; + map < bool, bool> map_bool_bool = 68; + map < string, string> map_string_string = 69; + map < string, bytes> map_string_bytes = 70; + map < string, NestedMessage> map_string_nested_message = 71; + map < string, ForeignMessage> map_string_foreign_message = 72; + map < string, NestedEnum> map_string_nested_enum = 73; + map < string, ForeignEnum> map_string_foreign_enum = 74; + + oneof oneof_field { + uint32 oneof_uint32 = 111; + NestedMessage oneof_nested_message = 112; + string oneof_string = 113; + bytes oneof_bytes = 114; + } + + // Well-known types + google.protobuf.BoolValue optional_bool_wrapper = 201; + google.protobuf.Int32Value optional_int32_wrapper = 202; + google.protobuf.Int64Value optional_int64_wrapper = 203; + google.protobuf.UInt32Value optional_uint32_wrapper = 204; + google.protobuf.UInt64Value optional_uint64_wrapper = 205; + google.protobuf.FloatValue optional_float_wrapper = 206; + google.protobuf.DoubleValue optional_double_wrapper = 207; + google.protobuf.StringValue optional_string_wrapper = 208; + google.protobuf.BytesValue optional_bytes_wrapper = 209; + + repeated google.protobuf.BoolValue repeated_bool_wrapper = 211; + repeated google.protobuf.Int32Value repeated_int32_wrapper = 212; + repeated google.protobuf.Int64Value repeated_int64_wrapper = 213; + repeated google.protobuf.UInt32Value repeated_uint32_wrapper = 214; + repeated google.protobuf.UInt64Value repeated_uint64_wrapper = 215; + repeated google.protobuf.FloatValue repeated_float_wrapper = 216; + repeated google.protobuf.DoubleValue repeated_double_wrapper = 217; + repeated google.protobuf.StringValue repeated_string_wrapper = 218; + repeated google.protobuf.BytesValue repeated_bytes_wrapper = 219; + + google.protobuf.Duration optional_duration = 301; + google.protobuf.Timestamp optional_timestamp = 302; + google.protobuf.FieldMask optional_field_mask = 303; + google.protobuf.Struct optional_struct = 304; + google.protobuf.Any optional_any = 305; + google.protobuf.Value optional_value = 306; + + repeated google.protobuf.Duration repeated_duration = 311; + repeated google.protobuf.Timestamp repeated_timestamp = 312; + repeated google.protobuf.FieldMask repeated_fieldmask = 313; + repeated google.protobuf.Struct repeated_struct = 324; + repeated google.protobuf.Any repeated_any = 315; + repeated google.protobuf.Value repeated_value = 316; + + // Test field-name-to-JSON-name convention. + int32 fieldname1 = 401; + int32 field_name2 = 402; + int32 _field_name3 = 403; + int32 field__name4_ = 404; + int32 field0name5 = 405; + int32 field_0_name6 = 406; + int32 fieldName7 = 407; + int32 FieldName8 = 408; + int32 field_Name9 = 409; + int32 Field_Name10 = 410; + int32 FIELD_NAME11 = 411; + int32 FIELD_name12 = 412; +} + +message ForeignMessage { + int32 c = 1; +} + +enum ForeignEnum { + FOREIGN_FOO = 0; + FOREIGN_BAR = 1; + FOREIGN_BAZ = 2; +} diff --git a/api/vendor/github.com/golang/protobuf/conformance/test.sh b/api/vendor/github.com/golang/protobuf/conformance/test.sh new file mode 100755 index 0000000..e6de29b --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/conformance/test.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +PROTOBUF_ROOT=$1 +CONFORMANCE_ROOT=$1/conformance +CONFORMANCE_TEST_RUNNER=$CONFORMANCE_ROOT/conformance-test-runner + +cd $(dirname $0) + +if [[ $PROTOBUF_ROOT == "" ]]; then + echo "usage: test.sh " >/dev/stderr + exit 1 +fi + +if [[ ! -x $CONFORMANCE_TEST_RUNNER ]]; then + echo "SKIP: conformance test runner not installed" >/dev/stderr + exit 0 +fi + +a=$CONFORMANCE_ROOT/conformance.proto +b=internal/conformance_proto/conformance.proto +if [[ $(diff $a $b) != "" ]]; then + cp $a $b + echo "WARNING: conformance.proto is out of date" >/dev/stderr +fi + +$CONFORMANCE_TEST_RUNNER --failure_list failure_list_go.txt ./conformance.sh diff --git a/api/vendor/github.com/golang/protobuf/descriptor/descriptor.go b/api/vendor/github.com/golang/protobuf/descriptor/descriptor.go new file mode 100644 index 0000000..ac7e51b --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/descriptor/descriptor.go @@ -0,0 +1,93 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +// Package descriptor provides functions for obtaining protocol buffer +// descriptors for generated Go types. +// +// These functions cannot go in package proto because they depend on the +// generated protobuf descriptor messages, which themselves depend on proto. +package descriptor + +import ( + "bytes" + "compress/gzip" + "fmt" + "io/ioutil" + + "github.com/golang/protobuf/proto" + protobuf "github.com/golang/protobuf/protoc-gen-go/descriptor" +) + +// extractFile extracts a FileDescriptorProto from a gzip'd buffer. +func extractFile(gz []byte) (*protobuf.FileDescriptorProto, error) { + r, err := gzip.NewReader(bytes.NewReader(gz)) + if err != nil { + return nil, fmt.Errorf("failed to open gzip reader: %v", err) + } + defer r.Close() + + b, err := ioutil.ReadAll(r) + if err != nil { + return nil, fmt.Errorf("failed to uncompress descriptor: %v", err) + } + + fd := new(protobuf.FileDescriptorProto) + if err := proto.Unmarshal(b, fd); err != nil { + return nil, fmt.Errorf("malformed FileDescriptorProto: %v", err) + } + + return fd, nil +} + +// Message is a proto.Message with a method to return its descriptor. +// +// Message types generated by the protocol compiler always satisfy +// the Message interface. +type Message interface { + proto.Message + Descriptor() ([]byte, []int) +} + +// ForMessage returns a FileDescriptorProto and a DescriptorProto from within it +// describing the given message. +func ForMessage(msg Message) (fd *protobuf.FileDescriptorProto, md *protobuf.DescriptorProto) { + gz, path := msg.Descriptor() + fd, err := extractFile(gz) + if err != nil { + panic(fmt.Sprintf("invalid FileDescriptorProto for %T: %v", msg, err)) + } + + md = fd.MessageType[path[0]] + for _, i := range path[1:] { + md = md.NestedType[i] + } + return fd, md +} diff --git a/api/vendor/github.com/golang/protobuf/descriptor/descriptor_test.go b/api/vendor/github.com/golang/protobuf/descriptor/descriptor_test.go new file mode 100644 index 0000000..bf5174d --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/descriptor/descriptor_test.go @@ -0,0 +1,32 @@ +package descriptor_test + +import ( + "fmt" + "testing" + + "github.com/golang/protobuf/descriptor" + tpb "github.com/golang/protobuf/proto/test_proto" + protobuf "github.com/golang/protobuf/protoc-gen-go/descriptor" +) + +func TestMessage(t *testing.T) { + var msg *protobuf.DescriptorProto + fd, md := descriptor.ForMessage(msg) + if pkg, want := fd.GetPackage(), "google.protobuf"; pkg != want { + t.Errorf("descriptor.ForMessage(%T).GetPackage() = %q; want %q", msg, pkg, want) + } + if name, want := md.GetName(), "DescriptorProto"; name != want { + t.Fatalf("descriptor.ForMessage(%T).GetName() = %q; want %q", msg, name, want) + } +} + +func Example_options() { + var msg *tpb.MyMessageSet + _, md := descriptor.ForMessage(msg) + if md.GetOptions().GetMessageSetWireFormat() { + fmt.Printf("%v uses option message_set_wire_format.\n", md.GetName()) + } + + // Output: + // MyMessageSet uses option message_set_wire_format. +} diff --git a/api/vendor/github.com/golang/protobuf/jsonpb/jsonpb.go b/api/vendor/github.com/golang/protobuf/jsonpb/jsonpb.go new file mode 100644 index 0000000..ff368f3 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/jsonpb/jsonpb.go @@ -0,0 +1,1241 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2015 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +/* +Package jsonpb provides marshaling and unmarshaling between protocol buffers and JSON. +It follows the specification at https://developers.google.com/protocol-buffers/docs/proto3#json. + +This package produces a different output than the standard "encoding/json" package, +which does not operate correctly on protocol buffers. +*/ +package jsonpb + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "io" + "math" + "reflect" + "sort" + "strconv" + "strings" + "time" + + "github.com/golang/protobuf/proto" + + stpb "github.com/golang/protobuf/ptypes/struct" +) + +const secondInNanos = int64(time.Second / time.Nanosecond) + +// Marshaler is a configurable object for converting between +// protocol buffer objects and a JSON representation for them. +type Marshaler struct { + // Whether to render enum values as integers, as opposed to string values. + EnumsAsInts bool + + // Whether to render fields with zero values. + EmitDefaults bool + + // A string to indent each level by. The presence of this field will + // also cause a space to appear between the field separator and + // value, and for newlines to be appear between fields and array + // elements. + Indent string + + // Whether to use the original (.proto) name for fields. + OrigName bool + + // A custom URL resolver to use when marshaling Any messages to JSON. + // If unset, the default resolution strategy is to extract the + // fully-qualified type name from the type URL and pass that to + // proto.MessageType(string). + AnyResolver AnyResolver +} + +// AnyResolver takes a type URL, present in an Any message, and resolves it into +// an instance of the associated message. +type AnyResolver interface { + Resolve(typeUrl string) (proto.Message, error) +} + +func defaultResolveAny(typeUrl string) (proto.Message, error) { + // Only the part of typeUrl after the last slash is relevant. + mname := typeUrl + if slash := strings.LastIndex(mname, "/"); slash >= 0 { + mname = mname[slash+1:] + } + mt := proto.MessageType(mname) + if mt == nil { + return nil, fmt.Errorf("unknown message type %q", mname) + } + return reflect.New(mt.Elem()).Interface().(proto.Message), nil +} + +// JSONPBMarshaler is implemented by protobuf messages that customize the +// way they are marshaled to JSON. Messages that implement this should +// also implement JSONPBUnmarshaler so that the custom format can be +// parsed. +type JSONPBMarshaler interface { + MarshalJSONPB(*Marshaler) ([]byte, error) +} + +// JSONPBUnmarshaler is implemented by protobuf messages that customize +// the way they are unmarshaled from JSON. Messages that implement this +// should also implement JSONPBMarshaler so that the custom format can be +// produced. +type JSONPBUnmarshaler interface { + UnmarshalJSONPB(*Unmarshaler, []byte) error +} + +// Marshal marshals a protocol buffer into JSON. +func (m *Marshaler) Marshal(out io.Writer, pb proto.Message) error { + v := reflect.ValueOf(pb) + if pb == nil || (v.Kind() == reflect.Ptr && v.IsNil()) { + return errors.New("Marshal called with nil") + } + // Check for unset required fields first. + if err := checkRequiredFields(pb); err != nil { + return err + } + writer := &errWriter{writer: out} + return m.marshalObject(writer, pb, "", "") +} + +// MarshalToString converts a protocol buffer object to JSON string. +func (m *Marshaler) MarshalToString(pb proto.Message) (string, error) { + var buf bytes.Buffer + if err := m.Marshal(&buf, pb); err != nil { + return "", err + } + return buf.String(), nil +} + +type int32Slice []int32 + +var nonFinite = map[string]float64{ + `"NaN"`: math.NaN(), + `"Infinity"`: math.Inf(1), + `"-Infinity"`: math.Inf(-1), +} + +// For sorting extensions ids to ensure stable output. +func (s int32Slice) Len() int { return len(s) } +func (s int32Slice) Less(i, j int) bool { return s[i] < s[j] } +func (s int32Slice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } + +type wkt interface { + XXX_WellKnownType() string +} + +// marshalObject writes a struct to the Writer. +func (m *Marshaler) marshalObject(out *errWriter, v proto.Message, indent, typeURL string) error { + if jsm, ok := v.(JSONPBMarshaler); ok { + b, err := jsm.MarshalJSONPB(m) + if err != nil { + return err + } + if typeURL != "" { + // we are marshaling this object to an Any type + var js map[string]*json.RawMessage + if err = json.Unmarshal(b, &js); err != nil { + return fmt.Errorf("type %T produced invalid JSON: %v", v, err) + } + turl, err := json.Marshal(typeURL) + if err != nil { + return fmt.Errorf("failed to marshal type URL %q to JSON: %v", typeURL, err) + } + js["@type"] = (*json.RawMessage)(&turl) + if b, err = json.Marshal(js); err != nil { + return err + } + } + + out.write(string(b)) + return out.err + } + + s := reflect.ValueOf(v).Elem() + + // Handle well-known types. + if wkt, ok := v.(wkt); ok { + switch wkt.XXX_WellKnownType() { + case "DoubleValue", "FloatValue", "Int64Value", "UInt64Value", + "Int32Value", "UInt32Value", "BoolValue", "StringValue", "BytesValue": + // "Wrappers use the same representation in JSON + // as the wrapped primitive type, ..." + sprop := proto.GetProperties(s.Type()) + return m.marshalValue(out, sprop.Prop[0], s.Field(0), indent) + case "Any": + // Any is a bit more involved. + return m.marshalAny(out, v, indent) + case "Duration": + // "Generated output always contains 0, 3, 6, or 9 fractional digits, + // depending on required precision." + s, ns := s.Field(0).Int(), s.Field(1).Int() + if ns <= -secondInNanos || ns >= secondInNanos { + return fmt.Errorf("ns out of range (%v, %v)", -secondInNanos, secondInNanos) + } + if (s > 0 && ns < 0) || (s < 0 && ns > 0) { + return errors.New("signs of seconds and nanos do not match") + } + if s < 0 { + ns = -ns + } + x := fmt.Sprintf("%d.%09d", s, ns) + x = strings.TrimSuffix(x, "000") + x = strings.TrimSuffix(x, "000") + x = strings.TrimSuffix(x, ".000") + out.write(`"`) + out.write(x) + out.write(`s"`) + return out.err + case "Struct", "ListValue": + // Let marshalValue handle the `Struct.fields` map or the `ListValue.values` slice. + // TODO: pass the correct Properties if needed. + return m.marshalValue(out, &proto.Properties{}, s.Field(0), indent) + case "Timestamp": + // "RFC 3339, where generated output will always be Z-normalized + // and uses 0, 3, 6 or 9 fractional digits." + s, ns := s.Field(0).Int(), s.Field(1).Int() + if ns < 0 || ns >= secondInNanos { + return fmt.Errorf("ns out of range [0, %v)", secondInNanos) + } + t := time.Unix(s, ns).UTC() + // time.RFC3339Nano isn't exactly right (we need to get 3/6/9 fractional digits). + x := t.Format("2006-01-02T15:04:05.000000000") + x = strings.TrimSuffix(x, "000") + x = strings.TrimSuffix(x, "000") + x = strings.TrimSuffix(x, ".000") + out.write(`"`) + out.write(x) + out.write(`Z"`) + return out.err + case "Value": + // Value has a single oneof. + kind := s.Field(0) + if kind.IsNil() { + // "absence of any variant indicates an error" + return errors.New("nil Value") + } + // oneof -> *T -> T -> T.F + x := kind.Elem().Elem().Field(0) + // TODO: pass the correct Properties if needed. + return m.marshalValue(out, &proto.Properties{}, x, indent) + } + } + + out.write("{") + if m.Indent != "" { + out.write("\n") + } + + firstField := true + + if typeURL != "" { + if err := m.marshalTypeURL(out, indent, typeURL); err != nil { + return err + } + firstField = false + } + + for i := 0; i < s.NumField(); i++ { + value := s.Field(i) + valueField := s.Type().Field(i) + if strings.HasPrefix(valueField.Name, "XXX_") { + continue + } + + // IsNil will panic on most value kinds. + switch value.Kind() { + case reflect.Chan, reflect.Func, reflect.Interface: + if value.IsNil() { + continue + } + } + + if !m.EmitDefaults { + switch value.Kind() { + case reflect.Bool: + if !value.Bool() { + continue + } + case reflect.Int32, reflect.Int64: + if value.Int() == 0 { + continue + } + case reflect.Uint32, reflect.Uint64: + if value.Uint() == 0 { + continue + } + case reflect.Float32, reflect.Float64: + if value.Float() == 0 { + continue + } + case reflect.String: + if value.Len() == 0 { + continue + } + case reflect.Map, reflect.Ptr, reflect.Slice: + if value.IsNil() { + continue + } + } + } + + // Oneof fields need special handling. + if valueField.Tag.Get("protobuf_oneof") != "" { + // value is an interface containing &T{real_value}. + sv := value.Elem().Elem() // interface -> *T -> T + value = sv.Field(0) + valueField = sv.Type().Field(0) + } + prop := jsonProperties(valueField, m.OrigName) + if !firstField { + m.writeSep(out) + } + if err := m.marshalField(out, prop, value, indent); err != nil { + return err + } + firstField = false + } + + // Handle proto2 extensions. + if ep, ok := v.(proto.Message); ok { + extensions := proto.RegisteredExtensions(v) + // Sort extensions for stable output. + ids := make([]int32, 0, len(extensions)) + for id, desc := range extensions { + if !proto.HasExtension(ep, desc) { + continue + } + ids = append(ids, id) + } + sort.Sort(int32Slice(ids)) + for _, id := range ids { + desc := extensions[id] + if desc == nil { + // unknown extension + continue + } + ext, extErr := proto.GetExtension(ep, desc) + if extErr != nil { + return extErr + } + value := reflect.ValueOf(ext) + var prop proto.Properties + prop.Parse(desc.Tag) + prop.JSONName = fmt.Sprintf("[%s]", desc.Name) + if !firstField { + m.writeSep(out) + } + if err := m.marshalField(out, &prop, value, indent); err != nil { + return err + } + firstField = false + } + + } + + if m.Indent != "" { + out.write("\n") + out.write(indent) + } + out.write("}") + return out.err +} + +func (m *Marshaler) writeSep(out *errWriter) { + if m.Indent != "" { + out.write(",\n") + } else { + out.write(",") + } +} + +func (m *Marshaler) marshalAny(out *errWriter, any proto.Message, indent string) error { + // "If the Any contains a value that has a special JSON mapping, + // it will be converted as follows: {"@type": xxx, "value": yyy}. + // Otherwise, the value will be converted into a JSON object, + // and the "@type" field will be inserted to indicate the actual data type." + v := reflect.ValueOf(any).Elem() + turl := v.Field(0).String() + val := v.Field(1).Bytes() + + var msg proto.Message + var err error + if m.AnyResolver != nil { + msg, err = m.AnyResolver.Resolve(turl) + } else { + msg, err = defaultResolveAny(turl) + } + if err != nil { + return err + } + + if err := proto.Unmarshal(val, msg); err != nil { + return err + } + + if _, ok := msg.(wkt); ok { + out.write("{") + if m.Indent != "" { + out.write("\n") + } + if err := m.marshalTypeURL(out, indent, turl); err != nil { + return err + } + m.writeSep(out) + if m.Indent != "" { + out.write(indent) + out.write(m.Indent) + out.write(`"value": `) + } else { + out.write(`"value":`) + } + if err := m.marshalObject(out, msg, indent+m.Indent, ""); err != nil { + return err + } + if m.Indent != "" { + out.write("\n") + out.write(indent) + } + out.write("}") + return out.err + } + + return m.marshalObject(out, msg, indent, turl) +} + +func (m *Marshaler) marshalTypeURL(out *errWriter, indent, typeURL string) error { + if m.Indent != "" { + out.write(indent) + out.write(m.Indent) + } + out.write(`"@type":`) + if m.Indent != "" { + out.write(" ") + } + b, err := json.Marshal(typeURL) + if err != nil { + return err + } + out.write(string(b)) + return out.err +} + +// marshalField writes field description and value to the Writer. +func (m *Marshaler) marshalField(out *errWriter, prop *proto.Properties, v reflect.Value, indent string) error { + if m.Indent != "" { + out.write(indent) + out.write(m.Indent) + } + out.write(`"`) + out.write(prop.JSONName) + out.write(`":`) + if m.Indent != "" { + out.write(" ") + } + if err := m.marshalValue(out, prop, v, indent); err != nil { + return err + } + return nil +} + +// marshalValue writes the value to the Writer. +func (m *Marshaler) marshalValue(out *errWriter, prop *proto.Properties, v reflect.Value, indent string) error { + var err error + v = reflect.Indirect(v) + + // Handle nil pointer + if v.Kind() == reflect.Invalid { + out.write("null") + return out.err + } + + // Handle repeated elements. + if v.Kind() == reflect.Slice && v.Type().Elem().Kind() != reflect.Uint8 { + out.write("[") + comma := "" + for i := 0; i < v.Len(); i++ { + sliceVal := v.Index(i) + out.write(comma) + if m.Indent != "" { + out.write("\n") + out.write(indent) + out.write(m.Indent) + out.write(m.Indent) + } + if err := m.marshalValue(out, prop, sliceVal, indent+m.Indent); err != nil { + return err + } + comma = "," + } + if m.Indent != "" { + out.write("\n") + out.write(indent) + out.write(m.Indent) + } + out.write("]") + return out.err + } + + // Handle well-known types. + // Most are handled up in marshalObject (because 99% are messages). + if wkt, ok := v.Interface().(wkt); ok { + switch wkt.XXX_WellKnownType() { + case "NullValue": + out.write("null") + return out.err + } + } + + // Handle enumerations. + if !m.EnumsAsInts && prop.Enum != "" { + // Unknown enum values will are stringified by the proto library as their + // value. Such values should _not_ be quoted or they will be interpreted + // as an enum string instead of their value. + enumStr := v.Interface().(fmt.Stringer).String() + var valStr string + if v.Kind() == reflect.Ptr { + valStr = strconv.Itoa(int(v.Elem().Int())) + } else { + valStr = strconv.Itoa(int(v.Int())) + } + isKnownEnum := enumStr != valStr + if isKnownEnum { + out.write(`"`) + } + out.write(enumStr) + if isKnownEnum { + out.write(`"`) + } + return out.err + } + + // Handle nested messages. + if v.Kind() == reflect.Struct { + return m.marshalObject(out, v.Addr().Interface().(proto.Message), indent+m.Indent, "") + } + + // Handle maps. + // Since Go randomizes map iteration, we sort keys for stable output. + if v.Kind() == reflect.Map { + out.write(`{`) + keys := v.MapKeys() + sort.Sort(mapKeys(keys)) + for i, k := range keys { + if i > 0 { + out.write(`,`) + } + if m.Indent != "" { + out.write("\n") + out.write(indent) + out.write(m.Indent) + out.write(m.Indent) + } + + b, err := json.Marshal(k.Interface()) + if err != nil { + return err + } + s := string(b) + + // If the JSON is not a string value, encode it again to make it one. + if !strings.HasPrefix(s, `"`) { + b, err := json.Marshal(s) + if err != nil { + return err + } + s = string(b) + } + + out.write(s) + out.write(`:`) + if m.Indent != "" { + out.write(` `) + } + + if err := m.marshalValue(out, prop, v.MapIndex(k), indent+m.Indent); err != nil { + return err + } + } + if m.Indent != "" { + out.write("\n") + out.write(indent) + out.write(m.Indent) + } + out.write(`}`) + return out.err + } + + // Handle non-finite floats, e.g. NaN, Infinity and -Infinity. + if v.Kind() == reflect.Float32 || v.Kind() == reflect.Float64 { + f := v.Float() + var sval string + switch { + case math.IsInf(f, 1): + sval = `"Infinity"` + case math.IsInf(f, -1): + sval = `"-Infinity"` + case math.IsNaN(f): + sval = `"NaN"` + } + if sval != "" { + out.write(sval) + return out.err + } + } + + // Default handling defers to the encoding/json library. + b, err := json.Marshal(v.Interface()) + if err != nil { + return err + } + needToQuote := string(b[0]) != `"` && (v.Kind() == reflect.Int64 || v.Kind() == reflect.Uint64) + if needToQuote { + out.write(`"`) + } + out.write(string(b)) + if needToQuote { + out.write(`"`) + } + return out.err +} + +// Unmarshaler is a configurable object for converting from a JSON +// representation to a protocol buffer object. +type Unmarshaler struct { + // Whether to allow messages to contain unknown fields, as opposed to + // failing to unmarshal. + AllowUnknownFields bool + + // A custom URL resolver to use when unmarshaling Any messages from JSON. + // If unset, the default resolution strategy is to extract the + // fully-qualified type name from the type URL and pass that to + // proto.MessageType(string). + AnyResolver AnyResolver +} + +// UnmarshalNext unmarshals the next protocol buffer from a JSON object stream. +// This function is lenient and will decode any options permutations of the +// related Marshaler. +func (u *Unmarshaler) UnmarshalNext(dec *json.Decoder, pb proto.Message) error { + inputValue := json.RawMessage{} + if err := dec.Decode(&inputValue); err != nil { + return err + } + if err := u.unmarshalValue(reflect.ValueOf(pb).Elem(), inputValue, nil); err != nil { + return err + } + return checkRequiredFields(pb) +} + +// Unmarshal unmarshals a JSON object stream into a protocol +// buffer. This function is lenient and will decode any options +// permutations of the related Marshaler. +func (u *Unmarshaler) Unmarshal(r io.Reader, pb proto.Message) error { + dec := json.NewDecoder(r) + return u.UnmarshalNext(dec, pb) +} + +// UnmarshalNext unmarshals the next protocol buffer from a JSON object stream. +// This function is lenient and will decode any options permutations of the +// related Marshaler. +func UnmarshalNext(dec *json.Decoder, pb proto.Message) error { + return new(Unmarshaler).UnmarshalNext(dec, pb) +} + +// Unmarshal unmarshals a JSON object stream into a protocol +// buffer. This function is lenient and will decode any options +// permutations of the related Marshaler. +func Unmarshal(r io.Reader, pb proto.Message) error { + return new(Unmarshaler).Unmarshal(r, pb) +} + +// UnmarshalString will populate the fields of a protocol buffer based +// on a JSON string. This function is lenient and will decode any options +// permutations of the related Marshaler. +func UnmarshalString(str string, pb proto.Message) error { + return new(Unmarshaler).Unmarshal(strings.NewReader(str), pb) +} + +// unmarshalValue converts/copies a value into the target. +// prop may be nil. +func (u *Unmarshaler) unmarshalValue(target reflect.Value, inputValue json.RawMessage, prop *proto.Properties) error { + targetType := target.Type() + + // Allocate memory for pointer fields. + if targetType.Kind() == reflect.Ptr { + // If input value is "null" and target is a pointer type, then the field should be treated as not set + // UNLESS the target is structpb.Value, in which case it should be set to structpb.NullValue. + _, isJSONPBUnmarshaler := target.Interface().(JSONPBUnmarshaler) + if string(inputValue) == "null" && targetType != reflect.TypeOf(&stpb.Value{}) && !isJSONPBUnmarshaler { + return nil + } + target.Set(reflect.New(targetType.Elem())) + + return u.unmarshalValue(target.Elem(), inputValue, prop) + } + + if jsu, ok := target.Addr().Interface().(JSONPBUnmarshaler); ok { + return jsu.UnmarshalJSONPB(u, []byte(inputValue)) + } + + // Handle well-known types that are not pointers. + if w, ok := target.Addr().Interface().(wkt); ok { + switch w.XXX_WellKnownType() { + case "DoubleValue", "FloatValue", "Int64Value", "UInt64Value", + "Int32Value", "UInt32Value", "BoolValue", "StringValue", "BytesValue": + return u.unmarshalValue(target.Field(0), inputValue, prop) + case "Any": + // Use json.RawMessage pointer type instead of value to support pre-1.8 version. + // 1.8 changed RawMessage.MarshalJSON from pointer type to value type, see + // https://github.com/golang/go/issues/14493 + var jsonFields map[string]*json.RawMessage + if err := json.Unmarshal(inputValue, &jsonFields); err != nil { + return err + } + + val, ok := jsonFields["@type"] + if !ok || val == nil { + return errors.New("Any JSON doesn't have '@type'") + } + + var turl string + if err := json.Unmarshal([]byte(*val), &turl); err != nil { + return fmt.Errorf("can't unmarshal Any's '@type': %q", *val) + } + target.Field(0).SetString(turl) + + var m proto.Message + var err error + if u.AnyResolver != nil { + m, err = u.AnyResolver.Resolve(turl) + } else { + m, err = defaultResolveAny(turl) + } + if err != nil { + return err + } + + if _, ok := m.(wkt); ok { + val, ok := jsonFields["value"] + if !ok { + return errors.New("Any JSON doesn't have 'value'") + } + + if err := u.unmarshalValue(reflect.ValueOf(m).Elem(), *val, nil); err != nil { + return fmt.Errorf("can't unmarshal Any nested proto %T: %v", m, err) + } + } else { + delete(jsonFields, "@type") + nestedProto, err := json.Marshal(jsonFields) + if err != nil { + return fmt.Errorf("can't generate JSON for Any's nested proto to be unmarshaled: %v", err) + } + + if err = u.unmarshalValue(reflect.ValueOf(m).Elem(), nestedProto, nil); err != nil { + return fmt.Errorf("can't unmarshal Any nested proto %T: %v", m, err) + } + } + + b, err := proto.Marshal(m) + if err != nil { + return fmt.Errorf("can't marshal proto %T into Any.Value: %v", m, err) + } + target.Field(1).SetBytes(b) + + return nil + case "Duration": + unq, err := strconv.Unquote(string(inputValue)) + if err != nil { + return err + } + + d, err := time.ParseDuration(unq) + if err != nil { + return fmt.Errorf("bad Duration: %v", err) + } + + ns := d.Nanoseconds() + s := ns / 1e9 + ns %= 1e9 + target.Field(0).SetInt(s) + target.Field(1).SetInt(ns) + return nil + case "Timestamp": + unq, err := strconv.Unquote(string(inputValue)) + if err != nil { + return err + } + + t, err := time.Parse(time.RFC3339Nano, unq) + if err != nil { + return fmt.Errorf("bad Timestamp: %v", err) + } + + target.Field(0).SetInt(t.Unix()) + target.Field(1).SetInt(int64(t.Nanosecond())) + return nil + case "Struct": + var m map[string]json.RawMessage + if err := json.Unmarshal(inputValue, &m); err != nil { + return fmt.Errorf("bad StructValue: %v", err) + } + + target.Field(0).Set(reflect.ValueOf(map[string]*stpb.Value{})) + for k, jv := range m { + pv := &stpb.Value{} + if err := u.unmarshalValue(reflect.ValueOf(pv).Elem(), jv, prop); err != nil { + return fmt.Errorf("bad value in StructValue for key %q: %v", k, err) + } + target.Field(0).SetMapIndex(reflect.ValueOf(k), reflect.ValueOf(pv)) + } + return nil + case "ListValue": + var s []json.RawMessage + if err := json.Unmarshal(inputValue, &s); err != nil { + return fmt.Errorf("bad ListValue: %v", err) + } + + target.Field(0).Set(reflect.ValueOf(make([]*stpb.Value, len(s)))) + for i, sv := range s { + if err := u.unmarshalValue(target.Field(0).Index(i), sv, prop); err != nil { + return err + } + } + return nil + case "Value": + ivStr := string(inputValue) + if ivStr == "null" { + target.Field(0).Set(reflect.ValueOf(&stpb.Value_NullValue{})) + } else if v, err := strconv.ParseFloat(ivStr, 0); err == nil { + target.Field(0).Set(reflect.ValueOf(&stpb.Value_NumberValue{v})) + } else if v, err := strconv.Unquote(ivStr); err == nil { + target.Field(0).Set(reflect.ValueOf(&stpb.Value_StringValue{v})) + } else if v, err := strconv.ParseBool(ivStr); err == nil { + target.Field(0).Set(reflect.ValueOf(&stpb.Value_BoolValue{v})) + } else if err := json.Unmarshal(inputValue, &[]json.RawMessage{}); err == nil { + lv := &stpb.ListValue{} + target.Field(0).Set(reflect.ValueOf(&stpb.Value_ListValue{lv})) + return u.unmarshalValue(reflect.ValueOf(lv).Elem(), inputValue, prop) + } else if err := json.Unmarshal(inputValue, &map[string]json.RawMessage{}); err == nil { + sv := &stpb.Struct{} + target.Field(0).Set(reflect.ValueOf(&stpb.Value_StructValue{sv})) + return u.unmarshalValue(reflect.ValueOf(sv).Elem(), inputValue, prop) + } else { + return fmt.Errorf("unrecognized type for Value %q", ivStr) + } + return nil + } + } + + // Handle enums, which have an underlying type of int32, + // and may appear as strings. + // The case of an enum appearing as a number is handled + // at the bottom of this function. + if inputValue[0] == '"' && prop != nil && prop.Enum != "" { + vmap := proto.EnumValueMap(prop.Enum) + // Don't need to do unquoting; valid enum names + // are from a limited character set. + s := inputValue[1 : len(inputValue)-1] + n, ok := vmap[string(s)] + if !ok { + return fmt.Errorf("unknown value %q for enum %s", s, prop.Enum) + } + if target.Kind() == reflect.Ptr { // proto2 + target.Set(reflect.New(targetType.Elem())) + target = target.Elem() + } + target.SetInt(int64(n)) + return nil + } + + // Handle nested messages. + if targetType.Kind() == reflect.Struct { + var jsonFields map[string]json.RawMessage + if err := json.Unmarshal(inputValue, &jsonFields); err != nil { + return err + } + + consumeField := func(prop *proto.Properties) (json.RawMessage, bool) { + // Be liberal in what names we accept; both orig_name and camelName are okay. + fieldNames := acceptedJSONFieldNames(prop) + + vOrig, okOrig := jsonFields[fieldNames.orig] + vCamel, okCamel := jsonFields[fieldNames.camel] + if !okOrig && !okCamel { + return nil, false + } + // If, for some reason, both are present in the data, favour the camelName. + var raw json.RawMessage + if okOrig { + raw = vOrig + delete(jsonFields, fieldNames.orig) + } + if okCamel { + raw = vCamel + delete(jsonFields, fieldNames.camel) + } + return raw, true + } + + sprops := proto.GetProperties(targetType) + for i := 0; i < target.NumField(); i++ { + ft := target.Type().Field(i) + if strings.HasPrefix(ft.Name, "XXX_") { + continue + } + + valueForField, ok := consumeField(sprops.Prop[i]) + if !ok { + continue + } + + if err := u.unmarshalValue(target.Field(i), valueForField, sprops.Prop[i]); err != nil { + return err + } + } + // Check for any oneof fields. + if len(jsonFields) > 0 { + for _, oop := range sprops.OneofTypes { + raw, ok := consumeField(oop.Prop) + if !ok { + continue + } + nv := reflect.New(oop.Type.Elem()) + target.Field(oop.Field).Set(nv) + if err := u.unmarshalValue(nv.Elem().Field(0), raw, oop.Prop); err != nil { + return err + } + } + } + // Handle proto2 extensions. + if len(jsonFields) > 0 { + if ep, ok := target.Addr().Interface().(proto.Message); ok { + for _, ext := range proto.RegisteredExtensions(ep) { + name := fmt.Sprintf("[%s]", ext.Name) + raw, ok := jsonFields[name] + if !ok { + continue + } + delete(jsonFields, name) + nv := reflect.New(reflect.TypeOf(ext.ExtensionType).Elem()) + if err := u.unmarshalValue(nv.Elem(), raw, nil); err != nil { + return err + } + if err := proto.SetExtension(ep, ext, nv.Interface()); err != nil { + return err + } + } + } + } + if !u.AllowUnknownFields && len(jsonFields) > 0 { + // Pick any field to be the scapegoat. + var f string + for fname := range jsonFields { + f = fname + break + } + return fmt.Errorf("unknown field %q in %v", f, targetType) + } + return nil + } + + // Handle arrays (which aren't encoded bytes) + if targetType.Kind() == reflect.Slice && targetType.Elem().Kind() != reflect.Uint8 { + var slc []json.RawMessage + if err := json.Unmarshal(inputValue, &slc); err != nil { + return err + } + if slc != nil { + l := len(slc) + target.Set(reflect.MakeSlice(targetType, l, l)) + for i := 0; i < l; i++ { + if err := u.unmarshalValue(target.Index(i), slc[i], prop); err != nil { + return err + } + } + } + return nil + } + + // Handle maps (whose keys are always strings) + if targetType.Kind() == reflect.Map { + var mp map[string]json.RawMessage + if err := json.Unmarshal(inputValue, &mp); err != nil { + return err + } + if mp != nil { + target.Set(reflect.MakeMap(targetType)) + for ks, raw := range mp { + // Unmarshal map key. The core json library already decoded the key into a + // string, so we handle that specially. Other types were quoted post-serialization. + var k reflect.Value + if targetType.Key().Kind() == reflect.String { + k = reflect.ValueOf(ks) + } else { + k = reflect.New(targetType.Key()).Elem() + // TODO: pass the correct Properties if needed. + if err := u.unmarshalValue(k, json.RawMessage(ks), nil); err != nil { + return err + } + } + + // Unmarshal map value. + v := reflect.New(targetType.Elem()).Elem() + // TODO: pass the correct Properties if needed. + if err := u.unmarshalValue(v, raw, nil); err != nil { + return err + } + target.SetMapIndex(k, v) + } + } + return nil + } + + // 64-bit integers can be encoded as strings. In this case we drop + // the quotes and proceed as normal. + isNum := targetType.Kind() == reflect.Int64 || targetType.Kind() == reflect.Uint64 + if isNum && strings.HasPrefix(string(inputValue), `"`) { + inputValue = inputValue[1 : len(inputValue)-1] + } + + // Non-finite numbers can be encoded as strings. + isFloat := targetType.Kind() == reflect.Float32 || targetType.Kind() == reflect.Float64 + if isFloat { + if num, ok := nonFinite[string(inputValue)]; ok { + target.SetFloat(num) + return nil + } + } + + // Use the encoding/json for parsing other value types. + return json.Unmarshal(inputValue, target.Addr().Interface()) +} + +// jsonProperties returns parsed proto.Properties for the field and corrects JSONName attribute. +func jsonProperties(f reflect.StructField, origName bool) *proto.Properties { + var prop proto.Properties + prop.Init(f.Type, f.Name, f.Tag.Get("protobuf"), &f) + if origName || prop.JSONName == "" { + prop.JSONName = prop.OrigName + } + return &prop +} + +type fieldNames struct { + orig, camel string +} + +func acceptedJSONFieldNames(prop *proto.Properties) fieldNames { + opts := fieldNames{orig: prop.OrigName, camel: prop.OrigName} + if prop.JSONName != "" { + opts.camel = prop.JSONName + } + return opts +} + +// Writer wrapper inspired by https://blog.golang.org/errors-are-values +type errWriter struct { + writer io.Writer + err error +} + +func (w *errWriter) write(str string) { + if w.err != nil { + return + } + _, w.err = w.writer.Write([]byte(str)) +} + +// Map fields may have key types of non-float scalars, strings and enums. +// The easiest way to sort them in some deterministic order is to use fmt. +// If this turns out to be inefficient we can always consider other options, +// such as doing a Schwartzian transform. +// +// Numeric keys are sorted in numeric order per +// https://developers.google.com/protocol-buffers/docs/proto#maps. +type mapKeys []reflect.Value + +func (s mapKeys) Len() int { return len(s) } +func (s mapKeys) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s mapKeys) Less(i, j int) bool { + if k := s[i].Kind(); k == s[j].Kind() { + switch k { + case reflect.Int32, reflect.Int64: + return s[i].Int() < s[j].Int() + case reflect.Uint32, reflect.Uint64: + return s[i].Uint() < s[j].Uint() + } + } + return fmt.Sprint(s[i].Interface()) < fmt.Sprint(s[j].Interface()) +} + +// checkRequiredFields returns an error if any required field in the given proto message is not set. +// This function is used by both Marshal and Unmarshal. While required fields only exist in a +// proto2 message, a proto3 message can contain proto2 message(s). +func checkRequiredFields(pb proto.Message) error { + // Most well-known type messages do not contain required fields. The "Any" type may contain + // a message that has required fields. + // + // When an Any message is being marshaled, the code will invoked proto.Unmarshal on Any.Value + // field in order to transform that into JSON, and that should have returned an error if a + // required field is not set in the embedded message. + // + // When an Any message is being unmarshaled, the code will have invoked proto.Marshal on the + // embedded message to store the serialized message in Any.Value field, and that should have + // returned an error if a required field is not set. + if _, ok := pb.(wkt); ok { + return nil + } + + v := reflect.ValueOf(pb) + // Skip message if it is not a struct pointer. + if v.Kind() != reflect.Ptr { + return nil + } + v = v.Elem() + if v.Kind() != reflect.Struct { + return nil + } + + for i := 0; i < v.NumField(); i++ { + field := v.Field(i) + sfield := v.Type().Field(i) + + if sfield.PkgPath != "" { + // blank PkgPath means the field is exported; skip if not exported + continue + } + + if strings.HasPrefix(sfield.Name, "XXX_") { + continue + } + + // Oneof field is an interface implemented by wrapper structs containing the actual oneof + // field, i.e. an interface containing &T{real_value}. + if sfield.Tag.Get("protobuf_oneof") != "" { + if field.Kind() != reflect.Interface { + continue + } + v := field.Elem() + if v.Kind() != reflect.Ptr || v.IsNil() { + continue + } + v = v.Elem() + if v.Kind() != reflect.Struct || v.NumField() < 1 { + continue + } + field = v.Field(0) + sfield = v.Type().Field(0) + } + + protoTag := sfield.Tag.Get("protobuf") + if protoTag == "" { + continue + } + var prop proto.Properties + prop.Init(sfield.Type, sfield.Name, protoTag, &sfield) + + switch field.Kind() { + case reflect.Map: + if field.IsNil() { + continue + } + // Check each map value. + keys := field.MapKeys() + for _, k := range keys { + v := field.MapIndex(k) + if err := checkRequiredFieldsInValue(v); err != nil { + return err + } + } + case reflect.Slice: + // Handle non-repeated type, e.g. bytes. + if !prop.Repeated { + if prop.Required && field.IsNil() { + return fmt.Errorf("required field %q is not set", prop.Name) + } + continue + } + + // Handle repeated type. + if field.IsNil() { + continue + } + // Check each slice item. + for i := 0; i < field.Len(); i++ { + v := field.Index(i) + if err := checkRequiredFieldsInValue(v); err != nil { + return err + } + } + case reflect.Ptr: + if field.IsNil() { + if prop.Required { + return fmt.Errorf("required field %q is not set", prop.Name) + } + continue + } + if err := checkRequiredFieldsInValue(field); err != nil { + return err + } + } + } + + // Handle proto2 extensions. + for _, ext := range proto.RegisteredExtensions(pb) { + if !proto.HasExtension(pb, ext) { + continue + } + ep, err := proto.GetExtension(pb, ext) + if err != nil { + return err + } + err = checkRequiredFieldsInValue(reflect.ValueOf(ep)) + if err != nil { + return err + } + } + + return nil +} + +func checkRequiredFieldsInValue(v reflect.Value) error { + if pm, ok := v.Interface().(proto.Message); ok { + return checkRequiredFields(pm) + } + return nil +} diff --git a/api/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test.go b/api/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test.go new file mode 100644 index 0000000..c9934d9 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test.go @@ -0,0 +1,1150 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2015 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package jsonpb + +import ( + "bytes" + "encoding/json" + "io" + "math" + "reflect" + "strings" + "testing" + + "github.com/golang/protobuf/proto" + + pb "github.com/golang/protobuf/jsonpb/jsonpb_test_proto" + proto3pb "github.com/golang/protobuf/proto/proto3_proto" + "github.com/golang/protobuf/ptypes" + anypb "github.com/golang/protobuf/ptypes/any" + durpb "github.com/golang/protobuf/ptypes/duration" + stpb "github.com/golang/protobuf/ptypes/struct" + tspb "github.com/golang/protobuf/ptypes/timestamp" + wpb "github.com/golang/protobuf/ptypes/wrappers" +) + +var ( + marshaler = Marshaler{} + + marshalerAllOptions = Marshaler{ + Indent: " ", + } + + simpleObject = &pb.Simple{ + OInt32: proto.Int32(-32), + OInt64: proto.Int64(-6400000000), + OUint32: proto.Uint32(32), + OUint64: proto.Uint64(6400000000), + OSint32: proto.Int32(-13), + OSint64: proto.Int64(-2600000000), + OFloat: proto.Float32(3.14), + ODouble: proto.Float64(6.02214179e23), + OBool: proto.Bool(true), + OString: proto.String("hello \"there\""), + OBytes: []byte("beep boop"), + } + + simpleObjectJSON = `{` + + `"oBool":true,` + + `"oInt32":-32,` + + `"oInt64":"-6400000000",` + + `"oUint32":32,` + + `"oUint64":"6400000000",` + + `"oSint32":-13,` + + `"oSint64":"-2600000000",` + + `"oFloat":3.14,` + + `"oDouble":6.02214179e+23,` + + `"oString":"hello \"there\"",` + + `"oBytes":"YmVlcCBib29w"` + + `}` + + simpleObjectPrettyJSON = `{ + "oBool": true, + "oInt32": -32, + "oInt64": "-6400000000", + "oUint32": 32, + "oUint64": "6400000000", + "oSint32": -13, + "oSint64": "-2600000000", + "oFloat": 3.14, + "oDouble": 6.02214179e+23, + "oString": "hello \"there\"", + "oBytes": "YmVlcCBib29w" +}` + + repeatsObject = &pb.Repeats{ + RBool: []bool{true, false, true}, + RInt32: []int32{-3, -4, -5}, + RInt64: []int64{-123456789, -987654321}, + RUint32: []uint32{1, 2, 3}, + RUint64: []uint64{6789012345, 3456789012}, + RSint32: []int32{-1, -2, -3}, + RSint64: []int64{-6789012345, -3456789012}, + RFloat: []float32{3.14, 6.28}, + RDouble: []float64{299792458 * 1e20, 6.62606957e-34}, + RString: []string{"happy", "days"}, + RBytes: [][]byte{[]byte("skittles"), []byte("m&m's")}, + } + + repeatsObjectJSON = `{` + + `"rBool":[true,false,true],` + + `"rInt32":[-3,-4,-5],` + + `"rInt64":["-123456789","-987654321"],` + + `"rUint32":[1,2,3],` + + `"rUint64":["6789012345","3456789012"],` + + `"rSint32":[-1,-2,-3],` + + `"rSint64":["-6789012345","-3456789012"],` + + `"rFloat":[3.14,6.28],` + + `"rDouble":[2.99792458e+28,6.62606957e-34],` + + `"rString":["happy","days"],` + + `"rBytes":["c2tpdHRsZXM=","bSZtJ3M="]` + + `}` + + repeatsObjectPrettyJSON = `{ + "rBool": [ + true, + false, + true + ], + "rInt32": [ + -3, + -4, + -5 + ], + "rInt64": [ + "-123456789", + "-987654321" + ], + "rUint32": [ + 1, + 2, + 3 + ], + "rUint64": [ + "6789012345", + "3456789012" + ], + "rSint32": [ + -1, + -2, + -3 + ], + "rSint64": [ + "-6789012345", + "-3456789012" + ], + "rFloat": [ + 3.14, + 6.28 + ], + "rDouble": [ + 2.99792458e+28, + 6.62606957e-34 + ], + "rString": [ + "happy", + "days" + ], + "rBytes": [ + "c2tpdHRsZXM=", + "bSZtJ3M=" + ] +}` + + innerSimple = &pb.Simple{OInt32: proto.Int32(-32)} + innerSimple2 = &pb.Simple{OInt64: proto.Int64(25)} + innerRepeats = &pb.Repeats{RString: []string{"roses", "red"}} + innerRepeats2 = &pb.Repeats{RString: []string{"violets", "blue"}} + complexObject = &pb.Widget{ + Color: pb.Widget_GREEN.Enum(), + RColor: []pb.Widget_Color{pb.Widget_RED, pb.Widget_GREEN, pb.Widget_BLUE}, + Simple: innerSimple, + RSimple: []*pb.Simple{innerSimple, innerSimple2}, + Repeats: innerRepeats, + RRepeats: []*pb.Repeats{innerRepeats, innerRepeats2}, + } + + complexObjectJSON = `{"color":"GREEN",` + + `"rColor":["RED","GREEN","BLUE"],` + + `"simple":{"oInt32":-32},` + + `"rSimple":[{"oInt32":-32},{"oInt64":"25"}],` + + `"repeats":{"rString":["roses","red"]},` + + `"rRepeats":[{"rString":["roses","red"]},{"rString":["violets","blue"]}]` + + `}` + + complexObjectPrettyJSON = `{ + "color": "GREEN", + "rColor": [ + "RED", + "GREEN", + "BLUE" + ], + "simple": { + "oInt32": -32 + }, + "rSimple": [ + { + "oInt32": -32 + }, + { + "oInt64": "25" + } + ], + "repeats": { + "rString": [ + "roses", + "red" + ] + }, + "rRepeats": [ + { + "rString": [ + "roses", + "red" + ] + }, + { + "rString": [ + "violets", + "blue" + ] + } + ] +}` + + colorPrettyJSON = `{ + "color": 2 +}` + + colorListPrettyJSON = `{ + "color": 1000, + "rColor": [ + "RED" + ] +}` + + nummyPrettyJSON = `{ + "nummy": { + "1": 2, + "3": 4 + } +}` + + objjyPrettyJSON = `{ + "objjy": { + "1": { + "dub": 1 + } + } +}` + realNumber = &pb.Real{Value: proto.Float64(3.14159265359)} + realNumberName = "Pi" + complexNumber = &pb.Complex{Imaginary: proto.Float64(0.5772156649)} + realNumberJSON = `{` + + `"value":3.14159265359,` + + `"[jsonpb.Complex.real_extension]":{"imaginary":0.5772156649},` + + `"[jsonpb.name]":"Pi"` + + `}` + + anySimple = &pb.KnownTypes{ + An: &anypb.Any{ + TypeUrl: "something.example.com/jsonpb.Simple", + Value: []byte{ + // &pb.Simple{OBool:true} + 1 << 3, 1, + }, + }, + } + anySimpleJSON = `{"an":{"@type":"something.example.com/jsonpb.Simple","oBool":true}}` + anySimplePrettyJSON = `{ + "an": { + "@type": "something.example.com/jsonpb.Simple", + "oBool": true + } +}` + + anyWellKnown = &pb.KnownTypes{ + An: &anypb.Any{ + TypeUrl: "type.googleapis.com/google.protobuf.Duration", + Value: []byte{ + // &durpb.Duration{Seconds: 1, Nanos: 212000000 } + 1 << 3, 1, // seconds + 2 << 3, 0x80, 0xba, 0x8b, 0x65, // nanos + }, + }, + } + anyWellKnownJSON = `{"an":{"@type":"type.googleapis.com/google.protobuf.Duration","value":"1.212s"}}` + anyWellKnownPrettyJSON = `{ + "an": { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } +}` + + nonFinites = &pb.NonFinites{ + FNan: proto.Float32(float32(math.NaN())), + FPinf: proto.Float32(float32(math.Inf(1))), + FNinf: proto.Float32(float32(math.Inf(-1))), + DNan: proto.Float64(float64(math.NaN())), + DPinf: proto.Float64(float64(math.Inf(1))), + DNinf: proto.Float64(float64(math.Inf(-1))), + } + nonFinitesJSON = `{` + + `"fNan":"NaN",` + + `"fPinf":"Infinity",` + + `"fNinf":"-Infinity",` + + `"dNan":"NaN",` + + `"dPinf":"Infinity",` + + `"dNinf":"-Infinity"` + + `}` +) + +func init() { + if err := proto.SetExtension(realNumber, pb.E_Name, &realNumberName); err != nil { + panic(err) + } + if err := proto.SetExtension(realNumber, pb.E_Complex_RealExtension, complexNumber); err != nil { + panic(err) + } +} + +var marshalingTests = []struct { + desc string + marshaler Marshaler + pb proto.Message + json string +}{ + {"simple flat object", marshaler, simpleObject, simpleObjectJSON}, + {"simple pretty object", marshalerAllOptions, simpleObject, simpleObjectPrettyJSON}, + {"non-finite floats fields object", marshaler, nonFinites, nonFinitesJSON}, + {"repeated fields flat object", marshaler, repeatsObject, repeatsObjectJSON}, + {"repeated fields pretty object", marshalerAllOptions, repeatsObject, repeatsObjectPrettyJSON}, + {"nested message/enum flat object", marshaler, complexObject, complexObjectJSON}, + {"nested message/enum pretty object", marshalerAllOptions, complexObject, complexObjectPrettyJSON}, + {"enum-string flat object", Marshaler{}, + &pb.Widget{Color: pb.Widget_BLUE.Enum()}, `{"color":"BLUE"}`}, + {"enum-value pretty object", Marshaler{EnumsAsInts: true, Indent: " "}, + &pb.Widget{Color: pb.Widget_BLUE.Enum()}, colorPrettyJSON}, + {"unknown enum value object", marshalerAllOptions, + &pb.Widget{Color: pb.Widget_Color(1000).Enum(), RColor: []pb.Widget_Color{pb.Widget_RED}}, colorListPrettyJSON}, + {"repeated proto3 enum", Marshaler{}, + &proto3pb.Message{RFunny: []proto3pb.Message_Humour{ + proto3pb.Message_PUNS, + proto3pb.Message_SLAPSTICK, + }}, + `{"rFunny":["PUNS","SLAPSTICK"]}`}, + {"repeated proto3 enum as int", Marshaler{EnumsAsInts: true}, + &proto3pb.Message{RFunny: []proto3pb.Message_Humour{ + proto3pb.Message_PUNS, + proto3pb.Message_SLAPSTICK, + }}, + `{"rFunny":[1,2]}`}, + {"empty value", marshaler, &pb.Simple3{}, `{}`}, + {"empty value emitted", Marshaler{EmitDefaults: true}, &pb.Simple3{}, `{"dub":0}`}, + {"empty repeated emitted", Marshaler{EmitDefaults: true}, &pb.SimpleSlice3{}, `{"slices":[]}`}, + {"empty map emitted", Marshaler{EmitDefaults: true}, &pb.SimpleMap3{}, `{"stringy":{}}`}, + {"nested struct null", Marshaler{EmitDefaults: true}, &pb.SimpleNull3{}, `{"simple":null}`}, + {"map", marshaler, &pb.Mappy{Nummy: map[int64]int32{1: 2, 3: 4}}, `{"nummy":{"1":2,"3":4}}`}, + {"map", marshalerAllOptions, &pb.Mappy{Nummy: map[int64]int32{1: 2, 3: 4}}, nummyPrettyJSON}, + {"map", marshaler, + &pb.Mappy{Strry: map[string]string{`"one"`: "two", "three": "four"}}, + `{"strry":{"\"one\"":"two","three":"four"}}`}, + {"map", marshaler, + &pb.Mappy{Objjy: map[int32]*pb.Simple3{1: {Dub: 1}}}, `{"objjy":{"1":{"dub":1}}}`}, + {"map", marshalerAllOptions, + &pb.Mappy{Objjy: map[int32]*pb.Simple3{1: {Dub: 1}}}, objjyPrettyJSON}, + {"map", marshaler, &pb.Mappy{Buggy: map[int64]string{1234: "yup"}}, + `{"buggy":{"1234":"yup"}}`}, + {"map", marshaler, &pb.Mappy{Booly: map[bool]bool{false: true}}, `{"booly":{"false":true}}`}, + // TODO: This is broken. + //{"map", marshaler, &pb.Mappy{Enumy: map[string]pb.Numeral{"XIV": pb.Numeral_ROMAN}}, `{"enumy":{"XIV":"ROMAN"}`}, + {"map", Marshaler{EnumsAsInts: true}, &pb.Mappy{Enumy: map[string]pb.Numeral{"XIV": pb.Numeral_ROMAN}}, `{"enumy":{"XIV":2}}`}, + {"map", marshaler, &pb.Mappy{S32Booly: map[int32]bool{1: true, 3: false, 10: true, 12: false}}, `{"s32booly":{"1":true,"3":false,"10":true,"12":false}}`}, + {"map", marshaler, &pb.Mappy{S64Booly: map[int64]bool{1: true, 3: false, 10: true, 12: false}}, `{"s64booly":{"1":true,"3":false,"10":true,"12":false}}`}, + {"map", marshaler, &pb.Mappy{U32Booly: map[uint32]bool{1: true, 3: false, 10: true, 12: false}}, `{"u32booly":{"1":true,"3":false,"10":true,"12":false}}`}, + {"map", marshaler, &pb.Mappy{U64Booly: map[uint64]bool{1: true, 3: false, 10: true, 12: false}}, `{"u64booly":{"1":true,"3":false,"10":true,"12":false}}`}, + {"proto2 map", marshaler, &pb.Maps{MInt64Str: map[int64]string{213: "cat"}}, + `{"mInt64Str":{"213":"cat"}}`}, + {"proto2 map", marshaler, + &pb.Maps{MBoolSimple: map[bool]*pb.Simple{true: {OInt32: proto.Int32(1)}}}, + `{"mBoolSimple":{"true":{"oInt32":1}}}`}, + {"oneof, not set", marshaler, &pb.MsgWithOneof{}, `{}`}, + {"oneof, set", marshaler, &pb.MsgWithOneof{Union: &pb.MsgWithOneof_Title{"Grand Poobah"}}, `{"title":"Grand Poobah"}`}, + {"force orig_name", Marshaler{OrigName: true}, &pb.Simple{OInt32: proto.Int32(4)}, + `{"o_int32":4}`}, + {"proto2 extension", marshaler, realNumber, realNumberJSON}, + {"Any with message", marshaler, anySimple, anySimpleJSON}, + {"Any with message and indent", marshalerAllOptions, anySimple, anySimplePrettyJSON}, + {"Any with WKT", marshaler, anyWellKnown, anyWellKnownJSON}, + {"Any with WKT and indent", marshalerAllOptions, anyWellKnown, anyWellKnownPrettyJSON}, + {"Duration", marshaler, &pb.KnownTypes{Dur: &durpb.Duration{Seconds: 3}}, `{"dur":"3s"}`}, + {"Duration", marshaler, &pb.KnownTypes{Dur: &durpb.Duration{Seconds: 3, Nanos: 1e6}}, `{"dur":"3.001s"}`}, + {"Duration beyond float64 precision", marshaler, &pb.KnownTypes{Dur: &durpb.Duration{Seconds: 100000000, Nanos: 1}}, `{"dur":"100000000.000000001s"}`}, + {"negative Duration", marshaler, &pb.KnownTypes{Dur: &durpb.Duration{Seconds: -123, Nanos: -456}}, `{"dur":"-123.000000456s"}`}, + {"Struct", marshaler, &pb.KnownTypes{St: &stpb.Struct{ + Fields: map[string]*stpb.Value{ + "one": {Kind: &stpb.Value_StringValue{"loneliest number"}}, + "two": {Kind: &stpb.Value_NullValue{stpb.NullValue_NULL_VALUE}}, + }, + }}, `{"st":{"one":"loneliest number","two":null}}`}, + {"empty ListValue", marshaler, &pb.KnownTypes{Lv: &stpb.ListValue{}}, `{"lv":[]}`}, + {"basic ListValue", marshaler, &pb.KnownTypes{Lv: &stpb.ListValue{Values: []*stpb.Value{ + {Kind: &stpb.Value_StringValue{"x"}}, + {Kind: &stpb.Value_NullValue{}}, + {Kind: &stpb.Value_NumberValue{3}}, + {Kind: &stpb.Value_BoolValue{true}}, + }}}, `{"lv":["x",null,3,true]}`}, + {"Timestamp", marshaler, &pb.KnownTypes{Ts: &tspb.Timestamp{Seconds: 14e8, Nanos: 21e6}}, `{"ts":"2014-05-13T16:53:20.021Z"}`}, + {"Timestamp", marshaler, &pb.KnownTypes{Ts: &tspb.Timestamp{Seconds: 14e8, Nanos: 0}}, `{"ts":"2014-05-13T16:53:20Z"}`}, + {"number Value", marshaler, &pb.KnownTypes{Val: &stpb.Value{Kind: &stpb.Value_NumberValue{1}}}, `{"val":1}`}, + {"null Value", marshaler, &pb.KnownTypes{Val: &stpb.Value{Kind: &stpb.Value_NullValue{stpb.NullValue_NULL_VALUE}}}, `{"val":null}`}, + {"string number value", marshaler, &pb.KnownTypes{Val: &stpb.Value{Kind: &stpb.Value_StringValue{"9223372036854775807"}}}, `{"val":"9223372036854775807"}`}, + {"list of lists Value", marshaler, &pb.KnownTypes{Val: &stpb.Value{ + Kind: &stpb.Value_ListValue{&stpb.ListValue{ + Values: []*stpb.Value{ + {Kind: &stpb.Value_StringValue{"x"}}, + {Kind: &stpb.Value_ListValue{&stpb.ListValue{ + Values: []*stpb.Value{ + {Kind: &stpb.Value_ListValue{&stpb.ListValue{ + Values: []*stpb.Value{{Kind: &stpb.Value_StringValue{"y"}}}, + }}}, + {Kind: &stpb.Value_StringValue{"z"}}, + }, + }}}, + }, + }}, + }}, `{"val":["x",[["y"],"z"]]}`}, + + {"DoubleValue", marshaler, &pb.KnownTypes{Dbl: &wpb.DoubleValue{Value: 1.2}}, `{"dbl":1.2}`}, + {"FloatValue", marshaler, &pb.KnownTypes{Flt: &wpb.FloatValue{Value: 1.2}}, `{"flt":1.2}`}, + {"Int64Value", marshaler, &pb.KnownTypes{I64: &wpb.Int64Value{Value: -3}}, `{"i64":"-3"}`}, + {"UInt64Value", marshaler, &pb.KnownTypes{U64: &wpb.UInt64Value{Value: 3}}, `{"u64":"3"}`}, + {"Int32Value", marshaler, &pb.KnownTypes{I32: &wpb.Int32Value{Value: -4}}, `{"i32":-4}`}, + {"UInt32Value", marshaler, &pb.KnownTypes{U32: &wpb.UInt32Value{Value: 4}}, `{"u32":4}`}, + {"BoolValue", marshaler, &pb.KnownTypes{Bool: &wpb.BoolValue{Value: true}}, `{"bool":true}`}, + {"StringValue", marshaler, &pb.KnownTypes{Str: &wpb.StringValue{Value: "plush"}}, `{"str":"plush"}`}, + {"BytesValue", marshaler, &pb.KnownTypes{Bytes: &wpb.BytesValue{Value: []byte("wow")}}, `{"bytes":"d293"}`}, + + {"required", marshaler, &pb.MsgWithRequired{Str: proto.String("hello")}, `{"str":"hello"}`}, + {"required bytes", marshaler, &pb.MsgWithRequiredBytes{Byts: []byte{}}, `{"byts":""}`}, +} + +func TestMarshaling(t *testing.T) { + for _, tt := range marshalingTests { + json, err := tt.marshaler.MarshalToString(tt.pb) + if err != nil { + t.Errorf("%s: marshaling error: %v", tt.desc, err) + } else if tt.json != json { + t.Errorf("%s: got [%v] want [%v]", tt.desc, json, tt.json) + } + } +} + +func TestMarshalingNil(t *testing.T) { + var msg *pb.Simple + m := &Marshaler{} + if _, err := m.MarshalToString(msg); err == nil { + t.Errorf("mashaling nil returned no error") + } +} + +func TestMarshalIllegalTime(t *testing.T) { + tests := []struct { + pb proto.Message + fail bool + }{ + {&pb.KnownTypes{Dur: &durpb.Duration{Seconds: 1, Nanos: 0}}, false}, + {&pb.KnownTypes{Dur: &durpb.Duration{Seconds: -1, Nanos: 0}}, false}, + {&pb.KnownTypes{Dur: &durpb.Duration{Seconds: 1, Nanos: -1}}, true}, + {&pb.KnownTypes{Dur: &durpb.Duration{Seconds: -1, Nanos: 1}}, true}, + {&pb.KnownTypes{Dur: &durpb.Duration{Seconds: 1, Nanos: 1000000000}}, true}, + {&pb.KnownTypes{Dur: &durpb.Duration{Seconds: -1, Nanos: -1000000000}}, true}, + {&pb.KnownTypes{Ts: &tspb.Timestamp{Seconds: 1, Nanos: 1}}, false}, + {&pb.KnownTypes{Ts: &tspb.Timestamp{Seconds: 1, Nanos: -1}}, true}, + {&pb.KnownTypes{Ts: &tspb.Timestamp{Seconds: 1, Nanos: 1000000000}}, true}, + } + for _, tt := range tests { + _, err := marshaler.MarshalToString(tt.pb) + if err == nil && tt.fail { + t.Errorf("marshaler.MarshalToString(%v) = _, ; want _, ", tt.pb) + } + if err != nil && !tt.fail { + t.Errorf("marshaler.MarshalToString(%v) = _, %v; want _, ", tt.pb, err) + } + } +} + +func TestMarshalJSONPBMarshaler(t *testing.T) { + rawJson := `{ "foo": "bar", "baz": [0, 1, 2, 3] }` + msg := dynamicMessage{rawJson: rawJson} + str, err := new(Marshaler).MarshalToString(&msg) + if err != nil { + t.Errorf("an unexpected error occurred when marshalling JSONPBMarshaler: %v", err) + } + if str != rawJson { + t.Errorf("marshalling JSON produced incorrect output: got %s, wanted %s", str, rawJson) + } +} + +func TestMarshalAnyJSONPBMarshaler(t *testing.T) { + msg := dynamicMessage{rawJson: `{ "foo": "bar", "baz": [0, 1, 2, 3] }`} + a, err := ptypes.MarshalAny(&msg) + if err != nil { + t.Errorf("an unexpected error occurred when marshalling to Any: %v", err) + } + str, err := new(Marshaler).MarshalToString(a) + if err != nil { + t.Errorf("an unexpected error occurred when marshalling Any to JSON: %v", err) + } + // after custom marshaling, it's round-tripped through JSON decoding/encoding already, + // so the keys are sorted, whitespace is compacted, and "@type" key has been added + expected := `{"@type":"type.googleapis.com/` + dynamicMessageName + `","baz":[0,1,2,3],"foo":"bar"}` + if str != expected { + t.Errorf("marshalling JSON produced incorrect output: got %s, wanted %s", str, expected) + } +} + +func TestMarshalWithCustomValidation(t *testing.T) { + msg := dynamicMessage{rawJson: `{ "foo": "bar", "baz": [0, 1, 2, 3] }`, dummy: &dynamicMessage{}} + + js, err := new(Marshaler).MarshalToString(&msg) + if err != nil { + t.Errorf("an unexpected error occurred when marshalling to json: %v", err) + } + err = Unmarshal(strings.NewReader(js), &msg) + if err != nil { + t.Errorf("an unexpected error occurred when unmarshalling from json: %v", err) + } +} + +// Test marshaling message containing unset required fields should produce error. +func TestMarshalUnsetRequiredFields(t *testing.T) { + msgExt := &pb.Real{} + proto.SetExtension(msgExt, pb.E_Extm, &pb.MsgWithRequired{}) + + tests := []struct { + desc string + marshaler *Marshaler + pb proto.Message + }{ + { + desc: "direct required field", + marshaler: &Marshaler{}, + pb: &pb.MsgWithRequired{}, + }, + { + desc: "direct required field + emit defaults", + marshaler: &Marshaler{EmitDefaults: true}, + pb: &pb.MsgWithRequired{}, + }, + { + desc: "indirect required field", + marshaler: &Marshaler{}, + pb: &pb.MsgWithIndirectRequired{Subm: &pb.MsgWithRequired{}}, + }, + { + desc: "indirect required field + emit defaults", + marshaler: &Marshaler{EmitDefaults: true}, + pb: &pb.MsgWithIndirectRequired{Subm: &pb.MsgWithRequired{}}, + }, + { + desc: "direct required wkt field", + marshaler: &Marshaler{}, + pb: &pb.MsgWithRequiredWKT{}, + }, + { + desc: "direct required wkt field + emit defaults", + marshaler: &Marshaler{EmitDefaults: true}, + pb: &pb.MsgWithRequiredWKT{}, + }, + { + desc: "direct required bytes field", + marshaler: &Marshaler{}, + pb: &pb.MsgWithRequiredBytes{}, + }, + { + desc: "required in map value", + marshaler: &Marshaler{}, + pb: &pb.MsgWithIndirectRequired{ + MapField: map[string]*pb.MsgWithRequired{ + "key": {}, + }, + }, + }, + { + desc: "required in repeated item", + marshaler: &Marshaler{}, + pb: &pb.MsgWithIndirectRequired{ + SliceField: []*pb.MsgWithRequired{ + {Str: proto.String("hello")}, + {}, + }, + }, + }, + { + desc: "required inside oneof", + marshaler: &Marshaler{}, + pb: &pb.MsgWithOneof{ + Union: &pb.MsgWithOneof_MsgWithRequired{&pb.MsgWithRequired{}}, + }, + }, + { + desc: "required inside extension", + marshaler: &Marshaler{}, + pb: msgExt, + }, + } + + for _, tc := range tests { + if _, err := tc.marshaler.MarshalToString(tc.pb); err == nil { + t.Errorf("%s: expecting error in marshaling with unset required fields %+v", tc.desc, tc.pb) + } + } +} + +var unmarshalingTests = []struct { + desc string + unmarshaler Unmarshaler + json string + pb proto.Message +}{ + {"simple flat object", Unmarshaler{}, simpleObjectJSON, simpleObject}, + {"simple pretty object", Unmarshaler{}, simpleObjectPrettyJSON, simpleObject}, + {"repeated fields flat object", Unmarshaler{}, repeatsObjectJSON, repeatsObject}, + {"repeated fields pretty object", Unmarshaler{}, repeatsObjectPrettyJSON, repeatsObject}, + {"nested message/enum flat object", Unmarshaler{}, complexObjectJSON, complexObject}, + {"nested message/enum pretty object", Unmarshaler{}, complexObjectPrettyJSON, complexObject}, + {"enum-string object", Unmarshaler{}, `{"color":"BLUE"}`, &pb.Widget{Color: pb.Widget_BLUE.Enum()}}, + {"enum-value object", Unmarshaler{}, "{\n \"color\": 2\n}", &pb.Widget{Color: pb.Widget_BLUE.Enum()}}, + {"unknown field with allowed option", Unmarshaler{AllowUnknownFields: true}, `{"unknown": "foo"}`, new(pb.Simple)}, + {"proto3 enum string", Unmarshaler{}, `{"hilarity":"PUNS"}`, &proto3pb.Message{Hilarity: proto3pb.Message_PUNS}}, + {"proto3 enum value", Unmarshaler{}, `{"hilarity":1}`, &proto3pb.Message{Hilarity: proto3pb.Message_PUNS}}, + {"unknown enum value object", + Unmarshaler{}, + "{\n \"color\": 1000,\n \"r_color\": [\n \"RED\"\n ]\n}", + &pb.Widget{Color: pb.Widget_Color(1000).Enum(), RColor: []pb.Widget_Color{pb.Widget_RED}}}, + {"repeated proto3 enum", Unmarshaler{}, `{"rFunny":["PUNS","SLAPSTICK"]}`, + &proto3pb.Message{RFunny: []proto3pb.Message_Humour{ + proto3pb.Message_PUNS, + proto3pb.Message_SLAPSTICK, + }}}, + {"repeated proto3 enum as int", Unmarshaler{}, `{"rFunny":[1,2]}`, + &proto3pb.Message{RFunny: []proto3pb.Message_Humour{ + proto3pb.Message_PUNS, + proto3pb.Message_SLAPSTICK, + }}}, + {"repeated proto3 enum as mix of strings and ints", Unmarshaler{}, `{"rFunny":["PUNS",2]}`, + &proto3pb.Message{RFunny: []proto3pb.Message_Humour{ + proto3pb.Message_PUNS, + proto3pb.Message_SLAPSTICK, + }}}, + {"unquoted int64 object", Unmarshaler{}, `{"oInt64":-314}`, &pb.Simple{OInt64: proto.Int64(-314)}}, + {"unquoted uint64 object", Unmarshaler{}, `{"oUint64":123}`, &pb.Simple{OUint64: proto.Uint64(123)}}, + {"NaN", Unmarshaler{}, `{"oDouble":"NaN"}`, &pb.Simple{ODouble: proto.Float64(math.NaN())}}, + {"Inf", Unmarshaler{}, `{"oFloat":"Infinity"}`, &pb.Simple{OFloat: proto.Float32(float32(math.Inf(1)))}}, + {"-Inf", Unmarshaler{}, `{"oDouble":"-Infinity"}`, &pb.Simple{ODouble: proto.Float64(math.Inf(-1))}}, + {"map", Unmarshaler{}, `{"nummy":{"1":2,"3":4}}`, &pb.Mappy{Nummy: map[int64]int32{1: 2, 3: 4}}}, + {"map", Unmarshaler{}, `{"strry":{"\"one\"":"two","three":"four"}}`, &pb.Mappy{Strry: map[string]string{`"one"`: "two", "three": "four"}}}, + {"map", Unmarshaler{}, `{"objjy":{"1":{"dub":1}}}`, &pb.Mappy{Objjy: map[int32]*pb.Simple3{1: {Dub: 1}}}}, + {"proto2 extension", Unmarshaler{}, realNumberJSON, realNumber}, + {"Any with message", Unmarshaler{}, anySimpleJSON, anySimple}, + {"Any with message and indent", Unmarshaler{}, anySimplePrettyJSON, anySimple}, + {"Any with WKT", Unmarshaler{}, anyWellKnownJSON, anyWellKnown}, + {"Any with WKT and indent", Unmarshaler{}, anyWellKnownPrettyJSON, anyWellKnown}, + // TODO: This is broken. + //{"map", Unmarshaler{}, `{"enumy":{"XIV":"ROMAN"}`, &pb.Mappy{Enumy: map[string]pb.Numeral{"XIV": pb.Numeral_ROMAN}}}, + {"map", Unmarshaler{}, `{"enumy":{"XIV":2}}`, &pb.Mappy{Enumy: map[string]pb.Numeral{"XIV": pb.Numeral_ROMAN}}}, + {"oneof", Unmarshaler{}, `{"salary":31000}`, &pb.MsgWithOneof{Union: &pb.MsgWithOneof_Salary{31000}}}, + {"oneof spec name", Unmarshaler{}, `{"Country":"Australia"}`, &pb.MsgWithOneof{Union: &pb.MsgWithOneof_Country{"Australia"}}}, + {"oneof orig_name", Unmarshaler{}, `{"Country":"Australia"}`, &pb.MsgWithOneof{Union: &pb.MsgWithOneof_Country{"Australia"}}}, + {"oneof spec name2", Unmarshaler{}, `{"homeAddress":"Australia"}`, &pb.MsgWithOneof{Union: &pb.MsgWithOneof_HomeAddress{"Australia"}}}, + {"oneof orig_name2", Unmarshaler{}, `{"home_address":"Australia"}`, &pb.MsgWithOneof{Union: &pb.MsgWithOneof_HomeAddress{"Australia"}}}, + {"orig_name input", Unmarshaler{}, `{"o_bool":true}`, &pb.Simple{OBool: proto.Bool(true)}}, + {"camelName input", Unmarshaler{}, `{"oBool":true}`, &pb.Simple{OBool: proto.Bool(true)}}, + + {"Duration", Unmarshaler{}, `{"dur":"3.000s"}`, &pb.KnownTypes{Dur: &durpb.Duration{Seconds: 3}}}, + {"Duration", Unmarshaler{}, `{"dur":"4s"}`, &pb.KnownTypes{Dur: &durpb.Duration{Seconds: 4}}}, + {"null Duration", Unmarshaler{}, `{"dur":null}`, &pb.KnownTypes{Dur: nil}}, + {"Timestamp", Unmarshaler{}, `{"ts":"2014-05-13T16:53:20.021Z"}`, &pb.KnownTypes{Ts: &tspb.Timestamp{Seconds: 14e8, Nanos: 21e6}}}, + {"Timestamp", Unmarshaler{}, `{"ts":"2014-05-13T16:53:20Z"}`, &pb.KnownTypes{Ts: &tspb.Timestamp{Seconds: 14e8, Nanos: 0}}}, + {"PreEpochTimestamp", Unmarshaler{}, `{"ts":"1969-12-31T23:59:58.999999995Z"}`, &pb.KnownTypes{Ts: &tspb.Timestamp{Seconds: -2, Nanos: 999999995}}}, + {"ZeroTimeTimestamp", Unmarshaler{}, `{"ts":"0001-01-01T00:00:00Z"}`, &pb.KnownTypes{Ts: &tspb.Timestamp{Seconds: -62135596800, Nanos: 0}}}, + {"null Timestamp", Unmarshaler{}, `{"ts":null}`, &pb.KnownTypes{Ts: nil}}, + {"null Struct", Unmarshaler{}, `{"st": null}`, &pb.KnownTypes{St: nil}}, + {"empty Struct", Unmarshaler{}, `{"st": {}}`, &pb.KnownTypes{St: &stpb.Struct{}}}, + {"basic Struct", Unmarshaler{}, `{"st": {"a": "x", "b": null, "c": 3, "d": true}}`, &pb.KnownTypes{St: &stpb.Struct{Fields: map[string]*stpb.Value{ + "a": {Kind: &stpb.Value_StringValue{"x"}}, + "b": {Kind: &stpb.Value_NullValue{}}, + "c": {Kind: &stpb.Value_NumberValue{3}}, + "d": {Kind: &stpb.Value_BoolValue{true}}, + }}}}, + {"nested Struct", Unmarshaler{}, `{"st": {"a": {"b": 1, "c": [{"d": true}, "f"]}}}`, &pb.KnownTypes{St: &stpb.Struct{Fields: map[string]*stpb.Value{ + "a": {Kind: &stpb.Value_StructValue{&stpb.Struct{Fields: map[string]*stpb.Value{ + "b": {Kind: &stpb.Value_NumberValue{1}}, + "c": {Kind: &stpb.Value_ListValue{&stpb.ListValue{Values: []*stpb.Value{ + {Kind: &stpb.Value_StructValue{&stpb.Struct{Fields: map[string]*stpb.Value{"d": {Kind: &stpb.Value_BoolValue{true}}}}}}, + {Kind: &stpb.Value_StringValue{"f"}}, + }}}}, + }}}}, + }}}}, + {"null ListValue", Unmarshaler{}, `{"lv": null}`, &pb.KnownTypes{Lv: nil}}, + {"empty ListValue", Unmarshaler{}, `{"lv": []}`, &pb.KnownTypes{Lv: &stpb.ListValue{}}}, + {"basic ListValue", Unmarshaler{}, `{"lv": ["x", null, 3, true]}`, &pb.KnownTypes{Lv: &stpb.ListValue{Values: []*stpb.Value{ + {Kind: &stpb.Value_StringValue{"x"}}, + {Kind: &stpb.Value_NullValue{}}, + {Kind: &stpb.Value_NumberValue{3}}, + {Kind: &stpb.Value_BoolValue{true}}, + }}}}, + {"number Value", Unmarshaler{}, `{"val":1}`, &pb.KnownTypes{Val: &stpb.Value{Kind: &stpb.Value_NumberValue{1}}}}, + {"null Value", Unmarshaler{}, `{"val":null}`, &pb.KnownTypes{Val: &stpb.Value{Kind: &stpb.Value_NullValue{stpb.NullValue_NULL_VALUE}}}}, + {"bool Value", Unmarshaler{}, `{"val":true}`, &pb.KnownTypes{Val: &stpb.Value{Kind: &stpb.Value_BoolValue{true}}}}, + {"string Value", Unmarshaler{}, `{"val":"x"}`, &pb.KnownTypes{Val: &stpb.Value{Kind: &stpb.Value_StringValue{"x"}}}}, + {"string number value", Unmarshaler{}, `{"val":"9223372036854775807"}`, &pb.KnownTypes{Val: &stpb.Value{Kind: &stpb.Value_StringValue{"9223372036854775807"}}}}, + {"list of lists Value", Unmarshaler{}, `{"val":["x", [["y"], "z"]]}`, &pb.KnownTypes{Val: &stpb.Value{ + Kind: &stpb.Value_ListValue{&stpb.ListValue{ + Values: []*stpb.Value{ + {Kind: &stpb.Value_StringValue{"x"}}, + {Kind: &stpb.Value_ListValue{&stpb.ListValue{ + Values: []*stpb.Value{ + {Kind: &stpb.Value_ListValue{&stpb.ListValue{ + Values: []*stpb.Value{{Kind: &stpb.Value_StringValue{"y"}}}, + }}}, + {Kind: &stpb.Value_StringValue{"z"}}, + }, + }}}, + }, + }}}}}, + + {"DoubleValue", Unmarshaler{}, `{"dbl":1.2}`, &pb.KnownTypes{Dbl: &wpb.DoubleValue{Value: 1.2}}}, + {"FloatValue", Unmarshaler{}, `{"flt":1.2}`, &pb.KnownTypes{Flt: &wpb.FloatValue{Value: 1.2}}}, + {"Int64Value", Unmarshaler{}, `{"i64":"-3"}`, &pb.KnownTypes{I64: &wpb.Int64Value{Value: -3}}}, + {"UInt64Value", Unmarshaler{}, `{"u64":"3"}`, &pb.KnownTypes{U64: &wpb.UInt64Value{Value: 3}}}, + {"Int32Value", Unmarshaler{}, `{"i32":-4}`, &pb.KnownTypes{I32: &wpb.Int32Value{Value: -4}}}, + {"UInt32Value", Unmarshaler{}, `{"u32":4}`, &pb.KnownTypes{U32: &wpb.UInt32Value{Value: 4}}}, + {"BoolValue", Unmarshaler{}, `{"bool":true}`, &pb.KnownTypes{Bool: &wpb.BoolValue{Value: true}}}, + {"StringValue", Unmarshaler{}, `{"str":"plush"}`, &pb.KnownTypes{Str: &wpb.StringValue{Value: "plush"}}}, + {"BytesValue", Unmarshaler{}, `{"bytes":"d293"}`, &pb.KnownTypes{Bytes: &wpb.BytesValue{Value: []byte("wow")}}}, + + // Ensure that `null` as a value ends up with a nil pointer instead of a [type]Value struct. + {"null DoubleValue", Unmarshaler{}, `{"dbl":null}`, &pb.KnownTypes{Dbl: nil}}, + {"null FloatValue", Unmarshaler{}, `{"flt":null}`, &pb.KnownTypes{Flt: nil}}, + {"null Int64Value", Unmarshaler{}, `{"i64":null}`, &pb.KnownTypes{I64: nil}}, + {"null UInt64Value", Unmarshaler{}, `{"u64":null}`, &pb.KnownTypes{U64: nil}}, + {"null Int32Value", Unmarshaler{}, `{"i32":null}`, &pb.KnownTypes{I32: nil}}, + {"null UInt32Value", Unmarshaler{}, `{"u32":null}`, &pb.KnownTypes{U32: nil}}, + {"null BoolValue", Unmarshaler{}, `{"bool":null}`, &pb.KnownTypes{Bool: nil}}, + {"null StringValue", Unmarshaler{}, `{"str":null}`, &pb.KnownTypes{Str: nil}}, + {"null BytesValue", Unmarshaler{}, `{"bytes":null}`, &pb.KnownTypes{Bytes: nil}}, + + {"required", Unmarshaler{}, `{"str":"hello"}`, &pb.MsgWithRequired{Str: proto.String("hello")}}, + {"required bytes", Unmarshaler{}, `{"byts": []}`, &pb.MsgWithRequiredBytes{Byts: []byte{}}}, +} + +func TestUnmarshaling(t *testing.T) { + for _, tt := range unmarshalingTests { + // Make a new instance of the type of our expected object. + p := reflect.New(reflect.TypeOf(tt.pb).Elem()).Interface().(proto.Message) + + err := tt.unmarshaler.Unmarshal(strings.NewReader(tt.json), p) + if err != nil { + t.Errorf("%s: %v", tt.desc, err) + continue + } + + // For easier diffs, compare text strings of the protos. + exp := proto.MarshalTextString(tt.pb) + act := proto.MarshalTextString(p) + if string(exp) != string(act) { + t.Errorf("%s: got [%s] want [%s]", tt.desc, act, exp) + } + } +} + +func TestUnmarshalNullArray(t *testing.T) { + var repeats pb.Repeats + if err := UnmarshalString(`{"rBool":null}`, &repeats); err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(repeats, pb.Repeats{}) { + t.Errorf("got non-nil fields in [%#v]", repeats) + } +} + +func TestUnmarshalNullObject(t *testing.T) { + var maps pb.Maps + if err := UnmarshalString(`{"mInt64Str":null}`, &maps); err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(maps, pb.Maps{}) { + t.Errorf("got non-nil fields in [%#v]", maps) + } +} + +func TestUnmarshalNext(t *testing.T) { + // We only need to check against a few, not all of them. + tests := unmarshalingTests[:5] + + // Create a buffer with many concatenated JSON objects. + var b bytes.Buffer + for _, tt := range tests { + b.WriteString(tt.json) + } + + dec := json.NewDecoder(&b) + for _, tt := range tests { + // Make a new instance of the type of our expected object. + p := reflect.New(reflect.TypeOf(tt.pb).Elem()).Interface().(proto.Message) + + err := tt.unmarshaler.UnmarshalNext(dec, p) + if err != nil { + t.Errorf("%s: %v", tt.desc, err) + continue + } + + // For easier diffs, compare text strings of the protos. + exp := proto.MarshalTextString(tt.pb) + act := proto.MarshalTextString(p) + if string(exp) != string(act) { + t.Errorf("%s: got [%s] want [%s]", tt.desc, act, exp) + } + } + + p := &pb.Simple{} + err := new(Unmarshaler).UnmarshalNext(dec, p) + if err != io.EOF { + t.Errorf("eof: got %v, expected io.EOF", err) + } +} + +var unmarshalingShouldError = []struct { + desc string + in string + pb proto.Message +}{ + {"a value", "666", new(pb.Simple)}, + {"gibberish", "{adskja123;l23=-=", new(pb.Simple)}, + {"unknown field", `{"unknown": "foo"}`, new(pb.Simple)}, + {"unknown enum name", `{"hilarity":"DAVE"}`, new(proto3pb.Message)}, +} + +func TestUnmarshalingBadInput(t *testing.T) { + for _, tt := range unmarshalingShouldError { + err := UnmarshalString(tt.in, tt.pb) + if err == nil { + t.Errorf("an error was expected when parsing %q instead of an object", tt.desc) + } + } +} + +type funcResolver func(turl string) (proto.Message, error) + +func (fn funcResolver) Resolve(turl string) (proto.Message, error) { + return fn(turl) +} + +func TestAnyWithCustomResolver(t *testing.T) { + var resolvedTypeUrls []string + resolver := funcResolver(func(turl string) (proto.Message, error) { + resolvedTypeUrls = append(resolvedTypeUrls, turl) + return new(pb.Simple), nil + }) + msg := &pb.Simple{ + OBytes: []byte{1, 2, 3, 4}, + OBool: proto.Bool(true), + OString: proto.String("foobar"), + OInt64: proto.Int64(1020304), + } + msgBytes, err := proto.Marshal(msg) + if err != nil { + t.Errorf("an unexpected error occurred when marshaling message: %v", err) + } + // make an Any with a type URL that won't resolve w/out custom resolver + any := &anypb.Any{ + TypeUrl: "https://foobar.com/some.random.MessageKind", + Value: msgBytes, + } + + m := Marshaler{AnyResolver: resolver} + js, err := m.MarshalToString(any) + if err != nil { + t.Errorf("an unexpected error occurred when marshaling any to JSON: %v", err) + } + if len(resolvedTypeUrls) != 1 { + t.Errorf("custom resolver was not invoked during marshaling") + } else if resolvedTypeUrls[0] != "https://foobar.com/some.random.MessageKind" { + t.Errorf("custom resolver was invoked with wrong URL: got %q, wanted %q", resolvedTypeUrls[0], "https://foobar.com/some.random.MessageKind") + } + wanted := `{"@type":"https://foobar.com/some.random.MessageKind","oBool":true,"oInt64":"1020304","oString":"foobar","oBytes":"AQIDBA=="}` + if js != wanted { + t.Errorf("marshalling JSON produced incorrect output: got %s, wanted %s", js, wanted) + } + + u := Unmarshaler{AnyResolver: resolver} + roundTrip := &anypb.Any{} + err = u.Unmarshal(bytes.NewReader([]byte(js)), roundTrip) + if err != nil { + t.Errorf("an unexpected error occurred when unmarshaling any from JSON: %v", err) + } + if len(resolvedTypeUrls) != 2 { + t.Errorf("custom resolver was not invoked during marshaling") + } else if resolvedTypeUrls[1] != "https://foobar.com/some.random.MessageKind" { + t.Errorf("custom resolver was invoked with wrong URL: got %q, wanted %q", resolvedTypeUrls[1], "https://foobar.com/some.random.MessageKind") + } + if !proto.Equal(any, roundTrip) { + t.Errorf("message contents not set correctly after unmarshalling JSON: got %s, wanted %s", roundTrip, any) + } +} + +func TestUnmarshalJSONPBUnmarshaler(t *testing.T) { + rawJson := `{ "foo": "bar", "baz": [0, 1, 2, 3] }` + var msg dynamicMessage + if err := Unmarshal(strings.NewReader(rawJson), &msg); err != nil { + t.Errorf("an unexpected error occurred when parsing into JSONPBUnmarshaler: %v", err) + } + if msg.rawJson != rawJson { + t.Errorf("message contents not set correctly after unmarshalling JSON: got %s, wanted %s", msg.rawJson, rawJson) + } +} + +func TestUnmarshalNullWithJSONPBUnmarshaler(t *testing.T) { + rawJson := `{"stringField":null}` + var ptrFieldMsg ptrFieldMessage + if err := Unmarshal(strings.NewReader(rawJson), &ptrFieldMsg); err != nil { + t.Errorf("unmarshal error: %v", err) + } + + want := ptrFieldMessage{StringField: &stringField{IsSet: true, StringValue: "null"}} + if !proto.Equal(&ptrFieldMsg, &want) { + t.Errorf("unmarshal result StringField: got %v, want %v", ptrFieldMsg, want) + } +} + +func TestUnmarshalAnyJSONPBUnmarshaler(t *testing.T) { + rawJson := `{ "@type": "blah.com/` + dynamicMessageName + `", "foo": "bar", "baz": [0, 1, 2, 3] }` + var got anypb.Any + if err := Unmarshal(strings.NewReader(rawJson), &got); err != nil { + t.Errorf("an unexpected error occurred when parsing into JSONPBUnmarshaler: %v", err) + } + + dm := &dynamicMessage{rawJson: `{"baz":[0,1,2,3],"foo":"bar"}`} + var want anypb.Any + if b, err := proto.Marshal(dm); err != nil { + t.Errorf("an unexpected error occurred when marshaling message: %v", err) + } else { + want.TypeUrl = "blah.com/" + dynamicMessageName + want.Value = b + } + + if !proto.Equal(&got, &want) { + t.Errorf("message contents not set correctly after unmarshalling JSON: got %v, wanted %v", got, want) + } +} + +const ( + dynamicMessageName = "google.protobuf.jsonpb.testing.dynamicMessage" +) + +func init() { + // we register the custom type below so that we can use it in Any types + proto.RegisterType((*dynamicMessage)(nil), dynamicMessageName) +} + +type ptrFieldMessage struct { + StringField *stringField `protobuf:"bytes,1,opt,name=stringField"` +} + +func (m *ptrFieldMessage) Reset() { +} + +func (m *ptrFieldMessage) String() string { + return m.StringField.StringValue +} + +func (m *ptrFieldMessage) ProtoMessage() { +} + +type stringField struct { + IsSet bool `protobuf:"varint,1,opt,name=isSet"` + StringValue string `protobuf:"bytes,2,opt,name=stringValue"` +} + +func (s *stringField) Reset() { +} + +func (s *stringField) String() string { + return s.StringValue +} + +func (s *stringField) ProtoMessage() { +} + +func (s *stringField) UnmarshalJSONPB(jum *Unmarshaler, js []byte) error { + s.IsSet = true + s.StringValue = string(js) + return nil +} + +// dynamicMessage implements protobuf.Message but is not a normal generated message type. +// It provides implementations of JSONPBMarshaler and JSONPBUnmarshaler for JSON support. +type dynamicMessage struct { + rawJson string `protobuf:"bytes,1,opt,name=rawJson"` + + // an unexported nested message is present just to ensure that it + // won't result in a panic (see issue #509) + dummy *dynamicMessage `protobuf:"bytes,2,opt,name=dummy"` +} + +func (m *dynamicMessage) Reset() { + m.rawJson = "{}" +} + +func (m *dynamicMessage) String() string { + return m.rawJson +} + +func (m *dynamicMessage) ProtoMessage() { +} + +func (m *dynamicMessage) MarshalJSONPB(jm *Marshaler) ([]byte, error) { + return []byte(m.rawJson), nil +} + +func (m *dynamicMessage) UnmarshalJSONPB(jum *Unmarshaler, js []byte) error { + m.rawJson = string(js) + return nil +} + +// Test unmarshaling message containing unset required fields should produce error. +func TestUnmarshalUnsetRequiredFields(t *testing.T) { + tests := []struct { + desc string + pb proto.Message + json string + }{ + { + desc: "direct required field missing", + pb: &pb.MsgWithRequired{}, + json: `{}`, + }, + { + desc: "direct required field set to null", + pb: &pb.MsgWithRequired{}, + json: `{"str": null}`, + }, + { + desc: "indirect required field missing", + pb: &pb.MsgWithIndirectRequired{}, + json: `{"subm": {}}`, + }, + { + desc: "indirect required field set to null", + pb: &pb.MsgWithIndirectRequired{}, + json: `{"subm": {"str": null}}`, + }, + { + desc: "direct required bytes field missing", + pb: &pb.MsgWithRequiredBytes{}, + json: `{}`, + }, + { + desc: "direct required bytes field set to null", + pb: &pb.MsgWithRequiredBytes{}, + json: `{"byts": null}`, + }, + { + desc: "direct required wkt field missing", + pb: &pb.MsgWithRequiredWKT{}, + json: `{}`, + }, + { + desc: "direct required wkt field set to null", + pb: &pb.MsgWithRequiredWKT{}, + json: `{"str": null}`, + }, + { + desc: "any containing message with required field set to null", + pb: &pb.KnownTypes{}, + json: `{"an": {"@type": "example.com/jsonpb.MsgWithRequired", "str": null}}`, + }, + { + desc: "any containing message with missing required field", + pb: &pb.KnownTypes{}, + json: `{"an": {"@type": "example.com/jsonpb.MsgWithRequired"}}`, + }, + { + desc: "missing required in map value", + pb: &pb.MsgWithIndirectRequired{}, + json: `{"map_field": {"a": {}, "b": {"str": "hi"}}}`, + }, + { + desc: "required in map value set to null", + pb: &pb.MsgWithIndirectRequired{}, + json: `{"map_field": {"a": {"str": "hello"}, "b": {"str": null}}}`, + }, + { + desc: "missing required in slice item", + pb: &pb.MsgWithIndirectRequired{}, + json: `{"slice_field": [{}, {"str": "hi"}]}`, + }, + { + desc: "required in slice item set to null", + pb: &pb.MsgWithIndirectRequired{}, + json: `{"slice_field": [{"str": "hello"}, {"str": null}]}`, + }, + { + desc: "required inside oneof missing", + pb: &pb.MsgWithOneof{}, + json: `{"msgWithRequired": {}}`, + }, + { + desc: "required inside oneof set to null", + pb: &pb.MsgWithOneof{}, + json: `{"msgWithRequired": {"str": null}}`, + }, + { + desc: "required field in extension missing", + pb: &pb.Real{}, + json: `{"[jsonpb.extm]":{}}`, + }, + { + desc: "required field in extension set to null", + pb: &pb.Real{}, + json: `{"[jsonpb.extm]":{"str": null}}`, + }, + } + + for _, tc := range tests { + if err := UnmarshalString(tc.json, tc.pb); err == nil { + t.Errorf("%s: expecting error in unmarshaling with unset required fields %s", tc.desc, tc.json) + } + } +} diff --git a/api/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/more_test_objects.pb.go b/api/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/more_test_objects.pb.go new file mode 100644 index 0000000..1bcce02 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/more_test_objects.pb.go @@ -0,0 +1,368 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: more_test_objects.proto + +package jsonpb + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type Numeral int32 + +const ( + Numeral_UNKNOWN Numeral = 0 + Numeral_ARABIC Numeral = 1 + Numeral_ROMAN Numeral = 2 +) + +var Numeral_name = map[int32]string{ + 0: "UNKNOWN", + 1: "ARABIC", + 2: "ROMAN", +} +var Numeral_value = map[string]int32{ + "UNKNOWN": 0, + "ARABIC": 1, + "ROMAN": 2, +} + +func (x Numeral) String() string { + return proto.EnumName(Numeral_name, int32(x)) +} +func (Numeral) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_more_test_objects_bef0d79b901f4c4a, []int{0} +} + +type Simple3 struct { + Dub float64 `protobuf:"fixed64,1,opt,name=dub" json:"dub,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Simple3) Reset() { *m = Simple3{} } +func (m *Simple3) String() string { return proto.CompactTextString(m) } +func (*Simple3) ProtoMessage() {} +func (*Simple3) Descriptor() ([]byte, []int) { + return fileDescriptor_more_test_objects_bef0d79b901f4c4a, []int{0} +} +func (m *Simple3) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Simple3.Unmarshal(m, b) +} +func (m *Simple3) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Simple3.Marshal(b, m, deterministic) +} +func (dst *Simple3) XXX_Merge(src proto.Message) { + xxx_messageInfo_Simple3.Merge(dst, src) +} +func (m *Simple3) XXX_Size() int { + return xxx_messageInfo_Simple3.Size(m) +} +func (m *Simple3) XXX_DiscardUnknown() { + xxx_messageInfo_Simple3.DiscardUnknown(m) +} + +var xxx_messageInfo_Simple3 proto.InternalMessageInfo + +func (m *Simple3) GetDub() float64 { + if m != nil { + return m.Dub + } + return 0 +} + +type SimpleSlice3 struct { + Slices []string `protobuf:"bytes,1,rep,name=slices" json:"slices,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SimpleSlice3) Reset() { *m = SimpleSlice3{} } +func (m *SimpleSlice3) String() string { return proto.CompactTextString(m) } +func (*SimpleSlice3) ProtoMessage() {} +func (*SimpleSlice3) Descriptor() ([]byte, []int) { + return fileDescriptor_more_test_objects_bef0d79b901f4c4a, []int{1} +} +func (m *SimpleSlice3) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SimpleSlice3.Unmarshal(m, b) +} +func (m *SimpleSlice3) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SimpleSlice3.Marshal(b, m, deterministic) +} +func (dst *SimpleSlice3) XXX_Merge(src proto.Message) { + xxx_messageInfo_SimpleSlice3.Merge(dst, src) +} +func (m *SimpleSlice3) XXX_Size() int { + return xxx_messageInfo_SimpleSlice3.Size(m) +} +func (m *SimpleSlice3) XXX_DiscardUnknown() { + xxx_messageInfo_SimpleSlice3.DiscardUnknown(m) +} + +var xxx_messageInfo_SimpleSlice3 proto.InternalMessageInfo + +func (m *SimpleSlice3) GetSlices() []string { + if m != nil { + return m.Slices + } + return nil +} + +type SimpleMap3 struct { + Stringy map[string]string `protobuf:"bytes,1,rep,name=stringy" json:"stringy,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SimpleMap3) Reset() { *m = SimpleMap3{} } +func (m *SimpleMap3) String() string { return proto.CompactTextString(m) } +func (*SimpleMap3) ProtoMessage() {} +func (*SimpleMap3) Descriptor() ([]byte, []int) { + return fileDescriptor_more_test_objects_bef0d79b901f4c4a, []int{2} +} +func (m *SimpleMap3) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SimpleMap3.Unmarshal(m, b) +} +func (m *SimpleMap3) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SimpleMap3.Marshal(b, m, deterministic) +} +func (dst *SimpleMap3) XXX_Merge(src proto.Message) { + xxx_messageInfo_SimpleMap3.Merge(dst, src) +} +func (m *SimpleMap3) XXX_Size() int { + return xxx_messageInfo_SimpleMap3.Size(m) +} +func (m *SimpleMap3) XXX_DiscardUnknown() { + xxx_messageInfo_SimpleMap3.DiscardUnknown(m) +} + +var xxx_messageInfo_SimpleMap3 proto.InternalMessageInfo + +func (m *SimpleMap3) GetStringy() map[string]string { + if m != nil { + return m.Stringy + } + return nil +} + +type SimpleNull3 struct { + Simple *Simple3 `protobuf:"bytes,1,opt,name=simple" json:"simple,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SimpleNull3) Reset() { *m = SimpleNull3{} } +func (m *SimpleNull3) String() string { return proto.CompactTextString(m) } +func (*SimpleNull3) ProtoMessage() {} +func (*SimpleNull3) Descriptor() ([]byte, []int) { + return fileDescriptor_more_test_objects_bef0d79b901f4c4a, []int{3} +} +func (m *SimpleNull3) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SimpleNull3.Unmarshal(m, b) +} +func (m *SimpleNull3) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SimpleNull3.Marshal(b, m, deterministic) +} +func (dst *SimpleNull3) XXX_Merge(src proto.Message) { + xxx_messageInfo_SimpleNull3.Merge(dst, src) +} +func (m *SimpleNull3) XXX_Size() int { + return xxx_messageInfo_SimpleNull3.Size(m) +} +func (m *SimpleNull3) XXX_DiscardUnknown() { + xxx_messageInfo_SimpleNull3.DiscardUnknown(m) +} + +var xxx_messageInfo_SimpleNull3 proto.InternalMessageInfo + +func (m *SimpleNull3) GetSimple() *Simple3 { + if m != nil { + return m.Simple + } + return nil +} + +type Mappy struct { + Nummy map[int64]int32 `protobuf:"bytes,1,rep,name=nummy" json:"nummy,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"` + Strry map[string]string `protobuf:"bytes,2,rep,name=strry" json:"strry,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + Objjy map[int32]*Simple3 `protobuf:"bytes,3,rep,name=objjy" json:"objjy,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + Buggy map[int64]string `protobuf:"bytes,4,rep,name=buggy" json:"buggy,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + Booly map[bool]bool `protobuf:"bytes,5,rep,name=booly" json:"booly,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"` + Enumy map[string]Numeral `protobuf:"bytes,6,rep,name=enumy" json:"enumy,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"varint,2,opt,name=value,enum=jsonpb.Numeral"` + S32Booly map[int32]bool `protobuf:"bytes,7,rep,name=s32booly" json:"s32booly,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"` + S64Booly map[int64]bool `protobuf:"bytes,8,rep,name=s64booly" json:"s64booly,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"` + U32Booly map[uint32]bool `protobuf:"bytes,9,rep,name=u32booly" json:"u32booly,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"` + U64Booly map[uint64]bool `protobuf:"bytes,10,rep,name=u64booly" json:"u64booly,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Mappy) Reset() { *m = Mappy{} } +func (m *Mappy) String() string { return proto.CompactTextString(m) } +func (*Mappy) ProtoMessage() {} +func (*Mappy) Descriptor() ([]byte, []int) { + return fileDescriptor_more_test_objects_bef0d79b901f4c4a, []int{4} +} +func (m *Mappy) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Mappy.Unmarshal(m, b) +} +func (m *Mappy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Mappy.Marshal(b, m, deterministic) +} +func (dst *Mappy) XXX_Merge(src proto.Message) { + xxx_messageInfo_Mappy.Merge(dst, src) +} +func (m *Mappy) XXX_Size() int { + return xxx_messageInfo_Mappy.Size(m) +} +func (m *Mappy) XXX_DiscardUnknown() { + xxx_messageInfo_Mappy.DiscardUnknown(m) +} + +var xxx_messageInfo_Mappy proto.InternalMessageInfo + +func (m *Mappy) GetNummy() map[int64]int32 { + if m != nil { + return m.Nummy + } + return nil +} + +func (m *Mappy) GetStrry() map[string]string { + if m != nil { + return m.Strry + } + return nil +} + +func (m *Mappy) GetObjjy() map[int32]*Simple3 { + if m != nil { + return m.Objjy + } + return nil +} + +func (m *Mappy) GetBuggy() map[int64]string { + if m != nil { + return m.Buggy + } + return nil +} + +func (m *Mappy) GetBooly() map[bool]bool { + if m != nil { + return m.Booly + } + return nil +} + +func (m *Mappy) GetEnumy() map[string]Numeral { + if m != nil { + return m.Enumy + } + return nil +} + +func (m *Mappy) GetS32Booly() map[int32]bool { + if m != nil { + return m.S32Booly + } + return nil +} + +func (m *Mappy) GetS64Booly() map[int64]bool { + if m != nil { + return m.S64Booly + } + return nil +} + +func (m *Mappy) GetU32Booly() map[uint32]bool { + if m != nil { + return m.U32Booly + } + return nil +} + +func (m *Mappy) GetU64Booly() map[uint64]bool { + if m != nil { + return m.U64Booly + } + return nil +} + +func init() { + proto.RegisterType((*Simple3)(nil), "jsonpb.Simple3") + proto.RegisterType((*SimpleSlice3)(nil), "jsonpb.SimpleSlice3") + proto.RegisterType((*SimpleMap3)(nil), "jsonpb.SimpleMap3") + proto.RegisterMapType((map[string]string)(nil), "jsonpb.SimpleMap3.StringyEntry") + proto.RegisterType((*SimpleNull3)(nil), "jsonpb.SimpleNull3") + proto.RegisterType((*Mappy)(nil), "jsonpb.Mappy") + proto.RegisterMapType((map[bool]bool)(nil), "jsonpb.Mappy.BoolyEntry") + proto.RegisterMapType((map[int64]string)(nil), "jsonpb.Mappy.BuggyEntry") + proto.RegisterMapType((map[string]Numeral)(nil), "jsonpb.Mappy.EnumyEntry") + proto.RegisterMapType((map[int64]int32)(nil), "jsonpb.Mappy.NummyEntry") + proto.RegisterMapType((map[int32]*Simple3)(nil), "jsonpb.Mappy.ObjjyEntry") + proto.RegisterMapType((map[int32]bool)(nil), "jsonpb.Mappy.S32boolyEntry") + proto.RegisterMapType((map[int64]bool)(nil), "jsonpb.Mappy.S64boolyEntry") + proto.RegisterMapType((map[string]string)(nil), "jsonpb.Mappy.StrryEntry") + proto.RegisterMapType((map[uint32]bool)(nil), "jsonpb.Mappy.U32boolyEntry") + proto.RegisterMapType((map[uint64]bool)(nil), "jsonpb.Mappy.U64boolyEntry") + proto.RegisterEnum("jsonpb.Numeral", Numeral_name, Numeral_value) +} + +func init() { + proto.RegisterFile("more_test_objects.proto", fileDescriptor_more_test_objects_bef0d79b901f4c4a) +} + +var fileDescriptor_more_test_objects_bef0d79b901f4c4a = []byte{ + // 526 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x94, 0xdd, 0x6b, 0xdb, 0x3c, + 0x14, 0x87, 0x5f, 0x27, 0xf5, 0xd7, 0x49, 0xfb, 0x2e, 0x88, 0xb1, 0x99, 0xf4, 0x62, 0xc5, 0xb0, + 0xad, 0x0c, 0xe6, 0x8b, 0x78, 0x74, 0x5d, 0x77, 0x95, 0x8e, 0x5e, 0x94, 0x11, 0x07, 0x1c, 0xc2, + 0x2e, 0x4b, 0xdc, 0x99, 0x90, 0xcc, 0x5f, 0xd8, 0xd6, 0xc0, 0xd7, 0xfb, 0xbb, 0x07, 0xe3, 0x48, + 0x72, 0x2d, 0x07, 0x85, 0x6c, 0x77, 0x52, 0x7e, 0xcf, 0xe3, 0x73, 0x24, 0x1d, 0x02, 0x2f, 0xd3, + 0xbc, 0x8c, 0x1f, 0xea, 0xb8, 0xaa, 0x1f, 0xf2, 0x68, 0x17, 0x3f, 0xd6, 0x95, 0x57, 0x94, 0x79, + 0x9d, 0x13, 0x63, 0x57, 0xe5, 0x59, 0x11, 0xb9, 0xe7, 0x60, 0x2e, 0xb7, 0x69, 0x91, 0xc4, 0x3e, + 0x19, 0xc3, 0xf0, 0x3b, 0x8d, 0x1c, 0xed, 0x42, 0xbb, 0xd4, 0x42, 0x5c, 0xba, 0x6f, 0xe0, 0x94, + 0x87, 0xcb, 0x64, 0xfb, 0x18, 0xfb, 0xe4, 0x05, 0x18, 0x15, 0xae, 0x2a, 0x47, 0xbb, 0x18, 0x5e, + 0xda, 0xa1, 0xd8, 0xb9, 0xbf, 0x34, 0x00, 0x0e, 0xce, 0xd7, 0x85, 0x4f, 0x3e, 0x81, 0x59, 0xd5, + 0xe5, 0x36, 0xdb, 0x34, 0x8c, 0x1b, 0x4d, 0x5f, 0x79, 0xbc, 0x9a, 0xd7, 0x41, 0xde, 0x92, 0x13, + 0x77, 0x59, 0x5d, 0x36, 0x61, 0xcb, 0x4f, 0x6e, 0xe0, 0x54, 0x0e, 0xb0, 0xa7, 0x1f, 0x71, 0xc3, + 0x7a, 0xb2, 0x43, 0x5c, 0x92, 0xe7, 0xa0, 0xff, 0x5c, 0x27, 0x34, 0x76, 0x06, 0xec, 0x37, 0xbe, + 0xb9, 0x19, 0x5c, 0x6b, 0xee, 0x15, 0x8c, 0xf8, 0xf7, 0x03, 0x9a, 0x24, 0x3e, 0x79, 0x0b, 0x46, + 0xc5, 0xb6, 0xcc, 0x1e, 0x4d, 0x9f, 0xf5, 0x9b, 0xf0, 0x43, 0x11, 0xbb, 0xbf, 0x2d, 0xd0, 0xe7, + 0xeb, 0xa2, 0x68, 0x88, 0x07, 0x7a, 0x46, 0xd3, 0xb4, 0x6d, 0xdb, 0x69, 0x0d, 0x96, 0x7a, 0x01, + 0x46, 0xbc, 0x5f, 0x8e, 0x21, 0x5f, 0xd5, 0x65, 0xd9, 0x38, 0x03, 0x15, 0xbf, 0xc4, 0x48, 0xf0, + 0x0c, 0x43, 0x3e, 0x8f, 0x76, 0xbb, 0xc6, 0x19, 0xaa, 0xf8, 0x05, 0x46, 0x82, 0x67, 0x18, 0xf2, + 0x11, 0xdd, 0x6c, 0x1a, 0xe7, 0x44, 0xc5, 0xdf, 0x62, 0x24, 0x78, 0x86, 0x31, 0x3e, 0xcf, 0x93, + 0xc6, 0xd1, 0x95, 0x3c, 0x46, 0x2d, 0x8f, 0x6b, 0xe4, 0xe3, 0x8c, 0xa6, 0x8d, 0x63, 0xa8, 0xf8, + 0x3b, 0x8c, 0x04, 0xcf, 0x30, 0xf2, 0x11, 0xac, 0xca, 0x9f, 0xf2, 0x12, 0x26, 0x53, 0xce, 0xf7, + 0x8e, 0x2c, 0x52, 0x6e, 0x3d, 0xc1, 0x4c, 0xbc, 0xfa, 0xc0, 0x45, 0x4b, 0x29, 0x8a, 0xb4, 0x15, + 0xc5, 0x16, 0x45, 0xda, 0x56, 0xb4, 0x55, 0xe2, 0xaa, 0x5f, 0x91, 0x4a, 0x15, 0x69, 0x5b, 0x11, + 0x94, 0x62, 0xbf, 0x62, 0x0b, 0x4f, 0xae, 0x01, 0xba, 0x87, 0x96, 0xe7, 0x6f, 0xa8, 0x98, 0x3f, + 0x5d, 0x9a, 0x3f, 0x34, 0xbb, 0x27, 0xff, 0x97, 0xc9, 0x9d, 0xdc, 0x03, 0x74, 0x8f, 0x2f, 0x9b, + 0x3a, 0x37, 0x5f, 0xcb, 0xa6, 0x62, 0x92, 0xfb, 0x4d, 0x74, 0x73, 0x71, 0xac, 0x7d, 0x7b, 0xdf, + 0x7c, 0xba, 0x10, 0xd9, 0xb4, 0x14, 0xa6, 0xb5, 0xd7, 0x7e, 0x37, 0x2b, 0x8a, 0x83, 0xf7, 0xda, + 0xff, 0xbf, 0x6b, 0x3f, 0xa0, 0x69, 0x5c, 0xae, 0x13, 0xf9, 0x53, 0x9f, 0xe1, 0xac, 0x37, 0x43, + 0x8a, 0xcb, 0x38, 0xdc, 0x07, 0xca, 0xf2, 0xab, 0x1e, 0x3b, 0xfe, 0xbe, 0xbc, 0x3a, 0x54, 0xf9, + 0xec, 0x6f, 0xe4, 0x43, 0x95, 0x4f, 0x8e, 0xc8, 0xef, 0xde, 0x83, 0x29, 0x6e, 0x82, 0x8c, 0xc0, + 0x5c, 0x05, 0x5f, 0x83, 0xc5, 0xb7, 0x60, 0xfc, 0x1f, 0x01, 0x30, 0x66, 0xe1, 0xec, 0xf6, 0xfe, + 0xcb, 0x58, 0x23, 0x36, 0xe8, 0xe1, 0x62, 0x3e, 0x0b, 0xc6, 0x83, 0xc8, 0x60, 0x7f, 0xe0, 0xfe, + 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdc, 0x84, 0x34, 0xaf, 0xdb, 0x05, 0x00, 0x00, +} diff --git a/api/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/more_test_objects.proto b/api/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/more_test_objects.proto new file mode 100644 index 0000000..d254fa5 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/more_test_objects.proto @@ -0,0 +1,69 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2015 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto3"; + +package jsonpb; + +message Simple3 { + double dub = 1; +} + +message SimpleSlice3 { + repeated string slices = 1; +} + +message SimpleMap3 { + map stringy = 1; +} + +message SimpleNull3 { + Simple3 simple = 1; +} + +enum Numeral { + UNKNOWN = 0; + ARABIC = 1; + ROMAN = 2; +} + +message Mappy { + map nummy = 1; + map strry = 2; + map objjy = 3; + map buggy = 4; + map booly = 5; + map enumy = 6; + map s32booly = 7; + map s64booly = 8; + map u32booly = 9; + map u64booly = 10; +} diff --git a/api/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/test_objects.pb.go b/api/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/test_objects.pb.go new file mode 100644 index 0000000..d9e24db --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/test_objects.pb.go @@ -0,0 +1,1278 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: test_objects.proto + +package jsonpb + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" +import any "github.com/golang/protobuf/ptypes/any" +import duration "github.com/golang/protobuf/ptypes/duration" +import _struct "github.com/golang/protobuf/ptypes/struct" +import timestamp "github.com/golang/protobuf/ptypes/timestamp" +import wrappers "github.com/golang/protobuf/ptypes/wrappers" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type Widget_Color int32 + +const ( + Widget_RED Widget_Color = 0 + Widget_GREEN Widget_Color = 1 + Widget_BLUE Widget_Color = 2 +) + +var Widget_Color_name = map[int32]string{ + 0: "RED", + 1: "GREEN", + 2: "BLUE", +} +var Widget_Color_value = map[string]int32{ + "RED": 0, + "GREEN": 1, + "BLUE": 2, +} + +func (x Widget_Color) Enum() *Widget_Color { + p := new(Widget_Color) + *p = x + return p +} +func (x Widget_Color) String() string { + return proto.EnumName(Widget_Color_name, int32(x)) +} +func (x *Widget_Color) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Widget_Color_value, data, "Widget_Color") + if err != nil { + return err + } + *x = Widget_Color(value) + return nil +} +func (Widget_Color) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_test_objects_c6f6c615ab823e65, []int{3, 0} +} + +// Test message for holding primitive types. +type Simple struct { + OBool *bool `protobuf:"varint,1,opt,name=o_bool,json=oBool" json:"o_bool,omitempty"` + OInt32 *int32 `protobuf:"varint,2,opt,name=o_int32,json=oInt32" json:"o_int32,omitempty"` + OInt64 *int64 `protobuf:"varint,3,opt,name=o_int64,json=oInt64" json:"o_int64,omitempty"` + OUint32 *uint32 `protobuf:"varint,4,opt,name=o_uint32,json=oUint32" json:"o_uint32,omitempty"` + OUint64 *uint64 `protobuf:"varint,5,opt,name=o_uint64,json=oUint64" json:"o_uint64,omitempty"` + OSint32 *int32 `protobuf:"zigzag32,6,opt,name=o_sint32,json=oSint32" json:"o_sint32,omitempty"` + OSint64 *int64 `protobuf:"zigzag64,7,opt,name=o_sint64,json=oSint64" json:"o_sint64,omitempty"` + OFloat *float32 `protobuf:"fixed32,8,opt,name=o_float,json=oFloat" json:"o_float,omitempty"` + ODouble *float64 `protobuf:"fixed64,9,opt,name=o_double,json=oDouble" json:"o_double,omitempty"` + OString *string `protobuf:"bytes,10,opt,name=o_string,json=oString" json:"o_string,omitempty"` + OBytes []byte `protobuf:"bytes,11,opt,name=o_bytes,json=oBytes" json:"o_bytes,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Simple) Reset() { *m = Simple{} } +func (m *Simple) String() string { return proto.CompactTextString(m) } +func (*Simple) ProtoMessage() {} +func (*Simple) Descriptor() ([]byte, []int) { + return fileDescriptor_test_objects_c6f6c615ab823e65, []int{0} +} +func (m *Simple) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Simple.Unmarshal(m, b) +} +func (m *Simple) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Simple.Marshal(b, m, deterministic) +} +func (dst *Simple) XXX_Merge(src proto.Message) { + xxx_messageInfo_Simple.Merge(dst, src) +} +func (m *Simple) XXX_Size() int { + return xxx_messageInfo_Simple.Size(m) +} +func (m *Simple) XXX_DiscardUnknown() { + xxx_messageInfo_Simple.DiscardUnknown(m) +} + +var xxx_messageInfo_Simple proto.InternalMessageInfo + +func (m *Simple) GetOBool() bool { + if m != nil && m.OBool != nil { + return *m.OBool + } + return false +} + +func (m *Simple) GetOInt32() int32 { + if m != nil && m.OInt32 != nil { + return *m.OInt32 + } + return 0 +} + +func (m *Simple) GetOInt64() int64 { + if m != nil && m.OInt64 != nil { + return *m.OInt64 + } + return 0 +} + +func (m *Simple) GetOUint32() uint32 { + if m != nil && m.OUint32 != nil { + return *m.OUint32 + } + return 0 +} + +func (m *Simple) GetOUint64() uint64 { + if m != nil && m.OUint64 != nil { + return *m.OUint64 + } + return 0 +} + +func (m *Simple) GetOSint32() int32 { + if m != nil && m.OSint32 != nil { + return *m.OSint32 + } + return 0 +} + +func (m *Simple) GetOSint64() int64 { + if m != nil && m.OSint64 != nil { + return *m.OSint64 + } + return 0 +} + +func (m *Simple) GetOFloat() float32 { + if m != nil && m.OFloat != nil { + return *m.OFloat + } + return 0 +} + +func (m *Simple) GetODouble() float64 { + if m != nil && m.ODouble != nil { + return *m.ODouble + } + return 0 +} + +func (m *Simple) GetOString() string { + if m != nil && m.OString != nil { + return *m.OString + } + return "" +} + +func (m *Simple) GetOBytes() []byte { + if m != nil { + return m.OBytes + } + return nil +} + +// Test message for holding special non-finites primitives. +type NonFinites struct { + FNan *float32 `protobuf:"fixed32,1,opt,name=f_nan,json=fNan" json:"f_nan,omitempty"` + FPinf *float32 `protobuf:"fixed32,2,opt,name=f_pinf,json=fPinf" json:"f_pinf,omitempty"` + FNinf *float32 `protobuf:"fixed32,3,opt,name=f_ninf,json=fNinf" json:"f_ninf,omitempty"` + DNan *float64 `protobuf:"fixed64,4,opt,name=d_nan,json=dNan" json:"d_nan,omitempty"` + DPinf *float64 `protobuf:"fixed64,5,opt,name=d_pinf,json=dPinf" json:"d_pinf,omitempty"` + DNinf *float64 `protobuf:"fixed64,6,opt,name=d_ninf,json=dNinf" json:"d_ninf,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *NonFinites) Reset() { *m = NonFinites{} } +func (m *NonFinites) String() string { return proto.CompactTextString(m) } +func (*NonFinites) ProtoMessage() {} +func (*NonFinites) Descriptor() ([]byte, []int) { + return fileDescriptor_test_objects_c6f6c615ab823e65, []int{1} +} +func (m *NonFinites) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_NonFinites.Unmarshal(m, b) +} +func (m *NonFinites) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_NonFinites.Marshal(b, m, deterministic) +} +func (dst *NonFinites) XXX_Merge(src proto.Message) { + xxx_messageInfo_NonFinites.Merge(dst, src) +} +func (m *NonFinites) XXX_Size() int { + return xxx_messageInfo_NonFinites.Size(m) +} +func (m *NonFinites) XXX_DiscardUnknown() { + xxx_messageInfo_NonFinites.DiscardUnknown(m) +} + +var xxx_messageInfo_NonFinites proto.InternalMessageInfo + +func (m *NonFinites) GetFNan() float32 { + if m != nil && m.FNan != nil { + return *m.FNan + } + return 0 +} + +func (m *NonFinites) GetFPinf() float32 { + if m != nil && m.FPinf != nil { + return *m.FPinf + } + return 0 +} + +func (m *NonFinites) GetFNinf() float32 { + if m != nil && m.FNinf != nil { + return *m.FNinf + } + return 0 +} + +func (m *NonFinites) GetDNan() float64 { + if m != nil && m.DNan != nil { + return *m.DNan + } + return 0 +} + +func (m *NonFinites) GetDPinf() float64 { + if m != nil && m.DPinf != nil { + return *m.DPinf + } + return 0 +} + +func (m *NonFinites) GetDNinf() float64 { + if m != nil && m.DNinf != nil { + return *m.DNinf + } + return 0 +} + +// Test message for holding repeated primitives. +type Repeats struct { + RBool []bool `protobuf:"varint,1,rep,name=r_bool,json=rBool" json:"r_bool,omitempty"` + RInt32 []int32 `protobuf:"varint,2,rep,name=r_int32,json=rInt32" json:"r_int32,omitempty"` + RInt64 []int64 `protobuf:"varint,3,rep,name=r_int64,json=rInt64" json:"r_int64,omitempty"` + RUint32 []uint32 `protobuf:"varint,4,rep,name=r_uint32,json=rUint32" json:"r_uint32,omitempty"` + RUint64 []uint64 `protobuf:"varint,5,rep,name=r_uint64,json=rUint64" json:"r_uint64,omitempty"` + RSint32 []int32 `protobuf:"zigzag32,6,rep,name=r_sint32,json=rSint32" json:"r_sint32,omitempty"` + RSint64 []int64 `protobuf:"zigzag64,7,rep,name=r_sint64,json=rSint64" json:"r_sint64,omitempty"` + RFloat []float32 `protobuf:"fixed32,8,rep,name=r_float,json=rFloat" json:"r_float,omitempty"` + RDouble []float64 `protobuf:"fixed64,9,rep,name=r_double,json=rDouble" json:"r_double,omitempty"` + RString []string `protobuf:"bytes,10,rep,name=r_string,json=rString" json:"r_string,omitempty"` + RBytes [][]byte `protobuf:"bytes,11,rep,name=r_bytes,json=rBytes" json:"r_bytes,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Repeats) Reset() { *m = Repeats{} } +func (m *Repeats) String() string { return proto.CompactTextString(m) } +func (*Repeats) ProtoMessage() {} +func (*Repeats) Descriptor() ([]byte, []int) { + return fileDescriptor_test_objects_c6f6c615ab823e65, []int{2} +} +func (m *Repeats) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Repeats.Unmarshal(m, b) +} +func (m *Repeats) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Repeats.Marshal(b, m, deterministic) +} +func (dst *Repeats) XXX_Merge(src proto.Message) { + xxx_messageInfo_Repeats.Merge(dst, src) +} +func (m *Repeats) XXX_Size() int { + return xxx_messageInfo_Repeats.Size(m) +} +func (m *Repeats) XXX_DiscardUnknown() { + xxx_messageInfo_Repeats.DiscardUnknown(m) +} + +var xxx_messageInfo_Repeats proto.InternalMessageInfo + +func (m *Repeats) GetRBool() []bool { + if m != nil { + return m.RBool + } + return nil +} + +func (m *Repeats) GetRInt32() []int32 { + if m != nil { + return m.RInt32 + } + return nil +} + +func (m *Repeats) GetRInt64() []int64 { + if m != nil { + return m.RInt64 + } + return nil +} + +func (m *Repeats) GetRUint32() []uint32 { + if m != nil { + return m.RUint32 + } + return nil +} + +func (m *Repeats) GetRUint64() []uint64 { + if m != nil { + return m.RUint64 + } + return nil +} + +func (m *Repeats) GetRSint32() []int32 { + if m != nil { + return m.RSint32 + } + return nil +} + +func (m *Repeats) GetRSint64() []int64 { + if m != nil { + return m.RSint64 + } + return nil +} + +func (m *Repeats) GetRFloat() []float32 { + if m != nil { + return m.RFloat + } + return nil +} + +func (m *Repeats) GetRDouble() []float64 { + if m != nil { + return m.RDouble + } + return nil +} + +func (m *Repeats) GetRString() []string { + if m != nil { + return m.RString + } + return nil +} + +func (m *Repeats) GetRBytes() [][]byte { + if m != nil { + return m.RBytes + } + return nil +} + +// Test message for holding enums and nested messages. +type Widget struct { + Color *Widget_Color `protobuf:"varint,1,opt,name=color,enum=jsonpb.Widget_Color" json:"color,omitempty"` + RColor []Widget_Color `protobuf:"varint,2,rep,name=r_color,json=rColor,enum=jsonpb.Widget_Color" json:"r_color,omitempty"` + Simple *Simple `protobuf:"bytes,10,opt,name=simple" json:"simple,omitempty"` + RSimple []*Simple `protobuf:"bytes,11,rep,name=r_simple,json=rSimple" json:"r_simple,omitempty"` + Repeats *Repeats `protobuf:"bytes,20,opt,name=repeats" json:"repeats,omitempty"` + RRepeats []*Repeats `protobuf:"bytes,21,rep,name=r_repeats,json=rRepeats" json:"r_repeats,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Widget) Reset() { *m = Widget{} } +func (m *Widget) String() string { return proto.CompactTextString(m) } +func (*Widget) ProtoMessage() {} +func (*Widget) Descriptor() ([]byte, []int) { + return fileDescriptor_test_objects_c6f6c615ab823e65, []int{3} +} +func (m *Widget) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Widget.Unmarshal(m, b) +} +func (m *Widget) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Widget.Marshal(b, m, deterministic) +} +func (dst *Widget) XXX_Merge(src proto.Message) { + xxx_messageInfo_Widget.Merge(dst, src) +} +func (m *Widget) XXX_Size() int { + return xxx_messageInfo_Widget.Size(m) +} +func (m *Widget) XXX_DiscardUnknown() { + xxx_messageInfo_Widget.DiscardUnknown(m) +} + +var xxx_messageInfo_Widget proto.InternalMessageInfo + +func (m *Widget) GetColor() Widget_Color { + if m != nil && m.Color != nil { + return *m.Color + } + return Widget_RED +} + +func (m *Widget) GetRColor() []Widget_Color { + if m != nil { + return m.RColor + } + return nil +} + +func (m *Widget) GetSimple() *Simple { + if m != nil { + return m.Simple + } + return nil +} + +func (m *Widget) GetRSimple() []*Simple { + if m != nil { + return m.RSimple + } + return nil +} + +func (m *Widget) GetRepeats() *Repeats { + if m != nil { + return m.Repeats + } + return nil +} + +func (m *Widget) GetRRepeats() []*Repeats { + if m != nil { + return m.RRepeats + } + return nil +} + +type Maps struct { + MInt64Str map[int64]string `protobuf:"bytes,1,rep,name=m_int64_str,json=mInt64Str" json:"m_int64_str,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + MBoolSimple map[bool]*Simple `protobuf:"bytes,2,rep,name=m_bool_simple,json=mBoolSimple" json:"m_bool_simple,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Maps) Reset() { *m = Maps{} } +func (m *Maps) String() string { return proto.CompactTextString(m) } +func (*Maps) ProtoMessage() {} +func (*Maps) Descriptor() ([]byte, []int) { + return fileDescriptor_test_objects_c6f6c615ab823e65, []int{4} +} +func (m *Maps) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Maps.Unmarshal(m, b) +} +func (m *Maps) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Maps.Marshal(b, m, deterministic) +} +func (dst *Maps) XXX_Merge(src proto.Message) { + xxx_messageInfo_Maps.Merge(dst, src) +} +func (m *Maps) XXX_Size() int { + return xxx_messageInfo_Maps.Size(m) +} +func (m *Maps) XXX_DiscardUnknown() { + xxx_messageInfo_Maps.DiscardUnknown(m) +} + +var xxx_messageInfo_Maps proto.InternalMessageInfo + +func (m *Maps) GetMInt64Str() map[int64]string { + if m != nil { + return m.MInt64Str + } + return nil +} + +func (m *Maps) GetMBoolSimple() map[bool]*Simple { + if m != nil { + return m.MBoolSimple + } + return nil +} + +type MsgWithOneof struct { + // Types that are valid to be assigned to Union: + // *MsgWithOneof_Title + // *MsgWithOneof_Salary + // *MsgWithOneof_Country + // *MsgWithOneof_HomeAddress + // *MsgWithOneof_MsgWithRequired + Union isMsgWithOneof_Union `protobuf_oneof:"union"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MsgWithOneof) Reset() { *m = MsgWithOneof{} } +func (m *MsgWithOneof) String() string { return proto.CompactTextString(m) } +func (*MsgWithOneof) ProtoMessage() {} +func (*MsgWithOneof) Descriptor() ([]byte, []int) { + return fileDescriptor_test_objects_c6f6c615ab823e65, []int{5} +} +func (m *MsgWithOneof) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MsgWithOneof.Unmarshal(m, b) +} +func (m *MsgWithOneof) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MsgWithOneof.Marshal(b, m, deterministic) +} +func (dst *MsgWithOneof) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgWithOneof.Merge(dst, src) +} +func (m *MsgWithOneof) XXX_Size() int { + return xxx_messageInfo_MsgWithOneof.Size(m) +} +func (m *MsgWithOneof) XXX_DiscardUnknown() { + xxx_messageInfo_MsgWithOneof.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgWithOneof proto.InternalMessageInfo + +type isMsgWithOneof_Union interface { + isMsgWithOneof_Union() +} + +type MsgWithOneof_Title struct { + Title string `protobuf:"bytes,1,opt,name=title,oneof"` +} +type MsgWithOneof_Salary struct { + Salary int64 `protobuf:"varint,2,opt,name=salary,oneof"` +} +type MsgWithOneof_Country struct { + Country string `protobuf:"bytes,3,opt,name=Country,oneof"` +} +type MsgWithOneof_HomeAddress struct { + HomeAddress string `protobuf:"bytes,4,opt,name=home_address,json=homeAddress,oneof"` +} +type MsgWithOneof_MsgWithRequired struct { + MsgWithRequired *MsgWithRequired `protobuf:"bytes,5,opt,name=msg_with_required,json=msgWithRequired,oneof"` +} + +func (*MsgWithOneof_Title) isMsgWithOneof_Union() {} +func (*MsgWithOneof_Salary) isMsgWithOneof_Union() {} +func (*MsgWithOneof_Country) isMsgWithOneof_Union() {} +func (*MsgWithOneof_HomeAddress) isMsgWithOneof_Union() {} +func (*MsgWithOneof_MsgWithRequired) isMsgWithOneof_Union() {} + +func (m *MsgWithOneof) GetUnion() isMsgWithOneof_Union { + if m != nil { + return m.Union + } + return nil +} + +func (m *MsgWithOneof) GetTitle() string { + if x, ok := m.GetUnion().(*MsgWithOneof_Title); ok { + return x.Title + } + return "" +} + +func (m *MsgWithOneof) GetSalary() int64 { + if x, ok := m.GetUnion().(*MsgWithOneof_Salary); ok { + return x.Salary + } + return 0 +} + +func (m *MsgWithOneof) GetCountry() string { + if x, ok := m.GetUnion().(*MsgWithOneof_Country); ok { + return x.Country + } + return "" +} + +func (m *MsgWithOneof) GetHomeAddress() string { + if x, ok := m.GetUnion().(*MsgWithOneof_HomeAddress); ok { + return x.HomeAddress + } + return "" +} + +func (m *MsgWithOneof) GetMsgWithRequired() *MsgWithRequired { + if x, ok := m.GetUnion().(*MsgWithOneof_MsgWithRequired); ok { + return x.MsgWithRequired + } + return nil +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*MsgWithOneof) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _MsgWithOneof_OneofMarshaler, _MsgWithOneof_OneofUnmarshaler, _MsgWithOneof_OneofSizer, []interface{}{ + (*MsgWithOneof_Title)(nil), + (*MsgWithOneof_Salary)(nil), + (*MsgWithOneof_Country)(nil), + (*MsgWithOneof_HomeAddress)(nil), + (*MsgWithOneof_MsgWithRequired)(nil), + } +} + +func _MsgWithOneof_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*MsgWithOneof) + // union + switch x := m.Union.(type) { + case *MsgWithOneof_Title: + b.EncodeVarint(1<<3 | proto.WireBytes) + b.EncodeStringBytes(x.Title) + case *MsgWithOneof_Salary: + b.EncodeVarint(2<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.Salary)) + case *MsgWithOneof_Country: + b.EncodeVarint(3<<3 | proto.WireBytes) + b.EncodeStringBytes(x.Country) + case *MsgWithOneof_HomeAddress: + b.EncodeVarint(4<<3 | proto.WireBytes) + b.EncodeStringBytes(x.HomeAddress) + case *MsgWithOneof_MsgWithRequired: + b.EncodeVarint(5<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.MsgWithRequired); err != nil { + return err + } + case nil: + default: + return fmt.Errorf("MsgWithOneof.Union has unexpected type %T", x) + } + return nil +} + +func _MsgWithOneof_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*MsgWithOneof) + switch tag { + case 1: // union.title + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeStringBytes() + m.Union = &MsgWithOneof_Title{x} + return true, err + case 2: // union.salary + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &MsgWithOneof_Salary{int64(x)} + return true, err + case 3: // union.Country + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeStringBytes() + m.Union = &MsgWithOneof_Country{x} + return true, err + case 4: // union.home_address + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeStringBytes() + m.Union = &MsgWithOneof_HomeAddress{x} + return true, err + case 5: // union.msg_with_required + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(MsgWithRequired) + err := b.DecodeMessage(msg) + m.Union = &MsgWithOneof_MsgWithRequired{msg} + return true, err + default: + return false, nil + } +} + +func _MsgWithOneof_OneofSizer(msg proto.Message) (n int) { + m := msg.(*MsgWithOneof) + // union + switch x := m.Union.(type) { + case *MsgWithOneof_Title: + n += 1 // tag and wire + n += proto.SizeVarint(uint64(len(x.Title))) + n += len(x.Title) + case *MsgWithOneof_Salary: + n += 1 // tag and wire + n += proto.SizeVarint(uint64(x.Salary)) + case *MsgWithOneof_Country: + n += 1 // tag and wire + n += proto.SizeVarint(uint64(len(x.Country))) + n += len(x.Country) + case *MsgWithOneof_HomeAddress: + n += 1 // tag and wire + n += proto.SizeVarint(uint64(len(x.HomeAddress))) + n += len(x.HomeAddress) + case *MsgWithOneof_MsgWithRequired: + s := proto.Size(x.MsgWithRequired) + n += 1 // tag and wire + n += proto.SizeVarint(uint64(s)) + n += s + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +type Real struct { + Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Real) Reset() { *m = Real{} } +func (m *Real) String() string { return proto.CompactTextString(m) } +func (*Real) ProtoMessage() {} +func (*Real) Descriptor() ([]byte, []int) { + return fileDescriptor_test_objects_c6f6c615ab823e65, []int{6} +} + +var extRange_Real = []proto.ExtensionRange{ + {Start: 100, End: 536870911}, +} + +func (*Real) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_Real +} +func (m *Real) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Real.Unmarshal(m, b) +} +func (m *Real) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Real.Marshal(b, m, deterministic) +} +func (dst *Real) XXX_Merge(src proto.Message) { + xxx_messageInfo_Real.Merge(dst, src) +} +func (m *Real) XXX_Size() int { + return xxx_messageInfo_Real.Size(m) +} +func (m *Real) XXX_DiscardUnknown() { + xxx_messageInfo_Real.DiscardUnknown(m) +} + +var xxx_messageInfo_Real proto.InternalMessageInfo + +func (m *Real) GetValue() float64 { + if m != nil && m.Value != nil { + return *m.Value + } + return 0 +} + +type Complex struct { + Imaginary *float64 `protobuf:"fixed64,1,opt,name=imaginary" json:"imaginary,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Complex) Reset() { *m = Complex{} } +func (m *Complex) String() string { return proto.CompactTextString(m) } +func (*Complex) ProtoMessage() {} +func (*Complex) Descriptor() ([]byte, []int) { + return fileDescriptor_test_objects_c6f6c615ab823e65, []int{7} +} + +var extRange_Complex = []proto.ExtensionRange{ + {Start: 100, End: 536870911}, +} + +func (*Complex) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_Complex +} +func (m *Complex) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Complex.Unmarshal(m, b) +} +func (m *Complex) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Complex.Marshal(b, m, deterministic) +} +func (dst *Complex) XXX_Merge(src proto.Message) { + xxx_messageInfo_Complex.Merge(dst, src) +} +func (m *Complex) XXX_Size() int { + return xxx_messageInfo_Complex.Size(m) +} +func (m *Complex) XXX_DiscardUnknown() { + xxx_messageInfo_Complex.DiscardUnknown(m) +} + +var xxx_messageInfo_Complex proto.InternalMessageInfo + +func (m *Complex) GetImaginary() float64 { + if m != nil && m.Imaginary != nil { + return *m.Imaginary + } + return 0 +} + +var E_Complex_RealExtension = &proto.ExtensionDesc{ + ExtendedType: (*Real)(nil), + ExtensionType: (*Complex)(nil), + Field: 123, + Name: "jsonpb.Complex.real_extension", + Tag: "bytes,123,opt,name=real_extension,json=realExtension", + Filename: "test_objects.proto", +} + +type KnownTypes struct { + An *any.Any `protobuf:"bytes,14,opt,name=an" json:"an,omitempty"` + Dur *duration.Duration `protobuf:"bytes,1,opt,name=dur" json:"dur,omitempty"` + St *_struct.Struct `protobuf:"bytes,12,opt,name=st" json:"st,omitempty"` + Ts *timestamp.Timestamp `protobuf:"bytes,2,opt,name=ts" json:"ts,omitempty"` + Lv *_struct.ListValue `protobuf:"bytes,15,opt,name=lv" json:"lv,omitempty"` + Val *_struct.Value `protobuf:"bytes,16,opt,name=val" json:"val,omitempty"` + Dbl *wrappers.DoubleValue `protobuf:"bytes,3,opt,name=dbl" json:"dbl,omitempty"` + Flt *wrappers.FloatValue `protobuf:"bytes,4,opt,name=flt" json:"flt,omitempty"` + I64 *wrappers.Int64Value `protobuf:"bytes,5,opt,name=i64" json:"i64,omitempty"` + U64 *wrappers.UInt64Value `protobuf:"bytes,6,opt,name=u64" json:"u64,omitempty"` + I32 *wrappers.Int32Value `protobuf:"bytes,7,opt,name=i32" json:"i32,omitempty"` + U32 *wrappers.UInt32Value `protobuf:"bytes,8,opt,name=u32" json:"u32,omitempty"` + Bool *wrappers.BoolValue `protobuf:"bytes,9,opt,name=bool" json:"bool,omitempty"` + Str *wrappers.StringValue `protobuf:"bytes,10,opt,name=str" json:"str,omitempty"` + Bytes *wrappers.BytesValue `protobuf:"bytes,11,opt,name=bytes" json:"bytes,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *KnownTypes) Reset() { *m = KnownTypes{} } +func (m *KnownTypes) String() string { return proto.CompactTextString(m) } +func (*KnownTypes) ProtoMessage() {} +func (*KnownTypes) Descriptor() ([]byte, []int) { + return fileDescriptor_test_objects_c6f6c615ab823e65, []int{8} +} +func (m *KnownTypes) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_KnownTypes.Unmarshal(m, b) +} +func (m *KnownTypes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_KnownTypes.Marshal(b, m, deterministic) +} +func (dst *KnownTypes) XXX_Merge(src proto.Message) { + xxx_messageInfo_KnownTypes.Merge(dst, src) +} +func (m *KnownTypes) XXX_Size() int { + return xxx_messageInfo_KnownTypes.Size(m) +} +func (m *KnownTypes) XXX_DiscardUnknown() { + xxx_messageInfo_KnownTypes.DiscardUnknown(m) +} + +var xxx_messageInfo_KnownTypes proto.InternalMessageInfo + +func (m *KnownTypes) GetAn() *any.Any { + if m != nil { + return m.An + } + return nil +} + +func (m *KnownTypes) GetDur() *duration.Duration { + if m != nil { + return m.Dur + } + return nil +} + +func (m *KnownTypes) GetSt() *_struct.Struct { + if m != nil { + return m.St + } + return nil +} + +func (m *KnownTypes) GetTs() *timestamp.Timestamp { + if m != nil { + return m.Ts + } + return nil +} + +func (m *KnownTypes) GetLv() *_struct.ListValue { + if m != nil { + return m.Lv + } + return nil +} + +func (m *KnownTypes) GetVal() *_struct.Value { + if m != nil { + return m.Val + } + return nil +} + +func (m *KnownTypes) GetDbl() *wrappers.DoubleValue { + if m != nil { + return m.Dbl + } + return nil +} + +func (m *KnownTypes) GetFlt() *wrappers.FloatValue { + if m != nil { + return m.Flt + } + return nil +} + +func (m *KnownTypes) GetI64() *wrappers.Int64Value { + if m != nil { + return m.I64 + } + return nil +} + +func (m *KnownTypes) GetU64() *wrappers.UInt64Value { + if m != nil { + return m.U64 + } + return nil +} + +func (m *KnownTypes) GetI32() *wrappers.Int32Value { + if m != nil { + return m.I32 + } + return nil +} + +func (m *KnownTypes) GetU32() *wrappers.UInt32Value { + if m != nil { + return m.U32 + } + return nil +} + +func (m *KnownTypes) GetBool() *wrappers.BoolValue { + if m != nil { + return m.Bool + } + return nil +} + +func (m *KnownTypes) GetStr() *wrappers.StringValue { + if m != nil { + return m.Str + } + return nil +} + +func (m *KnownTypes) GetBytes() *wrappers.BytesValue { + if m != nil { + return m.Bytes + } + return nil +} + +// Test messages for marshaling/unmarshaling required fields. +type MsgWithRequired struct { + Str *string `protobuf:"bytes,1,req,name=str" json:"str,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MsgWithRequired) Reset() { *m = MsgWithRequired{} } +func (m *MsgWithRequired) String() string { return proto.CompactTextString(m) } +func (*MsgWithRequired) ProtoMessage() {} +func (*MsgWithRequired) Descriptor() ([]byte, []int) { + return fileDescriptor_test_objects_c6f6c615ab823e65, []int{9} +} +func (m *MsgWithRequired) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MsgWithRequired.Unmarshal(m, b) +} +func (m *MsgWithRequired) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MsgWithRequired.Marshal(b, m, deterministic) +} +func (dst *MsgWithRequired) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgWithRequired.Merge(dst, src) +} +func (m *MsgWithRequired) XXX_Size() int { + return xxx_messageInfo_MsgWithRequired.Size(m) +} +func (m *MsgWithRequired) XXX_DiscardUnknown() { + xxx_messageInfo_MsgWithRequired.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgWithRequired proto.InternalMessageInfo + +func (m *MsgWithRequired) GetStr() string { + if m != nil && m.Str != nil { + return *m.Str + } + return "" +} + +type MsgWithIndirectRequired struct { + Subm *MsgWithRequired `protobuf:"bytes,1,opt,name=subm" json:"subm,omitempty"` + MapField map[string]*MsgWithRequired `protobuf:"bytes,2,rep,name=map_field,json=mapField" json:"map_field,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + SliceField []*MsgWithRequired `protobuf:"bytes,3,rep,name=slice_field,json=sliceField" json:"slice_field,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MsgWithIndirectRequired) Reset() { *m = MsgWithIndirectRequired{} } +func (m *MsgWithIndirectRequired) String() string { return proto.CompactTextString(m) } +func (*MsgWithIndirectRequired) ProtoMessage() {} +func (*MsgWithIndirectRequired) Descriptor() ([]byte, []int) { + return fileDescriptor_test_objects_c6f6c615ab823e65, []int{10} +} +func (m *MsgWithIndirectRequired) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MsgWithIndirectRequired.Unmarshal(m, b) +} +func (m *MsgWithIndirectRequired) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MsgWithIndirectRequired.Marshal(b, m, deterministic) +} +func (dst *MsgWithIndirectRequired) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgWithIndirectRequired.Merge(dst, src) +} +func (m *MsgWithIndirectRequired) XXX_Size() int { + return xxx_messageInfo_MsgWithIndirectRequired.Size(m) +} +func (m *MsgWithIndirectRequired) XXX_DiscardUnknown() { + xxx_messageInfo_MsgWithIndirectRequired.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgWithIndirectRequired proto.InternalMessageInfo + +func (m *MsgWithIndirectRequired) GetSubm() *MsgWithRequired { + if m != nil { + return m.Subm + } + return nil +} + +func (m *MsgWithIndirectRequired) GetMapField() map[string]*MsgWithRequired { + if m != nil { + return m.MapField + } + return nil +} + +func (m *MsgWithIndirectRequired) GetSliceField() []*MsgWithRequired { + if m != nil { + return m.SliceField + } + return nil +} + +type MsgWithRequiredBytes struct { + Byts []byte `protobuf:"bytes,1,req,name=byts" json:"byts,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MsgWithRequiredBytes) Reset() { *m = MsgWithRequiredBytes{} } +func (m *MsgWithRequiredBytes) String() string { return proto.CompactTextString(m) } +func (*MsgWithRequiredBytes) ProtoMessage() {} +func (*MsgWithRequiredBytes) Descriptor() ([]byte, []int) { + return fileDescriptor_test_objects_c6f6c615ab823e65, []int{11} +} +func (m *MsgWithRequiredBytes) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MsgWithRequiredBytes.Unmarshal(m, b) +} +func (m *MsgWithRequiredBytes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MsgWithRequiredBytes.Marshal(b, m, deterministic) +} +func (dst *MsgWithRequiredBytes) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgWithRequiredBytes.Merge(dst, src) +} +func (m *MsgWithRequiredBytes) XXX_Size() int { + return xxx_messageInfo_MsgWithRequiredBytes.Size(m) +} +func (m *MsgWithRequiredBytes) XXX_DiscardUnknown() { + xxx_messageInfo_MsgWithRequiredBytes.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgWithRequiredBytes proto.InternalMessageInfo + +func (m *MsgWithRequiredBytes) GetByts() []byte { + if m != nil { + return m.Byts + } + return nil +} + +type MsgWithRequiredWKT struct { + Str *wrappers.StringValue `protobuf:"bytes,1,req,name=str" json:"str,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MsgWithRequiredWKT) Reset() { *m = MsgWithRequiredWKT{} } +func (m *MsgWithRequiredWKT) String() string { return proto.CompactTextString(m) } +func (*MsgWithRequiredWKT) ProtoMessage() {} +func (*MsgWithRequiredWKT) Descriptor() ([]byte, []int) { + return fileDescriptor_test_objects_c6f6c615ab823e65, []int{12} +} +func (m *MsgWithRequiredWKT) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MsgWithRequiredWKT.Unmarshal(m, b) +} +func (m *MsgWithRequiredWKT) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MsgWithRequiredWKT.Marshal(b, m, deterministic) +} +func (dst *MsgWithRequiredWKT) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgWithRequiredWKT.Merge(dst, src) +} +func (m *MsgWithRequiredWKT) XXX_Size() int { + return xxx_messageInfo_MsgWithRequiredWKT.Size(m) +} +func (m *MsgWithRequiredWKT) XXX_DiscardUnknown() { + xxx_messageInfo_MsgWithRequiredWKT.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgWithRequiredWKT proto.InternalMessageInfo + +func (m *MsgWithRequiredWKT) GetStr() *wrappers.StringValue { + if m != nil { + return m.Str + } + return nil +} + +var E_Name = &proto.ExtensionDesc{ + ExtendedType: (*Real)(nil), + ExtensionType: (*string)(nil), + Field: 124, + Name: "jsonpb.name", + Tag: "bytes,124,opt,name=name", + Filename: "test_objects.proto", +} + +var E_Extm = &proto.ExtensionDesc{ + ExtendedType: (*Real)(nil), + ExtensionType: (*MsgWithRequired)(nil), + Field: 125, + Name: "jsonpb.extm", + Tag: "bytes,125,opt,name=extm", + Filename: "test_objects.proto", +} + +func init() { + proto.RegisterType((*Simple)(nil), "jsonpb.Simple") + proto.RegisterType((*NonFinites)(nil), "jsonpb.NonFinites") + proto.RegisterType((*Repeats)(nil), "jsonpb.Repeats") + proto.RegisterType((*Widget)(nil), "jsonpb.Widget") + proto.RegisterType((*Maps)(nil), "jsonpb.Maps") + proto.RegisterMapType((map[bool]*Simple)(nil), "jsonpb.Maps.MBoolSimpleEntry") + proto.RegisterMapType((map[int64]string)(nil), "jsonpb.Maps.MInt64StrEntry") + proto.RegisterType((*MsgWithOneof)(nil), "jsonpb.MsgWithOneof") + proto.RegisterType((*Real)(nil), "jsonpb.Real") + proto.RegisterType((*Complex)(nil), "jsonpb.Complex") + proto.RegisterType((*KnownTypes)(nil), "jsonpb.KnownTypes") + proto.RegisterType((*MsgWithRequired)(nil), "jsonpb.MsgWithRequired") + proto.RegisterType((*MsgWithIndirectRequired)(nil), "jsonpb.MsgWithIndirectRequired") + proto.RegisterMapType((map[string]*MsgWithRequired)(nil), "jsonpb.MsgWithIndirectRequired.MapFieldEntry") + proto.RegisterType((*MsgWithRequiredBytes)(nil), "jsonpb.MsgWithRequiredBytes") + proto.RegisterType((*MsgWithRequiredWKT)(nil), "jsonpb.MsgWithRequiredWKT") + proto.RegisterEnum("jsonpb.Widget_Color", Widget_Color_name, Widget_Color_value) + proto.RegisterExtension(E_Complex_RealExtension) + proto.RegisterExtension(E_Name) + proto.RegisterExtension(E_Extm) +} + +func init() { proto.RegisterFile("test_objects.proto", fileDescriptor_test_objects_c6f6c615ab823e65) } + +var fileDescriptor_test_objects_c6f6c615ab823e65 = []byte{ + // 1357 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x56, 0xdd, 0x72, 0x13, 0xc7, + 0x12, 0xf6, 0xee, 0x6a, 0xf5, 0xd3, 0xf2, 0x1f, 0x83, 0x81, 0xc5, 0x87, 0x73, 0x8e, 0x4a, 0x70, + 0x38, 0x0a, 0xc4, 0xa2, 0x22, 0xbb, 0x5c, 0x84, 0xe4, 0x06, 0x63, 0x13, 0x08, 0xe0, 0xa4, 0xc6, + 0x26, 0x5c, 0xaa, 0x56, 0xde, 0x91, 0x59, 0xb2, 0xbb, 0xa3, 0xcc, 0xcc, 0xda, 0xa8, 0x92, 0x54, + 0xf9, 0x19, 0x52, 0x79, 0x82, 0x54, 0x25, 0x8f, 0x90, 0x8b, 0xbc, 0x45, 0xde, 0x28, 0x35, 0x3d, + 0xb3, 0x5a, 0x59, 0x42, 0x95, 0x5c, 0x79, 0xbb, 0xfb, 0xeb, 0x4f, 0x33, 0xfd, 0xf5, 0x74, 0x1b, + 0x88, 0x62, 0x52, 0xf5, 0xf9, 0xe0, 0x1d, 0x3b, 0x51, 0xb2, 0x3b, 0x12, 0x5c, 0x71, 0x52, 0x7d, + 0x27, 0x79, 0x36, 0x1a, 0x6c, 0xde, 0x3c, 0xe5, 0xfc, 0x34, 0x61, 0x0f, 0xd0, 0x3b, 0xc8, 0x87, + 0x0f, 0xc2, 0x6c, 0x6c, 0x20, 0x9b, 0xff, 0x99, 0x0d, 0x45, 0xb9, 0x08, 0x55, 0xcc, 0x33, 0x1b, + 0xbf, 0x35, 0x1b, 0x97, 0x4a, 0xe4, 0x27, 0xca, 0x46, 0xff, 0x3b, 0x1b, 0x55, 0x71, 0xca, 0xa4, + 0x0a, 0xd3, 0xd1, 0x22, 0xfa, 0x73, 0x11, 0x8e, 0x46, 0x4c, 0xd8, 0x13, 0xb6, 0x7f, 0x75, 0xa1, + 0x7a, 0x14, 0xa7, 0xa3, 0x84, 0x91, 0x6b, 0x50, 0xe5, 0xfd, 0x01, 0xe7, 0x49, 0xe0, 0xb4, 0x9c, + 0x4e, 0x9d, 0xfa, 0x7c, 0x8f, 0xf3, 0x84, 0xdc, 0x80, 0x1a, 0xef, 0xc7, 0x99, 0xda, 0xee, 0x05, + 0x6e, 0xcb, 0xe9, 0xf8, 0xb4, 0xca, 0x9f, 0x6b, 0x6b, 0x12, 0xd8, 0xdd, 0x09, 0xbc, 0x96, 0xd3, + 0xf1, 0x4c, 0x60, 0x77, 0x87, 0xdc, 0x84, 0x3a, 0xef, 0xe7, 0x26, 0xa5, 0xd2, 0x72, 0x3a, 0x2b, + 0xb4, 0xc6, 0x5f, 0xa3, 0x59, 0x86, 0x76, 0x77, 0x02, 0xbf, 0xe5, 0x74, 0x2a, 0x36, 0x54, 0x64, + 0x49, 0x93, 0x55, 0x6d, 0x39, 0x9d, 0x2b, 0xb4, 0xc6, 0x8f, 0xa6, 0xb2, 0xa4, 0xc9, 0xaa, 0xb5, + 0x9c, 0x0e, 0xb1, 0xa1, 0xdd, 0x1d, 0x73, 0x88, 0x61, 0xc2, 0x43, 0x15, 0xd4, 0x5b, 0x4e, 0xc7, + 0xa5, 0x55, 0xfe, 0x54, 0x5b, 0x26, 0x27, 0xe2, 0xf9, 0x20, 0x61, 0x41, 0xa3, 0xe5, 0x74, 0x1c, + 0x5a, 0xe3, 0xfb, 0x68, 0x5a, 0x3a, 0x25, 0xe2, 0xec, 0x34, 0x80, 0x96, 0xd3, 0x69, 0x68, 0x3a, + 0x34, 0x0d, 0xdd, 0x60, 0xac, 0x98, 0x0c, 0x9a, 0x2d, 0xa7, 0xb3, 0x4c, 0xab, 0x7c, 0x4f, 0x5b, + 0xed, 0x9f, 0x1c, 0x80, 0x43, 0x9e, 0x3d, 0x8d, 0xb3, 0x58, 0x31, 0x49, 0xae, 0x82, 0x3f, 0xec, + 0x67, 0x61, 0x86, 0xa5, 0x72, 0x69, 0x65, 0x78, 0x18, 0x66, 0xba, 0x80, 0xc3, 0xfe, 0x28, 0xce, + 0x86, 0x58, 0x28, 0x97, 0xfa, 0xc3, 0xaf, 0xe3, 0x6c, 0x68, 0xdc, 0x99, 0x76, 0x7b, 0xd6, 0x7d, + 0xa8, 0xdd, 0x57, 0xc1, 0x8f, 0x90, 0xa2, 0x82, 0xa7, 0xab, 0x44, 0x96, 0x22, 0x32, 0x14, 0x3e, + 0x7a, 0xfd, 0xa8, 0xa0, 0x88, 0x0c, 0x45, 0xd5, 0xba, 0x35, 0x45, 0xfb, 0x37, 0x17, 0x6a, 0x94, + 0x8d, 0x58, 0xa8, 0xa4, 0x86, 0x88, 0x42, 0x3d, 0x4f, 0xab, 0x27, 0x0a, 0xf5, 0xc4, 0x44, 0x3d, + 0x4f, 0xab, 0x27, 0x26, 0xea, 0x89, 0x89, 0x7a, 0x9e, 0x56, 0x4f, 0x4c, 0xd4, 0x13, 0xa5, 0x7a, + 0x9e, 0x56, 0x4f, 0x94, 0xea, 0x89, 0x52, 0x3d, 0x4f, 0xab, 0x27, 0x4a, 0xf5, 0x44, 0xa9, 0x9e, + 0xa7, 0xd5, 0x13, 0x47, 0x53, 0x59, 0x13, 0xf5, 0x3c, 0xad, 0x9e, 0x28, 0xd5, 0x13, 0x13, 0xf5, + 0x3c, 0xad, 0x9e, 0x98, 0xa8, 0x27, 0x4a, 0xf5, 0x3c, 0xad, 0x9e, 0x28, 0xd5, 0x13, 0xa5, 0x7a, + 0x9e, 0x56, 0x4f, 0x94, 0xea, 0x89, 0x89, 0x7a, 0x9e, 0x56, 0x4f, 0x18, 0xf5, 0x7e, 0x77, 0xa1, + 0xfa, 0x26, 0x8e, 0x4e, 0x99, 0x22, 0xf7, 0xc0, 0x3f, 0xe1, 0x09, 0x17, 0xa8, 0xdc, 0x6a, 0x6f, + 0xa3, 0x6b, 0x9e, 0x68, 0xd7, 0x84, 0xbb, 0x4f, 0x74, 0x8c, 0x1a, 0x08, 0xd9, 0xd2, 0x7c, 0x06, + 0xad, 0x8b, 0xb7, 0x08, 0x5d, 0x15, 0xf8, 0x97, 0xdc, 0x85, 0xaa, 0xc4, 0xa7, 0x84, 0x5d, 0xd5, + 0xec, 0xad, 0x16, 0x68, 0xf3, 0xc0, 0xa8, 0x8d, 0x92, 0x8f, 0x4c, 0x41, 0x10, 0xa9, 0xcf, 0x39, + 0x8f, 0xd4, 0x05, 0xb2, 0xd0, 0x9a, 0x30, 0x02, 0x07, 0x1b, 0xc8, 0xb9, 0x56, 0x20, 0xad, 0xee, + 0xb4, 0x88, 0x93, 0x8f, 0xa1, 0x21, 0xfa, 0x05, 0xf8, 0x1a, 0xd2, 0xce, 0x81, 0xeb, 0xc2, 0x7e, + 0xb5, 0xff, 0x07, 0xbe, 0x39, 0x74, 0x0d, 0x3c, 0x7a, 0xb0, 0xbf, 0xbe, 0x44, 0x1a, 0xe0, 0x7f, + 0x41, 0x0f, 0x0e, 0x0e, 0xd7, 0x1d, 0x52, 0x87, 0xca, 0xde, 0xcb, 0xd7, 0x07, 0xeb, 0x6e, 0xfb, + 0x67, 0x17, 0x2a, 0xaf, 0xc2, 0x91, 0x24, 0x9f, 0x41, 0x33, 0x35, 0xed, 0xa2, 0x6b, 0x8f, 0x3d, + 0xd6, 0xec, 0xfd, 0xab, 0xe0, 0xd7, 0x90, 0xee, 0x2b, 0xec, 0x9f, 0x23, 0x25, 0x0e, 0x32, 0x25, + 0xc6, 0xb4, 0x91, 0x16, 0x36, 0x79, 0x0c, 0x2b, 0x29, 0xf6, 0x66, 0x71, 0x6b, 0x17, 0xd3, 0xff, + 0x7d, 0x39, 0x5d, 0xf7, 0xab, 0xb9, 0xb6, 0x21, 0x68, 0xa6, 0xa5, 0x67, 0xf3, 0x73, 0x58, 0xbd, + 0xcc, 0x4f, 0xd6, 0xc1, 0xfb, 0x96, 0x8d, 0x51, 0x46, 0x8f, 0xea, 0x4f, 0xb2, 0x01, 0xfe, 0x59, + 0x98, 0xe4, 0x0c, 0x9f, 0x5f, 0x83, 0x1a, 0xe3, 0x91, 0xfb, 0xd0, 0xd9, 0x3c, 0x84, 0xf5, 0x59, + 0xfa, 0xe9, 0xfc, 0xba, 0xc9, 0xbf, 0x33, 0x9d, 0x3f, 0x2f, 0x4a, 0xc9, 0xd7, 0xfe, 0xd3, 0x81, + 0xe5, 0x57, 0xf2, 0xf4, 0x4d, 0xac, 0xde, 0x7e, 0x95, 0x31, 0x3e, 0x24, 0xd7, 0xc1, 0x57, 0xb1, + 0x4a, 0x18, 0xd2, 0x35, 0x9e, 0x2d, 0x51, 0x63, 0x92, 0x00, 0xaa, 0x32, 0x4c, 0x42, 0x31, 0x46, + 0x4e, 0xef, 0xd9, 0x12, 0xb5, 0x36, 0xd9, 0x84, 0xda, 0x13, 0x9e, 0xeb, 0x93, 0xe0, 0x58, 0xd0, + 0x39, 0x85, 0x83, 0xdc, 0x86, 0xe5, 0xb7, 0x3c, 0x65, 0xfd, 0x30, 0x8a, 0x04, 0x93, 0x12, 0x27, + 0x84, 0x06, 0x34, 0xb5, 0xf7, 0xb1, 0x71, 0x92, 0x03, 0xb8, 0x92, 0xca, 0xd3, 0xfe, 0x79, 0xac, + 0xde, 0xf6, 0x05, 0xfb, 0x2e, 0x8f, 0x05, 0x8b, 0x70, 0x6a, 0x34, 0x7b, 0x37, 0x26, 0x85, 0x35, + 0x67, 0xa4, 0x36, 0xfc, 0x6c, 0x89, 0xae, 0xa5, 0x97, 0x5d, 0x7b, 0x35, 0xf0, 0xf3, 0x2c, 0xe6, + 0x59, 0xfb, 0x2e, 0x54, 0x28, 0x0b, 0x93, 0xb2, 0x8a, 0x8e, 0x19, 0x35, 0x68, 0xdc, 0xab, 0xd7, + 0xa3, 0xf5, 0x8b, 0x8b, 0x8b, 0x0b, 0xb7, 0x7d, 0xae, 0x0f, 0xae, 0x0b, 0xf2, 0x9e, 0xdc, 0x82, + 0x46, 0x9c, 0x86, 0xa7, 0x71, 0xa6, 0x2f, 0x68, 0xe0, 0xa5, 0xa3, 0x4c, 0xe9, 0xed, 0xc3, 0xaa, + 0x60, 0x61, 0xd2, 0x67, 0xef, 0x15, 0xcb, 0x64, 0xcc, 0x33, 0xb2, 0x5c, 0x76, 0x66, 0x98, 0x04, + 0xdf, 0x5f, 0x6e, 0x6d, 0x4b, 0x4f, 0x57, 0x74, 0xd2, 0x41, 0x91, 0xd3, 0xfe, 0xc3, 0x07, 0x78, + 0x91, 0xf1, 0xf3, 0xec, 0x78, 0x3c, 0x62, 0x92, 0xdc, 0x01, 0x37, 0xcc, 0x82, 0x55, 0x4c, 0xdd, + 0xe8, 0x9a, 0x35, 0xd7, 0x2d, 0xd6, 0x5c, 0xf7, 0x71, 0x36, 0xa6, 0x6e, 0x98, 0x91, 0xfb, 0xe0, + 0x45, 0xb9, 0x79, 0xec, 0xcd, 0xde, 0xcd, 0x39, 0xd8, 0xbe, 0x5d, 0xb6, 0x54, 0xa3, 0xc8, 0xff, + 0xc1, 0x95, 0x2a, 0x58, 0xb6, 0x35, 0x9c, 0xc5, 0x1e, 0xe1, 0xe2, 0xa5, 0xae, 0xd4, 0x43, 0xc4, + 0x55, 0xd2, 0xb6, 0xc9, 0xe6, 0x1c, 0xf0, 0xb8, 0xd8, 0xc1, 0xd4, 0x55, 0x52, 0x63, 0x93, 0xb3, + 0x60, 0x6d, 0x01, 0xf6, 0x65, 0x2c, 0xd5, 0x37, 0xba, 0xc2, 0xd4, 0x4d, 0xce, 0x48, 0x07, 0xbc, + 0xb3, 0x30, 0x09, 0xd6, 0x11, 0x7c, 0x7d, 0x0e, 0x6c, 0x80, 0x1a, 0x42, 0xba, 0xe0, 0x45, 0x83, + 0x04, 0x5b, 0xa7, 0xd9, 0xbb, 0x35, 0x7f, 0x2f, 0x9c, 0x95, 0x16, 0x1f, 0x0d, 0x12, 0xb2, 0x05, + 0xde, 0x30, 0x51, 0xd8, 0x49, 0xfa, 0xdd, 0xce, 0xe2, 0x71, 0xea, 0x5a, 0xf8, 0x30, 0x51, 0x1a, + 0x1e, 0xdb, 0x15, 0xfd, 0x21, 0x38, 0xbe, 0x44, 0x0b, 0x8f, 0x77, 0x77, 0xf4, 0x69, 0xf2, 0xdd, + 0x1d, 0x5c, 0x4e, 0x1f, 0x3a, 0xcd, 0xeb, 0x69, 0x7c, 0xbe, 0xbb, 0x83, 0xf4, 0xdb, 0x3d, 0xdc, + 0xe5, 0x0b, 0xe8, 0xb7, 0x7b, 0x05, 0xfd, 0x76, 0x0f, 0xe9, 0xb7, 0x7b, 0xb8, 0xe0, 0x17, 0xd1, + 0x4f, 0xf0, 0x39, 0xe2, 0x2b, 0xb8, 0x09, 0x1b, 0x0b, 0x8a, 0xae, 0x47, 0x81, 0x81, 0x23, 0x4e, + 0xf3, 0xeb, 0xa1, 0x06, 0x0b, 0xf8, 0xcd, 0x76, 0xb1, 0xfc, 0x52, 0x09, 0xf2, 0x09, 0xf8, 0xe5, + 0xff, 0x08, 0x1f, 0xba, 0x00, 0x6e, 0x1d, 0x93, 0x60, 0x90, 0xed, 0xdb, 0xb0, 0x36, 0xf3, 0x18, + 0xf5, 0x00, 0x32, 0xa3, 0xd4, 0xed, 0x34, 0x90, 0xb7, 0xfd, 0x8b, 0x0b, 0x37, 0x2c, 0xea, 0x79, + 0x16, 0xc5, 0x82, 0x9d, 0xa8, 0x09, 0xfa, 0x3e, 0x54, 0x64, 0x3e, 0x48, 0x6d, 0x27, 0x2f, 0x7a, + 0xe1, 0x14, 0x41, 0xe4, 0x4b, 0x68, 0xa4, 0xe1, 0xa8, 0x3f, 0x8c, 0x59, 0x12, 0xd9, 0x61, 0xbb, + 0x35, 0x93, 0x31, 0xfb, 0x03, 0x7a, 0x08, 0x3f, 0xd5, 0x78, 0x33, 0x7c, 0xeb, 0xa9, 0x35, 0xc9, + 0x43, 0x68, 0xca, 0x24, 0x3e, 0x61, 0x96, 0xcd, 0x43, 0xb6, 0x85, 0xbf, 0x0f, 0x88, 0xc5, 0xcc, + 0xcd, 0x63, 0x58, 0xb9, 0x44, 0x3a, 0x3d, 0x72, 0x1b, 0x66, 0xe4, 0x6e, 0x5d, 0x1e, 0xb9, 0x0b, + 0x69, 0xa7, 0x66, 0xef, 0x3d, 0xd8, 0x98, 0x89, 0x62, 0xb5, 0x09, 0x81, 0xca, 0x60, 0xac, 0x24, + 0xd6, 0x73, 0x99, 0xe2, 0x77, 0x7b, 0x1f, 0xc8, 0x0c, 0xf6, 0xcd, 0x8b, 0xe3, 0x42, 0x6e, 0x0d, + 0xfc, 0x27, 0x72, 0x3f, 0x6a, 0x41, 0x25, 0x0b, 0x53, 0x36, 0x33, 0xb4, 0x7e, 0xc0, 0x5b, 0x60, + 0xe4, 0xd1, 0xa7, 0x50, 0x61, 0xef, 0x55, 0x3a, 0x83, 0xf8, 0xf1, 0x6f, 0xa4, 0xd2, 0x29, 0x7f, + 0x05, 0x00, 0x00, 0xff, 0xff, 0xea, 0x06, 0x1a, 0xa9, 0x37, 0x0c, 0x00, 0x00, +} diff --git a/api/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/test_objects.proto b/api/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/test_objects.proto new file mode 100644 index 0000000..36eb6e8 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/test_objects.proto @@ -0,0 +1,171 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2015 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto2"; + +import "google/protobuf/any.proto"; +import "google/protobuf/duration.proto"; +import "google/protobuf/struct.proto"; +import "google/protobuf/timestamp.proto"; +import "google/protobuf/wrappers.proto"; + +package jsonpb; + +// Test message for holding primitive types. +message Simple { + optional bool o_bool = 1; + optional int32 o_int32 = 2; + optional int64 o_int64 = 3; + optional uint32 o_uint32 = 4; + optional uint64 o_uint64 = 5; + optional sint32 o_sint32 = 6; + optional sint64 o_sint64 = 7; + optional float o_float = 8; + optional double o_double = 9; + optional string o_string = 10; + optional bytes o_bytes = 11; +} + +// Test message for holding special non-finites primitives. +message NonFinites { + optional float f_nan = 1; + optional float f_pinf = 2; + optional float f_ninf = 3; + optional double d_nan = 4; + optional double d_pinf = 5; + optional double d_ninf = 6; +} + +// Test message for holding repeated primitives. +message Repeats { + repeated bool r_bool = 1; + repeated int32 r_int32 = 2; + repeated int64 r_int64 = 3; + repeated uint32 r_uint32 = 4; + repeated uint64 r_uint64 = 5; + repeated sint32 r_sint32 = 6; + repeated sint64 r_sint64 = 7; + repeated float r_float = 8; + repeated double r_double = 9; + repeated string r_string = 10; + repeated bytes r_bytes = 11; +} + +// Test message for holding enums and nested messages. +message Widget { + enum Color { + RED = 0; + GREEN = 1; + BLUE = 2; + }; + optional Color color = 1; + repeated Color r_color = 2; + + optional Simple simple = 10; + repeated Simple r_simple = 11; + + optional Repeats repeats = 20; + repeated Repeats r_repeats = 21; +} + +message Maps { + map m_int64_str = 1; + map m_bool_simple = 2; +} + +message MsgWithOneof { + oneof union { + string title = 1; + int64 salary = 2; + string Country = 3; + string home_address = 4; + MsgWithRequired msg_with_required = 5; + } +} + +message Real { + optional double value = 1; + extensions 100 to max; +} + +extend Real { + optional string name = 124; +} + +message Complex { + extend Real { + optional Complex real_extension = 123; + } + optional double imaginary = 1; + extensions 100 to max; +} + +message KnownTypes { + optional google.protobuf.Any an = 14; + optional google.protobuf.Duration dur = 1; + optional google.protobuf.Struct st = 12; + optional google.protobuf.Timestamp ts = 2; + optional google.protobuf.ListValue lv = 15; + optional google.protobuf.Value val = 16; + + optional google.protobuf.DoubleValue dbl = 3; + optional google.protobuf.FloatValue flt = 4; + optional google.protobuf.Int64Value i64 = 5; + optional google.protobuf.UInt64Value u64 = 6; + optional google.protobuf.Int32Value i32 = 7; + optional google.protobuf.UInt32Value u32 = 8; + optional google.protobuf.BoolValue bool = 9; + optional google.protobuf.StringValue str = 10; + optional google.protobuf.BytesValue bytes = 11; +} + +// Test messages for marshaling/unmarshaling required fields. +message MsgWithRequired { + required string str = 1; +} + +message MsgWithIndirectRequired { + optional MsgWithRequired subm = 1; + map map_field = 2; + repeated MsgWithRequired slice_field = 3; +} + +message MsgWithRequiredBytes { + required bytes byts = 1; +} + +message MsgWithRequiredWKT { + required google.protobuf.StringValue str = 1; +} + +extend Real { + optional MsgWithRequired extm = 125; +} diff --git a/api/vendor/github.com/golang/protobuf/proto/all_test.go b/api/vendor/github.com/golang/protobuf/proto/all_test.go new file mode 100644 index 0000000..361f72f --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/proto/all_test.go @@ -0,0 +1,2410 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package proto_test + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "math" + "math/rand" + "reflect" + "runtime/debug" + "strings" + "sync" + "testing" + "time" + + . "github.com/golang/protobuf/proto" + . "github.com/golang/protobuf/proto/test_proto" +) + +var globalO *Buffer + +func old() *Buffer { + if globalO == nil { + globalO = NewBuffer(nil) + } + globalO.Reset() + return globalO +} + +func equalbytes(b1, b2 []byte, t *testing.T) { + if len(b1) != len(b2) { + t.Errorf("wrong lengths: 2*%d != %d", len(b1), len(b2)) + return + } + for i := 0; i < len(b1); i++ { + if b1[i] != b2[i] { + t.Errorf("bad byte[%d]:%x %x: %s %s", i, b1[i], b2[i], b1, b2) + } + } +} + +func initGoTestField() *GoTestField { + f := new(GoTestField) + f.Label = String("label") + f.Type = String("type") + return f +} + +// These are all structurally equivalent but the tag numbers differ. +// (It's remarkable that required, optional, and repeated all have +// 8 letters.) +func initGoTest_RequiredGroup() *GoTest_RequiredGroup { + return &GoTest_RequiredGroup{ + RequiredField: String("required"), + } +} + +func initGoTest_OptionalGroup() *GoTest_OptionalGroup { + return &GoTest_OptionalGroup{ + RequiredField: String("optional"), + } +} + +func initGoTest_RepeatedGroup() *GoTest_RepeatedGroup { + return &GoTest_RepeatedGroup{ + RequiredField: String("repeated"), + } +} + +func initGoTest(setdefaults bool) *GoTest { + pb := new(GoTest) + if setdefaults { + pb.F_BoolDefaulted = Bool(Default_GoTest_F_BoolDefaulted) + pb.F_Int32Defaulted = Int32(Default_GoTest_F_Int32Defaulted) + pb.F_Int64Defaulted = Int64(Default_GoTest_F_Int64Defaulted) + pb.F_Fixed32Defaulted = Uint32(Default_GoTest_F_Fixed32Defaulted) + pb.F_Fixed64Defaulted = Uint64(Default_GoTest_F_Fixed64Defaulted) + pb.F_Uint32Defaulted = Uint32(Default_GoTest_F_Uint32Defaulted) + pb.F_Uint64Defaulted = Uint64(Default_GoTest_F_Uint64Defaulted) + pb.F_FloatDefaulted = Float32(Default_GoTest_F_FloatDefaulted) + pb.F_DoubleDefaulted = Float64(Default_GoTest_F_DoubleDefaulted) + pb.F_StringDefaulted = String(Default_GoTest_F_StringDefaulted) + pb.F_BytesDefaulted = Default_GoTest_F_BytesDefaulted + pb.F_Sint32Defaulted = Int32(Default_GoTest_F_Sint32Defaulted) + pb.F_Sint64Defaulted = Int64(Default_GoTest_F_Sint64Defaulted) + pb.F_Sfixed32Defaulted = Int32(Default_GoTest_F_Sfixed32Defaulted) + pb.F_Sfixed64Defaulted = Int64(Default_GoTest_F_Sfixed64Defaulted) + } + + pb.Kind = GoTest_TIME.Enum() + pb.RequiredField = initGoTestField() + pb.F_BoolRequired = Bool(true) + pb.F_Int32Required = Int32(3) + pb.F_Int64Required = Int64(6) + pb.F_Fixed32Required = Uint32(32) + pb.F_Fixed64Required = Uint64(64) + pb.F_Uint32Required = Uint32(3232) + pb.F_Uint64Required = Uint64(6464) + pb.F_FloatRequired = Float32(3232) + pb.F_DoubleRequired = Float64(6464) + pb.F_StringRequired = String("string") + pb.F_BytesRequired = []byte("bytes") + pb.F_Sint32Required = Int32(-32) + pb.F_Sint64Required = Int64(-64) + pb.F_Sfixed32Required = Int32(-32) + pb.F_Sfixed64Required = Int64(-64) + pb.Requiredgroup = initGoTest_RequiredGroup() + + return pb +} + +func hex(c uint8) uint8 { + if '0' <= c && c <= '9' { + return c - '0' + } + if 'a' <= c && c <= 'f' { + return 10 + c - 'a' + } + if 'A' <= c && c <= 'F' { + return 10 + c - 'A' + } + return 0 +} + +func equal(b []byte, s string, t *testing.T) bool { + if 2*len(b) != len(s) { + // fail(fmt.Sprintf("wrong lengths: 2*%d != %d", len(b), len(s)), b, s, t) + fmt.Printf("wrong lengths: 2*%d != %d\n", len(b), len(s)) + return false + } + for i, j := 0, 0; i < len(b); i, j = i+1, j+2 { + x := hex(s[j])*16 + hex(s[j+1]) + if b[i] != x { + // fail(fmt.Sprintf("bad byte[%d]:%x %x", i, b[i], x), b, s, t) + fmt.Printf("bad byte[%d]:%x %x", i, b[i], x) + return false + } + } + return true +} + +func overify(t *testing.T, pb *GoTest, expected string) { + o := old() + err := o.Marshal(pb) + if err != nil { + fmt.Printf("overify marshal-1 err = %v", err) + o.DebugPrint("", o.Bytes()) + t.Fatalf("expected = %s", expected) + } + if !equal(o.Bytes(), expected, t) { + o.DebugPrint("overify neq 1", o.Bytes()) + t.Fatalf("expected = %s", expected) + } + + // Now test Unmarshal by recreating the original buffer. + pbd := new(GoTest) + err = o.Unmarshal(pbd) + if err != nil { + t.Fatalf("overify unmarshal err = %v", err) + o.DebugPrint("", o.Bytes()) + t.Fatalf("string = %s", expected) + } + o.Reset() + err = o.Marshal(pbd) + if err != nil { + t.Errorf("overify marshal-2 err = %v", err) + o.DebugPrint("", o.Bytes()) + t.Fatalf("string = %s", expected) + } + if !equal(o.Bytes(), expected, t) { + o.DebugPrint("overify neq 2", o.Bytes()) + t.Fatalf("string = %s", expected) + } +} + +// Simple tests for numeric encode/decode primitives (varint, etc.) +func TestNumericPrimitives(t *testing.T) { + for i := uint64(0); i < 1e6; i += 111 { + o := old() + if o.EncodeVarint(i) != nil { + t.Error("EncodeVarint") + break + } + x, e := o.DecodeVarint() + if e != nil { + t.Fatal("DecodeVarint") + } + if x != i { + t.Fatal("varint decode fail:", i, x) + } + + o = old() + if o.EncodeFixed32(i) != nil { + t.Fatal("encFixed32") + } + x, e = o.DecodeFixed32() + if e != nil { + t.Fatal("decFixed32") + } + if x != i { + t.Fatal("fixed32 decode fail:", i, x) + } + + o = old() + if o.EncodeFixed64(i*1234567) != nil { + t.Error("encFixed64") + break + } + x, e = o.DecodeFixed64() + if e != nil { + t.Error("decFixed64") + break + } + if x != i*1234567 { + t.Error("fixed64 decode fail:", i*1234567, x) + break + } + + o = old() + i32 := int32(i - 12345) + if o.EncodeZigzag32(uint64(i32)) != nil { + t.Fatal("EncodeZigzag32") + } + x, e = o.DecodeZigzag32() + if e != nil { + t.Fatal("DecodeZigzag32") + } + if x != uint64(uint32(i32)) { + t.Fatal("zigzag32 decode fail:", i32, x) + } + + o = old() + i64 := int64(i - 12345) + if o.EncodeZigzag64(uint64(i64)) != nil { + t.Fatal("EncodeZigzag64") + } + x, e = o.DecodeZigzag64() + if e != nil { + t.Fatal("DecodeZigzag64") + } + if x != uint64(i64) { + t.Fatal("zigzag64 decode fail:", i64, x) + } + } +} + +// fakeMarshaler is a simple struct implementing Marshaler and Message interfaces. +type fakeMarshaler struct { + b []byte + err error +} + +func (f *fakeMarshaler) Marshal() ([]byte, error) { return f.b, f.err } +func (f *fakeMarshaler) String() string { return fmt.Sprintf("Bytes: %v Error: %v", f.b, f.err) } +func (f *fakeMarshaler) ProtoMessage() {} +func (f *fakeMarshaler) Reset() {} + +type msgWithFakeMarshaler struct { + M *fakeMarshaler `protobuf:"bytes,1,opt,name=fake"` +} + +func (m *msgWithFakeMarshaler) String() string { return CompactTextString(m) } +func (m *msgWithFakeMarshaler) ProtoMessage() {} +func (m *msgWithFakeMarshaler) Reset() {} + +// Simple tests for proto messages that implement the Marshaler interface. +func TestMarshalerEncoding(t *testing.T) { + tests := []struct { + name string + m Message + want []byte + errType reflect.Type + }{ + { + name: "Marshaler that fails", + m: &fakeMarshaler{ + err: errors.New("some marshal err"), + b: []byte{5, 6, 7}, + }, + // Since the Marshal method returned bytes, they should be written to the + // buffer. (For efficiency, we assume that Marshal implementations are + // always correct w.r.t. RequiredNotSetError and output.) + want: []byte{5, 6, 7}, + errType: reflect.TypeOf(errors.New("some marshal err")), + }, + { + name: "Marshaler that fails with RequiredNotSetError", + m: &msgWithFakeMarshaler{ + M: &fakeMarshaler{ + err: &RequiredNotSetError{}, + b: []byte{5, 6, 7}, + }, + }, + // Since there's an error that can be continued after, + // the buffer should be written. + want: []byte{ + 10, 3, // for &msgWithFakeMarshaler + 5, 6, 7, // for &fakeMarshaler + }, + errType: reflect.TypeOf(&RequiredNotSetError{}), + }, + { + name: "Marshaler that succeeds", + m: &fakeMarshaler{ + b: []byte{0, 1, 2, 3, 4, 127, 255}, + }, + want: []byte{0, 1, 2, 3, 4, 127, 255}, + }, + } + for _, test := range tests { + b := NewBuffer(nil) + err := b.Marshal(test.m) + if reflect.TypeOf(err) != test.errType { + t.Errorf("%s: got err %T(%v) wanted %T", test.name, err, err, test.errType) + } + if !reflect.DeepEqual(test.want, b.Bytes()) { + t.Errorf("%s: got bytes %v wanted %v", test.name, b.Bytes(), test.want) + } + if size := Size(test.m); size != len(b.Bytes()) { + t.Errorf("%s: Size(_) = %v, but marshaled to %v bytes", test.name, size, len(b.Bytes())) + } + + m, mErr := Marshal(test.m) + if !bytes.Equal(b.Bytes(), m) { + t.Errorf("%s: Marshal returned %v, but (*Buffer).Marshal wrote %v", test.name, m, b.Bytes()) + } + if !reflect.DeepEqual(err, mErr) { + t.Errorf("%s: Marshal err = %q, but (*Buffer).Marshal returned %q", + test.name, fmt.Sprint(mErr), fmt.Sprint(err)) + } + } +} + +// Ensure that Buffer.Marshal uses O(N) memory for N messages +func TestBufferMarshalAllocs(t *testing.T) { + value := &OtherMessage{Key: Int64(1)} + msg := &MyMessage{Count: Int32(1), Others: []*OtherMessage{value}} + + reallocSize := func(t *testing.T, items int, prealloc int) (int64, int64) { + var b Buffer + b.SetBuf(make([]byte, 0, prealloc)) + + var allocSpace int64 + prevCap := cap(b.Bytes()) + for i := 0; i < items; i++ { + err := b.Marshal(msg) + if err != nil { + t.Errorf("Marshal err = %q", err) + break + } + if c := cap(b.Bytes()); prevCap != c { + allocSpace += int64(c) + prevCap = c + } + } + needSpace := int64(len(b.Bytes())) + return allocSpace, needSpace + } + + for _, prealloc := range []int{0, 100, 10000} { + for _, items := range []int{1, 2, 5, 10, 20, 50, 100, 200, 500, 1000} { + runtimeSpace, need := reallocSize(t, items, prealloc) + totalSpace := int64(prealloc) + runtimeSpace + + runtimeRatio := float64(runtimeSpace) / float64(need) + totalRatio := float64(totalSpace) / float64(need) + + if totalRatio < 1 || runtimeRatio > 4 { + t.Errorf("needed %dB, allocated %dB total (ratio %.1f), allocated %dB at runtime (ratio %.1f)", + need, totalSpace, totalRatio, runtimeSpace, runtimeRatio) + } + } + } +} + +// Simple tests for bytes +func TestBytesPrimitives(t *testing.T) { + o := old() + bytes := []byte{'n', 'o', 'w', ' ', 'i', 's', ' ', 't', 'h', 'e', ' ', 't', 'i', 'm', 'e'} + if o.EncodeRawBytes(bytes) != nil { + t.Error("EncodeRawBytes") + } + decb, e := o.DecodeRawBytes(false) + if e != nil { + t.Error("DecodeRawBytes") + } + equalbytes(bytes, decb, t) +} + +// Simple tests for strings +func TestStringPrimitives(t *testing.T) { + o := old() + s := "now is the time" + if o.EncodeStringBytes(s) != nil { + t.Error("enc_string") + } + decs, e := o.DecodeStringBytes() + if e != nil { + t.Error("dec_string") + } + if s != decs { + t.Error("string encode/decode fail:", s, decs) + } +} + +// Do we catch the "required bit not set" case? +func TestRequiredBit(t *testing.T) { + o := old() + pb := new(GoTest) + err := o.Marshal(pb) + if err == nil { + t.Error("did not catch missing required fields") + } else if !strings.Contains(err.Error(), "Kind") { + t.Error("wrong error type:", err) + } +} + +// Check that all fields are nil. +// Clearly silly, and a residue from a more interesting test with an earlier, +// different initialization property, but it once caught a compiler bug so +// it lives. +func checkInitialized(pb *GoTest, t *testing.T) { + if pb.F_BoolDefaulted != nil { + t.Error("New or Reset did not set boolean:", *pb.F_BoolDefaulted) + } + if pb.F_Int32Defaulted != nil { + t.Error("New or Reset did not set int32:", *pb.F_Int32Defaulted) + } + if pb.F_Int64Defaulted != nil { + t.Error("New or Reset did not set int64:", *pb.F_Int64Defaulted) + } + if pb.F_Fixed32Defaulted != nil { + t.Error("New or Reset did not set fixed32:", *pb.F_Fixed32Defaulted) + } + if pb.F_Fixed64Defaulted != nil { + t.Error("New or Reset did not set fixed64:", *pb.F_Fixed64Defaulted) + } + if pb.F_Uint32Defaulted != nil { + t.Error("New or Reset did not set uint32:", *pb.F_Uint32Defaulted) + } + if pb.F_Uint64Defaulted != nil { + t.Error("New or Reset did not set uint64:", *pb.F_Uint64Defaulted) + } + if pb.F_FloatDefaulted != nil { + t.Error("New or Reset did not set float:", *pb.F_FloatDefaulted) + } + if pb.F_DoubleDefaulted != nil { + t.Error("New or Reset did not set double:", *pb.F_DoubleDefaulted) + } + if pb.F_StringDefaulted != nil { + t.Error("New or Reset did not set string:", *pb.F_StringDefaulted) + } + if pb.F_BytesDefaulted != nil { + t.Error("New or Reset did not set bytes:", string(pb.F_BytesDefaulted)) + } + if pb.F_Sint32Defaulted != nil { + t.Error("New or Reset did not set int32:", *pb.F_Sint32Defaulted) + } + if pb.F_Sint64Defaulted != nil { + t.Error("New or Reset did not set int64:", *pb.F_Sint64Defaulted) + } +} + +// Does Reset() reset? +func TestReset(t *testing.T) { + pb := initGoTest(true) + // muck with some values + pb.F_BoolDefaulted = Bool(false) + pb.F_Int32Defaulted = Int32(237) + pb.F_Int64Defaulted = Int64(12346) + pb.F_Fixed32Defaulted = Uint32(32000) + pb.F_Fixed64Defaulted = Uint64(666) + pb.F_Uint32Defaulted = Uint32(323232) + pb.F_Uint64Defaulted = nil + pb.F_FloatDefaulted = nil + pb.F_DoubleDefaulted = Float64(0) + pb.F_StringDefaulted = String("gotcha") + pb.F_BytesDefaulted = []byte("asdfasdf") + pb.F_Sint32Defaulted = Int32(123) + pb.F_Sint64Defaulted = Int64(789) + pb.Reset() + checkInitialized(pb, t) +} + +// All required fields set, no defaults provided. +func TestEncodeDecode1(t *testing.T) { + pb := initGoTest(false) + overify(t, pb, + "0807"+ // field 1, encoding 0, value 7 + "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) + "5001"+ // field 10, encoding 0, value 1 + "5803"+ // field 11, encoding 0, value 3 + "6006"+ // field 12, encoding 0, value 6 + "6d20000000"+ // field 13, encoding 5, value 0x20 + "714000000000000000"+ // field 14, encoding 1, value 0x40 + "78a019"+ // field 15, encoding 0, value 0xca0 = 3232 + "8001c032"+ // field 16, encoding 0, value 0x1940 = 6464 + "8d0100004a45"+ // field 17, encoding 5, value 3232.0 + "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 + "9a0106"+"737472696e67"+ // field 19, encoding 2, string "string" + "b304"+ // field 70, encoding 3, start group + "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" + "b404"+ // field 70, encoding 4, end group + "aa0605"+"6279746573"+ // field 101, encoding 2, string "bytes" + "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 + "b8067f"+ // field 103, encoding 0, 0x7f zigzag64 + "c506e0ffffff"+ // field 104, encoding 5, -32 fixed32 + "c906c0ffffffffffffff") // field 105, encoding 1, -64 fixed64 +} + +// All required fields set, defaults provided. +func TestEncodeDecode2(t *testing.T) { + pb := initGoTest(true) + overify(t, pb, + "0807"+ // field 1, encoding 0, value 7 + "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) + "5001"+ // field 10, encoding 0, value 1 + "5803"+ // field 11, encoding 0, value 3 + "6006"+ // field 12, encoding 0, value 6 + "6d20000000"+ // field 13, encoding 5, value 32 + "714000000000000000"+ // field 14, encoding 1, value 64 + "78a019"+ // field 15, encoding 0, value 3232 + "8001c032"+ // field 16, encoding 0, value 6464 + "8d0100004a45"+ // field 17, encoding 5, value 3232.0 + "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 + "9a0106"+"737472696e67"+ // field 19, encoding 2 string "string" + "c00201"+ // field 40, encoding 0, value 1 + "c80220"+ // field 41, encoding 0, value 32 + "d00240"+ // field 42, encoding 0, value 64 + "dd0240010000"+ // field 43, encoding 5, value 320 + "e1028002000000000000"+ // field 44, encoding 1, value 640 + "e8028019"+ // field 45, encoding 0, value 3200 + "f0028032"+ // field 46, encoding 0, value 6400 + "fd02e0659948"+ // field 47, encoding 5, value 314159.0 + "81030000000050971041"+ // field 48, encoding 1, value 271828.0 + "8a0310"+"68656c6c6f2c2022776f726c6421220a"+ // field 49, encoding 2 string "hello, \"world!\"\n" + "b304"+ // start group field 70 level 1 + "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" + "b404"+ // end group field 70 level 1 + "aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes" + "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 + "b8067f"+ // field 103, encoding 0, 0x7f zigzag64 + "c506e0ffffff"+ // field 104, encoding 5, -32 fixed32 + "c906c0ffffffffffffff"+ // field 105, encoding 1, -64 fixed64 + "8a1907"+"4269676e6f7365"+ // field 401, encoding 2, string "Bignose" + "90193f"+ // field 402, encoding 0, value 63 + "98197f"+ // field 403, encoding 0, value 127 + "a519e0ffffff"+ // field 404, encoding 5, -32 fixed32 + "a919c0ffffffffffffff") // field 405, encoding 1, -64 fixed64 + +} + +// All default fields set to their default value by hand +func TestEncodeDecode3(t *testing.T) { + pb := initGoTest(false) + pb.F_BoolDefaulted = Bool(true) + pb.F_Int32Defaulted = Int32(32) + pb.F_Int64Defaulted = Int64(64) + pb.F_Fixed32Defaulted = Uint32(320) + pb.F_Fixed64Defaulted = Uint64(640) + pb.F_Uint32Defaulted = Uint32(3200) + pb.F_Uint64Defaulted = Uint64(6400) + pb.F_FloatDefaulted = Float32(314159) + pb.F_DoubleDefaulted = Float64(271828) + pb.F_StringDefaulted = String("hello, \"world!\"\n") + pb.F_BytesDefaulted = []byte("Bignose") + pb.F_Sint32Defaulted = Int32(-32) + pb.F_Sint64Defaulted = Int64(-64) + pb.F_Sfixed32Defaulted = Int32(-32) + pb.F_Sfixed64Defaulted = Int64(-64) + + overify(t, pb, + "0807"+ // field 1, encoding 0, value 7 + "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) + "5001"+ // field 10, encoding 0, value 1 + "5803"+ // field 11, encoding 0, value 3 + "6006"+ // field 12, encoding 0, value 6 + "6d20000000"+ // field 13, encoding 5, value 32 + "714000000000000000"+ // field 14, encoding 1, value 64 + "78a019"+ // field 15, encoding 0, value 3232 + "8001c032"+ // field 16, encoding 0, value 6464 + "8d0100004a45"+ // field 17, encoding 5, value 3232.0 + "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 + "9a0106"+"737472696e67"+ // field 19, encoding 2 string "string" + "c00201"+ // field 40, encoding 0, value 1 + "c80220"+ // field 41, encoding 0, value 32 + "d00240"+ // field 42, encoding 0, value 64 + "dd0240010000"+ // field 43, encoding 5, value 320 + "e1028002000000000000"+ // field 44, encoding 1, value 640 + "e8028019"+ // field 45, encoding 0, value 3200 + "f0028032"+ // field 46, encoding 0, value 6400 + "fd02e0659948"+ // field 47, encoding 5, value 314159.0 + "81030000000050971041"+ // field 48, encoding 1, value 271828.0 + "8a0310"+"68656c6c6f2c2022776f726c6421220a"+ // field 49, encoding 2 string "hello, \"world!\"\n" + "b304"+ // start group field 70 level 1 + "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" + "b404"+ // end group field 70 level 1 + "aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes" + "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 + "b8067f"+ // field 103, encoding 0, 0x7f zigzag64 + "c506e0ffffff"+ // field 104, encoding 5, -32 fixed32 + "c906c0ffffffffffffff"+ // field 105, encoding 1, -64 fixed64 + "8a1907"+"4269676e6f7365"+ // field 401, encoding 2, string "Bignose" + "90193f"+ // field 402, encoding 0, value 63 + "98197f"+ // field 403, encoding 0, value 127 + "a519e0ffffff"+ // field 404, encoding 5, -32 fixed32 + "a919c0ffffffffffffff") // field 405, encoding 1, -64 fixed64 + +} + +// All required fields set, defaults provided, all non-defaulted optional fields have values. +func TestEncodeDecode4(t *testing.T) { + pb := initGoTest(true) + pb.Table = String("hello") + pb.Param = Int32(7) + pb.OptionalField = initGoTestField() + pb.F_BoolOptional = Bool(true) + pb.F_Int32Optional = Int32(32) + pb.F_Int64Optional = Int64(64) + pb.F_Fixed32Optional = Uint32(3232) + pb.F_Fixed64Optional = Uint64(6464) + pb.F_Uint32Optional = Uint32(323232) + pb.F_Uint64Optional = Uint64(646464) + pb.F_FloatOptional = Float32(32.) + pb.F_DoubleOptional = Float64(64.) + pb.F_StringOptional = String("hello") + pb.F_BytesOptional = []byte("Bignose") + pb.F_Sint32Optional = Int32(-32) + pb.F_Sint64Optional = Int64(-64) + pb.F_Sfixed32Optional = Int32(-32) + pb.F_Sfixed64Optional = Int64(-64) + pb.Optionalgroup = initGoTest_OptionalGroup() + + overify(t, pb, + "0807"+ // field 1, encoding 0, value 7 + "1205"+"68656c6c6f"+ // field 2, encoding 2, string "hello" + "1807"+ // field 3, encoding 0, value 7 + "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) + "320d"+"0a056c6162656c120474797065"+ // field 6, encoding 2 (GoTestField) + "5001"+ // field 10, encoding 0, value 1 + "5803"+ // field 11, encoding 0, value 3 + "6006"+ // field 12, encoding 0, value 6 + "6d20000000"+ // field 13, encoding 5, value 32 + "714000000000000000"+ // field 14, encoding 1, value 64 + "78a019"+ // field 15, encoding 0, value 3232 + "8001c032"+ // field 16, encoding 0, value 6464 + "8d0100004a45"+ // field 17, encoding 5, value 3232.0 + "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 + "9a0106"+"737472696e67"+ // field 19, encoding 2 string "string" + "f00101"+ // field 30, encoding 0, value 1 + "f80120"+ // field 31, encoding 0, value 32 + "800240"+ // field 32, encoding 0, value 64 + "8d02a00c0000"+ // field 33, encoding 5, value 3232 + "91024019000000000000"+ // field 34, encoding 1, value 6464 + "9802a0dd13"+ // field 35, encoding 0, value 323232 + "a002c0ba27"+ // field 36, encoding 0, value 646464 + "ad0200000042"+ // field 37, encoding 5, value 32.0 + "b1020000000000005040"+ // field 38, encoding 1, value 64.0 + "ba0205"+"68656c6c6f"+ // field 39, encoding 2, string "hello" + "c00201"+ // field 40, encoding 0, value 1 + "c80220"+ // field 41, encoding 0, value 32 + "d00240"+ // field 42, encoding 0, value 64 + "dd0240010000"+ // field 43, encoding 5, value 320 + "e1028002000000000000"+ // field 44, encoding 1, value 640 + "e8028019"+ // field 45, encoding 0, value 3200 + "f0028032"+ // field 46, encoding 0, value 6400 + "fd02e0659948"+ // field 47, encoding 5, value 314159.0 + "81030000000050971041"+ // field 48, encoding 1, value 271828.0 + "8a0310"+"68656c6c6f2c2022776f726c6421220a"+ // field 49, encoding 2 string "hello, \"world!\"\n" + "b304"+ // start group field 70 level 1 + "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" + "b404"+ // end group field 70 level 1 + "d305"+ // start group field 90 level 1 + "da0508"+"6f7074696f6e616c"+ // field 91, encoding 2, string "optional" + "d405"+ // end group field 90 level 1 + "aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes" + "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 + "b8067f"+ // field 103, encoding 0, 0x7f zigzag64 + "c506e0ffffff"+ // field 104, encoding 5, -32 fixed32 + "c906c0ffffffffffffff"+ // field 105, encoding 1, -64 fixed64 + "ea1207"+"4269676e6f7365"+ // field 301, encoding 2, string "Bignose" + "f0123f"+ // field 302, encoding 0, value 63 + "f8127f"+ // field 303, encoding 0, value 127 + "8513e0ffffff"+ // field 304, encoding 5, -32 fixed32 + "8913c0ffffffffffffff"+ // field 305, encoding 1, -64 fixed64 + "8a1907"+"4269676e6f7365"+ // field 401, encoding 2, string "Bignose" + "90193f"+ // field 402, encoding 0, value 63 + "98197f"+ // field 403, encoding 0, value 127 + "a519e0ffffff"+ // field 404, encoding 5, -32 fixed32 + "a919c0ffffffffffffff") // field 405, encoding 1, -64 fixed64 + +} + +// All required fields set, defaults provided, all repeated fields given two values. +func TestEncodeDecode5(t *testing.T) { + pb := initGoTest(true) + pb.RepeatedField = []*GoTestField{initGoTestField(), initGoTestField()} + pb.F_BoolRepeated = []bool{false, true} + pb.F_Int32Repeated = []int32{32, 33} + pb.F_Int64Repeated = []int64{64, 65} + pb.F_Fixed32Repeated = []uint32{3232, 3333} + pb.F_Fixed64Repeated = []uint64{6464, 6565} + pb.F_Uint32Repeated = []uint32{323232, 333333} + pb.F_Uint64Repeated = []uint64{646464, 656565} + pb.F_FloatRepeated = []float32{32., 33.} + pb.F_DoubleRepeated = []float64{64., 65.} + pb.F_StringRepeated = []string{"hello", "sailor"} + pb.F_BytesRepeated = [][]byte{[]byte("big"), []byte("nose")} + pb.F_Sint32Repeated = []int32{32, -32} + pb.F_Sint64Repeated = []int64{64, -64} + pb.F_Sfixed32Repeated = []int32{32, -32} + pb.F_Sfixed64Repeated = []int64{64, -64} + pb.Repeatedgroup = []*GoTest_RepeatedGroup{initGoTest_RepeatedGroup(), initGoTest_RepeatedGroup()} + + overify(t, pb, + "0807"+ // field 1, encoding 0, value 7 + "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) + "2a0d"+"0a056c6162656c120474797065"+ // field 5, encoding 2 (GoTestField) + "2a0d"+"0a056c6162656c120474797065"+ // field 5, encoding 2 (GoTestField) + "5001"+ // field 10, encoding 0, value 1 + "5803"+ // field 11, encoding 0, value 3 + "6006"+ // field 12, encoding 0, value 6 + "6d20000000"+ // field 13, encoding 5, value 32 + "714000000000000000"+ // field 14, encoding 1, value 64 + "78a019"+ // field 15, encoding 0, value 3232 + "8001c032"+ // field 16, encoding 0, value 6464 + "8d0100004a45"+ // field 17, encoding 5, value 3232.0 + "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 + "9a0106"+"737472696e67"+ // field 19, encoding 2 string "string" + "a00100"+ // field 20, encoding 0, value 0 + "a00101"+ // field 20, encoding 0, value 1 + "a80120"+ // field 21, encoding 0, value 32 + "a80121"+ // field 21, encoding 0, value 33 + "b00140"+ // field 22, encoding 0, value 64 + "b00141"+ // field 22, encoding 0, value 65 + "bd01a00c0000"+ // field 23, encoding 5, value 3232 + "bd01050d0000"+ // field 23, encoding 5, value 3333 + "c1014019000000000000"+ // field 24, encoding 1, value 6464 + "c101a519000000000000"+ // field 24, encoding 1, value 6565 + "c801a0dd13"+ // field 25, encoding 0, value 323232 + "c80195ac14"+ // field 25, encoding 0, value 333333 + "d001c0ba27"+ // field 26, encoding 0, value 646464 + "d001b58928"+ // field 26, encoding 0, value 656565 + "dd0100000042"+ // field 27, encoding 5, value 32.0 + "dd0100000442"+ // field 27, encoding 5, value 33.0 + "e1010000000000005040"+ // field 28, encoding 1, value 64.0 + "e1010000000000405040"+ // field 28, encoding 1, value 65.0 + "ea0105"+"68656c6c6f"+ // field 29, encoding 2, string "hello" + "ea0106"+"7361696c6f72"+ // field 29, encoding 2, string "sailor" + "c00201"+ // field 40, encoding 0, value 1 + "c80220"+ // field 41, encoding 0, value 32 + "d00240"+ // field 42, encoding 0, value 64 + "dd0240010000"+ // field 43, encoding 5, value 320 + "e1028002000000000000"+ // field 44, encoding 1, value 640 + "e8028019"+ // field 45, encoding 0, value 3200 + "f0028032"+ // field 46, encoding 0, value 6400 + "fd02e0659948"+ // field 47, encoding 5, value 314159.0 + "81030000000050971041"+ // field 48, encoding 1, value 271828.0 + "8a0310"+"68656c6c6f2c2022776f726c6421220a"+ // field 49, encoding 2 string "hello, \"world!\"\n" + "b304"+ // start group field 70 level 1 + "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" + "b404"+ // end group field 70 level 1 + "8305"+ // start group field 80 level 1 + "8a0508"+"7265706561746564"+ // field 81, encoding 2, string "repeated" + "8405"+ // end group field 80 level 1 + "8305"+ // start group field 80 level 1 + "8a0508"+"7265706561746564"+ // field 81, encoding 2, string "repeated" + "8405"+ // end group field 80 level 1 + "aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes" + "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 + "b8067f"+ // field 103, encoding 0, 0x7f zigzag64 + "c506e0ffffff"+ // field 104, encoding 5, -32 fixed32 + "c906c0ffffffffffffff"+ // field 105, encoding 1, -64 fixed64 + "ca0c03"+"626967"+ // field 201, encoding 2, string "big" + "ca0c04"+"6e6f7365"+ // field 201, encoding 2, string "nose" + "d00c40"+ // field 202, encoding 0, value 32 + "d00c3f"+ // field 202, encoding 0, value -32 + "d80c8001"+ // field 203, encoding 0, value 64 + "d80c7f"+ // field 203, encoding 0, value -64 + "e50c20000000"+ // field 204, encoding 5, 32 fixed32 + "e50ce0ffffff"+ // field 204, encoding 5, -32 fixed32 + "e90c4000000000000000"+ // field 205, encoding 1, 64 fixed64 + "e90cc0ffffffffffffff"+ // field 205, encoding 1, -64 fixed64 + "8a1907"+"4269676e6f7365"+ // field 401, encoding 2, string "Bignose" + "90193f"+ // field 402, encoding 0, value 63 + "98197f"+ // field 403, encoding 0, value 127 + "a519e0ffffff"+ // field 404, encoding 5, -32 fixed32 + "a919c0ffffffffffffff") // field 405, encoding 1, -64 fixed64 + +} + +// All required fields set, all packed repeated fields given two values. +func TestEncodeDecode6(t *testing.T) { + pb := initGoTest(false) + pb.F_BoolRepeatedPacked = []bool{false, true} + pb.F_Int32RepeatedPacked = []int32{32, 33} + pb.F_Int64RepeatedPacked = []int64{64, 65} + pb.F_Fixed32RepeatedPacked = []uint32{3232, 3333} + pb.F_Fixed64RepeatedPacked = []uint64{6464, 6565} + pb.F_Uint32RepeatedPacked = []uint32{323232, 333333} + pb.F_Uint64RepeatedPacked = []uint64{646464, 656565} + pb.F_FloatRepeatedPacked = []float32{32., 33.} + pb.F_DoubleRepeatedPacked = []float64{64., 65.} + pb.F_Sint32RepeatedPacked = []int32{32, -32} + pb.F_Sint64RepeatedPacked = []int64{64, -64} + pb.F_Sfixed32RepeatedPacked = []int32{32, -32} + pb.F_Sfixed64RepeatedPacked = []int64{64, -64} + + overify(t, pb, + "0807"+ // field 1, encoding 0, value 7 + "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) + "5001"+ // field 10, encoding 0, value 1 + "5803"+ // field 11, encoding 0, value 3 + "6006"+ // field 12, encoding 0, value 6 + "6d20000000"+ // field 13, encoding 5, value 32 + "714000000000000000"+ // field 14, encoding 1, value 64 + "78a019"+ // field 15, encoding 0, value 3232 + "8001c032"+ // field 16, encoding 0, value 6464 + "8d0100004a45"+ // field 17, encoding 5, value 3232.0 + "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 + "9a0106"+"737472696e67"+ // field 19, encoding 2 string "string" + "9203020001"+ // field 50, encoding 2, 2 bytes, value 0, value 1 + "9a03022021"+ // field 51, encoding 2, 2 bytes, value 32, value 33 + "a203024041"+ // field 52, encoding 2, 2 bytes, value 64, value 65 + "aa0308"+ // field 53, encoding 2, 8 bytes + "a00c0000050d0000"+ // value 3232, value 3333 + "b20310"+ // field 54, encoding 2, 16 bytes + "4019000000000000a519000000000000"+ // value 6464, value 6565 + "ba0306"+ // field 55, encoding 2, 6 bytes + "a0dd1395ac14"+ // value 323232, value 333333 + "c20306"+ // field 56, encoding 2, 6 bytes + "c0ba27b58928"+ // value 646464, value 656565 + "ca0308"+ // field 57, encoding 2, 8 bytes + "0000004200000442"+ // value 32.0, value 33.0 + "d20310"+ // field 58, encoding 2, 16 bytes + "00000000000050400000000000405040"+ // value 64.0, value 65.0 + "b304"+ // start group field 70 level 1 + "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" + "b404"+ // end group field 70 level 1 + "aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes" + "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 + "b8067f"+ // field 103, encoding 0, 0x7f zigzag64 + "c506e0ffffff"+ // field 104, encoding 5, -32 fixed32 + "c906c0ffffffffffffff"+ // field 105, encoding 1, -64 fixed64 + "b21f02"+ // field 502, encoding 2, 2 bytes + "403f"+ // value 32, value -32 + "ba1f03"+ // field 503, encoding 2, 3 bytes + "80017f"+ // value 64, value -64 + "c21f08"+ // field 504, encoding 2, 8 bytes + "20000000e0ffffff"+ // value 32, value -32 + "ca1f10"+ // field 505, encoding 2, 16 bytes + "4000000000000000c0ffffffffffffff") // value 64, value -64 + +} + +// Test that we can encode empty bytes fields. +func TestEncodeDecodeBytes1(t *testing.T) { + pb := initGoTest(false) + + // Create our bytes + pb.F_BytesRequired = []byte{} + pb.F_BytesRepeated = [][]byte{{}} + pb.F_BytesOptional = []byte{} + + d, err := Marshal(pb) + if err != nil { + t.Error(err) + } + + pbd := new(GoTest) + if err := Unmarshal(d, pbd); err != nil { + t.Error(err) + } + + if pbd.F_BytesRequired == nil || len(pbd.F_BytesRequired) != 0 { + t.Error("required empty bytes field is incorrect") + } + if pbd.F_BytesRepeated == nil || len(pbd.F_BytesRepeated) == 1 && pbd.F_BytesRepeated[0] == nil { + t.Error("repeated empty bytes field is incorrect") + } + if pbd.F_BytesOptional == nil || len(pbd.F_BytesOptional) != 0 { + t.Error("optional empty bytes field is incorrect") + } +} + +// Test that we encode nil-valued fields of a repeated bytes field correctly. +// Since entries in a repeated field cannot be nil, nil must mean empty value. +func TestEncodeDecodeBytes2(t *testing.T) { + pb := initGoTest(false) + + // Create our bytes + pb.F_BytesRepeated = [][]byte{nil} + + d, err := Marshal(pb) + if err != nil { + t.Error(err) + } + + pbd := new(GoTest) + if err := Unmarshal(d, pbd); err != nil { + t.Error(err) + } + + if len(pbd.F_BytesRepeated) != 1 || pbd.F_BytesRepeated[0] == nil { + t.Error("Unexpected value for repeated bytes field") + } +} + +// All required fields set, defaults provided, all repeated fields given two values. +func TestSkippingUnrecognizedFields(t *testing.T) { + o := old() + pb := initGoTestField() + + // Marshal it normally. + o.Marshal(pb) + + // Now new a GoSkipTest record. + skip := &GoSkipTest{ + SkipInt32: Int32(32), + SkipFixed32: Uint32(3232), + SkipFixed64: Uint64(6464), + SkipString: String("skipper"), + Skipgroup: &GoSkipTest_SkipGroup{ + GroupInt32: Int32(75), + GroupString: String("wxyz"), + }, + } + + // Marshal it into same buffer. + o.Marshal(skip) + + pbd := new(GoTestField) + o.Unmarshal(pbd) + + // The __unrecognized field should be a marshaling of GoSkipTest + skipd := new(GoSkipTest) + + o.SetBuf(pbd.XXX_unrecognized) + o.Unmarshal(skipd) + + if *skipd.SkipInt32 != *skip.SkipInt32 { + t.Error("skip int32", skipd.SkipInt32) + } + if *skipd.SkipFixed32 != *skip.SkipFixed32 { + t.Error("skip fixed32", skipd.SkipFixed32) + } + if *skipd.SkipFixed64 != *skip.SkipFixed64 { + t.Error("skip fixed64", skipd.SkipFixed64) + } + if *skipd.SkipString != *skip.SkipString { + t.Error("skip string", *skipd.SkipString) + } + if *skipd.Skipgroup.GroupInt32 != *skip.Skipgroup.GroupInt32 { + t.Error("skip group int32", skipd.Skipgroup.GroupInt32) + } + if *skipd.Skipgroup.GroupString != *skip.Skipgroup.GroupString { + t.Error("skip group string", *skipd.Skipgroup.GroupString) + } +} + +// Check that unrecognized fields of a submessage are preserved. +func TestSubmessageUnrecognizedFields(t *testing.T) { + nm := &NewMessage{ + Nested: &NewMessage_Nested{ + Name: String("Nigel"), + FoodGroup: String("carbs"), + }, + } + b, err := Marshal(nm) + if err != nil { + t.Fatalf("Marshal of NewMessage: %v", err) + } + + // Unmarshal into an OldMessage. + om := new(OldMessage) + if err := Unmarshal(b, om); err != nil { + t.Fatalf("Unmarshal to OldMessage: %v", err) + } + exp := &OldMessage{ + Nested: &OldMessage_Nested{ + Name: String("Nigel"), + // normal protocol buffer users should not do this + XXX_unrecognized: []byte("\x12\x05carbs"), + }, + } + if !Equal(om, exp) { + t.Errorf("om = %v, want %v", om, exp) + } + + // Clone the OldMessage. + om = Clone(om).(*OldMessage) + if !Equal(om, exp) { + t.Errorf("Clone(om) = %v, want %v", om, exp) + } + + // Marshal the OldMessage, then unmarshal it into an empty NewMessage. + if b, err = Marshal(om); err != nil { + t.Fatalf("Marshal of OldMessage: %v", err) + } + t.Logf("Marshal(%v) -> %q", om, b) + nm2 := new(NewMessage) + if err := Unmarshal(b, nm2); err != nil { + t.Fatalf("Unmarshal to NewMessage: %v", err) + } + if !Equal(nm, nm2) { + t.Errorf("NewMessage round-trip: %v => %v", nm, nm2) + } +} + +// Check that an int32 field can be upgraded to an int64 field. +func TestNegativeInt32(t *testing.T) { + om := &OldMessage{ + Num: Int32(-1), + } + b, err := Marshal(om) + if err != nil { + t.Fatalf("Marshal of OldMessage: %v", err) + } + + // Check the size. It should be 11 bytes; + // 1 for the field/wire type, and 10 for the negative number. + if len(b) != 11 { + t.Errorf("%v marshaled as %q, wanted 11 bytes", om, b) + } + + // Unmarshal into a NewMessage. + nm := new(NewMessage) + if err := Unmarshal(b, nm); err != nil { + t.Fatalf("Unmarshal to NewMessage: %v", err) + } + want := &NewMessage{ + Num: Int64(-1), + } + if !Equal(nm, want) { + t.Errorf("nm = %v, want %v", nm, want) + } +} + +// Check that we can grow an array (repeated field) to have many elements. +// This test doesn't depend only on our encoding; for variety, it makes sure +// we create, encode, and decode the correct contents explicitly. It's therefore +// a bit messier. +// This test also uses (and hence tests) the Marshal/Unmarshal functions +// instead of the methods. +func TestBigRepeated(t *testing.T) { + pb := initGoTest(true) + + // Create the arrays + const N = 50 // Internally the library starts much smaller. + pb.Repeatedgroup = make([]*GoTest_RepeatedGroup, N) + pb.F_Sint64Repeated = make([]int64, N) + pb.F_Sint32Repeated = make([]int32, N) + pb.F_BytesRepeated = make([][]byte, N) + pb.F_StringRepeated = make([]string, N) + pb.F_DoubleRepeated = make([]float64, N) + pb.F_FloatRepeated = make([]float32, N) + pb.F_Uint64Repeated = make([]uint64, N) + pb.F_Uint32Repeated = make([]uint32, N) + pb.F_Fixed64Repeated = make([]uint64, N) + pb.F_Fixed32Repeated = make([]uint32, N) + pb.F_Int64Repeated = make([]int64, N) + pb.F_Int32Repeated = make([]int32, N) + pb.F_BoolRepeated = make([]bool, N) + pb.RepeatedField = make([]*GoTestField, N) + + // Fill in the arrays with checkable values. + igtf := initGoTestField() + igtrg := initGoTest_RepeatedGroup() + for i := 0; i < N; i++ { + pb.Repeatedgroup[i] = igtrg + pb.F_Sint64Repeated[i] = int64(i) + pb.F_Sint32Repeated[i] = int32(i) + s := fmt.Sprint(i) + pb.F_BytesRepeated[i] = []byte(s) + pb.F_StringRepeated[i] = s + pb.F_DoubleRepeated[i] = float64(i) + pb.F_FloatRepeated[i] = float32(i) + pb.F_Uint64Repeated[i] = uint64(i) + pb.F_Uint32Repeated[i] = uint32(i) + pb.F_Fixed64Repeated[i] = uint64(i) + pb.F_Fixed32Repeated[i] = uint32(i) + pb.F_Int64Repeated[i] = int64(i) + pb.F_Int32Repeated[i] = int32(i) + pb.F_BoolRepeated[i] = i%2 == 0 + pb.RepeatedField[i] = igtf + } + + // Marshal. + buf, _ := Marshal(pb) + + // Now test Unmarshal by recreating the original buffer. + pbd := new(GoTest) + Unmarshal(buf, pbd) + + // Check the checkable values + for i := uint64(0); i < N; i++ { + if pbd.Repeatedgroup[i] == nil { // TODO: more checking? + t.Error("pbd.Repeatedgroup bad") + } + if x := uint64(pbd.F_Sint64Repeated[i]); x != i { + t.Error("pbd.F_Sint64Repeated bad", x, i) + } + if x := uint64(pbd.F_Sint32Repeated[i]); x != i { + t.Error("pbd.F_Sint32Repeated bad", x, i) + } + s := fmt.Sprint(i) + equalbytes(pbd.F_BytesRepeated[i], []byte(s), t) + if pbd.F_StringRepeated[i] != s { + t.Error("pbd.F_Sint32Repeated bad", pbd.F_StringRepeated[i], i) + } + if x := uint64(pbd.F_DoubleRepeated[i]); x != i { + t.Error("pbd.F_DoubleRepeated bad", x, i) + } + if x := uint64(pbd.F_FloatRepeated[i]); x != i { + t.Error("pbd.F_FloatRepeated bad", x, i) + } + if x := pbd.F_Uint64Repeated[i]; x != i { + t.Error("pbd.F_Uint64Repeated bad", x, i) + } + if x := uint64(pbd.F_Uint32Repeated[i]); x != i { + t.Error("pbd.F_Uint32Repeated bad", x, i) + } + if x := pbd.F_Fixed64Repeated[i]; x != i { + t.Error("pbd.F_Fixed64Repeated bad", x, i) + } + if x := uint64(pbd.F_Fixed32Repeated[i]); x != i { + t.Error("pbd.F_Fixed32Repeated bad", x, i) + } + if x := uint64(pbd.F_Int64Repeated[i]); x != i { + t.Error("pbd.F_Int64Repeated bad", x, i) + } + if x := uint64(pbd.F_Int32Repeated[i]); x != i { + t.Error("pbd.F_Int32Repeated bad", x, i) + } + if x := pbd.F_BoolRepeated[i]; x != (i%2 == 0) { + t.Error("pbd.F_BoolRepeated bad", x, i) + } + if pbd.RepeatedField[i] == nil { // TODO: more checking? + t.Error("pbd.RepeatedField bad") + } + } +} + +func TestBadWireTypeUnknown(t *testing.T) { + var b []byte + fmt.Sscanf("0a01780d00000000080b101612036161611521000000202c220362626225370000002203636363214200000000000000584d5a036464645900000000000056405d63000000", "%x", &b) + + m := new(MyMessage) + if err := Unmarshal(b, m); err != nil { + t.Errorf("unexpected Unmarshal error: %v", err) + } + + var unknown []byte + fmt.Sscanf("0a01780d0000000010161521000000202c2537000000214200000000000000584d5a036464645d63000000", "%x", &unknown) + if !bytes.Equal(m.XXX_unrecognized, unknown) { + t.Errorf("unknown bytes mismatch:\ngot %x\nwant %x", m.XXX_unrecognized, unknown) + } + DiscardUnknown(m) + + want := &MyMessage{Count: Int32(11), Name: String("aaa"), Pet: []string{"bbb", "ccc"}, Bigfloat: Float64(88)} + if !Equal(m, want) { + t.Errorf("message mismatch:\ngot %v\nwant %v", m, want) + } +} + +func encodeDecode(t *testing.T, in, out Message, msg string) { + buf, err := Marshal(in) + if err != nil { + t.Fatalf("failed marshaling %v: %v", msg, err) + } + if err := Unmarshal(buf, out); err != nil { + t.Fatalf("failed unmarshaling %v: %v", msg, err) + } +} + +func TestPackedNonPackedDecoderSwitching(t *testing.T) { + np, p := new(NonPackedTest), new(PackedTest) + + // non-packed -> packed + np.A = []int32{0, 1, 1, 2, 3, 5} + encodeDecode(t, np, p, "non-packed -> packed") + if !reflect.DeepEqual(np.A, p.B) { + t.Errorf("failed non-packed -> packed; np.A=%+v, p.B=%+v", np.A, p.B) + } + + // packed -> non-packed + np.Reset() + p.B = []int32{3, 1, 4, 1, 5, 9} + encodeDecode(t, p, np, "packed -> non-packed") + if !reflect.DeepEqual(p.B, np.A) { + t.Errorf("failed packed -> non-packed; p.B=%+v, np.A=%+v", p.B, np.A) + } +} + +func TestProto1RepeatedGroup(t *testing.T) { + pb := &MessageList{ + Message: []*MessageList_Message{ + { + Name: String("blah"), + Count: Int32(7), + }, + // NOTE: pb.Message[1] is a nil + nil, + }, + } + + o := old() + err := o.Marshal(pb) + if err == nil || !strings.Contains(err.Error(), "repeated field Message has nil") { + t.Fatalf("unexpected or no error when marshaling: %v", err) + } +} + +// Test that enums work. Checks for a bug introduced by making enums +// named types instead of int32: newInt32FromUint64 would crash with +// a type mismatch in reflect.PointTo. +func TestEnum(t *testing.T) { + pb := new(GoEnum) + pb.Foo = FOO_FOO1.Enum() + o := old() + if err := o.Marshal(pb); err != nil { + t.Fatal("error encoding enum:", err) + } + pb1 := new(GoEnum) + if err := o.Unmarshal(pb1); err != nil { + t.Fatal("error decoding enum:", err) + } + if *pb1.Foo != FOO_FOO1 { + t.Error("expected 7 but got ", *pb1.Foo) + } +} + +// Enum types have String methods. Check that enum fields can be printed. +// We don't care what the value actually is, just as long as it doesn't crash. +func TestPrintingNilEnumFields(t *testing.T) { + pb := new(GoEnum) + _ = fmt.Sprintf("%+v", pb) +} + +// Verify that absent required fields cause Marshal/Unmarshal to return errors. +func TestRequiredFieldEnforcement(t *testing.T) { + pb := new(GoTestField) + _, err := Marshal(pb) + if err == nil { + t.Error("marshal: expected error, got nil") + } else if _, ok := err.(*RequiredNotSetError); !ok || !strings.Contains(err.Error(), "Label") { + t.Errorf("marshal: bad error type: %v", err) + } + + // A slightly sneaky, yet valid, proto. It encodes the same required field twice, + // so simply counting the required fields is insufficient. + // field 1, encoding 2, value "hi" + buf := []byte("\x0A\x02hi\x0A\x02hi") + err = Unmarshal(buf, pb) + if err == nil { + t.Error("unmarshal: expected error, got nil") + } else if _, ok := err.(*RequiredNotSetError); !ok || !strings.Contains(err.Error(), "Type") && !strings.Contains(err.Error(), "{Unknown}") { + // TODO: remove unknown cases once we commit to the new unmarshaler. + t.Errorf("unmarshal: bad error type: %v", err) + } +} + +// Verify that absent required fields in groups cause Marshal/Unmarshal to return errors. +func TestRequiredFieldEnforcementGroups(t *testing.T) { + pb := &GoTestRequiredGroupField{Group: &GoTestRequiredGroupField_Group{}} + if _, err := Marshal(pb); err == nil { + t.Error("marshal: expected error, got nil") + } else if _, ok := err.(*RequiredNotSetError); !ok || !strings.Contains(err.Error(), "Group.Field") { + t.Errorf("marshal: bad error type: %v", err) + } + + buf := []byte{11, 12} + if err := Unmarshal(buf, pb); err == nil { + t.Error("unmarshal: expected error, got nil") + } else if _, ok := err.(*RequiredNotSetError); !ok || !strings.Contains(err.Error(), "Group.Field") && !strings.Contains(err.Error(), "Group.{Unknown}") { + t.Errorf("unmarshal: bad error type: %v", err) + } +} + +func TestTypedNilMarshal(t *testing.T) { + // A typed nil should return ErrNil and not crash. + { + var m *GoEnum + if _, err := Marshal(m); err != ErrNil { + t.Errorf("Marshal(%#v): got %v, want ErrNil", m, err) + } + } + + { + m := &Communique{Union: &Communique_Msg{nil}} + if _, err := Marshal(m); err == nil || err == ErrNil { + t.Errorf("Marshal(%#v): got %v, want errOneofHasNil", m, err) + } + } +} + +// A type that implements the Marshaler interface, but is not nillable. +type nonNillableInt uint64 + +func (nni nonNillableInt) Marshal() ([]byte, error) { + return EncodeVarint(uint64(nni)), nil +} + +type NNIMessage struct { + nni nonNillableInt +} + +func (*NNIMessage) Reset() {} +func (*NNIMessage) String() string { return "" } +func (*NNIMessage) ProtoMessage() {} + +type NMMessage struct{} + +func (*NMMessage) Reset() {} +func (*NMMessage) String() string { return "" } +func (*NMMessage) ProtoMessage() {} + +// Verify a type that uses the Marshaler interface, but has a nil pointer. +func TestNilMarshaler(t *testing.T) { + // Try a struct with a Marshaler field that is nil. + // It should be directly marshable. + nmm := new(NMMessage) + if _, err := Marshal(nmm); err != nil { + t.Error("unexpected error marshaling nmm: ", err) + } + + // Try a struct with a Marshaler field that is not nillable. + nnim := new(NNIMessage) + nnim.nni = 7 + var _ Marshaler = nnim.nni // verify it is truly a Marshaler + if _, err := Marshal(nnim); err != nil { + t.Error("unexpected error marshaling nnim: ", err) + } +} + +func TestAllSetDefaults(t *testing.T) { + // Exercise SetDefaults with all scalar field types. + m := &Defaults{ + // NaN != NaN, so override that here. + F_Nan: Float32(1.7), + } + expected := &Defaults{ + F_Bool: Bool(true), + F_Int32: Int32(32), + F_Int64: Int64(64), + F_Fixed32: Uint32(320), + F_Fixed64: Uint64(640), + F_Uint32: Uint32(3200), + F_Uint64: Uint64(6400), + F_Float: Float32(314159), + F_Double: Float64(271828), + F_String: String(`hello, "world!"` + "\n"), + F_Bytes: []byte("Bignose"), + F_Sint32: Int32(-32), + F_Sint64: Int64(-64), + F_Enum: Defaults_GREEN.Enum(), + F_Pinf: Float32(float32(math.Inf(1))), + F_Ninf: Float32(float32(math.Inf(-1))), + F_Nan: Float32(1.7), + StrZero: String(""), + } + SetDefaults(m) + if !Equal(m, expected) { + t.Errorf("SetDefaults failed\n got %v\nwant %v", m, expected) + } +} + +func TestSetDefaultsWithSetField(t *testing.T) { + // Check that a set value is not overridden. + m := &Defaults{ + F_Int32: Int32(12), + } + SetDefaults(m) + if v := m.GetF_Int32(); v != 12 { + t.Errorf("m.FInt32 = %v, want 12", v) + } +} + +func TestSetDefaultsWithSubMessage(t *testing.T) { + m := &OtherMessage{ + Key: Int64(123), + Inner: &InnerMessage{ + Host: String("gopher"), + }, + } + expected := &OtherMessage{ + Key: Int64(123), + Inner: &InnerMessage{ + Host: String("gopher"), + Port: Int32(4000), + }, + } + SetDefaults(m) + if !Equal(m, expected) { + t.Errorf("\n got %v\nwant %v", m, expected) + } +} + +func TestSetDefaultsWithRepeatedSubMessage(t *testing.T) { + m := &MyMessage{ + RepInner: []*InnerMessage{{}}, + } + expected := &MyMessage{ + RepInner: []*InnerMessage{{ + Port: Int32(4000), + }}, + } + SetDefaults(m) + if !Equal(m, expected) { + t.Errorf("\n got %v\nwant %v", m, expected) + } +} + +func TestSetDefaultWithRepeatedNonMessage(t *testing.T) { + m := &MyMessage{ + Pet: []string{"turtle", "wombat"}, + } + expected := Clone(m) + SetDefaults(m) + if !Equal(m, expected) { + t.Errorf("\n got %v\nwant %v", m, expected) + } +} + +func TestMaximumTagNumber(t *testing.T) { + m := &MaxTag{ + LastField: String("natural goat essence"), + } + buf, err := Marshal(m) + if err != nil { + t.Fatalf("proto.Marshal failed: %v", err) + } + m2 := new(MaxTag) + if err := Unmarshal(buf, m2); err != nil { + t.Fatalf("proto.Unmarshal failed: %v", err) + } + if got, want := m2.GetLastField(), *m.LastField; got != want { + t.Errorf("got %q, want %q", got, want) + } +} + +func TestJSON(t *testing.T) { + m := &MyMessage{ + Count: Int32(4), + Pet: []string{"bunny", "kitty"}, + Inner: &InnerMessage{ + Host: String("cauchy"), + }, + Bikeshed: MyMessage_GREEN.Enum(), + } + const expected = `{"count":4,"pet":["bunny","kitty"],"inner":{"host":"cauchy"},"bikeshed":1}` + + b, err := json.Marshal(m) + if err != nil { + t.Fatalf("json.Marshal failed: %v", err) + } + s := string(b) + if s != expected { + t.Errorf("got %s\nwant %s", s, expected) + } + + received := new(MyMessage) + if err := json.Unmarshal(b, received); err != nil { + t.Fatalf("json.Unmarshal failed: %v", err) + } + if !Equal(received, m) { + t.Fatalf("got %s, want %s", received, m) + } + + // Test unmarshalling of JSON with symbolic enum name. + const old = `{"count":4,"pet":["bunny","kitty"],"inner":{"host":"cauchy"},"bikeshed":"GREEN"}` + received.Reset() + if err := json.Unmarshal([]byte(old), received); err != nil { + t.Fatalf("json.Unmarshal failed: %v", err) + } + if !Equal(received, m) { + t.Fatalf("got %s, want %s", received, m) + } +} + +func TestBadWireType(t *testing.T) { + b := []byte{7<<3 | 6} // field 7, wire type 6 + pb := new(OtherMessage) + if err := Unmarshal(b, pb); err == nil { + t.Errorf("Unmarshal did not fail") + } else if !strings.Contains(err.Error(), "unknown wire type") { + t.Errorf("wrong error: %v", err) + } +} + +func TestBytesWithInvalidLength(t *testing.T) { + // If a byte sequence has an invalid (negative) length, Unmarshal should not panic. + b := []byte{2<<3 | WireBytes, 0xff, 0xff, 0xff, 0xff, 0xff, 0} + Unmarshal(b, new(MyMessage)) +} + +func TestLengthOverflow(t *testing.T) { + // Overflowing a length should not panic. + b := []byte{2<<3 | WireBytes, 1, 1, 3<<3 | WireBytes, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x01} + Unmarshal(b, new(MyMessage)) +} + +func TestVarintOverflow(t *testing.T) { + // Overflowing a 64-bit length should not be allowed. + b := []byte{1<<3 | WireVarint, 0x01, 3<<3 | WireBytes, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x01} + if err := Unmarshal(b, new(MyMessage)); err == nil { + t.Fatalf("Overflowed uint64 length without error") + } +} + +func TestBytesWithInvalidLengthInGroup(t *testing.T) { + // Overflowing a 64-bit length should not be allowed. + b := []byte{0xbb, 0x30, 0xb2, 0x30, 0xb0, 0xb2, 0x83, 0xf1, 0xb0, 0xb2, 0xef, 0xbf, 0xbd, 0x01} + if err := Unmarshal(b, new(MyMessage)); err == nil { + t.Fatalf("Overflowed uint64 length without error") + } +} + +func TestUnmarshalFuzz(t *testing.T) { + const N = 1000 + seed := time.Now().UnixNano() + t.Logf("RNG seed is %d", seed) + rng := rand.New(rand.NewSource(seed)) + buf := make([]byte, 20) + for i := 0; i < N; i++ { + for j := range buf { + buf[j] = byte(rng.Intn(256)) + } + fuzzUnmarshal(t, buf) + } +} + +func TestMergeMessages(t *testing.T) { + pb := &MessageList{Message: []*MessageList_Message{{Name: String("x"), Count: Int32(1)}}} + data, err := Marshal(pb) + if err != nil { + t.Fatalf("Marshal: %v", err) + } + + pb1 := new(MessageList) + if err := Unmarshal(data, pb1); err != nil { + t.Fatalf("first Unmarshal: %v", err) + } + if err := Unmarshal(data, pb1); err != nil { + t.Fatalf("second Unmarshal: %v", err) + } + if len(pb1.Message) != 1 { + t.Errorf("two Unmarshals produced %d Messages, want 1", len(pb1.Message)) + } + + pb2 := new(MessageList) + if err := UnmarshalMerge(data, pb2); err != nil { + t.Fatalf("first UnmarshalMerge: %v", err) + } + if err := UnmarshalMerge(data, pb2); err != nil { + t.Fatalf("second UnmarshalMerge: %v", err) + } + if len(pb2.Message) != 2 { + t.Errorf("two UnmarshalMerges produced %d Messages, want 2", len(pb2.Message)) + } +} + +func TestExtensionMarshalOrder(t *testing.T) { + m := &MyMessage{Count: Int(123)} + if err := SetExtension(m, E_Ext_More, &Ext{Data: String("alpha")}); err != nil { + t.Fatalf("SetExtension: %v", err) + } + if err := SetExtension(m, E_Ext_Text, String("aleph")); err != nil { + t.Fatalf("SetExtension: %v", err) + } + if err := SetExtension(m, E_Ext_Number, Int32(1)); err != nil { + t.Fatalf("SetExtension: %v", err) + } + + // Serialize m several times, and check we get the same bytes each time. + var orig []byte + for i := 0; i < 100; i++ { + b, err := Marshal(m) + if err != nil { + t.Fatalf("Marshal: %v", err) + } + if i == 0 { + orig = b + continue + } + if !bytes.Equal(b, orig) { + t.Errorf("Bytes differ on attempt #%d", i) + } + } +} + +func TestExtensionMapFieldMarshalDeterministic(t *testing.T) { + m := &MyMessage{Count: Int(123)} + if err := SetExtension(m, E_Ext_More, &Ext{MapField: map[int32]int32{1: 1, 2: 2, 3: 3, 4: 4}}); err != nil { + t.Fatalf("SetExtension: %v", err) + } + marshal := func(m Message) []byte { + var b Buffer + b.SetDeterministic(true) + if err := b.Marshal(m); err != nil { + t.Fatalf("Marshal failed: %v", err) + } + return b.Bytes() + } + + want := marshal(m) + for i := 0; i < 100; i++ { + if got := marshal(m); !bytes.Equal(got, want) { + t.Errorf("Marshal produced inconsistent output with determinism enabled (pass %d).\n got %v\nwant %v", i, got, want) + } + } +} + +// Many extensions, because small maps might not iterate differently on each iteration. +var exts = []*ExtensionDesc{ + E_X201, + E_X202, + E_X203, + E_X204, + E_X205, + E_X206, + E_X207, + E_X208, + E_X209, + E_X210, + E_X211, + E_X212, + E_X213, + E_X214, + E_X215, + E_X216, + E_X217, + E_X218, + E_X219, + E_X220, + E_X221, + E_X222, + E_X223, + E_X224, + E_X225, + E_X226, + E_X227, + E_X228, + E_X229, + E_X230, + E_X231, + E_X232, + E_X233, + E_X234, + E_X235, + E_X236, + E_X237, + E_X238, + E_X239, + E_X240, + E_X241, + E_X242, + E_X243, + E_X244, + E_X245, + E_X246, + E_X247, + E_X248, + E_X249, + E_X250, +} + +func TestMessageSetMarshalOrder(t *testing.T) { + m := &MyMessageSet{} + for _, x := range exts { + if err := SetExtension(m, x, &Empty{}); err != nil { + t.Fatalf("SetExtension: %v", err) + } + } + + buf, err := Marshal(m) + if err != nil { + t.Fatalf("Marshal: %v", err) + } + + // Serialize m several times, and check we get the same bytes each time. + for i := 0; i < 10; i++ { + b1, err := Marshal(m) + if err != nil { + t.Fatalf("Marshal: %v", err) + } + if !bytes.Equal(b1, buf) { + t.Errorf("Bytes differ on re-Marshal #%d", i) + } + + m2 := &MyMessageSet{} + if err := Unmarshal(buf, m2); err != nil { + t.Errorf("Unmarshal: %v", err) + } + b2, err := Marshal(m2) + if err != nil { + t.Errorf("re-Marshal: %v", err) + } + if !bytes.Equal(b2, buf) { + t.Errorf("Bytes differ on round-trip #%d", i) + } + } +} + +func TestUnmarshalMergesMessages(t *testing.T) { + // If a nested message occurs twice in the input, + // the fields should be merged when decoding. + a := &OtherMessage{ + Key: Int64(123), + Inner: &InnerMessage{ + Host: String("polhode"), + Port: Int32(1234), + }, + } + aData, err := Marshal(a) + if err != nil { + t.Fatalf("Marshal(a): %v", err) + } + b := &OtherMessage{ + Weight: Float32(1.2), + Inner: &InnerMessage{ + Host: String("herpolhode"), + Connected: Bool(true), + }, + } + bData, err := Marshal(b) + if err != nil { + t.Fatalf("Marshal(b): %v", err) + } + want := &OtherMessage{ + Key: Int64(123), + Weight: Float32(1.2), + Inner: &InnerMessage{ + Host: String("herpolhode"), + Port: Int32(1234), + Connected: Bool(true), + }, + } + got := new(OtherMessage) + if err := Unmarshal(append(aData, bData...), got); err != nil { + t.Fatalf("Unmarshal: %v", err) + } + if !Equal(got, want) { + t.Errorf("\n got %v\nwant %v", got, want) + } +} + +func TestUnmarshalMergesGroups(t *testing.T) { + // If a nested group occurs twice in the input, + // the fields should be merged when decoding. + a := &GroupNew{ + G: &GroupNew_G{ + X: Int32(7), + Y: Int32(8), + }, + } + aData, err := Marshal(a) + if err != nil { + t.Fatalf("Marshal(a): %v", err) + } + b := &GroupNew{ + G: &GroupNew_G{ + X: Int32(9), + }, + } + bData, err := Marshal(b) + if err != nil { + t.Fatalf("Marshal(b): %v", err) + } + want := &GroupNew{ + G: &GroupNew_G{ + X: Int32(9), + Y: Int32(8), + }, + } + got := new(GroupNew) + if err := Unmarshal(append(aData, bData...), got); err != nil { + t.Fatalf("Unmarshal: %v", err) + } + if !Equal(got, want) { + t.Errorf("\n got %v\nwant %v", got, want) + } +} + +func TestEncodingSizes(t *testing.T) { + tests := []struct { + m Message + n int + }{ + {&Defaults{F_Int32: Int32(math.MaxInt32)}, 6}, + {&Defaults{F_Int32: Int32(math.MinInt32)}, 11}, + {&Defaults{F_Uint32: Uint32(uint32(math.MaxInt32) + 1)}, 6}, + {&Defaults{F_Uint32: Uint32(math.MaxUint32)}, 6}, + } + for _, test := range tests { + b, err := Marshal(test.m) + if err != nil { + t.Errorf("Marshal(%v): %v", test.m, err) + continue + } + if len(b) != test.n { + t.Errorf("Marshal(%v) yielded %d bytes, want %d bytes", test.m, len(b), test.n) + } + } +} + +func TestRequiredNotSetError(t *testing.T) { + pb := initGoTest(false) + pb.RequiredField.Label = nil + pb.F_Int32Required = nil + pb.F_Int64Required = nil + + expected := "0807" + // field 1, encoding 0, value 7 + "2206" + "120474797065" + // field 4, encoding 2 (GoTestField) + "5001" + // field 10, encoding 0, value 1 + "6d20000000" + // field 13, encoding 5, value 0x20 + "714000000000000000" + // field 14, encoding 1, value 0x40 + "78a019" + // field 15, encoding 0, value 0xca0 = 3232 + "8001c032" + // field 16, encoding 0, value 0x1940 = 6464 + "8d0100004a45" + // field 17, encoding 5, value 3232.0 + "9101000000000040b940" + // field 18, encoding 1, value 6464.0 + "9a0106" + "737472696e67" + // field 19, encoding 2, string "string" + "b304" + // field 70, encoding 3, start group + "ba0408" + "7265717569726564" + // field 71, encoding 2, string "required" + "b404" + // field 70, encoding 4, end group + "aa0605" + "6279746573" + // field 101, encoding 2, string "bytes" + "b0063f" + // field 102, encoding 0, 0x3f zigzag32 + "b8067f" + // field 103, encoding 0, 0x7f zigzag64 + "c506e0ffffff" + // field 104, encoding 5, -32 fixed32 + "c906c0ffffffffffffff" // field 105, encoding 1, -64 fixed64 + + o := old() + bytes, err := Marshal(pb) + if _, ok := err.(*RequiredNotSetError); !ok { + fmt.Printf("marshal-1 err = %v, want *RequiredNotSetError", err) + o.DebugPrint("", bytes) + t.Fatalf("expected = %s", expected) + } + if !strings.Contains(err.Error(), "RequiredField.Label") { + t.Errorf("marshal-1 wrong err msg: %v", err) + } + if !equal(bytes, expected, t) { + o.DebugPrint("neq 1", bytes) + t.Fatalf("expected = %s", expected) + } + + // Now test Unmarshal by recreating the original buffer. + pbd := new(GoTest) + err = Unmarshal(bytes, pbd) + if _, ok := err.(*RequiredNotSetError); !ok { + t.Fatalf("unmarshal err = %v, want *RequiredNotSetError", err) + o.DebugPrint("", bytes) + t.Fatalf("string = %s", expected) + } + if !strings.Contains(err.Error(), "RequiredField.Label") && !strings.Contains(err.Error(), "RequiredField.{Unknown}") { + t.Errorf("unmarshal wrong err msg: %v", err) + } + bytes, err = Marshal(pbd) + if _, ok := err.(*RequiredNotSetError); !ok { + t.Errorf("marshal-2 err = %v, want *RequiredNotSetError", err) + o.DebugPrint("", bytes) + t.Fatalf("string = %s", expected) + } + if !strings.Contains(err.Error(), "RequiredField.Label") { + t.Errorf("marshal-2 wrong err msg: %v", err) + } + if !equal(bytes, expected, t) { + o.DebugPrint("neq 2", bytes) + t.Fatalf("string = %s", expected) + } +} + +func TestRequiredNotSetErrorWithBadWireTypes(t *testing.T) { + // Required field expects a varint, and properly found a varint. + if err := Unmarshal([]byte{0x08, 0x00}, new(GoEnum)); err != nil { + t.Errorf("Unmarshal = %v, want nil", err) + } + // Required field expects a varint, but found a fixed32 instead. + if err := Unmarshal([]byte{0x0d, 0x00, 0x00, 0x00, 0x00}, new(GoEnum)); err == nil { + t.Errorf("Unmarshal = nil, want RequiredNotSetError") + } + // Required field expects a varint, and found both a varint and fixed32 (ignored). + m := new(GoEnum) + if err := Unmarshal([]byte{0x08, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00}, m); err != nil { + t.Errorf("Unmarshal = %v, want nil", err) + } + if !bytes.Equal(m.XXX_unrecognized, []byte{0x0d, 0x00, 0x00, 0x00, 0x00}) { + t.Errorf("expected fixed32 to appear as unknown bytes: %x", m.XXX_unrecognized) + } +} + +func fuzzUnmarshal(t *testing.T, data []byte) { + defer func() { + if e := recover(); e != nil { + t.Errorf("These bytes caused a panic: %+v", data) + t.Logf("Stack:\n%s", debug.Stack()) + t.FailNow() + } + }() + + pb := new(MyMessage) + Unmarshal(data, pb) +} + +func TestMapFieldMarshal(t *testing.T) { + m := &MessageWithMap{ + NameMapping: map[int32]string{ + 1: "Rob", + 4: "Ian", + 8: "Dave", + }, + } + b, err := Marshal(m) + if err != nil { + t.Fatalf("Marshal: %v", err) + } + + // b should be the concatenation of these three byte sequences in some order. + parts := []string{ + "\n\a\b\x01\x12\x03Rob", + "\n\a\b\x04\x12\x03Ian", + "\n\b\b\x08\x12\x04Dave", + } + ok := false + for i := range parts { + for j := range parts { + if j == i { + continue + } + for k := range parts { + if k == i || k == j { + continue + } + try := parts[i] + parts[j] + parts[k] + if bytes.Equal(b, []byte(try)) { + ok = true + break + } + } + } + } + if !ok { + t.Fatalf("Incorrect Marshal output.\n got %q\nwant %q (or a permutation of that)", b, parts[0]+parts[1]+parts[2]) + } + t.Logf("FYI b: %q", b) + + (new(Buffer)).DebugPrint("Dump of b", b) +} + +func TestMapFieldDeterministicMarshal(t *testing.T) { + m := &MessageWithMap{ + NameMapping: map[int32]string{ + 1: "Rob", + 4: "Ian", + 8: "Dave", + }, + } + + marshal := func(m Message) []byte { + var b Buffer + b.SetDeterministic(true) + if err := b.Marshal(m); err != nil { + t.Fatalf("Marshal failed: %v", err) + } + return b.Bytes() + } + + want := marshal(m) + for i := 0; i < 10; i++ { + if got := marshal(m); !bytes.Equal(got, want) { + t.Errorf("Marshal produced inconsistent output with determinism enabled (pass %d).\n got %v\nwant %v", i, got, want) + } + } +} + +func TestMapFieldRoundTrips(t *testing.T) { + m := &MessageWithMap{ + NameMapping: map[int32]string{ + 1: "Rob", + 4: "Ian", + 8: "Dave", + }, + MsgMapping: map[int64]*FloatingPoint{ + 0x7001: {F: Float64(2.0)}, + }, + ByteMapping: map[bool][]byte{ + false: []byte("that's not right!"), + true: []byte("aye, 'tis true!"), + }, + } + b, err := Marshal(m) + if err != nil { + t.Fatalf("Marshal: %v", err) + } + t.Logf("FYI b: %q", b) + m2 := new(MessageWithMap) + if err := Unmarshal(b, m2); err != nil { + t.Fatalf("Unmarshal: %v", err) + } + if !Equal(m, m2) { + t.Errorf("Map did not survive a round trip.\ninitial: %v\n final: %v", m, m2) + } +} + +func TestMapFieldWithNil(t *testing.T) { + m1 := &MessageWithMap{ + MsgMapping: map[int64]*FloatingPoint{ + 1: nil, + }, + } + b, err := Marshal(m1) + if err != nil { + t.Fatalf("Marshal: %v", err) + } + m2 := new(MessageWithMap) + if err := Unmarshal(b, m2); err != nil { + t.Fatalf("Unmarshal: %v, got these bytes: %v", err, b) + } + if v, ok := m2.MsgMapping[1]; !ok { + t.Error("msg_mapping[1] not present") + } else if v != nil { + t.Errorf("msg_mapping[1] not nil: %v", v) + } +} + +func TestMapFieldWithNilBytes(t *testing.T) { + m1 := &MessageWithMap{ + ByteMapping: map[bool][]byte{ + false: {}, + true: nil, + }, + } + n := Size(m1) + b, err := Marshal(m1) + if err != nil { + t.Fatalf("Marshal: %v", err) + } + if n != len(b) { + t.Errorf("Size(m1) = %d; want len(Marshal(m1)) = %d", n, len(b)) + } + m2 := new(MessageWithMap) + if err := Unmarshal(b, m2); err != nil { + t.Fatalf("Unmarshal: %v, got these bytes: %v", err, b) + } + if v, ok := m2.ByteMapping[false]; !ok { + t.Error("byte_mapping[false] not present") + } else if len(v) != 0 { + t.Errorf("byte_mapping[false] not empty: %#v", v) + } + if v, ok := m2.ByteMapping[true]; !ok { + t.Error("byte_mapping[true] not present") + } else if len(v) != 0 { + t.Errorf("byte_mapping[true] not empty: %#v", v) + } +} + +func TestDecodeMapFieldMissingKey(t *testing.T) { + b := []byte{ + 0x0A, 0x03, // message, tag 1 (name_mapping), of length 3 bytes + // no key + 0x12, 0x01, 0x6D, // string value of length 1 byte, value "m" + } + got := &MessageWithMap{} + err := Unmarshal(b, got) + if err != nil { + t.Fatalf("failed to marshal map with missing key: %v", err) + } + want := &MessageWithMap{NameMapping: map[int32]string{0: "m"}} + if !Equal(got, want) { + t.Errorf("Unmarshaled map with no key was not as expected. got: %v, want %v", got, want) + } +} + +func TestDecodeMapFieldMissingValue(t *testing.T) { + b := []byte{ + 0x0A, 0x02, // message, tag 1 (name_mapping), of length 2 bytes + 0x08, 0x01, // varint key, value 1 + // no value + } + got := &MessageWithMap{} + err := Unmarshal(b, got) + if err != nil { + t.Fatalf("failed to marshal map with missing value: %v", err) + } + want := &MessageWithMap{NameMapping: map[int32]string{1: ""}} + if !Equal(got, want) { + t.Errorf("Unmarshaled map with no value was not as expected. got: %v, want %v", got, want) + } +} + +func TestOneof(t *testing.T) { + m := &Communique{} + b, err := Marshal(m) + if err != nil { + t.Fatalf("Marshal of empty message with oneof: %v", err) + } + if len(b) != 0 { + t.Errorf("Marshal of empty message yielded too many bytes: %v", b) + } + + m = &Communique{ + Union: &Communique_Name{"Barry"}, + } + + // Round-trip. + b, err = Marshal(m) + if err != nil { + t.Fatalf("Marshal of message with oneof: %v", err) + } + if len(b) != 7 { // name tag/wire (1) + name len (1) + name (5) + t.Errorf("Incorrect marshal of message with oneof: %v", b) + } + m.Reset() + if err := Unmarshal(b, m); err != nil { + t.Fatalf("Unmarshal of message with oneof: %v", err) + } + if x, ok := m.Union.(*Communique_Name); !ok || x.Name != "Barry" { + t.Errorf("After round trip, Union = %+v", m.Union) + } + if name := m.GetName(); name != "Barry" { + t.Errorf("After round trip, GetName = %q, want %q", name, "Barry") + } + + // Let's try with a message in the oneof. + m.Union = &Communique_Msg{&Strings{StringField: String("deep deep string")}} + b, err = Marshal(m) + if err != nil { + t.Fatalf("Marshal of message with oneof set to message: %v", err) + } + if len(b) != 20 { // msg tag/wire (1) + msg len (1) + msg (1 + 1 + 16) + t.Errorf("Incorrect marshal of message with oneof set to message: %v", b) + } + m.Reset() + if err := Unmarshal(b, m); err != nil { + t.Fatalf("Unmarshal of message with oneof set to message: %v", err) + } + ss, ok := m.Union.(*Communique_Msg) + if !ok || ss.Msg.GetStringField() != "deep deep string" { + t.Errorf("After round trip with oneof set to message, Union = %+v", m.Union) + } +} + +func TestOneofNilBytes(t *testing.T) { + // A oneof with nil byte slice should marshal to tag + 0 (size), with no error. + m := &Communique{Union: &Communique_Data{Data: nil}} + b, err := Marshal(m) + if err != nil { + t.Fatalf("Marshal failed: %v", err) + } + want := []byte{ + 7<<3 | 2, // tag 7, wire type 2 + 0, // size + } + if !bytes.Equal(b, want) { + t.Errorf("Wrong result of Marshal: got %x, want %x", b, want) + } +} + +func TestInefficientPackedBool(t *testing.T) { + // https://github.com/golang/protobuf/issues/76 + inp := []byte{ + 0x12, 0x02, // 0x12 = 2<<3|2; 2 bytes + // Usually a bool should take a single byte, + // but it is permitted to be any varint. + 0xb9, 0x30, + } + if err := Unmarshal(inp, new(MoreRepeated)); err != nil { + t.Error(err) + } +} + +// Make sure pure-reflect-based implementation handles +// []int32-[]enum conversion correctly. +func TestRepeatedEnum2(t *testing.T) { + pb := &RepeatedEnum{ + Color: []RepeatedEnum_Color{RepeatedEnum_RED}, + } + b, err := Marshal(pb) + if err != nil { + t.Fatalf("Marshal failed: %v", err) + } + x := new(RepeatedEnum) + err = Unmarshal(b, x) + if err != nil { + t.Fatalf("Unmarshal failed: %v", err) + } + if !Equal(pb, x) { + t.Errorf("Incorrect result: want: %v got: %v", pb, x) + } +} + +// TestConcurrentMarshal makes sure that it is safe to marshal +// same message in multiple goroutines concurrently. +func TestConcurrentMarshal(t *testing.T) { + pb := initGoTest(true) + const N = 100 + b := make([][]byte, N) + + var wg sync.WaitGroup + for i := 0; i < N; i++ { + wg.Add(1) + go func(i int) { + defer wg.Done() + var err error + b[i], err = Marshal(pb) + if err != nil { + t.Errorf("marshal error: %v", err) + } + }(i) + } + + wg.Wait() + for i := 1; i < N; i++ { + if !bytes.Equal(b[0], b[i]) { + t.Errorf("concurrent marshal result not same: b[0] = %v, b[%d] = %v", b[0], i, b[i]) + } + } +} + +func TestInvalidUTF8(t *testing.T) { + const wire = "\x12\x04\xde\xea\xca\xfe" + + var m GoTest + if err := Unmarshal([]byte(wire), &m); err == nil { + t.Errorf("Unmarshal error: got nil, want non-nil") + } + + m.Reset() + m.Table = String(wire[2:]) + if _, err := Marshal(&m); err == nil { + t.Errorf("Marshal error: got nil, want non-nil") + } +} + +// Benchmarks + +func testMsg() *GoTest { + pb := initGoTest(true) + const N = 1000 // Internally the library starts much smaller. + pb.F_Int32Repeated = make([]int32, N) + pb.F_DoubleRepeated = make([]float64, N) + for i := 0; i < N; i++ { + pb.F_Int32Repeated[i] = int32(i) + pb.F_DoubleRepeated[i] = float64(i) + } + return pb +} + +func bytesMsg() *GoTest { + pb := initGoTest(true) + buf := make([]byte, 4000) + for i := range buf { + buf[i] = byte(i) + } + pb.F_BytesDefaulted = buf + return pb +} + +func benchmarkMarshal(b *testing.B, pb Message, marshal func(Message) ([]byte, error)) { + d, _ := marshal(pb) + b.SetBytes(int64(len(d))) + b.ResetTimer() + for i := 0; i < b.N; i++ { + marshal(pb) + } +} + +func benchmarkBufferMarshal(b *testing.B, pb Message) { + p := NewBuffer(nil) + benchmarkMarshal(b, pb, func(pb0 Message) ([]byte, error) { + p.Reset() + err := p.Marshal(pb0) + return p.Bytes(), err + }) +} + +func benchmarkSize(b *testing.B, pb Message) { + benchmarkMarshal(b, pb, func(pb0 Message) ([]byte, error) { + Size(pb) + return nil, nil + }) +} + +func newOf(pb Message) Message { + in := reflect.ValueOf(pb) + if in.IsNil() { + return pb + } + return reflect.New(in.Type().Elem()).Interface().(Message) +} + +func benchmarkUnmarshal(b *testing.B, pb Message, unmarshal func([]byte, Message) error) { + d, _ := Marshal(pb) + b.SetBytes(int64(len(d))) + pbd := newOf(pb) + + b.ResetTimer() + for i := 0; i < b.N; i++ { + unmarshal(d, pbd) + } +} + +func benchmarkBufferUnmarshal(b *testing.B, pb Message) { + p := NewBuffer(nil) + benchmarkUnmarshal(b, pb, func(d []byte, pb0 Message) error { + p.SetBuf(d) + return p.Unmarshal(pb0) + }) +} + +// Benchmark{Marshal,BufferMarshal,Size,Unmarshal,BufferUnmarshal}{,Bytes} + +func BenchmarkMarshal(b *testing.B) { + benchmarkMarshal(b, testMsg(), Marshal) +} + +func BenchmarkBufferMarshal(b *testing.B) { + benchmarkBufferMarshal(b, testMsg()) +} + +func BenchmarkSize(b *testing.B) { + benchmarkSize(b, testMsg()) +} + +func BenchmarkUnmarshal(b *testing.B) { + benchmarkUnmarshal(b, testMsg(), Unmarshal) +} + +func BenchmarkBufferUnmarshal(b *testing.B) { + benchmarkBufferUnmarshal(b, testMsg()) +} + +func BenchmarkMarshalBytes(b *testing.B) { + benchmarkMarshal(b, bytesMsg(), Marshal) +} + +func BenchmarkBufferMarshalBytes(b *testing.B) { + benchmarkBufferMarshal(b, bytesMsg()) +} + +func BenchmarkSizeBytes(b *testing.B) { + benchmarkSize(b, bytesMsg()) +} + +func BenchmarkUnmarshalBytes(b *testing.B) { + benchmarkUnmarshal(b, bytesMsg(), Unmarshal) +} + +func BenchmarkBufferUnmarshalBytes(b *testing.B) { + benchmarkBufferUnmarshal(b, bytesMsg()) +} + +func BenchmarkUnmarshalUnrecognizedFields(b *testing.B) { + b.StopTimer() + pb := initGoTestField() + skip := &GoSkipTest{ + SkipInt32: Int32(32), + SkipFixed32: Uint32(3232), + SkipFixed64: Uint64(6464), + SkipString: String("skipper"), + Skipgroup: &GoSkipTest_SkipGroup{ + GroupInt32: Int32(75), + GroupString: String("wxyz"), + }, + } + + pbd := new(GoTestField) + p := NewBuffer(nil) + p.Marshal(pb) + p.Marshal(skip) + p2 := NewBuffer(nil) + + b.StartTimer() + for i := 0; i < b.N; i++ { + p2.SetBuf(p.Bytes()) + p2.Unmarshal(pbd) + } +} diff --git a/api/vendor/github.com/golang/protobuf/proto/any_test.go b/api/vendor/github.com/golang/protobuf/proto/any_test.go new file mode 100644 index 0000000..56fc97c --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/proto/any_test.go @@ -0,0 +1,300 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package proto_test + +import ( + "strings" + "testing" + + "github.com/golang/protobuf/proto" + + pb "github.com/golang/protobuf/proto/proto3_proto" + testpb "github.com/golang/protobuf/proto/test_proto" + anypb "github.com/golang/protobuf/ptypes/any" +) + +var ( + expandedMarshaler = proto.TextMarshaler{ExpandAny: true} + expandedCompactMarshaler = proto.TextMarshaler{Compact: true, ExpandAny: true} +) + +// anyEqual reports whether two messages which may be google.protobuf.Any or may +// contain google.protobuf.Any fields are equal. We can't use proto.Equal for +// comparison, because semantically equivalent messages may be marshaled to +// binary in different tag order. Instead, trust that TextMarshaler with +// ExpandAny option works and compare the text marshaling results. +func anyEqual(got, want proto.Message) bool { + // if messages are proto.Equal, no need to marshal. + if proto.Equal(got, want) { + return true + } + g := expandedMarshaler.Text(got) + w := expandedMarshaler.Text(want) + return g == w +} + +type golden struct { + m proto.Message + t, c string +} + +var goldenMessages = makeGolden() + +func makeGolden() []golden { + nested := &pb.Nested{Bunny: "Monty"} + nb, err := proto.Marshal(nested) + if err != nil { + panic(err) + } + m1 := &pb.Message{ + Name: "David", + ResultCount: 47, + Anything: &anypb.Any{TypeUrl: "type.googleapis.com/" + proto.MessageName(nested), Value: nb}, + } + m2 := &pb.Message{ + Name: "David", + ResultCount: 47, + Anything: &anypb.Any{TypeUrl: "http://[::1]/type.googleapis.com/" + proto.MessageName(nested), Value: nb}, + } + m3 := &pb.Message{ + Name: "David", + ResultCount: 47, + Anything: &anypb.Any{TypeUrl: `type.googleapis.com/"/` + proto.MessageName(nested), Value: nb}, + } + m4 := &pb.Message{ + Name: "David", + ResultCount: 47, + Anything: &anypb.Any{TypeUrl: "type.googleapis.com/a/path/" + proto.MessageName(nested), Value: nb}, + } + m5 := &anypb.Any{TypeUrl: "type.googleapis.com/" + proto.MessageName(nested), Value: nb} + + any1 := &testpb.MyMessage{Count: proto.Int32(47), Name: proto.String("David")} + proto.SetExtension(any1, testpb.E_Ext_More, &testpb.Ext{Data: proto.String("foo")}) + proto.SetExtension(any1, testpb.E_Ext_Text, proto.String("bar")) + any1b, err := proto.Marshal(any1) + if err != nil { + panic(err) + } + any2 := &testpb.MyMessage{Count: proto.Int32(42), Bikeshed: testpb.MyMessage_GREEN.Enum(), RepBytes: [][]byte{[]byte("roboto")}} + proto.SetExtension(any2, testpb.E_Ext_More, &testpb.Ext{Data: proto.String("baz")}) + any2b, err := proto.Marshal(any2) + if err != nil { + panic(err) + } + m6 := &pb.Message{ + Name: "David", + ResultCount: 47, + Anything: &anypb.Any{TypeUrl: "type.googleapis.com/" + proto.MessageName(any1), Value: any1b}, + ManyThings: []*anypb.Any{ + &anypb.Any{TypeUrl: "type.googleapis.com/" + proto.MessageName(any2), Value: any2b}, + &anypb.Any{TypeUrl: "type.googleapis.com/" + proto.MessageName(any1), Value: any1b}, + }, + } + + const ( + m1Golden = ` +name: "David" +result_count: 47 +anything: < + [type.googleapis.com/proto3_proto.Nested]: < + bunny: "Monty" + > +> +` + m2Golden = ` +name: "David" +result_count: 47 +anything: < + ["http://[::1]/type.googleapis.com/proto3_proto.Nested"]: < + bunny: "Monty" + > +> +` + m3Golden = ` +name: "David" +result_count: 47 +anything: < + ["type.googleapis.com/\"/proto3_proto.Nested"]: < + bunny: "Monty" + > +> +` + m4Golden = ` +name: "David" +result_count: 47 +anything: < + [type.googleapis.com/a/path/proto3_proto.Nested]: < + bunny: "Monty" + > +> +` + m5Golden = ` +[type.googleapis.com/proto3_proto.Nested]: < + bunny: "Monty" +> +` + m6Golden = ` +name: "David" +result_count: 47 +anything: < + [type.googleapis.com/test_proto.MyMessage]: < + count: 47 + name: "David" + [test_proto.Ext.more]: < + data: "foo" + > + [test_proto.Ext.text]: "bar" + > +> +many_things: < + [type.googleapis.com/test_proto.MyMessage]: < + count: 42 + bikeshed: GREEN + rep_bytes: "roboto" + [test_proto.Ext.more]: < + data: "baz" + > + > +> +many_things: < + [type.googleapis.com/test_proto.MyMessage]: < + count: 47 + name: "David" + [test_proto.Ext.more]: < + data: "foo" + > + [test_proto.Ext.text]: "bar" + > +> +` + ) + return []golden{ + {m1, strings.TrimSpace(m1Golden) + "\n", strings.TrimSpace(compact(m1Golden)) + " "}, + {m2, strings.TrimSpace(m2Golden) + "\n", strings.TrimSpace(compact(m2Golden)) + " "}, + {m3, strings.TrimSpace(m3Golden) + "\n", strings.TrimSpace(compact(m3Golden)) + " "}, + {m4, strings.TrimSpace(m4Golden) + "\n", strings.TrimSpace(compact(m4Golden)) + " "}, + {m5, strings.TrimSpace(m5Golden) + "\n", strings.TrimSpace(compact(m5Golden)) + " "}, + {m6, strings.TrimSpace(m6Golden) + "\n", strings.TrimSpace(compact(m6Golden)) + " "}, + } +} + +func TestMarshalGolden(t *testing.T) { + for _, tt := range goldenMessages { + if got, want := expandedMarshaler.Text(tt.m), tt.t; got != want { + t.Errorf("message %v: got:\n%s\nwant:\n%s", tt.m, got, want) + } + if got, want := expandedCompactMarshaler.Text(tt.m), tt.c; got != want { + t.Errorf("message %v: got:\n`%s`\nwant:\n`%s`", tt.m, got, want) + } + } +} + +func TestUnmarshalGolden(t *testing.T) { + for _, tt := range goldenMessages { + want := tt.m + got := proto.Clone(tt.m) + got.Reset() + if err := proto.UnmarshalText(tt.t, got); err != nil { + t.Errorf("failed to unmarshal\n%s\nerror: %v", tt.t, err) + } + if !anyEqual(got, want) { + t.Errorf("message:\n%s\ngot:\n%s\nwant:\n%s", tt.t, got, want) + } + got.Reset() + if err := proto.UnmarshalText(tt.c, got); err != nil { + t.Errorf("failed to unmarshal\n%s\nerror: %v", tt.c, err) + } + if !anyEqual(got, want) { + t.Errorf("message:\n%s\ngot:\n%s\nwant:\n%s", tt.c, got, want) + } + } +} + +func TestMarshalUnknownAny(t *testing.T) { + m := &pb.Message{ + Anything: &anypb.Any{ + TypeUrl: "foo", + Value: []byte("bar"), + }, + } + want := `anything: < + type_url: "foo" + value: "bar" +> +` + got := expandedMarshaler.Text(m) + if got != want { + t.Errorf("got\n`%s`\nwant\n`%s`", got, want) + } +} + +func TestAmbiguousAny(t *testing.T) { + pb := &anypb.Any{} + err := proto.UnmarshalText(` + type_url: "ttt/proto3_proto.Nested" + value: "\n\x05Monty" + `, pb) + t.Logf("result: %v (error: %v)", expandedMarshaler.Text(pb), err) + if err != nil { + t.Errorf("failed to parse ambiguous Any message: %v", err) + } +} + +func TestUnmarshalOverwriteAny(t *testing.T) { + pb := &anypb.Any{} + err := proto.UnmarshalText(` + [type.googleapis.com/a/path/proto3_proto.Nested]: < + bunny: "Monty" + > + [type.googleapis.com/a/path/proto3_proto.Nested]: < + bunny: "Rabbit of Caerbannog" + > + `, pb) + want := `line 7: Any message unpacked multiple times, or "type_url" already set` + if err.Error() != want { + t.Errorf("incorrect error.\nHave: %v\nWant: %v", err.Error(), want) + } +} + +func TestUnmarshalAnyMixAndMatch(t *testing.T) { + pb := &anypb.Any{} + err := proto.UnmarshalText(` + value: "\n\x05Monty" + [type.googleapis.com/a/path/proto3_proto.Nested]: < + bunny: "Rabbit of Caerbannog" + > + `, pb) + want := `line 5: Any message unpacked multiple times, or "value" already set` + if err.Error() != want { + t.Errorf("incorrect error.\nHave: %v\nWant: %v", err.Error(), want) + } +} diff --git a/api/vendor/github.com/golang/protobuf/proto/clone.go b/api/vendor/github.com/golang/protobuf/proto/clone.go new file mode 100644 index 0000000..3cd3249 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/proto/clone.go @@ -0,0 +1,253 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2011 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +// Protocol buffer deep copy and merge. +// TODO: RawMessage. + +package proto + +import ( + "fmt" + "log" + "reflect" + "strings" +) + +// Clone returns a deep copy of a protocol buffer. +func Clone(src Message) Message { + in := reflect.ValueOf(src) + if in.IsNil() { + return src + } + out := reflect.New(in.Type().Elem()) + dst := out.Interface().(Message) + Merge(dst, src) + return dst +} + +// Merger is the interface representing objects that can merge messages of the same type. +type Merger interface { + // Merge merges src into this message. + // Required and optional fields that are set in src will be set to that value in dst. + // Elements of repeated fields will be appended. + // + // Merge may panic if called with a different argument type than the receiver. + Merge(src Message) +} + +// generatedMerger is the custom merge method that generated protos will have. +// We must add this method since a generate Merge method will conflict with +// many existing protos that have a Merge data field already defined. +type generatedMerger interface { + XXX_Merge(src Message) +} + +// Merge merges src into dst. +// Required and optional fields that are set in src will be set to that value in dst. +// Elements of repeated fields will be appended. +// Merge panics if src and dst are not the same type, or if dst is nil. +func Merge(dst, src Message) { + if m, ok := dst.(Merger); ok { + m.Merge(src) + return + } + + in := reflect.ValueOf(src) + out := reflect.ValueOf(dst) + if out.IsNil() { + panic("proto: nil destination") + } + if in.Type() != out.Type() { + panic(fmt.Sprintf("proto.Merge(%T, %T) type mismatch", dst, src)) + } + if in.IsNil() { + return // Merge from nil src is a noop + } + if m, ok := dst.(generatedMerger); ok { + m.XXX_Merge(src) + return + } + mergeStruct(out.Elem(), in.Elem()) +} + +func mergeStruct(out, in reflect.Value) { + sprop := GetProperties(in.Type()) + for i := 0; i < in.NumField(); i++ { + f := in.Type().Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + mergeAny(out.Field(i), in.Field(i), false, sprop.Prop[i]) + } + + if emIn, err := extendable(in.Addr().Interface()); err == nil { + emOut, _ := extendable(out.Addr().Interface()) + mIn, muIn := emIn.extensionsRead() + if mIn != nil { + mOut := emOut.extensionsWrite() + muIn.Lock() + mergeExtension(mOut, mIn) + muIn.Unlock() + } + } + + uf := in.FieldByName("XXX_unrecognized") + if !uf.IsValid() { + return + } + uin := uf.Bytes() + if len(uin) > 0 { + out.FieldByName("XXX_unrecognized").SetBytes(append([]byte(nil), uin...)) + } +} + +// mergeAny performs a merge between two values of the same type. +// viaPtr indicates whether the values were indirected through a pointer (implying proto2). +// prop is set if this is a struct field (it may be nil). +func mergeAny(out, in reflect.Value, viaPtr bool, prop *Properties) { + if in.Type() == protoMessageType { + if !in.IsNil() { + if out.IsNil() { + out.Set(reflect.ValueOf(Clone(in.Interface().(Message)))) + } else { + Merge(out.Interface().(Message), in.Interface().(Message)) + } + } + return + } + switch in.Kind() { + case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, + reflect.String, reflect.Uint32, reflect.Uint64: + if !viaPtr && isProto3Zero(in) { + return + } + out.Set(in) + case reflect.Interface: + // Probably a oneof field; copy non-nil values. + if in.IsNil() { + return + } + // Allocate destination if it is not set, or set to a different type. + // Otherwise we will merge as normal. + if out.IsNil() || out.Elem().Type() != in.Elem().Type() { + out.Set(reflect.New(in.Elem().Elem().Type())) // interface -> *T -> T -> new(T) + } + mergeAny(out.Elem(), in.Elem(), false, nil) + case reflect.Map: + if in.Len() == 0 { + return + } + if out.IsNil() { + out.Set(reflect.MakeMap(in.Type())) + } + // For maps with value types of *T or []byte we need to deep copy each value. + elemKind := in.Type().Elem().Kind() + for _, key := range in.MapKeys() { + var val reflect.Value + switch elemKind { + case reflect.Ptr: + val = reflect.New(in.Type().Elem().Elem()) + mergeAny(val, in.MapIndex(key), false, nil) + case reflect.Slice: + val = in.MapIndex(key) + val = reflect.ValueOf(append([]byte{}, val.Bytes()...)) + default: + val = in.MapIndex(key) + } + out.SetMapIndex(key, val) + } + case reflect.Ptr: + if in.IsNil() { + return + } + if out.IsNil() { + out.Set(reflect.New(in.Elem().Type())) + } + mergeAny(out.Elem(), in.Elem(), true, nil) + case reflect.Slice: + if in.IsNil() { + return + } + if in.Type().Elem().Kind() == reflect.Uint8 { + // []byte is a scalar bytes field, not a repeated field. + + // Edge case: if this is in a proto3 message, a zero length + // bytes field is considered the zero value, and should not + // be merged. + if prop != nil && prop.proto3 && in.Len() == 0 { + return + } + + // Make a deep copy. + // Append to []byte{} instead of []byte(nil) so that we never end up + // with a nil result. + out.SetBytes(append([]byte{}, in.Bytes()...)) + return + } + n := in.Len() + if out.IsNil() { + out.Set(reflect.MakeSlice(in.Type(), 0, n)) + } + switch in.Type().Elem().Kind() { + case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, + reflect.String, reflect.Uint32, reflect.Uint64: + out.Set(reflect.AppendSlice(out, in)) + default: + for i := 0; i < n; i++ { + x := reflect.Indirect(reflect.New(in.Type().Elem())) + mergeAny(x, in.Index(i), false, nil) + out.Set(reflect.Append(out, x)) + } + } + case reflect.Struct: + mergeStruct(out, in) + default: + // unknown type, so not a protocol buffer + log.Printf("proto: don't know how to copy %v", in) + } +} + +func mergeExtension(out, in map[int32]Extension) { + for extNum, eIn := range in { + eOut := Extension{desc: eIn.desc} + if eIn.value != nil { + v := reflect.New(reflect.TypeOf(eIn.value)).Elem() + mergeAny(v, reflect.ValueOf(eIn.value), false, nil) + eOut.value = v.Interface() + } + if eIn.enc != nil { + eOut.enc = make([]byte, len(eIn.enc)) + copy(eOut.enc, eIn.enc) + } + + out[extNum] = eOut + } +} diff --git a/api/vendor/github.com/golang/protobuf/proto/clone_test.go b/api/vendor/github.com/golang/protobuf/proto/clone_test.go new file mode 100644 index 0000000..0d3b127 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/proto/clone_test.go @@ -0,0 +1,390 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2011 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package proto_test + +import ( + "testing" + + "github.com/golang/protobuf/proto" + + proto3pb "github.com/golang/protobuf/proto/proto3_proto" + pb "github.com/golang/protobuf/proto/test_proto" +) + +var cloneTestMessage = &pb.MyMessage{ + Count: proto.Int32(42), + Name: proto.String("Dave"), + Pet: []string{"bunny", "kitty", "horsey"}, + Inner: &pb.InnerMessage{ + Host: proto.String("niles"), + Port: proto.Int32(9099), + Connected: proto.Bool(true), + }, + Others: []*pb.OtherMessage{ + { + Value: []byte("some bytes"), + }, + }, + Somegroup: &pb.MyMessage_SomeGroup{ + GroupField: proto.Int32(6), + }, + RepBytes: [][]byte{[]byte("sham"), []byte("wow")}, +} + +func init() { + ext := &pb.Ext{ + Data: proto.String("extension"), + } + if err := proto.SetExtension(cloneTestMessage, pb.E_Ext_More, ext); err != nil { + panic("SetExtension: " + err.Error()) + } +} + +func TestClone(t *testing.T) { + m := proto.Clone(cloneTestMessage).(*pb.MyMessage) + if !proto.Equal(m, cloneTestMessage) { + t.Fatalf("Clone(%v) = %v", cloneTestMessage, m) + } + + // Verify it was a deep copy. + *m.Inner.Port++ + if proto.Equal(m, cloneTestMessage) { + t.Error("Mutating clone changed the original") + } + // Byte fields and repeated fields should be copied. + if &m.Pet[0] == &cloneTestMessage.Pet[0] { + t.Error("Pet: repeated field not copied") + } + if &m.Others[0] == &cloneTestMessage.Others[0] { + t.Error("Others: repeated field not copied") + } + if &m.Others[0].Value[0] == &cloneTestMessage.Others[0].Value[0] { + t.Error("Others[0].Value: bytes field not copied") + } + if &m.RepBytes[0] == &cloneTestMessage.RepBytes[0] { + t.Error("RepBytes: repeated field not copied") + } + if &m.RepBytes[0][0] == &cloneTestMessage.RepBytes[0][0] { + t.Error("RepBytes[0]: bytes field not copied") + } +} + +func TestCloneNil(t *testing.T) { + var m *pb.MyMessage + if c := proto.Clone(m); !proto.Equal(m, c) { + t.Errorf("Clone(%v) = %v", m, c) + } +} + +var mergeTests = []struct { + src, dst, want proto.Message +}{ + { + src: &pb.MyMessage{ + Count: proto.Int32(42), + }, + dst: &pb.MyMessage{ + Name: proto.String("Dave"), + }, + want: &pb.MyMessage{ + Count: proto.Int32(42), + Name: proto.String("Dave"), + }, + }, + { + src: &pb.MyMessage{ + Inner: &pb.InnerMessage{ + Host: proto.String("hey"), + Connected: proto.Bool(true), + }, + Pet: []string{"horsey"}, + Others: []*pb.OtherMessage{ + { + Value: []byte("some bytes"), + }, + }, + }, + dst: &pb.MyMessage{ + Inner: &pb.InnerMessage{ + Host: proto.String("niles"), + Port: proto.Int32(9099), + }, + Pet: []string{"bunny", "kitty"}, + Others: []*pb.OtherMessage{ + { + Key: proto.Int64(31415926535), + }, + { + // Explicitly test a src=nil field + Inner: nil, + }, + }, + }, + want: &pb.MyMessage{ + Inner: &pb.InnerMessage{ + Host: proto.String("hey"), + Connected: proto.Bool(true), + Port: proto.Int32(9099), + }, + Pet: []string{"bunny", "kitty", "horsey"}, + Others: []*pb.OtherMessage{ + { + Key: proto.Int64(31415926535), + }, + {}, + { + Value: []byte("some bytes"), + }, + }, + }, + }, + { + src: &pb.MyMessage{ + RepBytes: [][]byte{[]byte("wow")}, + }, + dst: &pb.MyMessage{ + Somegroup: &pb.MyMessage_SomeGroup{ + GroupField: proto.Int32(6), + }, + RepBytes: [][]byte{[]byte("sham")}, + }, + want: &pb.MyMessage{ + Somegroup: &pb.MyMessage_SomeGroup{ + GroupField: proto.Int32(6), + }, + RepBytes: [][]byte{[]byte("sham"), []byte("wow")}, + }, + }, + // Check that a scalar bytes field replaces rather than appends. + { + src: &pb.OtherMessage{Value: []byte("foo")}, + dst: &pb.OtherMessage{Value: []byte("bar")}, + want: &pb.OtherMessage{Value: []byte("foo")}, + }, + { + src: &pb.MessageWithMap{ + NameMapping: map[int32]string{6: "Nigel"}, + MsgMapping: map[int64]*pb.FloatingPoint{ + 0x4001: &pb.FloatingPoint{F: proto.Float64(2.0)}, + 0x4002: &pb.FloatingPoint{ + F: proto.Float64(2.0), + }, + }, + ByteMapping: map[bool][]byte{true: []byte("wowsa")}, + }, + dst: &pb.MessageWithMap{ + NameMapping: map[int32]string{ + 6: "Bruce", // should be overwritten + 7: "Andrew", + }, + MsgMapping: map[int64]*pb.FloatingPoint{ + 0x4002: &pb.FloatingPoint{ + F: proto.Float64(3.0), + Exact: proto.Bool(true), + }, // the entire message should be overwritten + }, + }, + want: &pb.MessageWithMap{ + NameMapping: map[int32]string{ + 6: "Nigel", + 7: "Andrew", + }, + MsgMapping: map[int64]*pb.FloatingPoint{ + 0x4001: &pb.FloatingPoint{F: proto.Float64(2.0)}, + 0x4002: &pb.FloatingPoint{ + F: proto.Float64(2.0), + }, + }, + ByteMapping: map[bool][]byte{true: []byte("wowsa")}, + }, + }, + // proto3 shouldn't merge zero values, + // in the same way that proto2 shouldn't merge nils. + { + src: &proto3pb.Message{ + Name: "Aaron", + Data: []byte(""), // zero value, but not nil + }, + dst: &proto3pb.Message{ + HeightInCm: 176, + Data: []byte("texas!"), + }, + want: &proto3pb.Message{ + Name: "Aaron", + HeightInCm: 176, + Data: []byte("texas!"), + }, + }, + { // Oneof fields should merge by assignment. + src: &pb.Communique{Union: &pb.Communique_Number{41}}, + dst: &pb.Communique{Union: &pb.Communique_Name{"Bobby Tables"}}, + want: &pb.Communique{Union: &pb.Communique_Number{41}}, + }, + { // Oneof nil is the same as not set. + src: &pb.Communique{}, + dst: &pb.Communique{Union: &pb.Communique_Name{"Bobby Tables"}}, + want: &pb.Communique{Union: &pb.Communique_Name{"Bobby Tables"}}, + }, + { + src: &pb.Communique{Union: &pb.Communique_Number{1337}}, + dst: &pb.Communique{}, + want: &pb.Communique{Union: &pb.Communique_Number{1337}}, + }, + { + src: &pb.Communique{Union: &pb.Communique_Col{pb.MyMessage_RED}}, + dst: &pb.Communique{}, + want: &pb.Communique{Union: &pb.Communique_Col{pb.MyMessage_RED}}, + }, + { + src: &pb.Communique{Union: &pb.Communique_Data{[]byte("hello")}}, + dst: &pb.Communique{}, + want: &pb.Communique{Union: &pb.Communique_Data{[]byte("hello")}}, + }, + { + src: &pb.Communique{Union: &pb.Communique_Msg{&pb.Strings{BytesField: []byte{1, 2, 3}}}}, + dst: &pb.Communique{}, + want: &pb.Communique{Union: &pb.Communique_Msg{&pb.Strings{BytesField: []byte{1, 2, 3}}}}, + }, + { + src: &pb.Communique{Union: &pb.Communique_Msg{}}, + dst: &pb.Communique{}, + want: &pb.Communique{Union: &pb.Communique_Msg{}}, + }, + { + src: &pb.Communique{Union: &pb.Communique_Msg{&pb.Strings{StringField: proto.String("123")}}}, + dst: &pb.Communique{Union: &pb.Communique_Msg{&pb.Strings{BytesField: []byte{1, 2, 3}}}}, + want: &pb.Communique{Union: &pb.Communique_Msg{&pb.Strings{StringField: proto.String("123"), BytesField: []byte{1, 2, 3}}}}, + }, + { + src: &proto3pb.Message{ + Terrain: map[string]*proto3pb.Nested{ + "kay_a": &proto3pb.Nested{Cute: true}, // replace + "kay_b": &proto3pb.Nested{Bunny: "rabbit"}, // insert + }, + }, + dst: &proto3pb.Message{ + Terrain: map[string]*proto3pb.Nested{ + "kay_a": &proto3pb.Nested{Bunny: "lost"}, // replaced + "kay_c": &proto3pb.Nested{Bunny: "bunny"}, // keep + }, + }, + want: &proto3pb.Message{ + Terrain: map[string]*proto3pb.Nested{ + "kay_a": &proto3pb.Nested{Cute: true}, + "kay_b": &proto3pb.Nested{Bunny: "rabbit"}, + "kay_c": &proto3pb.Nested{Bunny: "bunny"}, + }, + }, + }, + { + src: &pb.GoTest{ + F_BoolRepeated: []bool{}, + F_Int32Repeated: []int32{}, + F_Int64Repeated: []int64{}, + F_Uint32Repeated: []uint32{}, + F_Uint64Repeated: []uint64{}, + F_FloatRepeated: []float32{}, + F_DoubleRepeated: []float64{}, + F_StringRepeated: []string{}, + F_BytesRepeated: [][]byte{}, + }, + dst: &pb.GoTest{}, + want: &pb.GoTest{ + F_BoolRepeated: []bool{}, + F_Int32Repeated: []int32{}, + F_Int64Repeated: []int64{}, + F_Uint32Repeated: []uint32{}, + F_Uint64Repeated: []uint64{}, + F_FloatRepeated: []float32{}, + F_DoubleRepeated: []float64{}, + F_StringRepeated: []string{}, + F_BytesRepeated: [][]byte{}, + }, + }, + { + src: &pb.GoTest{}, + dst: &pb.GoTest{ + F_BoolRepeated: []bool{}, + F_Int32Repeated: []int32{}, + F_Int64Repeated: []int64{}, + F_Uint32Repeated: []uint32{}, + F_Uint64Repeated: []uint64{}, + F_FloatRepeated: []float32{}, + F_DoubleRepeated: []float64{}, + F_StringRepeated: []string{}, + F_BytesRepeated: [][]byte{}, + }, + want: &pb.GoTest{ + F_BoolRepeated: []bool{}, + F_Int32Repeated: []int32{}, + F_Int64Repeated: []int64{}, + F_Uint32Repeated: []uint32{}, + F_Uint64Repeated: []uint64{}, + F_FloatRepeated: []float32{}, + F_DoubleRepeated: []float64{}, + F_StringRepeated: []string{}, + F_BytesRepeated: [][]byte{}, + }, + }, + { + src: &pb.GoTest{ + F_BytesRepeated: [][]byte{nil, []byte{}, []byte{0}}, + }, + dst: &pb.GoTest{}, + want: &pb.GoTest{ + F_BytesRepeated: [][]byte{nil, []byte{}, []byte{0}}, + }, + }, + { + src: &pb.MyMessage{ + Others: []*pb.OtherMessage{}, + }, + dst: &pb.MyMessage{}, + want: &pb.MyMessage{ + Others: []*pb.OtherMessage{}, + }, + }, +} + +func TestMerge(t *testing.T) { + for _, m := range mergeTests { + got := proto.Clone(m.dst) + if !proto.Equal(got, m.dst) { + t.Errorf("Clone()\ngot %v\nwant %v", got, m.dst) + continue + } + proto.Merge(got, m.src) + if !proto.Equal(got, m.want) { + t.Errorf("Merge(%v, %v)\ngot %v\nwant %v", m.dst, m.src, got, m.want) + } + } +} diff --git a/api/vendor/github.com/golang/protobuf/proto/decode.go b/api/vendor/github.com/golang/protobuf/proto/decode.go new file mode 100644 index 0000000..d9aa3c4 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/proto/decode.go @@ -0,0 +1,428 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package proto + +/* + * Routines for decoding protocol buffer data to construct in-memory representations. + */ + +import ( + "errors" + "fmt" + "io" +) + +// errOverflow is returned when an integer is too large to be represented. +var errOverflow = errors.New("proto: integer overflow") + +// ErrInternalBadWireType is returned by generated code when an incorrect +// wire type is encountered. It does not get returned to user code. +var ErrInternalBadWireType = errors.New("proto: internal error: bad wiretype for oneof") + +// DecodeVarint reads a varint-encoded integer from the slice. +// It returns the integer and the number of bytes consumed, or +// zero if there is not enough. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +func DecodeVarint(buf []byte) (x uint64, n int) { + for shift := uint(0); shift < 64; shift += 7 { + if n >= len(buf) { + return 0, 0 + } + b := uint64(buf[n]) + n++ + x |= (b & 0x7F) << shift + if (b & 0x80) == 0 { + return x, n + } + } + + // The number is too large to represent in a 64-bit value. + return 0, 0 +} + +func (p *Buffer) decodeVarintSlow() (x uint64, err error) { + i := p.index + l := len(p.buf) + + for shift := uint(0); shift < 64; shift += 7 { + if i >= l { + err = io.ErrUnexpectedEOF + return + } + b := p.buf[i] + i++ + x |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + p.index = i + return + } + } + + // The number is too large to represent in a 64-bit value. + err = errOverflow + return +} + +// DecodeVarint reads a varint-encoded integer from the Buffer. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +func (p *Buffer) DecodeVarint() (x uint64, err error) { + i := p.index + buf := p.buf + + if i >= len(buf) { + return 0, io.ErrUnexpectedEOF + } else if buf[i] < 0x80 { + p.index++ + return uint64(buf[i]), nil + } else if len(buf)-i < 10 { + return p.decodeVarintSlow() + } + + var b uint64 + // we already checked the first byte + x = uint64(buf[i]) - 0x80 + i++ + + b = uint64(buf[i]) + i++ + x += b << 7 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 7 + + b = uint64(buf[i]) + i++ + x += b << 14 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 14 + + b = uint64(buf[i]) + i++ + x += b << 21 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 21 + + b = uint64(buf[i]) + i++ + x += b << 28 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 28 + + b = uint64(buf[i]) + i++ + x += b << 35 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 35 + + b = uint64(buf[i]) + i++ + x += b << 42 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 42 + + b = uint64(buf[i]) + i++ + x += b << 49 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 49 + + b = uint64(buf[i]) + i++ + x += b << 56 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 56 + + b = uint64(buf[i]) + i++ + x += b << 63 + if b&0x80 == 0 { + goto done + } + // x -= 0x80 << 63 // Always zero. + + return 0, errOverflow + +done: + p.index = i + return x, nil +} + +// DecodeFixed64 reads a 64-bit integer from the Buffer. +// This is the format for the +// fixed64, sfixed64, and double protocol buffer types. +func (p *Buffer) DecodeFixed64() (x uint64, err error) { + // x, err already 0 + i := p.index + 8 + if i < 0 || i > len(p.buf) { + err = io.ErrUnexpectedEOF + return + } + p.index = i + + x = uint64(p.buf[i-8]) + x |= uint64(p.buf[i-7]) << 8 + x |= uint64(p.buf[i-6]) << 16 + x |= uint64(p.buf[i-5]) << 24 + x |= uint64(p.buf[i-4]) << 32 + x |= uint64(p.buf[i-3]) << 40 + x |= uint64(p.buf[i-2]) << 48 + x |= uint64(p.buf[i-1]) << 56 + return +} + +// DecodeFixed32 reads a 32-bit integer from the Buffer. +// This is the format for the +// fixed32, sfixed32, and float protocol buffer types. +func (p *Buffer) DecodeFixed32() (x uint64, err error) { + // x, err already 0 + i := p.index + 4 + if i < 0 || i > len(p.buf) { + err = io.ErrUnexpectedEOF + return + } + p.index = i + + x = uint64(p.buf[i-4]) + x |= uint64(p.buf[i-3]) << 8 + x |= uint64(p.buf[i-2]) << 16 + x |= uint64(p.buf[i-1]) << 24 + return +} + +// DecodeZigzag64 reads a zigzag-encoded 64-bit integer +// from the Buffer. +// This is the format used for the sint64 protocol buffer type. +func (p *Buffer) DecodeZigzag64() (x uint64, err error) { + x, err = p.DecodeVarint() + if err != nil { + return + } + x = (x >> 1) ^ uint64((int64(x&1)<<63)>>63) + return +} + +// DecodeZigzag32 reads a zigzag-encoded 32-bit integer +// from the Buffer. +// This is the format used for the sint32 protocol buffer type. +func (p *Buffer) DecodeZigzag32() (x uint64, err error) { + x, err = p.DecodeVarint() + if err != nil { + return + } + x = uint64((uint32(x) >> 1) ^ uint32((int32(x&1)<<31)>>31)) + return +} + +// DecodeRawBytes reads a count-delimited byte buffer from the Buffer. +// This is the format used for the bytes protocol buffer +// type and for embedded messages. +func (p *Buffer) DecodeRawBytes(alloc bool) (buf []byte, err error) { + n, err := p.DecodeVarint() + if err != nil { + return nil, err + } + + nb := int(n) + if nb < 0 { + return nil, fmt.Errorf("proto: bad byte length %d", nb) + } + end := p.index + nb + if end < p.index || end > len(p.buf) { + return nil, io.ErrUnexpectedEOF + } + + if !alloc { + // todo: check if can get more uses of alloc=false + buf = p.buf[p.index:end] + p.index += nb + return + } + + buf = make([]byte, nb) + copy(buf, p.buf[p.index:]) + p.index += nb + return +} + +// DecodeStringBytes reads an encoded string from the Buffer. +// This is the format used for the proto2 string type. +func (p *Buffer) DecodeStringBytes() (s string, err error) { + buf, err := p.DecodeRawBytes(false) + if err != nil { + return + } + return string(buf), nil +} + +// Unmarshaler is the interface representing objects that can +// unmarshal themselves. The argument points to data that may be +// overwritten, so implementations should not keep references to the +// buffer. +// Unmarshal implementations should not clear the receiver. +// Any unmarshaled data should be merged into the receiver. +// Callers of Unmarshal that do not want to retain existing data +// should Reset the receiver before calling Unmarshal. +type Unmarshaler interface { + Unmarshal([]byte) error +} + +// newUnmarshaler is the interface representing objects that can +// unmarshal themselves. The semantics are identical to Unmarshaler. +// +// This exists to support protoc-gen-go generated messages. +// The proto package will stop type-asserting to this interface in the future. +// +// DO NOT DEPEND ON THIS. +type newUnmarshaler interface { + XXX_Unmarshal([]byte) error +} + +// Unmarshal parses the protocol buffer representation in buf and places the +// decoded result in pb. If the struct underlying pb does not match +// the data in buf, the results can be unpredictable. +// +// Unmarshal resets pb before starting to unmarshal, so any +// existing data in pb is always removed. Use UnmarshalMerge +// to preserve and append to existing data. +func Unmarshal(buf []byte, pb Message) error { + pb.Reset() + if u, ok := pb.(newUnmarshaler); ok { + return u.XXX_Unmarshal(buf) + } + if u, ok := pb.(Unmarshaler); ok { + return u.Unmarshal(buf) + } + return NewBuffer(buf).Unmarshal(pb) +} + +// UnmarshalMerge parses the protocol buffer representation in buf and +// writes the decoded result to pb. If the struct underlying pb does not match +// the data in buf, the results can be unpredictable. +// +// UnmarshalMerge merges into existing data in pb. +// Most code should use Unmarshal instead. +func UnmarshalMerge(buf []byte, pb Message) error { + if u, ok := pb.(newUnmarshaler); ok { + return u.XXX_Unmarshal(buf) + } + if u, ok := pb.(Unmarshaler); ok { + // NOTE: The history of proto have unfortunately been inconsistent + // whether Unmarshaler should or should not implicitly clear itself. + // Some implementations do, most do not. + // Thus, calling this here may or may not do what people want. + // + // See https://github.com/golang/protobuf/issues/424 + return u.Unmarshal(buf) + } + return NewBuffer(buf).Unmarshal(pb) +} + +// DecodeMessage reads a count-delimited message from the Buffer. +func (p *Buffer) DecodeMessage(pb Message) error { + enc, err := p.DecodeRawBytes(false) + if err != nil { + return err + } + return NewBuffer(enc).Unmarshal(pb) +} + +// DecodeGroup reads a tag-delimited group from the Buffer. +// StartGroup tag is already consumed. This function consumes +// EndGroup tag. +func (p *Buffer) DecodeGroup(pb Message) error { + b := p.buf[p.index:] + x, y := findEndGroup(b) + if x < 0 { + return io.ErrUnexpectedEOF + } + err := Unmarshal(b[:x], pb) + p.index += y + return err +} + +// Unmarshal parses the protocol buffer representation in the +// Buffer and places the decoded result in pb. If the struct +// underlying pb does not match the data in the buffer, the results can be +// unpredictable. +// +// Unlike proto.Unmarshal, this does not reset pb before starting to unmarshal. +func (p *Buffer) Unmarshal(pb Message) error { + // If the object can unmarshal itself, let it. + if u, ok := pb.(newUnmarshaler); ok { + err := u.XXX_Unmarshal(p.buf[p.index:]) + p.index = len(p.buf) + return err + } + if u, ok := pb.(Unmarshaler); ok { + // NOTE: The history of proto have unfortunately been inconsistent + // whether Unmarshaler should or should not implicitly clear itself. + // Some implementations do, most do not. + // Thus, calling this here may or may not do what people want. + // + // See https://github.com/golang/protobuf/issues/424 + err := u.Unmarshal(p.buf[p.index:]) + p.index = len(p.buf) + return err + } + + // Slow workaround for messages that aren't Unmarshalers. + // This includes some hand-coded .pb.go files and + // bootstrap protos. + // TODO: fix all of those and then add Unmarshal to + // the Message interface. Then: + // The cast above and code below can be deleted. + // The old unmarshaler can be deleted. + // Clients can call Unmarshal directly (can already do that, actually). + var info InternalMessageInfo + err := info.Unmarshal(pb, p.buf[p.index:]) + p.index = len(p.buf) + return err +} diff --git a/api/vendor/github.com/golang/protobuf/proto/decode_test.go b/api/vendor/github.com/golang/protobuf/proto/decode_test.go new file mode 100644 index 0000000..949be3a --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/proto/decode_test.go @@ -0,0 +1,255 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +// +build go1.7 + +package proto_test + +import ( + "fmt" + "testing" + + "github.com/golang/protobuf/proto" + tpb "github.com/golang/protobuf/proto/proto3_proto" +) + +var msgBlackhole = new(tpb.Message) + +// BenchmarkVarint32ArraySmall shows the performance on an array of small int32 fields (1 and +// 2 bytes long). +func BenchmarkVarint32ArraySmall(b *testing.B) { + for i := uint(1); i <= 10; i++ { + dist := genInt32Dist([7]int{0, 3, 1}, 1<2GB. + ErrTooLarge = errors.New("proto: message encodes to over 2 GB") +) + +// The fundamental encoders that put bytes on the wire. +// Those that take integer types all accept uint64 and are +// therefore of type valueEncoder. + +const maxVarintBytes = 10 // maximum length of a varint + +// EncodeVarint returns the varint encoding of x. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +// Not used by the package itself, but helpful to clients +// wishing to use the same encoding. +func EncodeVarint(x uint64) []byte { + var buf [maxVarintBytes]byte + var n int + for n = 0; x > 127; n++ { + buf[n] = 0x80 | uint8(x&0x7F) + x >>= 7 + } + buf[n] = uint8(x) + n++ + return buf[0:n] +} + +// EncodeVarint writes a varint-encoded integer to the Buffer. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +func (p *Buffer) EncodeVarint(x uint64) error { + for x >= 1<<7 { + p.buf = append(p.buf, uint8(x&0x7f|0x80)) + x >>= 7 + } + p.buf = append(p.buf, uint8(x)) + return nil +} + +// SizeVarint returns the varint encoding size of an integer. +func SizeVarint(x uint64) int { + switch { + case x < 1<<7: + return 1 + case x < 1<<14: + return 2 + case x < 1<<21: + return 3 + case x < 1<<28: + return 4 + case x < 1<<35: + return 5 + case x < 1<<42: + return 6 + case x < 1<<49: + return 7 + case x < 1<<56: + return 8 + case x < 1<<63: + return 9 + } + return 10 +} + +// EncodeFixed64 writes a 64-bit integer to the Buffer. +// This is the format for the +// fixed64, sfixed64, and double protocol buffer types. +func (p *Buffer) EncodeFixed64(x uint64) error { + p.buf = append(p.buf, + uint8(x), + uint8(x>>8), + uint8(x>>16), + uint8(x>>24), + uint8(x>>32), + uint8(x>>40), + uint8(x>>48), + uint8(x>>56)) + return nil +} + +// EncodeFixed32 writes a 32-bit integer to the Buffer. +// This is the format for the +// fixed32, sfixed32, and float protocol buffer types. +func (p *Buffer) EncodeFixed32(x uint64) error { + p.buf = append(p.buf, + uint8(x), + uint8(x>>8), + uint8(x>>16), + uint8(x>>24)) + return nil +} + +// EncodeZigzag64 writes a zigzag-encoded 64-bit integer +// to the Buffer. +// This is the format used for the sint64 protocol buffer type. +func (p *Buffer) EncodeZigzag64(x uint64) error { + // use signed number to get arithmetic right shift. + return p.EncodeVarint(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} + +// EncodeZigzag32 writes a zigzag-encoded 32-bit integer +// to the Buffer. +// This is the format used for the sint32 protocol buffer type. +func (p *Buffer) EncodeZigzag32(x uint64) error { + // use signed number to get arithmetic right shift. + return p.EncodeVarint(uint64((uint32(x) << 1) ^ uint32((int32(x) >> 31)))) +} + +// EncodeRawBytes writes a count-delimited byte buffer to the Buffer. +// This is the format used for the bytes protocol buffer +// type and for embedded messages. +func (p *Buffer) EncodeRawBytes(b []byte) error { + p.EncodeVarint(uint64(len(b))) + p.buf = append(p.buf, b...) + return nil +} + +// EncodeStringBytes writes an encoded string to the Buffer. +// This is the format used for the proto2 string type. +func (p *Buffer) EncodeStringBytes(s string) error { + p.EncodeVarint(uint64(len(s))) + p.buf = append(p.buf, s...) + return nil +} + +// Marshaler is the interface representing objects that can marshal themselves. +type Marshaler interface { + Marshal() ([]byte, error) +} + +// EncodeMessage writes the protocol buffer to the Buffer, +// prefixed by a varint-encoded length. +func (p *Buffer) EncodeMessage(pb Message) error { + siz := Size(pb) + p.EncodeVarint(uint64(siz)) + return p.Marshal(pb) +} + +// All protocol buffer fields are nillable, but be careful. +func isNil(v reflect.Value) bool { + switch v.Kind() { + case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: + return v.IsNil() + } + return false +} diff --git a/api/vendor/github.com/golang/protobuf/proto/encode_test.go b/api/vendor/github.com/golang/protobuf/proto/encode_test.go new file mode 100644 index 0000000..a720947 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/proto/encode_test.go @@ -0,0 +1,85 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +// +build go1.7 + +package proto_test + +import ( + "strconv" + "testing" + + "github.com/golang/protobuf/proto" + tpb "github.com/golang/protobuf/proto/proto3_proto" + "github.com/golang/protobuf/ptypes" +) + +var ( + blackhole []byte +) + +// BenchmarkAny creates increasingly large arbitrary Any messages. The type is always the +// same. +func BenchmarkAny(b *testing.B) { + data := make([]byte, 1<<20) + quantum := 1 << 10 + for i := uint(0); i <= 10; i++ { + b.Run(strconv.Itoa(quantum<unmarshal. +} + +func TestMarshalUnmarshalRepeatedExtension(t *testing.T) { + // Add a repeated extension to the result. + tests := []struct { + name string + ext []*pb.ComplexExtension + }{ + { + "two fields", + []*pb.ComplexExtension{ + {First: proto.Int32(7)}, + {Second: proto.Int32(11)}, + }, + }, + { + "repeated field", + []*pb.ComplexExtension{ + {Third: []int32{1000}}, + {Third: []int32{2000}}, + }, + }, + { + "two fields and repeated field", + []*pb.ComplexExtension{ + {Third: []int32{1000}}, + {First: proto.Int32(9)}, + {Second: proto.Int32(21)}, + {Third: []int32{2000}}, + }, + }, + } + for _, test := range tests { + // Marshal message with a repeated extension. + msg1 := new(pb.OtherMessage) + err := proto.SetExtension(msg1, pb.E_RComplex, test.ext) + if err != nil { + t.Fatalf("[%s] Error setting extension: %v", test.name, err) + } + b, err := proto.Marshal(msg1) + if err != nil { + t.Fatalf("[%s] Error marshaling message: %v", test.name, err) + } + + // Unmarshal and read the merged proto. + msg2 := new(pb.OtherMessage) + err = proto.Unmarshal(b, msg2) + if err != nil { + t.Fatalf("[%s] Error unmarshaling message: %v", test.name, err) + } + e, err := proto.GetExtension(msg2, pb.E_RComplex) + if err != nil { + t.Fatalf("[%s] Error getting extension: %v", test.name, err) + } + ext := e.([]*pb.ComplexExtension) + if ext == nil { + t.Fatalf("[%s] Invalid extension", test.name) + } + if len(ext) != len(test.ext) { + t.Errorf("[%s] Wrong length of ComplexExtension: got: %v want: %v\n", test.name, len(ext), len(test.ext)) + } + for i := range test.ext { + if !proto.Equal(ext[i], test.ext[i]) { + t.Errorf("[%s] Wrong value for ComplexExtension[%d]: got: %v want: %v\n", test.name, i, ext[i], test.ext[i]) + } + } + } +} + +func TestUnmarshalRepeatingNonRepeatedExtension(t *testing.T) { + // We may see multiple instances of the same extension in the wire + // format. For example, the proto compiler may encode custom options in + // this way. Here, we verify that we merge the extensions together. + tests := []struct { + name string + ext []*pb.ComplexExtension + }{ + { + "two fields", + []*pb.ComplexExtension{ + {First: proto.Int32(7)}, + {Second: proto.Int32(11)}, + }, + }, + { + "repeated field", + []*pb.ComplexExtension{ + {Third: []int32{1000}}, + {Third: []int32{2000}}, + }, + }, + { + "two fields and repeated field", + []*pb.ComplexExtension{ + {Third: []int32{1000}}, + {First: proto.Int32(9)}, + {Second: proto.Int32(21)}, + {Third: []int32{2000}}, + }, + }, + } + for _, test := range tests { + var buf bytes.Buffer + var want pb.ComplexExtension + + // Generate a serialized representation of a repeated extension + // by catenating bytes together. + for i, e := range test.ext { + // Merge to create the wanted proto. + proto.Merge(&want, e) + + // serialize the message + msg := new(pb.OtherMessage) + err := proto.SetExtension(msg, pb.E_Complex, e) + if err != nil { + t.Fatalf("[%s] Error setting extension %d: %v", test.name, i, err) + } + b, err := proto.Marshal(msg) + if err != nil { + t.Fatalf("[%s] Error marshaling message %d: %v", test.name, i, err) + } + buf.Write(b) + } + + // Unmarshal and read the merged proto. + msg2 := new(pb.OtherMessage) + err := proto.Unmarshal(buf.Bytes(), msg2) + if err != nil { + t.Fatalf("[%s] Error unmarshaling message: %v", test.name, err) + } + e, err := proto.GetExtension(msg2, pb.E_Complex) + if err != nil { + t.Fatalf("[%s] Error getting extension: %v", test.name, err) + } + ext := e.(*pb.ComplexExtension) + if ext == nil { + t.Fatalf("[%s] Invalid extension", test.name) + } + if !proto.Equal(ext, &want) { + t.Errorf("[%s] Wrong value for ComplexExtension: got: %s want: %s\n", test.name, ext, &want) + } + } +} + +func TestClearAllExtensions(t *testing.T) { + // unregistered extension + desc := &proto.ExtensionDesc{ + ExtendedType: (*pb.MyMessage)(nil), + ExtensionType: (*bool)(nil), + Field: 101010100, + Name: "emptyextension", + Tag: "varint,0,opt", + } + m := &pb.MyMessage{} + if proto.HasExtension(m, desc) { + t.Errorf("proto.HasExtension(%s): got true, want false", proto.MarshalTextString(m)) + } + if err := proto.SetExtension(m, desc, proto.Bool(true)); err != nil { + t.Errorf("proto.SetExtension(m, desc, true): got error %q, want nil", err) + } + if !proto.HasExtension(m, desc) { + t.Errorf("proto.HasExtension(%s): got false, want true", proto.MarshalTextString(m)) + } + proto.ClearAllExtensions(m) + if proto.HasExtension(m, desc) { + t.Errorf("proto.HasExtension(%s): got true, want false", proto.MarshalTextString(m)) + } +} + +func TestMarshalRace(t *testing.T) { + ext := &pb.Ext{} + m := &pb.MyMessage{Count: proto.Int32(4)} + if err := proto.SetExtension(m, pb.E_Ext_More, ext); err != nil { + t.Fatalf("proto.SetExtension(m, desc, true): got error %q, want nil", err) + } + + b, err := proto.Marshal(m) + if err != nil { + t.Fatalf("Could not marshal message: %v", err) + } + if err := proto.Unmarshal(b, m); err != nil { + t.Fatalf("Could not unmarshal message: %v", err) + } + // after Unmarshal, the extension is in undecoded form. + // GetExtension will decode it lazily. Make sure this does + // not race against Marshal. + + var g errgroup.Group + for n := 3; n > 0; n-- { + g.Go(func() error { + _, err := proto.Marshal(m) + return err + }) + g.Go(func() error { + _, err := proto.GetExtension(m, pb.E_Ext_More) + return err + }) + } + if err := g.Wait(); err != nil { + t.Fatal(err) + } +} diff --git a/api/vendor/github.com/golang/protobuf/proto/lib.go b/api/vendor/github.com/golang/protobuf/proto/lib.go new file mode 100644 index 0000000..0e2191b --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/proto/lib.go @@ -0,0 +1,921 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +/* +Package proto converts data structures to and from the wire format of +protocol buffers. It works in concert with the Go source code generated +for .proto files by the protocol compiler. + +A summary of the properties of the protocol buffer interface +for a protocol buffer variable v: + + - Names are turned from camel_case to CamelCase for export. + - There are no methods on v to set fields; just treat + them as structure fields. + - There are getters that return a field's value if set, + and return the field's default value if unset. + The getters work even if the receiver is a nil message. + - The zero value for a struct is its correct initialization state. + All desired fields must be set before marshaling. + - A Reset() method will restore a protobuf struct to its zero state. + - Non-repeated fields are pointers to the values; nil means unset. + That is, optional or required field int32 f becomes F *int32. + - Repeated fields are slices. + - Helper functions are available to aid the setting of fields. + msg.Foo = proto.String("hello") // set field + - Constants are defined to hold the default values of all fields that + have them. They have the form Default_StructName_FieldName. + Because the getter methods handle defaulted values, + direct use of these constants should be rare. + - Enums are given type names and maps from names to values. + Enum values are prefixed by the enclosing message's name, or by the + enum's type name if it is a top-level enum. Enum types have a String + method, and a Enum method to assist in message construction. + - Nested messages, groups and enums have type names prefixed with the name of + the surrounding message type. + - Extensions are given descriptor names that start with E_, + followed by an underscore-delimited list of the nested messages + that contain it (if any) followed by the CamelCased name of the + extension field itself. HasExtension, ClearExtension, GetExtension + and SetExtension are functions for manipulating extensions. + - Oneof field sets are given a single field in their message, + with distinguished wrapper types for each possible field value. + - Marshal and Unmarshal are functions to encode and decode the wire format. + +When the .proto file specifies `syntax="proto3"`, there are some differences: + + - Non-repeated fields of non-message type are values instead of pointers. + - Enum types do not get an Enum method. + +The simplest way to describe this is to see an example. +Given file test.proto, containing + + package example; + + enum FOO { X = 17; } + + message Test { + required string label = 1; + optional int32 type = 2 [default=77]; + repeated int64 reps = 3; + optional group OptionalGroup = 4 { + required string RequiredField = 5; + } + oneof union { + int32 number = 6; + string name = 7; + } + } + +The resulting file, test.pb.go, is: + + package example + + import proto "github.com/golang/protobuf/proto" + import math "math" + + type FOO int32 + const ( + FOO_X FOO = 17 + ) + var FOO_name = map[int32]string{ + 17: "X", + } + var FOO_value = map[string]int32{ + "X": 17, + } + + func (x FOO) Enum() *FOO { + p := new(FOO) + *p = x + return p + } + func (x FOO) String() string { + return proto.EnumName(FOO_name, int32(x)) + } + func (x *FOO) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FOO_value, data) + if err != nil { + return err + } + *x = FOO(value) + return nil + } + + type Test struct { + Label *string `protobuf:"bytes,1,req,name=label" json:"label,omitempty"` + Type *int32 `protobuf:"varint,2,opt,name=type,def=77" json:"type,omitempty"` + Reps []int64 `protobuf:"varint,3,rep,name=reps" json:"reps,omitempty"` + Optionalgroup *Test_OptionalGroup `protobuf:"group,4,opt,name=OptionalGroup" json:"optionalgroup,omitempty"` + // Types that are valid to be assigned to Union: + // *Test_Number + // *Test_Name + Union isTest_Union `protobuf_oneof:"union"` + XXX_unrecognized []byte `json:"-"` + } + func (m *Test) Reset() { *m = Test{} } + func (m *Test) String() string { return proto.CompactTextString(m) } + func (*Test) ProtoMessage() {} + + type isTest_Union interface { + isTest_Union() + } + + type Test_Number struct { + Number int32 `protobuf:"varint,6,opt,name=number"` + } + type Test_Name struct { + Name string `protobuf:"bytes,7,opt,name=name"` + } + + func (*Test_Number) isTest_Union() {} + func (*Test_Name) isTest_Union() {} + + func (m *Test) GetUnion() isTest_Union { + if m != nil { + return m.Union + } + return nil + } + const Default_Test_Type int32 = 77 + + func (m *Test) GetLabel() string { + if m != nil && m.Label != nil { + return *m.Label + } + return "" + } + + func (m *Test) GetType() int32 { + if m != nil && m.Type != nil { + return *m.Type + } + return Default_Test_Type + } + + func (m *Test) GetOptionalgroup() *Test_OptionalGroup { + if m != nil { + return m.Optionalgroup + } + return nil + } + + type Test_OptionalGroup struct { + RequiredField *string `protobuf:"bytes,5,req" json:"RequiredField,omitempty"` + } + func (m *Test_OptionalGroup) Reset() { *m = Test_OptionalGroup{} } + func (m *Test_OptionalGroup) String() string { return proto.CompactTextString(m) } + + func (m *Test_OptionalGroup) GetRequiredField() string { + if m != nil && m.RequiredField != nil { + return *m.RequiredField + } + return "" + } + + func (m *Test) GetNumber() int32 { + if x, ok := m.GetUnion().(*Test_Number); ok { + return x.Number + } + return 0 + } + + func (m *Test) GetName() string { + if x, ok := m.GetUnion().(*Test_Name); ok { + return x.Name + } + return "" + } + + func init() { + proto.RegisterEnum("example.FOO", FOO_name, FOO_value) + } + +To create and play with a Test object: + + package main + + import ( + "log" + + "github.com/golang/protobuf/proto" + pb "./example.pb" + ) + + func main() { + test := &pb.Test{ + Label: proto.String("hello"), + Type: proto.Int32(17), + Reps: []int64{1, 2, 3}, + Optionalgroup: &pb.Test_OptionalGroup{ + RequiredField: proto.String("good bye"), + }, + Union: &pb.Test_Name{"fred"}, + } + data, err := proto.Marshal(test) + if err != nil { + log.Fatal("marshaling error: ", err) + } + newTest := &pb.Test{} + err = proto.Unmarshal(data, newTest) + if err != nil { + log.Fatal("unmarshaling error: ", err) + } + // Now test and newTest contain the same data. + if test.GetLabel() != newTest.GetLabel() { + log.Fatalf("data mismatch %q != %q", test.GetLabel(), newTest.GetLabel()) + } + // Use a type switch to determine which oneof was set. + switch u := test.Union.(type) { + case *pb.Test_Number: // u.Number contains the number. + case *pb.Test_Name: // u.Name contains the string. + } + // etc. + } +*/ +package proto + +import ( + "encoding/json" + "errors" + "fmt" + "log" + "reflect" + "sort" + "strconv" + "sync" +) + +var errInvalidUTF8 = errors.New("proto: invalid UTF-8 string") + +// Message is implemented by generated protocol buffer messages. +type Message interface { + Reset() + String() string + ProtoMessage() +} + +// Stats records allocation details about the protocol buffer encoders +// and decoders. Useful for tuning the library itself. +type Stats struct { + Emalloc uint64 // mallocs in encode + Dmalloc uint64 // mallocs in decode + Encode uint64 // number of encodes + Decode uint64 // number of decodes + Chit uint64 // number of cache hits + Cmiss uint64 // number of cache misses + Size uint64 // number of sizes +} + +// Set to true to enable stats collection. +const collectStats = false + +var stats Stats + +// GetStats returns a copy of the global Stats structure. +func GetStats() Stats { return stats } + +// A Buffer is a buffer manager for marshaling and unmarshaling +// protocol buffers. It may be reused between invocations to +// reduce memory usage. It is not necessary to use a Buffer; +// the global functions Marshal and Unmarshal create a +// temporary Buffer and are fine for most applications. +type Buffer struct { + buf []byte // encode/decode byte stream + index int // read point + + deterministic bool +} + +// NewBuffer allocates a new Buffer and initializes its internal data to +// the contents of the argument slice. +func NewBuffer(e []byte) *Buffer { + return &Buffer{buf: e} +} + +// Reset resets the Buffer, ready for marshaling a new protocol buffer. +func (p *Buffer) Reset() { + p.buf = p.buf[0:0] // for reading/writing + p.index = 0 // for reading +} + +// SetBuf replaces the internal buffer with the slice, +// ready for unmarshaling the contents of the slice. +func (p *Buffer) SetBuf(s []byte) { + p.buf = s + p.index = 0 +} + +// Bytes returns the contents of the Buffer. +func (p *Buffer) Bytes() []byte { return p.buf } + +// SetDeterministic sets whether to use deterministic serialization. +// +// Deterministic serialization guarantees that for a given binary, equal +// messages will always be serialized to the same bytes. This implies: +// +// - Repeated serialization of a message will return the same bytes. +// - Different processes of the same binary (which may be executing on +// different machines) will serialize equal messages to the same bytes. +// +// Note that the deterministic serialization is NOT canonical across +// languages. It is not guaranteed to remain stable over time. It is unstable +// across different builds with schema changes due to unknown fields. +// Users who need canonical serialization (e.g., persistent storage in a +// canonical form, fingerprinting, etc.) should define their own +// canonicalization specification and implement their own serializer rather +// than relying on this API. +// +// If deterministic serialization is requested, map entries will be sorted +// by keys in lexographical order. This is an implementation detail and +// subject to change. +func (p *Buffer) SetDeterministic(deterministic bool) { + p.deterministic = deterministic +} + +/* + * Helper routines for simplifying the creation of optional fields of basic type. + */ + +// Bool is a helper routine that allocates a new bool value +// to store v and returns a pointer to it. +func Bool(v bool) *bool { + return &v +} + +// Int32 is a helper routine that allocates a new int32 value +// to store v and returns a pointer to it. +func Int32(v int32) *int32 { + return &v +} + +// Int is a helper routine that allocates a new int32 value +// to store v and returns a pointer to it, but unlike Int32 +// its argument value is an int. +func Int(v int) *int32 { + p := new(int32) + *p = int32(v) + return p +} + +// Int64 is a helper routine that allocates a new int64 value +// to store v and returns a pointer to it. +func Int64(v int64) *int64 { + return &v +} + +// Float32 is a helper routine that allocates a new float32 value +// to store v and returns a pointer to it. +func Float32(v float32) *float32 { + return &v +} + +// Float64 is a helper routine that allocates a new float64 value +// to store v and returns a pointer to it. +func Float64(v float64) *float64 { + return &v +} + +// Uint32 is a helper routine that allocates a new uint32 value +// to store v and returns a pointer to it. +func Uint32(v uint32) *uint32 { + return &v +} + +// Uint64 is a helper routine that allocates a new uint64 value +// to store v and returns a pointer to it. +func Uint64(v uint64) *uint64 { + return &v +} + +// String is a helper routine that allocates a new string value +// to store v and returns a pointer to it. +func String(v string) *string { + return &v +} + +// EnumName is a helper function to simplify printing protocol buffer enums +// by name. Given an enum map and a value, it returns a useful string. +func EnumName(m map[int32]string, v int32) string { + s, ok := m[v] + if ok { + return s + } + return strconv.Itoa(int(v)) +} + +// UnmarshalJSONEnum is a helper function to simplify recovering enum int values +// from their JSON-encoded representation. Given a map from the enum's symbolic +// names to its int values, and a byte buffer containing the JSON-encoded +// value, it returns an int32 that can be cast to the enum type by the caller. +// +// The function can deal with both JSON representations, numeric and symbolic. +func UnmarshalJSONEnum(m map[string]int32, data []byte, enumName string) (int32, error) { + if data[0] == '"' { + // New style: enums are strings. + var repr string + if err := json.Unmarshal(data, &repr); err != nil { + return -1, err + } + val, ok := m[repr] + if !ok { + return 0, fmt.Errorf("unrecognized enum %s value %q", enumName, repr) + } + return val, nil + } + // Old style: enums are ints. + var val int32 + if err := json.Unmarshal(data, &val); err != nil { + return 0, fmt.Errorf("cannot unmarshal %#q into enum %s", data, enumName) + } + return val, nil +} + +// DebugPrint dumps the encoded data in b in a debugging format with a header +// including the string s. Used in testing but made available for general debugging. +func (p *Buffer) DebugPrint(s string, b []byte) { + var u uint64 + + obuf := p.buf + index := p.index + p.buf = b + p.index = 0 + depth := 0 + + fmt.Printf("\n--- %s ---\n", s) + +out: + for { + for i := 0; i < depth; i++ { + fmt.Print(" ") + } + + index := p.index + if index == len(p.buf) { + break + } + + op, err := p.DecodeVarint() + if err != nil { + fmt.Printf("%3d: fetching op err %v\n", index, err) + break out + } + tag := op >> 3 + wire := op & 7 + + switch wire { + default: + fmt.Printf("%3d: t=%3d unknown wire=%d\n", + index, tag, wire) + break out + + case WireBytes: + var r []byte + + r, err = p.DecodeRawBytes(false) + if err != nil { + break out + } + fmt.Printf("%3d: t=%3d bytes [%d]", index, tag, len(r)) + if len(r) <= 6 { + for i := 0; i < len(r); i++ { + fmt.Printf(" %.2x", r[i]) + } + } else { + for i := 0; i < 3; i++ { + fmt.Printf(" %.2x", r[i]) + } + fmt.Printf(" ..") + for i := len(r) - 3; i < len(r); i++ { + fmt.Printf(" %.2x", r[i]) + } + } + fmt.Printf("\n") + + case WireFixed32: + u, err = p.DecodeFixed32() + if err != nil { + fmt.Printf("%3d: t=%3d fix32 err %v\n", index, tag, err) + break out + } + fmt.Printf("%3d: t=%3d fix32 %d\n", index, tag, u) + + case WireFixed64: + u, err = p.DecodeFixed64() + if err != nil { + fmt.Printf("%3d: t=%3d fix64 err %v\n", index, tag, err) + break out + } + fmt.Printf("%3d: t=%3d fix64 %d\n", index, tag, u) + + case WireVarint: + u, err = p.DecodeVarint() + if err != nil { + fmt.Printf("%3d: t=%3d varint err %v\n", index, tag, err) + break out + } + fmt.Printf("%3d: t=%3d varint %d\n", index, tag, u) + + case WireStartGroup: + fmt.Printf("%3d: t=%3d start\n", index, tag) + depth++ + + case WireEndGroup: + depth-- + fmt.Printf("%3d: t=%3d end\n", index, tag) + } + } + + if depth != 0 { + fmt.Printf("%3d: start-end not balanced %d\n", p.index, depth) + } + fmt.Printf("\n") + + p.buf = obuf + p.index = index +} + +// SetDefaults sets unset protocol buffer fields to their default values. +// It only modifies fields that are both unset and have defined defaults. +// It recursively sets default values in any non-nil sub-messages. +func SetDefaults(pb Message) { + setDefaults(reflect.ValueOf(pb), true, false) +} + +// v is a pointer to a struct. +func setDefaults(v reflect.Value, recur, zeros bool) { + v = v.Elem() + + defaultMu.RLock() + dm, ok := defaults[v.Type()] + defaultMu.RUnlock() + if !ok { + dm = buildDefaultMessage(v.Type()) + defaultMu.Lock() + defaults[v.Type()] = dm + defaultMu.Unlock() + } + + for _, sf := range dm.scalars { + f := v.Field(sf.index) + if !f.IsNil() { + // field already set + continue + } + dv := sf.value + if dv == nil && !zeros { + // no explicit default, and don't want to set zeros + continue + } + fptr := f.Addr().Interface() // **T + // TODO: Consider batching the allocations we do here. + switch sf.kind { + case reflect.Bool: + b := new(bool) + if dv != nil { + *b = dv.(bool) + } + *(fptr.(**bool)) = b + case reflect.Float32: + f := new(float32) + if dv != nil { + *f = dv.(float32) + } + *(fptr.(**float32)) = f + case reflect.Float64: + f := new(float64) + if dv != nil { + *f = dv.(float64) + } + *(fptr.(**float64)) = f + case reflect.Int32: + // might be an enum + if ft := f.Type(); ft != int32PtrType { + // enum + f.Set(reflect.New(ft.Elem())) + if dv != nil { + f.Elem().SetInt(int64(dv.(int32))) + } + } else { + // int32 field + i := new(int32) + if dv != nil { + *i = dv.(int32) + } + *(fptr.(**int32)) = i + } + case reflect.Int64: + i := new(int64) + if dv != nil { + *i = dv.(int64) + } + *(fptr.(**int64)) = i + case reflect.String: + s := new(string) + if dv != nil { + *s = dv.(string) + } + *(fptr.(**string)) = s + case reflect.Uint8: + // exceptional case: []byte + var b []byte + if dv != nil { + db := dv.([]byte) + b = make([]byte, len(db)) + copy(b, db) + } else { + b = []byte{} + } + *(fptr.(*[]byte)) = b + case reflect.Uint32: + u := new(uint32) + if dv != nil { + *u = dv.(uint32) + } + *(fptr.(**uint32)) = u + case reflect.Uint64: + u := new(uint64) + if dv != nil { + *u = dv.(uint64) + } + *(fptr.(**uint64)) = u + default: + log.Printf("proto: can't set default for field %v (sf.kind=%v)", f, sf.kind) + } + } + + for _, ni := range dm.nested { + f := v.Field(ni) + // f is *T or []*T or map[T]*T + switch f.Kind() { + case reflect.Ptr: + if f.IsNil() { + continue + } + setDefaults(f, recur, zeros) + + case reflect.Slice: + for i := 0; i < f.Len(); i++ { + e := f.Index(i) + if e.IsNil() { + continue + } + setDefaults(e, recur, zeros) + } + + case reflect.Map: + for _, k := range f.MapKeys() { + e := f.MapIndex(k) + if e.IsNil() { + continue + } + setDefaults(e, recur, zeros) + } + } + } +} + +var ( + // defaults maps a protocol buffer struct type to a slice of the fields, + // with its scalar fields set to their proto-declared non-zero default values. + defaultMu sync.RWMutex + defaults = make(map[reflect.Type]defaultMessage) + + int32PtrType = reflect.TypeOf((*int32)(nil)) +) + +// defaultMessage represents information about the default values of a message. +type defaultMessage struct { + scalars []scalarField + nested []int // struct field index of nested messages +} + +type scalarField struct { + index int // struct field index + kind reflect.Kind // element type (the T in *T or []T) + value interface{} // the proto-declared default value, or nil +} + +// t is a struct type. +func buildDefaultMessage(t reflect.Type) (dm defaultMessage) { + sprop := GetProperties(t) + for _, prop := range sprop.Prop { + fi, ok := sprop.decoderTags.get(prop.Tag) + if !ok { + // XXX_unrecognized + continue + } + ft := t.Field(fi).Type + + sf, nested, err := fieldDefault(ft, prop) + switch { + case err != nil: + log.Print(err) + case nested: + dm.nested = append(dm.nested, fi) + case sf != nil: + sf.index = fi + dm.scalars = append(dm.scalars, *sf) + } + } + + return dm +} + +// fieldDefault returns the scalarField for field type ft. +// sf will be nil if the field can not have a default. +// nestedMessage will be true if this is a nested message. +// Note that sf.index is not set on return. +func fieldDefault(ft reflect.Type, prop *Properties) (sf *scalarField, nestedMessage bool, err error) { + var canHaveDefault bool + switch ft.Kind() { + case reflect.Ptr: + if ft.Elem().Kind() == reflect.Struct { + nestedMessage = true + } else { + canHaveDefault = true // proto2 scalar field + } + + case reflect.Slice: + switch ft.Elem().Kind() { + case reflect.Ptr: + nestedMessage = true // repeated message + case reflect.Uint8: + canHaveDefault = true // bytes field + } + + case reflect.Map: + if ft.Elem().Kind() == reflect.Ptr { + nestedMessage = true // map with message values + } + } + + if !canHaveDefault { + if nestedMessage { + return nil, true, nil + } + return nil, false, nil + } + + // We now know that ft is a pointer or slice. + sf = &scalarField{kind: ft.Elem().Kind()} + + // scalar fields without defaults + if !prop.HasDefault { + return sf, false, nil + } + + // a scalar field: either *T or []byte + switch ft.Elem().Kind() { + case reflect.Bool: + x, err := strconv.ParseBool(prop.Default) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default bool %q: %v", prop.Default, err) + } + sf.value = x + case reflect.Float32: + x, err := strconv.ParseFloat(prop.Default, 32) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default float32 %q: %v", prop.Default, err) + } + sf.value = float32(x) + case reflect.Float64: + x, err := strconv.ParseFloat(prop.Default, 64) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default float64 %q: %v", prop.Default, err) + } + sf.value = x + case reflect.Int32: + x, err := strconv.ParseInt(prop.Default, 10, 32) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default int32 %q: %v", prop.Default, err) + } + sf.value = int32(x) + case reflect.Int64: + x, err := strconv.ParseInt(prop.Default, 10, 64) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default int64 %q: %v", prop.Default, err) + } + sf.value = x + case reflect.String: + sf.value = prop.Default + case reflect.Uint8: + // []byte (not *uint8) + sf.value = []byte(prop.Default) + case reflect.Uint32: + x, err := strconv.ParseUint(prop.Default, 10, 32) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default uint32 %q: %v", prop.Default, err) + } + sf.value = uint32(x) + case reflect.Uint64: + x, err := strconv.ParseUint(prop.Default, 10, 64) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default uint64 %q: %v", prop.Default, err) + } + sf.value = x + default: + return nil, false, fmt.Errorf("proto: unhandled def kind %v", ft.Elem().Kind()) + } + + return sf, false, nil +} + +// mapKeys returns a sort.Interface to be used for sorting the map keys. +// Map fields may have key types of non-float scalars, strings and enums. +func mapKeys(vs []reflect.Value) sort.Interface { + s := mapKeySorter{vs: vs} + + // Type specialization per https://developers.google.com/protocol-buffers/docs/proto#maps. + if len(vs) == 0 { + return s + } + switch vs[0].Kind() { + case reflect.Int32, reflect.Int64: + s.less = func(a, b reflect.Value) bool { return a.Int() < b.Int() } + case reflect.Uint32, reflect.Uint64: + s.less = func(a, b reflect.Value) bool { return a.Uint() < b.Uint() } + case reflect.Bool: + s.less = func(a, b reflect.Value) bool { return !a.Bool() && b.Bool() } // false < true + case reflect.String: + s.less = func(a, b reflect.Value) bool { return a.String() < b.String() } + default: + panic(fmt.Sprintf("unsupported map key type: %v", vs[0].Kind())) + } + + return s +} + +type mapKeySorter struct { + vs []reflect.Value + less func(a, b reflect.Value) bool +} + +func (s mapKeySorter) Len() int { return len(s.vs) } +func (s mapKeySorter) Swap(i, j int) { s.vs[i], s.vs[j] = s.vs[j], s.vs[i] } +func (s mapKeySorter) Less(i, j int) bool { + return s.less(s.vs[i], s.vs[j]) +} + +// isProto3Zero reports whether v is a zero proto3 value. +func isProto3Zero(v reflect.Value) bool { + switch v.Kind() { + case reflect.Bool: + return !v.Bool() + case reflect.Int32, reflect.Int64: + return v.Int() == 0 + case reflect.Uint32, reflect.Uint64: + return v.Uint() == 0 + case reflect.Float32, reflect.Float64: + return v.Float() == 0 + case reflect.String: + return v.String() == "" + } + return false +} + +// ProtoPackageIsVersion2 is referenced from generated protocol buffer files +// to assert that that code is compatible with this version of the proto package. +const ProtoPackageIsVersion2 = true + +// ProtoPackageIsVersion1 is referenced from generated protocol buffer files +// to assert that that code is compatible with this version of the proto package. +const ProtoPackageIsVersion1 = true + +// InternalMessageInfo is a type used internally by generated .pb.go files. +// This type is not intended to be used by non-generated code. +// This type is not subject to any compatibility guarantee. +type InternalMessageInfo struct { + marshal *marshalInfo + unmarshal *unmarshalInfo + merge *mergeInfo + discard *discardInfo +} diff --git a/api/vendor/github.com/golang/protobuf/proto/map_test.go b/api/vendor/github.com/golang/protobuf/proto/map_test.go new file mode 100644 index 0000000..b1e1529 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/proto/map_test.go @@ -0,0 +1,70 @@ +package proto_test + +import ( + "fmt" + "reflect" + "testing" + + "github.com/golang/protobuf/proto" + ppb "github.com/golang/protobuf/proto/proto3_proto" +) + +func TestMap(t *testing.T) { + var b []byte + fmt.Sscanf("a2010c0a044b657931120456616c31a201130a044b657932120556616c3261120456616c32a201240a044b6579330d05000000120556616c33621a0556616c3361120456616c331505000000a20100a201260a044b657934130a07536f6d6555524c1209536f6d655469746c651a08536e69707065743114", "%x", &b) + + var m ppb.Message + if err := proto.Unmarshal(b, &m); err != nil { + t.Fatalf("proto.Unmarshal error: %v", err) + } + + got := m.StringMap + want := map[string]string{ + "": "", + "Key1": "Val1", + "Key2": "Val2", + "Key3": "Val3", + "Key4": "", + } + + if !reflect.DeepEqual(got, want) { + t.Errorf("maps differ:\ngot %#v\nwant %#v", got, want) + } +} + +func marshalled() []byte { + m := &ppb.IntMaps{} + for i := 0; i < 1000; i++ { + m.Maps = append(m.Maps, &ppb.IntMap{ + Rtt: map[int32]int32{1: 2}, + }) + } + b, err := proto.Marshal(m) + if err != nil { + panic(fmt.Sprintf("Can't marshal %+v: %v", m, err)) + } + return b +} + +func BenchmarkConcurrentMapUnmarshal(b *testing.B) { + in := marshalled() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + var out ppb.IntMaps + if err := proto.Unmarshal(in, &out); err != nil { + b.Errorf("Can't unmarshal ppb.IntMaps: %v", err) + } + } + }) +} + +func BenchmarkSequentialMapUnmarshal(b *testing.B) { + in := marshalled() + b.ResetTimer() + for i := 0; i < b.N; i++ { + var out ppb.IntMaps + if err := proto.Unmarshal(in, &out); err != nil { + b.Errorf("Can't unmarshal ppb.IntMaps: %v", err) + } + } +} diff --git a/api/vendor/github.com/golang/protobuf/proto/message_set.go b/api/vendor/github.com/golang/protobuf/proto/message_set.go new file mode 100644 index 0000000..3b6ca41 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/proto/message_set.go @@ -0,0 +1,314 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package proto + +/* + * Support for message sets. + */ + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "reflect" + "sort" + "sync" +) + +// errNoMessageTypeID occurs when a protocol buffer does not have a message type ID. +// A message type ID is required for storing a protocol buffer in a message set. +var errNoMessageTypeID = errors.New("proto does not have a message type ID") + +// The first two types (_MessageSet_Item and messageSet) +// model what the protocol compiler produces for the following protocol message: +// message MessageSet { +// repeated group Item = 1 { +// required int32 type_id = 2; +// required string message = 3; +// }; +// } +// That is the MessageSet wire format. We can't use a proto to generate these +// because that would introduce a circular dependency between it and this package. + +type _MessageSet_Item struct { + TypeId *int32 `protobuf:"varint,2,req,name=type_id"` + Message []byte `protobuf:"bytes,3,req,name=message"` +} + +type messageSet struct { + Item []*_MessageSet_Item `protobuf:"group,1,rep"` + XXX_unrecognized []byte + // TODO: caching? +} + +// Make sure messageSet is a Message. +var _ Message = (*messageSet)(nil) + +// messageTypeIder is an interface satisfied by a protocol buffer type +// that may be stored in a MessageSet. +type messageTypeIder interface { + MessageTypeId() int32 +} + +func (ms *messageSet) find(pb Message) *_MessageSet_Item { + mti, ok := pb.(messageTypeIder) + if !ok { + return nil + } + id := mti.MessageTypeId() + for _, item := range ms.Item { + if *item.TypeId == id { + return item + } + } + return nil +} + +func (ms *messageSet) Has(pb Message) bool { + return ms.find(pb) != nil +} + +func (ms *messageSet) Unmarshal(pb Message) error { + if item := ms.find(pb); item != nil { + return Unmarshal(item.Message, pb) + } + if _, ok := pb.(messageTypeIder); !ok { + return errNoMessageTypeID + } + return nil // TODO: return error instead? +} + +func (ms *messageSet) Marshal(pb Message) error { + msg, err := Marshal(pb) + if err != nil { + return err + } + if item := ms.find(pb); item != nil { + // reuse existing item + item.Message = msg + return nil + } + + mti, ok := pb.(messageTypeIder) + if !ok { + return errNoMessageTypeID + } + + mtid := mti.MessageTypeId() + ms.Item = append(ms.Item, &_MessageSet_Item{ + TypeId: &mtid, + Message: msg, + }) + return nil +} + +func (ms *messageSet) Reset() { *ms = messageSet{} } +func (ms *messageSet) String() string { return CompactTextString(ms) } +func (*messageSet) ProtoMessage() {} + +// Support for the message_set_wire_format message option. + +func skipVarint(buf []byte) []byte { + i := 0 + for ; buf[i]&0x80 != 0; i++ { + } + return buf[i+1:] +} + +// MarshalMessageSet encodes the extension map represented by m in the message set wire format. +// It is called by generated Marshal methods on protocol buffer messages with the message_set_wire_format option. +func MarshalMessageSet(exts interface{}) ([]byte, error) { + return marshalMessageSet(exts, false) +} + +// marshaMessageSet implements above function, with the opt to turn on / off deterministic during Marshal. +func marshalMessageSet(exts interface{}, deterministic bool) ([]byte, error) { + switch exts := exts.(type) { + case *XXX_InternalExtensions: + var u marshalInfo + siz := u.sizeMessageSet(exts) + b := make([]byte, 0, siz) + return u.appendMessageSet(b, exts, deterministic) + + case map[int32]Extension: + // This is an old-style extension map. + // Wrap it in a new-style XXX_InternalExtensions. + ie := XXX_InternalExtensions{ + p: &struct { + mu sync.Mutex + extensionMap map[int32]Extension + }{ + extensionMap: exts, + }, + } + + var u marshalInfo + siz := u.sizeMessageSet(&ie) + b := make([]byte, 0, siz) + return u.appendMessageSet(b, &ie, deterministic) + + default: + return nil, errors.New("proto: not an extension map") + } +} + +// UnmarshalMessageSet decodes the extension map encoded in buf in the message set wire format. +// It is called by Unmarshal methods on protocol buffer messages with the message_set_wire_format option. +func UnmarshalMessageSet(buf []byte, exts interface{}) error { + var m map[int32]Extension + switch exts := exts.(type) { + case *XXX_InternalExtensions: + m = exts.extensionsWrite() + case map[int32]Extension: + m = exts + default: + return errors.New("proto: not an extension map") + } + + ms := new(messageSet) + if err := Unmarshal(buf, ms); err != nil { + return err + } + for _, item := range ms.Item { + id := *item.TypeId + msg := item.Message + + // Restore wire type and field number varint, plus length varint. + // Be careful to preserve duplicate items. + b := EncodeVarint(uint64(id)<<3 | WireBytes) + if ext, ok := m[id]; ok { + // Existing data; rip off the tag and length varint + // so we join the new data correctly. + // We can assume that ext.enc is set because we are unmarshaling. + o := ext.enc[len(b):] // skip wire type and field number + _, n := DecodeVarint(o) // calculate length of length varint + o = o[n:] // skip length varint + msg = append(o, msg...) // join old data and new data + } + b = append(b, EncodeVarint(uint64(len(msg)))...) + b = append(b, msg...) + + m[id] = Extension{enc: b} + } + return nil +} + +// MarshalMessageSetJSON encodes the extension map represented by m in JSON format. +// It is called by generated MarshalJSON methods on protocol buffer messages with the message_set_wire_format option. +func MarshalMessageSetJSON(exts interface{}) ([]byte, error) { + var m map[int32]Extension + switch exts := exts.(type) { + case *XXX_InternalExtensions: + var mu sync.Locker + m, mu = exts.extensionsRead() + if m != nil { + // Keep the extensions map locked until we're done marshaling to prevent + // races between marshaling and unmarshaling the lazily-{en,de}coded + // values. + mu.Lock() + defer mu.Unlock() + } + case map[int32]Extension: + m = exts + default: + return nil, errors.New("proto: not an extension map") + } + var b bytes.Buffer + b.WriteByte('{') + + // Process the map in key order for deterministic output. + ids := make([]int32, 0, len(m)) + for id := range m { + ids = append(ids, id) + } + sort.Sort(int32Slice(ids)) // int32Slice defined in text.go + + for i, id := range ids { + ext := m[id] + msd, ok := messageSetMap[id] + if !ok { + // Unknown type; we can't render it, so skip it. + continue + } + + if i > 0 && b.Len() > 1 { + b.WriteByte(',') + } + + fmt.Fprintf(&b, `"[%s]":`, msd.name) + + x := ext.value + if x == nil { + x = reflect.New(msd.t.Elem()).Interface() + if err := Unmarshal(ext.enc, x.(Message)); err != nil { + return nil, err + } + } + d, err := json.Marshal(x) + if err != nil { + return nil, err + } + b.Write(d) + } + b.WriteByte('}') + return b.Bytes(), nil +} + +// UnmarshalMessageSetJSON decodes the extension map encoded in buf in JSON format. +// It is called by generated UnmarshalJSON methods on protocol buffer messages with the message_set_wire_format option. +func UnmarshalMessageSetJSON(buf []byte, exts interface{}) error { + // Common-case fast path. + if len(buf) == 0 || bytes.Equal(buf, []byte("{}")) { + return nil + } + + // This is fairly tricky, and it's not clear that it is needed. + return errors.New("TODO: UnmarshalMessageSetJSON not yet implemented") +} + +// A global registry of types that can be used in a MessageSet. + +var messageSetMap = make(map[int32]messageSetDesc) + +type messageSetDesc struct { + t reflect.Type // pointer to struct + name string +} + +// RegisterMessageSetType is called from the generated code. +func RegisterMessageSetType(m Message, fieldNum int32, name string) { + messageSetMap[fieldNum] = messageSetDesc{ + t: reflect.TypeOf(m), + name: name, + } +} diff --git a/api/vendor/github.com/golang/protobuf/proto/message_set_test.go b/api/vendor/github.com/golang/protobuf/proto/message_set_test.go new file mode 100644 index 0000000..2c170c5 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/proto/message_set_test.go @@ -0,0 +1,77 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2014 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package proto + +import ( + "bytes" + "testing" +) + +func TestUnmarshalMessageSetWithDuplicate(t *testing.T) { + // Check that a repeated message set entry will be concatenated. + in := &messageSet{ + Item: []*_MessageSet_Item{ + {TypeId: Int32(12345), Message: []byte("hoo")}, + {TypeId: Int32(12345), Message: []byte("hah")}, + }, + } + b, err := Marshal(in) + if err != nil { + t.Fatalf("Marshal: %v", err) + } + t.Logf("Marshaled bytes: %q", b) + + var extensions XXX_InternalExtensions + if err := UnmarshalMessageSet(b, &extensions); err != nil { + t.Fatalf("UnmarshalMessageSet: %v", err) + } + ext, ok := extensions.p.extensionMap[12345] + if !ok { + t.Fatalf("Didn't retrieve extension 12345; map is %v", extensions.p.extensionMap) + } + // Skip wire type/field number and length varints. + got := skipVarint(skipVarint(ext.enc)) + if want := []byte("hoohah"); !bytes.Equal(got, want) { + t.Errorf("Combined extension is %q, want %q", got, want) + } +} + +func TestMarshalMessageSetJSON_UnknownType(t *testing.T) { + extMap := map[int32]Extension{12345: Extension{}} + got, err := MarshalMessageSetJSON(extMap) + if err != nil { + t.Fatalf("MarshalMessageSetJSON: %v", err) + } + if want := []byte("{}"); !bytes.Equal(got, want) { + t.Errorf("MarshalMessageSetJSON(%v) = %q, want %q", extMap, got, want) + } +} diff --git a/api/vendor/github.com/golang/protobuf/proto/pointer_reflect.go b/api/vendor/github.com/golang/protobuf/proto/pointer_reflect.go new file mode 100644 index 0000000..b6cad90 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/proto/pointer_reflect.go @@ -0,0 +1,357 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2012 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +// +build purego appengine js + +// This file contains an implementation of proto field accesses using package reflect. +// It is slower than the code in pointer_unsafe.go but it avoids package unsafe and can +// be used on App Engine. + +package proto + +import ( + "reflect" + "sync" +) + +const unsafeAllowed = false + +// A field identifies a field in a struct, accessible from a pointer. +// In this implementation, a field is identified by the sequence of field indices +// passed to reflect's FieldByIndex. +type field []int + +// toField returns a field equivalent to the given reflect field. +func toField(f *reflect.StructField) field { + return f.Index +} + +// invalidField is an invalid field identifier. +var invalidField = field(nil) + +// zeroField is a noop when calling pointer.offset. +var zeroField = field([]int{}) + +// IsValid reports whether the field identifier is valid. +func (f field) IsValid() bool { return f != nil } + +// The pointer type is for the table-driven decoder. +// The implementation here uses a reflect.Value of pointer type to +// create a generic pointer. In pointer_unsafe.go we use unsafe +// instead of reflect to implement the same (but faster) interface. +type pointer struct { + v reflect.Value +} + +// toPointer converts an interface of pointer type to a pointer +// that points to the same target. +func toPointer(i *Message) pointer { + return pointer{v: reflect.ValueOf(*i)} +} + +// toAddrPointer converts an interface to a pointer that points to +// the interface data. +func toAddrPointer(i *interface{}, isptr bool) pointer { + v := reflect.ValueOf(*i) + u := reflect.New(v.Type()) + u.Elem().Set(v) + return pointer{v: u} +} + +// valToPointer converts v to a pointer. v must be of pointer type. +func valToPointer(v reflect.Value) pointer { + return pointer{v: v} +} + +// offset converts from a pointer to a structure to a pointer to +// one of its fields. +func (p pointer) offset(f field) pointer { + return pointer{v: p.v.Elem().FieldByIndex(f).Addr()} +} + +func (p pointer) isNil() bool { + return p.v.IsNil() +} + +// grow updates the slice s in place to make it one element longer. +// s must be addressable. +// Returns the (addressable) new element. +func grow(s reflect.Value) reflect.Value { + n, m := s.Len(), s.Cap() + if n < m { + s.SetLen(n + 1) + } else { + s.Set(reflect.Append(s, reflect.Zero(s.Type().Elem()))) + } + return s.Index(n) +} + +func (p pointer) toInt64() *int64 { + return p.v.Interface().(*int64) +} +func (p pointer) toInt64Ptr() **int64 { + return p.v.Interface().(**int64) +} +func (p pointer) toInt64Slice() *[]int64 { + return p.v.Interface().(*[]int64) +} + +var int32ptr = reflect.TypeOf((*int32)(nil)) + +func (p pointer) toInt32() *int32 { + return p.v.Convert(int32ptr).Interface().(*int32) +} + +// The toInt32Ptr/Slice methods don't work because of enums. +// Instead, we must use set/get methods for the int32ptr/slice case. +/* + func (p pointer) toInt32Ptr() **int32 { + return p.v.Interface().(**int32) +} + func (p pointer) toInt32Slice() *[]int32 { + return p.v.Interface().(*[]int32) +} +*/ +func (p pointer) getInt32Ptr() *int32 { + if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) { + // raw int32 type + return p.v.Elem().Interface().(*int32) + } + // an enum + return p.v.Elem().Convert(int32PtrType).Interface().(*int32) +} +func (p pointer) setInt32Ptr(v int32) { + // Allocate value in a *int32. Possibly convert that to a *enum. + // Then assign it to a **int32 or **enum. + // Note: we can convert *int32 to *enum, but we can't convert + // **int32 to **enum! + p.v.Elem().Set(reflect.ValueOf(&v).Convert(p.v.Type().Elem())) +} + +// getInt32Slice copies []int32 from p as a new slice. +// This behavior differs from the implementation in pointer_unsafe.go. +func (p pointer) getInt32Slice() []int32 { + if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) { + // raw int32 type + return p.v.Elem().Interface().([]int32) + } + // an enum + // Allocate a []int32, then assign []enum's values into it. + // Note: we can't convert []enum to []int32. + slice := p.v.Elem() + s := make([]int32, slice.Len()) + for i := 0; i < slice.Len(); i++ { + s[i] = int32(slice.Index(i).Int()) + } + return s +} + +// setInt32Slice copies []int32 into p as a new slice. +// This behavior differs from the implementation in pointer_unsafe.go. +func (p pointer) setInt32Slice(v []int32) { + if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) { + // raw int32 type + p.v.Elem().Set(reflect.ValueOf(v)) + return + } + // an enum + // Allocate a []enum, then assign []int32's values into it. + // Note: we can't convert []enum to []int32. + slice := reflect.MakeSlice(p.v.Type().Elem(), len(v), cap(v)) + for i, x := range v { + slice.Index(i).SetInt(int64(x)) + } + p.v.Elem().Set(slice) +} +func (p pointer) appendInt32Slice(v int32) { + grow(p.v.Elem()).SetInt(int64(v)) +} + +func (p pointer) toUint64() *uint64 { + return p.v.Interface().(*uint64) +} +func (p pointer) toUint64Ptr() **uint64 { + return p.v.Interface().(**uint64) +} +func (p pointer) toUint64Slice() *[]uint64 { + return p.v.Interface().(*[]uint64) +} +func (p pointer) toUint32() *uint32 { + return p.v.Interface().(*uint32) +} +func (p pointer) toUint32Ptr() **uint32 { + return p.v.Interface().(**uint32) +} +func (p pointer) toUint32Slice() *[]uint32 { + return p.v.Interface().(*[]uint32) +} +func (p pointer) toBool() *bool { + return p.v.Interface().(*bool) +} +func (p pointer) toBoolPtr() **bool { + return p.v.Interface().(**bool) +} +func (p pointer) toBoolSlice() *[]bool { + return p.v.Interface().(*[]bool) +} +func (p pointer) toFloat64() *float64 { + return p.v.Interface().(*float64) +} +func (p pointer) toFloat64Ptr() **float64 { + return p.v.Interface().(**float64) +} +func (p pointer) toFloat64Slice() *[]float64 { + return p.v.Interface().(*[]float64) +} +func (p pointer) toFloat32() *float32 { + return p.v.Interface().(*float32) +} +func (p pointer) toFloat32Ptr() **float32 { + return p.v.Interface().(**float32) +} +func (p pointer) toFloat32Slice() *[]float32 { + return p.v.Interface().(*[]float32) +} +func (p pointer) toString() *string { + return p.v.Interface().(*string) +} +func (p pointer) toStringPtr() **string { + return p.v.Interface().(**string) +} +func (p pointer) toStringSlice() *[]string { + return p.v.Interface().(*[]string) +} +func (p pointer) toBytes() *[]byte { + return p.v.Interface().(*[]byte) +} +func (p pointer) toBytesSlice() *[][]byte { + return p.v.Interface().(*[][]byte) +} +func (p pointer) toExtensions() *XXX_InternalExtensions { + return p.v.Interface().(*XXX_InternalExtensions) +} +func (p pointer) toOldExtensions() *map[int32]Extension { + return p.v.Interface().(*map[int32]Extension) +} +func (p pointer) getPointer() pointer { + return pointer{v: p.v.Elem()} +} +func (p pointer) setPointer(q pointer) { + p.v.Elem().Set(q.v) +} +func (p pointer) appendPointer(q pointer) { + grow(p.v.Elem()).Set(q.v) +} + +// getPointerSlice copies []*T from p as a new []pointer. +// This behavior differs from the implementation in pointer_unsafe.go. +func (p pointer) getPointerSlice() []pointer { + if p.v.IsNil() { + return nil + } + n := p.v.Elem().Len() + s := make([]pointer, n) + for i := 0; i < n; i++ { + s[i] = pointer{v: p.v.Elem().Index(i)} + } + return s +} + +// setPointerSlice copies []pointer into p as a new []*T. +// This behavior differs from the implementation in pointer_unsafe.go. +func (p pointer) setPointerSlice(v []pointer) { + if v == nil { + p.v.Elem().Set(reflect.New(p.v.Elem().Type()).Elem()) + return + } + s := reflect.MakeSlice(p.v.Elem().Type(), 0, len(v)) + for _, p := range v { + s = reflect.Append(s, p.v) + } + p.v.Elem().Set(s) +} + +// getInterfacePointer returns a pointer that points to the +// interface data of the interface pointed by p. +func (p pointer) getInterfacePointer() pointer { + if p.v.Elem().IsNil() { + return pointer{v: p.v.Elem()} + } + return pointer{v: p.v.Elem().Elem().Elem().Field(0).Addr()} // *interface -> interface -> *struct -> struct +} + +func (p pointer) asPointerTo(t reflect.Type) reflect.Value { + // TODO: check that p.v.Type().Elem() == t? + return p.v +} + +func atomicLoadUnmarshalInfo(p **unmarshalInfo) *unmarshalInfo { + atomicLock.Lock() + defer atomicLock.Unlock() + return *p +} +func atomicStoreUnmarshalInfo(p **unmarshalInfo, v *unmarshalInfo) { + atomicLock.Lock() + defer atomicLock.Unlock() + *p = v +} +func atomicLoadMarshalInfo(p **marshalInfo) *marshalInfo { + atomicLock.Lock() + defer atomicLock.Unlock() + return *p +} +func atomicStoreMarshalInfo(p **marshalInfo, v *marshalInfo) { + atomicLock.Lock() + defer atomicLock.Unlock() + *p = v +} +func atomicLoadMergeInfo(p **mergeInfo) *mergeInfo { + atomicLock.Lock() + defer atomicLock.Unlock() + return *p +} +func atomicStoreMergeInfo(p **mergeInfo, v *mergeInfo) { + atomicLock.Lock() + defer atomicLock.Unlock() + *p = v +} +func atomicLoadDiscardInfo(p **discardInfo) *discardInfo { + atomicLock.Lock() + defer atomicLock.Unlock() + return *p +} +func atomicStoreDiscardInfo(p **discardInfo, v *discardInfo) { + atomicLock.Lock() + defer atomicLock.Unlock() + *p = v +} + +var atomicLock sync.Mutex diff --git a/api/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go b/api/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go new file mode 100644 index 0000000..d55a335 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go @@ -0,0 +1,308 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2012 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +// +build !purego,!appengine,!js + +// This file contains the implementation of the proto field accesses using package unsafe. + +package proto + +import ( + "reflect" + "sync/atomic" + "unsafe" +) + +const unsafeAllowed = true + +// A field identifies a field in a struct, accessible from a pointer. +// In this implementation, a field is identified by its byte offset from the start of the struct. +type field uintptr + +// toField returns a field equivalent to the given reflect field. +func toField(f *reflect.StructField) field { + return field(f.Offset) +} + +// invalidField is an invalid field identifier. +const invalidField = ^field(0) + +// zeroField is a noop when calling pointer.offset. +const zeroField = field(0) + +// IsValid reports whether the field identifier is valid. +func (f field) IsValid() bool { + return f != invalidField +} + +// The pointer type below is for the new table-driven encoder/decoder. +// The implementation here uses unsafe.Pointer to create a generic pointer. +// In pointer_reflect.go we use reflect instead of unsafe to implement +// the same (but slower) interface. +type pointer struct { + p unsafe.Pointer +} + +// size of pointer +var ptrSize = unsafe.Sizeof(uintptr(0)) + +// toPointer converts an interface of pointer type to a pointer +// that points to the same target. +func toPointer(i *Message) pointer { + // Super-tricky - read pointer out of data word of interface value. + // Saves ~25ns over the equivalent: + // return valToPointer(reflect.ValueOf(*i)) + return pointer{p: (*[2]unsafe.Pointer)(unsafe.Pointer(i))[1]} +} + +// toAddrPointer converts an interface to a pointer that points to +// the interface data. +func toAddrPointer(i *interface{}, isptr bool) pointer { + // Super-tricky - read or get the address of data word of interface value. + if isptr { + // The interface is of pointer type, thus it is a direct interface. + // The data word is the pointer data itself. We take its address. + return pointer{p: unsafe.Pointer(uintptr(unsafe.Pointer(i)) + ptrSize)} + } + // The interface is not of pointer type. The data word is the pointer + // to the data. + return pointer{p: (*[2]unsafe.Pointer)(unsafe.Pointer(i))[1]} +} + +// valToPointer converts v to a pointer. v must be of pointer type. +func valToPointer(v reflect.Value) pointer { + return pointer{p: unsafe.Pointer(v.Pointer())} +} + +// offset converts from a pointer to a structure to a pointer to +// one of its fields. +func (p pointer) offset(f field) pointer { + // For safety, we should panic if !f.IsValid, however calling panic causes + // this to no longer be inlineable, which is a serious performance cost. + /* + if !f.IsValid() { + panic("invalid field") + } + */ + return pointer{p: unsafe.Pointer(uintptr(p.p) + uintptr(f))} +} + +func (p pointer) isNil() bool { + return p.p == nil +} + +func (p pointer) toInt64() *int64 { + return (*int64)(p.p) +} +func (p pointer) toInt64Ptr() **int64 { + return (**int64)(p.p) +} +func (p pointer) toInt64Slice() *[]int64 { + return (*[]int64)(p.p) +} +func (p pointer) toInt32() *int32 { + return (*int32)(p.p) +} + +// See pointer_reflect.go for why toInt32Ptr/Slice doesn't exist. +/* + func (p pointer) toInt32Ptr() **int32 { + return (**int32)(p.p) + } + func (p pointer) toInt32Slice() *[]int32 { + return (*[]int32)(p.p) + } +*/ +func (p pointer) getInt32Ptr() *int32 { + return *(**int32)(p.p) +} +func (p pointer) setInt32Ptr(v int32) { + *(**int32)(p.p) = &v +} + +// getInt32Slice loads a []int32 from p. +// The value returned is aliased with the original slice. +// This behavior differs from the implementation in pointer_reflect.go. +func (p pointer) getInt32Slice() []int32 { + return *(*[]int32)(p.p) +} + +// setInt32Slice stores a []int32 to p. +// The value set is aliased with the input slice. +// This behavior differs from the implementation in pointer_reflect.go. +func (p pointer) setInt32Slice(v []int32) { + *(*[]int32)(p.p) = v +} + +// TODO: Can we get rid of appendInt32Slice and use setInt32Slice instead? +func (p pointer) appendInt32Slice(v int32) { + s := (*[]int32)(p.p) + *s = append(*s, v) +} + +func (p pointer) toUint64() *uint64 { + return (*uint64)(p.p) +} +func (p pointer) toUint64Ptr() **uint64 { + return (**uint64)(p.p) +} +func (p pointer) toUint64Slice() *[]uint64 { + return (*[]uint64)(p.p) +} +func (p pointer) toUint32() *uint32 { + return (*uint32)(p.p) +} +func (p pointer) toUint32Ptr() **uint32 { + return (**uint32)(p.p) +} +func (p pointer) toUint32Slice() *[]uint32 { + return (*[]uint32)(p.p) +} +func (p pointer) toBool() *bool { + return (*bool)(p.p) +} +func (p pointer) toBoolPtr() **bool { + return (**bool)(p.p) +} +func (p pointer) toBoolSlice() *[]bool { + return (*[]bool)(p.p) +} +func (p pointer) toFloat64() *float64 { + return (*float64)(p.p) +} +func (p pointer) toFloat64Ptr() **float64 { + return (**float64)(p.p) +} +func (p pointer) toFloat64Slice() *[]float64 { + return (*[]float64)(p.p) +} +func (p pointer) toFloat32() *float32 { + return (*float32)(p.p) +} +func (p pointer) toFloat32Ptr() **float32 { + return (**float32)(p.p) +} +func (p pointer) toFloat32Slice() *[]float32 { + return (*[]float32)(p.p) +} +func (p pointer) toString() *string { + return (*string)(p.p) +} +func (p pointer) toStringPtr() **string { + return (**string)(p.p) +} +func (p pointer) toStringSlice() *[]string { + return (*[]string)(p.p) +} +func (p pointer) toBytes() *[]byte { + return (*[]byte)(p.p) +} +func (p pointer) toBytesSlice() *[][]byte { + return (*[][]byte)(p.p) +} +func (p pointer) toExtensions() *XXX_InternalExtensions { + return (*XXX_InternalExtensions)(p.p) +} +func (p pointer) toOldExtensions() *map[int32]Extension { + return (*map[int32]Extension)(p.p) +} + +// getPointerSlice loads []*T from p as a []pointer. +// The value returned is aliased with the original slice. +// This behavior differs from the implementation in pointer_reflect.go. +func (p pointer) getPointerSlice() []pointer { + // Super-tricky - p should point to a []*T where T is a + // message type. We load it as []pointer. + return *(*[]pointer)(p.p) +} + +// setPointerSlice stores []pointer into p as a []*T. +// The value set is aliased with the input slice. +// This behavior differs from the implementation in pointer_reflect.go. +func (p pointer) setPointerSlice(v []pointer) { + // Super-tricky - p should point to a []*T where T is a + // message type. We store it as []pointer. + *(*[]pointer)(p.p) = v +} + +// getPointer loads the pointer at p and returns it. +func (p pointer) getPointer() pointer { + return pointer{p: *(*unsafe.Pointer)(p.p)} +} + +// setPointer stores the pointer q at p. +func (p pointer) setPointer(q pointer) { + *(*unsafe.Pointer)(p.p) = q.p +} + +// append q to the slice pointed to by p. +func (p pointer) appendPointer(q pointer) { + s := (*[]unsafe.Pointer)(p.p) + *s = append(*s, q.p) +} + +// getInterfacePointer returns a pointer that points to the +// interface data of the interface pointed by p. +func (p pointer) getInterfacePointer() pointer { + // Super-tricky - read pointer out of data word of interface value. + return pointer{p: (*(*[2]unsafe.Pointer)(p.p))[1]} +} + +// asPointerTo returns a reflect.Value that is a pointer to an +// object of type t stored at p. +func (p pointer) asPointerTo(t reflect.Type) reflect.Value { + return reflect.NewAt(t, p.p) +} + +func atomicLoadUnmarshalInfo(p **unmarshalInfo) *unmarshalInfo { + return (*unmarshalInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +} +func atomicStoreUnmarshalInfo(p **unmarshalInfo, v *unmarshalInfo) { + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) +} +func atomicLoadMarshalInfo(p **marshalInfo) *marshalInfo { + return (*marshalInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +} +func atomicStoreMarshalInfo(p **marshalInfo, v *marshalInfo) { + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) +} +func atomicLoadMergeInfo(p **mergeInfo) *mergeInfo { + return (*mergeInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +} +func atomicStoreMergeInfo(p **mergeInfo, v *mergeInfo) { + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) +} +func atomicLoadDiscardInfo(p **discardInfo) *discardInfo { + return (*discardInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +} +func atomicStoreDiscardInfo(p **discardInfo, v *discardInfo) { + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) +} diff --git a/api/vendor/github.com/golang/protobuf/proto/properties.go b/api/vendor/github.com/golang/protobuf/proto/properties.go new file mode 100644 index 0000000..f710ada --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/proto/properties.go @@ -0,0 +1,544 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package proto + +/* + * Routines for encoding data into the wire format for protocol buffers. + */ + +import ( + "fmt" + "log" + "os" + "reflect" + "sort" + "strconv" + "strings" + "sync" +) + +const debug bool = false + +// Constants that identify the encoding of a value on the wire. +const ( + WireVarint = 0 + WireFixed64 = 1 + WireBytes = 2 + WireStartGroup = 3 + WireEndGroup = 4 + WireFixed32 = 5 +) + +// tagMap is an optimization over map[int]int for typical protocol buffer +// use-cases. Encoded protocol buffers are often in tag order with small tag +// numbers. +type tagMap struct { + fastTags []int + slowTags map[int]int +} + +// tagMapFastLimit is the upper bound on the tag number that will be stored in +// the tagMap slice rather than its map. +const tagMapFastLimit = 1024 + +func (p *tagMap) get(t int) (int, bool) { + if t > 0 && t < tagMapFastLimit { + if t >= len(p.fastTags) { + return 0, false + } + fi := p.fastTags[t] + return fi, fi >= 0 + } + fi, ok := p.slowTags[t] + return fi, ok +} + +func (p *tagMap) put(t int, fi int) { + if t > 0 && t < tagMapFastLimit { + for len(p.fastTags) < t+1 { + p.fastTags = append(p.fastTags, -1) + } + p.fastTags[t] = fi + return + } + if p.slowTags == nil { + p.slowTags = make(map[int]int) + } + p.slowTags[t] = fi +} + +// StructProperties represents properties for all the fields of a struct. +// decoderTags and decoderOrigNames should only be used by the decoder. +type StructProperties struct { + Prop []*Properties // properties for each field + reqCount int // required count + decoderTags tagMap // map from proto tag to struct field number + decoderOrigNames map[string]int // map from original name to struct field number + order []int // list of struct field numbers in tag order + + // OneofTypes contains information about the oneof fields in this message. + // It is keyed by the original name of a field. + OneofTypes map[string]*OneofProperties +} + +// OneofProperties represents information about a specific field in a oneof. +type OneofProperties struct { + Type reflect.Type // pointer to generated struct type for this oneof field + Field int // struct field number of the containing oneof in the message + Prop *Properties +} + +// Implement the sorting interface so we can sort the fields in tag order, as recommended by the spec. +// See encode.go, (*Buffer).enc_struct. + +func (sp *StructProperties) Len() int { return len(sp.order) } +func (sp *StructProperties) Less(i, j int) bool { + return sp.Prop[sp.order[i]].Tag < sp.Prop[sp.order[j]].Tag +} +func (sp *StructProperties) Swap(i, j int) { sp.order[i], sp.order[j] = sp.order[j], sp.order[i] } + +// Properties represents the protocol-specific behavior of a single struct field. +type Properties struct { + Name string // name of the field, for error messages + OrigName string // original name before protocol compiler (always set) + JSONName string // name to use for JSON; determined by protoc + Wire string + WireType int + Tag int + Required bool + Optional bool + Repeated bool + Packed bool // relevant for repeated primitives only + Enum string // set for enum types only + proto3 bool // whether this is known to be a proto3 field; set for []byte only + oneof bool // whether this is a oneof field + + Default string // default value + HasDefault bool // whether an explicit default was provided + + stype reflect.Type // set for struct types only + sprop *StructProperties // set for struct types only + + mtype reflect.Type // set for map types only + mkeyprop *Properties // set for map types only + mvalprop *Properties // set for map types only +} + +// String formats the properties in the protobuf struct field tag style. +func (p *Properties) String() string { + s := p.Wire + s += "," + s += strconv.Itoa(p.Tag) + if p.Required { + s += ",req" + } + if p.Optional { + s += ",opt" + } + if p.Repeated { + s += ",rep" + } + if p.Packed { + s += ",packed" + } + s += ",name=" + p.OrigName + if p.JSONName != p.OrigName { + s += ",json=" + p.JSONName + } + if p.proto3 { + s += ",proto3" + } + if p.oneof { + s += ",oneof" + } + if len(p.Enum) > 0 { + s += ",enum=" + p.Enum + } + if p.HasDefault { + s += ",def=" + p.Default + } + return s +} + +// Parse populates p by parsing a string in the protobuf struct field tag style. +func (p *Properties) Parse(s string) { + // "bytes,49,opt,name=foo,def=hello!" + fields := strings.Split(s, ",") // breaks def=, but handled below. + if len(fields) < 2 { + fmt.Fprintf(os.Stderr, "proto: tag has too few fields: %q\n", s) + return + } + + p.Wire = fields[0] + switch p.Wire { + case "varint": + p.WireType = WireVarint + case "fixed32": + p.WireType = WireFixed32 + case "fixed64": + p.WireType = WireFixed64 + case "zigzag32": + p.WireType = WireVarint + case "zigzag64": + p.WireType = WireVarint + case "bytes", "group": + p.WireType = WireBytes + // no numeric converter for non-numeric types + default: + fmt.Fprintf(os.Stderr, "proto: tag has unknown wire type: %q\n", s) + return + } + + var err error + p.Tag, err = strconv.Atoi(fields[1]) + if err != nil { + return + } + +outer: + for i := 2; i < len(fields); i++ { + f := fields[i] + switch { + case f == "req": + p.Required = true + case f == "opt": + p.Optional = true + case f == "rep": + p.Repeated = true + case f == "packed": + p.Packed = true + case strings.HasPrefix(f, "name="): + p.OrigName = f[5:] + case strings.HasPrefix(f, "json="): + p.JSONName = f[5:] + case strings.HasPrefix(f, "enum="): + p.Enum = f[5:] + case f == "proto3": + p.proto3 = true + case f == "oneof": + p.oneof = true + case strings.HasPrefix(f, "def="): + p.HasDefault = true + p.Default = f[4:] // rest of string + if i+1 < len(fields) { + // Commas aren't escaped, and def is always last. + p.Default += "," + strings.Join(fields[i+1:], ",") + break outer + } + } + } +} + +var protoMessageType = reflect.TypeOf((*Message)(nil)).Elem() + +// setFieldProps initializes the field properties for submessages and maps. +func (p *Properties) setFieldProps(typ reflect.Type, f *reflect.StructField, lockGetProp bool) { + switch t1 := typ; t1.Kind() { + case reflect.Ptr: + if t1.Elem().Kind() == reflect.Struct { + p.stype = t1.Elem() + } + + case reflect.Slice: + if t2 := t1.Elem(); t2.Kind() == reflect.Ptr && t2.Elem().Kind() == reflect.Struct { + p.stype = t2.Elem() + } + + case reflect.Map: + p.mtype = t1 + p.mkeyprop = &Properties{} + p.mkeyprop.init(reflect.PtrTo(p.mtype.Key()), "Key", f.Tag.Get("protobuf_key"), nil, lockGetProp) + p.mvalprop = &Properties{} + vtype := p.mtype.Elem() + if vtype.Kind() != reflect.Ptr && vtype.Kind() != reflect.Slice { + // The value type is not a message (*T) or bytes ([]byte), + // so we need encoders for the pointer to this type. + vtype = reflect.PtrTo(vtype) + } + p.mvalprop.init(vtype, "Value", f.Tag.Get("protobuf_val"), nil, lockGetProp) + } + + if p.stype != nil { + if lockGetProp { + p.sprop = GetProperties(p.stype) + } else { + p.sprop = getPropertiesLocked(p.stype) + } + } +} + +var ( + marshalerType = reflect.TypeOf((*Marshaler)(nil)).Elem() +) + +// Init populates the properties from a protocol buffer struct tag. +func (p *Properties) Init(typ reflect.Type, name, tag string, f *reflect.StructField) { + p.init(typ, name, tag, f, true) +} + +func (p *Properties) init(typ reflect.Type, name, tag string, f *reflect.StructField, lockGetProp bool) { + // "bytes,49,opt,def=hello!" + p.Name = name + p.OrigName = name + if tag == "" { + return + } + p.Parse(tag) + p.setFieldProps(typ, f, lockGetProp) +} + +var ( + propertiesMu sync.RWMutex + propertiesMap = make(map[reflect.Type]*StructProperties) +) + +// GetProperties returns the list of properties for the type represented by t. +// t must represent a generated struct type of a protocol message. +func GetProperties(t reflect.Type) *StructProperties { + if t.Kind() != reflect.Struct { + panic("proto: type must have kind struct") + } + + // Most calls to GetProperties in a long-running program will be + // retrieving details for types we have seen before. + propertiesMu.RLock() + sprop, ok := propertiesMap[t] + propertiesMu.RUnlock() + if ok { + if collectStats { + stats.Chit++ + } + return sprop + } + + propertiesMu.Lock() + sprop = getPropertiesLocked(t) + propertiesMu.Unlock() + return sprop +} + +// getPropertiesLocked requires that propertiesMu is held. +func getPropertiesLocked(t reflect.Type) *StructProperties { + if prop, ok := propertiesMap[t]; ok { + if collectStats { + stats.Chit++ + } + return prop + } + if collectStats { + stats.Cmiss++ + } + + prop := new(StructProperties) + // in case of recursive protos, fill this in now. + propertiesMap[t] = prop + + // build properties + prop.Prop = make([]*Properties, t.NumField()) + prop.order = make([]int, t.NumField()) + + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + p := new(Properties) + name := f.Name + p.init(f.Type, name, f.Tag.Get("protobuf"), &f, false) + + oneof := f.Tag.Get("protobuf_oneof") // special case + if oneof != "" { + // Oneof fields don't use the traditional protobuf tag. + p.OrigName = oneof + } + prop.Prop[i] = p + prop.order[i] = i + if debug { + print(i, " ", f.Name, " ", t.String(), " ") + if p.Tag > 0 { + print(p.String()) + } + print("\n") + } + } + + // Re-order prop.order. + sort.Sort(prop) + + type oneofMessage interface { + XXX_OneofFuncs() (func(Message, *Buffer) error, func(Message, int, int, *Buffer) (bool, error), func(Message) int, []interface{}) + } + if om, ok := reflect.Zero(reflect.PtrTo(t)).Interface().(oneofMessage); ok { + var oots []interface{} + _, _, _, oots = om.XXX_OneofFuncs() + + // Interpret oneof metadata. + prop.OneofTypes = make(map[string]*OneofProperties) + for _, oot := range oots { + oop := &OneofProperties{ + Type: reflect.ValueOf(oot).Type(), // *T + Prop: new(Properties), + } + sft := oop.Type.Elem().Field(0) + oop.Prop.Name = sft.Name + oop.Prop.Parse(sft.Tag.Get("protobuf")) + // There will be exactly one interface field that + // this new value is assignable to. + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + if f.Type.Kind() != reflect.Interface { + continue + } + if !oop.Type.AssignableTo(f.Type) { + continue + } + oop.Field = i + break + } + prop.OneofTypes[oop.Prop.OrigName] = oop + } + } + + // build required counts + // build tags + reqCount := 0 + prop.decoderOrigNames = make(map[string]int) + for i, p := range prop.Prop { + if strings.HasPrefix(p.Name, "XXX_") { + // Internal fields should not appear in tags/origNames maps. + // They are handled specially when encoding and decoding. + continue + } + if p.Required { + reqCount++ + } + prop.decoderTags.put(p.Tag, i) + prop.decoderOrigNames[p.OrigName] = i + } + prop.reqCount = reqCount + + return prop +} + +// A global registry of enum types. +// The generated code will register the generated maps by calling RegisterEnum. + +var enumValueMaps = make(map[string]map[string]int32) + +// RegisterEnum is called from the generated code to install the enum descriptor +// maps into the global table to aid parsing text format protocol buffers. +func RegisterEnum(typeName string, unusedNameMap map[int32]string, valueMap map[string]int32) { + if _, ok := enumValueMaps[typeName]; ok { + panic("proto: duplicate enum registered: " + typeName) + } + enumValueMaps[typeName] = valueMap +} + +// EnumValueMap returns the mapping from names to integers of the +// enum type enumType, or a nil if not found. +func EnumValueMap(enumType string) map[string]int32 { + return enumValueMaps[enumType] +} + +// A registry of all linked message types. +// The string is a fully-qualified proto name ("pkg.Message"). +var ( + protoTypedNils = make(map[string]Message) // a map from proto names to typed nil pointers + protoMapTypes = make(map[string]reflect.Type) // a map from proto names to map types + revProtoTypes = make(map[reflect.Type]string) +) + +// RegisterType is called from generated code and maps from the fully qualified +// proto name to the type (pointer to struct) of the protocol buffer. +func RegisterType(x Message, name string) { + if _, ok := protoTypedNils[name]; ok { + // TODO: Some day, make this a panic. + log.Printf("proto: duplicate proto type registered: %s", name) + return + } + t := reflect.TypeOf(x) + if v := reflect.ValueOf(x); v.Kind() == reflect.Ptr && v.Pointer() == 0 { + // Generated code always calls RegisterType with nil x. + // This check is just for extra safety. + protoTypedNils[name] = x + } else { + protoTypedNils[name] = reflect.Zero(t).Interface().(Message) + } + revProtoTypes[t] = name +} + +// RegisterMapType is called from generated code and maps from the fully qualified +// proto name to the native map type of the proto map definition. +func RegisterMapType(x interface{}, name string) { + if reflect.TypeOf(x).Kind() != reflect.Map { + panic(fmt.Sprintf("RegisterMapType(%T, %q); want map", x, name)) + } + if _, ok := protoMapTypes[name]; ok { + log.Printf("proto: duplicate proto type registered: %s", name) + return + } + t := reflect.TypeOf(x) + protoMapTypes[name] = t + revProtoTypes[t] = name +} + +// MessageName returns the fully-qualified proto name for the given message type. +func MessageName(x Message) string { + type xname interface { + XXX_MessageName() string + } + if m, ok := x.(xname); ok { + return m.XXX_MessageName() + } + return revProtoTypes[reflect.TypeOf(x)] +} + +// MessageType returns the message type (pointer to struct) for a named message. +// The type is not guaranteed to implement proto.Message if the name refers to a +// map entry. +func MessageType(name string) reflect.Type { + if t, ok := protoTypedNils[name]; ok { + return reflect.TypeOf(t) + } + return protoMapTypes[name] +} + +// A registry of all linked proto files. +var ( + protoFiles = make(map[string][]byte) // file name => fileDescriptor +) + +// RegisterFile is called from generated code and maps from the +// full file name of a .proto file to its compressed FileDescriptorProto. +func RegisterFile(filename string, fileDescriptor []byte) { + protoFiles[filename] = fileDescriptor +} + +// FileDescriptor returns the compressed FileDescriptorProto for a .proto file. +func FileDescriptor(filename string) []byte { return protoFiles[filename] } diff --git a/api/vendor/github.com/golang/protobuf/proto/proto3_proto/proto3.pb.go b/api/vendor/github.com/golang/protobuf/proto/proto3_proto/proto3.pb.go new file mode 100644 index 0000000..a80f089 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/proto/proto3_proto/proto3.pb.go @@ -0,0 +1,461 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: proto3_proto/proto3.proto + +package proto3_proto + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" +import test_proto "github.com/golang/protobuf/proto/test_proto" +import any "github.com/golang/protobuf/ptypes/any" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type Message_Humour int32 + +const ( + Message_UNKNOWN Message_Humour = 0 + Message_PUNS Message_Humour = 1 + Message_SLAPSTICK Message_Humour = 2 + Message_BILL_BAILEY Message_Humour = 3 +) + +var Message_Humour_name = map[int32]string{ + 0: "UNKNOWN", + 1: "PUNS", + 2: "SLAPSTICK", + 3: "BILL_BAILEY", +} +var Message_Humour_value = map[string]int32{ + "UNKNOWN": 0, + "PUNS": 1, + "SLAPSTICK": 2, + "BILL_BAILEY": 3, +} + +func (x Message_Humour) String() string { + return proto.EnumName(Message_Humour_name, int32(x)) +} +func (Message_Humour) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_proto3_e706e4ff19a5dbea, []int{0, 0} +} + +type Message struct { + Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Hilarity Message_Humour `protobuf:"varint,2,opt,name=hilarity,enum=proto3_proto.Message_Humour" json:"hilarity,omitempty"` + HeightInCm uint32 `protobuf:"varint,3,opt,name=height_in_cm,json=heightInCm" json:"height_in_cm,omitempty"` + Data []byte `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` + ResultCount int64 `protobuf:"varint,7,opt,name=result_count,json=resultCount" json:"result_count,omitempty"` + TrueScotsman bool `protobuf:"varint,8,opt,name=true_scotsman,json=trueScotsman" json:"true_scotsman,omitempty"` + Score float32 `protobuf:"fixed32,9,opt,name=score" json:"score,omitempty"` + Key []uint64 `protobuf:"varint,5,rep,packed,name=key" json:"key,omitempty"` + ShortKey []int32 `protobuf:"varint,19,rep,packed,name=short_key,json=shortKey" json:"short_key,omitempty"` + Nested *Nested `protobuf:"bytes,6,opt,name=nested" json:"nested,omitempty"` + RFunny []Message_Humour `protobuf:"varint,16,rep,packed,name=r_funny,json=rFunny,enum=proto3_proto.Message_Humour" json:"r_funny,omitempty"` + Terrain map[string]*Nested `protobuf:"bytes,10,rep,name=terrain" json:"terrain,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + Proto2Field *test_proto.SubDefaults `protobuf:"bytes,11,opt,name=proto2_field,json=proto2Field" json:"proto2_field,omitempty"` + Proto2Value map[string]*test_proto.SubDefaults `protobuf:"bytes,13,rep,name=proto2_value,json=proto2Value" json:"proto2_value,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + Anything *any.Any `protobuf:"bytes,14,opt,name=anything" json:"anything,omitempty"` + ManyThings []*any.Any `protobuf:"bytes,15,rep,name=many_things,json=manyThings" json:"many_things,omitempty"` + Submessage *Message `protobuf:"bytes,17,opt,name=submessage" json:"submessage,omitempty"` + Children []*Message `protobuf:"bytes,18,rep,name=children" json:"children,omitempty"` + StringMap map[string]string `protobuf:"bytes,20,rep,name=string_map,json=stringMap" json:"string_map,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Message) Reset() { *m = Message{} } +func (m *Message) String() string { return proto.CompactTextString(m) } +func (*Message) ProtoMessage() {} +func (*Message) Descriptor() ([]byte, []int) { + return fileDescriptor_proto3_e706e4ff19a5dbea, []int{0} +} +func (m *Message) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Message.Unmarshal(m, b) +} +func (m *Message) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Message.Marshal(b, m, deterministic) +} +func (dst *Message) XXX_Merge(src proto.Message) { + xxx_messageInfo_Message.Merge(dst, src) +} +func (m *Message) XXX_Size() int { + return xxx_messageInfo_Message.Size(m) +} +func (m *Message) XXX_DiscardUnknown() { + xxx_messageInfo_Message.DiscardUnknown(m) +} + +var xxx_messageInfo_Message proto.InternalMessageInfo + +func (m *Message) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Message) GetHilarity() Message_Humour { + if m != nil { + return m.Hilarity + } + return Message_UNKNOWN +} + +func (m *Message) GetHeightInCm() uint32 { + if m != nil { + return m.HeightInCm + } + return 0 +} + +func (m *Message) GetData() []byte { + if m != nil { + return m.Data + } + return nil +} + +func (m *Message) GetResultCount() int64 { + if m != nil { + return m.ResultCount + } + return 0 +} + +func (m *Message) GetTrueScotsman() bool { + if m != nil { + return m.TrueScotsman + } + return false +} + +func (m *Message) GetScore() float32 { + if m != nil { + return m.Score + } + return 0 +} + +func (m *Message) GetKey() []uint64 { + if m != nil { + return m.Key + } + return nil +} + +func (m *Message) GetShortKey() []int32 { + if m != nil { + return m.ShortKey + } + return nil +} + +func (m *Message) GetNested() *Nested { + if m != nil { + return m.Nested + } + return nil +} + +func (m *Message) GetRFunny() []Message_Humour { + if m != nil { + return m.RFunny + } + return nil +} + +func (m *Message) GetTerrain() map[string]*Nested { + if m != nil { + return m.Terrain + } + return nil +} + +func (m *Message) GetProto2Field() *test_proto.SubDefaults { + if m != nil { + return m.Proto2Field + } + return nil +} + +func (m *Message) GetProto2Value() map[string]*test_proto.SubDefaults { + if m != nil { + return m.Proto2Value + } + return nil +} + +func (m *Message) GetAnything() *any.Any { + if m != nil { + return m.Anything + } + return nil +} + +func (m *Message) GetManyThings() []*any.Any { + if m != nil { + return m.ManyThings + } + return nil +} + +func (m *Message) GetSubmessage() *Message { + if m != nil { + return m.Submessage + } + return nil +} + +func (m *Message) GetChildren() []*Message { + if m != nil { + return m.Children + } + return nil +} + +func (m *Message) GetStringMap() map[string]string { + if m != nil { + return m.StringMap + } + return nil +} + +type Nested struct { + Bunny string `protobuf:"bytes,1,opt,name=bunny" json:"bunny,omitempty"` + Cute bool `protobuf:"varint,2,opt,name=cute" json:"cute,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Nested) Reset() { *m = Nested{} } +func (m *Nested) String() string { return proto.CompactTextString(m) } +func (*Nested) ProtoMessage() {} +func (*Nested) Descriptor() ([]byte, []int) { + return fileDescriptor_proto3_e706e4ff19a5dbea, []int{1} +} +func (m *Nested) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Nested.Unmarshal(m, b) +} +func (m *Nested) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Nested.Marshal(b, m, deterministic) +} +func (dst *Nested) XXX_Merge(src proto.Message) { + xxx_messageInfo_Nested.Merge(dst, src) +} +func (m *Nested) XXX_Size() int { + return xxx_messageInfo_Nested.Size(m) +} +func (m *Nested) XXX_DiscardUnknown() { + xxx_messageInfo_Nested.DiscardUnknown(m) +} + +var xxx_messageInfo_Nested proto.InternalMessageInfo + +func (m *Nested) GetBunny() string { + if m != nil { + return m.Bunny + } + return "" +} + +func (m *Nested) GetCute() bool { + if m != nil { + return m.Cute + } + return false +} + +type MessageWithMap struct { + ByteMapping map[bool][]byte `protobuf:"bytes,1,rep,name=byte_mapping,json=byteMapping" json:"byte_mapping,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MessageWithMap) Reset() { *m = MessageWithMap{} } +func (m *MessageWithMap) String() string { return proto.CompactTextString(m) } +func (*MessageWithMap) ProtoMessage() {} +func (*MessageWithMap) Descriptor() ([]byte, []int) { + return fileDescriptor_proto3_e706e4ff19a5dbea, []int{2} +} +func (m *MessageWithMap) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MessageWithMap.Unmarshal(m, b) +} +func (m *MessageWithMap) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MessageWithMap.Marshal(b, m, deterministic) +} +func (dst *MessageWithMap) XXX_Merge(src proto.Message) { + xxx_messageInfo_MessageWithMap.Merge(dst, src) +} +func (m *MessageWithMap) XXX_Size() int { + return xxx_messageInfo_MessageWithMap.Size(m) +} +func (m *MessageWithMap) XXX_DiscardUnknown() { + xxx_messageInfo_MessageWithMap.DiscardUnknown(m) +} + +var xxx_messageInfo_MessageWithMap proto.InternalMessageInfo + +func (m *MessageWithMap) GetByteMapping() map[bool][]byte { + if m != nil { + return m.ByteMapping + } + return nil +} + +type IntMap struct { + Rtt map[int32]int32 `protobuf:"bytes,1,rep,name=rtt" json:"rtt,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *IntMap) Reset() { *m = IntMap{} } +func (m *IntMap) String() string { return proto.CompactTextString(m) } +func (*IntMap) ProtoMessage() {} +func (*IntMap) Descriptor() ([]byte, []int) { + return fileDescriptor_proto3_e706e4ff19a5dbea, []int{3} +} +func (m *IntMap) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_IntMap.Unmarshal(m, b) +} +func (m *IntMap) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_IntMap.Marshal(b, m, deterministic) +} +func (dst *IntMap) XXX_Merge(src proto.Message) { + xxx_messageInfo_IntMap.Merge(dst, src) +} +func (m *IntMap) XXX_Size() int { + return xxx_messageInfo_IntMap.Size(m) +} +func (m *IntMap) XXX_DiscardUnknown() { + xxx_messageInfo_IntMap.DiscardUnknown(m) +} + +var xxx_messageInfo_IntMap proto.InternalMessageInfo + +func (m *IntMap) GetRtt() map[int32]int32 { + if m != nil { + return m.Rtt + } + return nil +} + +type IntMaps struct { + Maps []*IntMap `protobuf:"bytes,1,rep,name=maps" json:"maps,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *IntMaps) Reset() { *m = IntMaps{} } +func (m *IntMaps) String() string { return proto.CompactTextString(m) } +func (*IntMaps) ProtoMessage() {} +func (*IntMaps) Descriptor() ([]byte, []int) { + return fileDescriptor_proto3_e706e4ff19a5dbea, []int{4} +} +func (m *IntMaps) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_IntMaps.Unmarshal(m, b) +} +func (m *IntMaps) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_IntMaps.Marshal(b, m, deterministic) +} +func (dst *IntMaps) XXX_Merge(src proto.Message) { + xxx_messageInfo_IntMaps.Merge(dst, src) +} +func (m *IntMaps) XXX_Size() int { + return xxx_messageInfo_IntMaps.Size(m) +} +func (m *IntMaps) XXX_DiscardUnknown() { + xxx_messageInfo_IntMaps.DiscardUnknown(m) +} + +var xxx_messageInfo_IntMaps proto.InternalMessageInfo + +func (m *IntMaps) GetMaps() []*IntMap { + if m != nil { + return m.Maps + } + return nil +} + +func init() { + proto.RegisterType((*Message)(nil), "proto3_proto.Message") + proto.RegisterMapType((map[string]*test_proto.SubDefaults)(nil), "proto3_proto.Message.Proto2ValueEntry") + proto.RegisterMapType((map[string]string)(nil), "proto3_proto.Message.StringMapEntry") + proto.RegisterMapType((map[string]*Nested)(nil), "proto3_proto.Message.TerrainEntry") + proto.RegisterType((*Nested)(nil), "proto3_proto.Nested") + proto.RegisterType((*MessageWithMap)(nil), "proto3_proto.MessageWithMap") + proto.RegisterMapType((map[bool][]byte)(nil), "proto3_proto.MessageWithMap.ByteMappingEntry") + proto.RegisterType((*IntMap)(nil), "proto3_proto.IntMap") + proto.RegisterMapType((map[int32]int32)(nil), "proto3_proto.IntMap.RttEntry") + proto.RegisterType((*IntMaps)(nil), "proto3_proto.IntMaps") + proto.RegisterEnum("proto3_proto.Message_Humour", Message_Humour_name, Message_Humour_value) +} + +func init() { proto.RegisterFile("proto3_proto/proto3.proto", fileDescriptor_proto3_e706e4ff19a5dbea) } + +var fileDescriptor_proto3_e706e4ff19a5dbea = []byte{ + // 774 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x94, 0x6f, 0x8f, 0xdb, 0x44, + 0x10, 0xc6, 0x71, 0x9c, 0x3f, 0xce, 0xd8, 0x77, 0x35, 0x4b, 0x2a, 0xb6, 0x01, 0x24, 0x13, 0x10, + 0xb2, 0x10, 0xf5, 0x41, 0xaa, 0x43, 0x55, 0x55, 0x81, 0xee, 0x8e, 0x56, 0x44, 0x77, 0x17, 0xa2, + 0xcd, 0x95, 0x13, 0xaf, 0xac, 0x4d, 0x6e, 0x93, 0x58, 0xc4, 0xeb, 0xe0, 0x5d, 0x23, 0xf9, 0x0b, + 0xf0, 0x41, 0xf8, 0xa4, 0x68, 0x77, 0x9d, 0xd4, 0xa9, 0x5c, 0xfa, 0x2a, 0xbb, 0x8f, 0x7f, 0x33, + 0xcf, 0x78, 0x66, 0x1c, 0x78, 0xb2, 0xcb, 0x33, 0x99, 0x3d, 0x8b, 0xf5, 0xcf, 0x99, 0xb9, 0x44, + 0xfa, 0x07, 0x79, 0xf5, 0x47, 0xc3, 0x27, 0xeb, 0x2c, 0x5b, 0x6f, 0x99, 0x41, 0x16, 0xc5, 0xea, + 0x8c, 0xf2, 0xd2, 0x80, 0xc3, 0xc7, 0x92, 0x09, 0x59, 0x65, 0x50, 0x47, 0x23, 0x8f, 0xfe, 0xe9, + 0x43, 0xef, 0x96, 0x09, 0x41, 0xd7, 0x0c, 0x21, 0x68, 0x73, 0x9a, 0x32, 0x6c, 0x05, 0x56, 0xd8, + 0x27, 0xfa, 0x8c, 0x9e, 0x83, 0xb3, 0x49, 0xb6, 0x34, 0x4f, 0x64, 0x89, 0x5b, 0x81, 0x15, 0x9e, + 0x8e, 0x3f, 0x8f, 0xea, 0x96, 0x51, 0x15, 0x1c, 0xfd, 0x5a, 0xa4, 0x59, 0x91, 0x93, 0x03, 0x8d, + 0x02, 0xf0, 0x36, 0x2c, 0x59, 0x6f, 0x64, 0x9c, 0xf0, 0x78, 0x99, 0x62, 0x3b, 0xb0, 0xc2, 0x13, + 0x02, 0x46, 0x9b, 0xf0, 0xab, 0x54, 0xf9, 0x3d, 0x50, 0x49, 0x71, 0x3b, 0xb0, 0x42, 0x8f, 0xe8, + 0x33, 0xfa, 0x12, 0xbc, 0x9c, 0x89, 0x62, 0x2b, 0xe3, 0x65, 0x56, 0x70, 0x89, 0x7b, 0x81, 0x15, + 0xda, 0xc4, 0x35, 0xda, 0x95, 0x92, 0xd0, 0x57, 0x70, 0x22, 0xf3, 0x82, 0xc5, 0x62, 0x99, 0x49, + 0x91, 0x52, 0x8e, 0x9d, 0xc0, 0x0a, 0x1d, 0xe2, 0x29, 0x71, 0x5e, 0x69, 0x68, 0x00, 0x1d, 0xb1, + 0xcc, 0x72, 0x86, 0xfb, 0x81, 0x15, 0xb6, 0x88, 0xb9, 0x20, 0x1f, 0xec, 0x3f, 0x59, 0x89, 0x3b, + 0x81, 0x1d, 0xb6, 0x89, 0x3a, 0xa2, 0xcf, 0xa0, 0x2f, 0x36, 0x59, 0x2e, 0x63, 0xa5, 0x7f, 0x12, + 0xd8, 0x61, 0x87, 0x38, 0x5a, 0xb8, 0x66, 0x25, 0xfa, 0x0e, 0xba, 0x9c, 0x09, 0xc9, 0x1e, 0x70, + 0x37, 0xb0, 0x42, 0x77, 0x3c, 0x38, 0x7e, 0xf5, 0xa9, 0x7e, 0x46, 0x2a, 0x06, 0x9d, 0x43, 0x2f, + 0x8f, 0x57, 0x05, 0xe7, 0x25, 0xf6, 0x03, 0xfb, 0x83, 0x9d, 0xea, 0xe6, 0xaf, 0x15, 0x8b, 0x5e, + 0x42, 0x4f, 0xb2, 0x3c, 0xa7, 0x09, 0xc7, 0x10, 0xd8, 0xa1, 0x3b, 0x1e, 0x35, 0x87, 0xdd, 0x19, + 0xe8, 0x15, 0x97, 0x79, 0x49, 0xf6, 0x21, 0xe8, 0x05, 0x98, 0x0d, 0x18, 0xc7, 0xab, 0x84, 0x6d, + 0x1f, 0xb0, 0xab, 0x0b, 0xfd, 0x34, 0x7a, 0x3b, 0xed, 0x68, 0x5e, 0x2c, 0x7e, 0x61, 0x2b, 0x5a, + 0x6c, 0xa5, 0x20, 0xae, 0x81, 0x5f, 0x2b, 0x16, 0x4d, 0x0e, 0xb1, 0x7f, 0xd3, 0x6d, 0xc1, 0xf0, + 0x89, 0xb6, 0xff, 0xa6, 0xd9, 0x7e, 0xa6, 0xc9, 0xdf, 0x15, 0x68, 0x4a, 0xa8, 0x52, 0x69, 0x05, + 0x7d, 0x0f, 0x0e, 0xe5, 0xa5, 0xdc, 0x24, 0x7c, 0x8d, 0x4f, 0xab, 0x5e, 0x99, 0x5d, 0x8c, 0xf6, + 0xbb, 0x18, 0x5d, 0xf0, 0x92, 0x1c, 0x28, 0x74, 0x0e, 0x6e, 0x4a, 0x79, 0x19, 0xeb, 0x9b, 0xc0, + 0x8f, 0xb4, 0x77, 0x73, 0x10, 0x28, 0xf0, 0x4e, 0x73, 0xe8, 0x1c, 0x40, 0x14, 0x8b, 0xd4, 0x14, + 0x85, 0x3f, 0xd6, 0x56, 0x8f, 0x1b, 0x2b, 0x26, 0x35, 0x10, 0xfd, 0x00, 0xce, 0x72, 0x93, 0x6c, + 0x1f, 0x72, 0xc6, 0x31, 0xd2, 0x56, 0xef, 0x09, 0x3a, 0x60, 0xe8, 0x0a, 0x40, 0xc8, 0x3c, 0xe1, + 0xeb, 0x38, 0xa5, 0x3b, 0x3c, 0xd0, 0x41, 0x5f, 0x37, 0xf7, 0x66, 0xae, 0xb9, 0x5b, 0xba, 0x33, + 0x9d, 0xe9, 0x8b, 0xfd, 0x7d, 0x38, 0x03, 0xaf, 0x3e, 0xb7, 0xfd, 0x02, 0x9a, 0x2f, 0x4c, 0x2f, + 0xe0, 0xb7, 0xd0, 0x31, 0xdd, 0x6f, 0xfd, 0xcf, 0x8a, 0x19, 0xe4, 0x45, 0xeb, 0xb9, 0x35, 0xbc, + 0x07, 0xff, 0xdd, 0x51, 0x34, 0x64, 0x7d, 0x7a, 0x9c, 0xf5, 0xbd, 0xfb, 0x50, 0x4b, 0xfc, 0x12, + 0x4e, 0x8f, 0xdf, 0xa3, 0x21, 0xed, 0xa0, 0x9e, 0xb6, 0x5f, 0x8b, 0x1e, 0xfd, 0x0c, 0x5d, 0xb3, + 0xd7, 0xc8, 0x85, 0xde, 0x9b, 0xe9, 0xf5, 0xf4, 0xb7, 0xfb, 0xa9, 0xff, 0x11, 0x72, 0xa0, 0x3d, + 0x7b, 0x33, 0x9d, 0xfb, 0x16, 0x3a, 0x81, 0xfe, 0xfc, 0xe6, 0x62, 0x36, 0xbf, 0x9b, 0x5c, 0x5d, + 0xfb, 0x2d, 0xf4, 0x08, 0xdc, 0xcb, 0xc9, 0xcd, 0x4d, 0x7c, 0x79, 0x31, 0xb9, 0x79, 0xf5, 0x87, + 0x6f, 0x8f, 0xc6, 0xd0, 0x35, 0x2f, 0xab, 0x4c, 0x16, 0xfa, 0x2b, 0x32, 0xc6, 0xe6, 0xa2, 0xfe, + 0x2c, 0x96, 0x85, 0x34, 0xce, 0x0e, 0xd1, 0xe7, 0xd1, 0xbf, 0x16, 0x9c, 0x56, 0x33, 0xb8, 0x4f, + 0xe4, 0xe6, 0x96, 0xee, 0xd0, 0x0c, 0xbc, 0x45, 0x29, 0x99, 0x9a, 0xd9, 0x4e, 0x2d, 0xa3, 0xa5, + 0xe7, 0xf6, 0xb4, 0x71, 0x6e, 0x55, 0x4c, 0x74, 0x59, 0x4a, 0x76, 0x6b, 0xf8, 0x6a, 0xb5, 0x17, + 0x6f, 0x95, 0xe1, 0x4f, 0xe0, 0xbf, 0x0b, 0xd4, 0x3b, 0xe3, 0x34, 0x74, 0xc6, 0xab, 0x77, 0xe6, + 0x2f, 0xe8, 0x4e, 0xb8, 0x54, 0xb5, 0x9d, 0x81, 0x9d, 0x4b, 0x59, 0x95, 0xf4, 0xc5, 0x71, 0x49, + 0x06, 0x89, 0x88, 0x94, 0xa6, 0x04, 0x45, 0x0e, 0x7f, 0x04, 0x67, 0x2f, 0xd4, 0x2d, 0x3b, 0x0d, + 0x96, 0x9d, 0xba, 0xe5, 0x33, 0xe8, 0x99, 0x7c, 0x02, 0x85, 0xd0, 0x4e, 0xe9, 0x4e, 0x54, 0xa6, + 0x83, 0x26, 0x53, 0xa2, 0x89, 0x45, 0xd7, 0x3c, 0xfa, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x99, 0x24, + 0x6b, 0x12, 0x6d, 0x06, 0x00, 0x00, +} diff --git a/api/vendor/github.com/golang/protobuf/proto/proto3_proto/proto3.proto b/api/vendor/github.com/golang/protobuf/proto/proto3_proto/proto3.proto new file mode 100644 index 0000000..c81fe1e --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/proto/proto3_proto/proto3.proto @@ -0,0 +1,89 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2014 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto3"; + +import "google/protobuf/any.proto"; +import "test_proto/test.proto"; + +package proto3_proto; + +message Message { + enum Humour { + UNKNOWN = 0; + PUNS = 1; + SLAPSTICK = 2; + BILL_BAILEY = 3; + } + + string name = 1; + Humour hilarity = 2; + uint32 height_in_cm = 3; + bytes data = 4; + int64 result_count = 7; + bool true_scotsman = 8; + float score = 9; + + repeated uint64 key = 5; + repeated int32 short_key = 19; + Nested nested = 6; + repeated Humour r_funny = 16; + + map terrain = 10; + test_proto.SubDefaults proto2_field = 11; + map proto2_value = 13; + + google.protobuf.Any anything = 14; + repeated google.protobuf.Any many_things = 15; + + Message submessage = 17; + repeated Message children = 18; + + map string_map = 20; +} + +message Nested { + string bunny = 1; + bool cute = 2; +} + +message MessageWithMap { + map byte_mapping = 1; +} + + +message IntMap { + map rtt = 1; +} + +message IntMaps { + repeated IntMap maps = 1; +} diff --git a/api/vendor/github.com/golang/protobuf/proto/proto3_test.go b/api/vendor/github.com/golang/protobuf/proto/proto3_test.go new file mode 100644 index 0000000..73eed6c --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/proto/proto3_test.go @@ -0,0 +1,151 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2014 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package proto_test + +import ( + "bytes" + "testing" + + "github.com/golang/protobuf/proto" + pb "github.com/golang/protobuf/proto/proto3_proto" + tpb "github.com/golang/protobuf/proto/test_proto" +) + +func TestProto3ZeroValues(t *testing.T) { + tests := []struct { + desc string + m proto.Message + }{ + {"zero message", &pb.Message{}}, + {"empty bytes field", &pb.Message{Data: []byte{}}}, + } + for _, test := range tests { + b, err := proto.Marshal(test.m) + if err != nil { + t.Errorf("%s: proto.Marshal: %v", test.desc, err) + continue + } + if len(b) > 0 { + t.Errorf("%s: Encoding is non-empty: %q", test.desc, b) + } + } +} + +func TestRoundTripProto3(t *testing.T) { + m := &pb.Message{ + Name: "David", // (2 | 1<<3): 0x0a 0x05 "David" + Hilarity: pb.Message_PUNS, // (0 | 2<<3): 0x10 0x01 + HeightInCm: 178, // (0 | 3<<3): 0x18 0xb2 0x01 + Data: []byte("roboto"), // (2 | 4<<3): 0x20 0x06 "roboto" + ResultCount: 47, // (0 | 7<<3): 0x38 0x2f + TrueScotsman: true, // (0 | 8<<3): 0x40 0x01 + Score: 8.1, // (5 | 9<<3): 0x4d <8.1> + + Key: []uint64{1, 0xdeadbeef}, + Nested: &pb.Nested{ + Bunny: "Monty", + }, + } + t.Logf(" m: %v", m) + + b, err := proto.Marshal(m) + if err != nil { + t.Fatalf("proto.Marshal: %v", err) + } + t.Logf(" b: %q", b) + + m2 := new(pb.Message) + if err := proto.Unmarshal(b, m2); err != nil { + t.Fatalf("proto.Unmarshal: %v", err) + } + t.Logf("m2: %v", m2) + + if !proto.Equal(m, m2) { + t.Errorf("proto.Equal returned false:\n m: %v\nm2: %v", m, m2) + } +} + +func TestGettersForBasicTypesExist(t *testing.T) { + var m pb.Message + if got := m.GetNested().GetBunny(); got != "" { + t.Errorf("m.GetNested().GetBunny() = %q, want empty string", got) + } + if got := m.GetNested().GetCute(); got { + t.Errorf("m.GetNested().GetCute() = %t, want false", got) + } +} + +func TestProto3SetDefaults(t *testing.T) { + in := &pb.Message{ + Terrain: map[string]*pb.Nested{ + "meadow": new(pb.Nested), + }, + Proto2Field: new(tpb.SubDefaults), + Proto2Value: map[string]*tpb.SubDefaults{ + "badlands": new(tpb.SubDefaults), + }, + } + + got := proto.Clone(in).(*pb.Message) + proto.SetDefaults(got) + + // There are no defaults in proto3. Everything should be the zero value, but + // we need to remember to set defaults for nested proto2 messages. + want := &pb.Message{ + Terrain: map[string]*pb.Nested{ + "meadow": new(pb.Nested), + }, + Proto2Field: &tpb.SubDefaults{N: proto.Int64(7)}, + Proto2Value: map[string]*tpb.SubDefaults{ + "badlands": &tpb.SubDefaults{N: proto.Int64(7)}, + }, + } + + if !proto.Equal(got, want) { + t.Errorf("with in = %v\nproto.SetDefaults(in) =>\ngot %v\nwant %v", in, got, want) + } +} + +func TestUnknownFieldPreservation(t *testing.T) { + b1 := "\x0a\x05David" // Known tag 1 + b2 := "\xc2\x0c\x06Google" // Unknown tag 200 + b := []byte(b1 + b2) + + m := new(pb.Message) + if err := proto.Unmarshal(b, m); err != nil { + t.Fatalf("proto.Unmarshal: %v", err) + } + + if !bytes.Equal(m.XXX_unrecognized, []byte(b2)) { + t.Fatalf("mismatching unknown fields:\ngot %q\nwant %q", m.XXX_unrecognized, b2) + } +} diff --git a/api/vendor/github.com/golang/protobuf/proto/size2_test.go b/api/vendor/github.com/golang/protobuf/proto/size2_test.go new file mode 100644 index 0000000..7846b06 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/proto/size2_test.go @@ -0,0 +1,63 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2012 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package proto + +import ( + "testing" +) + +// This is a separate file and package from size_test.go because that one uses +// generated messages and thus may not be in package proto without having a circular +// dependency, whereas this file tests unexported details of size.go. + +func TestVarintSize(t *testing.T) { + // Check the edge cases carefully. + testCases := []struct { + n uint64 + size int + }{ + {0, 1}, + {1, 1}, + {127, 1}, + {128, 2}, + {16383, 2}, + {16384, 3}, + {1<<63 - 1, 9}, + {1 << 63, 10}, + } + for _, tc := range testCases { + size := SizeVarint(tc.n) + if size != tc.size { + t.Errorf("sizeVarint(%d) = %d, want %d", tc.n, size, tc.size) + } + } +} diff --git a/api/vendor/github.com/golang/protobuf/proto/size_test.go b/api/vendor/github.com/golang/protobuf/proto/size_test.go new file mode 100644 index 0000000..3abac41 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/proto/size_test.go @@ -0,0 +1,191 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2012 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package proto_test + +import ( + "log" + "strings" + "testing" + + . "github.com/golang/protobuf/proto" + proto3pb "github.com/golang/protobuf/proto/proto3_proto" + pb "github.com/golang/protobuf/proto/test_proto" +) + +var messageWithExtension1 = &pb.MyMessage{Count: Int32(7)} + +// messageWithExtension2 is in equal_test.go. +var messageWithExtension3 = &pb.MyMessage{Count: Int32(8)} + +func init() { + if err := SetExtension(messageWithExtension1, pb.E_Ext_More, &pb.Ext{Data: String("Abbott")}); err != nil { + log.Panicf("SetExtension: %v", err) + } + if err := SetExtension(messageWithExtension3, pb.E_Ext_More, &pb.Ext{Data: String("Costello")}); err != nil { + log.Panicf("SetExtension: %v", err) + } + + // Force messageWithExtension3 to have the extension encoded. + Marshal(messageWithExtension3) + +} + +// non-pointer custom message +type nonptrMessage struct{} + +func (m nonptrMessage) ProtoMessage() {} +func (m nonptrMessage) Reset() {} +func (m nonptrMessage) String() string { return "" } + +func (m nonptrMessage) Marshal() ([]byte, error) { + return []byte{42}, nil +} + +// custom message embedding a proto.Message +type messageWithEmbedding struct { + *pb.OtherMessage +} + +func (m *messageWithEmbedding) ProtoMessage() {} +func (m *messageWithEmbedding) Reset() {} +func (m *messageWithEmbedding) String() string { return "" } + +func (m *messageWithEmbedding) Marshal() ([]byte, error) { + return []byte{42}, nil +} + +var SizeTests = []struct { + desc string + pb Message +}{ + {"empty", &pb.OtherMessage{}}, + // Basic types. + {"bool", &pb.Defaults{F_Bool: Bool(true)}}, + {"int32", &pb.Defaults{F_Int32: Int32(12)}}, + {"negative int32", &pb.Defaults{F_Int32: Int32(-1)}}, + {"small int64", &pb.Defaults{F_Int64: Int64(1)}}, + {"big int64", &pb.Defaults{F_Int64: Int64(1 << 20)}}, + {"negative int64", &pb.Defaults{F_Int64: Int64(-1)}}, + {"fixed32", &pb.Defaults{F_Fixed32: Uint32(71)}}, + {"fixed64", &pb.Defaults{F_Fixed64: Uint64(72)}}, + {"uint32", &pb.Defaults{F_Uint32: Uint32(123)}}, + {"uint64", &pb.Defaults{F_Uint64: Uint64(124)}}, + {"float", &pb.Defaults{F_Float: Float32(12.6)}}, + {"double", &pb.Defaults{F_Double: Float64(13.9)}}, + {"string", &pb.Defaults{F_String: String("niles")}}, + {"bytes", &pb.Defaults{F_Bytes: []byte("wowsa")}}, + {"bytes, empty", &pb.Defaults{F_Bytes: []byte{}}}, + {"sint32", &pb.Defaults{F_Sint32: Int32(65)}}, + {"sint64", &pb.Defaults{F_Sint64: Int64(67)}}, + {"enum", &pb.Defaults{F_Enum: pb.Defaults_BLUE.Enum()}}, + // Repeated. + {"empty repeated bool", &pb.MoreRepeated{Bools: []bool{}}}, + {"repeated bool", &pb.MoreRepeated{Bools: []bool{false, true, true, false}}}, + {"packed repeated bool", &pb.MoreRepeated{BoolsPacked: []bool{false, true, true, false, true, true, true}}}, + {"repeated int32", &pb.MoreRepeated{Ints: []int32{1, 12203, 1729, -1}}}, + {"repeated int32 packed", &pb.MoreRepeated{IntsPacked: []int32{1, 12203, 1729}}}, + {"repeated int64 packed", &pb.MoreRepeated{Int64SPacked: []int64{ + // Need enough large numbers to verify that the header is counting the number of bytes + // for the field, not the number of elements. + 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, + 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, + }}}, + {"repeated string", &pb.MoreRepeated{Strings: []string{"r", "ken", "gri"}}}, + {"repeated fixed", &pb.MoreRepeated{Fixeds: []uint32{1, 2, 3, 4}}}, + // Nested. + {"nested", &pb.OldMessage{Nested: &pb.OldMessage_Nested{Name: String("whatever")}}}, + {"group", &pb.GroupOld{G: &pb.GroupOld_G{X: Int32(12345)}}}, + // Other things. + {"unrecognized", &pb.MoreRepeated{XXX_unrecognized: []byte{13<<3 | 0, 4}}}, + {"extension (unencoded)", messageWithExtension1}, + {"extension (encoded)", messageWithExtension3}, + // proto3 message + {"proto3 empty", &proto3pb.Message{}}, + {"proto3 bool", &proto3pb.Message{TrueScotsman: true}}, + {"proto3 int64", &proto3pb.Message{ResultCount: 1}}, + {"proto3 uint32", &proto3pb.Message{HeightInCm: 123}}, + {"proto3 float", &proto3pb.Message{Score: 12.6}}, + {"proto3 string", &proto3pb.Message{Name: "Snezana"}}, + {"proto3 bytes", &proto3pb.Message{Data: []byte("wowsa")}}, + {"proto3 bytes, empty", &proto3pb.Message{Data: []byte{}}}, + {"proto3 enum", &proto3pb.Message{Hilarity: proto3pb.Message_PUNS}}, + {"proto3 map field with empty bytes", &proto3pb.MessageWithMap{ByteMapping: map[bool][]byte{false: []byte{}}}}, + + {"map field", &pb.MessageWithMap{NameMapping: map[int32]string{1: "Rob", 7: "Andrew"}}}, + {"map field with message", &pb.MessageWithMap{MsgMapping: map[int64]*pb.FloatingPoint{0x7001: &pb.FloatingPoint{F: Float64(2.0)}}}}, + {"map field with bytes", &pb.MessageWithMap{ByteMapping: map[bool][]byte{true: []byte("this time for sure")}}}, + {"map field with empty bytes", &pb.MessageWithMap{ByteMapping: map[bool][]byte{true: []byte{}}}}, + + {"map field with big entry", &pb.MessageWithMap{NameMapping: map[int32]string{8: strings.Repeat("x", 125)}}}, + {"map field with big key and val", &pb.MessageWithMap{StrToStr: map[string]string{strings.Repeat("x", 70): strings.Repeat("y", 70)}}}, + {"map field with big numeric key", &pb.MessageWithMap{NameMapping: map[int32]string{0xf00d: "om nom nom"}}}, + + {"oneof not set", &pb.Oneof{}}, + {"oneof bool", &pb.Oneof{Union: &pb.Oneof_F_Bool{true}}}, + {"oneof zero int32", &pb.Oneof{Union: &pb.Oneof_F_Int32{0}}}, + {"oneof big int32", &pb.Oneof{Union: &pb.Oneof_F_Int32{1 << 20}}}, + {"oneof int64", &pb.Oneof{Union: &pb.Oneof_F_Int64{42}}}, + {"oneof fixed32", &pb.Oneof{Union: &pb.Oneof_F_Fixed32{43}}}, + {"oneof fixed64", &pb.Oneof{Union: &pb.Oneof_F_Fixed64{44}}}, + {"oneof uint32", &pb.Oneof{Union: &pb.Oneof_F_Uint32{45}}}, + {"oneof uint64", &pb.Oneof{Union: &pb.Oneof_F_Uint64{46}}}, + {"oneof float", &pb.Oneof{Union: &pb.Oneof_F_Float{47.1}}}, + {"oneof double", &pb.Oneof{Union: &pb.Oneof_F_Double{48.9}}}, + {"oneof string", &pb.Oneof{Union: &pb.Oneof_F_String{"Rhythmic Fman"}}}, + {"oneof bytes", &pb.Oneof{Union: &pb.Oneof_F_Bytes{[]byte("let go")}}}, + {"oneof sint32", &pb.Oneof{Union: &pb.Oneof_F_Sint32{50}}}, + {"oneof sint64", &pb.Oneof{Union: &pb.Oneof_F_Sint64{51}}}, + {"oneof enum", &pb.Oneof{Union: &pb.Oneof_F_Enum{pb.MyMessage_BLUE}}}, + {"message for oneof", &pb.GoTestField{Label: String("k"), Type: String("v")}}, + {"oneof message", &pb.Oneof{Union: &pb.Oneof_F_Message{&pb.GoTestField{Label: String("k"), Type: String("v")}}}}, + {"oneof group", &pb.Oneof{Union: &pb.Oneof_FGroup{&pb.Oneof_F_Group{X: Int32(52)}}}}, + {"oneof largest tag", &pb.Oneof{Union: &pb.Oneof_F_Largest_Tag{1}}}, + {"multiple oneofs", &pb.Oneof{Union: &pb.Oneof_F_Int32{1}, Tormato: &pb.Oneof_Value{2}}}, + + {"non-pointer message", nonptrMessage{}}, + {"custom message with embedding", &messageWithEmbedding{&pb.OtherMessage{}}}, +} + +func TestSize(t *testing.T) { + for _, tc := range SizeTests { + size := Size(tc.pb) + b, err := Marshal(tc.pb) + if err != nil { + t.Errorf("%v: Marshal failed: %v", tc.desc, err) + continue + } + if size != len(b) { + t.Errorf("%v: Size(%v) = %d, want %d", tc.desc, tc.pb, size, len(b)) + t.Logf("%v: bytes: %#v", tc.desc, b) + } + } +} diff --git a/api/vendor/github.com/golang/protobuf/proto/table_marshal.go b/api/vendor/github.com/golang/protobuf/proto/table_marshal.go new file mode 100644 index 0000000..0f212b3 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/proto/table_marshal.go @@ -0,0 +1,2681 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package proto + +import ( + "errors" + "fmt" + "math" + "reflect" + "sort" + "strconv" + "strings" + "sync" + "sync/atomic" + "unicode/utf8" +) + +// a sizer takes a pointer to a field and the size of its tag, computes the size of +// the encoded data. +type sizer func(pointer, int) int + +// a marshaler takes a byte slice, a pointer to a field, and its tag (in wire format), +// marshals the field to the end of the slice, returns the slice and error (if any). +type marshaler func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) + +// marshalInfo is the information used for marshaling a message. +type marshalInfo struct { + typ reflect.Type + fields []*marshalFieldInfo + unrecognized field // offset of XXX_unrecognized + extensions field // offset of XXX_InternalExtensions + v1extensions field // offset of XXX_extensions + sizecache field // offset of XXX_sizecache + initialized int32 // 0 -- only typ is set, 1 -- fully initialized + messageset bool // uses message set wire format + hasmarshaler bool // has custom marshaler + sync.RWMutex // protect extElems map, also for initialization + extElems map[int32]*marshalElemInfo // info of extension elements +} + +// marshalFieldInfo is the information used for marshaling a field of a message. +type marshalFieldInfo struct { + field field + wiretag uint64 // tag in wire format + tagsize int // size of tag in wire format + sizer sizer + marshaler marshaler + isPointer bool + required bool // field is required + name string // name of the field, for error reporting + oneofElems map[reflect.Type]*marshalElemInfo // info of oneof elements +} + +// marshalElemInfo is the information used for marshaling an extension or oneof element. +type marshalElemInfo struct { + wiretag uint64 // tag in wire format + tagsize int // size of tag in wire format + sizer sizer + marshaler marshaler + isptr bool // elem is pointer typed, thus interface of this type is a direct interface (extension only) +} + +var ( + marshalInfoMap = map[reflect.Type]*marshalInfo{} + marshalInfoLock sync.Mutex +) + +// getMarshalInfo returns the information to marshal a given type of message. +// The info it returns may not necessarily initialized. +// t is the type of the message (NOT the pointer to it). +func getMarshalInfo(t reflect.Type) *marshalInfo { + marshalInfoLock.Lock() + u, ok := marshalInfoMap[t] + if !ok { + u = &marshalInfo{typ: t} + marshalInfoMap[t] = u + } + marshalInfoLock.Unlock() + return u +} + +// Size is the entry point from generated code, +// and should be ONLY called by generated code. +// It computes the size of encoded data of msg. +// a is a pointer to a place to store cached marshal info. +func (a *InternalMessageInfo) Size(msg Message) int { + u := getMessageMarshalInfo(msg, a) + ptr := toPointer(&msg) + if ptr.isNil() { + // We get here if msg is a typed nil ((*SomeMessage)(nil)), + // so it satisfies the interface, and msg == nil wouldn't + // catch it. We don't want crash in this case. + return 0 + } + return u.size(ptr) +} + +// Marshal is the entry point from generated code, +// and should be ONLY called by generated code. +// It marshals msg to the end of b. +// a is a pointer to a place to store cached marshal info. +func (a *InternalMessageInfo) Marshal(b []byte, msg Message, deterministic bool) ([]byte, error) { + u := getMessageMarshalInfo(msg, a) + ptr := toPointer(&msg) + if ptr.isNil() { + // We get here if msg is a typed nil ((*SomeMessage)(nil)), + // so it satisfies the interface, and msg == nil wouldn't + // catch it. We don't want crash in this case. + return b, ErrNil + } + return u.marshal(b, ptr, deterministic) +} + +func getMessageMarshalInfo(msg interface{}, a *InternalMessageInfo) *marshalInfo { + // u := a.marshal, but atomically. + // We use an atomic here to ensure memory consistency. + u := atomicLoadMarshalInfo(&a.marshal) + if u == nil { + // Get marshal information from type of message. + t := reflect.ValueOf(msg).Type() + if t.Kind() != reflect.Ptr { + panic(fmt.Sprintf("cannot handle non-pointer message type %v", t)) + } + u = getMarshalInfo(t.Elem()) + // Store it in the cache for later users. + // a.marshal = u, but atomically. + atomicStoreMarshalInfo(&a.marshal, u) + } + return u +} + +// size is the main function to compute the size of the encoded data of a message. +// ptr is the pointer to the message. +func (u *marshalInfo) size(ptr pointer) int { + if atomic.LoadInt32(&u.initialized) == 0 { + u.computeMarshalInfo() + } + + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + if u.hasmarshaler { + m := ptr.asPointerTo(u.typ).Interface().(Marshaler) + b, _ := m.Marshal() + return len(b) + } + + n := 0 + for _, f := range u.fields { + if f.isPointer && ptr.offset(f.field).getPointer().isNil() { + // nil pointer always marshals to nothing + continue + } + n += f.sizer(ptr.offset(f.field), f.tagsize) + } + if u.extensions.IsValid() { + e := ptr.offset(u.extensions).toExtensions() + if u.messageset { + n += u.sizeMessageSet(e) + } else { + n += u.sizeExtensions(e) + } + } + if u.v1extensions.IsValid() { + m := *ptr.offset(u.v1extensions).toOldExtensions() + n += u.sizeV1Extensions(m) + } + if u.unrecognized.IsValid() { + s := *ptr.offset(u.unrecognized).toBytes() + n += len(s) + } + // cache the result for use in marshal + if u.sizecache.IsValid() { + atomic.StoreInt32(ptr.offset(u.sizecache).toInt32(), int32(n)) + } + return n +} + +// cachedsize gets the size from cache. If there is no cache (i.e. message is not generated), +// fall back to compute the size. +func (u *marshalInfo) cachedsize(ptr pointer) int { + if u.sizecache.IsValid() { + return int(atomic.LoadInt32(ptr.offset(u.sizecache).toInt32())) + } + return u.size(ptr) +} + +// marshal is the main function to marshal a message. It takes a byte slice and appends +// the encoded data to the end of the slice, returns the slice and error (if any). +// ptr is the pointer to the message. +// If deterministic is true, map is marshaled in deterministic order. +func (u *marshalInfo) marshal(b []byte, ptr pointer, deterministic bool) ([]byte, error) { + if atomic.LoadInt32(&u.initialized) == 0 { + u.computeMarshalInfo() + } + + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + if u.hasmarshaler { + m := ptr.asPointerTo(u.typ).Interface().(Marshaler) + b1, err := m.Marshal() + b = append(b, b1...) + return b, err + } + + var err, errreq error + // The old marshaler encodes extensions at beginning. + if u.extensions.IsValid() { + e := ptr.offset(u.extensions).toExtensions() + if u.messageset { + b, err = u.appendMessageSet(b, e, deterministic) + } else { + b, err = u.appendExtensions(b, e, deterministic) + } + if err != nil { + return b, err + } + } + if u.v1extensions.IsValid() { + m := *ptr.offset(u.v1extensions).toOldExtensions() + b, err = u.appendV1Extensions(b, m, deterministic) + if err != nil { + return b, err + } + } + for _, f := range u.fields { + if f.required && errreq == nil { + if ptr.offset(f.field).getPointer().isNil() { + // Required field is not set. + // We record the error but keep going, to give a complete marshaling. + errreq = &RequiredNotSetError{f.name} + continue + } + } + if f.isPointer && ptr.offset(f.field).getPointer().isNil() { + // nil pointer always marshals to nothing + continue + } + b, err = f.marshaler(b, ptr.offset(f.field), f.wiretag, deterministic) + if err != nil { + if err1, ok := err.(*RequiredNotSetError); ok { + // Required field in submessage is not set. + // We record the error but keep going, to give a complete marshaling. + if errreq == nil { + errreq = &RequiredNotSetError{f.name + "." + err1.field} + } + continue + } + if err == errRepeatedHasNil { + err = errors.New("proto: repeated field " + f.name + " has nil element") + } + return b, err + } + } + if u.unrecognized.IsValid() { + s := *ptr.offset(u.unrecognized).toBytes() + b = append(b, s...) + } + return b, errreq +} + +// computeMarshalInfo initializes the marshal info. +func (u *marshalInfo) computeMarshalInfo() { + u.Lock() + defer u.Unlock() + if u.initialized != 0 { // non-atomic read is ok as it is protected by the lock + return + } + + t := u.typ + u.unrecognized = invalidField + u.extensions = invalidField + u.v1extensions = invalidField + u.sizecache = invalidField + + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + if reflect.PtrTo(t).Implements(marshalerType) { + u.hasmarshaler = true + atomic.StoreInt32(&u.initialized, 1) + return + } + + // get oneof implementers + var oneofImplementers []interface{} + if m, ok := reflect.Zero(reflect.PtrTo(t)).Interface().(oneofMessage); ok { + _, _, _, oneofImplementers = m.XXX_OneofFuncs() + } + + n := t.NumField() + + // deal with XXX fields first + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + if !strings.HasPrefix(f.Name, "XXX_") { + continue + } + switch f.Name { + case "XXX_sizecache": + u.sizecache = toField(&f) + case "XXX_unrecognized": + u.unrecognized = toField(&f) + case "XXX_InternalExtensions": + u.extensions = toField(&f) + u.messageset = f.Tag.Get("protobuf_messageset") == "1" + case "XXX_extensions": + u.v1extensions = toField(&f) + case "XXX_NoUnkeyedLiteral": + // nothing to do + default: + panic("unknown XXX field: " + f.Name) + } + n-- + } + + // normal fields + fields := make([]marshalFieldInfo, n) // batch allocation + u.fields = make([]*marshalFieldInfo, 0, n) + for i, j := 0, 0; i < t.NumField(); i++ { + f := t.Field(i) + + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + field := &fields[j] + j++ + field.name = f.Name + u.fields = append(u.fields, field) + if f.Tag.Get("protobuf_oneof") != "" { + field.computeOneofFieldInfo(&f, oneofImplementers) + continue + } + if f.Tag.Get("protobuf") == "" { + // field has no tag (not in generated message), ignore it + u.fields = u.fields[:len(u.fields)-1] + j-- + continue + } + field.computeMarshalFieldInfo(&f) + } + + // fields are marshaled in tag order on the wire. + sort.Sort(byTag(u.fields)) + + atomic.StoreInt32(&u.initialized, 1) +} + +// helper for sorting fields by tag +type byTag []*marshalFieldInfo + +func (a byTag) Len() int { return len(a) } +func (a byTag) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a byTag) Less(i, j int) bool { return a[i].wiretag < a[j].wiretag } + +// getExtElemInfo returns the information to marshal an extension element. +// The info it returns is initialized. +func (u *marshalInfo) getExtElemInfo(desc *ExtensionDesc) *marshalElemInfo { + // get from cache first + u.RLock() + e, ok := u.extElems[desc.Field] + u.RUnlock() + if ok { + return e + } + + t := reflect.TypeOf(desc.ExtensionType) // pointer or slice to basic type or struct + tags := strings.Split(desc.Tag, ",") + tag, err := strconv.Atoi(tags[1]) + if err != nil { + panic("tag is not an integer") + } + wt := wiretype(tags[0]) + sizer, marshaler := typeMarshaler(t, tags, false, false) + e = &marshalElemInfo{ + wiretag: uint64(tag)<<3 | wt, + tagsize: SizeVarint(uint64(tag) << 3), + sizer: sizer, + marshaler: marshaler, + isptr: t.Kind() == reflect.Ptr, + } + + // update cache + u.Lock() + if u.extElems == nil { + u.extElems = make(map[int32]*marshalElemInfo) + } + u.extElems[desc.Field] = e + u.Unlock() + return e +} + +// computeMarshalFieldInfo fills up the information to marshal a field. +func (fi *marshalFieldInfo) computeMarshalFieldInfo(f *reflect.StructField) { + // parse protobuf tag of the field. + // tag has format of "bytes,49,opt,name=foo,def=hello!" + tags := strings.Split(f.Tag.Get("protobuf"), ",") + if tags[0] == "" { + return + } + tag, err := strconv.Atoi(tags[1]) + if err != nil { + panic("tag is not an integer") + } + wt := wiretype(tags[0]) + if tags[2] == "req" { + fi.required = true + } + fi.setTag(f, tag, wt) + fi.setMarshaler(f, tags) +} + +func (fi *marshalFieldInfo) computeOneofFieldInfo(f *reflect.StructField, oneofImplementers []interface{}) { + fi.field = toField(f) + fi.wiretag = 1<<31 - 1 // Use a large tag number, make oneofs sorted at the end. This tag will not appear on the wire. + fi.isPointer = true + fi.sizer, fi.marshaler = makeOneOfMarshaler(fi, f) + fi.oneofElems = make(map[reflect.Type]*marshalElemInfo) + + ityp := f.Type // interface type + for _, o := range oneofImplementers { + t := reflect.TypeOf(o) + if !t.Implements(ityp) { + continue + } + sf := t.Elem().Field(0) // oneof implementer is a struct with a single field + tags := strings.Split(sf.Tag.Get("protobuf"), ",") + tag, err := strconv.Atoi(tags[1]) + if err != nil { + panic("tag is not an integer") + } + wt := wiretype(tags[0]) + sizer, marshaler := typeMarshaler(sf.Type, tags, false, true) // oneof should not omit any zero value + fi.oneofElems[t.Elem()] = &marshalElemInfo{ + wiretag: uint64(tag)<<3 | wt, + tagsize: SizeVarint(uint64(tag) << 3), + sizer: sizer, + marshaler: marshaler, + } + } +} + +type oneofMessage interface { + XXX_OneofFuncs() (func(Message, *Buffer) error, func(Message, int, int, *Buffer) (bool, error), func(Message) int, []interface{}) +} + +// wiretype returns the wire encoding of the type. +func wiretype(encoding string) uint64 { + switch encoding { + case "fixed32": + return WireFixed32 + case "fixed64": + return WireFixed64 + case "varint", "zigzag32", "zigzag64": + return WireVarint + case "bytes": + return WireBytes + case "group": + return WireStartGroup + } + panic("unknown wire type " + encoding) +} + +// setTag fills up the tag (in wire format) and its size in the info of a field. +func (fi *marshalFieldInfo) setTag(f *reflect.StructField, tag int, wt uint64) { + fi.field = toField(f) + fi.wiretag = uint64(tag)<<3 | wt + fi.tagsize = SizeVarint(uint64(tag) << 3) +} + +// setMarshaler fills up the sizer and marshaler in the info of a field. +func (fi *marshalFieldInfo) setMarshaler(f *reflect.StructField, tags []string) { + switch f.Type.Kind() { + case reflect.Map: + // map field + fi.isPointer = true + fi.sizer, fi.marshaler = makeMapMarshaler(f) + return + case reflect.Ptr, reflect.Slice: + fi.isPointer = true + } + fi.sizer, fi.marshaler = typeMarshaler(f.Type, tags, true, false) +} + +// typeMarshaler returns the sizer and marshaler of a given field. +// t is the type of the field. +// tags is the generated "protobuf" tag of the field. +// If nozero is true, zero value is not marshaled to the wire. +// If oneof is true, it is a oneof field. +func typeMarshaler(t reflect.Type, tags []string, nozero, oneof bool) (sizer, marshaler) { + encoding := tags[0] + + pointer := false + slice := false + if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 { + slice = true + t = t.Elem() + } + if t.Kind() == reflect.Ptr { + pointer = true + t = t.Elem() + } + + packed := false + proto3 := false + for i := 2; i < len(tags); i++ { + if tags[i] == "packed" { + packed = true + } + if tags[i] == "proto3" { + proto3 = true + } + } + + switch t.Kind() { + case reflect.Bool: + if pointer { + return sizeBoolPtr, appendBoolPtr + } + if slice { + if packed { + return sizeBoolPackedSlice, appendBoolPackedSlice + } + return sizeBoolSlice, appendBoolSlice + } + if nozero { + return sizeBoolValueNoZero, appendBoolValueNoZero + } + return sizeBoolValue, appendBoolValue + case reflect.Uint32: + switch encoding { + case "fixed32": + if pointer { + return sizeFixed32Ptr, appendFixed32Ptr + } + if slice { + if packed { + return sizeFixed32PackedSlice, appendFixed32PackedSlice + } + return sizeFixed32Slice, appendFixed32Slice + } + if nozero { + return sizeFixed32ValueNoZero, appendFixed32ValueNoZero + } + return sizeFixed32Value, appendFixed32Value + case "varint": + if pointer { + return sizeVarint32Ptr, appendVarint32Ptr + } + if slice { + if packed { + return sizeVarint32PackedSlice, appendVarint32PackedSlice + } + return sizeVarint32Slice, appendVarint32Slice + } + if nozero { + return sizeVarint32ValueNoZero, appendVarint32ValueNoZero + } + return sizeVarint32Value, appendVarint32Value + } + case reflect.Int32: + switch encoding { + case "fixed32": + if pointer { + return sizeFixedS32Ptr, appendFixedS32Ptr + } + if slice { + if packed { + return sizeFixedS32PackedSlice, appendFixedS32PackedSlice + } + return sizeFixedS32Slice, appendFixedS32Slice + } + if nozero { + return sizeFixedS32ValueNoZero, appendFixedS32ValueNoZero + } + return sizeFixedS32Value, appendFixedS32Value + case "varint": + if pointer { + return sizeVarintS32Ptr, appendVarintS32Ptr + } + if slice { + if packed { + return sizeVarintS32PackedSlice, appendVarintS32PackedSlice + } + return sizeVarintS32Slice, appendVarintS32Slice + } + if nozero { + return sizeVarintS32ValueNoZero, appendVarintS32ValueNoZero + } + return sizeVarintS32Value, appendVarintS32Value + case "zigzag32": + if pointer { + return sizeZigzag32Ptr, appendZigzag32Ptr + } + if slice { + if packed { + return sizeZigzag32PackedSlice, appendZigzag32PackedSlice + } + return sizeZigzag32Slice, appendZigzag32Slice + } + if nozero { + return sizeZigzag32ValueNoZero, appendZigzag32ValueNoZero + } + return sizeZigzag32Value, appendZigzag32Value + } + case reflect.Uint64: + switch encoding { + case "fixed64": + if pointer { + return sizeFixed64Ptr, appendFixed64Ptr + } + if slice { + if packed { + return sizeFixed64PackedSlice, appendFixed64PackedSlice + } + return sizeFixed64Slice, appendFixed64Slice + } + if nozero { + return sizeFixed64ValueNoZero, appendFixed64ValueNoZero + } + return sizeFixed64Value, appendFixed64Value + case "varint": + if pointer { + return sizeVarint64Ptr, appendVarint64Ptr + } + if slice { + if packed { + return sizeVarint64PackedSlice, appendVarint64PackedSlice + } + return sizeVarint64Slice, appendVarint64Slice + } + if nozero { + return sizeVarint64ValueNoZero, appendVarint64ValueNoZero + } + return sizeVarint64Value, appendVarint64Value + } + case reflect.Int64: + switch encoding { + case "fixed64": + if pointer { + return sizeFixedS64Ptr, appendFixedS64Ptr + } + if slice { + if packed { + return sizeFixedS64PackedSlice, appendFixedS64PackedSlice + } + return sizeFixedS64Slice, appendFixedS64Slice + } + if nozero { + return sizeFixedS64ValueNoZero, appendFixedS64ValueNoZero + } + return sizeFixedS64Value, appendFixedS64Value + case "varint": + if pointer { + return sizeVarintS64Ptr, appendVarintS64Ptr + } + if slice { + if packed { + return sizeVarintS64PackedSlice, appendVarintS64PackedSlice + } + return sizeVarintS64Slice, appendVarintS64Slice + } + if nozero { + return sizeVarintS64ValueNoZero, appendVarintS64ValueNoZero + } + return sizeVarintS64Value, appendVarintS64Value + case "zigzag64": + if pointer { + return sizeZigzag64Ptr, appendZigzag64Ptr + } + if slice { + if packed { + return sizeZigzag64PackedSlice, appendZigzag64PackedSlice + } + return sizeZigzag64Slice, appendZigzag64Slice + } + if nozero { + return sizeZigzag64ValueNoZero, appendZigzag64ValueNoZero + } + return sizeZigzag64Value, appendZigzag64Value + } + case reflect.Float32: + if pointer { + return sizeFloat32Ptr, appendFloat32Ptr + } + if slice { + if packed { + return sizeFloat32PackedSlice, appendFloat32PackedSlice + } + return sizeFloat32Slice, appendFloat32Slice + } + if nozero { + return sizeFloat32ValueNoZero, appendFloat32ValueNoZero + } + return sizeFloat32Value, appendFloat32Value + case reflect.Float64: + if pointer { + return sizeFloat64Ptr, appendFloat64Ptr + } + if slice { + if packed { + return sizeFloat64PackedSlice, appendFloat64PackedSlice + } + return sizeFloat64Slice, appendFloat64Slice + } + if nozero { + return sizeFloat64ValueNoZero, appendFloat64ValueNoZero + } + return sizeFloat64Value, appendFloat64Value + case reflect.String: + if pointer { + return sizeStringPtr, appendStringPtr + } + if slice { + return sizeStringSlice, appendStringSlice + } + if nozero { + return sizeStringValueNoZero, appendStringValueNoZero + } + return sizeStringValue, appendStringValue + case reflect.Slice: + if slice { + return sizeBytesSlice, appendBytesSlice + } + if oneof { + // Oneof bytes field may also have "proto3" tag. + // We want to marshal it as a oneof field. Do this + // check before the proto3 check. + return sizeBytesOneof, appendBytesOneof + } + if proto3 { + return sizeBytes3, appendBytes3 + } + return sizeBytes, appendBytes + case reflect.Struct: + switch encoding { + case "group": + if slice { + return makeGroupSliceMarshaler(getMarshalInfo(t)) + } + return makeGroupMarshaler(getMarshalInfo(t)) + case "bytes": + if slice { + return makeMessageSliceMarshaler(getMarshalInfo(t)) + } + return makeMessageMarshaler(getMarshalInfo(t)) + } + } + panic(fmt.Sprintf("unknown or mismatched type: type: %v, wire type: %v", t, encoding)) +} + +// Below are functions to size/marshal a specific type of a field. +// They are stored in the field's info, and called by function pointers. +// They have type sizer or marshaler. + +func sizeFixed32Value(_ pointer, tagsize int) int { + return 4 + tagsize +} +func sizeFixed32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toUint32() + if v == 0 { + return 0 + } + return 4 + tagsize +} +func sizeFixed32Ptr(ptr pointer, tagsize int) int { + p := *ptr.toUint32Ptr() + if p == nil { + return 0 + } + return 4 + tagsize +} +func sizeFixed32Slice(ptr pointer, tagsize int) int { + s := *ptr.toUint32Slice() + return (4 + tagsize) * len(s) +} +func sizeFixed32PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toUint32Slice() + if len(s) == 0 { + return 0 + } + return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize +} +func sizeFixedS32Value(_ pointer, tagsize int) int { + return 4 + tagsize +} +func sizeFixedS32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + if v == 0 { + return 0 + } + return 4 + tagsize +} +func sizeFixedS32Ptr(ptr pointer, tagsize int) int { + p := ptr.getInt32Ptr() + if p == nil { + return 0 + } + return 4 + tagsize +} +func sizeFixedS32Slice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + return (4 + tagsize) * len(s) +} +func sizeFixedS32PackedSlice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + if len(s) == 0 { + return 0 + } + return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize +} +func sizeFloat32Value(_ pointer, tagsize int) int { + return 4 + tagsize +} +func sizeFloat32ValueNoZero(ptr pointer, tagsize int) int { + v := math.Float32bits(*ptr.toFloat32()) + if v == 0 { + return 0 + } + return 4 + tagsize +} +func sizeFloat32Ptr(ptr pointer, tagsize int) int { + p := *ptr.toFloat32Ptr() + if p == nil { + return 0 + } + return 4 + tagsize +} +func sizeFloat32Slice(ptr pointer, tagsize int) int { + s := *ptr.toFloat32Slice() + return (4 + tagsize) * len(s) +} +func sizeFloat32PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toFloat32Slice() + if len(s) == 0 { + return 0 + } + return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize +} +func sizeFixed64Value(_ pointer, tagsize int) int { + return 8 + tagsize +} +func sizeFixed64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toUint64() + if v == 0 { + return 0 + } + return 8 + tagsize +} +func sizeFixed64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toUint64Ptr() + if p == nil { + return 0 + } + return 8 + tagsize +} +func sizeFixed64Slice(ptr pointer, tagsize int) int { + s := *ptr.toUint64Slice() + return (8 + tagsize) * len(s) +} +func sizeFixed64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toUint64Slice() + if len(s) == 0 { + return 0 + } + return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize +} +func sizeFixedS64Value(_ pointer, tagsize int) int { + return 8 + tagsize +} +func sizeFixedS64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + if v == 0 { + return 0 + } + return 8 + tagsize +} +func sizeFixedS64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toInt64Ptr() + if p == nil { + return 0 + } + return 8 + tagsize +} +func sizeFixedS64Slice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + return (8 + tagsize) * len(s) +} +func sizeFixedS64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return 0 + } + return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize +} +func sizeFloat64Value(_ pointer, tagsize int) int { + return 8 + tagsize +} +func sizeFloat64ValueNoZero(ptr pointer, tagsize int) int { + v := math.Float64bits(*ptr.toFloat64()) + if v == 0 { + return 0 + } + return 8 + tagsize +} +func sizeFloat64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toFloat64Ptr() + if p == nil { + return 0 + } + return 8 + tagsize +} +func sizeFloat64Slice(ptr pointer, tagsize int) int { + s := *ptr.toFloat64Slice() + return (8 + tagsize) * len(s) +} +func sizeFloat64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toFloat64Slice() + if len(s) == 0 { + return 0 + } + return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize +} +func sizeVarint32Value(ptr pointer, tagsize int) int { + v := *ptr.toUint32() + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarint32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toUint32() + if v == 0 { + return 0 + } + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarint32Ptr(ptr pointer, tagsize int) int { + p := *ptr.toUint32Ptr() + if p == nil { + return 0 + } + return SizeVarint(uint64(*p)) + tagsize +} +func sizeVarint32Slice(ptr pointer, tagsize int) int { + s := *ptr.toUint32Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + tagsize + } + return n +} +func sizeVarint32PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toUint32Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeVarintS32Value(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarintS32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + if v == 0 { + return 0 + } + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarintS32Ptr(ptr pointer, tagsize int) int { + p := ptr.getInt32Ptr() + if p == nil { + return 0 + } + return SizeVarint(uint64(*p)) + tagsize +} +func sizeVarintS32Slice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + tagsize + } + return n +} +func sizeVarintS32PackedSlice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeVarint64Value(ptr pointer, tagsize int) int { + v := *ptr.toUint64() + return SizeVarint(v) + tagsize +} +func sizeVarint64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toUint64() + if v == 0 { + return 0 + } + return SizeVarint(v) + tagsize +} +func sizeVarint64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toUint64Ptr() + if p == nil { + return 0 + } + return SizeVarint(*p) + tagsize +} +func sizeVarint64Slice(ptr pointer, tagsize int) int { + s := *ptr.toUint64Slice() + n := 0 + for _, v := range s { + n += SizeVarint(v) + tagsize + } + return n +} +func sizeVarint64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toUint64Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(v) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeVarintS64Value(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarintS64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + if v == 0 { + return 0 + } + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarintS64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toInt64Ptr() + if p == nil { + return 0 + } + return SizeVarint(uint64(*p)) + tagsize +} +func sizeVarintS64Slice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + tagsize + } + return n +} +func sizeVarintS64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeZigzag32Value(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize +} +func sizeZigzag32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + if v == 0 { + return 0 + } + return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize +} +func sizeZigzag32Ptr(ptr pointer, tagsize int) int { + p := ptr.getInt32Ptr() + if p == nil { + return 0 + } + v := *p + return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize +} +func sizeZigzag32Slice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize + } + return n +} +func sizeZigzag32PackedSlice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64((uint32(v) << 1) ^ uint32((int32(v) >> 31)))) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeZigzag64Value(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize +} +func sizeZigzag64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + if v == 0 { + return 0 + } + return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize +} +func sizeZigzag64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toInt64Ptr() + if p == nil { + return 0 + } + v := *p + return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize +} +func sizeZigzag64Slice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize + } + return n +} +func sizeZigzag64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v<<1) ^ uint64((int64(v) >> 63))) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeBoolValue(_ pointer, tagsize int) int { + return 1 + tagsize +} +func sizeBoolValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toBool() + if !v { + return 0 + } + return 1 + tagsize +} +func sizeBoolPtr(ptr pointer, tagsize int) int { + p := *ptr.toBoolPtr() + if p == nil { + return 0 + } + return 1 + tagsize +} +func sizeBoolSlice(ptr pointer, tagsize int) int { + s := *ptr.toBoolSlice() + return (1 + tagsize) * len(s) +} +func sizeBoolPackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toBoolSlice() + if len(s) == 0 { + return 0 + } + return len(s) + SizeVarint(uint64(len(s))) + tagsize +} +func sizeStringValue(ptr pointer, tagsize int) int { + v := *ptr.toString() + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeStringValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toString() + if v == "" { + return 0 + } + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeStringPtr(ptr pointer, tagsize int) int { + p := *ptr.toStringPtr() + if p == nil { + return 0 + } + v := *p + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeStringSlice(ptr pointer, tagsize int) int { + s := *ptr.toStringSlice() + n := 0 + for _, v := range s { + n += len(v) + SizeVarint(uint64(len(v))) + tagsize + } + return n +} +func sizeBytes(ptr pointer, tagsize int) int { + v := *ptr.toBytes() + if v == nil { + return 0 + } + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeBytes3(ptr pointer, tagsize int) int { + v := *ptr.toBytes() + if len(v) == 0 { + return 0 + } + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeBytesOneof(ptr pointer, tagsize int) int { + v := *ptr.toBytes() + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeBytesSlice(ptr pointer, tagsize int) int { + s := *ptr.toBytesSlice() + n := 0 + for _, v := range s { + n += len(v) + SizeVarint(uint64(len(v))) + tagsize + } + return n +} + +// appendFixed32 appends an encoded fixed32 to b. +func appendFixed32(b []byte, v uint32) []byte { + b = append(b, + byte(v), + byte(v>>8), + byte(v>>16), + byte(v>>24)) + return b +} + +// appendFixed64 appends an encoded fixed64 to b. +func appendFixed64(b []byte, v uint64) []byte { + b = append(b, + byte(v), + byte(v>>8), + byte(v>>16), + byte(v>>24), + byte(v>>32), + byte(v>>40), + byte(v>>48), + byte(v>>56)) + return b +} + +// appendVarint appends an encoded varint to b. +func appendVarint(b []byte, v uint64) []byte { + // TODO: make 1-byte (maybe 2-byte) case inline-able, once we + // have non-leaf inliner. + switch { + case v < 1<<7: + b = append(b, byte(v)) + case v < 1<<14: + b = append(b, + byte(v&0x7f|0x80), + byte(v>>7)) + case v < 1<<21: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte(v>>14)) + case v < 1<<28: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte(v>>21)) + case v < 1<<35: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte(v>>28)) + case v < 1<<42: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte(v>>35)) + case v < 1<<49: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte((v>>35)&0x7f|0x80), + byte(v>>42)) + case v < 1<<56: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte((v>>35)&0x7f|0x80), + byte((v>>42)&0x7f|0x80), + byte(v>>49)) + case v < 1<<63: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte((v>>35)&0x7f|0x80), + byte((v>>42)&0x7f|0x80), + byte((v>>49)&0x7f|0x80), + byte(v>>56)) + default: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte((v>>35)&0x7f|0x80), + byte((v>>42)&0x7f|0x80), + byte((v>>49)&0x7f|0x80), + byte((v>>56)&0x7f|0x80), + 1) + } + return b +} + +func appendFixed32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint32() + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + return b, nil +} +func appendFixed32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + return b, nil +} +func appendFixed32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toUint32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, *p) + return b, nil +} +func appendFixed32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + } + return b, nil +} +func appendFixed32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(4*len(s))) + for _, v := range s { + b = appendFixed32(b, v) + } + return b, nil +} +func appendFixedS32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + b = appendVarint(b, wiretag) + b = appendFixed32(b, uint32(v)) + return b, nil +} +func appendFixedS32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, uint32(v)) + return b, nil +} +func appendFixedS32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := ptr.getInt32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, uint32(*p)) + return b, nil +} +func appendFixedS32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed32(b, uint32(v)) + } + return b, nil +} +func appendFixedS32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(4*len(s))) + for _, v := range s { + b = appendFixed32(b, uint32(v)) + } + return b, nil +} +func appendFloat32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := math.Float32bits(*ptr.toFloat32()) + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + return b, nil +} +func appendFloat32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := math.Float32bits(*ptr.toFloat32()) + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + return b, nil +} +func appendFloat32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toFloat32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, math.Float32bits(*p)) + return b, nil +} +func appendFloat32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toFloat32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed32(b, math.Float32bits(v)) + } + return b, nil +} +func appendFloat32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toFloat32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(4*len(s))) + for _, v := range s { + b = appendFixed32(b, math.Float32bits(v)) + } + return b, nil +} +func appendFixed64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint64() + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + return b, nil +} +func appendFixed64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + return b, nil +} +func appendFixed64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toUint64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, *p) + return b, nil +} +func appendFixed64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + } + return b, nil +} +func appendFixed64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(8*len(s))) + for _, v := range s { + b = appendFixed64(b, v) + } + return b, nil +} +func appendFixedS64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + b = appendVarint(b, wiretag) + b = appendFixed64(b, uint64(v)) + return b, nil +} +func appendFixedS64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, uint64(v)) + return b, nil +} +func appendFixedS64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toInt64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, uint64(*p)) + return b, nil +} +func appendFixedS64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed64(b, uint64(v)) + } + return b, nil +} +func appendFixedS64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(8*len(s))) + for _, v := range s { + b = appendFixed64(b, uint64(v)) + } + return b, nil +} +func appendFloat64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := math.Float64bits(*ptr.toFloat64()) + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + return b, nil +} +func appendFloat64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := math.Float64bits(*ptr.toFloat64()) + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + return b, nil +} +func appendFloat64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toFloat64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, math.Float64bits(*p)) + return b, nil +} +func appendFloat64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toFloat64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed64(b, math.Float64bits(v)) + } + return b, nil +} +func appendFloat64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toFloat64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(8*len(s))) + for _, v := range s { + b = appendFixed64(b, math.Float64bits(v)) + } + return b, nil +} +func appendVarint32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint32() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarint32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarint32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toUint32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(*p)) + return b, nil +} +func appendVarint32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarint32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarintS32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarintS32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarintS32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := ptr.getInt32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(*p)) + return b, nil +} +func appendVarintS32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarintS32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarint64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint64() + b = appendVarint(b, wiretag) + b = appendVarint(b, v) + return b, nil +} +func appendVarint64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, v) + return b, nil +} +func appendVarint64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toUint64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, *p) + return b, nil +} +func appendVarint64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, v) + } + return b, nil +} +func appendVarint64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(v) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, v) + } + return b, nil +} +func appendVarintS64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarintS64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarintS64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toInt64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(*p)) + return b, nil +} +func appendVarintS64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarintS64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendZigzag32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + return b, nil +} +func appendZigzag32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + return b, nil +} +func appendZigzag32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := ptr.getInt32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + v := *p + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + return b, nil +} +func appendZigzag32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + } + return b, nil +} +func appendZigzag32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64((uint32(v) << 1) ^ uint32((int32(v) >> 31)))) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + } + return b, nil +} +func appendZigzag64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + return b, nil +} +func appendZigzag64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + return b, nil +} +func appendZigzag64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toInt64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + v := *p + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + return b, nil +} +func appendZigzag64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + } + return b, nil +} +func appendZigzag64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v<<1) ^ uint64((int64(v) >> 63))) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + } + return b, nil +} +func appendBoolValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBool() + b = appendVarint(b, wiretag) + if v { + b = append(b, 1) + } else { + b = append(b, 0) + } + return b, nil +} +func appendBoolValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBool() + if !v { + return b, nil + } + b = appendVarint(b, wiretag) + b = append(b, 1) + return b, nil +} + +func appendBoolPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toBoolPtr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + if *p { + b = append(b, 1) + } else { + b = append(b, 0) + } + return b, nil +} +func appendBoolSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toBoolSlice() + for _, v := range s { + b = appendVarint(b, wiretag) + if v { + b = append(b, 1) + } else { + b = append(b, 0) + } + } + return b, nil +} +func appendBoolPackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toBoolSlice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(len(s))) + for _, v := range s { + if v { + b = append(b, 1) + } else { + b = append(b, 0) + } + } + return b, nil +} +func appendStringValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toString() + if !utf8.ValidString(v) { + return nil, errInvalidUTF8 + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendStringValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toString() + if v == "" { + return b, nil + } + if !utf8.ValidString(v) { + return nil, errInvalidUTF8 + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendStringPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toStringPtr() + if p == nil { + return b, nil + } + v := *p + if !utf8.ValidString(v) { + return nil, errInvalidUTF8 + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendStringSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toStringSlice() + for _, v := range s { + if !utf8.ValidString(v) { + return nil, errInvalidUTF8 + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + } + return b, nil +} +func appendBytes(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBytes() + if v == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendBytes3(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBytes() + if len(v) == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendBytesOneof(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBytes() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendBytesSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toBytesSlice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + } + return b, nil +} + +// makeGroupMarshaler returns the sizer and marshaler for a group. +// u is the marshal info of the underlying message. +func makeGroupMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + p := ptr.getPointer() + if p.isNil() { + return 0 + } + return u.size(p) + 2*tagsize + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + p := ptr.getPointer() + if p.isNil() { + return b, nil + } + var err error + b = appendVarint(b, wiretag) // start group + b, err = u.marshal(b, p, deterministic) + b = appendVarint(b, wiretag+(WireEndGroup-WireStartGroup)) // end group + return b, err + } +} + +// makeGroupSliceMarshaler returns the sizer and marshaler for a group slice. +// u is the marshal info of the underlying message. +func makeGroupSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getPointerSlice() + n := 0 + for _, v := range s { + if v.isNil() { + continue + } + n += u.size(v) + 2*tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getPointerSlice() + var err, errreq error + for _, v := range s { + if v.isNil() { + return b, errRepeatedHasNil + } + b = appendVarint(b, wiretag) // start group + b, err = u.marshal(b, v, deterministic) + b = appendVarint(b, wiretag+(WireEndGroup-WireStartGroup)) // end group + if err != nil { + if _, ok := err.(*RequiredNotSetError); ok { + // Required field in submessage is not set. + // We record the error but keep going, to give a complete marshaling. + if errreq == nil { + errreq = err + } + continue + } + if err == ErrNil { + err = errRepeatedHasNil + } + return b, err + } + } + return b, errreq + } +} + +// makeMessageMarshaler returns the sizer and marshaler for a message field. +// u is the marshal info of the message. +func makeMessageMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + p := ptr.getPointer() + if p.isNil() { + return 0 + } + siz := u.size(p) + return siz + SizeVarint(uint64(siz)) + tagsize + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + p := ptr.getPointer() + if p.isNil() { + return b, nil + } + b = appendVarint(b, wiretag) + siz := u.cachedsize(p) + b = appendVarint(b, uint64(siz)) + return u.marshal(b, p, deterministic) + } +} + +// makeMessageSliceMarshaler returns the sizer and marshaler for a message slice. +// u is the marshal info of the message. +func makeMessageSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getPointerSlice() + n := 0 + for _, v := range s { + if v.isNil() { + continue + } + siz := u.size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getPointerSlice() + var err, errreq error + for _, v := range s { + if v.isNil() { + return b, errRepeatedHasNil + } + b = appendVarint(b, wiretag) + siz := u.cachedsize(v) + b = appendVarint(b, uint64(siz)) + b, err = u.marshal(b, v, deterministic) + + if err != nil { + if _, ok := err.(*RequiredNotSetError); ok { + // Required field in submessage is not set. + // We record the error but keep going, to give a complete marshaling. + if errreq == nil { + errreq = err + } + continue + } + if err == ErrNil { + err = errRepeatedHasNil + } + return b, err + } + } + return b, errreq + } +} + +// makeMapMarshaler returns the sizer and marshaler for a map field. +// f is the pointer to the reflect data structure of the field. +func makeMapMarshaler(f *reflect.StructField) (sizer, marshaler) { + // figure out key and value type + t := f.Type + keyType := t.Key() + valType := t.Elem() + keyTags := strings.Split(f.Tag.Get("protobuf_key"), ",") + valTags := strings.Split(f.Tag.Get("protobuf_val"), ",") + keySizer, keyMarshaler := typeMarshaler(keyType, keyTags, false, false) // don't omit zero value in map + valSizer, valMarshaler := typeMarshaler(valType, valTags, false, false) // don't omit zero value in map + keyWireTag := 1<<3 | wiretype(keyTags[0]) + valWireTag := 2<<3 | wiretype(valTags[0]) + + // We create an interface to get the addresses of the map key and value. + // If value is pointer-typed, the interface is a direct interface, the + // idata itself is the value. Otherwise, the idata is the pointer to the + // value. + // Key cannot be pointer-typed. + valIsPtr := valType.Kind() == reflect.Ptr + return func(ptr pointer, tagsize int) int { + m := ptr.asPointerTo(t).Elem() // the map + n := 0 + for _, k := range m.MapKeys() { + ki := k.Interface() + vi := m.MapIndex(k).Interface() + kaddr := toAddrPointer(&ki, false) // pointer to key + vaddr := toAddrPointer(&vi, valIsPtr) // pointer to value + siz := keySizer(kaddr, 1) + valSizer(vaddr, 1) // tag of key = 1 (size=1), tag of val = 2 (size=1) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, tag uint64, deterministic bool) ([]byte, error) { + m := ptr.asPointerTo(t).Elem() // the map + var err error + keys := m.MapKeys() + if len(keys) > 1 && deterministic { + sort.Sort(mapKeys(keys)) + } + for _, k := range keys { + ki := k.Interface() + vi := m.MapIndex(k).Interface() + kaddr := toAddrPointer(&ki, false) // pointer to key + vaddr := toAddrPointer(&vi, valIsPtr) // pointer to value + b = appendVarint(b, tag) + siz := keySizer(kaddr, 1) + valSizer(vaddr, 1) // tag of key = 1 (size=1), tag of val = 2 (size=1) + b = appendVarint(b, uint64(siz)) + b, err = keyMarshaler(b, kaddr, keyWireTag, deterministic) + if err != nil { + return b, err + } + b, err = valMarshaler(b, vaddr, valWireTag, deterministic) + if err != nil && err != ErrNil { // allow nil value in map + return b, err + } + } + return b, nil + } +} + +// makeOneOfMarshaler returns the sizer and marshaler for a oneof field. +// fi is the marshal info of the field. +// f is the pointer to the reflect data structure of the field. +func makeOneOfMarshaler(fi *marshalFieldInfo, f *reflect.StructField) (sizer, marshaler) { + // Oneof field is an interface. We need to get the actual data type on the fly. + t := f.Type + return func(ptr pointer, _ int) int { + p := ptr.getInterfacePointer() + if p.isNil() { + return 0 + } + v := ptr.asPointerTo(t).Elem().Elem().Elem() // *interface -> interface -> *struct -> struct + telem := v.Type() + e := fi.oneofElems[telem] + return e.sizer(p, e.tagsize) + }, + func(b []byte, ptr pointer, _ uint64, deterministic bool) ([]byte, error) { + p := ptr.getInterfacePointer() + if p.isNil() { + return b, nil + } + v := ptr.asPointerTo(t).Elem().Elem().Elem() // *interface -> interface -> *struct -> struct + telem := v.Type() + if telem.Field(0).Type.Kind() == reflect.Ptr && p.getPointer().isNil() { + return b, errOneofHasNil + } + e := fi.oneofElems[telem] + return e.marshaler(b, p, e.wiretag, deterministic) + } +} + +// sizeExtensions computes the size of encoded data for a XXX_InternalExtensions field. +func (u *marshalInfo) sizeExtensions(ext *XXX_InternalExtensions) int { + m, mu := ext.extensionsRead() + if m == nil { + return 0 + } + mu.Lock() + + n := 0 + for _, e := range m { + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + n += len(e.enc) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + n += ei.sizer(p, ei.tagsize) + } + mu.Unlock() + return n +} + +// appendExtensions marshals a XXX_InternalExtensions field to the end of byte slice b. +func (u *marshalInfo) appendExtensions(b []byte, ext *XXX_InternalExtensions, deterministic bool) ([]byte, error) { + m, mu := ext.extensionsRead() + if m == nil { + return b, nil + } + mu.Lock() + defer mu.Unlock() + + var err error + + // Fast-path for common cases: zero or one extensions. + // Don't bother sorting the keys. + if len(m) <= 1 { + for _, e := range m { + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + b = append(b, e.enc...) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + b, err = ei.marshaler(b, p, ei.wiretag, deterministic) + if err != nil { + return b, err + } + } + return b, nil + } + + // Sort the keys to provide a deterministic encoding. + // Not sure this is required, but the old code does it. + keys := make([]int, 0, len(m)) + for k := range m { + keys = append(keys, int(k)) + } + sort.Ints(keys) + + for _, k := range keys { + e := m[int32(k)] + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + b = append(b, e.enc...) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + b, err = ei.marshaler(b, p, ei.wiretag, deterministic) + if err != nil { + return b, err + } + } + return b, nil +} + +// message set format is: +// message MessageSet { +// repeated group Item = 1 { +// required int32 type_id = 2; +// required string message = 3; +// }; +// } + +// sizeMessageSet computes the size of encoded data for a XXX_InternalExtensions field +// in message set format (above). +func (u *marshalInfo) sizeMessageSet(ext *XXX_InternalExtensions) int { + m, mu := ext.extensionsRead() + if m == nil { + return 0 + } + mu.Lock() + + n := 0 + for id, e := range m { + n += 2 // start group, end group. tag = 1 (size=1) + n += SizeVarint(uint64(id)) + 1 // type_id, tag = 2 (size=1) + + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint + siz := len(msgWithLen) + n += siz + 1 // message, tag = 3 (size=1) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + n += ei.sizer(p, 1) // message, tag = 3 (size=1) + } + mu.Unlock() + return n +} + +// appendMessageSet marshals a XXX_InternalExtensions field in message set format (above) +// to the end of byte slice b. +func (u *marshalInfo) appendMessageSet(b []byte, ext *XXX_InternalExtensions, deterministic bool) ([]byte, error) { + m, mu := ext.extensionsRead() + if m == nil { + return b, nil + } + mu.Lock() + defer mu.Unlock() + + var err error + + // Fast-path for common cases: zero or one extensions. + // Don't bother sorting the keys. + if len(m) <= 1 { + for id, e := range m { + b = append(b, 1<<3|WireStartGroup) + b = append(b, 2<<3|WireVarint) + b = appendVarint(b, uint64(id)) + + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint + b = append(b, 3<<3|WireBytes) + b = append(b, msgWithLen...) + b = append(b, 1<<3|WireEndGroup) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic) + if err != nil { + return b, err + } + b = append(b, 1<<3|WireEndGroup) + } + return b, nil + } + + // Sort the keys to provide a deterministic encoding. + keys := make([]int, 0, len(m)) + for k := range m { + keys = append(keys, int(k)) + } + sort.Ints(keys) + + for _, id := range keys { + e := m[int32(id)] + b = append(b, 1<<3|WireStartGroup) + b = append(b, 2<<3|WireVarint) + b = appendVarint(b, uint64(id)) + + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint + b = append(b, 3<<3|WireBytes) + b = append(b, msgWithLen...) + b = append(b, 1<<3|WireEndGroup) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic) + b = append(b, 1<<3|WireEndGroup) + if err != nil { + return b, err + } + } + return b, nil +} + +// sizeV1Extensions computes the size of encoded data for a V1-API extension field. +func (u *marshalInfo) sizeV1Extensions(m map[int32]Extension) int { + if m == nil { + return 0 + } + + n := 0 + for _, e := range m { + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + n += len(e.enc) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + n += ei.sizer(p, ei.tagsize) + } + return n +} + +// appendV1Extensions marshals a V1-API extension field to the end of byte slice b. +func (u *marshalInfo) appendV1Extensions(b []byte, m map[int32]Extension, deterministic bool) ([]byte, error) { + if m == nil { + return b, nil + } + + // Sort the keys to provide a deterministic encoding. + keys := make([]int, 0, len(m)) + for k := range m { + keys = append(keys, int(k)) + } + sort.Ints(keys) + + var err error + for _, k := range keys { + e := m[int32(k)] + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + b = append(b, e.enc...) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + b, err = ei.marshaler(b, p, ei.wiretag, deterministic) + if err != nil { + return b, err + } + } + return b, nil +} + +// newMarshaler is the interface representing objects that can marshal themselves. +// +// This exists to support protoc-gen-go generated messages. +// The proto package will stop type-asserting to this interface in the future. +// +// DO NOT DEPEND ON THIS. +type newMarshaler interface { + XXX_Size() int + XXX_Marshal(b []byte, deterministic bool) ([]byte, error) +} + +// Size returns the encoded size of a protocol buffer message. +// This is the main entry point. +func Size(pb Message) int { + if m, ok := pb.(newMarshaler); ok { + return m.XXX_Size() + } + if m, ok := pb.(Marshaler); ok { + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + b, _ := m.Marshal() + return len(b) + } + // in case somehow we didn't generate the wrapper + if pb == nil { + return 0 + } + var info InternalMessageInfo + return info.Size(pb) +} + +// Marshal takes a protocol buffer message +// and encodes it into the wire format, returning the data. +// This is the main entry point. +func Marshal(pb Message) ([]byte, error) { + if m, ok := pb.(newMarshaler); ok { + siz := m.XXX_Size() + b := make([]byte, 0, siz) + return m.XXX_Marshal(b, false) + } + if m, ok := pb.(Marshaler); ok { + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + return m.Marshal() + } + // in case somehow we didn't generate the wrapper + if pb == nil { + return nil, ErrNil + } + var info InternalMessageInfo + siz := info.Size(pb) + b := make([]byte, 0, siz) + return info.Marshal(b, pb, false) +} + +// Marshal takes a protocol buffer message +// and encodes it into the wire format, writing the result to the +// Buffer. +// This is an alternative entry point. It is not necessary to use +// a Buffer for most applications. +func (p *Buffer) Marshal(pb Message) error { + var err error + if m, ok := pb.(newMarshaler); ok { + siz := m.XXX_Size() + p.grow(siz) // make sure buf has enough capacity + p.buf, err = m.XXX_Marshal(p.buf, p.deterministic) + return err + } + if m, ok := pb.(Marshaler); ok { + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + b, err := m.Marshal() + p.buf = append(p.buf, b...) + return err + } + // in case somehow we didn't generate the wrapper + if pb == nil { + return ErrNil + } + var info InternalMessageInfo + siz := info.Size(pb) + p.grow(siz) // make sure buf has enough capacity + p.buf, err = info.Marshal(p.buf, pb, p.deterministic) + return err +} + +// grow grows the buffer's capacity, if necessary, to guarantee space for +// another n bytes. After grow(n), at least n bytes can be written to the +// buffer without another allocation. +func (p *Buffer) grow(n int) { + need := len(p.buf) + n + if need <= cap(p.buf) { + return + } + newCap := len(p.buf) * 2 + if newCap < need { + newCap = need + } + p.buf = append(make([]byte, 0, newCap), p.buf...) +} diff --git a/api/vendor/github.com/golang/protobuf/proto/table_merge.go b/api/vendor/github.com/golang/protobuf/proto/table_merge.go new file mode 100644 index 0000000..5525def --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/proto/table_merge.go @@ -0,0 +1,654 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package proto + +import ( + "fmt" + "reflect" + "strings" + "sync" + "sync/atomic" +) + +// Merge merges the src message into dst. +// This assumes that dst and src of the same type and are non-nil. +func (a *InternalMessageInfo) Merge(dst, src Message) { + mi := atomicLoadMergeInfo(&a.merge) + if mi == nil { + mi = getMergeInfo(reflect.TypeOf(dst).Elem()) + atomicStoreMergeInfo(&a.merge, mi) + } + mi.merge(toPointer(&dst), toPointer(&src)) +} + +type mergeInfo struct { + typ reflect.Type + + initialized int32 // 0: only typ is valid, 1: everything is valid + lock sync.Mutex + + fields []mergeFieldInfo + unrecognized field // Offset of XXX_unrecognized +} + +type mergeFieldInfo struct { + field field // Offset of field, guaranteed to be valid + + // isPointer reports whether the value in the field is a pointer. + // This is true for the following situations: + // * Pointer to struct + // * Pointer to basic type (proto2 only) + // * Slice (first value in slice header is a pointer) + // * String (first value in string header is a pointer) + isPointer bool + + // basicWidth reports the width of the field assuming that it is directly + // embedded in the struct (as is the case for basic types in proto3). + // The possible values are: + // 0: invalid + // 1: bool + // 4: int32, uint32, float32 + // 8: int64, uint64, float64 + basicWidth int + + // Where dst and src are pointers to the types being merged. + merge func(dst, src pointer) +} + +var ( + mergeInfoMap = map[reflect.Type]*mergeInfo{} + mergeInfoLock sync.Mutex +) + +func getMergeInfo(t reflect.Type) *mergeInfo { + mergeInfoLock.Lock() + defer mergeInfoLock.Unlock() + mi := mergeInfoMap[t] + if mi == nil { + mi = &mergeInfo{typ: t} + mergeInfoMap[t] = mi + } + return mi +} + +// merge merges src into dst assuming they are both of type *mi.typ. +func (mi *mergeInfo) merge(dst, src pointer) { + if dst.isNil() { + panic("proto: nil destination") + } + if src.isNil() { + return // Nothing to do. + } + + if atomic.LoadInt32(&mi.initialized) == 0 { + mi.computeMergeInfo() + } + + for _, fi := range mi.fields { + sfp := src.offset(fi.field) + + // As an optimization, we can avoid the merge function call cost + // if we know for sure that the source will have no effect + // by checking if it is the zero value. + if unsafeAllowed { + if fi.isPointer && sfp.getPointer().isNil() { // Could be slice or string + continue + } + if fi.basicWidth > 0 { + switch { + case fi.basicWidth == 1 && !*sfp.toBool(): + continue + case fi.basicWidth == 4 && *sfp.toUint32() == 0: + continue + case fi.basicWidth == 8 && *sfp.toUint64() == 0: + continue + } + } + } + + dfp := dst.offset(fi.field) + fi.merge(dfp, sfp) + } + + // TODO: Make this faster? + out := dst.asPointerTo(mi.typ).Elem() + in := src.asPointerTo(mi.typ).Elem() + if emIn, err := extendable(in.Addr().Interface()); err == nil { + emOut, _ := extendable(out.Addr().Interface()) + mIn, muIn := emIn.extensionsRead() + if mIn != nil { + mOut := emOut.extensionsWrite() + muIn.Lock() + mergeExtension(mOut, mIn) + muIn.Unlock() + } + } + + if mi.unrecognized.IsValid() { + if b := *src.offset(mi.unrecognized).toBytes(); len(b) > 0 { + *dst.offset(mi.unrecognized).toBytes() = append([]byte(nil), b...) + } + } +} + +func (mi *mergeInfo) computeMergeInfo() { + mi.lock.Lock() + defer mi.lock.Unlock() + if mi.initialized != 0 { + return + } + t := mi.typ + n := t.NumField() + + props := GetProperties(t) + for i := 0; i < n; i++ { + f := t.Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + + mfi := mergeFieldInfo{field: toField(&f)} + tf := f.Type + + // As an optimization, we can avoid the merge function call cost + // if we know for sure that the source will have no effect + // by checking if it is the zero value. + if unsafeAllowed { + switch tf.Kind() { + case reflect.Ptr, reflect.Slice, reflect.String: + // As a special case, we assume slices and strings are pointers + // since we know that the first field in the SliceSlice or + // StringHeader is a data pointer. + mfi.isPointer = true + case reflect.Bool: + mfi.basicWidth = 1 + case reflect.Int32, reflect.Uint32, reflect.Float32: + mfi.basicWidth = 4 + case reflect.Int64, reflect.Uint64, reflect.Float64: + mfi.basicWidth = 8 + } + } + + // Unwrap tf to get at its most basic type. + var isPointer, isSlice bool + if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { + isSlice = true + tf = tf.Elem() + } + if tf.Kind() == reflect.Ptr { + isPointer = true + tf = tf.Elem() + } + if isPointer && isSlice && tf.Kind() != reflect.Struct { + panic("both pointer and slice for basic type in " + tf.Name()) + } + + switch tf.Kind() { + case reflect.Int32: + switch { + case isSlice: // E.g., []int32 + mfi.merge = func(dst, src pointer) { + // NOTE: toInt32Slice is not defined (see pointer_reflect.go). + /* + sfsp := src.toInt32Slice() + if *sfsp != nil { + dfsp := dst.toInt32Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []int64{} + } + } + */ + sfs := src.getInt32Slice() + if sfs != nil { + dfs := dst.getInt32Slice() + dfs = append(dfs, sfs...) + if dfs == nil { + dfs = []int32{} + } + dst.setInt32Slice(dfs) + } + } + case isPointer: // E.g., *int32 + mfi.merge = func(dst, src pointer) { + // NOTE: toInt32Ptr is not defined (see pointer_reflect.go). + /* + sfpp := src.toInt32Ptr() + if *sfpp != nil { + dfpp := dst.toInt32Ptr() + if *dfpp == nil { + *dfpp = Int32(**sfpp) + } else { + **dfpp = **sfpp + } + } + */ + sfp := src.getInt32Ptr() + if sfp != nil { + dfp := dst.getInt32Ptr() + if dfp == nil { + dst.setInt32Ptr(*sfp) + } else { + *dfp = *sfp + } + } + } + default: // E.g., int32 + mfi.merge = func(dst, src pointer) { + if v := *src.toInt32(); v != 0 { + *dst.toInt32() = v + } + } + } + case reflect.Int64: + switch { + case isSlice: // E.g., []int64 + mfi.merge = func(dst, src pointer) { + sfsp := src.toInt64Slice() + if *sfsp != nil { + dfsp := dst.toInt64Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []int64{} + } + } + } + case isPointer: // E.g., *int64 + mfi.merge = func(dst, src pointer) { + sfpp := src.toInt64Ptr() + if *sfpp != nil { + dfpp := dst.toInt64Ptr() + if *dfpp == nil { + *dfpp = Int64(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., int64 + mfi.merge = func(dst, src pointer) { + if v := *src.toInt64(); v != 0 { + *dst.toInt64() = v + } + } + } + case reflect.Uint32: + switch { + case isSlice: // E.g., []uint32 + mfi.merge = func(dst, src pointer) { + sfsp := src.toUint32Slice() + if *sfsp != nil { + dfsp := dst.toUint32Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []uint32{} + } + } + } + case isPointer: // E.g., *uint32 + mfi.merge = func(dst, src pointer) { + sfpp := src.toUint32Ptr() + if *sfpp != nil { + dfpp := dst.toUint32Ptr() + if *dfpp == nil { + *dfpp = Uint32(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., uint32 + mfi.merge = func(dst, src pointer) { + if v := *src.toUint32(); v != 0 { + *dst.toUint32() = v + } + } + } + case reflect.Uint64: + switch { + case isSlice: // E.g., []uint64 + mfi.merge = func(dst, src pointer) { + sfsp := src.toUint64Slice() + if *sfsp != nil { + dfsp := dst.toUint64Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []uint64{} + } + } + } + case isPointer: // E.g., *uint64 + mfi.merge = func(dst, src pointer) { + sfpp := src.toUint64Ptr() + if *sfpp != nil { + dfpp := dst.toUint64Ptr() + if *dfpp == nil { + *dfpp = Uint64(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., uint64 + mfi.merge = func(dst, src pointer) { + if v := *src.toUint64(); v != 0 { + *dst.toUint64() = v + } + } + } + case reflect.Float32: + switch { + case isSlice: // E.g., []float32 + mfi.merge = func(dst, src pointer) { + sfsp := src.toFloat32Slice() + if *sfsp != nil { + dfsp := dst.toFloat32Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []float32{} + } + } + } + case isPointer: // E.g., *float32 + mfi.merge = func(dst, src pointer) { + sfpp := src.toFloat32Ptr() + if *sfpp != nil { + dfpp := dst.toFloat32Ptr() + if *dfpp == nil { + *dfpp = Float32(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., float32 + mfi.merge = func(dst, src pointer) { + if v := *src.toFloat32(); v != 0 { + *dst.toFloat32() = v + } + } + } + case reflect.Float64: + switch { + case isSlice: // E.g., []float64 + mfi.merge = func(dst, src pointer) { + sfsp := src.toFloat64Slice() + if *sfsp != nil { + dfsp := dst.toFloat64Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []float64{} + } + } + } + case isPointer: // E.g., *float64 + mfi.merge = func(dst, src pointer) { + sfpp := src.toFloat64Ptr() + if *sfpp != nil { + dfpp := dst.toFloat64Ptr() + if *dfpp == nil { + *dfpp = Float64(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., float64 + mfi.merge = func(dst, src pointer) { + if v := *src.toFloat64(); v != 0 { + *dst.toFloat64() = v + } + } + } + case reflect.Bool: + switch { + case isSlice: // E.g., []bool + mfi.merge = func(dst, src pointer) { + sfsp := src.toBoolSlice() + if *sfsp != nil { + dfsp := dst.toBoolSlice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []bool{} + } + } + } + case isPointer: // E.g., *bool + mfi.merge = func(dst, src pointer) { + sfpp := src.toBoolPtr() + if *sfpp != nil { + dfpp := dst.toBoolPtr() + if *dfpp == nil { + *dfpp = Bool(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., bool + mfi.merge = func(dst, src pointer) { + if v := *src.toBool(); v { + *dst.toBool() = v + } + } + } + case reflect.String: + switch { + case isSlice: // E.g., []string + mfi.merge = func(dst, src pointer) { + sfsp := src.toStringSlice() + if *sfsp != nil { + dfsp := dst.toStringSlice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []string{} + } + } + } + case isPointer: // E.g., *string + mfi.merge = func(dst, src pointer) { + sfpp := src.toStringPtr() + if *sfpp != nil { + dfpp := dst.toStringPtr() + if *dfpp == nil { + *dfpp = String(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., string + mfi.merge = func(dst, src pointer) { + if v := *src.toString(); v != "" { + *dst.toString() = v + } + } + } + case reflect.Slice: + isProto3 := props.Prop[i].proto3 + switch { + case isPointer: + panic("bad pointer in byte slice case in " + tf.Name()) + case tf.Elem().Kind() != reflect.Uint8: + panic("bad element kind in byte slice case in " + tf.Name()) + case isSlice: // E.g., [][]byte + mfi.merge = func(dst, src pointer) { + sbsp := src.toBytesSlice() + if *sbsp != nil { + dbsp := dst.toBytesSlice() + for _, sb := range *sbsp { + if sb == nil { + *dbsp = append(*dbsp, nil) + } else { + *dbsp = append(*dbsp, append([]byte{}, sb...)) + } + } + if *dbsp == nil { + *dbsp = [][]byte{} + } + } + } + default: // E.g., []byte + mfi.merge = func(dst, src pointer) { + sbp := src.toBytes() + if *sbp != nil { + dbp := dst.toBytes() + if !isProto3 || len(*sbp) > 0 { + *dbp = append([]byte{}, *sbp...) + } + } + } + } + case reflect.Struct: + switch { + case !isPointer: + panic(fmt.Sprintf("message field %s without pointer", tf)) + case isSlice: // E.g., []*pb.T + mi := getMergeInfo(tf) + mfi.merge = func(dst, src pointer) { + sps := src.getPointerSlice() + if sps != nil { + dps := dst.getPointerSlice() + for _, sp := range sps { + var dp pointer + if !sp.isNil() { + dp = valToPointer(reflect.New(tf)) + mi.merge(dp, sp) + } + dps = append(dps, dp) + } + if dps == nil { + dps = []pointer{} + } + dst.setPointerSlice(dps) + } + } + default: // E.g., *pb.T + mi := getMergeInfo(tf) + mfi.merge = func(dst, src pointer) { + sp := src.getPointer() + if !sp.isNil() { + dp := dst.getPointer() + if dp.isNil() { + dp = valToPointer(reflect.New(tf)) + dst.setPointer(dp) + } + mi.merge(dp, sp) + } + } + } + case reflect.Map: + switch { + case isPointer || isSlice: + panic("bad pointer or slice in map case in " + tf.Name()) + default: // E.g., map[K]V + mfi.merge = func(dst, src pointer) { + sm := src.asPointerTo(tf).Elem() + if sm.Len() == 0 { + return + } + dm := dst.asPointerTo(tf).Elem() + if dm.IsNil() { + dm.Set(reflect.MakeMap(tf)) + } + + switch tf.Elem().Kind() { + case reflect.Ptr: // Proto struct (e.g., *T) + for _, key := range sm.MapKeys() { + val := sm.MapIndex(key) + val = reflect.ValueOf(Clone(val.Interface().(Message))) + dm.SetMapIndex(key, val) + } + case reflect.Slice: // E.g. Bytes type (e.g., []byte) + for _, key := range sm.MapKeys() { + val := sm.MapIndex(key) + val = reflect.ValueOf(append([]byte{}, val.Bytes()...)) + dm.SetMapIndex(key, val) + } + default: // Basic type (e.g., string) + for _, key := range sm.MapKeys() { + val := sm.MapIndex(key) + dm.SetMapIndex(key, val) + } + } + } + } + case reflect.Interface: + // Must be oneof field. + switch { + case isPointer || isSlice: + panic("bad pointer or slice in interface case in " + tf.Name()) + default: // E.g., interface{} + // TODO: Make this faster? + mfi.merge = func(dst, src pointer) { + su := src.asPointerTo(tf).Elem() + if !su.IsNil() { + du := dst.asPointerTo(tf).Elem() + typ := su.Elem().Type() + if du.IsNil() || du.Elem().Type() != typ { + du.Set(reflect.New(typ.Elem())) // Initialize interface if empty + } + sv := su.Elem().Elem().Field(0) + if sv.Kind() == reflect.Ptr && sv.IsNil() { + return + } + dv := du.Elem().Elem().Field(0) + if dv.Kind() == reflect.Ptr && dv.IsNil() { + dv.Set(reflect.New(sv.Type().Elem())) // Initialize proto message if empty + } + switch sv.Type().Kind() { + case reflect.Ptr: // Proto struct (e.g., *T) + Merge(dv.Interface().(Message), sv.Interface().(Message)) + case reflect.Slice: // E.g. Bytes type (e.g., []byte) + dv.Set(reflect.ValueOf(append([]byte{}, sv.Bytes()...))) + default: // Basic type (e.g., string) + dv.Set(sv) + } + } + } + } + default: + panic(fmt.Sprintf("merger not found for type:%s", tf)) + } + mi.fields = append(mi.fields, mfi) + } + + mi.unrecognized = invalidField + if f, ok := t.FieldByName("XXX_unrecognized"); ok { + if f.Type != reflect.TypeOf([]byte{}) { + panic("expected XXX_unrecognized to be of type []byte") + } + mi.unrecognized = toField(&f) + } + + atomic.StoreInt32(&mi.initialized, 1) +} diff --git a/api/vendor/github.com/golang/protobuf/proto/table_unmarshal.go b/api/vendor/github.com/golang/protobuf/proto/table_unmarshal.go new file mode 100644 index 0000000..55f0340 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/proto/table_unmarshal.go @@ -0,0 +1,1967 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package proto + +import ( + "errors" + "fmt" + "io" + "math" + "reflect" + "strconv" + "strings" + "sync" + "sync/atomic" + "unicode/utf8" +) + +// Unmarshal is the entry point from the generated .pb.go files. +// This function is not intended to be used by non-generated code. +// This function is not subject to any compatibility guarantee. +// msg contains a pointer to a protocol buffer struct. +// b is the data to be unmarshaled into the protocol buffer. +// a is a pointer to a place to store cached unmarshal information. +func (a *InternalMessageInfo) Unmarshal(msg Message, b []byte) error { + // Load the unmarshal information for this message type. + // The atomic load ensures memory consistency. + u := atomicLoadUnmarshalInfo(&a.unmarshal) + if u == nil { + // Slow path: find unmarshal info for msg, update a with it. + u = getUnmarshalInfo(reflect.TypeOf(msg).Elem()) + atomicStoreUnmarshalInfo(&a.unmarshal, u) + } + // Then do the unmarshaling. + err := u.unmarshal(toPointer(&msg), b) + return err +} + +type unmarshalInfo struct { + typ reflect.Type // type of the protobuf struct + + // 0 = only typ field is initialized + // 1 = completely initialized + initialized int32 + lock sync.Mutex // prevents double initialization + dense []unmarshalFieldInfo // fields indexed by tag # + sparse map[uint64]unmarshalFieldInfo // fields indexed by tag # + reqFields []string // names of required fields + reqMask uint64 // 1< 0 { + // Read tag and wire type. + // Special case 1 and 2 byte varints. + var x uint64 + if b[0] < 128 { + x = uint64(b[0]) + b = b[1:] + } else if len(b) >= 2 && b[1] < 128 { + x = uint64(b[0]&0x7f) + uint64(b[1])<<7 + b = b[2:] + } else { + var n int + x, n = decodeVarint(b) + if n == 0 { + return io.ErrUnexpectedEOF + } + b = b[n:] + } + tag := x >> 3 + wire := int(x) & 7 + + // Dispatch on the tag to one of the unmarshal* functions below. + var f unmarshalFieldInfo + if tag < uint64(len(u.dense)) { + f = u.dense[tag] + } else { + f = u.sparse[tag] + } + if fn := f.unmarshal; fn != nil { + var err error + b, err = fn(b, m.offset(f.field), wire) + if err == nil { + reqMask |= f.reqMask + continue + } + if r, ok := err.(*RequiredNotSetError); ok { + // Remember this error, but keep parsing. We need to produce + // a full parse even if a required field is missing. + rnse = r + reqMask |= f.reqMask + continue + } + if err != errInternalBadWireType { + return err + } + // Fragments with bad wire type are treated as unknown fields. + } + + // Unknown tag. + if !u.unrecognized.IsValid() { + // Don't keep unrecognized data; just skip it. + var err error + b, err = skipField(b, wire) + if err != nil { + return err + } + continue + } + // Keep unrecognized data around. + // maybe in extensions, maybe in the unrecognized field. + z := m.offset(u.unrecognized).toBytes() + var emap map[int32]Extension + var e Extension + for _, r := range u.extensionRanges { + if uint64(r.Start) <= tag && tag <= uint64(r.End) { + if u.extensions.IsValid() { + mp := m.offset(u.extensions).toExtensions() + emap = mp.extensionsWrite() + e = emap[int32(tag)] + z = &e.enc + break + } + if u.oldExtensions.IsValid() { + p := m.offset(u.oldExtensions).toOldExtensions() + emap = *p + if emap == nil { + emap = map[int32]Extension{} + *p = emap + } + e = emap[int32(tag)] + z = &e.enc + break + } + panic("no extensions field available") + } + } + + // Use wire type to skip data. + var err error + b0 := b + b, err = skipField(b, wire) + if err != nil { + return err + } + *z = encodeVarint(*z, tag<<3|uint64(wire)) + *z = append(*z, b0[:len(b0)-len(b)]...) + + if emap != nil { + emap[int32(tag)] = e + } + } + if rnse != nil { + // A required field of a submessage/group is missing. Return that error. + return rnse + } + if reqMask != u.reqMask { + // A required field of this message is missing. + for _, n := range u.reqFields { + if reqMask&1 == 0 { + return &RequiredNotSetError{n} + } + reqMask >>= 1 + } + } + return nil +} + +// computeUnmarshalInfo fills in u with information for use +// in unmarshaling protocol buffers of type u.typ. +func (u *unmarshalInfo) computeUnmarshalInfo() { + u.lock.Lock() + defer u.lock.Unlock() + if u.initialized != 0 { + return + } + t := u.typ + n := t.NumField() + + // Set up the "not found" value for the unrecognized byte buffer. + // This is the default for proto3. + u.unrecognized = invalidField + u.extensions = invalidField + u.oldExtensions = invalidField + + // List of the generated type and offset for each oneof field. + type oneofField struct { + ityp reflect.Type // interface type of oneof field + field field // offset in containing message + } + var oneofFields []oneofField + + for i := 0; i < n; i++ { + f := t.Field(i) + if f.Name == "XXX_unrecognized" { + // The byte slice used to hold unrecognized input is special. + if f.Type != reflect.TypeOf(([]byte)(nil)) { + panic("bad type for XXX_unrecognized field: " + f.Type.Name()) + } + u.unrecognized = toField(&f) + continue + } + if f.Name == "XXX_InternalExtensions" { + // Ditto here. + if f.Type != reflect.TypeOf(XXX_InternalExtensions{}) { + panic("bad type for XXX_InternalExtensions field: " + f.Type.Name()) + } + u.extensions = toField(&f) + if f.Tag.Get("protobuf_messageset") == "1" { + u.isMessageSet = true + } + continue + } + if f.Name == "XXX_extensions" { + // An older form of the extensions field. + if f.Type != reflect.TypeOf((map[int32]Extension)(nil)) { + panic("bad type for XXX_extensions field: " + f.Type.Name()) + } + u.oldExtensions = toField(&f) + continue + } + if f.Name == "XXX_NoUnkeyedLiteral" || f.Name == "XXX_sizecache" { + continue + } + + oneof := f.Tag.Get("protobuf_oneof") + if oneof != "" { + oneofFields = append(oneofFields, oneofField{f.Type, toField(&f)}) + // The rest of oneof processing happens below. + continue + } + + tags := f.Tag.Get("protobuf") + tagArray := strings.Split(tags, ",") + if len(tagArray) < 2 { + panic("protobuf tag not enough fields in " + t.Name() + "." + f.Name + ": " + tags) + } + tag, err := strconv.Atoi(tagArray[1]) + if err != nil { + panic("protobuf tag field not an integer: " + tagArray[1]) + } + + name := "" + for _, tag := range tagArray[3:] { + if strings.HasPrefix(tag, "name=") { + name = tag[5:] + } + } + + // Extract unmarshaling function from the field (its type and tags). + unmarshal := fieldUnmarshaler(&f) + + // Required field? + var reqMask uint64 + if tagArray[2] == "req" { + bit := len(u.reqFields) + u.reqFields = append(u.reqFields, name) + reqMask = uint64(1) << uint(bit) + // TODO: if we have more than 64 required fields, we end up + // not verifying that all required fields are present. + // Fix this, perhaps using a count of required fields? + } + + // Store the info in the correct slot in the message. + u.setTag(tag, toField(&f), unmarshal, reqMask) + } + + // Find any types associated with oneof fields. + // TODO: XXX_OneofFuncs returns more info than we need. Get rid of some of it? + fn := reflect.Zero(reflect.PtrTo(t)).MethodByName("XXX_OneofFuncs") + if fn.IsValid() { + res := fn.Call(nil)[3] // last return value from XXX_OneofFuncs: []interface{} + for i := res.Len() - 1; i >= 0; i-- { + v := res.Index(i) // interface{} + tptr := reflect.ValueOf(v.Interface()).Type() // *Msg_X + typ := tptr.Elem() // Msg_X + + f := typ.Field(0) // oneof implementers have one field + baseUnmarshal := fieldUnmarshaler(&f) + tagstr := strings.Split(f.Tag.Get("protobuf"), ",")[1] + tag, err := strconv.Atoi(tagstr) + if err != nil { + panic("protobuf tag field not an integer: " + tagstr) + } + + // Find the oneof field that this struct implements. + // Might take O(n^2) to process all of the oneofs, but who cares. + for _, of := range oneofFields { + if tptr.Implements(of.ityp) { + // We have found the corresponding interface for this struct. + // That lets us know where this struct should be stored + // when we encounter it during unmarshaling. + unmarshal := makeUnmarshalOneof(typ, of.ityp, baseUnmarshal) + u.setTag(tag, of.field, unmarshal, 0) + } + } + } + } + + // Get extension ranges, if any. + fn = reflect.Zero(reflect.PtrTo(t)).MethodByName("ExtensionRangeArray") + if fn.IsValid() { + if !u.extensions.IsValid() && !u.oldExtensions.IsValid() { + panic("a message with extensions, but no extensions field in " + t.Name()) + } + u.extensionRanges = fn.Call(nil)[0].Interface().([]ExtensionRange) + } + + // Explicitly disallow tag 0. This will ensure we flag an error + // when decoding a buffer of all zeros. Without this code, we + // would decode and skip an all-zero buffer of even length. + // [0 0] is [tag=0/wiretype=varint varint-encoded-0]. + u.setTag(0, zeroField, func(b []byte, f pointer, w int) ([]byte, error) { + return nil, fmt.Errorf("proto: %s: illegal tag 0 (wire type %d)", t, w) + }, 0) + + // Set mask for required field check. + u.reqMask = uint64(1)<= 0 && (tag < 16 || tag < 2*n) { // TODO: what are the right numbers here? + for len(u.dense) <= tag { + u.dense = append(u.dense, unmarshalFieldInfo{}) + } + u.dense[tag] = i + return + } + if u.sparse == nil { + u.sparse = map[uint64]unmarshalFieldInfo{} + } + u.sparse[uint64(tag)] = i +} + +// fieldUnmarshaler returns an unmarshaler for the given field. +func fieldUnmarshaler(f *reflect.StructField) unmarshaler { + if f.Type.Kind() == reflect.Map { + return makeUnmarshalMap(f) + } + return typeUnmarshaler(f.Type, f.Tag.Get("protobuf")) +} + +// typeUnmarshaler returns an unmarshaler for the given field type / field tag pair. +func typeUnmarshaler(t reflect.Type, tags string) unmarshaler { + tagArray := strings.Split(tags, ",") + encoding := tagArray[0] + name := "unknown" + for _, tag := range tagArray[3:] { + if strings.HasPrefix(tag, "name=") { + name = tag[5:] + } + } + + // Figure out packaging (pointer, slice, or both) + slice := false + pointer := false + if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 { + slice = true + t = t.Elem() + } + if t.Kind() == reflect.Ptr { + pointer = true + t = t.Elem() + } + + // We'll never have both pointer and slice for basic types. + if pointer && slice && t.Kind() != reflect.Struct { + panic("both pointer and slice for basic type in " + t.Name()) + } + + switch t.Kind() { + case reflect.Bool: + if pointer { + return unmarshalBoolPtr + } + if slice { + return unmarshalBoolSlice + } + return unmarshalBoolValue + case reflect.Int32: + switch encoding { + case "fixed32": + if pointer { + return unmarshalFixedS32Ptr + } + if slice { + return unmarshalFixedS32Slice + } + return unmarshalFixedS32Value + case "varint": + // this could be int32 or enum + if pointer { + return unmarshalInt32Ptr + } + if slice { + return unmarshalInt32Slice + } + return unmarshalInt32Value + case "zigzag32": + if pointer { + return unmarshalSint32Ptr + } + if slice { + return unmarshalSint32Slice + } + return unmarshalSint32Value + } + case reflect.Int64: + switch encoding { + case "fixed64": + if pointer { + return unmarshalFixedS64Ptr + } + if slice { + return unmarshalFixedS64Slice + } + return unmarshalFixedS64Value + case "varint": + if pointer { + return unmarshalInt64Ptr + } + if slice { + return unmarshalInt64Slice + } + return unmarshalInt64Value + case "zigzag64": + if pointer { + return unmarshalSint64Ptr + } + if slice { + return unmarshalSint64Slice + } + return unmarshalSint64Value + } + case reflect.Uint32: + switch encoding { + case "fixed32": + if pointer { + return unmarshalFixed32Ptr + } + if slice { + return unmarshalFixed32Slice + } + return unmarshalFixed32Value + case "varint": + if pointer { + return unmarshalUint32Ptr + } + if slice { + return unmarshalUint32Slice + } + return unmarshalUint32Value + } + case reflect.Uint64: + switch encoding { + case "fixed64": + if pointer { + return unmarshalFixed64Ptr + } + if slice { + return unmarshalFixed64Slice + } + return unmarshalFixed64Value + case "varint": + if pointer { + return unmarshalUint64Ptr + } + if slice { + return unmarshalUint64Slice + } + return unmarshalUint64Value + } + case reflect.Float32: + if pointer { + return unmarshalFloat32Ptr + } + if slice { + return unmarshalFloat32Slice + } + return unmarshalFloat32Value + case reflect.Float64: + if pointer { + return unmarshalFloat64Ptr + } + if slice { + return unmarshalFloat64Slice + } + return unmarshalFloat64Value + case reflect.Map: + panic("map type in typeUnmarshaler in " + t.Name()) + case reflect.Slice: + if pointer { + panic("bad pointer in slice case in " + t.Name()) + } + if slice { + return unmarshalBytesSlice + } + return unmarshalBytesValue + case reflect.String: + if pointer { + return unmarshalStringPtr + } + if slice { + return unmarshalStringSlice + } + return unmarshalStringValue + case reflect.Struct: + // message or group field + if !pointer { + panic(fmt.Sprintf("message/group field %s:%s without pointer", t, encoding)) + } + switch encoding { + case "bytes": + if slice { + return makeUnmarshalMessageSlicePtr(getUnmarshalInfo(t), name) + } + return makeUnmarshalMessagePtr(getUnmarshalInfo(t), name) + case "group": + if slice { + return makeUnmarshalGroupSlicePtr(getUnmarshalInfo(t), name) + } + return makeUnmarshalGroupPtr(getUnmarshalInfo(t), name) + } + } + panic(fmt.Sprintf("unmarshaler not found type:%s encoding:%s", t, encoding)) +} + +// Below are all the unmarshalers for individual fields of various types. + +func unmarshalInt64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x) + *f.toInt64() = v + return b, nil +} + +func unmarshalInt64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x) + *f.toInt64Ptr() = &v + return b, nil +} + +func unmarshalInt64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x) + s := f.toInt64Slice() + *s = append(*s, v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x) + s := f.toInt64Slice() + *s = append(*s, v) + return b, nil +} + +func unmarshalSint64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x>>1) ^ int64(x)<<63>>63 + *f.toInt64() = v + return b, nil +} + +func unmarshalSint64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x>>1) ^ int64(x)<<63>>63 + *f.toInt64Ptr() = &v + return b, nil +} + +func unmarshalSint64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x>>1) ^ int64(x)<<63>>63 + s := f.toInt64Slice() + *s = append(*s, v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x>>1) ^ int64(x)<<63>>63 + s := f.toInt64Slice() + *s = append(*s, v) + return b, nil +} + +func unmarshalUint64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint64(x) + *f.toUint64() = v + return b, nil +} + +func unmarshalUint64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint64(x) + *f.toUint64Ptr() = &v + return b, nil +} + +func unmarshalUint64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint64(x) + s := f.toUint64Slice() + *s = append(*s, v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint64(x) + s := f.toUint64Slice() + *s = append(*s, v) + return b, nil +} + +func unmarshalInt32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x) + *f.toInt32() = v + return b, nil +} + +func unmarshalInt32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x) + f.setInt32Ptr(v) + return b, nil +} + +func unmarshalInt32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x) + f.appendInt32Slice(v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x) + f.appendInt32Slice(v) + return b, nil +} + +func unmarshalSint32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x>>1) ^ int32(x)<<31>>31 + *f.toInt32() = v + return b, nil +} + +func unmarshalSint32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x>>1) ^ int32(x)<<31>>31 + f.setInt32Ptr(v) + return b, nil +} + +func unmarshalSint32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x>>1) ^ int32(x)<<31>>31 + f.appendInt32Slice(v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x>>1) ^ int32(x)<<31>>31 + f.appendInt32Slice(v) + return b, nil +} + +func unmarshalUint32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint32(x) + *f.toUint32() = v + return b, nil +} + +func unmarshalUint32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint32(x) + *f.toUint32Ptr() = &v + return b, nil +} + +func unmarshalUint32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint32(x) + s := f.toUint32Slice() + *s = append(*s, v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint32(x) + s := f.toUint32Slice() + *s = append(*s, v) + return b, nil +} + +func unmarshalFixed64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := 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 + *f.toUint64() = v + return b[8:], nil +} + +func unmarshalFixed64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := 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 + *f.toUint64Ptr() = &v + return b[8:], nil +} + +func unmarshalFixed64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := 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 + s := f.toUint64Slice() + *s = append(*s, v) + b = b[8:] + } + return res, nil + } + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := 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 + s := f.toUint64Slice() + *s = append(*s, v) + return b[8:], nil +} + +func unmarshalFixedS64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 + *f.toInt64() = v + return b[8:], nil +} + +func unmarshalFixedS64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 + *f.toInt64Ptr() = &v + return b[8:], nil +} + +func unmarshalFixedS64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 + s := f.toInt64Slice() + *s = append(*s, v) + b = b[8:] + } + return res, nil + } + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 + s := f.toInt64Slice() + *s = append(*s, v) + return b[8:], nil +} + +func unmarshalFixed32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + *f.toUint32() = v + return b[4:], nil +} + +func unmarshalFixed32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + *f.toUint32Ptr() = &v + return b[4:], nil +} + +func unmarshalFixed32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + s := f.toUint32Slice() + *s = append(*s, v) + b = b[4:] + } + return res, nil + } + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + s := f.toUint32Slice() + *s = append(*s, v) + return b[4:], nil +} + +func unmarshalFixedS32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 + *f.toInt32() = v + return b[4:], nil +} + +func unmarshalFixedS32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 + f.setInt32Ptr(v) + return b[4:], nil +} + +func unmarshalFixedS32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 + f.appendInt32Slice(v) + b = b[4:] + } + return res, nil + } + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 + f.appendInt32Slice(v) + return b[4:], nil +} + +func unmarshalBoolValue(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + // Note: any length varint is allowed, even though any sane + // encoder will use one byte. + // See https://github.com/golang/protobuf/issues/76 + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + // TODO: check if x>1? Tests seem to indicate no. + v := x != 0 + *f.toBool() = v + return b[n:], nil +} + +func unmarshalBoolPtr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + v := x != 0 + *f.toBoolPtr() = &v + return b[n:], nil +} + +func unmarshalBoolSlice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + v := x != 0 + s := f.toBoolSlice() + *s = append(*s, v) + b = b[n:] + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + v := x != 0 + s := f.toBoolSlice() + *s = append(*s, v) + return b[n:], nil +} + +func unmarshalFloat64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float64frombits(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) + *f.toFloat64() = v + return b[8:], nil +} + +func unmarshalFloat64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float64frombits(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) + *f.toFloat64Ptr() = &v + return b[8:], nil +} + +func unmarshalFloat64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float64frombits(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) + s := f.toFloat64Slice() + *s = append(*s, v) + b = b[8:] + } + return res, nil + } + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float64frombits(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) + s := f.toFloat64Slice() + *s = append(*s, v) + return b[8:], nil +} + +func unmarshalFloat32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) + *f.toFloat32() = v + return b[4:], nil +} + +func unmarshalFloat32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) + *f.toFloat32Ptr() = &v + return b[4:], nil +} + +func unmarshalFloat32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) + s := f.toFloat32Slice() + *s = append(*s, v) + b = b[4:] + } + return res, nil + } + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) + s := f.toFloat32Slice() + *s = append(*s, v) + return b[4:], nil +} + +func unmarshalStringValue(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + if !utf8.ValidString(v) { + return nil, errInvalidUTF8 + } + *f.toString() = v + return b[x:], nil +} + +func unmarshalStringPtr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + if !utf8.ValidString(v) { + return nil, errInvalidUTF8 + } + *f.toStringPtr() = &v + return b[x:], nil +} + +func unmarshalStringSlice(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + if !utf8.ValidString(v) { + return nil, errInvalidUTF8 + } + s := f.toStringSlice() + *s = append(*s, v) + return b[x:], nil +} + +var emptyBuf [0]byte + +func unmarshalBytesValue(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + // The use of append here is a trick which avoids the zeroing + // that would be required if we used a make/copy pair. + // We append to emptyBuf instead of nil because we want + // a non-nil result even when the length is 0. + v := append(emptyBuf[:], b[:x]...) + *f.toBytes() = v + return b[x:], nil +} + +func unmarshalBytesSlice(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := append(emptyBuf[:], b[:x]...) + s := f.toBytesSlice() + *s = append(*s, v) + return b[x:], nil +} + +func makeUnmarshalMessagePtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + // First read the message field to see if something is there. + // The semantics of multiple submessages are weird. Instead of + // the last one winning (as it is for all other fields), multiple + // submessages are merged. + v := f.getPointer() + if v.isNil() { + v = valToPointer(reflect.New(sub.typ)) + f.setPointer(v) + } + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + return b[x:], err + } +} + +func makeUnmarshalMessageSlicePtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := valToPointer(reflect.New(sub.typ)) + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + f.appendPointer(v) + return b[x:], err + } +} + +func makeUnmarshalGroupPtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireStartGroup { + return b, errInternalBadWireType + } + x, y := findEndGroup(b) + if x < 0 { + return nil, io.ErrUnexpectedEOF + } + v := f.getPointer() + if v.isNil() { + v = valToPointer(reflect.New(sub.typ)) + f.setPointer(v) + } + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + return b[y:], err + } +} + +func makeUnmarshalGroupSlicePtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireStartGroup { + return b, errInternalBadWireType + } + x, y := findEndGroup(b) + if x < 0 { + return nil, io.ErrUnexpectedEOF + } + v := valToPointer(reflect.New(sub.typ)) + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + f.appendPointer(v) + return b[y:], err + } +} + +func makeUnmarshalMap(f *reflect.StructField) unmarshaler { + t := f.Type + kt := t.Key() + vt := t.Elem() + unmarshalKey := typeUnmarshaler(kt, f.Tag.Get("protobuf_key")) + unmarshalVal := typeUnmarshaler(vt, f.Tag.Get("protobuf_val")) + return func(b []byte, f pointer, w int) ([]byte, error) { + // The map entry is a submessage. Figure out how big it is. + if w != WireBytes { + return nil, fmt.Errorf("proto: bad wiretype for map field: got %d want %d", w, WireBytes) + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + r := b[x:] // unused data to return + b = b[:x] // data for map entry + + // Note: we could use #keys * #values ~= 200 functions + // to do map decoding without reflection. Probably not worth it. + // Maps will be somewhat slow. Oh well. + + // Read key and value from data. + k := reflect.New(kt) + v := reflect.New(vt) + for len(b) > 0 { + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + wire := int(x) & 7 + b = b[n:] + + var err error + switch x >> 3 { + case 1: + b, err = unmarshalKey(b, valToPointer(k), wire) + case 2: + b, err = unmarshalVal(b, valToPointer(v), wire) + default: + err = errInternalBadWireType // skip unknown tag + } + + if err == nil { + continue + } + if err != errInternalBadWireType { + return nil, err + } + + // Skip past unknown fields. + b, err = skipField(b, wire) + if err != nil { + return nil, err + } + } + + // Get map, allocate if needed. + m := f.asPointerTo(t).Elem() // an addressable map[K]T + if m.IsNil() { + m.Set(reflect.MakeMap(t)) + } + + // Insert into map. + m.SetMapIndex(k.Elem(), v.Elem()) + + return r, nil + } +} + +// makeUnmarshalOneof makes an unmarshaler for oneof fields. +// for: +// message Msg { +// oneof F { +// int64 X = 1; +// float64 Y = 2; +// } +// } +// typ is the type of the concrete entry for a oneof case (e.g. Msg_X). +// ityp is the interface type of the oneof field (e.g. isMsg_F). +// unmarshal is the unmarshaler for the base type of the oneof case (e.g. int64). +// Note that this function will be called once for each case in the oneof. +func makeUnmarshalOneof(typ, ityp reflect.Type, unmarshal unmarshaler) unmarshaler { + sf := typ.Field(0) + field0 := toField(&sf) + return func(b []byte, f pointer, w int) ([]byte, error) { + // Allocate holder for value. + v := reflect.New(typ) + + // Unmarshal data into holder. + // We unmarshal into the first field of the holder object. + var err error + b, err = unmarshal(b, valToPointer(v).offset(field0), w) + if err != nil { + return nil, err + } + + // Write pointer to holder into target field. + f.asPointerTo(ityp).Elem().Set(v) + + return b, nil + } +} + +// Error used by decode internally. +var errInternalBadWireType = errors.New("proto: internal error: bad wiretype") + +// skipField skips past a field of type wire and returns the remaining bytes. +func skipField(b []byte, wire int) ([]byte, error) { + switch wire { + case WireVarint: + _, k := decodeVarint(b) + if k == 0 { + return b, io.ErrUnexpectedEOF + } + b = b[k:] + case WireFixed32: + if len(b) < 4 { + return b, io.ErrUnexpectedEOF + } + b = b[4:] + case WireFixed64: + if len(b) < 8 { + return b, io.ErrUnexpectedEOF + } + b = b[8:] + case WireBytes: + m, k := decodeVarint(b) + if k == 0 || uint64(len(b)-k) < m { + return b, io.ErrUnexpectedEOF + } + b = b[uint64(k)+m:] + case WireStartGroup: + _, i := findEndGroup(b) + if i == -1 { + return b, io.ErrUnexpectedEOF + } + b = b[i:] + default: + return b, fmt.Errorf("proto: can't skip unknown wire type %d", wire) + } + return b, nil +} + +// findEndGroup finds the index of the next EndGroup tag. +// Groups may be nested, so the "next" EndGroup tag is the first +// unpaired EndGroup. +// findEndGroup returns the indexes of the start and end of the EndGroup tag. +// Returns (-1,-1) if it can't find one. +func findEndGroup(b []byte) (int, int) { + depth := 1 + i := 0 + for { + x, n := decodeVarint(b[i:]) + if n == 0 { + return -1, -1 + } + j := i + i += n + switch x & 7 { + case WireVarint: + _, k := decodeVarint(b[i:]) + if k == 0 { + return -1, -1 + } + i += k + case WireFixed32: + if len(b)-4 < i { + return -1, -1 + } + i += 4 + case WireFixed64: + if len(b)-8 < i { + return -1, -1 + } + i += 8 + case WireBytes: + m, k := decodeVarint(b[i:]) + if k == 0 { + return -1, -1 + } + i += k + if uint64(len(b)-i) < m { + return -1, -1 + } + i += int(m) + case WireStartGroup: + depth++ + case WireEndGroup: + depth-- + if depth == 0 { + return j, i + } + default: + return -1, -1 + } + } +} + +// encodeVarint appends a varint-encoded integer to b and returns the result. +func encodeVarint(b []byte, x uint64) []byte { + for x >= 1<<7 { + b = append(b, byte(x&0x7f|0x80)) + x >>= 7 + } + return append(b, byte(x)) +} + +// decodeVarint reads a varint-encoded integer from b. +// Returns the decoded integer and the number of bytes read. +// If there is an error, it returns 0,0. +func decodeVarint(b []byte) (uint64, int) { + var x, y uint64 + if len(b) <= 0 { + goto bad + } + x = uint64(b[0]) + if x < 0x80 { + return x, 1 + } + x -= 0x80 + + if len(b) <= 1 { + goto bad + } + y = uint64(b[1]) + x += y << 7 + if y < 0x80 { + return x, 2 + } + x -= 0x80 << 7 + + if len(b) <= 2 { + goto bad + } + y = uint64(b[2]) + x += y << 14 + if y < 0x80 { + return x, 3 + } + x -= 0x80 << 14 + + if len(b) <= 3 { + goto bad + } + y = uint64(b[3]) + x += y << 21 + if y < 0x80 { + return x, 4 + } + x -= 0x80 << 21 + + if len(b) <= 4 { + goto bad + } + y = uint64(b[4]) + x += y << 28 + if y < 0x80 { + return x, 5 + } + x -= 0x80 << 28 + + if len(b) <= 5 { + goto bad + } + y = uint64(b[5]) + x += y << 35 + if y < 0x80 { + return x, 6 + } + x -= 0x80 << 35 + + if len(b) <= 6 { + goto bad + } + y = uint64(b[6]) + x += y << 42 + if y < 0x80 { + return x, 7 + } + x -= 0x80 << 42 + + if len(b) <= 7 { + goto bad + } + y = uint64(b[7]) + x += y << 49 + if y < 0x80 { + return x, 8 + } + x -= 0x80 << 49 + + if len(b) <= 8 { + goto bad + } + y = uint64(b[8]) + x += y << 56 + if y < 0x80 { + return x, 9 + } + x -= 0x80 << 56 + + if len(b) <= 9 { + goto bad + } + y = uint64(b[9]) + x += y << 63 + if y < 2 { + return x, 10 + } + +bad: + return 0, 0 +} diff --git a/api/vendor/github.com/golang/protobuf/proto/test_proto/test.pb.go b/api/vendor/github.com/golang/protobuf/proto/test_proto/test.pb.go new file mode 100644 index 0000000..049b5dd --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/proto/test_proto/test.pb.go @@ -0,0 +1,5118 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: test_proto/test.proto + +package test_proto // import "github.com/golang/protobuf/proto/test_proto" + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type FOO int32 + +const ( + FOO_FOO1 FOO = 1 +) + +var FOO_name = map[int32]string{ + 1: "FOO1", +} +var FOO_value = map[string]int32{ + "FOO1": 1, +} + +func (x FOO) Enum() *FOO { + p := new(FOO) + *p = x + return p +} +func (x FOO) String() string { + return proto.EnumName(FOO_name, int32(x)) +} +func (x *FOO) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FOO_value, data, "FOO") + if err != nil { + return err + } + *x = FOO(value) + return nil +} +func (FOO) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{0} +} + +// An enum, for completeness. +type GoTest_KIND int32 + +const ( + GoTest_VOID GoTest_KIND = 0 + // Basic types + GoTest_BOOL GoTest_KIND = 1 + GoTest_BYTES GoTest_KIND = 2 + GoTest_FINGERPRINT GoTest_KIND = 3 + GoTest_FLOAT GoTest_KIND = 4 + GoTest_INT GoTest_KIND = 5 + GoTest_STRING GoTest_KIND = 6 + GoTest_TIME GoTest_KIND = 7 + // Groupings + GoTest_TUPLE GoTest_KIND = 8 + GoTest_ARRAY GoTest_KIND = 9 + GoTest_MAP GoTest_KIND = 10 + // Table types + GoTest_TABLE GoTest_KIND = 11 + // Functions + GoTest_FUNCTION GoTest_KIND = 12 +) + +var GoTest_KIND_name = map[int32]string{ + 0: "VOID", + 1: "BOOL", + 2: "BYTES", + 3: "FINGERPRINT", + 4: "FLOAT", + 5: "INT", + 6: "STRING", + 7: "TIME", + 8: "TUPLE", + 9: "ARRAY", + 10: "MAP", + 11: "TABLE", + 12: "FUNCTION", +} +var GoTest_KIND_value = map[string]int32{ + "VOID": 0, + "BOOL": 1, + "BYTES": 2, + "FINGERPRINT": 3, + "FLOAT": 4, + "INT": 5, + "STRING": 6, + "TIME": 7, + "TUPLE": 8, + "ARRAY": 9, + "MAP": 10, + "TABLE": 11, + "FUNCTION": 12, +} + +func (x GoTest_KIND) Enum() *GoTest_KIND { + p := new(GoTest_KIND) + *p = x + return p +} +func (x GoTest_KIND) String() string { + return proto.EnumName(GoTest_KIND_name, int32(x)) +} +func (x *GoTest_KIND) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(GoTest_KIND_value, data, "GoTest_KIND") + if err != nil { + return err + } + *x = GoTest_KIND(value) + return nil +} +func (GoTest_KIND) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{2, 0} +} + +type MyMessage_Color int32 + +const ( + MyMessage_RED MyMessage_Color = 0 + MyMessage_GREEN MyMessage_Color = 1 + MyMessage_BLUE MyMessage_Color = 2 +) + +var MyMessage_Color_name = map[int32]string{ + 0: "RED", + 1: "GREEN", + 2: "BLUE", +} +var MyMessage_Color_value = map[string]int32{ + "RED": 0, + "GREEN": 1, + "BLUE": 2, +} + +func (x MyMessage_Color) Enum() *MyMessage_Color { + p := new(MyMessage_Color) + *p = x + return p +} +func (x MyMessage_Color) String() string { + return proto.EnumName(MyMessage_Color_name, int32(x)) +} +func (x *MyMessage_Color) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(MyMessage_Color_value, data, "MyMessage_Color") + if err != nil { + return err + } + *x = MyMessage_Color(value) + return nil +} +func (MyMessage_Color) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{13, 0} +} + +type DefaultsMessage_DefaultsEnum int32 + +const ( + DefaultsMessage_ZERO DefaultsMessage_DefaultsEnum = 0 + DefaultsMessage_ONE DefaultsMessage_DefaultsEnum = 1 + DefaultsMessage_TWO DefaultsMessage_DefaultsEnum = 2 +) + +var DefaultsMessage_DefaultsEnum_name = map[int32]string{ + 0: "ZERO", + 1: "ONE", + 2: "TWO", +} +var DefaultsMessage_DefaultsEnum_value = map[string]int32{ + "ZERO": 0, + "ONE": 1, + "TWO": 2, +} + +func (x DefaultsMessage_DefaultsEnum) Enum() *DefaultsMessage_DefaultsEnum { + p := new(DefaultsMessage_DefaultsEnum) + *p = x + return p +} +func (x DefaultsMessage_DefaultsEnum) String() string { + return proto.EnumName(DefaultsMessage_DefaultsEnum_name, int32(x)) +} +func (x *DefaultsMessage_DefaultsEnum) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(DefaultsMessage_DefaultsEnum_value, data, "DefaultsMessage_DefaultsEnum") + if err != nil { + return err + } + *x = DefaultsMessage_DefaultsEnum(value) + return nil +} +func (DefaultsMessage_DefaultsEnum) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{16, 0} +} + +type Defaults_Color int32 + +const ( + Defaults_RED Defaults_Color = 0 + Defaults_GREEN Defaults_Color = 1 + Defaults_BLUE Defaults_Color = 2 +) + +var Defaults_Color_name = map[int32]string{ + 0: "RED", + 1: "GREEN", + 2: "BLUE", +} +var Defaults_Color_value = map[string]int32{ + "RED": 0, + "GREEN": 1, + "BLUE": 2, +} + +func (x Defaults_Color) Enum() *Defaults_Color { + p := new(Defaults_Color) + *p = x + return p +} +func (x Defaults_Color) String() string { + return proto.EnumName(Defaults_Color_name, int32(x)) +} +func (x *Defaults_Color) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Defaults_Color_value, data, "Defaults_Color") + if err != nil { + return err + } + *x = Defaults_Color(value) + return nil +} +func (Defaults_Color) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{21, 0} +} + +type RepeatedEnum_Color int32 + +const ( + RepeatedEnum_RED RepeatedEnum_Color = 1 +) + +var RepeatedEnum_Color_name = map[int32]string{ + 1: "RED", +} +var RepeatedEnum_Color_value = map[string]int32{ + "RED": 1, +} + +func (x RepeatedEnum_Color) Enum() *RepeatedEnum_Color { + p := new(RepeatedEnum_Color) + *p = x + return p +} +func (x RepeatedEnum_Color) String() string { + return proto.EnumName(RepeatedEnum_Color_name, int32(x)) +} +func (x *RepeatedEnum_Color) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(RepeatedEnum_Color_value, data, "RepeatedEnum_Color") + if err != nil { + return err + } + *x = RepeatedEnum_Color(value) + return nil +} +func (RepeatedEnum_Color) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{23, 0} +} + +type GoEnum struct { + Foo *FOO `protobuf:"varint,1,req,name=foo,enum=test_proto.FOO" json:"foo,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GoEnum) Reset() { *m = GoEnum{} } +func (m *GoEnum) String() string { return proto.CompactTextString(m) } +func (*GoEnum) ProtoMessage() {} +func (*GoEnum) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{0} +} +func (m *GoEnum) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GoEnum.Unmarshal(m, b) +} +func (m *GoEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GoEnum.Marshal(b, m, deterministic) +} +func (dst *GoEnum) XXX_Merge(src proto.Message) { + xxx_messageInfo_GoEnum.Merge(dst, src) +} +func (m *GoEnum) XXX_Size() int { + return xxx_messageInfo_GoEnum.Size(m) +} +func (m *GoEnum) XXX_DiscardUnknown() { + xxx_messageInfo_GoEnum.DiscardUnknown(m) +} + +var xxx_messageInfo_GoEnum proto.InternalMessageInfo + +func (m *GoEnum) GetFoo() FOO { + if m != nil && m.Foo != nil { + return *m.Foo + } + return FOO_FOO1 +} + +type GoTestField struct { + Label *string `protobuf:"bytes,1,req,name=Label" json:"Label,omitempty"` + Type *string `protobuf:"bytes,2,req,name=Type" json:"Type,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GoTestField) Reset() { *m = GoTestField{} } +func (m *GoTestField) String() string { return proto.CompactTextString(m) } +func (*GoTestField) ProtoMessage() {} +func (*GoTestField) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{1} +} +func (m *GoTestField) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GoTestField.Unmarshal(m, b) +} +func (m *GoTestField) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GoTestField.Marshal(b, m, deterministic) +} +func (dst *GoTestField) XXX_Merge(src proto.Message) { + xxx_messageInfo_GoTestField.Merge(dst, src) +} +func (m *GoTestField) XXX_Size() int { + return xxx_messageInfo_GoTestField.Size(m) +} +func (m *GoTestField) XXX_DiscardUnknown() { + xxx_messageInfo_GoTestField.DiscardUnknown(m) +} + +var xxx_messageInfo_GoTestField proto.InternalMessageInfo + +func (m *GoTestField) GetLabel() string { + if m != nil && m.Label != nil { + return *m.Label + } + return "" +} + +func (m *GoTestField) GetType() string { + if m != nil && m.Type != nil { + return *m.Type + } + return "" +} + +type GoTest struct { + // Some typical parameters + Kind *GoTest_KIND `protobuf:"varint,1,req,name=Kind,enum=test_proto.GoTest_KIND" json:"Kind,omitempty"` + Table *string `protobuf:"bytes,2,opt,name=Table" json:"Table,omitempty"` + Param *int32 `protobuf:"varint,3,opt,name=Param" json:"Param,omitempty"` + // Required, repeated and optional foreign fields. + RequiredField *GoTestField `protobuf:"bytes,4,req,name=RequiredField" json:"RequiredField,omitempty"` + RepeatedField []*GoTestField `protobuf:"bytes,5,rep,name=RepeatedField" json:"RepeatedField,omitempty"` + OptionalField *GoTestField `protobuf:"bytes,6,opt,name=OptionalField" json:"OptionalField,omitempty"` + // Required fields of all basic types + F_BoolRequired *bool `protobuf:"varint,10,req,name=F_Bool_required,json=FBoolRequired" json:"F_Bool_required,omitempty"` + F_Int32Required *int32 `protobuf:"varint,11,req,name=F_Int32_required,json=FInt32Required" json:"F_Int32_required,omitempty"` + F_Int64Required *int64 `protobuf:"varint,12,req,name=F_Int64_required,json=FInt64Required" json:"F_Int64_required,omitempty"` + F_Fixed32Required *uint32 `protobuf:"fixed32,13,req,name=F_Fixed32_required,json=FFixed32Required" json:"F_Fixed32_required,omitempty"` + F_Fixed64Required *uint64 `protobuf:"fixed64,14,req,name=F_Fixed64_required,json=FFixed64Required" json:"F_Fixed64_required,omitempty"` + F_Uint32Required *uint32 `protobuf:"varint,15,req,name=F_Uint32_required,json=FUint32Required" json:"F_Uint32_required,omitempty"` + F_Uint64Required *uint64 `protobuf:"varint,16,req,name=F_Uint64_required,json=FUint64Required" json:"F_Uint64_required,omitempty"` + F_FloatRequired *float32 `protobuf:"fixed32,17,req,name=F_Float_required,json=FFloatRequired" json:"F_Float_required,omitempty"` + F_DoubleRequired *float64 `protobuf:"fixed64,18,req,name=F_Double_required,json=FDoubleRequired" json:"F_Double_required,omitempty"` + F_StringRequired *string `protobuf:"bytes,19,req,name=F_String_required,json=FStringRequired" json:"F_String_required,omitempty"` + F_BytesRequired []byte `protobuf:"bytes,101,req,name=F_Bytes_required,json=FBytesRequired" json:"F_Bytes_required,omitempty"` + F_Sint32Required *int32 `protobuf:"zigzag32,102,req,name=F_Sint32_required,json=FSint32Required" json:"F_Sint32_required,omitempty"` + F_Sint64Required *int64 `protobuf:"zigzag64,103,req,name=F_Sint64_required,json=FSint64Required" json:"F_Sint64_required,omitempty"` + F_Sfixed32Required *int32 `protobuf:"fixed32,104,req,name=F_Sfixed32_required,json=FSfixed32Required" json:"F_Sfixed32_required,omitempty"` + F_Sfixed64Required *int64 `protobuf:"fixed64,105,req,name=F_Sfixed64_required,json=FSfixed64Required" json:"F_Sfixed64_required,omitempty"` + // Repeated fields of all basic types + F_BoolRepeated []bool `protobuf:"varint,20,rep,name=F_Bool_repeated,json=FBoolRepeated" json:"F_Bool_repeated,omitempty"` + F_Int32Repeated []int32 `protobuf:"varint,21,rep,name=F_Int32_repeated,json=FInt32Repeated" json:"F_Int32_repeated,omitempty"` + F_Int64Repeated []int64 `protobuf:"varint,22,rep,name=F_Int64_repeated,json=FInt64Repeated" json:"F_Int64_repeated,omitempty"` + F_Fixed32Repeated []uint32 `protobuf:"fixed32,23,rep,name=F_Fixed32_repeated,json=FFixed32Repeated" json:"F_Fixed32_repeated,omitempty"` + F_Fixed64Repeated []uint64 `protobuf:"fixed64,24,rep,name=F_Fixed64_repeated,json=FFixed64Repeated" json:"F_Fixed64_repeated,omitempty"` + F_Uint32Repeated []uint32 `protobuf:"varint,25,rep,name=F_Uint32_repeated,json=FUint32Repeated" json:"F_Uint32_repeated,omitempty"` + F_Uint64Repeated []uint64 `protobuf:"varint,26,rep,name=F_Uint64_repeated,json=FUint64Repeated" json:"F_Uint64_repeated,omitempty"` + F_FloatRepeated []float32 `protobuf:"fixed32,27,rep,name=F_Float_repeated,json=FFloatRepeated" json:"F_Float_repeated,omitempty"` + F_DoubleRepeated []float64 `protobuf:"fixed64,28,rep,name=F_Double_repeated,json=FDoubleRepeated" json:"F_Double_repeated,omitempty"` + F_StringRepeated []string `protobuf:"bytes,29,rep,name=F_String_repeated,json=FStringRepeated" json:"F_String_repeated,omitempty"` + F_BytesRepeated [][]byte `protobuf:"bytes,201,rep,name=F_Bytes_repeated,json=FBytesRepeated" json:"F_Bytes_repeated,omitempty"` + F_Sint32Repeated []int32 `protobuf:"zigzag32,202,rep,name=F_Sint32_repeated,json=FSint32Repeated" json:"F_Sint32_repeated,omitempty"` + F_Sint64Repeated []int64 `protobuf:"zigzag64,203,rep,name=F_Sint64_repeated,json=FSint64Repeated" json:"F_Sint64_repeated,omitempty"` + F_Sfixed32Repeated []int32 `protobuf:"fixed32,204,rep,name=F_Sfixed32_repeated,json=FSfixed32Repeated" json:"F_Sfixed32_repeated,omitempty"` + F_Sfixed64Repeated []int64 `protobuf:"fixed64,205,rep,name=F_Sfixed64_repeated,json=FSfixed64Repeated" json:"F_Sfixed64_repeated,omitempty"` + // Optional fields of all basic types + F_BoolOptional *bool `protobuf:"varint,30,opt,name=F_Bool_optional,json=FBoolOptional" json:"F_Bool_optional,omitempty"` + F_Int32Optional *int32 `protobuf:"varint,31,opt,name=F_Int32_optional,json=FInt32Optional" json:"F_Int32_optional,omitempty"` + F_Int64Optional *int64 `protobuf:"varint,32,opt,name=F_Int64_optional,json=FInt64Optional" json:"F_Int64_optional,omitempty"` + F_Fixed32Optional *uint32 `protobuf:"fixed32,33,opt,name=F_Fixed32_optional,json=FFixed32Optional" json:"F_Fixed32_optional,omitempty"` + F_Fixed64Optional *uint64 `protobuf:"fixed64,34,opt,name=F_Fixed64_optional,json=FFixed64Optional" json:"F_Fixed64_optional,omitempty"` + F_Uint32Optional *uint32 `protobuf:"varint,35,opt,name=F_Uint32_optional,json=FUint32Optional" json:"F_Uint32_optional,omitempty"` + F_Uint64Optional *uint64 `protobuf:"varint,36,opt,name=F_Uint64_optional,json=FUint64Optional" json:"F_Uint64_optional,omitempty"` + F_FloatOptional *float32 `protobuf:"fixed32,37,opt,name=F_Float_optional,json=FFloatOptional" json:"F_Float_optional,omitempty"` + F_DoubleOptional *float64 `protobuf:"fixed64,38,opt,name=F_Double_optional,json=FDoubleOptional" json:"F_Double_optional,omitempty"` + F_StringOptional *string `protobuf:"bytes,39,opt,name=F_String_optional,json=FStringOptional" json:"F_String_optional,omitempty"` + F_BytesOptional []byte `protobuf:"bytes,301,opt,name=F_Bytes_optional,json=FBytesOptional" json:"F_Bytes_optional,omitempty"` + F_Sint32Optional *int32 `protobuf:"zigzag32,302,opt,name=F_Sint32_optional,json=FSint32Optional" json:"F_Sint32_optional,omitempty"` + F_Sint64Optional *int64 `protobuf:"zigzag64,303,opt,name=F_Sint64_optional,json=FSint64Optional" json:"F_Sint64_optional,omitempty"` + F_Sfixed32Optional *int32 `protobuf:"fixed32,304,opt,name=F_Sfixed32_optional,json=FSfixed32Optional" json:"F_Sfixed32_optional,omitempty"` + F_Sfixed64Optional *int64 `protobuf:"fixed64,305,opt,name=F_Sfixed64_optional,json=FSfixed64Optional" json:"F_Sfixed64_optional,omitempty"` + // Default-valued fields of all basic types + F_BoolDefaulted *bool `protobuf:"varint,40,opt,name=F_Bool_defaulted,json=FBoolDefaulted,def=1" json:"F_Bool_defaulted,omitempty"` + F_Int32Defaulted *int32 `protobuf:"varint,41,opt,name=F_Int32_defaulted,json=FInt32Defaulted,def=32" json:"F_Int32_defaulted,omitempty"` + F_Int64Defaulted *int64 `protobuf:"varint,42,opt,name=F_Int64_defaulted,json=FInt64Defaulted,def=64" json:"F_Int64_defaulted,omitempty"` + F_Fixed32Defaulted *uint32 `protobuf:"fixed32,43,opt,name=F_Fixed32_defaulted,json=FFixed32Defaulted,def=320" json:"F_Fixed32_defaulted,omitempty"` + F_Fixed64Defaulted *uint64 `protobuf:"fixed64,44,opt,name=F_Fixed64_defaulted,json=FFixed64Defaulted,def=640" json:"F_Fixed64_defaulted,omitempty"` + F_Uint32Defaulted *uint32 `protobuf:"varint,45,opt,name=F_Uint32_defaulted,json=FUint32Defaulted,def=3200" json:"F_Uint32_defaulted,omitempty"` + F_Uint64Defaulted *uint64 `protobuf:"varint,46,opt,name=F_Uint64_defaulted,json=FUint64Defaulted,def=6400" json:"F_Uint64_defaulted,omitempty"` + F_FloatDefaulted *float32 `protobuf:"fixed32,47,opt,name=F_Float_defaulted,json=FFloatDefaulted,def=314159" json:"F_Float_defaulted,omitempty"` + F_DoubleDefaulted *float64 `protobuf:"fixed64,48,opt,name=F_Double_defaulted,json=FDoubleDefaulted,def=271828" json:"F_Double_defaulted,omitempty"` + F_StringDefaulted *string `protobuf:"bytes,49,opt,name=F_String_defaulted,json=FStringDefaulted,def=hello, \"world!\"\n" json:"F_String_defaulted,omitempty"` + F_BytesDefaulted []byte `protobuf:"bytes,401,opt,name=F_Bytes_defaulted,json=FBytesDefaulted,def=Bignose" json:"F_Bytes_defaulted,omitempty"` + F_Sint32Defaulted *int32 `protobuf:"zigzag32,402,opt,name=F_Sint32_defaulted,json=FSint32Defaulted,def=-32" json:"F_Sint32_defaulted,omitempty"` + F_Sint64Defaulted *int64 `protobuf:"zigzag64,403,opt,name=F_Sint64_defaulted,json=FSint64Defaulted,def=-64" json:"F_Sint64_defaulted,omitempty"` + F_Sfixed32Defaulted *int32 `protobuf:"fixed32,404,opt,name=F_Sfixed32_defaulted,json=FSfixed32Defaulted,def=-32" json:"F_Sfixed32_defaulted,omitempty"` + F_Sfixed64Defaulted *int64 `protobuf:"fixed64,405,opt,name=F_Sfixed64_defaulted,json=FSfixed64Defaulted,def=-64" json:"F_Sfixed64_defaulted,omitempty"` + // Packed repeated fields (no string or bytes). + F_BoolRepeatedPacked []bool `protobuf:"varint,50,rep,packed,name=F_Bool_repeated_packed,json=FBoolRepeatedPacked" json:"F_Bool_repeated_packed,omitempty"` + F_Int32RepeatedPacked []int32 `protobuf:"varint,51,rep,packed,name=F_Int32_repeated_packed,json=FInt32RepeatedPacked" json:"F_Int32_repeated_packed,omitempty"` + F_Int64RepeatedPacked []int64 `protobuf:"varint,52,rep,packed,name=F_Int64_repeated_packed,json=FInt64RepeatedPacked" json:"F_Int64_repeated_packed,omitempty"` + F_Fixed32RepeatedPacked []uint32 `protobuf:"fixed32,53,rep,packed,name=F_Fixed32_repeated_packed,json=FFixed32RepeatedPacked" json:"F_Fixed32_repeated_packed,omitempty"` + F_Fixed64RepeatedPacked []uint64 `protobuf:"fixed64,54,rep,packed,name=F_Fixed64_repeated_packed,json=FFixed64RepeatedPacked" json:"F_Fixed64_repeated_packed,omitempty"` + F_Uint32RepeatedPacked []uint32 `protobuf:"varint,55,rep,packed,name=F_Uint32_repeated_packed,json=FUint32RepeatedPacked" json:"F_Uint32_repeated_packed,omitempty"` + F_Uint64RepeatedPacked []uint64 `protobuf:"varint,56,rep,packed,name=F_Uint64_repeated_packed,json=FUint64RepeatedPacked" json:"F_Uint64_repeated_packed,omitempty"` + F_FloatRepeatedPacked []float32 `protobuf:"fixed32,57,rep,packed,name=F_Float_repeated_packed,json=FFloatRepeatedPacked" json:"F_Float_repeated_packed,omitempty"` + F_DoubleRepeatedPacked []float64 `protobuf:"fixed64,58,rep,packed,name=F_Double_repeated_packed,json=FDoubleRepeatedPacked" json:"F_Double_repeated_packed,omitempty"` + F_Sint32RepeatedPacked []int32 `protobuf:"zigzag32,502,rep,packed,name=F_Sint32_repeated_packed,json=FSint32RepeatedPacked" json:"F_Sint32_repeated_packed,omitempty"` + F_Sint64RepeatedPacked []int64 `protobuf:"zigzag64,503,rep,packed,name=F_Sint64_repeated_packed,json=FSint64RepeatedPacked" json:"F_Sint64_repeated_packed,omitempty"` + F_Sfixed32RepeatedPacked []int32 `protobuf:"fixed32,504,rep,packed,name=F_Sfixed32_repeated_packed,json=FSfixed32RepeatedPacked" json:"F_Sfixed32_repeated_packed,omitempty"` + F_Sfixed64RepeatedPacked []int64 `protobuf:"fixed64,505,rep,packed,name=F_Sfixed64_repeated_packed,json=FSfixed64RepeatedPacked" json:"F_Sfixed64_repeated_packed,omitempty"` + Requiredgroup *GoTest_RequiredGroup `protobuf:"group,70,req,name=RequiredGroup,json=requiredgroup" json:"requiredgroup,omitempty"` + Repeatedgroup []*GoTest_RepeatedGroup `protobuf:"group,80,rep,name=RepeatedGroup,json=repeatedgroup" json:"repeatedgroup,omitempty"` + Optionalgroup *GoTest_OptionalGroup `protobuf:"group,90,opt,name=OptionalGroup,json=optionalgroup" json:"optionalgroup,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GoTest) Reset() { *m = GoTest{} } +func (m *GoTest) String() string { return proto.CompactTextString(m) } +func (*GoTest) ProtoMessage() {} +func (*GoTest) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{2} +} +func (m *GoTest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GoTest.Unmarshal(m, b) +} +func (m *GoTest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GoTest.Marshal(b, m, deterministic) +} +func (dst *GoTest) XXX_Merge(src proto.Message) { + xxx_messageInfo_GoTest.Merge(dst, src) +} +func (m *GoTest) XXX_Size() int { + return xxx_messageInfo_GoTest.Size(m) +} +func (m *GoTest) XXX_DiscardUnknown() { + xxx_messageInfo_GoTest.DiscardUnknown(m) +} + +var xxx_messageInfo_GoTest proto.InternalMessageInfo + +const Default_GoTest_F_BoolDefaulted bool = true +const Default_GoTest_F_Int32Defaulted int32 = 32 +const Default_GoTest_F_Int64Defaulted int64 = 64 +const Default_GoTest_F_Fixed32Defaulted uint32 = 320 +const Default_GoTest_F_Fixed64Defaulted uint64 = 640 +const Default_GoTest_F_Uint32Defaulted uint32 = 3200 +const Default_GoTest_F_Uint64Defaulted uint64 = 6400 +const Default_GoTest_F_FloatDefaulted float32 = 314159 +const Default_GoTest_F_DoubleDefaulted float64 = 271828 +const Default_GoTest_F_StringDefaulted string = "hello, \"world!\"\n" + +var Default_GoTest_F_BytesDefaulted []byte = []byte("Bignose") + +const Default_GoTest_F_Sint32Defaulted int32 = -32 +const Default_GoTest_F_Sint64Defaulted int64 = -64 +const Default_GoTest_F_Sfixed32Defaulted int32 = -32 +const Default_GoTest_F_Sfixed64Defaulted int64 = -64 + +func (m *GoTest) GetKind() GoTest_KIND { + if m != nil && m.Kind != nil { + return *m.Kind + } + return GoTest_VOID +} + +func (m *GoTest) GetTable() string { + if m != nil && m.Table != nil { + return *m.Table + } + return "" +} + +func (m *GoTest) GetParam() int32 { + if m != nil && m.Param != nil { + return *m.Param + } + return 0 +} + +func (m *GoTest) GetRequiredField() *GoTestField { + if m != nil { + return m.RequiredField + } + return nil +} + +func (m *GoTest) GetRepeatedField() []*GoTestField { + if m != nil { + return m.RepeatedField + } + return nil +} + +func (m *GoTest) GetOptionalField() *GoTestField { + if m != nil { + return m.OptionalField + } + return nil +} + +func (m *GoTest) GetF_BoolRequired() bool { + if m != nil && m.F_BoolRequired != nil { + return *m.F_BoolRequired + } + return false +} + +func (m *GoTest) GetF_Int32Required() int32 { + if m != nil && m.F_Int32Required != nil { + return *m.F_Int32Required + } + return 0 +} + +func (m *GoTest) GetF_Int64Required() int64 { + if m != nil && m.F_Int64Required != nil { + return *m.F_Int64Required + } + return 0 +} + +func (m *GoTest) GetF_Fixed32Required() uint32 { + if m != nil && m.F_Fixed32Required != nil { + return *m.F_Fixed32Required + } + return 0 +} + +func (m *GoTest) GetF_Fixed64Required() uint64 { + if m != nil && m.F_Fixed64Required != nil { + return *m.F_Fixed64Required + } + return 0 +} + +func (m *GoTest) GetF_Uint32Required() uint32 { + if m != nil && m.F_Uint32Required != nil { + return *m.F_Uint32Required + } + return 0 +} + +func (m *GoTest) GetF_Uint64Required() uint64 { + if m != nil && m.F_Uint64Required != nil { + return *m.F_Uint64Required + } + return 0 +} + +func (m *GoTest) GetF_FloatRequired() float32 { + if m != nil && m.F_FloatRequired != nil { + return *m.F_FloatRequired + } + return 0 +} + +func (m *GoTest) GetF_DoubleRequired() float64 { + if m != nil && m.F_DoubleRequired != nil { + return *m.F_DoubleRequired + } + return 0 +} + +func (m *GoTest) GetF_StringRequired() string { + if m != nil && m.F_StringRequired != nil { + return *m.F_StringRequired + } + return "" +} + +func (m *GoTest) GetF_BytesRequired() []byte { + if m != nil { + return m.F_BytesRequired + } + return nil +} + +func (m *GoTest) GetF_Sint32Required() int32 { + if m != nil && m.F_Sint32Required != nil { + return *m.F_Sint32Required + } + return 0 +} + +func (m *GoTest) GetF_Sint64Required() int64 { + if m != nil && m.F_Sint64Required != nil { + return *m.F_Sint64Required + } + return 0 +} + +func (m *GoTest) GetF_Sfixed32Required() int32 { + if m != nil && m.F_Sfixed32Required != nil { + return *m.F_Sfixed32Required + } + return 0 +} + +func (m *GoTest) GetF_Sfixed64Required() int64 { + if m != nil && m.F_Sfixed64Required != nil { + return *m.F_Sfixed64Required + } + return 0 +} + +func (m *GoTest) GetF_BoolRepeated() []bool { + if m != nil { + return m.F_BoolRepeated + } + return nil +} + +func (m *GoTest) GetF_Int32Repeated() []int32 { + if m != nil { + return m.F_Int32Repeated + } + return nil +} + +func (m *GoTest) GetF_Int64Repeated() []int64 { + if m != nil { + return m.F_Int64Repeated + } + return nil +} + +func (m *GoTest) GetF_Fixed32Repeated() []uint32 { + if m != nil { + return m.F_Fixed32Repeated + } + return nil +} + +func (m *GoTest) GetF_Fixed64Repeated() []uint64 { + if m != nil { + return m.F_Fixed64Repeated + } + return nil +} + +func (m *GoTest) GetF_Uint32Repeated() []uint32 { + if m != nil { + return m.F_Uint32Repeated + } + return nil +} + +func (m *GoTest) GetF_Uint64Repeated() []uint64 { + if m != nil { + return m.F_Uint64Repeated + } + return nil +} + +func (m *GoTest) GetF_FloatRepeated() []float32 { + if m != nil { + return m.F_FloatRepeated + } + return nil +} + +func (m *GoTest) GetF_DoubleRepeated() []float64 { + if m != nil { + return m.F_DoubleRepeated + } + return nil +} + +func (m *GoTest) GetF_StringRepeated() []string { + if m != nil { + return m.F_StringRepeated + } + return nil +} + +func (m *GoTest) GetF_BytesRepeated() [][]byte { + if m != nil { + return m.F_BytesRepeated + } + return nil +} + +func (m *GoTest) GetF_Sint32Repeated() []int32 { + if m != nil { + return m.F_Sint32Repeated + } + return nil +} + +func (m *GoTest) GetF_Sint64Repeated() []int64 { + if m != nil { + return m.F_Sint64Repeated + } + return nil +} + +func (m *GoTest) GetF_Sfixed32Repeated() []int32 { + if m != nil { + return m.F_Sfixed32Repeated + } + return nil +} + +func (m *GoTest) GetF_Sfixed64Repeated() []int64 { + if m != nil { + return m.F_Sfixed64Repeated + } + return nil +} + +func (m *GoTest) GetF_BoolOptional() bool { + if m != nil && m.F_BoolOptional != nil { + return *m.F_BoolOptional + } + return false +} + +func (m *GoTest) GetF_Int32Optional() int32 { + if m != nil && m.F_Int32Optional != nil { + return *m.F_Int32Optional + } + return 0 +} + +func (m *GoTest) GetF_Int64Optional() int64 { + if m != nil && m.F_Int64Optional != nil { + return *m.F_Int64Optional + } + return 0 +} + +func (m *GoTest) GetF_Fixed32Optional() uint32 { + if m != nil && m.F_Fixed32Optional != nil { + return *m.F_Fixed32Optional + } + return 0 +} + +func (m *GoTest) GetF_Fixed64Optional() uint64 { + if m != nil && m.F_Fixed64Optional != nil { + return *m.F_Fixed64Optional + } + return 0 +} + +func (m *GoTest) GetF_Uint32Optional() uint32 { + if m != nil && m.F_Uint32Optional != nil { + return *m.F_Uint32Optional + } + return 0 +} + +func (m *GoTest) GetF_Uint64Optional() uint64 { + if m != nil && m.F_Uint64Optional != nil { + return *m.F_Uint64Optional + } + return 0 +} + +func (m *GoTest) GetF_FloatOptional() float32 { + if m != nil && m.F_FloatOptional != nil { + return *m.F_FloatOptional + } + return 0 +} + +func (m *GoTest) GetF_DoubleOptional() float64 { + if m != nil && m.F_DoubleOptional != nil { + return *m.F_DoubleOptional + } + return 0 +} + +func (m *GoTest) GetF_StringOptional() string { + if m != nil && m.F_StringOptional != nil { + return *m.F_StringOptional + } + return "" +} + +func (m *GoTest) GetF_BytesOptional() []byte { + if m != nil { + return m.F_BytesOptional + } + return nil +} + +func (m *GoTest) GetF_Sint32Optional() int32 { + if m != nil && m.F_Sint32Optional != nil { + return *m.F_Sint32Optional + } + return 0 +} + +func (m *GoTest) GetF_Sint64Optional() int64 { + if m != nil && m.F_Sint64Optional != nil { + return *m.F_Sint64Optional + } + return 0 +} + +func (m *GoTest) GetF_Sfixed32Optional() int32 { + if m != nil && m.F_Sfixed32Optional != nil { + return *m.F_Sfixed32Optional + } + return 0 +} + +func (m *GoTest) GetF_Sfixed64Optional() int64 { + if m != nil && m.F_Sfixed64Optional != nil { + return *m.F_Sfixed64Optional + } + return 0 +} + +func (m *GoTest) GetF_BoolDefaulted() bool { + if m != nil && m.F_BoolDefaulted != nil { + return *m.F_BoolDefaulted + } + return Default_GoTest_F_BoolDefaulted +} + +func (m *GoTest) GetF_Int32Defaulted() int32 { + if m != nil && m.F_Int32Defaulted != nil { + return *m.F_Int32Defaulted + } + return Default_GoTest_F_Int32Defaulted +} + +func (m *GoTest) GetF_Int64Defaulted() int64 { + if m != nil && m.F_Int64Defaulted != nil { + return *m.F_Int64Defaulted + } + return Default_GoTest_F_Int64Defaulted +} + +func (m *GoTest) GetF_Fixed32Defaulted() uint32 { + if m != nil && m.F_Fixed32Defaulted != nil { + return *m.F_Fixed32Defaulted + } + return Default_GoTest_F_Fixed32Defaulted +} + +func (m *GoTest) GetF_Fixed64Defaulted() uint64 { + if m != nil && m.F_Fixed64Defaulted != nil { + return *m.F_Fixed64Defaulted + } + return Default_GoTest_F_Fixed64Defaulted +} + +func (m *GoTest) GetF_Uint32Defaulted() uint32 { + if m != nil && m.F_Uint32Defaulted != nil { + return *m.F_Uint32Defaulted + } + return Default_GoTest_F_Uint32Defaulted +} + +func (m *GoTest) GetF_Uint64Defaulted() uint64 { + if m != nil && m.F_Uint64Defaulted != nil { + return *m.F_Uint64Defaulted + } + return Default_GoTest_F_Uint64Defaulted +} + +func (m *GoTest) GetF_FloatDefaulted() float32 { + if m != nil && m.F_FloatDefaulted != nil { + return *m.F_FloatDefaulted + } + return Default_GoTest_F_FloatDefaulted +} + +func (m *GoTest) GetF_DoubleDefaulted() float64 { + if m != nil && m.F_DoubleDefaulted != nil { + return *m.F_DoubleDefaulted + } + return Default_GoTest_F_DoubleDefaulted +} + +func (m *GoTest) GetF_StringDefaulted() string { + if m != nil && m.F_StringDefaulted != nil { + return *m.F_StringDefaulted + } + return Default_GoTest_F_StringDefaulted +} + +func (m *GoTest) GetF_BytesDefaulted() []byte { + if m != nil && m.F_BytesDefaulted != nil { + return m.F_BytesDefaulted + } + return append([]byte(nil), Default_GoTest_F_BytesDefaulted...) +} + +func (m *GoTest) GetF_Sint32Defaulted() int32 { + if m != nil && m.F_Sint32Defaulted != nil { + return *m.F_Sint32Defaulted + } + return Default_GoTest_F_Sint32Defaulted +} + +func (m *GoTest) GetF_Sint64Defaulted() int64 { + if m != nil && m.F_Sint64Defaulted != nil { + return *m.F_Sint64Defaulted + } + return Default_GoTest_F_Sint64Defaulted +} + +func (m *GoTest) GetF_Sfixed32Defaulted() int32 { + if m != nil && m.F_Sfixed32Defaulted != nil { + return *m.F_Sfixed32Defaulted + } + return Default_GoTest_F_Sfixed32Defaulted +} + +func (m *GoTest) GetF_Sfixed64Defaulted() int64 { + if m != nil && m.F_Sfixed64Defaulted != nil { + return *m.F_Sfixed64Defaulted + } + return Default_GoTest_F_Sfixed64Defaulted +} + +func (m *GoTest) GetF_BoolRepeatedPacked() []bool { + if m != nil { + return m.F_BoolRepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_Int32RepeatedPacked() []int32 { + if m != nil { + return m.F_Int32RepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_Int64RepeatedPacked() []int64 { + if m != nil { + return m.F_Int64RepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_Fixed32RepeatedPacked() []uint32 { + if m != nil { + return m.F_Fixed32RepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_Fixed64RepeatedPacked() []uint64 { + if m != nil { + return m.F_Fixed64RepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_Uint32RepeatedPacked() []uint32 { + if m != nil { + return m.F_Uint32RepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_Uint64RepeatedPacked() []uint64 { + if m != nil { + return m.F_Uint64RepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_FloatRepeatedPacked() []float32 { + if m != nil { + return m.F_FloatRepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_DoubleRepeatedPacked() []float64 { + if m != nil { + return m.F_DoubleRepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_Sint32RepeatedPacked() []int32 { + if m != nil { + return m.F_Sint32RepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_Sint64RepeatedPacked() []int64 { + if m != nil { + return m.F_Sint64RepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_Sfixed32RepeatedPacked() []int32 { + if m != nil { + return m.F_Sfixed32RepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_Sfixed64RepeatedPacked() []int64 { + if m != nil { + return m.F_Sfixed64RepeatedPacked + } + return nil +} + +func (m *GoTest) GetRequiredgroup() *GoTest_RequiredGroup { + if m != nil { + return m.Requiredgroup + } + return nil +} + +func (m *GoTest) GetRepeatedgroup() []*GoTest_RepeatedGroup { + if m != nil { + return m.Repeatedgroup + } + return nil +} + +func (m *GoTest) GetOptionalgroup() *GoTest_OptionalGroup { + if m != nil { + return m.Optionalgroup + } + return nil +} + +// Required, repeated, and optional groups. +type GoTest_RequiredGroup struct { + RequiredField *string `protobuf:"bytes,71,req,name=RequiredField" json:"RequiredField,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GoTest_RequiredGroup) Reset() { *m = GoTest_RequiredGroup{} } +func (m *GoTest_RequiredGroup) String() string { return proto.CompactTextString(m) } +func (*GoTest_RequiredGroup) ProtoMessage() {} +func (*GoTest_RequiredGroup) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{2, 0} +} +func (m *GoTest_RequiredGroup) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GoTest_RequiredGroup.Unmarshal(m, b) +} +func (m *GoTest_RequiredGroup) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GoTest_RequiredGroup.Marshal(b, m, deterministic) +} +func (dst *GoTest_RequiredGroup) XXX_Merge(src proto.Message) { + xxx_messageInfo_GoTest_RequiredGroup.Merge(dst, src) +} +func (m *GoTest_RequiredGroup) XXX_Size() int { + return xxx_messageInfo_GoTest_RequiredGroup.Size(m) +} +func (m *GoTest_RequiredGroup) XXX_DiscardUnknown() { + xxx_messageInfo_GoTest_RequiredGroup.DiscardUnknown(m) +} + +var xxx_messageInfo_GoTest_RequiredGroup proto.InternalMessageInfo + +func (m *GoTest_RequiredGroup) GetRequiredField() string { + if m != nil && m.RequiredField != nil { + return *m.RequiredField + } + return "" +} + +type GoTest_RepeatedGroup struct { + RequiredField *string `protobuf:"bytes,81,req,name=RequiredField" json:"RequiredField,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GoTest_RepeatedGroup) Reset() { *m = GoTest_RepeatedGroup{} } +func (m *GoTest_RepeatedGroup) String() string { return proto.CompactTextString(m) } +func (*GoTest_RepeatedGroup) ProtoMessage() {} +func (*GoTest_RepeatedGroup) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{2, 1} +} +func (m *GoTest_RepeatedGroup) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GoTest_RepeatedGroup.Unmarshal(m, b) +} +func (m *GoTest_RepeatedGroup) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GoTest_RepeatedGroup.Marshal(b, m, deterministic) +} +func (dst *GoTest_RepeatedGroup) XXX_Merge(src proto.Message) { + xxx_messageInfo_GoTest_RepeatedGroup.Merge(dst, src) +} +func (m *GoTest_RepeatedGroup) XXX_Size() int { + return xxx_messageInfo_GoTest_RepeatedGroup.Size(m) +} +func (m *GoTest_RepeatedGroup) XXX_DiscardUnknown() { + xxx_messageInfo_GoTest_RepeatedGroup.DiscardUnknown(m) +} + +var xxx_messageInfo_GoTest_RepeatedGroup proto.InternalMessageInfo + +func (m *GoTest_RepeatedGroup) GetRequiredField() string { + if m != nil && m.RequiredField != nil { + return *m.RequiredField + } + return "" +} + +type GoTest_OptionalGroup struct { + RequiredField *string `protobuf:"bytes,91,req,name=RequiredField" json:"RequiredField,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GoTest_OptionalGroup) Reset() { *m = GoTest_OptionalGroup{} } +func (m *GoTest_OptionalGroup) String() string { return proto.CompactTextString(m) } +func (*GoTest_OptionalGroup) ProtoMessage() {} +func (*GoTest_OptionalGroup) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{2, 2} +} +func (m *GoTest_OptionalGroup) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GoTest_OptionalGroup.Unmarshal(m, b) +} +func (m *GoTest_OptionalGroup) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GoTest_OptionalGroup.Marshal(b, m, deterministic) +} +func (dst *GoTest_OptionalGroup) XXX_Merge(src proto.Message) { + xxx_messageInfo_GoTest_OptionalGroup.Merge(dst, src) +} +func (m *GoTest_OptionalGroup) XXX_Size() int { + return xxx_messageInfo_GoTest_OptionalGroup.Size(m) +} +func (m *GoTest_OptionalGroup) XXX_DiscardUnknown() { + xxx_messageInfo_GoTest_OptionalGroup.DiscardUnknown(m) +} + +var xxx_messageInfo_GoTest_OptionalGroup proto.InternalMessageInfo + +func (m *GoTest_OptionalGroup) GetRequiredField() string { + if m != nil && m.RequiredField != nil { + return *m.RequiredField + } + return "" +} + +// For testing a group containing a required field. +type GoTestRequiredGroupField struct { + Group *GoTestRequiredGroupField_Group `protobuf:"group,1,req,name=Group,json=group" json:"group,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GoTestRequiredGroupField) Reset() { *m = GoTestRequiredGroupField{} } +func (m *GoTestRequiredGroupField) String() string { return proto.CompactTextString(m) } +func (*GoTestRequiredGroupField) ProtoMessage() {} +func (*GoTestRequiredGroupField) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{3} +} +func (m *GoTestRequiredGroupField) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GoTestRequiredGroupField.Unmarshal(m, b) +} +func (m *GoTestRequiredGroupField) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GoTestRequiredGroupField.Marshal(b, m, deterministic) +} +func (dst *GoTestRequiredGroupField) XXX_Merge(src proto.Message) { + xxx_messageInfo_GoTestRequiredGroupField.Merge(dst, src) +} +func (m *GoTestRequiredGroupField) XXX_Size() int { + return xxx_messageInfo_GoTestRequiredGroupField.Size(m) +} +func (m *GoTestRequiredGroupField) XXX_DiscardUnknown() { + xxx_messageInfo_GoTestRequiredGroupField.DiscardUnknown(m) +} + +var xxx_messageInfo_GoTestRequiredGroupField proto.InternalMessageInfo + +func (m *GoTestRequiredGroupField) GetGroup() *GoTestRequiredGroupField_Group { + if m != nil { + return m.Group + } + return nil +} + +type GoTestRequiredGroupField_Group struct { + Field *int32 `protobuf:"varint,2,req,name=Field" json:"Field,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GoTestRequiredGroupField_Group) Reset() { *m = GoTestRequiredGroupField_Group{} } +func (m *GoTestRequiredGroupField_Group) String() string { return proto.CompactTextString(m) } +func (*GoTestRequiredGroupField_Group) ProtoMessage() {} +func (*GoTestRequiredGroupField_Group) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{3, 0} +} +func (m *GoTestRequiredGroupField_Group) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GoTestRequiredGroupField_Group.Unmarshal(m, b) +} +func (m *GoTestRequiredGroupField_Group) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GoTestRequiredGroupField_Group.Marshal(b, m, deterministic) +} +func (dst *GoTestRequiredGroupField_Group) XXX_Merge(src proto.Message) { + xxx_messageInfo_GoTestRequiredGroupField_Group.Merge(dst, src) +} +func (m *GoTestRequiredGroupField_Group) XXX_Size() int { + return xxx_messageInfo_GoTestRequiredGroupField_Group.Size(m) +} +func (m *GoTestRequiredGroupField_Group) XXX_DiscardUnknown() { + xxx_messageInfo_GoTestRequiredGroupField_Group.DiscardUnknown(m) +} + +var xxx_messageInfo_GoTestRequiredGroupField_Group proto.InternalMessageInfo + +func (m *GoTestRequiredGroupField_Group) GetField() int32 { + if m != nil && m.Field != nil { + return *m.Field + } + return 0 +} + +// For testing skipping of unrecognized fields. +// Numbers are all big, larger than tag numbers in GoTestField, +// the message used in the corresponding test. +type GoSkipTest struct { + SkipInt32 *int32 `protobuf:"varint,11,req,name=skip_int32,json=skipInt32" json:"skip_int32,omitempty"` + SkipFixed32 *uint32 `protobuf:"fixed32,12,req,name=skip_fixed32,json=skipFixed32" json:"skip_fixed32,omitempty"` + SkipFixed64 *uint64 `protobuf:"fixed64,13,req,name=skip_fixed64,json=skipFixed64" json:"skip_fixed64,omitempty"` + SkipString *string `protobuf:"bytes,14,req,name=skip_string,json=skipString" json:"skip_string,omitempty"` + Skipgroup *GoSkipTest_SkipGroup `protobuf:"group,15,req,name=SkipGroup,json=skipgroup" json:"skipgroup,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GoSkipTest) Reset() { *m = GoSkipTest{} } +func (m *GoSkipTest) String() string { return proto.CompactTextString(m) } +func (*GoSkipTest) ProtoMessage() {} +func (*GoSkipTest) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{4} +} +func (m *GoSkipTest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GoSkipTest.Unmarshal(m, b) +} +func (m *GoSkipTest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GoSkipTest.Marshal(b, m, deterministic) +} +func (dst *GoSkipTest) XXX_Merge(src proto.Message) { + xxx_messageInfo_GoSkipTest.Merge(dst, src) +} +func (m *GoSkipTest) XXX_Size() int { + return xxx_messageInfo_GoSkipTest.Size(m) +} +func (m *GoSkipTest) XXX_DiscardUnknown() { + xxx_messageInfo_GoSkipTest.DiscardUnknown(m) +} + +var xxx_messageInfo_GoSkipTest proto.InternalMessageInfo + +func (m *GoSkipTest) GetSkipInt32() int32 { + if m != nil && m.SkipInt32 != nil { + return *m.SkipInt32 + } + return 0 +} + +func (m *GoSkipTest) GetSkipFixed32() uint32 { + if m != nil && m.SkipFixed32 != nil { + return *m.SkipFixed32 + } + return 0 +} + +func (m *GoSkipTest) GetSkipFixed64() uint64 { + if m != nil && m.SkipFixed64 != nil { + return *m.SkipFixed64 + } + return 0 +} + +func (m *GoSkipTest) GetSkipString() string { + if m != nil && m.SkipString != nil { + return *m.SkipString + } + return "" +} + +func (m *GoSkipTest) GetSkipgroup() *GoSkipTest_SkipGroup { + if m != nil { + return m.Skipgroup + } + return nil +} + +type GoSkipTest_SkipGroup struct { + GroupInt32 *int32 `protobuf:"varint,16,req,name=group_int32,json=groupInt32" json:"group_int32,omitempty"` + GroupString *string `protobuf:"bytes,17,req,name=group_string,json=groupString" json:"group_string,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GoSkipTest_SkipGroup) Reset() { *m = GoSkipTest_SkipGroup{} } +func (m *GoSkipTest_SkipGroup) String() string { return proto.CompactTextString(m) } +func (*GoSkipTest_SkipGroup) ProtoMessage() {} +func (*GoSkipTest_SkipGroup) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{4, 0} +} +func (m *GoSkipTest_SkipGroup) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GoSkipTest_SkipGroup.Unmarshal(m, b) +} +func (m *GoSkipTest_SkipGroup) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GoSkipTest_SkipGroup.Marshal(b, m, deterministic) +} +func (dst *GoSkipTest_SkipGroup) XXX_Merge(src proto.Message) { + xxx_messageInfo_GoSkipTest_SkipGroup.Merge(dst, src) +} +func (m *GoSkipTest_SkipGroup) XXX_Size() int { + return xxx_messageInfo_GoSkipTest_SkipGroup.Size(m) +} +func (m *GoSkipTest_SkipGroup) XXX_DiscardUnknown() { + xxx_messageInfo_GoSkipTest_SkipGroup.DiscardUnknown(m) +} + +var xxx_messageInfo_GoSkipTest_SkipGroup proto.InternalMessageInfo + +func (m *GoSkipTest_SkipGroup) GetGroupInt32() int32 { + if m != nil && m.GroupInt32 != nil { + return *m.GroupInt32 + } + return 0 +} + +func (m *GoSkipTest_SkipGroup) GetGroupString() string { + if m != nil && m.GroupString != nil { + return *m.GroupString + } + return "" +} + +// For testing packed/non-packed decoder switching. +// A serialized instance of one should be deserializable as the other. +type NonPackedTest struct { + A []int32 `protobuf:"varint,1,rep,name=a" json:"a,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *NonPackedTest) Reset() { *m = NonPackedTest{} } +func (m *NonPackedTest) String() string { return proto.CompactTextString(m) } +func (*NonPackedTest) ProtoMessage() {} +func (*NonPackedTest) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{5} +} +func (m *NonPackedTest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_NonPackedTest.Unmarshal(m, b) +} +func (m *NonPackedTest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_NonPackedTest.Marshal(b, m, deterministic) +} +func (dst *NonPackedTest) XXX_Merge(src proto.Message) { + xxx_messageInfo_NonPackedTest.Merge(dst, src) +} +func (m *NonPackedTest) XXX_Size() int { + return xxx_messageInfo_NonPackedTest.Size(m) +} +func (m *NonPackedTest) XXX_DiscardUnknown() { + xxx_messageInfo_NonPackedTest.DiscardUnknown(m) +} + +var xxx_messageInfo_NonPackedTest proto.InternalMessageInfo + +func (m *NonPackedTest) GetA() []int32 { + if m != nil { + return m.A + } + return nil +} + +type PackedTest struct { + B []int32 `protobuf:"varint,1,rep,packed,name=b" json:"b,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *PackedTest) Reset() { *m = PackedTest{} } +func (m *PackedTest) String() string { return proto.CompactTextString(m) } +func (*PackedTest) ProtoMessage() {} +func (*PackedTest) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{6} +} +func (m *PackedTest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_PackedTest.Unmarshal(m, b) +} +func (m *PackedTest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_PackedTest.Marshal(b, m, deterministic) +} +func (dst *PackedTest) XXX_Merge(src proto.Message) { + xxx_messageInfo_PackedTest.Merge(dst, src) +} +func (m *PackedTest) XXX_Size() int { + return xxx_messageInfo_PackedTest.Size(m) +} +func (m *PackedTest) XXX_DiscardUnknown() { + xxx_messageInfo_PackedTest.DiscardUnknown(m) +} + +var xxx_messageInfo_PackedTest proto.InternalMessageInfo + +func (m *PackedTest) GetB() []int32 { + if m != nil { + return m.B + } + return nil +} + +type MaxTag struct { + // Maximum possible tag number. + LastField *string `protobuf:"bytes,536870911,opt,name=last_field,json=lastField" json:"last_field,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MaxTag) Reset() { *m = MaxTag{} } +func (m *MaxTag) String() string { return proto.CompactTextString(m) } +func (*MaxTag) ProtoMessage() {} +func (*MaxTag) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{7} +} +func (m *MaxTag) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MaxTag.Unmarshal(m, b) +} +func (m *MaxTag) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MaxTag.Marshal(b, m, deterministic) +} +func (dst *MaxTag) XXX_Merge(src proto.Message) { + xxx_messageInfo_MaxTag.Merge(dst, src) +} +func (m *MaxTag) XXX_Size() int { + return xxx_messageInfo_MaxTag.Size(m) +} +func (m *MaxTag) XXX_DiscardUnknown() { + xxx_messageInfo_MaxTag.DiscardUnknown(m) +} + +var xxx_messageInfo_MaxTag proto.InternalMessageInfo + +func (m *MaxTag) GetLastField() string { + if m != nil && m.LastField != nil { + return *m.LastField + } + return "" +} + +type OldMessage struct { + Nested *OldMessage_Nested `protobuf:"bytes,1,opt,name=nested" json:"nested,omitempty"` + Num *int32 `protobuf:"varint,2,opt,name=num" json:"num,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *OldMessage) Reset() { *m = OldMessage{} } +func (m *OldMessage) String() string { return proto.CompactTextString(m) } +func (*OldMessage) ProtoMessage() {} +func (*OldMessage) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{8} +} +func (m *OldMessage) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_OldMessage.Unmarshal(m, b) +} +func (m *OldMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_OldMessage.Marshal(b, m, deterministic) +} +func (dst *OldMessage) XXX_Merge(src proto.Message) { + xxx_messageInfo_OldMessage.Merge(dst, src) +} +func (m *OldMessage) XXX_Size() int { + return xxx_messageInfo_OldMessage.Size(m) +} +func (m *OldMessage) XXX_DiscardUnknown() { + xxx_messageInfo_OldMessage.DiscardUnknown(m) +} + +var xxx_messageInfo_OldMessage proto.InternalMessageInfo + +func (m *OldMessage) GetNested() *OldMessage_Nested { + if m != nil { + return m.Nested + } + return nil +} + +func (m *OldMessage) GetNum() int32 { + if m != nil && m.Num != nil { + return *m.Num + } + return 0 +} + +type OldMessage_Nested struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *OldMessage_Nested) Reset() { *m = OldMessage_Nested{} } +func (m *OldMessage_Nested) String() string { return proto.CompactTextString(m) } +func (*OldMessage_Nested) ProtoMessage() {} +func (*OldMessage_Nested) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{8, 0} +} +func (m *OldMessage_Nested) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_OldMessage_Nested.Unmarshal(m, b) +} +func (m *OldMessage_Nested) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_OldMessage_Nested.Marshal(b, m, deterministic) +} +func (dst *OldMessage_Nested) XXX_Merge(src proto.Message) { + xxx_messageInfo_OldMessage_Nested.Merge(dst, src) +} +func (m *OldMessage_Nested) XXX_Size() int { + return xxx_messageInfo_OldMessage_Nested.Size(m) +} +func (m *OldMessage_Nested) XXX_DiscardUnknown() { + xxx_messageInfo_OldMessage_Nested.DiscardUnknown(m) +} + +var xxx_messageInfo_OldMessage_Nested proto.InternalMessageInfo + +func (m *OldMessage_Nested) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +// NewMessage is wire compatible with OldMessage; +// imagine it as a future version. +type NewMessage struct { + Nested *NewMessage_Nested `protobuf:"bytes,1,opt,name=nested" json:"nested,omitempty"` + // This is an int32 in OldMessage. + Num *int64 `protobuf:"varint,2,opt,name=num" json:"num,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *NewMessage) Reset() { *m = NewMessage{} } +func (m *NewMessage) String() string { return proto.CompactTextString(m) } +func (*NewMessage) ProtoMessage() {} +func (*NewMessage) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{9} +} +func (m *NewMessage) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_NewMessage.Unmarshal(m, b) +} +func (m *NewMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_NewMessage.Marshal(b, m, deterministic) +} +func (dst *NewMessage) XXX_Merge(src proto.Message) { + xxx_messageInfo_NewMessage.Merge(dst, src) +} +func (m *NewMessage) XXX_Size() int { + return xxx_messageInfo_NewMessage.Size(m) +} +func (m *NewMessage) XXX_DiscardUnknown() { + xxx_messageInfo_NewMessage.DiscardUnknown(m) +} + +var xxx_messageInfo_NewMessage proto.InternalMessageInfo + +func (m *NewMessage) GetNested() *NewMessage_Nested { + if m != nil { + return m.Nested + } + return nil +} + +func (m *NewMessage) GetNum() int64 { + if m != nil && m.Num != nil { + return *m.Num + } + return 0 +} + +type NewMessage_Nested struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + FoodGroup *string `protobuf:"bytes,2,opt,name=food_group,json=foodGroup" json:"food_group,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *NewMessage_Nested) Reset() { *m = NewMessage_Nested{} } +func (m *NewMessage_Nested) String() string { return proto.CompactTextString(m) } +func (*NewMessage_Nested) ProtoMessage() {} +func (*NewMessage_Nested) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{9, 0} +} +func (m *NewMessage_Nested) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_NewMessage_Nested.Unmarshal(m, b) +} +func (m *NewMessage_Nested) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_NewMessage_Nested.Marshal(b, m, deterministic) +} +func (dst *NewMessage_Nested) XXX_Merge(src proto.Message) { + xxx_messageInfo_NewMessage_Nested.Merge(dst, src) +} +func (m *NewMessage_Nested) XXX_Size() int { + return xxx_messageInfo_NewMessage_Nested.Size(m) +} +func (m *NewMessage_Nested) XXX_DiscardUnknown() { + xxx_messageInfo_NewMessage_Nested.DiscardUnknown(m) +} + +var xxx_messageInfo_NewMessage_Nested proto.InternalMessageInfo + +func (m *NewMessage_Nested) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *NewMessage_Nested) GetFoodGroup() string { + if m != nil && m.FoodGroup != nil { + return *m.FoodGroup + } + return "" +} + +type InnerMessage struct { + Host *string `protobuf:"bytes,1,req,name=host" json:"host,omitempty"` + Port *int32 `protobuf:"varint,2,opt,name=port,def=4000" json:"port,omitempty"` + Connected *bool `protobuf:"varint,3,opt,name=connected" json:"connected,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *InnerMessage) Reset() { *m = InnerMessage{} } +func (m *InnerMessage) String() string { return proto.CompactTextString(m) } +func (*InnerMessage) ProtoMessage() {} +func (*InnerMessage) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{10} +} +func (m *InnerMessage) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_InnerMessage.Unmarshal(m, b) +} +func (m *InnerMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_InnerMessage.Marshal(b, m, deterministic) +} +func (dst *InnerMessage) XXX_Merge(src proto.Message) { + xxx_messageInfo_InnerMessage.Merge(dst, src) +} +func (m *InnerMessage) XXX_Size() int { + return xxx_messageInfo_InnerMessage.Size(m) +} +func (m *InnerMessage) XXX_DiscardUnknown() { + xxx_messageInfo_InnerMessage.DiscardUnknown(m) +} + +var xxx_messageInfo_InnerMessage proto.InternalMessageInfo + +const Default_InnerMessage_Port int32 = 4000 + +func (m *InnerMessage) GetHost() string { + if m != nil && m.Host != nil { + return *m.Host + } + return "" +} + +func (m *InnerMessage) GetPort() int32 { + if m != nil && m.Port != nil { + return *m.Port + } + return Default_InnerMessage_Port +} + +func (m *InnerMessage) GetConnected() bool { + if m != nil && m.Connected != nil { + return *m.Connected + } + return false +} + +type OtherMessage struct { + Key *int64 `protobuf:"varint,1,opt,name=key" json:"key,omitempty"` + Value []byte `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` + Weight *float32 `protobuf:"fixed32,3,opt,name=weight" json:"weight,omitempty"` + Inner *InnerMessage `protobuf:"bytes,4,opt,name=inner" json:"inner,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *OtherMessage) Reset() { *m = OtherMessage{} } +func (m *OtherMessage) String() string { return proto.CompactTextString(m) } +func (*OtherMessage) ProtoMessage() {} +func (*OtherMessage) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{11} +} + +var extRange_OtherMessage = []proto.ExtensionRange{ + {Start: 100, End: 536870911}, +} + +func (*OtherMessage) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_OtherMessage +} +func (m *OtherMessage) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_OtherMessage.Unmarshal(m, b) +} +func (m *OtherMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_OtherMessage.Marshal(b, m, deterministic) +} +func (dst *OtherMessage) XXX_Merge(src proto.Message) { + xxx_messageInfo_OtherMessage.Merge(dst, src) +} +func (m *OtherMessage) XXX_Size() int { + return xxx_messageInfo_OtherMessage.Size(m) +} +func (m *OtherMessage) XXX_DiscardUnknown() { + xxx_messageInfo_OtherMessage.DiscardUnknown(m) +} + +var xxx_messageInfo_OtherMessage proto.InternalMessageInfo + +func (m *OtherMessage) GetKey() int64 { + if m != nil && m.Key != nil { + return *m.Key + } + return 0 +} + +func (m *OtherMessage) GetValue() []byte { + if m != nil { + return m.Value + } + return nil +} + +func (m *OtherMessage) GetWeight() float32 { + if m != nil && m.Weight != nil { + return *m.Weight + } + return 0 +} + +func (m *OtherMessage) GetInner() *InnerMessage { + if m != nil { + return m.Inner + } + return nil +} + +type RequiredInnerMessage struct { + LeoFinallyWonAnOscar *InnerMessage `protobuf:"bytes,1,req,name=leo_finally_won_an_oscar,json=leoFinallyWonAnOscar" json:"leo_finally_won_an_oscar,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *RequiredInnerMessage) Reset() { *m = RequiredInnerMessage{} } +func (m *RequiredInnerMessage) String() string { return proto.CompactTextString(m) } +func (*RequiredInnerMessage) ProtoMessage() {} +func (*RequiredInnerMessage) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{12} +} +func (m *RequiredInnerMessage) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_RequiredInnerMessage.Unmarshal(m, b) +} +func (m *RequiredInnerMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_RequiredInnerMessage.Marshal(b, m, deterministic) +} +func (dst *RequiredInnerMessage) XXX_Merge(src proto.Message) { + xxx_messageInfo_RequiredInnerMessage.Merge(dst, src) +} +func (m *RequiredInnerMessage) XXX_Size() int { + return xxx_messageInfo_RequiredInnerMessage.Size(m) +} +func (m *RequiredInnerMessage) XXX_DiscardUnknown() { + xxx_messageInfo_RequiredInnerMessage.DiscardUnknown(m) +} + +var xxx_messageInfo_RequiredInnerMessage proto.InternalMessageInfo + +func (m *RequiredInnerMessage) GetLeoFinallyWonAnOscar() *InnerMessage { + if m != nil { + return m.LeoFinallyWonAnOscar + } + return nil +} + +type MyMessage struct { + Count *int32 `protobuf:"varint,1,req,name=count" json:"count,omitempty"` + Name *string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"` + Quote *string `protobuf:"bytes,3,opt,name=quote" json:"quote,omitempty"` + Pet []string `protobuf:"bytes,4,rep,name=pet" json:"pet,omitempty"` + Inner *InnerMessage `protobuf:"bytes,5,opt,name=inner" json:"inner,omitempty"` + Others []*OtherMessage `protobuf:"bytes,6,rep,name=others" json:"others,omitempty"` + WeMustGoDeeper *RequiredInnerMessage `protobuf:"bytes,13,opt,name=we_must_go_deeper,json=weMustGoDeeper" json:"we_must_go_deeper,omitempty"` + RepInner []*InnerMessage `protobuf:"bytes,12,rep,name=rep_inner,json=repInner" json:"rep_inner,omitempty"` + Bikeshed *MyMessage_Color `protobuf:"varint,7,opt,name=bikeshed,enum=test_proto.MyMessage_Color" json:"bikeshed,omitempty"` + Somegroup *MyMessage_SomeGroup `protobuf:"group,8,opt,name=SomeGroup,json=somegroup" json:"somegroup,omitempty"` + // This field becomes [][]byte in the generated code. + RepBytes [][]byte `protobuf:"bytes,10,rep,name=rep_bytes,json=repBytes" json:"rep_bytes,omitempty"` + Bigfloat *float64 `protobuf:"fixed64,11,opt,name=bigfloat" json:"bigfloat,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MyMessage) Reset() { *m = MyMessage{} } +func (m *MyMessage) String() string { return proto.CompactTextString(m) } +func (*MyMessage) ProtoMessage() {} +func (*MyMessage) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{13} +} + +var extRange_MyMessage = []proto.ExtensionRange{ + {Start: 100, End: 536870911}, +} + +func (*MyMessage) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_MyMessage +} +func (m *MyMessage) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MyMessage.Unmarshal(m, b) +} +func (m *MyMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MyMessage.Marshal(b, m, deterministic) +} +func (dst *MyMessage) XXX_Merge(src proto.Message) { + xxx_messageInfo_MyMessage.Merge(dst, src) +} +func (m *MyMessage) XXX_Size() int { + return xxx_messageInfo_MyMessage.Size(m) +} +func (m *MyMessage) XXX_DiscardUnknown() { + xxx_messageInfo_MyMessage.DiscardUnknown(m) +} + +var xxx_messageInfo_MyMessage proto.InternalMessageInfo + +func (m *MyMessage) GetCount() int32 { + if m != nil && m.Count != nil { + return *m.Count + } + return 0 +} + +func (m *MyMessage) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *MyMessage) GetQuote() string { + if m != nil && m.Quote != nil { + return *m.Quote + } + return "" +} + +func (m *MyMessage) GetPet() []string { + if m != nil { + return m.Pet + } + return nil +} + +func (m *MyMessage) GetInner() *InnerMessage { + if m != nil { + return m.Inner + } + return nil +} + +func (m *MyMessage) GetOthers() []*OtherMessage { + if m != nil { + return m.Others + } + return nil +} + +func (m *MyMessage) GetWeMustGoDeeper() *RequiredInnerMessage { + if m != nil { + return m.WeMustGoDeeper + } + return nil +} + +func (m *MyMessage) GetRepInner() []*InnerMessage { + if m != nil { + return m.RepInner + } + return nil +} + +func (m *MyMessage) GetBikeshed() MyMessage_Color { + if m != nil && m.Bikeshed != nil { + return *m.Bikeshed + } + return MyMessage_RED +} + +func (m *MyMessage) GetSomegroup() *MyMessage_SomeGroup { + if m != nil { + return m.Somegroup + } + return nil +} + +func (m *MyMessage) GetRepBytes() [][]byte { + if m != nil { + return m.RepBytes + } + return nil +} + +func (m *MyMessage) GetBigfloat() float64 { + if m != nil && m.Bigfloat != nil { + return *m.Bigfloat + } + return 0 +} + +type MyMessage_SomeGroup struct { + GroupField *int32 `protobuf:"varint,9,opt,name=group_field,json=groupField" json:"group_field,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MyMessage_SomeGroup) Reset() { *m = MyMessage_SomeGroup{} } +func (m *MyMessage_SomeGroup) String() string { return proto.CompactTextString(m) } +func (*MyMessage_SomeGroup) ProtoMessage() {} +func (*MyMessage_SomeGroup) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{13, 0} +} +func (m *MyMessage_SomeGroup) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MyMessage_SomeGroup.Unmarshal(m, b) +} +func (m *MyMessage_SomeGroup) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MyMessage_SomeGroup.Marshal(b, m, deterministic) +} +func (dst *MyMessage_SomeGroup) XXX_Merge(src proto.Message) { + xxx_messageInfo_MyMessage_SomeGroup.Merge(dst, src) +} +func (m *MyMessage_SomeGroup) XXX_Size() int { + return xxx_messageInfo_MyMessage_SomeGroup.Size(m) +} +func (m *MyMessage_SomeGroup) XXX_DiscardUnknown() { + xxx_messageInfo_MyMessage_SomeGroup.DiscardUnknown(m) +} + +var xxx_messageInfo_MyMessage_SomeGroup proto.InternalMessageInfo + +func (m *MyMessage_SomeGroup) GetGroupField() int32 { + if m != nil && m.GroupField != nil { + return *m.GroupField + } + return 0 +} + +type Ext struct { + Data *string `protobuf:"bytes,1,opt,name=data" json:"data,omitempty"` + MapField map[int32]int32 `protobuf:"bytes,2,rep,name=map_field,json=mapField" json:"map_field,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Ext) Reset() { *m = Ext{} } +func (m *Ext) String() string { return proto.CompactTextString(m) } +func (*Ext) ProtoMessage() {} +func (*Ext) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{14} +} +func (m *Ext) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Ext.Unmarshal(m, b) +} +func (m *Ext) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Ext.Marshal(b, m, deterministic) +} +func (dst *Ext) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ext.Merge(dst, src) +} +func (m *Ext) XXX_Size() int { + return xxx_messageInfo_Ext.Size(m) +} +func (m *Ext) XXX_DiscardUnknown() { + xxx_messageInfo_Ext.DiscardUnknown(m) +} + +var xxx_messageInfo_Ext proto.InternalMessageInfo + +func (m *Ext) GetData() string { + if m != nil && m.Data != nil { + return *m.Data + } + return "" +} + +func (m *Ext) GetMapField() map[int32]int32 { + if m != nil { + return m.MapField + } + return nil +} + +var E_Ext_More = &proto.ExtensionDesc{ + ExtendedType: (*MyMessage)(nil), + ExtensionType: (*Ext)(nil), + Field: 103, + Name: "test_proto.Ext.more", + Tag: "bytes,103,opt,name=more", + Filename: "test_proto/test.proto", +} + +var E_Ext_Text = &proto.ExtensionDesc{ + ExtendedType: (*MyMessage)(nil), + ExtensionType: (*string)(nil), + Field: 104, + Name: "test_proto.Ext.text", + Tag: "bytes,104,opt,name=text", + Filename: "test_proto/test.proto", +} + +var E_Ext_Number = &proto.ExtensionDesc{ + ExtendedType: (*MyMessage)(nil), + ExtensionType: (*int32)(nil), + Field: 105, + Name: "test_proto.Ext.number", + Tag: "varint,105,opt,name=number", + Filename: "test_proto/test.proto", +} + +type ComplexExtension struct { + First *int32 `protobuf:"varint,1,opt,name=first" json:"first,omitempty"` + Second *int32 `protobuf:"varint,2,opt,name=second" json:"second,omitempty"` + Third []int32 `protobuf:"varint,3,rep,name=third" json:"third,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ComplexExtension) Reset() { *m = ComplexExtension{} } +func (m *ComplexExtension) String() string { return proto.CompactTextString(m) } +func (*ComplexExtension) ProtoMessage() {} +func (*ComplexExtension) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{15} +} +func (m *ComplexExtension) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ComplexExtension.Unmarshal(m, b) +} +func (m *ComplexExtension) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ComplexExtension.Marshal(b, m, deterministic) +} +func (dst *ComplexExtension) XXX_Merge(src proto.Message) { + xxx_messageInfo_ComplexExtension.Merge(dst, src) +} +func (m *ComplexExtension) XXX_Size() int { + return xxx_messageInfo_ComplexExtension.Size(m) +} +func (m *ComplexExtension) XXX_DiscardUnknown() { + xxx_messageInfo_ComplexExtension.DiscardUnknown(m) +} + +var xxx_messageInfo_ComplexExtension proto.InternalMessageInfo + +func (m *ComplexExtension) GetFirst() int32 { + if m != nil && m.First != nil { + return *m.First + } + return 0 +} + +func (m *ComplexExtension) GetSecond() int32 { + if m != nil && m.Second != nil { + return *m.Second + } + return 0 +} + +func (m *ComplexExtension) GetThird() []int32 { + if m != nil { + return m.Third + } + return nil +} + +type DefaultsMessage struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DefaultsMessage) Reset() { *m = DefaultsMessage{} } +func (m *DefaultsMessage) String() string { return proto.CompactTextString(m) } +func (*DefaultsMessage) ProtoMessage() {} +func (*DefaultsMessage) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{16} +} + +var extRange_DefaultsMessage = []proto.ExtensionRange{ + {Start: 100, End: 536870911}, +} + +func (*DefaultsMessage) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_DefaultsMessage +} +func (m *DefaultsMessage) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DefaultsMessage.Unmarshal(m, b) +} +func (m *DefaultsMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DefaultsMessage.Marshal(b, m, deterministic) +} +func (dst *DefaultsMessage) XXX_Merge(src proto.Message) { + xxx_messageInfo_DefaultsMessage.Merge(dst, src) +} +func (m *DefaultsMessage) XXX_Size() int { + return xxx_messageInfo_DefaultsMessage.Size(m) +} +func (m *DefaultsMessage) XXX_DiscardUnknown() { + xxx_messageInfo_DefaultsMessage.DiscardUnknown(m) +} + +var xxx_messageInfo_DefaultsMessage proto.InternalMessageInfo + +type MyMessageSet struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `protobuf_messageset:"1" json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MyMessageSet) Reset() { *m = MyMessageSet{} } +func (m *MyMessageSet) String() string { return proto.CompactTextString(m) } +func (*MyMessageSet) ProtoMessage() {} +func (*MyMessageSet) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{17} +} + +func (m *MyMessageSet) MarshalJSON() ([]byte, error) { + return proto.MarshalMessageSetJSON(&m.XXX_InternalExtensions) +} +func (m *MyMessageSet) UnmarshalJSON(buf []byte) error { + return proto.UnmarshalMessageSetJSON(buf, &m.XXX_InternalExtensions) +} + +var extRange_MyMessageSet = []proto.ExtensionRange{ + {Start: 100, End: 2147483646}, +} + +func (*MyMessageSet) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_MyMessageSet +} +func (m *MyMessageSet) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MyMessageSet.Unmarshal(m, b) +} +func (m *MyMessageSet) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MyMessageSet.Marshal(b, m, deterministic) +} +func (dst *MyMessageSet) XXX_Merge(src proto.Message) { + xxx_messageInfo_MyMessageSet.Merge(dst, src) +} +func (m *MyMessageSet) XXX_Size() int { + return xxx_messageInfo_MyMessageSet.Size(m) +} +func (m *MyMessageSet) XXX_DiscardUnknown() { + xxx_messageInfo_MyMessageSet.DiscardUnknown(m) +} + +var xxx_messageInfo_MyMessageSet proto.InternalMessageInfo + +type Empty struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Empty) Reset() { *m = Empty{} } +func (m *Empty) String() string { return proto.CompactTextString(m) } +func (*Empty) ProtoMessage() {} +func (*Empty) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{18} +} +func (m *Empty) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Empty.Unmarshal(m, b) +} +func (m *Empty) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Empty.Marshal(b, m, deterministic) +} +func (dst *Empty) XXX_Merge(src proto.Message) { + xxx_messageInfo_Empty.Merge(dst, src) +} +func (m *Empty) XXX_Size() int { + return xxx_messageInfo_Empty.Size(m) +} +func (m *Empty) XXX_DiscardUnknown() { + xxx_messageInfo_Empty.DiscardUnknown(m) +} + +var xxx_messageInfo_Empty proto.InternalMessageInfo + +type MessageList struct { + Message []*MessageList_Message `protobuf:"group,1,rep,name=Message,json=message" json:"message,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MessageList) Reset() { *m = MessageList{} } +func (m *MessageList) String() string { return proto.CompactTextString(m) } +func (*MessageList) ProtoMessage() {} +func (*MessageList) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{19} +} +func (m *MessageList) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MessageList.Unmarshal(m, b) +} +func (m *MessageList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MessageList.Marshal(b, m, deterministic) +} +func (dst *MessageList) XXX_Merge(src proto.Message) { + xxx_messageInfo_MessageList.Merge(dst, src) +} +func (m *MessageList) XXX_Size() int { + return xxx_messageInfo_MessageList.Size(m) +} +func (m *MessageList) XXX_DiscardUnknown() { + xxx_messageInfo_MessageList.DiscardUnknown(m) +} + +var xxx_messageInfo_MessageList proto.InternalMessageInfo + +func (m *MessageList) GetMessage() []*MessageList_Message { + if m != nil { + return m.Message + } + return nil +} + +type MessageList_Message struct { + Name *string `protobuf:"bytes,2,req,name=name" json:"name,omitempty"` + Count *int32 `protobuf:"varint,3,req,name=count" json:"count,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MessageList_Message) Reset() { *m = MessageList_Message{} } +func (m *MessageList_Message) String() string { return proto.CompactTextString(m) } +func (*MessageList_Message) ProtoMessage() {} +func (*MessageList_Message) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{19, 0} +} +func (m *MessageList_Message) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MessageList_Message.Unmarshal(m, b) +} +func (m *MessageList_Message) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MessageList_Message.Marshal(b, m, deterministic) +} +func (dst *MessageList_Message) XXX_Merge(src proto.Message) { + xxx_messageInfo_MessageList_Message.Merge(dst, src) +} +func (m *MessageList_Message) XXX_Size() int { + return xxx_messageInfo_MessageList_Message.Size(m) +} +func (m *MessageList_Message) XXX_DiscardUnknown() { + xxx_messageInfo_MessageList_Message.DiscardUnknown(m) +} + +var xxx_messageInfo_MessageList_Message proto.InternalMessageInfo + +func (m *MessageList_Message) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *MessageList_Message) GetCount() int32 { + if m != nil && m.Count != nil { + return *m.Count + } + return 0 +} + +type Strings struct { + StringField *string `protobuf:"bytes,1,opt,name=string_field,json=stringField" json:"string_field,omitempty"` + BytesField []byte `protobuf:"bytes,2,opt,name=bytes_field,json=bytesField" json:"bytes_field,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Strings) Reset() { *m = Strings{} } +func (m *Strings) String() string { return proto.CompactTextString(m) } +func (*Strings) ProtoMessage() {} +func (*Strings) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{20} +} +func (m *Strings) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Strings.Unmarshal(m, b) +} +func (m *Strings) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Strings.Marshal(b, m, deterministic) +} +func (dst *Strings) XXX_Merge(src proto.Message) { + xxx_messageInfo_Strings.Merge(dst, src) +} +func (m *Strings) XXX_Size() int { + return xxx_messageInfo_Strings.Size(m) +} +func (m *Strings) XXX_DiscardUnknown() { + xxx_messageInfo_Strings.DiscardUnknown(m) +} + +var xxx_messageInfo_Strings proto.InternalMessageInfo + +func (m *Strings) GetStringField() string { + if m != nil && m.StringField != nil { + return *m.StringField + } + return "" +} + +func (m *Strings) GetBytesField() []byte { + if m != nil { + return m.BytesField + } + return nil +} + +type Defaults struct { + // Default-valued fields of all basic types. + // Same as GoTest, but copied here to make testing easier. + F_Bool *bool `protobuf:"varint,1,opt,name=F_Bool,json=FBool,def=1" json:"F_Bool,omitempty"` + F_Int32 *int32 `protobuf:"varint,2,opt,name=F_Int32,json=FInt32,def=32" json:"F_Int32,omitempty"` + F_Int64 *int64 `protobuf:"varint,3,opt,name=F_Int64,json=FInt64,def=64" json:"F_Int64,omitempty"` + F_Fixed32 *uint32 `protobuf:"fixed32,4,opt,name=F_Fixed32,json=FFixed32,def=320" json:"F_Fixed32,omitempty"` + F_Fixed64 *uint64 `protobuf:"fixed64,5,opt,name=F_Fixed64,json=FFixed64,def=640" json:"F_Fixed64,omitempty"` + F_Uint32 *uint32 `protobuf:"varint,6,opt,name=F_Uint32,json=FUint32,def=3200" json:"F_Uint32,omitempty"` + F_Uint64 *uint64 `protobuf:"varint,7,opt,name=F_Uint64,json=FUint64,def=6400" json:"F_Uint64,omitempty"` + F_Float *float32 `protobuf:"fixed32,8,opt,name=F_Float,json=FFloat,def=314159" json:"F_Float,omitempty"` + F_Double *float64 `protobuf:"fixed64,9,opt,name=F_Double,json=FDouble,def=271828" json:"F_Double,omitempty"` + F_String *string `protobuf:"bytes,10,opt,name=F_String,json=FString,def=hello, \"world!\"\n" json:"F_String,omitempty"` + F_Bytes []byte `protobuf:"bytes,11,opt,name=F_Bytes,json=FBytes,def=Bignose" json:"F_Bytes,omitempty"` + F_Sint32 *int32 `protobuf:"zigzag32,12,opt,name=F_Sint32,json=FSint32,def=-32" json:"F_Sint32,omitempty"` + F_Sint64 *int64 `protobuf:"zigzag64,13,opt,name=F_Sint64,json=FSint64,def=-64" json:"F_Sint64,omitempty"` + F_Enum *Defaults_Color `protobuf:"varint,14,opt,name=F_Enum,json=FEnum,enum=test_proto.Defaults_Color,def=1" json:"F_Enum,omitempty"` + // More fields with crazy defaults. + F_Pinf *float32 `protobuf:"fixed32,15,opt,name=F_Pinf,json=FPinf,def=inf" json:"F_Pinf,omitempty"` + F_Ninf *float32 `protobuf:"fixed32,16,opt,name=F_Ninf,json=FNinf,def=-inf" json:"F_Ninf,omitempty"` + F_Nan *float32 `protobuf:"fixed32,17,opt,name=F_Nan,json=FNan,def=nan" json:"F_Nan,omitempty"` + // Sub-message. + Sub *SubDefaults `protobuf:"bytes,18,opt,name=sub" json:"sub,omitempty"` + // Redundant but explicit defaults. + StrZero *string `protobuf:"bytes,19,opt,name=str_zero,json=strZero,def=" json:"str_zero,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Defaults) Reset() { *m = Defaults{} } +func (m *Defaults) String() string { return proto.CompactTextString(m) } +func (*Defaults) ProtoMessage() {} +func (*Defaults) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{21} +} +func (m *Defaults) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Defaults.Unmarshal(m, b) +} +func (m *Defaults) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Defaults.Marshal(b, m, deterministic) +} +func (dst *Defaults) XXX_Merge(src proto.Message) { + xxx_messageInfo_Defaults.Merge(dst, src) +} +func (m *Defaults) XXX_Size() int { + return xxx_messageInfo_Defaults.Size(m) +} +func (m *Defaults) XXX_DiscardUnknown() { + xxx_messageInfo_Defaults.DiscardUnknown(m) +} + +var xxx_messageInfo_Defaults proto.InternalMessageInfo + +const Default_Defaults_F_Bool bool = true +const Default_Defaults_F_Int32 int32 = 32 +const Default_Defaults_F_Int64 int64 = 64 +const Default_Defaults_F_Fixed32 uint32 = 320 +const Default_Defaults_F_Fixed64 uint64 = 640 +const Default_Defaults_F_Uint32 uint32 = 3200 +const Default_Defaults_F_Uint64 uint64 = 6400 +const Default_Defaults_F_Float float32 = 314159 +const Default_Defaults_F_Double float64 = 271828 +const Default_Defaults_F_String string = "hello, \"world!\"\n" + +var Default_Defaults_F_Bytes []byte = []byte("Bignose") + +const Default_Defaults_F_Sint32 int32 = -32 +const Default_Defaults_F_Sint64 int64 = -64 +const Default_Defaults_F_Enum Defaults_Color = Defaults_GREEN + +var Default_Defaults_F_Pinf float32 = float32(math.Inf(1)) +var Default_Defaults_F_Ninf float32 = float32(math.Inf(-1)) +var Default_Defaults_F_Nan float32 = float32(math.NaN()) + +func (m *Defaults) GetF_Bool() bool { + if m != nil && m.F_Bool != nil { + return *m.F_Bool + } + return Default_Defaults_F_Bool +} + +func (m *Defaults) GetF_Int32() int32 { + if m != nil && m.F_Int32 != nil { + return *m.F_Int32 + } + return Default_Defaults_F_Int32 +} + +func (m *Defaults) GetF_Int64() int64 { + if m != nil && m.F_Int64 != nil { + return *m.F_Int64 + } + return Default_Defaults_F_Int64 +} + +func (m *Defaults) GetF_Fixed32() uint32 { + if m != nil && m.F_Fixed32 != nil { + return *m.F_Fixed32 + } + return Default_Defaults_F_Fixed32 +} + +func (m *Defaults) GetF_Fixed64() uint64 { + if m != nil && m.F_Fixed64 != nil { + return *m.F_Fixed64 + } + return Default_Defaults_F_Fixed64 +} + +func (m *Defaults) GetF_Uint32() uint32 { + if m != nil && m.F_Uint32 != nil { + return *m.F_Uint32 + } + return Default_Defaults_F_Uint32 +} + +func (m *Defaults) GetF_Uint64() uint64 { + if m != nil && m.F_Uint64 != nil { + return *m.F_Uint64 + } + return Default_Defaults_F_Uint64 +} + +func (m *Defaults) GetF_Float() float32 { + if m != nil && m.F_Float != nil { + return *m.F_Float + } + return Default_Defaults_F_Float +} + +func (m *Defaults) GetF_Double() float64 { + if m != nil && m.F_Double != nil { + return *m.F_Double + } + return Default_Defaults_F_Double +} + +func (m *Defaults) GetF_String() string { + if m != nil && m.F_String != nil { + return *m.F_String + } + return Default_Defaults_F_String +} + +func (m *Defaults) GetF_Bytes() []byte { + if m != nil && m.F_Bytes != nil { + return m.F_Bytes + } + return append([]byte(nil), Default_Defaults_F_Bytes...) +} + +func (m *Defaults) GetF_Sint32() int32 { + if m != nil && m.F_Sint32 != nil { + return *m.F_Sint32 + } + return Default_Defaults_F_Sint32 +} + +func (m *Defaults) GetF_Sint64() int64 { + if m != nil && m.F_Sint64 != nil { + return *m.F_Sint64 + } + return Default_Defaults_F_Sint64 +} + +func (m *Defaults) GetF_Enum() Defaults_Color { + if m != nil && m.F_Enum != nil { + return *m.F_Enum + } + return Default_Defaults_F_Enum +} + +func (m *Defaults) GetF_Pinf() float32 { + if m != nil && m.F_Pinf != nil { + return *m.F_Pinf + } + return Default_Defaults_F_Pinf +} + +func (m *Defaults) GetF_Ninf() float32 { + if m != nil && m.F_Ninf != nil { + return *m.F_Ninf + } + return Default_Defaults_F_Ninf +} + +func (m *Defaults) GetF_Nan() float32 { + if m != nil && m.F_Nan != nil { + return *m.F_Nan + } + return Default_Defaults_F_Nan +} + +func (m *Defaults) GetSub() *SubDefaults { + if m != nil { + return m.Sub + } + return nil +} + +func (m *Defaults) GetStrZero() string { + if m != nil && m.StrZero != nil { + return *m.StrZero + } + return "" +} + +type SubDefaults struct { + N *int64 `protobuf:"varint,1,opt,name=n,def=7" json:"n,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SubDefaults) Reset() { *m = SubDefaults{} } +func (m *SubDefaults) String() string { return proto.CompactTextString(m) } +func (*SubDefaults) ProtoMessage() {} +func (*SubDefaults) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{22} +} +func (m *SubDefaults) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SubDefaults.Unmarshal(m, b) +} +func (m *SubDefaults) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SubDefaults.Marshal(b, m, deterministic) +} +func (dst *SubDefaults) XXX_Merge(src proto.Message) { + xxx_messageInfo_SubDefaults.Merge(dst, src) +} +func (m *SubDefaults) XXX_Size() int { + return xxx_messageInfo_SubDefaults.Size(m) +} +func (m *SubDefaults) XXX_DiscardUnknown() { + xxx_messageInfo_SubDefaults.DiscardUnknown(m) +} + +var xxx_messageInfo_SubDefaults proto.InternalMessageInfo + +const Default_SubDefaults_N int64 = 7 + +func (m *SubDefaults) GetN() int64 { + if m != nil && m.N != nil { + return *m.N + } + return Default_SubDefaults_N +} + +type RepeatedEnum struct { + Color []RepeatedEnum_Color `protobuf:"varint,1,rep,name=color,enum=test_proto.RepeatedEnum_Color" json:"color,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *RepeatedEnum) Reset() { *m = RepeatedEnum{} } +func (m *RepeatedEnum) String() string { return proto.CompactTextString(m) } +func (*RepeatedEnum) ProtoMessage() {} +func (*RepeatedEnum) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{23} +} +func (m *RepeatedEnum) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_RepeatedEnum.Unmarshal(m, b) +} +func (m *RepeatedEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_RepeatedEnum.Marshal(b, m, deterministic) +} +func (dst *RepeatedEnum) XXX_Merge(src proto.Message) { + xxx_messageInfo_RepeatedEnum.Merge(dst, src) +} +func (m *RepeatedEnum) XXX_Size() int { + return xxx_messageInfo_RepeatedEnum.Size(m) +} +func (m *RepeatedEnum) XXX_DiscardUnknown() { + xxx_messageInfo_RepeatedEnum.DiscardUnknown(m) +} + +var xxx_messageInfo_RepeatedEnum proto.InternalMessageInfo + +func (m *RepeatedEnum) GetColor() []RepeatedEnum_Color { + if m != nil { + return m.Color + } + return nil +} + +type MoreRepeated struct { + Bools []bool `protobuf:"varint,1,rep,name=bools" json:"bools,omitempty"` + BoolsPacked []bool `protobuf:"varint,2,rep,packed,name=bools_packed,json=boolsPacked" json:"bools_packed,omitempty"` + Ints []int32 `protobuf:"varint,3,rep,name=ints" json:"ints,omitempty"` + IntsPacked []int32 `protobuf:"varint,4,rep,packed,name=ints_packed,json=intsPacked" json:"ints_packed,omitempty"` + Int64SPacked []int64 `protobuf:"varint,7,rep,packed,name=int64s_packed,json=int64sPacked" json:"int64s_packed,omitempty"` + Strings []string `protobuf:"bytes,5,rep,name=strings" json:"strings,omitempty"` + Fixeds []uint32 `protobuf:"fixed32,6,rep,name=fixeds" json:"fixeds,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MoreRepeated) Reset() { *m = MoreRepeated{} } +func (m *MoreRepeated) String() string { return proto.CompactTextString(m) } +func (*MoreRepeated) ProtoMessage() {} +func (*MoreRepeated) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{24} +} +func (m *MoreRepeated) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MoreRepeated.Unmarshal(m, b) +} +func (m *MoreRepeated) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MoreRepeated.Marshal(b, m, deterministic) +} +func (dst *MoreRepeated) XXX_Merge(src proto.Message) { + xxx_messageInfo_MoreRepeated.Merge(dst, src) +} +func (m *MoreRepeated) XXX_Size() int { + return xxx_messageInfo_MoreRepeated.Size(m) +} +func (m *MoreRepeated) XXX_DiscardUnknown() { + xxx_messageInfo_MoreRepeated.DiscardUnknown(m) +} + +var xxx_messageInfo_MoreRepeated proto.InternalMessageInfo + +func (m *MoreRepeated) GetBools() []bool { + if m != nil { + return m.Bools + } + return nil +} + +func (m *MoreRepeated) GetBoolsPacked() []bool { + if m != nil { + return m.BoolsPacked + } + return nil +} + +func (m *MoreRepeated) GetInts() []int32 { + if m != nil { + return m.Ints + } + return nil +} + +func (m *MoreRepeated) GetIntsPacked() []int32 { + if m != nil { + return m.IntsPacked + } + return nil +} + +func (m *MoreRepeated) GetInt64SPacked() []int64 { + if m != nil { + return m.Int64SPacked + } + return nil +} + +func (m *MoreRepeated) GetStrings() []string { + if m != nil { + return m.Strings + } + return nil +} + +func (m *MoreRepeated) GetFixeds() []uint32 { + if m != nil { + return m.Fixeds + } + return nil +} + +type GroupOld struct { + G *GroupOld_G `protobuf:"group,101,opt,name=G,json=g" json:"g,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GroupOld) Reset() { *m = GroupOld{} } +func (m *GroupOld) String() string { return proto.CompactTextString(m) } +func (*GroupOld) ProtoMessage() {} +func (*GroupOld) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{25} +} +func (m *GroupOld) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GroupOld.Unmarshal(m, b) +} +func (m *GroupOld) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GroupOld.Marshal(b, m, deterministic) +} +func (dst *GroupOld) XXX_Merge(src proto.Message) { + xxx_messageInfo_GroupOld.Merge(dst, src) +} +func (m *GroupOld) XXX_Size() int { + return xxx_messageInfo_GroupOld.Size(m) +} +func (m *GroupOld) XXX_DiscardUnknown() { + xxx_messageInfo_GroupOld.DiscardUnknown(m) +} + +var xxx_messageInfo_GroupOld proto.InternalMessageInfo + +func (m *GroupOld) GetG() *GroupOld_G { + if m != nil { + return m.G + } + return nil +} + +type GroupOld_G struct { + X *int32 `protobuf:"varint,2,opt,name=x" json:"x,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GroupOld_G) Reset() { *m = GroupOld_G{} } +func (m *GroupOld_G) String() string { return proto.CompactTextString(m) } +func (*GroupOld_G) ProtoMessage() {} +func (*GroupOld_G) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{25, 0} +} +func (m *GroupOld_G) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GroupOld_G.Unmarshal(m, b) +} +func (m *GroupOld_G) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GroupOld_G.Marshal(b, m, deterministic) +} +func (dst *GroupOld_G) XXX_Merge(src proto.Message) { + xxx_messageInfo_GroupOld_G.Merge(dst, src) +} +func (m *GroupOld_G) XXX_Size() int { + return xxx_messageInfo_GroupOld_G.Size(m) +} +func (m *GroupOld_G) XXX_DiscardUnknown() { + xxx_messageInfo_GroupOld_G.DiscardUnknown(m) +} + +var xxx_messageInfo_GroupOld_G proto.InternalMessageInfo + +func (m *GroupOld_G) GetX() int32 { + if m != nil && m.X != nil { + return *m.X + } + return 0 +} + +type GroupNew struct { + G *GroupNew_G `protobuf:"group,101,opt,name=G,json=g" json:"g,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GroupNew) Reset() { *m = GroupNew{} } +func (m *GroupNew) String() string { return proto.CompactTextString(m) } +func (*GroupNew) ProtoMessage() {} +func (*GroupNew) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{26} +} +func (m *GroupNew) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GroupNew.Unmarshal(m, b) +} +func (m *GroupNew) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GroupNew.Marshal(b, m, deterministic) +} +func (dst *GroupNew) XXX_Merge(src proto.Message) { + xxx_messageInfo_GroupNew.Merge(dst, src) +} +func (m *GroupNew) XXX_Size() int { + return xxx_messageInfo_GroupNew.Size(m) +} +func (m *GroupNew) XXX_DiscardUnknown() { + xxx_messageInfo_GroupNew.DiscardUnknown(m) +} + +var xxx_messageInfo_GroupNew proto.InternalMessageInfo + +func (m *GroupNew) GetG() *GroupNew_G { + if m != nil { + return m.G + } + return nil +} + +type GroupNew_G struct { + X *int32 `protobuf:"varint,2,opt,name=x" json:"x,omitempty"` + Y *int32 `protobuf:"varint,3,opt,name=y" json:"y,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GroupNew_G) Reset() { *m = GroupNew_G{} } +func (m *GroupNew_G) String() string { return proto.CompactTextString(m) } +func (*GroupNew_G) ProtoMessage() {} +func (*GroupNew_G) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{26, 0} +} +func (m *GroupNew_G) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GroupNew_G.Unmarshal(m, b) +} +func (m *GroupNew_G) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GroupNew_G.Marshal(b, m, deterministic) +} +func (dst *GroupNew_G) XXX_Merge(src proto.Message) { + xxx_messageInfo_GroupNew_G.Merge(dst, src) +} +func (m *GroupNew_G) XXX_Size() int { + return xxx_messageInfo_GroupNew_G.Size(m) +} +func (m *GroupNew_G) XXX_DiscardUnknown() { + xxx_messageInfo_GroupNew_G.DiscardUnknown(m) +} + +var xxx_messageInfo_GroupNew_G proto.InternalMessageInfo + +func (m *GroupNew_G) GetX() int32 { + if m != nil && m.X != nil { + return *m.X + } + return 0 +} + +func (m *GroupNew_G) GetY() int32 { + if m != nil && m.Y != nil { + return *m.Y + } + return 0 +} + +type FloatingPoint struct { + F *float64 `protobuf:"fixed64,1,req,name=f" json:"f,omitempty"` + Exact *bool `protobuf:"varint,2,opt,name=exact" json:"exact,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *FloatingPoint) Reset() { *m = FloatingPoint{} } +func (m *FloatingPoint) String() string { return proto.CompactTextString(m) } +func (*FloatingPoint) ProtoMessage() {} +func (*FloatingPoint) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{27} +} +func (m *FloatingPoint) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_FloatingPoint.Unmarshal(m, b) +} +func (m *FloatingPoint) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_FloatingPoint.Marshal(b, m, deterministic) +} +func (dst *FloatingPoint) XXX_Merge(src proto.Message) { + xxx_messageInfo_FloatingPoint.Merge(dst, src) +} +func (m *FloatingPoint) XXX_Size() int { + return xxx_messageInfo_FloatingPoint.Size(m) +} +func (m *FloatingPoint) XXX_DiscardUnknown() { + xxx_messageInfo_FloatingPoint.DiscardUnknown(m) +} + +var xxx_messageInfo_FloatingPoint proto.InternalMessageInfo + +func (m *FloatingPoint) GetF() float64 { + if m != nil && m.F != nil { + return *m.F + } + return 0 +} + +func (m *FloatingPoint) GetExact() bool { + if m != nil && m.Exact != nil { + return *m.Exact + } + return false +} + +type MessageWithMap struct { + NameMapping map[int32]string `protobuf:"bytes,1,rep,name=name_mapping,json=nameMapping" json:"name_mapping,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + MsgMapping map[int64]*FloatingPoint `protobuf:"bytes,2,rep,name=msg_mapping,json=msgMapping" json:"msg_mapping,omitempty" protobuf_key:"zigzag64,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + ByteMapping map[bool][]byte `protobuf:"bytes,3,rep,name=byte_mapping,json=byteMapping" json:"byte_mapping,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + StrToStr map[string]string `protobuf:"bytes,4,rep,name=str_to_str,json=strToStr" json:"str_to_str,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MessageWithMap) Reset() { *m = MessageWithMap{} } +func (m *MessageWithMap) String() string { return proto.CompactTextString(m) } +func (*MessageWithMap) ProtoMessage() {} +func (*MessageWithMap) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{28} +} +func (m *MessageWithMap) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MessageWithMap.Unmarshal(m, b) +} +func (m *MessageWithMap) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MessageWithMap.Marshal(b, m, deterministic) +} +func (dst *MessageWithMap) XXX_Merge(src proto.Message) { + xxx_messageInfo_MessageWithMap.Merge(dst, src) +} +func (m *MessageWithMap) XXX_Size() int { + return xxx_messageInfo_MessageWithMap.Size(m) +} +func (m *MessageWithMap) XXX_DiscardUnknown() { + xxx_messageInfo_MessageWithMap.DiscardUnknown(m) +} + +var xxx_messageInfo_MessageWithMap proto.InternalMessageInfo + +func (m *MessageWithMap) GetNameMapping() map[int32]string { + if m != nil { + return m.NameMapping + } + return nil +} + +func (m *MessageWithMap) GetMsgMapping() map[int64]*FloatingPoint { + if m != nil { + return m.MsgMapping + } + return nil +} + +func (m *MessageWithMap) GetByteMapping() map[bool][]byte { + if m != nil { + return m.ByteMapping + } + return nil +} + +func (m *MessageWithMap) GetStrToStr() map[string]string { + if m != nil { + return m.StrToStr + } + return nil +} + +type Oneof struct { + // Types that are valid to be assigned to Union: + // *Oneof_F_Bool + // *Oneof_F_Int32 + // *Oneof_F_Int64 + // *Oneof_F_Fixed32 + // *Oneof_F_Fixed64 + // *Oneof_F_Uint32 + // *Oneof_F_Uint64 + // *Oneof_F_Float + // *Oneof_F_Double + // *Oneof_F_String + // *Oneof_F_Bytes + // *Oneof_F_Sint32 + // *Oneof_F_Sint64 + // *Oneof_F_Enum + // *Oneof_F_Message + // *Oneof_FGroup + // *Oneof_F_Largest_Tag + Union isOneof_Union `protobuf_oneof:"union"` + // Types that are valid to be assigned to Tormato: + // *Oneof_Value + Tormato isOneof_Tormato `protobuf_oneof:"tormato"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Oneof) Reset() { *m = Oneof{} } +func (m *Oneof) String() string { return proto.CompactTextString(m) } +func (*Oneof) ProtoMessage() {} +func (*Oneof) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{29} +} +func (m *Oneof) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Oneof.Unmarshal(m, b) +} +func (m *Oneof) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Oneof.Marshal(b, m, deterministic) +} +func (dst *Oneof) XXX_Merge(src proto.Message) { + xxx_messageInfo_Oneof.Merge(dst, src) +} +func (m *Oneof) XXX_Size() int { + return xxx_messageInfo_Oneof.Size(m) +} +func (m *Oneof) XXX_DiscardUnknown() { + xxx_messageInfo_Oneof.DiscardUnknown(m) +} + +var xxx_messageInfo_Oneof proto.InternalMessageInfo + +type isOneof_Union interface { + isOneof_Union() +} +type isOneof_Tormato interface { + isOneof_Tormato() +} + +type Oneof_F_Bool struct { + F_Bool bool `protobuf:"varint,1,opt,name=F_Bool,json=FBool,oneof"` +} +type Oneof_F_Int32 struct { + F_Int32 int32 `protobuf:"varint,2,opt,name=F_Int32,json=FInt32,oneof"` +} +type Oneof_F_Int64 struct { + F_Int64 int64 `protobuf:"varint,3,opt,name=F_Int64,json=FInt64,oneof"` +} +type Oneof_F_Fixed32 struct { + F_Fixed32 uint32 `protobuf:"fixed32,4,opt,name=F_Fixed32,json=FFixed32,oneof"` +} +type Oneof_F_Fixed64 struct { + F_Fixed64 uint64 `protobuf:"fixed64,5,opt,name=F_Fixed64,json=FFixed64,oneof"` +} +type Oneof_F_Uint32 struct { + F_Uint32 uint32 `protobuf:"varint,6,opt,name=F_Uint32,json=FUint32,oneof"` +} +type Oneof_F_Uint64 struct { + F_Uint64 uint64 `protobuf:"varint,7,opt,name=F_Uint64,json=FUint64,oneof"` +} +type Oneof_F_Float struct { + F_Float float32 `protobuf:"fixed32,8,opt,name=F_Float,json=FFloat,oneof"` +} +type Oneof_F_Double struct { + F_Double float64 `protobuf:"fixed64,9,opt,name=F_Double,json=FDouble,oneof"` +} +type Oneof_F_String struct { + F_String string `protobuf:"bytes,10,opt,name=F_String,json=FString,oneof"` +} +type Oneof_F_Bytes struct { + F_Bytes []byte `protobuf:"bytes,11,opt,name=F_Bytes,json=FBytes,oneof"` +} +type Oneof_F_Sint32 struct { + F_Sint32 int32 `protobuf:"zigzag32,12,opt,name=F_Sint32,json=FSint32,oneof"` +} +type Oneof_F_Sint64 struct { + F_Sint64 int64 `protobuf:"zigzag64,13,opt,name=F_Sint64,json=FSint64,oneof"` +} +type Oneof_F_Enum struct { + F_Enum MyMessage_Color `protobuf:"varint,14,opt,name=F_Enum,json=FEnum,enum=test_proto.MyMessage_Color,oneof"` +} +type Oneof_F_Message struct { + F_Message *GoTestField `protobuf:"bytes,15,opt,name=F_Message,json=FMessage,oneof"` +} +type Oneof_FGroup struct { + FGroup *Oneof_F_Group `protobuf:"group,16,opt,name=F_Group,json=fGroup,oneof"` +} +type Oneof_F_Largest_Tag struct { + F_Largest_Tag int32 `protobuf:"varint,536870911,opt,name=F_Largest_Tag,json=FLargestTag,oneof"` +} +type Oneof_Value struct { + Value int32 `protobuf:"varint,100,opt,name=value,oneof"` +} + +func (*Oneof_F_Bool) isOneof_Union() {} +func (*Oneof_F_Int32) isOneof_Union() {} +func (*Oneof_F_Int64) isOneof_Union() {} +func (*Oneof_F_Fixed32) isOneof_Union() {} +func (*Oneof_F_Fixed64) isOneof_Union() {} +func (*Oneof_F_Uint32) isOneof_Union() {} +func (*Oneof_F_Uint64) isOneof_Union() {} +func (*Oneof_F_Float) isOneof_Union() {} +func (*Oneof_F_Double) isOneof_Union() {} +func (*Oneof_F_String) isOneof_Union() {} +func (*Oneof_F_Bytes) isOneof_Union() {} +func (*Oneof_F_Sint32) isOneof_Union() {} +func (*Oneof_F_Sint64) isOneof_Union() {} +func (*Oneof_F_Enum) isOneof_Union() {} +func (*Oneof_F_Message) isOneof_Union() {} +func (*Oneof_FGroup) isOneof_Union() {} +func (*Oneof_F_Largest_Tag) isOneof_Union() {} +func (*Oneof_Value) isOneof_Tormato() {} + +func (m *Oneof) GetUnion() isOneof_Union { + if m != nil { + return m.Union + } + return nil +} +func (m *Oneof) GetTormato() isOneof_Tormato { + if m != nil { + return m.Tormato + } + return nil +} + +func (m *Oneof) GetF_Bool() bool { + if x, ok := m.GetUnion().(*Oneof_F_Bool); ok { + return x.F_Bool + } + return false +} + +func (m *Oneof) GetF_Int32() int32 { + if x, ok := m.GetUnion().(*Oneof_F_Int32); ok { + return x.F_Int32 + } + return 0 +} + +func (m *Oneof) GetF_Int64() int64 { + if x, ok := m.GetUnion().(*Oneof_F_Int64); ok { + return x.F_Int64 + } + return 0 +} + +func (m *Oneof) GetF_Fixed32() uint32 { + if x, ok := m.GetUnion().(*Oneof_F_Fixed32); ok { + return x.F_Fixed32 + } + return 0 +} + +func (m *Oneof) GetF_Fixed64() uint64 { + if x, ok := m.GetUnion().(*Oneof_F_Fixed64); ok { + return x.F_Fixed64 + } + return 0 +} + +func (m *Oneof) GetF_Uint32() uint32 { + if x, ok := m.GetUnion().(*Oneof_F_Uint32); ok { + return x.F_Uint32 + } + return 0 +} + +func (m *Oneof) GetF_Uint64() uint64 { + if x, ok := m.GetUnion().(*Oneof_F_Uint64); ok { + return x.F_Uint64 + } + return 0 +} + +func (m *Oneof) GetF_Float() float32 { + if x, ok := m.GetUnion().(*Oneof_F_Float); ok { + return x.F_Float + } + return 0 +} + +func (m *Oneof) GetF_Double() float64 { + if x, ok := m.GetUnion().(*Oneof_F_Double); ok { + return x.F_Double + } + return 0 +} + +func (m *Oneof) GetF_String() string { + if x, ok := m.GetUnion().(*Oneof_F_String); ok { + return x.F_String + } + return "" +} + +func (m *Oneof) GetF_Bytes() []byte { + if x, ok := m.GetUnion().(*Oneof_F_Bytes); ok { + return x.F_Bytes + } + return nil +} + +func (m *Oneof) GetF_Sint32() int32 { + if x, ok := m.GetUnion().(*Oneof_F_Sint32); ok { + return x.F_Sint32 + } + return 0 +} + +func (m *Oneof) GetF_Sint64() int64 { + if x, ok := m.GetUnion().(*Oneof_F_Sint64); ok { + return x.F_Sint64 + } + return 0 +} + +func (m *Oneof) GetF_Enum() MyMessage_Color { + if x, ok := m.GetUnion().(*Oneof_F_Enum); ok { + return x.F_Enum + } + return MyMessage_RED +} + +func (m *Oneof) GetF_Message() *GoTestField { + if x, ok := m.GetUnion().(*Oneof_F_Message); ok { + return x.F_Message + } + return nil +} + +func (m *Oneof) GetFGroup() *Oneof_F_Group { + if x, ok := m.GetUnion().(*Oneof_FGroup); ok { + return x.FGroup + } + return nil +} + +func (m *Oneof) GetF_Largest_Tag() int32 { + if x, ok := m.GetUnion().(*Oneof_F_Largest_Tag); ok { + return x.F_Largest_Tag + } + return 0 +} + +func (m *Oneof) GetValue() int32 { + if x, ok := m.GetTormato().(*Oneof_Value); ok { + return x.Value + } + return 0 +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*Oneof) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _Oneof_OneofMarshaler, _Oneof_OneofUnmarshaler, _Oneof_OneofSizer, []interface{}{ + (*Oneof_F_Bool)(nil), + (*Oneof_F_Int32)(nil), + (*Oneof_F_Int64)(nil), + (*Oneof_F_Fixed32)(nil), + (*Oneof_F_Fixed64)(nil), + (*Oneof_F_Uint32)(nil), + (*Oneof_F_Uint64)(nil), + (*Oneof_F_Float)(nil), + (*Oneof_F_Double)(nil), + (*Oneof_F_String)(nil), + (*Oneof_F_Bytes)(nil), + (*Oneof_F_Sint32)(nil), + (*Oneof_F_Sint64)(nil), + (*Oneof_F_Enum)(nil), + (*Oneof_F_Message)(nil), + (*Oneof_FGroup)(nil), + (*Oneof_F_Largest_Tag)(nil), + (*Oneof_Value)(nil), + } +} + +func _Oneof_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*Oneof) + // union + switch x := m.Union.(type) { + case *Oneof_F_Bool: + t := uint64(0) + if x.F_Bool { + t = 1 + } + b.EncodeVarint(1<<3 | proto.WireVarint) + b.EncodeVarint(t) + case *Oneof_F_Int32: + b.EncodeVarint(2<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.F_Int32)) + case *Oneof_F_Int64: + b.EncodeVarint(3<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.F_Int64)) + case *Oneof_F_Fixed32: + b.EncodeVarint(4<<3 | proto.WireFixed32) + b.EncodeFixed32(uint64(x.F_Fixed32)) + case *Oneof_F_Fixed64: + b.EncodeVarint(5<<3 | proto.WireFixed64) + b.EncodeFixed64(uint64(x.F_Fixed64)) + case *Oneof_F_Uint32: + b.EncodeVarint(6<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.F_Uint32)) + case *Oneof_F_Uint64: + b.EncodeVarint(7<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.F_Uint64)) + case *Oneof_F_Float: + b.EncodeVarint(8<<3 | proto.WireFixed32) + b.EncodeFixed32(uint64(math.Float32bits(x.F_Float))) + case *Oneof_F_Double: + b.EncodeVarint(9<<3 | proto.WireFixed64) + b.EncodeFixed64(math.Float64bits(x.F_Double)) + case *Oneof_F_String: + b.EncodeVarint(10<<3 | proto.WireBytes) + b.EncodeStringBytes(x.F_String) + case *Oneof_F_Bytes: + b.EncodeVarint(11<<3 | proto.WireBytes) + b.EncodeRawBytes(x.F_Bytes) + case *Oneof_F_Sint32: + b.EncodeVarint(12<<3 | proto.WireVarint) + b.EncodeZigzag32(uint64(x.F_Sint32)) + case *Oneof_F_Sint64: + b.EncodeVarint(13<<3 | proto.WireVarint) + b.EncodeZigzag64(uint64(x.F_Sint64)) + case *Oneof_F_Enum: + b.EncodeVarint(14<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.F_Enum)) + case *Oneof_F_Message: + b.EncodeVarint(15<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.F_Message); err != nil { + return err + } + case *Oneof_FGroup: + b.EncodeVarint(16<<3 | proto.WireStartGroup) + if err := b.Marshal(x.FGroup); err != nil { + return err + } + b.EncodeVarint(16<<3 | proto.WireEndGroup) + case *Oneof_F_Largest_Tag: + b.EncodeVarint(536870911<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.F_Largest_Tag)) + case nil: + default: + return fmt.Errorf("Oneof.Union has unexpected type %T", x) + } + // tormato + switch x := m.Tormato.(type) { + case *Oneof_Value: + b.EncodeVarint(100<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.Value)) + case nil: + default: + return fmt.Errorf("Oneof.Tormato has unexpected type %T", x) + } + return nil +} + +func _Oneof_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*Oneof) + switch tag { + case 1: // union.F_Bool + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Oneof_F_Bool{x != 0} + return true, err + case 2: // union.F_Int32 + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Oneof_F_Int32{int32(x)} + return true, err + case 3: // union.F_Int64 + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Oneof_F_Int64{int64(x)} + return true, err + case 4: // union.F_Fixed32 + if wire != proto.WireFixed32 { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeFixed32() + m.Union = &Oneof_F_Fixed32{uint32(x)} + return true, err + case 5: // union.F_Fixed64 + if wire != proto.WireFixed64 { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeFixed64() + m.Union = &Oneof_F_Fixed64{x} + return true, err + case 6: // union.F_Uint32 + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Oneof_F_Uint32{uint32(x)} + return true, err + case 7: // union.F_Uint64 + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Oneof_F_Uint64{x} + return true, err + case 8: // union.F_Float + if wire != proto.WireFixed32 { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeFixed32() + m.Union = &Oneof_F_Float{math.Float32frombits(uint32(x))} + return true, err + case 9: // union.F_Double + if wire != proto.WireFixed64 { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeFixed64() + m.Union = &Oneof_F_Double{math.Float64frombits(x)} + return true, err + case 10: // union.F_String + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeStringBytes() + m.Union = &Oneof_F_String{x} + return true, err + case 11: // union.F_Bytes + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeRawBytes(true) + m.Union = &Oneof_F_Bytes{x} + return true, err + case 12: // union.F_Sint32 + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeZigzag32() + m.Union = &Oneof_F_Sint32{int32(x)} + return true, err + case 13: // union.F_Sint64 + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeZigzag64() + m.Union = &Oneof_F_Sint64{int64(x)} + return true, err + case 14: // union.F_Enum + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Oneof_F_Enum{MyMessage_Color(x)} + return true, err + case 15: // union.F_Message + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(GoTestField) + err := b.DecodeMessage(msg) + m.Union = &Oneof_F_Message{msg} + return true, err + case 16: // union.f_group + if wire != proto.WireStartGroup { + return true, proto.ErrInternalBadWireType + } + msg := new(Oneof_F_Group) + err := b.DecodeGroup(msg) + m.Union = &Oneof_FGroup{msg} + return true, err + case 536870911: // union.F_Largest_Tag + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Oneof_F_Largest_Tag{int32(x)} + return true, err + case 100: // tormato.value + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Tormato = &Oneof_Value{int32(x)} + return true, err + default: + return false, nil + } +} + +func _Oneof_OneofSizer(msg proto.Message) (n int) { + m := msg.(*Oneof) + // union + switch x := m.Union.(type) { + case *Oneof_F_Bool: + n += 1 // tag and wire + n += 1 + case *Oneof_F_Int32: + n += 1 // tag and wire + n += proto.SizeVarint(uint64(x.F_Int32)) + case *Oneof_F_Int64: + n += 1 // tag and wire + n += proto.SizeVarint(uint64(x.F_Int64)) + case *Oneof_F_Fixed32: + n += 1 // tag and wire + n += 4 + case *Oneof_F_Fixed64: + n += 1 // tag and wire + n += 8 + case *Oneof_F_Uint32: + n += 1 // tag and wire + n += proto.SizeVarint(uint64(x.F_Uint32)) + case *Oneof_F_Uint64: + n += 1 // tag and wire + n += proto.SizeVarint(uint64(x.F_Uint64)) + case *Oneof_F_Float: + n += 1 // tag and wire + n += 4 + case *Oneof_F_Double: + n += 1 // tag and wire + n += 8 + case *Oneof_F_String: + n += 1 // tag and wire + n += proto.SizeVarint(uint64(len(x.F_String))) + n += len(x.F_String) + case *Oneof_F_Bytes: + n += 1 // tag and wire + n += proto.SizeVarint(uint64(len(x.F_Bytes))) + n += len(x.F_Bytes) + case *Oneof_F_Sint32: + n += 1 // tag and wire + n += proto.SizeVarint(uint64((uint32(x.F_Sint32) << 1) ^ uint32((int32(x.F_Sint32) >> 31)))) + case *Oneof_F_Sint64: + n += 1 // tag and wire + n += proto.SizeVarint(uint64(uint64(x.F_Sint64<<1) ^ uint64((int64(x.F_Sint64) >> 63)))) + case *Oneof_F_Enum: + n += 1 // tag and wire + n += proto.SizeVarint(uint64(x.F_Enum)) + case *Oneof_F_Message: + s := proto.Size(x.F_Message) + n += 1 // tag and wire + n += proto.SizeVarint(uint64(s)) + n += s + case *Oneof_FGroup: + n += 2 // tag and wire + n += proto.Size(x.FGroup) + n += 2 // tag and wire + case *Oneof_F_Largest_Tag: + n += 10 // tag and wire + n += proto.SizeVarint(uint64(x.F_Largest_Tag)) + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + // tormato + switch x := m.Tormato.(type) { + case *Oneof_Value: + n += 2 // tag and wire + n += proto.SizeVarint(uint64(x.Value)) + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +type Oneof_F_Group struct { + X *int32 `protobuf:"varint,17,opt,name=x" json:"x,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Oneof_F_Group) Reset() { *m = Oneof_F_Group{} } +func (m *Oneof_F_Group) String() string { return proto.CompactTextString(m) } +func (*Oneof_F_Group) ProtoMessage() {} +func (*Oneof_F_Group) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{29, 0} +} +func (m *Oneof_F_Group) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Oneof_F_Group.Unmarshal(m, b) +} +func (m *Oneof_F_Group) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Oneof_F_Group.Marshal(b, m, deterministic) +} +func (dst *Oneof_F_Group) XXX_Merge(src proto.Message) { + xxx_messageInfo_Oneof_F_Group.Merge(dst, src) +} +func (m *Oneof_F_Group) XXX_Size() int { + return xxx_messageInfo_Oneof_F_Group.Size(m) +} +func (m *Oneof_F_Group) XXX_DiscardUnknown() { + xxx_messageInfo_Oneof_F_Group.DiscardUnknown(m) +} + +var xxx_messageInfo_Oneof_F_Group proto.InternalMessageInfo + +func (m *Oneof_F_Group) GetX() int32 { + if m != nil && m.X != nil { + return *m.X + } + return 0 +} + +type Communique struct { + MakeMeCry *bool `protobuf:"varint,1,opt,name=make_me_cry,json=makeMeCry" json:"make_me_cry,omitempty"` + // This is a oneof, called "union". + // + // Types that are valid to be assigned to Union: + // *Communique_Number + // *Communique_Name + // *Communique_Data + // *Communique_TempC + // *Communique_Col + // *Communique_Msg + Union isCommunique_Union `protobuf_oneof:"union"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Communique) Reset() { *m = Communique{} } +func (m *Communique) String() string { return proto.CompactTextString(m) } +func (*Communique) ProtoMessage() {} +func (*Communique) Descriptor() ([]byte, []int) { + return fileDescriptor_test_74787bfc6550f8a7, []int{30} +} +func (m *Communique) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Communique.Unmarshal(m, b) +} +func (m *Communique) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Communique.Marshal(b, m, deterministic) +} +func (dst *Communique) XXX_Merge(src proto.Message) { + xxx_messageInfo_Communique.Merge(dst, src) +} +func (m *Communique) XXX_Size() int { + return xxx_messageInfo_Communique.Size(m) +} +func (m *Communique) XXX_DiscardUnknown() { + xxx_messageInfo_Communique.DiscardUnknown(m) +} + +var xxx_messageInfo_Communique proto.InternalMessageInfo + +type isCommunique_Union interface { + isCommunique_Union() +} + +type Communique_Number struct { + Number int32 `protobuf:"varint,5,opt,name=number,oneof"` +} +type Communique_Name struct { + Name string `protobuf:"bytes,6,opt,name=name,oneof"` +} +type Communique_Data struct { + Data []byte `protobuf:"bytes,7,opt,name=data,oneof"` +} +type Communique_TempC struct { + TempC float64 `protobuf:"fixed64,8,opt,name=temp_c,json=tempC,oneof"` +} +type Communique_Col struct { + Col MyMessage_Color `protobuf:"varint,9,opt,name=col,enum=test_proto.MyMessage_Color,oneof"` +} +type Communique_Msg struct { + Msg *Strings `protobuf:"bytes,10,opt,name=msg,oneof"` +} + +func (*Communique_Number) isCommunique_Union() {} +func (*Communique_Name) isCommunique_Union() {} +func (*Communique_Data) isCommunique_Union() {} +func (*Communique_TempC) isCommunique_Union() {} +func (*Communique_Col) isCommunique_Union() {} +func (*Communique_Msg) isCommunique_Union() {} + +func (m *Communique) GetUnion() isCommunique_Union { + if m != nil { + return m.Union + } + return nil +} + +func (m *Communique) GetMakeMeCry() bool { + if m != nil && m.MakeMeCry != nil { + return *m.MakeMeCry + } + return false +} + +func (m *Communique) GetNumber() int32 { + if x, ok := m.GetUnion().(*Communique_Number); ok { + return x.Number + } + return 0 +} + +func (m *Communique) GetName() string { + if x, ok := m.GetUnion().(*Communique_Name); ok { + return x.Name + } + return "" +} + +func (m *Communique) GetData() []byte { + if x, ok := m.GetUnion().(*Communique_Data); ok { + return x.Data + } + return nil +} + +func (m *Communique) GetTempC() float64 { + if x, ok := m.GetUnion().(*Communique_TempC); ok { + return x.TempC + } + return 0 +} + +func (m *Communique) GetCol() MyMessage_Color { + if x, ok := m.GetUnion().(*Communique_Col); ok { + return x.Col + } + return MyMessage_RED +} + +func (m *Communique) GetMsg() *Strings { + if x, ok := m.GetUnion().(*Communique_Msg); ok { + return x.Msg + } + return nil +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*Communique) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _Communique_OneofMarshaler, _Communique_OneofUnmarshaler, _Communique_OneofSizer, []interface{}{ + (*Communique_Number)(nil), + (*Communique_Name)(nil), + (*Communique_Data)(nil), + (*Communique_TempC)(nil), + (*Communique_Col)(nil), + (*Communique_Msg)(nil), + } +} + +func _Communique_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*Communique) + // union + switch x := m.Union.(type) { + case *Communique_Number: + b.EncodeVarint(5<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.Number)) + case *Communique_Name: + b.EncodeVarint(6<<3 | proto.WireBytes) + b.EncodeStringBytes(x.Name) + case *Communique_Data: + b.EncodeVarint(7<<3 | proto.WireBytes) + b.EncodeRawBytes(x.Data) + case *Communique_TempC: + b.EncodeVarint(8<<3 | proto.WireFixed64) + b.EncodeFixed64(math.Float64bits(x.TempC)) + case *Communique_Col: + b.EncodeVarint(9<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.Col)) + case *Communique_Msg: + b.EncodeVarint(10<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.Msg); err != nil { + return err + } + case nil: + default: + return fmt.Errorf("Communique.Union has unexpected type %T", x) + } + return nil +} + +func _Communique_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*Communique) + switch tag { + case 5: // union.number + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Communique_Number{int32(x)} + return true, err + case 6: // union.name + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeStringBytes() + m.Union = &Communique_Name{x} + return true, err + case 7: // union.data + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeRawBytes(true) + m.Union = &Communique_Data{x} + return true, err + case 8: // union.temp_c + if wire != proto.WireFixed64 { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeFixed64() + m.Union = &Communique_TempC{math.Float64frombits(x)} + return true, err + case 9: // union.col + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Communique_Col{MyMessage_Color(x)} + return true, err + case 10: // union.msg + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(Strings) + err := b.DecodeMessage(msg) + m.Union = &Communique_Msg{msg} + return true, err + default: + return false, nil + } +} + +func _Communique_OneofSizer(msg proto.Message) (n int) { + m := msg.(*Communique) + // union + switch x := m.Union.(type) { + case *Communique_Number: + n += 1 // tag and wire + n += proto.SizeVarint(uint64(x.Number)) + case *Communique_Name: + n += 1 // tag and wire + n += proto.SizeVarint(uint64(len(x.Name))) + n += len(x.Name) + case *Communique_Data: + n += 1 // tag and wire + n += proto.SizeVarint(uint64(len(x.Data))) + n += len(x.Data) + case *Communique_TempC: + n += 1 // tag and wire + n += 8 + case *Communique_Col: + n += 1 // tag and wire + n += proto.SizeVarint(uint64(x.Col)) + case *Communique_Msg: + s := proto.Size(x.Msg) + n += 1 // tag and wire + n += proto.SizeVarint(uint64(s)) + n += s + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +var E_Greeting = &proto.ExtensionDesc{ + ExtendedType: (*MyMessage)(nil), + ExtensionType: ([]string)(nil), + Field: 106, + Name: "test_proto.greeting", + Tag: "bytes,106,rep,name=greeting", + Filename: "test_proto/test.proto", +} + +var E_Complex = &proto.ExtensionDesc{ + ExtendedType: (*OtherMessage)(nil), + ExtensionType: (*ComplexExtension)(nil), + Field: 200, + Name: "test_proto.complex", + Tag: "bytes,200,opt,name=complex", + Filename: "test_proto/test.proto", +} + +var E_RComplex = &proto.ExtensionDesc{ + ExtendedType: (*OtherMessage)(nil), + ExtensionType: ([]*ComplexExtension)(nil), + Field: 201, + Name: "test_proto.r_complex", + Tag: "bytes,201,rep,name=r_complex,json=rComplex", + Filename: "test_proto/test.proto", +} + +var E_NoDefaultDouble = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*float64)(nil), + Field: 101, + Name: "test_proto.no_default_double", + Tag: "fixed64,101,opt,name=no_default_double,json=noDefaultDouble", + Filename: "test_proto/test.proto", +} + +var E_NoDefaultFloat = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*float32)(nil), + Field: 102, + Name: "test_proto.no_default_float", + Tag: "fixed32,102,opt,name=no_default_float,json=noDefaultFloat", + Filename: "test_proto/test.proto", +} + +var E_NoDefaultInt32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int32)(nil), + Field: 103, + Name: "test_proto.no_default_int32", + Tag: "varint,103,opt,name=no_default_int32,json=noDefaultInt32", + Filename: "test_proto/test.proto", +} + +var E_NoDefaultInt64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int64)(nil), + Field: 104, + Name: "test_proto.no_default_int64", + Tag: "varint,104,opt,name=no_default_int64,json=noDefaultInt64", + Filename: "test_proto/test.proto", +} + +var E_NoDefaultUint32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*uint32)(nil), + Field: 105, + Name: "test_proto.no_default_uint32", + Tag: "varint,105,opt,name=no_default_uint32,json=noDefaultUint32", + Filename: "test_proto/test.proto", +} + +var E_NoDefaultUint64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*uint64)(nil), + Field: 106, + Name: "test_proto.no_default_uint64", + Tag: "varint,106,opt,name=no_default_uint64,json=noDefaultUint64", + Filename: "test_proto/test.proto", +} + +var E_NoDefaultSint32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int32)(nil), + Field: 107, + Name: "test_proto.no_default_sint32", + Tag: "zigzag32,107,opt,name=no_default_sint32,json=noDefaultSint32", + Filename: "test_proto/test.proto", +} + +var E_NoDefaultSint64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int64)(nil), + Field: 108, + Name: "test_proto.no_default_sint64", + Tag: "zigzag64,108,opt,name=no_default_sint64,json=noDefaultSint64", + Filename: "test_proto/test.proto", +} + +var E_NoDefaultFixed32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*uint32)(nil), + Field: 109, + Name: "test_proto.no_default_fixed32", + Tag: "fixed32,109,opt,name=no_default_fixed32,json=noDefaultFixed32", + Filename: "test_proto/test.proto", +} + +var E_NoDefaultFixed64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*uint64)(nil), + Field: 110, + Name: "test_proto.no_default_fixed64", + Tag: "fixed64,110,opt,name=no_default_fixed64,json=noDefaultFixed64", + Filename: "test_proto/test.proto", +} + +var E_NoDefaultSfixed32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int32)(nil), + Field: 111, + Name: "test_proto.no_default_sfixed32", + Tag: "fixed32,111,opt,name=no_default_sfixed32,json=noDefaultSfixed32", + Filename: "test_proto/test.proto", +} + +var E_NoDefaultSfixed64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int64)(nil), + Field: 112, + Name: "test_proto.no_default_sfixed64", + Tag: "fixed64,112,opt,name=no_default_sfixed64,json=noDefaultSfixed64", + Filename: "test_proto/test.proto", +} + +var E_NoDefaultBool = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*bool)(nil), + Field: 113, + Name: "test_proto.no_default_bool", + Tag: "varint,113,opt,name=no_default_bool,json=noDefaultBool", + Filename: "test_proto/test.proto", +} + +var E_NoDefaultString = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*string)(nil), + Field: 114, + Name: "test_proto.no_default_string", + Tag: "bytes,114,opt,name=no_default_string,json=noDefaultString", + Filename: "test_proto/test.proto", +} + +var E_NoDefaultBytes = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: ([]byte)(nil), + Field: 115, + Name: "test_proto.no_default_bytes", + Tag: "bytes,115,opt,name=no_default_bytes,json=noDefaultBytes", + Filename: "test_proto/test.proto", +} + +var E_NoDefaultEnum = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*DefaultsMessage_DefaultsEnum)(nil), + Field: 116, + Name: "test_proto.no_default_enum", + Tag: "varint,116,opt,name=no_default_enum,json=noDefaultEnum,enum=test_proto.DefaultsMessage_DefaultsEnum", + Filename: "test_proto/test.proto", +} + +var E_DefaultDouble = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*float64)(nil), + Field: 201, + Name: "test_proto.default_double", + Tag: "fixed64,201,opt,name=default_double,json=defaultDouble,def=3.1415", + Filename: "test_proto/test.proto", +} + +var E_DefaultFloat = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*float32)(nil), + Field: 202, + Name: "test_proto.default_float", + Tag: "fixed32,202,opt,name=default_float,json=defaultFloat,def=3.14", + Filename: "test_proto/test.proto", +} + +var E_DefaultInt32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int32)(nil), + Field: 203, + Name: "test_proto.default_int32", + Tag: "varint,203,opt,name=default_int32,json=defaultInt32,def=42", + Filename: "test_proto/test.proto", +} + +var E_DefaultInt64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int64)(nil), + Field: 204, + Name: "test_proto.default_int64", + Tag: "varint,204,opt,name=default_int64,json=defaultInt64,def=43", + Filename: "test_proto/test.proto", +} + +var E_DefaultUint32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*uint32)(nil), + Field: 205, + Name: "test_proto.default_uint32", + Tag: "varint,205,opt,name=default_uint32,json=defaultUint32,def=44", + Filename: "test_proto/test.proto", +} + +var E_DefaultUint64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*uint64)(nil), + Field: 206, + Name: "test_proto.default_uint64", + Tag: "varint,206,opt,name=default_uint64,json=defaultUint64,def=45", + Filename: "test_proto/test.proto", +} + +var E_DefaultSint32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int32)(nil), + Field: 207, + Name: "test_proto.default_sint32", + Tag: "zigzag32,207,opt,name=default_sint32,json=defaultSint32,def=46", + Filename: "test_proto/test.proto", +} + +var E_DefaultSint64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int64)(nil), + Field: 208, + Name: "test_proto.default_sint64", + Tag: "zigzag64,208,opt,name=default_sint64,json=defaultSint64,def=47", + Filename: "test_proto/test.proto", +} + +var E_DefaultFixed32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*uint32)(nil), + Field: 209, + Name: "test_proto.default_fixed32", + Tag: "fixed32,209,opt,name=default_fixed32,json=defaultFixed32,def=48", + Filename: "test_proto/test.proto", +} + +var E_DefaultFixed64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*uint64)(nil), + Field: 210, + Name: "test_proto.default_fixed64", + Tag: "fixed64,210,opt,name=default_fixed64,json=defaultFixed64,def=49", + Filename: "test_proto/test.proto", +} + +var E_DefaultSfixed32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int32)(nil), + Field: 211, + Name: "test_proto.default_sfixed32", + Tag: "fixed32,211,opt,name=default_sfixed32,json=defaultSfixed32,def=50", + Filename: "test_proto/test.proto", +} + +var E_DefaultSfixed64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int64)(nil), + Field: 212, + Name: "test_proto.default_sfixed64", + Tag: "fixed64,212,opt,name=default_sfixed64,json=defaultSfixed64,def=51", + Filename: "test_proto/test.proto", +} + +var E_DefaultBool = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*bool)(nil), + Field: 213, + Name: "test_proto.default_bool", + Tag: "varint,213,opt,name=default_bool,json=defaultBool,def=1", + Filename: "test_proto/test.proto", +} + +var E_DefaultString = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*string)(nil), + Field: 214, + Name: "test_proto.default_string", + Tag: "bytes,214,opt,name=default_string,json=defaultString,def=Hello, string,def=foo", + Filename: "test_proto/test.proto", +} + +var E_DefaultBytes = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: ([]byte)(nil), + Field: 215, + Name: "test_proto.default_bytes", + Tag: "bytes,215,opt,name=default_bytes,json=defaultBytes,def=Hello, bytes", + Filename: "test_proto/test.proto", +} + +var E_DefaultEnum = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*DefaultsMessage_DefaultsEnum)(nil), + Field: 216, + Name: "test_proto.default_enum", + Tag: "varint,216,opt,name=default_enum,json=defaultEnum,enum=test_proto.DefaultsMessage_DefaultsEnum,def=1", + Filename: "test_proto/test.proto", +} + +var E_X201 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 201, + Name: "test_proto.x201", + Tag: "bytes,201,opt,name=x201", + Filename: "test_proto/test.proto", +} + +var E_X202 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 202, + Name: "test_proto.x202", + Tag: "bytes,202,opt,name=x202", + Filename: "test_proto/test.proto", +} + +var E_X203 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 203, + Name: "test_proto.x203", + Tag: "bytes,203,opt,name=x203", + Filename: "test_proto/test.proto", +} + +var E_X204 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 204, + Name: "test_proto.x204", + Tag: "bytes,204,opt,name=x204", + Filename: "test_proto/test.proto", +} + +var E_X205 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 205, + Name: "test_proto.x205", + Tag: "bytes,205,opt,name=x205", + Filename: "test_proto/test.proto", +} + +var E_X206 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 206, + Name: "test_proto.x206", + Tag: "bytes,206,opt,name=x206", + Filename: "test_proto/test.proto", +} + +var E_X207 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 207, + Name: "test_proto.x207", + Tag: "bytes,207,opt,name=x207", + Filename: "test_proto/test.proto", +} + +var E_X208 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 208, + Name: "test_proto.x208", + Tag: "bytes,208,opt,name=x208", + Filename: "test_proto/test.proto", +} + +var E_X209 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 209, + Name: "test_proto.x209", + Tag: "bytes,209,opt,name=x209", + Filename: "test_proto/test.proto", +} + +var E_X210 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 210, + Name: "test_proto.x210", + Tag: "bytes,210,opt,name=x210", + Filename: "test_proto/test.proto", +} + +var E_X211 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 211, + Name: "test_proto.x211", + Tag: "bytes,211,opt,name=x211", + Filename: "test_proto/test.proto", +} + +var E_X212 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 212, + Name: "test_proto.x212", + Tag: "bytes,212,opt,name=x212", + Filename: "test_proto/test.proto", +} + +var E_X213 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 213, + Name: "test_proto.x213", + Tag: "bytes,213,opt,name=x213", + Filename: "test_proto/test.proto", +} + +var E_X214 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 214, + Name: "test_proto.x214", + Tag: "bytes,214,opt,name=x214", + Filename: "test_proto/test.proto", +} + +var E_X215 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 215, + Name: "test_proto.x215", + Tag: "bytes,215,opt,name=x215", + Filename: "test_proto/test.proto", +} + +var E_X216 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 216, + Name: "test_proto.x216", + Tag: "bytes,216,opt,name=x216", + Filename: "test_proto/test.proto", +} + +var E_X217 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 217, + Name: "test_proto.x217", + Tag: "bytes,217,opt,name=x217", + Filename: "test_proto/test.proto", +} + +var E_X218 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 218, + Name: "test_proto.x218", + Tag: "bytes,218,opt,name=x218", + Filename: "test_proto/test.proto", +} + +var E_X219 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 219, + Name: "test_proto.x219", + Tag: "bytes,219,opt,name=x219", + Filename: "test_proto/test.proto", +} + +var E_X220 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 220, + Name: "test_proto.x220", + Tag: "bytes,220,opt,name=x220", + Filename: "test_proto/test.proto", +} + +var E_X221 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 221, + Name: "test_proto.x221", + Tag: "bytes,221,opt,name=x221", + Filename: "test_proto/test.proto", +} + +var E_X222 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 222, + Name: "test_proto.x222", + Tag: "bytes,222,opt,name=x222", + Filename: "test_proto/test.proto", +} + +var E_X223 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 223, + Name: "test_proto.x223", + Tag: "bytes,223,opt,name=x223", + Filename: "test_proto/test.proto", +} + +var E_X224 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 224, + Name: "test_proto.x224", + Tag: "bytes,224,opt,name=x224", + Filename: "test_proto/test.proto", +} + +var E_X225 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 225, + Name: "test_proto.x225", + Tag: "bytes,225,opt,name=x225", + Filename: "test_proto/test.proto", +} + +var E_X226 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 226, + Name: "test_proto.x226", + Tag: "bytes,226,opt,name=x226", + Filename: "test_proto/test.proto", +} + +var E_X227 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 227, + Name: "test_proto.x227", + Tag: "bytes,227,opt,name=x227", + Filename: "test_proto/test.proto", +} + +var E_X228 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 228, + Name: "test_proto.x228", + Tag: "bytes,228,opt,name=x228", + Filename: "test_proto/test.proto", +} + +var E_X229 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 229, + Name: "test_proto.x229", + Tag: "bytes,229,opt,name=x229", + Filename: "test_proto/test.proto", +} + +var E_X230 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 230, + Name: "test_proto.x230", + Tag: "bytes,230,opt,name=x230", + Filename: "test_proto/test.proto", +} + +var E_X231 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 231, + Name: "test_proto.x231", + Tag: "bytes,231,opt,name=x231", + Filename: "test_proto/test.proto", +} + +var E_X232 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 232, + Name: "test_proto.x232", + Tag: "bytes,232,opt,name=x232", + Filename: "test_proto/test.proto", +} + +var E_X233 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 233, + Name: "test_proto.x233", + Tag: "bytes,233,opt,name=x233", + Filename: "test_proto/test.proto", +} + +var E_X234 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 234, + Name: "test_proto.x234", + Tag: "bytes,234,opt,name=x234", + Filename: "test_proto/test.proto", +} + +var E_X235 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 235, + Name: "test_proto.x235", + Tag: "bytes,235,opt,name=x235", + Filename: "test_proto/test.proto", +} + +var E_X236 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 236, + Name: "test_proto.x236", + Tag: "bytes,236,opt,name=x236", + Filename: "test_proto/test.proto", +} + +var E_X237 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 237, + Name: "test_proto.x237", + Tag: "bytes,237,opt,name=x237", + Filename: "test_proto/test.proto", +} + +var E_X238 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 238, + Name: "test_proto.x238", + Tag: "bytes,238,opt,name=x238", + Filename: "test_proto/test.proto", +} + +var E_X239 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 239, + Name: "test_proto.x239", + Tag: "bytes,239,opt,name=x239", + Filename: "test_proto/test.proto", +} + +var E_X240 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 240, + Name: "test_proto.x240", + Tag: "bytes,240,opt,name=x240", + Filename: "test_proto/test.proto", +} + +var E_X241 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 241, + Name: "test_proto.x241", + Tag: "bytes,241,opt,name=x241", + Filename: "test_proto/test.proto", +} + +var E_X242 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 242, + Name: "test_proto.x242", + Tag: "bytes,242,opt,name=x242", + Filename: "test_proto/test.proto", +} + +var E_X243 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 243, + Name: "test_proto.x243", + Tag: "bytes,243,opt,name=x243", + Filename: "test_proto/test.proto", +} + +var E_X244 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 244, + Name: "test_proto.x244", + Tag: "bytes,244,opt,name=x244", + Filename: "test_proto/test.proto", +} + +var E_X245 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 245, + Name: "test_proto.x245", + Tag: "bytes,245,opt,name=x245", + Filename: "test_proto/test.proto", +} + +var E_X246 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 246, + Name: "test_proto.x246", + Tag: "bytes,246,opt,name=x246", + Filename: "test_proto/test.proto", +} + +var E_X247 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 247, + Name: "test_proto.x247", + Tag: "bytes,247,opt,name=x247", + Filename: "test_proto/test.proto", +} + +var E_X248 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 248, + Name: "test_proto.x248", + Tag: "bytes,248,opt,name=x248", + Filename: "test_proto/test.proto", +} + +var E_X249 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 249, + Name: "test_proto.x249", + Tag: "bytes,249,opt,name=x249", + Filename: "test_proto/test.proto", +} + +var E_X250 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 250, + Name: "test_proto.x250", + Tag: "bytes,250,opt,name=x250", + Filename: "test_proto/test.proto", +} + +func init() { + proto.RegisterType((*GoEnum)(nil), "test_proto.GoEnum") + proto.RegisterType((*GoTestField)(nil), "test_proto.GoTestField") + proto.RegisterType((*GoTest)(nil), "test_proto.GoTest") + proto.RegisterType((*GoTest_RequiredGroup)(nil), "test_proto.GoTest.RequiredGroup") + proto.RegisterType((*GoTest_RepeatedGroup)(nil), "test_proto.GoTest.RepeatedGroup") + proto.RegisterType((*GoTest_OptionalGroup)(nil), "test_proto.GoTest.OptionalGroup") + proto.RegisterType((*GoTestRequiredGroupField)(nil), "test_proto.GoTestRequiredGroupField") + proto.RegisterType((*GoTestRequiredGroupField_Group)(nil), "test_proto.GoTestRequiredGroupField.Group") + proto.RegisterType((*GoSkipTest)(nil), "test_proto.GoSkipTest") + proto.RegisterType((*GoSkipTest_SkipGroup)(nil), "test_proto.GoSkipTest.SkipGroup") + proto.RegisterType((*NonPackedTest)(nil), "test_proto.NonPackedTest") + proto.RegisterType((*PackedTest)(nil), "test_proto.PackedTest") + proto.RegisterType((*MaxTag)(nil), "test_proto.MaxTag") + proto.RegisterType((*OldMessage)(nil), "test_proto.OldMessage") + proto.RegisterType((*OldMessage_Nested)(nil), "test_proto.OldMessage.Nested") + proto.RegisterType((*NewMessage)(nil), "test_proto.NewMessage") + proto.RegisterType((*NewMessage_Nested)(nil), "test_proto.NewMessage.Nested") + proto.RegisterType((*InnerMessage)(nil), "test_proto.InnerMessage") + proto.RegisterType((*OtherMessage)(nil), "test_proto.OtherMessage") + proto.RegisterType((*RequiredInnerMessage)(nil), "test_proto.RequiredInnerMessage") + proto.RegisterType((*MyMessage)(nil), "test_proto.MyMessage") + proto.RegisterType((*MyMessage_SomeGroup)(nil), "test_proto.MyMessage.SomeGroup") + proto.RegisterType((*Ext)(nil), "test_proto.Ext") + proto.RegisterMapType((map[int32]int32)(nil), "test_proto.Ext.MapFieldEntry") + proto.RegisterType((*ComplexExtension)(nil), "test_proto.ComplexExtension") + proto.RegisterType((*DefaultsMessage)(nil), "test_proto.DefaultsMessage") + proto.RegisterType((*MyMessageSet)(nil), "test_proto.MyMessageSet") + proto.RegisterType((*Empty)(nil), "test_proto.Empty") + proto.RegisterType((*MessageList)(nil), "test_proto.MessageList") + proto.RegisterType((*MessageList_Message)(nil), "test_proto.MessageList.Message") + proto.RegisterType((*Strings)(nil), "test_proto.Strings") + proto.RegisterType((*Defaults)(nil), "test_proto.Defaults") + proto.RegisterType((*SubDefaults)(nil), "test_proto.SubDefaults") + proto.RegisterType((*RepeatedEnum)(nil), "test_proto.RepeatedEnum") + proto.RegisterType((*MoreRepeated)(nil), "test_proto.MoreRepeated") + proto.RegisterType((*GroupOld)(nil), "test_proto.GroupOld") + proto.RegisterType((*GroupOld_G)(nil), "test_proto.GroupOld.G") + proto.RegisterType((*GroupNew)(nil), "test_proto.GroupNew") + proto.RegisterType((*GroupNew_G)(nil), "test_proto.GroupNew.G") + proto.RegisterType((*FloatingPoint)(nil), "test_proto.FloatingPoint") + proto.RegisterType((*MessageWithMap)(nil), "test_proto.MessageWithMap") + proto.RegisterMapType((map[bool][]byte)(nil), "test_proto.MessageWithMap.ByteMappingEntry") + proto.RegisterMapType((map[int64]*FloatingPoint)(nil), "test_proto.MessageWithMap.MsgMappingEntry") + proto.RegisterMapType((map[int32]string)(nil), "test_proto.MessageWithMap.NameMappingEntry") + proto.RegisterMapType((map[string]string)(nil), "test_proto.MessageWithMap.StrToStrEntry") + proto.RegisterType((*Oneof)(nil), "test_proto.Oneof") + proto.RegisterType((*Oneof_F_Group)(nil), "test_proto.Oneof.F_Group") + proto.RegisterType((*Communique)(nil), "test_proto.Communique") + proto.RegisterEnum("test_proto.FOO", FOO_name, FOO_value) + proto.RegisterEnum("test_proto.GoTest_KIND", GoTest_KIND_name, GoTest_KIND_value) + proto.RegisterEnum("test_proto.MyMessage_Color", MyMessage_Color_name, MyMessage_Color_value) + proto.RegisterEnum("test_proto.DefaultsMessage_DefaultsEnum", DefaultsMessage_DefaultsEnum_name, DefaultsMessage_DefaultsEnum_value) + proto.RegisterEnum("test_proto.Defaults_Color", Defaults_Color_name, Defaults_Color_value) + proto.RegisterEnum("test_proto.RepeatedEnum_Color", RepeatedEnum_Color_name, RepeatedEnum_Color_value) + proto.RegisterExtension(E_Ext_More) + proto.RegisterExtension(E_Ext_Text) + proto.RegisterExtension(E_Ext_Number) + proto.RegisterExtension(E_Greeting) + proto.RegisterExtension(E_Complex) + proto.RegisterExtension(E_RComplex) + proto.RegisterExtension(E_NoDefaultDouble) + proto.RegisterExtension(E_NoDefaultFloat) + proto.RegisterExtension(E_NoDefaultInt32) + proto.RegisterExtension(E_NoDefaultInt64) + proto.RegisterExtension(E_NoDefaultUint32) + proto.RegisterExtension(E_NoDefaultUint64) + proto.RegisterExtension(E_NoDefaultSint32) + proto.RegisterExtension(E_NoDefaultSint64) + proto.RegisterExtension(E_NoDefaultFixed32) + proto.RegisterExtension(E_NoDefaultFixed64) + proto.RegisterExtension(E_NoDefaultSfixed32) + proto.RegisterExtension(E_NoDefaultSfixed64) + proto.RegisterExtension(E_NoDefaultBool) + proto.RegisterExtension(E_NoDefaultString) + proto.RegisterExtension(E_NoDefaultBytes) + proto.RegisterExtension(E_NoDefaultEnum) + proto.RegisterExtension(E_DefaultDouble) + proto.RegisterExtension(E_DefaultFloat) + proto.RegisterExtension(E_DefaultInt32) + proto.RegisterExtension(E_DefaultInt64) + proto.RegisterExtension(E_DefaultUint32) + proto.RegisterExtension(E_DefaultUint64) + proto.RegisterExtension(E_DefaultSint32) + proto.RegisterExtension(E_DefaultSint64) + proto.RegisterExtension(E_DefaultFixed32) + proto.RegisterExtension(E_DefaultFixed64) + proto.RegisterExtension(E_DefaultSfixed32) + proto.RegisterExtension(E_DefaultSfixed64) + proto.RegisterExtension(E_DefaultBool) + proto.RegisterExtension(E_DefaultString) + proto.RegisterExtension(E_DefaultBytes) + proto.RegisterExtension(E_DefaultEnum) + proto.RegisterExtension(E_X201) + proto.RegisterExtension(E_X202) + proto.RegisterExtension(E_X203) + proto.RegisterExtension(E_X204) + proto.RegisterExtension(E_X205) + proto.RegisterExtension(E_X206) + proto.RegisterExtension(E_X207) + proto.RegisterExtension(E_X208) + proto.RegisterExtension(E_X209) + proto.RegisterExtension(E_X210) + proto.RegisterExtension(E_X211) + proto.RegisterExtension(E_X212) + proto.RegisterExtension(E_X213) + proto.RegisterExtension(E_X214) + proto.RegisterExtension(E_X215) + proto.RegisterExtension(E_X216) + proto.RegisterExtension(E_X217) + proto.RegisterExtension(E_X218) + proto.RegisterExtension(E_X219) + proto.RegisterExtension(E_X220) + proto.RegisterExtension(E_X221) + proto.RegisterExtension(E_X222) + proto.RegisterExtension(E_X223) + proto.RegisterExtension(E_X224) + proto.RegisterExtension(E_X225) + proto.RegisterExtension(E_X226) + proto.RegisterExtension(E_X227) + proto.RegisterExtension(E_X228) + proto.RegisterExtension(E_X229) + proto.RegisterExtension(E_X230) + proto.RegisterExtension(E_X231) + proto.RegisterExtension(E_X232) + proto.RegisterExtension(E_X233) + proto.RegisterExtension(E_X234) + proto.RegisterExtension(E_X235) + proto.RegisterExtension(E_X236) + proto.RegisterExtension(E_X237) + proto.RegisterExtension(E_X238) + proto.RegisterExtension(E_X239) + proto.RegisterExtension(E_X240) + proto.RegisterExtension(E_X241) + proto.RegisterExtension(E_X242) + proto.RegisterExtension(E_X243) + proto.RegisterExtension(E_X244) + proto.RegisterExtension(E_X245) + proto.RegisterExtension(E_X246) + proto.RegisterExtension(E_X247) + proto.RegisterExtension(E_X248) + proto.RegisterExtension(E_X249) + proto.RegisterExtension(E_X250) +} + +func init() { proto.RegisterFile("test_proto/test.proto", fileDescriptor_test_74787bfc6550f8a7) } + +var fileDescriptor_test_74787bfc6550f8a7 = []byte{ + // 4680 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x5b, 0xd9, 0x73, 0x1b, 0x47, + 0x7a, 0xd7, 0x0c, 0xee, 0x0f, 0x20, 0x31, 0x6c, 0xd1, 0x12, 0x44, 0x59, 0xd2, 0x08, 0x6b, 0xaf, + 0x61, 0xc9, 0xa2, 0x48, 0x60, 0x08, 0x49, 0x70, 0xec, 0xb2, 0x0e, 0x82, 0x62, 0x49, 0x24, 0xe4, + 0x21, 0x6d, 0x67, 0x95, 0x07, 0x14, 0x48, 0x0c, 0x40, 0xac, 0x80, 0x19, 0x18, 0x18, 0x44, 0x64, + 0x52, 0xa9, 0xf2, 0x63, 0xaa, 0xf2, 0x94, 0x4d, 0x52, 0x95, 0xf7, 0xbc, 0xe4, 0x25, 0xd7, 0x43, + 0xf2, 0x37, 0xc4, 0xd7, 0x5e, 0xde, 0x2b, 0xc9, 0x26, 0x9b, 0xfb, 0xce, 0xe6, 0xde, 0x23, 0x2f, + 0x4e, 0xf5, 0xd7, 0x3d, 0x33, 0x3d, 0x03, 0xa8, 0x45, 0x3e, 0x71, 0xa6, 0xfb, 0xf7, 0xfd, 0xfa, + 0xfa, 0xf5, 0xf7, 0xf5, 0xd7, 0x18, 0xc2, 0x0b, 0xae, 0x35, 0x76, 0x9b, 0xc3, 0x91, 0xe3, 0x3a, + 0xd7, 0xe9, 0xe3, 0x32, 0x3e, 0x12, 0x08, 0x8a, 0x8b, 0x57, 0x21, 0xb9, 0xe1, 0xac, 0xdb, 0x93, + 0x01, 0xb9, 0x0c, 0xb1, 0x8e, 0xe3, 0x14, 0x14, 0x5d, 0x2d, 0xcd, 0x97, 0xf3, 0xcb, 0x01, 0x66, + 0xb9, 0xde, 0x68, 0x98, 0xb4, 0xae, 0x78, 0x03, 0xb2, 0x1b, 0xce, 0xae, 0x35, 0x76, 0xeb, 0x3d, + 0xab, 0xdf, 0x26, 0x8b, 0x90, 0x78, 0xd8, 0xda, 0xb3, 0xfa, 0x68, 0x93, 0x31, 0xd9, 0x0b, 0x21, + 0x10, 0xdf, 0x3d, 0x1a, 0x5a, 0x05, 0x15, 0x0b, 0xf1, 0xb9, 0xf8, 0x87, 0x45, 0xda, 0x0c, 0xb5, + 0x24, 0x57, 0x21, 0xfe, 0xa0, 0x67, 0xb7, 0x79, 0x3b, 0x67, 0xc5, 0x76, 0x18, 0x62, 0xf9, 0xc1, + 0xe6, 0xf6, 0x3d, 0x13, 0x41, 0xb4, 0x85, 0xdd, 0xd6, 0x5e, 0x9f, 0x92, 0x29, 0xb4, 0x05, 0x7c, + 0xa1, 0xa5, 0x8f, 0x5a, 0xa3, 0xd6, 0xa0, 0x10, 0xd3, 0x95, 0x52, 0xc2, 0x64, 0x2f, 0xe4, 0x0d, + 0x98, 0x33, 0xad, 0xf7, 0x27, 0xbd, 0x91, 0xd5, 0xc6, 0xee, 0x15, 0xe2, 0xba, 0x5a, 0xca, 0xce, + 0x6a, 0x01, 0xab, 0xcd, 0x30, 0x9a, 0x99, 0x0f, 0xad, 0x96, 0xeb, 0x99, 0x27, 0xf4, 0xd8, 0x73, + 0xcc, 0x05, 0x34, 0x35, 0x6f, 0x0c, 0xdd, 0x9e, 0x63, 0xb7, 0xfa, 0xcc, 0x3c, 0xa9, 0x2b, 0x52, + 0xf3, 0x10, 0x9a, 0x7c, 0x11, 0xf2, 0xf5, 0xe6, 0x1d, 0xc7, 0xe9, 0x37, 0x47, 0xbc, 0x57, 0x05, + 0xd0, 0xd5, 0x52, 0xda, 0x9c, 0xab, 0xd3, 0x52, 0xaf, 0xab, 0xa4, 0x04, 0x5a, 0xbd, 0xb9, 0x69, + 0xbb, 0x95, 0x72, 0x00, 0xcc, 0xea, 0x6a, 0x29, 0x61, 0xce, 0xd7, 0xb1, 0x78, 0x0a, 0x59, 0x35, + 0x02, 0x64, 0x4e, 0x57, 0x4b, 0x31, 0x86, 0xac, 0x1a, 0x3e, 0xf2, 0x35, 0x20, 0xf5, 0x66, 0xbd, + 0x77, 0x68, 0xb5, 0x45, 0xd6, 0x39, 0x5d, 0x2d, 0xa5, 0x4c, 0xad, 0xce, 0x2b, 0x66, 0xa0, 0x45, + 0xe6, 0x79, 0x5d, 0x2d, 0x25, 0x3d, 0xb4, 0xc0, 0x7d, 0x05, 0x16, 0xea, 0xcd, 0x77, 0x7a, 0xe1, + 0x0e, 0xe7, 0x75, 0xb5, 0x34, 0x67, 0xe6, 0xeb, 0xac, 0x7c, 0x1a, 0x2b, 0x12, 0x6b, 0xba, 0x5a, + 0x8a, 0x73, 0xac, 0xc0, 0x8b, 0xa3, 0xab, 0xf7, 0x9d, 0x96, 0x1b, 0x40, 0x17, 0x74, 0xb5, 0xa4, + 0x9a, 0xf3, 0x75, 0x2c, 0x0e, 0xb3, 0xde, 0x73, 0x26, 0x7b, 0x7d, 0x2b, 0x80, 0x12, 0x5d, 0x2d, + 0x29, 0x66, 0xbe, 0xce, 0xca, 0xc3, 0xd8, 0x1d, 0x77, 0xd4, 0xb3, 0xbb, 0x01, 0xf6, 0x34, 0xea, + 0x38, 0x5f, 0x67, 0xe5, 0xe1, 0x1e, 0xdc, 0x39, 0x72, 0xad, 0x71, 0x00, 0xb5, 0x74, 0xb5, 0x94, + 0x33, 0xe7, 0xeb, 0x58, 0x1c, 0x61, 0x8d, 0xcc, 0x41, 0x47, 0x57, 0x4b, 0x0b, 0x94, 0x75, 0xc6, + 0x1c, 0xec, 0x44, 0xe6, 0xa0, 0xab, 0xab, 0x25, 0xc2, 0xb1, 0xc2, 0x1c, 0x2c, 0xc3, 0xe9, 0x7a, + 0x73, 0xa7, 0x13, 0x5d, 0xb8, 0x03, 0x5d, 0x2d, 0xe5, 0xcd, 0x85, 0xba, 0x57, 0x33, 0x0b, 0x2f, + 0xb2, 0xf7, 0x74, 0xb5, 0xa4, 0xf9, 0x78, 0x81, 0x5f, 0xd4, 0x24, 0x93, 0x7a, 0x61, 0x51, 0x8f, + 0x09, 0x9a, 0x64, 0x85, 0x61, 0x4d, 0x72, 0xe0, 0x0b, 0x7a, 0x4c, 0xd4, 0x64, 0x04, 0x89, 0xcd, + 0x73, 0xe4, 0x19, 0x3d, 0x26, 0x6a, 0x92, 0x23, 0x23, 0x9a, 0xe4, 0xd8, 0xb3, 0x7a, 0x2c, 0xac, + 0xc9, 0x29, 0xb4, 0xc8, 0x5c, 0xd0, 0x63, 0x61, 0x4d, 0x72, 0x74, 0x58, 0x93, 0x1c, 0x7c, 0x4e, + 0x8f, 0x85, 0x34, 0x19, 0xc5, 0x8a, 0xc4, 0x4b, 0x7a, 0x2c, 0xa4, 0x49, 0x71, 0x74, 0x9e, 0x26, + 0x39, 0xf4, 0xbc, 0x1e, 0x13, 0x35, 0x29, 0xb2, 0xfa, 0x9a, 0xe4, 0xd0, 0x17, 0xf5, 0x58, 0x48, + 0x93, 0x22, 0xd6, 0xd7, 0x24, 0xc7, 0x5e, 0xd0, 0x63, 0x21, 0x4d, 0x72, 0xec, 0xab, 0xa2, 0x26, + 0x39, 0xf4, 0x43, 0x45, 0x8f, 0x89, 0xa2, 0xe4, 0xd0, 0xab, 0x21, 0x51, 0x72, 0xec, 0x47, 0x14, + 0x2b, 0xaa, 0x32, 0x0a, 0x16, 0x67, 0xe1, 0x63, 0x0a, 0x16, 0x65, 0xc9, 0xc1, 0xd7, 0x23, 0xb2, + 0xe4, 0xf0, 0x4f, 0x28, 0x3c, 0xac, 0xcb, 0x69, 0x03, 0x91, 0xff, 0x53, 0x6a, 0x10, 0x16, 0x26, + 0x37, 0x08, 0x84, 0xe9, 0x70, 0x27, 0x5a, 0xb8, 0xa8, 0x2b, 0xbe, 0x30, 0x3d, 0xcf, 0x2a, 0x0a, + 0xd3, 0x07, 0x5e, 0xc2, 0x90, 0xc1, 0x85, 0x39, 0x85, 0xac, 0x1a, 0x01, 0x52, 0xd7, 0x95, 0x40, + 0x98, 0x3e, 0x32, 0x24, 0x4c, 0x1f, 0x7b, 0x59, 0x57, 0x44, 0x61, 0xce, 0x40, 0x8b, 0xcc, 0x45, + 0x5d, 0x11, 0x85, 0xe9, 0xa3, 0x45, 0x61, 0xfa, 0xe0, 0x2f, 0xe8, 0x8a, 0x20, 0xcc, 0x69, 0xac, + 0x48, 0xfc, 0x92, 0xae, 0x08, 0xc2, 0x0c, 0x8f, 0x8e, 0x09, 0xd3, 0x87, 0xbe, 0xac, 0x2b, 0x81, + 0x30, 0xc3, 0xac, 0x5c, 0x98, 0x3e, 0xf4, 0x8b, 0xba, 0x22, 0x08, 0x33, 0x8c, 0xe5, 0xc2, 0xf4, + 0xb1, 0xaf, 0x60, 0x9c, 0xf6, 0x84, 0xe9, 0x63, 0x05, 0x61, 0xfa, 0xd0, 0xdf, 0xa1, 0x31, 0xdd, + 0x17, 0xa6, 0x0f, 0x15, 0x85, 0xe9, 0x63, 0x7f, 0x97, 0x62, 0x03, 0x61, 0x4e, 0x83, 0xc5, 0x59, + 0xf8, 0x3d, 0x0a, 0x0e, 0x84, 0xe9, 0x83, 0xc3, 0xc2, 0xf4, 0xe1, 0xbf, 0x4f, 0xe1, 0xa2, 0x30, + 0x67, 0x19, 0x88, 0xfc, 0x7f, 0x40, 0x0d, 0x44, 0x61, 0xfa, 0x06, 0xcb, 0x38, 0x4c, 0x2a, 0xcc, + 0xb6, 0xd5, 0x69, 0x4d, 0xfa, 0x54, 0xc6, 0x25, 0xaa, 0xcc, 0x5a, 0xdc, 0x1d, 0x4d, 0x2c, 0x3a, + 0x56, 0xc7, 0xe9, 0xdf, 0xf3, 0xea, 0xc8, 0x32, 0xed, 0x3e, 0x13, 0x68, 0x60, 0xf0, 0x2a, 0x55, + 0x68, 0x4d, 0xad, 0x94, 0xcd, 0x3c, 0x53, 0xe9, 0x34, 0xbe, 0x6a, 0x08, 0xf8, 0x2b, 0x54, 0xa7, + 0x35, 0xb5, 0x6a, 0x30, 0x7c, 0xd5, 0x08, 0xf0, 0x15, 0x3a, 0x00, 0x4f, 0xac, 0x81, 0xc5, 0x55, + 0xaa, 0xd6, 0x5a, 0xac, 0x52, 0x5e, 0x31, 0x17, 0x3c, 0xc9, 0xce, 0x32, 0x0a, 0x35, 0xf3, 0x1a, + 0x15, 0x6d, 0x2d, 0x56, 0x35, 0x7c, 0x23, 0xb1, 0xa5, 0x32, 0x15, 0x3a, 0x97, 0x6e, 0x60, 0x73, + 0x8d, 0x6a, 0xb7, 0x16, 0xaf, 0x94, 0x57, 0x56, 0x4c, 0x8d, 0x2b, 0x78, 0x86, 0x4d, 0xa8, 0x9d, + 0x65, 0xaa, 0xe1, 0x5a, 0xbc, 0x6a, 0xf8, 0x36, 0xe1, 0x76, 0x16, 0x3c, 0x29, 0x07, 0x26, 0xd7, + 0xa9, 0x96, 0x6b, 0xc9, 0xca, 0xaa, 0xb1, 0xba, 0x76, 0xcb, 0xcc, 0x33, 0x4d, 0x07, 0x36, 0x06, + 0x6d, 0x87, 0x8b, 0x3a, 0x30, 0x5a, 0xa1, 0xaa, 0xae, 0x25, 0xcb, 0x37, 0x56, 0x6f, 0x96, 0x6f, + 0x9a, 0x1a, 0x57, 0x77, 0x60, 0xf5, 0x26, 0xb5, 0xe2, 0xf2, 0x0e, 0xac, 0x56, 0xa9, 0xbe, 0x6b, + 0xda, 0x81, 0xd5, 0xef, 0x3b, 0xaf, 0xe9, 0xc5, 0xa7, 0xce, 0xa8, 0xdf, 0xbe, 0x5c, 0x04, 0x53, + 0xe3, 0x8a, 0x17, 0x5b, 0x5d, 0xf0, 0x24, 0x1f, 0x98, 0xff, 0x2a, 0x3d, 0xb1, 0xe6, 0x6a, 0xa9, + 0x3b, 0xbd, 0xae, 0xed, 0x8c, 0x2d, 0x33, 0xcf, 0xc4, 0x1f, 0x99, 0x93, 0x9d, 0xe8, 0x3c, 0x7e, + 0x85, 0x9a, 0x2d, 0xd4, 0x62, 0xd7, 0x2a, 0x65, 0xda, 0xd2, 0xac, 0x79, 0xdc, 0x89, 0xce, 0xe3, + 0xaf, 0x51, 0x1b, 0x52, 0x8b, 0x5d, 0xab, 0x1a, 0xdc, 0x46, 0x9c, 0xc7, 0x2a, 0x2c, 0x0a, 0x7b, + 0x21, 0xb0, 0xfa, 0x75, 0x6a, 0x95, 0x67, 0x2d, 0x11, 0x7f, 0x47, 0xcc, 0xb4, 0x0b, 0xb5, 0xf6, + 0x1b, 0xd4, 0x4e, 0x63, 0xad, 0x11, 0x7f, 0x63, 0x04, 0x76, 0x37, 0xe0, 0x4c, 0xe4, 0x2c, 0xd1, + 0x1c, 0xb6, 0xf6, 0x9f, 0x58, 0xed, 0x42, 0x99, 0x1e, 0x29, 0xee, 0xa8, 0x9a, 0x62, 0x9e, 0x0e, + 0x1d, 0x2b, 0x1e, 0x61, 0x35, 0xb9, 0x05, 0x67, 0xa3, 0x87, 0x0b, 0xcf, 0xb2, 0x42, 0xcf, 0x18, + 0x68, 0xb9, 0x18, 0x3e, 0x67, 0x44, 0x4c, 0x85, 0xa0, 0xe2, 0x99, 0x1a, 0xf4, 0xd0, 0x11, 0x98, + 0x06, 0xb1, 0x85, 0x9b, 0xbe, 0x01, 0xe7, 0xa6, 0x8f, 0x1f, 0x9e, 0xf1, 0x1a, 0x3d, 0x85, 0xa0, + 0xf1, 0x99, 0xe8, 0x49, 0x64, 0xca, 0x7c, 0x46, 0xdb, 0x55, 0x7a, 0x2c, 0x11, 0xcd, 0xa7, 0x5a, + 0x7f, 0x1d, 0x0a, 0x53, 0x07, 0x14, 0xcf, 0xfa, 0x06, 0x3d, 0xa7, 0xa0, 0xf5, 0x0b, 0x91, 0xb3, + 0x4a, 0xd4, 0x78, 0x46, 0xd3, 0x37, 0xe9, 0xc1, 0x45, 0x30, 0x9e, 0x6a, 0x19, 0xa7, 0x2c, 0x7c, + 0x84, 0xf1, 0x6c, 0x6f, 0xd1, 0x93, 0x0c, 0x9f, 0xb2, 0xd0, 0x69, 0x46, 0x6c, 0x37, 0x72, 0xa6, + 0xf1, 0x6c, 0x6b, 0xf4, 0x68, 0xc3, 0xdb, 0x0d, 0x1f, 0x6f, 0xb8, 0xf1, 0xcf, 0x50, 0xe3, 0x9d, + 0xd9, 0x23, 0xfe, 0x51, 0x8c, 0x1e, 0x4a, 0xb8, 0xf5, 0xce, 0xac, 0x21, 0xfb, 0xd6, 0x33, 0x86, + 0xfc, 0x63, 0x6a, 0x4d, 0x04, 0xeb, 0xa9, 0x31, 0xbf, 0x05, 0x4b, 0x33, 0xce, 0x2b, 0x9e, 0xfd, + 0x4f, 0xa8, 0x7d, 0x1e, 0xed, 0xcf, 0x4e, 0x1d, 0x5d, 0xa6, 0x19, 0x66, 0xf4, 0xe0, 0xa7, 0x94, + 0x41, 0x0b, 0x31, 0x4c, 0xf5, 0xa1, 0x0e, 0x73, 0xde, 0x79, 0xbc, 0x3b, 0x72, 0x26, 0xc3, 0x42, + 0x5d, 0x57, 0x4b, 0x50, 0xd6, 0x67, 0x64, 0xc7, 0xde, 0xf1, 0x7c, 0x83, 0xe2, 0xcc, 0xb0, 0x19, + 0xe3, 0x61, 0xcc, 0x8c, 0xe7, 0x91, 0x1e, 0x7b, 0x26, 0x0f, 0xc3, 0xf9, 0x3c, 0x82, 0x19, 0xe5, + 0xf1, 0xc2, 0x1d, 0xe3, 0x79, 0xac, 0x2b, 0xcf, 0xe0, 0xf1, 0x82, 0x1f, 0xe7, 0x09, 0x99, 0x2d, + 0xad, 0x05, 0x39, 0x39, 0xd6, 0x93, 0x97, 0xa2, 0x49, 0xfa, 0x06, 0x66, 0x57, 0xe1, 0x42, 0x66, + 0x26, 0x74, 0x6f, 0xda, 0xec, 0xed, 0x67, 0x98, 0x85, 0x7a, 0x33, 0x6d, 0xf6, 0x73, 0x33, 0xcc, + 0x8a, 0xbf, 0xa9, 0x40, 0xfc, 0xc1, 0xe6, 0xf6, 0x3d, 0x92, 0x86, 0xf8, 0xbb, 0x8d, 0xcd, 0x7b, + 0xda, 0x29, 0xfa, 0x74, 0xa7, 0xd1, 0x78, 0xa8, 0x29, 0x24, 0x03, 0x89, 0x3b, 0x5f, 0xda, 0x5d, + 0xdf, 0xd1, 0x54, 0x92, 0x87, 0x6c, 0x7d, 0x73, 0x7b, 0x63, 0xdd, 0x7c, 0x64, 0x6e, 0x6e, 0xef, + 0x6a, 0x31, 0x5a, 0x57, 0x7f, 0xd8, 0xb8, 0xbd, 0xab, 0xc5, 0x49, 0x0a, 0x62, 0xb4, 0x2c, 0x41, + 0x00, 0x92, 0x3b, 0xbb, 0xe6, 0xe6, 0xf6, 0x86, 0x96, 0xa4, 0x2c, 0xbb, 0x9b, 0x5b, 0xeb, 0x5a, + 0x8a, 0x22, 0x77, 0xdf, 0x79, 0xf4, 0x70, 0x5d, 0x4b, 0xd3, 0xc7, 0xdb, 0xa6, 0x79, 0xfb, 0x4b, + 0x5a, 0x86, 0x1a, 0x6d, 0xdd, 0x7e, 0xa4, 0x01, 0x56, 0xdf, 0xbe, 0xf3, 0x70, 0x5d, 0xcb, 0x92, + 0x1c, 0xa4, 0xeb, 0xef, 0x6c, 0xdf, 0xdd, 0xdd, 0x6c, 0x6c, 0x6b, 0xb9, 0xe2, 0x2f, 0x42, 0x81, + 0x4d, 0x73, 0x68, 0x16, 0xd9, 0x95, 0xc1, 0x5b, 0x90, 0x60, 0x6b, 0xa3, 0xa0, 0x56, 0xae, 0x4c, + 0xaf, 0xcd, 0xb4, 0xd1, 0x32, 0x5b, 0x25, 0x66, 0xb8, 0x74, 0x01, 0x12, 0x6c, 0x9e, 0x16, 0x21, + 0xc1, 0xe6, 0x47, 0xc5, 0xab, 0x04, 0xf6, 0x52, 0xfc, 0x2d, 0x15, 0x60, 0xc3, 0xd9, 0x79, 0xd2, + 0x1b, 0xe2, 0xc5, 0xcd, 0x05, 0x80, 0xf1, 0x93, 0xde, 0xb0, 0x89, 0x3b, 0x90, 0x5f, 0x3a, 0x64, + 0x68, 0x09, 0xfa, 0x5e, 0x72, 0x19, 0x72, 0x58, 0xcd, 0xb7, 0x08, 0xde, 0x35, 0xa4, 0xcc, 0x2c, + 0x2d, 0xe3, 0x4e, 0x32, 0x0c, 0xa9, 0x1a, 0x78, 0xc5, 0x90, 0x14, 0x20, 0x55, 0x83, 0x5c, 0x02, + 0x7c, 0x6d, 0x8e, 0x31, 0x9a, 0xe2, 0xb5, 0x42, 0xc6, 0xc4, 0x76, 0x59, 0x7c, 0x25, 0x6f, 0x02, + 0xb6, 0xc9, 0x46, 0x9e, 0x9f, 0xb5, 0x4b, 0xbc, 0x0e, 0x2f, 0xd3, 0x07, 0x36, 0xde, 0xc0, 0x64, + 0xa9, 0x01, 0x19, 0xbf, 0x9c, 0xb6, 0x86, 0xa5, 0x7c, 0x4c, 0x1a, 0x8e, 0x09, 0xb0, 0xc8, 0x1f, + 0x14, 0x03, 0xf0, 0xfe, 0x2c, 0x60, 0x7f, 0x98, 0x11, 0xeb, 0x50, 0xf1, 0x02, 0xcc, 0x6d, 0x3b, + 0x36, 0xdb, 0xc7, 0x38, 0x4f, 0x39, 0x50, 0x5a, 0x05, 0x05, 0xf3, 0x5f, 0xa5, 0x55, 0xbc, 0x08, + 0x20, 0xd4, 0x69, 0xa0, 0xec, 0xb1, 0x3a, 0xf4, 0x07, 0xca, 0x5e, 0xf1, 0x2a, 0x24, 0xb7, 0x5a, + 0x87, 0xbb, 0xad, 0x2e, 0xb9, 0x0c, 0xd0, 0x6f, 0x8d, 0xdd, 0x66, 0x07, 0x57, 0xe2, 0xf3, 0xcf, + 0x3f, 0xff, 0x5c, 0xc1, 0xc3, 0x74, 0x86, 0x96, 0xb2, 0x15, 0x19, 0x03, 0x34, 0xfa, 0xed, 0x2d, + 0x6b, 0x3c, 0x6e, 0x75, 0x2d, 0xb2, 0x06, 0x49, 0xdb, 0x1a, 0xd3, 0xe8, 0xab, 0xe0, 0x5d, 0xd3, + 0x05, 0x71, 0x1e, 0x02, 0xdc, 0xf2, 0x36, 0x82, 0x4c, 0x0e, 0x26, 0x1a, 0xc4, 0xec, 0xc9, 0x00, + 0x6f, 0xd4, 0x12, 0x26, 0x7d, 0x5c, 0x7a, 0x11, 0x92, 0x0c, 0x43, 0x08, 0xc4, 0xed, 0xd6, 0xc0, + 0x2a, 0xb0, 0x96, 0xf1, 0xb9, 0xf8, 0x15, 0x05, 0x60, 0xdb, 0x7a, 0x7a, 0xac, 0x56, 0x03, 0x9c, + 0xa4, 0xd5, 0x18, 0x6b, 0xf5, 0x75, 0x59, 0xab, 0x54, 0x6d, 0x1d, 0xc7, 0x69, 0x37, 0xd9, 0x42, + 0xb3, 0xeb, 0xbf, 0x0c, 0x2d, 0xc1, 0x95, 0x2b, 0x3e, 0x86, 0xdc, 0xa6, 0x6d, 0x5b, 0x23, 0xaf, + 0x57, 0x04, 0xe2, 0x07, 0xce, 0xd8, 0xe5, 0x37, 0x91, 0xf8, 0x4c, 0x0a, 0x10, 0x1f, 0x3a, 0x23, + 0x97, 0x8d, 0xb4, 0x16, 0x37, 0x56, 0x56, 0x56, 0x4c, 0x2c, 0x21, 0x2f, 0x42, 0x66, 0xdf, 0xb1, + 0x6d, 0x6b, 0x9f, 0x0e, 0x23, 0x86, 0xa9, 0x63, 0x50, 0x50, 0xfc, 0x65, 0x05, 0x72, 0x0d, 0xf7, + 0x20, 0x20, 0xd7, 0x20, 0xf6, 0xc4, 0x3a, 0xc2, 0xee, 0xc5, 0x4c, 0xfa, 0x48, 0x37, 0xcc, 0xcf, + 0xb7, 0xfa, 0x13, 0x76, 0x2f, 0x99, 0x33, 0xd9, 0x0b, 0x39, 0x03, 0xc9, 0xa7, 0x56, 0xaf, 0x7b, + 0xe0, 0x22, 0xa7, 0x6a, 0xf2, 0x37, 0xb2, 0x0c, 0x89, 0x1e, 0xed, 0x6c, 0x21, 0x8e, 0x33, 0x56, + 0x10, 0x67, 0x4c, 0x1c, 0x85, 0xc9, 0x60, 0x57, 0xd2, 0xe9, 0xb6, 0xf6, 0xc1, 0x07, 0x1f, 0x7c, + 0xa0, 0x16, 0x0f, 0x60, 0xd1, 0xdb, 0xc4, 0xa1, 0xe1, 0x3e, 0x82, 0x42, 0xdf, 0x72, 0x9a, 0x9d, + 0x9e, 0xdd, 0xea, 0xf7, 0x8f, 0x9a, 0x4f, 0x1d, 0xbb, 0xd9, 0xb2, 0x9b, 0xce, 0x78, 0xbf, 0x35, + 0xc2, 0x29, 0x90, 0x35, 0xb2, 0xd8, 0xb7, 0x9c, 0x3a, 0x33, 0x7c, 0xcf, 0xb1, 0x6f, 0xdb, 0x0d, + 0x6a, 0x55, 0xfc, 0x2c, 0x0e, 0x99, 0xad, 0x23, 0x8f, 0x7f, 0x11, 0x12, 0xfb, 0xce, 0xc4, 0x66, + 0xf3, 0x99, 0x30, 0xd9, 0x8b, 0xbf, 0x4e, 0xaa, 0xb0, 0x4e, 0x8b, 0x90, 0x78, 0x7f, 0xe2, 0xb8, + 0x16, 0x0e, 0x39, 0x63, 0xb2, 0x17, 0x3a, 0x63, 0x43, 0xcb, 0x2d, 0xc4, 0xf1, 0x9a, 0x82, 0x3e, + 0x06, 0x73, 0x90, 0x38, 0xd6, 0x1c, 0x90, 0x15, 0x48, 0x3a, 0x74, 0x0d, 0xc6, 0x85, 0x24, 0xde, + 0xc3, 0x86, 0x0c, 0xc4, 0xd5, 0x31, 0x39, 0x8e, 0x3c, 0x80, 0x85, 0xa7, 0x56, 0x73, 0x30, 0x19, + 0xbb, 0xcd, 0xae, 0xd3, 0x6c, 0x5b, 0xd6, 0xd0, 0x1a, 0x15, 0xe6, 0xb0, 0xb5, 0x90, 0x87, 0x98, + 0x35, 0xa1, 0xe6, 0xfc, 0x53, 0x6b, 0x6b, 0x32, 0x76, 0x37, 0x9c, 0x7b, 0x68, 0x47, 0xd6, 0x20, + 0x33, 0xb2, 0xa8, 0x5f, 0xa0, 0x5d, 0xce, 0x4d, 0xf7, 0x20, 0x64, 0x9c, 0x1e, 0x59, 0x43, 0x2c, + 0x20, 0x37, 0x20, 0xbd, 0xd7, 0x7b, 0x62, 0x8d, 0x0f, 0xac, 0x76, 0x21, 0xa5, 0x2b, 0xa5, 0xf9, + 0xf2, 0x79, 0xd1, 0xca, 0x9f, 0xe0, 0xe5, 0xbb, 0x4e, 0xdf, 0x19, 0x99, 0x3e, 0x98, 0xbc, 0x01, + 0x99, 0xb1, 0x33, 0xb0, 0x98, 0xda, 0xd3, 0x18, 0x6c, 0x2f, 0xcd, 0xb6, 0xdc, 0x71, 0x06, 0x96, + 0xe7, 0xd5, 0x3c, 0x0b, 0x72, 0x9e, 0x75, 0x77, 0x8f, 0x26, 0x13, 0x05, 0xc0, 0x0b, 0x1f, 0xda, + 0x29, 0x4c, 0x2e, 0xc8, 0x12, 0xed, 0x54, 0xb7, 0x43, 0xcf, 0x6c, 0x85, 0x2c, 0xe6, 0xf2, 0xfe, + 0xfb, 0xd2, 0x6b, 0x90, 0xf1, 0x09, 0x03, 0x77, 0xc8, 0x5c, 0x50, 0x06, 0x3d, 0x04, 0x73, 0x87, + 0xcc, 0xff, 0xbc, 0x0c, 0x09, 0xec, 0x38, 0x8d, 0x5c, 0xe6, 0x3a, 0x0d, 0x94, 0x19, 0x48, 0x6c, + 0x98, 0xeb, 0xeb, 0xdb, 0x9a, 0x82, 0x31, 0xf3, 0xe1, 0x3b, 0xeb, 0x9a, 0x2a, 0xe8, 0xf7, 0xb7, + 0x55, 0x88, 0xad, 0x1f, 0xa2, 0x72, 0xda, 0x2d, 0xb7, 0xe5, 0xed, 0x70, 0xfa, 0x4c, 0x6a, 0x90, + 0x19, 0xb4, 0xbc, 0xb6, 0x54, 0x9c, 0xe2, 0x90, 0x2f, 0x59, 0x3f, 0x74, 0x97, 0xb7, 0x5a, 0xac, + 0xe5, 0x75, 0xdb, 0x1d, 0x1d, 0x99, 0xe9, 0x01, 0x7f, 0x5d, 0x7a, 0x1d, 0xe6, 0x42, 0x55, 0xe2, + 0x16, 0x4d, 0xcc, 0xd8, 0xa2, 0x09, 0xbe, 0x45, 0x6b, 0xea, 0x4d, 0xa5, 0x5c, 0x83, 0xf8, 0xc0, + 0x19, 0x59, 0xe4, 0x85, 0x99, 0x13, 0x5c, 0xe8, 0xa2, 0x64, 0xf2, 0x91, 0xae, 0x98, 0x68, 0x53, + 0x7e, 0x15, 0xe2, 0xae, 0x75, 0xe8, 0x3e, 0xcb, 0xf6, 0x80, 0x8d, 0x8f, 0x42, 0xca, 0xd7, 0x20, + 0x69, 0x4f, 0x06, 0x7b, 0xd6, 0xe8, 0x59, 0xe0, 0x1e, 0x76, 0x8c, 0x83, 0x8a, 0xef, 0x82, 0x76, + 0xd7, 0x19, 0x0c, 0xfb, 0xd6, 0xe1, 0xfa, 0xa1, 0x6b, 0xd9, 0xe3, 0x9e, 0x63, 0xd3, 0x31, 0x74, + 0x7a, 0x23, 0x74, 0x6b, 0x38, 0x06, 0x7c, 0xa1, 0x6e, 0x66, 0x6c, 0xed, 0x3b, 0x76, 0x9b, 0x0f, + 0x8d, 0xbf, 0x51, 0xb4, 0x7b, 0xd0, 0x1b, 0x51, 0x8f, 0x46, 0x83, 0x0f, 0x7b, 0x29, 0x6e, 0x40, + 0x9e, 0xa7, 0x61, 0x63, 0xde, 0x70, 0xf1, 0x0a, 0xe4, 0xbc, 0x22, 0xfc, 0xe5, 0x27, 0x0d, 0xf1, + 0xc7, 0xeb, 0x66, 0x43, 0x3b, 0x45, 0xd7, 0xb5, 0xb1, 0xbd, 0xae, 0x29, 0xf4, 0x61, 0xf7, 0xbd, + 0x46, 0x68, 0x2d, 0x5f, 0x84, 0x9c, 0xdf, 0xf7, 0x1d, 0xcb, 0xc5, 0x1a, 0x1a, 0xa5, 0x52, 0x35, + 0x35, 0xad, 0x14, 0x53, 0x90, 0x58, 0x1f, 0x0c, 0xdd, 0xa3, 0xe2, 0x2f, 0x41, 0x96, 0x83, 0x1e, + 0xf6, 0xc6, 0x2e, 0xb9, 0x05, 0xa9, 0x01, 0x1f, 0xaf, 0x82, 0x67, 0xd1, 0xb0, 0xac, 0x03, 0xa4, + 0xf7, 0x6c, 0x7a, 0xf8, 0xa5, 0x0a, 0xa4, 0x04, 0xf7, 0xce, 0x3d, 0x8f, 0x2a, 0x7a, 0x1e, 0xe6, + 0xa3, 0x62, 0x82, 0x8f, 0x2a, 0x6e, 0x41, 0x8a, 0x05, 0xe6, 0x31, 0x1e, 0x37, 0x58, 0xfe, 0xce, + 0x34, 0xc6, 0xc4, 0x97, 0x65, 0x65, 0xec, 0x0c, 0x75, 0x09, 0xb2, 0xb8, 0x67, 0x7c, 0x15, 0x52, + 0x6f, 0x0e, 0x58, 0xc4, 0x14, 0xff, 0x47, 0x09, 0x48, 0x7b, 0x73, 0x45, 0xce, 0x43, 0x92, 0x25, + 0xb1, 0x48, 0xe5, 0x5d, 0xea, 0x24, 0x30, 0x6d, 0x25, 0xe7, 0x21, 0xc5, 0x13, 0x55, 0x1e, 0x70, + 0xd4, 0x4a, 0xd9, 0x4c, 0xb2, 0xc4, 0xd4, 0xaf, 0xac, 0x1a, 0xe8, 0x27, 0xd9, 0x75, 0x4d, 0x92, + 0xa5, 0x9e, 0x44, 0x87, 0x8c, 0x9f, 0x6c, 0x62, 0x88, 0xe0, 0x77, 0x33, 0x69, 0x2f, 0xbb, 0x14, + 0x10, 0x55, 0x03, 0x1d, 0x28, 0xbf, 0x88, 0x49, 0xd7, 0x83, 0x73, 0x53, 0xda, 0x4b, 0x19, 0xf1, + 0x97, 0x27, 0xef, 0xd6, 0x25, 0xc5, 0x93, 0xc4, 0x00, 0x50, 0x35, 0xd0, 0x33, 0x79, 0x57, 0x2c, + 0x29, 0x9e, 0x08, 0x92, 0x4b, 0xb4, 0x8b, 0x98, 0xd8, 0xa1, 0xff, 0x09, 0xee, 0x53, 0x92, 0x2c, + 0xdd, 0x23, 0x97, 0x29, 0x03, 0xcb, 0xde, 0xd0, 0x35, 0x04, 0x97, 0x27, 0x29, 0x9e, 0xd4, 0x91, + 0xab, 0x14, 0xc2, 0xa6, 0xbf, 0x00, 0xcf, 0xb8, 0x29, 0x49, 0xf1, 0x9b, 0x12, 0xa2, 0xd3, 0x06, + 0xd1, 0x43, 0xa1, 0x57, 0x12, 0x6e, 0x45, 0x92, 0xec, 0x56, 0x84, 0x5c, 0x44, 0x3a, 0x36, 0xa8, + 0x5c, 0x70, 0x03, 0x92, 0xe2, 0x59, 0x60, 0x50, 0x8f, 0x67, 0x49, 0xff, 0xb6, 0x23, 0xc5, 0xf3, + 0x3c, 0x72, 0x93, 0xae, 0x17, 0x55, 0x78, 0x61, 0x1e, 0x7d, 0xf1, 0x92, 0x28, 0x3d, 0x6f, 0x55, + 0x99, 0x2b, 0xae, 0x31, 0x37, 0x66, 0x26, 0xea, 0xb8, 0x23, 0x96, 0xa8, 0xe5, 0xa3, 0x9e, 0xdd, + 0x29, 0xe4, 0x71, 0x2e, 0x62, 0x3d, 0xbb, 0x63, 0x26, 0xea, 0xb4, 0x84, 0xa9, 0x60, 0x9b, 0xd6, + 0x69, 0x58, 0x17, 0xbf, 0xc6, 0x2a, 0x69, 0x11, 0x29, 0x40, 0xa2, 0xde, 0xdc, 0x6e, 0xd9, 0x85, + 0x05, 0x66, 0x67, 0xb7, 0x6c, 0x33, 0x5e, 0xdf, 0x6e, 0xd9, 0xe4, 0x55, 0x88, 0x8d, 0x27, 0x7b, + 0x05, 0x32, 0xfd, 0xb3, 0xe0, 0xce, 0x64, 0xcf, 0xeb, 0x8c, 0x49, 0x31, 0xe4, 0x3c, 0xa4, 0xc7, + 0xee, 0xa8, 0xf9, 0x0b, 0xd6, 0xc8, 0x29, 0x9c, 0xc6, 0x69, 0x3c, 0x65, 0xa6, 0xc6, 0xee, 0xe8, + 0xb1, 0x35, 0x72, 0x8e, 0xe9, 0x83, 0x8b, 0x17, 0x21, 0x2b, 0xf0, 0x92, 0x3c, 0x28, 0x36, 0x3b, + 0xc0, 0xd4, 0x94, 0x1b, 0xa6, 0x62, 0x17, 0xdf, 0x85, 0x9c, 0x97, 0x62, 0xe1, 0x88, 0x0d, 0xba, + 0x9b, 0xfa, 0xce, 0x08, 0x77, 0xe9, 0x7c, 0xf9, 0x62, 0x38, 0x62, 0x06, 0x40, 0x1e, 0xb9, 0x18, + 0xb8, 0xa8, 0x45, 0x3a, 0xa3, 0x14, 0x7f, 0xa0, 0x40, 0x6e, 0xcb, 0x19, 0x05, 0xbf, 0x5f, 0x2c, + 0x42, 0x62, 0xcf, 0x71, 0xfa, 0x63, 0x24, 0x4e, 0x9b, 0xec, 0x85, 0xbc, 0x0c, 0x39, 0x7c, 0xf0, + 0x92, 0x64, 0xd5, 0xbf, 0x05, 0xca, 0x62, 0x39, 0xcf, 0x8b, 0x09, 0xc4, 0x7b, 0xb6, 0x3b, 0xe6, + 0x1e, 0x0d, 0x9f, 0xc9, 0x17, 0x20, 0x4b, 0xff, 0x7a, 0x96, 0x71, 0xff, 0x34, 0x0d, 0xb4, 0x98, + 0x1b, 0xbe, 0x02, 0x73, 0xa8, 0x01, 0x1f, 0x96, 0xf2, 0x6f, 0x7c, 0x72, 0xac, 0x82, 0x03, 0x0b, + 0x90, 0x62, 0x0e, 0x61, 0x8c, 0x3f, 0xf8, 0x66, 0x4c, 0xef, 0x95, 0xba, 0x59, 0x4c, 0x54, 0xd8, + 0x09, 0x24, 0x65, 0xf2, 0xb7, 0xe2, 0x5d, 0x48, 0x63, 0xb8, 0x6c, 0xf4, 0xdb, 0xe4, 0x25, 0x50, + 0xba, 0x05, 0x0b, 0xc3, 0xf5, 0x99, 0x50, 0x16, 0xc2, 0x01, 0xcb, 0x1b, 0xa6, 0xd2, 0x5d, 0x5a, + 0x00, 0x65, 0x83, 0xa6, 0x05, 0x87, 0xdc, 0x61, 0x2b, 0x87, 0xc5, 0xb7, 0x39, 0xc9, 0xb6, 0xf5, + 0x54, 0x4e, 0xb2, 0x6d, 0x3d, 0x65, 0x24, 0x97, 0xa6, 0x48, 0xe8, 0xdb, 0x11, 0xff, 0x0d, 0x5c, + 0x39, 0x2a, 0x56, 0x60, 0x0e, 0x37, 0x6a, 0xcf, 0xee, 0x3e, 0x72, 0x7a, 0x36, 0x26, 0x22, 0x1d, + 0x3c, 0xc0, 0x29, 0xa6, 0xd2, 0xa1, 0xeb, 0x60, 0x1d, 0xb6, 0xf6, 0xd9, 0x71, 0x38, 0x6d, 0xb2, + 0x97, 0xe2, 0xf7, 0xe3, 0x30, 0xcf, 0x9d, 0xec, 0x7b, 0x3d, 0xf7, 0x60, 0xab, 0x35, 0x24, 0xdb, + 0x90, 0xa3, 0xfe, 0xb5, 0x39, 0x68, 0x0d, 0x87, 0x74, 0x23, 0x2b, 0x18, 0x9a, 0xaf, 0xce, 0x70, + 0xdb, 0xdc, 0x62, 0x79, 0xbb, 0x35, 0xb0, 0xb6, 0x18, 0x9a, 0x05, 0xea, 0xac, 0x1d, 0x94, 0x90, + 0x07, 0x90, 0x1d, 0x8c, 0xbb, 0x3e, 0x1d, 0x8b, 0xf4, 0x57, 0x24, 0x74, 0x5b, 0xe3, 0x6e, 0x88, + 0x0d, 0x06, 0x7e, 0x01, 0xed, 0x1c, 0xf5, 0xce, 0x3e, 0x5b, 0xec, 0xb9, 0x9d, 0xa3, 0xae, 0x24, + 0xdc, 0xb9, 0xbd, 0xa0, 0x84, 0xd4, 0x01, 0xe8, 0x56, 0x73, 0x1d, 0x9a, 0xe1, 0xa1, 0x96, 0xb2, + 0xe5, 0x92, 0x84, 0x6d, 0xc7, 0x1d, 0xed, 0x3a, 0x3b, 0xee, 0x88, 0x1f, 0x48, 0xc6, 0xfc, 0x75, + 0xe9, 0x4d, 0xd0, 0xa2, 0xb3, 0xf0, 0xbc, 0x33, 0x49, 0x46, 0x38, 0x93, 0x2c, 0xfd, 0x2c, 0xe4, + 0x23, 0xc3, 0x16, 0xcd, 0x09, 0x33, 0xbf, 0x2e, 0x9a, 0x67, 0xcb, 0xe7, 0x42, 0xdf, 0x68, 0x88, + 0x4b, 0x2f, 0x32, 0xbf, 0x09, 0x5a, 0x74, 0x0a, 0x44, 0xea, 0xb4, 0x24, 0xa1, 0x41, 0xfb, 0xd7, + 0x61, 0x2e, 0x34, 0x68, 0xd1, 0x38, 0xf3, 0x9c, 0x61, 0x15, 0x7f, 0x25, 0x01, 0x89, 0x86, 0x6d, + 0x39, 0x1d, 0x72, 0x36, 0x1c, 0x3b, 0xef, 0x9f, 0xf2, 0xe2, 0xe6, 0xb9, 0x48, 0xdc, 0xbc, 0x7f, + 0xca, 0x8f, 0x9a, 0xe7, 0x22, 0x51, 0xd3, 0xab, 0xaa, 0x1a, 0xe4, 0xc2, 0x54, 0xcc, 0xbc, 0x7f, + 0x4a, 0x08, 0x98, 0x17, 0xa6, 0x02, 0x66, 0x50, 0x5d, 0x35, 0xa8, 0x83, 0x0d, 0x47, 0xcb, 0xfb, + 0xa7, 0x82, 0x48, 0x79, 0x3e, 0x1a, 0x29, 0xfd, 0xca, 0xaa, 0xc1, 0xba, 0x24, 0x44, 0x49, 0xec, + 0x12, 0x8b, 0x8f, 0xe7, 0xa3, 0xf1, 0x11, 0xed, 0x78, 0x64, 0x3c, 0x1f, 0x8d, 0x8c, 0x58, 0xc9, + 0x23, 0xe1, 0xb9, 0x48, 0x24, 0x44, 0x52, 0x16, 0x02, 0xcf, 0x47, 0x43, 0x20, 0xb3, 0x13, 0x7a, + 0x2a, 0xc6, 0x3f, 0xbf, 0xb2, 0x6a, 0x10, 0x23, 0x12, 0xfc, 0x64, 0x89, 0x08, 0xae, 0x06, 0x86, + 0x81, 0x2a, 0x9d, 0x38, 0xef, 0x80, 0x9a, 0x97, 0x7e, 0xc2, 0x82, 0x33, 0xea, 0x1d, 0xd0, 0x0c, + 0x48, 0x75, 0x78, 0xae, 0xae, 0xa1, 0x27, 0x0b, 0x89, 0x13, 0x25, 0xb0, 0x5c, 0x6f, 0xa2, 0x47, + 0xa3, 0xa3, 0xeb, 0xb0, 0x84, 0xa3, 0x04, 0x73, 0xf5, 0xe6, 0xc3, 0xd6, 0xa8, 0x4b, 0xa1, 0xbb, + 0xad, 0xae, 0x7f, 0xeb, 0x41, 0x55, 0x90, 0xad, 0xf3, 0x9a, 0xdd, 0x56, 0x97, 0x9c, 0xf1, 0x24, + 0xd6, 0xc6, 0x5a, 0x85, 0x8b, 0x6c, 0xe9, 0x2c, 0x9d, 0x3a, 0x46, 0x86, 0xbe, 0x71, 0x81, 0xfb, + 0xc6, 0x3b, 0x29, 0x48, 0x4c, 0xec, 0x9e, 0x63, 0xdf, 0xc9, 0x40, 0xca, 0x75, 0x46, 0x83, 0x96, + 0xeb, 0x14, 0x7f, 0xa8, 0x00, 0xdc, 0x75, 0x06, 0x83, 0x89, 0xdd, 0x7b, 0x7f, 0x62, 0x91, 0x8b, + 0x90, 0x1d, 0xb4, 0x9e, 0x58, 0xcd, 0x81, 0xd5, 0xdc, 0x1f, 0x79, 0xbb, 0x21, 0x43, 0x8b, 0xb6, + 0xac, 0xbb, 0xa3, 0x23, 0x52, 0xf0, 0x0e, 0xf0, 0xa8, 0x20, 0x14, 0x26, 0x3f, 0xd0, 0x2f, 0xf2, + 0xe3, 0x68, 0x92, 0xaf, 0xa4, 0x77, 0x20, 0x65, 0x49, 0x4e, 0x8a, 0xaf, 0x21, 0x4b, 0x73, 0xce, + 0x42, 0xd2, 0xb5, 0x06, 0xc3, 0xe6, 0x3e, 0x0a, 0x86, 0x8a, 0x22, 0x41, 0xdf, 0xef, 0x92, 0xeb, + 0x10, 0xdb, 0x77, 0xfa, 0x28, 0x95, 0xe7, 0xae, 0x0e, 0x45, 0x92, 0x57, 0x20, 0x36, 0x18, 0x33, + 0xf9, 0x64, 0xcb, 0xa7, 0x43, 0x27, 0x08, 0x16, 0xb2, 0x28, 0x70, 0x30, 0xee, 0xfa, 0x63, 0xbf, + 0x92, 0x87, 0x58, 0xbd, 0xd1, 0xa0, 0xa7, 0x82, 0x7a, 0xa3, 0xb1, 0xaa, 0x29, 0xb5, 0x55, 0x48, + 0x77, 0x47, 0x96, 0x45, 0x1d, 0xc5, 0xb3, 0xb2, 0x92, 0x2f, 0x63, 0x14, 0xf4, 0x61, 0xb5, 0xb7, + 0x21, 0xb5, 0xcf, 0xf2, 0x12, 0xf2, 0xcc, 0x1c, 0xbc, 0xf0, 0xc7, 0xec, 0x2e, 0xe8, 0x45, 0x11, + 0x10, 0xcd, 0x66, 0x4c, 0x8f, 0xa7, 0xb6, 0x0b, 0x99, 0x51, 0xf3, 0xf9, 0xa4, 0x1f, 0xb2, 0xc8, + 0x23, 0x27, 0x4d, 0x8f, 0x78, 0x51, 0x6d, 0x03, 0x16, 0x6c, 0xc7, 0xfb, 0x49, 0xaa, 0xd9, 0xe6, + 0xfb, 0x6e, 0xd6, 0x91, 0xcf, 0x6b, 0xc0, 0x62, 0x3f, 0x6c, 0xdb, 0x0e, 0xaf, 0x60, 0x7b, 0xb5, + 0xb6, 0x0e, 0x9a, 0x40, 0xd4, 0x61, 0x9b, 0x5b, 0xc6, 0xd3, 0x61, 0xbf, 0xa5, 0xfb, 0x3c, 0xe8, + 0x0f, 0x22, 0x34, 0x7c, 0xc7, 0xca, 0x68, 0xba, 0xec, 0xd3, 0x04, 0x9f, 0x06, 0x9d, 0xe0, 0x34, + 0x0d, 0xf5, 0x5f, 0x32, 0x9a, 0x03, 0xf6, 0xdd, 0x82, 0x48, 0x53, 0x35, 0x22, 0xb3, 0x33, 0x39, + 0x46, 0x77, 0x7a, 0xec, 0xc3, 0x03, 0x9f, 0x87, 0xb9, 0xc7, 0x19, 0x44, 0xcf, 0xeb, 0xd0, 0x97, + 0xd9, 0x57, 0x09, 0x21, 0xa2, 0xa9, 0x1e, 0x8d, 0x8f, 0xd1, 0xa3, 0x27, 0xec, 0x23, 0x00, 0x9f, + 0x68, 0x67, 0x56, 0x8f, 0xc6, 0xc7, 0xe8, 0x51, 0x9f, 0x7d, 0x20, 0x10, 0x22, 0xaa, 0x1a, 0xb5, + 0x4d, 0x20, 0xe2, 0xc2, 0xf3, 0x58, 0x22, 0x65, 0x1a, 0xb0, 0x0f, 0x3f, 0x82, 0xa5, 0x67, 0x46, + 0xb3, 0xa8, 0x9e, 0xd7, 0x29, 0x9b, 0x7d, 0x15, 0x12, 0xa6, 0xaa, 0x1a, 0xb5, 0x07, 0x70, 0x5a, + 0x1c, 0xde, 0xb1, 0xba, 0xe5, 0xb0, 0x4f, 0x1a, 0x82, 0x01, 0x72, 0xab, 0x99, 0x64, 0xcf, 0xeb, + 0xd8, 0x90, 0x7d, 0xee, 0x10, 0x21, 0xab, 0x1a, 0xb5, 0xbb, 0x90, 0x17, 0xc8, 0xf6, 0x30, 0x0b, + 0x96, 0x11, 0xbd, 0xcf, 0x3e, 0xd2, 0xf1, 0x89, 0x68, 0xfc, 0x8f, 0xae, 0x1e, 0x8b, 0x88, 0x52, + 0x9a, 0x11, 0xfb, 0xc6, 0x24, 0xe8, 0x0f, 0xda, 0x44, 0x36, 0xca, 0x1e, 0x0b, 0x9f, 0x32, 0x9e, + 0x31, 0xfb, 0xfe, 0x24, 0xe8, 0x0e, 0x35, 0xa9, 0x0d, 0x42, 0x83, 0xb2, 0x68, 0x50, 0x94, 0xb2, + 0xb8, 0xe8, 0xbf, 0x4b, 0x12, 0xc8, 0xb2, 0x78, 0xd9, 0x22, 0x0c, 0x9f, 0xbe, 0xd6, 0x1e, 0xc0, + 0xfc, 0x49, 0x5c, 0xd6, 0x87, 0x0a, 0xcb, 0xbc, 0x2b, 0xcb, 0x34, 0x39, 0x37, 0xe7, 0xda, 0x21, + 0xcf, 0xb5, 0x01, 0x73, 0x27, 0x70, 0x5b, 0x1f, 0x29, 0x2c, 0x7f, 0xa5, 0x5c, 0x66, 0xae, 0x1d, + 0xf6, 0x5d, 0x73, 0x27, 0x70, 0x5c, 0x1f, 0x2b, 0xec, 0xc2, 0xc3, 0x28, 0xfb, 0x34, 0x9e, 0xef, + 0x9a, 0x3b, 0x81, 0xe3, 0xfa, 0x84, 0xe5, 0xa7, 0xaa, 0x51, 0x11, 0x69, 0xd0, 0x53, 0xcc, 0x9f, + 0xc4, 0x71, 0x7d, 0xaa, 0xe0, 0x05, 0x88, 0x6a, 0x18, 0xfe, 0xfc, 0xf8, 0xbe, 0x6b, 0xfe, 0x24, + 0x8e, 0xeb, 0xab, 0x0a, 0x5e, 0x94, 0xa8, 0xc6, 0x5a, 0x88, 0x28, 0xdc, 0xa3, 0xe3, 0x38, 0xae, + 0xaf, 0x29, 0x78, 0x7b, 0xa1, 0x1a, 0x55, 0x9f, 0x68, 0x67, 0xaa, 0x47, 0xc7, 0x71, 0x5c, 0x5f, + 0xc7, 0x6c, 0xa0, 0xa6, 0x1a, 0x37, 0x42, 0x44, 0xe8, 0xbb, 0xf2, 0x27, 0x72, 0x5c, 0xdf, 0x50, + 0xf0, 0xa2, 0x49, 0x35, 0x6e, 0x9a, 0x5e, 0x0f, 0x02, 0xdf, 0x95, 0x3f, 0x91, 0xe3, 0xfa, 0xa6, + 0x82, 0x37, 0x52, 0xaa, 0x71, 0x2b, 0x4c, 0x85, 0xbe, 0x4b, 0x3b, 0x99, 0xe3, 0xfa, 0x4c, 0xc1, + 0xef, 0x4f, 0xd4, 0xb5, 0x15, 0xd3, 0xeb, 0x84, 0xe0, 0xbb, 0xb4, 0x93, 0x39, 0xae, 0x6f, 0x29, + 0xf8, 0x51, 0x8a, 0xba, 0xb6, 0x1a, 0x21, 0xab, 0x1a, 0xb5, 0x75, 0xc8, 0x1d, 0xdf, 0x71, 0x7d, + 0x5b, 0xbc, 0xef, 0xcb, 0xb6, 0x05, 0xef, 0xf5, 0x58, 0x58, 0xbf, 0x63, 0xb8, 0xae, 0xef, 0x60, + 0xd6, 0x54, 0x7b, 0xe1, 0x3e, 0xbb, 0x15, 0x63, 0x26, 0xaf, 0xb5, 0xad, 0xce, 0x1b, 0x1d, 0xc7, + 0x09, 0x96, 0x94, 0x39, 0xb4, 0x46, 0xb0, 0x7b, 0x8e, 0xe1, 0xcd, 0xbe, 0xab, 0xe0, 0x25, 0x5a, + 0x8e, 0x53, 0xa3, 0x85, 0xbf, 0x8f, 0x98, 0x6b, 0xb3, 0x83, 0x31, 0x3f, 0xdf, 0xaf, 0x7d, 0x4f, + 0x39, 0x99, 0x63, 0xab, 0xc5, 0x1a, 0xdb, 0xeb, 0xfe, 0xe4, 0x60, 0xc9, 0x5b, 0x10, 0x3f, 0x2c, + 0xaf, 0xac, 0x86, 0x8f, 0x78, 0xe2, 0x1d, 0x32, 0x73, 0x67, 0xd9, 0xf2, 0x42, 0xe8, 0xb2, 0x7d, + 0x30, 0x74, 0x8f, 0x4c, 0xb4, 0xe4, 0x0c, 0x65, 0x09, 0xc3, 0x47, 0x52, 0x86, 0x32, 0x67, 0xa8, + 0x48, 0x18, 0x3e, 0x96, 0x32, 0x54, 0x38, 0x83, 0x21, 0x61, 0xf8, 0x44, 0xca, 0x60, 0x70, 0x86, + 0x35, 0x09, 0xc3, 0xa7, 0x52, 0x86, 0x35, 0xce, 0x50, 0x95, 0x30, 0x7c, 0x55, 0xca, 0x50, 0xe5, + 0x0c, 0x37, 0x24, 0x0c, 0x5f, 0x93, 0x32, 0xdc, 0xe0, 0x0c, 0x37, 0x25, 0x0c, 0x5f, 0x97, 0x32, + 0xdc, 0xe4, 0x0c, 0xb7, 0x24, 0x0c, 0xdf, 0x90, 0x32, 0xdc, 0x62, 0x0c, 0xab, 0x2b, 0x12, 0x86, + 0x6f, 0xca, 0x18, 0x56, 0x57, 0x38, 0x83, 0x4c, 0x93, 0x9f, 0x49, 0x19, 0xb8, 0x26, 0x57, 0x65, + 0x9a, 0xfc, 0x96, 0x94, 0x81, 0x6b, 0x72, 0x55, 0xa6, 0xc9, 0x6f, 0x4b, 0x19, 0xb8, 0x26, 0x57, + 0x65, 0x9a, 0xfc, 0x8e, 0x94, 0x81, 0x6b, 0x72, 0x55, 0xa6, 0xc9, 0xef, 0x4a, 0x19, 0xb8, 0x26, + 0x57, 0x65, 0x9a, 0xfc, 0x9e, 0x94, 0x81, 0x6b, 0x72, 0x55, 0xa6, 0xc9, 0x3f, 0x91, 0x32, 0x70, + 0x4d, 0xae, 0xca, 0x34, 0xf9, 0xa7, 0x52, 0x06, 0xae, 0xc9, 0x55, 0x99, 0x26, 0xff, 0x4c, 0xca, + 0xc0, 0x35, 0x59, 0x96, 0x69, 0xf2, 0xfb, 0x32, 0x86, 0x32, 0xd7, 0x64, 0x59, 0xa6, 0xc9, 0x3f, + 0x97, 0x32, 0x70, 0x4d, 0x96, 0x65, 0x9a, 0xfc, 0x0b, 0x29, 0x03, 0xd7, 0x64, 0x59, 0xa6, 0xc9, + 0x1f, 0x48, 0x19, 0xb8, 0x26, 0xcb, 0x32, 0x4d, 0xfe, 0xa5, 0x94, 0x81, 0x6b, 0xb2, 0x2c, 0xd3, + 0xe4, 0x5f, 0x49, 0x19, 0xb8, 0x26, 0xcb, 0x32, 0x4d, 0xfe, 0xb5, 0x94, 0x81, 0x6b, 0xb2, 0x2c, + 0xd3, 0xe4, 0xdf, 0x48, 0x19, 0xb8, 0x26, 0xcb, 0x32, 0x4d, 0xfe, 0xad, 0x94, 0x81, 0x6b, 0xb2, + 0x2c, 0xd3, 0xe4, 0xdf, 0x49, 0x19, 0xb8, 0x26, 0x2b, 0x32, 0x4d, 0xfe, 0xbd, 0x8c, 0xa1, 0xc2, + 0x35, 0x59, 0x91, 0x69, 0xf2, 0x1f, 0xa4, 0x0c, 0x5c, 0x93, 0x15, 0x99, 0x26, 0xff, 0x51, 0xca, + 0xc0, 0x35, 0x59, 0x91, 0x69, 0xf2, 0x9f, 0xa4, 0x0c, 0x5c, 0x93, 0x15, 0x99, 0x26, 0xff, 0x59, + 0xca, 0xc0, 0x35, 0x59, 0x91, 0x69, 0xf2, 0x5f, 0xa4, 0x0c, 0x5c, 0x93, 0x15, 0x99, 0x26, 0xff, + 0x55, 0xca, 0xc0, 0x35, 0x59, 0x91, 0x69, 0xf2, 0xdf, 0xa4, 0x0c, 0x5c, 0x93, 0x15, 0x99, 0x26, + 0x7f, 0x28, 0x65, 0xe0, 0x9a, 0xac, 0xc8, 0x34, 0xf9, 0xef, 0x52, 0x06, 0xae, 0x49, 0x43, 0xa6, + 0xc9, 0xff, 0x90, 0x31, 0x18, 0x5c, 0x93, 0x86, 0x4c, 0x93, 0xff, 0x29, 0x65, 0xe0, 0x9a, 0x34, + 0x64, 0x9a, 0xfc, 0x2f, 0x29, 0x03, 0xd7, 0xa4, 0x21, 0xd3, 0xe4, 0x7f, 0x4b, 0x19, 0xb8, 0x26, + 0x0d, 0x99, 0x26, 0xff, 0x47, 0xca, 0xc0, 0x35, 0x69, 0xc8, 0x34, 0xf9, 0xbf, 0x52, 0x06, 0xae, + 0x49, 0x43, 0xa6, 0xc9, 0x1f, 0x49, 0x19, 0xb8, 0x26, 0x0d, 0x99, 0x26, 0x7f, 0x2c, 0x65, 0xe0, + 0x9a, 0x34, 0x64, 0x9a, 0xfc, 0x89, 0x94, 0x81, 0x6b, 0xd2, 0x90, 0x69, 0xf2, 0xa7, 0x52, 0x06, + 0xae, 0xc9, 0x35, 0x99, 0x26, 0xff, 0x4f, 0xc6, 0xb0, 0xb6, 0x72, 0xe7, 0xda, 0xe3, 0xab, 0xdd, + 0x9e, 0x7b, 0x30, 0xd9, 0x5b, 0xde, 0x77, 0x06, 0xd7, 0xbb, 0x4e, 0xbf, 0x65, 0x77, 0xaf, 0x23, + 0x6c, 0x6f, 0xd2, 0xb9, 0x1e, 0xfc, 0xeb, 0x35, 0x33, 0xfd, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x46, 0xc7, 0xb3, 0x38, 0x92, 0x3d, 0x00, 0x00, +} diff --git a/api/vendor/github.com/golang/protobuf/proto/test_proto/test.proto b/api/vendor/github.com/golang/protobuf/proto/test_proto/test.proto new file mode 100644 index 0000000..22068a9 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/proto/test_proto/test.proto @@ -0,0 +1,562 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +// A feature-rich test file for the protocol compiler and libraries. + +syntax = "proto2"; + +option go_package = "github.com/golang/protobuf/proto/test_proto"; + +package test_proto; + +enum FOO { FOO1 = 1; }; + +message GoEnum { + required FOO foo = 1; +} + +message GoTestField { + required string Label = 1; + required string Type = 2; +} + +message GoTest { + // An enum, for completeness. + enum KIND { + VOID = 0; + + // Basic types + BOOL = 1; + BYTES = 2; + FINGERPRINT = 3; + FLOAT = 4; + INT = 5; + STRING = 6; + TIME = 7; + + // Groupings + TUPLE = 8; + ARRAY = 9; + MAP = 10; + + // Table types + TABLE = 11; + + // Functions + FUNCTION = 12; // last tag + }; + + // Some typical parameters + required KIND Kind = 1; + optional string Table = 2; + optional int32 Param = 3; + + // Required, repeated and optional foreign fields. + required GoTestField RequiredField = 4; + repeated GoTestField RepeatedField = 5; + optional GoTestField OptionalField = 6; + + // Required fields of all basic types + required bool F_Bool_required = 10; + required int32 F_Int32_required = 11; + required int64 F_Int64_required = 12; + required fixed32 F_Fixed32_required = 13; + required fixed64 F_Fixed64_required = 14; + required uint32 F_Uint32_required = 15; + required uint64 F_Uint64_required = 16; + required float F_Float_required = 17; + required double F_Double_required = 18; + required string F_String_required = 19; + required bytes F_Bytes_required = 101; + required sint32 F_Sint32_required = 102; + required sint64 F_Sint64_required = 103; + required sfixed32 F_Sfixed32_required = 104; + required sfixed64 F_Sfixed64_required = 105; + + // Repeated fields of all basic types + repeated bool F_Bool_repeated = 20; + repeated int32 F_Int32_repeated = 21; + repeated int64 F_Int64_repeated = 22; + repeated fixed32 F_Fixed32_repeated = 23; + repeated fixed64 F_Fixed64_repeated = 24; + repeated uint32 F_Uint32_repeated = 25; + repeated uint64 F_Uint64_repeated = 26; + repeated float F_Float_repeated = 27; + repeated double F_Double_repeated = 28; + repeated string F_String_repeated = 29; + repeated bytes F_Bytes_repeated = 201; + repeated sint32 F_Sint32_repeated = 202; + repeated sint64 F_Sint64_repeated = 203; + repeated sfixed32 F_Sfixed32_repeated = 204; + repeated sfixed64 F_Sfixed64_repeated = 205; + + // Optional fields of all basic types + optional bool F_Bool_optional = 30; + optional int32 F_Int32_optional = 31; + optional int64 F_Int64_optional = 32; + optional fixed32 F_Fixed32_optional = 33; + optional fixed64 F_Fixed64_optional = 34; + optional uint32 F_Uint32_optional = 35; + optional uint64 F_Uint64_optional = 36; + optional float F_Float_optional = 37; + optional double F_Double_optional = 38; + optional string F_String_optional = 39; + optional bytes F_Bytes_optional = 301; + optional sint32 F_Sint32_optional = 302; + optional sint64 F_Sint64_optional = 303; + optional sfixed32 F_Sfixed32_optional = 304; + optional sfixed64 F_Sfixed64_optional = 305; + + // Default-valued fields of all basic types + optional bool F_Bool_defaulted = 40 [default=true]; + optional int32 F_Int32_defaulted = 41 [default=32]; + optional int64 F_Int64_defaulted = 42 [default=64]; + optional fixed32 F_Fixed32_defaulted = 43 [default=320]; + optional fixed64 F_Fixed64_defaulted = 44 [default=640]; + optional uint32 F_Uint32_defaulted = 45 [default=3200]; + optional uint64 F_Uint64_defaulted = 46 [default=6400]; + optional float F_Float_defaulted = 47 [default=314159.]; + optional double F_Double_defaulted = 48 [default=271828.]; + optional string F_String_defaulted = 49 [default="hello, \"world!\"\n"]; + optional bytes F_Bytes_defaulted = 401 [default="Bignose"]; + optional sint32 F_Sint32_defaulted = 402 [default = -32]; + optional sint64 F_Sint64_defaulted = 403 [default = -64]; + optional sfixed32 F_Sfixed32_defaulted = 404 [default = -32]; + optional sfixed64 F_Sfixed64_defaulted = 405 [default = -64]; + + // Packed repeated fields (no string or bytes). + repeated bool F_Bool_repeated_packed = 50 [packed=true]; + repeated int32 F_Int32_repeated_packed = 51 [packed=true]; + repeated int64 F_Int64_repeated_packed = 52 [packed=true]; + repeated fixed32 F_Fixed32_repeated_packed = 53 [packed=true]; + repeated fixed64 F_Fixed64_repeated_packed = 54 [packed=true]; + repeated uint32 F_Uint32_repeated_packed = 55 [packed=true]; + repeated uint64 F_Uint64_repeated_packed = 56 [packed=true]; + repeated float F_Float_repeated_packed = 57 [packed=true]; + repeated double F_Double_repeated_packed = 58 [packed=true]; + repeated sint32 F_Sint32_repeated_packed = 502 [packed=true]; + repeated sint64 F_Sint64_repeated_packed = 503 [packed=true]; + repeated sfixed32 F_Sfixed32_repeated_packed = 504 [packed=true]; + repeated sfixed64 F_Sfixed64_repeated_packed = 505 [packed=true]; + + // Required, repeated, and optional groups. + required group RequiredGroup = 70 { + required string RequiredField = 71; + }; + + repeated group RepeatedGroup = 80 { + required string RequiredField = 81; + }; + + optional group OptionalGroup = 90 { + required string RequiredField = 91; + }; +} + +// For testing a group containing a required field. +message GoTestRequiredGroupField { + required group Group = 1 { + required int32 Field = 2; + }; +} + +// For testing skipping of unrecognized fields. +// Numbers are all big, larger than tag numbers in GoTestField, +// the message used in the corresponding test. +message GoSkipTest { + required int32 skip_int32 = 11; + required fixed32 skip_fixed32 = 12; + required fixed64 skip_fixed64 = 13; + required string skip_string = 14; + required group SkipGroup = 15 { + required int32 group_int32 = 16; + required string group_string = 17; + } +} + +// For testing packed/non-packed decoder switching. +// A serialized instance of one should be deserializable as the other. +message NonPackedTest { + repeated int32 a = 1; +} + +message PackedTest { + repeated int32 b = 1 [packed=true]; +} + +message MaxTag { + // Maximum possible tag number. + optional string last_field = 536870911; +} + +message OldMessage { + message Nested { + optional string name = 1; + } + optional Nested nested = 1; + + optional int32 num = 2; +} + +// NewMessage is wire compatible with OldMessage; +// imagine it as a future version. +message NewMessage { + message Nested { + optional string name = 1; + optional string food_group = 2; + } + optional Nested nested = 1; + + // This is an int32 in OldMessage. + optional int64 num = 2; +} + +// Smaller tests for ASCII formatting. + +message InnerMessage { + required string host = 1; + optional int32 port = 2 [default=4000]; + optional bool connected = 3; +} + +message OtherMessage { + optional int64 key = 1; + optional bytes value = 2; + optional float weight = 3; + optional InnerMessage inner = 4; + + extensions 100 to max; +} + +message RequiredInnerMessage { + required InnerMessage leo_finally_won_an_oscar = 1; +} + +message MyMessage { + required int32 count = 1; + optional string name = 2; + optional string quote = 3; + repeated string pet = 4; + optional InnerMessage inner = 5; + repeated OtherMessage others = 6; + optional RequiredInnerMessage we_must_go_deeper = 13; + repeated InnerMessage rep_inner = 12; + + enum Color { + RED = 0; + GREEN = 1; + BLUE = 2; + }; + optional Color bikeshed = 7; + + optional group SomeGroup = 8 { + optional int32 group_field = 9; + } + + // This field becomes [][]byte in the generated code. + repeated bytes rep_bytes = 10; + + optional double bigfloat = 11; + + extensions 100 to max; +} + +message Ext { + extend MyMessage { + optional Ext more = 103; + optional string text = 104; + optional int32 number = 105; + } + + optional string data = 1; + map map_field = 2; +} + +extend MyMessage { + repeated string greeting = 106; + // leave field 200 unregistered for testing +} + +message ComplexExtension { + optional int32 first = 1; + optional int32 second = 2; + repeated int32 third = 3; +} + +extend OtherMessage { + optional ComplexExtension complex = 200; + repeated ComplexExtension r_complex = 201; +} + +message DefaultsMessage { + enum DefaultsEnum { + ZERO = 0; + ONE = 1; + TWO = 2; + }; + extensions 100 to max; +} + +extend DefaultsMessage { + optional double no_default_double = 101; + optional float no_default_float = 102; + optional int32 no_default_int32 = 103; + optional int64 no_default_int64 = 104; + optional uint32 no_default_uint32 = 105; + optional uint64 no_default_uint64 = 106; + optional sint32 no_default_sint32 = 107; + optional sint64 no_default_sint64 = 108; + optional fixed32 no_default_fixed32 = 109; + optional fixed64 no_default_fixed64 = 110; + optional sfixed32 no_default_sfixed32 = 111; + optional sfixed64 no_default_sfixed64 = 112; + optional bool no_default_bool = 113; + optional string no_default_string = 114; + optional bytes no_default_bytes = 115; + optional DefaultsMessage.DefaultsEnum no_default_enum = 116; + + optional double default_double = 201 [default = 3.1415]; + optional float default_float = 202 [default = 3.14]; + optional int32 default_int32 = 203 [default = 42]; + optional int64 default_int64 = 204 [default = 43]; + optional uint32 default_uint32 = 205 [default = 44]; + optional uint64 default_uint64 = 206 [default = 45]; + optional sint32 default_sint32 = 207 [default = 46]; + optional sint64 default_sint64 = 208 [default = 47]; + optional fixed32 default_fixed32 = 209 [default = 48]; + optional fixed64 default_fixed64 = 210 [default = 49]; + optional sfixed32 default_sfixed32 = 211 [default = 50]; + optional sfixed64 default_sfixed64 = 212 [default = 51]; + optional bool default_bool = 213 [default = true]; + optional string default_string = 214 [default = "Hello, string,def=foo"]; + optional bytes default_bytes = 215 [default = "Hello, bytes"]; + optional DefaultsMessage.DefaultsEnum default_enum = 216 [default = ONE]; +} + +message MyMessageSet { + option message_set_wire_format = true; + extensions 100 to max; +} + +message Empty { +} + +extend MyMessageSet { + optional Empty x201 = 201; + optional Empty x202 = 202; + optional Empty x203 = 203; + optional Empty x204 = 204; + optional Empty x205 = 205; + optional Empty x206 = 206; + optional Empty x207 = 207; + optional Empty x208 = 208; + optional Empty x209 = 209; + optional Empty x210 = 210; + optional Empty x211 = 211; + optional Empty x212 = 212; + optional Empty x213 = 213; + optional Empty x214 = 214; + optional Empty x215 = 215; + optional Empty x216 = 216; + optional Empty x217 = 217; + optional Empty x218 = 218; + optional Empty x219 = 219; + optional Empty x220 = 220; + optional Empty x221 = 221; + optional Empty x222 = 222; + optional Empty x223 = 223; + optional Empty x224 = 224; + optional Empty x225 = 225; + optional Empty x226 = 226; + optional Empty x227 = 227; + optional Empty x228 = 228; + optional Empty x229 = 229; + optional Empty x230 = 230; + optional Empty x231 = 231; + optional Empty x232 = 232; + optional Empty x233 = 233; + optional Empty x234 = 234; + optional Empty x235 = 235; + optional Empty x236 = 236; + optional Empty x237 = 237; + optional Empty x238 = 238; + optional Empty x239 = 239; + optional Empty x240 = 240; + optional Empty x241 = 241; + optional Empty x242 = 242; + optional Empty x243 = 243; + optional Empty x244 = 244; + optional Empty x245 = 245; + optional Empty x246 = 246; + optional Empty x247 = 247; + optional Empty x248 = 248; + optional Empty x249 = 249; + optional Empty x250 = 250; +} + +message MessageList { + repeated group Message = 1 { + required string name = 2; + required int32 count = 3; + } +} + +message Strings { + optional string string_field = 1; + optional bytes bytes_field = 2; +} + +message Defaults { + enum Color { + RED = 0; + GREEN = 1; + BLUE = 2; + } + + // Default-valued fields of all basic types. + // Same as GoTest, but copied here to make testing easier. + optional bool F_Bool = 1 [default=true]; + optional int32 F_Int32 = 2 [default=32]; + optional int64 F_Int64 = 3 [default=64]; + optional fixed32 F_Fixed32 = 4 [default=320]; + optional fixed64 F_Fixed64 = 5 [default=640]; + optional uint32 F_Uint32 = 6 [default=3200]; + optional uint64 F_Uint64 = 7 [default=6400]; + optional float F_Float = 8 [default=314159.]; + optional double F_Double = 9 [default=271828.]; + optional string F_String = 10 [default="hello, \"world!\"\n"]; + optional bytes F_Bytes = 11 [default="Bignose"]; + optional sint32 F_Sint32 = 12 [default=-32]; + optional sint64 F_Sint64 = 13 [default=-64]; + optional Color F_Enum = 14 [default=GREEN]; + + // More fields with crazy defaults. + optional float F_Pinf = 15 [default=inf]; + optional float F_Ninf = 16 [default=-inf]; + optional float F_Nan = 17 [default=nan]; + + // Sub-message. + optional SubDefaults sub = 18; + + // Redundant but explicit defaults. + optional string str_zero = 19 [default=""]; +} + +message SubDefaults { + optional int64 n = 1 [default=7]; +} + +message RepeatedEnum { + enum Color { + RED = 1; + } + repeated Color color = 1; +} + +message MoreRepeated { + repeated bool bools = 1; + repeated bool bools_packed = 2 [packed=true]; + repeated int32 ints = 3; + repeated int32 ints_packed = 4 [packed=true]; + repeated int64 int64s_packed = 7 [packed=true]; + repeated string strings = 5; + repeated fixed32 fixeds = 6; +} + +// GroupOld and GroupNew have the same wire format. +// GroupNew has a new field inside a group. + +message GroupOld { + optional group G = 101 { + optional int32 x = 2; + } +} + +message GroupNew { + optional group G = 101 { + optional int32 x = 2; + optional int32 y = 3; + } +} + +message FloatingPoint { + required double f = 1; + optional bool exact = 2; +} + +message MessageWithMap { + map name_mapping = 1; + map msg_mapping = 2; + map byte_mapping = 3; + map str_to_str = 4; +} + +message Oneof { + oneof union { + bool F_Bool = 1; + int32 F_Int32 = 2; + int64 F_Int64 = 3; + fixed32 F_Fixed32 = 4; + fixed64 F_Fixed64 = 5; + uint32 F_Uint32 = 6; + uint64 F_Uint64 = 7; + float F_Float = 8; + double F_Double = 9; + string F_String = 10; + bytes F_Bytes = 11; + sint32 F_Sint32 = 12; + sint64 F_Sint64 = 13; + MyMessage.Color F_Enum = 14; + GoTestField F_Message = 15; + group F_Group = 16 { + optional int32 x = 17; + } + int32 F_Largest_Tag = 536870911; + } + + oneof tormato { + int32 value = 100; + } +} + +message Communique { + optional bool make_me_cry = 1; + + // This is a oneof, called "union". + oneof union { + int32 number = 5; + string name = 6; + bytes data = 7; + double temp_c = 8; + MyMessage.Color col = 9; + Strings msg = 10; + } +} diff --git a/api/vendor/github.com/golang/protobuf/proto/text.go b/api/vendor/github.com/golang/protobuf/proto/text.go new file mode 100644 index 0000000..2205fda --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/proto/text.go @@ -0,0 +1,843 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package proto + +// Functions for writing the text protocol buffer format. + +import ( + "bufio" + "bytes" + "encoding" + "errors" + "fmt" + "io" + "log" + "math" + "reflect" + "sort" + "strings" +) + +var ( + newline = []byte("\n") + spaces = []byte(" ") + endBraceNewline = []byte("}\n") + backslashN = []byte{'\\', 'n'} + backslashR = []byte{'\\', 'r'} + backslashT = []byte{'\\', 't'} + backslashDQ = []byte{'\\', '"'} + backslashBS = []byte{'\\', '\\'} + posInf = []byte("inf") + negInf = []byte("-inf") + nan = []byte("nan") +) + +type writer interface { + io.Writer + WriteByte(byte) error +} + +// textWriter is an io.Writer that tracks its indentation level. +type textWriter struct { + ind int + complete bool // if the current position is a complete line + compact bool // whether to write out as a one-liner + w writer +} + +func (w *textWriter) WriteString(s string) (n int, err error) { + if !strings.Contains(s, "\n") { + if !w.compact && w.complete { + w.writeIndent() + } + w.complete = false + return io.WriteString(w.w, s) + } + // WriteString is typically called without newlines, so this + // codepath and its copy are rare. We copy to avoid + // duplicating all of Write's logic here. + return w.Write([]byte(s)) +} + +func (w *textWriter) Write(p []byte) (n int, err error) { + newlines := bytes.Count(p, newline) + if newlines == 0 { + if !w.compact && w.complete { + w.writeIndent() + } + n, err = w.w.Write(p) + w.complete = false + return n, err + } + + frags := bytes.SplitN(p, newline, newlines+1) + if w.compact { + for i, frag := range frags { + if i > 0 { + if err := w.w.WriteByte(' '); err != nil { + return n, err + } + n++ + } + nn, err := w.w.Write(frag) + n += nn + if err != nil { + return n, err + } + } + return n, nil + } + + for i, frag := range frags { + if w.complete { + w.writeIndent() + } + nn, err := w.w.Write(frag) + n += nn + if err != nil { + return n, err + } + if i+1 < len(frags) { + if err := w.w.WriteByte('\n'); err != nil { + return n, err + } + n++ + } + } + w.complete = len(frags[len(frags)-1]) == 0 + return n, nil +} + +func (w *textWriter) WriteByte(c byte) error { + if w.compact && c == '\n' { + c = ' ' + } + if !w.compact && w.complete { + w.writeIndent() + } + err := w.w.WriteByte(c) + w.complete = c == '\n' + return err +} + +func (w *textWriter) indent() { w.ind++ } + +func (w *textWriter) unindent() { + if w.ind == 0 { + log.Print("proto: textWriter unindented too far") + return + } + w.ind-- +} + +func writeName(w *textWriter, props *Properties) error { + if _, err := w.WriteString(props.OrigName); err != nil { + return err + } + if props.Wire != "group" { + return w.WriteByte(':') + } + return nil +} + +func requiresQuotes(u string) bool { + // When type URL contains any characters except [0-9A-Za-z./\-]*, it must be quoted. + for _, ch := range u { + switch { + case ch == '.' || ch == '/' || ch == '_': + continue + case '0' <= ch && ch <= '9': + continue + case 'A' <= ch && ch <= 'Z': + continue + case 'a' <= ch && ch <= 'z': + continue + default: + return true + } + } + return false +} + +// isAny reports whether sv is a google.protobuf.Any message +func isAny(sv reflect.Value) bool { + type wkt interface { + XXX_WellKnownType() string + } + t, ok := sv.Addr().Interface().(wkt) + return ok && t.XXX_WellKnownType() == "Any" +} + +// writeProto3Any writes an expanded google.protobuf.Any message. +// +// It returns (false, nil) if sv value can't be unmarshaled (e.g. because +// required messages are not linked in). +// +// It returns (true, error) when sv was written in expanded format or an error +// was encountered. +func (tm *TextMarshaler) writeProto3Any(w *textWriter, sv reflect.Value) (bool, error) { + turl := sv.FieldByName("TypeUrl") + val := sv.FieldByName("Value") + if !turl.IsValid() || !val.IsValid() { + return true, errors.New("proto: invalid google.protobuf.Any message") + } + + b, ok := val.Interface().([]byte) + if !ok { + return true, errors.New("proto: invalid google.protobuf.Any message") + } + + parts := strings.Split(turl.String(), "/") + mt := MessageType(parts[len(parts)-1]) + if mt == nil { + return false, nil + } + m := reflect.New(mt.Elem()) + if err := Unmarshal(b, m.Interface().(Message)); err != nil { + return false, nil + } + w.Write([]byte("[")) + u := turl.String() + if requiresQuotes(u) { + writeString(w, u) + } else { + w.Write([]byte(u)) + } + if w.compact { + w.Write([]byte("]:<")) + } else { + w.Write([]byte("]: <\n")) + w.ind++ + } + if err := tm.writeStruct(w, m.Elem()); err != nil { + return true, err + } + if w.compact { + w.Write([]byte("> ")) + } else { + w.ind-- + w.Write([]byte(">\n")) + } + return true, nil +} + +func (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error { + if tm.ExpandAny && isAny(sv) { + if canExpand, err := tm.writeProto3Any(w, sv); canExpand { + return err + } + } + st := sv.Type() + sprops := GetProperties(st) + for i := 0; i < sv.NumField(); i++ { + fv := sv.Field(i) + props := sprops.Prop[i] + name := st.Field(i).Name + + if name == "XXX_NoUnkeyedLiteral" { + continue + } + + if strings.HasPrefix(name, "XXX_") { + // There are two XXX_ fields: + // XXX_unrecognized []byte + // XXX_extensions map[int32]proto.Extension + // The first is handled here; + // the second is handled at the bottom of this function. + if name == "XXX_unrecognized" && !fv.IsNil() { + if err := writeUnknownStruct(w, fv.Interface().([]byte)); err != nil { + return err + } + } + continue + } + if fv.Kind() == reflect.Ptr && fv.IsNil() { + // Field not filled in. This could be an optional field or + // a required field that wasn't filled in. Either way, there + // isn't anything we can show for it. + continue + } + if fv.Kind() == reflect.Slice && fv.IsNil() { + // Repeated field that is empty, or a bytes field that is unused. + continue + } + + if props.Repeated && fv.Kind() == reflect.Slice { + // Repeated field. + for j := 0; j < fv.Len(); j++ { + if err := writeName(w, props); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + v := fv.Index(j) + if v.Kind() == reflect.Ptr && v.IsNil() { + // A nil message in a repeated field is not valid, + // but we can handle that more gracefully than panicking. + if _, err := w.Write([]byte("\n")); err != nil { + return err + } + continue + } + if err := tm.writeAny(w, v, props); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + } + continue + } + if fv.Kind() == reflect.Map { + // Map fields are rendered as a repeated struct with key/value fields. + keys := fv.MapKeys() + sort.Sort(mapKeys(keys)) + for _, key := range keys { + val := fv.MapIndex(key) + if err := writeName(w, props); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + // open struct + if err := w.WriteByte('<'); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte('\n'); err != nil { + return err + } + } + w.indent() + // key + if _, err := w.WriteString("key:"); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + if err := tm.writeAny(w, key, props.mkeyprop); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + // nil values aren't legal, but we can avoid panicking because of them. + if val.Kind() != reflect.Ptr || !val.IsNil() { + // value + if _, err := w.WriteString("value:"); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + if err := tm.writeAny(w, val, props.mvalprop); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + } + // close struct + w.unindent() + if err := w.WriteByte('>'); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + } + continue + } + if props.proto3 && fv.Kind() == reflect.Slice && fv.Len() == 0 { + // empty bytes field + continue + } + if fv.Kind() != reflect.Ptr && fv.Kind() != reflect.Slice { + // proto3 non-repeated scalar field; skip if zero value + if isProto3Zero(fv) { + continue + } + } + + if fv.Kind() == reflect.Interface { + // Check if it is a oneof. + if st.Field(i).Tag.Get("protobuf_oneof") != "" { + // fv is nil, or holds a pointer to generated struct. + // That generated struct has exactly one field, + // which has a protobuf struct tag. + if fv.IsNil() { + continue + } + inner := fv.Elem().Elem() // interface -> *T -> T + tag := inner.Type().Field(0).Tag.Get("protobuf") + props = new(Properties) // Overwrite the outer props var, but not its pointee. + props.Parse(tag) + // Write the value in the oneof, not the oneof itself. + fv = inner.Field(0) + + // Special case to cope with malformed messages gracefully: + // If the value in the oneof is a nil pointer, don't panic + // in writeAny. + if fv.Kind() == reflect.Ptr && fv.IsNil() { + // Use errors.New so writeAny won't render quotes. + msg := errors.New("/* nil */") + fv = reflect.ValueOf(&msg).Elem() + } + } + } + + if err := writeName(w, props); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + + // Enums have a String method, so writeAny will work fine. + if err := tm.writeAny(w, fv, props); err != nil { + return err + } + + if err := w.WriteByte('\n'); err != nil { + return err + } + } + + // Extensions (the XXX_extensions field). + pv := sv.Addr() + if _, err := extendable(pv.Interface()); err == nil { + if err := tm.writeExtensions(w, pv); err != nil { + return err + } + } + + return nil +} + +// writeAny writes an arbitrary field. +func (tm *TextMarshaler) writeAny(w *textWriter, v reflect.Value, props *Properties) error { + v = reflect.Indirect(v) + + // Floats have special cases. + if v.Kind() == reflect.Float32 || v.Kind() == reflect.Float64 { + x := v.Float() + var b []byte + switch { + case math.IsInf(x, 1): + b = posInf + case math.IsInf(x, -1): + b = negInf + case math.IsNaN(x): + b = nan + } + if b != nil { + _, err := w.Write(b) + return err + } + // Other values are handled below. + } + + // We don't attempt to serialise every possible value type; only those + // that can occur in protocol buffers. + switch v.Kind() { + case reflect.Slice: + // Should only be a []byte; repeated fields are handled in writeStruct. + if err := writeString(w, string(v.Bytes())); err != nil { + return err + } + case reflect.String: + if err := writeString(w, v.String()); err != nil { + return err + } + case reflect.Struct: + // Required/optional group/message. + var bra, ket byte = '<', '>' + if props != nil && props.Wire == "group" { + bra, ket = '{', '}' + } + if err := w.WriteByte(bra); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte('\n'); err != nil { + return err + } + } + w.indent() + if v.CanAddr() { + // Calling v.Interface on a struct causes the reflect package to + // copy the entire struct. This is racy with the new Marshaler + // since we atomically update the XXX_sizecache. + // + // Thus, we retrieve a pointer to the struct if possible to avoid + // a race since v.Interface on the pointer doesn't copy the struct. + // + // If v is not addressable, then we are not worried about a race + // since it implies that the binary Marshaler cannot possibly be + // mutating this value. + v = v.Addr() + } + if etm, ok := v.Interface().(encoding.TextMarshaler); ok { + text, err := etm.MarshalText() + if err != nil { + return err + } + if _, err = w.Write(text); err != nil { + return err + } + } else { + if v.Kind() == reflect.Ptr { + v = v.Elem() + } + if err := tm.writeStruct(w, v); err != nil { + return err + } + } + w.unindent() + if err := w.WriteByte(ket); err != nil { + return err + } + default: + _, err := fmt.Fprint(w, v.Interface()) + return err + } + return nil +} + +// equivalent to C's isprint. +func isprint(c byte) bool { + return c >= 0x20 && c < 0x7f +} + +// writeString writes a string in the protocol buffer text format. +// It is similar to strconv.Quote except we don't use Go escape sequences, +// we treat the string as a byte sequence, and we use octal escapes. +// These differences are to maintain interoperability with the other +// languages' implementations of the text format. +func writeString(w *textWriter, s string) error { + // use WriteByte here to get any needed indent + if err := w.WriteByte('"'); err != nil { + return err + } + // Loop over the bytes, not the runes. + for i := 0; i < len(s); i++ { + var err error + // Divergence from C++: we don't escape apostrophes. + // There's no need to escape them, and the C++ parser + // copes with a naked apostrophe. + switch c := s[i]; c { + case '\n': + _, err = w.w.Write(backslashN) + case '\r': + _, err = w.w.Write(backslashR) + case '\t': + _, err = w.w.Write(backslashT) + case '"': + _, err = w.w.Write(backslashDQ) + case '\\': + _, err = w.w.Write(backslashBS) + default: + if isprint(c) { + err = w.w.WriteByte(c) + } else { + _, err = fmt.Fprintf(w.w, "\\%03o", c) + } + } + if err != nil { + return err + } + } + return w.WriteByte('"') +} + +func writeUnknownStruct(w *textWriter, data []byte) (err error) { + if !w.compact { + if _, err := fmt.Fprintf(w, "/* %d unknown bytes */\n", len(data)); err != nil { + return err + } + } + b := NewBuffer(data) + for b.index < len(b.buf) { + x, err := b.DecodeVarint() + if err != nil { + _, err := fmt.Fprintf(w, "/* %v */\n", err) + return err + } + wire, tag := x&7, x>>3 + if wire == WireEndGroup { + w.unindent() + if _, err := w.Write(endBraceNewline); err != nil { + return err + } + continue + } + if _, err := fmt.Fprint(w, tag); err != nil { + return err + } + if wire != WireStartGroup { + if err := w.WriteByte(':'); err != nil { + return err + } + } + if !w.compact || wire == WireStartGroup { + if err := w.WriteByte(' '); err != nil { + return err + } + } + switch wire { + case WireBytes: + buf, e := b.DecodeRawBytes(false) + if e == nil { + _, err = fmt.Fprintf(w, "%q", buf) + } else { + _, err = fmt.Fprintf(w, "/* %v */", e) + } + case WireFixed32: + x, err = b.DecodeFixed32() + err = writeUnknownInt(w, x, err) + case WireFixed64: + x, err = b.DecodeFixed64() + err = writeUnknownInt(w, x, err) + case WireStartGroup: + err = w.WriteByte('{') + w.indent() + case WireVarint: + x, err = b.DecodeVarint() + err = writeUnknownInt(w, x, err) + default: + _, err = fmt.Fprintf(w, "/* unknown wire type %d */", wire) + } + if err != nil { + return err + } + if err = w.WriteByte('\n'); err != nil { + return err + } + } + return nil +} + +func writeUnknownInt(w *textWriter, x uint64, err error) error { + if err == nil { + _, err = fmt.Fprint(w, x) + } else { + _, err = fmt.Fprintf(w, "/* %v */", err) + } + return err +} + +type int32Slice []int32 + +func (s int32Slice) Len() int { return len(s) } +func (s int32Slice) Less(i, j int) bool { return s[i] < s[j] } +func (s int32Slice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } + +// writeExtensions writes all the extensions in pv. +// pv is assumed to be a pointer to a protocol message struct that is extendable. +func (tm *TextMarshaler) writeExtensions(w *textWriter, pv reflect.Value) error { + emap := extensionMaps[pv.Type().Elem()] + ep, _ := extendable(pv.Interface()) + + // Order the extensions by ID. + // This isn't strictly necessary, but it will give us + // canonical output, which will also make testing easier. + m, mu := ep.extensionsRead() + if m == nil { + return nil + } + mu.Lock() + ids := make([]int32, 0, len(m)) + for id := range m { + ids = append(ids, id) + } + sort.Sort(int32Slice(ids)) + mu.Unlock() + + for _, extNum := range ids { + ext := m[extNum] + var desc *ExtensionDesc + if emap != nil { + desc = emap[extNum] + } + if desc == nil { + // Unknown extension. + if err := writeUnknownStruct(w, ext.enc); err != nil { + return err + } + continue + } + + pb, err := GetExtension(ep, desc) + if err != nil { + return fmt.Errorf("failed getting extension: %v", err) + } + + // Repeated extensions will appear as a slice. + if !desc.repeated() { + if err := tm.writeExtension(w, desc.Name, pb); err != nil { + return err + } + } else { + v := reflect.ValueOf(pb) + for i := 0; i < v.Len(); i++ { + if err := tm.writeExtension(w, desc.Name, v.Index(i).Interface()); err != nil { + return err + } + } + } + } + return nil +} + +func (tm *TextMarshaler) writeExtension(w *textWriter, name string, pb interface{}) error { + if _, err := fmt.Fprintf(w, "[%s]:", name); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + if err := tm.writeAny(w, reflect.ValueOf(pb), nil); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + return nil +} + +func (w *textWriter) writeIndent() { + if !w.complete { + return + } + remain := w.ind * 2 + for remain > 0 { + n := remain + if n > len(spaces) { + n = len(spaces) + } + w.w.Write(spaces[:n]) + remain -= n + } + w.complete = false +} + +// TextMarshaler is a configurable text format marshaler. +type TextMarshaler struct { + Compact bool // use compact text format (one line). + ExpandAny bool // expand google.protobuf.Any messages of known types +} + +// Marshal writes a given protocol buffer in text format. +// The only errors returned are from w. +func (tm *TextMarshaler) Marshal(w io.Writer, pb Message) error { + val := reflect.ValueOf(pb) + if pb == nil || val.IsNil() { + w.Write([]byte("")) + return nil + } + var bw *bufio.Writer + ww, ok := w.(writer) + if !ok { + bw = bufio.NewWriter(w) + ww = bw + } + aw := &textWriter{ + w: ww, + complete: true, + compact: tm.Compact, + } + + if etm, ok := pb.(encoding.TextMarshaler); ok { + text, err := etm.MarshalText() + if err != nil { + return err + } + if _, err = aw.Write(text); err != nil { + return err + } + if bw != nil { + return bw.Flush() + } + return nil + } + // Dereference the received pointer so we don't have outer < and >. + v := reflect.Indirect(val) + if err := tm.writeStruct(aw, v); err != nil { + return err + } + if bw != nil { + return bw.Flush() + } + return nil +} + +// Text is the same as Marshal, but returns the string directly. +func (tm *TextMarshaler) Text(pb Message) string { + var buf bytes.Buffer + tm.Marshal(&buf, pb) + return buf.String() +} + +var ( + defaultTextMarshaler = TextMarshaler{} + compactTextMarshaler = TextMarshaler{Compact: true} +) + +// TODO: consider removing some of the Marshal functions below. + +// MarshalText writes a given protocol buffer in text format. +// The only errors returned are from w. +func MarshalText(w io.Writer, pb Message) error { return defaultTextMarshaler.Marshal(w, pb) } + +// MarshalTextString is the same as MarshalText, but returns the string directly. +func MarshalTextString(pb Message) string { return defaultTextMarshaler.Text(pb) } + +// CompactText writes a given protocol buffer in compact text format (one line). +func CompactText(w io.Writer, pb Message) error { return compactTextMarshaler.Marshal(w, pb) } + +// CompactTextString is the same as CompactText, but returns the string directly. +func CompactTextString(pb Message) string { return compactTextMarshaler.Text(pb) } diff --git a/api/vendor/github.com/golang/protobuf/proto/text_parser.go b/api/vendor/github.com/golang/protobuf/proto/text_parser.go new file mode 100644 index 0000000..0685bae --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/proto/text_parser.go @@ -0,0 +1,880 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package proto + +// Functions for parsing the Text protocol buffer format. +// TODO: message sets. + +import ( + "encoding" + "errors" + "fmt" + "reflect" + "strconv" + "strings" + "unicode/utf8" +) + +// Error string emitted when deserializing Any and fields are already set +const anyRepeatedlyUnpacked = "Any message unpacked multiple times, or %q already set" + +type ParseError struct { + Message string + Line int // 1-based line number + Offset int // 0-based byte offset from start of input +} + +func (p *ParseError) Error() string { + if p.Line == 1 { + // show offset only for first line + return fmt.Sprintf("line 1.%d: %v", p.Offset, p.Message) + } + return fmt.Sprintf("line %d: %v", p.Line, p.Message) +} + +type token struct { + value string + err *ParseError + line int // line number + offset int // byte number from start of input, not start of line + unquoted string // the unquoted version of value, if it was a quoted string +} + +func (t *token) String() string { + if t.err == nil { + return fmt.Sprintf("%q (line=%d, offset=%d)", t.value, t.line, t.offset) + } + return fmt.Sprintf("parse error: %v", t.err) +} + +type textParser struct { + s string // remaining input + done bool // whether the parsing is finished (success or error) + backed bool // whether back() was called + offset, line int + cur token +} + +func newTextParser(s string) *textParser { + p := new(textParser) + p.s = s + p.line = 1 + p.cur.line = 1 + return p +} + +func (p *textParser) errorf(format string, a ...interface{}) *ParseError { + pe := &ParseError{fmt.Sprintf(format, a...), p.cur.line, p.cur.offset} + p.cur.err = pe + p.done = true + return pe +} + +// Numbers and identifiers are matched by [-+._A-Za-z0-9] +func isIdentOrNumberChar(c byte) bool { + switch { + case 'A' <= c && c <= 'Z', 'a' <= c && c <= 'z': + return true + case '0' <= c && c <= '9': + return true + } + switch c { + case '-', '+', '.', '_': + return true + } + return false +} + +func isWhitespace(c byte) bool { + switch c { + case ' ', '\t', '\n', '\r': + return true + } + return false +} + +func isQuote(c byte) bool { + switch c { + case '"', '\'': + return true + } + return false +} + +func (p *textParser) skipWhitespace() { + i := 0 + for i < len(p.s) && (isWhitespace(p.s[i]) || p.s[i] == '#') { + if p.s[i] == '#' { + // comment; skip to end of line or input + for i < len(p.s) && p.s[i] != '\n' { + i++ + } + if i == len(p.s) { + break + } + } + if p.s[i] == '\n' { + p.line++ + } + i++ + } + p.offset += i + p.s = p.s[i:len(p.s)] + if len(p.s) == 0 { + p.done = true + } +} + +func (p *textParser) advance() { + // Skip whitespace + p.skipWhitespace() + if p.done { + return + } + + // Start of non-whitespace + p.cur.err = nil + p.cur.offset, p.cur.line = p.offset, p.line + p.cur.unquoted = "" + switch p.s[0] { + case '<', '>', '{', '}', ':', '[', ']', ';', ',', '/': + // Single symbol + p.cur.value, p.s = p.s[0:1], p.s[1:len(p.s)] + case '"', '\'': + // Quoted string + i := 1 + for i < len(p.s) && p.s[i] != p.s[0] && p.s[i] != '\n' { + if p.s[i] == '\\' && i+1 < len(p.s) { + // skip escaped char + i++ + } + i++ + } + if i >= len(p.s) || p.s[i] != p.s[0] { + p.errorf("unmatched quote") + return + } + unq, err := unquoteC(p.s[1:i], rune(p.s[0])) + if err != nil { + p.errorf("invalid quoted string %s: %v", p.s[0:i+1], err) + return + } + p.cur.value, p.s = p.s[0:i+1], p.s[i+1:len(p.s)] + p.cur.unquoted = unq + default: + i := 0 + for i < len(p.s) && isIdentOrNumberChar(p.s[i]) { + i++ + } + if i == 0 { + p.errorf("unexpected byte %#x", p.s[0]) + return + } + p.cur.value, p.s = p.s[0:i], p.s[i:len(p.s)] + } + p.offset += len(p.cur.value) +} + +var ( + errBadUTF8 = errors.New("proto: bad UTF-8") +) + +func unquoteC(s string, quote rune) (string, error) { + // This is based on C++'s tokenizer.cc. + // Despite its name, this is *not* parsing C syntax. + // For instance, "\0" is an invalid quoted string. + + // Avoid allocation in trivial cases. + simple := true + for _, r := range s { + if r == '\\' || r == quote { + simple = false + break + } + } + if simple { + return s, nil + } + + buf := make([]byte, 0, 3*len(s)/2) + for len(s) > 0 { + r, n := utf8.DecodeRuneInString(s) + if r == utf8.RuneError && n == 1 { + return "", errBadUTF8 + } + s = s[n:] + if r != '\\' { + if r < utf8.RuneSelf { + buf = append(buf, byte(r)) + } else { + buf = append(buf, string(r)...) + } + continue + } + + ch, tail, err := unescape(s) + if err != nil { + return "", err + } + buf = append(buf, ch...) + s = tail + } + return string(buf), nil +} + +func unescape(s string) (ch string, tail string, err error) { + r, n := utf8.DecodeRuneInString(s) + if r == utf8.RuneError && n == 1 { + return "", "", errBadUTF8 + } + s = s[n:] + switch r { + case 'a': + return "\a", s, nil + case 'b': + return "\b", s, nil + case 'f': + return "\f", s, nil + case 'n': + return "\n", s, nil + case 'r': + return "\r", s, nil + case 't': + return "\t", s, nil + case 'v': + return "\v", s, nil + case '?': + return "?", s, nil // trigraph workaround + case '\'', '"', '\\': + return string(r), s, nil + case '0', '1', '2', '3', '4', '5', '6', '7': + if len(s) < 2 { + return "", "", fmt.Errorf(`\%c requires 2 following digits`, r) + } + ss := string(r) + s[:2] + s = s[2:] + i, err := strconv.ParseUint(ss, 8, 8) + if err != nil { + return "", "", fmt.Errorf(`\%s contains non-octal digits`, ss) + } + return string([]byte{byte(i)}), s, nil + case 'x', 'X', 'u', 'U': + var n int + switch r { + case 'x', 'X': + n = 2 + case 'u': + n = 4 + case 'U': + n = 8 + } + if len(s) < n { + return "", "", fmt.Errorf(`\%c requires %d following digits`, r, n) + } + ss := s[:n] + s = s[n:] + i, err := strconv.ParseUint(ss, 16, 64) + if err != nil { + return "", "", fmt.Errorf(`\%c%s contains non-hexadecimal digits`, r, ss) + } + if r == 'x' || r == 'X' { + return string([]byte{byte(i)}), s, nil + } + if i > utf8.MaxRune { + return "", "", fmt.Errorf(`\%c%s is not a valid Unicode code point`, r, ss) + } + return string(i), s, nil + } + return "", "", fmt.Errorf(`unknown escape \%c`, r) +} + +// Back off the parser by one token. Can only be done between calls to next(). +// It makes the next advance() a no-op. +func (p *textParser) back() { p.backed = true } + +// Advances the parser and returns the new current token. +func (p *textParser) next() *token { + if p.backed || p.done { + p.backed = false + return &p.cur + } + p.advance() + if p.done { + p.cur.value = "" + } else if len(p.cur.value) > 0 && isQuote(p.cur.value[0]) { + // Look for multiple quoted strings separated by whitespace, + // and concatenate them. + cat := p.cur + for { + p.skipWhitespace() + if p.done || !isQuote(p.s[0]) { + break + } + p.advance() + if p.cur.err != nil { + return &p.cur + } + cat.value += " " + p.cur.value + cat.unquoted += p.cur.unquoted + } + p.done = false // parser may have seen EOF, but we want to return cat + p.cur = cat + } + return &p.cur +} + +func (p *textParser) consumeToken(s string) error { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value != s { + p.back() + return p.errorf("expected %q, found %q", s, tok.value) + } + return nil +} + +// Return a RequiredNotSetError indicating which required field was not set. +func (p *textParser) missingRequiredFieldError(sv reflect.Value) *RequiredNotSetError { + st := sv.Type() + sprops := GetProperties(st) + for i := 0; i < st.NumField(); i++ { + if !isNil(sv.Field(i)) { + continue + } + + props := sprops.Prop[i] + if props.Required { + return &RequiredNotSetError{fmt.Sprintf("%v.%v", st, props.OrigName)} + } + } + return &RequiredNotSetError{fmt.Sprintf("%v.", st)} // should not happen +} + +// Returns the index in the struct for the named field, as well as the parsed tag properties. +func structFieldByName(sprops *StructProperties, name string) (int, *Properties, bool) { + i, ok := sprops.decoderOrigNames[name] + if ok { + return i, sprops.Prop[i], true + } + return -1, nil, false +} + +// Consume a ':' from the input stream (if the next token is a colon), +// returning an error if a colon is needed but not present. +func (p *textParser) checkForColon(props *Properties, typ reflect.Type) *ParseError { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value != ":" { + // Colon is optional when the field is a group or message. + needColon := true + switch props.Wire { + case "group": + needColon = false + case "bytes": + // A "bytes" field is either a message, a string, or a repeated field; + // those three become *T, *string and []T respectively, so we can check for + // this field being a pointer to a non-string. + if typ.Kind() == reflect.Ptr { + // *T or *string + if typ.Elem().Kind() == reflect.String { + break + } + } else if typ.Kind() == reflect.Slice { + // []T or []*T + if typ.Elem().Kind() != reflect.Ptr { + break + } + } else if typ.Kind() == reflect.String { + // The proto3 exception is for a string field, + // which requires a colon. + break + } + needColon = false + } + if needColon { + return p.errorf("expected ':', found %q", tok.value) + } + p.back() + } + return nil +} + +func (p *textParser) readStruct(sv reflect.Value, terminator string) error { + st := sv.Type() + sprops := GetProperties(st) + reqCount := sprops.reqCount + var reqFieldErr error + fieldSet := make(map[string]bool) + // A struct is a sequence of "name: value", terminated by one of + // '>' or '}', or the end of the input. A name may also be + // "[extension]" or "[type/url]". + // + // The whole struct can also be an expanded Any message, like: + // [type/url] < ... struct contents ... > + for { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value == terminator { + break + } + if tok.value == "[" { + // Looks like an extension or an Any. + // + // TODO: Check whether we need to handle + // namespace rooted names (e.g. ".something.Foo"). + extName, err := p.consumeExtName() + if err != nil { + return err + } + + if s := strings.LastIndex(extName, "/"); s >= 0 { + // If it contains a slash, it's an Any type URL. + messageName := extName[s+1:] + mt := MessageType(messageName) + if mt == nil { + return p.errorf("unrecognized message %q in google.protobuf.Any", messageName) + } + tok = p.next() + if tok.err != nil { + return tok.err + } + // consume an optional colon + if tok.value == ":" { + tok = p.next() + if tok.err != nil { + return tok.err + } + } + var terminator string + switch tok.value { + case "<": + terminator = ">" + case "{": + terminator = "}" + default: + return p.errorf("expected '{' or '<', found %q", tok.value) + } + v := reflect.New(mt.Elem()) + if pe := p.readStruct(v.Elem(), terminator); pe != nil { + return pe + } + b, err := Marshal(v.Interface().(Message)) + if err != nil { + return p.errorf("failed to marshal message of type %q: %v", messageName, err) + } + if fieldSet["type_url"] { + return p.errorf(anyRepeatedlyUnpacked, "type_url") + } + if fieldSet["value"] { + return p.errorf(anyRepeatedlyUnpacked, "value") + } + sv.FieldByName("TypeUrl").SetString(extName) + sv.FieldByName("Value").SetBytes(b) + fieldSet["type_url"] = true + fieldSet["value"] = true + continue + } + + var desc *ExtensionDesc + // This could be faster, but it's functional. + // TODO: Do something smarter than a linear scan. + for _, d := range RegisteredExtensions(reflect.New(st).Interface().(Message)) { + if d.Name == extName { + desc = d + break + } + } + if desc == nil { + return p.errorf("unrecognized extension %q", extName) + } + + props := &Properties{} + props.Parse(desc.Tag) + + typ := reflect.TypeOf(desc.ExtensionType) + if err := p.checkForColon(props, typ); err != nil { + return err + } + + rep := desc.repeated() + + // Read the extension structure, and set it in + // the value we're constructing. + var ext reflect.Value + if !rep { + ext = reflect.New(typ).Elem() + } else { + ext = reflect.New(typ.Elem()).Elem() + } + if err := p.readAny(ext, props); err != nil { + if _, ok := err.(*RequiredNotSetError); !ok { + return err + } + reqFieldErr = err + } + ep := sv.Addr().Interface().(Message) + if !rep { + SetExtension(ep, desc, ext.Interface()) + } else { + old, err := GetExtension(ep, desc) + var sl reflect.Value + if err == nil { + sl = reflect.ValueOf(old) // existing slice + } else { + sl = reflect.MakeSlice(typ, 0, 1) + } + sl = reflect.Append(sl, ext) + SetExtension(ep, desc, sl.Interface()) + } + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + continue + } + + // This is a normal, non-extension field. + name := tok.value + var dst reflect.Value + fi, props, ok := structFieldByName(sprops, name) + if ok { + dst = sv.Field(fi) + } else if oop, ok := sprops.OneofTypes[name]; ok { + // It is a oneof. + props = oop.Prop + nv := reflect.New(oop.Type.Elem()) + dst = nv.Elem().Field(0) + field := sv.Field(oop.Field) + if !field.IsNil() { + return p.errorf("field '%s' would overwrite already parsed oneof '%s'", name, sv.Type().Field(oop.Field).Name) + } + field.Set(nv) + } + if !dst.IsValid() { + return p.errorf("unknown field name %q in %v", name, st) + } + + if dst.Kind() == reflect.Map { + // Consume any colon. + if err := p.checkForColon(props, dst.Type()); err != nil { + return err + } + + // Construct the map if it doesn't already exist. + if dst.IsNil() { + dst.Set(reflect.MakeMap(dst.Type())) + } + key := reflect.New(dst.Type().Key()).Elem() + val := reflect.New(dst.Type().Elem()).Elem() + + // The map entry should be this sequence of tokens: + // < key : KEY value : VALUE > + // However, implementations may omit key or value, and technically + // we should support them in any order. See b/28924776 for a time + // this went wrong. + + tok := p.next() + var terminator string + switch tok.value { + case "<": + terminator = ">" + case "{": + terminator = "}" + default: + return p.errorf("expected '{' or '<', found %q", tok.value) + } + for { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value == terminator { + break + } + switch tok.value { + case "key": + if err := p.consumeToken(":"); err != nil { + return err + } + if err := p.readAny(key, props.mkeyprop); err != nil { + return err + } + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + case "value": + if err := p.checkForColon(props.mvalprop, dst.Type().Elem()); err != nil { + return err + } + if err := p.readAny(val, props.mvalprop); err != nil { + return err + } + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + default: + p.back() + return p.errorf(`expected "key", "value", or %q, found %q`, terminator, tok.value) + } + } + + dst.SetMapIndex(key, val) + continue + } + + // Check that it's not already set if it's not a repeated field. + if !props.Repeated && fieldSet[name] { + return p.errorf("non-repeated field %q was repeated", name) + } + + if err := p.checkForColon(props, dst.Type()); err != nil { + return err + } + + // Parse into the field. + fieldSet[name] = true + if err := p.readAny(dst, props); err != nil { + if _, ok := err.(*RequiredNotSetError); !ok { + return err + } + reqFieldErr = err + } + if props.Required { + reqCount-- + } + + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + + } + + if reqCount > 0 { + return p.missingRequiredFieldError(sv) + } + return reqFieldErr +} + +// consumeExtName consumes extension name or expanded Any type URL and the +// following ']'. It returns the name or URL consumed. +func (p *textParser) consumeExtName() (string, error) { + tok := p.next() + if tok.err != nil { + return "", tok.err + } + + // If extension name or type url is quoted, it's a single token. + if len(tok.value) > 2 && isQuote(tok.value[0]) && tok.value[len(tok.value)-1] == tok.value[0] { + name, err := unquoteC(tok.value[1:len(tok.value)-1], rune(tok.value[0])) + if err != nil { + return "", err + } + return name, p.consumeToken("]") + } + + // Consume everything up to "]" + var parts []string + for tok.value != "]" { + parts = append(parts, tok.value) + tok = p.next() + if tok.err != nil { + return "", p.errorf("unrecognized type_url or extension name: %s", tok.err) + } + if p.done && tok.value != "]" { + return "", p.errorf("unclosed type_url or extension name") + } + } + return strings.Join(parts, ""), nil +} + +// consumeOptionalSeparator consumes an optional semicolon or comma. +// It is used in readStruct to provide backward compatibility. +func (p *textParser) consumeOptionalSeparator() error { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value != ";" && tok.value != "," { + p.back() + } + return nil +} + +func (p *textParser) readAny(v reflect.Value, props *Properties) error { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value == "" { + return p.errorf("unexpected EOF") + } + + switch fv := v; fv.Kind() { + case reflect.Slice: + at := v.Type() + if at.Elem().Kind() == reflect.Uint8 { + // Special case for []byte + if tok.value[0] != '"' && tok.value[0] != '\'' { + // Deliberately written out here, as the error after + // this switch statement would write "invalid []byte: ...", + // which is not as user-friendly. + return p.errorf("invalid string: %v", tok.value) + } + bytes := []byte(tok.unquoted) + fv.Set(reflect.ValueOf(bytes)) + return nil + } + // Repeated field. + if tok.value == "[" { + // Repeated field with list notation, like [1,2,3]. + for { + fv.Set(reflect.Append(fv, reflect.New(at.Elem()).Elem())) + err := p.readAny(fv.Index(fv.Len()-1), props) + if err != nil { + return err + } + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value == "]" { + break + } + if tok.value != "," { + return p.errorf("Expected ']' or ',' found %q", tok.value) + } + } + return nil + } + // One value of the repeated field. + p.back() + fv.Set(reflect.Append(fv, reflect.New(at.Elem()).Elem())) + return p.readAny(fv.Index(fv.Len()-1), props) + case reflect.Bool: + // true/1/t/True or false/f/0/False. + switch tok.value { + case "true", "1", "t", "True": + fv.SetBool(true) + return nil + case "false", "0", "f", "False": + fv.SetBool(false) + return nil + } + case reflect.Float32, reflect.Float64: + v := tok.value + // Ignore 'f' for compatibility with output generated by C++, but don't + // remove 'f' when the value is "-inf" or "inf". + if strings.HasSuffix(v, "f") && tok.value != "-inf" && tok.value != "inf" { + v = v[:len(v)-1] + } + if f, err := strconv.ParseFloat(v, fv.Type().Bits()); err == nil { + fv.SetFloat(f) + return nil + } + case reflect.Int32: + if x, err := strconv.ParseInt(tok.value, 0, 32); err == nil { + fv.SetInt(x) + return nil + } + + if len(props.Enum) == 0 { + break + } + m, ok := enumValueMaps[props.Enum] + if !ok { + break + } + x, ok := m[tok.value] + if !ok { + break + } + fv.SetInt(int64(x)) + return nil + case reflect.Int64: + if x, err := strconv.ParseInt(tok.value, 0, 64); err == nil { + fv.SetInt(x) + return nil + } + + case reflect.Ptr: + // A basic field (indirected through pointer), or a repeated message/group + p.back() + fv.Set(reflect.New(fv.Type().Elem())) + return p.readAny(fv.Elem(), props) + case reflect.String: + if tok.value[0] == '"' || tok.value[0] == '\'' { + fv.SetString(tok.unquoted) + return nil + } + case reflect.Struct: + var terminator string + switch tok.value { + case "{": + terminator = "}" + case "<": + terminator = ">" + default: + return p.errorf("expected '{' or '<', found %q", tok.value) + } + // TODO: Handle nested messages which implement encoding.TextUnmarshaler. + return p.readStruct(fv, terminator) + case reflect.Uint32: + if x, err := strconv.ParseUint(tok.value, 0, 32); err == nil { + fv.SetUint(uint64(x)) + return nil + } + case reflect.Uint64: + if x, err := strconv.ParseUint(tok.value, 0, 64); err == nil { + fv.SetUint(x) + return nil + } + } + return p.errorf("invalid %v: %v", v.Type(), tok.value) +} + +// UnmarshalText reads a protocol buffer in Text format. UnmarshalText resets pb +// before starting to unmarshal, so any existing data in pb is always removed. +// If a required field is not set and no other error occurs, +// UnmarshalText returns *RequiredNotSetError. +func UnmarshalText(s string, pb Message) error { + if um, ok := pb.(encoding.TextUnmarshaler); ok { + return um.UnmarshalText([]byte(s)) + } + pb.Reset() + v := reflect.ValueOf(pb) + return newTextParser(s).readStruct(v.Elem(), "") +} diff --git a/api/vendor/github.com/golang/protobuf/proto/text_parser_test.go b/api/vendor/github.com/golang/protobuf/proto/text_parser_test.go new file mode 100644 index 0000000..a819808 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/proto/text_parser_test.go @@ -0,0 +1,706 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package proto_test + +import ( + "fmt" + "math" + "testing" + + . "github.com/golang/protobuf/proto" + proto3pb "github.com/golang/protobuf/proto/proto3_proto" + . "github.com/golang/protobuf/proto/test_proto" +) + +type UnmarshalTextTest struct { + in string + err string // if "", no error expected + out *MyMessage +} + +func buildExtStructTest(text string) UnmarshalTextTest { + msg := &MyMessage{ + Count: Int32(42), + } + SetExtension(msg, E_Ext_More, &Ext{ + Data: String("Hello, world!"), + }) + return UnmarshalTextTest{in: text, out: msg} +} + +func buildExtDataTest(text string) UnmarshalTextTest { + msg := &MyMessage{ + Count: Int32(42), + } + SetExtension(msg, E_Ext_Text, String("Hello, world!")) + SetExtension(msg, E_Ext_Number, Int32(1729)) + return UnmarshalTextTest{in: text, out: msg} +} + +func buildExtRepStringTest(text string) UnmarshalTextTest { + msg := &MyMessage{ + Count: Int32(42), + } + if err := SetExtension(msg, E_Greeting, []string{"bula", "hola"}); err != nil { + panic(err) + } + return UnmarshalTextTest{in: text, out: msg} +} + +var unMarshalTextTests = []UnmarshalTextTest{ + // Basic + { + in: " count:42\n name:\"Dave\" ", + out: &MyMessage{ + Count: Int32(42), + Name: String("Dave"), + }, + }, + + // Empty quoted string + { + in: `count:42 name:""`, + out: &MyMessage{ + Count: Int32(42), + Name: String(""), + }, + }, + + // Quoted string concatenation with double quotes + { + in: `count:42 name: "My name is "` + "\n" + `"elsewhere"`, + out: &MyMessage{ + Count: Int32(42), + Name: String("My name is elsewhere"), + }, + }, + + // Quoted string concatenation with single quotes + { + in: "count:42 name: 'My name is '\n'elsewhere'", + out: &MyMessage{ + Count: Int32(42), + Name: String("My name is elsewhere"), + }, + }, + + // Quoted string concatenations with mixed quotes + { + in: "count:42 name: 'My name is '\n\"elsewhere\"", + out: &MyMessage{ + Count: Int32(42), + Name: String("My name is elsewhere"), + }, + }, + { + in: "count:42 name: \"My name is \"\n'elsewhere'", + out: &MyMessage{ + Count: Int32(42), + Name: String("My name is elsewhere"), + }, + }, + + // Quoted string with escaped apostrophe + { + in: `count:42 name: "HOLIDAY - New Year\'s Day"`, + out: &MyMessage{ + Count: Int32(42), + Name: String("HOLIDAY - New Year's Day"), + }, + }, + + // Quoted string with single quote + { + in: `count:42 name: 'Roger "The Ramster" Ramjet'`, + out: &MyMessage{ + Count: Int32(42), + Name: String(`Roger "The Ramster" Ramjet`), + }, + }, + + // Quoted string with all the accepted special characters from the C++ test + { + in: `count:42 name: ` + "\"\\\"A string with \\' characters \\n and \\r newlines and \\t tabs and \\001 slashes \\\\ and multiple spaces\"", + out: &MyMessage{ + Count: Int32(42), + Name: String("\"A string with ' characters \n and \r newlines and \t tabs and \001 slashes \\ and multiple spaces"), + }, + }, + + // Quoted string with quoted backslash + { + in: `count:42 name: "\\'xyz"`, + out: &MyMessage{ + Count: Int32(42), + Name: String(`\'xyz`), + }, + }, + + // Quoted string with UTF-8 bytes. + { + in: "count:42 name: '\303\277\302\201\x00\xAB\xCD\xEF'", + out: &MyMessage{ + Count: Int32(42), + Name: String("\303\277\302\201\x00\xAB\xCD\xEF"), + }, + }, + + // Quoted string with unicode escapes. + { + in: `count: 42 name: "\u0047\U00000047\uffff\U0010ffff"`, + out: &MyMessage{ + Count: Int32(42), + Name: String("GG\uffff\U0010ffff"), + }, + }, + + // Bad quoted string + { + in: `inner: < host: "\0" >` + "\n", + err: `line 1.15: invalid quoted string "\0": \0 requires 2 following digits`, + }, + + // Bad \u escape + { + in: `count: 42 name: "\u000"`, + err: `line 1.16: invalid quoted string "\u000": \u requires 4 following digits`, + }, + + // Bad \U escape + { + in: `count: 42 name: "\U0000000"`, + err: `line 1.16: invalid quoted string "\U0000000": \U requires 8 following digits`, + }, + + // Bad \U escape + { + in: `count: 42 name: "\xxx"`, + err: `line 1.16: invalid quoted string "\xxx": \xxx contains non-hexadecimal digits`, + }, + + // Number too large for int64 + { + in: "count: 1 others { key: 123456789012345678901 }", + err: "line 1.23: invalid int64: 123456789012345678901", + }, + + // Number too large for int32 + { + in: "count: 1234567890123", + err: "line 1.7: invalid int32: 1234567890123", + }, + + // Number in hexadecimal + { + in: "count: 0x2beef", + out: &MyMessage{ + Count: Int32(0x2beef), + }, + }, + + // Number in octal + { + in: "count: 024601", + out: &MyMessage{ + Count: Int32(024601), + }, + }, + + // Floating point number with "f" suffix + { + in: "count: 4 others:< weight: 17.0f >", + out: &MyMessage{ + Count: Int32(4), + Others: []*OtherMessage{ + { + Weight: Float32(17), + }, + }, + }, + }, + + // Floating point positive infinity + { + in: "count: 4 bigfloat: inf", + out: &MyMessage{ + Count: Int32(4), + Bigfloat: Float64(math.Inf(1)), + }, + }, + + // Floating point negative infinity + { + in: "count: 4 bigfloat: -inf", + out: &MyMessage{ + Count: Int32(4), + Bigfloat: Float64(math.Inf(-1)), + }, + }, + + // Number too large for float32 + { + in: "others:< weight: 12345678901234567890123456789012345678901234567890 >", + err: "line 1.17: invalid float32: 12345678901234567890123456789012345678901234567890", + }, + + // Number posing as a quoted string + { + in: `inner: < host: 12 >` + "\n", + err: `line 1.15: invalid string: 12`, + }, + + // Quoted string posing as int32 + { + in: `count: "12"`, + err: `line 1.7: invalid int32: "12"`, + }, + + // Quoted string posing a float32 + { + in: `others:< weight: "17.4" >`, + err: `line 1.17: invalid float32: "17.4"`, + }, + + // unclosed bracket doesn't cause infinite loop + { + in: `[`, + err: `line 1.0: unclosed type_url or extension name`, + }, + + // Enum + { + in: `count:42 bikeshed: BLUE`, + out: &MyMessage{ + Count: Int32(42), + Bikeshed: MyMessage_BLUE.Enum(), + }, + }, + + // Repeated field + { + in: `count:42 pet: "horsey" pet:"bunny"`, + out: &MyMessage{ + Count: Int32(42), + Pet: []string{"horsey", "bunny"}, + }, + }, + + // Repeated field with list notation + { + in: `count:42 pet: ["horsey", "bunny"]`, + out: &MyMessage{ + Count: Int32(42), + Pet: []string{"horsey", "bunny"}, + }, + }, + + // Repeated message with/without colon and <>/{} + { + in: `count:42 others:{} others{} others:<> others:{}`, + out: &MyMessage{ + Count: Int32(42), + Others: []*OtherMessage{ + {}, + {}, + {}, + {}, + }, + }, + }, + + // Missing colon for inner message + { + in: `count:42 inner < host: "cauchy.syd" >`, + out: &MyMessage{ + Count: Int32(42), + Inner: &InnerMessage{ + Host: String("cauchy.syd"), + }, + }, + }, + + // Missing colon for string field + { + in: `name "Dave"`, + err: `line 1.5: expected ':', found "\"Dave\""`, + }, + + // Missing colon for int32 field + { + in: `count 42`, + err: `line 1.6: expected ':', found "42"`, + }, + + // Missing required field + { + in: `name: "Pawel"`, + err: fmt.Sprintf(`proto: required field "%T.count" not set`, MyMessage{}), + out: &MyMessage{ + Name: String("Pawel"), + }, + }, + + // Missing required field in a required submessage + { + in: `count: 42 we_must_go_deeper < leo_finally_won_an_oscar <> >`, + err: fmt.Sprintf(`proto: required field "%T.host" not set`, InnerMessage{}), + out: &MyMessage{ + Count: Int32(42), + WeMustGoDeeper: &RequiredInnerMessage{LeoFinallyWonAnOscar: &InnerMessage{}}, + }, + }, + + // Repeated non-repeated field + { + in: `name: "Rob" name: "Russ"`, + err: `line 1.12: non-repeated field "name" was repeated`, + }, + + // Group + { + in: `count: 17 SomeGroup { group_field: 12 }`, + out: &MyMessage{ + Count: Int32(17), + Somegroup: &MyMessage_SomeGroup{ + GroupField: Int32(12), + }, + }, + }, + + // Semicolon between fields + { + in: `count:3;name:"Calvin"`, + out: &MyMessage{ + Count: Int32(3), + Name: String("Calvin"), + }, + }, + // Comma between fields + { + in: `count:4,name:"Ezekiel"`, + out: &MyMessage{ + Count: Int32(4), + Name: String("Ezekiel"), + }, + }, + + // Boolean false + { + in: `count:42 inner { host: "example.com" connected: false }`, + out: &MyMessage{ + Count: Int32(42), + Inner: &InnerMessage{ + Host: String("example.com"), + Connected: Bool(false), + }, + }, + }, + // Boolean true + { + in: `count:42 inner { host: "example.com" connected: true }`, + out: &MyMessage{ + Count: Int32(42), + Inner: &InnerMessage{ + Host: String("example.com"), + Connected: Bool(true), + }, + }, + }, + // Boolean 0 + { + in: `count:42 inner { host: "example.com" connected: 0 }`, + out: &MyMessage{ + Count: Int32(42), + Inner: &InnerMessage{ + Host: String("example.com"), + Connected: Bool(false), + }, + }, + }, + // Boolean 1 + { + in: `count:42 inner { host: "example.com" connected: 1 }`, + out: &MyMessage{ + Count: Int32(42), + Inner: &InnerMessage{ + Host: String("example.com"), + Connected: Bool(true), + }, + }, + }, + // Boolean f + { + in: `count:42 inner { host: "example.com" connected: f }`, + out: &MyMessage{ + Count: Int32(42), + Inner: &InnerMessage{ + Host: String("example.com"), + Connected: Bool(false), + }, + }, + }, + // Boolean t + { + in: `count:42 inner { host: "example.com" connected: t }`, + out: &MyMessage{ + Count: Int32(42), + Inner: &InnerMessage{ + Host: String("example.com"), + Connected: Bool(true), + }, + }, + }, + // Boolean False + { + in: `count:42 inner { host: "example.com" connected: False }`, + out: &MyMessage{ + Count: Int32(42), + Inner: &InnerMessage{ + Host: String("example.com"), + Connected: Bool(false), + }, + }, + }, + // Boolean True + { + in: `count:42 inner { host: "example.com" connected: True }`, + out: &MyMessage{ + Count: Int32(42), + Inner: &InnerMessage{ + Host: String("example.com"), + Connected: Bool(true), + }, + }, + }, + + // Extension + buildExtStructTest(`count: 42 [test_proto.Ext.more]:`), + buildExtStructTest(`count: 42 [test_proto.Ext.more] {data:"Hello, world!"}`), + buildExtDataTest(`count: 42 [test_proto.Ext.text]:"Hello, world!" [test_proto.Ext.number]:1729`), + buildExtRepStringTest(`count: 42 [test_proto.greeting]:"bula" [test_proto.greeting]:"hola"`), + + // Big all-in-one + { + in: "count:42 # Meaning\n" + + `name:"Dave" ` + + `quote:"\"I didn't want to go.\"" ` + + `pet:"bunny" ` + + `pet:"kitty" ` + + `pet:"horsey" ` + + `inner:<` + + ` host:"footrest.syd" ` + + ` port:7001 ` + + ` connected:true ` + + `> ` + + `others:<` + + ` key:3735928559 ` + + ` value:"\x01A\a\f" ` + + `> ` + + `others:<` + + " weight:58.9 # Atomic weight of Co\n" + + ` inner:<` + + ` host:"lesha.mtv" ` + + ` port:8002 ` + + ` >` + + `>`, + out: &MyMessage{ + Count: Int32(42), + Name: String("Dave"), + Quote: String(`"I didn't want to go."`), + Pet: []string{"bunny", "kitty", "horsey"}, + Inner: &InnerMessage{ + Host: String("footrest.syd"), + Port: Int32(7001), + Connected: Bool(true), + }, + Others: []*OtherMessage{ + { + Key: Int64(3735928559), + Value: []byte{0x1, 'A', '\a', '\f'}, + }, + { + Weight: Float32(58.9), + Inner: &InnerMessage{ + Host: String("lesha.mtv"), + Port: Int32(8002), + }, + }, + }, + }, + }, +} + +func TestUnmarshalText(t *testing.T) { + for i, test := range unMarshalTextTests { + pb := new(MyMessage) + err := UnmarshalText(test.in, pb) + if test.err == "" { + // We don't expect failure. + if err != nil { + t.Errorf("Test %d: Unexpected error: %v", i, err) + } else if !Equal(pb, test.out) { + t.Errorf("Test %d: Incorrect populated \nHave: %v\nWant: %v", + i, pb, test.out) + } + } else { + // We do expect failure. + if err == nil { + t.Errorf("Test %d: Didn't get expected error: %v", i, test.err) + } else if err.Error() != test.err { + t.Errorf("Test %d: Incorrect error.\nHave: %v\nWant: %v", + i, err.Error(), test.err) + } else if _, ok := err.(*RequiredNotSetError); ok && test.out != nil && !Equal(pb, test.out) { + t.Errorf("Test %d: Incorrect populated \nHave: %v\nWant: %v", + i, pb, test.out) + } + } + } +} + +func TestUnmarshalTextCustomMessage(t *testing.T) { + msg := &textMessage{} + if err := UnmarshalText("custom", msg); err != nil { + t.Errorf("Unexpected error from custom unmarshal: %v", err) + } + if UnmarshalText("not custom", msg) == nil { + t.Errorf("Didn't get expected error from custom unmarshal") + } +} + +// Regression test; this caused a panic. +func TestRepeatedEnum(t *testing.T) { + pb := new(RepeatedEnum) + if err := UnmarshalText("color: RED", pb); err != nil { + t.Fatal(err) + } + exp := &RepeatedEnum{ + Color: []RepeatedEnum_Color{RepeatedEnum_RED}, + } + if !Equal(pb, exp) { + t.Errorf("Incorrect populated \nHave: %v\nWant: %v", pb, exp) + } +} + +func TestProto3TextParsing(t *testing.T) { + m := new(proto3pb.Message) + const in = `name: "Wallace" true_scotsman: true` + want := &proto3pb.Message{ + Name: "Wallace", + TrueScotsman: true, + } + if err := UnmarshalText(in, m); err != nil { + t.Fatal(err) + } + if !Equal(m, want) { + t.Errorf("\n got %v\nwant %v", m, want) + } +} + +func TestMapParsing(t *testing.T) { + m := new(MessageWithMap) + const in = `name_mapping: name_mapping:` + + `msg_mapping:,>` + // separating commas are okay + `msg_mapping>` + // no colon after "value" + `msg_mapping:>` + // omitted key + `msg_mapping:` + // omitted value + `byte_mapping:` + + `byte_mapping:<>` // omitted key and value + want := &MessageWithMap{ + NameMapping: map[int32]string{ + 1: "Beatles", + 1234: "Feist", + }, + MsgMapping: map[int64]*FloatingPoint{ + -4: {F: Float64(2.0)}, + -2: {F: Float64(4.0)}, + 0: {F: Float64(5.0)}, + 1: nil, + }, + ByteMapping: map[bool][]byte{ + false: nil, + true: []byte("so be it"), + }, + } + if err := UnmarshalText(in, m); err != nil { + t.Fatal(err) + } + if !Equal(m, want) { + t.Errorf("\n got %v\nwant %v", m, want) + } +} + +func TestOneofParsing(t *testing.T) { + const in = `name:"Shrek"` + m := new(Communique) + want := &Communique{Union: &Communique_Name{"Shrek"}} + if err := UnmarshalText(in, m); err != nil { + t.Fatal(err) + } + if !Equal(m, want) { + t.Errorf("\n got %v\nwant %v", m, want) + } + + const inOverwrite = `name:"Shrek" number:42` + m = new(Communique) + testErr := "line 1.13: field 'number' would overwrite already parsed oneof 'Union'" + if err := UnmarshalText(inOverwrite, m); err == nil { + t.Errorf("TestOneofParsing: Didn't get expected error: %v", testErr) + } else if err.Error() != testErr { + t.Errorf("TestOneofParsing: Incorrect error.\nHave: %v\nWant: %v", + err.Error(), testErr) + } + +} + +var benchInput string + +func init() { + benchInput = "count: 4\n" + for i := 0; i < 1000; i++ { + benchInput += "pet: \"fido\"\n" + } + + // Check it is valid input. + pb := new(MyMessage) + err := UnmarshalText(benchInput, pb) + if err != nil { + panic("Bad benchmark input: " + err.Error()) + } +} + +func BenchmarkUnmarshalText(b *testing.B) { + pb := new(MyMessage) + for i := 0; i < b.N; i++ { + UnmarshalText(benchInput, pb) + } + b.SetBytes(int64(len(benchInput))) +} diff --git a/api/vendor/github.com/golang/protobuf/proto/text_test.go b/api/vendor/github.com/golang/protobuf/proto/text_test.go new file mode 100644 index 0000000..3c8b033 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/proto/text_test.go @@ -0,0 +1,518 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package proto_test + +import ( + "bytes" + "errors" + "io/ioutil" + "math" + "strings" + "sync" + "testing" + + "github.com/golang/protobuf/proto" + + proto3pb "github.com/golang/protobuf/proto/proto3_proto" + pb "github.com/golang/protobuf/proto/test_proto" + anypb "github.com/golang/protobuf/ptypes/any" +) + +// textMessage implements the methods that allow it to marshal and unmarshal +// itself as text. +type textMessage struct { +} + +func (*textMessage) MarshalText() ([]byte, error) { + return []byte("custom"), nil +} + +func (*textMessage) UnmarshalText(bytes []byte) error { + if string(bytes) != "custom" { + return errors.New("expected 'custom'") + } + return nil +} + +func (*textMessage) Reset() {} +func (*textMessage) String() string { return "" } +func (*textMessage) ProtoMessage() {} + +func newTestMessage() *pb.MyMessage { + msg := &pb.MyMessage{ + Count: proto.Int32(42), + Name: proto.String("Dave"), + Quote: proto.String(`"I didn't want to go."`), + Pet: []string{"bunny", "kitty", "horsey"}, + Inner: &pb.InnerMessage{ + Host: proto.String("footrest.syd"), + Port: proto.Int32(7001), + Connected: proto.Bool(true), + }, + Others: []*pb.OtherMessage{ + { + Key: proto.Int64(0xdeadbeef), + Value: []byte{1, 65, 7, 12}, + }, + { + Weight: proto.Float32(6.022), + Inner: &pb.InnerMessage{ + Host: proto.String("lesha.mtv"), + Port: proto.Int32(8002), + }, + }, + }, + Bikeshed: pb.MyMessage_BLUE.Enum(), + Somegroup: &pb.MyMessage_SomeGroup{ + GroupField: proto.Int32(8), + }, + // One normally wouldn't do this. + // This is an undeclared tag 13, as a varint (wire type 0) with value 4. + XXX_unrecognized: []byte{13<<3 | 0, 4}, + } + ext := &pb.Ext{ + Data: proto.String("Big gobs for big rats"), + } + if err := proto.SetExtension(msg, pb.E_Ext_More, ext); err != nil { + panic(err) + } + greetings := []string{"adg", "easy", "cow"} + if err := proto.SetExtension(msg, pb.E_Greeting, greetings); err != nil { + panic(err) + } + + // Add an unknown extension. We marshal a pb.Ext, and fake the ID. + b, err := proto.Marshal(&pb.Ext{Data: proto.String("3G skiing")}) + if err != nil { + panic(err) + } + b = append(proto.EncodeVarint(201<<3|proto.WireBytes), b...) + proto.SetRawExtension(msg, 201, b) + + // Extensions can be plain fields, too, so let's test that. + b = append(proto.EncodeVarint(202<<3|proto.WireVarint), 19) + proto.SetRawExtension(msg, 202, b) + + return msg +} + +const text = `count: 42 +name: "Dave" +quote: "\"I didn't want to go.\"" +pet: "bunny" +pet: "kitty" +pet: "horsey" +inner: < + host: "footrest.syd" + port: 7001 + connected: true +> +others: < + key: 3735928559 + value: "\001A\007\014" +> +others: < + weight: 6.022 + inner: < + host: "lesha.mtv" + port: 8002 + > +> +bikeshed: BLUE +SomeGroup { + group_field: 8 +} +/* 2 unknown bytes */ +13: 4 +[test_proto.Ext.more]: < + data: "Big gobs for big rats" +> +[test_proto.greeting]: "adg" +[test_proto.greeting]: "easy" +[test_proto.greeting]: "cow" +/* 13 unknown bytes */ +201: "\t3G skiing" +/* 3 unknown bytes */ +202: 19 +` + +func TestMarshalText(t *testing.T) { + buf := new(bytes.Buffer) + if err := proto.MarshalText(buf, newTestMessage()); err != nil { + t.Fatalf("proto.MarshalText: %v", err) + } + s := buf.String() + if s != text { + t.Errorf("Got:\n===\n%v===\nExpected:\n===\n%v===\n", s, text) + } +} + +func TestMarshalTextCustomMessage(t *testing.T) { + buf := new(bytes.Buffer) + if err := proto.MarshalText(buf, &textMessage{}); err != nil { + t.Fatalf("proto.MarshalText: %v", err) + } + s := buf.String() + if s != "custom" { + t.Errorf("Got %q, expected %q", s, "custom") + } +} +func TestMarshalTextNil(t *testing.T) { + want := "" + tests := []proto.Message{nil, (*pb.MyMessage)(nil)} + for i, test := range tests { + buf := new(bytes.Buffer) + if err := proto.MarshalText(buf, test); err != nil { + t.Fatal(err) + } + if got := buf.String(); got != want { + t.Errorf("%d: got %q want %q", i, got, want) + } + } +} + +func TestMarshalTextUnknownEnum(t *testing.T) { + // The Color enum only specifies values 0-2. + m := &pb.MyMessage{Bikeshed: pb.MyMessage_Color(3).Enum()} + got := m.String() + const want = `bikeshed:3 ` + if got != want { + t.Errorf("\n got %q\nwant %q", got, want) + } +} + +func TestTextOneof(t *testing.T) { + tests := []struct { + m proto.Message + want string + }{ + // zero message + {&pb.Communique{}, ``}, + // scalar field + {&pb.Communique{Union: &pb.Communique_Number{4}}, `number:4`}, + // message field + {&pb.Communique{Union: &pb.Communique_Msg{ + &pb.Strings{StringField: proto.String("why hello!")}, + }}, `msg:`}, + // bad oneof (should not panic) + {&pb.Communique{Union: &pb.Communique_Msg{nil}}, `msg:/* nil */`}, + } + for _, test := range tests { + got := strings.TrimSpace(test.m.String()) + if got != test.want { + t.Errorf("\n got %s\nwant %s", got, test.want) + } + } +} + +func BenchmarkMarshalTextBuffered(b *testing.B) { + buf := new(bytes.Buffer) + m := newTestMessage() + for i := 0; i < b.N; i++ { + buf.Reset() + proto.MarshalText(buf, m) + } +} + +func BenchmarkMarshalTextUnbuffered(b *testing.B) { + w := ioutil.Discard + m := newTestMessage() + for i := 0; i < b.N; i++ { + proto.MarshalText(w, m) + } +} + +func compact(src string) string { + // s/[ \n]+/ /g; s/ $//; + dst := make([]byte, len(src)) + space, comment := false, false + j := 0 + for i := 0; i < len(src); i++ { + if strings.HasPrefix(src[i:], "/*") { + comment = true + i++ + continue + } + if comment && strings.HasPrefix(src[i:], "*/") { + comment = false + i++ + continue + } + if comment { + continue + } + c := src[i] + if c == ' ' || c == '\n' { + space = true + continue + } + if j > 0 && (dst[j-1] == ':' || dst[j-1] == '<' || dst[j-1] == '{') { + space = false + } + if c == '{' { + space = false + } + if space { + dst[j] = ' ' + j++ + space = false + } + dst[j] = c + j++ + } + if space { + dst[j] = ' ' + j++ + } + return string(dst[0:j]) +} + +var compactText = compact(text) + +func TestCompactText(t *testing.T) { + s := proto.CompactTextString(newTestMessage()) + if s != compactText { + t.Errorf("Got:\n===\n%v===\nExpected:\n===\n%v\n===\n", s, compactText) + } +} + +func TestStringEscaping(t *testing.T) { + testCases := []struct { + in *pb.Strings + out string + }{ + { + // Test data from C++ test (TextFormatTest.StringEscape). + // Single divergence: we don't escape apostrophes. + &pb.Strings{StringField: proto.String("\"A string with ' characters \n and \r newlines and \t tabs and \001 slashes \\ and multiple spaces")}, + "string_field: \"\\\"A string with ' characters \\n and \\r newlines and \\t tabs and \\001 slashes \\\\ and multiple spaces\"\n", + }, + { + // Test data from the same C++ test. + &pb.Strings{StringField: proto.String("\350\260\267\346\255\214")}, + "string_field: \"\\350\\260\\267\\346\\255\\214\"\n", + }, + { + // Some UTF-8. + &pb.Strings{StringField: proto.String("\x00\x01\xff\x81")}, + `string_field: "\000\001\377\201"` + "\n", + }, + } + + for i, tc := range testCases { + var buf bytes.Buffer + if err := proto.MarshalText(&buf, tc.in); err != nil { + t.Errorf("proto.MarsalText: %v", err) + continue + } + s := buf.String() + if s != tc.out { + t.Errorf("#%d: Got:\n%s\nExpected:\n%s\n", i, s, tc.out) + continue + } + + // Check round-trip. + pb := new(pb.Strings) + if err := proto.UnmarshalText(s, pb); err != nil { + t.Errorf("#%d: UnmarshalText: %v", i, err) + continue + } + if !proto.Equal(pb, tc.in) { + t.Errorf("#%d: Round-trip failed:\nstart: %v\n end: %v", i, tc.in, pb) + } + } +} + +// A limitedWriter accepts some output before it fails. +// This is a proxy for something like a nearly-full or imminently-failing disk, +// or a network connection that is about to die. +type limitedWriter struct { + b bytes.Buffer + limit int +} + +var outOfSpace = errors.New("proto: insufficient space") + +func (w *limitedWriter) Write(p []byte) (n int, err error) { + var avail = w.limit - w.b.Len() + if avail <= 0 { + return 0, outOfSpace + } + if len(p) <= avail { + return w.b.Write(p) + } + n, _ = w.b.Write(p[:avail]) + return n, outOfSpace +} + +func TestMarshalTextFailing(t *testing.T) { + // Try lots of different sizes to exercise more error code-paths. + for lim := 0; lim < len(text); lim++ { + buf := new(limitedWriter) + buf.limit = lim + err := proto.MarshalText(buf, newTestMessage()) + // We expect a certain error, but also some partial results in the buffer. + if err != outOfSpace { + t.Errorf("Got:\n===\n%v===\nExpected:\n===\n%v===\n", err, outOfSpace) + } + s := buf.b.String() + x := text[:buf.limit] + if s != x { + t.Errorf("Got:\n===\n%v===\nExpected:\n===\n%v===\n", s, x) + } + } +} + +func TestFloats(t *testing.T) { + tests := []struct { + f float64 + want string + }{ + {0, "0"}, + {4.7, "4.7"}, + {math.Inf(1), "inf"}, + {math.Inf(-1), "-inf"}, + {math.NaN(), "nan"}, + } + for _, test := range tests { + msg := &pb.FloatingPoint{F: &test.f} + got := strings.TrimSpace(msg.String()) + want := `f:` + test.want + if got != want { + t.Errorf("f=%f: got %q, want %q", test.f, got, want) + } + } +} + +func TestRepeatedNilText(t *testing.T) { + m := &pb.MessageList{ + Message: []*pb.MessageList_Message{ + nil, + &pb.MessageList_Message{ + Name: proto.String("Horse"), + }, + nil, + }, + } + want := `Message +Message { + name: "Horse" +} +Message +` + if s := proto.MarshalTextString(m); s != want { + t.Errorf(" got: %s\nwant: %s", s, want) + } +} + +func TestProto3Text(t *testing.T) { + tests := []struct { + m proto.Message + want string + }{ + // zero message + {&proto3pb.Message{}, ``}, + // zero message except for an empty byte slice + {&proto3pb.Message{Data: []byte{}}, ``}, + // trivial case + {&proto3pb.Message{Name: "Rob", HeightInCm: 175}, `name:"Rob" height_in_cm:175`}, + // empty map + {&pb.MessageWithMap{}, ``}, + // non-empty map; map format is the same as a repeated struct, + // and they are sorted by key (numerically for numeric keys). + { + &pb.MessageWithMap{NameMapping: map[int32]string{ + -1: "Negatory", + 7: "Lucky", + 1234: "Feist", + 6345789: "Otis", + }}, + `name_mapping: ` + + `name_mapping: ` + + `name_mapping: ` + + `name_mapping:`, + }, + // map with nil value; not well-defined, but we shouldn't crash + { + &pb.MessageWithMap{MsgMapping: map[int64]*pb.FloatingPoint{7: nil}}, + `msg_mapping:`, + }, + } + for _, test := range tests { + got := strings.TrimSpace(test.m.String()) + if got != test.want { + t.Errorf("\n got %s\nwant %s", got, test.want) + } + } +} + +func TestRacyMarshal(t *testing.T) { + // This test should be run with the race detector. + + any := &pb.MyMessage{Count: proto.Int32(47), Name: proto.String("David")} + proto.SetExtension(any, pb.E_Ext_Text, proto.String("bar")) + b, err := proto.Marshal(any) + if err != nil { + panic(err) + } + m := &proto3pb.Message{ + Name: "David", + ResultCount: 47, + Anything: &anypb.Any{TypeUrl: "type.googleapis.com/" + proto.MessageName(any), Value: b}, + } + + wantText := proto.MarshalTextString(m) + wantBytes, err := proto.Marshal(m) + if err != nil { + t.Fatalf("proto.Marshal error: %v", err) + } + + var wg sync.WaitGroup + defer wg.Wait() + wg.Add(20) + for i := 0; i < 10; i++ { + go func() { + defer wg.Done() + got := proto.MarshalTextString(m) + if got != wantText { + t.Errorf("proto.MarshalTextString = %q, want %q", got, wantText) + } + }() + go func() { + defer wg.Done() + got, err := proto.Marshal(m) + if !bytes.Equal(got, wantBytes) || err != nil { + t.Errorf("proto.Marshal = (%x, %v), want (%x, nil)", got, err, wantBytes) + } + }() + } +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.pb.go b/api/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.pb.go new file mode 100644 index 0000000..e855b1f --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.pb.go @@ -0,0 +1,2812 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/descriptor.proto + +package descriptor // import "github.com/golang/protobuf/protoc-gen-go/descriptor" + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type FieldDescriptorProto_Type int32 + +const ( + // 0 is reserved for errors. + // Order is weird for historical reasons. + FieldDescriptorProto_TYPE_DOUBLE FieldDescriptorProto_Type = 1 + FieldDescriptorProto_TYPE_FLOAT FieldDescriptorProto_Type = 2 + // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT64 if + // negative values are likely. + FieldDescriptorProto_TYPE_INT64 FieldDescriptorProto_Type = 3 + FieldDescriptorProto_TYPE_UINT64 FieldDescriptorProto_Type = 4 + // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT32 if + // negative values are likely. + FieldDescriptorProto_TYPE_INT32 FieldDescriptorProto_Type = 5 + FieldDescriptorProto_TYPE_FIXED64 FieldDescriptorProto_Type = 6 + FieldDescriptorProto_TYPE_FIXED32 FieldDescriptorProto_Type = 7 + FieldDescriptorProto_TYPE_BOOL FieldDescriptorProto_Type = 8 + FieldDescriptorProto_TYPE_STRING FieldDescriptorProto_Type = 9 + // Tag-delimited aggregate. + // Group type is deprecated and not supported in proto3. However, Proto3 + // implementations should still be able to parse the group wire format and + // treat group fields as unknown fields. + FieldDescriptorProto_TYPE_GROUP FieldDescriptorProto_Type = 10 + FieldDescriptorProto_TYPE_MESSAGE FieldDescriptorProto_Type = 11 + // New in version 2. + FieldDescriptorProto_TYPE_BYTES FieldDescriptorProto_Type = 12 + FieldDescriptorProto_TYPE_UINT32 FieldDescriptorProto_Type = 13 + FieldDescriptorProto_TYPE_ENUM FieldDescriptorProto_Type = 14 + FieldDescriptorProto_TYPE_SFIXED32 FieldDescriptorProto_Type = 15 + FieldDescriptorProto_TYPE_SFIXED64 FieldDescriptorProto_Type = 16 + FieldDescriptorProto_TYPE_SINT32 FieldDescriptorProto_Type = 17 + FieldDescriptorProto_TYPE_SINT64 FieldDescriptorProto_Type = 18 +) + +var FieldDescriptorProto_Type_name = map[int32]string{ + 1: "TYPE_DOUBLE", + 2: "TYPE_FLOAT", + 3: "TYPE_INT64", + 4: "TYPE_UINT64", + 5: "TYPE_INT32", + 6: "TYPE_FIXED64", + 7: "TYPE_FIXED32", + 8: "TYPE_BOOL", + 9: "TYPE_STRING", + 10: "TYPE_GROUP", + 11: "TYPE_MESSAGE", + 12: "TYPE_BYTES", + 13: "TYPE_UINT32", + 14: "TYPE_ENUM", + 15: "TYPE_SFIXED32", + 16: "TYPE_SFIXED64", + 17: "TYPE_SINT32", + 18: "TYPE_SINT64", +} +var FieldDescriptorProto_Type_value = map[string]int32{ + "TYPE_DOUBLE": 1, + "TYPE_FLOAT": 2, + "TYPE_INT64": 3, + "TYPE_UINT64": 4, + "TYPE_INT32": 5, + "TYPE_FIXED64": 6, + "TYPE_FIXED32": 7, + "TYPE_BOOL": 8, + "TYPE_STRING": 9, + "TYPE_GROUP": 10, + "TYPE_MESSAGE": 11, + "TYPE_BYTES": 12, + "TYPE_UINT32": 13, + "TYPE_ENUM": 14, + "TYPE_SFIXED32": 15, + "TYPE_SFIXED64": 16, + "TYPE_SINT32": 17, + "TYPE_SINT64": 18, +} + +func (x FieldDescriptorProto_Type) Enum() *FieldDescriptorProto_Type { + p := new(FieldDescriptorProto_Type) + *p = x + return p +} +func (x FieldDescriptorProto_Type) String() string { + return proto.EnumName(FieldDescriptorProto_Type_name, int32(x)) +} +func (x *FieldDescriptorProto_Type) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FieldDescriptorProto_Type_value, data, "FieldDescriptorProto_Type") + if err != nil { + return err + } + *x = FieldDescriptorProto_Type(value) + return nil +} +func (FieldDescriptorProto_Type) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_descriptor_4df4cb5f42392df6, []int{4, 0} +} + +type FieldDescriptorProto_Label int32 + +const ( + // 0 is reserved for errors + FieldDescriptorProto_LABEL_OPTIONAL FieldDescriptorProto_Label = 1 + FieldDescriptorProto_LABEL_REQUIRED FieldDescriptorProto_Label = 2 + FieldDescriptorProto_LABEL_REPEATED FieldDescriptorProto_Label = 3 +) + +var FieldDescriptorProto_Label_name = map[int32]string{ + 1: "LABEL_OPTIONAL", + 2: "LABEL_REQUIRED", + 3: "LABEL_REPEATED", +} +var FieldDescriptorProto_Label_value = map[string]int32{ + "LABEL_OPTIONAL": 1, + "LABEL_REQUIRED": 2, + "LABEL_REPEATED": 3, +} + +func (x FieldDescriptorProto_Label) Enum() *FieldDescriptorProto_Label { + p := new(FieldDescriptorProto_Label) + *p = x + return p +} +func (x FieldDescriptorProto_Label) String() string { + return proto.EnumName(FieldDescriptorProto_Label_name, int32(x)) +} +func (x *FieldDescriptorProto_Label) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FieldDescriptorProto_Label_value, data, "FieldDescriptorProto_Label") + if err != nil { + return err + } + *x = FieldDescriptorProto_Label(value) + return nil +} +func (FieldDescriptorProto_Label) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_descriptor_4df4cb5f42392df6, []int{4, 1} +} + +// Generated classes can be optimized for speed or code size. +type FileOptions_OptimizeMode int32 + +const ( + FileOptions_SPEED FileOptions_OptimizeMode = 1 + // etc. + FileOptions_CODE_SIZE FileOptions_OptimizeMode = 2 + FileOptions_LITE_RUNTIME FileOptions_OptimizeMode = 3 +) + +var FileOptions_OptimizeMode_name = map[int32]string{ + 1: "SPEED", + 2: "CODE_SIZE", + 3: "LITE_RUNTIME", +} +var FileOptions_OptimizeMode_value = map[string]int32{ + "SPEED": 1, + "CODE_SIZE": 2, + "LITE_RUNTIME": 3, +} + +func (x FileOptions_OptimizeMode) Enum() *FileOptions_OptimizeMode { + p := new(FileOptions_OptimizeMode) + *p = x + return p +} +func (x FileOptions_OptimizeMode) String() string { + return proto.EnumName(FileOptions_OptimizeMode_name, int32(x)) +} +func (x *FileOptions_OptimizeMode) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FileOptions_OptimizeMode_value, data, "FileOptions_OptimizeMode") + if err != nil { + return err + } + *x = FileOptions_OptimizeMode(value) + return nil +} +func (FileOptions_OptimizeMode) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_descriptor_4df4cb5f42392df6, []int{10, 0} +} + +type FieldOptions_CType int32 + +const ( + // Default mode. + FieldOptions_STRING FieldOptions_CType = 0 + FieldOptions_CORD FieldOptions_CType = 1 + FieldOptions_STRING_PIECE FieldOptions_CType = 2 +) + +var FieldOptions_CType_name = map[int32]string{ + 0: "STRING", + 1: "CORD", + 2: "STRING_PIECE", +} +var FieldOptions_CType_value = map[string]int32{ + "STRING": 0, + "CORD": 1, + "STRING_PIECE": 2, +} + +func (x FieldOptions_CType) Enum() *FieldOptions_CType { + p := new(FieldOptions_CType) + *p = x + return p +} +func (x FieldOptions_CType) String() string { + return proto.EnumName(FieldOptions_CType_name, int32(x)) +} +func (x *FieldOptions_CType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FieldOptions_CType_value, data, "FieldOptions_CType") + if err != nil { + return err + } + *x = FieldOptions_CType(value) + return nil +} +func (FieldOptions_CType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_descriptor_4df4cb5f42392df6, []int{12, 0} +} + +type FieldOptions_JSType int32 + +const ( + // Use the default type. + FieldOptions_JS_NORMAL FieldOptions_JSType = 0 + // Use JavaScript strings. + FieldOptions_JS_STRING FieldOptions_JSType = 1 + // Use JavaScript numbers. + FieldOptions_JS_NUMBER FieldOptions_JSType = 2 +) + +var FieldOptions_JSType_name = map[int32]string{ + 0: "JS_NORMAL", + 1: "JS_STRING", + 2: "JS_NUMBER", +} +var FieldOptions_JSType_value = map[string]int32{ + "JS_NORMAL": 0, + "JS_STRING": 1, + "JS_NUMBER": 2, +} + +func (x FieldOptions_JSType) Enum() *FieldOptions_JSType { + p := new(FieldOptions_JSType) + *p = x + return p +} +func (x FieldOptions_JSType) String() string { + return proto.EnumName(FieldOptions_JSType_name, int32(x)) +} +func (x *FieldOptions_JSType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FieldOptions_JSType_value, data, "FieldOptions_JSType") + if err != nil { + return err + } + *x = FieldOptions_JSType(value) + return nil +} +func (FieldOptions_JSType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_descriptor_4df4cb5f42392df6, []int{12, 1} +} + +// Is this method side-effect-free (or safe in HTTP parlance), or idempotent, +// or neither? HTTP based RPC implementation may choose GET verb for safe +// methods, and PUT verb for idempotent methods instead of the default POST. +type MethodOptions_IdempotencyLevel int32 + +const ( + MethodOptions_IDEMPOTENCY_UNKNOWN MethodOptions_IdempotencyLevel = 0 + MethodOptions_NO_SIDE_EFFECTS MethodOptions_IdempotencyLevel = 1 + MethodOptions_IDEMPOTENT MethodOptions_IdempotencyLevel = 2 +) + +var MethodOptions_IdempotencyLevel_name = map[int32]string{ + 0: "IDEMPOTENCY_UNKNOWN", + 1: "NO_SIDE_EFFECTS", + 2: "IDEMPOTENT", +} +var MethodOptions_IdempotencyLevel_value = map[string]int32{ + "IDEMPOTENCY_UNKNOWN": 0, + "NO_SIDE_EFFECTS": 1, + "IDEMPOTENT": 2, +} + +func (x MethodOptions_IdempotencyLevel) Enum() *MethodOptions_IdempotencyLevel { + p := new(MethodOptions_IdempotencyLevel) + *p = x + return p +} +func (x MethodOptions_IdempotencyLevel) String() string { + return proto.EnumName(MethodOptions_IdempotencyLevel_name, int32(x)) +} +func (x *MethodOptions_IdempotencyLevel) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(MethodOptions_IdempotencyLevel_value, data, "MethodOptions_IdempotencyLevel") + if err != nil { + return err + } + *x = MethodOptions_IdempotencyLevel(value) + return nil +} +func (MethodOptions_IdempotencyLevel) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_descriptor_4df4cb5f42392df6, []int{17, 0} +} + +// The protocol compiler can output a FileDescriptorSet containing the .proto +// files it parses. +type FileDescriptorSet struct { + File []*FileDescriptorProto `protobuf:"bytes,1,rep,name=file" json:"file,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *FileDescriptorSet) Reset() { *m = FileDescriptorSet{} } +func (m *FileDescriptorSet) String() string { return proto.CompactTextString(m) } +func (*FileDescriptorSet) ProtoMessage() {} +func (*FileDescriptorSet) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_4df4cb5f42392df6, []int{0} +} +func (m *FileDescriptorSet) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_FileDescriptorSet.Unmarshal(m, b) +} +func (m *FileDescriptorSet) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_FileDescriptorSet.Marshal(b, m, deterministic) +} +func (dst *FileDescriptorSet) XXX_Merge(src proto.Message) { + xxx_messageInfo_FileDescriptorSet.Merge(dst, src) +} +func (m *FileDescriptorSet) XXX_Size() int { + return xxx_messageInfo_FileDescriptorSet.Size(m) +} +func (m *FileDescriptorSet) XXX_DiscardUnknown() { + xxx_messageInfo_FileDescriptorSet.DiscardUnknown(m) +} + +var xxx_messageInfo_FileDescriptorSet proto.InternalMessageInfo + +func (m *FileDescriptorSet) GetFile() []*FileDescriptorProto { + if m != nil { + return m.File + } + return nil +} + +// Describes a complete .proto file. +type FileDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Package *string `protobuf:"bytes,2,opt,name=package" json:"package,omitempty"` + // Names of files imported by this file. + Dependency []string `protobuf:"bytes,3,rep,name=dependency" json:"dependency,omitempty"` + // Indexes of the public imported files in the dependency list above. + PublicDependency []int32 `protobuf:"varint,10,rep,name=public_dependency,json=publicDependency" json:"public_dependency,omitempty"` + // Indexes of the weak imported files in the dependency list. + // For Google-internal migration only. Do not use. + WeakDependency []int32 `protobuf:"varint,11,rep,name=weak_dependency,json=weakDependency" json:"weak_dependency,omitempty"` + // All top-level definitions in this file. + MessageType []*DescriptorProto `protobuf:"bytes,4,rep,name=message_type,json=messageType" json:"message_type,omitempty"` + EnumType []*EnumDescriptorProto `protobuf:"bytes,5,rep,name=enum_type,json=enumType" json:"enum_type,omitempty"` + Service []*ServiceDescriptorProto `protobuf:"bytes,6,rep,name=service" json:"service,omitempty"` + Extension []*FieldDescriptorProto `protobuf:"bytes,7,rep,name=extension" json:"extension,omitempty"` + Options *FileOptions `protobuf:"bytes,8,opt,name=options" json:"options,omitempty"` + // This field contains optional information about the original source code. + // You may safely remove this entire field without harming runtime + // functionality of the descriptors -- the information is needed only by + // development tools. + SourceCodeInfo *SourceCodeInfo `protobuf:"bytes,9,opt,name=source_code_info,json=sourceCodeInfo" json:"source_code_info,omitempty"` + // The syntax of the proto file. + // The supported values are "proto2" and "proto3". + Syntax *string `protobuf:"bytes,12,opt,name=syntax" json:"syntax,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *FileDescriptorProto) Reset() { *m = FileDescriptorProto{} } +func (m *FileDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*FileDescriptorProto) ProtoMessage() {} +func (*FileDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_4df4cb5f42392df6, []int{1} +} +func (m *FileDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_FileDescriptorProto.Unmarshal(m, b) +} +func (m *FileDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_FileDescriptorProto.Marshal(b, m, deterministic) +} +func (dst *FileDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_FileDescriptorProto.Merge(dst, src) +} +func (m *FileDescriptorProto) XXX_Size() int { + return xxx_messageInfo_FileDescriptorProto.Size(m) +} +func (m *FileDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_FileDescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_FileDescriptorProto proto.InternalMessageInfo + +func (m *FileDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *FileDescriptorProto) GetPackage() string { + if m != nil && m.Package != nil { + return *m.Package + } + return "" +} + +func (m *FileDescriptorProto) GetDependency() []string { + if m != nil { + return m.Dependency + } + return nil +} + +func (m *FileDescriptorProto) GetPublicDependency() []int32 { + if m != nil { + return m.PublicDependency + } + return nil +} + +func (m *FileDescriptorProto) GetWeakDependency() []int32 { + if m != nil { + return m.WeakDependency + } + return nil +} + +func (m *FileDescriptorProto) GetMessageType() []*DescriptorProto { + if m != nil { + return m.MessageType + } + return nil +} + +func (m *FileDescriptorProto) GetEnumType() []*EnumDescriptorProto { + if m != nil { + return m.EnumType + } + return nil +} + +func (m *FileDescriptorProto) GetService() []*ServiceDescriptorProto { + if m != nil { + return m.Service + } + return nil +} + +func (m *FileDescriptorProto) GetExtension() []*FieldDescriptorProto { + if m != nil { + return m.Extension + } + return nil +} + +func (m *FileDescriptorProto) GetOptions() *FileOptions { + if m != nil { + return m.Options + } + return nil +} + +func (m *FileDescriptorProto) GetSourceCodeInfo() *SourceCodeInfo { + if m != nil { + return m.SourceCodeInfo + } + return nil +} + +func (m *FileDescriptorProto) GetSyntax() string { + if m != nil && m.Syntax != nil { + return *m.Syntax + } + return "" +} + +// Describes a message type. +type DescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Field []*FieldDescriptorProto `protobuf:"bytes,2,rep,name=field" json:"field,omitempty"` + Extension []*FieldDescriptorProto `protobuf:"bytes,6,rep,name=extension" json:"extension,omitempty"` + NestedType []*DescriptorProto `protobuf:"bytes,3,rep,name=nested_type,json=nestedType" json:"nested_type,omitempty"` + EnumType []*EnumDescriptorProto `protobuf:"bytes,4,rep,name=enum_type,json=enumType" json:"enum_type,omitempty"` + ExtensionRange []*DescriptorProto_ExtensionRange `protobuf:"bytes,5,rep,name=extension_range,json=extensionRange" json:"extension_range,omitempty"` + OneofDecl []*OneofDescriptorProto `protobuf:"bytes,8,rep,name=oneof_decl,json=oneofDecl" json:"oneof_decl,omitempty"` + Options *MessageOptions `protobuf:"bytes,7,opt,name=options" json:"options,omitempty"` + ReservedRange []*DescriptorProto_ReservedRange `protobuf:"bytes,9,rep,name=reserved_range,json=reservedRange" json:"reserved_range,omitempty"` + // Reserved field names, which may not be used by fields in the same message. + // A given name may only be reserved once. + ReservedName []string `protobuf:"bytes,10,rep,name=reserved_name,json=reservedName" json:"reserved_name,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DescriptorProto) Reset() { *m = DescriptorProto{} } +func (m *DescriptorProto) String() string { return proto.CompactTextString(m) } +func (*DescriptorProto) ProtoMessage() {} +func (*DescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_4df4cb5f42392df6, []int{2} +} +func (m *DescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DescriptorProto.Unmarshal(m, b) +} +func (m *DescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DescriptorProto.Marshal(b, m, deterministic) +} +func (dst *DescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_DescriptorProto.Merge(dst, src) +} +func (m *DescriptorProto) XXX_Size() int { + return xxx_messageInfo_DescriptorProto.Size(m) +} +func (m *DescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_DescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_DescriptorProto proto.InternalMessageInfo + +func (m *DescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *DescriptorProto) GetField() []*FieldDescriptorProto { + if m != nil { + return m.Field + } + return nil +} + +func (m *DescriptorProto) GetExtension() []*FieldDescriptorProto { + if m != nil { + return m.Extension + } + return nil +} + +func (m *DescriptorProto) GetNestedType() []*DescriptorProto { + if m != nil { + return m.NestedType + } + return nil +} + +func (m *DescriptorProto) GetEnumType() []*EnumDescriptorProto { + if m != nil { + return m.EnumType + } + return nil +} + +func (m *DescriptorProto) GetExtensionRange() []*DescriptorProto_ExtensionRange { + if m != nil { + return m.ExtensionRange + } + return nil +} + +func (m *DescriptorProto) GetOneofDecl() []*OneofDescriptorProto { + if m != nil { + return m.OneofDecl + } + return nil +} + +func (m *DescriptorProto) GetOptions() *MessageOptions { + if m != nil { + return m.Options + } + return nil +} + +func (m *DescriptorProto) GetReservedRange() []*DescriptorProto_ReservedRange { + if m != nil { + return m.ReservedRange + } + return nil +} + +func (m *DescriptorProto) GetReservedName() []string { + if m != nil { + return m.ReservedName + } + return nil +} + +type DescriptorProto_ExtensionRange struct { + Start *int32 `protobuf:"varint,1,opt,name=start" json:"start,omitempty"` + End *int32 `protobuf:"varint,2,opt,name=end" json:"end,omitempty"` + Options *ExtensionRangeOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DescriptorProto_ExtensionRange) Reset() { *m = DescriptorProto_ExtensionRange{} } +func (m *DescriptorProto_ExtensionRange) String() string { return proto.CompactTextString(m) } +func (*DescriptorProto_ExtensionRange) ProtoMessage() {} +func (*DescriptorProto_ExtensionRange) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_4df4cb5f42392df6, []int{2, 0} +} +func (m *DescriptorProto_ExtensionRange) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DescriptorProto_ExtensionRange.Unmarshal(m, b) +} +func (m *DescriptorProto_ExtensionRange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DescriptorProto_ExtensionRange.Marshal(b, m, deterministic) +} +func (dst *DescriptorProto_ExtensionRange) XXX_Merge(src proto.Message) { + xxx_messageInfo_DescriptorProto_ExtensionRange.Merge(dst, src) +} +func (m *DescriptorProto_ExtensionRange) XXX_Size() int { + return xxx_messageInfo_DescriptorProto_ExtensionRange.Size(m) +} +func (m *DescriptorProto_ExtensionRange) XXX_DiscardUnknown() { + xxx_messageInfo_DescriptorProto_ExtensionRange.DiscardUnknown(m) +} + +var xxx_messageInfo_DescriptorProto_ExtensionRange proto.InternalMessageInfo + +func (m *DescriptorProto_ExtensionRange) GetStart() int32 { + if m != nil && m.Start != nil { + return *m.Start + } + return 0 +} + +func (m *DescriptorProto_ExtensionRange) GetEnd() int32 { + if m != nil && m.End != nil { + return *m.End + } + return 0 +} + +func (m *DescriptorProto_ExtensionRange) GetOptions() *ExtensionRangeOptions { + if m != nil { + return m.Options + } + return nil +} + +// Range of reserved tag numbers. Reserved tag numbers may not be used by +// fields or extension ranges in the same message. Reserved ranges may +// not overlap. +type DescriptorProto_ReservedRange struct { + Start *int32 `protobuf:"varint,1,opt,name=start" json:"start,omitempty"` + End *int32 `protobuf:"varint,2,opt,name=end" json:"end,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DescriptorProto_ReservedRange) Reset() { *m = DescriptorProto_ReservedRange{} } +func (m *DescriptorProto_ReservedRange) String() string { return proto.CompactTextString(m) } +func (*DescriptorProto_ReservedRange) ProtoMessage() {} +func (*DescriptorProto_ReservedRange) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_4df4cb5f42392df6, []int{2, 1} +} +func (m *DescriptorProto_ReservedRange) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DescriptorProto_ReservedRange.Unmarshal(m, b) +} +func (m *DescriptorProto_ReservedRange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DescriptorProto_ReservedRange.Marshal(b, m, deterministic) +} +func (dst *DescriptorProto_ReservedRange) XXX_Merge(src proto.Message) { + xxx_messageInfo_DescriptorProto_ReservedRange.Merge(dst, src) +} +func (m *DescriptorProto_ReservedRange) XXX_Size() int { + return xxx_messageInfo_DescriptorProto_ReservedRange.Size(m) +} +func (m *DescriptorProto_ReservedRange) XXX_DiscardUnknown() { + xxx_messageInfo_DescriptorProto_ReservedRange.DiscardUnknown(m) +} + +var xxx_messageInfo_DescriptorProto_ReservedRange proto.InternalMessageInfo + +func (m *DescriptorProto_ReservedRange) GetStart() int32 { + if m != nil && m.Start != nil { + return *m.Start + } + return 0 +} + +func (m *DescriptorProto_ReservedRange) GetEnd() int32 { + if m != nil && m.End != nil { + return *m.End + } + return 0 +} + +type ExtensionRangeOptions struct { + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ExtensionRangeOptions) Reset() { *m = ExtensionRangeOptions{} } +func (m *ExtensionRangeOptions) String() string { return proto.CompactTextString(m) } +func (*ExtensionRangeOptions) ProtoMessage() {} +func (*ExtensionRangeOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_4df4cb5f42392df6, []int{3} +} + +var extRange_ExtensionRangeOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*ExtensionRangeOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_ExtensionRangeOptions +} +func (m *ExtensionRangeOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ExtensionRangeOptions.Unmarshal(m, b) +} +func (m *ExtensionRangeOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ExtensionRangeOptions.Marshal(b, m, deterministic) +} +func (dst *ExtensionRangeOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_ExtensionRangeOptions.Merge(dst, src) +} +func (m *ExtensionRangeOptions) XXX_Size() int { + return xxx_messageInfo_ExtensionRangeOptions.Size(m) +} +func (m *ExtensionRangeOptions) XXX_DiscardUnknown() { + xxx_messageInfo_ExtensionRangeOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_ExtensionRangeOptions proto.InternalMessageInfo + +func (m *ExtensionRangeOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +// Describes a field within a message. +type FieldDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Number *int32 `protobuf:"varint,3,opt,name=number" json:"number,omitempty"` + Label *FieldDescriptorProto_Label `protobuf:"varint,4,opt,name=label,enum=google.protobuf.FieldDescriptorProto_Label" json:"label,omitempty"` + // If type_name is set, this need not be set. If both this and type_name + // are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP. + Type *FieldDescriptorProto_Type `protobuf:"varint,5,opt,name=type,enum=google.protobuf.FieldDescriptorProto_Type" json:"type,omitempty"` + // For message and enum types, this is the name of the type. If the name + // starts with a '.', it is fully-qualified. Otherwise, C++-like scoping + // rules are used to find the type (i.e. first the nested types within this + // message are searched, then within the parent, on up to the root + // namespace). + TypeName *string `protobuf:"bytes,6,opt,name=type_name,json=typeName" json:"type_name,omitempty"` + // For extensions, this is the name of the type being extended. It is + // resolved in the same manner as type_name. + Extendee *string `protobuf:"bytes,2,opt,name=extendee" json:"extendee,omitempty"` + // For numeric types, contains the original text representation of the value. + // For booleans, "true" or "false". + // For strings, contains the default text contents (not escaped in any way). + // For bytes, contains the C escaped value. All bytes >= 128 are escaped. + // TODO(kenton): Base-64 encode? + DefaultValue *string `protobuf:"bytes,7,opt,name=default_value,json=defaultValue" json:"default_value,omitempty"` + // If set, gives the index of a oneof in the containing type's oneof_decl + // list. This field is a member of that oneof. + OneofIndex *int32 `protobuf:"varint,9,opt,name=oneof_index,json=oneofIndex" json:"oneof_index,omitempty"` + // JSON name of this field. The value is set by protocol compiler. If the + // user has set a "json_name" option on this field, that option's value + // will be used. Otherwise, it's deduced from the field's name by converting + // it to camelCase. + JsonName *string `protobuf:"bytes,10,opt,name=json_name,json=jsonName" json:"json_name,omitempty"` + Options *FieldOptions `protobuf:"bytes,8,opt,name=options" json:"options,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *FieldDescriptorProto) Reset() { *m = FieldDescriptorProto{} } +func (m *FieldDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*FieldDescriptorProto) ProtoMessage() {} +func (*FieldDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_4df4cb5f42392df6, []int{4} +} +func (m *FieldDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_FieldDescriptorProto.Unmarshal(m, b) +} +func (m *FieldDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_FieldDescriptorProto.Marshal(b, m, deterministic) +} +func (dst *FieldDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_FieldDescriptorProto.Merge(dst, src) +} +func (m *FieldDescriptorProto) XXX_Size() int { + return xxx_messageInfo_FieldDescriptorProto.Size(m) +} +func (m *FieldDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_FieldDescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_FieldDescriptorProto proto.InternalMessageInfo + +func (m *FieldDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *FieldDescriptorProto) GetNumber() int32 { + if m != nil && m.Number != nil { + return *m.Number + } + return 0 +} + +func (m *FieldDescriptorProto) GetLabel() FieldDescriptorProto_Label { + if m != nil && m.Label != nil { + return *m.Label + } + return FieldDescriptorProto_LABEL_OPTIONAL +} + +func (m *FieldDescriptorProto) GetType() FieldDescriptorProto_Type { + if m != nil && m.Type != nil { + return *m.Type + } + return FieldDescriptorProto_TYPE_DOUBLE +} + +func (m *FieldDescriptorProto) GetTypeName() string { + if m != nil && m.TypeName != nil { + return *m.TypeName + } + return "" +} + +func (m *FieldDescriptorProto) GetExtendee() string { + if m != nil && m.Extendee != nil { + return *m.Extendee + } + return "" +} + +func (m *FieldDescriptorProto) GetDefaultValue() string { + if m != nil && m.DefaultValue != nil { + return *m.DefaultValue + } + return "" +} + +func (m *FieldDescriptorProto) GetOneofIndex() int32 { + if m != nil && m.OneofIndex != nil { + return *m.OneofIndex + } + return 0 +} + +func (m *FieldDescriptorProto) GetJsonName() string { + if m != nil && m.JsonName != nil { + return *m.JsonName + } + return "" +} + +func (m *FieldDescriptorProto) GetOptions() *FieldOptions { + if m != nil { + return m.Options + } + return nil +} + +// Describes a oneof. +type OneofDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Options *OneofOptions `protobuf:"bytes,2,opt,name=options" json:"options,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *OneofDescriptorProto) Reset() { *m = OneofDescriptorProto{} } +func (m *OneofDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*OneofDescriptorProto) ProtoMessage() {} +func (*OneofDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_4df4cb5f42392df6, []int{5} +} +func (m *OneofDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_OneofDescriptorProto.Unmarshal(m, b) +} +func (m *OneofDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_OneofDescriptorProto.Marshal(b, m, deterministic) +} +func (dst *OneofDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_OneofDescriptorProto.Merge(dst, src) +} +func (m *OneofDescriptorProto) XXX_Size() int { + return xxx_messageInfo_OneofDescriptorProto.Size(m) +} +func (m *OneofDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_OneofDescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_OneofDescriptorProto proto.InternalMessageInfo + +func (m *OneofDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *OneofDescriptorProto) GetOptions() *OneofOptions { + if m != nil { + return m.Options + } + return nil +} + +// Describes an enum type. +type EnumDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Value []*EnumValueDescriptorProto `protobuf:"bytes,2,rep,name=value" json:"value,omitempty"` + Options *EnumOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` + // Range of reserved numeric values. Reserved numeric values may not be used + // by enum values in the same enum declaration. Reserved ranges may not + // overlap. + ReservedRange []*EnumDescriptorProto_EnumReservedRange `protobuf:"bytes,4,rep,name=reserved_range,json=reservedRange" json:"reserved_range,omitempty"` + // Reserved enum value names, which may not be reused. A given name may only + // be reserved once. + ReservedName []string `protobuf:"bytes,5,rep,name=reserved_name,json=reservedName" json:"reserved_name,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EnumDescriptorProto) Reset() { *m = EnumDescriptorProto{} } +func (m *EnumDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*EnumDescriptorProto) ProtoMessage() {} +func (*EnumDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_4df4cb5f42392df6, []int{6} +} +func (m *EnumDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EnumDescriptorProto.Unmarshal(m, b) +} +func (m *EnumDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EnumDescriptorProto.Marshal(b, m, deterministic) +} +func (dst *EnumDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_EnumDescriptorProto.Merge(dst, src) +} +func (m *EnumDescriptorProto) XXX_Size() int { + return xxx_messageInfo_EnumDescriptorProto.Size(m) +} +func (m *EnumDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_EnumDescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_EnumDescriptorProto proto.InternalMessageInfo + +func (m *EnumDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *EnumDescriptorProto) GetValue() []*EnumValueDescriptorProto { + if m != nil { + return m.Value + } + return nil +} + +func (m *EnumDescriptorProto) GetOptions() *EnumOptions { + if m != nil { + return m.Options + } + return nil +} + +func (m *EnumDescriptorProto) GetReservedRange() []*EnumDescriptorProto_EnumReservedRange { + if m != nil { + return m.ReservedRange + } + return nil +} + +func (m *EnumDescriptorProto) GetReservedName() []string { + if m != nil { + return m.ReservedName + } + return nil +} + +// Range of reserved numeric values. Reserved values may not be used by +// entries in the same enum. Reserved ranges may not overlap. +// +// Note that this is distinct from DescriptorProto.ReservedRange in that it +// is inclusive such that it can appropriately represent the entire int32 +// domain. +type EnumDescriptorProto_EnumReservedRange struct { + Start *int32 `protobuf:"varint,1,opt,name=start" json:"start,omitempty"` + End *int32 `protobuf:"varint,2,opt,name=end" json:"end,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EnumDescriptorProto_EnumReservedRange) Reset() { *m = EnumDescriptorProto_EnumReservedRange{} } +func (m *EnumDescriptorProto_EnumReservedRange) String() string { return proto.CompactTextString(m) } +func (*EnumDescriptorProto_EnumReservedRange) ProtoMessage() {} +func (*EnumDescriptorProto_EnumReservedRange) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_4df4cb5f42392df6, []int{6, 0} +} +func (m *EnumDescriptorProto_EnumReservedRange) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EnumDescriptorProto_EnumReservedRange.Unmarshal(m, b) +} +func (m *EnumDescriptorProto_EnumReservedRange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EnumDescriptorProto_EnumReservedRange.Marshal(b, m, deterministic) +} +func (dst *EnumDescriptorProto_EnumReservedRange) XXX_Merge(src proto.Message) { + xxx_messageInfo_EnumDescriptorProto_EnumReservedRange.Merge(dst, src) +} +func (m *EnumDescriptorProto_EnumReservedRange) XXX_Size() int { + return xxx_messageInfo_EnumDescriptorProto_EnumReservedRange.Size(m) +} +func (m *EnumDescriptorProto_EnumReservedRange) XXX_DiscardUnknown() { + xxx_messageInfo_EnumDescriptorProto_EnumReservedRange.DiscardUnknown(m) +} + +var xxx_messageInfo_EnumDescriptorProto_EnumReservedRange proto.InternalMessageInfo + +func (m *EnumDescriptorProto_EnumReservedRange) GetStart() int32 { + if m != nil && m.Start != nil { + return *m.Start + } + return 0 +} + +func (m *EnumDescriptorProto_EnumReservedRange) GetEnd() int32 { + if m != nil && m.End != nil { + return *m.End + } + return 0 +} + +// Describes a value within an enum. +type EnumValueDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Number *int32 `protobuf:"varint,2,opt,name=number" json:"number,omitempty"` + Options *EnumValueOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EnumValueDescriptorProto) Reset() { *m = EnumValueDescriptorProto{} } +func (m *EnumValueDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*EnumValueDescriptorProto) ProtoMessage() {} +func (*EnumValueDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_4df4cb5f42392df6, []int{7} +} +func (m *EnumValueDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EnumValueDescriptorProto.Unmarshal(m, b) +} +func (m *EnumValueDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EnumValueDescriptorProto.Marshal(b, m, deterministic) +} +func (dst *EnumValueDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_EnumValueDescriptorProto.Merge(dst, src) +} +func (m *EnumValueDescriptorProto) XXX_Size() int { + return xxx_messageInfo_EnumValueDescriptorProto.Size(m) +} +func (m *EnumValueDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_EnumValueDescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_EnumValueDescriptorProto proto.InternalMessageInfo + +func (m *EnumValueDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *EnumValueDescriptorProto) GetNumber() int32 { + if m != nil && m.Number != nil { + return *m.Number + } + return 0 +} + +func (m *EnumValueDescriptorProto) GetOptions() *EnumValueOptions { + if m != nil { + return m.Options + } + return nil +} + +// Describes a service. +type ServiceDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Method []*MethodDescriptorProto `protobuf:"bytes,2,rep,name=method" json:"method,omitempty"` + Options *ServiceOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ServiceDescriptorProto) Reset() { *m = ServiceDescriptorProto{} } +func (m *ServiceDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*ServiceDescriptorProto) ProtoMessage() {} +func (*ServiceDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_4df4cb5f42392df6, []int{8} +} +func (m *ServiceDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ServiceDescriptorProto.Unmarshal(m, b) +} +func (m *ServiceDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ServiceDescriptorProto.Marshal(b, m, deterministic) +} +func (dst *ServiceDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_ServiceDescriptorProto.Merge(dst, src) +} +func (m *ServiceDescriptorProto) XXX_Size() int { + return xxx_messageInfo_ServiceDescriptorProto.Size(m) +} +func (m *ServiceDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_ServiceDescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_ServiceDescriptorProto proto.InternalMessageInfo + +func (m *ServiceDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *ServiceDescriptorProto) GetMethod() []*MethodDescriptorProto { + if m != nil { + return m.Method + } + return nil +} + +func (m *ServiceDescriptorProto) GetOptions() *ServiceOptions { + if m != nil { + return m.Options + } + return nil +} + +// Describes a method of a service. +type MethodDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + // Input and output type names. These are resolved in the same way as + // FieldDescriptorProto.type_name, but must refer to a message type. + InputType *string `protobuf:"bytes,2,opt,name=input_type,json=inputType" json:"input_type,omitempty"` + OutputType *string `protobuf:"bytes,3,opt,name=output_type,json=outputType" json:"output_type,omitempty"` + Options *MethodOptions `protobuf:"bytes,4,opt,name=options" json:"options,omitempty"` + // Identifies if client streams multiple client messages + ClientStreaming *bool `protobuf:"varint,5,opt,name=client_streaming,json=clientStreaming,def=0" json:"client_streaming,omitempty"` + // Identifies if server streams multiple server messages + ServerStreaming *bool `protobuf:"varint,6,opt,name=server_streaming,json=serverStreaming,def=0" json:"server_streaming,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MethodDescriptorProto) Reset() { *m = MethodDescriptorProto{} } +func (m *MethodDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*MethodDescriptorProto) ProtoMessage() {} +func (*MethodDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_4df4cb5f42392df6, []int{9} +} +func (m *MethodDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MethodDescriptorProto.Unmarshal(m, b) +} +func (m *MethodDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MethodDescriptorProto.Marshal(b, m, deterministic) +} +func (dst *MethodDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_MethodDescriptorProto.Merge(dst, src) +} +func (m *MethodDescriptorProto) XXX_Size() int { + return xxx_messageInfo_MethodDescriptorProto.Size(m) +} +func (m *MethodDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_MethodDescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_MethodDescriptorProto proto.InternalMessageInfo + +const Default_MethodDescriptorProto_ClientStreaming bool = false +const Default_MethodDescriptorProto_ServerStreaming bool = false + +func (m *MethodDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *MethodDescriptorProto) GetInputType() string { + if m != nil && m.InputType != nil { + return *m.InputType + } + return "" +} + +func (m *MethodDescriptorProto) GetOutputType() string { + if m != nil && m.OutputType != nil { + return *m.OutputType + } + return "" +} + +func (m *MethodDescriptorProto) GetOptions() *MethodOptions { + if m != nil { + return m.Options + } + return nil +} + +func (m *MethodDescriptorProto) GetClientStreaming() bool { + if m != nil && m.ClientStreaming != nil { + return *m.ClientStreaming + } + return Default_MethodDescriptorProto_ClientStreaming +} + +func (m *MethodDescriptorProto) GetServerStreaming() bool { + if m != nil && m.ServerStreaming != nil { + return *m.ServerStreaming + } + return Default_MethodDescriptorProto_ServerStreaming +} + +type FileOptions struct { + // Sets the Java package where classes generated from this .proto will be + // placed. By default, the proto package is used, but this is often + // inappropriate because proto packages do not normally start with backwards + // domain names. + JavaPackage *string `protobuf:"bytes,1,opt,name=java_package,json=javaPackage" json:"java_package,omitempty"` + // If set, all the classes from the .proto file are wrapped in a single + // outer class with the given name. This applies to both Proto1 + // (equivalent to the old "--one_java_file" option) and Proto2 (where + // a .proto always translates to a single class, but you may want to + // explicitly choose the class name). + JavaOuterClassname *string `protobuf:"bytes,8,opt,name=java_outer_classname,json=javaOuterClassname" json:"java_outer_classname,omitempty"` + // If set true, then the Java code generator will generate a separate .java + // file for each top-level message, enum, and service defined in the .proto + // file. Thus, these types will *not* be nested inside the outer class + // named by java_outer_classname. However, the outer class will still be + // generated to contain the file's getDescriptor() method as well as any + // top-level extensions defined in the file. + JavaMultipleFiles *bool `protobuf:"varint,10,opt,name=java_multiple_files,json=javaMultipleFiles,def=0" json:"java_multiple_files,omitempty"` + // This option does nothing. + JavaGenerateEqualsAndHash *bool `protobuf:"varint,20,opt,name=java_generate_equals_and_hash,json=javaGenerateEqualsAndHash" json:"java_generate_equals_and_hash,omitempty"` // Deprecated: Do not use. + // If set true, then the Java2 code generator will generate code that + // throws an exception whenever an attempt is made to assign a non-UTF-8 + // byte sequence to a string field. + // Message reflection will do the same. + // However, an extension field still accepts non-UTF-8 byte sequences. + // This option has no effect on when used with the lite runtime. + JavaStringCheckUtf8 *bool `protobuf:"varint,27,opt,name=java_string_check_utf8,json=javaStringCheckUtf8,def=0" json:"java_string_check_utf8,omitempty"` + OptimizeFor *FileOptions_OptimizeMode `protobuf:"varint,9,opt,name=optimize_for,json=optimizeFor,enum=google.protobuf.FileOptions_OptimizeMode,def=1" json:"optimize_for,omitempty"` + // Sets the Go package where structs generated from this .proto will be + // placed. If omitted, the Go package will be derived from the following: + // - The basename of the package import path, if provided. + // - Otherwise, the package statement in the .proto file, if present. + // - Otherwise, the basename of the .proto file, without extension. + GoPackage *string `protobuf:"bytes,11,opt,name=go_package,json=goPackage" json:"go_package,omitempty"` + // Should generic services be generated in each language? "Generic" services + // are not specific to any particular RPC system. They are generated by the + // main code generators in each language (without additional plugins). + // Generic services were the only kind of service generation supported by + // early versions of google.protobuf. + // + // Generic services are now considered deprecated in favor of using plugins + // that generate code specific to your particular RPC system. Therefore, + // these default to false. Old code which depends on generic services should + // explicitly set them to true. + CcGenericServices *bool `protobuf:"varint,16,opt,name=cc_generic_services,json=ccGenericServices,def=0" json:"cc_generic_services,omitempty"` + JavaGenericServices *bool `protobuf:"varint,17,opt,name=java_generic_services,json=javaGenericServices,def=0" json:"java_generic_services,omitempty"` + PyGenericServices *bool `protobuf:"varint,18,opt,name=py_generic_services,json=pyGenericServices,def=0" json:"py_generic_services,omitempty"` + PhpGenericServices *bool `protobuf:"varint,42,opt,name=php_generic_services,json=phpGenericServices,def=0" json:"php_generic_services,omitempty"` + // Is this file deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for everything in the file, or it will be completely ignored; in the very + // least, this is a formalization for deprecating files. + Deprecated *bool `protobuf:"varint,23,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // Enables the use of arenas for the proto messages in this file. This applies + // only to generated classes for C++. + CcEnableArenas *bool `protobuf:"varint,31,opt,name=cc_enable_arenas,json=ccEnableArenas,def=0" json:"cc_enable_arenas,omitempty"` + // Sets the objective c class prefix which is prepended to all objective c + // generated classes from this .proto. There is no default. + ObjcClassPrefix *string `protobuf:"bytes,36,opt,name=objc_class_prefix,json=objcClassPrefix" json:"objc_class_prefix,omitempty"` + // Namespace for generated classes; defaults to the package. + CsharpNamespace *string `protobuf:"bytes,37,opt,name=csharp_namespace,json=csharpNamespace" json:"csharp_namespace,omitempty"` + // By default Swift generators will take the proto package and CamelCase it + // replacing '.' with underscore and use that to prefix the types/symbols + // defined. When this options is provided, they will use this value instead + // to prefix the types/symbols defined. + SwiftPrefix *string `protobuf:"bytes,39,opt,name=swift_prefix,json=swiftPrefix" json:"swift_prefix,omitempty"` + // Sets the php class prefix which is prepended to all php generated classes + // from this .proto. Default is empty. + PhpClassPrefix *string `protobuf:"bytes,40,opt,name=php_class_prefix,json=phpClassPrefix" json:"php_class_prefix,omitempty"` + // Use this option to change the namespace of php generated classes. Default + // is empty. When this option is empty, the package name will be used for + // determining the namespace. + PhpNamespace *string `protobuf:"bytes,41,opt,name=php_namespace,json=phpNamespace" json:"php_namespace,omitempty"` + // The parser stores options it doesn't recognize here. + // See the documentation for the "Options" section above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *FileOptions) Reset() { *m = FileOptions{} } +func (m *FileOptions) String() string { return proto.CompactTextString(m) } +func (*FileOptions) ProtoMessage() {} +func (*FileOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_4df4cb5f42392df6, []int{10} +} + +var extRange_FileOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*FileOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_FileOptions +} +func (m *FileOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_FileOptions.Unmarshal(m, b) +} +func (m *FileOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_FileOptions.Marshal(b, m, deterministic) +} +func (dst *FileOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_FileOptions.Merge(dst, src) +} +func (m *FileOptions) XXX_Size() int { + return xxx_messageInfo_FileOptions.Size(m) +} +func (m *FileOptions) XXX_DiscardUnknown() { + xxx_messageInfo_FileOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_FileOptions proto.InternalMessageInfo + +const Default_FileOptions_JavaMultipleFiles bool = false +const Default_FileOptions_JavaStringCheckUtf8 bool = false +const Default_FileOptions_OptimizeFor FileOptions_OptimizeMode = FileOptions_SPEED +const Default_FileOptions_CcGenericServices bool = false +const Default_FileOptions_JavaGenericServices bool = false +const Default_FileOptions_PyGenericServices bool = false +const Default_FileOptions_PhpGenericServices bool = false +const Default_FileOptions_Deprecated bool = false +const Default_FileOptions_CcEnableArenas bool = false + +func (m *FileOptions) GetJavaPackage() string { + if m != nil && m.JavaPackage != nil { + return *m.JavaPackage + } + return "" +} + +func (m *FileOptions) GetJavaOuterClassname() string { + if m != nil && m.JavaOuterClassname != nil { + return *m.JavaOuterClassname + } + return "" +} + +func (m *FileOptions) GetJavaMultipleFiles() bool { + if m != nil && m.JavaMultipleFiles != nil { + return *m.JavaMultipleFiles + } + return Default_FileOptions_JavaMultipleFiles +} + +// Deprecated: Do not use. +func (m *FileOptions) GetJavaGenerateEqualsAndHash() bool { + if m != nil && m.JavaGenerateEqualsAndHash != nil { + return *m.JavaGenerateEqualsAndHash + } + return false +} + +func (m *FileOptions) GetJavaStringCheckUtf8() bool { + if m != nil && m.JavaStringCheckUtf8 != nil { + return *m.JavaStringCheckUtf8 + } + return Default_FileOptions_JavaStringCheckUtf8 +} + +func (m *FileOptions) GetOptimizeFor() FileOptions_OptimizeMode { + if m != nil && m.OptimizeFor != nil { + return *m.OptimizeFor + } + return Default_FileOptions_OptimizeFor +} + +func (m *FileOptions) GetGoPackage() string { + if m != nil && m.GoPackage != nil { + return *m.GoPackage + } + return "" +} + +func (m *FileOptions) GetCcGenericServices() bool { + if m != nil && m.CcGenericServices != nil { + return *m.CcGenericServices + } + return Default_FileOptions_CcGenericServices +} + +func (m *FileOptions) GetJavaGenericServices() bool { + if m != nil && m.JavaGenericServices != nil { + return *m.JavaGenericServices + } + return Default_FileOptions_JavaGenericServices +} + +func (m *FileOptions) GetPyGenericServices() bool { + if m != nil && m.PyGenericServices != nil { + return *m.PyGenericServices + } + return Default_FileOptions_PyGenericServices +} + +func (m *FileOptions) GetPhpGenericServices() bool { + if m != nil && m.PhpGenericServices != nil { + return *m.PhpGenericServices + } + return Default_FileOptions_PhpGenericServices +} + +func (m *FileOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_FileOptions_Deprecated +} + +func (m *FileOptions) GetCcEnableArenas() bool { + if m != nil && m.CcEnableArenas != nil { + return *m.CcEnableArenas + } + return Default_FileOptions_CcEnableArenas +} + +func (m *FileOptions) GetObjcClassPrefix() string { + if m != nil && m.ObjcClassPrefix != nil { + return *m.ObjcClassPrefix + } + return "" +} + +func (m *FileOptions) GetCsharpNamespace() string { + if m != nil && m.CsharpNamespace != nil { + return *m.CsharpNamespace + } + return "" +} + +func (m *FileOptions) GetSwiftPrefix() string { + if m != nil && m.SwiftPrefix != nil { + return *m.SwiftPrefix + } + return "" +} + +func (m *FileOptions) GetPhpClassPrefix() string { + if m != nil && m.PhpClassPrefix != nil { + return *m.PhpClassPrefix + } + return "" +} + +func (m *FileOptions) GetPhpNamespace() string { + if m != nil && m.PhpNamespace != nil { + return *m.PhpNamespace + } + return "" +} + +func (m *FileOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type MessageOptions struct { + // Set true to use the old proto1 MessageSet wire format for extensions. + // This is provided for backwards-compatibility with the MessageSet wire + // format. You should not use this for any other reason: It's less + // efficient, has fewer features, and is more complicated. + // + // The message must be defined exactly as follows: + // message Foo { + // option message_set_wire_format = true; + // extensions 4 to max; + // } + // Note that the message cannot have any defined fields; MessageSets only + // have extensions. + // + // All extensions of your type must be singular messages; e.g. they cannot + // be int32s, enums, or repeated messages. + // + // Because this is an option, the above two restrictions are not enforced by + // the protocol compiler. + MessageSetWireFormat *bool `protobuf:"varint,1,opt,name=message_set_wire_format,json=messageSetWireFormat,def=0" json:"message_set_wire_format,omitempty"` + // Disables the generation of the standard "descriptor()" accessor, which can + // conflict with a field of the same name. This is meant to make migration + // from proto1 easier; new code should avoid fields named "descriptor". + NoStandardDescriptorAccessor *bool `protobuf:"varint,2,opt,name=no_standard_descriptor_accessor,json=noStandardDescriptorAccessor,def=0" json:"no_standard_descriptor_accessor,omitempty"` + // Is this message deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the message, or it will be completely ignored; in the very least, + // this is a formalization for deprecating messages. + Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // Whether the message is an automatically generated map entry type for the + // maps field. + // + // For maps fields: + // map map_field = 1; + // The parsed descriptor looks like: + // message MapFieldEntry { + // option map_entry = true; + // optional KeyType key = 1; + // optional ValueType value = 2; + // } + // repeated MapFieldEntry map_field = 1; + // + // Implementations may choose not to generate the map_entry=true message, but + // use a native map in the target language to hold the keys and values. + // The reflection APIs in such implementions still need to work as + // if the field is a repeated message field. + // + // NOTE: Do not set the option in .proto files. Always use the maps syntax + // instead. The option should only be implicitly set by the proto compiler + // parser. + MapEntry *bool `protobuf:"varint,7,opt,name=map_entry,json=mapEntry" json:"map_entry,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MessageOptions) Reset() { *m = MessageOptions{} } +func (m *MessageOptions) String() string { return proto.CompactTextString(m) } +func (*MessageOptions) ProtoMessage() {} +func (*MessageOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_4df4cb5f42392df6, []int{11} +} + +var extRange_MessageOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*MessageOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_MessageOptions +} +func (m *MessageOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MessageOptions.Unmarshal(m, b) +} +func (m *MessageOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MessageOptions.Marshal(b, m, deterministic) +} +func (dst *MessageOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_MessageOptions.Merge(dst, src) +} +func (m *MessageOptions) XXX_Size() int { + return xxx_messageInfo_MessageOptions.Size(m) +} +func (m *MessageOptions) XXX_DiscardUnknown() { + xxx_messageInfo_MessageOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_MessageOptions proto.InternalMessageInfo + +const Default_MessageOptions_MessageSetWireFormat bool = false +const Default_MessageOptions_NoStandardDescriptorAccessor bool = false +const Default_MessageOptions_Deprecated bool = false + +func (m *MessageOptions) GetMessageSetWireFormat() bool { + if m != nil && m.MessageSetWireFormat != nil { + return *m.MessageSetWireFormat + } + return Default_MessageOptions_MessageSetWireFormat +} + +func (m *MessageOptions) GetNoStandardDescriptorAccessor() bool { + if m != nil && m.NoStandardDescriptorAccessor != nil { + return *m.NoStandardDescriptorAccessor + } + return Default_MessageOptions_NoStandardDescriptorAccessor +} + +func (m *MessageOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_MessageOptions_Deprecated +} + +func (m *MessageOptions) GetMapEntry() bool { + if m != nil && m.MapEntry != nil { + return *m.MapEntry + } + return false +} + +func (m *MessageOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type FieldOptions struct { + // The ctype option instructs the C++ code generator to use a different + // representation of the field than it normally would. See the specific + // options below. This option is not yet implemented in the open source + // release -- sorry, we'll try to include it in a future version! + Ctype *FieldOptions_CType `protobuf:"varint,1,opt,name=ctype,enum=google.protobuf.FieldOptions_CType,def=0" json:"ctype,omitempty"` + // The packed option can be enabled for repeated primitive fields to enable + // a more efficient representation on the wire. Rather than repeatedly + // writing the tag and type for each element, the entire array is encoded as + // a single length-delimited blob. In proto3, only explicit setting it to + // false will avoid using packed encoding. + Packed *bool `protobuf:"varint,2,opt,name=packed" json:"packed,omitempty"` + // The jstype option determines the JavaScript type used for values of the + // field. The option is permitted only for 64 bit integral and fixed types + // (int64, uint64, sint64, fixed64, sfixed64). A field with jstype JS_STRING + // is represented as JavaScript string, which avoids loss of precision that + // can happen when a large value is converted to a floating point JavaScript. + // Specifying JS_NUMBER for the jstype causes the generated JavaScript code to + // use the JavaScript "number" type. The behavior of the default option + // JS_NORMAL is implementation dependent. + // + // This option is an enum to permit additional types to be added, e.g. + // goog.math.Integer. + Jstype *FieldOptions_JSType `protobuf:"varint,6,opt,name=jstype,enum=google.protobuf.FieldOptions_JSType,def=0" json:"jstype,omitempty"` + // Should this field be parsed lazily? Lazy applies only to message-type + // fields. It means that when the outer message is initially parsed, the + // inner message's contents will not be parsed but instead stored in encoded + // form. The inner message will actually be parsed when it is first accessed. + // + // This is only a hint. Implementations are free to choose whether to use + // eager or lazy parsing regardless of the value of this option. However, + // setting this option true suggests that the protocol author believes that + // using lazy parsing on this field is worth the additional bookkeeping + // overhead typically needed to implement it. + // + // This option does not affect the public interface of any generated code; + // all method signatures remain the same. Furthermore, thread-safety of the + // interface is not affected by this option; const methods remain safe to + // call from multiple threads concurrently, while non-const methods continue + // to require exclusive access. + // + // + // Note that implementations may choose not to check required fields within + // a lazy sub-message. That is, calling IsInitialized() on the outer message + // may return true even if the inner message has missing required fields. + // This is necessary because otherwise the inner message would have to be + // parsed in order to perform the check, defeating the purpose of lazy + // parsing. An implementation which chooses not to check required fields + // must be consistent about it. That is, for any particular sub-message, the + // implementation must either *always* check its required fields, or *never* + // check its required fields, regardless of whether or not the message has + // been parsed. + Lazy *bool `protobuf:"varint,5,opt,name=lazy,def=0" json:"lazy,omitempty"` + // Is this field deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for accessors, or it will be completely ignored; in the very least, this + // is a formalization for deprecating fields. + Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // For Google-internal migration only. Do not use. + Weak *bool `protobuf:"varint,10,opt,name=weak,def=0" json:"weak,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *FieldOptions) Reset() { *m = FieldOptions{} } +func (m *FieldOptions) String() string { return proto.CompactTextString(m) } +func (*FieldOptions) ProtoMessage() {} +func (*FieldOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_4df4cb5f42392df6, []int{12} +} + +var extRange_FieldOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*FieldOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_FieldOptions +} +func (m *FieldOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_FieldOptions.Unmarshal(m, b) +} +func (m *FieldOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_FieldOptions.Marshal(b, m, deterministic) +} +func (dst *FieldOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_FieldOptions.Merge(dst, src) +} +func (m *FieldOptions) XXX_Size() int { + return xxx_messageInfo_FieldOptions.Size(m) +} +func (m *FieldOptions) XXX_DiscardUnknown() { + xxx_messageInfo_FieldOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_FieldOptions proto.InternalMessageInfo + +const Default_FieldOptions_Ctype FieldOptions_CType = FieldOptions_STRING +const Default_FieldOptions_Jstype FieldOptions_JSType = FieldOptions_JS_NORMAL +const Default_FieldOptions_Lazy bool = false +const Default_FieldOptions_Deprecated bool = false +const Default_FieldOptions_Weak bool = false + +func (m *FieldOptions) GetCtype() FieldOptions_CType { + if m != nil && m.Ctype != nil { + return *m.Ctype + } + return Default_FieldOptions_Ctype +} + +func (m *FieldOptions) GetPacked() bool { + if m != nil && m.Packed != nil { + return *m.Packed + } + return false +} + +func (m *FieldOptions) GetJstype() FieldOptions_JSType { + if m != nil && m.Jstype != nil { + return *m.Jstype + } + return Default_FieldOptions_Jstype +} + +func (m *FieldOptions) GetLazy() bool { + if m != nil && m.Lazy != nil { + return *m.Lazy + } + return Default_FieldOptions_Lazy +} + +func (m *FieldOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_FieldOptions_Deprecated +} + +func (m *FieldOptions) GetWeak() bool { + if m != nil && m.Weak != nil { + return *m.Weak + } + return Default_FieldOptions_Weak +} + +func (m *FieldOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type OneofOptions struct { + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *OneofOptions) Reset() { *m = OneofOptions{} } +func (m *OneofOptions) String() string { return proto.CompactTextString(m) } +func (*OneofOptions) ProtoMessage() {} +func (*OneofOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_4df4cb5f42392df6, []int{13} +} + +var extRange_OneofOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*OneofOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_OneofOptions +} +func (m *OneofOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_OneofOptions.Unmarshal(m, b) +} +func (m *OneofOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_OneofOptions.Marshal(b, m, deterministic) +} +func (dst *OneofOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_OneofOptions.Merge(dst, src) +} +func (m *OneofOptions) XXX_Size() int { + return xxx_messageInfo_OneofOptions.Size(m) +} +func (m *OneofOptions) XXX_DiscardUnknown() { + xxx_messageInfo_OneofOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_OneofOptions proto.InternalMessageInfo + +func (m *OneofOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type EnumOptions struct { + // Set this option to true to allow mapping different tag names to the same + // value. + AllowAlias *bool `protobuf:"varint,2,opt,name=allow_alias,json=allowAlias" json:"allow_alias,omitempty"` + // Is this enum deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the enum, or it will be completely ignored; in the very least, this + // is a formalization for deprecating enums. + Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EnumOptions) Reset() { *m = EnumOptions{} } +func (m *EnumOptions) String() string { return proto.CompactTextString(m) } +func (*EnumOptions) ProtoMessage() {} +func (*EnumOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_4df4cb5f42392df6, []int{14} +} + +var extRange_EnumOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*EnumOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_EnumOptions +} +func (m *EnumOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EnumOptions.Unmarshal(m, b) +} +func (m *EnumOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EnumOptions.Marshal(b, m, deterministic) +} +func (dst *EnumOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_EnumOptions.Merge(dst, src) +} +func (m *EnumOptions) XXX_Size() int { + return xxx_messageInfo_EnumOptions.Size(m) +} +func (m *EnumOptions) XXX_DiscardUnknown() { + xxx_messageInfo_EnumOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_EnumOptions proto.InternalMessageInfo + +const Default_EnumOptions_Deprecated bool = false + +func (m *EnumOptions) GetAllowAlias() bool { + if m != nil && m.AllowAlias != nil { + return *m.AllowAlias + } + return false +} + +func (m *EnumOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_EnumOptions_Deprecated +} + +func (m *EnumOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type EnumValueOptions struct { + // Is this enum value deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the enum value, or it will be completely ignored; in the very least, + // this is a formalization for deprecating enum values. + Deprecated *bool `protobuf:"varint,1,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EnumValueOptions) Reset() { *m = EnumValueOptions{} } +func (m *EnumValueOptions) String() string { return proto.CompactTextString(m) } +func (*EnumValueOptions) ProtoMessage() {} +func (*EnumValueOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_4df4cb5f42392df6, []int{15} +} + +var extRange_EnumValueOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*EnumValueOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_EnumValueOptions +} +func (m *EnumValueOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EnumValueOptions.Unmarshal(m, b) +} +func (m *EnumValueOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EnumValueOptions.Marshal(b, m, deterministic) +} +func (dst *EnumValueOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_EnumValueOptions.Merge(dst, src) +} +func (m *EnumValueOptions) XXX_Size() int { + return xxx_messageInfo_EnumValueOptions.Size(m) +} +func (m *EnumValueOptions) XXX_DiscardUnknown() { + xxx_messageInfo_EnumValueOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_EnumValueOptions proto.InternalMessageInfo + +const Default_EnumValueOptions_Deprecated bool = false + +func (m *EnumValueOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_EnumValueOptions_Deprecated +} + +func (m *EnumValueOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type ServiceOptions struct { + // Is this service deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the service, or it will be completely ignored; in the very least, + // this is a formalization for deprecating services. + Deprecated *bool `protobuf:"varint,33,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ServiceOptions) Reset() { *m = ServiceOptions{} } +func (m *ServiceOptions) String() string { return proto.CompactTextString(m) } +func (*ServiceOptions) ProtoMessage() {} +func (*ServiceOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_4df4cb5f42392df6, []int{16} +} + +var extRange_ServiceOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*ServiceOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_ServiceOptions +} +func (m *ServiceOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ServiceOptions.Unmarshal(m, b) +} +func (m *ServiceOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ServiceOptions.Marshal(b, m, deterministic) +} +func (dst *ServiceOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_ServiceOptions.Merge(dst, src) +} +func (m *ServiceOptions) XXX_Size() int { + return xxx_messageInfo_ServiceOptions.Size(m) +} +func (m *ServiceOptions) XXX_DiscardUnknown() { + xxx_messageInfo_ServiceOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_ServiceOptions proto.InternalMessageInfo + +const Default_ServiceOptions_Deprecated bool = false + +func (m *ServiceOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_ServiceOptions_Deprecated +} + +func (m *ServiceOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type MethodOptions struct { + // Is this method deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the method, or it will be completely ignored; in the very least, + // this is a formalization for deprecating methods. + Deprecated *bool `protobuf:"varint,33,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + IdempotencyLevel *MethodOptions_IdempotencyLevel `protobuf:"varint,34,opt,name=idempotency_level,json=idempotencyLevel,enum=google.protobuf.MethodOptions_IdempotencyLevel,def=0" json:"idempotency_level,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MethodOptions) Reset() { *m = MethodOptions{} } +func (m *MethodOptions) String() string { return proto.CompactTextString(m) } +func (*MethodOptions) ProtoMessage() {} +func (*MethodOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_4df4cb5f42392df6, []int{17} +} + +var extRange_MethodOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*MethodOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_MethodOptions +} +func (m *MethodOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MethodOptions.Unmarshal(m, b) +} +func (m *MethodOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MethodOptions.Marshal(b, m, deterministic) +} +func (dst *MethodOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_MethodOptions.Merge(dst, src) +} +func (m *MethodOptions) XXX_Size() int { + return xxx_messageInfo_MethodOptions.Size(m) +} +func (m *MethodOptions) XXX_DiscardUnknown() { + xxx_messageInfo_MethodOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_MethodOptions proto.InternalMessageInfo + +const Default_MethodOptions_Deprecated bool = false +const Default_MethodOptions_IdempotencyLevel MethodOptions_IdempotencyLevel = MethodOptions_IDEMPOTENCY_UNKNOWN + +func (m *MethodOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_MethodOptions_Deprecated +} + +func (m *MethodOptions) GetIdempotencyLevel() MethodOptions_IdempotencyLevel { + if m != nil && m.IdempotencyLevel != nil { + return *m.IdempotencyLevel + } + return Default_MethodOptions_IdempotencyLevel +} + +func (m *MethodOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +// A message representing a option the parser does not recognize. This only +// appears in options protos created by the compiler::Parser class. +// DescriptorPool resolves these when building Descriptor objects. Therefore, +// options protos in descriptor objects (e.g. returned by Descriptor::options(), +// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions +// in them. +type UninterpretedOption struct { + Name []*UninterpretedOption_NamePart `protobuf:"bytes,2,rep,name=name" json:"name,omitempty"` + // The value of the uninterpreted option, in whatever type the tokenizer + // identified it as during parsing. Exactly one of these should be set. + IdentifierValue *string `protobuf:"bytes,3,opt,name=identifier_value,json=identifierValue" json:"identifier_value,omitempty"` + PositiveIntValue *uint64 `protobuf:"varint,4,opt,name=positive_int_value,json=positiveIntValue" json:"positive_int_value,omitempty"` + NegativeIntValue *int64 `protobuf:"varint,5,opt,name=negative_int_value,json=negativeIntValue" json:"negative_int_value,omitempty"` + DoubleValue *float64 `protobuf:"fixed64,6,opt,name=double_value,json=doubleValue" json:"double_value,omitempty"` + StringValue []byte `protobuf:"bytes,7,opt,name=string_value,json=stringValue" json:"string_value,omitempty"` + AggregateValue *string `protobuf:"bytes,8,opt,name=aggregate_value,json=aggregateValue" json:"aggregate_value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *UninterpretedOption) Reset() { *m = UninterpretedOption{} } +func (m *UninterpretedOption) String() string { return proto.CompactTextString(m) } +func (*UninterpretedOption) ProtoMessage() {} +func (*UninterpretedOption) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_4df4cb5f42392df6, []int{18} +} +func (m *UninterpretedOption) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_UninterpretedOption.Unmarshal(m, b) +} +func (m *UninterpretedOption) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_UninterpretedOption.Marshal(b, m, deterministic) +} +func (dst *UninterpretedOption) XXX_Merge(src proto.Message) { + xxx_messageInfo_UninterpretedOption.Merge(dst, src) +} +func (m *UninterpretedOption) XXX_Size() int { + return xxx_messageInfo_UninterpretedOption.Size(m) +} +func (m *UninterpretedOption) XXX_DiscardUnknown() { + xxx_messageInfo_UninterpretedOption.DiscardUnknown(m) +} + +var xxx_messageInfo_UninterpretedOption proto.InternalMessageInfo + +func (m *UninterpretedOption) GetName() []*UninterpretedOption_NamePart { + if m != nil { + return m.Name + } + return nil +} + +func (m *UninterpretedOption) GetIdentifierValue() string { + if m != nil && m.IdentifierValue != nil { + return *m.IdentifierValue + } + return "" +} + +func (m *UninterpretedOption) GetPositiveIntValue() uint64 { + if m != nil && m.PositiveIntValue != nil { + return *m.PositiveIntValue + } + return 0 +} + +func (m *UninterpretedOption) GetNegativeIntValue() int64 { + if m != nil && m.NegativeIntValue != nil { + return *m.NegativeIntValue + } + return 0 +} + +func (m *UninterpretedOption) GetDoubleValue() float64 { + if m != nil && m.DoubleValue != nil { + return *m.DoubleValue + } + return 0 +} + +func (m *UninterpretedOption) GetStringValue() []byte { + if m != nil { + return m.StringValue + } + return nil +} + +func (m *UninterpretedOption) GetAggregateValue() string { + if m != nil && m.AggregateValue != nil { + return *m.AggregateValue + } + return "" +} + +// The name of the uninterpreted option. Each string represents a segment in +// a dot-separated name. is_extension is true iff a segment represents an +// extension (denoted with parentheses in options specs in .proto files). +// E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents +// "foo.(bar.baz).qux". +type UninterpretedOption_NamePart struct { + NamePart *string `protobuf:"bytes,1,req,name=name_part,json=namePart" json:"name_part,omitempty"` + IsExtension *bool `protobuf:"varint,2,req,name=is_extension,json=isExtension" json:"is_extension,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *UninterpretedOption_NamePart) Reset() { *m = UninterpretedOption_NamePart{} } +func (m *UninterpretedOption_NamePart) String() string { return proto.CompactTextString(m) } +func (*UninterpretedOption_NamePart) ProtoMessage() {} +func (*UninterpretedOption_NamePart) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_4df4cb5f42392df6, []int{18, 0} +} +func (m *UninterpretedOption_NamePart) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_UninterpretedOption_NamePart.Unmarshal(m, b) +} +func (m *UninterpretedOption_NamePart) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_UninterpretedOption_NamePart.Marshal(b, m, deterministic) +} +func (dst *UninterpretedOption_NamePart) XXX_Merge(src proto.Message) { + xxx_messageInfo_UninterpretedOption_NamePart.Merge(dst, src) +} +func (m *UninterpretedOption_NamePart) XXX_Size() int { + return xxx_messageInfo_UninterpretedOption_NamePart.Size(m) +} +func (m *UninterpretedOption_NamePart) XXX_DiscardUnknown() { + xxx_messageInfo_UninterpretedOption_NamePart.DiscardUnknown(m) +} + +var xxx_messageInfo_UninterpretedOption_NamePart proto.InternalMessageInfo + +func (m *UninterpretedOption_NamePart) GetNamePart() string { + if m != nil && m.NamePart != nil { + return *m.NamePart + } + return "" +} + +func (m *UninterpretedOption_NamePart) GetIsExtension() bool { + if m != nil && m.IsExtension != nil { + return *m.IsExtension + } + return false +} + +// Encapsulates information about the original source file from which a +// FileDescriptorProto was generated. +type SourceCodeInfo struct { + // A Location identifies a piece of source code in a .proto file which + // corresponds to a particular definition. This information is intended + // to be useful to IDEs, code indexers, documentation generators, and similar + // tools. + // + // For example, say we have a file like: + // message Foo { + // optional string foo = 1; + // } + // Let's look at just the field definition: + // optional string foo = 1; + // ^ ^^ ^^ ^ ^^^ + // a bc de f ghi + // We have the following locations: + // span path represents + // [a,i) [ 4, 0, 2, 0 ] The whole field definition. + // [a,b) [ 4, 0, 2, 0, 4 ] The label (optional). + // [c,d) [ 4, 0, 2, 0, 5 ] The type (string). + // [e,f) [ 4, 0, 2, 0, 1 ] The name (foo). + // [g,h) [ 4, 0, 2, 0, 3 ] The number (1). + // + // Notes: + // - A location may refer to a repeated field itself (i.e. not to any + // particular index within it). This is used whenever a set of elements are + // logically enclosed in a single code segment. For example, an entire + // extend block (possibly containing multiple extension definitions) will + // have an outer location whose path refers to the "extensions" repeated + // field without an index. + // - Multiple locations may have the same path. This happens when a single + // logical declaration is spread out across multiple places. The most + // obvious example is the "extend" block again -- there may be multiple + // extend blocks in the same scope, each of which will have the same path. + // - A location's span is not always a subset of its parent's span. For + // example, the "extendee" of an extension declaration appears at the + // beginning of the "extend" block and is shared by all extensions within + // the block. + // - Just because a location's span is a subset of some other location's span + // does not mean that it is a descendent. For example, a "group" defines + // both a type and a field in a single declaration. Thus, the locations + // corresponding to the type and field and their components will overlap. + // - Code which tries to interpret locations should probably be designed to + // ignore those that it doesn't understand, as more types of locations could + // be recorded in the future. + Location []*SourceCodeInfo_Location `protobuf:"bytes,1,rep,name=location" json:"location,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SourceCodeInfo) Reset() { *m = SourceCodeInfo{} } +func (m *SourceCodeInfo) String() string { return proto.CompactTextString(m) } +func (*SourceCodeInfo) ProtoMessage() {} +func (*SourceCodeInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_4df4cb5f42392df6, []int{19} +} +func (m *SourceCodeInfo) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SourceCodeInfo.Unmarshal(m, b) +} +func (m *SourceCodeInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SourceCodeInfo.Marshal(b, m, deterministic) +} +func (dst *SourceCodeInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_SourceCodeInfo.Merge(dst, src) +} +func (m *SourceCodeInfo) XXX_Size() int { + return xxx_messageInfo_SourceCodeInfo.Size(m) +} +func (m *SourceCodeInfo) XXX_DiscardUnknown() { + xxx_messageInfo_SourceCodeInfo.DiscardUnknown(m) +} + +var xxx_messageInfo_SourceCodeInfo proto.InternalMessageInfo + +func (m *SourceCodeInfo) GetLocation() []*SourceCodeInfo_Location { + if m != nil { + return m.Location + } + return nil +} + +type SourceCodeInfo_Location struct { + // Identifies which part of the FileDescriptorProto was defined at this + // location. + // + // Each element is a field number or an index. They form a path from + // the root FileDescriptorProto to the place where the definition. For + // example, this path: + // [ 4, 3, 2, 7, 1 ] + // refers to: + // file.message_type(3) // 4, 3 + // .field(7) // 2, 7 + // .name() // 1 + // This is because FileDescriptorProto.message_type has field number 4: + // repeated DescriptorProto message_type = 4; + // and DescriptorProto.field has field number 2: + // repeated FieldDescriptorProto field = 2; + // and FieldDescriptorProto.name has field number 1: + // optional string name = 1; + // + // Thus, the above path gives the location of a field name. If we removed + // the last element: + // [ 4, 3, 2, 7 ] + // this path refers to the whole field declaration (from the beginning + // of the label to the terminating semicolon). + Path []int32 `protobuf:"varint,1,rep,packed,name=path" json:"path,omitempty"` + // Always has exactly three or four elements: start line, start column, + // end line (optional, otherwise assumed same as start line), end column. + // These are packed into a single field for efficiency. Note that line + // and column numbers are zero-based -- typically you will want to add + // 1 to each before displaying to a user. + Span []int32 `protobuf:"varint,2,rep,packed,name=span" json:"span,omitempty"` + // If this SourceCodeInfo represents a complete declaration, these are any + // comments appearing before and after the declaration which appear to be + // attached to the declaration. + // + // A series of line comments appearing on consecutive lines, with no other + // tokens appearing on those lines, will be treated as a single comment. + // + // leading_detached_comments will keep paragraphs of comments that appear + // before (but not connected to) the current element. Each paragraph, + // separated by empty lines, will be one comment element in the repeated + // field. + // + // Only the comment content is provided; comment markers (e.g. //) are + // stripped out. For block comments, leading whitespace and an asterisk + // will be stripped from the beginning of each line other than the first. + // Newlines are included in the output. + // + // Examples: + // + // optional int32 foo = 1; // Comment attached to foo. + // // Comment attached to bar. + // optional int32 bar = 2; + // + // optional string baz = 3; + // // Comment attached to baz. + // // Another line attached to baz. + // + // // Comment attached to qux. + // // + // // Another line attached to qux. + // optional double qux = 4; + // + // // Detached comment for corge. This is not leading or trailing comments + // // to qux or corge because there are blank lines separating it from + // // both. + // + // // Detached comment for corge paragraph 2. + // + // optional string corge = 5; + // /* Block comment attached + // * to corge. Leading asterisks + // * will be removed. */ + // /* Block comment attached to + // * grault. */ + // optional int32 grault = 6; + // + // // ignored detached comments. + LeadingComments *string `protobuf:"bytes,3,opt,name=leading_comments,json=leadingComments" json:"leading_comments,omitempty"` + TrailingComments *string `protobuf:"bytes,4,opt,name=trailing_comments,json=trailingComments" json:"trailing_comments,omitempty"` + LeadingDetachedComments []string `protobuf:"bytes,6,rep,name=leading_detached_comments,json=leadingDetachedComments" json:"leading_detached_comments,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SourceCodeInfo_Location) Reset() { *m = SourceCodeInfo_Location{} } +func (m *SourceCodeInfo_Location) String() string { return proto.CompactTextString(m) } +func (*SourceCodeInfo_Location) ProtoMessage() {} +func (*SourceCodeInfo_Location) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_4df4cb5f42392df6, []int{19, 0} +} +func (m *SourceCodeInfo_Location) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SourceCodeInfo_Location.Unmarshal(m, b) +} +func (m *SourceCodeInfo_Location) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SourceCodeInfo_Location.Marshal(b, m, deterministic) +} +func (dst *SourceCodeInfo_Location) XXX_Merge(src proto.Message) { + xxx_messageInfo_SourceCodeInfo_Location.Merge(dst, src) +} +func (m *SourceCodeInfo_Location) XXX_Size() int { + return xxx_messageInfo_SourceCodeInfo_Location.Size(m) +} +func (m *SourceCodeInfo_Location) XXX_DiscardUnknown() { + xxx_messageInfo_SourceCodeInfo_Location.DiscardUnknown(m) +} + +var xxx_messageInfo_SourceCodeInfo_Location proto.InternalMessageInfo + +func (m *SourceCodeInfo_Location) GetPath() []int32 { + if m != nil { + return m.Path + } + return nil +} + +func (m *SourceCodeInfo_Location) GetSpan() []int32 { + if m != nil { + return m.Span + } + return nil +} + +func (m *SourceCodeInfo_Location) GetLeadingComments() string { + if m != nil && m.LeadingComments != nil { + return *m.LeadingComments + } + return "" +} + +func (m *SourceCodeInfo_Location) GetTrailingComments() string { + if m != nil && m.TrailingComments != nil { + return *m.TrailingComments + } + return "" +} + +func (m *SourceCodeInfo_Location) GetLeadingDetachedComments() []string { + if m != nil { + return m.LeadingDetachedComments + } + return nil +} + +// Describes the relationship between generated code and its original source +// file. A GeneratedCodeInfo message is associated with only one generated +// source file, but may contain references to different source .proto files. +type GeneratedCodeInfo struct { + // An Annotation connects some span of text in generated code to an element + // of its generating .proto file. + Annotation []*GeneratedCodeInfo_Annotation `protobuf:"bytes,1,rep,name=annotation" json:"annotation,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GeneratedCodeInfo) Reset() { *m = GeneratedCodeInfo{} } +func (m *GeneratedCodeInfo) String() string { return proto.CompactTextString(m) } +func (*GeneratedCodeInfo) ProtoMessage() {} +func (*GeneratedCodeInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_4df4cb5f42392df6, []int{20} +} +func (m *GeneratedCodeInfo) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GeneratedCodeInfo.Unmarshal(m, b) +} +func (m *GeneratedCodeInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GeneratedCodeInfo.Marshal(b, m, deterministic) +} +func (dst *GeneratedCodeInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_GeneratedCodeInfo.Merge(dst, src) +} +func (m *GeneratedCodeInfo) XXX_Size() int { + return xxx_messageInfo_GeneratedCodeInfo.Size(m) +} +func (m *GeneratedCodeInfo) XXX_DiscardUnknown() { + xxx_messageInfo_GeneratedCodeInfo.DiscardUnknown(m) +} + +var xxx_messageInfo_GeneratedCodeInfo proto.InternalMessageInfo + +func (m *GeneratedCodeInfo) GetAnnotation() []*GeneratedCodeInfo_Annotation { + if m != nil { + return m.Annotation + } + return nil +} + +type GeneratedCodeInfo_Annotation struct { + // Identifies the element in the original source .proto file. This field + // is formatted the same as SourceCodeInfo.Location.path. + Path []int32 `protobuf:"varint,1,rep,packed,name=path" json:"path,omitempty"` + // Identifies the filesystem path to the original source .proto. + SourceFile *string `protobuf:"bytes,2,opt,name=source_file,json=sourceFile" json:"source_file,omitempty"` + // Identifies the starting offset in bytes in the generated code + // that relates to the identified object. + Begin *int32 `protobuf:"varint,3,opt,name=begin" json:"begin,omitempty"` + // Identifies the ending offset in bytes in the generated code that + // relates to the identified offset. The end offset should be one past + // the last relevant byte (so the length of the text = end - begin). + End *int32 `protobuf:"varint,4,opt,name=end" json:"end,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GeneratedCodeInfo_Annotation) Reset() { *m = GeneratedCodeInfo_Annotation{} } +func (m *GeneratedCodeInfo_Annotation) String() string { return proto.CompactTextString(m) } +func (*GeneratedCodeInfo_Annotation) ProtoMessage() {} +func (*GeneratedCodeInfo_Annotation) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_4df4cb5f42392df6, []int{20, 0} +} +func (m *GeneratedCodeInfo_Annotation) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GeneratedCodeInfo_Annotation.Unmarshal(m, b) +} +func (m *GeneratedCodeInfo_Annotation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GeneratedCodeInfo_Annotation.Marshal(b, m, deterministic) +} +func (dst *GeneratedCodeInfo_Annotation) XXX_Merge(src proto.Message) { + xxx_messageInfo_GeneratedCodeInfo_Annotation.Merge(dst, src) +} +func (m *GeneratedCodeInfo_Annotation) XXX_Size() int { + return xxx_messageInfo_GeneratedCodeInfo_Annotation.Size(m) +} +func (m *GeneratedCodeInfo_Annotation) XXX_DiscardUnknown() { + xxx_messageInfo_GeneratedCodeInfo_Annotation.DiscardUnknown(m) +} + +var xxx_messageInfo_GeneratedCodeInfo_Annotation proto.InternalMessageInfo + +func (m *GeneratedCodeInfo_Annotation) GetPath() []int32 { + if m != nil { + return m.Path + } + return nil +} + +func (m *GeneratedCodeInfo_Annotation) GetSourceFile() string { + if m != nil && m.SourceFile != nil { + return *m.SourceFile + } + return "" +} + +func (m *GeneratedCodeInfo_Annotation) GetBegin() int32 { + if m != nil && m.Begin != nil { + return *m.Begin + } + return 0 +} + +func (m *GeneratedCodeInfo_Annotation) GetEnd() int32 { + if m != nil && m.End != nil { + return *m.End + } + return 0 +} + +func init() { + proto.RegisterType((*FileDescriptorSet)(nil), "google.protobuf.FileDescriptorSet") + proto.RegisterType((*FileDescriptorProto)(nil), "google.protobuf.FileDescriptorProto") + proto.RegisterType((*DescriptorProto)(nil), "google.protobuf.DescriptorProto") + proto.RegisterType((*DescriptorProto_ExtensionRange)(nil), "google.protobuf.DescriptorProto.ExtensionRange") + proto.RegisterType((*DescriptorProto_ReservedRange)(nil), "google.protobuf.DescriptorProto.ReservedRange") + proto.RegisterType((*ExtensionRangeOptions)(nil), "google.protobuf.ExtensionRangeOptions") + proto.RegisterType((*FieldDescriptorProto)(nil), "google.protobuf.FieldDescriptorProto") + proto.RegisterType((*OneofDescriptorProto)(nil), "google.protobuf.OneofDescriptorProto") + proto.RegisterType((*EnumDescriptorProto)(nil), "google.protobuf.EnumDescriptorProto") + proto.RegisterType((*EnumDescriptorProto_EnumReservedRange)(nil), "google.protobuf.EnumDescriptorProto.EnumReservedRange") + proto.RegisterType((*EnumValueDescriptorProto)(nil), "google.protobuf.EnumValueDescriptorProto") + proto.RegisterType((*ServiceDescriptorProto)(nil), "google.protobuf.ServiceDescriptorProto") + proto.RegisterType((*MethodDescriptorProto)(nil), "google.protobuf.MethodDescriptorProto") + proto.RegisterType((*FileOptions)(nil), "google.protobuf.FileOptions") + proto.RegisterType((*MessageOptions)(nil), "google.protobuf.MessageOptions") + proto.RegisterType((*FieldOptions)(nil), "google.protobuf.FieldOptions") + proto.RegisterType((*OneofOptions)(nil), "google.protobuf.OneofOptions") + proto.RegisterType((*EnumOptions)(nil), "google.protobuf.EnumOptions") + proto.RegisterType((*EnumValueOptions)(nil), "google.protobuf.EnumValueOptions") + proto.RegisterType((*ServiceOptions)(nil), "google.protobuf.ServiceOptions") + proto.RegisterType((*MethodOptions)(nil), "google.protobuf.MethodOptions") + proto.RegisterType((*UninterpretedOption)(nil), "google.protobuf.UninterpretedOption") + proto.RegisterType((*UninterpretedOption_NamePart)(nil), "google.protobuf.UninterpretedOption.NamePart") + proto.RegisterType((*SourceCodeInfo)(nil), "google.protobuf.SourceCodeInfo") + proto.RegisterType((*SourceCodeInfo_Location)(nil), "google.protobuf.SourceCodeInfo.Location") + proto.RegisterType((*GeneratedCodeInfo)(nil), "google.protobuf.GeneratedCodeInfo") + proto.RegisterType((*GeneratedCodeInfo_Annotation)(nil), "google.protobuf.GeneratedCodeInfo.Annotation") + proto.RegisterEnum("google.protobuf.FieldDescriptorProto_Type", FieldDescriptorProto_Type_name, FieldDescriptorProto_Type_value) + proto.RegisterEnum("google.protobuf.FieldDescriptorProto_Label", FieldDescriptorProto_Label_name, FieldDescriptorProto_Label_value) + proto.RegisterEnum("google.protobuf.FileOptions_OptimizeMode", FileOptions_OptimizeMode_name, FileOptions_OptimizeMode_value) + proto.RegisterEnum("google.protobuf.FieldOptions_CType", FieldOptions_CType_name, FieldOptions_CType_value) + proto.RegisterEnum("google.protobuf.FieldOptions_JSType", FieldOptions_JSType_name, FieldOptions_JSType_value) + proto.RegisterEnum("google.protobuf.MethodOptions_IdempotencyLevel", MethodOptions_IdempotencyLevel_name, MethodOptions_IdempotencyLevel_value) +} + +func init() { + proto.RegisterFile("google/protobuf/descriptor.proto", fileDescriptor_descriptor_4df4cb5f42392df6) +} + +var fileDescriptor_descriptor_4df4cb5f42392df6 = []byte{ + // 2555 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x59, 0xdd, 0x6e, 0x1b, 0xc7, + 0xf5, 0xcf, 0xf2, 0x4b, 0xe4, 0x21, 0x45, 0x8d, 0x46, 0x8a, 0xbd, 0x56, 0x3e, 0x2c, 0x33, 0x1f, + 0x96, 0x9d, 0x7f, 0xa8, 0xc0, 0xb1, 0x1d, 0x47, 0xfe, 0x23, 0x2d, 0x45, 0xae, 0x15, 0xaa, 0x12, + 0xc9, 0x2e, 0xa9, 0xe6, 0x03, 0x28, 0x16, 0xa3, 0xdd, 0x21, 0xb9, 0xf6, 0x72, 0x77, 0xb3, 0xbb, + 0xb4, 0xad, 0xa0, 0x17, 0x06, 0x7a, 0xd5, 0xab, 0xde, 0x16, 0x45, 0xd1, 0x8b, 0xde, 0x04, 0xe8, + 0x03, 0x14, 0xc8, 0x5d, 0x9f, 0xa0, 0x40, 0xde, 0xa0, 0x68, 0x0b, 0xb4, 0x8f, 0xd0, 0xcb, 0x62, + 0x66, 0x76, 0x97, 0xbb, 0x24, 0x15, 0x2b, 0x01, 0xe2, 0x5c, 0x91, 0xf3, 0x9b, 0xdf, 0x39, 0x73, + 0xe6, 0xcc, 0x99, 0x33, 0x67, 0x66, 0x61, 0x7b, 0xe4, 0x38, 0x23, 0x8b, 0xee, 0xba, 0x9e, 0x13, + 0x38, 0xa7, 0xd3, 0xe1, 0xae, 0x41, 0x7d, 0xdd, 0x33, 0xdd, 0xc0, 0xf1, 0xea, 0x1c, 0xc3, 0x6b, + 0x82, 0x51, 0x8f, 0x18, 0xb5, 0x63, 0x58, 0x7f, 0x60, 0x5a, 0xb4, 0x15, 0x13, 0xfb, 0x34, 0xc0, + 0xf7, 0x20, 0x37, 0x34, 0x2d, 0x2a, 0x4b, 0xdb, 0xd9, 0x9d, 0xf2, 0xad, 0x37, 0xeb, 0x73, 0x42, + 0xf5, 0xb4, 0x44, 0x8f, 0xc1, 0x2a, 0x97, 0xa8, 0xfd, 0x2b, 0x07, 0x1b, 0x4b, 0x7a, 0x31, 0x86, + 0x9c, 0x4d, 0x26, 0x4c, 0xa3, 0xb4, 0x53, 0x52, 0xf9, 0x7f, 0x2c, 0xc3, 0x8a, 0x4b, 0xf4, 0x47, + 0x64, 0x44, 0xe5, 0x0c, 0x87, 0xa3, 0x26, 0x7e, 0x1d, 0xc0, 0xa0, 0x2e, 0xb5, 0x0d, 0x6a, 0xeb, + 0x67, 0x72, 0x76, 0x3b, 0xbb, 0x53, 0x52, 0x13, 0x08, 0x7e, 0x07, 0xd6, 0xdd, 0xe9, 0xa9, 0x65, + 0xea, 0x5a, 0x82, 0x06, 0xdb, 0xd9, 0x9d, 0xbc, 0x8a, 0x44, 0x47, 0x6b, 0x46, 0xbe, 0x0e, 0x6b, + 0x4f, 0x28, 0x79, 0x94, 0xa4, 0x96, 0x39, 0xb5, 0xca, 0xe0, 0x04, 0xb1, 0x09, 0x95, 0x09, 0xf5, + 0x7d, 0x32, 0xa2, 0x5a, 0x70, 0xe6, 0x52, 0x39, 0xc7, 0x67, 0xbf, 0xbd, 0x30, 0xfb, 0xf9, 0x99, + 0x97, 0x43, 0xa9, 0xc1, 0x99, 0x4b, 0x71, 0x03, 0x4a, 0xd4, 0x9e, 0x4e, 0x84, 0x86, 0xfc, 0x39, + 0xfe, 0x53, 0xec, 0xe9, 0x64, 0x5e, 0x4b, 0x91, 0x89, 0x85, 0x2a, 0x56, 0x7c, 0xea, 0x3d, 0x36, + 0x75, 0x2a, 0x17, 0xb8, 0x82, 0xeb, 0x0b, 0x0a, 0xfa, 0xa2, 0x7f, 0x5e, 0x47, 0x24, 0x87, 0x9b, + 0x50, 0xa2, 0x4f, 0x03, 0x6a, 0xfb, 0xa6, 0x63, 0xcb, 0x2b, 0x5c, 0xc9, 0x5b, 0x4b, 0x56, 0x91, + 0x5a, 0xc6, 0xbc, 0x8a, 0x99, 0x1c, 0xbe, 0x0b, 0x2b, 0x8e, 0x1b, 0x98, 0x8e, 0xed, 0xcb, 0xc5, + 0x6d, 0x69, 0xa7, 0x7c, 0xeb, 0xd5, 0xa5, 0x81, 0xd0, 0x15, 0x1c, 0x35, 0x22, 0xe3, 0x36, 0x20, + 0xdf, 0x99, 0x7a, 0x3a, 0xd5, 0x74, 0xc7, 0xa0, 0x9a, 0x69, 0x0f, 0x1d, 0xb9, 0xc4, 0x15, 0x5c, + 0x5d, 0x9c, 0x08, 0x27, 0x36, 0x1d, 0x83, 0xb6, 0xed, 0xa1, 0xa3, 0x56, 0xfd, 0x54, 0x1b, 0x5f, + 0x82, 0x82, 0x7f, 0x66, 0x07, 0xe4, 0xa9, 0x5c, 0xe1, 0x11, 0x12, 0xb6, 0x6a, 0x5f, 0x17, 0x60, + 0xed, 0x22, 0x21, 0x76, 0x1f, 0xf2, 0x43, 0x36, 0x4b, 0x39, 0xf3, 0x5d, 0x7c, 0x20, 0x64, 0xd2, + 0x4e, 0x2c, 0x7c, 0x4f, 0x27, 0x36, 0xa0, 0x6c, 0x53, 0x3f, 0xa0, 0x86, 0x88, 0x88, 0xec, 0x05, + 0x63, 0x0a, 0x84, 0xd0, 0x62, 0x48, 0xe5, 0xbe, 0x57, 0x48, 0x7d, 0x0a, 0x6b, 0xb1, 0x49, 0x9a, + 0x47, 0xec, 0x51, 0x14, 0x9b, 0xbb, 0xcf, 0xb3, 0xa4, 0xae, 0x44, 0x72, 0x2a, 0x13, 0x53, 0xab, + 0x34, 0xd5, 0xc6, 0x2d, 0x00, 0xc7, 0xa6, 0xce, 0x50, 0x33, 0xa8, 0x6e, 0xc9, 0xc5, 0x73, 0xbc, + 0xd4, 0x65, 0x94, 0x05, 0x2f, 0x39, 0x02, 0xd5, 0x2d, 0xfc, 0xe1, 0x2c, 0xd4, 0x56, 0xce, 0x89, + 0x94, 0x63, 0xb1, 0xc9, 0x16, 0xa2, 0xed, 0x04, 0xaa, 0x1e, 0x65, 0x71, 0x4f, 0x8d, 0x70, 0x66, + 0x25, 0x6e, 0x44, 0xfd, 0xb9, 0x33, 0x53, 0x43, 0x31, 0x31, 0xb1, 0x55, 0x2f, 0xd9, 0xc4, 0x6f, + 0x40, 0x0c, 0x68, 0x3c, 0xac, 0x80, 0x67, 0xa1, 0x4a, 0x04, 0x76, 0xc8, 0x84, 0x6e, 0x7d, 0x09, + 0xd5, 0xb4, 0x7b, 0xf0, 0x26, 0xe4, 0xfd, 0x80, 0x78, 0x01, 0x8f, 0xc2, 0xbc, 0x2a, 0x1a, 0x18, + 0x41, 0x96, 0xda, 0x06, 0xcf, 0x72, 0x79, 0x95, 0xfd, 0xc5, 0x3f, 0x9d, 0x4d, 0x38, 0xcb, 0x27, + 0xfc, 0xf6, 0xe2, 0x8a, 0xa6, 0x34, 0xcf, 0xcf, 0x7b, 0xeb, 0x03, 0x58, 0x4d, 0x4d, 0xe0, 0xa2, + 0x43, 0xd7, 0x7e, 0x05, 0x2f, 0x2f, 0x55, 0x8d, 0x3f, 0x85, 0xcd, 0xa9, 0x6d, 0xda, 0x01, 0xf5, + 0x5c, 0x8f, 0xb2, 0x88, 0x15, 0x43, 0xc9, 0xff, 0x5e, 0x39, 0x27, 0xe6, 0x4e, 0x92, 0x6c, 0xa1, + 0x45, 0xdd, 0x98, 0x2e, 0x82, 0x37, 0x4b, 0xc5, 0xff, 0xac, 0xa0, 0x67, 0xcf, 0x9e, 0x3d, 0xcb, + 0xd4, 0x7e, 0x57, 0x80, 0xcd, 0x65, 0x7b, 0x66, 0xe9, 0xf6, 0xbd, 0x04, 0x05, 0x7b, 0x3a, 0x39, + 0xa5, 0x1e, 0x77, 0x52, 0x5e, 0x0d, 0x5b, 0xb8, 0x01, 0x79, 0x8b, 0x9c, 0x52, 0x4b, 0xce, 0x6d, + 0x4b, 0x3b, 0xd5, 0x5b, 0xef, 0x5c, 0x68, 0x57, 0xd6, 0x8f, 0x98, 0x88, 0x2a, 0x24, 0xf1, 0x47, + 0x90, 0x0b, 0x53, 0x34, 0xd3, 0x70, 0xf3, 0x62, 0x1a, 0xd8, 0x5e, 0x52, 0xb9, 0x1c, 0x7e, 0x05, + 0x4a, 0xec, 0x57, 0xc4, 0x46, 0x81, 0xdb, 0x5c, 0x64, 0x00, 0x8b, 0x0b, 0xbc, 0x05, 0x45, 0xbe, + 0x4d, 0x0c, 0x1a, 0x1d, 0x6d, 0x71, 0x9b, 0x05, 0x96, 0x41, 0x87, 0x64, 0x6a, 0x05, 0xda, 0x63, + 0x62, 0x4d, 0x29, 0x0f, 0xf8, 0x92, 0x5a, 0x09, 0xc1, 0x5f, 0x30, 0x0c, 0x5f, 0x85, 0xb2, 0xd8, + 0x55, 0xa6, 0x6d, 0xd0, 0xa7, 0x3c, 0x7b, 0xe6, 0x55, 0xb1, 0xd1, 0xda, 0x0c, 0x61, 0xc3, 0x3f, + 0xf4, 0x1d, 0x3b, 0x0a, 0x4d, 0x3e, 0x04, 0x03, 0xf8, 0xf0, 0x1f, 0xcc, 0x27, 0xee, 0xd7, 0x96, + 0x4f, 0x6f, 0x3e, 0xa6, 0x6a, 0x7f, 0xc9, 0x40, 0x8e, 0xe7, 0x8b, 0x35, 0x28, 0x0f, 0x3e, 0xeb, + 0x29, 0x5a, 0xab, 0x7b, 0xb2, 0x7f, 0xa4, 0x20, 0x09, 0x57, 0x01, 0x38, 0xf0, 0xe0, 0xa8, 0xdb, + 0x18, 0xa0, 0x4c, 0xdc, 0x6e, 0x77, 0x06, 0x77, 0x6f, 0xa3, 0x6c, 0x2c, 0x70, 0x22, 0x80, 0x5c, + 0x92, 0xf0, 0xfe, 0x2d, 0x94, 0xc7, 0x08, 0x2a, 0x42, 0x41, 0xfb, 0x53, 0xa5, 0x75, 0xf7, 0x36, + 0x2a, 0xa4, 0x91, 0xf7, 0x6f, 0xa1, 0x15, 0xbc, 0x0a, 0x25, 0x8e, 0xec, 0x77, 0xbb, 0x47, 0xa8, + 0x18, 0xeb, 0xec, 0x0f, 0xd4, 0x76, 0xe7, 0x00, 0x95, 0x62, 0x9d, 0x07, 0x6a, 0xf7, 0xa4, 0x87, + 0x20, 0xd6, 0x70, 0xac, 0xf4, 0xfb, 0x8d, 0x03, 0x05, 0x95, 0x63, 0xc6, 0xfe, 0x67, 0x03, 0xa5, + 0x8f, 0x2a, 0x29, 0xb3, 0xde, 0xbf, 0x85, 0x56, 0xe3, 0x21, 0x94, 0xce, 0xc9, 0x31, 0xaa, 0xe2, + 0x75, 0x58, 0x15, 0x43, 0x44, 0x46, 0xac, 0xcd, 0x41, 0x77, 0x6f, 0x23, 0x34, 0x33, 0x44, 0x68, + 0x59, 0x4f, 0x01, 0x77, 0x6f, 0x23, 0x5c, 0x6b, 0x42, 0x9e, 0x47, 0x17, 0xc6, 0x50, 0x3d, 0x6a, + 0xec, 0x2b, 0x47, 0x5a, 0xb7, 0x37, 0x68, 0x77, 0x3b, 0x8d, 0x23, 0x24, 0xcd, 0x30, 0x55, 0xf9, + 0xf9, 0x49, 0x5b, 0x55, 0x5a, 0x28, 0x93, 0xc4, 0x7a, 0x4a, 0x63, 0xa0, 0xb4, 0x50, 0xb6, 0xa6, + 0xc3, 0xe6, 0xb2, 0x3c, 0xb9, 0x74, 0x67, 0x24, 0x96, 0x38, 0x73, 0xce, 0x12, 0x73, 0x5d, 0x0b, + 0x4b, 0xfc, 0xcf, 0x0c, 0x6c, 0x2c, 0x39, 0x2b, 0x96, 0x0e, 0xf2, 0x13, 0xc8, 0x8b, 0x10, 0x15, + 0xa7, 0xe7, 0x8d, 0xa5, 0x87, 0x0e, 0x0f, 0xd8, 0x85, 0x13, 0x94, 0xcb, 0x25, 0x2b, 0x88, 0xec, + 0x39, 0x15, 0x04, 0x53, 0xb1, 0x90, 0xd3, 0x7f, 0xb9, 0x90, 0xd3, 0xc5, 0xb1, 0x77, 0xf7, 0x22, + 0xc7, 0x1e, 0xc7, 0xbe, 0x5b, 0x6e, 0xcf, 0x2f, 0xc9, 0xed, 0xf7, 0x61, 0x7d, 0x41, 0xd1, 0x85, + 0x73, 0xec, 0xaf, 0x25, 0x90, 0xcf, 0x73, 0xce, 0x73, 0x32, 0x5d, 0x26, 0x95, 0xe9, 0xee, 0xcf, + 0x7b, 0xf0, 0xda, 0xf9, 0x8b, 0xb0, 0xb0, 0xd6, 0x5f, 0x49, 0x70, 0x69, 0x79, 0xa5, 0xb8, 0xd4, + 0x86, 0x8f, 0xa0, 0x30, 0xa1, 0xc1, 0xd8, 0x89, 0xaa, 0xa5, 0xb7, 0x97, 0x9c, 0xc1, 0xac, 0x7b, + 0x7e, 0xb1, 0x43, 0xa9, 0xe4, 0x21, 0x9e, 0x3d, 0xaf, 0xdc, 0x13, 0xd6, 0x2c, 0x58, 0xfa, 0x9b, + 0x0c, 0xbc, 0xbc, 0x54, 0xf9, 0x52, 0x43, 0x5f, 0x03, 0x30, 0x6d, 0x77, 0x1a, 0x88, 0x8a, 0x48, + 0x24, 0xd8, 0x12, 0x47, 0x78, 0xf2, 0x62, 0xc9, 0x73, 0x1a, 0xc4, 0xfd, 0x59, 0xde, 0x0f, 0x02, + 0xe2, 0x84, 0x7b, 0x33, 0x43, 0x73, 0xdc, 0xd0, 0xd7, 0xcf, 0x99, 0xe9, 0x42, 0x60, 0xbe, 0x07, + 0x48, 0xb7, 0x4c, 0x6a, 0x07, 0x9a, 0x1f, 0x78, 0x94, 0x4c, 0x4c, 0x7b, 0xc4, 0x4f, 0x90, 0xe2, + 0x5e, 0x7e, 0x48, 0x2c, 0x9f, 0xaa, 0x6b, 0xa2, 0xbb, 0x1f, 0xf5, 0x32, 0x09, 0x1e, 0x40, 0x5e, + 0x42, 0xa2, 0x90, 0x92, 0x10, 0xdd, 0xb1, 0x44, 0xed, 0xeb, 0x22, 0x94, 0x13, 0x75, 0x35, 0xbe, + 0x06, 0x95, 0x87, 0xe4, 0x31, 0xd1, 0xa2, 0xbb, 0x92, 0xf0, 0x44, 0x99, 0x61, 0xbd, 0xf0, 0xbe, + 0xf4, 0x1e, 0x6c, 0x72, 0x8a, 0x33, 0x0d, 0xa8, 0xa7, 0xe9, 0x16, 0xf1, 0x7d, 0xee, 0xb4, 0x22, + 0xa7, 0x62, 0xd6, 0xd7, 0x65, 0x5d, 0xcd, 0xa8, 0x07, 0xdf, 0x81, 0x0d, 0x2e, 0x31, 0x99, 0x5a, + 0x81, 0xe9, 0x5a, 0x54, 0x63, 0xb7, 0x37, 0x9f, 0x9f, 0x24, 0xb1, 0x65, 0xeb, 0x8c, 0x71, 0x1c, + 0x12, 0x98, 0x45, 0x3e, 0x6e, 0xc1, 0x6b, 0x5c, 0x6c, 0x44, 0x6d, 0xea, 0x91, 0x80, 0x6a, 0xf4, + 0x8b, 0x29, 0xb1, 0x7c, 0x8d, 0xd8, 0x86, 0x36, 0x26, 0xfe, 0x58, 0xde, 0x64, 0x0a, 0xf6, 0x33, + 0xb2, 0xa4, 0x5e, 0x61, 0xc4, 0x83, 0x90, 0xa7, 0x70, 0x5a, 0xc3, 0x36, 0x3e, 0x26, 0xfe, 0x18, + 0xef, 0xc1, 0x25, 0xae, 0xc5, 0x0f, 0x3c, 0xd3, 0x1e, 0x69, 0xfa, 0x98, 0xea, 0x8f, 0xb4, 0x69, + 0x30, 0xbc, 0x27, 0xbf, 0x92, 0x1c, 0x9f, 0x5b, 0xd8, 0xe7, 0x9c, 0x26, 0xa3, 0x9c, 0x04, 0xc3, + 0x7b, 0xb8, 0x0f, 0x15, 0xb6, 0x18, 0x13, 0xf3, 0x4b, 0xaa, 0x0d, 0x1d, 0x8f, 0x1f, 0x8d, 0xd5, + 0x25, 0xa9, 0x29, 0xe1, 0xc1, 0x7a, 0x37, 0x14, 0x38, 0x76, 0x0c, 0xba, 0x97, 0xef, 0xf7, 0x14, + 0xa5, 0xa5, 0x96, 0x23, 0x2d, 0x0f, 0x1c, 0x8f, 0x05, 0xd4, 0xc8, 0x89, 0x1d, 0x5c, 0x16, 0x01, + 0x35, 0x72, 0x22, 0xf7, 0xde, 0x81, 0x0d, 0x5d, 0x17, 0x73, 0x36, 0x75, 0x2d, 0xbc, 0x63, 0xf9, + 0x32, 0x4a, 0x39, 0x4b, 0xd7, 0x0f, 0x04, 0x21, 0x8c, 0x71, 0x1f, 0x7f, 0x08, 0x2f, 0xcf, 0x9c, + 0x95, 0x14, 0x5c, 0x5f, 0x98, 0xe5, 0xbc, 0xe8, 0x1d, 0xd8, 0x70, 0xcf, 0x16, 0x05, 0x71, 0x6a, + 0x44, 0xf7, 0x6c, 0x5e, 0xec, 0x03, 0xd8, 0x74, 0xc7, 0xee, 0xa2, 0xdc, 0xcd, 0xa4, 0x1c, 0x76, + 0xc7, 0xee, 0xbc, 0xe0, 0x5b, 0xfc, 0xc2, 0xed, 0x51, 0x9d, 0x04, 0xd4, 0x90, 0x2f, 0x27, 0xe9, + 0x89, 0x0e, 0xbc, 0x0b, 0x48, 0xd7, 0x35, 0x6a, 0x93, 0x53, 0x8b, 0x6a, 0xc4, 0xa3, 0x36, 0xf1, + 0xe5, 0xab, 0x49, 0x72, 0x55, 0xd7, 0x15, 0xde, 0xdb, 0xe0, 0x9d, 0xf8, 0x26, 0xac, 0x3b, 0xa7, + 0x0f, 0x75, 0x11, 0x92, 0x9a, 0xeb, 0xd1, 0xa1, 0xf9, 0x54, 0x7e, 0x93, 0xfb, 0x77, 0x8d, 0x75, + 0xf0, 0x80, 0xec, 0x71, 0x18, 0xdf, 0x00, 0xa4, 0xfb, 0x63, 0xe2, 0xb9, 0x3c, 0x27, 0xfb, 0x2e, + 0xd1, 0xa9, 0xfc, 0x96, 0xa0, 0x0a, 0xbc, 0x13, 0xc1, 0x6c, 0x4b, 0xf8, 0x4f, 0xcc, 0x61, 0x10, + 0x69, 0xbc, 0x2e, 0xb6, 0x04, 0xc7, 0x42, 0x6d, 0x3b, 0x80, 0x98, 0x2b, 0x52, 0x03, 0xef, 0x70, + 0x5a, 0xd5, 0x1d, 0xbb, 0xc9, 0x71, 0xdf, 0x80, 0x55, 0xc6, 0x9c, 0x0d, 0x7a, 0x43, 0x14, 0x64, + 0xee, 0x38, 0x31, 0xe2, 0x0f, 0x56, 0x1b, 0xd7, 0xf6, 0xa0, 0x92, 0x8c, 0x4f, 0x5c, 0x02, 0x11, + 0xa1, 0x48, 0x62, 0xc5, 0x4a, 0xb3, 0xdb, 0x62, 0x65, 0xc6, 0xe7, 0x0a, 0xca, 0xb0, 0x72, 0xe7, + 0xa8, 0x3d, 0x50, 0x34, 0xf5, 0xa4, 0x33, 0x68, 0x1f, 0x2b, 0x28, 0x9b, 0xa8, 0xab, 0x0f, 0x73, + 0xc5, 0xb7, 0xd1, 0xf5, 0xda, 0x37, 0x19, 0xa8, 0xa6, 0x2f, 0x4a, 0xf8, 0xff, 0xe1, 0x72, 0xf4, + 0xaa, 0xe1, 0xd3, 0x40, 0x7b, 0x62, 0x7a, 0x7c, 0xe3, 0x4c, 0x88, 0x38, 0xc4, 0xe2, 0xa5, 0xdb, + 0x0c, 0x59, 0x7d, 0x1a, 0x7c, 0x62, 0x7a, 0x6c, 0x5b, 0x4c, 0x48, 0x80, 0x8f, 0xe0, 0xaa, 0xed, + 0x68, 0x7e, 0x40, 0x6c, 0x83, 0x78, 0x86, 0x36, 0x7b, 0x4f, 0xd2, 0x88, 0xae, 0x53, 0xdf, 0x77, + 0xc4, 0x81, 0x15, 0x6b, 0x79, 0xd5, 0x76, 0xfa, 0x21, 0x79, 0x96, 0xc9, 0x1b, 0x21, 0x75, 0x2e, + 0xcc, 0xb2, 0xe7, 0x85, 0xd9, 0x2b, 0x50, 0x9a, 0x10, 0x57, 0xa3, 0x76, 0xe0, 0x9d, 0xf1, 0xf2, + 0xb8, 0xa8, 0x16, 0x27, 0xc4, 0x55, 0x58, 0xfb, 0x85, 0xdc, 0x52, 0x0e, 0x73, 0xc5, 0x22, 0x2a, + 0x1d, 0xe6, 0x8a, 0x25, 0x04, 0xb5, 0x7f, 0x64, 0xa1, 0x92, 0x2c, 0x97, 0xd9, 0xed, 0x43, 0xe7, + 0x27, 0x8b, 0xc4, 0x73, 0xcf, 0x1b, 0xdf, 0x5a, 0x5c, 0xd7, 0x9b, 0xec, 0xc8, 0xd9, 0x2b, 0x88, + 0x22, 0x56, 0x15, 0x92, 0xec, 0xb8, 0x67, 0xd9, 0x86, 0x8a, 0xa2, 0xa1, 0xa8, 0x86, 0x2d, 0x7c, + 0x00, 0x85, 0x87, 0x3e, 0xd7, 0x5d, 0xe0, 0xba, 0xdf, 0xfc, 0x76, 0xdd, 0x87, 0x7d, 0xae, 0xbc, + 0x74, 0xd8, 0xd7, 0x3a, 0x5d, 0xf5, 0xb8, 0x71, 0xa4, 0x86, 0xe2, 0xf8, 0x0a, 0xe4, 0x2c, 0xf2, + 0xe5, 0x59, 0xfa, 0x70, 0xe2, 0xd0, 0x45, 0x17, 0xe1, 0x0a, 0xe4, 0x9e, 0x50, 0xf2, 0x28, 0x7d, + 0x24, 0x70, 0xe8, 0x07, 0xdc, 0x0c, 0xbb, 0x90, 0xe7, 0xfe, 0xc2, 0x00, 0xa1, 0xc7, 0xd0, 0x4b, + 0xb8, 0x08, 0xb9, 0x66, 0x57, 0x65, 0x1b, 0x02, 0x41, 0x45, 0xa0, 0x5a, 0xaf, 0xad, 0x34, 0x15, + 0x94, 0xa9, 0xdd, 0x81, 0x82, 0x70, 0x02, 0xdb, 0x2c, 0xb1, 0x1b, 0xd0, 0x4b, 0x61, 0x33, 0xd4, + 0x21, 0x45, 0xbd, 0x27, 0xc7, 0xfb, 0x8a, 0x8a, 0x32, 0xe9, 0xa5, 0xce, 0xa1, 0x7c, 0xcd, 0x87, + 0x4a, 0xb2, 0x5e, 0x7e, 0x31, 0x77, 0xe1, 0xbf, 0x4a, 0x50, 0x4e, 0xd4, 0xbf, 0xac, 0x70, 0x21, + 0x96, 0xe5, 0x3c, 0xd1, 0x88, 0x65, 0x12, 0x3f, 0x0c, 0x0d, 0xe0, 0x50, 0x83, 0x21, 0x17, 0x5d, + 0xba, 0x17, 0xb4, 0x45, 0xf2, 0xa8, 0x50, 0xfb, 0xa3, 0x04, 0x68, 0xbe, 0x00, 0x9d, 0x33, 0x53, + 0xfa, 0x31, 0xcd, 0xac, 0xfd, 0x41, 0x82, 0x6a, 0xba, 0xea, 0x9c, 0x33, 0xef, 0xda, 0x8f, 0x6a, + 0xde, 0xdf, 0x33, 0xb0, 0x9a, 0xaa, 0x35, 0x2f, 0x6a, 0xdd, 0x17, 0xb0, 0x6e, 0x1a, 0x74, 0xe2, + 0x3a, 0x01, 0xb5, 0xf5, 0x33, 0xcd, 0xa2, 0x8f, 0xa9, 0x25, 0xd7, 0x78, 0xd2, 0xd8, 0xfd, 0xf6, + 0x6a, 0xb6, 0xde, 0x9e, 0xc9, 0x1d, 0x31, 0xb1, 0xbd, 0x8d, 0x76, 0x4b, 0x39, 0xee, 0x75, 0x07, + 0x4a, 0xa7, 0xf9, 0x99, 0x76, 0xd2, 0xf9, 0x59, 0xa7, 0xfb, 0x49, 0x47, 0x45, 0xe6, 0x1c, 0xed, + 0x07, 0xdc, 0xf6, 0x3d, 0x40, 0xf3, 0x46, 0xe1, 0xcb, 0xb0, 0xcc, 0x2c, 0xf4, 0x12, 0xde, 0x80, + 0xb5, 0x4e, 0x57, 0xeb, 0xb7, 0x5b, 0x8a, 0xa6, 0x3c, 0x78, 0xa0, 0x34, 0x07, 0x7d, 0xf1, 0x3e, + 0x11, 0xb3, 0x07, 0xa9, 0x0d, 0x5e, 0xfb, 0x7d, 0x16, 0x36, 0x96, 0x58, 0x82, 0x1b, 0xe1, 0xcd, + 0x42, 0x5c, 0x76, 0xde, 0xbd, 0x88, 0xf5, 0x75, 0x56, 0x10, 0xf4, 0x88, 0x17, 0x84, 0x17, 0x91, + 0x1b, 0xc0, 0xbc, 0x64, 0x07, 0xe6, 0xd0, 0xa4, 0x5e, 0xf8, 0x9c, 0x23, 0xae, 0x1b, 0x6b, 0x33, + 0x5c, 0xbc, 0xe8, 0xfc, 0x1f, 0x60, 0xd7, 0xf1, 0xcd, 0xc0, 0x7c, 0x4c, 0x35, 0xd3, 0x8e, 0xde, + 0x7e, 0xd8, 0xf5, 0x23, 0xa7, 0xa2, 0xa8, 0xa7, 0x6d, 0x07, 0x31, 0xdb, 0xa6, 0x23, 0x32, 0xc7, + 0x66, 0xc9, 0x3c, 0xab, 0xa2, 0xa8, 0x27, 0x66, 0x5f, 0x83, 0x8a, 0xe1, 0x4c, 0x59, 0x4d, 0x26, + 0x78, 0xec, 0xec, 0x90, 0xd4, 0xb2, 0xc0, 0x62, 0x4a, 0x58, 0x6d, 0xcf, 0x1e, 0x9d, 0x2a, 0x6a, + 0x59, 0x60, 0x82, 0x72, 0x1d, 0xd6, 0xc8, 0x68, 0xe4, 0x31, 0xe5, 0x91, 0x22, 0x71, 0x7f, 0xa8, + 0xc6, 0x30, 0x27, 0x6e, 0x1d, 0x42, 0x31, 0xf2, 0x03, 0x3b, 0xaa, 0x99, 0x27, 0x34, 0x57, 0x5c, + 0x8a, 0x33, 0x3b, 0x25, 0xb5, 0x68, 0x47, 0x9d, 0xd7, 0xa0, 0x62, 0xfa, 0xda, 0xec, 0x0d, 0x3d, + 0xb3, 0x9d, 0xd9, 0x29, 0xaa, 0x65, 0xd3, 0x8f, 0xdf, 0x1f, 0x6b, 0x5f, 0x65, 0xa0, 0x9a, 0xfe, + 0x06, 0x80, 0x5b, 0x50, 0xb4, 0x1c, 0x9d, 0xf0, 0xd0, 0x12, 0x1f, 0xa0, 0x76, 0x9e, 0xf3, 0xd9, + 0xa0, 0x7e, 0x14, 0xf2, 0xd5, 0x58, 0x72, 0xeb, 0x6f, 0x12, 0x14, 0x23, 0x18, 0x5f, 0x82, 0x9c, + 0x4b, 0x82, 0x31, 0x57, 0x97, 0xdf, 0xcf, 0x20, 0x49, 0xe5, 0x6d, 0x86, 0xfb, 0x2e, 0xb1, 0x79, + 0x08, 0x84, 0x38, 0x6b, 0xb3, 0x75, 0xb5, 0x28, 0x31, 0xf8, 0xe5, 0xc4, 0x99, 0x4c, 0xa8, 0x1d, + 0xf8, 0xd1, 0xba, 0x86, 0x78, 0x33, 0x84, 0xf1, 0x3b, 0xb0, 0x1e, 0x78, 0xc4, 0xb4, 0x52, 0xdc, + 0x1c, 0xe7, 0xa2, 0xa8, 0x23, 0x26, 0xef, 0xc1, 0x95, 0x48, 0xaf, 0x41, 0x03, 0xa2, 0x8f, 0xa9, + 0x31, 0x13, 0x2a, 0xf0, 0x47, 0x88, 0xcb, 0x21, 0xa1, 0x15, 0xf6, 0x47, 0xb2, 0xb5, 0x6f, 0x24, + 0x58, 0x8f, 0xae, 0x53, 0x46, 0xec, 0xac, 0x63, 0x00, 0x62, 0xdb, 0x4e, 0x90, 0x74, 0xd7, 0x62, + 0x28, 0x2f, 0xc8, 0xd5, 0x1b, 0xb1, 0x90, 0x9a, 0x50, 0xb0, 0x35, 0x01, 0x98, 0xf5, 0x9c, 0xeb, + 0xb6, 0xab, 0x50, 0x0e, 0x3f, 0xf0, 0xf0, 0xaf, 0x84, 0xe2, 0x02, 0x0e, 0x02, 0x62, 0xf7, 0x2e, + 0xbc, 0x09, 0xf9, 0x53, 0x3a, 0x32, 0xed, 0xf0, 0xd9, 0x56, 0x34, 0xa2, 0x67, 0x92, 0x5c, 0xfc, + 0x4c, 0xb2, 0xff, 0x5b, 0x09, 0x36, 0x74, 0x67, 0x32, 0x6f, 0xef, 0x3e, 0x9a, 0x7b, 0x05, 0xf0, + 0x3f, 0x96, 0x3e, 0xff, 0x68, 0x64, 0x06, 0xe3, 0xe9, 0x69, 0x5d, 0x77, 0x26, 0xbb, 0x23, 0xc7, + 0x22, 0xf6, 0x68, 0xf6, 0x99, 0x93, 0xff, 0xd1, 0xdf, 0x1d, 0x51, 0xfb, 0xdd, 0x91, 0x93, 0xf8, + 0xe8, 0x79, 0x7f, 0xf6, 0xf7, 0xbf, 0x92, 0xf4, 0xa7, 0x4c, 0xf6, 0xa0, 0xb7, 0xff, 0xe7, 0xcc, + 0xd6, 0x81, 0x18, 0xae, 0x17, 0xb9, 0x47, 0xa5, 0x43, 0x8b, 0xea, 0x6c, 0xca, 0xff, 0x0b, 0x00, + 0x00, 0xff, 0xff, 0x1a, 0x28, 0x25, 0x79, 0x42, 0x1d, 0x00, 0x00, +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.proto b/api/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.proto new file mode 100644 index 0000000..8697a50 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.proto @@ -0,0 +1,872 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// 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. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// The messages in this file describe the definitions found in .proto files. +// A valid .proto file can be translated directly to a FileDescriptorProto +// without any other information (e.g. without reading its imports). + + +syntax = "proto2"; + +package google.protobuf; +option go_package = "github.com/golang/protobuf/protoc-gen-go/descriptor;descriptor"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "DescriptorProtos"; +option csharp_namespace = "Google.Protobuf.Reflection"; +option objc_class_prefix = "GPB"; +option cc_enable_arenas = true; + +// descriptor.proto must be optimized for speed because reflection-based +// algorithms don't work during bootstrapping. +option optimize_for = SPEED; + +// The protocol compiler can output a FileDescriptorSet containing the .proto +// files it parses. +message FileDescriptorSet { + repeated FileDescriptorProto file = 1; +} + +// Describes a complete .proto file. +message FileDescriptorProto { + optional string name = 1; // file name, relative to root of source tree + optional string package = 2; // e.g. "foo", "foo.bar", etc. + + // Names of files imported by this file. + repeated string dependency = 3; + // Indexes of the public imported files in the dependency list above. + repeated int32 public_dependency = 10; + // Indexes of the weak imported files in the dependency list. + // For Google-internal migration only. Do not use. + repeated int32 weak_dependency = 11; + + // All top-level definitions in this file. + repeated DescriptorProto message_type = 4; + repeated EnumDescriptorProto enum_type = 5; + repeated ServiceDescriptorProto service = 6; + repeated FieldDescriptorProto extension = 7; + + optional FileOptions options = 8; + + // This field contains optional information about the original source code. + // You may safely remove this entire field without harming runtime + // functionality of the descriptors -- the information is needed only by + // development tools. + optional SourceCodeInfo source_code_info = 9; + + // The syntax of the proto file. + // The supported values are "proto2" and "proto3". + optional string syntax = 12; +} + +// Describes a message type. +message DescriptorProto { + optional string name = 1; + + repeated FieldDescriptorProto field = 2; + repeated FieldDescriptorProto extension = 6; + + repeated DescriptorProto nested_type = 3; + repeated EnumDescriptorProto enum_type = 4; + + message ExtensionRange { + optional int32 start = 1; + optional int32 end = 2; + + optional ExtensionRangeOptions options = 3; + } + repeated ExtensionRange extension_range = 5; + + repeated OneofDescriptorProto oneof_decl = 8; + + optional MessageOptions options = 7; + + // Range of reserved tag numbers. Reserved tag numbers may not be used by + // fields or extension ranges in the same message. Reserved ranges may + // not overlap. + message ReservedRange { + optional int32 start = 1; // Inclusive. + optional int32 end = 2; // Exclusive. + } + repeated ReservedRange reserved_range = 9; + // Reserved field names, which may not be used by fields in the same message. + // A given name may only be reserved once. + repeated string reserved_name = 10; +} + +message ExtensionRangeOptions { + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +// Describes a field within a message. +message FieldDescriptorProto { + enum Type { + // 0 is reserved for errors. + // Order is weird for historical reasons. + TYPE_DOUBLE = 1; + TYPE_FLOAT = 2; + // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT64 if + // negative values are likely. + TYPE_INT64 = 3; + TYPE_UINT64 = 4; + // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT32 if + // negative values are likely. + TYPE_INT32 = 5; + TYPE_FIXED64 = 6; + TYPE_FIXED32 = 7; + TYPE_BOOL = 8; + TYPE_STRING = 9; + // Tag-delimited aggregate. + // Group type is deprecated and not supported in proto3. However, Proto3 + // implementations should still be able to parse the group wire format and + // treat group fields as unknown fields. + TYPE_GROUP = 10; + TYPE_MESSAGE = 11; // Length-delimited aggregate. + + // New in version 2. + TYPE_BYTES = 12; + TYPE_UINT32 = 13; + TYPE_ENUM = 14; + TYPE_SFIXED32 = 15; + TYPE_SFIXED64 = 16; + TYPE_SINT32 = 17; // Uses ZigZag encoding. + TYPE_SINT64 = 18; // Uses ZigZag encoding. + }; + + enum Label { + // 0 is reserved for errors + LABEL_OPTIONAL = 1; + LABEL_REQUIRED = 2; + LABEL_REPEATED = 3; + }; + + optional string name = 1; + optional int32 number = 3; + optional Label label = 4; + + // If type_name is set, this need not be set. If both this and type_name + // are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP. + optional Type type = 5; + + // For message and enum types, this is the name of the type. If the name + // starts with a '.', it is fully-qualified. Otherwise, C++-like scoping + // rules are used to find the type (i.e. first the nested types within this + // message are searched, then within the parent, on up to the root + // namespace). + optional string type_name = 6; + + // For extensions, this is the name of the type being extended. It is + // resolved in the same manner as type_name. + optional string extendee = 2; + + // For numeric types, contains the original text representation of the value. + // For booleans, "true" or "false". + // For strings, contains the default text contents (not escaped in any way). + // For bytes, contains the C escaped value. All bytes >= 128 are escaped. + // TODO(kenton): Base-64 encode? + optional string default_value = 7; + + // If set, gives the index of a oneof in the containing type's oneof_decl + // list. This field is a member of that oneof. + optional int32 oneof_index = 9; + + // JSON name of this field. The value is set by protocol compiler. If the + // user has set a "json_name" option on this field, that option's value + // will be used. Otherwise, it's deduced from the field's name by converting + // it to camelCase. + optional string json_name = 10; + + optional FieldOptions options = 8; +} + +// Describes a oneof. +message OneofDescriptorProto { + optional string name = 1; + optional OneofOptions options = 2; +} + +// Describes an enum type. +message EnumDescriptorProto { + optional string name = 1; + + repeated EnumValueDescriptorProto value = 2; + + optional EnumOptions options = 3; + + // Range of reserved numeric values. Reserved values may not be used by + // entries in the same enum. Reserved ranges may not overlap. + // + // Note that this is distinct from DescriptorProto.ReservedRange in that it + // is inclusive such that it can appropriately represent the entire int32 + // domain. + message EnumReservedRange { + optional int32 start = 1; // Inclusive. + optional int32 end = 2; // Inclusive. + } + + // Range of reserved numeric values. Reserved numeric values may not be used + // by enum values in the same enum declaration. Reserved ranges may not + // overlap. + repeated EnumReservedRange reserved_range = 4; + + // Reserved enum value names, which may not be reused. A given name may only + // be reserved once. + repeated string reserved_name = 5; +} + +// Describes a value within an enum. +message EnumValueDescriptorProto { + optional string name = 1; + optional int32 number = 2; + + optional EnumValueOptions options = 3; +} + +// Describes a service. +message ServiceDescriptorProto { + optional string name = 1; + repeated MethodDescriptorProto method = 2; + + optional ServiceOptions options = 3; +} + +// Describes a method of a service. +message MethodDescriptorProto { + optional string name = 1; + + // Input and output type names. These are resolved in the same way as + // FieldDescriptorProto.type_name, but must refer to a message type. + optional string input_type = 2; + optional string output_type = 3; + + optional MethodOptions options = 4; + + // Identifies if client streams multiple client messages + optional bool client_streaming = 5 [default=false]; + // Identifies if server streams multiple server messages + optional bool server_streaming = 6 [default=false]; +} + + +// =================================================================== +// Options + +// Each of the definitions above may have "options" attached. These are +// just annotations which may cause code to be generated slightly differently +// or may contain hints for code that manipulates protocol messages. +// +// Clients may define custom options as extensions of the *Options messages. +// These extensions may not yet be known at parsing time, so the parser cannot +// store the values in them. Instead it stores them in a field in the *Options +// message called uninterpreted_option. This field must have the same name +// across all *Options messages. We then use this field to populate the +// extensions when we build a descriptor, at which point all protos have been +// parsed and so all extensions are known. +// +// Extension numbers for custom options may be chosen as follows: +// * For options which will only be used within a single application or +// organization, or for experimental options, use field numbers 50000 +// through 99999. It is up to you to ensure that you do not use the +// same number for multiple options. +// * For options which will be published and used publicly by multiple +// independent entities, e-mail protobuf-global-extension-registry@google.com +// to reserve extension numbers. Simply provide your project name (e.g. +// Objective-C plugin) and your project website (if available) -- there's no +// need to explain how you intend to use them. Usually you only need one +// extension number. You can declare multiple options with only one extension +// number by putting them in a sub-message. See the Custom Options section of +// the docs for examples: +// https://developers.google.com/protocol-buffers/docs/proto#options +// If this turns out to be popular, a web service will be set up +// to automatically assign option numbers. + + +message FileOptions { + + // Sets the Java package where classes generated from this .proto will be + // placed. By default, the proto package is used, but this is often + // inappropriate because proto packages do not normally start with backwards + // domain names. + optional string java_package = 1; + + + // If set, all the classes from the .proto file are wrapped in a single + // outer class with the given name. This applies to both Proto1 + // (equivalent to the old "--one_java_file" option) and Proto2 (where + // a .proto always translates to a single class, but you may want to + // explicitly choose the class name). + optional string java_outer_classname = 8; + + // If set true, then the Java code generator will generate a separate .java + // file for each top-level message, enum, and service defined in the .proto + // file. Thus, these types will *not* be nested inside the outer class + // named by java_outer_classname. However, the outer class will still be + // generated to contain the file's getDescriptor() method as well as any + // top-level extensions defined in the file. + optional bool java_multiple_files = 10 [default=false]; + + // This option does nothing. + optional bool java_generate_equals_and_hash = 20 [deprecated=true]; + + // If set true, then the Java2 code generator will generate code that + // throws an exception whenever an attempt is made to assign a non-UTF-8 + // byte sequence to a string field. + // Message reflection will do the same. + // However, an extension field still accepts non-UTF-8 byte sequences. + // This option has no effect on when used with the lite runtime. + optional bool java_string_check_utf8 = 27 [default=false]; + + + // Generated classes can be optimized for speed or code size. + enum OptimizeMode { + SPEED = 1; // Generate complete code for parsing, serialization, + // etc. + CODE_SIZE = 2; // Use ReflectionOps to implement these methods. + LITE_RUNTIME = 3; // Generate code using MessageLite and the lite runtime. + } + optional OptimizeMode optimize_for = 9 [default=SPEED]; + + // Sets the Go package where structs generated from this .proto will be + // placed. If omitted, the Go package will be derived from the following: + // - The basename of the package import path, if provided. + // - Otherwise, the package statement in the .proto file, if present. + // - Otherwise, the basename of the .proto file, without extension. + optional string go_package = 11; + + + + // Should generic services be generated in each language? "Generic" services + // are not specific to any particular RPC system. They are generated by the + // main code generators in each language (without additional plugins). + // Generic services were the only kind of service generation supported by + // early versions of google.protobuf. + // + // Generic services are now considered deprecated in favor of using plugins + // that generate code specific to your particular RPC system. Therefore, + // these default to false. Old code which depends on generic services should + // explicitly set them to true. + optional bool cc_generic_services = 16 [default=false]; + optional bool java_generic_services = 17 [default=false]; + optional bool py_generic_services = 18 [default=false]; + optional bool php_generic_services = 42 [default=false]; + + // Is this file deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for everything in the file, or it will be completely ignored; in the very + // least, this is a formalization for deprecating files. + optional bool deprecated = 23 [default=false]; + + // Enables the use of arenas for the proto messages in this file. This applies + // only to generated classes for C++. + optional bool cc_enable_arenas = 31 [default=false]; + + + // Sets the objective c class prefix which is prepended to all objective c + // generated classes from this .proto. There is no default. + optional string objc_class_prefix = 36; + + // Namespace for generated classes; defaults to the package. + optional string csharp_namespace = 37; + + // By default Swift generators will take the proto package and CamelCase it + // replacing '.' with underscore and use that to prefix the types/symbols + // defined. When this options is provided, they will use this value instead + // to prefix the types/symbols defined. + optional string swift_prefix = 39; + + // Sets the php class prefix which is prepended to all php generated classes + // from this .proto. Default is empty. + optional string php_class_prefix = 40; + + // Use this option to change the namespace of php generated classes. Default + // is empty. When this option is empty, the package name will be used for + // determining the namespace. + optional string php_namespace = 41; + + // The parser stores options it doesn't recognize here. + // See the documentation for the "Options" section above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. + // See the documentation for the "Options" section above. + extensions 1000 to max; + + reserved 38; +} + +message MessageOptions { + // Set true to use the old proto1 MessageSet wire format for extensions. + // This is provided for backwards-compatibility with the MessageSet wire + // format. You should not use this for any other reason: It's less + // efficient, has fewer features, and is more complicated. + // + // The message must be defined exactly as follows: + // message Foo { + // option message_set_wire_format = true; + // extensions 4 to max; + // } + // Note that the message cannot have any defined fields; MessageSets only + // have extensions. + // + // All extensions of your type must be singular messages; e.g. they cannot + // be int32s, enums, or repeated messages. + // + // Because this is an option, the above two restrictions are not enforced by + // the protocol compiler. + optional bool message_set_wire_format = 1 [default=false]; + + // Disables the generation of the standard "descriptor()" accessor, which can + // conflict with a field of the same name. This is meant to make migration + // from proto1 easier; new code should avoid fields named "descriptor". + optional bool no_standard_descriptor_accessor = 2 [default=false]; + + // Is this message deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the message, or it will be completely ignored; in the very least, + // this is a formalization for deprecating messages. + optional bool deprecated = 3 [default=false]; + + // Whether the message is an automatically generated map entry type for the + // maps field. + // + // For maps fields: + // map map_field = 1; + // The parsed descriptor looks like: + // message MapFieldEntry { + // option map_entry = true; + // optional KeyType key = 1; + // optional ValueType value = 2; + // } + // repeated MapFieldEntry map_field = 1; + // + // Implementations may choose not to generate the map_entry=true message, but + // use a native map in the target language to hold the keys and values. + // The reflection APIs in such implementions still need to work as + // if the field is a repeated message field. + // + // NOTE: Do not set the option in .proto files. Always use the maps syntax + // instead. The option should only be implicitly set by the proto compiler + // parser. + optional bool map_entry = 7; + + reserved 8; // javalite_serializable + reserved 9; // javanano_as_lite + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message FieldOptions { + // The ctype option instructs the C++ code generator to use a different + // representation of the field than it normally would. See the specific + // options below. This option is not yet implemented in the open source + // release -- sorry, we'll try to include it in a future version! + optional CType ctype = 1 [default = STRING]; + enum CType { + // Default mode. + STRING = 0; + + CORD = 1; + + STRING_PIECE = 2; + } + // The packed option can be enabled for repeated primitive fields to enable + // a more efficient representation on the wire. Rather than repeatedly + // writing the tag and type for each element, the entire array is encoded as + // a single length-delimited blob. In proto3, only explicit setting it to + // false will avoid using packed encoding. + optional bool packed = 2; + + // The jstype option determines the JavaScript type used for values of the + // field. The option is permitted only for 64 bit integral and fixed types + // (int64, uint64, sint64, fixed64, sfixed64). A field with jstype JS_STRING + // is represented as JavaScript string, which avoids loss of precision that + // can happen when a large value is converted to a floating point JavaScript. + // Specifying JS_NUMBER for the jstype causes the generated JavaScript code to + // use the JavaScript "number" type. The behavior of the default option + // JS_NORMAL is implementation dependent. + // + // This option is an enum to permit additional types to be added, e.g. + // goog.math.Integer. + optional JSType jstype = 6 [default = JS_NORMAL]; + enum JSType { + // Use the default type. + JS_NORMAL = 0; + + // Use JavaScript strings. + JS_STRING = 1; + + // Use JavaScript numbers. + JS_NUMBER = 2; + } + + // Should this field be parsed lazily? Lazy applies only to message-type + // fields. It means that when the outer message is initially parsed, the + // inner message's contents will not be parsed but instead stored in encoded + // form. The inner message will actually be parsed when it is first accessed. + // + // This is only a hint. Implementations are free to choose whether to use + // eager or lazy parsing regardless of the value of this option. However, + // setting this option true suggests that the protocol author believes that + // using lazy parsing on this field is worth the additional bookkeeping + // overhead typically needed to implement it. + // + // This option does not affect the public interface of any generated code; + // all method signatures remain the same. Furthermore, thread-safety of the + // interface is not affected by this option; const methods remain safe to + // call from multiple threads concurrently, while non-const methods continue + // to require exclusive access. + // + // + // Note that implementations may choose not to check required fields within + // a lazy sub-message. That is, calling IsInitialized() on the outer message + // may return true even if the inner message has missing required fields. + // This is necessary because otherwise the inner message would have to be + // parsed in order to perform the check, defeating the purpose of lazy + // parsing. An implementation which chooses not to check required fields + // must be consistent about it. That is, for any particular sub-message, the + // implementation must either *always* check its required fields, or *never* + // check its required fields, regardless of whether or not the message has + // been parsed. + optional bool lazy = 5 [default=false]; + + // Is this field deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for accessors, or it will be completely ignored; in the very least, this + // is a formalization for deprecating fields. + optional bool deprecated = 3 [default=false]; + + // For Google-internal migration only. Do not use. + optional bool weak = 10 [default=false]; + + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; + + reserved 4; // removed jtype +} + +message OneofOptions { + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message EnumOptions { + + // Set this option to true to allow mapping different tag names to the same + // value. + optional bool allow_alias = 2; + + // Is this enum deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the enum, or it will be completely ignored; in the very least, this + // is a formalization for deprecating enums. + optional bool deprecated = 3 [default=false]; + + reserved 5; // javanano_as_lite + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message EnumValueOptions { + // Is this enum value deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the enum value, or it will be completely ignored; in the very least, + // this is a formalization for deprecating enum values. + optional bool deprecated = 1 [default=false]; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message ServiceOptions { + + // Note: Field numbers 1 through 32 are reserved for Google's internal RPC + // framework. We apologize for hoarding these numbers to ourselves, but + // we were already using them long before we decided to release Protocol + // Buffers. + + // Is this service deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the service, or it will be completely ignored; in the very least, + // this is a formalization for deprecating services. + optional bool deprecated = 33 [default=false]; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message MethodOptions { + + // Note: Field numbers 1 through 32 are reserved for Google's internal RPC + // framework. We apologize for hoarding these numbers to ourselves, but + // we were already using them long before we decided to release Protocol + // Buffers. + + // Is this method deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the method, or it will be completely ignored; in the very least, + // this is a formalization for deprecating methods. + optional bool deprecated = 33 [default=false]; + + // Is this method side-effect-free (or safe in HTTP parlance), or idempotent, + // or neither? HTTP based RPC implementation may choose GET verb for safe + // methods, and PUT verb for idempotent methods instead of the default POST. + enum IdempotencyLevel { + IDEMPOTENCY_UNKNOWN = 0; + NO_SIDE_EFFECTS = 1; // implies idempotent + IDEMPOTENT = 2; // idempotent, but may have side effects + } + optional IdempotencyLevel idempotency_level = + 34 [default=IDEMPOTENCY_UNKNOWN]; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + + +// A message representing a option the parser does not recognize. This only +// appears in options protos created by the compiler::Parser class. +// DescriptorPool resolves these when building Descriptor objects. Therefore, +// options protos in descriptor objects (e.g. returned by Descriptor::options(), +// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions +// in them. +message UninterpretedOption { + // The name of the uninterpreted option. Each string represents a segment in + // a dot-separated name. is_extension is true iff a segment represents an + // extension (denoted with parentheses in options specs in .proto files). + // E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents + // "foo.(bar.baz).qux". + message NamePart { + required string name_part = 1; + required bool is_extension = 2; + } + repeated NamePart name = 2; + + // The value of the uninterpreted option, in whatever type the tokenizer + // identified it as during parsing. Exactly one of these should be set. + optional string identifier_value = 3; + optional uint64 positive_int_value = 4; + optional int64 negative_int_value = 5; + optional double double_value = 6; + optional bytes string_value = 7; + optional string aggregate_value = 8; +} + +// =================================================================== +// Optional source code info + +// Encapsulates information about the original source file from which a +// FileDescriptorProto was generated. +message SourceCodeInfo { + // A Location identifies a piece of source code in a .proto file which + // corresponds to a particular definition. This information is intended + // to be useful to IDEs, code indexers, documentation generators, and similar + // tools. + // + // For example, say we have a file like: + // message Foo { + // optional string foo = 1; + // } + // Let's look at just the field definition: + // optional string foo = 1; + // ^ ^^ ^^ ^ ^^^ + // a bc de f ghi + // We have the following locations: + // span path represents + // [a,i) [ 4, 0, 2, 0 ] The whole field definition. + // [a,b) [ 4, 0, 2, 0, 4 ] The label (optional). + // [c,d) [ 4, 0, 2, 0, 5 ] The type (string). + // [e,f) [ 4, 0, 2, 0, 1 ] The name (foo). + // [g,h) [ 4, 0, 2, 0, 3 ] The number (1). + // + // Notes: + // - A location may refer to a repeated field itself (i.e. not to any + // particular index within it). This is used whenever a set of elements are + // logically enclosed in a single code segment. For example, an entire + // extend block (possibly containing multiple extension definitions) will + // have an outer location whose path refers to the "extensions" repeated + // field without an index. + // - Multiple locations may have the same path. This happens when a single + // logical declaration is spread out across multiple places. The most + // obvious example is the "extend" block again -- there may be multiple + // extend blocks in the same scope, each of which will have the same path. + // - A location's span is not always a subset of its parent's span. For + // example, the "extendee" of an extension declaration appears at the + // beginning of the "extend" block and is shared by all extensions within + // the block. + // - Just because a location's span is a subset of some other location's span + // does not mean that it is a descendent. For example, a "group" defines + // both a type and a field in a single declaration. Thus, the locations + // corresponding to the type and field and their components will overlap. + // - Code which tries to interpret locations should probably be designed to + // ignore those that it doesn't understand, as more types of locations could + // be recorded in the future. + repeated Location location = 1; + message Location { + // Identifies which part of the FileDescriptorProto was defined at this + // location. + // + // Each element is a field number or an index. They form a path from + // the root FileDescriptorProto to the place where the definition. For + // example, this path: + // [ 4, 3, 2, 7, 1 ] + // refers to: + // file.message_type(3) // 4, 3 + // .field(7) // 2, 7 + // .name() // 1 + // This is because FileDescriptorProto.message_type has field number 4: + // repeated DescriptorProto message_type = 4; + // and DescriptorProto.field has field number 2: + // repeated FieldDescriptorProto field = 2; + // and FieldDescriptorProto.name has field number 1: + // optional string name = 1; + // + // Thus, the above path gives the location of a field name. If we removed + // the last element: + // [ 4, 3, 2, 7 ] + // this path refers to the whole field declaration (from the beginning + // of the label to the terminating semicolon). + repeated int32 path = 1 [packed=true]; + + // Always has exactly three or four elements: start line, start column, + // end line (optional, otherwise assumed same as start line), end column. + // These are packed into a single field for efficiency. Note that line + // and column numbers are zero-based -- typically you will want to add + // 1 to each before displaying to a user. + repeated int32 span = 2 [packed=true]; + + // If this SourceCodeInfo represents a complete declaration, these are any + // comments appearing before and after the declaration which appear to be + // attached to the declaration. + // + // A series of line comments appearing on consecutive lines, with no other + // tokens appearing on those lines, will be treated as a single comment. + // + // leading_detached_comments will keep paragraphs of comments that appear + // before (but not connected to) the current element. Each paragraph, + // separated by empty lines, will be one comment element in the repeated + // field. + // + // Only the comment content is provided; comment markers (e.g. //) are + // stripped out. For block comments, leading whitespace and an asterisk + // will be stripped from the beginning of each line other than the first. + // Newlines are included in the output. + // + // Examples: + // + // optional int32 foo = 1; // Comment attached to foo. + // // Comment attached to bar. + // optional int32 bar = 2; + // + // optional string baz = 3; + // // Comment attached to baz. + // // Another line attached to baz. + // + // // Comment attached to qux. + // // + // // Another line attached to qux. + // optional double qux = 4; + // + // // Detached comment for corge. This is not leading or trailing comments + // // to qux or corge because there are blank lines separating it from + // // both. + // + // // Detached comment for corge paragraph 2. + // + // optional string corge = 5; + // /* Block comment attached + // * to corge. Leading asterisks + // * will be removed. */ + // /* Block comment attached to + // * grault. */ + // optional int32 grault = 6; + // + // // ignored detached comments. + optional string leading_comments = 3; + optional string trailing_comments = 4; + repeated string leading_detached_comments = 6; + } +} + +// Describes the relationship between generated code and its original source +// file. A GeneratedCodeInfo message is associated with only one generated +// source file, but may contain references to different source .proto files. +message GeneratedCodeInfo { + // An Annotation connects some span of text in generated code to an element + // of its generating .proto file. + repeated Annotation annotation = 1; + message Annotation { + // Identifies the element in the original source .proto file. This field + // is formatted the same as SourceCodeInfo.Location.path. + repeated int32 path = 1 [packed=true]; + + // Identifies the filesystem path to the original source .proto. + optional string source_file = 2; + + // Identifies the starting offset in bytes in the generated code + // that relates to the identified object. + optional int32 begin = 3; + + // Identifies the ending offset in bytes in the generated code that + // relates to the identified offset. The end offset should be one past + // the last relevant byte (so the length of the text = end - begin). + optional int32 end = 4; + } +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/doc.go b/api/vendor/github.com/golang/protobuf/protoc-gen-go/doc.go new file mode 100644 index 0000000..0d6055d --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/doc.go @@ -0,0 +1,51 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +/* + A plugin for the Google protocol buffer compiler to generate Go code. + Run it by building this program and putting it in your path with the name + protoc-gen-go + That word 'go' at the end becomes part of the option string set for the + protocol compiler, so once the protocol compiler (protoc) is installed + you can run + protoc --go_out=output_directory input_directory/file.proto + to generate Go bindings for the protocol defined by file.proto. + With that input, the output will be written to + output_directory/file.pb.go + + The generated code is documented in the package comment for + the library. + + See the README and documentation for protocol buffers to learn more: + https://developers.google.com/protocol-buffers/ + +*/ +package documentation diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/generator/generator.go b/api/vendor/github.com/golang/protobuf/protoc-gen-go/generator/generator.go new file mode 100644 index 0000000..e0aba85 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/generator/generator.go @@ -0,0 +1,2928 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +/* + The code generator for the plugin for the Google protocol buffer compiler. + It generates Go code from the protocol buffer description files read by the + main routine. +*/ +package generator + +import ( + "bufio" + "bytes" + "compress/gzip" + "crypto/sha256" + "encoding/hex" + "fmt" + "go/build" + "go/parser" + "go/printer" + "go/token" + "log" + "os" + "path" + "sort" + "strconv" + "strings" + "unicode" + "unicode/utf8" + + "github.com/golang/protobuf/proto" + "github.com/golang/protobuf/protoc-gen-go/generator/internal/remap" + + "github.com/golang/protobuf/protoc-gen-go/descriptor" + plugin "github.com/golang/protobuf/protoc-gen-go/plugin" +) + +// generatedCodeVersion indicates a version of the generated code. +// It is incremented whenever an incompatibility between the generated code and +// proto package is introduced; the generated code references +// a constant, proto.ProtoPackageIsVersionN (where N is generatedCodeVersion). +const generatedCodeVersion = 2 + +// A Plugin provides functionality to add to the output during Go code generation, +// such as to produce RPC stubs. +type Plugin interface { + // Name identifies the plugin. + Name() string + // Init is called once after data structures are built but before + // code generation begins. + Init(g *Generator) + // Generate produces the code generated by the plugin for this file, + // except for the imports, by calling the generator's methods P, In, and Out. + Generate(file *FileDescriptor) + // GenerateImports produces the import declarations for this file. + // It is called after Generate. + GenerateImports(file *FileDescriptor) +} + +var plugins []Plugin + +// RegisterPlugin installs a (second-order) plugin to be run when the Go output is generated. +// It is typically called during initialization. +func RegisterPlugin(p Plugin) { + plugins = append(plugins, p) +} + +// A GoImportPath is the import path of a Go package. e.g., "google.golang.org/genproto/protobuf". +type GoImportPath string + +func (p GoImportPath) String() string { return strconv.Quote(string(p)) } + +// A GoPackageName is the name of a Go package. e.g., "protobuf". +type GoPackageName string + +// Each type we import as a protocol buffer (other than FileDescriptorProto) needs +// a pointer to the FileDescriptorProto that represents it. These types achieve that +// wrapping by placing each Proto inside a struct with the pointer to its File. The +// structs have the same names as their contents, with "Proto" removed. +// FileDescriptor is used to store the things that it points to. + +// The file and package name method are common to messages and enums. +type common struct { + file *FileDescriptor // File this object comes from. +} + +// GoImportPath is the import path of the Go package containing the type. +func (c *common) GoImportPath() GoImportPath { + return c.file.importPath +} + +func (c *common) File() *FileDescriptor { return c.file } + +func fileIsProto3(file *descriptor.FileDescriptorProto) bool { + return file.GetSyntax() == "proto3" +} + +func (c *common) proto3() bool { return fileIsProto3(c.file.FileDescriptorProto) } + +// Descriptor represents a protocol buffer message. +type Descriptor struct { + common + *descriptor.DescriptorProto + parent *Descriptor // The containing message, if any. + nested []*Descriptor // Inner messages, if any. + enums []*EnumDescriptor // Inner enums, if any. + ext []*ExtensionDescriptor // Extensions, if any. + typename []string // Cached typename vector. + index int // The index into the container, whether the file or another message. + path string // The SourceCodeInfo path as comma-separated integers. + group bool +} + +// TypeName returns the elements of the dotted type name. +// The package name is not part of this name. +func (d *Descriptor) TypeName() []string { + if d.typename != nil { + return d.typename + } + n := 0 + for parent := d; parent != nil; parent = parent.parent { + n++ + } + s := make([]string, n) + for parent := d; parent != nil; parent = parent.parent { + n-- + s[n] = parent.GetName() + } + d.typename = s + return s +} + +// EnumDescriptor describes an enum. If it's at top level, its parent will be nil. +// Otherwise it will be the descriptor of the message in which it is defined. +type EnumDescriptor struct { + common + *descriptor.EnumDescriptorProto + parent *Descriptor // The containing message, if any. + typename []string // Cached typename vector. + index int // The index into the container, whether the file or a message. + path string // The SourceCodeInfo path as comma-separated integers. +} + +// TypeName returns the elements of the dotted type name. +// The package name is not part of this name. +func (e *EnumDescriptor) TypeName() (s []string) { + if e.typename != nil { + return e.typename + } + name := e.GetName() + if e.parent == nil { + s = make([]string, 1) + } else { + pname := e.parent.TypeName() + s = make([]string, len(pname)+1) + copy(s, pname) + } + s[len(s)-1] = name + e.typename = s + return s +} + +// Everything but the last element of the full type name, CamelCased. +// The values of type Foo.Bar are call Foo_value1... not Foo_Bar_value1... . +func (e *EnumDescriptor) prefix() string { + if e.parent == nil { + // If the enum is not part of a message, the prefix is just the type name. + return CamelCase(*e.Name) + "_" + } + typeName := e.TypeName() + return CamelCaseSlice(typeName[0:len(typeName)-1]) + "_" +} + +// The integer value of the named constant in this enumerated type. +func (e *EnumDescriptor) integerValueAsString(name string) string { + for _, c := range e.Value { + if c.GetName() == name { + return fmt.Sprint(c.GetNumber()) + } + } + log.Fatal("cannot find value for enum constant") + return "" +} + +// ExtensionDescriptor describes an extension. If it's at top level, its parent will be nil. +// Otherwise it will be the descriptor of the message in which it is defined. +type ExtensionDescriptor struct { + common + *descriptor.FieldDescriptorProto + parent *Descriptor // The containing message, if any. +} + +// TypeName returns the elements of the dotted type name. +// The package name is not part of this name. +func (e *ExtensionDescriptor) TypeName() (s []string) { + name := e.GetName() + if e.parent == nil { + // top-level extension + s = make([]string, 1) + } else { + pname := e.parent.TypeName() + s = make([]string, len(pname)+1) + copy(s, pname) + } + s[len(s)-1] = name + return s +} + +// DescName returns the variable name used for the generated descriptor. +func (e *ExtensionDescriptor) DescName() string { + // The full type name. + typeName := e.TypeName() + // Each scope of the extension is individually CamelCased, and all are joined with "_" with an "E_" prefix. + for i, s := range typeName { + typeName[i] = CamelCase(s) + } + return "E_" + strings.Join(typeName, "_") +} + +// ImportedDescriptor describes a type that has been publicly imported from another file. +type ImportedDescriptor struct { + common + o Object +} + +func (id *ImportedDescriptor) TypeName() []string { return id.o.TypeName() } + +// FileDescriptor describes an protocol buffer descriptor file (.proto). +// It includes slices of all the messages and enums defined within it. +// Those slices are constructed by WrapTypes. +type FileDescriptor struct { + *descriptor.FileDescriptorProto + desc []*Descriptor // All the messages defined in this file. + enum []*EnumDescriptor // All the enums defined in this file. + ext []*ExtensionDescriptor // All the top-level extensions defined in this file. + imp []*ImportedDescriptor // All types defined in files publicly imported by this file. + + // Comments, stored as a map of path (comma-separated integers) to the comment. + comments map[string]*descriptor.SourceCodeInfo_Location + + // The full list of symbols that are exported, + // as a map from the exported object to its symbols. + // This is used for supporting public imports. + exported map[Object][]symbol + + fingerprint string // Fingerprint of this file's contents. + importPath GoImportPath // Import path of this file's package. + packageName GoPackageName // Name of this file's Go package. + + proto3 bool // whether to generate proto3 code for this file +} + +// VarName is the variable name we'll use in the generated code to refer +// to the compressed bytes of this descriptor. It is not exported, so +// it is only valid inside the generated package. +func (d *FileDescriptor) VarName() string { + name := strings.Map(badToUnderscore, baseName(d.GetName())) + return fmt.Sprintf("fileDescriptor_%s_%s", name, d.fingerprint) +} + +// goPackageOption interprets the file's go_package option. +// If there is no go_package, it returns ("", "", false). +// If there's a simple name, it returns ("", pkg, true). +// If the option implies an import path, it returns (impPath, pkg, true). +func (d *FileDescriptor) goPackageOption() (impPath GoImportPath, pkg GoPackageName, ok bool) { + opt := d.GetOptions().GetGoPackage() + if opt == "" { + return "", "", false + } + // A semicolon-delimited suffix delimits the import path and package name. + sc := strings.Index(opt, ";") + if sc >= 0 { + return GoImportPath(opt[:sc]), cleanPackageName(opt[sc+1:]), true + } + // The presence of a slash implies there's an import path. + slash := strings.LastIndex(opt, "/") + if slash >= 0 { + return GoImportPath(opt), cleanPackageName(opt[slash+1:]), true + } + return "", cleanPackageName(opt), true +} + +// goFileName returns the output name for the generated Go file. +func (d *FileDescriptor) goFileName(pathType pathType) string { + name := *d.Name + if ext := path.Ext(name); ext == ".proto" || ext == ".protodevel" { + name = name[:len(name)-len(ext)] + } + name += ".pb.go" + + if pathType == pathTypeSourceRelative { + return name + } + + // Does the file have a "go_package" option? + // If it does, it may override the filename. + if impPath, _, ok := d.goPackageOption(); ok && impPath != "" { + // Replace the existing dirname with the declared import path. + _, name = path.Split(name) + name = path.Join(string(impPath), name) + return name + } + + return name +} + +func (d *FileDescriptor) addExport(obj Object, sym symbol) { + d.exported[obj] = append(d.exported[obj], sym) +} + +// symbol is an interface representing an exported Go symbol. +type symbol interface { + // GenerateAlias should generate an appropriate alias + // for the symbol from the named package. + GenerateAlias(g *Generator, pkg GoPackageName) +} + +type messageSymbol struct { + sym string + hasExtensions, isMessageSet bool + oneofTypes []string +} + +type getterSymbol struct { + name string + typ string + typeName string // canonical name in proto world; empty for proto.Message and similar + genType bool // whether typ contains a generated type (message/group/enum) +} + +func (ms *messageSymbol) GenerateAlias(g *Generator, pkg GoPackageName) { + g.P("type ", ms.sym, " = ", pkg, ".", ms.sym) + for _, name := range ms.oneofTypes { + g.P("type ", name, " = ", pkg, ".", name) + } +} + +type enumSymbol struct { + name string + proto3 bool // Whether this came from a proto3 file. +} + +func (es enumSymbol) GenerateAlias(g *Generator, pkg GoPackageName) { + s := es.name + g.P("type ", s, " = ", pkg, ".", s) + g.P("var ", s, "_name = ", pkg, ".", s, "_name") + g.P("var ", s, "_value = ", pkg, ".", s, "_value") +} + +type constOrVarSymbol struct { + sym string + typ string // either "const" or "var" + cast string // if non-empty, a type cast is required (used for enums) +} + +func (cs constOrVarSymbol) GenerateAlias(g *Generator, pkg GoPackageName) { + v := string(pkg) + "." + cs.sym + if cs.cast != "" { + v = cs.cast + "(" + v + ")" + } + g.P(cs.typ, " ", cs.sym, " = ", v) +} + +// Object is an interface abstracting the abilities shared by enums, messages, extensions and imported objects. +type Object interface { + GoImportPath() GoImportPath + TypeName() []string + File() *FileDescriptor +} + +// Generator is the type whose methods generate the output, stored in the associated response structure. +type Generator struct { + *bytes.Buffer + + Request *plugin.CodeGeneratorRequest // The input. + Response *plugin.CodeGeneratorResponse // The output. + + Param map[string]string // Command-line parameters. + PackageImportPath string // Go import path of the package we're generating code for + ImportPrefix string // String to prefix to imported package file names. + ImportMap map[string]string // Mapping from .proto file name to import path + + Pkg map[string]string // The names under which we import support packages + + outputImportPath GoImportPath // Package we're generating code for. + allFiles []*FileDescriptor // All files in the tree + allFilesByName map[string]*FileDescriptor // All files by filename. + genFiles []*FileDescriptor // Those files we will generate output for. + file *FileDescriptor // The file we are compiling now. + packageNames map[GoImportPath]GoPackageName // Imported package names in the current file. + usedPackages map[GoImportPath]bool // Packages used in current file. + usedPackageNames map[GoPackageName]bool // Package names used in the current file. + typeNameToObject map[string]Object // Key is a fully-qualified name in input syntax. + init []string // Lines to emit in the init function. + indent string + pathType pathType // How to generate output filenames. + writeOutput bool + annotateCode bool // whether to store annotations + annotations []*descriptor.GeneratedCodeInfo_Annotation // annotations to store +} + +type pathType int + +const ( + pathTypeImport pathType = iota + pathTypeSourceRelative +) + +// New creates a new generator and allocates the request and response protobufs. +func New() *Generator { + g := new(Generator) + g.Buffer = new(bytes.Buffer) + g.Request = new(plugin.CodeGeneratorRequest) + g.Response = new(plugin.CodeGeneratorResponse) + return g +} + +// Error reports a problem, including an error, and exits the program. +func (g *Generator) Error(err error, msgs ...string) { + s := strings.Join(msgs, " ") + ":" + err.Error() + log.Print("protoc-gen-go: error:", s) + os.Exit(1) +} + +// Fail reports a problem and exits the program. +func (g *Generator) Fail(msgs ...string) { + s := strings.Join(msgs, " ") + log.Print("protoc-gen-go: error:", s) + os.Exit(1) +} + +// CommandLineParameters breaks the comma-separated list of key=value pairs +// in the parameter (a member of the request protobuf) into a key/value map. +// It then sets file name mappings defined by those entries. +func (g *Generator) CommandLineParameters(parameter string) { + g.Param = make(map[string]string) + for _, p := range strings.Split(parameter, ",") { + if i := strings.Index(p, "="); i < 0 { + g.Param[p] = "" + } else { + g.Param[p[0:i]] = p[i+1:] + } + } + + g.ImportMap = make(map[string]string) + pluginList := "none" // Default list of plugin names to enable (empty means all). + for k, v := range g.Param { + switch k { + case "import_prefix": + g.ImportPrefix = v + case "import_path": + g.PackageImportPath = v + case "paths": + switch v { + case "import": + g.pathType = pathTypeImport + case "source_relative": + g.pathType = pathTypeSourceRelative + default: + g.Fail(fmt.Sprintf(`Unknown path type %q: want "import" or "source_relative".`, v)) + } + case "plugins": + pluginList = v + case "annotate_code": + if v == "true" { + g.annotateCode = true + } + default: + if len(k) > 0 && k[0] == 'M' { + g.ImportMap[k[1:]] = v + } + } + } + if pluginList != "" { + // Amend the set of plugins. + enabled := make(map[string]bool) + for _, name := range strings.Split(pluginList, "+") { + enabled[name] = true + } + var nplugins []Plugin + for _, p := range plugins { + if enabled[p.Name()] { + nplugins = append(nplugins, p) + } + } + plugins = nplugins + } +} + +// DefaultPackageName returns the package name printed for the object. +// If its file is in a different package, it returns the package name we're using for this file, plus ".". +// Otherwise it returns the empty string. +func (g *Generator) DefaultPackageName(obj Object) string { + importPath := obj.GoImportPath() + if importPath == g.outputImportPath { + return "" + } + return string(g.GoPackageName(importPath)) + "." +} + +// GoPackageName returns the name used for a package. +func (g *Generator) GoPackageName(importPath GoImportPath) GoPackageName { + if name, ok := g.packageNames[importPath]; ok { + return name + } + name := cleanPackageName(baseName(string(importPath))) + for i, orig := 1, name; g.usedPackageNames[name]; i++ { + name = orig + GoPackageName(strconv.Itoa(i)) + } + g.packageNames[importPath] = name + g.usedPackageNames[name] = true + return name +} + +var globalPackageNames = map[GoPackageName]bool{ + "fmt": true, + "math": true, + "proto": true, +} + +// Create and remember a guaranteed unique package name. Pkg is the candidate name. +// The FileDescriptor parameter is unused. +func RegisterUniquePackageName(pkg string, f *FileDescriptor) string { + name := cleanPackageName(pkg) + for i, orig := 1, name; globalPackageNames[name]; i++ { + name = orig + GoPackageName(strconv.Itoa(i)) + } + globalPackageNames[name] = true + return string(name) +} + +var isGoKeyword = map[string]bool{ + "break": true, + "case": true, + "chan": true, + "const": true, + "continue": true, + "default": true, + "else": true, + "defer": true, + "fallthrough": true, + "for": true, + "func": true, + "go": true, + "goto": true, + "if": true, + "import": true, + "interface": true, + "map": true, + "package": true, + "range": true, + "return": true, + "select": true, + "struct": true, + "switch": true, + "type": true, + "var": true, +} + +func cleanPackageName(name string) GoPackageName { + name = strings.Map(badToUnderscore, name) + // Identifier must not be keyword: insert _. + if isGoKeyword[name] { + name = "_" + name + } + // Identifier must not begin with digit: insert _. + if r, _ := utf8.DecodeRuneInString(name); unicode.IsDigit(r) { + name = "_" + name + } + return GoPackageName(name) +} + +// defaultGoPackage returns the package name to use, +// derived from the import path of the package we're building code for. +func (g *Generator) defaultGoPackage() GoPackageName { + p := g.PackageImportPath + if i := strings.LastIndex(p, "/"); i >= 0 { + p = p[i+1:] + } + return cleanPackageName(p) +} + +// SetPackageNames sets the package name for this run. +// The package name must agree across all files being generated. +// It also defines unique package names for all imported files. +func (g *Generator) SetPackageNames() { + g.outputImportPath = g.genFiles[0].importPath + + defaultPackageNames := make(map[GoImportPath]GoPackageName) + for _, f := range g.genFiles { + if _, p, ok := f.goPackageOption(); ok { + defaultPackageNames[f.importPath] = p + } + } + for _, f := range g.genFiles { + if _, p, ok := f.goPackageOption(); ok { + // Source file: option go_package = "quux/bar"; + f.packageName = p + } else if p, ok := defaultPackageNames[f.importPath]; ok { + // A go_package option in another file in the same package. + // + // This is a poor choice in general, since every source file should + // contain a go_package option. Supported mainly for historical + // compatibility. + f.packageName = p + } else if p := g.defaultGoPackage(); p != "" { + // Command-line: import_path=quux/bar. + // + // The import_path flag sets a package name for files which don't + // contain a go_package option. + f.packageName = p + } else if p := f.GetPackage(); p != "" { + // Source file: package quux.bar; + f.packageName = cleanPackageName(p) + } else { + // Source filename. + f.packageName = cleanPackageName(baseName(f.GetName())) + } + } + + // Check that all files have a consistent package name and import path. + for _, f := range g.genFiles[1:] { + if a, b := g.genFiles[0].importPath, f.importPath; a != b { + g.Fail(fmt.Sprintf("inconsistent package import paths: %v, %v", a, b)) + } + if a, b := g.genFiles[0].packageName, f.packageName; a != b { + g.Fail(fmt.Sprintf("inconsistent package names: %v, %v", a, b)) + } + } + + // Names of support packages. These never vary (if there are conflicts, + // we rename the conflicting package), so this could be removed someday. + g.Pkg = map[string]string{ + "fmt": "fmt", + "math": "math", + "proto": "proto", + } +} + +// WrapTypes walks the incoming data, wrapping DescriptorProtos, EnumDescriptorProtos +// and FileDescriptorProtos into file-referenced objects within the Generator. +// It also creates the list of files to generate and so should be called before GenerateAllFiles. +func (g *Generator) WrapTypes() { + g.allFiles = make([]*FileDescriptor, 0, len(g.Request.ProtoFile)) + g.allFilesByName = make(map[string]*FileDescriptor, len(g.allFiles)) + genFileNames := make(map[string]bool) + for _, n := range g.Request.FileToGenerate { + genFileNames[n] = true + } + for _, f := range g.Request.ProtoFile { + fd := &FileDescriptor{ + FileDescriptorProto: f, + exported: make(map[Object][]symbol), + proto3: fileIsProto3(f), + } + // The import path may be set in a number of ways. + if substitution, ok := g.ImportMap[f.GetName()]; ok { + // Command-line: M=foo.proto=quux/bar. + // + // Explicit mapping of source file to import path. + fd.importPath = GoImportPath(substitution) + } else if genFileNames[f.GetName()] && g.PackageImportPath != "" { + // Command-line: import_path=quux/bar. + // + // The import_path flag sets the import path for every file that + // we generate code for. + fd.importPath = GoImportPath(g.PackageImportPath) + } else if p, _, _ := fd.goPackageOption(); p != "" { + // Source file: option go_package = "quux/bar"; + // + // The go_package option sets the import path. Most users should use this. + fd.importPath = p + } else { + // Source filename. + // + // Last resort when nothing else is available. + fd.importPath = GoImportPath(path.Dir(f.GetName())) + } + // We must wrap the descriptors before we wrap the enums + fd.desc = wrapDescriptors(fd) + g.buildNestedDescriptors(fd.desc) + fd.enum = wrapEnumDescriptors(fd, fd.desc) + g.buildNestedEnums(fd.desc, fd.enum) + fd.ext = wrapExtensions(fd) + extractComments(fd) + g.allFiles = append(g.allFiles, fd) + g.allFilesByName[f.GetName()] = fd + } + for _, fd := range g.allFiles { + fd.imp = wrapImported(fd, g) + } + + g.genFiles = make([]*FileDescriptor, 0, len(g.Request.FileToGenerate)) + for _, fileName := range g.Request.FileToGenerate { + fd := g.allFilesByName[fileName] + if fd == nil { + g.Fail("could not find file named", fileName) + } + fingerprint, err := fingerprintProto(fd.FileDescriptorProto) + if err != nil { + g.Error(err) + } + fd.fingerprint = fingerprint + g.genFiles = append(g.genFiles, fd) + } +} + +// fingerprintProto returns a fingerprint for a message. +// The fingerprint is intended to prevent conflicts between generated fileds, +// not to provide cryptographic security. +func fingerprintProto(m proto.Message) (string, error) { + b, err := proto.Marshal(m) + if err != nil { + return "", err + } + h := sha256.Sum256(b) + return hex.EncodeToString(h[:8]), nil +} + +// Scan the descriptors in this file. For each one, build the slice of nested descriptors +func (g *Generator) buildNestedDescriptors(descs []*Descriptor) { + for _, desc := range descs { + if len(desc.NestedType) != 0 { + for _, nest := range descs { + if nest.parent == desc { + desc.nested = append(desc.nested, nest) + } + } + if len(desc.nested) != len(desc.NestedType) { + g.Fail("internal error: nesting failure for", desc.GetName()) + } + } + } +} + +func (g *Generator) buildNestedEnums(descs []*Descriptor, enums []*EnumDescriptor) { + for _, desc := range descs { + if len(desc.EnumType) != 0 { + for _, enum := range enums { + if enum.parent == desc { + desc.enums = append(desc.enums, enum) + } + } + if len(desc.enums) != len(desc.EnumType) { + g.Fail("internal error: enum nesting failure for", desc.GetName()) + } + } + } +} + +// Construct the Descriptor +func newDescriptor(desc *descriptor.DescriptorProto, parent *Descriptor, file *FileDescriptor, index int) *Descriptor { + d := &Descriptor{ + common: common{file}, + DescriptorProto: desc, + parent: parent, + index: index, + } + if parent == nil { + d.path = fmt.Sprintf("%d,%d", messagePath, index) + } else { + d.path = fmt.Sprintf("%s,%d,%d", parent.path, messageMessagePath, index) + } + + // The only way to distinguish a group from a message is whether + // the containing message has a TYPE_GROUP field that matches. + if parent != nil { + parts := d.TypeName() + if file.Package != nil { + parts = append([]string{*file.Package}, parts...) + } + exp := "." + strings.Join(parts, ".") + for _, field := range parent.Field { + if field.GetType() == descriptor.FieldDescriptorProto_TYPE_GROUP && field.GetTypeName() == exp { + d.group = true + break + } + } + } + + for _, field := range desc.Extension { + d.ext = append(d.ext, &ExtensionDescriptor{common{file}, field, d}) + } + + return d +} + +// Return a slice of all the Descriptors defined within this file +func wrapDescriptors(file *FileDescriptor) []*Descriptor { + sl := make([]*Descriptor, 0, len(file.MessageType)+10) + for i, desc := range file.MessageType { + sl = wrapThisDescriptor(sl, desc, nil, file, i) + } + return sl +} + +// Wrap this Descriptor, recursively +func wrapThisDescriptor(sl []*Descriptor, desc *descriptor.DescriptorProto, parent *Descriptor, file *FileDescriptor, index int) []*Descriptor { + sl = append(sl, newDescriptor(desc, parent, file, index)) + me := sl[len(sl)-1] + for i, nested := range desc.NestedType { + sl = wrapThisDescriptor(sl, nested, me, file, i) + } + return sl +} + +// Construct the EnumDescriptor +func newEnumDescriptor(desc *descriptor.EnumDescriptorProto, parent *Descriptor, file *FileDescriptor, index int) *EnumDescriptor { + ed := &EnumDescriptor{ + common: common{file}, + EnumDescriptorProto: desc, + parent: parent, + index: index, + } + if parent == nil { + ed.path = fmt.Sprintf("%d,%d", enumPath, index) + } else { + ed.path = fmt.Sprintf("%s,%d,%d", parent.path, messageEnumPath, index) + } + return ed +} + +// Return a slice of all the EnumDescriptors defined within this file +func wrapEnumDescriptors(file *FileDescriptor, descs []*Descriptor) []*EnumDescriptor { + sl := make([]*EnumDescriptor, 0, len(file.EnumType)+10) + // Top-level enums. + for i, enum := range file.EnumType { + sl = append(sl, newEnumDescriptor(enum, nil, file, i)) + } + // Enums within messages. Enums within embedded messages appear in the outer-most message. + for _, nested := range descs { + for i, enum := range nested.EnumType { + sl = append(sl, newEnumDescriptor(enum, nested, file, i)) + } + } + return sl +} + +// Return a slice of all the top-level ExtensionDescriptors defined within this file. +func wrapExtensions(file *FileDescriptor) []*ExtensionDescriptor { + var sl []*ExtensionDescriptor + for _, field := range file.Extension { + sl = append(sl, &ExtensionDescriptor{common{file}, field, nil}) + } + return sl +} + +// Return a slice of all the types that are publicly imported into this file. +func wrapImported(file *FileDescriptor, g *Generator) (sl []*ImportedDescriptor) { + for _, index := range file.PublicDependency { + df := g.fileByName(file.Dependency[index]) + for _, d := range df.desc { + if d.GetOptions().GetMapEntry() { + continue + } + sl = append(sl, &ImportedDescriptor{common{file}, d}) + } + for _, e := range df.enum { + sl = append(sl, &ImportedDescriptor{common{file}, e}) + } + for _, ext := range df.ext { + sl = append(sl, &ImportedDescriptor{common{file}, ext}) + } + } + return +} + +func extractComments(file *FileDescriptor) { + file.comments = make(map[string]*descriptor.SourceCodeInfo_Location) + for _, loc := range file.GetSourceCodeInfo().GetLocation() { + if loc.LeadingComments == nil { + continue + } + var p []string + for _, n := range loc.Path { + p = append(p, strconv.Itoa(int(n))) + } + file.comments[strings.Join(p, ",")] = loc + } +} + +// BuildTypeNameMap builds the map from fully qualified type names to objects. +// The key names for the map come from the input data, which puts a period at the beginning. +// It should be called after SetPackageNames and before GenerateAllFiles. +func (g *Generator) BuildTypeNameMap() { + g.typeNameToObject = make(map[string]Object) + for _, f := range g.allFiles { + // The names in this loop are defined by the proto world, not us, so the + // package name may be empty. If so, the dotted package name of X will + // be ".X"; otherwise it will be ".pkg.X". + dottedPkg := "." + f.GetPackage() + if dottedPkg != "." { + dottedPkg += "." + } + for _, enum := range f.enum { + name := dottedPkg + dottedSlice(enum.TypeName()) + g.typeNameToObject[name] = enum + } + for _, desc := range f.desc { + name := dottedPkg + dottedSlice(desc.TypeName()) + g.typeNameToObject[name] = desc + } + } +} + +// ObjectNamed, given a fully-qualified input type name as it appears in the input data, +// returns the descriptor for the message or enum with that name. +func (g *Generator) ObjectNamed(typeName string) Object { + o, ok := g.typeNameToObject[typeName] + if !ok { + g.Fail("can't find object with type", typeName) + } + + // If the file of this object isn't a direct dependency of the current file, + // or in the current file, then this object has been publicly imported into + // a dependency of the current file. + // We should return the ImportedDescriptor object for it instead. + direct := *o.File().Name == *g.file.Name + if !direct { + for _, dep := range g.file.Dependency { + if *g.fileByName(dep).Name == *o.File().Name { + direct = true + break + } + } + } + if !direct { + found := false + Loop: + for _, dep := range g.file.Dependency { + df := g.fileByName(*g.fileByName(dep).Name) + for _, td := range df.imp { + if td.o == o { + // Found it! + o = td + found = true + break Loop + } + } + } + if !found { + log.Printf("protoc-gen-go: WARNING: failed finding publicly imported dependency for %v, used in %v", typeName, *g.file.Name) + } + } + + return o +} + +// AnnotatedAtoms is a list of atoms (as consumed by P) that records the file name and proto AST path from which they originated. +type AnnotatedAtoms struct { + source string + path string + atoms []interface{} +} + +// Annotate records the file name and proto AST path of a list of atoms +// so that a later call to P can emit a link from each atom to its origin. +func Annotate(file *FileDescriptor, path string, atoms ...interface{}) *AnnotatedAtoms { + return &AnnotatedAtoms{source: *file.Name, path: path, atoms: atoms} +} + +// printAtom prints the (atomic, non-annotation) argument to the generated output. +func (g *Generator) printAtom(v interface{}) { + switch v := v.(type) { + case string: + g.WriteString(v) + case *string: + g.WriteString(*v) + case bool: + fmt.Fprint(g, v) + case *bool: + fmt.Fprint(g, *v) + case int: + fmt.Fprint(g, v) + case *int32: + fmt.Fprint(g, *v) + case *int64: + fmt.Fprint(g, *v) + case float64: + fmt.Fprint(g, v) + case *float64: + fmt.Fprint(g, *v) + case GoPackageName: + g.WriteString(string(v)) + case GoImportPath: + g.WriteString(strconv.Quote(string(v))) + default: + g.Fail(fmt.Sprintf("unknown type in printer: %T", v)) + } +} + +// P prints the arguments to the generated output. It handles strings and int32s, plus +// handling indirections because they may be *string, etc. Any inputs of type AnnotatedAtoms may emit +// annotations in a .meta file in addition to outputting the atoms themselves (if g.annotateCode +// is true). +func (g *Generator) P(str ...interface{}) { + if !g.writeOutput { + return + } + g.WriteString(g.indent) + for _, v := range str { + switch v := v.(type) { + case *AnnotatedAtoms: + begin := int32(g.Len()) + for _, v := range v.atoms { + g.printAtom(v) + } + if g.annotateCode { + end := int32(g.Len()) + var path []int32 + for _, token := range strings.Split(v.path, ",") { + val, err := strconv.ParseInt(token, 10, 32) + if err != nil { + g.Fail("could not parse proto AST path: ", err.Error()) + } + path = append(path, int32(val)) + } + g.annotations = append(g.annotations, &descriptor.GeneratedCodeInfo_Annotation{ + Path: path, + SourceFile: &v.source, + Begin: &begin, + End: &end, + }) + } + default: + g.printAtom(v) + } + } + g.WriteByte('\n') +} + +// addInitf stores the given statement to be printed inside the file's init function. +// The statement is given as a format specifier and arguments. +func (g *Generator) addInitf(stmt string, a ...interface{}) { + g.init = append(g.init, fmt.Sprintf(stmt, a...)) +} + +// In Indents the output one tab stop. +func (g *Generator) In() { g.indent += "\t" } + +// Out unindents the output one tab stop. +func (g *Generator) Out() { + if len(g.indent) > 0 { + g.indent = g.indent[1:] + } +} + +// GenerateAllFiles generates the output for all the files we're outputting. +func (g *Generator) GenerateAllFiles() { + // Initialize the plugins + for _, p := range plugins { + p.Init(g) + } + // Generate the output. The generator runs for every file, even the files + // that we don't generate output for, so that we can collate the full list + // of exported symbols to support public imports. + genFileMap := make(map[*FileDescriptor]bool, len(g.genFiles)) + for _, file := range g.genFiles { + genFileMap[file] = true + } + for _, file := range g.allFiles { + g.Reset() + g.annotations = nil + g.writeOutput = genFileMap[file] + g.generate(file) + if !g.writeOutput { + continue + } + fname := file.goFileName(g.pathType) + g.Response.File = append(g.Response.File, &plugin.CodeGeneratorResponse_File{ + Name: proto.String(fname), + Content: proto.String(g.String()), + }) + if g.annotateCode { + // Store the generated code annotations in text, as the protoc plugin protocol requires that + // strings contain valid UTF-8. + g.Response.File = append(g.Response.File, &plugin.CodeGeneratorResponse_File{ + Name: proto.String(file.goFileName(g.pathType) + ".meta"), + Content: proto.String(proto.CompactTextString(&descriptor.GeneratedCodeInfo{Annotation: g.annotations})), + }) + } + } +} + +// Run all the plugins associated with the file. +func (g *Generator) runPlugins(file *FileDescriptor) { + for _, p := range plugins { + p.Generate(file) + } +} + +// Fill the response protocol buffer with the generated output for all the files we're +// supposed to generate. +func (g *Generator) generate(file *FileDescriptor) { + g.file = file + g.usedPackages = make(map[GoImportPath]bool) + g.packageNames = make(map[GoImportPath]GoPackageName) + g.usedPackageNames = make(map[GoPackageName]bool) + for name := range globalPackageNames { + g.usedPackageNames[name] = true + } + + g.P("// This is a compile-time assertion to ensure that this generated file") + g.P("// is compatible with the proto package it is being compiled against.") + g.P("// A compilation error at this line likely means your copy of the") + g.P("// proto package needs to be updated.") + g.P("const _ = ", g.Pkg["proto"], ".ProtoPackageIsVersion", generatedCodeVersion, " // please upgrade the proto package") + g.P() + + for _, td := range g.file.imp { + g.generateImported(td) + } + for _, enum := range g.file.enum { + g.generateEnum(enum) + } + for _, desc := range g.file.desc { + // Don't generate virtual messages for maps. + if desc.GetOptions().GetMapEntry() { + continue + } + g.generateMessage(desc) + } + for _, ext := range g.file.ext { + g.generateExtension(ext) + } + g.generateInitFunction() + + // Run the plugins before the imports so we know which imports are necessary. + g.runPlugins(file) + + g.generateFileDescriptor(file) + + // Generate header and imports last, though they appear first in the output. + rem := g.Buffer + remAnno := g.annotations + g.Buffer = new(bytes.Buffer) + g.annotations = nil + g.generateHeader() + g.generateImports() + if !g.writeOutput { + return + } + // Adjust the offsets for annotations displaced by the header and imports. + for _, anno := range remAnno { + *anno.Begin += int32(g.Len()) + *anno.End += int32(g.Len()) + g.annotations = append(g.annotations, anno) + } + g.Write(rem.Bytes()) + + // Reformat generated code and patch annotation locations. + fset := token.NewFileSet() + original := g.Bytes() + if g.annotateCode { + // make a copy independent of g; we'll need it after Reset. + original = append([]byte(nil), original...) + } + ast, err := parser.ParseFile(fset, "", original, parser.ParseComments) + if err != nil { + // Print out the bad code with line numbers. + // This should never happen in practice, but it can while changing generated code, + // so consider this a debugging aid. + var src bytes.Buffer + s := bufio.NewScanner(bytes.NewReader(original)) + for line := 1; s.Scan(); line++ { + fmt.Fprintf(&src, "%5d\t%s\n", line, s.Bytes()) + } + g.Fail("bad Go source code was generated:", err.Error(), "\n"+src.String()) + } + g.Reset() + err = (&printer.Config{Mode: printer.TabIndent | printer.UseSpaces, Tabwidth: 8}).Fprint(g, fset, ast) + if err != nil { + g.Fail("generated Go source code could not be reformatted:", err.Error()) + } + if g.annotateCode { + m, err := remap.Compute(original, g.Bytes()) + if err != nil { + g.Fail("formatted generated Go source code could not be mapped back to the original code:", err.Error()) + } + for _, anno := range g.annotations { + new, ok := m.Find(int(*anno.Begin), int(*anno.End)) + if !ok { + g.Fail("span in formatted generated Go source code could not be mapped back to the original code") + } + *anno.Begin = int32(new.Pos) + *anno.End = int32(new.End) + } + } +} + +// Generate the header, including package definition +func (g *Generator) generateHeader() { + g.P("// Code generated by protoc-gen-go. DO NOT EDIT.") + if g.file.GetOptions().GetDeprecated() { + g.P("// ", g.file.Name, " is a deprecated file.") + } else { + g.P("// source: ", g.file.Name) + } + g.P() + + importPath, _, _ := g.file.goPackageOption() + if importPath == "" { + g.P("package ", g.file.packageName) + } else { + g.P("package ", g.file.packageName, " // import ", GoImportPath(g.ImportPrefix)+importPath) + } + g.P() + + if loc, ok := g.file.comments[strconv.Itoa(packagePath)]; ok { + g.P("/*") + // not using g.PrintComments because this is a /* */ comment block. + text := strings.TrimSuffix(loc.GetLeadingComments(), "\n") + for _, line := range strings.Split(text, "\n") { + line = strings.TrimPrefix(line, " ") + // ensure we don't escape from the block comment + line = strings.Replace(line, "*/", "* /", -1) + g.P(line) + } + g.P("*/") + g.P() + } +} + +// deprecationComment is the standard comment added to deprecated +// messages, fields, enums, and enum values. +var deprecationComment = "// Deprecated: Do not use." + +// PrintComments prints any comments from the source .proto file. +// The path is a comma-separated list of integers. +// It returns an indication of whether any comments were printed. +// See descriptor.proto for its format. +func (g *Generator) PrintComments(path string) bool { + if !g.writeOutput { + return false + } + if loc, ok := g.file.comments[path]; ok { + text := strings.TrimSuffix(loc.GetLeadingComments(), "\n") + for _, line := range strings.Split(text, "\n") { + g.P("// ", strings.TrimPrefix(line, " ")) + } + return true + } + return false +} + +func (g *Generator) fileByName(filename string) *FileDescriptor { + return g.allFilesByName[filename] +} + +// weak returns whether the ith import of the current file is a weak import. +func (g *Generator) weak(i int32) bool { + for _, j := range g.file.WeakDependency { + if j == i { + return true + } + } + return false +} + +// Generate the imports +func (g *Generator) generateImports() { + // We almost always need a proto import. Rather than computing when we + // do, which is tricky when there's a plugin, just import it and + // reference it later. The same argument applies to the fmt and math packages. + g.P("import "+g.Pkg["proto"]+" ", GoImportPath(g.ImportPrefix)+"github.com/golang/protobuf/proto") + g.P("import " + g.Pkg["fmt"] + ` "fmt"`) + g.P("import " + g.Pkg["math"] + ` "math"`) + var ( + imports = make(map[GoImportPath]bool) + strongImports = make(map[GoImportPath]bool) + importPaths []string + ) + for i, s := range g.file.Dependency { + fd := g.fileByName(s) + importPath := fd.importPath + // Do not import our own package. + if importPath == g.file.importPath { + continue + } + if !imports[importPath] { + importPaths = append(importPaths, string(importPath)) + } + imports[importPath] = true + if !g.weak(int32(i)) { + strongImports[importPath] = true + } + } + sort.Strings(importPaths) + for i := range importPaths { + importPath := GoImportPath(importPaths[i]) + packageName := g.GoPackageName(importPath) + fullPath := GoImportPath(g.ImportPrefix) + importPath + // Skip weak imports. + if !strongImports[importPath] { + g.P("// skipping weak import ", packageName, " ", fullPath) + continue + } + // We need to import all the dependencies, even if we don't reference them, + // because other code and tools depend on having the full transitive closure + // of protocol buffer types in the binary. + if _, ok := g.usedPackages[importPath]; !ok { + packageName = "_" + } + g.P("import ", packageName, " ", fullPath) + } + g.P() + // TODO: may need to worry about uniqueness across plugins + for _, p := range plugins { + p.GenerateImports(g.file) + g.P() + } + g.P("// Reference imports to suppress errors if they are not otherwise used.") + g.P("var _ = ", g.Pkg["proto"], ".Marshal") + g.P("var _ = ", g.Pkg["fmt"], ".Errorf") + g.P("var _ = ", g.Pkg["math"], ".Inf") + g.P() +} + +func (g *Generator) generateImported(id *ImportedDescriptor) { + tn := id.TypeName() + sn := tn[len(tn)-1] + df := id.o.File() + filename := *df.Name + if df.importPath == g.file.importPath { + // Don't generate type aliases for files in the same Go package as this one. + g.P("// Ignoring public import of ", sn, " from ", filename) + g.P() + return + } + if !supportTypeAliases { + g.Fail(fmt.Sprintf("%s: public imports require at least go1.9", filename)) + } + g.P("// ", sn, " from public import ", filename) + g.usedPackages[df.importPath] = true + + for _, sym := range df.exported[id.o] { + sym.GenerateAlias(g, g.GoPackageName(df.importPath)) + } + + g.P() +} + +// Generate the enum definitions for this EnumDescriptor. +func (g *Generator) generateEnum(enum *EnumDescriptor) { + // The full type name + typeName := enum.TypeName() + // The full type name, CamelCased. + ccTypeName := CamelCaseSlice(typeName) + ccPrefix := enum.prefix() + + deprecatedEnum := "" + if enum.GetOptions().GetDeprecated() { + deprecatedEnum = deprecationComment + } + g.PrintComments(enum.path) + g.P("type ", Annotate(enum.file, enum.path, ccTypeName), " int32", deprecatedEnum) + g.file.addExport(enum, enumSymbol{ccTypeName, enum.proto3()}) + g.P("const (") + g.In() + for i, e := range enum.Value { + etorPath := fmt.Sprintf("%s,%d,%d", enum.path, enumValuePath, i) + g.PrintComments(etorPath) + + deprecatedValue := "" + if e.GetOptions().GetDeprecated() { + deprecatedValue = deprecationComment + } + + name := ccPrefix + *e.Name + g.P(Annotate(enum.file, etorPath, name), " ", ccTypeName, " = ", e.Number, " ", deprecatedValue) + g.file.addExport(enum, constOrVarSymbol{name, "const", ccTypeName}) + } + g.Out() + g.P(")") + g.P("var ", ccTypeName, "_name = map[int32]string{") + g.In() + generated := make(map[int32]bool) // avoid duplicate values + for _, e := range enum.Value { + duplicate := "" + if _, present := generated[*e.Number]; present { + duplicate = "// Duplicate value: " + } + g.P(duplicate, e.Number, ": ", strconv.Quote(*e.Name), ",") + generated[*e.Number] = true + } + g.Out() + g.P("}") + g.P("var ", ccTypeName, "_value = map[string]int32{") + g.In() + for _, e := range enum.Value { + g.P(strconv.Quote(*e.Name), ": ", e.Number, ",") + } + g.Out() + g.P("}") + + if !enum.proto3() { + g.P("func (x ", ccTypeName, ") Enum() *", ccTypeName, " {") + g.In() + g.P("p := new(", ccTypeName, ")") + g.P("*p = x") + g.P("return p") + g.Out() + g.P("}") + } + + g.P("func (x ", ccTypeName, ") String() string {") + g.In() + g.P("return ", g.Pkg["proto"], ".EnumName(", ccTypeName, "_name, int32(x))") + g.Out() + g.P("}") + + if !enum.proto3() { + g.P("func (x *", ccTypeName, ") UnmarshalJSON(data []byte) error {") + g.In() + g.P("value, err := ", g.Pkg["proto"], ".UnmarshalJSONEnum(", ccTypeName, `_value, data, "`, ccTypeName, `")`) + g.P("if err != nil {") + g.In() + g.P("return err") + g.Out() + g.P("}") + g.P("*x = ", ccTypeName, "(value)") + g.P("return nil") + g.Out() + g.P("}") + } + + var indexes []string + for m := enum.parent; m != nil; m = m.parent { + // XXX: skip groups? + indexes = append([]string{strconv.Itoa(m.index)}, indexes...) + } + indexes = append(indexes, strconv.Itoa(enum.index)) + g.P("func (", ccTypeName, ") EnumDescriptor() ([]byte, []int) {") + g.In() + g.P("return ", g.file.VarName(), ", []int{", strings.Join(indexes, ", "), "}") + g.Out() + g.P("}") + if enum.file.GetPackage() == "google.protobuf" && enum.GetName() == "NullValue" { + g.P("func (", ccTypeName, `) XXX_WellKnownType() string { return "`, enum.GetName(), `" }`) + } + + g.P() +} + +// The tag is a string like "varint,2,opt,name=fieldname,def=7" that +// identifies details of the field for the protocol buffer marshaling and unmarshaling +// code. The fields are: +// wire encoding +// protocol tag number +// opt,req,rep for optional, required, or repeated +// packed whether the encoding is "packed" (optional; repeated primitives only) +// name= the original declared name +// enum= the name of the enum type if it is an enum-typed field. +// proto3 if this field is in a proto3 message +// def= string representation of the default value, if any. +// The default value must be in a representation that can be used at run-time +// to generate the default value. Thus bools become 0 and 1, for instance. +func (g *Generator) goTag(message *Descriptor, field *descriptor.FieldDescriptorProto, wiretype string) string { + optrepreq := "" + switch { + case isOptional(field): + optrepreq = "opt" + case isRequired(field): + optrepreq = "req" + case isRepeated(field): + optrepreq = "rep" + } + var defaultValue string + if dv := field.DefaultValue; dv != nil { // set means an explicit default + defaultValue = *dv + // Some types need tweaking. + switch *field.Type { + case descriptor.FieldDescriptorProto_TYPE_BOOL: + if defaultValue == "true" { + defaultValue = "1" + } else { + defaultValue = "0" + } + case descriptor.FieldDescriptorProto_TYPE_STRING, + descriptor.FieldDescriptorProto_TYPE_BYTES: + // Nothing to do. Quoting is done for the whole tag. + case descriptor.FieldDescriptorProto_TYPE_ENUM: + // For enums we need to provide the integer constant. + obj := g.ObjectNamed(field.GetTypeName()) + if id, ok := obj.(*ImportedDescriptor); ok { + // It is an enum that was publicly imported. + // We need the underlying type. + obj = id.o + } + enum, ok := obj.(*EnumDescriptor) + if !ok { + log.Printf("obj is a %T", obj) + if id, ok := obj.(*ImportedDescriptor); ok { + log.Printf("id.o is a %T", id.o) + } + g.Fail("unknown enum type", CamelCaseSlice(obj.TypeName())) + } + defaultValue = enum.integerValueAsString(defaultValue) + } + defaultValue = ",def=" + defaultValue + } + enum := "" + if *field.Type == descriptor.FieldDescriptorProto_TYPE_ENUM { + // We avoid using obj.GoPackageName(), because we want to use the + // original (proto-world) package name. + obj := g.ObjectNamed(field.GetTypeName()) + if id, ok := obj.(*ImportedDescriptor); ok { + obj = id.o + } + enum = ",enum=" + if pkg := obj.File().GetPackage(); pkg != "" { + enum += pkg + "." + } + enum += CamelCaseSlice(obj.TypeName()) + } + packed := "" + if (field.Options != nil && field.Options.GetPacked()) || + // Per https://developers.google.com/protocol-buffers/docs/proto3#simple: + // "In proto3, repeated fields of scalar numeric types use packed encoding by default." + (message.proto3() && (field.Options == nil || field.Options.Packed == nil) && + isRepeated(field) && isScalar(field)) { + packed = ",packed" + } + fieldName := field.GetName() + name := fieldName + if *field.Type == descriptor.FieldDescriptorProto_TYPE_GROUP { + // We must use the type name for groups instead of + // the field name to preserve capitalization. + // type_name in FieldDescriptorProto is fully-qualified, + // but we only want the local part. + name = *field.TypeName + if i := strings.LastIndex(name, "."); i >= 0 { + name = name[i+1:] + } + } + if json := field.GetJsonName(); json != "" && json != name { + // TODO: escaping might be needed, in which case + // perhaps this should be in its own "json" tag. + name += ",json=" + json + } + name = ",name=" + name + if message.proto3() { + // We only need the extra tag for []byte fields; + // no need to add noise for the others. + if *field.Type == descriptor.FieldDescriptorProto_TYPE_BYTES { + name += ",proto3" + } + + } + oneof := "" + if field.OneofIndex != nil { + oneof = ",oneof" + } + return strconv.Quote(fmt.Sprintf("%s,%d,%s%s%s%s%s%s", + wiretype, + field.GetNumber(), + optrepreq, + packed, + name, + enum, + oneof, + defaultValue)) +} + +func needsStar(typ descriptor.FieldDescriptorProto_Type) bool { + switch typ { + case descriptor.FieldDescriptorProto_TYPE_GROUP: + return false + case descriptor.FieldDescriptorProto_TYPE_MESSAGE: + return false + case descriptor.FieldDescriptorProto_TYPE_BYTES: + return false + } + return true +} + +// TypeName is the printed name appropriate for an item. If the object is in the current file, +// TypeName drops the package name and underscores the rest. +// Otherwise the object is from another package; and the result is the underscored +// package name followed by the item name. +// The result always has an initial capital. +func (g *Generator) TypeName(obj Object) string { + return g.DefaultPackageName(obj) + CamelCaseSlice(obj.TypeName()) +} + +// GoType returns a string representing the type name, and the wire type +func (g *Generator) GoType(message *Descriptor, field *descriptor.FieldDescriptorProto) (typ string, wire string) { + // TODO: Options. + switch *field.Type { + case descriptor.FieldDescriptorProto_TYPE_DOUBLE: + typ, wire = "float64", "fixed64" + case descriptor.FieldDescriptorProto_TYPE_FLOAT: + typ, wire = "float32", "fixed32" + case descriptor.FieldDescriptorProto_TYPE_INT64: + typ, wire = "int64", "varint" + case descriptor.FieldDescriptorProto_TYPE_UINT64: + typ, wire = "uint64", "varint" + case descriptor.FieldDescriptorProto_TYPE_INT32: + typ, wire = "int32", "varint" + case descriptor.FieldDescriptorProto_TYPE_UINT32: + typ, wire = "uint32", "varint" + case descriptor.FieldDescriptorProto_TYPE_FIXED64: + typ, wire = "uint64", "fixed64" + case descriptor.FieldDescriptorProto_TYPE_FIXED32: + typ, wire = "uint32", "fixed32" + case descriptor.FieldDescriptorProto_TYPE_BOOL: + typ, wire = "bool", "varint" + case descriptor.FieldDescriptorProto_TYPE_STRING: + typ, wire = "string", "bytes" + case descriptor.FieldDescriptorProto_TYPE_GROUP: + desc := g.ObjectNamed(field.GetTypeName()) + typ, wire = "*"+g.TypeName(desc), "group" + case descriptor.FieldDescriptorProto_TYPE_MESSAGE: + desc := g.ObjectNamed(field.GetTypeName()) + typ, wire = "*"+g.TypeName(desc), "bytes" + case descriptor.FieldDescriptorProto_TYPE_BYTES: + typ, wire = "[]byte", "bytes" + case descriptor.FieldDescriptorProto_TYPE_ENUM: + desc := g.ObjectNamed(field.GetTypeName()) + typ, wire = g.TypeName(desc), "varint" + case descriptor.FieldDescriptorProto_TYPE_SFIXED32: + typ, wire = "int32", "fixed32" + case descriptor.FieldDescriptorProto_TYPE_SFIXED64: + typ, wire = "int64", "fixed64" + case descriptor.FieldDescriptorProto_TYPE_SINT32: + typ, wire = "int32", "zigzag32" + case descriptor.FieldDescriptorProto_TYPE_SINT64: + typ, wire = "int64", "zigzag64" + default: + g.Fail("unknown type for", field.GetName()) + } + if isRepeated(field) { + typ = "[]" + typ + } else if message != nil && message.proto3() { + return + } else if field.OneofIndex != nil && message != nil { + return + } else if needsStar(*field.Type) { + typ = "*" + typ + } + return +} + +func (g *Generator) RecordTypeUse(t string) { + if _, ok := g.typeNameToObject[t]; ok { + // Call ObjectNamed to get the true object to record the use. + obj := g.ObjectNamed(t) + g.usedPackages[obj.GoImportPath()] = true + } +} + +// Method names that may be generated. Fields with these names get an +// underscore appended. Any change to this set is a potential incompatible +// API change because it changes generated field names. +var methodNames = [...]string{ + "Reset", + "String", + "ProtoMessage", + "Marshal", + "Unmarshal", + "ExtensionRangeArray", + "ExtensionMap", + "Descriptor", +} + +// Names of messages in the `google.protobuf` package for which +// we will generate XXX_WellKnownType methods. +var wellKnownTypes = map[string]bool{ + "Any": true, + "Duration": true, + "Empty": true, + "Struct": true, + "Timestamp": true, + + "Value": true, + "ListValue": true, + "DoubleValue": true, + "FloatValue": true, + "Int64Value": true, + "UInt64Value": true, + "Int32Value": true, + "UInt32Value": true, + "BoolValue": true, + "StringValue": true, + "BytesValue": true, +} + +// Generate the type and default constant definitions for this Descriptor. +func (g *Generator) generateMessage(message *Descriptor) { + // The full type name + typeName := message.TypeName() + // The full type name, CamelCased. + ccTypeName := CamelCaseSlice(typeName) + + usedNames := make(map[string]bool) + for _, n := range methodNames { + usedNames[n] = true + } + fieldNames := make(map[*descriptor.FieldDescriptorProto]string) + fieldGetterNames := make(map[*descriptor.FieldDescriptorProto]string) + fieldTypes := make(map[*descriptor.FieldDescriptorProto]string) + mapFieldTypes := make(map[*descriptor.FieldDescriptorProto]string) + + oneofFieldName := make(map[int32]string) // indexed by oneof_index field of FieldDescriptorProto + oneofDisc := make(map[int32]string) // name of discriminator method + oneofTypeName := make(map[*descriptor.FieldDescriptorProto]string) // without star + oneofInsertPoints := make(map[int32]int) // oneof_index => offset of g.Buffer + + comments := g.PrintComments(message.path) + + // Guarantee deprecation comments appear after user-provided comments. + if message.GetOptions().GetDeprecated() { + if comments { + // Convention: Separate deprecation comments from original + // comments with an empty line. + g.P("//") + } + g.P(deprecationComment) + } + + g.P("type ", Annotate(message.file, message.path, ccTypeName), " struct {") + g.In() + + // allocNames finds a conflict-free variation of the given strings, + // consistently mutating their suffixes. + // It returns the same number of strings. + allocNames := func(ns ...string) []string { + Loop: + for { + for _, n := range ns { + if usedNames[n] { + for i := range ns { + ns[i] += "_" + } + continue Loop + } + } + for _, n := range ns { + usedNames[n] = true + } + return ns + } + } + + for i, field := range message.Field { + // Allocate the getter and the field at the same time so name + // collisions create field/method consistent names. + // TODO: This allocation occurs based on the order of the fields + // in the proto file, meaning that a change in the field + // ordering can change generated Method/Field names. + base := CamelCase(*field.Name) + ns := allocNames(base, "Get"+base) + fieldName, fieldGetterName := ns[0], ns[1] + typename, wiretype := g.GoType(message, field) + jsonName := *field.Name + tag := fmt.Sprintf("protobuf:%s json:%q", g.goTag(message, field, wiretype), jsonName+",omitempty") + + fieldNames[field] = fieldName + fieldGetterNames[field] = fieldGetterName + + oneof := field.OneofIndex != nil + if oneof && oneofFieldName[*field.OneofIndex] == "" { + odp := message.OneofDecl[int(*field.OneofIndex)] + fname := allocNames(CamelCase(odp.GetName()))[0] + + // This is the first field of a oneof we haven't seen before. + // Generate the union field. + oneofFullPath := fmt.Sprintf("%s,%d,%d", message.path, messageOneofPath, *field.OneofIndex) + com := g.PrintComments(oneofFullPath) + if com { + g.P("//") + } + g.P("// Types that are valid to be assigned to ", fname, ":") + // Generate the rest of this comment later, + // when we've computed any disambiguation. + oneofInsertPoints[*field.OneofIndex] = g.Buffer.Len() + + dname := "is" + ccTypeName + "_" + fname + oneofFieldName[*field.OneofIndex] = fname + oneofDisc[*field.OneofIndex] = dname + tag := `protobuf_oneof:"` + odp.GetName() + `"` + g.P(Annotate(message.file, oneofFullPath, fname), " ", dname, " `", tag, "`") + } + + if *field.Type == descriptor.FieldDescriptorProto_TYPE_MESSAGE { + desc := g.ObjectNamed(field.GetTypeName()) + if d, ok := desc.(*Descriptor); ok && d.GetOptions().GetMapEntry() { + // Figure out the Go types and tags for the key and value types. + keyField, valField := d.Field[0], d.Field[1] + keyType, keyWire := g.GoType(d, keyField) + valType, valWire := g.GoType(d, valField) + keyTag, valTag := g.goTag(d, keyField, keyWire), g.goTag(d, valField, valWire) + + // We don't use stars, except for message-typed values. + // Message and enum types are the only two possibly foreign types used in maps, + // so record their use. They are not permitted as map keys. + keyType = strings.TrimPrefix(keyType, "*") + switch *valField.Type { + case descriptor.FieldDescriptorProto_TYPE_ENUM: + valType = strings.TrimPrefix(valType, "*") + g.RecordTypeUse(valField.GetTypeName()) + case descriptor.FieldDescriptorProto_TYPE_MESSAGE: + g.RecordTypeUse(valField.GetTypeName()) + default: + valType = strings.TrimPrefix(valType, "*") + } + + typename = fmt.Sprintf("map[%s]%s", keyType, valType) + mapFieldTypes[field] = typename // record for the getter generation + + tag += fmt.Sprintf(" protobuf_key:%s protobuf_val:%s", keyTag, valTag) + } + } + + fieldTypes[field] = typename + + if oneof { + tname := ccTypeName + "_" + fieldName + // It is possible for this to collide with a message or enum + // nested in this message. Check for collisions. + for { + ok := true + for _, desc := range message.nested { + if CamelCaseSlice(desc.TypeName()) == tname { + ok = false + break + } + } + for _, enum := range message.enums { + if CamelCaseSlice(enum.TypeName()) == tname { + ok = false + break + } + } + if !ok { + tname += "_" + continue + } + break + } + + oneofTypeName[field] = tname + continue + } + + fieldDeprecated := "" + if field.GetOptions().GetDeprecated() { + fieldDeprecated = deprecationComment + } + + fieldFullPath := fmt.Sprintf("%s,%d,%d", message.path, messageFieldPath, i) + g.PrintComments(fieldFullPath) + g.P(Annotate(message.file, fieldFullPath, fieldName), "\t", typename, "\t`", tag, "`", fieldDeprecated) + g.RecordTypeUse(field.GetTypeName()) + } + g.P("XXX_NoUnkeyedLiteral\tstruct{} `json:\"-\"`") // prevent unkeyed struct literals + if len(message.ExtensionRange) > 0 { + messageset := "" + if opts := message.Options; opts != nil && opts.GetMessageSetWireFormat() { + messageset = "protobuf_messageset:\"1\" " + } + g.P(g.Pkg["proto"], ".XXX_InternalExtensions `", messageset, "json:\"-\"`") + } + g.P("XXX_unrecognized\t[]byte `json:\"-\"`") + g.P("XXX_sizecache\tint32 `json:\"-\"`") + g.Out() + g.P("}") + + // Update g.Buffer to list valid oneof types. + // We do this down here, after we've disambiguated the oneof type names. + // We go in reverse order of insertion point to avoid invalidating offsets. + for oi := int32(len(message.OneofDecl)); oi >= 0; oi-- { + ip := oneofInsertPoints[oi] + all := g.Buffer.Bytes() + rem := all[ip:] + g.Buffer = bytes.NewBuffer(all[:ip:ip]) // set cap so we don't scribble on rem + oldLen := g.Buffer.Len() + for _, field := range message.Field { + if field.OneofIndex == nil || *field.OneofIndex != oi { + continue + } + g.P("//\t*", oneofTypeName[field]) + } + // If we've inserted text, we also need to fix up affected annotations (as + // they contain offsets that may need to be changed). + offset := int32(g.Buffer.Len() - oldLen) + ip32 := int32(ip) + for _, anno := range g.annotations { + if *anno.Begin >= ip32 { + *anno.Begin += offset + } + if *anno.End >= ip32 { + *anno.End += offset + } + } + g.Buffer.Write(rem) + } + + // Reset, String and ProtoMessage methods. + g.P("func (m *", ccTypeName, ") Reset() { *m = ", ccTypeName, "{} }") + g.P("func (m *", ccTypeName, ") String() string { return ", g.Pkg["proto"], ".CompactTextString(m) }") + g.P("func (*", ccTypeName, ") ProtoMessage() {}") + var indexes []string + for m := message; m != nil; m = m.parent { + indexes = append([]string{strconv.Itoa(m.index)}, indexes...) + } + g.P("func (*", ccTypeName, ") Descriptor() ([]byte, []int) {") + g.In() + g.P("return ", g.file.VarName(), ", []int{", strings.Join(indexes, ", "), "}") + g.Out() + g.P("}") + // TODO: Revisit the decision to use a XXX_WellKnownType method + // if we change proto.MessageName to work with multiple equivalents. + if message.file.GetPackage() == "google.protobuf" && wellKnownTypes[message.GetName()] { + g.P("func (*", ccTypeName, `) XXX_WellKnownType() string { return "`, message.GetName(), `" }`) + } + + // Extension support methods + var hasExtensions, isMessageSet bool + if len(message.ExtensionRange) > 0 { + hasExtensions = true + // message_set_wire_format only makes sense when extensions are defined. + if opts := message.Options; opts != nil && opts.GetMessageSetWireFormat() { + isMessageSet = true + g.P() + g.P("func (m *", ccTypeName, ") MarshalJSON() ([]byte, error) {") + g.In() + g.P("return ", g.Pkg["proto"], ".MarshalMessageSetJSON(&m.XXX_InternalExtensions)") + g.Out() + g.P("}") + g.P("func (m *", ccTypeName, ") UnmarshalJSON(buf []byte) error {") + g.In() + g.P("return ", g.Pkg["proto"], ".UnmarshalMessageSetJSON(buf, &m.XXX_InternalExtensions)") + g.Out() + g.P("}") + } + + g.P() + g.P("var extRange_", ccTypeName, " = []", g.Pkg["proto"], ".ExtensionRange{") + g.In() + for _, r := range message.ExtensionRange { + end := fmt.Sprint(*r.End - 1) // make range inclusive on both ends + g.P("{Start: ", r.Start, ", End: ", end, "},") + } + g.Out() + g.P("}") + g.P("func (*", ccTypeName, ") ExtensionRangeArray() []", g.Pkg["proto"], ".ExtensionRange {") + g.In() + g.P("return extRange_", ccTypeName) + g.Out() + g.P("}") + } + + // TODO: It does not scale to keep adding another method for every + // operation on protos that we want to switch over to using the + // table-driven approach. Instead, we should only add a single method + // that allows getting access to the *InternalMessageInfo struct and then + // calling Unmarshal, Marshal, Merge, Size, and Discard directly on that. + + // Wrapper for table-driven marshaling and unmarshaling. + g.P("func (m *", ccTypeName, ") XXX_Unmarshal(b []byte) error {") + g.In() + g.P("return xxx_messageInfo_", ccTypeName, ".Unmarshal(m, b)") + g.Out() + g.P("}") + + g.P("func (m *", ccTypeName, ") XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {") + g.In() + g.P("return xxx_messageInfo_", ccTypeName, ".Marshal(b, m, deterministic)") + g.Out() + g.P("}") + + g.P("func (dst *", ccTypeName, ") XXX_Merge(src ", g.Pkg["proto"], ".Message) {") + g.In() + g.P("xxx_messageInfo_", ccTypeName, ".Merge(dst, src)") + g.Out() + g.P("}") + + g.P("func (m *", ccTypeName, ") XXX_Size() int {") // avoid name clash with "Size" field in some message + g.In() + g.P("return xxx_messageInfo_", ccTypeName, ".Size(m)") + g.Out() + g.P("}") + + g.P("func (m *", ccTypeName, ") XXX_DiscardUnknown() {") + g.In() + g.P("xxx_messageInfo_", ccTypeName, ".DiscardUnknown(m)") + g.Out() + g.P("}") + + g.P("var xxx_messageInfo_", ccTypeName, " ", g.Pkg["proto"], ".InternalMessageInfo") + + // Default constants + defNames := make(map[*descriptor.FieldDescriptorProto]string) + for _, field := range message.Field { + def := field.GetDefaultValue() + if def == "" { + continue + } + fieldname := "Default_" + ccTypeName + "_" + CamelCase(*field.Name) + defNames[field] = fieldname + typename, _ := g.GoType(message, field) + if typename[0] == '*' { + typename = typename[1:] + } + kind := "const " + switch { + case typename == "bool": + case typename == "string": + def = strconv.Quote(def) + case typename == "[]byte": + def = "[]byte(" + strconv.Quote(unescape(def)) + ")" + kind = "var " + case def == "inf", def == "-inf", def == "nan": + // These names are known to, and defined by, the protocol language. + switch def { + case "inf": + def = "math.Inf(1)" + case "-inf": + def = "math.Inf(-1)" + case "nan": + def = "math.NaN()" + } + if *field.Type == descriptor.FieldDescriptorProto_TYPE_FLOAT { + def = "float32(" + def + ")" + } + kind = "var " + case *field.Type == descriptor.FieldDescriptorProto_TYPE_ENUM: + // Must be an enum. Need to construct the prefixed name. + obj := g.ObjectNamed(field.GetTypeName()) + var enum *EnumDescriptor + if id, ok := obj.(*ImportedDescriptor); ok { + // The enum type has been publicly imported. + enum, _ = id.o.(*EnumDescriptor) + } else { + enum, _ = obj.(*EnumDescriptor) + } + if enum == nil { + log.Printf("don't know how to generate constant for %s", fieldname) + continue + } + def = g.DefaultPackageName(obj) + enum.prefix() + def + } + g.P(kind, fieldname, " ", typename, " = ", def) + g.file.addExport(message, constOrVarSymbol{fieldname, kind, ""}) + } + g.P() + + // Oneof per-field types, discriminants and getters. + // + // Generate unexported named types for the discriminant interfaces. + // We shouldn't have to do this, but there was (~19 Aug 2015) a compiler/linker bug + // that was triggered by using anonymous interfaces here. + // TODO: Revisit this and consider reverting back to anonymous interfaces. + for oi := range message.OneofDecl { + dname := oneofDisc[int32(oi)] + g.P("type ", dname, " interface {") + g.In() + g.P(dname, "()") + g.Out() + g.P("}") + } + g.P() + var oneofTypes []string + for i, field := range message.Field { + if field.OneofIndex == nil { + continue + } + _, wiretype := g.GoType(message, field) + tag := "protobuf:" + g.goTag(message, field, wiretype) + fieldFullPath := fmt.Sprintf("%s,%d,%d", message.path, messageFieldPath, i) + g.P("type ", Annotate(message.file, fieldFullPath, oneofTypeName[field]), " struct{ ", Annotate(message.file, fieldFullPath, fieldNames[field]), " ", fieldTypes[field], " `", tag, "` }") + g.RecordTypeUse(field.GetTypeName()) + oneofTypes = append(oneofTypes, oneofTypeName[field]) + } + g.P() + for _, field := range message.Field { + if field.OneofIndex == nil { + continue + } + g.P("func (*", oneofTypeName[field], ") ", oneofDisc[*field.OneofIndex], "() {}") + } + g.P() + for oi := range message.OneofDecl { + fname := oneofFieldName[int32(oi)] + oneofFullPath := fmt.Sprintf("%s,%d,%d", message.path, messageOneofPath, oi) + g.P("func (m *", ccTypeName, ") ", Annotate(message.file, oneofFullPath, "Get"+fname), "() ", oneofDisc[int32(oi)], " {") + g.P("if m != nil { return m.", fname, " }") + g.P("return nil") + g.P("}") + } + g.P() + + // Field getters + for i, field := range message.Field { + oneof := field.OneofIndex != nil + + fname := fieldNames[field] + typename, _ := g.GoType(message, field) + if t, ok := mapFieldTypes[field]; ok { + typename = t + } + mname := fieldGetterNames[field] + star := "" + if needsStar(*field.Type) && typename[0] == '*' { + typename = typename[1:] + star = "*" + } + fieldFullPath := fmt.Sprintf("%s,%d,%d", message.path, messageFieldPath, i) + + if field.GetOptions().GetDeprecated() { + g.P(deprecationComment) + } + + g.P("func (m *", ccTypeName, ") ", Annotate(message.file, fieldFullPath, mname), "() "+typename+" {") + g.In() + def, hasDef := defNames[field] + typeDefaultIsNil := false // whether this field type's default value is a literal nil unless specified + switch *field.Type { + case descriptor.FieldDescriptorProto_TYPE_BYTES: + typeDefaultIsNil = !hasDef + case descriptor.FieldDescriptorProto_TYPE_GROUP, descriptor.FieldDescriptorProto_TYPE_MESSAGE: + typeDefaultIsNil = true + } + if isRepeated(field) { + typeDefaultIsNil = true + } + if typeDefaultIsNil && !oneof { + // A bytes field with no explicit default needs less generated code, + // as does a message or group field, or a repeated field. + g.P("if m != nil {") + g.In() + g.P("return m." + fname) + g.Out() + g.P("}") + g.P("return nil") + g.Out() + g.P("}") + g.P() + continue + } + if !oneof { + if message.proto3() { + g.P("if m != nil {") + } else { + g.P("if m != nil && m." + fname + " != nil {") + } + g.In() + g.P("return " + star + "m." + fname) + g.Out() + g.P("}") + } else { + uname := oneofFieldName[*field.OneofIndex] + tname := oneofTypeName[field] + g.P("if x, ok := m.Get", uname, "().(*", tname, "); ok {") + g.P("return x.", fname) + g.P("}") + } + if hasDef { + if *field.Type != descriptor.FieldDescriptorProto_TYPE_BYTES { + g.P("return " + def) + } else { + // The default is a []byte var. + // Make a copy when returning it to be safe. + g.P("return append([]byte(nil), ", def, "...)") + } + } else { + switch *field.Type { + case descriptor.FieldDescriptorProto_TYPE_BOOL: + g.P("return false") + case descriptor.FieldDescriptorProto_TYPE_STRING: + g.P(`return ""`) + case descriptor.FieldDescriptorProto_TYPE_GROUP, + descriptor.FieldDescriptorProto_TYPE_MESSAGE, + descriptor.FieldDescriptorProto_TYPE_BYTES: + // This is only possible for oneof fields. + g.P("return nil") + case descriptor.FieldDescriptorProto_TYPE_ENUM: + // The default default for an enum is the first value in the enum, + // not zero. + obj := g.ObjectNamed(field.GetTypeName()) + var enum *EnumDescriptor + if id, ok := obj.(*ImportedDescriptor); ok { + // The enum type has been publicly imported. + enum, _ = id.o.(*EnumDescriptor) + } else { + enum, _ = obj.(*EnumDescriptor) + } + if enum == nil { + log.Printf("don't know how to generate getter for %s", field.GetName()) + continue + } + if len(enum.Value) == 0 { + g.P("return 0 // empty enum") + } else { + first := enum.Value[0].GetName() + g.P("return ", g.DefaultPackageName(obj)+enum.prefix()+first) + } + default: + g.P("return 0") + } + } + g.Out() + g.P("}") + g.P() + } + + if !message.group { + ms := &messageSymbol{ + sym: ccTypeName, + hasExtensions: hasExtensions, + isMessageSet: isMessageSet, + oneofTypes: oneofTypes, + } + g.file.addExport(message, ms) + } + + // Oneof functions + if len(message.OneofDecl) > 0 { + fieldWire := make(map[*descriptor.FieldDescriptorProto]string) + + // method + enc := "_" + ccTypeName + "_OneofMarshaler" + dec := "_" + ccTypeName + "_OneofUnmarshaler" + size := "_" + ccTypeName + "_OneofSizer" + encSig := "(msg " + g.Pkg["proto"] + ".Message, b *" + g.Pkg["proto"] + ".Buffer) error" + decSig := "(msg " + g.Pkg["proto"] + ".Message, tag, wire int, b *" + g.Pkg["proto"] + ".Buffer) (bool, error)" + sizeSig := "(msg " + g.Pkg["proto"] + ".Message) (n int)" + + g.P("// XXX_OneofFuncs is for the internal use of the proto package.") + g.P("func (*", ccTypeName, ") XXX_OneofFuncs() (func", encSig, ", func", decSig, ", func", sizeSig, ", []interface{}) {") + g.P("return ", enc, ", ", dec, ", ", size, ", []interface{}{") + for _, field := range message.Field { + if field.OneofIndex == nil { + continue + } + g.P("(*", oneofTypeName[field], ")(nil),") + } + g.P("}") + g.P("}") + g.P() + + // marshaler + g.P("func ", enc, encSig, " {") + g.P("m := msg.(*", ccTypeName, ")") + for oi, odp := range message.OneofDecl { + g.P("// ", odp.GetName()) + fname := oneofFieldName[int32(oi)] + g.P("switch x := m.", fname, ".(type) {") + for _, field := range message.Field { + if field.OneofIndex == nil || int(*field.OneofIndex) != oi { + continue + } + g.P("case *", oneofTypeName[field], ":") + var wire, pre, post string + val := "x." + fieldNames[field] // overridden for TYPE_BOOL + canFail := false // only TYPE_MESSAGE and TYPE_GROUP can fail + switch *field.Type { + case descriptor.FieldDescriptorProto_TYPE_DOUBLE: + wire = "WireFixed64" + pre = "b.EncodeFixed64(" + g.Pkg["math"] + ".Float64bits(" + post = "))" + case descriptor.FieldDescriptorProto_TYPE_FLOAT: + wire = "WireFixed32" + pre = "b.EncodeFixed32(uint64(" + g.Pkg["math"] + ".Float32bits(" + post = ")))" + case descriptor.FieldDescriptorProto_TYPE_INT64, + descriptor.FieldDescriptorProto_TYPE_UINT64: + wire = "WireVarint" + pre, post = "b.EncodeVarint(uint64(", "))" + case descriptor.FieldDescriptorProto_TYPE_INT32, + descriptor.FieldDescriptorProto_TYPE_UINT32, + descriptor.FieldDescriptorProto_TYPE_ENUM: + wire = "WireVarint" + pre, post = "b.EncodeVarint(uint64(", "))" + case descriptor.FieldDescriptorProto_TYPE_FIXED64, + descriptor.FieldDescriptorProto_TYPE_SFIXED64: + wire = "WireFixed64" + pre, post = "b.EncodeFixed64(uint64(", "))" + case descriptor.FieldDescriptorProto_TYPE_FIXED32, + descriptor.FieldDescriptorProto_TYPE_SFIXED32: + wire = "WireFixed32" + pre, post = "b.EncodeFixed32(uint64(", "))" + case descriptor.FieldDescriptorProto_TYPE_BOOL: + // bool needs special handling. + g.P("t := uint64(0)") + g.P("if ", val, " { t = 1 }") + val = "t" + wire = "WireVarint" + pre, post = "b.EncodeVarint(", ")" + case descriptor.FieldDescriptorProto_TYPE_STRING: + wire = "WireBytes" + pre, post = "b.EncodeStringBytes(", ")" + case descriptor.FieldDescriptorProto_TYPE_GROUP: + wire = "WireStartGroup" + pre, post = "b.Marshal(", ")" + canFail = true + case descriptor.FieldDescriptorProto_TYPE_MESSAGE: + wire = "WireBytes" + pre, post = "b.EncodeMessage(", ")" + canFail = true + case descriptor.FieldDescriptorProto_TYPE_BYTES: + wire = "WireBytes" + pre, post = "b.EncodeRawBytes(", ")" + case descriptor.FieldDescriptorProto_TYPE_SINT32: + wire = "WireVarint" + pre, post = "b.EncodeZigzag32(uint64(", "))" + case descriptor.FieldDescriptorProto_TYPE_SINT64: + wire = "WireVarint" + pre, post = "b.EncodeZigzag64(uint64(", "))" + default: + g.Fail("unhandled oneof field type ", field.Type.String()) + } + fieldWire[field] = wire + g.P("b.EncodeVarint(", field.Number, "<<3|", g.Pkg["proto"], ".", wire, ")") + if !canFail { + g.P(pre, val, post) + } else { + g.P("if err := ", pre, val, post, "; err != nil {") + g.P("return err") + g.P("}") + } + if *field.Type == descriptor.FieldDescriptorProto_TYPE_GROUP { + g.P("b.EncodeVarint(", field.Number, "<<3|", g.Pkg["proto"], ".WireEndGroup)") + } + } + g.P("case nil:") + g.P("default: return ", g.Pkg["fmt"], `.Errorf("`, ccTypeName, ".", fname, ` has unexpected type %T", x)`) + g.P("}") + } + g.P("return nil") + g.P("}") + g.P() + + // unmarshaler + g.P("func ", dec, decSig, " {") + g.P("m := msg.(*", ccTypeName, ")") + g.P("switch tag {") + for _, field := range message.Field { + if field.OneofIndex == nil { + continue + } + odp := message.OneofDecl[int(*field.OneofIndex)] + g.P("case ", field.Number, ": // ", odp.GetName(), ".", *field.Name) + g.P("if wire != ", g.Pkg["proto"], ".", fieldWire[field], " {") + g.P("return true, ", g.Pkg["proto"], ".ErrInternalBadWireType") + g.P("}") + lhs := "x, err" // overridden for TYPE_MESSAGE and TYPE_GROUP + var dec, cast, cast2 string + switch *field.Type { + case descriptor.FieldDescriptorProto_TYPE_DOUBLE: + dec, cast = "b.DecodeFixed64()", g.Pkg["math"]+".Float64frombits" + case descriptor.FieldDescriptorProto_TYPE_FLOAT: + dec, cast, cast2 = "b.DecodeFixed32()", "uint32", g.Pkg["math"]+".Float32frombits" + case descriptor.FieldDescriptorProto_TYPE_INT64: + dec, cast = "b.DecodeVarint()", "int64" + case descriptor.FieldDescriptorProto_TYPE_UINT64: + dec = "b.DecodeVarint()" + case descriptor.FieldDescriptorProto_TYPE_INT32: + dec, cast = "b.DecodeVarint()", "int32" + case descriptor.FieldDescriptorProto_TYPE_FIXED64: + dec = "b.DecodeFixed64()" + case descriptor.FieldDescriptorProto_TYPE_FIXED32: + dec, cast = "b.DecodeFixed32()", "uint32" + case descriptor.FieldDescriptorProto_TYPE_BOOL: + dec = "b.DecodeVarint()" + // handled specially below + case descriptor.FieldDescriptorProto_TYPE_STRING: + dec = "b.DecodeStringBytes()" + case descriptor.FieldDescriptorProto_TYPE_GROUP: + g.P("msg := new(", fieldTypes[field][1:], ")") // drop star + lhs = "err" + dec = "b.DecodeGroup(msg)" + // handled specially below + case descriptor.FieldDescriptorProto_TYPE_MESSAGE: + g.P("msg := new(", fieldTypes[field][1:], ")") // drop star + lhs = "err" + dec = "b.DecodeMessage(msg)" + // handled specially below + case descriptor.FieldDescriptorProto_TYPE_BYTES: + dec = "b.DecodeRawBytes(true)" + case descriptor.FieldDescriptorProto_TYPE_UINT32: + dec, cast = "b.DecodeVarint()", "uint32" + case descriptor.FieldDescriptorProto_TYPE_ENUM: + dec, cast = "b.DecodeVarint()", fieldTypes[field] + case descriptor.FieldDescriptorProto_TYPE_SFIXED32: + dec, cast = "b.DecodeFixed32()", "int32" + case descriptor.FieldDescriptorProto_TYPE_SFIXED64: + dec, cast = "b.DecodeFixed64()", "int64" + case descriptor.FieldDescriptorProto_TYPE_SINT32: + dec, cast = "b.DecodeZigzag32()", "int32" + case descriptor.FieldDescriptorProto_TYPE_SINT64: + dec, cast = "b.DecodeZigzag64()", "int64" + default: + g.Fail("unhandled oneof field type ", field.Type.String()) + } + g.P(lhs, " := ", dec) + val := "x" + if cast != "" { + val = cast + "(" + val + ")" + } + if cast2 != "" { + val = cast2 + "(" + val + ")" + } + switch *field.Type { + case descriptor.FieldDescriptorProto_TYPE_BOOL: + val += " != 0" + case descriptor.FieldDescriptorProto_TYPE_GROUP, + descriptor.FieldDescriptorProto_TYPE_MESSAGE: + val = "msg" + } + g.P("m.", oneofFieldName[*field.OneofIndex], " = &", oneofTypeName[field], "{", val, "}") + g.P("return true, err") + } + g.P("default: return false, nil") + g.P("}") + g.P("}") + g.P() + + // sizer + g.P("func ", size, sizeSig, " {") + g.P("m := msg.(*", ccTypeName, ")") + for oi, odp := range message.OneofDecl { + g.P("// ", odp.GetName()) + fname := oneofFieldName[int32(oi)] + g.P("switch x := m.", fname, ".(type) {") + for _, field := range message.Field { + if field.OneofIndex == nil || int(*field.OneofIndex) != oi { + continue + } + g.P("case *", oneofTypeName[field], ":") + val := "x." + fieldNames[field] + var varint, fixed string + switch *field.Type { + case descriptor.FieldDescriptorProto_TYPE_DOUBLE: + fixed = "8" + case descriptor.FieldDescriptorProto_TYPE_FLOAT: + fixed = "4" + case descriptor.FieldDescriptorProto_TYPE_INT64, + descriptor.FieldDescriptorProto_TYPE_UINT64, + descriptor.FieldDescriptorProto_TYPE_INT32, + descriptor.FieldDescriptorProto_TYPE_UINT32, + descriptor.FieldDescriptorProto_TYPE_ENUM: + varint = val + case descriptor.FieldDescriptorProto_TYPE_FIXED64, + descriptor.FieldDescriptorProto_TYPE_SFIXED64: + fixed = "8" + case descriptor.FieldDescriptorProto_TYPE_FIXED32, + descriptor.FieldDescriptorProto_TYPE_SFIXED32: + fixed = "4" + case descriptor.FieldDescriptorProto_TYPE_BOOL: + fixed = "1" + case descriptor.FieldDescriptorProto_TYPE_STRING: + fixed = "len(" + val + ")" + varint = fixed + case descriptor.FieldDescriptorProto_TYPE_GROUP: + fixed = g.Pkg["proto"] + ".Size(" + val + ")" + case descriptor.FieldDescriptorProto_TYPE_MESSAGE: + g.P("s := ", g.Pkg["proto"], ".Size(", val, ")") + fixed = "s" + varint = fixed + case descriptor.FieldDescriptorProto_TYPE_BYTES: + fixed = "len(" + val + ")" + varint = fixed + case descriptor.FieldDescriptorProto_TYPE_SINT32: + varint = "(uint32(" + val + ") << 1) ^ uint32((int32(" + val + ") >> 31))" + case descriptor.FieldDescriptorProto_TYPE_SINT64: + varint = "uint64(" + val + " << 1) ^ uint64((int64(" + val + ") >> 63))" + default: + g.Fail("unhandled oneof field type ", field.Type.String()) + } + // Tag and wire varint is known statically, + // so don't generate code for that part of the size computation. + tagAndWireSize := proto.SizeVarint(uint64(*field.Number << 3)) // wire doesn't affect varint size + g.P("n += ", tagAndWireSize, " // tag and wire") + if varint != "" { + g.P("n += ", g.Pkg["proto"], ".SizeVarint(uint64(", varint, "))") + } + if fixed != "" { + g.P("n += ", fixed) + } + if *field.Type == descriptor.FieldDescriptorProto_TYPE_GROUP { + g.P("n += ", tagAndWireSize, " // tag and wire") + } + } + g.P("case nil:") + g.P("default:") + g.P("panic(", g.Pkg["fmt"], ".Sprintf(\"proto: unexpected type %T in oneof\", x))") + g.P("}") + } + g.P("return n") + g.P("}") + g.P() + } + + for _, ext := range message.ext { + g.generateExtension(ext) + } + + fullName := strings.Join(message.TypeName(), ".") + if g.file.Package != nil { + fullName = *g.file.Package + "." + fullName + } + + g.addInitf("%s.RegisterType((*%s)(nil), %q)", g.Pkg["proto"], ccTypeName, fullName) + // Register types for native map types. + for _, k := range mapFieldKeys(mapFieldTypes) { + fullName := strings.TrimPrefix(*k.TypeName, ".") + g.addInitf("%s.RegisterMapType((%s)(nil), %q)", g.Pkg["proto"], mapFieldTypes[k], fullName) + } +} + +type byTypeName []*descriptor.FieldDescriptorProto + +func (a byTypeName) Len() int { return len(a) } +func (a byTypeName) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a byTypeName) Less(i, j int) bool { return *a[i].TypeName < *a[j].TypeName } + +// mapFieldKeys returns the keys of m in a consistent order. +func mapFieldKeys(m map[*descriptor.FieldDescriptorProto]string) []*descriptor.FieldDescriptorProto { + keys := make([]*descriptor.FieldDescriptorProto, 0, len(m)) + for k := range m { + keys = append(keys, k) + } + sort.Sort(byTypeName(keys)) + return keys +} + +var escapeChars = [256]byte{ + 'a': '\a', 'b': '\b', 'f': '\f', 'n': '\n', 'r': '\r', 't': '\t', 'v': '\v', '\\': '\\', '"': '"', '\'': '\'', '?': '?', +} + +// unescape reverses the "C" escaping that protoc does for default values of bytes fields. +// It is best effort in that it effectively ignores malformed input. Seemingly invalid escape +// sequences are conveyed, unmodified, into the decoded result. +func unescape(s string) string { + // NB: Sadly, we can't use strconv.Unquote because protoc will escape both + // single and double quotes, but strconv.Unquote only allows one or the + // other (based on actual surrounding quotes of its input argument). + + var out []byte + for len(s) > 0 { + // regular character, or too short to be valid escape + if s[0] != '\\' || len(s) < 2 { + out = append(out, s[0]) + s = s[1:] + } else if c := escapeChars[s[1]]; c != 0 { + // escape sequence + out = append(out, c) + s = s[2:] + } else if s[1] == 'x' || s[1] == 'X' { + // hex escape, e.g. "\x80 + if len(s) < 4 { + // too short to be valid + out = append(out, s[:2]...) + s = s[2:] + continue + } + v, err := strconv.ParseUint(s[2:4], 16, 8) + if err != nil { + out = append(out, s[:4]...) + } else { + out = append(out, byte(v)) + } + s = s[4:] + } else if '0' <= s[1] && s[1] <= '7' { + // octal escape, can vary from 1 to 3 octal digits; e.g., "\0" "\40" or "\164" + // so consume up to 2 more bytes or up to end-of-string + n := len(s[1:]) - len(strings.TrimLeft(s[1:], "01234567")) + if n > 3 { + n = 3 + } + v, err := strconv.ParseUint(s[1:1+n], 8, 8) + if err != nil { + out = append(out, s[:1+n]...) + } else { + out = append(out, byte(v)) + } + s = s[1+n:] + } else { + // bad escape, just propagate the slash as-is + out = append(out, s[0]) + s = s[1:] + } + } + + return string(out) +} + +func (g *Generator) generateExtension(ext *ExtensionDescriptor) { + ccTypeName := ext.DescName() + + extObj := g.ObjectNamed(*ext.Extendee) + var extDesc *Descriptor + if id, ok := extObj.(*ImportedDescriptor); ok { + // This is extending a publicly imported message. + // We need the underlying type for goTag. + extDesc = id.o.(*Descriptor) + } else { + extDesc = extObj.(*Descriptor) + } + extendedType := "*" + g.TypeName(extObj) // always use the original + field := ext.FieldDescriptorProto + fieldType, wireType := g.GoType(ext.parent, field) + tag := g.goTag(extDesc, field, wireType) + g.RecordTypeUse(*ext.Extendee) + if n := ext.FieldDescriptorProto.TypeName; n != nil { + // foreign extension type + g.RecordTypeUse(*n) + } + + typeName := ext.TypeName() + + // Special case for proto2 message sets: If this extension is extending + // proto2.bridge.MessageSet, and its final name component is "message_set_extension", + // then drop that last component. + // + // TODO: This should be implemented in the text formatter rather than the generator. + // In addition, the situation for when to apply this special case is implemented + // differently in other languages: + // https://github.com/google/protobuf/blob/aff10976/src/google/protobuf/text_format.cc#L1560 + mset := false + if extDesc.GetOptions().GetMessageSetWireFormat() && typeName[len(typeName)-1] == "message_set_extension" { + typeName = typeName[:len(typeName)-1] + mset = true + } + + // For text formatting, the package must be exactly what the .proto file declares, + // ignoring overrides such as the go_package option, and with no dot/underscore mapping. + extName := strings.Join(typeName, ".") + if g.file.Package != nil { + extName = *g.file.Package + "." + extName + } + + g.P("var ", ccTypeName, " = &", g.Pkg["proto"], ".ExtensionDesc{") + g.In() + g.P("ExtendedType: (", extendedType, ")(nil),") + g.P("ExtensionType: (", fieldType, ")(nil),") + g.P("Field: ", field.Number, ",") + g.P(`Name: "`, extName, `",`) + g.P("Tag: ", tag, ",") + g.P(`Filename: "`, g.file.GetName(), `",`) + + g.Out() + g.P("}") + g.P() + + if mset { + // Generate a bit more code to register with message_set.go. + g.addInitf("%s.RegisterMessageSetType((%s)(nil), %d, %q)", g.Pkg["proto"], fieldType, *field.Number, extName) + } + + g.file.addExport(ext, constOrVarSymbol{ccTypeName, "var", ""}) +} + +func (g *Generator) generateInitFunction() { + for _, enum := range g.file.enum { + g.generateEnumRegistration(enum) + } + for _, d := range g.file.desc { + for _, ext := range d.ext { + g.generateExtensionRegistration(ext) + } + } + for _, ext := range g.file.ext { + g.generateExtensionRegistration(ext) + } + if len(g.init) == 0 { + return + } + g.P("func init() {") + g.In() + for _, l := range g.init { + g.P(l) + } + g.Out() + g.P("}") + g.init = nil +} + +func (g *Generator) generateFileDescriptor(file *FileDescriptor) { + // Make a copy and trim source_code_info data. + // TODO: Trim this more when we know exactly what we need. + pb := proto.Clone(file.FileDescriptorProto).(*descriptor.FileDescriptorProto) + pb.SourceCodeInfo = nil + + b, err := proto.Marshal(pb) + if err != nil { + g.Fail(err.Error()) + } + + var buf bytes.Buffer + w, _ := gzip.NewWriterLevel(&buf, gzip.BestCompression) + w.Write(b) + w.Close() + b = buf.Bytes() + + v := file.VarName() + g.P() + g.P("func init() { ", g.Pkg["proto"], ".RegisterFile(", strconv.Quote(*file.Name), ", ", v, ") }") + g.P("var ", v, " = []byte{") + g.In() + g.P("// ", len(b), " bytes of a gzipped FileDescriptorProto") + for len(b) > 0 { + n := 16 + if n > len(b) { + n = len(b) + } + + s := "" + for _, c := range b[:n] { + s += fmt.Sprintf("0x%02x,", c) + } + g.P(s) + + b = b[n:] + } + g.Out() + g.P("}") +} + +func (g *Generator) generateEnumRegistration(enum *EnumDescriptor) { + // // We always print the full (proto-world) package name here. + pkg := enum.File().GetPackage() + if pkg != "" { + pkg += "." + } + // The full type name + typeName := enum.TypeName() + // The full type name, CamelCased. + ccTypeName := CamelCaseSlice(typeName) + g.addInitf("%s.RegisterEnum(%q, %[3]s_name, %[3]s_value)", g.Pkg["proto"], pkg+ccTypeName, ccTypeName) +} + +func (g *Generator) generateExtensionRegistration(ext *ExtensionDescriptor) { + g.addInitf("%s.RegisterExtension(%s)", g.Pkg["proto"], ext.DescName()) +} + +// And now lots of helper functions. + +// Is c an ASCII lower-case letter? +func isASCIILower(c byte) bool { + return 'a' <= c && c <= 'z' +} + +// Is c an ASCII digit? +func isASCIIDigit(c byte) bool { + return '0' <= c && c <= '9' +} + +// CamelCase returns the CamelCased name. +// If there is an interior underscore followed by a lower case letter, +// drop the underscore and convert the letter to upper case. +// There is a remote possibility of this rewrite causing a name collision, +// but it's so remote we're prepared to pretend it's nonexistent - since the +// C++ generator lowercases names, it's extremely unlikely to have two fields +// with different capitalizations. +// In short, _my_field_name_2 becomes XMyFieldName_2. +func CamelCase(s string) string { + if s == "" { + return "" + } + t := make([]byte, 0, 32) + i := 0 + if s[0] == '_' { + // Need a capital letter; drop the '_'. + t = append(t, 'X') + i++ + } + // Invariant: if the next letter is lower case, it must be converted + // to upper case. + // That is, we process a word at a time, where words are marked by _ or + // upper case letter. Digits are treated as words. + for ; i < len(s); i++ { + c := s[i] + if c == '_' && i+1 < len(s) && isASCIILower(s[i+1]) { + continue // Skip the underscore in s. + } + if isASCIIDigit(c) { + t = append(t, c) + continue + } + // Assume we have a letter now - if not, it's a bogus identifier. + // The next word is a sequence of characters that must start upper case. + if isASCIILower(c) { + c ^= ' ' // Make it a capital letter. + } + t = append(t, c) // Guaranteed not lower case. + // Accept lower case sequence that follows. + for i+1 < len(s) && isASCIILower(s[i+1]) { + i++ + t = append(t, s[i]) + } + } + return string(t) +} + +// CamelCaseSlice is like CamelCase, but the argument is a slice of strings to +// be joined with "_". +func CamelCaseSlice(elem []string) string { return CamelCase(strings.Join(elem, "_")) } + +// dottedSlice turns a sliced name into a dotted name. +func dottedSlice(elem []string) string { return strings.Join(elem, ".") } + +// Is this field optional? +func isOptional(field *descriptor.FieldDescriptorProto) bool { + return field.Label != nil && *field.Label == descriptor.FieldDescriptorProto_LABEL_OPTIONAL +} + +// Is this field required? +func isRequired(field *descriptor.FieldDescriptorProto) bool { + return field.Label != nil && *field.Label == descriptor.FieldDescriptorProto_LABEL_REQUIRED +} + +// Is this field repeated? +func isRepeated(field *descriptor.FieldDescriptorProto) bool { + return field.Label != nil && *field.Label == descriptor.FieldDescriptorProto_LABEL_REPEATED +} + +// Is this field a scalar numeric type? +func isScalar(field *descriptor.FieldDescriptorProto) bool { + if field.Type == nil { + return false + } + switch *field.Type { + case descriptor.FieldDescriptorProto_TYPE_DOUBLE, + descriptor.FieldDescriptorProto_TYPE_FLOAT, + descriptor.FieldDescriptorProto_TYPE_INT64, + descriptor.FieldDescriptorProto_TYPE_UINT64, + descriptor.FieldDescriptorProto_TYPE_INT32, + descriptor.FieldDescriptorProto_TYPE_FIXED64, + descriptor.FieldDescriptorProto_TYPE_FIXED32, + descriptor.FieldDescriptorProto_TYPE_BOOL, + descriptor.FieldDescriptorProto_TYPE_UINT32, + descriptor.FieldDescriptorProto_TYPE_ENUM, + descriptor.FieldDescriptorProto_TYPE_SFIXED32, + descriptor.FieldDescriptorProto_TYPE_SFIXED64, + descriptor.FieldDescriptorProto_TYPE_SINT32, + descriptor.FieldDescriptorProto_TYPE_SINT64: + return true + default: + return false + } +} + +// badToUnderscore is the mapping function used to generate Go names from package names, +// which can be dotted in the input .proto file. It replaces non-identifier characters such as +// dot or dash with underscore. +func badToUnderscore(r rune) rune { + if unicode.IsLetter(r) || unicode.IsDigit(r) || r == '_' { + return r + } + return '_' +} + +// baseName returns the last path element of the name, with the last dotted suffix removed. +func baseName(name string) string { + // First, find the last element + if i := strings.LastIndex(name, "/"); i >= 0 { + name = name[i+1:] + } + // Now drop the suffix + if i := strings.LastIndex(name, "."); i >= 0 { + name = name[0:i] + } + return name +} + +// The SourceCodeInfo message describes the location of elements of a parsed +// .proto file by way of a "path", which is a sequence of integers that +// describe the route from a FileDescriptorProto to the relevant submessage. +// The path alternates between a field number of a repeated field, and an index +// into that repeated field. The constants below define the field numbers that +// are used. +// +// See descriptor.proto for more information about this. +const ( + // tag numbers in FileDescriptorProto + packagePath = 2 // package + messagePath = 4 // message_type + enumPath = 5 // enum_type + // tag numbers in DescriptorProto + messageFieldPath = 2 // field + messageMessagePath = 3 // nested_type + messageEnumPath = 4 // enum_type + messageOneofPath = 8 // oneof_decl + // tag numbers in EnumDescriptorProto + enumValuePath = 2 // value +) + +var supportTypeAliases bool + +func init() { + for _, tag := range build.Default.ReleaseTags { + if tag == "go1.9" { + supportTypeAliases = true + return + } + } +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/generator/internal/remap/remap.go b/api/vendor/github.com/golang/protobuf/protoc-gen-go/generator/internal/remap/remap.go new file mode 100644 index 0000000..a9b6103 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/generator/internal/remap/remap.go @@ -0,0 +1,117 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2017 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +/* +Package remap handles tracking the locations of Go tokens in a source text +across a rewrite by the Go formatter. +*/ +package remap + +import ( + "fmt" + "go/scanner" + "go/token" +) + +// A Location represents a span of byte offsets in the source text. +type Location struct { + Pos, End int // End is exclusive +} + +// A Map represents a mapping between token locations in an input source text +// and locations in the correspnding output text. +type Map map[Location]Location + +// Find reports whether the specified span is recorded by m, and if so returns +// the new location it was mapped to. If the input span was not found, the +// returned location is the same as the input. +func (m Map) Find(pos, end int) (Location, bool) { + key := Location{ + Pos: pos, + End: end, + } + if loc, ok := m[key]; ok { + return loc, true + } + return key, false +} + +func (m Map) add(opos, oend, npos, nend int) { + m[Location{Pos: opos, End: oend}] = Location{Pos: npos, End: nend} +} + +// Compute constructs a location mapping from input to output. An error is +// reported if any of the tokens of output cannot be mapped. +func Compute(input, output []byte) (Map, error) { + itok := tokenize(input) + otok := tokenize(output) + if len(itok) != len(otok) { + return nil, fmt.Errorf("wrong number of tokens, %d ≠ %d", len(itok), len(otok)) + } + m := make(Map) + for i, ti := range itok { + to := otok[i] + if ti.Token != to.Token { + return nil, fmt.Errorf("token %d type mismatch: %s ≠ %s", i+1, ti, to) + } + m.add(ti.pos, ti.end, to.pos, to.end) + } + return m, nil +} + +// tokinfo records the span and type of a source token. +type tokinfo struct { + pos, end int + token.Token +} + +func tokenize(src []byte) []tokinfo { + fs := token.NewFileSet() + var s scanner.Scanner + s.Init(fs.AddFile("src", fs.Base(), len(src)), src, nil, scanner.ScanComments) + var info []tokinfo + for { + pos, next, lit := s.Scan() + switch next { + case token.SEMICOLON: + continue + } + info = append(info, tokinfo{ + pos: int(pos - 1), + end: int(pos + token.Pos(len(lit)) - 1), + Token: next, + }) + if next == token.EOF { + break + } + } + return info +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/generator/internal/remap/remap_test.go b/api/vendor/github.com/golang/protobuf/protoc-gen-go/generator/internal/remap/remap_test.go new file mode 100644 index 0000000..ccc7fca --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/generator/internal/remap/remap_test.go @@ -0,0 +1,82 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2017 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package remap + +import ( + "go/format" + "testing" +) + +func TestErrors(t *testing.T) { + tests := []struct { + in, out string + }{ + {"", "x"}, + {"x", ""}, + {"var x int = 5\n", "var x = 5\n"}, + {"these are \"one\" thing", "those are 'another' thing"}, + } + for _, test := range tests { + m, err := Compute([]byte(test.in), []byte(test.out)) + if err != nil { + t.Logf("Got expected error: %v", err) + continue + } + t.Errorf("Compute(%q, %q): got %+v, wanted error", test.in, test.out, m) + } +} + +func TestMatching(t *testing.T) { + // The input is a source text that will be rearranged by the formatter. + const input = `package foo +var s int +func main(){} +` + + output, err := format.Source([]byte(input)) + if err != nil { + t.Fatalf("Formatting failed: %v", err) + } + m, err := Compute([]byte(input), output) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + + // Verify that the mapped locations have the same text. + for key, val := range m { + want := input[key.Pos:key.End] + got := string(output[val.Pos:val.End]) + if got != want { + t.Errorf("Token at %d:%d: got %q, want %q", key.Pos, key.End, got, want) + } + } +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/generator/name_test.go b/api/vendor/github.com/golang/protobuf/protoc-gen-go/generator/name_test.go new file mode 100644 index 0000000..571147c --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/generator/name_test.go @@ -0,0 +1,115 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2013 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package generator + +import ( + "testing" + + "github.com/golang/protobuf/protoc-gen-go/descriptor" +) + +func TestCamelCase(t *testing.T) { + tests := []struct { + in, want string + }{ + {"one", "One"}, + {"one_two", "OneTwo"}, + {"_my_field_name_2", "XMyFieldName_2"}, + {"Something_Capped", "Something_Capped"}, + {"my_Name", "My_Name"}, + {"OneTwo", "OneTwo"}, + {"_", "X"}, + {"_a_", "XA_"}, + } + for _, tc := range tests { + if got := CamelCase(tc.in); got != tc.want { + t.Errorf("CamelCase(%q) = %q, want %q", tc.in, got, tc.want) + } + } +} + +func TestGoPackageOption(t *testing.T) { + tests := []struct { + in string + impPath GoImportPath + pkg GoPackageName + ok bool + }{ + {"", "", "", false}, + {"foo", "", "foo", true}, + {"github.com/golang/bar", "github.com/golang/bar", "bar", true}, + {"github.com/golang/bar;baz", "github.com/golang/bar", "baz", true}, + } + for _, tc := range tests { + d := &FileDescriptor{ + FileDescriptorProto: &descriptor.FileDescriptorProto{ + Options: &descriptor.FileOptions{ + GoPackage: &tc.in, + }, + }, + } + impPath, pkg, ok := d.goPackageOption() + if impPath != tc.impPath || pkg != tc.pkg || ok != tc.ok { + t.Errorf("go_package = %q => (%q, %q, %t), want (%q, %q, %t)", tc.in, + impPath, pkg, ok, tc.impPath, tc.pkg, tc.ok) + } + } +} + +func TestUnescape(t *testing.T) { + tests := []struct { + in string + out string + }{ + // successful cases, including all kinds of escapes + {"", ""}, + {"foo bar baz frob nitz", "foo bar baz frob nitz"}, + {`\000\001\002\003\004\005\006\007`, string([]byte{0, 1, 2, 3, 4, 5, 6, 7})}, + {`\a\b\f\n\r\t\v\\\?\'\"`, string([]byte{'\a', '\b', '\f', '\n', '\r', '\t', '\v', '\\', '?', '\'', '"'})}, + {`\x10\x20\x30\x40\x50\x60\x70\x80`, string([]byte{16, 32, 48, 64, 80, 96, 112, 128})}, + // variable length octal escapes + {`\0\018\222\377\3\04\005\6\07`, string([]byte{0, 1, '8', 0222, 255, 3, 4, 5, 6, 7})}, + // malformed escape sequences left as is + {"foo \\g bar", "foo \\g bar"}, + {"foo \\xg0 bar", "foo \\xg0 bar"}, + {"\\", "\\"}, + {"\\x", "\\x"}, + {"\\xf", "\\xf"}, + {"\\777", "\\777"}, // overflows byte + } + for _, tc := range tests { + s := unescape(tc.in) + if s != tc.out { + t.Errorf("doUnescape(%q) = %q; should have been %q", tc.in, s, tc.out) + } + } +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/golden_test.go b/api/vendor/github.com/golang/protobuf/protoc-gen-go/golden_test.go new file mode 100644 index 0000000..2630de6 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/golden_test.go @@ -0,0 +1,422 @@ +package main + +import ( + "bytes" + "flag" + "fmt" + "go/build" + "go/parser" + "go/token" + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "regexp" + "runtime" + "strings" + "testing" +) + +// Set --regenerate to regenerate the golden files. +var regenerate = flag.Bool("regenerate", false, "regenerate golden files") + +// When the environment variable RUN_AS_PROTOC_GEN_GO is set, we skip running +// tests and instead act as protoc-gen-go. This allows the test binary to +// pass itself to protoc. +func init() { + if os.Getenv("RUN_AS_PROTOC_GEN_GO") != "" { + main() + os.Exit(0) + } +} + +func TestGolden(t *testing.T) { + workdir, err := ioutil.TempDir("", "proto-test") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(workdir) + + // Find all the proto files we need to compile. We assume that each directory + // contains the files for a single package. + supportTypeAliases := hasReleaseTag("go1.9") + packages := map[string][]string{} + err = filepath.Walk("testdata", func(path string, info os.FileInfo, err error) error { + if filepath.Base(path) == "import_public" && !supportTypeAliases { + // Public imports require type alias support. + return filepath.SkipDir + } + if !strings.HasSuffix(path, ".proto") { + return nil + } + dir := filepath.Dir(path) + packages[dir] = append(packages[dir], path) + return nil + }) + if err != nil { + t.Fatal(err) + } + + // Compile each package, using this binary as protoc-gen-go. + for _, sources := range packages { + args := []string{"-Itestdata", "--go_out=plugins=grpc,paths=source_relative:" + workdir} + args = append(args, sources...) + protoc(t, args) + } + + // Compare each generated file to the golden version. + filepath.Walk(workdir, func(genPath string, info os.FileInfo, _ error) error { + if info.IsDir() { + return nil + } + + // For each generated file, figure out the path to the corresponding + // golden file in the testdata directory. + relPath, err := filepath.Rel(workdir, genPath) + if err != nil { + t.Errorf("filepath.Rel(%q, %q): %v", workdir, genPath, err) + return nil + } + if filepath.SplitList(relPath)[0] == ".." { + t.Errorf("generated file %q is not relative to %q", genPath, workdir) + } + goldenPath := filepath.Join("testdata", relPath) + + got, err := ioutil.ReadFile(genPath) + if err != nil { + t.Error(err) + return nil + } + if *regenerate { + // If --regenerate set, just rewrite the golden files. + err := ioutil.WriteFile(goldenPath, got, 0666) + if err != nil { + t.Error(err) + } + return nil + } + + want, err := ioutil.ReadFile(goldenPath) + if err != nil { + t.Error(err) + return nil + } + + want = fdescRE.ReplaceAll(want, nil) + got = fdescRE.ReplaceAll(got, nil) + if bytes.Equal(got, want) { + return nil + } + + cmd := exec.Command("diff", "-u", goldenPath, genPath) + out, _ := cmd.CombinedOutput() + t.Errorf("golden file differs: %v\n%v", relPath, string(out)) + return nil + }) +} + +var fdescRE = regexp.MustCompile(`(?ms)^var fileDescriptor.*}`) + +// Source files used by TestParameters. +const ( + aProto = ` +syntax = "proto3"; +package test.alpha; +option go_package = "package/alpha"; +import "beta/b.proto"; +message M { test.beta.M field = 1; }` + + bProto = ` +syntax = "proto3"; +package test.beta; +// no go_package option +message M {}` +) + +func TestParameters(t *testing.T) { + for _, test := range []struct { + parameters string + wantFiles map[string]bool + wantImportsA map[string]bool + wantPackageA string + wantPackageB string + }{{ + parameters: "", + wantFiles: map[string]bool{ + "package/alpha/a.pb.go": true, + "beta/b.pb.go": true, + }, + wantPackageA: "alpha", + wantPackageB: "test_beta", + wantImportsA: map[string]bool{ + "github.com/golang/protobuf/proto": true, + "beta": true, + }, + }, { + parameters: "import_prefix=prefix", + wantFiles: map[string]bool{ + "package/alpha/a.pb.go": true, + "beta/b.pb.go": true, + }, + wantPackageA: "alpha", + wantPackageB: "test_beta", + wantImportsA: map[string]bool{ + // This really doesn't seem like useful behavior. + "prefixgithub.com/golang/protobuf/proto": true, + "prefixbeta": true, + }, + }, { + // import_path only affects the 'package' line. + parameters: "import_path=import/path/of/pkg", + wantPackageA: "alpha", + wantPackageB: "pkg", + wantFiles: map[string]bool{ + "package/alpha/a.pb.go": true, + "beta/b.pb.go": true, + }, + }, { + parameters: "Mbeta/b.proto=package/gamma", + wantFiles: map[string]bool{ + "package/alpha/a.pb.go": true, + "beta/b.pb.go": true, + }, + wantPackageA: "alpha", + wantPackageB: "test_beta", + wantImportsA: map[string]bool{ + "github.com/golang/protobuf/proto": true, + // Rewritten by the M parameter. + "package/gamma": true, + }, + }, { + parameters: "import_prefix=prefix,Mbeta/b.proto=package/gamma", + wantFiles: map[string]bool{ + "package/alpha/a.pb.go": true, + "beta/b.pb.go": true, + }, + wantPackageA: "alpha", + wantPackageB: "test_beta", + wantImportsA: map[string]bool{ + // import_prefix applies after M. + "prefixpackage/gamma": true, + }, + }, { + parameters: "paths=source_relative", + wantFiles: map[string]bool{ + "alpha/a.pb.go": true, + "beta/b.pb.go": true, + }, + wantPackageA: "alpha", + wantPackageB: "test_beta", + }, { + parameters: "paths=source_relative,import_prefix=prefix", + wantFiles: map[string]bool{ + // import_prefix doesn't affect filenames. + "alpha/a.pb.go": true, + "beta/b.pb.go": true, + }, + wantPackageA: "alpha", + wantPackageB: "test_beta", + }} { + name := test.parameters + if name == "" { + name = "defaults" + } + // TODO: Switch to t.Run when we no longer support Go 1.6. + t.Logf("TEST: %v", name) + workdir, err := ioutil.TempDir("", "proto-test") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(workdir) + + for _, dir := range []string{"alpha", "beta", "out"} { + if err := os.MkdirAll(filepath.Join(workdir, dir), 0777); err != nil { + t.Fatal(err) + } + } + + if err := ioutil.WriteFile(filepath.Join(workdir, "alpha", "a.proto"), []byte(aProto), 0666); err != nil { + t.Fatal(err) + } + + if err := ioutil.WriteFile(filepath.Join(workdir, "beta", "b.proto"), []byte(bProto), 0666); err != nil { + t.Fatal(err) + } + + protoc(t, []string{ + "-I" + workdir, + "--go_out=" + test.parameters + ":" + filepath.Join(workdir, "out"), + filepath.Join(workdir, "alpha", "a.proto"), + }) + protoc(t, []string{ + "-I" + workdir, + "--go_out=" + test.parameters + ":" + filepath.Join(workdir, "out"), + filepath.Join(workdir, "beta", "b.proto"), + }) + + contents := make(map[string]string) + gotFiles := make(map[string]bool) + outdir := filepath.Join(workdir, "out") + filepath.Walk(outdir, func(p string, info os.FileInfo, _ error) error { + if info.IsDir() { + return nil + } + base := filepath.Base(p) + if base == "a.pb.go" || base == "b.pb.go" { + b, err := ioutil.ReadFile(p) + if err != nil { + t.Fatal(err) + } + contents[base] = string(b) + } + relPath, _ := filepath.Rel(outdir, p) + gotFiles[relPath] = true + return nil + }) + for got := range gotFiles { + if runtime.GOOS == "windows" { + got = filepath.ToSlash(got) + } + if !test.wantFiles[got] { + t.Errorf("unexpected output file: %v", got) + } + } + for want := range test.wantFiles { + if runtime.GOOS == "windows" { + want = filepath.FromSlash(want) + } + if !gotFiles[want] { + t.Errorf("missing output file: %v", want) + } + } + gotPackageA, gotImports, err := parseFile(contents["a.pb.go"]) + if err != nil { + t.Fatal(err) + } + gotPackageB, _, err := parseFile(contents["b.pb.go"]) + if err != nil { + t.Fatal(err) + } + if got, want := gotPackageA, test.wantPackageA; want != got { + t.Errorf("output file a.pb.go is package %q, want %q", got, want) + } + if got, want := gotPackageB, test.wantPackageB; want != got { + t.Errorf("output file b.pb.go is package %q, want %q", got, want) + } + missingImport := false + WantImport: + for want := range test.wantImportsA { + for _, imp := range gotImports { + if `"`+want+`"` == imp { + continue WantImport + } + } + t.Errorf("output file a.pb.go does not contain expected import %q", want) + missingImport = true + } + if missingImport { + t.Error("got imports:") + for _, imp := range gotImports { + t.Errorf(" %v", imp) + } + } + } +} + +func TestPackageComment(t *testing.T) { + workdir, err := ioutil.TempDir("", "proto-test") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(workdir) + + var packageRE = regexp.MustCompile(`(?m)^package .*`) + + for i, test := range []struct { + goPackageOption string + wantPackage string + }{{ + goPackageOption: ``, + wantPackage: `package proto_package`, + }, { + goPackageOption: `option go_package = "go_package";`, + wantPackage: `package go_package`, + }, { + goPackageOption: `option go_package = "import/path/of/go_package";`, + wantPackage: `package go_package // import "import/path/of/go_package"`, + }, { + goPackageOption: `option go_package = "import/path/of/something;go_package";`, + wantPackage: `package go_package // import "import/path/of/something"`, + }, { + goPackageOption: `option go_package = "import_path;go_package";`, + wantPackage: `package go_package // import "import_path"`, + }} { + srcName := filepath.Join(workdir, fmt.Sprintf("%d.proto", i)) + tgtName := filepath.Join(workdir, fmt.Sprintf("%d.pb.go", i)) + + buf := &bytes.Buffer{} + fmt.Fprintln(buf, `syntax = "proto3";`) + fmt.Fprintln(buf, `package proto_package;`) + fmt.Fprintln(buf, test.goPackageOption) + if err := ioutil.WriteFile(srcName, buf.Bytes(), 0666); err != nil { + t.Fatal(err) + } + + protoc(t, []string{"-I" + workdir, "--go_out=paths=source_relative:" + workdir, srcName}) + + out, err := ioutil.ReadFile(tgtName) + if err != nil { + t.Fatal(err) + } + + pkg := packageRE.Find(out) + if pkg == nil { + t.Errorf("generated .pb.go contains no package line\n\nsource:\n%v\n\noutput:\n%v", buf.String(), string(out)) + continue + } + + if got, want := string(pkg), test.wantPackage; got != want { + t.Errorf("unexpected package statement with go_package = %q\n got: %v\nwant: %v", test.goPackageOption, got, want) + } + } +} + +// parseFile returns a file's package name and a list of all packages it imports. +func parseFile(source string) (packageName string, imports []string, err error) { + fset := token.NewFileSet() + f, err := parser.ParseFile(fset, "", source, parser.ImportsOnly) + if err != nil { + return "", nil, err + } + for _, imp := range f.Imports { + imports = append(imports, imp.Path.Value) + } + return f.Name.Name, imports, nil +} + +func protoc(t *testing.T, args []string) { + cmd := exec.Command("protoc", "--plugin=protoc-gen-go="+os.Args[0]) + cmd.Args = append(cmd.Args, args...) + // We set the RUN_AS_PROTOC_GEN_GO environment variable to indicate that + // the subprocess should act as a proto compiler rather than a test. + cmd.Env = append(os.Environ(), "RUN_AS_PROTOC_GEN_GO=1") + out, err := cmd.CombinedOutput() + if len(out) > 0 || err != nil { + t.Log("RUNNING: ", strings.Join(cmd.Args, " ")) + } + if len(out) > 0 { + t.Log(string(out)) + } + if err != nil { + t.Fatalf("protoc: %v", err) + } +} + +func hasReleaseTag(want string) bool { + for _, tag := range build.Default.ReleaseTags { + if tag == want { + return true + } + } + return false +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/grpc/grpc.go b/api/vendor/github.com/golang/protobuf/protoc-gen-go/grpc/grpc.go new file mode 100644 index 0000000..1723680 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/grpc/grpc.go @@ -0,0 +1,483 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2015 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +// Package grpc outputs gRPC service descriptions in Go code. +// It runs as a plugin for the Go protocol buffer compiler plugin. +// It is linked in to protoc-gen-go. +package grpc + +import ( + "fmt" + "path" + "strconv" + "strings" + + pb "github.com/golang/protobuf/protoc-gen-go/descriptor" + "github.com/golang/protobuf/protoc-gen-go/generator" +) + +// generatedCodeVersion indicates a version of the generated code. +// It is incremented whenever an incompatibility between the generated code and +// the grpc package is introduced; the generated code references +// a constant, grpc.SupportPackageIsVersionN (where N is generatedCodeVersion). +const generatedCodeVersion = 4 + +// Paths for packages used by code generated in this file, +// relative to the import_prefix of the generator.Generator. +const ( + contextPkgPath = "golang.org/x/net/context" + grpcPkgPath = "google.golang.org/grpc" +) + +func init() { + generator.RegisterPlugin(new(grpc)) +} + +// grpc is an implementation of the Go protocol buffer compiler's +// plugin architecture. It generates bindings for gRPC support. +type grpc struct { + gen *generator.Generator +} + +// Name returns the name of this plugin, "grpc". +func (g *grpc) Name() string { + return "grpc" +} + +// The names for packages imported in the generated code. +// They may vary from the final path component of the import path +// if the name is used by other packages. +var ( + contextPkg string + grpcPkg string +) + +// Init initializes the plugin. +func (g *grpc) Init(gen *generator.Generator) { + g.gen = gen + contextPkg = generator.RegisterUniquePackageName("context", nil) + grpcPkg = generator.RegisterUniquePackageName("grpc", nil) +} + +// Given a type name defined in a .proto, return its object. +// Also record that we're using it, to guarantee the associated import. +func (g *grpc) objectNamed(name string) generator.Object { + g.gen.RecordTypeUse(name) + return g.gen.ObjectNamed(name) +} + +// Given a type name defined in a .proto, return its name as we will print it. +func (g *grpc) typeName(str string) string { + return g.gen.TypeName(g.objectNamed(str)) +} + +// P forwards to g.gen.P. +func (g *grpc) P(args ...interface{}) { g.gen.P(args...) } + +// Generate generates code for the services in the given file. +func (g *grpc) Generate(file *generator.FileDescriptor) { + if len(file.FileDescriptorProto.Service) == 0 { + return + } + + g.P("// Reference imports to suppress errors if they are not otherwise used.") + g.P("var _ ", contextPkg, ".Context") + g.P("var _ ", grpcPkg, ".ClientConn") + g.P() + + // Assert version compatibility. + g.P("// This is a compile-time assertion to ensure that this generated file") + g.P("// is compatible with the grpc package it is being compiled against.") + g.P("const _ = ", grpcPkg, ".SupportPackageIsVersion", generatedCodeVersion) + g.P() + + for i, service := range file.FileDescriptorProto.Service { + g.generateService(file, service, i) + } +} + +// GenerateImports generates the import declaration for this file. +func (g *grpc) GenerateImports(file *generator.FileDescriptor) { + if len(file.FileDescriptorProto.Service) == 0 { + return + } + g.P("import (") + g.P(contextPkg, " ", generator.GoImportPath(path.Join(string(g.gen.ImportPrefix), contextPkgPath))) + g.P(grpcPkg, " ", generator.GoImportPath(path.Join(string(g.gen.ImportPrefix), grpcPkgPath))) + g.P(")") + g.P() +} + +// reservedClientName records whether a client name is reserved on the client side. +var reservedClientName = map[string]bool{ + // TODO: do we need any in gRPC? +} + +func unexport(s string) string { return strings.ToLower(s[:1]) + s[1:] } + +// deprecationComment is the standard comment added to deprecated +// messages, fields, enums, and enum values. +var deprecationComment = "// Deprecated: Do not use." + +// generateService generates all the code for the named service. +func (g *grpc) generateService(file *generator.FileDescriptor, service *pb.ServiceDescriptorProto, index int) { + path := fmt.Sprintf("6,%d", index) // 6 means service. + + origServName := service.GetName() + fullServName := origServName + if pkg := file.GetPackage(); pkg != "" { + fullServName = pkg + "." + fullServName + } + servName := generator.CamelCase(origServName) + deprecated := service.GetOptions().GetDeprecated() + + g.P() + g.P("// Client API for ", servName, " service") + g.P() + + // Client interface. + if deprecated { + g.P(deprecationComment) + } + g.P("type ", servName, "Client interface {") + for i, method := range service.Method { + g.gen.PrintComments(fmt.Sprintf("%s,2,%d", path, i)) // 2 means method in a service. + g.P(g.generateClientSignature(servName, method)) + } + g.P("}") + g.P() + + // Client structure. + g.P("type ", unexport(servName), "Client struct {") + g.P("cc *", grpcPkg, ".ClientConn") + g.P("}") + g.P() + + // NewClient factory. + if deprecated { + g.P(deprecationComment) + } + g.P("func New", servName, "Client (cc *", grpcPkg, ".ClientConn) ", servName, "Client {") + g.P("return &", unexport(servName), "Client{cc}") + g.P("}") + g.P() + + var methodIndex, streamIndex int + serviceDescVar := "_" + servName + "_serviceDesc" + // Client method implementations. + for _, method := range service.Method { + var descExpr string + if !method.GetServerStreaming() && !method.GetClientStreaming() { + // Unary RPC method + descExpr = fmt.Sprintf("&%s.Methods[%d]", serviceDescVar, methodIndex) + methodIndex++ + } else { + // Streaming RPC method + descExpr = fmt.Sprintf("&%s.Streams[%d]", serviceDescVar, streamIndex) + streamIndex++ + } + g.generateClientMethod(servName, fullServName, serviceDescVar, method, descExpr) + } + + g.P("// Server API for ", servName, " service") + g.P() + + // Server interface. + if deprecated { + g.P(deprecationComment) + } + serverType := servName + "Server" + g.P("type ", serverType, " interface {") + for i, method := range service.Method { + g.gen.PrintComments(fmt.Sprintf("%s,2,%d", path, i)) // 2 means method in a service. + g.P(g.generateServerSignature(servName, method)) + } + g.P("}") + g.P() + + // Server registration. + if deprecated { + g.P(deprecationComment) + } + g.P("func Register", servName, "Server(s *", grpcPkg, ".Server, srv ", serverType, ") {") + g.P("s.RegisterService(&", serviceDescVar, `, srv)`) + g.P("}") + g.P() + + // Server handler implementations. + var handlerNames []string + for _, method := range service.Method { + hname := g.generateServerMethod(servName, fullServName, method) + handlerNames = append(handlerNames, hname) + } + + // Service descriptor. + g.P("var ", serviceDescVar, " = ", grpcPkg, ".ServiceDesc {") + g.P("ServiceName: ", strconv.Quote(fullServName), ",") + g.P("HandlerType: (*", serverType, ")(nil),") + g.P("Methods: []", grpcPkg, ".MethodDesc{") + for i, method := range service.Method { + if method.GetServerStreaming() || method.GetClientStreaming() { + continue + } + g.P("{") + g.P("MethodName: ", strconv.Quote(method.GetName()), ",") + g.P("Handler: ", handlerNames[i], ",") + g.P("},") + } + g.P("},") + g.P("Streams: []", grpcPkg, ".StreamDesc{") + for i, method := range service.Method { + if !method.GetServerStreaming() && !method.GetClientStreaming() { + continue + } + g.P("{") + g.P("StreamName: ", strconv.Quote(method.GetName()), ",") + g.P("Handler: ", handlerNames[i], ",") + if method.GetServerStreaming() { + g.P("ServerStreams: true,") + } + if method.GetClientStreaming() { + g.P("ClientStreams: true,") + } + g.P("},") + } + g.P("},") + g.P("Metadata: \"", file.GetName(), "\",") + g.P("}") + g.P() +} + +// generateClientSignature returns the client-side signature for a method. +func (g *grpc) generateClientSignature(servName string, method *pb.MethodDescriptorProto) string { + origMethName := method.GetName() + methName := generator.CamelCase(origMethName) + if reservedClientName[methName] { + methName += "_" + } + reqArg := ", in *" + g.typeName(method.GetInputType()) + if method.GetClientStreaming() { + reqArg = "" + } + respName := "*" + g.typeName(method.GetOutputType()) + if method.GetServerStreaming() || method.GetClientStreaming() { + respName = servName + "_" + generator.CamelCase(origMethName) + "Client" + } + return fmt.Sprintf("%s(ctx %s.Context%s, opts ...%s.CallOption) (%s, error)", methName, contextPkg, reqArg, grpcPkg, respName) +} + +func (g *grpc) generateClientMethod(servName, fullServName, serviceDescVar string, method *pb.MethodDescriptorProto, descExpr string) { + sname := fmt.Sprintf("/%s/%s", fullServName, method.GetName()) + methName := generator.CamelCase(method.GetName()) + inType := g.typeName(method.GetInputType()) + outType := g.typeName(method.GetOutputType()) + + if method.GetOptions().GetDeprecated() { + g.P(deprecationComment) + } + g.P("func (c *", unexport(servName), "Client) ", g.generateClientSignature(servName, method), "{") + if !method.GetServerStreaming() && !method.GetClientStreaming() { + g.P("out := new(", outType, ")") + // TODO: Pass descExpr to Invoke. + g.P("err := ", grpcPkg, `.Invoke(ctx, "`, sname, `", in, out, c.cc, opts...)`) + g.P("if err != nil { return nil, err }") + g.P("return out, nil") + g.P("}") + g.P() + return + } + streamType := unexport(servName) + methName + "Client" + g.P("stream, err := ", grpcPkg, ".NewClientStream(ctx, ", descExpr, `, c.cc, "`, sname, `", opts...)`) + g.P("if err != nil { return nil, err }") + g.P("x := &", streamType, "{stream}") + if !method.GetClientStreaming() { + g.P("if err := x.ClientStream.SendMsg(in); err != nil { return nil, err }") + g.P("if err := x.ClientStream.CloseSend(); err != nil { return nil, err }") + } + g.P("return x, nil") + g.P("}") + g.P() + + genSend := method.GetClientStreaming() + genRecv := method.GetServerStreaming() + genCloseAndRecv := !method.GetServerStreaming() + + // Stream auxiliary types and methods. + g.P("type ", servName, "_", methName, "Client interface {") + if genSend { + g.P("Send(*", inType, ") error") + } + if genRecv { + g.P("Recv() (*", outType, ", error)") + } + if genCloseAndRecv { + g.P("CloseAndRecv() (*", outType, ", error)") + } + g.P(grpcPkg, ".ClientStream") + g.P("}") + g.P() + + g.P("type ", streamType, " struct {") + g.P(grpcPkg, ".ClientStream") + g.P("}") + g.P() + + if genSend { + g.P("func (x *", streamType, ") Send(m *", inType, ") error {") + g.P("return x.ClientStream.SendMsg(m)") + g.P("}") + g.P() + } + if genRecv { + g.P("func (x *", streamType, ") Recv() (*", outType, ", error) {") + g.P("m := new(", outType, ")") + g.P("if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err }") + g.P("return m, nil") + g.P("}") + g.P() + } + if genCloseAndRecv { + g.P("func (x *", streamType, ") CloseAndRecv() (*", outType, ", error) {") + g.P("if err := x.ClientStream.CloseSend(); err != nil { return nil, err }") + g.P("m := new(", outType, ")") + g.P("if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err }") + g.P("return m, nil") + g.P("}") + g.P() + } +} + +// generateServerSignature returns the server-side signature for a method. +func (g *grpc) generateServerSignature(servName string, method *pb.MethodDescriptorProto) string { + origMethName := method.GetName() + methName := generator.CamelCase(origMethName) + if reservedClientName[methName] { + methName += "_" + } + + var reqArgs []string + ret := "error" + if !method.GetServerStreaming() && !method.GetClientStreaming() { + reqArgs = append(reqArgs, contextPkg+".Context") + ret = "(*" + g.typeName(method.GetOutputType()) + ", error)" + } + if !method.GetClientStreaming() { + reqArgs = append(reqArgs, "*"+g.typeName(method.GetInputType())) + } + if method.GetServerStreaming() || method.GetClientStreaming() { + reqArgs = append(reqArgs, servName+"_"+generator.CamelCase(origMethName)+"Server") + } + + return methName + "(" + strings.Join(reqArgs, ", ") + ") " + ret +} + +func (g *grpc) generateServerMethod(servName, fullServName string, method *pb.MethodDescriptorProto) string { + methName := generator.CamelCase(method.GetName()) + hname := fmt.Sprintf("_%s_%s_Handler", servName, methName) + inType := g.typeName(method.GetInputType()) + outType := g.typeName(method.GetOutputType()) + + if !method.GetServerStreaming() && !method.GetClientStreaming() { + g.P("func ", hname, "(srv interface{}, ctx ", contextPkg, ".Context, dec func(interface{}) error, interceptor ", grpcPkg, ".UnaryServerInterceptor) (interface{}, error) {") + g.P("in := new(", inType, ")") + g.P("if err := dec(in); err != nil { return nil, err }") + g.P("if interceptor == nil { return srv.(", servName, "Server).", methName, "(ctx, in) }") + g.P("info := &", grpcPkg, ".UnaryServerInfo{") + g.P("Server: srv,") + g.P("FullMethod: ", strconv.Quote(fmt.Sprintf("/%s/%s", fullServName, methName)), ",") + g.P("}") + g.P("handler := func(ctx ", contextPkg, ".Context, req interface{}) (interface{}, error) {") + g.P("return srv.(", servName, "Server).", methName, "(ctx, req.(*", inType, "))") + g.P("}") + g.P("return interceptor(ctx, in, info, handler)") + g.P("}") + g.P() + return hname + } + streamType := unexport(servName) + methName + "Server" + g.P("func ", hname, "(srv interface{}, stream ", grpcPkg, ".ServerStream) error {") + if !method.GetClientStreaming() { + g.P("m := new(", inType, ")") + g.P("if err := stream.RecvMsg(m); err != nil { return err }") + g.P("return srv.(", servName, "Server).", methName, "(m, &", streamType, "{stream})") + } else { + g.P("return srv.(", servName, "Server).", methName, "(&", streamType, "{stream})") + } + g.P("}") + g.P() + + genSend := method.GetServerStreaming() + genSendAndClose := !method.GetServerStreaming() + genRecv := method.GetClientStreaming() + + // Stream auxiliary types and methods. + g.P("type ", servName, "_", methName, "Server interface {") + if genSend { + g.P("Send(*", outType, ") error") + } + if genSendAndClose { + g.P("SendAndClose(*", outType, ") error") + } + if genRecv { + g.P("Recv() (*", inType, ", error)") + } + g.P(grpcPkg, ".ServerStream") + g.P("}") + g.P() + + g.P("type ", streamType, " struct {") + g.P(grpcPkg, ".ServerStream") + g.P("}") + g.P() + + if genSend { + g.P("func (x *", streamType, ") Send(m *", outType, ") error {") + g.P("return x.ServerStream.SendMsg(m)") + g.P("}") + g.P() + } + if genSendAndClose { + g.P("func (x *", streamType, ") SendAndClose(m *", outType, ") error {") + g.P("return x.ServerStream.SendMsg(m)") + g.P("}") + g.P() + } + if genRecv { + g.P("func (x *", streamType, ") Recv() (*", inType, ", error) {") + g.P("m := new(", inType, ")") + g.P("if err := x.ServerStream.RecvMsg(m); err != nil { return nil, err }") + g.P("return m, nil") + g.P("}") + g.P() + } + + return hname +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/link_grpc.go b/api/vendor/github.com/golang/protobuf/protoc-gen-go/link_grpc.go new file mode 100644 index 0000000..532a550 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/link_grpc.go @@ -0,0 +1,34 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2015 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package main + +import _ "github.com/golang/protobuf/protoc-gen-go/grpc" diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/main.go b/api/vendor/github.com/golang/protobuf/protoc-gen-go/main.go new file mode 100644 index 0000000..8e2486d --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/main.go @@ -0,0 +1,98 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +// protoc-gen-go is a plugin for the Google protocol buffer compiler to generate +// Go code. Run it by building this program and putting it in your path with +// the name +// protoc-gen-go +// That word 'go' at the end becomes part of the option string set for the +// protocol compiler, so once the protocol compiler (protoc) is installed +// you can run +// protoc --go_out=output_directory input_directory/file.proto +// to generate Go bindings for the protocol defined by file.proto. +// With that input, the output will be written to +// output_directory/file.pb.go +// +// The generated code is documented in the package comment for +// the library. +// +// See the README and documentation for protocol buffers to learn more: +// https://developers.google.com/protocol-buffers/ +package main + +import ( + "io/ioutil" + "os" + + "github.com/golang/protobuf/proto" + "github.com/golang/protobuf/protoc-gen-go/generator" +) + +func main() { + // Begin by allocating a generator. The request and response structures are stored there + // so we can do error handling easily - the response structure contains the field to + // report failure. + g := generator.New() + + data, err := ioutil.ReadAll(os.Stdin) + if err != nil { + g.Error(err, "reading input") + } + + if err := proto.Unmarshal(data, g.Request); err != nil { + g.Error(err, "parsing input proto") + } + + if len(g.Request.FileToGenerate) == 0 { + g.Fail("no files to generate") + } + + g.CommandLineParameters(g.Request.GetParameter()) + + // Create a wrapped version of the Descriptors and EnumDescriptors that + // point to the file that defines them. + g.WrapTypes() + + g.SetPackageNames() + g.BuildTypeNameMap() + + g.GenerateAllFiles() + + // Send back the results. + data, err = proto.Marshal(g.Response) + if err != nil { + g.Error(err, "failed to marshal output proto") + } + _, err = os.Stdout.Write(data) + if err != nil { + g.Error(err, "failed to write output proto") + } +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.pb.go b/api/vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.pb.go new file mode 100644 index 0000000..61bfc10 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.pb.go @@ -0,0 +1,369 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/compiler/plugin.proto + +/* +Package plugin_go is a generated protocol buffer package. + +It is generated from these files: + google/protobuf/compiler/plugin.proto + +It has these top-level messages: + Version + CodeGeneratorRequest + CodeGeneratorResponse +*/ +package plugin_go + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" +import google_protobuf "github.com/golang/protobuf/protoc-gen-go/descriptor" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +// The version number of protocol compiler. +type Version struct { + Major *int32 `protobuf:"varint,1,opt,name=major" json:"major,omitempty"` + Minor *int32 `protobuf:"varint,2,opt,name=minor" json:"minor,omitempty"` + Patch *int32 `protobuf:"varint,3,opt,name=patch" json:"patch,omitempty"` + // A suffix for alpha, beta or rc release, e.g., "alpha-1", "rc2". It should + // be empty for mainline stable releases. + Suffix *string `protobuf:"bytes,4,opt,name=suffix" json:"suffix,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Version) Reset() { *m = Version{} } +func (m *Version) String() string { return proto.CompactTextString(m) } +func (*Version) ProtoMessage() {} +func (*Version) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } +func (m *Version) Unmarshal(b []byte) error { + return xxx_messageInfo_Version.Unmarshal(m, b) +} +func (m *Version) Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Version.Marshal(b, m, deterministic) +} +func (dst *Version) XXX_Merge(src proto.Message) { + xxx_messageInfo_Version.Merge(dst, src) +} +func (m *Version) XXX_Size() int { + return xxx_messageInfo_Version.Size(m) +} +func (m *Version) XXX_DiscardUnknown() { + xxx_messageInfo_Version.DiscardUnknown(m) +} + +var xxx_messageInfo_Version proto.InternalMessageInfo + +func (m *Version) GetMajor() int32 { + if m != nil && m.Major != nil { + return *m.Major + } + return 0 +} + +func (m *Version) GetMinor() int32 { + if m != nil && m.Minor != nil { + return *m.Minor + } + return 0 +} + +func (m *Version) GetPatch() int32 { + if m != nil && m.Patch != nil { + return *m.Patch + } + return 0 +} + +func (m *Version) GetSuffix() string { + if m != nil && m.Suffix != nil { + return *m.Suffix + } + return "" +} + +// An encoded CodeGeneratorRequest is written to the plugin's stdin. +type CodeGeneratorRequest struct { + // The .proto files that were explicitly listed on the command-line. The + // code generator should generate code only for these files. Each file's + // descriptor will be included in proto_file, below. + FileToGenerate []string `protobuf:"bytes,1,rep,name=file_to_generate,json=fileToGenerate" json:"file_to_generate,omitempty"` + // The generator parameter passed on the command-line. + Parameter *string `protobuf:"bytes,2,opt,name=parameter" json:"parameter,omitempty"` + // FileDescriptorProtos for all files in files_to_generate and everything + // they import. The files will appear in topological order, so each file + // appears before any file that imports it. + // + // protoc guarantees that all proto_files will be written after + // the fields above, even though this is not technically guaranteed by the + // protobuf wire format. This theoretically could allow a plugin to stream + // in the FileDescriptorProtos and handle them one by one rather than read + // the entire set into memory at once. However, as of this writing, this + // is not similarly optimized on protoc's end -- it will store all fields in + // memory at once before sending them to the plugin. + // + // Type names of fields and extensions in the FileDescriptorProto are always + // fully qualified. + ProtoFile []*google_protobuf.FileDescriptorProto `protobuf:"bytes,15,rep,name=proto_file,json=protoFile" json:"proto_file,omitempty"` + // The version number of protocol compiler. + CompilerVersion *Version `protobuf:"bytes,3,opt,name=compiler_version,json=compilerVersion" json:"compiler_version,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *CodeGeneratorRequest) Reset() { *m = CodeGeneratorRequest{} } +func (m *CodeGeneratorRequest) String() string { return proto.CompactTextString(m) } +func (*CodeGeneratorRequest) ProtoMessage() {} +func (*CodeGeneratorRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } +func (m *CodeGeneratorRequest) Unmarshal(b []byte) error { + return xxx_messageInfo_CodeGeneratorRequest.Unmarshal(m, b) +} +func (m *CodeGeneratorRequest) Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_CodeGeneratorRequest.Marshal(b, m, deterministic) +} +func (dst *CodeGeneratorRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_CodeGeneratorRequest.Merge(dst, src) +} +func (m *CodeGeneratorRequest) XXX_Size() int { + return xxx_messageInfo_CodeGeneratorRequest.Size(m) +} +func (m *CodeGeneratorRequest) XXX_DiscardUnknown() { + xxx_messageInfo_CodeGeneratorRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_CodeGeneratorRequest proto.InternalMessageInfo + +func (m *CodeGeneratorRequest) GetFileToGenerate() []string { + if m != nil { + return m.FileToGenerate + } + return nil +} + +func (m *CodeGeneratorRequest) GetParameter() string { + if m != nil && m.Parameter != nil { + return *m.Parameter + } + return "" +} + +func (m *CodeGeneratorRequest) GetProtoFile() []*google_protobuf.FileDescriptorProto { + if m != nil { + return m.ProtoFile + } + return nil +} + +func (m *CodeGeneratorRequest) GetCompilerVersion() *Version { + if m != nil { + return m.CompilerVersion + } + return nil +} + +// The plugin writes an encoded CodeGeneratorResponse to stdout. +type CodeGeneratorResponse struct { + // Error message. If non-empty, code generation failed. The plugin process + // should exit with status code zero even if it reports an error in this way. + // + // This should be used to indicate errors in .proto files which prevent the + // code generator from generating correct code. Errors which indicate a + // problem in protoc itself -- such as the input CodeGeneratorRequest being + // unparseable -- should be reported by writing a message to stderr and + // exiting with a non-zero status code. + Error *string `protobuf:"bytes,1,opt,name=error" json:"error,omitempty"` + File []*CodeGeneratorResponse_File `protobuf:"bytes,15,rep,name=file" json:"file,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *CodeGeneratorResponse) Reset() { *m = CodeGeneratorResponse{} } +func (m *CodeGeneratorResponse) String() string { return proto.CompactTextString(m) } +func (*CodeGeneratorResponse) ProtoMessage() {} +func (*CodeGeneratorResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } +func (m *CodeGeneratorResponse) Unmarshal(b []byte) error { + return xxx_messageInfo_CodeGeneratorResponse.Unmarshal(m, b) +} +func (m *CodeGeneratorResponse) Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_CodeGeneratorResponse.Marshal(b, m, deterministic) +} +func (dst *CodeGeneratorResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_CodeGeneratorResponse.Merge(dst, src) +} +func (m *CodeGeneratorResponse) XXX_Size() int { + return xxx_messageInfo_CodeGeneratorResponse.Size(m) +} +func (m *CodeGeneratorResponse) XXX_DiscardUnknown() { + xxx_messageInfo_CodeGeneratorResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_CodeGeneratorResponse proto.InternalMessageInfo + +func (m *CodeGeneratorResponse) GetError() string { + if m != nil && m.Error != nil { + return *m.Error + } + return "" +} + +func (m *CodeGeneratorResponse) GetFile() []*CodeGeneratorResponse_File { + if m != nil { + return m.File + } + return nil +} + +// Represents a single generated file. +type CodeGeneratorResponse_File struct { + // The file name, relative to the output directory. The name must not + // contain "." or ".." components and must be relative, not be absolute (so, + // the file cannot lie outside the output directory). "/" must be used as + // the path separator, not "\". + // + // If the name is omitted, the content will be appended to the previous + // file. This allows the generator to break large files into small chunks, + // and allows the generated text to be streamed back to protoc so that large + // files need not reside completely in memory at one time. Note that as of + // this writing protoc does not optimize for this -- it will read the entire + // CodeGeneratorResponse before writing files to disk. + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + // If non-empty, indicates that the named file should already exist, and the + // content here is to be inserted into that file at a defined insertion + // point. This feature allows a code generator to extend the output + // produced by another code generator. The original generator may provide + // insertion points by placing special annotations in the file that look + // like: + // @@protoc_insertion_point(NAME) + // The annotation can have arbitrary text before and after it on the line, + // which allows it to be placed in a comment. NAME should be replaced with + // an identifier naming the point -- this is what other generators will use + // as the insertion_point. Code inserted at this point will be placed + // immediately above the line containing the insertion point (thus multiple + // insertions to the same point will come out in the order they were added). + // The double-@ is intended to make it unlikely that the generated code + // could contain things that look like insertion points by accident. + // + // For example, the C++ code generator places the following line in the + // .pb.h files that it generates: + // // @@protoc_insertion_point(namespace_scope) + // This line appears within the scope of the file's package namespace, but + // outside of any particular class. Another plugin can then specify the + // insertion_point "namespace_scope" to generate additional classes or + // other declarations that should be placed in this scope. + // + // Note that if the line containing the insertion point begins with + // whitespace, the same whitespace will be added to every line of the + // inserted text. This is useful for languages like Python, where + // indentation matters. In these languages, the insertion point comment + // should be indented the same amount as any inserted code will need to be + // in order to work correctly in that context. + // + // The code generator that generates the initial file and the one which + // inserts into it must both run as part of a single invocation of protoc. + // Code generators are executed in the order in which they appear on the + // command line. + // + // If |insertion_point| is present, |name| must also be present. + InsertionPoint *string `protobuf:"bytes,2,opt,name=insertion_point,json=insertionPoint" json:"insertion_point,omitempty"` + // The file contents. + Content *string `protobuf:"bytes,15,opt,name=content" json:"content,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *CodeGeneratorResponse_File) Reset() { *m = CodeGeneratorResponse_File{} } +func (m *CodeGeneratorResponse_File) String() string { return proto.CompactTextString(m) } +func (*CodeGeneratorResponse_File) ProtoMessage() {} +func (*CodeGeneratorResponse_File) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2, 0} } +func (m *CodeGeneratorResponse_File) Unmarshal(b []byte) error { + return xxx_messageInfo_CodeGeneratorResponse_File.Unmarshal(m, b) +} +func (m *CodeGeneratorResponse_File) Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_CodeGeneratorResponse_File.Marshal(b, m, deterministic) +} +func (dst *CodeGeneratorResponse_File) XXX_Merge(src proto.Message) { + xxx_messageInfo_CodeGeneratorResponse_File.Merge(dst, src) +} +func (m *CodeGeneratorResponse_File) XXX_Size() int { + return xxx_messageInfo_CodeGeneratorResponse_File.Size(m) +} +func (m *CodeGeneratorResponse_File) XXX_DiscardUnknown() { + xxx_messageInfo_CodeGeneratorResponse_File.DiscardUnknown(m) +} + +var xxx_messageInfo_CodeGeneratorResponse_File proto.InternalMessageInfo + +func (m *CodeGeneratorResponse_File) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *CodeGeneratorResponse_File) GetInsertionPoint() string { + if m != nil && m.InsertionPoint != nil { + return *m.InsertionPoint + } + return "" +} + +func (m *CodeGeneratorResponse_File) GetContent() string { + if m != nil && m.Content != nil { + return *m.Content + } + return "" +} + +func init() { + proto.RegisterType((*Version)(nil), "google.protobuf.compiler.Version") + proto.RegisterType((*CodeGeneratorRequest)(nil), "google.protobuf.compiler.CodeGeneratorRequest") + proto.RegisterType((*CodeGeneratorResponse)(nil), "google.protobuf.compiler.CodeGeneratorResponse") + proto.RegisterType((*CodeGeneratorResponse_File)(nil), "google.protobuf.compiler.CodeGeneratorResponse.File") +} + +func init() { proto.RegisterFile("google/protobuf/compiler/plugin.proto", fileDescriptor0) } + +var fileDescriptor0 = []byte{ + // 417 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x92, 0xcf, 0x6a, 0x14, 0x41, + 0x10, 0xc6, 0x19, 0x77, 0x63, 0x98, 0x8a, 0x64, 0x43, 0x13, 0xa5, 0x09, 0x39, 0x8c, 0x8b, 0xe2, + 0x5c, 0x32, 0x0b, 0xc1, 0x8b, 0x78, 0x4b, 0x44, 0x3d, 0x78, 0x58, 0x1a, 0xf1, 0x20, 0xc8, 0x30, + 0x99, 0xd4, 0x74, 0x5a, 0x66, 0xba, 0xc6, 0xee, 0x1e, 0xf1, 0x49, 0x7d, 0x0f, 0xdf, 0x40, 0xfa, + 0xcf, 0x24, 0xb2, 0xb8, 0xa7, 0xee, 0xef, 0x57, 0xd5, 0xd5, 0x55, 0x1f, 0x05, 0x2f, 0x25, 0x91, + 0xec, 0x71, 0x33, 0x1a, 0x72, 0x74, 0x33, 0x75, 0x9b, 0x96, 0x86, 0x51, 0xf5, 0x68, 0x36, 0x63, + 0x3f, 0x49, 0xa5, 0xab, 0x10, 0x60, 0x3c, 0xa6, 0x55, 0x73, 0x5a, 0x35, 0xa7, 0x9d, 0x15, 0xbb, + 0x05, 0x6e, 0xd1, 0xb6, 0x46, 0x8d, 0x8e, 0x4c, 0xcc, 0x5e, 0xb7, 0x70, 0xf8, 0x05, 0x8d, 0x55, + 0xa4, 0xd9, 0x29, 0x1c, 0x0c, 0xcd, 0x77, 0x32, 0x3c, 0x2b, 0xb2, 0xf2, 0x40, 0x44, 0x11, 0xa8, + 0xd2, 0x64, 0xf8, 0xa3, 0x44, 0xbd, 0xf0, 0x74, 0x6c, 0x5c, 0x7b, 0xc7, 0x17, 0x91, 0x06, 0xc1, + 0x9e, 0xc1, 0x63, 0x3b, 0x75, 0x9d, 0xfa, 0xc5, 0x97, 0x45, 0x56, 0xe6, 0x22, 0xa9, 0xf5, 0x9f, + 0x0c, 0x4e, 0xaf, 0xe9, 0x16, 0x3f, 0xa0, 0x46, 0xd3, 0x38, 0x32, 0x02, 0x7f, 0x4c, 0x68, 0x1d, + 0x2b, 0xe1, 0xa4, 0x53, 0x3d, 0xd6, 0x8e, 0x6a, 0x19, 0x63, 0xc8, 0xb3, 0x62, 0x51, 0xe6, 0xe2, + 0xd8, 0xf3, 0xcf, 0x94, 0x5e, 0x20, 0x3b, 0x87, 0x7c, 0x6c, 0x4c, 0x33, 0xa0, 0xc3, 0xd8, 0x4a, + 0x2e, 0x1e, 0x00, 0xbb, 0x06, 0x08, 0xe3, 0xd4, 0xfe, 0x15, 0x5f, 0x15, 0x8b, 0xf2, 0xe8, 0xf2, + 0x45, 0xb5, 0x6b, 0xcb, 0x7b, 0xd5, 0xe3, 0xbb, 0x7b, 0x03, 0xb6, 0x1e, 0x8b, 0x3c, 0x44, 0x7d, + 0x84, 0x7d, 0x82, 0x93, 0xd9, 0xb8, 0xfa, 0x67, 0xf4, 0x24, 0x8c, 0x77, 0x74, 0xf9, 0xbc, 0xda, + 0xe7, 0x70, 0x95, 0xcc, 0x13, 0xab, 0x99, 0x24, 0xb0, 0xfe, 0x9d, 0xc1, 0xd3, 0x9d, 0x99, 0xed, + 0x48, 0xda, 0xa2, 0xf7, 0x0e, 0x8d, 0x49, 0x3e, 0xe7, 0x22, 0x0a, 0xf6, 0x11, 0x96, 0xff, 0x34, + 0xff, 0x7a, 0xff, 0x8f, 0xff, 0x2d, 0x1a, 0x66, 0x13, 0xa1, 0xc2, 0xd9, 0x37, 0x58, 0x86, 0x79, + 0x18, 0x2c, 0x75, 0x33, 0x60, 0xfa, 0x26, 0xdc, 0xd9, 0x2b, 0x58, 0x29, 0x6d, 0xd1, 0x38, 0x45, + 0xba, 0x1e, 0x49, 0x69, 0x97, 0xcc, 0x3c, 0xbe, 0xc7, 0x5b, 0x4f, 0x19, 0x87, 0xc3, 0x96, 0xb4, + 0x43, 0xed, 0xf8, 0x2a, 0x24, 0xcc, 0xf2, 0x4a, 0xc2, 0x79, 0x4b, 0xc3, 0xde, 0xfe, 0xae, 0x9e, + 0x6c, 0xc3, 0x6e, 0x06, 0x7b, 0xed, 0xd7, 0x37, 0x52, 0xb9, 0xbb, 0xe9, 0xc6, 0x87, 0x37, 0x92, + 0xfa, 0x46, 0xcb, 0x87, 0x65, 0x0c, 0x97, 0xf6, 0x42, 0xa2, 0xbe, 0x90, 0x94, 0x56, 0xfa, 0x6d, + 0x3c, 0x6a, 0x49, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xf7, 0x15, 0x40, 0xc5, 0xfe, 0x02, 0x00, + 0x00, +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.pb.golden b/api/vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.pb.golden new file mode 100644 index 0000000..8953d0f --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.pb.golden @@ -0,0 +1,83 @@ +// Code generated by protoc-gen-go. +// source: google/protobuf/compiler/plugin.proto +// DO NOT EDIT! + +package google_protobuf_compiler + +import proto "github.com/golang/protobuf/proto" +import "math" +import google_protobuf "github.com/golang/protobuf/protoc-gen-go/descriptor" + +// Reference proto and math imports to suppress error if they are not otherwise used. +var _ = proto.GetString +var _ = math.Inf + +type CodeGeneratorRequest struct { + FileToGenerate []string `protobuf:"bytes,1,rep,name=file_to_generate" json:"file_to_generate,omitempty"` + Parameter *string `protobuf:"bytes,2,opt,name=parameter" json:"parameter,omitempty"` + ProtoFile []*google_protobuf.FileDescriptorProto `protobuf:"bytes,15,rep,name=proto_file" json:"proto_file,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (this *CodeGeneratorRequest) Reset() { *this = CodeGeneratorRequest{} } +func (this *CodeGeneratorRequest) String() string { return proto.CompactTextString(this) } +func (*CodeGeneratorRequest) ProtoMessage() {} + +func (this *CodeGeneratorRequest) GetParameter() string { + if this != nil && this.Parameter != nil { + return *this.Parameter + } + return "" +} + +type CodeGeneratorResponse struct { + Error *string `protobuf:"bytes,1,opt,name=error" json:"error,omitempty"` + File []*CodeGeneratorResponse_File `protobuf:"bytes,15,rep,name=file" json:"file,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (this *CodeGeneratorResponse) Reset() { *this = CodeGeneratorResponse{} } +func (this *CodeGeneratorResponse) String() string { return proto.CompactTextString(this) } +func (*CodeGeneratorResponse) ProtoMessage() {} + +func (this *CodeGeneratorResponse) GetError() string { + if this != nil && this.Error != nil { + return *this.Error + } + return "" +} + +type CodeGeneratorResponse_File struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + InsertionPoint *string `protobuf:"bytes,2,opt,name=insertion_point" json:"insertion_point,omitempty"` + Content *string `protobuf:"bytes,15,opt,name=content" json:"content,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (this *CodeGeneratorResponse_File) Reset() { *this = CodeGeneratorResponse_File{} } +func (this *CodeGeneratorResponse_File) String() string { return proto.CompactTextString(this) } +func (*CodeGeneratorResponse_File) ProtoMessage() {} + +func (this *CodeGeneratorResponse_File) GetName() string { + if this != nil && this.Name != nil { + return *this.Name + } + return "" +} + +func (this *CodeGeneratorResponse_File) GetInsertionPoint() string { + if this != nil && this.InsertionPoint != nil { + return *this.InsertionPoint + } + return "" +} + +func (this *CodeGeneratorResponse_File) GetContent() string { + if this != nil && this.Content != nil { + return *this.Content + } + return "" +} + +func init() { +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.proto b/api/vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.proto new file mode 100644 index 0000000..5b55745 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.proto @@ -0,0 +1,167 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// 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. + +// Author: kenton@google.com (Kenton Varda) +// +// WARNING: The plugin interface is currently EXPERIMENTAL and is subject to +// change. +// +// protoc (aka the Protocol Compiler) can be extended via plugins. A plugin is +// just a program that reads a CodeGeneratorRequest from stdin and writes a +// CodeGeneratorResponse to stdout. +// +// Plugins written using C++ can use google/protobuf/compiler/plugin.h instead +// of dealing with the raw protocol defined here. +// +// A plugin executable needs only to be placed somewhere in the path. The +// plugin should be named "protoc-gen-$NAME", and will then be used when the +// flag "--${NAME}_out" is passed to protoc. + +syntax = "proto2"; +package google.protobuf.compiler; +option java_package = "com.google.protobuf.compiler"; +option java_outer_classname = "PluginProtos"; + +option go_package = "github.com/golang/protobuf/protoc-gen-go/plugin;plugin_go"; + +import "google/protobuf/descriptor.proto"; + +// The version number of protocol compiler. +message Version { + optional int32 major = 1; + optional int32 minor = 2; + optional int32 patch = 3; + // A suffix for alpha, beta or rc release, e.g., "alpha-1", "rc2". It should + // be empty for mainline stable releases. + optional string suffix = 4; +} + +// An encoded CodeGeneratorRequest is written to the plugin's stdin. +message CodeGeneratorRequest { + // The .proto files that were explicitly listed on the command-line. The + // code generator should generate code only for these files. Each file's + // descriptor will be included in proto_file, below. + repeated string file_to_generate = 1; + + // The generator parameter passed on the command-line. + optional string parameter = 2; + + // FileDescriptorProtos for all files in files_to_generate and everything + // they import. The files will appear in topological order, so each file + // appears before any file that imports it. + // + // protoc guarantees that all proto_files will be written after + // the fields above, even though this is not technically guaranteed by the + // protobuf wire format. This theoretically could allow a plugin to stream + // in the FileDescriptorProtos and handle them one by one rather than read + // the entire set into memory at once. However, as of this writing, this + // is not similarly optimized on protoc's end -- it will store all fields in + // memory at once before sending them to the plugin. + // + // Type names of fields and extensions in the FileDescriptorProto are always + // fully qualified. + repeated FileDescriptorProto proto_file = 15; + + // The version number of protocol compiler. + optional Version compiler_version = 3; + +} + +// The plugin writes an encoded CodeGeneratorResponse to stdout. +message CodeGeneratorResponse { + // Error message. If non-empty, code generation failed. The plugin process + // should exit with status code zero even if it reports an error in this way. + // + // This should be used to indicate errors in .proto files which prevent the + // code generator from generating correct code. Errors which indicate a + // problem in protoc itself -- such as the input CodeGeneratorRequest being + // unparseable -- should be reported by writing a message to stderr and + // exiting with a non-zero status code. + optional string error = 1; + + // Represents a single generated file. + message File { + // The file name, relative to the output directory. The name must not + // contain "." or ".." components and must be relative, not be absolute (so, + // the file cannot lie outside the output directory). "/" must be used as + // the path separator, not "\". + // + // If the name is omitted, the content will be appended to the previous + // file. This allows the generator to break large files into small chunks, + // and allows the generated text to be streamed back to protoc so that large + // files need not reside completely in memory at one time. Note that as of + // this writing protoc does not optimize for this -- it will read the entire + // CodeGeneratorResponse before writing files to disk. + optional string name = 1; + + // If non-empty, indicates that the named file should already exist, and the + // content here is to be inserted into that file at a defined insertion + // point. This feature allows a code generator to extend the output + // produced by another code generator. The original generator may provide + // insertion points by placing special annotations in the file that look + // like: + // @@protoc_insertion_point(NAME) + // The annotation can have arbitrary text before and after it on the line, + // which allows it to be placed in a comment. NAME should be replaced with + // an identifier naming the point -- this is what other generators will use + // as the insertion_point. Code inserted at this point will be placed + // immediately above the line containing the insertion point (thus multiple + // insertions to the same point will come out in the order they were added). + // The double-@ is intended to make it unlikely that the generated code + // could contain things that look like insertion points by accident. + // + // For example, the C++ code generator places the following line in the + // .pb.h files that it generates: + // // @@protoc_insertion_point(namespace_scope) + // This line appears within the scope of the file's package namespace, but + // outside of any particular class. Another plugin can then specify the + // insertion_point "namespace_scope" to generate additional classes or + // other declarations that should be placed in this scope. + // + // Note that if the line containing the insertion point begins with + // whitespace, the same whitespace will be added to every line of the + // inserted text. This is useful for languages like Python, where + // indentation matters. In these languages, the insertion point comment + // should be indented the same amount as any inserted code will need to be + // in order to work correctly in that context. + // + // The code generator that generates the initial file and the one which + // inserts into it must both run as part of a single invocation of protoc. + // Code generators are executed in the order in which they appear on the + // command line. + // + // If |insertion_point| is present, |name| must also be present. + optional string insertion_point = 2; + + // The file contents. + optional string content = 15; + } + repeated File file = 15; +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/deprecated/deprecated.pb.go b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/deprecated/deprecated.pb.go new file mode 100644 index 0000000..6ebae9d --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/deprecated/deprecated.pb.go @@ -0,0 +1,232 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// deprecated/deprecated.proto is a deprecated file. + +package deprecated // import "github.com/golang/protobuf/protoc-gen-go/testdata/deprecated" + +/* +package deprecated contains only deprecated messages and services. +*/ + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +import ( + context "golang.org/x/net/context" + grpc "google.golang.org/grpc" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +// DeprecatedEnum contains deprecated values. +type DeprecatedEnum int32 // Deprecated: Do not use. +const ( + // DEPRECATED is the iota value of this enum. + DeprecatedEnum_DEPRECATED DeprecatedEnum = 0 // Deprecated: Do not use. +) + +var DeprecatedEnum_name = map[int32]string{ + 0: "DEPRECATED", +} +var DeprecatedEnum_value = map[string]int32{ + "DEPRECATED": 0, +} + +func (x DeprecatedEnum) String() string { + return proto.EnumName(DeprecatedEnum_name, int32(x)) +} +func (DeprecatedEnum) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_deprecated_9e1889ba21817fad, []int{0} +} + +// DeprecatedRequest is a request to DeprecatedCall. +// +// Deprecated: Do not use. +type DeprecatedRequest struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DeprecatedRequest) Reset() { *m = DeprecatedRequest{} } +func (m *DeprecatedRequest) String() string { return proto.CompactTextString(m) } +func (*DeprecatedRequest) ProtoMessage() {} +func (*DeprecatedRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_deprecated_9e1889ba21817fad, []int{0} +} +func (m *DeprecatedRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DeprecatedRequest.Unmarshal(m, b) +} +func (m *DeprecatedRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DeprecatedRequest.Marshal(b, m, deterministic) +} +func (dst *DeprecatedRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeprecatedRequest.Merge(dst, src) +} +func (m *DeprecatedRequest) XXX_Size() int { + return xxx_messageInfo_DeprecatedRequest.Size(m) +} +func (m *DeprecatedRequest) XXX_DiscardUnknown() { + xxx_messageInfo_DeprecatedRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_DeprecatedRequest proto.InternalMessageInfo + +// Deprecated: Do not use. +type DeprecatedResponse struct { + // DeprecatedField contains a DeprecatedEnum. + DeprecatedField DeprecatedEnum `protobuf:"varint,1,opt,name=deprecated_field,json=deprecatedField,enum=deprecated.DeprecatedEnum" json:"deprecated_field,omitempty"` // Deprecated: Do not use. + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DeprecatedResponse) Reset() { *m = DeprecatedResponse{} } +func (m *DeprecatedResponse) String() string { return proto.CompactTextString(m) } +func (*DeprecatedResponse) ProtoMessage() {} +func (*DeprecatedResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_deprecated_9e1889ba21817fad, []int{1} +} +func (m *DeprecatedResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DeprecatedResponse.Unmarshal(m, b) +} +func (m *DeprecatedResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DeprecatedResponse.Marshal(b, m, deterministic) +} +func (dst *DeprecatedResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeprecatedResponse.Merge(dst, src) +} +func (m *DeprecatedResponse) XXX_Size() int { + return xxx_messageInfo_DeprecatedResponse.Size(m) +} +func (m *DeprecatedResponse) XXX_DiscardUnknown() { + xxx_messageInfo_DeprecatedResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_DeprecatedResponse proto.InternalMessageInfo + +// Deprecated: Do not use. +func (m *DeprecatedResponse) GetDeprecatedField() DeprecatedEnum { + if m != nil { + return m.DeprecatedField + } + return DeprecatedEnum_DEPRECATED +} + +func init() { + proto.RegisterType((*DeprecatedRequest)(nil), "deprecated.DeprecatedRequest") + proto.RegisterType((*DeprecatedResponse)(nil), "deprecated.DeprecatedResponse") + proto.RegisterEnum("deprecated.DeprecatedEnum", DeprecatedEnum_name, DeprecatedEnum_value) +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// Client API for DeprecatedService service + +// Deprecated: Do not use. +type DeprecatedServiceClient interface { + // DeprecatedCall takes a DeprecatedRequest and returns a DeprecatedResponse. + DeprecatedCall(ctx context.Context, in *DeprecatedRequest, opts ...grpc.CallOption) (*DeprecatedResponse, error) +} + +type deprecatedServiceClient struct { + cc *grpc.ClientConn +} + +// Deprecated: Do not use. +func NewDeprecatedServiceClient(cc *grpc.ClientConn) DeprecatedServiceClient { + return &deprecatedServiceClient{cc} +} + +// Deprecated: Do not use. +func (c *deprecatedServiceClient) DeprecatedCall(ctx context.Context, in *DeprecatedRequest, opts ...grpc.CallOption) (*DeprecatedResponse, error) { + out := new(DeprecatedResponse) + err := grpc.Invoke(ctx, "/deprecated.DeprecatedService/DeprecatedCall", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// Server API for DeprecatedService service + +// Deprecated: Do not use. +type DeprecatedServiceServer interface { + // DeprecatedCall takes a DeprecatedRequest and returns a DeprecatedResponse. + DeprecatedCall(context.Context, *DeprecatedRequest) (*DeprecatedResponse, error) +} + +// Deprecated: Do not use. +func RegisterDeprecatedServiceServer(s *grpc.Server, srv DeprecatedServiceServer) { + s.RegisterService(&_DeprecatedService_serviceDesc, srv) +} + +func _DeprecatedService_DeprecatedCall_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeprecatedRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DeprecatedServiceServer).DeprecatedCall(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/deprecated.DeprecatedService/DeprecatedCall", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DeprecatedServiceServer).DeprecatedCall(ctx, req.(*DeprecatedRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _DeprecatedService_serviceDesc = grpc.ServiceDesc{ + ServiceName: "deprecated.DeprecatedService", + HandlerType: (*DeprecatedServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "DeprecatedCall", + Handler: _DeprecatedService_DeprecatedCall_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "deprecated/deprecated.proto", +} + +func init() { + proto.RegisterFile("deprecated/deprecated.proto", fileDescriptor_deprecated_9e1889ba21817fad) +} + +var fileDescriptor_deprecated_9e1889ba21817fad = []byte{ + // 248 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4e, 0x49, 0x2d, 0x28, + 0x4a, 0x4d, 0x4e, 0x2c, 0x49, 0x4d, 0xd1, 0x47, 0x30, 0xf5, 0x0a, 0x8a, 0xf2, 0x4b, 0xf2, 0x85, + 0xb8, 0x10, 0x22, 0x4a, 0xe2, 0x5c, 0x82, 0x2e, 0x70, 0x5e, 0x50, 0x6a, 0x61, 0x69, 0x6a, 0x71, + 0x89, 0x15, 0x93, 0x04, 0xa3, 0x52, 0x32, 0x97, 0x10, 0xb2, 0x44, 0x71, 0x41, 0x7e, 0x5e, 0x71, + 0xaa, 0x90, 0x27, 0x97, 0x00, 0x42, 0x73, 0x7c, 0x5a, 0x66, 0x6a, 0x4e, 0x8a, 0x04, 0xa3, 0x02, + 0xa3, 0x06, 0x9f, 0x91, 0x94, 0x1e, 0x92, 0x3d, 0x08, 0x9d, 0xae, 0x79, 0xa5, 0xb9, 0x4e, 0x4c, + 0x12, 0x8c, 0x41, 0xfc, 0x08, 0x69, 0x37, 0x90, 0x36, 0x90, 0x25, 0x5a, 0x1a, 0x5c, 0x7c, 0xa8, + 0x4a, 0x85, 0x84, 0xb8, 0xb8, 0x5c, 0x5c, 0x03, 0x82, 0x5c, 0x9d, 0x1d, 0x43, 0x5c, 0x5d, 0x04, + 0x18, 0xa4, 0x98, 0x38, 0x18, 0xa5, 0x98, 0x24, 0x18, 0x8d, 0xf2, 0x90, 0xdd, 0x19, 0x9c, 0x5a, + 0x54, 0x96, 0x99, 0x9c, 0x2a, 0x14, 0x82, 0xac, 0xdd, 0x39, 0x31, 0x27, 0x47, 0x48, 0x16, 0xbb, + 0x2b, 0xa0, 0x1e, 0x93, 0x92, 0xc3, 0x25, 0x0d, 0xf1, 0x9e, 0x12, 0x73, 0x07, 0x13, 0xa3, 0x14, + 0x88, 0x70, 0x72, 0x8c, 0xb2, 0x49, 0xcf, 0x2c, 0xc9, 0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, + 0x4f, 0xcf, 0xcf, 0x49, 0xcc, 0x4b, 0xd7, 0x07, 0x07, 0x5f, 0x52, 0x69, 0x1a, 0x84, 0x91, 0xac, + 0x9b, 0x9e, 0x9a, 0xa7, 0x9b, 0x9e, 0xaf, 0x5f, 0x92, 0x5a, 0x5c, 0x92, 0x92, 0x58, 0x92, 0x88, + 0x14, 0xd2, 0x3b, 0x18, 0x19, 0x93, 0xd8, 0xc0, 0xaa, 0x8c, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, + 0x0e, 0xf5, 0x6c, 0x87, 0x8c, 0x01, 0x00, 0x00, +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/deprecated/deprecated.proto b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/deprecated/deprecated.proto new file mode 100644 index 0000000..b314166 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/deprecated/deprecated.proto @@ -0,0 +1,69 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2018 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto3"; + +// package deprecated contains only deprecated messages and services. +package deprecated; + +option go_package = "github.com/golang/protobuf/protoc-gen-go/testdata/deprecated"; + +option deprecated = true; // file-level deprecation + +// DeprecatedRequest is a request to DeprecatedCall. +message DeprecatedRequest { + option deprecated = true; +} + +message DeprecatedResponse { + // comment for DeprecatedResponse is omitted to guarantee deprecation + // message doesn't append unnecessary comments. + option deprecated = true; + // DeprecatedField contains a DeprecatedEnum. + DeprecatedEnum deprecated_field = 1 [deprecated=true]; +} + +// DeprecatedEnum contains deprecated values. +enum DeprecatedEnum { + option deprecated = true; + // DEPRECATED is the iota value of this enum. + DEPRECATED = 0 [deprecated=true]; +} + +// DeprecatedService is for making DeprecatedCalls +service DeprecatedService { + option deprecated = true; + + // DeprecatedCall takes a DeprecatedRequest and returns a DeprecatedResponse. + rpc DeprecatedCall(DeprecatedRequest) returns (DeprecatedResponse) { + option deprecated = true; + } +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_base/extension_base.pb.go b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_base/extension_base.pb.go new file mode 100644 index 0000000..a08e8ed --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_base/extension_base.pb.go @@ -0,0 +1,139 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: extension_base/extension_base.proto + +package extension_base // import "github.com/golang/protobuf/protoc-gen-go/testdata/extension_base" + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type BaseMessage struct { + Height *int32 `protobuf:"varint,1,opt,name=height" json:"height,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *BaseMessage) Reset() { *m = BaseMessage{} } +func (m *BaseMessage) String() string { return proto.CompactTextString(m) } +func (*BaseMessage) ProtoMessage() {} +func (*BaseMessage) Descriptor() ([]byte, []int) { + return fileDescriptor_extension_base_41d3c712c9fc37fc, []int{0} +} + +var extRange_BaseMessage = []proto.ExtensionRange{ + {Start: 4, End: 9}, + {Start: 16, End: 536870911}, +} + +func (*BaseMessage) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_BaseMessage +} +func (m *BaseMessage) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_BaseMessage.Unmarshal(m, b) +} +func (m *BaseMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_BaseMessage.Marshal(b, m, deterministic) +} +func (dst *BaseMessage) XXX_Merge(src proto.Message) { + xxx_messageInfo_BaseMessage.Merge(dst, src) +} +func (m *BaseMessage) XXX_Size() int { + return xxx_messageInfo_BaseMessage.Size(m) +} +func (m *BaseMessage) XXX_DiscardUnknown() { + xxx_messageInfo_BaseMessage.DiscardUnknown(m) +} + +var xxx_messageInfo_BaseMessage proto.InternalMessageInfo + +func (m *BaseMessage) GetHeight() int32 { + if m != nil && m.Height != nil { + return *m.Height + } + return 0 +} + +// Another message that may be extended, using message_set_wire_format. +type OldStyleMessage struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `protobuf_messageset:"1" json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *OldStyleMessage) Reset() { *m = OldStyleMessage{} } +func (m *OldStyleMessage) String() string { return proto.CompactTextString(m) } +func (*OldStyleMessage) ProtoMessage() {} +func (*OldStyleMessage) Descriptor() ([]byte, []int) { + return fileDescriptor_extension_base_41d3c712c9fc37fc, []int{1} +} + +func (m *OldStyleMessage) MarshalJSON() ([]byte, error) { + return proto.MarshalMessageSetJSON(&m.XXX_InternalExtensions) +} +func (m *OldStyleMessage) UnmarshalJSON(buf []byte) error { + return proto.UnmarshalMessageSetJSON(buf, &m.XXX_InternalExtensions) +} + +var extRange_OldStyleMessage = []proto.ExtensionRange{ + {Start: 100, End: 2147483646}, +} + +func (*OldStyleMessage) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_OldStyleMessage +} +func (m *OldStyleMessage) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_OldStyleMessage.Unmarshal(m, b) +} +func (m *OldStyleMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_OldStyleMessage.Marshal(b, m, deterministic) +} +func (dst *OldStyleMessage) XXX_Merge(src proto.Message) { + xxx_messageInfo_OldStyleMessage.Merge(dst, src) +} +func (m *OldStyleMessage) XXX_Size() int { + return xxx_messageInfo_OldStyleMessage.Size(m) +} +func (m *OldStyleMessage) XXX_DiscardUnknown() { + xxx_messageInfo_OldStyleMessage.DiscardUnknown(m) +} + +var xxx_messageInfo_OldStyleMessage proto.InternalMessageInfo + +func init() { + proto.RegisterType((*BaseMessage)(nil), "extension_base.BaseMessage") + proto.RegisterType((*OldStyleMessage)(nil), "extension_base.OldStyleMessage") +} + +func init() { + proto.RegisterFile("extension_base/extension_base.proto", fileDescriptor_extension_base_41d3c712c9fc37fc) +} + +var fileDescriptor_extension_base_41d3c712c9fc37fc = []byte{ + // 179 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4e, 0xad, 0x28, 0x49, + 0xcd, 0x2b, 0xce, 0xcc, 0xcf, 0x8b, 0x4f, 0x4a, 0x2c, 0x4e, 0xd5, 0x47, 0xe5, 0xea, 0x15, 0x14, + 0xe5, 0x97, 0xe4, 0x0b, 0xf1, 0xa1, 0x8a, 0x2a, 0x99, 0x72, 0x71, 0x3b, 0x25, 0x16, 0xa7, 0xfa, + 0xa6, 0x16, 0x17, 0x27, 0xa6, 0xa7, 0x0a, 0x89, 0x71, 0xb1, 0x65, 0xa4, 0x66, 0xa6, 0x67, 0x94, + 0x48, 0x30, 0x2a, 0x30, 0x6a, 0xb0, 0x06, 0x41, 0x79, 0x5a, 0x2c, 0x1c, 0x2c, 0x02, 0x5c, 0x5a, + 0x1c, 0x1c, 0x02, 0x02, 0x0d, 0x0d, 0x0d, 0x0d, 0x4c, 0x4a, 0xf2, 0x5c, 0xfc, 0xfe, 0x39, 0x29, + 0xc1, 0x25, 0x95, 0x39, 0x30, 0xad, 0x5a, 0x1c, 0x1c, 0x29, 0x02, 0xff, 0xff, 0xff, 0xff, 0xcf, + 0x6e, 0xc5, 0xc4, 0xc1, 0xe8, 0xe4, 0x14, 0xe5, 0x90, 0x9e, 0x59, 0x92, 0x51, 0x9a, 0xa4, 0x97, + 0x9c, 0x9f, 0xab, 0x9f, 0x9e, 0x9f, 0x93, 0x98, 0x97, 0xae, 0x0f, 0x76, 0x42, 0x52, 0x69, 0x1a, + 0x84, 0x91, 0xac, 0x9b, 0x9e, 0x9a, 0xa7, 0x9b, 0x9e, 0xaf, 0x5f, 0x92, 0x5a, 0x5c, 0x92, 0x92, + 0x58, 0x92, 0x88, 0xe6, 0x62, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7a, 0x7f, 0xb7, 0x2a, 0xd1, + 0x00, 0x00, 0x00, +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_base/extension_base.proto b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_base/extension_base.proto new file mode 100644 index 0000000..0ba74de --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_base/extension_base.proto @@ -0,0 +1,48 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto2"; + +package extension_base; + +option go_package = "github.com/golang/protobuf/protoc-gen-go/testdata/extension_base"; + +message BaseMessage { + optional int32 height = 1; + extensions 4 to 9; + extensions 16 to max; +} + +// Another message that may be extended, using message_set_wire_format. +message OldStyleMessage { + option message_set_wire_format = true; + extensions 100 to max; +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_extra/extension_extra.pb.go b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_extra/extension_extra.pb.go new file mode 100644 index 0000000..b373216 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_extra/extension_extra.pb.go @@ -0,0 +1,78 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: extension_extra/extension_extra.proto + +package extension_extra // import "github.com/golang/protobuf/protoc-gen-go/testdata/extension_extra" + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type ExtraMessage struct { + Width *int32 `protobuf:"varint,1,opt,name=width" json:"width,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ExtraMessage) Reset() { *m = ExtraMessage{} } +func (m *ExtraMessage) String() string { return proto.CompactTextString(m) } +func (*ExtraMessage) ProtoMessage() {} +func (*ExtraMessage) Descriptor() ([]byte, []int) { + return fileDescriptor_extension_extra_83adf2410f49f816, []int{0} +} +func (m *ExtraMessage) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ExtraMessage.Unmarshal(m, b) +} +func (m *ExtraMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ExtraMessage.Marshal(b, m, deterministic) +} +func (dst *ExtraMessage) XXX_Merge(src proto.Message) { + xxx_messageInfo_ExtraMessage.Merge(dst, src) +} +func (m *ExtraMessage) XXX_Size() int { + return xxx_messageInfo_ExtraMessage.Size(m) +} +func (m *ExtraMessage) XXX_DiscardUnknown() { + xxx_messageInfo_ExtraMessage.DiscardUnknown(m) +} + +var xxx_messageInfo_ExtraMessage proto.InternalMessageInfo + +func (m *ExtraMessage) GetWidth() int32 { + if m != nil && m.Width != nil { + return *m.Width + } + return 0 +} + +func init() { + proto.RegisterType((*ExtraMessage)(nil), "extension_extra.ExtraMessage") +} + +func init() { + proto.RegisterFile("extension_extra/extension_extra.proto", fileDescriptor_extension_extra_83adf2410f49f816) +} + +var fileDescriptor_extension_extra_83adf2410f49f816 = []byte{ + // 133 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4d, 0xad, 0x28, 0x49, + 0xcd, 0x2b, 0xce, 0xcc, 0xcf, 0x8b, 0x4f, 0xad, 0x28, 0x29, 0x4a, 0xd4, 0x47, 0xe3, 0xeb, 0x15, + 0x14, 0xe5, 0x97, 0xe4, 0x0b, 0xf1, 0xa3, 0x09, 0x2b, 0xa9, 0x70, 0xf1, 0xb8, 0x82, 0x18, 0xbe, + 0xa9, 0xc5, 0xc5, 0x89, 0xe9, 0xa9, 0x42, 0x22, 0x5c, 0xac, 0xe5, 0x99, 0x29, 0x25, 0x19, 0x12, + 0x8c, 0x0a, 0x8c, 0x1a, 0xac, 0x41, 0x10, 0x8e, 0x93, 0x73, 0x94, 0x63, 0x7a, 0x66, 0x49, 0x46, + 0x69, 0x92, 0x5e, 0x72, 0x7e, 0xae, 0x7e, 0x7a, 0x7e, 0x4e, 0x62, 0x5e, 0xba, 0x3e, 0xd8, 0xc4, + 0xa4, 0xd2, 0x34, 0x08, 0x23, 0x59, 0x37, 0x3d, 0x35, 0x4f, 0x37, 0x3d, 0x5f, 0xbf, 0x24, 0xb5, + 0xb8, 0x24, 0x25, 0xb1, 0x04, 0xc3, 0x05, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf1, 0xec, 0xe3, + 0xb7, 0xa3, 0x00, 0x00, 0x00, +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_extra/extension_extra.proto b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_extra/extension_extra.proto new file mode 100644 index 0000000..1dd03e7 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_extra/extension_extra.proto @@ -0,0 +1,40 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2011 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto2"; + +package extension_extra; + +option go_package = "github.com/golang/protobuf/protoc-gen-go/testdata/extension_extra"; + +message ExtraMessage { + optional int32 width = 1; +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_test.go b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_test.go new file mode 100644 index 0000000..0524729 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_test.go @@ -0,0 +1,206 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +// Test that we can use protocol buffers that use extensions. + +package testdata + +import ( + "bytes" + "regexp" + "testing" + + "github.com/golang/protobuf/proto" + base "github.com/golang/protobuf/protoc-gen-go/testdata/extension_base" + user "github.com/golang/protobuf/protoc-gen-go/testdata/extension_user" +) + +func TestSingleFieldExtension(t *testing.T) { + bm := &base.BaseMessage{ + Height: proto.Int32(178), + } + + // Use extension within scope of another type. + vol := proto.Uint32(11) + err := proto.SetExtension(bm, user.E_LoudMessage_Volume, vol) + if err != nil { + t.Fatal("Failed setting extension:", err) + } + buf, err := proto.Marshal(bm) + if err != nil { + t.Fatal("Failed encoding message with extension:", err) + } + bm_new := new(base.BaseMessage) + if err := proto.Unmarshal(buf, bm_new); err != nil { + t.Fatal("Failed decoding message with extension:", err) + } + if !proto.HasExtension(bm_new, user.E_LoudMessage_Volume) { + t.Fatal("Decoded message didn't contain extension.") + } + vol_out, err := proto.GetExtension(bm_new, user.E_LoudMessage_Volume) + if err != nil { + t.Fatal("Failed getting extension:", err) + } + if v := vol_out.(*uint32); *v != *vol { + t.Errorf("vol_out = %v, expected %v", *v, *vol) + } + proto.ClearExtension(bm_new, user.E_LoudMessage_Volume) + if proto.HasExtension(bm_new, user.E_LoudMessage_Volume) { + t.Fatal("Failed clearing extension.") + } +} + +func TestMessageExtension(t *testing.T) { + bm := &base.BaseMessage{ + Height: proto.Int32(179), + } + + // Use extension that is itself a message. + um := &user.UserMessage{ + Name: proto.String("Dave"), + Rank: proto.String("Major"), + } + err := proto.SetExtension(bm, user.E_LoginMessage_UserMessage, um) + if err != nil { + t.Fatal("Failed setting extension:", err) + } + buf, err := proto.Marshal(bm) + if err != nil { + t.Fatal("Failed encoding message with extension:", err) + } + bm_new := new(base.BaseMessage) + if err := proto.Unmarshal(buf, bm_new); err != nil { + t.Fatal("Failed decoding message with extension:", err) + } + if !proto.HasExtension(bm_new, user.E_LoginMessage_UserMessage) { + t.Fatal("Decoded message didn't contain extension.") + } + um_out, err := proto.GetExtension(bm_new, user.E_LoginMessage_UserMessage) + if err != nil { + t.Fatal("Failed getting extension:", err) + } + if n := um_out.(*user.UserMessage).Name; *n != *um.Name { + t.Errorf("um_out.Name = %q, expected %q", *n, *um.Name) + } + if r := um_out.(*user.UserMessage).Rank; *r != *um.Rank { + t.Errorf("um_out.Rank = %q, expected %q", *r, *um.Rank) + } + proto.ClearExtension(bm_new, user.E_LoginMessage_UserMessage) + if proto.HasExtension(bm_new, user.E_LoginMessage_UserMessage) { + t.Fatal("Failed clearing extension.") + } +} + +func TestTopLevelExtension(t *testing.T) { + bm := &base.BaseMessage{ + Height: proto.Int32(179), + } + + width := proto.Int32(17) + err := proto.SetExtension(bm, user.E_Width, width) + if err != nil { + t.Fatal("Failed setting extension:", err) + } + buf, err := proto.Marshal(bm) + if err != nil { + t.Fatal("Failed encoding message with extension:", err) + } + bm_new := new(base.BaseMessage) + if err := proto.Unmarshal(buf, bm_new); err != nil { + t.Fatal("Failed decoding message with extension:", err) + } + if !proto.HasExtension(bm_new, user.E_Width) { + t.Fatal("Decoded message didn't contain extension.") + } + width_out, err := proto.GetExtension(bm_new, user.E_Width) + if err != nil { + t.Fatal("Failed getting extension:", err) + } + if w := width_out.(*int32); *w != *width { + t.Errorf("width_out = %v, expected %v", *w, *width) + } + proto.ClearExtension(bm_new, user.E_Width) + if proto.HasExtension(bm_new, user.E_Width) { + t.Fatal("Failed clearing extension.") + } +} + +func TestMessageSetWireFormat(t *testing.T) { + osm := new(base.OldStyleMessage) + osp := &user.OldStyleParcel{ + Name: proto.String("Dave"), + Height: proto.Int32(178), + } + + err := proto.SetExtension(osm, user.E_OldStyleParcel_MessageSetExtension, osp) + if err != nil { + t.Fatal("Failed setting extension:", err) + } + + buf, err := proto.Marshal(osm) + if err != nil { + t.Fatal("Failed encoding message:", err) + } + + // Data generated from Python implementation. + expected := []byte{ + 11, 16, 209, 15, 26, 9, 10, 4, 68, 97, 118, 101, 16, 178, 1, 12, + } + + if !bytes.Equal(expected, buf) { + t.Errorf("Encoding mismatch.\nwant %+v\n got %+v", expected, buf) + } + + // Check that it is restored correctly. + osm = new(base.OldStyleMessage) + if err := proto.Unmarshal(buf, osm); err != nil { + t.Fatal("Failed decoding message:", err) + } + osp_out, err := proto.GetExtension(osm, user.E_OldStyleParcel_MessageSetExtension) + if err != nil { + t.Fatal("Failed getting extension:", err) + } + osp = osp_out.(*user.OldStyleParcel) + if *osp.Name != "Dave" || *osp.Height != 178 { + t.Errorf("Retrieved extension from decoded message is not correct: %+v", osp) + } +} + +func main() { + // simpler than rigging up gotest + testing.Main(regexp.MatchString, []testing.InternalTest{ + {"TestSingleFieldExtension", TestSingleFieldExtension}, + {"TestMessageExtension", TestMessageExtension}, + {"TestTopLevelExtension", TestTopLevelExtension}, + }, + []testing.InternalBenchmark{}, + []testing.InternalExample{}) +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_user/extension_user.pb.go b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_user/extension_user.pb.go new file mode 100644 index 0000000..c718792 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_user/extension_user.pb.go @@ -0,0 +1,401 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: extension_user/extension_user.proto + +package extension_user // import "github.com/golang/protobuf/protoc-gen-go/testdata/extension_user" + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" +import extension_base "github.com/golang/protobuf/protoc-gen-go/testdata/extension_base" +import extension_extra "github.com/golang/protobuf/protoc-gen-go/testdata/extension_extra" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type UserMessage struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Rank *string `protobuf:"bytes,2,opt,name=rank" json:"rank,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *UserMessage) Reset() { *m = UserMessage{} } +func (m *UserMessage) String() string { return proto.CompactTextString(m) } +func (*UserMessage) ProtoMessage() {} +func (*UserMessage) Descriptor() ([]byte, []int) { + return fileDescriptor_extension_user_af41b5e0bdfb7846, []int{0} +} +func (m *UserMessage) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_UserMessage.Unmarshal(m, b) +} +func (m *UserMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_UserMessage.Marshal(b, m, deterministic) +} +func (dst *UserMessage) XXX_Merge(src proto.Message) { + xxx_messageInfo_UserMessage.Merge(dst, src) +} +func (m *UserMessage) XXX_Size() int { + return xxx_messageInfo_UserMessage.Size(m) +} +func (m *UserMessage) XXX_DiscardUnknown() { + xxx_messageInfo_UserMessage.DiscardUnknown(m) +} + +var xxx_messageInfo_UserMessage proto.InternalMessageInfo + +func (m *UserMessage) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *UserMessage) GetRank() string { + if m != nil && m.Rank != nil { + return *m.Rank + } + return "" +} + +// Extend inside the scope of another type +type LoudMessage struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *LoudMessage) Reset() { *m = LoudMessage{} } +func (m *LoudMessage) String() string { return proto.CompactTextString(m) } +func (*LoudMessage) ProtoMessage() {} +func (*LoudMessage) Descriptor() ([]byte, []int) { + return fileDescriptor_extension_user_af41b5e0bdfb7846, []int{1} +} + +var extRange_LoudMessage = []proto.ExtensionRange{ + {Start: 100, End: 536870911}, +} + +func (*LoudMessage) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_LoudMessage +} +func (m *LoudMessage) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_LoudMessage.Unmarshal(m, b) +} +func (m *LoudMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_LoudMessage.Marshal(b, m, deterministic) +} +func (dst *LoudMessage) XXX_Merge(src proto.Message) { + xxx_messageInfo_LoudMessage.Merge(dst, src) +} +func (m *LoudMessage) XXX_Size() int { + return xxx_messageInfo_LoudMessage.Size(m) +} +func (m *LoudMessage) XXX_DiscardUnknown() { + xxx_messageInfo_LoudMessage.DiscardUnknown(m) +} + +var xxx_messageInfo_LoudMessage proto.InternalMessageInfo + +var E_LoudMessage_Volume = &proto.ExtensionDesc{ + ExtendedType: (*extension_base.BaseMessage)(nil), + ExtensionType: (*uint32)(nil), + Field: 8, + Name: "extension_user.LoudMessage.volume", + Tag: "varint,8,opt,name=volume", + Filename: "extension_user/extension_user.proto", +} + +// Extend inside the scope of another type, using a message. +type LoginMessage struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *LoginMessage) Reset() { *m = LoginMessage{} } +func (m *LoginMessage) String() string { return proto.CompactTextString(m) } +func (*LoginMessage) ProtoMessage() {} +func (*LoginMessage) Descriptor() ([]byte, []int) { + return fileDescriptor_extension_user_af41b5e0bdfb7846, []int{2} +} +func (m *LoginMessage) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_LoginMessage.Unmarshal(m, b) +} +func (m *LoginMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_LoginMessage.Marshal(b, m, deterministic) +} +func (dst *LoginMessage) XXX_Merge(src proto.Message) { + xxx_messageInfo_LoginMessage.Merge(dst, src) +} +func (m *LoginMessage) XXX_Size() int { + return xxx_messageInfo_LoginMessage.Size(m) +} +func (m *LoginMessage) XXX_DiscardUnknown() { + xxx_messageInfo_LoginMessage.DiscardUnknown(m) +} + +var xxx_messageInfo_LoginMessage proto.InternalMessageInfo + +var E_LoginMessage_UserMessage = &proto.ExtensionDesc{ + ExtendedType: (*extension_base.BaseMessage)(nil), + ExtensionType: (*UserMessage)(nil), + Field: 16, + Name: "extension_user.LoginMessage.user_message", + Tag: "bytes,16,opt,name=user_message,json=userMessage", + Filename: "extension_user/extension_user.proto", +} + +type Detail struct { + Color *string `protobuf:"bytes,1,opt,name=color" json:"color,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Detail) Reset() { *m = Detail{} } +func (m *Detail) String() string { return proto.CompactTextString(m) } +func (*Detail) ProtoMessage() {} +func (*Detail) Descriptor() ([]byte, []int) { + return fileDescriptor_extension_user_af41b5e0bdfb7846, []int{3} +} +func (m *Detail) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Detail.Unmarshal(m, b) +} +func (m *Detail) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Detail.Marshal(b, m, deterministic) +} +func (dst *Detail) XXX_Merge(src proto.Message) { + xxx_messageInfo_Detail.Merge(dst, src) +} +func (m *Detail) XXX_Size() int { + return xxx_messageInfo_Detail.Size(m) +} +func (m *Detail) XXX_DiscardUnknown() { + xxx_messageInfo_Detail.DiscardUnknown(m) +} + +var xxx_messageInfo_Detail proto.InternalMessageInfo + +func (m *Detail) GetColor() string { + if m != nil && m.Color != nil { + return *m.Color + } + return "" +} + +// An extension of an extension +type Announcement struct { + Words *string `protobuf:"bytes,1,opt,name=words" json:"words,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Announcement) Reset() { *m = Announcement{} } +func (m *Announcement) String() string { return proto.CompactTextString(m) } +func (*Announcement) ProtoMessage() {} +func (*Announcement) Descriptor() ([]byte, []int) { + return fileDescriptor_extension_user_af41b5e0bdfb7846, []int{4} +} +func (m *Announcement) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Announcement.Unmarshal(m, b) +} +func (m *Announcement) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Announcement.Marshal(b, m, deterministic) +} +func (dst *Announcement) XXX_Merge(src proto.Message) { + xxx_messageInfo_Announcement.Merge(dst, src) +} +func (m *Announcement) XXX_Size() int { + return xxx_messageInfo_Announcement.Size(m) +} +func (m *Announcement) XXX_DiscardUnknown() { + xxx_messageInfo_Announcement.DiscardUnknown(m) +} + +var xxx_messageInfo_Announcement proto.InternalMessageInfo + +func (m *Announcement) GetWords() string { + if m != nil && m.Words != nil { + return *m.Words + } + return "" +} + +var E_Announcement_LoudExt = &proto.ExtensionDesc{ + ExtendedType: (*LoudMessage)(nil), + ExtensionType: (*Announcement)(nil), + Field: 100, + Name: "extension_user.Announcement.loud_ext", + Tag: "bytes,100,opt,name=loud_ext,json=loudExt", + Filename: "extension_user/extension_user.proto", +} + +// Something that can be put in a message set. +type OldStyleParcel struct { + Name *string `protobuf:"bytes,1,req,name=name" json:"name,omitempty"` + Height *int32 `protobuf:"varint,2,opt,name=height" json:"height,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *OldStyleParcel) Reset() { *m = OldStyleParcel{} } +func (m *OldStyleParcel) String() string { return proto.CompactTextString(m) } +func (*OldStyleParcel) ProtoMessage() {} +func (*OldStyleParcel) Descriptor() ([]byte, []int) { + return fileDescriptor_extension_user_af41b5e0bdfb7846, []int{5} +} +func (m *OldStyleParcel) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_OldStyleParcel.Unmarshal(m, b) +} +func (m *OldStyleParcel) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_OldStyleParcel.Marshal(b, m, deterministic) +} +func (dst *OldStyleParcel) XXX_Merge(src proto.Message) { + xxx_messageInfo_OldStyleParcel.Merge(dst, src) +} +func (m *OldStyleParcel) XXX_Size() int { + return xxx_messageInfo_OldStyleParcel.Size(m) +} +func (m *OldStyleParcel) XXX_DiscardUnknown() { + xxx_messageInfo_OldStyleParcel.DiscardUnknown(m) +} + +var xxx_messageInfo_OldStyleParcel proto.InternalMessageInfo + +func (m *OldStyleParcel) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *OldStyleParcel) GetHeight() int32 { + if m != nil && m.Height != nil { + return *m.Height + } + return 0 +} + +var E_OldStyleParcel_MessageSetExtension = &proto.ExtensionDesc{ + ExtendedType: (*extension_base.OldStyleMessage)(nil), + ExtensionType: (*OldStyleParcel)(nil), + Field: 2001, + Name: "extension_user.OldStyleParcel", + Tag: "bytes,2001,opt,name=message_set_extension,json=messageSetExtension", + Filename: "extension_user/extension_user.proto", +} + +var E_UserMessage = &proto.ExtensionDesc{ + ExtendedType: (*extension_base.BaseMessage)(nil), + ExtensionType: (*UserMessage)(nil), + Field: 5, + Name: "extension_user.user_message", + Tag: "bytes,5,opt,name=user_message,json=userMessage", + Filename: "extension_user/extension_user.proto", +} + +var E_ExtraMessage = &proto.ExtensionDesc{ + ExtendedType: (*extension_base.BaseMessage)(nil), + ExtensionType: (*extension_extra.ExtraMessage)(nil), + Field: 9, + Name: "extension_user.extra_message", + Tag: "bytes,9,opt,name=extra_message,json=extraMessage", + Filename: "extension_user/extension_user.proto", +} + +var E_Width = &proto.ExtensionDesc{ + ExtendedType: (*extension_base.BaseMessage)(nil), + ExtensionType: (*int32)(nil), + Field: 6, + Name: "extension_user.width", + Tag: "varint,6,opt,name=width", + Filename: "extension_user/extension_user.proto", +} + +var E_Area = &proto.ExtensionDesc{ + ExtendedType: (*extension_base.BaseMessage)(nil), + ExtensionType: (*int64)(nil), + Field: 7, + Name: "extension_user.area", + Tag: "varint,7,opt,name=area", + Filename: "extension_user/extension_user.proto", +} + +var E_Detail = &proto.ExtensionDesc{ + ExtendedType: (*extension_base.BaseMessage)(nil), + ExtensionType: ([]*Detail)(nil), + Field: 17, + Name: "extension_user.detail", + Tag: "bytes,17,rep,name=detail", + Filename: "extension_user/extension_user.proto", +} + +func init() { + proto.RegisterType((*UserMessage)(nil), "extension_user.UserMessage") + proto.RegisterType((*LoudMessage)(nil), "extension_user.LoudMessage") + proto.RegisterType((*LoginMessage)(nil), "extension_user.LoginMessage") + proto.RegisterType((*Detail)(nil), "extension_user.Detail") + proto.RegisterType((*Announcement)(nil), "extension_user.Announcement") + proto.RegisterMessageSetType((*OldStyleParcel)(nil), 2001, "extension_user.OldStyleParcel") + proto.RegisterType((*OldStyleParcel)(nil), "extension_user.OldStyleParcel") + proto.RegisterExtension(E_LoudMessage_Volume) + proto.RegisterExtension(E_LoginMessage_UserMessage) + proto.RegisterExtension(E_Announcement_LoudExt) + proto.RegisterExtension(E_OldStyleParcel_MessageSetExtension) + proto.RegisterExtension(E_UserMessage) + proto.RegisterExtension(E_ExtraMessage) + proto.RegisterExtension(E_Width) + proto.RegisterExtension(E_Area) + proto.RegisterExtension(E_Detail) +} + +func init() { + proto.RegisterFile("extension_user/extension_user.proto", fileDescriptor_extension_user_af41b5e0bdfb7846) +} + +var fileDescriptor_extension_user_af41b5e0bdfb7846 = []byte{ + // 492 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0x51, 0x6f, 0x94, 0x40, + 0x10, 0x0e, 0x6d, 0x8f, 0x5e, 0x87, 0x6b, 0xad, 0xa8, 0xcd, 0xa5, 0x6a, 0x25, 0x18, 0x13, 0x62, + 0xd2, 0x23, 0x62, 0x7c, 0xe1, 0x49, 0x2f, 0xde, 0x93, 0x67, 0x34, 0x54, 0x5f, 0xf4, 0x81, 0xec, + 0xc1, 0xc8, 0x91, 0xc2, 0xae, 0xd9, 0x5d, 0xec, 0xe9, 0xd3, 0xfd, 0x26, 0xff, 0x89, 0xff, 0xc8, + 0xb0, 0x2c, 0x2d, 0x87, 0xc9, 0xc5, 0xbe, 0x90, 0xfd, 0x86, 0x6f, 0xbe, 0x99, 0xfd, 0x66, 0x00, + 0x9e, 0xe2, 0x4a, 0x22, 0x15, 0x39, 0xa3, 0x71, 0x25, 0x90, 0xfb, 0x9b, 0x70, 0xf2, 0x9d, 0x33, + 0xc9, 0xec, 0xa3, 0xcd, 0xe8, 0x69, 0x27, 0x69, 0x41, 0x04, 0xfa, 0x9b, 0xb0, 0x49, 0x3a, 0x7d, + 0x76, 0x13, 0xc5, 0x95, 0xe4, 0xc4, 0xef, 0xe1, 0x86, 0xe6, 0xbe, 0x02, 0xeb, 0xb3, 0x40, 0xfe, + 0x1e, 0x85, 0x20, 0x19, 0xda, 0x36, 0xec, 0x51, 0x52, 0xe2, 0xd8, 0x70, 0x0c, 0xef, 0x20, 0x52, + 0xe7, 0x3a, 0xc6, 0x09, 0xbd, 0x1c, 0xef, 0x34, 0xb1, 0xfa, 0xec, 0xce, 0xc1, 0x9a, 0xb3, 0x2a, + 0xd5, 0x69, 0xcf, 0x87, 0xc3, 0xf4, 0x78, 0xbd, 0x5e, 0xaf, 0x77, 0x82, 0x97, 0x60, 0xfe, 0x60, + 0x45, 0x55, 0xa2, 0xfd, 0x70, 0xd2, 0xeb, 0x6b, 0x4a, 0x04, 0xea, 0x84, 0xf1, 0xd0, 0x31, 0xbc, + 0xc3, 0x48, 0x53, 0xdd, 0x4b, 0x18, 0xcd, 0x59, 0x96, 0x53, 0xfd, 0x36, 0xf8, 0x0a, 0xa3, 0xfa, + 0xa2, 0x71, 0xa9, 0xbb, 0xda, 0x2a, 0x75, 0xec, 0x18, 0x9e, 0x15, 0x74, 0x29, 0xca, 0xba, 0xce, + 0xad, 0x22, 0xab, 0xba, 0x01, 0xee, 0x19, 0x98, 0x6f, 0x51, 0x92, 0xbc, 0xb0, 0xef, 0xc3, 0x20, + 0x61, 0x05, 0xe3, 0xfa, 0xb6, 0x0d, 0x70, 0x7f, 0xc1, 0xe8, 0x0d, 0xa5, 0xac, 0xa2, 0x09, 0x96, + 0x48, 0x65, 0xcd, 0xba, 0x62, 0x3c, 0x15, 0x2d, 0x4b, 0x81, 0xe0, 0x13, 0x0c, 0x0b, 0x56, 0xa5, + 0xb5, 0x97, 0xf6, 0x3f, 0xb5, 0x3b, 0xd6, 0x8c, 0x53, 0xd5, 0xde, 0xa3, 0x3e, 0xa5, 0x5b, 0x22, + 0xda, 0xaf, 0xa5, 0x66, 0x2b, 0xe9, 0xfe, 0x36, 0xe0, 0xe8, 0x43, 0x91, 0x5e, 0xc8, 0x9f, 0x05, + 0x7e, 0x24, 0x3c, 0xc1, 0xa2, 0x33, 0x91, 0x9d, 0xeb, 0x89, 0x9c, 0x80, 0xb9, 0xc4, 0x3c, 0x5b, + 0x4a, 0x35, 0x93, 0x41, 0xa4, 0x51, 0x20, 0xe1, 0x81, 0xb6, 0x2c, 0x16, 0x28, 0xe3, 0xeb, 0x92, + 0xf6, 0x93, 0xbe, 0x81, 0x6d, 0x91, 0xb6, 0xcb, 0x3f, 0x77, 0x54, 0x9b, 0x67, 0xfd, 0x36, 0x37, + 0x9b, 0x89, 0xee, 0x69, 0xf9, 0x0b, 0x94, 0xb3, 0x96, 0x18, 0xde, 0x6a, 0x5a, 0x83, 0xdb, 0x4d, + 0x2b, 0x8c, 0xe1, 0x50, 0xad, 0xeb, 0xff, 0xa9, 0x1f, 0x28, 0xf5, 0xc7, 0x93, 0xfe, 0xae, 0xcf, + 0xea, 0x67, 0xab, 0x3f, 0xc2, 0x0e, 0x0a, 0x5f, 0xc0, 0xe0, 0x2a, 0x4f, 0xe5, 0x72, 0xbb, 0xb0, + 0xa9, 0x7c, 0x6e, 0x98, 0xa1, 0x0f, 0x7b, 0x84, 0x23, 0xd9, 0x9e, 0xb1, 0xef, 0x18, 0xde, 0x6e, + 0xa4, 0x88, 0xe1, 0x3b, 0x30, 0xd3, 0x66, 0xe5, 0xb6, 0xa6, 0xdc, 0x75, 0x76, 0x3d, 0x2b, 0x38, + 0xe9, 0x7b, 0xd3, 0x6c, 0x6b, 0xa4, 0x25, 0xa6, 0xd3, 0x2f, 0xaf, 0xb3, 0x5c, 0x2e, 0xab, 0xc5, + 0x24, 0x61, 0xa5, 0x9f, 0xb1, 0x82, 0xd0, 0xcc, 0x57, 0x1f, 0xf3, 0xa2, 0xfa, 0xd6, 0x1c, 0x92, + 0xf3, 0x0c, 0xe9, 0x79, 0xc6, 0x7c, 0x89, 0x42, 0xa6, 0x44, 0x92, 0xde, 0x7f, 0xe5, 0x6f, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xdf, 0x18, 0x64, 0x15, 0x77, 0x04, 0x00, 0x00, +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_user/extension_user.proto b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_user/extension_user.proto new file mode 100644 index 0000000..033c186 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_user/extension_user.proto @@ -0,0 +1,102 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto2"; + +import "extension_base/extension_base.proto"; +import "extension_extra/extension_extra.proto"; + +package extension_user; + +option go_package = "github.com/golang/protobuf/protoc-gen-go/testdata/extension_user"; + +message UserMessage { + optional string name = 1; + optional string rank = 2; +} + +// Extend with a message +extend extension_base.BaseMessage { + optional UserMessage user_message = 5; +} + +// Extend with a foreign message +extend extension_base.BaseMessage { + optional extension_extra.ExtraMessage extra_message = 9; +} + +// Extend with some primitive types +extend extension_base.BaseMessage { + optional int32 width = 6; + optional int64 area = 7; +} + +// Extend inside the scope of another type +message LoudMessage { + extend extension_base.BaseMessage { + optional uint32 volume = 8; + } + extensions 100 to max; +} + +// Extend inside the scope of another type, using a message. +message LoginMessage { + extend extension_base.BaseMessage { + optional UserMessage user_message = 16; + } +} + +// Extend with a repeated field +extend extension_base.BaseMessage { + repeated Detail detail = 17; +} + +message Detail { + optional string color = 1; +} + +// An extension of an extension +message Announcement { + optional string words = 1; + extend LoudMessage { + optional Announcement loud_ext = 100; + } +} + +// Something that can be put in a message set. +message OldStyleParcel { + extend extension_base.OldStyleMessage { + optional OldStyleParcel message_set_extension = 2001; + } + + required string name = 1; + optional int32 height = 2; +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/grpc/grpc.pb.go b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/grpc/grpc.pb.go new file mode 100644 index 0000000..0bb4cbf --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/grpc/grpc.pb.go @@ -0,0 +1,444 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: grpc/grpc.proto + +package testing // import "github.com/golang/protobuf/protoc-gen-go/testdata/grpc" + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +import ( + context "golang.org/x/net/context" + grpc "google.golang.org/grpc" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type SimpleRequest struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SimpleRequest) Reset() { *m = SimpleRequest{} } +func (m *SimpleRequest) String() string { return proto.CompactTextString(m) } +func (*SimpleRequest) ProtoMessage() {} +func (*SimpleRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_grpc_65bf3902e49ee873, []int{0} +} +func (m *SimpleRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SimpleRequest.Unmarshal(m, b) +} +func (m *SimpleRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SimpleRequest.Marshal(b, m, deterministic) +} +func (dst *SimpleRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_SimpleRequest.Merge(dst, src) +} +func (m *SimpleRequest) XXX_Size() int { + return xxx_messageInfo_SimpleRequest.Size(m) +} +func (m *SimpleRequest) XXX_DiscardUnknown() { + xxx_messageInfo_SimpleRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_SimpleRequest proto.InternalMessageInfo + +type SimpleResponse struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SimpleResponse) Reset() { *m = SimpleResponse{} } +func (m *SimpleResponse) String() string { return proto.CompactTextString(m) } +func (*SimpleResponse) ProtoMessage() {} +func (*SimpleResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_grpc_65bf3902e49ee873, []int{1} +} +func (m *SimpleResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SimpleResponse.Unmarshal(m, b) +} +func (m *SimpleResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SimpleResponse.Marshal(b, m, deterministic) +} +func (dst *SimpleResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_SimpleResponse.Merge(dst, src) +} +func (m *SimpleResponse) XXX_Size() int { + return xxx_messageInfo_SimpleResponse.Size(m) +} +func (m *SimpleResponse) XXX_DiscardUnknown() { + xxx_messageInfo_SimpleResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_SimpleResponse proto.InternalMessageInfo + +type StreamMsg struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *StreamMsg) Reset() { *m = StreamMsg{} } +func (m *StreamMsg) String() string { return proto.CompactTextString(m) } +func (*StreamMsg) ProtoMessage() {} +func (*StreamMsg) Descriptor() ([]byte, []int) { + return fileDescriptor_grpc_65bf3902e49ee873, []int{2} +} +func (m *StreamMsg) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_StreamMsg.Unmarshal(m, b) +} +func (m *StreamMsg) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_StreamMsg.Marshal(b, m, deterministic) +} +func (dst *StreamMsg) XXX_Merge(src proto.Message) { + xxx_messageInfo_StreamMsg.Merge(dst, src) +} +func (m *StreamMsg) XXX_Size() int { + return xxx_messageInfo_StreamMsg.Size(m) +} +func (m *StreamMsg) XXX_DiscardUnknown() { + xxx_messageInfo_StreamMsg.DiscardUnknown(m) +} + +var xxx_messageInfo_StreamMsg proto.InternalMessageInfo + +type StreamMsg2 struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *StreamMsg2) Reset() { *m = StreamMsg2{} } +func (m *StreamMsg2) String() string { return proto.CompactTextString(m) } +func (*StreamMsg2) ProtoMessage() {} +func (*StreamMsg2) Descriptor() ([]byte, []int) { + return fileDescriptor_grpc_65bf3902e49ee873, []int{3} +} +func (m *StreamMsg2) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_StreamMsg2.Unmarshal(m, b) +} +func (m *StreamMsg2) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_StreamMsg2.Marshal(b, m, deterministic) +} +func (dst *StreamMsg2) XXX_Merge(src proto.Message) { + xxx_messageInfo_StreamMsg2.Merge(dst, src) +} +func (m *StreamMsg2) XXX_Size() int { + return xxx_messageInfo_StreamMsg2.Size(m) +} +func (m *StreamMsg2) XXX_DiscardUnknown() { + xxx_messageInfo_StreamMsg2.DiscardUnknown(m) +} + +var xxx_messageInfo_StreamMsg2 proto.InternalMessageInfo + +func init() { + proto.RegisterType((*SimpleRequest)(nil), "grpc.testing.SimpleRequest") + proto.RegisterType((*SimpleResponse)(nil), "grpc.testing.SimpleResponse") + proto.RegisterType((*StreamMsg)(nil), "grpc.testing.StreamMsg") + proto.RegisterType((*StreamMsg2)(nil), "grpc.testing.StreamMsg2") +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// Client API for Test service + +type TestClient interface { + UnaryCall(ctx context.Context, in *SimpleRequest, opts ...grpc.CallOption) (*SimpleResponse, error) + // This RPC streams from the server only. + Downstream(ctx context.Context, in *SimpleRequest, opts ...grpc.CallOption) (Test_DownstreamClient, error) + // This RPC streams from the client. + Upstream(ctx context.Context, opts ...grpc.CallOption) (Test_UpstreamClient, error) + // This one streams in both directions. + Bidi(ctx context.Context, opts ...grpc.CallOption) (Test_BidiClient, error) +} + +type testClient struct { + cc *grpc.ClientConn +} + +func NewTestClient(cc *grpc.ClientConn) TestClient { + return &testClient{cc} +} + +func (c *testClient) UnaryCall(ctx context.Context, in *SimpleRequest, opts ...grpc.CallOption) (*SimpleResponse, error) { + out := new(SimpleResponse) + err := grpc.Invoke(ctx, "/grpc.testing.Test/UnaryCall", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *testClient) Downstream(ctx context.Context, in *SimpleRequest, opts ...grpc.CallOption) (Test_DownstreamClient, error) { + stream, err := grpc.NewClientStream(ctx, &_Test_serviceDesc.Streams[0], c.cc, "/grpc.testing.Test/Downstream", opts...) + if err != nil { + return nil, err + } + x := &testDownstreamClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Test_DownstreamClient interface { + Recv() (*StreamMsg, error) + grpc.ClientStream +} + +type testDownstreamClient struct { + grpc.ClientStream +} + +func (x *testDownstreamClient) Recv() (*StreamMsg, error) { + m := new(StreamMsg) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *testClient) Upstream(ctx context.Context, opts ...grpc.CallOption) (Test_UpstreamClient, error) { + stream, err := grpc.NewClientStream(ctx, &_Test_serviceDesc.Streams[1], c.cc, "/grpc.testing.Test/Upstream", opts...) + if err != nil { + return nil, err + } + x := &testUpstreamClient{stream} + return x, nil +} + +type Test_UpstreamClient interface { + Send(*StreamMsg) error + CloseAndRecv() (*SimpleResponse, error) + grpc.ClientStream +} + +type testUpstreamClient struct { + grpc.ClientStream +} + +func (x *testUpstreamClient) Send(m *StreamMsg) error { + return x.ClientStream.SendMsg(m) +} + +func (x *testUpstreamClient) CloseAndRecv() (*SimpleResponse, error) { + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + m := new(SimpleResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *testClient) Bidi(ctx context.Context, opts ...grpc.CallOption) (Test_BidiClient, error) { + stream, err := grpc.NewClientStream(ctx, &_Test_serviceDesc.Streams[2], c.cc, "/grpc.testing.Test/Bidi", opts...) + if err != nil { + return nil, err + } + x := &testBidiClient{stream} + return x, nil +} + +type Test_BidiClient interface { + Send(*StreamMsg) error + Recv() (*StreamMsg2, error) + grpc.ClientStream +} + +type testBidiClient struct { + grpc.ClientStream +} + +func (x *testBidiClient) Send(m *StreamMsg) error { + return x.ClientStream.SendMsg(m) +} + +func (x *testBidiClient) Recv() (*StreamMsg2, error) { + m := new(StreamMsg2) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +// Server API for Test service + +type TestServer interface { + UnaryCall(context.Context, *SimpleRequest) (*SimpleResponse, error) + // This RPC streams from the server only. + Downstream(*SimpleRequest, Test_DownstreamServer) error + // This RPC streams from the client. + Upstream(Test_UpstreamServer) error + // This one streams in both directions. + Bidi(Test_BidiServer) error +} + +func RegisterTestServer(s *grpc.Server, srv TestServer) { + s.RegisterService(&_Test_serviceDesc, srv) +} + +func _Test_UnaryCall_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SimpleRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TestServer).UnaryCall(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/grpc.testing.Test/UnaryCall", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TestServer).UnaryCall(ctx, req.(*SimpleRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Test_Downstream_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(SimpleRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(TestServer).Downstream(m, &testDownstreamServer{stream}) +} + +type Test_DownstreamServer interface { + Send(*StreamMsg) error + grpc.ServerStream +} + +type testDownstreamServer struct { + grpc.ServerStream +} + +func (x *testDownstreamServer) Send(m *StreamMsg) error { + return x.ServerStream.SendMsg(m) +} + +func _Test_Upstream_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(TestServer).Upstream(&testUpstreamServer{stream}) +} + +type Test_UpstreamServer interface { + SendAndClose(*SimpleResponse) error + Recv() (*StreamMsg, error) + grpc.ServerStream +} + +type testUpstreamServer struct { + grpc.ServerStream +} + +func (x *testUpstreamServer) SendAndClose(m *SimpleResponse) error { + return x.ServerStream.SendMsg(m) +} + +func (x *testUpstreamServer) Recv() (*StreamMsg, error) { + m := new(StreamMsg) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func _Test_Bidi_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(TestServer).Bidi(&testBidiServer{stream}) +} + +type Test_BidiServer interface { + Send(*StreamMsg2) error + Recv() (*StreamMsg, error) + grpc.ServerStream +} + +type testBidiServer struct { + grpc.ServerStream +} + +func (x *testBidiServer) Send(m *StreamMsg2) error { + return x.ServerStream.SendMsg(m) +} + +func (x *testBidiServer) Recv() (*StreamMsg, error) { + m := new(StreamMsg) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +var _Test_serviceDesc = grpc.ServiceDesc{ + ServiceName: "grpc.testing.Test", + HandlerType: (*TestServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "UnaryCall", + Handler: _Test_UnaryCall_Handler, + }, + }, + Streams: []grpc.StreamDesc{ + { + StreamName: "Downstream", + Handler: _Test_Downstream_Handler, + ServerStreams: true, + }, + { + StreamName: "Upstream", + Handler: _Test_Upstream_Handler, + ClientStreams: true, + }, + { + StreamName: "Bidi", + Handler: _Test_Bidi_Handler, + ServerStreams: true, + ClientStreams: true, + }, + }, + Metadata: "grpc/grpc.proto", +} + +func init() { proto.RegisterFile("grpc/grpc.proto", fileDescriptor_grpc_65bf3902e49ee873) } + +var fileDescriptor_grpc_65bf3902e49ee873 = []byte{ + // 244 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x4f, 0x2f, 0x2a, 0x48, + 0xd6, 0x07, 0x11, 0x7a, 0x05, 0x45, 0xf9, 0x25, 0xf9, 0x42, 0x3c, 0x60, 0x76, 0x49, 0x6a, 0x71, + 0x49, 0x66, 0x5e, 0xba, 0x12, 0x3f, 0x17, 0x6f, 0x70, 0x66, 0x6e, 0x41, 0x4e, 0x6a, 0x50, 0x6a, + 0x61, 0x69, 0x6a, 0x71, 0x89, 0x92, 0x00, 0x17, 0x1f, 0x4c, 0xa0, 0xb8, 0x20, 0x3f, 0xaf, 0x38, + 0x55, 0x89, 0x9b, 0x8b, 0x33, 0xb8, 0xa4, 0x28, 0x35, 0x31, 0xd7, 0xb7, 0x38, 0x5d, 0x89, 0x87, + 0x8b, 0x0b, 0xce, 0x31, 0x32, 0x9a, 0xc1, 0xc4, 0xc5, 0x12, 0x92, 0x5a, 0x5c, 0x22, 0xe4, 0xc6, + 0xc5, 0x19, 0x9a, 0x97, 0x58, 0x54, 0xe9, 0x9c, 0x98, 0x93, 0x23, 0x24, 0xad, 0x87, 0x6c, 0x85, + 0x1e, 0x8a, 0xf9, 0x52, 0x32, 0xd8, 0x25, 0x21, 0x76, 0x09, 0xb9, 0x70, 0x71, 0xb9, 0xe4, 0x97, + 0xe7, 0x15, 0x83, 0xad, 0xc0, 0x6f, 0x90, 0x38, 0x9a, 0x24, 0xcc, 0x55, 0x06, 0x8c, 0x42, 0xce, + 0x5c, 0x1c, 0xa1, 0x05, 0x50, 0x33, 0x70, 0x29, 0xc3, 0xef, 0x10, 0x0d, 0x46, 0x21, 0x5b, 0x2e, + 0x16, 0xa7, 0xcc, 0x94, 0x4c, 0xdc, 0x06, 0x48, 0xe0, 0x90, 0x30, 0xd2, 0x60, 0x34, 0x60, 0x74, + 0x72, 0x88, 0xb2, 0x4b, 0xcf, 0x2c, 0xc9, 0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xcf, + 0xcf, 0x49, 0xcc, 0x4b, 0xd7, 0x07, 0xc7, 0x40, 0x52, 0x69, 0x1a, 0x84, 0x91, 0xac, 0x9b, 0x9e, + 0x9a, 0xa7, 0x9b, 0x9e, 0xaf, 0x0f, 0x32, 0x22, 0x25, 0xb1, 0x24, 0x11, 0x1c, 0x4d, 0xd6, 0x50, + 0x03, 0x93, 0xd8, 0xc0, 0x8a, 0x8c, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0x90, 0xb9, 0x95, 0x42, + 0xc2, 0x01, 0x00, 0x00, +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/grpc/grpc.proto b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/grpc/grpc.proto new file mode 100644 index 0000000..0e5c64a --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/grpc/grpc.proto @@ -0,0 +1,61 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2015 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto3"; + +package grpc.testing; + +option go_package = "github.com/golang/protobuf/protoc-gen-go/testdata/grpc;testing"; + +message SimpleRequest { +} + +message SimpleResponse { +} + +message StreamMsg { +} + +message StreamMsg2 { +} + +service Test { + rpc UnaryCall(SimpleRequest) returns (SimpleResponse); + + // This RPC streams from the server only. + rpc Downstream(SimpleRequest) returns (stream StreamMsg); + + // This RPC streams from the client. + rpc Upstream(stream StreamMsg) returns (SimpleResponse); + + // This one streams in both directions. + rpc Bidi(stream StreamMsg) returns (stream StreamMsg2); +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/import_public/a.pb.go b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/import_public/a.pb.go new file mode 100644 index 0000000..5b780fd --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/import_public/a.pb.go @@ -0,0 +1,110 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: import_public/a.proto + +package import_public // import "github.com/golang/protobuf/protoc-gen-go/testdata/import_public" + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" +import sub "github.com/golang/protobuf/protoc-gen-go/testdata/import_public/sub" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +// M from public import import_public/sub/a.proto +type M = sub.M + +// E from public import import_public/sub/a.proto +type E = sub.E + +var E_name = sub.E_name +var E_value = sub.E_value + +const E_ZERO = E(sub.E_ZERO) + +// Ignoring public import of Local from import_public/b.proto + +type Public struct { + M *sub.M `protobuf:"bytes,1,opt,name=m" json:"m,omitempty"` + E sub.E `protobuf:"varint,2,opt,name=e,enum=goproto.test.import_public.sub.E" json:"e,omitempty"` + Local *Local `protobuf:"bytes,3,opt,name=local" json:"local,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Public) Reset() { *m = Public{} } +func (m *Public) String() string { return proto.CompactTextString(m) } +func (*Public) ProtoMessage() {} +func (*Public) Descriptor() ([]byte, []int) { + return fileDescriptor_a_c0314c022b7c17d8, []int{0} +} +func (m *Public) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Public.Unmarshal(m, b) +} +func (m *Public) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Public.Marshal(b, m, deterministic) +} +func (dst *Public) XXX_Merge(src proto.Message) { + xxx_messageInfo_Public.Merge(dst, src) +} +func (m *Public) XXX_Size() int { + return xxx_messageInfo_Public.Size(m) +} +func (m *Public) XXX_DiscardUnknown() { + xxx_messageInfo_Public.DiscardUnknown(m) +} + +var xxx_messageInfo_Public proto.InternalMessageInfo + +func (m *Public) GetM() *sub.M { + if m != nil { + return m.M + } + return nil +} + +func (m *Public) GetE() sub.E { + if m != nil { + return m.E + } + return sub.E_ZERO +} + +func (m *Public) GetLocal() *Local { + if m != nil { + return m.Local + } + return nil +} + +func init() { + proto.RegisterType((*Public)(nil), "goproto.test.import_public.Public") +} + +func init() { proto.RegisterFile("import_public/a.proto", fileDescriptor_a_c0314c022b7c17d8) } + +var fileDescriptor_a_c0314c022b7c17d8 = []byte{ + // 200 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0xcd, 0xcc, 0x2d, 0xc8, + 0x2f, 0x2a, 0x89, 0x2f, 0x28, 0x4d, 0xca, 0xc9, 0x4c, 0xd6, 0x4f, 0xd4, 0x2b, 0x28, 0xca, 0x2f, + 0xc9, 0x17, 0x92, 0x4a, 0xcf, 0x07, 0x33, 0xf4, 0x4a, 0x52, 0x8b, 0x4b, 0xf4, 0x50, 0xd4, 0x48, + 0x49, 0xa2, 0x6a, 0x29, 0x2e, 0x4d, 0x82, 0x69, 0x93, 0x42, 0x33, 0x2d, 0x09, 0x22, 0xac, 0xb4, + 0x98, 0x91, 0x8b, 0x2d, 0x00, 0x2c, 0x24, 0xa4, 0xcf, 0xc5, 0x98, 0x2b, 0xc1, 0xa8, 0xc0, 0xa8, + 0xc1, 0x6d, 0xa4, 0xa8, 0x87, 0xdb, 0x12, 0xbd, 0xe2, 0xd2, 0x24, 0x3d, 0xdf, 0x20, 0xc6, 0x5c, + 0x90, 0x86, 0x54, 0x09, 0x26, 0x05, 0x46, 0x0d, 0x3e, 0xc2, 0x1a, 0x5c, 0x83, 0x18, 0x53, 0x85, + 0xcc, 0xb9, 0x58, 0x73, 0xf2, 0x93, 0x13, 0x73, 0x24, 0x98, 0x09, 0xdb, 0xe2, 0x03, 0x52, 0x18, + 0x04, 0x51, 0xef, 0xe4, 0x18, 0x65, 0x9f, 0x9e, 0x59, 0x92, 0x51, 0x9a, 0xa4, 0x97, 0x9c, 0x9f, + 0xab, 0x9f, 0x9e, 0x9f, 0x93, 0x98, 0x97, 0xae, 0x0f, 0xd6, 0x9a, 0x54, 0x9a, 0x06, 0x61, 0x24, + 0xeb, 0xa6, 0xa7, 0xe6, 0xe9, 0xa6, 0xe7, 0xeb, 0x83, 0xcc, 0x4a, 0x49, 0x2c, 0x49, 0xd4, 0x47, + 0x31, 0x2f, 0x80, 0x21, 0x80, 0x31, 0x89, 0x0d, 0xac, 0xd2, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, + 0x70, 0xc5, 0xc3, 0x79, 0x5a, 0x01, 0x00, 0x00, +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/import_public/a.proto b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/import_public/a.proto new file mode 100644 index 0000000..957ad89 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/import_public/a.proto @@ -0,0 +1,45 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2018 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto3"; + +package goproto.test.import_public; + +option go_package = "github.com/golang/protobuf/protoc-gen-go/testdata/import_public"; + +import public "import_public/sub/a.proto"; // Different Go package. +import public "import_public/b.proto"; // Same Go package. + +message Public { + goproto.test.import_public.sub.M m = 1; + goproto.test.import_public.sub.E e = 2; + Local local = 3; +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/import_public/b.pb.go b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/import_public/b.pb.go new file mode 100644 index 0000000..427aa4f --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/import_public/b.pb.go @@ -0,0 +1,87 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: import_public/b.proto + +package import_public // import "github.com/golang/protobuf/protoc-gen-go/testdata/import_public" + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" +import sub "github.com/golang/protobuf/protoc-gen-go/testdata/import_public/sub" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type Local struct { + M *sub.M `protobuf:"bytes,1,opt,name=m" json:"m,omitempty"` + E sub.E `protobuf:"varint,2,opt,name=e,enum=goproto.test.import_public.sub.E" json:"e,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Local) Reset() { *m = Local{} } +func (m *Local) String() string { return proto.CompactTextString(m) } +func (*Local) ProtoMessage() {} +func (*Local) Descriptor() ([]byte, []int) { + return fileDescriptor_b_7f20a805fad67bd0, []int{0} +} +func (m *Local) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Local.Unmarshal(m, b) +} +func (m *Local) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Local.Marshal(b, m, deterministic) +} +func (dst *Local) XXX_Merge(src proto.Message) { + xxx_messageInfo_Local.Merge(dst, src) +} +func (m *Local) XXX_Size() int { + return xxx_messageInfo_Local.Size(m) +} +func (m *Local) XXX_DiscardUnknown() { + xxx_messageInfo_Local.DiscardUnknown(m) +} + +var xxx_messageInfo_Local proto.InternalMessageInfo + +func (m *Local) GetM() *sub.M { + if m != nil { + return m.M + } + return nil +} + +func (m *Local) GetE() sub.E { + if m != nil { + return m.E + } + return sub.E_ZERO +} + +func init() { + proto.RegisterType((*Local)(nil), "goproto.test.import_public.Local") +} + +func init() { proto.RegisterFile("import_public/b.proto", fileDescriptor_b_7f20a805fad67bd0) } + +var fileDescriptor_b_7f20a805fad67bd0 = []byte{ + // 174 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0xcd, 0xcc, 0x2d, 0xc8, + 0x2f, 0x2a, 0x89, 0x2f, 0x28, 0x4d, 0xca, 0xc9, 0x4c, 0xd6, 0x4f, 0xd2, 0x2b, 0x28, 0xca, 0x2f, + 0xc9, 0x17, 0x92, 0x4a, 0xcf, 0x07, 0x33, 0xf4, 0x4a, 0x52, 0x8b, 0x4b, 0xf4, 0x50, 0xd4, 0x48, + 0x49, 0xa2, 0x6a, 0x29, 0x2e, 0x4d, 0xd2, 0x4f, 0x84, 0x68, 0x53, 0xca, 0xe4, 0x62, 0xf5, 0xc9, + 0x4f, 0x4e, 0xcc, 0x11, 0xd2, 0xe7, 0x62, 0xcc, 0x95, 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x36, 0x52, + 0xd4, 0xc3, 0x6d, 0x96, 0x5e, 0x71, 0x69, 0x92, 0x9e, 0x6f, 0x10, 0x63, 0x2e, 0x48, 0x43, 0xaa, + 0x04, 0x93, 0x02, 0xa3, 0x06, 0x1f, 0x61, 0x0d, 0xae, 0x41, 0x8c, 0xa9, 0x4e, 0x8e, 0x51, 0xf6, + 0xe9, 0x99, 0x25, 0x19, 0xa5, 0x49, 0x7a, 0xc9, 0xf9, 0xb9, 0xfa, 0xe9, 0xf9, 0x39, 0x89, 0x79, + 0xe9, 0xfa, 0x60, 0x6d, 0x49, 0xa5, 0x69, 0x10, 0x46, 0xb2, 0x6e, 0x7a, 0x6a, 0x9e, 0x6e, 0x7a, + 0xbe, 0x3e, 0xc8, 0x9c, 0x94, 0xc4, 0x92, 0x44, 0x7d, 0x14, 0xb3, 0x92, 0xd8, 0xc0, 0xaa, 0x8c, + 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xd6, 0x2b, 0x5f, 0x8e, 0x04, 0x01, 0x00, 0x00, +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/import_public/b.proto b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/import_public/b.proto new file mode 100644 index 0000000..1dbca3e --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/import_public/b.proto @@ -0,0 +1,43 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2018 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto3"; + +package goproto.test.import_public; + +option go_package = "github.com/golang/protobuf/protoc-gen-go/testdata/import_public"; + +import "import_public/sub/a.proto"; + +message Local { + goproto.test.import_public.sub.M m = 1; + goproto.test.import_public.sub.E e = 2; +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/import_public/sub/a.pb.go b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/import_public/sub/a.pb.go new file mode 100644 index 0000000..4f8f6d2 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/import_public/sub/a.pb.go @@ -0,0 +1,100 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: import_public/sub/a.proto + +package sub // import "github.com/golang/protobuf/protoc-gen-go/testdata/import_public/sub" + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type E int32 + +const ( + E_ZERO E = 0 +) + +var E_name = map[int32]string{ + 0: "ZERO", +} +var E_value = map[string]int32{ + "ZERO": 0, +} + +func (x E) String() string { + return proto.EnumName(E_name, int32(x)) +} +func (E) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_a_91ca0264a534463a, []int{0} +} + +type M struct { + // Field using a type in the same Go package, but a different source file. + M2 *M2 `protobuf:"bytes,1,opt,name=m2" json:"m2,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *M) Reset() { *m = M{} } +func (m *M) String() string { return proto.CompactTextString(m) } +func (*M) ProtoMessage() {} +func (*M) Descriptor() ([]byte, []int) { + return fileDescriptor_a_91ca0264a534463a, []int{0} +} +func (m *M) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_M.Unmarshal(m, b) +} +func (m *M) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_M.Marshal(b, m, deterministic) +} +func (dst *M) XXX_Merge(src proto.Message) { + xxx_messageInfo_M.Merge(dst, src) +} +func (m *M) XXX_Size() int { + return xxx_messageInfo_M.Size(m) +} +func (m *M) XXX_DiscardUnknown() { + xxx_messageInfo_M.DiscardUnknown(m) +} + +var xxx_messageInfo_M proto.InternalMessageInfo + +func (m *M) GetM2() *M2 { + if m != nil { + return m.M2 + } + return nil +} + +func init() { + proto.RegisterType((*M)(nil), "goproto.test.import_public.sub.M") + proto.RegisterEnum("goproto.test.import_public.sub.E", E_name, E_value) +} + +func init() { proto.RegisterFile("import_public/sub/a.proto", fileDescriptor_a_91ca0264a534463a) } + +var fileDescriptor_a_91ca0264a534463a = []byte{ + // 172 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0xcc, 0xcc, 0x2d, 0xc8, + 0x2f, 0x2a, 0x89, 0x2f, 0x28, 0x4d, 0xca, 0xc9, 0x4c, 0xd6, 0x2f, 0x2e, 0x4d, 0xd2, 0x4f, 0xd4, + 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x92, 0x4b, 0xcf, 0x07, 0x33, 0xf4, 0x4a, 0x52, 0x8b, 0x4b, + 0xf4, 0x50, 0xd4, 0xe9, 0x15, 0x97, 0x26, 0x49, 0x61, 0xd1, 0x9a, 0x04, 0xd1, 0xaa, 0x64, 0xce, + 0xc5, 0xe8, 0x2b, 0x64, 0xc4, 0xc5, 0x94, 0x6b, 0x24, 0xc1, 0xa8, 0xc0, 0xa8, 0xc1, 0x6d, 0xa4, + 0xa4, 0x87, 0xdf, 0x30, 0x3d, 0x5f, 0xa3, 0x20, 0xa6, 0x5c, 0x23, 0x2d, 0x5e, 0x2e, 0x46, 0x57, + 0x21, 0x0e, 0x2e, 0x96, 0x28, 0xd7, 0x20, 0x7f, 0x01, 0x06, 0x27, 0xd7, 0x28, 0xe7, 0xf4, 0xcc, + 0x92, 0x8c, 0xd2, 0x24, 0xbd, 0xe4, 0xfc, 0x5c, 0xfd, 0xf4, 0xfc, 0x9c, 0xc4, 0xbc, 0x74, 0x7d, + 0xb0, 0x39, 0x49, 0xa5, 0x69, 0x10, 0x46, 0xb2, 0x6e, 0x7a, 0x6a, 0x9e, 0x6e, 0x7a, 0xbe, 0x3e, + 0xc8, 0xe0, 0x94, 0xc4, 0x92, 0x44, 0x7d, 0x0c, 0x67, 0x25, 0xb1, 0x81, 0x55, 0x1a, 0x03, 0x02, + 0x00, 0x00, 0xff, 0xff, 0x81, 0xcc, 0x07, 0x7d, 0xed, 0x00, 0x00, 0x00, +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/import_public/sub/a.proto b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/import_public/sub/a.proto new file mode 100644 index 0000000..4494c81 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/import_public/sub/a.proto @@ -0,0 +1,47 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2018 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto3"; + +package goproto.test.import_public.sub; + +option go_package = "github.com/golang/protobuf/protoc-gen-go/testdata/import_public/sub"; + +import "import_public/sub/b.proto"; + +message M { + // Field using a type in the same Go package, but a different source file. + M2 m2 = 1; +} + +enum E { + ZERO = 0; +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/import_public/sub/b.pb.go b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/import_public/sub/b.pb.go new file mode 100644 index 0000000..d57a3bb --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/import_public/sub/b.pb.go @@ -0,0 +1,67 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: import_public/sub/b.proto + +package sub // import "github.com/golang/protobuf/protoc-gen-go/testdata/import_public/sub" + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type M2 struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *M2) Reset() { *m = M2{} } +func (m *M2) String() string { return proto.CompactTextString(m) } +func (*M2) ProtoMessage() {} +func (*M2) Descriptor() ([]byte, []int) { + return fileDescriptor_b_eba25180453d86b4, []int{0} +} +func (m *M2) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_M2.Unmarshal(m, b) +} +func (m *M2) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_M2.Marshal(b, m, deterministic) +} +func (dst *M2) XXX_Merge(src proto.Message) { + xxx_messageInfo_M2.Merge(dst, src) +} +func (m *M2) XXX_Size() int { + return xxx_messageInfo_M2.Size(m) +} +func (m *M2) XXX_DiscardUnknown() { + xxx_messageInfo_M2.DiscardUnknown(m) +} + +var xxx_messageInfo_M2 proto.InternalMessageInfo + +func init() { + proto.RegisterType((*M2)(nil), "goproto.test.import_public.sub.M2") +} + +func init() { proto.RegisterFile("import_public/sub/b.proto", fileDescriptor_b_eba25180453d86b4) } + +var fileDescriptor_b_eba25180453d86b4 = []byte{ + // 127 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0xcc, 0xcc, 0x2d, 0xc8, + 0x2f, 0x2a, 0x89, 0x2f, 0x28, 0x4d, 0xca, 0xc9, 0x4c, 0xd6, 0x2f, 0x2e, 0x4d, 0xd2, 0x4f, 0xd2, + 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x92, 0x4b, 0xcf, 0x07, 0x33, 0xf4, 0x4a, 0x52, 0x8b, 0x4b, + 0xf4, 0x50, 0xd4, 0xe9, 0x15, 0x97, 0x26, 0x29, 0xb1, 0x70, 0x31, 0xf9, 0x1a, 0x39, 0xb9, 0x46, + 0x39, 0xa7, 0x67, 0x96, 0x64, 0x94, 0x26, 0xe9, 0x25, 0xe7, 0xe7, 0xea, 0xa7, 0xe7, 0xe7, 0x24, + 0xe6, 0xa5, 0xeb, 0x83, 0xf5, 0x25, 0x95, 0xa6, 0x41, 0x18, 0xc9, 0xba, 0xe9, 0xa9, 0x79, 0xba, + 0xe9, 0xf9, 0xfa, 0x20, 0x83, 0x52, 0x12, 0x4b, 0x12, 0xf5, 0x31, 0x2c, 0x4d, 0x62, 0x03, 0xab, + 0x34, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x64, 0x42, 0xe4, 0xa8, 0x90, 0x00, 0x00, 0x00, +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/import_public/sub/b.proto b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/import_public/sub/b.proto new file mode 100644 index 0000000..c7299e0 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/import_public/sub/b.proto @@ -0,0 +1,39 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2018 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto3"; + +package goproto.test.import_public.sub; + +option go_package = "github.com/golang/protobuf/protoc-gen-go/testdata/import_public/sub"; + +message M2 { +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/import_public_test.go b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/import_public_test.go new file mode 100644 index 0000000..7ef776b --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/import_public_test.go @@ -0,0 +1,66 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +// +build go1.9 + +package testdata + +import ( + "testing" + + mainpb "github.com/golang/protobuf/protoc-gen-go/testdata/import_public" + subpb "github.com/golang/protobuf/protoc-gen-go/testdata/import_public/sub" +) + +func TestImportPublicLink(t *testing.T) { + // mainpb.[ME] should be interchangable with subpb.[ME]. + var _ mainpb.M = subpb.M{} + var _ mainpb.E = subpb.E(0) + _ = &mainpb.Public{ + M: &mainpb.M{}, + E: mainpb.E_ZERO, + Local: &mainpb.Local{ + M: &mainpb.M{}, + E: mainpb.E_ZERO, + }, + } + _ = &mainpb.Public{ + M: &subpb.M{}, + E: subpb.E_ZERO, + Local: &mainpb.Local{ + M: &subpb.M{}, + E: subpb.E_ZERO, + }, + } + _ = &mainpb.M{ + M2: &subpb.M2{}, + } +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/fmt/m.pb.go b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/fmt/m.pb.go new file mode 100644 index 0000000..ca312d6 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/fmt/m.pb.go @@ -0,0 +1,66 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: imports/fmt/m.proto + +package fmt // import "github.com/golang/protobuf/protoc-gen-go/testdata/imports/fmt" + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type M struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *M) Reset() { *m = M{} } +func (m *M) String() string { return proto.CompactTextString(m) } +func (*M) ProtoMessage() {} +func (*M) Descriptor() ([]byte, []int) { + return fileDescriptor_m_867dd34c461422b8, []int{0} +} +func (m *M) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_M.Unmarshal(m, b) +} +func (m *M) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_M.Marshal(b, m, deterministic) +} +func (dst *M) XXX_Merge(src proto.Message) { + xxx_messageInfo_M.Merge(dst, src) +} +func (m *M) XXX_Size() int { + return xxx_messageInfo_M.Size(m) +} +func (m *M) XXX_DiscardUnknown() { + xxx_messageInfo_M.DiscardUnknown(m) +} + +var xxx_messageInfo_M proto.InternalMessageInfo + +func init() { + proto.RegisterType((*M)(nil), "fmt.M") +} + +func init() { proto.RegisterFile("imports/fmt/m.proto", fileDescriptor_m_867dd34c461422b8) } + +var fileDescriptor_m_867dd34c461422b8 = []byte{ + // 109 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0xce, 0xcc, 0x2d, 0xc8, + 0x2f, 0x2a, 0x29, 0xd6, 0x4f, 0xcb, 0x2d, 0xd1, 0xcf, 0xd5, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, + 0x62, 0x4e, 0xcb, 0x2d, 0x51, 0x62, 0xe6, 0x62, 0xf4, 0x75, 0xb2, 0x8f, 0xb2, 0x4d, 0xcf, 0x2c, + 0xc9, 0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xcf, 0xcf, 0x49, 0xcc, 0x4b, 0xd7, 0x07, + 0x2b, 0x4a, 0x2a, 0x4d, 0x83, 0x30, 0x92, 0x75, 0xd3, 0x53, 0xf3, 0x74, 0xd3, 0xf3, 0xf5, 0x4b, + 0x52, 0x8b, 0x4b, 0x52, 0x12, 0x4b, 0x12, 0xf5, 0x91, 0x8c, 0x4c, 0x62, 0x03, 0xab, 0x31, 0x06, + 0x04, 0x00, 0x00, 0xff, 0xff, 0xc4, 0xc9, 0xee, 0xbe, 0x68, 0x00, 0x00, 0x00, +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/fmt/m.proto b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/fmt/m.proto new file mode 100644 index 0000000..142d8cf --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/fmt/m.proto @@ -0,0 +1,35 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2018 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto3"; +package fmt; +option go_package = "github.com/golang/protobuf/protoc-gen-go/testdata/imports/fmt"; +message M {} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_1/m1.pb.go b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_1/m1.pb.go new file mode 100644 index 0000000..82ec35e --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_1/m1.pb.go @@ -0,0 +1,130 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: imports/test_a_1/m1.proto + +package test_a_1 // import "github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_1" + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type E1 int32 + +const ( + E1_E1_ZERO E1 = 0 +) + +var E1_name = map[int32]string{ + 0: "E1_ZERO", +} +var E1_value = map[string]int32{ + "E1_ZERO": 0, +} + +func (x E1) String() string { + return proto.EnumName(E1_name, int32(x)) +} +func (E1) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_m1_56a2598431d21e61, []int{0} +} + +type M1 struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *M1) Reset() { *m = M1{} } +func (m *M1) String() string { return proto.CompactTextString(m) } +func (*M1) ProtoMessage() {} +func (*M1) Descriptor() ([]byte, []int) { + return fileDescriptor_m1_56a2598431d21e61, []int{0} +} +func (m *M1) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_M1.Unmarshal(m, b) +} +func (m *M1) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_M1.Marshal(b, m, deterministic) +} +func (dst *M1) XXX_Merge(src proto.Message) { + xxx_messageInfo_M1.Merge(dst, src) +} +func (m *M1) XXX_Size() int { + return xxx_messageInfo_M1.Size(m) +} +func (m *M1) XXX_DiscardUnknown() { + xxx_messageInfo_M1.DiscardUnknown(m) +} + +var xxx_messageInfo_M1 proto.InternalMessageInfo + +type M1_1 struct { + M1 *M1 `protobuf:"bytes,1,opt,name=m1" json:"m1,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *M1_1) Reset() { *m = M1_1{} } +func (m *M1_1) String() string { return proto.CompactTextString(m) } +func (*M1_1) ProtoMessage() {} +func (*M1_1) Descriptor() ([]byte, []int) { + return fileDescriptor_m1_56a2598431d21e61, []int{1} +} +func (m *M1_1) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_M1_1.Unmarshal(m, b) +} +func (m *M1_1) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_M1_1.Marshal(b, m, deterministic) +} +func (dst *M1_1) XXX_Merge(src proto.Message) { + xxx_messageInfo_M1_1.Merge(dst, src) +} +func (m *M1_1) XXX_Size() int { + return xxx_messageInfo_M1_1.Size(m) +} +func (m *M1_1) XXX_DiscardUnknown() { + xxx_messageInfo_M1_1.DiscardUnknown(m) +} + +var xxx_messageInfo_M1_1 proto.InternalMessageInfo + +func (m *M1_1) GetM1() *M1 { + if m != nil { + return m.M1 + } + return nil +} + +func init() { + proto.RegisterType((*M1)(nil), "test.a.M1") + proto.RegisterType((*M1_1)(nil), "test.a.M1_1") + proto.RegisterEnum("test.a.E1", E1_name, E1_value) +} + +func init() { proto.RegisterFile("imports/test_a_1/m1.proto", fileDescriptor_m1_56a2598431d21e61) } + +var fileDescriptor_m1_56a2598431d21e61 = []byte{ + // 165 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0xcc, 0xcc, 0x2d, 0xc8, + 0x2f, 0x2a, 0x29, 0xd6, 0x2f, 0x49, 0x2d, 0x2e, 0x89, 0x4f, 0x8c, 0x37, 0xd4, 0xcf, 0x35, 0xd4, + 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0x03, 0x09, 0xe9, 0x25, 0x2a, 0xb1, 0x70, 0x31, 0xf9, + 0x1a, 0x2a, 0x29, 0x71, 0xb1, 0xf8, 0x1a, 0xc6, 0x1b, 0x0a, 0x49, 0x71, 0x31, 0xe5, 0x1a, 0x4a, + 0x30, 0x2a, 0x30, 0x6a, 0x70, 0x1b, 0x71, 0xe9, 0x41, 0x94, 0xe8, 0xf9, 0x1a, 0x06, 0x31, 0xe5, + 0x1a, 0x6a, 0x09, 0x72, 0x31, 0xb9, 0x1a, 0x0a, 0x71, 0x73, 0xb1, 0xbb, 0x1a, 0xc6, 0x47, 0xb9, + 0x06, 0xf9, 0x0b, 0x30, 0x38, 0xb9, 0x44, 0x39, 0xa5, 0x67, 0x96, 0x64, 0x94, 0x26, 0xe9, 0x25, + 0xe7, 0xe7, 0xea, 0xa7, 0xe7, 0xe7, 0x24, 0xe6, 0xa5, 0xeb, 0x83, 0xcd, 0x4f, 0x2a, 0x4d, 0x83, + 0x30, 0x92, 0x75, 0xd3, 0x53, 0xf3, 0x74, 0xd3, 0xf3, 0xc1, 0x4e, 0x48, 0x49, 0x2c, 0x49, 0xd4, + 0x47, 0x77, 0x53, 0x12, 0x1b, 0x58, 0xa1, 0x31, 0x20, 0x00, 0x00, 0xff, 0xff, 0xcc, 0xae, 0xc9, + 0xcd, 0xae, 0x00, 0x00, 0x00, +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_1/m1.proto b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_1/m1.proto new file mode 100644 index 0000000..da54c1e --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_1/m1.proto @@ -0,0 +1,44 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2018 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto3"; +package test.a; +option go_package = "github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_1"; + +message M1 {} + +message M1_1 { + M1 m1 = 1; +} + +enum E1 { + E1_ZERO = 0; +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_1/m2.pb.go b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_1/m2.pb.go new file mode 100644 index 0000000..1b629bf --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_1/m2.pb.go @@ -0,0 +1,67 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: imports/test_a_1/m2.proto + +package test_a_1 // import "github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_1" + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type M2 struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *M2) Reset() { *m = M2{} } +func (m *M2) String() string { return proto.CompactTextString(m) } +func (*M2) ProtoMessage() {} +func (*M2) Descriptor() ([]byte, []int) { + return fileDescriptor_m2_ccd6356c045a9ac3, []int{0} +} +func (m *M2) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_M2.Unmarshal(m, b) +} +func (m *M2) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_M2.Marshal(b, m, deterministic) +} +func (dst *M2) XXX_Merge(src proto.Message) { + xxx_messageInfo_M2.Merge(dst, src) +} +func (m *M2) XXX_Size() int { + return xxx_messageInfo_M2.Size(m) +} +func (m *M2) XXX_DiscardUnknown() { + xxx_messageInfo_M2.DiscardUnknown(m) +} + +var xxx_messageInfo_M2 proto.InternalMessageInfo + +func init() { + proto.RegisterType((*M2)(nil), "test.a.M2") +} + +func init() { proto.RegisterFile("imports/test_a_1/m2.proto", fileDescriptor_m2_ccd6356c045a9ac3) } + +var fileDescriptor_m2_ccd6356c045a9ac3 = []byte{ + // 114 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0xcc, 0xcc, 0x2d, 0xc8, + 0x2f, 0x2a, 0x29, 0xd6, 0x2f, 0x49, 0x2d, 0x2e, 0x89, 0x4f, 0x8c, 0x37, 0xd4, 0xcf, 0x35, 0xd2, + 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0x03, 0x09, 0xe9, 0x25, 0x2a, 0xb1, 0x70, 0x31, 0xf9, + 0x1a, 0x39, 0xb9, 0x44, 0x39, 0xa5, 0x67, 0x96, 0x64, 0x94, 0x26, 0xe9, 0x25, 0xe7, 0xe7, 0xea, + 0xa7, 0xe7, 0xe7, 0x24, 0xe6, 0xa5, 0xeb, 0x83, 0x15, 0x26, 0x95, 0xa6, 0x41, 0x18, 0xc9, 0xba, + 0xe9, 0xa9, 0x79, 0xba, 0xe9, 0xf9, 0x60, 0xb3, 0x52, 0x12, 0x4b, 0x12, 0xf5, 0xd1, 0x0d, 0x4f, + 0x62, 0x03, 0x2b, 0x34, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0xe3, 0xe0, 0x7e, 0xc0, 0x77, 0x00, + 0x00, 0x00, +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_1/m2.proto b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_1/m2.proto new file mode 100644 index 0000000..49499dc --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_1/m2.proto @@ -0,0 +1,35 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2018 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto3"; +package test.a; +option go_package = "github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_1"; +message M2 {} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_2/m3.pb.go b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_2/m3.pb.go new file mode 100644 index 0000000..e3895d2 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_2/m3.pb.go @@ -0,0 +1,67 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: imports/test_a_2/m3.proto + +package test_a_2 // import "github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_2" + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type M3 struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *M3) Reset() { *m = M3{} } +func (m *M3) String() string { return proto.CompactTextString(m) } +func (*M3) ProtoMessage() {} +func (*M3) Descriptor() ([]byte, []int) { + return fileDescriptor_m3_de310e87d08d4216, []int{0} +} +func (m *M3) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_M3.Unmarshal(m, b) +} +func (m *M3) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_M3.Marshal(b, m, deterministic) +} +func (dst *M3) XXX_Merge(src proto.Message) { + xxx_messageInfo_M3.Merge(dst, src) +} +func (m *M3) XXX_Size() int { + return xxx_messageInfo_M3.Size(m) +} +func (m *M3) XXX_DiscardUnknown() { + xxx_messageInfo_M3.DiscardUnknown(m) +} + +var xxx_messageInfo_M3 proto.InternalMessageInfo + +func init() { + proto.RegisterType((*M3)(nil), "test.a.M3") +} + +func init() { proto.RegisterFile("imports/test_a_2/m3.proto", fileDescriptor_m3_de310e87d08d4216) } + +var fileDescriptor_m3_de310e87d08d4216 = []byte{ + // 114 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0xcc, 0xcc, 0x2d, 0xc8, + 0x2f, 0x2a, 0x29, 0xd6, 0x2f, 0x49, 0x2d, 0x2e, 0x89, 0x4f, 0x8c, 0x37, 0xd2, 0xcf, 0x35, 0xd6, + 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0x03, 0x09, 0xe9, 0x25, 0x2a, 0xb1, 0x70, 0x31, 0xf9, + 0x1a, 0x3b, 0xb9, 0x44, 0x39, 0xa5, 0x67, 0x96, 0x64, 0x94, 0x26, 0xe9, 0x25, 0xe7, 0xe7, 0xea, + 0xa7, 0xe7, 0xe7, 0x24, 0xe6, 0xa5, 0xeb, 0x83, 0x15, 0x26, 0x95, 0xa6, 0x41, 0x18, 0xc9, 0xba, + 0xe9, 0xa9, 0x79, 0xba, 0xe9, 0xf9, 0x60, 0xb3, 0x52, 0x12, 0x4b, 0x12, 0xf5, 0xd1, 0x0d, 0x4f, + 0x62, 0x03, 0x2b, 0x34, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x23, 0x86, 0x27, 0x47, 0x77, 0x00, + 0x00, 0x00, +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_2/m3.proto b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_2/m3.proto new file mode 100644 index 0000000..5e811ef --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_2/m3.proto @@ -0,0 +1,35 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2018 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto3"; +package test.a; +option go_package = "github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_2"; +message M3 {} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_2/m4.pb.go b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_2/m4.pb.go new file mode 100644 index 0000000..65a3bad --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_2/m4.pb.go @@ -0,0 +1,67 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: imports/test_a_2/m4.proto + +package test_a_2 // import "github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_2" + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type M4 struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *M4) Reset() { *m = M4{} } +func (m *M4) String() string { return proto.CompactTextString(m) } +func (*M4) ProtoMessage() {} +func (*M4) Descriptor() ([]byte, []int) { + return fileDescriptor_m4_da12b386229f3791, []int{0} +} +func (m *M4) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_M4.Unmarshal(m, b) +} +func (m *M4) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_M4.Marshal(b, m, deterministic) +} +func (dst *M4) XXX_Merge(src proto.Message) { + xxx_messageInfo_M4.Merge(dst, src) +} +func (m *M4) XXX_Size() int { + return xxx_messageInfo_M4.Size(m) +} +func (m *M4) XXX_DiscardUnknown() { + xxx_messageInfo_M4.DiscardUnknown(m) +} + +var xxx_messageInfo_M4 proto.InternalMessageInfo + +func init() { + proto.RegisterType((*M4)(nil), "test.a.M4") +} + +func init() { proto.RegisterFile("imports/test_a_2/m4.proto", fileDescriptor_m4_da12b386229f3791) } + +var fileDescriptor_m4_da12b386229f3791 = []byte{ + // 114 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0xcc, 0xcc, 0x2d, 0xc8, + 0x2f, 0x2a, 0x29, 0xd6, 0x2f, 0x49, 0x2d, 0x2e, 0x89, 0x4f, 0x8c, 0x37, 0xd2, 0xcf, 0x35, 0xd1, + 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0x03, 0x09, 0xe9, 0x25, 0x2a, 0xb1, 0x70, 0x31, 0xf9, + 0x9a, 0x38, 0xb9, 0x44, 0x39, 0xa5, 0x67, 0x96, 0x64, 0x94, 0x26, 0xe9, 0x25, 0xe7, 0xe7, 0xea, + 0xa7, 0xe7, 0xe7, 0x24, 0xe6, 0xa5, 0xeb, 0x83, 0x15, 0x26, 0x95, 0xa6, 0x41, 0x18, 0xc9, 0xba, + 0xe9, 0xa9, 0x79, 0xba, 0xe9, 0xf9, 0x60, 0xb3, 0x52, 0x12, 0x4b, 0x12, 0xf5, 0xd1, 0x0d, 0x4f, + 0x62, 0x03, 0x2b, 0x34, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x58, 0xcb, 0x10, 0xc8, 0x77, 0x00, + 0x00, 0x00, +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_2/m4.proto b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_2/m4.proto new file mode 100644 index 0000000..8f8fe3e --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_2/m4.proto @@ -0,0 +1,35 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2018 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto3"; +package test.a; +option go_package = "github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_2"; +message M4 {} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_b_1/m1.pb.go b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_b_1/m1.pb.go new file mode 100644 index 0000000..831f414 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_b_1/m1.pb.go @@ -0,0 +1,67 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: imports/test_b_1/m1.proto + +package beta // import "github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_b_1" + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type M1 struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *M1) Reset() { *m = M1{} } +func (m *M1) String() string { return proto.CompactTextString(m) } +func (*M1) ProtoMessage() {} +func (*M1) Descriptor() ([]byte, []int) { + return fileDescriptor_m1_aff127b054aec649, []int{0} +} +func (m *M1) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_M1.Unmarshal(m, b) +} +func (m *M1) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_M1.Marshal(b, m, deterministic) +} +func (dst *M1) XXX_Merge(src proto.Message) { + xxx_messageInfo_M1.Merge(dst, src) +} +func (m *M1) XXX_Size() int { + return xxx_messageInfo_M1.Size(m) +} +func (m *M1) XXX_DiscardUnknown() { + xxx_messageInfo_M1.DiscardUnknown(m) +} + +var xxx_messageInfo_M1 proto.InternalMessageInfo + +func init() { + proto.RegisterType((*M1)(nil), "test.b.part1.M1") +} + +func init() { proto.RegisterFile("imports/test_b_1/m1.proto", fileDescriptor_m1_aff127b054aec649) } + +var fileDescriptor_m1_aff127b054aec649 = []byte{ + // 125 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0xcc, 0xcc, 0x2d, 0xc8, + 0x2f, 0x2a, 0x29, 0xd6, 0x2f, 0x49, 0x2d, 0x2e, 0x89, 0x4f, 0x8a, 0x37, 0xd4, 0xcf, 0x35, 0xd4, + 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x01, 0x09, 0xe9, 0x25, 0xe9, 0x15, 0x24, 0x16, 0x95, + 0x18, 0x2a, 0xb1, 0x70, 0x31, 0xf9, 0x1a, 0x3a, 0x79, 0x46, 0xb9, 0xa7, 0x67, 0x96, 0x64, 0x94, + 0x26, 0xe9, 0x25, 0xe7, 0xe7, 0xea, 0xa7, 0xe7, 0xe7, 0x24, 0xe6, 0xa5, 0xeb, 0x83, 0x95, 0x27, + 0x95, 0xa6, 0x41, 0x18, 0xc9, 0xba, 0xe9, 0xa9, 0x79, 0xba, 0xe9, 0xf9, 0x60, 0x13, 0x53, 0x12, + 0x4b, 0x12, 0xf5, 0xd1, 0xad, 0xb0, 0x4e, 0x4a, 0x2d, 0x49, 0x4c, 0x62, 0x03, 0xab, 0x36, 0x06, + 0x04, 0x00, 0x00, 0xff, 0xff, 0x4a, 0xf1, 0x3b, 0x7f, 0x82, 0x00, 0x00, 0x00, +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_b_1/m1.proto b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_b_1/m1.proto new file mode 100644 index 0000000..2c35ec4 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_b_1/m1.proto @@ -0,0 +1,35 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2018 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto3"; +package test.b.part1; +option go_package = "github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_b_1;beta"; +message M1 {} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_b_1/m2.pb.go b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_b_1/m2.pb.go new file mode 100644 index 0000000..bc74105 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_b_1/m2.pb.go @@ -0,0 +1,67 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: imports/test_b_1/m2.proto + +package beta // import "github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_b_1" + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type M2 struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *M2) Reset() { *m = M2{} } +func (m *M2) String() string { return proto.CompactTextString(m) } +func (*M2) ProtoMessage() {} +func (*M2) Descriptor() ([]byte, []int) { + return fileDescriptor_m2_0c59cab35ba1b0d8, []int{0} +} +func (m *M2) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_M2.Unmarshal(m, b) +} +func (m *M2) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_M2.Marshal(b, m, deterministic) +} +func (dst *M2) XXX_Merge(src proto.Message) { + xxx_messageInfo_M2.Merge(dst, src) +} +func (m *M2) XXX_Size() int { + return xxx_messageInfo_M2.Size(m) +} +func (m *M2) XXX_DiscardUnknown() { + xxx_messageInfo_M2.DiscardUnknown(m) +} + +var xxx_messageInfo_M2 proto.InternalMessageInfo + +func init() { + proto.RegisterType((*M2)(nil), "test.b.part2.M2") +} + +func init() { proto.RegisterFile("imports/test_b_1/m2.proto", fileDescriptor_m2_0c59cab35ba1b0d8) } + +var fileDescriptor_m2_0c59cab35ba1b0d8 = []byte{ + // 125 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0xcc, 0xcc, 0x2d, 0xc8, + 0x2f, 0x2a, 0x29, 0xd6, 0x2f, 0x49, 0x2d, 0x2e, 0x89, 0x4f, 0x8a, 0x37, 0xd4, 0xcf, 0x35, 0xd2, + 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x01, 0x09, 0xe9, 0x25, 0xe9, 0x15, 0x24, 0x16, 0x95, + 0x18, 0x29, 0xb1, 0x70, 0x31, 0xf9, 0x1a, 0x39, 0x79, 0x46, 0xb9, 0xa7, 0x67, 0x96, 0x64, 0x94, + 0x26, 0xe9, 0x25, 0xe7, 0xe7, 0xea, 0xa7, 0xe7, 0xe7, 0x24, 0xe6, 0xa5, 0xeb, 0x83, 0x95, 0x27, + 0x95, 0xa6, 0x41, 0x18, 0xc9, 0xba, 0xe9, 0xa9, 0x79, 0xba, 0xe9, 0xf9, 0x60, 0x13, 0x53, 0x12, + 0x4b, 0x12, 0xf5, 0xd1, 0xad, 0xb0, 0x4e, 0x4a, 0x2d, 0x49, 0x4c, 0x62, 0x03, 0xab, 0x36, 0x06, + 0x04, 0x00, 0x00, 0xff, 0xff, 0x44, 0x29, 0xbe, 0x6d, 0x82, 0x00, 0x00, 0x00, +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_b_1/m2.proto b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_b_1/m2.proto new file mode 100644 index 0000000..13723be --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_b_1/m2.proto @@ -0,0 +1,35 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2018 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto3"; +package test.b.part2; +option go_package = "github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_b_1;beta"; +message M2 {} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_import_a1m1.pb.go b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_import_a1m1.pb.go new file mode 100644 index 0000000..72daffd --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_import_a1m1.pb.go @@ -0,0 +1,80 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: imports/test_import_a1m1.proto + +package imports // import "github.com/golang/protobuf/protoc-gen-go/testdata/imports" + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" +import test_a_1 "github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_1" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type A1M1 struct { + F *test_a_1.M1 `protobuf:"bytes,1,opt,name=f" json:"f,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *A1M1) Reset() { *m = A1M1{} } +func (m *A1M1) String() string { return proto.CompactTextString(m) } +func (*A1M1) ProtoMessage() {} +func (*A1M1) Descriptor() ([]byte, []int) { + return fileDescriptor_test_import_a1m1_d7f2b5c638a69f6e, []int{0} +} +func (m *A1M1) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_A1M1.Unmarshal(m, b) +} +func (m *A1M1) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_A1M1.Marshal(b, m, deterministic) +} +func (dst *A1M1) XXX_Merge(src proto.Message) { + xxx_messageInfo_A1M1.Merge(dst, src) +} +func (m *A1M1) XXX_Size() int { + return xxx_messageInfo_A1M1.Size(m) +} +func (m *A1M1) XXX_DiscardUnknown() { + xxx_messageInfo_A1M1.DiscardUnknown(m) +} + +var xxx_messageInfo_A1M1 proto.InternalMessageInfo + +func (m *A1M1) GetF() *test_a_1.M1 { + if m != nil { + return m.F + } + return nil +} + +func init() { + proto.RegisterType((*A1M1)(nil), "test.A1M1") +} + +func init() { + proto.RegisterFile("imports/test_import_a1m1.proto", fileDescriptor_test_import_a1m1_d7f2b5c638a69f6e) +} + +var fileDescriptor_test_import_a1m1_d7f2b5c638a69f6e = []byte{ + // 149 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0xcb, 0xcc, 0x2d, 0xc8, + 0x2f, 0x2a, 0x29, 0xd6, 0x2f, 0x49, 0x2d, 0x2e, 0x89, 0x87, 0x70, 0xe2, 0x13, 0x0d, 0x73, 0x0d, + 0xf5, 0x0a, 0x8a, 0xf2, 0x4b, 0xf2, 0x85, 0x58, 0x40, 0xe2, 0x52, 0x92, 0x28, 0xaa, 0x12, 0xe3, + 0x0d, 0xf5, 0x61, 0x0a, 0x94, 0x14, 0xb8, 0x58, 0x1c, 0x0d, 0x7d, 0x0d, 0x85, 0x24, 0xb8, 0x18, + 0xd3, 0x24, 0x18, 0x15, 0x18, 0x35, 0xb8, 0x8d, 0xb8, 0xf4, 0x40, 0xca, 0xf4, 0x12, 0xf5, 0x7c, + 0x0d, 0x83, 0x18, 0xd3, 0x9c, 0xac, 0xa3, 0x2c, 0xd3, 0x33, 0x4b, 0x32, 0x4a, 0x93, 0xf4, 0x92, + 0xf3, 0x73, 0xf5, 0xd3, 0xf3, 0x73, 0x12, 0xf3, 0xd2, 0xf5, 0xc1, 0x9a, 0x93, 0x4a, 0xd3, 0x20, + 0x8c, 0x64, 0xdd, 0xf4, 0xd4, 0x3c, 0xdd, 0xf4, 0x7c, 0xb0, 0xf9, 0x29, 0x89, 0x25, 0x89, 0xfa, + 0x50, 0x0b, 0x93, 0xd8, 0xc0, 0xf2, 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x84, 0x2f, 0x18, + 0x23, 0xa8, 0x00, 0x00, 0x00, +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_import_a1m1.proto b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_import_a1m1.proto new file mode 100644 index 0000000..abf07f2 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_import_a1m1.proto @@ -0,0 +1,42 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2018 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto3"; + +package test; + +option go_package = "github.com/golang/protobuf/protoc-gen-go/testdata/imports"; + +import "imports/test_a_1/m1.proto"; + +message A1M1 { + test.a.M1 f = 1; +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_import_a1m2.pb.go b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_import_a1m2.pb.go new file mode 100644 index 0000000..9e36ebd --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_import_a1m2.pb.go @@ -0,0 +1,80 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: imports/test_import_a1m2.proto + +package imports // import "github.com/golang/protobuf/protoc-gen-go/testdata/imports" + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" +import test_a_1 "github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_1" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type A1M2 struct { + F *test_a_1.M2 `protobuf:"bytes,1,opt,name=f" json:"f,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *A1M2) Reset() { *m = A1M2{} } +func (m *A1M2) String() string { return proto.CompactTextString(m) } +func (*A1M2) ProtoMessage() {} +func (*A1M2) Descriptor() ([]byte, []int) { + return fileDescriptor_test_import_a1m2_9a3281ce9464e116, []int{0} +} +func (m *A1M2) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_A1M2.Unmarshal(m, b) +} +func (m *A1M2) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_A1M2.Marshal(b, m, deterministic) +} +func (dst *A1M2) XXX_Merge(src proto.Message) { + xxx_messageInfo_A1M2.Merge(dst, src) +} +func (m *A1M2) XXX_Size() int { + return xxx_messageInfo_A1M2.Size(m) +} +func (m *A1M2) XXX_DiscardUnknown() { + xxx_messageInfo_A1M2.DiscardUnknown(m) +} + +var xxx_messageInfo_A1M2 proto.InternalMessageInfo + +func (m *A1M2) GetF() *test_a_1.M2 { + if m != nil { + return m.F + } + return nil +} + +func init() { + proto.RegisterType((*A1M2)(nil), "test.A1M2") +} + +func init() { + proto.RegisterFile("imports/test_import_a1m2.proto", fileDescriptor_test_import_a1m2_9a3281ce9464e116) +} + +var fileDescriptor_test_import_a1m2_9a3281ce9464e116 = []byte{ + // 149 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0xcb, 0xcc, 0x2d, 0xc8, + 0x2f, 0x2a, 0x29, 0xd6, 0x2f, 0x49, 0x2d, 0x2e, 0x89, 0x87, 0x70, 0xe2, 0x13, 0x0d, 0x73, 0x8d, + 0xf4, 0x0a, 0x8a, 0xf2, 0x4b, 0xf2, 0x85, 0x58, 0x40, 0xe2, 0x52, 0x92, 0x28, 0xaa, 0x12, 0xe3, + 0x0d, 0xf5, 0x61, 0x0a, 0x94, 0x14, 0xb8, 0x58, 0x1c, 0x0d, 0x7d, 0x8d, 0x84, 0x24, 0xb8, 0x18, + 0xd3, 0x24, 0x18, 0x15, 0x18, 0x35, 0xb8, 0x8d, 0xb8, 0xf4, 0x40, 0xca, 0xf4, 0x12, 0xf5, 0x7c, + 0x8d, 0x82, 0x18, 0xd3, 0x9c, 0xac, 0xa3, 0x2c, 0xd3, 0x33, 0x4b, 0x32, 0x4a, 0x93, 0xf4, 0x92, + 0xf3, 0x73, 0xf5, 0xd3, 0xf3, 0x73, 0x12, 0xf3, 0xd2, 0xf5, 0xc1, 0x9a, 0x93, 0x4a, 0xd3, 0x20, + 0x8c, 0x64, 0xdd, 0xf4, 0xd4, 0x3c, 0xdd, 0xf4, 0x7c, 0xb0, 0xf9, 0x29, 0x89, 0x25, 0x89, 0xfa, + 0x50, 0x0b, 0x93, 0xd8, 0xc0, 0xf2, 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1f, 0x88, 0xfb, + 0xea, 0xa8, 0x00, 0x00, 0x00, +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_import_a1m2.proto b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_import_a1m2.proto new file mode 100644 index 0000000..5c53950 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_import_a1m2.proto @@ -0,0 +1,42 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2018 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto3"; + +package test; + +option go_package = "github.com/golang/protobuf/protoc-gen-go/testdata/imports"; + +import "imports/test_a_1/m2.proto"; + +message A1M2 { + test.a.M2 f = 1; +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_import_all.pb.go b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_import_all.pb.go new file mode 100644 index 0000000..f40e0b7 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_import_all.pb.go @@ -0,0 +1,138 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: imports/test_import_all.proto + +package imports // import "github.com/golang/protobuf/protoc-gen-go/testdata/imports" + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" +import fmt1 "github.com/golang/protobuf/protoc-gen-go/testdata/imports/fmt" +import test_a_1 "github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_1" +import test_a_2 "github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_a_2" +import test_b_1 "github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_b_1" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type All struct { + Am1 *test_a_1.M1 `protobuf:"bytes,1,opt,name=am1" json:"am1,omitempty"` + Am2 *test_a_1.M2 `protobuf:"bytes,2,opt,name=am2" json:"am2,omitempty"` + Am3 *test_a_2.M3 `protobuf:"bytes,3,opt,name=am3" json:"am3,omitempty"` + Am4 *test_a_2.M4 `protobuf:"bytes,4,opt,name=am4" json:"am4,omitempty"` + Bm1 *test_b_1.M1 `protobuf:"bytes,5,opt,name=bm1" json:"bm1,omitempty"` + Bm2 *test_b_1.M2 `protobuf:"bytes,6,opt,name=bm2" json:"bm2,omitempty"` + Fmt *fmt1.M `protobuf:"bytes,7,opt,name=fmt" json:"fmt,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *All) Reset() { *m = All{} } +func (m *All) String() string { return proto.CompactTextString(m) } +func (*All) ProtoMessage() {} +func (*All) Descriptor() ([]byte, []int) { + return fileDescriptor_test_import_all_b41dc4592e4a4f3b, []int{0} +} +func (m *All) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_All.Unmarshal(m, b) +} +func (m *All) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_All.Marshal(b, m, deterministic) +} +func (dst *All) XXX_Merge(src proto.Message) { + xxx_messageInfo_All.Merge(dst, src) +} +func (m *All) XXX_Size() int { + return xxx_messageInfo_All.Size(m) +} +func (m *All) XXX_DiscardUnknown() { + xxx_messageInfo_All.DiscardUnknown(m) +} + +var xxx_messageInfo_All proto.InternalMessageInfo + +func (m *All) GetAm1() *test_a_1.M1 { + if m != nil { + return m.Am1 + } + return nil +} + +func (m *All) GetAm2() *test_a_1.M2 { + if m != nil { + return m.Am2 + } + return nil +} + +func (m *All) GetAm3() *test_a_2.M3 { + if m != nil { + return m.Am3 + } + return nil +} + +func (m *All) GetAm4() *test_a_2.M4 { + if m != nil { + return m.Am4 + } + return nil +} + +func (m *All) GetBm1() *test_b_1.M1 { + if m != nil { + return m.Bm1 + } + return nil +} + +func (m *All) GetBm2() *test_b_1.M2 { + if m != nil { + return m.Bm2 + } + return nil +} + +func (m *All) GetFmt() *fmt1.M { + if m != nil { + return m.Fmt + } + return nil +} + +func init() { + proto.RegisterType((*All)(nil), "test.All") +} + +func init() { + proto.RegisterFile("imports/test_import_all.proto", fileDescriptor_test_import_all_b41dc4592e4a4f3b) +} + +var fileDescriptor_test_import_all_b41dc4592e4a4f3b = []byte{ + // 258 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0xd0, 0xb1, 0x4e, 0xc3, 0x30, + 0x10, 0x06, 0x60, 0x15, 0x97, 0x20, 0x99, 0x05, 0x85, 0xc5, 0x20, 0x90, 0x50, 0x27, 0x96, 0xda, + 0xb2, 0x9d, 0x05, 0x31, 0xc1, 0xde, 0xa5, 0x23, 0x4b, 0x64, 0x97, 0xc6, 0x54, 0xf2, 0xd5, 0x51, + 0x7a, 0x7d, 0x5e, 0x5e, 0x05, 0xd9, 0x07, 0x12, 0x84, 0x66, 0x4b, 0xfe, 0xef, 0xb7, 0xce, 0x3e, + 0x7e, 0xbf, 0x83, 0x3e, 0x0d, 0x78, 0x50, 0xb8, 0x3d, 0x60, 0x4b, 0x3f, 0xad, 0x8b, 0x51, 0xf6, + 0x43, 0xc2, 0x54, 0xcf, 0x73, 0x7c, 0x7b, 0xf3, 0xa7, 0xe4, 0x5a, 0xad, 0x40, 0x53, 0xe1, 0x14, + 0x99, 0x09, 0x32, 0x0a, 0xec, 0x34, 0x35, 0x27, 0xc9, 0x4f, 0xcf, 0xf2, 0xbf, 0x67, 0x5d, 0xff, + 0x50, 0x07, 0xa8, 0x80, 0xc2, 0xc5, 0xe7, 0x8c, 0xb3, 0x97, 0x18, 0xeb, 0x3b, 0xce, 0x1c, 0x68, + 0x31, 0x7b, 0x98, 0x3d, 0x5e, 0x1a, 0x2e, 0xf3, 0x69, 0xe9, 0xe4, 0x4a, 0xaf, 0x73, 0x4c, 0x6a, + 0xc4, 0xd9, 0x48, 0x4d, 0x56, 0x43, 0x6a, 0x05, 0x1b, 0xa9, 0xcd, 0x6a, 0x49, 0x1b, 0x31, 0x1f, + 0x69, 0x93, 0xb5, 0xa9, 0x17, 0x9c, 0x79, 0xd0, 0xe2, 0xbc, 0xe8, 0x15, 0xa9, 0x97, 0xbd, 0x1b, + 0x50, 0x97, 0xe9, 0x1e, 0x34, 0x75, 0x8c, 0xa8, 0xfe, 0x77, 0x4c, 0xb9, 0x83, 0x07, 0x53, 0x0b, + 0xce, 0x3a, 0x40, 0x71, 0x51, 0x3a, 0x95, 0xec, 0x00, 0xe5, 0x6a, 0x9d, 0xa3, 0xd7, 0xe7, 0xb7, + 0xa7, 0xb0, 0xc3, 0x8f, 0xa3, 0x97, 0x9b, 0x04, 0x2a, 0xa4, 0xe8, 0xf6, 0x41, 0x95, 0xc7, 0xfb, + 0x63, 0x47, 0x1f, 0x9b, 0x65, 0xd8, 0xee, 0x97, 0x21, 0x95, 0xa5, 0xbd, 0x3b, 0x74, 0xea, 0x7b, + 0x55, 0xbe, 0x2a, 0x6e, 0xbf, 0x02, 0x00, 0x00, 0xff, 0xff, 0x95, 0x39, 0xa3, 0x82, 0x03, 0x02, + 0x00, 0x00, +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_import_all.proto b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_import_all.proto new file mode 100644 index 0000000..582d722 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imports/test_import_all.proto @@ -0,0 +1,58 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2018 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto3"; + +package test; + +option go_package = "github.com/golang/protobuf/protoc-gen-go/testdata/imports"; + +// test_a_1/m*.proto are in the same Go package and proto package. +// test_a_*/*.proto are in different Go packages, but the same proto package. +// test_b_1/*.proto are in the same Go package, but different proto packages. +// fmt/m.proto has a package name which conflicts with "fmt". +import "imports/test_a_1/m1.proto"; +import "imports/test_a_1/m2.proto"; +import "imports/test_a_2/m3.proto"; +import "imports/test_a_2/m4.proto"; +import "imports/test_b_1/m1.proto"; +import "imports/test_b_1/m2.proto"; +import "imports/fmt/m.proto"; + +message All { + test.a.M1 am1 = 1; + test.a.M2 am2 = 2; + test.a.M3 am3 = 3; + test.a.M4 am4 = 4; + test.b.part1.M1 bm1 = 5; + test.b.part2.M2 bm2 = 6; + fmt.M fmt = 7; +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/main_test.go b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/main_test.go new file mode 100644 index 0000000..7ec1f2d --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/main_test.go @@ -0,0 +1,48 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +// A simple binary to link together the protocol buffers in this test. + +package testdata + +import ( + "testing" + + importspb "github.com/golang/protobuf/protoc-gen-go/testdata/imports" + multipb "github.com/golang/protobuf/protoc-gen-go/testdata/multi" + mytestpb "github.com/golang/protobuf/protoc-gen-go/testdata/my_test" +) + +func TestLink(t *testing.T) { + _ = &multipb.Multi1{} + _ = &mytestpb.Request{} + _ = &importspb.All{} +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi1.pb.go b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi1.pb.go new file mode 100644 index 0000000..da0fdf8 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi1.pb.go @@ -0,0 +1,96 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: multi/multi1.proto + +package multitest // import "github.com/golang/protobuf/protoc-gen-go/testdata/multi" + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type Multi1 struct { + Multi2 *Multi2 `protobuf:"bytes,1,req,name=multi2" json:"multi2,omitempty"` + Color *Multi2_Color `protobuf:"varint,2,opt,name=color,enum=multitest.Multi2_Color" json:"color,omitempty"` + HatType *Multi3_HatType `protobuf:"varint,3,opt,name=hat_type,json=hatType,enum=multitest.Multi3_HatType" json:"hat_type,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Multi1) Reset() { *m = Multi1{} } +func (m *Multi1) String() string { return proto.CompactTextString(m) } +func (*Multi1) ProtoMessage() {} +func (*Multi1) Descriptor() ([]byte, []int) { + return fileDescriptor_multi1_08e50c6822e808b8, []int{0} +} +func (m *Multi1) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Multi1.Unmarshal(m, b) +} +func (m *Multi1) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Multi1.Marshal(b, m, deterministic) +} +func (dst *Multi1) XXX_Merge(src proto.Message) { + xxx_messageInfo_Multi1.Merge(dst, src) +} +func (m *Multi1) XXX_Size() int { + return xxx_messageInfo_Multi1.Size(m) +} +func (m *Multi1) XXX_DiscardUnknown() { + xxx_messageInfo_Multi1.DiscardUnknown(m) +} + +var xxx_messageInfo_Multi1 proto.InternalMessageInfo + +func (m *Multi1) GetMulti2() *Multi2 { + if m != nil { + return m.Multi2 + } + return nil +} + +func (m *Multi1) GetColor() Multi2_Color { + if m != nil && m.Color != nil { + return *m.Color + } + return Multi2_BLUE +} + +func (m *Multi1) GetHatType() Multi3_HatType { + if m != nil && m.HatType != nil { + return *m.HatType + } + return Multi3_FEDORA +} + +func init() { + proto.RegisterType((*Multi1)(nil), "multitest.Multi1") +} + +func init() { proto.RegisterFile("multi/multi1.proto", fileDescriptor_multi1_08e50c6822e808b8) } + +var fileDescriptor_multi1_08e50c6822e808b8 = []byte{ + // 200 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0xca, 0x2d, 0xcd, 0x29, + 0xc9, 0xd4, 0x07, 0x93, 0x86, 0x7a, 0x05, 0x45, 0xf9, 0x25, 0xf9, 0x42, 0x9c, 0x60, 0x5e, 0x49, + 0x6a, 0x71, 0x89, 0x14, 0xb2, 0xb4, 0x11, 0x44, 0x1a, 0x45, 0xcc, 0x18, 0x22, 0xa6, 0x34, 0x83, + 0x91, 0x8b, 0xcd, 0x17, 0x6c, 0x86, 0x90, 0x26, 0x17, 0x1b, 0x44, 0xb9, 0x04, 0xa3, 0x02, 0x93, + 0x06, 0xb7, 0x91, 0xa0, 0x1e, 0xdc, 0x38, 0x3d, 0xb0, 0x12, 0xa3, 0x20, 0xa8, 0x02, 0x21, 0x5d, + 0x2e, 0xd6, 0xe4, 0xfc, 0x9c, 0xfc, 0x22, 0x09, 0x26, 0x05, 0x46, 0x0d, 0x3e, 0x23, 0x71, 0x0c, + 0x95, 0x7a, 0xce, 0x20, 0xe9, 0x20, 0x88, 0x2a, 0x21, 0x13, 0x2e, 0x8e, 0x8c, 0xc4, 0x92, 0xf8, + 0x92, 0xca, 0x82, 0x54, 0x09, 0x66, 0xb0, 0x0e, 0x49, 0x74, 0x1d, 0xc6, 0x7a, 0x1e, 0x89, 0x25, + 0x21, 0x95, 0x05, 0xa9, 0x41, 0xec, 0x19, 0x10, 0x86, 0x93, 0x73, 0x94, 0x63, 0x7a, 0x66, 0x49, + 0x46, 0x69, 0x92, 0x5e, 0x72, 0x7e, 0xae, 0x7e, 0x7a, 0x7e, 0x4e, 0x62, 0x5e, 0xba, 0x3e, 0xd8, + 0xd5, 0x49, 0xa5, 0x69, 0x10, 0x46, 0xb2, 0x6e, 0x7a, 0x6a, 0x9e, 0x6e, 0x7a, 0xbe, 0x3e, 0xc8, + 0xa0, 0x94, 0xc4, 0x92, 0x44, 0x88, 0xe7, 0xac, 0xe1, 0x86, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, + 0x60, 0x7d, 0xfc, 0x9f, 0x27, 0x01, 0x00, 0x00, +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi1.proto b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi1.proto new file mode 100644 index 0000000..d3a3204 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi1.proto @@ -0,0 +1,46 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto2"; + +import "multi/multi2.proto"; +import "multi/multi3.proto"; + +package multitest; + +option go_package = "github.com/golang/protobuf/protoc-gen-go/testdata/multi;multitest"; + +message Multi1 { + required Multi2 multi2 = 1; + optional Multi2.Color color = 2; + optional Multi3.HatType hat_type = 3; +} + diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi2.pb.go b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi2.pb.go new file mode 100644 index 0000000..b66ce79 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi2.pb.go @@ -0,0 +1,128 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: multi/multi2.proto + +package multitest // import "github.com/golang/protobuf/protoc-gen-go/testdata/multi" + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type Multi2_Color int32 + +const ( + Multi2_BLUE Multi2_Color = 1 + Multi2_GREEN Multi2_Color = 2 + Multi2_RED Multi2_Color = 3 +) + +var Multi2_Color_name = map[int32]string{ + 1: "BLUE", + 2: "GREEN", + 3: "RED", +} +var Multi2_Color_value = map[string]int32{ + "BLUE": 1, + "GREEN": 2, + "RED": 3, +} + +func (x Multi2_Color) Enum() *Multi2_Color { + p := new(Multi2_Color) + *p = x + return p +} +func (x Multi2_Color) String() string { + return proto.EnumName(Multi2_Color_name, int32(x)) +} +func (x *Multi2_Color) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Multi2_Color_value, data, "Multi2_Color") + if err != nil { + return err + } + *x = Multi2_Color(value) + return nil +} +func (Multi2_Color) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_multi2_c47490ad66d93e67, []int{0, 0} +} + +type Multi2 struct { + RequiredValue *int32 `protobuf:"varint,1,req,name=required_value,json=requiredValue" json:"required_value,omitempty"` + Color *Multi2_Color `protobuf:"varint,2,opt,name=color,enum=multitest.Multi2_Color" json:"color,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Multi2) Reset() { *m = Multi2{} } +func (m *Multi2) String() string { return proto.CompactTextString(m) } +func (*Multi2) ProtoMessage() {} +func (*Multi2) Descriptor() ([]byte, []int) { + return fileDescriptor_multi2_c47490ad66d93e67, []int{0} +} +func (m *Multi2) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Multi2.Unmarshal(m, b) +} +func (m *Multi2) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Multi2.Marshal(b, m, deterministic) +} +func (dst *Multi2) XXX_Merge(src proto.Message) { + xxx_messageInfo_Multi2.Merge(dst, src) +} +func (m *Multi2) XXX_Size() int { + return xxx_messageInfo_Multi2.Size(m) +} +func (m *Multi2) XXX_DiscardUnknown() { + xxx_messageInfo_Multi2.DiscardUnknown(m) +} + +var xxx_messageInfo_Multi2 proto.InternalMessageInfo + +func (m *Multi2) GetRequiredValue() int32 { + if m != nil && m.RequiredValue != nil { + return *m.RequiredValue + } + return 0 +} + +func (m *Multi2) GetColor() Multi2_Color { + if m != nil && m.Color != nil { + return *m.Color + } + return Multi2_BLUE +} + +func init() { + proto.RegisterType((*Multi2)(nil), "multitest.Multi2") + proto.RegisterEnum("multitest.Multi2_Color", Multi2_Color_name, Multi2_Color_value) +} + +func init() { proto.RegisterFile("multi/multi2.proto", fileDescriptor_multi2_c47490ad66d93e67) } + +var fileDescriptor_multi2_c47490ad66d93e67 = []byte{ + // 202 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0xca, 0x2d, 0xcd, 0x29, + 0xc9, 0xd4, 0x07, 0x93, 0x46, 0x7a, 0x05, 0x45, 0xf9, 0x25, 0xf9, 0x42, 0x9c, 0x60, 0x5e, 0x49, + 0x6a, 0x71, 0x89, 0x52, 0x2b, 0x23, 0x17, 0x9b, 0x2f, 0x58, 0x4e, 0x48, 0x95, 0x8b, 0xaf, 0x28, + 0xb5, 0xb0, 0x34, 0xb3, 0x28, 0x35, 0x25, 0xbe, 0x2c, 0x31, 0xa7, 0x34, 0x55, 0x82, 0x51, 0x81, + 0x49, 0x83, 0x35, 0x88, 0x17, 0x26, 0x1a, 0x06, 0x12, 0x14, 0xd2, 0xe5, 0x62, 0x4d, 0xce, 0xcf, + 0xc9, 0x2f, 0x92, 0x60, 0x52, 0x60, 0xd4, 0xe0, 0x33, 0x12, 0xd7, 0x83, 0x1b, 0xa6, 0x07, 0x31, + 0x48, 0xcf, 0x19, 0x24, 0x1d, 0x04, 0x51, 0xa5, 0xa4, 0xca, 0xc5, 0x0a, 0xe6, 0x0b, 0x71, 0x70, + 0xb1, 0x38, 0xf9, 0x84, 0xba, 0x0a, 0x30, 0x0a, 0x71, 0x72, 0xb1, 0xba, 0x07, 0xb9, 0xba, 0xfa, + 0x09, 0x30, 0x09, 0xb1, 0x73, 0x31, 0x07, 0xb9, 0xba, 0x08, 0x30, 0x3b, 0x39, 0x47, 0x39, 0xa6, + 0x67, 0x96, 0x64, 0x94, 0x26, 0xe9, 0x25, 0xe7, 0xe7, 0xea, 0xa7, 0xe7, 0xe7, 0x24, 0xe6, 0xa5, + 0xeb, 0x83, 0x5d, 0x9b, 0x54, 0x9a, 0x06, 0x61, 0x24, 0xeb, 0xa6, 0xa7, 0xe6, 0xe9, 0xa6, 0xe7, + 0xeb, 0x83, 0xec, 0x4a, 0x49, 0x2c, 0x49, 0x84, 0x78, 0xca, 0x1a, 0x6e, 0x3f, 0x20, 0x00, 0x00, + 0xff, 0xff, 0x49, 0x3b, 0x52, 0x44, 0xec, 0x00, 0x00, 0x00, +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi2.proto b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi2.proto new file mode 100644 index 0000000..ec5b431 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi2.proto @@ -0,0 +1,48 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto2"; + +package multitest; + +option go_package = "github.com/golang/protobuf/protoc-gen-go/testdata/multi;multitest"; + +message Multi2 { + required int32 required_value = 1; + + enum Color { + BLUE = 1; + GREEN = 2; + RED = 3; + }; + optional Color color = 2; +} + diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi3.pb.go b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi3.pb.go new file mode 100644 index 0000000..f03c350 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi3.pb.go @@ -0,0 +1,115 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: multi/multi3.proto + +package multitest // import "github.com/golang/protobuf/protoc-gen-go/testdata/multi" + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type Multi3_HatType int32 + +const ( + Multi3_FEDORA Multi3_HatType = 1 + Multi3_FEZ Multi3_HatType = 2 +) + +var Multi3_HatType_name = map[int32]string{ + 1: "FEDORA", + 2: "FEZ", +} +var Multi3_HatType_value = map[string]int32{ + "FEDORA": 1, + "FEZ": 2, +} + +func (x Multi3_HatType) Enum() *Multi3_HatType { + p := new(Multi3_HatType) + *p = x + return p +} +func (x Multi3_HatType) String() string { + return proto.EnumName(Multi3_HatType_name, int32(x)) +} +func (x *Multi3_HatType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Multi3_HatType_value, data, "Multi3_HatType") + if err != nil { + return err + } + *x = Multi3_HatType(value) + return nil +} +func (Multi3_HatType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_multi3_d55a72b4628b7875, []int{0, 0} +} + +type Multi3 struct { + HatType *Multi3_HatType `protobuf:"varint,1,opt,name=hat_type,json=hatType,enum=multitest.Multi3_HatType" json:"hat_type,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Multi3) Reset() { *m = Multi3{} } +func (m *Multi3) String() string { return proto.CompactTextString(m) } +func (*Multi3) ProtoMessage() {} +func (*Multi3) Descriptor() ([]byte, []int) { + return fileDescriptor_multi3_d55a72b4628b7875, []int{0} +} +func (m *Multi3) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Multi3.Unmarshal(m, b) +} +func (m *Multi3) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Multi3.Marshal(b, m, deterministic) +} +func (dst *Multi3) XXX_Merge(src proto.Message) { + xxx_messageInfo_Multi3.Merge(dst, src) +} +func (m *Multi3) XXX_Size() int { + return xxx_messageInfo_Multi3.Size(m) +} +func (m *Multi3) XXX_DiscardUnknown() { + xxx_messageInfo_Multi3.DiscardUnknown(m) +} + +var xxx_messageInfo_Multi3 proto.InternalMessageInfo + +func (m *Multi3) GetHatType() Multi3_HatType { + if m != nil && m.HatType != nil { + return *m.HatType + } + return Multi3_FEDORA +} + +func init() { + proto.RegisterType((*Multi3)(nil), "multitest.Multi3") + proto.RegisterEnum("multitest.Multi3_HatType", Multi3_HatType_name, Multi3_HatType_value) +} + +func init() { proto.RegisterFile("multi/multi3.proto", fileDescriptor_multi3_d55a72b4628b7875) } + +var fileDescriptor_multi3_d55a72b4628b7875 = []byte{ + // 170 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0xca, 0x2d, 0xcd, 0x29, + 0xc9, 0xd4, 0x07, 0x93, 0xc6, 0x7a, 0x05, 0x45, 0xf9, 0x25, 0xf9, 0x42, 0x9c, 0x60, 0x5e, 0x49, + 0x6a, 0x71, 0x89, 0x52, 0x1c, 0x17, 0x9b, 0x2f, 0x58, 0x4a, 0xc8, 0x84, 0x8b, 0x23, 0x23, 0xb1, + 0x24, 0xbe, 0xa4, 0xb2, 0x20, 0x55, 0x82, 0x51, 0x81, 0x51, 0x83, 0xcf, 0x48, 0x52, 0x0f, 0xae, + 0x4e, 0x0f, 0xa2, 0x48, 0xcf, 0x23, 0xb1, 0x24, 0xa4, 0xb2, 0x20, 0x35, 0x88, 0x3d, 0x03, 0xc2, + 0x50, 0x92, 0xe3, 0x62, 0x87, 0x8a, 0x09, 0x71, 0x71, 0xb1, 0xb9, 0xb9, 0xba, 0xf8, 0x07, 0x39, + 0x0a, 0x30, 0x0a, 0xb1, 0x73, 0x31, 0xbb, 0xb9, 0x46, 0x09, 0x30, 0x39, 0x39, 0x47, 0x39, 0xa6, + 0x67, 0x96, 0x64, 0x94, 0x26, 0xe9, 0x25, 0xe7, 0xe7, 0xea, 0xa7, 0xe7, 0xe7, 0x24, 0xe6, 0xa5, + 0xeb, 0x83, 0x5d, 0x91, 0x54, 0x9a, 0x06, 0x61, 0x24, 0xeb, 0xa6, 0xa7, 0xe6, 0xe9, 0xa6, 0xe7, + 0xeb, 0x83, 0x2c, 0x4a, 0x49, 0x2c, 0x49, 0x84, 0x38, 0xd6, 0x1a, 0x6e, 0x39, 0x20, 0x00, 0x00, + 0xff, 0xff, 0xd5, 0xa4, 0x1a, 0x0e, 0xc4, 0x00, 0x00, 0x00, +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi3.proto b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi3.proto new file mode 100644 index 0000000..8690b88 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi3.proto @@ -0,0 +1,45 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto2"; + +package multitest; + +option go_package = "github.com/golang/protobuf/protoc-gen-go/testdata/multi;multitest"; + +message Multi3 { + enum HatType { + FEDORA = 1; + FEZ = 2; + }; + optional HatType hat_type = 1; +} + diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/my_test/test.pb.go b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/my_test/test.pb.go new file mode 100644 index 0000000..8cf6a69 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/my_test/test.pb.go @@ -0,0 +1,1174 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: my_test/test.proto + +package test // import "github.com/golang/protobuf/protoc-gen-go/testdata/my_test" + +/* +This package holds interesting messages. +*/ + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" +import _ "github.com/golang/protobuf/protoc-gen-go/testdata/multi" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type HatType int32 + +const ( + // deliberately skipping 0 + HatType_FEDORA HatType = 1 + HatType_FEZ HatType = 2 +) + +var HatType_name = map[int32]string{ + 1: "FEDORA", + 2: "FEZ", +} +var HatType_value = map[string]int32{ + "FEDORA": 1, + "FEZ": 2, +} + +func (x HatType) Enum() *HatType { + p := new(HatType) + *p = x + return p +} +func (x HatType) String() string { + return proto.EnumName(HatType_name, int32(x)) +} +func (x *HatType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(HatType_value, data, "HatType") + if err != nil { + return err + } + *x = HatType(value) + return nil +} +func (HatType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_test_2309d445eee26af7, []int{0} +} + +// This enum represents days of the week. +type Days int32 + +const ( + Days_MONDAY Days = 1 + Days_TUESDAY Days = 2 + Days_LUNDI Days = 1 +) + +var Days_name = map[int32]string{ + 1: "MONDAY", + 2: "TUESDAY", + // Duplicate value: 1: "LUNDI", +} +var Days_value = map[string]int32{ + "MONDAY": 1, + "TUESDAY": 2, + "LUNDI": 1, +} + +func (x Days) Enum() *Days { + p := new(Days) + *p = x + return p +} +func (x Days) String() string { + return proto.EnumName(Days_name, int32(x)) +} +func (x *Days) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Days_value, data, "Days") + if err != nil { + return err + } + *x = Days(value) + return nil +} +func (Days) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_test_2309d445eee26af7, []int{1} +} + +type Request_Color int32 + +const ( + Request_RED Request_Color = 0 + Request_GREEN Request_Color = 1 + Request_BLUE Request_Color = 2 +) + +var Request_Color_name = map[int32]string{ + 0: "RED", + 1: "GREEN", + 2: "BLUE", +} +var Request_Color_value = map[string]int32{ + "RED": 0, + "GREEN": 1, + "BLUE": 2, +} + +func (x Request_Color) Enum() *Request_Color { + p := new(Request_Color) + *p = x + return p +} +func (x Request_Color) String() string { + return proto.EnumName(Request_Color_name, int32(x)) +} +func (x *Request_Color) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Request_Color_value, data, "Request_Color") + if err != nil { + return err + } + *x = Request_Color(value) + return nil +} +func (Request_Color) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_test_2309d445eee26af7, []int{0, 0} +} + +type Reply_Entry_Game int32 + +const ( + Reply_Entry_FOOTBALL Reply_Entry_Game = 1 + Reply_Entry_TENNIS Reply_Entry_Game = 2 +) + +var Reply_Entry_Game_name = map[int32]string{ + 1: "FOOTBALL", + 2: "TENNIS", +} +var Reply_Entry_Game_value = map[string]int32{ + "FOOTBALL": 1, + "TENNIS": 2, +} + +func (x Reply_Entry_Game) Enum() *Reply_Entry_Game { + p := new(Reply_Entry_Game) + *p = x + return p +} +func (x Reply_Entry_Game) String() string { + return proto.EnumName(Reply_Entry_Game_name, int32(x)) +} +func (x *Reply_Entry_Game) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Reply_Entry_Game_value, data, "Reply_Entry_Game") + if err != nil { + return err + } + *x = Reply_Entry_Game(value) + return nil +} +func (Reply_Entry_Game) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_test_2309d445eee26af7, []int{1, 0, 0} +} + +// This is a message that might be sent somewhere. +type Request struct { + Key []int64 `protobuf:"varint,1,rep,name=key" json:"key,omitempty"` + // optional imp.ImportedMessage imported_message = 2; + Hue *Request_Color `protobuf:"varint,3,opt,name=hue,enum=my.test.Request_Color" json:"hue,omitempty"` + Hat *HatType `protobuf:"varint,4,opt,name=hat,enum=my.test.HatType,def=1" json:"hat,omitempty"` + // optional imp.ImportedMessage.Owner owner = 6; + Deadline *float32 `protobuf:"fixed32,7,opt,name=deadline,def=inf" json:"deadline,omitempty"` + Somegroup *Request_SomeGroup `protobuf:"group,8,opt,name=SomeGroup,json=somegroup" json:"somegroup,omitempty"` + // This is a map field. It will generate map[int32]string. + NameMapping map[int32]string `protobuf:"bytes,14,rep,name=name_mapping,json=nameMapping" json:"name_mapping,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // This is a map field whose value type is a message. + MsgMapping map[int64]*Reply `protobuf:"bytes,15,rep,name=msg_mapping,json=msgMapping" json:"msg_mapping,omitempty" protobuf_key:"zigzag64,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + Reset_ *int32 `protobuf:"varint,12,opt,name=reset" json:"reset,omitempty"` + // This field should not conflict with any getters. + GetKey_ *string `protobuf:"bytes,16,opt,name=get_key,json=getKey" json:"get_key,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Request) Reset() { *m = Request{} } +func (m *Request) String() string { return proto.CompactTextString(m) } +func (*Request) ProtoMessage() {} +func (*Request) Descriptor() ([]byte, []int) { + return fileDescriptor_test_2309d445eee26af7, []int{0} +} +func (m *Request) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Request.Unmarshal(m, b) +} +func (m *Request) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Request.Marshal(b, m, deterministic) +} +func (dst *Request) XXX_Merge(src proto.Message) { + xxx_messageInfo_Request.Merge(dst, src) +} +func (m *Request) XXX_Size() int { + return xxx_messageInfo_Request.Size(m) +} +func (m *Request) XXX_DiscardUnknown() { + xxx_messageInfo_Request.DiscardUnknown(m) +} + +var xxx_messageInfo_Request proto.InternalMessageInfo + +const Default_Request_Hat HatType = HatType_FEDORA + +var Default_Request_Deadline float32 = float32(math.Inf(1)) + +func (m *Request) GetKey() []int64 { + if m != nil { + return m.Key + } + return nil +} + +func (m *Request) GetHue() Request_Color { + if m != nil && m.Hue != nil { + return *m.Hue + } + return Request_RED +} + +func (m *Request) GetHat() HatType { + if m != nil && m.Hat != nil { + return *m.Hat + } + return Default_Request_Hat +} + +func (m *Request) GetDeadline() float32 { + if m != nil && m.Deadline != nil { + return *m.Deadline + } + return Default_Request_Deadline +} + +func (m *Request) GetSomegroup() *Request_SomeGroup { + if m != nil { + return m.Somegroup + } + return nil +} + +func (m *Request) GetNameMapping() map[int32]string { + if m != nil { + return m.NameMapping + } + return nil +} + +func (m *Request) GetMsgMapping() map[int64]*Reply { + if m != nil { + return m.MsgMapping + } + return nil +} + +func (m *Request) GetReset_() int32 { + if m != nil && m.Reset_ != nil { + return *m.Reset_ + } + return 0 +} + +func (m *Request) GetGetKey_() string { + if m != nil && m.GetKey_ != nil { + return *m.GetKey_ + } + return "" +} + +type Request_SomeGroup struct { + GroupField *int32 `protobuf:"varint,9,opt,name=group_field,json=groupField" json:"group_field,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Request_SomeGroup) Reset() { *m = Request_SomeGroup{} } +func (m *Request_SomeGroup) String() string { return proto.CompactTextString(m) } +func (*Request_SomeGroup) ProtoMessage() {} +func (*Request_SomeGroup) Descriptor() ([]byte, []int) { + return fileDescriptor_test_2309d445eee26af7, []int{0, 0} +} +func (m *Request_SomeGroup) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Request_SomeGroup.Unmarshal(m, b) +} +func (m *Request_SomeGroup) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Request_SomeGroup.Marshal(b, m, deterministic) +} +func (dst *Request_SomeGroup) XXX_Merge(src proto.Message) { + xxx_messageInfo_Request_SomeGroup.Merge(dst, src) +} +func (m *Request_SomeGroup) XXX_Size() int { + return xxx_messageInfo_Request_SomeGroup.Size(m) +} +func (m *Request_SomeGroup) XXX_DiscardUnknown() { + xxx_messageInfo_Request_SomeGroup.DiscardUnknown(m) +} + +var xxx_messageInfo_Request_SomeGroup proto.InternalMessageInfo + +func (m *Request_SomeGroup) GetGroupField() int32 { + if m != nil && m.GroupField != nil { + return *m.GroupField + } + return 0 +} + +type Reply struct { + Found []*Reply_Entry `protobuf:"bytes,1,rep,name=found" json:"found,omitempty"` + CompactKeys []int32 `protobuf:"varint,2,rep,packed,name=compact_keys,json=compactKeys" json:"compact_keys,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Reply) Reset() { *m = Reply{} } +func (m *Reply) String() string { return proto.CompactTextString(m) } +func (*Reply) ProtoMessage() {} +func (*Reply) Descriptor() ([]byte, []int) { + return fileDescriptor_test_2309d445eee26af7, []int{1} +} + +var extRange_Reply = []proto.ExtensionRange{ + {Start: 100, End: 536870911}, +} + +func (*Reply) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_Reply +} +func (m *Reply) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Reply.Unmarshal(m, b) +} +func (m *Reply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Reply.Marshal(b, m, deterministic) +} +func (dst *Reply) XXX_Merge(src proto.Message) { + xxx_messageInfo_Reply.Merge(dst, src) +} +func (m *Reply) XXX_Size() int { + return xxx_messageInfo_Reply.Size(m) +} +func (m *Reply) XXX_DiscardUnknown() { + xxx_messageInfo_Reply.DiscardUnknown(m) +} + +var xxx_messageInfo_Reply proto.InternalMessageInfo + +func (m *Reply) GetFound() []*Reply_Entry { + if m != nil { + return m.Found + } + return nil +} + +func (m *Reply) GetCompactKeys() []int32 { + if m != nil { + return m.CompactKeys + } + return nil +} + +type Reply_Entry struct { + KeyThatNeeds_1234Camel_CasIng *int64 `protobuf:"varint,1,req,name=key_that_needs_1234camel_CasIng,json=keyThatNeeds1234camelCasIng" json:"key_that_needs_1234camel_CasIng,omitempty"` + Value *int64 `protobuf:"varint,2,opt,name=value,def=7" json:"value,omitempty"` + XMyFieldName_2 *int64 `protobuf:"varint,3,opt,name=_my_field_name_2,json=MyFieldName2" json:"_my_field_name_2,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Reply_Entry) Reset() { *m = Reply_Entry{} } +func (m *Reply_Entry) String() string { return proto.CompactTextString(m) } +func (*Reply_Entry) ProtoMessage() {} +func (*Reply_Entry) Descriptor() ([]byte, []int) { + return fileDescriptor_test_2309d445eee26af7, []int{1, 0} +} +func (m *Reply_Entry) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Reply_Entry.Unmarshal(m, b) +} +func (m *Reply_Entry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Reply_Entry.Marshal(b, m, deterministic) +} +func (dst *Reply_Entry) XXX_Merge(src proto.Message) { + xxx_messageInfo_Reply_Entry.Merge(dst, src) +} +func (m *Reply_Entry) XXX_Size() int { + return xxx_messageInfo_Reply_Entry.Size(m) +} +func (m *Reply_Entry) XXX_DiscardUnknown() { + xxx_messageInfo_Reply_Entry.DiscardUnknown(m) +} + +var xxx_messageInfo_Reply_Entry proto.InternalMessageInfo + +const Default_Reply_Entry_Value int64 = 7 + +func (m *Reply_Entry) GetKeyThatNeeds_1234Camel_CasIng() int64 { + if m != nil && m.KeyThatNeeds_1234Camel_CasIng != nil { + return *m.KeyThatNeeds_1234Camel_CasIng + } + return 0 +} + +func (m *Reply_Entry) GetValue() int64 { + if m != nil && m.Value != nil { + return *m.Value + } + return Default_Reply_Entry_Value +} + +func (m *Reply_Entry) GetXMyFieldName_2() int64 { + if m != nil && m.XMyFieldName_2 != nil { + return *m.XMyFieldName_2 + } + return 0 +} + +type OtherBase struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *OtherBase) Reset() { *m = OtherBase{} } +func (m *OtherBase) String() string { return proto.CompactTextString(m) } +func (*OtherBase) ProtoMessage() {} +func (*OtherBase) Descriptor() ([]byte, []int) { + return fileDescriptor_test_2309d445eee26af7, []int{2} +} + +var extRange_OtherBase = []proto.ExtensionRange{ + {Start: 100, End: 536870911}, +} + +func (*OtherBase) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_OtherBase +} +func (m *OtherBase) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_OtherBase.Unmarshal(m, b) +} +func (m *OtherBase) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_OtherBase.Marshal(b, m, deterministic) +} +func (dst *OtherBase) XXX_Merge(src proto.Message) { + xxx_messageInfo_OtherBase.Merge(dst, src) +} +func (m *OtherBase) XXX_Size() int { + return xxx_messageInfo_OtherBase.Size(m) +} +func (m *OtherBase) XXX_DiscardUnknown() { + xxx_messageInfo_OtherBase.DiscardUnknown(m) +} + +var xxx_messageInfo_OtherBase proto.InternalMessageInfo + +func (m *OtherBase) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +type ReplyExtensions struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ReplyExtensions) Reset() { *m = ReplyExtensions{} } +func (m *ReplyExtensions) String() string { return proto.CompactTextString(m) } +func (*ReplyExtensions) ProtoMessage() {} +func (*ReplyExtensions) Descriptor() ([]byte, []int) { + return fileDescriptor_test_2309d445eee26af7, []int{3} +} +func (m *ReplyExtensions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ReplyExtensions.Unmarshal(m, b) +} +func (m *ReplyExtensions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ReplyExtensions.Marshal(b, m, deterministic) +} +func (dst *ReplyExtensions) XXX_Merge(src proto.Message) { + xxx_messageInfo_ReplyExtensions.Merge(dst, src) +} +func (m *ReplyExtensions) XXX_Size() int { + return xxx_messageInfo_ReplyExtensions.Size(m) +} +func (m *ReplyExtensions) XXX_DiscardUnknown() { + xxx_messageInfo_ReplyExtensions.DiscardUnknown(m) +} + +var xxx_messageInfo_ReplyExtensions proto.InternalMessageInfo + +var E_ReplyExtensions_Time = &proto.ExtensionDesc{ + ExtendedType: (*Reply)(nil), + ExtensionType: (*float64)(nil), + Field: 101, + Name: "my.test.ReplyExtensions.time", + Tag: "fixed64,101,opt,name=time", + Filename: "my_test/test.proto", +} + +var E_ReplyExtensions_Carrot = &proto.ExtensionDesc{ + ExtendedType: (*Reply)(nil), + ExtensionType: (*ReplyExtensions)(nil), + Field: 105, + Name: "my.test.ReplyExtensions.carrot", + Tag: "bytes,105,opt,name=carrot", + Filename: "my_test/test.proto", +} + +var E_ReplyExtensions_Donut = &proto.ExtensionDesc{ + ExtendedType: (*OtherBase)(nil), + ExtensionType: (*ReplyExtensions)(nil), + Field: 101, + Name: "my.test.ReplyExtensions.donut", + Tag: "bytes,101,opt,name=donut", + Filename: "my_test/test.proto", +} + +type OtherReplyExtensions struct { + Key *int32 `protobuf:"varint,1,opt,name=key" json:"key,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *OtherReplyExtensions) Reset() { *m = OtherReplyExtensions{} } +func (m *OtherReplyExtensions) String() string { return proto.CompactTextString(m) } +func (*OtherReplyExtensions) ProtoMessage() {} +func (*OtherReplyExtensions) Descriptor() ([]byte, []int) { + return fileDescriptor_test_2309d445eee26af7, []int{4} +} +func (m *OtherReplyExtensions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_OtherReplyExtensions.Unmarshal(m, b) +} +func (m *OtherReplyExtensions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_OtherReplyExtensions.Marshal(b, m, deterministic) +} +func (dst *OtherReplyExtensions) XXX_Merge(src proto.Message) { + xxx_messageInfo_OtherReplyExtensions.Merge(dst, src) +} +func (m *OtherReplyExtensions) XXX_Size() int { + return xxx_messageInfo_OtherReplyExtensions.Size(m) +} +func (m *OtherReplyExtensions) XXX_DiscardUnknown() { + xxx_messageInfo_OtherReplyExtensions.DiscardUnknown(m) +} + +var xxx_messageInfo_OtherReplyExtensions proto.InternalMessageInfo + +func (m *OtherReplyExtensions) GetKey() int32 { + if m != nil && m.Key != nil { + return *m.Key + } + return 0 +} + +type OldReply struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `protobuf_messageset:"1" json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *OldReply) Reset() { *m = OldReply{} } +func (m *OldReply) String() string { return proto.CompactTextString(m) } +func (*OldReply) ProtoMessage() {} +func (*OldReply) Descriptor() ([]byte, []int) { + return fileDescriptor_test_2309d445eee26af7, []int{5} +} + +func (m *OldReply) MarshalJSON() ([]byte, error) { + return proto.MarshalMessageSetJSON(&m.XXX_InternalExtensions) +} +func (m *OldReply) UnmarshalJSON(buf []byte) error { + return proto.UnmarshalMessageSetJSON(buf, &m.XXX_InternalExtensions) +} + +var extRange_OldReply = []proto.ExtensionRange{ + {Start: 100, End: 2147483646}, +} + +func (*OldReply) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_OldReply +} +func (m *OldReply) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_OldReply.Unmarshal(m, b) +} +func (m *OldReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_OldReply.Marshal(b, m, deterministic) +} +func (dst *OldReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_OldReply.Merge(dst, src) +} +func (m *OldReply) XXX_Size() int { + return xxx_messageInfo_OldReply.Size(m) +} +func (m *OldReply) XXX_DiscardUnknown() { + xxx_messageInfo_OldReply.DiscardUnknown(m) +} + +var xxx_messageInfo_OldReply proto.InternalMessageInfo + +type Communique struct { + MakeMeCry *bool `protobuf:"varint,1,opt,name=make_me_cry,json=makeMeCry" json:"make_me_cry,omitempty"` + // This is a oneof, called "union". + // + // Types that are valid to be assigned to Union: + // *Communique_Number + // *Communique_Name + // *Communique_Data + // *Communique_TempC + // *Communique_Height + // *Communique_Today + // *Communique_Maybe + // *Communique_Delta_ + // *Communique_Msg + // *Communique_Somegroup + Union isCommunique_Union `protobuf_oneof:"union"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Communique) Reset() { *m = Communique{} } +func (m *Communique) String() string { return proto.CompactTextString(m) } +func (*Communique) ProtoMessage() {} +func (*Communique) Descriptor() ([]byte, []int) { + return fileDescriptor_test_2309d445eee26af7, []int{6} +} +func (m *Communique) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Communique.Unmarshal(m, b) +} +func (m *Communique) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Communique.Marshal(b, m, deterministic) +} +func (dst *Communique) XXX_Merge(src proto.Message) { + xxx_messageInfo_Communique.Merge(dst, src) +} +func (m *Communique) XXX_Size() int { + return xxx_messageInfo_Communique.Size(m) +} +func (m *Communique) XXX_DiscardUnknown() { + xxx_messageInfo_Communique.DiscardUnknown(m) +} + +var xxx_messageInfo_Communique proto.InternalMessageInfo + +type isCommunique_Union interface { + isCommunique_Union() +} + +type Communique_Number struct { + Number int32 `protobuf:"varint,5,opt,name=number,oneof"` +} +type Communique_Name struct { + Name string `protobuf:"bytes,6,opt,name=name,oneof"` +} +type Communique_Data struct { + Data []byte `protobuf:"bytes,7,opt,name=data,oneof"` +} +type Communique_TempC struct { + TempC float64 `protobuf:"fixed64,8,opt,name=temp_c,json=tempC,oneof"` +} +type Communique_Height struct { + Height float32 `protobuf:"fixed32,9,opt,name=height,oneof"` +} +type Communique_Today struct { + Today Days `protobuf:"varint,10,opt,name=today,enum=my.test.Days,oneof"` +} +type Communique_Maybe struct { + Maybe bool `protobuf:"varint,11,opt,name=maybe,oneof"` +} +type Communique_Delta_ struct { + Delta int32 `protobuf:"zigzag32,12,opt,name=delta,oneof"` +} +type Communique_Msg struct { + Msg *Reply `protobuf:"bytes,16,opt,name=msg,oneof"` +} +type Communique_Somegroup struct { + Somegroup *Communique_SomeGroup `protobuf:"group,14,opt,name=SomeGroup,json=somegroup,oneof"` +} + +func (*Communique_Number) isCommunique_Union() {} +func (*Communique_Name) isCommunique_Union() {} +func (*Communique_Data) isCommunique_Union() {} +func (*Communique_TempC) isCommunique_Union() {} +func (*Communique_Height) isCommunique_Union() {} +func (*Communique_Today) isCommunique_Union() {} +func (*Communique_Maybe) isCommunique_Union() {} +func (*Communique_Delta_) isCommunique_Union() {} +func (*Communique_Msg) isCommunique_Union() {} +func (*Communique_Somegroup) isCommunique_Union() {} + +func (m *Communique) GetUnion() isCommunique_Union { + if m != nil { + return m.Union + } + return nil +} + +func (m *Communique) GetMakeMeCry() bool { + if m != nil && m.MakeMeCry != nil { + return *m.MakeMeCry + } + return false +} + +func (m *Communique) GetNumber() int32 { + if x, ok := m.GetUnion().(*Communique_Number); ok { + return x.Number + } + return 0 +} + +func (m *Communique) GetName() string { + if x, ok := m.GetUnion().(*Communique_Name); ok { + return x.Name + } + return "" +} + +func (m *Communique) GetData() []byte { + if x, ok := m.GetUnion().(*Communique_Data); ok { + return x.Data + } + return nil +} + +func (m *Communique) GetTempC() float64 { + if x, ok := m.GetUnion().(*Communique_TempC); ok { + return x.TempC + } + return 0 +} + +func (m *Communique) GetHeight() float32 { + if x, ok := m.GetUnion().(*Communique_Height); ok { + return x.Height + } + return 0 +} + +func (m *Communique) GetToday() Days { + if x, ok := m.GetUnion().(*Communique_Today); ok { + return x.Today + } + return Days_MONDAY +} + +func (m *Communique) GetMaybe() bool { + if x, ok := m.GetUnion().(*Communique_Maybe); ok { + return x.Maybe + } + return false +} + +func (m *Communique) GetDelta() int32 { + if x, ok := m.GetUnion().(*Communique_Delta_); ok { + return x.Delta + } + return 0 +} + +func (m *Communique) GetMsg() *Reply { + if x, ok := m.GetUnion().(*Communique_Msg); ok { + return x.Msg + } + return nil +} + +func (m *Communique) GetSomegroup() *Communique_SomeGroup { + if x, ok := m.GetUnion().(*Communique_Somegroup); ok { + return x.Somegroup + } + return nil +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*Communique) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _Communique_OneofMarshaler, _Communique_OneofUnmarshaler, _Communique_OneofSizer, []interface{}{ + (*Communique_Number)(nil), + (*Communique_Name)(nil), + (*Communique_Data)(nil), + (*Communique_TempC)(nil), + (*Communique_Height)(nil), + (*Communique_Today)(nil), + (*Communique_Maybe)(nil), + (*Communique_Delta_)(nil), + (*Communique_Msg)(nil), + (*Communique_Somegroup)(nil), + } +} + +func _Communique_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*Communique) + // union + switch x := m.Union.(type) { + case *Communique_Number: + b.EncodeVarint(5<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.Number)) + case *Communique_Name: + b.EncodeVarint(6<<3 | proto.WireBytes) + b.EncodeStringBytes(x.Name) + case *Communique_Data: + b.EncodeVarint(7<<3 | proto.WireBytes) + b.EncodeRawBytes(x.Data) + case *Communique_TempC: + b.EncodeVarint(8<<3 | proto.WireFixed64) + b.EncodeFixed64(math.Float64bits(x.TempC)) + case *Communique_Height: + b.EncodeVarint(9<<3 | proto.WireFixed32) + b.EncodeFixed32(uint64(math.Float32bits(x.Height))) + case *Communique_Today: + b.EncodeVarint(10<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.Today)) + case *Communique_Maybe: + t := uint64(0) + if x.Maybe { + t = 1 + } + b.EncodeVarint(11<<3 | proto.WireVarint) + b.EncodeVarint(t) + case *Communique_Delta_: + b.EncodeVarint(12<<3 | proto.WireVarint) + b.EncodeZigzag32(uint64(x.Delta)) + case *Communique_Msg: + b.EncodeVarint(16<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.Msg); err != nil { + return err + } + case *Communique_Somegroup: + b.EncodeVarint(14<<3 | proto.WireStartGroup) + if err := b.Marshal(x.Somegroup); err != nil { + return err + } + b.EncodeVarint(14<<3 | proto.WireEndGroup) + case nil: + default: + return fmt.Errorf("Communique.Union has unexpected type %T", x) + } + return nil +} + +func _Communique_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*Communique) + switch tag { + case 5: // union.number + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Communique_Number{int32(x)} + return true, err + case 6: // union.name + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeStringBytes() + m.Union = &Communique_Name{x} + return true, err + case 7: // union.data + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeRawBytes(true) + m.Union = &Communique_Data{x} + return true, err + case 8: // union.temp_c + if wire != proto.WireFixed64 { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeFixed64() + m.Union = &Communique_TempC{math.Float64frombits(x)} + return true, err + case 9: // union.height + if wire != proto.WireFixed32 { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeFixed32() + m.Union = &Communique_Height{math.Float32frombits(uint32(x))} + return true, err + case 10: // union.today + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Communique_Today{Days(x)} + return true, err + case 11: // union.maybe + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Communique_Maybe{x != 0} + return true, err + case 12: // union.delta + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeZigzag32() + m.Union = &Communique_Delta_{int32(x)} + return true, err + case 16: // union.msg + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(Reply) + err := b.DecodeMessage(msg) + m.Union = &Communique_Msg{msg} + return true, err + case 14: // union.somegroup + if wire != proto.WireStartGroup { + return true, proto.ErrInternalBadWireType + } + msg := new(Communique_SomeGroup) + err := b.DecodeGroup(msg) + m.Union = &Communique_Somegroup{msg} + return true, err + default: + return false, nil + } +} + +func _Communique_OneofSizer(msg proto.Message) (n int) { + m := msg.(*Communique) + // union + switch x := m.Union.(type) { + case *Communique_Number: + n += 1 // tag and wire + n += proto.SizeVarint(uint64(x.Number)) + case *Communique_Name: + n += 1 // tag and wire + n += proto.SizeVarint(uint64(len(x.Name))) + n += len(x.Name) + case *Communique_Data: + n += 1 // tag and wire + n += proto.SizeVarint(uint64(len(x.Data))) + n += len(x.Data) + case *Communique_TempC: + n += 1 // tag and wire + n += 8 + case *Communique_Height: + n += 1 // tag and wire + n += 4 + case *Communique_Today: + n += 1 // tag and wire + n += proto.SizeVarint(uint64(x.Today)) + case *Communique_Maybe: + n += 1 // tag and wire + n += 1 + case *Communique_Delta_: + n += 1 // tag and wire + n += proto.SizeVarint(uint64((uint32(x.Delta) << 1) ^ uint32((int32(x.Delta) >> 31)))) + case *Communique_Msg: + s := proto.Size(x.Msg) + n += 2 // tag and wire + n += proto.SizeVarint(uint64(s)) + n += s + case *Communique_Somegroup: + n += 1 // tag and wire + n += proto.Size(x.Somegroup) + n += 1 // tag and wire + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +type Communique_SomeGroup struct { + Member *string `protobuf:"bytes,15,opt,name=member" json:"member,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Communique_SomeGroup) Reset() { *m = Communique_SomeGroup{} } +func (m *Communique_SomeGroup) String() string { return proto.CompactTextString(m) } +func (*Communique_SomeGroup) ProtoMessage() {} +func (*Communique_SomeGroup) Descriptor() ([]byte, []int) { + return fileDescriptor_test_2309d445eee26af7, []int{6, 0} +} +func (m *Communique_SomeGroup) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Communique_SomeGroup.Unmarshal(m, b) +} +func (m *Communique_SomeGroup) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Communique_SomeGroup.Marshal(b, m, deterministic) +} +func (dst *Communique_SomeGroup) XXX_Merge(src proto.Message) { + xxx_messageInfo_Communique_SomeGroup.Merge(dst, src) +} +func (m *Communique_SomeGroup) XXX_Size() int { + return xxx_messageInfo_Communique_SomeGroup.Size(m) +} +func (m *Communique_SomeGroup) XXX_DiscardUnknown() { + xxx_messageInfo_Communique_SomeGroup.DiscardUnknown(m) +} + +var xxx_messageInfo_Communique_SomeGroup proto.InternalMessageInfo + +func (m *Communique_SomeGroup) GetMember() string { + if m != nil && m.Member != nil { + return *m.Member + } + return "" +} + +type Communique_Delta struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Communique_Delta) Reset() { *m = Communique_Delta{} } +func (m *Communique_Delta) String() string { return proto.CompactTextString(m) } +func (*Communique_Delta) ProtoMessage() {} +func (*Communique_Delta) Descriptor() ([]byte, []int) { + return fileDescriptor_test_2309d445eee26af7, []int{6, 1} +} +func (m *Communique_Delta) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Communique_Delta.Unmarshal(m, b) +} +func (m *Communique_Delta) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Communique_Delta.Marshal(b, m, deterministic) +} +func (dst *Communique_Delta) XXX_Merge(src proto.Message) { + xxx_messageInfo_Communique_Delta.Merge(dst, src) +} +func (m *Communique_Delta) XXX_Size() int { + return xxx_messageInfo_Communique_Delta.Size(m) +} +func (m *Communique_Delta) XXX_DiscardUnknown() { + xxx_messageInfo_Communique_Delta.DiscardUnknown(m) +} + +var xxx_messageInfo_Communique_Delta proto.InternalMessageInfo + +var E_Tag = &proto.ExtensionDesc{ + ExtendedType: (*Reply)(nil), + ExtensionType: (*string)(nil), + Field: 103, + Name: "my.test.tag", + Tag: "bytes,103,opt,name=tag", + Filename: "my_test/test.proto", +} + +var E_Donut = &proto.ExtensionDesc{ + ExtendedType: (*Reply)(nil), + ExtensionType: (*OtherReplyExtensions)(nil), + Field: 106, + Name: "my.test.donut", + Tag: "bytes,106,opt,name=donut", + Filename: "my_test/test.proto", +} + +func init() { + proto.RegisterType((*Request)(nil), "my.test.Request") + proto.RegisterMapType((map[int64]*Reply)(nil), "my.test.Request.MsgMappingEntry") + proto.RegisterMapType((map[int32]string)(nil), "my.test.Request.NameMappingEntry") + proto.RegisterType((*Request_SomeGroup)(nil), "my.test.Request.SomeGroup") + proto.RegisterType((*Reply)(nil), "my.test.Reply") + proto.RegisterType((*Reply_Entry)(nil), "my.test.Reply.Entry") + proto.RegisterType((*OtherBase)(nil), "my.test.OtherBase") + proto.RegisterType((*ReplyExtensions)(nil), "my.test.ReplyExtensions") + proto.RegisterType((*OtherReplyExtensions)(nil), "my.test.OtherReplyExtensions") + proto.RegisterType((*OldReply)(nil), "my.test.OldReply") + proto.RegisterType((*Communique)(nil), "my.test.Communique") + proto.RegisterType((*Communique_SomeGroup)(nil), "my.test.Communique.SomeGroup") + proto.RegisterType((*Communique_Delta)(nil), "my.test.Communique.Delta") + proto.RegisterEnum("my.test.HatType", HatType_name, HatType_value) + proto.RegisterEnum("my.test.Days", Days_name, Days_value) + proto.RegisterEnum("my.test.Request_Color", Request_Color_name, Request_Color_value) + proto.RegisterEnum("my.test.Reply_Entry_Game", Reply_Entry_Game_name, Reply_Entry_Game_value) + proto.RegisterExtension(E_ReplyExtensions_Time) + proto.RegisterExtension(E_ReplyExtensions_Carrot) + proto.RegisterExtension(E_ReplyExtensions_Donut) + proto.RegisterExtension(E_Tag) + proto.RegisterExtension(E_Donut) +} + +func init() { proto.RegisterFile("my_test/test.proto", fileDescriptor_test_2309d445eee26af7) } + +var fileDescriptor_test_2309d445eee26af7 = []byte{ + // 1033 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x55, 0xdd, 0x6e, 0xe3, 0x44, + 0x14, 0xce, 0xd8, 0x71, 0x7e, 0x4e, 0x42, 0x6b, 0x46, 0x55, 0x6b, 0x05, 0xed, 0xd6, 0x04, 0x8a, + 0x4c, 0xc5, 0xa6, 0xda, 0x80, 0xc4, 0x2a, 0x88, 0xd5, 0x36, 0x3f, 0x6d, 0xaa, 0x6d, 0x12, 0x69, + 0xda, 0x5e, 0xb0, 0x37, 0xd6, 0x34, 0x9e, 0x3a, 0xa6, 0x19, 0x3b, 0x6b, 0x8f, 0x11, 0xbe, 0xeb, + 0x53, 0xc0, 0x6b, 0x70, 0xcf, 0x0b, 0xf1, 0x16, 0x45, 0x33, 0x0e, 0x49, 0xda, 0xa0, 0xbd, 0xb1, + 0x7c, 0xce, 0xf9, 0xce, 0xe7, 0x39, 0x3f, 0xfe, 0x06, 0x30, 0xcf, 0x5c, 0xc1, 0x12, 0x71, 0x22, + 0x1f, 0xad, 0x45, 0x1c, 0x89, 0x08, 0x97, 0x79, 0xd6, 0x92, 0x66, 0x03, 0xf3, 0x74, 0x2e, 0x82, + 0x13, 0xf5, 0x7c, 0x9d, 0x07, 0x9b, 0xff, 0x14, 0xa1, 0x4c, 0xd8, 0xc7, 0x94, 0x25, 0x02, 0x9b, + 0xa0, 0xdf, 0xb3, 0xcc, 0x42, 0xb6, 0xee, 0xe8, 0x44, 0xbe, 0x62, 0x07, 0xf4, 0x59, 0xca, 0x2c, + 0xdd, 0x46, 0xce, 0x4e, 0x7b, 0xbf, 0xb5, 0x24, 0x6a, 0x2d, 0x13, 0x5a, 0xbd, 0x68, 0x1e, 0xc5, + 0x44, 0x42, 0xf0, 0x31, 0xe8, 0x33, 0x2a, 0xac, 0xa2, 0x42, 0x9a, 0x2b, 0xe4, 0x90, 0x8a, 0xeb, + 0x6c, 0xc1, 0x3a, 0xa5, 0xb3, 0x41, 0x7f, 0x42, 0x4e, 0x89, 0x04, 0xe1, 0x43, 0xa8, 0x78, 0x8c, + 0x7a, 0xf3, 0x20, 0x64, 0x56, 0xd9, 0x46, 0x8e, 0xd6, 0xd1, 0x83, 0xf0, 0x8e, 0xac, 0x9c, 0xf8, + 0x0d, 0x54, 0x93, 0x88, 0x33, 0x3f, 0x8e, 0xd2, 0x85, 0x55, 0xb1, 0x91, 0x03, 0xed, 0xc6, 0xd6, + 0xc7, 0xaf, 0x22, 0xce, 0xce, 0x25, 0x82, 0xac, 0xc1, 0xb8, 0x0f, 0xf5, 0x90, 0x72, 0xe6, 0x72, + 0xba, 0x58, 0x04, 0xa1, 0x6f, 0xed, 0xd8, 0xba, 0x53, 0x6b, 0x7f, 0xb9, 0x95, 0x3c, 0xa6, 0x9c, + 0x8d, 0x72, 0xcc, 0x20, 0x14, 0x71, 0x46, 0x6a, 0xe1, 0xda, 0x83, 0x4f, 0xa1, 0xc6, 0x13, 0x7f, + 0x45, 0xb2, 0xab, 0x48, 0xec, 0x2d, 0x92, 0x51, 0xe2, 0x3f, 0xe1, 0x00, 0xbe, 0x72, 0xe0, 0x3d, + 0x30, 0x62, 0x96, 0x30, 0x61, 0xd5, 0x6d, 0xe4, 0x18, 0x24, 0x37, 0xf0, 0x01, 0x94, 0x7d, 0x26, + 0x5c, 0xd9, 0x65, 0xd3, 0x46, 0x4e, 0x95, 0x94, 0x7c, 0x26, 0xde, 0xb3, 0xac, 0xf1, 0x1d, 0x54, + 0x57, 0xf5, 0xe0, 0x43, 0xa8, 0xa9, 0x6a, 0xdc, 0xbb, 0x80, 0xcd, 0x3d, 0xab, 0xaa, 0x18, 0x40, + 0xb9, 0xce, 0xa4, 0xa7, 0xf1, 0x16, 0xcc, 0xe7, 0x05, 0xac, 0x87, 0x27, 0xc1, 0x6a, 0x78, 0x7b, + 0x60, 0xfc, 0x46, 0xe7, 0x29, 0xb3, 0x34, 0xf5, 0xa9, 0xdc, 0xe8, 0x68, 0x6f, 0x50, 0x63, 0x04, + 0xbb, 0xcf, 0xce, 0xbe, 0x99, 0x8e, 0xf3, 0xf4, 0xaf, 0x37, 0xd3, 0x6b, 0xed, 0x9d, 0x8d, 0xf2, + 0x17, 0xf3, 0x6c, 0x83, 0xae, 0x79, 0x04, 0x86, 0xda, 0x04, 0x5c, 0x06, 0x9d, 0x0c, 0xfa, 0x66, + 0x01, 0x57, 0xc1, 0x38, 0x27, 0x83, 0xc1, 0xd8, 0x44, 0xb8, 0x02, 0xc5, 0xee, 0xe5, 0xcd, 0xc0, + 0xd4, 0x9a, 0x7f, 0x6a, 0x60, 0xa8, 0x5c, 0x7c, 0x0c, 0xc6, 0x5d, 0x94, 0x86, 0x9e, 0x5a, 0xb5, + 0x5a, 0x7b, 0xef, 0x29, 0x75, 0x2b, 0xef, 0x66, 0x0e, 0xc1, 0x47, 0x50, 0x9f, 0x46, 0x7c, 0x41, + 0xa7, 0xaa, 0x6d, 0x89, 0xa5, 0xd9, 0xba, 0x63, 0x74, 0x35, 0x13, 0x91, 0xda, 0xd2, 0xff, 0x9e, + 0x65, 0x49, 0xe3, 0x2f, 0x04, 0x46, 0x5e, 0x49, 0x1f, 0x0e, 0xef, 0x59, 0xe6, 0x8a, 0x19, 0x15, + 0x6e, 0xc8, 0x98, 0x97, 0xb8, 0xaf, 0xdb, 0xdf, 0xff, 0x30, 0xa5, 0x9c, 0xcd, 0xdd, 0x1e, 0x4d, + 0x2e, 0x42, 0xdf, 0x42, 0xb6, 0xe6, 0xe8, 0xe4, 0x8b, 0x7b, 0x96, 0x5d, 0xcf, 0xa8, 0x18, 0x4b, + 0xd0, 0x0a, 0x93, 0x43, 0xf0, 0xc1, 0x66, 0xf5, 0x7a, 0x07, 0xfd, 0xb8, 0x2c, 0x18, 0x7f, 0x03, + 0xa6, 0xcb, 0xb3, 0x7c, 0x34, 0xae, 0xda, 0xb5, 0xb6, 0xfa, 0x3f, 0x74, 0x52, 0x1f, 0x65, 0x6a, + 0x3c, 0x72, 0x34, 0xed, 0xa6, 0x0d, 0xc5, 0x73, 0xca, 0x19, 0xae, 0x43, 0xe5, 0x6c, 0x32, 0xb9, + 0xee, 0x9e, 0x5e, 0x5e, 0x9a, 0x08, 0x03, 0x94, 0xae, 0x07, 0xe3, 0xf1, 0xc5, 0x95, 0xa9, 0x1d, + 0x57, 0x2a, 0x9e, 0xf9, 0xf0, 0xf0, 0xf0, 0xa0, 0x35, 0xbf, 0x85, 0xea, 0x44, 0xcc, 0x58, 0xdc, + 0xa5, 0x09, 0xc3, 0x18, 0x8a, 0x92, 0x56, 0x8d, 0xa2, 0x4a, 0xd4, 0xfb, 0x06, 0xf4, 0x6f, 0x04, + 0xbb, 0xaa, 0x4b, 0x83, 0xdf, 0x05, 0x0b, 0x93, 0x20, 0x0a, 0x93, 0x76, 0x13, 0x8a, 0x22, 0xe0, + 0x0c, 0x3f, 0x1b, 0x91, 0xc5, 0x6c, 0xe4, 0x20, 0xa2, 0x62, 0xed, 0x77, 0x50, 0x9a, 0xd2, 0x38, + 0x8e, 0xc4, 0x16, 0x2a, 0x50, 0xe3, 0xb5, 0x9e, 0x7a, 0xd7, 0xec, 0x64, 0x99, 0xd7, 0xee, 0x82, + 0xe1, 0x45, 0x61, 0x2a, 0x30, 0x5e, 0x41, 0x57, 0x87, 0x56, 0x9f, 0xfa, 0x14, 0x49, 0x9e, 0xda, + 0x74, 0x60, 0x4f, 0xe5, 0x3c, 0x0b, 0x6f, 0x2f, 0x6f, 0xd3, 0x82, 0xca, 0x64, 0xee, 0x29, 0x9c, + 0xaa, 0xfe, 0xf1, 0xf1, 0xf1, 0xb1, 0xdc, 0xd1, 0x2a, 0xa8, 0xf9, 0x87, 0x0e, 0xd0, 0x8b, 0x38, + 0x4f, 0xc3, 0xe0, 0x63, 0xca, 0xf0, 0x4b, 0xa8, 0x71, 0x7a, 0xcf, 0x5c, 0xce, 0xdc, 0x69, 0x9c, + 0x53, 0x54, 0x48, 0x55, 0xba, 0x46, 0xac, 0x17, 0x67, 0xd8, 0x82, 0x52, 0x98, 0xf2, 0x5b, 0x16, + 0x5b, 0x86, 0x64, 0x1f, 0x16, 0xc8, 0xd2, 0xc6, 0x7b, 0xcb, 0x46, 0x97, 0x64, 0xa3, 0x87, 0x85, + 0xbc, 0xd5, 0xd2, 0xeb, 0x51, 0x41, 0x95, 0x30, 0xd5, 0xa5, 0x57, 0x5a, 0xf8, 0x00, 0x4a, 0x82, + 0xf1, 0x85, 0x3b, 0x55, 0x72, 0x84, 0x86, 0x05, 0x62, 0x48, 0xbb, 0x27, 0xe9, 0x67, 0x2c, 0xf0, + 0x67, 0x42, 0xfd, 0xa6, 0x9a, 0xa4, 0xcf, 0x6d, 0x7c, 0x04, 0x86, 0x88, 0x3c, 0x9a, 0x59, 0xa0, + 0x34, 0xf1, 0xb3, 0x55, 0x6f, 0xfa, 0x34, 0x4b, 0x14, 0x81, 0x8c, 0xe2, 0x7d, 0x30, 0x38, 0xcd, + 0x6e, 0x99, 0x55, 0x93, 0x27, 0x97, 0x7e, 0x65, 0x4a, 0xbf, 0xc7, 0xe6, 0x82, 0x2a, 0x01, 0xf9, + 0x5c, 0xfa, 0x95, 0x89, 0x9b, 0xa0, 0xf3, 0xc4, 0x57, 0xf2, 0xb1, 0xf5, 0x53, 0x0e, 0x0b, 0x44, + 0x06, 0xf1, 0xcf, 0x9b, 0xfa, 0xb9, 0xa3, 0xf4, 0xf3, 0xc5, 0x0a, 0xb9, 0xee, 0xdd, 0x5a, 0x42, + 0x87, 0x85, 0x0d, 0x11, 0x6d, 0x7c, 0xb5, 0x29, 0x46, 0xfb, 0x50, 0xe2, 0x4c, 0xf5, 0x6f, 0x37, + 0x57, 0xac, 0xdc, 0x6a, 0x94, 0xc1, 0xe8, 0xcb, 0x03, 0x75, 0xcb, 0x60, 0xa4, 0x61, 0x10, 0x85, + 0xc7, 0x2f, 0xa1, 0xbc, 0x94, 0x7b, 0xb9, 0xe6, 0xb9, 0xe0, 0x9b, 0x48, 0x8a, 0xc2, 0xd9, 0xe0, + 0x83, 0xa9, 0x1d, 0xb7, 0xa0, 0x28, 0x4b, 0x97, 0xc1, 0xd1, 0x64, 0xdc, 0x3f, 0xfd, 0xc5, 0x44, + 0xb8, 0x06, 0xe5, 0xeb, 0x9b, 0xc1, 0x95, 0x34, 0x34, 0xa9, 0x1a, 0x97, 0x37, 0xe3, 0xfe, 0x85, + 0x89, 0x1a, 0x9a, 0x89, 0x3a, 0x36, 0xe8, 0x82, 0xfa, 0x5b, 0xfb, 0xea, 0xab, 0x63, 0xc8, 0x50, + 0xa7, 0xf7, 0xdf, 0x4a, 0x3e, 0xc7, 0xfc, 0xaa, 0xba, 0xf3, 0xe2, 0xe9, 0xa2, 0xfe, 0xff, 0x4e, + 0x76, 0xdf, 0x7d, 0x78, 0xeb, 0x07, 0x62, 0x96, 0xde, 0xb6, 0xa6, 0x11, 0x3f, 0xf1, 0xa3, 0x39, + 0x0d, 0xfd, 0x13, 0x75, 0x39, 0xde, 0xa6, 0x77, 0xf9, 0xcb, 0xf4, 0x95, 0xcf, 0xc2, 0x57, 0x7e, + 0xa4, 0x6e, 0x55, 0xb9, 0x0f, 0x27, 0xcb, 0x6b, 0xf6, 0x27, 0xf9, 0xf8, 0x37, 0x00, 0x00, 0xff, + 0xff, 0x12, 0xd5, 0x46, 0x00, 0x75, 0x07, 0x00, 0x00, +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/my_test/test.proto b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/my_test/test.proto new file mode 100644 index 0000000..1ef3fd0 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/my_test/test.proto @@ -0,0 +1,158 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto2"; + +// This package holds interesting messages. +package my.test; // dotted package name + +option go_package = "github.com/golang/protobuf/protoc-gen-go/testdata/my_test;test"; + +//import "imp.proto"; +import "multi/multi1.proto"; // unused import + +enum HatType { + // deliberately skipping 0 + FEDORA = 1; + FEZ = 2; +} + +// This enum represents days of the week. +enum Days { + option allow_alias = true; + + MONDAY = 1; + TUESDAY = 2; + LUNDI = 1; // same value as MONDAY +} + +// This is a message that might be sent somewhere. +message Request { + enum Color { + RED = 0; + GREEN = 1; + BLUE = 2; + } + repeated int64 key = 1; +// optional imp.ImportedMessage imported_message = 2; + optional Color hue = 3; // no default + optional HatType hat = 4 [default=FEDORA]; +// optional imp.ImportedMessage.Owner owner = 6; + optional float deadline = 7 [default=inf]; + optional group SomeGroup = 8 { + optional int32 group_field = 9; + } + + // These foreign types are in imp2.proto, + // which is publicly imported by imp.proto. +// optional imp.PubliclyImportedMessage pub = 10; +// optional imp.PubliclyImportedEnum pub_enum = 13 [default=HAIR]; + + + // This is a map field. It will generate map[int32]string. + map name_mapping = 14; + // This is a map field whose value type is a message. + map msg_mapping = 15; + + optional int32 reset = 12; + // This field should not conflict with any getters. + optional string get_key = 16; +} + +message Reply { + message Entry { + required int64 key_that_needs_1234camel_CasIng = 1; + optional int64 value = 2 [default=7]; + optional int64 _my_field_name_2 = 3; + enum Game { + FOOTBALL = 1; + TENNIS = 2; + } + } + repeated Entry found = 1; + repeated int32 compact_keys = 2 [packed=true]; + extensions 100 to max; +} + +message OtherBase { + optional string name = 1; + extensions 100 to max; +} + +message ReplyExtensions { + extend Reply { + optional double time = 101; + optional ReplyExtensions carrot = 105; + } + extend OtherBase { + optional ReplyExtensions donut = 101; + } +} + +message OtherReplyExtensions { + optional int32 key = 1; +} + +// top-level extension +extend Reply { + optional string tag = 103; + optional OtherReplyExtensions donut = 106; +// optional imp.ImportedMessage elephant = 107; // extend with message from another file. +} + +message OldReply { + // Extensions will be encoded in MessageSet wire format. + option message_set_wire_format = true; + extensions 100 to max; +} + +message Communique { + optional bool make_me_cry = 1; + + // This is a oneof, called "union". + oneof union { + int32 number = 5; + string name = 6; + bytes data = 7; + double temp_c = 8; + float height = 9; + Days today = 10; + bool maybe = 11; + sint32 delta = 12; // name will conflict with Delta below + Reply msg = 16; // requires two bytes to encode field tag + group SomeGroup = 14 { + optional string member = 15; + } + } + + message Delta {} +} + diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/proto3/proto3.pb.go b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/proto3/proto3.pb.go new file mode 100644 index 0000000..3b0ad84 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/proto3/proto3.pb.go @@ -0,0 +1,196 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: proto3/proto3.proto + +package proto3 // import "github.com/golang/protobuf/protoc-gen-go/testdata/proto3" + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type Request_Flavour int32 + +const ( + Request_SWEET Request_Flavour = 0 + Request_SOUR Request_Flavour = 1 + Request_UMAMI Request_Flavour = 2 + Request_GOPHERLICIOUS Request_Flavour = 3 +) + +var Request_Flavour_name = map[int32]string{ + 0: "SWEET", + 1: "SOUR", + 2: "UMAMI", + 3: "GOPHERLICIOUS", +} +var Request_Flavour_value = map[string]int32{ + "SWEET": 0, + "SOUR": 1, + "UMAMI": 2, + "GOPHERLICIOUS": 3, +} + +func (x Request_Flavour) String() string { + return proto.EnumName(Request_Flavour_name, int32(x)) +} +func (Request_Flavour) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_proto3_a752e09251f17e01, []int{0, 0} +} + +type Request struct { + Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Key []int64 `protobuf:"varint,2,rep,packed,name=key" json:"key,omitempty"` + Taste Request_Flavour `protobuf:"varint,3,opt,name=taste,enum=proto3.Request_Flavour" json:"taste,omitempty"` + Book *Book `protobuf:"bytes,4,opt,name=book" json:"book,omitempty"` + Unpacked []int64 `protobuf:"varint,5,rep,name=unpacked" json:"unpacked,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Request) Reset() { *m = Request{} } +func (m *Request) String() string { return proto.CompactTextString(m) } +func (*Request) ProtoMessage() {} +func (*Request) Descriptor() ([]byte, []int) { + return fileDescriptor_proto3_a752e09251f17e01, []int{0} +} +func (m *Request) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Request.Unmarshal(m, b) +} +func (m *Request) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Request.Marshal(b, m, deterministic) +} +func (dst *Request) XXX_Merge(src proto.Message) { + xxx_messageInfo_Request.Merge(dst, src) +} +func (m *Request) XXX_Size() int { + return xxx_messageInfo_Request.Size(m) +} +func (m *Request) XXX_DiscardUnknown() { + xxx_messageInfo_Request.DiscardUnknown(m) +} + +var xxx_messageInfo_Request proto.InternalMessageInfo + +func (m *Request) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Request) GetKey() []int64 { + if m != nil { + return m.Key + } + return nil +} + +func (m *Request) GetTaste() Request_Flavour { + if m != nil { + return m.Taste + } + return Request_SWEET +} + +func (m *Request) GetBook() *Book { + if m != nil { + return m.Book + } + return nil +} + +func (m *Request) GetUnpacked() []int64 { + if m != nil { + return m.Unpacked + } + return nil +} + +type Book struct { + Title string `protobuf:"bytes,1,opt,name=title" json:"title,omitempty"` + RawData []byte `protobuf:"bytes,2,opt,name=raw_data,json=rawData,proto3" json:"raw_data,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Book) Reset() { *m = Book{} } +func (m *Book) String() string { return proto.CompactTextString(m) } +func (*Book) ProtoMessage() {} +func (*Book) Descriptor() ([]byte, []int) { + return fileDescriptor_proto3_a752e09251f17e01, []int{1} +} +func (m *Book) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Book.Unmarshal(m, b) +} +func (m *Book) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Book.Marshal(b, m, deterministic) +} +func (dst *Book) XXX_Merge(src proto.Message) { + xxx_messageInfo_Book.Merge(dst, src) +} +func (m *Book) XXX_Size() int { + return xxx_messageInfo_Book.Size(m) +} +func (m *Book) XXX_DiscardUnknown() { + xxx_messageInfo_Book.DiscardUnknown(m) +} + +var xxx_messageInfo_Book proto.InternalMessageInfo + +func (m *Book) GetTitle() string { + if m != nil { + return m.Title + } + return "" +} + +func (m *Book) GetRawData() []byte { + if m != nil { + return m.RawData + } + return nil +} + +func init() { + proto.RegisterType((*Request)(nil), "proto3.Request") + proto.RegisterType((*Book)(nil), "proto3.Book") + proto.RegisterEnum("proto3.Request_Flavour", Request_Flavour_name, Request_Flavour_value) +} + +func init() { proto.RegisterFile("proto3/proto3.proto", fileDescriptor_proto3_a752e09251f17e01) } + +var fileDescriptor_proto3_a752e09251f17e01 = []byte{ + // 306 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x3c, 0x90, 0xcf, 0x4e, 0xf2, 0x40, + 0x14, 0xc5, 0x99, 0xfe, 0xf9, 0x80, 0xfb, 0xa1, 0x19, 0xaf, 0x26, 0x8e, 0x1b, 0x33, 0x61, 0xd5, + 0x0d, 0x25, 0xc1, 0x85, 0xc6, 0xb8, 0x11, 0x45, 0x25, 0x91, 0x60, 0x06, 0x89, 0x89, 0x1b, 0x33, + 0x85, 0xb1, 0x92, 0x42, 0x07, 0xcb, 0x54, 0xe2, 0xcb, 0xfa, 0x2c, 0xa6, 0x9d, 0xe2, 0xea, 0x9e, + 0x7b, 0xe7, 0xe4, 0x77, 0x32, 0x07, 0x0e, 0xd7, 0x99, 0x36, 0xfa, 0xac, 0x6b, 0x47, 0x58, 0x0e, + 0xfc, 0x67, 0xb7, 0xf6, 0x0f, 0x81, 0xba, 0x50, 0x9f, 0xb9, 0xda, 0x18, 0x44, 0xf0, 0x52, 0xb9, + 0x52, 0x8c, 0x70, 0x12, 0x34, 0x45, 0xa9, 0x91, 0x82, 0x9b, 0xa8, 0x6f, 0xe6, 0x70, 0x37, 0x70, + 0x45, 0x21, 0xb1, 0x03, 0xbe, 0x91, 0x1b, 0xa3, 0x98, 0xcb, 0x49, 0xb0, 0xdf, 0x3b, 0x0e, 0x2b, + 0x6e, 0x45, 0x09, 0xef, 0x96, 0xf2, 0x4b, 0xe7, 0x99, 0xb0, 0x2e, 0xe4, 0xe0, 0x45, 0x5a, 0x27, + 0xcc, 0xe3, 0x24, 0xf8, 0xdf, 0x6b, 0xed, 0xdc, 0x7d, 0xad, 0x13, 0x51, 0xbe, 0xe0, 0x29, 0x34, + 0xf2, 0x74, 0x2d, 0x67, 0x89, 0x9a, 0x33, 0xbf, 0xc8, 0xe9, 0x3b, 0xb4, 0x26, 0xfe, 0x6e, 0xed, + 0x2b, 0xa8, 0x57, 0x4c, 0x6c, 0x82, 0x3f, 0x79, 0x19, 0x0c, 0x9e, 0x69, 0x0d, 0x1b, 0xe0, 0x4d, + 0xc6, 0x53, 0x41, 0x49, 0x71, 0x9c, 0x8e, 0xae, 0x47, 0x43, 0xea, 0xe0, 0x01, 0xec, 0xdd, 0x8f, + 0x9f, 0x1e, 0x06, 0xe2, 0x71, 0x78, 0x33, 0x1c, 0x4f, 0x27, 0xd4, 0x6d, 0x9f, 0x83, 0x57, 0x64, + 0xe1, 0x11, 0xf8, 0x66, 0x61, 0x96, 0xbb, 0xdf, 0xd9, 0x05, 0x4f, 0xa0, 0x91, 0xc9, 0xed, 0xdb, + 0x5c, 0x1a, 0xc9, 0x1c, 0x4e, 0x82, 0x96, 0xa8, 0x67, 0x72, 0x7b, 0x2b, 0x8d, 0xec, 0x5f, 0xbe, + 0x5e, 0xc4, 0x0b, 0xf3, 0x91, 0x47, 0xe1, 0x4c, 0xaf, 0xba, 0xb1, 0x5e, 0xca, 0x34, 0xb6, 0x1d, + 0x46, 0xf9, 0xbb, 0x15, 0xb3, 0x4e, 0xac, 0xd2, 0x4e, 0xac, 0xbb, 0x46, 0x6d, 0x4c, 0xc1, 0xa8, + 0x3a, 0x8e, 0xaa, 0x76, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xec, 0x71, 0xee, 0xdb, 0x7b, 0x01, + 0x00, 0x00, +} diff --git a/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/proto3/proto3.proto b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/proto3/proto3.proto new file mode 100644 index 0000000..79954e4 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/proto3/proto3.proto @@ -0,0 +1,55 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2014 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto3"; + +package proto3; + +option go_package = "github.com/golang/protobuf/protoc-gen-go/testdata/proto3"; + +message Request { + enum Flavour { + SWEET = 0; + SOUR = 1; + UMAMI = 2; + GOPHERLICIOUS = 3; + } + string name = 1; + repeated int64 key = 2; + Flavour taste = 3; + Book book = 4; + repeated int64 unpacked = 5 [packed=false]; +} + +message Book { + string title = 1; + bytes raw_data = 2; +} diff --git a/api/vendor/github.com/golang/protobuf/ptypes/any.go b/api/vendor/github.com/golang/protobuf/ptypes/any.go new file mode 100644 index 0000000..b2af97f --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/ptypes/any.go @@ -0,0 +1,139 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package ptypes + +// This file implements functions to marshal proto.Message to/from +// google.protobuf.Any message. + +import ( + "fmt" + "reflect" + "strings" + + "github.com/golang/protobuf/proto" + "github.com/golang/protobuf/ptypes/any" +) + +const googleApis = "type.googleapis.com/" + +// AnyMessageName returns the name of the message contained in a google.protobuf.Any message. +// +// Note that regular type assertions should be done using the Is +// function. AnyMessageName is provided for less common use cases like filtering a +// sequence of Any messages based on a set of allowed message type names. +func AnyMessageName(any *any.Any) (string, error) { + if any == nil { + return "", fmt.Errorf("message is nil") + } + slash := strings.LastIndex(any.TypeUrl, "/") + if slash < 0 { + return "", fmt.Errorf("message type url %q is invalid", any.TypeUrl) + } + return any.TypeUrl[slash+1:], nil +} + +// MarshalAny takes the protocol buffer and encodes it into google.protobuf.Any. +func MarshalAny(pb proto.Message) (*any.Any, error) { + value, err := proto.Marshal(pb) + if err != nil { + return nil, err + } + return &any.Any{TypeUrl: googleApis + proto.MessageName(pb), Value: value}, nil +} + +// DynamicAny is a value that can be passed to UnmarshalAny to automatically +// allocate a proto.Message for the type specified in a google.protobuf.Any +// message. The allocated message is stored in the embedded proto.Message. +// +// Example: +// +// var x ptypes.DynamicAny +// if err := ptypes.UnmarshalAny(a, &x); err != nil { ... } +// fmt.Printf("unmarshaled message: %v", x.Message) +type DynamicAny struct { + proto.Message +} + +// Empty returns a new proto.Message of the type specified in a +// google.protobuf.Any message. It returns an error if corresponding message +// type isn't linked in. +func Empty(any *any.Any) (proto.Message, error) { + aname, err := AnyMessageName(any) + if err != nil { + return nil, err + } + + t := proto.MessageType(aname) + if t == nil { + return nil, fmt.Errorf("any: message type %q isn't linked in", aname) + } + return reflect.New(t.Elem()).Interface().(proto.Message), nil +} + +// UnmarshalAny parses the protocol buffer representation in a google.protobuf.Any +// message and places the decoded result in pb. It returns an error if type of +// contents of Any message does not match type of pb message. +// +// pb can be a proto.Message, or a *DynamicAny. +func UnmarshalAny(any *any.Any, pb proto.Message) error { + if d, ok := pb.(*DynamicAny); ok { + if d.Message == nil { + var err error + d.Message, err = Empty(any) + if err != nil { + return err + } + } + return UnmarshalAny(any, d.Message) + } + + aname, err := AnyMessageName(any) + if err != nil { + return err + } + + mname := proto.MessageName(pb) + if aname != mname { + return fmt.Errorf("mismatched message type: got %q want %q", aname, mname) + } + return proto.Unmarshal(any.Value, pb) +} + +// Is returns true if any value contains a given message type. +func Is(any *any.Any, pb proto.Message) bool { + aname, err := AnyMessageName(any) + if err != nil { + return false + } + + return aname == proto.MessageName(pb) +} diff --git a/api/vendor/github.com/golang/protobuf/ptypes/any/any.pb.go b/api/vendor/github.com/golang/protobuf/ptypes/any/any.pb.go new file mode 100644 index 0000000..f67edc7 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/ptypes/any/any.pb.go @@ -0,0 +1,191 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/any.proto + +package any // import "github.com/golang/protobuf/ptypes/any" + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +// `Any` contains an arbitrary serialized protocol buffer message along with a +// URL that describes the type of the serialized message. +// +// Protobuf library provides support to pack/unpack Any values in the form +// of utility functions or additional generated methods of the Any type. +// +// Example 1: Pack and unpack a message in C++. +// +// Foo foo = ...; +// Any any; +// any.PackFrom(foo); +// ... +// if (any.UnpackTo(&foo)) { +// ... +// } +// +// Example 2: Pack and unpack a message in Java. +// +// Foo foo = ...; +// Any any = Any.pack(foo); +// ... +// if (any.is(Foo.class)) { +// foo = any.unpack(Foo.class); +// } +// +// Example 3: Pack and unpack a message in Python. +// +// foo = Foo(...) +// any = Any() +// any.Pack(foo) +// ... +// if any.Is(Foo.DESCRIPTOR): +// any.Unpack(foo) +// ... +// +// Example 4: Pack and unpack a message in Go +// +// foo := &pb.Foo{...} +// any, err := ptypes.MarshalAny(foo) +// ... +// foo := &pb.Foo{} +// if err := ptypes.UnmarshalAny(any, foo); err != nil { +// ... +// } +// +// The pack methods provided by protobuf library will by default use +// 'type.googleapis.com/full.type.name' as the type URL and the unpack +// methods only use the fully qualified type name after the last '/' +// in the type URL, for example "foo.bar.com/x/y.z" will yield type +// name "y.z". +// +// +// JSON +// ==== +// The JSON representation of an `Any` value uses the regular +// representation of the deserialized, embedded message, with an +// additional field `@type` which contains the type URL. Example: +// +// package google.profile; +// message Person { +// string first_name = 1; +// string last_name = 2; +// } +// +// { +// "@type": "type.googleapis.com/google.profile.Person", +// "firstName": , +// "lastName": +// } +// +// If the embedded message type is well-known and has a custom JSON +// representation, that representation will be embedded adding a field +// `value` which holds the custom JSON in addition to the `@type` +// field. Example (for message [google.protobuf.Duration][]): +// +// { +// "@type": "type.googleapis.com/google.protobuf.Duration", +// "value": "1.212s" +// } +// +type Any struct { + // A URL/resource name whose content describes the type of the + // serialized protocol buffer message. + // + // For URLs which use the scheme `http`, `https`, or no scheme, the + // following restrictions and interpretations apply: + // + // * If no scheme is provided, `https` is assumed. + // * The last segment of the URL's path must represent the fully + // qualified name of the type (as in `path/google.protobuf.Duration`). + // The name should be in a canonical form (e.g., leading "." is + // not accepted). + // * An HTTP GET on the URL must yield a [google.protobuf.Type][] + // value in binary format, or produce an error. + // * Applications are allowed to cache lookup results based on the + // URL, or have them precompiled into a binary to avoid any + // lookup. Therefore, binary compatibility needs to be preserved + // on changes to types. (Use versioned type names to manage + // breaking changes.) + // + // Schemes other than `http`, `https` (or the empty scheme) might be + // used with implementation specific semantics. + // + TypeUrl string `protobuf:"bytes,1,opt,name=type_url,json=typeUrl" json:"type_url,omitempty"` + // Must be a valid serialized protocol buffer of the above specified type. + Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Any) Reset() { *m = Any{} } +func (m *Any) String() string { return proto.CompactTextString(m) } +func (*Any) ProtoMessage() {} +func (*Any) Descriptor() ([]byte, []int) { + return fileDescriptor_any_744b9ca530f228db, []int{0} +} +func (*Any) XXX_WellKnownType() string { return "Any" } +func (m *Any) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Any.Unmarshal(m, b) +} +func (m *Any) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Any.Marshal(b, m, deterministic) +} +func (dst *Any) XXX_Merge(src proto.Message) { + xxx_messageInfo_Any.Merge(dst, src) +} +func (m *Any) XXX_Size() int { + return xxx_messageInfo_Any.Size(m) +} +func (m *Any) XXX_DiscardUnknown() { + xxx_messageInfo_Any.DiscardUnknown(m) +} + +var xxx_messageInfo_Any proto.InternalMessageInfo + +func (m *Any) GetTypeUrl() string { + if m != nil { + return m.TypeUrl + } + return "" +} + +func (m *Any) GetValue() []byte { + if m != nil { + return m.Value + } + return nil +} + +func init() { + proto.RegisterType((*Any)(nil), "google.protobuf.Any") +} + +func init() { proto.RegisterFile("google/protobuf/any.proto", fileDescriptor_any_744b9ca530f228db) } + +var fileDescriptor_any_744b9ca530f228db = []byte{ + // 185 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4c, 0xcf, 0xcf, 0x4f, + 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x4f, 0xcc, 0xab, 0xd4, + 0x03, 0x73, 0x84, 0xf8, 0x21, 0x52, 0x7a, 0x30, 0x29, 0x25, 0x33, 0x2e, 0x66, 0xc7, 0xbc, 0x4a, + 0x21, 0x49, 0x2e, 0x8e, 0x92, 0xca, 0x82, 0xd4, 0xf8, 0xd2, 0xa2, 0x1c, 0x09, 0x46, 0x05, 0x46, + 0x0d, 0xce, 0x20, 0x76, 0x10, 0x3f, 0xb4, 0x28, 0x47, 0x48, 0x84, 0x8b, 0xb5, 0x2c, 0x31, 0xa7, + 0x34, 0x55, 0x82, 0x49, 0x81, 0x51, 0x83, 0x27, 0x08, 0xc2, 0x71, 0xca, 0xe7, 0x12, 0x4e, 0xce, + 0xcf, 0xd5, 0x43, 0x33, 0xce, 0x89, 0xc3, 0x31, 0xaf, 0x32, 0x00, 0xc4, 0x09, 0x60, 0x8c, 0x52, + 0x4d, 0xcf, 0x2c, 0xc9, 0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xcf, 0xcf, 0x49, 0xcc, + 0x4b, 0x47, 0xb8, 0xa8, 0x00, 0x64, 0x7a, 0x31, 0xc8, 0x61, 0x8b, 0x98, 0x98, 0xdd, 0x03, 0x9c, + 0x56, 0x31, 0xc9, 0xb9, 0x43, 0x8c, 0x0a, 0x80, 0x2a, 0xd1, 0x0b, 0x4f, 0xcd, 0xc9, 0xf1, 0xce, + 0xcb, 0x2f, 0xcf, 0x0b, 0x01, 0x29, 0x4d, 0x62, 0x03, 0xeb, 0x35, 0x06, 0x04, 0x00, 0x00, 0xff, + 0xff, 0x13, 0xf8, 0xe8, 0x42, 0xdd, 0x00, 0x00, 0x00, +} diff --git a/api/vendor/github.com/golang/protobuf/ptypes/any/any.proto b/api/vendor/github.com/golang/protobuf/ptypes/any/any.proto new file mode 100644 index 0000000..c748667 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/ptypes/any/any.proto @@ -0,0 +1,149 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// 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. + +syntax = "proto3"; + +package google.protobuf; + +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option go_package = "github.com/golang/protobuf/ptypes/any"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "AnyProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; + +// `Any` contains an arbitrary serialized protocol buffer message along with a +// URL that describes the type of the serialized message. +// +// Protobuf library provides support to pack/unpack Any values in the form +// of utility functions or additional generated methods of the Any type. +// +// Example 1: Pack and unpack a message in C++. +// +// Foo foo = ...; +// Any any; +// any.PackFrom(foo); +// ... +// if (any.UnpackTo(&foo)) { +// ... +// } +// +// Example 2: Pack and unpack a message in Java. +// +// Foo foo = ...; +// Any any = Any.pack(foo); +// ... +// if (any.is(Foo.class)) { +// foo = any.unpack(Foo.class); +// } +// +// Example 3: Pack and unpack a message in Python. +// +// foo = Foo(...) +// any = Any() +// any.Pack(foo) +// ... +// if any.Is(Foo.DESCRIPTOR): +// any.Unpack(foo) +// ... +// +// Example 4: Pack and unpack a message in Go +// +// foo := &pb.Foo{...} +// any, err := ptypes.MarshalAny(foo) +// ... +// foo := &pb.Foo{} +// if err := ptypes.UnmarshalAny(any, foo); err != nil { +// ... +// } +// +// The pack methods provided by protobuf library will by default use +// 'type.googleapis.com/full.type.name' as the type URL and the unpack +// methods only use the fully qualified type name after the last '/' +// in the type URL, for example "foo.bar.com/x/y.z" will yield type +// name "y.z". +// +// +// JSON +// ==== +// The JSON representation of an `Any` value uses the regular +// representation of the deserialized, embedded message, with an +// additional field `@type` which contains the type URL. Example: +// +// package google.profile; +// message Person { +// string first_name = 1; +// string last_name = 2; +// } +// +// { +// "@type": "type.googleapis.com/google.profile.Person", +// "firstName": , +// "lastName": +// } +// +// If the embedded message type is well-known and has a custom JSON +// representation, that representation will be embedded adding a field +// `value` which holds the custom JSON in addition to the `@type` +// field. Example (for message [google.protobuf.Duration][]): +// +// { +// "@type": "type.googleapis.com/google.protobuf.Duration", +// "value": "1.212s" +// } +// +message Any { + // A URL/resource name whose content describes the type of the + // serialized protocol buffer message. + // + // For URLs which use the scheme `http`, `https`, or no scheme, the + // following restrictions and interpretations apply: + // + // * If no scheme is provided, `https` is assumed. + // * The last segment of the URL's path must represent the fully + // qualified name of the type (as in `path/google.protobuf.Duration`). + // The name should be in a canonical form (e.g., leading "." is + // not accepted). + // * An HTTP GET on the URL must yield a [google.protobuf.Type][] + // value in binary format, or produce an error. + // * Applications are allowed to cache lookup results based on the + // URL, or have them precompiled into a binary to avoid any + // lookup. Therefore, binary compatibility needs to be preserved + // on changes to types. (Use versioned type names to manage + // breaking changes.) + // + // Schemes other than `http`, `https` (or the empty scheme) might be + // used with implementation specific semantics. + // + string type_url = 1; + + // Must be a valid serialized protocol buffer of the above specified type. + bytes value = 2; +} diff --git a/api/vendor/github.com/golang/protobuf/ptypes/any_test.go b/api/vendor/github.com/golang/protobuf/ptypes/any_test.go new file mode 100644 index 0000000..ed675b4 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/ptypes/any_test.go @@ -0,0 +1,113 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package ptypes + +import ( + "testing" + + "github.com/golang/protobuf/proto" + pb "github.com/golang/protobuf/protoc-gen-go/descriptor" + "github.com/golang/protobuf/ptypes/any" +) + +func TestMarshalUnmarshal(t *testing.T) { + orig := &any.Any{Value: []byte("test")} + + packed, err := MarshalAny(orig) + if err != nil { + t.Errorf("MarshalAny(%+v): got: _, %v exp: _, nil", orig, err) + } + + unpacked := &any.Any{} + err = UnmarshalAny(packed, unpacked) + if err != nil || !proto.Equal(unpacked, orig) { + t.Errorf("got: %v, %+v; want nil, %+v", err, unpacked, orig) + } +} + +func TestIs(t *testing.T) { + a, err := MarshalAny(&pb.FileDescriptorProto{}) + if err != nil { + t.Fatal(err) + } + if Is(a, &pb.DescriptorProto{}) { + t.Error("FileDescriptorProto is not a DescriptorProto, but Is says it is") + } + if !Is(a, &pb.FileDescriptorProto{}) { + t.Error("FileDescriptorProto is indeed a FileDescriptorProto, but Is says it is not") + } +} + +func TestIsDifferentUrlPrefixes(t *testing.T) { + m := &pb.FileDescriptorProto{} + a := &any.Any{TypeUrl: "foo/bar/" + proto.MessageName(m)} + if !Is(a, m) { + t.Errorf("message with type url %q didn't satisfy Is for type %q", a.TypeUrl, proto.MessageName(m)) + } +} + +func TestUnmarshalDynamic(t *testing.T) { + want := &pb.FileDescriptorProto{Name: proto.String("foo")} + a, err := MarshalAny(want) + if err != nil { + t.Fatal(err) + } + var got DynamicAny + if err := UnmarshalAny(a, &got); err != nil { + t.Fatal(err) + } + if !proto.Equal(got.Message, want) { + t.Errorf("invalid result from UnmarshalAny, got %q want %q", got.Message, want) + } +} + +func TestEmpty(t *testing.T) { + want := &pb.FileDescriptorProto{} + a, err := MarshalAny(want) + if err != nil { + t.Fatal(err) + } + got, err := Empty(a) + if err != nil { + t.Fatal(err) + } + if !proto.Equal(got, want) { + t.Errorf("unequal empty message, got %q, want %q", got, want) + } + + // that's a valid type_url for a message which shouldn't be linked into this + // test binary. We want an error. + a.TypeUrl = "type.googleapis.com/google.protobuf.FieldMask" + if _, err := Empty(a); err == nil { + t.Errorf("got no error for an attempt to create a message of type %q, which shouldn't be linked in", a.TypeUrl) + } +} diff --git a/api/vendor/github.com/golang/protobuf/ptypes/doc.go b/api/vendor/github.com/golang/protobuf/ptypes/doc.go new file mode 100644 index 0000000..c0d595d --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/ptypes/doc.go @@ -0,0 +1,35 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +/* +Package ptypes contains code for interacting with well-known types. +*/ +package ptypes diff --git a/api/vendor/github.com/golang/protobuf/ptypes/duration.go b/api/vendor/github.com/golang/protobuf/ptypes/duration.go new file mode 100644 index 0000000..65cb0f8 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/ptypes/duration.go @@ -0,0 +1,102 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package ptypes + +// This file implements conversions between google.protobuf.Duration +// and time.Duration. + +import ( + "errors" + "fmt" + "time" + + durpb "github.com/golang/protobuf/ptypes/duration" +) + +const ( + // Range of a durpb.Duration in seconds, as specified in + // google/protobuf/duration.proto. This is about 10,000 years in seconds. + maxSeconds = int64(10000 * 365.25 * 24 * 60 * 60) + minSeconds = -maxSeconds +) + +// validateDuration determines whether the durpb.Duration is valid according to the +// definition in google/protobuf/duration.proto. A valid durpb.Duration +// may still be too large to fit into a time.Duration (the range of durpb.Duration +// is about 10,000 years, and the range of time.Duration is about 290). +func validateDuration(d *durpb.Duration) error { + if d == nil { + return errors.New("duration: nil Duration") + } + if d.Seconds < minSeconds || d.Seconds > maxSeconds { + return fmt.Errorf("duration: %v: seconds out of range", d) + } + if d.Nanos <= -1e9 || d.Nanos >= 1e9 { + return fmt.Errorf("duration: %v: nanos out of range", d) + } + // Seconds and Nanos must have the same sign, unless d.Nanos is zero. + if (d.Seconds < 0 && d.Nanos > 0) || (d.Seconds > 0 && d.Nanos < 0) { + return fmt.Errorf("duration: %v: seconds and nanos have different signs", d) + } + return nil +} + +// Duration converts a durpb.Duration to a time.Duration. Duration +// returns an error if the durpb.Duration is invalid or is too large to be +// represented in a time.Duration. +func Duration(p *durpb.Duration) (time.Duration, error) { + if err := validateDuration(p); err != nil { + return 0, err + } + d := time.Duration(p.Seconds) * time.Second + if int64(d/time.Second) != p.Seconds { + return 0, fmt.Errorf("duration: %v is out of range for time.Duration", p) + } + if p.Nanos != 0 { + d += time.Duration(p.Nanos) + if (d < 0) != (p.Nanos < 0) { + return 0, fmt.Errorf("duration: %v is out of range for time.Duration", p) + } + } + return d, nil +} + +// DurationProto converts a time.Duration to a durpb.Duration. +func DurationProto(d time.Duration) *durpb.Duration { + nanos := d.Nanoseconds() + secs := nanos / 1e9 + nanos -= secs * 1e9 + return &durpb.Duration{ + Seconds: secs, + Nanos: int32(nanos), + } +} diff --git a/api/vendor/github.com/golang/protobuf/ptypes/duration/duration.pb.go b/api/vendor/github.com/golang/protobuf/ptypes/duration/duration.pb.go new file mode 100644 index 0000000..4d75473 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/ptypes/duration/duration.pb.go @@ -0,0 +1,159 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/duration.proto + +package duration // import "github.com/golang/protobuf/ptypes/duration" + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +// A Duration represents a signed, fixed-length span of time represented +// as a count of seconds and fractions of seconds at nanosecond +// resolution. It is independent of any calendar and concepts like "day" +// or "month". It is related to Timestamp in that the difference between +// two Timestamp values is a Duration and it can be added or subtracted +// from a Timestamp. Range is approximately +-10,000 years. +// +// # Examples +// +// Example 1: Compute Duration from two Timestamps in pseudo code. +// +// Timestamp start = ...; +// Timestamp end = ...; +// Duration duration = ...; +// +// duration.seconds = end.seconds - start.seconds; +// duration.nanos = end.nanos - start.nanos; +// +// if (duration.seconds < 0 && duration.nanos > 0) { +// duration.seconds += 1; +// duration.nanos -= 1000000000; +// } else if (durations.seconds > 0 && duration.nanos < 0) { +// duration.seconds -= 1; +// duration.nanos += 1000000000; +// } +// +// Example 2: Compute Timestamp from Timestamp + Duration in pseudo code. +// +// Timestamp start = ...; +// Duration duration = ...; +// Timestamp end = ...; +// +// end.seconds = start.seconds + duration.seconds; +// end.nanos = start.nanos + duration.nanos; +// +// if (end.nanos < 0) { +// end.seconds -= 1; +// end.nanos += 1000000000; +// } else if (end.nanos >= 1000000000) { +// end.seconds += 1; +// end.nanos -= 1000000000; +// } +// +// Example 3: Compute Duration from datetime.timedelta in Python. +// +// td = datetime.timedelta(days=3, minutes=10) +// duration = Duration() +// duration.FromTimedelta(td) +// +// # JSON Mapping +// +// In JSON format, the Duration type is encoded as a string rather than an +// object, where the string ends in the suffix "s" (indicating seconds) and +// is preceded by the number of seconds, with nanoseconds expressed as +// fractional seconds. For example, 3 seconds with 0 nanoseconds should be +// encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should +// be expressed in JSON format as "3.000000001s", and 3 seconds and 1 +// microsecond should be expressed in JSON format as "3.000001s". +// +// +type Duration struct { + // Signed seconds of the span of time. Must be from -315,576,000,000 + // to +315,576,000,000 inclusive. Note: these bounds are computed from: + // 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years + Seconds int64 `protobuf:"varint,1,opt,name=seconds" json:"seconds,omitempty"` + // Signed fractions of a second at nanosecond resolution of the span + // of time. Durations less than one second are represented with a 0 + // `seconds` field and a positive or negative `nanos` field. For durations + // of one second or more, a non-zero value for the `nanos` field must be + // of the same sign as the `seconds` field. Must be from -999,999,999 + // to +999,999,999 inclusive. + Nanos int32 `protobuf:"varint,2,opt,name=nanos" json:"nanos,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Duration) Reset() { *m = Duration{} } +func (m *Duration) String() string { return proto.CompactTextString(m) } +func (*Duration) ProtoMessage() {} +func (*Duration) Descriptor() ([]byte, []int) { + return fileDescriptor_duration_e7d612259e3f0613, []int{0} +} +func (*Duration) XXX_WellKnownType() string { return "Duration" } +func (m *Duration) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Duration.Unmarshal(m, b) +} +func (m *Duration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Duration.Marshal(b, m, deterministic) +} +func (dst *Duration) XXX_Merge(src proto.Message) { + xxx_messageInfo_Duration.Merge(dst, src) +} +func (m *Duration) XXX_Size() int { + return xxx_messageInfo_Duration.Size(m) +} +func (m *Duration) XXX_DiscardUnknown() { + xxx_messageInfo_Duration.DiscardUnknown(m) +} + +var xxx_messageInfo_Duration proto.InternalMessageInfo + +func (m *Duration) GetSeconds() int64 { + if m != nil { + return m.Seconds + } + return 0 +} + +func (m *Duration) GetNanos() int32 { + if m != nil { + return m.Nanos + } + return 0 +} + +func init() { + proto.RegisterType((*Duration)(nil), "google.protobuf.Duration") +} + +func init() { + proto.RegisterFile("google/protobuf/duration.proto", fileDescriptor_duration_e7d612259e3f0613) +} + +var fileDescriptor_duration_e7d612259e3f0613 = []byte{ + // 190 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4b, 0xcf, 0xcf, 0x4f, + 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x4f, 0x29, 0x2d, 0x4a, + 0x2c, 0xc9, 0xcc, 0xcf, 0xd3, 0x03, 0x8b, 0x08, 0xf1, 0x43, 0xe4, 0xf5, 0x60, 0xf2, 0x4a, 0x56, + 0x5c, 0x1c, 0x2e, 0x50, 0x25, 0x42, 0x12, 0x5c, 0xec, 0xc5, 0xa9, 0xc9, 0xf9, 0x79, 0x29, 0xc5, + 0x12, 0x8c, 0x0a, 0x8c, 0x1a, 0xcc, 0x41, 0x30, 0xae, 0x90, 0x08, 0x17, 0x6b, 0x5e, 0x62, 0x5e, + 0x7e, 0xb1, 0x04, 0x93, 0x02, 0xa3, 0x06, 0x6b, 0x10, 0x84, 0xe3, 0x54, 0xc3, 0x25, 0x9c, 0x9c, + 0x9f, 0xab, 0x87, 0x66, 0xa4, 0x13, 0x2f, 0xcc, 0xc0, 0x00, 0x90, 0x48, 0x00, 0x63, 0x94, 0x56, + 0x7a, 0x66, 0x49, 0x46, 0x69, 0x92, 0x5e, 0x72, 0x7e, 0xae, 0x7e, 0x7a, 0x7e, 0x4e, 0x62, 0x5e, + 0x3a, 0xc2, 0x7d, 0x05, 0x25, 0x95, 0x05, 0xa9, 0xc5, 0x70, 0x67, 0xfe, 0x60, 0x64, 0x5c, 0xc4, + 0xc4, 0xec, 0x1e, 0xe0, 0xb4, 0x8a, 0x49, 0xce, 0x1d, 0x62, 0x6e, 0x00, 0x54, 0xa9, 0x5e, 0x78, + 0x6a, 0x4e, 0x8e, 0x77, 0x5e, 0x7e, 0x79, 0x5e, 0x08, 0x48, 0x4b, 0x12, 0x1b, 0xd8, 0x0c, 0x63, + 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdc, 0x84, 0x30, 0xff, 0xf3, 0x00, 0x00, 0x00, +} diff --git a/api/vendor/github.com/golang/protobuf/ptypes/duration/duration.proto b/api/vendor/github.com/golang/protobuf/ptypes/duration/duration.proto new file mode 100644 index 0000000..975fce4 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/ptypes/duration/duration.proto @@ -0,0 +1,117 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// 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. + +syntax = "proto3"; + +package google.protobuf; + +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option cc_enable_arenas = true; +option go_package = "github.com/golang/protobuf/ptypes/duration"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "DurationProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; + +// A Duration represents a signed, fixed-length span of time represented +// as a count of seconds and fractions of seconds at nanosecond +// resolution. It is independent of any calendar and concepts like "day" +// or "month". It is related to Timestamp in that the difference between +// two Timestamp values is a Duration and it can be added or subtracted +// from a Timestamp. Range is approximately +-10,000 years. +// +// # Examples +// +// Example 1: Compute Duration from two Timestamps in pseudo code. +// +// Timestamp start = ...; +// Timestamp end = ...; +// Duration duration = ...; +// +// duration.seconds = end.seconds - start.seconds; +// duration.nanos = end.nanos - start.nanos; +// +// if (duration.seconds < 0 && duration.nanos > 0) { +// duration.seconds += 1; +// duration.nanos -= 1000000000; +// } else if (durations.seconds > 0 && duration.nanos < 0) { +// duration.seconds -= 1; +// duration.nanos += 1000000000; +// } +// +// Example 2: Compute Timestamp from Timestamp + Duration in pseudo code. +// +// Timestamp start = ...; +// Duration duration = ...; +// Timestamp end = ...; +// +// end.seconds = start.seconds + duration.seconds; +// end.nanos = start.nanos + duration.nanos; +// +// if (end.nanos < 0) { +// end.seconds -= 1; +// end.nanos += 1000000000; +// } else if (end.nanos >= 1000000000) { +// end.seconds += 1; +// end.nanos -= 1000000000; +// } +// +// Example 3: Compute Duration from datetime.timedelta in Python. +// +// td = datetime.timedelta(days=3, minutes=10) +// duration = Duration() +// duration.FromTimedelta(td) +// +// # JSON Mapping +// +// In JSON format, the Duration type is encoded as a string rather than an +// object, where the string ends in the suffix "s" (indicating seconds) and +// is preceded by the number of seconds, with nanoseconds expressed as +// fractional seconds. For example, 3 seconds with 0 nanoseconds should be +// encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should +// be expressed in JSON format as "3.000000001s", and 3 seconds and 1 +// microsecond should be expressed in JSON format as "3.000001s". +// +// +message Duration { + + // Signed seconds of the span of time. Must be from -315,576,000,000 + // to +315,576,000,000 inclusive. Note: these bounds are computed from: + // 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years + int64 seconds = 1; + + // Signed fractions of a second at nanosecond resolution of the span + // of time. Durations less than one second are represented with a 0 + // `seconds` field and a positive or negative `nanos` field. For durations + // of one second or more, a non-zero value for the `nanos` field must be + // of the same sign as the `seconds` field. Must be from -999,999,999 + // to +999,999,999 inclusive. + int32 nanos = 2; +} diff --git a/api/vendor/github.com/golang/protobuf/ptypes/duration_test.go b/api/vendor/github.com/golang/protobuf/ptypes/duration_test.go new file mode 100644 index 0000000..e00491a --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/ptypes/duration_test.go @@ -0,0 +1,121 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package ptypes + +import ( + "math" + "testing" + "time" + + "github.com/golang/protobuf/proto" + durpb "github.com/golang/protobuf/ptypes/duration" +) + +const ( + minGoSeconds = math.MinInt64 / int64(1e9) + maxGoSeconds = math.MaxInt64 / int64(1e9) +) + +var durationTests = []struct { + proto *durpb.Duration + isValid bool + inRange bool + dur time.Duration +}{ + // The zero duration. + {&durpb.Duration{Seconds: 0, Nanos: 0}, true, true, 0}, + // Some ordinary non-zero durations. + {&durpb.Duration{Seconds: 100, Nanos: 0}, true, true, 100 * time.Second}, + {&durpb.Duration{Seconds: -100, Nanos: 0}, true, true, -100 * time.Second}, + {&durpb.Duration{Seconds: 100, Nanos: 987}, true, true, 100*time.Second + 987}, + {&durpb.Duration{Seconds: -100, Nanos: -987}, true, true, -(100*time.Second + 987)}, + // The largest duration representable in Go. + {&durpb.Duration{Seconds: maxGoSeconds, Nanos: int32(math.MaxInt64 - 1e9*maxGoSeconds)}, true, true, math.MaxInt64}, + // The smallest duration representable in Go. + {&durpb.Duration{Seconds: minGoSeconds, Nanos: int32(math.MinInt64 - 1e9*minGoSeconds)}, true, true, math.MinInt64}, + {nil, false, false, 0}, + {&durpb.Duration{Seconds: -100, Nanos: 987}, false, false, 0}, + {&durpb.Duration{Seconds: 100, Nanos: -987}, false, false, 0}, + {&durpb.Duration{Seconds: math.MinInt64, Nanos: 0}, false, false, 0}, + {&durpb.Duration{Seconds: math.MaxInt64, Nanos: 0}, false, false, 0}, + // The largest valid duration. + {&durpb.Duration{Seconds: maxSeconds, Nanos: 1e9 - 1}, true, false, 0}, + // The smallest valid duration. + {&durpb.Duration{Seconds: minSeconds, Nanos: -(1e9 - 1)}, true, false, 0}, + // The smallest invalid duration above the valid range. + {&durpb.Duration{Seconds: maxSeconds + 1, Nanos: 0}, false, false, 0}, + // The largest invalid duration below the valid range. + {&durpb.Duration{Seconds: minSeconds - 1, Nanos: -(1e9 - 1)}, false, false, 0}, + // One nanosecond past the largest duration representable in Go. + {&durpb.Duration{Seconds: maxGoSeconds, Nanos: int32(math.MaxInt64-1e9*maxGoSeconds) + 1}, true, false, 0}, + // One nanosecond past the smallest duration representable in Go. + {&durpb.Duration{Seconds: minGoSeconds, Nanos: int32(math.MinInt64-1e9*minGoSeconds) - 1}, true, false, 0}, + // One second past the largest duration representable in Go. + {&durpb.Duration{Seconds: maxGoSeconds + 1, Nanos: int32(math.MaxInt64 - 1e9*maxGoSeconds)}, true, false, 0}, + // One second past the smallest duration representable in Go. + {&durpb.Duration{Seconds: minGoSeconds - 1, Nanos: int32(math.MinInt64 - 1e9*minGoSeconds)}, true, false, 0}, +} + +func TestValidateDuration(t *testing.T) { + for _, test := range durationTests { + err := validateDuration(test.proto) + gotValid := (err == nil) + if gotValid != test.isValid { + t.Errorf("validateDuration(%v) = %t, want %t", test.proto, gotValid, test.isValid) + } + } +} + +func TestDuration(t *testing.T) { + for _, test := range durationTests { + got, err := Duration(test.proto) + gotOK := (err == nil) + wantOK := test.isValid && test.inRange + if gotOK != wantOK { + t.Errorf("Duration(%v) ok = %t, want %t", test.proto, gotOK, wantOK) + } + if err == nil && got != test.dur { + t.Errorf("Duration(%v) = %v, want %v", test.proto, got, test.dur) + } + } +} + +func TestDurationProto(t *testing.T) { + for _, test := range durationTests { + if test.isValid && test.inRange { + got := DurationProto(test.dur) + if !proto.Equal(got, test.proto) { + t.Errorf("DurationProto(%v) = %v, want %v", test.dur, got, test.proto) + } + } + } +} diff --git a/api/vendor/github.com/golang/protobuf/ptypes/empty/empty.pb.go b/api/vendor/github.com/golang/protobuf/ptypes/empty/empty.pb.go new file mode 100644 index 0000000..a69b403 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/ptypes/empty/empty.pb.go @@ -0,0 +1,79 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/empty.proto + +package empty // import "github.com/golang/protobuf/ptypes/empty" + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +// A generic empty message that you can re-use to avoid defining duplicated +// empty messages in your APIs. A typical example is to use it as the request +// or the response type of an API method. For instance: +// +// service Foo { +// rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); +// } +// +// The JSON representation for `Empty` is empty JSON object `{}`. +type Empty struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Empty) Reset() { *m = Empty{} } +func (m *Empty) String() string { return proto.CompactTextString(m) } +func (*Empty) ProtoMessage() {} +func (*Empty) Descriptor() ([]byte, []int) { + return fileDescriptor_empty_39e6d6db0632e5b2, []int{0} +} +func (*Empty) XXX_WellKnownType() string { return "Empty" } +func (m *Empty) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Empty.Unmarshal(m, b) +} +func (m *Empty) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Empty.Marshal(b, m, deterministic) +} +func (dst *Empty) XXX_Merge(src proto.Message) { + xxx_messageInfo_Empty.Merge(dst, src) +} +func (m *Empty) XXX_Size() int { + return xxx_messageInfo_Empty.Size(m) +} +func (m *Empty) XXX_DiscardUnknown() { + xxx_messageInfo_Empty.DiscardUnknown(m) +} + +var xxx_messageInfo_Empty proto.InternalMessageInfo + +func init() { + proto.RegisterType((*Empty)(nil), "google.protobuf.Empty") +} + +func init() { proto.RegisterFile("google/protobuf/empty.proto", fileDescriptor_empty_39e6d6db0632e5b2) } + +var fileDescriptor_empty_39e6d6db0632e5b2 = []byte{ + // 148 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4e, 0xcf, 0xcf, 0x4f, + 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x4f, 0xcd, 0x2d, 0x28, + 0xa9, 0xd4, 0x03, 0x73, 0x85, 0xf8, 0x21, 0x92, 0x7a, 0x30, 0x49, 0x25, 0x76, 0x2e, 0x56, 0x57, + 0x90, 0xbc, 0x53, 0x19, 0x97, 0x70, 0x72, 0x7e, 0xae, 0x1e, 0x9a, 0xbc, 0x13, 0x17, 0x58, 0x36, + 0x00, 0xc4, 0x0d, 0x60, 0x8c, 0x52, 0x4f, 0xcf, 0x2c, 0xc9, 0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, + 0xd5, 0x4f, 0xcf, 0xcf, 0x49, 0xcc, 0x4b, 0x47, 0x58, 0x53, 0x50, 0x52, 0x59, 0x90, 0x5a, 0x0c, + 0xb1, 0xed, 0x07, 0x23, 0xe3, 0x22, 0x26, 0x66, 0xf7, 0x00, 0xa7, 0x55, 0x4c, 0x72, 0xee, 0x10, + 0x13, 0x03, 0xa0, 0xea, 0xf4, 0xc2, 0x53, 0x73, 0x72, 0xbc, 0xf3, 0xf2, 0xcb, 0xf3, 0x42, 0x40, + 0xea, 0x93, 0xd8, 0xc0, 0x06, 0x18, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0x64, 0xd4, 0xb3, 0xa6, + 0xb7, 0x00, 0x00, 0x00, +} diff --git a/api/vendor/github.com/golang/protobuf/ptypes/empty/empty.proto b/api/vendor/github.com/golang/protobuf/ptypes/empty/empty.proto new file mode 100644 index 0000000..03cacd2 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/ptypes/empty/empty.proto @@ -0,0 +1,52 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// 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. + +syntax = "proto3"; + +package google.protobuf; + +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option go_package = "github.com/golang/protobuf/ptypes/empty"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "EmptyProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; +option cc_enable_arenas = true; + +// A generic empty message that you can re-use to avoid defining duplicated +// empty messages in your APIs. A typical example is to use it as the request +// or the response type of an API method. For instance: +// +// service Foo { +// rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); +// } +// +// The JSON representation for `Empty` is empty JSON object `{}`. +message Empty {} diff --git a/api/vendor/github.com/golang/protobuf/ptypes/struct/struct.pb.go b/api/vendor/github.com/golang/protobuf/ptypes/struct/struct.pb.go new file mode 100644 index 0000000..442c0e0 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/ptypes/struct/struct.pb.go @@ -0,0 +1,440 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/struct.proto + +package structpb // import "github.com/golang/protobuf/ptypes/struct" + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +// `NullValue` is a singleton enumeration to represent the null value for the +// `Value` type union. +// +// The JSON representation for `NullValue` is JSON `null`. +type NullValue int32 + +const ( + // Null value. + NullValue_NULL_VALUE NullValue = 0 +) + +var NullValue_name = map[int32]string{ + 0: "NULL_VALUE", +} +var NullValue_value = map[string]int32{ + "NULL_VALUE": 0, +} + +func (x NullValue) String() string { + return proto.EnumName(NullValue_name, int32(x)) +} +func (NullValue) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_struct_3a5a94e0c7801b27, []int{0} +} +func (NullValue) XXX_WellKnownType() string { return "NullValue" } + +// `Struct` represents a structured data value, consisting of fields +// which map to dynamically typed values. In some languages, `Struct` +// might be supported by a native representation. For example, in +// scripting languages like JS a struct is represented as an +// object. The details of that representation are described together +// with the proto support for the language. +// +// The JSON representation for `Struct` is JSON object. +type Struct struct { + // Unordered map of dynamically typed values. + Fields map[string]*Value `protobuf:"bytes,1,rep,name=fields" json:"fields,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Struct) Reset() { *m = Struct{} } +func (m *Struct) String() string { return proto.CompactTextString(m) } +func (*Struct) ProtoMessage() {} +func (*Struct) Descriptor() ([]byte, []int) { + return fileDescriptor_struct_3a5a94e0c7801b27, []int{0} +} +func (*Struct) XXX_WellKnownType() string { return "Struct" } +func (m *Struct) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Struct.Unmarshal(m, b) +} +func (m *Struct) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Struct.Marshal(b, m, deterministic) +} +func (dst *Struct) XXX_Merge(src proto.Message) { + xxx_messageInfo_Struct.Merge(dst, src) +} +func (m *Struct) XXX_Size() int { + return xxx_messageInfo_Struct.Size(m) +} +func (m *Struct) XXX_DiscardUnknown() { + xxx_messageInfo_Struct.DiscardUnknown(m) +} + +var xxx_messageInfo_Struct proto.InternalMessageInfo + +func (m *Struct) GetFields() map[string]*Value { + if m != nil { + return m.Fields + } + return nil +} + +// `Value` represents a dynamically typed value which can be either +// null, a number, a string, a boolean, a recursive struct value, or a +// list of values. A producer of value is expected to set one of that +// variants, absence of any variant indicates an error. +// +// The JSON representation for `Value` is JSON value. +type Value struct { + // The kind of value. + // + // Types that are valid to be assigned to Kind: + // *Value_NullValue + // *Value_NumberValue + // *Value_StringValue + // *Value_BoolValue + // *Value_StructValue + // *Value_ListValue + Kind isValue_Kind `protobuf_oneof:"kind"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Value) Reset() { *m = Value{} } +func (m *Value) String() string { return proto.CompactTextString(m) } +func (*Value) ProtoMessage() {} +func (*Value) Descriptor() ([]byte, []int) { + return fileDescriptor_struct_3a5a94e0c7801b27, []int{1} +} +func (*Value) XXX_WellKnownType() string { return "Value" } +func (m *Value) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Value.Unmarshal(m, b) +} +func (m *Value) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Value.Marshal(b, m, deterministic) +} +func (dst *Value) XXX_Merge(src proto.Message) { + xxx_messageInfo_Value.Merge(dst, src) +} +func (m *Value) XXX_Size() int { + return xxx_messageInfo_Value.Size(m) +} +func (m *Value) XXX_DiscardUnknown() { + xxx_messageInfo_Value.DiscardUnknown(m) +} + +var xxx_messageInfo_Value proto.InternalMessageInfo + +type isValue_Kind interface { + isValue_Kind() +} + +type Value_NullValue struct { + NullValue NullValue `protobuf:"varint,1,opt,name=null_value,json=nullValue,enum=google.protobuf.NullValue,oneof"` +} +type Value_NumberValue struct { + NumberValue float64 `protobuf:"fixed64,2,opt,name=number_value,json=numberValue,oneof"` +} +type Value_StringValue struct { + StringValue string `protobuf:"bytes,3,opt,name=string_value,json=stringValue,oneof"` +} +type Value_BoolValue struct { + BoolValue bool `protobuf:"varint,4,opt,name=bool_value,json=boolValue,oneof"` +} +type Value_StructValue struct { + StructValue *Struct `protobuf:"bytes,5,opt,name=struct_value,json=structValue,oneof"` +} +type Value_ListValue struct { + ListValue *ListValue `protobuf:"bytes,6,opt,name=list_value,json=listValue,oneof"` +} + +func (*Value_NullValue) isValue_Kind() {} +func (*Value_NumberValue) isValue_Kind() {} +func (*Value_StringValue) isValue_Kind() {} +func (*Value_BoolValue) isValue_Kind() {} +func (*Value_StructValue) isValue_Kind() {} +func (*Value_ListValue) isValue_Kind() {} + +func (m *Value) GetKind() isValue_Kind { + if m != nil { + return m.Kind + } + return nil +} + +func (m *Value) GetNullValue() NullValue { + if x, ok := m.GetKind().(*Value_NullValue); ok { + return x.NullValue + } + return NullValue_NULL_VALUE +} + +func (m *Value) GetNumberValue() float64 { + if x, ok := m.GetKind().(*Value_NumberValue); ok { + return x.NumberValue + } + return 0 +} + +func (m *Value) GetStringValue() string { + if x, ok := m.GetKind().(*Value_StringValue); ok { + return x.StringValue + } + return "" +} + +func (m *Value) GetBoolValue() bool { + if x, ok := m.GetKind().(*Value_BoolValue); ok { + return x.BoolValue + } + return false +} + +func (m *Value) GetStructValue() *Struct { + if x, ok := m.GetKind().(*Value_StructValue); ok { + return x.StructValue + } + return nil +} + +func (m *Value) GetListValue() *ListValue { + if x, ok := m.GetKind().(*Value_ListValue); ok { + return x.ListValue + } + return nil +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*Value) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _Value_OneofMarshaler, _Value_OneofUnmarshaler, _Value_OneofSizer, []interface{}{ + (*Value_NullValue)(nil), + (*Value_NumberValue)(nil), + (*Value_StringValue)(nil), + (*Value_BoolValue)(nil), + (*Value_StructValue)(nil), + (*Value_ListValue)(nil), + } +} + +func _Value_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*Value) + // kind + switch x := m.Kind.(type) { + case *Value_NullValue: + b.EncodeVarint(1<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.NullValue)) + case *Value_NumberValue: + b.EncodeVarint(2<<3 | proto.WireFixed64) + b.EncodeFixed64(math.Float64bits(x.NumberValue)) + case *Value_StringValue: + b.EncodeVarint(3<<3 | proto.WireBytes) + b.EncodeStringBytes(x.StringValue) + case *Value_BoolValue: + t := uint64(0) + if x.BoolValue { + t = 1 + } + b.EncodeVarint(4<<3 | proto.WireVarint) + b.EncodeVarint(t) + case *Value_StructValue: + b.EncodeVarint(5<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.StructValue); err != nil { + return err + } + case *Value_ListValue: + b.EncodeVarint(6<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.ListValue); err != nil { + return err + } + case nil: + default: + return fmt.Errorf("Value.Kind has unexpected type %T", x) + } + return nil +} + +func _Value_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*Value) + switch tag { + case 1: // kind.null_value + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Kind = &Value_NullValue{NullValue(x)} + return true, err + case 2: // kind.number_value + if wire != proto.WireFixed64 { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeFixed64() + m.Kind = &Value_NumberValue{math.Float64frombits(x)} + return true, err + case 3: // kind.string_value + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeStringBytes() + m.Kind = &Value_StringValue{x} + return true, err + case 4: // kind.bool_value + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Kind = &Value_BoolValue{x != 0} + return true, err + case 5: // kind.struct_value + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(Struct) + err := b.DecodeMessage(msg) + m.Kind = &Value_StructValue{msg} + return true, err + case 6: // kind.list_value + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(ListValue) + err := b.DecodeMessage(msg) + m.Kind = &Value_ListValue{msg} + return true, err + default: + return false, nil + } +} + +func _Value_OneofSizer(msg proto.Message) (n int) { + m := msg.(*Value) + // kind + switch x := m.Kind.(type) { + case *Value_NullValue: + n += 1 // tag and wire + n += proto.SizeVarint(uint64(x.NullValue)) + case *Value_NumberValue: + n += 1 // tag and wire + n += 8 + case *Value_StringValue: + n += 1 // tag and wire + n += proto.SizeVarint(uint64(len(x.StringValue))) + n += len(x.StringValue) + case *Value_BoolValue: + n += 1 // tag and wire + n += 1 + case *Value_StructValue: + s := proto.Size(x.StructValue) + n += 1 // tag and wire + n += proto.SizeVarint(uint64(s)) + n += s + case *Value_ListValue: + s := proto.Size(x.ListValue) + n += 1 // tag and wire + n += proto.SizeVarint(uint64(s)) + n += s + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +// `ListValue` is a wrapper around a repeated field of values. +// +// The JSON representation for `ListValue` is JSON array. +type ListValue struct { + // Repeated field of dynamically typed values. + Values []*Value `protobuf:"bytes,1,rep,name=values" json:"values,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ListValue) Reset() { *m = ListValue{} } +func (m *ListValue) String() string { return proto.CompactTextString(m) } +func (*ListValue) ProtoMessage() {} +func (*ListValue) Descriptor() ([]byte, []int) { + return fileDescriptor_struct_3a5a94e0c7801b27, []int{2} +} +func (*ListValue) XXX_WellKnownType() string { return "ListValue" } +func (m *ListValue) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ListValue.Unmarshal(m, b) +} +func (m *ListValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ListValue.Marshal(b, m, deterministic) +} +func (dst *ListValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_ListValue.Merge(dst, src) +} +func (m *ListValue) XXX_Size() int { + return xxx_messageInfo_ListValue.Size(m) +} +func (m *ListValue) XXX_DiscardUnknown() { + xxx_messageInfo_ListValue.DiscardUnknown(m) +} + +var xxx_messageInfo_ListValue proto.InternalMessageInfo + +func (m *ListValue) GetValues() []*Value { + if m != nil { + return m.Values + } + return nil +} + +func init() { + proto.RegisterType((*Struct)(nil), "google.protobuf.Struct") + proto.RegisterMapType((map[string]*Value)(nil), "google.protobuf.Struct.FieldsEntry") + proto.RegisterType((*Value)(nil), "google.protobuf.Value") + proto.RegisterType((*ListValue)(nil), "google.protobuf.ListValue") + proto.RegisterEnum("google.protobuf.NullValue", NullValue_name, NullValue_value) +} + +func init() { + proto.RegisterFile("google/protobuf/struct.proto", fileDescriptor_struct_3a5a94e0c7801b27) +} + +var fileDescriptor_struct_3a5a94e0c7801b27 = []byte{ + // 417 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x92, 0x41, 0x8b, 0xd3, 0x40, + 0x14, 0xc7, 0x3b, 0xc9, 0x36, 0x98, 0x17, 0x59, 0x97, 0x11, 0xb4, 0xac, 0xa2, 0xa1, 0x7b, 0x09, + 0x22, 0x29, 0xd6, 0x8b, 0x18, 0x2f, 0x06, 0xd6, 0x5d, 0x30, 0x2c, 0x31, 0xba, 0x15, 0xbc, 0x94, + 0x26, 0x4d, 0x63, 0xe8, 0x74, 0x26, 0x24, 0x33, 0x4a, 0x8f, 0x7e, 0x0b, 0xcf, 0x1e, 0x3d, 0xfa, + 0xe9, 0x3c, 0xca, 0xcc, 0x24, 0xa9, 0xb4, 0xf4, 0x94, 0xbc, 0xf7, 0x7e, 0xef, 0x3f, 0xef, 0xff, + 0x66, 0xe0, 0x71, 0xc1, 0x58, 0x41, 0xf2, 0x49, 0x55, 0x33, 0xce, 0x52, 0xb1, 0x9a, 0x34, 0xbc, + 0x16, 0x19, 0xf7, 0x55, 0x8c, 0xef, 0xe9, 0xaa, 0xdf, 0x55, 0xc7, 0x3f, 0x11, 0x58, 0x1f, 0x15, + 0x81, 0x03, 0xb0, 0x56, 0x65, 0x4e, 0x96, 0xcd, 0x08, 0xb9, 0xa6, 0xe7, 0x4c, 0x2f, 0xfc, 0x3d, + 0xd8, 0xd7, 0xa0, 0xff, 0x4e, 0x51, 0x97, 0x94, 0xd7, 0xdb, 0xa4, 0x6d, 0x39, 0xff, 0x00, 0xce, + 0x7f, 0x69, 0x7c, 0x06, 0xe6, 0x3a, 0xdf, 0x8e, 0x90, 0x8b, 0x3c, 0x3b, 0x91, 0xbf, 0xf8, 0x39, + 0x0c, 0xbf, 0x2d, 0x88, 0xc8, 0x47, 0x86, 0x8b, 0x3c, 0x67, 0xfa, 0xe0, 0x40, 0x7c, 0x26, 0xab, + 0x89, 0x86, 0x5e, 0x1b, 0xaf, 0xd0, 0xf8, 0x8f, 0x01, 0x43, 0x95, 0xc4, 0x01, 0x00, 0x15, 0x84, + 0xcc, 0xb5, 0x80, 0x14, 0x3d, 0x9d, 0x9e, 0x1f, 0x08, 0xdc, 0x08, 0x42, 0x14, 0x7f, 0x3d, 0x48, + 0x6c, 0xda, 0x05, 0xf8, 0x02, 0xee, 0x52, 0xb1, 0x49, 0xf3, 0x7a, 0xbe, 0x3b, 0x1f, 0x5d, 0x0f, + 0x12, 0x47, 0x67, 0x7b, 0xa8, 0xe1, 0x75, 0x49, 0x8b, 0x16, 0x32, 0xe5, 0xe0, 0x12, 0xd2, 0x59, + 0x0d, 0x3d, 0x05, 0x48, 0x19, 0xeb, 0xc6, 0x38, 0x71, 0x91, 0x77, 0x47, 0x1e, 0x25, 0x73, 0x1a, + 0x78, 0xa3, 0x54, 0x44, 0xc6, 0x5b, 0x64, 0xa8, 0xac, 0x3e, 0x3c, 0xb2, 0xc7, 0x56, 0x5e, 0x64, + 0xbc, 0x77, 0x49, 0xca, 0xa6, 0xeb, 0xb5, 0x54, 0xef, 0xa1, 0xcb, 0xa8, 0x6c, 0x78, 0xef, 0x92, + 0x74, 0x41, 0x68, 0xc1, 0xc9, 0xba, 0xa4, 0xcb, 0x71, 0x00, 0x76, 0x4f, 0x60, 0x1f, 0x2c, 0x25, + 0xd6, 0xdd, 0xe8, 0xb1, 0xa5, 0xb7, 0xd4, 0xb3, 0x47, 0x60, 0xf7, 0x4b, 0xc4, 0xa7, 0x00, 0x37, + 0xb7, 0x51, 0x34, 0x9f, 0xbd, 0x8d, 0x6e, 0x2f, 0xcf, 0x06, 0xe1, 0x0f, 0x04, 0xf7, 0x33, 0xb6, + 0xd9, 0x97, 0x08, 0x1d, 0xed, 0x26, 0x96, 0x71, 0x8c, 0xbe, 0xbc, 0x28, 0x4a, 0xfe, 0x55, 0xa4, + 0x7e, 0xc6, 0x36, 0x93, 0x82, 0x91, 0x05, 0x2d, 0x76, 0x4f, 0xb1, 0xe2, 0xdb, 0x2a, 0x6f, 0xda, + 0x17, 0x19, 0xe8, 0x4f, 0x95, 0xfe, 0x45, 0xe8, 0x97, 0x61, 0x5e, 0xc5, 0xe1, 0x6f, 0xe3, 0xc9, + 0x95, 0x16, 0x8f, 0xbb, 0xf9, 0x3e, 0xe7, 0x84, 0xbc, 0xa7, 0xec, 0x3b, 0xfd, 0x24, 0x3b, 0x53, + 0x4b, 0x49, 0xbd, 0xfc, 0x17, 0x00, 0x00, 0xff, 0xff, 0xe8, 0x1b, 0x59, 0xf8, 0xe5, 0x02, 0x00, + 0x00, +} diff --git a/api/vendor/github.com/golang/protobuf/ptypes/struct/struct.proto b/api/vendor/github.com/golang/protobuf/ptypes/struct/struct.proto new file mode 100644 index 0000000..7d7808e --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/ptypes/struct/struct.proto @@ -0,0 +1,96 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// 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. + +syntax = "proto3"; + +package google.protobuf; + +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option cc_enable_arenas = true; +option go_package = "github.com/golang/protobuf/ptypes/struct;structpb"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "StructProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; + + +// `Struct` represents a structured data value, consisting of fields +// which map to dynamically typed values. In some languages, `Struct` +// might be supported by a native representation. For example, in +// scripting languages like JS a struct is represented as an +// object. The details of that representation are described together +// with the proto support for the language. +// +// The JSON representation for `Struct` is JSON object. +message Struct { + // Unordered map of dynamically typed values. + map fields = 1; +} + +// `Value` represents a dynamically typed value which can be either +// null, a number, a string, a boolean, a recursive struct value, or a +// list of values. A producer of value is expected to set one of that +// variants, absence of any variant indicates an error. +// +// The JSON representation for `Value` is JSON value. +message Value { + // The kind of value. + oneof kind { + // Represents a null value. + NullValue null_value = 1; + // Represents a double value. + double number_value = 2; + // Represents a string value. + string string_value = 3; + // Represents a boolean value. + bool bool_value = 4; + // Represents a structured value. + Struct struct_value = 5; + // Represents a repeated `Value`. + ListValue list_value = 6; + } +} + +// `NullValue` is a singleton enumeration to represent the null value for the +// `Value` type union. +// +// The JSON representation for `NullValue` is JSON `null`. +enum NullValue { + // Null value. + NULL_VALUE = 0; +} + +// `ListValue` is a wrapper around a repeated field of values. +// +// The JSON representation for `ListValue` is JSON array. +message ListValue { + // Repeated field of dynamically typed values. + repeated Value values = 1; +} diff --git a/api/vendor/github.com/golang/protobuf/ptypes/timestamp.go b/api/vendor/github.com/golang/protobuf/ptypes/timestamp.go new file mode 100644 index 0000000..47f10db --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/ptypes/timestamp.go @@ -0,0 +1,134 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package ptypes + +// This file implements operations on google.protobuf.Timestamp. + +import ( + "errors" + "fmt" + "time" + + tspb "github.com/golang/protobuf/ptypes/timestamp" +) + +const ( + // Seconds field of the earliest valid Timestamp. + // This is time.Date(1, 1, 1, 0, 0, 0, 0, time.UTC).Unix(). + minValidSeconds = -62135596800 + // Seconds field just after the latest valid Timestamp. + // This is time.Date(10000, 1, 1, 0, 0, 0, 0, time.UTC).Unix(). + maxValidSeconds = 253402300800 +) + +// validateTimestamp determines whether a Timestamp is valid. +// A valid timestamp represents a time in the range +// [0001-01-01, 10000-01-01) and has a Nanos field +// in the range [0, 1e9). +// +// If the Timestamp is valid, validateTimestamp returns nil. +// Otherwise, it returns an error that describes +// the problem. +// +// Every valid Timestamp can be represented by a time.Time, but the converse is not true. +func validateTimestamp(ts *tspb.Timestamp) error { + if ts == nil { + return errors.New("timestamp: nil Timestamp") + } + if ts.Seconds < minValidSeconds { + return fmt.Errorf("timestamp: %v before 0001-01-01", ts) + } + if ts.Seconds >= maxValidSeconds { + return fmt.Errorf("timestamp: %v after 10000-01-01", ts) + } + if ts.Nanos < 0 || ts.Nanos >= 1e9 { + return fmt.Errorf("timestamp: %v: nanos not in range [0, 1e9)", ts) + } + return nil +} + +// Timestamp converts a google.protobuf.Timestamp proto to a time.Time. +// It returns an error if the argument is invalid. +// +// Unlike most Go functions, if Timestamp returns an error, the first return value +// is not the zero time.Time. Instead, it is the value obtained from the +// time.Unix function when passed the contents of the Timestamp, in the UTC +// locale. This may or may not be a meaningful time; many invalid Timestamps +// do map to valid time.Times. +// +// A nil Timestamp returns an error. The first return value in that case is +// undefined. +func Timestamp(ts *tspb.Timestamp) (time.Time, error) { + // Don't return the zero value on error, because corresponds to a valid + // timestamp. Instead return whatever time.Unix gives us. + var t time.Time + if ts == nil { + t = time.Unix(0, 0).UTC() // treat nil like the empty Timestamp + } else { + t = time.Unix(ts.Seconds, int64(ts.Nanos)).UTC() + } + return t, validateTimestamp(ts) +} + +// TimestampNow returns a google.protobuf.Timestamp for the current time. +func TimestampNow() *tspb.Timestamp { + ts, err := TimestampProto(time.Now()) + if err != nil { + panic("ptypes: time.Now() out of Timestamp range") + } + return ts +} + +// TimestampProto converts the time.Time to a google.protobuf.Timestamp proto. +// It returns an error if the resulting Timestamp is invalid. +func TimestampProto(t time.Time) (*tspb.Timestamp, error) { + seconds := t.Unix() + nanos := int32(t.Sub(time.Unix(seconds, 0))) + ts := &tspb.Timestamp{ + Seconds: seconds, + Nanos: nanos, + } + if err := validateTimestamp(ts); err != nil { + return nil, err + } + return ts, nil +} + +// TimestampString returns the RFC 3339 string for valid Timestamps. For invalid +// Timestamps, it returns an error message in parentheses. +func TimestampString(ts *tspb.Timestamp) string { + t, err := Timestamp(ts) + if err != nil { + return fmt.Sprintf("(%v)", err) + } + return t.Format(time.RFC3339Nano) +} diff --git a/api/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go b/api/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go new file mode 100644 index 0000000..e9c2222 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go @@ -0,0 +1,175 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/timestamp.proto + +package timestamp // import "github.com/golang/protobuf/ptypes/timestamp" + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +// A Timestamp represents a point in time independent of any time zone +// or calendar, represented as seconds and fractions of seconds at +// nanosecond resolution in UTC Epoch time. It is encoded using the +// Proleptic Gregorian Calendar which extends the Gregorian calendar +// backwards to year one. It is encoded assuming all minutes are 60 +// seconds long, i.e. leap seconds are "smeared" so that no leap second +// table is needed for interpretation. Range is from +// 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. +// By restricting to that range, we ensure that we can convert to +// and from RFC 3339 date strings. +// See [https://www.ietf.org/rfc/rfc3339.txt](https://www.ietf.org/rfc/rfc3339.txt). +// +// # Examples +// +// Example 1: Compute Timestamp from POSIX `time()`. +// +// Timestamp timestamp; +// timestamp.set_seconds(time(NULL)); +// timestamp.set_nanos(0); +// +// Example 2: Compute Timestamp from POSIX `gettimeofday()`. +// +// struct timeval tv; +// gettimeofday(&tv, NULL); +// +// Timestamp timestamp; +// timestamp.set_seconds(tv.tv_sec); +// timestamp.set_nanos(tv.tv_usec * 1000); +// +// Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`. +// +// FILETIME ft; +// GetSystemTimeAsFileTime(&ft); +// UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime; +// +// // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z +// // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z. +// Timestamp timestamp; +// timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL)); +// timestamp.set_nanos((INT32) ((ticks % 10000000) * 100)); +// +// Example 4: Compute Timestamp from Java `System.currentTimeMillis()`. +// +// long millis = System.currentTimeMillis(); +// +// Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000) +// .setNanos((int) ((millis % 1000) * 1000000)).build(); +// +// +// Example 5: Compute Timestamp from current time in Python. +// +// timestamp = Timestamp() +// timestamp.GetCurrentTime() +// +// # JSON Mapping +// +// In JSON format, the Timestamp type is encoded as a string in the +// [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the +// format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z" +// where {year} is always expressed using four digits while {month}, {day}, +// {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional +// seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution), +// are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone +// is required, though only UTC (as indicated by "Z") is presently supported. +// +// For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past +// 01:30 UTC on January 15, 2017. +// +// In JavaScript, one can convert a Date object to this format using the +// standard [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString] +// method. In Python, a standard `datetime.datetime` object can be converted +// to this format using [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) +// with the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one +// can use the Joda Time's [`ISODateTimeFormat.dateTime()`]( +// http://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime--) +// to obtain a formatter capable of generating timestamps in this format. +// +// +type Timestamp struct { + // Represents seconds of UTC time since Unix epoch + // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to + // 9999-12-31T23:59:59Z inclusive. + Seconds int64 `protobuf:"varint,1,opt,name=seconds" json:"seconds,omitempty"` + // Non-negative fractions of a second at nanosecond resolution. Negative + // second values with fractions must still have non-negative nanos values + // that count forward in time. Must be from 0 to 999,999,999 + // inclusive. + Nanos int32 `protobuf:"varint,2,opt,name=nanos" json:"nanos,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Timestamp) Reset() { *m = Timestamp{} } +func (m *Timestamp) String() string { return proto.CompactTextString(m) } +func (*Timestamp) ProtoMessage() {} +func (*Timestamp) Descriptor() ([]byte, []int) { + return fileDescriptor_timestamp_b826e8e5fba671a8, []int{0} +} +func (*Timestamp) XXX_WellKnownType() string { return "Timestamp" } +func (m *Timestamp) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Timestamp.Unmarshal(m, b) +} +func (m *Timestamp) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Timestamp.Marshal(b, m, deterministic) +} +func (dst *Timestamp) XXX_Merge(src proto.Message) { + xxx_messageInfo_Timestamp.Merge(dst, src) +} +func (m *Timestamp) XXX_Size() int { + return xxx_messageInfo_Timestamp.Size(m) +} +func (m *Timestamp) XXX_DiscardUnknown() { + xxx_messageInfo_Timestamp.DiscardUnknown(m) +} + +var xxx_messageInfo_Timestamp proto.InternalMessageInfo + +func (m *Timestamp) GetSeconds() int64 { + if m != nil { + return m.Seconds + } + return 0 +} + +func (m *Timestamp) GetNanos() int32 { + if m != nil { + return m.Nanos + } + return 0 +} + +func init() { + proto.RegisterType((*Timestamp)(nil), "google.protobuf.Timestamp") +} + +func init() { + proto.RegisterFile("google/protobuf/timestamp.proto", fileDescriptor_timestamp_b826e8e5fba671a8) +} + +var fileDescriptor_timestamp_b826e8e5fba671a8 = []byte{ + // 191 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4f, 0xcf, 0xcf, 0x4f, + 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x2f, 0xc9, 0xcc, 0x4d, + 0x2d, 0x2e, 0x49, 0xcc, 0x2d, 0xd0, 0x03, 0x0b, 0x09, 0xf1, 0x43, 0x14, 0xe8, 0xc1, 0x14, 0x28, + 0x59, 0x73, 0x71, 0x86, 0xc0, 0xd4, 0x08, 0x49, 0x70, 0xb1, 0x17, 0xa7, 0x26, 0xe7, 0xe7, 0xa5, + 0x14, 0x4b, 0x30, 0x2a, 0x30, 0x6a, 0x30, 0x07, 0xc1, 0xb8, 0x42, 0x22, 0x5c, 0xac, 0x79, 0x89, + 0x79, 0xf9, 0xc5, 0x12, 0x4c, 0x0a, 0x8c, 0x1a, 0xac, 0x41, 0x10, 0x8e, 0x53, 0x1d, 0x97, 0x70, + 0x72, 0x7e, 0xae, 0x1e, 0x9a, 0x99, 0x4e, 0x7c, 0x70, 0x13, 0x03, 0x40, 0x42, 0x01, 0x8c, 0x51, + 0xda, 0xe9, 0x99, 0x25, 0x19, 0xa5, 0x49, 0x7a, 0xc9, 0xf9, 0xb9, 0xfa, 0xe9, 0xf9, 0x39, 0x89, + 0x79, 0xe9, 0x08, 0x27, 0x16, 0x94, 0x54, 0x16, 0xa4, 0x16, 0x23, 0x5c, 0xfa, 0x83, 0x91, 0x71, + 0x11, 0x13, 0xb3, 0x7b, 0x80, 0xd3, 0x2a, 0x26, 0x39, 0x77, 0x88, 0xc9, 0x01, 0x50, 0xb5, 0x7a, + 0xe1, 0xa9, 0x39, 0x39, 0xde, 0x79, 0xf9, 0xe5, 0x79, 0x21, 0x20, 0x3d, 0x49, 0x6c, 0x60, 0x43, + 0x8c, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xbc, 0x77, 0x4a, 0x07, 0xf7, 0x00, 0x00, 0x00, +} diff --git a/api/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.proto b/api/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.proto new file mode 100644 index 0000000..06750ab --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.proto @@ -0,0 +1,133 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// 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. + +syntax = "proto3"; + +package google.protobuf; + +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option cc_enable_arenas = true; +option go_package = "github.com/golang/protobuf/ptypes/timestamp"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "TimestampProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; + +// A Timestamp represents a point in time independent of any time zone +// or calendar, represented as seconds and fractions of seconds at +// nanosecond resolution in UTC Epoch time. It is encoded using the +// Proleptic Gregorian Calendar which extends the Gregorian calendar +// backwards to year one. It is encoded assuming all minutes are 60 +// seconds long, i.e. leap seconds are "smeared" so that no leap second +// table is needed for interpretation. Range is from +// 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. +// By restricting to that range, we ensure that we can convert to +// and from RFC 3339 date strings. +// See [https://www.ietf.org/rfc/rfc3339.txt](https://www.ietf.org/rfc/rfc3339.txt). +// +// # Examples +// +// Example 1: Compute Timestamp from POSIX `time()`. +// +// Timestamp timestamp; +// timestamp.set_seconds(time(NULL)); +// timestamp.set_nanos(0); +// +// Example 2: Compute Timestamp from POSIX `gettimeofday()`. +// +// struct timeval tv; +// gettimeofday(&tv, NULL); +// +// Timestamp timestamp; +// timestamp.set_seconds(tv.tv_sec); +// timestamp.set_nanos(tv.tv_usec * 1000); +// +// Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`. +// +// FILETIME ft; +// GetSystemTimeAsFileTime(&ft); +// UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime; +// +// // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z +// // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z. +// Timestamp timestamp; +// timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL)); +// timestamp.set_nanos((INT32) ((ticks % 10000000) * 100)); +// +// Example 4: Compute Timestamp from Java `System.currentTimeMillis()`. +// +// long millis = System.currentTimeMillis(); +// +// Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000) +// .setNanos((int) ((millis % 1000) * 1000000)).build(); +// +// +// Example 5: Compute Timestamp from current time in Python. +// +// timestamp = Timestamp() +// timestamp.GetCurrentTime() +// +// # JSON Mapping +// +// In JSON format, the Timestamp type is encoded as a string in the +// [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the +// format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z" +// where {year} is always expressed using four digits while {month}, {day}, +// {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional +// seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution), +// are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone +// is required, though only UTC (as indicated by "Z") is presently supported. +// +// For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past +// 01:30 UTC on January 15, 2017. +// +// In JavaScript, one can convert a Date object to this format using the +// standard [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString] +// method. In Python, a standard `datetime.datetime` object can be converted +// to this format using [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) +// with the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one +// can use the Joda Time's [`ISODateTimeFormat.dateTime()`]( +// http://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime--) +// to obtain a formatter capable of generating timestamps in this format. +// +// +message Timestamp { + + // Represents seconds of UTC time since Unix epoch + // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to + // 9999-12-31T23:59:59Z inclusive. + int64 seconds = 1; + + // Non-negative fractions of a second at nanosecond resolution. Negative + // second values with fractions must still have non-negative nanos values + // that count forward in time. Must be from 0 to 999,999,999 + // inclusive. + int32 nanos = 2; +} diff --git a/api/vendor/github.com/golang/protobuf/ptypes/timestamp_test.go b/api/vendor/github.com/golang/protobuf/ptypes/timestamp_test.go new file mode 100644 index 0000000..6e3c969 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/ptypes/timestamp_test.go @@ -0,0 +1,153 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package ptypes + +import ( + "math" + "testing" + "time" + + "github.com/golang/protobuf/proto" + tspb "github.com/golang/protobuf/ptypes/timestamp" +) + +var tests = []struct { + ts *tspb.Timestamp + valid bool + t time.Time +}{ + // The timestamp representing the Unix epoch date. + {&tspb.Timestamp{Seconds: 0, Nanos: 0}, true, utcDate(1970, 1, 1)}, + // The smallest representable timestamp. + {&tspb.Timestamp{Seconds: math.MinInt64, Nanos: math.MinInt32}, false, + time.Unix(math.MinInt64, math.MinInt32).UTC()}, + // The smallest representable timestamp with non-negative nanos. + {&tspb.Timestamp{Seconds: math.MinInt64, Nanos: 0}, false, time.Unix(math.MinInt64, 0).UTC()}, + // The earliest valid timestamp. + {&tspb.Timestamp{Seconds: minValidSeconds, Nanos: 0}, true, utcDate(1, 1, 1)}, + //"0001-01-01T00:00:00Z"}, + // The largest representable timestamp. + {&tspb.Timestamp{Seconds: math.MaxInt64, Nanos: math.MaxInt32}, false, + time.Unix(math.MaxInt64, math.MaxInt32).UTC()}, + // The largest representable timestamp with nanos in range. + {&tspb.Timestamp{Seconds: math.MaxInt64, Nanos: 1e9 - 1}, false, + time.Unix(math.MaxInt64, 1e9-1).UTC()}, + // The largest valid timestamp. + {&tspb.Timestamp{Seconds: maxValidSeconds - 1, Nanos: 1e9 - 1}, true, + time.Date(9999, 12, 31, 23, 59, 59, 1e9-1, time.UTC)}, + // The smallest invalid timestamp that is larger than the valid range. + {&tspb.Timestamp{Seconds: maxValidSeconds, Nanos: 0}, false, time.Unix(maxValidSeconds, 0).UTC()}, + // A date before the epoch. + {&tspb.Timestamp{Seconds: -281836800, Nanos: 0}, true, utcDate(1961, 1, 26)}, + // A date after the epoch. + {&tspb.Timestamp{Seconds: 1296000000, Nanos: 0}, true, utcDate(2011, 1, 26)}, + // A date after the epoch, in the middle of the day. + {&tspb.Timestamp{Seconds: 1296012345, Nanos: 940483}, true, + time.Date(2011, 1, 26, 3, 25, 45, 940483, time.UTC)}, +} + +func TestValidateTimestamp(t *testing.T) { + for _, s := range tests { + got := validateTimestamp(s.ts) + if (got == nil) != s.valid { + t.Errorf("validateTimestamp(%v) = %v, want %v", s.ts, got, s.valid) + } + } +} + +func TestTimestamp(t *testing.T) { + for _, s := range tests { + got, err := Timestamp(s.ts) + if (err == nil) != s.valid { + t.Errorf("Timestamp(%v) error = %v, but valid = %t", s.ts, err, s.valid) + } else if s.valid && got != s.t { + t.Errorf("Timestamp(%v) = %v, want %v", s.ts, got, s.t) + } + } + // Special case: a nil Timestamp is an error, but returns the 0 Unix time. + got, err := Timestamp(nil) + want := time.Unix(0, 0).UTC() + if got != want { + t.Errorf("Timestamp(nil) = %v, want %v", got, want) + } + if err == nil { + t.Errorf("Timestamp(nil) error = nil, expected error") + } +} + +func TestTimestampProto(t *testing.T) { + for _, s := range tests { + got, err := TimestampProto(s.t) + if (err == nil) != s.valid { + t.Errorf("TimestampProto(%v) error = %v, but valid = %t", s.t, err, s.valid) + } else if s.valid && !proto.Equal(got, s.ts) { + t.Errorf("TimestampProto(%v) = %v, want %v", s.t, got, s.ts) + } + } + // No corresponding special case here: no time.Time results in a nil Timestamp. +} + +func TestTimestampString(t *testing.T) { + for _, test := range []struct { + ts *tspb.Timestamp + want string + }{ + // Not much testing needed because presumably time.Format is + // well-tested. + {&tspb.Timestamp{Seconds: 0, Nanos: 0}, "1970-01-01T00:00:00Z"}, + {&tspb.Timestamp{Seconds: minValidSeconds - 1, Nanos: 0}, "(timestamp: seconds:-62135596801 before 0001-01-01)"}, + } { + got := TimestampString(test.ts) + if got != test.want { + t.Errorf("TimestampString(%v) = %q, want %q", test.ts, got, test.want) + } + } +} + +func utcDate(year, month, day int) time.Time { + return time.Date(year, time.Month(month), day, 0, 0, 0, 0, time.UTC) +} + +func TestTimestampNow(t *testing.T) { + // Bracket the expected time. + before := time.Now() + ts := TimestampNow() + after := time.Now() + + tm, err := Timestamp(ts) + if err != nil { + t.Errorf("between %v and %v\nTimestampNow() = %v\nwhich is invalid (%v)", before, after, ts, err) + } + if tm.Before(before) || tm.After(after) { + t.Errorf("between %v and %v\nTimestamp(TimestampNow()) = %v", before, after, tm) + } +} diff --git a/api/vendor/github.com/golang/protobuf/ptypes/wrappers/wrappers.pb.go b/api/vendor/github.com/golang/protobuf/ptypes/wrappers/wrappers.pb.go new file mode 100644 index 0000000..d1fc4d0 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/ptypes/wrappers/wrappers.pb.go @@ -0,0 +1,443 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/wrappers.proto + +package wrappers // import "github.com/golang/protobuf/ptypes/wrappers" + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +// Wrapper message for `double`. +// +// The JSON representation for `DoubleValue` is JSON number. +type DoubleValue struct { + // The double value. + Value float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DoubleValue) Reset() { *m = DoubleValue{} } +func (m *DoubleValue) String() string { return proto.CompactTextString(m) } +func (*DoubleValue) ProtoMessage() {} +func (*DoubleValue) Descriptor() ([]byte, []int) { + return fileDescriptor_wrappers_16c7c35c009f3253, []int{0} +} +func (*DoubleValue) XXX_WellKnownType() string { return "DoubleValue" } +func (m *DoubleValue) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DoubleValue.Unmarshal(m, b) +} +func (m *DoubleValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DoubleValue.Marshal(b, m, deterministic) +} +func (dst *DoubleValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_DoubleValue.Merge(dst, src) +} +func (m *DoubleValue) XXX_Size() int { + return xxx_messageInfo_DoubleValue.Size(m) +} +func (m *DoubleValue) XXX_DiscardUnknown() { + xxx_messageInfo_DoubleValue.DiscardUnknown(m) +} + +var xxx_messageInfo_DoubleValue proto.InternalMessageInfo + +func (m *DoubleValue) GetValue() float64 { + if m != nil { + return m.Value + } + return 0 +} + +// Wrapper message for `float`. +// +// The JSON representation for `FloatValue` is JSON number. +type FloatValue struct { + // The float value. + Value float32 `protobuf:"fixed32,1,opt,name=value" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *FloatValue) Reset() { *m = FloatValue{} } +func (m *FloatValue) String() string { return proto.CompactTextString(m) } +func (*FloatValue) ProtoMessage() {} +func (*FloatValue) Descriptor() ([]byte, []int) { + return fileDescriptor_wrappers_16c7c35c009f3253, []int{1} +} +func (*FloatValue) XXX_WellKnownType() string { return "FloatValue" } +func (m *FloatValue) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_FloatValue.Unmarshal(m, b) +} +func (m *FloatValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_FloatValue.Marshal(b, m, deterministic) +} +func (dst *FloatValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_FloatValue.Merge(dst, src) +} +func (m *FloatValue) XXX_Size() int { + return xxx_messageInfo_FloatValue.Size(m) +} +func (m *FloatValue) XXX_DiscardUnknown() { + xxx_messageInfo_FloatValue.DiscardUnknown(m) +} + +var xxx_messageInfo_FloatValue proto.InternalMessageInfo + +func (m *FloatValue) GetValue() float32 { + if m != nil { + return m.Value + } + return 0 +} + +// Wrapper message for `int64`. +// +// The JSON representation for `Int64Value` is JSON string. +type Int64Value struct { + // The int64 value. + Value int64 `protobuf:"varint,1,opt,name=value" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Int64Value) Reset() { *m = Int64Value{} } +func (m *Int64Value) String() string { return proto.CompactTextString(m) } +func (*Int64Value) ProtoMessage() {} +func (*Int64Value) Descriptor() ([]byte, []int) { + return fileDescriptor_wrappers_16c7c35c009f3253, []int{2} +} +func (*Int64Value) XXX_WellKnownType() string { return "Int64Value" } +func (m *Int64Value) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Int64Value.Unmarshal(m, b) +} +func (m *Int64Value) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Int64Value.Marshal(b, m, deterministic) +} +func (dst *Int64Value) XXX_Merge(src proto.Message) { + xxx_messageInfo_Int64Value.Merge(dst, src) +} +func (m *Int64Value) XXX_Size() int { + return xxx_messageInfo_Int64Value.Size(m) +} +func (m *Int64Value) XXX_DiscardUnknown() { + xxx_messageInfo_Int64Value.DiscardUnknown(m) +} + +var xxx_messageInfo_Int64Value proto.InternalMessageInfo + +func (m *Int64Value) GetValue() int64 { + if m != nil { + return m.Value + } + return 0 +} + +// Wrapper message for `uint64`. +// +// The JSON representation for `UInt64Value` is JSON string. +type UInt64Value struct { + // The uint64 value. + Value uint64 `protobuf:"varint,1,opt,name=value" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *UInt64Value) Reset() { *m = UInt64Value{} } +func (m *UInt64Value) String() string { return proto.CompactTextString(m) } +func (*UInt64Value) ProtoMessage() {} +func (*UInt64Value) Descriptor() ([]byte, []int) { + return fileDescriptor_wrappers_16c7c35c009f3253, []int{3} +} +func (*UInt64Value) XXX_WellKnownType() string { return "UInt64Value" } +func (m *UInt64Value) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_UInt64Value.Unmarshal(m, b) +} +func (m *UInt64Value) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_UInt64Value.Marshal(b, m, deterministic) +} +func (dst *UInt64Value) XXX_Merge(src proto.Message) { + xxx_messageInfo_UInt64Value.Merge(dst, src) +} +func (m *UInt64Value) XXX_Size() int { + return xxx_messageInfo_UInt64Value.Size(m) +} +func (m *UInt64Value) XXX_DiscardUnknown() { + xxx_messageInfo_UInt64Value.DiscardUnknown(m) +} + +var xxx_messageInfo_UInt64Value proto.InternalMessageInfo + +func (m *UInt64Value) GetValue() uint64 { + if m != nil { + return m.Value + } + return 0 +} + +// Wrapper message for `int32`. +// +// The JSON representation for `Int32Value` is JSON number. +type Int32Value struct { + // The int32 value. + Value int32 `protobuf:"varint,1,opt,name=value" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Int32Value) Reset() { *m = Int32Value{} } +func (m *Int32Value) String() string { return proto.CompactTextString(m) } +func (*Int32Value) ProtoMessage() {} +func (*Int32Value) Descriptor() ([]byte, []int) { + return fileDescriptor_wrappers_16c7c35c009f3253, []int{4} +} +func (*Int32Value) XXX_WellKnownType() string { return "Int32Value" } +func (m *Int32Value) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Int32Value.Unmarshal(m, b) +} +func (m *Int32Value) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Int32Value.Marshal(b, m, deterministic) +} +func (dst *Int32Value) XXX_Merge(src proto.Message) { + xxx_messageInfo_Int32Value.Merge(dst, src) +} +func (m *Int32Value) XXX_Size() int { + return xxx_messageInfo_Int32Value.Size(m) +} +func (m *Int32Value) XXX_DiscardUnknown() { + xxx_messageInfo_Int32Value.DiscardUnknown(m) +} + +var xxx_messageInfo_Int32Value proto.InternalMessageInfo + +func (m *Int32Value) GetValue() int32 { + if m != nil { + return m.Value + } + return 0 +} + +// Wrapper message for `uint32`. +// +// The JSON representation for `UInt32Value` is JSON number. +type UInt32Value struct { + // The uint32 value. + Value uint32 `protobuf:"varint,1,opt,name=value" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *UInt32Value) Reset() { *m = UInt32Value{} } +func (m *UInt32Value) String() string { return proto.CompactTextString(m) } +func (*UInt32Value) ProtoMessage() {} +func (*UInt32Value) Descriptor() ([]byte, []int) { + return fileDescriptor_wrappers_16c7c35c009f3253, []int{5} +} +func (*UInt32Value) XXX_WellKnownType() string { return "UInt32Value" } +func (m *UInt32Value) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_UInt32Value.Unmarshal(m, b) +} +func (m *UInt32Value) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_UInt32Value.Marshal(b, m, deterministic) +} +func (dst *UInt32Value) XXX_Merge(src proto.Message) { + xxx_messageInfo_UInt32Value.Merge(dst, src) +} +func (m *UInt32Value) XXX_Size() int { + return xxx_messageInfo_UInt32Value.Size(m) +} +func (m *UInt32Value) XXX_DiscardUnknown() { + xxx_messageInfo_UInt32Value.DiscardUnknown(m) +} + +var xxx_messageInfo_UInt32Value proto.InternalMessageInfo + +func (m *UInt32Value) GetValue() uint32 { + if m != nil { + return m.Value + } + return 0 +} + +// Wrapper message for `bool`. +// +// The JSON representation for `BoolValue` is JSON `true` and `false`. +type BoolValue struct { + // The bool value. + Value bool `protobuf:"varint,1,opt,name=value" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *BoolValue) Reset() { *m = BoolValue{} } +func (m *BoolValue) String() string { return proto.CompactTextString(m) } +func (*BoolValue) ProtoMessage() {} +func (*BoolValue) Descriptor() ([]byte, []int) { + return fileDescriptor_wrappers_16c7c35c009f3253, []int{6} +} +func (*BoolValue) XXX_WellKnownType() string { return "BoolValue" } +func (m *BoolValue) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_BoolValue.Unmarshal(m, b) +} +func (m *BoolValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_BoolValue.Marshal(b, m, deterministic) +} +func (dst *BoolValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_BoolValue.Merge(dst, src) +} +func (m *BoolValue) XXX_Size() int { + return xxx_messageInfo_BoolValue.Size(m) +} +func (m *BoolValue) XXX_DiscardUnknown() { + xxx_messageInfo_BoolValue.DiscardUnknown(m) +} + +var xxx_messageInfo_BoolValue proto.InternalMessageInfo + +func (m *BoolValue) GetValue() bool { + if m != nil { + return m.Value + } + return false +} + +// Wrapper message for `string`. +// +// The JSON representation for `StringValue` is JSON string. +type StringValue struct { + // The string value. + Value string `protobuf:"bytes,1,opt,name=value" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *StringValue) Reset() { *m = StringValue{} } +func (m *StringValue) String() string { return proto.CompactTextString(m) } +func (*StringValue) ProtoMessage() {} +func (*StringValue) Descriptor() ([]byte, []int) { + return fileDescriptor_wrappers_16c7c35c009f3253, []int{7} +} +func (*StringValue) XXX_WellKnownType() string { return "StringValue" } +func (m *StringValue) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_StringValue.Unmarshal(m, b) +} +func (m *StringValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_StringValue.Marshal(b, m, deterministic) +} +func (dst *StringValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_StringValue.Merge(dst, src) +} +func (m *StringValue) XXX_Size() int { + return xxx_messageInfo_StringValue.Size(m) +} +func (m *StringValue) XXX_DiscardUnknown() { + xxx_messageInfo_StringValue.DiscardUnknown(m) +} + +var xxx_messageInfo_StringValue proto.InternalMessageInfo + +func (m *StringValue) GetValue() string { + if m != nil { + return m.Value + } + return "" +} + +// Wrapper message for `bytes`. +// +// The JSON representation for `BytesValue` is JSON string. +type BytesValue struct { + // The bytes value. + Value []byte `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *BytesValue) Reset() { *m = BytesValue{} } +func (m *BytesValue) String() string { return proto.CompactTextString(m) } +func (*BytesValue) ProtoMessage() {} +func (*BytesValue) Descriptor() ([]byte, []int) { + return fileDescriptor_wrappers_16c7c35c009f3253, []int{8} +} +func (*BytesValue) XXX_WellKnownType() string { return "BytesValue" } +func (m *BytesValue) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_BytesValue.Unmarshal(m, b) +} +func (m *BytesValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_BytesValue.Marshal(b, m, deterministic) +} +func (dst *BytesValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_BytesValue.Merge(dst, src) +} +func (m *BytesValue) XXX_Size() int { + return xxx_messageInfo_BytesValue.Size(m) +} +func (m *BytesValue) XXX_DiscardUnknown() { + xxx_messageInfo_BytesValue.DiscardUnknown(m) +} + +var xxx_messageInfo_BytesValue proto.InternalMessageInfo + +func (m *BytesValue) GetValue() []byte { + if m != nil { + return m.Value + } + return nil +} + +func init() { + proto.RegisterType((*DoubleValue)(nil), "google.protobuf.DoubleValue") + proto.RegisterType((*FloatValue)(nil), "google.protobuf.FloatValue") + proto.RegisterType((*Int64Value)(nil), "google.protobuf.Int64Value") + proto.RegisterType((*UInt64Value)(nil), "google.protobuf.UInt64Value") + proto.RegisterType((*Int32Value)(nil), "google.protobuf.Int32Value") + proto.RegisterType((*UInt32Value)(nil), "google.protobuf.UInt32Value") + proto.RegisterType((*BoolValue)(nil), "google.protobuf.BoolValue") + proto.RegisterType((*StringValue)(nil), "google.protobuf.StringValue") + proto.RegisterType((*BytesValue)(nil), "google.protobuf.BytesValue") +} + +func init() { + proto.RegisterFile("google/protobuf/wrappers.proto", fileDescriptor_wrappers_16c7c35c009f3253) +} + +var fileDescriptor_wrappers_16c7c35c009f3253 = []byte{ + // 259 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4b, 0xcf, 0xcf, 0x4f, + 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x2f, 0x2f, 0x4a, 0x2c, + 0x28, 0x48, 0x2d, 0x2a, 0xd6, 0x03, 0x8b, 0x08, 0xf1, 0x43, 0xe4, 0xf5, 0x60, 0xf2, 0x4a, 0xca, + 0x5c, 0xdc, 0x2e, 0xf9, 0xa5, 0x49, 0x39, 0xa9, 0x61, 0x89, 0x39, 0xa5, 0xa9, 0x42, 0x22, 0x5c, + 0xac, 0x65, 0x20, 0x86, 0x04, 0xa3, 0x02, 0xa3, 0x06, 0x63, 0x10, 0x84, 0xa3, 0xa4, 0xc4, 0xc5, + 0xe5, 0x96, 0x93, 0x9f, 0x58, 0x82, 0x45, 0x0d, 0x13, 0x92, 0x1a, 0xcf, 0xbc, 0x12, 0x33, 0x13, + 0x2c, 0x6a, 0x98, 0x61, 0x6a, 0x94, 0xb9, 0xb8, 0x43, 0x71, 0x29, 0x62, 0x41, 0x35, 0xc8, 0xd8, + 0x08, 0x8b, 0x1a, 0x56, 0x34, 0x83, 0xb0, 0x2a, 0xe2, 0x85, 0x29, 0x52, 0xe4, 0xe2, 0x74, 0xca, + 0xcf, 0xcf, 0xc1, 0xa2, 0x84, 0x03, 0xc9, 0x9c, 0xe0, 0x92, 0xa2, 0xcc, 0xbc, 0x74, 0x2c, 0x8a, + 0x38, 0x91, 0x1c, 0xe4, 0x54, 0x59, 0x92, 0x5a, 0x8c, 0x45, 0x0d, 0x0f, 0x54, 0x8d, 0x53, 0x0d, + 0x97, 0x70, 0x72, 0x7e, 0xae, 0x1e, 0x5a, 0xe8, 0x3a, 0xf1, 0x86, 0x43, 0x83, 0x3f, 0x00, 0x24, + 0x12, 0xc0, 0x18, 0xa5, 0x95, 0x9e, 0x59, 0x92, 0x51, 0x9a, 0xa4, 0x97, 0x9c, 0x9f, 0xab, 0x9f, + 0x9e, 0x9f, 0x93, 0x98, 0x97, 0x8e, 0x88, 0xaa, 0x82, 0x92, 0xca, 0x82, 0xd4, 0x62, 0x78, 0x8c, + 0xfd, 0x60, 0x64, 0x5c, 0xc4, 0xc4, 0xec, 0x1e, 0xe0, 0xb4, 0x8a, 0x49, 0xce, 0x1d, 0x62, 0x6e, + 0x00, 0x54, 0xa9, 0x5e, 0x78, 0x6a, 0x4e, 0x8e, 0x77, 0x5e, 0x7e, 0x79, 0x5e, 0x08, 0x48, 0x4b, + 0x12, 0x1b, 0xd8, 0x0c, 0x63, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0x19, 0x6c, 0xb9, 0xb8, 0xfe, + 0x01, 0x00, 0x00, +} diff --git a/api/vendor/github.com/golang/protobuf/ptypes/wrappers/wrappers.proto b/api/vendor/github.com/golang/protobuf/ptypes/wrappers/wrappers.proto new file mode 100644 index 0000000..0194763 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/ptypes/wrappers/wrappers.proto @@ -0,0 +1,118 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// 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. + +// Wrappers for primitive (non-message) types. These types are useful +// for embedding primitives in the `google.protobuf.Any` type and for places +// where we need to distinguish between the absence of a primitive +// typed field and its default value. + +syntax = "proto3"; + +package google.protobuf; + +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option cc_enable_arenas = true; +option go_package = "github.com/golang/protobuf/ptypes/wrappers"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "WrappersProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; + +// Wrapper message for `double`. +// +// The JSON representation for `DoubleValue` is JSON number. +message DoubleValue { + // The double value. + double value = 1; +} + +// Wrapper message for `float`. +// +// The JSON representation for `FloatValue` is JSON number. +message FloatValue { + // The float value. + float value = 1; +} + +// Wrapper message for `int64`. +// +// The JSON representation for `Int64Value` is JSON string. +message Int64Value { + // The int64 value. + int64 value = 1; +} + +// Wrapper message for `uint64`. +// +// The JSON representation for `UInt64Value` is JSON string. +message UInt64Value { + // The uint64 value. + uint64 value = 1; +} + +// Wrapper message for `int32`. +// +// The JSON representation for `Int32Value` is JSON number. +message Int32Value { + // The int32 value. + int32 value = 1; +} + +// Wrapper message for `uint32`. +// +// The JSON representation for `UInt32Value` is JSON number. +message UInt32Value { + // The uint32 value. + uint32 value = 1; +} + +// Wrapper message for `bool`. +// +// The JSON representation for `BoolValue` is JSON `true` and `false`. +message BoolValue { + // The bool value. + bool value = 1; +} + +// Wrapper message for `string`. +// +// The JSON representation for `StringValue` is JSON string. +message StringValue { + // The string value. + string value = 1; +} + +// Wrapper message for `bytes`. +// +// The JSON representation for `BytesValue` is JSON string. +message BytesValue { + // The bytes value. + bytes value = 1; +} diff --git a/api/vendor/github.com/golang/protobuf/regenerate.sh b/api/vendor/github.com/golang/protobuf/regenerate.sh new file mode 100755 index 0000000..dc7e2d1 --- /dev/null +++ b/api/vendor/github.com/golang/protobuf/regenerate.sh @@ -0,0 +1,53 @@ +#!/bin/bash + +set -e + +# Install the working tree's protoc-gen-gen in a tempdir. +tmpdir=$(mktemp -d -t regen-wkt.XXXXXX) +trap 'rm -rf $tmpdir' EXIT +mkdir -p $tmpdir/bin +PATH=$tmpdir/bin:$PATH +GOBIN=$tmpdir/bin go install ./protoc-gen-go + +# Public imports require at least Go 1.9. +supportTypeAliases="" +if go list -f '{{context.ReleaseTags}}' runtime | grep -q go1.9; then + supportTypeAliases=1 +fi + +# Generate various test protos. +PROTO_DIRS=( + conformance/internal/conformance_proto + jsonpb/jsonpb_test_proto + proto + protoc-gen-go/testdata +) +for dir in ${PROTO_DIRS[@]}; do + for p in `find $dir -name "*.proto"`; do + if [[ $p == */import_public/* && ! $supportTypeAliases ]]; then + echo "# $p (skipped)" + continue; + fi + echo "# $p" + protoc -I$dir --go_out=plugins=grpc,paths=source_relative:$dir $p + done +done + +# Deriving the location of the source protos from the path to the +# protoc binary may be a bit odd, but this is what protoc itself does. +PROTO_INCLUDE=$(dirname $(dirname $(which protoc)))/include + +# Well-known types. +WKT_PROTOS=(any duration empty struct timestamp wrappers) +for p in ${WKT_PROTOS[@]}; do + echo "# google/protobuf/$p.proto" + protoc --go_out=paths=source_relative:$tmpdir google/protobuf/$p.proto + cp $tmpdir/google/protobuf/$p.pb.go ptypes/$p + cp $PROTO_INCLUDE/google/protobuf/$p.proto ptypes/$p +done + +# descriptor.proto. +echo "# google/protobuf/descriptor.proto" +protoc --go_out=paths=source_relative:$tmpdir google/protobuf/descriptor.proto +cp $tmpdir/google/protobuf/descriptor.pb.go protoc-gen-go/descriptor +cp $PROTO_INCLUDE/google/protobuf/descriptor.proto protoc-gen-go/descriptor diff --git a/api/vendor/github.com/matttproud/golang_protobuf_extensions/.travis.yml b/api/vendor/github.com/matttproud/golang_protobuf_extensions/.travis.yml new file mode 100644 index 0000000..5db2580 --- /dev/null +++ b/api/vendor/github.com/matttproud/golang_protobuf_extensions/.travis.yml @@ -0,0 +1,8 @@ +language: go + +go: + - 1.5 + - 1.6 + - tip + +script: make -f Makefile.TRAVIS diff --git a/api/vendor/github.com/matttproud/golang_protobuf_extensions/LICENSE b/api/vendor/github.com/matttproud/golang_protobuf_extensions/LICENSE new file mode 100644 index 0000000..8dada3e --- /dev/null +++ b/api/vendor/github.com/matttproud/golang_protobuf_extensions/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 {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/api/vendor/github.com/matttproud/golang_protobuf_extensions/Makefile.TRAVIS b/api/vendor/github.com/matttproud/golang_protobuf_extensions/Makefile.TRAVIS new file mode 100644 index 0000000..24f9649 --- /dev/null +++ b/api/vendor/github.com/matttproud/golang_protobuf_extensions/Makefile.TRAVIS @@ -0,0 +1,15 @@ +all: build cover test vet + +build: + go build -v ./... + +cover: test + $(MAKE) -C pbutil cover + +test: build + go test -v ./... + +vet: build + go vet -v ./... + +.PHONY: build cover test vet diff --git a/api/vendor/github.com/matttproud/golang_protobuf_extensions/NOTICE b/api/vendor/github.com/matttproud/golang_protobuf_extensions/NOTICE new file mode 100644 index 0000000..5d8cb5b --- /dev/null +++ b/api/vendor/github.com/matttproud/golang_protobuf_extensions/NOTICE @@ -0,0 +1 @@ +Copyright 2012 Matt T. Proud (matt.proud@gmail.com) diff --git a/api/vendor/github.com/matttproud/golang_protobuf_extensions/README.md b/api/vendor/github.com/matttproud/golang_protobuf_extensions/README.md new file mode 100644 index 0000000..751ee69 --- /dev/null +++ b/api/vendor/github.com/matttproud/golang_protobuf_extensions/README.md @@ -0,0 +1,20 @@ +# Overview +This repository provides various Protocol Buffer extensions for the Go +language (golang), namely support for record length-delimited message +streaming. + +| Java | Go | +| ------------------------------ | --------------------- | +| MessageLite#parseDelimitedFrom | pbutil.ReadDelimited | +| MessageLite#writeDelimitedTo | pbutil.WriteDelimited | + +Because [Code Review 9102043](https://codereview.appspot.com/9102043/) is +destined to never be merged into mainline (i.e., never be promoted to formal +[goprotobuf features](https://github.com/golang/protobuf)), this repository +will live here in the wild. + +# Documentation +We have [generated Go Doc documentation](http://godoc.org/github.com/matttproud/golang_protobuf_extensions/pbutil) here. + +# Testing +[![Build Status](https://travis-ci.org/matttproud/golang_protobuf_extensions.png?branch=master)](https://travis-ci.org/matttproud/golang_protobuf_extensions) diff --git a/api/vendor/github.com/matttproud/golang_protobuf_extensions/ext/moved.go b/api/vendor/github.com/matttproud/golang_protobuf_extensions/ext/moved.go new file mode 100644 index 0000000..f31a0f0 --- /dev/null +++ b/api/vendor/github.com/matttproud/golang_protobuf_extensions/ext/moved.go @@ -0,0 +1,2 @@ +// Package ext moved to a new location: github.com/matttproud/golang_protobuf_extensions/pbutil. +package ext diff --git a/api/vendor/github.com/matttproud/golang_protobuf_extensions/pbtest/deleted.go b/api/vendor/github.com/matttproud/golang_protobuf_extensions/pbtest/deleted.go new file mode 100644 index 0000000..73efcb1 --- /dev/null +++ b/api/vendor/github.com/matttproud/golang_protobuf_extensions/pbtest/deleted.go @@ -0,0 +1,2 @@ +// Package pbtest is deleted for the time being, because upstream Protocol Buffer 3 may have rendered quick.Value-based blackbox generation impossible. +package pbtest diff --git a/api/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/.gitignore b/api/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/.gitignore new file mode 100644 index 0000000..e16fb94 --- /dev/null +++ b/api/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/.gitignore @@ -0,0 +1 @@ +cover.dat diff --git a/api/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/Makefile b/api/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/Makefile new file mode 100644 index 0000000..81be214 --- /dev/null +++ b/api/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/Makefile @@ -0,0 +1,7 @@ +all: + +cover: + go test -cover -v -coverprofile=cover.dat ./... + go tool cover -func cover.dat + +.PHONY: cover diff --git a/api/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/all_test.go b/api/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/all_test.go new file mode 100644 index 0000000..a793c88 --- /dev/null +++ b/api/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/all_test.go @@ -0,0 +1,178 @@ +// Copyright 2013 Matt T. Proud +// +// 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 pbutil + +import ( + "bytes" + "testing" + + "github.com/golang/protobuf/proto" + + . "github.com/matttproud/golang_protobuf_extensions/testdata" +) + +func TestWriteDelimited(t *testing.T) { + t.Parallel() + for _, test := range []struct { + msg proto.Message + buf []byte + n int + err error + }{ + { + msg: &Empty{}, + n: 1, + buf: []byte{0}, + }, + { + msg: &GoEnum{Foo: FOO_FOO1.Enum()}, + n: 3, + buf: []byte{2, 8, 1}, + }, + { + msg: &Strings{ + StringField: proto.String(`This is my gigantic, unhappy string. It exceeds +the encoding size of a single byte varint. We are using it to fuzz test the +correctness of the header decoding mechanisms, which may prove problematic. +I expect it may. Let's hope you enjoy testing as much as we do.`), + }, + n: 271, + buf: []byte{141, 2, 10, 138, 2, 84, 104, 105, 115, 32, 105, 115, 32, 109, + 121, 32, 103, 105, 103, 97, 110, 116, 105, 99, 44, 32, 117, 110, 104, + 97, 112, 112, 121, 32, 115, 116, 114, 105, 110, 103, 46, 32, 32, 73, + 116, 32, 101, 120, 99, 101, 101, 100, 115, 10, 116, 104, 101, 32, 101, + 110, 99, 111, 100, 105, 110, 103, 32, 115, 105, 122, 101, 32, 111, 102, + 32, 97, 32, 115, 105, 110, 103, 108, 101, 32, 98, 121, 116, 101, 32, + 118, 97, 114, 105, 110, 116, 46, 32, 32, 87, 101, 32, 97, 114, 101, 32, + 117, 115, 105, 110, 103, 32, 105, 116, 32, 116, 111, 32, 102, 117, 122, + 122, 32, 116, 101, 115, 116, 32, 116, 104, 101, 10, 99, 111, 114, 114, + 101, 99, 116, 110, 101, 115, 115, 32, 111, 102, 32, 116, 104, 101, 32, + 104, 101, 97, 100, 101, 114, 32, 100, 101, 99, 111, 100, 105, 110, 103, + 32, 109, 101, 99, 104, 97, 110, 105, 115, 109, 115, 44, 32, 119, 104, + 105, 99, 104, 32, 109, 97, 121, 32, 112, 114, 111, 118, 101, 32, 112, + 114, 111, 98, 108, 101, 109, 97, 116, 105, 99, 46, 10, 73, 32, 101, 120, + 112, 101, 99, 116, 32, 105, 116, 32, 109, 97, 121, 46, 32, 32, 76, 101, + 116, 39, 115, 32, 104, 111, 112, 101, 32, 121, 111, 117, 32, 101, 110, + 106, 111, 121, 32, 116, 101, 115, 116, 105, 110, 103, 32, 97, 115, 32, + 109, 117, 99, 104, 32, 97, 115, 32, 119, 101, 32, 100, 111, 46}, + }, + } { + var buf bytes.Buffer + if n, err := WriteDelimited(&buf, test.msg); n != test.n || err != test.err { + t.Fatalf("WriteDelimited(buf, %#v) = %v, %v; want %v, %v", test.msg, n, err, test.n, test.err) + } + if out := buf.Bytes(); !bytes.Equal(out, test.buf) { + t.Fatalf("WriteDelimited(buf, %#v); buf = %v; want %v", test.msg, out, test.buf) + } + } +} + +func TestReadDelimited(t *testing.T) { + t.Parallel() + for _, test := range []struct { + buf []byte + msg proto.Message + n int + err error + }{ + { + buf: []byte{0}, + msg: &Empty{}, + n: 1, + }, + { + n: 3, + buf: []byte{2, 8, 1}, + msg: &GoEnum{Foo: FOO_FOO1.Enum()}, + }, + { + buf: []byte{141, 2, 10, 138, 2, 84, 104, 105, 115, 32, 105, 115, 32, 109, + 121, 32, 103, 105, 103, 97, 110, 116, 105, 99, 44, 32, 117, 110, 104, + 97, 112, 112, 121, 32, 115, 116, 114, 105, 110, 103, 46, 32, 32, 73, + 116, 32, 101, 120, 99, 101, 101, 100, 115, 10, 116, 104, 101, 32, 101, + 110, 99, 111, 100, 105, 110, 103, 32, 115, 105, 122, 101, 32, 111, 102, + 32, 97, 32, 115, 105, 110, 103, 108, 101, 32, 98, 121, 116, 101, 32, + 118, 97, 114, 105, 110, 116, 46, 32, 32, 87, 101, 32, 97, 114, 101, 32, + 117, 115, 105, 110, 103, 32, 105, 116, 32, 116, 111, 32, 102, 117, 122, + 122, 32, 116, 101, 115, 116, 32, 116, 104, 101, 10, 99, 111, 114, 114, + 101, 99, 116, 110, 101, 115, 115, 32, 111, 102, 32, 116, 104, 101, 32, + 104, 101, 97, 100, 101, 114, 32, 100, 101, 99, 111, 100, 105, 110, 103, + 32, 109, 101, 99, 104, 97, 110, 105, 115, 109, 115, 44, 32, 119, 104, + 105, 99, 104, 32, 109, 97, 121, 32, 112, 114, 111, 118, 101, 32, 112, + 114, 111, 98, 108, 101, 109, 97, 116, 105, 99, 46, 10, 73, 32, 101, 120, + 112, 101, 99, 116, 32, 105, 116, 32, 109, 97, 121, 46, 32, 32, 76, 101, + 116, 39, 115, 32, 104, 111, 112, 101, 32, 121, 111, 117, 32, 101, 110, + 106, 111, 121, 32, 116, 101, 115, 116, 105, 110, 103, 32, 97, 115, 32, + 109, 117, 99, 104, 32, 97, 115, 32, 119, 101, 32, 100, 111, 46}, + msg: &Strings{ + StringField: proto.String(`This is my gigantic, unhappy string. It exceeds +the encoding size of a single byte varint. We are using it to fuzz test the +correctness of the header decoding mechanisms, which may prove problematic. +I expect it may. Let's hope you enjoy testing as much as we do.`), + }, + n: 271, + }, + } { + msg := proto.Clone(test.msg) + msg.Reset() + if n, err := ReadDelimited(bytes.NewBuffer(test.buf), msg); n != test.n || err != test.err { + t.Fatalf("ReadDelimited(%v, msg) = %v, %v; want %v, %v", test.buf, n, err, test.n, test.err) + } + if !proto.Equal(msg, test.msg) { + t.Fatalf("ReadDelimited(%v, msg); msg = %v; want %v", test.buf, msg, test.msg) + } + } +} + +func TestEndToEndValid(t *testing.T) { + t.Parallel() + for _, test := range [][]proto.Message{ + {&Empty{}}, + {&GoEnum{Foo: FOO_FOO1.Enum()}, &Empty{}, &GoEnum{Foo: FOO_FOO1.Enum()}}, + {&GoEnum{Foo: FOO_FOO1.Enum()}}, + {&Strings{ + StringField: proto.String(`This is my gigantic, unhappy string. It exceeds +the encoding size of a single byte varint. We are using it to fuzz test the +correctness of the header decoding mechanisms, which may prove problematic. +I expect it may. Let's hope you enjoy testing as much as we do.`), + }}, + } { + var buf bytes.Buffer + var written int + for i, msg := range test { + n, err := WriteDelimited(&buf, msg) + if err != nil { + // Assumption: TestReadDelimited and TestWriteDelimited are sufficient + // and inputs for this test are explicitly exercised there. + t.Fatalf("WriteDelimited(buf, %v[%d]) = ?, %v; wanted ?, nil", test, i, err) + } + written += n + } + var read int + for i, msg := range test { + out := proto.Clone(msg) + out.Reset() + n, _ := ReadDelimited(&buf, out) + // Decide to do EOF checking? + read += n + if !proto.Equal(out, msg) { + t.Fatalf("out = %v; want %v[%d] = %#v", out, test, i, msg) + } + } + if read != written { + t.Fatalf("%v read = %d; want %d", test, read, written) + } + } +} diff --git a/api/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode.go b/api/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode.go new file mode 100644 index 0000000..258c063 --- /dev/null +++ b/api/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode.go @@ -0,0 +1,75 @@ +// Copyright 2013 Matt T. Proud +// +// 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 pbutil + +import ( + "encoding/binary" + "errors" + "io" + + "github.com/golang/protobuf/proto" +) + +var errInvalidVarint = errors.New("invalid varint32 encountered") + +// ReadDelimited decodes a message from the provided length-delimited stream, +// where the length is encoded as 32-bit varint prefix to the message body. +// It returns the total number of bytes read and any applicable error. This is +// roughly equivalent to the companion Java API's +// MessageLite#parseDelimitedFrom. As per the reader contract, this function +// calls r.Read repeatedly as required until exactly one message including its +// prefix is read and decoded (or an error has occurred). The function never +// reads more bytes from the stream than required. The function never returns +// an error if a message has been read and decoded correctly, even if the end +// of the stream has been reached in doing so. In that case, any subsequent +// calls return (0, io.EOF). +func ReadDelimited(r io.Reader, m proto.Message) (n int, err error) { + // Per AbstractParser#parsePartialDelimitedFrom with + // CodedInputStream#readRawVarint32. + var headerBuf [binary.MaxVarintLen32]byte + var bytesRead, varIntBytes int + var messageLength uint64 + for varIntBytes == 0 { // i.e. no varint has been decoded yet. + if bytesRead >= len(headerBuf) { + return bytesRead, errInvalidVarint + } + // We have to read byte by byte here to avoid reading more bytes + // than required. Each read byte is appended to what we have + // read before. + newBytesRead, err := r.Read(headerBuf[bytesRead : bytesRead+1]) + if newBytesRead == 0 { + if err != nil { + return bytesRead, err + } + // A Reader should not return (0, nil), but if it does, + // it should be treated as no-op (according to the + // Reader contract). So let's go on... + continue + } + bytesRead += newBytesRead + // Now present everything read so far to the varint decoder and + // see if a varint can be decoded already. + messageLength, varIntBytes = proto.DecodeVarint(headerBuf[:bytesRead]) + } + + messageBuf := make([]byte, messageLength) + newBytesRead, err := io.ReadFull(r, messageBuf) + bytesRead += newBytesRead + if err != nil { + return bytesRead, err + } + + return bytesRead, proto.Unmarshal(messageBuf, m) +} diff --git a/api/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode_test.go b/api/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode_test.go new file mode 100644 index 0000000..364a7b7 --- /dev/null +++ b/api/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode_test.go @@ -0,0 +1,99 @@ +// Copyright 2016 Matt T. Proud +// +// 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 pbutil + +import ( + "bytes" + "io" + "testing" + "testing/iotest" +) + +func TestReadDelimitedIllegalVarint(t *testing.T) { + t.Parallel() + var tests = []struct { + in []byte + n int + err error + }{ + { + in: []byte{255, 255, 255, 255, 255}, + n: 5, + err: errInvalidVarint, + }, + { + in: []byte{255, 255, 255, 255, 255, 255}, + n: 5, + err: errInvalidVarint, + }, + } + for _, test := range tests { + n, err := ReadDelimited(bytes.NewReader(test.in), nil) + if got, want := n, test.n; got != want { + t.Errorf("ReadDelimited(%#v, nil) = %#v, ?; want = %v#, ?", test.in, got, want) + } + if got, want := err, test.err; got != want { + t.Errorf("ReadDelimited(%#v, nil) = ?, %#v; want = ?, %#v", test.in, got, want) + } + } +} + +func TestReadDelimitedPrematureHeader(t *testing.T) { + t.Parallel() + var data = []byte{128, 5} // 256 + 256 + 128 + n, err := ReadDelimited(bytes.NewReader(data[0:1]), nil) + if got, want := n, 1; got != want { + t.Errorf("ReadDelimited(%#v, nil) = %#v, ?; want = %v#, ?", data[0:1], got, want) + } + if got, want := err, io.EOF; got != want { + t.Errorf("ReadDelimited(%#v, nil) = ?, %#v; want = ?, %#v", data[0:1], got, want) + } +} + +func TestReadDelimitedPrematureBody(t *testing.T) { + t.Parallel() + var data = []byte{128, 5, 0, 0, 0} // 256 + 256 + 128 + n, err := ReadDelimited(bytes.NewReader(data[:]), nil) + if got, want := n, 5; got != want { + t.Errorf("ReadDelimited(%#v, nil) = %#v, ?; want = %v#, ?", data, got, want) + } + if got, want := err, io.ErrUnexpectedEOF; got != want { + t.Errorf("ReadDelimited(%#v, nil) = ?, %#v; want = ?, %#v", data, got, want) + } +} + +func TestReadDelimitedPrematureHeaderIncremental(t *testing.T) { + t.Parallel() + var data = []byte{128, 5} // 256 + 256 + 128 + n, err := ReadDelimited(iotest.OneByteReader(bytes.NewReader(data[0:1])), nil) + if got, want := n, 1; got != want { + t.Errorf("ReadDelimited(%#v, nil) = %#v, ?; want = %v#, ?", data[0:1], got, want) + } + if got, want := err, io.EOF; got != want { + t.Errorf("ReadDelimited(%#v, nil) = ?, %#v; want = ?, %#v", data[0:1], got, want) + } +} + +func TestReadDelimitedPrematureBodyIncremental(t *testing.T) { + t.Parallel() + var data = []byte{128, 5, 0, 0, 0} // 256 + 256 + 128 + n, err := ReadDelimited(iotest.OneByteReader(bytes.NewReader(data[:])), nil) + if got, want := n, 5; got != want { + t.Errorf("ReadDelimited(%#v, nil) = %#v, ?; want = %v#, ?", data, got, want) + } + if got, want := err, io.ErrUnexpectedEOF; got != want { + t.Errorf("ReadDelimited(%#v, nil) = ?, %#v; want = ?, %#v", data, got, want) + } +} diff --git a/api/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/doc.go b/api/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/doc.go new file mode 100644 index 0000000..c318385 --- /dev/null +++ b/api/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/doc.go @@ -0,0 +1,16 @@ +// Copyright 2013 Matt T. Proud +// +// 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 pbutil provides record length-delimited Protocol Buffer streaming. +package pbutil diff --git a/api/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode.go b/api/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode.go new file mode 100644 index 0000000..8fb59ad --- /dev/null +++ b/api/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode.go @@ -0,0 +1,46 @@ +// Copyright 2013 Matt T. Proud +// +// 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 pbutil + +import ( + "encoding/binary" + "io" + + "github.com/golang/protobuf/proto" +) + +// WriteDelimited encodes and dumps a message to the provided writer prefixed +// with a 32-bit varint indicating the length of the encoded message, producing +// a length-delimited record stream, which can be used to chain together +// encoded messages of the same type together in a file. It returns the total +// number of bytes written and any applicable error. This is roughly +// equivalent to the companion Java API's MessageLite#writeDelimitedTo. +func WriteDelimited(w io.Writer, m proto.Message) (n int, err error) { + buffer, err := proto.Marshal(m) + if err != nil { + return 0, err + } + + var buf [binary.MaxVarintLen32]byte + encodedLength := binary.PutUvarint(buf[:], uint64(len(buffer))) + + sync, err := w.Write(buf[:encodedLength]) + if err != nil { + return sync, err + } + + n, err = w.Write(buffer) + return n + sync, err +} diff --git a/api/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode_test.go b/api/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode_test.go new file mode 100644 index 0000000..f92632b --- /dev/null +++ b/api/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode_test.go @@ -0,0 +1,67 @@ +// Copyright 2016 Matt T. Proud +// +// 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 pbutil + +import ( + "bytes" + "errors" + "testing" + + "github.com/golang/protobuf/proto" +) + +var errMarshal = errors.New("pbutil: can't marshal") + +type cantMarshal struct{ proto.Message } + +func (cantMarshal) Marshal() ([]byte, error) { return nil, errMarshal } + +var _ proto.Message = cantMarshal{} + +func TestWriteDelimitedMarshalErr(t *testing.T) { + t.Parallel() + var data cantMarshal + var buf bytes.Buffer + n, err := WriteDelimited(&buf, data) + if got, want := n, 0; got != want { + t.Errorf("WriteDelimited(buf, %#v) = %#v, ?; want = %v#, ?", data, got, want) + } + if got, want := err, errMarshal; got != want { + t.Errorf("WriteDelimited(buf, %#v) = ?, %#v; want = ?, %#v", data, got, want) + } +} + +type canMarshal struct{ proto.Message } + +func (canMarshal) Marshal() ([]byte, error) { return []byte{0, 1, 2, 3, 4, 5}, nil } + +var errWrite = errors.New("pbutil: can't write") + +type cantWrite struct{} + +func (cantWrite) Write([]byte) (int, error) { return 0, errWrite } + +func TestWriteDelimitedWriteErr(t *testing.T) { + t.Parallel() + var data canMarshal + var buf cantWrite + n, err := WriteDelimited(buf, data) + if got, want := n, 0; got != want { + t.Errorf("WriteDelimited(buf, %#v) = %#v, ?; want = %v#, ?", data, got, want) + } + if got, want := err, errWrite; got != want { + t.Errorf("WriteDelimited(buf, %#v) = ?, %#v; want = ?, %#v", data, got, want) + } +} diff --git a/api/vendor/github.com/matttproud/golang_protobuf_extensions/testdata/README.THIRD_PARTY b/api/vendor/github.com/matttproud/golang_protobuf_extensions/testdata/README.THIRD_PARTY new file mode 100644 index 0000000..0c1f842 --- /dev/null +++ b/api/vendor/github.com/matttproud/golang_protobuf_extensions/testdata/README.THIRD_PARTY @@ -0,0 +1,4 @@ +test.pb.go and test.proto are third-party data. + +SOURCE: https://github.com/golang/protobuf +REVISION: bf531ff1a004f24ee53329dfd5ce0b41bfdc17df diff --git a/api/vendor/github.com/matttproud/golang_protobuf_extensions/testdata/test.pb.go b/api/vendor/github.com/matttproud/golang_protobuf_extensions/testdata/test.pb.go new file mode 100644 index 0000000..772adcb --- /dev/null +++ b/api/vendor/github.com/matttproud/golang_protobuf_extensions/testdata/test.pb.go @@ -0,0 +1,4029 @@ +// Code generated by protoc-gen-go. +// source: test.proto +// DO NOT EDIT! + +/* +Package testdata is a generated protocol buffer package. + +It is generated from these files: + test.proto + +It has these top-level messages: + GoEnum + GoTestField + GoTest + GoSkipTest + NonPackedTest + PackedTest + MaxTag + OldMessage + NewMessage + InnerMessage + OtherMessage + RequiredInnerMessage + MyMessage + Ext + ComplexExtension + DefaultsMessage + MyMessageSet + Empty + MessageList + Strings + Defaults + SubDefaults + RepeatedEnum + MoreRepeated + GroupOld + GroupNew + FloatingPoint + MessageWithMap + Oneof + Communique +*/ +package testdata + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +const _ = proto.ProtoPackageIsVersion1 + +type FOO int32 + +const ( + FOO_FOO1 FOO = 1 +) + +var FOO_name = map[int32]string{ + 1: "FOO1", +} +var FOO_value = map[string]int32{ + "FOO1": 1, +} + +func (x FOO) Enum() *FOO { + p := new(FOO) + *p = x + return p +} +func (x FOO) String() string { + return proto.EnumName(FOO_name, int32(x)) +} +func (x *FOO) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FOO_value, data, "FOO") + if err != nil { + return err + } + *x = FOO(value) + return nil +} +func (FOO) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } + +// An enum, for completeness. +type GoTest_KIND int32 + +const ( + GoTest_VOID GoTest_KIND = 0 + // Basic types + GoTest_BOOL GoTest_KIND = 1 + GoTest_BYTES GoTest_KIND = 2 + GoTest_FINGERPRINT GoTest_KIND = 3 + GoTest_FLOAT GoTest_KIND = 4 + GoTest_INT GoTest_KIND = 5 + GoTest_STRING GoTest_KIND = 6 + GoTest_TIME GoTest_KIND = 7 + // Groupings + GoTest_TUPLE GoTest_KIND = 8 + GoTest_ARRAY GoTest_KIND = 9 + GoTest_MAP GoTest_KIND = 10 + // Table types + GoTest_TABLE GoTest_KIND = 11 + // Functions + GoTest_FUNCTION GoTest_KIND = 12 +) + +var GoTest_KIND_name = map[int32]string{ + 0: "VOID", + 1: "BOOL", + 2: "BYTES", + 3: "FINGERPRINT", + 4: "FLOAT", + 5: "INT", + 6: "STRING", + 7: "TIME", + 8: "TUPLE", + 9: "ARRAY", + 10: "MAP", + 11: "TABLE", + 12: "FUNCTION", +} +var GoTest_KIND_value = map[string]int32{ + "VOID": 0, + "BOOL": 1, + "BYTES": 2, + "FINGERPRINT": 3, + "FLOAT": 4, + "INT": 5, + "STRING": 6, + "TIME": 7, + "TUPLE": 8, + "ARRAY": 9, + "MAP": 10, + "TABLE": 11, + "FUNCTION": 12, +} + +func (x GoTest_KIND) Enum() *GoTest_KIND { + p := new(GoTest_KIND) + *p = x + return p +} +func (x GoTest_KIND) String() string { + return proto.EnumName(GoTest_KIND_name, int32(x)) +} +func (x *GoTest_KIND) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(GoTest_KIND_value, data, "GoTest_KIND") + if err != nil { + return err + } + *x = GoTest_KIND(value) + return nil +} +func (GoTest_KIND) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{2, 0} } + +type MyMessage_Color int32 + +const ( + MyMessage_RED MyMessage_Color = 0 + MyMessage_GREEN MyMessage_Color = 1 + MyMessage_BLUE MyMessage_Color = 2 +) + +var MyMessage_Color_name = map[int32]string{ + 0: "RED", + 1: "GREEN", + 2: "BLUE", +} +var MyMessage_Color_value = map[string]int32{ + "RED": 0, + "GREEN": 1, + "BLUE": 2, +} + +func (x MyMessage_Color) Enum() *MyMessage_Color { + p := new(MyMessage_Color) + *p = x + return p +} +func (x MyMessage_Color) String() string { + return proto.EnumName(MyMessage_Color_name, int32(x)) +} +func (x *MyMessage_Color) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(MyMessage_Color_value, data, "MyMessage_Color") + if err != nil { + return err + } + *x = MyMessage_Color(value) + return nil +} +func (MyMessage_Color) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{12, 0} } + +type DefaultsMessage_DefaultsEnum int32 + +const ( + DefaultsMessage_ZERO DefaultsMessage_DefaultsEnum = 0 + DefaultsMessage_ONE DefaultsMessage_DefaultsEnum = 1 + DefaultsMessage_TWO DefaultsMessage_DefaultsEnum = 2 +) + +var DefaultsMessage_DefaultsEnum_name = map[int32]string{ + 0: "ZERO", + 1: "ONE", + 2: "TWO", +} +var DefaultsMessage_DefaultsEnum_value = map[string]int32{ + "ZERO": 0, + "ONE": 1, + "TWO": 2, +} + +func (x DefaultsMessage_DefaultsEnum) Enum() *DefaultsMessage_DefaultsEnum { + p := new(DefaultsMessage_DefaultsEnum) + *p = x + return p +} +func (x DefaultsMessage_DefaultsEnum) String() string { + return proto.EnumName(DefaultsMessage_DefaultsEnum_name, int32(x)) +} +func (x *DefaultsMessage_DefaultsEnum) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(DefaultsMessage_DefaultsEnum_value, data, "DefaultsMessage_DefaultsEnum") + if err != nil { + return err + } + *x = DefaultsMessage_DefaultsEnum(value) + return nil +} +func (DefaultsMessage_DefaultsEnum) EnumDescriptor() ([]byte, []int) { + return fileDescriptor0, []int{15, 0} +} + +type Defaults_Color int32 + +const ( + Defaults_RED Defaults_Color = 0 + Defaults_GREEN Defaults_Color = 1 + Defaults_BLUE Defaults_Color = 2 +) + +var Defaults_Color_name = map[int32]string{ + 0: "RED", + 1: "GREEN", + 2: "BLUE", +} +var Defaults_Color_value = map[string]int32{ + "RED": 0, + "GREEN": 1, + "BLUE": 2, +} + +func (x Defaults_Color) Enum() *Defaults_Color { + p := new(Defaults_Color) + *p = x + return p +} +func (x Defaults_Color) String() string { + return proto.EnumName(Defaults_Color_name, int32(x)) +} +func (x *Defaults_Color) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Defaults_Color_value, data, "Defaults_Color") + if err != nil { + return err + } + *x = Defaults_Color(value) + return nil +} +func (Defaults_Color) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{20, 0} } + +type RepeatedEnum_Color int32 + +const ( + RepeatedEnum_RED RepeatedEnum_Color = 1 +) + +var RepeatedEnum_Color_name = map[int32]string{ + 1: "RED", +} +var RepeatedEnum_Color_value = map[string]int32{ + "RED": 1, +} + +func (x RepeatedEnum_Color) Enum() *RepeatedEnum_Color { + p := new(RepeatedEnum_Color) + *p = x + return p +} +func (x RepeatedEnum_Color) String() string { + return proto.EnumName(RepeatedEnum_Color_name, int32(x)) +} +func (x *RepeatedEnum_Color) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(RepeatedEnum_Color_value, data, "RepeatedEnum_Color") + if err != nil { + return err + } + *x = RepeatedEnum_Color(value) + return nil +} +func (RepeatedEnum_Color) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{22, 0} } + +type GoEnum struct { + Foo *FOO `protobuf:"varint,1,req,name=foo,enum=testdata.FOO" json:"foo,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GoEnum) Reset() { *m = GoEnum{} } +func (m *GoEnum) String() string { return proto.CompactTextString(m) } +func (*GoEnum) ProtoMessage() {} +func (*GoEnum) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } + +func (m *GoEnum) GetFoo() FOO { + if m != nil && m.Foo != nil { + return *m.Foo + } + return FOO_FOO1 +} + +type GoTestField struct { + Label *string `protobuf:"bytes,1,req,name=Label,json=label" json:"Label,omitempty"` + Type *string `protobuf:"bytes,2,req,name=Type,json=type" json:"Type,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GoTestField) Reset() { *m = GoTestField{} } +func (m *GoTestField) String() string { return proto.CompactTextString(m) } +func (*GoTestField) ProtoMessage() {} +func (*GoTestField) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } + +func (m *GoTestField) GetLabel() string { + if m != nil && m.Label != nil { + return *m.Label + } + return "" +} + +func (m *GoTestField) GetType() string { + if m != nil && m.Type != nil { + return *m.Type + } + return "" +} + +type GoTest struct { + // Some typical parameters + Kind *GoTest_KIND `protobuf:"varint,1,req,name=Kind,json=kind,enum=testdata.GoTest_KIND" json:"Kind,omitempty"` + Table *string `protobuf:"bytes,2,opt,name=Table,json=table" json:"Table,omitempty"` + Param *int32 `protobuf:"varint,3,opt,name=Param,json=param" json:"Param,omitempty"` + // Required, repeated and optional foreign fields. + RequiredField *GoTestField `protobuf:"bytes,4,req,name=RequiredField,json=requiredField" json:"RequiredField,omitempty"` + RepeatedField []*GoTestField `protobuf:"bytes,5,rep,name=RepeatedField,json=repeatedField" json:"RepeatedField,omitempty"` + OptionalField *GoTestField `protobuf:"bytes,6,opt,name=OptionalField,json=optionalField" json:"OptionalField,omitempty"` + // Required fields of all basic types + F_BoolRequired *bool `protobuf:"varint,10,req,name=F_Bool_required,json=fBoolRequired" json:"F_Bool_required,omitempty"` + F_Int32Required *int32 `protobuf:"varint,11,req,name=F_Int32_required,json=fInt32Required" json:"F_Int32_required,omitempty"` + F_Int64Required *int64 `protobuf:"varint,12,req,name=F_Int64_required,json=fInt64Required" json:"F_Int64_required,omitempty"` + F_Fixed32Required *uint32 `protobuf:"fixed32,13,req,name=F_Fixed32_required,json=fFixed32Required" json:"F_Fixed32_required,omitempty"` + F_Fixed64Required *uint64 `protobuf:"fixed64,14,req,name=F_Fixed64_required,json=fFixed64Required" json:"F_Fixed64_required,omitempty"` + F_Uint32Required *uint32 `protobuf:"varint,15,req,name=F_Uint32_required,json=fUint32Required" json:"F_Uint32_required,omitempty"` + F_Uint64Required *uint64 `protobuf:"varint,16,req,name=F_Uint64_required,json=fUint64Required" json:"F_Uint64_required,omitempty"` + F_FloatRequired *float32 `protobuf:"fixed32,17,req,name=F_Float_required,json=fFloatRequired" json:"F_Float_required,omitempty"` + F_DoubleRequired *float64 `protobuf:"fixed64,18,req,name=F_Double_required,json=fDoubleRequired" json:"F_Double_required,omitempty"` + F_StringRequired *string `protobuf:"bytes,19,req,name=F_String_required,json=fStringRequired" json:"F_String_required,omitempty"` + F_BytesRequired []byte `protobuf:"bytes,101,req,name=F_Bytes_required,json=fBytesRequired" json:"F_Bytes_required,omitempty"` + F_Sint32Required *int32 `protobuf:"zigzag32,102,req,name=F_Sint32_required,json=fSint32Required" json:"F_Sint32_required,omitempty"` + F_Sint64Required *int64 `protobuf:"zigzag64,103,req,name=F_Sint64_required,json=fSint64Required" json:"F_Sint64_required,omitempty"` + // Repeated fields of all basic types + F_BoolRepeated []bool `protobuf:"varint,20,rep,name=F_Bool_repeated,json=fBoolRepeated" json:"F_Bool_repeated,omitempty"` + F_Int32Repeated []int32 `protobuf:"varint,21,rep,name=F_Int32_repeated,json=fInt32Repeated" json:"F_Int32_repeated,omitempty"` + F_Int64Repeated []int64 `protobuf:"varint,22,rep,name=F_Int64_repeated,json=fInt64Repeated" json:"F_Int64_repeated,omitempty"` + F_Fixed32Repeated []uint32 `protobuf:"fixed32,23,rep,name=F_Fixed32_repeated,json=fFixed32Repeated" json:"F_Fixed32_repeated,omitempty"` + F_Fixed64Repeated []uint64 `protobuf:"fixed64,24,rep,name=F_Fixed64_repeated,json=fFixed64Repeated" json:"F_Fixed64_repeated,omitempty"` + F_Uint32Repeated []uint32 `protobuf:"varint,25,rep,name=F_Uint32_repeated,json=fUint32Repeated" json:"F_Uint32_repeated,omitempty"` + F_Uint64Repeated []uint64 `protobuf:"varint,26,rep,name=F_Uint64_repeated,json=fUint64Repeated" json:"F_Uint64_repeated,omitempty"` + F_FloatRepeated []float32 `protobuf:"fixed32,27,rep,name=F_Float_repeated,json=fFloatRepeated" json:"F_Float_repeated,omitempty"` + F_DoubleRepeated []float64 `protobuf:"fixed64,28,rep,name=F_Double_repeated,json=fDoubleRepeated" json:"F_Double_repeated,omitempty"` + F_StringRepeated []string `protobuf:"bytes,29,rep,name=F_String_repeated,json=fStringRepeated" json:"F_String_repeated,omitempty"` + F_BytesRepeated [][]byte `protobuf:"bytes,201,rep,name=F_Bytes_repeated,json=fBytesRepeated" json:"F_Bytes_repeated,omitempty"` + F_Sint32Repeated []int32 `protobuf:"zigzag32,202,rep,name=F_Sint32_repeated,json=fSint32Repeated" json:"F_Sint32_repeated,omitempty"` + F_Sint64Repeated []int64 `protobuf:"zigzag64,203,rep,name=F_Sint64_repeated,json=fSint64Repeated" json:"F_Sint64_repeated,omitempty"` + // Optional fields of all basic types + F_BoolOptional *bool `protobuf:"varint,30,opt,name=F_Bool_optional,json=fBoolOptional" json:"F_Bool_optional,omitempty"` + F_Int32Optional *int32 `protobuf:"varint,31,opt,name=F_Int32_optional,json=fInt32Optional" json:"F_Int32_optional,omitempty"` + F_Int64Optional *int64 `protobuf:"varint,32,opt,name=F_Int64_optional,json=fInt64Optional" json:"F_Int64_optional,omitempty"` + F_Fixed32Optional *uint32 `protobuf:"fixed32,33,opt,name=F_Fixed32_optional,json=fFixed32Optional" json:"F_Fixed32_optional,omitempty"` + F_Fixed64Optional *uint64 `protobuf:"fixed64,34,opt,name=F_Fixed64_optional,json=fFixed64Optional" json:"F_Fixed64_optional,omitempty"` + F_Uint32Optional *uint32 `protobuf:"varint,35,opt,name=F_Uint32_optional,json=fUint32Optional" json:"F_Uint32_optional,omitempty"` + F_Uint64Optional *uint64 `protobuf:"varint,36,opt,name=F_Uint64_optional,json=fUint64Optional" json:"F_Uint64_optional,omitempty"` + F_FloatOptional *float32 `protobuf:"fixed32,37,opt,name=F_Float_optional,json=fFloatOptional" json:"F_Float_optional,omitempty"` + F_DoubleOptional *float64 `protobuf:"fixed64,38,opt,name=F_Double_optional,json=fDoubleOptional" json:"F_Double_optional,omitempty"` + F_StringOptional *string `protobuf:"bytes,39,opt,name=F_String_optional,json=fStringOptional" json:"F_String_optional,omitempty"` + F_BytesOptional []byte `protobuf:"bytes,301,opt,name=F_Bytes_optional,json=fBytesOptional" json:"F_Bytes_optional,omitempty"` + F_Sint32Optional *int32 `protobuf:"zigzag32,302,opt,name=F_Sint32_optional,json=fSint32Optional" json:"F_Sint32_optional,omitempty"` + F_Sint64Optional *int64 `protobuf:"zigzag64,303,opt,name=F_Sint64_optional,json=fSint64Optional" json:"F_Sint64_optional,omitempty"` + // Default-valued fields of all basic types + F_BoolDefaulted *bool `protobuf:"varint,40,opt,name=F_Bool_defaulted,json=fBoolDefaulted,def=1" json:"F_Bool_defaulted,omitempty"` + F_Int32Defaulted *int32 `protobuf:"varint,41,opt,name=F_Int32_defaulted,json=fInt32Defaulted,def=32" json:"F_Int32_defaulted,omitempty"` + F_Int64Defaulted *int64 `protobuf:"varint,42,opt,name=F_Int64_defaulted,json=fInt64Defaulted,def=64" json:"F_Int64_defaulted,omitempty"` + F_Fixed32Defaulted *uint32 `protobuf:"fixed32,43,opt,name=F_Fixed32_defaulted,json=fFixed32Defaulted,def=320" json:"F_Fixed32_defaulted,omitempty"` + F_Fixed64Defaulted *uint64 `protobuf:"fixed64,44,opt,name=F_Fixed64_defaulted,json=fFixed64Defaulted,def=640" json:"F_Fixed64_defaulted,omitempty"` + F_Uint32Defaulted *uint32 `protobuf:"varint,45,opt,name=F_Uint32_defaulted,json=fUint32Defaulted,def=3200" json:"F_Uint32_defaulted,omitempty"` + F_Uint64Defaulted *uint64 `protobuf:"varint,46,opt,name=F_Uint64_defaulted,json=fUint64Defaulted,def=6400" json:"F_Uint64_defaulted,omitempty"` + F_FloatDefaulted *float32 `protobuf:"fixed32,47,opt,name=F_Float_defaulted,json=fFloatDefaulted,def=314159" json:"F_Float_defaulted,omitempty"` + F_DoubleDefaulted *float64 `protobuf:"fixed64,48,opt,name=F_Double_defaulted,json=fDoubleDefaulted,def=271828" json:"F_Double_defaulted,omitempty"` + F_StringDefaulted *string `protobuf:"bytes,49,opt,name=F_String_defaulted,json=fStringDefaulted,def=hello, \"world!\"\n" json:"F_String_defaulted,omitempty"` + F_BytesDefaulted []byte `protobuf:"bytes,401,opt,name=F_Bytes_defaulted,json=fBytesDefaulted,def=Bignose" json:"F_Bytes_defaulted,omitempty"` + F_Sint32Defaulted *int32 `protobuf:"zigzag32,402,opt,name=F_Sint32_defaulted,json=fSint32Defaulted,def=-32" json:"F_Sint32_defaulted,omitempty"` + F_Sint64Defaulted *int64 `protobuf:"zigzag64,403,opt,name=F_Sint64_defaulted,json=fSint64Defaulted,def=-64" json:"F_Sint64_defaulted,omitempty"` + // Packed repeated fields (no string or bytes). + F_BoolRepeatedPacked []bool `protobuf:"varint,50,rep,packed,name=F_Bool_repeated_packed,json=fBoolRepeatedPacked" json:"F_Bool_repeated_packed,omitempty"` + F_Int32RepeatedPacked []int32 `protobuf:"varint,51,rep,packed,name=F_Int32_repeated_packed,json=fInt32RepeatedPacked" json:"F_Int32_repeated_packed,omitempty"` + F_Int64RepeatedPacked []int64 `protobuf:"varint,52,rep,packed,name=F_Int64_repeated_packed,json=fInt64RepeatedPacked" json:"F_Int64_repeated_packed,omitempty"` + F_Fixed32RepeatedPacked []uint32 `protobuf:"fixed32,53,rep,packed,name=F_Fixed32_repeated_packed,json=fFixed32RepeatedPacked" json:"F_Fixed32_repeated_packed,omitempty"` + F_Fixed64RepeatedPacked []uint64 `protobuf:"fixed64,54,rep,packed,name=F_Fixed64_repeated_packed,json=fFixed64RepeatedPacked" json:"F_Fixed64_repeated_packed,omitempty"` + F_Uint32RepeatedPacked []uint32 `protobuf:"varint,55,rep,packed,name=F_Uint32_repeated_packed,json=fUint32RepeatedPacked" json:"F_Uint32_repeated_packed,omitempty"` + F_Uint64RepeatedPacked []uint64 `protobuf:"varint,56,rep,packed,name=F_Uint64_repeated_packed,json=fUint64RepeatedPacked" json:"F_Uint64_repeated_packed,omitempty"` + F_FloatRepeatedPacked []float32 `protobuf:"fixed32,57,rep,packed,name=F_Float_repeated_packed,json=fFloatRepeatedPacked" json:"F_Float_repeated_packed,omitempty"` + F_DoubleRepeatedPacked []float64 `protobuf:"fixed64,58,rep,packed,name=F_Double_repeated_packed,json=fDoubleRepeatedPacked" json:"F_Double_repeated_packed,omitempty"` + F_Sint32RepeatedPacked []int32 `protobuf:"zigzag32,502,rep,packed,name=F_Sint32_repeated_packed,json=fSint32RepeatedPacked" json:"F_Sint32_repeated_packed,omitempty"` + F_Sint64RepeatedPacked []int64 `protobuf:"zigzag64,503,rep,packed,name=F_Sint64_repeated_packed,json=fSint64RepeatedPacked" json:"F_Sint64_repeated_packed,omitempty"` + Requiredgroup *GoTest_RequiredGroup `protobuf:"group,70,req,name=RequiredGroup,json=requiredgroup" json:"requiredgroup,omitempty"` + Repeatedgroup []*GoTest_RepeatedGroup `protobuf:"group,80,rep,name=RepeatedGroup,json=repeatedgroup" json:"repeatedgroup,omitempty"` + Optionalgroup *GoTest_OptionalGroup `protobuf:"group,90,opt,name=OptionalGroup,json=optionalgroup" json:"optionalgroup,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GoTest) Reset() { *m = GoTest{} } +func (m *GoTest) String() string { return proto.CompactTextString(m) } +func (*GoTest) ProtoMessage() {} +func (*GoTest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } + +const Default_GoTest_F_BoolDefaulted bool = true +const Default_GoTest_F_Int32Defaulted int32 = 32 +const Default_GoTest_F_Int64Defaulted int64 = 64 +const Default_GoTest_F_Fixed32Defaulted uint32 = 320 +const Default_GoTest_F_Fixed64Defaulted uint64 = 640 +const Default_GoTest_F_Uint32Defaulted uint32 = 3200 +const Default_GoTest_F_Uint64Defaulted uint64 = 6400 +const Default_GoTest_F_FloatDefaulted float32 = 314159 +const Default_GoTest_F_DoubleDefaulted float64 = 271828 +const Default_GoTest_F_StringDefaulted string = "hello, \"world!\"\n" + +var Default_GoTest_F_BytesDefaulted []byte = []byte("Bignose") + +const Default_GoTest_F_Sint32Defaulted int32 = -32 +const Default_GoTest_F_Sint64Defaulted int64 = -64 + +func (m *GoTest) GetKind() GoTest_KIND { + if m != nil && m.Kind != nil { + return *m.Kind + } + return GoTest_VOID +} + +func (m *GoTest) GetTable() string { + if m != nil && m.Table != nil { + return *m.Table + } + return "" +} + +func (m *GoTest) GetParam() int32 { + if m != nil && m.Param != nil { + return *m.Param + } + return 0 +} + +func (m *GoTest) GetRequiredField() *GoTestField { + if m != nil { + return m.RequiredField + } + return nil +} + +func (m *GoTest) GetRepeatedField() []*GoTestField { + if m != nil { + return m.RepeatedField + } + return nil +} + +func (m *GoTest) GetOptionalField() *GoTestField { + if m != nil { + return m.OptionalField + } + return nil +} + +func (m *GoTest) GetF_BoolRequired() bool { + if m != nil && m.F_BoolRequired != nil { + return *m.F_BoolRequired + } + return false +} + +func (m *GoTest) GetF_Int32Required() int32 { + if m != nil && m.F_Int32Required != nil { + return *m.F_Int32Required + } + return 0 +} + +func (m *GoTest) GetF_Int64Required() int64 { + if m != nil && m.F_Int64Required != nil { + return *m.F_Int64Required + } + return 0 +} + +func (m *GoTest) GetF_Fixed32Required() uint32 { + if m != nil && m.F_Fixed32Required != nil { + return *m.F_Fixed32Required + } + return 0 +} + +func (m *GoTest) GetF_Fixed64Required() uint64 { + if m != nil && m.F_Fixed64Required != nil { + return *m.F_Fixed64Required + } + return 0 +} + +func (m *GoTest) GetF_Uint32Required() uint32 { + if m != nil && m.F_Uint32Required != nil { + return *m.F_Uint32Required + } + return 0 +} + +func (m *GoTest) GetF_Uint64Required() uint64 { + if m != nil && m.F_Uint64Required != nil { + return *m.F_Uint64Required + } + return 0 +} + +func (m *GoTest) GetF_FloatRequired() float32 { + if m != nil && m.F_FloatRequired != nil { + return *m.F_FloatRequired + } + return 0 +} + +func (m *GoTest) GetF_DoubleRequired() float64 { + if m != nil && m.F_DoubleRequired != nil { + return *m.F_DoubleRequired + } + return 0 +} + +func (m *GoTest) GetF_StringRequired() string { + if m != nil && m.F_StringRequired != nil { + return *m.F_StringRequired + } + return "" +} + +func (m *GoTest) GetF_BytesRequired() []byte { + if m != nil { + return m.F_BytesRequired + } + return nil +} + +func (m *GoTest) GetF_Sint32Required() int32 { + if m != nil && m.F_Sint32Required != nil { + return *m.F_Sint32Required + } + return 0 +} + +func (m *GoTest) GetF_Sint64Required() int64 { + if m != nil && m.F_Sint64Required != nil { + return *m.F_Sint64Required + } + return 0 +} + +func (m *GoTest) GetF_BoolRepeated() []bool { + if m != nil { + return m.F_BoolRepeated + } + return nil +} + +func (m *GoTest) GetF_Int32Repeated() []int32 { + if m != nil { + return m.F_Int32Repeated + } + return nil +} + +func (m *GoTest) GetF_Int64Repeated() []int64 { + if m != nil { + return m.F_Int64Repeated + } + return nil +} + +func (m *GoTest) GetF_Fixed32Repeated() []uint32 { + if m != nil { + return m.F_Fixed32Repeated + } + return nil +} + +func (m *GoTest) GetF_Fixed64Repeated() []uint64 { + if m != nil { + return m.F_Fixed64Repeated + } + return nil +} + +func (m *GoTest) GetF_Uint32Repeated() []uint32 { + if m != nil { + return m.F_Uint32Repeated + } + return nil +} + +func (m *GoTest) GetF_Uint64Repeated() []uint64 { + if m != nil { + return m.F_Uint64Repeated + } + return nil +} + +func (m *GoTest) GetF_FloatRepeated() []float32 { + if m != nil { + return m.F_FloatRepeated + } + return nil +} + +func (m *GoTest) GetF_DoubleRepeated() []float64 { + if m != nil { + return m.F_DoubleRepeated + } + return nil +} + +func (m *GoTest) GetF_StringRepeated() []string { + if m != nil { + return m.F_StringRepeated + } + return nil +} + +func (m *GoTest) GetF_BytesRepeated() [][]byte { + if m != nil { + return m.F_BytesRepeated + } + return nil +} + +func (m *GoTest) GetF_Sint32Repeated() []int32 { + if m != nil { + return m.F_Sint32Repeated + } + return nil +} + +func (m *GoTest) GetF_Sint64Repeated() []int64 { + if m != nil { + return m.F_Sint64Repeated + } + return nil +} + +func (m *GoTest) GetF_BoolOptional() bool { + if m != nil && m.F_BoolOptional != nil { + return *m.F_BoolOptional + } + return false +} + +func (m *GoTest) GetF_Int32Optional() int32 { + if m != nil && m.F_Int32Optional != nil { + return *m.F_Int32Optional + } + return 0 +} + +func (m *GoTest) GetF_Int64Optional() int64 { + if m != nil && m.F_Int64Optional != nil { + return *m.F_Int64Optional + } + return 0 +} + +func (m *GoTest) GetF_Fixed32Optional() uint32 { + if m != nil && m.F_Fixed32Optional != nil { + return *m.F_Fixed32Optional + } + return 0 +} + +func (m *GoTest) GetF_Fixed64Optional() uint64 { + if m != nil && m.F_Fixed64Optional != nil { + return *m.F_Fixed64Optional + } + return 0 +} + +func (m *GoTest) GetF_Uint32Optional() uint32 { + if m != nil && m.F_Uint32Optional != nil { + return *m.F_Uint32Optional + } + return 0 +} + +func (m *GoTest) GetF_Uint64Optional() uint64 { + if m != nil && m.F_Uint64Optional != nil { + return *m.F_Uint64Optional + } + return 0 +} + +func (m *GoTest) GetF_FloatOptional() float32 { + if m != nil && m.F_FloatOptional != nil { + return *m.F_FloatOptional + } + return 0 +} + +func (m *GoTest) GetF_DoubleOptional() float64 { + if m != nil && m.F_DoubleOptional != nil { + return *m.F_DoubleOptional + } + return 0 +} + +func (m *GoTest) GetF_StringOptional() string { + if m != nil && m.F_StringOptional != nil { + return *m.F_StringOptional + } + return "" +} + +func (m *GoTest) GetF_BytesOptional() []byte { + if m != nil { + return m.F_BytesOptional + } + return nil +} + +func (m *GoTest) GetF_Sint32Optional() int32 { + if m != nil && m.F_Sint32Optional != nil { + return *m.F_Sint32Optional + } + return 0 +} + +func (m *GoTest) GetF_Sint64Optional() int64 { + if m != nil && m.F_Sint64Optional != nil { + return *m.F_Sint64Optional + } + return 0 +} + +func (m *GoTest) GetF_BoolDefaulted() bool { + if m != nil && m.F_BoolDefaulted != nil { + return *m.F_BoolDefaulted + } + return Default_GoTest_F_BoolDefaulted +} + +func (m *GoTest) GetF_Int32Defaulted() int32 { + if m != nil && m.F_Int32Defaulted != nil { + return *m.F_Int32Defaulted + } + return Default_GoTest_F_Int32Defaulted +} + +func (m *GoTest) GetF_Int64Defaulted() int64 { + if m != nil && m.F_Int64Defaulted != nil { + return *m.F_Int64Defaulted + } + return Default_GoTest_F_Int64Defaulted +} + +func (m *GoTest) GetF_Fixed32Defaulted() uint32 { + if m != nil && m.F_Fixed32Defaulted != nil { + return *m.F_Fixed32Defaulted + } + return Default_GoTest_F_Fixed32Defaulted +} + +func (m *GoTest) GetF_Fixed64Defaulted() uint64 { + if m != nil && m.F_Fixed64Defaulted != nil { + return *m.F_Fixed64Defaulted + } + return Default_GoTest_F_Fixed64Defaulted +} + +func (m *GoTest) GetF_Uint32Defaulted() uint32 { + if m != nil && m.F_Uint32Defaulted != nil { + return *m.F_Uint32Defaulted + } + return Default_GoTest_F_Uint32Defaulted +} + +func (m *GoTest) GetF_Uint64Defaulted() uint64 { + if m != nil && m.F_Uint64Defaulted != nil { + return *m.F_Uint64Defaulted + } + return Default_GoTest_F_Uint64Defaulted +} + +func (m *GoTest) GetF_FloatDefaulted() float32 { + if m != nil && m.F_FloatDefaulted != nil { + return *m.F_FloatDefaulted + } + return Default_GoTest_F_FloatDefaulted +} + +func (m *GoTest) GetF_DoubleDefaulted() float64 { + if m != nil && m.F_DoubleDefaulted != nil { + return *m.F_DoubleDefaulted + } + return Default_GoTest_F_DoubleDefaulted +} + +func (m *GoTest) GetF_StringDefaulted() string { + if m != nil && m.F_StringDefaulted != nil { + return *m.F_StringDefaulted + } + return Default_GoTest_F_StringDefaulted +} + +func (m *GoTest) GetF_BytesDefaulted() []byte { + if m != nil && m.F_BytesDefaulted != nil { + return m.F_BytesDefaulted + } + return append([]byte(nil), Default_GoTest_F_BytesDefaulted...) +} + +func (m *GoTest) GetF_Sint32Defaulted() int32 { + if m != nil && m.F_Sint32Defaulted != nil { + return *m.F_Sint32Defaulted + } + return Default_GoTest_F_Sint32Defaulted +} + +func (m *GoTest) GetF_Sint64Defaulted() int64 { + if m != nil && m.F_Sint64Defaulted != nil { + return *m.F_Sint64Defaulted + } + return Default_GoTest_F_Sint64Defaulted +} + +func (m *GoTest) GetF_BoolRepeatedPacked() []bool { + if m != nil { + return m.F_BoolRepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_Int32RepeatedPacked() []int32 { + if m != nil { + return m.F_Int32RepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_Int64RepeatedPacked() []int64 { + if m != nil { + return m.F_Int64RepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_Fixed32RepeatedPacked() []uint32 { + if m != nil { + return m.F_Fixed32RepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_Fixed64RepeatedPacked() []uint64 { + if m != nil { + return m.F_Fixed64RepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_Uint32RepeatedPacked() []uint32 { + if m != nil { + return m.F_Uint32RepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_Uint64RepeatedPacked() []uint64 { + if m != nil { + return m.F_Uint64RepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_FloatRepeatedPacked() []float32 { + if m != nil { + return m.F_FloatRepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_DoubleRepeatedPacked() []float64 { + if m != nil { + return m.F_DoubleRepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_Sint32RepeatedPacked() []int32 { + if m != nil { + return m.F_Sint32RepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_Sint64RepeatedPacked() []int64 { + if m != nil { + return m.F_Sint64RepeatedPacked + } + return nil +} + +func (m *GoTest) GetRequiredgroup() *GoTest_RequiredGroup { + if m != nil { + return m.Requiredgroup + } + return nil +} + +func (m *GoTest) GetRepeatedgroup() []*GoTest_RepeatedGroup { + if m != nil { + return m.Repeatedgroup + } + return nil +} + +func (m *GoTest) GetOptionalgroup() *GoTest_OptionalGroup { + if m != nil { + return m.Optionalgroup + } + return nil +} + +// Required, repeated, and optional groups. +type GoTest_RequiredGroup struct { + RequiredField *string `protobuf:"bytes,71,req,name=RequiredField,json=requiredField" json:"RequiredField,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GoTest_RequiredGroup) Reset() { *m = GoTest_RequiredGroup{} } +func (m *GoTest_RequiredGroup) String() string { return proto.CompactTextString(m) } +func (*GoTest_RequiredGroup) ProtoMessage() {} +func (*GoTest_RequiredGroup) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2, 0} } + +func (m *GoTest_RequiredGroup) GetRequiredField() string { + if m != nil && m.RequiredField != nil { + return *m.RequiredField + } + return "" +} + +type GoTest_RepeatedGroup struct { + RequiredField *string `protobuf:"bytes,81,req,name=RequiredField,json=requiredField" json:"RequiredField,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GoTest_RepeatedGroup) Reset() { *m = GoTest_RepeatedGroup{} } +func (m *GoTest_RepeatedGroup) String() string { return proto.CompactTextString(m) } +func (*GoTest_RepeatedGroup) ProtoMessage() {} +func (*GoTest_RepeatedGroup) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2, 1} } + +func (m *GoTest_RepeatedGroup) GetRequiredField() string { + if m != nil && m.RequiredField != nil { + return *m.RequiredField + } + return "" +} + +type GoTest_OptionalGroup struct { + RequiredField *string `protobuf:"bytes,91,req,name=RequiredField,json=requiredField" json:"RequiredField,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GoTest_OptionalGroup) Reset() { *m = GoTest_OptionalGroup{} } +func (m *GoTest_OptionalGroup) String() string { return proto.CompactTextString(m) } +func (*GoTest_OptionalGroup) ProtoMessage() {} +func (*GoTest_OptionalGroup) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2, 2} } + +func (m *GoTest_OptionalGroup) GetRequiredField() string { + if m != nil && m.RequiredField != nil { + return *m.RequiredField + } + return "" +} + +// For testing skipping of unrecognized fields. +// Numbers are all big, larger than tag numbers in GoTestField, +// the message used in the corresponding test. +type GoSkipTest struct { + SkipInt32 *int32 `protobuf:"varint,11,req,name=skip_int32,json=skipInt32" json:"skip_int32,omitempty"` + SkipFixed32 *uint32 `protobuf:"fixed32,12,req,name=skip_fixed32,json=skipFixed32" json:"skip_fixed32,omitempty"` + SkipFixed64 *uint64 `protobuf:"fixed64,13,req,name=skip_fixed64,json=skipFixed64" json:"skip_fixed64,omitempty"` + SkipString *string `protobuf:"bytes,14,req,name=skip_string,json=skipString" json:"skip_string,omitempty"` + Skipgroup *GoSkipTest_SkipGroup `protobuf:"group,15,req,name=SkipGroup,json=skipgroup" json:"skipgroup,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GoSkipTest) Reset() { *m = GoSkipTest{} } +func (m *GoSkipTest) String() string { return proto.CompactTextString(m) } +func (*GoSkipTest) ProtoMessage() {} +func (*GoSkipTest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } + +func (m *GoSkipTest) GetSkipInt32() int32 { + if m != nil && m.SkipInt32 != nil { + return *m.SkipInt32 + } + return 0 +} + +func (m *GoSkipTest) GetSkipFixed32() uint32 { + if m != nil && m.SkipFixed32 != nil { + return *m.SkipFixed32 + } + return 0 +} + +func (m *GoSkipTest) GetSkipFixed64() uint64 { + if m != nil && m.SkipFixed64 != nil { + return *m.SkipFixed64 + } + return 0 +} + +func (m *GoSkipTest) GetSkipString() string { + if m != nil && m.SkipString != nil { + return *m.SkipString + } + return "" +} + +func (m *GoSkipTest) GetSkipgroup() *GoSkipTest_SkipGroup { + if m != nil { + return m.Skipgroup + } + return nil +} + +type GoSkipTest_SkipGroup struct { + GroupInt32 *int32 `protobuf:"varint,16,req,name=group_int32,json=groupInt32" json:"group_int32,omitempty"` + GroupString *string `protobuf:"bytes,17,req,name=group_string,json=groupString" json:"group_string,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GoSkipTest_SkipGroup) Reset() { *m = GoSkipTest_SkipGroup{} } +func (m *GoSkipTest_SkipGroup) String() string { return proto.CompactTextString(m) } +func (*GoSkipTest_SkipGroup) ProtoMessage() {} +func (*GoSkipTest_SkipGroup) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3, 0} } + +func (m *GoSkipTest_SkipGroup) GetGroupInt32() int32 { + if m != nil && m.GroupInt32 != nil { + return *m.GroupInt32 + } + return 0 +} + +func (m *GoSkipTest_SkipGroup) GetGroupString() string { + if m != nil && m.GroupString != nil { + return *m.GroupString + } + return "" +} + +// For testing packed/non-packed decoder switching. +// A serialized instance of one should be deserializable as the other. +type NonPackedTest struct { + A []int32 `protobuf:"varint,1,rep,name=a" json:"a,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *NonPackedTest) Reset() { *m = NonPackedTest{} } +func (m *NonPackedTest) String() string { return proto.CompactTextString(m) } +func (*NonPackedTest) ProtoMessage() {} +func (*NonPackedTest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } + +func (m *NonPackedTest) GetA() []int32 { + if m != nil { + return m.A + } + return nil +} + +type PackedTest struct { + B []int32 `protobuf:"varint,1,rep,packed,name=b" json:"b,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *PackedTest) Reset() { *m = PackedTest{} } +func (m *PackedTest) String() string { return proto.CompactTextString(m) } +func (*PackedTest) ProtoMessage() {} +func (*PackedTest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } + +func (m *PackedTest) GetB() []int32 { + if m != nil { + return m.B + } + return nil +} + +type MaxTag struct { + // Maximum possible tag number. + LastField *string `protobuf:"bytes,536870911,opt,name=last_field,json=lastField" json:"last_field,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *MaxTag) Reset() { *m = MaxTag{} } +func (m *MaxTag) String() string { return proto.CompactTextString(m) } +func (*MaxTag) ProtoMessage() {} +func (*MaxTag) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } + +func (m *MaxTag) GetLastField() string { + if m != nil && m.LastField != nil { + return *m.LastField + } + return "" +} + +type OldMessage struct { + Nested *OldMessage_Nested `protobuf:"bytes,1,opt,name=nested" json:"nested,omitempty"` + Num *int32 `protobuf:"varint,2,opt,name=num" json:"num,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *OldMessage) Reset() { *m = OldMessage{} } +func (m *OldMessage) String() string { return proto.CompactTextString(m) } +func (*OldMessage) ProtoMessage() {} +func (*OldMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } + +func (m *OldMessage) GetNested() *OldMessage_Nested { + if m != nil { + return m.Nested + } + return nil +} + +func (m *OldMessage) GetNum() int32 { + if m != nil && m.Num != nil { + return *m.Num + } + return 0 +} + +type OldMessage_Nested struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *OldMessage_Nested) Reset() { *m = OldMessage_Nested{} } +func (m *OldMessage_Nested) String() string { return proto.CompactTextString(m) } +func (*OldMessage_Nested) ProtoMessage() {} +func (*OldMessage_Nested) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7, 0} } + +func (m *OldMessage_Nested) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +// NewMessage is wire compatible with OldMessage; +// imagine it as a future version. +type NewMessage struct { + Nested *NewMessage_Nested `protobuf:"bytes,1,opt,name=nested" json:"nested,omitempty"` + // This is an int32 in OldMessage. + Num *int64 `protobuf:"varint,2,opt,name=num" json:"num,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *NewMessage) Reset() { *m = NewMessage{} } +func (m *NewMessage) String() string { return proto.CompactTextString(m) } +func (*NewMessage) ProtoMessage() {} +func (*NewMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } + +func (m *NewMessage) GetNested() *NewMessage_Nested { + if m != nil { + return m.Nested + } + return nil +} + +func (m *NewMessage) GetNum() int64 { + if m != nil && m.Num != nil { + return *m.Num + } + return 0 +} + +type NewMessage_Nested struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + FoodGroup *string `protobuf:"bytes,2,opt,name=food_group,json=foodGroup" json:"food_group,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *NewMessage_Nested) Reset() { *m = NewMessage_Nested{} } +func (m *NewMessage_Nested) String() string { return proto.CompactTextString(m) } +func (*NewMessage_Nested) ProtoMessage() {} +func (*NewMessage_Nested) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8, 0} } + +func (m *NewMessage_Nested) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *NewMessage_Nested) GetFoodGroup() string { + if m != nil && m.FoodGroup != nil { + return *m.FoodGroup + } + return "" +} + +type InnerMessage struct { + Host *string `protobuf:"bytes,1,req,name=host" json:"host,omitempty"` + Port *int32 `protobuf:"varint,2,opt,name=port,def=4000" json:"port,omitempty"` + Connected *bool `protobuf:"varint,3,opt,name=connected" json:"connected,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *InnerMessage) Reset() { *m = InnerMessage{} } +func (m *InnerMessage) String() string { return proto.CompactTextString(m) } +func (*InnerMessage) ProtoMessage() {} +func (*InnerMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} } + +const Default_InnerMessage_Port int32 = 4000 + +func (m *InnerMessage) GetHost() string { + if m != nil && m.Host != nil { + return *m.Host + } + return "" +} + +func (m *InnerMessage) GetPort() int32 { + if m != nil && m.Port != nil { + return *m.Port + } + return Default_InnerMessage_Port +} + +func (m *InnerMessage) GetConnected() bool { + if m != nil && m.Connected != nil { + return *m.Connected + } + return false +} + +type OtherMessage struct { + Key *int64 `protobuf:"varint,1,opt,name=key" json:"key,omitempty"` + Value []byte `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` + Weight *float32 `protobuf:"fixed32,3,opt,name=weight" json:"weight,omitempty"` + Inner *InnerMessage `protobuf:"bytes,4,opt,name=inner" json:"inner,omitempty"` + XXX_extensions map[int32]proto.Extension `json:"-"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *OtherMessage) Reset() { *m = OtherMessage{} } +func (m *OtherMessage) String() string { return proto.CompactTextString(m) } +func (*OtherMessage) ProtoMessage() {} +func (*OtherMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} } + +var extRange_OtherMessage = []proto.ExtensionRange{ + {100, 536870911}, +} + +func (*OtherMessage) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_OtherMessage +} +func (m *OtherMessage) ExtensionMap() map[int32]proto.Extension { + if m.XXX_extensions == nil { + m.XXX_extensions = make(map[int32]proto.Extension) + } + return m.XXX_extensions +} + +func (m *OtherMessage) GetKey() int64 { + if m != nil && m.Key != nil { + return *m.Key + } + return 0 +} + +func (m *OtherMessage) GetValue() []byte { + if m != nil { + return m.Value + } + return nil +} + +func (m *OtherMessage) GetWeight() float32 { + if m != nil && m.Weight != nil { + return *m.Weight + } + return 0 +} + +func (m *OtherMessage) GetInner() *InnerMessage { + if m != nil { + return m.Inner + } + return nil +} + +type RequiredInnerMessage struct { + LeoFinallyWonAnOscar *InnerMessage `protobuf:"bytes,1,req,name=leo_finally_won_an_oscar,json=leoFinallyWonAnOscar" json:"leo_finally_won_an_oscar,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *RequiredInnerMessage) Reset() { *m = RequiredInnerMessage{} } +func (m *RequiredInnerMessage) String() string { return proto.CompactTextString(m) } +func (*RequiredInnerMessage) ProtoMessage() {} +func (*RequiredInnerMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} } + +func (m *RequiredInnerMessage) GetLeoFinallyWonAnOscar() *InnerMessage { + if m != nil { + return m.LeoFinallyWonAnOscar + } + return nil +} + +type MyMessage struct { + Count *int32 `protobuf:"varint,1,req,name=count" json:"count,omitempty"` + Name *string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"` + Quote *string `protobuf:"bytes,3,opt,name=quote" json:"quote,omitempty"` + Pet []string `protobuf:"bytes,4,rep,name=pet" json:"pet,omitempty"` + Inner *InnerMessage `protobuf:"bytes,5,opt,name=inner" json:"inner,omitempty"` + Others []*OtherMessage `protobuf:"bytes,6,rep,name=others" json:"others,omitempty"` + WeMustGoDeeper *RequiredInnerMessage `protobuf:"bytes,13,opt,name=we_must_go_deeper,json=weMustGoDeeper" json:"we_must_go_deeper,omitempty"` + RepInner []*InnerMessage `protobuf:"bytes,12,rep,name=rep_inner,json=repInner" json:"rep_inner,omitempty"` + Bikeshed *MyMessage_Color `protobuf:"varint,7,opt,name=bikeshed,enum=testdata.MyMessage_Color" json:"bikeshed,omitempty"` + Somegroup *MyMessage_SomeGroup `protobuf:"group,8,opt,name=SomeGroup,json=somegroup" json:"somegroup,omitempty"` + // This field becomes [][]byte in the generated code. + RepBytes [][]byte `protobuf:"bytes,10,rep,name=rep_bytes,json=repBytes" json:"rep_bytes,omitempty"` + Bigfloat *float64 `protobuf:"fixed64,11,opt,name=bigfloat" json:"bigfloat,omitempty"` + XXX_extensions map[int32]proto.Extension `json:"-"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *MyMessage) Reset() { *m = MyMessage{} } +func (m *MyMessage) String() string { return proto.CompactTextString(m) } +func (*MyMessage) ProtoMessage() {} +func (*MyMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} } + +var extRange_MyMessage = []proto.ExtensionRange{ + {100, 536870911}, +} + +func (*MyMessage) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_MyMessage +} +func (m *MyMessage) ExtensionMap() map[int32]proto.Extension { + if m.XXX_extensions == nil { + m.XXX_extensions = make(map[int32]proto.Extension) + } + return m.XXX_extensions +} + +func (m *MyMessage) GetCount() int32 { + if m != nil && m.Count != nil { + return *m.Count + } + return 0 +} + +func (m *MyMessage) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *MyMessage) GetQuote() string { + if m != nil && m.Quote != nil { + return *m.Quote + } + return "" +} + +func (m *MyMessage) GetPet() []string { + if m != nil { + return m.Pet + } + return nil +} + +func (m *MyMessage) GetInner() *InnerMessage { + if m != nil { + return m.Inner + } + return nil +} + +func (m *MyMessage) GetOthers() []*OtherMessage { + if m != nil { + return m.Others + } + return nil +} + +func (m *MyMessage) GetWeMustGoDeeper() *RequiredInnerMessage { + if m != nil { + return m.WeMustGoDeeper + } + return nil +} + +func (m *MyMessage) GetRepInner() []*InnerMessage { + if m != nil { + return m.RepInner + } + return nil +} + +func (m *MyMessage) GetBikeshed() MyMessage_Color { + if m != nil && m.Bikeshed != nil { + return *m.Bikeshed + } + return MyMessage_RED +} + +func (m *MyMessage) GetSomegroup() *MyMessage_SomeGroup { + if m != nil { + return m.Somegroup + } + return nil +} + +func (m *MyMessage) GetRepBytes() [][]byte { + if m != nil { + return m.RepBytes + } + return nil +} + +func (m *MyMessage) GetBigfloat() float64 { + if m != nil && m.Bigfloat != nil { + return *m.Bigfloat + } + return 0 +} + +type MyMessage_SomeGroup struct { + GroupField *int32 `protobuf:"varint,9,opt,name=group_field,json=groupField" json:"group_field,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *MyMessage_SomeGroup) Reset() { *m = MyMessage_SomeGroup{} } +func (m *MyMessage_SomeGroup) String() string { return proto.CompactTextString(m) } +func (*MyMessage_SomeGroup) ProtoMessage() {} +func (*MyMessage_SomeGroup) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12, 0} } + +func (m *MyMessage_SomeGroup) GetGroupField() int32 { + if m != nil && m.GroupField != nil { + return *m.GroupField + } + return 0 +} + +type Ext struct { + Data *string `protobuf:"bytes,1,opt,name=data" json:"data,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Ext) Reset() { *m = Ext{} } +func (m *Ext) String() string { return proto.CompactTextString(m) } +func (*Ext) ProtoMessage() {} +func (*Ext) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} } + +func (m *Ext) GetData() string { + if m != nil && m.Data != nil { + return *m.Data + } + return "" +} + +var E_Ext_More = &proto.ExtensionDesc{ + ExtendedType: (*MyMessage)(nil), + ExtensionType: (*Ext)(nil), + Field: 103, + Name: "testdata.Ext.more", + Tag: "bytes,103,opt,name=more", +} + +var E_Ext_Text = &proto.ExtensionDesc{ + ExtendedType: (*MyMessage)(nil), + ExtensionType: (*string)(nil), + Field: 104, + Name: "testdata.Ext.text", + Tag: "bytes,104,opt,name=text", +} + +var E_Ext_Number = &proto.ExtensionDesc{ + ExtendedType: (*MyMessage)(nil), + ExtensionType: (*int32)(nil), + Field: 105, + Name: "testdata.Ext.number", + Tag: "varint,105,opt,name=number", +} + +type ComplexExtension struct { + First *int32 `protobuf:"varint,1,opt,name=first" json:"first,omitempty"` + Second *int32 `protobuf:"varint,2,opt,name=second" json:"second,omitempty"` + Third []int32 `protobuf:"varint,3,rep,name=third" json:"third,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *ComplexExtension) Reset() { *m = ComplexExtension{} } +func (m *ComplexExtension) String() string { return proto.CompactTextString(m) } +func (*ComplexExtension) ProtoMessage() {} +func (*ComplexExtension) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} } + +func (m *ComplexExtension) GetFirst() int32 { + if m != nil && m.First != nil { + return *m.First + } + return 0 +} + +func (m *ComplexExtension) GetSecond() int32 { + if m != nil && m.Second != nil { + return *m.Second + } + return 0 +} + +func (m *ComplexExtension) GetThird() []int32 { + if m != nil { + return m.Third + } + return nil +} + +type DefaultsMessage struct { + XXX_extensions map[int32]proto.Extension `json:"-"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *DefaultsMessage) Reset() { *m = DefaultsMessage{} } +func (m *DefaultsMessage) String() string { return proto.CompactTextString(m) } +func (*DefaultsMessage) ProtoMessage() {} +func (*DefaultsMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} } + +var extRange_DefaultsMessage = []proto.ExtensionRange{ + {100, 536870911}, +} + +func (*DefaultsMessage) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_DefaultsMessage +} +func (m *DefaultsMessage) ExtensionMap() map[int32]proto.Extension { + if m.XXX_extensions == nil { + m.XXX_extensions = make(map[int32]proto.Extension) + } + return m.XXX_extensions +} + +type MyMessageSet struct { + XXX_extensions map[int32]proto.Extension `json:"-"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *MyMessageSet) Reset() { *m = MyMessageSet{} } +func (m *MyMessageSet) String() string { return proto.CompactTextString(m) } +func (*MyMessageSet) ProtoMessage() {} +func (*MyMessageSet) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} } + +func (m *MyMessageSet) Marshal() ([]byte, error) { + return proto.MarshalMessageSet(m.ExtensionMap()) +} +func (m *MyMessageSet) Unmarshal(buf []byte) error { + return proto.UnmarshalMessageSet(buf, m.ExtensionMap()) +} +func (m *MyMessageSet) MarshalJSON() ([]byte, error) { + return proto.MarshalMessageSetJSON(m.XXX_extensions) +} +func (m *MyMessageSet) UnmarshalJSON(buf []byte) error { + return proto.UnmarshalMessageSetJSON(buf, m.XXX_extensions) +} + +// ensure MyMessageSet satisfies proto.Marshaler and proto.Unmarshaler +var _ proto.Marshaler = (*MyMessageSet)(nil) +var _ proto.Unmarshaler = (*MyMessageSet)(nil) + +var extRange_MyMessageSet = []proto.ExtensionRange{ + {100, 2147483646}, +} + +func (*MyMessageSet) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_MyMessageSet +} +func (m *MyMessageSet) ExtensionMap() map[int32]proto.Extension { + if m.XXX_extensions == nil { + m.XXX_extensions = make(map[int32]proto.Extension) + } + return m.XXX_extensions +} + +type Empty struct { + XXX_unrecognized []byte `json:"-"` +} + +func (m *Empty) Reset() { *m = Empty{} } +func (m *Empty) String() string { return proto.CompactTextString(m) } +func (*Empty) ProtoMessage() {} +func (*Empty) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} } + +type MessageList struct { + Message []*MessageList_Message `protobuf:"group,1,rep,name=Message,json=message" json:"message,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *MessageList) Reset() { *m = MessageList{} } +func (m *MessageList) String() string { return proto.CompactTextString(m) } +func (*MessageList) ProtoMessage() {} +func (*MessageList) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} } + +func (m *MessageList) GetMessage() []*MessageList_Message { + if m != nil { + return m.Message + } + return nil +} + +type MessageList_Message struct { + Name *string `protobuf:"bytes,2,req,name=name" json:"name,omitempty"` + Count *int32 `protobuf:"varint,3,req,name=count" json:"count,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *MessageList_Message) Reset() { *m = MessageList_Message{} } +func (m *MessageList_Message) String() string { return proto.CompactTextString(m) } +func (*MessageList_Message) ProtoMessage() {} +func (*MessageList_Message) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18, 0} } + +func (m *MessageList_Message) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *MessageList_Message) GetCount() int32 { + if m != nil && m.Count != nil { + return *m.Count + } + return 0 +} + +type Strings struct { + StringField *string `protobuf:"bytes,1,opt,name=string_field,json=stringField" json:"string_field,omitempty"` + BytesField []byte `protobuf:"bytes,2,opt,name=bytes_field,json=bytesField" json:"bytes_field,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Strings) Reset() { *m = Strings{} } +func (m *Strings) String() string { return proto.CompactTextString(m) } +func (*Strings) ProtoMessage() {} +func (*Strings) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} } + +func (m *Strings) GetStringField() string { + if m != nil && m.StringField != nil { + return *m.StringField + } + return "" +} + +func (m *Strings) GetBytesField() []byte { + if m != nil { + return m.BytesField + } + return nil +} + +type Defaults struct { + // Default-valued fields of all basic types. + // Same as GoTest, but copied here to make testing easier. + F_Bool *bool `protobuf:"varint,1,opt,name=F_Bool,json=fBool,def=1" json:"F_Bool,omitempty"` + F_Int32 *int32 `protobuf:"varint,2,opt,name=F_Int32,json=fInt32,def=32" json:"F_Int32,omitempty"` + F_Int64 *int64 `protobuf:"varint,3,opt,name=F_Int64,json=fInt64,def=64" json:"F_Int64,omitempty"` + F_Fixed32 *uint32 `protobuf:"fixed32,4,opt,name=F_Fixed32,json=fFixed32,def=320" json:"F_Fixed32,omitempty"` + F_Fixed64 *uint64 `protobuf:"fixed64,5,opt,name=F_Fixed64,json=fFixed64,def=640" json:"F_Fixed64,omitempty"` + F_Uint32 *uint32 `protobuf:"varint,6,opt,name=F_Uint32,json=fUint32,def=3200" json:"F_Uint32,omitempty"` + F_Uint64 *uint64 `protobuf:"varint,7,opt,name=F_Uint64,json=fUint64,def=6400" json:"F_Uint64,omitempty"` + F_Float *float32 `protobuf:"fixed32,8,opt,name=F_Float,json=fFloat,def=314159" json:"F_Float,omitempty"` + F_Double *float64 `protobuf:"fixed64,9,opt,name=F_Double,json=fDouble,def=271828" json:"F_Double,omitempty"` + F_String *string `protobuf:"bytes,10,opt,name=F_String,json=fString,def=hello, \"world!\"\n" json:"F_String,omitempty"` + F_Bytes []byte `protobuf:"bytes,11,opt,name=F_Bytes,json=fBytes,def=Bignose" json:"F_Bytes,omitempty"` + F_Sint32 *int32 `protobuf:"zigzag32,12,opt,name=F_Sint32,json=fSint32,def=-32" json:"F_Sint32,omitempty"` + F_Sint64 *int64 `protobuf:"zigzag64,13,opt,name=F_Sint64,json=fSint64,def=-64" json:"F_Sint64,omitempty"` + F_Enum *Defaults_Color `protobuf:"varint,14,opt,name=F_Enum,json=fEnum,enum=testdata.Defaults_Color,def=1" json:"F_Enum,omitempty"` + // More fields with crazy defaults. + F_Pinf *float32 `protobuf:"fixed32,15,opt,name=F_Pinf,json=fPinf,def=inf" json:"F_Pinf,omitempty"` + F_Ninf *float32 `protobuf:"fixed32,16,opt,name=F_Ninf,json=fNinf,def=-inf" json:"F_Ninf,omitempty"` + F_Nan *float32 `protobuf:"fixed32,17,opt,name=F_Nan,json=fNan,def=nan" json:"F_Nan,omitempty"` + // Sub-message. + Sub *SubDefaults `protobuf:"bytes,18,opt,name=sub" json:"sub,omitempty"` + // Redundant but explicit defaults. + StrZero *string `protobuf:"bytes,19,opt,name=str_zero,json=strZero,def=" json:"str_zero,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Defaults) Reset() { *m = Defaults{} } +func (m *Defaults) String() string { return proto.CompactTextString(m) } +func (*Defaults) ProtoMessage() {} +func (*Defaults) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} } + +const Default_Defaults_F_Bool bool = true +const Default_Defaults_F_Int32 int32 = 32 +const Default_Defaults_F_Int64 int64 = 64 +const Default_Defaults_F_Fixed32 uint32 = 320 +const Default_Defaults_F_Fixed64 uint64 = 640 +const Default_Defaults_F_Uint32 uint32 = 3200 +const Default_Defaults_F_Uint64 uint64 = 6400 +const Default_Defaults_F_Float float32 = 314159 +const Default_Defaults_F_Double float64 = 271828 +const Default_Defaults_F_String string = "hello, \"world!\"\n" + +var Default_Defaults_F_Bytes []byte = []byte("Bignose") + +const Default_Defaults_F_Sint32 int32 = -32 +const Default_Defaults_F_Sint64 int64 = -64 +const Default_Defaults_F_Enum Defaults_Color = Defaults_GREEN + +var Default_Defaults_F_Pinf float32 = float32(math.Inf(1)) +var Default_Defaults_F_Ninf float32 = float32(math.Inf(-1)) +var Default_Defaults_F_Nan float32 = float32(math.NaN()) + +func (m *Defaults) GetF_Bool() bool { + if m != nil && m.F_Bool != nil { + return *m.F_Bool + } + return Default_Defaults_F_Bool +} + +func (m *Defaults) GetF_Int32() int32 { + if m != nil && m.F_Int32 != nil { + return *m.F_Int32 + } + return Default_Defaults_F_Int32 +} + +func (m *Defaults) GetF_Int64() int64 { + if m != nil && m.F_Int64 != nil { + return *m.F_Int64 + } + return Default_Defaults_F_Int64 +} + +func (m *Defaults) GetF_Fixed32() uint32 { + if m != nil && m.F_Fixed32 != nil { + return *m.F_Fixed32 + } + return Default_Defaults_F_Fixed32 +} + +func (m *Defaults) GetF_Fixed64() uint64 { + if m != nil && m.F_Fixed64 != nil { + return *m.F_Fixed64 + } + return Default_Defaults_F_Fixed64 +} + +func (m *Defaults) GetF_Uint32() uint32 { + if m != nil && m.F_Uint32 != nil { + return *m.F_Uint32 + } + return Default_Defaults_F_Uint32 +} + +func (m *Defaults) GetF_Uint64() uint64 { + if m != nil && m.F_Uint64 != nil { + return *m.F_Uint64 + } + return Default_Defaults_F_Uint64 +} + +func (m *Defaults) GetF_Float() float32 { + if m != nil && m.F_Float != nil { + return *m.F_Float + } + return Default_Defaults_F_Float +} + +func (m *Defaults) GetF_Double() float64 { + if m != nil && m.F_Double != nil { + return *m.F_Double + } + return Default_Defaults_F_Double +} + +func (m *Defaults) GetF_String() string { + if m != nil && m.F_String != nil { + return *m.F_String + } + return Default_Defaults_F_String +} + +func (m *Defaults) GetF_Bytes() []byte { + if m != nil && m.F_Bytes != nil { + return m.F_Bytes + } + return append([]byte(nil), Default_Defaults_F_Bytes...) +} + +func (m *Defaults) GetF_Sint32() int32 { + if m != nil && m.F_Sint32 != nil { + return *m.F_Sint32 + } + return Default_Defaults_F_Sint32 +} + +func (m *Defaults) GetF_Sint64() int64 { + if m != nil && m.F_Sint64 != nil { + return *m.F_Sint64 + } + return Default_Defaults_F_Sint64 +} + +func (m *Defaults) GetF_Enum() Defaults_Color { + if m != nil && m.F_Enum != nil { + return *m.F_Enum + } + return Default_Defaults_F_Enum +} + +func (m *Defaults) GetF_Pinf() float32 { + if m != nil && m.F_Pinf != nil { + return *m.F_Pinf + } + return Default_Defaults_F_Pinf +} + +func (m *Defaults) GetF_Ninf() float32 { + if m != nil && m.F_Ninf != nil { + return *m.F_Ninf + } + return Default_Defaults_F_Ninf +} + +func (m *Defaults) GetF_Nan() float32 { + if m != nil && m.F_Nan != nil { + return *m.F_Nan + } + return Default_Defaults_F_Nan +} + +func (m *Defaults) GetSub() *SubDefaults { + if m != nil { + return m.Sub + } + return nil +} + +func (m *Defaults) GetStrZero() string { + if m != nil && m.StrZero != nil { + return *m.StrZero + } + return "" +} + +type SubDefaults struct { + N *int64 `protobuf:"varint,1,opt,name=n,def=7" json:"n,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *SubDefaults) Reset() { *m = SubDefaults{} } +func (m *SubDefaults) String() string { return proto.CompactTextString(m) } +func (*SubDefaults) ProtoMessage() {} +func (*SubDefaults) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} } + +const Default_SubDefaults_N int64 = 7 + +func (m *SubDefaults) GetN() int64 { + if m != nil && m.N != nil { + return *m.N + } + return Default_SubDefaults_N +} + +type RepeatedEnum struct { + Color []RepeatedEnum_Color `protobuf:"varint,1,rep,name=color,enum=testdata.RepeatedEnum_Color" json:"color,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *RepeatedEnum) Reset() { *m = RepeatedEnum{} } +func (m *RepeatedEnum) String() string { return proto.CompactTextString(m) } +func (*RepeatedEnum) ProtoMessage() {} +func (*RepeatedEnum) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22} } + +func (m *RepeatedEnum) GetColor() []RepeatedEnum_Color { + if m != nil { + return m.Color + } + return nil +} + +type MoreRepeated struct { + Bools []bool `protobuf:"varint,1,rep,name=bools" json:"bools,omitempty"` + BoolsPacked []bool `protobuf:"varint,2,rep,packed,name=bools_packed,json=boolsPacked" json:"bools_packed,omitempty"` + Ints []int32 `protobuf:"varint,3,rep,name=ints" json:"ints,omitempty"` + IntsPacked []int32 `protobuf:"varint,4,rep,packed,name=ints_packed,json=intsPacked" json:"ints_packed,omitempty"` + Int64SPacked []int64 `protobuf:"varint,7,rep,packed,name=int64s_packed,json=int64sPacked" json:"int64s_packed,omitempty"` + Strings []string `protobuf:"bytes,5,rep,name=strings" json:"strings,omitempty"` + Fixeds []uint32 `protobuf:"fixed32,6,rep,name=fixeds" json:"fixeds,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *MoreRepeated) Reset() { *m = MoreRepeated{} } +func (m *MoreRepeated) String() string { return proto.CompactTextString(m) } +func (*MoreRepeated) ProtoMessage() {} +func (*MoreRepeated) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} } + +func (m *MoreRepeated) GetBools() []bool { + if m != nil { + return m.Bools + } + return nil +} + +func (m *MoreRepeated) GetBoolsPacked() []bool { + if m != nil { + return m.BoolsPacked + } + return nil +} + +func (m *MoreRepeated) GetInts() []int32 { + if m != nil { + return m.Ints + } + return nil +} + +func (m *MoreRepeated) GetIntsPacked() []int32 { + if m != nil { + return m.IntsPacked + } + return nil +} + +func (m *MoreRepeated) GetInt64SPacked() []int64 { + if m != nil { + return m.Int64SPacked + } + return nil +} + +func (m *MoreRepeated) GetStrings() []string { + if m != nil { + return m.Strings + } + return nil +} + +func (m *MoreRepeated) GetFixeds() []uint32 { + if m != nil { + return m.Fixeds + } + return nil +} + +type GroupOld struct { + G *GroupOld_G `protobuf:"group,101,opt,name=G,json=g" json:"g,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GroupOld) Reset() { *m = GroupOld{} } +func (m *GroupOld) String() string { return proto.CompactTextString(m) } +func (*GroupOld) ProtoMessage() {} +func (*GroupOld) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24} } + +func (m *GroupOld) GetG() *GroupOld_G { + if m != nil { + return m.G + } + return nil +} + +type GroupOld_G struct { + X *int32 `protobuf:"varint,2,opt,name=x" json:"x,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GroupOld_G) Reset() { *m = GroupOld_G{} } +func (m *GroupOld_G) String() string { return proto.CompactTextString(m) } +func (*GroupOld_G) ProtoMessage() {} +func (*GroupOld_G) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24, 0} } + +func (m *GroupOld_G) GetX() int32 { + if m != nil && m.X != nil { + return *m.X + } + return 0 +} + +type GroupNew struct { + G *GroupNew_G `protobuf:"group,101,opt,name=G,json=g" json:"g,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GroupNew) Reset() { *m = GroupNew{} } +func (m *GroupNew) String() string { return proto.CompactTextString(m) } +func (*GroupNew) ProtoMessage() {} +func (*GroupNew) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{25} } + +func (m *GroupNew) GetG() *GroupNew_G { + if m != nil { + return m.G + } + return nil +} + +type GroupNew_G struct { + X *int32 `protobuf:"varint,2,opt,name=x" json:"x,omitempty"` + Y *int32 `protobuf:"varint,3,opt,name=y" json:"y,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GroupNew_G) Reset() { *m = GroupNew_G{} } +func (m *GroupNew_G) String() string { return proto.CompactTextString(m) } +func (*GroupNew_G) ProtoMessage() {} +func (*GroupNew_G) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{25, 0} } + +func (m *GroupNew_G) GetX() int32 { + if m != nil && m.X != nil { + return *m.X + } + return 0 +} + +func (m *GroupNew_G) GetY() int32 { + if m != nil && m.Y != nil { + return *m.Y + } + return 0 +} + +type FloatingPoint struct { + F *float64 `protobuf:"fixed64,1,req,name=f" json:"f,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *FloatingPoint) Reset() { *m = FloatingPoint{} } +func (m *FloatingPoint) String() string { return proto.CompactTextString(m) } +func (*FloatingPoint) ProtoMessage() {} +func (*FloatingPoint) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{26} } + +func (m *FloatingPoint) GetF() float64 { + if m != nil && m.F != nil { + return *m.F + } + return 0 +} + +type MessageWithMap struct { + NameMapping map[int32]string `protobuf:"bytes,1,rep,name=name_mapping,json=nameMapping" json:"name_mapping,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + MsgMapping map[int64]*FloatingPoint `protobuf:"bytes,2,rep,name=msg_mapping,json=msgMapping" json:"msg_mapping,omitempty" protobuf_key:"zigzag64,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + ByteMapping map[bool][]byte `protobuf:"bytes,3,rep,name=byte_mapping,json=byteMapping" json:"byte_mapping,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + StrToStr map[string]string `protobuf:"bytes,4,rep,name=str_to_str,json=strToStr" json:"str_to_str,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *MessageWithMap) Reset() { *m = MessageWithMap{} } +func (m *MessageWithMap) String() string { return proto.CompactTextString(m) } +func (*MessageWithMap) ProtoMessage() {} +func (*MessageWithMap) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{27} } + +func (m *MessageWithMap) GetNameMapping() map[int32]string { + if m != nil { + return m.NameMapping + } + return nil +} + +func (m *MessageWithMap) GetMsgMapping() map[int64]*FloatingPoint { + if m != nil { + return m.MsgMapping + } + return nil +} + +func (m *MessageWithMap) GetByteMapping() map[bool][]byte { + if m != nil { + return m.ByteMapping + } + return nil +} + +func (m *MessageWithMap) GetStrToStr() map[string]string { + if m != nil { + return m.StrToStr + } + return nil +} + +type Oneof struct { + // Types that are valid to be assigned to Union: + // *Oneof_F_Bool + // *Oneof_F_Int32 + // *Oneof_F_Int64 + // *Oneof_F_Fixed32 + // *Oneof_F_Fixed64 + // *Oneof_F_Uint32 + // *Oneof_F_Uint64 + // *Oneof_F_Float + // *Oneof_F_Double + // *Oneof_F_String + // *Oneof_F_Bytes + // *Oneof_F_Sint32 + // *Oneof_F_Sint64 + // *Oneof_F_Enum + // *Oneof_F_Message + // *Oneof_FGroup + // *Oneof_F_Largest_Tag + Union isOneof_Union `protobuf_oneof:"union"` + // Types that are valid to be assigned to Tormato: + // *Oneof_Value + Tormato isOneof_Tormato `protobuf_oneof:"tormato"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Oneof) Reset() { *m = Oneof{} } +func (m *Oneof) String() string { return proto.CompactTextString(m) } +func (*Oneof) ProtoMessage() {} +func (*Oneof) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{28} } + +type isOneof_Union interface { + isOneof_Union() +} +type isOneof_Tormato interface { + isOneof_Tormato() +} + +type Oneof_F_Bool struct { + F_Bool bool `protobuf:"varint,1,opt,name=F_Bool,json=fBool,oneof"` +} +type Oneof_F_Int32 struct { + F_Int32 int32 `protobuf:"varint,2,opt,name=F_Int32,json=fInt32,oneof"` +} +type Oneof_F_Int64 struct { + F_Int64 int64 `protobuf:"varint,3,opt,name=F_Int64,json=fInt64,oneof"` +} +type Oneof_F_Fixed32 struct { + F_Fixed32 uint32 `protobuf:"fixed32,4,opt,name=F_Fixed32,json=fFixed32,oneof"` +} +type Oneof_F_Fixed64 struct { + F_Fixed64 uint64 `protobuf:"fixed64,5,opt,name=F_Fixed64,json=fFixed64,oneof"` +} +type Oneof_F_Uint32 struct { + F_Uint32 uint32 `protobuf:"varint,6,opt,name=F_Uint32,json=fUint32,oneof"` +} +type Oneof_F_Uint64 struct { + F_Uint64 uint64 `protobuf:"varint,7,opt,name=F_Uint64,json=fUint64,oneof"` +} +type Oneof_F_Float struct { + F_Float float32 `protobuf:"fixed32,8,opt,name=F_Float,json=fFloat,oneof"` +} +type Oneof_F_Double struct { + F_Double float64 `protobuf:"fixed64,9,opt,name=F_Double,json=fDouble,oneof"` +} +type Oneof_F_String struct { + F_String string `protobuf:"bytes,10,opt,name=F_String,json=fString,oneof"` +} +type Oneof_F_Bytes struct { + F_Bytes []byte `protobuf:"bytes,11,opt,name=F_Bytes,json=fBytes,oneof"` +} +type Oneof_F_Sint32 struct { + F_Sint32 int32 `protobuf:"zigzag32,12,opt,name=F_Sint32,json=fSint32,oneof"` +} +type Oneof_F_Sint64 struct { + F_Sint64 int64 `protobuf:"zigzag64,13,opt,name=F_Sint64,json=fSint64,oneof"` +} +type Oneof_F_Enum struct { + F_Enum MyMessage_Color `protobuf:"varint,14,opt,name=F_Enum,json=fEnum,enum=testdata.MyMessage_Color,oneof"` +} +type Oneof_F_Message struct { + F_Message *GoTestField `protobuf:"bytes,15,opt,name=F_Message,json=fMessage,oneof"` +} +type Oneof_FGroup struct { + FGroup *Oneof_F_Group `protobuf:"group,16,opt,name=F_Group,json=fGroup,oneof"` +} +type Oneof_F_Largest_Tag struct { + F_Largest_Tag int32 `protobuf:"varint,536870911,opt,name=F_Largest_Tag,json=fLargestTag,oneof"` +} +type Oneof_Value struct { + Value int32 `protobuf:"varint,100,opt,name=value,oneof"` +} + +func (*Oneof_F_Bool) isOneof_Union() {} +func (*Oneof_F_Int32) isOneof_Union() {} +func (*Oneof_F_Int64) isOneof_Union() {} +func (*Oneof_F_Fixed32) isOneof_Union() {} +func (*Oneof_F_Fixed64) isOneof_Union() {} +func (*Oneof_F_Uint32) isOneof_Union() {} +func (*Oneof_F_Uint64) isOneof_Union() {} +func (*Oneof_F_Float) isOneof_Union() {} +func (*Oneof_F_Double) isOneof_Union() {} +func (*Oneof_F_String) isOneof_Union() {} +func (*Oneof_F_Bytes) isOneof_Union() {} +func (*Oneof_F_Sint32) isOneof_Union() {} +func (*Oneof_F_Sint64) isOneof_Union() {} +func (*Oneof_F_Enum) isOneof_Union() {} +func (*Oneof_F_Message) isOneof_Union() {} +func (*Oneof_FGroup) isOneof_Union() {} +func (*Oneof_F_Largest_Tag) isOneof_Union() {} +func (*Oneof_Value) isOneof_Tormato() {} + +func (m *Oneof) GetUnion() isOneof_Union { + if m != nil { + return m.Union + } + return nil +} +func (m *Oneof) GetTormato() isOneof_Tormato { + if m != nil { + return m.Tormato + } + return nil +} + +func (m *Oneof) GetF_Bool() bool { + if x, ok := m.GetUnion().(*Oneof_F_Bool); ok { + return x.F_Bool + } + return false +} + +func (m *Oneof) GetF_Int32() int32 { + if x, ok := m.GetUnion().(*Oneof_F_Int32); ok { + return x.F_Int32 + } + return 0 +} + +func (m *Oneof) GetF_Int64() int64 { + if x, ok := m.GetUnion().(*Oneof_F_Int64); ok { + return x.F_Int64 + } + return 0 +} + +func (m *Oneof) GetF_Fixed32() uint32 { + if x, ok := m.GetUnion().(*Oneof_F_Fixed32); ok { + return x.F_Fixed32 + } + return 0 +} + +func (m *Oneof) GetF_Fixed64() uint64 { + if x, ok := m.GetUnion().(*Oneof_F_Fixed64); ok { + return x.F_Fixed64 + } + return 0 +} + +func (m *Oneof) GetF_Uint32() uint32 { + if x, ok := m.GetUnion().(*Oneof_F_Uint32); ok { + return x.F_Uint32 + } + return 0 +} + +func (m *Oneof) GetF_Uint64() uint64 { + if x, ok := m.GetUnion().(*Oneof_F_Uint64); ok { + return x.F_Uint64 + } + return 0 +} + +func (m *Oneof) GetF_Float() float32 { + if x, ok := m.GetUnion().(*Oneof_F_Float); ok { + return x.F_Float + } + return 0 +} + +func (m *Oneof) GetF_Double() float64 { + if x, ok := m.GetUnion().(*Oneof_F_Double); ok { + return x.F_Double + } + return 0 +} + +func (m *Oneof) GetF_String() string { + if x, ok := m.GetUnion().(*Oneof_F_String); ok { + return x.F_String + } + return "" +} + +func (m *Oneof) GetF_Bytes() []byte { + if x, ok := m.GetUnion().(*Oneof_F_Bytes); ok { + return x.F_Bytes + } + return nil +} + +func (m *Oneof) GetF_Sint32() int32 { + if x, ok := m.GetUnion().(*Oneof_F_Sint32); ok { + return x.F_Sint32 + } + return 0 +} + +func (m *Oneof) GetF_Sint64() int64 { + if x, ok := m.GetUnion().(*Oneof_F_Sint64); ok { + return x.F_Sint64 + } + return 0 +} + +func (m *Oneof) GetF_Enum() MyMessage_Color { + if x, ok := m.GetUnion().(*Oneof_F_Enum); ok { + return x.F_Enum + } + return MyMessage_RED +} + +func (m *Oneof) GetF_Message() *GoTestField { + if x, ok := m.GetUnion().(*Oneof_F_Message); ok { + return x.F_Message + } + return nil +} + +func (m *Oneof) GetFGroup() *Oneof_F_Group { + if x, ok := m.GetUnion().(*Oneof_FGroup); ok { + return x.FGroup + } + return nil +} + +func (m *Oneof) GetF_Largest_Tag() int32 { + if x, ok := m.GetUnion().(*Oneof_F_Largest_Tag); ok { + return x.F_Largest_Tag + } + return 0 +} + +func (m *Oneof) GetValue() int32 { + if x, ok := m.GetTormato().(*Oneof_Value); ok { + return x.Value + } + return 0 +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*Oneof) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _Oneof_OneofMarshaler, _Oneof_OneofUnmarshaler, _Oneof_OneofSizer, []interface{}{ + (*Oneof_F_Bool)(nil), + (*Oneof_F_Int32)(nil), + (*Oneof_F_Int64)(nil), + (*Oneof_F_Fixed32)(nil), + (*Oneof_F_Fixed64)(nil), + (*Oneof_F_Uint32)(nil), + (*Oneof_F_Uint64)(nil), + (*Oneof_F_Float)(nil), + (*Oneof_F_Double)(nil), + (*Oneof_F_String)(nil), + (*Oneof_F_Bytes)(nil), + (*Oneof_F_Sint32)(nil), + (*Oneof_F_Sint64)(nil), + (*Oneof_F_Enum)(nil), + (*Oneof_F_Message)(nil), + (*Oneof_FGroup)(nil), + (*Oneof_F_Largest_Tag)(nil), + (*Oneof_Value)(nil), + } +} + +func _Oneof_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*Oneof) + // union + switch x := m.Union.(type) { + case *Oneof_F_Bool: + t := uint64(0) + if x.F_Bool { + t = 1 + } + b.EncodeVarint(1<<3 | proto.WireVarint) + b.EncodeVarint(t) + case *Oneof_F_Int32: + b.EncodeVarint(2<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.F_Int32)) + case *Oneof_F_Int64: + b.EncodeVarint(3<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.F_Int64)) + case *Oneof_F_Fixed32: + b.EncodeVarint(4<<3 | proto.WireFixed32) + b.EncodeFixed32(uint64(x.F_Fixed32)) + case *Oneof_F_Fixed64: + b.EncodeVarint(5<<3 | proto.WireFixed64) + b.EncodeFixed64(uint64(x.F_Fixed64)) + case *Oneof_F_Uint32: + b.EncodeVarint(6<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.F_Uint32)) + case *Oneof_F_Uint64: + b.EncodeVarint(7<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.F_Uint64)) + case *Oneof_F_Float: + b.EncodeVarint(8<<3 | proto.WireFixed32) + b.EncodeFixed32(uint64(math.Float32bits(x.F_Float))) + case *Oneof_F_Double: + b.EncodeVarint(9<<3 | proto.WireFixed64) + b.EncodeFixed64(math.Float64bits(x.F_Double)) + case *Oneof_F_String: + b.EncodeVarint(10<<3 | proto.WireBytes) + b.EncodeStringBytes(x.F_String) + case *Oneof_F_Bytes: + b.EncodeVarint(11<<3 | proto.WireBytes) + b.EncodeRawBytes(x.F_Bytes) + case *Oneof_F_Sint32: + b.EncodeVarint(12<<3 | proto.WireVarint) + b.EncodeZigzag32(uint64(x.F_Sint32)) + case *Oneof_F_Sint64: + b.EncodeVarint(13<<3 | proto.WireVarint) + b.EncodeZigzag64(uint64(x.F_Sint64)) + case *Oneof_F_Enum: + b.EncodeVarint(14<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.F_Enum)) + case *Oneof_F_Message: + b.EncodeVarint(15<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.F_Message); err != nil { + return err + } + case *Oneof_FGroup: + b.EncodeVarint(16<<3 | proto.WireStartGroup) + if err := b.Marshal(x.FGroup); err != nil { + return err + } + b.EncodeVarint(16<<3 | proto.WireEndGroup) + case *Oneof_F_Largest_Tag: + b.EncodeVarint(536870911<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.F_Largest_Tag)) + case nil: + default: + return fmt.Errorf("Oneof.Union has unexpected type %T", x) + } + // tormato + switch x := m.Tormato.(type) { + case *Oneof_Value: + b.EncodeVarint(100<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.Value)) + case nil: + default: + return fmt.Errorf("Oneof.Tormato has unexpected type %T", x) + } + return nil +} + +func _Oneof_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*Oneof) + switch tag { + case 1: // union.F_Bool + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Oneof_F_Bool{x != 0} + return true, err + case 2: // union.F_Int32 + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Oneof_F_Int32{int32(x)} + return true, err + case 3: // union.F_Int64 + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Oneof_F_Int64{int64(x)} + return true, err + case 4: // union.F_Fixed32 + if wire != proto.WireFixed32 { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeFixed32() + m.Union = &Oneof_F_Fixed32{uint32(x)} + return true, err + case 5: // union.F_Fixed64 + if wire != proto.WireFixed64 { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeFixed64() + m.Union = &Oneof_F_Fixed64{x} + return true, err + case 6: // union.F_Uint32 + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Oneof_F_Uint32{uint32(x)} + return true, err + case 7: // union.F_Uint64 + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Oneof_F_Uint64{x} + return true, err + case 8: // union.F_Float + if wire != proto.WireFixed32 { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeFixed32() + m.Union = &Oneof_F_Float{math.Float32frombits(uint32(x))} + return true, err + case 9: // union.F_Double + if wire != proto.WireFixed64 { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeFixed64() + m.Union = &Oneof_F_Double{math.Float64frombits(x)} + return true, err + case 10: // union.F_String + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeStringBytes() + m.Union = &Oneof_F_String{x} + return true, err + case 11: // union.F_Bytes + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeRawBytes(true) + m.Union = &Oneof_F_Bytes{x} + return true, err + case 12: // union.F_Sint32 + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeZigzag32() + m.Union = &Oneof_F_Sint32{int32(x)} + return true, err + case 13: // union.F_Sint64 + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeZigzag64() + m.Union = &Oneof_F_Sint64{int64(x)} + return true, err + case 14: // union.F_Enum + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Oneof_F_Enum{MyMessage_Color(x)} + return true, err + case 15: // union.F_Message + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(GoTestField) + err := b.DecodeMessage(msg) + m.Union = &Oneof_F_Message{msg} + return true, err + case 16: // union.f_group + if wire != proto.WireStartGroup { + return true, proto.ErrInternalBadWireType + } + msg := new(Oneof_F_Group) + err := b.DecodeGroup(msg) + m.Union = &Oneof_FGroup{msg} + return true, err + case 536870911: // union.F_Largest_Tag + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Oneof_F_Largest_Tag{int32(x)} + return true, err + case 100: // tormato.value + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Tormato = &Oneof_Value{int32(x)} + return true, err + default: + return false, nil + } +} + +func _Oneof_OneofSizer(msg proto.Message) (n int) { + m := msg.(*Oneof) + // union + switch x := m.Union.(type) { + case *Oneof_F_Bool: + n += proto.SizeVarint(1<<3 | proto.WireVarint) + n += 1 + case *Oneof_F_Int32: + n += proto.SizeVarint(2<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.F_Int32)) + case *Oneof_F_Int64: + n += proto.SizeVarint(3<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.F_Int64)) + case *Oneof_F_Fixed32: + n += proto.SizeVarint(4<<3 | proto.WireFixed32) + n += 4 + case *Oneof_F_Fixed64: + n += proto.SizeVarint(5<<3 | proto.WireFixed64) + n += 8 + case *Oneof_F_Uint32: + n += proto.SizeVarint(6<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.F_Uint32)) + case *Oneof_F_Uint64: + n += proto.SizeVarint(7<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.F_Uint64)) + case *Oneof_F_Float: + n += proto.SizeVarint(8<<3 | proto.WireFixed32) + n += 4 + case *Oneof_F_Double: + n += proto.SizeVarint(9<<3 | proto.WireFixed64) + n += 8 + case *Oneof_F_String: + n += proto.SizeVarint(10<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(len(x.F_String))) + n += len(x.F_String) + case *Oneof_F_Bytes: + n += proto.SizeVarint(11<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(len(x.F_Bytes))) + n += len(x.F_Bytes) + case *Oneof_F_Sint32: + n += proto.SizeVarint(12<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64((uint32(x.F_Sint32) << 1) ^ uint32((int32(x.F_Sint32) >> 31)))) + case *Oneof_F_Sint64: + n += proto.SizeVarint(13<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(uint64(x.F_Sint64<<1) ^ uint64((int64(x.F_Sint64) >> 63)))) + case *Oneof_F_Enum: + n += proto.SizeVarint(14<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.F_Enum)) + case *Oneof_F_Message: + s := proto.Size(x.F_Message) + n += proto.SizeVarint(15<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case *Oneof_FGroup: + n += proto.SizeVarint(16<<3 | proto.WireStartGroup) + n += proto.Size(x.FGroup) + n += proto.SizeVarint(16<<3 | proto.WireEndGroup) + case *Oneof_F_Largest_Tag: + n += proto.SizeVarint(536870911<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.F_Largest_Tag)) + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + // tormato + switch x := m.Tormato.(type) { + case *Oneof_Value: + n += proto.SizeVarint(100<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.Value)) + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +type Oneof_F_Group struct { + X *int32 `protobuf:"varint,17,opt,name=x" json:"x,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Oneof_F_Group) Reset() { *m = Oneof_F_Group{} } +func (m *Oneof_F_Group) String() string { return proto.CompactTextString(m) } +func (*Oneof_F_Group) ProtoMessage() {} +func (*Oneof_F_Group) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{28, 0} } + +func (m *Oneof_F_Group) GetX() int32 { + if m != nil && m.X != nil { + return *m.X + } + return 0 +} + +type Communique struct { + MakeMeCry *bool `protobuf:"varint,1,opt,name=make_me_cry,json=makeMeCry" json:"make_me_cry,omitempty"` + // This is a oneof, called "union". + // + // Types that are valid to be assigned to Union: + // *Communique_Number + // *Communique_Name + // *Communique_Data + // *Communique_TempC + // *Communique_Col + // *Communique_Msg + Union isCommunique_Union `protobuf_oneof:"union"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Communique) Reset() { *m = Communique{} } +func (m *Communique) String() string { return proto.CompactTextString(m) } +func (*Communique) ProtoMessage() {} +func (*Communique) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{29} } + +type isCommunique_Union interface { + isCommunique_Union() +} + +type Communique_Number struct { + Number int32 `protobuf:"varint,5,opt,name=number,oneof"` +} +type Communique_Name struct { + Name string `protobuf:"bytes,6,opt,name=name,oneof"` +} +type Communique_Data struct { + Data []byte `protobuf:"bytes,7,opt,name=data,oneof"` +} +type Communique_TempC struct { + TempC float64 `protobuf:"fixed64,8,opt,name=temp_c,json=tempC,oneof"` +} +type Communique_Col struct { + Col MyMessage_Color `protobuf:"varint,9,opt,name=col,enum=testdata.MyMessage_Color,oneof"` +} +type Communique_Msg struct { + Msg *Strings `protobuf:"bytes,10,opt,name=msg,oneof"` +} + +func (*Communique_Number) isCommunique_Union() {} +func (*Communique_Name) isCommunique_Union() {} +func (*Communique_Data) isCommunique_Union() {} +func (*Communique_TempC) isCommunique_Union() {} +func (*Communique_Col) isCommunique_Union() {} +func (*Communique_Msg) isCommunique_Union() {} + +func (m *Communique) GetUnion() isCommunique_Union { + if m != nil { + return m.Union + } + return nil +} + +func (m *Communique) GetMakeMeCry() bool { + if m != nil && m.MakeMeCry != nil { + return *m.MakeMeCry + } + return false +} + +func (m *Communique) GetNumber() int32 { + if x, ok := m.GetUnion().(*Communique_Number); ok { + return x.Number + } + return 0 +} + +func (m *Communique) GetName() string { + if x, ok := m.GetUnion().(*Communique_Name); ok { + return x.Name + } + return "" +} + +func (m *Communique) GetData() []byte { + if x, ok := m.GetUnion().(*Communique_Data); ok { + return x.Data + } + return nil +} + +func (m *Communique) GetTempC() float64 { + if x, ok := m.GetUnion().(*Communique_TempC); ok { + return x.TempC + } + return 0 +} + +func (m *Communique) GetCol() MyMessage_Color { + if x, ok := m.GetUnion().(*Communique_Col); ok { + return x.Col + } + return MyMessage_RED +} + +func (m *Communique) GetMsg() *Strings { + if x, ok := m.GetUnion().(*Communique_Msg); ok { + return x.Msg + } + return nil +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*Communique) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _Communique_OneofMarshaler, _Communique_OneofUnmarshaler, _Communique_OneofSizer, []interface{}{ + (*Communique_Number)(nil), + (*Communique_Name)(nil), + (*Communique_Data)(nil), + (*Communique_TempC)(nil), + (*Communique_Col)(nil), + (*Communique_Msg)(nil), + } +} + +func _Communique_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*Communique) + // union + switch x := m.Union.(type) { + case *Communique_Number: + b.EncodeVarint(5<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.Number)) + case *Communique_Name: + b.EncodeVarint(6<<3 | proto.WireBytes) + b.EncodeStringBytes(x.Name) + case *Communique_Data: + b.EncodeVarint(7<<3 | proto.WireBytes) + b.EncodeRawBytes(x.Data) + case *Communique_TempC: + b.EncodeVarint(8<<3 | proto.WireFixed64) + b.EncodeFixed64(math.Float64bits(x.TempC)) + case *Communique_Col: + b.EncodeVarint(9<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.Col)) + case *Communique_Msg: + b.EncodeVarint(10<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.Msg); err != nil { + return err + } + case nil: + default: + return fmt.Errorf("Communique.Union has unexpected type %T", x) + } + return nil +} + +func _Communique_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*Communique) + switch tag { + case 5: // union.number + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Communique_Number{int32(x)} + return true, err + case 6: // union.name + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeStringBytes() + m.Union = &Communique_Name{x} + return true, err + case 7: // union.data + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeRawBytes(true) + m.Union = &Communique_Data{x} + return true, err + case 8: // union.temp_c + if wire != proto.WireFixed64 { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeFixed64() + m.Union = &Communique_TempC{math.Float64frombits(x)} + return true, err + case 9: // union.col + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Communique_Col{MyMessage_Color(x)} + return true, err + case 10: // union.msg + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(Strings) + err := b.DecodeMessage(msg) + m.Union = &Communique_Msg{msg} + return true, err + default: + return false, nil + } +} + +func _Communique_OneofSizer(msg proto.Message) (n int) { + m := msg.(*Communique) + // union + switch x := m.Union.(type) { + case *Communique_Number: + n += proto.SizeVarint(5<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.Number)) + case *Communique_Name: + n += proto.SizeVarint(6<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(len(x.Name))) + n += len(x.Name) + case *Communique_Data: + n += proto.SizeVarint(7<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(len(x.Data))) + n += len(x.Data) + case *Communique_TempC: + n += proto.SizeVarint(8<<3 | proto.WireFixed64) + n += 8 + case *Communique_Col: + n += proto.SizeVarint(9<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.Col)) + case *Communique_Msg: + s := proto.Size(x.Msg) + n += proto.SizeVarint(10<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +var E_Greeting = &proto.ExtensionDesc{ + ExtendedType: (*MyMessage)(nil), + ExtensionType: ([]string)(nil), + Field: 106, + Name: "testdata.greeting", + Tag: "bytes,106,rep,name=greeting", +} + +var E_Complex = &proto.ExtensionDesc{ + ExtendedType: (*OtherMessage)(nil), + ExtensionType: (*ComplexExtension)(nil), + Field: 200, + Name: "testdata.complex", + Tag: "bytes,200,opt,name=complex", +} + +var E_RComplex = &proto.ExtensionDesc{ + ExtendedType: (*OtherMessage)(nil), + ExtensionType: ([]*ComplexExtension)(nil), + Field: 201, + Name: "testdata.r_complex", + Tag: "bytes,201,rep,name=r_complex,json=rComplex", +} + +var E_NoDefaultDouble = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*float64)(nil), + Field: 101, + Name: "testdata.no_default_double", + Tag: "fixed64,101,opt,name=no_default_double,json=noDefaultDouble", +} + +var E_NoDefaultFloat = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*float32)(nil), + Field: 102, + Name: "testdata.no_default_float", + Tag: "fixed32,102,opt,name=no_default_float,json=noDefaultFloat", +} + +var E_NoDefaultInt32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int32)(nil), + Field: 103, + Name: "testdata.no_default_int32", + Tag: "varint,103,opt,name=no_default_int32,json=noDefaultInt32", +} + +var E_NoDefaultInt64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int64)(nil), + Field: 104, + Name: "testdata.no_default_int64", + Tag: "varint,104,opt,name=no_default_int64,json=noDefaultInt64", +} + +var E_NoDefaultUint32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*uint32)(nil), + Field: 105, + Name: "testdata.no_default_uint32", + Tag: "varint,105,opt,name=no_default_uint32,json=noDefaultUint32", +} + +var E_NoDefaultUint64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*uint64)(nil), + Field: 106, + Name: "testdata.no_default_uint64", + Tag: "varint,106,opt,name=no_default_uint64,json=noDefaultUint64", +} + +var E_NoDefaultSint32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int32)(nil), + Field: 107, + Name: "testdata.no_default_sint32", + Tag: "zigzag32,107,opt,name=no_default_sint32,json=noDefaultSint32", +} + +var E_NoDefaultSint64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int64)(nil), + Field: 108, + Name: "testdata.no_default_sint64", + Tag: "zigzag64,108,opt,name=no_default_sint64,json=noDefaultSint64", +} + +var E_NoDefaultFixed32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*uint32)(nil), + Field: 109, + Name: "testdata.no_default_fixed32", + Tag: "fixed32,109,opt,name=no_default_fixed32,json=noDefaultFixed32", +} + +var E_NoDefaultFixed64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*uint64)(nil), + Field: 110, + Name: "testdata.no_default_fixed64", + Tag: "fixed64,110,opt,name=no_default_fixed64,json=noDefaultFixed64", +} + +var E_NoDefaultSfixed32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int32)(nil), + Field: 111, + Name: "testdata.no_default_sfixed32", + Tag: "fixed32,111,opt,name=no_default_sfixed32,json=noDefaultSfixed32", +} + +var E_NoDefaultSfixed64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int64)(nil), + Field: 112, + Name: "testdata.no_default_sfixed64", + Tag: "fixed64,112,opt,name=no_default_sfixed64,json=noDefaultSfixed64", +} + +var E_NoDefaultBool = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*bool)(nil), + Field: 113, + Name: "testdata.no_default_bool", + Tag: "varint,113,opt,name=no_default_bool,json=noDefaultBool", +} + +var E_NoDefaultString = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*string)(nil), + Field: 114, + Name: "testdata.no_default_string", + Tag: "bytes,114,opt,name=no_default_string,json=noDefaultString", +} + +var E_NoDefaultBytes = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: ([]byte)(nil), + Field: 115, + Name: "testdata.no_default_bytes", + Tag: "bytes,115,opt,name=no_default_bytes,json=noDefaultBytes", +} + +var E_NoDefaultEnum = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*DefaultsMessage_DefaultsEnum)(nil), + Field: 116, + Name: "testdata.no_default_enum", + Tag: "varint,116,opt,name=no_default_enum,json=noDefaultEnum,enum=testdata.DefaultsMessage_DefaultsEnum", +} + +var E_DefaultDouble = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*float64)(nil), + Field: 201, + Name: "testdata.default_double", + Tag: "fixed64,201,opt,name=default_double,json=defaultDouble,def=3.1415", +} + +var E_DefaultFloat = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*float32)(nil), + Field: 202, + Name: "testdata.default_float", + Tag: "fixed32,202,opt,name=default_float,json=defaultFloat,def=3.14", +} + +var E_DefaultInt32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int32)(nil), + Field: 203, + Name: "testdata.default_int32", + Tag: "varint,203,opt,name=default_int32,json=defaultInt32,def=42", +} + +var E_DefaultInt64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int64)(nil), + Field: 204, + Name: "testdata.default_int64", + Tag: "varint,204,opt,name=default_int64,json=defaultInt64,def=43", +} + +var E_DefaultUint32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*uint32)(nil), + Field: 205, + Name: "testdata.default_uint32", + Tag: "varint,205,opt,name=default_uint32,json=defaultUint32,def=44", +} + +var E_DefaultUint64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*uint64)(nil), + Field: 206, + Name: "testdata.default_uint64", + Tag: "varint,206,opt,name=default_uint64,json=defaultUint64,def=45", +} + +var E_DefaultSint32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int32)(nil), + Field: 207, + Name: "testdata.default_sint32", + Tag: "zigzag32,207,opt,name=default_sint32,json=defaultSint32,def=46", +} + +var E_DefaultSint64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int64)(nil), + Field: 208, + Name: "testdata.default_sint64", + Tag: "zigzag64,208,opt,name=default_sint64,json=defaultSint64,def=47", +} + +var E_DefaultFixed32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*uint32)(nil), + Field: 209, + Name: "testdata.default_fixed32", + Tag: "fixed32,209,opt,name=default_fixed32,json=defaultFixed32,def=48", +} + +var E_DefaultFixed64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*uint64)(nil), + Field: 210, + Name: "testdata.default_fixed64", + Tag: "fixed64,210,opt,name=default_fixed64,json=defaultFixed64,def=49", +} + +var E_DefaultSfixed32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int32)(nil), + Field: 211, + Name: "testdata.default_sfixed32", + Tag: "fixed32,211,opt,name=default_sfixed32,json=defaultSfixed32,def=50", +} + +var E_DefaultSfixed64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int64)(nil), + Field: 212, + Name: "testdata.default_sfixed64", + Tag: "fixed64,212,opt,name=default_sfixed64,json=defaultSfixed64,def=51", +} + +var E_DefaultBool = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*bool)(nil), + Field: 213, + Name: "testdata.default_bool", + Tag: "varint,213,opt,name=default_bool,json=defaultBool,def=1", +} + +var E_DefaultString = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*string)(nil), + Field: 214, + Name: "testdata.default_string", + Tag: "bytes,214,opt,name=default_string,json=defaultString,def=Hello, string", +} + +var E_DefaultBytes = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: ([]byte)(nil), + Field: 215, + Name: "testdata.default_bytes", + Tag: "bytes,215,opt,name=default_bytes,json=defaultBytes,def=Hello, bytes", +} + +var E_DefaultEnum = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*DefaultsMessage_DefaultsEnum)(nil), + Field: 216, + Name: "testdata.default_enum", + Tag: "varint,216,opt,name=default_enum,json=defaultEnum,enum=testdata.DefaultsMessage_DefaultsEnum,def=1", +} + +var E_X201 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 201, + Name: "testdata.x201", + Tag: "bytes,201,opt,name=x201", +} + +var E_X202 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 202, + Name: "testdata.x202", + Tag: "bytes,202,opt,name=x202", +} + +var E_X203 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 203, + Name: "testdata.x203", + Tag: "bytes,203,opt,name=x203", +} + +var E_X204 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 204, + Name: "testdata.x204", + Tag: "bytes,204,opt,name=x204", +} + +var E_X205 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 205, + Name: "testdata.x205", + Tag: "bytes,205,opt,name=x205", +} + +var E_X206 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 206, + Name: "testdata.x206", + Tag: "bytes,206,opt,name=x206", +} + +var E_X207 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 207, + Name: "testdata.x207", + Tag: "bytes,207,opt,name=x207", +} + +var E_X208 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 208, + Name: "testdata.x208", + Tag: "bytes,208,opt,name=x208", +} + +var E_X209 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 209, + Name: "testdata.x209", + Tag: "bytes,209,opt,name=x209", +} + +var E_X210 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 210, + Name: "testdata.x210", + Tag: "bytes,210,opt,name=x210", +} + +var E_X211 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 211, + Name: "testdata.x211", + Tag: "bytes,211,opt,name=x211", +} + +var E_X212 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 212, + Name: "testdata.x212", + Tag: "bytes,212,opt,name=x212", +} + +var E_X213 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 213, + Name: "testdata.x213", + Tag: "bytes,213,opt,name=x213", +} + +var E_X214 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 214, + Name: "testdata.x214", + Tag: "bytes,214,opt,name=x214", +} + +var E_X215 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 215, + Name: "testdata.x215", + Tag: "bytes,215,opt,name=x215", +} + +var E_X216 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 216, + Name: "testdata.x216", + Tag: "bytes,216,opt,name=x216", +} + +var E_X217 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 217, + Name: "testdata.x217", + Tag: "bytes,217,opt,name=x217", +} + +var E_X218 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 218, + Name: "testdata.x218", + Tag: "bytes,218,opt,name=x218", +} + +var E_X219 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 219, + Name: "testdata.x219", + Tag: "bytes,219,opt,name=x219", +} + +var E_X220 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 220, + Name: "testdata.x220", + Tag: "bytes,220,opt,name=x220", +} + +var E_X221 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 221, + Name: "testdata.x221", + Tag: "bytes,221,opt,name=x221", +} + +var E_X222 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 222, + Name: "testdata.x222", + Tag: "bytes,222,opt,name=x222", +} + +var E_X223 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 223, + Name: "testdata.x223", + Tag: "bytes,223,opt,name=x223", +} + +var E_X224 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 224, + Name: "testdata.x224", + Tag: "bytes,224,opt,name=x224", +} + +var E_X225 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 225, + Name: "testdata.x225", + Tag: "bytes,225,opt,name=x225", +} + +var E_X226 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 226, + Name: "testdata.x226", + Tag: "bytes,226,opt,name=x226", +} + +var E_X227 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 227, + Name: "testdata.x227", + Tag: "bytes,227,opt,name=x227", +} + +var E_X228 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 228, + Name: "testdata.x228", + Tag: "bytes,228,opt,name=x228", +} + +var E_X229 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 229, + Name: "testdata.x229", + Tag: "bytes,229,opt,name=x229", +} + +var E_X230 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 230, + Name: "testdata.x230", + Tag: "bytes,230,opt,name=x230", +} + +var E_X231 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 231, + Name: "testdata.x231", + Tag: "bytes,231,opt,name=x231", +} + +var E_X232 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 232, + Name: "testdata.x232", + Tag: "bytes,232,opt,name=x232", +} + +var E_X233 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 233, + Name: "testdata.x233", + Tag: "bytes,233,opt,name=x233", +} + +var E_X234 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 234, + Name: "testdata.x234", + Tag: "bytes,234,opt,name=x234", +} + +var E_X235 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 235, + Name: "testdata.x235", + Tag: "bytes,235,opt,name=x235", +} + +var E_X236 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 236, + Name: "testdata.x236", + Tag: "bytes,236,opt,name=x236", +} + +var E_X237 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 237, + Name: "testdata.x237", + Tag: "bytes,237,opt,name=x237", +} + +var E_X238 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 238, + Name: "testdata.x238", + Tag: "bytes,238,opt,name=x238", +} + +var E_X239 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 239, + Name: "testdata.x239", + Tag: "bytes,239,opt,name=x239", +} + +var E_X240 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 240, + Name: "testdata.x240", + Tag: "bytes,240,opt,name=x240", +} + +var E_X241 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 241, + Name: "testdata.x241", + Tag: "bytes,241,opt,name=x241", +} + +var E_X242 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 242, + Name: "testdata.x242", + Tag: "bytes,242,opt,name=x242", +} + +var E_X243 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 243, + Name: "testdata.x243", + Tag: "bytes,243,opt,name=x243", +} + +var E_X244 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 244, + Name: "testdata.x244", + Tag: "bytes,244,opt,name=x244", +} + +var E_X245 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 245, + Name: "testdata.x245", + Tag: "bytes,245,opt,name=x245", +} + +var E_X246 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 246, + Name: "testdata.x246", + Tag: "bytes,246,opt,name=x246", +} + +var E_X247 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 247, + Name: "testdata.x247", + Tag: "bytes,247,opt,name=x247", +} + +var E_X248 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 248, + Name: "testdata.x248", + Tag: "bytes,248,opt,name=x248", +} + +var E_X249 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 249, + Name: "testdata.x249", + Tag: "bytes,249,opt,name=x249", +} + +var E_X250 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 250, + Name: "testdata.x250", + Tag: "bytes,250,opt,name=x250", +} + +func init() { + proto.RegisterType((*GoEnum)(nil), "testdata.GoEnum") + proto.RegisterType((*GoTestField)(nil), "testdata.GoTestField") + proto.RegisterType((*GoTest)(nil), "testdata.GoTest") + proto.RegisterType((*GoTest_RequiredGroup)(nil), "testdata.GoTest.RequiredGroup") + proto.RegisterType((*GoTest_RepeatedGroup)(nil), "testdata.GoTest.RepeatedGroup") + proto.RegisterType((*GoTest_OptionalGroup)(nil), "testdata.GoTest.OptionalGroup") + proto.RegisterType((*GoSkipTest)(nil), "testdata.GoSkipTest") + proto.RegisterType((*GoSkipTest_SkipGroup)(nil), "testdata.GoSkipTest.SkipGroup") + proto.RegisterType((*NonPackedTest)(nil), "testdata.NonPackedTest") + proto.RegisterType((*PackedTest)(nil), "testdata.PackedTest") + proto.RegisterType((*MaxTag)(nil), "testdata.MaxTag") + proto.RegisterType((*OldMessage)(nil), "testdata.OldMessage") + proto.RegisterType((*OldMessage_Nested)(nil), "testdata.OldMessage.Nested") + proto.RegisterType((*NewMessage)(nil), "testdata.NewMessage") + proto.RegisterType((*NewMessage_Nested)(nil), "testdata.NewMessage.Nested") + proto.RegisterType((*InnerMessage)(nil), "testdata.InnerMessage") + proto.RegisterType((*OtherMessage)(nil), "testdata.OtherMessage") + proto.RegisterType((*RequiredInnerMessage)(nil), "testdata.RequiredInnerMessage") + proto.RegisterType((*MyMessage)(nil), "testdata.MyMessage") + proto.RegisterType((*MyMessage_SomeGroup)(nil), "testdata.MyMessage.SomeGroup") + proto.RegisterType((*Ext)(nil), "testdata.Ext") + proto.RegisterType((*ComplexExtension)(nil), "testdata.ComplexExtension") + proto.RegisterType((*DefaultsMessage)(nil), "testdata.DefaultsMessage") + proto.RegisterType((*MyMessageSet)(nil), "testdata.MyMessageSet") + proto.RegisterType((*Empty)(nil), "testdata.Empty") + proto.RegisterType((*MessageList)(nil), "testdata.MessageList") + proto.RegisterType((*MessageList_Message)(nil), "testdata.MessageList.Message") + proto.RegisterType((*Strings)(nil), "testdata.Strings") + proto.RegisterType((*Defaults)(nil), "testdata.Defaults") + proto.RegisterType((*SubDefaults)(nil), "testdata.SubDefaults") + proto.RegisterType((*RepeatedEnum)(nil), "testdata.RepeatedEnum") + proto.RegisterType((*MoreRepeated)(nil), "testdata.MoreRepeated") + proto.RegisterType((*GroupOld)(nil), "testdata.GroupOld") + proto.RegisterType((*GroupOld_G)(nil), "testdata.GroupOld.G") + proto.RegisterType((*GroupNew)(nil), "testdata.GroupNew") + proto.RegisterType((*GroupNew_G)(nil), "testdata.GroupNew.G") + proto.RegisterType((*FloatingPoint)(nil), "testdata.FloatingPoint") + proto.RegisterType((*MessageWithMap)(nil), "testdata.MessageWithMap") + proto.RegisterType((*Oneof)(nil), "testdata.Oneof") + proto.RegisterType((*Oneof_F_Group)(nil), "testdata.Oneof.F_Group") + proto.RegisterType((*Communique)(nil), "testdata.Communique") + proto.RegisterEnum("testdata.FOO", FOO_name, FOO_value) + proto.RegisterEnum("testdata.GoTest_KIND", GoTest_KIND_name, GoTest_KIND_value) + proto.RegisterEnum("testdata.MyMessage_Color", MyMessage_Color_name, MyMessage_Color_value) + proto.RegisterEnum("testdata.DefaultsMessage_DefaultsEnum", DefaultsMessage_DefaultsEnum_name, DefaultsMessage_DefaultsEnum_value) + proto.RegisterEnum("testdata.Defaults_Color", Defaults_Color_name, Defaults_Color_value) + proto.RegisterEnum("testdata.RepeatedEnum_Color", RepeatedEnum_Color_name, RepeatedEnum_Color_value) + proto.RegisterExtension(E_Ext_More) + proto.RegisterExtension(E_Ext_Text) + proto.RegisterExtension(E_Ext_Number) + proto.RegisterExtension(E_Greeting) + proto.RegisterExtension(E_Complex) + proto.RegisterExtension(E_RComplex) + proto.RegisterExtension(E_NoDefaultDouble) + proto.RegisterExtension(E_NoDefaultFloat) + proto.RegisterExtension(E_NoDefaultInt32) + proto.RegisterExtension(E_NoDefaultInt64) + proto.RegisterExtension(E_NoDefaultUint32) + proto.RegisterExtension(E_NoDefaultUint64) + proto.RegisterExtension(E_NoDefaultSint32) + proto.RegisterExtension(E_NoDefaultSint64) + proto.RegisterExtension(E_NoDefaultFixed32) + proto.RegisterExtension(E_NoDefaultFixed64) + proto.RegisterExtension(E_NoDefaultSfixed32) + proto.RegisterExtension(E_NoDefaultSfixed64) + proto.RegisterExtension(E_NoDefaultBool) + proto.RegisterExtension(E_NoDefaultString) + proto.RegisterExtension(E_NoDefaultBytes) + proto.RegisterExtension(E_NoDefaultEnum) + proto.RegisterExtension(E_DefaultDouble) + proto.RegisterExtension(E_DefaultFloat) + proto.RegisterExtension(E_DefaultInt32) + proto.RegisterExtension(E_DefaultInt64) + proto.RegisterExtension(E_DefaultUint32) + proto.RegisterExtension(E_DefaultUint64) + proto.RegisterExtension(E_DefaultSint32) + proto.RegisterExtension(E_DefaultSint64) + proto.RegisterExtension(E_DefaultFixed32) + proto.RegisterExtension(E_DefaultFixed64) + proto.RegisterExtension(E_DefaultSfixed32) + proto.RegisterExtension(E_DefaultSfixed64) + proto.RegisterExtension(E_DefaultBool) + proto.RegisterExtension(E_DefaultString) + proto.RegisterExtension(E_DefaultBytes) + proto.RegisterExtension(E_DefaultEnum) + proto.RegisterExtension(E_X201) + proto.RegisterExtension(E_X202) + proto.RegisterExtension(E_X203) + proto.RegisterExtension(E_X204) + proto.RegisterExtension(E_X205) + proto.RegisterExtension(E_X206) + proto.RegisterExtension(E_X207) + proto.RegisterExtension(E_X208) + proto.RegisterExtension(E_X209) + proto.RegisterExtension(E_X210) + proto.RegisterExtension(E_X211) + proto.RegisterExtension(E_X212) + proto.RegisterExtension(E_X213) + proto.RegisterExtension(E_X214) + proto.RegisterExtension(E_X215) + proto.RegisterExtension(E_X216) + proto.RegisterExtension(E_X217) + proto.RegisterExtension(E_X218) + proto.RegisterExtension(E_X219) + proto.RegisterExtension(E_X220) + proto.RegisterExtension(E_X221) + proto.RegisterExtension(E_X222) + proto.RegisterExtension(E_X223) + proto.RegisterExtension(E_X224) + proto.RegisterExtension(E_X225) + proto.RegisterExtension(E_X226) + proto.RegisterExtension(E_X227) + proto.RegisterExtension(E_X228) + proto.RegisterExtension(E_X229) + proto.RegisterExtension(E_X230) + proto.RegisterExtension(E_X231) + proto.RegisterExtension(E_X232) + proto.RegisterExtension(E_X233) + proto.RegisterExtension(E_X234) + proto.RegisterExtension(E_X235) + proto.RegisterExtension(E_X236) + proto.RegisterExtension(E_X237) + proto.RegisterExtension(E_X238) + proto.RegisterExtension(E_X239) + proto.RegisterExtension(E_X240) + proto.RegisterExtension(E_X241) + proto.RegisterExtension(E_X242) + proto.RegisterExtension(E_X243) + proto.RegisterExtension(E_X244) + proto.RegisterExtension(E_X245) + proto.RegisterExtension(E_X246) + proto.RegisterExtension(E_X247) + proto.RegisterExtension(E_X248) + proto.RegisterExtension(E_X249) + proto.RegisterExtension(E_X250) +} + +var fileDescriptor0 = []byte{ + // 4407 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x94, 0x5a, 0x59, 0x77, 0xdb, 0x48, + 0x76, 0x36, 0xc0, 0xfd, 0x92, 0x12, 0xa1, 0xb2, 0xda, 0x4d, 0x4b, 0x5e, 0x60, 0xce, 0x74, 0x37, + 0xbd, 0x69, 0x24, 0x10, 0xa2, 0x6d, 0xba, 0xd3, 0xe7, 0x78, 0xa1, 0x64, 0x9d, 0xb1, 0x44, 0x05, + 0x52, 0x77, 0x9f, 0xe9, 0x3c, 0xf0, 0x50, 0x22, 0x48, 0xb3, 0x4d, 0x02, 0x34, 0x09, 0xc5, 0x52, + 0xf2, 0xd2, 0x2f, 0xc9, 0x6b, 0xb6, 0x97, 0xbc, 0xe6, 0x29, 0x4f, 0x49, 0xce, 0xc9, 0x9f, 0x48, + 0xba, 0x7b, 0xd6, 0x9e, 0x35, 0xeb, 0x64, 0x5f, 0x26, 0xfb, 0x36, 0x93, 0xe4, 0xa5, 0xe7, 0xd4, + 0xad, 0x02, 0x50, 0x00, 0x09, 0x48, 0x7e, 0x12, 0x51, 0xf5, 0x7d, 0xb7, 0x6e, 0x15, 0xbe, 0xba, + 0xb7, 0x6e, 0x41, 0x00, 0x8e, 0x39, 0x71, 0x56, 0x46, 0x63, 0xdb, 0xb1, 0x49, 0x96, 0xfe, 0xee, + 0xb4, 0x9d, 0x76, 0xf9, 0x3a, 0xa4, 0x37, 0xed, 0x86, 0x75, 0x34, 0x24, 0x57, 0x21, 0xd1, 0xb5, + 0xed, 0x92, 0xa4, 0xca, 0x95, 0x79, 0x6d, 0x6e, 0xc5, 0x45, 0xac, 0x6c, 0x34, 0x9b, 0x06, 0xed, + 0x29, 0xdf, 0x81, 0xfc, 0xa6, 0xbd, 0x6f, 0x4e, 0x9c, 0x8d, 0xbe, 0x39, 0xe8, 0x90, 0x45, 0x48, + 0x3d, 0x6d, 0x1f, 0x98, 0x03, 0x64, 0xe4, 0x8c, 0xd4, 0x80, 0x3e, 0x10, 0x02, 0xc9, 0xfd, 0x93, + 0x91, 0x59, 0x92, 0xb1, 0x31, 0xe9, 0x9c, 0x8c, 0xcc, 0xf2, 0xaf, 0x5c, 0xa1, 0x83, 0x50, 0x26, + 0xb9, 0x0e, 0xc9, 0x2f, 0xf7, 0xad, 0x0e, 0x1f, 0xe5, 0x35, 0x7f, 0x14, 0xd6, 0xbf, 0xf2, 0xe5, + 0xad, 0x9d, 0xc7, 0x46, 0xf2, 0x79, 0xdf, 0x42, 0xfb, 0xfb, 0xed, 0x83, 0x01, 0x35, 0x25, 0x51, + 0xfb, 0x0e, 0x7d, 0xa0, 0xad, 0xbb, 0xed, 0x71, 0x7b, 0x58, 0x4a, 0xa8, 0x52, 0x25, 0x65, 0xa4, + 0x46, 0xf4, 0x81, 0xdc, 0x87, 0x39, 0xc3, 0x7c, 0x71, 0xd4, 0x1f, 0x9b, 0x1d, 0x74, 0xae, 0x94, + 0x54, 0xe5, 0x4a, 0x7e, 0xda, 0x3e, 0x76, 0x1a, 0x73, 0x63, 0x11, 0xcb, 0xc8, 0x23, 0xb3, 0xed, + 0xb8, 0xe4, 0x94, 0x9a, 0x88, 0x25, 0x0b, 0x58, 0x4a, 0x6e, 0x8e, 0x9c, 0xbe, 0x6d, 0xb5, 0x07, + 0x8c, 0x9c, 0x56, 0xa5, 0x18, 0xb2, 0x2d, 0x62, 0xc9, 0x9b, 0x50, 0xdc, 0x68, 0x3d, 0xb4, 0xed, + 0x41, 0xcb, 0xf5, 0xa8, 0x04, 0xaa, 0x5c, 0xc9, 0x1a, 0x73, 0x5d, 0xda, 0xea, 0x4e, 0x89, 0x54, + 0x40, 0xd9, 0x68, 0x6d, 0x59, 0x4e, 0x55, 0xf3, 0x81, 0x79, 0x55, 0xae, 0xa4, 0x8c, 0xf9, 0x2e, + 0x36, 0x4f, 0x21, 0x6b, 0xba, 0x8f, 0x2c, 0xa8, 0x72, 0x25, 0xc1, 0x90, 0x35, 0xdd, 0x43, 0xde, + 0x02, 0xb2, 0xd1, 0xda, 0xe8, 0x1f, 0x9b, 0x1d, 0xd1, 0xea, 0x9c, 0x2a, 0x57, 0x32, 0x86, 0xd2, + 0xe5, 0x1d, 0x33, 0xd0, 0xa2, 0xe5, 0x79, 0x55, 0xae, 0xa4, 0x5d, 0xb4, 0x60, 0xfb, 0x06, 0x2c, + 0x6c, 0xb4, 0xde, 0xed, 0x07, 0x1d, 0x2e, 0xaa, 0x72, 0x65, 0xce, 0x28, 0x76, 0x59, 0xfb, 0x34, + 0x56, 0x34, 0xac, 0xa8, 0x72, 0x25, 0xc9, 0xb1, 0x82, 0x5d, 0x9c, 0xdd, 0xc6, 0xc0, 0x6e, 0x3b, + 0x3e, 0x74, 0x41, 0x95, 0x2b, 0xb2, 0x31, 0xdf, 0xc5, 0xe6, 0xa0, 0xd5, 0xc7, 0xf6, 0xd1, 0xc1, + 0xc0, 0xf4, 0xa1, 0x44, 0x95, 0x2b, 0x92, 0x51, 0xec, 0xb2, 0xf6, 0x20, 0x76, 0xcf, 0x19, 0xf7, + 0xad, 0x9e, 0x8f, 0x3d, 0x8f, 0xfa, 0x2d, 0x76, 0x59, 0x7b, 0xd0, 0x83, 0x87, 0x27, 0x8e, 0x39, + 0xf1, 0xa1, 0xa6, 0x2a, 0x57, 0x0a, 0xc6, 0x7c, 0x17, 0x9b, 0x43, 0x56, 0x43, 0x6b, 0xd0, 0x55, + 0xe5, 0xca, 0x02, 0xb5, 0x3a, 0x63, 0x0d, 0xf6, 0x42, 0x6b, 0xd0, 0x53, 0xe5, 0x0a, 0xe1, 0x58, + 0x61, 0x0d, 0x44, 0xcd, 0x30, 0x21, 0x96, 0x16, 0xd5, 0x84, 0xa0, 0x19, 0xd6, 0x18, 0xd4, 0x0c, + 0x07, 0xbe, 0xa6, 0x26, 0x44, 0xcd, 0x84, 0x90, 0x38, 0x38, 0x47, 0x5e, 0x50, 0x13, 0xa2, 0x66, + 0x38, 0x32, 0xa4, 0x19, 0x8e, 0x7d, 0x5d, 0x4d, 0x04, 0x35, 0x33, 0x85, 0x16, 0x2d, 0x97, 0xd4, + 0x44, 0x50, 0x33, 0x1c, 0x1d, 0xd4, 0x0c, 0x07, 0x5f, 0x54, 0x13, 0x01, 0xcd, 0x84, 0xb1, 0xa2, + 0xe1, 0x25, 0x35, 0x11, 0xd0, 0x8c, 0x38, 0x3b, 0x57, 0x33, 0x1c, 0xba, 0xac, 0x26, 0x44, 0xcd, + 0x88, 0x56, 0x3d, 0xcd, 0x70, 0xe8, 0x25, 0x35, 0x11, 0xd0, 0x8c, 0x88, 0xf5, 0x34, 0xc3, 0xb1, + 0x97, 0xd5, 0x44, 0x40, 0x33, 0x1c, 0x7b, 0x5d, 0xd4, 0x0c, 0x87, 0x7e, 0x2c, 0xa9, 0x09, 0x51, + 0x34, 0x1c, 0x7a, 0x33, 0x20, 0x1a, 0x8e, 0xfd, 0x84, 0x62, 0x45, 0xd5, 0x84, 0xc1, 0xe2, 0x2a, + 0x7c, 0x4a, 0xc1, 0xa2, 0x6c, 0x38, 0xd8, 0x97, 0x8d, 0x1b, 0x82, 0x4a, 0x57, 0x54, 0xc9, 0x93, + 0x8d, 0x1b, 0xc3, 0x44, 0xd9, 0x78, 0xc0, 0xab, 0x18, 0x6a, 0xb9, 0x6c, 0xa6, 0x90, 0x35, 0xdd, + 0x47, 0xaa, 0xaa, 0xe4, 0xcb, 0xc6, 0x43, 0x06, 0x64, 0xe3, 0x61, 0xaf, 0xa9, 0x92, 0x28, 0x9b, + 0x19, 0x68, 0xd1, 0x72, 0x59, 0x95, 0x44, 0xd9, 0x78, 0x68, 0x51, 0x36, 0x1e, 0xf8, 0x0b, 0xaa, + 0x24, 0xc8, 0x66, 0x1a, 0x2b, 0x1a, 0xfe, 0xa2, 0x2a, 0x09, 0xb2, 0x09, 0xce, 0x8e, 0xc9, 0xc6, + 0x83, 0xbe, 0xa1, 0x4a, 0xbe, 0x6c, 0x82, 0x56, 0xb9, 0x6c, 0x3c, 0xe8, 0x9b, 0xaa, 0x24, 0xc8, + 0x26, 0x88, 0xe5, 0xb2, 0xf1, 0xb0, 0x6f, 0x61, 0x7e, 0x73, 0x65, 0xe3, 0x61, 0x05, 0xd9, 0x78, + 0xd0, 0xdf, 0xa1, 0xb9, 0xd0, 0x93, 0x8d, 0x07, 0x15, 0x65, 0xe3, 0x61, 0x7f, 0x97, 0x62, 0x7d, + 0xd9, 0x4c, 0x83, 0xc5, 0x55, 0xf8, 0x3d, 0x0a, 0xf6, 0x65, 0xe3, 0x81, 0x57, 0xd0, 0x09, 0x2a, + 0x9b, 0x8e, 0xd9, 0x6d, 0x1f, 0x0d, 0xa8, 0xc4, 0x2a, 0x54, 0x37, 0xf5, 0xa4, 0x33, 0x3e, 0x32, + 0xa9, 0x27, 0xb6, 0x3d, 0x78, 0xec, 0xf6, 0x91, 0x15, 0x6a, 0x9c, 0xc9, 0xc7, 0x27, 0x5c, 0xa7, + 0xfa, 0xa9, 0xcb, 0x55, 0xcd, 0x28, 0x32, 0x0d, 0x4d, 0xe3, 0x6b, 0xba, 0x80, 0xbf, 0x41, 0x55, + 0x54, 0x97, 0x6b, 0x3a, 0xc3, 0xd7, 0x74, 0x1f, 0x5f, 0x85, 0xf3, 0xbe, 0x94, 0x7c, 0xc6, 0x4d, + 0xaa, 0xa5, 0x7a, 0xa2, 0xaa, 0xad, 0x1a, 0x0b, 0xae, 0xa0, 0x66, 0x91, 0x02, 0xc3, 0xdc, 0xa2, + 0x92, 0xaa, 0x27, 0x6a, 0xba, 0x47, 0x12, 0x47, 0xd2, 0xa8, 0x0c, 0xb9, 0xb0, 0x7c, 0xce, 0x6d, + 0xaa, 0xac, 0x7a, 0xb2, 0xaa, 0xad, 0xae, 0x1a, 0x0a, 0xd7, 0xd7, 0x0c, 0x4e, 0x60, 0x9c, 0x15, + 0xaa, 0xb0, 0x7a, 0xb2, 0xa6, 0x7b, 0x9c, 0xe0, 0x38, 0x0b, 0xae, 0xd0, 0x7c, 0xca, 0x97, 0xa8, + 0xd2, 0xea, 0xe9, 0xea, 0x9a, 0xbe, 0xb6, 0x7e, 0xcf, 0x28, 0x32, 0xc5, 0xf9, 0x1c, 0x9d, 0x8e, + 0xc3, 0x25, 0xe7, 0x93, 0x56, 0xa9, 0xe6, 0xea, 0x69, 0xed, 0xce, 0xda, 0x5d, 0xed, 0xae, 0xa1, + 0x70, 0xed, 0xf9, 0xac, 0x77, 0x28, 0x8b, 0x8b, 0xcf, 0x67, 0xad, 0x51, 0xf5, 0xd5, 0x95, 0x67, + 0xe6, 0x60, 0x60, 0xdf, 0x52, 0xcb, 0x2f, 0xed, 0xf1, 0xa0, 0x73, 0xad, 0x0c, 0x86, 0xc2, 0xf5, + 0x28, 0x8e, 0xba, 0xe0, 0x0a, 0xd2, 0xa7, 0xff, 0x1a, 0x3d, 0x87, 0x15, 0xea, 0x99, 0x87, 0xfd, + 0x9e, 0x65, 0x4f, 0x4c, 0xa3, 0xc8, 0xa4, 0x19, 0x5a, 0x93, 0xbd, 0xf0, 0x3a, 0xfe, 0x3a, 0xa5, + 0x2d, 0xd4, 0x13, 0xb7, 0xab, 0x1a, 0x1d, 0x69, 0xd6, 0x3a, 0xee, 0x85, 0xd7, 0xf1, 0x37, 0x28, + 0x87, 0xd4, 0x13, 0xb7, 0x6b, 0x3a, 0xe7, 0x88, 0xeb, 0x78, 0x07, 0x2e, 0x84, 0xf2, 0x62, 0x6b, + 0xd4, 0x3e, 0x7c, 0x6e, 0x76, 0x4a, 0x1a, 0x4d, 0x8f, 0x0f, 0x65, 0x45, 0x32, 0xce, 0x07, 0x52, + 0xe4, 0x2e, 0x76, 0x93, 0x7b, 0xf0, 0x7a, 0x38, 0x51, 0xba, 0xcc, 0x2a, 0xcd, 0x97, 0xc8, 0x5c, + 0x0c, 0xe6, 0xcc, 0x10, 0x55, 0x08, 0xc0, 0x2e, 0x55, 0xa7, 0x09, 0xd4, 0xa7, 0xfa, 0x91, 0x98, + 0x53, 0x7f, 0x06, 0x2e, 0x4e, 0xa7, 0x52, 0x97, 0xbc, 0x4e, 0x33, 0x2a, 0x92, 0x2f, 0x84, 0xb3, + 0xea, 0x14, 0x7d, 0xc6, 0xd8, 0x35, 0x9a, 0x62, 0x45, 0xfa, 0xd4, 0xe8, 0xf7, 0xa1, 0x34, 0x95, + 0x6c, 0x5d, 0xf6, 0x1d, 0x9a, 0x73, 0x91, 0xfd, 0x5a, 0x28, 0xef, 0x86, 0xc9, 0x33, 0x86, 0xbe, + 0x4b, 0x93, 0xb0, 0x40, 0x9e, 0x1a, 0x19, 0x97, 0x2c, 0x98, 0x8e, 0x5d, 0xee, 0x3d, 0x9a, 0x95, + 0xf9, 0x92, 0x05, 0x32, 0xb3, 0x38, 0x6e, 0x28, 0x3f, 0xbb, 0xdc, 0x3a, 0x4d, 0xd3, 0x7c, 0xdc, + 0x60, 0xaa, 0xe6, 0xe4, 0xb7, 0x29, 0x79, 0x6f, 0xf6, 0x8c, 0x7f, 0x9c, 0xa0, 0x09, 0x96, 0xb3, + 0xf7, 0x66, 0x4d, 0xd9, 0x63, 0xcf, 0x98, 0xf2, 0x4f, 0x28, 0x9b, 0x08, 0xec, 0xa9, 0x39, 0x3f, + 0x06, 0xaf, 0xe2, 0xe8, 0x8d, 0xed, 0xa3, 0x51, 0x69, 0x43, 0x95, 0x2b, 0xa0, 0x5d, 0x99, 0xaa, + 0x7e, 0xdc, 0x43, 0xde, 0x26, 0x45, 0x19, 0x41, 0x12, 0xb3, 0xc2, 0xec, 0x32, 0x2b, 0xbb, 0x6a, + 0x22, 0xc2, 0x0a, 0x43, 0x79, 0x56, 0x04, 0x12, 0xb5, 0xe2, 0x06, 0x7d, 0x66, 0xe5, 0x03, 0x55, + 0x9a, 0x69, 0xc5, 0x4d, 0x01, 0xdc, 0x4a, 0x80, 0xb4, 0xb4, 0xee, 0xd7, 0x5b, 0xd8, 0x4f, 0xbe, + 0x18, 0x2e, 0xc0, 0x36, 0xf1, 0xfc, 0x1c, 0xac, 0xb4, 0x18, 0x4d, 0x70, 0x6e, 0x9a, 0xf6, 0xb3, + 0x11, 0xb4, 0x80, 0x37, 0xd3, 0xb4, 0x9f, 0x9b, 0x41, 0x2b, 0xff, 0xa6, 0x04, 0x49, 0x5a, 0x4f, + 0x92, 0x2c, 0x24, 0xdf, 0x6b, 0x6e, 0x3d, 0x56, 0xce, 0xd1, 0x5f, 0x0f, 0x9b, 0xcd, 0xa7, 0x8a, + 0x44, 0x72, 0x90, 0x7a, 0xf8, 0x95, 0xfd, 0xc6, 0x9e, 0x22, 0x93, 0x22, 0xe4, 0x37, 0xb6, 0x76, + 0x36, 0x1b, 0xc6, 0xae, 0xb1, 0xb5, 0xb3, 0xaf, 0x24, 0x68, 0xdf, 0xc6, 0xd3, 0xe6, 0x83, 0x7d, + 0x25, 0x49, 0x32, 0x90, 0xa0, 0x6d, 0x29, 0x02, 0x90, 0xde, 0xdb, 0x37, 0xb6, 0x76, 0x36, 0x95, + 0x34, 0xb5, 0xb2, 0xbf, 0xb5, 0xdd, 0x50, 0x32, 0x14, 0xb9, 0xff, 0xee, 0xee, 0xd3, 0x86, 0x92, + 0xa5, 0x3f, 0x1f, 0x18, 0xc6, 0x83, 0xaf, 0x28, 0x39, 0x4a, 0xda, 0x7e, 0xb0, 0xab, 0x00, 0x76, + 0x3f, 0x78, 0xf8, 0xb4, 0xa1, 0xe4, 0x49, 0x01, 0xb2, 0x1b, 0xef, 0xee, 0x3c, 0xda, 0xdf, 0x6a, + 0xee, 0x28, 0x85, 0xf2, 0x6f, 0xc9, 0x00, 0x9b, 0xf6, 0xde, 0xf3, 0xfe, 0x08, 0xab, 0xe2, 0xcb, + 0x00, 0x93, 0xe7, 0xfd, 0x51, 0x0b, 0xa5, 0xc7, 0x2b, 0xbb, 0x1c, 0x6d, 0xc1, 0xa0, 0x43, 0xae, + 0x41, 0x01, 0xbb, 0xbb, 0x2c, 0x14, 0x60, 0x41, 0x97, 0x31, 0xf2, 0xb4, 0x8d, 0x47, 0x87, 0x20, + 0xa4, 0xa6, 0x63, 0x1d, 0x97, 0x16, 0x20, 0x35, 0x9d, 0x5c, 0x05, 0x7c, 0x6c, 0x4d, 0x30, 0xac, + 0x63, 0xed, 0x96, 0x33, 0x70, 0x5c, 0x16, 0xe8, 0xc9, 0xdb, 0x80, 0x63, 0x32, 0x59, 0x14, 0xa7, + 0x25, 0xea, 0xba, 0xbb, 0x42, 0x7f, 0x30, 0x59, 0xf8, 0x84, 0xa5, 0x26, 0xe4, 0xbc, 0x76, 0x3a, + 0x16, 0xb6, 0xf2, 0x19, 0x29, 0x38, 0x23, 0xc0, 0x26, 0x6f, 0x4a, 0x0c, 0xc0, 0xbd, 0x59, 0x40, + 0x6f, 0x18, 0x89, 0xb9, 0x53, 0xbe, 0x0c, 0x73, 0x3b, 0xb6, 0xc5, 0xb6, 0x10, 0xae, 0x52, 0x01, + 0xa4, 0x76, 0x49, 0xc2, 0x12, 0x46, 0x6a, 0x97, 0xaf, 0x00, 0x08, 0x7d, 0x0a, 0x48, 0x07, 0xac, + 0x0f, 0x37, 0xa2, 0x74, 0x50, 0xbe, 0x09, 0xe9, 0xed, 0xf6, 0xf1, 0x7e, 0xbb, 0x47, 0xae, 0x01, + 0x0c, 0xda, 0x13, 0xa7, 0xd5, 0x45, 0xa9, 0x7c, 0xfe, 0xf9, 0xe7, 0x9f, 0x4b, 0x78, 0xe2, 0xca, + 0xd1, 0x56, 0x26, 0x95, 0x17, 0x00, 0xcd, 0x41, 0x67, 0xdb, 0x9c, 0x4c, 0xda, 0x3d, 0x93, 0x54, + 0x21, 0x6d, 0x99, 0x13, 0x9a, 0x72, 0x24, 0x2c, 0xe6, 0x97, 0xfd, 0x55, 0xf0, 0x51, 0x2b, 0x3b, + 0x08, 0x31, 0x38, 0x94, 0x28, 0x90, 0xb0, 0x8e, 0x86, 0x78, 0x59, 0x91, 0x32, 0xe8, 0xcf, 0xa5, + 0x4b, 0x90, 0x66, 0x18, 0x42, 0x20, 0x69, 0xb5, 0x87, 0x66, 0x89, 0x8d, 0x8b, 0xbf, 0xcb, 0xbf, + 0x2a, 0x01, 0xec, 0x98, 0x2f, 0xcf, 0x30, 0xa6, 0x8f, 0x8a, 0x19, 0x33, 0xc1, 0xc6, 0xbc, 0x1f, + 0x37, 0x26, 0xd5, 0x59, 0xd7, 0xb6, 0x3b, 0x2d, 0xf6, 0x8a, 0xd9, 0xbd, 0x4a, 0x8e, 0xb6, 0xe0, + 0x5b, 0x2b, 0x7f, 0x00, 0x85, 0x2d, 0xcb, 0x32, 0xc7, 0xae, 0x4f, 0x04, 0x92, 0xcf, 0xec, 0x89, + 0xc3, 0x2f, 0x78, 0xf0, 0x37, 0x29, 0x41, 0x72, 0x64, 0x8f, 0x1d, 0x36, 0xcf, 0x7a, 0x52, 0x5f, + 0x5d, 0x5d, 0x35, 0xb0, 0x85, 0x5c, 0x82, 0xdc, 0xa1, 0x6d, 0x59, 0xe6, 0x21, 0x9d, 0x44, 0x02, + 0x6b, 0x0b, 0xbf, 0xa1, 0xfc, 0xcb, 0x12, 0x14, 0x9a, 0xce, 0x33, 0xdf, 0xb8, 0x02, 0x89, 0xe7, + 0xe6, 0x09, 0xba, 0x97, 0x30, 0xe8, 0x4f, 0xb2, 0x08, 0xa9, 0x9f, 0x6f, 0x0f, 0x8e, 0xd8, 0x85, + 0x4f, 0xc1, 0x60, 0x0f, 0xe4, 0x02, 0xa4, 0x5f, 0x9a, 0xfd, 0xde, 0x33, 0x07, 0x6d, 0xca, 0x06, + 0x7f, 0x22, 0xb7, 0x20, 0xd5, 0xa7, 0xce, 0x96, 0x92, 0xb8, 0x5e, 0x17, 0xfc, 0xf5, 0x12, 0xe7, + 0x60, 0x30, 0xd0, 0x8d, 0x6c, 0xb6, 0xa3, 0x7c, 0xf4, 0xd1, 0x47, 0x1f, 0xc9, 0xe5, 0x2e, 0x2c, + 0xba, 0xb1, 0x23, 0x30, 0xd9, 0x1d, 0x28, 0x0d, 0x4c, 0xbb, 0xd5, 0xed, 0x5b, 0xed, 0xc1, 0xe0, + 0xa4, 0xf5, 0xd2, 0xb6, 0x5a, 0x6d, 0xab, 0x65, 0x4f, 0x0e, 0xdb, 0x63, 0x5c, 0x80, 0xe8, 0x21, + 0x16, 0x07, 0xa6, 0xbd, 0xc1, 0x68, 0xef, 0xdb, 0xd6, 0x03, 0xab, 0x49, 0x39, 0xe5, 0x3f, 0x48, + 0x42, 0x6e, 0xfb, 0xc4, 0xb5, 0xbe, 0x08, 0xa9, 0x43, 0xfb, 0xc8, 0x62, 0x6b, 0x99, 0x32, 0xd8, + 0x83, 0xf7, 0x8e, 0x64, 0xe1, 0x1d, 0x2d, 0x42, 0xea, 0xc5, 0x91, 0xed, 0x98, 0x38, 0xdd, 0x9c, + 0xc1, 0x1e, 0xe8, 0x6a, 0x8d, 0x4c, 0xa7, 0x94, 0xc4, 0x0a, 0x93, 0xfe, 0xf4, 0xe7, 0x9f, 0x3a, + 0xc3, 0xfc, 0xc9, 0x0a, 0xa4, 0x6d, 0xba, 0xfa, 0x93, 0x52, 0x1a, 0x2f, 0xb7, 0x04, 0xb8, 0xf8, + 0x56, 0x0c, 0x8e, 0x22, 0x5b, 0xb0, 0xf0, 0xd2, 0x6c, 0x0d, 0x8f, 0x26, 0x4e, 0xab, 0x67, 0xb7, + 0x3a, 0xa6, 0x39, 0x32, 0xc7, 0xa5, 0x39, 0x1c, 0x49, 0x88, 0x09, 0xb3, 0x16, 0xd2, 0x98, 0x7f, + 0x69, 0x6e, 0x1f, 0x4d, 0x9c, 0x4d, 0xfb, 0x31, 0xb2, 0x48, 0x15, 0x72, 0x63, 0x93, 0x46, 0x02, + 0xea, 0x6c, 0x21, 0x3c, 0x7a, 0x80, 0x9a, 0x1d, 0x9b, 0x23, 0x6c, 0x20, 0xeb, 0x90, 0x3d, 0xe8, + 0x3f, 0x37, 0x27, 0xcf, 0xcc, 0x4e, 0x29, 0xa3, 0x4a, 0x95, 0x79, 0xed, 0xa2, 0xcf, 0xf1, 0x96, + 0x75, 0xe5, 0x91, 0x3d, 0xb0, 0xc7, 0x86, 0x07, 0x25, 0xf7, 0x21, 0x37, 0xb1, 0x87, 0x26, 0xd3, + 0x77, 0x16, 0x33, 0xdb, 0xe5, 0x59, 0xbc, 0x3d, 0x7b, 0x68, 0xba, 0x11, 0xcc, 0xc5, 0x93, 0x65, + 0xe6, 0xe8, 0x01, 0x3d, 0xbf, 0x96, 0x00, 0xeb, 0x73, 0xea, 0x10, 0x9e, 0x67, 0xc9, 0x12, 0x75, + 0xa8, 0xd7, 0xa5, 0xc7, 0x92, 0x52, 0x1e, 0x8b, 0x3b, 0xef, 0x79, 0xe9, 0x16, 0xe4, 0x3c, 0x83, + 0x7e, 0xe8, 0x63, 0xe1, 0x26, 0x87, 0xf1, 0x80, 0x85, 0x3e, 0x16, 0x6b, 0xde, 0x80, 0x14, 0xba, + 0x4d, 0xd3, 0x84, 0xd1, 0xa0, 0x59, 0x29, 0x07, 0xa9, 0x4d, 0xa3, 0xd1, 0xd8, 0x51, 0x24, 0x4c, + 0x50, 0x4f, 0xdf, 0x6d, 0x28, 0xb2, 0xa0, 0xd8, 0xdf, 0x96, 0x20, 0xd1, 0x38, 0x46, 0xb5, 0xd0, + 0x69, 0xb8, 0x3b, 0x9a, 0xfe, 0xd6, 0x6a, 0x90, 0x1c, 0xda, 0x63, 0x93, 0x9c, 0x9f, 0x31, 0xcb, + 0x52, 0x0f, 0xdf, 0x97, 0x70, 0x95, 0xdb, 0x38, 0x76, 0x0c, 0xc4, 0x6b, 0x6f, 0x41, 0xd2, 0x31, + 0x8f, 0x9d, 0xd9, 0xbc, 0x67, 0x6c, 0x00, 0x0a, 0xd0, 0x6e, 0x42, 0xda, 0x3a, 0x1a, 0x1e, 0x98, + 0xe3, 0xd9, 0xd0, 0x3e, 0x4e, 0x8f, 0x43, 0xca, 0xef, 0x81, 0xf2, 0xc8, 0x1e, 0x8e, 0x06, 0xe6, + 0x71, 0xe3, 0xd8, 0x31, 0xad, 0x49, 0xdf, 0xb6, 0xa8, 0x9e, 0xbb, 0xfd, 0x31, 0x46, 0x11, 0xbc, + 0xb0, 0xc5, 0x07, 0xba, 0xab, 0x27, 0xe6, 0xa1, 0x6d, 0x75, 0x78, 0xc0, 0xe4, 0x4f, 0x14, 0xed, + 0x3c, 0xeb, 0x8f, 0x69, 0x00, 0xa1, 0x71, 0x9e, 0x3d, 0x94, 0x37, 0xa1, 0xc8, 0x0f, 0xfa, 0x13, + 0x3e, 0x70, 0xf9, 0x06, 0x14, 0xdc, 0x26, 0xbc, 0xbd, 0xce, 0x42, 0xf2, 0x83, 0x86, 0xd1, 0x54, + 0xce, 0xd1, 0x65, 0x6d, 0xee, 0x34, 0x14, 0x89, 0xfe, 0xd8, 0x7f, 0xbf, 0x19, 0x58, 0xca, 0x4b, + 0x50, 0xf0, 0x7c, 0xdf, 0x33, 0x1d, 0xec, 0xa1, 0x09, 0x21, 0x53, 0x97, 0xb3, 0x52, 0x39, 0x03, + 0xa9, 0xc6, 0x70, 0xe4, 0x9c, 0x94, 0x7f, 0x11, 0xf2, 0x1c, 0xf4, 0xb4, 0x3f, 0x71, 0xc8, 0x1d, + 0xc8, 0x0c, 0xf9, 0x7c, 0x25, 0x3c, 0x73, 0x89, 0x9a, 0xf2, 0x71, 0xee, 0x6f, 0xc3, 0x45, 0x2f, + 0x55, 0x21, 0x23, 0xc4, 0x52, 0xbe, 0xd5, 0x65, 0x71, 0xab, 0xb3, 0xa0, 0x90, 0x10, 0x82, 0x42, + 0x79, 0x1b, 0x32, 0x2c, 0x03, 0x4e, 0x30, 0xab, 0xb3, 0x7a, 0x8d, 0x89, 0x89, 0xbd, 0xf9, 0x3c, + 0x6b, 0x63, 0x57, 0xc8, 0x57, 0x21, 0x8f, 0x82, 0xe5, 0x08, 0x16, 0x3a, 0x01, 0x9b, 0x98, 0xdc, + 0x7e, 0x3f, 0x05, 0x59, 0x77, 0xa5, 0xc8, 0x32, 0xa4, 0x59, 0x91, 0x84, 0xa6, 0xdc, 0x22, 0x3e, + 0x85, 0x65, 0x11, 0x59, 0x86, 0x0c, 0x2f, 0x84, 0x78, 0x74, 0xa7, 0x15, 0x7b, 0x9a, 0x15, 0x3e, + 0x5e, 0x67, 0x4d, 0xc7, 0xc0, 0xc4, 0xca, 0xf3, 0x34, 0x2b, 0x6d, 0x88, 0x0a, 0x39, 0xaf, 0x98, + 0xc1, 0x78, 0xcc, 0x6b, 0xf1, 0xac, 0x5b, 0xbd, 0x08, 0x88, 0x9a, 0x8e, 0x11, 0x8b, 0x17, 0xde, + 0xd9, 0xae, 0x7f, 0x3c, 0xc9, 0xba, 0x25, 0x09, 0xde, 0xa1, 0xbb, 0x55, 0x76, 0x86, 0x17, 0x21, + 0x3e, 0xa0, 0xa6, 0x63, 0x48, 0x70, 0x4b, 0xea, 0x0c, 0x2f, 0x34, 0xc8, 0x55, 0xea, 0x22, 0x16, + 0x0e, 0xb8, 0xf5, 0xfd, 0xfa, 0x39, 0xcd, 0xca, 0x09, 0x72, 0x8d, 0x5a, 0x60, 0xd5, 0x01, 0xee, + 0x4b, 0xbf, 0x58, 0xce, 0xf0, 0xa2, 0x81, 0xdc, 0xa4, 0x10, 0xb6, 0xfc, 0x25, 0x88, 0xa8, 0x8c, + 0x33, 0xbc, 0x32, 0x26, 0x2a, 0x1d, 0x10, 0xc3, 0x03, 0x86, 0x04, 0xa1, 0x0a, 0x4e, 0xb3, 0x2a, + 0x98, 0x5c, 0x41, 0x73, 0x6c, 0x52, 0x05, 0xbf, 0xe2, 0xcd, 0xf0, 0x2a, 0xc3, 0xef, 0xc7, 0x23, + 0x9b, 0x57, 0xdd, 0x66, 0x78, 0x1d, 0x41, 0x6a, 0xf4, 0x7d, 0x51, 0x7d, 0x97, 0xe6, 0x31, 0x08, + 0x96, 0x7c, 0xe1, 0xb9, 0xef, 0x94, 0xc5, 0xc0, 0x3a, 0x8b, 0x20, 0x46, 0xaa, 0x8b, 0xbb, 0x61, + 0x89, 0xf2, 0x76, 0xfb, 0x56, 0xb7, 0x54, 0xc4, 0x95, 0x48, 0xf4, 0xad, 0xae, 0x91, 0xea, 0xd2, + 0x16, 0xa6, 0x81, 0x1d, 0xda, 0xa7, 0x60, 0x5f, 0xf2, 0x36, 0xeb, 0xa4, 0x4d, 0xa4, 0x04, 0xa9, + 0x8d, 0xd6, 0x4e, 0xdb, 0x2a, 0x2d, 0x30, 0x9e, 0xd5, 0xb6, 0x8c, 0x64, 0x77, 0xa7, 0x6d, 0x91, + 0xb7, 0x20, 0x31, 0x39, 0x3a, 0x28, 0x91, 0xf0, 0xe7, 0x8d, 0xbd, 0xa3, 0x03, 0xd7, 0x15, 0x83, + 0x22, 0xc8, 0x32, 0x64, 0x27, 0xce, 0xb8, 0xf5, 0x0b, 0xe6, 0xd8, 0x2e, 0x9d, 0xc7, 0x25, 0x3c, + 0x67, 0x64, 0x26, 0xce, 0xf8, 0x03, 0x73, 0x6c, 0x9f, 0x31, 0xf8, 0x95, 0xaf, 0x40, 0x5e, 0xb0, + 0x4b, 0x8a, 0x20, 0x59, 0xec, 0xa4, 0x50, 0x97, 0xee, 0x18, 0x92, 0x55, 0xde, 0x87, 0x82, 0x5b, + 0x48, 0xe0, 0x7c, 0x35, 0xba, 0x93, 0x06, 0xf6, 0x18, 0xf7, 0xe7, 0xbc, 0x76, 0x49, 0x4c, 0x51, + 0x3e, 0x8c, 0xa7, 0x0b, 0x06, 0x2d, 0x2b, 0x21, 0x57, 0xa4, 0xf2, 0x0f, 0x25, 0x28, 0x6c, 0xdb, + 0x63, 0xff, 0x96, 0x77, 0x11, 0x52, 0x07, 0xb6, 0x3d, 0x98, 0xa0, 0xd9, 0xac, 0xc1, 0x1e, 0xc8, + 0x1b, 0x50, 0xc0, 0x1f, 0x6e, 0x01, 0x28, 0x7b, 0xf7, 0x0b, 0x79, 0x6c, 0xe7, 0x55, 0x1f, 0x81, + 0x64, 0xdf, 0x72, 0x26, 0x3c, 0x92, 0xe1, 0x6f, 0xf2, 0x05, 0xc8, 0xd3, 0xbf, 0x2e, 0x33, 0xe9, + 0x1d, 0x58, 0x81, 0x36, 0x73, 0xe2, 0x5b, 0x30, 0x87, 0x6f, 0xdf, 0x83, 0x65, 0xbc, 0xbb, 0x84, + 0x02, 0xeb, 0xe0, 0xc0, 0x12, 0x64, 0x58, 0x28, 0x98, 0xe0, 0x27, 0xab, 0x9c, 0xe1, 0x3e, 0xd2, + 0xf0, 0x8a, 0x95, 0x00, 0x4b, 0xf7, 0x19, 0x83, 0x3f, 0x95, 0x1f, 0x40, 0x16, 0xb3, 0x54, 0x73, + 0xd0, 0x21, 0x65, 0x90, 0x7a, 0x25, 0x13, 0x73, 0xe4, 0xa2, 0x70, 0xcc, 0xe7, 0xdd, 0x2b, 0x9b, + 0x86, 0xd4, 0x5b, 0x5a, 0x00, 0x69, 0x93, 0x9e, 0xbb, 0x8f, 0x79, 0x98, 0x96, 0x8e, 0xcb, 0x4d, + 0x6e, 0x62, 0xc7, 0x7c, 0x19, 0x67, 0x62, 0xc7, 0x7c, 0xc9, 0x4c, 0x5c, 0x9d, 0x32, 0x41, 0x9f, + 0x4e, 0xf8, 0xf7, 0x3b, 0xe9, 0x84, 0x9e, 0xf3, 0x71, 0x7b, 0xf6, 0xad, 0xde, 0xae, 0xdd, 0xb7, + 0xf0, 0x9c, 0xdf, 0xc5, 0x73, 0x92, 0x64, 0x48, 0xdd, 0xf2, 0x67, 0x49, 0x98, 0xe7, 0x41, 0xf4, + 0xfd, 0xbe, 0xf3, 0x6c, 0xbb, 0x3d, 0x22, 0x4f, 0xa1, 0x40, 0xe3, 0x67, 0x6b, 0xd8, 0x1e, 0x8d, + 0xe8, 0x46, 0x95, 0xf0, 0x50, 0x71, 0x7d, 0x2a, 0x28, 0x73, 0xfc, 0xca, 0x4e, 0x7b, 0x68, 0x6e, + 0x33, 0x6c, 0xc3, 0x72, 0xc6, 0x27, 0x46, 0xde, 0xf2, 0x5b, 0xc8, 0x16, 0xe4, 0x87, 0x93, 0x9e, + 0x67, 0x4c, 0x46, 0x63, 0x95, 0x48, 0x63, 0xdb, 0x93, 0x5e, 0xc0, 0x16, 0x0c, 0xbd, 0x06, 0xea, + 0x18, 0x8d, 0xbc, 0x9e, 0xad, 0xc4, 0x29, 0x8e, 0xd1, 0x20, 0x11, 0x74, 0xec, 0xc0, 0x6f, 0x21, + 0x8f, 0x01, 0xe8, 0x46, 0x72, 0x6c, 0x5a, 0x24, 0xa1, 0x56, 0xf2, 0xda, 0x9b, 0x91, 0xb6, 0xf6, + 0x9c, 0xf1, 0xbe, 0xbd, 0xe7, 0x8c, 0x99, 0x21, 0xba, 0x05, 0xf1, 0x71, 0xe9, 0x1d, 0x50, 0xc2, + 0xf3, 0x17, 0xcf, 0xde, 0xa9, 0x19, 0x67, 0xef, 0x1c, 0x3f, 0x7b, 0xd7, 0xe5, 0xbb, 0xd2, 0xd2, + 0x7b, 0x50, 0x0c, 0x4d, 0x59, 0xa4, 0x13, 0x46, 0xbf, 0x2d, 0xd2, 0xf3, 0xda, 0xeb, 0xc2, 0xd7, + 0x63, 0xf1, 0xd5, 0x8a, 0x76, 0xdf, 0x01, 0x25, 0x3c, 0x7d, 0xd1, 0x70, 0x36, 0xa6, 0x26, 0x40, + 0xfe, 0x7d, 0x98, 0x0b, 0x4c, 0x59, 0x24, 0xe7, 0x4e, 0x99, 0x54, 0xf9, 0x97, 0x52, 0x90, 0x6a, + 0x5a, 0xa6, 0xdd, 0x25, 0xaf, 0x07, 0x33, 0xe2, 0x93, 0x73, 0x6e, 0x36, 0xbc, 0x18, 0xca, 0x86, + 0x4f, 0xce, 0x79, 0xb9, 0xf0, 0x62, 0x28, 0x17, 0xba, 0x5d, 0x35, 0x9d, 0x5c, 0x9e, 0xca, 0x84, + 0x4f, 0xce, 0x09, 0x69, 0xf0, 0xf2, 0x54, 0x1a, 0xf4, 0xbb, 0x6b, 0x3a, 0x0d, 0x9d, 0xc1, 0x1c, + 0xf8, 0xe4, 0x9c, 0x9f, 0xff, 0x96, 0xc3, 0xf9, 0xcf, 0xeb, 0xac, 0xe9, 0xcc, 0x25, 0x21, 0xf7, + 0xa1, 0x4b, 0x2c, 0xeb, 0x2d, 0x87, 0xb3, 0x1e, 0xf2, 0x78, 0xbe, 0x5b, 0x0e, 0xe7, 0x3b, 0xec, + 0xe4, 0xf9, 0xed, 0x62, 0x28, 0xbf, 0xa1, 0x51, 0x96, 0xd8, 0x96, 0xc3, 0x89, 0x8d, 0xf1, 0x04, + 0x4f, 0xc5, 0xac, 0xe6, 0x75, 0xd6, 0x74, 0xa2, 0x85, 0x52, 0x5a, 0xf4, 0xb9, 0x1e, 0xdf, 0x05, + 0x86, 0x77, 0x9d, 0x2e, 0x9b, 0x7b, 0xe4, 0x2c, 0xc6, 0x7c, 0x60, 0xc7, 0xd5, 0x74, 0x8f, 0x5c, + 0x1a, 0x64, 0xba, 0xbc, 0xd4, 0x55, 0x30, 0x46, 0x09, 0xb2, 0xc4, 0x97, 0xbf, 0xb2, 0xd1, 0xc2, + 0x58, 0x85, 0xf3, 0x62, 0xa7, 0xf7, 0x0a, 0xcc, 0x6d, 0xb4, 0x9e, 0xb6, 0xc7, 0x3d, 0x73, 0xe2, + 0xb4, 0xf6, 0xdb, 0x3d, 0xef, 0xba, 0x80, 0xbe, 0xff, 0x7c, 0x97, 0xf7, 0xec, 0xb7, 0x7b, 0xe4, + 0x82, 0x2b, 0xae, 0x0e, 0xf6, 0x4a, 0x5c, 0x5e, 0x4b, 0xaf, 0xd3, 0x45, 0x63, 0xc6, 0x30, 0xea, + 0x2d, 0xf0, 0xa8, 0xf7, 0x30, 0x03, 0xa9, 0x23, 0xab, 0x6f, 0x5b, 0x0f, 0x73, 0x90, 0x71, 0xec, + 0xf1, 0xb0, 0xed, 0xd8, 0xe5, 0x1f, 0x49, 0x00, 0x8f, 0xec, 0xe1, 0xf0, 0xc8, 0xea, 0xbf, 0x38, + 0x32, 0xc9, 0x15, 0xc8, 0x0f, 0xdb, 0xcf, 0xcd, 0xd6, 0xd0, 0x6c, 0x1d, 0x8e, 0xdd, 0x7d, 0x90, + 0xa3, 0x4d, 0xdb, 0xe6, 0xa3, 0xf1, 0x09, 0x29, 0xb9, 0x87, 0x71, 0xd4, 0x0e, 0x4a, 0x92, 0x1f, + 0xce, 0x17, 0xf9, 0xf1, 0x32, 0xcd, 0xdf, 0xa1, 0x7b, 0xc0, 0x64, 0x15, 0x43, 0x86, 0xbf, 0x3d, + 0x7c, 0xa2, 0x92, 0x77, 0xcc, 0xe1, 0xa8, 0x75, 0x88, 0x52, 0xa1, 0x72, 0x48, 0xd1, 0xe7, 0x47, + 0xe4, 0x36, 0x24, 0x0e, 0xed, 0x01, 0x8a, 0xe4, 0x94, 0xf7, 0x42, 0x71, 0xe4, 0x0d, 0x48, 0x0c, + 0x27, 0x4c, 0x36, 0x79, 0x6d, 0x41, 0x38, 0x11, 0xb0, 0x24, 0x44, 0x61, 0xc3, 0x49, 0xcf, 0x9b, + 0xf7, 0x8d, 0x22, 0x24, 0x36, 0x9a, 0x4d, 0x9a, 0xe5, 0x37, 0x9a, 0xcd, 0x35, 0x45, 0xaa, 0x7f, + 0x09, 0xb2, 0xbd, 0xb1, 0x69, 0xd2, 0xf0, 0x30, 0xbb, 0xba, 0xf8, 0x10, 0xb3, 0x9a, 0x07, 0xaa, + 0x6f, 0x43, 0xe6, 0x90, 0xd5, 0x17, 0x24, 0xa2, 0x80, 0x2d, 0xfd, 0x21, 0xbb, 0x3e, 0x59, 0xf2, + 0xbb, 0xc3, 0x15, 0x89, 0xe1, 0xda, 0xa8, 0xef, 0x42, 0x6e, 0xdc, 0x3a, 0xcd, 0xe0, 0xc7, 0x2c, + 0xbb, 0xc4, 0x19, 0xcc, 0x8e, 0x79, 0x53, 0xbd, 0x01, 0x0b, 0x96, 0xed, 0x7e, 0xb2, 0x68, 0x75, + 0xd8, 0x1e, 0xbb, 0x38, 0x7d, 0x68, 0x73, 0x8d, 0x9b, 0xec, 0x33, 0xa1, 0x65, 0xf3, 0x0e, 0xb6, + 0x2b, 0xeb, 0x8f, 0x40, 0x11, 0xcc, 0x60, 0x91, 0x19, 0x67, 0xa5, 0xcb, 0xbe, 0x4b, 0x7a, 0x56, + 0x70, 0xdf, 0x87, 0x8c, 0xb0, 0x9d, 0x19, 0x63, 0xa4, 0xc7, 0x3e, 0xf2, 0x7a, 0x46, 0x30, 0xd4, + 0x4d, 0x1b, 0xa1, 0xb1, 0x26, 0xda, 0xc8, 0x33, 0xf6, 0xfd, 0x57, 0x34, 0x52, 0xd3, 0x43, 0xab, + 0x72, 0x74, 0xaa, 0x2b, 0x7d, 0xf6, 0xf9, 0xd6, 0xb3, 0xc2, 0x02, 0xe0, 0x0c, 0x33, 0xf1, 0xce, + 0x7c, 0xc8, 0xbe, 0xec, 0x06, 0xcc, 0x4c, 0x79, 0x33, 0x39, 0xd5, 0x9b, 0xe7, 0xec, 0x33, 0xaa, + 0x67, 0x66, 0x6f, 0x96, 0x37, 0x93, 0x53, 0xbd, 0x19, 0xb0, 0x0f, 0xac, 0x01, 0x33, 0x35, 0xbd, + 0xbe, 0x09, 0x44, 0x7c, 0xd5, 0x3c, 0x4f, 0xc4, 0xd8, 0x19, 0xb2, 0xcf, 0xe6, 0xfe, 0xcb, 0x66, + 0x94, 0x59, 0x86, 0xe2, 0x1d, 0xb2, 0xd8, 0x17, 0xf5, 0xa0, 0xa1, 0x9a, 0x5e, 0xdf, 0x82, 0xf3, + 0xe2, 0xc4, 0xce, 0xe0, 0x92, 0xad, 0x4a, 0x95, 0xa2, 0xb1, 0xe0, 0x4f, 0x8d, 0x73, 0x66, 0x9a, + 0x8a, 0x77, 0x6a, 0xa4, 0x4a, 0x15, 0x65, 0xca, 0x54, 0x4d, 0xaf, 0x3f, 0x80, 0xa2, 0x60, 0xea, + 0x00, 0x33, 0x74, 0xb4, 0x99, 0x17, 0xec, 0x5f, 0x1b, 0x3c, 0x33, 0x34, 0xa3, 0x87, 0xdf, 0x18, + 0xcf, 0x71, 0xd1, 0x46, 0xc6, 0xec, 0xbb, 0xbc, 0xef, 0x0b, 0x32, 0x42, 0x5b, 0x02, 0x2b, 0xed, + 0x38, 0x2b, 0x13, 0xf6, 0xc5, 0xde, 0x77, 0x85, 0x12, 0xea, 0xfd, 0xc0, 0x74, 0x4c, 0x9a, 0xe4, + 0x62, 0x6c, 0x38, 0x18, 0x91, 0xdf, 0x8c, 0x04, 0xac, 0x88, 0x57, 0x21, 0xc2, 0xb4, 0xe9, 0x63, + 0x7d, 0x0b, 0xe6, 0xcf, 0x1e, 0x90, 0x3e, 0x96, 0x58, 0x5d, 0x5c, 0x5d, 0xa1, 0xa5, 0xb3, 0x31, + 0xd7, 0x09, 0xc4, 0xa5, 0x06, 0xcc, 0x9d, 0x39, 0x28, 0x7d, 0x22, 0xb1, 0xea, 0x92, 0x5a, 0x32, + 0x0a, 0x9d, 0x60, 0x64, 0x9a, 0x3b, 0x73, 0x58, 0xfa, 0x54, 0x62, 0x57, 0x11, 0xba, 0xe6, 0x19, + 0x71, 0x23, 0xd3, 0xdc, 0x99, 0xc3, 0xd2, 0x57, 0x59, 0xed, 0x28, 0xeb, 0x55, 0xd1, 0x08, 0xc6, + 0x82, 0xf9, 0xb3, 0x87, 0xa5, 0xaf, 0x49, 0x78, 0x2d, 0x21, 0xeb, 0xba, 0xb7, 0x2e, 0x5e, 0x64, + 0x9a, 0x3f, 0x7b, 0x58, 0xfa, 0xba, 0x84, 0x97, 0x17, 0xb2, 0xbe, 0x1e, 0x30, 0x13, 0xf4, 0xe6, + 0xf4, 0xb0, 0xf4, 0x0d, 0x09, 0xef, 0x13, 0x64, 0xbd, 0xe6, 0x99, 0xd9, 0x9b, 0xf2, 0xe6, 0xf4, + 0xb0, 0xf4, 0x4d, 0x3c, 0xc5, 0xd7, 0x65, 0xfd, 0x4e, 0xc0, 0x0c, 0x46, 0xa6, 0xe2, 0x2b, 0x84, + 0xa5, 0x6f, 0x49, 0x78, 0xed, 0x23, 0xeb, 0x77, 0x0d, 0x77, 0x74, 0x3f, 0x32, 0x15, 0x5f, 0x21, + 0x2c, 0x7d, 0x26, 0xe1, 0xed, 0x90, 0xac, 0xdf, 0x0b, 0x1a, 0xc2, 0xc8, 0xa4, 0xbc, 0x4a, 0x58, + 0xfa, 0x36, 0xb5, 0x54, 0xac, 0xcb, 0xeb, 0xab, 0x86, 0xeb, 0x80, 0x10, 0x99, 0x94, 0x57, 0x09, + 0x4b, 0xdf, 0xa1, 0xa6, 0x94, 0xba, 0xbc, 0xbe, 0x16, 0x32, 0x55, 0xd3, 0xeb, 0x8f, 0xa0, 0x70, + 0xd6, 0xb0, 0xf4, 0x5d, 0xf1, 0xd6, 0x2d, 0xdf, 0x11, 0x62, 0xd3, 0xae, 0xf0, 0xce, 0x4e, 0x0d, + 0x4c, 0xdf, 0xc3, 0x1a, 0xa7, 0x3e, 0xf7, 0x84, 0xdd, 0x4c, 0x31, 0x82, 0xff, 0xfa, 0x58, 0x98, + 0xda, 0xf6, 0xf7, 0xc7, 0xa9, 0x31, 0xea, 0xfb, 0x12, 0x5e, 0x5f, 0x15, 0xb8, 0x41, 0xc4, 0x7b, + 0x3b, 0x85, 0x05, 0xac, 0x0f, 0xfd, 0x59, 0x9e, 0x16, 0xad, 0x7e, 0x20, 0xbd, 0x4a, 0xb8, 0xaa, + 0x27, 0x9a, 0x3b, 0x0d, 0x6f, 0x31, 0xb0, 0xe5, 0x6d, 0x48, 0x1e, 0x6b, 0xab, 0x6b, 0xe2, 0x91, + 0x4c, 0xbc, 0xb5, 0x65, 0x41, 0x2a, 0xaf, 0x15, 0x85, 0x8b, 0xed, 0xe1, 0xc8, 0x39, 0x31, 0x90, + 0xc5, 0xd9, 0x5a, 0x24, 0xfb, 0x93, 0x18, 0xb6, 0xc6, 0xd9, 0xd5, 0x48, 0xf6, 0xa7, 0x31, 0xec, + 0x2a, 0x67, 0xeb, 0x91, 0xec, 0xaf, 0xc6, 0xb0, 0x75, 0xce, 0x5e, 0x8f, 0x64, 0x7f, 0x2d, 0x86, + 0xbd, 0xce, 0xd9, 0xb5, 0x48, 0xf6, 0xd7, 0x63, 0xd8, 0x35, 0xce, 0xbe, 0x13, 0xc9, 0xfe, 0x46, + 0x0c, 0xfb, 0x0e, 0x67, 0xdf, 0x8d, 0x64, 0x7f, 0x33, 0x86, 0x7d, 0x97, 0xb3, 0xef, 0x45, 0xb2, + 0xbf, 0x15, 0xc3, 0xbe, 0xc7, 0xd8, 0x6b, 0xab, 0x91, 0xec, 0xcf, 0xa2, 0xd9, 0x6b, 0xab, 0x9c, + 0x1d, 0xad, 0xb5, 0x6f, 0xc7, 0xb0, 0xb9, 0xd6, 0xd6, 0xa2, 0xb5, 0xf6, 0x9d, 0x18, 0x36, 0xd7, + 0xda, 0x5a, 0xb4, 0xd6, 0xbe, 0x1b, 0xc3, 0xe6, 0x5a, 0x5b, 0x8b, 0xd6, 0xda, 0xf7, 0x62, 0xd8, + 0x5c, 0x6b, 0x6b, 0xd1, 0x5a, 0xfb, 0x7e, 0x0c, 0x9b, 0x6b, 0x6d, 0x2d, 0x5a, 0x6b, 0x3f, 0x88, + 0x61, 0x73, 0xad, 0xad, 0x45, 0x6b, 0xed, 0x8f, 0x62, 0xd8, 0x5c, 0x6b, 0x6b, 0xd1, 0x5a, 0xfb, + 0xe3, 0x18, 0x36, 0xd7, 0xda, 0x5a, 0xb4, 0xd6, 0xfe, 0x24, 0x86, 0xcd, 0xb5, 0xa6, 0x45, 0x6b, + 0xed, 0x4f, 0xa3, 0xd9, 0x1a, 0xd7, 0x9a, 0x16, 0xad, 0xb5, 0x3f, 0x8b, 0x61, 0x73, 0xad, 0x69, + 0xd1, 0x5a, 0xfb, 0xf3, 0x18, 0x36, 0xd7, 0x9a, 0x16, 0xad, 0xb5, 0x1f, 0xc6, 0xb0, 0xb9, 0xd6, + 0xb4, 0x68, 0xad, 0xfd, 0x45, 0x0c, 0x9b, 0x6b, 0x4d, 0x8b, 0xd6, 0xda, 0x5f, 0xc6, 0xb0, 0xb9, + 0xd6, 0xb4, 0x68, 0xad, 0xfd, 0x55, 0x0c, 0x9b, 0x6b, 0x4d, 0x8b, 0xd6, 0xda, 0x5f, 0xc7, 0xb0, + 0xb9, 0xd6, 0xb4, 0x68, 0xad, 0xfd, 0x4d, 0x0c, 0x9b, 0x6b, 0x4d, 0x8b, 0xd6, 0xda, 0xdf, 0xc6, + 0xb0, 0xb9, 0xd6, 0xaa, 0xd1, 0x5a, 0xfb, 0xbb, 0x68, 0x76, 0x95, 0x6b, 0xad, 0x1a, 0xad, 0xb5, + 0xbf, 0x8f, 0x61, 0x73, 0xad, 0x55, 0xa3, 0xb5, 0xf6, 0x0f, 0x31, 0x6c, 0xae, 0xb5, 0x6a, 0xb4, + 0xd6, 0xfe, 0x31, 0x86, 0xcd, 0xb5, 0x56, 0x8d, 0xd6, 0xda, 0x8f, 0x62, 0xd8, 0x5c, 0x6b, 0xd5, + 0x68, 0xad, 0xfd, 0x53, 0x0c, 0x9b, 0x6b, 0xad, 0x1a, 0xad, 0xb5, 0x7f, 0x8e, 0x61, 0x73, 0xad, + 0x55, 0xa3, 0xb5, 0xf6, 0x2f, 0x31, 0x6c, 0xae, 0xb5, 0x6a, 0xb4, 0xd6, 0xfe, 0x35, 0x86, 0xcd, + 0xb5, 0x56, 0x8d, 0xd6, 0xda, 0xbf, 0xc5, 0xb0, 0xb9, 0xd6, 0xf4, 0x68, 0xad, 0xfd, 0x7b, 0x34, + 0x5b, 0xe7, 0x5a, 0xd3, 0xa3, 0xb5, 0xf6, 0x1f, 0x31, 0x6c, 0xae, 0x35, 0x3d, 0x5a, 0x6b, 0xff, + 0x19, 0xc3, 0xe6, 0x5a, 0xd3, 0xa3, 0xb5, 0xf6, 0x5f, 0x31, 0x6c, 0xae, 0x35, 0x3d, 0x5a, 0x6b, + 0xff, 0x1d, 0xc3, 0xe6, 0x5a, 0xd3, 0xa3, 0xb5, 0xf6, 0x3f, 0x31, 0x6c, 0xae, 0x35, 0x3d, 0x5a, + 0x6b, 0x3f, 0x8e, 0x61, 0x73, 0xad, 0xe9, 0xd1, 0x5a, 0xfb, 0x49, 0x0c, 0x9b, 0x6b, 0x4d, 0x8f, + 0xd6, 0xda, 0xff, 0xc6, 0xb0, 0xb9, 0xd6, 0xf4, 0x68, 0xad, 0xfd, 0x5f, 0x0c, 0x9b, 0x6b, 0x6d, + 0x3d, 0x5a, 0x6b, 0xff, 0x1f, 0xcd, 0x5e, 0x5f, 0xfd, 0x69, 0x00, 0x00, 0x00, 0xff, 0xff, 0x81, + 0x23, 0xc6, 0xe6, 0xc6, 0x38, 0x00, 0x00, +} diff --git a/api/vendor/github.com/matttproud/golang_protobuf_extensions/testdata/test.proto b/api/vendor/github.com/matttproud/golang_protobuf_extensions/testdata/test.proto new file mode 100644 index 0000000..f607113 --- /dev/null +++ b/api/vendor/github.com/matttproud/golang_protobuf_extensions/testdata/test.proto @@ -0,0 +1,540 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +// A feature-rich test file for the protocol compiler and libraries. + +syntax = "proto2"; + +package testdata; + +enum FOO { FOO1 = 1; }; + +message GoEnum { + required FOO foo = 1; +} + +message GoTestField { + required string Label = 1; + required string Type = 2; +} + +message GoTest { + // An enum, for completeness. + enum KIND { + VOID = 0; + + // Basic types + BOOL = 1; + BYTES = 2; + FINGERPRINT = 3; + FLOAT = 4; + INT = 5; + STRING = 6; + TIME = 7; + + // Groupings + TUPLE = 8; + ARRAY = 9; + MAP = 10; + + // Table types + TABLE = 11; + + // Functions + FUNCTION = 12; // last tag + }; + + // Some typical parameters + required KIND Kind = 1; + optional string Table = 2; + optional int32 Param = 3; + + // Required, repeated and optional foreign fields. + required GoTestField RequiredField = 4; + repeated GoTestField RepeatedField = 5; + optional GoTestField OptionalField = 6; + + // Required fields of all basic types + required bool F_Bool_required = 10; + required int32 F_Int32_required = 11; + required int64 F_Int64_required = 12; + required fixed32 F_Fixed32_required = 13; + required fixed64 F_Fixed64_required = 14; + required uint32 F_Uint32_required = 15; + required uint64 F_Uint64_required = 16; + required float F_Float_required = 17; + required double F_Double_required = 18; + required string F_String_required = 19; + required bytes F_Bytes_required = 101; + required sint32 F_Sint32_required = 102; + required sint64 F_Sint64_required = 103; + + // Repeated fields of all basic types + repeated bool F_Bool_repeated = 20; + repeated int32 F_Int32_repeated = 21; + repeated int64 F_Int64_repeated = 22; + repeated fixed32 F_Fixed32_repeated = 23; + repeated fixed64 F_Fixed64_repeated = 24; + repeated uint32 F_Uint32_repeated = 25; + repeated uint64 F_Uint64_repeated = 26; + repeated float F_Float_repeated = 27; + repeated double F_Double_repeated = 28; + repeated string F_String_repeated = 29; + repeated bytes F_Bytes_repeated = 201; + repeated sint32 F_Sint32_repeated = 202; + repeated sint64 F_Sint64_repeated = 203; + + // Optional fields of all basic types + optional bool F_Bool_optional = 30; + optional int32 F_Int32_optional = 31; + optional int64 F_Int64_optional = 32; + optional fixed32 F_Fixed32_optional = 33; + optional fixed64 F_Fixed64_optional = 34; + optional uint32 F_Uint32_optional = 35; + optional uint64 F_Uint64_optional = 36; + optional float F_Float_optional = 37; + optional double F_Double_optional = 38; + optional string F_String_optional = 39; + optional bytes F_Bytes_optional = 301; + optional sint32 F_Sint32_optional = 302; + optional sint64 F_Sint64_optional = 303; + + // Default-valued fields of all basic types + optional bool F_Bool_defaulted = 40 [default=true]; + optional int32 F_Int32_defaulted = 41 [default=32]; + optional int64 F_Int64_defaulted = 42 [default=64]; + optional fixed32 F_Fixed32_defaulted = 43 [default=320]; + optional fixed64 F_Fixed64_defaulted = 44 [default=640]; + optional uint32 F_Uint32_defaulted = 45 [default=3200]; + optional uint64 F_Uint64_defaulted = 46 [default=6400]; + optional float F_Float_defaulted = 47 [default=314159.]; + optional double F_Double_defaulted = 48 [default=271828.]; + optional string F_String_defaulted = 49 [default="hello, \"world!\"\n"]; + optional bytes F_Bytes_defaulted = 401 [default="Bignose"]; + optional sint32 F_Sint32_defaulted = 402 [default = -32]; + optional sint64 F_Sint64_defaulted = 403 [default = -64]; + + // Packed repeated fields (no string or bytes). + repeated bool F_Bool_repeated_packed = 50 [packed=true]; + repeated int32 F_Int32_repeated_packed = 51 [packed=true]; + repeated int64 F_Int64_repeated_packed = 52 [packed=true]; + repeated fixed32 F_Fixed32_repeated_packed = 53 [packed=true]; + repeated fixed64 F_Fixed64_repeated_packed = 54 [packed=true]; + repeated uint32 F_Uint32_repeated_packed = 55 [packed=true]; + repeated uint64 F_Uint64_repeated_packed = 56 [packed=true]; + repeated float F_Float_repeated_packed = 57 [packed=true]; + repeated double F_Double_repeated_packed = 58 [packed=true]; + repeated sint32 F_Sint32_repeated_packed = 502 [packed=true]; + repeated sint64 F_Sint64_repeated_packed = 503 [packed=true]; + + // Required, repeated, and optional groups. + required group RequiredGroup = 70 { + required string RequiredField = 71; + }; + + repeated group RepeatedGroup = 80 { + required string RequiredField = 81; + }; + + optional group OptionalGroup = 90 { + required string RequiredField = 91; + }; +} + +// For testing skipping of unrecognized fields. +// Numbers are all big, larger than tag numbers in GoTestField, +// the message used in the corresponding test. +message GoSkipTest { + required int32 skip_int32 = 11; + required fixed32 skip_fixed32 = 12; + required fixed64 skip_fixed64 = 13; + required string skip_string = 14; + required group SkipGroup = 15 { + required int32 group_int32 = 16; + required string group_string = 17; + } +} + +// For testing packed/non-packed decoder switching. +// A serialized instance of one should be deserializable as the other. +message NonPackedTest { + repeated int32 a = 1; +} + +message PackedTest { + repeated int32 b = 1 [packed=true]; +} + +message MaxTag { + // Maximum possible tag number. + optional string last_field = 536870911; +} + +message OldMessage { + message Nested { + optional string name = 1; + } + optional Nested nested = 1; + + optional int32 num = 2; +} + +// NewMessage is wire compatible with OldMessage; +// imagine it as a future version. +message NewMessage { + message Nested { + optional string name = 1; + optional string food_group = 2; + } + optional Nested nested = 1; + + // This is an int32 in OldMessage. + optional int64 num = 2; +} + +// Smaller tests for ASCII formatting. + +message InnerMessage { + required string host = 1; + optional int32 port = 2 [default=4000]; + optional bool connected = 3; +} + +message OtherMessage { + optional int64 key = 1; + optional bytes value = 2; + optional float weight = 3; + optional InnerMessage inner = 4; + + extensions 100 to max; +} + +message RequiredInnerMessage { + required InnerMessage leo_finally_won_an_oscar = 1; +} + +message MyMessage { + required int32 count = 1; + optional string name = 2; + optional string quote = 3; + repeated string pet = 4; + optional InnerMessage inner = 5; + repeated OtherMessage others = 6; + optional RequiredInnerMessage we_must_go_deeper = 13; + repeated InnerMessage rep_inner = 12; + + enum Color { + RED = 0; + GREEN = 1; + BLUE = 2; + }; + optional Color bikeshed = 7; + + optional group SomeGroup = 8 { + optional int32 group_field = 9; + } + + // This field becomes [][]byte in the generated code. + repeated bytes rep_bytes = 10; + + optional double bigfloat = 11; + + extensions 100 to max; +} + +message Ext { + extend MyMessage { + optional Ext more = 103; + optional string text = 104; + optional int32 number = 105; + } + + optional string data = 1; +} + +extend MyMessage { + repeated string greeting = 106; +} + +message ComplexExtension { + optional int32 first = 1; + optional int32 second = 2; + repeated int32 third = 3; +} + +extend OtherMessage { + optional ComplexExtension complex = 200; + repeated ComplexExtension r_complex = 201; +} + +message DefaultsMessage { + enum DefaultsEnum { + ZERO = 0; + ONE = 1; + TWO = 2; + }; + extensions 100 to max; +} + +extend DefaultsMessage { + optional double no_default_double = 101; + optional float no_default_float = 102; + optional int32 no_default_int32 = 103; + optional int64 no_default_int64 = 104; + optional uint32 no_default_uint32 = 105; + optional uint64 no_default_uint64 = 106; + optional sint32 no_default_sint32 = 107; + optional sint64 no_default_sint64 = 108; + optional fixed32 no_default_fixed32 = 109; + optional fixed64 no_default_fixed64 = 110; + optional sfixed32 no_default_sfixed32 = 111; + optional sfixed64 no_default_sfixed64 = 112; + optional bool no_default_bool = 113; + optional string no_default_string = 114; + optional bytes no_default_bytes = 115; + optional DefaultsMessage.DefaultsEnum no_default_enum = 116; + + optional double default_double = 201 [default = 3.1415]; + optional float default_float = 202 [default = 3.14]; + optional int32 default_int32 = 203 [default = 42]; + optional int64 default_int64 = 204 [default = 43]; + optional uint32 default_uint32 = 205 [default = 44]; + optional uint64 default_uint64 = 206 [default = 45]; + optional sint32 default_sint32 = 207 [default = 46]; + optional sint64 default_sint64 = 208 [default = 47]; + optional fixed32 default_fixed32 = 209 [default = 48]; + optional fixed64 default_fixed64 = 210 [default = 49]; + optional sfixed32 default_sfixed32 = 211 [default = 50]; + optional sfixed64 default_sfixed64 = 212 [default = 51]; + optional bool default_bool = 213 [default = true]; + optional string default_string = 214 [default = "Hello, string"]; + optional bytes default_bytes = 215 [default = "Hello, bytes"]; + optional DefaultsMessage.DefaultsEnum default_enum = 216 [default = ONE]; +} + +message MyMessageSet { + option message_set_wire_format = true; + extensions 100 to max; +} + +message Empty { +} + +extend MyMessageSet { + optional Empty x201 = 201; + optional Empty x202 = 202; + optional Empty x203 = 203; + optional Empty x204 = 204; + optional Empty x205 = 205; + optional Empty x206 = 206; + optional Empty x207 = 207; + optional Empty x208 = 208; + optional Empty x209 = 209; + optional Empty x210 = 210; + optional Empty x211 = 211; + optional Empty x212 = 212; + optional Empty x213 = 213; + optional Empty x214 = 214; + optional Empty x215 = 215; + optional Empty x216 = 216; + optional Empty x217 = 217; + optional Empty x218 = 218; + optional Empty x219 = 219; + optional Empty x220 = 220; + optional Empty x221 = 221; + optional Empty x222 = 222; + optional Empty x223 = 223; + optional Empty x224 = 224; + optional Empty x225 = 225; + optional Empty x226 = 226; + optional Empty x227 = 227; + optional Empty x228 = 228; + optional Empty x229 = 229; + optional Empty x230 = 230; + optional Empty x231 = 231; + optional Empty x232 = 232; + optional Empty x233 = 233; + optional Empty x234 = 234; + optional Empty x235 = 235; + optional Empty x236 = 236; + optional Empty x237 = 237; + optional Empty x238 = 238; + optional Empty x239 = 239; + optional Empty x240 = 240; + optional Empty x241 = 241; + optional Empty x242 = 242; + optional Empty x243 = 243; + optional Empty x244 = 244; + optional Empty x245 = 245; + optional Empty x246 = 246; + optional Empty x247 = 247; + optional Empty x248 = 248; + optional Empty x249 = 249; + optional Empty x250 = 250; +} + +message MessageList { + repeated group Message = 1 { + required string name = 2; + required int32 count = 3; + } +} + +message Strings { + optional string string_field = 1; + optional bytes bytes_field = 2; +} + +message Defaults { + enum Color { + RED = 0; + GREEN = 1; + BLUE = 2; + } + + // Default-valued fields of all basic types. + // Same as GoTest, but copied here to make testing easier. + optional bool F_Bool = 1 [default=true]; + optional int32 F_Int32 = 2 [default=32]; + optional int64 F_Int64 = 3 [default=64]; + optional fixed32 F_Fixed32 = 4 [default=320]; + optional fixed64 F_Fixed64 = 5 [default=640]; + optional uint32 F_Uint32 = 6 [default=3200]; + optional uint64 F_Uint64 = 7 [default=6400]; + optional float F_Float = 8 [default=314159.]; + optional double F_Double = 9 [default=271828.]; + optional string F_String = 10 [default="hello, \"world!\"\n"]; + optional bytes F_Bytes = 11 [default="Bignose"]; + optional sint32 F_Sint32 = 12 [default=-32]; + optional sint64 F_Sint64 = 13 [default=-64]; + optional Color F_Enum = 14 [default=GREEN]; + + // More fields with crazy defaults. + optional float F_Pinf = 15 [default=inf]; + optional float F_Ninf = 16 [default=-inf]; + optional float F_Nan = 17 [default=nan]; + + // Sub-message. + optional SubDefaults sub = 18; + + // Redundant but explicit defaults. + optional string str_zero = 19 [default=""]; +} + +message SubDefaults { + optional int64 n = 1 [default=7]; +} + +message RepeatedEnum { + enum Color { + RED = 1; + } + repeated Color color = 1; +} + +message MoreRepeated { + repeated bool bools = 1; + repeated bool bools_packed = 2 [packed=true]; + repeated int32 ints = 3; + repeated int32 ints_packed = 4 [packed=true]; + repeated int64 int64s_packed = 7 [packed=true]; + repeated string strings = 5; + repeated fixed32 fixeds = 6; +} + +// GroupOld and GroupNew have the same wire format. +// GroupNew has a new field inside a group. + +message GroupOld { + optional group G = 101 { + optional int32 x = 2; + } +} + +message GroupNew { + optional group G = 101 { + optional int32 x = 2; + optional int32 y = 3; + } +} + +message FloatingPoint { + required double f = 1; +} + +message MessageWithMap { + map name_mapping = 1; + map msg_mapping = 2; + map byte_mapping = 3; + map str_to_str = 4; +} + +message Oneof { + oneof union { + bool F_Bool = 1; + int32 F_Int32 = 2; + int64 F_Int64 = 3; + fixed32 F_Fixed32 = 4; + fixed64 F_Fixed64 = 5; + uint32 F_Uint32 = 6; + uint64 F_Uint64 = 7; + float F_Float = 8; + double F_Double = 9; + string F_String = 10; + bytes F_Bytes = 11; + sint32 F_Sint32 = 12; + sint64 F_Sint64 = 13; + MyMessage.Color F_Enum = 14; + GoTestField F_Message = 15; + group F_Group = 16 { + optional int32 x = 17; + } + int32 F_Largest_Tag = 536870911; + } + + oneof tormato { + int32 value = 100; + } +} + +message Communique { + optional bool make_me_cry = 1; + + // This is a oneof, called "union". + oneof union { + int32 number = 5; + string name = 6; + bytes data = 7; + double temp_c = 8; + MyMessage.Color col = 9; + Strings msg = 10; + } +} diff --git a/api/vendor/github.com/pmezard/go-difflib/.travis.yml b/api/vendor/github.com/pmezard/go-difflib/.travis.yml new file mode 100644 index 0000000..90c9c6f --- /dev/null +++ b/api/vendor/github.com/pmezard/go-difflib/.travis.yml @@ -0,0 +1,5 @@ +language: go +go: + - 1.5 + - tip + diff --git a/api/vendor/github.com/pmezard/go-difflib/LICENSE b/api/vendor/github.com/pmezard/go-difflib/LICENSE new file mode 100644 index 0000000..c67dad6 --- /dev/null +++ b/api/vendor/github.com/pmezard/go-difflib/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2013, Patrick Mezard +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. + The names of its contributors may not 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 +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. diff --git a/api/vendor/github.com/pmezard/go-difflib/README.md b/api/vendor/github.com/pmezard/go-difflib/README.md new file mode 100644 index 0000000..e87f307 --- /dev/null +++ b/api/vendor/github.com/pmezard/go-difflib/README.md @@ -0,0 +1,50 @@ +go-difflib +========== + +[![Build Status](https://travis-ci.org/pmezard/go-difflib.png?branch=master)](https://travis-ci.org/pmezard/go-difflib) +[![GoDoc](https://godoc.org/github.com/pmezard/go-difflib/difflib?status.svg)](https://godoc.org/github.com/pmezard/go-difflib/difflib) + +Go-difflib is a partial port of python 3 difflib package. Its main goal +was to make unified and context diff available in pure Go, mostly for +testing purposes. + +The following class and functions (and related tests) have be ported: + +* `SequenceMatcher` +* `unified_diff()` +* `context_diff()` + +## Installation + +```bash +$ go get github.com/pmezard/go-difflib/difflib +``` + +### Quick Start + +Diffs are configured with Unified (or ContextDiff) structures, and can +be output to an io.Writer or returned as a string. + +```Go +diff := UnifiedDiff{ + A: difflib.SplitLines("foo\nbar\n"), + B: difflib.SplitLines("foo\nbaz\n"), + FromFile: "Original", + ToFile: "Current", + Context: 3, +} +text, _ := GetUnifiedDiffString(diff) +fmt.Printf(text) +``` + +would output: + +``` +--- Original ++++ Current +@@ -1,3 +1,3 @@ + foo +-bar ++baz +``` + diff --git a/api/vendor/github.com/pmezard/go-difflib/difflib/difflib.go b/api/vendor/github.com/pmezard/go-difflib/difflib/difflib.go new file mode 100644 index 0000000..003e99f --- /dev/null +++ b/api/vendor/github.com/pmezard/go-difflib/difflib/difflib.go @@ -0,0 +1,772 @@ +// Package difflib is a partial port of Python difflib module. +// +// It provides tools to compare sequences of strings and generate textual diffs. +// +// The following class and functions have been ported: +// +// - SequenceMatcher +// +// - unified_diff +// +// - context_diff +// +// Getting unified diffs was the main goal of the port. Keep in mind this code +// is mostly suitable to output text differences in a human friendly way, there +// are no guarantees generated diffs are consumable by patch(1). +package difflib + +import ( + "bufio" + "bytes" + "fmt" + "io" + "strings" +) + +func min(a, b int) int { + if a < b { + return a + } + return b +} + +func max(a, b int) int { + if a > b { + return a + } + return b +} + +func calculateRatio(matches, length int) float64 { + if length > 0 { + return 2.0 * float64(matches) / float64(length) + } + return 1.0 +} + +type Match struct { + A int + B int + Size int +} + +type OpCode struct { + Tag byte + I1 int + I2 int + J1 int + J2 int +} + +// SequenceMatcher compares sequence of strings. The basic +// algorithm predates, and is a little fancier than, an algorithm +// published in the late 1980's by Ratcliff and Obershelp under the +// hyperbolic name "gestalt pattern matching". The basic idea is to find +// the longest contiguous matching subsequence that contains no "junk" +// elements (R-O doesn't address junk). The same idea is then applied +// recursively to the pieces of the sequences to the left and to the right +// of the matching subsequence. This does not yield minimal edit +// sequences, but does tend to yield matches that "look right" to people. +// +// SequenceMatcher tries to compute a "human-friendly diff" between two +// sequences. Unlike e.g. UNIX(tm) diff, the fundamental notion is the +// longest *contiguous* & junk-free matching subsequence. That's what +// catches peoples' eyes. The Windows(tm) windiff has another interesting +// notion, pairing up elements that appear uniquely in each sequence. +// That, and the method here, appear to yield more intuitive difference +// reports than does diff. This method appears to be the least vulnerable +// to synching up on blocks of "junk lines", though (like blank lines in +// ordinary text files, or maybe "

    " lines in HTML files). That may be +// because this is the only method of the 3 that has a *concept* of +// "junk" . +// +// Timing: Basic R-O is cubic time worst case and quadratic time expected +// case. SequenceMatcher is quadratic time for the worst case and has +// expected-case behavior dependent in a complicated way on how many +// elements the sequences have in common; best case time is linear. +type SequenceMatcher struct { + a []string + b []string + b2j map[string][]int + IsJunk func(string) bool + autoJunk bool + bJunk map[string]struct{} + matchingBlocks []Match + fullBCount map[string]int + bPopular map[string]struct{} + opCodes []OpCode +} + +func NewMatcher(a, b []string) *SequenceMatcher { + m := SequenceMatcher{autoJunk: true} + m.SetSeqs(a, b) + return &m +} + +func NewMatcherWithJunk(a, b []string, autoJunk bool, + isJunk func(string) bool) *SequenceMatcher { + + m := SequenceMatcher{IsJunk: isJunk, autoJunk: autoJunk} + m.SetSeqs(a, b) + return &m +} + +// Set two sequences to be compared. +func (m *SequenceMatcher) SetSeqs(a, b []string) { + m.SetSeq1(a) + m.SetSeq2(b) +} + +// Set the first sequence to be compared. The second sequence to be compared is +// not changed. +// +// SequenceMatcher computes and caches detailed information about the second +// sequence, so if you want to compare one sequence S against many sequences, +// use .SetSeq2(s) once and call .SetSeq1(x) repeatedly for each of the other +// sequences. +// +// See also SetSeqs() and SetSeq2(). +func (m *SequenceMatcher) SetSeq1(a []string) { + if &a == &m.a { + return + } + m.a = a + m.matchingBlocks = nil + m.opCodes = nil +} + +// Set the second sequence to be compared. The first sequence to be compared is +// not changed. +func (m *SequenceMatcher) SetSeq2(b []string) { + if &b == &m.b { + return + } + m.b = b + m.matchingBlocks = nil + m.opCodes = nil + m.fullBCount = nil + m.chainB() +} + +func (m *SequenceMatcher) chainB() { + // Populate line -> index mapping + b2j := map[string][]int{} + for i, s := range m.b { + indices := b2j[s] + indices = append(indices, i) + b2j[s] = indices + } + + // Purge junk elements + m.bJunk = map[string]struct{}{} + if m.IsJunk != nil { + junk := m.bJunk + for s, _ := range b2j { + if m.IsJunk(s) { + junk[s] = struct{}{} + } + } + for s, _ := range junk { + delete(b2j, s) + } + } + + // Purge remaining popular elements + popular := map[string]struct{}{} + n := len(m.b) + if m.autoJunk && n >= 200 { + ntest := n/100 + 1 + for s, indices := range b2j { + if len(indices) > ntest { + popular[s] = struct{}{} + } + } + for s, _ := range popular { + delete(b2j, s) + } + } + m.bPopular = popular + m.b2j = b2j +} + +func (m *SequenceMatcher) isBJunk(s string) bool { + _, ok := m.bJunk[s] + return ok +} + +// Find longest matching block in a[alo:ahi] and b[blo:bhi]. +// +// If IsJunk is not defined: +// +// Return (i,j,k) such that a[i:i+k] is equal to b[j:j+k], where +// alo <= i <= i+k <= ahi +// blo <= j <= j+k <= bhi +// and for all (i',j',k') meeting those conditions, +// k >= k' +// i <= i' +// and if i == i', j <= j' +// +// In other words, of all maximal matching blocks, return one that +// starts earliest in a, and of all those maximal matching blocks that +// start earliest in a, return the one that starts earliest in b. +// +// If IsJunk is defined, first the longest matching block is +// determined as above, but with the additional restriction that no +// junk element appears in the block. Then that block is extended as +// far as possible by matching (only) junk elements on both sides. So +// the resulting block never matches on junk except as identical junk +// happens to be adjacent to an "interesting" match. +// +// If no blocks match, return (alo, blo, 0). +func (m *SequenceMatcher) findLongestMatch(alo, ahi, blo, bhi int) Match { + // CAUTION: stripping common prefix or suffix would be incorrect. + // E.g., + // ab + // acab + // Longest matching block is "ab", but if common prefix is + // stripped, it's "a" (tied with "b"). UNIX(tm) diff does so + // strip, so ends up claiming that ab is changed to acab by + // inserting "ca" in the middle. That's minimal but unintuitive: + // "it's obvious" that someone inserted "ac" at the front. + // Windiff ends up at the same place as diff, but by pairing up + // the unique 'b's and then matching the first two 'a's. + besti, bestj, bestsize := alo, blo, 0 + + // find longest junk-free match + // during an iteration of the loop, j2len[j] = length of longest + // junk-free match ending with a[i-1] and b[j] + j2len := map[int]int{} + for i := alo; i != ahi; i++ { + // look at all instances of a[i] in b; note that because + // b2j has no junk keys, the loop is skipped if a[i] is junk + newj2len := map[int]int{} + for _, j := range m.b2j[m.a[i]] { + // a[i] matches b[j] + if j < blo { + continue + } + if j >= bhi { + break + } + k := j2len[j-1] + 1 + newj2len[j] = k + if k > bestsize { + besti, bestj, bestsize = i-k+1, j-k+1, k + } + } + j2len = newj2len + } + + // Extend the best by non-junk elements on each end. In particular, + // "popular" non-junk elements aren't in b2j, which greatly speeds + // the inner loop above, but also means "the best" match so far + // doesn't contain any junk *or* popular non-junk elements. + for besti > alo && bestj > blo && !m.isBJunk(m.b[bestj-1]) && + m.a[besti-1] == m.b[bestj-1] { + besti, bestj, bestsize = besti-1, bestj-1, bestsize+1 + } + for besti+bestsize < ahi && bestj+bestsize < bhi && + !m.isBJunk(m.b[bestj+bestsize]) && + m.a[besti+bestsize] == m.b[bestj+bestsize] { + bestsize += 1 + } + + // Now that we have a wholly interesting match (albeit possibly + // empty!), we may as well suck up the matching junk on each + // side of it too. Can't think of a good reason not to, and it + // saves post-processing the (possibly considerable) expense of + // figuring out what to do with it. In the case of an empty + // interesting match, this is clearly the right thing to do, + // because no other kind of match is possible in the regions. + for besti > alo && bestj > blo && m.isBJunk(m.b[bestj-1]) && + m.a[besti-1] == m.b[bestj-1] { + besti, bestj, bestsize = besti-1, bestj-1, bestsize+1 + } + for besti+bestsize < ahi && bestj+bestsize < bhi && + m.isBJunk(m.b[bestj+bestsize]) && + m.a[besti+bestsize] == m.b[bestj+bestsize] { + bestsize += 1 + } + + return Match{A: besti, B: bestj, Size: bestsize} +} + +// Return list of triples describing matching subsequences. +// +// Each triple is of the form (i, j, n), and means that +// a[i:i+n] == b[j:j+n]. The triples are monotonically increasing in +// i and in j. It's also guaranteed that if (i, j, n) and (i', j', n') are +// adjacent triples in the list, and the second is not the last triple in the +// list, then i+n != i' or j+n != j'. IOW, adjacent triples never describe +// adjacent equal blocks. +// +// The last triple is a dummy, (len(a), len(b), 0), and is the only +// triple with n==0. +func (m *SequenceMatcher) GetMatchingBlocks() []Match { + if m.matchingBlocks != nil { + return m.matchingBlocks + } + + var matchBlocks func(alo, ahi, blo, bhi int, matched []Match) []Match + matchBlocks = func(alo, ahi, blo, bhi int, matched []Match) []Match { + match := m.findLongestMatch(alo, ahi, blo, bhi) + i, j, k := match.A, match.B, match.Size + if match.Size > 0 { + if alo < i && blo < j { + matched = matchBlocks(alo, i, blo, j, matched) + } + matched = append(matched, match) + if i+k < ahi && j+k < bhi { + matched = matchBlocks(i+k, ahi, j+k, bhi, matched) + } + } + return matched + } + matched := matchBlocks(0, len(m.a), 0, len(m.b), nil) + + // It's possible that we have adjacent equal blocks in the + // matching_blocks list now. + nonAdjacent := []Match{} + i1, j1, k1 := 0, 0, 0 + for _, b := range matched { + // Is this block adjacent to i1, j1, k1? + i2, j2, k2 := b.A, b.B, b.Size + if i1+k1 == i2 && j1+k1 == j2 { + // Yes, so collapse them -- this just increases the length of + // the first block by the length of the second, and the first + // block so lengthened remains the block to compare against. + k1 += k2 + } else { + // Not adjacent. Remember the first block (k1==0 means it's + // the dummy we started with), and make the second block the + // new block to compare against. + if k1 > 0 { + nonAdjacent = append(nonAdjacent, Match{i1, j1, k1}) + } + i1, j1, k1 = i2, j2, k2 + } + } + if k1 > 0 { + nonAdjacent = append(nonAdjacent, Match{i1, j1, k1}) + } + + nonAdjacent = append(nonAdjacent, Match{len(m.a), len(m.b), 0}) + m.matchingBlocks = nonAdjacent + return m.matchingBlocks +} + +// Return list of 5-tuples describing how to turn a into b. +// +// Each tuple is of the form (tag, i1, i2, j1, j2). The first tuple +// has i1 == j1 == 0, and remaining tuples have i1 == the i2 from the +// tuple preceding it, and likewise for j1 == the previous j2. +// +// The tags are characters, with these meanings: +// +// 'r' (replace): a[i1:i2] should be replaced by b[j1:j2] +// +// 'd' (delete): a[i1:i2] should be deleted, j1==j2 in this case. +// +// 'i' (insert): b[j1:j2] should be inserted at a[i1:i1], i1==i2 in this case. +// +// 'e' (equal): a[i1:i2] == b[j1:j2] +func (m *SequenceMatcher) GetOpCodes() []OpCode { + if m.opCodes != nil { + return m.opCodes + } + i, j := 0, 0 + matching := m.GetMatchingBlocks() + opCodes := make([]OpCode, 0, len(matching)) + for _, m := range matching { + // invariant: we've pumped out correct diffs to change + // a[:i] into b[:j], and the next matching block is + // a[ai:ai+size] == b[bj:bj+size]. So we need to pump + // out a diff to change a[i:ai] into b[j:bj], pump out + // the matching block, and move (i,j) beyond the match + ai, bj, size := m.A, m.B, m.Size + tag := byte(0) + if i < ai && j < bj { + tag = 'r' + } else if i < ai { + tag = 'd' + } else if j < bj { + tag = 'i' + } + if tag > 0 { + opCodes = append(opCodes, OpCode{tag, i, ai, j, bj}) + } + i, j = ai+size, bj+size + // the list of matching blocks is terminated by a + // sentinel with size 0 + if size > 0 { + opCodes = append(opCodes, OpCode{'e', ai, i, bj, j}) + } + } + m.opCodes = opCodes + return m.opCodes +} + +// Isolate change clusters by eliminating ranges with no changes. +// +// Return a generator of groups with up to n lines of context. +// Each group is in the same format as returned by GetOpCodes(). +func (m *SequenceMatcher) GetGroupedOpCodes(n int) [][]OpCode { + if n < 0 { + n = 3 + } + codes := m.GetOpCodes() + if len(codes) == 0 { + codes = []OpCode{OpCode{'e', 0, 1, 0, 1}} + } + // Fixup leading and trailing groups if they show no changes. + if codes[0].Tag == 'e' { + c := codes[0] + i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2 + codes[0] = OpCode{c.Tag, max(i1, i2-n), i2, max(j1, j2-n), j2} + } + if codes[len(codes)-1].Tag == 'e' { + c := codes[len(codes)-1] + i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2 + codes[len(codes)-1] = OpCode{c.Tag, i1, min(i2, i1+n), j1, min(j2, j1+n)} + } + nn := n + n + groups := [][]OpCode{} + group := []OpCode{} + for _, c := range codes { + i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2 + // End the current group and start a new one whenever + // there is a large range with no changes. + if c.Tag == 'e' && i2-i1 > nn { + group = append(group, OpCode{c.Tag, i1, min(i2, i1+n), + j1, min(j2, j1+n)}) + groups = append(groups, group) + group = []OpCode{} + i1, j1 = max(i1, i2-n), max(j1, j2-n) + } + group = append(group, OpCode{c.Tag, i1, i2, j1, j2}) + } + if len(group) > 0 && !(len(group) == 1 && group[0].Tag == 'e') { + groups = append(groups, group) + } + return groups +} + +// Return a measure of the sequences' similarity (float in [0,1]). +// +// Where T is the total number of elements in both sequences, and +// M is the number of matches, this is 2.0*M / T. +// Note that this is 1 if the sequences are identical, and 0 if +// they have nothing in common. +// +// .Ratio() is expensive to compute if you haven't already computed +// .GetMatchingBlocks() or .GetOpCodes(), in which case you may +// want to try .QuickRatio() or .RealQuickRation() first to get an +// upper bound. +func (m *SequenceMatcher) Ratio() float64 { + matches := 0 + for _, m := range m.GetMatchingBlocks() { + matches += m.Size + } + return calculateRatio(matches, len(m.a)+len(m.b)) +} + +// Return an upper bound on ratio() relatively quickly. +// +// This isn't defined beyond that it is an upper bound on .Ratio(), and +// is faster to compute. +func (m *SequenceMatcher) QuickRatio() float64 { + // viewing a and b as multisets, set matches to the cardinality + // of their intersection; this counts the number of matches + // without regard to order, so is clearly an upper bound + if m.fullBCount == nil { + m.fullBCount = map[string]int{} + for _, s := range m.b { + m.fullBCount[s] = m.fullBCount[s] + 1 + } + } + + // avail[x] is the number of times x appears in 'b' less the + // number of times we've seen it in 'a' so far ... kinda + avail := map[string]int{} + matches := 0 + for _, s := range m.a { + n, ok := avail[s] + if !ok { + n = m.fullBCount[s] + } + avail[s] = n - 1 + if n > 0 { + matches += 1 + } + } + return calculateRatio(matches, len(m.a)+len(m.b)) +} + +// Return an upper bound on ratio() very quickly. +// +// This isn't defined beyond that it is an upper bound on .Ratio(), and +// is faster to compute than either .Ratio() or .QuickRatio(). +func (m *SequenceMatcher) RealQuickRatio() float64 { + la, lb := len(m.a), len(m.b) + return calculateRatio(min(la, lb), la+lb) +} + +// Convert range to the "ed" format +func formatRangeUnified(start, stop int) string { + // Per the diff spec at http://www.unix.org/single_unix_specification/ + beginning := start + 1 // lines start numbering with one + length := stop - start + if length == 1 { + return fmt.Sprintf("%d", beginning) + } + if length == 0 { + beginning -= 1 // empty ranges begin at line just before the range + } + return fmt.Sprintf("%d,%d", beginning, length) +} + +// Unified diff parameters +type UnifiedDiff struct { + A []string // First sequence lines + FromFile string // First file name + FromDate string // First file time + B []string // Second sequence lines + ToFile string // Second file name + ToDate string // Second file time + Eol string // Headers end of line, defaults to LF + Context int // Number of context lines +} + +// Compare two sequences of lines; generate the delta as a unified diff. +// +// Unified diffs are a compact way of showing line changes and a few +// lines of context. The number of context lines is set by 'n' which +// defaults to three. +// +// By default, the diff control lines (those with ---, +++, or @@) are +// created with a trailing newline. This is helpful so that inputs +// created from file.readlines() result in diffs that are suitable for +// file.writelines() since both the inputs and outputs have trailing +// newlines. +// +// For inputs that do not have trailing newlines, set the lineterm +// argument to "" so that the output will be uniformly newline free. +// +// The unidiff format normally has a header for filenames and modification +// times. Any or all of these may be specified using strings for +// 'fromfile', 'tofile', 'fromfiledate', and 'tofiledate'. +// The modification times are normally expressed in the ISO 8601 format. +func WriteUnifiedDiff(writer io.Writer, diff UnifiedDiff) error { + buf := bufio.NewWriter(writer) + defer buf.Flush() + wf := func(format string, args ...interface{}) error { + _, err := buf.WriteString(fmt.Sprintf(format, args...)) + return err + } + ws := func(s string) error { + _, err := buf.WriteString(s) + return err + } + + if len(diff.Eol) == 0 { + diff.Eol = "\n" + } + + started := false + m := NewMatcher(diff.A, diff.B) + for _, g := range m.GetGroupedOpCodes(diff.Context) { + if !started { + started = true + fromDate := "" + if len(diff.FromDate) > 0 { + fromDate = "\t" + diff.FromDate + } + toDate := "" + if len(diff.ToDate) > 0 { + toDate = "\t" + diff.ToDate + } + if diff.FromFile != "" || diff.ToFile != "" { + err := wf("--- %s%s%s", diff.FromFile, fromDate, diff.Eol) + if err != nil { + return err + } + err = wf("+++ %s%s%s", diff.ToFile, toDate, diff.Eol) + if err != nil { + return err + } + } + } + first, last := g[0], g[len(g)-1] + range1 := formatRangeUnified(first.I1, last.I2) + range2 := formatRangeUnified(first.J1, last.J2) + if err := wf("@@ -%s +%s @@%s", range1, range2, diff.Eol); err != nil { + return err + } + for _, c := range g { + i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2 + if c.Tag == 'e' { + for _, line := range diff.A[i1:i2] { + if err := ws(" " + line); err != nil { + return err + } + } + continue + } + if c.Tag == 'r' || c.Tag == 'd' { + for _, line := range diff.A[i1:i2] { + if err := ws("-" + line); err != nil { + return err + } + } + } + if c.Tag == 'r' || c.Tag == 'i' { + for _, line := range diff.B[j1:j2] { + if err := ws("+" + line); err != nil { + return err + } + } + } + } + } + return nil +} + +// Like WriteUnifiedDiff but returns the diff a string. +func GetUnifiedDiffString(diff UnifiedDiff) (string, error) { + w := &bytes.Buffer{} + err := WriteUnifiedDiff(w, diff) + return string(w.Bytes()), err +} + +// Convert range to the "ed" format. +func formatRangeContext(start, stop int) string { + // Per the diff spec at http://www.unix.org/single_unix_specification/ + beginning := start + 1 // lines start numbering with one + length := stop - start + if length == 0 { + beginning -= 1 // empty ranges begin at line just before the range + } + if length <= 1 { + return fmt.Sprintf("%d", beginning) + } + return fmt.Sprintf("%d,%d", beginning, beginning+length-1) +} + +type ContextDiff UnifiedDiff + +// Compare two sequences of lines; generate the delta as a context diff. +// +// Context diffs are a compact way of showing line changes and a few +// lines of context. The number of context lines is set by diff.Context +// which defaults to three. +// +// By default, the diff control lines (those with *** or ---) are +// created with a trailing newline. +// +// For inputs that do not have trailing newlines, set the diff.Eol +// argument to "" so that the output will be uniformly newline free. +// +// The context diff format normally has a header for filenames and +// modification times. Any or all of these may be specified using +// strings for diff.FromFile, diff.ToFile, diff.FromDate, diff.ToDate. +// The modification times are normally expressed in the ISO 8601 format. +// If not specified, the strings default to blanks. +func WriteContextDiff(writer io.Writer, diff ContextDiff) error { + buf := bufio.NewWriter(writer) + defer buf.Flush() + var diffErr error + wf := func(format string, args ...interface{}) { + _, err := buf.WriteString(fmt.Sprintf(format, args...)) + if diffErr == nil && err != nil { + diffErr = err + } + } + ws := func(s string) { + _, err := buf.WriteString(s) + if diffErr == nil && err != nil { + diffErr = err + } + } + + if len(diff.Eol) == 0 { + diff.Eol = "\n" + } + + prefix := map[byte]string{ + 'i': "+ ", + 'd': "- ", + 'r': "! ", + 'e': " ", + } + + started := false + m := NewMatcher(diff.A, diff.B) + for _, g := range m.GetGroupedOpCodes(diff.Context) { + if !started { + started = true + fromDate := "" + if len(diff.FromDate) > 0 { + fromDate = "\t" + diff.FromDate + } + toDate := "" + if len(diff.ToDate) > 0 { + toDate = "\t" + diff.ToDate + } + if diff.FromFile != "" || diff.ToFile != "" { + wf("*** %s%s%s", diff.FromFile, fromDate, diff.Eol) + wf("--- %s%s%s", diff.ToFile, toDate, diff.Eol) + } + } + + first, last := g[0], g[len(g)-1] + ws("***************" + diff.Eol) + + range1 := formatRangeContext(first.I1, last.I2) + wf("*** %s ****%s", range1, diff.Eol) + for _, c := range g { + if c.Tag == 'r' || c.Tag == 'd' { + for _, cc := range g { + if cc.Tag == 'i' { + continue + } + for _, line := range diff.A[cc.I1:cc.I2] { + ws(prefix[cc.Tag] + line) + } + } + break + } + } + + range2 := formatRangeContext(first.J1, last.J2) + wf("--- %s ----%s", range2, diff.Eol) + for _, c := range g { + if c.Tag == 'r' || c.Tag == 'i' { + for _, cc := range g { + if cc.Tag == 'd' { + continue + } + for _, line := range diff.B[cc.J1:cc.J2] { + ws(prefix[cc.Tag] + line) + } + } + break + } + } + } + return diffErr +} + +// Like WriteContextDiff but returns the diff a string. +func GetContextDiffString(diff ContextDiff) (string, error) { + w := &bytes.Buffer{} + err := WriteContextDiff(w, diff) + return string(w.Bytes()), err +} + +// Split a string on "\n" while preserving them. The output can be used +// as input for UnifiedDiff and ContextDiff structures. +func SplitLines(s string) []string { + lines := strings.SplitAfter(s, "\n") + lines[len(lines)-1] += "\n" + return lines +} diff --git a/api/vendor/github.com/pmezard/go-difflib/difflib/difflib_test.go b/api/vendor/github.com/pmezard/go-difflib/difflib/difflib_test.go new file mode 100644 index 0000000..d725119 --- /dev/null +++ b/api/vendor/github.com/pmezard/go-difflib/difflib/difflib_test.go @@ -0,0 +1,426 @@ +package difflib + +import ( + "bytes" + "fmt" + "math" + "reflect" + "strings" + "testing" +) + +func assertAlmostEqual(t *testing.T, a, b float64, places int) { + if math.Abs(a-b) > math.Pow10(-places) { + t.Errorf("%.7f != %.7f", a, b) + } +} + +func assertEqual(t *testing.T, a, b interface{}) { + if !reflect.DeepEqual(a, b) { + t.Errorf("%v != %v", a, b) + } +} + +func splitChars(s string) []string { + chars := make([]string, 0, len(s)) + // Assume ASCII inputs + for i := 0; i != len(s); i++ { + chars = append(chars, string(s[i])) + } + return chars +} + +func TestSequenceMatcherRatio(t *testing.T) { + s := NewMatcher(splitChars("abcd"), splitChars("bcde")) + assertEqual(t, s.Ratio(), 0.75) + assertEqual(t, s.QuickRatio(), 0.75) + assertEqual(t, s.RealQuickRatio(), 1.0) +} + +func TestGetOptCodes(t *testing.T) { + a := "qabxcd" + b := "abycdf" + s := NewMatcher(splitChars(a), splitChars(b)) + w := &bytes.Buffer{} + for _, op := range s.GetOpCodes() { + fmt.Fprintf(w, "%s a[%d:%d], (%s) b[%d:%d] (%s)\n", string(op.Tag), + op.I1, op.I2, a[op.I1:op.I2], op.J1, op.J2, b[op.J1:op.J2]) + } + result := string(w.Bytes()) + expected := `d a[0:1], (q) b[0:0] () +e a[1:3], (ab) b[0:2] (ab) +r a[3:4], (x) b[2:3] (y) +e a[4:6], (cd) b[3:5] (cd) +i a[6:6], () b[5:6] (f) +` + if expected != result { + t.Errorf("unexpected op codes: \n%s", result) + } +} + +func TestGroupedOpCodes(t *testing.T) { + a := []string{} + for i := 0; i != 39; i++ { + a = append(a, fmt.Sprintf("%02d", i)) + } + b := []string{} + b = append(b, a[:8]...) + b = append(b, " i") + b = append(b, a[8:19]...) + b = append(b, " x") + b = append(b, a[20:22]...) + b = append(b, a[27:34]...) + b = append(b, " y") + b = append(b, a[35:]...) + s := NewMatcher(a, b) + w := &bytes.Buffer{} + for _, g := range s.GetGroupedOpCodes(-1) { + fmt.Fprintf(w, "group\n") + for _, op := range g { + fmt.Fprintf(w, " %s, %d, %d, %d, %d\n", string(op.Tag), + op.I1, op.I2, op.J1, op.J2) + } + } + result := string(w.Bytes()) + expected := `group + e, 5, 8, 5, 8 + i, 8, 8, 8, 9 + e, 8, 11, 9, 12 +group + e, 16, 19, 17, 20 + r, 19, 20, 20, 21 + e, 20, 22, 21, 23 + d, 22, 27, 23, 23 + e, 27, 30, 23, 26 +group + e, 31, 34, 27, 30 + r, 34, 35, 30, 31 + e, 35, 38, 31, 34 +` + if expected != result { + t.Errorf("unexpected op codes: \n%s", result) + } +} + +func ExampleGetUnifiedDiffCode() { + a := `one +two +three +four +fmt.Printf("%s,%T",a,b)` + b := `zero +one +three +four` + diff := UnifiedDiff{ + A: SplitLines(a), + B: SplitLines(b), + FromFile: "Original", + FromDate: "2005-01-26 23:30:50", + ToFile: "Current", + ToDate: "2010-04-02 10:20:52", + Context: 3, + } + result, _ := GetUnifiedDiffString(diff) + fmt.Println(strings.Replace(result, "\t", " ", -1)) + // Output: + // --- Original 2005-01-26 23:30:50 + // +++ Current 2010-04-02 10:20:52 + // @@ -1,5 +1,4 @@ + // +zero + // one + // -two + // three + // four + // -fmt.Printf("%s,%T",a,b) +} + +func ExampleGetContextDiffCode() { + a := `one +two +three +four +fmt.Printf("%s,%T",a,b)` + b := `zero +one +tree +four` + diff := ContextDiff{ + A: SplitLines(a), + B: SplitLines(b), + FromFile: "Original", + ToFile: "Current", + Context: 3, + Eol: "\n", + } + result, _ := GetContextDiffString(diff) + fmt.Print(strings.Replace(result, "\t", " ", -1)) + // Output: + // *** Original + // --- Current + // *************** + // *** 1,5 **** + // one + // ! two + // ! three + // four + // - fmt.Printf("%s,%T",a,b) + // --- 1,4 ---- + // + zero + // one + // ! tree + // four +} + +func ExampleGetContextDiffString() { + a := `one +two +three +four` + b := `zero +one +tree +four` + diff := ContextDiff{ + A: SplitLines(a), + B: SplitLines(b), + FromFile: "Original", + ToFile: "Current", + Context: 3, + Eol: "\n", + } + result, _ := GetContextDiffString(diff) + fmt.Printf(strings.Replace(result, "\t", " ", -1)) + // Output: + // *** Original + // --- Current + // *************** + // *** 1,4 **** + // one + // ! two + // ! three + // four + // --- 1,4 ---- + // + zero + // one + // ! tree + // four +} + +func rep(s string, count int) string { + return strings.Repeat(s, count) +} + +func TestWithAsciiOneInsert(t *testing.T) { + sm := NewMatcher(splitChars(rep("b", 100)), + splitChars("a"+rep("b", 100))) + assertAlmostEqual(t, sm.Ratio(), 0.995, 3) + assertEqual(t, sm.GetOpCodes(), + []OpCode{{'i', 0, 0, 0, 1}, {'e', 0, 100, 1, 101}}) + assertEqual(t, len(sm.bPopular), 0) + + sm = NewMatcher(splitChars(rep("b", 100)), + splitChars(rep("b", 50)+"a"+rep("b", 50))) + assertAlmostEqual(t, sm.Ratio(), 0.995, 3) + assertEqual(t, sm.GetOpCodes(), + []OpCode{{'e', 0, 50, 0, 50}, {'i', 50, 50, 50, 51}, {'e', 50, 100, 51, 101}}) + assertEqual(t, len(sm.bPopular), 0) +} + +func TestWithAsciiOnDelete(t *testing.T) { + sm := NewMatcher(splitChars(rep("a", 40)+"c"+rep("b", 40)), + splitChars(rep("a", 40)+rep("b", 40))) + assertAlmostEqual(t, sm.Ratio(), 0.994, 3) + assertEqual(t, sm.GetOpCodes(), + []OpCode{{'e', 0, 40, 0, 40}, {'d', 40, 41, 40, 40}, {'e', 41, 81, 40, 80}}) +} + +func TestWithAsciiBJunk(t *testing.T) { + isJunk := func(s string) bool { + return s == " " + } + sm := NewMatcherWithJunk(splitChars(rep("a", 40)+rep("b", 40)), + splitChars(rep("a", 44)+rep("b", 40)), true, isJunk) + assertEqual(t, sm.bJunk, map[string]struct{}{}) + + sm = NewMatcherWithJunk(splitChars(rep("a", 40)+rep("b", 40)), + splitChars(rep("a", 44)+rep("b", 40)+rep(" ", 20)), false, isJunk) + assertEqual(t, sm.bJunk, map[string]struct{}{" ": struct{}{}}) + + isJunk = func(s string) bool { + return s == " " || s == "b" + } + sm = NewMatcherWithJunk(splitChars(rep("a", 40)+rep("b", 40)), + splitChars(rep("a", 44)+rep("b", 40)+rep(" ", 20)), false, isJunk) + assertEqual(t, sm.bJunk, map[string]struct{}{" ": struct{}{}, "b": struct{}{}}) +} + +func TestSFBugsRatioForNullSeqn(t *testing.T) { + sm := NewMatcher(nil, nil) + assertEqual(t, sm.Ratio(), 1.0) + assertEqual(t, sm.QuickRatio(), 1.0) + assertEqual(t, sm.RealQuickRatio(), 1.0) +} + +func TestSFBugsComparingEmptyLists(t *testing.T) { + groups := NewMatcher(nil, nil).GetGroupedOpCodes(-1) + assertEqual(t, len(groups), 0) + diff := UnifiedDiff{ + FromFile: "Original", + ToFile: "Current", + Context: 3, + } + result, err := GetUnifiedDiffString(diff) + assertEqual(t, err, nil) + assertEqual(t, result, "") +} + +func TestOutputFormatRangeFormatUnified(t *testing.T) { + // Per the diff spec at http://www.unix.org/single_unix_specification/ + // + // Each field shall be of the form: + // %1d", if the range contains exactly one line, + // and: + // "%1d,%1d", , otherwise. + // If a range is empty, its beginning line number shall be the number of + // the line just before the range, or 0 if the empty range starts the file. + fm := formatRangeUnified + assertEqual(t, fm(3, 3), "3,0") + assertEqual(t, fm(3, 4), "4") + assertEqual(t, fm(3, 5), "4,2") + assertEqual(t, fm(3, 6), "4,3") + assertEqual(t, fm(0, 0), "0,0") +} + +func TestOutputFormatRangeFormatContext(t *testing.T) { + // Per the diff spec at http://www.unix.org/single_unix_specification/ + // + // The range of lines in file1 shall be written in the following format + // if the range contains two or more lines: + // "*** %d,%d ****\n", , + // and the following format otherwise: + // "*** %d ****\n", + // The ending line number of an empty range shall be the number of the preceding line, + // or 0 if the range is at the start of the file. + // + // Next, the range of lines in file2 shall be written in the following format + // if the range contains two or more lines: + // "--- %d,%d ----\n", , + // and the following format otherwise: + // "--- %d ----\n", + fm := formatRangeContext + assertEqual(t, fm(3, 3), "3") + assertEqual(t, fm(3, 4), "4") + assertEqual(t, fm(3, 5), "4,5") + assertEqual(t, fm(3, 6), "4,6") + assertEqual(t, fm(0, 0), "0") +} + +func TestOutputFormatTabDelimiter(t *testing.T) { + diff := UnifiedDiff{ + A: splitChars("one"), + B: splitChars("two"), + FromFile: "Original", + FromDate: "2005-01-26 23:30:50", + ToFile: "Current", + ToDate: "2010-04-12 10:20:52", + Eol: "\n", + } + ud, err := GetUnifiedDiffString(diff) + assertEqual(t, err, nil) + assertEqual(t, SplitLines(ud)[:2], []string{ + "--- Original\t2005-01-26 23:30:50\n", + "+++ Current\t2010-04-12 10:20:52\n", + }) + cd, err := GetContextDiffString(ContextDiff(diff)) + assertEqual(t, err, nil) + assertEqual(t, SplitLines(cd)[:2], []string{ + "*** Original\t2005-01-26 23:30:50\n", + "--- Current\t2010-04-12 10:20:52\n", + }) +} + +func TestOutputFormatNoTrailingTabOnEmptyFiledate(t *testing.T) { + diff := UnifiedDiff{ + A: splitChars("one"), + B: splitChars("two"), + FromFile: "Original", + ToFile: "Current", + Eol: "\n", + } + ud, err := GetUnifiedDiffString(diff) + assertEqual(t, err, nil) + assertEqual(t, SplitLines(ud)[:2], []string{"--- Original\n", "+++ Current\n"}) + + cd, err := GetContextDiffString(ContextDiff(diff)) + assertEqual(t, err, nil) + assertEqual(t, SplitLines(cd)[:2], []string{"*** Original\n", "--- Current\n"}) +} + +func TestOmitFilenames(t *testing.T) { + diff := UnifiedDiff{ + A: SplitLines("o\nn\ne\n"), + B: SplitLines("t\nw\no\n"), + Eol: "\n", + } + ud, err := GetUnifiedDiffString(diff) + assertEqual(t, err, nil) + assertEqual(t, SplitLines(ud), []string{ + "@@ -0,0 +1,2 @@\n", + "+t\n", + "+w\n", + "@@ -2,2 +3,0 @@\n", + "-n\n", + "-e\n", + "\n", + }) + + cd, err := GetContextDiffString(ContextDiff(diff)) + assertEqual(t, err, nil) + assertEqual(t, SplitLines(cd), []string{ + "***************\n", + "*** 0 ****\n", + "--- 1,2 ----\n", + "+ t\n", + "+ w\n", + "***************\n", + "*** 2,3 ****\n", + "- n\n", + "- e\n", + "--- 3 ----\n", + "\n", + }) +} + +func TestSplitLines(t *testing.T) { + allTests := []struct { + input string + want []string + }{ + {"foo", []string{"foo\n"}}, + {"foo\nbar", []string{"foo\n", "bar\n"}}, + {"foo\nbar\n", []string{"foo\n", "bar\n", "\n"}}, + } + for _, test := range allTests { + assertEqual(t, SplitLines(test.input), test.want) + } +} + +func benchmarkSplitLines(b *testing.B, count int) { + str := strings.Repeat("foo\n", count) + + b.ResetTimer() + + n := 0 + for i := 0; i < b.N; i++ { + n += len(SplitLines(str)) + } +} + +func BenchmarkSplitLines100(b *testing.B) { + benchmarkSplitLines(b, 100) +} + +func BenchmarkSplitLines10000(b *testing.B) { + benchmarkSplitLines(b, 10000) +} diff --git a/api/vendor/github.com/prometheus/client_golang/.gitignore b/api/vendor/github.com/prometheus/client_golang/.gitignore new file mode 100644 index 0000000..f6fc2e8 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/.gitignore @@ -0,0 +1,26 @@ +# 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 + +*~ +*# +.build diff --git a/api/vendor/github.com/prometheus/client_golang/.travis.yml b/api/vendor/github.com/prometheus/client_golang/.travis.yml new file mode 100644 index 0000000..d83f31a --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/.travis.yml @@ -0,0 +1,9 @@ +sudo: false +language: go + +go: + - 1.5.4 + - 1.6.2 + +script: + - go test -short ./... diff --git a/api/vendor/github.com/prometheus/client_golang/AUTHORS.md b/api/vendor/github.com/prometheus/client_golang/AUTHORS.md new file mode 100644 index 0000000..c5275d5 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/AUTHORS.md @@ -0,0 +1,18 @@ +The Prometheus project was started by Matt T. Proud (emeritus) and +Julius Volz in 2012. + +Maintainers of this repository: + +* Björn Rabenstein + +The following individuals have contributed code to this repository +(listed in alphabetical order): + +* Bernerd Schaefer +* Björn Rabenstein +* Daniel Bornkessel +* Jeff Younker +* Julius Volz +* Matt T. Proud +* Tobias Schmidt + diff --git a/api/vendor/github.com/prometheus/client_golang/CHANGELOG.md b/api/vendor/github.com/prometheus/client_golang/CHANGELOG.md new file mode 100644 index 0000000..330788a --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/CHANGELOG.md @@ -0,0 +1,109 @@ +## 0.8.0 / 2016-08-17 +* [CHANGE] Registry is doing more consistency checks. This might break + existing setups that used to export inconsistent metrics. +* [CHANGE] Pushing to Pushgateway moved to package `push` and changed to allow + arbitrary grouping. +* [CHANGE] Removed `SelfCollector`. +* [CHANGE] Removed `PanicOnCollectError` and `EnableCollectChecks` methods. +* [CHANGE] Moved packages to the prometheus/common repo: `text`, `model`, + `extraction`. +* [CHANGE] Deprecated a number of functions. +* [FEATURE] Allow custom registries. Added `Registerer` and `Gatherer` + interfaces. +* [FEATURE] Separated HTTP exposition, allowing custom HTTP handlers (package + `promhttp`) and enabling the creation of other exposition mechanisms. +* [FEATURE] `MustRegister` is variadic now, allowing registration of many + collectors in one call. +* [FEATURE] Added HTTP API v1 package. +* [ENHANCEMENT] Numerous documentation improvements. +* [ENHANCEMENT] Improved metric sorting. +* [ENHANCEMENT] Inlined fnv64a hashing for improved performance. +* [ENHANCEMENT] Several test improvements. +* [BUGFIX] Handle collisions in MetricVec. + +## 0.7.0 / 2015-07-27 +* [CHANGE] Rename ExporterLabelPrefix to ExportedLabelPrefix. +* [BUGFIX] Closed gaps in metric consistency check. +* [BUGFIX] Validate LabelName/LabelSet on JSON unmarshaling. +* [ENHANCEMENT] Document the possibility to create "empty" metrics in + a metric vector. +* [ENHANCEMENT] Fix and clarify various doc comments and the README.md. +* [ENHANCEMENT] (Kind of) solve "The Proxy Problem" of http.InstrumentHandler. +* [ENHANCEMENT] Change responseWriterDelegator.written to int64. + +## 0.6.0 / 2015-06-01 +* [CHANGE] Rename process_goroutines to go_goroutines. +* [ENHANCEMENT] Validate label names during YAML decoding. +* [ENHANCEMENT] Add LabelName regular expression. +* [BUGFIX] Ensure alignment of struct members for 32-bit systems. + +## 0.5.0 / 2015-05-06 +* [BUGFIX] Removed a weakness in the fingerprinting aka signature code. + This makes fingerprinting slower and more allocation-heavy, but the + weakness was too severe to be tolerated. +* [CHANGE] As a result of the above, Metric.Fingerprint is now returning + a different fingerprint. To keep the same fingerprint, the new method + Metric.FastFingerprint was introduced, which will be used by the + Prometheus server for storage purposes (implying that a collision + detection has to be added, too). +* [ENHANCEMENT] The Metric.Equal and Metric.Before do not depend on + fingerprinting anymore, removing the possibility of an undetected + fingerprint collision. +* [FEATURE] The Go collector in the exposition library includes garbage + collection stats. +* [FEATURE] The exposition library allows to create constant "throw-away" + summaries and histograms. +* [CHANGE] A number of new reserved labels and prefixes. + +## 0.4.0 / 2015-04-08 +* [CHANGE] Return NaN when Summaries have no observations yet. +* [BUGFIX] Properly handle Summary decay upon Write(). +* [BUGFIX] Fix the documentation link to the consumption library. +* [FEATURE] Allow the metric family injection hook to merge with existing + metric families. +* [ENHANCEMENT] Removed cgo dependency and conditional compilation of procfs. +* [MAINTENANCE] Adjusted to changes in matttproud/golang_protobuf_extensions. + +## 0.3.2 / 2015-03-11 +* [BUGFIX] Fixed the receiver type of COWMetric.Set(). This method is + only used by the Prometheus server internally. +* [CLEANUP] Added licenses of vendored code left out by godep. + +## 0.3.1 / 2015-03-04 +* [ENHANCEMENT] Switched fingerprinting functions from own free list to + sync.Pool. +* [CHANGE] Makefile uses Go 1.4.2 now (only relevant for examples and tests). + +## 0.3.0 / 2015-03-03 +* [CHANGE] Changed the fingerprinting for metrics. THIS WILL INVALIDATE ALL + PERSISTED FINGERPRINTS. IF YOU COMPILE THE PROMETHEUS SERVER WITH THIS + VERSION, YOU HAVE TO WIPE THE PREVIOUSLY CREATED STORAGE. +* [CHANGE] LabelValuesToSignature removed. (Nobody had used it, and it was + arguably broken.) +* [CHANGE] Vendored dependencies. Those are only used by the Makefile. If + client_golang is used as a library, the vendoring will stay out of your way. +* [BUGFIX] Remove a weakness in the fingerprinting for metrics. (This made + the fingerprinting change above necessary.) +* [FEATURE] Added new fingerprinting functions SignatureForLabels and + SignatureWithoutLabels to be used by the Prometheus server. These functions + require fewer allocations than the ones currently used by the server. + +## 0.2.0 / 2015-02-23 +* [FEATURE] Introduce new Histagram metric type. +* [CHANGE] Ignore process collector errors for now (better error handling + pending). +* [CHANGE] Use clear error interface for process pidFn. +* [BUGFIX] Fix Go download links for several archs and OSes. +* [ENHANCEMENT] Massively improve Gauge and Counter performance. +* [ENHANCEMENT] Catch illegal label names for summaries in histograms. +* [ENHANCEMENT] Reduce allocations during fingerprinting. +* [ENHANCEMENT] Remove cgo dependency. procfs package will only be included if + both cgo is available and the build is for an OS with procfs. +* [CLEANUP] Clean up code style issues. +* [CLEANUP] Mark slow test as such and exclude them from travis. +* [CLEANUP] Update protobuf library package name. +* [CLEANUP] Updated vendoring of beorn7/perks. + +## 0.1.0 / 2015-02-02 +* [CLEANUP] Introduced semantic versioning and changelog. From now on, + changes will be reported in this file. diff --git a/api/vendor/github.com/prometheus/client_golang/CONTRIBUTING.md b/api/vendor/github.com/prometheus/client_golang/CONTRIBUTING.md new file mode 100644 index 0000000..5705f0f --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/CONTRIBUTING.md @@ -0,0 +1,18 @@ +# Contributing + +Prometheus uses GitHub to manage reviews of pull requests. + +* If you have a trivial fix or improvement, go ahead and create a pull + request, addressing (with `@...`) one or more of the maintainers + (see [AUTHORS.md](AUTHORS.md)) in the description of the pull request. + +* If you plan to do something more involved, first discuss your ideas + on our [mailing list](https://groups.google.com/forum/?fromgroups#!forum/prometheus-developers). + This will avoid unnecessary work and surely give you and us a good deal + of inspiration. + +* Relevant coding style guidelines are the [Go Code Review + Comments](https://code.google.com/p/go-wiki/wiki/CodeReviewComments) + and the _Formatting and style_ section of Peter Bourgon's [Go: Best + Practices for Production + Environments](http://peter.bourgon.org/go-in-production/#formatting-and-style). diff --git a/api/vendor/github.com/prometheus/client_golang/LICENSE b/api/vendor/github.com/prometheus/client_golang/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/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 [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/api/vendor/github.com/prometheus/client_golang/NOTICE b/api/vendor/github.com/prometheus/client_golang/NOTICE new file mode 100644 index 0000000..dd878a3 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/NOTICE @@ -0,0 +1,23 @@ +Prometheus instrumentation library for Go applications +Copyright 2012-2015 The Prometheus Authors + +This product includes software developed at +SoundCloud Ltd. (http://soundcloud.com/). + + +The following components are included in this product: + +perks - a fork of https://github.com/bmizerany/perks +https://github.com/beorn7/perks +Copyright 2013-2015 Blake Mizerany, Björn Rabenstein +See https://github.com/beorn7/perks/blob/master/README.md for license details. + +Go support for Protocol Buffers - Google's data interchange format +http://github.com/golang/protobuf/ +Copyright 2010 The Go Authors +See source code for license details. + +Support for streaming Protocol Buffer messages for the Go language (golang). +https://github.com/matttproud/golang_protobuf_extensions +Copyright 2013 Matt T. Proud +Licensed under the Apache License, Version 2.0 diff --git a/api/vendor/github.com/prometheus/client_golang/README.md b/api/vendor/github.com/prometheus/client_golang/README.md new file mode 100644 index 0000000..557eacf --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/README.md @@ -0,0 +1,45 @@ +# Prometheus Go client library + +[![Build Status](https://travis-ci.org/prometheus/client_golang.svg?branch=master)](https://travis-ci.org/prometheus/client_golang) + +This is the [Go](http://golang.org) client library for +[Prometheus](http://prometheus.io). It has two separate parts, one for +instrumenting application code, and one for creating clients that talk to the +Prometheus HTTP API. + +## Instrumenting applications + +[![code-coverage](http://gocover.io/_badge/github.com/prometheus/client_golang/prometheus)](http://gocover.io/github.com/prometheus/client_golang/prometheus) [![go-doc](https://godoc.org/github.com/prometheus/client_golang/prometheus?status.svg)](https://godoc.org/github.com/prometheus/client_golang/prometheus) + +The +[`prometheus` directory](https://github.com/prometheus/client_golang/tree/master/prometheus) +contains the instrumentation library. See the +[best practices section](http://prometheus.io/docs/practices/naming/) of the +Prometheus documentation to learn more about instrumenting applications. + +The +[`examples` directory](https://github.com/prometheus/client_golang/tree/master/examples) +contains simple examples of instrumented code. + +## Client for the Prometheus HTTP API + +[![code-coverage](http://gocover.io/_badge/github.com/prometheus/client_golang/api/prometheus)](http://gocover.io/github.com/prometheus/client_golang/api/prometheus) [![go-doc](https://godoc.org/github.com/prometheus/client_golang/api/prometheus?status.svg)](https://godoc.org/github.com/prometheus/client_golang/api/prometheus) + +The +[`api/prometheus` directory](https://github.com/prometheus/client_golang/tree/master/api/prometheus) +contains the client for the +[Prometheus HTTP API](http://prometheus.io/docs/querying/api/). It allows you +to write Go applications that query time series data from a Prometheus server. + +## Where is `model`, `extraction`, and `text`? + +The `model` packages has been moved to +[`prometheus/common/model`](https://github.com/prometheus/common/tree/master/model). + +The `extraction` and `text` packages are now contained in +[`prometheus/common/expfmt`](https://github.com/prometheus/common/tree/master/expfmt). + +## Contributing and community + +See the [contributing guidelines](CONTRIBUTING.md) and the +[Community section](http://prometheus.io/community/) of the homepage. diff --git a/api/vendor/github.com/prometheus/client_golang/VERSION b/api/vendor/github.com/prometheus/client_golang/VERSION new file mode 100644 index 0000000..a3df0a6 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/VERSION @@ -0,0 +1 @@ +0.8.0 diff --git a/api/vendor/github.com/prometheus/client_golang/api/prometheus/api.go b/api/vendor/github.com/prometheus/client_golang/api/prometheus/api.go new file mode 100644 index 0000000..3028d74 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/api/prometheus/api.go @@ -0,0 +1,345 @@ +// Copyright 2015 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 prometheus provides bindings to the Prometheus HTTP API: +// http://prometheus.io/docs/querying/api/ +package prometheus + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "net" + "net/http" + "net/url" + "path" + "strconv" + "strings" + "time" + + "github.com/prometheus/common/model" + "golang.org/x/net/context" + "golang.org/x/net/context/ctxhttp" +) + +const ( + statusAPIError = 422 + apiPrefix = "/api/v1" + + epQuery = "/query" + epQueryRange = "/query_range" + epLabelValues = "/label/:name/values" + epSeries = "/series" +) + +type ErrorType string + +const ( + // The different API error types. + ErrBadData ErrorType = "bad_data" + ErrTimeout = "timeout" + ErrCanceled = "canceled" + ErrExec = "execution" + ErrBadResponse = "bad_response" +) + +// Error is an error returned by the API. +type Error struct { + Type ErrorType + Msg string +} + +func (e *Error) Error() string { + return fmt.Sprintf("%s: %s", e.Type, e.Msg) +} + +// CancelableTransport is like net.Transport but provides +// per-request cancelation functionality. +type CancelableTransport interface { + http.RoundTripper + CancelRequest(req *http.Request) +} + +var DefaultTransport CancelableTransport = &http.Transport{ + Proxy: http.ProxyFromEnvironment, + Dial: (&net.Dialer{ + Timeout: 30 * time.Second, + KeepAlive: 30 * time.Second, + }).Dial, + TLSHandshakeTimeout: 10 * time.Second, +} + +// Config defines configuration parameters for a new client. +type Config struct { + // The address of the Prometheus to connect to. + Address string + + // Transport is used by the Client to drive HTTP requests. If not + // provided, DefaultTransport will be used. + Transport CancelableTransport +} + +func (cfg *Config) transport() CancelableTransport { + if cfg.Transport == nil { + return DefaultTransport + } + return cfg.Transport +} + +type Client interface { + url(ep string, args map[string]string) *url.URL + do(context.Context, *http.Request) (*http.Response, []byte, error) +} + +// New returns a new Client. +// +// It is safe to use the returned Client from multiple goroutines. +func New(cfg Config) (Client, error) { + u, err := url.Parse(cfg.Address) + if err != nil { + return nil, err + } + u.Path = strings.TrimRight(u.Path, "/") + apiPrefix + + return &httpClient{ + endpoint: u, + transport: cfg.transport(), + }, nil +} + +type httpClient struct { + endpoint *url.URL + transport CancelableTransport +} + +func (c *httpClient) url(ep string, args map[string]string) *url.URL { + p := path.Join(c.endpoint.Path, ep) + + for arg, val := range args { + arg = ":" + arg + p = strings.Replace(p, arg, val, -1) + } + + u := *c.endpoint + u.Path = p + + return &u +} + +func (c *httpClient) do(ctx context.Context, req *http.Request) (*http.Response, []byte, error) { + resp, err := ctxhttp.Do(ctx, &http.Client{Transport: c.transport}, req) + + defer func() { + if resp != nil { + resp.Body.Close() + } + }() + + if err != nil { + return nil, nil, err + } + + var body []byte + done := make(chan struct{}) + go func() { + body, err = ioutil.ReadAll(resp.Body) + close(done) + }() + + select { + case <-ctx.Done(): + err = resp.Body.Close() + <-done + if err == nil { + err = ctx.Err() + } + case <-done: + } + + return resp, body, err +} + +// apiClient wraps a regular client and processes successful API responses. +// Successful also includes responses that errored at the API level. +type apiClient struct { + Client +} + +type apiResponse struct { + Status string `json:"status"` + Data json.RawMessage `json:"data"` + ErrorType ErrorType `json:"errorType"` + Error string `json:"error"` +} + +func (c apiClient) do(ctx context.Context, req *http.Request) (*http.Response, []byte, error) { + resp, body, err := c.Client.do(ctx, req) + if err != nil { + return resp, body, err + } + + code := resp.StatusCode + + if code/100 != 2 && code != statusAPIError { + return resp, body, &Error{ + Type: ErrBadResponse, + Msg: fmt.Sprintf("bad response code %d", resp.StatusCode), + } + } + + var result apiResponse + + if err = json.Unmarshal(body, &result); err != nil { + return resp, body, &Error{ + Type: ErrBadResponse, + Msg: err.Error(), + } + } + + if (code == statusAPIError) != (result.Status == "error") { + err = &Error{ + Type: ErrBadResponse, + Msg: "inconsistent body for response code", + } + } + + if code == statusAPIError && result.Status == "error" { + err = &Error{ + Type: result.ErrorType, + Msg: result.Error, + } + } + + return resp, []byte(result.Data), err +} + +// Range represents a sliced time range. +type Range struct { + // The boundaries of the time range. + Start, End time.Time + // The maximum time between two slices within the boundaries. + Step time.Duration +} + +// queryResult contains result data for a query. +type queryResult struct { + Type model.ValueType `json:"resultType"` + Result interface{} `json:"result"` + + // The decoded value. + v model.Value +} + +func (qr *queryResult) UnmarshalJSON(b []byte) error { + v := struct { + Type model.ValueType `json:"resultType"` + Result json.RawMessage `json:"result"` + }{} + + err := json.Unmarshal(b, &v) + if err != nil { + return err + } + + switch v.Type { + case model.ValScalar: + var sv model.Scalar + err = json.Unmarshal(v.Result, &sv) + qr.v = &sv + + case model.ValVector: + var vv model.Vector + err = json.Unmarshal(v.Result, &vv) + qr.v = vv + + case model.ValMatrix: + var mv model.Matrix + err = json.Unmarshal(v.Result, &mv) + qr.v = mv + + default: + err = fmt.Errorf("unexpected value type %q", v.Type) + } + return err +} + +// QueryAPI provides bindings the Prometheus's query API. +type QueryAPI interface { + // Query performs a query for the given time. + Query(ctx context.Context, query string, ts time.Time) (model.Value, error) + // Query performs a query for the given range. + QueryRange(ctx context.Context, query string, r Range) (model.Value, error) +} + +// NewQueryAPI returns a new QueryAPI for the client. +// +// It is safe to use the returned QueryAPI from multiple goroutines. +func NewQueryAPI(c Client) QueryAPI { + return &httpQueryAPI{client: apiClient{c}} +} + +type httpQueryAPI struct { + client Client +} + +func (h *httpQueryAPI) Query(ctx context.Context, query string, ts time.Time) (model.Value, error) { + u := h.client.url(epQuery, nil) + q := u.Query() + + q.Set("query", query) + q.Set("time", ts.Format(time.RFC3339Nano)) + + u.RawQuery = q.Encode() + + req, _ := http.NewRequest("GET", u.String(), nil) + + _, body, err := h.client.do(ctx, req) + if err != nil { + return nil, err + } + + var qres queryResult + err = json.Unmarshal(body, &qres) + + return model.Value(qres.v), err +} + +func (h *httpQueryAPI) QueryRange(ctx context.Context, query string, r Range) (model.Value, error) { + u := h.client.url(epQueryRange, nil) + q := u.Query() + + var ( + start = r.Start.Format(time.RFC3339Nano) + end = r.End.Format(time.RFC3339Nano) + step = strconv.FormatFloat(r.Step.Seconds(), 'f', 3, 64) + ) + + q.Set("query", query) + q.Set("start", start) + q.Set("end", end) + q.Set("step", step) + + u.RawQuery = q.Encode() + + req, _ := http.NewRequest("GET", u.String(), nil) + + _, body, err := h.client.do(ctx, req) + if err != nil { + return nil, err + } + + var qres queryResult + err = json.Unmarshal(body, &qres) + + return model.Value(qres.v), err +} diff --git a/api/vendor/github.com/prometheus/client_golang/api/prometheus/api_test.go b/api/vendor/github.com/prometheus/client_golang/api/prometheus/api_test.go new file mode 100644 index 0000000..87d3e40 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/api/prometheus/api_test.go @@ -0,0 +1,453 @@ +// Copyright 2015 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 prometheus + +import ( + "encoding/json" + "fmt" + "net/http" + "net/url" + "reflect" + "testing" + "time" + + "github.com/prometheus/common/model" + "golang.org/x/net/context" +) + +func TestConfig(t *testing.T) { + c := Config{} + if c.transport() != DefaultTransport { + t.Fatalf("expected default transport for nil Transport field") + } +} + +func TestClientURL(t *testing.T) { + tests := []struct { + address string + endpoint string + args map[string]string + expected string + }{ + { + address: "http://localhost:9090", + endpoint: "/test", + expected: "http://localhost:9090/test", + }, + { + address: "http://localhost", + endpoint: "/test", + expected: "http://localhost/test", + }, + { + address: "http://localhost:9090", + endpoint: "test", + expected: "http://localhost:9090/test", + }, + { + address: "http://localhost:9090/prefix", + endpoint: "/test", + expected: "http://localhost:9090/prefix/test", + }, + { + address: "https://localhost:9090/", + endpoint: "/test/", + expected: "https://localhost:9090/test", + }, + { + address: "http://localhost:9090", + endpoint: "/test/:param", + args: map[string]string{ + "param": "content", + }, + expected: "http://localhost:9090/test/content", + }, + { + address: "http://localhost:9090", + endpoint: "/test/:param/more/:param", + args: map[string]string{ + "param": "content", + }, + expected: "http://localhost:9090/test/content/more/content", + }, + { + address: "http://localhost:9090", + endpoint: "/test/:param/more/:foo", + args: map[string]string{ + "param": "content", + "foo": "bar", + }, + expected: "http://localhost:9090/test/content/more/bar", + }, + { + address: "http://localhost:9090", + endpoint: "/test/:param", + args: map[string]string{ + "nonexistant": "content", + }, + expected: "http://localhost:9090/test/:param", + }, + } + + for _, test := range tests { + ep, err := url.Parse(test.address) + if err != nil { + t.Fatal(err) + } + + hclient := &httpClient{ + endpoint: ep, + transport: DefaultTransport, + } + + u := hclient.url(test.endpoint, test.args) + if u.String() != test.expected { + t.Errorf("unexpected result: got %s, want %s", u, test.expected) + continue + } + + // The apiClient must return exactly the same result as the httpClient. + aclient := &apiClient{hclient} + + u = aclient.url(test.endpoint, test.args) + if u.String() != test.expected { + t.Errorf("unexpected result: got %s, want %s", u, test.expected) + } + } +} + +type testClient struct { + *testing.T + + ch chan apiClientTest + req *http.Request +} + +type apiClientTest struct { + code int + response interface{} + expected string + err *Error +} + +func (c *testClient) url(ep string, args map[string]string) *url.URL { + return nil +} + +func (c *testClient) do(ctx context.Context, req *http.Request) (*http.Response, []byte, error) { + if ctx == nil { + c.Fatalf("context was not passed down") + } + if req != c.req { + c.Fatalf("request was not passed down") + } + + test := <-c.ch + + var b []byte + var err error + + switch v := test.response.(type) { + case string: + b = []byte(v) + default: + b, err = json.Marshal(v) + if err != nil { + c.Fatal(err) + } + } + + resp := &http.Response{ + StatusCode: test.code, + } + + return resp, b, nil +} + +func TestAPIClientDo(t *testing.T) { + tests := []apiClientTest{ + { + response: &apiResponse{ + Status: "error", + Data: json.RawMessage(`null`), + ErrorType: ErrBadData, + Error: "failed", + }, + err: &Error{ + Type: ErrBadData, + Msg: "failed", + }, + code: statusAPIError, + expected: `null`, + }, + { + response: &apiResponse{ + Status: "error", + Data: json.RawMessage(`"test"`), + ErrorType: ErrTimeout, + Error: "timed out", + }, + err: &Error{ + Type: ErrTimeout, + Msg: "timed out", + }, + code: statusAPIError, + expected: `test`, + }, + { + response: "bad json", + err: &Error{ + Type: ErrBadResponse, + Msg: "bad response code 400", + }, + code: http.StatusBadRequest, + }, + { + response: "bad json", + err: &Error{ + Type: ErrBadResponse, + Msg: "invalid character 'b' looking for beginning of value", + }, + code: statusAPIError, + }, + { + response: &apiResponse{ + Status: "success", + Data: json.RawMessage(`"test"`), + }, + err: &Error{ + Type: ErrBadResponse, + Msg: "inconsistent body for response code", + }, + code: statusAPIError, + }, + { + response: &apiResponse{ + Status: "success", + Data: json.RawMessage(`"test"`), + ErrorType: ErrTimeout, + Error: "timed out", + }, + err: &Error{ + Type: ErrBadResponse, + Msg: "inconsistent body for response code", + }, + code: statusAPIError, + }, + { + response: &apiResponse{ + Status: "error", + Data: json.RawMessage(`"test"`), + ErrorType: ErrTimeout, + Error: "timed out", + }, + err: &Error{ + Type: ErrBadResponse, + Msg: "inconsistent body for response code", + }, + code: http.StatusOK, + }, + } + + tc := &testClient{ + T: t, + ch: make(chan apiClientTest, 1), + req: &http.Request{}, + } + client := &apiClient{tc} + + for _, test := range tests { + + tc.ch <- test + + _, body, err := client.do(context.Background(), tc.req) + + if test.err != nil { + if err == nil { + t.Errorf("expected error %q but got none", test.err) + continue + } + if test.err.Error() != err.Error() { + t.Errorf("unexpected error: want %q, got %q", test.err, err) + } + continue + } + if err != nil { + t.Errorf("unexpeceted error %s", err) + continue + } + + want, got := test.expected, string(body) + if want != got { + t.Errorf("unexpected body: want %q, got %q", want, got) + } + } +} + +type apiTestClient struct { + *testing.T + curTest apiTest +} + +type apiTest struct { + do func() (interface{}, error) + inErr error + inRes interface{} + + reqPath string + reqParam url.Values + reqMethod string + res interface{} + err error +} + +func (c *apiTestClient) url(ep string, args map[string]string) *url.URL { + u := &url.URL{ + Host: "test:9090", + Path: apiPrefix + ep, + } + return u +} + +func (c *apiTestClient) do(ctx context.Context, req *http.Request) (*http.Response, []byte, error) { + + test := c.curTest + + if req.URL.Path != test.reqPath { + c.Errorf("unexpected request path: want %s, got %s", test.reqPath, req.URL.Path) + } + if req.Method != test.reqMethod { + c.Errorf("unexpected request method: want %s, got %s", test.reqMethod, req.Method) + } + + b, err := json.Marshal(test.inRes) + if err != nil { + c.Fatal(err) + } + + resp := &http.Response{} + if test.inErr != nil { + resp.StatusCode = statusAPIError + } else { + resp.StatusCode = http.StatusOK + } + + return resp, b, test.inErr +} + +func TestAPIs(t *testing.T) { + + testTime := time.Now() + + client := &apiTestClient{T: t} + + queryApi := &httpQueryAPI{ + client: client, + } + + doQuery := func(q string, ts time.Time) func() (interface{}, error) { + return func() (interface{}, error) { + return queryApi.Query(context.Background(), q, ts) + } + } + + doQueryRange := func(q string, rng Range) func() (interface{}, error) { + return func() (interface{}, error) { + return queryApi.QueryRange(context.Background(), q, rng) + } + } + + queryTests := []apiTest{ + { + do: doQuery("2", testTime), + inRes: &queryResult{ + Type: model.ValScalar, + Result: &model.Scalar{ + Value: 2, + Timestamp: model.TimeFromUnix(testTime.Unix()), + }, + }, + + reqMethod: "GET", + reqPath: "/api/v1/query", + reqParam: url.Values{ + "query": []string{"2"}, + "time": []string{testTime.Format(time.RFC3339Nano)}, + }, + res: &model.Scalar{ + Value: 2, + Timestamp: model.TimeFromUnix(testTime.Unix()), + }, + }, + { + do: doQuery("2", testTime), + inErr: fmt.Errorf("some error"), + + reqMethod: "GET", + reqPath: "/api/v1/query", + reqParam: url.Values{ + "query": []string{"2"}, + "time": []string{testTime.Format(time.RFC3339Nano)}, + }, + err: fmt.Errorf("some error"), + }, + + { + do: doQueryRange("2", Range{ + Start: testTime.Add(-time.Minute), + End: testTime, + Step: time.Minute, + }), + inErr: fmt.Errorf("some error"), + + reqMethod: "GET", + reqPath: "/api/v1/query_range", + reqParam: url.Values{ + "query": []string{"2"}, + "start": []string{testTime.Add(-time.Minute).Format(time.RFC3339Nano)}, + "end": []string{testTime.Format(time.RFC3339Nano)}, + "step": []string{time.Minute.String()}, + }, + err: fmt.Errorf("some error"), + }, + } + + var tests []apiTest + tests = append(tests, queryTests...) + + for _, test := range tests { + client.curTest = test + + res, err := test.do() + + if test.err != nil { + if err == nil { + t.Errorf("expected error %q but got none", test.err) + continue + } + if err.Error() != test.err.Error() { + t.Errorf("unexpected error: want %s, got %s", test.err, err) + } + continue + } + if err != nil { + t.Errorf("unexpected error: %s", err) + continue + } + + if !reflect.DeepEqual(res, test.res) { + t.Errorf("unexpected result: want %v, got %v", test.res, res) + } + } +} diff --git a/api/vendor/github.com/prometheus/client_golang/examples/random/main.go b/api/vendor/github.com/prometheus/client_golang/examples/random/main.go new file mode 100644 index 0000000..5639571 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/examples/random/main.go @@ -0,0 +1,103 @@ +// Copyright 2015 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. + +// A simple example exposing fictional RPC latencies with different types of +// random distributions (uniform, normal, and exponential) as Prometheus +// metrics. +package main + +import ( + "flag" + "math" + "math/rand" + "net/http" + "time" + + "github.com/prometheus/client_golang/prometheus" +) + +var ( + addr = flag.String("listen-address", ":8080", "The address to listen on for HTTP requests.") + uniformDomain = flag.Float64("uniform.domain", 200, "The domain for the uniform distribution.") + normDomain = flag.Float64("normal.domain", 200, "The domain for the normal distribution.") + normMean = flag.Float64("normal.mean", 10, "The mean for the normal distribution.") + oscillationPeriod = flag.Duration("oscillation-period", 10*time.Minute, "The duration of the rate oscillation period.") +) + +var ( + // Create a summary to track fictional interservice RPC latencies for three + // distinct services with different latency distributions. These services are + // differentiated via a "service" label. + rpcDurations = prometheus.NewSummaryVec( + prometheus.SummaryOpts{ + Name: "rpc_durations_microseconds", + Help: "RPC latency distributions.", + }, + []string{"service"}, + ) + // The same as above, but now as a histogram, and only for the normal + // distribution. The buckets are targeted to the parameters of the + // normal distribution, with 20 buckets centered on the mean, each + // half-sigma wide. + rpcDurationsHistogram = prometheus.NewHistogram(prometheus.HistogramOpts{ + Name: "rpc_durations_histogram_microseconds", + Help: "RPC latency distributions.", + Buckets: prometheus.LinearBuckets(*normMean-5**normDomain, .5**normDomain, 20), + }) +) + +func init() { + // Register the summary and the histogram with Prometheus's default registry. + prometheus.MustRegister(rpcDurations) + prometheus.MustRegister(rpcDurationsHistogram) +} + +func main() { + flag.Parse() + + start := time.Now() + + oscillationFactor := func() float64 { + return 2 + math.Sin(math.Sin(2*math.Pi*float64(time.Since(start))/float64(*oscillationPeriod))) + } + + // Periodically record some sample latencies for the three services. + go func() { + for { + v := rand.Float64() * *uniformDomain + rpcDurations.WithLabelValues("uniform").Observe(v) + time.Sleep(time.Duration(100*oscillationFactor()) * time.Millisecond) + } + }() + + go func() { + for { + v := (rand.NormFloat64() * *normDomain) + *normMean + rpcDurations.WithLabelValues("normal").Observe(v) + rpcDurationsHistogram.Observe(v) + time.Sleep(time.Duration(75*oscillationFactor()) * time.Millisecond) + } + }() + + go func() { + for { + v := rand.ExpFloat64() + rpcDurations.WithLabelValues("exponential").Observe(v) + time.Sleep(time.Duration(50*oscillationFactor()) * time.Millisecond) + } + }() + + // Expose the registered metrics via HTTP. + http.Handle("/metrics", prometheus.Handler()) + http.ListenAndServe(*addr, nil) +} diff --git a/api/vendor/github.com/prometheus/client_golang/examples/simple/main.go b/api/vendor/github.com/prometheus/client_golang/examples/simple/main.go new file mode 100644 index 0000000..19620d2 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/examples/simple/main.go @@ -0,0 +1,30 @@ +// Copyright 2015 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. + +// A minimal example of how to include Prometheus instrumentation. +package main + +import ( + "flag" + "net/http" + + "github.com/prometheus/client_golang/prometheus" +) + +var addr = flag.String("listen-address", ":8080", "The address to listen on for HTTP requests.") + +func main() { + flag.Parse() + http.Handle("/metrics", prometheus.Handler()) + http.ListenAndServe(*addr, nil) +} diff --git a/api/vendor/github.com/prometheus/client_golang/prometheus/.gitignore b/api/vendor/github.com/prometheus/client_golang/prometheus/.gitignore new file mode 100644 index 0000000..3460f03 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/prometheus/.gitignore @@ -0,0 +1 @@ +command-line-arguments.test diff --git a/api/vendor/github.com/prometheus/client_golang/prometheus/README.md b/api/vendor/github.com/prometheus/client_golang/prometheus/README.md new file mode 100644 index 0000000..44986bf --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/prometheus/README.md @@ -0,0 +1 @@ +See [![go-doc](https://godoc.org/github.com/prometheus/client_golang/prometheus?status.svg)](https://godoc.org/github.com/prometheus/client_golang/prometheus). diff --git a/api/vendor/github.com/prometheus/client_golang/prometheus/benchmark_test.go b/api/vendor/github.com/prometheus/client_golang/prometheus/benchmark_test.go new file mode 100644 index 0000000..a3d8669 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/prometheus/benchmark_test.go @@ -0,0 +1,183 @@ +// Copyright 2014 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 prometheus + +import ( + "sync" + "testing" +) + +func BenchmarkCounterWithLabelValues(b *testing.B) { + m := NewCounterVec( + CounterOpts{ + Name: "benchmark_counter", + Help: "A counter to benchmark it.", + }, + []string{"one", "two", "three"}, + ) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + m.WithLabelValues("eins", "zwei", "drei").Inc() + } +} + +func BenchmarkCounterWithLabelValuesConcurrent(b *testing.B) { + m := NewCounterVec( + CounterOpts{ + Name: "benchmark_counter", + Help: "A counter to benchmark it.", + }, + []string{"one", "two", "three"}, + ) + b.ReportAllocs() + b.ResetTimer() + wg := sync.WaitGroup{} + for i := 0; i < 10; i++ { + wg.Add(1) + go func() { + for j := 0; j < b.N/10; j++ { + m.WithLabelValues("eins", "zwei", "drei").Inc() + } + wg.Done() + }() + } + wg.Wait() +} + +func BenchmarkCounterWithMappedLabels(b *testing.B) { + m := NewCounterVec( + CounterOpts{ + Name: "benchmark_counter", + Help: "A counter to benchmark it.", + }, + []string{"one", "two", "three"}, + ) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + m.With(Labels{"two": "zwei", "one": "eins", "three": "drei"}).Inc() + } +} + +func BenchmarkCounterWithPreparedMappedLabels(b *testing.B) { + m := NewCounterVec( + CounterOpts{ + Name: "benchmark_counter", + Help: "A counter to benchmark it.", + }, + []string{"one", "two", "three"}, + ) + b.ReportAllocs() + b.ResetTimer() + labels := Labels{"two": "zwei", "one": "eins", "three": "drei"} + for i := 0; i < b.N; i++ { + m.With(labels).Inc() + } +} + +func BenchmarkCounterNoLabels(b *testing.B) { + m := NewCounter(CounterOpts{ + Name: "benchmark_counter", + Help: "A counter to benchmark it.", + }) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + m.Inc() + } +} + +func BenchmarkGaugeWithLabelValues(b *testing.B) { + m := NewGaugeVec( + GaugeOpts{ + Name: "benchmark_gauge", + Help: "A gauge to benchmark it.", + }, + []string{"one", "two", "three"}, + ) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + m.WithLabelValues("eins", "zwei", "drei").Set(3.1415) + } +} + +func BenchmarkGaugeNoLabels(b *testing.B) { + m := NewGauge(GaugeOpts{ + Name: "benchmark_gauge", + Help: "A gauge to benchmark it.", + }) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + m.Set(3.1415) + } +} + +func BenchmarkSummaryWithLabelValues(b *testing.B) { + m := NewSummaryVec( + SummaryOpts{ + Name: "benchmark_summary", + Help: "A summary to benchmark it.", + }, + []string{"one", "two", "three"}, + ) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + m.WithLabelValues("eins", "zwei", "drei").Observe(3.1415) + } +} + +func BenchmarkSummaryNoLabels(b *testing.B) { + m := NewSummary(SummaryOpts{ + Name: "benchmark_summary", + Help: "A summary to benchmark it.", + }, + ) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + m.Observe(3.1415) + } +} + +func BenchmarkHistogramWithLabelValues(b *testing.B) { + m := NewHistogramVec( + HistogramOpts{ + Name: "benchmark_histogram", + Help: "A histogram to benchmark it.", + }, + []string{"one", "two", "three"}, + ) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + m.WithLabelValues("eins", "zwei", "drei").Observe(3.1415) + } +} + +func BenchmarkHistogramNoLabels(b *testing.B) { + m := NewHistogram(HistogramOpts{ + Name: "benchmark_histogram", + Help: "A histogram to benchmark it.", + }, + ) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + m.Observe(3.1415) + } +} diff --git a/api/vendor/github.com/prometheus/client_golang/prometheus/collector.go b/api/vendor/github.com/prometheus/client_golang/prometheus/collector.go new file mode 100644 index 0000000..623d3d8 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/prometheus/collector.go @@ -0,0 +1,75 @@ +// Copyright 2014 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 prometheus + +// Collector is the interface implemented by anything that can be used by +// Prometheus to collect metrics. A Collector has to be registered for +// collection. See Registerer.Register. +// +// The stock metrics provided by this package (Gauge, Counter, Summary, +// Histogram, Untyped) are also Collectors (which only ever collect one metric, +// namely itself). An implementer of Collector may, however, collect multiple +// metrics in a coordinated fashion and/or create metrics on the fly. Examples +// for collectors already implemented in this library are the metric vectors +// (i.e. collection of multiple instances of the same Metric but with different +// label values) like GaugeVec or SummaryVec, and the ExpvarCollector. +type Collector interface { + // Describe sends the super-set of all possible descriptors of metrics + // collected by this Collector to the provided channel and returns once + // the last descriptor has been sent. The sent descriptors fulfill the + // consistency and uniqueness requirements described in the Desc + // documentation. (It is valid if one and the same Collector sends + // duplicate descriptors. Those duplicates are simply ignored. However, + // two different Collectors must not send duplicate descriptors.) This + // method idempotently sends the same descriptors throughout the + // lifetime of the Collector. If a Collector encounters an error while + // executing this method, it must send an invalid descriptor (created + // with NewInvalidDesc) to signal the error to the registry. + Describe(chan<- *Desc) + // Collect is called by the Prometheus registry when collecting + // metrics. The implementation sends each collected metric via the + // provided channel and returns once the last metric has been sent. The + // descriptor of each sent metric is one of those returned by + // Describe. Returned metrics that share the same descriptor must differ + // in their variable label values. This method may be called + // concurrently and must therefore be implemented in a concurrency safe + // way. Blocking occurs at the expense of total performance of rendering + // all registered metrics. Ideally, Collector implementations support + // concurrent readers. + Collect(chan<- Metric) +} + +// selfCollector implements Collector for a single Metric so that the Metric +// collects itself. Add it as an anonymous field to a struct that implements +// Metric, and call init with the Metric itself as an argument. +type selfCollector struct { + self Metric +} + +// init provides the selfCollector with a reference to the metric it is supposed +// to collect. It is usually called within the factory function to create a +// metric. See example. +func (c *selfCollector) init(self Metric) { + c.self = self +} + +// Describe implements Collector. +func (c *selfCollector) Describe(ch chan<- *Desc) { + ch <- c.self.Desc() +} + +// Collect implements Collector. +func (c *selfCollector) Collect(ch chan<- Metric) { + ch <- c.self +} diff --git a/api/vendor/github.com/prometheus/client_golang/prometheus/counter.go b/api/vendor/github.com/prometheus/client_golang/prometheus/counter.go new file mode 100644 index 0000000..ee37949 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/prometheus/counter.go @@ -0,0 +1,172 @@ +// Copyright 2014 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 prometheus + +import ( + "errors" +) + +// Counter is a Metric that represents a single numerical value that only ever +// goes up. That implies that it cannot be used to count items whose number can +// also go down, e.g. the number of currently running goroutines. Those +// "counters" are represented by Gauges. +// +// A Counter is typically used to count requests served, tasks completed, errors +// occurred, etc. +// +// To create Counter instances, use NewCounter. +type Counter interface { + Metric + Collector + + // Set is used to set the Counter to an arbitrary value. It is only used + // if you have to transfer a value from an external counter into this + // Prometheus metric. Do not use it for regular handling of a + // Prometheus counter (as it can be used to break the contract of + // monotonically increasing values). + // + // Deprecated: Use NewConstMetric to create a counter for an external + // value. A Counter should never be set. + Set(float64) + // Inc increments the counter by 1. + Inc() + // Add adds the given value to the counter. It panics if the value is < + // 0. + Add(float64) +} + +// CounterOpts is an alias for Opts. See there for doc comments. +type CounterOpts Opts + +// NewCounter creates a new Counter based on the provided CounterOpts. +func NewCounter(opts CounterOpts) Counter { + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ) + result := &counter{value: value{desc: desc, valType: CounterValue, labelPairs: desc.constLabelPairs}} + result.init(result) // Init self-collection. + return result +} + +type counter struct { + value +} + +func (c *counter) Add(v float64) { + if v < 0 { + panic(errors.New("counter cannot decrease in value")) + } + c.value.Add(v) +} + +// CounterVec is a Collector that bundles a set of Counters that all share the +// same Desc, but have different values for their variable labels. This is used +// if you want to count the same thing partitioned by various dimensions +// (e.g. number of HTTP requests, partitioned by response code and +// method). Create instances with NewCounterVec. +// +// CounterVec embeds MetricVec. See there for a full list of methods with +// detailed documentation. +type CounterVec struct { + *MetricVec +} + +// NewCounterVec creates a new CounterVec based on the provided CounterOpts and +// partitioned by the given label names. At least one label name must be +// provided. +func NewCounterVec(opts CounterOpts, labelNames []string) *CounterVec { + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + labelNames, + opts.ConstLabels, + ) + return &CounterVec{ + MetricVec: newMetricVec(desc, func(lvs ...string) Metric { + result := &counter{value: value{ + desc: desc, + valType: CounterValue, + labelPairs: makeLabelPairs(desc, lvs), + }} + result.init(result) // Init self-collection. + return result + }), + } +} + +// GetMetricWithLabelValues replaces the method of the same name in +// MetricVec. The difference is that this method returns a Counter and not a +// Metric so that no type conversion is required. +func (m *CounterVec) GetMetricWithLabelValues(lvs ...string) (Counter, error) { + metric, err := m.MetricVec.GetMetricWithLabelValues(lvs...) + if metric != nil { + return metric.(Counter), err + } + return nil, err +} + +// GetMetricWith replaces the method of the same name in MetricVec. The +// difference is that this method returns a Counter and not a Metric so that no +// type conversion is required. +func (m *CounterVec) GetMetricWith(labels Labels) (Counter, error) { + metric, err := m.MetricVec.GetMetricWith(labels) + if metric != nil { + return metric.(Counter), err + } + return nil, err +} + +// WithLabelValues works as GetMetricWithLabelValues, but panics where +// GetMetricWithLabelValues would have returned an error. By not returning an +// error, WithLabelValues allows shortcuts like +// myVec.WithLabelValues("404", "GET").Add(42) +func (m *CounterVec) WithLabelValues(lvs ...string) Counter { + return m.MetricVec.WithLabelValues(lvs...).(Counter) +} + +// With works as GetMetricWith, but panics where GetMetricWithLabels would have +// returned an error. By not returning an error, With allows shortcuts like +// myVec.With(Labels{"code": "404", "method": "GET"}).Add(42) +func (m *CounterVec) With(labels Labels) Counter { + return m.MetricVec.With(labels).(Counter) +} + +// CounterFunc is a Counter whose value is determined at collect time by calling a +// provided function. +// +// To create CounterFunc instances, use NewCounterFunc. +type CounterFunc interface { + Metric + Collector +} + +// NewCounterFunc creates a new CounterFunc based on the provided +// CounterOpts. The value reported is determined by calling the given function +// from within the Write method. Take into account that metric collection may +// happen concurrently. If that results in concurrent calls to Write, like in +// the case where a CounterFunc is directly registered with Prometheus, the +// provided function must be concurrency-safe. The function should also honor +// the contract for a Counter (values only go up, not down), but compliance will +// not be checked. +func NewCounterFunc(opts CounterOpts, function func() float64) CounterFunc { + return newValueFunc(NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), CounterValue, function) +} diff --git a/api/vendor/github.com/prometheus/client_golang/prometheus/counter_test.go b/api/vendor/github.com/prometheus/client_golang/prometheus/counter_test.go new file mode 100644 index 0000000..67391a2 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/prometheus/counter_test.go @@ -0,0 +1,58 @@ +// Copyright 2014 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 prometheus + +import ( + "math" + "testing" + + dto "github.com/prometheus/client_model/go" +) + +func TestCounterAdd(t *testing.T) { + counter := NewCounter(CounterOpts{ + Name: "test", + Help: "test help", + ConstLabels: Labels{"a": "1", "b": "2"}, + }).(*counter) + counter.Inc() + if expected, got := 1., math.Float64frombits(counter.valBits); expected != got { + t.Errorf("Expected %f, got %f.", expected, got) + } + counter.Add(42) + if expected, got := 43., math.Float64frombits(counter.valBits); expected != got { + t.Errorf("Expected %f, got %f.", expected, got) + } + + if expected, got := "counter cannot decrease in value", decreaseCounter(counter).Error(); expected != got { + t.Errorf("Expected error %q, got %q.", expected, got) + } + + m := &dto.Metric{} + counter.Write(m) + + if expected, got := `label: label: counter: `, m.String(); expected != got { + t.Errorf("expected %q, got %q", expected, got) + } +} + +func decreaseCounter(c *counter) (err error) { + defer func() { + if e := recover(); e != nil { + err = e.(error) + } + }() + c.Add(-1) + return nil +} diff --git a/api/vendor/github.com/prometheus/client_golang/prometheus/desc.go b/api/vendor/github.com/prometheus/client_golang/prometheus/desc.go new file mode 100644 index 0000000..77f4b30 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/prometheus/desc.go @@ -0,0 +1,205 @@ +// Copyright 2016 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 prometheus + +import ( + "errors" + "fmt" + "regexp" + "sort" + "strings" + + "github.com/golang/protobuf/proto" + + dto "github.com/prometheus/client_model/go" +) + +var ( + metricNameRE = regexp.MustCompile(`^[a-zA-Z_][a-zA-Z0-9_:]*$`) + labelNameRE = regexp.MustCompile("^[a-zA-Z_][a-zA-Z0-9_]*$") +) + +// reservedLabelPrefix is a prefix which is not legal in user-supplied +// label names. +const reservedLabelPrefix = "__" + +// Labels represents a collection of label name -> value mappings. This type is +// commonly used with the With(Labels) and GetMetricWith(Labels) methods of +// metric vector Collectors, e.g.: +// myVec.With(Labels{"code": "404", "method": "GET"}).Add(42) +// +// The other use-case is the specification of constant label pairs in Opts or to +// create a Desc. +type Labels map[string]string + +// Desc is the descriptor used by every Prometheus Metric. It is essentially +// the immutable meta-data of a Metric. The normal Metric implementations +// included in this package manage their Desc under the hood. Users only have to +// deal with Desc if they use advanced features like the ExpvarCollector or +// custom Collectors and Metrics. +// +// Descriptors registered with the same registry have to fulfill certain +// consistency and uniqueness criteria if they share the same fully-qualified +// name: They must have the same help string and the same label names (aka label +// dimensions) in each, constLabels and variableLabels, but they must differ in +// the values of the constLabels. +// +// Descriptors that share the same fully-qualified names and the same label +// values of their constLabels are considered equal. +// +// Use NewDesc to create new Desc instances. +type Desc struct { + // fqName has been built from Namespace, Subsystem, and Name. + fqName string + // help provides some helpful information about this metric. + help string + // constLabelPairs contains precalculated DTO label pairs based on + // the constant labels. + constLabelPairs []*dto.LabelPair + // VariableLabels contains names of labels for which the metric + // maintains variable values. + variableLabels []string + // id is a hash of the values of the ConstLabels and fqName. This + // must be unique among all registered descriptors and can therefore be + // used as an identifier of the descriptor. + id uint64 + // dimHash is a hash of the label names (preset and variable) and the + // Help string. Each Desc with the same fqName must have the same + // dimHash. + dimHash uint64 + // err is an error that occured during construction. It is reported on + // registration time. + err error +} + +// NewDesc allocates and initializes a new Desc. Errors are recorded in the Desc +// and will be reported on registration time. variableLabels and constLabels can +// be nil if no such labels should be set. fqName and help must not be empty. +// +// variableLabels only contain the label names. Their label values are variable +// and therefore not part of the Desc. (They are managed within the Metric.) +// +// For constLabels, the label values are constant. Therefore, they are fully +// specified in the Desc. See the Opts documentation for the implications of +// constant labels. +func NewDesc(fqName, help string, variableLabels []string, constLabels Labels) *Desc { + d := &Desc{ + fqName: fqName, + help: help, + variableLabels: variableLabels, + } + if help == "" { + d.err = errors.New("empty help string") + return d + } + if !metricNameRE.MatchString(fqName) { + d.err = fmt.Errorf("%q is not a valid metric name", fqName) + return d + } + // labelValues contains the label values of const labels (in order of + // their sorted label names) plus the fqName (at position 0). + labelValues := make([]string, 1, len(constLabels)+1) + labelValues[0] = fqName + labelNames := make([]string, 0, len(constLabels)+len(variableLabels)) + labelNameSet := map[string]struct{}{} + // First add only the const label names and sort them... + for labelName := range constLabels { + if !checkLabelName(labelName) { + d.err = fmt.Errorf("%q is not a valid label name", labelName) + return d + } + labelNames = append(labelNames, labelName) + labelNameSet[labelName] = struct{}{} + } + sort.Strings(labelNames) + // ... so that we can now add const label values in the order of their names. + for _, labelName := range labelNames { + labelValues = append(labelValues, constLabels[labelName]) + } + // Now add the variable label names, but prefix them with something that + // cannot be in a regular label name. That prevents matching the label + // dimension with a different mix between preset and variable labels. + for _, labelName := range variableLabels { + if !checkLabelName(labelName) { + d.err = fmt.Errorf("%q is not a valid label name", labelName) + return d + } + labelNames = append(labelNames, "$"+labelName) + labelNameSet[labelName] = struct{}{} + } + if len(labelNames) != len(labelNameSet) { + d.err = errors.New("duplicate label names") + return d + } + vh := hashNew() + for _, val := range labelValues { + vh = hashAdd(vh, val) + vh = hashAddByte(vh, separatorByte) + } + d.id = vh + // Sort labelNames so that order doesn't matter for the hash. + sort.Strings(labelNames) + // Now hash together (in this order) the help string and the sorted + // label names. + lh := hashNew() + lh = hashAdd(lh, help) + lh = hashAddByte(lh, separatorByte) + for _, labelName := range labelNames { + lh = hashAdd(lh, labelName) + lh = hashAddByte(lh, separatorByte) + } + d.dimHash = lh + + d.constLabelPairs = make([]*dto.LabelPair, 0, len(constLabels)) + for n, v := range constLabels { + d.constLabelPairs = append(d.constLabelPairs, &dto.LabelPair{ + Name: proto.String(n), + Value: proto.String(v), + }) + } + sort.Sort(LabelPairSorter(d.constLabelPairs)) + return d +} + +// NewInvalidDesc returns an invalid descriptor, i.e. a descriptor with the +// provided error set. If a collector returning such a descriptor is registered, +// registration will fail with the provided error. NewInvalidDesc can be used by +// a Collector to signal inability to describe itself. +func NewInvalidDesc(err error) *Desc { + return &Desc{ + err: err, + } +} + +func (d *Desc) String() string { + lpStrings := make([]string, 0, len(d.constLabelPairs)) + for _, lp := range d.constLabelPairs { + lpStrings = append( + lpStrings, + fmt.Sprintf("%s=%q", lp.GetName(), lp.GetValue()), + ) + } + return fmt.Sprintf( + "Desc{fqName: %q, help: %q, constLabels: {%s}, variableLabels: %v}", + d.fqName, + d.help, + strings.Join(lpStrings, ","), + d.variableLabels, + ) +} + +func checkLabelName(l string) bool { + return labelNameRE.MatchString(l) && + !strings.HasPrefix(l, reservedLabelPrefix) +} diff --git a/api/vendor/github.com/prometheus/client_golang/prometheus/doc.go b/api/vendor/github.com/prometheus/client_golang/prometheus/doc.go new file mode 100644 index 0000000..b15a2d3 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/prometheus/doc.go @@ -0,0 +1,181 @@ +// Copyright 2014 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 prometheus provides metrics primitives to instrument code for +// monitoring. It also offers a registry for metrics. Sub-packages allow to +// expose the registered metrics via HTTP (package promhttp) or push them to a +// Pushgateway (package push). +// +// All exported functions and methods are safe to be used concurrently unless +//specified otherwise. +// +// A Basic Example +// +// As a starting point, a very basic usage example: +// +// package main +// +// import ( +// "net/http" +// +// "github.com/prometheus/client_golang/prometheus" +// "github.com/prometheus/client_golang/prometheus/promhttp" +// ) +// +// var ( +// cpuTemp = prometheus.NewGauge(prometheus.GaugeOpts{ +// Name: "cpu_temperature_celsius", +// Help: "Current temperature of the CPU.", +// }) +// hdFailures = prometheus.NewCounterVec( +// prometheus.CounterOpts{ +// Name: "hd_errors_total", +// Help: "Number of hard-disk errors.", +// }, +// []string{"device"}, +// ) +// ) +// +// func init() { +// // Metrics have to be registered to be exposed: +// prometheus.MustRegister(cpuTemp) +// prometheus.MustRegister(hdFailures) +// } +// +// func main() { +// cpuTemp.Set(65.3) +// hdFailures.With(prometheus.Labels{"device":"/dev/sda"}).Inc() +// +// // The Handler function provides a default handler to expose metrics +// // via an HTTP server. "/metrics" is the usual endpoint for that. +// http.Handle("/metrics", promhttp.Handler()) +// http.ListenAndServe(":8080", nil) +// } +// +// +// This is a complete program that exports two metrics, a Gauge and a Counter, +// the latter with a label attached to turn it into a (one-dimensional) vector. +// +// Metrics +// +// The number of exported identifiers in this package might appear a bit +// overwhelming. Hovever, in addition to the basic plumbing shown in the example +// above, you only need to understand the different metric types and their +// vector versions for basic usage. +// +// Above, you have already touched the Counter and the Gauge. There are two more +// advanced metric types: the Summary and Histogram. A more thorough description +// of those four metric types can be found in the Prometheus docs: +// https://prometheus.io/docs/concepts/metric_types/ +// +// A fifth "type" of metric is Untyped. It behaves like a Gauge, but signals the +// Prometheus server not to assume anything about its type. +// +// In addition to the fundamental metric types Gauge, Counter, Summary, +// Histogram, and Untyped, a very important part of the Prometheus data model is +// the partitioning of samples along dimensions called labels, which results in +// metric vectors. The fundamental types are GaugeVec, CounterVec, SummaryVec, +// HistogramVec, and UntypedVec. +// +// While only the fundamental metric types implement the Metric interface, both +// the metrics and their vector versions implement the Collector interface. A +// Collector manages the collection of a number of Metrics, but for convenience, +// a Metric can also “collect itself”. Note that Gauge, Counter, Summary, +// Histogram, and Untyped are interfaces themselves while GaugeVec, CounterVec, +// SummaryVec, HistogramVec, and UntypedVec are not. +// +// To create instances of Metrics and their vector versions, you need a suitable +// …Opts struct, i.e. GaugeOpts, CounterOpts, SummaryOpts, +// HistogramOpts, or UntypedOpts. +// +// Custom Collectors and constant Metrics +// +// While you could create your own implementations of Metric, most likely you +// will only ever implement the Collector interface on your own. At a first +// glance, a custom Collector seems handy to bundle Metrics for common +// registration (with the prime example of the different metric vectors above, +// which bundle all the metrics of the same name but with different labels). +// +// There is a more involved use case, too: If you already have metrics +// available, created outside of the Prometheus context, you don't need the +// interface of the various Metric types. You essentially want to mirror the +// existing numbers into Prometheus Metrics during collection. An own +// implementation of the Collector interface is perfect for that. You can create +// Metric instances “on the fly” using NewConstMetric, NewConstHistogram, and +// NewConstSummary (and their respective Must… versions). That will happen in +// the Collect method. The Describe method has to return separate Desc +// instances, representative of the “throw-away” metrics to be created +// later. NewDesc comes in handy to create those Desc instances. +// +// The Collector example illustrates the use case. You can also look at the +// source code of the processCollector (mirroring process metrics), the +// goCollector (mirroring Go metrics), or the expvarCollector (mirroring expvar +// metrics) as examples that are used in this package itself. +// +// If you just need to call a function to get a single float value to collect as +// a metric, GaugeFunc, CounterFunc, or UntypedFunc might be interesting +// shortcuts. +// +// Advanced Uses of the Registry +// +// While MustRegister is the by far most common way of registering a Collector, +// sometimes you might want to handle the errors the registration might +// cause. As suggested by the name, MustRegister panics if an error occurs. With +// the Register function, the error is returned and can be handled. +// +// An error is returned if the registered Collector is incompatible or +// inconsistent with already registered metrics. The registry aims for +// consistency of the collected metrics according to the Prometheus data +// model. Inconsistencies are ideally detected at registration time, not at +// collect time. The former will usually be detected at start-up time of a +// program, while the latter will only happen at scrape time, possibly not even +// on the first scrape if the inconsistency only becomes relevant later. That is +// the main reason why a Collector and a Metric have to describe themselves to +// the registry. +// +// So far, everything we did operated on the so-called default registry, as it +// can be found in the global DefaultRegistry variable. With NewRegistry, you +// can create a custom registry, or you can even implement the Registerer or +// Gatherer interfaces yourself. The methods Register and Unregister work in +// the same way on a custom registry as the global functions Register and +// Unregister on the default registry. +// +// There are a number of uses for custom registries: You can use registries +// with special properties, see NewPedanticRegistry. You can avoid global state, +// as it is imposed by the DefaultRegistry. You can use multiple registries at +// the same time to expose different metrics in different ways. You can use +// separate registries for testing purposes. +// +// Also note that the DefaultRegistry comes registered with a Collector for Go +// runtime metrics (via NewGoCollector) and a Collector for process metrics (via +// NewProcessCollector). With a custom registry, you are in control and decide +// yourself about the Collectors to register. +// +// HTTP Exposition +// +// The Registry implements the Gatherer interface. The caller of the Gather +// method can then expose the gathered metrics in some way. Usually, the metrics +// are served via HTTP on the /metrics endpoint. That's happening in the example +// above. The tools to expose metrics via HTTP are in the promhttp +// sub-package. (The top-level functions in the prometheus package are +// deprecated.) +// +// Pushing to the Pushgateway +// +// Function for pushing to the Pushgateway can be found in the push sub-package. +// +// Other Means of Exposition +// +// More ways of exposing metrics can easily be added. Sending metrics to +// Graphite would be an example that will soon be implemented. +package prometheus diff --git a/api/vendor/github.com/prometheus/client_golang/prometheus/example_clustermanager_test.go b/api/vendor/github.com/prometheus/client_golang/prometheus/example_clustermanager_test.go new file mode 100644 index 0000000..260c1b5 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/prometheus/example_clustermanager_test.go @@ -0,0 +1,118 @@ +// Copyright 2014 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 prometheus_test + +import "github.com/prometheus/client_golang/prometheus" + +// ClusterManager is an example for a system that might have been built without +// Prometheus in mind. It models a central manager of jobs running in a +// cluster. To turn it into something that collects Prometheus metrics, we +// simply add the two methods required for the Collector interface. +// +// An additional challenge is that multiple instances of the ClusterManager are +// run within the same binary, each in charge of a different zone. We need to +// make use of ConstLabels to be able to register each ClusterManager instance +// with Prometheus. +type ClusterManager struct { + Zone string + OOMCountDesc *prometheus.Desc + RAMUsageDesc *prometheus.Desc + // ... many more fields +} + +// ReallyExpensiveAssessmentOfTheSystemState is a mock for the data gathering a +// real cluster manager would have to do. Since it may actually be really +// expensive, it must only be called once per collection. This implementation, +// obviously, only returns some made-up data. +func (c *ClusterManager) ReallyExpensiveAssessmentOfTheSystemState() ( + oomCountByHost map[string]int, ramUsageByHost map[string]float64, +) { + // Just example fake data. + oomCountByHost = map[string]int{ + "foo.example.org": 42, + "bar.example.org": 2001, + } + ramUsageByHost = map[string]float64{ + "foo.example.org": 6.023e23, + "bar.example.org": 3.14, + } + return +} + +// Describe simply sends the two Descs in the struct to the channel. +func (c *ClusterManager) Describe(ch chan<- *prometheus.Desc) { + ch <- c.OOMCountDesc + ch <- c.RAMUsageDesc +} + +// Collect first triggers the ReallyExpensiveAssessmentOfTheSystemState. Then it +// creates constant metrics for each host on the fly based on the returned data. +// +// Note that Collect could be called concurrently, so we depend on +// ReallyExpensiveAssessmentOfTheSystemState to be concurrency-safe. +func (c *ClusterManager) Collect(ch chan<- prometheus.Metric) { + oomCountByHost, ramUsageByHost := c.ReallyExpensiveAssessmentOfTheSystemState() + for host, oomCount := range oomCountByHost { + ch <- prometheus.MustNewConstMetric( + c.OOMCountDesc, + prometheus.CounterValue, + float64(oomCount), + host, + ) + } + for host, ramUsage := range ramUsageByHost { + ch <- prometheus.MustNewConstMetric( + c.RAMUsageDesc, + prometheus.GaugeValue, + ramUsage, + host, + ) + } +} + +// NewClusterManager creates the two Descs OOMCountDesc and RAMUsageDesc. Note +// that the zone is set as a ConstLabel. (It's different in each instance of the +// ClusterManager, but constant over the lifetime of an instance.) Then there is +// a variable label "host", since we want to partition the collected metrics by +// host. Since all Descs created in this way are consistent across instances, +// with a guaranteed distinction by the "zone" label, we can register different +// ClusterManager instances with the same registry. +func NewClusterManager(zone string) *ClusterManager { + return &ClusterManager{ + Zone: zone, + OOMCountDesc: prometheus.NewDesc( + "clustermanager_oom_crashes_total", + "Number of OOM crashes.", + []string{"host"}, + prometheus.Labels{"zone": zone}, + ), + RAMUsageDesc: prometheus.NewDesc( + "clustermanager_ram_usage_bytes", + "RAM usage as reported to the cluster manager.", + []string{"host"}, + prometheus.Labels{"zone": zone}, + ), + } +} + +func ExampleCollector() { + workerDB := NewClusterManager("db") + workerCA := NewClusterManager("ca") + + // Since we are dealing with custom Collector implementations, it might + // be a good idea to try it out with a pedantic registry. + reg := prometheus.NewPedanticRegistry() + reg.MustRegister(workerDB) + reg.MustRegister(workerCA) +} diff --git a/api/vendor/github.com/prometheus/client_golang/prometheus/examples_test.go b/api/vendor/github.com/prometheus/client_golang/prometheus/examples_test.go new file mode 100644 index 0000000..f87f21a --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/prometheus/examples_test.go @@ -0,0 +1,751 @@ +// Copyright 2014 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 prometheus_test + +import ( + "bytes" + "fmt" + "math" + "net/http" + "runtime" + "sort" + "strings" + + dto "github.com/prometheus/client_model/go" + "github.com/prometheus/common/expfmt" + + "github.com/golang/protobuf/proto" + + "github.com/prometheus/client_golang/prometheus" +) + +func ExampleGauge() { + opsQueued := prometheus.NewGauge(prometheus.GaugeOpts{ + Namespace: "our_company", + Subsystem: "blob_storage", + Name: "ops_queued", + Help: "Number of blob storage operations waiting to be processed.", + }) + prometheus.MustRegister(opsQueued) + + // 10 operations queued by the goroutine managing incoming requests. + opsQueued.Add(10) + // A worker goroutine has picked up a waiting operation. + opsQueued.Dec() + // And once more... + opsQueued.Dec() +} + +func ExampleGaugeVec() { + opsQueued := prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Namespace: "our_company", + Subsystem: "blob_storage", + Name: "ops_queued", + Help: "Number of blob storage operations waiting to be processed, partitioned by user and type.", + }, + []string{ + // Which user has requested the operation? + "user", + // Of what type is the operation? + "type", + }, + ) + prometheus.MustRegister(opsQueued) + + // Increase a value using compact (but order-sensitive!) WithLabelValues(). + opsQueued.WithLabelValues("bob", "put").Add(4) + // Increase a value with a map using WithLabels. More verbose, but order + // doesn't matter anymore. + opsQueued.With(prometheus.Labels{"type": "delete", "user": "alice"}).Inc() +} + +func ExampleGaugeFunc() { + if err := prometheus.Register(prometheus.NewGaugeFunc( + prometheus.GaugeOpts{ + Subsystem: "runtime", + Name: "goroutines_count", + Help: "Number of goroutines that currently exist.", + }, + func() float64 { return float64(runtime.NumGoroutine()) }, + )); err == nil { + fmt.Println("GaugeFunc 'goroutines_count' registered.") + } + // Note that the count of goroutines is a gauge (and not a counter) as + // it can go up and down. + + // Output: + // GaugeFunc 'goroutines_count' registered. +} + +func ExampleCounter() { + pushCounter := prometheus.NewCounter(prometheus.CounterOpts{ + Name: "repository_pushes", // Note: No help string... + }) + err := prometheus.Register(pushCounter) // ... so this will return an error. + if err != nil { + fmt.Println("Push counter couldn't be registered, no counting will happen:", err) + return + } + + // Try it once more, this time with a help string. + pushCounter = prometheus.NewCounter(prometheus.CounterOpts{ + Name: "repository_pushes", + Help: "Number of pushes to external repository.", + }) + err = prometheus.Register(pushCounter) + if err != nil { + fmt.Println("Push counter couldn't be registered AGAIN, no counting will happen:", err) + return + } + + pushComplete := make(chan struct{}) + // TODO: Start a goroutine that performs repository pushes and reports + // each completion via the channel. + for _ = range pushComplete { + pushCounter.Inc() + } + // Output: + // Push counter couldn't be registered, no counting will happen: descriptor Desc{fqName: "repository_pushes", help: "", constLabels: {}, variableLabels: []} is invalid: empty help string +} + +func ExampleCounterVec() { + httpReqs := prometheus.NewCounterVec( + prometheus.CounterOpts{ + Name: "http_requests_total", + Help: "How many HTTP requests processed, partitioned by status code and HTTP method.", + }, + []string{"code", "method"}, + ) + prometheus.MustRegister(httpReqs) + + httpReqs.WithLabelValues("404", "POST").Add(42) + + // If you have to access the same set of labels very frequently, it + // might be good to retrieve the metric only once and keep a handle to + // it. But beware of deletion of that metric, see below! + m := httpReqs.WithLabelValues("200", "GET") + for i := 0; i < 1000000; i++ { + m.Inc() + } + // Delete a metric from the vector. If you have previously kept a handle + // to that metric (as above), future updates via that handle will go + // unseen (even if you re-create a metric with the same label set + // later). + httpReqs.DeleteLabelValues("200", "GET") + // Same thing with the more verbose Labels syntax. + httpReqs.Delete(prometheus.Labels{"method": "GET", "code": "200"}) +} + +func ExampleInstrumentHandler() { + // Handle the "/doc" endpoint with the standard http.FileServer handler. + // By wrapping the handler with InstrumentHandler, request count, + // request and response sizes, and request latency are automatically + // exported to Prometheus, partitioned by HTTP status code and method + // and by the handler name (here "fileserver"). + http.Handle("/doc", prometheus.InstrumentHandler( + "fileserver", http.FileServer(http.Dir("/usr/share/doc")), + )) + // The Prometheus handler still has to be registered to handle the + // "/metrics" endpoint. The handler returned by prometheus.Handler() is + // already instrumented - with "prometheus" as the handler name. In this + // example, we want the handler name to be "metrics", so we instrument + // the uninstrumented Prometheus handler ourselves. + http.Handle("/metrics", prometheus.InstrumentHandler( + "metrics", prometheus.UninstrumentedHandler(), + )) +} + +func ExampleLabelPairSorter() { + labelPairs := []*dto.LabelPair{ + &dto.LabelPair{Name: proto.String("status"), Value: proto.String("404")}, + &dto.LabelPair{Name: proto.String("method"), Value: proto.String("get")}, + } + + sort.Sort(prometheus.LabelPairSorter(labelPairs)) + + fmt.Println(labelPairs) + // Output: + // [name:"method" value:"get" name:"status" value:"404" ] +} + +func ExampleRegister() { + // Imagine you have a worker pool and want to count the tasks completed. + taskCounter := prometheus.NewCounter(prometheus.CounterOpts{ + Subsystem: "worker_pool", + Name: "completed_tasks_total", + Help: "Total number of tasks completed.", + }) + // This will register fine. + if err := prometheus.Register(taskCounter); err != nil { + fmt.Println(err) + } else { + fmt.Println("taskCounter registered.") + } + // Don't forget to tell the HTTP server about the Prometheus handler. + // (In a real program, you still need to start the HTTP server...) + http.Handle("/metrics", prometheus.Handler()) + + // Now you can start workers and give every one of them a pointer to + // taskCounter and let it increment it whenever it completes a task. + taskCounter.Inc() // This has to happen somewhere in the worker code. + + // But wait, you want to see how individual workers perform. So you need + // a vector of counters, with one element for each worker. + taskCounterVec := prometheus.NewCounterVec( + prometheus.CounterOpts{ + Subsystem: "worker_pool", + Name: "completed_tasks_total", + Help: "Total number of tasks completed.", + }, + []string{"worker_id"}, + ) + + // Registering will fail because we already have a metric of that name. + if err := prometheus.Register(taskCounterVec); err != nil { + fmt.Println("taskCounterVec not registered:", err) + } else { + fmt.Println("taskCounterVec registered.") + } + + // To fix, first unregister the old taskCounter. + if prometheus.Unregister(taskCounter) { + fmt.Println("taskCounter unregistered.") + } + + // Try registering taskCounterVec again. + if err := prometheus.Register(taskCounterVec); err != nil { + fmt.Println("taskCounterVec not registered:", err) + } else { + fmt.Println("taskCounterVec registered.") + } + // Bummer! Still doesn't work. + + // Prometheus will not allow you to ever export metrics with + // inconsistent help strings or label names. After unregistering, the + // unregistered metrics will cease to show up in the /metrics HTTP + // response, but the registry still remembers that those metrics had + // been exported before. For this example, we will now choose a + // different name. (In a real program, you would obviously not export + // the obsolete metric in the first place.) + taskCounterVec = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Subsystem: "worker_pool", + Name: "completed_tasks_by_id", + Help: "Total number of tasks completed.", + }, + []string{"worker_id"}, + ) + if err := prometheus.Register(taskCounterVec); err != nil { + fmt.Println("taskCounterVec not registered:", err) + } else { + fmt.Println("taskCounterVec registered.") + } + // Finally it worked! + + // The workers have to tell taskCounterVec their id to increment the + // right element in the metric vector. + taskCounterVec.WithLabelValues("42").Inc() // Code from worker 42. + + // Each worker could also keep a reference to their own counter element + // around. Pick the counter at initialization time of the worker. + myCounter := taskCounterVec.WithLabelValues("42") // From worker 42 initialization code. + myCounter.Inc() // Somewhere in the code of that worker. + + // Note that something like WithLabelValues("42", "spurious arg") would + // panic (because you have provided too many label values). If you want + // to get an error instead, use GetMetricWithLabelValues(...) instead. + notMyCounter, err := taskCounterVec.GetMetricWithLabelValues("42", "spurious arg") + if err != nil { + fmt.Println("Worker initialization failed:", err) + } + if notMyCounter == nil { + fmt.Println("notMyCounter is nil.") + } + + // A different (and somewhat tricky) approach is to use + // ConstLabels. ConstLabels are pairs of label names and label values + // that never change. You might ask what those labels are good for (and + // rightfully so - if they never change, they could as well be part of + // the metric name). There are essentially two use-cases: The first is + // if labels are constant throughout the lifetime of a binary execution, + // but they vary over time or between different instances of a running + // binary. The second is what we have here: Each worker creates and + // registers an own Counter instance where the only difference is in the + // value of the ConstLabels. Those Counters can all be registered + // because the different ConstLabel values guarantee that each worker + // will increment a different Counter metric. + counterOpts := prometheus.CounterOpts{ + Subsystem: "worker_pool", + Name: "completed_tasks", + Help: "Total number of tasks completed.", + ConstLabels: prometheus.Labels{"worker_id": "42"}, + } + taskCounterForWorker42 := prometheus.NewCounter(counterOpts) + if err := prometheus.Register(taskCounterForWorker42); err != nil { + fmt.Println("taskCounterVForWorker42 not registered:", err) + } else { + fmt.Println("taskCounterForWorker42 registered.") + } + // Obviously, in real code, taskCounterForWorker42 would be a member + // variable of a worker struct, and the "42" would be retrieved with a + // GetId() method or something. The Counter would be created and + // registered in the initialization code of the worker. + + // For the creation of the next Counter, we can recycle + // counterOpts. Just change the ConstLabels. + counterOpts.ConstLabels = prometheus.Labels{"worker_id": "2001"} + taskCounterForWorker2001 := prometheus.NewCounter(counterOpts) + if err := prometheus.Register(taskCounterForWorker2001); err != nil { + fmt.Println("taskCounterVForWorker2001 not registered:", err) + } else { + fmt.Println("taskCounterForWorker2001 registered.") + } + + taskCounterForWorker2001.Inc() + taskCounterForWorker42.Inc() + taskCounterForWorker2001.Inc() + + // Yet another approach would be to turn the workers themselves into + // Collectors and register them. See the Collector example for details. + + // Output: + // taskCounter registered. + // taskCounterVec not registered: a previously registered descriptor with the same fully-qualified name as Desc{fqName: "worker_pool_completed_tasks_total", help: "Total number of tasks completed.", constLabels: {}, variableLabels: [worker_id]} has different label names or a different help string + // taskCounter unregistered. + // taskCounterVec not registered: a previously registered descriptor with the same fully-qualified name as Desc{fqName: "worker_pool_completed_tasks_total", help: "Total number of tasks completed.", constLabels: {}, variableLabels: [worker_id]} has different label names or a different help string + // taskCounterVec registered. + // Worker initialization failed: inconsistent label cardinality + // notMyCounter is nil. + // taskCounterForWorker42 registered. + // taskCounterForWorker2001 registered. +} + +func ExampleSummary() { + temps := prometheus.NewSummary(prometheus.SummaryOpts{ + Name: "pond_temperature_celsius", + Help: "The temperature of the frog pond.", // Sorry, we can't measure how badly it smells. + }) + + // Simulate some observations. + for i := 0; i < 1000; i++ { + temps.Observe(30 + math.Floor(120*math.Sin(float64(i)*0.1))/10) + } + + // Just for demonstration, let's check the state of the summary by + // (ab)using its Write method (which is usually only used by Prometheus + // internally). + metric := &dto.Metric{} + temps.Write(metric) + fmt.Println(proto.MarshalTextString(metric)) + + // Output: + // summary: < + // sample_count: 1000 + // sample_sum: 29969.50000000001 + // quantile: < + // quantile: 0.5 + // value: 31.1 + // > + // quantile: < + // quantile: 0.9 + // value: 41.3 + // > + // quantile: < + // quantile: 0.99 + // value: 41.9 + // > + // > +} + +func ExampleSummaryVec() { + temps := prometheus.NewSummaryVec( + prometheus.SummaryOpts{ + Name: "pond_temperature_celsius", + Help: "The temperature of the frog pond.", // Sorry, we can't measure how badly it smells. + }, + []string{"species"}, + ) + + // Simulate some observations. + for i := 0; i < 1000; i++ { + temps.WithLabelValues("litoria-caerulea").Observe(30 + math.Floor(120*math.Sin(float64(i)*0.1))/10) + temps.WithLabelValues("lithobates-catesbeianus").Observe(32 + math.Floor(100*math.Cos(float64(i)*0.11))/10) + } + + // Create a Summary without any observations. + temps.WithLabelValues("leiopelma-hochstetteri") + + // Just for demonstration, let's check the state of the summary vector + // by registering it with a custom registry and then let it collect the + // metrics. + reg := prometheus.NewRegistry() + reg.MustRegister(temps) + + metricFamilies, err := reg.Gather() + if err != nil || len(metricFamilies) != 1 { + panic("unexpected behavior of custom test registry") + } + fmt.Println(proto.MarshalTextString(metricFamilies[0])) + + // Output: + // name: "pond_temperature_celsius" + // help: "The temperature of the frog pond." + // type: SUMMARY + // metric: < + // label: < + // name: "species" + // value: "leiopelma-hochstetteri" + // > + // summary: < + // sample_count: 0 + // sample_sum: 0 + // quantile: < + // quantile: 0.5 + // value: nan + // > + // quantile: < + // quantile: 0.9 + // value: nan + // > + // quantile: < + // quantile: 0.99 + // value: nan + // > + // > + // > + // metric: < + // label: < + // name: "species" + // value: "lithobates-catesbeianus" + // > + // summary: < + // sample_count: 1000 + // sample_sum: 31956.100000000017 + // quantile: < + // quantile: 0.5 + // value: 32.4 + // > + // quantile: < + // quantile: 0.9 + // value: 41.4 + // > + // quantile: < + // quantile: 0.99 + // value: 41.9 + // > + // > + // > + // metric: < + // label: < + // name: "species" + // value: "litoria-caerulea" + // > + // summary: < + // sample_count: 1000 + // sample_sum: 29969.50000000001 + // quantile: < + // quantile: 0.5 + // value: 31.1 + // > + // quantile: < + // quantile: 0.9 + // value: 41.3 + // > + // quantile: < + // quantile: 0.99 + // value: 41.9 + // > + // > + // > +} + +func ExampleNewConstSummary() { + desc := prometheus.NewDesc( + "http_request_duration_seconds", + "A summary of the HTTP request durations.", + []string{"code", "method"}, + prometheus.Labels{"owner": "example"}, + ) + + // Create a constant summary from values we got from a 3rd party telemetry system. + s := prometheus.MustNewConstSummary( + desc, + 4711, 403.34, + map[float64]float64{0.5: 42.3, 0.9: 323.3}, + "200", "get", + ) + + // Just for demonstration, let's check the state of the summary by + // (ab)using its Write method (which is usually only used by Prometheus + // internally). + metric := &dto.Metric{} + s.Write(metric) + fmt.Println(proto.MarshalTextString(metric)) + + // Output: + // label: < + // name: "code" + // value: "200" + // > + // label: < + // name: "method" + // value: "get" + // > + // label: < + // name: "owner" + // value: "example" + // > + // summary: < + // sample_count: 4711 + // sample_sum: 403.34 + // quantile: < + // quantile: 0.5 + // value: 42.3 + // > + // quantile: < + // quantile: 0.9 + // value: 323.3 + // > + // > +} + +func ExampleHistogram() { + temps := prometheus.NewHistogram(prometheus.HistogramOpts{ + Name: "pond_temperature_celsius", + Help: "The temperature of the frog pond.", // Sorry, we can't measure how badly it smells. + Buckets: prometheus.LinearBuckets(20, 5, 5), // 5 buckets, each 5 centigrade wide. + }) + + // Simulate some observations. + for i := 0; i < 1000; i++ { + temps.Observe(30 + math.Floor(120*math.Sin(float64(i)*0.1))/10) + } + + // Just for demonstration, let's check the state of the histogram by + // (ab)using its Write method (which is usually only used by Prometheus + // internally). + metric := &dto.Metric{} + temps.Write(metric) + fmt.Println(proto.MarshalTextString(metric)) + + // Output: + // histogram: < + // sample_count: 1000 + // sample_sum: 29969.50000000001 + // bucket: < + // cumulative_count: 192 + // upper_bound: 20 + // > + // bucket: < + // cumulative_count: 366 + // upper_bound: 25 + // > + // bucket: < + // cumulative_count: 501 + // upper_bound: 30 + // > + // bucket: < + // cumulative_count: 638 + // upper_bound: 35 + // > + // bucket: < + // cumulative_count: 816 + // upper_bound: 40 + // > + // > +} + +func ExampleNewConstHistogram() { + desc := prometheus.NewDesc( + "http_request_duration_seconds", + "A histogram of the HTTP request durations.", + []string{"code", "method"}, + prometheus.Labels{"owner": "example"}, + ) + + // Create a constant histogram from values we got from a 3rd party telemetry system. + h := prometheus.MustNewConstHistogram( + desc, + 4711, 403.34, + map[float64]uint64{25: 121, 50: 2403, 100: 3221, 200: 4233}, + "200", "get", + ) + + // Just for demonstration, let's check the state of the histogram by + // (ab)using its Write method (which is usually only used by Prometheus + // internally). + metric := &dto.Metric{} + h.Write(metric) + fmt.Println(proto.MarshalTextString(metric)) + + // Output: + // label: < + // name: "code" + // value: "200" + // > + // label: < + // name: "method" + // value: "get" + // > + // label: < + // name: "owner" + // value: "example" + // > + // histogram: < + // sample_count: 4711 + // sample_sum: 403.34 + // bucket: < + // cumulative_count: 121 + // upper_bound: 25 + // > + // bucket: < + // cumulative_count: 2403 + // upper_bound: 50 + // > + // bucket: < + // cumulative_count: 3221 + // upper_bound: 100 + // > + // bucket: < + // cumulative_count: 4233 + // upper_bound: 200 + // > + // > +} + +func ExampleAlreadyRegisteredError() { + reqCounter := prometheus.NewCounter(prometheus.CounterOpts{ + Name: "requests_total", + Help: "The total number of requests served.", + }) + if err := prometheus.Register(reqCounter); err != nil { + if are, ok := err.(prometheus.AlreadyRegisteredError); ok { + // A counter for that metric has been registered before. + // Use the old counter from now on. + reqCounter = are.ExistingCollector.(prometheus.Counter) + } else { + // Something else went wrong! + panic(err) + } + } +} + +func ExampleGatherers() { + reg := prometheus.NewRegistry() + temp := prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Name: "temperature_kelvin", + Help: "Temperature in Kelvin.", + }, + []string{"location"}, + ) + reg.MustRegister(temp) + temp.WithLabelValues("outside").Set(273.14) + temp.WithLabelValues("inside").Set(298.44) + + var parser expfmt.TextParser + + text := ` +# TYPE humidity_percent gauge +# HELP humidity_percent Humidity in %. +humidity_percent{location="outside"} 45.4 +humidity_percent{location="inside"} 33.2 +# TYPE temperature_kelvin gauge +# HELP temperature_kelvin Temperature in Kelvin. +temperature_kelvin{location="somewhere else"} 4.5 +` + + parseText := func() ([]*dto.MetricFamily, error) { + parsed, err := parser.TextToMetricFamilies(strings.NewReader(text)) + if err != nil { + return nil, err + } + var result []*dto.MetricFamily + for _, mf := range parsed { + result = append(result, mf) + } + return result, nil + } + + gatherers := prometheus.Gatherers{ + reg, + prometheus.GathererFunc(parseText), + } + + gathering, err := gatherers.Gather() + if err != nil { + fmt.Println(err) + } + + out := &bytes.Buffer{} + for _, mf := range gathering { + if _, err := expfmt.MetricFamilyToText(out, mf); err != nil { + panic(err) + } + } + fmt.Print(out.String()) + fmt.Println("----------") + + // Note how the temperature_kelvin metric family has been merged from + // different sources. Now try + text = ` +# TYPE humidity_percent gauge +# HELP humidity_percent Humidity in %. +humidity_percent{location="outside"} 45.4 +humidity_percent{location="inside"} 33.2 +# TYPE temperature_kelvin gauge +# HELP temperature_kelvin Temperature in Kelvin. +# Duplicate metric: +temperature_kelvin{location="outside"} 265.3 + # Wrong labels: +temperature_kelvin 4.5 +` + + gathering, err = gatherers.Gather() + if err != nil { + fmt.Println(err) + } + // Note that still as many metrics as possible are returned: + out.Reset() + for _, mf := range gathering { + if _, err := expfmt.MetricFamilyToText(out, mf); err != nil { + panic(err) + } + } + fmt.Print(out.String()) + + // Output: + // # HELP humidity_percent Humidity in %. + // # TYPE humidity_percent gauge + // humidity_percent{location="inside"} 33.2 + // humidity_percent{location="outside"} 45.4 + // # HELP temperature_kelvin Temperature in Kelvin. + // # TYPE temperature_kelvin gauge + // temperature_kelvin{location="inside"} 298.44 + // temperature_kelvin{location="outside"} 273.14 + // temperature_kelvin{location="somewhere else"} 4.5 + // ---------- + // 2 error(s) occurred: + // * collected metric temperature_kelvin label: gauge: was collected before with the same name and label values + // * collected metric temperature_kelvin gauge: has label dimensions inconsistent with previously collected metrics in the same metric family + // # HELP humidity_percent Humidity in %. + // # TYPE humidity_percent gauge + // humidity_percent{location="inside"} 33.2 + // humidity_percent{location="outside"} 45.4 + // # HELP temperature_kelvin Temperature in Kelvin. + // # TYPE temperature_kelvin gauge + // temperature_kelvin{location="inside"} 298.44 + // temperature_kelvin{location="outside"} 273.14 +} diff --git a/api/vendor/github.com/prometheus/client_golang/prometheus/expvar_collector.go b/api/vendor/github.com/prometheus/client_golang/prometheus/expvar_collector.go new file mode 100644 index 0000000..18a99d5 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/prometheus/expvar_collector.go @@ -0,0 +1,119 @@ +// Copyright 2014 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 prometheus + +import ( + "encoding/json" + "expvar" +) + +type expvarCollector struct { + exports map[string]*Desc +} + +// NewExpvarCollector returns a newly allocated expvar Collector that still has +// to be registered with a Prometheus registry. +// +// An expvar Collector collects metrics from the expvar interface. It provides a +// quick way to expose numeric values that are already exported via expvar as +// Prometheus metrics. Note that the data models of expvar and Prometheus are +// fundamentally different, and that the expvar Collector is inherently slower +// than native Prometheus metrics. Thus, the expvar Collector is probably great +// for experiments and prototying, but you should seriously consider a more +// direct implementation of Prometheus metrics for monitoring production +// systems. +// +// The exports map has the following meaning: +// +// The keys in the map correspond to expvar keys, i.e. for every expvar key you +// want to export as Prometheus metric, you need an entry in the exports +// map. The descriptor mapped to each key describes how to export the expvar +// value. It defines the name and the help string of the Prometheus metric +// proxying the expvar value. The type will always be Untyped. +// +// For descriptors without variable labels, the expvar value must be a number or +// a bool. The number is then directly exported as the Prometheus sample +// value. (For a bool, 'false' translates to 0 and 'true' to 1). Expvar values +// that are not numbers or bools are silently ignored. +// +// If the descriptor has one variable label, the expvar value must be an expvar +// map. The keys in the expvar map become the various values of the one +// Prometheus label. The values in the expvar map must be numbers or bools again +// as above. +// +// For descriptors with more than one variable label, the expvar must be a +// nested expvar map, i.e. where the values of the topmost map are maps again +// etc. until a depth is reached that corresponds to the number of labels. The +// leaves of that structure must be numbers or bools as above to serve as the +// sample values. +// +// Anything that does not fit into the scheme above is silently ignored. +func NewExpvarCollector(exports map[string]*Desc) Collector { + return &expvarCollector{ + exports: exports, + } +} + +// Describe implements Collector. +func (e *expvarCollector) Describe(ch chan<- *Desc) { + for _, desc := range e.exports { + ch <- desc + } +} + +// Collect implements Collector. +func (e *expvarCollector) Collect(ch chan<- Metric) { + for name, desc := range e.exports { + var m Metric + expVar := expvar.Get(name) + if expVar == nil { + continue + } + var v interface{} + labels := make([]string, len(desc.variableLabels)) + if err := json.Unmarshal([]byte(expVar.String()), &v); err != nil { + ch <- NewInvalidMetric(desc, err) + continue + } + var processValue func(v interface{}, i int) + processValue = func(v interface{}, i int) { + if i >= len(labels) { + copiedLabels := append(make([]string, 0, len(labels)), labels...) + switch v := v.(type) { + case float64: + m = MustNewConstMetric(desc, UntypedValue, v, copiedLabels...) + case bool: + if v { + m = MustNewConstMetric(desc, UntypedValue, 1, copiedLabels...) + } else { + m = MustNewConstMetric(desc, UntypedValue, 0, copiedLabels...) + } + default: + return + } + ch <- m + return + } + vm, ok := v.(map[string]interface{}) + if !ok { + return + } + for lv, val := range vm { + labels[i] = lv + processValue(val, i+1) + } + } + processValue(v, 0) + } +} diff --git a/api/vendor/github.com/prometheus/client_golang/prometheus/expvar_collector_test.go b/api/vendor/github.com/prometheus/client_golang/prometheus/expvar_collector_test.go new file mode 100644 index 0000000..5d3128f --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/prometheus/expvar_collector_test.go @@ -0,0 +1,97 @@ +// Copyright 2014 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 prometheus_test + +import ( + "expvar" + "fmt" + "sort" + "strings" + + dto "github.com/prometheus/client_model/go" + + "github.com/prometheus/client_golang/prometheus" +) + +func ExampleExpvarCollector() { + expvarCollector := prometheus.NewExpvarCollector(map[string]*prometheus.Desc{ + "memstats": prometheus.NewDesc( + "expvar_memstats", + "All numeric memstats as one metric family. Not a good role-model, actually... ;-)", + []string{"type"}, nil, + ), + "lone-int": prometheus.NewDesc( + "expvar_lone_int", + "Just an expvar int as an example.", + nil, nil, + ), + "http-request-map": prometheus.NewDesc( + "expvar_http_request_total", + "How many http requests processed, partitioned by status code and http method.", + []string{"code", "method"}, nil, + ), + }) + prometheus.MustRegister(expvarCollector) + + // The Prometheus part is done here. But to show that this example is + // doing anything, we have to manually export something via expvar. In + // real-life use-cases, some library would already have exported via + // expvar what we want to re-export as Prometheus metrics. + expvar.NewInt("lone-int").Set(42) + expvarMap := expvar.NewMap("http-request-map") + var ( + expvarMap1, expvarMap2 expvar.Map + expvarInt11, expvarInt12, expvarInt21, expvarInt22 expvar.Int + ) + expvarMap1.Init() + expvarMap2.Init() + expvarInt11.Set(3) + expvarInt12.Set(13) + expvarInt21.Set(11) + expvarInt22.Set(212) + expvarMap1.Set("POST", &expvarInt11) + expvarMap1.Set("GET", &expvarInt12) + expvarMap2.Set("POST", &expvarInt21) + expvarMap2.Set("GET", &expvarInt22) + expvarMap.Set("404", &expvarMap1) + expvarMap.Set("200", &expvarMap2) + // Results in the following expvar map: + // "http-request-count": {"200": {"POST": 11, "GET": 212}, "404": {"POST": 3, "GET": 13}} + + // Let's see what the scrape would yield, but exclude the memstats metrics. + metricStrings := []string{} + metric := dto.Metric{} + metricChan := make(chan prometheus.Metric) + go func() { + expvarCollector.Collect(metricChan) + close(metricChan) + }() + for m := range metricChan { + if strings.Index(m.Desc().String(), "expvar_memstats") == -1 { + metric.Reset() + m.Write(&metric) + metricStrings = append(metricStrings, metric.String()) + } + } + sort.Strings(metricStrings) + for _, s := range metricStrings { + fmt.Println(strings.TrimRight(s, " ")) + } + // Output: + // label: label: untyped: + // label: label: untyped: + // label: label: untyped: + // label: label: untyped: + // untyped: +} diff --git a/api/vendor/github.com/prometheus/client_golang/prometheus/fnv.go b/api/vendor/github.com/prometheus/client_golang/prometheus/fnv.go new file mode 100644 index 0000000..e3b67df --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/prometheus/fnv.go @@ -0,0 +1,29 @@ +package prometheus + +// Inline and byte-free variant of hash/fnv's fnv64a. + +const ( + offset64 = 14695981039346656037 + prime64 = 1099511628211 +) + +// hashNew initializies a new fnv64a hash value. +func hashNew() uint64 { + return offset64 +} + +// hashAdd adds a string to a fnv64a hash value, returning the updated hash. +func hashAdd(h uint64, s string) uint64 { + for i := 0; i < len(s); i++ { + h ^= uint64(s[i]) + h *= prime64 + } + return h +} + +// hashAddByte adds a byte to a fnv64a hash value, returning the updated hash. +func hashAddByte(h uint64, b byte) uint64 { + h ^= uint64(b) + h *= prime64 + return h +} diff --git a/api/vendor/github.com/prometheus/client_golang/prometheus/gauge.go b/api/vendor/github.com/prometheus/client_golang/prometheus/gauge.go new file mode 100644 index 0000000..8b70e51 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/prometheus/gauge.go @@ -0,0 +1,140 @@ +// Copyright 2014 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 prometheus + +// Gauge is a Metric that represents a single numerical value that can +// arbitrarily go up and down. +// +// A Gauge is typically used for measured values like temperatures or current +// memory usage, but also "counts" that can go up and down, like the number of +// running goroutines. +// +// To create Gauge instances, use NewGauge. +type Gauge interface { + Metric + Collector + + // Set sets the Gauge to an arbitrary value. + Set(float64) + // Inc increments the Gauge by 1. + Inc() + // Dec decrements the Gauge by 1. + Dec() + // Add adds the given value to the Gauge. (The value can be + // negative, resulting in a decrease of the Gauge.) + Add(float64) + // Sub subtracts the given value from the Gauge. (The value can be + // negative, resulting in an increase of the Gauge.) + Sub(float64) +} + +// GaugeOpts is an alias for Opts. See there for doc comments. +type GaugeOpts Opts + +// NewGauge creates a new Gauge based on the provided GaugeOpts. +func NewGauge(opts GaugeOpts) Gauge { + return newValue(NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), GaugeValue, 0) +} + +// GaugeVec is a Collector that bundles a set of Gauges that all share the same +// Desc, but have different values for their variable labels. This is used if +// you want to count the same thing partitioned by various dimensions +// (e.g. number of operations queued, partitioned by user and operation +// type). Create instances with NewGaugeVec. +type GaugeVec struct { + *MetricVec +} + +// NewGaugeVec creates a new GaugeVec based on the provided GaugeOpts and +// partitioned by the given label names. At least one label name must be +// provided. +func NewGaugeVec(opts GaugeOpts, labelNames []string) *GaugeVec { + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + labelNames, + opts.ConstLabels, + ) + return &GaugeVec{ + MetricVec: newMetricVec(desc, func(lvs ...string) Metric { + return newValue(desc, GaugeValue, 0, lvs...) + }), + } +} + +// GetMetricWithLabelValues replaces the method of the same name in +// MetricVec. The difference is that this method returns a Gauge and not a +// Metric so that no type conversion is required. +func (m *GaugeVec) GetMetricWithLabelValues(lvs ...string) (Gauge, error) { + metric, err := m.MetricVec.GetMetricWithLabelValues(lvs...) + if metric != nil { + return metric.(Gauge), err + } + return nil, err +} + +// GetMetricWith replaces the method of the same name in MetricVec. The +// difference is that this method returns a Gauge and not a Metric so that no +// type conversion is required. +func (m *GaugeVec) GetMetricWith(labels Labels) (Gauge, error) { + metric, err := m.MetricVec.GetMetricWith(labels) + if metric != nil { + return metric.(Gauge), err + } + return nil, err +} + +// WithLabelValues works as GetMetricWithLabelValues, but panics where +// GetMetricWithLabelValues would have returned an error. By not returning an +// error, WithLabelValues allows shortcuts like +// myVec.WithLabelValues("404", "GET").Add(42) +func (m *GaugeVec) WithLabelValues(lvs ...string) Gauge { + return m.MetricVec.WithLabelValues(lvs...).(Gauge) +} + +// With works as GetMetricWith, but panics where GetMetricWithLabels would have +// returned an error. By not returning an error, With allows shortcuts like +// myVec.With(Labels{"code": "404", "method": "GET"}).Add(42) +func (m *GaugeVec) With(labels Labels) Gauge { + return m.MetricVec.With(labels).(Gauge) +} + +// GaugeFunc is a Gauge whose value is determined at collect time by calling a +// provided function. +// +// To create GaugeFunc instances, use NewGaugeFunc. +type GaugeFunc interface { + Metric + Collector +} + +// NewGaugeFunc creates a new GaugeFunc based on the provided GaugeOpts. The +// value reported is determined by calling the given function from within the +// Write method. Take into account that metric collection may happen +// concurrently. If that results in concurrent calls to Write, like in the case +// where a GaugeFunc is directly registered with Prometheus, the provided +// function must be concurrency-safe. +func NewGaugeFunc(opts GaugeOpts, function func() float64) GaugeFunc { + return newValueFunc(NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), GaugeValue, function) +} diff --git a/api/vendor/github.com/prometheus/client_golang/prometheus/gauge_test.go b/api/vendor/github.com/prometheus/client_golang/prometheus/gauge_test.go new file mode 100644 index 0000000..48cab46 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/prometheus/gauge_test.go @@ -0,0 +1,182 @@ +// Copyright 2014 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 prometheus + +import ( + "math" + "math/rand" + "sync" + "testing" + "testing/quick" + + dto "github.com/prometheus/client_model/go" +) + +func listenGaugeStream(vals, result chan float64, done chan struct{}) { + var sum float64 +outer: + for { + select { + case <-done: + close(vals) + for v := range vals { + sum += v + } + break outer + case v := <-vals: + sum += v + } + } + result <- sum + close(result) +} + +func TestGaugeConcurrency(t *testing.T) { + it := func(n uint32) bool { + mutations := int(n % 10000) + concLevel := int(n%15 + 1) + + var start, end sync.WaitGroup + start.Add(1) + end.Add(concLevel) + + sStream := make(chan float64, mutations*concLevel) + result := make(chan float64) + done := make(chan struct{}) + + go listenGaugeStream(sStream, result, done) + go func() { + end.Wait() + close(done) + }() + + gge := NewGauge(GaugeOpts{ + Name: "test_gauge", + Help: "no help can be found here", + }) + for i := 0; i < concLevel; i++ { + vals := make([]float64, mutations) + for j := 0; j < mutations; j++ { + vals[j] = rand.Float64() - 0.5 + } + + go func(vals []float64) { + start.Wait() + for _, v := range vals { + sStream <- v + gge.Add(v) + } + end.Done() + }(vals) + } + start.Done() + + if expected, got := <-result, math.Float64frombits(gge.(*value).valBits); math.Abs(expected-got) > 0.000001 { + t.Fatalf("expected approx. %f, got %f", expected, got) + return false + } + return true + } + + if err := quick.Check(it, nil); err != nil { + t.Fatal(err) + } +} + +func TestGaugeVecConcurrency(t *testing.T) { + it := func(n uint32) bool { + mutations := int(n % 10000) + concLevel := int(n%15 + 1) + vecLength := int(n%5 + 1) + + var start, end sync.WaitGroup + start.Add(1) + end.Add(concLevel) + + sStreams := make([]chan float64, vecLength) + results := make([]chan float64, vecLength) + done := make(chan struct{}) + + for i := 0; i < vecLength; i++ { + sStreams[i] = make(chan float64, mutations*concLevel) + results[i] = make(chan float64) + go listenGaugeStream(sStreams[i], results[i], done) + } + + go func() { + end.Wait() + close(done) + }() + + gge := NewGaugeVec( + GaugeOpts{ + Name: "test_gauge", + Help: "no help can be found here", + }, + []string{"label"}, + ) + for i := 0; i < concLevel; i++ { + vals := make([]float64, mutations) + pick := make([]int, mutations) + for j := 0; j < mutations; j++ { + vals[j] = rand.Float64() - 0.5 + pick[j] = rand.Intn(vecLength) + } + + go func(vals []float64) { + start.Wait() + for i, v := range vals { + sStreams[pick[i]] <- v + gge.WithLabelValues(string('A' + pick[i])).Add(v) + } + end.Done() + }(vals) + } + start.Done() + + for i := range sStreams { + if expected, got := <-results[i], math.Float64frombits(gge.WithLabelValues(string('A'+i)).(*value).valBits); math.Abs(expected-got) > 0.000001 { + t.Fatalf("expected approx. %f, got %f", expected, got) + return false + } + } + return true + } + + if err := quick.Check(it, nil); err != nil { + t.Fatal(err) + } +} + +func TestGaugeFunc(t *testing.T) { + gf := NewGaugeFunc( + GaugeOpts{ + Name: "test_name", + Help: "test help", + ConstLabels: Labels{"a": "1", "b": "2"}, + }, + func() float64 { return 3.1415 }, + ) + + if expected, got := `Desc{fqName: "test_name", help: "test help", constLabels: {a="1",b="2"}, variableLabels: []}`, gf.Desc().String(); expected != got { + t.Errorf("expected %q, got %q", expected, got) + } + + m := &dto.Metric{} + gf.Write(m) + + if expected, got := `label: label: gauge: `, m.String(); expected != got { + t.Errorf("expected %q, got %q", expected, got) + } +} diff --git a/api/vendor/github.com/prometheus/client_golang/prometheus/go_collector.go b/api/vendor/github.com/prometheus/client_golang/prometheus/go_collector.go new file mode 100644 index 0000000..abc9d4e --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/prometheus/go_collector.go @@ -0,0 +1,263 @@ +package prometheus + +import ( + "fmt" + "runtime" + "runtime/debug" + "time" +) + +type goCollector struct { + goroutines Gauge + gcDesc *Desc + + // metrics to describe and collect + metrics memStatsMetrics +} + +// NewGoCollector returns a collector which exports metrics about the current +// go process. +func NewGoCollector() Collector { + return &goCollector{ + goroutines: NewGauge(GaugeOpts{ + Namespace: "go", + Name: "goroutines", + Help: "Number of goroutines that currently exist.", + }), + gcDesc: NewDesc( + "go_gc_duration_seconds", + "A summary of the GC invocation durations.", + nil, nil), + metrics: memStatsMetrics{ + { + desc: NewDesc( + memstatNamespace("alloc_bytes"), + "Number of bytes allocated and still in use.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.Alloc) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("alloc_bytes_total"), + "Total number of bytes allocated, even if freed.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.TotalAlloc) }, + valType: CounterValue, + }, { + desc: NewDesc( + memstatNamespace("sys_bytes"), + "Number of bytes obtained by system. Sum of all system allocations.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.Sys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("lookups_total"), + "Total number of pointer lookups.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.Lookups) }, + valType: CounterValue, + }, { + desc: NewDesc( + memstatNamespace("mallocs_total"), + "Total number of mallocs.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.Mallocs) }, + valType: CounterValue, + }, { + desc: NewDesc( + memstatNamespace("frees_total"), + "Total number of frees.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.Frees) }, + valType: CounterValue, + }, { + desc: NewDesc( + memstatNamespace("heap_alloc_bytes"), + "Number of heap bytes allocated and still in use.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapAlloc) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("heap_sys_bytes"), + "Number of heap bytes obtained from system.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("heap_idle_bytes"), + "Number of heap bytes waiting to be used.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapIdle) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("heap_inuse_bytes"), + "Number of heap bytes that are in use.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapInuse) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("heap_released_bytes_total"), + "Total number of heap bytes released to OS.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapReleased) }, + valType: CounterValue, + }, { + desc: NewDesc( + memstatNamespace("heap_objects"), + "Number of allocated objects.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapObjects) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("stack_inuse_bytes"), + "Number of bytes in use by the stack allocator.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.StackInuse) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("stack_sys_bytes"), + "Number of bytes obtained from system for stack allocator.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.StackSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("mspan_inuse_bytes"), + "Number of bytes in use by mspan structures.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.MSpanInuse) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("mspan_sys_bytes"), + "Number of bytes used for mspan structures obtained from system.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.MSpanSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("mcache_inuse_bytes"), + "Number of bytes in use by mcache structures.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.MCacheInuse) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("mcache_sys_bytes"), + "Number of bytes used for mcache structures obtained from system.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.MCacheSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("buck_hash_sys_bytes"), + "Number of bytes used by the profiling bucket hash table.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.BuckHashSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("gc_sys_bytes"), + "Number of bytes used for garbage collection system metadata.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.GCSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("other_sys_bytes"), + "Number of bytes used for other system allocations.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.OtherSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("next_gc_bytes"), + "Number of heap bytes when next garbage collection will take place.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.NextGC) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("last_gc_time_seconds"), + "Number of seconds since 1970 of last garbage collection.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.LastGC) / 1e9 }, + valType: GaugeValue, + }, + }, + } +} + +func memstatNamespace(s string) string { + return fmt.Sprintf("go_memstats_%s", s) +} + +// Describe returns all descriptions of the collector. +func (c *goCollector) Describe(ch chan<- *Desc) { + ch <- c.goroutines.Desc() + ch <- c.gcDesc + + for _, i := range c.metrics { + ch <- i.desc + } +} + +// Collect returns the current state of all metrics of the collector. +func (c *goCollector) Collect(ch chan<- Metric) { + c.goroutines.Set(float64(runtime.NumGoroutine())) + ch <- c.goroutines + + var stats debug.GCStats + stats.PauseQuantiles = make([]time.Duration, 5) + debug.ReadGCStats(&stats) + + quantiles := make(map[float64]float64) + for idx, pq := range stats.PauseQuantiles[1:] { + quantiles[float64(idx+1)/float64(len(stats.PauseQuantiles)-1)] = pq.Seconds() + } + quantiles[0.0] = stats.PauseQuantiles[0].Seconds() + ch <- MustNewConstSummary(c.gcDesc, uint64(stats.NumGC), float64(stats.PauseTotal.Seconds()), quantiles) + + ms := &runtime.MemStats{} + runtime.ReadMemStats(ms) + for _, i := range c.metrics { + ch <- MustNewConstMetric(i.desc, i.valType, i.eval(ms)) + } +} + +// memStatsMetrics provide description, value, and value type for memstat metrics. +type memStatsMetrics []struct { + desc *Desc + eval func(*runtime.MemStats) float64 + valType ValueType +} diff --git a/api/vendor/github.com/prometheus/client_golang/prometheus/go_collector_test.go b/api/vendor/github.com/prometheus/client_golang/prometheus/go_collector_test.go new file mode 100644 index 0000000..9a8858c --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/prometheus/go_collector_test.go @@ -0,0 +1,123 @@ +package prometheus + +import ( + "runtime" + "testing" + "time" + + dto "github.com/prometheus/client_model/go" +) + +func TestGoCollector(t *testing.T) { + var ( + c = NewGoCollector() + ch = make(chan Metric) + waitc = make(chan struct{}) + closec = make(chan struct{}) + old = -1 + ) + defer close(closec) + + go func() { + c.Collect(ch) + go func(c <-chan struct{}) { + <-c + }(closec) + <-waitc + c.Collect(ch) + }() + + for { + select { + case metric := <-ch: + switch m := metric.(type) { + // Attention, this also catches Counter... + case Gauge: + pb := &dto.Metric{} + m.Write(pb) + if pb.GetGauge() == nil { + continue + } + + if old == -1 { + old = int(pb.GetGauge().GetValue()) + close(waitc) + continue + } + + if diff := int(pb.GetGauge().GetValue()) - old; diff != 1 { + // TODO: This is flaky in highly concurrent situations. + t.Errorf("want 1 new goroutine, got %d", diff) + } + + // GoCollector performs two sends per call. + // On line 27 we need to receive the second send + // to shut down cleanly. + <-ch + return + } + case <-time.After(1 * time.Second): + t.Fatalf("expected collect timed out") + } + } +} + +func TestGCCollector(t *testing.T) { + var ( + c = NewGoCollector() + ch = make(chan Metric) + waitc = make(chan struct{}) + closec = make(chan struct{}) + oldGC uint64 + oldPause float64 + ) + defer close(closec) + + go func() { + c.Collect(ch) + // force GC + runtime.GC() + <-waitc + c.Collect(ch) + }() + + first := true + for { + select { + case metric := <-ch: + switch m := metric.(type) { + case *constSummary, *value: + pb := &dto.Metric{} + m.Write(pb) + if pb.GetSummary() == nil { + continue + } + + if len(pb.GetSummary().Quantile) != 5 { + t.Errorf("expected 4 buckets, got %d", len(pb.GetSummary().Quantile)) + } + for idx, want := range []float64{0.0, 0.25, 0.5, 0.75, 1.0} { + if *pb.GetSummary().Quantile[idx].Quantile != want { + t.Errorf("bucket #%d is off, got %f, want %f", idx, *pb.GetSummary().Quantile[idx].Quantile, want) + } + } + if first { + first = false + oldGC = *pb.GetSummary().SampleCount + oldPause = *pb.GetSummary().SampleSum + close(waitc) + continue + } + if diff := *pb.GetSummary().SampleCount - oldGC; diff != 1 { + t.Errorf("want 1 new garbage collection run, got %d", diff) + } + if diff := *pb.GetSummary().SampleSum - oldPause; diff <= 0 { + t.Errorf("want moar pause, got %f", diff) + } + return + } + case <-time.After(1 * time.Second): + t.Fatalf("expected collect timed out") + } + } +} diff --git a/api/vendor/github.com/prometheus/client_golang/prometheus/histogram.go b/api/vendor/github.com/prometheus/client_golang/prometheus/histogram.go new file mode 100644 index 0000000..9719e8f --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/prometheus/histogram.go @@ -0,0 +1,444 @@ +// Copyright 2015 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 prometheus + +import ( + "fmt" + "math" + "sort" + "sync/atomic" + + "github.com/golang/protobuf/proto" + + dto "github.com/prometheus/client_model/go" +) + +// A Histogram counts individual observations from an event or sample stream in +// configurable buckets. Similar to a summary, it also provides a sum of +// observations and an observation count. +// +// On the Prometheus server, quantiles can be calculated from a Histogram using +// the histogram_quantile function in the query language. +// +// Note that Histograms, in contrast to Summaries, can be aggregated with the +// Prometheus query language (see the documentation for detailed +// procedures). However, Histograms require the user to pre-define suitable +// buckets, and they are in general less accurate. The Observe method of a +// Histogram has a very low performance overhead in comparison with the Observe +// method of a Summary. +// +// To create Histogram instances, use NewHistogram. +type Histogram interface { + Metric + Collector + + // Observe adds a single observation to the histogram. + Observe(float64) +} + +// bucketLabel is used for the label that defines the upper bound of a +// bucket of a histogram ("le" -> "less or equal"). +const bucketLabel = "le" + +// DefBuckets are the default Histogram buckets. The default buckets are +// tailored to broadly measure the response time (in seconds) of a network +// service. Most likely, however, you will be required to define buckets +// customized to your use case. +var ( + DefBuckets = []float64{.005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5, 10} + + errBucketLabelNotAllowed = fmt.Errorf( + "%q is not allowed as label name in histograms", bucketLabel, + ) +) + +// LinearBuckets creates 'count' buckets, each 'width' wide, where the lowest +// bucket has an upper bound of 'start'. The final +Inf bucket is not counted +// and not included in the returned slice. The returned slice is meant to be +// used for the Buckets field of HistogramOpts. +// +// The function panics if 'count' is zero or negative. +func LinearBuckets(start, width float64, count int) []float64 { + if count < 1 { + panic("LinearBuckets needs a positive count") + } + buckets := make([]float64, count) + for i := range buckets { + buckets[i] = start + start += width + } + return buckets +} + +// ExponentialBuckets creates 'count' buckets, where the lowest bucket has an +// upper bound of 'start' and each following bucket's upper bound is 'factor' +// times the previous bucket's upper bound. The final +Inf bucket is not counted +// and not included in the returned slice. The returned slice is meant to be +// used for the Buckets field of HistogramOpts. +// +// The function panics if 'count' is 0 or negative, if 'start' is 0 or negative, +// or if 'factor' is less than or equal 1. +func ExponentialBuckets(start, factor float64, count int) []float64 { + if count < 1 { + panic("ExponentialBuckets needs a positive count") + } + if start <= 0 { + panic("ExponentialBuckets needs a positive start value") + } + if factor <= 1 { + panic("ExponentialBuckets needs a factor greater than 1") + } + buckets := make([]float64, count) + for i := range buckets { + buckets[i] = start + start *= factor + } + return buckets +} + +// HistogramOpts bundles the options for creating a Histogram metric. It is +// mandatory to set Name and Help to a non-empty string. All other fields are +// optional and can safely be left at their zero value. +type HistogramOpts struct { + // Namespace, Subsystem, and Name are components of the fully-qualified + // name of the Histogram (created by joining these components with + // "_"). Only Name is mandatory, the others merely help structuring the + // name. Note that the fully-qualified name of the Histogram must be a + // valid Prometheus metric name. + Namespace string + Subsystem string + Name string + + // Help provides information about this Histogram. Mandatory! + // + // Metrics with the same fully-qualified name must have the same Help + // string. + Help string + + // ConstLabels are used to attach fixed labels to this + // Histogram. Histograms with the same fully-qualified name must have the + // same label names in their ConstLabels. + // + // Note that in most cases, labels have a value that varies during the + // lifetime of a process. Those labels are usually managed with a + // HistogramVec. ConstLabels serve only special purposes. One is for the + // special case where the value of a label does not change during the + // lifetime of a process, e.g. if the revision of the running binary is + // put into a label. Another, more advanced purpose is if more than one + // Collector needs to collect Histograms with the same fully-qualified + // name. In that case, those Summaries must differ in the values of + // their ConstLabels. See the Collector examples. + // + // If the value of a label never changes (not even between binaries), + // that label most likely should not be a label at all (but part of the + // metric name). + ConstLabels Labels + + // Buckets defines the buckets into which observations are counted. Each + // element in the slice is the upper inclusive bound of a bucket. The + // values must be sorted in strictly increasing order. There is no need + // to add a highest bucket with +Inf bound, it will be added + // implicitly. The default value is DefBuckets. + Buckets []float64 +} + +// NewHistogram creates a new Histogram based on the provided HistogramOpts. It +// panics if the buckets in HistogramOpts are not in strictly increasing order. +func NewHistogram(opts HistogramOpts) Histogram { + return newHistogram( + NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), + opts, + ) +} + +func newHistogram(desc *Desc, opts HistogramOpts, labelValues ...string) Histogram { + if len(desc.variableLabels) != len(labelValues) { + panic(errInconsistentCardinality) + } + + for _, n := range desc.variableLabels { + if n == bucketLabel { + panic(errBucketLabelNotAllowed) + } + } + for _, lp := range desc.constLabelPairs { + if lp.GetName() == bucketLabel { + panic(errBucketLabelNotAllowed) + } + } + + if len(opts.Buckets) == 0 { + opts.Buckets = DefBuckets + } + + h := &histogram{ + desc: desc, + upperBounds: opts.Buckets, + labelPairs: makeLabelPairs(desc, labelValues), + } + for i, upperBound := range h.upperBounds { + if i < len(h.upperBounds)-1 { + if upperBound >= h.upperBounds[i+1] { + panic(fmt.Errorf( + "histogram buckets must be in increasing order: %f >= %f", + upperBound, h.upperBounds[i+1], + )) + } + } else { + if math.IsInf(upperBound, +1) { + // The +Inf bucket is implicit. Remove it here. + h.upperBounds = h.upperBounds[:i] + } + } + } + // Finally we know the final length of h.upperBounds and can make counts. + h.counts = make([]uint64, len(h.upperBounds)) + + h.init(h) // Init self-collection. + return h +} + +type histogram struct { + // sumBits contains the bits of the float64 representing the sum of all + // observations. sumBits and count have to go first in the struct to + // guarantee alignment for atomic operations. + // http://golang.org/pkg/sync/atomic/#pkg-note-BUG + sumBits uint64 + count uint64 + + selfCollector + // Note that there is no mutex required. + + desc *Desc + + upperBounds []float64 + counts []uint64 + + labelPairs []*dto.LabelPair +} + +func (h *histogram) Desc() *Desc { + return h.desc +} + +func (h *histogram) Observe(v float64) { + // TODO(beorn7): For small numbers of buckets (<30), a linear search is + // slightly faster than the binary search. If we really care, we could + // switch from one search strategy to the other depending on the number + // of buckets. + // + // Microbenchmarks (BenchmarkHistogramNoLabels): + // 11 buckets: 38.3 ns/op linear - binary 48.7 ns/op + // 100 buckets: 78.1 ns/op linear - binary 54.9 ns/op + // 300 buckets: 154 ns/op linear - binary 61.6 ns/op + i := sort.SearchFloat64s(h.upperBounds, v) + if i < len(h.counts) { + atomic.AddUint64(&h.counts[i], 1) + } + atomic.AddUint64(&h.count, 1) + for { + oldBits := atomic.LoadUint64(&h.sumBits) + newBits := math.Float64bits(math.Float64frombits(oldBits) + v) + if atomic.CompareAndSwapUint64(&h.sumBits, oldBits, newBits) { + break + } + } +} + +func (h *histogram) Write(out *dto.Metric) error { + his := &dto.Histogram{} + buckets := make([]*dto.Bucket, len(h.upperBounds)) + + his.SampleSum = proto.Float64(math.Float64frombits(atomic.LoadUint64(&h.sumBits))) + his.SampleCount = proto.Uint64(atomic.LoadUint64(&h.count)) + var count uint64 + for i, upperBound := range h.upperBounds { + count += atomic.LoadUint64(&h.counts[i]) + buckets[i] = &dto.Bucket{ + CumulativeCount: proto.Uint64(count), + UpperBound: proto.Float64(upperBound), + } + } + his.Bucket = buckets + out.Histogram = his + out.Label = h.labelPairs + return nil +} + +// HistogramVec is a Collector that bundles a set of Histograms that all share the +// same Desc, but have different values for their variable labels. This is used +// if you want to count the same thing partitioned by various dimensions +// (e.g. HTTP request latencies, partitioned by status code and method). Create +// instances with NewHistogramVec. +type HistogramVec struct { + *MetricVec +} + +// NewHistogramVec creates a new HistogramVec based on the provided HistogramOpts and +// partitioned by the given label names. At least one label name must be +// provided. +func NewHistogramVec(opts HistogramOpts, labelNames []string) *HistogramVec { + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + labelNames, + opts.ConstLabels, + ) + return &HistogramVec{ + MetricVec: newMetricVec(desc, func(lvs ...string) Metric { + return newHistogram(desc, opts, lvs...) + }), + } +} + +// GetMetricWithLabelValues replaces the method of the same name in +// MetricVec. The difference is that this method returns a Histogram and not a +// Metric so that no type conversion is required. +func (m *HistogramVec) GetMetricWithLabelValues(lvs ...string) (Histogram, error) { + metric, err := m.MetricVec.GetMetricWithLabelValues(lvs...) + if metric != nil { + return metric.(Histogram), err + } + return nil, err +} + +// GetMetricWith replaces the method of the same name in MetricVec. The +// difference is that this method returns a Histogram and not a Metric so that no +// type conversion is required. +func (m *HistogramVec) GetMetricWith(labels Labels) (Histogram, error) { + metric, err := m.MetricVec.GetMetricWith(labels) + if metric != nil { + return metric.(Histogram), err + } + return nil, err +} + +// WithLabelValues works as GetMetricWithLabelValues, but panics where +// GetMetricWithLabelValues would have returned an error. By not returning an +// error, WithLabelValues allows shortcuts like +// myVec.WithLabelValues("404", "GET").Observe(42.21) +func (m *HistogramVec) WithLabelValues(lvs ...string) Histogram { + return m.MetricVec.WithLabelValues(lvs...).(Histogram) +} + +// With works as GetMetricWith, but panics where GetMetricWithLabels would have +// returned an error. By not returning an error, With allows shortcuts like +// myVec.With(Labels{"code": "404", "method": "GET"}).Observe(42.21) +func (m *HistogramVec) With(labels Labels) Histogram { + return m.MetricVec.With(labels).(Histogram) +} + +type constHistogram struct { + desc *Desc + count uint64 + sum float64 + buckets map[float64]uint64 + labelPairs []*dto.LabelPair +} + +func (h *constHistogram) Desc() *Desc { + return h.desc +} + +func (h *constHistogram) Write(out *dto.Metric) error { + his := &dto.Histogram{} + buckets := make([]*dto.Bucket, 0, len(h.buckets)) + + his.SampleCount = proto.Uint64(h.count) + his.SampleSum = proto.Float64(h.sum) + + for upperBound, count := range h.buckets { + buckets = append(buckets, &dto.Bucket{ + CumulativeCount: proto.Uint64(count), + UpperBound: proto.Float64(upperBound), + }) + } + + if len(buckets) > 0 { + sort.Sort(buckSort(buckets)) + } + his.Bucket = buckets + + out.Histogram = his + out.Label = h.labelPairs + + return nil +} + +// NewConstHistogram returns a metric representing a Prometheus histogram with +// fixed values for the count, sum, and bucket counts. As those parameters +// cannot be changed, the returned value does not implement the Histogram +// interface (but only the Metric interface). Users of this package will not +// have much use for it in regular operations. However, when implementing custom +// Collectors, it is useful as a throw-away metric that is generated on the fly +// to send it to Prometheus in the Collect method. +// +// buckets is a map of upper bounds to cumulative counts, excluding the +Inf +// bucket. +// +// NewConstHistogram returns an error if the length of labelValues is not +// consistent with the variable labels in Desc. +func NewConstHistogram( + desc *Desc, + count uint64, + sum float64, + buckets map[float64]uint64, + labelValues ...string, +) (Metric, error) { + if len(desc.variableLabels) != len(labelValues) { + return nil, errInconsistentCardinality + } + return &constHistogram{ + desc: desc, + count: count, + sum: sum, + buckets: buckets, + labelPairs: makeLabelPairs(desc, labelValues), + }, nil +} + +// MustNewConstHistogram is a version of NewConstHistogram that panics where +// NewConstMetric would have returned an error. +func MustNewConstHistogram( + desc *Desc, + count uint64, + sum float64, + buckets map[float64]uint64, + labelValues ...string, +) Metric { + m, err := NewConstHistogram(desc, count, sum, buckets, labelValues...) + if err != nil { + panic(err) + } + return m +} + +type buckSort []*dto.Bucket + +func (s buckSort) Len() int { + return len(s) +} + +func (s buckSort) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s buckSort) Less(i, j int) bool { + return s[i].GetUpperBound() < s[j].GetUpperBound() +} diff --git a/api/vendor/github.com/prometheus/client_golang/prometheus/histogram_test.go b/api/vendor/github.com/prometheus/client_golang/prometheus/histogram_test.go new file mode 100644 index 0000000..d1242e0 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/prometheus/histogram_test.go @@ -0,0 +1,326 @@ +// Copyright 2015 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 prometheus + +import ( + "math" + "math/rand" + "reflect" + "sort" + "sync" + "testing" + "testing/quick" + + dto "github.com/prometheus/client_model/go" +) + +func benchmarkHistogramObserve(w int, b *testing.B) { + b.StopTimer() + + wg := new(sync.WaitGroup) + wg.Add(w) + + g := new(sync.WaitGroup) + g.Add(1) + + s := NewHistogram(HistogramOpts{}) + + for i := 0; i < w; i++ { + go func() { + g.Wait() + + for i := 0; i < b.N; i++ { + s.Observe(float64(i)) + } + + wg.Done() + }() + } + + b.StartTimer() + g.Done() + wg.Wait() +} + +func BenchmarkHistogramObserve1(b *testing.B) { + benchmarkHistogramObserve(1, b) +} + +func BenchmarkHistogramObserve2(b *testing.B) { + benchmarkHistogramObserve(2, b) +} + +func BenchmarkHistogramObserve4(b *testing.B) { + benchmarkHistogramObserve(4, b) +} + +func BenchmarkHistogramObserve8(b *testing.B) { + benchmarkHistogramObserve(8, b) +} + +func benchmarkHistogramWrite(w int, b *testing.B) { + b.StopTimer() + + wg := new(sync.WaitGroup) + wg.Add(w) + + g := new(sync.WaitGroup) + g.Add(1) + + s := NewHistogram(HistogramOpts{}) + + for i := 0; i < 1000000; i++ { + s.Observe(float64(i)) + } + + for j := 0; j < w; j++ { + outs := make([]dto.Metric, b.N) + + go func(o []dto.Metric) { + g.Wait() + + for i := 0; i < b.N; i++ { + s.Write(&o[i]) + } + + wg.Done() + }(outs) + } + + b.StartTimer() + g.Done() + wg.Wait() +} + +func BenchmarkHistogramWrite1(b *testing.B) { + benchmarkHistogramWrite(1, b) +} + +func BenchmarkHistogramWrite2(b *testing.B) { + benchmarkHistogramWrite(2, b) +} + +func BenchmarkHistogramWrite4(b *testing.B) { + benchmarkHistogramWrite(4, b) +} + +func BenchmarkHistogramWrite8(b *testing.B) { + benchmarkHistogramWrite(8, b) +} + +// Intentionally adding +Inf here to test if that case is handled correctly. +// Also, getCumulativeCounts depends on it. +var testBuckets = []float64{-2, -1, -0.5, 0, 0.5, 1, 2, math.Inf(+1)} + +func TestHistogramConcurrency(t *testing.T) { + if testing.Short() { + t.Skip("Skipping test in short mode.") + } + + rand.Seed(42) + + it := func(n uint32) bool { + mutations := int(n%1e4 + 1e4) + concLevel := int(n%5 + 1) + total := mutations * concLevel + + var start, end sync.WaitGroup + start.Add(1) + end.Add(concLevel) + + sum := NewHistogram(HistogramOpts{ + Name: "test_histogram", + Help: "helpless", + Buckets: testBuckets, + }) + + allVars := make([]float64, total) + var sampleSum float64 + for i := 0; i < concLevel; i++ { + vals := make([]float64, mutations) + for j := 0; j < mutations; j++ { + v := rand.NormFloat64() + vals[j] = v + allVars[i*mutations+j] = v + sampleSum += v + } + + go func(vals []float64) { + start.Wait() + for _, v := range vals { + sum.Observe(v) + } + end.Done() + }(vals) + } + sort.Float64s(allVars) + start.Done() + end.Wait() + + m := &dto.Metric{} + sum.Write(m) + if got, want := int(*m.Histogram.SampleCount), total; got != want { + t.Errorf("got sample count %d, want %d", got, want) + } + if got, want := *m.Histogram.SampleSum, sampleSum; math.Abs((got-want)/want) > 0.001 { + t.Errorf("got sample sum %f, want %f", got, want) + } + + wantCounts := getCumulativeCounts(allVars) + + if got, want := len(m.Histogram.Bucket), len(testBuckets)-1; got != want { + t.Errorf("got %d buckets in protobuf, want %d", got, want) + } + for i, wantBound := range testBuckets { + if i == len(testBuckets)-1 { + break // No +Inf bucket in protobuf. + } + if gotBound := *m.Histogram.Bucket[i].UpperBound; gotBound != wantBound { + t.Errorf("got bound %f, want %f", gotBound, wantBound) + } + if gotCount, wantCount := *m.Histogram.Bucket[i].CumulativeCount, wantCounts[i]; gotCount != wantCount { + t.Errorf("got count %d, want %d", gotCount, wantCount) + } + } + return true + } + + if err := quick.Check(it, nil); err != nil { + t.Error(err) + } +} + +func TestHistogramVecConcurrency(t *testing.T) { + if testing.Short() { + t.Skip("Skipping test in short mode.") + } + + rand.Seed(42) + + objectives := make([]float64, 0, len(DefObjectives)) + for qu := range DefObjectives { + + objectives = append(objectives, qu) + } + sort.Float64s(objectives) + + it := func(n uint32) bool { + mutations := int(n%1e4 + 1e4) + concLevel := int(n%7 + 1) + vecLength := int(n%3 + 1) + + var start, end sync.WaitGroup + start.Add(1) + end.Add(concLevel) + + his := NewHistogramVec( + HistogramOpts{ + Name: "test_histogram", + Help: "helpless", + Buckets: []float64{-2, -1, -0.5, 0, 0.5, 1, 2, math.Inf(+1)}, + }, + []string{"label"}, + ) + + allVars := make([][]float64, vecLength) + sampleSums := make([]float64, vecLength) + for i := 0; i < concLevel; i++ { + vals := make([]float64, mutations) + picks := make([]int, mutations) + for j := 0; j < mutations; j++ { + v := rand.NormFloat64() + vals[j] = v + pick := rand.Intn(vecLength) + picks[j] = pick + allVars[pick] = append(allVars[pick], v) + sampleSums[pick] += v + } + + go func(vals []float64) { + start.Wait() + for i, v := range vals { + his.WithLabelValues(string('A' + picks[i])).Observe(v) + } + end.Done() + }(vals) + } + for _, vars := range allVars { + sort.Float64s(vars) + } + start.Done() + end.Wait() + + for i := 0; i < vecLength; i++ { + m := &dto.Metric{} + s := his.WithLabelValues(string('A' + i)) + s.Write(m) + + if got, want := len(m.Histogram.Bucket), len(testBuckets)-1; got != want { + t.Errorf("got %d buckets in protobuf, want %d", got, want) + } + if got, want := int(*m.Histogram.SampleCount), len(allVars[i]); got != want { + t.Errorf("got sample count %d, want %d", got, want) + } + if got, want := *m.Histogram.SampleSum, sampleSums[i]; math.Abs((got-want)/want) > 0.001 { + t.Errorf("got sample sum %f, want %f", got, want) + } + + wantCounts := getCumulativeCounts(allVars[i]) + + for j, wantBound := range testBuckets { + if j == len(testBuckets)-1 { + break // No +Inf bucket in protobuf. + } + if gotBound := *m.Histogram.Bucket[j].UpperBound; gotBound != wantBound { + t.Errorf("got bound %f, want %f", gotBound, wantBound) + } + if gotCount, wantCount := *m.Histogram.Bucket[j].CumulativeCount, wantCounts[j]; gotCount != wantCount { + t.Errorf("got count %d, want %d", gotCount, wantCount) + } + } + } + return true + } + + if err := quick.Check(it, nil); err != nil { + t.Error(err) + } +} + +func getCumulativeCounts(vars []float64) []uint64 { + counts := make([]uint64, len(testBuckets)) + for _, v := range vars { + for i := len(testBuckets) - 1; i >= 0; i-- { + if v > testBuckets[i] { + break + } + counts[i]++ + } + } + return counts +} + +func TestBuckets(t *testing.T) { + got := LinearBuckets(-15, 5, 6) + want := []float64{-15, -10, -5, 0, 5, 10} + if !reflect.DeepEqual(got, want) { + t.Errorf("linear buckets: got %v, want %v", got, want) + } + + got = ExponentialBuckets(100, 1.2, 3) + want = []float64{100, 120, 144} + if !reflect.DeepEqual(got, want) { + t.Errorf("linear buckets: got %v, want %v", got, want) + } +} diff --git a/api/vendor/github.com/prometheus/client_golang/prometheus/http.go b/api/vendor/github.com/prometheus/client_golang/prometheus/http.go new file mode 100644 index 0000000..67ee5ac --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/prometheus/http.go @@ -0,0 +1,490 @@ +// Copyright 2014 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 prometheus + +import ( + "bufio" + "bytes" + "compress/gzip" + "fmt" + "io" + "net" + "net/http" + "strconv" + "strings" + "sync" + "time" + + "github.com/prometheus/common/expfmt" +) + +// TODO(beorn7): Remove this whole file. It is a partial mirror of +// promhttp/http.go (to avoid circular import chains) where everything HTTP +// related should live. The functions here are just for avoiding +// breakage. Everything is deprecated. + +const ( + contentTypeHeader = "Content-Type" + contentLengthHeader = "Content-Length" + contentEncodingHeader = "Content-Encoding" + acceptEncodingHeader = "Accept-Encoding" +) + +var bufPool sync.Pool + +func getBuf() *bytes.Buffer { + buf := bufPool.Get() + if buf == nil { + return &bytes.Buffer{} + } + return buf.(*bytes.Buffer) +} + +func giveBuf(buf *bytes.Buffer) { + buf.Reset() + bufPool.Put(buf) +} + +// Handler returns an HTTP handler for the DefaultGatherer. It is +// already instrumented with InstrumentHandler (using "prometheus" as handler +// name). +// +// Deprecated: Please note the issues described in the doc comment of +// InstrumentHandler. You might want to consider using promhttp.Handler instead +// (which is non instrumented). +func Handler() http.Handler { + return InstrumentHandler("prometheus", UninstrumentedHandler()) +} + +// UninstrumentedHandler returns an HTTP handler for the DefaultGatherer. +// +// Deprecated: Use promhttp.Handler instead. See there for further documentation. +func UninstrumentedHandler() http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + mfs, err := DefaultGatherer.Gather() + if err != nil { + http.Error(w, "An error has occurred during metrics collection:\n\n"+err.Error(), http.StatusInternalServerError) + return + } + + contentType := expfmt.Negotiate(req.Header) + buf := getBuf() + defer giveBuf(buf) + writer, encoding := decorateWriter(req, buf) + enc := expfmt.NewEncoder(writer, contentType) + var lastErr error + for _, mf := range mfs { + if err := enc.Encode(mf); err != nil { + lastErr = err + http.Error(w, "An error has occurred during metrics encoding:\n\n"+err.Error(), http.StatusInternalServerError) + return + } + } + if closer, ok := writer.(io.Closer); ok { + closer.Close() + } + if lastErr != nil && buf.Len() == 0 { + http.Error(w, "No metrics encoded, last error:\n\n"+err.Error(), http.StatusInternalServerError) + return + } + header := w.Header() + header.Set(contentTypeHeader, string(contentType)) + header.Set(contentLengthHeader, fmt.Sprint(buf.Len())) + if encoding != "" { + header.Set(contentEncodingHeader, encoding) + } + w.Write(buf.Bytes()) + }) +} + +// decorateWriter wraps a writer to handle gzip compression if requested. It +// returns the decorated writer and the appropriate "Content-Encoding" header +// (which is empty if no compression is enabled). +func decorateWriter(request *http.Request, writer io.Writer) (io.Writer, string) { + header := request.Header.Get(acceptEncodingHeader) + parts := strings.Split(header, ",") + for _, part := range parts { + part := strings.TrimSpace(part) + if part == "gzip" || strings.HasPrefix(part, "gzip;") { + return gzip.NewWriter(writer), "gzip" + } + } + return writer, "" +} + +var instLabels = []string{"method", "code"} + +type nower interface { + Now() time.Time +} + +type nowFunc func() time.Time + +func (n nowFunc) Now() time.Time { + return n() +} + +var now nower = nowFunc(func() time.Time { + return time.Now() +}) + +func nowSeries(t ...time.Time) nower { + return nowFunc(func() time.Time { + defer func() { + t = t[1:] + }() + + return t[0] + }) +} + +// InstrumentHandler wraps the given HTTP handler for instrumentation. It +// registers four metric collectors (if not already done) and reports HTTP +// metrics to the (newly or already) registered collectors: http_requests_total +// (CounterVec), http_request_duration_microseconds (Summary), +// http_request_size_bytes (Summary), http_response_size_bytes (Summary). Each +// has a constant label named "handler" with the provided handlerName as +// value. http_requests_total is a metric vector partitioned by HTTP method +// (label name "method") and HTTP status code (label name "code"). +// +// Deprecated: InstrumentHandler has several issues: +// +// - It uses Summaries rather than Histograms. Summaries are not useful if +// aggregation across multiple instances is required. +// +// - It uses microseconds as unit, which is deprecated and should be replaced by +// seconds. +// +// - The size of the request is calculated in a separate goroutine. Since this +// calculator requires access to the request header, it creates a race with +// any writes to the header performed during request handling. +// httputil.ReverseProxy is a prominent example for a handler +// performing such writes. +// +// Upcoming versions of this package will provide ways of instrumenting HTTP +// handlers that are more flexible and have fewer issues. Please prefer direct +// instrumentation in the meantime. +func InstrumentHandler(handlerName string, handler http.Handler) http.HandlerFunc { + return InstrumentHandlerFunc(handlerName, handler.ServeHTTP) +} + +// InstrumentHandlerFunc wraps the given function for instrumentation. It +// otherwise works in the same way as InstrumentHandler (and shares the same +// issues). +// +// Deprecated: InstrumentHandlerFunc is deprecated for the same reasons as +// InstrumentHandler is. +func InstrumentHandlerFunc(handlerName string, handlerFunc func(http.ResponseWriter, *http.Request)) http.HandlerFunc { + return InstrumentHandlerFuncWithOpts( + SummaryOpts{ + Subsystem: "http", + ConstLabels: Labels{"handler": handlerName}, + }, + handlerFunc, + ) +} + +// InstrumentHandlerWithOpts works like InstrumentHandler (and shares the same +// issues) but provides more flexibility (at the cost of a more complex call +// syntax). As InstrumentHandler, this function registers four metric +// collectors, but it uses the provided SummaryOpts to create them. However, the +// fields "Name" and "Help" in the SummaryOpts are ignored. "Name" is replaced +// by "requests_total", "request_duration_microseconds", "request_size_bytes", +// and "response_size_bytes", respectively. "Help" is replaced by an appropriate +// help string. The names of the variable labels of the http_requests_total +// CounterVec are "method" (get, post, etc.), and "code" (HTTP status code). +// +// If InstrumentHandlerWithOpts is called as follows, it mimics exactly the +// behavior of InstrumentHandler: +// +// prometheus.InstrumentHandlerWithOpts( +// prometheus.SummaryOpts{ +// Subsystem: "http", +// ConstLabels: prometheus.Labels{"handler": handlerName}, +// }, +// handler, +// ) +// +// Technical detail: "requests_total" is a CounterVec, not a SummaryVec, so it +// cannot use SummaryOpts. Instead, a CounterOpts struct is created internally, +// and all its fields are set to the equally named fields in the provided +// SummaryOpts. +// +// Deprecated: InstrumentHandlerWithOpts is deprecated for the same reasons as +// InstrumentHandler is. +func InstrumentHandlerWithOpts(opts SummaryOpts, handler http.Handler) http.HandlerFunc { + return InstrumentHandlerFuncWithOpts(opts, handler.ServeHTTP) +} + +// InstrumentHandlerFuncWithOpts works like InstrumentHandlerFunc (and shares +// the same issues) but provides more flexibility (at the cost of a more complex +// call syntax). See InstrumentHandlerWithOpts for details how the provided +// SummaryOpts are used. +// +// Deprecated: InstrumentHandlerFuncWithOpts is deprecated for the same reasons +// as InstrumentHandler is. +func InstrumentHandlerFuncWithOpts(opts SummaryOpts, handlerFunc func(http.ResponseWriter, *http.Request)) http.HandlerFunc { + reqCnt := NewCounterVec( + CounterOpts{ + Namespace: opts.Namespace, + Subsystem: opts.Subsystem, + Name: "requests_total", + Help: "Total number of HTTP requests made.", + ConstLabels: opts.ConstLabels, + }, + instLabels, + ) + + opts.Name = "request_duration_microseconds" + opts.Help = "The HTTP request latencies in microseconds." + reqDur := NewSummary(opts) + + opts.Name = "request_size_bytes" + opts.Help = "The HTTP request sizes in bytes." + reqSz := NewSummary(opts) + + opts.Name = "response_size_bytes" + opts.Help = "The HTTP response sizes in bytes." + resSz := NewSummary(opts) + + regReqCnt := MustRegisterOrGet(reqCnt).(*CounterVec) + regReqDur := MustRegisterOrGet(reqDur).(Summary) + regReqSz := MustRegisterOrGet(reqSz).(Summary) + regResSz := MustRegisterOrGet(resSz).(Summary) + + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + now := time.Now() + + delegate := &responseWriterDelegator{ResponseWriter: w} + out := make(chan int) + urlLen := 0 + if r.URL != nil { + urlLen = len(r.URL.String()) + } + go computeApproximateRequestSize(r, out, urlLen) + + _, cn := w.(http.CloseNotifier) + _, fl := w.(http.Flusher) + _, hj := w.(http.Hijacker) + _, rf := w.(io.ReaderFrom) + var rw http.ResponseWriter + if cn && fl && hj && rf { + rw = &fancyResponseWriterDelegator{delegate} + } else { + rw = delegate + } + handlerFunc(rw, r) + + elapsed := float64(time.Since(now)) / float64(time.Microsecond) + + method := sanitizeMethod(r.Method) + code := sanitizeCode(delegate.status) + regReqCnt.WithLabelValues(method, code).Inc() + regReqDur.Observe(elapsed) + regResSz.Observe(float64(delegate.written)) + regReqSz.Observe(float64(<-out)) + }) +} + +func computeApproximateRequestSize(r *http.Request, out chan int, s int) { + s += len(r.Method) + s += len(r.Proto) + for name, values := range r.Header { + s += len(name) + for _, value := range values { + s += len(value) + } + } + s += len(r.Host) + + // N.B. r.Form and r.MultipartForm are assumed to be included in r.URL. + + if r.ContentLength != -1 { + s += int(r.ContentLength) + } + out <- s +} + +type responseWriterDelegator struct { + http.ResponseWriter + + handler, method string + status int + written int64 + wroteHeader bool +} + +func (r *responseWriterDelegator) WriteHeader(code int) { + r.status = code + r.wroteHeader = true + r.ResponseWriter.WriteHeader(code) +} + +func (r *responseWriterDelegator) Write(b []byte) (int, error) { + if !r.wroteHeader { + r.WriteHeader(http.StatusOK) + } + n, err := r.ResponseWriter.Write(b) + r.written += int64(n) + return n, err +} + +type fancyResponseWriterDelegator struct { + *responseWriterDelegator +} + +func (f *fancyResponseWriterDelegator) CloseNotify() <-chan bool { + return f.ResponseWriter.(http.CloseNotifier).CloseNotify() +} + +func (f *fancyResponseWriterDelegator) Flush() { + f.ResponseWriter.(http.Flusher).Flush() +} + +func (f *fancyResponseWriterDelegator) Hijack() (net.Conn, *bufio.ReadWriter, error) { + return f.ResponseWriter.(http.Hijacker).Hijack() +} + +func (f *fancyResponseWriterDelegator) ReadFrom(r io.Reader) (int64, error) { + if !f.wroteHeader { + f.WriteHeader(http.StatusOK) + } + n, err := f.ResponseWriter.(io.ReaderFrom).ReadFrom(r) + f.written += n + return n, err +} + +func sanitizeMethod(m string) string { + switch m { + case "GET", "get": + return "get" + case "PUT", "put": + return "put" + case "HEAD", "head": + return "head" + case "POST", "post": + return "post" + case "DELETE", "delete": + return "delete" + case "CONNECT", "connect": + return "connect" + case "OPTIONS", "options": + return "options" + case "NOTIFY", "notify": + return "notify" + default: + return strings.ToLower(m) + } +} + +func sanitizeCode(s int) string { + switch s { + case 100: + return "100" + case 101: + return "101" + + case 200: + return "200" + case 201: + return "201" + case 202: + return "202" + case 203: + return "203" + case 204: + return "204" + case 205: + return "205" + case 206: + return "206" + + case 300: + return "300" + case 301: + return "301" + case 302: + return "302" + case 304: + return "304" + case 305: + return "305" + case 307: + return "307" + + case 400: + return "400" + case 401: + return "401" + case 402: + return "402" + case 403: + return "403" + case 404: + return "404" + case 405: + return "405" + case 406: + return "406" + case 407: + return "407" + case 408: + return "408" + case 409: + return "409" + case 410: + return "410" + case 411: + return "411" + case 412: + return "412" + case 413: + return "413" + case 414: + return "414" + case 415: + return "415" + case 416: + return "416" + case 417: + return "417" + case 418: + return "418" + + case 500: + return "500" + case 501: + return "501" + case 502: + return "502" + case 503: + return "503" + case 504: + return "504" + case 505: + return "505" + + case 428: + return "428" + case 429: + return "429" + case 431: + return "431" + case 511: + return "511" + + default: + return strconv.Itoa(s) + } +} diff --git a/api/vendor/github.com/prometheus/client_golang/prometheus/http_test.go b/api/vendor/github.com/prometheus/client_golang/prometheus/http_test.go new file mode 100644 index 0000000..ffe0418 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/prometheus/http_test.go @@ -0,0 +1,121 @@ +// Copyright 2014 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 prometheus + +import ( + "net/http" + "net/http/httptest" + "testing" + "time" + + dto "github.com/prometheus/client_model/go" +) + +type respBody string + +func (b respBody) ServeHTTP(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusTeapot) + w.Write([]byte(b)) +} + +func TestInstrumentHandler(t *testing.T) { + defer func(n nower) { + now = n.(nower) + }(now) + + instant := time.Now() + end := instant.Add(30 * time.Second) + now = nowSeries(instant, end) + respBody := respBody("Howdy there!") + + hndlr := InstrumentHandler("test-handler", respBody) + + opts := SummaryOpts{ + Subsystem: "http", + ConstLabels: Labels{"handler": "test-handler"}, + } + + reqCnt := MustRegisterOrGet(NewCounterVec( + CounterOpts{ + Namespace: opts.Namespace, + Subsystem: opts.Subsystem, + Name: "requests_total", + Help: "Total number of HTTP requests made.", + ConstLabels: opts.ConstLabels, + }, + instLabels, + )).(*CounterVec) + + opts.Name = "request_duration_microseconds" + opts.Help = "The HTTP request latencies in microseconds." + reqDur := MustRegisterOrGet(NewSummary(opts)).(Summary) + + opts.Name = "request_size_bytes" + opts.Help = "The HTTP request sizes in bytes." + MustRegisterOrGet(NewSummary(opts)) + + opts.Name = "response_size_bytes" + opts.Help = "The HTTP response sizes in bytes." + MustRegisterOrGet(NewSummary(opts)) + + reqCnt.Reset() + + resp := httptest.NewRecorder() + req := &http.Request{ + Method: "GET", + } + + hndlr.ServeHTTP(resp, req) + + if resp.Code != http.StatusTeapot { + t.Fatalf("expected status %d, got %d", http.StatusTeapot, resp.Code) + } + if string(resp.Body.Bytes()) != "Howdy there!" { + t.Fatalf("expected body %s, got %s", "Howdy there!", string(resp.Body.Bytes())) + } + + out := &dto.Metric{} + reqDur.Write(out) + if want, got := "test-handler", out.Label[0].GetValue(); want != got { + t.Errorf("want label value %q in reqDur, got %q", want, got) + } + if want, got := uint64(1), out.Summary.GetSampleCount(); want != got { + t.Errorf("want sample count %d in reqDur, got %d", want, got) + } + + out.Reset() + if want, got := 1, len(reqCnt.children); want != got { + t.Errorf("want %d children in reqCnt, got %d", want, got) + } + cnt, err := reqCnt.GetMetricWithLabelValues("get", "418") + if err != nil { + t.Fatal(err) + } + cnt.Write(out) + if want, got := "418", out.Label[0].GetValue(); want != got { + t.Errorf("want label value %q in reqCnt, got %q", want, got) + } + if want, got := "test-handler", out.Label[1].GetValue(); want != got { + t.Errorf("want label value %q in reqCnt, got %q", want, got) + } + if want, got := "get", out.Label[2].GetValue(); want != got { + t.Errorf("want label value %q in reqCnt, got %q", want, got) + } + if out.Counter == nil { + t.Fatal("expected non-nil counter in reqCnt") + } + if want, got := 1., out.Counter.GetValue(); want != got { + t.Errorf("want reqCnt of %f, got %f", want, got) + } +} diff --git a/api/vendor/github.com/prometheus/client_golang/prometheus/metric.go b/api/vendor/github.com/prometheus/client_golang/prometheus/metric.go new file mode 100644 index 0000000..d4063d9 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/prometheus/metric.go @@ -0,0 +1,166 @@ +// Copyright 2014 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 prometheus + +import ( + "strings" + + dto "github.com/prometheus/client_model/go" +) + +const separatorByte byte = 255 + +// A Metric models a single sample value with its meta data being exported to +// Prometheus. Implementations of Metric in this package are Gauge, Counter, +// Histogram, Summary, and Untyped. +type Metric interface { + // Desc returns the descriptor for the Metric. This method idempotently + // returns the same descriptor throughout the lifetime of the + // Metric. The returned descriptor is immutable by contract. A Metric + // unable to describe itself must return an invalid descriptor (created + // with NewInvalidDesc). + Desc() *Desc + // Write encodes the Metric into a "Metric" Protocol Buffer data + // transmission object. + // + // Metric implementations must observe concurrency safety as reads of + // this metric may occur at any time, and any blocking occurs at the + // expense of total performance of rendering all registered + // metrics. Ideally, Metric implementations should support concurrent + // readers. + // + // While populating dto.Metric, it is the responsibility of the + // implementation to ensure validity of the Metric protobuf (like valid + // UTF-8 strings or syntactically valid metric and label names). It is + // recommended to sort labels lexicographically. (Implementers may find + // LabelPairSorter useful for that.) Callers of Write should still make + // sure of sorting if they depend on it. + Write(*dto.Metric) error + // TODO(beorn7): The original rationale of passing in a pre-allocated + // dto.Metric protobuf to save allocations has disappeared. The + // signature of this method should be changed to "Write() (*dto.Metric, + // error)". +} + +// Opts bundles the options for creating most Metric types. Each metric +// implementation XXX has its own XXXOpts type, but in most cases, it is just be +// an alias of this type (which might change when the requirement arises.) +// +// It is mandatory to set Name and Help to a non-empty string. All other fields +// are optional and can safely be left at their zero value. +type Opts struct { + // Namespace, Subsystem, and Name are components of the fully-qualified + // name of the Metric (created by joining these components with + // "_"). Only Name is mandatory, the others merely help structuring the + // name. Note that the fully-qualified name of the metric must be a + // valid Prometheus metric name. + Namespace string + Subsystem string + Name string + + // Help provides information about this metric. Mandatory! + // + // Metrics with the same fully-qualified name must have the same Help + // string. + Help string + + // ConstLabels are used to attach fixed labels to this metric. Metrics + // with the same fully-qualified name must have the same label names in + // their ConstLabels. + // + // Note that in most cases, labels have a value that varies during the + // lifetime of a process. Those labels are usually managed with a metric + // vector collector (like CounterVec, GaugeVec, UntypedVec). ConstLabels + // serve only special purposes. One is for the special case where the + // value of a label does not change during the lifetime of a process, + // e.g. if the revision of the running binary is put into a + // label. Another, more advanced purpose is if more than one Collector + // needs to collect Metrics with the same fully-qualified name. In that + // case, those Metrics must differ in the values of their + // ConstLabels. See the Collector examples. + // + // If the value of a label never changes (not even between binaries), + // that label most likely should not be a label at all (but part of the + // metric name). + ConstLabels Labels +} + +// BuildFQName joins the given three name components by "_". Empty name +// components are ignored. If the name parameter itself is empty, an empty +// string is returned, no matter what. Metric implementations included in this +// library use this function internally to generate the fully-qualified metric +// name from the name component in their Opts. Users of the library will only +// need this function if they implement their own Metric or instantiate a Desc +// (with NewDesc) directly. +func BuildFQName(namespace, subsystem, name string) string { + if name == "" { + return "" + } + switch { + case namespace != "" && subsystem != "": + return strings.Join([]string{namespace, subsystem, name}, "_") + case namespace != "": + return strings.Join([]string{namespace, name}, "_") + case subsystem != "": + return strings.Join([]string{subsystem, name}, "_") + } + return name +} + +// LabelPairSorter implements sort.Interface. It is used to sort a slice of +// dto.LabelPair pointers. This is useful for implementing the Write method of +// custom metrics. +type LabelPairSorter []*dto.LabelPair + +func (s LabelPairSorter) Len() int { + return len(s) +} + +func (s LabelPairSorter) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s LabelPairSorter) Less(i, j int) bool { + return s[i].GetName() < s[j].GetName() +} + +type hashSorter []uint64 + +func (s hashSorter) Len() int { + return len(s) +} + +func (s hashSorter) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s hashSorter) Less(i, j int) bool { + return s[i] < s[j] +} + +type invalidMetric struct { + desc *Desc + err error +} + +// NewInvalidMetric returns a metric whose Write method always returns the +// provided error. It is useful if a Collector finds itself unable to collect +// a metric and wishes to report an error to the registry. +func NewInvalidMetric(desc *Desc, err error) Metric { + return &invalidMetric{desc, err} +} + +func (m *invalidMetric) Desc() *Desc { return m.desc } + +func (m *invalidMetric) Write(*dto.Metric) error { return m.err } diff --git a/api/vendor/github.com/prometheus/client_golang/prometheus/metric_test.go b/api/vendor/github.com/prometheus/client_golang/prometheus/metric_test.go new file mode 100644 index 0000000..7145f5e --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/prometheus/metric_test.go @@ -0,0 +1,35 @@ +// Copyright 2014 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 prometheus + +import "testing" + +func TestBuildFQName(t *testing.T) { + scenarios := []struct{ namespace, subsystem, name, result string }{ + {"a", "b", "c", "a_b_c"}, + {"", "b", "c", "b_c"}, + {"a", "", "c", "a_c"}, + {"", "", "c", "c"}, + {"a", "b", "", ""}, + {"a", "", "", ""}, + {"", "b", "", ""}, + {" ", "", "", ""}, + } + + for i, s := range scenarios { + if want, got := s.result, BuildFQName(s.namespace, s.subsystem, s.name); want != got { + t.Errorf("%d. want %s, got %s", i, want, got) + } + } +} diff --git a/api/vendor/github.com/prometheus/client_golang/prometheus/process_collector.go b/api/vendor/github.com/prometheus/client_golang/prometheus/process_collector.go new file mode 100644 index 0000000..e31e62e --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/prometheus/process_collector.go @@ -0,0 +1,142 @@ +// Copyright 2015 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 prometheus + +import "github.com/prometheus/procfs" + +type processCollector struct { + pid int + collectFn func(chan<- Metric) + pidFn func() (int, error) + cpuTotal Counter + openFDs, maxFDs Gauge + vsize, rss Gauge + startTime Gauge +} + +// NewProcessCollector returns a collector which exports the current state of +// process metrics including cpu, memory and file descriptor usage as well as +// the process start time for the given process id under the given namespace. +func NewProcessCollector(pid int, namespace string) Collector { + return NewProcessCollectorPIDFn( + func() (int, error) { return pid, nil }, + namespace, + ) +} + +// NewProcessCollectorPIDFn returns a collector which exports the current state +// of process metrics including cpu, memory and file descriptor usage as well +// as the process start time under the given namespace. The given pidFn is +// called on each collect and is used to determine the process to export +// metrics for. +func NewProcessCollectorPIDFn( + pidFn func() (int, error), + namespace string, +) Collector { + c := processCollector{ + pidFn: pidFn, + collectFn: func(chan<- Metric) {}, + + cpuTotal: NewCounter(CounterOpts{ + Namespace: namespace, + Name: "process_cpu_seconds_total", + Help: "Total user and system CPU time spent in seconds.", + }), + openFDs: NewGauge(GaugeOpts{ + Namespace: namespace, + Name: "process_open_fds", + Help: "Number of open file descriptors.", + }), + maxFDs: NewGauge(GaugeOpts{ + Namespace: namespace, + Name: "process_max_fds", + Help: "Maximum number of open file descriptors.", + }), + vsize: NewGauge(GaugeOpts{ + Namespace: namespace, + Name: "process_virtual_memory_bytes", + Help: "Virtual memory size in bytes.", + }), + rss: NewGauge(GaugeOpts{ + Namespace: namespace, + Name: "process_resident_memory_bytes", + Help: "Resident memory size in bytes.", + }), + startTime: NewGauge(GaugeOpts{ + Namespace: namespace, + Name: "process_start_time_seconds", + Help: "Start time of the process since unix epoch in seconds.", + }), + } + + // Set up process metric collection if supported by the runtime. + if _, err := procfs.NewStat(); err == nil { + c.collectFn = c.processCollect + } + + return &c +} + +// Describe returns all descriptions of the collector. +func (c *processCollector) Describe(ch chan<- *Desc) { + ch <- c.cpuTotal.Desc() + ch <- c.openFDs.Desc() + ch <- c.maxFDs.Desc() + ch <- c.vsize.Desc() + ch <- c.rss.Desc() + ch <- c.startTime.Desc() +} + +// Collect returns the current state of all metrics of the collector. +func (c *processCollector) Collect(ch chan<- Metric) { + c.collectFn(ch) +} + +// TODO(ts): Bring back error reporting by reverting 7faf9e7 as soon as the +// client allows users to configure the error behavior. +func (c *processCollector) processCollect(ch chan<- Metric) { + pid, err := c.pidFn() + if err != nil { + return + } + + p, err := procfs.NewProc(pid) + if err != nil { + return + } + + if stat, err := p.NewStat(); err == nil { + c.cpuTotal.Set(stat.CPUTime()) + ch <- c.cpuTotal + c.vsize.Set(float64(stat.VirtualMemory())) + ch <- c.vsize + c.rss.Set(float64(stat.ResidentMemory())) + ch <- c.rss + + if startTime, err := stat.StartTime(); err == nil { + c.startTime.Set(startTime) + ch <- c.startTime + } + } + + if fds, err := p.FileDescriptorsLen(); err == nil { + c.openFDs.Set(float64(fds)) + ch <- c.openFDs + } + + if limits, err := p.NewLimits(); err == nil { + c.maxFDs.Set(float64(limits.OpenFiles)) + ch <- c.maxFDs + } +} diff --git a/api/vendor/github.com/prometheus/client_golang/prometheus/process_collector_test.go b/api/vendor/github.com/prometheus/client_golang/prometheus/process_collector_test.go new file mode 100644 index 0000000..d3362da --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/prometheus/process_collector_test.go @@ -0,0 +1,58 @@ +package prometheus + +import ( + "bytes" + "os" + "regexp" + "testing" + + "github.com/prometheus/common/expfmt" + "github.com/prometheus/procfs" +) + +func TestProcessCollector(t *testing.T) { + if _, err := procfs.Self(); err != nil { + t.Skipf("skipping TestProcessCollector, procfs not available: %s", err) + } + + registry := NewRegistry() + if err := registry.Register(NewProcessCollector(os.Getpid(), "")); err != nil { + t.Fatal(err) + } + if err := registry.Register(NewProcessCollectorPIDFn( + func() (int, error) { return os.Getpid(), nil }, "foobar"), + ); err != nil { + t.Fatal(err) + } + + mfs, err := registry.Gather() + if err != nil { + t.Fatal(err) + } + + var buf bytes.Buffer + for _, mf := range mfs { + if _, err := expfmt.MetricFamilyToText(&buf, mf); err != nil { + t.Fatal(err) + } + } + + for _, re := range []*regexp.Regexp{ + regexp.MustCompile("process_cpu_seconds_total [0-9]"), + regexp.MustCompile("process_max_fds [1-9]"), + regexp.MustCompile("process_open_fds [1-9]"), + regexp.MustCompile("process_virtual_memory_bytes [1-9]"), + regexp.MustCompile("process_resident_memory_bytes [1-9]"), + regexp.MustCompile("process_start_time_seconds [0-9.]{10,}"), + regexp.MustCompile("foobar_process_cpu_seconds_total [0-9]"), + regexp.MustCompile("foobar_process_max_fds [1-9]"), + regexp.MustCompile("foobar_process_open_fds [1-9]"), + regexp.MustCompile("foobar_process_virtual_memory_bytes [1-9]"), + regexp.MustCompile("foobar_process_resident_memory_bytes [1-9]"), + regexp.MustCompile("foobar_process_start_time_seconds [0-9.]{10,}"), + } { + if !re.Match(buf.Bytes()) { + t.Errorf("want body to match %s\n%s", re, buf.String()) + } + } +} diff --git a/api/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go b/api/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go new file mode 100644 index 0000000..b6dd5a2 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go @@ -0,0 +1,201 @@ +// Copyright 2016 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. + +// Copyright (c) 2013, The Prometheus 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 promhttp contains functions to create http.Handler instances to +// expose Prometheus metrics via HTTP. In later versions of this package, it +// will also contain tooling to instrument instances of http.Handler and +// http.RoundTripper. +// +// promhttp.Handler acts on the prometheus.DefaultGatherer. With HandlerFor, +// you can create a handler for a custom registry or anything that implements +// the Gatherer interface. It also allows to create handlers that act +// differently on errors or allow to log errors. +package promhttp + +import ( + "bytes" + "compress/gzip" + "fmt" + "io" + "net/http" + "strings" + "sync" + + "github.com/prometheus/common/expfmt" + + "github.com/prometheus/client_golang/prometheus" +) + +const ( + contentTypeHeader = "Content-Type" + contentLengthHeader = "Content-Length" + contentEncodingHeader = "Content-Encoding" + acceptEncodingHeader = "Accept-Encoding" +) + +var bufPool sync.Pool + +func getBuf() *bytes.Buffer { + buf := bufPool.Get() + if buf == nil { + return &bytes.Buffer{} + } + return buf.(*bytes.Buffer) +} + +func giveBuf(buf *bytes.Buffer) { + buf.Reset() + bufPool.Put(buf) +} + +// Handler returns an HTTP handler for the prometheus.DefaultGatherer. The +// Handler uses the default HandlerOpts, i.e. report the first error as an HTTP +// error, no error logging, and compression if requested by the client. +// +// If you want to create a Handler for the DefaultGatherer with different +// HandlerOpts, create it with HandlerFor with prometheus.DefaultGatherer and +// your desired HandlerOpts. +func Handler() http.Handler { + return HandlerFor(prometheus.DefaultGatherer, HandlerOpts{}) +} + +// HandlerFor returns an http.Handler for the provided Gatherer. The behavior +// of the Handler is defined by the provided HandlerOpts. +func HandlerFor(reg prometheus.Gatherer, opts HandlerOpts) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + mfs, err := reg.Gather() + if err != nil { + if opts.ErrorLog != nil { + opts.ErrorLog.Println("error gathering metrics:", err) + } + switch opts.ErrorHandling { + case PanicOnError: + panic(err) + case ContinueOnError: + if len(mfs) == 0 { + http.Error(w, "No metrics gathered, last error:\n\n"+err.Error(), http.StatusInternalServerError) + return + } + case HTTPErrorOnError: + http.Error(w, "An error has occurred during metrics gathering:\n\n"+err.Error(), http.StatusInternalServerError) + return + } + } + + contentType := expfmt.Negotiate(req.Header) + buf := getBuf() + defer giveBuf(buf) + writer, encoding := decorateWriter(req, buf, opts.DisableCompression) + enc := expfmt.NewEncoder(writer, contentType) + var lastErr error + for _, mf := range mfs { + if err := enc.Encode(mf); err != nil { + lastErr = err + if opts.ErrorLog != nil { + opts.ErrorLog.Println("error encoding metric family:", err) + } + switch opts.ErrorHandling { + case PanicOnError: + panic(err) + case ContinueOnError: + // Handled later. + case HTTPErrorOnError: + http.Error(w, "An error has occurred during metrics encoding:\n\n"+err.Error(), http.StatusInternalServerError) + return + } + } + } + if closer, ok := writer.(io.Closer); ok { + closer.Close() + } + if lastErr != nil && buf.Len() == 0 { + http.Error(w, "No metrics encoded, last error:\n\n"+err.Error(), http.StatusInternalServerError) + return + } + header := w.Header() + header.Set(contentTypeHeader, string(contentType)) + header.Set(contentLengthHeader, fmt.Sprint(buf.Len())) + if encoding != "" { + header.Set(contentEncodingHeader, encoding) + } + w.Write(buf.Bytes()) + // TODO(beorn7): Consider streaming serving of metrics. + }) +} + +// HandlerErrorHandling defines how a Handler serving metrics will handle +// errors. +type HandlerErrorHandling int + +// These constants cause handlers serving metrics to behave as described if +// errors are encountered. +const ( + // Serve an HTTP status code 500 upon the first error + // encountered. Report the error message in the body. + HTTPErrorOnError HandlerErrorHandling = iota + // Ignore errors and try to serve as many metrics as possible. However, + // if no metrics can be served, serve an HTTP status code 500 and the + // last error message in the body. Only use this in deliberate "best + // effort" metrics collection scenarios. It is recommended to at least + // log errors (by providing an ErrorLog in HandlerOpts) to not mask + // errors completely. + ContinueOnError + // Panic upon the first error encountered (useful for "crash only" apps). + PanicOnError +) + +// Logger is the minimal interface HandlerOpts needs for logging. Note that +// log.Logger from the standard library implements this interface, and it is +// easy to implement by custom loggers, if they don't do so already anyway. +type Logger interface { + Println(v ...interface{}) +} + +// HandlerOpts specifies options how to serve metrics via an http.Handler. The +// zero value of HandlerOpts is a reasonable default. +type HandlerOpts struct { + // ErrorLog specifies an optional logger for errors collecting and + // serving metrics. If nil, errors are not logged at all. + ErrorLog Logger + // ErrorHandling defines how errors are handled. Note that errors are + // logged regardless of the configured ErrorHandling provided ErrorLog + // is not nil. + ErrorHandling HandlerErrorHandling + // If DisableCompression is true, the handler will never compress the + // response, even if requested by the client. + DisableCompression bool +} + +// decorateWriter wraps a writer to handle gzip compression if requested. It +// returns the decorated writer and the appropriate "Content-Encoding" header +// (which is empty if no compression is enabled). +func decorateWriter(request *http.Request, writer io.Writer, compressionDisabled bool) (io.Writer, string) { + if compressionDisabled { + return writer, "" + } + header := request.Header.Get(acceptEncodingHeader) + parts := strings.Split(header, ",") + for _, part := range parts { + part := strings.TrimSpace(part) + if part == "gzip" || strings.HasPrefix(part, "gzip;") { + return gzip.NewWriter(writer), "gzip" + } + } + return writer, "" +} diff --git a/api/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http_test.go b/api/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http_test.go new file mode 100644 index 0000000..d4a7d4a --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http_test.go @@ -0,0 +1,137 @@ +// Copyright 2016 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. + +// Copyright (c) 2013, The Prometheus 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 promhttp + +import ( + "bytes" + "errors" + "log" + "net/http" + "net/http/httptest" + "testing" + + "github.com/prometheus/client_golang/prometheus" +) + +type errorCollector struct{} + +func (e errorCollector) Describe(ch chan<- *prometheus.Desc) { + ch <- prometheus.NewDesc("invalid_metric", "not helpful", nil, nil) +} + +func (e errorCollector) Collect(ch chan<- prometheus.Metric) { + ch <- prometheus.NewInvalidMetric( + prometheus.NewDesc("invalid_metric", "not helpful", nil, nil), + errors.New("collect error"), + ) +} + +func TestHandlerErrorHandling(t *testing.T) { + + // Create a registry that collects a MetricFamily with two elements, + // another with one, and reports an error. + reg := prometheus.NewRegistry() + + cnt := prometheus.NewCounter(prometheus.CounterOpts{ + Name: "the_count", + Help: "Ah-ah-ah! Thunder and lightning!", + }) + reg.MustRegister(cnt) + + cntVec := prometheus.NewCounterVec( + prometheus.CounterOpts{ + Name: "name", + Help: "docstring", + ConstLabels: prometheus.Labels{"constname": "constvalue"}, + }, + []string{"labelname"}, + ) + cntVec.WithLabelValues("val1").Inc() + cntVec.WithLabelValues("val2").Inc() + reg.MustRegister(cntVec) + + reg.MustRegister(errorCollector{}) + + logBuf := &bytes.Buffer{} + logger := log.New(logBuf, "", 0) + + writer := httptest.NewRecorder() + request, _ := http.NewRequest("GET", "/", nil) + request.Header.Add("Accept", "test/plain") + + errorHandler := HandlerFor(reg, HandlerOpts{ + ErrorLog: logger, + ErrorHandling: HTTPErrorOnError, + }) + continueHandler := HandlerFor(reg, HandlerOpts{ + ErrorLog: logger, + ErrorHandling: ContinueOnError, + }) + panicHandler := HandlerFor(reg, HandlerOpts{ + ErrorLog: logger, + ErrorHandling: PanicOnError, + }) + wantMsg := `error gathering metrics: error collecting metric Desc{fqName: "invalid_metric", help: "not helpful", constLabels: {}, variableLabels: []}: collect error +` + wantErrorBody := `An error has occurred during metrics gathering: + +error collecting metric Desc{fqName: "invalid_metric", help: "not helpful", constLabels: {}, variableLabels: []}: collect error +` + wantOKBody := `# HELP name docstring +# TYPE name counter +name{constname="constvalue",labelname="val1"} 1 +name{constname="constvalue",labelname="val2"} 1 +# HELP the_count Ah-ah-ah! Thunder and lightning! +# TYPE the_count counter +the_count 0 +` + + errorHandler.ServeHTTP(writer, request) + if got, want := writer.Code, http.StatusInternalServerError; got != want { + t.Errorf("got HTTP status code %d, want %d", got, want) + } + if got := logBuf.String(); got != wantMsg { + t.Errorf("got log message:\n%s\nwant log mesage:\n%s\n", got, wantMsg) + } + if got := writer.Body.String(); got != wantErrorBody { + t.Errorf("got body:\n%s\nwant body:\n%s\n", got, wantErrorBody) + } + logBuf.Reset() + writer.Body.Reset() + writer.Code = http.StatusOK + + continueHandler.ServeHTTP(writer, request) + if got, want := writer.Code, http.StatusOK; got != want { + t.Errorf("got HTTP status code %d, want %d", got, want) + } + if got := logBuf.String(); got != wantMsg { + t.Errorf("got log message %q, want %q", got, wantMsg) + } + if got := writer.Body.String(); got != wantOKBody { + t.Errorf("got body %q, want %q", got, wantOKBody) + } + + defer func() { + if err := recover(); err == nil { + t.Error("expected panic from panicHandler") + } + }() + panicHandler.ServeHTTP(writer, request) +} diff --git a/api/vendor/github.com/prometheus/client_golang/prometheus/push/examples_test.go b/api/vendor/github.com/prometheus/client_golang/prometheus/push/examples_test.go new file mode 100644 index 0000000..7f17ca2 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/prometheus/push/examples_test.go @@ -0,0 +1,56 @@ +// Copyright 2016 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 push_test + +import ( + "fmt" + "time" + + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/push" +) + +func ExampleCollectors() { + completionTime := prometheus.NewGauge(prometheus.GaugeOpts{ + Name: "db_backup_last_completion_timestamp_seconds", + Help: "The timestamp of the last succesful completion of a DB backup.", + }) + completionTime.Set(float64(time.Now().Unix())) + if err := push.Collectors( + "db_backup", push.HostnameGroupingKey(), + "http://pushgateway:9091", + completionTime, + ); err != nil { + fmt.Println("Could not push completion time to Pushgateway:", err) + } +} + +func ExampleRegistry() { + registry := prometheus.NewRegistry() + + completionTime := prometheus.NewGauge(prometheus.GaugeOpts{ + Name: "db_backup_last_completion_timestamp_seconds", + Help: "The timestamp of the last succesful completion of a DB backup.", + }) + registry.MustRegister(completionTime) + + completionTime.Set(float64(time.Now().Unix())) + if err := push.FromGatherer( + "db_backup", push.HostnameGroupingKey(), + "http://pushgateway:9091", + registry, + ); err != nil { + fmt.Println("Could not push completion time to Pushgateway:", err) + } +} diff --git a/api/vendor/github.com/prometheus/client_golang/prometheus/push/push.go b/api/vendor/github.com/prometheus/client_golang/prometheus/push/push.go new file mode 100644 index 0000000..ae40402 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/prometheus/push/push.go @@ -0,0 +1,172 @@ +// Copyright 2015 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. + +// Copyright (c) 2013, The Prometheus 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 push provides functions to push metrics to a Pushgateway. The metrics +// to push are either collected from a provided registry, or from explicitly +// listed collectors. +// +// See the documentation of the Pushgateway to understand the meaning of the +// grouping parameters and the differences between push.Registry and +// push.Collectors on the one hand and push.AddRegistry and push.AddCollectors +// on the other hand: https://github.com/prometheus/pushgateway +package push + +import ( + "bytes" + "fmt" + "io/ioutil" + "net/http" + "net/url" + "os" + "strings" + + "github.com/prometheus/common/expfmt" + "github.com/prometheus/common/model" + + "github.com/prometheus/client_golang/prometheus" +) + +const contentTypeHeader = "Content-Type" + +// FromGatherer triggers a metric collection by the provided Gatherer (which is +// usually implemented by a prometheus.Registry) and pushes all gathered metrics +// to the Pushgateway specified by url, using the provided job name and the +// (optional) further grouping labels (the grouping map may be nil). See the +// Pushgateway documentation for detailed implications of the job and other +// grouping labels. Neither the job name nor any grouping label value may +// contain a "/". The metrics pushed must not contain a job label of their own +// nor any of the grouping labels. +// +// You can use just host:port or ip:port as url, in which case 'http://' is +// added automatically. You can also include the schema in the URL. However, do +// not include the '/metrics/jobs/...' part. +// +// Note that all previously pushed metrics with the same job and other grouping +// labels will be replaced with the metrics pushed by this call. (It uses HTTP +// method 'PUT' to push to the Pushgateway.) +func FromGatherer(job string, grouping map[string]string, url string, g prometheus.Gatherer) error { + return push(job, grouping, url, g, "PUT") +} + +// AddFromGatherer works like FromGatherer, but only previously pushed metrics +// with the same name (and the same job and other grouping labels) will be +// replaced. (It uses HTTP method 'POST' to push to the Pushgateway.) +func AddFromGatherer(job string, grouping map[string]string, url string, g prometheus.Gatherer) error { + return push(job, grouping, url, g, "POST") +} + +func push(job string, grouping map[string]string, pushURL string, g prometheus.Gatherer, method string) error { + if !strings.Contains(pushURL, "://") { + pushURL = "http://" + pushURL + } + if strings.HasSuffix(pushURL, "/") { + pushURL = pushURL[:len(pushURL)-1] + } + + if strings.Contains(job, "/") { + return fmt.Errorf("job contains '/': %s", job) + } + urlComponents := []string{url.QueryEscape(job)} + for ln, lv := range grouping { + if !model.LabelNameRE.MatchString(ln) { + return fmt.Errorf("grouping label has invalid name: %s", ln) + } + if strings.Contains(lv, "/") { + return fmt.Errorf("value of grouping label %s contains '/': %s", ln, lv) + } + urlComponents = append(urlComponents, ln, lv) + } + pushURL = fmt.Sprintf("%s/metrics/job/%s", pushURL, strings.Join(urlComponents, "/")) + + mfs, err := g.Gather() + if err != nil { + return err + } + buf := &bytes.Buffer{} + enc := expfmt.NewEncoder(buf, expfmt.FmtProtoDelim) + // Check for pre-existing grouping labels: + for _, mf := range mfs { + for _, m := range mf.GetMetric() { + for _, l := range m.GetLabel() { + if l.GetName() == "job" { + return fmt.Errorf("pushed metric %s (%s) already contains a job label", mf.GetName(), m) + } + if _, ok := grouping[l.GetName()]; ok { + return fmt.Errorf( + "pushed metric %s (%s) already contains grouping label %s", + mf.GetName(), m, l.GetName(), + ) + } + } + } + enc.Encode(mf) + } + req, err := http.NewRequest(method, pushURL, buf) + if err != nil { + return err + } + req.Header.Set(contentTypeHeader, string(expfmt.FmtProtoDelim)) + resp, err := http.DefaultClient.Do(req) + if err != nil { + return err + } + defer resp.Body.Close() + if resp.StatusCode != 202 { + body, _ := ioutil.ReadAll(resp.Body) // Ignore any further error as this is for an error message only. + return fmt.Errorf("unexpected status code %d while pushing to %s: %s", resp.StatusCode, pushURL, body) + } + return nil +} + +// Collectors works like FromGatherer, but it does not use a Gatherer. Instead, +// it collects from the provided collectors directly. It is a convenient way to +// push only a few metrics. +func Collectors(job string, grouping map[string]string, url string, collectors ...prometheus.Collector) error { + return pushCollectors(job, grouping, url, "PUT", collectors...) +} + +// AddCollectors works like AddFromGatherer, but it does not use a Gatherer. +// Instead, it collects from the provided collectors directly. It is a +// convenient way to push only a few metrics. +func AddCollectors(job string, grouping map[string]string, url string, collectors ...prometheus.Collector) error { + return pushCollectors(job, grouping, url, "POST", collectors...) +} + +func pushCollectors(job string, grouping map[string]string, url, method string, collectors ...prometheus.Collector) error { + r := prometheus.NewRegistry() + for _, collector := range collectors { + if err := r.Register(collector); err != nil { + return err + } + } + return push(job, grouping, url, r, method) +} + +// HostnameGroupingKey returns a label map with the only entry +// {instance=""}. This can be conveniently used as the grouping +// parameter if metrics should be pushed with the hostname as label. The +// returned map is created upon each call so that the caller is free to add more +// labels to the map. +func HostnameGroupingKey() map[string]string { + hostname, err := os.Hostname() + if err != nil { + return map[string]string{"instance": "unknown"} + } + return map[string]string{"instance": hostname} +} diff --git a/api/vendor/github.com/prometheus/client_golang/prometheus/push/push_test.go b/api/vendor/github.com/prometheus/client_golang/prometheus/push/push_test.go new file mode 100644 index 0000000..28ed9b7 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/prometheus/push/push_test.go @@ -0,0 +1,176 @@ +// Copyright 2016 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. + +// Copyright (c) 2013, The Prometheus 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 push + +import ( + "bytes" + "io/ioutil" + "net/http" + "net/http/httptest" + "os" + "testing" + + "github.com/prometheus/common/expfmt" + + "github.com/prometheus/client_golang/prometheus" +) + +func TestPush(t *testing.T) { + + var ( + lastMethod string + lastBody []byte + lastPath string + ) + + host, err := os.Hostname() + if err != nil { + t.Error(err) + } + + // Fake a Pushgateway that always responds with 202. + pgwOK := httptest.NewServer( + http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + lastMethod = r.Method + var err error + lastBody, err = ioutil.ReadAll(r.Body) + if err != nil { + t.Fatal(err) + } + lastPath = r.URL.EscapedPath() + w.Header().Set("Content-Type", `text/plain; charset=utf-8`) + w.WriteHeader(http.StatusAccepted) + }), + ) + defer pgwOK.Close() + + // Fake a Pushgateway that always responds with 500. + pgwErr := httptest.NewServer( + http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + http.Error(w, "fake error", http.StatusInternalServerError) + }), + ) + defer pgwErr.Close() + + metric1 := prometheus.NewCounter(prometheus.CounterOpts{ + Name: "testname1", + Help: "testhelp1", + }) + metric2 := prometheus.NewGauge(prometheus.GaugeOpts{ + Name: "testname2", + Help: "testhelp2", + ConstLabels: prometheus.Labels{"foo": "bar", "dings": "bums"}, + }) + + reg := prometheus.NewRegistry() + reg.MustRegister(metric1) + reg.MustRegister(metric2) + + mfs, err := reg.Gather() + if err != nil { + t.Fatal(err) + } + + buf := &bytes.Buffer{} + enc := expfmt.NewEncoder(buf, expfmt.FmtProtoDelim) + + for _, mf := range mfs { + if err := enc.Encode(mf); err != nil { + t.Fatal(err) + } + } + wantBody := buf.Bytes() + + // PushCollectors, all good. + if err := Collectors("testjob", HostnameGroupingKey(), pgwOK.URL, metric1, metric2); err != nil { + t.Fatal(err) + } + if lastMethod != "PUT" { + t.Error("want method PUT for PushCollectors, got", lastMethod) + } + if bytes.Compare(lastBody, wantBody) != 0 { + t.Errorf("got body %v, want %v", lastBody, wantBody) + } + if lastPath != "/metrics/job/testjob/instance/"+host { + t.Error("unexpected path:", lastPath) + } + + // PushAddCollectors, with nil grouping, all good. + if err := AddCollectors("testjob", nil, pgwOK.URL, metric1, metric2); err != nil { + t.Fatal(err) + } + if lastMethod != "POST" { + t.Error("want method POST for PushAddCollectors, got", lastMethod) + } + if bytes.Compare(lastBody, wantBody) != 0 { + t.Errorf("got body %v, want %v", lastBody, wantBody) + } + if lastPath != "/metrics/job/testjob" { + t.Error("unexpected path:", lastPath) + } + + // PushCollectors with a broken PGW. + if err := Collectors("testjob", nil, pgwErr.URL, metric1, metric2); err == nil { + t.Error("push to broken Pushgateway succeeded") + } else { + if got, want := err.Error(), "unexpected status code 500 while pushing to "+pgwErr.URL+"/metrics/job/testjob: fake error\n"; got != want { + t.Errorf("got error %q, want %q", got, want) + } + } + + // PushCollectors with invalid grouping or job. + if err := Collectors("testjob", map[string]string{"foo": "bums"}, pgwErr.URL, metric1, metric2); err == nil { + t.Error("push with grouping contained in metrics succeeded") + } + if err := Collectors("test/job", nil, pgwErr.URL, metric1, metric2); err == nil { + t.Error("push with invalid job value succeeded") + } + if err := Collectors("testjob", map[string]string{"foo/bar": "bums"}, pgwErr.URL, metric1, metric2); err == nil { + t.Error("push with invalid grouping succeeded") + } + if err := Collectors("testjob", map[string]string{"foo-bar": "bums"}, pgwErr.URL, metric1, metric2); err == nil { + t.Error("push with invalid grouping succeeded") + } + + // Push registry, all good. + if err := FromGatherer("testjob", HostnameGroupingKey(), pgwOK.URL, reg); err != nil { + t.Fatal(err) + } + if lastMethod != "PUT" { + t.Error("want method PUT for Push, got", lastMethod) + } + if bytes.Compare(lastBody, wantBody) != 0 { + t.Errorf("got body %v, want %v", lastBody, wantBody) + } + + // PushAdd registry, all good. + if err := AddFromGatherer("testjob", map[string]string{"a": "x", "b": "y"}, pgwOK.URL, reg); err != nil { + t.Fatal(err) + } + if lastMethod != "POST" { + t.Error("want method POSTT for PushAdd, got", lastMethod) + } + if bytes.Compare(lastBody, wantBody) != 0 { + t.Errorf("got body %v, want %v", lastBody, wantBody) + } + if lastPath != "/metrics/job/testjob/a/x/b/y" && lastPath != "/metrics/job/testjob/b/y/a/x" { + t.Error("unexpected path:", lastPath) + } +} diff --git a/api/vendor/github.com/prometheus/client_golang/prometheus/registry.go b/api/vendor/github.com/prometheus/client_golang/prometheus/registry.go new file mode 100644 index 0000000..32a3986 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/prometheus/registry.go @@ -0,0 +1,806 @@ +// Copyright 2014 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 prometheus + +import ( + "bytes" + "errors" + "fmt" + "os" + "sort" + "sync" + + "github.com/golang/protobuf/proto" + + dto "github.com/prometheus/client_model/go" +) + +const ( + // Capacity for the channel to collect metrics and descriptors. + capMetricChan = 1000 + capDescChan = 10 +) + +// DefaultRegisterer and DefaultGatherer are the implementations of the +// Registerer and Gatherer interface a number of convenience functions in this +// package act on. Initially, both variables point to the same Registry, which +// has a process collector (see NewProcessCollector) and a Go collector (see +// NewGoCollector) already registered. This approach to keep default instances +// as global state mirrors the approach of other packages in the Go standard +// library. Note that there are caveats. Change the variables with caution and +// only if you understand the consequences. Users who want to avoid global state +// altogether should not use the convenience function and act on custom +// instances instead. +var ( + defaultRegistry = NewRegistry() + DefaultRegisterer Registerer = defaultRegistry + DefaultGatherer Gatherer = defaultRegistry +) + +func init() { + MustRegister(NewProcessCollector(os.Getpid(), "")) + MustRegister(NewGoCollector()) +} + +// NewRegistry creates a new vanilla Registry without any Collectors +// pre-registered. +func NewRegistry() *Registry { + return &Registry{ + collectorsByID: map[uint64]Collector{}, + descIDs: map[uint64]struct{}{}, + dimHashesByName: map[string]uint64{}, + } +} + +// NewPedanticRegistry returns a registry that checks during collection if each +// collected Metric is consistent with its reported Desc, and if the Desc has +// actually been registered with the registry. +// +// Usually, a Registry will be happy as long as the union of all collected +// Metrics is consistent and valid even if some metrics are not consistent with +// their own Desc or a Desc provided by their registered Collector. Well-behaved +// Collectors and Metrics will only provide consistent Descs. This Registry is +// useful to test the implementation of Collectors and Metrics. +func NewPedanticRegistry() *Registry { + r := NewRegistry() + r.pedanticChecksEnabled = true + return r +} + +// Registerer is the interface for the part of a registry in charge of +// registering and unregistering. Users of custom registries should use +// Registerer as type for registration purposes (rather then the Registry type +// directly). In that way, they are free to use custom Registerer implementation +// (e.g. for testing purposes). +type Registerer interface { + // Register registers a new Collector to be included in metrics + // collection. It returns an error if the descriptors provided by the + // Collector are invalid or if they — in combination with descriptors of + // already registered Collectors — do not fulfill the consistency and + // uniqueness criteria described in the documentation of metric.Desc. + // + // If the provided Collector is equal to a Collector already registered + // (which includes the case of re-registering the same Collector), the + // returned error is an instance of AlreadyRegisteredError, which + // contains the previously registered Collector. + // + // It is in general not safe to register the same Collector multiple + // times concurrently. + Register(Collector) error + // MustRegister works like Register but registers any number of + // Collectors and panics upon the first registration that causes an + // error. + MustRegister(...Collector) + // Unregister unregisters the Collector that equals the Collector passed + // in as an argument. (Two Collectors are considered equal if their + // Describe method yields the same set of descriptors.) The function + // returns whether a Collector was unregistered. + // + // Note that even after unregistering, it will not be possible to + // register a new Collector that is inconsistent with the unregistered + // Collector, e.g. a Collector collecting metrics with the same name but + // a different help string. The rationale here is that the same registry + // instance must only collect consistent metrics throughout its + // lifetime. + Unregister(Collector) bool +} + +// Gatherer is the interface for the part of a registry in charge of gathering +// the collected metrics into a number of MetricFamilies. The Gatherer interface +// comes with the same general implication as described for the Registerer +// interface. +type Gatherer interface { + // Gather calls the Collect method of the registered Collectors and then + // gathers the collected metrics into a lexicographically sorted slice + // of MetricFamily protobufs. Even if an error occurs, Gather attempts + // to gather as many metrics as possible. Hence, if a non-nil error is + // returned, the returned MetricFamily slice could be nil (in case of a + // fatal error that prevented any meaningful metric collection) or + // contain a number of MetricFamily protobufs, some of which might be + // incomplete, and some might be missing altogether. The returned error + // (which might be a MultiError) explains the details. In scenarios + // where complete collection is critical, the returned MetricFamily + // protobufs should be disregarded if the returned error is non-nil. + Gather() ([]*dto.MetricFamily, error) +} + +// Register registers the provided Collector with the DefaultRegisterer. +// +// Register is a shortcut for DefaultRegisterer.Register(c). See there for more +// details. +func Register(c Collector) error { + return DefaultRegisterer.Register(c) +} + +// MustRegister registers the provided Collectors with the DefaultRegisterer and +// panics if any error occurs. +// +// MustRegister is a shortcut for DefaultRegisterer.MustRegister(cs...). See +// there for more details. +func MustRegister(cs ...Collector) { + DefaultRegisterer.MustRegister(cs...) +} + +// RegisterOrGet registers the provided Collector with the DefaultRegisterer and +// returns the Collector, unless an equal Collector was registered before, in +// which case that Collector is returned. +// +// Deprecated: RegisterOrGet is merely a convenience function for the +// implementation as described in the documentation for +// AlreadyRegisteredError. As the use case is relatively rare, this function +// will be removed in a future version of this package to clean up the +// namespace. +func RegisterOrGet(c Collector) (Collector, error) { + if err := Register(c); err != nil { + if are, ok := err.(AlreadyRegisteredError); ok { + return are.ExistingCollector, nil + } + return nil, err + } + return c, nil +} + +// MustRegisterOrGet behaves like RegisterOrGet but panics instead of returning +// an error. +// +// Deprecated: This is deprecated for the same reason RegisterOrGet is. See +// there for details. +func MustRegisterOrGet(c Collector) Collector { + c, err := RegisterOrGet(c) + if err != nil { + panic(err) + } + return c +} + +// Unregister removes the registration of the provided Collector from the +// DefaultRegisterer. +// +// Unregister is a shortcut for DefaultRegisterer.Unregister(c). See there for +// more details. +func Unregister(c Collector) bool { + return DefaultRegisterer.Unregister(c) +} + +// GathererFunc turns a function into a Gatherer. +type GathererFunc func() ([]*dto.MetricFamily, error) + +// Gather implements Gatherer. +func (gf GathererFunc) Gather() ([]*dto.MetricFamily, error) { + return gf() +} + +// SetMetricFamilyInjectionHook replaces the DefaultGatherer with one that +// gathers from the previous DefaultGatherers but then merges the MetricFamily +// protobufs returned from the provided hook function with the MetricFamily +// protobufs returned from the original DefaultGatherer. +// +// Deprecated: This function manipulates the DefaultGatherer variable. Consider +// the implications, i.e. don't do this concurrently with any uses of the +// DefaultGatherer. In the rare cases where you need to inject MetricFamily +// protobufs directly, it is recommended to use a custom Registry and combine it +// with a custom Gatherer using the Gatherers type (see +// there). SetMetricFamilyInjectionHook only exists for compatibility reasons +// with previous versions of this package. +func SetMetricFamilyInjectionHook(hook func() []*dto.MetricFamily) { + DefaultGatherer = Gatherers{ + DefaultGatherer, + GathererFunc(func() ([]*dto.MetricFamily, error) { return hook(), nil }), + } +} + +// AlreadyRegisteredError is returned by the Register method if the Collector to +// be registered has already been registered before, or a different Collector +// that collects the same metrics has been registered before. Registration fails +// in that case, but you can detect from the kind of error what has +// happened. The error contains fields for the existing Collector and the +// (rejected) new Collector that equals the existing one. This can be used to +// find out if an equal Collector has been registered before and switch over to +// using the old one, as demonstrated in the example. +type AlreadyRegisteredError struct { + ExistingCollector, NewCollector Collector +} + +func (err AlreadyRegisteredError) Error() string { + return "duplicate metrics collector registration attempted" +} + +// MultiError is a slice of errors implementing the error interface. It is used +// by a Gatherer to report multiple errors during MetricFamily gathering. +type MultiError []error + +func (errs MultiError) Error() string { + if len(errs) == 0 { + return "" + } + buf := &bytes.Buffer{} + fmt.Fprintf(buf, "%d error(s) occurred:", len(errs)) + for _, err := range errs { + fmt.Fprintf(buf, "\n* %s", err) + } + return buf.String() +} + +// MaybeUnwrap returns nil if len(errs) is 0. It returns the first and only +// contained error as error if len(errs is 1). In all other cases, it returns +// the MultiError directly. This is helpful for returning a MultiError in a way +// that only uses the MultiError if needed. +func (errs MultiError) MaybeUnwrap() error { + switch len(errs) { + case 0: + return nil + case 1: + return errs[0] + default: + return errs + } +} + +// Registry registers Prometheus collectors, collects their metrics, and gathers +// them into MetricFamilies for exposition. It implements both Registerer and +// Gatherer. The zero value is not usable. Create instances with NewRegistry or +// NewPedanticRegistry. +type Registry struct { + mtx sync.RWMutex + collectorsByID map[uint64]Collector // ID is a hash of the descIDs. + descIDs map[uint64]struct{} + dimHashesByName map[string]uint64 + pedanticChecksEnabled bool +} + +// Register implements Registerer. +func (r *Registry) Register(c Collector) error { + var ( + descChan = make(chan *Desc, capDescChan) + newDescIDs = map[uint64]struct{}{} + newDimHashesByName = map[string]uint64{} + collectorID uint64 // Just a sum of all desc IDs. + duplicateDescErr error + ) + go func() { + c.Describe(descChan) + close(descChan) + }() + r.mtx.Lock() + defer r.mtx.Unlock() + // Coduct various tests... + for desc := range descChan { + + // Is the descriptor valid at all? + if desc.err != nil { + return fmt.Errorf("descriptor %s is invalid: %s", desc, desc.err) + } + + // Is the descID unique? + // (In other words: Is the fqName + constLabel combination unique?) + if _, exists := r.descIDs[desc.id]; exists { + duplicateDescErr = fmt.Errorf("descriptor %s already exists with the same fully-qualified name and const label values", desc) + } + // If it is not a duplicate desc in this collector, add it to + // the collectorID. (We allow duplicate descs within the same + // collector, but their existence must be a no-op.) + if _, exists := newDescIDs[desc.id]; !exists { + newDescIDs[desc.id] = struct{}{} + collectorID += desc.id + } + + // Are all the label names and the help string consistent with + // previous descriptors of the same name? + // First check existing descriptors... + if dimHash, exists := r.dimHashesByName[desc.fqName]; exists { + if dimHash != desc.dimHash { + return fmt.Errorf("a previously registered descriptor with the same fully-qualified name as %s has different label names or a different help string", desc) + } + } else { + // ...then check the new descriptors already seen. + if dimHash, exists := newDimHashesByName[desc.fqName]; exists { + if dimHash != desc.dimHash { + return fmt.Errorf("descriptors reported by collector have inconsistent label names or help strings for the same fully-qualified name, offender is %s", desc) + } + } else { + newDimHashesByName[desc.fqName] = desc.dimHash + } + } + } + // Did anything happen at all? + if len(newDescIDs) == 0 { + return errors.New("collector has no descriptors") + } + if existing, exists := r.collectorsByID[collectorID]; exists { + return AlreadyRegisteredError{ + ExistingCollector: existing, + NewCollector: c, + } + } + // If the collectorID is new, but at least one of the descs existed + // before, we are in trouble. + if duplicateDescErr != nil { + return duplicateDescErr + } + + // Only after all tests have passed, actually register. + r.collectorsByID[collectorID] = c + for hash := range newDescIDs { + r.descIDs[hash] = struct{}{} + } + for name, dimHash := range newDimHashesByName { + r.dimHashesByName[name] = dimHash + } + return nil +} + +// Unregister implements Registerer. +func (r *Registry) Unregister(c Collector) bool { + var ( + descChan = make(chan *Desc, capDescChan) + descIDs = map[uint64]struct{}{} + collectorID uint64 // Just a sum of the desc IDs. + ) + go func() { + c.Describe(descChan) + close(descChan) + }() + for desc := range descChan { + if _, exists := descIDs[desc.id]; !exists { + collectorID += desc.id + descIDs[desc.id] = struct{}{} + } + } + + r.mtx.RLock() + if _, exists := r.collectorsByID[collectorID]; !exists { + r.mtx.RUnlock() + return false + } + r.mtx.RUnlock() + + r.mtx.Lock() + defer r.mtx.Unlock() + + delete(r.collectorsByID, collectorID) + for id := range descIDs { + delete(r.descIDs, id) + } + // dimHashesByName is left untouched as those must be consistent + // throughout the lifetime of a program. + return true +} + +// MustRegister implements Registerer. +func (r *Registry) MustRegister(cs ...Collector) { + for _, c := range cs { + if err := r.Register(c); err != nil { + panic(err) + } + } +} + +// Gather implements Gatherer. +func (r *Registry) Gather() ([]*dto.MetricFamily, error) { + var ( + metricChan = make(chan Metric, capMetricChan) + metricHashes = map[uint64]struct{}{} + dimHashes = map[string]uint64{} + wg sync.WaitGroup + errs MultiError // The collected errors to return in the end. + registeredDescIDs map[uint64]struct{} // Only used for pedantic checks + ) + + r.mtx.RLock() + metricFamiliesByName := make(map[string]*dto.MetricFamily, len(r.dimHashesByName)) + + // Scatter. + // (Collectors could be complex and slow, so we call them all at once.) + wg.Add(len(r.collectorsByID)) + go func() { + wg.Wait() + close(metricChan) + }() + for _, collector := range r.collectorsByID { + go func(collector Collector) { + defer wg.Done() + collector.Collect(metricChan) + }(collector) + } + + // In case pedantic checks are enabled, we have to copy the map before + // giving up the RLock. + if r.pedanticChecksEnabled { + registeredDescIDs = make(map[uint64]struct{}, len(r.descIDs)) + for id := range r.descIDs { + registeredDescIDs[id] = struct{}{} + } + } + + r.mtx.RUnlock() + + // Drain metricChan in case of premature return. + defer func() { + for _ = range metricChan { + } + }() + + // Gather. + for metric := range metricChan { + // This could be done concurrently, too, but it required locking + // of metricFamiliesByName (and of metricHashes if checks are + // enabled). Most likely not worth it. + desc := metric.Desc() + dtoMetric := &dto.Metric{} + if err := metric.Write(dtoMetric); err != nil { + errs = append(errs, fmt.Errorf( + "error collecting metric %v: %s", desc, err, + )) + continue + } + metricFamily, ok := metricFamiliesByName[desc.fqName] + if ok { + if metricFamily.GetHelp() != desc.help { + errs = append(errs, fmt.Errorf( + "collected metric %s %s has help %q but should have %q", + desc.fqName, dtoMetric, desc.help, metricFamily.GetHelp(), + )) + continue + } + // TODO(beorn7): Simplify switch once Desc has type. + switch metricFamily.GetType() { + case dto.MetricType_COUNTER: + if dtoMetric.Counter == nil { + errs = append(errs, fmt.Errorf( + "collected metric %s %s should be a Counter", + desc.fqName, dtoMetric, + )) + continue + } + case dto.MetricType_GAUGE: + if dtoMetric.Gauge == nil { + errs = append(errs, fmt.Errorf( + "collected metric %s %s should be a Gauge", + desc.fqName, dtoMetric, + )) + continue + } + case dto.MetricType_SUMMARY: + if dtoMetric.Summary == nil { + errs = append(errs, fmt.Errorf( + "collected metric %s %s should be a Summary", + desc.fqName, dtoMetric, + )) + continue + } + case dto.MetricType_UNTYPED: + if dtoMetric.Untyped == nil { + errs = append(errs, fmt.Errorf( + "collected metric %s %s should be Untyped", + desc.fqName, dtoMetric, + )) + continue + } + case dto.MetricType_HISTOGRAM: + if dtoMetric.Histogram == nil { + errs = append(errs, fmt.Errorf( + "collected metric %s %s should be a Histogram", + desc.fqName, dtoMetric, + )) + continue + } + default: + panic("encountered MetricFamily with invalid type") + } + } else { + metricFamily = &dto.MetricFamily{} + metricFamily.Name = proto.String(desc.fqName) + metricFamily.Help = proto.String(desc.help) + // TODO(beorn7): Simplify switch once Desc has type. + switch { + case dtoMetric.Gauge != nil: + metricFamily.Type = dto.MetricType_GAUGE.Enum() + case dtoMetric.Counter != nil: + metricFamily.Type = dto.MetricType_COUNTER.Enum() + case dtoMetric.Summary != nil: + metricFamily.Type = dto.MetricType_SUMMARY.Enum() + case dtoMetric.Untyped != nil: + metricFamily.Type = dto.MetricType_UNTYPED.Enum() + case dtoMetric.Histogram != nil: + metricFamily.Type = dto.MetricType_HISTOGRAM.Enum() + default: + errs = append(errs, fmt.Errorf( + "empty metric collected: %s", dtoMetric, + )) + continue + } + metricFamiliesByName[desc.fqName] = metricFamily + } + if err := checkMetricConsistency(metricFamily, dtoMetric, metricHashes, dimHashes); err != nil { + errs = append(errs, err) + continue + } + if r.pedanticChecksEnabled { + // Is the desc registered at all? + if _, exist := registeredDescIDs[desc.id]; !exist { + errs = append(errs, fmt.Errorf( + "collected metric %s %s with unregistered descriptor %s", + metricFamily.GetName(), dtoMetric, desc, + )) + continue + } + if err := checkDescConsistency(metricFamily, dtoMetric, desc); err != nil { + errs = append(errs, err) + continue + } + } + metricFamily.Metric = append(metricFamily.Metric, dtoMetric) + } + return normalizeMetricFamilies(metricFamiliesByName), errs.MaybeUnwrap() +} + +// Gatherers is a slice of Gatherer instances that implements the Gatherer +// interface itself. Its Gather method calls Gather on all Gatherers in the +// slice in order and returns the merged results. Errors returned from the +// Gather calles are all returned in a flattened MultiError. Duplicate and +// inconsistent Metrics are skipped (first occurrence in slice order wins) and +// reported in the returned error. +// +// Gatherers can be used to merge the Gather results from multiple +// Registries. It also provides a way to directly inject existing MetricFamily +// protobufs into the gathering by creating a custom Gatherer with a Gather +// method that simply returns the existing MetricFamily protobufs. Note that no +// registration is involved (in contrast to Collector registration), so +// obviously registration-time checks cannot happen. Any inconsistencies between +// the gathered MetricFamilies are reported as errors by the Gather method, and +// inconsistent Metrics are dropped. Invalid parts of the MetricFamilies +// (e.g. syntactically invalid metric or label names) will go undetected. +type Gatherers []Gatherer + +// Gather implements Gatherer. +func (gs Gatherers) Gather() ([]*dto.MetricFamily, error) { + var ( + metricFamiliesByName = map[string]*dto.MetricFamily{} + metricHashes = map[uint64]struct{}{} + dimHashes = map[string]uint64{} + errs MultiError // The collected errors to return in the end. + ) + + for i, g := range gs { + mfs, err := g.Gather() + if err != nil { + if multiErr, ok := err.(MultiError); ok { + for _, err := range multiErr { + errs = append(errs, fmt.Errorf("[from Gatherer #%d] %s", i+1, err)) + } + } else { + errs = append(errs, fmt.Errorf("[from Gatherer #%d] %s", i+1, err)) + } + } + for _, mf := range mfs { + existingMF, exists := metricFamiliesByName[mf.GetName()] + if exists { + if existingMF.GetHelp() != mf.GetHelp() { + errs = append(errs, fmt.Errorf( + "gathered metric family %s has help %q but should have %q", + mf.GetName(), mf.GetHelp(), existingMF.GetHelp(), + )) + continue + } + if existingMF.GetType() != mf.GetType() { + errs = append(errs, fmt.Errorf( + "gathered metric family %s has type %s but should have %s", + mf.GetName(), mf.GetType(), existingMF.GetType(), + )) + continue + } + } else { + existingMF = &dto.MetricFamily{} + existingMF.Name = mf.Name + existingMF.Help = mf.Help + existingMF.Type = mf.Type + metricFamiliesByName[mf.GetName()] = existingMF + } + for _, m := range mf.Metric { + if err := checkMetricConsistency(existingMF, m, metricHashes, dimHashes); err != nil { + errs = append(errs, err) + continue + } + existingMF.Metric = append(existingMF.Metric, m) + } + } + } + return normalizeMetricFamilies(metricFamiliesByName), errs.MaybeUnwrap() +} + +// metricSorter is a sortable slice of *dto.Metric. +type metricSorter []*dto.Metric + +func (s metricSorter) Len() int { + return len(s) +} + +func (s metricSorter) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s metricSorter) Less(i, j int) bool { + if len(s[i].Label) != len(s[j].Label) { + // This should not happen. The metrics are + // inconsistent. However, we have to deal with the fact, as + // people might use custom collectors or metric family injection + // to create inconsistent metrics. So let's simply compare the + // number of labels in this case. That will still yield + // reproducible sorting. + return len(s[i].Label) < len(s[j].Label) + } + for n, lp := range s[i].Label { + vi := lp.GetValue() + vj := s[j].Label[n].GetValue() + if vi != vj { + return vi < vj + } + } + + // We should never arrive here. Multiple metrics with the same + // label set in the same scrape will lead to undefined ingestion + // behavior. However, as above, we have to provide stable sorting + // here, even for inconsistent metrics. So sort equal metrics + // by their timestamp, with missing timestamps (implying "now") + // coming last. + if s[i].TimestampMs == nil { + return false + } + if s[j].TimestampMs == nil { + return true + } + return s[i].GetTimestampMs() < s[j].GetTimestampMs() +} + +// normalizeMetricFamilies returns a MetricFamily slice whith empty +// MetricFamilies pruned and the remaining MetricFamilies sorted by name within +// the slice, with the contained Metrics sorted within each MetricFamily. +func normalizeMetricFamilies(metricFamiliesByName map[string]*dto.MetricFamily) []*dto.MetricFamily { + for _, mf := range metricFamiliesByName { + sort.Sort(metricSorter(mf.Metric)) + } + names := make([]string, 0, len(metricFamiliesByName)) + for name, mf := range metricFamiliesByName { + if len(mf.Metric) > 0 { + names = append(names, name) + } + } + sort.Strings(names) + result := make([]*dto.MetricFamily, 0, len(names)) + for _, name := range names { + result = append(result, metricFamiliesByName[name]) + } + return result +} + +// checkMetricConsistency checks if the provided Metric is consistent with the +// provided MetricFamily. It also hashed the Metric labels and the MetricFamily +// name. If the resulting hash is alread in the provided metricHashes, an error +// is returned. If not, it is added to metricHashes. The provided dimHashes maps +// MetricFamily names to their dimHash (hashed sorted label names). If dimHashes +// doesn't yet contain a hash for the provided MetricFamily, it is +// added. Otherwise, an error is returned if the existing dimHashes in not equal +// the calculated dimHash. +func checkMetricConsistency( + metricFamily *dto.MetricFamily, + dtoMetric *dto.Metric, + metricHashes map[uint64]struct{}, + dimHashes map[string]uint64, +) error { + // Type consistency with metric family. + if metricFamily.GetType() == dto.MetricType_GAUGE && dtoMetric.Gauge == nil || + metricFamily.GetType() == dto.MetricType_COUNTER && dtoMetric.Counter == nil || + metricFamily.GetType() == dto.MetricType_SUMMARY && dtoMetric.Summary == nil || + metricFamily.GetType() == dto.MetricType_HISTOGRAM && dtoMetric.Histogram == nil || + metricFamily.GetType() == dto.MetricType_UNTYPED && dtoMetric.Untyped == nil { + return fmt.Errorf( + "collected metric %s %s is not a %s", + metricFamily.GetName(), dtoMetric, metricFamily.GetType(), + ) + } + + // Is the metric unique (i.e. no other metric with the same name and the same label values)? + h := hashNew() + h = hashAdd(h, metricFamily.GetName()) + h = hashAddByte(h, separatorByte) + dh := hashNew() + // Make sure label pairs are sorted. We depend on it for the consistency + // check. + sort.Sort(LabelPairSorter(dtoMetric.Label)) + for _, lp := range dtoMetric.Label { + h = hashAdd(h, lp.GetValue()) + h = hashAddByte(h, separatorByte) + dh = hashAdd(dh, lp.GetName()) + dh = hashAddByte(dh, separatorByte) + } + if _, exists := metricHashes[h]; exists { + return fmt.Errorf( + "collected metric %s %s was collected before with the same name and label values", + metricFamily.GetName(), dtoMetric, + ) + } + if dimHash, ok := dimHashes[metricFamily.GetName()]; ok { + if dimHash != dh { + return fmt.Errorf( + "collected metric %s %s has label dimensions inconsistent with previously collected metrics in the same metric family", + metricFamily.GetName(), dtoMetric, + ) + } + } else { + dimHashes[metricFamily.GetName()] = dh + } + metricHashes[h] = struct{}{} + return nil +} + +func checkDescConsistency( + metricFamily *dto.MetricFamily, + dtoMetric *dto.Metric, + desc *Desc, +) error { + // Desc help consistency with metric family help. + if metricFamily.GetHelp() != desc.help { + return fmt.Errorf( + "collected metric %s %s has help %q but should have %q", + metricFamily.GetName(), dtoMetric, metricFamily.GetHelp(), desc.help, + ) + } + + // Is the desc consistent with the content of the metric? + lpsFromDesc := make([]*dto.LabelPair, 0, len(dtoMetric.Label)) + lpsFromDesc = append(lpsFromDesc, desc.constLabelPairs...) + for _, l := range desc.variableLabels { + lpsFromDesc = append(lpsFromDesc, &dto.LabelPair{ + Name: proto.String(l), + }) + } + if len(lpsFromDesc) != len(dtoMetric.Label) { + return fmt.Errorf( + "labels in collected metric %s %s are inconsistent with descriptor %s", + metricFamily.GetName(), dtoMetric, desc, + ) + } + sort.Sort(LabelPairSorter(lpsFromDesc)) + for i, lpFromDesc := range lpsFromDesc { + lpFromMetric := dtoMetric.Label[i] + if lpFromDesc.GetName() != lpFromMetric.GetName() || + lpFromDesc.Value != nil && lpFromDesc.GetValue() != lpFromMetric.GetValue() { + return fmt.Errorf( + "labels in collected metric %s %s are inconsistent with descriptor %s", + metricFamily.GetName(), dtoMetric, desc, + ) + } + } + return nil +} diff --git a/api/vendor/github.com/prometheus/client_golang/prometheus/registry_test.go b/api/vendor/github.com/prometheus/client_golang/prometheus/registry_test.go new file mode 100644 index 0000000..9dacb62 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/prometheus/registry_test.go @@ -0,0 +1,545 @@ +// Copyright 2014 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. + +// Copyright (c) 2013, The Prometheus 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 prometheus_test + +import ( + "bytes" + "net/http" + "net/http/httptest" + "testing" + + dto "github.com/prometheus/client_model/go" + + "github.com/golang/protobuf/proto" + "github.com/prometheus/common/expfmt" + + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promhttp" +) + +func testHandler(t testing.TB) { + + metricVec := prometheus.NewCounterVec( + prometheus.CounterOpts{ + Name: "name", + Help: "docstring", + ConstLabels: prometheus.Labels{"constname": "constvalue"}, + }, + []string{"labelname"}, + ) + + metricVec.WithLabelValues("val1").Inc() + metricVec.WithLabelValues("val2").Inc() + + externalMetricFamily := &dto.MetricFamily{ + Name: proto.String("externalname"), + Help: proto.String("externaldocstring"), + Type: dto.MetricType_COUNTER.Enum(), + Metric: []*dto.Metric{ + { + Label: []*dto.LabelPair{ + { + Name: proto.String("externalconstname"), + Value: proto.String("externalconstvalue"), + }, + { + Name: proto.String("externallabelname"), + Value: proto.String("externalval1"), + }, + }, + Counter: &dto.Counter{ + Value: proto.Float64(1), + }, + }, + }, + } + externalBuf := &bytes.Buffer{} + enc := expfmt.NewEncoder(externalBuf, expfmt.FmtProtoDelim) + if err := enc.Encode(externalMetricFamily); err != nil { + t.Fatal(err) + } + externalMetricFamilyAsBytes := externalBuf.Bytes() + externalMetricFamilyAsText := []byte(`# HELP externalname externaldocstring +# TYPE externalname counter +externalname{externalconstname="externalconstvalue",externallabelname="externalval1"} 1 +`) + externalMetricFamilyAsProtoText := []byte(`name: "externalname" +help: "externaldocstring" +type: COUNTER +metric: < + label: < + name: "externalconstname" + value: "externalconstvalue" + > + label: < + name: "externallabelname" + value: "externalval1" + > + counter: < + value: 1 + > +> + +`) + externalMetricFamilyAsProtoCompactText := []byte(`name:"externalname" help:"externaldocstring" type:COUNTER metric: label: counter: > +`) + + expectedMetricFamily := &dto.MetricFamily{ + Name: proto.String("name"), + Help: proto.String("docstring"), + Type: dto.MetricType_COUNTER.Enum(), + Metric: []*dto.Metric{ + { + Label: []*dto.LabelPair{ + { + Name: proto.String("constname"), + Value: proto.String("constvalue"), + }, + { + Name: proto.String("labelname"), + Value: proto.String("val1"), + }, + }, + Counter: &dto.Counter{ + Value: proto.Float64(1), + }, + }, + { + Label: []*dto.LabelPair{ + { + Name: proto.String("constname"), + Value: proto.String("constvalue"), + }, + { + Name: proto.String("labelname"), + Value: proto.String("val2"), + }, + }, + Counter: &dto.Counter{ + Value: proto.Float64(1), + }, + }, + }, + } + buf := &bytes.Buffer{} + enc = expfmt.NewEncoder(buf, expfmt.FmtProtoDelim) + if err := enc.Encode(expectedMetricFamily); err != nil { + t.Fatal(err) + } + expectedMetricFamilyAsBytes := buf.Bytes() + expectedMetricFamilyAsText := []byte(`# HELP name docstring +# TYPE name counter +name{constname="constvalue",labelname="val1"} 1 +name{constname="constvalue",labelname="val2"} 1 +`) + expectedMetricFamilyAsProtoText := []byte(`name: "name" +help: "docstring" +type: COUNTER +metric: < + label: < + name: "constname" + value: "constvalue" + > + label: < + name: "labelname" + value: "val1" + > + counter: < + value: 1 + > +> +metric: < + label: < + name: "constname" + value: "constvalue" + > + label: < + name: "labelname" + value: "val2" + > + counter: < + value: 1 + > +> + +`) + expectedMetricFamilyAsProtoCompactText := []byte(`name:"name" help:"docstring" type:COUNTER metric: label: counter: > metric: label: counter: > +`) + + externalMetricFamilyWithSameName := &dto.MetricFamily{ + Name: proto.String("name"), + Help: proto.String("docstring"), + Type: dto.MetricType_COUNTER.Enum(), + Metric: []*dto.Metric{ + { + Label: []*dto.LabelPair{ + { + Name: proto.String("constname"), + Value: proto.String("constvalue"), + }, + { + Name: proto.String("labelname"), + Value: proto.String("different_val"), + }, + }, + Counter: &dto.Counter{ + Value: proto.Float64(42), + }, + }, + }, + } + + expectedMetricFamilyMergedWithExternalAsProtoCompactText := []byte(`name:"name" help:"docstring" type:COUNTER metric: label: counter: > metric: label: counter: > metric: label: counter: > +`) + + type output struct { + headers map[string]string + body []byte + } + + var scenarios = []struct { + headers map[string]string + out output + collector prometheus.Collector + externalMF []*dto.MetricFamily + }{ + { // 0 + headers: map[string]string{ + "Accept": "foo/bar;q=0.2, dings/bums;q=0.8", + }, + out: output{ + headers: map[string]string{ + "Content-Type": `text/plain; version=0.0.4`, + }, + body: []byte{}, + }, + }, + { // 1 + headers: map[string]string{ + "Accept": "foo/bar;q=0.2, application/quark;q=0.8", + }, + out: output{ + headers: map[string]string{ + "Content-Type": `text/plain; version=0.0.4`, + }, + body: []byte{}, + }, + }, + { // 2 + headers: map[string]string{ + "Accept": "foo/bar;q=0.2, application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=bla;q=0.8", + }, + out: output{ + headers: map[string]string{ + "Content-Type": `text/plain; version=0.0.4`, + }, + body: []byte{}, + }, + }, + { // 3 + headers: map[string]string{ + "Accept": "text/plain;q=0.2, application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=delimited;q=0.8", + }, + out: output{ + headers: map[string]string{ + "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=delimited`, + }, + body: []byte{}, + }, + }, + { // 4 + headers: map[string]string{ + "Accept": "application/json", + }, + out: output{ + headers: map[string]string{ + "Content-Type": `text/plain; version=0.0.4`, + }, + body: expectedMetricFamilyAsText, + }, + collector: metricVec, + }, + { // 5 + headers: map[string]string{ + "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=delimited", + }, + out: output{ + headers: map[string]string{ + "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=delimited`, + }, + body: expectedMetricFamilyAsBytes, + }, + collector: metricVec, + }, + { // 6 + headers: map[string]string{ + "Accept": "application/json", + }, + out: output{ + headers: map[string]string{ + "Content-Type": `text/plain; version=0.0.4`, + }, + body: externalMetricFamilyAsText, + }, + externalMF: []*dto.MetricFamily{externalMetricFamily}, + }, + { // 7 + headers: map[string]string{ + "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=delimited", + }, + out: output{ + headers: map[string]string{ + "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=delimited`, + }, + body: externalMetricFamilyAsBytes, + }, + externalMF: []*dto.MetricFamily{externalMetricFamily}, + }, + { // 8 + headers: map[string]string{ + "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=delimited", + }, + out: output{ + headers: map[string]string{ + "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=delimited`, + }, + body: bytes.Join( + [][]byte{ + externalMetricFamilyAsBytes, + expectedMetricFamilyAsBytes, + }, + []byte{}, + ), + }, + collector: metricVec, + externalMF: []*dto.MetricFamily{externalMetricFamily}, + }, + { // 9 + headers: map[string]string{ + "Accept": "text/plain", + }, + out: output{ + headers: map[string]string{ + "Content-Type": `text/plain; version=0.0.4`, + }, + body: []byte{}, + }, + }, + { // 10 + headers: map[string]string{ + "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=bla;q=0.2, text/plain;q=0.5", + }, + out: output{ + headers: map[string]string{ + "Content-Type": `text/plain; version=0.0.4`, + }, + body: expectedMetricFamilyAsText, + }, + collector: metricVec, + }, + { // 11 + headers: map[string]string{ + "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=bla;q=0.2, text/plain;q=0.5;version=0.0.4", + }, + out: output{ + headers: map[string]string{ + "Content-Type": `text/plain; version=0.0.4`, + }, + body: bytes.Join( + [][]byte{ + externalMetricFamilyAsText, + expectedMetricFamilyAsText, + }, + []byte{}, + ), + }, + collector: metricVec, + externalMF: []*dto.MetricFamily{externalMetricFamily}, + }, + { // 12 + headers: map[string]string{ + "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=delimited;q=0.2, text/plain;q=0.5;version=0.0.2", + }, + out: output{ + headers: map[string]string{ + "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=delimited`, + }, + body: bytes.Join( + [][]byte{ + externalMetricFamilyAsBytes, + expectedMetricFamilyAsBytes, + }, + []byte{}, + ), + }, + collector: metricVec, + externalMF: []*dto.MetricFamily{externalMetricFamily}, + }, + { // 13 + headers: map[string]string{ + "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=text;q=0.5, application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=delimited;q=0.4", + }, + out: output{ + headers: map[string]string{ + "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=text`, + }, + body: bytes.Join( + [][]byte{ + externalMetricFamilyAsProtoText, + expectedMetricFamilyAsProtoText, + }, + []byte{}, + ), + }, + collector: metricVec, + externalMF: []*dto.MetricFamily{externalMetricFamily}, + }, + { // 14 + headers: map[string]string{ + "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=compact-text", + }, + out: output{ + headers: map[string]string{ + "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=compact-text`, + }, + body: bytes.Join( + [][]byte{ + externalMetricFamilyAsProtoCompactText, + expectedMetricFamilyAsProtoCompactText, + }, + []byte{}, + ), + }, + collector: metricVec, + externalMF: []*dto.MetricFamily{externalMetricFamily}, + }, + { // 15 + headers: map[string]string{ + "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=compact-text", + }, + out: output{ + headers: map[string]string{ + "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=compact-text`, + }, + body: bytes.Join( + [][]byte{ + externalMetricFamilyAsProtoCompactText, + expectedMetricFamilyMergedWithExternalAsProtoCompactText, + }, + []byte{}, + ), + }, + collector: metricVec, + externalMF: []*dto.MetricFamily{ + externalMetricFamily, + externalMetricFamilyWithSameName, + }, + }, + } + for i, scenario := range scenarios { + registry := prometheus.NewPedanticRegistry() + gatherer := prometheus.Gatherer(registry) + if scenario.externalMF != nil { + gatherer = prometheus.Gatherers{ + registry, + prometheus.GathererFunc(func() ([]*dto.MetricFamily, error) { + return scenario.externalMF, nil + }), + } + } + + if scenario.collector != nil { + registry.Register(scenario.collector) + } + writer := httptest.NewRecorder() + handler := prometheus.InstrumentHandler("prometheus", promhttp.HandlerFor(gatherer, promhttp.HandlerOpts{})) + request, _ := http.NewRequest("GET", "/", nil) + for key, value := range scenario.headers { + request.Header.Add(key, value) + } + handler(writer, request) + + for key, value := range scenario.out.headers { + if writer.HeaderMap.Get(key) != value { + t.Errorf( + "%d. expected %q for header %q, got %q", + i, value, key, writer.Header().Get(key), + ) + } + } + + if !bytes.Equal(scenario.out.body, writer.Body.Bytes()) { + t.Errorf( + "%d. expected body:\n%s\ngot body:\n%s\n", + i, scenario.out.body, writer.Body.Bytes(), + ) + } + } +} + +func TestHandler(t *testing.T) { + testHandler(t) +} + +func BenchmarkHandler(b *testing.B) { + for i := 0; i < b.N; i++ { + testHandler(b) + } +} + +func TestRegisterWithOrGet(t *testing.T) { + // Replace the default registerer just to be sure. This is bad, but this + // whole test will go away once RegisterOrGet is removed. + oldRegisterer := prometheus.DefaultRegisterer + defer func() { + prometheus.DefaultRegisterer = oldRegisterer + }() + prometheus.DefaultRegisterer = prometheus.NewRegistry() + original := prometheus.NewCounterVec( + prometheus.CounterOpts{ + Name: "test", + Help: "help", + }, + []string{"foo", "bar"}, + ) + equalButNotSame := prometheus.NewCounterVec( + prometheus.CounterOpts{ + Name: "test", + Help: "help", + }, + []string{"foo", "bar"}, + ) + if err := prometheus.Register(original); err != nil { + t.Fatal(err) + } + if err := prometheus.Register(equalButNotSame); err == nil { + t.Fatal("expected error when registringe equal collector") + } + existing, err := prometheus.RegisterOrGet(equalButNotSame) + if err != nil { + t.Fatal(err) + } + if existing != original { + t.Error("expected original collector but got something else") + } + if existing == equalButNotSame { + t.Error("expected original callector but got new one") + } +} diff --git a/api/vendor/github.com/prometheus/client_golang/prometheus/summary.go b/api/vendor/github.com/prometheus/client_golang/prometheus/summary.go new file mode 100644 index 0000000..bce05bf --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/prometheus/summary.go @@ -0,0 +1,534 @@ +// Copyright 2014 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 prometheus + +import ( + "fmt" + "math" + "sort" + "sync" + "time" + + "github.com/beorn7/perks/quantile" + "github.com/golang/protobuf/proto" + + dto "github.com/prometheus/client_model/go" +) + +// quantileLabel is used for the label that defines the quantile in a +// summary. +const quantileLabel = "quantile" + +// A Summary captures individual observations from an event or sample stream and +// summarizes them in a manner similar to traditional summary statistics: 1. sum +// of observations, 2. observation count, 3. rank estimations. +// +// A typical use-case is the observation of request latencies. By default, a +// Summary provides the median, the 90th and the 99th percentile of the latency +// as rank estimations. +// +// Note that the rank estimations cannot be aggregated in a meaningful way with +// the Prometheus query language (i.e. you cannot average or add them). If you +// need aggregatable quantiles (e.g. you want the 99th percentile latency of all +// queries served across all instances of a service), consider the Histogram +// metric type. See the Prometheus documentation for more details. +// +// To create Summary instances, use NewSummary. +type Summary interface { + Metric + Collector + + // Observe adds a single observation to the summary. + Observe(float64) +} + +// DefObjectives are the default Summary quantile values. +var ( + DefObjectives = map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001} + + errQuantileLabelNotAllowed = fmt.Errorf( + "%q is not allowed as label name in summaries", quantileLabel, + ) +) + +// Default values for SummaryOpts. +const ( + // DefMaxAge is the default duration for which observations stay + // relevant. + DefMaxAge time.Duration = 10 * time.Minute + // DefAgeBuckets is the default number of buckets used to calculate the + // age of observations. + DefAgeBuckets = 5 + // DefBufCap is the standard buffer size for collecting Summary observations. + DefBufCap = 500 +) + +// SummaryOpts bundles the options for creating a Summary metric. It is +// mandatory to set Name and Help to a non-empty string. All other fields are +// optional and can safely be left at their zero value. +type SummaryOpts struct { + // Namespace, Subsystem, and Name are components of the fully-qualified + // name of the Summary (created by joining these components with + // "_"). Only Name is mandatory, the others merely help structuring the + // name. Note that the fully-qualified name of the Summary must be a + // valid Prometheus metric name. + Namespace string + Subsystem string + Name string + + // Help provides information about this Summary. Mandatory! + // + // Metrics with the same fully-qualified name must have the same Help + // string. + Help string + + // ConstLabels are used to attach fixed labels to this + // Summary. Summaries with the same fully-qualified name must have the + // same label names in their ConstLabels. + // + // Note that in most cases, labels have a value that varies during the + // lifetime of a process. Those labels are usually managed with a + // SummaryVec. ConstLabels serve only special purposes. One is for the + // special case where the value of a label does not change during the + // lifetime of a process, e.g. if the revision of the running binary is + // put into a label. Another, more advanced purpose is if more than one + // Collector needs to collect Summaries with the same fully-qualified + // name. In that case, those Summaries must differ in the values of + // their ConstLabels. See the Collector examples. + // + // If the value of a label never changes (not even between binaries), + // that label most likely should not be a label at all (but part of the + // metric name). + ConstLabels Labels + + // Objectives defines the quantile rank estimates with their respective + // absolute error. If Objectives[q] = e, then the value reported + // for q will be the φ-quantile value for some φ between q-e and q+e. + // The default value is DefObjectives. + Objectives map[float64]float64 + + // MaxAge defines the duration for which an observation stays relevant + // for the summary. Must be positive. The default value is DefMaxAge. + MaxAge time.Duration + + // AgeBuckets is the number of buckets used to exclude observations that + // are older than MaxAge from the summary. A higher number has a + // resource penalty, so only increase it if the higher resolution is + // really required. For very high observation rates, you might want to + // reduce the number of age buckets. With only one age bucket, you will + // effectively see a complete reset of the summary each time MaxAge has + // passed. The default value is DefAgeBuckets. + AgeBuckets uint32 + + // BufCap defines the default sample stream buffer size. The default + // value of DefBufCap should suffice for most uses. If there is a need + // to increase the value, a multiple of 500 is recommended (because that + // is the internal buffer size of the underlying package + // "github.com/bmizerany/perks/quantile"). + BufCap uint32 +} + +// Great fuck-up with the sliding-window decay algorithm... The Merge method of +// perk/quantile is actually not working as advertised - and it might be +// unfixable, as the underlying algorithm is apparently not capable of merging +// summaries in the first place. To avoid using Merge, we are currently adding +// observations to _each_ age bucket, i.e. the effort to add a sample is +// essentially multiplied by the number of age buckets. When rotating age +// buckets, we empty the previous head stream. On scrape time, we simply take +// the quantiles from the head stream (no merging required). Result: More effort +// on observation time, less effort on scrape time, which is exactly the +// opposite of what we try to accomplish, but at least the results are correct. +// +// The quite elegant previous contraption to merge the age buckets efficiently +// on scrape time (see code up commit 6b9530d72ea715f0ba612c0120e6e09fbf1d49d0) +// can't be used anymore. + +// NewSummary creates a new Summary based on the provided SummaryOpts. +func NewSummary(opts SummaryOpts) Summary { + return newSummary( + NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), + opts, + ) +} + +func newSummary(desc *Desc, opts SummaryOpts, labelValues ...string) Summary { + if len(desc.variableLabels) != len(labelValues) { + panic(errInconsistentCardinality) + } + + for _, n := range desc.variableLabels { + if n == quantileLabel { + panic(errQuantileLabelNotAllowed) + } + } + for _, lp := range desc.constLabelPairs { + if lp.GetName() == quantileLabel { + panic(errQuantileLabelNotAllowed) + } + } + + if len(opts.Objectives) == 0 { + opts.Objectives = DefObjectives + } + + if opts.MaxAge < 0 { + panic(fmt.Errorf("illegal max age MaxAge=%v", opts.MaxAge)) + } + if opts.MaxAge == 0 { + opts.MaxAge = DefMaxAge + } + + if opts.AgeBuckets == 0 { + opts.AgeBuckets = DefAgeBuckets + } + + if opts.BufCap == 0 { + opts.BufCap = DefBufCap + } + + s := &summary{ + desc: desc, + + objectives: opts.Objectives, + sortedObjectives: make([]float64, 0, len(opts.Objectives)), + + labelPairs: makeLabelPairs(desc, labelValues), + + hotBuf: make([]float64, 0, opts.BufCap), + coldBuf: make([]float64, 0, opts.BufCap), + streamDuration: opts.MaxAge / time.Duration(opts.AgeBuckets), + } + s.headStreamExpTime = time.Now().Add(s.streamDuration) + s.hotBufExpTime = s.headStreamExpTime + + for i := uint32(0); i < opts.AgeBuckets; i++ { + s.streams = append(s.streams, s.newStream()) + } + s.headStream = s.streams[0] + + for qu := range s.objectives { + s.sortedObjectives = append(s.sortedObjectives, qu) + } + sort.Float64s(s.sortedObjectives) + + s.init(s) // Init self-collection. + return s +} + +type summary struct { + selfCollector + + bufMtx sync.Mutex // Protects hotBuf and hotBufExpTime. + mtx sync.Mutex // Protects every other moving part. + // Lock bufMtx before mtx if both are needed. + + desc *Desc + + objectives map[float64]float64 + sortedObjectives []float64 + + labelPairs []*dto.LabelPair + + sum float64 + cnt uint64 + + hotBuf, coldBuf []float64 + + streams []*quantile.Stream + streamDuration time.Duration + headStream *quantile.Stream + headStreamIdx int + headStreamExpTime, hotBufExpTime time.Time +} + +func (s *summary) Desc() *Desc { + return s.desc +} + +func (s *summary) Observe(v float64) { + s.bufMtx.Lock() + defer s.bufMtx.Unlock() + + now := time.Now() + if now.After(s.hotBufExpTime) { + s.asyncFlush(now) + } + s.hotBuf = append(s.hotBuf, v) + if len(s.hotBuf) == cap(s.hotBuf) { + s.asyncFlush(now) + } +} + +func (s *summary) Write(out *dto.Metric) error { + sum := &dto.Summary{} + qs := make([]*dto.Quantile, 0, len(s.objectives)) + + s.bufMtx.Lock() + s.mtx.Lock() + // Swap bufs even if hotBuf is empty to set new hotBufExpTime. + s.swapBufs(time.Now()) + s.bufMtx.Unlock() + + s.flushColdBuf() + sum.SampleCount = proto.Uint64(s.cnt) + sum.SampleSum = proto.Float64(s.sum) + + for _, rank := range s.sortedObjectives { + var q float64 + if s.headStream.Count() == 0 { + q = math.NaN() + } else { + q = s.headStream.Query(rank) + } + qs = append(qs, &dto.Quantile{ + Quantile: proto.Float64(rank), + Value: proto.Float64(q), + }) + } + + s.mtx.Unlock() + + if len(qs) > 0 { + sort.Sort(quantSort(qs)) + } + sum.Quantile = qs + + out.Summary = sum + out.Label = s.labelPairs + return nil +} + +func (s *summary) newStream() *quantile.Stream { + return quantile.NewTargeted(s.objectives) +} + +// asyncFlush needs bufMtx locked. +func (s *summary) asyncFlush(now time.Time) { + s.mtx.Lock() + s.swapBufs(now) + + // Unblock the original goroutine that was responsible for the mutation + // that triggered the compaction. But hold onto the global non-buffer + // state mutex until the operation finishes. + go func() { + s.flushColdBuf() + s.mtx.Unlock() + }() +} + +// rotateStreams needs mtx AND bufMtx locked. +func (s *summary) maybeRotateStreams() { + for !s.hotBufExpTime.Equal(s.headStreamExpTime) { + s.headStream.Reset() + s.headStreamIdx++ + if s.headStreamIdx >= len(s.streams) { + s.headStreamIdx = 0 + } + s.headStream = s.streams[s.headStreamIdx] + s.headStreamExpTime = s.headStreamExpTime.Add(s.streamDuration) + } +} + +// flushColdBuf needs mtx locked. +func (s *summary) flushColdBuf() { + for _, v := range s.coldBuf { + for _, stream := range s.streams { + stream.Insert(v) + } + s.cnt++ + s.sum += v + } + s.coldBuf = s.coldBuf[0:0] + s.maybeRotateStreams() +} + +// swapBufs needs mtx AND bufMtx locked, coldBuf must be empty. +func (s *summary) swapBufs(now time.Time) { + if len(s.coldBuf) != 0 { + panic("coldBuf is not empty") + } + s.hotBuf, s.coldBuf = s.coldBuf, s.hotBuf + // hotBuf is now empty and gets new expiration set. + for now.After(s.hotBufExpTime) { + s.hotBufExpTime = s.hotBufExpTime.Add(s.streamDuration) + } +} + +type quantSort []*dto.Quantile + +func (s quantSort) Len() int { + return len(s) +} + +func (s quantSort) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s quantSort) Less(i, j int) bool { + return s[i].GetQuantile() < s[j].GetQuantile() +} + +// SummaryVec is a Collector that bundles a set of Summaries that all share the +// same Desc, but have different values for their variable labels. This is used +// if you want to count the same thing partitioned by various dimensions +// (e.g. HTTP request latencies, partitioned by status code and method). Create +// instances with NewSummaryVec. +type SummaryVec struct { + *MetricVec +} + +// NewSummaryVec creates a new SummaryVec based on the provided SummaryOpts and +// partitioned by the given label names. At least one label name must be +// provided. +func NewSummaryVec(opts SummaryOpts, labelNames []string) *SummaryVec { + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + labelNames, + opts.ConstLabels, + ) + return &SummaryVec{ + MetricVec: newMetricVec(desc, func(lvs ...string) Metric { + return newSummary(desc, opts, lvs...) + }), + } +} + +// GetMetricWithLabelValues replaces the method of the same name in +// MetricVec. The difference is that this method returns a Summary and not a +// Metric so that no type conversion is required. +func (m *SummaryVec) GetMetricWithLabelValues(lvs ...string) (Summary, error) { + metric, err := m.MetricVec.GetMetricWithLabelValues(lvs...) + if metric != nil { + return metric.(Summary), err + } + return nil, err +} + +// GetMetricWith replaces the method of the same name in MetricVec. The +// difference is that this method returns a Summary and not a Metric so that no +// type conversion is required. +func (m *SummaryVec) GetMetricWith(labels Labels) (Summary, error) { + metric, err := m.MetricVec.GetMetricWith(labels) + if metric != nil { + return metric.(Summary), err + } + return nil, err +} + +// WithLabelValues works as GetMetricWithLabelValues, but panics where +// GetMetricWithLabelValues would have returned an error. By not returning an +// error, WithLabelValues allows shortcuts like +// myVec.WithLabelValues("404", "GET").Observe(42.21) +func (m *SummaryVec) WithLabelValues(lvs ...string) Summary { + return m.MetricVec.WithLabelValues(lvs...).(Summary) +} + +// With works as GetMetricWith, but panics where GetMetricWithLabels would have +// returned an error. By not returning an error, With allows shortcuts like +// myVec.With(Labels{"code": "404", "method": "GET"}).Observe(42.21) +func (m *SummaryVec) With(labels Labels) Summary { + return m.MetricVec.With(labels).(Summary) +} + +type constSummary struct { + desc *Desc + count uint64 + sum float64 + quantiles map[float64]float64 + labelPairs []*dto.LabelPair +} + +func (s *constSummary) Desc() *Desc { + return s.desc +} + +func (s *constSummary) Write(out *dto.Metric) error { + sum := &dto.Summary{} + qs := make([]*dto.Quantile, 0, len(s.quantiles)) + + sum.SampleCount = proto.Uint64(s.count) + sum.SampleSum = proto.Float64(s.sum) + + for rank, q := range s.quantiles { + qs = append(qs, &dto.Quantile{ + Quantile: proto.Float64(rank), + Value: proto.Float64(q), + }) + } + + if len(qs) > 0 { + sort.Sort(quantSort(qs)) + } + sum.Quantile = qs + + out.Summary = sum + out.Label = s.labelPairs + + return nil +} + +// NewConstSummary returns a metric representing a Prometheus summary with fixed +// values for the count, sum, and quantiles. As those parameters cannot be +// changed, the returned value does not implement the Summary interface (but +// only the Metric interface). Users of this package will not have much use for +// it in regular operations. However, when implementing custom Collectors, it is +// useful as a throw-away metric that is generated on the fly to send it to +// Prometheus in the Collect method. +// +// quantiles maps ranks to quantile values. For example, a median latency of +// 0.23s and a 99th percentile latency of 0.56s would be expressed as: +// map[float64]float64{0.5: 0.23, 0.99: 0.56} +// +// NewConstSummary returns an error if the length of labelValues is not +// consistent with the variable labels in Desc. +func NewConstSummary( + desc *Desc, + count uint64, + sum float64, + quantiles map[float64]float64, + labelValues ...string, +) (Metric, error) { + if len(desc.variableLabels) != len(labelValues) { + return nil, errInconsistentCardinality + } + return &constSummary{ + desc: desc, + count: count, + sum: sum, + quantiles: quantiles, + labelPairs: makeLabelPairs(desc, labelValues), + }, nil +} + +// MustNewConstSummary is a version of NewConstSummary that panics where +// NewConstMetric would have returned an error. +func MustNewConstSummary( + desc *Desc, + count uint64, + sum float64, + quantiles map[float64]float64, + labelValues ...string, +) Metric { + m, err := NewConstSummary(desc, count, sum, quantiles, labelValues...) + if err != nil { + panic(err) + } + return m +} diff --git a/api/vendor/github.com/prometheus/client_golang/prometheus/summary_test.go b/api/vendor/github.com/prometheus/client_golang/prometheus/summary_test.go new file mode 100644 index 0000000..c4575ff --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/prometheus/summary_test.go @@ -0,0 +1,347 @@ +// Copyright 2014 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 prometheus + +import ( + "math" + "math/rand" + "sort" + "sync" + "testing" + "testing/quick" + "time" + + dto "github.com/prometheus/client_model/go" +) + +func benchmarkSummaryObserve(w int, b *testing.B) { + b.StopTimer() + + wg := new(sync.WaitGroup) + wg.Add(w) + + g := new(sync.WaitGroup) + g.Add(1) + + s := NewSummary(SummaryOpts{}) + + for i := 0; i < w; i++ { + go func() { + g.Wait() + + for i := 0; i < b.N; i++ { + s.Observe(float64(i)) + } + + wg.Done() + }() + } + + b.StartTimer() + g.Done() + wg.Wait() +} + +func BenchmarkSummaryObserve1(b *testing.B) { + benchmarkSummaryObserve(1, b) +} + +func BenchmarkSummaryObserve2(b *testing.B) { + benchmarkSummaryObserve(2, b) +} + +func BenchmarkSummaryObserve4(b *testing.B) { + benchmarkSummaryObserve(4, b) +} + +func BenchmarkSummaryObserve8(b *testing.B) { + benchmarkSummaryObserve(8, b) +} + +func benchmarkSummaryWrite(w int, b *testing.B) { + b.StopTimer() + + wg := new(sync.WaitGroup) + wg.Add(w) + + g := new(sync.WaitGroup) + g.Add(1) + + s := NewSummary(SummaryOpts{}) + + for i := 0; i < 1000000; i++ { + s.Observe(float64(i)) + } + + for j := 0; j < w; j++ { + outs := make([]dto.Metric, b.N) + + go func(o []dto.Metric) { + g.Wait() + + for i := 0; i < b.N; i++ { + s.Write(&o[i]) + } + + wg.Done() + }(outs) + } + + b.StartTimer() + g.Done() + wg.Wait() +} + +func BenchmarkSummaryWrite1(b *testing.B) { + benchmarkSummaryWrite(1, b) +} + +func BenchmarkSummaryWrite2(b *testing.B) { + benchmarkSummaryWrite(2, b) +} + +func BenchmarkSummaryWrite4(b *testing.B) { + benchmarkSummaryWrite(4, b) +} + +func BenchmarkSummaryWrite8(b *testing.B) { + benchmarkSummaryWrite(8, b) +} + +func TestSummaryConcurrency(t *testing.T) { + if testing.Short() { + t.Skip("Skipping test in short mode.") + } + + rand.Seed(42) + + it := func(n uint32) bool { + mutations := int(n%1e4 + 1e4) + concLevel := int(n%5 + 1) + total := mutations * concLevel + + var start, end sync.WaitGroup + start.Add(1) + end.Add(concLevel) + + sum := NewSummary(SummaryOpts{ + Name: "test_summary", + Help: "helpless", + }) + + allVars := make([]float64, total) + var sampleSum float64 + for i := 0; i < concLevel; i++ { + vals := make([]float64, mutations) + for j := 0; j < mutations; j++ { + v := rand.NormFloat64() + vals[j] = v + allVars[i*mutations+j] = v + sampleSum += v + } + + go func(vals []float64) { + start.Wait() + for _, v := range vals { + sum.Observe(v) + } + end.Done() + }(vals) + } + sort.Float64s(allVars) + start.Done() + end.Wait() + + m := &dto.Metric{} + sum.Write(m) + if got, want := int(*m.Summary.SampleCount), total; got != want { + t.Errorf("got sample count %d, want %d", got, want) + } + if got, want := *m.Summary.SampleSum, sampleSum; math.Abs((got-want)/want) > 0.001 { + t.Errorf("got sample sum %f, want %f", got, want) + } + + objectives := make([]float64, 0, len(DefObjectives)) + for qu := range DefObjectives { + objectives = append(objectives, qu) + } + sort.Float64s(objectives) + + for i, wantQ := range objectives { + ε := DefObjectives[wantQ] + gotQ := *m.Summary.Quantile[i].Quantile + gotV := *m.Summary.Quantile[i].Value + min, max := getBounds(allVars, wantQ, ε) + if gotQ != wantQ { + t.Errorf("got quantile %f, want %f", gotQ, wantQ) + } + if gotV < min || gotV > max { + t.Errorf("got %f for quantile %f, want [%f,%f]", gotV, gotQ, min, max) + } + } + return true + } + + if err := quick.Check(it, nil); err != nil { + t.Error(err) + } +} + +func TestSummaryVecConcurrency(t *testing.T) { + if testing.Short() { + t.Skip("Skipping test in short mode.") + } + + rand.Seed(42) + + objectives := make([]float64, 0, len(DefObjectives)) + for qu := range DefObjectives { + + objectives = append(objectives, qu) + } + sort.Float64s(objectives) + + it := func(n uint32) bool { + mutations := int(n%1e4 + 1e4) + concLevel := int(n%7 + 1) + vecLength := int(n%3 + 1) + + var start, end sync.WaitGroup + start.Add(1) + end.Add(concLevel) + + sum := NewSummaryVec( + SummaryOpts{ + Name: "test_summary", + Help: "helpless", + }, + []string{"label"}, + ) + + allVars := make([][]float64, vecLength) + sampleSums := make([]float64, vecLength) + for i := 0; i < concLevel; i++ { + vals := make([]float64, mutations) + picks := make([]int, mutations) + for j := 0; j < mutations; j++ { + v := rand.NormFloat64() + vals[j] = v + pick := rand.Intn(vecLength) + picks[j] = pick + allVars[pick] = append(allVars[pick], v) + sampleSums[pick] += v + } + + go func(vals []float64) { + start.Wait() + for i, v := range vals { + sum.WithLabelValues(string('A' + picks[i])).Observe(v) + } + end.Done() + }(vals) + } + for _, vars := range allVars { + sort.Float64s(vars) + } + start.Done() + end.Wait() + + for i := 0; i < vecLength; i++ { + m := &dto.Metric{} + s := sum.WithLabelValues(string('A' + i)) + s.Write(m) + if got, want := int(*m.Summary.SampleCount), len(allVars[i]); got != want { + t.Errorf("got sample count %d for label %c, want %d", got, 'A'+i, want) + } + if got, want := *m.Summary.SampleSum, sampleSums[i]; math.Abs((got-want)/want) > 0.001 { + t.Errorf("got sample sum %f for label %c, want %f", got, 'A'+i, want) + } + for j, wantQ := range objectives { + ε := DefObjectives[wantQ] + gotQ := *m.Summary.Quantile[j].Quantile + gotV := *m.Summary.Quantile[j].Value + min, max := getBounds(allVars[i], wantQ, ε) + if gotQ != wantQ { + t.Errorf("got quantile %f for label %c, want %f", gotQ, 'A'+i, wantQ) + } + if gotV < min || gotV > max { + t.Errorf("got %f for quantile %f for label %c, want [%f,%f]", gotV, gotQ, 'A'+i, min, max) + } + } + } + return true + } + + if err := quick.Check(it, nil); err != nil { + t.Error(err) + } +} + +func TestSummaryDecay(t *testing.T) { + if testing.Short() { + t.Skip("Skipping test in short mode.") + // More because it depends on timing than because it is particularly long... + } + + sum := NewSummary(SummaryOpts{ + Name: "test_summary", + Help: "helpless", + MaxAge: 100 * time.Millisecond, + Objectives: map[float64]float64{0.1: 0.001}, + AgeBuckets: 10, + }) + + m := &dto.Metric{} + i := 0 + tick := time.NewTicker(time.Millisecond) + for _ = range tick.C { + i++ + sum.Observe(float64(i)) + if i%10 == 0 { + sum.Write(m) + if got, want := *m.Summary.Quantile[0].Value, math.Max(float64(i)/10, float64(i-90)); math.Abs(got-want) > 20 { + t.Errorf("%d. got %f, want %f", i, got, want) + } + m.Reset() + } + if i >= 1000 { + break + } + } + tick.Stop() + // Wait for MaxAge without observations and make sure quantiles are NaN. + time.Sleep(100 * time.Millisecond) + sum.Write(m) + if got := *m.Summary.Quantile[0].Value; !math.IsNaN(got) { + t.Errorf("got %f, want NaN after expiration", got) + } +} + +func getBounds(vars []float64, q, ε float64) (min, max float64) { + // TODO(beorn7): This currently tolerates an error of up to 2*ε. The + // error must be at most ε, but for some reason, it's sometimes slightly + // higher. That's a bug. + n := float64(len(vars)) + lower := int((q - 2*ε) * n) + upper := int(math.Ceil((q + 2*ε) * n)) + min = vars[0] + if lower > 1 { + min = vars[lower-1] + } + max = vars[len(vars)-1] + if upper < len(vars) { + max = vars[upper-1] + } + return +} diff --git a/api/vendor/github.com/prometheus/client_golang/prometheus/untyped.go b/api/vendor/github.com/prometheus/client_golang/prometheus/untyped.go new file mode 100644 index 0000000..5faf7e6 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/prometheus/untyped.go @@ -0,0 +1,138 @@ +// Copyright 2014 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 prometheus + +// Untyped is a Metric that represents a single numerical value that can +// arbitrarily go up and down. +// +// An Untyped metric works the same as a Gauge. The only difference is that to +// no type information is implied. +// +// To create Untyped instances, use NewUntyped. +type Untyped interface { + Metric + Collector + + // Set sets the Untyped metric to an arbitrary value. + Set(float64) + // Inc increments the Untyped metric by 1. + Inc() + // Dec decrements the Untyped metric by 1. + Dec() + // Add adds the given value to the Untyped metric. (The value can be + // negative, resulting in a decrease.) + Add(float64) + // Sub subtracts the given value from the Untyped metric. (The value can + // be negative, resulting in an increase.) + Sub(float64) +} + +// UntypedOpts is an alias for Opts. See there for doc comments. +type UntypedOpts Opts + +// NewUntyped creates a new Untyped metric from the provided UntypedOpts. +func NewUntyped(opts UntypedOpts) Untyped { + return newValue(NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), UntypedValue, 0) +} + +// UntypedVec is a Collector that bundles a set of Untyped metrics that all +// share the same Desc, but have different values for their variable +// labels. This is used if you want to count the same thing partitioned by +// various dimensions. Create instances with NewUntypedVec. +type UntypedVec struct { + *MetricVec +} + +// NewUntypedVec creates a new UntypedVec based on the provided UntypedOpts and +// partitioned by the given label names. At least one label name must be +// provided. +func NewUntypedVec(opts UntypedOpts, labelNames []string) *UntypedVec { + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + labelNames, + opts.ConstLabels, + ) + return &UntypedVec{ + MetricVec: newMetricVec(desc, func(lvs ...string) Metric { + return newValue(desc, UntypedValue, 0, lvs...) + }), + } +} + +// GetMetricWithLabelValues replaces the method of the same name in +// MetricVec. The difference is that this method returns an Untyped and not a +// Metric so that no type conversion is required. +func (m *UntypedVec) GetMetricWithLabelValues(lvs ...string) (Untyped, error) { + metric, err := m.MetricVec.GetMetricWithLabelValues(lvs...) + if metric != nil { + return metric.(Untyped), err + } + return nil, err +} + +// GetMetricWith replaces the method of the same name in MetricVec. The +// difference is that this method returns an Untyped and not a Metric so that no +// type conversion is required. +func (m *UntypedVec) GetMetricWith(labels Labels) (Untyped, error) { + metric, err := m.MetricVec.GetMetricWith(labels) + if metric != nil { + return metric.(Untyped), err + } + return nil, err +} + +// WithLabelValues works as GetMetricWithLabelValues, but panics where +// GetMetricWithLabelValues would have returned an error. By not returning an +// error, WithLabelValues allows shortcuts like +// myVec.WithLabelValues("404", "GET").Add(42) +func (m *UntypedVec) WithLabelValues(lvs ...string) Untyped { + return m.MetricVec.WithLabelValues(lvs...).(Untyped) +} + +// With works as GetMetricWith, but panics where GetMetricWithLabels would have +// returned an error. By not returning an error, With allows shortcuts like +// myVec.With(Labels{"code": "404", "method": "GET"}).Add(42) +func (m *UntypedVec) With(labels Labels) Untyped { + return m.MetricVec.With(labels).(Untyped) +} + +// UntypedFunc is an Untyped whose value is determined at collect time by +// calling a provided function. +// +// To create UntypedFunc instances, use NewUntypedFunc. +type UntypedFunc interface { + Metric + Collector +} + +// NewUntypedFunc creates a new UntypedFunc based on the provided +// UntypedOpts. The value reported is determined by calling the given function +// from within the Write method. Take into account that metric collection may +// happen concurrently. If that results in concurrent calls to Write, like in +// the case where an UntypedFunc is directly registered with Prometheus, the +// provided function must be concurrency-safe. +func NewUntypedFunc(opts UntypedOpts, function func() float64) UntypedFunc { + return newValueFunc(NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), UntypedValue, function) +} diff --git a/api/vendor/github.com/prometheus/client_golang/prometheus/value.go b/api/vendor/github.com/prometheus/client_golang/prometheus/value.go new file mode 100644 index 0000000..a944c37 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/prometheus/value.go @@ -0,0 +1,234 @@ +// Copyright 2014 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 prometheus + +import ( + "errors" + "fmt" + "math" + "sort" + "sync/atomic" + + dto "github.com/prometheus/client_model/go" + + "github.com/golang/protobuf/proto" +) + +// ValueType is an enumeration of metric types that represent a simple value. +type ValueType int + +// Possible values for the ValueType enum. +const ( + _ ValueType = iota + CounterValue + GaugeValue + UntypedValue +) + +var errInconsistentCardinality = errors.New("inconsistent label cardinality") + +// value is a generic metric for simple values. It implements Metric, Collector, +// Counter, Gauge, and Untyped. Its effective type is determined by +// ValueType. This is a low-level building block used by the library to back the +// implementations of Counter, Gauge, and Untyped. +type value struct { + // valBits containst the bits of the represented float64 value. It has + // to go first in the struct to guarantee alignment for atomic + // operations. http://golang.org/pkg/sync/atomic/#pkg-note-BUG + valBits uint64 + + selfCollector + + desc *Desc + valType ValueType + labelPairs []*dto.LabelPair +} + +// newValue returns a newly allocated value with the given Desc, ValueType, +// sample value and label values. It panics if the number of label +// values is different from the number of variable labels in Desc. +func newValue(desc *Desc, valueType ValueType, val float64, labelValues ...string) *value { + if len(labelValues) != len(desc.variableLabels) { + panic(errInconsistentCardinality) + } + result := &value{ + desc: desc, + valType: valueType, + valBits: math.Float64bits(val), + labelPairs: makeLabelPairs(desc, labelValues), + } + result.init(result) + return result +} + +func (v *value) Desc() *Desc { + return v.desc +} + +func (v *value) Set(val float64) { + atomic.StoreUint64(&v.valBits, math.Float64bits(val)) +} + +func (v *value) Inc() { + v.Add(1) +} + +func (v *value) Dec() { + v.Add(-1) +} + +func (v *value) Add(val float64) { + for { + oldBits := atomic.LoadUint64(&v.valBits) + newBits := math.Float64bits(math.Float64frombits(oldBits) + val) + if atomic.CompareAndSwapUint64(&v.valBits, oldBits, newBits) { + return + } + } +} + +func (v *value) Sub(val float64) { + v.Add(val * -1) +} + +func (v *value) Write(out *dto.Metric) error { + val := math.Float64frombits(atomic.LoadUint64(&v.valBits)) + return populateMetric(v.valType, val, v.labelPairs, out) +} + +// valueFunc is a generic metric for simple values retrieved on collect time +// from a function. It implements Metric and Collector. Its effective type is +// determined by ValueType. This is a low-level building block used by the +// library to back the implementations of CounterFunc, GaugeFunc, and +// UntypedFunc. +type valueFunc struct { + selfCollector + + desc *Desc + valType ValueType + function func() float64 + labelPairs []*dto.LabelPair +} + +// newValueFunc returns a newly allocated valueFunc with the given Desc and +// ValueType. The value reported is determined by calling the given function +// from within the Write method. Take into account that metric collection may +// happen concurrently. If that results in concurrent calls to Write, like in +// the case where a valueFunc is directly registered with Prometheus, the +// provided function must be concurrency-safe. +func newValueFunc(desc *Desc, valueType ValueType, function func() float64) *valueFunc { + result := &valueFunc{ + desc: desc, + valType: valueType, + function: function, + labelPairs: makeLabelPairs(desc, nil), + } + result.init(result) + return result +} + +func (v *valueFunc) Desc() *Desc { + return v.desc +} + +func (v *valueFunc) Write(out *dto.Metric) error { + return populateMetric(v.valType, v.function(), v.labelPairs, out) +} + +// NewConstMetric returns a metric with one fixed value that cannot be +// changed. Users of this package will not have much use for it in regular +// operations. However, when implementing custom Collectors, it is useful as a +// throw-away metric that is generated on the fly to send it to Prometheus in +// the Collect method. NewConstMetric returns an error if the length of +// labelValues is not consistent with the variable labels in Desc. +func NewConstMetric(desc *Desc, valueType ValueType, value float64, labelValues ...string) (Metric, error) { + if len(desc.variableLabels) != len(labelValues) { + return nil, errInconsistentCardinality + } + return &constMetric{ + desc: desc, + valType: valueType, + val: value, + labelPairs: makeLabelPairs(desc, labelValues), + }, nil +} + +// MustNewConstMetric is a version of NewConstMetric that panics where +// NewConstMetric would have returned an error. +func MustNewConstMetric(desc *Desc, valueType ValueType, value float64, labelValues ...string) Metric { + m, err := NewConstMetric(desc, valueType, value, labelValues...) + if err != nil { + panic(err) + } + return m +} + +type constMetric struct { + desc *Desc + valType ValueType + val float64 + labelPairs []*dto.LabelPair +} + +func (m *constMetric) Desc() *Desc { + return m.desc +} + +func (m *constMetric) Write(out *dto.Metric) error { + return populateMetric(m.valType, m.val, m.labelPairs, out) +} + +func populateMetric( + t ValueType, + v float64, + labelPairs []*dto.LabelPair, + m *dto.Metric, +) error { + m.Label = labelPairs + switch t { + case CounterValue: + m.Counter = &dto.Counter{Value: proto.Float64(v)} + case GaugeValue: + m.Gauge = &dto.Gauge{Value: proto.Float64(v)} + case UntypedValue: + m.Untyped = &dto.Untyped{Value: proto.Float64(v)} + default: + return fmt.Errorf("encountered unknown type %v", t) + } + return nil +} + +func makeLabelPairs(desc *Desc, labelValues []string) []*dto.LabelPair { + totalLen := len(desc.variableLabels) + len(desc.constLabelPairs) + if totalLen == 0 { + // Super fast path. + return nil + } + if len(desc.variableLabels) == 0 { + // Moderately fast path. + return desc.constLabelPairs + } + labelPairs := make([]*dto.LabelPair, 0, totalLen) + for i, n := range desc.variableLabels { + labelPairs = append(labelPairs, &dto.LabelPair{ + Name: proto.String(n), + Value: proto.String(labelValues[i]), + }) + } + for _, lp := range desc.constLabelPairs { + labelPairs = append(labelPairs, lp) + } + sort.Sort(LabelPairSorter(labelPairs)) + return labelPairs +} diff --git a/api/vendor/github.com/prometheus/client_golang/prometheus/vec.go b/api/vendor/github.com/prometheus/client_golang/prometheus/vec.go new file mode 100644 index 0000000..7f3eef9 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/prometheus/vec.go @@ -0,0 +1,404 @@ +// Copyright 2014 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 prometheus + +import ( + "fmt" + "sync" + + "github.com/prometheus/common/model" +) + +// MetricVec is a Collector to bundle metrics of the same name that +// differ in their label values. MetricVec is usually not used directly but as a +// building block for implementations of vectors of a given metric +// type. GaugeVec, CounterVec, SummaryVec, and UntypedVec are examples already +// provided in this package. +type MetricVec struct { + mtx sync.RWMutex // Protects the children. + children map[uint64][]metricWithLabelValues + desc *Desc + + newMetric func(labelValues ...string) Metric + hashAdd func(h uint64, s string) uint64 // replace hash function for testing collision handling + hashAddByte func(h uint64, b byte) uint64 +} + +// newMetricVec returns an initialized MetricVec. The concrete value is +// returned for embedding into another struct. +func newMetricVec(desc *Desc, newMetric func(lvs ...string) Metric) *MetricVec { + return &MetricVec{ + children: map[uint64][]metricWithLabelValues{}, + desc: desc, + newMetric: newMetric, + hashAdd: hashAdd, + hashAddByte: hashAddByte, + } +} + +// metricWithLabelValues provides the metric and its label values for +// disambiguation on hash collision. +type metricWithLabelValues struct { + values []string + metric Metric +} + +// Describe implements Collector. The length of the returned slice +// is always one. +func (m *MetricVec) Describe(ch chan<- *Desc) { + ch <- m.desc +} + +// Collect implements Collector. +func (m *MetricVec) Collect(ch chan<- Metric) { + m.mtx.RLock() + defer m.mtx.RUnlock() + + for _, metrics := range m.children { + for _, metric := range metrics { + ch <- metric.metric + } + } +} + +// GetMetricWithLabelValues returns the Metric for the given slice of label +// values (same order as the VariableLabels in Desc). If that combination of +// label values is accessed for the first time, a new Metric is created. +// +// It is possible to call this method without using the returned Metric to only +// create the new Metric but leave it at its start value (e.g. a Summary or +// Histogram without any observations). See also the SummaryVec example. +// +// Keeping the Metric for later use is possible (and should be considered if +// performance is critical), but keep in mind that Reset, DeleteLabelValues and +// Delete can be used to delete the Metric from the MetricVec. In that case, the +// Metric will still exist, but it will not be exported anymore, even if a +// Metric with the same label values is created later. See also the CounterVec +// example. +// +// An error is returned if the number of label values is not the same as the +// number of VariableLabels in Desc. +// +// Note that for more than one label value, this method is prone to mistakes +// caused by an incorrect order of arguments. Consider GetMetricWith(Labels) as +// an alternative to avoid that type of mistake. For higher label numbers, the +// latter has a much more readable (albeit more verbose) syntax, but it comes +// with a performance overhead (for creating and processing the Labels map). +// See also the GaugeVec example. +func (m *MetricVec) GetMetricWithLabelValues(lvs ...string) (Metric, error) { + h, err := m.hashLabelValues(lvs) + if err != nil { + return nil, err + } + + return m.getOrCreateMetricWithLabelValues(h, lvs), nil +} + +// GetMetricWith returns the Metric for the given Labels map (the label names +// must match those of the VariableLabels in Desc). If that label map is +// accessed for the first time, a new Metric is created. Implications of +// creating a Metric without using it and keeping the Metric for later use are +// the same as for GetMetricWithLabelValues. +// +// An error is returned if the number and names of the Labels are inconsistent +// with those of the VariableLabels in Desc. +// +// This method is used for the same purpose as +// GetMetricWithLabelValues(...string). See there for pros and cons of the two +// methods. +func (m *MetricVec) GetMetricWith(labels Labels) (Metric, error) { + h, err := m.hashLabels(labels) + if err != nil { + return nil, err + } + + return m.getOrCreateMetricWithLabels(h, labels), nil +} + +// WithLabelValues works as GetMetricWithLabelValues, but panics if an error +// occurs. The method allows neat syntax like: +// httpReqs.WithLabelValues("404", "POST").Inc() +func (m *MetricVec) WithLabelValues(lvs ...string) Metric { + metric, err := m.GetMetricWithLabelValues(lvs...) + if err != nil { + panic(err) + } + return metric +} + +// With works as GetMetricWith, but panics if an error occurs. The method allows +// neat syntax like: +// httpReqs.With(Labels{"status":"404", "method":"POST"}).Inc() +func (m *MetricVec) With(labels Labels) Metric { + metric, err := m.GetMetricWith(labels) + if err != nil { + panic(err) + } + return metric +} + +// DeleteLabelValues removes the metric where the variable labels are the same +// as those passed in as labels (same order as the VariableLabels in Desc). It +// returns true if a metric was deleted. +// +// It is not an error if the number of label values is not the same as the +// number of VariableLabels in Desc. However, such inconsistent label count can +// never match an actual Metric, so the method will always return false in that +// case. +// +// Note that for more than one label value, this method is prone to mistakes +// caused by an incorrect order of arguments. Consider Delete(Labels) as an +// alternative to avoid that type of mistake. For higher label numbers, the +// latter has a much more readable (albeit more verbose) syntax, but it comes +// with a performance overhead (for creating and processing the Labels map). +// See also the CounterVec example. +func (m *MetricVec) DeleteLabelValues(lvs ...string) bool { + m.mtx.Lock() + defer m.mtx.Unlock() + + h, err := m.hashLabelValues(lvs) + if err != nil { + return false + } + return m.deleteByHashWithLabelValues(h, lvs) +} + +// Delete deletes the metric where the variable labels are the same as those +// passed in as labels. It returns true if a metric was deleted. +// +// It is not an error if the number and names of the Labels are inconsistent +// with those of the VariableLabels in the Desc of the MetricVec. However, such +// inconsistent Labels can never match an actual Metric, so the method will +// always return false in that case. +// +// This method is used for the same purpose as DeleteLabelValues(...string). See +// there for pros and cons of the two methods. +func (m *MetricVec) Delete(labels Labels) bool { + m.mtx.Lock() + defer m.mtx.Unlock() + + h, err := m.hashLabels(labels) + if err != nil { + return false + } + + return m.deleteByHashWithLabels(h, labels) +} + +// deleteByHashWithLabelValues removes the metric from the hash bucket h. If +// there are multiple matches in the bucket, use lvs to select a metric and +// remove only that metric. +func (m *MetricVec) deleteByHashWithLabelValues(h uint64, lvs []string) bool { + metrics, ok := m.children[h] + if !ok { + return false + } + + i := m.findMetricWithLabelValues(metrics, lvs) + if i >= len(metrics) { + return false + } + + if len(metrics) > 1 { + m.children[h] = append(metrics[:i], metrics[i+1:]...) + } else { + delete(m.children, h) + } + return true +} + +// deleteByHashWithLabels removes the metric from the hash bucket h. If there +// are multiple matches in the bucket, use lvs to select a metric and remove +// only that metric. +func (m *MetricVec) deleteByHashWithLabels(h uint64, labels Labels) bool { + metrics, ok := m.children[h] + if !ok { + return false + } + i := m.findMetricWithLabels(metrics, labels) + if i >= len(metrics) { + return false + } + + if len(metrics) > 1 { + m.children[h] = append(metrics[:i], metrics[i+1:]...) + } else { + delete(m.children, h) + } + return true +} + +// Reset deletes all metrics in this vector. +func (m *MetricVec) Reset() { + m.mtx.Lock() + defer m.mtx.Unlock() + + for h := range m.children { + delete(m.children, h) + } +} + +func (m *MetricVec) hashLabelValues(vals []string) (uint64, error) { + if len(vals) != len(m.desc.variableLabels) { + return 0, errInconsistentCardinality + } + h := hashNew() + for _, val := range vals { + h = m.hashAdd(h, val) + h = m.hashAddByte(h, model.SeparatorByte) + } + return h, nil +} + +func (m *MetricVec) hashLabels(labels Labels) (uint64, error) { + if len(labels) != len(m.desc.variableLabels) { + return 0, errInconsistentCardinality + } + h := hashNew() + for _, label := range m.desc.variableLabels { + val, ok := labels[label] + if !ok { + return 0, fmt.Errorf("label name %q missing in label map", label) + } + h = m.hashAdd(h, val) + h = m.hashAddByte(h, model.SeparatorByte) + } + return h, nil +} + +// getOrCreateMetricWithLabelValues retrieves the metric by hash and label value +// or creates it and returns the new one. +// +// This function holds the mutex. +func (m *MetricVec) getOrCreateMetricWithLabelValues(hash uint64, lvs []string) Metric { + m.mtx.RLock() + metric, ok := m.getMetricWithLabelValues(hash, lvs) + m.mtx.RUnlock() + if ok { + return metric + } + + m.mtx.Lock() + defer m.mtx.Unlock() + metric, ok = m.getMetricWithLabelValues(hash, lvs) + if !ok { + // Copy to avoid allocation in case wo don't go down this code path. + copiedLVs := make([]string, len(lvs)) + copy(copiedLVs, lvs) + metric = m.newMetric(copiedLVs...) + m.children[hash] = append(m.children[hash], metricWithLabelValues{values: copiedLVs, metric: metric}) + } + return metric +} + +// getOrCreateMetricWithLabelValues retrieves the metric by hash and label value +// or creates it and returns the new one. +// +// This function holds the mutex. +func (m *MetricVec) getOrCreateMetricWithLabels(hash uint64, labels Labels) Metric { + m.mtx.RLock() + metric, ok := m.getMetricWithLabels(hash, labels) + m.mtx.RUnlock() + if ok { + return metric + } + + m.mtx.Lock() + defer m.mtx.Unlock() + metric, ok = m.getMetricWithLabels(hash, labels) + if !ok { + lvs := m.extractLabelValues(labels) + metric = m.newMetric(lvs...) + m.children[hash] = append(m.children[hash], metricWithLabelValues{values: lvs, metric: metric}) + } + return metric +} + +// getMetricWithLabelValues gets a metric while handling possible collisions in +// the hash space. Must be called while holding read mutex. +func (m *MetricVec) getMetricWithLabelValues(h uint64, lvs []string) (Metric, bool) { + metrics, ok := m.children[h] + if ok { + if i := m.findMetricWithLabelValues(metrics, lvs); i < len(metrics) { + return metrics[i].metric, true + } + } + return nil, false +} + +// getMetricWithLabels gets a metric while handling possible collisions in +// the hash space. Must be called while holding read mutex. +func (m *MetricVec) getMetricWithLabels(h uint64, labels Labels) (Metric, bool) { + metrics, ok := m.children[h] + if ok { + if i := m.findMetricWithLabels(metrics, labels); i < len(metrics) { + return metrics[i].metric, true + } + } + return nil, false +} + +// findMetricWithLabelValues returns the index of the matching metric or +// len(metrics) if not found. +func (m *MetricVec) findMetricWithLabelValues(metrics []metricWithLabelValues, lvs []string) int { + for i, metric := range metrics { + if m.matchLabelValues(metric.values, lvs) { + return i + } + } + return len(metrics) +} + +// findMetricWithLabels returns the index of the matching metric or len(metrics) +// if not found. +func (m *MetricVec) findMetricWithLabels(metrics []metricWithLabelValues, labels Labels) int { + for i, metric := range metrics { + if m.matchLabels(metric.values, labels) { + return i + } + } + return len(metrics) +} + +func (m *MetricVec) matchLabelValues(values []string, lvs []string) bool { + if len(values) != len(lvs) { + return false + } + for i, v := range values { + if v != lvs[i] { + return false + } + } + return true +} + +func (m *MetricVec) matchLabels(values []string, labels Labels) bool { + if len(labels) != len(values) { + return false + } + for i, k := range m.desc.variableLabels { + if values[i] != labels[k] { + return false + } + } + return true +} + +func (m *MetricVec) extractLabelValues(labels Labels) []string { + labelValues := make([]string, len(labels)) + for i, k := range m.desc.variableLabels { + labelValues[i] = labels[k] + } + return labelValues +} diff --git a/api/vendor/github.com/prometheus/client_golang/prometheus/vec_test.go b/api/vendor/github.com/prometheus/client_golang/prometheus/vec_test.go new file mode 100644 index 0000000..445a6b3 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_golang/prometheus/vec_test.go @@ -0,0 +1,312 @@ +// Copyright 2014 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 prometheus + +import ( + "fmt" + "testing" + + dto "github.com/prometheus/client_model/go" +) + +func TestDelete(t *testing.T) { + vec := NewUntypedVec( + UntypedOpts{ + Name: "test", + Help: "helpless", + }, + []string{"l1", "l2"}, + ) + testDelete(t, vec) +} + +func TestDeleteWithCollisions(t *testing.T) { + vec := NewUntypedVec( + UntypedOpts{ + Name: "test", + Help: "helpless", + }, + []string{"l1", "l2"}, + ) + vec.hashAdd = func(h uint64, s string) uint64 { return 1 } + vec.hashAddByte = func(h uint64, b byte) uint64 { return 1 } + testDelete(t, vec) +} + +func testDelete(t *testing.T, vec *UntypedVec) { + if got, want := vec.Delete(Labels{"l1": "v1", "l2": "v2"}), false; got != want { + t.Errorf("got %v, want %v", got, want) + } + + vec.With(Labels{"l1": "v1", "l2": "v2"}).(Untyped).Set(42) + if got, want := vec.Delete(Labels{"l1": "v1", "l2": "v2"}), true; got != want { + t.Errorf("got %v, want %v", got, want) + } + if got, want := vec.Delete(Labels{"l1": "v1", "l2": "v2"}), false; got != want { + t.Errorf("got %v, want %v", got, want) + } + + vec.With(Labels{"l1": "v1", "l2": "v2"}).(Untyped).Set(42) + if got, want := vec.Delete(Labels{"l2": "v2", "l1": "v1"}), true; got != want { + t.Errorf("got %v, want %v", got, want) + } + if got, want := vec.Delete(Labels{"l2": "v2", "l1": "v1"}), false; got != want { + t.Errorf("got %v, want %v", got, want) + } + + vec.With(Labels{"l1": "v1", "l2": "v2"}).(Untyped).Set(42) + if got, want := vec.Delete(Labels{"l2": "v1", "l1": "v2"}), false; got != want { + t.Errorf("got %v, want %v", got, want) + } + if got, want := vec.Delete(Labels{"l1": "v1"}), false; got != want { + t.Errorf("got %v, want %v", got, want) + } +} + +func TestDeleteLabelValues(t *testing.T) { + vec := NewUntypedVec( + UntypedOpts{ + Name: "test", + Help: "helpless", + }, + []string{"l1", "l2"}, + ) + testDeleteLabelValues(t, vec) +} + +func TestDeleteLabelValuesWithCollisions(t *testing.T) { + vec := NewUntypedVec( + UntypedOpts{ + Name: "test", + Help: "helpless", + }, + []string{"l1", "l2"}, + ) + vec.hashAdd = func(h uint64, s string) uint64 { return 1 } + vec.hashAddByte = func(h uint64, b byte) uint64 { return 1 } + testDeleteLabelValues(t, vec) +} + +func testDeleteLabelValues(t *testing.T, vec *UntypedVec) { + if got, want := vec.DeleteLabelValues("v1", "v2"), false; got != want { + t.Errorf("got %v, want %v", got, want) + } + + vec.With(Labels{"l1": "v1", "l2": "v2"}).(Untyped).Set(42) + vec.With(Labels{"l1": "v1", "l2": "v3"}).(Untyped).Set(42) // Add junk data for collision. + if got, want := vec.DeleteLabelValues("v1", "v2"), true; got != want { + t.Errorf("got %v, want %v", got, want) + } + if got, want := vec.DeleteLabelValues("v1", "v2"), false; got != want { + t.Errorf("got %v, want %v", got, want) + } + if got, want := vec.DeleteLabelValues("v1", "v3"), true; got != want { + t.Errorf("got %v, want %v", got, want) + } + + vec.With(Labels{"l1": "v1", "l2": "v2"}).(Untyped).Set(42) + // Delete out of order. + if got, want := vec.DeleteLabelValues("v2", "v1"), false; got != want { + t.Errorf("got %v, want %v", got, want) + } + if got, want := vec.DeleteLabelValues("v1"), false; got != want { + t.Errorf("got %v, want %v", got, want) + } +} + +func TestMetricVec(t *testing.T) { + vec := NewUntypedVec( + UntypedOpts{ + Name: "test", + Help: "helpless", + }, + []string{"l1", "l2"}, + ) + testMetricVec(t, vec) +} + +func TestMetricVecWithCollisions(t *testing.T) { + vec := NewUntypedVec( + UntypedOpts{ + Name: "test", + Help: "helpless", + }, + []string{"l1", "l2"}, + ) + vec.hashAdd = func(h uint64, s string) uint64 { return 1 } + vec.hashAddByte = func(h uint64, b byte) uint64 { return 1 } + testMetricVec(t, vec) +} + +func testMetricVec(t *testing.T, vec *UntypedVec) { + vec.Reset() // Actually test Reset now! + + var pair [2]string + // Keep track of metrics. + expected := map[[2]string]int{} + + for i := 0; i < 1000; i++ { + pair[0], pair[1] = fmt.Sprint(i%4), fmt.Sprint(i%5) // Varying combinations multiples. + expected[pair]++ + vec.WithLabelValues(pair[0], pair[1]).Inc() + + expected[[2]string{"v1", "v2"}]++ + vec.WithLabelValues("v1", "v2").(Untyped).Inc() + } + + var total int + for _, metrics := range vec.children { + for _, metric := range metrics { + total++ + copy(pair[:], metric.values) + + var metricOut dto.Metric + if err := metric.metric.Write(&metricOut); err != nil { + t.Fatal(err) + } + actual := *metricOut.Untyped.Value + + var actualPair [2]string + for i, label := range metricOut.Label { + actualPair[i] = *label.Value + } + + // Test output pair against metric.values to ensure we've selected + // the right one. We check this to ensure the below check means + // anything at all. + if actualPair != pair { + t.Fatalf("unexpected pair association in metric map: %v != %v", actualPair, pair) + } + + if actual != float64(expected[pair]) { + t.Fatalf("incorrect counter value for %v: %v != %v", pair, actual, expected[pair]) + } + } + } + + if total != len(expected) { + t.Fatalf("unexpected number of metrics: %v != %v", total, len(expected)) + } + + vec.Reset() + + if len(vec.children) > 0 { + t.Fatalf("reset failed") + } +} + +func TestCounterVecEndToEndWithCollision(t *testing.T) { + vec := NewCounterVec( + CounterOpts{ + Name: "test", + Help: "helpless", + }, + []string{"labelname"}, + ) + vec.WithLabelValues("77kepQFQ8Kl").Inc() + vec.WithLabelValues("!0IC=VloaY").Add(2) + + m := &dto.Metric{} + if err := vec.WithLabelValues("77kepQFQ8Kl").Write(m); err != nil { + t.Fatal(err) + } + if got, want := m.GetLabel()[0].GetValue(), "77kepQFQ8Kl"; got != want { + t.Errorf("got label value %q, want %q", got, want) + } + if got, want := m.GetCounter().GetValue(), 1.; got != want { + t.Errorf("got value %f, want %f", got, want) + } + m.Reset() + if err := vec.WithLabelValues("!0IC=VloaY").Write(m); err != nil { + t.Fatal(err) + } + if got, want := m.GetLabel()[0].GetValue(), "!0IC=VloaY"; got != want { + t.Errorf("got label value %q, want %q", got, want) + } + if got, want := m.GetCounter().GetValue(), 2.; got != want { + t.Errorf("got value %f, want %f", got, want) + } +} + +func BenchmarkMetricVecWithLabelValuesBasic(b *testing.B) { + benchmarkMetricVecWithLabelValues(b, map[string][]string{ + "l1": []string{"onevalue"}, + "l2": []string{"twovalue"}, + }) +} + +func BenchmarkMetricVecWithLabelValues2Keys10ValueCardinality(b *testing.B) { + benchmarkMetricVecWithLabelValuesCardinality(b, 2, 10) +} + +func BenchmarkMetricVecWithLabelValues4Keys10ValueCardinality(b *testing.B) { + benchmarkMetricVecWithLabelValuesCardinality(b, 4, 10) +} + +func BenchmarkMetricVecWithLabelValues2Keys100ValueCardinality(b *testing.B) { + benchmarkMetricVecWithLabelValuesCardinality(b, 2, 100) +} + +func BenchmarkMetricVecWithLabelValues10Keys100ValueCardinality(b *testing.B) { + benchmarkMetricVecWithLabelValuesCardinality(b, 10, 100) +} + +func BenchmarkMetricVecWithLabelValues10Keys1000ValueCardinality(b *testing.B) { + benchmarkMetricVecWithLabelValuesCardinality(b, 10, 1000) +} + +func benchmarkMetricVecWithLabelValuesCardinality(b *testing.B, nkeys, nvalues int) { + labels := map[string][]string{} + + for i := 0; i < nkeys; i++ { + var ( + k = fmt.Sprintf("key-%v", i) + vs = make([]string, 0, nvalues) + ) + for j := 0; j < nvalues; j++ { + vs = append(vs, fmt.Sprintf("value-%v", j)) + } + labels[k] = vs + } + + benchmarkMetricVecWithLabelValues(b, labels) +} + +func benchmarkMetricVecWithLabelValues(b *testing.B, labels map[string][]string) { + var keys []string + for k := range labels { // Map order dependent, who cares though. + keys = append(keys, k) + } + + values := make([]string, len(labels)) // Value cache for permutations. + vec := NewUntypedVec( + UntypedOpts{ + Name: "test", + Help: "helpless", + }, + keys, + ) + + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + // Varies input across provide map entries based on key size. + for j, k := range keys { + candidates := labels[k] + values[j] = candidates[i%len(candidates)] + } + + vec.WithLabelValues(values...) + } +} diff --git a/api/vendor/github.com/prometheus/client_model/.gitignore b/api/vendor/github.com/prometheus/client_model/.gitignore new file mode 100644 index 0000000..2f7896d --- /dev/null +++ b/api/vendor/github.com/prometheus/client_model/.gitignore @@ -0,0 +1 @@ +target/ diff --git a/api/vendor/github.com/prometheus/client_model/CONTRIBUTING.md b/api/vendor/github.com/prometheus/client_model/CONTRIBUTING.md new file mode 100644 index 0000000..40503ed --- /dev/null +++ b/api/vendor/github.com/prometheus/client_model/CONTRIBUTING.md @@ -0,0 +1,18 @@ +# Contributing + +Prometheus uses GitHub to manage reviews of pull requests. + +* If you have a trivial fix or improvement, go ahead and create a pull request, + addressing (with `@...`) the maintainer of this repository (see + [MAINTAINERS.md](MAINTAINERS.md)) in the description of the pull request. + +* If you plan to do something more involved, first discuss your ideas + on our [mailing list](https://groups.google.com/forum/?fromgroups#!forum/prometheus-developers). + This will avoid unnecessary work and surely give you and us a good deal + of inspiration. + +* Relevant coding style guidelines are the [Go Code Review + Comments](https://code.google.com/p/go-wiki/wiki/CodeReviewComments) + and the _Formatting and style_ section of Peter Bourgon's [Go: Best + Practices for Production + Environments](http://peter.bourgon.org/go-in-production/#formatting-and-style). diff --git a/api/vendor/github.com/prometheus/client_model/LICENSE b/api/vendor/github.com/prometheus/client_model/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_model/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 [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/api/vendor/github.com/prometheus/client_model/MAINTAINERS.md b/api/vendor/github.com/prometheus/client_model/MAINTAINERS.md new file mode 100644 index 0000000..3ede55f --- /dev/null +++ b/api/vendor/github.com/prometheus/client_model/MAINTAINERS.md @@ -0,0 +1 @@ +* Björn Rabenstein diff --git a/api/vendor/github.com/prometheus/client_model/Makefile b/api/vendor/github.com/prometheus/client_model/Makefile new file mode 100644 index 0000000..e147c69 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_model/Makefile @@ -0,0 +1,62 @@ +# Copyright 2013 Prometheus Team +# 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. + +KEY_ID ?= _DEFINE_ME_ + +all: cpp go java python ruby + +SUFFIXES: + +cpp: cpp/metrics.pb.cc cpp/metrics.pb.h + +cpp/metrics.pb.cc: metrics.proto + protoc $< --cpp_out=cpp/ + +cpp/metrics.pb.h: metrics.proto + protoc $< --cpp_out=cpp/ + +go: go/metrics.pb.go + +go/metrics.pb.go: metrics.proto + protoc $< --go_out=go/ + +java: src/main/java/io/prometheus/client/Metrics.java pom.xml + mvn clean compile package + +src/main/java/io/prometheus/client/Metrics.java: metrics.proto + protoc $< --java_out=src/main/java + +python: python/prometheus/client/model/metrics_pb2.py + +python/prometheus/client/model/metrics_pb2.py: metrics.proto + mkdir -p python/prometheus/client/model + protoc $< --python_out=python/prometheus/client/model + +ruby: + $(MAKE) -C ruby build + +clean: + -rm -rf cpp/* + -rm -rf go/* + -rm -rf java/* + -rm -rf python/* + -$(MAKE) -C ruby clean + -mvn clean + +maven-deploy-snapshot: java + mvn clean deploy -Dgpg.keyname=$(KEY_ID) -DperformRelease=true + +maven-deploy-release: java + mvn clean release:clean release:prepare release:perform -Dgpg.keyname=$(KEY_ID) -DperformRelease=true + +.PHONY: all clean cpp go java maven-deploy-snapshot maven-deploy-release python ruby diff --git a/api/vendor/github.com/prometheus/client_model/NOTICE b/api/vendor/github.com/prometheus/client_model/NOTICE new file mode 100644 index 0000000..20110e4 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_model/NOTICE @@ -0,0 +1,5 @@ +Data model artifacts for Prometheus. +Copyright 2012-2015 The Prometheus Authors + +This product includes software developed at +SoundCloud Ltd. (http://soundcloud.com/). diff --git a/api/vendor/github.com/prometheus/client_model/README.md b/api/vendor/github.com/prometheus/client_model/README.md new file mode 100644 index 0000000..a710042 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_model/README.md @@ -0,0 +1,26 @@ +# Background +Under most circumstances, manually downloading this repository should never +be required. + +# Prerequisites +# Base +* [Google Protocol Buffers](https://developers.google.com/protocol-buffers) + +## Java +* [Apache Maven](http://maven.apache.org) +* [Prometheus Maven Repository](https://github.com/prometheus/io.prometheus-maven-repository) checked out into ../io.prometheus-maven-repository + +## Go +* [Go](http://golang.org) +* [goprotobuf](https://code.google.com/p/goprotobuf) + +## Ruby +* [Ruby](https://www.ruby-lang.org) +* [bundler](https://rubygems.org/gems/bundler) + +# Building + $ make + +# Getting Started + * The Go source code is periodically indexed: [Go Protocol Buffer Model](http://godoc.org/github.com/prometheus/client_model/go). + * All of the core developers are accessible via the [Prometheus Developers Mailinglist](https://groups.google.com/forum/?fromgroups#!forum/prometheus-developers). diff --git a/api/vendor/github.com/prometheus/client_model/cpp/metrics.pb.cc b/api/vendor/github.com/prometheus/client_model/cpp/metrics.pb.cc new file mode 100644 index 0000000..1ff893b --- /dev/null +++ b/api/vendor/github.com/prometheus/client_model/cpp/metrics.pb.cc @@ -0,0 +1,3380 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: metrics.proto + +#define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION +#include "metrics.pb.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +// @@protoc_insertion_point(includes) + +namespace io { +namespace prometheus { +namespace client { + +namespace { + +const ::google::protobuf::Descriptor* LabelPair_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + LabelPair_reflection_ = NULL; +const ::google::protobuf::Descriptor* Gauge_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + Gauge_reflection_ = NULL; +const ::google::protobuf::Descriptor* Counter_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + Counter_reflection_ = NULL; +const ::google::protobuf::Descriptor* Quantile_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + Quantile_reflection_ = NULL; +const ::google::protobuf::Descriptor* Summary_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + Summary_reflection_ = NULL; +const ::google::protobuf::Descriptor* Untyped_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + Untyped_reflection_ = NULL; +const ::google::protobuf::Descriptor* Histogram_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + Histogram_reflection_ = NULL; +const ::google::protobuf::Descriptor* Bucket_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + Bucket_reflection_ = NULL; +const ::google::protobuf::Descriptor* Metric_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + Metric_reflection_ = NULL; +const ::google::protobuf::Descriptor* MetricFamily_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + MetricFamily_reflection_ = NULL; +const ::google::protobuf::EnumDescriptor* MetricType_descriptor_ = NULL; + +} // namespace + + +void protobuf_AssignDesc_metrics_2eproto() { + protobuf_AddDesc_metrics_2eproto(); + const ::google::protobuf::FileDescriptor* file = + ::google::protobuf::DescriptorPool::generated_pool()->FindFileByName( + "metrics.proto"); + GOOGLE_CHECK(file != NULL); + LabelPair_descriptor_ = file->message_type(0); + static const int LabelPair_offsets_[2] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(LabelPair, name_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(LabelPair, value_), + }; + LabelPair_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + LabelPair_descriptor_, + LabelPair::default_instance_, + LabelPair_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(LabelPair, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(LabelPair, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(LabelPair)); + Gauge_descriptor_ = file->message_type(1); + static const int Gauge_offsets_[1] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Gauge, value_), + }; + Gauge_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + Gauge_descriptor_, + Gauge::default_instance_, + Gauge_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Gauge, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Gauge, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(Gauge)); + Counter_descriptor_ = file->message_type(2); + static const int Counter_offsets_[1] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Counter, value_), + }; + Counter_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + Counter_descriptor_, + Counter::default_instance_, + Counter_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Counter, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Counter, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(Counter)); + Quantile_descriptor_ = file->message_type(3); + static const int Quantile_offsets_[2] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Quantile, quantile_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Quantile, value_), + }; + Quantile_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + Quantile_descriptor_, + Quantile::default_instance_, + Quantile_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Quantile, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Quantile, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(Quantile)); + Summary_descriptor_ = file->message_type(4); + static const int Summary_offsets_[3] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Summary, sample_count_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Summary, sample_sum_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Summary, quantile_), + }; + Summary_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + Summary_descriptor_, + Summary::default_instance_, + Summary_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Summary, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Summary, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(Summary)); + Untyped_descriptor_ = file->message_type(5); + static const int Untyped_offsets_[1] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Untyped, value_), + }; + Untyped_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + Untyped_descriptor_, + Untyped::default_instance_, + Untyped_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Untyped, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Untyped, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(Untyped)); + Histogram_descriptor_ = file->message_type(6); + static const int Histogram_offsets_[3] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Histogram, sample_count_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Histogram, sample_sum_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Histogram, bucket_), + }; + Histogram_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + Histogram_descriptor_, + Histogram::default_instance_, + Histogram_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Histogram, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Histogram, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(Histogram)); + Bucket_descriptor_ = file->message_type(7); + static const int Bucket_offsets_[2] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Bucket, cumulative_count_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Bucket, upper_bound_), + }; + Bucket_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + Bucket_descriptor_, + Bucket::default_instance_, + Bucket_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Bucket, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Bucket, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(Bucket)); + Metric_descriptor_ = file->message_type(8); + static const int Metric_offsets_[7] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Metric, label_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Metric, gauge_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Metric, counter_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Metric, summary_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Metric, untyped_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Metric, histogram_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Metric, timestamp_ms_), + }; + Metric_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + Metric_descriptor_, + Metric::default_instance_, + Metric_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Metric, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Metric, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(Metric)); + MetricFamily_descriptor_ = file->message_type(9); + static const int MetricFamily_offsets_[4] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MetricFamily, name_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MetricFamily, help_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MetricFamily, type_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MetricFamily, metric_), + }; + MetricFamily_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + MetricFamily_descriptor_, + MetricFamily::default_instance_, + MetricFamily_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MetricFamily, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MetricFamily, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(MetricFamily)); + MetricType_descriptor_ = file->enum_type(0); +} + +namespace { + +GOOGLE_PROTOBUF_DECLARE_ONCE(protobuf_AssignDescriptors_once_); +inline void protobuf_AssignDescriptorsOnce() { + ::google::protobuf::GoogleOnceInit(&protobuf_AssignDescriptors_once_, + &protobuf_AssignDesc_metrics_2eproto); +} + +void protobuf_RegisterTypes(const ::std::string&) { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + LabelPair_descriptor_, &LabelPair::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + Gauge_descriptor_, &Gauge::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + Counter_descriptor_, &Counter::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + Quantile_descriptor_, &Quantile::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + Summary_descriptor_, &Summary::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + Untyped_descriptor_, &Untyped::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + Histogram_descriptor_, &Histogram::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + Bucket_descriptor_, &Bucket::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + Metric_descriptor_, &Metric::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + MetricFamily_descriptor_, &MetricFamily::default_instance()); +} + +} // namespace + +void protobuf_ShutdownFile_metrics_2eproto() { + delete LabelPair::default_instance_; + delete LabelPair_reflection_; + delete Gauge::default_instance_; + delete Gauge_reflection_; + delete Counter::default_instance_; + delete Counter_reflection_; + delete Quantile::default_instance_; + delete Quantile_reflection_; + delete Summary::default_instance_; + delete Summary_reflection_; + delete Untyped::default_instance_; + delete Untyped_reflection_; + delete Histogram::default_instance_; + delete Histogram_reflection_; + delete Bucket::default_instance_; + delete Bucket_reflection_; + delete Metric::default_instance_; + delete Metric_reflection_; + delete MetricFamily::default_instance_; + delete MetricFamily_reflection_; +} + +void protobuf_AddDesc_metrics_2eproto() { + static bool already_here = false; + if (already_here) return; + already_here = true; + GOOGLE_PROTOBUF_VERIFY_VERSION; + + ::google::protobuf::DescriptorPool::InternalAddGeneratedFile( + "\n\rmetrics.proto\022\024io.prometheus.client\"(\n" + "\tLabelPair\022\014\n\004name\030\001 \001(\t\022\r\n\005value\030\002 \001(\t\"" + "\026\n\005Gauge\022\r\n\005value\030\001 \001(\001\"\030\n\007Counter\022\r\n\005va" + "lue\030\001 \001(\001\"+\n\010Quantile\022\020\n\010quantile\030\001 \001(\001\022" + "\r\n\005value\030\002 \001(\001\"e\n\007Summary\022\024\n\014sample_coun" + "t\030\001 \001(\004\022\022\n\nsample_sum\030\002 \001(\001\0220\n\010quantile\030" + "\003 \003(\0132\036.io.prometheus.client.Quantile\"\030\n" + "\007Untyped\022\r\n\005value\030\001 \001(\001\"c\n\tHistogram\022\024\n\014" + "sample_count\030\001 \001(\004\022\022\n\nsample_sum\030\002 \001(\001\022," + "\n\006bucket\030\003 \003(\0132\034.io.prometheus.client.Bu" + "cket\"7\n\006Bucket\022\030\n\020cumulative_count\030\001 \001(\004" + "\022\023\n\013upper_bound\030\002 \001(\001\"\276\002\n\006Metric\022.\n\005labe" + "l\030\001 \003(\0132\037.io.prometheus.client.LabelPair" + "\022*\n\005gauge\030\002 \001(\0132\033.io.prometheus.client.G" + "auge\022.\n\007counter\030\003 \001(\0132\035.io.prometheus.cl" + "ient.Counter\022.\n\007summary\030\004 \001(\0132\035.io.prome" + "theus.client.Summary\022.\n\007untyped\030\005 \001(\0132\035." + "io.prometheus.client.Untyped\0222\n\thistogra" + "m\030\007 \001(\0132\037.io.prometheus.client.Histogram" + "\022\024\n\014timestamp_ms\030\006 \001(\003\"\210\001\n\014MetricFamily\022" + "\014\n\004name\030\001 \001(\t\022\014\n\004help\030\002 \001(\t\022.\n\004type\030\003 \001(" + "\0162 .io.prometheus.client.MetricType\022,\n\006m" + "etric\030\004 \003(\0132\034.io.prometheus.client.Metri" + "c*M\n\nMetricType\022\013\n\007COUNTER\020\000\022\t\n\005GAUGE\020\001\022" + "\013\n\007SUMMARY\020\002\022\013\n\007UNTYPED\020\003\022\r\n\tHISTOGRAM\020\004" + "B\026\n\024io.prometheus.client", 1024); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile( + "metrics.proto", &protobuf_RegisterTypes); + LabelPair::default_instance_ = new LabelPair(); + Gauge::default_instance_ = new Gauge(); + Counter::default_instance_ = new Counter(); + Quantile::default_instance_ = new Quantile(); + Summary::default_instance_ = new Summary(); + Untyped::default_instance_ = new Untyped(); + Histogram::default_instance_ = new Histogram(); + Bucket::default_instance_ = new Bucket(); + Metric::default_instance_ = new Metric(); + MetricFamily::default_instance_ = new MetricFamily(); + LabelPair::default_instance_->InitAsDefaultInstance(); + Gauge::default_instance_->InitAsDefaultInstance(); + Counter::default_instance_->InitAsDefaultInstance(); + Quantile::default_instance_->InitAsDefaultInstance(); + Summary::default_instance_->InitAsDefaultInstance(); + Untyped::default_instance_->InitAsDefaultInstance(); + Histogram::default_instance_->InitAsDefaultInstance(); + Bucket::default_instance_->InitAsDefaultInstance(); + Metric::default_instance_->InitAsDefaultInstance(); + MetricFamily::default_instance_->InitAsDefaultInstance(); + ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_metrics_2eproto); +} + +// Force AddDescriptors() to be called at static initialization time. +struct StaticDescriptorInitializer_metrics_2eproto { + StaticDescriptorInitializer_metrics_2eproto() { + protobuf_AddDesc_metrics_2eproto(); + } +} static_descriptor_initializer_metrics_2eproto_; +const ::google::protobuf::EnumDescriptor* MetricType_descriptor() { + protobuf_AssignDescriptorsOnce(); + return MetricType_descriptor_; +} +bool MetricType_IsValid(int value) { + switch(value) { + case 0: + case 1: + case 2: + case 3: + case 4: + return true; + default: + return false; + } +} + + +// =================================================================== + +#ifndef _MSC_VER +const int LabelPair::kNameFieldNumber; +const int LabelPair::kValueFieldNumber; +#endif // !_MSC_VER + +LabelPair::LabelPair() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:io.prometheus.client.LabelPair) +} + +void LabelPair::InitAsDefaultInstance() { +} + +LabelPair::LabelPair(const LabelPair& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:io.prometheus.client.LabelPair) +} + +void LabelPair::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + value_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +LabelPair::~LabelPair() { + // @@protoc_insertion_point(destructor:io.prometheus.client.LabelPair) + SharedDtor(); +} + +void LabelPair::SharedDtor() { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete name_; + } + if (value_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete value_; + } + if (this != default_instance_) { + } +} + +void LabelPair::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* LabelPair::descriptor() { + protobuf_AssignDescriptorsOnce(); + return LabelPair_descriptor_; +} + +const LabelPair& LabelPair::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_metrics_2eproto(); + return *default_instance_; +} + +LabelPair* LabelPair::default_instance_ = NULL; + +LabelPair* LabelPair::New() const { + return new LabelPair; +} + +void LabelPair::Clear() { + if (_has_bits_[0 / 32] & 3) { + if (has_name()) { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_->clear(); + } + } + if (has_value()) { + if (value_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + value_->clear(); + } + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool LabelPair::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:io.prometheus.client.LabelPair) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string name = 1; + case 1: { + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_name())); + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::PARSE, + "name"); + } else { + goto handle_unusual; + } + if (input->ExpectTag(18)) goto parse_value; + break; + } + + // optional string value = 2; + case 2: { + if (tag == 18) { + parse_value: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_value())); + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->value().data(), this->value().length(), + ::google::protobuf::internal::WireFormat::PARSE, + "value"); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:io.prometheus.client.LabelPair) + return true; +failure: + // @@protoc_insertion_point(parse_failure:io.prometheus.client.LabelPair) + return false; +#undef DO_ +} + +void LabelPair::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:io.prometheus.client.LabelPair) + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "name"); + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 1, this->name(), output); + } + + // optional string value = 2; + if (has_value()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->value().data(), this->value().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "value"); + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 2, this->value(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:io.prometheus.client.LabelPair) +} + +::google::protobuf::uint8* LabelPair::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:io.prometheus.client.LabelPair) + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "name"); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->name(), target); + } + + // optional string value = 2; + if (has_value()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->value().data(), this->value().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "value"); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 2, this->value(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:io.prometheus.client.LabelPair) + return target; +} + +int LabelPair::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string name = 1; + if (has_name()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->name()); + } + + // optional string value = 2; + if (has_value()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->value()); + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void LabelPair::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const LabelPair* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void LabelPair::MergeFrom(const LabelPair& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_name()) { + set_name(from.name()); + } + if (from.has_value()) { + set_value(from.value()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void LabelPair::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void LabelPair::CopyFrom(const LabelPair& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool LabelPair::IsInitialized() const { + + return true; +} + +void LabelPair::Swap(LabelPair* other) { + if (other != this) { + std::swap(name_, other->name_); + std::swap(value_, other->value_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata LabelPair::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = LabelPair_descriptor_; + metadata.reflection = LabelPair_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int Gauge::kValueFieldNumber; +#endif // !_MSC_VER + +Gauge::Gauge() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:io.prometheus.client.Gauge) +} + +void Gauge::InitAsDefaultInstance() { +} + +Gauge::Gauge(const Gauge& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:io.prometheus.client.Gauge) +} + +void Gauge::SharedCtor() { + _cached_size_ = 0; + value_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +Gauge::~Gauge() { + // @@protoc_insertion_point(destructor:io.prometheus.client.Gauge) + SharedDtor(); +} + +void Gauge::SharedDtor() { + if (this != default_instance_) { + } +} + +void Gauge::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* Gauge::descriptor() { + protobuf_AssignDescriptorsOnce(); + return Gauge_descriptor_; +} + +const Gauge& Gauge::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_metrics_2eproto(); + return *default_instance_; +} + +Gauge* Gauge::default_instance_ = NULL; + +Gauge* Gauge::New() const { + return new Gauge; +} + +void Gauge::Clear() { + value_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool Gauge::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:io.prometheus.client.Gauge) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional double value = 1; + case 1: { + if (tag == 9) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + double, ::google::protobuf::internal::WireFormatLite::TYPE_DOUBLE>( + input, &value_))); + set_has_value(); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:io.prometheus.client.Gauge) + return true; +failure: + // @@protoc_insertion_point(parse_failure:io.prometheus.client.Gauge) + return false; +#undef DO_ +} + +void Gauge::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:io.prometheus.client.Gauge) + // optional double value = 1; + if (has_value()) { + ::google::protobuf::internal::WireFormatLite::WriteDouble(1, this->value(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:io.prometheus.client.Gauge) +} + +::google::protobuf::uint8* Gauge::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:io.prometheus.client.Gauge) + // optional double value = 1; + if (has_value()) { + target = ::google::protobuf::internal::WireFormatLite::WriteDoubleToArray(1, this->value(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:io.prometheus.client.Gauge) + return target; +} + +int Gauge::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional double value = 1; + if (has_value()) { + total_size += 1 + 8; + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void Gauge::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const Gauge* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void Gauge::MergeFrom(const Gauge& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_value()) { + set_value(from.value()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void Gauge::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void Gauge::CopyFrom(const Gauge& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool Gauge::IsInitialized() const { + + return true; +} + +void Gauge::Swap(Gauge* other) { + if (other != this) { + std::swap(value_, other->value_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata Gauge::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = Gauge_descriptor_; + metadata.reflection = Gauge_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int Counter::kValueFieldNumber; +#endif // !_MSC_VER + +Counter::Counter() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:io.prometheus.client.Counter) +} + +void Counter::InitAsDefaultInstance() { +} + +Counter::Counter(const Counter& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:io.prometheus.client.Counter) +} + +void Counter::SharedCtor() { + _cached_size_ = 0; + value_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +Counter::~Counter() { + // @@protoc_insertion_point(destructor:io.prometheus.client.Counter) + SharedDtor(); +} + +void Counter::SharedDtor() { + if (this != default_instance_) { + } +} + +void Counter::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* Counter::descriptor() { + protobuf_AssignDescriptorsOnce(); + return Counter_descriptor_; +} + +const Counter& Counter::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_metrics_2eproto(); + return *default_instance_; +} + +Counter* Counter::default_instance_ = NULL; + +Counter* Counter::New() const { + return new Counter; +} + +void Counter::Clear() { + value_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool Counter::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:io.prometheus.client.Counter) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional double value = 1; + case 1: { + if (tag == 9) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + double, ::google::protobuf::internal::WireFormatLite::TYPE_DOUBLE>( + input, &value_))); + set_has_value(); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:io.prometheus.client.Counter) + return true; +failure: + // @@protoc_insertion_point(parse_failure:io.prometheus.client.Counter) + return false; +#undef DO_ +} + +void Counter::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:io.prometheus.client.Counter) + // optional double value = 1; + if (has_value()) { + ::google::protobuf::internal::WireFormatLite::WriteDouble(1, this->value(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:io.prometheus.client.Counter) +} + +::google::protobuf::uint8* Counter::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:io.prometheus.client.Counter) + // optional double value = 1; + if (has_value()) { + target = ::google::protobuf::internal::WireFormatLite::WriteDoubleToArray(1, this->value(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:io.prometheus.client.Counter) + return target; +} + +int Counter::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional double value = 1; + if (has_value()) { + total_size += 1 + 8; + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void Counter::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const Counter* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void Counter::MergeFrom(const Counter& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_value()) { + set_value(from.value()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void Counter::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void Counter::CopyFrom(const Counter& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool Counter::IsInitialized() const { + + return true; +} + +void Counter::Swap(Counter* other) { + if (other != this) { + std::swap(value_, other->value_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata Counter::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = Counter_descriptor_; + metadata.reflection = Counter_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int Quantile::kQuantileFieldNumber; +const int Quantile::kValueFieldNumber; +#endif // !_MSC_VER + +Quantile::Quantile() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:io.prometheus.client.Quantile) +} + +void Quantile::InitAsDefaultInstance() { +} + +Quantile::Quantile(const Quantile& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:io.prometheus.client.Quantile) +} + +void Quantile::SharedCtor() { + _cached_size_ = 0; + quantile_ = 0; + value_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +Quantile::~Quantile() { + // @@protoc_insertion_point(destructor:io.prometheus.client.Quantile) + SharedDtor(); +} + +void Quantile::SharedDtor() { + if (this != default_instance_) { + } +} + +void Quantile::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* Quantile::descriptor() { + protobuf_AssignDescriptorsOnce(); + return Quantile_descriptor_; +} + +const Quantile& Quantile::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_metrics_2eproto(); + return *default_instance_; +} + +Quantile* Quantile::default_instance_ = NULL; + +Quantile* Quantile::New() const { + return new Quantile; +} + +void Quantile::Clear() { +#define OFFSET_OF_FIELD_(f) (reinterpret_cast( \ + &reinterpret_cast(16)->f) - \ + reinterpret_cast(16)) + +#define ZR_(first, last) do { \ + size_t f = OFFSET_OF_FIELD_(first); \ + size_t n = OFFSET_OF_FIELD_(last) - f + sizeof(last); \ + ::memset(&first, 0, n); \ + } while (0) + + ZR_(quantile_, value_); + +#undef OFFSET_OF_FIELD_ +#undef ZR_ + + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool Quantile::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:io.prometheus.client.Quantile) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional double quantile = 1; + case 1: { + if (tag == 9) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + double, ::google::protobuf::internal::WireFormatLite::TYPE_DOUBLE>( + input, &quantile_))); + set_has_quantile(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(17)) goto parse_value; + break; + } + + // optional double value = 2; + case 2: { + if (tag == 17) { + parse_value: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + double, ::google::protobuf::internal::WireFormatLite::TYPE_DOUBLE>( + input, &value_))); + set_has_value(); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:io.prometheus.client.Quantile) + return true; +failure: + // @@protoc_insertion_point(parse_failure:io.prometheus.client.Quantile) + return false; +#undef DO_ +} + +void Quantile::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:io.prometheus.client.Quantile) + // optional double quantile = 1; + if (has_quantile()) { + ::google::protobuf::internal::WireFormatLite::WriteDouble(1, this->quantile(), output); + } + + // optional double value = 2; + if (has_value()) { + ::google::protobuf::internal::WireFormatLite::WriteDouble(2, this->value(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:io.prometheus.client.Quantile) +} + +::google::protobuf::uint8* Quantile::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:io.prometheus.client.Quantile) + // optional double quantile = 1; + if (has_quantile()) { + target = ::google::protobuf::internal::WireFormatLite::WriteDoubleToArray(1, this->quantile(), target); + } + + // optional double value = 2; + if (has_value()) { + target = ::google::protobuf::internal::WireFormatLite::WriteDoubleToArray(2, this->value(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:io.prometheus.client.Quantile) + return target; +} + +int Quantile::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional double quantile = 1; + if (has_quantile()) { + total_size += 1 + 8; + } + + // optional double value = 2; + if (has_value()) { + total_size += 1 + 8; + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void Quantile::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const Quantile* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void Quantile::MergeFrom(const Quantile& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_quantile()) { + set_quantile(from.quantile()); + } + if (from.has_value()) { + set_value(from.value()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void Quantile::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void Quantile::CopyFrom(const Quantile& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool Quantile::IsInitialized() const { + + return true; +} + +void Quantile::Swap(Quantile* other) { + if (other != this) { + std::swap(quantile_, other->quantile_); + std::swap(value_, other->value_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata Quantile::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = Quantile_descriptor_; + metadata.reflection = Quantile_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int Summary::kSampleCountFieldNumber; +const int Summary::kSampleSumFieldNumber; +const int Summary::kQuantileFieldNumber; +#endif // !_MSC_VER + +Summary::Summary() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:io.prometheus.client.Summary) +} + +void Summary::InitAsDefaultInstance() { +} + +Summary::Summary(const Summary& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:io.prometheus.client.Summary) +} + +void Summary::SharedCtor() { + _cached_size_ = 0; + sample_count_ = GOOGLE_ULONGLONG(0); + sample_sum_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +Summary::~Summary() { + // @@protoc_insertion_point(destructor:io.prometheus.client.Summary) + SharedDtor(); +} + +void Summary::SharedDtor() { + if (this != default_instance_) { + } +} + +void Summary::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* Summary::descriptor() { + protobuf_AssignDescriptorsOnce(); + return Summary_descriptor_; +} + +const Summary& Summary::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_metrics_2eproto(); + return *default_instance_; +} + +Summary* Summary::default_instance_ = NULL; + +Summary* Summary::New() const { + return new Summary; +} + +void Summary::Clear() { +#define OFFSET_OF_FIELD_(f) (reinterpret_cast( \ + &reinterpret_cast(16)->f) - \ + reinterpret_cast(16)) + +#define ZR_(first, last) do { \ + size_t f = OFFSET_OF_FIELD_(first); \ + size_t n = OFFSET_OF_FIELD_(last) - f + sizeof(last); \ + ::memset(&first, 0, n); \ + } while (0) + + ZR_(sample_count_, sample_sum_); + +#undef OFFSET_OF_FIELD_ +#undef ZR_ + + quantile_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool Summary::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:io.prometheus.client.Summary) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional uint64 sample_count = 1; + case 1: { + if (tag == 8) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::uint64, ::google::protobuf::internal::WireFormatLite::TYPE_UINT64>( + input, &sample_count_))); + set_has_sample_count(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(17)) goto parse_sample_sum; + break; + } + + // optional double sample_sum = 2; + case 2: { + if (tag == 17) { + parse_sample_sum: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + double, ::google::protobuf::internal::WireFormatLite::TYPE_DOUBLE>( + input, &sample_sum_))); + set_has_sample_sum(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(26)) goto parse_quantile; + break; + } + + // repeated .io.prometheus.client.Quantile quantile = 3; + case 3: { + if (tag == 26) { + parse_quantile: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_quantile())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(26)) goto parse_quantile; + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:io.prometheus.client.Summary) + return true; +failure: + // @@protoc_insertion_point(parse_failure:io.prometheus.client.Summary) + return false; +#undef DO_ +} + +void Summary::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:io.prometheus.client.Summary) + // optional uint64 sample_count = 1; + if (has_sample_count()) { + ::google::protobuf::internal::WireFormatLite::WriteUInt64(1, this->sample_count(), output); + } + + // optional double sample_sum = 2; + if (has_sample_sum()) { + ::google::protobuf::internal::WireFormatLite::WriteDouble(2, this->sample_sum(), output); + } + + // repeated .io.prometheus.client.Quantile quantile = 3; + for (int i = 0; i < this->quantile_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 3, this->quantile(i), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:io.prometheus.client.Summary) +} + +::google::protobuf::uint8* Summary::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:io.prometheus.client.Summary) + // optional uint64 sample_count = 1; + if (has_sample_count()) { + target = ::google::protobuf::internal::WireFormatLite::WriteUInt64ToArray(1, this->sample_count(), target); + } + + // optional double sample_sum = 2; + if (has_sample_sum()) { + target = ::google::protobuf::internal::WireFormatLite::WriteDoubleToArray(2, this->sample_sum(), target); + } + + // repeated .io.prometheus.client.Quantile quantile = 3; + for (int i = 0; i < this->quantile_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 3, this->quantile(i), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:io.prometheus.client.Summary) + return target; +} + +int Summary::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional uint64 sample_count = 1; + if (has_sample_count()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::UInt64Size( + this->sample_count()); + } + + // optional double sample_sum = 2; + if (has_sample_sum()) { + total_size += 1 + 8; + } + + } + // repeated .io.prometheus.client.Quantile quantile = 3; + total_size += 1 * this->quantile_size(); + for (int i = 0; i < this->quantile_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->quantile(i)); + } + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void Summary::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const Summary* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void Summary::MergeFrom(const Summary& from) { + GOOGLE_CHECK_NE(&from, this); + quantile_.MergeFrom(from.quantile_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_sample_count()) { + set_sample_count(from.sample_count()); + } + if (from.has_sample_sum()) { + set_sample_sum(from.sample_sum()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void Summary::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void Summary::CopyFrom(const Summary& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool Summary::IsInitialized() const { + + return true; +} + +void Summary::Swap(Summary* other) { + if (other != this) { + std::swap(sample_count_, other->sample_count_); + std::swap(sample_sum_, other->sample_sum_); + quantile_.Swap(&other->quantile_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata Summary::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = Summary_descriptor_; + metadata.reflection = Summary_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int Untyped::kValueFieldNumber; +#endif // !_MSC_VER + +Untyped::Untyped() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:io.prometheus.client.Untyped) +} + +void Untyped::InitAsDefaultInstance() { +} + +Untyped::Untyped(const Untyped& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:io.prometheus.client.Untyped) +} + +void Untyped::SharedCtor() { + _cached_size_ = 0; + value_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +Untyped::~Untyped() { + // @@protoc_insertion_point(destructor:io.prometheus.client.Untyped) + SharedDtor(); +} + +void Untyped::SharedDtor() { + if (this != default_instance_) { + } +} + +void Untyped::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* Untyped::descriptor() { + protobuf_AssignDescriptorsOnce(); + return Untyped_descriptor_; +} + +const Untyped& Untyped::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_metrics_2eproto(); + return *default_instance_; +} + +Untyped* Untyped::default_instance_ = NULL; + +Untyped* Untyped::New() const { + return new Untyped; +} + +void Untyped::Clear() { + value_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool Untyped::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:io.prometheus.client.Untyped) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional double value = 1; + case 1: { + if (tag == 9) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + double, ::google::protobuf::internal::WireFormatLite::TYPE_DOUBLE>( + input, &value_))); + set_has_value(); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:io.prometheus.client.Untyped) + return true; +failure: + // @@protoc_insertion_point(parse_failure:io.prometheus.client.Untyped) + return false; +#undef DO_ +} + +void Untyped::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:io.prometheus.client.Untyped) + // optional double value = 1; + if (has_value()) { + ::google::protobuf::internal::WireFormatLite::WriteDouble(1, this->value(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:io.prometheus.client.Untyped) +} + +::google::protobuf::uint8* Untyped::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:io.prometheus.client.Untyped) + // optional double value = 1; + if (has_value()) { + target = ::google::protobuf::internal::WireFormatLite::WriteDoubleToArray(1, this->value(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:io.prometheus.client.Untyped) + return target; +} + +int Untyped::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional double value = 1; + if (has_value()) { + total_size += 1 + 8; + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void Untyped::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const Untyped* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void Untyped::MergeFrom(const Untyped& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_value()) { + set_value(from.value()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void Untyped::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void Untyped::CopyFrom(const Untyped& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool Untyped::IsInitialized() const { + + return true; +} + +void Untyped::Swap(Untyped* other) { + if (other != this) { + std::swap(value_, other->value_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata Untyped::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = Untyped_descriptor_; + metadata.reflection = Untyped_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int Histogram::kSampleCountFieldNumber; +const int Histogram::kSampleSumFieldNumber; +const int Histogram::kBucketFieldNumber; +#endif // !_MSC_VER + +Histogram::Histogram() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:io.prometheus.client.Histogram) +} + +void Histogram::InitAsDefaultInstance() { +} + +Histogram::Histogram(const Histogram& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:io.prometheus.client.Histogram) +} + +void Histogram::SharedCtor() { + _cached_size_ = 0; + sample_count_ = GOOGLE_ULONGLONG(0); + sample_sum_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +Histogram::~Histogram() { + // @@protoc_insertion_point(destructor:io.prometheus.client.Histogram) + SharedDtor(); +} + +void Histogram::SharedDtor() { + if (this != default_instance_) { + } +} + +void Histogram::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* Histogram::descriptor() { + protobuf_AssignDescriptorsOnce(); + return Histogram_descriptor_; +} + +const Histogram& Histogram::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_metrics_2eproto(); + return *default_instance_; +} + +Histogram* Histogram::default_instance_ = NULL; + +Histogram* Histogram::New() const { + return new Histogram; +} + +void Histogram::Clear() { +#define OFFSET_OF_FIELD_(f) (reinterpret_cast( \ + &reinterpret_cast(16)->f) - \ + reinterpret_cast(16)) + +#define ZR_(first, last) do { \ + size_t f = OFFSET_OF_FIELD_(first); \ + size_t n = OFFSET_OF_FIELD_(last) - f + sizeof(last); \ + ::memset(&first, 0, n); \ + } while (0) + + ZR_(sample_count_, sample_sum_); + +#undef OFFSET_OF_FIELD_ +#undef ZR_ + + bucket_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool Histogram::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:io.prometheus.client.Histogram) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional uint64 sample_count = 1; + case 1: { + if (tag == 8) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::uint64, ::google::protobuf::internal::WireFormatLite::TYPE_UINT64>( + input, &sample_count_))); + set_has_sample_count(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(17)) goto parse_sample_sum; + break; + } + + // optional double sample_sum = 2; + case 2: { + if (tag == 17) { + parse_sample_sum: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + double, ::google::protobuf::internal::WireFormatLite::TYPE_DOUBLE>( + input, &sample_sum_))); + set_has_sample_sum(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(26)) goto parse_bucket; + break; + } + + // repeated .io.prometheus.client.Bucket bucket = 3; + case 3: { + if (tag == 26) { + parse_bucket: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_bucket())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(26)) goto parse_bucket; + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:io.prometheus.client.Histogram) + return true; +failure: + // @@protoc_insertion_point(parse_failure:io.prometheus.client.Histogram) + return false; +#undef DO_ +} + +void Histogram::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:io.prometheus.client.Histogram) + // optional uint64 sample_count = 1; + if (has_sample_count()) { + ::google::protobuf::internal::WireFormatLite::WriteUInt64(1, this->sample_count(), output); + } + + // optional double sample_sum = 2; + if (has_sample_sum()) { + ::google::protobuf::internal::WireFormatLite::WriteDouble(2, this->sample_sum(), output); + } + + // repeated .io.prometheus.client.Bucket bucket = 3; + for (int i = 0; i < this->bucket_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 3, this->bucket(i), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:io.prometheus.client.Histogram) +} + +::google::protobuf::uint8* Histogram::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:io.prometheus.client.Histogram) + // optional uint64 sample_count = 1; + if (has_sample_count()) { + target = ::google::protobuf::internal::WireFormatLite::WriteUInt64ToArray(1, this->sample_count(), target); + } + + // optional double sample_sum = 2; + if (has_sample_sum()) { + target = ::google::protobuf::internal::WireFormatLite::WriteDoubleToArray(2, this->sample_sum(), target); + } + + // repeated .io.prometheus.client.Bucket bucket = 3; + for (int i = 0; i < this->bucket_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 3, this->bucket(i), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:io.prometheus.client.Histogram) + return target; +} + +int Histogram::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional uint64 sample_count = 1; + if (has_sample_count()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::UInt64Size( + this->sample_count()); + } + + // optional double sample_sum = 2; + if (has_sample_sum()) { + total_size += 1 + 8; + } + + } + // repeated .io.prometheus.client.Bucket bucket = 3; + total_size += 1 * this->bucket_size(); + for (int i = 0; i < this->bucket_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->bucket(i)); + } + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void Histogram::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const Histogram* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void Histogram::MergeFrom(const Histogram& from) { + GOOGLE_CHECK_NE(&from, this); + bucket_.MergeFrom(from.bucket_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_sample_count()) { + set_sample_count(from.sample_count()); + } + if (from.has_sample_sum()) { + set_sample_sum(from.sample_sum()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void Histogram::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void Histogram::CopyFrom(const Histogram& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool Histogram::IsInitialized() const { + + return true; +} + +void Histogram::Swap(Histogram* other) { + if (other != this) { + std::swap(sample_count_, other->sample_count_); + std::swap(sample_sum_, other->sample_sum_); + bucket_.Swap(&other->bucket_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata Histogram::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = Histogram_descriptor_; + metadata.reflection = Histogram_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int Bucket::kCumulativeCountFieldNumber; +const int Bucket::kUpperBoundFieldNumber; +#endif // !_MSC_VER + +Bucket::Bucket() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:io.prometheus.client.Bucket) +} + +void Bucket::InitAsDefaultInstance() { +} + +Bucket::Bucket(const Bucket& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:io.prometheus.client.Bucket) +} + +void Bucket::SharedCtor() { + _cached_size_ = 0; + cumulative_count_ = GOOGLE_ULONGLONG(0); + upper_bound_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +Bucket::~Bucket() { + // @@protoc_insertion_point(destructor:io.prometheus.client.Bucket) + SharedDtor(); +} + +void Bucket::SharedDtor() { + if (this != default_instance_) { + } +} + +void Bucket::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* Bucket::descriptor() { + protobuf_AssignDescriptorsOnce(); + return Bucket_descriptor_; +} + +const Bucket& Bucket::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_metrics_2eproto(); + return *default_instance_; +} + +Bucket* Bucket::default_instance_ = NULL; + +Bucket* Bucket::New() const { + return new Bucket; +} + +void Bucket::Clear() { +#define OFFSET_OF_FIELD_(f) (reinterpret_cast( \ + &reinterpret_cast(16)->f) - \ + reinterpret_cast(16)) + +#define ZR_(first, last) do { \ + size_t f = OFFSET_OF_FIELD_(first); \ + size_t n = OFFSET_OF_FIELD_(last) - f + sizeof(last); \ + ::memset(&first, 0, n); \ + } while (0) + + ZR_(cumulative_count_, upper_bound_); + +#undef OFFSET_OF_FIELD_ +#undef ZR_ + + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool Bucket::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:io.prometheus.client.Bucket) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional uint64 cumulative_count = 1; + case 1: { + if (tag == 8) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::uint64, ::google::protobuf::internal::WireFormatLite::TYPE_UINT64>( + input, &cumulative_count_))); + set_has_cumulative_count(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(17)) goto parse_upper_bound; + break; + } + + // optional double upper_bound = 2; + case 2: { + if (tag == 17) { + parse_upper_bound: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + double, ::google::protobuf::internal::WireFormatLite::TYPE_DOUBLE>( + input, &upper_bound_))); + set_has_upper_bound(); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:io.prometheus.client.Bucket) + return true; +failure: + // @@protoc_insertion_point(parse_failure:io.prometheus.client.Bucket) + return false; +#undef DO_ +} + +void Bucket::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:io.prometheus.client.Bucket) + // optional uint64 cumulative_count = 1; + if (has_cumulative_count()) { + ::google::protobuf::internal::WireFormatLite::WriteUInt64(1, this->cumulative_count(), output); + } + + // optional double upper_bound = 2; + if (has_upper_bound()) { + ::google::protobuf::internal::WireFormatLite::WriteDouble(2, this->upper_bound(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:io.prometheus.client.Bucket) +} + +::google::protobuf::uint8* Bucket::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:io.prometheus.client.Bucket) + // optional uint64 cumulative_count = 1; + if (has_cumulative_count()) { + target = ::google::protobuf::internal::WireFormatLite::WriteUInt64ToArray(1, this->cumulative_count(), target); + } + + // optional double upper_bound = 2; + if (has_upper_bound()) { + target = ::google::protobuf::internal::WireFormatLite::WriteDoubleToArray(2, this->upper_bound(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:io.prometheus.client.Bucket) + return target; +} + +int Bucket::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional uint64 cumulative_count = 1; + if (has_cumulative_count()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::UInt64Size( + this->cumulative_count()); + } + + // optional double upper_bound = 2; + if (has_upper_bound()) { + total_size += 1 + 8; + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void Bucket::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const Bucket* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void Bucket::MergeFrom(const Bucket& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_cumulative_count()) { + set_cumulative_count(from.cumulative_count()); + } + if (from.has_upper_bound()) { + set_upper_bound(from.upper_bound()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void Bucket::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void Bucket::CopyFrom(const Bucket& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool Bucket::IsInitialized() const { + + return true; +} + +void Bucket::Swap(Bucket* other) { + if (other != this) { + std::swap(cumulative_count_, other->cumulative_count_); + std::swap(upper_bound_, other->upper_bound_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata Bucket::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = Bucket_descriptor_; + metadata.reflection = Bucket_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int Metric::kLabelFieldNumber; +const int Metric::kGaugeFieldNumber; +const int Metric::kCounterFieldNumber; +const int Metric::kSummaryFieldNumber; +const int Metric::kUntypedFieldNumber; +const int Metric::kHistogramFieldNumber; +const int Metric::kTimestampMsFieldNumber; +#endif // !_MSC_VER + +Metric::Metric() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:io.prometheus.client.Metric) +} + +void Metric::InitAsDefaultInstance() { + gauge_ = const_cast< ::io::prometheus::client::Gauge*>(&::io::prometheus::client::Gauge::default_instance()); + counter_ = const_cast< ::io::prometheus::client::Counter*>(&::io::prometheus::client::Counter::default_instance()); + summary_ = const_cast< ::io::prometheus::client::Summary*>(&::io::prometheus::client::Summary::default_instance()); + untyped_ = const_cast< ::io::prometheus::client::Untyped*>(&::io::prometheus::client::Untyped::default_instance()); + histogram_ = const_cast< ::io::prometheus::client::Histogram*>(&::io::prometheus::client::Histogram::default_instance()); +} + +Metric::Metric(const Metric& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:io.prometheus.client.Metric) +} + +void Metric::SharedCtor() { + _cached_size_ = 0; + gauge_ = NULL; + counter_ = NULL; + summary_ = NULL; + untyped_ = NULL; + histogram_ = NULL; + timestamp_ms_ = GOOGLE_LONGLONG(0); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +Metric::~Metric() { + // @@protoc_insertion_point(destructor:io.prometheus.client.Metric) + SharedDtor(); +} + +void Metric::SharedDtor() { + if (this != default_instance_) { + delete gauge_; + delete counter_; + delete summary_; + delete untyped_; + delete histogram_; + } +} + +void Metric::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* Metric::descriptor() { + protobuf_AssignDescriptorsOnce(); + return Metric_descriptor_; +} + +const Metric& Metric::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_metrics_2eproto(); + return *default_instance_; +} + +Metric* Metric::default_instance_ = NULL; + +Metric* Metric::New() const { + return new Metric; +} + +void Metric::Clear() { + if (_has_bits_[0 / 32] & 126) { + if (has_gauge()) { + if (gauge_ != NULL) gauge_->::io::prometheus::client::Gauge::Clear(); + } + if (has_counter()) { + if (counter_ != NULL) counter_->::io::prometheus::client::Counter::Clear(); + } + if (has_summary()) { + if (summary_ != NULL) summary_->::io::prometheus::client::Summary::Clear(); + } + if (has_untyped()) { + if (untyped_ != NULL) untyped_->::io::prometheus::client::Untyped::Clear(); + } + if (has_histogram()) { + if (histogram_ != NULL) histogram_->::io::prometheus::client::Histogram::Clear(); + } + timestamp_ms_ = GOOGLE_LONGLONG(0); + } + label_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool Metric::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:io.prometheus.client.Metric) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // repeated .io.prometheus.client.LabelPair label = 1; + case 1: { + if (tag == 10) { + parse_label: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_label())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(10)) goto parse_label; + if (input->ExpectTag(18)) goto parse_gauge; + break; + } + + // optional .io.prometheus.client.Gauge gauge = 2; + case 2: { + if (tag == 18) { + parse_gauge: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_gauge())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(26)) goto parse_counter; + break; + } + + // optional .io.prometheus.client.Counter counter = 3; + case 3: { + if (tag == 26) { + parse_counter: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_counter())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(34)) goto parse_summary; + break; + } + + // optional .io.prometheus.client.Summary summary = 4; + case 4: { + if (tag == 34) { + parse_summary: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_summary())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(42)) goto parse_untyped; + break; + } + + // optional .io.prometheus.client.Untyped untyped = 5; + case 5: { + if (tag == 42) { + parse_untyped: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_untyped())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(48)) goto parse_timestamp_ms; + break; + } + + // optional int64 timestamp_ms = 6; + case 6: { + if (tag == 48) { + parse_timestamp_ms: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_INT64>( + input, ×tamp_ms_))); + set_has_timestamp_ms(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(58)) goto parse_histogram; + break; + } + + // optional .io.prometheus.client.Histogram histogram = 7; + case 7: { + if (tag == 58) { + parse_histogram: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_histogram())); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:io.prometheus.client.Metric) + return true; +failure: + // @@protoc_insertion_point(parse_failure:io.prometheus.client.Metric) + return false; +#undef DO_ +} + +void Metric::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:io.prometheus.client.Metric) + // repeated .io.prometheus.client.LabelPair label = 1; + for (int i = 0; i < this->label_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 1, this->label(i), output); + } + + // optional .io.prometheus.client.Gauge gauge = 2; + if (has_gauge()) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 2, this->gauge(), output); + } + + // optional .io.prometheus.client.Counter counter = 3; + if (has_counter()) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 3, this->counter(), output); + } + + // optional .io.prometheus.client.Summary summary = 4; + if (has_summary()) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 4, this->summary(), output); + } + + // optional .io.prometheus.client.Untyped untyped = 5; + if (has_untyped()) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 5, this->untyped(), output); + } + + // optional int64 timestamp_ms = 6; + if (has_timestamp_ms()) { + ::google::protobuf::internal::WireFormatLite::WriteInt64(6, this->timestamp_ms(), output); + } + + // optional .io.prometheus.client.Histogram histogram = 7; + if (has_histogram()) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 7, this->histogram(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:io.prometheus.client.Metric) +} + +::google::protobuf::uint8* Metric::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:io.prometheus.client.Metric) + // repeated .io.prometheus.client.LabelPair label = 1; + for (int i = 0; i < this->label_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 1, this->label(i), target); + } + + // optional .io.prometheus.client.Gauge gauge = 2; + if (has_gauge()) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 2, this->gauge(), target); + } + + // optional .io.prometheus.client.Counter counter = 3; + if (has_counter()) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 3, this->counter(), target); + } + + // optional .io.prometheus.client.Summary summary = 4; + if (has_summary()) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 4, this->summary(), target); + } + + // optional .io.prometheus.client.Untyped untyped = 5; + if (has_untyped()) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 5, this->untyped(), target); + } + + // optional int64 timestamp_ms = 6; + if (has_timestamp_ms()) { + target = ::google::protobuf::internal::WireFormatLite::WriteInt64ToArray(6, this->timestamp_ms(), target); + } + + // optional .io.prometheus.client.Histogram histogram = 7; + if (has_histogram()) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 7, this->histogram(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:io.prometheus.client.Metric) + return target; +} + +int Metric::ByteSize() const { + int total_size = 0; + + if (_has_bits_[1 / 32] & (0xffu << (1 % 32))) { + // optional .io.prometheus.client.Gauge gauge = 2; + if (has_gauge()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->gauge()); + } + + // optional .io.prometheus.client.Counter counter = 3; + if (has_counter()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->counter()); + } + + // optional .io.prometheus.client.Summary summary = 4; + if (has_summary()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->summary()); + } + + // optional .io.prometheus.client.Untyped untyped = 5; + if (has_untyped()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->untyped()); + } + + // optional .io.prometheus.client.Histogram histogram = 7; + if (has_histogram()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->histogram()); + } + + // optional int64 timestamp_ms = 6; + if (has_timestamp_ms()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int64Size( + this->timestamp_ms()); + } + + } + // repeated .io.prometheus.client.LabelPair label = 1; + total_size += 1 * this->label_size(); + for (int i = 0; i < this->label_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->label(i)); + } + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void Metric::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const Metric* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void Metric::MergeFrom(const Metric& from) { + GOOGLE_CHECK_NE(&from, this); + label_.MergeFrom(from.label_); + if (from._has_bits_[1 / 32] & (0xffu << (1 % 32))) { + if (from.has_gauge()) { + mutable_gauge()->::io::prometheus::client::Gauge::MergeFrom(from.gauge()); + } + if (from.has_counter()) { + mutable_counter()->::io::prometheus::client::Counter::MergeFrom(from.counter()); + } + if (from.has_summary()) { + mutable_summary()->::io::prometheus::client::Summary::MergeFrom(from.summary()); + } + if (from.has_untyped()) { + mutable_untyped()->::io::prometheus::client::Untyped::MergeFrom(from.untyped()); + } + if (from.has_histogram()) { + mutable_histogram()->::io::prometheus::client::Histogram::MergeFrom(from.histogram()); + } + if (from.has_timestamp_ms()) { + set_timestamp_ms(from.timestamp_ms()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void Metric::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void Metric::CopyFrom(const Metric& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool Metric::IsInitialized() const { + + return true; +} + +void Metric::Swap(Metric* other) { + if (other != this) { + label_.Swap(&other->label_); + std::swap(gauge_, other->gauge_); + std::swap(counter_, other->counter_); + std::swap(summary_, other->summary_); + std::swap(untyped_, other->untyped_); + std::swap(histogram_, other->histogram_); + std::swap(timestamp_ms_, other->timestamp_ms_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata Metric::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = Metric_descriptor_; + metadata.reflection = Metric_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int MetricFamily::kNameFieldNumber; +const int MetricFamily::kHelpFieldNumber; +const int MetricFamily::kTypeFieldNumber; +const int MetricFamily::kMetricFieldNumber; +#endif // !_MSC_VER + +MetricFamily::MetricFamily() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:io.prometheus.client.MetricFamily) +} + +void MetricFamily::InitAsDefaultInstance() { +} + +MetricFamily::MetricFamily(const MetricFamily& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:io.prometheus.client.MetricFamily) +} + +void MetricFamily::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + help_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + type_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +MetricFamily::~MetricFamily() { + // @@protoc_insertion_point(destructor:io.prometheus.client.MetricFamily) + SharedDtor(); +} + +void MetricFamily::SharedDtor() { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete name_; + } + if (help_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete help_; + } + if (this != default_instance_) { + } +} + +void MetricFamily::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* MetricFamily::descriptor() { + protobuf_AssignDescriptorsOnce(); + return MetricFamily_descriptor_; +} + +const MetricFamily& MetricFamily::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_metrics_2eproto(); + return *default_instance_; +} + +MetricFamily* MetricFamily::default_instance_ = NULL; + +MetricFamily* MetricFamily::New() const { + return new MetricFamily; +} + +void MetricFamily::Clear() { + if (_has_bits_[0 / 32] & 7) { + if (has_name()) { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_->clear(); + } + } + if (has_help()) { + if (help_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + help_->clear(); + } + } + type_ = 0; + } + metric_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool MetricFamily::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:io.prometheus.client.MetricFamily) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string name = 1; + case 1: { + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_name())); + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::PARSE, + "name"); + } else { + goto handle_unusual; + } + if (input->ExpectTag(18)) goto parse_help; + break; + } + + // optional string help = 2; + case 2: { + if (tag == 18) { + parse_help: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_help())); + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->help().data(), this->help().length(), + ::google::protobuf::internal::WireFormat::PARSE, + "help"); + } else { + goto handle_unusual; + } + if (input->ExpectTag(24)) goto parse_type; + break; + } + + // optional .io.prometheus.client.MetricType type = 3; + case 3: { + if (tag == 24) { + parse_type: + int value; + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>( + input, &value))); + if (::io::prometheus::client::MetricType_IsValid(value)) { + set_type(static_cast< ::io::prometheus::client::MetricType >(value)); + } else { + mutable_unknown_fields()->AddVarint(3, value); + } + } else { + goto handle_unusual; + } + if (input->ExpectTag(34)) goto parse_metric; + break; + } + + // repeated .io.prometheus.client.Metric metric = 4; + case 4: { + if (tag == 34) { + parse_metric: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_metric())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(34)) goto parse_metric; + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:io.prometheus.client.MetricFamily) + return true; +failure: + // @@protoc_insertion_point(parse_failure:io.prometheus.client.MetricFamily) + return false; +#undef DO_ +} + +void MetricFamily::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:io.prometheus.client.MetricFamily) + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "name"); + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 1, this->name(), output); + } + + // optional string help = 2; + if (has_help()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->help().data(), this->help().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "help"); + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 2, this->help(), output); + } + + // optional .io.prometheus.client.MetricType type = 3; + if (has_type()) { + ::google::protobuf::internal::WireFormatLite::WriteEnum( + 3, this->type(), output); + } + + // repeated .io.prometheus.client.Metric metric = 4; + for (int i = 0; i < this->metric_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 4, this->metric(i), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:io.prometheus.client.MetricFamily) +} + +::google::protobuf::uint8* MetricFamily::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:io.prometheus.client.MetricFamily) + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "name"); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->name(), target); + } + + // optional string help = 2; + if (has_help()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->help().data(), this->help().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "help"); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 2, this->help(), target); + } + + // optional .io.prometheus.client.MetricType type = 3; + if (has_type()) { + target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray( + 3, this->type(), target); + } + + // repeated .io.prometheus.client.Metric metric = 4; + for (int i = 0; i < this->metric_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 4, this->metric(i), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:io.prometheus.client.MetricFamily) + return target; +} + +int MetricFamily::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string name = 1; + if (has_name()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->name()); + } + + // optional string help = 2; + if (has_help()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->help()); + } + + // optional .io.prometheus.client.MetricType type = 3; + if (has_type()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::EnumSize(this->type()); + } + + } + // repeated .io.prometheus.client.Metric metric = 4; + total_size += 1 * this->metric_size(); + for (int i = 0; i < this->metric_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->metric(i)); + } + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void MetricFamily::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const MetricFamily* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void MetricFamily::MergeFrom(const MetricFamily& from) { + GOOGLE_CHECK_NE(&from, this); + metric_.MergeFrom(from.metric_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_name()) { + set_name(from.name()); + } + if (from.has_help()) { + set_help(from.help()); + } + if (from.has_type()) { + set_type(from.type()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void MetricFamily::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void MetricFamily::CopyFrom(const MetricFamily& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool MetricFamily::IsInitialized() const { + + return true; +} + +void MetricFamily::Swap(MetricFamily* other) { + if (other != this) { + std::swap(name_, other->name_); + std::swap(help_, other->help_); + std::swap(type_, other->type_); + metric_.Swap(&other->metric_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata MetricFamily::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = MetricFamily_descriptor_; + metadata.reflection = MetricFamily_reflection_; + return metadata; +} + + +// @@protoc_insertion_point(namespace_scope) + +} // namespace client +} // namespace prometheus +} // namespace io + +// @@protoc_insertion_point(global_scope) diff --git a/api/vendor/github.com/prometheus/client_model/cpp/metrics.pb.h b/api/vendor/github.com/prometheus/client_model/cpp/metrics.pb.h new file mode 100644 index 0000000..206ba37 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_model/cpp/metrics.pb.h @@ -0,0 +1,2072 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: metrics.proto + +#ifndef PROTOBUF_metrics_2eproto__INCLUDED +#define PROTOBUF_metrics_2eproto__INCLUDED + +#include + +#include + +#if GOOGLE_PROTOBUF_VERSION < 2006000 +#error This file was generated by a newer version of protoc which is +#error incompatible with your Protocol Buffer headers. Please update +#error your headers. +#endif +#if 2006001 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION +#error This file was generated by an older version of protoc which is +#error incompatible with your Protocol Buffer headers. Please +#error regenerate this file with a newer version of protoc. +#endif + +#include +#include +#include +#include +#include +#include +// @@protoc_insertion_point(includes) + +namespace io { +namespace prometheus { +namespace client { + +// Internal implementation detail -- do not call these. +void protobuf_AddDesc_metrics_2eproto(); +void protobuf_AssignDesc_metrics_2eproto(); +void protobuf_ShutdownFile_metrics_2eproto(); + +class LabelPair; +class Gauge; +class Counter; +class Quantile; +class Summary; +class Untyped; +class Histogram; +class Bucket; +class Metric; +class MetricFamily; + +enum MetricType { + COUNTER = 0, + GAUGE = 1, + SUMMARY = 2, + UNTYPED = 3, + HISTOGRAM = 4 +}; +bool MetricType_IsValid(int value); +const MetricType MetricType_MIN = COUNTER; +const MetricType MetricType_MAX = HISTOGRAM; +const int MetricType_ARRAYSIZE = MetricType_MAX + 1; + +const ::google::protobuf::EnumDescriptor* MetricType_descriptor(); +inline const ::std::string& MetricType_Name(MetricType value) { + return ::google::protobuf::internal::NameOfEnum( + MetricType_descriptor(), value); +} +inline bool MetricType_Parse( + const ::std::string& name, MetricType* value) { + return ::google::protobuf::internal::ParseNamedEnum( + MetricType_descriptor(), name, value); +} +// =================================================================== + +class LabelPair : public ::google::protobuf::Message { + public: + LabelPair(); + virtual ~LabelPair(); + + LabelPair(const LabelPair& from); + + inline LabelPair& operator=(const LabelPair& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const LabelPair& default_instance(); + + void Swap(LabelPair* other); + + // implements Message ---------------------------------------------- + + LabelPair* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const LabelPair& from); + void MergeFrom(const LabelPair& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string name = 1; + inline bool has_name() const; + inline void clear_name(); + static const int kNameFieldNumber = 1; + inline const ::std::string& name() const; + inline void set_name(const ::std::string& value); + inline void set_name(const char* value); + inline void set_name(const char* value, size_t size); + inline ::std::string* mutable_name(); + inline ::std::string* release_name(); + inline void set_allocated_name(::std::string* name); + + // optional string value = 2; + inline bool has_value() const; + inline void clear_value(); + static const int kValueFieldNumber = 2; + inline const ::std::string& value() const; + inline void set_value(const ::std::string& value); + inline void set_value(const char* value); + inline void set_value(const char* value, size_t size); + inline ::std::string* mutable_value(); + inline ::std::string* release_value(); + inline void set_allocated_value(::std::string* value); + + // @@protoc_insertion_point(class_scope:io.prometheus.client.LabelPair) + private: + inline void set_has_name(); + inline void clear_has_name(); + inline void set_has_value(); + inline void clear_has_value(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::std::string* name_; + ::std::string* value_; + friend void protobuf_AddDesc_metrics_2eproto(); + friend void protobuf_AssignDesc_metrics_2eproto(); + friend void protobuf_ShutdownFile_metrics_2eproto(); + + void InitAsDefaultInstance(); + static LabelPair* default_instance_; +}; +// ------------------------------------------------------------------- + +class Gauge : public ::google::protobuf::Message { + public: + Gauge(); + virtual ~Gauge(); + + Gauge(const Gauge& from); + + inline Gauge& operator=(const Gauge& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const Gauge& default_instance(); + + void Swap(Gauge* other); + + // implements Message ---------------------------------------------- + + Gauge* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const Gauge& from); + void MergeFrom(const Gauge& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional double value = 1; + inline bool has_value() const; + inline void clear_value(); + static const int kValueFieldNumber = 1; + inline double value() const; + inline void set_value(double value); + + // @@protoc_insertion_point(class_scope:io.prometheus.client.Gauge) + private: + inline void set_has_value(); + inline void clear_has_value(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + double value_; + friend void protobuf_AddDesc_metrics_2eproto(); + friend void protobuf_AssignDesc_metrics_2eproto(); + friend void protobuf_ShutdownFile_metrics_2eproto(); + + void InitAsDefaultInstance(); + static Gauge* default_instance_; +}; +// ------------------------------------------------------------------- + +class Counter : public ::google::protobuf::Message { + public: + Counter(); + virtual ~Counter(); + + Counter(const Counter& from); + + inline Counter& operator=(const Counter& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const Counter& default_instance(); + + void Swap(Counter* other); + + // implements Message ---------------------------------------------- + + Counter* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const Counter& from); + void MergeFrom(const Counter& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional double value = 1; + inline bool has_value() const; + inline void clear_value(); + static const int kValueFieldNumber = 1; + inline double value() const; + inline void set_value(double value); + + // @@protoc_insertion_point(class_scope:io.prometheus.client.Counter) + private: + inline void set_has_value(); + inline void clear_has_value(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + double value_; + friend void protobuf_AddDesc_metrics_2eproto(); + friend void protobuf_AssignDesc_metrics_2eproto(); + friend void protobuf_ShutdownFile_metrics_2eproto(); + + void InitAsDefaultInstance(); + static Counter* default_instance_; +}; +// ------------------------------------------------------------------- + +class Quantile : public ::google::protobuf::Message { + public: + Quantile(); + virtual ~Quantile(); + + Quantile(const Quantile& from); + + inline Quantile& operator=(const Quantile& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const Quantile& default_instance(); + + void Swap(Quantile* other); + + // implements Message ---------------------------------------------- + + Quantile* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const Quantile& from); + void MergeFrom(const Quantile& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional double quantile = 1; + inline bool has_quantile() const; + inline void clear_quantile(); + static const int kQuantileFieldNumber = 1; + inline double quantile() const; + inline void set_quantile(double value); + + // optional double value = 2; + inline bool has_value() const; + inline void clear_value(); + static const int kValueFieldNumber = 2; + inline double value() const; + inline void set_value(double value); + + // @@protoc_insertion_point(class_scope:io.prometheus.client.Quantile) + private: + inline void set_has_quantile(); + inline void clear_has_quantile(); + inline void set_has_value(); + inline void clear_has_value(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + double quantile_; + double value_; + friend void protobuf_AddDesc_metrics_2eproto(); + friend void protobuf_AssignDesc_metrics_2eproto(); + friend void protobuf_ShutdownFile_metrics_2eproto(); + + void InitAsDefaultInstance(); + static Quantile* default_instance_; +}; +// ------------------------------------------------------------------- + +class Summary : public ::google::protobuf::Message { + public: + Summary(); + virtual ~Summary(); + + Summary(const Summary& from); + + inline Summary& operator=(const Summary& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const Summary& default_instance(); + + void Swap(Summary* other); + + // implements Message ---------------------------------------------- + + Summary* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const Summary& from); + void MergeFrom(const Summary& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional uint64 sample_count = 1; + inline bool has_sample_count() const; + inline void clear_sample_count(); + static const int kSampleCountFieldNumber = 1; + inline ::google::protobuf::uint64 sample_count() const; + inline void set_sample_count(::google::protobuf::uint64 value); + + // optional double sample_sum = 2; + inline bool has_sample_sum() const; + inline void clear_sample_sum(); + static const int kSampleSumFieldNumber = 2; + inline double sample_sum() const; + inline void set_sample_sum(double value); + + // repeated .io.prometheus.client.Quantile quantile = 3; + inline int quantile_size() const; + inline void clear_quantile(); + static const int kQuantileFieldNumber = 3; + inline const ::io::prometheus::client::Quantile& quantile(int index) const; + inline ::io::prometheus::client::Quantile* mutable_quantile(int index); + inline ::io::prometheus::client::Quantile* add_quantile(); + inline const ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::Quantile >& + quantile() const; + inline ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::Quantile >* + mutable_quantile(); + + // @@protoc_insertion_point(class_scope:io.prometheus.client.Summary) + private: + inline void set_has_sample_count(); + inline void clear_has_sample_count(); + inline void set_has_sample_sum(); + inline void clear_has_sample_sum(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::google::protobuf::uint64 sample_count_; + double sample_sum_; + ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::Quantile > quantile_; + friend void protobuf_AddDesc_metrics_2eproto(); + friend void protobuf_AssignDesc_metrics_2eproto(); + friend void protobuf_ShutdownFile_metrics_2eproto(); + + void InitAsDefaultInstance(); + static Summary* default_instance_; +}; +// ------------------------------------------------------------------- + +class Untyped : public ::google::protobuf::Message { + public: + Untyped(); + virtual ~Untyped(); + + Untyped(const Untyped& from); + + inline Untyped& operator=(const Untyped& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const Untyped& default_instance(); + + void Swap(Untyped* other); + + // implements Message ---------------------------------------------- + + Untyped* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const Untyped& from); + void MergeFrom(const Untyped& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional double value = 1; + inline bool has_value() const; + inline void clear_value(); + static const int kValueFieldNumber = 1; + inline double value() const; + inline void set_value(double value); + + // @@protoc_insertion_point(class_scope:io.prometheus.client.Untyped) + private: + inline void set_has_value(); + inline void clear_has_value(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + double value_; + friend void protobuf_AddDesc_metrics_2eproto(); + friend void protobuf_AssignDesc_metrics_2eproto(); + friend void protobuf_ShutdownFile_metrics_2eproto(); + + void InitAsDefaultInstance(); + static Untyped* default_instance_; +}; +// ------------------------------------------------------------------- + +class Histogram : public ::google::protobuf::Message { + public: + Histogram(); + virtual ~Histogram(); + + Histogram(const Histogram& from); + + inline Histogram& operator=(const Histogram& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const Histogram& default_instance(); + + void Swap(Histogram* other); + + // implements Message ---------------------------------------------- + + Histogram* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const Histogram& from); + void MergeFrom(const Histogram& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional uint64 sample_count = 1; + inline bool has_sample_count() const; + inline void clear_sample_count(); + static const int kSampleCountFieldNumber = 1; + inline ::google::protobuf::uint64 sample_count() const; + inline void set_sample_count(::google::protobuf::uint64 value); + + // optional double sample_sum = 2; + inline bool has_sample_sum() const; + inline void clear_sample_sum(); + static const int kSampleSumFieldNumber = 2; + inline double sample_sum() const; + inline void set_sample_sum(double value); + + // repeated .io.prometheus.client.Bucket bucket = 3; + inline int bucket_size() const; + inline void clear_bucket(); + static const int kBucketFieldNumber = 3; + inline const ::io::prometheus::client::Bucket& bucket(int index) const; + inline ::io::prometheus::client::Bucket* mutable_bucket(int index); + inline ::io::prometheus::client::Bucket* add_bucket(); + inline const ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::Bucket >& + bucket() const; + inline ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::Bucket >* + mutable_bucket(); + + // @@protoc_insertion_point(class_scope:io.prometheus.client.Histogram) + private: + inline void set_has_sample_count(); + inline void clear_has_sample_count(); + inline void set_has_sample_sum(); + inline void clear_has_sample_sum(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::google::protobuf::uint64 sample_count_; + double sample_sum_; + ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::Bucket > bucket_; + friend void protobuf_AddDesc_metrics_2eproto(); + friend void protobuf_AssignDesc_metrics_2eproto(); + friend void protobuf_ShutdownFile_metrics_2eproto(); + + void InitAsDefaultInstance(); + static Histogram* default_instance_; +}; +// ------------------------------------------------------------------- + +class Bucket : public ::google::protobuf::Message { + public: + Bucket(); + virtual ~Bucket(); + + Bucket(const Bucket& from); + + inline Bucket& operator=(const Bucket& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const Bucket& default_instance(); + + void Swap(Bucket* other); + + // implements Message ---------------------------------------------- + + Bucket* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const Bucket& from); + void MergeFrom(const Bucket& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional uint64 cumulative_count = 1; + inline bool has_cumulative_count() const; + inline void clear_cumulative_count(); + static const int kCumulativeCountFieldNumber = 1; + inline ::google::protobuf::uint64 cumulative_count() const; + inline void set_cumulative_count(::google::protobuf::uint64 value); + + // optional double upper_bound = 2; + inline bool has_upper_bound() const; + inline void clear_upper_bound(); + static const int kUpperBoundFieldNumber = 2; + inline double upper_bound() const; + inline void set_upper_bound(double value); + + // @@protoc_insertion_point(class_scope:io.prometheus.client.Bucket) + private: + inline void set_has_cumulative_count(); + inline void clear_has_cumulative_count(); + inline void set_has_upper_bound(); + inline void clear_has_upper_bound(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::google::protobuf::uint64 cumulative_count_; + double upper_bound_; + friend void protobuf_AddDesc_metrics_2eproto(); + friend void protobuf_AssignDesc_metrics_2eproto(); + friend void protobuf_ShutdownFile_metrics_2eproto(); + + void InitAsDefaultInstance(); + static Bucket* default_instance_; +}; +// ------------------------------------------------------------------- + +class Metric : public ::google::protobuf::Message { + public: + Metric(); + virtual ~Metric(); + + Metric(const Metric& from); + + inline Metric& operator=(const Metric& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const Metric& default_instance(); + + void Swap(Metric* other); + + // implements Message ---------------------------------------------- + + Metric* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const Metric& from); + void MergeFrom(const Metric& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // repeated .io.prometheus.client.LabelPair label = 1; + inline int label_size() const; + inline void clear_label(); + static const int kLabelFieldNumber = 1; + inline const ::io::prometheus::client::LabelPair& label(int index) const; + inline ::io::prometheus::client::LabelPair* mutable_label(int index); + inline ::io::prometheus::client::LabelPair* add_label(); + inline const ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::LabelPair >& + label() const; + inline ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::LabelPair >* + mutable_label(); + + // optional .io.prometheus.client.Gauge gauge = 2; + inline bool has_gauge() const; + inline void clear_gauge(); + static const int kGaugeFieldNumber = 2; + inline const ::io::prometheus::client::Gauge& gauge() const; + inline ::io::prometheus::client::Gauge* mutable_gauge(); + inline ::io::prometheus::client::Gauge* release_gauge(); + inline void set_allocated_gauge(::io::prometheus::client::Gauge* gauge); + + // optional .io.prometheus.client.Counter counter = 3; + inline bool has_counter() const; + inline void clear_counter(); + static const int kCounterFieldNumber = 3; + inline const ::io::prometheus::client::Counter& counter() const; + inline ::io::prometheus::client::Counter* mutable_counter(); + inline ::io::prometheus::client::Counter* release_counter(); + inline void set_allocated_counter(::io::prometheus::client::Counter* counter); + + // optional .io.prometheus.client.Summary summary = 4; + inline bool has_summary() const; + inline void clear_summary(); + static const int kSummaryFieldNumber = 4; + inline const ::io::prometheus::client::Summary& summary() const; + inline ::io::prometheus::client::Summary* mutable_summary(); + inline ::io::prometheus::client::Summary* release_summary(); + inline void set_allocated_summary(::io::prometheus::client::Summary* summary); + + // optional .io.prometheus.client.Untyped untyped = 5; + inline bool has_untyped() const; + inline void clear_untyped(); + static const int kUntypedFieldNumber = 5; + inline const ::io::prometheus::client::Untyped& untyped() const; + inline ::io::prometheus::client::Untyped* mutable_untyped(); + inline ::io::prometheus::client::Untyped* release_untyped(); + inline void set_allocated_untyped(::io::prometheus::client::Untyped* untyped); + + // optional .io.prometheus.client.Histogram histogram = 7; + inline bool has_histogram() const; + inline void clear_histogram(); + static const int kHistogramFieldNumber = 7; + inline const ::io::prometheus::client::Histogram& histogram() const; + inline ::io::prometheus::client::Histogram* mutable_histogram(); + inline ::io::prometheus::client::Histogram* release_histogram(); + inline void set_allocated_histogram(::io::prometheus::client::Histogram* histogram); + + // optional int64 timestamp_ms = 6; + inline bool has_timestamp_ms() const; + inline void clear_timestamp_ms(); + static const int kTimestampMsFieldNumber = 6; + inline ::google::protobuf::int64 timestamp_ms() const; + inline void set_timestamp_ms(::google::protobuf::int64 value); + + // @@protoc_insertion_point(class_scope:io.prometheus.client.Metric) + private: + inline void set_has_gauge(); + inline void clear_has_gauge(); + inline void set_has_counter(); + inline void clear_has_counter(); + inline void set_has_summary(); + inline void clear_has_summary(); + inline void set_has_untyped(); + inline void clear_has_untyped(); + inline void set_has_histogram(); + inline void clear_has_histogram(); + inline void set_has_timestamp_ms(); + inline void clear_has_timestamp_ms(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::LabelPair > label_; + ::io::prometheus::client::Gauge* gauge_; + ::io::prometheus::client::Counter* counter_; + ::io::prometheus::client::Summary* summary_; + ::io::prometheus::client::Untyped* untyped_; + ::io::prometheus::client::Histogram* histogram_; + ::google::protobuf::int64 timestamp_ms_; + friend void protobuf_AddDesc_metrics_2eproto(); + friend void protobuf_AssignDesc_metrics_2eproto(); + friend void protobuf_ShutdownFile_metrics_2eproto(); + + void InitAsDefaultInstance(); + static Metric* default_instance_; +}; +// ------------------------------------------------------------------- + +class MetricFamily : public ::google::protobuf::Message { + public: + MetricFamily(); + virtual ~MetricFamily(); + + MetricFamily(const MetricFamily& from); + + inline MetricFamily& operator=(const MetricFamily& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const MetricFamily& default_instance(); + + void Swap(MetricFamily* other); + + // implements Message ---------------------------------------------- + + MetricFamily* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const MetricFamily& from); + void MergeFrom(const MetricFamily& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string name = 1; + inline bool has_name() const; + inline void clear_name(); + static const int kNameFieldNumber = 1; + inline const ::std::string& name() const; + inline void set_name(const ::std::string& value); + inline void set_name(const char* value); + inline void set_name(const char* value, size_t size); + inline ::std::string* mutable_name(); + inline ::std::string* release_name(); + inline void set_allocated_name(::std::string* name); + + // optional string help = 2; + inline bool has_help() const; + inline void clear_help(); + static const int kHelpFieldNumber = 2; + inline const ::std::string& help() const; + inline void set_help(const ::std::string& value); + inline void set_help(const char* value); + inline void set_help(const char* value, size_t size); + inline ::std::string* mutable_help(); + inline ::std::string* release_help(); + inline void set_allocated_help(::std::string* help); + + // optional .io.prometheus.client.MetricType type = 3; + inline bool has_type() const; + inline void clear_type(); + static const int kTypeFieldNumber = 3; + inline ::io::prometheus::client::MetricType type() const; + inline void set_type(::io::prometheus::client::MetricType value); + + // repeated .io.prometheus.client.Metric metric = 4; + inline int metric_size() const; + inline void clear_metric(); + static const int kMetricFieldNumber = 4; + inline const ::io::prometheus::client::Metric& metric(int index) const; + inline ::io::prometheus::client::Metric* mutable_metric(int index); + inline ::io::prometheus::client::Metric* add_metric(); + inline const ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::Metric >& + metric() const; + inline ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::Metric >* + mutable_metric(); + + // @@protoc_insertion_point(class_scope:io.prometheus.client.MetricFamily) + private: + inline void set_has_name(); + inline void clear_has_name(); + inline void set_has_help(); + inline void clear_has_help(); + inline void set_has_type(); + inline void clear_has_type(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::std::string* name_; + ::std::string* help_; + ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::Metric > metric_; + int type_; + friend void protobuf_AddDesc_metrics_2eproto(); + friend void protobuf_AssignDesc_metrics_2eproto(); + friend void protobuf_ShutdownFile_metrics_2eproto(); + + void InitAsDefaultInstance(); + static MetricFamily* default_instance_; +}; +// =================================================================== + + +// =================================================================== + +// LabelPair + +// optional string name = 1; +inline bool LabelPair::has_name() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void LabelPair::set_has_name() { + _has_bits_[0] |= 0x00000001u; +} +inline void LabelPair::clear_has_name() { + _has_bits_[0] &= ~0x00000001u; +} +inline void LabelPair::clear_name() { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_->clear(); + } + clear_has_name(); +} +inline const ::std::string& LabelPair::name() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.LabelPair.name) + return *name_; +} +inline void LabelPair::set_name(const ::std::string& value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(value); + // @@protoc_insertion_point(field_set:io.prometheus.client.LabelPair.name) +} +inline void LabelPair::set_name(const char* value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(value); + // @@protoc_insertion_point(field_set_char:io.prometheus.client.LabelPair.name) +} +inline void LabelPair::set_name(const char* value, size_t size) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:io.prometheus.client.LabelPair.name) +} +inline ::std::string* LabelPair::mutable_name() { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:io.prometheus.client.LabelPair.name) + return name_; +} +inline ::std::string* LabelPair::release_name() { + clear_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = name_; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void LabelPair::set_allocated_name(::std::string* name) { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete name_; + } + if (name) { + set_has_name(); + name_ = name; + } else { + clear_has_name(); + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:io.prometheus.client.LabelPair.name) +} + +// optional string value = 2; +inline bool LabelPair::has_value() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void LabelPair::set_has_value() { + _has_bits_[0] |= 0x00000002u; +} +inline void LabelPair::clear_has_value() { + _has_bits_[0] &= ~0x00000002u; +} +inline void LabelPair::clear_value() { + if (value_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + value_->clear(); + } + clear_has_value(); +} +inline const ::std::string& LabelPair::value() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.LabelPair.value) + return *value_; +} +inline void LabelPair::set_value(const ::std::string& value) { + set_has_value(); + if (value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + value_ = new ::std::string; + } + value_->assign(value); + // @@protoc_insertion_point(field_set:io.prometheus.client.LabelPair.value) +} +inline void LabelPair::set_value(const char* value) { + set_has_value(); + if (value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + value_ = new ::std::string; + } + value_->assign(value); + // @@protoc_insertion_point(field_set_char:io.prometheus.client.LabelPair.value) +} +inline void LabelPair::set_value(const char* value, size_t size) { + set_has_value(); + if (value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + value_ = new ::std::string; + } + value_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:io.prometheus.client.LabelPair.value) +} +inline ::std::string* LabelPair::mutable_value() { + set_has_value(); + if (value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + value_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:io.prometheus.client.LabelPair.value) + return value_; +} +inline ::std::string* LabelPair::release_value() { + clear_has_value(); + if (value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = value_; + value_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void LabelPair::set_allocated_value(::std::string* value) { + if (value_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete value_; + } + if (value) { + set_has_value(); + value_ = value; + } else { + clear_has_value(); + value_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:io.prometheus.client.LabelPair.value) +} + +// ------------------------------------------------------------------- + +// Gauge + +// optional double value = 1; +inline bool Gauge::has_value() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void Gauge::set_has_value() { + _has_bits_[0] |= 0x00000001u; +} +inline void Gauge::clear_has_value() { + _has_bits_[0] &= ~0x00000001u; +} +inline void Gauge::clear_value() { + value_ = 0; + clear_has_value(); +} +inline double Gauge::value() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Gauge.value) + return value_; +} +inline void Gauge::set_value(double value) { + set_has_value(); + value_ = value; + // @@protoc_insertion_point(field_set:io.prometheus.client.Gauge.value) +} + +// ------------------------------------------------------------------- + +// Counter + +// optional double value = 1; +inline bool Counter::has_value() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void Counter::set_has_value() { + _has_bits_[0] |= 0x00000001u; +} +inline void Counter::clear_has_value() { + _has_bits_[0] &= ~0x00000001u; +} +inline void Counter::clear_value() { + value_ = 0; + clear_has_value(); +} +inline double Counter::value() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Counter.value) + return value_; +} +inline void Counter::set_value(double value) { + set_has_value(); + value_ = value; + // @@protoc_insertion_point(field_set:io.prometheus.client.Counter.value) +} + +// ------------------------------------------------------------------- + +// Quantile + +// optional double quantile = 1; +inline bool Quantile::has_quantile() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void Quantile::set_has_quantile() { + _has_bits_[0] |= 0x00000001u; +} +inline void Quantile::clear_has_quantile() { + _has_bits_[0] &= ~0x00000001u; +} +inline void Quantile::clear_quantile() { + quantile_ = 0; + clear_has_quantile(); +} +inline double Quantile::quantile() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Quantile.quantile) + return quantile_; +} +inline void Quantile::set_quantile(double value) { + set_has_quantile(); + quantile_ = value; + // @@protoc_insertion_point(field_set:io.prometheus.client.Quantile.quantile) +} + +// optional double value = 2; +inline bool Quantile::has_value() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void Quantile::set_has_value() { + _has_bits_[0] |= 0x00000002u; +} +inline void Quantile::clear_has_value() { + _has_bits_[0] &= ~0x00000002u; +} +inline void Quantile::clear_value() { + value_ = 0; + clear_has_value(); +} +inline double Quantile::value() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Quantile.value) + return value_; +} +inline void Quantile::set_value(double value) { + set_has_value(); + value_ = value; + // @@protoc_insertion_point(field_set:io.prometheus.client.Quantile.value) +} + +// ------------------------------------------------------------------- + +// Summary + +// optional uint64 sample_count = 1; +inline bool Summary::has_sample_count() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void Summary::set_has_sample_count() { + _has_bits_[0] |= 0x00000001u; +} +inline void Summary::clear_has_sample_count() { + _has_bits_[0] &= ~0x00000001u; +} +inline void Summary::clear_sample_count() { + sample_count_ = GOOGLE_ULONGLONG(0); + clear_has_sample_count(); +} +inline ::google::protobuf::uint64 Summary::sample_count() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Summary.sample_count) + return sample_count_; +} +inline void Summary::set_sample_count(::google::protobuf::uint64 value) { + set_has_sample_count(); + sample_count_ = value; + // @@protoc_insertion_point(field_set:io.prometheus.client.Summary.sample_count) +} + +// optional double sample_sum = 2; +inline bool Summary::has_sample_sum() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void Summary::set_has_sample_sum() { + _has_bits_[0] |= 0x00000002u; +} +inline void Summary::clear_has_sample_sum() { + _has_bits_[0] &= ~0x00000002u; +} +inline void Summary::clear_sample_sum() { + sample_sum_ = 0; + clear_has_sample_sum(); +} +inline double Summary::sample_sum() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Summary.sample_sum) + return sample_sum_; +} +inline void Summary::set_sample_sum(double value) { + set_has_sample_sum(); + sample_sum_ = value; + // @@protoc_insertion_point(field_set:io.prometheus.client.Summary.sample_sum) +} + +// repeated .io.prometheus.client.Quantile quantile = 3; +inline int Summary::quantile_size() const { + return quantile_.size(); +} +inline void Summary::clear_quantile() { + quantile_.Clear(); +} +inline const ::io::prometheus::client::Quantile& Summary::quantile(int index) const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Summary.quantile) + return quantile_.Get(index); +} +inline ::io::prometheus::client::Quantile* Summary::mutable_quantile(int index) { + // @@protoc_insertion_point(field_mutable:io.prometheus.client.Summary.quantile) + return quantile_.Mutable(index); +} +inline ::io::prometheus::client::Quantile* Summary::add_quantile() { + // @@protoc_insertion_point(field_add:io.prometheus.client.Summary.quantile) + return quantile_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::Quantile >& +Summary::quantile() const { + // @@protoc_insertion_point(field_list:io.prometheus.client.Summary.quantile) + return quantile_; +} +inline ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::Quantile >* +Summary::mutable_quantile() { + // @@protoc_insertion_point(field_mutable_list:io.prometheus.client.Summary.quantile) + return &quantile_; +} + +// ------------------------------------------------------------------- + +// Untyped + +// optional double value = 1; +inline bool Untyped::has_value() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void Untyped::set_has_value() { + _has_bits_[0] |= 0x00000001u; +} +inline void Untyped::clear_has_value() { + _has_bits_[0] &= ~0x00000001u; +} +inline void Untyped::clear_value() { + value_ = 0; + clear_has_value(); +} +inline double Untyped::value() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Untyped.value) + return value_; +} +inline void Untyped::set_value(double value) { + set_has_value(); + value_ = value; + // @@protoc_insertion_point(field_set:io.prometheus.client.Untyped.value) +} + +// ------------------------------------------------------------------- + +// Histogram + +// optional uint64 sample_count = 1; +inline bool Histogram::has_sample_count() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void Histogram::set_has_sample_count() { + _has_bits_[0] |= 0x00000001u; +} +inline void Histogram::clear_has_sample_count() { + _has_bits_[0] &= ~0x00000001u; +} +inline void Histogram::clear_sample_count() { + sample_count_ = GOOGLE_ULONGLONG(0); + clear_has_sample_count(); +} +inline ::google::protobuf::uint64 Histogram::sample_count() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Histogram.sample_count) + return sample_count_; +} +inline void Histogram::set_sample_count(::google::protobuf::uint64 value) { + set_has_sample_count(); + sample_count_ = value; + // @@protoc_insertion_point(field_set:io.prometheus.client.Histogram.sample_count) +} + +// optional double sample_sum = 2; +inline bool Histogram::has_sample_sum() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void Histogram::set_has_sample_sum() { + _has_bits_[0] |= 0x00000002u; +} +inline void Histogram::clear_has_sample_sum() { + _has_bits_[0] &= ~0x00000002u; +} +inline void Histogram::clear_sample_sum() { + sample_sum_ = 0; + clear_has_sample_sum(); +} +inline double Histogram::sample_sum() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Histogram.sample_sum) + return sample_sum_; +} +inline void Histogram::set_sample_sum(double value) { + set_has_sample_sum(); + sample_sum_ = value; + // @@protoc_insertion_point(field_set:io.prometheus.client.Histogram.sample_sum) +} + +// repeated .io.prometheus.client.Bucket bucket = 3; +inline int Histogram::bucket_size() const { + return bucket_.size(); +} +inline void Histogram::clear_bucket() { + bucket_.Clear(); +} +inline const ::io::prometheus::client::Bucket& Histogram::bucket(int index) const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Histogram.bucket) + return bucket_.Get(index); +} +inline ::io::prometheus::client::Bucket* Histogram::mutable_bucket(int index) { + // @@protoc_insertion_point(field_mutable:io.prometheus.client.Histogram.bucket) + return bucket_.Mutable(index); +} +inline ::io::prometheus::client::Bucket* Histogram::add_bucket() { + // @@protoc_insertion_point(field_add:io.prometheus.client.Histogram.bucket) + return bucket_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::Bucket >& +Histogram::bucket() const { + // @@protoc_insertion_point(field_list:io.prometheus.client.Histogram.bucket) + return bucket_; +} +inline ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::Bucket >* +Histogram::mutable_bucket() { + // @@protoc_insertion_point(field_mutable_list:io.prometheus.client.Histogram.bucket) + return &bucket_; +} + +// ------------------------------------------------------------------- + +// Bucket + +// optional uint64 cumulative_count = 1; +inline bool Bucket::has_cumulative_count() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void Bucket::set_has_cumulative_count() { + _has_bits_[0] |= 0x00000001u; +} +inline void Bucket::clear_has_cumulative_count() { + _has_bits_[0] &= ~0x00000001u; +} +inline void Bucket::clear_cumulative_count() { + cumulative_count_ = GOOGLE_ULONGLONG(0); + clear_has_cumulative_count(); +} +inline ::google::protobuf::uint64 Bucket::cumulative_count() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Bucket.cumulative_count) + return cumulative_count_; +} +inline void Bucket::set_cumulative_count(::google::protobuf::uint64 value) { + set_has_cumulative_count(); + cumulative_count_ = value; + // @@protoc_insertion_point(field_set:io.prometheus.client.Bucket.cumulative_count) +} + +// optional double upper_bound = 2; +inline bool Bucket::has_upper_bound() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void Bucket::set_has_upper_bound() { + _has_bits_[0] |= 0x00000002u; +} +inline void Bucket::clear_has_upper_bound() { + _has_bits_[0] &= ~0x00000002u; +} +inline void Bucket::clear_upper_bound() { + upper_bound_ = 0; + clear_has_upper_bound(); +} +inline double Bucket::upper_bound() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Bucket.upper_bound) + return upper_bound_; +} +inline void Bucket::set_upper_bound(double value) { + set_has_upper_bound(); + upper_bound_ = value; + // @@protoc_insertion_point(field_set:io.prometheus.client.Bucket.upper_bound) +} + +// ------------------------------------------------------------------- + +// Metric + +// repeated .io.prometheus.client.LabelPair label = 1; +inline int Metric::label_size() const { + return label_.size(); +} +inline void Metric::clear_label() { + label_.Clear(); +} +inline const ::io::prometheus::client::LabelPair& Metric::label(int index) const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Metric.label) + return label_.Get(index); +} +inline ::io::prometheus::client::LabelPair* Metric::mutable_label(int index) { + // @@protoc_insertion_point(field_mutable:io.prometheus.client.Metric.label) + return label_.Mutable(index); +} +inline ::io::prometheus::client::LabelPair* Metric::add_label() { + // @@protoc_insertion_point(field_add:io.prometheus.client.Metric.label) + return label_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::LabelPair >& +Metric::label() const { + // @@protoc_insertion_point(field_list:io.prometheus.client.Metric.label) + return label_; +} +inline ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::LabelPair >* +Metric::mutable_label() { + // @@protoc_insertion_point(field_mutable_list:io.prometheus.client.Metric.label) + return &label_; +} + +// optional .io.prometheus.client.Gauge gauge = 2; +inline bool Metric::has_gauge() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void Metric::set_has_gauge() { + _has_bits_[0] |= 0x00000002u; +} +inline void Metric::clear_has_gauge() { + _has_bits_[0] &= ~0x00000002u; +} +inline void Metric::clear_gauge() { + if (gauge_ != NULL) gauge_->::io::prometheus::client::Gauge::Clear(); + clear_has_gauge(); +} +inline const ::io::prometheus::client::Gauge& Metric::gauge() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Metric.gauge) + return gauge_ != NULL ? *gauge_ : *default_instance_->gauge_; +} +inline ::io::prometheus::client::Gauge* Metric::mutable_gauge() { + set_has_gauge(); + if (gauge_ == NULL) gauge_ = new ::io::prometheus::client::Gauge; + // @@protoc_insertion_point(field_mutable:io.prometheus.client.Metric.gauge) + return gauge_; +} +inline ::io::prometheus::client::Gauge* Metric::release_gauge() { + clear_has_gauge(); + ::io::prometheus::client::Gauge* temp = gauge_; + gauge_ = NULL; + return temp; +} +inline void Metric::set_allocated_gauge(::io::prometheus::client::Gauge* gauge) { + delete gauge_; + gauge_ = gauge; + if (gauge) { + set_has_gauge(); + } else { + clear_has_gauge(); + } + // @@protoc_insertion_point(field_set_allocated:io.prometheus.client.Metric.gauge) +} + +// optional .io.prometheus.client.Counter counter = 3; +inline bool Metric::has_counter() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void Metric::set_has_counter() { + _has_bits_[0] |= 0x00000004u; +} +inline void Metric::clear_has_counter() { + _has_bits_[0] &= ~0x00000004u; +} +inline void Metric::clear_counter() { + if (counter_ != NULL) counter_->::io::prometheus::client::Counter::Clear(); + clear_has_counter(); +} +inline const ::io::prometheus::client::Counter& Metric::counter() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Metric.counter) + return counter_ != NULL ? *counter_ : *default_instance_->counter_; +} +inline ::io::prometheus::client::Counter* Metric::mutable_counter() { + set_has_counter(); + if (counter_ == NULL) counter_ = new ::io::prometheus::client::Counter; + // @@protoc_insertion_point(field_mutable:io.prometheus.client.Metric.counter) + return counter_; +} +inline ::io::prometheus::client::Counter* Metric::release_counter() { + clear_has_counter(); + ::io::prometheus::client::Counter* temp = counter_; + counter_ = NULL; + return temp; +} +inline void Metric::set_allocated_counter(::io::prometheus::client::Counter* counter) { + delete counter_; + counter_ = counter; + if (counter) { + set_has_counter(); + } else { + clear_has_counter(); + } + // @@protoc_insertion_point(field_set_allocated:io.prometheus.client.Metric.counter) +} + +// optional .io.prometheus.client.Summary summary = 4; +inline bool Metric::has_summary() const { + return (_has_bits_[0] & 0x00000008u) != 0; +} +inline void Metric::set_has_summary() { + _has_bits_[0] |= 0x00000008u; +} +inline void Metric::clear_has_summary() { + _has_bits_[0] &= ~0x00000008u; +} +inline void Metric::clear_summary() { + if (summary_ != NULL) summary_->::io::prometheus::client::Summary::Clear(); + clear_has_summary(); +} +inline const ::io::prometheus::client::Summary& Metric::summary() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Metric.summary) + return summary_ != NULL ? *summary_ : *default_instance_->summary_; +} +inline ::io::prometheus::client::Summary* Metric::mutable_summary() { + set_has_summary(); + if (summary_ == NULL) summary_ = new ::io::prometheus::client::Summary; + // @@protoc_insertion_point(field_mutable:io.prometheus.client.Metric.summary) + return summary_; +} +inline ::io::prometheus::client::Summary* Metric::release_summary() { + clear_has_summary(); + ::io::prometheus::client::Summary* temp = summary_; + summary_ = NULL; + return temp; +} +inline void Metric::set_allocated_summary(::io::prometheus::client::Summary* summary) { + delete summary_; + summary_ = summary; + if (summary) { + set_has_summary(); + } else { + clear_has_summary(); + } + // @@protoc_insertion_point(field_set_allocated:io.prometheus.client.Metric.summary) +} + +// optional .io.prometheus.client.Untyped untyped = 5; +inline bool Metric::has_untyped() const { + return (_has_bits_[0] & 0x00000010u) != 0; +} +inline void Metric::set_has_untyped() { + _has_bits_[0] |= 0x00000010u; +} +inline void Metric::clear_has_untyped() { + _has_bits_[0] &= ~0x00000010u; +} +inline void Metric::clear_untyped() { + if (untyped_ != NULL) untyped_->::io::prometheus::client::Untyped::Clear(); + clear_has_untyped(); +} +inline const ::io::prometheus::client::Untyped& Metric::untyped() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Metric.untyped) + return untyped_ != NULL ? *untyped_ : *default_instance_->untyped_; +} +inline ::io::prometheus::client::Untyped* Metric::mutable_untyped() { + set_has_untyped(); + if (untyped_ == NULL) untyped_ = new ::io::prometheus::client::Untyped; + // @@protoc_insertion_point(field_mutable:io.prometheus.client.Metric.untyped) + return untyped_; +} +inline ::io::prometheus::client::Untyped* Metric::release_untyped() { + clear_has_untyped(); + ::io::prometheus::client::Untyped* temp = untyped_; + untyped_ = NULL; + return temp; +} +inline void Metric::set_allocated_untyped(::io::prometheus::client::Untyped* untyped) { + delete untyped_; + untyped_ = untyped; + if (untyped) { + set_has_untyped(); + } else { + clear_has_untyped(); + } + // @@protoc_insertion_point(field_set_allocated:io.prometheus.client.Metric.untyped) +} + +// optional .io.prometheus.client.Histogram histogram = 7; +inline bool Metric::has_histogram() const { + return (_has_bits_[0] & 0x00000020u) != 0; +} +inline void Metric::set_has_histogram() { + _has_bits_[0] |= 0x00000020u; +} +inline void Metric::clear_has_histogram() { + _has_bits_[0] &= ~0x00000020u; +} +inline void Metric::clear_histogram() { + if (histogram_ != NULL) histogram_->::io::prometheus::client::Histogram::Clear(); + clear_has_histogram(); +} +inline const ::io::prometheus::client::Histogram& Metric::histogram() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Metric.histogram) + return histogram_ != NULL ? *histogram_ : *default_instance_->histogram_; +} +inline ::io::prometheus::client::Histogram* Metric::mutable_histogram() { + set_has_histogram(); + if (histogram_ == NULL) histogram_ = new ::io::prometheus::client::Histogram; + // @@protoc_insertion_point(field_mutable:io.prometheus.client.Metric.histogram) + return histogram_; +} +inline ::io::prometheus::client::Histogram* Metric::release_histogram() { + clear_has_histogram(); + ::io::prometheus::client::Histogram* temp = histogram_; + histogram_ = NULL; + return temp; +} +inline void Metric::set_allocated_histogram(::io::prometheus::client::Histogram* histogram) { + delete histogram_; + histogram_ = histogram; + if (histogram) { + set_has_histogram(); + } else { + clear_has_histogram(); + } + // @@protoc_insertion_point(field_set_allocated:io.prometheus.client.Metric.histogram) +} + +// optional int64 timestamp_ms = 6; +inline bool Metric::has_timestamp_ms() const { + return (_has_bits_[0] & 0x00000040u) != 0; +} +inline void Metric::set_has_timestamp_ms() { + _has_bits_[0] |= 0x00000040u; +} +inline void Metric::clear_has_timestamp_ms() { + _has_bits_[0] &= ~0x00000040u; +} +inline void Metric::clear_timestamp_ms() { + timestamp_ms_ = GOOGLE_LONGLONG(0); + clear_has_timestamp_ms(); +} +inline ::google::protobuf::int64 Metric::timestamp_ms() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Metric.timestamp_ms) + return timestamp_ms_; +} +inline void Metric::set_timestamp_ms(::google::protobuf::int64 value) { + set_has_timestamp_ms(); + timestamp_ms_ = value; + // @@protoc_insertion_point(field_set:io.prometheus.client.Metric.timestamp_ms) +} + +// ------------------------------------------------------------------- + +// MetricFamily + +// optional string name = 1; +inline bool MetricFamily::has_name() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void MetricFamily::set_has_name() { + _has_bits_[0] |= 0x00000001u; +} +inline void MetricFamily::clear_has_name() { + _has_bits_[0] &= ~0x00000001u; +} +inline void MetricFamily::clear_name() { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_->clear(); + } + clear_has_name(); +} +inline const ::std::string& MetricFamily::name() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.MetricFamily.name) + return *name_; +} +inline void MetricFamily::set_name(const ::std::string& value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(value); + // @@protoc_insertion_point(field_set:io.prometheus.client.MetricFamily.name) +} +inline void MetricFamily::set_name(const char* value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(value); + // @@protoc_insertion_point(field_set_char:io.prometheus.client.MetricFamily.name) +} +inline void MetricFamily::set_name(const char* value, size_t size) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:io.prometheus.client.MetricFamily.name) +} +inline ::std::string* MetricFamily::mutable_name() { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:io.prometheus.client.MetricFamily.name) + return name_; +} +inline ::std::string* MetricFamily::release_name() { + clear_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = name_; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void MetricFamily::set_allocated_name(::std::string* name) { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete name_; + } + if (name) { + set_has_name(); + name_ = name; + } else { + clear_has_name(); + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:io.prometheus.client.MetricFamily.name) +} + +// optional string help = 2; +inline bool MetricFamily::has_help() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void MetricFamily::set_has_help() { + _has_bits_[0] |= 0x00000002u; +} +inline void MetricFamily::clear_has_help() { + _has_bits_[0] &= ~0x00000002u; +} +inline void MetricFamily::clear_help() { + if (help_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + help_->clear(); + } + clear_has_help(); +} +inline const ::std::string& MetricFamily::help() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.MetricFamily.help) + return *help_; +} +inline void MetricFamily::set_help(const ::std::string& value) { + set_has_help(); + if (help_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + help_ = new ::std::string; + } + help_->assign(value); + // @@protoc_insertion_point(field_set:io.prometheus.client.MetricFamily.help) +} +inline void MetricFamily::set_help(const char* value) { + set_has_help(); + if (help_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + help_ = new ::std::string; + } + help_->assign(value); + // @@protoc_insertion_point(field_set_char:io.prometheus.client.MetricFamily.help) +} +inline void MetricFamily::set_help(const char* value, size_t size) { + set_has_help(); + if (help_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + help_ = new ::std::string; + } + help_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:io.prometheus.client.MetricFamily.help) +} +inline ::std::string* MetricFamily::mutable_help() { + set_has_help(); + if (help_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + help_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:io.prometheus.client.MetricFamily.help) + return help_; +} +inline ::std::string* MetricFamily::release_help() { + clear_has_help(); + if (help_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = help_; + help_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void MetricFamily::set_allocated_help(::std::string* help) { + if (help_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete help_; + } + if (help) { + set_has_help(); + help_ = help; + } else { + clear_has_help(); + help_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:io.prometheus.client.MetricFamily.help) +} + +// optional .io.prometheus.client.MetricType type = 3; +inline bool MetricFamily::has_type() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void MetricFamily::set_has_type() { + _has_bits_[0] |= 0x00000004u; +} +inline void MetricFamily::clear_has_type() { + _has_bits_[0] &= ~0x00000004u; +} +inline void MetricFamily::clear_type() { + type_ = 0; + clear_has_type(); +} +inline ::io::prometheus::client::MetricType MetricFamily::type() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.MetricFamily.type) + return static_cast< ::io::prometheus::client::MetricType >(type_); +} +inline void MetricFamily::set_type(::io::prometheus::client::MetricType value) { + assert(::io::prometheus::client::MetricType_IsValid(value)); + set_has_type(); + type_ = value; + // @@protoc_insertion_point(field_set:io.prometheus.client.MetricFamily.type) +} + +// repeated .io.prometheus.client.Metric metric = 4; +inline int MetricFamily::metric_size() const { + return metric_.size(); +} +inline void MetricFamily::clear_metric() { + metric_.Clear(); +} +inline const ::io::prometheus::client::Metric& MetricFamily::metric(int index) const { + // @@protoc_insertion_point(field_get:io.prometheus.client.MetricFamily.metric) + return metric_.Get(index); +} +inline ::io::prometheus::client::Metric* MetricFamily::mutable_metric(int index) { + // @@protoc_insertion_point(field_mutable:io.prometheus.client.MetricFamily.metric) + return metric_.Mutable(index); +} +inline ::io::prometheus::client::Metric* MetricFamily::add_metric() { + // @@protoc_insertion_point(field_add:io.prometheus.client.MetricFamily.metric) + return metric_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::Metric >& +MetricFamily::metric() const { + // @@protoc_insertion_point(field_list:io.prometheus.client.MetricFamily.metric) + return metric_; +} +inline ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::Metric >* +MetricFamily::mutable_metric() { + // @@protoc_insertion_point(field_mutable_list:io.prometheus.client.MetricFamily.metric) + return &metric_; +} + + +// @@protoc_insertion_point(namespace_scope) + +} // namespace client +} // namespace prometheus +} // namespace io + +#ifndef SWIG +namespace google { +namespace protobuf { + +template <> struct is_proto_enum< ::io::prometheus::client::MetricType> : ::google::protobuf::internal::true_type {}; +template <> +inline const EnumDescriptor* GetEnumDescriptor< ::io::prometheus::client::MetricType>() { + return ::io::prometheus::client::MetricType_descriptor(); +} + +} // namespace google +} // namespace protobuf +#endif // SWIG + +// @@protoc_insertion_point(global_scope) + +#endif // PROTOBUF_metrics_2eproto__INCLUDED diff --git a/api/vendor/github.com/prometheus/client_model/go/metrics.pb.go b/api/vendor/github.com/prometheus/client_model/go/metrics.pb.go new file mode 100644 index 0000000..b065f86 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_model/go/metrics.pb.go @@ -0,0 +1,364 @@ +// Code generated by protoc-gen-go. +// source: metrics.proto +// DO NOT EDIT! + +/* +Package io_prometheus_client is a generated protocol buffer package. + +It is generated from these files: + metrics.proto + +It has these top-level messages: + LabelPair + Gauge + Counter + Quantile + Summary + Untyped + Histogram + Bucket + Metric + MetricFamily +*/ +package io_prometheus_client + +import proto "github.com/golang/protobuf/proto" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = math.Inf + +type MetricType int32 + +const ( + MetricType_COUNTER MetricType = 0 + MetricType_GAUGE MetricType = 1 + MetricType_SUMMARY MetricType = 2 + MetricType_UNTYPED MetricType = 3 + MetricType_HISTOGRAM MetricType = 4 +) + +var MetricType_name = map[int32]string{ + 0: "COUNTER", + 1: "GAUGE", + 2: "SUMMARY", + 3: "UNTYPED", + 4: "HISTOGRAM", +} +var MetricType_value = map[string]int32{ + "COUNTER": 0, + "GAUGE": 1, + "SUMMARY": 2, + "UNTYPED": 3, + "HISTOGRAM": 4, +} + +func (x MetricType) Enum() *MetricType { + p := new(MetricType) + *p = x + return p +} +func (x MetricType) String() string { + return proto.EnumName(MetricType_name, int32(x)) +} +func (x *MetricType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(MetricType_value, data, "MetricType") + if err != nil { + return err + } + *x = MetricType(value) + return nil +} + +type LabelPair struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Value *string `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *LabelPair) Reset() { *m = LabelPair{} } +func (m *LabelPair) String() string { return proto.CompactTextString(m) } +func (*LabelPair) ProtoMessage() {} + +func (m *LabelPair) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *LabelPair) GetValue() string { + if m != nil && m.Value != nil { + return *m.Value + } + return "" +} + +type Gauge struct { + Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Gauge) Reset() { *m = Gauge{} } +func (m *Gauge) String() string { return proto.CompactTextString(m) } +func (*Gauge) ProtoMessage() {} + +func (m *Gauge) GetValue() float64 { + if m != nil && m.Value != nil { + return *m.Value + } + return 0 +} + +type Counter struct { + Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Counter) Reset() { *m = Counter{} } +func (m *Counter) String() string { return proto.CompactTextString(m) } +func (*Counter) ProtoMessage() {} + +func (m *Counter) GetValue() float64 { + if m != nil && m.Value != nil { + return *m.Value + } + return 0 +} + +type Quantile struct { + Quantile *float64 `protobuf:"fixed64,1,opt,name=quantile" json:"quantile,omitempty"` + Value *float64 `protobuf:"fixed64,2,opt,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Quantile) Reset() { *m = Quantile{} } +func (m *Quantile) String() string { return proto.CompactTextString(m) } +func (*Quantile) ProtoMessage() {} + +func (m *Quantile) GetQuantile() float64 { + if m != nil && m.Quantile != nil { + return *m.Quantile + } + return 0 +} + +func (m *Quantile) GetValue() float64 { + if m != nil && m.Value != nil { + return *m.Value + } + return 0 +} + +type Summary struct { + SampleCount *uint64 `protobuf:"varint,1,opt,name=sample_count" json:"sample_count,omitempty"` + SampleSum *float64 `protobuf:"fixed64,2,opt,name=sample_sum" json:"sample_sum,omitempty"` + Quantile []*Quantile `protobuf:"bytes,3,rep,name=quantile" json:"quantile,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Summary) Reset() { *m = Summary{} } +func (m *Summary) String() string { return proto.CompactTextString(m) } +func (*Summary) ProtoMessage() {} + +func (m *Summary) GetSampleCount() uint64 { + if m != nil && m.SampleCount != nil { + return *m.SampleCount + } + return 0 +} + +func (m *Summary) GetSampleSum() float64 { + if m != nil && m.SampleSum != nil { + return *m.SampleSum + } + return 0 +} + +func (m *Summary) GetQuantile() []*Quantile { + if m != nil { + return m.Quantile + } + return nil +} + +type Untyped struct { + Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Untyped) Reset() { *m = Untyped{} } +func (m *Untyped) String() string { return proto.CompactTextString(m) } +func (*Untyped) ProtoMessage() {} + +func (m *Untyped) GetValue() float64 { + if m != nil && m.Value != nil { + return *m.Value + } + return 0 +} + +type Histogram struct { + SampleCount *uint64 `protobuf:"varint,1,opt,name=sample_count" json:"sample_count,omitempty"` + SampleSum *float64 `protobuf:"fixed64,2,opt,name=sample_sum" json:"sample_sum,omitempty"` + Bucket []*Bucket `protobuf:"bytes,3,rep,name=bucket" json:"bucket,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Histogram) Reset() { *m = Histogram{} } +func (m *Histogram) String() string { return proto.CompactTextString(m) } +func (*Histogram) ProtoMessage() {} + +func (m *Histogram) GetSampleCount() uint64 { + if m != nil && m.SampleCount != nil { + return *m.SampleCount + } + return 0 +} + +func (m *Histogram) GetSampleSum() float64 { + if m != nil && m.SampleSum != nil { + return *m.SampleSum + } + return 0 +} + +func (m *Histogram) GetBucket() []*Bucket { + if m != nil { + return m.Bucket + } + return nil +} + +type Bucket struct { + CumulativeCount *uint64 `protobuf:"varint,1,opt,name=cumulative_count" json:"cumulative_count,omitempty"` + UpperBound *float64 `protobuf:"fixed64,2,opt,name=upper_bound" json:"upper_bound,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Bucket) Reset() { *m = Bucket{} } +func (m *Bucket) String() string { return proto.CompactTextString(m) } +func (*Bucket) ProtoMessage() {} + +func (m *Bucket) GetCumulativeCount() uint64 { + if m != nil && m.CumulativeCount != nil { + return *m.CumulativeCount + } + return 0 +} + +func (m *Bucket) GetUpperBound() float64 { + if m != nil && m.UpperBound != nil { + return *m.UpperBound + } + return 0 +} + +type Metric struct { + Label []*LabelPair `protobuf:"bytes,1,rep,name=label" json:"label,omitempty"` + Gauge *Gauge `protobuf:"bytes,2,opt,name=gauge" json:"gauge,omitempty"` + Counter *Counter `protobuf:"bytes,3,opt,name=counter" json:"counter,omitempty"` + Summary *Summary `protobuf:"bytes,4,opt,name=summary" json:"summary,omitempty"` + Untyped *Untyped `protobuf:"bytes,5,opt,name=untyped" json:"untyped,omitempty"` + Histogram *Histogram `protobuf:"bytes,7,opt,name=histogram" json:"histogram,omitempty"` + TimestampMs *int64 `protobuf:"varint,6,opt,name=timestamp_ms" json:"timestamp_ms,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Metric) Reset() { *m = Metric{} } +func (m *Metric) String() string { return proto.CompactTextString(m) } +func (*Metric) ProtoMessage() {} + +func (m *Metric) GetLabel() []*LabelPair { + if m != nil { + return m.Label + } + return nil +} + +func (m *Metric) GetGauge() *Gauge { + if m != nil { + return m.Gauge + } + return nil +} + +func (m *Metric) GetCounter() *Counter { + if m != nil { + return m.Counter + } + return nil +} + +func (m *Metric) GetSummary() *Summary { + if m != nil { + return m.Summary + } + return nil +} + +func (m *Metric) GetUntyped() *Untyped { + if m != nil { + return m.Untyped + } + return nil +} + +func (m *Metric) GetHistogram() *Histogram { + if m != nil { + return m.Histogram + } + return nil +} + +func (m *Metric) GetTimestampMs() int64 { + if m != nil && m.TimestampMs != nil { + return *m.TimestampMs + } + return 0 +} + +type MetricFamily struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Help *string `protobuf:"bytes,2,opt,name=help" json:"help,omitempty"` + Type *MetricType `protobuf:"varint,3,opt,name=type,enum=io.prometheus.client.MetricType" json:"type,omitempty"` + Metric []*Metric `protobuf:"bytes,4,rep,name=metric" json:"metric,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *MetricFamily) Reset() { *m = MetricFamily{} } +func (m *MetricFamily) String() string { return proto.CompactTextString(m) } +func (*MetricFamily) ProtoMessage() {} + +func (m *MetricFamily) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *MetricFamily) GetHelp() string { + if m != nil && m.Help != nil { + return *m.Help + } + return "" +} + +func (m *MetricFamily) GetType() MetricType { + if m != nil && m.Type != nil { + return *m.Type + } + return MetricType_COUNTER +} + +func (m *MetricFamily) GetMetric() []*Metric { + if m != nil { + return m.Metric + } + return nil +} + +func init() { + proto.RegisterEnum("io.prometheus.client.MetricType", MetricType_name, MetricType_value) +} diff --git a/api/vendor/github.com/prometheus/client_model/metrics.proto b/api/vendor/github.com/prometheus/client_model/metrics.proto new file mode 100644 index 0000000..0b84af9 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_model/metrics.proto @@ -0,0 +1,81 @@ +// Copyright 2013 Prometheus Team +// 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. + +syntax = "proto2"; + +package io.prometheus.client; +option java_package = "io.prometheus.client"; + +message LabelPair { + optional string name = 1; + optional string value = 2; +} + +enum MetricType { + COUNTER = 0; + GAUGE = 1; + SUMMARY = 2; + UNTYPED = 3; + HISTOGRAM = 4; +} + +message Gauge { + optional double value = 1; +} + +message Counter { + optional double value = 1; +} + +message Quantile { + optional double quantile = 1; + optional double value = 2; +} + +message Summary { + optional uint64 sample_count = 1; + optional double sample_sum = 2; + repeated Quantile quantile = 3; +} + +message Untyped { + optional double value = 1; +} + +message Histogram { + optional uint64 sample_count = 1; + optional double sample_sum = 2; + repeated Bucket bucket = 3; // Ordered in increasing order of upper_bound, +Inf bucket is optional. +} + +message Bucket { + optional uint64 cumulative_count = 1; // Cumulative in increasing order. + optional double upper_bound = 2; // Inclusive. +} + +message Metric { + repeated LabelPair label = 1; + optional Gauge gauge = 2; + optional Counter counter = 3; + optional Summary summary = 4; + optional Untyped untyped = 5; + optional Histogram histogram = 7; + optional int64 timestamp_ms = 6; +} + +message MetricFamily { + optional string name = 1; + optional string help = 2; + optional MetricType type = 3; + repeated Metric metric = 4; +} diff --git a/api/vendor/github.com/prometheus/client_model/pom.xml b/api/vendor/github.com/prometheus/client_model/pom.xml new file mode 100644 index 0000000..4d34c90 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_model/pom.xml @@ -0,0 +1,130 @@ + + + 4.0.0 + + io.prometheus.client + model + 0.0.3-SNAPSHOT + + + org.sonatype.oss + oss-parent + 7 + + + Prometheus Client Data Model + http://github.com/prometheus/client_model + + Prometheus Client Data Model: Generated Protocol Buffer Assets + + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + scm:git:git@github.com:prometheus/client_model.git + scm:git:git@github.com:prometheus/client_model.git + git@github.com:prometheus/client_model.git + + + + + mtp + Matt T. Proud + matt.proud@gmail.com + + + + + + com.google.protobuf + protobuf-java + 2.5.0 + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.8 + + UTF-8 + UTF-8 + true + + + + generate-javadoc-site-report + site + + javadoc + + + + attach-javadocs + + jar + + + + + + maven-compiler-plugin + + 1.6 + 1.6 + + 3.1 + + + org.apache.maven.plugins + maven-source-plugin + 2.2.1 + + + attach-sources + + jar + + + + + + + + + release-sign-artifacts + + + performRelease + true + + + + + + org.apache.maven.plugins + maven-gpg-plugin + 1.4 + + + sign-artifacts + verify + + sign + + + + + + + + + diff --git a/api/vendor/github.com/prometheus/client_model/python/prometheus/__init__.py b/api/vendor/github.com/prometheus/client_model/python/prometheus/__init__.py new file mode 100644 index 0000000..617c0ce --- /dev/null +++ b/api/vendor/github.com/prometheus/client_model/python/prometheus/__init__.py @@ -0,0 +1,12 @@ + # Copyright 2013 Prometheus Team + # 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/api/vendor/github.com/prometheus/client_model/python/prometheus/client/__init__.py b/api/vendor/github.com/prometheus/client_model/python/prometheus/client/__init__.py new file mode 100644 index 0000000..617c0ce --- /dev/null +++ b/api/vendor/github.com/prometheus/client_model/python/prometheus/client/__init__.py @@ -0,0 +1,12 @@ + # Copyright 2013 Prometheus Team + # 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/api/vendor/github.com/prometheus/client_model/python/prometheus/client/model/__init__.py b/api/vendor/github.com/prometheus/client_model/python/prometheus/client/model/__init__.py new file mode 100644 index 0000000..d40327c --- /dev/null +++ b/api/vendor/github.com/prometheus/client_model/python/prometheus/client/model/__init__.py @@ -0,0 +1,14 @@ + # Copyright 2013 Prometheus Team + # 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. + +__all__ = ['metrics_pb2'] diff --git a/api/vendor/github.com/prometheus/client_model/python/prometheus/client/model/metrics_pb2.py b/api/vendor/github.com/prometheus/client_model/python/prometheus/client/model/metrics_pb2.py new file mode 100644 index 0000000..8c239ac --- /dev/null +++ b/api/vendor/github.com/prometheus/client_model/python/prometheus/client/model/metrics_pb2.py @@ -0,0 +1,575 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: metrics.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf.internal import enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +from google.protobuf import descriptor_pb2 +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='metrics.proto', + package='io.prometheus.client', + serialized_pb=_b('\n\rmetrics.proto\x12\x14io.prometheus.client\"(\n\tLabelPair\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"\x16\n\x05Gauge\x12\r\n\x05value\x18\x01 \x01(\x01\"\x18\n\x07\x43ounter\x12\r\n\x05value\x18\x01 \x01(\x01\"+\n\x08Quantile\x12\x10\n\x08quantile\x18\x01 \x01(\x01\x12\r\n\x05value\x18\x02 \x01(\x01\"e\n\x07Summary\x12\x14\n\x0csample_count\x18\x01 \x01(\x04\x12\x12\n\nsample_sum\x18\x02 \x01(\x01\x12\x30\n\x08quantile\x18\x03 \x03(\x0b\x32\x1e.io.prometheus.client.Quantile\"\x18\n\x07Untyped\x12\r\n\x05value\x18\x01 \x01(\x01\"c\n\tHistogram\x12\x14\n\x0csample_count\x18\x01 \x01(\x04\x12\x12\n\nsample_sum\x18\x02 \x01(\x01\x12,\n\x06\x62ucket\x18\x03 \x03(\x0b\x32\x1c.io.prometheus.client.Bucket\"7\n\x06\x42ucket\x12\x18\n\x10\x63umulative_count\x18\x01 \x01(\x04\x12\x13\n\x0bupper_bound\x18\x02 \x01(\x01\"\xbe\x02\n\x06Metric\x12.\n\x05label\x18\x01 \x03(\x0b\x32\x1f.io.prometheus.client.LabelPair\x12*\n\x05gauge\x18\x02 \x01(\x0b\x32\x1b.io.prometheus.client.Gauge\x12.\n\x07\x63ounter\x18\x03 \x01(\x0b\x32\x1d.io.prometheus.client.Counter\x12.\n\x07summary\x18\x04 \x01(\x0b\x32\x1d.io.prometheus.client.Summary\x12.\n\x07untyped\x18\x05 \x01(\x0b\x32\x1d.io.prometheus.client.Untyped\x12\x32\n\thistogram\x18\x07 \x01(\x0b\x32\x1f.io.prometheus.client.Histogram\x12\x14\n\x0ctimestamp_ms\x18\x06 \x01(\x03\"\x88\x01\n\x0cMetricFamily\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04help\x18\x02 \x01(\t\x12.\n\x04type\x18\x03 \x01(\x0e\x32 .io.prometheus.client.MetricType\x12,\n\x06metric\x18\x04 \x03(\x0b\x32\x1c.io.prometheus.client.Metric*M\n\nMetricType\x12\x0b\n\x07\x43OUNTER\x10\x00\x12\t\n\x05GAUGE\x10\x01\x12\x0b\n\x07SUMMARY\x10\x02\x12\x0b\n\x07UNTYPED\x10\x03\x12\r\n\tHISTOGRAM\x10\x04\x42\x16\n\x14io.prometheus.client') +) +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +_METRICTYPE = _descriptor.EnumDescriptor( + name='MetricType', + full_name='io.prometheus.client.MetricType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='COUNTER', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='GAUGE', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SUMMARY', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='UNTYPED', index=3, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HISTOGRAM', index=4, number=4, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=923, + serialized_end=1000, +) +_sym_db.RegisterEnumDescriptor(_METRICTYPE) + +MetricType = enum_type_wrapper.EnumTypeWrapper(_METRICTYPE) +COUNTER = 0 +GAUGE = 1 +SUMMARY = 2 +UNTYPED = 3 +HISTOGRAM = 4 + + + +_LABELPAIR = _descriptor.Descriptor( + name='LabelPair', + full_name='io.prometheus.client.LabelPair', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='io.prometheus.client.LabelPair.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='value', full_name='io.prometheus.client.LabelPair.value', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=39, + serialized_end=79, +) + + +_GAUGE = _descriptor.Descriptor( + name='Gauge', + full_name='io.prometheus.client.Gauge', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='value', full_name='io.prometheus.client.Gauge.value', index=0, + number=1, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=81, + serialized_end=103, +) + + +_COUNTER = _descriptor.Descriptor( + name='Counter', + full_name='io.prometheus.client.Counter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='value', full_name='io.prometheus.client.Counter.value', index=0, + number=1, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=105, + serialized_end=129, +) + + +_QUANTILE = _descriptor.Descriptor( + name='Quantile', + full_name='io.prometheus.client.Quantile', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='quantile', full_name='io.prometheus.client.Quantile.quantile', index=0, + number=1, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='value', full_name='io.prometheus.client.Quantile.value', index=1, + number=2, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=131, + serialized_end=174, +) + + +_SUMMARY = _descriptor.Descriptor( + name='Summary', + full_name='io.prometheus.client.Summary', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='sample_count', full_name='io.prometheus.client.Summary.sample_count', index=0, + number=1, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='sample_sum', full_name='io.prometheus.client.Summary.sample_sum', index=1, + number=2, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='quantile', full_name='io.prometheus.client.Summary.quantile', index=2, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=176, + serialized_end=277, +) + + +_UNTYPED = _descriptor.Descriptor( + name='Untyped', + full_name='io.prometheus.client.Untyped', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='value', full_name='io.prometheus.client.Untyped.value', index=0, + number=1, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=279, + serialized_end=303, +) + + +_HISTOGRAM = _descriptor.Descriptor( + name='Histogram', + full_name='io.prometheus.client.Histogram', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='sample_count', full_name='io.prometheus.client.Histogram.sample_count', index=0, + number=1, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='sample_sum', full_name='io.prometheus.client.Histogram.sample_sum', index=1, + number=2, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='bucket', full_name='io.prometheus.client.Histogram.bucket', index=2, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=305, + serialized_end=404, +) + + +_BUCKET = _descriptor.Descriptor( + name='Bucket', + full_name='io.prometheus.client.Bucket', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='cumulative_count', full_name='io.prometheus.client.Bucket.cumulative_count', index=0, + number=1, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='upper_bound', full_name='io.prometheus.client.Bucket.upper_bound', index=1, + number=2, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=406, + serialized_end=461, +) + + +_METRIC = _descriptor.Descriptor( + name='Metric', + full_name='io.prometheus.client.Metric', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='label', full_name='io.prometheus.client.Metric.label', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='gauge', full_name='io.prometheus.client.Metric.gauge', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='counter', full_name='io.prometheus.client.Metric.counter', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='summary', full_name='io.prometheus.client.Metric.summary', index=3, + number=4, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='untyped', full_name='io.prometheus.client.Metric.untyped', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='histogram', full_name='io.prometheus.client.Metric.histogram', index=5, + number=7, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='timestamp_ms', full_name='io.prometheus.client.Metric.timestamp_ms', index=6, + number=6, type=3, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=464, + serialized_end=782, +) + + +_METRICFAMILY = _descriptor.Descriptor( + name='MetricFamily', + full_name='io.prometheus.client.MetricFamily', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='io.prometheus.client.MetricFamily.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='help', full_name='io.prometheus.client.MetricFamily.help', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='type', full_name='io.prometheus.client.MetricFamily.type', index=2, + number=3, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='metric', full_name='io.prometheus.client.MetricFamily.metric', index=3, + number=4, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=785, + serialized_end=921, +) + +_SUMMARY.fields_by_name['quantile'].message_type = _QUANTILE +_HISTOGRAM.fields_by_name['bucket'].message_type = _BUCKET +_METRIC.fields_by_name['label'].message_type = _LABELPAIR +_METRIC.fields_by_name['gauge'].message_type = _GAUGE +_METRIC.fields_by_name['counter'].message_type = _COUNTER +_METRIC.fields_by_name['summary'].message_type = _SUMMARY +_METRIC.fields_by_name['untyped'].message_type = _UNTYPED +_METRIC.fields_by_name['histogram'].message_type = _HISTOGRAM +_METRICFAMILY.fields_by_name['type'].enum_type = _METRICTYPE +_METRICFAMILY.fields_by_name['metric'].message_type = _METRIC +DESCRIPTOR.message_types_by_name['LabelPair'] = _LABELPAIR +DESCRIPTOR.message_types_by_name['Gauge'] = _GAUGE +DESCRIPTOR.message_types_by_name['Counter'] = _COUNTER +DESCRIPTOR.message_types_by_name['Quantile'] = _QUANTILE +DESCRIPTOR.message_types_by_name['Summary'] = _SUMMARY +DESCRIPTOR.message_types_by_name['Untyped'] = _UNTYPED +DESCRIPTOR.message_types_by_name['Histogram'] = _HISTOGRAM +DESCRIPTOR.message_types_by_name['Bucket'] = _BUCKET +DESCRIPTOR.message_types_by_name['Metric'] = _METRIC +DESCRIPTOR.message_types_by_name['MetricFamily'] = _METRICFAMILY +DESCRIPTOR.enum_types_by_name['MetricType'] = _METRICTYPE + +LabelPair = _reflection.GeneratedProtocolMessageType('LabelPair', (_message.Message,), dict( + DESCRIPTOR = _LABELPAIR, + __module__ = 'metrics_pb2' + # @@protoc_insertion_point(class_scope:io.prometheus.client.LabelPair) + )) +_sym_db.RegisterMessage(LabelPair) + +Gauge = _reflection.GeneratedProtocolMessageType('Gauge', (_message.Message,), dict( + DESCRIPTOR = _GAUGE, + __module__ = 'metrics_pb2' + # @@protoc_insertion_point(class_scope:io.prometheus.client.Gauge) + )) +_sym_db.RegisterMessage(Gauge) + +Counter = _reflection.GeneratedProtocolMessageType('Counter', (_message.Message,), dict( + DESCRIPTOR = _COUNTER, + __module__ = 'metrics_pb2' + # @@protoc_insertion_point(class_scope:io.prometheus.client.Counter) + )) +_sym_db.RegisterMessage(Counter) + +Quantile = _reflection.GeneratedProtocolMessageType('Quantile', (_message.Message,), dict( + DESCRIPTOR = _QUANTILE, + __module__ = 'metrics_pb2' + # @@protoc_insertion_point(class_scope:io.prometheus.client.Quantile) + )) +_sym_db.RegisterMessage(Quantile) + +Summary = _reflection.GeneratedProtocolMessageType('Summary', (_message.Message,), dict( + DESCRIPTOR = _SUMMARY, + __module__ = 'metrics_pb2' + # @@protoc_insertion_point(class_scope:io.prometheus.client.Summary) + )) +_sym_db.RegisterMessage(Summary) + +Untyped = _reflection.GeneratedProtocolMessageType('Untyped', (_message.Message,), dict( + DESCRIPTOR = _UNTYPED, + __module__ = 'metrics_pb2' + # @@protoc_insertion_point(class_scope:io.prometheus.client.Untyped) + )) +_sym_db.RegisterMessage(Untyped) + +Histogram = _reflection.GeneratedProtocolMessageType('Histogram', (_message.Message,), dict( + DESCRIPTOR = _HISTOGRAM, + __module__ = 'metrics_pb2' + # @@protoc_insertion_point(class_scope:io.prometheus.client.Histogram) + )) +_sym_db.RegisterMessage(Histogram) + +Bucket = _reflection.GeneratedProtocolMessageType('Bucket', (_message.Message,), dict( + DESCRIPTOR = _BUCKET, + __module__ = 'metrics_pb2' + # @@protoc_insertion_point(class_scope:io.prometheus.client.Bucket) + )) +_sym_db.RegisterMessage(Bucket) + +Metric = _reflection.GeneratedProtocolMessageType('Metric', (_message.Message,), dict( + DESCRIPTOR = _METRIC, + __module__ = 'metrics_pb2' + # @@protoc_insertion_point(class_scope:io.prometheus.client.Metric) + )) +_sym_db.RegisterMessage(Metric) + +MetricFamily = _reflection.GeneratedProtocolMessageType('MetricFamily', (_message.Message,), dict( + DESCRIPTOR = _METRICFAMILY, + __module__ = 'metrics_pb2' + # @@protoc_insertion_point(class_scope:io.prometheus.client.MetricFamily) + )) +_sym_db.RegisterMessage(MetricFamily) + + +DESCRIPTOR.has_options = True +DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\024io.prometheus.client')) +# @@protoc_insertion_point(module_scope) diff --git a/api/vendor/github.com/prometheus/client_model/ruby/.gitignore b/api/vendor/github.com/prometheus/client_model/ruby/.gitignore new file mode 100644 index 0000000..8442a47 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_model/ruby/.gitignore @@ -0,0 +1,5 @@ +*.gem +.bundle +Gemfile.lock +pkg +vendor/bundle diff --git a/api/vendor/github.com/prometheus/client_model/ruby/Gemfile b/api/vendor/github.com/prometheus/client_model/ruby/Gemfile new file mode 100644 index 0000000..1ff638c --- /dev/null +++ b/api/vendor/github.com/prometheus/client_model/ruby/Gemfile @@ -0,0 +1,4 @@ +source 'https://rubygems.org' + +# Specify your gem's dependencies in prometheus-client-model.gemspec +gemspec diff --git a/api/vendor/github.com/prometheus/client_model/ruby/LICENSE b/api/vendor/github.com/prometheus/client_model/ruby/LICENSE new file mode 100644 index 0000000..11069ed --- /dev/null +++ b/api/vendor/github.com/prometheus/client_model/ruby/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 [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/api/vendor/github.com/prometheus/client_model/ruby/Makefile b/api/vendor/github.com/prometheus/client_model/ruby/Makefile new file mode 100644 index 0000000..09d544b --- /dev/null +++ b/api/vendor/github.com/prometheus/client_model/ruby/Makefile @@ -0,0 +1,17 @@ +VENDOR_BUNDLE = vendor/bundle + +build: $(VENDOR_BUNDLE)/.bundled + BEEFCAKE_NAMESPACE=Prometheus::Client protoc --beefcake_out lib/prometheus/client/model -I .. ../metrics.proto + +$(VENDOR_BUNDLE): + mkdir -p $@ + +$(VENDOR_BUNDLE)/.bundled: $(VENDOR_BUNDLE) Gemfile + bundle install --quiet --path $< + @touch $@ + +clean: + -rm -f lib/prometheus/client/model/metrics.pb.rb + -rm -rf $(VENDOR_BUNDLE) + +.PHONY: build clean diff --git a/api/vendor/github.com/prometheus/client_model/ruby/README.md b/api/vendor/github.com/prometheus/client_model/ruby/README.md new file mode 100644 index 0000000..c45fcc7 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_model/ruby/README.md @@ -0,0 +1,31 @@ +# Prometheus Ruby client model + +Data model artifacts for the [Prometheus Ruby client][1]. + +## Installation + + gem install prometheus-client-model + +## Usage + +Build the artifacts from the protobuf specification: + + make build + +While this Gem's main purpose is to define the Prometheus data types for the +[client][1], it's possible to use it without the client to decode a stream of +delimited protobuf messages: + +```ruby +require 'open-uri' +require 'prometheus/client/model' + +CONTENT_TYPE = 'application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=delimited' + +stream = open('http://localhost:9090/metrics', 'Accept' => CONTENT_TYPE).read +while family = Prometheus::Client::MetricFamily.read_delimited(stream) + puts family +end +``` + +[1]: https://github.com/prometheus/client_ruby diff --git a/api/vendor/github.com/prometheus/client_model/ruby/Rakefile b/api/vendor/github.com/prometheus/client_model/ruby/Rakefile new file mode 100644 index 0000000..2995527 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_model/ruby/Rakefile @@ -0,0 +1 @@ +require "bundler/gem_tasks" diff --git a/api/vendor/github.com/prometheus/client_model/ruby/lib/prometheus/client/model.rb b/api/vendor/github.com/prometheus/client_model/ruby/lib/prometheus/client/model.rb new file mode 100644 index 0000000..b5303bf --- /dev/null +++ b/api/vendor/github.com/prometheus/client_model/ruby/lib/prometheus/client/model.rb @@ -0,0 +1,2 @@ +require 'prometheus/client/model/metrics.pb' +require 'prometheus/client/model/version' diff --git a/api/vendor/github.com/prometheus/client_model/ruby/lib/prometheus/client/model/metrics.pb.rb b/api/vendor/github.com/prometheus/client_model/ruby/lib/prometheus/client/model/metrics.pb.rb new file mode 100644 index 0000000..a72114b --- /dev/null +++ b/api/vendor/github.com/prometheus/client_model/ruby/lib/prometheus/client/model/metrics.pb.rb @@ -0,0 +1,111 @@ +## Generated from metrics.proto for io.prometheus.client +require "beefcake" + +module Prometheus + module Client + + module MetricType + COUNTER = 0 + GAUGE = 1 + SUMMARY = 2 + UNTYPED = 3 + HISTOGRAM = 4 + end + + class LabelPair + include Beefcake::Message + end + + class Gauge + include Beefcake::Message + end + + class Counter + include Beefcake::Message + end + + class Quantile + include Beefcake::Message + end + + class Summary + include Beefcake::Message + end + + class Untyped + include Beefcake::Message + end + + class Histogram + include Beefcake::Message + end + + class Bucket + include Beefcake::Message + end + + class Metric + include Beefcake::Message + end + + class MetricFamily + include Beefcake::Message + end + + class LabelPair + optional :name, :string, 1 + optional :value, :string, 2 + end + + class Gauge + optional :value, :double, 1 + end + + class Counter + optional :value, :double, 1 + end + + class Quantile + optional :quantile, :double, 1 + optional :value, :double, 2 + end + + class Summary + optional :sample_count, :uint64, 1 + optional :sample_sum, :double, 2 + repeated :quantile, Quantile, 3 + end + + class Untyped + optional :value, :double, 1 + end + + class Histogram + optional :sample_count, :uint64, 1 + optional :sample_sum, :double, 2 + repeated :bucket, Bucket, 3 + end + + class Bucket + optional :cumulative_count, :uint64, 1 + optional :upper_bound, :double, 2 + end + + class Metric + repeated :label, LabelPair, 1 + optional :gauge, Gauge, 2 + optional :counter, Counter, 3 + optional :summary, Summary, 4 + optional :untyped, Untyped, 5 + optional :histogram, Histogram, 7 + optional :timestamp_ms, :int64, 6 + end + + class MetricFamily + optional :name, :string, 1 + optional :help, :string, 2 + optional :type, MetricType, 3 + repeated :metric, Metric, 4 + end + end +end diff --git a/api/vendor/github.com/prometheus/client_model/ruby/lib/prometheus/client/model/version.rb b/api/vendor/github.com/prometheus/client_model/ruby/lib/prometheus/client/model/version.rb new file mode 100644 index 0000000..00b5e86 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_model/ruby/lib/prometheus/client/model/version.rb @@ -0,0 +1,7 @@ +module Prometheus + module Client + module Model + VERSION = '0.1.0' + end + end +end diff --git a/api/vendor/github.com/prometheus/client_model/ruby/prometheus-client-model.gemspec b/api/vendor/github.com/prometheus/client_model/ruby/prometheus-client-model.gemspec new file mode 100644 index 0000000..438ba12 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_model/ruby/prometheus-client-model.gemspec @@ -0,0 +1,22 @@ +# coding: utf-8 +lib = File.expand_path('../lib', __FILE__) +$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) +require 'prometheus/client/model/version' + +Gem::Specification.new do |spec| + spec.name = 'prometheus-client-model' + spec.version = Prometheus::Client::Model::VERSION + spec.authors = ['Tobias Schmidt'] + spec.email = ['tobidt@gmail.com'] + spec.summary = 'Data model artifacts for the Prometheus Ruby client' + spec.homepage = 'https://github.com/prometheus/client_model/tree/master/ruby' + spec.license = 'Apache 2.0' + + spec.files = %w[README.md LICENSE] + Dir.glob('{lib/**/*}') + spec.require_paths = ['lib'] + + spec.add_dependency 'beefcake', '>= 0.4.0' + + spec.add_development_dependency 'bundler', '~> 1.3' + spec.add_development_dependency 'rake' +end diff --git a/api/vendor/github.com/prometheus/client_model/setup.py b/api/vendor/github.com/prometheus/client_model/setup.py new file mode 100644 index 0000000..67b9f20 --- /dev/null +++ b/api/vendor/github.com/prometheus/client_model/setup.py @@ -0,0 +1,23 @@ +#!/usr/bin/python + +from setuptools import setup + +setup( + name = 'prometheus_client_model', + version = '0.0.1', + author = 'Matt T. Proud', + author_email = 'matt.proud@gmail.com', + description = 'Data model artifacts for the Prometheus client.', + license = 'Apache License 2.0', + url = 'http://github.com/prometheus/client_model', + packages = ['prometheus', 'prometheus/client', 'prometheus/client/model'], + package_dir = {'': 'python'}, + requires = ['protobuf(==2.4.1)'], + platforms = 'Platform Independent', + classifiers = ['Development Status :: 3 - Alpha', + 'Intended Audience :: Developers', + 'Intended Audience :: System Administrators', + 'License :: OSI Approved :: Apache Software License', + 'Operating System :: OS Independent', + 'Topic :: Software Development :: Testing', + 'Topic :: System :: Monitoring']) diff --git a/api/vendor/github.com/prometheus/client_model/src/main/java/io/prometheus/client/Metrics.java b/api/vendor/github.com/prometheus/client_model/src/main/java/io/prometheus/client/Metrics.java new file mode 100644 index 0000000..fb6218e --- /dev/null +++ b/api/vendor/github.com/prometheus/client_model/src/main/java/io/prometheus/client/Metrics.java @@ -0,0 +1,7683 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: metrics.proto + +package io.prometheus.client; + +public final class Metrics { + private Metrics() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + } + /** + * Protobuf enum {@code io.prometheus.client.MetricType} + */ + public enum MetricType + implements com.google.protobuf.ProtocolMessageEnum { + /** + * COUNTER = 0; + */ + COUNTER(0, 0), + /** + * GAUGE = 1; + */ + GAUGE(1, 1), + /** + * SUMMARY = 2; + */ + SUMMARY(2, 2), + /** + * UNTYPED = 3; + */ + UNTYPED(3, 3), + /** + * HISTOGRAM = 4; + */ + HISTOGRAM(4, 4), + ; + + /** + * COUNTER = 0; + */ + public static final int COUNTER_VALUE = 0; + /** + * GAUGE = 1; + */ + public static final int GAUGE_VALUE = 1; + /** + * SUMMARY = 2; + */ + public static final int SUMMARY_VALUE = 2; + /** + * UNTYPED = 3; + */ + public static final int UNTYPED_VALUE = 3; + /** + * HISTOGRAM = 4; + */ + public static final int HISTOGRAM_VALUE = 4; + + + public final int getNumber() { return value; } + + public static MetricType valueOf(int value) { + switch (value) { + case 0: return COUNTER; + case 1: return GAUGE; + case 2: return SUMMARY; + case 3: return UNTYPED; + case 4: return HISTOGRAM; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static com.google.protobuf.Internal.EnumLiteMap + internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public MetricType findValueByNumber(int number) { + return MetricType.valueOf(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(index); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return io.prometheus.client.Metrics.getDescriptor().getEnumTypes().get(0); + } + + private static final MetricType[] VALUES = values(); + + public static MetricType valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int index; + private final int value; + + private MetricType(int index, int value) { + this.index = index; + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:io.prometheus.client.MetricType) + } + + public interface LabelPairOrBuilder extends + // @@protoc_insertion_point(interface_extends:io.prometheus.client.LabelPair) + com.google.protobuf.MessageOrBuilder { + + /** + * optional string name = 1; + */ + boolean hasName(); + /** + * optional string name = 1; + */ + java.lang.String getName(); + /** + * optional string name = 1; + */ + com.google.protobuf.ByteString + getNameBytes(); + + /** + * optional string value = 2; + */ + boolean hasValue(); + /** + * optional string value = 2; + */ + java.lang.String getValue(); + /** + * optional string value = 2; + */ + com.google.protobuf.ByteString + getValueBytes(); + } + /** + * Protobuf type {@code io.prometheus.client.LabelPair} + */ + public static final class LabelPair extends + com.google.protobuf.GeneratedMessage implements + // @@protoc_insertion_point(message_implements:io.prometheus.client.LabelPair) + LabelPairOrBuilder { + // Use LabelPair.newBuilder() to construct. + private LabelPair(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private LabelPair(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final LabelPair defaultInstance; + public static LabelPair getDefaultInstance() { + return defaultInstance; + } + + public LabelPair getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private LabelPair( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000001; + name_ = bs; + break; + } + case 18: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000002; + value_ = bs; + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_LabelPair_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_LabelPair_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.LabelPair.class, io.prometheus.client.Metrics.LabelPair.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public LabelPair parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new LabelPair(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + public static final int NAME_FIELD_NUMBER = 1; + private java.lang.Object name_; + /** + * optional string name = 1; + */ + public boolean hasName() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string name = 1; + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + name_ = s; + } + return s; + } + } + /** + * optional string name = 1; + */ + public com.google.protobuf.ByteString + getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int VALUE_FIELD_NUMBER = 2; + private java.lang.Object value_; + /** + * optional string value = 2; + */ + public boolean hasValue() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string value = 2; + */ + public java.lang.String getValue() { + java.lang.Object ref = value_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + value_ = s; + } + return s; + } + } + /** + * optional string value = 2; + */ + public com.google.protobuf.ByteString + getValueBytes() { + java.lang.Object ref = value_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + value_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private void initFields() { + name_ = ""; + value_ = ""; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, getNameBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, getValueBytes()); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, getNameBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, getValueBytes()); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static io.prometheus.client.Metrics.LabelPair parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.LabelPair parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.LabelPair parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.LabelPair parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.LabelPair parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.LabelPair parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.LabelPair parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static io.prometheus.client.Metrics.LabelPair parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.LabelPair parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.LabelPair parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(io.prometheus.client.Metrics.LabelPair prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code io.prometheus.client.LabelPair} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder implements + // @@protoc_insertion_point(builder_implements:io.prometheus.client.LabelPair) + io.prometheus.client.Metrics.LabelPairOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_LabelPair_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_LabelPair_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.LabelPair.class, io.prometheus.client.Metrics.LabelPair.Builder.class); + } + + // Construct using io.prometheus.client.Metrics.LabelPair.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + name_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + value_ = ""; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_LabelPair_descriptor; + } + + public io.prometheus.client.Metrics.LabelPair getDefaultInstanceForType() { + return io.prometheus.client.Metrics.LabelPair.getDefaultInstance(); + } + + public io.prometheus.client.Metrics.LabelPair build() { + io.prometheus.client.Metrics.LabelPair result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public io.prometheus.client.Metrics.LabelPair buildPartial() { + io.prometheus.client.Metrics.LabelPair result = new io.prometheus.client.Metrics.LabelPair(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.name_ = name_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.value_ = value_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof io.prometheus.client.Metrics.LabelPair) { + return mergeFrom((io.prometheus.client.Metrics.LabelPair)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(io.prometheus.client.Metrics.LabelPair other) { + if (other == io.prometheus.client.Metrics.LabelPair.getDefaultInstance()) return this; + if (other.hasName()) { + bitField0_ |= 0x00000001; + name_ = other.name_; + onChanged(); + } + if (other.hasValue()) { + bitField0_ |= 0x00000002; + value_ = other.value_; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + io.prometheus.client.Metrics.LabelPair parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (io.prometheus.client.Metrics.LabelPair) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private java.lang.Object name_ = ""; + /** + * optional string name = 1; + */ + public boolean hasName() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string name = 1; + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + name_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * optional string name = 1; + */ + public com.google.protobuf.ByteString + getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string name = 1; + */ + public Builder setName( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + name_ = value; + onChanged(); + return this; + } + /** + * optional string name = 1; + */ + public Builder clearName() { + bitField0_ = (bitField0_ & ~0x00000001); + name_ = getDefaultInstance().getName(); + onChanged(); + return this; + } + /** + * optional string name = 1; + */ + public Builder setNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + name_ = value; + onChanged(); + return this; + } + + private java.lang.Object value_ = ""; + /** + * optional string value = 2; + */ + public boolean hasValue() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string value = 2; + */ + public java.lang.String getValue() { + java.lang.Object ref = value_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + value_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * optional string value = 2; + */ + public com.google.protobuf.ByteString + getValueBytes() { + java.lang.Object ref = value_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + value_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string value = 2; + */ + public Builder setValue( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + value_ = value; + onChanged(); + return this; + } + /** + * optional string value = 2; + */ + public Builder clearValue() { + bitField0_ = (bitField0_ & ~0x00000002); + value_ = getDefaultInstance().getValue(); + onChanged(); + return this; + } + /** + * optional string value = 2; + */ + public Builder setValueBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + value_ = value; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:io.prometheus.client.LabelPair) + } + + static { + defaultInstance = new LabelPair(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:io.prometheus.client.LabelPair) + } + + public interface GaugeOrBuilder extends + // @@protoc_insertion_point(interface_extends:io.prometheus.client.Gauge) + com.google.protobuf.MessageOrBuilder { + + /** + * optional double value = 1; + */ + boolean hasValue(); + /** + * optional double value = 1; + */ + double getValue(); + } + /** + * Protobuf type {@code io.prometheus.client.Gauge} + */ + public static final class Gauge extends + com.google.protobuf.GeneratedMessage implements + // @@protoc_insertion_point(message_implements:io.prometheus.client.Gauge) + GaugeOrBuilder { + // Use Gauge.newBuilder() to construct. + private Gauge(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Gauge(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Gauge defaultInstance; + public static Gauge getDefaultInstance() { + return defaultInstance; + } + + public Gauge getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Gauge( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 9: { + bitField0_ |= 0x00000001; + value_ = input.readDouble(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Gauge_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Gauge_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.Gauge.class, io.prometheus.client.Metrics.Gauge.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Gauge parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Gauge(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + public static final int VALUE_FIELD_NUMBER = 1; + private double value_; + /** + * optional double value = 1; + */ + public boolean hasValue() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional double value = 1; + */ + public double getValue() { + return value_; + } + + private void initFields() { + value_ = 0D; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeDouble(1, value_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeDoubleSize(1, value_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static io.prometheus.client.Metrics.Gauge parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.Gauge parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.Gauge parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.Gauge parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.Gauge parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.Gauge parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.Gauge parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static io.prometheus.client.Metrics.Gauge parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.Gauge parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.Gauge parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(io.prometheus.client.Metrics.Gauge prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code io.prometheus.client.Gauge} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder implements + // @@protoc_insertion_point(builder_implements:io.prometheus.client.Gauge) + io.prometheus.client.Metrics.GaugeOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Gauge_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Gauge_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.Gauge.class, io.prometheus.client.Metrics.Gauge.Builder.class); + } + + // Construct using io.prometheus.client.Metrics.Gauge.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + value_ = 0D; + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Gauge_descriptor; + } + + public io.prometheus.client.Metrics.Gauge getDefaultInstanceForType() { + return io.prometheus.client.Metrics.Gauge.getDefaultInstance(); + } + + public io.prometheus.client.Metrics.Gauge build() { + io.prometheus.client.Metrics.Gauge result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public io.prometheus.client.Metrics.Gauge buildPartial() { + io.prometheus.client.Metrics.Gauge result = new io.prometheus.client.Metrics.Gauge(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.value_ = value_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof io.prometheus.client.Metrics.Gauge) { + return mergeFrom((io.prometheus.client.Metrics.Gauge)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(io.prometheus.client.Metrics.Gauge other) { + if (other == io.prometheus.client.Metrics.Gauge.getDefaultInstance()) return this; + if (other.hasValue()) { + setValue(other.getValue()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + io.prometheus.client.Metrics.Gauge parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (io.prometheus.client.Metrics.Gauge) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private double value_ ; + /** + * optional double value = 1; + */ + public boolean hasValue() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional double value = 1; + */ + public double getValue() { + return value_; + } + /** + * optional double value = 1; + */ + public Builder setValue(double value) { + bitField0_ |= 0x00000001; + value_ = value; + onChanged(); + return this; + } + /** + * optional double value = 1; + */ + public Builder clearValue() { + bitField0_ = (bitField0_ & ~0x00000001); + value_ = 0D; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:io.prometheus.client.Gauge) + } + + static { + defaultInstance = new Gauge(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:io.prometheus.client.Gauge) + } + + public interface CounterOrBuilder extends + // @@protoc_insertion_point(interface_extends:io.prometheus.client.Counter) + com.google.protobuf.MessageOrBuilder { + + /** + * optional double value = 1; + */ + boolean hasValue(); + /** + * optional double value = 1; + */ + double getValue(); + } + /** + * Protobuf type {@code io.prometheus.client.Counter} + */ + public static final class Counter extends + com.google.protobuf.GeneratedMessage implements + // @@protoc_insertion_point(message_implements:io.prometheus.client.Counter) + CounterOrBuilder { + // Use Counter.newBuilder() to construct. + private Counter(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Counter(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Counter defaultInstance; + public static Counter getDefaultInstance() { + return defaultInstance; + } + + public Counter getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Counter( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 9: { + bitField0_ |= 0x00000001; + value_ = input.readDouble(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Counter_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Counter_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.Counter.class, io.prometheus.client.Metrics.Counter.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Counter parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Counter(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + public static final int VALUE_FIELD_NUMBER = 1; + private double value_; + /** + * optional double value = 1; + */ + public boolean hasValue() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional double value = 1; + */ + public double getValue() { + return value_; + } + + private void initFields() { + value_ = 0D; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeDouble(1, value_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeDoubleSize(1, value_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static io.prometheus.client.Metrics.Counter parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.Counter parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.Counter parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.Counter parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.Counter parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.Counter parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.Counter parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static io.prometheus.client.Metrics.Counter parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.Counter parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.Counter parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(io.prometheus.client.Metrics.Counter prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code io.prometheus.client.Counter} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder implements + // @@protoc_insertion_point(builder_implements:io.prometheus.client.Counter) + io.prometheus.client.Metrics.CounterOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Counter_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Counter_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.Counter.class, io.prometheus.client.Metrics.Counter.Builder.class); + } + + // Construct using io.prometheus.client.Metrics.Counter.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + value_ = 0D; + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Counter_descriptor; + } + + public io.prometheus.client.Metrics.Counter getDefaultInstanceForType() { + return io.prometheus.client.Metrics.Counter.getDefaultInstance(); + } + + public io.prometheus.client.Metrics.Counter build() { + io.prometheus.client.Metrics.Counter result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public io.prometheus.client.Metrics.Counter buildPartial() { + io.prometheus.client.Metrics.Counter result = new io.prometheus.client.Metrics.Counter(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.value_ = value_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof io.prometheus.client.Metrics.Counter) { + return mergeFrom((io.prometheus.client.Metrics.Counter)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(io.prometheus.client.Metrics.Counter other) { + if (other == io.prometheus.client.Metrics.Counter.getDefaultInstance()) return this; + if (other.hasValue()) { + setValue(other.getValue()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + io.prometheus.client.Metrics.Counter parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (io.prometheus.client.Metrics.Counter) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private double value_ ; + /** + * optional double value = 1; + */ + public boolean hasValue() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional double value = 1; + */ + public double getValue() { + return value_; + } + /** + * optional double value = 1; + */ + public Builder setValue(double value) { + bitField0_ |= 0x00000001; + value_ = value; + onChanged(); + return this; + } + /** + * optional double value = 1; + */ + public Builder clearValue() { + bitField0_ = (bitField0_ & ~0x00000001); + value_ = 0D; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:io.prometheus.client.Counter) + } + + static { + defaultInstance = new Counter(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:io.prometheus.client.Counter) + } + + public interface QuantileOrBuilder extends + // @@protoc_insertion_point(interface_extends:io.prometheus.client.Quantile) + com.google.protobuf.MessageOrBuilder { + + /** + * optional double quantile = 1; + */ + boolean hasQuantile(); + /** + * optional double quantile = 1; + */ + double getQuantile(); + + /** + * optional double value = 2; + */ + boolean hasValue(); + /** + * optional double value = 2; + */ + double getValue(); + } + /** + * Protobuf type {@code io.prometheus.client.Quantile} + */ + public static final class Quantile extends + com.google.protobuf.GeneratedMessage implements + // @@protoc_insertion_point(message_implements:io.prometheus.client.Quantile) + QuantileOrBuilder { + // Use Quantile.newBuilder() to construct. + private Quantile(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Quantile(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Quantile defaultInstance; + public static Quantile getDefaultInstance() { + return defaultInstance; + } + + public Quantile getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Quantile( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 9: { + bitField0_ |= 0x00000001; + quantile_ = input.readDouble(); + break; + } + case 17: { + bitField0_ |= 0x00000002; + value_ = input.readDouble(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Quantile_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Quantile_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.Quantile.class, io.prometheus.client.Metrics.Quantile.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Quantile parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Quantile(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + public static final int QUANTILE_FIELD_NUMBER = 1; + private double quantile_; + /** + * optional double quantile = 1; + */ + public boolean hasQuantile() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional double quantile = 1; + */ + public double getQuantile() { + return quantile_; + } + + public static final int VALUE_FIELD_NUMBER = 2; + private double value_; + /** + * optional double value = 2; + */ + public boolean hasValue() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional double value = 2; + */ + public double getValue() { + return value_; + } + + private void initFields() { + quantile_ = 0D; + value_ = 0D; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeDouble(1, quantile_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeDouble(2, value_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeDoubleSize(1, quantile_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeDoubleSize(2, value_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static io.prometheus.client.Metrics.Quantile parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.Quantile parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.Quantile parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.Quantile parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.Quantile parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.Quantile parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.Quantile parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static io.prometheus.client.Metrics.Quantile parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.Quantile parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.Quantile parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(io.prometheus.client.Metrics.Quantile prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code io.prometheus.client.Quantile} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder implements + // @@protoc_insertion_point(builder_implements:io.prometheus.client.Quantile) + io.prometheus.client.Metrics.QuantileOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Quantile_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Quantile_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.Quantile.class, io.prometheus.client.Metrics.Quantile.Builder.class); + } + + // Construct using io.prometheus.client.Metrics.Quantile.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + quantile_ = 0D; + bitField0_ = (bitField0_ & ~0x00000001); + value_ = 0D; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Quantile_descriptor; + } + + public io.prometheus.client.Metrics.Quantile getDefaultInstanceForType() { + return io.prometheus.client.Metrics.Quantile.getDefaultInstance(); + } + + public io.prometheus.client.Metrics.Quantile build() { + io.prometheus.client.Metrics.Quantile result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public io.prometheus.client.Metrics.Quantile buildPartial() { + io.prometheus.client.Metrics.Quantile result = new io.prometheus.client.Metrics.Quantile(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.quantile_ = quantile_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.value_ = value_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof io.prometheus.client.Metrics.Quantile) { + return mergeFrom((io.prometheus.client.Metrics.Quantile)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(io.prometheus.client.Metrics.Quantile other) { + if (other == io.prometheus.client.Metrics.Quantile.getDefaultInstance()) return this; + if (other.hasQuantile()) { + setQuantile(other.getQuantile()); + } + if (other.hasValue()) { + setValue(other.getValue()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + io.prometheus.client.Metrics.Quantile parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (io.prometheus.client.Metrics.Quantile) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private double quantile_ ; + /** + * optional double quantile = 1; + */ + public boolean hasQuantile() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional double quantile = 1; + */ + public double getQuantile() { + return quantile_; + } + /** + * optional double quantile = 1; + */ + public Builder setQuantile(double value) { + bitField0_ |= 0x00000001; + quantile_ = value; + onChanged(); + return this; + } + /** + * optional double quantile = 1; + */ + public Builder clearQuantile() { + bitField0_ = (bitField0_ & ~0x00000001); + quantile_ = 0D; + onChanged(); + return this; + } + + private double value_ ; + /** + * optional double value = 2; + */ + public boolean hasValue() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional double value = 2; + */ + public double getValue() { + return value_; + } + /** + * optional double value = 2; + */ + public Builder setValue(double value) { + bitField0_ |= 0x00000002; + value_ = value; + onChanged(); + return this; + } + /** + * optional double value = 2; + */ + public Builder clearValue() { + bitField0_ = (bitField0_ & ~0x00000002); + value_ = 0D; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:io.prometheus.client.Quantile) + } + + static { + defaultInstance = new Quantile(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:io.prometheus.client.Quantile) + } + + public interface SummaryOrBuilder extends + // @@protoc_insertion_point(interface_extends:io.prometheus.client.Summary) + com.google.protobuf.MessageOrBuilder { + + /** + * optional uint64 sample_count = 1; + */ + boolean hasSampleCount(); + /** + * optional uint64 sample_count = 1; + */ + long getSampleCount(); + + /** + * optional double sample_sum = 2; + */ + boolean hasSampleSum(); + /** + * optional double sample_sum = 2; + */ + double getSampleSum(); + + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + java.util.List + getQuantileList(); + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + io.prometheus.client.Metrics.Quantile getQuantile(int index); + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + int getQuantileCount(); + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + java.util.List + getQuantileOrBuilderList(); + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + io.prometheus.client.Metrics.QuantileOrBuilder getQuantileOrBuilder( + int index); + } + /** + * Protobuf type {@code io.prometheus.client.Summary} + */ + public static final class Summary extends + com.google.protobuf.GeneratedMessage implements + // @@protoc_insertion_point(message_implements:io.prometheus.client.Summary) + SummaryOrBuilder { + // Use Summary.newBuilder() to construct. + private Summary(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Summary(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Summary defaultInstance; + public static Summary getDefaultInstance() { + return defaultInstance; + } + + public Summary getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Summary( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + bitField0_ |= 0x00000001; + sampleCount_ = input.readUInt64(); + break; + } + case 17: { + bitField0_ |= 0x00000002; + sampleSum_ = input.readDouble(); + break; + } + case 26: { + if (!((mutable_bitField0_ & 0x00000004) == 0x00000004)) { + quantile_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000004; + } + quantile_.add(input.readMessage(io.prometheus.client.Metrics.Quantile.PARSER, extensionRegistry)); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000004) == 0x00000004)) { + quantile_ = java.util.Collections.unmodifiableList(quantile_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Summary_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Summary_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.Summary.class, io.prometheus.client.Metrics.Summary.Builder.class); + } + + public static com.google.protobuf.Parser

    PARSER = + new com.google.protobuf.AbstractParser() { + public Summary parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Summary(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + public static final int SAMPLE_COUNT_FIELD_NUMBER = 1; + private long sampleCount_; + /** + * optional uint64 sample_count = 1; + */ + public boolean hasSampleCount() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint64 sample_count = 1; + */ + public long getSampleCount() { + return sampleCount_; + } + + public static final int SAMPLE_SUM_FIELD_NUMBER = 2; + private double sampleSum_; + /** + * optional double sample_sum = 2; + */ + public boolean hasSampleSum() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional double sample_sum = 2; + */ + public double getSampleSum() { + return sampleSum_; + } + + public static final int QUANTILE_FIELD_NUMBER = 3; + private java.util.List quantile_; + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public java.util.List getQuantileList() { + return quantile_; + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public java.util.List + getQuantileOrBuilderList() { + return quantile_; + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public int getQuantileCount() { + return quantile_.size(); + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public io.prometheus.client.Metrics.Quantile getQuantile(int index) { + return quantile_.get(index); + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public io.prometheus.client.Metrics.QuantileOrBuilder getQuantileOrBuilder( + int index) { + return quantile_.get(index); + } + + private void initFields() { + sampleCount_ = 0L; + sampleSum_ = 0D; + quantile_ = java.util.Collections.emptyList(); + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeUInt64(1, sampleCount_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeDouble(2, sampleSum_); + } + for (int i = 0; i < quantile_.size(); i++) { + output.writeMessage(3, quantile_.get(i)); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt64Size(1, sampleCount_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeDoubleSize(2, sampleSum_); + } + for (int i = 0; i < quantile_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, quantile_.get(i)); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static io.prometheus.client.Metrics.Summary parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.Summary parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.Summary parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.Summary parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.Summary parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.Summary parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.Summary parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static io.prometheus.client.Metrics.Summary parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.Summary parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.Summary parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(io.prometheus.client.Metrics.Summary prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code io.prometheus.client.Summary} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder implements + // @@protoc_insertion_point(builder_implements:io.prometheus.client.Summary) + io.prometheus.client.Metrics.SummaryOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Summary_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Summary_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.Summary.class, io.prometheus.client.Metrics.Summary.Builder.class); + } + + // Construct using io.prometheus.client.Metrics.Summary.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + getQuantileFieldBuilder(); + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + sampleCount_ = 0L; + bitField0_ = (bitField0_ & ~0x00000001); + sampleSum_ = 0D; + bitField0_ = (bitField0_ & ~0x00000002); + if (quantileBuilder_ == null) { + quantile_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000004); + } else { + quantileBuilder_.clear(); + } + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Summary_descriptor; + } + + public io.prometheus.client.Metrics.Summary getDefaultInstanceForType() { + return io.prometheus.client.Metrics.Summary.getDefaultInstance(); + } + + public io.prometheus.client.Metrics.Summary build() { + io.prometheus.client.Metrics.Summary result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public io.prometheus.client.Metrics.Summary buildPartial() { + io.prometheus.client.Metrics.Summary result = new io.prometheus.client.Metrics.Summary(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.sampleCount_ = sampleCount_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.sampleSum_ = sampleSum_; + if (quantileBuilder_ == null) { + if (((bitField0_ & 0x00000004) == 0x00000004)) { + quantile_ = java.util.Collections.unmodifiableList(quantile_); + bitField0_ = (bitField0_ & ~0x00000004); + } + result.quantile_ = quantile_; + } else { + result.quantile_ = quantileBuilder_.build(); + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof io.prometheus.client.Metrics.Summary) { + return mergeFrom((io.prometheus.client.Metrics.Summary)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(io.prometheus.client.Metrics.Summary other) { + if (other == io.prometheus.client.Metrics.Summary.getDefaultInstance()) return this; + if (other.hasSampleCount()) { + setSampleCount(other.getSampleCount()); + } + if (other.hasSampleSum()) { + setSampleSum(other.getSampleSum()); + } + if (quantileBuilder_ == null) { + if (!other.quantile_.isEmpty()) { + if (quantile_.isEmpty()) { + quantile_ = other.quantile_; + bitField0_ = (bitField0_ & ~0x00000004); + } else { + ensureQuantileIsMutable(); + quantile_.addAll(other.quantile_); + } + onChanged(); + } + } else { + if (!other.quantile_.isEmpty()) { + if (quantileBuilder_.isEmpty()) { + quantileBuilder_.dispose(); + quantileBuilder_ = null; + quantile_ = other.quantile_; + bitField0_ = (bitField0_ & ~0x00000004); + quantileBuilder_ = + com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ? + getQuantileFieldBuilder() : null; + } else { + quantileBuilder_.addAllMessages(other.quantile_); + } + } + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + io.prometheus.client.Metrics.Summary parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (io.prometheus.client.Metrics.Summary) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private long sampleCount_ ; + /** + * optional uint64 sample_count = 1; + */ + public boolean hasSampleCount() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint64 sample_count = 1; + */ + public long getSampleCount() { + return sampleCount_; + } + /** + * optional uint64 sample_count = 1; + */ + public Builder setSampleCount(long value) { + bitField0_ |= 0x00000001; + sampleCount_ = value; + onChanged(); + return this; + } + /** + * optional uint64 sample_count = 1; + */ + public Builder clearSampleCount() { + bitField0_ = (bitField0_ & ~0x00000001); + sampleCount_ = 0L; + onChanged(); + return this; + } + + private double sampleSum_ ; + /** + * optional double sample_sum = 2; + */ + public boolean hasSampleSum() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional double sample_sum = 2; + */ + public double getSampleSum() { + return sampleSum_; + } + /** + * optional double sample_sum = 2; + */ + public Builder setSampleSum(double value) { + bitField0_ |= 0x00000002; + sampleSum_ = value; + onChanged(); + return this; + } + /** + * optional double sample_sum = 2; + */ + public Builder clearSampleSum() { + bitField0_ = (bitField0_ & ~0x00000002); + sampleSum_ = 0D; + onChanged(); + return this; + } + + private java.util.List quantile_ = + java.util.Collections.emptyList(); + private void ensureQuantileIsMutable() { + if (!((bitField0_ & 0x00000004) == 0x00000004)) { + quantile_ = new java.util.ArrayList(quantile_); + bitField0_ |= 0x00000004; + } + } + + private com.google.protobuf.RepeatedFieldBuilder< + io.prometheus.client.Metrics.Quantile, io.prometheus.client.Metrics.Quantile.Builder, io.prometheus.client.Metrics.QuantileOrBuilder> quantileBuilder_; + + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public java.util.List getQuantileList() { + if (quantileBuilder_ == null) { + return java.util.Collections.unmodifiableList(quantile_); + } else { + return quantileBuilder_.getMessageList(); + } + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public int getQuantileCount() { + if (quantileBuilder_ == null) { + return quantile_.size(); + } else { + return quantileBuilder_.getCount(); + } + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public io.prometheus.client.Metrics.Quantile getQuantile(int index) { + if (quantileBuilder_ == null) { + return quantile_.get(index); + } else { + return quantileBuilder_.getMessage(index); + } + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public Builder setQuantile( + int index, io.prometheus.client.Metrics.Quantile value) { + if (quantileBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureQuantileIsMutable(); + quantile_.set(index, value); + onChanged(); + } else { + quantileBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public Builder setQuantile( + int index, io.prometheus.client.Metrics.Quantile.Builder builderForValue) { + if (quantileBuilder_ == null) { + ensureQuantileIsMutable(); + quantile_.set(index, builderForValue.build()); + onChanged(); + } else { + quantileBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public Builder addQuantile(io.prometheus.client.Metrics.Quantile value) { + if (quantileBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureQuantileIsMutable(); + quantile_.add(value); + onChanged(); + } else { + quantileBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public Builder addQuantile( + int index, io.prometheus.client.Metrics.Quantile value) { + if (quantileBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureQuantileIsMutable(); + quantile_.add(index, value); + onChanged(); + } else { + quantileBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public Builder addQuantile( + io.prometheus.client.Metrics.Quantile.Builder builderForValue) { + if (quantileBuilder_ == null) { + ensureQuantileIsMutable(); + quantile_.add(builderForValue.build()); + onChanged(); + } else { + quantileBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public Builder addQuantile( + int index, io.prometheus.client.Metrics.Quantile.Builder builderForValue) { + if (quantileBuilder_ == null) { + ensureQuantileIsMutable(); + quantile_.add(index, builderForValue.build()); + onChanged(); + } else { + quantileBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public Builder addAllQuantile( + java.lang.Iterable values) { + if (quantileBuilder_ == null) { + ensureQuantileIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, quantile_); + onChanged(); + } else { + quantileBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public Builder clearQuantile() { + if (quantileBuilder_ == null) { + quantile_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000004); + onChanged(); + } else { + quantileBuilder_.clear(); + } + return this; + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public Builder removeQuantile(int index) { + if (quantileBuilder_ == null) { + ensureQuantileIsMutable(); + quantile_.remove(index); + onChanged(); + } else { + quantileBuilder_.remove(index); + } + return this; + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public io.prometheus.client.Metrics.Quantile.Builder getQuantileBuilder( + int index) { + return getQuantileFieldBuilder().getBuilder(index); + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public io.prometheus.client.Metrics.QuantileOrBuilder getQuantileOrBuilder( + int index) { + if (quantileBuilder_ == null) { + return quantile_.get(index); } else { + return quantileBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public java.util.List + getQuantileOrBuilderList() { + if (quantileBuilder_ != null) { + return quantileBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(quantile_); + } + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public io.prometheus.client.Metrics.Quantile.Builder addQuantileBuilder() { + return getQuantileFieldBuilder().addBuilder( + io.prometheus.client.Metrics.Quantile.getDefaultInstance()); + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public io.prometheus.client.Metrics.Quantile.Builder addQuantileBuilder( + int index) { + return getQuantileFieldBuilder().addBuilder( + index, io.prometheus.client.Metrics.Quantile.getDefaultInstance()); + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public java.util.List + getQuantileBuilderList() { + return getQuantileFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilder< + io.prometheus.client.Metrics.Quantile, io.prometheus.client.Metrics.Quantile.Builder, io.prometheus.client.Metrics.QuantileOrBuilder> + getQuantileFieldBuilder() { + if (quantileBuilder_ == null) { + quantileBuilder_ = new com.google.protobuf.RepeatedFieldBuilder< + io.prometheus.client.Metrics.Quantile, io.prometheus.client.Metrics.Quantile.Builder, io.prometheus.client.Metrics.QuantileOrBuilder>( + quantile_, + ((bitField0_ & 0x00000004) == 0x00000004), + getParentForChildren(), + isClean()); + quantile_ = null; + } + return quantileBuilder_; + } + + // @@protoc_insertion_point(builder_scope:io.prometheus.client.Summary) + } + + static { + defaultInstance = new Summary(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:io.prometheus.client.Summary) + } + + public interface UntypedOrBuilder extends + // @@protoc_insertion_point(interface_extends:io.prometheus.client.Untyped) + com.google.protobuf.MessageOrBuilder { + + /** + * optional double value = 1; + */ + boolean hasValue(); + /** + * optional double value = 1; + */ + double getValue(); + } + /** + * Protobuf type {@code io.prometheus.client.Untyped} + */ + public static final class Untyped extends + com.google.protobuf.GeneratedMessage implements + // @@protoc_insertion_point(message_implements:io.prometheus.client.Untyped) + UntypedOrBuilder { + // Use Untyped.newBuilder() to construct. + private Untyped(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Untyped(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Untyped defaultInstance; + public static Untyped getDefaultInstance() { + return defaultInstance; + } + + public Untyped getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Untyped( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 9: { + bitField0_ |= 0x00000001; + value_ = input.readDouble(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Untyped_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Untyped_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.Untyped.class, io.prometheus.client.Metrics.Untyped.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Untyped parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Untyped(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + public static final int VALUE_FIELD_NUMBER = 1; + private double value_; + /** + * optional double value = 1; + */ + public boolean hasValue() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional double value = 1; + */ + public double getValue() { + return value_; + } + + private void initFields() { + value_ = 0D; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeDouble(1, value_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeDoubleSize(1, value_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static io.prometheus.client.Metrics.Untyped parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.Untyped parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.Untyped parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.Untyped parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.Untyped parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.Untyped parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.Untyped parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static io.prometheus.client.Metrics.Untyped parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.Untyped parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.Untyped parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(io.prometheus.client.Metrics.Untyped prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code io.prometheus.client.Untyped} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder implements + // @@protoc_insertion_point(builder_implements:io.prometheus.client.Untyped) + io.prometheus.client.Metrics.UntypedOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Untyped_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Untyped_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.Untyped.class, io.prometheus.client.Metrics.Untyped.Builder.class); + } + + // Construct using io.prometheus.client.Metrics.Untyped.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + value_ = 0D; + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Untyped_descriptor; + } + + public io.prometheus.client.Metrics.Untyped getDefaultInstanceForType() { + return io.prometheus.client.Metrics.Untyped.getDefaultInstance(); + } + + public io.prometheus.client.Metrics.Untyped build() { + io.prometheus.client.Metrics.Untyped result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public io.prometheus.client.Metrics.Untyped buildPartial() { + io.prometheus.client.Metrics.Untyped result = new io.prometheus.client.Metrics.Untyped(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.value_ = value_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof io.prometheus.client.Metrics.Untyped) { + return mergeFrom((io.prometheus.client.Metrics.Untyped)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(io.prometheus.client.Metrics.Untyped other) { + if (other == io.prometheus.client.Metrics.Untyped.getDefaultInstance()) return this; + if (other.hasValue()) { + setValue(other.getValue()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + io.prometheus.client.Metrics.Untyped parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (io.prometheus.client.Metrics.Untyped) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private double value_ ; + /** + * optional double value = 1; + */ + public boolean hasValue() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional double value = 1; + */ + public double getValue() { + return value_; + } + /** + * optional double value = 1; + */ + public Builder setValue(double value) { + bitField0_ |= 0x00000001; + value_ = value; + onChanged(); + return this; + } + /** + * optional double value = 1; + */ + public Builder clearValue() { + bitField0_ = (bitField0_ & ~0x00000001); + value_ = 0D; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:io.prometheus.client.Untyped) + } + + static { + defaultInstance = new Untyped(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:io.prometheus.client.Untyped) + } + + public interface HistogramOrBuilder extends + // @@protoc_insertion_point(interface_extends:io.prometheus.client.Histogram) + com.google.protobuf.MessageOrBuilder { + + /** + * optional uint64 sample_count = 1; + */ + boolean hasSampleCount(); + /** + * optional uint64 sample_count = 1; + */ + long getSampleCount(); + + /** + * optional double sample_sum = 2; + */ + boolean hasSampleSum(); + /** + * optional double sample_sum = 2; + */ + double getSampleSum(); + + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +     * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +     * 
    + */ + java.util.List + getBucketList(); + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +     * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +     * 
    + */ + io.prometheus.client.Metrics.Bucket getBucket(int index); + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +     * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +     * 
    + */ + int getBucketCount(); + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +     * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +     * 
    + */ + java.util.List + getBucketOrBuilderList(); + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +     * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +     * 
    + */ + io.prometheus.client.Metrics.BucketOrBuilder getBucketOrBuilder( + int index); + } + /** + * Protobuf type {@code io.prometheus.client.Histogram} + */ + public static final class Histogram extends + com.google.protobuf.GeneratedMessage implements + // @@protoc_insertion_point(message_implements:io.prometheus.client.Histogram) + HistogramOrBuilder { + // Use Histogram.newBuilder() to construct. + private Histogram(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Histogram(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Histogram defaultInstance; + public static Histogram getDefaultInstance() { + return defaultInstance; + } + + public Histogram getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Histogram( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + bitField0_ |= 0x00000001; + sampleCount_ = input.readUInt64(); + break; + } + case 17: { + bitField0_ |= 0x00000002; + sampleSum_ = input.readDouble(); + break; + } + case 26: { + if (!((mutable_bitField0_ & 0x00000004) == 0x00000004)) { + bucket_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000004; + } + bucket_.add(input.readMessage(io.prometheus.client.Metrics.Bucket.PARSER, extensionRegistry)); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000004) == 0x00000004)) { + bucket_ = java.util.Collections.unmodifiableList(bucket_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Histogram_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Histogram_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.Histogram.class, io.prometheus.client.Metrics.Histogram.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Histogram parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Histogram(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + public static final int SAMPLE_COUNT_FIELD_NUMBER = 1; + private long sampleCount_; + /** + * optional uint64 sample_count = 1; + */ + public boolean hasSampleCount() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint64 sample_count = 1; + */ + public long getSampleCount() { + return sampleCount_; + } + + public static final int SAMPLE_SUM_FIELD_NUMBER = 2; + private double sampleSum_; + /** + * optional double sample_sum = 2; + */ + public boolean hasSampleSum() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional double sample_sum = 2; + */ + public double getSampleSum() { + return sampleSum_; + } + + public static final int BUCKET_FIELD_NUMBER = 3; + private java.util.List bucket_; + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +     * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +     * 
    + */ + public java.util.List getBucketList() { + return bucket_; + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +     * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +     * 
    + */ + public java.util.List + getBucketOrBuilderList() { + return bucket_; + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +     * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +     * 
    + */ + public int getBucketCount() { + return bucket_.size(); + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +     * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +     * 
    + */ + public io.prometheus.client.Metrics.Bucket getBucket(int index) { + return bucket_.get(index); + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +     * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +     * 
    + */ + public io.prometheus.client.Metrics.BucketOrBuilder getBucketOrBuilder( + int index) { + return bucket_.get(index); + } + + private void initFields() { + sampleCount_ = 0L; + sampleSum_ = 0D; + bucket_ = java.util.Collections.emptyList(); + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeUInt64(1, sampleCount_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeDouble(2, sampleSum_); + } + for (int i = 0; i < bucket_.size(); i++) { + output.writeMessage(3, bucket_.get(i)); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt64Size(1, sampleCount_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeDoubleSize(2, sampleSum_); + } + for (int i = 0; i < bucket_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, bucket_.get(i)); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static io.prometheus.client.Metrics.Histogram parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.Histogram parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.Histogram parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.Histogram parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.Histogram parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.Histogram parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.Histogram parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static io.prometheus.client.Metrics.Histogram parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.Histogram parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.Histogram parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(io.prometheus.client.Metrics.Histogram prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code io.prometheus.client.Histogram} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder implements + // @@protoc_insertion_point(builder_implements:io.prometheus.client.Histogram) + io.prometheus.client.Metrics.HistogramOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Histogram_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Histogram_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.Histogram.class, io.prometheus.client.Metrics.Histogram.Builder.class); + } + + // Construct using io.prometheus.client.Metrics.Histogram.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + getBucketFieldBuilder(); + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + sampleCount_ = 0L; + bitField0_ = (bitField0_ & ~0x00000001); + sampleSum_ = 0D; + bitField0_ = (bitField0_ & ~0x00000002); + if (bucketBuilder_ == null) { + bucket_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000004); + } else { + bucketBuilder_.clear(); + } + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Histogram_descriptor; + } + + public io.prometheus.client.Metrics.Histogram getDefaultInstanceForType() { + return io.prometheus.client.Metrics.Histogram.getDefaultInstance(); + } + + public io.prometheus.client.Metrics.Histogram build() { + io.prometheus.client.Metrics.Histogram result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public io.prometheus.client.Metrics.Histogram buildPartial() { + io.prometheus.client.Metrics.Histogram result = new io.prometheus.client.Metrics.Histogram(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.sampleCount_ = sampleCount_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.sampleSum_ = sampleSum_; + if (bucketBuilder_ == null) { + if (((bitField0_ & 0x00000004) == 0x00000004)) { + bucket_ = java.util.Collections.unmodifiableList(bucket_); + bitField0_ = (bitField0_ & ~0x00000004); + } + result.bucket_ = bucket_; + } else { + result.bucket_ = bucketBuilder_.build(); + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof io.prometheus.client.Metrics.Histogram) { + return mergeFrom((io.prometheus.client.Metrics.Histogram)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(io.prometheus.client.Metrics.Histogram other) { + if (other == io.prometheus.client.Metrics.Histogram.getDefaultInstance()) return this; + if (other.hasSampleCount()) { + setSampleCount(other.getSampleCount()); + } + if (other.hasSampleSum()) { + setSampleSum(other.getSampleSum()); + } + if (bucketBuilder_ == null) { + if (!other.bucket_.isEmpty()) { + if (bucket_.isEmpty()) { + bucket_ = other.bucket_; + bitField0_ = (bitField0_ & ~0x00000004); + } else { + ensureBucketIsMutable(); + bucket_.addAll(other.bucket_); + } + onChanged(); + } + } else { + if (!other.bucket_.isEmpty()) { + if (bucketBuilder_.isEmpty()) { + bucketBuilder_.dispose(); + bucketBuilder_ = null; + bucket_ = other.bucket_; + bitField0_ = (bitField0_ & ~0x00000004); + bucketBuilder_ = + com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ? + getBucketFieldBuilder() : null; + } else { + bucketBuilder_.addAllMessages(other.bucket_); + } + } + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + io.prometheus.client.Metrics.Histogram parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (io.prometheus.client.Metrics.Histogram) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private long sampleCount_ ; + /** + * optional uint64 sample_count = 1; + */ + public boolean hasSampleCount() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint64 sample_count = 1; + */ + public long getSampleCount() { + return sampleCount_; + } + /** + * optional uint64 sample_count = 1; + */ + public Builder setSampleCount(long value) { + bitField0_ |= 0x00000001; + sampleCount_ = value; + onChanged(); + return this; + } + /** + * optional uint64 sample_count = 1; + */ + public Builder clearSampleCount() { + bitField0_ = (bitField0_ & ~0x00000001); + sampleCount_ = 0L; + onChanged(); + return this; + } + + private double sampleSum_ ; + /** + * optional double sample_sum = 2; + */ + public boolean hasSampleSum() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional double sample_sum = 2; + */ + public double getSampleSum() { + return sampleSum_; + } + /** + * optional double sample_sum = 2; + */ + public Builder setSampleSum(double value) { + bitField0_ |= 0x00000002; + sampleSum_ = value; + onChanged(); + return this; + } + /** + * optional double sample_sum = 2; + */ + public Builder clearSampleSum() { + bitField0_ = (bitField0_ & ~0x00000002); + sampleSum_ = 0D; + onChanged(); + return this; + } + + private java.util.List bucket_ = + java.util.Collections.emptyList(); + private void ensureBucketIsMutable() { + if (!((bitField0_ & 0x00000004) == 0x00000004)) { + bucket_ = new java.util.ArrayList(bucket_); + bitField0_ |= 0x00000004; + } + } + + private com.google.protobuf.RepeatedFieldBuilder< + io.prometheus.client.Metrics.Bucket, io.prometheus.client.Metrics.Bucket.Builder, io.prometheus.client.Metrics.BucketOrBuilder> bucketBuilder_; + + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +       * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +       * 
    + */ + public java.util.List getBucketList() { + if (bucketBuilder_ == null) { + return java.util.Collections.unmodifiableList(bucket_); + } else { + return bucketBuilder_.getMessageList(); + } + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +       * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +       * 
    + */ + public int getBucketCount() { + if (bucketBuilder_ == null) { + return bucket_.size(); + } else { + return bucketBuilder_.getCount(); + } + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +       * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +       * 
    + */ + public io.prometheus.client.Metrics.Bucket getBucket(int index) { + if (bucketBuilder_ == null) { + return bucket_.get(index); + } else { + return bucketBuilder_.getMessage(index); + } + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +       * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +       * 
    + */ + public Builder setBucket( + int index, io.prometheus.client.Metrics.Bucket value) { + if (bucketBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureBucketIsMutable(); + bucket_.set(index, value); + onChanged(); + } else { + bucketBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +       * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +       * 
    + */ + public Builder setBucket( + int index, io.prometheus.client.Metrics.Bucket.Builder builderForValue) { + if (bucketBuilder_ == null) { + ensureBucketIsMutable(); + bucket_.set(index, builderForValue.build()); + onChanged(); + } else { + bucketBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +       * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +       * 
    + */ + public Builder addBucket(io.prometheus.client.Metrics.Bucket value) { + if (bucketBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureBucketIsMutable(); + bucket_.add(value); + onChanged(); + } else { + bucketBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +       * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +       * 
    + */ + public Builder addBucket( + int index, io.prometheus.client.Metrics.Bucket value) { + if (bucketBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureBucketIsMutable(); + bucket_.add(index, value); + onChanged(); + } else { + bucketBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +       * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +       * 
    + */ + public Builder addBucket( + io.prometheus.client.Metrics.Bucket.Builder builderForValue) { + if (bucketBuilder_ == null) { + ensureBucketIsMutable(); + bucket_.add(builderForValue.build()); + onChanged(); + } else { + bucketBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +       * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +       * 
    + */ + public Builder addBucket( + int index, io.prometheus.client.Metrics.Bucket.Builder builderForValue) { + if (bucketBuilder_ == null) { + ensureBucketIsMutable(); + bucket_.add(index, builderForValue.build()); + onChanged(); + } else { + bucketBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +       * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +       * 
    + */ + public Builder addAllBucket( + java.lang.Iterable values) { + if (bucketBuilder_ == null) { + ensureBucketIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, bucket_); + onChanged(); + } else { + bucketBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +       * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +       * 
    + */ + public Builder clearBucket() { + if (bucketBuilder_ == null) { + bucket_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000004); + onChanged(); + } else { + bucketBuilder_.clear(); + } + return this; + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +       * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +       * 
    + */ + public Builder removeBucket(int index) { + if (bucketBuilder_ == null) { + ensureBucketIsMutable(); + bucket_.remove(index); + onChanged(); + } else { + bucketBuilder_.remove(index); + } + return this; + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +       * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +       * 
    + */ + public io.prometheus.client.Metrics.Bucket.Builder getBucketBuilder( + int index) { + return getBucketFieldBuilder().getBuilder(index); + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +       * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +       * 
    + */ + public io.prometheus.client.Metrics.BucketOrBuilder getBucketOrBuilder( + int index) { + if (bucketBuilder_ == null) { + return bucket_.get(index); } else { + return bucketBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +       * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +       * 
    + */ + public java.util.List + getBucketOrBuilderList() { + if (bucketBuilder_ != null) { + return bucketBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(bucket_); + } + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +       * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +       * 
    + */ + public io.prometheus.client.Metrics.Bucket.Builder addBucketBuilder() { + return getBucketFieldBuilder().addBuilder( + io.prometheus.client.Metrics.Bucket.getDefaultInstance()); + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +       * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +       * 
    + */ + public io.prometheus.client.Metrics.Bucket.Builder addBucketBuilder( + int index) { + return getBucketFieldBuilder().addBuilder( + index, io.prometheus.client.Metrics.Bucket.getDefaultInstance()); + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +       * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +       * 
    + */ + public java.util.List + getBucketBuilderList() { + return getBucketFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilder< + io.prometheus.client.Metrics.Bucket, io.prometheus.client.Metrics.Bucket.Builder, io.prometheus.client.Metrics.BucketOrBuilder> + getBucketFieldBuilder() { + if (bucketBuilder_ == null) { + bucketBuilder_ = new com.google.protobuf.RepeatedFieldBuilder< + io.prometheus.client.Metrics.Bucket, io.prometheus.client.Metrics.Bucket.Builder, io.prometheus.client.Metrics.BucketOrBuilder>( + bucket_, + ((bitField0_ & 0x00000004) == 0x00000004), + getParentForChildren(), + isClean()); + bucket_ = null; + } + return bucketBuilder_; + } + + // @@protoc_insertion_point(builder_scope:io.prometheus.client.Histogram) + } + + static { + defaultInstance = new Histogram(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:io.prometheus.client.Histogram) + } + + public interface BucketOrBuilder extends + // @@protoc_insertion_point(interface_extends:io.prometheus.client.Bucket) + com.google.protobuf.MessageOrBuilder { + + /** + * optional uint64 cumulative_count = 1; + * + *
    +     * Cumulative in increasing order.
    +     * 
    + */ + boolean hasCumulativeCount(); + /** + * optional uint64 cumulative_count = 1; + * + *
    +     * Cumulative in increasing order.
    +     * 
    + */ + long getCumulativeCount(); + + /** + * optional double upper_bound = 2; + * + *
    +     * Inclusive.
    +     * 
    + */ + boolean hasUpperBound(); + /** + * optional double upper_bound = 2; + * + *
    +     * Inclusive.
    +     * 
    + */ + double getUpperBound(); + } + /** + * Protobuf type {@code io.prometheus.client.Bucket} + */ + public static final class Bucket extends + com.google.protobuf.GeneratedMessage implements + // @@protoc_insertion_point(message_implements:io.prometheus.client.Bucket) + BucketOrBuilder { + // Use Bucket.newBuilder() to construct. + private Bucket(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Bucket(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Bucket defaultInstance; + public static Bucket getDefaultInstance() { + return defaultInstance; + } + + public Bucket getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Bucket( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + bitField0_ |= 0x00000001; + cumulativeCount_ = input.readUInt64(); + break; + } + case 17: { + bitField0_ |= 0x00000002; + upperBound_ = input.readDouble(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Bucket_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Bucket_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.Bucket.class, io.prometheus.client.Metrics.Bucket.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Bucket parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Bucket(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + public static final int CUMULATIVE_COUNT_FIELD_NUMBER = 1; + private long cumulativeCount_; + /** + * optional uint64 cumulative_count = 1; + * + *
    +     * Cumulative in increasing order.
    +     * 
    + */ + public boolean hasCumulativeCount() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint64 cumulative_count = 1; + * + *
    +     * Cumulative in increasing order.
    +     * 
    + */ + public long getCumulativeCount() { + return cumulativeCount_; + } + + public static final int UPPER_BOUND_FIELD_NUMBER = 2; + private double upperBound_; + /** + * optional double upper_bound = 2; + * + *
    +     * Inclusive.
    +     * 
    + */ + public boolean hasUpperBound() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional double upper_bound = 2; + * + *
    +     * Inclusive.
    +     * 
    + */ + public double getUpperBound() { + return upperBound_; + } + + private void initFields() { + cumulativeCount_ = 0L; + upperBound_ = 0D; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeUInt64(1, cumulativeCount_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeDouble(2, upperBound_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt64Size(1, cumulativeCount_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeDoubleSize(2, upperBound_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static io.prometheus.client.Metrics.Bucket parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.Bucket parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.Bucket parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.Bucket parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.Bucket parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.Bucket parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.Bucket parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static io.prometheus.client.Metrics.Bucket parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.Bucket parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.Bucket parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(io.prometheus.client.Metrics.Bucket prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code io.prometheus.client.Bucket} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder implements + // @@protoc_insertion_point(builder_implements:io.prometheus.client.Bucket) + io.prometheus.client.Metrics.BucketOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Bucket_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Bucket_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.Bucket.class, io.prometheus.client.Metrics.Bucket.Builder.class); + } + + // Construct using io.prometheus.client.Metrics.Bucket.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + cumulativeCount_ = 0L; + bitField0_ = (bitField0_ & ~0x00000001); + upperBound_ = 0D; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Bucket_descriptor; + } + + public io.prometheus.client.Metrics.Bucket getDefaultInstanceForType() { + return io.prometheus.client.Metrics.Bucket.getDefaultInstance(); + } + + public io.prometheus.client.Metrics.Bucket build() { + io.prometheus.client.Metrics.Bucket result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public io.prometheus.client.Metrics.Bucket buildPartial() { + io.prometheus.client.Metrics.Bucket result = new io.prometheus.client.Metrics.Bucket(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.cumulativeCount_ = cumulativeCount_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.upperBound_ = upperBound_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof io.prometheus.client.Metrics.Bucket) { + return mergeFrom((io.prometheus.client.Metrics.Bucket)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(io.prometheus.client.Metrics.Bucket other) { + if (other == io.prometheus.client.Metrics.Bucket.getDefaultInstance()) return this; + if (other.hasCumulativeCount()) { + setCumulativeCount(other.getCumulativeCount()); + } + if (other.hasUpperBound()) { + setUpperBound(other.getUpperBound()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + io.prometheus.client.Metrics.Bucket parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (io.prometheus.client.Metrics.Bucket) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private long cumulativeCount_ ; + /** + * optional uint64 cumulative_count = 1; + * + *
    +       * Cumulative in increasing order.
    +       * 
    + */ + public boolean hasCumulativeCount() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint64 cumulative_count = 1; + * + *
    +       * Cumulative in increasing order.
    +       * 
    + */ + public long getCumulativeCount() { + return cumulativeCount_; + } + /** + * optional uint64 cumulative_count = 1; + * + *
    +       * Cumulative in increasing order.
    +       * 
    + */ + public Builder setCumulativeCount(long value) { + bitField0_ |= 0x00000001; + cumulativeCount_ = value; + onChanged(); + return this; + } + /** + * optional uint64 cumulative_count = 1; + * + *
    +       * Cumulative in increasing order.
    +       * 
    + */ + public Builder clearCumulativeCount() { + bitField0_ = (bitField0_ & ~0x00000001); + cumulativeCount_ = 0L; + onChanged(); + return this; + } + + private double upperBound_ ; + /** + * optional double upper_bound = 2; + * + *
    +       * Inclusive.
    +       * 
    + */ + public boolean hasUpperBound() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional double upper_bound = 2; + * + *
    +       * Inclusive.
    +       * 
    + */ + public double getUpperBound() { + return upperBound_; + } + /** + * optional double upper_bound = 2; + * + *
    +       * Inclusive.
    +       * 
    + */ + public Builder setUpperBound(double value) { + bitField0_ |= 0x00000002; + upperBound_ = value; + onChanged(); + return this; + } + /** + * optional double upper_bound = 2; + * + *
    +       * Inclusive.
    +       * 
    + */ + public Builder clearUpperBound() { + bitField0_ = (bitField0_ & ~0x00000002); + upperBound_ = 0D; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:io.prometheus.client.Bucket) + } + + static { + defaultInstance = new Bucket(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:io.prometheus.client.Bucket) + } + + public interface MetricOrBuilder extends + // @@protoc_insertion_point(interface_extends:io.prometheus.client.Metric) + com.google.protobuf.MessageOrBuilder { + + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + java.util.List + getLabelList(); + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + io.prometheus.client.Metrics.LabelPair getLabel(int index); + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + int getLabelCount(); + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + java.util.List + getLabelOrBuilderList(); + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + io.prometheus.client.Metrics.LabelPairOrBuilder getLabelOrBuilder( + int index); + + /** + * optional .io.prometheus.client.Gauge gauge = 2; + */ + boolean hasGauge(); + /** + * optional .io.prometheus.client.Gauge gauge = 2; + */ + io.prometheus.client.Metrics.Gauge getGauge(); + /** + * optional .io.prometheus.client.Gauge gauge = 2; + */ + io.prometheus.client.Metrics.GaugeOrBuilder getGaugeOrBuilder(); + + /** + * optional .io.prometheus.client.Counter counter = 3; + */ + boolean hasCounter(); + /** + * optional .io.prometheus.client.Counter counter = 3; + */ + io.prometheus.client.Metrics.Counter getCounter(); + /** + * optional .io.prometheus.client.Counter counter = 3; + */ + io.prometheus.client.Metrics.CounterOrBuilder getCounterOrBuilder(); + + /** + * optional .io.prometheus.client.Summary summary = 4; + */ + boolean hasSummary(); + /** + * optional .io.prometheus.client.Summary summary = 4; + */ + io.prometheus.client.Metrics.Summary getSummary(); + /** + * optional .io.prometheus.client.Summary summary = 4; + */ + io.prometheus.client.Metrics.SummaryOrBuilder getSummaryOrBuilder(); + + /** + * optional .io.prometheus.client.Untyped untyped = 5; + */ + boolean hasUntyped(); + /** + * optional .io.prometheus.client.Untyped untyped = 5; + */ + io.prometheus.client.Metrics.Untyped getUntyped(); + /** + * optional .io.prometheus.client.Untyped untyped = 5; + */ + io.prometheus.client.Metrics.UntypedOrBuilder getUntypedOrBuilder(); + + /** + * optional .io.prometheus.client.Histogram histogram = 7; + */ + boolean hasHistogram(); + /** + * optional .io.prometheus.client.Histogram histogram = 7; + */ + io.prometheus.client.Metrics.Histogram getHistogram(); + /** + * optional .io.prometheus.client.Histogram histogram = 7; + */ + io.prometheus.client.Metrics.HistogramOrBuilder getHistogramOrBuilder(); + + /** + * optional int64 timestamp_ms = 6; + */ + boolean hasTimestampMs(); + /** + * optional int64 timestamp_ms = 6; + */ + long getTimestampMs(); + } + /** + * Protobuf type {@code io.prometheus.client.Metric} + */ + public static final class Metric extends + com.google.protobuf.GeneratedMessage implements + // @@protoc_insertion_point(message_implements:io.prometheus.client.Metric) + MetricOrBuilder { + // Use Metric.newBuilder() to construct. + private Metric(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Metric(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Metric defaultInstance; + public static Metric getDefaultInstance() { + return defaultInstance; + } + + public Metric getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Metric( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + if (!((mutable_bitField0_ & 0x00000001) == 0x00000001)) { + label_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000001; + } + label_.add(input.readMessage(io.prometheus.client.Metrics.LabelPair.PARSER, extensionRegistry)); + break; + } + case 18: { + io.prometheus.client.Metrics.Gauge.Builder subBuilder = null; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + subBuilder = gauge_.toBuilder(); + } + gauge_ = input.readMessage(io.prometheus.client.Metrics.Gauge.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(gauge_); + gauge_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000001; + break; + } + case 26: { + io.prometheus.client.Metrics.Counter.Builder subBuilder = null; + if (((bitField0_ & 0x00000002) == 0x00000002)) { + subBuilder = counter_.toBuilder(); + } + counter_ = input.readMessage(io.prometheus.client.Metrics.Counter.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(counter_); + counter_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000002; + break; + } + case 34: { + io.prometheus.client.Metrics.Summary.Builder subBuilder = null; + if (((bitField0_ & 0x00000004) == 0x00000004)) { + subBuilder = summary_.toBuilder(); + } + summary_ = input.readMessage(io.prometheus.client.Metrics.Summary.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(summary_); + summary_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000004; + break; + } + case 42: { + io.prometheus.client.Metrics.Untyped.Builder subBuilder = null; + if (((bitField0_ & 0x00000008) == 0x00000008)) { + subBuilder = untyped_.toBuilder(); + } + untyped_ = input.readMessage(io.prometheus.client.Metrics.Untyped.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(untyped_); + untyped_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000008; + break; + } + case 48: { + bitField0_ |= 0x00000020; + timestampMs_ = input.readInt64(); + break; + } + case 58: { + io.prometheus.client.Metrics.Histogram.Builder subBuilder = null; + if (((bitField0_ & 0x00000010) == 0x00000010)) { + subBuilder = histogram_.toBuilder(); + } + histogram_ = input.readMessage(io.prometheus.client.Metrics.Histogram.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(histogram_); + histogram_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000010; + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000001) == 0x00000001)) { + label_ = java.util.Collections.unmodifiableList(label_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Metric_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Metric_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.Metric.class, io.prometheus.client.Metrics.Metric.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Metric parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Metric(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + public static final int LABEL_FIELD_NUMBER = 1; + private java.util.List label_; + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public java.util.List getLabelList() { + return label_; + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public java.util.List + getLabelOrBuilderList() { + return label_; + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public int getLabelCount() { + return label_.size(); + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public io.prometheus.client.Metrics.LabelPair getLabel(int index) { + return label_.get(index); + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public io.prometheus.client.Metrics.LabelPairOrBuilder getLabelOrBuilder( + int index) { + return label_.get(index); + } + + public static final int GAUGE_FIELD_NUMBER = 2; + private io.prometheus.client.Metrics.Gauge gauge_; + /** + * optional .io.prometheus.client.Gauge gauge = 2; + */ + public boolean hasGauge() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional .io.prometheus.client.Gauge gauge = 2; + */ + public io.prometheus.client.Metrics.Gauge getGauge() { + return gauge_; + } + /** + * optional .io.prometheus.client.Gauge gauge = 2; + */ + public io.prometheus.client.Metrics.GaugeOrBuilder getGaugeOrBuilder() { + return gauge_; + } + + public static final int COUNTER_FIELD_NUMBER = 3; + private io.prometheus.client.Metrics.Counter counter_; + /** + * optional .io.prometheus.client.Counter counter = 3; + */ + public boolean hasCounter() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional .io.prometheus.client.Counter counter = 3; + */ + public io.prometheus.client.Metrics.Counter getCounter() { + return counter_; + } + /** + * optional .io.prometheus.client.Counter counter = 3; + */ + public io.prometheus.client.Metrics.CounterOrBuilder getCounterOrBuilder() { + return counter_; + } + + public static final int SUMMARY_FIELD_NUMBER = 4; + private io.prometheus.client.Metrics.Summary summary_; + /** + * optional .io.prometheus.client.Summary summary = 4; + */ + public boolean hasSummary() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .io.prometheus.client.Summary summary = 4; + */ + public io.prometheus.client.Metrics.Summary getSummary() { + return summary_; + } + /** + * optional .io.prometheus.client.Summary summary = 4; + */ + public io.prometheus.client.Metrics.SummaryOrBuilder getSummaryOrBuilder() { + return summary_; + } + + public static final int UNTYPED_FIELD_NUMBER = 5; + private io.prometheus.client.Metrics.Untyped untyped_; + /** + * optional .io.prometheus.client.Untyped untyped = 5; + */ + public boolean hasUntyped() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional .io.prometheus.client.Untyped untyped = 5; + */ + public io.prometheus.client.Metrics.Untyped getUntyped() { + return untyped_; + } + /** + * optional .io.prometheus.client.Untyped untyped = 5; + */ + public io.prometheus.client.Metrics.UntypedOrBuilder getUntypedOrBuilder() { + return untyped_; + } + + public static final int HISTOGRAM_FIELD_NUMBER = 7; + private io.prometheus.client.Metrics.Histogram histogram_; + /** + * optional .io.prometheus.client.Histogram histogram = 7; + */ + public boolean hasHistogram() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional .io.prometheus.client.Histogram histogram = 7; + */ + public io.prometheus.client.Metrics.Histogram getHistogram() { + return histogram_; + } + /** + * optional .io.prometheus.client.Histogram histogram = 7; + */ + public io.prometheus.client.Metrics.HistogramOrBuilder getHistogramOrBuilder() { + return histogram_; + } + + public static final int TIMESTAMP_MS_FIELD_NUMBER = 6; + private long timestampMs_; + /** + * optional int64 timestamp_ms = 6; + */ + public boolean hasTimestampMs() { + return ((bitField0_ & 0x00000020) == 0x00000020); + } + /** + * optional int64 timestamp_ms = 6; + */ + public long getTimestampMs() { + return timestampMs_; + } + + private void initFields() { + label_ = java.util.Collections.emptyList(); + gauge_ = io.prometheus.client.Metrics.Gauge.getDefaultInstance(); + counter_ = io.prometheus.client.Metrics.Counter.getDefaultInstance(); + summary_ = io.prometheus.client.Metrics.Summary.getDefaultInstance(); + untyped_ = io.prometheus.client.Metrics.Untyped.getDefaultInstance(); + histogram_ = io.prometheus.client.Metrics.Histogram.getDefaultInstance(); + timestampMs_ = 0L; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + for (int i = 0; i < label_.size(); i++) { + output.writeMessage(1, label_.get(i)); + } + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeMessage(2, gauge_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeMessage(3, counter_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeMessage(4, summary_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + output.writeMessage(5, untyped_); + } + if (((bitField0_ & 0x00000020) == 0x00000020)) { + output.writeInt64(6, timestampMs_); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + output.writeMessage(7, histogram_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + for (int i = 0; i < label_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, label_.get(i)); + } + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, gauge_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, counter_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(4, summary_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(5, untyped_); + } + if (((bitField0_ & 0x00000020) == 0x00000020)) { + size += com.google.protobuf.CodedOutputStream + .computeInt64Size(6, timestampMs_); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(7, histogram_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static io.prometheus.client.Metrics.Metric parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.Metric parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.Metric parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.Metric parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.Metric parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.Metric parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.Metric parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static io.prometheus.client.Metrics.Metric parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.Metric parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.Metric parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(io.prometheus.client.Metrics.Metric prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code io.prometheus.client.Metric} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder implements + // @@protoc_insertion_point(builder_implements:io.prometheus.client.Metric) + io.prometheus.client.Metrics.MetricOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Metric_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Metric_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.Metric.class, io.prometheus.client.Metrics.Metric.Builder.class); + } + + // Construct using io.prometheus.client.Metrics.Metric.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + getLabelFieldBuilder(); + getGaugeFieldBuilder(); + getCounterFieldBuilder(); + getSummaryFieldBuilder(); + getUntypedFieldBuilder(); + getHistogramFieldBuilder(); + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + if (labelBuilder_ == null) { + label_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + } else { + labelBuilder_.clear(); + } + if (gaugeBuilder_ == null) { + gauge_ = io.prometheus.client.Metrics.Gauge.getDefaultInstance(); + } else { + gaugeBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + if (counterBuilder_ == null) { + counter_ = io.prometheus.client.Metrics.Counter.getDefaultInstance(); + } else { + counterBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + if (summaryBuilder_ == null) { + summary_ = io.prometheus.client.Metrics.Summary.getDefaultInstance(); + } else { + summaryBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000008); + if (untypedBuilder_ == null) { + untyped_ = io.prometheus.client.Metrics.Untyped.getDefaultInstance(); + } else { + untypedBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000010); + if (histogramBuilder_ == null) { + histogram_ = io.prometheus.client.Metrics.Histogram.getDefaultInstance(); + } else { + histogramBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000020); + timestampMs_ = 0L; + bitField0_ = (bitField0_ & ~0x00000040); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Metric_descriptor; + } + + public io.prometheus.client.Metrics.Metric getDefaultInstanceForType() { + return io.prometheus.client.Metrics.Metric.getDefaultInstance(); + } + + public io.prometheus.client.Metrics.Metric build() { + io.prometheus.client.Metrics.Metric result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public io.prometheus.client.Metrics.Metric buildPartial() { + io.prometheus.client.Metrics.Metric result = new io.prometheus.client.Metrics.Metric(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (labelBuilder_ == null) { + if (((bitField0_ & 0x00000001) == 0x00000001)) { + label_ = java.util.Collections.unmodifiableList(label_); + bitField0_ = (bitField0_ & ~0x00000001); + } + result.label_ = label_; + } else { + result.label_ = labelBuilder_.build(); + } + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000001; + } + if (gaugeBuilder_ == null) { + result.gauge_ = gauge_; + } else { + result.gauge_ = gaugeBuilder_.build(); + } + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000002; + } + if (counterBuilder_ == null) { + result.counter_ = counter_; + } else { + result.counter_ = counterBuilder_.build(); + } + if (((from_bitField0_ & 0x00000008) == 0x00000008)) { + to_bitField0_ |= 0x00000004; + } + if (summaryBuilder_ == null) { + result.summary_ = summary_; + } else { + result.summary_ = summaryBuilder_.build(); + } + if (((from_bitField0_ & 0x00000010) == 0x00000010)) { + to_bitField0_ |= 0x00000008; + } + if (untypedBuilder_ == null) { + result.untyped_ = untyped_; + } else { + result.untyped_ = untypedBuilder_.build(); + } + if (((from_bitField0_ & 0x00000020) == 0x00000020)) { + to_bitField0_ |= 0x00000010; + } + if (histogramBuilder_ == null) { + result.histogram_ = histogram_; + } else { + result.histogram_ = histogramBuilder_.build(); + } + if (((from_bitField0_ & 0x00000040) == 0x00000040)) { + to_bitField0_ |= 0x00000020; + } + result.timestampMs_ = timestampMs_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof io.prometheus.client.Metrics.Metric) { + return mergeFrom((io.prometheus.client.Metrics.Metric)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(io.prometheus.client.Metrics.Metric other) { + if (other == io.prometheus.client.Metrics.Metric.getDefaultInstance()) return this; + if (labelBuilder_ == null) { + if (!other.label_.isEmpty()) { + if (label_.isEmpty()) { + label_ = other.label_; + bitField0_ = (bitField0_ & ~0x00000001); + } else { + ensureLabelIsMutable(); + label_.addAll(other.label_); + } + onChanged(); + } + } else { + if (!other.label_.isEmpty()) { + if (labelBuilder_.isEmpty()) { + labelBuilder_.dispose(); + labelBuilder_ = null; + label_ = other.label_; + bitField0_ = (bitField0_ & ~0x00000001); + labelBuilder_ = + com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ? + getLabelFieldBuilder() : null; + } else { + labelBuilder_.addAllMessages(other.label_); + } + } + } + if (other.hasGauge()) { + mergeGauge(other.getGauge()); + } + if (other.hasCounter()) { + mergeCounter(other.getCounter()); + } + if (other.hasSummary()) { + mergeSummary(other.getSummary()); + } + if (other.hasUntyped()) { + mergeUntyped(other.getUntyped()); + } + if (other.hasHistogram()) { + mergeHistogram(other.getHistogram()); + } + if (other.hasTimestampMs()) { + setTimestampMs(other.getTimestampMs()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + io.prometheus.client.Metrics.Metric parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (io.prometheus.client.Metrics.Metric) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private java.util.List label_ = + java.util.Collections.emptyList(); + private void ensureLabelIsMutable() { + if (!((bitField0_ & 0x00000001) == 0x00000001)) { + label_ = new java.util.ArrayList(label_); + bitField0_ |= 0x00000001; + } + } + + private com.google.protobuf.RepeatedFieldBuilder< + io.prometheus.client.Metrics.LabelPair, io.prometheus.client.Metrics.LabelPair.Builder, io.prometheus.client.Metrics.LabelPairOrBuilder> labelBuilder_; + + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public java.util.List getLabelList() { + if (labelBuilder_ == null) { + return java.util.Collections.unmodifiableList(label_); + } else { + return labelBuilder_.getMessageList(); + } + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public int getLabelCount() { + if (labelBuilder_ == null) { + return label_.size(); + } else { + return labelBuilder_.getCount(); + } + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public io.prometheus.client.Metrics.LabelPair getLabel(int index) { + if (labelBuilder_ == null) { + return label_.get(index); + } else { + return labelBuilder_.getMessage(index); + } + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public Builder setLabel( + int index, io.prometheus.client.Metrics.LabelPair value) { + if (labelBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureLabelIsMutable(); + label_.set(index, value); + onChanged(); + } else { + labelBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public Builder setLabel( + int index, io.prometheus.client.Metrics.LabelPair.Builder builderForValue) { + if (labelBuilder_ == null) { + ensureLabelIsMutable(); + label_.set(index, builderForValue.build()); + onChanged(); + } else { + labelBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public Builder addLabel(io.prometheus.client.Metrics.LabelPair value) { + if (labelBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureLabelIsMutable(); + label_.add(value); + onChanged(); + } else { + labelBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public Builder addLabel( + int index, io.prometheus.client.Metrics.LabelPair value) { + if (labelBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureLabelIsMutable(); + label_.add(index, value); + onChanged(); + } else { + labelBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public Builder addLabel( + io.prometheus.client.Metrics.LabelPair.Builder builderForValue) { + if (labelBuilder_ == null) { + ensureLabelIsMutable(); + label_.add(builderForValue.build()); + onChanged(); + } else { + labelBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public Builder addLabel( + int index, io.prometheus.client.Metrics.LabelPair.Builder builderForValue) { + if (labelBuilder_ == null) { + ensureLabelIsMutable(); + label_.add(index, builderForValue.build()); + onChanged(); + } else { + labelBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public Builder addAllLabel( + java.lang.Iterable values) { + if (labelBuilder_ == null) { + ensureLabelIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, label_); + onChanged(); + } else { + labelBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public Builder clearLabel() { + if (labelBuilder_ == null) { + label_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + } else { + labelBuilder_.clear(); + } + return this; + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public Builder removeLabel(int index) { + if (labelBuilder_ == null) { + ensureLabelIsMutable(); + label_.remove(index); + onChanged(); + } else { + labelBuilder_.remove(index); + } + return this; + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public io.prometheus.client.Metrics.LabelPair.Builder getLabelBuilder( + int index) { + return getLabelFieldBuilder().getBuilder(index); + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public io.prometheus.client.Metrics.LabelPairOrBuilder getLabelOrBuilder( + int index) { + if (labelBuilder_ == null) { + return label_.get(index); } else { + return labelBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public java.util.List + getLabelOrBuilderList() { + if (labelBuilder_ != null) { + return labelBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(label_); + } + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public io.prometheus.client.Metrics.LabelPair.Builder addLabelBuilder() { + return getLabelFieldBuilder().addBuilder( + io.prometheus.client.Metrics.LabelPair.getDefaultInstance()); + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public io.prometheus.client.Metrics.LabelPair.Builder addLabelBuilder( + int index) { + return getLabelFieldBuilder().addBuilder( + index, io.prometheus.client.Metrics.LabelPair.getDefaultInstance()); + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public java.util.List + getLabelBuilderList() { + return getLabelFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilder< + io.prometheus.client.Metrics.LabelPair, io.prometheus.client.Metrics.LabelPair.Builder, io.prometheus.client.Metrics.LabelPairOrBuilder> + getLabelFieldBuilder() { + if (labelBuilder_ == null) { + labelBuilder_ = new com.google.protobuf.RepeatedFieldBuilder< + io.prometheus.client.Metrics.LabelPair, io.prometheus.client.Metrics.LabelPair.Builder, io.prometheus.client.Metrics.LabelPairOrBuilder>( + label_, + ((bitField0_ & 0x00000001) == 0x00000001), + getParentForChildren(), + isClean()); + label_ = null; + } + return labelBuilder_; + } + + private io.prometheus.client.Metrics.Gauge gauge_ = io.prometheus.client.Metrics.Gauge.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + io.prometheus.client.Metrics.Gauge, io.prometheus.client.Metrics.Gauge.Builder, io.prometheus.client.Metrics.GaugeOrBuilder> gaugeBuilder_; + /** + * optional .io.prometheus.client.Gauge gauge = 2; + */ + public boolean hasGauge() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional .io.prometheus.client.Gauge gauge = 2; + */ + public io.prometheus.client.Metrics.Gauge getGauge() { + if (gaugeBuilder_ == null) { + return gauge_; + } else { + return gaugeBuilder_.getMessage(); + } + } + /** + * optional .io.prometheus.client.Gauge gauge = 2; + */ + public Builder setGauge(io.prometheus.client.Metrics.Gauge value) { + if (gaugeBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + gauge_ = value; + onChanged(); + } else { + gaugeBuilder_.setMessage(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .io.prometheus.client.Gauge gauge = 2; + */ + public Builder setGauge( + io.prometheus.client.Metrics.Gauge.Builder builderForValue) { + if (gaugeBuilder_ == null) { + gauge_ = builderForValue.build(); + onChanged(); + } else { + gaugeBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .io.prometheus.client.Gauge gauge = 2; + */ + public Builder mergeGauge(io.prometheus.client.Metrics.Gauge value) { + if (gaugeBuilder_ == null) { + if (((bitField0_ & 0x00000002) == 0x00000002) && + gauge_ != io.prometheus.client.Metrics.Gauge.getDefaultInstance()) { + gauge_ = + io.prometheus.client.Metrics.Gauge.newBuilder(gauge_).mergeFrom(value).buildPartial(); + } else { + gauge_ = value; + } + onChanged(); + } else { + gaugeBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .io.prometheus.client.Gauge gauge = 2; + */ + public Builder clearGauge() { + if (gaugeBuilder_ == null) { + gauge_ = io.prometheus.client.Metrics.Gauge.getDefaultInstance(); + onChanged(); + } else { + gaugeBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + /** + * optional .io.prometheus.client.Gauge gauge = 2; + */ + public io.prometheus.client.Metrics.Gauge.Builder getGaugeBuilder() { + bitField0_ |= 0x00000002; + onChanged(); + return getGaugeFieldBuilder().getBuilder(); + } + /** + * optional .io.prometheus.client.Gauge gauge = 2; + */ + public io.prometheus.client.Metrics.GaugeOrBuilder getGaugeOrBuilder() { + if (gaugeBuilder_ != null) { + return gaugeBuilder_.getMessageOrBuilder(); + } else { + return gauge_; + } + } + /** + * optional .io.prometheus.client.Gauge gauge = 2; + */ + private com.google.protobuf.SingleFieldBuilder< + io.prometheus.client.Metrics.Gauge, io.prometheus.client.Metrics.Gauge.Builder, io.prometheus.client.Metrics.GaugeOrBuilder> + getGaugeFieldBuilder() { + if (gaugeBuilder_ == null) { + gaugeBuilder_ = new com.google.protobuf.SingleFieldBuilder< + io.prometheus.client.Metrics.Gauge, io.prometheus.client.Metrics.Gauge.Builder, io.prometheus.client.Metrics.GaugeOrBuilder>( + getGauge(), + getParentForChildren(), + isClean()); + gauge_ = null; + } + return gaugeBuilder_; + } + + private io.prometheus.client.Metrics.Counter counter_ = io.prometheus.client.Metrics.Counter.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + io.prometheus.client.Metrics.Counter, io.prometheus.client.Metrics.Counter.Builder, io.prometheus.client.Metrics.CounterOrBuilder> counterBuilder_; + /** + * optional .io.prometheus.client.Counter counter = 3; + */ + public boolean hasCounter() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .io.prometheus.client.Counter counter = 3; + */ + public io.prometheus.client.Metrics.Counter getCounter() { + if (counterBuilder_ == null) { + return counter_; + } else { + return counterBuilder_.getMessage(); + } + } + /** + * optional .io.prometheus.client.Counter counter = 3; + */ + public Builder setCounter(io.prometheus.client.Metrics.Counter value) { + if (counterBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + counter_ = value; + onChanged(); + } else { + counterBuilder_.setMessage(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .io.prometheus.client.Counter counter = 3; + */ + public Builder setCounter( + io.prometheus.client.Metrics.Counter.Builder builderForValue) { + if (counterBuilder_ == null) { + counter_ = builderForValue.build(); + onChanged(); + } else { + counterBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .io.prometheus.client.Counter counter = 3; + */ + public Builder mergeCounter(io.prometheus.client.Metrics.Counter value) { + if (counterBuilder_ == null) { + if (((bitField0_ & 0x00000004) == 0x00000004) && + counter_ != io.prometheus.client.Metrics.Counter.getDefaultInstance()) { + counter_ = + io.prometheus.client.Metrics.Counter.newBuilder(counter_).mergeFrom(value).buildPartial(); + } else { + counter_ = value; + } + onChanged(); + } else { + counterBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .io.prometheus.client.Counter counter = 3; + */ + public Builder clearCounter() { + if (counterBuilder_ == null) { + counter_ = io.prometheus.client.Metrics.Counter.getDefaultInstance(); + onChanged(); + } else { + counterBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + /** + * optional .io.prometheus.client.Counter counter = 3; + */ + public io.prometheus.client.Metrics.Counter.Builder getCounterBuilder() { + bitField0_ |= 0x00000004; + onChanged(); + return getCounterFieldBuilder().getBuilder(); + } + /** + * optional .io.prometheus.client.Counter counter = 3; + */ + public io.prometheus.client.Metrics.CounterOrBuilder getCounterOrBuilder() { + if (counterBuilder_ != null) { + return counterBuilder_.getMessageOrBuilder(); + } else { + return counter_; + } + } + /** + * optional .io.prometheus.client.Counter counter = 3; + */ + private com.google.protobuf.SingleFieldBuilder< + io.prometheus.client.Metrics.Counter, io.prometheus.client.Metrics.Counter.Builder, io.prometheus.client.Metrics.CounterOrBuilder> + getCounterFieldBuilder() { + if (counterBuilder_ == null) { + counterBuilder_ = new com.google.protobuf.SingleFieldBuilder< + io.prometheus.client.Metrics.Counter, io.prometheus.client.Metrics.Counter.Builder, io.prometheus.client.Metrics.CounterOrBuilder>( + getCounter(), + getParentForChildren(), + isClean()); + counter_ = null; + } + return counterBuilder_; + } + + private io.prometheus.client.Metrics.Summary summary_ = io.prometheus.client.Metrics.Summary.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + io.prometheus.client.Metrics.Summary, io.prometheus.client.Metrics.Summary.Builder, io.prometheus.client.Metrics.SummaryOrBuilder> summaryBuilder_; + /** + * optional .io.prometheus.client.Summary summary = 4; + */ + public boolean hasSummary() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional .io.prometheus.client.Summary summary = 4; + */ + public io.prometheus.client.Metrics.Summary getSummary() { + if (summaryBuilder_ == null) { + return summary_; + } else { + return summaryBuilder_.getMessage(); + } + } + /** + * optional .io.prometheus.client.Summary summary = 4; + */ + public Builder setSummary(io.prometheus.client.Metrics.Summary value) { + if (summaryBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + summary_ = value; + onChanged(); + } else { + summaryBuilder_.setMessage(value); + } + bitField0_ |= 0x00000008; + return this; + } + /** + * optional .io.prometheus.client.Summary summary = 4; + */ + public Builder setSummary( + io.prometheus.client.Metrics.Summary.Builder builderForValue) { + if (summaryBuilder_ == null) { + summary_ = builderForValue.build(); + onChanged(); + } else { + summaryBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000008; + return this; + } + /** + * optional .io.prometheus.client.Summary summary = 4; + */ + public Builder mergeSummary(io.prometheus.client.Metrics.Summary value) { + if (summaryBuilder_ == null) { + if (((bitField0_ & 0x00000008) == 0x00000008) && + summary_ != io.prometheus.client.Metrics.Summary.getDefaultInstance()) { + summary_ = + io.prometheus.client.Metrics.Summary.newBuilder(summary_).mergeFrom(value).buildPartial(); + } else { + summary_ = value; + } + onChanged(); + } else { + summaryBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000008; + return this; + } + /** + * optional .io.prometheus.client.Summary summary = 4; + */ + public Builder clearSummary() { + if (summaryBuilder_ == null) { + summary_ = io.prometheus.client.Metrics.Summary.getDefaultInstance(); + onChanged(); + } else { + summaryBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000008); + return this; + } + /** + * optional .io.prometheus.client.Summary summary = 4; + */ + public io.prometheus.client.Metrics.Summary.Builder getSummaryBuilder() { + bitField0_ |= 0x00000008; + onChanged(); + return getSummaryFieldBuilder().getBuilder(); + } + /** + * optional .io.prometheus.client.Summary summary = 4; + */ + public io.prometheus.client.Metrics.SummaryOrBuilder getSummaryOrBuilder() { + if (summaryBuilder_ != null) { + return summaryBuilder_.getMessageOrBuilder(); + } else { + return summary_; + } + } + /** + * optional .io.prometheus.client.Summary summary = 4; + */ + private com.google.protobuf.SingleFieldBuilder< + io.prometheus.client.Metrics.Summary, io.prometheus.client.Metrics.Summary.Builder, io.prometheus.client.Metrics.SummaryOrBuilder> + getSummaryFieldBuilder() { + if (summaryBuilder_ == null) { + summaryBuilder_ = new com.google.protobuf.SingleFieldBuilder< + io.prometheus.client.Metrics.Summary, io.prometheus.client.Metrics.Summary.Builder, io.prometheus.client.Metrics.SummaryOrBuilder>( + getSummary(), + getParentForChildren(), + isClean()); + summary_ = null; + } + return summaryBuilder_; + } + + private io.prometheus.client.Metrics.Untyped untyped_ = io.prometheus.client.Metrics.Untyped.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + io.prometheus.client.Metrics.Untyped, io.prometheus.client.Metrics.Untyped.Builder, io.prometheus.client.Metrics.UntypedOrBuilder> untypedBuilder_; + /** + * optional .io.prometheus.client.Untyped untyped = 5; + */ + public boolean hasUntyped() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional .io.prometheus.client.Untyped untyped = 5; + */ + public io.prometheus.client.Metrics.Untyped getUntyped() { + if (untypedBuilder_ == null) { + return untyped_; + } else { + return untypedBuilder_.getMessage(); + } + } + /** + * optional .io.prometheus.client.Untyped untyped = 5; + */ + public Builder setUntyped(io.prometheus.client.Metrics.Untyped value) { + if (untypedBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + untyped_ = value; + onChanged(); + } else { + untypedBuilder_.setMessage(value); + } + bitField0_ |= 0x00000010; + return this; + } + /** + * optional .io.prometheus.client.Untyped untyped = 5; + */ + public Builder setUntyped( + io.prometheus.client.Metrics.Untyped.Builder builderForValue) { + if (untypedBuilder_ == null) { + untyped_ = builderForValue.build(); + onChanged(); + } else { + untypedBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000010; + return this; + } + /** + * optional .io.prometheus.client.Untyped untyped = 5; + */ + public Builder mergeUntyped(io.prometheus.client.Metrics.Untyped value) { + if (untypedBuilder_ == null) { + if (((bitField0_ & 0x00000010) == 0x00000010) && + untyped_ != io.prometheus.client.Metrics.Untyped.getDefaultInstance()) { + untyped_ = + io.prometheus.client.Metrics.Untyped.newBuilder(untyped_).mergeFrom(value).buildPartial(); + } else { + untyped_ = value; + } + onChanged(); + } else { + untypedBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000010; + return this; + } + /** + * optional .io.prometheus.client.Untyped untyped = 5; + */ + public Builder clearUntyped() { + if (untypedBuilder_ == null) { + untyped_ = io.prometheus.client.Metrics.Untyped.getDefaultInstance(); + onChanged(); + } else { + untypedBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000010); + return this; + } + /** + * optional .io.prometheus.client.Untyped untyped = 5; + */ + public io.prometheus.client.Metrics.Untyped.Builder getUntypedBuilder() { + bitField0_ |= 0x00000010; + onChanged(); + return getUntypedFieldBuilder().getBuilder(); + } + /** + * optional .io.prometheus.client.Untyped untyped = 5; + */ + public io.prometheus.client.Metrics.UntypedOrBuilder getUntypedOrBuilder() { + if (untypedBuilder_ != null) { + return untypedBuilder_.getMessageOrBuilder(); + } else { + return untyped_; + } + } + /** + * optional .io.prometheus.client.Untyped untyped = 5; + */ + private com.google.protobuf.SingleFieldBuilder< + io.prometheus.client.Metrics.Untyped, io.prometheus.client.Metrics.Untyped.Builder, io.prometheus.client.Metrics.UntypedOrBuilder> + getUntypedFieldBuilder() { + if (untypedBuilder_ == null) { + untypedBuilder_ = new com.google.protobuf.SingleFieldBuilder< + io.prometheus.client.Metrics.Untyped, io.prometheus.client.Metrics.Untyped.Builder, io.prometheus.client.Metrics.UntypedOrBuilder>( + getUntyped(), + getParentForChildren(), + isClean()); + untyped_ = null; + } + return untypedBuilder_; + } + + private io.prometheus.client.Metrics.Histogram histogram_ = io.prometheus.client.Metrics.Histogram.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + io.prometheus.client.Metrics.Histogram, io.prometheus.client.Metrics.Histogram.Builder, io.prometheus.client.Metrics.HistogramOrBuilder> histogramBuilder_; + /** + * optional .io.prometheus.client.Histogram histogram = 7; + */ + public boolean hasHistogram() { + return ((bitField0_ & 0x00000020) == 0x00000020); + } + /** + * optional .io.prometheus.client.Histogram histogram = 7; + */ + public io.prometheus.client.Metrics.Histogram getHistogram() { + if (histogramBuilder_ == null) { + return histogram_; + } else { + return histogramBuilder_.getMessage(); + } + } + /** + * optional .io.prometheus.client.Histogram histogram = 7; + */ + public Builder setHistogram(io.prometheus.client.Metrics.Histogram value) { + if (histogramBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + histogram_ = value; + onChanged(); + } else { + histogramBuilder_.setMessage(value); + } + bitField0_ |= 0x00000020; + return this; + } + /** + * optional .io.prometheus.client.Histogram histogram = 7; + */ + public Builder setHistogram( + io.prometheus.client.Metrics.Histogram.Builder builderForValue) { + if (histogramBuilder_ == null) { + histogram_ = builderForValue.build(); + onChanged(); + } else { + histogramBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000020; + return this; + } + /** + * optional .io.prometheus.client.Histogram histogram = 7; + */ + public Builder mergeHistogram(io.prometheus.client.Metrics.Histogram value) { + if (histogramBuilder_ == null) { + if (((bitField0_ & 0x00000020) == 0x00000020) && + histogram_ != io.prometheus.client.Metrics.Histogram.getDefaultInstance()) { + histogram_ = + io.prometheus.client.Metrics.Histogram.newBuilder(histogram_).mergeFrom(value).buildPartial(); + } else { + histogram_ = value; + } + onChanged(); + } else { + histogramBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000020; + return this; + } + /** + * optional .io.prometheus.client.Histogram histogram = 7; + */ + public Builder clearHistogram() { + if (histogramBuilder_ == null) { + histogram_ = io.prometheus.client.Metrics.Histogram.getDefaultInstance(); + onChanged(); + } else { + histogramBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000020); + return this; + } + /** + * optional .io.prometheus.client.Histogram histogram = 7; + */ + public io.prometheus.client.Metrics.Histogram.Builder getHistogramBuilder() { + bitField0_ |= 0x00000020; + onChanged(); + return getHistogramFieldBuilder().getBuilder(); + } + /** + * optional .io.prometheus.client.Histogram histogram = 7; + */ + public io.prometheus.client.Metrics.HistogramOrBuilder getHistogramOrBuilder() { + if (histogramBuilder_ != null) { + return histogramBuilder_.getMessageOrBuilder(); + } else { + return histogram_; + } + } + /** + * optional .io.prometheus.client.Histogram histogram = 7; + */ + private com.google.protobuf.SingleFieldBuilder< + io.prometheus.client.Metrics.Histogram, io.prometheus.client.Metrics.Histogram.Builder, io.prometheus.client.Metrics.HistogramOrBuilder> + getHistogramFieldBuilder() { + if (histogramBuilder_ == null) { + histogramBuilder_ = new com.google.protobuf.SingleFieldBuilder< + io.prometheus.client.Metrics.Histogram, io.prometheus.client.Metrics.Histogram.Builder, io.prometheus.client.Metrics.HistogramOrBuilder>( + getHistogram(), + getParentForChildren(), + isClean()); + histogram_ = null; + } + return histogramBuilder_; + } + + private long timestampMs_ ; + /** + * optional int64 timestamp_ms = 6; + */ + public boolean hasTimestampMs() { + return ((bitField0_ & 0x00000040) == 0x00000040); + } + /** + * optional int64 timestamp_ms = 6; + */ + public long getTimestampMs() { + return timestampMs_; + } + /** + * optional int64 timestamp_ms = 6; + */ + public Builder setTimestampMs(long value) { + bitField0_ |= 0x00000040; + timestampMs_ = value; + onChanged(); + return this; + } + /** + * optional int64 timestamp_ms = 6; + */ + public Builder clearTimestampMs() { + bitField0_ = (bitField0_ & ~0x00000040); + timestampMs_ = 0L; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:io.prometheus.client.Metric) + } + + static { + defaultInstance = new Metric(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:io.prometheus.client.Metric) + } + + public interface MetricFamilyOrBuilder extends + // @@protoc_insertion_point(interface_extends:io.prometheus.client.MetricFamily) + com.google.protobuf.MessageOrBuilder { + + /** + * optional string name = 1; + */ + boolean hasName(); + /** + * optional string name = 1; + */ + java.lang.String getName(); + /** + * optional string name = 1; + */ + com.google.protobuf.ByteString + getNameBytes(); + + /** + * optional string help = 2; + */ + boolean hasHelp(); + /** + * optional string help = 2; + */ + java.lang.String getHelp(); + /** + * optional string help = 2; + */ + com.google.protobuf.ByteString + getHelpBytes(); + + /** + * optional .io.prometheus.client.MetricType type = 3; + */ + boolean hasType(); + /** + * optional .io.prometheus.client.MetricType type = 3; + */ + io.prometheus.client.Metrics.MetricType getType(); + + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + java.util.List + getMetricList(); + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + io.prometheus.client.Metrics.Metric getMetric(int index); + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + int getMetricCount(); + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + java.util.List + getMetricOrBuilderList(); + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + io.prometheus.client.Metrics.MetricOrBuilder getMetricOrBuilder( + int index); + } + /** + * Protobuf type {@code io.prometheus.client.MetricFamily} + */ + public static final class MetricFamily extends + com.google.protobuf.GeneratedMessage implements + // @@protoc_insertion_point(message_implements:io.prometheus.client.MetricFamily) + MetricFamilyOrBuilder { + // Use MetricFamily.newBuilder() to construct. + private MetricFamily(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private MetricFamily(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final MetricFamily defaultInstance; + public static MetricFamily getDefaultInstance() { + return defaultInstance; + } + + public MetricFamily getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private MetricFamily( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000001; + name_ = bs; + break; + } + case 18: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000002; + help_ = bs; + break; + } + case 24: { + int rawValue = input.readEnum(); + io.prometheus.client.Metrics.MetricType value = io.prometheus.client.Metrics.MetricType.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(3, rawValue); + } else { + bitField0_ |= 0x00000004; + type_ = value; + } + break; + } + case 34: { + if (!((mutable_bitField0_ & 0x00000008) == 0x00000008)) { + metric_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000008; + } + metric_.add(input.readMessage(io.prometheus.client.Metrics.Metric.PARSER, extensionRegistry)); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000008) == 0x00000008)) { + metric_ = java.util.Collections.unmodifiableList(metric_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_MetricFamily_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_MetricFamily_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.MetricFamily.class, io.prometheus.client.Metrics.MetricFamily.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public MetricFamily parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new MetricFamily(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + public static final int NAME_FIELD_NUMBER = 1; + private java.lang.Object name_; + /** + * optional string name = 1; + */ + public boolean hasName() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string name = 1; + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + name_ = s; + } + return s; + } + } + /** + * optional string name = 1; + */ + public com.google.protobuf.ByteString + getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int HELP_FIELD_NUMBER = 2; + private java.lang.Object help_; + /** + * optional string help = 2; + */ + public boolean hasHelp() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string help = 2; + */ + public java.lang.String getHelp() { + java.lang.Object ref = help_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + help_ = s; + } + return s; + } + } + /** + * optional string help = 2; + */ + public com.google.protobuf.ByteString + getHelpBytes() { + java.lang.Object ref = help_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + help_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int TYPE_FIELD_NUMBER = 3; + private io.prometheus.client.Metrics.MetricType type_; + /** + * optional .io.prometheus.client.MetricType type = 3; + */ + public boolean hasType() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .io.prometheus.client.MetricType type = 3; + */ + public io.prometheus.client.Metrics.MetricType getType() { + return type_; + } + + public static final int METRIC_FIELD_NUMBER = 4; + private java.util.List metric_; + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public java.util.List getMetricList() { + return metric_; + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public java.util.List + getMetricOrBuilderList() { + return metric_; + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public int getMetricCount() { + return metric_.size(); + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public io.prometheus.client.Metrics.Metric getMetric(int index) { + return metric_.get(index); + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public io.prometheus.client.Metrics.MetricOrBuilder getMetricOrBuilder( + int index) { + return metric_.get(index); + } + + private void initFields() { + name_ = ""; + help_ = ""; + type_ = io.prometheus.client.Metrics.MetricType.COUNTER; + metric_ = java.util.Collections.emptyList(); + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, getNameBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, getHelpBytes()); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeEnum(3, type_.getNumber()); + } + for (int i = 0; i < metric_.size(); i++) { + output.writeMessage(4, metric_.get(i)); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, getNameBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, getHelpBytes()); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(3, type_.getNumber()); + } + for (int i = 0; i < metric_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(4, metric_.get(i)); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static io.prometheus.client.Metrics.MetricFamily parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.MetricFamily parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.MetricFamily parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.MetricFamily parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.MetricFamily parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.MetricFamily parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.MetricFamily parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static io.prometheus.client.Metrics.MetricFamily parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.MetricFamily parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.MetricFamily parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(io.prometheus.client.Metrics.MetricFamily prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code io.prometheus.client.MetricFamily} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder implements + // @@protoc_insertion_point(builder_implements:io.prometheus.client.MetricFamily) + io.prometheus.client.Metrics.MetricFamilyOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_MetricFamily_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_MetricFamily_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.MetricFamily.class, io.prometheus.client.Metrics.MetricFamily.Builder.class); + } + + // Construct using io.prometheus.client.Metrics.MetricFamily.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + getMetricFieldBuilder(); + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + name_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + help_ = ""; + bitField0_ = (bitField0_ & ~0x00000002); + type_ = io.prometheus.client.Metrics.MetricType.COUNTER; + bitField0_ = (bitField0_ & ~0x00000004); + if (metricBuilder_ == null) { + metric_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000008); + } else { + metricBuilder_.clear(); + } + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_MetricFamily_descriptor; + } + + public io.prometheus.client.Metrics.MetricFamily getDefaultInstanceForType() { + return io.prometheus.client.Metrics.MetricFamily.getDefaultInstance(); + } + + public io.prometheus.client.Metrics.MetricFamily build() { + io.prometheus.client.Metrics.MetricFamily result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public io.prometheus.client.Metrics.MetricFamily buildPartial() { + io.prometheus.client.Metrics.MetricFamily result = new io.prometheus.client.Metrics.MetricFamily(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.name_ = name_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.help_ = help_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.type_ = type_; + if (metricBuilder_ == null) { + if (((bitField0_ & 0x00000008) == 0x00000008)) { + metric_ = java.util.Collections.unmodifiableList(metric_); + bitField0_ = (bitField0_ & ~0x00000008); + } + result.metric_ = metric_; + } else { + result.metric_ = metricBuilder_.build(); + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof io.prometheus.client.Metrics.MetricFamily) { + return mergeFrom((io.prometheus.client.Metrics.MetricFamily)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(io.prometheus.client.Metrics.MetricFamily other) { + if (other == io.prometheus.client.Metrics.MetricFamily.getDefaultInstance()) return this; + if (other.hasName()) { + bitField0_ |= 0x00000001; + name_ = other.name_; + onChanged(); + } + if (other.hasHelp()) { + bitField0_ |= 0x00000002; + help_ = other.help_; + onChanged(); + } + if (other.hasType()) { + setType(other.getType()); + } + if (metricBuilder_ == null) { + if (!other.metric_.isEmpty()) { + if (metric_.isEmpty()) { + metric_ = other.metric_; + bitField0_ = (bitField0_ & ~0x00000008); + } else { + ensureMetricIsMutable(); + metric_.addAll(other.metric_); + } + onChanged(); + } + } else { + if (!other.metric_.isEmpty()) { + if (metricBuilder_.isEmpty()) { + metricBuilder_.dispose(); + metricBuilder_ = null; + metric_ = other.metric_; + bitField0_ = (bitField0_ & ~0x00000008); + metricBuilder_ = + com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ? + getMetricFieldBuilder() : null; + } else { + metricBuilder_.addAllMessages(other.metric_); + } + } + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + io.prometheus.client.Metrics.MetricFamily parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (io.prometheus.client.Metrics.MetricFamily) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private java.lang.Object name_ = ""; + /** + * optional string name = 1; + */ + public boolean hasName() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string name = 1; + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + name_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * optional string name = 1; + */ + public com.google.protobuf.ByteString + getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string name = 1; + */ + public Builder setName( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + name_ = value; + onChanged(); + return this; + } + /** + * optional string name = 1; + */ + public Builder clearName() { + bitField0_ = (bitField0_ & ~0x00000001); + name_ = getDefaultInstance().getName(); + onChanged(); + return this; + } + /** + * optional string name = 1; + */ + public Builder setNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + name_ = value; + onChanged(); + return this; + } + + private java.lang.Object help_ = ""; + /** + * optional string help = 2; + */ + public boolean hasHelp() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string help = 2; + */ + public java.lang.String getHelp() { + java.lang.Object ref = help_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + help_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * optional string help = 2; + */ + public com.google.protobuf.ByteString + getHelpBytes() { + java.lang.Object ref = help_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + help_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string help = 2; + */ + public Builder setHelp( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + help_ = value; + onChanged(); + return this; + } + /** + * optional string help = 2; + */ + public Builder clearHelp() { + bitField0_ = (bitField0_ & ~0x00000002); + help_ = getDefaultInstance().getHelp(); + onChanged(); + return this; + } + /** + * optional string help = 2; + */ + public Builder setHelpBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + help_ = value; + onChanged(); + return this; + } + + private io.prometheus.client.Metrics.MetricType type_ = io.prometheus.client.Metrics.MetricType.COUNTER; + /** + * optional .io.prometheus.client.MetricType type = 3; + */ + public boolean hasType() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .io.prometheus.client.MetricType type = 3; + */ + public io.prometheus.client.Metrics.MetricType getType() { + return type_; + } + /** + * optional .io.prometheus.client.MetricType type = 3; + */ + public Builder setType(io.prometheus.client.Metrics.MetricType value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + type_ = value; + onChanged(); + return this; + } + /** + * optional .io.prometheus.client.MetricType type = 3; + */ + public Builder clearType() { + bitField0_ = (bitField0_ & ~0x00000004); + type_ = io.prometheus.client.Metrics.MetricType.COUNTER; + onChanged(); + return this; + } + + private java.util.List metric_ = + java.util.Collections.emptyList(); + private void ensureMetricIsMutable() { + if (!((bitField0_ & 0x00000008) == 0x00000008)) { + metric_ = new java.util.ArrayList(metric_); + bitField0_ |= 0x00000008; + } + } + + private com.google.protobuf.RepeatedFieldBuilder< + io.prometheus.client.Metrics.Metric, io.prometheus.client.Metrics.Metric.Builder, io.prometheus.client.Metrics.MetricOrBuilder> metricBuilder_; + + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public java.util.List getMetricList() { + if (metricBuilder_ == null) { + return java.util.Collections.unmodifiableList(metric_); + } else { + return metricBuilder_.getMessageList(); + } + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public int getMetricCount() { + if (metricBuilder_ == null) { + return metric_.size(); + } else { + return metricBuilder_.getCount(); + } + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public io.prometheus.client.Metrics.Metric getMetric(int index) { + if (metricBuilder_ == null) { + return metric_.get(index); + } else { + return metricBuilder_.getMessage(index); + } + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public Builder setMetric( + int index, io.prometheus.client.Metrics.Metric value) { + if (metricBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureMetricIsMutable(); + metric_.set(index, value); + onChanged(); + } else { + metricBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public Builder setMetric( + int index, io.prometheus.client.Metrics.Metric.Builder builderForValue) { + if (metricBuilder_ == null) { + ensureMetricIsMutable(); + metric_.set(index, builderForValue.build()); + onChanged(); + } else { + metricBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public Builder addMetric(io.prometheus.client.Metrics.Metric value) { + if (metricBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureMetricIsMutable(); + metric_.add(value); + onChanged(); + } else { + metricBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public Builder addMetric( + int index, io.prometheus.client.Metrics.Metric value) { + if (metricBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureMetricIsMutable(); + metric_.add(index, value); + onChanged(); + } else { + metricBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public Builder addMetric( + io.prometheus.client.Metrics.Metric.Builder builderForValue) { + if (metricBuilder_ == null) { + ensureMetricIsMutable(); + metric_.add(builderForValue.build()); + onChanged(); + } else { + metricBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public Builder addMetric( + int index, io.prometheus.client.Metrics.Metric.Builder builderForValue) { + if (metricBuilder_ == null) { + ensureMetricIsMutable(); + metric_.add(index, builderForValue.build()); + onChanged(); + } else { + metricBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public Builder addAllMetric( + java.lang.Iterable values) { + if (metricBuilder_ == null) { + ensureMetricIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, metric_); + onChanged(); + } else { + metricBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public Builder clearMetric() { + if (metricBuilder_ == null) { + metric_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000008); + onChanged(); + } else { + metricBuilder_.clear(); + } + return this; + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public Builder removeMetric(int index) { + if (metricBuilder_ == null) { + ensureMetricIsMutable(); + metric_.remove(index); + onChanged(); + } else { + metricBuilder_.remove(index); + } + return this; + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public io.prometheus.client.Metrics.Metric.Builder getMetricBuilder( + int index) { + return getMetricFieldBuilder().getBuilder(index); + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public io.prometheus.client.Metrics.MetricOrBuilder getMetricOrBuilder( + int index) { + if (metricBuilder_ == null) { + return metric_.get(index); } else { + return metricBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public java.util.List + getMetricOrBuilderList() { + if (metricBuilder_ != null) { + return metricBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(metric_); + } + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public io.prometheus.client.Metrics.Metric.Builder addMetricBuilder() { + return getMetricFieldBuilder().addBuilder( + io.prometheus.client.Metrics.Metric.getDefaultInstance()); + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public io.prometheus.client.Metrics.Metric.Builder addMetricBuilder( + int index) { + return getMetricFieldBuilder().addBuilder( + index, io.prometheus.client.Metrics.Metric.getDefaultInstance()); + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public java.util.List + getMetricBuilderList() { + return getMetricFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilder< + io.prometheus.client.Metrics.Metric, io.prometheus.client.Metrics.Metric.Builder, io.prometheus.client.Metrics.MetricOrBuilder> + getMetricFieldBuilder() { + if (metricBuilder_ == null) { + metricBuilder_ = new com.google.protobuf.RepeatedFieldBuilder< + io.prometheus.client.Metrics.Metric, io.prometheus.client.Metrics.Metric.Builder, io.prometheus.client.Metrics.MetricOrBuilder>( + metric_, + ((bitField0_ & 0x00000008) == 0x00000008), + getParentForChildren(), + isClean()); + metric_ = null; + } + return metricBuilder_; + } + + // @@protoc_insertion_point(builder_scope:io.prometheus.client.MetricFamily) + } + + static { + defaultInstance = new MetricFamily(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:io.prometheus.client.MetricFamily) + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_io_prometheus_client_LabelPair_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_io_prometheus_client_LabelPair_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_io_prometheus_client_Gauge_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_io_prometheus_client_Gauge_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_io_prometheus_client_Counter_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_io_prometheus_client_Counter_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_io_prometheus_client_Quantile_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_io_prometheus_client_Quantile_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_io_prometheus_client_Summary_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_io_prometheus_client_Summary_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_io_prometheus_client_Untyped_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_io_prometheus_client_Untyped_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_io_prometheus_client_Histogram_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_io_prometheus_client_Histogram_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_io_prometheus_client_Bucket_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_io_prometheus_client_Bucket_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_io_prometheus_client_Metric_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_io_prometheus_client_Metric_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_io_prometheus_client_MetricFamily_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_io_prometheus_client_MetricFamily_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\rmetrics.proto\022\024io.prometheus.client\"(\n" + + "\tLabelPair\022\014\n\004name\030\001 \001(\t\022\r\n\005value\030\002 \001(\t\"" + + "\026\n\005Gauge\022\r\n\005value\030\001 \001(\001\"\030\n\007Counter\022\r\n\005va" + + "lue\030\001 \001(\001\"+\n\010Quantile\022\020\n\010quantile\030\001 \001(\001\022" + + "\r\n\005value\030\002 \001(\001\"e\n\007Summary\022\024\n\014sample_coun" + + "t\030\001 \001(\004\022\022\n\nsample_sum\030\002 \001(\001\0220\n\010quantile\030" + + "\003 \003(\0132\036.io.prometheus.client.Quantile\"\030\n" + + "\007Untyped\022\r\n\005value\030\001 \001(\001\"c\n\tHistogram\022\024\n\014" + + "sample_count\030\001 \001(\004\022\022\n\nsample_sum\030\002 \001(\001\022," + + "\n\006bucket\030\003 \003(\0132\034.io.prometheus.client.Bu", + "cket\"7\n\006Bucket\022\030\n\020cumulative_count\030\001 \001(\004" + + "\022\023\n\013upper_bound\030\002 \001(\001\"\276\002\n\006Metric\022.\n\005labe" + + "l\030\001 \003(\0132\037.io.prometheus.client.LabelPair" + + "\022*\n\005gauge\030\002 \001(\0132\033.io.prometheus.client.G" + + "auge\022.\n\007counter\030\003 \001(\0132\035.io.prometheus.cl" + + "ient.Counter\022.\n\007summary\030\004 \001(\0132\035.io.prome" + + "theus.client.Summary\022.\n\007untyped\030\005 \001(\0132\035." + + "io.prometheus.client.Untyped\0222\n\thistogra" + + "m\030\007 \001(\0132\037.io.prometheus.client.Histogram" + + "\022\024\n\014timestamp_ms\030\006 \001(\003\"\210\001\n\014MetricFamily\022", + "\014\n\004name\030\001 \001(\t\022\014\n\004help\030\002 \001(\t\022.\n\004type\030\003 \001(" + + "\0162 .io.prometheus.client.MetricType\022,\n\006m" + + "etric\030\004 \003(\0132\034.io.prometheus.client.Metri" + + "c*M\n\nMetricType\022\013\n\007COUNTER\020\000\022\t\n\005GAUGE\020\001\022" + + "\013\n\007SUMMARY\020\002\022\013\n\007UNTYPED\020\003\022\r\n\tHISTOGRAM\020\004" + + "B\026\n\024io.prometheus.client" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }, assigner); + internal_static_io_prometheus_client_LabelPair_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_io_prometheus_client_LabelPair_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_io_prometheus_client_LabelPair_descriptor, + new java.lang.String[] { "Name", "Value", }); + internal_static_io_prometheus_client_Gauge_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_io_prometheus_client_Gauge_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_io_prometheus_client_Gauge_descriptor, + new java.lang.String[] { "Value", }); + internal_static_io_prometheus_client_Counter_descriptor = + getDescriptor().getMessageTypes().get(2); + internal_static_io_prometheus_client_Counter_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_io_prometheus_client_Counter_descriptor, + new java.lang.String[] { "Value", }); + internal_static_io_prometheus_client_Quantile_descriptor = + getDescriptor().getMessageTypes().get(3); + internal_static_io_prometheus_client_Quantile_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_io_prometheus_client_Quantile_descriptor, + new java.lang.String[] { "Quantile", "Value", }); + internal_static_io_prometheus_client_Summary_descriptor = + getDescriptor().getMessageTypes().get(4); + internal_static_io_prometheus_client_Summary_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_io_prometheus_client_Summary_descriptor, + new java.lang.String[] { "SampleCount", "SampleSum", "Quantile", }); + internal_static_io_prometheus_client_Untyped_descriptor = + getDescriptor().getMessageTypes().get(5); + internal_static_io_prometheus_client_Untyped_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_io_prometheus_client_Untyped_descriptor, + new java.lang.String[] { "Value", }); + internal_static_io_prometheus_client_Histogram_descriptor = + getDescriptor().getMessageTypes().get(6); + internal_static_io_prometheus_client_Histogram_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_io_prometheus_client_Histogram_descriptor, + new java.lang.String[] { "SampleCount", "SampleSum", "Bucket", }); + internal_static_io_prometheus_client_Bucket_descriptor = + getDescriptor().getMessageTypes().get(7); + internal_static_io_prometheus_client_Bucket_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_io_prometheus_client_Bucket_descriptor, + new java.lang.String[] { "CumulativeCount", "UpperBound", }); + internal_static_io_prometheus_client_Metric_descriptor = + getDescriptor().getMessageTypes().get(8); + internal_static_io_prometheus_client_Metric_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_io_prometheus_client_Metric_descriptor, + new java.lang.String[] { "Label", "Gauge", "Counter", "Summary", "Untyped", "Histogram", "TimestampMs", }); + internal_static_io_prometheus_client_MetricFamily_descriptor = + getDescriptor().getMessageTypes().get(9); + internal_static_io_prometheus_client_MetricFamily_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_io_prometheus_client_MetricFamily_descriptor, + new java.lang.String[] { "Name", "Help", "Type", "Metric", }); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/api/vendor/github.com/prometheus/common/.travis.yml b/api/vendor/github.com/prometheus/common/.travis.yml new file mode 100644 index 0000000..2fe8e9a --- /dev/null +++ b/api/vendor/github.com/prometheus/common/.travis.yml @@ -0,0 +1,6 @@ +sudo: false + +language: go +go: + - 1.7.5 + - tip diff --git a/api/vendor/github.com/prometheus/common/CONTRIBUTING.md b/api/vendor/github.com/prometheus/common/CONTRIBUTING.md new file mode 100644 index 0000000..40503ed --- /dev/null +++ b/api/vendor/github.com/prometheus/common/CONTRIBUTING.md @@ -0,0 +1,18 @@ +# Contributing + +Prometheus uses GitHub to manage reviews of pull requests. + +* If you have a trivial fix or improvement, go ahead and create a pull request, + addressing (with `@...`) the maintainer of this repository (see + [MAINTAINERS.md](MAINTAINERS.md)) in the description of the pull request. + +* If you plan to do something more involved, first discuss your ideas + on our [mailing list](https://groups.google.com/forum/?fromgroups#!forum/prometheus-developers). + This will avoid unnecessary work and surely give you and us a good deal + of inspiration. + +* Relevant coding style guidelines are the [Go Code Review + Comments](https://code.google.com/p/go-wiki/wiki/CodeReviewComments) + and the _Formatting and style_ section of Peter Bourgon's [Go: Best + Practices for Production + Environments](http://peter.bourgon.org/go-in-production/#formatting-and-style). diff --git a/api/vendor/github.com/prometheus/common/LICENSE b/api/vendor/github.com/prometheus/common/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/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 [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/api/vendor/github.com/prometheus/common/MAINTAINERS.md b/api/vendor/github.com/prometheus/common/MAINTAINERS.md new file mode 100644 index 0000000..1b31521 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/MAINTAINERS.md @@ -0,0 +1 @@ +* Fabian Reinartz diff --git a/api/vendor/github.com/prometheus/common/NOTICE b/api/vendor/github.com/prometheus/common/NOTICE new file mode 100644 index 0000000..636a2c1 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/NOTICE @@ -0,0 +1,5 @@ +Common libraries shared by Prometheus Go components. +Copyright 2015 The Prometheus Authors + +This product includes software developed at +SoundCloud Ltd. (http://soundcloud.com/). diff --git a/api/vendor/github.com/prometheus/common/README.md b/api/vendor/github.com/prometheus/common/README.md new file mode 100644 index 0000000..47985e4 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/README.md @@ -0,0 +1,12 @@ +# Common +[![Build Status](https://travis-ci.org/prometheus/common.svg)](https://travis-ci.org/prometheus/common) + +This repository contains Go libraries that are shared across Prometheus +components and libraries. + +* **config**: Common configuration structures +* **expfmt**: Decoding and encoding for the exposition format +* **log**: A logging wrapper around [logrus](https://github.com/sirupsen/logrus) +* **model**: Shared data structures +* **route**: A routing wrapper around [httprouter](https://github.com/julienschmidt/httprouter) using `context.Context` +* **version**: Version information and metrics diff --git a/api/vendor/github.com/prometheus/common/config/config.go b/api/vendor/github.com/prometheus/common/config/config.go new file mode 100644 index 0000000..30719d8 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/config/config.go @@ -0,0 +1,34 @@ +// Copyright 2016 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. + +// This package no longer handles safe yaml parsing. In order to +// ensure correct yaml unmarshalling, use "yaml.UnmarshalStrict()". + +package config + +// Secret special type for storing secrets. +type Secret string + +// MarshalYAML implements the yaml.Marshaler interface for Secrets. +func (s Secret) MarshalYAML() (interface{}, error) { + if s != "" { + return "", nil + } + return nil, nil +} + +//UnmarshalYAML implements the yaml.Unmarshaler interface for Secrets. +func (s *Secret) UnmarshalYAML(unmarshal func(interface{}) error) error { + type plain Secret + return unmarshal((*plain)(s)) +} diff --git a/api/vendor/github.com/prometheus/common/config/http_config.go b/api/vendor/github.com/prometheus/common/config/http_config.go new file mode 100644 index 0000000..da5d590 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/config/http_config.go @@ -0,0 +1,317 @@ +// Copyright 2016 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 config + +import ( + "crypto/tls" + "crypto/x509" + "fmt" + "io/ioutil" + "net/http" + "net/url" + "strings" + "time" + + "github.com/mwitkow/go-conntrack" + "gopkg.in/yaml.v2" +) + +// BasicAuth contains basic HTTP authentication credentials. +type BasicAuth struct { + Username string `yaml:"username"` + Password Secret `yaml:"password,omitempty"` + PasswordFile string `yaml:"password_file,omitempty"` +} + +// URL is a custom URL type that allows validation at configuration load time. +type URL struct { + *url.URL +} + +// UnmarshalYAML implements the yaml.Unmarshaler interface for URLs. +func (u *URL) UnmarshalYAML(unmarshal func(interface{}) error) error { + var s string + if err := unmarshal(&s); err != nil { + return err + } + + urlp, err := url.Parse(s) + if err != nil { + return err + } + u.URL = urlp + return nil +} + +// MarshalYAML implements the yaml.Marshaler interface for URLs. +func (u URL) MarshalYAML() (interface{}, error) { + if u.URL != nil { + return u.String(), nil + } + return nil, nil +} + +// HTTPClientConfig configures an HTTP client. +type HTTPClientConfig struct { + // The HTTP basic authentication credentials for the targets. + BasicAuth *BasicAuth `yaml:"basic_auth,omitempty"` + // The bearer token for the targets. + BearerToken Secret `yaml:"bearer_token,omitempty"` + // The bearer token file for the targets. + BearerTokenFile string `yaml:"bearer_token_file,omitempty"` + // HTTP proxy server to use to connect to the targets. + ProxyURL URL `yaml:"proxy_url,omitempty"` + // TLSConfig to use to connect to the targets. + TLSConfig TLSConfig `yaml:"tls_config,omitempty"` +} + +// Validate validates the HTTPClientConfig to check only one of BearerToken, +// BasicAuth and BearerTokenFile is configured. +func (c *HTTPClientConfig) Validate() error { + if len(c.BearerToken) > 0 && len(c.BearerTokenFile) > 0 { + return fmt.Errorf("at most one of bearer_token & bearer_token_file must be configured") + } + if c.BasicAuth != nil && (len(c.BearerToken) > 0 || len(c.BearerTokenFile) > 0) { + return fmt.Errorf("at most one of basic_auth, bearer_token & bearer_token_file must be configured") + } + if c.BasicAuth != nil && (string(c.BasicAuth.Password) != "" && c.BasicAuth.PasswordFile != "") { + return fmt.Errorf("at most one of basic_auth password & password_file must be configured") + } + return nil +} + +// UnmarshalYAML implements the yaml.Unmarshaler interface +func (c *HTTPClientConfig) UnmarshalYAML(unmarshal func(interface{}) error) error { + type plain HTTPClientConfig + if err := unmarshal((*plain)(c)); err != nil { + return err + } + return c.Validate() +} + +// UnmarshalYAML implements the yaml.Unmarshaler interface. +func (a *BasicAuth) UnmarshalYAML(unmarshal func(interface{}) error) error { + type plain BasicAuth + return unmarshal((*plain)(a)) +} + +// NewClient returns a http.Client using the specified http.RoundTripper. +func newClient(rt http.RoundTripper) *http.Client { + return &http.Client{Transport: rt} +} + +// NewClientFromConfig returns a new HTTP client configured for the +// given config.HTTPClientConfig. The name is used as go-conntrack metric label. +func NewClientFromConfig(cfg HTTPClientConfig, name string) (*http.Client, error) { + rt, err := NewRoundTripperFromConfig(cfg, name) + if err != nil { + return nil, err + } + return newClient(rt), nil +} + +// NewRoundTripperFromConfig returns a new HTTP RoundTripper configured for the +// given config.HTTPClientConfig. The name is used as go-conntrack metric label. +func NewRoundTripperFromConfig(cfg HTTPClientConfig, name string) (http.RoundTripper, error) { + tlsConfig, err := NewTLSConfig(&cfg.TLSConfig) + if err != nil { + return nil, err + } + // The only timeout we care about is the configured scrape timeout. + // It is applied on request. So we leave out any timings here. + var rt http.RoundTripper = &http.Transport{ + Proxy: http.ProxyURL(cfg.ProxyURL.URL), + MaxIdleConns: 20000, + MaxIdleConnsPerHost: 1000, // see https://github.com/golang/go/issues/13801 + DisableKeepAlives: false, + TLSClientConfig: tlsConfig, + DisableCompression: true, + // 5 minutes is typically above the maximum sane scrape interval. So we can + // use keepalive for all configurations. + IdleConnTimeout: 5 * time.Minute, + DialContext: conntrack.NewDialContextFunc( + conntrack.DialWithTracing(), + conntrack.DialWithName(name), + ), + } + + // If a bearer token is provided, create a round tripper that will set the + // Authorization header correctly on each request. + if len(cfg.BearerToken) > 0 { + rt = NewBearerAuthRoundTripper(cfg.BearerToken, rt) + } else if len(cfg.BearerTokenFile) > 0 { + rt = NewBearerAuthFileRoundTripper(cfg.BearerTokenFile, rt) + } + + if cfg.BasicAuth != nil { + rt = NewBasicAuthRoundTripper(cfg.BasicAuth.Username, cfg.BasicAuth.Password, cfg.BasicAuth.PasswordFile, rt) + } + + // Return a new configured RoundTripper. + return rt, nil +} + +type bearerAuthRoundTripper struct { + bearerToken Secret + rt http.RoundTripper +} + +// NewBearerAuthRoundTripper adds the provided bearer token to a request unless the authorization +// header has already been set. +func NewBearerAuthRoundTripper(token Secret, rt http.RoundTripper) http.RoundTripper { + return &bearerAuthRoundTripper{token, rt} +} + +func (rt *bearerAuthRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + if len(req.Header.Get("Authorization")) == 0 { + req = cloneRequest(req) + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", string(rt.bearerToken))) + } + return rt.rt.RoundTrip(req) +} + +type bearerAuthFileRoundTripper struct { + bearerFile string + rt http.RoundTripper +} + +// NewBearerAuthFileRoundTripper adds the bearer token read from the provided file to a request unless +// the authorization header has already been set. This file is read for every request. +func NewBearerAuthFileRoundTripper(bearerFile string, rt http.RoundTripper) http.RoundTripper { + return &bearerAuthFileRoundTripper{bearerFile, rt} +} + +func (rt *bearerAuthFileRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + if len(req.Header.Get("Authorization")) == 0 { + b, err := ioutil.ReadFile(rt.bearerFile) + if err != nil { + return nil, fmt.Errorf("unable to read bearer token file %s: %s", rt.bearerFile, err) + } + bearerToken := strings.TrimSpace(string(b)) + + req = cloneRequest(req) + req.Header.Set("Authorization", "Bearer "+bearerToken) + } + + return rt.rt.RoundTrip(req) +} + +type basicAuthRoundTripper struct { + username string + password Secret + passwordFile string + rt http.RoundTripper +} + +// NewBasicAuthRoundTripper will apply a BASIC auth authorization header to a request unless it has +// already been set. +func NewBasicAuthRoundTripper(username string, password Secret, passwordFile string, rt http.RoundTripper) http.RoundTripper { + return &basicAuthRoundTripper{username, password, passwordFile, rt} +} + +func (rt *basicAuthRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + if len(req.Header.Get("Authorization")) != 0 { + return rt.rt.RoundTrip(req) + } + req = cloneRequest(req) + if rt.passwordFile != "" { + bs, err := ioutil.ReadFile(rt.passwordFile) + if err != nil { + return nil, fmt.Errorf("unable to read basic auth password file %s: %s", rt.passwordFile, err) + } + req.SetBasicAuth(rt.username, strings.TrimSpace(string(bs))) + } else { + req.SetBasicAuth(rt.username, strings.TrimSpace(string(rt.password))) + } + return rt.rt.RoundTrip(req) +} + +// cloneRequest returns a clone of the provided *http.Request. +// The clone is a shallow copy of the struct and its Header map. +func cloneRequest(r *http.Request) *http.Request { + // Shallow copy of the struct. + r2 := new(http.Request) + *r2 = *r + // Deep copy of the Header. + r2.Header = make(http.Header) + for k, s := range r.Header { + r2.Header[k] = s + } + return r2 +} + +// NewTLSConfig creates a new tls.Config from the given TLSConfig. +func NewTLSConfig(cfg *TLSConfig) (*tls.Config, error) { + tlsConfig := &tls.Config{InsecureSkipVerify: cfg.InsecureSkipVerify} + + // If a CA cert is provided then let's read it in so we can validate the + // scrape target's certificate properly. + if len(cfg.CAFile) > 0 { + caCertPool := x509.NewCertPool() + // Load CA cert. + caCert, err := ioutil.ReadFile(cfg.CAFile) + if err != nil { + return nil, fmt.Errorf("unable to use specified CA cert %s: %s", cfg.CAFile, err) + } + caCertPool.AppendCertsFromPEM(caCert) + tlsConfig.RootCAs = caCertPool + } + + if len(cfg.ServerName) > 0 { + tlsConfig.ServerName = cfg.ServerName + } + // If a client cert & key is provided then configure TLS config accordingly. + if len(cfg.CertFile) > 0 && len(cfg.KeyFile) == 0 { + return nil, fmt.Errorf("client cert file %q specified without client key file", cfg.CertFile) + } else if len(cfg.KeyFile) > 0 && len(cfg.CertFile) == 0 { + return nil, fmt.Errorf("client key file %q specified without client cert file", cfg.KeyFile) + } else if len(cfg.CertFile) > 0 && len(cfg.KeyFile) > 0 { + cert, err := tls.LoadX509KeyPair(cfg.CertFile, cfg.KeyFile) + if err != nil { + return nil, fmt.Errorf("unable to use specified client cert (%s) & key (%s): %s", cfg.CertFile, cfg.KeyFile, err) + } + tlsConfig.Certificates = []tls.Certificate{cert} + } + tlsConfig.BuildNameToCertificate() + + return tlsConfig, nil +} + +// TLSConfig configures the options for TLS connections. +type TLSConfig struct { + // The CA cert to use for the targets. + CAFile string `yaml:"ca_file,omitempty"` + // The client cert file for the targets. + CertFile string `yaml:"cert_file,omitempty"` + // The client key file for the targets. + KeyFile string `yaml:"key_file,omitempty"` + // Used to verify the hostname for the targets. + ServerName string `yaml:"server_name,omitempty"` + // Disable target certificate validation. + InsecureSkipVerify bool `yaml:"insecure_skip_verify"` +} + +// UnmarshalYAML implements the yaml.Unmarshaler interface. +func (c *TLSConfig) UnmarshalYAML(unmarshal func(interface{}) error) error { + type plain TLSConfig + return unmarshal((*plain)(c)) +} + +func (c HTTPClientConfig) String() string { + b, err := yaml.Marshal(c) + if err != nil { + return fmt.Sprintf("", err) + } + return string(b) +} diff --git a/api/vendor/github.com/prometheus/common/config/http_config_test.go b/api/vendor/github.com/prometheus/common/config/http_config_test.go new file mode 100644 index 0000000..4639ae4 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/config/http_config_test.go @@ -0,0 +1,618 @@ +// Copyright 2015 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 config + +import ( + "crypto/tls" + "crypto/x509" + "fmt" + "io/ioutil" + "net/http" + "net/http/httptest" + "reflect" + "strings" + "testing" + + "gopkg.in/yaml.v2" +) + +const ( + TLSCAChainPath = "testdata/tls-ca-chain.pem" + ServerCertificatePath = "testdata/server.crt" + ServerKeyPath = "testdata/server.key" + BarneyCertificatePath = "testdata/barney.crt" + BarneyKeyNoPassPath = "testdata/barney-no-pass.key" + MissingCA = "missing/ca.crt" + MissingCert = "missing/cert.crt" + MissingKey = "missing/secret.key" + + ExpectedMessage = "I'm here to serve you!!!" + BearerToken = "theanswertothegreatquestionoflifetheuniverseandeverythingisfortytwo" + BearerTokenFile = "testdata/bearer.token" + MissingBearerTokenFile = "missing/bearer.token" + ExpectedBearer = "Bearer " + BearerToken + ExpectedUsername = "arthurdent" + ExpectedPassword = "42" +) + +var invalidHTTPClientConfigs = []struct { + httpClientConfigFile string + errMsg string +}{ + { + httpClientConfigFile: "testdata/http.conf.bearer-token-and-file-set.bad.yml", + errMsg: "at most one of bearer_token & bearer_token_file must be configured", + }, + { + httpClientConfigFile: "testdata/http.conf.empty.bad.yml", + errMsg: "at most one of basic_auth, bearer_token & bearer_token_file must be configured", + }, + { + httpClientConfigFile: "testdata/http.conf.basic-auth.too-much.bad.yaml", + errMsg: "at most one of basic_auth password & password_file must be configured", + }, +} + +func newTestServer(handler func(w http.ResponseWriter, r *http.Request)) (*httptest.Server, error) { + testServer := httptest.NewUnstartedServer(http.HandlerFunc(handler)) + + tlsCAChain, err := ioutil.ReadFile(TLSCAChainPath) + if err != nil { + return nil, fmt.Errorf("Can't read %s", TLSCAChainPath) + } + serverCertificate, err := tls.LoadX509KeyPair(ServerCertificatePath, ServerKeyPath) + if err != nil { + return nil, fmt.Errorf("Can't load X509 key pair %s - %s", ServerCertificatePath, ServerKeyPath) + } + + rootCAs := x509.NewCertPool() + rootCAs.AppendCertsFromPEM(tlsCAChain) + + testServer.TLS = &tls.Config{ + Certificates: make([]tls.Certificate, 1), + RootCAs: rootCAs, + ClientAuth: tls.RequireAndVerifyClientCert, + ClientCAs: rootCAs} + testServer.TLS.Certificates[0] = serverCertificate + testServer.TLS.BuildNameToCertificate() + + testServer.StartTLS() + + return testServer, nil +} + +func TestNewClientFromConfig(t *testing.T) { + var newClientValidConfig = []struct { + clientConfig HTTPClientConfig + handler func(w http.ResponseWriter, r *http.Request) + }{ + { + clientConfig: HTTPClientConfig{ + TLSConfig: TLSConfig{ + CAFile: "", + CertFile: BarneyCertificatePath, + KeyFile: BarneyKeyNoPassPath, + ServerName: "", + InsecureSkipVerify: true}, + }, + handler: func(w http.ResponseWriter, r *http.Request) { + fmt.Fprint(w, ExpectedMessage) + }, + }, { + clientConfig: HTTPClientConfig{ + TLSConfig: TLSConfig{ + CAFile: TLSCAChainPath, + CertFile: BarneyCertificatePath, + KeyFile: BarneyKeyNoPassPath, + ServerName: "", + InsecureSkipVerify: false}, + }, + handler: func(w http.ResponseWriter, r *http.Request) { + fmt.Fprint(w, ExpectedMessage) + }, + }, { + clientConfig: HTTPClientConfig{ + BearerToken: BearerToken, + TLSConfig: TLSConfig{ + CAFile: TLSCAChainPath, + CertFile: BarneyCertificatePath, + KeyFile: BarneyKeyNoPassPath, + ServerName: "", + InsecureSkipVerify: false}, + }, + handler: func(w http.ResponseWriter, r *http.Request) { + bearer := r.Header.Get("Authorization") + if bearer != ExpectedBearer { + fmt.Fprintf(w, "The expected Bearer Authorization (%s) differs from the obtained Bearer Authorization (%s)", + ExpectedBearer, bearer) + } else { + fmt.Fprint(w, ExpectedMessage) + } + }, + }, { + clientConfig: HTTPClientConfig{ + BearerTokenFile: BearerTokenFile, + TLSConfig: TLSConfig{ + CAFile: TLSCAChainPath, + CertFile: BarneyCertificatePath, + KeyFile: BarneyKeyNoPassPath, + ServerName: "", + InsecureSkipVerify: false}, + }, + handler: func(w http.ResponseWriter, r *http.Request) { + bearer := r.Header.Get("Authorization") + if bearer != ExpectedBearer { + fmt.Fprintf(w, "The expected Bearer Authorization (%s) differs from the obtained Bearer Authorization (%s)", + ExpectedBearer, bearer) + } else { + fmt.Fprint(w, ExpectedMessage) + } + }, + }, { + clientConfig: HTTPClientConfig{ + BasicAuth: &BasicAuth{ + Username: ExpectedUsername, + Password: ExpectedPassword, + }, + TLSConfig: TLSConfig{ + CAFile: TLSCAChainPath, + CertFile: BarneyCertificatePath, + KeyFile: BarneyKeyNoPassPath, + ServerName: "", + InsecureSkipVerify: false}, + }, + handler: func(w http.ResponseWriter, r *http.Request) { + username, password, ok := r.BasicAuth() + if !ok { + fmt.Fprintf(w, "The Authorization header wasn't set") + } else if ExpectedUsername != username { + fmt.Fprintf(w, "The expected username (%s) differs from the obtained username (%s).", ExpectedUsername, username) + } else if ExpectedPassword != password { + fmt.Fprintf(w, "The expected password (%s) differs from the obtained password (%s).", ExpectedPassword, password) + } else { + fmt.Fprint(w, ExpectedMessage) + } + }, + }, + } + + for _, validConfig := range newClientValidConfig { + testServer, err := newTestServer(validConfig.handler) + if err != nil { + t.Fatal(err.Error()) + } + defer testServer.Close() + + client, err := NewClientFromConfig(validConfig.clientConfig, "test") + if err != nil { + t.Errorf("Can't create a client from this config: %+v", validConfig.clientConfig) + continue + } + response, err := client.Get(testServer.URL) + if err != nil { + t.Errorf("Can't connect to the test server using this config: %+v", validConfig.clientConfig) + continue + } + + message, err := ioutil.ReadAll(response.Body) + response.Body.Close() + if err != nil { + t.Errorf("Can't read the server response body using this config: %+v", validConfig.clientConfig) + continue + } + + trimMessage := strings.TrimSpace(string(message)) + if ExpectedMessage != trimMessage { + t.Errorf("The expected message (%s) differs from the obtained message (%s) using this config: %+v", + ExpectedMessage, trimMessage, validConfig.clientConfig) + } + } +} + +func TestNewClientFromInvalidConfig(t *testing.T) { + var newClientInvalidConfig = []struct { + clientConfig HTTPClientConfig + errorMsg string + }{ + { + clientConfig: HTTPClientConfig{ + TLSConfig: TLSConfig{ + CAFile: MissingCA, + CertFile: "", + KeyFile: "", + ServerName: "", + InsecureSkipVerify: true}, + }, + errorMsg: fmt.Sprintf("unable to use specified CA cert %s:", MissingCA), + }, + } + + for _, invalidConfig := range newClientInvalidConfig { + client, err := NewClientFromConfig(invalidConfig.clientConfig, "test") + if client != nil { + t.Errorf("A client instance was returned instead of nil using this config: %+v", invalidConfig.clientConfig) + } + if err == nil { + t.Errorf("No error was returned using this config: %+v", invalidConfig.clientConfig) + } + if !strings.Contains(err.Error(), invalidConfig.errorMsg) { + t.Errorf("Expected error %s does not contain %s", err.Error(), invalidConfig.errorMsg) + } + } +} + +func TestMissingBearerAuthFile(t *testing.T) { + cfg := HTTPClientConfig{ + BearerTokenFile: MissingBearerTokenFile, + TLSConfig: TLSConfig{ + CAFile: TLSCAChainPath, + CertFile: BarneyCertificatePath, + KeyFile: BarneyKeyNoPassPath, + ServerName: "", + InsecureSkipVerify: false}, + } + handler := func(w http.ResponseWriter, r *http.Request) { + bearer := r.Header.Get("Authorization") + if bearer != ExpectedBearer { + fmt.Fprintf(w, "The expected Bearer Authorization (%s) differs from the obtained Bearer Authorization (%s)", + ExpectedBearer, bearer) + } else { + fmt.Fprint(w, ExpectedMessage) + } + } + + testServer, err := newTestServer(handler) + if err != nil { + t.Fatal(err.Error()) + } + defer testServer.Close() + + client, err := NewClientFromConfig(cfg, "test") + if err != nil { + t.Fatal(err) + } + + _, err = client.Get(testServer.URL) + if err == nil { + t.Fatal("No error is returned here") + } + + if !strings.Contains(err.Error(), "unable to read bearer token file missing/bearer.token: open missing/bearer.token: no such file or directory") { + t.Fatal("wrong error message being returned") + } +} + +func TestBearerAuthRoundTripper(t *testing.T) { + const ( + newBearerToken = "goodbyeandthankyouforthefish" + ) + + fakeRoundTripper := NewRoundTripCheckRequest(func(req *http.Request) { + bearer := req.Header.Get("Authorization") + if bearer != ExpectedBearer { + t.Errorf("The expected Bearer Authorization (%s) differs from the obtained Bearer Authorization (%s)", + ExpectedBearer, bearer) + } + }, nil, nil) + + // Normal flow. + bearerAuthRoundTripper := NewBearerAuthRoundTripper(BearerToken, fakeRoundTripper) + request, _ := http.NewRequest("GET", "/hitchhiker", nil) + request.Header.Set("User-Agent", "Douglas Adams mind") + bearerAuthRoundTripper.RoundTrip(request) + + // Should honor already Authorization header set. + bearerAuthRoundTripperShouldNotModifyExistingAuthorization := NewBearerAuthRoundTripper(newBearerToken, fakeRoundTripper) + request, _ = http.NewRequest("GET", "/hitchhiker", nil) + request.Header.Set("Authorization", ExpectedBearer) + bearerAuthRoundTripperShouldNotModifyExistingAuthorization.RoundTrip(request) +} + +func TestBearerAuthFileRoundTripper(t *testing.T) { + const ( + newBearerToken = "goodbyeandthankyouforthefish" + ) + + fakeRoundTripper := NewRoundTripCheckRequest(func(req *http.Request) { + bearer := req.Header.Get("Authorization") + if bearer != ExpectedBearer { + t.Errorf("The expected Bearer Authorization (%s) differs from the obtained Bearer Authorization (%s)", + ExpectedBearer, bearer) + } + }, nil, nil) + + // Normal flow. + bearerAuthRoundTripper := NewBearerAuthFileRoundTripper(BearerTokenFile, fakeRoundTripper) + request, _ := http.NewRequest("GET", "/hitchhiker", nil) + request.Header.Set("User-Agent", "Douglas Adams mind") + bearerAuthRoundTripper.RoundTrip(request) + + // Should honor already Authorization header set. + bearerAuthRoundTripperShouldNotModifyExistingAuthorization := NewBearerAuthFileRoundTripper(MissingBearerTokenFile, fakeRoundTripper) + request, _ = http.NewRequest("GET", "/hitchhiker", nil) + request.Header.Set("Authorization", ExpectedBearer) + bearerAuthRoundTripperShouldNotModifyExistingAuthorization.RoundTrip(request) +} + +func TestTLSConfig(t *testing.T) { + configTLSConfig := TLSConfig{ + CAFile: TLSCAChainPath, + CertFile: BarneyCertificatePath, + KeyFile: BarneyKeyNoPassPath, + ServerName: "localhost", + InsecureSkipVerify: false} + + tlsCAChain, err := ioutil.ReadFile(TLSCAChainPath) + if err != nil { + t.Fatalf("Can't read the CA certificate chain (%s)", + TLSCAChainPath) + } + rootCAs := x509.NewCertPool() + rootCAs.AppendCertsFromPEM(tlsCAChain) + + barneyCertificate, err := tls.LoadX509KeyPair(BarneyCertificatePath, BarneyKeyNoPassPath) + if err != nil { + t.Fatalf("Can't load the client key pair ('%s' and '%s'). Reason: %s", + BarneyCertificatePath, BarneyKeyNoPassPath, err) + } + + expectedTLSConfig := &tls.Config{ + RootCAs: rootCAs, + Certificates: []tls.Certificate{barneyCertificate}, + ServerName: configTLSConfig.ServerName, + InsecureSkipVerify: configTLSConfig.InsecureSkipVerify} + expectedTLSConfig.BuildNameToCertificate() + + tlsConfig, err := NewTLSConfig(&configTLSConfig) + if err != nil { + t.Fatalf("Can't create a new TLS Config from a configuration (%s).", err) + } + + if !reflect.DeepEqual(tlsConfig, expectedTLSConfig) { + t.Fatalf("Unexpected TLS Config result: \n\n%+v\n expected\n\n%+v", tlsConfig, expectedTLSConfig) + } +} + +func TestTLSConfigEmpty(t *testing.T) { + configTLSConfig := TLSConfig{ + CAFile: "", + CertFile: "", + KeyFile: "", + ServerName: "", + InsecureSkipVerify: true} + + expectedTLSConfig := &tls.Config{ + InsecureSkipVerify: configTLSConfig.InsecureSkipVerify} + expectedTLSConfig.BuildNameToCertificate() + + tlsConfig, err := NewTLSConfig(&configTLSConfig) + if err != nil { + t.Fatalf("Can't create a new TLS Config from a configuration (%s).", err) + } + + if !reflect.DeepEqual(tlsConfig, expectedTLSConfig) { + t.Fatalf("Unexpected TLS Config result: \n\n%+v\n expected\n\n%+v", tlsConfig, expectedTLSConfig) + } +} + +func TestTLSConfigInvalidCA(t *testing.T) { + var invalidTLSConfig = []struct { + configTLSConfig TLSConfig + errorMessage string + }{ + { + configTLSConfig: TLSConfig{ + CAFile: MissingCA, + CertFile: "", + KeyFile: "", + ServerName: "", + InsecureSkipVerify: false}, + errorMessage: fmt.Sprintf("unable to use specified CA cert %s:", MissingCA), + }, { + configTLSConfig: TLSConfig{ + CAFile: "", + CertFile: MissingCert, + KeyFile: BarneyKeyNoPassPath, + ServerName: "", + InsecureSkipVerify: false}, + errorMessage: fmt.Sprintf("unable to use specified client cert (%s) & key (%s):", MissingCert, BarneyKeyNoPassPath), + }, { + configTLSConfig: TLSConfig{ + CAFile: "", + CertFile: BarneyCertificatePath, + KeyFile: MissingKey, + ServerName: "", + InsecureSkipVerify: false}, + errorMessage: fmt.Sprintf("unable to use specified client cert (%s) & key (%s):", BarneyCertificatePath, MissingKey), + }, + } + + for _, anInvalididTLSConfig := range invalidTLSConfig { + tlsConfig, err := NewTLSConfig(&anInvalididTLSConfig.configTLSConfig) + if tlsConfig != nil && err == nil { + t.Errorf("The TLS Config could be created even with this %+v", anInvalididTLSConfig.configTLSConfig) + continue + } + if !strings.Contains(err.Error(), anInvalididTLSConfig.errorMessage) { + t.Errorf("The expected error should contain %s, but got %s", anInvalididTLSConfig.errorMessage, err) + } + } +} + +func TestBasicAuthNoPassword(t *testing.T) { + cfg, _, err := LoadHTTPConfigFile("testdata/http.conf.basic-auth.no-password.yaml") + if err != nil { + t.Errorf("Error loading HTTP client config: %v", err) + } + client, err := NewClientFromConfig(*cfg, "test") + if err != nil { + t.Errorf("Error creating HTTP Client: %v", err) + } + + rt, ok := client.Transport.(*basicAuthRoundTripper) + if !ok { + t.Fatalf("Error casting to basic auth transport, %v", client.Transport) + } + + if rt.username != "user" { + t.Errorf("Bad HTTP client username: %s", rt.username) + } + if string(rt.password) != "" { + t.Errorf("Expected empty HTTP client password: %s", rt.password) + } + if string(rt.passwordFile) != "" { + t.Errorf("Expected empty HTTP client passwordFile: %s", rt.passwordFile) + } +} + +func TestBasicAuthNoUsername(t *testing.T) { + cfg, _, err := LoadHTTPConfigFile("testdata/http.conf.basic-auth.no-username.yaml") + if err != nil { + t.Errorf("Error loading HTTP client config: %v", err) + } + client, err := NewClientFromConfig(*cfg, "test") + if err != nil { + t.Errorf("Error creating HTTP Client: %v", err) + } + + rt, ok := client.Transport.(*basicAuthRoundTripper) + if !ok { + t.Fatalf("Error casting to basic auth transport, %v", client.Transport) + } + + if rt.username != "" { + t.Errorf("Got unexpected username: %s", rt.username) + } + if string(rt.password) != "secret" { + t.Errorf("Unexpected HTTP client password: %s", string(rt.password)) + } + if string(rt.passwordFile) != "" { + t.Errorf("Expected empty HTTP client passwordFile: %s", rt.passwordFile) + } +} + +func TestBasicAuthPasswordFile(t *testing.T) { + cfg, _, err := LoadHTTPConfigFile("testdata/http.conf.basic-auth.good.yaml") + if err != nil { + t.Errorf("Error loading HTTP client config: %v", err) + } + client, err := NewClientFromConfig(*cfg, "test") + if err != nil { + t.Errorf("Error creating HTTP Client: %v", err) + } + + rt, ok := client.Transport.(*basicAuthRoundTripper) + if !ok { + t.Errorf("Error casting to basic auth transport, %v", client.Transport) + } + + if rt.username != "user" { + t.Errorf("Bad HTTP client username: %s", rt.username) + } + if string(rt.password) != "" { + t.Errorf("Bad HTTP client password: %s", rt.password) + } + if string(rt.passwordFile) != "testdata/basic-auth-password" { + t.Errorf("Bad HTTP client passwordFile: %s", rt.passwordFile) + } +} + +func TestHideHTTPClientConfigSecrets(t *testing.T) { + c, _, err := LoadHTTPConfigFile("testdata/http.conf.good.yml") + if err != nil { + t.Errorf("Error parsing %s: %s", "testdata/http.conf.good.yml", err) + } + + // String method must not reveal authentication credentials. + s := c.String() + if strings.Contains(s, "mysecret") { + t.Fatal("http client config's String method reveals authentication credentials.") + } +} + +func TestValidateHTTPConfig(t *testing.T) { + cfg, _, err := LoadHTTPConfigFile("testdata/http.conf.good.yml") + if err != nil { + t.Errorf("Error loading HTTP client config: %v", err) + } + err = cfg.Validate() + if err != nil { + t.Fatalf("Error validating %s: %s", "testdata/http.conf.good.yml", err) + } +} + +func TestInvalidHTTPConfigs(t *testing.T) { + for _, ee := range invalidHTTPClientConfigs { + _, _, err := LoadHTTPConfigFile(ee.httpClientConfigFile) + if err == nil { + t.Error("Expected error with config but got none") + continue + } + if !strings.Contains(err.Error(), ee.errMsg) { + t.Errorf("Expected error for invalid HTTP client configuration to contain %q but got: %s", ee.errMsg, err) + } + } +} + +// LoadHTTPConfig parses the YAML input s into a HTTPClientConfig. +func LoadHTTPConfig(s string) (*HTTPClientConfig, error) { + cfg := &HTTPClientConfig{} + err := yaml.UnmarshalStrict([]byte(s), cfg) + if err != nil { + return nil, err + } + return cfg, nil +} + +// LoadHTTPConfigFile parses the given YAML file into a HTTPClientConfig. +func LoadHTTPConfigFile(filename string) (*HTTPClientConfig, []byte, error) { + content, err := ioutil.ReadFile(filename) + if err != nil { + return nil, nil, err + } + cfg, err := LoadHTTPConfig(string(content)) + if err != nil { + return nil, nil, err + } + return cfg, content, nil +} + +type roundTrip struct { + theResponse *http.Response + theError error +} + +func (rt *roundTrip) RoundTrip(r *http.Request) (*http.Response, error) { + return rt.theResponse, rt.theError +} + +type roundTripCheckRequest struct { + checkRequest func(*http.Request) + roundTrip +} + +func (rt *roundTripCheckRequest) RoundTrip(r *http.Request) (*http.Response, error) { + rt.checkRequest(r) + return rt.theResponse, rt.theError +} + +// NewRoundTripCheckRequest creates a new instance of a type that implements http.RoundTripper, +// which before returning theResponse and theError, executes checkRequest against a http.Request. +func NewRoundTripCheckRequest(checkRequest func(*http.Request), theResponse *http.Response, theError error) http.RoundTripper { + return &roundTripCheckRequest{ + checkRequest: checkRequest, + roundTrip: roundTrip{ + theResponse: theResponse, + theError: theError}} +} diff --git a/api/vendor/github.com/prometheus/common/config/testdata/barney-no-pass.key b/api/vendor/github.com/prometheus/common/config/testdata/barney-no-pass.key new file mode 100644 index 0000000..b8e44f5 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/config/testdata/barney-no-pass.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpQIBAAKCAQEAxmYjfBZhZbAup9uSULehoqPCv/U+77ETxUNyS2nviWEHDAb/ +pFS8Btx4oCQ1ECVSyxcUmXSlrvDjMY4sisOHvndNRlGi274M5a8Q5yD1BUqvxq3u +XB/+SYNVShBzaswrSjpzMe89AlOPxPjnE14OXh00j2hHunOG4jhlWgJnY0YyvUQQ +YWO6KrmKMiZ4MgmY0SWh/ZhlkDJPtkp3aUVM2sheCru/70E9viLGfdlhc2pIMshy +wNp4/5IkHBZwbqXFFGX4sRtSXI/auZNvcHOBse+3e3BonWvBWS2lIYbzpX3vLB7B +E9BGIxWn1fgNQr14yFPaccSszBvgtmEUONolnwIDAQABAoIBAQC7nBhQHgXKGBl2 +Z97rb0pstrjRtsLl/Cg68LWi9LEr0tHMIM4bgnkvb8qtfK+k7fZl0BSNrE2EqYvd +75jVO2MgzEYJieccLpKZm7u7JGIut9qSYSU2fpaCw6uiVv4dbqY9EhqejKG/km8w +j0JMATRK8Qkj1zOE7/wL7dKBlCZaK3u+OT17spuA/21PG/cLiPaSGSA3CU/eqbkU +BD6JeBxp33XNTytwWoOvarsigpL0dGqQ7+qhGq6t69qFfWoe9rimV7Ya+tB9zF/U +HzOIEspOYvzxe+C7VJjlVFr4haMYmsrO9qRUJ2ofp49OLVdfEANsdVISSvS63BEp +gBZN8Ko5AoGBAO1z8y8YCsI+2vBG6nxZ1eMba0KHi3bS8db1TaenJBV22w6WQATh +hEaU6VLMFcMvrOUjXN/7HJfnEMyvFT6gb9obPDVEMZw88s9lVN6njgGLZR/jodyN +7N7utLopN043Ra0WfEILAXPSz8esT1yn05OZV6AFHxJEWMrX3/4+spCLAoGBANXl +RomieVY4u3FF/uzhbzKNNb9ETxrQuexfbangKp5eLniwnr2SQWIbyPzeurwp15J8 +HvxB2vpNvs1khSwNx9dQfMdiUVPGLWj7MimAHTHsnQ9LVV9W28ghuSWbjQDGTUt1 +WCCu1MkKIOzupbi+zgsNlI33yilRQKAb9SRxdy29AoGBAOKpvyZiPcrkMxwPpb/k +BU7QGpgcSR25CQ+Xg3QZEVHH7h1DgYLnPtwdQ4g8tj1mohTsp7hKvSWndRrdulrY +zUyWmOeD3BN2/pTI9rW/nceNp49EPHsLo2O+2xelRlzMWB98ikqEtPM59gt1SSB6 +N3X6d3GR0fIe+d9PKEtK0Cs3AoGAZ9r8ReXSvm+ra5ON9Nx8znHMEAON2TpRnBi1 +uY7zgpO+QrGXUfqKrqVJEKbgym4SkribnuYm+fP32eid1McYKk6VV4ZAcMm/0MJv +F8Fx64S0ufFdEX6uFl1xdXYyn5apfyMJ2EyrWrYFSKWTZ8GVb753S/tteGRQWa1Z +eQly0Y0CgYEAnI6G9KFvXI+MLu5y2LPYAwsesDFzaWwyDl96ioQTA9hNSrjR33Vw +xwpiEe0T/WKF8NQ0QWnrQDbTvuCvZUK37TVxscYWuItL6vnBrYqr4Ck0j1BcGwV5 +jT581A/Vw8JJiR/vfcxgmrFYqoUmkMKDmCN1oImfz09GtQ4jQ1rlxz8= +-----END RSA PRIVATE KEY----- diff --git a/api/vendor/github.com/prometheus/common/config/testdata/barney.crt b/api/vendor/github.com/prometheus/common/config/testdata/barney.crt new file mode 100644 index 0000000..e2f9504 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/config/testdata/barney.crt @@ -0,0 +1,96 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 2 (0x2) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=NO, O=Green AS, OU=Green Certificate Authority, CN=Green TLS CA + Validity + Not Before: Jul 13 04:02:47 2017 GMT + Not After : Jul 13 04:02:47 2019 GMT + Subject: C=NO, O=Telenor AS, OU=Support, CN=Barney Rubble + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:c6:66:23:7c:16:61:65:b0:2e:a7:db:92:50:b7: + a1:a2:a3:c2:bf:f5:3e:ef:b1:13:c5:43:72:4b:69: + ef:89:61:07:0c:06:ff:a4:54:bc:06:dc:78:a0:24: + 35:10:25:52:cb:17:14:99:74:a5:ae:f0:e3:31:8e: + 2c:8a:c3:87:be:77:4d:46:51:a2:db:be:0c:e5:af: + 10:e7:20:f5:05:4a:af:c6:ad:ee:5c:1f:fe:49:83: + 55:4a:10:73:6a:cc:2b:4a:3a:73:31:ef:3d:02:53: + 8f:c4:f8:e7:13:5e:0e:5e:1d:34:8f:68:47:ba:73: + 86:e2:38:65:5a:02:67:63:46:32:bd:44:10:61:63: + ba:2a:b9:8a:32:26:78:32:09:98:d1:25:a1:fd:98: + 65:90:32:4f:b6:4a:77:69:45:4c:da:c8:5e:0a:bb: + bf:ef:41:3d:be:22:c6:7d:d9:61:73:6a:48:32:c8: + 72:c0:da:78:ff:92:24:1c:16:70:6e:a5:c5:14:65: + f8:b1:1b:52:5c:8f:da:b9:93:6f:70:73:81:b1:ef: + b7:7b:70:68:9d:6b:c1:59:2d:a5:21:86:f3:a5:7d: + ef:2c:1e:c1:13:d0:46:23:15:a7:d5:f8:0d:42:bd: + 78:c8:53:da:71:c4:ac:cc:1b:e0:b6:61:14:38:da: + 25:9f + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Key Usage: critical + Digital Signature + X509v3 Basic Constraints: + CA:FALSE + X509v3 Extended Key Usage: + TLS Web Client Authentication + X509v3 Subject Key Identifier: + F4:17:02:DD:1B:01:AB:C5:BC:17:A4:5C:4B:75:8E:EC:B1:E0:C8:F1 + X509v3 Authority Key Identifier: + keyid:AE:42:88:75:DD:05:A6:8E:48:7F:50:69:F9:B7:34:23:49:B8:B4:71 + + Authority Information Access: + CA Issuers - URI:http://green.no/ca/tls-ca.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://green.no/ca/tls-ca.crl + + X509v3 Subject Alternative Name: + email:barney@telenor.no + Signature Algorithm: sha1WithRSAEncryption + 96:9a:c5:41:8a:2f:4a:c4:80:d9:2b:1a:cf:07:85:e9:b6:18: + 01:20:41:b9:c3:d4:ca:d3:2d:66:c3:1d:52:7f:25:d7:92:0c: + e9:a9:ae:e6:2e:fa:9d:0a:cf:84:b9:03:f2:63:e3:d3:c9:70: + 6a:ac:04:5e:a9:2d:a2:43:7a:34:60:f7:a9:32:e1:48:ec:c6: + 03:ac:b3:06:2e:48:6e:d0:35:11:31:3d:0c:04:66:41:e6:b2: + ec:8c:68:f8:e4:bc:47:85:39:60:69:a9:8a:ee:2f:56:88:8a: + 19:45:d0:84:8e:c2:27:2c:82:9c:07:6c:34:ae:41:61:63:f9: + 32:cb:8b:33:ea:2c:15:5f:f9:35:b0:3c:51:4d:5f:30:de:0b: + 88:28:94:79:f3:bd:69:37:ad:12:20:e1:6b:1d:b6:77:d9:83: + db:81:a4:53:6c:0f:6a:17:5e:2b:c1:94:c6:42:e3:73:cd:9e: + 79:1b:8c:89:cd:da:ce:b0:f4:21:c5:32:25:04:6e:68:9f:a7: + ca:f4:c5:86:e5:4e:d9:fd:69:73:e6:15:50:6e:76:0f:73:5e: + 7a:a3:f4:dc:15:4a:ab:bb:3c:9a:fa:9f:01:7a:5c:47:a9:a3: + 68:1c:49:e0:37:37:77:af:87:07:16:e4:e1:d7:98:39:15:a6: + 51:5d:4c:db +-----BEGIN CERTIFICATE----- +MIIEITCCAwmgAwIBAgIBAjANBgkqhkiG9w0BAQUFADBdMQswCQYDVQQGEwJOTzER +MA8GA1UECgwIR3JlZW4gQVMxJDAiBgNVBAsMG0dyZWVuIENlcnRpZmljYXRlIEF1 +dGhvcml0eTEVMBMGA1UEAwwMR3JlZW4gVExTIENBMB4XDTE3MDcxMzA0MDI0N1oX +DTE5MDcxMzA0MDI0N1owTDELMAkGA1UEBhMCTk8xEzARBgNVBAoMClRlbGVub3Ig +QVMxEDAOBgNVBAsMB1N1cHBvcnQxFjAUBgNVBAMMDUJhcm5leSBSdWJibGUwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGZiN8FmFlsC6n25JQt6Gio8K/ +9T7vsRPFQ3JLae+JYQcMBv+kVLwG3HigJDUQJVLLFxSZdKWu8OMxjiyKw4e+d01G +UaLbvgzlrxDnIPUFSq/Gre5cH/5Jg1VKEHNqzCtKOnMx7z0CU4/E+OcTXg5eHTSP +aEe6c4biOGVaAmdjRjK9RBBhY7oquYoyJngyCZjRJaH9mGWQMk+2SndpRUzayF4K +u7/vQT2+IsZ92WFzakgyyHLA2nj/kiQcFnBupcUUZfixG1Jcj9q5k29wc4Gx77d7 +cGida8FZLaUhhvOlfe8sHsET0EYjFafV+A1CvXjIU9pxxKzMG+C2YRQ42iWfAgMB +AAGjgfwwgfkwDgYDVR0PAQH/BAQDAgeAMAkGA1UdEwQCMAAwEwYDVR0lBAwwCgYI +KwYBBQUHAwIwHQYDVR0OBBYEFPQXAt0bAavFvBekXEt1juyx4MjxMB8GA1UdIwQY +MBaAFK5CiHXdBaaOSH9Qafm3NCNJuLRxMDkGCCsGAQUFBwEBBC0wKzApBggrBgEF +BQcwAoYdaHR0cDovL2dyZWVuLm5vL2NhL3Rscy1jYS5jZXIwLgYDVR0fBCcwJTAj +oCGgH4YdaHR0cDovL2dyZWVuLm5vL2NhL3Rscy1jYS5jcmwwHAYDVR0RBBUwE4ER +YmFybmV5QHRlbGVub3Iubm8wDQYJKoZIhvcNAQEFBQADggEBAJaaxUGKL0rEgNkr +Gs8Hhem2GAEgQbnD1MrTLWbDHVJ/JdeSDOmpruYu+p0Kz4S5A/Jj49PJcGqsBF6p +LaJDejRg96ky4UjsxgOsswYuSG7QNRExPQwEZkHmsuyMaPjkvEeFOWBpqYruL1aI +ihlF0ISOwicsgpwHbDSuQWFj+TLLizPqLBVf+TWwPFFNXzDeC4golHnzvWk3rRIg +4WsdtnfZg9uBpFNsD2oXXivBlMZC43PNnnkbjInN2s6w9CHFMiUEbmifp8r0xYbl +Ttn9aXPmFVBudg9zXnqj9NwVSqu7PJr6nwF6XEepo2gcSeA3N3evhwcW5OHXmDkV +plFdTNs= +-----END CERTIFICATE----- diff --git a/api/vendor/github.com/prometheus/common/config/testdata/basic-auth-password b/api/vendor/github.com/prometheus/common/config/testdata/basic-auth-password new file mode 100644 index 0000000..323fae0 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/config/testdata/basic-auth-password @@ -0,0 +1 @@ +foobar diff --git a/api/vendor/github.com/prometheus/common/config/testdata/bearer.token b/api/vendor/github.com/prometheus/common/config/testdata/bearer.token new file mode 100644 index 0000000..3367abf --- /dev/null +++ b/api/vendor/github.com/prometheus/common/config/testdata/bearer.token @@ -0,0 +1 @@ +theanswertothegreatquestionoflifetheuniverseandeverythingisfortytwo diff --git a/api/vendor/github.com/prometheus/common/config/testdata/http.conf.basic-auth.good.yaml b/api/vendor/github.com/prometheus/common/config/testdata/http.conf.basic-auth.good.yaml new file mode 100644 index 0000000..5e7aa41 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/config/testdata/http.conf.basic-auth.good.yaml @@ -0,0 +1,3 @@ +basic_auth: + username: user + password_file: testdata/basic-auth-password diff --git a/api/vendor/github.com/prometheus/common/config/testdata/http.conf.basic-auth.no-password.yaml b/api/vendor/github.com/prometheus/common/config/testdata/http.conf.basic-auth.no-password.yaml new file mode 100644 index 0000000..38faad3 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/config/testdata/http.conf.basic-auth.no-password.yaml @@ -0,0 +1,2 @@ +basic_auth: + username: user diff --git a/api/vendor/github.com/prometheus/common/config/testdata/http.conf.basic-auth.no-username.yaml b/api/vendor/github.com/prometheus/common/config/testdata/http.conf.basic-auth.no-username.yaml new file mode 100644 index 0000000..86e2903 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/config/testdata/http.conf.basic-auth.no-username.yaml @@ -0,0 +1,2 @@ +basic_auth: + password: secret diff --git a/api/vendor/github.com/prometheus/common/config/testdata/http.conf.basic-auth.too-much.bad.yaml b/api/vendor/github.com/prometheus/common/config/testdata/http.conf.basic-auth.too-much.bad.yaml new file mode 100644 index 0000000..7cfb922 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/config/testdata/http.conf.basic-auth.too-much.bad.yaml @@ -0,0 +1,4 @@ +basic_auth: + username: user + password: foo + password_file: testdata/basic-auth-password diff --git a/api/vendor/github.com/prometheus/common/config/testdata/http.conf.bearer-token-and-file-set.bad.yml b/api/vendor/github.com/prometheus/common/config/testdata/http.conf.bearer-token-and-file-set.bad.yml new file mode 100644 index 0000000..c613bac --- /dev/null +++ b/api/vendor/github.com/prometheus/common/config/testdata/http.conf.bearer-token-and-file-set.bad.yml @@ -0,0 +1,5 @@ +basic_auth: + username: username + password: "mysecret" +bearer_token: mysecret +bearer_token_file: file diff --git a/api/vendor/github.com/prometheus/common/config/testdata/http.conf.empty.bad.yml b/api/vendor/github.com/prometheus/common/config/testdata/http.conf.empty.bad.yml new file mode 100644 index 0000000..ea2811f --- /dev/null +++ b/api/vendor/github.com/prometheus/common/config/testdata/http.conf.empty.bad.yml @@ -0,0 +1,4 @@ +basic_auth: + username: username + password: mysecret +bearer_token_file: file diff --git a/api/vendor/github.com/prometheus/common/config/testdata/http.conf.good.yml b/api/vendor/github.com/prometheus/common/config/testdata/http.conf.good.yml new file mode 100644 index 0000000..46ca639 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/config/testdata/http.conf.good.yml @@ -0,0 +1,4 @@ +basic_auth: + username: username + password: "mysecret" +proxy_url: "http://remote.host" diff --git a/api/vendor/github.com/prometheus/common/config/testdata/http.conf.invalid-bearer-token-file.bad.yml b/api/vendor/github.com/prometheus/common/config/testdata/http.conf.invalid-bearer-token-file.bad.yml new file mode 100644 index 0000000..4b1349b --- /dev/null +++ b/api/vendor/github.com/prometheus/common/config/testdata/http.conf.invalid-bearer-token-file.bad.yml @@ -0,0 +1 @@ +bearer_token_file: file diff --git a/api/vendor/github.com/prometheus/common/config/testdata/server.crt b/api/vendor/github.com/prometheus/common/config/testdata/server.crt new file mode 100644 index 0000000..87ad202 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/config/testdata/server.crt @@ -0,0 +1,96 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 4 (0x4) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=NO, O=Green AS, OU=Green Certificate Authority, CN=Green TLS CA + Validity + Not Before: Jul 26 12:47:08 2017 GMT + Not After : Jul 26 12:47:08 2019 GMT + Subject: C=NO, O=Green AS, OU=Green Certificate Authority, CN=Green TLS CA + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:97:43:c5:f6:24:b8:ce:30:12:70:ea:17:9c:c0: + ce:f2:ef:58:8b:12:7d:46:5e:01:f1:1a:93:b2:3e: + d8:cf:99:bc:10:32:f1:12:b0:ef:00:6c:d6:c4:45: + 85:a8:33:7b:cd:ec:8f:4a:92:d0:5a:4a:41:69:7f: + e3:dd:7e:71:d2:21:9c:df:43:b5:6c:60:bb:2a:12: + a8:08:cf:c5:ee:08:7d:48:ea:4b:54:e4:82:d9:88: + b0:b8:5e:02:12:cb:0e:09:99:b7:5f:42:b6:d7:26: + 34:0f:4a:e7:fc:ac:9c:59:cd:a1:50:4c:88:5f:f1: + d2:7e:5b:21:41:f0:37:50:80:48:71:50:26:61:26: + 79:64:4b:7e:91:8d:0e:f4:27:fe:19:80:bf:39:55: + b7:f3:d0:cd:61:6c:d8:c1:c7:d3:26:77:92:1a:14: + 42:56:cb:bc:fd:1a:4a:eb:17:d8:8d:af:d1:c0:46: + 9f:f0:40:5e:0e:34:2f:e7:db:be:66:fd:89:0b:6b: + 8c:71:c1:0b:0a:c5:c4:c4:eb:7f:44:c1:75:36:23: + fd:ed:b6:ee:87:d9:88:47:e1:4b:7c:60:53:e7:85: + 1c:2f:82:4b:2b:5e:63:1a:49:17:36:2c:fc:39:23: + 49:22:4d:43:b5:51:22:12:24:9e:31:44:d8:16:4e: + a8:eb + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Key Usage: critical + Digital Signature, Key Encipherment + X509v3 Basic Constraints: + CA:FALSE + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication + X509v3 Subject Key Identifier: + 70:A9:FB:44:66:3C:63:96:E6:05:B2:74:47:C8:18:7E:43:6D:EE:8B + X509v3 Authority Key Identifier: + keyid:AE:42:88:75:DD:05:A6:8E:48:7F:50:69:F9:B7:34:23:49:B8:B4:71 + + Authority Information Access: + CA Issuers - URI:http://green.no/ca/tls-ca.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://green.no/ca/tls-ca.crl + + X509v3 Subject Alternative Name: + IP Address:127.0.0.1, IP Address:127.0.0.0, DNS:localhost + Signature Algorithm: sha1WithRSAEncryption + 56:1e:b8:52:ba:f5:72:42:ad:15:71:c1:5e:00:63:c9:4d:56: + f2:8d:a3:a9:91:db:d0:b5:1b:88:80:93:80:28:48:b2:d0:a9: + d0:ea:de:40:78:cc:57:8c:00:b8:65:99:68:95:98:9b:fb:a2: + 43:21:ea:00:37:01:77:c7:3b:1a:ec:58:2d:25:9c:ad:23:41: + 5e:ae:fd:ac:2f:26:81:b8:a7:49:9b:5a:10:fe:ad:c3:86:ab: + 59:67:b0:c7:81:72:95:60:b5:cb:fc:9f:ad:27:16:50:85:76: + 33:16:20:2c:1f:c6:14:09:0c:48:9f:c0:19:16:c9:fa:b0:d8: + bf:b7:8d:a7:aa:eb:fe:f8:6f:dd:2b:83:ee:c7:8a:df:c8:59: + e6:2e:13:1f:57:cc:6f:31:db:f7:b7:5c:3f:78:ad:22:2c:48: + bb:6d:c4:ab:dc:c1:76:34:29:d9:1e:67:e0:ac:37:2b:90:f9: + 71:bd:cf:a1:01:b9:eb:0b:0b:79:2e:8b:52:3d:8e:13:97:c8: + 05:a3:ef:68:82:49:12:2a:25:1a:48:49:b8:7c:3c:66:0d:74: + f9:00:8c:5b:57:d7:76:b1:26:95:86:b2:2e:a3:b2:9c:e0:eb: + 2d:fc:77:03:8f:cd:56:46:3a:c9:6a:fa:72:e3:19:d8:ef:de: + 4b:36:95:79 +-----BEGIN CERTIFICATE----- +MIIEQjCCAyqgAwIBAgIBBDANBgkqhkiG9w0BAQUFADBdMQswCQYDVQQGEwJOTzER +MA8GA1UECgwIR3JlZW4gQVMxJDAiBgNVBAsMG0dyZWVuIENlcnRpZmljYXRlIEF1 +dGhvcml0eTEVMBMGA1UEAwwMR3JlZW4gVExTIENBMB4XDTE3MDcyNjEyNDcwOFoX +DTE5MDcyNjEyNDcwOFowXTELMAkGA1UEBhMCTk8xETAPBgNVBAoMCEdyZWVuIEFT +MSQwIgYDVQQLDBtHcmVlbiBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFTATBgNVBAMM +DEdyZWVuIFRMUyBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJdD +xfYkuM4wEnDqF5zAzvLvWIsSfUZeAfEak7I+2M+ZvBAy8RKw7wBs1sRFhagze83s +j0qS0FpKQWl/491+cdIhnN9DtWxguyoSqAjPxe4IfUjqS1TkgtmIsLheAhLLDgmZ +t19CttcmNA9K5/ysnFnNoVBMiF/x0n5bIUHwN1CASHFQJmEmeWRLfpGNDvQn/hmA +vzlVt/PQzWFs2MHH0yZ3khoUQlbLvP0aSusX2I2v0cBGn/BAXg40L+fbvmb9iQtr +jHHBCwrFxMTrf0TBdTYj/e227ofZiEfhS3xgU+eFHC+CSyteYxpJFzYs/DkjSSJN +Q7VRIhIknjFE2BZOqOsCAwEAAaOCAQswggEHMA4GA1UdDwEB/wQEAwIFoDAJBgNV +HRMEAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAdBgNVHQ4EFgQU +cKn7RGY8Y5bmBbJ0R8gYfkNt7oswHwYDVR0jBBgwFoAUrkKIdd0Fpo5If1Bp+bc0 +I0m4tHEwOQYIKwYBBQUHAQEELTArMCkGCCsGAQUFBzAChh1odHRwOi8vZ3JlZW4u +bm8vY2EvdGxzLWNhLmNlcjAuBgNVHR8EJzAlMCOgIaAfhh1odHRwOi8vZ3JlZW4u +bm8vY2EvdGxzLWNhLmNybDAgBgNVHREEGTAXhwR/AAABhwR/AAAAgglsb2NhbGhv +c3QwDQYJKoZIhvcNAQEFBQADggEBAFYeuFK69XJCrRVxwV4AY8lNVvKNo6mR29C1 +G4iAk4AoSLLQqdDq3kB4zFeMALhlmWiVmJv7okMh6gA3AXfHOxrsWC0lnK0jQV6u +/awvJoG4p0mbWhD+rcOGq1lnsMeBcpVgtcv8n60nFlCFdjMWICwfxhQJDEifwBkW +yfqw2L+3jaeq6/74b90rg+7Hit/IWeYuEx9XzG8x2/e3XD94rSIsSLttxKvcwXY0 +KdkeZ+CsNyuQ+XG9z6EBuesLC3kui1I9jhOXyAWj72iCSRIqJRpISbh8PGYNdPkA +jFtX13axJpWGsi6jspzg6y38dwOPzVZGOslq+nLjGdjv3ks2lXk= +-----END CERTIFICATE----- diff --git a/api/vendor/github.com/prometheus/common/config/testdata/server.key b/api/vendor/github.com/prometheus/common/config/testdata/server.key new file mode 100644 index 0000000..126c1b5 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/config/testdata/server.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCXQ8X2JLjOMBJw +6hecwM7y71iLEn1GXgHxGpOyPtjPmbwQMvESsO8AbNbERYWoM3vN7I9KktBaSkFp +f+PdfnHSIZzfQ7VsYLsqEqgIz8XuCH1I6ktU5ILZiLC4XgISyw4JmbdfQrbXJjQP +Suf8rJxZzaFQTIhf8dJ+WyFB8DdQgEhxUCZhJnlkS36RjQ70J/4ZgL85Vbfz0M1h +bNjBx9Mmd5IaFEJWy7z9GkrrF9iNr9HARp/wQF4ONC/n275m/YkLa4xxwQsKxcTE +639EwXU2I/3ttu6H2YhH4Ut8YFPnhRwvgksrXmMaSRc2LPw5I0kiTUO1USISJJ4x +RNgWTqjrAgMBAAECggEAVurwo4FyV7gzwIIi00XPJLT3ceJL7dUy1HHrEG8gchnq +gHxlHdJhYyMnPVydcosyxp75r2YxJtCoSZDdRHbVvGLoGzpy0zW6FnDl8TpCh4aF +RxKp+rvbnFf5A9ew5U+cX1PelHRnT7V6EJeAOiaNKOUJnnR7oHX59/UxZQw9HJnX +3H4xUdRDmSS3BGKXEswbd7beQjqJtEIkbConfaw32yEod0w2MC0LI4miZ87/6Hsk +pyvfpeYxXp4z3BTvFBbf/GEBFuozu63VWHayB9PDmEN/TlphoQpJQihdR2r1lz/H +I5QwVlFTDvUSFitNLu+FoaHOfgLprQndbojBXb+tcQKBgQDHCPyM4V7k97RvJgmB +ELgZiDYufDrjRLXvFzrrZ7ySU3N+nx3Gz/EhtgbHicDjnRVagHBIwi/QAfBJksCd +xcioY5k2OW+8PSTsfFZTAA6XwJp/LGfJik/JjvAVv5CnxBu9lYG4WiSBJFp59ojC +zTmfEuB4GPwrjQvzjlqaSpij9QKBgQDCjriwAB2UJIdlgK+DkryLqgim5I4cteB3 ++juVKz+S8ufFmVvmIXkyDcpyy/26VLC6esy8dV0JoWc4EeitoJvQD1JVZ5+CBTY+ +r9umx18oe2A/ZgcEf/A3Zd94jM1MwriF6YC+eIOhwhpi7T1xTLf3hc9B0OJ5B1mA +vob9rGDtXwKBgD4rkW+UCictNIAvenKFPWxEPuBgT6ij0sx/DhlwCtgOFxprK0rp +syFbkVyMq+KtM3lUez5O4c5wfJUOsPnXSOlISxhD8qHy23C/GdvNPcGrGNc2kKjE +ek20R0wTzWSJ/jxG0gE6rwJjz5sfJfLrVd9ZbyI0c7hK03vdcHGXcXxtAoGAeGHl +BwnbQ3niyTx53VijD2wTVGjhQgSLstEDowYSnTNtk8eTpG6b1gvQc32jLnMOsyQe +oJGiEr5q5re2GBDjuDZyxGOMv9/Hs7wOlkCQsbS9Vh0kRHWBRlXjk2zT7yYhFMLp +pXFeSW2X9BRFS2CkCCUkm93K9AZHLDE3x6ishNMCgYEAsDsUCzGhI49Aqe+CMP2l +WPZl7SEMYS5AtdC5sLtbLYBl8+rMXVGL2opKXqVFYBYkqMJiHGdX3Ub6XSVKLYkN +vm4PWmlQS24ZT+jlUl4jk6JU6SAlM/o6ixZl5KNR7yQm6zN2O/RHDeYm0urUQ9tF +9dux7LbIFeOoJmoDTWG2+fI= +-----END PRIVATE KEY----- diff --git a/api/vendor/github.com/prometheus/common/config/testdata/tls-ca-chain.pem b/api/vendor/github.com/prometheus/common/config/testdata/tls-ca-chain.pem new file mode 100644 index 0000000..03e4189 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/config/testdata/tls-ca-chain.pem @@ -0,0 +1,172 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 2 (0x2) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=NO, O=Green AS, OU=Green Certificate Authority, CN=Green Root CA + Validity + Not Before: Jul 13 03:47:20 2017 GMT + Not After : Jul 13 03:47:20 2027 GMT + Subject: C=NO, O=Green AS, OU=Green Certificate Authority, CN=Green TLS CA + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:b5:5a:b3:7a:7f:6a:5b:e9:ee:62:ee:4f:61:42: + 79:93:06:bf:81:fc:9a:1f:b5:80:83:7c:b3:a6:94: + 54:58:8a:b1:74:cb:c3:b8:3c:23:a8:69:1f:ca:2b: + af:be:97:ba:31:73:b5:b8:ce:d9:bf:bf:9a:7a:cf: + 3a:64:51:83:c9:36:d2:f7:3b:3a:0e:4c:c7:66:2e: + bf:1a:df:ce:10:aa:3d:0f:19:74:03:7e:b5:10:bb: + e8:37:bd:62:f0:42:2d:df:3d:ca:70:50:10:17:ce: + a9:ec:55:8e:87:6f:ce:9a:04:36:14:96:cb:d1:a5: + 48:d5:d2:87:02:62:93:4e:21:4a:ff:be:44:f1:d2: + 7e:ed:74:da:c2:51:26:8e:03:a0:c2:bd:bd:5f:b0: + 50:11:78:fd:ab:1d:04:86:6c:c1:8d:20:bd:05:5f: + 51:67:c6:d3:07:95:92:2d:92:90:00:c6:9f:2d:dd: + 36:5c:dc:78:10:7c:f6:68:39:1d:2c:e0:e1:26:64: + 4f:36:34:66:a7:84:6a:90:15:3a:94:b7:79:b1:47: + f5:d2:51:95:54:bf:92:76:9a:b9:88:ee:63:f9:6c: + 0d:38:c6:b6:1c:06:43:ed:24:1d:bb:6c:72:48:cc: + 8c:f4:35:bc:43:fe:a6:96:4c:31:5f:82:0d:0d:20: + 2a:3d + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:0 + X509v3 Subject Key Identifier: + AE:42:88:75:DD:05:A6:8E:48:7F:50:69:F9:B7:34:23:49:B8:B4:71 + X509v3 Authority Key Identifier: + keyid:60:93:53:2F:C7:CF:2A:D7:F3:09:28:F6:3C:AE:9C:50:EC:93:63:E5 + + Authority Information Access: + CA Issuers - URI:http://green.no/ca/root-ca.cer + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://green.no/ca/root-ca.crl + + Signature Algorithm: sha1WithRSAEncryption + 15:a7:ac:d7:25:9e:2a:d4:d1:14:b4:99:38:3d:2f:73:61:2a: + d9:b6:8b:13:ea:fe:db:78:d9:0a:6c:df:26:6e:c1:d5:4a:97: + 42:19:dd:97:05:03:e4:2b:fc:1e:1f:38:3c:4e:b0:3b:8c:38: + ad:2b:65:fa:35:2d:81:8e:e0:f6:0a:89:4c:38:97:01:4b:9c: + ac:4e:e1:55:17:ef:0a:ad:a7:eb:1e:4b:86:23:12:f1:52:69: + cb:a3:8a:ce:fb:14:8b:86:d7:bb:81:5e:bd:2a:c7:a7:79:58: + 00:10:c0:db:ff:d4:a5:b9:19:74:b3:23:19:4a:1f:78:4b:a8: + b6:f6:20:26:c1:69:f9:89:7f:b8:1c:3b:a2:f9:37:31:80:2c: + b0:b6:2b:d2:84:44:d7:42:e4:e6:44:51:04:35:d9:1c:a4:48: + c6:b7:35:de:f2:ae:da:4b:ba:c8:09:42:8d:ed:7a:81:dc:ed: + 9d:f0:de:6e:21:b9:01:1c:ad:64:3d:25:4c:91:94:f1:13:18: + bb:89:e9:48:ac:05:73:07:c8:db:bd:69:8e:6f:02:9d:b0:18: + c0:b9:e1:a8:b1:17:50:3d:ac:05:6e:6f:63:4f:b1:73:33:60: + 9a:77:d2:81:8a:01:38:43:e9:4c:3c:90:63:a4:99:4b:d2:1b: + f9:1b:ec:ee +-----BEGIN CERTIFICATE----- +MIIECzCCAvOgAwIBAgIBAjANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQGEwJOTzER +MA8GA1UECgwIR3JlZW4gQVMxJDAiBgNVBAsMG0dyZWVuIENlcnRpZmljYXRlIEF1 +dGhvcml0eTEWMBQGA1UEAwwNR3JlZW4gUm9vdCBDQTAeFw0xNzA3MTMwMzQ3MjBa +Fw0yNzA3MTMwMzQ3MjBaMF0xCzAJBgNVBAYTAk5PMREwDwYDVQQKDAhHcmVlbiBB +UzEkMCIGA1UECwwbR3JlZW4gQ2VydGlmaWNhdGUgQXV0aG9yaXR5MRUwEwYDVQQD +DAxHcmVlbiBUTFMgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC1 +WrN6f2pb6e5i7k9hQnmTBr+B/JoftYCDfLOmlFRYirF0y8O4PCOoaR/KK6++l7ox +c7W4ztm/v5p6zzpkUYPJNtL3OzoOTMdmLr8a384Qqj0PGXQDfrUQu+g3vWLwQi3f +PcpwUBAXzqnsVY6Hb86aBDYUlsvRpUjV0ocCYpNOIUr/vkTx0n7tdNrCUSaOA6DC +vb1fsFAReP2rHQSGbMGNIL0FX1FnxtMHlZItkpAAxp8t3TZc3HgQfPZoOR0s4OEm +ZE82NGanhGqQFTqUt3mxR/XSUZVUv5J2mrmI7mP5bA04xrYcBkPtJB27bHJIzIz0 +NbxD/qaWTDFfgg0NICo9AgMBAAGjgdQwgdEwDgYDVR0PAQH/BAQDAgEGMBIGA1Ud +EwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFK5CiHXdBaaOSH9Qafm3NCNJuLRxMB8G +A1UdIwQYMBaAFGCTUy/HzyrX8wko9jyunFDsk2PlMDoGCCsGAQUFBwEBBC4wLDAq +BggrBgEFBQcwAoYeaHR0cDovL2dyZWVuLm5vL2NhL3Jvb3QtY2EuY2VyMC8GA1Ud +HwQoMCYwJKAioCCGHmh0dHA6Ly9ncmVlbi5uby9jYS9yb290LWNhLmNybDANBgkq +hkiG9w0BAQUFAAOCAQEAFaes1yWeKtTRFLSZOD0vc2Eq2baLE+r+23jZCmzfJm7B +1UqXQhndlwUD5Cv8Hh84PE6wO4w4rStl+jUtgY7g9gqJTDiXAUucrE7hVRfvCq2n +6x5LhiMS8VJpy6OKzvsUi4bXu4FevSrHp3lYABDA2//UpbkZdLMjGUofeEuotvYg +JsFp+Yl/uBw7ovk3MYAssLYr0oRE10Lk5kRRBDXZHKRIxrc13vKu2ku6yAlCje16 +gdztnfDebiG5ARytZD0lTJGU8RMYu4npSKwFcwfI271pjm8CnbAYwLnhqLEXUD2s +BW5vY0+xczNgmnfSgYoBOEPpTDyQY6SZS9Ib+Rvs7g== +-----END CERTIFICATE----- +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=NO, O=Green AS, OU=Green Certificate Authority, CN=Green Root CA + Validity + Not Before: Jul 13 03:44:39 2017 GMT + Not After : Dec 31 23:59:59 2030 GMT + Subject: C=NO, O=Green AS, OU=Green Certificate Authority, CN=Green Root CA + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:a7:e8:ed:de:d4:54:08:41:07:40:d5:c0:43:d6: + ab:d3:9e:21:87:c6:13:bf:a7:cf:3d:08:4f:c1:fe: + 8f:e5:6c:c5:89:97:e5:27:75:26:c3:2a:73:2d:34: + 7c:6f:35:8d:40:66:61:05:c0:eb:e9:b3:38:47:f8: + 8b:26:35:2c:df:dc:24:31:fe:72:e3:87:10:d1:f7: + a0:57:b7:f3:b1:1a:fe:c7:4b:f8:7b:14:6d:73:08: + 54:eb:63:3c:0c:ce:22:95:5f:3f:f2:6f:89:ae:63: + da:80:74:36:21:13:e8:91:01:58:77:cc:c2:f2:42: + bf:eb:b3:60:a7:21:ed:88:24:7f:eb:ff:07:41:9b: + 93:c8:5f:6a:8e:a6:1a:15:3c:bc:e7:0d:fd:05:fd: + 3c:c1:1c:1d:1f:57:2b:40:27:62:a1:7c:48:63:c1: + 45:e7:2f:20:ed:92:1c:42:94:e4:58:70:7a:b6:d2: + 85:c5:61:d8:cd:c6:37:6b:72:3b:7f:af:55:81:d6: + 9d:dc:10:c9:d8:0e:81:e4:5e:40:13:2f:20:e8:6b: + 46:81:ce:88:47:dd:38:71:3d:ef:21:cc:c0:67:cf: + 0a:f4:e9:3f:a8:9d:26:25:2e:23:1e:a3:11:18:cb: + d1:70:1c:9e:7d:09:b1:a4:20:dc:95:15:1d:49:cf: + 1b:ad + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 Subject Key Identifier: + 60:93:53:2F:C7:CF:2A:D7:F3:09:28:F6:3C:AE:9C:50:EC:93:63:E5 + X509v3 Authority Key Identifier: + keyid:60:93:53:2F:C7:CF:2A:D7:F3:09:28:F6:3C:AE:9C:50:EC:93:63:E5 + + Signature Algorithm: sha1WithRSAEncryption + a7:77:71:8b:1a:e5:5a:5b:87:54:08:bf:07:3e:cb:99:2f:dc: + 0e:8d:63:94:95:83:19:c9:92:82:d5:cb:5b:8f:1f:86:55:bc: + 70:01:1d:33:46:ec:99:de:6b:1f:c3:c2:7a:dd:ef:69:ab:96: + 58:ec:6c:6f:6c:70:82:71:8a:7f:f0:3b:80:90:d5:64:fa:80: + 27:b8:7b:50:69:98:4b:37:99:ad:bf:a2:5b:93:22:5e:96:44: + 3c:5a:cf:0c:f4:62:63:4a:6f:72:a7:f6:89:1d:09:26:3d:8f: + a8:86:d4:b4:bc:dd:b3:38:ca:c0:59:16:8c:20:1f:89:35:12: + b4:2d:c0:e9:de:93:e0:39:76:32:fc:80:db:da:44:26:fd:01: + 32:74:97:f8:44:ae:fe:05:b1:34:96:13:34:56:73:b4:93:a5: + 55:56:d1:01:51:9d:9c:55:e7:38:53:28:12:4e:38:72:0c:8f: + bd:91:4c:45:48:3b:e1:0d:03:5f:58:40:c9:d3:a0:ac:b3:89: + ce:af:27:8a:0f:ab:ec:72:4d:40:77:30:6b:36:fd:32:46:9f: + ee:f9:c4:f5:17:06:0f:4b:d3:88:f5:a4:2f:3d:87:9e:f5:26: + 74:f0:c9:dc:cb:ad:d9:a7:8a:d3:71:15:00:d3:5d:9f:4c:59: + 3e:24:63:f5 +-----BEGIN CERTIFICATE----- +MIIDnDCCAoSgAwIBAgIBATANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQGEwJOTzER +MA8GA1UECgwIR3JlZW4gQVMxJDAiBgNVBAsMG0dyZWVuIENlcnRpZmljYXRlIEF1 +dGhvcml0eTEWMBQGA1UEAwwNR3JlZW4gUm9vdCBDQTAgFw0xNzA3MTMwMzQ0Mzla +GA8yMDMwMTIzMTIzNTk1OVowXjELMAkGA1UEBhMCTk8xETAPBgNVBAoMCEdyZWVu +IEFTMSQwIgYDVQQLDBtHcmVlbiBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFjAUBgNV +BAMMDUdyZWVuIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCn6O3e1FQIQQdA1cBD1qvTniGHxhO/p889CE/B/o/lbMWJl+UndSbDKnMtNHxv +NY1AZmEFwOvpszhH+IsmNSzf3CQx/nLjhxDR96BXt/OxGv7HS/h7FG1zCFTrYzwM +ziKVXz/yb4muY9qAdDYhE+iRAVh3zMLyQr/rs2CnIe2IJH/r/wdBm5PIX2qOphoV +PLznDf0F/TzBHB0fVytAJ2KhfEhjwUXnLyDtkhxClORYcHq20oXFYdjNxjdrcjt/ +r1WB1p3cEMnYDoHkXkATLyDoa0aBzohH3ThxPe8hzMBnzwr06T+onSYlLiMeoxEY +y9FwHJ59CbGkINyVFR1JzxutAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRgk1Mvx88q1/MJKPY8rpxQ7JNj5TAfBgNV +HSMEGDAWgBRgk1Mvx88q1/MJKPY8rpxQ7JNj5TANBgkqhkiG9w0BAQUFAAOCAQEA +p3dxixrlWluHVAi/Bz7LmS/cDo1jlJWDGcmSgtXLW48fhlW8cAEdM0bsmd5rH8PC +et3vaauWWOxsb2xwgnGKf/A7gJDVZPqAJ7h7UGmYSzeZrb+iW5MiXpZEPFrPDPRi +Y0pvcqf2iR0JJj2PqIbUtLzdszjKwFkWjCAfiTUStC3A6d6T4Dl2MvyA29pEJv0B +MnSX+ESu/gWxNJYTNFZztJOlVVbRAVGdnFXnOFMoEk44cgyPvZFMRUg74Q0DX1hA +ydOgrLOJzq8nig+r7HJNQHcwazb9Mkaf7vnE9RcGD0vTiPWkLz2HnvUmdPDJ3Mut +2aeK03EVANNdn0xZPiRj9Q== +-----END CERTIFICATE----- diff --git a/api/vendor/github.com/prometheus/common/config/testdata/tls_config.cert_no_key.bad.yml b/api/vendor/github.com/prometheus/common/config/testdata/tls_config.cert_no_key.bad.yml new file mode 100644 index 0000000..7dfdc1e --- /dev/null +++ b/api/vendor/github.com/prometheus/common/config/testdata/tls_config.cert_no_key.bad.yml @@ -0,0 +1 @@ +cert_file: somefile diff --git a/api/vendor/github.com/prometheus/common/config/testdata/tls_config.empty.good.yml b/api/vendor/github.com/prometheus/common/config/testdata/tls_config.empty.good.yml new file mode 100644 index 0000000..e69de29 diff --git a/api/vendor/github.com/prometheus/common/config/testdata/tls_config.insecure.good.yml b/api/vendor/github.com/prometheus/common/config/testdata/tls_config.insecure.good.yml new file mode 100644 index 0000000..d054383 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/config/testdata/tls_config.insecure.good.yml @@ -0,0 +1 @@ +insecure_skip_verify: true diff --git a/api/vendor/github.com/prometheus/common/config/testdata/tls_config.invalid_field.bad.yml b/api/vendor/github.com/prometheus/common/config/testdata/tls_config.invalid_field.bad.yml new file mode 100644 index 0000000..12cbaac --- /dev/null +++ b/api/vendor/github.com/prometheus/common/config/testdata/tls_config.invalid_field.bad.yml @@ -0,0 +1 @@ +something_invalid: true diff --git a/api/vendor/github.com/prometheus/common/config/testdata/tls_config.key_no_cert.bad.yml b/api/vendor/github.com/prometheus/common/config/testdata/tls_config.key_no_cert.bad.yml new file mode 100644 index 0000000..cec045e --- /dev/null +++ b/api/vendor/github.com/prometheus/common/config/testdata/tls_config.key_no_cert.bad.yml @@ -0,0 +1 @@ +key_file: somefile diff --git a/api/vendor/github.com/prometheus/common/config/tls_config_test.go b/api/vendor/github.com/prometheus/common/config/tls_config_test.go new file mode 100644 index 0000000..31ddb6e --- /dev/null +++ b/api/vendor/github.com/prometheus/common/config/tls_config_test.go @@ -0,0 +1,62 @@ +// Copyright 2016 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 config + +import ( + "crypto/tls" + "io/ioutil" + "reflect" + "testing" + + "gopkg.in/yaml.v2" +) + +// LoadTLSConfig parses the given YAML file into a tls.Config. +func LoadTLSConfig(filename string) (*tls.Config, error) { + content, err := ioutil.ReadFile(filename) + if err != nil { + return nil, err + } + cfg := TLSConfig{} + if err = yaml.UnmarshalStrict(content, &cfg); err != nil { + return nil, err + } + return NewTLSConfig(&cfg) +} + +var expectedTLSConfigs = []struct { + filename string + config *tls.Config +}{ + { + filename: "tls_config.empty.good.yml", + config: &tls.Config{}, + }, { + filename: "tls_config.insecure.good.yml", + config: &tls.Config{InsecureSkipVerify: true}, + }, +} + +func TestValidTLSConfig(t *testing.T) { + for _, cfg := range expectedTLSConfigs { + cfg.config.BuildNameToCertificate() + got, err := LoadTLSConfig("testdata/" + cfg.filename) + if err != nil { + t.Errorf("Error parsing %s: %s", cfg.filename, err) + } + if !reflect.DeepEqual(*got, *cfg.config) { + t.Fatalf("%v: unexpected config result: \n\n%v\n expected\n\n%v", cfg.filename, got, cfg.config) + } + } +} diff --git a/api/vendor/github.com/prometheus/common/expfmt/bench_test.go b/api/vendor/github.com/prometheus/common/expfmt/bench_test.go new file mode 100644 index 0000000..e539bfc --- /dev/null +++ b/api/vendor/github.com/prometheus/common/expfmt/bench_test.go @@ -0,0 +1,167 @@ +// Copyright 2015 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 expfmt + +import ( + "bytes" + "compress/gzip" + "io" + "io/ioutil" + "testing" + + "github.com/matttproud/golang_protobuf_extensions/pbutil" + + dto "github.com/prometheus/client_model/go" +) + +var parser TextParser + +// Benchmarks to show how much penalty text format parsing actually inflicts. +// +// Example results on Linux 3.13.0, Intel(R) Core(TM) i7-4700MQ CPU @ 2.40GHz, go1.4. +// +// BenchmarkParseText 1000 1188535 ns/op 205085 B/op 6135 allocs/op +// BenchmarkParseTextGzip 1000 1376567 ns/op 246224 B/op 6151 allocs/op +// BenchmarkParseProto 10000 172790 ns/op 52258 B/op 1160 allocs/op +// BenchmarkParseProtoGzip 5000 324021 ns/op 94931 B/op 1211 allocs/op +// BenchmarkParseProtoMap 10000 187946 ns/op 58714 B/op 1203 allocs/op +// +// CONCLUSION: The overhead for the map is negligible. Text format needs ~5x more allocations. +// Without compression, it needs ~7x longer, but with compression (the more relevant scenario), +// the difference becomes less relevant, only ~4x. +// +// The test data contains 248 samples. + +// BenchmarkParseText benchmarks the parsing of a text-format scrape into metric +// family DTOs. +func BenchmarkParseText(b *testing.B) { + b.StopTimer() + data, err := ioutil.ReadFile("testdata/text") + if err != nil { + b.Fatal(err) + } + b.StartTimer() + + for i := 0; i < b.N; i++ { + if _, err := parser.TextToMetricFamilies(bytes.NewReader(data)); err != nil { + b.Fatal(err) + } + } +} + +// BenchmarkParseTextGzip benchmarks the parsing of a gzipped text-format scrape +// into metric family DTOs. +func BenchmarkParseTextGzip(b *testing.B) { + b.StopTimer() + data, err := ioutil.ReadFile("testdata/text.gz") + if err != nil { + b.Fatal(err) + } + b.StartTimer() + + for i := 0; i < b.N; i++ { + in, err := gzip.NewReader(bytes.NewReader(data)) + if err != nil { + b.Fatal(err) + } + if _, err := parser.TextToMetricFamilies(in); err != nil { + b.Fatal(err) + } + } +} + +// BenchmarkParseProto benchmarks the parsing of a protobuf-format scrape into +// metric family DTOs. Note that this does not build a map of metric families +// (as the text version does), because it is not required for Prometheus +// ingestion either. (However, it is required for the text-format parsing, as +// the metric family might be sprinkled all over the text, while the +// protobuf-format guarantees bundling at one place.) +func BenchmarkParseProto(b *testing.B) { + b.StopTimer() + data, err := ioutil.ReadFile("testdata/protobuf") + if err != nil { + b.Fatal(err) + } + b.StartTimer() + + for i := 0; i < b.N; i++ { + family := &dto.MetricFamily{} + in := bytes.NewReader(data) + for { + family.Reset() + if _, err := pbutil.ReadDelimited(in, family); err != nil { + if err == io.EOF { + break + } + b.Fatal(err) + } + } + } +} + +// BenchmarkParseProtoGzip is like BenchmarkParseProto above, but parses gzipped +// protobuf format. +func BenchmarkParseProtoGzip(b *testing.B) { + b.StopTimer() + data, err := ioutil.ReadFile("testdata/protobuf.gz") + if err != nil { + b.Fatal(err) + } + b.StartTimer() + + for i := 0; i < b.N; i++ { + family := &dto.MetricFamily{} + in, err := gzip.NewReader(bytes.NewReader(data)) + if err != nil { + b.Fatal(err) + } + for { + family.Reset() + if _, err := pbutil.ReadDelimited(in, family); err != nil { + if err == io.EOF { + break + } + b.Fatal(err) + } + } + } +} + +// BenchmarkParseProtoMap is like BenchmarkParseProto but DOES put the parsed +// metric family DTOs into a map. This is not happening during Prometheus +// ingestion. It is just here to measure the overhead of that map creation and +// separate it from the overhead of the text format parsing. +func BenchmarkParseProtoMap(b *testing.B) { + b.StopTimer() + data, err := ioutil.ReadFile("testdata/protobuf") + if err != nil { + b.Fatal(err) + } + b.StartTimer() + + for i := 0; i < b.N; i++ { + families := map[string]*dto.MetricFamily{} + in := bytes.NewReader(data) + for { + family := &dto.MetricFamily{} + if _, err := pbutil.ReadDelimited(in, family); err != nil { + if err == io.EOF { + break + } + b.Fatal(err) + } + families[family.GetName()] = family + } + } +} diff --git a/api/vendor/github.com/prometheus/common/expfmt/decode.go b/api/vendor/github.com/prometheus/common/expfmt/decode.go new file mode 100644 index 0000000..c092723 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/expfmt/decode.go @@ -0,0 +1,429 @@ +// Copyright 2015 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 expfmt + +import ( + "fmt" + "io" + "math" + "mime" + "net/http" + + dto "github.com/prometheus/client_model/go" + + "github.com/matttproud/golang_protobuf_extensions/pbutil" + "github.com/prometheus/common/model" +) + +// Decoder types decode an input stream into metric families. +type Decoder interface { + Decode(*dto.MetricFamily) error +} + +// DecodeOptions contains options used by the Decoder and in sample extraction. +type DecodeOptions struct { + // Timestamp is added to each value from the stream that has no explicit timestamp set. + Timestamp model.Time +} + +// ResponseFormat extracts the correct format from a HTTP response header. +// If no matching format can be found FormatUnknown is returned. +func ResponseFormat(h http.Header) Format { + ct := h.Get(hdrContentType) + + mediatype, params, err := mime.ParseMediaType(ct) + if err != nil { + return FmtUnknown + } + + const textType = "text/plain" + + switch mediatype { + case ProtoType: + if p, ok := params["proto"]; ok && p != ProtoProtocol { + return FmtUnknown + } + if e, ok := params["encoding"]; ok && e != "delimited" { + return FmtUnknown + } + return FmtProtoDelim + + case textType: + if v, ok := params["version"]; ok && v != TextVersion { + return FmtUnknown + } + return FmtText + } + + return FmtUnknown +} + +// NewDecoder returns a new decoder based on the given input format. +// If the input format does not imply otherwise, a text format decoder is returned. +func NewDecoder(r io.Reader, format Format) Decoder { + switch format { + case FmtProtoDelim: + return &protoDecoder{r: r} + } + return &textDecoder{r: r} +} + +// protoDecoder implements the Decoder interface for protocol buffers. +type protoDecoder struct { + r io.Reader +} + +// Decode implements the Decoder interface. +func (d *protoDecoder) Decode(v *dto.MetricFamily) error { + _, err := pbutil.ReadDelimited(d.r, v) + if err != nil { + return err + } + if !model.IsValidMetricName(model.LabelValue(v.GetName())) { + return fmt.Errorf("invalid metric name %q", v.GetName()) + } + for _, m := range v.GetMetric() { + if m == nil { + continue + } + for _, l := range m.GetLabel() { + if l == nil { + continue + } + if !model.LabelValue(l.GetValue()).IsValid() { + return fmt.Errorf("invalid label value %q", l.GetValue()) + } + if !model.LabelName(l.GetName()).IsValid() { + return fmt.Errorf("invalid label name %q", l.GetName()) + } + } + } + return nil +} + +// textDecoder implements the Decoder interface for the text protocol. +type textDecoder struct { + r io.Reader + p TextParser + fams []*dto.MetricFamily +} + +// Decode implements the Decoder interface. +func (d *textDecoder) Decode(v *dto.MetricFamily) error { + // TODO(fabxc): Wrap this as a line reader to make streaming safer. + if len(d.fams) == 0 { + // No cached metric families, read everything and parse metrics. + fams, err := d.p.TextToMetricFamilies(d.r) + if err != nil { + return err + } + if len(fams) == 0 { + return io.EOF + } + d.fams = make([]*dto.MetricFamily, 0, len(fams)) + for _, f := range fams { + d.fams = append(d.fams, f) + } + } + + *v = *d.fams[0] + d.fams = d.fams[1:] + + return nil +} + +// SampleDecoder wraps a Decoder to extract samples from the metric families +// decoded by the wrapped Decoder. +type SampleDecoder struct { + Dec Decoder + Opts *DecodeOptions + + f dto.MetricFamily +} + +// Decode calls the Decode method of the wrapped Decoder and then extracts the +// samples from the decoded MetricFamily into the provided model.Vector. +func (sd *SampleDecoder) Decode(s *model.Vector) error { + err := sd.Dec.Decode(&sd.f) + if err != nil { + return err + } + *s, err = extractSamples(&sd.f, sd.Opts) + return err +} + +// ExtractSamples builds a slice of samples from the provided metric +// families. If an error occurrs during sample extraction, it continues to +// extract from the remaining metric families. The returned error is the last +// error that has occurred. +func ExtractSamples(o *DecodeOptions, fams ...*dto.MetricFamily) (model.Vector, error) { + var ( + all model.Vector + lastErr error + ) + for _, f := range fams { + some, err := extractSamples(f, o) + if err != nil { + lastErr = err + continue + } + all = append(all, some...) + } + return all, lastErr +} + +func extractSamples(f *dto.MetricFamily, o *DecodeOptions) (model.Vector, error) { + switch f.GetType() { + case dto.MetricType_COUNTER: + return extractCounter(o, f), nil + case dto.MetricType_GAUGE: + return extractGauge(o, f), nil + case dto.MetricType_SUMMARY: + return extractSummary(o, f), nil + case dto.MetricType_UNTYPED: + return extractUntyped(o, f), nil + case dto.MetricType_HISTOGRAM: + return extractHistogram(o, f), nil + } + return nil, fmt.Errorf("expfmt.extractSamples: unknown metric family type %v", f.GetType()) +} + +func extractCounter(o *DecodeOptions, f *dto.MetricFamily) model.Vector { + samples := make(model.Vector, 0, len(f.Metric)) + + for _, m := range f.Metric { + if m.Counter == nil { + continue + } + + lset := make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName()) + + smpl := &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Counter.GetValue()), + } + + if m.TimestampMs != nil { + smpl.Timestamp = model.TimeFromUnixNano(*m.TimestampMs * 1000000) + } else { + smpl.Timestamp = o.Timestamp + } + + samples = append(samples, smpl) + } + + return samples +} + +func extractGauge(o *DecodeOptions, f *dto.MetricFamily) model.Vector { + samples := make(model.Vector, 0, len(f.Metric)) + + for _, m := range f.Metric { + if m.Gauge == nil { + continue + } + + lset := make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName()) + + smpl := &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Gauge.GetValue()), + } + + if m.TimestampMs != nil { + smpl.Timestamp = model.TimeFromUnixNano(*m.TimestampMs * 1000000) + } else { + smpl.Timestamp = o.Timestamp + } + + samples = append(samples, smpl) + } + + return samples +} + +func extractUntyped(o *DecodeOptions, f *dto.MetricFamily) model.Vector { + samples := make(model.Vector, 0, len(f.Metric)) + + for _, m := range f.Metric { + if m.Untyped == nil { + continue + } + + lset := make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName()) + + smpl := &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Untyped.GetValue()), + } + + if m.TimestampMs != nil { + smpl.Timestamp = model.TimeFromUnixNano(*m.TimestampMs * 1000000) + } else { + smpl.Timestamp = o.Timestamp + } + + samples = append(samples, smpl) + } + + return samples +} + +func extractSummary(o *DecodeOptions, f *dto.MetricFamily) model.Vector { + samples := make(model.Vector, 0, len(f.Metric)) + + for _, m := range f.Metric { + if m.Summary == nil { + continue + } + + timestamp := o.Timestamp + if m.TimestampMs != nil { + timestamp = model.TimeFromUnixNano(*m.TimestampMs * 1000000) + } + + for _, q := range m.Summary.Quantile { + lset := make(model.LabelSet, len(m.Label)+2) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + // BUG(matt): Update other names to "quantile". + lset[model.LabelName(model.QuantileLabel)] = model.LabelValue(fmt.Sprint(q.GetQuantile())) + lset[model.MetricNameLabel] = model.LabelValue(f.GetName()) + + samples = append(samples, &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(q.GetValue()), + Timestamp: timestamp, + }) + } + + lset := make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName() + "_sum") + + samples = append(samples, &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Summary.GetSampleSum()), + Timestamp: timestamp, + }) + + lset = make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName() + "_count") + + samples = append(samples, &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Summary.GetSampleCount()), + Timestamp: timestamp, + }) + } + + return samples +} + +func extractHistogram(o *DecodeOptions, f *dto.MetricFamily) model.Vector { + samples := make(model.Vector, 0, len(f.Metric)) + + for _, m := range f.Metric { + if m.Histogram == nil { + continue + } + + timestamp := o.Timestamp + if m.TimestampMs != nil { + timestamp = model.TimeFromUnixNano(*m.TimestampMs * 1000000) + } + + infSeen := false + + for _, q := range m.Histogram.Bucket { + lset := make(model.LabelSet, len(m.Label)+2) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.LabelName(model.BucketLabel)] = model.LabelValue(fmt.Sprint(q.GetUpperBound())) + lset[model.MetricNameLabel] = model.LabelValue(f.GetName() + "_bucket") + + if math.IsInf(q.GetUpperBound(), +1) { + infSeen = true + } + + samples = append(samples, &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(q.GetCumulativeCount()), + Timestamp: timestamp, + }) + } + + lset := make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName() + "_sum") + + samples = append(samples, &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Histogram.GetSampleSum()), + Timestamp: timestamp, + }) + + lset = make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName() + "_count") + + count := &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Histogram.GetSampleCount()), + Timestamp: timestamp, + } + samples = append(samples, count) + + if !infSeen { + // Append an infinity bucket sample. + lset := make(model.LabelSet, len(m.Label)+2) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.LabelName(model.BucketLabel)] = model.LabelValue("+Inf") + lset[model.MetricNameLabel] = model.LabelValue(f.GetName() + "_bucket") + + samples = append(samples, &model.Sample{ + Metric: model.Metric(lset), + Value: count.Value, + Timestamp: timestamp, + }) + } + } + + return samples +} diff --git a/api/vendor/github.com/prometheus/common/expfmt/decode_test.go b/api/vendor/github.com/prometheus/common/expfmt/decode_test.go new file mode 100644 index 0000000..82c1130 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/expfmt/decode_test.go @@ -0,0 +1,435 @@ +// Copyright 2015 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 expfmt + +import ( + "io" + "net/http" + "reflect" + "sort" + "strings" + "testing" + + "github.com/golang/protobuf/proto" + dto "github.com/prometheus/client_model/go" + + "github.com/prometheus/common/model" +) + +func TestTextDecoder(t *testing.T) { + var ( + ts = model.Now() + in = ` +# Only a quite simple scenario with two metric families. +# More complicated tests of the parser itself can be found in the text package. +# TYPE mf2 counter +mf2 3 +mf1{label="value1"} -3.14 123456 +mf1{label="value2"} 42 +mf2 4 +` + out = model.Vector{ + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "mf1", + "label": "value1", + }, + Value: -3.14, + Timestamp: 123456, + }, + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "mf1", + "label": "value2", + }, + Value: 42, + Timestamp: ts, + }, + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "mf2", + }, + Value: 3, + Timestamp: ts, + }, + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "mf2", + }, + Value: 4, + Timestamp: ts, + }, + } + ) + + dec := &SampleDecoder{ + Dec: &textDecoder{r: strings.NewReader(in)}, + Opts: &DecodeOptions{ + Timestamp: ts, + }, + } + var all model.Vector + for { + var smpls model.Vector + err := dec.Decode(&smpls) + if err == io.EOF { + break + } + if err != nil { + t.Fatal(err) + } + all = append(all, smpls...) + } + sort.Sort(all) + sort.Sort(out) + if !reflect.DeepEqual(all, out) { + t.Fatalf("output does not match") + } +} + +func TestProtoDecoder(t *testing.T) { + + var testTime = model.Now() + + scenarios := []struct { + in string + expected model.Vector + fail bool + }{ + { + in: "", + }, + { + in: "\x8f\x01\n\rrequest_count\x12\x12Number of requests\x18\x00\"0\n#\n\x0fsome_!abel_name\x12\x10some_label_value\x1a\t\t\x00\x00\x00\x00\x00\x00E\xc0\"6\n)\n\x12another_label_name\x12\x13another_label_value\x1a\t\t\x00\x00\x00\x00\x00\x00U@", + fail: true, + }, + { + in: "\x8f\x01\n\rrequest_count\x12\x12Number of requests\x18\x00\"0\n#\n\x0fsome_label_name\x12\x10some_label_value\x1a\t\t\x00\x00\x00\x00\x00\x00E\xc0\"6\n)\n\x12another_label_name\x12\x13another_label_value\x1a\t\t\x00\x00\x00\x00\x00\x00U@", + expected: model.Vector{ + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "request_count", + "some_label_name": "some_label_value", + }, + Value: -42, + Timestamp: testTime, + }, + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "request_count", + "another_label_name": "another_label_value", + }, + Value: 84, + Timestamp: testTime, + }, + }, + }, + { + in: "\xb9\x01\n\rrequest_count\x12\x12Number of requests\x18\x02\"O\n#\n\x0fsome_label_name\x12\x10some_label_value\"(\x1a\x12\t\xaeG\xe1z\x14\xae\xef?\x11\x00\x00\x00\x00\x00\x00E\xc0\x1a\x12\t+\x87\x16\xd9\xce\xf7\xef?\x11\x00\x00\x00\x00\x00\x00U\xc0\"A\n)\n\x12another_label_name\x12\x13another_label_value\"\x14\x1a\x12\t\x00\x00\x00\x00\x00\x00\xe0?\x11\x00\x00\x00\x00\x00\x00$@", + expected: model.Vector{ + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "request_count_count", + "some_label_name": "some_label_value", + }, + Value: 0, + Timestamp: testTime, + }, + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "request_count_sum", + "some_label_name": "some_label_value", + }, + Value: 0, + Timestamp: testTime, + }, + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "request_count", + "some_label_name": "some_label_value", + "quantile": "0.99", + }, + Value: -42, + Timestamp: testTime, + }, + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "request_count", + "some_label_name": "some_label_value", + "quantile": "0.999", + }, + Value: -84, + Timestamp: testTime, + }, + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "request_count_count", + "another_label_name": "another_label_value", + }, + Value: 0, + Timestamp: testTime, + }, + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "request_count_sum", + "another_label_name": "another_label_value", + }, + Value: 0, + Timestamp: testTime, + }, + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "request_count", + "another_label_name": "another_label_value", + "quantile": "0.5", + }, + Value: 10, + Timestamp: testTime, + }, + }, + }, + { + in: "\x8d\x01\n\x1drequest_duration_microseconds\x12\x15The response latency.\x18\x04\"S:Q\b\x85\x15\x11\xcd\xcc\xccL\x8f\xcb:A\x1a\v\b{\x11\x00\x00\x00\x00\x00\x00Y@\x1a\f\b\x9c\x03\x11\x00\x00\x00\x00\x00\x00^@\x1a\f\b\xd0\x04\x11\x00\x00\x00\x00\x00\x00b@\x1a\f\b\xf4\v\x11\x9a\x99\x99\x99\x99\x99e@\x1a\f\b\x85\x15\x11\x00\x00\x00\x00\x00\x00\xf0\u007f", + expected: model.Vector{ + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "request_duration_microseconds_bucket", + "le": "100", + }, + Value: 123, + Timestamp: testTime, + }, + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "request_duration_microseconds_bucket", + "le": "120", + }, + Value: 412, + Timestamp: testTime, + }, + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "request_duration_microseconds_bucket", + "le": "144", + }, + Value: 592, + Timestamp: testTime, + }, + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "request_duration_microseconds_bucket", + "le": "172.8", + }, + Value: 1524, + Timestamp: testTime, + }, + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "request_duration_microseconds_bucket", + "le": "+Inf", + }, + Value: 2693, + Timestamp: testTime, + }, + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "request_duration_microseconds_sum", + }, + Value: 1756047.3, + Timestamp: testTime, + }, + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "request_duration_microseconds_count", + }, + Value: 2693, + Timestamp: testTime, + }, + }, + }, + { + // The metric type is unset in this protobuf, which needs to be handled + // correctly by the decoder. + in: "\x1c\n\rrequest_count\"\v\x1a\t\t\x00\x00\x00\x00\x00\x00\xf0?", + expected: model.Vector{ + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "request_count", + }, + Value: 1, + Timestamp: testTime, + }, + }, + }, + } + + for i, scenario := range scenarios { + dec := &SampleDecoder{ + Dec: &protoDecoder{r: strings.NewReader(scenario.in)}, + Opts: &DecodeOptions{ + Timestamp: testTime, + }, + } + + var all model.Vector + for { + var smpls model.Vector + err := dec.Decode(&smpls) + if err == io.EOF { + break + } + if scenario.fail { + if err == nil { + t.Fatal("Expected error but got none") + } + break + } + if err != nil { + t.Fatal(err) + } + all = append(all, smpls...) + } + sort.Sort(all) + sort.Sort(scenario.expected) + if !reflect.DeepEqual(all, scenario.expected) { + t.Fatalf("%d. output does not match, want: %#v, got %#v", i, scenario.expected, all) + } + } +} + +func testDiscriminatorHTTPHeader(t testing.TB) { + var scenarios = []struct { + input map[string]string + output Format + err error + }{ + { + input: map[string]string{"Content-Type": `application/vnd.google.protobuf; proto="io.prometheus.client.MetricFamily"; encoding="delimited"`}, + output: FmtProtoDelim, + }, + { + input: map[string]string{"Content-Type": `application/vnd.google.protobuf; proto="illegal"; encoding="delimited"`}, + output: FmtUnknown, + }, + { + input: map[string]string{"Content-Type": `application/vnd.google.protobuf; proto="io.prometheus.client.MetricFamily"; encoding="illegal"`}, + output: FmtUnknown, + }, + { + input: map[string]string{"Content-Type": `text/plain; version=0.0.4`}, + output: FmtText, + }, + { + input: map[string]string{"Content-Type": `text/plain`}, + output: FmtText, + }, + { + input: map[string]string{"Content-Type": `text/plain; version=0.0.3`}, + output: FmtUnknown, + }, + } + + for i, scenario := range scenarios { + var header http.Header + + if len(scenario.input) > 0 { + header = http.Header{} + } + + for key, value := range scenario.input { + header.Add(key, value) + } + + actual := ResponseFormat(header) + + if scenario.output != actual { + t.Errorf("%d. expected %s, got %s", i, scenario.output, actual) + } + } +} + +func TestDiscriminatorHTTPHeader(t *testing.T) { + testDiscriminatorHTTPHeader(t) +} + +func BenchmarkDiscriminatorHTTPHeader(b *testing.B) { + for i := 0; i < b.N; i++ { + testDiscriminatorHTTPHeader(b) + } +} + +func TestExtractSamples(t *testing.T) { + var ( + goodMetricFamily1 = &dto.MetricFamily{ + Name: proto.String("foo"), + Help: proto.String("Help for foo."), + Type: dto.MetricType_COUNTER.Enum(), + Metric: []*dto.Metric{ + &dto.Metric{ + Counter: &dto.Counter{ + Value: proto.Float64(4711), + }, + }, + }, + } + goodMetricFamily2 = &dto.MetricFamily{ + Name: proto.String("bar"), + Help: proto.String("Help for bar."), + Type: dto.MetricType_GAUGE.Enum(), + Metric: []*dto.Metric{ + &dto.Metric{ + Gauge: &dto.Gauge{ + Value: proto.Float64(3.14), + }, + }, + }, + } + badMetricFamily = &dto.MetricFamily{ + Name: proto.String("bad"), + Help: proto.String("Help for bad."), + Type: dto.MetricType(42).Enum(), + Metric: []*dto.Metric{ + &dto.Metric{ + Gauge: &dto.Gauge{ + Value: proto.Float64(2.7), + }, + }, + }, + } + + opts = &DecodeOptions{ + Timestamp: 42, + } + ) + + got, err := ExtractSamples(opts, goodMetricFamily1, goodMetricFamily2) + if err != nil { + t.Error("Unexpected error from ExtractSamples:", err) + } + want := model.Vector{ + &model.Sample{Metric: model.Metric{model.MetricNameLabel: "foo"}, Value: 4711, Timestamp: 42}, + &model.Sample{Metric: model.Metric{model.MetricNameLabel: "bar"}, Value: 3.14, Timestamp: 42}, + } + if !reflect.DeepEqual(got, want) { + t.Errorf("unexpected samples extracted, got: %v, want: %v", got, want) + } + + got, err = ExtractSamples(opts, goodMetricFamily1, badMetricFamily, goodMetricFamily2) + if err == nil { + t.Error("Expected error from ExtractSamples") + } + if !reflect.DeepEqual(got, want) { + t.Errorf("unexpected samples extracted, got: %v, want: %v", got, want) + } +} diff --git a/api/vendor/github.com/prometheus/common/expfmt/encode.go b/api/vendor/github.com/prometheus/common/expfmt/encode.go new file mode 100644 index 0000000..11839ed --- /dev/null +++ b/api/vendor/github.com/prometheus/common/expfmt/encode.go @@ -0,0 +1,88 @@ +// Copyright 2015 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 expfmt + +import ( + "fmt" + "io" + "net/http" + + "github.com/golang/protobuf/proto" + "github.com/matttproud/golang_protobuf_extensions/pbutil" + "github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg" + + dto "github.com/prometheus/client_model/go" +) + +// Encoder types encode metric families into an underlying wire protocol. +type Encoder interface { + Encode(*dto.MetricFamily) error +} + +type encoder func(*dto.MetricFamily) error + +func (e encoder) Encode(v *dto.MetricFamily) error { + return e(v) +} + +// Negotiate returns the Content-Type based on the given Accept header. +// If no appropriate accepted type is found, FmtText is returned. +func Negotiate(h http.Header) Format { + for _, ac := range goautoneg.ParseAccept(h.Get(hdrAccept)) { + // Check for protocol buffer + if ac.Type+"/"+ac.SubType == ProtoType && ac.Params["proto"] == ProtoProtocol { + switch ac.Params["encoding"] { + case "delimited": + return FmtProtoDelim + case "text": + return FmtProtoText + case "compact-text": + return FmtProtoCompact + } + } + // Check for text format. + ver := ac.Params["version"] + if ac.Type == "text" && ac.SubType == "plain" && (ver == TextVersion || ver == "") { + return FmtText + } + } + return FmtText +} + +// NewEncoder returns a new encoder based on content type negotiation. +func NewEncoder(w io.Writer, format Format) Encoder { + switch format { + case FmtProtoDelim: + return encoder(func(v *dto.MetricFamily) error { + _, err := pbutil.WriteDelimited(w, v) + return err + }) + case FmtProtoCompact: + return encoder(func(v *dto.MetricFamily) error { + _, err := fmt.Fprintln(w, v.String()) + return err + }) + case FmtProtoText: + return encoder(func(v *dto.MetricFamily) error { + _, err := fmt.Fprintln(w, proto.MarshalTextString(v)) + return err + }) + case FmtText: + return encoder(func(v *dto.MetricFamily) error { + _, err := MetricFamilyToText(w, v) + return err + }) + } + panic("expfmt.NewEncoder: unknown format") +} diff --git a/api/vendor/github.com/prometheus/common/expfmt/expfmt.go b/api/vendor/github.com/prometheus/common/expfmt/expfmt.go new file mode 100644 index 0000000..c71bcb9 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/expfmt/expfmt.go @@ -0,0 +1,38 @@ +// Copyright 2015 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 expfmt contains tools for reading and writing Prometheus metrics. +package expfmt + +// Format specifies the HTTP content type of the different wire protocols. +type Format string + +// Constants to assemble the Content-Type values for the different wire protocols. +const ( + TextVersion = "0.0.4" + ProtoType = `application/vnd.google.protobuf` + ProtoProtocol = `io.prometheus.client.MetricFamily` + ProtoFmt = ProtoType + "; proto=" + ProtoProtocol + ";" + + // The Content-Type values for the different wire protocols. + FmtUnknown Format = `` + FmtText Format = `text/plain; version=` + TextVersion + `; charset=utf-8` + FmtProtoDelim Format = ProtoFmt + ` encoding=delimited` + FmtProtoText Format = ProtoFmt + ` encoding=text` + FmtProtoCompact Format = ProtoFmt + ` encoding=compact-text` +) + +const ( + hdrContentType = "Content-Type" + hdrAccept = "Accept" +) diff --git a/api/vendor/github.com/prometheus/common/expfmt/fuzz.go b/api/vendor/github.com/prometheus/common/expfmt/fuzz.go new file mode 100644 index 0000000..dc2eede --- /dev/null +++ b/api/vendor/github.com/prometheus/common/expfmt/fuzz.go @@ -0,0 +1,36 @@ +// Copyright 2014 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. + +// Build only when actually fuzzing +// +build gofuzz + +package expfmt + +import "bytes" + +// Fuzz text metric parser with with github.com/dvyukov/go-fuzz: +// +// go-fuzz-build github.com/prometheus/common/expfmt +// go-fuzz -bin expfmt-fuzz.zip -workdir fuzz +// +// Further input samples should go in the folder fuzz/corpus. +func Fuzz(in []byte) int { + parser := TextParser{} + _, err := parser.TextToMetricFamilies(bytes.NewReader(in)) + + if err != nil { + return 0 + } + + return 1 +} diff --git a/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_0 b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_0 new file mode 100644 index 0000000..139597f --- /dev/null +++ b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_0 @@ -0,0 +1,2 @@ + + diff --git a/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_1 b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_1 new file mode 100644 index 0000000..2ae8706 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_1 @@ -0,0 +1,6 @@ + +minimal_metric 1.234 +another_metric -3e3 103948 +# Even that: +no_labels{} 3 +# HELP line for non-existing metric will be ignored. diff --git a/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_2 b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_2 new file mode 100644 index 0000000..5c351db --- /dev/null +++ b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_2 @@ -0,0 +1,12 @@ + +# A normal comment. +# +# TYPE name counter +name{labelname="val1",basename="basevalue"} NaN +name {labelname="val2",basename="base\"v\\al\nue"} 0.23 1234567890 +# HELP name two-line\n doc str\\ing + + # HELP name2 doc str"ing 2 + # TYPE name2 gauge +name2{labelname="val2" ,basename = "basevalue2" } +Inf 54321 +name2{ labelname = "val1" , }-Inf diff --git a/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_3 b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_3 new file mode 100644 index 0000000..0b3c345 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_3 @@ -0,0 +1,22 @@ + +# TYPE my_summary summary +my_summary{n1="val1",quantile="0.5"} 110 +decoy -1 -2 +my_summary{n1="val1",quantile="0.9"} 140 1 +my_summary_count{n1="val1"} 42 +# Latest timestamp wins in case of a summary. +my_summary_sum{n1="val1"} 4711 2 +fake_sum{n1="val1"} 2001 +# TYPE another_summary summary +another_summary_count{n2="val2",n1="val1"} 20 +my_summary_count{n2="val2",n1="val1"} 5 5 +another_summary{n1="val1",n2="val2",quantile=".3"} -1.2 +my_summary_sum{n1="val2"} 08 15 +my_summary{n1="val3", quantile="0.2"} 4711 + my_summary{n1="val1",n2="val2",quantile="-12.34",} NaN +# some +# funny comments +# HELP +# HELP +# HELP my_summary +# HELP my_summary diff --git a/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_4 b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_4 new file mode 100644 index 0000000..bde0a38 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_4 @@ -0,0 +1,10 @@ + +# HELP request_duration_microseconds The response latency. +# TYPE request_duration_microseconds histogram +request_duration_microseconds_bucket{le="100"} 123 +request_duration_microseconds_bucket{le="120"} 412 +request_duration_microseconds_bucket{le="144"} 592 +request_duration_microseconds_bucket{le="172.8"} 1524 +request_duration_microseconds_bucket{le="+Inf"} 2693 +request_duration_microseconds_sum 1.7560473e+06 +request_duration_microseconds_count 2693 diff --git a/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_0 b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_0 new file mode 100644 index 0000000..4c67f9a --- /dev/null +++ b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_0 @@ -0,0 +1 @@ +bla 3.14 \ No newline at end of file diff --git a/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_1 b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_1 new file mode 100644 index 0000000..b853478 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_1 @@ -0,0 +1 @@ +metric{label="\t"} 3.14 \ No newline at end of file diff --git a/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_10 b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_10 new file mode 100644 index 0000000..b5fe5f5 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_10 @@ -0,0 +1 @@ +metric{label="bla"} 3.14 2 3 diff --git a/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_11 b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_11 new file mode 100644 index 0000000..57c7fbc --- /dev/null +++ b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_11 @@ -0,0 +1 @@ +metric{label="bla"} blubb diff --git a/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_12 b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_12 new file mode 100644 index 0000000..0a9df79 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_12 @@ -0,0 +1,3 @@ + +# HELP metric one +# HELP metric two diff --git a/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_13 b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_13 new file mode 100644 index 0000000..5bc7427 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_13 @@ -0,0 +1,3 @@ + +# TYPE metric counter +# TYPE metric untyped diff --git a/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_14 b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_14 new file mode 100644 index 0000000..a9a2426 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_14 @@ -0,0 +1,3 @@ + +metric 4.12 +# TYPE metric counter diff --git a/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_15 b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_15 new file mode 100644 index 0000000..7e95ca8 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_15 @@ -0,0 +1,2 @@ + +# TYPE metric bla diff --git a/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_16 b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_16 new file mode 100644 index 0000000..7825f88 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_16 @@ -0,0 +1,2 @@ + +# TYPE met-ric diff --git a/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_17 b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_17 new file mode 100644 index 0000000..8f35cae --- /dev/null +++ b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_17 @@ -0,0 +1 @@ +@invalidmetric{label="bla"} 3.14 2 \ No newline at end of file diff --git a/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_18 b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_18 new file mode 100644 index 0000000..7ca2cc2 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_18 @@ -0,0 +1 @@ +{label="bla"} 3.14 2 \ No newline at end of file diff --git a/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_19 b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_19 new file mode 100644 index 0000000..7a6ccc0 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_19 @@ -0,0 +1,3 @@ + +# TYPE metric histogram +metric_bucket{le="bla"} 3.14 diff --git a/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_2 b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_2 new file mode 100644 index 0000000..726d001 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_2 @@ -0,0 +1,3 @@ + +metric{label="new +line"} 3.14 diff --git a/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_3 b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_3 new file mode 100644 index 0000000..6aa9e30 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_3 @@ -0,0 +1 @@ +metric{@="bla"} 3.14 \ No newline at end of file diff --git a/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_4 b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_4 new file mode 100644 index 0000000..d112cb9 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_4 @@ -0,0 +1 @@ +metric{__name__="bla"} 3.14 \ No newline at end of file diff --git a/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_5 b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_5 new file mode 100644 index 0000000..b34554a --- /dev/null +++ b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_5 @@ -0,0 +1 @@ +metric{label+="bla"} 3.14 \ No newline at end of file diff --git a/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_6 b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_6 new file mode 100644 index 0000000..c4d7df3 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_6 @@ -0,0 +1 @@ +metric{label=bla} 3.14 \ No newline at end of file diff --git a/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_7 b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_7 new file mode 100644 index 0000000..97eafc4 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_7 @@ -0,0 +1,3 @@ + +# TYPE metric summary +metric{quantile="bla"} 3.14 diff --git a/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_8 b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_8 new file mode 100644 index 0000000..fc70649 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_8 @@ -0,0 +1 @@ +metric{label="bla"+} 3.14 \ No newline at end of file diff --git a/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_9 b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_9 new file mode 100644 index 0000000..57b4879 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_9 @@ -0,0 +1 @@ +metric{label="bla"} 3.14 2.72 diff --git a/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/minimal b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/minimal new file mode 100644 index 0000000..be1e6a3 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/minimal @@ -0,0 +1 @@ +m{} 0 diff --git a/api/vendor/github.com/prometheus/common/expfmt/testdata/json2 b/api/vendor/github.com/prometheus/common/expfmt/testdata/json2 new file mode 100644 index 0000000..b914c93 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/expfmt/testdata/json2 @@ -0,0 +1,46 @@ +[ + { + "baseLabels": { + "__name__": "rpc_calls_total", + "job": "batch_job" + }, + "docstring": "RPC calls.", + "metric": { + "type": "counter", + "value": [ + { + "labels": { + "service": "zed" + }, + "value": 25 + }, + { + "labels": { + "service": "bar" + }, + "value": 24 + } + ] + } + }, + { + "baseLabels": { + "__name__": "rpc_latency_microseconds" + }, + "docstring": "RPC latency.", + "metric": { + "type": "histogram", + "value": [ + { + "labels": { + "service": "foo" + }, + "value": { + "0.010000": 15, + "0.990000": 17 + } + } + ] + } + } +] diff --git a/api/vendor/github.com/prometheus/common/expfmt/testdata/json2_bad b/api/vendor/github.com/prometheus/common/expfmt/testdata/json2_bad new file mode 100644 index 0000000..cc6ac97 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/expfmt/testdata/json2_bad @@ -0,0 +1,46 @@ +[ + { + "baseLabels": { + "__name__": "rpc_calls_total", + "job": "batch_job" + }, + "docstring": "RPC calls.", + "metric": { + "type": "counter", + "value": [ + { + "labels": { + "servic|e": "zed" + }, + "value": 25 + }, + { + "labels": { + "service": "bar" + }, + "value": 24 + } + ] + } + }, + { + "baseLabels": { + "__name__": "rpc_latency_microseconds" + }, + "docstring": "RPC latency.", + "metric": { + "type": "histogram", + "value": [ + { + "labels": { + "service": "foo" + }, + "value": { + "0.010000": 15, + "0.990000": 17 + } + } + ] + } + } +] diff --git a/api/vendor/github.com/prometheus/common/expfmt/testdata/protobuf b/api/vendor/github.com/prometheus/common/expfmt/testdata/protobuf new file mode 100644 index 0000000000000000000000000000000000000000..b2d018a7c1e3687e4fa1e149808beb95a048b907 GIT binary patch literal 8239 zcmeHMO^h5z74F&f&urOoyd4LxH?}Fa6=&^uXV!rbfk?Jj4oWb=BzQ?cIJA4aYi1hH zbhoRjvpXgS6Cxp`pacmC@vBIH00~(>a>IfgIDkMxfIvcWgoJV+!ioeZ4!ruC?wXzT zuA&iKb`O@Ps=D5*_g;PPy|11^hjW@mgt6d-gz_Tn20hZtXg^r#bHdys&#Fq%7MSR<2RSSUqc^+-Fk#~NWp?`7QuFmXEbb+AnK6la-JnA58{G` zJjv3amvp-cBT<&d%zbXTL$H~`b0DNTeG(@e^DMgz|KM^j&}Ck$24ZOvF&w5b?vOBs zRYiK4Rh1Nq{;Y-`-cZS$P?j(rbVE+ks1FK8G&2gGS;DO7^+MXmSqrNr31PUEQLH~q z(l#bx)KRhAvETe!{QYBb zy7RTSUtGMBh_UNWym|G&^?xo-AKLNkzPDfgf&Y2b+*I)^1u4MRVID>a@4Iutraa?e z7n?DmJNUoZPz`0Uf4!aV5_%yNxm!T3A5$ zqTL;cWH6hHN>8A>&@OSkve=z$6Ar@V$!R4uF`}9TwwjJ zbpq#x|Cbti?}ie(ByIDK`=i>~bw)}c_@rUPZM~B`{1JgTVmXeoUQPi~0R_8VqYx%* zIe=IUppCN>@F1iRJ2+(Wmx4{)3IT2V0J{y+09Pm|)ldNkBRGYB;5L?sFCyYUb>vlJ zz6$LX{U7P_xI#r{%4KtsTU@yQusEftw#^vIC4pwM6$0N@xy>LQvh zt+lJ!reWS0pN&3?_LsZwY(iO+k8ktOp?k{B>rKWXzei&B!a_1X=|!(r`42G20-pu7?_>nTPrbqg$Y= zaa}8)w(VmSTn!U0I!&MlRs=->M<=lj^N!O-_gAD@?WirJX$u+EzCz*3O=UhT=R7)M zG7}{%iJ|?md6lD|)We$+E6$CtEOpQWo2YHNd$%DJH@{4`GD>}EQ(N!P_&=?olNCvJ zIH^u5$Oe)6ej!V-3uVCQehad$B6*l-JHSv0#k`-(R`))%5A6^?++7hRz#Eu87UID> zg^uXSdwU_UMI;T=hy)3+MUt2rtUckMMf;7FMUs~V06sqm-7O^kNBwtdXl}z3%RaSo z;P;I>uxe)C)p>8cwF-TJ({HHl+%sV4Iz9n8Gqdq<)0R5Mc?Dsv{N z12ccS?|ZYr6{z{0MQVThMh$&!1{{ za|CjTv0>zJT4-VOLn!1h_rX0r>UIniA8{pq=l^-ax)Q2IfpFx6z5w*50wu#FxyP0w zL81cwsCkHf!dHo42O?+<2+)xe-b*#`dEG2=C(k_0ysW-g;pr_RaPkWW#Cc!V3C1}s z#uU%=6Kl*)L{3Aj8^T>VHe|hq?|rcbx3E-V;*8LtP&!=u*a#h@XNGi;V?#QO^5E^o z^&Y&vcn;mw&VqJEvjU(SD4bK};+*R^N-2+bNOfIf!uKrnU# zuYBNw7*i~sp+8mQ00|G!1s7?uhDn|Y9;L$XDYD~Hba4KyGk;k6ZO!7o2)MrpfxW7d z9%Zn*GEWWoY(WwWPDXzP>^Bps3X)V*a6rWg?+V!epw6jt{}cNsR%FwnOM+6ppcN+F z0OB)v9o4})T}N;z!lpKmUS&1d1#Be@Csm_M>XTG*RLke`VWd(F_~r@&5vR CKJmZ+ literal 0 HcmV?d00001 diff --git a/api/vendor/github.com/prometheus/common/expfmt/testdata/protobuf.gz b/api/vendor/github.com/prometheus/common/expfmt/testdata/protobuf.gz new file mode 100644 index 0000000000000000000000000000000000000000..7622adb1c8a1166549e339920a5823cf5493d0a6 GIT binary patch literal 2097 zcmV-12+sE(iwFoAHid)vHwry&KEBu?IG@6G5K^8#imAXN ziq63wT<`*2W;4}5ETb;RPUztdaXg?(!gHFE^7l&v-91vtm@rPcuzg36(CvbPE{k#n zk1t@J1c3vxq83g`DB-vjF`O-=VH*?2?WD3BQ)9K0wFj%0jLCo1&%7}G;qR^#=pZmSlyIpe^dEli?-fluqw! z52vHR&j|(fGrMpSdeSJ4Pnf_OA6$n|I6v1<6p6>8I3}J>bX3~#q1pr0%4B|kWfPXh zdL}H5^-P$Lok4qZcX#8&&Xl*6h0M7{WvGM`rksd(xgY^P@yJ)PpaH==Cd%P(wyZH# zscoB{nE1($#l=T(PJ{!;Ba+j7XdBw( zMjkQ8@0y!Kx1p^aPy)U`ar3p}u=GbE5C|sCnh#Nx00Y0N>9| zr{AT^)}IaZ$&nI#61GLheAPHHpg0BRQ+lr@4}U=-jwHu!6vPbfB%q-0_s){6!~kL* zfHsaoIC6)9?_h_kuM{?M%Yp0M1=wwnMh{A}%>o~SL-=#FA58yUMYXcem!Z9coOjBj zDZ70MJr&LuwDP_`ji1My#Vtok5d@ge}cBbK=hWasLL| zRdC!q}ZUNHNzvQgYAPGu18bR2`Eyzg90Y?Y2E7sqt zXpaVDGSSU)U_5|ca*~(Q;0?&Sem~fNtPRMzVdno+$WkPKylM?dm}Ay}gmg@o0ApX) zazPKODegg58=XtyJT2cZ;iiDE`%j&oJ$*mUXv*n$rLxcZm0qaz=lvd8fkfV3a)jGa zkjBl0N3{Yir@@LQL$-P$K2HUqTue!N6`7HnZO|a;Sii{!4FY2UYOJllmMhQb_Q@4o zcBm@9MTD0~x-D6~==o|J9UfWMYC@X2kYVL(IWzBdXU-ceU$@W$%fZ# ztW++4f1!i!SVQezrP5GUP+zq&O#LBxf8Bb+Ku1R&M_NhQQO{F9J+y#K>n(`7ERzIf z2e6|Ii*Bq+-P_Slv`K!LTUWIvGQFyvShXqH z6;QL|F%5e&&snttfa2-Qgn%%|W$PfHzt**C(`ZLFzc~r@wQm~e^VbU+Lz_MK=opeh zM-NH*YP(|H0CL%_xf1VMe;U)SL>ljH>6q+EkeK2{-bpeK zF1V^)n$Lqb5V1^TweCWkO_RlE3^?;@PGXK9znj;h>h^SJSBb>QZ||1-eKz0ij2uh* zOs{KWeb#FX!QI9X+-+F3?-<~fg%V@Or4C6t|MVA!=%7xaPlxM0!E5t_I$WDSiFULj zyB)D80q6!)JXT!ZVieBE5qV?B?_xMBF7z(Wqn3-Nb0~nMfC*c6?0Tp2nbUGC?c(L_ z&y*T)7tjSKAzi^Fj+7f0{k>Giy=c$u`^SI3@Q$JNz6h8talqk5^s{HQezv?PvL}lV%q!#=sDv?ZLc(bJSl z<^3v}%E~Jq!`4Z;zB*W{uhQ9#0_!8m*eI}W!de>z*8f$3_12M{3j-3yE)K@E-4_Sr z8op@##z6P1k`@3|QO}MU@gv9Uf2rvXgSd>gc(7rlMHtIU4F|I7a8`vRnarojZv!uO zD8QF|i5NYy4w)5GpIcSOyl~6vsa4)3E0tHqw4|>; zWDO6*hXw<28o2cMD_wI!aa37zRYd|&3|y0!!}5(fzg2V4C(05g7%0d*T}0z1L{u$X bD-^Z%LVr9zyh@v4WE}qw(Kt;cFCYK_^s^0< literal 0 HcmV?d00001 diff --git a/api/vendor/github.com/prometheus/common/expfmt/testdata/text b/api/vendor/github.com/prometheus/common/expfmt/testdata/text new file mode 100644 index 0000000..f3d8c37 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/expfmt/testdata/text @@ -0,0 +1,322 @@ +# HELP http_request_duration_microseconds The HTTP request latencies in microseconds. +# TYPE http_request_duration_microseconds summary +http_request_duration_microseconds{handler="/",quantile="0.5"} 0 +http_request_duration_microseconds{handler="/",quantile="0.9"} 0 +http_request_duration_microseconds{handler="/",quantile="0.99"} 0 +http_request_duration_microseconds_sum{handler="/"} 0 +http_request_duration_microseconds_count{handler="/"} 0 +http_request_duration_microseconds{handler="/alerts",quantile="0.5"} 0 +http_request_duration_microseconds{handler="/alerts",quantile="0.9"} 0 +http_request_duration_microseconds{handler="/alerts",quantile="0.99"} 0 +http_request_duration_microseconds_sum{handler="/alerts"} 0 +http_request_duration_microseconds_count{handler="/alerts"} 0 +http_request_duration_microseconds{handler="/api/metrics",quantile="0.5"} 0 +http_request_duration_microseconds{handler="/api/metrics",quantile="0.9"} 0 +http_request_duration_microseconds{handler="/api/metrics",quantile="0.99"} 0 +http_request_duration_microseconds_sum{handler="/api/metrics"} 0 +http_request_duration_microseconds_count{handler="/api/metrics"} 0 +http_request_duration_microseconds{handler="/api/query",quantile="0.5"} 0 +http_request_duration_microseconds{handler="/api/query",quantile="0.9"} 0 +http_request_duration_microseconds{handler="/api/query",quantile="0.99"} 0 +http_request_duration_microseconds_sum{handler="/api/query"} 0 +http_request_duration_microseconds_count{handler="/api/query"} 0 +http_request_duration_microseconds{handler="/api/query_range",quantile="0.5"} 0 +http_request_duration_microseconds{handler="/api/query_range",quantile="0.9"} 0 +http_request_duration_microseconds{handler="/api/query_range",quantile="0.99"} 0 +http_request_duration_microseconds_sum{handler="/api/query_range"} 0 +http_request_duration_microseconds_count{handler="/api/query_range"} 0 +http_request_duration_microseconds{handler="/api/targets",quantile="0.5"} 0 +http_request_duration_microseconds{handler="/api/targets",quantile="0.9"} 0 +http_request_duration_microseconds{handler="/api/targets",quantile="0.99"} 0 +http_request_duration_microseconds_sum{handler="/api/targets"} 0 +http_request_duration_microseconds_count{handler="/api/targets"} 0 +http_request_duration_microseconds{handler="/consoles/",quantile="0.5"} 0 +http_request_duration_microseconds{handler="/consoles/",quantile="0.9"} 0 +http_request_duration_microseconds{handler="/consoles/",quantile="0.99"} 0 +http_request_duration_microseconds_sum{handler="/consoles/"} 0 +http_request_duration_microseconds_count{handler="/consoles/"} 0 +http_request_duration_microseconds{handler="/graph",quantile="0.5"} 0 +http_request_duration_microseconds{handler="/graph",quantile="0.9"} 0 +http_request_duration_microseconds{handler="/graph",quantile="0.99"} 0 +http_request_duration_microseconds_sum{handler="/graph"} 0 +http_request_duration_microseconds_count{handler="/graph"} 0 +http_request_duration_microseconds{handler="/heap",quantile="0.5"} 0 +http_request_duration_microseconds{handler="/heap",quantile="0.9"} 0 +http_request_duration_microseconds{handler="/heap",quantile="0.99"} 0 +http_request_duration_microseconds_sum{handler="/heap"} 0 +http_request_duration_microseconds_count{handler="/heap"} 0 +http_request_duration_microseconds{handler="/static/",quantile="0.5"} 0 +http_request_duration_microseconds{handler="/static/",quantile="0.9"} 0 +http_request_duration_microseconds{handler="/static/",quantile="0.99"} 0 +http_request_duration_microseconds_sum{handler="/static/"} 0 +http_request_duration_microseconds_count{handler="/static/"} 0 +http_request_duration_microseconds{handler="prometheus",quantile="0.5"} 1307.275 +http_request_duration_microseconds{handler="prometheus",quantile="0.9"} 1858.632 +http_request_duration_microseconds{handler="prometheus",quantile="0.99"} 3087.384 +http_request_duration_microseconds_sum{handler="prometheus"} 179886.5000000001 +http_request_duration_microseconds_count{handler="prometheus"} 119 +# HELP http_request_size_bytes The HTTP request sizes in bytes. +# TYPE http_request_size_bytes summary +http_request_size_bytes{handler="/",quantile="0.5"} 0 +http_request_size_bytes{handler="/",quantile="0.9"} 0 +http_request_size_bytes{handler="/",quantile="0.99"} 0 +http_request_size_bytes_sum{handler="/"} 0 +http_request_size_bytes_count{handler="/"} 0 +http_request_size_bytes{handler="/alerts",quantile="0.5"} 0 +http_request_size_bytes{handler="/alerts",quantile="0.9"} 0 +http_request_size_bytes{handler="/alerts",quantile="0.99"} 0 +http_request_size_bytes_sum{handler="/alerts"} 0 +http_request_size_bytes_count{handler="/alerts"} 0 +http_request_size_bytes{handler="/api/metrics",quantile="0.5"} 0 +http_request_size_bytes{handler="/api/metrics",quantile="0.9"} 0 +http_request_size_bytes{handler="/api/metrics",quantile="0.99"} 0 +http_request_size_bytes_sum{handler="/api/metrics"} 0 +http_request_size_bytes_count{handler="/api/metrics"} 0 +http_request_size_bytes{handler="/api/query",quantile="0.5"} 0 +http_request_size_bytes{handler="/api/query",quantile="0.9"} 0 +http_request_size_bytes{handler="/api/query",quantile="0.99"} 0 +http_request_size_bytes_sum{handler="/api/query"} 0 +http_request_size_bytes_count{handler="/api/query"} 0 +http_request_size_bytes{handler="/api/query_range",quantile="0.5"} 0 +http_request_size_bytes{handler="/api/query_range",quantile="0.9"} 0 +http_request_size_bytes{handler="/api/query_range",quantile="0.99"} 0 +http_request_size_bytes_sum{handler="/api/query_range"} 0 +http_request_size_bytes_count{handler="/api/query_range"} 0 +http_request_size_bytes{handler="/api/targets",quantile="0.5"} 0 +http_request_size_bytes{handler="/api/targets",quantile="0.9"} 0 +http_request_size_bytes{handler="/api/targets",quantile="0.99"} 0 +http_request_size_bytes_sum{handler="/api/targets"} 0 +http_request_size_bytes_count{handler="/api/targets"} 0 +http_request_size_bytes{handler="/consoles/",quantile="0.5"} 0 +http_request_size_bytes{handler="/consoles/",quantile="0.9"} 0 +http_request_size_bytes{handler="/consoles/",quantile="0.99"} 0 +http_request_size_bytes_sum{handler="/consoles/"} 0 +http_request_size_bytes_count{handler="/consoles/"} 0 +http_request_size_bytes{handler="/graph",quantile="0.5"} 0 +http_request_size_bytes{handler="/graph",quantile="0.9"} 0 +http_request_size_bytes{handler="/graph",quantile="0.99"} 0 +http_request_size_bytes_sum{handler="/graph"} 0 +http_request_size_bytes_count{handler="/graph"} 0 +http_request_size_bytes{handler="/heap",quantile="0.5"} 0 +http_request_size_bytes{handler="/heap",quantile="0.9"} 0 +http_request_size_bytes{handler="/heap",quantile="0.99"} 0 +http_request_size_bytes_sum{handler="/heap"} 0 +http_request_size_bytes_count{handler="/heap"} 0 +http_request_size_bytes{handler="/static/",quantile="0.5"} 0 +http_request_size_bytes{handler="/static/",quantile="0.9"} 0 +http_request_size_bytes{handler="/static/",quantile="0.99"} 0 +http_request_size_bytes_sum{handler="/static/"} 0 +http_request_size_bytes_count{handler="/static/"} 0 +http_request_size_bytes{handler="prometheus",quantile="0.5"} 291 +http_request_size_bytes{handler="prometheus",quantile="0.9"} 291 +http_request_size_bytes{handler="prometheus",quantile="0.99"} 291 +http_request_size_bytes_sum{handler="prometheus"} 34488 +http_request_size_bytes_count{handler="prometheus"} 119 +# HELP http_requests_total Total number of HTTP requests made. +# TYPE http_requests_total counter +http_requests_total{code="200",handler="prometheus",method="get"} 119 +# HELP http_response_size_bytes The HTTP response sizes in bytes. +# TYPE http_response_size_bytes summary +http_response_size_bytes{handler="/",quantile="0.5"} 0 +http_response_size_bytes{handler="/",quantile="0.9"} 0 +http_response_size_bytes{handler="/",quantile="0.99"} 0 +http_response_size_bytes_sum{handler="/"} 0 +http_response_size_bytes_count{handler="/"} 0 +http_response_size_bytes{handler="/alerts",quantile="0.5"} 0 +http_response_size_bytes{handler="/alerts",quantile="0.9"} 0 +http_response_size_bytes{handler="/alerts",quantile="0.99"} 0 +http_response_size_bytes_sum{handler="/alerts"} 0 +http_response_size_bytes_count{handler="/alerts"} 0 +http_response_size_bytes{handler="/api/metrics",quantile="0.5"} 0 +http_response_size_bytes{handler="/api/metrics",quantile="0.9"} 0 +http_response_size_bytes{handler="/api/metrics",quantile="0.99"} 0 +http_response_size_bytes_sum{handler="/api/metrics"} 0 +http_response_size_bytes_count{handler="/api/metrics"} 0 +http_response_size_bytes{handler="/api/query",quantile="0.5"} 0 +http_response_size_bytes{handler="/api/query",quantile="0.9"} 0 +http_response_size_bytes{handler="/api/query",quantile="0.99"} 0 +http_response_size_bytes_sum{handler="/api/query"} 0 +http_response_size_bytes_count{handler="/api/query"} 0 +http_response_size_bytes{handler="/api/query_range",quantile="0.5"} 0 +http_response_size_bytes{handler="/api/query_range",quantile="0.9"} 0 +http_response_size_bytes{handler="/api/query_range",quantile="0.99"} 0 +http_response_size_bytes_sum{handler="/api/query_range"} 0 +http_response_size_bytes_count{handler="/api/query_range"} 0 +http_response_size_bytes{handler="/api/targets",quantile="0.5"} 0 +http_response_size_bytes{handler="/api/targets",quantile="0.9"} 0 +http_response_size_bytes{handler="/api/targets",quantile="0.99"} 0 +http_response_size_bytes_sum{handler="/api/targets"} 0 +http_response_size_bytes_count{handler="/api/targets"} 0 +http_response_size_bytes{handler="/consoles/",quantile="0.5"} 0 +http_response_size_bytes{handler="/consoles/",quantile="0.9"} 0 +http_response_size_bytes{handler="/consoles/",quantile="0.99"} 0 +http_response_size_bytes_sum{handler="/consoles/"} 0 +http_response_size_bytes_count{handler="/consoles/"} 0 +http_response_size_bytes{handler="/graph",quantile="0.5"} 0 +http_response_size_bytes{handler="/graph",quantile="0.9"} 0 +http_response_size_bytes{handler="/graph",quantile="0.99"} 0 +http_response_size_bytes_sum{handler="/graph"} 0 +http_response_size_bytes_count{handler="/graph"} 0 +http_response_size_bytes{handler="/heap",quantile="0.5"} 0 +http_response_size_bytes{handler="/heap",quantile="0.9"} 0 +http_response_size_bytes{handler="/heap",quantile="0.99"} 0 +http_response_size_bytes_sum{handler="/heap"} 0 +http_response_size_bytes_count{handler="/heap"} 0 +http_response_size_bytes{handler="/static/",quantile="0.5"} 0 +http_response_size_bytes{handler="/static/",quantile="0.9"} 0 +http_response_size_bytes{handler="/static/",quantile="0.99"} 0 +http_response_size_bytes_sum{handler="/static/"} 0 +http_response_size_bytes_count{handler="/static/"} 0 +http_response_size_bytes{handler="prometheus",quantile="0.5"} 2049 +http_response_size_bytes{handler="prometheus",quantile="0.9"} 2058 +http_response_size_bytes{handler="prometheus",quantile="0.99"} 2064 +http_response_size_bytes_sum{handler="prometheus"} 247001 +http_response_size_bytes_count{handler="prometheus"} 119 +# HELP process_cpu_seconds_total Total user and system CPU time spent in seconds. +# TYPE process_cpu_seconds_total counter +process_cpu_seconds_total 0.55 +# HELP go_goroutines Number of goroutines that currently exist. +# TYPE go_goroutines gauge +go_goroutines 70 +# HELP process_max_fds Maximum number of open file descriptors. +# TYPE process_max_fds gauge +process_max_fds 8192 +# HELP process_open_fds Number of open file descriptors. +# TYPE process_open_fds gauge +process_open_fds 29 +# HELP process_resident_memory_bytes Resident memory size in bytes. +# TYPE process_resident_memory_bytes gauge +process_resident_memory_bytes 5.3870592e+07 +# HELP process_start_time_seconds Start time of the process since unix epoch in seconds. +# TYPE process_start_time_seconds gauge +process_start_time_seconds 1.42236894836e+09 +# HELP process_virtual_memory_bytes Virtual memory size in bytes. +# TYPE process_virtual_memory_bytes gauge +process_virtual_memory_bytes 5.41478912e+08 +# HELP prometheus_dns_sd_lookup_failures_total The number of DNS-SD lookup failures. +# TYPE prometheus_dns_sd_lookup_failures_total counter +prometheus_dns_sd_lookup_failures_total 0 +# HELP prometheus_dns_sd_lookups_total The number of DNS-SD lookups. +# TYPE prometheus_dns_sd_lookups_total counter +prometheus_dns_sd_lookups_total 7 +# HELP prometheus_evaluator_duration_milliseconds The duration for all evaluations to execute. +# TYPE prometheus_evaluator_duration_milliseconds summary +prometheus_evaluator_duration_milliseconds{quantile="0.01"} 0 +prometheus_evaluator_duration_milliseconds{quantile="0.05"} 0 +prometheus_evaluator_duration_milliseconds{quantile="0.5"} 0 +prometheus_evaluator_duration_milliseconds{quantile="0.9"} 1 +prometheus_evaluator_duration_milliseconds{quantile="0.99"} 1 +prometheus_evaluator_duration_milliseconds_sum 12 +prometheus_evaluator_duration_milliseconds_count 23 +# HELP prometheus_local_storage_checkpoint_duration_milliseconds The duration (in milliseconds) it took to checkpoint in-memory metrics and head chunks. +# TYPE prometheus_local_storage_checkpoint_duration_milliseconds gauge +prometheus_local_storage_checkpoint_duration_milliseconds 0 +# HELP prometheus_local_storage_chunk_ops_total The total number of chunk operations by their type. +# TYPE prometheus_local_storage_chunk_ops_total counter +prometheus_local_storage_chunk_ops_total{type="create"} 598 +prometheus_local_storage_chunk_ops_total{type="persist"} 174 +prometheus_local_storage_chunk_ops_total{type="pin"} 920 +prometheus_local_storage_chunk_ops_total{type="transcode"} 415 +prometheus_local_storage_chunk_ops_total{type="unpin"} 920 +# HELP prometheus_local_storage_indexing_batch_latency_milliseconds Quantiles for batch indexing latencies in milliseconds. +# TYPE prometheus_local_storage_indexing_batch_latency_milliseconds summary +prometheus_local_storage_indexing_batch_latency_milliseconds{quantile="0.5"} 0 +prometheus_local_storage_indexing_batch_latency_milliseconds{quantile="0.9"} 0 +prometheus_local_storage_indexing_batch_latency_milliseconds{quantile="0.99"} 0 +prometheus_local_storage_indexing_batch_latency_milliseconds_sum 0 +prometheus_local_storage_indexing_batch_latency_milliseconds_count 1 +# HELP prometheus_local_storage_indexing_batch_sizes Quantiles for indexing batch sizes (number of metrics per batch). +# TYPE prometheus_local_storage_indexing_batch_sizes summary +prometheus_local_storage_indexing_batch_sizes{quantile="0.5"} 2 +prometheus_local_storage_indexing_batch_sizes{quantile="0.9"} 2 +prometheus_local_storage_indexing_batch_sizes{quantile="0.99"} 2 +prometheus_local_storage_indexing_batch_sizes_sum 2 +prometheus_local_storage_indexing_batch_sizes_count 1 +# HELP prometheus_local_storage_indexing_queue_capacity The capacity of the indexing queue. +# TYPE prometheus_local_storage_indexing_queue_capacity gauge +prometheus_local_storage_indexing_queue_capacity 16384 +# HELP prometheus_local_storage_indexing_queue_length The number of metrics waiting to be indexed. +# TYPE prometheus_local_storage_indexing_queue_length gauge +prometheus_local_storage_indexing_queue_length 0 +# HELP prometheus_local_storage_ingested_samples_total The total number of samples ingested. +# TYPE prometheus_local_storage_ingested_samples_total counter +prometheus_local_storage_ingested_samples_total 30473 +# HELP prometheus_local_storage_invalid_preload_requests_total The total number of preload requests referring to a non-existent series. This is an indication of outdated label indexes. +# TYPE prometheus_local_storage_invalid_preload_requests_total counter +prometheus_local_storage_invalid_preload_requests_total 0 +# HELP prometheus_local_storage_memory_chunkdescs The current number of chunk descriptors in memory. +# TYPE prometheus_local_storage_memory_chunkdescs gauge +prometheus_local_storage_memory_chunkdescs 1059 +# HELP prometheus_local_storage_memory_chunks The current number of chunks in memory, excluding cloned chunks (i.e. chunks without a descriptor). +# TYPE prometheus_local_storage_memory_chunks gauge +prometheus_local_storage_memory_chunks 1020 +# HELP prometheus_local_storage_memory_series The current number of series in memory. +# TYPE prometheus_local_storage_memory_series gauge +prometheus_local_storage_memory_series 424 +# HELP prometheus_local_storage_persist_latency_microseconds A summary of latencies for persisting each chunk. +# TYPE prometheus_local_storage_persist_latency_microseconds summary +prometheus_local_storage_persist_latency_microseconds{quantile="0.5"} 30.377 +prometheus_local_storage_persist_latency_microseconds{quantile="0.9"} 203.539 +prometheus_local_storage_persist_latency_microseconds{quantile="0.99"} 2626.463 +prometheus_local_storage_persist_latency_microseconds_sum 20424.415 +prometheus_local_storage_persist_latency_microseconds_count 174 +# HELP prometheus_local_storage_persist_queue_capacity The total capacity of the persist queue. +# TYPE prometheus_local_storage_persist_queue_capacity gauge +prometheus_local_storage_persist_queue_capacity 1024 +# HELP prometheus_local_storage_persist_queue_length The current number of chunks waiting in the persist queue. +# TYPE prometheus_local_storage_persist_queue_length gauge +prometheus_local_storage_persist_queue_length 0 +# HELP prometheus_local_storage_series_ops_total The total number of series operations by their type. +# TYPE prometheus_local_storage_series_ops_total counter +prometheus_local_storage_series_ops_total{type="create"} 2 +prometheus_local_storage_series_ops_total{type="maintenance_in_memory"} 11 +# HELP prometheus_notifications_latency_milliseconds Latency quantiles for sending alert notifications (not including dropped notifications). +# TYPE prometheus_notifications_latency_milliseconds summary +prometheus_notifications_latency_milliseconds{quantile="0.5"} 0 +prometheus_notifications_latency_milliseconds{quantile="0.9"} 0 +prometheus_notifications_latency_milliseconds{quantile="0.99"} 0 +prometheus_notifications_latency_milliseconds_sum 0 +prometheus_notifications_latency_milliseconds_count 0 +# HELP prometheus_notifications_queue_capacity The capacity of the alert notifications queue. +# TYPE prometheus_notifications_queue_capacity gauge +prometheus_notifications_queue_capacity 100 +# HELP prometheus_notifications_queue_length The number of alert notifications in the queue. +# TYPE prometheus_notifications_queue_length gauge +prometheus_notifications_queue_length 0 +# HELP prometheus_rule_evaluation_duration_milliseconds The duration for a rule to execute. +# TYPE prometheus_rule_evaluation_duration_milliseconds summary +prometheus_rule_evaluation_duration_milliseconds{rule_type="alerting",quantile="0.5"} 0 +prometheus_rule_evaluation_duration_milliseconds{rule_type="alerting",quantile="0.9"} 0 +prometheus_rule_evaluation_duration_milliseconds{rule_type="alerting",quantile="0.99"} 2 +prometheus_rule_evaluation_duration_milliseconds_sum{rule_type="alerting"} 12 +prometheus_rule_evaluation_duration_milliseconds_count{rule_type="alerting"} 115 +prometheus_rule_evaluation_duration_milliseconds{rule_type="recording",quantile="0.5"} 0 +prometheus_rule_evaluation_duration_milliseconds{rule_type="recording",quantile="0.9"} 0 +prometheus_rule_evaluation_duration_milliseconds{rule_type="recording",quantile="0.99"} 3 +prometheus_rule_evaluation_duration_milliseconds_sum{rule_type="recording"} 15 +prometheus_rule_evaluation_duration_milliseconds_count{rule_type="recording"} 115 +# HELP prometheus_rule_evaluation_failures_total The total number of rule evaluation failures. +# TYPE prometheus_rule_evaluation_failures_total counter +prometheus_rule_evaluation_failures_total 0 +# HELP prometheus_samples_queue_capacity Capacity of the queue for unwritten samples. +# TYPE prometheus_samples_queue_capacity gauge +prometheus_samples_queue_capacity 4096 +# HELP prometheus_samples_queue_length Current number of items in the queue for unwritten samples. Each item comprises all samples exposed by one target as one metric family (i.e. metrics of the same name). +# TYPE prometheus_samples_queue_length gauge +prometheus_samples_queue_length 0 +# HELP prometheus_target_interval_length_seconds Actual intervals between scrapes. +# TYPE prometheus_target_interval_length_seconds summary +prometheus_target_interval_length_seconds{interval="15s",quantile="0.01"} 14 +prometheus_target_interval_length_seconds{interval="15s",quantile="0.05"} 14 +prometheus_target_interval_length_seconds{interval="15s",quantile="0.5"} 15 +prometheus_target_interval_length_seconds{interval="15s",quantile="0.9"} 15 +prometheus_target_interval_length_seconds{interval="15s",quantile="0.99"} 15 +prometheus_target_interval_length_seconds_sum{interval="15s"} 175 +prometheus_target_interval_length_seconds_count{interval="15s"} 12 +prometheus_target_interval_length_seconds{interval="1s",quantile="0.01"} 0 +prometheus_target_interval_length_seconds{interval="1s",quantile="0.05"} 0 +prometheus_target_interval_length_seconds{interval="1s",quantile="0.5"} 0 +prometheus_target_interval_length_seconds{interval="1s",quantile="0.9"} 1 +prometheus_target_interval_length_seconds{interval="1s",quantile="0.99"} 1 +prometheus_target_interval_length_seconds_sum{interval="1s"} 55 +prometheus_target_interval_length_seconds_count{interval="1s"} 117 diff --git a/api/vendor/github.com/prometheus/common/expfmt/testdata/text.gz b/api/vendor/github.com/prometheus/common/expfmt/testdata/text.gz new file mode 100644 index 0000000000000000000000000000000000000000..b7658c84d7d63018b286611cec48a8362bd7c71d GIT binary patch literal 2598 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 0 { + p.summaries = map[uint64]*dto.Metric{} + } + if p.histograms == nil || len(p.histograms) > 0 { + p.histograms = map[uint64]*dto.Metric{} + } + p.currentQuantile = math.NaN() + p.currentBucket = math.NaN() +} + +// startOfLine represents the state where the next byte read from p.buf is the +// start of a line (or whitespace leading up to it). +func (p *TextParser) startOfLine() stateFn { + p.lineCount++ + if p.skipBlankTab(); p.err != nil { + // End of input reached. This is the only case where + // that is not an error but a signal that we are done. + p.err = nil + return nil + } + switch p.currentByte { + case '#': + return p.startComment + case '\n': + return p.startOfLine // Empty line, start the next one. + } + return p.readingMetricName +} + +// startComment represents the state where the next byte read from p.buf is the +// start of a comment (or whitespace leading up to it). +func (p *TextParser) startComment() stateFn { + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentByte == '\n' { + return p.startOfLine + } + if p.readTokenUntilWhitespace(); p.err != nil { + return nil // Unexpected end of input. + } + // If we have hit the end of line already, there is nothing left + // to do. This is not considered a syntax error. + if p.currentByte == '\n' { + return p.startOfLine + } + keyword := p.currentToken.String() + if keyword != "HELP" && keyword != "TYPE" { + // Generic comment, ignore by fast forwarding to end of line. + for p.currentByte != '\n' { + if p.currentByte, p.err = p.buf.ReadByte(); p.err != nil { + return nil // Unexpected end of input. + } + } + return p.startOfLine + } + // There is something. Next has to be a metric name. + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.readTokenAsMetricName(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentByte == '\n' { + // At the end of the line already. + // Again, this is not considered a syntax error. + return p.startOfLine + } + if !isBlankOrTab(p.currentByte) { + p.parseError("invalid metric name in comment") + return nil + } + p.setOrCreateCurrentMF() + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentByte == '\n' { + // At the end of the line already. + // Again, this is not considered a syntax error. + return p.startOfLine + } + switch keyword { + case "HELP": + return p.readingHelp + case "TYPE": + return p.readingType + } + panic(fmt.Sprintf("code error: unexpected keyword %q", keyword)) +} + +// readingMetricName represents the state where the last byte read (now in +// p.currentByte) is the first byte of a metric name. +func (p *TextParser) readingMetricName() stateFn { + if p.readTokenAsMetricName(); p.err != nil { + return nil + } + if p.currentToken.Len() == 0 { + p.parseError("invalid metric name") + return nil + } + p.setOrCreateCurrentMF() + // Now is the time to fix the type if it hasn't happened yet. + if p.currentMF.Type == nil { + p.currentMF.Type = dto.MetricType_UNTYPED.Enum() + } + p.currentMetric = &dto.Metric{} + // Do not append the newly created currentMetric to + // currentMF.Metric right now. First wait if this is a summary, + // and the metric exists already, which we can only know after + // having read all the labels. + if p.skipBlankTabIfCurrentBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + return p.readingLabels +} + +// readingLabels represents the state where the last byte read (now in +// p.currentByte) is either the first byte of the label set (i.e. a '{'), or the +// first byte of the value (otherwise). +func (p *TextParser) readingLabels() stateFn { + // Summaries/histograms are special. We have to reset the + // currentLabels map, currentQuantile and currentBucket before starting to + // read labels. + if p.currentMF.GetType() == dto.MetricType_SUMMARY || p.currentMF.GetType() == dto.MetricType_HISTOGRAM { + p.currentLabels = map[string]string{} + p.currentLabels[string(model.MetricNameLabel)] = p.currentMF.GetName() + p.currentQuantile = math.NaN() + p.currentBucket = math.NaN() + } + if p.currentByte != '{' { + return p.readingValue + } + return p.startLabelName +} + +// startLabelName represents the state where the next byte read from p.buf is +// the start of a label name (or whitespace leading up to it). +func (p *TextParser) startLabelName() stateFn { + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentByte == '}' { + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + return p.readingValue + } + if p.readTokenAsLabelName(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentToken.Len() == 0 { + p.parseError(fmt.Sprintf("invalid label name for metric %q", p.currentMF.GetName())) + return nil + } + p.currentLabelPair = &dto.LabelPair{Name: proto.String(p.currentToken.String())} + if p.currentLabelPair.GetName() == string(model.MetricNameLabel) { + p.parseError(fmt.Sprintf("label name %q is reserved", model.MetricNameLabel)) + return nil + } + // Special summary/histogram treatment. Don't add 'quantile' and 'le' + // labels to 'real' labels. + if !(p.currentMF.GetType() == dto.MetricType_SUMMARY && p.currentLabelPair.GetName() == model.QuantileLabel) && + !(p.currentMF.GetType() == dto.MetricType_HISTOGRAM && p.currentLabelPair.GetName() == model.BucketLabel) { + p.currentMetric.Label = append(p.currentMetric.Label, p.currentLabelPair) + } + if p.skipBlankTabIfCurrentBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentByte != '=' { + p.parseError(fmt.Sprintf("expected '=' after label name, found %q", p.currentByte)) + return nil + } + return p.startLabelValue +} + +// startLabelValue represents the state where the next byte read from p.buf is +// the start of a (quoted) label value (or whitespace leading up to it). +func (p *TextParser) startLabelValue() stateFn { + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentByte != '"' { + p.parseError(fmt.Sprintf("expected '\"' at start of label value, found %q", p.currentByte)) + return nil + } + if p.readTokenAsLabelValue(); p.err != nil { + return nil + } + if !model.LabelValue(p.currentToken.String()).IsValid() { + p.parseError(fmt.Sprintf("invalid label value %q", p.currentToken.String())) + return nil + } + p.currentLabelPair.Value = proto.String(p.currentToken.String()) + // Special treatment of summaries: + // - Quantile labels are special, will result in dto.Quantile later. + // - Other labels have to be added to currentLabels for signature calculation. + if p.currentMF.GetType() == dto.MetricType_SUMMARY { + if p.currentLabelPair.GetName() == model.QuantileLabel { + if p.currentQuantile, p.err = strconv.ParseFloat(p.currentLabelPair.GetValue(), 64); p.err != nil { + // Create a more helpful error message. + p.parseError(fmt.Sprintf("expected float as value for 'quantile' label, got %q", p.currentLabelPair.GetValue())) + return nil + } + } else { + p.currentLabels[p.currentLabelPair.GetName()] = p.currentLabelPair.GetValue() + } + } + // Similar special treatment of histograms. + if p.currentMF.GetType() == dto.MetricType_HISTOGRAM { + if p.currentLabelPair.GetName() == model.BucketLabel { + if p.currentBucket, p.err = strconv.ParseFloat(p.currentLabelPair.GetValue(), 64); p.err != nil { + // Create a more helpful error message. + p.parseError(fmt.Sprintf("expected float as value for 'le' label, got %q", p.currentLabelPair.GetValue())) + return nil + } + } else { + p.currentLabels[p.currentLabelPair.GetName()] = p.currentLabelPair.GetValue() + } + } + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + switch p.currentByte { + case ',': + return p.startLabelName + + case '}': + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + return p.readingValue + default: + p.parseError(fmt.Sprintf("unexpected end of label value %q", p.currentLabelPair.Value)) + return nil + } +} + +// readingValue represents the state where the last byte read (now in +// p.currentByte) is the first byte of the sample value (i.e. a float). +func (p *TextParser) readingValue() stateFn { + // When we are here, we have read all the labels, so for the + // special case of a summary/histogram, we can finally find out + // if the metric already exists. + if p.currentMF.GetType() == dto.MetricType_SUMMARY { + signature := model.LabelsToSignature(p.currentLabels) + if summary := p.summaries[signature]; summary != nil { + p.currentMetric = summary + } else { + p.summaries[signature] = p.currentMetric + p.currentMF.Metric = append(p.currentMF.Metric, p.currentMetric) + } + } else if p.currentMF.GetType() == dto.MetricType_HISTOGRAM { + signature := model.LabelsToSignature(p.currentLabels) + if histogram := p.histograms[signature]; histogram != nil { + p.currentMetric = histogram + } else { + p.histograms[signature] = p.currentMetric + p.currentMF.Metric = append(p.currentMF.Metric, p.currentMetric) + } + } else { + p.currentMF.Metric = append(p.currentMF.Metric, p.currentMetric) + } + if p.readTokenUntilWhitespace(); p.err != nil { + return nil // Unexpected end of input. + } + value, err := strconv.ParseFloat(p.currentToken.String(), 64) + if err != nil { + // Create a more helpful error message. + p.parseError(fmt.Sprintf("expected float as value, got %q", p.currentToken.String())) + return nil + } + switch p.currentMF.GetType() { + case dto.MetricType_COUNTER: + p.currentMetric.Counter = &dto.Counter{Value: proto.Float64(value)} + case dto.MetricType_GAUGE: + p.currentMetric.Gauge = &dto.Gauge{Value: proto.Float64(value)} + case dto.MetricType_UNTYPED: + p.currentMetric.Untyped = &dto.Untyped{Value: proto.Float64(value)} + case dto.MetricType_SUMMARY: + // *sigh* + if p.currentMetric.Summary == nil { + p.currentMetric.Summary = &dto.Summary{} + } + switch { + case p.currentIsSummaryCount: + p.currentMetric.Summary.SampleCount = proto.Uint64(uint64(value)) + case p.currentIsSummarySum: + p.currentMetric.Summary.SampleSum = proto.Float64(value) + case !math.IsNaN(p.currentQuantile): + p.currentMetric.Summary.Quantile = append( + p.currentMetric.Summary.Quantile, + &dto.Quantile{ + Quantile: proto.Float64(p.currentQuantile), + Value: proto.Float64(value), + }, + ) + } + case dto.MetricType_HISTOGRAM: + // *sigh* + if p.currentMetric.Histogram == nil { + p.currentMetric.Histogram = &dto.Histogram{} + } + switch { + case p.currentIsHistogramCount: + p.currentMetric.Histogram.SampleCount = proto.Uint64(uint64(value)) + case p.currentIsHistogramSum: + p.currentMetric.Histogram.SampleSum = proto.Float64(value) + case !math.IsNaN(p.currentBucket): + p.currentMetric.Histogram.Bucket = append( + p.currentMetric.Histogram.Bucket, + &dto.Bucket{ + UpperBound: proto.Float64(p.currentBucket), + CumulativeCount: proto.Uint64(uint64(value)), + }, + ) + } + default: + p.err = fmt.Errorf("unexpected type for metric name %q", p.currentMF.GetName()) + } + if p.currentByte == '\n' { + return p.startOfLine + } + return p.startTimestamp +} + +// startTimestamp represents the state where the next byte read from p.buf is +// the start of the timestamp (or whitespace leading up to it). +func (p *TextParser) startTimestamp() stateFn { + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.readTokenUntilWhitespace(); p.err != nil { + return nil // Unexpected end of input. + } + timestamp, err := strconv.ParseInt(p.currentToken.String(), 10, 64) + if err != nil { + // Create a more helpful error message. + p.parseError(fmt.Sprintf("expected integer as timestamp, got %q", p.currentToken.String())) + return nil + } + p.currentMetric.TimestampMs = proto.Int64(timestamp) + if p.readTokenUntilNewline(false); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentToken.Len() > 0 { + p.parseError(fmt.Sprintf("spurious string after timestamp: %q", p.currentToken.String())) + return nil + } + return p.startOfLine +} + +// readingHelp represents the state where the last byte read (now in +// p.currentByte) is the first byte of the docstring after 'HELP'. +func (p *TextParser) readingHelp() stateFn { + if p.currentMF.Help != nil { + p.parseError(fmt.Sprintf("second HELP line for metric name %q", p.currentMF.GetName())) + return nil + } + // Rest of line is the docstring. + if p.readTokenUntilNewline(true); p.err != nil { + return nil // Unexpected end of input. + } + p.currentMF.Help = proto.String(p.currentToken.String()) + return p.startOfLine +} + +// readingType represents the state where the last byte read (now in +// p.currentByte) is the first byte of the type hint after 'HELP'. +func (p *TextParser) readingType() stateFn { + if p.currentMF.Type != nil { + p.parseError(fmt.Sprintf("second TYPE line for metric name %q, or TYPE reported after samples", p.currentMF.GetName())) + return nil + } + // Rest of line is the type. + if p.readTokenUntilNewline(false); p.err != nil { + return nil // Unexpected end of input. + } + metricType, ok := dto.MetricType_value[strings.ToUpper(p.currentToken.String())] + if !ok { + p.parseError(fmt.Sprintf("unknown metric type %q", p.currentToken.String())) + return nil + } + p.currentMF.Type = dto.MetricType(metricType).Enum() + return p.startOfLine +} + +// parseError sets p.err to a ParseError at the current line with the given +// message. +func (p *TextParser) parseError(msg string) { + p.err = ParseError{ + Line: p.lineCount, + Msg: msg, + } +} + +// skipBlankTab reads (and discards) bytes from p.buf until it encounters a byte +// that is neither ' ' nor '\t'. That byte is left in p.currentByte. +func (p *TextParser) skipBlankTab() { + for { + if p.currentByte, p.err = p.buf.ReadByte(); p.err != nil || !isBlankOrTab(p.currentByte) { + return + } + } +} + +// skipBlankTabIfCurrentBlankTab works exactly as skipBlankTab but doesn't do +// anything if p.currentByte is neither ' ' nor '\t'. +func (p *TextParser) skipBlankTabIfCurrentBlankTab() { + if isBlankOrTab(p.currentByte) { + p.skipBlankTab() + } +} + +// readTokenUntilWhitespace copies bytes from p.buf into p.currentToken. The +// first byte considered is the byte already read (now in p.currentByte). The +// first whitespace byte encountered is still copied into p.currentByte, but not +// into p.currentToken. +func (p *TextParser) readTokenUntilWhitespace() { + p.currentToken.Reset() + for p.err == nil && !isBlankOrTab(p.currentByte) && p.currentByte != '\n' { + p.currentToken.WriteByte(p.currentByte) + p.currentByte, p.err = p.buf.ReadByte() + } +} + +// readTokenUntilNewline copies bytes from p.buf into p.currentToken. The first +// byte considered is the byte already read (now in p.currentByte). The first +// newline byte encountered is still copied into p.currentByte, but not into +// p.currentToken. If recognizeEscapeSequence is true, two escape sequences are +// recognized: '\\' translates into '\', and '\n' into a line-feed character. +// All other escape sequences are invalid and cause an error. +func (p *TextParser) readTokenUntilNewline(recognizeEscapeSequence bool) { + p.currentToken.Reset() + escaped := false + for p.err == nil { + if recognizeEscapeSequence && escaped { + switch p.currentByte { + case '\\': + p.currentToken.WriteByte(p.currentByte) + case 'n': + p.currentToken.WriteByte('\n') + default: + p.parseError(fmt.Sprintf("invalid escape sequence '\\%c'", p.currentByte)) + return + } + escaped = false + } else { + switch p.currentByte { + case '\n': + return + case '\\': + escaped = true + default: + p.currentToken.WriteByte(p.currentByte) + } + } + p.currentByte, p.err = p.buf.ReadByte() + } +} + +// readTokenAsMetricName copies a metric name from p.buf into p.currentToken. +// The first byte considered is the byte already read (now in p.currentByte). +// The first byte not part of a metric name is still copied into p.currentByte, +// but not into p.currentToken. +func (p *TextParser) readTokenAsMetricName() { + p.currentToken.Reset() + if !isValidMetricNameStart(p.currentByte) { + return + } + for { + p.currentToken.WriteByte(p.currentByte) + p.currentByte, p.err = p.buf.ReadByte() + if p.err != nil || !isValidMetricNameContinuation(p.currentByte) { + return + } + } +} + +// readTokenAsLabelName copies a label name from p.buf into p.currentToken. +// The first byte considered is the byte already read (now in p.currentByte). +// The first byte not part of a label name is still copied into p.currentByte, +// but not into p.currentToken. +func (p *TextParser) readTokenAsLabelName() { + p.currentToken.Reset() + if !isValidLabelNameStart(p.currentByte) { + return + } + for { + p.currentToken.WriteByte(p.currentByte) + p.currentByte, p.err = p.buf.ReadByte() + if p.err != nil || !isValidLabelNameContinuation(p.currentByte) { + return + } + } +} + +// readTokenAsLabelValue copies a label value from p.buf into p.currentToken. +// In contrast to the other 'readTokenAs...' functions, which start with the +// last read byte in p.currentByte, this method ignores p.currentByte and starts +// with reading a new byte from p.buf. The first byte not part of a label value +// is still copied into p.currentByte, but not into p.currentToken. +func (p *TextParser) readTokenAsLabelValue() { + p.currentToken.Reset() + escaped := false + for { + if p.currentByte, p.err = p.buf.ReadByte(); p.err != nil { + return + } + if escaped { + switch p.currentByte { + case '"', '\\': + p.currentToken.WriteByte(p.currentByte) + case 'n': + p.currentToken.WriteByte('\n') + default: + p.parseError(fmt.Sprintf("invalid escape sequence '\\%c'", p.currentByte)) + return + } + escaped = false + continue + } + switch p.currentByte { + case '"': + return + case '\n': + p.parseError(fmt.Sprintf("label value %q contains unescaped new-line", p.currentToken.String())) + return + case '\\': + escaped = true + default: + p.currentToken.WriteByte(p.currentByte) + } + } +} + +func (p *TextParser) setOrCreateCurrentMF() { + p.currentIsSummaryCount = false + p.currentIsSummarySum = false + p.currentIsHistogramCount = false + p.currentIsHistogramSum = false + name := p.currentToken.String() + if p.currentMF = p.metricFamiliesByName[name]; p.currentMF != nil { + return + } + // Try out if this is a _sum or _count for a summary/histogram. + summaryName := summaryMetricName(name) + if p.currentMF = p.metricFamiliesByName[summaryName]; p.currentMF != nil { + if p.currentMF.GetType() == dto.MetricType_SUMMARY { + if isCount(name) { + p.currentIsSummaryCount = true + } + if isSum(name) { + p.currentIsSummarySum = true + } + return + } + } + histogramName := histogramMetricName(name) + if p.currentMF = p.metricFamiliesByName[histogramName]; p.currentMF != nil { + if p.currentMF.GetType() == dto.MetricType_HISTOGRAM { + if isCount(name) { + p.currentIsHistogramCount = true + } + if isSum(name) { + p.currentIsHistogramSum = true + } + return + } + } + p.currentMF = &dto.MetricFamily{Name: proto.String(name)} + p.metricFamiliesByName[name] = p.currentMF +} + +func isValidLabelNameStart(b byte) bool { + return (b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_' +} + +func isValidLabelNameContinuation(b byte) bool { + return isValidLabelNameStart(b) || (b >= '0' && b <= '9') +} + +func isValidMetricNameStart(b byte) bool { + return isValidLabelNameStart(b) || b == ':' +} + +func isValidMetricNameContinuation(b byte) bool { + return isValidLabelNameContinuation(b) || b == ':' +} + +func isBlankOrTab(b byte) bool { + return b == ' ' || b == '\t' +} + +func isCount(name string) bool { + return len(name) > 6 && name[len(name)-6:] == "_count" +} + +func isSum(name string) bool { + return len(name) > 4 && name[len(name)-4:] == "_sum" +} + +func isBucket(name string) bool { + return len(name) > 7 && name[len(name)-7:] == "_bucket" +} + +func summaryMetricName(name string) string { + switch { + case isCount(name): + return name[:len(name)-6] + case isSum(name): + return name[:len(name)-4] + default: + return name + } +} + +func histogramMetricName(name string) string { + switch { + case isCount(name): + return name[:len(name)-6] + case isSum(name): + return name[:len(name)-4] + case isBucket(name): + return name[:len(name)-7] + default: + return name + } +} diff --git a/api/vendor/github.com/prometheus/common/expfmt/text_parse_test.go b/api/vendor/github.com/prometheus/common/expfmt/text_parse_test.go new file mode 100644 index 0000000..76c9511 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/expfmt/text_parse_test.go @@ -0,0 +1,593 @@ +// Copyright 2014 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 expfmt + +import ( + "math" + "strings" + "testing" + + "github.com/golang/protobuf/proto" + dto "github.com/prometheus/client_model/go" +) + +func testTextParse(t testing.TB) { + var scenarios = []struct { + in string + out []*dto.MetricFamily + }{ + // 0: Empty lines as input. + { + in: ` + +`, + out: []*dto.MetricFamily{}, + }, + // 1: Minimal case. + { + in: ` +minimal_metric 1.234 +another_metric -3e3 103948 +# Even that: +no_labels{} 3 +# HELP line for non-existing metric will be ignored. +`, + out: []*dto.MetricFamily{ + &dto.MetricFamily{ + Name: proto.String("minimal_metric"), + Type: dto.MetricType_UNTYPED.Enum(), + Metric: []*dto.Metric{ + &dto.Metric{ + Untyped: &dto.Untyped{ + Value: proto.Float64(1.234), + }, + }, + }, + }, + &dto.MetricFamily{ + Name: proto.String("another_metric"), + Type: dto.MetricType_UNTYPED.Enum(), + Metric: []*dto.Metric{ + &dto.Metric{ + Untyped: &dto.Untyped{ + Value: proto.Float64(-3e3), + }, + TimestampMs: proto.Int64(103948), + }, + }, + }, + &dto.MetricFamily{ + Name: proto.String("no_labels"), + Type: dto.MetricType_UNTYPED.Enum(), + Metric: []*dto.Metric{ + &dto.Metric{ + Untyped: &dto.Untyped{ + Value: proto.Float64(3), + }, + }, + }, + }, + }, + }, + // 2: Counters & gauges, docstrings, various whitespace, escape sequences. + { + in: ` +# A normal comment. +# +# TYPE name counter +name{labelname="val1",basename="basevalue"} NaN +name {labelname="val2",basename="base\"v\\al\nue"} 0.23 1234567890 +# HELP name two-line\n doc str\\ing + + # HELP name2 doc str"ing 2 + # TYPE name2 gauge +name2{labelname="val2" ,basename = "basevalue2" } +Inf 54321 +name2{ labelname = "val1" , }-Inf +`, + out: []*dto.MetricFamily{ + &dto.MetricFamily{ + Name: proto.String("name"), + Help: proto.String("two-line\n doc str\\ing"), + Type: dto.MetricType_COUNTER.Enum(), + Metric: []*dto.Metric{ + &dto.Metric{ + Label: []*dto.LabelPair{ + &dto.LabelPair{ + Name: proto.String("labelname"), + Value: proto.String("val1"), + }, + &dto.LabelPair{ + Name: proto.String("basename"), + Value: proto.String("basevalue"), + }, + }, + Counter: &dto.Counter{ + Value: proto.Float64(math.NaN()), + }, + }, + &dto.Metric{ + Label: []*dto.LabelPair{ + &dto.LabelPair{ + Name: proto.String("labelname"), + Value: proto.String("val2"), + }, + &dto.LabelPair{ + Name: proto.String("basename"), + Value: proto.String("base\"v\\al\nue"), + }, + }, + Counter: &dto.Counter{ + Value: proto.Float64(.23), + }, + TimestampMs: proto.Int64(1234567890), + }, + }, + }, + &dto.MetricFamily{ + Name: proto.String("name2"), + Help: proto.String("doc str\"ing 2"), + Type: dto.MetricType_GAUGE.Enum(), + Metric: []*dto.Metric{ + &dto.Metric{ + Label: []*dto.LabelPair{ + &dto.LabelPair{ + Name: proto.String("labelname"), + Value: proto.String("val2"), + }, + &dto.LabelPair{ + Name: proto.String("basename"), + Value: proto.String("basevalue2"), + }, + }, + Gauge: &dto.Gauge{ + Value: proto.Float64(math.Inf(+1)), + }, + TimestampMs: proto.Int64(54321), + }, + &dto.Metric{ + Label: []*dto.LabelPair{ + &dto.LabelPair{ + Name: proto.String("labelname"), + Value: proto.String("val1"), + }, + }, + Gauge: &dto.Gauge{ + Value: proto.Float64(math.Inf(-1)), + }, + }, + }, + }, + }, + }, + // 3: The evil summary, mixed with other types and funny comments. + { + in: ` +# TYPE my_summary summary +my_summary{n1="val1",quantile="0.5"} 110 +decoy -1 -2 +my_summary{n1="val1",quantile="0.9"} 140 1 +my_summary_count{n1="val1"} 42 +# Latest timestamp wins in case of a summary. +my_summary_sum{n1="val1"} 4711 2 +fake_sum{n1="val1"} 2001 +# TYPE another_summary summary +another_summary_count{n2="val2",n1="val1"} 20 +my_summary_count{n2="val2",n1="val1"} 5 5 +another_summary{n1="val1",n2="val2",quantile=".3"} -1.2 +my_summary_sum{n1="val2"} 08 15 +my_summary{n1="val3", quantile="0.2"} 4711 + my_summary{n1="val1",n2="val2",quantile="-12.34",} NaN +# some +# funny comments +# HELP +# HELP +# HELP my_summary +# HELP my_summary +`, + out: []*dto.MetricFamily{ + &dto.MetricFamily{ + Name: proto.String("fake_sum"), + Type: dto.MetricType_UNTYPED.Enum(), + Metric: []*dto.Metric{ + &dto.Metric{ + Label: []*dto.LabelPair{ + &dto.LabelPair{ + Name: proto.String("n1"), + Value: proto.String("val1"), + }, + }, + Untyped: &dto.Untyped{ + Value: proto.Float64(2001), + }, + }, + }, + }, + &dto.MetricFamily{ + Name: proto.String("decoy"), + Type: dto.MetricType_UNTYPED.Enum(), + Metric: []*dto.Metric{ + &dto.Metric{ + Untyped: &dto.Untyped{ + Value: proto.Float64(-1), + }, + TimestampMs: proto.Int64(-2), + }, + }, + }, + &dto.MetricFamily{ + Name: proto.String("my_summary"), + Type: dto.MetricType_SUMMARY.Enum(), + Metric: []*dto.Metric{ + &dto.Metric{ + Label: []*dto.LabelPair{ + &dto.LabelPair{ + Name: proto.String("n1"), + Value: proto.String("val1"), + }, + }, + Summary: &dto.Summary{ + SampleCount: proto.Uint64(42), + SampleSum: proto.Float64(4711), + Quantile: []*dto.Quantile{ + &dto.Quantile{ + Quantile: proto.Float64(0.5), + Value: proto.Float64(110), + }, + &dto.Quantile{ + Quantile: proto.Float64(0.9), + Value: proto.Float64(140), + }, + }, + }, + TimestampMs: proto.Int64(2), + }, + &dto.Metric{ + Label: []*dto.LabelPair{ + &dto.LabelPair{ + Name: proto.String("n2"), + Value: proto.String("val2"), + }, + &dto.LabelPair{ + Name: proto.String("n1"), + Value: proto.String("val1"), + }, + }, + Summary: &dto.Summary{ + SampleCount: proto.Uint64(5), + Quantile: []*dto.Quantile{ + &dto.Quantile{ + Quantile: proto.Float64(-12.34), + Value: proto.Float64(math.NaN()), + }, + }, + }, + TimestampMs: proto.Int64(5), + }, + &dto.Metric{ + Label: []*dto.LabelPair{ + &dto.LabelPair{ + Name: proto.String("n1"), + Value: proto.String("val2"), + }, + }, + Summary: &dto.Summary{ + SampleSum: proto.Float64(8), + }, + TimestampMs: proto.Int64(15), + }, + &dto.Metric{ + Label: []*dto.LabelPair{ + &dto.LabelPair{ + Name: proto.String("n1"), + Value: proto.String("val3"), + }, + }, + Summary: &dto.Summary{ + Quantile: []*dto.Quantile{ + &dto.Quantile{ + Quantile: proto.Float64(0.2), + Value: proto.Float64(4711), + }, + }, + }, + }, + }, + }, + &dto.MetricFamily{ + Name: proto.String("another_summary"), + Type: dto.MetricType_SUMMARY.Enum(), + Metric: []*dto.Metric{ + &dto.Metric{ + Label: []*dto.LabelPair{ + &dto.LabelPair{ + Name: proto.String("n2"), + Value: proto.String("val2"), + }, + &dto.LabelPair{ + Name: proto.String("n1"), + Value: proto.String("val1"), + }, + }, + Summary: &dto.Summary{ + SampleCount: proto.Uint64(20), + Quantile: []*dto.Quantile{ + &dto.Quantile{ + Quantile: proto.Float64(0.3), + Value: proto.Float64(-1.2), + }, + }, + }, + }, + }, + }, + }, + }, + // 4: The histogram. + { + in: ` +# HELP request_duration_microseconds The response latency. +# TYPE request_duration_microseconds histogram +request_duration_microseconds_bucket{le="100"} 123 +request_duration_microseconds_bucket{le="120"} 412 +request_duration_microseconds_bucket{le="144"} 592 +request_duration_microseconds_bucket{le="172.8"} 1524 +request_duration_microseconds_bucket{le="+Inf"} 2693 +request_duration_microseconds_sum 1.7560473e+06 +request_duration_microseconds_count 2693 +`, + out: []*dto.MetricFamily{ + { + Name: proto.String("request_duration_microseconds"), + Help: proto.String("The response latency."), + Type: dto.MetricType_HISTOGRAM.Enum(), + Metric: []*dto.Metric{ + &dto.Metric{ + Histogram: &dto.Histogram{ + SampleCount: proto.Uint64(2693), + SampleSum: proto.Float64(1756047.3), + Bucket: []*dto.Bucket{ + &dto.Bucket{ + UpperBound: proto.Float64(100), + CumulativeCount: proto.Uint64(123), + }, + &dto.Bucket{ + UpperBound: proto.Float64(120), + CumulativeCount: proto.Uint64(412), + }, + &dto.Bucket{ + UpperBound: proto.Float64(144), + CumulativeCount: proto.Uint64(592), + }, + &dto.Bucket{ + UpperBound: proto.Float64(172.8), + CumulativeCount: proto.Uint64(1524), + }, + &dto.Bucket{ + UpperBound: proto.Float64(math.Inf(+1)), + CumulativeCount: proto.Uint64(2693), + }, + }, + }, + }, + }, + }, + }, + }, + } + + for i, scenario := range scenarios { + out, err := parser.TextToMetricFamilies(strings.NewReader(scenario.in)) + if err != nil { + t.Errorf("%d. error: %s", i, err) + continue + } + if expected, got := len(scenario.out), len(out); expected != got { + t.Errorf( + "%d. expected %d MetricFamilies, got %d", + i, expected, got, + ) + } + for _, expected := range scenario.out { + got, ok := out[expected.GetName()] + if !ok { + t.Errorf( + "%d. expected MetricFamily %q, found none", + i, expected.GetName(), + ) + continue + } + if expected.String() != got.String() { + t.Errorf( + "%d. expected MetricFamily %s, got %s", + i, expected, got, + ) + } + } + } +} + +func TestTextParse(t *testing.T) { + testTextParse(t) +} + +func BenchmarkTextParse(b *testing.B) { + for i := 0; i < b.N; i++ { + testTextParse(b) + } +} + +func testTextParseError(t testing.TB) { + var scenarios = []struct { + in string + err string + }{ + // 0: No new-line at end of input. + { + in: ` +bla 3.14 +blubber 42`, + err: "text format parsing error in line 3: unexpected end of input stream", + }, + // 1: Invalid escape sequence in label value. + { + in: `metric{label="\t"} 3.14`, + err: "text format parsing error in line 1: invalid escape sequence", + }, + // 2: Newline in label value. + { + in: ` +metric{label="new +line"} 3.14 +`, + err: `text format parsing error in line 2: label value "new" contains unescaped new-line`, + }, + // 3: + { + in: `metric{@="bla"} 3.14`, + err: "text format parsing error in line 1: invalid label name for metric", + }, + // 4: + { + in: `metric{__name__="bla"} 3.14`, + err: `text format parsing error in line 1: label name "__name__" is reserved`, + }, + // 5: + { + in: `metric{label+="bla"} 3.14`, + err: "text format parsing error in line 1: expected '=' after label name", + }, + // 6: + { + in: `metric{label=bla} 3.14`, + err: "text format parsing error in line 1: expected '\"' at start of label value", + }, + // 7: + { + in: ` +# TYPE metric summary +metric{quantile="bla"} 3.14 +`, + err: "text format parsing error in line 3: expected float as value for 'quantile' label", + }, + // 8: + { + in: `metric{label="bla"+} 3.14`, + err: "text format parsing error in line 1: unexpected end of label value", + }, + // 9: + { + in: `metric{label="bla"} 3.14 2.72 +`, + err: "text format parsing error in line 1: expected integer as timestamp", + }, + // 10: + { + in: `metric{label="bla"} 3.14 2 3 +`, + err: "text format parsing error in line 1: spurious string after timestamp", + }, + // 11: + { + in: `metric{label="bla"} blubb +`, + err: "text format parsing error in line 1: expected float as value", + }, + // 12: + { + in: ` +# HELP metric one +# HELP metric two +`, + err: "text format parsing error in line 3: second HELP line for metric name", + }, + // 13: + { + in: ` +# TYPE metric counter +# TYPE metric untyped +`, + err: `text format parsing error in line 3: second TYPE line for metric name "metric", or TYPE reported after samples`, + }, + // 14: + { + in: ` +metric 4.12 +# TYPE metric counter +`, + err: `text format parsing error in line 3: second TYPE line for metric name "metric", or TYPE reported after samples`, + }, + // 14: + { + in: ` +# TYPE metric bla +`, + err: "text format parsing error in line 2: unknown metric type", + }, + // 15: + { + in: ` +# TYPE met-ric +`, + err: "text format parsing error in line 2: invalid metric name in comment", + }, + // 16: + { + in: `@invalidmetric{label="bla"} 3.14 2`, + err: "text format parsing error in line 1: invalid metric name", + }, + // 17: + { + in: `{label="bla"} 3.14 2`, + err: "text format parsing error in line 1: invalid metric name", + }, + // 18: + { + in: ` +# TYPE metric histogram +metric_bucket{le="bla"} 3.14 +`, + err: "text format parsing error in line 3: expected float as value for 'le' label", + }, + // 19: Invalid UTF-8 in label value. + { + in: "metric{l=\"\xbd\"} 3.14\n", + err: "text format parsing error in line 1: invalid label value \"\\xbd\"", + }, + } + + for i, scenario := range scenarios { + _, err := parser.TextToMetricFamilies(strings.NewReader(scenario.in)) + if err == nil { + t.Errorf("%d. expected error, got nil", i) + continue + } + if expected, got := scenario.err, err.Error(); strings.Index(got, expected) != 0 { + t.Errorf( + "%d. expected error starting with %q, got %q", + i, expected, got, + ) + } + } + +} + +func TestTextParseError(t *testing.T) { + testTextParseError(t) +} + +func BenchmarkParseError(b *testing.B) { + for i := 0; i < b.N; i++ { + testTextParseError(b) + } +} diff --git a/api/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/README.txt b/api/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/README.txt new file mode 100644 index 0000000..7723656 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/README.txt @@ -0,0 +1,67 @@ +PACKAGE + +package goautoneg +import "bitbucket.org/ww/goautoneg" + +HTTP Content-Type Autonegotiation. + +The functions in this package implement the behaviour specified in +http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html + +Copyright (c) 2011, Open Knowledge Foundation Ltd. +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 the Open Knowledge Foundation Ltd. 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 +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. + + +FUNCTIONS + +func Negotiate(header string, alternatives []string) (content_type string) +Negotiate the most appropriate content_type given the accept header +and a list of alternatives. + +func ParseAccept(header string) (accept []Accept) +Parse an Accept Header string returning a sorted list +of clauses + + +TYPES + +type Accept struct { + Type, SubType string + Q float32 + Params map[string]string +} +Structure to represent a clause in an HTTP Accept Header + + +SUBDIRECTORIES + + .hg diff --git a/api/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg.go b/api/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg.go new file mode 100644 index 0000000..648b38c --- /dev/null +++ b/api/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg.go @@ -0,0 +1,162 @@ +/* +HTTP Content-Type Autonegotiation. + +The functions in this package implement the behaviour specified in +http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html + +Copyright (c) 2011, Open Knowledge Foundation Ltd. +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 the Open Knowledge Foundation Ltd. 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 +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. + + +*/ +package goautoneg + +import ( + "sort" + "strconv" + "strings" +) + +// Structure to represent a clause in an HTTP Accept Header +type Accept struct { + Type, SubType string + Q float64 + Params map[string]string +} + +// For internal use, so that we can use the sort interface +type accept_slice []Accept + +func (accept accept_slice) Len() int { + slice := []Accept(accept) + return len(slice) +} + +func (accept accept_slice) Less(i, j int) bool { + slice := []Accept(accept) + ai, aj := slice[i], slice[j] + if ai.Q > aj.Q { + return true + } + if ai.Type != "*" && aj.Type == "*" { + return true + } + if ai.SubType != "*" && aj.SubType == "*" { + return true + } + return false +} + +func (accept accept_slice) Swap(i, j int) { + slice := []Accept(accept) + slice[i], slice[j] = slice[j], slice[i] +} + +// Parse an Accept Header string returning a sorted list +// of clauses +func ParseAccept(header string) (accept []Accept) { + parts := strings.Split(header, ",") + accept = make([]Accept, 0, len(parts)) + for _, part := range parts { + part := strings.Trim(part, " ") + + a := Accept{} + a.Params = make(map[string]string) + a.Q = 1.0 + + mrp := strings.Split(part, ";") + + media_range := mrp[0] + sp := strings.Split(media_range, "/") + a.Type = strings.Trim(sp[0], " ") + + switch { + case len(sp) == 1 && a.Type == "*": + a.SubType = "*" + case len(sp) == 2: + a.SubType = strings.Trim(sp[1], " ") + default: + continue + } + + if len(mrp) == 1 { + accept = append(accept, a) + continue + } + + for _, param := range mrp[1:] { + sp := strings.SplitN(param, "=", 2) + if len(sp) != 2 { + continue + } + token := strings.Trim(sp[0], " ") + if token == "q" { + a.Q, _ = strconv.ParseFloat(sp[1], 32) + } else { + a.Params[token] = strings.Trim(sp[1], " ") + } + } + + accept = append(accept, a) + } + + slice := accept_slice(accept) + sort.Sort(slice) + + return +} + +// Negotiate the most appropriate content_type given the accept header +// and a list of alternatives. +func Negotiate(header string, alternatives []string) (content_type string) { + asp := make([][]string, 0, len(alternatives)) + for _, ctype := range alternatives { + asp = append(asp, strings.SplitN(ctype, "/", 2)) + } + for _, clause := range ParseAccept(header) { + for i, ctsp := range asp { + if clause.Type == ctsp[0] && clause.SubType == ctsp[1] { + content_type = alternatives[i] + return + } + if clause.Type == ctsp[0] && clause.SubType == "*" { + content_type = alternatives[i] + return + } + if clause.Type == "*" && clause.SubType == "*" { + content_type = alternatives[i] + return + } + } + } + return +} diff --git a/api/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg_test.go b/api/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg_test.go new file mode 100644 index 0000000..41d328f --- /dev/null +++ b/api/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg_test.go @@ -0,0 +1,33 @@ +package goautoneg + +import ( + "testing" +) + +var chrome = "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5" + +func TestParseAccept(t *testing.T) { + alternatives := []string{"text/html", "image/png"} + content_type := Negotiate(chrome, alternatives) + if content_type != "image/png" { + t.Errorf("got %s expected image/png", content_type) + } + + alternatives = []string{"text/html", "text/plain", "text/n3"} + content_type = Negotiate(chrome, alternatives) + if content_type != "text/html" { + t.Errorf("got %s expected text/html", content_type) + } + + alternatives = []string{"text/n3", "text/plain"} + content_type = Negotiate(chrome, alternatives) + if content_type != "text/plain" { + t.Errorf("got %s expected text/plain", content_type) + } + + alternatives = []string{"text/n3", "application/rdf+xml"} + content_type = Negotiate(chrome, alternatives) + if content_type != "text/n3" { + t.Errorf("got %s expected text/n3", content_type) + } +} diff --git a/api/vendor/github.com/prometheus/common/log/eventlog_formatter.go b/api/vendor/github.com/prometheus/common/log/eventlog_formatter.go new file mode 100644 index 0000000..bcf68e6 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/log/eventlog_formatter.go @@ -0,0 +1,89 @@ +// Copyright 2015 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. + +// +build windows + +package log + +import ( + "fmt" + "os" + + "golang.org/x/sys/windows/svc/eventlog" + + "github.com/sirupsen/logrus" +) + +func init() { + setEventlogFormatter = func(l logger, name string, debugAsInfo bool) error { + if name == "" { + return fmt.Errorf("missing name parameter") + } + + fmter, err := newEventlogger(name, debugAsInfo, l.entry.Logger.Formatter) + if err != nil { + fmt.Fprintf(os.Stderr, "error creating eventlog formatter: %v\n", err) + l.Errorf("can't connect logger to eventlog: %v", err) + return err + } + l.entry.Logger.Formatter = fmter + return nil + } +} + +type eventlogger struct { + log *eventlog.Log + debugAsInfo bool + wrap logrus.Formatter +} + +func newEventlogger(name string, debugAsInfo bool, fmter logrus.Formatter) (*eventlogger, error) { + logHandle, err := eventlog.Open(name) + if err != nil { + return nil, err + } + return &eventlogger{log: logHandle, debugAsInfo: debugAsInfo, wrap: fmter}, nil +} + +func (s *eventlogger) Format(e *logrus.Entry) ([]byte, error) { + data, err := s.wrap.Format(e) + if err != nil { + fmt.Fprintf(os.Stderr, "eventlogger: can't format entry: %v\n", err) + return data, err + } + + switch e.Level { + case logrus.PanicLevel: + fallthrough + case logrus.FatalLevel: + fallthrough + case logrus.ErrorLevel: + err = s.log.Error(102, e.Message) + case logrus.WarnLevel: + err = s.log.Warning(101, e.Message) + case logrus.InfoLevel: + err = s.log.Info(100, e.Message) + case logrus.DebugLevel: + if s.debugAsInfo { + err = s.log.Info(100, e.Message) + } + default: + err = s.log.Info(100, e.Message) + } + + if err != nil { + fmt.Fprintf(os.Stderr, "eventlogger: can't send log to eventlog: %v\n", err) + } + + return data, err +} diff --git a/api/vendor/github.com/prometheus/common/log/log.go b/api/vendor/github.com/prometheus/common/log/log.go new file mode 100644 index 0000000..1088302 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/log/log.go @@ -0,0 +1,364 @@ +// Copyright 2015 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 log + +import ( + "fmt" + "io" + "io/ioutil" + "log" + "net/url" + "os" + "runtime" + "strconv" + "strings" + + "github.com/sirupsen/logrus" + "gopkg.in/alecthomas/kingpin.v2" +) + +// setSyslogFormatter is nil if the target architecture does not support syslog. +var setSyslogFormatter func(logger, string, string) error + +// setEventlogFormatter is nil if the target OS does not support Eventlog (i.e., is not Windows). +var setEventlogFormatter func(logger, string, bool) error + +func setJSONFormatter() { + origLogger.Formatter = &logrus.JSONFormatter{} +} + +type loggerSettings struct { + level string + format string +} + +func (s *loggerSettings) apply(ctx *kingpin.ParseContext) error { + err := baseLogger.SetLevel(s.level) + if err != nil { + return err + } + err = baseLogger.SetFormat(s.format) + return err +} + +// AddFlags adds the flags used by this package to the Kingpin application. +// To use the default Kingpin application, call AddFlags(kingpin.CommandLine) +func AddFlags(a *kingpin.Application) { + s := loggerSettings{} + a.Flag("log.level", "Only log messages with the given severity or above. Valid levels: [debug, info, warn, error, fatal]"). + Default(origLogger.Level.String()). + StringVar(&s.level) + defaultFormat := url.URL{Scheme: "logger", Opaque: "stderr"} + a.Flag("log.format", `Set the log target and format. Example: "logger:syslog?appname=bob&local=7" or "logger:stdout?json=true"`). + Default(defaultFormat.String()). + StringVar(&s.format) + a.Action(s.apply) +} + +// Logger is the interface for loggers used in the Prometheus components. +type Logger interface { + Debug(...interface{}) + Debugln(...interface{}) + Debugf(string, ...interface{}) + + Info(...interface{}) + Infoln(...interface{}) + Infof(string, ...interface{}) + + Warn(...interface{}) + Warnln(...interface{}) + Warnf(string, ...interface{}) + + Error(...interface{}) + Errorln(...interface{}) + Errorf(string, ...interface{}) + + Fatal(...interface{}) + Fatalln(...interface{}) + Fatalf(string, ...interface{}) + + With(key string, value interface{}) Logger + + SetFormat(string) error + SetLevel(string) error +} + +type logger struct { + entry *logrus.Entry +} + +func (l logger) With(key string, value interface{}) Logger { + return logger{l.entry.WithField(key, value)} +} + +// Debug logs a message at level Debug on the standard logger. +func (l logger) Debug(args ...interface{}) { + l.sourced().Debug(args...) +} + +// Debug logs a message at level Debug on the standard logger. +func (l logger) Debugln(args ...interface{}) { + l.sourced().Debugln(args...) +} + +// Debugf logs a message at level Debug on the standard logger. +func (l logger) Debugf(format string, args ...interface{}) { + l.sourced().Debugf(format, args...) +} + +// Info logs a message at level Info on the standard logger. +func (l logger) Info(args ...interface{}) { + l.sourced().Info(args...) +} + +// Info logs a message at level Info on the standard logger. +func (l logger) Infoln(args ...interface{}) { + l.sourced().Infoln(args...) +} + +// Infof logs a message at level Info on the standard logger. +func (l logger) Infof(format string, args ...interface{}) { + l.sourced().Infof(format, args...) +} + +// Warn logs a message at level Warn on the standard logger. +func (l logger) Warn(args ...interface{}) { + l.sourced().Warn(args...) +} + +// Warn logs a message at level Warn on the standard logger. +func (l logger) Warnln(args ...interface{}) { + l.sourced().Warnln(args...) +} + +// Warnf logs a message at level Warn on the standard logger. +func (l logger) Warnf(format string, args ...interface{}) { + l.sourced().Warnf(format, args...) +} + +// Error logs a message at level Error on the standard logger. +func (l logger) Error(args ...interface{}) { + l.sourced().Error(args...) +} + +// Error logs a message at level Error on the standard logger. +func (l logger) Errorln(args ...interface{}) { + l.sourced().Errorln(args...) +} + +// Errorf logs a message at level Error on the standard logger. +func (l logger) Errorf(format string, args ...interface{}) { + l.sourced().Errorf(format, args...) +} + +// Fatal logs a message at level Fatal on the standard logger. +func (l logger) Fatal(args ...interface{}) { + l.sourced().Fatal(args...) +} + +// Fatal logs a message at level Fatal on the standard logger. +func (l logger) Fatalln(args ...interface{}) { + l.sourced().Fatalln(args...) +} + +// Fatalf logs a message at level Fatal on the standard logger. +func (l logger) Fatalf(format string, args ...interface{}) { + l.sourced().Fatalf(format, args...) +} + +func (l logger) SetLevel(level string) error { + lvl, err := logrus.ParseLevel(level) + if err != nil { + return err + } + + l.entry.Logger.Level = lvl + return nil +} + +func (l logger) SetFormat(format string) error { + u, err := url.Parse(format) + if err != nil { + return err + } + if u.Scheme != "logger" { + return fmt.Errorf("invalid scheme %s", u.Scheme) + } + jsonq := u.Query().Get("json") + if jsonq == "true" { + setJSONFormatter() + } + + switch u.Opaque { + case "syslog": + if setSyslogFormatter == nil { + return fmt.Errorf("system does not support syslog") + } + appname := u.Query().Get("appname") + facility := u.Query().Get("local") + return setSyslogFormatter(l, appname, facility) + case "eventlog": + if setEventlogFormatter == nil { + return fmt.Errorf("system does not support eventlog") + } + name := u.Query().Get("name") + debugAsInfo := false + debugAsInfoRaw := u.Query().Get("debugAsInfo") + if parsedDebugAsInfo, err := strconv.ParseBool(debugAsInfoRaw); err == nil { + debugAsInfo = parsedDebugAsInfo + } + return setEventlogFormatter(l, name, debugAsInfo) + case "stdout": + l.entry.Logger.Out = os.Stdout + case "stderr": + l.entry.Logger.Out = os.Stderr + default: + return fmt.Errorf("unsupported logger %q", u.Opaque) + } + return nil +} + +// sourced adds a source field to the logger that contains +// the file name and line where the logging happened. +func (l logger) sourced() *logrus.Entry { + _, file, line, ok := runtime.Caller(2) + if !ok { + file = "" + line = 1 + } else { + slash := strings.LastIndex(file, "/") + file = file[slash+1:] + } + return l.entry.WithField("source", fmt.Sprintf("%s:%d", file, line)) +} + +var origLogger = logrus.New() +var baseLogger = logger{entry: logrus.NewEntry(origLogger)} + +// Base returns the default Logger logging to +func Base() Logger { + return baseLogger +} + +// NewLogger returns a new Logger logging to out. +func NewLogger(w io.Writer) Logger { + l := logrus.New() + l.Out = w + return logger{entry: logrus.NewEntry(l)} +} + +// NewNopLogger returns a logger that discards all log messages. +func NewNopLogger() Logger { + l := logrus.New() + l.Out = ioutil.Discard + return logger{entry: logrus.NewEntry(l)} +} + +// With adds a field to the logger. +func With(key string, value interface{}) Logger { + return baseLogger.With(key, value) +} + +// Debug logs a message at level Debug on the standard logger. +func Debug(args ...interface{}) { + baseLogger.sourced().Debug(args...) +} + +// Debugln logs a message at level Debug on the standard logger. +func Debugln(args ...interface{}) { + baseLogger.sourced().Debugln(args...) +} + +// Debugf logs a message at level Debug on the standard logger. +func Debugf(format string, args ...interface{}) { + baseLogger.sourced().Debugf(format, args...) +} + +// Info logs a message at level Info on the standard logger. +func Info(args ...interface{}) { + baseLogger.sourced().Info(args...) +} + +// Infoln logs a message at level Info on the standard logger. +func Infoln(args ...interface{}) { + baseLogger.sourced().Infoln(args...) +} + +// Infof logs a message at level Info on the standard logger. +func Infof(format string, args ...interface{}) { + baseLogger.sourced().Infof(format, args...) +} + +// Warn logs a message at level Warn on the standard logger. +func Warn(args ...interface{}) { + baseLogger.sourced().Warn(args...) +} + +// Warnln logs a message at level Warn on the standard logger. +func Warnln(args ...interface{}) { + baseLogger.sourced().Warnln(args...) +} + +// Warnf logs a message at level Warn on the standard logger. +func Warnf(format string, args ...interface{}) { + baseLogger.sourced().Warnf(format, args...) +} + +// Error logs a message at level Error on the standard logger. +func Error(args ...interface{}) { + baseLogger.sourced().Error(args...) +} + +// Errorln logs a message at level Error on the standard logger. +func Errorln(args ...interface{}) { + baseLogger.sourced().Errorln(args...) +} + +// Errorf logs a message at level Error on the standard logger. +func Errorf(format string, args ...interface{}) { + baseLogger.sourced().Errorf(format, args...) +} + +// Fatal logs a message at level Fatal on the standard logger. +func Fatal(args ...interface{}) { + baseLogger.sourced().Fatal(args...) +} + +// Fatalln logs a message at level Fatal on the standard logger. +func Fatalln(args ...interface{}) { + baseLogger.sourced().Fatalln(args...) +} + +// Fatalf logs a message at level Fatal on the standard logger. +func Fatalf(format string, args ...interface{}) { + baseLogger.sourced().Fatalf(format, args...) +} + +// AddHook adds hook to Prometheus' original logger. +func AddHook(hook logrus.Hook) { + origLogger.Hooks.Add(hook) +} + +type errorLogWriter struct{} + +func (errorLogWriter) Write(b []byte) (int, error) { + baseLogger.sourced().Error(string(b)) + return len(b), nil +} + +// NewErrorLogger returns a log.Logger that is meant to be used +// in the ErrorLog field of an http.Server to log HTTP server errors. +func NewErrorLogger() *log.Logger { + return log.New(&errorLogWriter{}, "", 0) +} diff --git a/api/vendor/github.com/prometheus/common/log/log_test.go b/api/vendor/github.com/prometheus/common/log/log_test.go new file mode 100644 index 0000000..f63b441 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/log/log_test.go @@ -0,0 +1,39 @@ +// Copyright 2015 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 log + +import ( + "bytes" + "regexp" + "testing" + + "github.com/sirupsen/logrus" +) + +func TestFileLineLogging(t *testing.T) { + var buf bytes.Buffer + origLogger.Out = &buf + origLogger.Formatter = &logrus.TextFormatter{ + DisableColors: true, + } + + // The default logging level should be "info". + Debug("This debug-level line should not show up in the output.") + Infof("This %s-level line should show up in the output.", "info") + + re := `^time=".*" level=info msg="This info-level line should show up in the output." source="log_test.go:33"\n$` + if !regexp.MustCompile(re).Match(buf.Bytes()) { + t.Fatalf("%q did not match expected regex %q", buf.String(), re) + } +} diff --git a/api/vendor/github.com/prometheus/common/log/syslog_formatter.go b/api/vendor/github.com/prometheus/common/log/syslog_formatter.go new file mode 100644 index 0000000..f882f2f --- /dev/null +++ b/api/vendor/github.com/prometheus/common/log/syslog_formatter.go @@ -0,0 +1,126 @@ +// Copyright 2015 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. + +// +build !windows,!nacl,!plan9 + +package log + +import ( + "fmt" + "log/syslog" + "os" + + "github.com/sirupsen/logrus" +) + +var _ logrus.Formatter = (*syslogger)(nil) + +func init() { + setSyslogFormatter = func(l logger, appname, local string) error { + if appname == "" { + return fmt.Errorf("missing appname parameter") + } + if local == "" { + return fmt.Errorf("missing local parameter") + } + + fmter, err := newSyslogger(appname, local, l.entry.Logger.Formatter) + if err != nil { + fmt.Fprintf(os.Stderr, "error creating syslog formatter: %v\n", err) + l.entry.Errorf("can't connect logger to syslog: %v", err) + return err + } + l.entry.Logger.Formatter = fmter + return nil + } +} + +var prefixTag []byte + +type syslogger struct { + wrap logrus.Formatter + out *syslog.Writer +} + +func newSyslogger(appname string, facility string, fmter logrus.Formatter) (*syslogger, error) { + priority, err := getFacility(facility) + if err != nil { + return nil, err + } + out, err := syslog.New(priority, appname) + _, isJSON := fmter.(*logrus.JSONFormatter) + if isJSON { + // add cee tag to json formatted syslogs + prefixTag = []byte("@cee:") + } + return &syslogger{ + out: out, + wrap: fmter, + }, err +} + +func getFacility(facility string) (syslog.Priority, error) { + switch facility { + case "0": + return syslog.LOG_LOCAL0, nil + case "1": + return syslog.LOG_LOCAL1, nil + case "2": + return syslog.LOG_LOCAL2, nil + case "3": + return syslog.LOG_LOCAL3, nil + case "4": + return syslog.LOG_LOCAL4, nil + case "5": + return syslog.LOG_LOCAL5, nil + case "6": + return syslog.LOG_LOCAL6, nil + case "7": + return syslog.LOG_LOCAL7, nil + } + return syslog.LOG_LOCAL0, fmt.Errorf("invalid local(%s) for syslog", facility) +} + +func (s *syslogger) Format(e *logrus.Entry) ([]byte, error) { + data, err := s.wrap.Format(e) + if err != nil { + fmt.Fprintf(os.Stderr, "syslogger: can't format entry: %v\n", err) + return data, err + } + // only append tag to data sent to syslog (line), not to what + // is returned + line := string(append(prefixTag, data...)) + + switch e.Level { + case logrus.PanicLevel: + err = s.out.Crit(line) + case logrus.FatalLevel: + err = s.out.Crit(line) + case logrus.ErrorLevel: + err = s.out.Err(line) + case logrus.WarnLevel: + err = s.out.Warning(line) + case logrus.InfoLevel: + err = s.out.Info(line) + case logrus.DebugLevel: + err = s.out.Debug(line) + default: + err = s.out.Notice(line) + } + + if err != nil { + fmt.Fprintf(os.Stderr, "syslogger: can't send log to syslog: %v\n", err) + } + + return data, err +} diff --git a/api/vendor/github.com/prometheus/common/log/syslog_formatter_test.go b/api/vendor/github.com/prometheus/common/log/syslog_formatter_test.go new file mode 100644 index 0000000..b7e6884 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/log/syslog_formatter_test.go @@ -0,0 +1,52 @@ +// Copyright 2015 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. + +// +build !windows,!nacl,!plan9 + +package log + +import ( + "errors" + "log/syslog" + "testing" +) + +func TestGetFacility(t *testing.T) { + testCases := []struct { + facility string + expectedPriority syslog.Priority + expectedErr error + }{ + {"0", syslog.LOG_LOCAL0, nil}, + {"1", syslog.LOG_LOCAL1, nil}, + {"2", syslog.LOG_LOCAL2, nil}, + {"3", syslog.LOG_LOCAL3, nil}, + {"4", syslog.LOG_LOCAL4, nil}, + {"5", syslog.LOG_LOCAL5, nil}, + {"6", syslog.LOG_LOCAL6, nil}, + {"7", syslog.LOG_LOCAL7, nil}, + {"8", syslog.LOG_LOCAL0, errors.New("invalid local(8) for syslog")}, + } + for _, tc := range testCases { + priority, err := getFacility(tc.facility) + if err != tc.expectedErr { + if err.Error() != tc.expectedErr.Error() { + t.Errorf("want %s, got %s", tc.expectedErr.Error(), err.Error()) + } + } + + if priority != tc.expectedPriority { + t.Errorf("want %q, got %q", tc.expectedPriority, priority) + } + } +} diff --git a/api/vendor/github.com/prometheus/common/model/alert.go b/api/vendor/github.com/prometheus/common/model/alert.go new file mode 100644 index 0000000..35e739c --- /dev/null +++ b/api/vendor/github.com/prometheus/common/model/alert.go @@ -0,0 +1,136 @@ +// Copyright 2013 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 model + +import ( + "fmt" + "time" +) + +type AlertStatus string + +const ( + AlertFiring AlertStatus = "firing" + AlertResolved AlertStatus = "resolved" +) + +// Alert is a generic representation of an alert in the Prometheus eco-system. +type Alert struct { + // Label value pairs for purpose of aggregation, matching, and disposition + // dispatching. This must minimally include an "alertname" label. + Labels LabelSet `json:"labels"` + + // Extra key/value information which does not define alert identity. + Annotations LabelSet `json:"annotations"` + + // The known time range for this alert. Both ends are optional. + StartsAt time.Time `json:"startsAt,omitempty"` + EndsAt time.Time `json:"endsAt,omitempty"` + GeneratorURL string `json:"generatorURL"` +} + +// Name returns the name of the alert. It is equivalent to the "alertname" label. +func (a *Alert) Name() string { + return string(a.Labels[AlertNameLabel]) +} + +// Fingerprint returns a unique hash for the alert. It is equivalent to +// the fingerprint of the alert's label set. +func (a *Alert) Fingerprint() Fingerprint { + return a.Labels.Fingerprint() +} + +func (a *Alert) String() string { + s := fmt.Sprintf("%s[%s]", a.Name(), a.Fingerprint().String()[:7]) + if a.Resolved() { + return s + "[resolved]" + } + return s + "[active]" +} + +// Resolved returns true iff the activity interval ended in the past. +func (a *Alert) Resolved() bool { + return a.ResolvedAt(time.Now()) +} + +// ResolvedAt returns true off the activity interval ended before +// the given timestamp. +func (a *Alert) ResolvedAt(ts time.Time) bool { + if a.EndsAt.IsZero() { + return false + } + return !a.EndsAt.After(ts) +} + +// Status returns the status of the alert. +func (a *Alert) Status() AlertStatus { + if a.Resolved() { + return AlertResolved + } + return AlertFiring +} + +// Validate checks whether the alert data is inconsistent. +func (a *Alert) Validate() error { + if a.StartsAt.IsZero() { + return fmt.Errorf("start time missing") + } + if !a.EndsAt.IsZero() && a.EndsAt.Before(a.StartsAt) { + return fmt.Errorf("start time must be before end time") + } + if err := a.Labels.Validate(); err != nil { + return fmt.Errorf("invalid label set: %s", err) + } + if len(a.Labels) == 0 { + return fmt.Errorf("at least one label pair required") + } + if err := a.Annotations.Validate(); err != nil { + return fmt.Errorf("invalid annotations: %s", err) + } + return nil +} + +// Alert is a list of alerts that can be sorted in chronological order. +type Alerts []*Alert + +func (as Alerts) Len() int { return len(as) } +func (as Alerts) Swap(i, j int) { as[i], as[j] = as[j], as[i] } + +func (as Alerts) Less(i, j int) bool { + if as[i].StartsAt.Before(as[j].StartsAt) { + return true + } + if as[i].EndsAt.Before(as[j].EndsAt) { + return true + } + return as[i].Fingerprint() < as[j].Fingerprint() +} + +// HasFiring returns true iff one of the alerts is not resolved. +func (as Alerts) HasFiring() bool { + for _, a := range as { + if !a.Resolved() { + return true + } + } + return false +} + +// Status returns StatusFiring iff at least one of the alerts is firing. +func (as Alerts) Status() AlertStatus { + if as.HasFiring() { + return AlertFiring + } + return AlertResolved +} diff --git a/api/vendor/github.com/prometheus/common/model/alert_test.go b/api/vendor/github.com/prometheus/common/model/alert_test.go new file mode 100644 index 0000000..9692bca --- /dev/null +++ b/api/vendor/github.com/prometheus/common/model/alert_test.go @@ -0,0 +1,118 @@ +// Copyright 2013 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 model + +import ( + "strings" + "testing" + "time" +) + +func TestAlertValidate(t *testing.T) { + ts := time.Now() + + var cases = []struct { + alert *Alert + err string + }{ + { + alert: &Alert{ + Labels: LabelSet{"a": "b"}, + StartsAt: ts, + }, + }, + { + alert: &Alert{ + Labels: LabelSet{"a": "b"}, + }, + err: "start time missing", + }, + { + alert: &Alert{ + Labels: LabelSet{"a": "b"}, + StartsAt: ts, + EndsAt: ts, + }, + }, + { + alert: &Alert{ + Labels: LabelSet{"a": "b"}, + StartsAt: ts, + EndsAt: ts.Add(1 * time.Minute), + }, + }, + { + alert: &Alert{ + Labels: LabelSet{"a": "b"}, + StartsAt: ts, + EndsAt: ts.Add(-1 * time.Minute), + }, + err: "start time must be before end time", + }, + { + alert: &Alert{ + StartsAt: ts, + }, + err: "at least one label pair required", + }, + { + alert: &Alert{ + Labels: LabelSet{"a": "b", "!bad": "label"}, + StartsAt: ts, + }, + err: "invalid label set: invalid name", + }, + { + alert: &Alert{ + Labels: LabelSet{"a": "b", "bad": "\xfflabel"}, + StartsAt: ts, + }, + err: "invalid label set: invalid value", + }, + { + alert: &Alert{ + Labels: LabelSet{"a": "b"}, + Annotations: LabelSet{"!bad": "label"}, + StartsAt: ts, + }, + err: "invalid annotations: invalid name", + }, + { + alert: &Alert{ + Labels: LabelSet{"a": "b"}, + Annotations: LabelSet{"bad": "\xfflabel"}, + StartsAt: ts, + }, + err: "invalid annotations: invalid value", + }, + } + + for i, c := range cases { + err := c.alert.Validate() + if err == nil { + if c.err == "" { + continue + } + t.Errorf("%d. Expected error %q but got none", i, c.err) + continue + } + if c.err == "" && err != nil { + t.Errorf("%d. Expected no error but got %q", i, err) + continue + } + if !strings.Contains(err.Error(), c.err) { + t.Errorf("%d. Expected error to contain %q but got %q", i, c.err, err) + } + } +} diff --git a/api/vendor/github.com/prometheus/common/model/fingerprinting.go b/api/vendor/github.com/prometheus/common/model/fingerprinting.go new file mode 100644 index 0000000..fc4de41 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/model/fingerprinting.go @@ -0,0 +1,105 @@ +// Copyright 2013 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 model + +import ( + "fmt" + "strconv" +) + +// Fingerprint provides a hash-capable representation of a Metric. +// For our purposes, FNV-1A 64-bit is used. +type Fingerprint uint64 + +// FingerprintFromString transforms a string representation into a Fingerprint. +func FingerprintFromString(s string) (Fingerprint, error) { + num, err := strconv.ParseUint(s, 16, 64) + return Fingerprint(num), err +} + +// ParseFingerprint parses the input string into a fingerprint. +func ParseFingerprint(s string) (Fingerprint, error) { + num, err := strconv.ParseUint(s, 16, 64) + if err != nil { + return 0, err + } + return Fingerprint(num), nil +} + +func (f Fingerprint) String() string { + return fmt.Sprintf("%016x", uint64(f)) +} + +// Fingerprints represents a collection of Fingerprint subject to a given +// natural sorting scheme. It implements sort.Interface. +type Fingerprints []Fingerprint + +// Len implements sort.Interface. +func (f Fingerprints) Len() int { + return len(f) +} + +// Less implements sort.Interface. +func (f Fingerprints) Less(i, j int) bool { + return f[i] < f[j] +} + +// Swap implements sort.Interface. +func (f Fingerprints) Swap(i, j int) { + f[i], f[j] = f[j], f[i] +} + +// FingerprintSet is a set of Fingerprints. +type FingerprintSet map[Fingerprint]struct{} + +// Equal returns true if both sets contain the same elements (and not more). +func (s FingerprintSet) Equal(o FingerprintSet) bool { + if len(s) != len(o) { + return false + } + + for k := range s { + if _, ok := o[k]; !ok { + return false + } + } + + return true +} + +// Intersection returns the elements contained in both sets. +func (s FingerprintSet) Intersection(o FingerprintSet) FingerprintSet { + myLength, otherLength := len(s), len(o) + if myLength == 0 || otherLength == 0 { + return FingerprintSet{} + } + + subSet := s + superSet := o + + if otherLength < myLength { + subSet = o + superSet = s + } + + out := FingerprintSet{} + + for k := range subSet { + if _, ok := superSet[k]; ok { + out[k] = struct{}{} + } + } + + return out +} diff --git a/api/vendor/github.com/prometheus/common/model/fnv.go b/api/vendor/github.com/prometheus/common/model/fnv.go new file mode 100644 index 0000000..038fc1c --- /dev/null +++ b/api/vendor/github.com/prometheus/common/model/fnv.go @@ -0,0 +1,42 @@ +// Copyright 2015 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 model + +// Inline and byte-free variant of hash/fnv's fnv64a. + +const ( + offset64 = 14695981039346656037 + prime64 = 1099511628211 +) + +// hashNew initializies a new fnv64a hash value. +func hashNew() uint64 { + return offset64 +} + +// hashAdd adds a string to a fnv64a hash value, returning the updated hash. +func hashAdd(h uint64, s string) uint64 { + for i := 0; i < len(s); i++ { + h ^= uint64(s[i]) + h *= prime64 + } + return h +} + +// hashAddByte adds a byte to a fnv64a hash value, returning the updated hash. +func hashAddByte(h uint64, b byte) uint64 { + h ^= uint64(b) + h *= prime64 + return h +} diff --git a/api/vendor/github.com/prometheus/common/model/labels.go b/api/vendor/github.com/prometheus/common/model/labels.go new file mode 100644 index 0000000..41051a0 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/model/labels.go @@ -0,0 +1,210 @@ +// Copyright 2013 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 model + +import ( + "encoding/json" + "fmt" + "regexp" + "strings" + "unicode/utf8" +) + +const ( + // AlertNameLabel is the name of the label containing the an alert's name. + AlertNameLabel = "alertname" + + // ExportedLabelPrefix is the prefix to prepend to the label names present in + // exported metrics if a label of the same name is added by the server. + ExportedLabelPrefix = "exported_" + + // MetricNameLabel is the label name indicating the metric name of a + // timeseries. + MetricNameLabel = "__name__" + + // SchemeLabel is the name of the label that holds the scheme on which to + // scrape a target. + SchemeLabel = "__scheme__" + + // AddressLabel is the name of the label that holds the address of + // a scrape target. + AddressLabel = "__address__" + + // MetricsPathLabel is the name of the label that holds the path on which to + // scrape a target. + MetricsPathLabel = "__metrics_path__" + + // ReservedLabelPrefix is a prefix which is not legal in user-supplied + // label names. + ReservedLabelPrefix = "__" + + // MetaLabelPrefix is a prefix for labels that provide meta information. + // Labels with this prefix are used for intermediate label processing and + // will not be attached to time series. + MetaLabelPrefix = "__meta_" + + // TmpLabelPrefix is a prefix for temporary labels as part of relabelling. + // Labels with this prefix are used for intermediate label processing and + // will not be attached to time series. This is reserved for use in + // Prometheus configuration files by users. + TmpLabelPrefix = "__tmp_" + + // ParamLabelPrefix is a prefix for labels that provide URL parameters + // used to scrape a target. + ParamLabelPrefix = "__param_" + + // JobLabel is the label name indicating the job from which a timeseries + // was scraped. + JobLabel = "job" + + // InstanceLabel is the label name used for the instance label. + InstanceLabel = "instance" + + // BucketLabel is used for the label that defines the upper bound of a + // bucket of a histogram ("le" -> "less or equal"). + BucketLabel = "le" + + // QuantileLabel is used for the label that defines the quantile in a + // summary. + QuantileLabel = "quantile" +) + +// LabelNameRE is a regular expression matching valid label names. Note that the +// IsValid method of LabelName performs the same check but faster than a match +// with this regular expression. +var LabelNameRE = regexp.MustCompile("^[a-zA-Z_][a-zA-Z0-9_]*$") + +// A LabelName is a key for a LabelSet or Metric. It has a value associated +// therewith. +type LabelName string + +// IsValid is true iff the label name matches the pattern of LabelNameRE. This +// method, however, does not use LabelNameRE for the check but a much faster +// hardcoded implementation. +func (ln LabelName) IsValid() bool { + if len(ln) == 0 { + return false + } + for i, b := range ln { + if !((b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_' || (b >= '0' && b <= '9' && i > 0)) { + return false + } + } + return true +} + +// UnmarshalYAML implements the yaml.Unmarshaler interface. +func (ln *LabelName) UnmarshalYAML(unmarshal func(interface{}) error) error { + var s string + if err := unmarshal(&s); err != nil { + return err + } + if !LabelName(s).IsValid() { + return fmt.Errorf("%q is not a valid label name", s) + } + *ln = LabelName(s) + return nil +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (ln *LabelName) UnmarshalJSON(b []byte) error { + var s string + if err := json.Unmarshal(b, &s); err != nil { + return err + } + if !LabelName(s).IsValid() { + return fmt.Errorf("%q is not a valid label name", s) + } + *ln = LabelName(s) + return nil +} + +// LabelNames is a sortable LabelName slice. In implements sort.Interface. +type LabelNames []LabelName + +func (l LabelNames) Len() int { + return len(l) +} + +func (l LabelNames) Less(i, j int) bool { + return l[i] < l[j] +} + +func (l LabelNames) Swap(i, j int) { + l[i], l[j] = l[j], l[i] +} + +func (l LabelNames) String() string { + labelStrings := make([]string, 0, len(l)) + for _, label := range l { + labelStrings = append(labelStrings, string(label)) + } + return strings.Join(labelStrings, ", ") +} + +// A LabelValue is an associated value for a LabelName. +type LabelValue string + +// IsValid returns true iff the string is a valid UTF8. +func (lv LabelValue) IsValid() bool { + return utf8.ValidString(string(lv)) +} + +// LabelValues is a sortable LabelValue slice. It implements sort.Interface. +type LabelValues []LabelValue + +func (l LabelValues) Len() int { + return len(l) +} + +func (l LabelValues) Less(i, j int) bool { + return string(l[i]) < string(l[j]) +} + +func (l LabelValues) Swap(i, j int) { + l[i], l[j] = l[j], l[i] +} + +// LabelPair pairs a name with a value. +type LabelPair struct { + Name LabelName + Value LabelValue +} + +// LabelPairs is a sortable slice of LabelPair pointers. It implements +// sort.Interface. +type LabelPairs []*LabelPair + +func (l LabelPairs) Len() int { + return len(l) +} + +func (l LabelPairs) Less(i, j int) bool { + switch { + case l[i].Name > l[j].Name: + return false + case l[i].Name < l[j].Name: + return true + case l[i].Value > l[j].Value: + return false + case l[i].Value < l[j].Value: + return true + default: + return false + } +} + +func (l LabelPairs) Swap(i, j int) { + l[i], l[j] = l[j], l[i] +} diff --git a/api/vendor/github.com/prometheus/common/model/labels_test.go b/api/vendor/github.com/prometheus/common/model/labels_test.go new file mode 100644 index 0000000..e8df28f --- /dev/null +++ b/api/vendor/github.com/prometheus/common/model/labels_test.go @@ -0,0 +1,140 @@ +// Copyright 2013 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 model + +import ( + "sort" + "testing" +) + +func testLabelNames(t testing.TB) { + var scenarios = []struct { + in LabelNames + out LabelNames + }{ + { + in: LabelNames{"ZZZ", "zzz"}, + out: LabelNames{"ZZZ", "zzz"}, + }, + { + in: LabelNames{"aaa", "AAA"}, + out: LabelNames{"AAA", "aaa"}, + }, + } + + for i, scenario := range scenarios { + sort.Sort(scenario.in) + + for j, expected := range scenario.out { + if expected != scenario.in[j] { + t.Errorf("%d.%d expected %s, got %s", i, j, expected, scenario.in[j]) + } + } + } +} + +func TestLabelNames(t *testing.T) { + testLabelNames(t) +} + +func BenchmarkLabelNames(b *testing.B) { + for i := 0; i < b.N; i++ { + testLabelNames(b) + } +} + +func testLabelValues(t testing.TB) { + var scenarios = []struct { + in LabelValues + out LabelValues + }{ + { + in: LabelValues{"ZZZ", "zzz"}, + out: LabelValues{"ZZZ", "zzz"}, + }, + { + in: LabelValues{"aaa", "AAA"}, + out: LabelValues{"AAA", "aaa"}, + }, + } + + for i, scenario := range scenarios { + sort.Sort(scenario.in) + + for j, expected := range scenario.out { + if expected != scenario.in[j] { + t.Errorf("%d.%d expected %s, got %s", i, j, expected, scenario.in[j]) + } + } + } +} + +func TestLabelValues(t *testing.T) { + testLabelValues(t) +} + +func BenchmarkLabelValues(b *testing.B) { + for i := 0; i < b.N; i++ { + testLabelValues(b) + } +} + +func TestLabelNameIsValid(t *testing.T) { + var scenarios = []struct { + ln LabelName + valid bool + }{ + { + ln: "Avalid_23name", + valid: true, + }, + { + ln: "_Avalid_23name", + valid: true, + }, + { + ln: "1valid_23name", + valid: false, + }, + { + ln: "avalid_23name", + valid: true, + }, + { + ln: "Ava:lid_23name", + valid: false, + }, + { + ln: "a lid_23name", + valid: false, + }, + { + ln: ":leading_colon", + valid: false, + }, + { + ln: "colon:in:the:middle", + valid: false, + }, + } + + for _, s := range scenarios { + if s.ln.IsValid() != s.valid { + t.Errorf("Expected %v for %q using IsValid method", s.valid, s.ln) + } + if LabelNameRE.MatchString(string(s.ln)) != s.valid { + t.Errorf("Expected %v for %q using regexp match", s.valid, s.ln) + } + } +} diff --git a/api/vendor/github.com/prometheus/common/model/labelset.go b/api/vendor/github.com/prometheus/common/model/labelset.go new file mode 100644 index 0000000..6eda08a --- /dev/null +++ b/api/vendor/github.com/prometheus/common/model/labelset.go @@ -0,0 +1,169 @@ +// Copyright 2013 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 model + +import ( + "encoding/json" + "fmt" + "sort" + "strings" +) + +// A LabelSet is a collection of LabelName and LabelValue pairs. The LabelSet +// may be fully-qualified down to the point where it may resolve to a single +// Metric in the data store or not. All operations that occur within the realm +// of a LabelSet can emit a vector of Metric entities to which the LabelSet may +// match. +type LabelSet map[LabelName]LabelValue + +// Validate checks whether all names and values in the label set +// are valid. +func (ls LabelSet) Validate() error { + for ln, lv := range ls { + if !ln.IsValid() { + return fmt.Errorf("invalid name %q", ln) + } + if !lv.IsValid() { + return fmt.Errorf("invalid value %q", lv) + } + } + return nil +} + +// Equal returns true iff both label sets have exactly the same key/value pairs. +func (ls LabelSet) Equal(o LabelSet) bool { + if len(ls) != len(o) { + return false + } + for ln, lv := range ls { + olv, ok := o[ln] + if !ok { + return false + } + if olv != lv { + return false + } + } + return true +} + +// Before compares the metrics, using the following criteria: +// +// If m has fewer labels than o, it is before o. If it has more, it is not. +// +// If the number of labels is the same, the superset of all label names is +// sorted alphanumerically. The first differing label pair found in that order +// determines the outcome: If the label does not exist at all in m, then m is +// before o, and vice versa. Otherwise the label value is compared +// alphanumerically. +// +// If m and o are equal, the method returns false. +func (ls LabelSet) Before(o LabelSet) bool { + if len(ls) < len(o) { + return true + } + if len(ls) > len(o) { + return false + } + + lns := make(LabelNames, 0, len(ls)+len(o)) + for ln := range ls { + lns = append(lns, ln) + } + for ln := range o { + lns = append(lns, ln) + } + // It's probably not worth it to de-dup lns. + sort.Sort(lns) + for _, ln := range lns { + mlv, ok := ls[ln] + if !ok { + return true + } + olv, ok := o[ln] + if !ok { + return false + } + if mlv < olv { + return true + } + if mlv > olv { + return false + } + } + return false +} + +// Clone returns a copy of the label set. +func (ls LabelSet) Clone() LabelSet { + lsn := make(LabelSet, len(ls)) + for ln, lv := range ls { + lsn[ln] = lv + } + return lsn +} + +// Merge is a helper function to non-destructively merge two label sets. +func (l LabelSet) Merge(other LabelSet) LabelSet { + result := make(LabelSet, len(l)) + + for k, v := range l { + result[k] = v + } + + for k, v := range other { + result[k] = v + } + + return result +} + +func (l LabelSet) String() string { + lstrs := make([]string, 0, len(l)) + for l, v := range l { + lstrs = append(lstrs, fmt.Sprintf("%s=%q", l, v)) + } + + sort.Strings(lstrs) + return fmt.Sprintf("{%s}", strings.Join(lstrs, ", ")) +} + +// Fingerprint returns the LabelSet's fingerprint. +func (ls LabelSet) Fingerprint() Fingerprint { + return labelSetToFingerprint(ls) +} + +// FastFingerprint returns the LabelSet's Fingerprint calculated by a faster hashing +// algorithm, which is, however, more susceptible to hash collisions. +func (ls LabelSet) FastFingerprint() Fingerprint { + return labelSetToFastFingerprint(ls) +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (l *LabelSet) UnmarshalJSON(b []byte) error { + var m map[LabelName]LabelValue + if err := json.Unmarshal(b, &m); err != nil { + return err + } + // encoding/json only unmarshals maps of the form map[string]T. It treats + // LabelName as a string and does not call its UnmarshalJSON method. + // Thus, we have to replicate the behavior here. + for ln := range m { + if !ln.IsValid() { + return fmt.Errorf("%q is not a valid label name", ln) + } + } + *l = LabelSet(m) + return nil +} diff --git a/api/vendor/github.com/prometheus/common/model/metric.go b/api/vendor/github.com/prometheus/common/model/metric.go new file mode 100644 index 0000000..f725090 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/model/metric.go @@ -0,0 +1,103 @@ +// Copyright 2013 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 model + +import ( + "fmt" + "regexp" + "sort" + "strings" +) + +var ( + separator = []byte{0} + // MetricNameRE is a regular expression matching valid metric + // names. Note that the IsValidMetricName function performs the same + // check but faster than a match with this regular expression. + MetricNameRE = regexp.MustCompile(`^[a-zA-Z_:][a-zA-Z0-9_:]*$`) +) + +// A Metric is similar to a LabelSet, but the key difference is that a Metric is +// a singleton and refers to one and only one stream of samples. +type Metric LabelSet + +// Equal compares the metrics. +func (m Metric) Equal(o Metric) bool { + return LabelSet(m).Equal(LabelSet(o)) +} + +// Before compares the metrics' underlying label sets. +func (m Metric) Before(o Metric) bool { + return LabelSet(m).Before(LabelSet(o)) +} + +// Clone returns a copy of the Metric. +func (m Metric) Clone() Metric { + clone := make(Metric, len(m)) + for k, v := range m { + clone[k] = v + } + return clone +} + +func (m Metric) String() string { + metricName, hasName := m[MetricNameLabel] + numLabels := len(m) - 1 + if !hasName { + numLabels = len(m) + } + labelStrings := make([]string, 0, numLabels) + for label, value := range m { + if label != MetricNameLabel { + labelStrings = append(labelStrings, fmt.Sprintf("%s=%q", label, value)) + } + } + + switch numLabels { + case 0: + if hasName { + return string(metricName) + } + return "{}" + default: + sort.Strings(labelStrings) + return fmt.Sprintf("%s{%s}", metricName, strings.Join(labelStrings, ", ")) + } +} + +// Fingerprint returns a Metric's Fingerprint. +func (m Metric) Fingerprint() Fingerprint { + return LabelSet(m).Fingerprint() +} + +// FastFingerprint returns a Metric's Fingerprint calculated by a faster hashing +// algorithm, which is, however, more susceptible to hash collisions. +func (m Metric) FastFingerprint() Fingerprint { + return LabelSet(m).FastFingerprint() +} + +// IsValidMetricName returns true iff name matches the pattern of MetricNameRE. +// This function, however, does not use MetricNameRE for the check but a much +// faster hardcoded implementation. +func IsValidMetricName(n LabelValue) bool { + if len(n) == 0 { + return false + } + for i, b := range n { + if !((b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_' || b == ':' || (b >= '0' && b <= '9' && i > 0)) { + return false + } + } + return true +} diff --git a/api/vendor/github.com/prometheus/common/model/metric_test.go b/api/vendor/github.com/prometheus/common/model/metric_test.go new file mode 100644 index 0000000..06f9de5 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/model/metric_test.go @@ -0,0 +1,132 @@ +// Copyright 2013 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 model + +import "testing" + +func testMetric(t testing.TB) { + var scenarios = []struct { + input LabelSet + fingerprint Fingerprint + fastFingerprint Fingerprint + }{ + { + input: LabelSet{}, + fingerprint: 14695981039346656037, + fastFingerprint: 14695981039346656037, + }, + { + input: LabelSet{ + "first_name": "electro", + "occupation": "robot", + "manufacturer": "westinghouse", + }, + fingerprint: 5911716720268894962, + fastFingerprint: 11310079640881077873, + }, + { + input: LabelSet{ + "x": "y", + }, + fingerprint: 8241431561484471700, + fastFingerprint: 13948396922932177635, + }, + { + input: LabelSet{ + "a": "bb", + "b": "c", + }, + fingerprint: 3016285359649981711, + fastFingerprint: 3198632812309449502, + }, + { + input: LabelSet{ + "a": "b", + "bb": "c", + }, + fingerprint: 7122421792099404749, + fastFingerprint: 5774953389407657638, + }, + } + + for i, scenario := range scenarios { + input := Metric(scenario.input) + + if scenario.fingerprint != input.Fingerprint() { + t.Errorf("%d. expected %d, got %d", i, scenario.fingerprint, input.Fingerprint()) + } + if scenario.fastFingerprint != input.FastFingerprint() { + t.Errorf("%d. expected %d, got %d", i, scenario.fastFingerprint, input.FastFingerprint()) + } + } +} + +func TestMetric(t *testing.T) { + testMetric(t) +} + +func BenchmarkMetric(b *testing.B) { + for i := 0; i < b.N; i++ { + testMetric(b) + } +} + +func TestMetricNameIsValid(t *testing.T) { + var scenarios = []struct { + mn LabelValue + valid bool + }{ + { + mn: "Avalid_23name", + valid: true, + }, + { + mn: "_Avalid_23name", + valid: true, + }, + { + mn: "1valid_23name", + valid: false, + }, + { + mn: "avalid_23name", + valid: true, + }, + { + mn: "Ava:lid_23name", + valid: true, + }, + { + mn: "a lid_23name", + valid: false, + }, + { + mn: ":leading_colon", + valid: true, + }, + { + mn: "colon:in:the:middle", + valid: true, + }, + } + + for _, s := range scenarios { + if IsValidMetricName(s.mn) != s.valid { + t.Errorf("Expected %v for %q using IsValidMetricName function", s.valid, s.mn) + } + if MetricNameRE.MatchString(string(s.mn)) != s.valid { + t.Errorf("Expected %v for %q using regexp matching", s.valid, s.mn) + } + } +} diff --git a/api/vendor/github.com/prometheus/common/model/model.go b/api/vendor/github.com/prometheus/common/model/model.go new file mode 100644 index 0000000..a7b9691 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/model/model.go @@ -0,0 +1,16 @@ +// Copyright 2013 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 model contains common data structures that are shared across +// Prometheus components and libraries. +package model diff --git a/api/vendor/github.com/prometheus/common/model/signature.go b/api/vendor/github.com/prometheus/common/model/signature.go new file mode 100644 index 0000000..8762b13 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/model/signature.go @@ -0,0 +1,144 @@ +// Copyright 2014 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 model + +import ( + "sort" +) + +// SeparatorByte is a byte that cannot occur in valid UTF-8 sequences and is +// used to separate label names, label values, and other strings from each other +// when calculating their combined hash value (aka signature aka fingerprint). +const SeparatorByte byte = 255 + +var ( + // cache the signature of an empty label set. + emptyLabelSignature = hashNew() +) + +// LabelsToSignature returns a quasi-unique signature (i.e., fingerprint) for a +// given label set. (Collisions are possible but unlikely if the number of label +// sets the function is applied to is small.) +func LabelsToSignature(labels map[string]string) uint64 { + if len(labels) == 0 { + return emptyLabelSignature + } + + labelNames := make([]string, 0, len(labels)) + for labelName := range labels { + labelNames = append(labelNames, labelName) + } + sort.Strings(labelNames) + + sum := hashNew() + for _, labelName := range labelNames { + sum = hashAdd(sum, labelName) + sum = hashAddByte(sum, SeparatorByte) + sum = hashAdd(sum, labels[labelName]) + sum = hashAddByte(sum, SeparatorByte) + } + return sum +} + +// labelSetToFingerprint works exactly as LabelsToSignature but takes a LabelSet as +// parameter (rather than a label map) and returns a Fingerprint. +func labelSetToFingerprint(ls LabelSet) Fingerprint { + if len(ls) == 0 { + return Fingerprint(emptyLabelSignature) + } + + labelNames := make(LabelNames, 0, len(ls)) + for labelName := range ls { + labelNames = append(labelNames, labelName) + } + sort.Sort(labelNames) + + sum := hashNew() + for _, labelName := range labelNames { + sum = hashAdd(sum, string(labelName)) + sum = hashAddByte(sum, SeparatorByte) + sum = hashAdd(sum, string(ls[labelName])) + sum = hashAddByte(sum, SeparatorByte) + } + return Fingerprint(sum) +} + +// labelSetToFastFingerprint works similar to labelSetToFingerprint but uses a +// faster and less allocation-heavy hash function, which is more susceptible to +// create hash collisions. Therefore, collision detection should be applied. +func labelSetToFastFingerprint(ls LabelSet) Fingerprint { + if len(ls) == 0 { + return Fingerprint(emptyLabelSignature) + } + + var result uint64 + for labelName, labelValue := range ls { + sum := hashNew() + sum = hashAdd(sum, string(labelName)) + sum = hashAddByte(sum, SeparatorByte) + sum = hashAdd(sum, string(labelValue)) + result ^= sum + } + return Fingerprint(result) +} + +// SignatureForLabels works like LabelsToSignature but takes a Metric as +// parameter (rather than a label map) and only includes the labels with the +// specified LabelNames into the signature calculation. The labels passed in +// will be sorted by this function. +func SignatureForLabels(m Metric, labels ...LabelName) uint64 { + if len(labels) == 0 { + return emptyLabelSignature + } + + sort.Sort(LabelNames(labels)) + + sum := hashNew() + for _, label := range labels { + sum = hashAdd(sum, string(label)) + sum = hashAddByte(sum, SeparatorByte) + sum = hashAdd(sum, string(m[label])) + sum = hashAddByte(sum, SeparatorByte) + } + return sum +} + +// SignatureWithoutLabels works like LabelsToSignature but takes a Metric as +// parameter (rather than a label map) and excludes the labels with any of the +// specified LabelNames from the signature calculation. +func SignatureWithoutLabels(m Metric, labels map[LabelName]struct{}) uint64 { + if len(m) == 0 { + return emptyLabelSignature + } + + labelNames := make(LabelNames, 0, len(m)) + for labelName := range m { + if _, exclude := labels[labelName]; !exclude { + labelNames = append(labelNames, labelName) + } + } + if len(labelNames) == 0 { + return emptyLabelSignature + } + sort.Sort(labelNames) + + sum := hashNew() + for _, labelName := range labelNames { + sum = hashAdd(sum, string(labelName)) + sum = hashAddByte(sum, SeparatorByte) + sum = hashAdd(sum, string(m[labelName])) + sum = hashAddByte(sum, SeparatorByte) + } + return sum +} diff --git a/api/vendor/github.com/prometheus/common/model/signature_test.go b/api/vendor/github.com/prometheus/common/model/signature_test.go new file mode 100644 index 0000000..d59c8a8 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/model/signature_test.go @@ -0,0 +1,314 @@ +// Copyright 2014 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 model + +import ( + "runtime" + "sync" + "testing" +) + +func TestLabelsToSignature(t *testing.T) { + var scenarios = []struct { + in map[string]string + out uint64 + }{ + { + in: map[string]string{}, + out: 14695981039346656037, + }, + { + in: map[string]string{"name": "garland, briggs", "fear": "love is not enough"}, + out: 5799056148416392346, + }, + } + + for i, scenario := range scenarios { + actual := LabelsToSignature(scenario.in) + + if actual != scenario.out { + t.Errorf("%d. expected %d, got %d", i, scenario.out, actual) + } + } +} + +func TestMetricToFingerprint(t *testing.T) { + var scenarios = []struct { + in LabelSet + out Fingerprint + }{ + { + in: LabelSet{}, + out: 14695981039346656037, + }, + { + in: LabelSet{"name": "garland, briggs", "fear": "love is not enough"}, + out: 5799056148416392346, + }, + } + + for i, scenario := range scenarios { + actual := labelSetToFingerprint(scenario.in) + + if actual != scenario.out { + t.Errorf("%d. expected %d, got %d", i, scenario.out, actual) + } + } +} + +func TestMetricToFastFingerprint(t *testing.T) { + var scenarios = []struct { + in LabelSet + out Fingerprint + }{ + { + in: LabelSet{}, + out: 14695981039346656037, + }, + { + in: LabelSet{"name": "garland, briggs", "fear": "love is not enough"}, + out: 12952432476264840823, + }, + } + + for i, scenario := range scenarios { + actual := labelSetToFastFingerprint(scenario.in) + + if actual != scenario.out { + t.Errorf("%d. expected %d, got %d", i, scenario.out, actual) + } + } +} + +func TestSignatureForLabels(t *testing.T) { + var scenarios = []struct { + in Metric + labels LabelNames + out uint64 + }{ + { + in: Metric{}, + labels: nil, + out: 14695981039346656037, + }, + { + in: Metric{}, + labels: LabelNames{"empty"}, + out: 7187873163539638612, + }, + { + in: Metric{"name": "garland, briggs", "fear": "love is not enough"}, + labels: LabelNames{"empty"}, + out: 7187873163539638612, + }, + { + in: Metric{"name": "garland, briggs", "fear": "love is not enough"}, + labels: LabelNames{"fear", "name"}, + out: 5799056148416392346, + }, + { + in: Metric{"name": "garland, briggs", "fear": "love is not enough", "foo": "bar"}, + labels: LabelNames{"fear", "name"}, + out: 5799056148416392346, + }, + { + in: Metric{"name": "garland, briggs", "fear": "love is not enough"}, + labels: LabelNames{}, + out: 14695981039346656037, + }, + { + in: Metric{"name": "garland, briggs", "fear": "love is not enough"}, + labels: nil, + out: 14695981039346656037, + }, + } + + for i, scenario := range scenarios { + actual := SignatureForLabels(scenario.in, scenario.labels...) + + if actual != scenario.out { + t.Errorf("%d. expected %d, got %d", i, scenario.out, actual) + } + } +} + +func TestSignatureWithoutLabels(t *testing.T) { + var scenarios = []struct { + in Metric + labels map[LabelName]struct{} + out uint64 + }{ + { + in: Metric{}, + labels: nil, + out: 14695981039346656037, + }, + { + in: Metric{"name": "garland, briggs", "fear": "love is not enough"}, + labels: map[LabelName]struct{}{"fear": struct{}{}, "name": struct{}{}}, + out: 14695981039346656037, + }, + { + in: Metric{"name": "garland, briggs", "fear": "love is not enough", "foo": "bar"}, + labels: map[LabelName]struct{}{"foo": struct{}{}}, + out: 5799056148416392346, + }, + { + in: Metric{"name": "garland, briggs", "fear": "love is not enough"}, + labels: map[LabelName]struct{}{}, + out: 5799056148416392346, + }, + { + in: Metric{"name": "garland, briggs", "fear": "love is not enough"}, + labels: nil, + out: 5799056148416392346, + }, + } + + for i, scenario := range scenarios { + actual := SignatureWithoutLabels(scenario.in, scenario.labels) + + if actual != scenario.out { + t.Errorf("%d. expected %d, got %d", i, scenario.out, actual) + } + } +} + +func benchmarkLabelToSignature(b *testing.B, l map[string]string, e uint64) { + for i := 0; i < b.N; i++ { + if a := LabelsToSignature(l); a != e { + b.Fatalf("expected signature of %d for %s, got %d", e, l, a) + } + } +} + +func BenchmarkLabelToSignatureScalar(b *testing.B) { + benchmarkLabelToSignature(b, nil, 14695981039346656037) +} + +func BenchmarkLabelToSignatureSingle(b *testing.B) { + benchmarkLabelToSignature(b, map[string]string{"first-label": "first-label-value"}, 5146282821936882169) +} + +func BenchmarkLabelToSignatureDouble(b *testing.B) { + benchmarkLabelToSignature(b, map[string]string{"first-label": "first-label-value", "second-label": "second-label-value"}, 3195800080984914717) +} + +func BenchmarkLabelToSignatureTriple(b *testing.B) { + benchmarkLabelToSignature(b, map[string]string{"first-label": "first-label-value", "second-label": "second-label-value", "third-label": "third-label-value"}, 13843036195897128121) +} + +func benchmarkMetricToFingerprint(b *testing.B, ls LabelSet, e Fingerprint) { + for i := 0; i < b.N; i++ { + if a := labelSetToFingerprint(ls); a != e { + b.Fatalf("expected signature of %d for %s, got %d", e, ls, a) + } + } +} + +func BenchmarkMetricToFingerprintScalar(b *testing.B) { + benchmarkMetricToFingerprint(b, nil, 14695981039346656037) +} + +func BenchmarkMetricToFingerprintSingle(b *testing.B) { + benchmarkMetricToFingerprint(b, LabelSet{"first-label": "first-label-value"}, 5146282821936882169) +} + +func BenchmarkMetricToFingerprintDouble(b *testing.B) { + benchmarkMetricToFingerprint(b, LabelSet{"first-label": "first-label-value", "second-label": "second-label-value"}, 3195800080984914717) +} + +func BenchmarkMetricToFingerprintTriple(b *testing.B) { + benchmarkMetricToFingerprint(b, LabelSet{"first-label": "first-label-value", "second-label": "second-label-value", "third-label": "third-label-value"}, 13843036195897128121) +} + +func benchmarkMetricToFastFingerprint(b *testing.B, ls LabelSet, e Fingerprint) { + for i := 0; i < b.N; i++ { + if a := labelSetToFastFingerprint(ls); a != e { + b.Fatalf("expected signature of %d for %s, got %d", e, ls, a) + } + } +} + +func BenchmarkMetricToFastFingerprintScalar(b *testing.B) { + benchmarkMetricToFastFingerprint(b, nil, 14695981039346656037) +} + +func BenchmarkMetricToFastFingerprintSingle(b *testing.B) { + benchmarkMetricToFastFingerprint(b, LabelSet{"first-label": "first-label-value"}, 5147259542624943964) +} + +func BenchmarkMetricToFastFingerprintDouble(b *testing.B) { + benchmarkMetricToFastFingerprint(b, LabelSet{"first-label": "first-label-value", "second-label": "second-label-value"}, 18269973311206963528) +} + +func BenchmarkMetricToFastFingerprintTriple(b *testing.B) { + benchmarkMetricToFastFingerprint(b, LabelSet{"first-label": "first-label-value", "second-label": "second-label-value", "third-label": "third-label-value"}, 15738406913934009676) +} + +func BenchmarkEmptyLabelSignature(b *testing.B) { + input := []map[string]string{nil, {}} + + var ms runtime.MemStats + runtime.ReadMemStats(&ms) + + alloc := ms.Alloc + + for _, labels := range input { + LabelsToSignature(labels) + } + + runtime.ReadMemStats(&ms) + + if got := ms.Alloc; alloc != got { + b.Fatal("expected LabelsToSignature with empty labels not to perform allocations") + } +} + +func benchmarkMetricToFastFingerprintConc(b *testing.B, ls LabelSet, e Fingerprint, concLevel int) { + var start, end sync.WaitGroup + start.Add(1) + end.Add(concLevel) + + for i := 0; i < concLevel; i++ { + go func() { + start.Wait() + for j := b.N / concLevel; j >= 0; j-- { + if a := labelSetToFastFingerprint(ls); a != e { + b.Fatalf("expected signature of %d for %s, got %d", e, ls, a) + } + } + end.Done() + }() + } + b.ResetTimer() + start.Done() + end.Wait() +} + +func BenchmarkMetricToFastFingerprintTripleConc1(b *testing.B) { + benchmarkMetricToFastFingerprintConc(b, LabelSet{"first-label": "first-label-value", "second-label": "second-label-value", "third-label": "third-label-value"}, 15738406913934009676, 1) +} + +func BenchmarkMetricToFastFingerprintTripleConc2(b *testing.B) { + benchmarkMetricToFastFingerprintConc(b, LabelSet{"first-label": "first-label-value", "second-label": "second-label-value", "third-label": "third-label-value"}, 15738406913934009676, 2) +} + +func BenchmarkMetricToFastFingerprintTripleConc4(b *testing.B) { + benchmarkMetricToFastFingerprintConc(b, LabelSet{"first-label": "first-label-value", "second-label": "second-label-value", "third-label": "third-label-value"}, 15738406913934009676, 4) +} + +func BenchmarkMetricToFastFingerprintTripleConc8(b *testing.B) { + benchmarkMetricToFastFingerprintConc(b, LabelSet{"first-label": "first-label-value", "second-label": "second-label-value", "third-label": "third-label-value"}, 15738406913934009676, 8) +} diff --git a/api/vendor/github.com/prometheus/common/model/silence.go b/api/vendor/github.com/prometheus/common/model/silence.go new file mode 100644 index 0000000..bb99889 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/model/silence.go @@ -0,0 +1,106 @@ +// Copyright 2015 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 model + +import ( + "encoding/json" + "fmt" + "regexp" + "time" +) + +// Matcher describes a matches the value of a given label. +type Matcher struct { + Name LabelName `json:"name"` + Value string `json:"value"` + IsRegex bool `json:"isRegex"` +} + +func (m *Matcher) UnmarshalJSON(b []byte) error { + type plain Matcher + if err := json.Unmarshal(b, (*plain)(m)); err != nil { + return err + } + + if len(m.Name) == 0 { + return fmt.Errorf("label name in matcher must not be empty") + } + if m.IsRegex { + if _, err := regexp.Compile(m.Value); err != nil { + return err + } + } + return nil +} + +// Validate returns true iff all fields of the matcher have valid values. +func (m *Matcher) Validate() error { + if !m.Name.IsValid() { + return fmt.Errorf("invalid name %q", m.Name) + } + if m.IsRegex { + if _, err := regexp.Compile(m.Value); err != nil { + return fmt.Errorf("invalid regular expression %q", m.Value) + } + } else if !LabelValue(m.Value).IsValid() || len(m.Value) == 0 { + return fmt.Errorf("invalid value %q", m.Value) + } + return nil +} + +// Silence defines the representation of a silence definition in the Prometheus +// eco-system. +type Silence struct { + ID uint64 `json:"id,omitempty"` + + Matchers []*Matcher `json:"matchers"` + + StartsAt time.Time `json:"startsAt"` + EndsAt time.Time `json:"endsAt"` + + CreatedAt time.Time `json:"createdAt,omitempty"` + CreatedBy string `json:"createdBy"` + Comment string `json:"comment,omitempty"` +} + +// Validate returns true iff all fields of the silence have valid values. +func (s *Silence) Validate() error { + if len(s.Matchers) == 0 { + return fmt.Errorf("at least one matcher required") + } + for _, m := range s.Matchers { + if err := m.Validate(); err != nil { + return fmt.Errorf("invalid matcher: %s", err) + } + } + if s.StartsAt.IsZero() { + return fmt.Errorf("start time missing") + } + if s.EndsAt.IsZero() { + return fmt.Errorf("end time missing") + } + if s.EndsAt.Before(s.StartsAt) { + return fmt.Errorf("start time must be before end time") + } + if s.CreatedBy == "" { + return fmt.Errorf("creator information missing") + } + if s.Comment == "" { + return fmt.Errorf("comment missing") + } + if s.CreatedAt.IsZero() { + return fmt.Errorf("creation timestamp missing") + } + return nil +} diff --git a/api/vendor/github.com/prometheus/common/model/silence_test.go b/api/vendor/github.com/prometheus/common/model/silence_test.go new file mode 100644 index 0000000..8eaaf07 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/model/silence_test.go @@ -0,0 +1,228 @@ +// Copyright 2015 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 model + +import ( + "strings" + "testing" + "time" +) + +func TestMatcherValidate(t *testing.T) { + var cases = []struct { + matcher *Matcher + err string + }{ + { + matcher: &Matcher{ + Name: "name", + Value: "value", + }, + }, + { + matcher: &Matcher{ + Name: "name", + Value: "value", + IsRegex: true, + }, + }, + { + matcher: &Matcher{ + Name: "name!", + Value: "value", + }, + err: "invalid name", + }, + { + matcher: &Matcher{ + Name: "", + Value: "value", + }, + err: "invalid name", + }, + { + matcher: &Matcher{ + Name: "name", + Value: "value\xff", + }, + err: "invalid value", + }, + { + matcher: &Matcher{ + Name: "name", + Value: "", + }, + err: "invalid value", + }, + } + + for i, c := range cases { + err := c.matcher.Validate() + if err == nil { + if c.err == "" { + continue + } + t.Errorf("%d. Expected error %q but got none", i, c.err) + continue + } + if c.err == "" && err != nil { + t.Errorf("%d. Expected no error but got %q", i, err) + continue + } + if !strings.Contains(err.Error(), c.err) { + t.Errorf("%d. Expected error to contain %q but got %q", i, c.err, err) + } + } +} + +func TestSilenceValidate(t *testing.T) { + ts := time.Now() + + var cases = []struct { + sil *Silence + err string + }{ + { + sil: &Silence{ + Matchers: []*Matcher{ + {Name: "name", Value: "value"}, + }, + StartsAt: ts, + EndsAt: ts, + CreatedAt: ts, + CreatedBy: "name", + Comment: "comment", + }, + }, + { + sil: &Silence{ + Matchers: []*Matcher{ + {Name: "name", Value: "value"}, + {Name: "name", Value: "value"}, + {Name: "name", Value: "value"}, + {Name: "name", Value: "value", IsRegex: true}, + }, + StartsAt: ts, + EndsAt: ts, + CreatedAt: ts, + CreatedBy: "name", + Comment: "comment", + }, + }, + { + sil: &Silence{ + Matchers: []*Matcher{ + {Name: "name", Value: "value"}, + }, + StartsAt: ts, + EndsAt: ts.Add(-1 * time.Minute), + CreatedAt: ts, + CreatedBy: "name", + Comment: "comment", + }, + err: "start time must be before end time", + }, + { + sil: &Silence{ + Matchers: []*Matcher{ + {Name: "name", Value: "value"}, + }, + StartsAt: ts, + CreatedAt: ts, + CreatedBy: "name", + Comment: "comment", + }, + err: "end time missing", + }, + { + sil: &Silence{ + Matchers: []*Matcher{ + {Name: "name", Value: "value"}, + }, + EndsAt: ts, + CreatedAt: ts, + CreatedBy: "name", + Comment: "comment", + }, + err: "start time missing", + }, + { + sil: &Silence{ + Matchers: []*Matcher{ + {Name: "!name", Value: "value"}, + }, + StartsAt: ts, + EndsAt: ts, + CreatedAt: ts, + CreatedBy: "name", + Comment: "comment", + }, + err: "invalid matcher", + }, + { + sil: &Silence{ + Matchers: []*Matcher{ + {Name: "name", Value: "value"}, + }, + StartsAt: ts, + EndsAt: ts, + CreatedAt: ts, + CreatedBy: "name", + }, + err: "comment missing", + }, + { + sil: &Silence{ + Matchers: []*Matcher{ + {Name: "name", Value: "value"}, + }, + StartsAt: ts, + EndsAt: ts, + CreatedBy: "name", + Comment: "comment", + }, + err: "creation timestamp missing", + }, + { + sil: &Silence{ + Matchers: []*Matcher{ + {Name: "name", Value: "value"}, + }, + StartsAt: ts, + EndsAt: ts, + CreatedAt: ts, + Comment: "comment", + }, + err: "creator information missing", + }, + } + + for i, c := range cases { + err := c.sil.Validate() + if err == nil { + if c.err == "" { + continue + } + t.Errorf("%d. Expected error %q but got none", i, c.err) + continue + } + if c.err == "" && err != nil { + t.Errorf("%d. Expected no error but got %q", i, err) + continue + } + if !strings.Contains(err.Error(), c.err) { + t.Errorf("%d. Expected error to contain %q but got %q", i, c.err, err) + } + } +} diff --git a/api/vendor/github.com/prometheus/common/model/time.go b/api/vendor/github.com/prometheus/common/model/time.go new file mode 100644 index 0000000..74ed5a9 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/model/time.go @@ -0,0 +1,264 @@ +// Copyright 2013 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 model + +import ( + "fmt" + "math" + "regexp" + "strconv" + "strings" + "time" +) + +const ( + // MinimumTick is the minimum supported time resolution. This has to be + // at least time.Second in order for the code below to work. + minimumTick = time.Millisecond + // second is the Time duration equivalent to one second. + second = int64(time.Second / minimumTick) + // The number of nanoseconds per minimum tick. + nanosPerTick = int64(minimumTick / time.Nanosecond) + + // Earliest is the earliest Time representable. Handy for + // initializing a high watermark. + Earliest = Time(math.MinInt64) + // Latest is the latest Time representable. Handy for initializing + // a low watermark. + Latest = Time(math.MaxInt64) +) + +// Time is the number of milliseconds since the epoch +// (1970-01-01 00:00 UTC) excluding leap seconds. +type Time int64 + +// Interval describes and interval between two timestamps. +type Interval struct { + Start, End Time +} + +// Now returns the current time as a Time. +func Now() Time { + return TimeFromUnixNano(time.Now().UnixNano()) +} + +// TimeFromUnix returns the Time equivalent to the Unix Time t +// provided in seconds. +func TimeFromUnix(t int64) Time { + return Time(t * second) +} + +// TimeFromUnixNano returns the Time equivalent to the Unix Time +// t provided in nanoseconds. +func TimeFromUnixNano(t int64) Time { + return Time(t / nanosPerTick) +} + +// Equal reports whether two Times represent the same instant. +func (t Time) Equal(o Time) bool { + return t == o +} + +// Before reports whether the Time t is before o. +func (t Time) Before(o Time) bool { + return t < o +} + +// After reports whether the Time t is after o. +func (t Time) After(o Time) bool { + return t > o +} + +// Add returns the Time t + d. +func (t Time) Add(d time.Duration) Time { + return t + Time(d/minimumTick) +} + +// Sub returns the Duration t - o. +func (t Time) Sub(o Time) time.Duration { + return time.Duration(t-o) * minimumTick +} + +// Time returns the time.Time representation of t. +func (t Time) Time() time.Time { + return time.Unix(int64(t)/second, (int64(t)%second)*nanosPerTick) +} + +// Unix returns t as a Unix time, the number of seconds elapsed +// since January 1, 1970 UTC. +func (t Time) Unix() int64 { + return int64(t) / second +} + +// UnixNano returns t as a Unix time, the number of nanoseconds elapsed +// since January 1, 1970 UTC. +func (t Time) UnixNano() int64 { + return int64(t) * nanosPerTick +} + +// The number of digits after the dot. +var dotPrecision = int(math.Log10(float64(second))) + +// String returns a string representation of the Time. +func (t Time) String() string { + return strconv.FormatFloat(float64(t)/float64(second), 'f', -1, 64) +} + +// MarshalJSON implements the json.Marshaler interface. +func (t Time) MarshalJSON() ([]byte, error) { + return []byte(t.String()), nil +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (t *Time) UnmarshalJSON(b []byte) error { + p := strings.Split(string(b), ".") + switch len(p) { + case 1: + v, err := strconv.ParseInt(string(p[0]), 10, 64) + if err != nil { + return err + } + *t = Time(v * second) + + case 2: + v, err := strconv.ParseInt(string(p[0]), 10, 64) + if err != nil { + return err + } + v *= second + + prec := dotPrecision - len(p[1]) + if prec < 0 { + p[1] = p[1][:dotPrecision] + } else if prec > 0 { + p[1] = p[1] + strings.Repeat("0", prec) + } + + va, err := strconv.ParseInt(p[1], 10, 32) + if err != nil { + return err + } + + *t = Time(v + va) + + default: + return fmt.Errorf("invalid time %q", string(b)) + } + return nil +} + +// Duration wraps time.Duration. It is used to parse the custom duration format +// from YAML. +// This type should not propagate beyond the scope of input/output processing. +type Duration time.Duration + +// Set implements pflag/flag.Value +func (d *Duration) Set(s string) error { + var err error + *d, err = ParseDuration(s) + return err +} + +// Type implements pflag.Value +func (d *Duration) Type() string { + return "duration" +} + +var durationRE = regexp.MustCompile("^([0-9]+)(y|w|d|h|m|s|ms)$") + +// ParseDuration parses a string into a time.Duration, assuming that a year +// always has 365d, a week always has 7d, and a day always has 24h. +func ParseDuration(durationStr string) (Duration, error) { + matches := durationRE.FindStringSubmatch(durationStr) + if len(matches) != 3 { + return 0, fmt.Errorf("not a valid duration string: %q", durationStr) + } + var ( + n, _ = strconv.Atoi(matches[1]) + dur = time.Duration(n) * time.Millisecond + ) + switch unit := matches[2]; unit { + case "y": + dur *= 1000 * 60 * 60 * 24 * 365 + case "w": + dur *= 1000 * 60 * 60 * 24 * 7 + case "d": + dur *= 1000 * 60 * 60 * 24 + case "h": + dur *= 1000 * 60 * 60 + case "m": + dur *= 1000 * 60 + case "s": + dur *= 1000 + case "ms": + // Value already correct + default: + return 0, fmt.Errorf("invalid time unit in duration string: %q", unit) + } + return Duration(dur), nil +} + +func (d Duration) String() string { + var ( + ms = int64(time.Duration(d) / time.Millisecond) + unit = "ms" + ) + if ms == 0 { + return "0s" + } + factors := map[string]int64{ + "y": 1000 * 60 * 60 * 24 * 365, + "w": 1000 * 60 * 60 * 24 * 7, + "d": 1000 * 60 * 60 * 24, + "h": 1000 * 60 * 60, + "m": 1000 * 60, + "s": 1000, + "ms": 1, + } + + switch int64(0) { + case ms % factors["y"]: + unit = "y" + case ms % factors["w"]: + unit = "w" + case ms % factors["d"]: + unit = "d" + case ms % factors["h"]: + unit = "h" + case ms % factors["m"]: + unit = "m" + case ms % factors["s"]: + unit = "s" + } + return fmt.Sprintf("%v%v", ms/factors[unit], unit) +} + +// MarshalYAML implements the yaml.Marshaler interface. +func (d Duration) MarshalYAML() (interface{}, error) { + return d.String(), nil +} + +// UnmarshalYAML implements the yaml.Unmarshaler interface. +func (d *Duration) UnmarshalYAML(unmarshal func(interface{}) error) error { + var s string + if err := unmarshal(&s); err != nil { + return err + } + dur, err := ParseDuration(s) + if err != nil { + return err + } + *d = dur + return nil +} diff --git a/api/vendor/github.com/prometheus/common/model/time_test.go b/api/vendor/github.com/prometheus/common/model/time_test.go new file mode 100644 index 0000000..3efdd65 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/model/time_test.go @@ -0,0 +1,132 @@ +// Copyright 2013 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 model + +import ( + "testing" + "time" +) + +func TestComparators(t *testing.T) { + t1a := TimeFromUnix(0) + t1b := TimeFromUnix(0) + t2 := TimeFromUnix(2*second - 1) + + if !t1a.Equal(t1b) { + t.Fatalf("Expected %s to be equal to %s", t1a, t1b) + } + if t1a.Equal(t2) { + t.Fatalf("Expected %s to not be equal to %s", t1a, t2) + } + + if !t1a.Before(t2) { + t.Fatalf("Expected %s to be before %s", t1a, t2) + } + if t1a.Before(t1b) { + t.Fatalf("Expected %s to not be before %s", t1a, t1b) + } + + if !t2.After(t1a) { + t.Fatalf("Expected %s to be after %s", t2, t1a) + } + if t1b.After(t1a) { + t.Fatalf("Expected %s to not be after %s", t1b, t1a) + } +} + +func TestTimeConversions(t *testing.T) { + unixSecs := int64(1136239445) + unixNsecs := int64(123456789) + unixNano := unixSecs*1e9 + unixNsecs + + t1 := time.Unix(unixSecs, unixNsecs-unixNsecs%nanosPerTick) + t2 := time.Unix(unixSecs, unixNsecs) + + ts := TimeFromUnixNano(unixNano) + if !ts.Time().Equal(t1) { + t.Fatalf("Expected %s, got %s", t1, ts.Time()) + } + + // Test available precision. + ts = TimeFromUnixNano(t2.UnixNano()) + if !ts.Time().Equal(t1) { + t.Fatalf("Expected %s, got %s", t1, ts.Time()) + } + + if ts.UnixNano() != unixNano-unixNano%nanosPerTick { + t.Fatalf("Expected %d, got %d", unixNano, ts.UnixNano()) + } +} + +func TestDuration(t *testing.T) { + duration := time.Second + time.Minute + time.Hour + goTime := time.Unix(1136239445, 0) + + ts := TimeFromUnix(goTime.Unix()) + if !goTime.Add(duration).Equal(ts.Add(duration).Time()) { + t.Fatalf("Expected %s to be equal to %s", goTime.Add(duration), ts.Add(duration)) + } + + earlier := ts.Add(-duration) + delta := ts.Sub(earlier) + if delta != duration { + t.Fatalf("Expected %s to be equal to %s", delta, duration) + } +} + +func TestParseDuration(t *testing.T) { + var cases = []struct { + in string + out time.Duration + }{ + { + in: "0s", + out: 0, + }, { + in: "324ms", + out: 324 * time.Millisecond, + }, { + in: "3s", + out: 3 * time.Second, + }, { + in: "5m", + out: 5 * time.Minute, + }, { + in: "1h", + out: time.Hour, + }, { + in: "4d", + out: 4 * 24 * time.Hour, + }, { + in: "3w", + out: 3 * 7 * 24 * time.Hour, + }, { + in: "10y", + out: 10 * 365 * 24 * time.Hour, + }, + } + + for _, c := range cases { + d, err := ParseDuration(c.in) + if err != nil { + t.Errorf("Unexpected error on input %q", c.in) + } + if time.Duration(d) != c.out { + t.Errorf("Expected %v but got %v", c.out, d) + } + if d.String() != c.in { + t.Errorf("Expected duration string %q but got %q", c.in, d.String()) + } + } +} diff --git a/api/vendor/github.com/prometheus/common/model/value.go b/api/vendor/github.com/prometheus/common/model/value.go new file mode 100644 index 0000000..c9d8fb1 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/model/value.go @@ -0,0 +1,416 @@ +// Copyright 2013 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 model + +import ( + "encoding/json" + "fmt" + "math" + "sort" + "strconv" + "strings" +) + +var ( + // ZeroSamplePair is the pseudo zero-value of SamplePair used to signal a + // non-existing sample pair. It is a SamplePair with timestamp Earliest and + // value 0.0. Note that the natural zero value of SamplePair has a timestamp + // of 0, which is possible to appear in a real SamplePair and thus not + // suitable to signal a non-existing SamplePair. + ZeroSamplePair = SamplePair{Timestamp: Earliest} + + // ZeroSample is the pseudo zero-value of Sample used to signal a + // non-existing sample. It is a Sample with timestamp Earliest, value 0.0, + // and metric nil. Note that the natural zero value of Sample has a timestamp + // of 0, which is possible to appear in a real Sample and thus not suitable + // to signal a non-existing Sample. + ZeroSample = Sample{Timestamp: Earliest} +) + +// A SampleValue is a representation of a value for a given sample at a given +// time. +type SampleValue float64 + +// MarshalJSON implements json.Marshaler. +func (v SampleValue) MarshalJSON() ([]byte, error) { + return json.Marshal(v.String()) +} + +// UnmarshalJSON implements json.Unmarshaler. +func (v *SampleValue) UnmarshalJSON(b []byte) error { + if len(b) < 2 || b[0] != '"' || b[len(b)-1] != '"' { + return fmt.Errorf("sample value must be a quoted string") + } + f, err := strconv.ParseFloat(string(b[1:len(b)-1]), 64) + if err != nil { + return err + } + *v = SampleValue(f) + return nil +} + +// Equal returns true if the value of v and o is equal or if both are NaN. Note +// that v==o is false if both are NaN. If you want the conventional float +// behavior, use == to compare two SampleValues. +func (v SampleValue) Equal(o SampleValue) bool { + if v == o { + return true + } + return math.IsNaN(float64(v)) && math.IsNaN(float64(o)) +} + +func (v SampleValue) String() string { + return strconv.FormatFloat(float64(v), 'f', -1, 64) +} + +// SamplePair pairs a SampleValue with a Timestamp. +type SamplePair struct { + Timestamp Time + Value SampleValue +} + +// MarshalJSON implements json.Marshaler. +func (s SamplePair) MarshalJSON() ([]byte, error) { + t, err := json.Marshal(s.Timestamp) + if err != nil { + return nil, err + } + v, err := json.Marshal(s.Value) + if err != nil { + return nil, err + } + return []byte(fmt.Sprintf("[%s,%s]", t, v)), nil +} + +// UnmarshalJSON implements json.Unmarshaler. +func (s *SamplePair) UnmarshalJSON(b []byte) error { + v := [...]json.Unmarshaler{&s.Timestamp, &s.Value} + return json.Unmarshal(b, &v) +} + +// Equal returns true if this SamplePair and o have equal Values and equal +// Timestamps. The semantics of Value equality is defined by SampleValue.Equal. +func (s *SamplePair) Equal(o *SamplePair) bool { + return s == o || (s.Value.Equal(o.Value) && s.Timestamp.Equal(o.Timestamp)) +} + +func (s SamplePair) String() string { + return fmt.Sprintf("%s @[%s]", s.Value, s.Timestamp) +} + +// Sample is a sample pair associated with a metric. +type Sample struct { + Metric Metric `json:"metric"` + Value SampleValue `json:"value"` + Timestamp Time `json:"timestamp"` +} + +// Equal compares first the metrics, then the timestamp, then the value. The +// semantics of value equality is defined by SampleValue.Equal. +func (s *Sample) Equal(o *Sample) bool { + if s == o { + return true + } + + if !s.Metric.Equal(o.Metric) { + return false + } + if !s.Timestamp.Equal(o.Timestamp) { + return false + } + + return s.Value.Equal(o.Value) +} + +func (s Sample) String() string { + return fmt.Sprintf("%s => %s", s.Metric, SamplePair{ + Timestamp: s.Timestamp, + Value: s.Value, + }) +} + +// MarshalJSON implements json.Marshaler. +func (s Sample) MarshalJSON() ([]byte, error) { + v := struct { + Metric Metric `json:"metric"` + Value SamplePair `json:"value"` + }{ + Metric: s.Metric, + Value: SamplePair{ + Timestamp: s.Timestamp, + Value: s.Value, + }, + } + + return json.Marshal(&v) +} + +// UnmarshalJSON implements json.Unmarshaler. +func (s *Sample) UnmarshalJSON(b []byte) error { + v := struct { + Metric Metric `json:"metric"` + Value SamplePair `json:"value"` + }{ + Metric: s.Metric, + Value: SamplePair{ + Timestamp: s.Timestamp, + Value: s.Value, + }, + } + + if err := json.Unmarshal(b, &v); err != nil { + return err + } + + s.Metric = v.Metric + s.Timestamp = v.Value.Timestamp + s.Value = v.Value.Value + + return nil +} + +// Samples is a sortable Sample slice. It implements sort.Interface. +type Samples []*Sample + +func (s Samples) Len() int { + return len(s) +} + +// Less compares first the metrics, then the timestamp. +func (s Samples) Less(i, j int) bool { + switch { + case s[i].Metric.Before(s[j].Metric): + return true + case s[j].Metric.Before(s[i].Metric): + return false + case s[i].Timestamp.Before(s[j].Timestamp): + return true + default: + return false + } +} + +func (s Samples) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +// Equal compares two sets of samples and returns true if they are equal. +func (s Samples) Equal(o Samples) bool { + if len(s) != len(o) { + return false + } + + for i, sample := range s { + if !sample.Equal(o[i]) { + return false + } + } + return true +} + +// SampleStream is a stream of Values belonging to an attached COWMetric. +type SampleStream struct { + Metric Metric `json:"metric"` + Values []SamplePair `json:"values"` +} + +func (ss SampleStream) String() string { + vals := make([]string, len(ss.Values)) + for i, v := range ss.Values { + vals[i] = v.String() + } + return fmt.Sprintf("%s =>\n%s", ss.Metric, strings.Join(vals, "\n")) +} + +// Value is a generic interface for values resulting from a query evaluation. +type Value interface { + Type() ValueType + String() string +} + +func (Matrix) Type() ValueType { return ValMatrix } +func (Vector) Type() ValueType { return ValVector } +func (*Scalar) Type() ValueType { return ValScalar } +func (*String) Type() ValueType { return ValString } + +type ValueType int + +const ( + ValNone ValueType = iota + ValScalar + ValVector + ValMatrix + ValString +) + +// MarshalJSON implements json.Marshaler. +func (et ValueType) MarshalJSON() ([]byte, error) { + return json.Marshal(et.String()) +} + +func (et *ValueType) UnmarshalJSON(b []byte) error { + var s string + if err := json.Unmarshal(b, &s); err != nil { + return err + } + switch s { + case "": + *et = ValNone + case "scalar": + *et = ValScalar + case "vector": + *et = ValVector + case "matrix": + *et = ValMatrix + case "string": + *et = ValString + default: + return fmt.Errorf("unknown value type %q", s) + } + return nil +} + +func (e ValueType) String() string { + switch e { + case ValNone: + return "" + case ValScalar: + return "scalar" + case ValVector: + return "vector" + case ValMatrix: + return "matrix" + case ValString: + return "string" + } + panic("ValueType.String: unhandled value type") +} + +// Scalar is a scalar value evaluated at the set timestamp. +type Scalar struct { + Value SampleValue `json:"value"` + Timestamp Time `json:"timestamp"` +} + +func (s Scalar) String() string { + return fmt.Sprintf("scalar: %v @[%v]", s.Value, s.Timestamp) +} + +// MarshalJSON implements json.Marshaler. +func (s Scalar) MarshalJSON() ([]byte, error) { + v := strconv.FormatFloat(float64(s.Value), 'f', -1, 64) + return json.Marshal([...]interface{}{s.Timestamp, string(v)}) +} + +// UnmarshalJSON implements json.Unmarshaler. +func (s *Scalar) UnmarshalJSON(b []byte) error { + var f string + v := [...]interface{}{&s.Timestamp, &f} + + if err := json.Unmarshal(b, &v); err != nil { + return err + } + + value, err := strconv.ParseFloat(f, 64) + if err != nil { + return fmt.Errorf("error parsing sample value: %s", err) + } + s.Value = SampleValue(value) + return nil +} + +// String is a string value evaluated at the set timestamp. +type String struct { + Value string `json:"value"` + Timestamp Time `json:"timestamp"` +} + +func (s *String) String() string { + return s.Value +} + +// MarshalJSON implements json.Marshaler. +func (s String) MarshalJSON() ([]byte, error) { + return json.Marshal([]interface{}{s.Timestamp, s.Value}) +} + +// UnmarshalJSON implements json.Unmarshaler. +func (s *String) UnmarshalJSON(b []byte) error { + v := [...]interface{}{&s.Timestamp, &s.Value} + return json.Unmarshal(b, &v) +} + +// Vector is basically only an alias for Samples, but the +// contract is that in a Vector, all Samples have the same timestamp. +type Vector []*Sample + +func (vec Vector) String() string { + entries := make([]string, len(vec)) + for i, s := range vec { + entries[i] = s.String() + } + return strings.Join(entries, "\n") +} + +func (vec Vector) Len() int { return len(vec) } +func (vec Vector) Swap(i, j int) { vec[i], vec[j] = vec[j], vec[i] } + +// Less compares first the metrics, then the timestamp. +func (vec Vector) Less(i, j int) bool { + switch { + case vec[i].Metric.Before(vec[j].Metric): + return true + case vec[j].Metric.Before(vec[i].Metric): + return false + case vec[i].Timestamp.Before(vec[j].Timestamp): + return true + default: + return false + } +} + +// Equal compares two sets of samples and returns true if they are equal. +func (vec Vector) Equal(o Vector) bool { + if len(vec) != len(o) { + return false + } + + for i, sample := range vec { + if !sample.Equal(o[i]) { + return false + } + } + return true +} + +// Matrix is a list of time series. +type Matrix []*SampleStream + +func (m Matrix) Len() int { return len(m) } +func (m Matrix) Less(i, j int) bool { return m[i].Metric.Before(m[j].Metric) } +func (m Matrix) Swap(i, j int) { m[i], m[j] = m[j], m[i] } + +func (mat Matrix) String() string { + matCp := make(Matrix, len(mat)) + copy(matCp, mat) + sort.Sort(matCp) + + strs := make([]string, len(matCp)) + + for i, ss := range matCp { + strs[i] = ss.String() + } + + return strings.Join(strs, "\n") +} diff --git a/api/vendor/github.com/prometheus/common/model/value_test.go b/api/vendor/github.com/prometheus/common/model/value_test.go new file mode 100644 index 0000000..b97dcf8 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/model/value_test.go @@ -0,0 +1,468 @@ +// Copyright 2013 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 model + +import ( + "encoding/json" + "math" + "reflect" + "sort" + "testing" +) + +func TestEqualValues(t *testing.T) { + tests := map[string]struct { + in1, in2 SampleValue + want bool + }{ + "equal floats": { + in1: 3.14, + in2: 3.14, + want: true, + }, + "unequal floats": { + in1: 3.14, + in2: 3.1415, + want: false, + }, + "positive inifinities": { + in1: SampleValue(math.Inf(+1)), + in2: SampleValue(math.Inf(+1)), + want: true, + }, + "negative inifinities": { + in1: SampleValue(math.Inf(-1)), + in2: SampleValue(math.Inf(-1)), + want: true, + }, + "different inifinities": { + in1: SampleValue(math.Inf(+1)), + in2: SampleValue(math.Inf(-1)), + want: false, + }, + "number and infinity": { + in1: 42, + in2: SampleValue(math.Inf(+1)), + want: false, + }, + "number and NaN": { + in1: 42, + in2: SampleValue(math.NaN()), + want: false, + }, + "NaNs": { + in1: SampleValue(math.NaN()), + in2: SampleValue(math.NaN()), + want: true, // !!! + }, + } + + for name, test := range tests { + got := test.in1.Equal(test.in2) + if got != test.want { + t.Errorf("Comparing %s, %f and %f: got %t, want %t", name, test.in1, test.in2, got, test.want) + } + } +} + +func TestEqualSamples(t *testing.T) { + testSample := &Sample{} + + tests := map[string]struct { + in1, in2 *Sample + want bool + }{ + "equal pointers": { + in1: testSample, + in2: testSample, + want: true, + }, + "different metrics": { + in1: &Sample{Metric: Metric{"foo": "bar"}}, + in2: &Sample{Metric: Metric{"foo": "biz"}}, + want: false, + }, + "different timestamp": { + in1: &Sample{Timestamp: 0}, + in2: &Sample{Timestamp: 1}, + want: false, + }, + "different value": { + in1: &Sample{Value: 0}, + in2: &Sample{Value: 1}, + want: false, + }, + "equal samples": { + in1: &Sample{ + Metric: Metric{"foo": "bar"}, + Timestamp: 0, + Value: 1, + }, + in2: &Sample{ + Metric: Metric{"foo": "bar"}, + Timestamp: 0, + Value: 1, + }, + want: true, + }, + } + + for name, test := range tests { + got := test.in1.Equal(test.in2) + if got != test.want { + t.Errorf("Comparing %s, %v and %v: got %t, want %t", name, test.in1, test.in2, got, test.want) + } + } + +} + +func TestSamplePairJSON(t *testing.T) { + input := []struct { + plain string + value SamplePair + }{ + { + plain: `[1234.567,"123.1"]`, + value: SamplePair{ + Value: 123.1, + Timestamp: 1234567, + }, + }, + } + + for _, test := range input { + b, err := json.Marshal(test.value) + if err != nil { + t.Error(err) + continue + } + + if string(b) != test.plain { + t.Errorf("encoding error: expected %q, got %q", test.plain, b) + continue + } + + var sp SamplePair + err = json.Unmarshal(b, &sp) + if err != nil { + t.Error(err) + continue + } + + if sp != test.value { + t.Errorf("decoding error: expected %v, got %v", test.value, sp) + } + } +} + +func TestSampleJSON(t *testing.T) { + input := []struct { + plain string + value Sample + }{ + { + plain: `{"metric":{"__name__":"test_metric"},"value":[1234.567,"123.1"]}`, + value: Sample{ + Metric: Metric{ + MetricNameLabel: "test_metric", + }, + Value: 123.1, + Timestamp: 1234567, + }, + }, + } + + for _, test := range input { + b, err := json.Marshal(test.value) + if err != nil { + t.Error(err) + continue + } + + if string(b) != test.plain { + t.Errorf("encoding error: expected %q, got %q", test.plain, b) + continue + } + + var sv Sample + err = json.Unmarshal(b, &sv) + if err != nil { + t.Error(err) + continue + } + + if !reflect.DeepEqual(sv, test.value) { + t.Errorf("decoding error: expected %v, got %v", test.value, sv) + } + } +} + +func TestVectorJSON(t *testing.T) { + input := []struct { + plain string + value Vector + }{ + { + plain: `[]`, + value: Vector{}, + }, + { + plain: `[{"metric":{"__name__":"test_metric"},"value":[1234.567,"123.1"]}]`, + value: Vector{&Sample{ + Metric: Metric{ + MetricNameLabel: "test_metric", + }, + Value: 123.1, + Timestamp: 1234567, + }}, + }, + { + plain: `[{"metric":{"__name__":"test_metric"},"value":[1234.567,"123.1"]},{"metric":{"foo":"bar"},"value":[1.234,"+Inf"]}]`, + value: Vector{ + &Sample{ + Metric: Metric{ + MetricNameLabel: "test_metric", + }, + Value: 123.1, + Timestamp: 1234567, + }, + &Sample{ + Metric: Metric{ + "foo": "bar", + }, + Value: SampleValue(math.Inf(1)), + Timestamp: 1234, + }, + }, + }, + } + + for _, test := range input { + b, err := json.Marshal(test.value) + if err != nil { + t.Error(err) + continue + } + + if string(b) != test.plain { + t.Errorf("encoding error: expected %q, got %q", test.plain, b) + continue + } + + var vec Vector + err = json.Unmarshal(b, &vec) + if err != nil { + t.Error(err) + continue + } + + if !reflect.DeepEqual(vec, test.value) { + t.Errorf("decoding error: expected %v, got %v", test.value, vec) + } + } +} + +func TestScalarJSON(t *testing.T) { + input := []struct { + plain string + value Scalar + }{ + { + plain: `[123.456,"456"]`, + value: Scalar{ + Timestamp: 123456, + Value: 456, + }, + }, + { + plain: `[123123.456,"+Inf"]`, + value: Scalar{ + Timestamp: 123123456, + Value: SampleValue(math.Inf(1)), + }, + }, + { + plain: `[123123.456,"-Inf"]`, + value: Scalar{ + Timestamp: 123123456, + Value: SampleValue(math.Inf(-1)), + }, + }, + } + + for _, test := range input { + b, err := json.Marshal(test.value) + if err != nil { + t.Error(err) + continue + } + + if string(b) != test.plain { + t.Errorf("encoding error: expected %q, got %q", test.plain, b) + continue + } + + var sv Scalar + err = json.Unmarshal(b, &sv) + if err != nil { + t.Error(err) + continue + } + + if sv != test.value { + t.Errorf("decoding error: expected %v, got %v", test.value, sv) + } + } +} + +func TestStringJSON(t *testing.T) { + input := []struct { + plain string + value String + }{ + { + plain: `[123.456,"test"]`, + value: String{ + Timestamp: 123456, + Value: "test", + }, + }, + { + plain: `[123123.456,"台北"]`, + value: String{ + Timestamp: 123123456, + Value: "台北", + }, + }, + } + + for _, test := range input { + b, err := json.Marshal(test.value) + if err != nil { + t.Error(err) + continue + } + + if string(b) != test.plain { + t.Errorf("encoding error: expected %q, got %q", test.plain, b) + continue + } + + var sv String + err = json.Unmarshal(b, &sv) + if err != nil { + t.Error(err) + continue + } + + if sv != test.value { + t.Errorf("decoding error: expected %v, got %v", test.value, sv) + } + } +} + +func TestVectorSort(t *testing.T) { + input := Vector{ + &Sample{ + Metric: Metric{ + MetricNameLabel: "A", + }, + Timestamp: 1, + }, + &Sample{ + Metric: Metric{ + MetricNameLabel: "A", + }, + Timestamp: 2, + }, + &Sample{ + Metric: Metric{ + MetricNameLabel: "C", + }, + Timestamp: 1, + }, + &Sample{ + Metric: Metric{ + MetricNameLabel: "C", + }, + Timestamp: 2, + }, + &Sample{ + Metric: Metric{ + MetricNameLabel: "B", + }, + Timestamp: 1, + }, + &Sample{ + Metric: Metric{ + MetricNameLabel: "B", + }, + Timestamp: 2, + }, + } + + expected := Vector{ + &Sample{ + Metric: Metric{ + MetricNameLabel: "A", + }, + Timestamp: 1, + }, + &Sample{ + Metric: Metric{ + MetricNameLabel: "A", + }, + Timestamp: 2, + }, + &Sample{ + Metric: Metric{ + MetricNameLabel: "B", + }, + Timestamp: 1, + }, + &Sample{ + Metric: Metric{ + MetricNameLabel: "B", + }, + Timestamp: 2, + }, + &Sample{ + Metric: Metric{ + MetricNameLabel: "C", + }, + Timestamp: 1, + }, + &Sample{ + Metric: Metric{ + MetricNameLabel: "C", + }, + Timestamp: 2, + }, + } + + sort.Sort(input) + + for i, actual := range input { + actualFp := actual.Metric.Fingerprint() + expectedFp := expected[i].Metric.Fingerprint() + + if actualFp != expectedFp { + t.Fatalf("%d. Incorrect fingerprint. Got %s; want %s", i, actualFp.String(), expectedFp.String()) + } + + if actual.Timestamp != expected[i].Timestamp { + t.Fatalf("%d. Incorrect timestamp. Got %s; want %s", i, actual.Timestamp, expected[i].Timestamp) + } + } +} diff --git a/api/vendor/github.com/prometheus/common/promlog/flag/flag.go b/api/vendor/github.com/prometheus/common/promlog/flag/flag.go new file mode 100644 index 0000000..b9d361e --- /dev/null +++ b/api/vendor/github.com/prometheus/common/promlog/flag/flag.go @@ -0,0 +1,33 @@ +// Copyright 2017 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 flag + +import ( + "github.com/prometheus/common/promlog" + kingpin "gopkg.in/alecthomas/kingpin.v2" +) + +// LevelFlagName is the canonical flag name to configure the allowed log level +// within Prometheus projects. +const LevelFlagName = "log.level" + +// LevelFlagHelp is the help description for the log.level flag. +const LevelFlagHelp = "Only log messages with the given severity or above. One of: [debug, info, warn, error]" + +// AddFlags adds the flags used by this package to the Kingpin application. +// To use the default Kingpin application, call AddFlags(kingpin.CommandLine) +func AddFlags(a *kingpin.Application, logLevel *promlog.AllowedLevel) { + a.Flag(LevelFlagName, LevelFlagHelp). + Default("info").SetValue(logLevel) +} diff --git a/api/vendor/github.com/prometheus/common/promlog/log.go b/api/vendor/github.com/prometheus/common/promlog/log.go new file mode 100644 index 0000000..cf8307a --- /dev/null +++ b/api/vendor/github.com/prometheus/common/promlog/log.go @@ -0,0 +1,63 @@ +// Copyright 2017 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 promlog defines standardised ways to initialize Go kit loggers +// across Prometheus components. +// It should typically only ever be imported by main packages. +package promlog + +import ( + "os" + + "github.com/go-kit/kit/log" + "github.com/go-kit/kit/log/level" + "github.com/pkg/errors" +) + +// AllowedLevel is a settable identifier for the minimum level a log entry +// must be have. +type AllowedLevel struct { + s string + o level.Option +} + +func (l *AllowedLevel) String() string { + return l.s +} + +// Set updates the value of the allowed level. +func (l *AllowedLevel) Set(s string) error { + switch s { + case "debug": + l.o = level.AllowDebug() + case "info": + l.o = level.AllowInfo() + case "warn": + l.o = level.AllowWarn() + case "error": + l.o = level.AllowError() + default: + return errors.Errorf("unrecognized log level %q", s) + } + l.s = s + return nil +} + +// New returns a new leveled oklog logger in the logfmt format. Each logged line will be annotated +// with a timestamp. The output always goes to stderr. +func New(al AllowedLevel) log.Logger { + l := log.NewLogfmtLogger(log.NewSyncWriter(os.Stderr)) + l = level.NewFilter(l, al.o) + l = log.With(l, "ts", log.DefaultTimestampUTC, "caller", log.DefaultCaller) + return l +} diff --git a/api/vendor/github.com/prometheus/common/route/route.go b/api/vendor/github.com/prometheus/common/route/route.go new file mode 100644 index 0000000..742e575 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/route/route.go @@ -0,0 +1,110 @@ +package route + +import ( + "net/http" + + "github.com/julienschmidt/httprouter" + "golang.org/x/net/context" +) + +type param string + +// Param returns param p for the context. +func Param(ctx context.Context, p string) string { + return ctx.Value(param(p)).(string) +} + +// WithParam returns a new context with param p set to v. +func WithParam(ctx context.Context, p, v string) context.Context { + return context.WithValue(ctx, param(p), v) +} + +// Router wraps httprouter.Router and adds support for prefixed sub-routers, +// per-request context injections and instrumentation. +type Router struct { + rtr *httprouter.Router + prefix string + instrh func(handlerName string, handler http.HandlerFunc) http.HandlerFunc +} + +// New returns a new Router. +func New() *Router { + return &Router{ + rtr: httprouter.New(), + } +} + +// WithInstrumentation returns a router with instrumentation support. +func (r *Router) WithInstrumentation(instrh func(handlerName string, handler http.HandlerFunc) http.HandlerFunc) *Router { + return &Router{rtr: r.rtr, prefix: r.prefix, instrh: instrh} +} + +// WithPrefix returns a router that prefixes all registered routes with prefix. +func (r *Router) WithPrefix(prefix string) *Router { + return &Router{rtr: r.rtr, prefix: r.prefix + prefix, instrh: r.instrh} +} + +// handle turns a HandlerFunc into an httprouter.Handle. +func (r *Router) handle(handlerName string, h http.HandlerFunc) httprouter.Handle { + if r.instrh != nil { + // This needs to be outside the closure to avoid data race when reading and writing to 'h'. + h = r.instrh(handlerName, h) + } + return func(w http.ResponseWriter, req *http.Request, params httprouter.Params) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + + for _, p := range params { + ctx = context.WithValue(ctx, param(p.Key), p.Value) + } + h(w, req.WithContext(ctx)) + } +} + +// Get registers a new GET route. +func (r *Router) Get(path string, h http.HandlerFunc) { + r.rtr.GET(r.prefix+path, r.handle(path, h)) +} + +// Options registers a new OPTIONS route. +func (r *Router) Options(path string, h http.HandlerFunc) { + r.rtr.OPTIONS(r.prefix+path, r.handle(path, h)) +} + +// Del registers a new DELETE route. +func (r *Router) Del(path string, h http.HandlerFunc) { + r.rtr.DELETE(r.prefix+path, r.handle(path, h)) +} + +// Put registers a new PUT route. +func (r *Router) Put(path string, h http.HandlerFunc) { + r.rtr.PUT(r.prefix+path, r.handle(path, h)) +} + +// Post registers a new POST route. +func (r *Router) Post(path string, h http.HandlerFunc) { + r.rtr.POST(r.prefix+path, r.handle(path, h)) +} + +// Redirect takes an absolute path and sends an internal HTTP redirect for it, +// prefixed by the router's path prefix. Note that this method does not include +// functionality for handling relative paths or full URL redirects. +func (r *Router) Redirect(w http.ResponseWriter, req *http.Request, path string, code int) { + http.Redirect(w, req, r.prefix+path, code) +} + +// ServeHTTP implements http.Handler. +func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request) { + r.rtr.ServeHTTP(w, req) +} + +// FileServe returns a new http.HandlerFunc that serves files from dir. +// Using routes must provide the *filepath parameter. +func FileServe(dir string) http.HandlerFunc { + fs := http.FileServer(http.Dir(dir)) + + return func(w http.ResponseWriter, r *http.Request) { + r.URL.Path = Param(r.Context(), "filepath") + fs.ServeHTTP(w, r) + } +} diff --git a/api/vendor/github.com/prometheus/common/route/route_test.go b/api/vendor/github.com/prometheus/common/route/route_test.go new file mode 100644 index 0000000..d491cad --- /dev/null +++ b/api/vendor/github.com/prometheus/common/route/route_test.go @@ -0,0 +1,76 @@ +package route + +import ( + "net/http" + "net/http/httptest" + "testing" +) + +func TestRedirect(t *testing.T) { + router := New().WithPrefix("/test/prefix") + w := httptest.NewRecorder() + r, err := http.NewRequest("GET", "http://localhost:9090/foo", nil) + if err != nil { + t.Fatalf("Error building test request: %s", err) + } + + router.Redirect(w, r, "/some/endpoint", http.StatusFound) + if w.Code != http.StatusFound { + t.Fatalf("Unexpected redirect status code: got %d, want %d", w.Code, http.StatusFound) + } + + want := "/test/prefix/some/endpoint" + got := w.Header()["Location"][0] + if want != got { + t.Fatalf("Unexpected redirect location: got %s, want %s", got, want) + } +} + +func TestContext(t *testing.T) { + router := New() + router.Get("/test/:foo/", func(w http.ResponseWriter, r *http.Request) { + want := "bar" + got := Param(r.Context(), "foo") + if want != got { + t.Fatalf("Unexpected context value: want %q, got %q", want, got) + } + }) + + r, err := http.NewRequest("GET", "http://localhost:9090/test/bar/", nil) + if err != nil { + t.Fatalf("Error building test request: %s", err) + } + router.ServeHTTP(nil, r) +} + +func TestInstrumentation(t *testing.T) { + var got string + cases := []struct { + router *Router + want string + }{ + { + router: New(), + want: "", + }, { + router: New().WithInstrumentation(func(handlerName string, handler http.HandlerFunc) http.HandlerFunc { + got = handlerName + return handler + }), + want: "/foo", + }, + } + + for _, c := range cases { + c.router.Get("/foo", func(w http.ResponseWriter, r *http.Request) {}) + + r, err := http.NewRequest("GET", "http://localhost:9090/foo", nil) + if err != nil { + t.Fatalf("Error building test request: %s", err) + } + c.router.ServeHTTP(nil, r) + if c.want != got { + t.Fatalf("Unexpected value: want %q, got %q", c.want, got) + } + } +} diff --git a/api/vendor/github.com/prometheus/common/version/info.go b/api/vendor/github.com/prometheus/common/version/info.go new file mode 100644 index 0000000..84489a5 --- /dev/null +++ b/api/vendor/github.com/prometheus/common/version/info.go @@ -0,0 +1,89 @@ +// Copyright 2016 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 version + +import ( + "bytes" + "fmt" + "runtime" + "strings" + "text/template" + + "github.com/prometheus/client_golang/prometheus" +) + +// Build information. Populated at build-time. +var ( + Version string + Revision string + Branch string + BuildUser string + BuildDate string + GoVersion = runtime.Version() +) + +// NewCollector returns a collector which exports metrics about current version information. +func NewCollector(program string) *prometheus.GaugeVec { + buildInfo := prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Namespace: program, + Name: "build_info", + Help: fmt.Sprintf( + "A metric with a constant '1' value labeled by version, revision, branch, and goversion from which %s was built.", + program, + ), + }, + []string{"version", "revision", "branch", "goversion"}, + ) + buildInfo.WithLabelValues(Version, Revision, Branch, GoVersion).Set(1) + return buildInfo +} + +// versionInfoTmpl contains the template used by Info. +var versionInfoTmpl = ` +{{.program}}, version {{.version}} (branch: {{.branch}}, revision: {{.revision}}) + build user: {{.buildUser}} + build date: {{.buildDate}} + go version: {{.goVersion}} +` + +// Print returns version information. +func Print(program string) string { + m := map[string]string{ + "program": program, + "version": Version, + "revision": Revision, + "branch": Branch, + "buildUser": BuildUser, + "buildDate": BuildDate, + "goVersion": GoVersion, + } + t := template.Must(template.New("version").Parse(versionInfoTmpl)) + + var buf bytes.Buffer + if err := t.ExecuteTemplate(&buf, "version", m); err != nil { + panic(err) + } + return strings.TrimSpace(buf.String()) +} + +// Info returns version, branch and revision information. +func Info() string { + return fmt.Sprintf("(version=%s, branch=%s, revision=%s)", Version, Branch, Revision) +} + +// BuildContext returns goVersion, buildUser and buildDate information. +func BuildContext() string { + return fmt.Sprintf("(go=%s, user=%s, date=%s)", GoVersion, BuildUser, BuildDate) +} diff --git a/api/vendor/github.com/prometheus/procfs/.gitignore b/api/vendor/github.com/prometheus/procfs/.gitignore new file mode 100644 index 0000000..25e3659 --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/.gitignore @@ -0,0 +1 @@ +/fixtures/ diff --git a/api/vendor/github.com/prometheus/procfs/.travis.yml b/api/vendor/github.com/prometheus/procfs/.travis.yml new file mode 100644 index 0000000..5416cf8 --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/.travis.yml @@ -0,0 +1,15 @@ +sudo: false + +language: go + +go: +- 1.7.x +- 1.8.x +- 1.9.x +- 1.10.x +- 1.x + +go_import_path: github.com/prometheus/procfs + +script: +- make style check_license vet test staticcheck diff --git a/api/vendor/github.com/prometheus/procfs/CONTRIBUTING.md b/api/vendor/github.com/prometheus/procfs/CONTRIBUTING.md new file mode 100644 index 0000000..40503ed --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/CONTRIBUTING.md @@ -0,0 +1,18 @@ +# Contributing + +Prometheus uses GitHub to manage reviews of pull requests. + +* If you have a trivial fix or improvement, go ahead and create a pull request, + addressing (with `@...`) the maintainer of this repository (see + [MAINTAINERS.md](MAINTAINERS.md)) in the description of the pull request. + +* If you plan to do something more involved, first discuss your ideas + on our [mailing list](https://groups.google.com/forum/?fromgroups#!forum/prometheus-developers). + This will avoid unnecessary work and surely give you and us a good deal + of inspiration. + +* Relevant coding style guidelines are the [Go Code Review + Comments](https://code.google.com/p/go-wiki/wiki/CodeReviewComments) + and the _Formatting and style_ section of Peter Bourgon's [Go: Best + Practices for Production + Environments](http://peter.bourgon.org/go-in-production/#formatting-and-style). diff --git a/api/vendor/github.com/prometheus/procfs/LICENSE b/api/vendor/github.com/prometheus/procfs/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/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 [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/api/vendor/github.com/prometheus/procfs/MAINTAINERS.md b/api/vendor/github.com/prometheus/procfs/MAINTAINERS.md new file mode 100644 index 0000000..35993c4 --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/MAINTAINERS.md @@ -0,0 +1 @@ +* Tobias Schmidt diff --git a/api/vendor/github.com/prometheus/procfs/Makefile b/api/vendor/github.com/prometheus/procfs/Makefile new file mode 100644 index 0000000..5c8f726 --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/Makefile @@ -0,0 +1,71 @@ +# Copyright 2018 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. + +# Ensure GOBIN is not set during build so that promu is installed to the correct path +unexport GOBIN + +GO ?= go +GOFMT ?= $(GO)fmt +FIRST_GOPATH := $(firstword $(subst :, ,$(shell $(GO) env GOPATH))) +STATICCHECK := $(FIRST_GOPATH)/bin/staticcheck +pkgs = $(shell $(GO) list ./... | grep -v /vendor/) + +PREFIX ?= $(shell pwd) +BIN_DIR ?= $(shell pwd) + +ifdef DEBUG + bindata_flags = -debug +endif + +STATICCHECK_IGNORE = + +all: format staticcheck build test + +style: + @echo ">> checking code style" + @! $(GOFMT) -d $(shell find . -path ./vendor -prune -o -name '*.go' -print) | grep '^' + +check_license: + @echo ">> checking license header" + @./scripts/check_license.sh + +test: fixtures/.unpacked sysfs/fixtures/.unpacked + @echo ">> running all tests" + @$(GO) test -race $(shell $(GO) list ./... | grep -v /vendor/ | grep -v examples) + +format: + @echo ">> formatting code" + @$(GO) fmt $(pkgs) + +vet: + @echo ">> vetting code" + @$(GO) vet $(pkgs) + +staticcheck: $(STATICCHECK) + @echo ">> running staticcheck" + @$(STATICCHECK) -ignore "$(STATICCHECK_IGNORE)" $(pkgs) + +%/.unpacked: %.ttar + ./ttar -C $(dir $*) -x -f $*.ttar + touch $@ + +$(FIRST_GOPATH)/bin/staticcheck: + @GOOS= GOARCH= $(GO) get -u honnef.co/go/tools/cmd/staticcheck + +.PHONY: all style check_license format test vet staticcheck + +# Declaring the binaries at their default locations as PHONY targets is a hack +# to ensure the latest version is downloaded on every make execution. +# If this is not desired, copy/symlink these binaries to a different path and +# set the respective environment variables. +.PHONY: $(GOPATH)/bin/staticcheck diff --git a/api/vendor/github.com/prometheus/procfs/NOTICE b/api/vendor/github.com/prometheus/procfs/NOTICE new file mode 100644 index 0000000..53c5e9a --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/NOTICE @@ -0,0 +1,7 @@ +procfs provides functions to retrieve system, kernel and process +metrics from the pseudo-filesystem proc. + +Copyright 2014-2015 The Prometheus Authors + +This product includes software developed at +SoundCloud Ltd. (http://soundcloud.com/). diff --git a/api/vendor/github.com/prometheus/procfs/README.md b/api/vendor/github.com/prometheus/procfs/README.md new file mode 100644 index 0000000..2095494 --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/README.md @@ -0,0 +1,11 @@ +# procfs + +This procfs package provides functions to retrieve system, kernel and process +metrics from the pseudo-filesystem proc. + +*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 Report Card](https://goreportcard.com/badge/github.com/prometheus/procfs)](https://goreportcard.com/report/github.com/prometheus/procfs) diff --git a/api/vendor/github.com/prometheus/procfs/bcache/bcache.go b/api/vendor/github.com/prometheus/procfs/bcache/bcache.go new file mode 100644 index 0000000..1db178c --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/bcache/bcache.go @@ -0,0 +1,84 @@ +// Copyright 2017 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 bcache provides access to statistics exposed by the bcache (Linux +// block cache). +package bcache + +// Stats contains bcache runtime statistics, parsed from /sys/fs/bcache/. +// +// The names and meanings of each statistic were taken from bcache.txt and +// files in drivers/md/bcache in the Linux kernel source. Counters are uint64 +// (in-kernel counters are mostly unsigned long). +type Stats struct { + // The name of the bcache used to source these statistics. + Name string + Bcache BcacheStats + Bdevs []BdevStats + Caches []CacheStats +} + +// BcacheStats contains statistics tied to a bcache ID. +type BcacheStats struct { + AverageKeySize uint64 + BtreeCacheSize uint64 + CacheAvailablePercent uint64 + Congested uint64 + RootUsagePercent uint64 + TreeDepth uint64 + Internal InternalStats + FiveMin PeriodStats + Total PeriodStats +} + +// BdevStats contains statistics for one backing device. +type BdevStats struct { + Name string + DirtyData uint64 + FiveMin PeriodStats + Total PeriodStats +} + +// CacheStats contains statistics for one cache device. +type CacheStats struct { + Name string + IOErrors uint64 + MetadataWritten uint64 + Written uint64 + Priority PriorityStats +} + +// PriorityStats contains statistics from the priority_stats file. +type PriorityStats struct { + UnusedPercent uint64 + MetadataPercent uint64 +} + +// InternalStats contains internal bcache statistics. +type InternalStats struct { + ActiveJournalEntries uint64 + BtreeNodes uint64 + BtreeReadAverageDurationNanoSeconds uint64 + CacheReadRaces uint64 +} + +// PeriodStats contains statistics for a time period (5 min or total). +type PeriodStats struct { + Bypassed uint64 + CacheBypassHits uint64 + CacheBypassMisses uint64 + CacheHits uint64 + CacheMissCollisions uint64 + CacheMisses uint64 + CacheReadaheads uint64 +} diff --git a/api/vendor/github.com/prometheus/procfs/bcache/get.go b/api/vendor/github.com/prometheus/procfs/bcache/get.go new file mode 100644 index 0000000..b6d97de --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/bcache/get.go @@ -0,0 +1,330 @@ +// Copyright 2017 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 bcache + +import ( + "bufio" + "fmt" + "io/ioutil" + "os" + "path" + "path/filepath" + "strconv" + "strings" +) + +// ParsePseudoFloat parses the peculiar format produced by bcache's bch_hprint. +func parsePseudoFloat(str string) (float64, error) { + ss := strings.Split(str, ".") + + intPart, err := strconv.ParseFloat(ss[0], 64) + if err != nil { + return 0, err + } + + if len(ss) == 1 { + // Pure integers are fine. + return intPart, nil + } + fracPart, err := strconv.ParseFloat(ss[1], 64) + if err != nil { + return 0, err + } + // fracPart is a number between 0 and 1023 divided by 100; it is off + // by a small amount. Unexpected bumps in time lines may occur because + // for bch_hprint .1 != .10 and .10 > .9 (at least up to Linux + // v4.12-rc3). + + // Restore the proper order: + fracPart = fracPart / 10.24 + return intPart + fracPart, nil +} + +// Dehumanize converts a human-readable byte slice into a uint64. +func dehumanize(hbytes []byte) (uint64, error) { + ll := len(hbytes) + if ll == 0 { + return 0, fmt.Errorf("zero-length reply") + } + lastByte := hbytes[ll-1] + mul := float64(1) + var ( + mant float64 + err error + ) + // If lastByte is beyond the range of ASCII digits, it must be a + // multiplier. + if lastByte > 57 { + // Remove multiplier from slice. + hbytes = hbytes[:len(hbytes)-1] + + const ( + _ = 1 << (10 * iota) + KiB + MiB + GiB + TiB + PiB + EiB + ZiB + YiB + ) + + multipliers := map[rune]float64{ + // Source for conversion rules: + // linux-kernel/drivers/md/bcache/util.c:bch_hprint() + 'k': KiB, + 'M': MiB, + 'G': GiB, + 'T': TiB, + 'P': PiB, + 'E': EiB, + 'Z': ZiB, + 'Y': YiB, + } + mul = multipliers[rune(lastByte)] + mant, err = parsePseudoFloat(string(hbytes)) + if err != nil { + return 0, err + } + } else { + // Not humanized by bch_hprint + mant, err = strconv.ParseFloat(string(hbytes), 64) + if err != nil { + return 0, err + } + } + res := uint64(mant * mul) + return res, nil +} + +type parser struct { + uuidPath string + subDir string + currentDir string + err error +} + +func (p *parser) setSubDir(pathElements ...string) { + p.subDir = path.Join(pathElements...) + p.currentDir = path.Join(p.uuidPath, p.subDir) +} + +func (p *parser) readValue(fileName string) uint64 { + if p.err != nil { + return 0 + } + path := path.Join(p.currentDir, fileName) + byt, err := ioutil.ReadFile(path) + if err != nil { + p.err = fmt.Errorf("failed to read: %s", path) + return 0 + } + // Remove trailing newline. + byt = byt[:len(byt)-1] + res, err := dehumanize(byt) + p.err = err + return res +} + +// ParsePriorityStats parses lines from the priority_stats file. +func parsePriorityStats(line string, ps *PriorityStats) error { + var ( + value uint64 + err error + ) + switch { + case strings.HasPrefix(line, "Unused:"): + fields := strings.Fields(line) + rawValue := fields[len(fields)-1] + valueStr := strings.TrimSuffix(rawValue, "%") + value, err = strconv.ParseUint(valueStr, 10, 64) + if err != nil { + return err + } + ps.UnusedPercent = value + case strings.HasPrefix(line, "Metadata:"): + fields := strings.Fields(line) + rawValue := fields[len(fields)-1] + valueStr := strings.TrimSuffix(rawValue, "%") + value, err = strconv.ParseUint(valueStr, 10, 64) + if err != nil { + return err + } + ps.MetadataPercent = value + } + return nil +} + +func (p *parser) getPriorityStats() PriorityStats { + var res PriorityStats + + if p.err != nil { + return res + } + + path := path.Join(p.currentDir, "priority_stats") + + file, err := os.Open(path) + if err != nil { + p.err = fmt.Errorf("failed to read: %s", path) + return res + } + defer file.Close() + + scanner := bufio.NewScanner(file) + for scanner.Scan() { + err = parsePriorityStats(scanner.Text(), &res) + if err != nil { + p.err = fmt.Errorf("failed to parse: %s (%s)", path, err) + return res + } + } + if err := scanner.Err(); err != nil { + p.err = fmt.Errorf("failed to parse: %s (%s)", path, err) + return res + } + return res +} + +// GetStats collects from sysfs files data tied to one bcache ID. +func GetStats(uuidPath string) (*Stats, error) { + var bs Stats + + par := parser{uuidPath: uuidPath} + + // bcache stats + + // dir + par.setSubDir("") + bs.Bcache.AverageKeySize = par.readValue("average_key_size") + bs.Bcache.BtreeCacheSize = par.readValue("btree_cache_size") + bs.Bcache.CacheAvailablePercent = par.readValue("cache_available_percent") + bs.Bcache.Congested = par.readValue("congested") + bs.Bcache.RootUsagePercent = par.readValue("root_usage_percent") + bs.Bcache.TreeDepth = par.readValue("tree_depth") + + // bcache stats (internal) + + // dir /internal + par.setSubDir("internal") + bs.Bcache.Internal.ActiveJournalEntries = par.readValue("active_journal_entries") + bs.Bcache.Internal.BtreeNodes = par.readValue("btree_nodes") + bs.Bcache.Internal.BtreeReadAverageDurationNanoSeconds = par.readValue("btree_read_average_duration_us") + bs.Bcache.Internal.CacheReadRaces = par.readValue("cache_read_races") + + // bcache stats (period) + + // dir /stats_five_minute + par.setSubDir("stats_five_minute") + bs.Bcache.FiveMin.Bypassed = par.readValue("bypassed") + bs.Bcache.FiveMin.CacheHits = par.readValue("cache_hits") + + bs.Bcache.FiveMin.Bypassed = par.readValue("bypassed") + bs.Bcache.FiveMin.CacheBypassHits = par.readValue("cache_bypass_hits") + bs.Bcache.FiveMin.CacheBypassMisses = par.readValue("cache_bypass_misses") + bs.Bcache.FiveMin.CacheHits = par.readValue("cache_hits") + bs.Bcache.FiveMin.CacheMissCollisions = par.readValue("cache_miss_collisions") + bs.Bcache.FiveMin.CacheMisses = par.readValue("cache_misses") + bs.Bcache.FiveMin.CacheReadaheads = par.readValue("cache_readaheads") + + // dir /stats_total + par.setSubDir("stats_total") + bs.Bcache.Total.Bypassed = par.readValue("bypassed") + bs.Bcache.Total.CacheHits = par.readValue("cache_hits") + + bs.Bcache.Total.Bypassed = par.readValue("bypassed") + bs.Bcache.Total.CacheBypassHits = par.readValue("cache_bypass_hits") + bs.Bcache.Total.CacheBypassMisses = par.readValue("cache_bypass_misses") + bs.Bcache.Total.CacheHits = par.readValue("cache_hits") + bs.Bcache.Total.CacheMissCollisions = par.readValue("cache_miss_collisions") + bs.Bcache.Total.CacheMisses = par.readValue("cache_misses") + bs.Bcache.Total.CacheReadaheads = par.readValue("cache_readaheads") + + if par.err != nil { + return nil, par.err + } + + // bdev stats + + reg := path.Join(uuidPath, "bdev[0-9]*") + bdevDirs, err := filepath.Glob(reg) + if err != nil { + return nil, err + } + + bs.Bdevs = make([]BdevStats, len(bdevDirs)) + + for ii, bdevDir := range bdevDirs { + var bds = &bs.Bdevs[ii] + + bds.Name = filepath.Base(bdevDir) + + par.setSubDir(bds.Name) + bds.DirtyData = par.readValue("dirty_data") + + // dir //stats_five_minute + par.setSubDir(bds.Name, "stats_five_minute") + bds.FiveMin.Bypassed = par.readValue("bypassed") + bds.FiveMin.CacheBypassHits = par.readValue("cache_bypass_hits") + bds.FiveMin.CacheBypassMisses = par.readValue("cache_bypass_misses") + bds.FiveMin.CacheHits = par.readValue("cache_hits") + bds.FiveMin.CacheMissCollisions = par.readValue("cache_miss_collisions") + bds.FiveMin.CacheMisses = par.readValue("cache_misses") + bds.FiveMin.CacheReadaheads = par.readValue("cache_readaheads") + + // dir //stats_total + par.setSubDir("stats_total") + bds.Total.Bypassed = par.readValue("bypassed") + bds.Total.CacheBypassHits = par.readValue("cache_bypass_hits") + bds.Total.CacheBypassMisses = par.readValue("cache_bypass_misses") + bds.Total.CacheHits = par.readValue("cache_hits") + bds.Total.CacheMissCollisions = par.readValue("cache_miss_collisions") + bds.Total.CacheMisses = par.readValue("cache_misses") + bds.Total.CacheReadaheads = par.readValue("cache_readaheads") + } + + if par.err != nil { + return nil, par.err + } + + // cache stats + + reg = path.Join(uuidPath, "cache[0-9]*") + cacheDirs, err := filepath.Glob(reg) + if err != nil { + return nil, err + } + bs.Caches = make([]CacheStats, len(cacheDirs)) + + for ii, cacheDir := range cacheDirs { + var cs = &bs.Caches[ii] + cs.Name = filepath.Base(cacheDir) + + // dir is / + par.setSubDir(cs.Name) + cs.IOErrors = par.readValue("io_errors") + cs.MetadataWritten = par.readValue("metadata_written") + cs.Written = par.readValue("written") + + ps := par.getPriorityStats() + cs.Priority = ps + } + + if par.err != nil { + return nil, par.err + } + + return &bs, nil +} diff --git a/api/vendor/github.com/prometheus/procfs/bcache/get_test.go b/api/vendor/github.com/prometheus/procfs/bcache/get_test.go new file mode 100644 index 0000000..1d41a5a --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/bcache/get_test.go @@ -0,0 +1,114 @@ +// Copyright 2017 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 bcache + +import ( + "math" + "testing" +) + +func TestDehumanizeTests(t *testing.T) { + dehumanizeTests := []struct { + in []byte + out uint64 + invalid bool + }{ + { + in: []byte("542k"), + out: 555008, + }, + { + in: []byte("322M"), + out: 337641472, + }, + { + in: []byte("1.1k"), + out: 1124, + }, + { + in: []byte("1.9k"), + out: 1924, + }, + { + in: []byte("1.10k"), + out: 2024, + }, + { + in: []byte(""), + out: 0, + invalid: true, + }, + } + for _, tst := range dehumanizeTests { + got, err := dehumanize(tst.in) + if tst.invalid && err == nil { + t.Error("expected an error, but none occurred") + } + if !tst.invalid && err != nil { + t.Errorf("unexpected error: %v", err) + } + if got != tst.out { + t.Errorf("dehumanize: '%s', want %d, got %d", tst.in, tst.out, got) + } + } +} + +func TestParsePseudoFloatTests(t *testing.T) { + parsePseudoFloatTests := []struct { + in string + out float64 + }{ + { + in: "1.1", + out: float64(1.097656), + }, + { + in: "1.9", + out: float64(1.878906), + }, + { + in: "1.10", + out: float64(1.976562), + }, + } + for _, tst := range parsePseudoFloatTests { + got, err := parsePseudoFloat(tst.in) + if err != nil || math.Abs(got-tst.out) > 0.0001 { + t.Errorf("parsePseudoFloat: %s, want %f, got %f", tst.in, tst.out, got) + } + } +} + +func TestPriorityStats(t *testing.T) { + var want = PriorityStats{ + UnusedPercent: 99, + MetadataPercent: 5, + } + var ( + in string + gotErr error + got PriorityStats + ) + in = "Metadata: 5%" + gotErr = parsePriorityStats(in, &got) + if gotErr != nil || got.MetadataPercent != want.MetadataPercent { + t.Errorf("parsePriorityStats: '%s', want %d, got %d", in, want.MetadataPercent, got.MetadataPercent) + } + + in = "Unused: 99%" + gotErr = parsePriorityStats(in, &got) + if gotErr != nil || got.UnusedPercent != want.UnusedPercent { + t.Errorf("parsePriorityStats: '%s', want %d, got %d", in, want.UnusedPercent, got.UnusedPercent) + } +} diff --git a/api/vendor/github.com/prometheus/procfs/buddyinfo.go b/api/vendor/github.com/prometheus/procfs/buddyinfo.go new file mode 100644 index 0000000..d3a8268 --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/buddyinfo.go @@ -0,0 +1,95 @@ +// Copyright 2017 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" + "fmt" + "io" + "os" + "strconv" + "strings" +) + +// A BuddyInfo is the details parsed from /proc/buddyinfo. +// The data is comprised of an array of free fragments of each size. +// The sizes are 2^n*PAGE_SIZE, where n is the array index. +type BuddyInfo struct { + Node string + Zone string + Sizes []float64 +} + +// NewBuddyInfo reads the buddyinfo statistics. +func NewBuddyInfo() ([]BuddyInfo, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return nil, err + } + + return fs.NewBuddyInfo() +} + +// NewBuddyInfo reads the buddyinfo statistics from the specified `proc` filesystem. +func (fs FS) NewBuddyInfo() ([]BuddyInfo, error) { + file, err := os.Open(fs.Path("buddyinfo")) + if err != nil { + return nil, err + } + defer file.Close() + + return parseBuddyInfo(file) +} + +func parseBuddyInfo(r io.Reader) ([]BuddyInfo, error) { + var ( + buddyInfo = []BuddyInfo{} + scanner = bufio.NewScanner(r) + bucketCount = -1 + ) + + for scanner.Scan() { + var err error + line := scanner.Text() + parts := strings.Fields(line) + + if len(parts) < 4 { + return nil, fmt.Errorf("invalid number of fields when parsing buddyinfo") + } + + node := strings.TrimRight(parts[1], ",") + zone := strings.TrimRight(parts[3], ",") + arraySize := len(parts[4:]) + + if bucketCount == -1 { + bucketCount = arraySize + } else { + if bucketCount != arraySize { + return nil, fmt.Errorf("mismatch in number of buddyinfo buckets, previous count %d, new count %d", bucketCount, arraySize) + } + } + + sizes := make([]float64, arraySize) + for i := 0; i < arraySize; i++ { + sizes[i], err = strconv.ParseFloat(parts[i+4], 64) + if err != nil { + return nil, fmt.Errorf("invalid value in buddyinfo: %s", err) + } + } + + buddyInfo = append(buddyInfo, BuddyInfo{node, zone, sizes}) + } + + return buddyInfo, scanner.Err() +} diff --git a/api/vendor/github.com/prometheus/procfs/buddyinfo_test.go b/api/vendor/github.com/prometheus/procfs/buddyinfo_test.go new file mode 100644 index 0000000..bcf9355 --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/buddyinfo_test.go @@ -0,0 +1,64 @@ +// Copyright 2017 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" + "testing" +) + +func TestBuddyInfo(t *testing.T) { + buddyInfo, err := FS("fixtures/buddyinfo/valid").NewBuddyInfo() + if err != nil { + t.Fatal(err) + } + + if want, got := "DMA", buddyInfo[0].Zone; want != got { + t.Errorf("want Node 0, Zone %s, got %s", want, got) + } + + if want, got := "Normal", buddyInfo[2].Zone; want != got { + t.Errorf("want Node 0, Zone %s, got %s", want, got) + } + + if want, got := 4381.0, buddyInfo[2].Sizes[0]; want != got { + t.Errorf("want Node 0, Zone Normal %f, got %f", want, got) + } + + if want, got := 572.0, buddyInfo[1].Sizes[1]; want != got { + t.Errorf("want Node 0, Zone DMA32 %f, got %f", want, got) + } +} + +func TestBuddyInfoShort(t *testing.T) { + _, err := FS("fixtures/buddyinfo/short").NewBuddyInfo() + if err == nil { + t.Errorf("expected error, but none occurred") + } + + if want, got := "invalid number of fields when parsing buddyinfo", err.Error(); want != got { + t.Errorf("wrong error returned, wanted %q, got %q", want, got) + } +} + +func TestBuddyInfoSizeMismatch(t *testing.T) { + _, err := FS("fixtures/buddyinfo/sizemismatch").NewBuddyInfo() + if err == nil { + t.Errorf("expected error, but none occurred") + } + + if want, got := "mismatch in number of buddyinfo buckets", err.Error(); !strings.HasPrefix(got, want) { + t.Errorf("wrong error returned, wanted prefix %q, got %q", want, got) + } +} diff --git a/api/vendor/github.com/prometheus/procfs/doc.go b/api/vendor/github.com/prometheus/procfs/doc.go new file mode 100644 index 0000000..e2acd6d --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/doc.go @@ -0,0 +1,45 @@ +// Copyright 2014 Prometheus Team +// 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 provides functions to retrieve system, kernel and process +// metrics from the pseudo-filesystem proc. +// +// Example: +// +// package main +// +// import ( +// "fmt" +// "log" +// +// "github.com/prometheus/procfs" +// ) +// +// func main() { +// p, err := procfs.Self() +// if err != nil { +// log.Fatalf("could not get process: %s", err) +// } +// +// stat, err := p.NewStat() +// if err != nil { +// log.Fatalf("could not get process stat: %s", err) +// } +// +// fmt.Printf("command: %s\n", stat.Comm) +// fmt.Printf("cpu time: %fs\n", stat.CPUTime()) +// fmt.Printf("vsize: %dB\n", stat.VirtualMemory()) +// fmt.Printf("rss: %dB\n", stat.ResidentMemory()) +// } +// +package procfs diff --git a/api/vendor/github.com/prometheus/procfs/fixtures.ttar b/api/vendor/github.com/prometheus/procfs/fixtures.ttar new file mode 100644 index 0000000..3ee8291 --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/fixtures.ttar @@ -0,0 +1,446 @@ +# Archive created by ttar -c -f fixtures.ttar fixtures/ +Directory: fixtures +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/26231 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26231/cmdline +Lines: 1 +vimNULLBYTEtest.goNULLBYTE+10NULLBYTEEOF +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26231/comm +Lines: 1 +vim +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26231/exe +SymlinkTo: /usr/bin/vim +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/26231/fd +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26231/fd/0 +SymlinkTo: ../../symlinktargets/abc +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26231/fd/1 +SymlinkTo: ../../symlinktargets/def +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26231/fd/10 +SymlinkTo: ../../symlinktargets/xyz +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26231/fd/2 +SymlinkTo: ../../symlinktargets/ghi +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26231/fd/3 +SymlinkTo: ../../symlinktargets/uvw +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26231/io +Lines: 7 +rchar: 750339 +wchar: 818609 +syscr: 7405 +syscw: 5245 +read_bytes: 1024 +write_bytes: 2048 +cancelled_write_bytes: -1024 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26231/limits +Lines: 17 +Limit Soft Limit Hard Limit Units +Max cpu time unlimited unlimited seconds +Max file size unlimited unlimited bytes +Max data size unlimited unlimited bytes +Max stack size 8388608 unlimited bytes +Max core file size 0 unlimited bytes +Max resident set unlimited unlimited bytes +Max processes 62898 62898 processes +Max open files 2048 4096 files +Max locked memory 65536 65536 bytes +Max address space 8589934592 unlimited bytes +Max file locks unlimited unlimited locks +Max pending signals 62898 62898 signals +Max msgqueue size 819200 819200 bytes +Max nice priority 0 0 +Max realtime priority 0 0 +Max realtime timeout unlimited unlimited us +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26231/mountstats +Lines: 19 +device rootfs mounted on / with fstype rootfs +device sysfs mounted on /sys with fstype sysfs +device proc mounted on /proc with fstype proc +device /dev/sda1 mounted on / with fstype ext4 +device 192.168.1.1:/srv/test mounted on /mnt/nfs/test with fstype nfs4 statvers=1.1 + opts: rw,vers=4.0,rsize=1048576,wsize=1048576,namlen=255,acregmin=3,acregmax=60,acdirmin=30,acdirmax=60,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.5,local_lock=none + age: 13968 + caps: caps=0xfff7,wtmult=512,dtsize=32768,bsize=0,namlen=255 + nfsv4: bm0=0xfdffafff,bm1=0xf9be3e,bm2=0x0,acl=0x0,pnfs=not configured + sec: flavor=1,pseudoflavor=1 + events: 52 226 0 0 1 13 398 0 0 331 0 47 0 0 77 0 0 77 0 0 0 0 0 0 0 0 0 + bytes: 1207640230 0 0 0 1210214218 0 295483 0 + RPC iostats version: 1.0 p/v: 100003/4 (nfs) + xprt: tcp 832 0 1 0 11 6428 6428 0 12154 0 24 26 5726 + per-op statistics + NULL: 0 0 0 0 0 0 0 0 + READ: 1298 1298 0 207680 1210292152 6 79386 79407 + WRITE: 0 0 0 0 0 0 0 0 + +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/26231/net +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26231/net/dev +Lines: 4 +Inter-| Receive | Transmit + face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed + lo: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + eth0: 438 5 0 0 0 0 0 0 648 8 0 0 0 0 0 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/26231/ns +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26231/ns/mnt +SymlinkTo: mnt:[4026531840] +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26231/ns/net +SymlinkTo: net:[4026531993] +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26231/stat +Lines: 1 +26231 (vim) R 5392 7446 5392 34835 7446 4218880 32533 309516 26 82 1677 44 158 99 20 0 1 0 82375 56274944 1981 18446744073709551615 4194304 6294284 140736914091744 140736914087944 139965136429984 0 0 12288 1870679807 0 0 0 17 0 0 0 31 0 0 8391624 8481048 16420864 140736914093252 140736914093279 140736914093279 140736914096107 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/26232 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26232/cmdline +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26232/comm +Lines: 1 +ata_sff +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/26232/fd +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26232/fd/0 +SymlinkTo: ../../symlinktargets/abc +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26232/fd/1 +SymlinkTo: ../../symlinktargets/def +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26232/fd/2 +SymlinkTo: ../../symlinktargets/ghi +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26232/fd/3 +SymlinkTo: ../../symlinktargets/uvw +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26232/fd/4 +SymlinkTo: ../../symlinktargets/xyz +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26232/limits +Lines: 17 +Limit Soft Limit Hard Limit Units +Max cpu time unlimited unlimited seconds +Max file size unlimited unlimited bytes +Max data size unlimited unlimited bytes +Max stack size 8388608 unlimited bytes +Max core file size 0 unlimited bytes +Max resident set unlimited unlimited bytes +Max processes 29436 29436 processes +Max open files 1024 4096 files +Max locked memory 65536 65536 bytes +Max address space unlimited unlimited bytes +Max file locks unlimited unlimited locks +Max pending signals 29436 29436 signals +Max msgqueue size 819200 819200 bytes +Max nice priority 0 0 +Max realtime priority 0 0 +Max realtime timeout unlimited unlimited us +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26232/stat +Lines: 1 +33 (ata_sff) S 2 0 0 0 -1 69238880 0 0 0 0 0 0 0 0 0 -20 1 0 5 0 0 18446744073709551615 0 0 0 0 0 0 0 2147483647 0 18446744073709551615 0 0 17 1 0 0 0 0 0 0 0 0 0 0 0 0 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/26233 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26233/cmdline +Lines: 1 +com.github.uiautomatorNULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTEEOF +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/584 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/584/stat +Lines: 2 +1020 ((a b ) ( c d) ) R 28378 1020 28378 34842 1020 4218880 286 0 0 0 0 0 0 0 20 0 1 0 10839175 10395648 155 18446744073709551615 4194304 4238788 140736466511168 140736466511168 140609271124624 0 0 0 0 0 0 0 17 5 0 0 0 0 0 6336016 6337300 25579520 140736466515030 140736466515061 140736466515061 140736466518002 0 +#!/bin/cat /proc/self/stat +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/buddyinfo +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/buddyinfo/short +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/buddyinfo/short/buddyinfo +Lines: 3 +Node 0, zone +Node 0, zone +Node 0, zone +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/buddyinfo/sizemismatch +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/buddyinfo/sizemismatch/buddyinfo +Lines: 3 +Node 0, zone DMA 1 0 1 0 2 1 1 0 1 1 3 +Node 0, zone DMA32 759 572 791 475 194 45 12 0 0 0 0 0 +Node 0, zone Normal 4381 1093 185 1530 567 102 4 0 0 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/buddyinfo/valid +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/buddyinfo/valid/buddyinfo +Lines: 3 +Node 0, zone DMA 1 0 1 0 2 1 1 0 1 1 3 +Node 0, zone DMA32 759 572 791 475 194 45 12 0 0 0 0 +Node 0, zone Normal 4381 1093 185 1530 567 102 4 0 0 0 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs/xfs +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/xfs/stat +Lines: 23 +extent_alloc 92447 97589 92448 93751 +abt 0 0 0 0 +blk_map 1767055 188820 184891 92447 92448 2140766 0 +bmbt 0 0 0 0 +dir 185039 92447 92444 136422 +trans 706 944304 0 +ig 185045 58807 0 126238 0 33637 22 +log 2883 113448 9 17360 739 +push_ail 945014 0 134260 15483 0 3940 464 159985 0 40 +xstrat 92447 0 +rw 107739 94045 +attr 4 0 0 0 +icluster 8677 7849 135802 +vnodes 92601 0 0 0 92444 92444 92444 0 +buf 2666287 7122 2659202 3599 2 7085 0 10297 7085 +abtb2 184941 1277345 13257 13278 0 0 0 0 0 0 0 0 0 0 2746147 +abtc2 345295 2416764 172637 172658 0 0 0 0 0 0 0 0 0 0 21406023 +bmbt2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +ibt2 343004 1358467 0 0 0 0 0 0 0 0 0 0 0 0 0 +fibt2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +qm 0 0 0 0 0 0 0 0 +xpc 399724544 92823103 86219234 +debug 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/mdstat +Lines: 26 +Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] +md3 : active raid6 sda1[8] sdh1[7] sdg1[6] sdf1[5] sde1[11] sdd1[3] sdc1[10] sdb1[9] + 5853468288 blocks super 1.2 level 6, 64k chunk, algorithm 2 [8/8] [UUUUUUUU] + +md127 : active raid1 sdi2[0] sdj2[1] + 312319552 blocks [2/2] [UU] + +md0 : active raid1 sdk[2](S) sdi1[0] sdj1[1] + 248896 blocks [2/2] [UU] + +md4 : inactive raid1 sda3[0] sdb3[1] + 4883648 blocks [2/2] [UU] + +md6 : active raid1 sdb2[2] sda2[0] + 195310144 blocks [2/1] [U_] + [=>...................] recovery = 8.5% (16775552/195310144) finish=17.0min speed=259783K/sec + +md8 : active raid1 sdb1[1] sda1[0] + 195310144 blocks [2/2] [UU] + [=>...................] resync = 8.5% (16775552/195310144) finish=17.0min speed=259783K/sec + +md7 : active raid6 sdb1[0] sde1[3] sdd1[2] sdc1[1] + 7813735424 blocks super 1.2 level 6, 512k chunk, algorithm 2 [4/3] [U_UU] + bitmap: 0/30 pages [0KB], 65536KB chunk + +unused devices: +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/net +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/net/dev +Lines: 6 +Inter-| Receive | Transmit + face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed +vethf345468: 648 8 0 0 0 0 0 0 438 5 0 0 0 0 0 0 + lo: 1664039048 1566805 0 0 0 0 0 0 1664039048 1566805 0 0 0 0 0 0 +docker0: 2568 38 0 0 0 0 0 0 438 5 0 0 0 0 0 0 + eth0: 874354587 1036395 0 0 0 0 0 0 563352563 732147 0 0 0 0 0 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/net/ip_vs +Lines: 21 +IP Virtual Server version 1.2.1 (size=4096) +Prot LocalAddress:Port Scheduler Flags + -> RemoteAddress:Port Forward Weight ActiveConn InActConn +TCP C0A80016:0CEA wlc + -> C0A85216:0CEA Tunnel 100 248 2 + -> C0A85318:0CEA Tunnel 100 248 2 + -> C0A85315:0CEA Tunnel 100 248 1 +TCP C0A80039:0CEA wlc + -> C0A85416:0CEA Tunnel 0 0 0 + -> C0A85215:0CEA Tunnel 100 1499 0 + -> C0A83215:0CEA Tunnel 100 1498 0 +TCP C0A80037:0CEA wlc + -> C0A8321A:0CEA Tunnel 0 0 0 + -> C0A83120:0CEA Tunnel 100 0 0 +TCP [2620:0000:0000:0000:0000:0000:0000:0001]:0050 sh + -> [2620:0000:0000:0000:0000:0000:0000:0002]:0050 Route 1 0 0 + -> [2620:0000:0000:0000:0000:0000:0000:0003]:0050 Route 1 0 0 + -> [2620:0000:0000:0000:0000:0000:0000:0004]:0050 Route 1 1 1 +FWM 10001000 wlc + -> C0A8321A:0CEA Route 0 0 1 + -> C0A83215:0CEA Route 0 0 2 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/net/ip_vs_stats +Lines: 6 + Total Incoming Outgoing Incoming Outgoing + Conns Packets Packets Bytes Bytes + 16AA370 E33656E5 0 51D8C8883AB3 0 + + Conns/s Pkts/s Pkts/s Bytes/s Bytes/s + 4 1FB3C 0 1282A8F 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/net/rpc +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/net/rpc/nfs +Lines: 5 +net 18628 0 18628 6 +rpc 4329785 0 4338291 +proc2 18 2 69 0 0 4410 0 0 0 0 0 0 0 0 0 0 0 99 2 +proc3 22 1 4084749 29200 94754 32580 186 47747 7981 8639 0 6356 0 6962 0 7958 0 0 241 4 4 2 39 +proc4 61 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 2 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 0 0 0 0 0 0 0 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/net/rpc/nfsd +Lines: 11 +rc 0 6 18622 +fh 0 0 0 0 0 +io 157286400 0 +th 8 0 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 +ra 32 0 0 0 0 0 0 0 0 0 0 0 +net 18628 0 18628 6 +rpc 18628 0 0 0 0 +proc2 18 2 69 0 0 4410 0 0 0 0 0 0 0 0 0 0 0 99 2 +proc3 22 2 112 0 2719 111 0 0 0 0 0 0 0 0 0 0 0 27 216 0 2 1 0 +proc4 2 2 10853 +proc4ops 72 0 0 0 1098 2 0 0 0 0 8179 5896 0 0 0 0 5900 0 0 2 0 2 0 9609 0 2 150 1272 0 0 0 1236 0 0 0 0 3 3 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 0 0 0 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/net/xfrm_stat +Lines: 28 +XfrmInError 1 +XfrmInBufferError 2 +XfrmInHdrError 4 +XfrmInNoStates 3 +XfrmInStateProtoError 40 +XfrmInStateModeError 100 +XfrmInStateSeqError 6000 +XfrmInStateExpired 4 +XfrmInStateMismatch 23451 +XfrmInStateInvalid 55555 +XfrmInTmplMismatch 51 +XfrmInNoPols 65432 +XfrmInPolBlock 100 +XfrmInPolError 10000 +XfrmOutError 1000000 +XfrmOutBundleGenError 43321 +XfrmOutBundleCheckError 555 +XfrmOutNoStates 869 +XfrmOutStateProtoError 4542 +XfrmOutStateModeError 4 +XfrmOutStateSeqError 543 +XfrmOutStateExpired 565 +XfrmOutPolBlock 43456 +XfrmOutPolDead 7656 +XfrmOutPolError 1454 +XfrmFwdHdrError 6654 +XfrmOutStateInvalid 28765 +XfrmAcquireError 24532 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/self +SymlinkTo: 26231 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/stat +Lines: 16 +cpu 301854 612 111922 8979004 3552 2 3944 0 0 0 +cpu0 44490 19 21045 1087069 220 1 3410 0 0 0 +cpu1 47869 23 16474 1110787 591 0 46 0 0 0 +cpu2 46504 36 15916 1112321 441 0 326 0 0 0 +cpu3 47054 102 15683 1113230 533 0 60 0 0 0 +cpu4 28413 25 10776 1140321 217 0 8 0 0 0 +cpu5 29271 101 11586 1136270 672 0 30 0 0 0 +cpu6 29152 36 10276 1139721 319 0 29 0 0 0 +cpu7 29098 268 10164 1139282 555 0 31 0 0 0 +intr 8885917 17 0 0 0 0 0 0 0 1 79281 0 0 0 0 0 0 0 231237 0 0 0 0 250586 103 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 223424 190745 13 906 1283803 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 0 0 0 0 0 0 0 0 0 0 0 0 +ctxt 38014093 +btime 1418183276 +processes 26442 +procs_running 2 +procs_blocked 1 +softirq 5057579 250191 1481983 1647 211099 186066 0 1783454 622196 12499 508444 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/symlinktargets +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/symlinktargets/README +Lines: 2 +This directory contains some empty files that are the symlinks the files in the "fd" directory point to. +They are otherwise ignored by the tests +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/symlinktargets/abc +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/symlinktargets/def +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/symlinktargets/ghi +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/symlinktargets/uvw +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/symlinktargets/xyz +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/api/vendor/github.com/prometheus/procfs/fs.go b/api/vendor/github.com/prometheus/procfs/fs.go new file mode 100644 index 0000000..b6c6b2c --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/fs.go @@ -0,0 +1,82 @@ +// Copyright 2018 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 ( + "fmt" + "os" + "path" + + "github.com/prometheus/procfs/nfs" + "github.com/prometheus/procfs/xfs" +) + +// FS represents the pseudo-filesystem proc, which provides an interface to +// kernel data structures. +type FS string + +// DefaultMountPoint is the common mount point of the proc filesystem. +const DefaultMountPoint = "/proc" + +// NewFS returns a new FS mounted under the given mountPoint. It will error +// if the mount point can't be read. +func NewFS(mountPoint string) (FS, error) { + info, err := os.Stat(mountPoint) + if err != nil { + return "", fmt.Errorf("could not read %s: %s", mountPoint, err) + } + if !info.IsDir() { + return "", fmt.Errorf("mount point %s is not a directory", mountPoint) + } + + return FS(mountPoint), nil +} + +// Path returns the path of the given subsystem relative to the procfs root. +func (fs FS) Path(p ...string) string { + return path.Join(append([]string{string(fs)}, p...)...) +} + +// XFSStats retrieves XFS filesystem runtime statistics. +func (fs FS) XFSStats() (*xfs.Stats, error) { + f, err := os.Open(fs.Path("fs/xfs/stat")) + if err != nil { + return nil, err + } + defer f.Close() + + return xfs.ParseStats(f) +} + +// NFSClientRPCStats retrieves NFS client RPC statistics. +func (fs FS) NFSClientRPCStats() (*nfs.ClientRPCStats, error) { + f, err := os.Open(fs.Path("net/rpc/nfs")) + if err != nil { + return nil, err + } + defer f.Close() + + return nfs.ParseClientRPCStats(f) +} + +// NFSdServerRPCStats retrieves NFS daemon RPC statistics. +func (fs FS) NFSdServerRPCStats() (*nfs.ServerRPCStats, error) { + f, err := os.Open(fs.Path("net/rpc/nfsd")) + if err != nil { + return nil, err + } + defer f.Close() + + return nfs.ParseServerRPCStats(f) +} diff --git a/api/vendor/github.com/prometheus/procfs/fs_test.go b/api/vendor/github.com/prometheus/procfs/fs_test.go new file mode 100644 index 0000000..a4e07f5 --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/fs_test.go @@ -0,0 +1,39 @@ +// Copyright 2018 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 "testing" + +func TestNewFS(t *testing.T) { + if _, err := NewFS("foobar"); err == nil { + t.Error("want NewFS to fail for non-existing mount point") + } + + if _, err := NewFS("procfs.go"); err == nil { + t.Error("want NewFS to fail if mount point is not a directory") + } +} + +func TestFSXFSStats(t *testing.T) { + stats, err := FS("fixtures").XFSStats() + if err != nil { + t.Fatalf("failed to parse XFS stats: %v", err) + } + + // Very lightweight test just to sanity check the path used + // to open XFS stats. Heavier tests in package xfs. + if want, got := uint32(92447), stats.ExtentAllocation.ExtentsAllocated; want != got { + t.Errorf("unexpected extents allocated:\nwant: %d\nhave: %d", want, got) + } +} diff --git a/api/vendor/github.com/prometheus/procfs/internal/util/parse.go b/api/vendor/github.com/prometheus/procfs/internal/util/parse.go new file mode 100644 index 0000000..1ad21c9 --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/internal/util/parse.go @@ -0,0 +1,46 @@ +// Copyright 2018 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 util + +import "strconv" + +// ParseUint32s parses a slice of strings into a slice of uint32s. +func ParseUint32s(ss []string) ([]uint32, error) { + us := make([]uint32, 0, len(ss)) + for _, s := range ss { + u, err := strconv.ParseUint(s, 10, 32) + if err != nil { + return nil, err + } + + us = append(us, uint32(u)) + } + + return us, nil +} + +// ParseUint64s parses a slice of strings into a slice of uint64s. +func ParseUint64s(ss []string) ([]uint64, error) { + us := make([]uint64, 0, len(ss)) + for _, s := range ss { + u, err := strconv.ParseUint(s, 10, 64) + if err != nil { + return nil, err + } + + us = append(us, u) + } + + return us, nil +} diff --git a/api/vendor/github.com/prometheus/procfs/ipvs.go b/api/vendor/github.com/prometheus/procfs/ipvs.go new file mode 100644 index 0000000..e36d4a3 --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/ipvs.go @@ -0,0 +1,259 @@ +// Copyright 2018 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" + "encoding/hex" + "errors" + "fmt" + "io" + "io/ioutil" + "net" + "os" + "strconv" + "strings" +) + +// IPVSStats holds IPVS statistics, as exposed by the kernel in `/proc/net/ip_vs_stats`. +type IPVSStats struct { + // Total count of connections. + Connections uint64 + // Total incoming packages processed. + IncomingPackets uint64 + // Total outgoing packages processed. + OutgoingPackets uint64 + // Total incoming traffic. + IncomingBytes uint64 + // Total outgoing traffic. + OutgoingBytes uint64 +} + +// IPVSBackendStatus holds current metrics of one virtual / real address pair. +type IPVSBackendStatus struct { + // The local (virtual) IP address. + LocalAddress net.IP + // The remote (real) IP address. + RemoteAddress net.IP + // The local (virtual) port. + LocalPort uint16 + // The remote (real) port. + RemotePort uint16 + // The local firewall mark + LocalMark string + // The transport protocol (TCP, UDP). + Proto string + // The current number of active connections for this virtual/real address pair. + ActiveConn uint64 + // The current number of inactive connections for this virtual/real address pair. + InactConn uint64 + // The current weight of this virtual/real address pair. + Weight uint64 +} + +// NewIPVSStats reads the IPVS statistics. +func NewIPVSStats() (IPVSStats, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return IPVSStats{}, err + } + + return fs.NewIPVSStats() +} + +// NewIPVSStats reads the IPVS statistics from the specified `proc` filesystem. +func (fs FS) NewIPVSStats() (IPVSStats, error) { + file, err := os.Open(fs.Path("net/ip_vs_stats")) + if err != nil { + return IPVSStats{}, err + } + defer file.Close() + + return parseIPVSStats(file) +} + +// parseIPVSStats performs the actual parsing of `ip_vs_stats`. +func parseIPVSStats(file io.Reader) (IPVSStats, error) { + var ( + statContent []byte + statLines []string + statFields []string + stats IPVSStats + ) + + statContent, err := ioutil.ReadAll(file) + if err != nil { + return IPVSStats{}, err + } + + statLines = strings.SplitN(string(statContent), "\n", 4) + if len(statLines) != 4 { + return IPVSStats{}, errors.New("ip_vs_stats corrupt: too short") + } + + statFields = strings.Fields(statLines[2]) + if len(statFields) != 5 { + return IPVSStats{}, errors.New("ip_vs_stats corrupt: unexpected number of fields") + } + + stats.Connections, err = strconv.ParseUint(statFields[0], 16, 64) + if err != nil { + return IPVSStats{}, err + } + stats.IncomingPackets, err = strconv.ParseUint(statFields[1], 16, 64) + if err != nil { + return IPVSStats{}, err + } + stats.OutgoingPackets, err = strconv.ParseUint(statFields[2], 16, 64) + if err != nil { + return IPVSStats{}, err + } + stats.IncomingBytes, err = strconv.ParseUint(statFields[3], 16, 64) + if err != nil { + return IPVSStats{}, err + } + stats.OutgoingBytes, err = strconv.ParseUint(statFields[4], 16, 64) + if err != nil { + return IPVSStats{}, err + } + + return stats, nil +} + +// NewIPVSBackendStatus reads and returns the status of all (virtual,real) server pairs. +func NewIPVSBackendStatus() ([]IPVSBackendStatus, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return []IPVSBackendStatus{}, err + } + + return fs.NewIPVSBackendStatus() +} + +// NewIPVSBackendStatus reads and returns the status of all (virtual,real) server pairs from the specified `proc` filesystem. +func (fs FS) NewIPVSBackendStatus() ([]IPVSBackendStatus, error) { + file, err := os.Open(fs.Path("net/ip_vs")) + if err != nil { + return nil, err + } + defer file.Close() + + return parseIPVSBackendStatus(file) +} + +func parseIPVSBackendStatus(file io.Reader) ([]IPVSBackendStatus, error) { + var ( + status []IPVSBackendStatus + scanner = bufio.NewScanner(file) + proto string + localMark string + localAddress net.IP + localPort uint16 + err error + ) + + for scanner.Scan() { + fields := strings.Fields(scanner.Text()) + if len(fields) == 0 { + continue + } + switch { + case fields[0] == "IP" || fields[0] == "Prot" || fields[1] == "RemoteAddress:Port": + continue + case fields[0] == "TCP" || fields[0] == "UDP": + if len(fields) < 2 { + continue + } + proto = fields[0] + localMark = "" + localAddress, localPort, err = parseIPPort(fields[1]) + if err != nil { + return nil, err + } + case fields[0] == "FWM": + if len(fields) < 2 { + continue + } + proto = fields[0] + localMark = fields[1] + localAddress = nil + localPort = 0 + case fields[0] == "->": + if len(fields) < 6 { + continue + } + remoteAddress, remotePort, err := parseIPPort(fields[1]) + if err != nil { + return nil, err + } + weight, err := strconv.ParseUint(fields[3], 10, 64) + if err != nil { + return nil, err + } + activeConn, err := strconv.ParseUint(fields[4], 10, 64) + if err != nil { + return nil, err + } + inactConn, err := strconv.ParseUint(fields[5], 10, 64) + if err != nil { + return nil, err + } + status = append(status, IPVSBackendStatus{ + LocalAddress: localAddress, + LocalPort: localPort, + LocalMark: localMark, + RemoteAddress: remoteAddress, + RemotePort: remotePort, + Proto: proto, + Weight: weight, + ActiveConn: activeConn, + InactConn: inactConn, + }) + } + } + return status, nil +} + +func parseIPPort(s string) (net.IP, uint16, error) { + var ( + ip net.IP + err error + ) + + switch len(s) { + case 13: + ip, err = hex.DecodeString(s[0:8]) + if err != nil { + return nil, 0, err + } + case 46: + ip = net.ParseIP(s[1:40]) + if ip == nil { + return nil, 0, fmt.Errorf("invalid IPv6 address: %s", s[1:40]) + } + default: + return nil, 0, fmt.Errorf("unexpected IP:Port: %s", s) + } + + portString := s[len(s)-4:] + if len(portString) != 4 { + return nil, 0, fmt.Errorf("unexpected port string format: %s", portString) + } + port, err := strconv.ParseUint(portString, 16, 16) + if err != nil { + return nil, 0, err + } + + return ip, uint16(port), nil +} diff --git a/api/vendor/github.com/prometheus/procfs/ipvs_test.go b/api/vendor/github.com/prometheus/procfs/ipvs_test.go new file mode 100644 index 0000000..9c34e6d --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/ipvs_test.go @@ -0,0 +1,250 @@ +// Copyright 2018 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 ( + "net" + "testing" +) + +var ( + expectedIPVSStats = IPVSStats{ + Connections: 23765872, + IncomingPackets: 3811989221, + OutgoingPackets: 0, + IncomingBytes: 89991519156915, + OutgoingBytes: 0, + } + expectedIPVSBackendStatuses = []IPVSBackendStatus{ + { + LocalAddress: net.ParseIP("192.168.0.22"), + LocalPort: 3306, + RemoteAddress: net.ParseIP("192.168.82.22"), + RemotePort: 3306, + Proto: "TCP", + Weight: 100, + ActiveConn: 248, + InactConn: 2, + }, + { + LocalAddress: net.ParseIP("192.168.0.22"), + LocalPort: 3306, + RemoteAddress: net.ParseIP("192.168.83.24"), + RemotePort: 3306, + Proto: "TCP", + Weight: 100, + ActiveConn: 248, + InactConn: 2, + }, + { + LocalAddress: net.ParseIP("192.168.0.22"), + LocalPort: 3306, + RemoteAddress: net.ParseIP("192.168.83.21"), + RemotePort: 3306, + Proto: "TCP", + Weight: 100, + ActiveConn: 248, + InactConn: 1, + }, + { + LocalAddress: net.ParseIP("192.168.0.57"), + LocalPort: 3306, + RemoteAddress: net.ParseIP("192.168.84.22"), + RemotePort: 3306, + Proto: "TCP", + Weight: 0, + ActiveConn: 0, + InactConn: 0, + }, + { + LocalAddress: net.ParseIP("192.168.0.57"), + LocalPort: 3306, + RemoteAddress: net.ParseIP("192.168.82.21"), + RemotePort: 3306, + Proto: "TCP", + Weight: 100, + ActiveConn: 1499, + InactConn: 0, + }, + { + LocalAddress: net.ParseIP("192.168.0.57"), + LocalPort: 3306, + RemoteAddress: net.ParseIP("192.168.50.21"), + RemotePort: 3306, + Proto: "TCP", + Weight: 100, + ActiveConn: 1498, + InactConn: 0, + }, + { + LocalAddress: net.ParseIP("192.168.0.55"), + LocalPort: 3306, + RemoteAddress: net.ParseIP("192.168.50.26"), + RemotePort: 3306, + Proto: "TCP", + Weight: 0, + ActiveConn: 0, + InactConn: 0, + }, + { + LocalAddress: net.ParseIP("192.168.0.55"), + LocalPort: 3306, + RemoteAddress: net.ParseIP("192.168.49.32"), + RemotePort: 3306, + Proto: "TCP", + Weight: 100, + ActiveConn: 0, + InactConn: 0, + }, + { + LocalAddress: net.ParseIP("2620::1"), + LocalPort: 80, + RemoteAddress: net.ParseIP("2620::2"), + RemotePort: 80, + Proto: "TCP", + Weight: 1, + ActiveConn: 0, + InactConn: 0, + }, + { + LocalAddress: net.ParseIP("2620::1"), + LocalPort: 80, + RemoteAddress: net.ParseIP("2620::3"), + RemotePort: 80, + Proto: "TCP", + Weight: 1, + ActiveConn: 0, + InactConn: 0, + }, + { + LocalAddress: net.ParseIP("2620::1"), + LocalPort: 80, + RemoteAddress: net.ParseIP("2620::4"), + RemotePort: 80, + Proto: "TCP", + Weight: 1, + ActiveConn: 1, + InactConn: 1, + }, + { + LocalMark: "10001000", + RemoteAddress: net.ParseIP("192.168.50.26"), + RemotePort: 3306, + Proto: "FWM", + Weight: 0, + ActiveConn: 0, + InactConn: 1, + }, + { + LocalMark: "10001000", + RemoteAddress: net.ParseIP("192.168.50.21"), + RemotePort: 3306, + Proto: "FWM", + Weight: 0, + ActiveConn: 0, + InactConn: 2, + }, + } +) + +func TestIPVSStats(t *testing.T) { + stats, err := FS("fixtures").NewIPVSStats() + if err != nil { + t.Fatal(err) + } + + if stats != expectedIPVSStats { + t.Errorf("want %+v, have %+v", expectedIPVSStats, stats) + } +} + +func TestParseIPPort(t *testing.T) { + ip := net.ParseIP("192.168.0.22") + port := uint16(3306) + + gotIP, gotPort, err := parseIPPort("C0A80016:0CEA") + if err != nil { + t.Fatal(err) + } + if !(gotIP.Equal(ip) && port == gotPort) { + t.Errorf("want %s:%d, have %s:%d", ip, port, gotIP, gotPort) + } +} + +func TestParseIPPortInvalid(t *testing.T) { + testcases := []string{ + "", + "C0A80016", + "C0A800:1234", + "FOOBARBA:1234", + "C0A80016:0CEA:1234", + } + + for _, s := range testcases { + ip, port, err := parseIPPort(s) + if ip != nil || port != uint16(0) || err == nil { + t.Errorf("Expected error for input %s, have ip = %s, port = %v, err = %v", s, ip, port, err) + } + } +} + +func TestParseIPPortIPv6(t *testing.T) { + ip := net.ParseIP("dead:beef::1") + port := uint16(8080) + + gotIP, gotPort, err := parseIPPort("[DEAD:BEEF:0000:0000:0000:0000:0000:0001]:1F90") + if err != nil { + t.Fatal(err) + } + if !(gotIP.Equal(ip) && port == gotPort) { + t.Errorf("want %s:%d, have %s:%d", ip, port, gotIP, gotPort) + } +} + +func TestIPVSBackendStatus(t *testing.T) { + backendStats, err := FS("fixtures").NewIPVSBackendStatus() + if err != nil { + t.Fatal(err) + } + if want, have := len(expectedIPVSBackendStatuses), len(backendStats); want != have { + t.Fatalf("want %d backend statuses, have %d", want, have) + } + + for idx, expect := range expectedIPVSBackendStatuses { + if !backendStats[idx].LocalAddress.Equal(expect.LocalAddress) { + t.Errorf("want LocalAddress %s, have %s", expect.LocalAddress, backendStats[idx].LocalAddress) + } + if backendStats[idx].LocalPort != expect.LocalPort { + t.Errorf("want LocalPort %d, have %d", expect.LocalPort, backendStats[idx].LocalPort) + } + if !backendStats[idx].RemoteAddress.Equal(expect.RemoteAddress) { + t.Errorf("want RemoteAddress %s, have %s", expect.RemoteAddress, backendStats[idx].RemoteAddress) + } + if backendStats[idx].RemotePort != expect.RemotePort { + t.Errorf("want RemotePort %d, have %d", expect.RemotePort, backendStats[idx].RemotePort) + } + if backendStats[idx].Proto != expect.Proto { + t.Errorf("want Proto %s, have %s", expect.Proto, backendStats[idx].Proto) + } + if backendStats[idx].Weight != expect.Weight { + t.Errorf("want Weight %d, have %d", expect.Weight, backendStats[idx].Weight) + } + if backendStats[idx].ActiveConn != expect.ActiveConn { + t.Errorf("want ActiveConn %d, have %d", expect.ActiveConn, backendStats[idx].ActiveConn) + } + if backendStats[idx].InactConn != expect.InactConn { + t.Errorf("want InactConn %d, have %d", expect.InactConn, backendStats[idx].InactConn) + } + } +} diff --git a/api/vendor/github.com/prometheus/procfs/mdstat.go b/api/vendor/github.com/prometheus/procfs/mdstat.go new file mode 100644 index 0000000..9dc1958 --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/mdstat.go @@ -0,0 +1,151 @@ +// Copyright 2018 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 ( + "fmt" + "io/ioutil" + "regexp" + "strconv" + "strings" +) + +var ( + statuslineRE = regexp.MustCompile(`(\d+) blocks .*\[(\d+)/(\d+)\] \[[U_]+\]`) + buildlineRE = regexp.MustCompile(`\((\d+)/\d+\)`) +) + +// MDStat holds info parsed from /proc/mdstat. +type MDStat struct { + // Name of the device. + Name string + // activity-state of the device. + ActivityState string + // Number of active disks. + DisksActive int64 + // Total number of disks the device consists of. + DisksTotal int64 + // Number of blocks the device holds. + BlocksTotal int64 + // Number of blocks on the device that are in sync. + BlocksSynced int64 +} + +// ParseMDStat parses an mdstat-file and returns a struct with the relevant infos. +func (fs FS) ParseMDStat() (mdstates []MDStat, err error) { + mdStatusFilePath := fs.Path("mdstat") + content, err := ioutil.ReadFile(mdStatusFilePath) + if err != nil { + return []MDStat{}, fmt.Errorf("error parsing %s: %s", mdStatusFilePath, err) + } + + mdStates := []MDStat{} + lines := strings.Split(string(content), "\n") + for i, l := range lines { + if l == "" { + continue + } + if l[0] == ' ' { + continue + } + if strings.HasPrefix(l, "Personalities") || strings.HasPrefix(l, "unused") { + continue + } + + mainLine := strings.Split(l, " ") + if len(mainLine) < 3 { + return mdStates, fmt.Errorf("error parsing mdline: %s", l) + } + mdName := mainLine[0] + activityState := mainLine[2] + + if len(lines) <= i+3 { + return mdStates, fmt.Errorf( + "error parsing %s: too few lines for md device %s", + mdStatusFilePath, + mdName, + ) + } + + active, total, size, err := evalStatusline(lines[i+1]) + if err != nil { + return mdStates, fmt.Errorf("error parsing %s: %s", mdStatusFilePath, err) + } + + // j is the line number of the syncing-line. + j := i + 2 + if strings.Contains(lines[i+2], "bitmap") { // skip bitmap line + j = i + 3 + } + + // 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 + if strings.Contains(lines[j], "recovery") || strings.Contains(lines[j], "resync") { + syncedBlocks, err = evalBuildline(lines[j]) + if err != nil { + return mdStates, fmt.Errorf("error parsing %s: %s", mdStatusFilePath, err) + } + } + + mdStates = append(mdStates, MDStat{ + Name: mdName, + ActivityState: activityState, + DisksActive: active, + DisksTotal: total, + BlocksTotal: size, + BlocksSynced: syncedBlocks, + }) + } + + return mdStates, nil +} + +func evalStatusline(statusline string) (active, total, size int64, err error) { + matches := statuslineRE.FindStringSubmatch(statusline) + if len(matches) != 4 { + return 0, 0, 0, fmt.Errorf("unexpected statusline: %s", statusline) + } + + size, err = strconv.ParseInt(matches[1], 10, 64) + if err != nil { + return 0, 0, 0, fmt.Errorf("unexpected statusline %s: %s", statusline, err) + } + + total, err = strconv.ParseInt(matches[2], 10, 64) + if err != nil { + return 0, 0, 0, fmt.Errorf("unexpected statusline %s: %s", statusline, err) + } + + active, err = strconv.ParseInt(matches[3], 10, 64) + if err != nil { + return 0, 0, 0, fmt.Errorf("unexpected statusline %s: %s", statusline, err) + } + + return active, total, size, nil +} + +func evalBuildline(buildline string) (syncedBlocks int64, err error) { + matches := buildlineRE.FindStringSubmatch(buildline) + if len(matches) != 2 { + return 0, fmt.Errorf("unexpected buildline: %s", buildline) + } + + syncedBlocks, err = strconv.ParseInt(matches[1], 10, 64) + if err != nil { + return 0, fmt.Errorf("%s in buildline: %s", err, buildline) + } + + return syncedBlocks, nil +} diff --git a/api/vendor/github.com/prometheus/procfs/mdstat_test.go b/api/vendor/github.com/prometheus/procfs/mdstat_test.go new file mode 100644 index 0000000..8819228 --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/mdstat_test.go @@ -0,0 +1,44 @@ +// Copyright 2018 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 ( + "testing" +) + +func TestMDStat(t *testing.T) { + mdStates, err := FS("fixtures").ParseMDStat() + if err != nil { + t.Fatalf("parsing of reference-file failed entirely: %s", err) + } + + refs := map[string]MDStat{ + "md3": {"md3", "active", 8, 8, 5853468288, 5853468288}, + "md127": {"md127", "active", 2, 2, 312319552, 312319552}, + "md0": {"md0", "active", 2, 2, 248896, 248896}, + "md4": {"md4", "inactive", 2, 2, 4883648, 4883648}, + "md6": {"md6", "active", 1, 2, 195310144, 16775552}, + "md8": {"md8", "active", 2, 2, 195310144, 16775552}, + "md7": {"md7", "active", 3, 4, 7813735424, 7813735424}, + } + + if want, have := len(refs), len(mdStates); want != have { + t.Errorf("want %d parsed md-devices, have %d", want, have) + } + for _, md := range mdStates { + if want, have := refs[md.Name], md; want != have { + t.Errorf("%s: want %v, have %v", md.Name, want, have) + } + } +} diff --git a/api/vendor/github.com/prometheus/procfs/mountstats.go b/api/vendor/github.com/prometheus/procfs/mountstats.go new file mode 100644 index 0000000..e95ddbc --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/mountstats.go @@ -0,0 +1,569 @@ +// Copyright 2018 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 + +// While implementing parsing of /proc/[pid]/mountstats, this blog was used +// heavily as a reference: +// https://utcc.utoronto.ca/~cks/space/blog/linux/NFSMountstatsIndex +// +// Special thanks to Chris Siebenmann for all of his posts explaining the +// various statistics available for NFS. + +import ( + "bufio" + "fmt" + "io" + "strconv" + "strings" + "time" +) + +// Constants shared between multiple functions. +const ( + deviceEntryLen = 8 + + fieldBytesLen = 8 + fieldEventsLen = 27 + + statVersion10 = "1.0" + statVersion11 = "1.1" + + fieldTransport10Len = 10 + fieldTransport11Len = 13 +) + +// A Mount is a device mount parsed from /proc/[pid]/mountstats. +type Mount struct { + // Name of the device. + Device string + // The mount point of the device. + Mount string + // The filesystem type used by the device. + Type string + // If available additional statistics related to this Mount. + // Use a type assertion to determine if additional statistics are available. + Stats MountStats +} + +// A MountStats is a type which contains detailed statistics for a specific +// type of Mount. +type MountStats interface { + mountStats() +} + +// A MountStatsNFS is a MountStats implementation for NFSv3 and v4 mounts. +type MountStatsNFS struct { + // The version of statistics provided. + StatVersion string + // The age of the NFS mount. + Age time.Duration + // Statistics related to byte counters for various operations. + Bytes NFSBytesStats + // Statistics related to various NFS event occurrences. + Events NFSEventsStats + // Statistics broken down by filesystem operation. + Operations []NFSOperationStats + // Statistics about the NFS RPC transport. + Transport NFSTransportStats +} + +// mountStats implements MountStats. +func (m MountStatsNFS) mountStats() {} + +// A NFSBytesStats contains statistics about the number of bytes read and written +// by an NFS client to and from an NFS server. +type NFSBytesStats struct { + // Number of bytes read using the read() syscall. + Read uint64 + // Number of bytes written using the write() syscall. + Write uint64 + // Number of bytes read using the read() syscall in O_DIRECT mode. + DirectRead uint64 + // Number of bytes written using the write() syscall in O_DIRECT mode. + DirectWrite uint64 + // Number of bytes read from the NFS server, in total. + ReadTotal uint64 + // Number of bytes written to the NFS server, in total. + WriteTotal uint64 + // Number of pages read directly via mmap()'d files. + ReadPages uint64 + // Number of pages written directly via mmap()'d files. + WritePages uint64 +} + +// A NFSEventsStats contains statistics about NFS event occurrences. +type NFSEventsStats struct { + // Number of times cached inode attributes are re-validated from the server. + InodeRevalidate uint64 + // Number of times cached dentry nodes are re-validated from the server. + DnodeRevalidate uint64 + // Number of times an inode cache is cleared. + DataInvalidate uint64 + // Number of times cached inode attributes are invalidated. + AttributeInvalidate uint64 + // Number of times files or directories have been open()'d. + VFSOpen uint64 + // Number of times a directory lookup has occurred. + VFSLookup uint64 + // Number of times permissions have been checked. + VFSAccess uint64 + // Number of updates (and potential writes) to pages. + VFSUpdatePage uint64 + // Number of pages read directly via mmap()'d files. + VFSReadPage uint64 + // Number of times a group of pages have been read. + VFSReadPages uint64 + // Number of pages written directly via mmap()'d files. + VFSWritePage uint64 + // Number of times a group of pages have been written. + VFSWritePages uint64 + // Number of times directory entries have been read with getdents(). + VFSGetdents uint64 + // Number of times attributes have been set on inodes. + VFSSetattr uint64 + // Number of pending writes that have been forcefully flushed to the server. + VFSFlush uint64 + // Number of times fsync() has been called on directories and files. + VFSFsync uint64 + // Number of times locking has been attempted on a file. + VFSLock uint64 + // Number of times files have been closed and released. + VFSFileRelease uint64 + // Unknown. Possibly unused. + CongestionWait uint64 + // Number of times files have been truncated. + Truncation uint64 + // Number of times a file has been grown due to writes beyond its existing end. + WriteExtension uint64 + // Number of times a file was removed while still open by another process. + SillyRename uint64 + // Number of times the NFS server gave less data than expected while reading. + ShortRead uint64 + // Number of times the NFS server wrote less data than expected while writing. + ShortWrite uint64 + // Number of times the NFS server indicated EJUKEBOX; retrieving data from + // offline storage. + JukeboxDelay uint64 + // Number of NFS v4.1+ pNFS reads. + PNFSRead uint64 + // Number of NFS v4.1+ pNFS writes. + PNFSWrite uint64 +} + +// A NFSOperationStats contains statistics for a single operation. +type NFSOperationStats struct { + // The name of the operation. + Operation string + // Number of requests performed for this operation. + Requests uint64 + // Number of times an actual RPC request has been transmitted for this operation. + Transmissions uint64 + // Number of times a request has had a major timeout. + MajorTimeouts uint64 + // Number of bytes sent for this operation, including RPC headers and payload. + BytesSent uint64 + // Number of bytes received for this operation, including RPC headers and payload. + BytesReceived uint64 + // Duration all requests spent queued for transmission before they were sent. + CumulativeQueueTime time.Duration + // Duration it took to get a reply back after the request was transmitted. + CumulativeTotalResponseTime time.Duration + // Duration from when a request was enqueued to when it was completely handled. + CumulativeTotalRequestTime time.Duration +} + +// A NFSTransportStats contains statistics for the NFS mount RPC requests and +// responses. +type NFSTransportStats struct { + // The local port used for the NFS mount. + Port uint64 + // Number of times the client has had to establish a connection from scratch + // to the NFS server. + Bind uint64 + // Number of times the client has made a TCP connection to the NFS server. + Connect uint64 + // Duration (in jiffies, a kernel internal unit of time) the NFS mount has + // spent waiting for connections to the server to be established. + ConnectIdleTime uint64 + // Duration since the NFS mount last saw any RPC traffic. + IdleTime time.Duration + // Number of RPC requests for this mount sent to the NFS server. + Sends uint64 + // Number of RPC responses for this mount received from the NFS server. + Receives uint64 + // Number of times the NFS server sent a response with a transaction ID + // unknown to this client. + BadTransactionIDs uint64 + // A running counter, incremented on each request as the current difference + // ebetween sends and receives. + CumulativeActiveRequests uint64 + // A running counter, incremented on each request by the current backlog + // queue size. + CumulativeBacklog uint64 + + // Stats below only available with stat version 1.1. + + // Maximum number of simultaneously active RPC requests ever used. + MaximumRPCSlotsUsed uint64 + // A running counter, incremented on each request as the current size of the + // sending queue. + CumulativeSendingQueue uint64 + // A running counter, incremented on each request as the current size of the + // pending queue. + CumulativePendingQueue uint64 +} + +// parseMountStats parses a /proc/[pid]/mountstats file and returns a slice +// of Mount structures containing detailed information about each mount. +// If available, statistics for each mount are parsed as well. +func parseMountStats(r io.Reader) ([]*Mount, error) { + const ( + device = "device" + statVersionPrefix = "statvers=" + + nfs3Type = "nfs" + nfs4Type = "nfs4" + ) + + var mounts []*Mount + + s := bufio.NewScanner(r) + for s.Scan() { + // Only look for device entries in this function + ss := strings.Fields(string(s.Bytes())) + if len(ss) == 0 || ss[0] != device { + continue + } + + m, err := parseMount(ss) + if err != nil { + return nil, err + } + + // Does this mount also possess statistics information? + if len(ss) > deviceEntryLen { + // Only NFSv3 and v4 are supported for parsing statistics + if m.Type != nfs3Type && m.Type != nfs4Type { + return nil, fmt.Errorf("cannot parse MountStats for fstype %q", m.Type) + } + + statVersion := strings.TrimPrefix(ss[8], statVersionPrefix) + + stats, err := parseMountStatsNFS(s, statVersion) + if err != nil { + return nil, err + } + + m.Stats = stats + } + + mounts = append(mounts, m) + } + + return mounts, s.Err() +} + +// parseMount parses an entry in /proc/[pid]/mountstats in the format: +// device [device] mounted on [mount] with fstype [type] +func parseMount(ss []string) (*Mount, error) { + if len(ss) < deviceEntryLen { + return nil, fmt.Errorf("invalid device entry: %v", ss) + } + + // Check for specific words appearing at specific indices to ensure + // the format is consistent with what we expect + format := []struct { + i int + s string + }{ + {i: 0, s: "device"}, + {i: 2, s: "mounted"}, + {i: 3, s: "on"}, + {i: 5, s: "with"}, + {i: 6, s: "fstype"}, + } + + for _, f := range format { + if ss[f.i] != f.s { + return nil, fmt.Errorf("invalid device entry: %v", ss) + } + } + + return &Mount{ + Device: ss[1], + Mount: ss[4], + Type: ss[7], + }, nil +} + +// parseMountStatsNFS parses a MountStatsNFS by scanning additional information +// related to NFS statistics. +func parseMountStatsNFS(s *bufio.Scanner, statVersion string) (*MountStatsNFS, error) { + // Field indicators for parsing specific types of data + const ( + fieldAge = "age:" + fieldBytes = "bytes:" + fieldEvents = "events:" + fieldPerOpStats = "per-op" + fieldTransport = "xprt:" + ) + + stats := &MountStatsNFS{ + StatVersion: statVersion, + } + + for s.Scan() { + ss := strings.Fields(string(s.Bytes())) + if len(ss) == 0 { + break + } + if len(ss) < 2 { + return nil, fmt.Errorf("not enough information for NFS stats: %v", ss) + } + + switch ss[0] { + case fieldAge: + // Age integer is in seconds + d, err := time.ParseDuration(ss[1] + "s") + if err != nil { + return nil, err + } + + stats.Age = d + case fieldBytes: + bstats, err := parseNFSBytesStats(ss[1:]) + if err != nil { + return nil, err + } + + stats.Bytes = *bstats + case fieldEvents: + estats, err := parseNFSEventsStats(ss[1:]) + if err != nil { + return nil, err + } + + stats.Events = *estats + case fieldTransport: + if len(ss) < 3 { + return nil, fmt.Errorf("not enough information for NFS transport stats: %v", ss) + } + + tstats, err := parseNFSTransportStats(ss[2:], statVersion) + if err != nil { + return nil, err + } + + stats.Transport = *tstats + } + + // When encountering "per-operation statistics", we must break this + // loop and parse them separately to ensure we can terminate parsing + // before reaching another device entry; hence why this 'if' statement + // is not just another switch case + if ss[0] == fieldPerOpStats { + break + } + } + + if err := s.Err(); err != nil { + return nil, err + } + + // NFS per-operation stats appear last before the next device entry + perOpStats, err := parseNFSOperationStats(s) + if err != nil { + return nil, err + } + + stats.Operations = perOpStats + + return stats, nil +} + +// parseNFSBytesStats parses a NFSBytesStats line using an input set of +// integer fields. +func parseNFSBytesStats(ss []string) (*NFSBytesStats, error) { + if len(ss) != fieldBytesLen { + return nil, fmt.Errorf("invalid NFS bytes stats: %v", ss) + } + + ns := make([]uint64, 0, fieldBytesLen) + for _, s := range ss { + n, err := strconv.ParseUint(s, 10, 64) + if err != nil { + return nil, err + } + + ns = append(ns, n) + } + + return &NFSBytesStats{ + Read: ns[0], + Write: ns[1], + DirectRead: ns[2], + DirectWrite: ns[3], + ReadTotal: ns[4], + WriteTotal: ns[5], + ReadPages: ns[6], + WritePages: ns[7], + }, nil +} + +// parseNFSEventsStats parses a NFSEventsStats line using an input set of +// integer fields. +func parseNFSEventsStats(ss []string) (*NFSEventsStats, error) { + if len(ss) != fieldEventsLen { + return nil, fmt.Errorf("invalid NFS events stats: %v", ss) + } + + ns := make([]uint64, 0, fieldEventsLen) + for _, s := range ss { + n, err := strconv.ParseUint(s, 10, 64) + if err != nil { + return nil, err + } + + ns = append(ns, n) + } + + return &NFSEventsStats{ + InodeRevalidate: ns[0], + DnodeRevalidate: ns[1], + DataInvalidate: ns[2], + AttributeInvalidate: ns[3], + VFSOpen: ns[4], + VFSLookup: ns[5], + VFSAccess: ns[6], + VFSUpdatePage: ns[7], + VFSReadPage: ns[8], + VFSReadPages: ns[9], + VFSWritePage: ns[10], + VFSWritePages: ns[11], + VFSGetdents: ns[12], + VFSSetattr: ns[13], + VFSFlush: ns[14], + VFSFsync: ns[15], + VFSLock: ns[16], + VFSFileRelease: ns[17], + CongestionWait: ns[18], + Truncation: ns[19], + WriteExtension: ns[20], + SillyRename: ns[21], + ShortRead: ns[22], + ShortWrite: ns[23], + JukeboxDelay: ns[24], + PNFSRead: ns[25], + PNFSWrite: ns[26], + }, nil +} + +// parseNFSOperationStats parses a slice of NFSOperationStats by scanning +// additional information about per-operation statistics until an empty +// line is reached. +func parseNFSOperationStats(s *bufio.Scanner) ([]NFSOperationStats, error) { + const ( + // Number of expected fields in each per-operation statistics set + numFields = 9 + ) + + var ops []NFSOperationStats + + for s.Scan() { + ss := strings.Fields(string(s.Bytes())) + if len(ss) == 0 { + // Must break when reading a blank line after per-operation stats to + // enable top-level function to parse the next device entry + break + } + + if len(ss) != numFields { + return nil, fmt.Errorf("invalid NFS per-operations stats: %v", ss) + } + + // Skip string operation name for integers + ns := make([]uint64, 0, numFields-1) + for _, st := range ss[1:] { + n, err := strconv.ParseUint(st, 10, 64) + if err != nil { + return nil, err + } + + ns = append(ns, n) + } + + ops = append(ops, NFSOperationStats{ + Operation: strings.TrimSuffix(ss[0], ":"), + Requests: ns[0], + Transmissions: ns[1], + MajorTimeouts: ns[2], + BytesSent: ns[3], + BytesReceived: ns[4], + CumulativeQueueTime: time.Duration(ns[5]) * time.Millisecond, + CumulativeTotalResponseTime: time.Duration(ns[6]) * time.Millisecond, + CumulativeTotalRequestTime: time.Duration(ns[7]) * time.Millisecond, + }) + } + + return ops, s.Err() +} + +// parseNFSTransportStats parses a NFSTransportStats line using an input set of +// integer fields matched to a specific stats version. +func parseNFSTransportStats(ss []string, statVersion string) (*NFSTransportStats, error) { + switch statVersion { + case statVersion10: + if len(ss) != fieldTransport10Len { + return nil, fmt.Errorf("invalid NFS transport stats 1.0 statement: %v", ss) + } + case statVersion11: + if len(ss) != fieldTransport11Len { + return nil, fmt.Errorf("invalid NFS transport stats 1.1 statement: %v", ss) + } + default: + return nil, fmt.Errorf("unrecognized NFS transport stats version: %q", statVersion) + } + + // Allocate enough for v1.1 stats since zero value for v1.1 stats will be okay + // in a v1.0 response. + // + // Note: slice length must be set to length of v1.1 stats to avoid a panic when + // only v1.0 stats are present. + // See: https://github.com/prometheus/node_exporter/issues/571. + ns := make([]uint64, fieldTransport11Len) + for i, s := range ss { + n, err := strconv.ParseUint(s, 10, 64) + if err != nil { + return nil, err + } + + ns[i] = n + } + + return &NFSTransportStats{ + Port: ns[0], + Bind: ns[1], + Connect: ns[2], + ConnectIdleTime: ns[3], + IdleTime: time.Duration(ns[4]) * time.Second, + Sends: ns[5], + Receives: ns[6], + BadTransactionIDs: ns[7], + CumulativeActiveRequests: ns[8], + CumulativeBacklog: ns[9], + MaximumRPCSlotsUsed: ns[10], + CumulativeSendingQueue: ns[11], + CumulativePendingQueue: ns[12], + }, nil +} diff --git a/api/vendor/github.com/prometheus/procfs/mountstats_test.go b/api/vendor/github.com/prometheus/procfs/mountstats_test.go new file mode 100644 index 0000000..7df1d15 --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/mountstats_test.go @@ -0,0 +1,286 @@ +// Copyright 2018 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 ( + "fmt" + "reflect" + "strings" + "testing" + "time" +) + +func TestMountStats(t *testing.T) { + tests := []struct { + name string + s string + mounts []*Mount + invalid bool + }{ + { + name: "no devices", + s: `hello`, + }, + { + name: "device has too few fields", + s: `device foo`, + invalid: true, + }, + { + name: "device incorrect format", + s: `device rootfs BAD on / with fstype rootfs`, + invalid: true, + }, + { + name: "device incorrect format", + s: `device rootfs mounted BAD / with fstype rootfs`, + invalid: true, + }, + { + name: "device incorrect format", + s: `device rootfs mounted on / BAD fstype rootfs`, + invalid: true, + }, + { + name: "device incorrect format", + s: `device rootfs mounted on / with BAD rootfs`, + invalid: true, + }, + { + name: "device rootfs cannot have stats", + s: `device rootfs mounted on / with fstype rootfs stats`, + invalid: true, + }, + { + name: "NFSv4 device with too little info", + s: "device 192.168.1.1:/srv mounted on /mnt/nfs with fstype nfs4 statvers=1.1\nhello", + invalid: true, + }, + { + name: "NFSv4 device with bad bytes", + s: "device 192.168.1.1:/srv mounted on /mnt/nfs with fstype nfs4 statvers=1.1\nbytes: 0", + invalid: true, + }, + { + name: "NFSv4 device with bad events", + s: "device 192.168.1.1:/srv mounted on /mnt/nfs with fstype nfs4 statvers=1.1\nevents: 0", + invalid: true, + }, + { + name: "NFSv4 device with bad per-op stats", + s: "device 192.168.1.1:/srv mounted on /mnt/nfs with fstype nfs4 statvers=1.1\nper-op statistics\nFOO 0", + invalid: true, + }, + { + name: "NFSv4 device with bad transport stats", + s: "device 192.168.1.1:/srv mounted on /mnt/nfs with fstype nfs4 statvers=1.1\nxprt: tcp", + invalid: true, + }, + { + name: "NFSv4 device with bad transport version", + s: "device 192.168.1.1:/srv mounted on /mnt/nfs with fstype nfs4 statvers=foo\nxprt: tcp 0", + invalid: true, + }, + { + name: "NFSv4 device with bad transport stats version 1.0", + s: "device 192.168.1.1:/srv mounted on /mnt/nfs with fstype nfs4 statvers=1.0\nxprt: tcp 0 0 0 0 0 0 0 0 0 0 0 0 0", + invalid: true, + }, + { + name: "NFSv4 device with bad transport stats version 1.1", + s: "device 192.168.1.1:/srv mounted on /mnt/nfs with fstype nfs4 statvers=1.1\nxprt: tcp 0 0 0 0 0 0 0 0 0 0", + invalid: true, + }, + { + name: "NFSv3 device with transport stats version 1.0 OK", + s: "device 192.168.1.1:/srv mounted on /mnt/nfs with fstype nfs statvers=1.0\nxprt: tcp 1 2 3 4 5 6 7 8 9 10", + mounts: []*Mount{{ + Device: "192.168.1.1:/srv", + Mount: "/mnt/nfs", + Type: "nfs", + Stats: &MountStatsNFS{ + StatVersion: "1.0", + Transport: NFSTransportStats{ + Port: 1, + Bind: 2, + Connect: 3, + ConnectIdleTime: 4, + IdleTime: 5 * time.Second, + Sends: 6, + Receives: 7, + BadTransactionIDs: 8, + CumulativeActiveRequests: 9, + CumulativeBacklog: 10, + }, + }, + }}, + }, + { + name: "device rootfs OK", + s: `device rootfs mounted on / with fstype rootfs`, + mounts: []*Mount{{ + Device: "rootfs", + Mount: "/", + Type: "rootfs", + }}, + }, + { + name: "NFSv3 device with minimal stats OK", + s: `device 192.168.1.1:/srv mounted on /mnt/nfs with fstype nfs statvers=1.1`, + mounts: []*Mount{{ + Device: "192.168.1.1:/srv", + Mount: "/mnt/nfs", + Type: "nfs", + Stats: &MountStatsNFS{ + StatVersion: "1.1", + }, + }}, + }, + { + name: "fixtures OK", + mounts: []*Mount{ + { + Device: "rootfs", + Mount: "/", + Type: "rootfs", + }, + { + Device: "sysfs", + Mount: "/sys", + Type: "sysfs", + }, + { + Device: "proc", + Mount: "/proc", + Type: "proc", + }, + { + Device: "/dev/sda1", + Mount: "/", + Type: "ext4", + }, + { + Device: "192.168.1.1:/srv/test", + Mount: "/mnt/nfs/test", + Type: "nfs4", + Stats: &MountStatsNFS{ + StatVersion: "1.1", + Age: 13968 * time.Second, + Bytes: NFSBytesStats{ + Read: 1207640230, + ReadTotal: 1210214218, + ReadPages: 295483, + }, + Events: NFSEventsStats{ + InodeRevalidate: 52, + DnodeRevalidate: 226, + VFSOpen: 1, + VFSLookup: 13, + VFSAccess: 398, + VFSReadPages: 331, + VFSWritePages: 47, + VFSFlush: 77, + VFSFileRelease: 77, + }, + Operations: []NFSOperationStats{ + { + Operation: "NULL", + }, + { + Operation: "READ", + Requests: 1298, + Transmissions: 1298, + BytesSent: 207680, + BytesReceived: 1210292152, + CumulativeQueueTime: 6 * time.Millisecond, + CumulativeTotalResponseTime: 79386 * time.Millisecond, + CumulativeTotalRequestTime: 79407 * time.Millisecond, + }, + { + Operation: "WRITE", + }, + }, + Transport: NFSTransportStats{ + Port: 832, + Connect: 1, + IdleTime: 11 * time.Second, + Sends: 6428, + Receives: 6428, + CumulativeActiveRequests: 12154, + MaximumRPCSlotsUsed: 24, + CumulativeSendingQueue: 26, + CumulativePendingQueue: 5726, + }, + }, + }, + }, + }, + } + + for i, tt := range tests { + t.Logf("[%02d] test %q", i, tt.name) + + var mounts []*Mount + var err error + + if tt.s != "" { + mounts, err = parseMountStats(strings.NewReader(tt.s)) + } else { + proc, e := FS("fixtures").NewProc(26231) + if e != nil { + t.Fatalf("failed to create proc: %v", err) + } + + mounts, err = proc.MountStats() + } + + if tt.invalid && err == nil { + t.Error("expected an error, but none occurred") + } + if !tt.invalid && err != nil { + t.Errorf("unexpected error: %v", err) + } + + if want, have := tt.mounts, mounts; !reflect.DeepEqual(want, have) { + t.Errorf("mounts:\nwant:\n%v\nhave:\n%v", mountsStr(want), mountsStr(have)) + } + } +} + +func mountsStr(mounts []*Mount) string { + var out string + for i, m := range mounts { + out += fmt.Sprintf("[%d] %q on %q (%q)", i, m.Device, m.Mount, m.Type) + + stats, ok := m.Stats.(*MountStatsNFS) + if !ok { + out += "\n" + continue + } + + out += fmt.Sprintf("\n\t- v%s, age: %s", stats.StatVersion, stats.Age) + out += fmt.Sprintf("\n\t- bytes: %v", stats.Bytes) + out += fmt.Sprintf("\n\t- events: %v", stats.Events) + out += fmt.Sprintf("\n\t- transport: %v", stats.Transport) + out += fmt.Sprintf("\n\t- per-operation stats:") + + for _, o := range stats.Operations { + out += fmt.Sprintf("\n\t\t- %v", o) + } + + out += "\n" + } + + return out +} diff --git a/api/vendor/github.com/prometheus/procfs/net_dev.go b/api/vendor/github.com/prometheus/procfs/net_dev.go new file mode 100644 index 0000000..3f25233 --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/net_dev.go @@ -0,0 +1,216 @@ +// Copyright 2018 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" + "errors" + "os" + "sort" + "strconv" + "strings" +) + +// NetDevLine is single line parsed from /proc/net/dev or /proc/[pid]/net/dev. +type NetDevLine struct { + Name string `json:"name"` // The name of the interface. + RxBytes uint64 `json:"rx_bytes"` // Cumulative count of bytes received. + RxPackets uint64 `json:"rx_packets"` // Cumulative count of packets received. + RxErrors uint64 `json:"rx_errors"` // Cumulative count of receive errors encountered. + RxDropped uint64 `json:"rx_dropped"` // Cumulative count of packets dropped while receiving. + RxFIFO uint64 `json:"rx_fifo"` // Cumulative count of FIFO buffer errors. + RxFrame uint64 `json:"rx_frame"` // Cumulative count of packet framing errors. + RxCompressed uint64 `json:"rx_compressed"` // Cumulative count of compressed packets received by the device driver. + RxMulticast uint64 `json:"rx_multicast"` // Cumulative count of multicast frames received by the device driver. + TxBytes uint64 `json:"tx_bytes"` // Cumulative count of bytes transmitted. + TxPackets uint64 `json:"tx_packets"` // Cumulative count of packets transmitted. + TxErrors uint64 `json:"tx_errors"` // Cumulative count of transmit errors encountered. + TxDropped uint64 `json:"tx_dropped"` // Cumulative count of packets dropped while transmitting. + TxFIFO uint64 `json:"tx_fifo"` // Cumulative count of FIFO buffer errors. + TxCollisions uint64 `json:"tx_collisions"` // Cumulative count of collisions detected on the interface. + TxCarrier uint64 `json:"tx_carrier"` // Cumulative count of carrier losses detected by the device driver. + TxCompressed uint64 `json:"tx_compressed"` // Cumulative count of compressed packets transmitted by the device driver. +} + +// NetDev is parsed from /proc/net/dev or /proc/[pid]/net/dev. The map keys +// are interface names. +type NetDev map[string]NetDevLine + +// NewNetDev returns kernel/system statistics read from /proc/net/dev. +func NewNetDev() (NetDev, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return nil, err + } + + return fs.NewNetDev() +} + +// NewNetDev returns kernel/system statistics read from /proc/net/dev. +func (fs FS) NewNetDev() (NetDev, error) { + return newNetDev(fs.Path("net/dev")) +} + +// NewNetDev returns kernel/system statistics read from /proc/[pid]/net/dev. +func (p Proc) NewNetDev() (NetDev, error) { + return newNetDev(p.path("net/dev")) +} + +// newNetDev creates a new NetDev from the contents of the given file. +func newNetDev(file string) (NetDev, error) { + f, err := os.Open(file) + if err != nil { + return NetDev{}, err + } + defer f.Close() + + nd := NetDev{} + s := bufio.NewScanner(f) + for n := 0; s.Scan(); n++ { + // Skip the 2 header lines. + if n < 2 { + continue + } + + line, err := nd.parseLine(s.Text()) + if err != nil { + return nd, err + } + + nd[line.Name] = *line + } + + return nd, s.Err() +} + +// parseLine parses a single line from the /proc/net/dev file. Header lines +// must be filtered prior to calling this method. +func (nd NetDev) parseLine(rawLine string) (*NetDevLine, error) { + parts := strings.SplitN(rawLine, ":", 2) + if len(parts) != 2 { + return nil, errors.New("invalid net/dev line, missing colon") + } + fields := strings.Fields(strings.TrimSpace(parts[1])) + + var err error + line := &NetDevLine{} + + // Interface Name + line.Name = strings.TrimSpace(parts[0]) + if line.Name == "" { + return nil, errors.New("invalid net/dev line, empty interface name") + } + + // RX + line.RxBytes, err = strconv.ParseUint(fields[0], 10, 64) + if err != nil { + return nil, err + } + line.RxPackets, err = strconv.ParseUint(fields[1], 10, 64) + if err != nil { + return nil, err + } + line.RxErrors, err = strconv.ParseUint(fields[2], 10, 64) + if err != nil { + return nil, err + } + line.RxDropped, err = strconv.ParseUint(fields[3], 10, 64) + if err != nil { + return nil, err + } + line.RxFIFO, err = strconv.ParseUint(fields[4], 10, 64) + if err != nil { + return nil, err + } + line.RxFrame, err = strconv.ParseUint(fields[5], 10, 64) + if err != nil { + return nil, err + } + line.RxCompressed, err = strconv.ParseUint(fields[6], 10, 64) + if err != nil { + return nil, err + } + line.RxMulticast, err = strconv.ParseUint(fields[7], 10, 64) + if err != nil { + return nil, err + } + + // TX + line.TxBytes, err = strconv.ParseUint(fields[8], 10, 64) + if err != nil { + return nil, err + } + line.TxPackets, err = strconv.ParseUint(fields[9], 10, 64) + if err != nil { + return nil, err + } + line.TxErrors, err = strconv.ParseUint(fields[10], 10, 64) + if err != nil { + return nil, err + } + line.TxDropped, err = strconv.ParseUint(fields[11], 10, 64) + if err != nil { + return nil, err + } + line.TxFIFO, err = strconv.ParseUint(fields[12], 10, 64) + if err != nil { + return nil, err + } + line.TxCollisions, err = strconv.ParseUint(fields[13], 10, 64) + if err != nil { + return nil, err + } + line.TxCarrier, err = strconv.ParseUint(fields[14], 10, 64) + if err != nil { + return nil, err + } + line.TxCompressed, err = strconv.ParseUint(fields[15], 10, 64) + if err != nil { + return nil, err + } + + return line, nil +} + +// Total aggregates the values across interfaces and returns a new NetDevLine. +// The Name field will be a sorted comma separated list of interface names. +func (nd NetDev) Total() NetDevLine { + total := NetDevLine{} + + names := make([]string, 0, len(nd)) + for _, ifc := range nd { + names = append(names, ifc.Name) + total.RxBytes += ifc.RxBytes + total.RxPackets += ifc.RxPackets + total.RxPackets += ifc.RxPackets + total.RxErrors += ifc.RxErrors + total.RxDropped += ifc.RxDropped + total.RxFIFO += ifc.RxFIFO + total.RxFrame += ifc.RxFrame + total.RxCompressed += ifc.RxCompressed + total.RxMulticast += ifc.RxMulticast + total.TxBytes += ifc.TxBytes + total.TxPackets += ifc.TxPackets + total.TxErrors += ifc.TxErrors + total.TxDropped += ifc.TxDropped + total.TxFIFO += ifc.TxFIFO + total.TxCollisions += ifc.TxCollisions + total.TxCarrier += ifc.TxCarrier + total.TxCompressed += ifc.TxCompressed + } + sort.Strings(names) + total.Name = strings.Join(names, ", ") + + return total +} diff --git a/api/vendor/github.com/prometheus/procfs/net_dev_test.go b/api/vendor/github.com/prometheus/procfs/net_dev_test.go new file mode 100644 index 0000000..b162e9c --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/net_dev_test.go @@ -0,0 +1,86 @@ +// Copyright 2018 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 ( + "testing" +) + +func TestNetDevParseLine(t *testing.T) { + const rawLine = ` eth0: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16` + + have, err := NetDev{}.parseLine(rawLine) + if err != nil { + t.Fatal(err) + } + + want := NetDevLine{"eth0", 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16} + if want != *have { + t.Errorf("want %v, have %v", want, have) + } +} + +func TestNewNetDev(t *testing.T) { + fs, err := NewFS("fixtures") + if err != nil { + t.Fatal(err) + } + + nd, err := fs.NewNetDev() + if err != nil { + t.Fatal(err) + } + + lines := map[string]NetDevLine{ + "vethf345468": {Name: "vethf345468", RxBytes: 648, RxPackets: 8, TxBytes: 438, TxPackets: 5}, + "lo": {Name: "lo", RxBytes: 1664039048, RxPackets: 1566805, TxBytes: 1664039048, TxPackets: 1566805}, + "docker0": {Name: "docker0", RxBytes: 2568, RxPackets: 38, TxBytes: 438, TxPackets: 5}, + "eth0": {Name: "eth0", RxBytes: 874354587, RxPackets: 1036395, TxBytes: 563352563, TxPackets: 732147}, + } + + if want, have := len(lines), len(nd); want != have { + t.Errorf("want %d parsed net/dev lines, have %d", want, have) + } + for _, line := range nd { + if want, have := lines[line.Name], line; want != have { + t.Errorf("%s: want %v, have %v", line.Name, want, have) + } + } +} + +func TestProcNewNetDev(t *testing.T) { + p, err := FS("fixtures").NewProc(26231) + if err != nil { + t.Fatal(err) + } + + nd, err := p.NewNetDev() + if err != nil { + t.Fatal(err) + } + + lines := map[string]NetDevLine{ + "lo": {Name: "lo"}, + "eth0": {Name: "eth0", RxBytes: 438, RxPackets: 5, TxBytes: 648, TxPackets: 8}, + } + + if want, have := len(lines), len(nd); want != have { + t.Errorf("want %d parsed net/dev lines, have %d", want, have) + } + for _, line := range nd { + if want, have := lines[line.Name], line; want != have { + t.Errorf("%s: want %v, have %v", line.Name, want, have) + } + } +} diff --git a/api/vendor/github.com/prometheus/procfs/nfs/nfs.go b/api/vendor/github.com/prometheus/procfs/nfs/nfs.go new file mode 100644 index 0000000..651bf68 --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/nfs/nfs.go @@ -0,0 +1,263 @@ +// Copyright 2018 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 nfs implements parsing of /proc/net/rpc/nfsd. +// Fields are documented in https://www.svennd.be/nfsd-stats-explained-procnetrpcnfsd/ +package nfs + +// ReplyCache models the "rc" line. +type ReplyCache struct { + Hits uint64 + Misses uint64 + NoCache uint64 +} + +// FileHandles models the "fh" line. +type FileHandles struct { + Stale uint64 + TotalLookups uint64 + AnonLookups uint64 + DirNoCache uint64 + NoDirNoCache uint64 +} + +// InputOutput models the "io" line. +type InputOutput struct { + Read uint64 + Write uint64 +} + +// Threads models the "th" line. +type Threads struct { + Threads uint64 + FullCnt uint64 +} + +// ReadAheadCache models the "ra" line. +type ReadAheadCache struct { + CacheSize uint64 + CacheHistogram []uint64 + NotFound uint64 +} + +// Network models the "net" line. +type Network struct { + NetCount uint64 + UDPCount uint64 + TCPCount uint64 + TCPConnect uint64 +} + +// ClientRPC models the nfs "rpc" line. +type ClientRPC struct { + RPCCount uint64 + Retransmissions uint64 + AuthRefreshes uint64 +} + +// ServerRPC models the nfsd "rpc" line. +type ServerRPC struct { + RPCCount uint64 + BadCnt uint64 + BadFmt uint64 + BadAuth uint64 + BadcInt uint64 +} + +// V2Stats models the "proc2" line. +type V2Stats struct { + Null uint64 + GetAttr uint64 + SetAttr uint64 + Root uint64 + Lookup uint64 + ReadLink uint64 + Read uint64 + WrCache uint64 + Write uint64 + Create uint64 + Remove uint64 + Rename uint64 + Link uint64 + SymLink uint64 + MkDir uint64 + RmDir uint64 + ReadDir uint64 + FsStat uint64 +} + +// V3Stats models the "proc3" line. +type V3Stats struct { + Null uint64 + GetAttr uint64 + SetAttr uint64 + Lookup uint64 + Access uint64 + ReadLink uint64 + Read uint64 + Write uint64 + Create uint64 + MkDir uint64 + SymLink uint64 + MkNod uint64 + Remove uint64 + RmDir uint64 + Rename uint64 + Link uint64 + ReadDir uint64 + ReadDirPlus uint64 + FsStat uint64 + FsInfo uint64 + PathConf uint64 + Commit uint64 +} + +// ClientV4Stats models the nfs "proc4" line. +type ClientV4Stats struct { + Null uint64 + Read uint64 + Write uint64 + Commit uint64 + Open uint64 + OpenConfirm uint64 + OpenNoattr uint64 + OpenDowngrade uint64 + Close uint64 + Setattr uint64 + FsInfo uint64 + Renew uint64 + SetClientID uint64 + SetClientIDConfirm uint64 + Lock uint64 + Lockt uint64 + Locku uint64 + Access uint64 + Getattr uint64 + Lookup uint64 + LookupRoot uint64 + Remove uint64 + Rename uint64 + Link uint64 + Symlink uint64 + Create uint64 + Pathconf uint64 + StatFs uint64 + ReadLink uint64 + ReadDir uint64 + ServerCaps uint64 + DelegReturn uint64 + GetACL uint64 + SetACL uint64 + FsLocations uint64 + ReleaseLockowner uint64 + Secinfo uint64 + FsidPresent uint64 + ExchangeID uint64 + CreateSession uint64 + DestroySession uint64 + Sequence uint64 + GetLeaseTime uint64 + ReclaimComplete uint64 + LayoutGet uint64 + GetDeviceInfo uint64 + LayoutCommit uint64 + LayoutReturn uint64 + SecinfoNoName uint64 + TestStateID uint64 + FreeStateID uint64 + GetDeviceList uint64 + BindConnToSession uint64 + DestroyClientID uint64 + Seek uint64 + Allocate uint64 + DeAllocate uint64 + LayoutStats uint64 + Clone uint64 +} + +// ServerV4Stats models the nfsd "proc4" line. +type ServerV4Stats struct { + Null uint64 + Compound uint64 +} + +// V4Ops models the "proc4ops" line: NFSv4 operations +// Variable list, see: +// v4.0 https://tools.ietf.org/html/rfc3010 (38 operations) +// v4.1 https://tools.ietf.org/html/rfc5661 (58 operations) +// v4.2 https://tools.ietf.org/html/draft-ietf-nfsv4-minorversion2-41 (71 operations) +type V4Ops struct { + //Values uint64 // Variable depending on v4.x sub-version. TODO: Will this always at least include the fields in this struct? + Op0Unused uint64 + Op1Unused uint64 + Op2Future uint64 + Access uint64 + Close uint64 + Commit uint64 + Create uint64 + DelegPurge uint64 + DelegReturn uint64 + GetAttr uint64 + GetFH uint64 + Link uint64 + Lock uint64 + Lockt uint64 + Locku uint64 + Lookup uint64 + LookupRoot uint64 + Nverify uint64 + Open uint64 + OpenAttr uint64 + OpenConfirm uint64 + OpenDgrd uint64 + PutFH uint64 + PutPubFH uint64 + PutRootFH uint64 + Read uint64 + ReadDir uint64 + ReadLink uint64 + Remove uint64 + Rename uint64 + Renew uint64 + RestoreFH uint64 + SaveFH uint64 + SecInfo uint64 + SetAttr uint64 + Verify uint64 + Write uint64 + RelLockOwner uint64 +} + +// ClientRPCStats models all stats from /proc/net/rpc/nfs. +type ClientRPCStats struct { + Network Network + ClientRPC ClientRPC + V2Stats V2Stats + V3Stats V3Stats + ClientV4Stats ClientV4Stats +} + +// ServerRPCStats models all stats from /proc/net/rpc/nfsd. +type ServerRPCStats struct { + ReplyCache ReplyCache + FileHandles FileHandles + InputOutput InputOutput + Threads Threads + ReadAheadCache ReadAheadCache + Network Network + ServerRPC ServerRPC + V2Stats V2Stats + V3Stats V3Stats + ServerV4Stats ServerV4Stats + V4Ops V4Ops +} diff --git a/api/vendor/github.com/prometheus/procfs/nfs/parse.go b/api/vendor/github.com/prometheus/procfs/nfs/parse.go new file mode 100644 index 0000000..95a83cc --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/nfs/parse.go @@ -0,0 +1,317 @@ +// Copyright 2018 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 nfs + +import ( + "fmt" +) + +func parseReplyCache(v []uint64) (ReplyCache, error) { + if len(v) != 3 { + return ReplyCache{}, fmt.Errorf("invalid ReplyCache line %q", v) + } + + return ReplyCache{ + Hits: v[0], + Misses: v[1], + NoCache: v[2], + }, nil +} + +func parseFileHandles(v []uint64) (FileHandles, error) { + if len(v) != 5 { + return FileHandles{}, fmt.Errorf("invalid FileHandles, line %q", v) + } + + return FileHandles{ + Stale: v[0], + TotalLookups: v[1], + AnonLookups: v[2], + DirNoCache: v[3], + NoDirNoCache: v[4], + }, nil +} + +func parseInputOutput(v []uint64) (InputOutput, error) { + if len(v) != 2 { + return InputOutput{}, fmt.Errorf("invalid InputOutput line %q", v) + } + + return InputOutput{ + Read: v[0], + Write: v[1], + }, nil +} + +func parseThreads(v []uint64) (Threads, error) { + if len(v) != 2 { + return Threads{}, fmt.Errorf("invalid Threads line %q", v) + } + + return Threads{ + Threads: v[0], + FullCnt: v[1], + }, nil +} + +func parseReadAheadCache(v []uint64) (ReadAheadCache, error) { + if len(v) != 12 { + return ReadAheadCache{}, fmt.Errorf("invalid ReadAheadCache line %q", v) + } + + return ReadAheadCache{ + CacheSize: v[0], + CacheHistogram: v[1:11], + NotFound: v[11], + }, nil +} + +func parseNetwork(v []uint64) (Network, error) { + if len(v) != 4 { + return Network{}, fmt.Errorf("invalid Network line %q", v) + } + + return Network{ + NetCount: v[0], + UDPCount: v[1], + TCPCount: v[2], + TCPConnect: v[3], + }, nil +} + +func parseServerRPC(v []uint64) (ServerRPC, error) { + if len(v) != 5 { + return ServerRPC{}, fmt.Errorf("invalid RPC line %q", v) + } + + return ServerRPC{ + RPCCount: v[0], + BadCnt: v[1], + BadFmt: v[2], + BadAuth: v[3], + BadcInt: v[4], + }, nil +} + +func parseClientRPC(v []uint64) (ClientRPC, error) { + if len(v) != 3 { + return ClientRPC{}, fmt.Errorf("invalid RPC line %q", v) + } + + return ClientRPC{ + RPCCount: v[0], + Retransmissions: v[1], + AuthRefreshes: v[2], + }, nil +} + +func parseV2Stats(v []uint64) (V2Stats, error) { + values := int(v[0]) + if len(v[1:]) != values || values != 18 { + return V2Stats{}, fmt.Errorf("invalid V2Stats line %q", v) + } + + return V2Stats{ + Null: v[1], + GetAttr: v[2], + SetAttr: v[3], + Root: v[4], + Lookup: v[5], + ReadLink: v[6], + Read: v[7], + WrCache: v[8], + Write: v[9], + Create: v[10], + Remove: v[11], + Rename: v[12], + Link: v[13], + SymLink: v[14], + MkDir: v[15], + RmDir: v[16], + ReadDir: v[17], + FsStat: v[18], + }, nil +} + +func parseV3Stats(v []uint64) (V3Stats, error) { + values := int(v[0]) + if len(v[1:]) != values || values != 22 { + return V3Stats{}, fmt.Errorf("invalid V3Stats line %q", v) + } + + return V3Stats{ + Null: v[1], + GetAttr: v[2], + SetAttr: v[3], + Lookup: v[4], + Access: v[5], + ReadLink: v[6], + Read: v[7], + Write: v[8], + Create: v[9], + MkDir: v[10], + SymLink: v[11], + MkNod: v[12], + Remove: v[13], + RmDir: v[14], + Rename: v[15], + Link: v[16], + ReadDir: v[17], + ReadDirPlus: v[18], + FsStat: v[19], + FsInfo: v[20], + PathConf: v[21], + Commit: v[22], + }, nil +} + +func parseClientV4Stats(v []uint64) (ClientV4Stats, error) { + values := int(v[0]) + if len(v[1:]) != values { + return ClientV4Stats{}, fmt.Errorf("invalid ClientV4Stats line %q", v) + } + + // This function currently supports mapping 59 NFS v4 client stats. Older + // kernels may emit fewer stats, so we must detect this and pad out the + // values to match the expected slice size. + if values < 59 { + newValues := make([]uint64, 60) + copy(newValues, v) + v = newValues + } + + return ClientV4Stats{ + Null: v[1], + Read: v[2], + Write: v[3], + Commit: v[4], + Open: v[5], + OpenConfirm: v[6], + OpenNoattr: v[7], + OpenDowngrade: v[8], + Close: v[9], + Setattr: v[10], + FsInfo: v[11], + Renew: v[12], + SetClientID: v[13], + SetClientIDConfirm: v[14], + Lock: v[15], + Lockt: v[16], + Locku: v[17], + Access: v[18], + Getattr: v[19], + Lookup: v[20], + LookupRoot: v[21], + Remove: v[22], + Rename: v[23], + Link: v[24], + Symlink: v[25], + Create: v[26], + Pathconf: v[27], + StatFs: v[28], + ReadLink: v[29], + ReadDir: v[30], + ServerCaps: v[31], + DelegReturn: v[32], + GetACL: v[33], + SetACL: v[34], + FsLocations: v[35], + ReleaseLockowner: v[36], + Secinfo: v[37], + FsidPresent: v[38], + ExchangeID: v[39], + CreateSession: v[40], + DestroySession: v[41], + Sequence: v[42], + GetLeaseTime: v[43], + ReclaimComplete: v[44], + LayoutGet: v[45], + GetDeviceInfo: v[46], + LayoutCommit: v[47], + LayoutReturn: v[48], + SecinfoNoName: v[49], + TestStateID: v[50], + FreeStateID: v[51], + GetDeviceList: v[52], + BindConnToSession: v[53], + DestroyClientID: v[54], + Seek: v[55], + Allocate: v[56], + DeAllocate: v[57], + LayoutStats: v[58], + Clone: v[59], + }, nil +} + +func parseServerV4Stats(v []uint64) (ServerV4Stats, error) { + values := int(v[0]) + if len(v[1:]) != values || values != 2 { + return ServerV4Stats{}, fmt.Errorf("invalid V4Stats line %q", v) + } + + return ServerV4Stats{ + Null: v[1], + Compound: v[2], + }, nil +} + +func parseV4Ops(v []uint64) (V4Ops, error) { + values := int(v[0]) + if len(v[1:]) != values || values < 39 { + return V4Ops{}, fmt.Errorf("invalid V4Ops line %q", v) + } + + stats := V4Ops{ + Op0Unused: v[1], + Op1Unused: v[2], + Op2Future: v[3], + Access: v[4], + Close: v[5], + Commit: v[6], + Create: v[7], + DelegPurge: v[8], + DelegReturn: v[9], + GetAttr: v[10], + GetFH: v[11], + Link: v[12], + Lock: v[13], + Lockt: v[14], + Locku: v[15], + Lookup: v[16], + LookupRoot: v[17], + Nverify: v[18], + Open: v[19], + OpenAttr: v[20], + OpenConfirm: v[21], + OpenDgrd: v[22], + PutFH: v[23], + PutPubFH: v[24], + PutRootFH: v[25], + Read: v[26], + ReadDir: v[27], + ReadLink: v[28], + Remove: v[29], + Rename: v[30], + Renew: v[31], + RestoreFH: v[32], + SaveFH: v[33], + SecInfo: v[34], + SetAttr: v[35], + Verify: v[36], + Write: v[37], + RelLockOwner: v[38], + } + + return stats, nil +} diff --git a/api/vendor/github.com/prometheus/procfs/nfs/parse_nfs.go b/api/vendor/github.com/prometheus/procfs/nfs/parse_nfs.go new file mode 100644 index 0000000..c0d3a5a --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/nfs/parse_nfs.go @@ -0,0 +1,67 @@ +// Copyright 2018 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 nfs + +import ( + "bufio" + "fmt" + "io" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// ParseClientRPCStats returns stats read from /proc/net/rpc/nfs +func ParseClientRPCStats(r io.Reader) (*ClientRPCStats, error) { + stats := &ClientRPCStats{} + + scanner := bufio.NewScanner(r) + for scanner.Scan() { + line := scanner.Text() + parts := strings.Fields(scanner.Text()) + // require at least + if len(parts) < 2 { + return nil, fmt.Errorf("invalid NFS metric line %q", line) + } + + values, err := util.ParseUint64s(parts[1:]) + if err != nil { + return nil, fmt.Errorf("error parsing NFS metric line: %s", err) + } + + switch metricLine := parts[0]; metricLine { + case "net": + stats.Network, err = parseNetwork(values) + case "rpc": + stats.ClientRPC, err = parseClientRPC(values) + case "proc2": + stats.V2Stats, err = parseV2Stats(values) + case "proc3": + stats.V3Stats, err = parseV3Stats(values) + case "proc4": + stats.ClientV4Stats, err = parseClientV4Stats(values) + default: + return nil, fmt.Errorf("unknown NFS metric line %q", metricLine) + } + if err != nil { + return nil, fmt.Errorf("errors parsing NFS metric line: %s", err) + } + } + + if err := scanner.Err(); err != nil { + return nil, fmt.Errorf("error scanning NFS file: %s", err) + } + + return stats, nil +} diff --git a/api/vendor/github.com/prometheus/procfs/nfs/parse_nfs_test.go b/api/vendor/github.com/prometheus/procfs/nfs/parse_nfs_test.go new file mode 100644 index 0000000..8ebcfd1 --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/nfs/parse_nfs_test.go @@ -0,0 +1,305 @@ +// Copyright 2018 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 nfs_test + +import ( + "reflect" + "strings" + "testing" + + "github.com/prometheus/procfs/nfs" +) + +func TestNewNFSClientRPCStats(t *testing.T) { + tests := []struct { + name string + content string + stats *nfs.ClientRPCStats + invalid bool + }{ + { + name: "invalid file", + content: "invalid", + invalid: true, + }, { + name: "good old kernel version file", + content: `net 70 70 69 45 +rpc 1218785755 374636 1218815394 +proc2 18 16 57 74 52 71 73 45 86 0 52 83 61 17 53 50 23 70 82 +proc3 22 0 1061909262 48906 4077635 117661341 5 29391916 2570425 2993289 590 0 0 7815 15 1130 0 3983 92385 13332 2 1 23729 +proc4 48 98 51 54 83 85 23 24 1 28 73 68 83 12 84 39 68 59 58 88 29 74 69 96 21 84 15 53 86 54 66 56 97 36 49 32 85 81 11 58 32 67 13 28 35 90 1 26 1337 +`, + stats: &nfs.ClientRPCStats{ + Network: nfs.Network{ + NetCount: 70, + UDPCount: 70, + TCPCount: 69, + TCPConnect: 45, + }, + ClientRPC: nfs.ClientRPC{ + RPCCount: 1218785755, + Retransmissions: 374636, + AuthRefreshes: 1218815394, + }, + V2Stats: nfs.V2Stats{ + Null: 16, + GetAttr: 57, + SetAttr: 74, + Root: 52, + Lookup: 71, + ReadLink: 73, + Read: 45, + WrCache: 86, + Write: 0, + Create: 52, + Remove: 83, + Rename: 61, + Link: 17, + SymLink: 53, + MkDir: 50, + RmDir: 23, + ReadDir: 70, + FsStat: 82, + }, + V3Stats: nfs.V3Stats{ + Null: 0, + GetAttr: 1061909262, + SetAttr: 48906, + Lookup: 4077635, + Access: 117661341, + ReadLink: 5, + Read: 29391916, + Write: 2570425, + Create: 2993289, + MkDir: 590, + SymLink: 0, + MkNod: 0, + Remove: 7815, + RmDir: 15, + Rename: 1130, + Link: 0, + ReadDir: 3983, + ReadDirPlus: 92385, + FsStat: 13332, + FsInfo: 2, + PathConf: 1, + Commit: 23729}, + ClientV4Stats: nfs.ClientV4Stats{ + Null: 98, + Read: 51, + Write: 54, + Commit: 83, + Open: 85, + OpenConfirm: 23, + OpenNoattr: 24, + OpenDowngrade: 1, + Close: 28, + Setattr: 73, + FsInfo: 68, + Renew: 83, + SetClientID: 12, + SetClientIDConfirm: 84, + Lock: 39, + Lockt: 68, + Locku: 59, + Access: 58, + Getattr: 88, + Lookup: 29, + LookupRoot: 74, + Remove: 69, + Rename: 96, + Link: 21, + Symlink: 84, + Create: 15, + Pathconf: 53, + StatFs: 86, + ReadLink: 54, + ReadDir: 66, + ServerCaps: 56, + DelegReturn: 97, + GetACL: 36, + SetACL: 49, + FsLocations: 32, + ReleaseLockowner: 85, + Secinfo: 81, + FsidPresent: 11, + ExchangeID: 58, + CreateSession: 32, + DestroySession: 67, + Sequence: 13, + GetLeaseTime: 28, + ReclaimComplete: 35, + LayoutGet: 90, + GetDeviceInfo: 1, + LayoutCommit: 26, + LayoutReturn: 1337, + SecinfoNoName: 0, + TestStateID: 0, + FreeStateID: 0, + GetDeviceList: 0, + BindConnToSession: 0, + DestroyClientID: 0, + Seek: 0, + Allocate: 0, + DeAllocate: 0, + LayoutStats: 0, + Clone: 0, + }, + }, + }, { + name: "good file", + content: `net 18628 0 18628 6 +rpc 4329785 0 4338291 +proc2 18 2 69 0 0 4410 0 0 0 0 0 0 0 0 0 0 0 99 2 +proc3 22 1 4084749 29200 94754 32580 186 47747 7981 8639 0 6356 0 6962 0 7958 0 0 241 4 4 2 39 +proc4 61 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 2 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 0 0 0 0 0 0 0 0 +`, + stats: &nfs.ClientRPCStats{ + Network: nfs.Network{ + NetCount: 18628, + UDPCount: 0, + TCPCount: 18628, + TCPConnect: 6, + }, + ClientRPC: nfs.ClientRPC{ + RPCCount: 4329785, + Retransmissions: 0, + AuthRefreshes: 4338291, + }, + V2Stats: nfs.V2Stats{ + Null: 2, + GetAttr: 69, + SetAttr: 0, + Root: 0, + Lookup: 4410, + ReadLink: 0, + Read: 0, + WrCache: 0, + Write: 0, + Create: 0, + Remove: 0, + Rename: 0, + Link: 0, + SymLink: 0, + MkDir: 0, + RmDir: 0, + ReadDir: 99, + FsStat: 2, + }, + V3Stats: nfs.V3Stats{ + Null: 1, + GetAttr: 4084749, + SetAttr: 29200, + Lookup: 94754, + Access: 32580, + ReadLink: 186, + Read: 47747, + Write: 7981, + Create: 8639, + MkDir: 0, + SymLink: 6356, + MkNod: 0, + Remove: 6962, + RmDir: 0, + Rename: 7958, + Link: 0, + ReadDir: 0, + ReadDirPlus: 241, + FsStat: 4, + FsInfo: 4, + PathConf: 2, + Commit: 39, + }, + ClientV4Stats: nfs.ClientV4Stats{ + Null: 1, + Read: 0, + Write: 0, + Commit: 0, + Open: 0, + OpenConfirm: 0, + OpenNoattr: 0, + OpenDowngrade: 0, + Close: 0, + Setattr: 0, + FsInfo: 0, + Renew: 0, + SetClientID: 1, + SetClientIDConfirm: 1, + Lock: 0, + Lockt: 0, + Locku: 0, + Access: 0, + Getattr: 0, + Lookup: 0, + LookupRoot: 0, + Remove: 2, + Rename: 0, + Link: 0, + Symlink: 0, + Create: 0, + Pathconf: 0, + StatFs: 0, + ReadLink: 0, + ReadDir: 0, + ServerCaps: 0, + DelegReturn: 0, + GetACL: 0, + SetACL: 0, + FsLocations: 0, + ReleaseLockowner: 0, + Secinfo: 0, + FsidPresent: 0, + ExchangeID: 0, + CreateSession: 0, + DestroySession: 0, + Sequence: 0, + GetLeaseTime: 0, + ReclaimComplete: 0, + LayoutGet: 0, + GetDeviceInfo: 0, + LayoutCommit: 0, + LayoutReturn: 0, + SecinfoNoName: 0, + TestStateID: 0, + FreeStateID: 0, + GetDeviceList: 0, + BindConnToSession: 0, + DestroyClientID: 0, + Seek: 0, + Allocate: 0, + DeAllocate: 0, + LayoutStats: 0, + Clone: 0, + }, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + stats, err := nfs.ParseClientRPCStats(strings.NewReader(tt.content)) + + if tt.invalid && err == nil { + t.Fatal("expected an error, but none occurred") + } + if !tt.invalid && err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if want, have := tt.stats, stats; !reflect.DeepEqual(want, have) { + t.Fatalf("unexpected NFS stats:\nwant:\n%v\nhave:\n%v", want, have) + } + }) + } +} diff --git a/api/vendor/github.com/prometheus/procfs/nfs/parse_nfsd.go b/api/vendor/github.com/prometheus/procfs/nfs/parse_nfsd.go new file mode 100644 index 0000000..57bb4a3 --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/nfs/parse_nfsd.go @@ -0,0 +1,89 @@ +// Copyright 2018 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 nfs + +import ( + "bufio" + "fmt" + "io" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// ParseServerRPCStats returns stats read from /proc/net/rpc/nfsd +func ParseServerRPCStats(r io.Reader) (*ServerRPCStats, error) { + stats := &ServerRPCStats{} + + scanner := bufio.NewScanner(r) + for scanner.Scan() { + line := scanner.Text() + parts := strings.Fields(scanner.Text()) + // require at least + if len(parts) < 2 { + return nil, fmt.Errorf("invalid NFSd metric line %q", line) + } + label := parts[0] + + var values []uint64 + var err error + if label == "th" { + if len(parts) < 3 { + return nil, fmt.Errorf("invalid NFSd th metric line %q", line) + } + values, err = util.ParseUint64s(parts[1:3]) + } else { + values, err = util.ParseUint64s(parts[1:]) + } + if err != nil { + return nil, fmt.Errorf("error parsing NFSd metric line: %s", err) + } + + switch metricLine := parts[0]; metricLine { + case "rc": + stats.ReplyCache, err = parseReplyCache(values) + case "fh": + stats.FileHandles, err = parseFileHandles(values) + case "io": + stats.InputOutput, err = parseInputOutput(values) + case "th": + stats.Threads, err = parseThreads(values) + case "ra": + stats.ReadAheadCache, err = parseReadAheadCache(values) + case "net": + stats.Network, err = parseNetwork(values) + case "rpc": + stats.ServerRPC, err = parseServerRPC(values) + case "proc2": + stats.V2Stats, err = parseV2Stats(values) + case "proc3": + stats.V3Stats, err = parseV3Stats(values) + case "proc4": + stats.ServerV4Stats, err = parseServerV4Stats(values) + case "proc4ops": + stats.V4Ops, err = parseV4Ops(values) + default: + return nil, fmt.Errorf("unknown NFSd metric line %q", metricLine) + } + if err != nil { + return nil, fmt.Errorf("errors parsing NFSd metric line: %s", err) + } + } + + if err := scanner.Err(); err != nil { + return nil, fmt.Errorf("error scanning NFSd file: %s", err) + } + + return stats, nil +} diff --git a/api/vendor/github.com/prometheus/procfs/nfs/parse_nfsd_test.go b/api/vendor/github.com/prometheus/procfs/nfs/parse_nfsd_test.go new file mode 100644 index 0000000..b09b3b5 --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/nfs/parse_nfsd_test.go @@ -0,0 +1,196 @@ +// Copyright 2018 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 nfs_test + +import ( + "reflect" + "strings" + "testing" + + "github.com/prometheus/procfs/nfs" +) + +func TestNewNFSdServerRPCStats(t *testing.T) { + tests := []struct { + name string + content string + stats *nfs.ServerRPCStats + invalid bool + }{ + { + name: "invalid file", + content: "invalid", + invalid: true, + }, { + name: "good file", + content: `rc 0 6 18622 +fh 0 0 0 0 0 +io 157286400 0 +th 8 0 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 +ra 32 0 0 0 0 0 0 0 0 0 0 0 +net 18628 0 18628 6 +rpc 18628 0 0 0 0 +proc2 18 2 69 0 0 4410 0 0 0 0 0 0 0 0 0 0 0 99 2 +proc3 22 2 112 0 2719 111 0 0 0 0 0 0 0 0 0 0 0 27 216 0 2 1 0 +proc4 2 2 10853 +proc4ops 72 0 0 0 1098 2 0 0 0 0 8179 5896 0 0 0 0 5900 0 0 2 0 2 0 9609 0 2 150 1272 0 0 0 1236 0 0 0 0 3 3 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 0 0 0 0 +`, + stats: &nfs.ServerRPCStats{ + ReplyCache: nfs.ReplyCache{ + Hits: 0, + Misses: 6, + NoCache: 18622, + }, + FileHandles: nfs.FileHandles{ + Stale: 0, + TotalLookups: 0, + AnonLookups: 0, + DirNoCache: 0, + NoDirNoCache: 0, + }, + InputOutput: nfs.InputOutput{ + Read: 157286400, + Write: 0, + }, + Threads: nfs.Threads{ + Threads: 8, + FullCnt: 0, + }, + ReadAheadCache: nfs.ReadAheadCache{ + CacheSize: 32, + CacheHistogram: []uint64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + NotFound: 0, + }, + Network: nfs.Network{ + NetCount: 18628, + UDPCount: 0, + TCPCount: 18628, + TCPConnect: 6, + }, + ServerRPC: nfs.ServerRPC{ + RPCCount: 18628, + BadCnt: 0, + BadFmt: 0, + BadAuth: 0, + BadcInt: 0, + }, + V2Stats: nfs.V2Stats{ + Null: 2, + GetAttr: 69, + SetAttr: 0, + Root: 0, + Lookup: 4410, + ReadLink: 0, + Read: 0, + WrCache: 0, + Write: 0, + Create: 0, + Remove: 0, + Rename: 0, + Link: 0, + SymLink: 0, + MkDir: 0, + RmDir: 0, + ReadDir: 99, + FsStat: 2, + }, + V3Stats: nfs.V3Stats{ + Null: 2, + GetAttr: 112, + SetAttr: 0, + Lookup: 2719, + Access: 111, + ReadLink: 0, + Read: 0, + Write: 0, + Create: 0, + MkDir: 0, + SymLink: 0, + MkNod: 0, + Remove: 0, + RmDir: 0, + Rename: 0, + Link: 0, + ReadDir: 27, + ReadDirPlus: 216, + FsStat: 0, + FsInfo: 2, + PathConf: 1, + Commit: 0, + }, + ServerV4Stats: nfs.ServerV4Stats{ + Null: 2, + Compound: 10853, + }, + V4Ops: nfs.V4Ops{ + Op0Unused: 0, + Op1Unused: 0, + Op2Future: 0, + Access: 1098, + Close: 2, + Commit: 0, + Create: 0, + DelegPurge: 0, + DelegReturn: 0, + GetAttr: 8179, + GetFH: 5896, + Link: 0, + Lock: 0, + Lockt: 0, + Locku: 0, + Lookup: 5900, + LookupRoot: 0, + Nverify: 0, + Open: 2, + OpenAttr: 0, + OpenConfirm: 2, + OpenDgrd: 0, + PutFH: 9609, + PutPubFH: 0, + PutRootFH: 2, + Read: 150, + ReadDir: 1272, + ReadLink: 0, + Remove: 0, + Rename: 0, + Renew: 1236, + RestoreFH: 0, + SaveFH: 0, + SecInfo: 0, + SetAttr: 0, + Verify: 3, + Write: 3, + RelLockOwner: 0, + }, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + stats, err := nfs.ParseServerRPCStats(strings.NewReader(tt.content)) + + if tt.invalid && err == nil { + t.Fatal("expected an error, but none occurred") + } + if !tt.invalid && err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if want, have := tt.stats, stats; !reflect.DeepEqual(want, have) { + t.Fatalf("unexpected NFS stats:\nwant:\n%v\nhave:\n%v", want, have) + } + }) + } +} diff --git a/api/vendor/github.com/prometheus/procfs/proc.go b/api/vendor/github.com/prometheus/procfs/proc.go new file mode 100644 index 0000000..7cf5b8a --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/proc.go @@ -0,0 +1,238 @@ +// Copyright 2018 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 ( + "bytes" + "fmt" + "io/ioutil" + "os" + "strconv" + "strings" +) + +// Proc provides information about a running process. +type Proc struct { + // The process ID. + PID int + + fs FS +} + +// Procs represents a list of Proc structs. +type Procs []Proc + +func (p Procs) Len() int { return len(p) } +func (p Procs) Swap(i, j int) { p[i], p[j] = p[j], p[i] } +func (p Procs) Less(i, j int) bool { return p[i].PID < p[j].PID } + +// Self returns a process for the current process read via /proc/self. +func Self() (Proc, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return Proc{}, err + } + return fs.Self() +} + +// NewProc returns a process for the given pid under /proc. +func NewProc(pid int) (Proc, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return Proc{}, err + } + return fs.NewProc(pid) +} + +// AllProcs returns a list of all currently available processes under /proc. +func AllProcs() (Procs, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return Procs{}, err + } + return fs.AllProcs() +} + +// Self returns a process for the current process. +func (fs FS) Self() (Proc, error) { + p, err := os.Readlink(fs.Path("self")) + if err != nil { + return Proc{}, err + } + pid, err := strconv.Atoi(strings.Replace(p, string(fs), "", -1)) + if err != nil { + return Proc{}, err + } + return fs.NewProc(pid) +} + +// NewProc returns a process for the given pid. +func (fs FS) NewProc(pid int) (Proc, error) { + if _, err := os.Stat(fs.Path(strconv.Itoa(pid))); err != nil { + return Proc{}, err + } + return Proc{PID: pid, fs: fs}, nil +} + +// AllProcs returns a list of all currently available processes. +func (fs FS) AllProcs() (Procs, error) { + d, err := os.Open(fs.Path()) + if err != nil { + return Procs{}, err + } + defer d.Close() + + names, err := d.Readdirnames(-1) + if err != nil { + return Procs{}, fmt.Errorf("could not read %s: %s", d.Name(), err) + } + + p := Procs{} + for _, n := range names { + pid, err := strconv.ParseInt(n, 10, 64) + if err != nil { + continue + } + p = append(p, Proc{PID: int(pid), fs: fs}) + } + + return p, nil +} + +// CmdLine returns the command line of a process. +func (p Proc) CmdLine() ([]string, error) { + f, err := os.Open(p.path("cmdline")) + if err != nil { + return nil, err + } + defer f.Close() + + data, err := ioutil.ReadAll(f) + if err != nil { + return nil, err + } + + if len(data) < 1 { + return []string{}, nil + } + + return strings.Split(string(bytes.TrimRight(data, string("\x00"))), string(byte(0))), nil +} + +// Comm returns the command name of a process. +func (p Proc) Comm() (string, error) { + f, err := os.Open(p.path("comm")) + if err != nil { + return "", err + } + defer f.Close() + + data, err := ioutil.ReadAll(f) + if err != nil { + return "", err + } + + return strings.TrimSpace(string(data)), nil +} + +// Executable returns the absolute path of the executable command of a process. +func (p Proc) Executable() (string, error) { + exe, err := os.Readlink(p.path("exe")) + if os.IsNotExist(err) { + return "", nil + } + + return exe, err +} + +// FileDescriptors returns the currently open file descriptors of a process. +func (p Proc) FileDescriptors() ([]uintptr, error) { + names, err := p.fileDescriptors() + if err != nil { + return nil, err + } + + fds := make([]uintptr, len(names)) + for i, n := range names { + fd, err := strconv.ParseInt(n, 10, 32) + if err != nil { + return nil, fmt.Errorf("could not parse fd %s: %s", n, err) + } + fds[i] = uintptr(fd) + } + + return fds, nil +} + +// FileDescriptorTargets returns the targets of all file descriptors of a process. +// If a file descriptor is not a symlink to a file (like a socket), that value will be the empty string. +func (p Proc) FileDescriptorTargets() ([]string, error) { + names, err := p.fileDescriptors() + if err != nil { + return nil, err + } + + targets := make([]string, len(names)) + + for i, name := range names { + target, err := os.Readlink(p.path("fd", name)) + if err == nil { + targets[i] = target + } + } + + return targets, nil +} + +// FileDescriptorsLen returns the number of currently open file descriptors of +// a process. +func (p Proc) FileDescriptorsLen() (int, error) { + fds, err := p.fileDescriptors() + if err != nil { + return 0, err + } + + return len(fds), nil +} + +// MountStats retrieves statistics and configuration for mount points in a +// process's namespace. +func (p Proc) MountStats() ([]*Mount, error) { + f, err := os.Open(p.path("mountstats")) + if err != nil { + return nil, err + } + defer f.Close() + + return parseMountStats(f) +} + +func (p Proc) fileDescriptors() ([]string, error) { + d, err := os.Open(p.path("fd")) + if err != nil { + return nil, err + } + defer d.Close() + + names, err := d.Readdirnames(-1) + if err != nil { + return nil, fmt.Errorf("could not read %s: %s", d.Name(), err) + } + + return names, nil +} + +func (p Proc) path(pa ...string) string { + return p.fs.Path(append([]string{strconv.Itoa(p.PID)}, pa...)...) +} diff --git a/api/vendor/github.com/prometheus/procfs/proc_io.go b/api/vendor/github.com/prometheus/procfs/proc_io.go new file mode 100644 index 0000000..0251c83 --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/proc_io.go @@ -0,0 +1,65 @@ +// Copyright 2018 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 ( + "fmt" + "io/ioutil" + "os" +) + +// ProcIO models the content of /proc//io. +type ProcIO struct { + // Chars read. + RChar uint64 + // Chars written. + WChar uint64 + // Read syscalls. + SyscR uint64 + // Write syscalls. + SyscW uint64 + // Bytes read. + ReadBytes uint64 + // Bytes written. + WriteBytes uint64 + // Bytes written, but taking into account truncation. See + // Documentation/filesystems/proc.txt in the kernel sources for + // detailed explanation. + CancelledWriteBytes int64 +} + +// NewIO creates a new ProcIO instance from a given Proc instance. +func (p Proc) NewIO() (ProcIO, error) { + pio := ProcIO{} + + f, err := os.Open(p.path("io")) + if err != nil { + return pio, err + } + defer f.Close() + + data, err := ioutil.ReadAll(f) + if err != nil { + return pio, err + } + + ioFormat := "rchar: %d\nwchar: %d\nsyscr: %d\nsyscw: %d\n" + + "read_bytes: %d\nwrite_bytes: %d\n" + + "cancelled_write_bytes: %d\n" + + _, err = fmt.Sscanf(string(data), ioFormat, &pio.RChar, &pio.WChar, &pio.SyscR, + &pio.SyscW, &pio.ReadBytes, &pio.WriteBytes, &pio.CancelledWriteBytes) + + return pio, err +} diff --git a/api/vendor/github.com/prometheus/procfs/proc_io_test.go b/api/vendor/github.com/prometheus/procfs/proc_io_test.go new file mode 100644 index 0000000..1afdbd4 --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/proc_io_test.go @@ -0,0 +1,46 @@ +// Copyright 2018 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 "testing" + +func TestProcIO(t *testing.T) { + p, err := FS("fixtures").NewProc(26231) + if err != nil { + t.Fatal(err) + } + + s, err := p.NewIO() + if err != nil { + t.Fatal(err) + } + + for _, test := range []struct { + name string + want int64 + have int64 + }{ + {name: "RChar", want: 750339, have: int64(s.RChar)}, + {name: "WChar", want: 818609, have: int64(s.WChar)}, + {name: "SyscR", want: 7405, have: int64(s.SyscR)}, + {name: "SyscW", want: 5245, have: int64(s.SyscW)}, + {name: "ReadBytes", want: 1024, have: int64(s.ReadBytes)}, + {name: "WriteBytes", want: 2048, have: int64(s.WriteBytes)}, + {name: "CancelledWriteBytes", want: -1024, have: s.CancelledWriteBytes}, + } { + if test.want != test.have { + t.Errorf("want %s %d, have %d", test.name, test.want, test.have) + } + } +} diff --git a/api/vendor/github.com/prometheus/procfs/proc_limits.go b/api/vendor/github.com/prometheus/procfs/proc_limits.go new file mode 100644 index 0000000..f04ba6f --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/proc_limits.go @@ -0,0 +1,150 @@ +// Copyright 2018 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" + "fmt" + "os" + "regexp" + "strconv" +) + +// ProcLimits represents the soft limits for each of the process's resource +// limits. For more information see getrlimit(2): +// http://man7.org/linux/man-pages/man2/getrlimit.2.html. +type ProcLimits struct { + // CPU time limit in seconds. + CPUTime int64 + // Maximum size of files that the process may create. + FileSize int64 + // Maximum size of the process's data segment (initialized data, + // uninitialized data, and heap). + DataSize int64 + // Maximum size of the process stack in bytes. + StackSize int64 + // Maximum size of a core file. + CoreFileSize int64 + // Limit of the process's resident set in pages. + ResidentSet int64 + // Maximum number of processes that can be created for the real user ID of + // the calling process. + Processes int64 + // Value one greater than the maximum file descriptor number that can be + // opened by this process. + OpenFiles int64 + // Maximum number of bytes of memory that may be locked into RAM. + LockedMemory int64 + // Maximum size of the process's virtual memory address space in bytes. + AddressSpace int64 + // Limit on the combined number of flock(2) locks and fcntl(2) leases that + // this process may establish. + FileLocks int64 + // Limit of signals that may be queued for the real user ID of the calling + // process. + PendingSignals int64 + // Limit on the number of bytes that can be allocated for POSIX message + // queues for the real user ID of the calling process. + MsqqueueSize int64 + // Limit of the nice priority set using setpriority(2) or nice(2). + NicePriority int64 + // Limit of the real-time priority set using sched_setscheduler(2) or + // sched_setparam(2). + RealtimePriority int64 + // Limit (in microseconds) on the amount of CPU time that a process + // scheduled under a real-time scheduling policy may consume without making + // a blocking system call. + RealtimeTimeout int64 +} + +const ( + limitsFields = 3 + limitsUnlimited = "unlimited" +) + +var ( + limitsDelimiter = regexp.MustCompile(" +") +) + +// NewLimits returns the current soft limits of the process. +func (p Proc) NewLimits() (ProcLimits, error) { + f, err := os.Open(p.path("limits")) + if err != nil { + return ProcLimits{}, err + } + defer f.Close() + + var ( + l = ProcLimits{} + s = bufio.NewScanner(f) + ) + for s.Scan() { + fields := limitsDelimiter.Split(s.Text(), limitsFields) + if len(fields) != limitsFields { + return ProcLimits{}, fmt.Errorf( + "couldn't parse %s line %s", f.Name(), s.Text()) + } + + switch fields[0] { + case "Max cpu time": + l.CPUTime, err = parseInt(fields[1]) + case "Max file size": + l.FileSize, err = parseInt(fields[1]) + case "Max data size": + l.DataSize, err = parseInt(fields[1]) + case "Max stack size": + l.StackSize, err = parseInt(fields[1]) + case "Max core file size": + l.CoreFileSize, err = parseInt(fields[1]) + case "Max resident set": + l.ResidentSet, err = parseInt(fields[1]) + case "Max processes": + l.Processes, err = parseInt(fields[1]) + case "Max open files": + l.OpenFiles, err = parseInt(fields[1]) + case "Max locked memory": + l.LockedMemory, err = parseInt(fields[1]) + case "Max address space": + l.AddressSpace, err = parseInt(fields[1]) + case "Max file locks": + l.FileLocks, err = parseInt(fields[1]) + case "Max pending signals": + l.PendingSignals, err = parseInt(fields[1]) + case "Max msgqueue size": + l.MsqqueueSize, err = parseInt(fields[1]) + case "Max nice priority": + l.NicePriority, err = parseInt(fields[1]) + case "Max realtime priority": + l.RealtimePriority, err = parseInt(fields[1]) + case "Max realtime timeout": + l.RealtimeTimeout, err = parseInt(fields[1]) + } + if err != nil { + return ProcLimits{}, err + } + } + + return l, s.Err() +} + +func parseInt(s string) (int64, error) { + if s == limitsUnlimited { + return -1, nil + } + i, err := strconv.ParseInt(s, 10, 64) + if err != nil { + return 0, fmt.Errorf("couldn't parse value %s: %s", s, err) + } + return i, nil +} diff --git a/api/vendor/github.com/prometheus/procfs/proc_limits_test.go b/api/vendor/github.com/prometheus/procfs/proc_limits_test.go new file mode 100644 index 0000000..ebb43ae --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/proc_limits_test.go @@ -0,0 +1,44 @@ +// Copyright 2018 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 "testing" + +func TestNewLimits(t *testing.T) { + p, err := FS("fixtures").NewProc(26231) + if err != nil { + t.Fatal(err) + } + + l, err := p.NewLimits() + if err != nil { + t.Fatal(err) + } + + for _, test := range []struct { + name string + want int64 + have int64 + }{ + {name: "cpu time", want: -1, have: l.CPUTime}, + {name: "open files", want: 2048, have: l.OpenFiles}, + {name: "msgqueue size", want: 819200, have: l.MsqqueueSize}, + {name: "nice priority", want: 0, have: l.NicePriority}, + {name: "address space", want: 8589934592, have: l.AddressSpace}, + } { + if test.want != test.have { + t.Errorf("want %s %d, have %d", test.name, test.want, test.have) + } + } +} diff --git a/api/vendor/github.com/prometheus/procfs/proc_ns.go b/api/vendor/github.com/prometheus/procfs/proc_ns.go new file mode 100644 index 0000000..d06c26e --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/proc_ns.go @@ -0,0 +1,68 @@ +// Copyright 2018 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 ( + "fmt" + "os" + "strconv" + "strings" +) + +// Namespace represents a single namespace of a process. +type Namespace struct { + Type string // Namespace type. + Inode uint32 // Inode number of the namespace. If two processes are in the same namespace their inodes will match. +} + +// Namespaces contains all of the namespaces that the process is contained in. +type Namespaces map[string]Namespace + +// NewNamespaces reads from /proc/[pid/ns/* to get the namespaces of which the +// process is a member. +func (p Proc) NewNamespaces() (Namespaces, error) { + d, err := os.Open(p.path("ns")) + if err != nil { + return nil, err + } + defer d.Close() + + names, err := d.Readdirnames(-1) + if err != nil { + return nil, fmt.Errorf("failed to read contents of ns dir: %v", err) + } + + ns := make(Namespaces, len(names)) + for _, name := range names { + target, err := os.Readlink(p.path("ns", name)) + if err != nil { + return nil, err + } + + fields := strings.SplitN(target, ":", 2) + if len(fields) != 2 { + return nil, fmt.Errorf("failed to parse namespace type and inode from '%v'", target) + } + + typ := fields[0] + inode, err := strconv.ParseUint(strings.Trim(fields[1], "[]"), 10, 32) + if err != nil { + return nil, fmt.Errorf("failed to parse inode from '%v': %v", fields[1], err) + } + + ns[name] = Namespace{typ, uint32(inode)} + } + + return ns, nil +} diff --git a/api/vendor/github.com/prometheus/procfs/proc_ns_test.go b/api/vendor/github.com/prometheus/procfs/proc_ns_test.go new file mode 100644 index 0000000..abfd63e --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/proc_ns_test.go @@ -0,0 +1,44 @@ +// Copyright 2018 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 ( + "testing" +) + +func TestNewNamespaces(t *testing.T) { + p, err := FS("fixtures").NewProc(26231) + if err != nil { + t.Fatal(err) + } + + namespaces, err := p.NewNamespaces() + if err != nil { + t.Fatal(err) + } + + expectedNamespaces := map[string]Namespace{ + "mnt": {"mnt", 4026531840}, + "net": {"net", 4026531993}, + } + + if want, have := len(expectedNamespaces), len(namespaces); want != have { + t.Errorf("want %d parsed namespaces, have %d", want, have) + } + for _, ns := range namespaces { + if want, have := expectedNamespaces[ns.Type], ns; want != have { + t.Errorf("%s: want %v, have %v", ns.Type, want, have) + } + } +} diff --git a/api/vendor/github.com/prometheus/procfs/proc_stat.go b/api/vendor/github.com/prometheus/procfs/proc_stat.go new file mode 100644 index 0000000..3cf2a9f --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/proc_stat.go @@ -0,0 +1,188 @@ +// Copyright 2018 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 ( + "bytes" + "fmt" + "io/ioutil" + "os" +) + +// Originally, this USER_HZ value was dynamically retrieved via a sysconf call +// which required cgo. However, that caused a lot of problems regarding +// cross-compilation. Alternatives such as running a binary to determine the +// value, or trying to derive it in some other way were all problematic. After +// much research it was determined that USER_HZ is actually hardcoded to 100 on +// all Go-supported platforms as of the time of this writing. This is why we +// decided to hardcode it here as well. It is not impossible that there could +// be systems with exceptions, but they should be very exotic edge cases, and +// in that case, the worst outcome will be two misreported metrics. +// +// See also the following discussions: +// +// - https://github.com/prometheus/node_exporter/issues/52 +// - https://github.com/prometheus/procfs/pull/2 +// - http://stackoverflow.com/questions/17410841/how-does-user-hz-solve-the-jiffy-scaling-issue +const userHZ = 100 + +// ProcStat provides status information about the process, +// read from /proc/[pid]/stat. +type ProcStat struct { + // The process ID. + PID int + // The filename of the executable. + Comm string + // The process state. + State string + // The PID of the parent of this process. + PPID int + // The process group ID of the process. + PGRP int + // The session ID of the process. + Session int + // The controlling terminal of the process. + TTY int + // The ID of the foreground process group of the controlling terminal of + // the process. + TPGID int + // The kernel flags word of the process. + Flags uint + // The number of minor faults the process has made which have not required + // loading a memory page from disk. + MinFlt uint + // The number of minor faults that the process's waited-for children have + // made. + CMinFlt uint + // The number of major faults the process has made which have required + // loading a memory page from disk. + MajFlt uint + // The number of major faults that the process's waited-for children have + // made. + CMajFlt uint + // Amount of time that this process has been scheduled in user mode, + // measured in clock ticks. + UTime uint + // Amount of time that this process has been scheduled in kernel mode, + // measured in clock ticks. + STime uint + // Amount of time that this process's waited-for children have been + // scheduled in user mode, measured in clock ticks. + CUTime uint + // Amount of time that this process's waited-for children have been + // scheduled in kernel mode, measured in clock ticks. + CSTime uint + // For processes running a real-time scheduling policy, this is the negated + // scheduling priority, minus one. + Priority int + // The nice value, a value in the range 19 (low priority) to -20 (high + // priority). + Nice int + // Number of threads in this process. + NumThreads int + // The time the process started after system boot, the value is expressed + // in clock ticks. + Starttime uint64 + // Virtual memory size in bytes. + VSize int + // Resident set size in pages. + RSS int + + fs FS +} + +// NewStat returns the current status information of the process. +func (p Proc) NewStat() (ProcStat, error) { + f, err := os.Open(p.path("stat")) + if err != nil { + return ProcStat{}, err + } + defer f.Close() + + data, err := ioutil.ReadAll(f) + if err != nil { + return ProcStat{}, err + } + + var ( + ignore int + + s = ProcStat{PID: p.PID, fs: p.fs} + l = bytes.Index(data, []byte("(")) + r = bytes.LastIndex(data, []byte(")")) + ) + + if l < 0 || r < 0 { + return ProcStat{}, fmt.Errorf( + "unexpected format, couldn't extract comm: %s", + data, + ) + } + + s.Comm = string(data[l+1 : r]) + _, err = fmt.Fscan( + bytes.NewBuffer(data[r+2:]), + &s.State, + &s.PPID, + &s.PGRP, + &s.Session, + &s.TTY, + &s.TPGID, + &s.Flags, + &s.MinFlt, + &s.CMinFlt, + &s.MajFlt, + &s.CMajFlt, + &s.UTime, + &s.STime, + &s.CUTime, + &s.CSTime, + &s.Priority, + &s.Nice, + &s.NumThreads, + &ignore, + &s.Starttime, + &s.VSize, + &s.RSS, + ) + if err != nil { + return ProcStat{}, err + } + + return s, nil +} + +// VirtualMemory returns the virtual memory size in bytes. +func (s ProcStat) VirtualMemory() int { + return s.VSize +} + +// ResidentMemory returns the resident memory size in bytes. +func (s ProcStat) ResidentMemory() int { + return s.RSS * os.Getpagesize() +} + +// StartTime returns the unix timestamp of the process in seconds. +func (s ProcStat) StartTime() (float64, error) { + stat, err := s.fs.NewStat() + if err != nil { + return 0, err + } + return float64(stat.BootTime) + (float64(s.Starttime) / userHZ), nil +} + +// CPUTime returns the total CPU user and system time in seconds. +func (s ProcStat) CPUTime() float64 { + return float64(s.UTime+s.STime) / userHZ +} diff --git a/api/vendor/github.com/prometheus/procfs/proc_stat_test.go b/api/vendor/github.com/prometheus/procfs/proc_stat_test.go new file mode 100644 index 0000000..e2df884 --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/proc_stat_test.go @@ -0,0 +1,123 @@ +// Copyright 2018 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 ( + "os" + "testing" +) + +func TestProcStat(t *testing.T) { + p, err := FS("fixtures").NewProc(26231) + if err != nil { + t.Fatal(err) + } + + s, err := p.NewStat() + if err != nil { + t.Fatal(err) + } + + for _, test := range []struct { + name string + want int + have int + }{ + {name: "pid", want: 26231, have: s.PID}, + {name: "user time", want: 1677, have: int(s.UTime)}, + {name: "system time", want: 44, have: int(s.STime)}, + {name: "start time", want: 82375, have: int(s.Starttime)}, + {name: "virtual memory size", want: 56274944, have: s.VSize}, + {name: "resident set size", want: 1981, have: s.RSS}, + } { + if test.want != test.have { + t.Errorf("want %s %d, have %d", test.name, test.want, test.have) + } + } +} + +func TestProcStatComm(t *testing.T) { + s1, err := testProcStat(26231) + if err != nil { + t.Fatal(err) + } + if want, have := "vim", s1.Comm; want != have { + t.Errorf("want comm %s, have %s", want, have) + } + + s2, err := testProcStat(584) + if err != nil { + t.Fatal(err) + } + if want, have := "(a b ) ( c d) ", s2.Comm; want != have { + t.Errorf("want comm %s, have %s", want, have) + } +} + +func TestProcStatVirtualMemory(t *testing.T) { + s, err := testProcStat(26231) + if err != nil { + t.Fatal(err) + } + + if want, have := 56274944, s.VirtualMemory(); want != have { + t.Errorf("want virtual memory %d, have %d", want, have) + } +} + +func TestProcStatResidentMemory(t *testing.T) { + s, err := testProcStat(26231) + if err != nil { + t.Fatal(err) + } + + if want, have := 1981*os.Getpagesize(), s.ResidentMemory(); want != have { + t.Errorf("want resident memory %d, have %d", want, have) + } +} + +func TestProcStatStartTime(t *testing.T) { + s, err := testProcStat(26231) + if err != nil { + t.Fatal(err) + } + + time, err := s.StartTime() + if err != nil { + t.Fatal(err) + } + if want, have := 1418184099.75, time; want != have { + t.Errorf("want start time %f, have %f", want, have) + } +} + +func TestProcStatCPUTime(t *testing.T) { + s, err := testProcStat(26231) + if err != nil { + t.Fatal(err) + } + + if want, have := 17.21, s.CPUTime(); want != have { + t.Errorf("want cpu time %f, have %f", want, have) + } +} + +func testProcStat(pid int) (ProcStat, error) { + p, err := FS("fixtures").NewProc(pid) + if err != nil { + return ProcStat{}, err + } + + return p.NewStat() +} diff --git a/api/vendor/github.com/prometheus/procfs/proc_test.go b/api/vendor/github.com/prometheus/procfs/proc_test.go new file mode 100644 index 0000000..ee7e69d --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/proc_test.go @@ -0,0 +1,174 @@ +// Copyright 2018 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 ( + "reflect" + "sort" + "testing" +) + +func TestSelf(t *testing.T) { + fs := FS("fixtures") + + p1, err := fs.NewProc(26231) + if err != nil { + t.Fatal(err) + } + p2, err := fs.Self() + if err != nil { + t.Fatal(err) + } + + if !reflect.DeepEqual(p1, p2) { + t.Errorf("want process %v, have %v", p1, p2) + } +} + +func TestAllProcs(t *testing.T) { + procs, err := FS("fixtures").AllProcs() + if err != nil { + t.Fatal(err) + } + sort.Sort(procs) + for i, p := range []*Proc{{PID: 584}, {PID: 26231}} { + if want, have := p.PID, procs[i].PID; want != have { + t.Errorf("want processes %d, have %d", want, have) + } + } +} + +func TestCmdLine(t *testing.T) { + for _, tt := range []struct { + process int + want []string + }{ + {process: 26231, want: []string{"vim", "test.go", "+10"}}, + {process: 26232, want: []string{}}, + {process: 26233, want: []string{"com.github.uiautomator"}}, + } { + p1, err := FS("fixtures").NewProc(tt.process) + if err != nil { + t.Fatal(err) + } + c1, err := p1.CmdLine() + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(tt.want, c1) { + t.Errorf("want cmdline %v, have %v", tt.want, c1) + } + } +} + +func TestComm(t *testing.T) { + for _, tt := range []struct { + process int + want string + }{ + {process: 26231, want: "vim"}, + {process: 26232, want: "ata_sff"}, + } { + p1, err := FS("fixtures").NewProc(tt.process) + if err != nil { + t.Fatal(err) + } + c1, err := p1.Comm() + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(tt.want, c1) { + t.Errorf("want comm %v, have %v", tt.want, c1) + } + } +} + +func TestExecutable(t *testing.T) { + for _, tt := range []struct { + process int + want string + }{ + {process: 26231, want: "/usr/bin/vim"}, + {process: 26232, want: ""}, + } { + p, err := FS("fixtures").NewProc(tt.process) + if err != nil { + t.Fatal(err) + } + exe, err := p.Executable() + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(tt.want, exe) { + t.Errorf("want absolute path to cmdline %v, have %v", tt.want, exe) + } + } +} + +func TestFileDescriptors(t *testing.T) { + p1, err := FS("fixtures").NewProc(26231) + if err != nil { + t.Fatal(err) + } + fds, err := p1.FileDescriptors() + if err != nil { + t.Fatal(err) + } + sort.Sort(byUintptr(fds)) + if want := []uintptr{0, 1, 2, 3, 10}; !reflect.DeepEqual(want, fds) { + t.Errorf("want fds %v, have %v", want, fds) + } +} + +func TestFileDescriptorTargets(t *testing.T) { + p1, err := FS("fixtures").NewProc(26231) + if err != nil { + t.Fatal(err) + } + fds, err := p1.FileDescriptorTargets() + if err != nil { + t.Fatal(err) + } + sort.Strings(fds) + var want = []string{ + "../../symlinktargets/abc", + "../../symlinktargets/def", + "../../symlinktargets/ghi", + "../../symlinktargets/uvw", + "../../symlinktargets/xyz", + } + if !reflect.DeepEqual(want, fds) { + t.Errorf("want fds %v, have %v", want, fds) + } +} + +func TestFileDescriptorsLen(t *testing.T) { + p1, err := FS("fixtures").NewProc(26231) + if err != nil { + t.Fatal(err) + } + l, err := p1.FileDescriptorsLen() + if err != nil { + t.Fatal(err) + } + if want, have := 5, l; want != have { + t.Errorf("want fds %d, have %d", want, have) + } +} + +type byUintptr []uintptr + +func (a byUintptr) Len() int { return len(a) } +func (a byUintptr) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a byUintptr) Less(i, j int) bool { return a[i] < a[j] } diff --git a/api/vendor/github.com/prometheus/procfs/scripts/check_license.sh b/api/vendor/github.com/prometheus/procfs/scripts/check_license.sh new file mode 100755 index 0000000..ac13e96 --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/scripts/check_license.sh @@ -0,0 +1,29 @@ +#!/bin/sh +# +# Copyright 2018 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. + +check_license() { + local file="" + for file in $(find . -type f -iname '*.go' ! -path './vendor/*'); do + head -n3 "${file}" | grep -Eq "(Copyright|generated|GENERATED)" || echo " ${file}" + done +} + +licRes=$(check_license) + +if [ -n "${licRes}" ]; then + echo "license header checking failed:" + echo "${licRes}" + exit 255 +fi diff --git a/api/vendor/github.com/prometheus/procfs/stat.go b/api/vendor/github.com/prometheus/procfs/stat.go new file mode 100644 index 0000000..61eb6b0 --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/stat.go @@ -0,0 +1,232 @@ +// Copyright 2018 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" + "fmt" + "io" + "os" + "strconv" + "strings" +) + +// CPUStat shows how much time the cpu spend in various stages. +type CPUStat struct { + User float64 + Nice float64 + System float64 + Idle float64 + Iowait float64 + IRQ float64 + SoftIRQ float64 + Steal float64 + Guest float64 + GuestNice float64 +} + +// SoftIRQStat represent the softirq statistics as exported in the procfs stat file. +// A nice introduction can be found at https://0xax.gitbooks.io/linux-insides/content/interrupts/interrupts-9.html +// It is possible to get per-cpu stats by reading /proc/softirqs +type SoftIRQStat struct { + Hi uint64 + Timer uint64 + NetTx uint64 + NetRx uint64 + Block uint64 + BlockIoPoll uint64 + Tasklet uint64 + Sched uint64 + Hrtimer uint64 + Rcu uint64 +} + +// Stat represents kernel/system statistics. +type Stat struct { + // Boot time in seconds since the Epoch. + BootTime uint64 + // Summed up cpu statistics. + CPUTotal CPUStat + // Per-CPU statistics. + CPU []CPUStat + // Number of times interrupts were handled, which contains numbered and unnumbered IRQs. + IRQTotal uint64 + // Number of times a numbered IRQ was triggered. + IRQ []uint64 + // Number of times a context switch happened. + ContextSwitches uint64 + // Number of times a process was created. + ProcessCreated uint64 + // Number of processes currently running. + ProcessesRunning uint64 + // Number of processes currently blocked (waiting for IO). + ProcessesBlocked uint64 + // Number of times a softirq was scheduled. + SoftIRQTotal uint64 + // Detailed softirq statistics. + SoftIRQ SoftIRQStat +} + +// NewStat returns kernel/system statistics read from /proc/stat. +func NewStat() (Stat, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return Stat{}, err + } + + return fs.NewStat() +} + +// Parse a cpu statistics line and returns the CPUStat struct plus the cpu id (or -1 for the overall sum). +func parseCPUStat(line string) (CPUStat, int64, error) { + cpuStat := CPUStat{} + var cpu string + + count, err := fmt.Sscanf(line, "%s %f %f %f %f %f %f %f %f %f %f", + &cpu, + &cpuStat.User, &cpuStat.Nice, &cpuStat.System, &cpuStat.Idle, + &cpuStat.Iowait, &cpuStat.IRQ, &cpuStat.SoftIRQ, &cpuStat.Steal, + &cpuStat.Guest, &cpuStat.GuestNice) + + if err != nil && err != io.EOF { + return CPUStat{}, -1, fmt.Errorf("couldn't parse %s (cpu): %s", line, err) + } + if count == 0 { + return CPUStat{}, -1, fmt.Errorf("couldn't parse %s (cpu): 0 elements parsed", line) + } + + cpuStat.User /= userHZ + cpuStat.Nice /= userHZ + cpuStat.System /= userHZ + cpuStat.Idle /= userHZ + cpuStat.Iowait /= userHZ + cpuStat.IRQ /= userHZ + cpuStat.SoftIRQ /= userHZ + cpuStat.Steal /= userHZ + cpuStat.Guest /= userHZ + cpuStat.GuestNice /= userHZ + + if cpu == "cpu" { + return cpuStat, -1, nil + } + + cpuID, err := strconv.ParseInt(cpu[3:], 10, 64) + if err != nil { + return CPUStat{}, -1, fmt.Errorf("couldn't parse %s (cpu/cpuid): %s", line, err) + } + + return cpuStat, cpuID, nil +} + +// Parse a softirq line. +func parseSoftIRQStat(line string) (SoftIRQStat, uint64, error) { + softIRQStat := SoftIRQStat{} + var total uint64 + var prefix string + + _, err := fmt.Sscanf(line, "%s %d %d %d %d %d %d %d %d %d %d %d", + &prefix, &total, + &softIRQStat.Hi, &softIRQStat.Timer, &softIRQStat.NetTx, &softIRQStat.NetRx, + &softIRQStat.Block, &softIRQStat.BlockIoPoll, + &softIRQStat.Tasklet, &softIRQStat.Sched, + &softIRQStat.Hrtimer, &softIRQStat.Rcu) + + if err != nil { + return SoftIRQStat{}, 0, fmt.Errorf("couldn't parse %s (softirq): %s", line, err) + } + + return softIRQStat, total, nil +} + +// NewStat returns an information about current kernel/system statistics. +func (fs FS) NewStat() (Stat, error) { + // See https://www.kernel.org/doc/Documentation/filesystems/proc.txt + + f, err := os.Open(fs.Path("stat")) + if err != nil { + return Stat{}, err + } + defer f.Close() + + stat := Stat{} + + scanner := bufio.NewScanner(f) + for scanner.Scan() { + line := scanner.Text() + parts := strings.Fields(scanner.Text()) + // require at least + if len(parts) < 2 { + continue + } + switch { + case parts[0] == "btime": + if stat.BootTime, err = strconv.ParseUint(parts[1], 10, 64); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s (btime): %s", parts[1], err) + } + case parts[0] == "intr": + if stat.IRQTotal, err = strconv.ParseUint(parts[1], 10, 64); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s (intr): %s", parts[1], err) + } + numberedIRQs := parts[2:] + stat.IRQ = make([]uint64, len(numberedIRQs)) + for i, count := range numberedIRQs { + if stat.IRQ[i], err = strconv.ParseUint(count, 10, 64); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s (intr%d): %s", count, i, err) + } + } + case parts[0] == "ctxt": + if stat.ContextSwitches, err = strconv.ParseUint(parts[1], 10, 64); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s (ctxt): %s", parts[1], err) + } + case parts[0] == "processes": + if stat.ProcessCreated, err = strconv.ParseUint(parts[1], 10, 64); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s (processes): %s", parts[1], err) + } + case parts[0] == "procs_running": + if stat.ProcessesRunning, err = strconv.ParseUint(parts[1], 10, 64); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s (procs_running): %s", parts[1], err) + } + case parts[0] == "procs_blocked": + if stat.ProcessesBlocked, err = strconv.ParseUint(parts[1], 10, 64); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s (procs_blocked): %s", parts[1], err) + } + case parts[0] == "softirq": + softIRQStats, total, err := parseSoftIRQStat(line) + if err != nil { + return Stat{}, err + } + stat.SoftIRQTotal = total + stat.SoftIRQ = softIRQStats + case strings.HasPrefix(parts[0], "cpu"): + cpuStat, cpuID, err := parseCPUStat(line) + if err != nil { + return Stat{}, err + } + if cpuID == -1 { + stat.CPUTotal = cpuStat + } else { + for int64(len(stat.CPU)) <= cpuID { + stat.CPU = append(stat.CPU, CPUStat{}) + } + stat.CPU[cpuID] = cpuStat + } + } + } + + if err := scanner.Err(); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s: %s", f.Name(), err) + } + + return stat, nil +} diff --git a/api/vendor/github.com/prometheus/procfs/stat_test.go b/api/vendor/github.com/prometheus/procfs/stat_test.go new file mode 100644 index 0000000..2043b5e --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/stat_test.go @@ -0,0 +1,74 @@ +// Copyright 2018 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 "testing" + +func TestStat(t *testing.T) { + s, err := FS("fixtures").NewStat() + if err != nil { + t.Fatal(err) + } + + // cpu + if want, have := float64(301854)/userHZ, s.CPUTotal.User; want != have { + t.Errorf("want cpu/user %v, have %v", want, have) + } + if want, have := float64(31)/userHZ, s.CPU[7].SoftIRQ; want != have { + t.Errorf("want cpu7/softirq %v, have %v", want, have) + } + + // intr + if want, have := uint64(8885917), s.IRQTotal; want != have { + t.Errorf("want irq/total %d, have %d", want, have) + } + if want, have := uint64(1), s.IRQ[8]; want != have { + t.Errorf("want irq8 %d, have %d", want, have) + } + + // ctxt + if want, have := uint64(38014093), s.ContextSwitches; want != have { + t.Errorf("want context switches (ctxt) %d, have %d", want, have) + } + + // btime + if want, have := uint64(1418183276), s.BootTime; want != have { + t.Errorf("want boot time (btime) %d, have %d", want, have) + } + + // processes + if want, have := uint64(26442), s.ProcessCreated; want != have { + t.Errorf("want process created (processes) %d, have %d", want, have) + } + + // procs_running + if want, have := uint64(2), s.ProcessesRunning; want != have { + t.Errorf("want processes running (procs_running) %d, have %d", want, have) + } + + // procs_blocked + if want, have := uint64(1), s.ProcessesBlocked; want != have { + t.Errorf("want processes blocked (procs_blocked) %d, have %d", want, have) + } + + // softirq + if want, have := uint64(5057579), s.SoftIRQTotal; want != have { + t.Errorf("want softirq total %d, have %d", want, have) + } + + if want, have := uint64(508444), s.SoftIRQ.Rcu; want != have { + t.Errorf("want softirq RCU %d, have %d", want, have) + } + +} diff --git a/api/vendor/github.com/prometheus/procfs/sysfs/.gitignore b/api/vendor/github.com/prometheus/procfs/sysfs/.gitignore new file mode 100644 index 0000000..67fc140 --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/sysfs/.gitignore @@ -0,0 +1 @@ +fixtures/ diff --git a/api/vendor/github.com/prometheus/procfs/sysfs/doc.go b/api/vendor/github.com/prometheus/procfs/sysfs/doc.go new file mode 100644 index 0000000..9a6c244 --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/sysfs/doc.go @@ -0,0 +1,16 @@ +// Copyright 2017 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 sysfs provides functions to retrieve system and kernel metrics +// from the pseudo-filesystem sys. +package sysfs diff --git a/api/vendor/github.com/prometheus/procfs/sysfs/fixtures.ttar b/api/vendor/github.com/prometheus/procfs/sysfs/fixtures.ttar new file mode 100644 index 0000000..8e665ce --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/sysfs/fixtures.ttar @@ -0,0 +1,851 @@ +# Archive created by ttar -c -f fixtures.ttar fixtures/ +Directory: fixtures +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00/0000:00:0d.0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00/0000:00:0d.0/ata4 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/dirty_data +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_hit_ratio +Lines: 1 +100 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_hits +Lines: 1 +289 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_hit_ratio +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_hit_ratio +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_hit_ratio +Lines: 1 +100 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_hits +Lines: 1 +546 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00/0000:00:0d.0/ata5 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00/0000:00:0d.0/ata5/host4 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block/sdc +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block/sdc/bcache +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block/sdc/bcache/io_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block/sdc/bcache/metadata_written +Lines: 1 +512 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block/sdc/bcache/priority_stats +Lines: 5 +Unused: 99% +Metadata: 0% +Average: 10473 +Sectors per Q: 64 +Quantiles: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946] +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block/sdc/bcache/written +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs/bcache +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/average_key_size +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0 +Mode: 777 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/dirty_data +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_hit_ratio +Lines: 1 +100 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_hits +Lines: 1 +289 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_hit_ratio +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_hit_ratio +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_hit_ratio +Lines: 1 +100 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_hits +Lines: 1 +546 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/btree_cache_size +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/cache0 +Mode: 777 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/cache0/io_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/cache0/metadata_written +Lines: 1 +512 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/cache0/priority_stats +Lines: 5 +Unused: 99% +Metadata: 0% +Average: 10473 +Sectors per Q: 64 +Quantiles: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946] +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/cache0/written +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/cache_available_percent +Lines: 1 +100 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/congested +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/internal +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/internal/active_journal_entries +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/internal/btree_nodes +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/internal/btree_read_average_duration_us +Lines: 1 +1305 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/internal/cache_read_races +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/root_usage_percent +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_hit_ratio +Lines: 1 +100 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_hits +Lines: 1 +289 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_hit_ratio +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_hit_ratio +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_hit_ratio +Lines: 1 +100 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_hits +Lines: 1 +546 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/tree_depth +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs/xfs +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs/xfs/sda1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs/xfs/sda1/stats +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/xfs/sda1/stats/stats +Lines: 1 +extent_alloc 1 0 0 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs/xfs/sdb1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs/xfs/sdb1/stats +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/xfs/sdb1/stats/stats +Lines: 1 +extent_alloc 2 0 0 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/class/net/eth0/ +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/class/net/eth0/addr_assign_type +Lines: 1 +3 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/class/net/eth0/addr_len +Lines: 1 +6 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/class/net/eth0/address +Lines: 1 +01:01:01:01:01:01 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/class/net/eth0/broadcast +Lines: 1 +ff:ff:ff:ff:ff:ff +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/class/net/eth0/carrier +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/class/net/eth0/carrier_changes +Lines: 1 +2 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/class/net/eth0/carrier_down_count +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/class/net/eth0/carrier_up_count +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/class/net/eth0/dev_id +Lines: 1 +0x20 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/class/net/eth0/dormant +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/class/net/eth0/duplex +Lines: 1 +full +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/class/net/eth0/flags +Lines: 1 +0x1303 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/class/net/eth0/ifalias +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/class/net/eth0/ifindex +Lines: 1 +2 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/class/net/eth0/iflink +Lines: 1 +2 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/class/net/eth0/link_mode +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/class/net/eth0/mtu +Lines: 1 +1500 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/class/net/eth0/name_assign_type +Lines: 1 +2 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/class/net/eth0/netdev_group +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/class/net/eth0/operstate +Lines: 1 +up +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/class/net/eth0/phys_port_id +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/class/net/eth0/phys_port_name +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/class/net/eth0/phys_switch_id +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/class/net/eth0/speed +Lines: 1 +1000 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/class/net/eth0/tx_queue_len +Lines: 1 +1000 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/class/net/eth0/type +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/api/vendor/github.com/prometheus/procfs/sysfs/fs.go b/api/vendor/github.com/prometheus/procfs/sysfs/fs.go new file mode 100644 index 0000000..fb15d43 --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/sysfs/fs.go @@ -0,0 +1,108 @@ +// Copyright 2017 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 sysfs + +import ( + "fmt" + "os" + "path/filepath" + + "github.com/prometheus/procfs/bcache" + "github.com/prometheus/procfs/xfs" +) + +// FS represents the pseudo-filesystem sys, which provides an interface to +// kernel data structures. +type FS string + +// DefaultMountPoint is the common mount point of the sys filesystem. +const DefaultMountPoint = "/sys" + +// NewFS returns a new FS mounted under the given mountPoint. It will error +// if the mount point can't be read. +func NewFS(mountPoint string) (FS, error) { + info, err := os.Stat(mountPoint) + if err != nil { + return "", fmt.Errorf("could not read %s: %s", mountPoint, err) + } + if !info.IsDir() { + return "", fmt.Errorf("mount point %s is not a directory", mountPoint) + } + + return FS(mountPoint), nil +} + +// Path returns the path of the given subsystem relative to the sys root. +func (fs FS) Path(p ...string) string { + return filepath.Join(append([]string{string(fs)}, p...)...) +} + +// XFSStats retrieves XFS filesystem runtime statistics for each mounted XFS +// filesystem. Only available on kernel 4.4+. On older kernels, an empty +// slice of *xfs.Stats will be returned. +func (fs FS) XFSStats() ([]*xfs.Stats, error) { + matches, err := filepath.Glob(fs.Path("fs/xfs/*/stats/stats")) + if err != nil { + return nil, err + } + + stats := make([]*xfs.Stats, 0, len(matches)) + for _, m := range matches { + f, err := os.Open(m) + if err != nil { + return nil, err + } + + // "*" used in glob above indicates the name of the filesystem. + name := filepath.Base(filepath.Dir(filepath.Dir(m))) + + // File must be closed after parsing, regardless of success or + // failure. Defer is not used because of the loop. + s, err := xfs.ParseStats(f) + _ = f.Close() + if err != nil { + return nil, err + } + + s.Name = name + stats = append(stats, s) + } + + return stats, nil +} + +// BcacheStats retrieves bcache runtime statistics for each bcache. +func (fs FS) BcacheStats() ([]*bcache.Stats, error) { + matches, err := filepath.Glob(fs.Path("fs/bcache/*-*")) + if err != nil { + return nil, err + } + + stats := make([]*bcache.Stats, 0, len(matches)) + for _, uuidPath := range matches { + // "*-*" in glob above indicates the name of the bcache. + name := filepath.Base(uuidPath) + + // stats + s, err := bcache.GetStats(uuidPath) + if err != nil { + return nil, err + } + + s.Name = name + stats = append(stats, s) + } + + return stats, nil +} diff --git a/api/vendor/github.com/prometheus/procfs/sysfs/fs_test.go b/api/vendor/github.com/prometheus/procfs/sysfs/fs_test.go new file mode 100644 index 0000000..2b7402e --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/sysfs/fs_test.go @@ -0,0 +1,108 @@ +// Copyright 2017 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 sysfs + +import "testing" + +func TestNewFS(t *testing.T) { + if _, err := NewFS("foobar"); err == nil { + t.Error("want NewFS to fail for non-existing mount point") + } + + if _, err := NewFS("doc.go"); err == nil { + t.Error("want NewFS to fail if mount point is not a directory") + } +} + +func TestFSXFSStats(t *testing.T) { + stats, err := FS("fixtures").XFSStats() + if err != nil { + t.Fatalf("failed to parse XFS stats: %v", err) + } + + tests := []struct { + name string + allocated uint32 + }{ + { + name: "sda1", + allocated: 1, + }, + { + name: "sdb1", + allocated: 2, + }, + } + + const expect = 2 + + if l := len(stats); l != expect { + t.Fatalf("unexpected number of XFS stats: %d", l) + } + if l := len(tests); l != expect { + t.Fatalf("unexpected number of tests: %d", l) + } + + for i, tt := range tests { + if want, got := tt.name, stats[i].Name; want != got { + t.Errorf("unexpected stats name:\nwant: %q\nhave: %q", want, got) + } + + if want, got := tt.allocated, stats[i].ExtentAllocation.ExtentsAllocated; want != got { + t.Errorf("unexpected extents allocated:\nwant: %d\nhave: %d", want, got) + } + } +} + +func TestFSBcacheStats(t *testing.T) { + stats, err := FS("fixtures").BcacheStats() + if err != nil { + t.Fatalf("failed to parse bcache stats: %v", err) + } + + tests := []struct { + name string + bdevs int + caches int + }{ + { + name: "deaddd54-c735-46d5-868e-f331c5fd7c74", + bdevs: 1, + caches: 1, + }, + } + + const expect = 1 + + if l := len(stats); l != expect { + t.Fatalf("unexpected number of bcache stats: %d", l) + } + if l := len(tests); l != expect { + t.Fatalf("unexpected number of tests: %d", l) + } + + for i, tt := range tests { + if want, got := tt.name, stats[i].Name; want != got { + t.Errorf("unexpected stats name:\nwant: %q\nhave: %q", want, got) + } + + if want, got := tt.bdevs, len(stats[i].Bdevs); want != got { + t.Errorf("unexpected value allocated:\nwant: %d\nhave: %d", want, got) + } + + if want, got := tt.caches, len(stats[i].Caches); want != got { + t.Errorf("unexpected value allocated:\nwant: %d\nhave: %d", want, got) + } + } +} diff --git a/api/vendor/github.com/prometheus/procfs/sysfs/net_class.go b/api/vendor/github.com/prometheus/procfs/sysfs/net_class.go new file mode 100644 index 0000000..562ce15 --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/sysfs/net_class.go @@ -0,0 +1,174 @@ +// Copyright 2018 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 sysfs + +import ( + "fmt" + "io/ioutil" + "os" + "reflect" + "strconv" + "strings" + "syscall" +) + +// NetClassIface contains info from files in /sys/class/net/ +// for single interface (iface). +type NetClassIface struct { + Name string // Interface name + AddrAssignType *int64 `fileName:"addr_assign_type"` // /sys/class/net//addr_assign_type + AddrLen *int64 `fileName:"addr_len"` // /sys/class/net//addr_len + Address string `fileName:"address"` // /sys/class/net//address + Broadcast string `fileName:"broadcast"` // /sys/class/net//broadcast + Carrier *int64 `fileName:"carrier"` // /sys/class/net//carrier + CarrierChanges *int64 `fileName:"carrier_changes"` // /sys/class/net//carrier_changes + CarrierUpCount *int64 `fileName:"carrier_up_count"` // /sys/class/net//carrier_up_count + CarrierDownCount *int64 `fileName:"carrier_down_count"` // /sys/class/net//carrier_down_count + DevID *int64 `fileName:"dev_id"` // /sys/class/net//dev_id + Dormant *int64 `fileName:"dormant"` // /sys/class/net//dormant + Duplex string `fileName:"duplex"` // /sys/class/net//duplex + Flags *int64 `fileName:"flags"` // /sys/class/net//flags + IfAlias string `fileName:"ifalias"` // /sys/class/net//ifalias + IfIndex *int64 `fileName:"ifindex"` // /sys/class/net//ifindex + IfLink *int64 `fileName:"iflink"` // /sys/class/net//iflink + LinkMode *int64 `fileName:"link_mode"` // /sys/class/net//link_mode + MTU *int64 `fileName:"mtu"` // /sys/class/net//mtu + NameAssignType *int64 `fileName:"name_assign_type"` // /sys/class/net//name_assign_type + NetDevGroup *int64 `fileName:"netdev_group"` // /sys/class/net//netdev_group + OperState string `fileName:"operstate"` // /sys/class/net//operstate + PhysPortID string `fileName:"phys_port_id"` // /sys/class/net//phys_port_id + PhysPortName string `fileName:"phys_port_name"` // /sys/class/net//phys_port_name + PhysSwitchID string `fileName:"phys_switch_id"` // /sys/class/net//phys_switch_id + Speed *int64 `fileName:"speed"` // /sys/class/net//speed + TxQueueLen *int64 `fileName:"tx_queue_len"` // /sys/class/net//tx_queue_len + Type *int64 `fileName:"type"` // /sys/class/net//type +} + +// NetClass is collection of info for every interface (iface) in /sys/class/net. The map keys +// are interface (iface) names. +type NetClass map[string]NetClassIface + +// NewNetClass returns info for all net interfaces (iface) read from /sys/class/net/. +func NewNetClass() (NetClass, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return nil, err + } + + return fs.NewNetClass() +} + +// NewNetClass returns info for all net interfaces (iface) read from /sys/class/net/. +func (fs FS) NewNetClass() (NetClass, error) { + path := fs.Path("class/net") + + devices, err := ioutil.ReadDir(path) + if err != nil { + return NetClass{}, fmt.Errorf("cannot access %s dir %s", path, err) + } + + netClass := NetClass{} + for _, deviceDir := range devices { + if deviceDir.Mode().IsRegular() { + continue + } + interfaceClass, err := netClass.parseNetClassIface(path + "/" + deviceDir.Name()) + if err != nil { + return nil, err + } + interfaceClass.Name = deviceDir.Name() + netClass[deviceDir.Name()] = *interfaceClass + } + return netClass, nil +} + +// parseNetClassIface scans predefined files in /sys/class/net/ +// directory and gets their contents. +func (nc NetClass) parseNetClassIface(devicePath string) (*NetClassIface, error) { + interfaceClass := NetClassIface{} + interfaceElem := reflect.ValueOf(&interfaceClass).Elem() + interfaceType := reflect.TypeOf(interfaceClass) + + //start from 1 - skip the Name field + for i := 1; i < interfaceElem.NumField(); i++ { + fieldType := interfaceType.Field(i) + fieldValue := interfaceElem.Field(i) + + if fieldType.Tag.Get("fileName") == "" { + panic(fmt.Errorf("field %s does not have a filename tag", fieldType.Name)) + } + + fileContents, err := sysReadFile(devicePath + "/" + fieldType.Tag.Get("fileName")) + + if err != nil { + if os.IsNotExist(err) || err.Error() == "operation not supported" || err.Error() == "invalid argument" { + continue + } + return nil, fmt.Errorf("could not access file %s: %s", fieldType.Tag.Get("fileName"), err) + } + value := strings.TrimSpace(string(fileContents)) + + switch fieldValue.Kind() { + case reflect.String: + fieldValue.SetString(value) + case reflect.Ptr: + var int64ptr *int64 + switch fieldValue.Type() { + case reflect.TypeOf(int64ptr): + var intValue int64 + if strings.HasPrefix(value, "0x") { + intValue, err = strconv.ParseInt(value[2:], 16, 64) + if err != nil { + return nil, fmt.Errorf("expected hex value for %s, got: %s", fieldType.Name, value) + } + } else { + intValue, err = strconv.ParseInt(value, 10, 64) + if err != nil { + return nil, fmt.Errorf("expected Uint64 value for %s, got: %s", fieldType.Name, value) + } + } + fieldValue.Set(reflect.ValueOf(&intValue)) + default: + return nil, fmt.Errorf("unhandled pointer type %q", fieldValue.Type()) + } + default: + return nil, fmt.Errorf("unhandled type %q", fieldValue.Kind()) + } + } + + return &interfaceClass, nil +} + +// sysReadFile is a simplified ioutil.ReadFile that invokes syscall.Read directly. +// https://github.com/prometheus/node_exporter/pull/728/files +func sysReadFile(file string) ([]byte, error) { + f, err := os.Open(file) + if err != nil { + return nil, err + } + defer f.Close() + + // On some machines, hwmon drivers are broken and return EAGAIN. This causes + // Go's ioutil.ReadFile implementation to poll forever. + // + // Since we either want to read data or bail immediately, do the simplest + // possible read using syscall directly. + b := make([]byte, 128) + n, err := syscall.Read(int(f.Fd()), b) + if err != nil { + return nil, err + } + + return b[:n], nil +} diff --git a/api/vendor/github.com/prometheus/procfs/sysfs/net_class_test.go b/api/vendor/github.com/prometheus/procfs/sysfs/net_class_test.go new file mode 100644 index 0000000..e6d05f0 --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/sysfs/net_class_test.go @@ -0,0 +1,88 @@ +// Copyright 2018 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 sysfs + +import ( + "reflect" + "testing" +) + +func TestNewNetClass(t *testing.T) { + fs, err := NewFS("fixtures") + if err != nil { + t.Fatal(err) + } + + nc, err := fs.NewNetClass() + if err != nil { + t.Fatal(err) + } + + var ( + addrAssignType int64 = 3 + addrLen int64 = 6 + carrier int64 = 1 + carrierChanges int64 = 2 + carrierDownCount int64 = 1 + carrierUpCount int64 = 1 + devID int64 = 32 + dormant int64 = 1 + flags int64 = 4867 + ifIndex int64 = 2 + ifLink int64 = 2 + linkMode int64 = 1 + mtu int64 = 1500 + nameAssignType int64 = 2 + netDevGroup int64 = 0 + speed int64 = 1000 + txQueueLen int64 = 1000 + netType int64 = 1 + ) + + netClass := NetClass{ + "eth0": { + Address: "01:01:01:01:01:01", + AddrAssignType: &addrAssignType, + AddrLen: &addrLen, + Broadcast: "ff:ff:ff:ff:ff:ff", + Carrier: &carrier, + CarrierChanges: &carrierChanges, + CarrierDownCount: &carrierDownCount, + CarrierUpCount: &carrierUpCount, + DevID: &devID, + Dormant: &dormant, + Duplex: "full", + Flags: &flags, + IfAlias: "", + IfIndex: &ifIndex, + IfLink: &ifLink, + LinkMode: &linkMode, + MTU: &mtu, + Name: "eth0", + NameAssignType: &nameAssignType, + NetDevGroup: &netDevGroup, + OperState: "up", + PhysPortID: "", + PhysPortName: "", + PhysSwitchID: "", + Speed: &speed, + TxQueueLen: &txQueueLen, + Type: &netType, + }, + } + + if !reflect.DeepEqual(netClass, nc) { + t.Errorf("Result not correct: want %v, have %v", netClass, nc) + } +} diff --git a/api/vendor/github.com/prometheus/procfs/ttar b/api/vendor/github.com/prometheus/procfs/ttar new file mode 100755 index 0000000..b0171a1 --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/ttar @@ -0,0 +1,389 @@ +#!/usr/bin/env bash + +# Purpose: plain text tar format +# Limitations: - only suitable for text files, directories, and symlinks +# - stores only filename, content, and mode +# - not designed for untrusted input +# +# Note: must work with bash version 3.2 (macOS) + +# Copyright 2017 Roger Luethi +# +# 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. + +set -o errexit -o nounset + +# Sanitize environment (for instance, standard sorting of glob matches) +export LC_ALL=C + +path="" +CMD="" +ARG_STRING="$*" + +#------------------------------------------------------------------------------ +# Not all sed implementations can work on null bytes. In order to make ttar +# work out of the box on macOS, use Python as a stream editor. + +USE_PYTHON=0 + +PYTHON_CREATE_FILTER=$(cat << 'PCF' +#!/usr/bin/env python + +import re +import sys + +for line in sys.stdin: + line = re.sub(r'EOF', r'\EOF', line) + line = re.sub(r'NULLBYTE', r'\NULLBYTE', line) + line = re.sub('\x00', r'NULLBYTE', line) + sys.stdout.write(line) +PCF +) + +PYTHON_EXTRACT_FILTER=$(cat << 'PEF' +#!/usr/bin/env python + +import re +import sys + +for line in sys.stdin: + line = re.sub(r'(?/dev/null; then + echo "ERROR Python not found. Aborting." + exit 2 + fi + USE_PYTHON=1 + fi +} + +#------------------------------------------------------------------------------ + +function usage { + bname=$(basename "$0") + cat << USAGE +Usage: $bname [-C ] -c -f (create archive) + $bname -t -f (list archive contents) + $bname [-C ] -x -f (extract archive) + +Options: + -C (change directory) + -v (verbose) + +Example: Change to sysfs directory, create ttar file from fixtures directory + $bname -C sysfs -c -f sysfs/fixtures.ttar fixtures/ +USAGE +exit "$1" +} + +function vecho { + if [ "${VERBOSE:-}" == "yes" ]; then + echo >&7 "$@" + fi +} + +function set_cmd { + if [ -n "$CMD" ]; then + echo "ERROR: more than one command given" + echo + usage 2 + fi + CMD=$1 +} + +unset VERBOSE + +while getopts :cf:htxvC: opt; do + case $opt in + c) + set_cmd "create" + ;; + f) + ARCHIVE=$OPTARG + ;; + h) + usage 0 + ;; + t) + set_cmd "list" + ;; + x) + set_cmd "extract" + ;; + v) + VERBOSE=yes + exec 7>&1 + ;; + C) + CDIR=$OPTARG + ;; + *) + echo >&2 "ERROR: invalid option -$OPTARG" + echo + usage 1 + ;; + esac +done + +# Remove processed options from arguments +shift $(( OPTIND - 1 )); + +if [ "${CMD:-}" == "" ]; then + echo >&2 "ERROR: no command given" + echo + usage 1 +elif [ "${ARCHIVE:-}" == "" ]; then + echo >&2 "ERROR: no archive name given" + echo + usage 1 +fi + +function list { + local path="" + local size=0 + local line_no=0 + local ttar_file=$1 + if [ -n "${2:-}" ]; then + echo >&2 "ERROR: too many arguments." + echo + usage 1 + fi + if [ ! -e "$ttar_file" ]; then + echo >&2 "ERROR: file not found ($ttar_file)" + echo + usage 1 + fi + while read -r line; do + line_no=$(( line_no + 1 )) + if [ $size -gt 0 ]; then + size=$(( size - 1 )) + continue + fi + if [[ $line =~ ^Path:\ (.*)$ ]]; then + path=${BASH_REMATCH[1]} + elif [[ $line =~ ^Lines:\ (.*)$ ]]; then + size=${BASH_REMATCH[1]} + echo "$path" + elif [[ $line =~ ^Directory:\ (.*)$ ]]; then + path=${BASH_REMATCH[1]} + echo "$path/" + elif [[ $line =~ ^SymlinkTo:\ (.*)$ ]]; then + echo "$path -> ${BASH_REMATCH[1]}" + fi + done < "$ttar_file" +} + +function extract { + local path="" + local size=0 + local line_no=0 + local ttar_file=$1 + if [ -n "${2:-}" ]; then + echo >&2 "ERROR: too many arguments." + echo + usage 1 + fi + if [ ! -e "$ttar_file" ]; then + echo >&2 "ERROR: file not found ($ttar_file)" + echo + usage 1 + fi + while IFS= read -r line; do + line_no=$(( line_no + 1 )) + local eof_without_newline + if [ "$size" -gt 0 ]; then + if [[ "$line" =~ [^\\]EOF ]]; then + # An EOF not preceeded by a backslash indicates that the line + # does not end with a newline + eof_without_newline=1 + else + eof_without_newline=0 + fi + # Replace NULLBYTE with null byte if at beginning of line + # Replace NULLBYTE with null byte unless preceeded by backslash + # Remove one backslash in front of NULLBYTE (if any) + # Remove EOF unless preceeded by backslash + # Remove one backslash in front of EOF + if [ $USE_PYTHON -eq 1 ]; then + echo -n "$line" | python -c "$PYTHON_EXTRACT_FILTER" >> "$path" + else + # The repeated pattern makes up for sed's lack of negative + # lookbehind assertions (for consecutive null bytes). + echo -n "$line" | \ + sed -e 's/^NULLBYTE/\x0/g; + s/\([^\\]\)NULLBYTE/\1\x0/g; + s/\([^\\]\)NULLBYTE/\1\x0/g; + s/\\NULLBYTE/NULLBYTE/g; + s/\([^\\]\)EOF/\1/g; + s/\\EOF/EOF/g; + ' >> "$path" + fi + if [[ "$eof_without_newline" -eq 0 ]]; then + echo >> "$path" + fi + size=$(( size - 1 )) + continue + fi + if [[ $line =~ ^Path:\ (.*)$ ]]; then + path=${BASH_REMATCH[1]} + if [ -e "$path" ] || [ -L "$path" ]; then + rm "$path" + fi + elif [[ $line =~ ^Lines:\ (.*)$ ]]; then + size=${BASH_REMATCH[1]} + # Create file even if it is zero-length. + touch "$path" + vecho " $path" + elif [[ $line =~ ^Mode:\ (.*)$ ]]; then + mode=${BASH_REMATCH[1]} + chmod "$mode" "$path" + vecho "$mode" + elif [[ $line =~ ^Directory:\ (.*)$ ]]; then + path=${BASH_REMATCH[1]} + mkdir -p "$path" + vecho " $path/" + elif [[ $line =~ ^SymlinkTo:\ (.*)$ ]]; then + ln -s "${BASH_REMATCH[1]}" "$path" + vecho " $path -> ${BASH_REMATCH[1]}" + elif [[ $line =~ ^# ]]; then + # Ignore comments between files + continue + else + echo >&2 "ERROR: Unknown keyword on line $line_no: $line" + exit 1 + fi + done < "$ttar_file" +} + +function div { + echo "# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" \ + "- - - - - -" +} + +function get_mode { + local mfile=$1 + if [ -z "${STAT_OPTION:-}" ]; then + if stat -c '%a' "$mfile" >/dev/null 2>&1; then + # GNU stat + STAT_OPTION='-c' + STAT_FORMAT='%a' + else + # BSD stat + STAT_OPTION='-f' + # Octal output, user/group/other (omit file type, sticky bit) + STAT_FORMAT='%OLp' + fi + fi + stat "${STAT_OPTION}" "${STAT_FORMAT}" "$mfile" +} + +function _create { + shopt -s nullglob + local mode + local eof_without_newline + while (( "$#" )); do + file=$1 + if [ -L "$file" ]; then + echo "Path: $file" + symlinkTo=$(readlink "$file") + echo "SymlinkTo: $symlinkTo" + vecho " $file -> $symlinkTo" + div + elif [ -d "$file" ]; then + # Strip trailing slash (if there is one) + file=${file%/} + echo "Directory: $file" + mode=$(get_mode "$file") + echo "Mode: $mode" + vecho "$mode $file/" + div + # Find all files and dirs, including hidden/dot files + for x in "$file/"{*,.[^.]*}; do + _create "$x" + done + elif [ -f "$file" ]; then + echo "Path: $file" + lines=$(wc -l "$file"|awk '{print $1}') + eof_without_newline=0 + if [[ "$(wc -c "$file"|awk '{print $1}')" -gt 0 ]] && \ + [[ "$(tail -c 1 "$file" | wc -l)" -eq 0 ]]; then + eof_without_newline=1 + lines=$((lines+1)) + fi + echo "Lines: $lines" + # Add backslash in front of EOF + # Add backslash in front of NULLBYTE + # Replace null byte with NULLBYTE + if [ $USE_PYTHON -eq 1 ]; then + < "$file" python -c "$PYTHON_CREATE_FILTER" + else + < "$file" \ + sed 's/EOF/\\EOF/g; + s/NULLBYTE/\\NULLBYTE/g; + s/\x0/NULLBYTE/g; + ' + fi + if [[ "$eof_without_newline" -eq 1 ]]; then + # Finish line with EOF to indicate that the original line did + # not end with a linefeed + echo "EOF" + fi + mode=$(get_mode "$file") + echo "Mode: $mode" + vecho "$mode $file" + div + else + echo >&2 "ERROR: file not found ($file in $(pwd))" + exit 2 + fi + shift + done +} + +function create { + ttar_file=$1 + shift + if [ -z "${1:-}" ]; then + echo >&2 "ERROR: missing arguments." + echo + usage 1 + fi + if [ -e "$ttar_file" ]; then + rm "$ttar_file" + fi + exec > "$ttar_file" + echo "# Archive created by ttar $ARG_STRING" + _create "$@" +} + +test_environment + +if [ -n "${CDIR:-}" ]; then + if [[ "$ARCHIVE" != /* ]]; then + # Relative path: preserve the archive's location before changing + # directory + ARCHIVE="$(pwd)/$ARCHIVE" + fi + cd "$CDIR" +fi + +"$CMD" "$ARCHIVE" "$@" diff --git a/api/vendor/github.com/prometheus/procfs/xfrm.go b/api/vendor/github.com/prometheus/procfs/xfrm.go new file mode 100644 index 0000000..ffe9df5 --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/xfrm.go @@ -0,0 +1,187 @@ +// Copyright 2017 Prometheus Team +// 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" + "fmt" + "os" + "strconv" + "strings" +) + +// XfrmStat models the contents of /proc/net/xfrm_stat. +type XfrmStat struct { + // All errors which are not matched by other + XfrmInError int + // No buffer is left + XfrmInBufferError int + // Header Error + XfrmInHdrError int + // No state found + // i.e. either inbound SPI, address, or IPSEC protocol at SA is wrong + XfrmInNoStates int + // Transformation protocol specific error + // e.g. SA Key is wrong + XfrmInStateProtoError int + // Transformation mode specific error + XfrmInStateModeError int + // Sequence error + // e.g. sequence number is out of window + XfrmInStateSeqError int + // State is expired + XfrmInStateExpired int + // State has mismatch option + // e.g. UDP encapsulation type is mismatched + XfrmInStateMismatch int + // State is invalid + XfrmInStateInvalid int + // No matching template for states + // e.g. Inbound SAs are correct but SP rule is wrong + XfrmInTmplMismatch int + // No policy is found for states + // e.g. Inbound SAs are correct but no SP is found + XfrmInNoPols int + // Policy discards + XfrmInPolBlock int + // Policy error + XfrmInPolError int + // All errors which are not matched by others + XfrmOutError int + // Bundle generation error + XfrmOutBundleGenError int + // Bundle check error + XfrmOutBundleCheckError int + // No state was found + XfrmOutNoStates int + // Transformation protocol specific error + XfrmOutStateProtoError int + // Transportation mode specific error + XfrmOutStateModeError int + // Sequence error + // i.e sequence number overflow + XfrmOutStateSeqError int + // State is expired + XfrmOutStateExpired int + // Policy discads + XfrmOutPolBlock int + // Policy is dead + XfrmOutPolDead int + // Policy Error + XfrmOutPolError int + XfrmFwdHdrError int + XfrmOutStateInvalid int + XfrmAcquireError int +} + +// NewXfrmStat reads the xfrm_stat statistics. +func NewXfrmStat() (XfrmStat, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return XfrmStat{}, err + } + + return fs.NewXfrmStat() +} + +// NewXfrmStat reads the xfrm_stat statistics from the 'proc' filesystem. +func (fs FS) NewXfrmStat() (XfrmStat, error) { + file, err := os.Open(fs.Path("net/xfrm_stat")) + if err != nil { + return XfrmStat{}, err + } + defer file.Close() + + var ( + x = XfrmStat{} + s = bufio.NewScanner(file) + ) + + for s.Scan() { + fields := strings.Fields(s.Text()) + + if len(fields) != 2 { + return XfrmStat{}, fmt.Errorf( + "couldnt parse %s line %s", file.Name(), s.Text()) + } + + name := fields[0] + value, err := strconv.Atoi(fields[1]) + if err != nil { + return XfrmStat{}, err + } + + switch name { + case "XfrmInError": + x.XfrmInError = value + case "XfrmInBufferError": + x.XfrmInBufferError = value + case "XfrmInHdrError": + x.XfrmInHdrError = value + case "XfrmInNoStates": + x.XfrmInNoStates = value + case "XfrmInStateProtoError": + x.XfrmInStateProtoError = value + case "XfrmInStateModeError": + x.XfrmInStateModeError = value + case "XfrmInStateSeqError": + x.XfrmInStateSeqError = value + case "XfrmInStateExpired": + x.XfrmInStateExpired = value + case "XfrmInStateInvalid": + x.XfrmInStateInvalid = value + case "XfrmInTmplMismatch": + x.XfrmInTmplMismatch = value + case "XfrmInNoPols": + x.XfrmInNoPols = value + case "XfrmInPolBlock": + x.XfrmInPolBlock = value + case "XfrmInPolError": + x.XfrmInPolError = value + case "XfrmOutError": + x.XfrmOutError = value + case "XfrmInStateMismatch": + x.XfrmInStateMismatch = value + case "XfrmOutBundleGenError": + x.XfrmOutBundleGenError = value + case "XfrmOutBundleCheckError": + x.XfrmOutBundleCheckError = value + case "XfrmOutNoStates": + x.XfrmOutNoStates = value + case "XfrmOutStateProtoError": + x.XfrmOutStateProtoError = value + case "XfrmOutStateModeError": + x.XfrmOutStateModeError = value + case "XfrmOutStateSeqError": + x.XfrmOutStateSeqError = value + case "XfrmOutStateExpired": + x.XfrmOutStateExpired = value + case "XfrmOutPolBlock": + x.XfrmOutPolBlock = value + case "XfrmOutPolDead": + x.XfrmOutPolDead = value + case "XfrmOutPolError": + x.XfrmOutPolError = value + case "XfrmFwdHdrError": + x.XfrmFwdHdrError = value + case "XfrmOutStateInvalid": + x.XfrmOutStateInvalid = value + case "XfrmAcquireError": + x.XfrmAcquireError = value + } + + } + + return x, s.Err() +} diff --git a/api/vendor/github.com/prometheus/procfs/xfrm_test.go b/api/vendor/github.com/prometheus/procfs/xfrm_test.go new file mode 100644 index 0000000..5918c39 --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/xfrm_test.go @@ -0,0 +1,66 @@ +// Copyright 2017 Prometheus Team +// 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 ( + "testing" +) + +func TestXfrmStats(t *testing.T) { + xfrmStats, err := FS("fixtures").NewXfrmStat() + if err != nil { + t.Fatal(err) + } + + for _, test := range []struct { + name string + want int + got int + }{ + {name: "XfrmInError", want: 1, got: xfrmStats.XfrmInError}, + {name: "XfrmInBufferError", want: 2, got: xfrmStats.XfrmInBufferError}, + {name: "XfrmInHdrError", want: 4, got: xfrmStats.XfrmInHdrError}, + {name: "XfrmInNoStates", want: 3, got: xfrmStats.XfrmInNoStates}, + {name: "XfrmInStateProtoError", want: 40, got: xfrmStats.XfrmInStateProtoError}, + {name: "XfrmInStateModeError", want: 100, got: xfrmStats.XfrmInStateModeError}, + {name: "XfrmInStateSeqError", want: 6000, got: xfrmStats.XfrmInStateSeqError}, + {name: "XfrmInStateExpired", want: 4, got: xfrmStats.XfrmInStateExpired}, + {name: "XfrmInStateMismatch", want: 23451, got: xfrmStats.XfrmInStateMismatch}, + {name: "XfrmInStateInvalid", want: 55555, got: xfrmStats.XfrmInStateInvalid}, + {name: "XfrmInTmplMismatch", want: 51, got: xfrmStats.XfrmInTmplMismatch}, + {name: "XfrmInNoPols", want: 65432, got: xfrmStats.XfrmInNoPols}, + {name: "XfrmInPolBlock", want: 100, got: xfrmStats.XfrmInPolBlock}, + {name: "XfrmInPolError", want: 10000, got: xfrmStats.XfrmInPolError}, + {name: "XfrmOutError", want: 1000000, got: xfrmStats.XfrmOutError}, + {name: "XfrmOutBundleGenError", want: 43321, got: xfrmStats.XfrmOutBundleGenError}, + {name: "XfrmOutBundleCheckError", want: 555, got: xfrmStats.XfrmOutBundleCheckError}, + {name: "XfrmOutNoStates", want: 869, got: xfrmStats.XfrmOutNoStates}, + {name: "XfrmOutStateProtoError", want: 4542, got: xfrmStats.XfrmOutStateProtoError}, + {name: "XfrmOutStateModeError", want: 4, got: xfrmStats.XfrmOutStateModeError}, + {name: "XfrmOutStateSeqError", want: 543, got: xfrmStats.XfrmOutStateSeqError}, + {name: "XfrmOutStateExpired", want: 565, got: xfrmStats.XfrmOutStateExpired}, + {name: "XfrmOutPolBlock", want: 43456, got: xfrmStats.XfrmOutPolBlock}, + {name: "XfrmOutPolDead", want: 7656, got: xfrmStats.XfrmOutPolDead}, + {name: "XfrmOutPolError", want: 1454, got: xfrmStats.XfrmOutPolError}, + {name: "XfrmFwdHdrError", want: 6654, got: xfrmStats.XfrmFwdHdrError}, + {name: "XfrmOutStateInvaliad", want: 28765, got: xfrmStats.XfrmOutStateInvalid}, + {name: "XfrmAcquireError", want: 24532, got: xfrmStats.XfrmAcquireError}, + {name: "XfrmInStateInvalid", want: 55555, got: xfrmStats.XfrmInStateInvalid}, + {name: "XfrmOutError", want: 1000000, got: xfrmStats.XfrmOutError}, + } { + if test.want != test.got { + t.Errorf("Want %s %d, have %d", test.name, test.want, test.got) + } + } +} diff --git a/api/vendor/github.com/prometheus/procfs/xfs/parse.go b/api/vendor/github.com/prometheus/procfs/xfs/parse.go new file mode 100644 index 0000000..2bc0ef3 --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/xfs/parse.go @@ -0,0 +1,330 @@ +// Copyright 2017 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 xfs + +import ( + "bufio" + "fmt" + "io" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// ParseStats parses a Stats from an input io.Reader, using the format +// found in /proc/fs/xfs/stat. +func ParseStats(r io.Reader) (*Stats, error) { + const ( + // Fields parsed into stats structures. + fieldExtentAlloc = "extent_alloc" + fieldAbt = "abt" + fieldBlkMap = "blk_map" + fieldBmbt = "bmbt" + fieldDir = "dir" + fieldTrans = "trans" + fieldIg = "ig" + fieldLog = "log" + fieldRw = "rw" + fieldAttr = "attr" + fieldIcluster = "icluster" + fieldVnodes = "vnodes" + fieldBuf = "buf" + fieldXpc = "xpc" + + // Unimplemented at this time due to lack of documentation. + fieldPushAil = "push_ail" + fieldXstrat = "xstrat" + fieldAbtb2 = "abtb2" + fieldAbtc2 = "abtc2" + fieldBmbt2 = "bmbt2" + fieldIbt2 = "ibt2" + fieldFibt2 = "fibt2" + fieldQm = "qm" + fieldDebug = "debug" + ) + + var xfss Stats + + s := bufio.NewScanner(r) + for s.Scan() { + // Expect at least a string label and a single integer value, ex: + // - abt 0 + // - rw 1 2 + ss := strings.Fields(string(s.Bytes())) + if len(ss) < 2 { + continue + } + label := ss[0] + + // Extended precision counters are uint64 values. + if label == fieldXpc { + us, err := util.ParseUint64s(ss[1:]) + if err != nil { + return nil, err + } + + xfss.ExtendedPrecision, err = extendedPrecisionStats(us) + if err != nil { + return nil, err + } + + continue + } + + // All other counters are uint32 values. + us, err := util.ParseUint32s(ss[1:]) + if err != nil { + return nil, err + } + + switch label { + case fieldExtentAlloc: + xfss.ExtentAllocation, err = extentAllocationStats(us) + case fieldAbt: + xfss.AllocationBTree, err = btreeStats(us) + case fieldBlkMap: + xfss.BlockMapping, err = blockMappingStats(us) + case fieldBmbt: + xfss.BlockMapBTree, err = btreeStats(us) + case fieldDir: + xfss.DirectoryOperation, err = directoryOperationStats(us) + case fieldTrans: + xfss.Transaction, err = transactionStats(us) + case fieldIg: + xfss.InodeOperation, err = inodeOperationStats(us) + case fieldLog: + xfss.LogOperation, err = logOperationStats(us) + case fieldRw: + xfss.ReadWrite, err = readWriteStats(us) + case fieldAttr: + xfss.AttributeOperation, err = attributeOperationStats(us) + case fieldIcluster: + xfss.InodeClustering, err = inodeClusteringStats(us) + case fieldVnodes: + xfss.Vnode, err = vnodeStats(us) + case fieldBuf: + xfss.Buffer, err = bufferStats(us) + } + if err != nil { + return nil, err + } + } + + return &xfss, s.Err() +} + +// extentAllocationStats builds an ExtentAllocationStats from a slice of uint32s. +func extentAllocationStats(us []uint32) (ExtentAllocationStats, error) { + if l := len(us); l != 4 { + return ExtentAllocationStats{}, fmt.Errorf("incorrect number of values for XFS extent allocation stats: %d", l) + } + + return ExtentAllocationStats{ + ExtentsAllocated: us[0], + BlocksAllocated: us[1], + ExtentsFreed: us[2], + BlocksFreed: us[3], + }, nil +} + +// btreeStats builds a BTreeStats from a slice of uint32s. +func btreeStats(us []uint32) (BTreeStats, error) { + if l := len(us); l != 4 { + return BTreeStats{}, fmt.Errorf("incorrect number of values for XFS btree stats: %d", l) + } + + return BTreeStats{ + Lookups: us[0], + Compares: us[1], + RecordsInserted: us[2], + RecordsDeleted: us[3], + }, nil +} + +// BlockMappingStat builds a BlockMappingStats from a slice of uint32s. +func blockMappingStats(us []uint32) (BlockMappingStats, error) { + if l := len(us); l != 7 { + return BlockMappingStats{}, fmt.Errorf("incorrect number of values for XFS block mapping stats: %d", l) + } + + return BlockMappingStats{ + Reads: us[0], + Writes: us[1], + Unmaps: us[2], + ExtentListInsertions: us[3], + ExtentListDeletions: us[4], + ExtentListLookups: us[5], + ExtentListCompares: us[6], + }, nil +} + +// DirectoryOperationStats builds a DirectoryOperationStats from a slice of uint32s. +func directoryOperationStats(us []uint32) (DirectoryOperationStats, error) { + if l := len(us); l != 4 { + return DirectoryOperationStats{}, fmt.Errorf("incorrect number of values for XFS directory operation stats: %d", l) + } + + return DirectoryOperationStats{ + Lookups: us[0], + Creates: us[1], + Removes: us[2], + Getdents: us[3], + }, nil +} + +// TransactionStats builds a TransactionStats from a slice of uint32s. +func transactionStats(us []uint32) (TransactionStats, error) { + if l := len(us); l != 3 { + return TransactionStats{}, fmt.Errorf("incorrect number of values for XFS transaction stats: %d", l) + } + + return TransactionStats{ + Sync: us[0], + Async: us[1], + Empty: us[2], + }, nil +} + +// InodeOperationStats builds an InodeOperationStats from a slice of uint32s. +func inodeOperationStats(us []uint32) (InodeOperationStats, error) { + if l := len(us); l != 7 { + return InodeOperationStats{}, fmt.Errorf("incorrect number of values for XFS inode operation stats: %d", l) + } + + return InodeOperationStats{ + Attempts: us[0], + Found: us[1], + Recycle: us[2], + Missed: us[3], + Duplicate: us[4], + Reclaims: us[5], + AttributeChange: us[6], + }, nil +} + +// LogOperationStats builds a LogOperationStats from a slice of uint32s. +func logOperationStats(us []uint32) (LogOperationStats, error) { + if l := len(us); l != 5 { + return LogOperationStats{}, fmt.Errorf("incorrect number of values for XFS log operation stats: %d", l) + } + + return LogOperationStats{ + Writes: us[0], + Blocks: us[1], + NoInternalBuffers: us[2], + Force: us[3], + ForceSleep: us[4], + }, nil +} + +// ReadWriteStats builds a ReadWriteStats from a slice of uint32s. +func readWriteStats(us []uint32) (ReadWriteStats, error) { + if l := len(us); l != 2 { + return ReadWriteStats{}, fmt.Errorf("incorrect number of values for XFS read write stats: %d", l) + } + + return ReadWriteStats{ + Read: us[0], + Write: us[1], + }, nil +} + +// AttributeOperationStats builds an AttributeOperationStats from a slice of uint32s. +func attributeOperationStats(us []uint32) (AttributeOperationStats, error) { + if l := len(us); l != 4 { + return AttributeOperationStats{}, fmt.Errorf("incorrect number of values for XFS attribute operation stats: %d", l) + } + + return AttributeOperationStats{ + Get: us[0], + Set: us[1], + Remove: us[2], + List: us[3], + }, nil +} + +// InodeClusteringStats builds an InodeClusteringStats from a slice of uint32s. +func inodeClusteringStats(us []uint32) (InodeClusteringStats, error) { + if l := len(us); l != 3 { + return InodeClusteringStats{}, fmt.Errorf("incorrect number of values for XFS inode clustering stats: %d", l) + } + + return InodeClusteringStats{ + Iflush: us[0], + Flush: us[1], + FlushInode: us[2], + }, nil +} + +// VnodeStats builds a VnodeStats from a slice of uint32s. +func vnodeStats(us []uint32) (VnodeStats, error) { + // The attribute "Free" appears to not be available on older XFS + // stats versions. Therefore, 7 or 8 elements may appear in + // this slice. + l := len(us) + if l != 7 && l != 8 { + return VnodeStats{}, fmt.Errorf("incorrect number of values for XFS vnode stats: %d", l) + } + + s := VnodeStats{ + Active: us[0], + Allocate: us[1], + Get: us[2], + Hold: us[3], + Release: us[4], + Reclaim: us[5], + Remove: us[6], + } + + // Skip adding free, unless it is present. The zero value will + // be used in place of an actual count. + if l == 7 { + return s, nil + } + + s.Free = us[7] + return s, nil +} + +// BufferStats builds a BufferStats from a slice of uint32s. +func bufferStats(us []uint32) (BufferStats, error) { + if l := len(us); l != 9 { + return BufferStats{}, fmt.Errorf("incorrect number of values for XFS buffer stats: %d", l) + } + + return BufferStats{ + Get: us[0], + Create: us[1], + GetLocked: us[2], + GetLockedWaited: us[3], + BusyLocked: us[4], + MissLocked: us[5], + PageRetries: us[6], + PageFound: us[7], + GetRead: us[8], + }, nil +} + +// ExtendedPrecisionStats builds an ExtendedPrecisionStats from a slice of uint32s. +func extendedPrecisionStats(us []uint64) (ExtendedPrecisionStats, error) { + if l := len(us); l != 3 { + return ExtendedPrecisionStats{}, fmt.Errorf("incorrect number of values for XFS extended precision stats: %d", l) + } + + return ExtendedPrecisionStats{ + FlushBytes: us[0], + WriteBytes: us[1], + ReadBytes: us[2], + }, nil +} diff --git a/api/vendor/github.com/prometheus/procfs/xfs/parse_test.go b/api/vendor/github.com/prometheus/procfs/xfs/parse_test.go new file mode 100644 index 0000000..2e946c2 --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/xfs/parse_test.go @@ -0,0 +1,442 @@ +// Copyright 2017 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 xfs_test + +import ( + "reflect" + "strings" + "testing" + + "github.com/prometheus/procfs" + "github.com/prometheus/procfs/xfs" +) + +func TestParseStats(t *testing.T) { + tests := []struct { + name string + s string + fs bool + stats *xfs.Stats + invalid bool + }{ + { + name: "empty file OK", + }, + { + name: "short or empty lines and unknown labels ignored", + s: "one\n\ntwo 1 2 3\n", + stats: &xfs.Stats{}, + }, + { + name: "bad uint32", + s: "extent_alloc XXX", + invalid: true, + }, + { + name: "bad uint64", + s: "xpc XXX", + invalid: true, + }, + { + name: "extent_alloc bad", + s: "extent_alloc 1", + invalid: true, + }, + { + name: "extent_alloc OK", + s: "extent_alloc 1 2 3 4", + stats: &xfs.Stats{ + ExtentAllocation: xfs.ExtentAllocationStats{ + ExtentsAllocated: 1, + BlocksAllocated: 2, + ExtentsFreed: 3, + BlocksFreed: 4, + }, + }, + }, + { + name: "abt bad", + s: "abt 1", + invalid: true, + }, + { + name: "abt OK", + s: "abt 1 2 3 4", + stats: &xfs.Stats{ + AllocationBTree: xfs.BTreeStats{ + Lookups: 1, + Compares: 2, + RecordsInserted: 3, + RecordsDeleted: 4, + }, + }, + }, + { + name: "blk_map bad", + s: "blk_map 1", + invalid: true, + }, + { + name: "blk_map OK", + s: "blk_map 1 2 3 4 5 6 7", + stats: &xfs.Stats{ + BlockMapping: xfs.BlockMappingStats{ + Reads: 1, + Writes: 2, + Unmaps: 3, + ExtentListInsertions: 4, + ExtentListDeletions: 5, + ExtentListLookups: 6, + ExtentListCompares: 7, + }, + }, + }, + { + name: "bmbt bad", + s: "bmbt 1", + invalid: true, + }, + { + name: "bmbt OK", + s: "bmbt 1 2 3 4", + stats: &xfs.Stats{ + BlockMapBTree: xfs.BTreeStats{ + Lookups: 1, + Compares: 2, + RecordsInserted: 3, + RecordsDeleted: 4, + }, + }, + }, + { + name: "dir bad", + s: "dir 1", + invalid: true, + }, + { + name: "dir OK", + s: "dir 1 2 3 4", + stats: &xfs.Stats{ + DirectoryOperation: xfs.DirectoryOperationStats{ + Lookups: 1, + Creates: 2, + Removes: 3, + Getdents: 4, + }, + }, + }, + { + name: "trans bad", + s: "trans 1", + invalid: true, + }, + { + name: "trans OK", + s: "trans 1 2 3", + stats: &xfs.Stats{ + Transaction: xfs.TransactionStats{ + Sync: 1, + Async: 2, + Empty: 3, + }, + }, + }, + { + name: "ig bad", + s: "ig 1", + invalid: true, + }, + { + name: "ig OK", + s: "ig 1 2 3 4 5 6 7", + stats: &xfs.Stats{ + InodeOperation: xfs.InodeOperationStats{ + Attempts: 1, + Found: 2, + Recycle: 3, + Missed: 4, + Duplicate: 5, + Reclaims: 6, + AttributeChange: 7, + }, + }, + }, + { + name: "log bad", + s: "log 1", + invalid: true, + }, + { + name: "log OK", + s: "log 1 2 3 4 5", + stats: &xfs.Stats{ + LogOperation: xfs.LogOperationStats{ + Writes: 1, + Blocks: 2, + NoInternalBuffers: 3, + Force: 4, + ForceSleep: 5, + }, + }, + }, + { + name: "rw bad", + s: "rw 1", + invalid: true, + }, + { + name: "rw OK", + s: "rw 1 2", + stats: &xfs.Stats{ + ReadWrite: xfs.ReadWriteStats{ + Read: 1, + Write: 2, + }, + }, + }, + { + name: "attr bad", + s: "attr 1", + invalid: true, + }, + { + name: "attr OK", + s: "attr 1 2 3 4", + stats: &xfs.Stats{ + AttributeOperation: xfs.AttributeOperationStats{ + Get: 1, + Set: 2, + Remove: 3, + List: 4, + }, + }, + }, + { + name: "icluster bad", + s: "icluster 1", + invalid: true, + }, + { + name: "icluster OK", + s: "icluster 1 2 3", + stats: &xfs.Stats{ + InodeClustering: xfs.InodeClusteringStats{ + Iflush: 1, + Flush: 2, + FlushInode: 3, + }, + }, + }, + { + name: "vnodes bad", + s: "vnodes 1", + invalid: true, + }, + { + name: "vnodes (missing free) OK", + s: "vnodes 1 2 3 4 5 6 7", + stats: &xfs.Stats{ + Vnode: xfs.VnodeStats{ + Active: 1, + Allocate: 2, + Get: 3, + Hold: 4, + Release: 5, + Reclaim: 6, + Remove: 7, + }, + }, + }, + { + name: "vnodes (with free) OK", + s: "vnodes 1 2 3 4 5 6 7 8", + stats: &xfs.Stats{ + Vnode: xfs.VnodeStats{ + Active: 1, + Allocate: 2, + Get: 3, + Hold: 4, + Release: 5, + Reclaim: 6, + Remove: 7, + Free: 8, + }, + }, + }, + { + name: "buf bad", + s: "buf 1", + invalid: true, + }, + { + name: "buf OK", + s: "buf 1 2 3 4 5 6 7 8 9", + stats: &xfs.Stats{ + Buffer: xfs.BufferStats{ + Get: 1, + Create: 2, + GetLocked: 3, + GetLockedWaited: 4, + BusyLocked: 5, + MissLocked: 6, + PageRetries: 7, + PageFound: 8, + GetRead: 9, + }, + }, + }, + { + name: "xpc bad", + s: "xpc 1", + invalid: true, + }, + { + name: "xpc OK", + s: "xpc 1 2 3", + stats: &xfs.Stats{ + ExtendedPrecision: xfs.ExtendedPrecisionStats{ + FlushBytes: 1, + WriteBytes: 2, + ReadBytes: 3, + }, + }, + }, + { + name: "fixtures OK", + fs: true, + stats: &xfs.Stats{ + ExtentAllocation: xfs.ExtentAllocationStats{ + ExtentsAllocated: 92447, + BlocksAllocated: 97589, + ExtentsFreed: 92448, + BlocksFreed: 93751, + }, + AllocationBTree: xfs.BTreeStats{ + Lookups: 0, + Compares: 0, + RecordsInserted: 0, + RecordsDeleted: 0, + }, + BlockMapping: xfs.BlockMappingStats{ + Reads: 1767055, + Writes: 188820, + Unmaps: 184891, + ExtentListInsertions: 92447, + ExtentListDeletions: 92448, + ExtentListLookups: 2140766, + ExtentListCompares: 0, + }, + BlockMapBTree: xfs.BTreeStats{ + Lookups: 0, + Compares: 0, + RecordsInserted: 0, + RecordsDeleted: 0, + }, + DirectoryOperation: xfs.DirectoryOperationStats{ + Lookups: 185039, + Creates: 92447, + Removes: 92444, + Getdents: 136422, + }, + Transaction: xfs.TransactionStats{ + Sync: 706, + Async: 944304, + Empty: 0, + }, + InodeOperation: xfs.InodeOperationStats{ + Attempts: 185045, + Found: 58807, + Recycle: 0, + Missed: 126238, + Duplicate: 0, + Reclaims: 33637, + AttributeChange: 22, + }, + LogOperation: xfs.LogOperationStats{ + Writes: 2883, + Blocks: 113448, + NoInternalBuffers: 9, + Force: 17360, + ForceSleep: 739, + }, + ReadWrite: xfs.ReadWriteStats{ + Read: 107739, + Write: 94045, + }, + AttributeOperation: xfs.AttributeOperationStats{ + Get: 4, + Set: 0, + Remove: 0, + List: 0, + }, + InodeClustering: xfs.InodeClusteringStats{ + Iflush: 8677, + Flush: 7849, + FlushInode: 135802, + }, + Vnode: xfs.VnodeStats{ + Active: 92601, + Allocate: 0, + Get: 0, + Hold: 0, + Release: 92444, + Reclaim: 92444, + Remove: 92444, + Free: 0, + }, + Buffer: xfs.BufferStats{ + Get: 2666287, + Create: 7122, + GetLocked: 2659202, + GetLockedWaited: 3599, + BusyLocked: 2, + MissLocked: 7085, + PageRetries: 0, + PageFound: 10297, + GetRead: 7085, + }, + ExtendedPrecision: xfs.ExtendedPrecisionStats{ + FlushBytes: 399724544, + WriteBytes: 92823103, + ReadBytes: 86219234, + }, + }, + }, + } + + for _, tt := range tests { + var ( + stats *xfs.Stats + err error + ) + + if tt.s != "" { + stats, err = xfs.ParseStats(strings.NewReader(tt.s)) + } + if tt.fs { + stats, err = procfs.FS("../fixtures").XFSStats() + } + + if tt.invalid && err == nil { + t.Error("expected an error, but none occurred") + } + if !tt.invalid && err != nil { + t.Errorf("unexpected error: %v", err) + } + + if want, have := tt.stats, stats; !reflect.DeepEqual(want, have) { + t.Errorf("unexpected XFS stats:\nwant:\n%v\nhave:\n%v", want, have) + } + } +} diff --git a/api/vendor/github.com/prometheus/procfs/xfs/xfs.go b/api/vendor/github.com/prometheus/procfs/xfs/xfs.go new file mode 100644 index 0000000..d86794b --- /dev/null +++ b/api/vendor/github.com/prometheus/procfs/xfs/xfs.go @@ -0,0 +1,163 @@ +// Copyright 2017 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 xfs provides access to statistics exposed by the XFS filesystem. +package xfs + +// Stats contains XFS filesystem runtime statistics, parsed from +// /proc/fs/xfs/stat. +// +// The names and meanings of each statistic were taken from +// http://xfs.org/index.php/Runtime_Stats and xfs_stats.h in the Linux +// kernel source. Most counters are uint32s (same data types used in +// xfs_stats.h), but some of the "extended precision stats" are uint64s. +type Stats struct { + // The name of the filesystem used to source these statistics. + // If empty, this indicates aggregated statistics for all XFS + // filesystems on the host. + Name string + + ExtentAllocation ExtentAllocationStats + AllocationBTree BTreeStats + BlockMapping BlockMappingStats + BlockMapBTree BTreeStats + DirectoryOperation DirectoryOperationStats + Transaction TransactionStats + InodeOperation InodeOperationStats + LogOperation LogOperationStats + ReadWrite ReadWriteStats + AttributeOperation AttributeOperationStats + InodeClustering InodeClusteringStats + Vnode VnodeStats + Buffer BufferStats + ExtendedPrecision ExtendedPrecisionStats +} + +// ExtentAllocationStats contains statistics regarding XFS extent allocations. +type ExtentAllocationStats struct { + ExtentsAllocated uint32 + BlocksAllocated uint32 + ExtentsFreed uint32 + BlocksFreed uint32 +} + +// BTreeStats contains statistics regarding an XFS internal B-tree. +type BTreeStats struct { + Lookups uint32 + Compares uint32 + RecordsInserted uint32 + RecordsDeleted uint32 +} + +// BlockMappingStats contains statistics regarding XFS block maps. +type BlockMappingStats struct { + Reads uint32 + Writes uint32 + Unmaps uint32 + ExtentListInsertions uint32 + ExtentListDeletions uint32 + ExtentListLookups uint32 + ExtentListCompares uint32 +} + +// DirectoryOperationStats contains statistics regarding XFS directory entries. +type DirectoryOperationStats struct { + Lookups uint32 + Creates uint32 + Removes uint32 + Getdents uint32 +} + +// TransactionStats contains statistics regarding XFS metadata transactions. +type TransactionStats struct { + Sync uint32 + Async uint32 + Empty uint32 +} + +// InodeOperationStats contains statistics regarding XFS inode operations. +type InodeOperationStats struct { + Attempts uint32 + Found uint32 + Recycle uint32 + Missed uint32 + Duplicate uint32 + Reclaims uint32 + AttributeChange uint32 +} + +// LogOperationStats contains statistics regarding the XFS log buffer. +type LogOperationStats struct { + Writes uint32 + Blocks uint32 + NoInternalBuffers uint32 + Force uint32 + ForceSleep uint32 +} + +// ReadWriteStats contains statistics regarding the number of read and write +// system calls for XFS filesystems. +type ReadWriteStats struct { + Read uint32 + Write uint32 +} + +// AttributeOperationStats contains statistics regarding manipulation of +// XFS extended file attributes. +type AttributeOperationStats struct { + Get uint32 + Set uint32 + Remove uint32 + List uint32 +} + +// InodeClusteringStats contains statistics regarding XFS inode clustering +// operations. +type InodeClusteringStats struct { + Iflush uint32 + Flush uint32 + FlushInode uint32 +} + +// VnodeStats contains statistics regarding XFS vnode operations. +type VnodeStats struct { + Active uint32 + Allocate uint32 + Get uint32 + Hold uint32 + Release uint32 + Reclaim uint32 + Remove uint32 + Free uint32 +} + +// BufferStats contains statistics regarding XFS read/write I/O buffers. +type BufferStats struct { + Get uint32 + Create uint32 + GetLocked uint32 + GetLockedWaited uint32 + BusyLocked uint32 + MissLocked uint32 + PageRetries uint32 + PageFound uint32 + GetRead uint32 +} + +// ExtendedPrecisionStats contains high precision counters used to track the +// total number of bytes read, written, or flushed, during XFS operations. +type ExtendedPrecisionStats struct { + FlushBytes uint64 + WriteBytes uint64 + ReadBytes uint64 +} diff --git a/api/vendor/github.com/rs/cors/.travis.yml b/api/vendor/github.com/rs/cors/.travis.yml new file mode 100644 index 0000000..17e5e50 --- /dev/null +++ b/api/vendor/github.com/rs/cors/.travis.yml @@ -0,0 +1,8 @@ +language: go +go: +- 1.9 +- "1.10" +- tip +matrix: + allow_failures: + - go: tip diff --git a/api/vendor/github.com/rs/cors/LICENSE b/api/vendor/github.com/rs/cors/LICENSE new file mode 100644 index 0000000..d8e2df5 --- /dev/null +++ b/api/vendor/github.com/rs/cors/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2014 Olivier Poitrey + +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/api/vendor/github.com/rs/cors/README.md b/api/vendor/github.com/rs/cors/README.md new file mode 100644 index 0000000..425ed96 --- /dev/null +++ b/api/vendor/github.com/rs/cors/README.md @@ -0,0 +1,105 @@ +# Go CORS handler [![godoc](http://img.shields.io/badge/godoc-reference-blue.svg?style=flat)](https://godoc.org/github.com/rs/cors) [![license](http://img.shields.io/badge/license-MIT-red.svg?style=flat)](https://raw.githubusercontent.com/rs/cors/master/LICENSE) [![build](https://img.shields.io/travis/rs/cors.svg?style=flat)](https://travis-ci.org/rs/cors) [![Coverage](http://gocover.io/_badge/github.com/rs/cors)](http://gocover.io/github.com/rs/cors) + +CORS is a `net/http` handler implementing [Cross Origin Resource Sharing W3 specification](http://www.w3.org/TR/cors/) in Golang. + +## Getting Started + +After installing Go and setting up your [GOPATH](http://golang.org/doc/code.html#GOPATH), create your first `.go` file. We'll call it `server.go`. + +```go +package main + +import ( + "net/http" + + "github.com/rs/cors" +) + +func main() { + mux := http.NewServeMux() + mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + w.Write([]byte("{\"hello\": \"world\"}")) + }) + + // cors.Default() setup the middleware with default options being + // all origins accepted with simple methods (GET, POST). See + // documentation below for more options. + handler := cors.Default().Handler(mux) + http.ListenAndServe(":8080", handler) +} +``` + +Install `cors`: + + go get github.com/rs/cors + +Then run your server: + + go run server.go + +The server now runs on `localhost:8080`: + + $ curl -D - -H 'Origin: http://foo.com' http://localhost:8080/ + HTTP/1.1 200 OK + Access-Control-Allow-Origin: foo.com + Content-Type: application/json + Date: Sat, 25 Oct 2014 03:43:57 GMT + Content-Length: 18 + + {"hello": "world"} + +### More Examples + +* `net/http`: [examples/nethttp/server.go](https://github.com/rs/cors/blob/master/examples/nethttp/server.go) +* [Goji](https://goji.io): [examples/goji/server.go](https://github.com/rs/cors/blob/master/examples/goji/server.go) +* [Martini](http://martini.codegangsta.io): [examples/martini/server.go](https://github.com/rs/cors/blob/master/examples/martini/server.go) +* [Negroni](https://github.com/codegangsta/negroni): [examples/negroni/server.go](https://github.com/rs/cors/blob/master/examples/negroni/server.go) +* [Alice](https://github.com/justinas/alice): [examples/alice/server.go](https://github.com/rs/cors/blob/master/examples/alice/server.go) +* [HttpRouter](https://github.com/julienschmidt/httprouter): [examples/httprouter/server.go](https://github.com/rs/cors/blob/master/examples/httprouter/server.go) +* [Gorilla](http://www.gorillatoolkit.org/pkg/mux): [examples/gorilla/server.go](https://github.com/rs/cors/blob/master/examples/gorilla/server.go) +* [Buffalo](https://gobuffalo.io): [examples/buffalo/server.go](https://github.com/rs/cors/blob/master/examples/buffalo/server.go) +* [Gin](https://gin-gonic.github.io/gin): [examples/gin/server.go](https://github.com/rs/cors/blob/master/examples/gin/server.go) + +## Parameters + +Parameters are passed to the middleware thru the `cors.New` method as follow: + +```go +c := cors.New(cors.Options{ + AllowedOrigins: []string{"http://foo.com", "http://foo.com:8080"}, + AllowCredentials: true, + // Enable Debugging for testing, consider disabling in production + Debug: true, +}) + +// Insert the middleware +handler = c.Handler(handler) +``` + +* **AllowedOrigins** `[]string`: A list of origins a cross-domain request can be executed from. If the special `*` value is present in the list, all origins will be allowed. An origin may contain a wildcard (`*`) to replace 0 or more characters (i.e.: `http://*.domain.com`). Usage of wildcards implies a small performance penality. Only one wildcard can be used per origin. The default value is `*`. +* **AllowOriginFunc** `func (origin string) bool`: A custom function to validate the origin. It take the origin as argument and returns true if allowed or false otherwise. If this option is set, the content of `AllowedOrigins` is ignored +* **AllowedMethods** `[]string`: A list of methods the client is allowed to use with cross-domain requests. Default value is simple methods (`GET` and `POST`). +* **AllowedHeaders** `[]string`: A list of non simple headers the client is allowed to use with cross-domain requests. +* **ExposedHeaders** `[]string`: Indicates which headers are safe to expose to the API of a CORS API specification +* **AllowCredentials** `bool`: Indicates whether the request can include user credentials like cookies, HTTP authentication or client side SSL certificates. The default is `false`. +* **MaxAge** `int`: Indicates how long (in seconds) the results of a preflight request can be cached. The default is `0` which stands for no max age. +* **OptionsPassthrough** `bool`: Instructs preflight to let other potential next handlers to process the `OPTIONS` method. Turn this on if your application handles `OPTIONS`. +* **Debug** `bool`: Debugging flag adds additional output to debug server side CORS issues. + +See [API documentation](http://godoc.org/github.com/rs/cors) for more info. + +## Benchmarks + + BenchmarkWithout 20000000 64.6 ns/op 8 B/op 1 allocs/op + BenchmarkDefault 3000000 469 ns/op 114 B/op 2 allocs/op + BenchmarkAllowedOrigin 3000000 608 ns/op 114 B/op 2 allocs/op + BenchmarkPreflight 20000000 73.2 ns/op 0 B/op 0 allocs/op + BenchmarkPreflightHeader 20000000 73.6 ns/op 0 B/op 0 allocs/op + BenchmarkParseHeaderList 2000000 847 ns/op 184 B/op 6 allocs/op + BenchmarkParse…Single 5000000 290 ns/op 32 B/op 3 allocs/op + BenchmarkParse…Normalized 2000000 776 ns/op 160 B/op 6 allocs/op + +## Licenses + +All source code is licensed under the [MIT License](https://raw.github.com/rs/cors/master/LICENSE). diff --git a/api/vendor/github.com/rs/cors/bench_test.go b/api/vendor/github.com/rs/cors/bench_test.go new file mode 100644 index 0000000..b6e3721 --- /dev/null +++ b/api/vendor/github.com/rs/cors/bench_test.go @@ -0,0 +1,88 @@ +package cors + +import ( + "net/http" + "testing" +) + +type FakeResponse struct { + header http.Header +} + +func (r FakeResponse) Header() http.Header { + return r.header +} + +func (r FakeResponse) WriteHeader(n int) { +} + +func (r FakeResponse) Write(b []byte) (n int, err error) { + return len(b), nil +} + +func BenchmarkWithout(b *testing.B) { + res := FakeResponse{http.Header{}} + req, _ := http.NewRequest("GET", "http://example.com/foo", nil) + + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + testHandler.ServeHTTP(res, req) + } +} + +func BenchmarkDefault(b *testing.B) { + res := FakeResponse{http.Header{}} + req, _ := http.NewRequest("GET", "http://example.com/foo", nil) + req.Header.Add("Origin", "somedomain.com") + handler := Default().Handler(testHandler) + + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + handler.ServeHTTP(res, req) + } +} + +func BenchmarkAllowedOrigin(b *testing.B) { + res := FakeResponse{http.Header{}} + req, _ := http.NewRequest("GET", "http://example.com/foo", nil) + req.Header.Add("Origin", "somedomain.com") + c := New(Options{ + AllowedOrigins: []string{"somedomain.com"}, + }) + handler := c.Handler(testHandler) + + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + handler.ServeHTTP(res, req) + } +} + +func BenchmarkPreflight(b *testing.B) { + res := FakeResponse{http.Header{}} + req, _ := http.NewRequest("OPTIONS", "http://example.com/foo", nil) + req.Header.Add("Access-Control-Request-Method", "GET") + handler := Default().Handler(testHandler) + + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + handler.ServeHTTP(res, req) + } +} + +func BenchmarkPreflightHeader(b *testing.B) { + res := FakeResponse{http.Header{}} + req, _ := http.NewRequest("OPTIONS", "http://example.com/foo", nil) + req.Header.Add("Access-Control-Request-Method", "GET") + req.Header.Add("Access-Control-Request-Headers", "Accept") + handler := Default().Handler(testHandler) + + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + handler.ServeHTTP(res, req) + } +} diff --git a/api/vendor/github.com/rs/cors/cors.go b/api/vendor/github.com/rs/cors/cors.go new file mode 100644 index 0000000..0aa4f51 --- /dev/null +++ b/api/vendor/github.com/rs/cors/cors.go @@ -0,0 +1,407 @@ +/* +Package cors is net/http handler to handle CORS related requests +as defined by http://www.w3.org/TR/cors/ + +You can configure it by passing an option struct to cors.New: + + c := cors.New(cors.Options{ + AllowedOrigins: []string{"foo.com"}, + AllowedMethods: []string{"GET", "POST", "DELETE"}, + AllowCredentials: true, + }) + +Then insert the handler in the chain: + + handler = c.Handler(handler) + +See Options documentation for more options. + +The resulting handler is a standard net/http handler. +*/ +package cors + +import ( + "log" + "net/http" + "os" + "strconv" + "strings" +) + +// Options is a configuration container to setup the CORS middleware. +type Options struct { + // AllowedOrigins is a list of origins a cross-domain request can be executed from. + // If the special "*" value is present in the list, all origins will be allowed. + // An origin may contain a wildcard (*) to replace 0 or more characters + // (i.e.: http://*.domain.com). Usage of wildcards implies a small performance penalty. + // Only one wildcard can be used per origin. + // Default value is ["*"] + AllowedOrigins []string + // AllowOriginFunc is a custom function to validate the origin. It take the origin + // as argument and returns true if allowed or false otherwise. If this option is + // set, the content of AllowedOrigins is ignored. + AllowOriginFunc func(origin string) bool + // AllowedMethods is a list of methods the client is allowed to use with + // cross-domain requests. Default value is simple methods (HEAD, GET and POST). + AllowedMethods []string + // AllowedHeaders is list of non simple headers the client is allowed to use with + // cross-domain requests. + // If the special "*" value is present in the list, all headers will be allowed. + // Default value is [] but "Origin" is always appended to the list. + AllowedHeaders []string + // ExposedHeaders indicates which headers are safe to expose to the API of a CORS + // API specification + ExposedHeaders []string + // MaxAge indicates how long (in seconds) the results of a preflight request + // can be cached + MaxAge int + // AllowCredentials indicates whether the request can include user credentials like + // cookies, HTTP authentication or client side SSL certificates. + AllowCredentials bool + // OptionsPassthrough instructs preflight to let other potential next handlers to + // process the OPTIONS method. Turn this on if your application handles OPTIONS. + OptionsPassthrough bool + // Debugging flag adds additional output to debug server side CORS issues + Debug bool +} + +// Cors http handler +type Cors struct { + // Debug logger + Log *log.Logger + // Normalized list of plain allowed origins + allowedOrigins []string + // List of allowed origins containing wildcards + allowedWOrigins []wildcard + // Optional origin validator function + allowOriginFunc func(origin string) bool + // Normalized list of allowed headers + allowedHeaders []string + // Normalized list of allowed methods + allowedMethods []string + // Normalized list of exposed headers + exposedHeaders []string + maxAge int + // Set to true when allowed origins contains a "*" + allowedOriginsAll bool + // Set to true when allowed headers contains a "*" + allowedHeadersAll bool + allowCredentials bool + optionPassthrough bool +} + +// New creates a new Cors handler with the provided options. +func New(options Options) *Cors { + c := &Cors{ + exposedHeaders: convert(options.ExposedHeaders, http.CanonicalHeaderKey), + allowOriginFunc: options.AllowOriginFunc, + allowCredentials: options.AllowCredentials, + maxAge: options.MaxAge, + optionPassthrough: options.OptionsPassthrough, + } + if options.Debug { + c.Log = log.New(os.Stdout, "[cors] ", log.LstdFlags) + } + + // Normalize options + // Note: for origins and methods matching, the spec requires a case-sensitive matching. + // As it may error prone, we chose to ignore the spec here. + + // Allowed Origins + if len(options.AllowedOrigins) == 0 { + if options.AllowOriginFunc == nil { + // Default is all origins + c.allowedOriginsAll = true + } + } else { + c.allowedOrigins = []string{} + c.allowedWOrigins = []wildcard{} + for _, origin := range options.AllowedOrigins { + // Normalize + origin = strings.ToLower(origin) + if origin == "*" { + // If "*" is present in the list, turn the whole list into a match all + c.allowedOriginsAll = true + c.allowedOrigins = nil + c.allowedWOrigins = nil + break + } else if i := strings.IndexByte(origin, '*'); i >= 0 { + // Split the origin in two: start and end string without the * + w := wildcard{origin[0:i], origin[i+1:]} + c.allowedWOrigins = append(c.allowedWOrigins, w) + } else { + c.allowedOrigins = append(c.allowedOrigins, origin) + } + } + } + + // Allowed Headers + if len(options.AllowedHeaders) == 0 { + // Use sensible defaults + c.allowedHeaders = []string{"Origin", "Accept", "Content-Type", "X-Requested-With"} + } else { + // Origin is always appended as some browsers will always request for this header at preflight + c.allowedHeaders = convert(append(options.AllowedHeaders, "Origin"), http.CanonicalHeaderKey) + for _, h := range options.AllowedHeaders { + if h == "*" { + c.allowedHeadersAll = true + c.allowedHeaders = nil + break + } + } + } + + // Allowed Methods + if len(options.AllowedMethods) == 0 { + // Default is spec's "simple" methods + c.allowedMethods = []string{"GET", "POST", "HEAD"} + } else { + c.allowedMethods = convert(options.AllowedMethods, strings.ToUpper) + } + + return c +} + +// Default creates a new Cors handler with default options. +func Default() *Cors { + return New(Options{}) +} + +// AllowAll create a new Cors handler with permissive configuration allowing all +// origins with all standard methods with any header and credentials. +func AllowAll() *Cors { + return New(Options{ + AllowedOrigins: []string{"*"}, + AllowedMethods: []string{"HEAD", "GET", "POST", "PUT", "PATCH", "DELETE"}, + AllowedHeaders: []string{"*"}, + AllowCredentials: true, + }) +} + +// Handler apply the CORS specification on the request, and add relevant CORS headers +// as necessary. +func (c *Cors) Handler(h http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method == http.MethodOptions && r.Header.Get("Access-Control-Request-Method") != "" { + c.logf("Handler: Preflight request") + c.handlePreflight(w, r) + // Preflight requests are standalone and should stop the chain as some other + // middleware may not handle OPTIONS requests correctly. One typical example + // is authentication middleware ; OPTIONS requests won't carry authentication + // headers (see #1) + if c.optionPassthrough { + h.ServeHTTP(w, r) + } else { + w.WriteHeader(http.StatusOK) + } + } else { + c.logf("Handler: Actual request") + c.handleActualRequest(w, r) + h.ServeHTTP(w, r) + } + }) +} + +// HandlerFunc provides Martini compatible handler +func (c *Cors) HandlerFunc(w http.ResponseWriter, r *http.Request) { + if r.Method == http.MethodOptions && r.Header.Get("Access-Control-Request-Method") != "" { + c.logf("HandlerFunc: Preflight request") + c.handlePreflight(w, r) + } else { + c.logf("HandlerFunc: Actual request") + c.handleActualRequest(w, r) + } +} + +// Negroni compatible interface +func (c *Cors) ServeHTTP(w http.ResponseWriter, r *http.Request, next http.HandlerFunc) { + if r.Method == http.MethodOptions && r.Header.Get("Access-Control-Request-Method") != "" { + c.logf("ServeHTTP: Preflight request") + c.handlePreflight(w, r) + // Preflight requests are standalone and should stop the chain as some other + // middleware may not handle OPTIONS requests correctly. One typical example + // is authentication middleware ; OPTIONS requests won't carry authentication + // headers (see #1) + if c.optionPassthrough { + next(w, r) + } else { + w.WriteHeader(http.StatusOK) + } + } else { + c.logf("ServeHTTP: Actual request") + c.handleActualRequest(w, r) + next(w, r) + } +} + +// handlePreflight handles pre-flight CORS requests +func (c *Cors) handlePreflight(w http.ResponseWriter, r *http.Request) { + headers := w.Header() + origin := r.Header.Get("Origin") + + if r.Method != http.MethodOptions { + c.logf(" Preflight aborted: %s!=OPTIONS", r.Method) + return + } + // Always set Vary headers + // see https://github.com/rs/cors/issues/10, + // https://github.com/rs/cors/commit/dbdca4d95feaa7511a46e6f1efb3b3aa505bc43f#commitcomment-12352001 + headers.Add("Vary", "Origin") + headers.Add("Vary", "Access-Control-Request-Method") + headers.Add("Vary", "Access-Control-Request-Headers") + + if origin == "" { + c.logf(" Preflight aborted: empty origin") + return + } + if !c.isOriginAllowed(origin) { + c.logf(" Preflight aborted: origin '%s' not allowed", origin) + return + } + + reqMethod := r.Header.Get("Access-Control-Request-Method") + if !c.isMethodAllowed(reqMethod) { + c.logf(" Preflight aborted: method '%s' not allowed", reqMethod) + return + } + reqHeaders := parseHeaderList(r.Header.Get("Access-Control-Request-Headers")) + if !c.areHeadersAllowed(reqHeaders) { + c.logf(" Preflight aborted: headers '%v' not allowed", reqHeaders) + return + } + if c.allowedOriginsAll && !c.allowCredentials { + headers.Set("Access-Control-Allow-Origin", "*") + } else { + headers.Set("Access-Control-Allow-Origin", origin) + } + // Spec says: Since the list of methods can be unbounded, simply returning the method indicated + // by Access-Control-Request-Method (if supported) can be enough + headers.Set("Access-Control-Allow-Methods", strings.ToUpper(reqMethod)) + if len(reqHeaders) > 0 { + + // Spec says: Since the list of headers can be unbounded, simply returning supported headers + // from Access-Control-Request-Headers can be enough + headers.Set("Access-Control-Allow-Headers", strings.Join(reqHeaders, ", ")) + } + if c.allowCredentials { + headers.Set("Access-Control-Allow-Credentials", "true") + } + if c.maxAge > 0 { + headers.Set("Access-Control-Max-Age", strconv.Itoa(c.maxAge)) + } + c.logf(" Preflight response headers: %v", headers) +} + +// handleActualRequest handles simple cross-origin requests, actual request or redirects +func (c *Cors) handleActualRequest(w http.ResponseWriter, r *http.Request) { + headers := w.Header() + origin := r.Header.Get("Origin") + + if r.Method == http.MethodOptions { + c.logf(" Actual request no headers added: method == %s", r.Method) + return + } + // Always set Vary, see https://github.com/rs/cors/issues/10 + headers.Add("Vary", "Origin") + if origin == "" { + c.logf(" Actual request no headers added: missing origin") + return + } + if !c.isOriginAllowed(origin) { + c.logf(" Actual request no headers added: origin '%s' not allowed", origin) + return + } + + // Note that spec does define a way to specifically disallow a simple method like GET or + // POST. Access-Control-Allow-Methods is only used for pre-flight requests and the + // spec doesn't instruct to check the allowed methods for simple cross-origin requests. + // We think it's a nice feature to be able to have control on those methods though. + if !c.isMethodAllowed(r.Method) { + c.logf(" Actual request no headers added: method '%s' not allowed", r.Method) + + return + } + if c.allowedOriginsAll && !c.allowCredentials { + headers.Set("Access-Control-Allow-Origin", "*") + } else { + headers.Set("Access-Control-Allow-Origin", origin) + } + if len(c.exposedHeaders) > 0 { + headers.Set("Access-Control-Expose-Headers", strings.Join(c.exposedHeaders, ", ")) + } + if c.allowCredentials { + headers.Set("Access-Control-Allow-Credentials", "true") + } + c.logf(" Actual response added headers: %v", headers) +} + +// convenience method. checks if debugging is turned on before printing +func (c *Cors) logf(format string, a ...interface{}) { + if c.Log != nil { + c.Log.Printf(format, a...) + } +} + +// isOriginAllowed checks if a given origin is allowed to perform cross-domain requests +// on the endpoint +func (c *Cors) isOriginAllowed(origin string) bool { + if c.allowOriginFunc != nil { + return c.allowOriginFunc(origin) + } + if c.allowedOriginsAll { + return true + } + origin = strings.ToLower(origin) + for _, o := range c.allowedOrigins { + if o == origin { + return true + } + } + for _, w := range c.allowedWOrigins { + if w.match(origin) { + return true + } + } + return false +} + +// isMethodAllowed checks if a given method can be used as part of a cross-domain request +// on the endpoing +func (c *Cors) isMethodAllowed(method string) bool { + if len(c.allowedMethods) == 0 { + // If no method allowed, always return false, even for preflight request + return false + } + method = strings.ToUpper(method) + if method == http.MethodOptions { + // Always allow preflight requests + return true + } + for _, m := range c.allowedMethods { + if m == method { + return true + } + } + return false +} + +// areHeadersAllowed checks if a given list of headers are allowed to used within +// a cross-domain request. +func (c *Cors) areHeadersAllowed(requestedHeaders []string) bool { + if c.allowedHeadersAll || len(requestedHeaders) == 0 { + return true + } + for _, header := range requestedHeaders { + header = http.CanonicalHeaderKey(header) + found := false + for _, h := range c.allowedHeaders { + if h == header { + found = true + } + } + if !found { + return false + } + } + return true +} diff --git a/api/vendor/github.com/rs/cors/cors_test.go b/api/vendor/github.com/rs/cors/cors_test.go new file mode 100644 index 0000000..a29ac4e --- /dev/null +++ b/api/vendor/github.com/rs/cors/cors_test.go @@ -0,0 +1,521 @@ +package cors + +import ( + "net/http" + "net/http/httptest" + "regexp" + "strings" + "testing" +) + +var testHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Write([]byte("bar")) +}) + +var allHeaders = []string{ + "Vary", + "Access-Control-Allow-Origin", + "Access-Control-Allow-Methods", + "Access-Control-Allow-Headers", + "Access-Control-Allow-Credentials", + "Access-Control-Max-Age", + "Access-Control-Expose-Headers", +} + +func assertHeaders(t *testing.T, resHeaders http.Header, expHeaders map[string]string) { + for _, name := range allHeaders { + got := strings.Join(resHeaders[name], ", ") + want := expHeaders[name] + if got != want { + t.Errorf("Response header %q = %q, want %q", name, got, want) + } + } +} + +func assertResponse(t *testing.T, res *httptest.ResponseRecorder, responseCode int) { + if responseCode != res.Code { + t.Errorf("assertResponse: expected response code to be %d but got %d. ", responseCode, res.Code) + } +} + +func TestSpec(t *testing.T) { + cases := []struct { + name string + options Options + method string + reqHeaders map[string]string + resHeaders map[string]string + }{ + { + "NoConfig", + Options{ + // Intentionally left blank. + }, + "GET", + map[string]string{}, + map[string]string{ + "Vary": "Origin", + }, + }, + { + "MatchAllOrigin", + Options{ + AllowedOrigins: []string{"*"}, + }, + "GET", + map[string]string{ + "Origin": "http://foobar.com", + }, + map[string]string{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + }, + }, + { + "MatchAllOriginWithCredentials", + Options{ + AllowedOrigins: []string{"*"}, + AllowCredentials: true, + }, + "GET", + map[string]string{ + "Origin": "http://foobar.com", + }, + map[string]string{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "http://foobar.com", + "Access-Control-Allow-Credentials": "true", + }, + }, + { + "AllowedOrigin", + Options{ + AllowedOrigins: []string{"http://foobar.com"}, + }, + "GET", + map[string]string{ + "Origin": "http://foobar.com", + }, + map[string]string{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "http://foobar.com", + }, + }, + { + "WildcardOrigin", + Options{ + AllowedOrigins: []string{"http://*.bar.com"}, + }, + "GET", + map[string]string{ + "Origin": "http://foo.bar.com", + }, + map[string]string{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "http://foo.bar.com", + }, + }, + { + "DisallowedOrigin", + Options{ + AllowedOrigins: []string{"http://foobar.com"}, + }, + "GET", + map[string]string{ + "Origin": "http://barbaz.com", + }, + map[string]string{ + "Vary": "Origin", + }, + }, + { + "DisallowedWildcardOrigin", + Options{ + AllowedOrigins: []string{"http://*.bar.com"}, + }, + "GET", + map[string]string{ + "Origin": "http://foo.baz.com", + }, + map[string]string{ + "Vary": "Origin", + }, + }, + { + "AllowedOriginFuncMatch", + Options{ + AllowOriginFunc: func(o string) bool { + return regexp.MustCompile("^http://foo").MatchString(o) + }, + }, + "GET", + map[string]string{ + "Origin": "http://foobar.com", + }, + map[string]string{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "http://foobar.com", + }, + }, + { + "AllowedOriginFuncNotMatch", + Options{ + AllowOriginFunc: func(o string) bool { + return regexp.MustCompile("^http://foo").MatchString(o) + }, + }, + "GET", + map[string]string{ + "Origin": "http://barfoo.com", + }, + map[string]string{ + "Vary": "Origin", + }, + }, + { + "MaxAge", + Options{ + AllowedOrigins: []string{"http://example.com/"}, + AllowedMethods: []string{"GET"}, + MaxAge: 10, + }, + "OPTIONS", + map[string]string{ + "Origin": "http://example.com/", + "Access-Control-Request-Method": "GET", + }, + map[string]string{ + "Vary": "Origin, Access-Control-Request-Method, Access-Control-Request-Headers", + "Access-Control-Allow-Origin": "http://example.com/", + "Access-Control-Allow-Methods": "GET", + "Access-Control-Max-Age": "10", + }, + }, + { + "AllowedMethod", + Options{ + AllowedOrigins: []string{"http://foobar.com"}, + AllowedMethods: []string{"PUT", "DELETE"}, + }, + "OPTIONS", + map[string]string{ + "Origin": "http://foobar.com", + "Access-Control-Request-Method": "PUT", + }, + map[string]string{ + "Vary": "Origin, Access-Control-Request-Method, Access-Control-Request-Headers", + "Access-Control-Allow-Origin": "http://foobar.com", + "Access-Control-Allow-Methods": "PUT", + }, + }, + { + "DisallowedMethod", + Options{ + AllowedOrigins: []string{"http://foobar.com"}, + AllowedMethods: []string{"PUT", "DELETE"}, + }, + "OPTIONS", + map[string]string{ + "Origin": "http://foobar.com", + "Access-Control-Request-Method": "PATCH", + }, + map[string]string{ + "Vary": "Origin, Access-Control-Request-Method, Access-Control-Request-Headers", + }, + }, + { + "AllowedHeaders", + Options{ + AllowedOrigins: []string{"http://foobar.com"}, + AllowedHeaders: []string{"X-Header-1", "x-header-2"}, + }, + "OPTIONS", + map[string]string{ + "Origin": "http://foobar.com", + "Access-Control-Request-Method": "GET", + "Access-Control-Request-Headers": "X-Header-2, X-HEADER-1", + }, + map[string]string{ + "Vary": "Origin, Access-Control-Request-Method, Access-Control-Request-Headers", + "Access-Control-Allow-Origin": "http://foobar.com", + "Access-Control-Allow-Methods": "GET", + "Access-Control-Allow-Headers": "X-Header-2, X-Header-1", + }, + }, + { + "DefaultAllowedHeaders", + Options{ + AllowedOrigins: []string{"http://foobar.com"}, + AllowedHeaders: []string{}, + }, + "OPTIONS", + map[string]string{ + "Origin": "http://foobar.com", + "Access-Control-Request-Method": "GET", + "Access-Control-Request-Headers": "X-Requested-With", + }, + map[string]string{ + "Vary": "Origin, Access-Control-Request-Method, Access-Control-Request-Headers", + "Access-Control-Allow-Origin": "http://foobar.com", + "Access-Control-Allow-Methods": "GET", + "Access-Control-Allow-Headers": "X-Requested-With", + }, + }, + { + "AllowedWildcardHeader", + Options{ + AllowedOrigins: []string{"http://foobar.com"}, + AllowedHeaders: []string{"*"}, + }, + "OPTIONS", + map[string]string{ + "Origin": "http://foobar.com", + "Access-Control-Request-Method": "GET", + "Access-Control-Request-Headers": "X-Header-2, X-HEADER-1", + }, + map[string]string{ + "Vary": "Origin, Access-Control-Request-Method, Access-Control-Request-Headers", + "Access-Control-Allow-Origin": "http://foobar.com", + "Access-Control-Allow-Methods": "GET", + "Access-Control-Allow-Headers": "X-Header-2, X-Header-1", + }, + }, + { + "DisallowedHeader", + Options{ + AllowedOrigins: []string{"http://foobar.com"}, + AllowedHeaders: []string{"X-Header-1", "x-header-2"}, + }, + "OPTIONS", + map[string]string{ + "Origin": "http://foobar.com", + "Access-Control-Request-Method": "GET", + "Access-Control-Request-Headers": "X-Header-3, X-Header-1", + }, + map[string]string{ + "Vary": "Origin, Access-Control-Request-Method, Access-Control-Request-Headers", + }, + }, + { + "OriginHeader", + Options{ + AllowedOrigins: []string{"http://foobar.com"}, + }, + "OPTIONS", + map[string]string{ + "Origin": "http://foobar.com", + "Access-Control-Request-Method": "GET", + "Access-Control-Request-Headers": "origin", + }, + map[string]string{ + "Vary": "Origin, Access-Control-Request-Method, Access-Control-Request-Headers", + "Access-Control-Allow-Origin": "http://foobar.com", + "Access-Control-Allow-Methods": "GET", + "Access-Control-Allow-Headers": "Origin", + }, + }, + { + "ExposedHeader", + Options{ + AllowedOrigins: []string{"http://foobar.com"}, + ExposedHeaders: []string{"X-Header-1", "x-header-2"}, + }, + "GET", + map[string]string{ + "Origin": "http://foobar.com", + }, + map[string]string{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "http://foobar.com", + "Access-Control-Expose-Headers": "X-Header-1, X-Header-2", + }, + }, + { + "AllowedCredentials", + Options{ + AllowedOrigins: []string{"http://foobar.com"}, + AllowCredentials: true, + }, + "OPTIONS", + map[string]string{ + "Origin": "http://foobar.com", + "Access-Control-Request-Method": "GET", + }, + map[string]string{ + "Vary": "Origin, Access-Control-Request-Method, Access-Control-Request-Headers", + "Access-Control-Allow-Origin": "http://foobar.com", + "Access-Control-Allow-Methods": "GET", + "Access-Control-Allow-Credentials": "true", + }, + }, + { + "OptionPassthrough", + Options{ + OptionsPassthrough: true, + }, + "OPTIONS", + map[string]string{ + "Origin": "http://foobar.com", + "Access-Control-Request-Method": "GET", + }, + map[string]string{ + "Vary": "Origin, Access-Control-Request-Method, Access-Control-Request-Headers", + "Access-Control-Allow-Origin": "*", + "Access-Control-Allow-Methods": "GET", + }, + }, + { + "NonPreflightOptions", + Options{ + AllowedOrigins: []string{"http://foobar.com"}, + }, + "OPTIONS", + map[string]string{}, + map[string]string{}, + }, + } + for i := range cases { + tc := cases[i] + t.Run(tc.name, func(t *testing.T) { + s := New(tc.options) + + req, _ := http.NewRequest(tc.method, "http://example.com/foo", nil) + for name, value := range tc.reqHeaders { + req.Header.Add(name, value) + } + + t.Run("Handler", func(t *testing.T) { + res := httptest.NewRecorder() + s.Handler(testHandler).ServeHTTP(res, req) + assertHeaders(t, res.Header(), tc.resHeaders) + }) + t.Run("HandlerFunc", func(t *testing.T) { + res := httptest.NewRecorder() + s.HandlerFunc(res, req) + assertHeaders(t, res.Header(), tc.resHeaders) + }) + t.Run("Negroni", func(t *testing.T) { + res := httptest.NewRecorder() + s.ServeHTTP(res, req, testHandler) + assertHeaders(t, res.Header(), tc.resHeaders) + }) + + }) + } +} + +func TestDebug(t *testing.T) { + s := New(Options{ + Debug: true, + }) + + if s.Log == nil { + t.Error("Logger not created when debug=true") + } +} + +func TestDefault(t *testing.T) { + s := Default() + if s.Log != nil { + t.Error("c.log should be nil when Default") + } + if !s.allowedOriginsAll { + t.Error("c.allowedOriginsAll should be true when Default") + } + if s.allowedHeaders == nil { + t.Error("c.allowedHeaders should be nil when Default") + } + if s.allowedMethods == nil { + t.Error("c.allowedMethods should be nil when Default") + } +} + +func TestHandlePreflightInvalidOriginAbortion(t *testing.T) { + s := New(Options{ + AllowedOrigins: []string{"http://foo.com"}, + }) + res := httptest.NewRecorder() + req, _ := http.NewRequest("OPTIONS", "http://example.com/foo", nil) + req.Header.Add("Origin", "http://example.com/") + + s.handlePreflight(res, req) + + assertHeaders(t, res.Header(), map[string]string{ + "Vary": "Origin, Access-Control-Request-Method, Access-Control-Request-Headers", + }) +} + +func TestHandlePreflightNoOptionsAbortion(t *testing.T) { + s := New(Options{ + // Intentionally left blank. + }) + res := httptest.NewRecorder() + req, _ := http.NewRequest("GET", "http://example.com/foo", nil) + + s.handlePreflight(res, req) + + assertHeaders(t, res.Header(), map[string]string{}) +} + +func TestHandleActualRequestAbortsOptionsMethod(t *testing.T) { + s := New(Options{ + AllowedOrigins: []string{"http://foo.com"}, + }) + res := httptest.NewRecorder() + req, _ := http.NewRequest("OPTIONS", "http://example.com/foo", nil) + req.Header.Add("Origin", "http://example.com/") + + s.handleActualRequest(res, req) + + assertHeaders(t, res.Header(), map[string]string{}) +} + +func TestHandleActualRequestInvalidOriginAbortion(t *testing.T) { + s := New(Options{ + AllowedOrigins: []string{"http://foo.com"}, + }) + res := httptest.NewRecorder() + req, _ := http.NewRequest("GET", "http://example.com/foo", nil) + req.Header.Add("Origin", "http://example.com/") + + s.handleActualRequest(res, req) + + assertHeaders(t, res.Header(), map[string]string{ + "Vary": "Origin", + }) +} + +func TestHandleActualRequestInvalidMethodAbortion(t *testing.T) { + s := New(Options{ + AllowedMethods: []string{"POST"}, + AllowCredentials: true, + }) + res := httptest.NewRecorder() + req, _ := http.NewRequest("GET", "http://example.com/foo", nil) + req.Header.Add("Origin", "http://example.com/") + + s.handleActualRequest(res, req) + + assertHeaders(t, res.Header(), map[string]string{ + "Vary": "Origin", + }) +} + +func TestIsMethodAllowedReturnsFalseWithNoMethods(t *testing.T) { + s := New(Options{ + // Intentionally left blank. + }) + s.allowedMethods = []string{} + if s.isMethodAllowed("") { + t.Error("IsMethodAllowed should return false when c.allowedMethods is nil.") + } +} + +func TestIsMethodAllowedReturnsTrueWithOptions(t *testing.T) { + s := New(Options{ + // Intentionally left blank. + }) + if !s.isMethodAllowed("OPTIONS") { + t.Error("IsMethodAllowed should return true when c.allowedMethods is nil.") + } +} diff --git a/api/vendor/github.com/rs/cors/examples/alice/server.go b/api/vendor/github.com/rs/cors/examples/alice/server.go new file mode 100644 index 0000000..0a3e15c --- /dev/null +++ b/api/vendor/github.com/rs/cors/examples/alice/server.go @@ -0,0 +1,24 @@ +package main + +import ( + "net/http" + + "github.com/justinas/alice" + "github.com/rs/cors" +) + +func main() { + c := cors.New(cors.Options{ + AllowedOrigins: []string{"http://foo.com"}, + }) + + mux := http.NewServeMux() + + mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + w.Write([]byte("{\"hello\": \"world\"}")) + }) + + chain := alice.New(c.Handler).Then(mux) + http.ListenAndServe(":8080", chain) +} diff --git a/api/vendor/github.com/rs/cors/examples/buffalo/server.go b/api/vendor/github.com/rs/cors/examples/buffalo/server.go new file mode 100644 index 0000000..57a2445 --- /dev/null +++ b/api/vendor/github.com/rs/cors/examples/buffalo/server.go @@ -0,0 +1,36 @@ +package main + +import ( + "log" + + "github.com/gobuffalo/buffalo" + "github.com/gobuffalo/buffalo/render" + "github.com/rs/cors" +) + +var r *render.Engine + +func init() { + r = render.New(render.Options{}) +} + +func main() { + app := App() + if err := app.Serve(); err != nil { + log.Fatal(err) + } +} + +func App() *buffalo.App { + app := buffalo.New(buffalo.Options{ + PreWares: []buffalo.PreWare{cors.Default().Handler}, + }) + + app.GET("/", HomeHandler) + + return app +} + +func HomeHandler(c buffalo.Context) error { + return c.Render(200, r.JSON(map[string]string{"message": "Welcome to Buffalo!"})) +} diff --git a/api/vendor/github.com/rs/cors/examples/default/server.go b/api/vendor/github.com/rs/cors/examples/default/server.go new file mode 100644 index 0000000..ccb5e1b --- /dev/null +++ b/api/vendor/github.com/rs/cors/examples/default/server.go @@ -0,0 +1,19 @@ +package main + +import ( + "net/http" + + "github.com/rs/cors" +) + +func main() { + mux := http.NewServeMux() + mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + w.Write([]byte("{\"hello\": \"world\"}")) + }) + + // Use default options + handler := cors.Default().Handler(mux) + http.ListenAndServe(":8080", handler) +} diff --git a/api/vendor/github.com/rs/cors/examples/gin/server.go b/api/vendor/github.com/rs/cors/examples/gin/server.go new file mode 100644 index 0000000..a9d898e --- /dev/null +++ b/api/vendor/github.com/rs/cors/examples/gin/server.go @@ -0,0 +1,19 @@ +package main + +import ( + "net/http" + + "github.com/gin-gonic/gin" + cors "github.com/rs/cors/wrapper/gin" +) + +func main() { + router := gin.Default() + + router.Use(cors.Default()) + router.GET("/", func(context *gin.Context) { + context.JSON(http.StatusOK, gin.H{"hello": "world"}) + }) + + router.Run(":8080") +} diff --git a/api/vendor/github.com/rs/cors/examples/goji/server.go b/api/vendor/github.com/rs/cors/examples/goji/server.go new file mode 100644 index 0000000..1fb4073 --- /dev/null +++ b/api/vendor/github.com/rs/cors/examples/goji/server.go @@ -0,0 +1,22 @@ +package main + +import ( + "net/http" + + "github.com/rs/cors" + "github.com/zenazn/goji" +) + +func main() { + c := cors.New(cors.Options{ + AllowedOrigins: []string{"http://foo.com"}, + }) + goji.Use(c.Handler) + + goji.Get("/", func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + w.Write([]byte("{\"hello\": \"world\"}")) + }) + + goji.Serve() +} diff --git a/api/vendor/github.com/rs/cors/examples/gorilla/server.go b/api/vendor/github.com/rs/cors/examples/gorilla/server.go new file mode 100644 index 0000000..c24fb74 --- /dev/null +++ b/api/vendor/github.com/rs/cors/examples/gorilla/server.go @@ -0,0 +1,20 @@ +package main + +import ( + "net/http" + + "github.com/gorilla/mux" + "github.com/rs/cors" +) + +func main() { + r := mux.NewRouter() + r.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + w.Write([]byte("{\"hello\": \"world\"}")) + }) + + // Use default options + handler := cors.Default().Handler(r) + http.ListenAndServe(":8080", handler) +} diff --git a/api/vendor/github.com/rs/cors/examples/httprouter/server.go b/api/vendor/github.com/rs/cors/examples/httprouter/server.go new file mode 100644 index 0000000..fc123e3 --- /dev/null +++ b/api/vendor/github.com/rs/cors/examples/httprouter/server.go @@ -0,0 +1,22 @@ +package main + +import ( + "net/http" + + "github.com/julienschmidt/httprouter" + "github.com/rs/cors" +) + +func Hello(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { + w.Header().Set("Content-Type", "application/json") + w.Write([]byte("{\"hello\": \"world\"}")) +} + +func main() { + router := httprouter.New() + router.GET("/", Hello) + + handler := cors.Default().Handler(router) + + http.ListenAndServe(":8080", handler) +} diff --git a/api/vendor/github.com/rs/cors/examples/martini/server.go b/api/vendor/github.com/rs/cors/examples/martini/server.go new file mode 100644 index 0000000..081af32 --- /dev/null +++ b/api/vendor/github.com/rs/cors/examples/martini/server.go @@ -0,0 +1,23 @@ +package main + +import ( + "github.com/go-martini/martini" + "github.com/martini-contrib/render" + "github.com/rs/cors" +) + +func main() { + c := cors.New(cors.Options{ + AllowedOrigins: []string{"http://foo.com"}, + }) + + m := martini.Classic() + m.Use(render.Renderer()) + m.Use(c.HandlerFunc) + + m.Get("/", func(r render.Render) { + r.JSON(200, map[string]interface{}{"hello": "world"}) + }) + + m.Run() +} diff --git a/api/vendor/github.com/rs/cors/examples/negroni/server.go b/api/vendor/github.com/rs/cors/examples/negroni/server.go new file mode 100644 index 0000000..3cb33bf --- /dev/null +++ b/api/vendor/github.com/rs/cors/examples/negroni/server.go @@ -0,0 +1,26 @@ +package main + +import ( + "net/http" + + "github.com/codegangsta/negroni" + "github.com/rs/cors" +) + +func main() { + c := cors.New(cors.Options{ + AllowedOrigins: []string{"http://foo.com"}, + }) + + mux := http.NewServeMux() + + mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + w.Write([]byte("{\"hello\": \"world\"}")) + }) + + n := negroni.Classic() + n.Use(c) + n.UseHandler(mux) + n.Run(":3000") +} diff --git a/api/vendor/github.com/rs/cors/examples/nethttp/server.go b/api/vendor/github.com/rs/cors/examples/nethttp/server.go new file mode 100644 index 0000000..eaa775e --- /dev/null +++ b/api/vendor/github.com/rs/cors/examples/nethttp/server.go @@ -0,0 +1,20 @@ +package main + +import ( + "net/http" + + "github.com/rs/cors" +) + +func main() { + c := cors.New(cors.Options{ + AllowedOrigins: []string{"http://foo.com"}, + }) + + handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + w.Write([]byte("{\"hello\": \"world\"}")) + }) + + http.ListenAndServe(":8080", c.Handler(handler)) +} diff --git a/api/vendor/github.com/rs/cors/examples/openbar/server.go b/api/vendor/github.com/rs/cors/examples/openbar/server.go new file mode 100644 index 0000000..0940423 --- /dev/null +++ b/api/vendor/github.com/rs/cors/examples/openbar/server.go @@ -0,0 +1,22 @@ +package main + +import ( + "net/http" + + "github.com/rs/cors" +) + +func main() { + c := cors.New(cors.Options{ + AllowedOrigins: []string{"*"}, + AllowedMethods: []string{"GET", "POST", "PUT", "DELETE"}, + AllowCredentials: true, + }) + + h := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + w.Write([]byte("{\"hello\": \"world\"}")) + }) + + http.ListenAndServe(":8080", c.Handler(h)) +} diff --git a/api/vendor/github.com/rs/cors/go.mod b/api/vendor/github.com/rs/cors/go.mod new file mode 100644 index 0000000..0a4c652 --- /dev/null +++ b/api/vendor/github.com/rs/cors/go.mod @@ -0,0 +1 @@ +module github.com/rs/cors diff --git a/api/vendor/github.com/rs/cors/utils.go b/api/vendor/github.com/rs/cors/utils.go new file mode 100644 index 0000000..c7a0aa0 --- /dev/null +++ b/api/vendor/github.com/rs/cors/utils.go @@ -0,0 +1,70 @@ +package cors + +import "strings" + +const toLower = 'a' - 'A' + +type converter func(string) string + +type wildcard struct { + prefix string + suffix string +} + +func (w wildcard) match(s string) bool { + return len(s) >= len(w.prefix+w.suffix) && strings.HasPrefix(s, w.prefix) && strings.HasSuffix(s, w.suffix) +} + +// convert converts a list of string using the passed converter function +func convert(s []string, c converter) []string { + out := []string{} + for _, i := range s { + out = append(out, c(i)) + } + return out +} + +// parseHeaderList tokenize + normalize a string containing a list of headers +func parseHeaderList(headerList string) []string { + l := len(headerList) + h := make([]byte, 0, l) + upper := true + // Estimate the number headers in order to allocate the right splice size + t := 0 + for i := 0; i < l; i++ { + if headerList[i] == ',' { + t++ + } + } + headers := make([]string, 0, t) + for i := 0; i < l; i++ { + b := headerList[i] + if b >= 'a' && b <= 'z' { + if upper { + h = append(h, b-toLower) + } else { + h = append(h, b) + } + } else if b >= 'A' && b <= 'Z' { + if !upper { + h = append(h, b+toLower) + } else { + h = append(h, b) + } + } else if b == '-' || b == '_' || (b >= '0' && b <= '9') { + h = append(h, b) + } + + if b == ' ' || b == ',' || i == l-1 { + if len(h) > 0 { + // Flush the found header + headers = append(headers, string(h)) + h = h[:0] + upper = true + } + } else { + upper = b == '-' || b == '_' + } + } + return headers +} diff --git a/api/vendor/github.com/rs/cors/utils_test.go b/api/vendor/github.com/rs/cors/utils_test.go new file mode 100644 index 0000000..83053b3 --- /dev/null +++ b/api/vendor/github.com/rs/cors/utils_test.go @@ -0,0 +1,70 @@ +package cors + +import ( + "strings" + "testing" +) + +func TestWildcard(t *testing.T) { + w := wildcard{"foo", "bar"} + if !w.match("foobar") { + t.Error("foo*bar should match foobar") + } + if !w.match("foobazbar") { + t.Error("foo*bar should match foobazbar") + } + if w.match("foobaz") { + t.Error("foo*bar should not match foobaz") + } + + w = wildcard{"foo", "oof"} + if w.match("foof") { + t.Error("foo*oof should not match foof") + } +} + +func TestConvert(t *testing.T) { + s := convert([]string{"A", "b", "C"}, strings.ToLower) + e := []string{"a", "b", "c"} + if s[0] != e[0] || s[1] != e[1] || s[2] != e[2] { + t.Errorf("%v != %v", s, e) + } +} + +func TestParseHeaderList(t *testing.T) { + h := parseHeaderList("header, second-header, THIRD-HEADER, Numb3r3d-H34d3r") + e := []string{"Header", "Second-Header", "Third-Header", "Numb3r3d-H34d3r"} + if h[0] != e[0] || h[1] != e[1] || h[2] != e[2] { + t.Errorf("%v != %v", h, e) + } +} + +func TestParseHeaderListEmpty(t *testing.T) { + if len(parseHeaderList("")) != 0 { + t.Error("should be empty sclice") + } + if len(parseHeaderList(" , ")) != 0 { + t.Error("should be empty sclice") + } +} + +func BenchmarkParseHeaderList(b *testing.B) { + b.ReportAllocs() + for i := 0; i < b.N; i++ { + parseHeaderList("header, second-header, THIRD-HEADER") + } +} + +func BenchmarkParseHeaderListSingle(b *testing.B) { + b.ReportAllocs() + for i := 0; i < b.N; i++ { + parseHeaderList("header") + } +} + +func BenchmarkParseHeaderListNormalized(b *testing.B) { + b.ReportAllocs() + for i := 0; i < b.N; i++ { + parseHeaderList("Header1, Header2, Third-Header") + } +} diff --git a/api/vendor/github.com/rs/cors/wrapper/gin/gin.go b/api/vendor/github.com/rs/cors/wrapper/gin/gin.go new file mode 100644 index 0000000..2c77541 --- /dev/null +++ b/api/vendor/github.com/rs/cors/wrapper/gin/gin.go @@ -0,0 +1,50 @@ +// Package cors/wrapper/gin provides gin.HandlerFunc to handle CORS related +// requests as a wrapper of github.com/rs/cors handler. +package gin + +import ( + "net/http" + + "github.com/gin-gonic/gin" + "github.com/rs/cors" +) + +// Options is a configuration container to setup the CORS middleware. +type Options = cors.Options + +// corsWrapper is a wrapper of cors.Cors handler which preserves information +// about configured 'optionPassthrough' option. +type corsWrapper struct { + *cors.Cors + optionPassthrough bool +} + +// build transforms wrapped cors.Cors handler into Gin middleware. +func (c corsWrapper) build() gin.HandlerFunc { + return func(ctx *gin.Context) { + c.HandlerFunc(ctx.Writer, ctx.Request) + if !c.optionPassthrough && + ctx.Request.Method == http.MethodOptions && + ctx.GetHeader("Access-Control-Request-Method") != "" { + // Abort processing next Gin middlewares. + ctx.AbortWithStatus(http.StatusOK) + } + } +} + +// AllowAll creates a new CORS Gin middleware with permissive configuration +// allowing all origins with all standard methods with any header and +// credentials. +func AllowAll() gin.HandlerFunc { + return corsWrapper{Cors: cors.AllowAll()}.build() +} + +// Default creates a new CORS Gin middleware with default options. +func Default() gin.HandlerFunc { + return corsWrapper{Cors: cors.Default()}.build() +} + +// New creates a new CORS Gin middleware with the provided options. +func New(options Options) gin.HandlerFunc { + return corsWrapper{cors.New(options), options.OptionsPassthrough}.build() +} diff --git a/api/vendor/github.com/rs/cors/wrapper/gin/gin_test.go b/api/vendor/github.com/rs/cors/wrapper/gin/gin_test.go new file mode 100644 index 0000000..e9f8f75 --- /dev/null +++ b/api/vendor/github.com/rs/cors/wrapper/gin/gin_test.go @@ -0,0 +1,76 @@ +package gin + +import ( + "net/http" + "net/http/httptest" + "testing" + + "github.com/gin-gonic/gin" + "github.com/rs/cors" +) + +func init() { + gin.SetMode(gin.ReleaseMode) +} + +func TestAllowAllNotNil(t *testing.T) { + handler := AllowAll() + if handler == nil { + t.Error("Should not return nil Gin handler") + } +} + +func TestDefaultNotNil(t *testing.T) { + handler := Default() + if handler == nil { + t.Error("Should not return nil Gin handler") + } +} + +func TestNewNotNil(t *testing.T) { + handler := New(Options{}) + if handler == nil { + t.Error("Should not return nil Gin handler") + } +} + +func TestCorsWrapper_buildAbortsWhenPreflight(t *testing.T) { + res := httptest.NewRecorder() + ctx, _ := gin.CreateTestContext(res) + ctx.Request, _ = http.NewRequest("OPTIONS", "http://example.com/foo", nil) + ctx.Request.Header.Add("Origin", "http://example.com/") + ctx.Request.Header.Add("Access-Control-Request-Method", "POST") + ctx.Status(http.StatusAccepted) + res.Code = http.StatusAccepted + + handler := corsWrapper{Cors: cors.New(Options{ + // Intentionally left blank. + })}.build() + + handler(ctx) + + if !ctx.IsAborted() { + t.Error("Should abort on preflight requests") + } + if res.Code != http.StatusOK { + t.Error("Should abort with 200 OK status") + } +} + +func TestCorsWrapper_buildNotAbortsWhenPassthrough(t *testing.T) { + res := httptest.NewRecorder() + ctx, _ := gin.CreateTestContext(res) + ctx.Request, _ = http.NewRequest("OPTIONS", "http://example.com/foo", nil) + ctx.Request.Header.Add("Origin", "http://example.com/") + ctx.Request.Header.Add("Access-Control-Request-Method", "POST") + + handler := corsWrapper{cors.New(Options{ + OptionsPassthrough: true, + }), true}.build() + + handler(ctx) + + if ctx.IsAborted() { + t.Error("Should not abort when OPTIONS passthrough enabled") + } +} diff --git a/api/vendor/github.com/stretchr/objx/.gitignore b/api/vendor/github.com/stretchr/objx/.gitignore new file mode 100644 index 0000000..e0170a5 --- /dev/null +++ b/api/vendor/github.com/stretchr/objx/.gitignore @@ -0,0 +1,4 @@ +/dep +/testdep +/profile.out +/coverage.txt diff --git a/api/vendor/github.com/stretchr/objx/.travis.yml b/api/vendor/github.com/stretchr/objx/.travis.yml new file mode 100644 index 0000000..1456363 --- /dev/null +++ b/api/vendor/github.com/stretchr/objx/.travis.yml @@ -0,0 +1,13 @@ +language: go +go: + - 1.8 + - 1.9 + - tip + +install: +- go get github.com/go-task/task/cmd/task + +script: +- task dl-deps +- task lint +- task test diff --git a/api/vendor/github.com/stretchr/objx/Gopkg.lock b/api/vendor/github.com/stretchr/objx/Gopkg.lock new file mode 100644 index 0000000..1f5739c --- /dev/null +++ b/api/vendor/github.com/stretchr/objx/Gopkg.lock @@ -0,0 +1,27 @@ +# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. + + +[[projects]] + name = "github.com/davecgh/go-spew" + packages = ["spew"] + revision = "346938d642f2ec3594ed81d874461961cd0faa76" + version = "v1.1.0" + +[[projects]] + name = "github.com/pmezard/go-difflib" + packages = ["difflib"] + revision = "792786c7400a136282c1664665ae0a8db921c6c2" + version = "v1.0.0" + +[[projects]] + name = "github.com/stretchr/testify" + packages = ["assert"] + revision = "b91bfb9ebec76498946beb6af7c0230c7cc7ba6c" + version = "v1.2.0" + +[solve-meta] + analyzer-name = "dep" + analyzer-version = 1 + inputs-digest = "50e2495ec1af6e2f7ffb2f3551e4300d30357d7c7fe38ff6056469fa9cfb3673" + solver-name = "gps-cdcl" + solver-version = 1 diff --git a/api/vendor/github.com/stretchr/objx/Gopkg.toml b/api/vendor/github.com/stretchr/objx/Gopkg.toml new file mode 100644 index 0000000..f87e18e --- /dev/null +++ b/api/vendor/github.com/stretchr/objx/Gopkg.toml @@ -0,0 +1,3 @@ +[[constraint]] + name = "github.com/stretchr/testify" + version = "~1.2.0" diff --git a/api/vendor/github.com/stretchr/objx/LICENSE b/api/vendor/github.com/stretchr/objx/LICENSE new file mode 100644 index 0000000..44d4d9d --- /dev/null +++ b/api/vendor/github.com/stretchr/objx/LICENSE @@ -0,0 +1,22 @@ +The MIT License + +Copyright (c) 2014 Stretchr, Inc. +Copyright (c) 2017-2018 objx contributors + +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/api/vendor/github.com/stretchr/objx/README.md b/api/vendor/github.com/stretchr/objx/README.md new file mode 100644 index 0000000..4e2400e --- /dev/null +++ b/api/vendor/github.com/stretchr/objx/README.md @@ -0,0 +1,78 @@ +# Objx +[![Build Status](https://travis-ci.org/stretchr/objx.svg?branch=master)](https://travis-ci.org/stretchr/objx) +[![Go Report Card](https://goreportcard.com/badge/github.com/stretchr/objx)](https://goreportcard.com/report/github.com/stretchr/objx) +[![Sourcegraph](https://sourcegraph.com/github.com/stretchr/objx/-/badge.svg)](https://sourcegraph.com/github.com/stretchr/objx) +[![GoDoc](https://godoc.org/github.com/stretchr/objx?status.svg)](https://godoc.org/github.com/stretchr/objx) + +Objx - Go package for dealing with maps, slices, JSON and other data. + +Get started: + +- Install Objx with [one line of code](#installation), or [update it with another](#staying-up-to-date) +- Check out the API Documentation http://godoc.org/github.com/stretchr/objx + +## Overview +Objx provides the `objx.Map` type, which is a `map[string]interface{}` that exposes a powerful `Get` method (among others) that allows you to easily and quickly get access to data within the map, without having to worry too much about type assertions, missing data, default values etc. + +### Pattern +Objx uses a preditable pattern to make access data from within `map[string]interface{}` easy. Call one of the `objx.` functions to create your `objx.Map` to get going: + + m, err := objx.FromJSON(json) + +NOTE: Any methods or functions with the `Must` prefix will panic if something goes wrong, the rest will be optimistic and try to figure things out without panicking. + +Use `Get` to access the value you're interested in. You can use dot and array +notation too: + + m.Get("places[0].latlng") + +Once you have sought the `Value` you're interested in, you can use the `Is*` methods to determine its type. + + if m.Get("code").IsStr() { // Your code... } + +Or you can just assume the type, and use one of the strong type methods to extract the real value: + + m.Get("code").Int() + +If there's no value there (or if it's the wrong type) then a default value will be returned, or you can be explicit about the default value. + + Get("code").Int(-1) + +If you're dealing with a slice of data as a value, Objx provides many useful methods for iterating, manipulating and selecting that data. You can find out more by exploring the index below. + +### Reading data +A simple example of how to use Objx: + + // Use MustFromJSON to make an objx.Map from some JSON + m := objx.MustFromJSON(`{"name": "Mat", "age": 30}`) + + // Get the details + name := m.Get("name").Str() + age := m.Get("age").Int() + + // Get their nickname (or use their name if they don't have one) + nickname := m.Get("nickname").Str(name) + +### Ranging +Since `objx.Map` is a `map[string]interface{}` you can treat it as such. For example, to `range` the data, do what you would expect: + + m := objx.MustFromJSON(json) + for key, value := range m { + // Your code... + } + +## Installation +To install Objx, use go get: + + go get github.com/stretchr/objx + +### Staying up to date +To update Objx to the latest version, run: + + go get -u github.com/stretchr/objx + +### Supported go versions +We support the lastest two major Go versions, which are 1.8 and 1.9 at the moment. + +## Contributing +Please feel free to submit issues, fork the repository and send pull requests! diff --git a/api/vendor/github.com/stretchr/objx/Taskfile.yml b/api/vendor/github.com/stretchr/objx/Taskfile.yml new file mode 100644 index 0000000..403b5f0 --- /dev/null +++ b/api/vendor/github.com/stretchr/objx/Taskfile.yml @@ -0,0 +1,26 @@ +default: + deps: [test] + +dl-deps: + desc: Downloads cli dependencies + cmds: + - go get -u github.com/golang/lint/golint + - go get -u github.com/golang/dep/cmd/dep + +update-deps: + desc: Updates dependencies + cmds: + - dep ensure + - dep ensure -update + - dep prune + +lint: + desc: Runs golint + cmds: + - golint $(ls *.go | grep -v "doc.go") + silent: true + +test: + desc: Runs go tests + cmds: + - go test -race . diff --git a/api/vendor/github.com/stretchr/objx/accessors.go b/api/vendor/github.com/stretchr/objx/accessors.go new file mode 100644 index 0000000..d95be0c --- /dev/null +++ b/api/vendor/github.com/stretchr/objx/accessors.go @@ -0,0 +1,171 @@ +package objx + +import ( + "fmt" + "regexp" + "strconv" + "strings" +) + +// arrayAccesRegexString is the regex used to extract the array number +// from the access path +const arrayAccesRegexString = `^(.+)\[([0-9]+)\]$` + +// arrayAccesRegex is the compiled arrayAccesRegexString +var arrayAccesRegex = regexp.MustCompile(arrayAccesRegexString) + +// Get gets the value using the specified selector and +// returns it inside a new Obj object. +// +// If it cannot find the value, Get will return a nil +// value inside an instance of Obj. +// +// Get can only operate directly on map[string]interface{} and []interface. +// +// Example +// +// To access the title of the third chapter of the second book, do: +// +// o.Get("books[1].chapters[2].title") +func (m Map) Get(selector string) *Value { + rawObj := access(m, selector, nil, false, false) + return &Value{data: rawObj} +} + +// Set sets the value using the specified selector and +// returns the object on which Set was called. +// +// Set can only operate directly on map[string]interface{} and []interface +// +// Example +// +// To set the title of the third chapter of the second book, do: +// +// o.Set("books[1].chapters[2].title","Time to Go") +func (m Map) Set(selector string, value interface{}) Map { + access(m, selector, value, true, false) + return m +} + +// access accesses the object using the selector and performs the +// appropriate action. +func access(current, selector, value interface{}, isSet, panics bool) interface{} { + + switch selector.(type) { + case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64: + + if array, ok := current.([]interface{}); ok { + index := intFromInterface(selector) + + if index >= len(array) { + if panics { + panic(fmt.Sprintf("objx: Index %d is out of range. Slice only contains %d items.", index, len(array))) + } + return nil + } + + return array[index] + } + + return nil + + case string: + + selStr := selector.(string) + selSegs := strings.SplitN(selStr, PathSeparator, 2) + thisSel := selSegs[0] + index := -1 + var err error + + if strings.Contains(thisSel, "[") { + arrayMatches := arrayAccesRegex.FindStringSubmatch(thisSel) + + if len(arrayMatches) > 0 { + // Get the key into the map + thisSel = arrayMatches[1] + + // Get the index into the array at the key + index, err = strconv.Atoi(arrayMatches[2]) + + if err != nil { + // This should never happen. If it does, something has gone + // seriously wrong. Panic. + panic("objx: Array index is not an integer. Must use array[int].") + } + } + } + + if curMap, ok := current.(Map); ok { + current = map[string]interface{}(curMap) + } + + // get the object in question + switch current.(type) { + case map[string]interface{}: + curMSI := current.(map[string]interface{}) + if len(selSegs) <= 1 && isSet { + curMSI[thisSel] = value + return nil + } + current = curMSI[thisSel] + default: + current = nil + } + + if current == nil && panics { + panic(fmt.Sprintf("objx: '%v' invalid on object.", selector)) + } + + // do we need to access the item of an array? + if index > -1 { + if array, ok := current.([]interface{}); ok { + if index < len(array) { + current = array[index] + } else { + if panics { + panic(fmt.Sprintf("objx: Index %d is out of range. Slice only contains %d items.", index, len(array))) + } + current = nil + } + } + } + + if len(selSegs) > 1 { + current = access(current, selSegs[1], value, isSet, panics) + } + + } + return current +} + +// intFromInterface converts an interface object to the largest +// representation of an unsigned integer using a type switch and +// assertions +func intFromInterface(selector interface{}) int { + var value int + switch selector.(type) { + case int: + value = selector.(int) + case int8: + value = int(selector.(int8)) + case int16: + value = int(selector.(int16)) + case int32: + value = int(selector.(int32)) + case int64: + value = int(selector.(int64)) + case uint: + value = int(selector.(uint)) + case uint8: + value = int(selector.(uint8)) + case uint16: + value = int(selector.(uint16)) + case uint32: + value = int(selector.(uint32)) + case uint64: + value = int(selector.(uint64)) + default: + panic("objx: array access argument is not an integer type (this should never happen)") + } + return value +} diff --git a/api/vendor/github.com/stretchr/objx/accessors_test.go b/api/vendor/github.com/stretchr/objx/accessors_test.go new file mode 100644 index 0000000..cc3816a --- /dev/null +++ b/api/vendor/github.com/stretchr/objx/accessors_test.go @@ -0,0 +1,133 @@ +package objx + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestAccessorsAccessGetSingleField(t *testing.T) { + current := map[string]interface{}{"name": "Tyler"} + + assert.Equal(t, "Tyler", access(current, "name", nil, false, true)) +} + +func TestAccessorsAccessGetDeep(t *testing.T) { + current := map[string]interface{}{"name": map[string]interface{}{"first": "Tyler", "last": "Bunnell"}} + + assert.Equal(t, "Tyler", access(current, "name.first", nil, false, true)) + assert.Equal(t, "Bunnell", access(current, "name.last", nil, false, true)) +} + +func TestAccessorsAccessGetDeepDeep(t *testing.T) { + current := map[string]interface{}{"one": map[string]interface{}{"two": map[string]interface{}{"three": map[string]interface{}{"four": 4}}}} + + assert.Equal(t, 4, access(current, "one.two.three.four", nil, false, true)) +} + +func TestAccessorsAccessGetInsideArray(t *testing.T) { + current := map[string]interface{}{"names": []interface{}{map[string]interface{}{"first": "Tyler", "last": "Bunnell"}, map[string]interface{}{"first": "Capitol", "last": "Bollocks"}}} + + assert.Equal(t, "Tyler", access(current, "names[0].first", nil, false, true)) + assert.Equal(t, "Bunnell", access(current, "names[0].last", nil, false, true)) + assert.Equal(t, "Capitol", access(current, "names[1].first", nil, false, true)) + assert.Equal(t, "Bollocks", access(current, "names[1].last", nil, false, true)) + assert.Panics(t, func() { + access(current, "names[2]", nil, false, true) + }) + assert.Nil(t, access(current, "names[2]", nil, false, false)) +} + +func TestAccessorsAccessGetFromArrayWithInt(t *testing.T) { + current := []interface{}{map[string]interface{}{"first": "Tyler", "last": "Bunnell"}, map[string]interface{}{"first": "Capitol", "last": "Bollocks"}} + one := access(current, 0, nil, false, false) + two := access(current, 1, nil, false, false) + three := access(current, 2, nil, false, false) + + assert.Equal(t, "Tyler", one.(map[string]interface{})["first"]) + assert.Equal(t, "Capitol", two.(map[string]interface{})["first"]) + assert.Nil(t, three) +} + +func TestAccessorsGet(t *testing.T) { + current := New(map[string]interface{}{"name": "Tyler"}) + + assert.Equal(t, "Tyler", current.Get("name").data) +} + +func TestAccessorsAccessSetSingleField(t *testing.T) { + current := map[string]interface{}{"name": "Tyler"} + + access(current, "name", "Mat", true, false) + access(current, "age", 29, true, true) + + assert.Equal(t, current["name"], "Mat") + assert.Equal(t, current["age"], 29) +} + +func TestAccessorsAccessSetSingleFieldNotExisting(t *testing.T) { + current := map[string]interface{}{} + + access(current, "name", "Mat", true, false) + + assert.Equal(t, current["name"], "Mat") +} + +func TestAccessorsAccessSetDeep(t *testing.T) { + current := map[string]interface{}{"name": map[string]interface{}{"first": "Tyler", "last": "Bunnell"}} + + access(current, "name.first", "Mat", true, true) + access(current, "name.last", "Ryer", true, true) + + assert.Equal(t, "Mat", access(current, "name.first", nil, false, true)) + assert.Equal(t, "Ryer", access(current, "name.last", nil, false, true)) +} + +func TestAccessorsAccessSetDeepDeep(t *testing.T) { + current := map[string]interface{}{"one": map[string]interface{}{"two": map[string]interface{}{"three": map[string]interface{}{"four": 4}}}} + + access(current, "one.two.three.four", 5, true, true) + + assert.Equal(t, 5, access(current, "one.two.three.four", nil, false, true)) +} + +func TestAccessorsAccessSetArray(t *testing.T) { + current := map[string]interface{}{"names": []interface{}{"Tyler"}} + + access(current, "names[0]", "Mat", true, true) + + assert.Equal(t, "Mat", access(current, "names[0]", nil, false, true)) +} + +func TestAccessorsAccessSetInsideArray(t *testing.T) { + current := map[string]interface{}{"names": []interface{}{map[string]interface{}{"first": "Tyler", "last": "Bunnell"}, map[string]interface{}{"first": "Capitol", "last": "Bollocks"}}} + + access(current, "names[0].first", "Mat", true, true) + access(current, "names[0].last", "Ryer", true, true) + access(current, "names[1].first", "Captain", true, true) + access(current, "names[1].last", "Underpants", true, true) + + assert.Equal(t, "Mat", access(current, "names[0].first", nil, false, true)) + assert.Equal(t, "Ryer", access(current, "names[0].last", nil, false, true)) + assert.Equal(t, "Captain", access(current, "names[1].first", nil, false, true)) + assert.Equal(t, "Underpants", access(current, "names[1].last", nil, false, true)) +} + +func TestAccessorsAccessSetFromArrayWithInt(t *testing.T) { + current := []interface{}{map[string]interface{}{"first": "Tyler", "last": "Bunnell"}, map[string]interface{}{"first": "Capitol", "last": "Bollocks"}} + one := access(current, 0, nil, false, false) + two := access(current, 1, nil, false, false) + three := access(current, 2, nil, false, false) + + assert.Equal(t, "Tyler", one.(map[string]interface{})["first"]) + assert.Equal(t, "Capitol", two.(map[string]interface{})["first"]) + assert.Nil(t, three) +} + +func TestAccessorsSet(t *testing.T) { + current := New(map[string]interface{}{"name": "Tyler"}) + + current.Set("name", "Mat") + + assert.Equal(t, "Mat", current.Get("name").data) +} diff --git a/api/vendor/github.com/stretchr/objx/codegen/array-access.txt b/api/vendor/github.com/stretchr/objx/codegen/array-access.txt new file mode 100644 index 0000000..3060234 --- /dev/null +++ b/api/vendor/github.com/stretchr/objx/codegen/array-access.txt @@ -0,0 +1,14 @@ + case []{1}: + a := object.([]{1}) + if isSet { + a[index] = value.({1}) + } else { + if index >= len(a) { + if panics { + panic(fmt.Sprintf("objx: Index %d is out of range because the []{1} only contains %d items.", index, len(a))) + } + return nil + } else { + return a[index] + } + } diff --git a/api/vendor/github.com/stretchr/objx/codegen/index.html b/api/vendor/github.com/stretchr/objx/codegen/index.html new file mode 100644 index 0000000..379ffc3 --- /dev/null +++ b/api/vendor/github.com/stretchr/objx/codegen/index.html @@ -0,0 +1,86 @@ + + + + Codegen + + + + + +

    + Template +

    +

    + Use {x} as a placeholder for each argument. +

    + + +

    + Arguments (comma separated) +

    +

    + One block per line +

    + + +

    + Output +

    + + + + + + + + diff --git a/api/vendor/github.com/stretchr/objx/codegen/template.txt b/api/vendor/github.com/stretchr/objx/codegen/template.txt new file mode 100644 index 0000000..047bfc1 --- /dev/null +++ b/api/vendor/github.com/stretchr/objx/codegen/template.txt @@ -0,0 +1,124 @@ +/* + {4} ({1} and []{1}) +*/ + +// {4} gets the value as a {1}, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) {4}(optionalDefault ...{1}) {1} { + if s, ok := v.data.({1}); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return {3} +} + +// Must{4} gets the value as a {1}. +// +// Panics if the object is not a {1}. +func (v *Value) Must{4}() {1} { + return v.data.({1}) +} + +// {4}Slice gets the value as a []{1}, returns the optionalDefault +// value or nil if the value is not a []{1}. +func (v *Value) {4}Slice(optionalDefault ...[]{1}) []{1} { + if s, ok := v.data.([]{1}); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// Must{4}Slice gets the value as a []{1}. +// +// Panics if the object is not a []{1}. +func (v *Value) Must{4}Slice() []{1} { + return v.data.([]{1}) +} + +// Is{4} gets whether the object contained is a {1} or not. +func (v *Value) Is{4}() bool { + _, ok := v.data.({1}) + return ok +} + +// Is{4}Slice gets whether the object contained is a []{1} or not. +func (v *Value) Is{4}Slice() bool { + _, ok := v.data.([]{1}) + return ok +} + +// Each{4} calls the specified callback for each object +// in the []{1}. +// +// Panics if the object is the wrong type. +func (v *Value) Each{4}(callback func(int, {1}) bool) *Value { + for index, val := range v.Must{4}Slice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// Where{4} uses the specified decider function to select items +// from the []{1}. The object contained in the result will contain +// only the selected items. +func (v *Value) Where{4}(decider func(int, {1}) bool) *Value { + var selected []{1} + v.Each{4}(func(index int, val {1}) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data:selected} +} + +// Group{4} uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]{1}. +func (v *Value) Group{4}(grouper func(int, {1}) string) *Value { + groups := make(map[string][]{1}) + v.Each{4}(func(index int, val {1}) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]{1}, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data:groups} +} + +// Replace{4} uses the specified function to replace each {1}s +// by iterating each item. The data in the returned result will be a +// []{1} containing the replaced items. +func (v *Value) Replace{4}(replacer func(int, {1}) {1}) *Value { + arr := v.Must{4}Slice() + replaced := make([]{1}, len(arr)) + v.Each{4}(func(index int, val {1}) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data:replaced} +} + +// Collect{4} uses the specified collector function to collect a value +// for each of the {1}s in the slice. The data returned will be a +// []interface{}. +func (v *Value) Collect{4}(collector func(int, {1}) interface{}) *Value { + arr := v.Must{4}Slice() + collected := make([]interface{}, len(arr)) + v.Each{4}(func(index int, val {1}) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data:collected} +} diff --git a/api/vendor/github.com/stretchr/objx/codegen/template_test.txt b/api/vendor/github.com/stretchr/objx/codegen/template_test.txt new file mode 100644 index 0000000..7643af3 --- /dev/null +++ b/api/vendor/github.com/stretchr/objx/codegen/template_test.txt @@ -0,0 +1,121 @@ +/* + Tests for {4} ({1} and []{1}) +*/ + +func Test{4}(t *testing.T) { + val := {1}( {2} ) + + m := map[string]interface{}{"value": val, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").{4}()) + assert.Equal(t, val, New(m).Get("value").Must{4}()) + assert.Equal(t, {1}({3}), New(m).Get("nothing").{4}()) + assert.Equal(t, val, New(m).Get("nothing").{4}({2})) + assert.Panics(t, func() { + New(m).Get("age").Must{4}() + }) +} + +func Test{4}Slice(t *testing.T) { + val := {1}( {2} ) + + m := map[string]interface{}{"value": []{1}{ val }, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").{4}Slice()[0]) + assert.Equal(t, val, New(m).Get("value").Must{4}Slice()[0]) + assert.Equal(t, []{1}(nil), New(m).Get("nothing").{4}Slice()) + assert.Equal(t, val, New(m).Get("nothing").{4}Slice( []{1}{ {1}({2}) } )[0]) + assert.Panics(t, func() { + New(m).Get("nothing").Must{4}Slice() + }) +} + +func TestIs{4}(t *testing.T) { + v := &Value{data: {1}({2})} + assert.True(t, v.Is{4}()) + +} + +func TestIs{4}Slice(t *testing.T) { + v := &Value{data: []{1}{ {1}({2}) }} + assert.True(t, v.Is{4}Slice()) +} + +func TestEach{4}(t *testing.T) { + v := &Value{data: []{1}{ {1}({2}), {1}({2}), {1}({2}), {1}({2}), {1}({2}) }} + count := 0 + replacedVals := make([]{1}, 0) + assert.Equal(t, v, v.Each{4}(func(i int, val {1}) bool { + count++ + replacedVals = append(replacedVals, val) + + // abort early + return i != 2 + })) + + assert.Equal(t, count, 3) + assert.Equal(t, replacedVals[0], v.Must{4}Slice()[0]) + assert.Equal(t, replacedVals[1], v.Must{4}Slice()[1]) + assert.Equal(t, replacedVals[2], v.Must{4}Slice()[2]) +} + +func TestWhere{4}(t *testing.T) { + v := &Value{data: []{1}{ {1}({2}), {1}({2}), {1}({2}), {1}({2}), {1}({2}), {1}({2}) }} + + selected := v.Where{4}(func(i int, val {1}) bool { + return i%2==0 + }).Must{4}Slice() + + assert.Equal(t, 3, len(selected)) +} + +func TestGroup{4}(t *testing.T) { + v := &Value{data: []{1}{ {1}({2}), {1}({2}), {1}({2}), {1}({2}), {1}({2}), {1}({2}) }} + + grouped := v.Group{4}(func(i int, val {1}) string { + return fmt.Sprintf("%v", i%2==0) + }).data.(map[string][]{1}) + + assert.Equal(t, 2, len(grouped)) + assert.Equal(t, 3, len(grouped["true"])) + assert.Equal(t, 3, len(grouped["false"])) +} + +func TestReplace{4}(t *testing.T) { + v := &Value{data: []{1}{ {1}({2}), {1}({2}), {1}({2}), {1}({2}), {1}({2}), {1}({2}) }} + + rawArr := v.Must{4}Slice() + + replaced := v.Replace{4}(func(index int, val {1}) {1} { + if index < len(rawArr)-1 { + return rawArr[index+1] + } + return rawArr[0] + }) + + replacedArr := replaced.Must{4}Slice() + if assert.Equal(t, 6, len(replacedArr)) { + assert.Equal(t, replacedArr[0], rawArr[1]) + assert.Equal(t, replacedArr[1], rawArr[2]) + assert.Equal(t, replacedArr[2], rawArr[3]) + assert.Equal(t, replacedArr[3], rawArr[4]) + assert.Equal(t, replacedArr[4], rawArr[5]) + assert.Equal(t, replacedArr[5], rawArr[0]) + } +} + +func TestCollect{4}(t *testing.T) { + v := &Value{data: []{1}{ {1}({2}), {1}({2}), {1}({2}), {1}({2}), {1}({2}), {1}({2}) }} + + collected := v.Collect{4}(func(index int, val {1}) interface{} { + return index + }) + + collectedArr := collected.MustInterSlice() + if assert.Equal(t, 6, len(collectedArr)) { + assert.Equal(t, collectedArr[0], 0) + assert.Equal(t, collectedArr[1], 1) + assert.Equal(t, collectedArr[2], 2) + assert.Equal(t, collectedArr[3], 3) + assert.Equal(t, collectedArr[4], 4) + assert.Equal(t, collectedArr[5], 5) + } +} diff --git a/api/vendor/github.com/stretchr/objx/codegen/types_list.txt b/api/vendor/github.com/stretchr/objx/codegen/types_list.txt new file mode 100644 index 0000000..069d43d --- /dev/null +++ b/api/vendor/github.com/stretchr/objx/codegen/types_list.txt @@ -0,0 +1,20 @@ +Interface,interface{},"something",nil,Inter +Map,map[string]interface{},map[string]interface{}{"name":"Tyler"},nil,MSI +ObjxMap,(Map),New(1),New(nil),ObjxMap +Bool,bool,true,false,Bool +String,string,"hello","",Str +Int,int,1,0,Int +Int8,int8,1,0,Int8 +Int16,int16,1,0,Int16 +Int32,int32,1,0,Int32 +Int64,int64,1,0,Int64 +Uint,uint,1,0,Uint +Uint8,uint8,1,0,Uint8 +Uint16,uint16,1,0,Uint16 +Uint32,uint32,1,0,Uint32 +Uint64,uint64,1,0,Uint64 +Uintptr,uintptr,1,0,Uintptr +Float32,float32,1,0,Float32 +Float64,float64,1,0,Float64 +Complex64,complex64,1,0,Complex64 +Complex128,complex128,1,0,Complex128 diff --git a/api/vendor/github.com/stretchr/objx/constants.go b/api/vendor/github.com/stretchr/objx/constants.go new file mode 100644 index 0000000..f9eb42a --- /dev/null +++ b/api/vendor/github.com/stretchr/objx/constants.go @@ -0,0 +1,13 @@ +package objx + +const ( + // PathSeparator is the character used to separate the elements + // of the keypath. + // + // For example, `location.address.city` + PathSeparator string = "." + + // SignatureSeparator is the character that is used to + // separate the Base64 string from the security signature. + SignatureSeparator = "_" +) diff --git a/api/vendor/github.com/stretchr/objx/conversions.go b/api/vendor/github.com/stretchr/objx/conversions.go new file mode 100644 index 0000000..5e020f3 --- /dev/null +++ b/api/vendor/github.com/stretchr/objx/conversions.go @@ -0,0 +1,108 @@ +package objx + +import ( + "bytes" + "encoding/base64" + "encoding/json" + "errors" + "fmt" + "net/url" +) + +// JSON converts the contained object to a JSON string +// representation +func (m Map) JSON() (string, error) { + result, err := json.Marshal(m) + if err != nil { + err = errors.New("objx: JSON encode failed with: " + err.Error()) + } + return string(result), err +} + +// MustJSON converts the contained object to a JSON string +// representation and panics if there is an error +func (m Map) MustJSON() string { + result, err := m.JSON() + if err != nil { + panic(err.Error()) + } + return result +} + +// Base64 converts the contained object to a Base64 string +// representation of the JSON string representation +func (m Map) Base64() (string, error) { + var buf bytes.Buffer + + jsonData, err := m.JSON() + if err != nil { + return "", err + } + + encoder := base64.NewEncoder(base64.StdEncoding, &buf) + _, err = encoder.Write([]byte(jsonData)) + if err != nil { + return "", err + } + _ = encoder.Close() + + return buf.String(), nil +} + +// MustBase64 converts the contained object to a Base64 string +// representation of the JSON string representation and panics +// if there is an error +func (m Map) MustBase64() string { + result, err := m.Base64() + if err != nil { + panic(err.Error()) + } + return result +} + +// SignedBase64 converts the contained object to a Base64 string +// representation of the JSON string representation and signs it +// using the provided key. +func (m Map) SignedBase64(key string) (string, error) { + base64, err := m.Base64() + if err != nil { + return "", err + } + + sig := HashWithKey(base64, key) + return base64 + SignatureSeparator + sig, nil +} + +// MustSignedBase64 converts the contained object to a Base64 string +// representation of the JSON string representation and signs it +// using the provided key and panics if there is an error +func (m Map) MustSignedBase64(key string) string { + result, err := m.SignedBase64(key) + if err != nil { + panic(err.Error()) + } + return result +} + +/* + URL Query + ------------------------------------------------ +*/ + +// URLValues creates a url.Values object from an Obj. This +// function requires that the wrapped object be a map[string]interface{} +func (m Map) URLValues() url.Values { + vals := make(url.Values) + for k, v := range m { + //TODO: can this be done without sprintf? + vals.Set(k, fmt.Sprintf("%v", v)) + } + return vals +} + +// URLQuery gets an encoded URL query representing the given +// Obj. This function requires that the wrapped object be a +// map[string]interface{} +func (m Map) URLQuery() (string, error) { + return m.URLValues().Encode(), nil +} diff --git a/api/vendor/github.com/stretchr/objx/conversions_test.go b/api/vendor/github.com/stretchr/objx/conversions_test.go new file mode 100644 index 0000000..89abaef --- /dev/null +++ b/api/vendor/github.com/stretchr/objx/conversions_test.go @@ -0,0 +1,80 @@ +package objx + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestConversionJSON(t *testing.T) { + jsonString := `{"name":"Mat"}` + o := MustFromJSON(jsonString) + + result, err := o.JSON() + + if assert.NoError(t, err) { + assert.Equal(t, jsonString, result) + } + assert.Equal(t, jsonString, o.MustJSON()) +} + +func TestConversionJSONWithError(t *testing.T) { + o := MSI() + o["test"] = func() {} + + assert.Panics(t, func() { + o.MustJSON() + }) + + _, err := o.JSON() + + assert.Error(t, err) +} + +func TestConversionBase64(t *testing.T) { + o := New(map[string]interface{}{"name": "Mat"}) + + result, err := o.Base64() + + if assert.NoError(t, err) { + assert.Equal(t, "eyJuYW1lIjoiTWF0In0=", result) + } + assert.Equal(t, "eyJuYW1lIjoiTWF0In0=", o.MustBase64()) +} + +func TestConversionBase64WithError(t *testing.T) { + o := MSI() + o["test"] = func() {} + + assert.Panics(t, func() { + o.MustBase64() + }) + + _, err := o.Base64() + + assert.Error(t, err) +} + +func TestConversionSignedBase64(t *testing.T) { + o := New(map[string]interface{}{"name": "Mat"}) + + result, err := o.SignedBase64("key") + + if assert.NoError(t, err) { + assert.Equal(t, "eyJuYW1lIjoiTWF0In0=_67ee82916f90b2c0d68c903266e8998c9ef0c3d6", result) + } + assert.Equal(t, "eyJuYW1lIjoiTWF0In0=_67ee82916f90b2c0d68c903266e8998c9ef0c3d6", o.MustSignedBase64("key")) +} + +func TestConversionSignedBase64WithError(t *testing.T) { + o := MSI() + o["test"] = func() {} + + assert.Panics(t, func() { + o.MustSignedBase64("key") + }) + + _, err := o.SignedBase64("key") + + assert.Error(t, err) +} diff --git a/api/vendor/github.com/stretchr/objx/doc.go b/api/vendor/github.com/stretchr/objx/doc.go new file mode 100644 index 0000000..6d6af1a --- /dev/null +++ b/api/vendor/github.com/stretchr/objx/doc.go @@ -0,0 +1,66 @@ +/* +Objx - Go package for dealing with maps, slices, JSON and other data. + +Overview + +Objx provides the `objx.Map` type, which is a `map[string]interface{}` that exposes +a powerful `Get` method (among others) that allows you to easily and quickly get +access to data within the map, without having to worry too much about type assertions, +missing data, default values etc. + +Pattern + +Objx uses a preditable pattern to make access data from within `map[string]interface{}` easy. +Call one of the `objx.` functions to create your `objx.Map` to get going: + + m, err := objx.FromJSON(json) + +NOTE: Any methods or functions with the `Must` prefix will panic if something goes wrong, +the rest will be optimistic and try to figure things out without panicking. + +Use `Get` to access the value you're interested in. You can use dot and array +notation too: + + m.Get("places[0].latlng") + +Once you have sought the `Value` you're interested in, you can use the `Is*` methods to determine its type. + + if m.Get("code").IsStr() { // Your code... } + +Or you can just assume the type, and use one of the strong type methods to extract the real value: + + m.Get("code").Int() + +If there's no value there (or if it's the wrong type) then a default value will be returned, +or you can be explicit about the default value. + + Get("code").Int(-1) + +If you're dealing with a slice of data as a value, Objx provides many useful methods for iterating, +manipulating and selecting that data. You can find out more by exploring the index below. + +Reading data + +A simple example of how to use Objx: + + // Use MustFromJSON to make an objx.Map from some JSON + m := objx.MustFromJSON(`{"name": "Mat", "age": 30}`) + + // Get the details + name := m.Get("name").Str() + age := m.Get("age").Int() + + // Get their nickname (or use their name if they don't have one) + nickname := m.Get("nickname").Str(name) + +Ranging + +Since `objx.Map` is a `map[string]interface{}` you can treat it as such. +For example, to `range` the data, do what you would expect: + + m := objx.MustFromJSON(json) + for key, value := range m { + // Your code... + } +*/ +package objx diff --git a/api/vendor/github.com/stretchr/objx/fixture_test.go b/api/vendor/github.com/stretchr/objx/fixture_test.go new file mode 100644 index 0000000..bcc9e8f --- /dev/null +++ b/api/vendor/github.com/stretchr/objx/fixture_test.go @@ -0,0 +1,95 @@ +package objx + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +var fixtures = []struct { + // name is the name of the fixture (used for reporting + // failures) + name string + // data is the JSON data to be worked on + data string + // get is the argument(s) to pass to Get + get interface{} + // output is the expected output + output interface{} +}{ + { + name: "Simple get", + data: `{"name": "Mat"}`, + get: "name", + output: "Mat", + }, + { + name: "Get with dot notation", + data: `{"address": {"city": "Boulder"}}`, + get: "address.city", + output: "Boulder", + }, + { + name: "Deep get with dot notation", + data: `{"one": {"two": {"three": {"four": "hello"}}}}`, + get: "one.two.three.four", + output: "hello", + }, + { + name: "Get missing with dot notation", + data: `{"one": {"two": {"three": {"four": "hello"}}}}`, + get: "one.ten", + output: nil, + }, + { + name: "Get with array notation", + data: `{"tags": ["one", "two", "three"]}`, + get: "tags[1]", + output: "two", + }, + { + name: "Get with array and dot notation", + data: `{"types": { "tags": ["one", "two", "three"]}}`, + get: "types.tags[1]", + output: "two", + }, + { + name: "Get with array and dot notation - field after array", + data: `{"tags": [{"name":"one"}, {"name":"two"}, {"name":"three"}]}`, + get: "tags[1].name", + output: "two", + }, + { + name: "Complex get with array and dot notation", + data: `{"tags": [{"list": [{"one":"pizza"}]}]}`, + get: "tags[0].list[0].one", + output: "pizza", + }, + { + name: "Get field from within string should be nil", + data: `{"name":"Tyler"}`, + get: "name.something", + output: nil, + }, + { + name: "Get field from within string (using array accessor) should be nil", + data: `{"numbers":["one", "two", "three"]}`, + get: "numbers[0].nope", + output: nil, + }, +} + +func TestFixtures(t *testing.T) { + for _, fixture := range fixtures { + m := MustFromJSON(fixture.data) + + // get the value + t.Logf("Running get fixture: \"%s\" (%v)", fixture.name, fixture) + value := m.Get(fixture.get.(string)) + + // make sure it matches + assert.Equal(t, fixture.output, value.data, + "Get fixture \"%s\" failed: %v", fixture.name, fixture, + ) + } +} diff --git a/api/vendor/github.com/stretchr/objx/map.go b/api/vendor/github.com/stretchr/objx/map.go new file mode 100644 index 0000000..7e9389a --- /dev/null +++ b/api/vendor/github.com/stretchr/objx/map.go @@ -0,0 +1,193 @@ +package objx + +import ( + "encoding/base64" + "encoding/json" + "errors" + "io/ioutil" + "net/url" + "strings" +) + +// MSIConvertable is an interface that defines methods for converting your +// custom types to a map[string]interface{} representation. +type MSIConvertable interface { + // MSI gets a map[string]interface{} (msi) representing the + // object. + MSI() map[string]interface{} +} + +// Map provides extended functionality for working with +// untyped data, in particular map[string]interface (msi). +type Map map[string]interface{} + +// Value returns the internal value instance +func (m Map) Value() *Value { + return &Value{data: m} +} + +// Nil represents a nil Map. +var Nil = New(nil) + +// New creates a new Map containing the map[string]interface{} in the data argument. +// If the data argument is not a map[string]interface, New attempts to call the +// MSI() method on the MSIConvertable interface to create one. +func New(data interface{}) Map { + if _, ok := data.(map[string]interface{}); !ok { + if converter, ok := data.(MSIConvertable); ok { + data = converter.MSI() + } else { + return nil + } + } + return Map(data.(map[string]interface{})) +} + +// MSI creates a map[string]interface{} and puts it inside a new Map. +// +// The arguments follow a key, value pattern. +// +// Panics +// +// Panics if any key argument is non-string or if there are an odd number of arguments. +// +// Example +// +// To easily create Maps: +// +// m := objx.MSI("name", "Mat", "age", 29, "subobj", objx.MSI("active", true)) +// +// // creates an Map equivalent to +// m := objx.New(map[string]interface{}{"name": "Mat", "age": 29, "subobj": map[string]interface{}{"active": true}}) +func MSI(keyAndValuePairs ...interface{}) Map { + newMap := make(map[string]interface{}) + keyAndValuePairsLen := len(keyAndValuePairs) + if keyAndValuePairsLen%2 != 0 { + panic("objx: MSI must have an even number of arguments following the 'key, value' pattern.") + } + + for i := 0; i < keyAndValuePairsLen; i = i + 2 { + key := keyAndValuePairs[i] + value := keyAndValuePairs[i+1] + + // make sure the key is a string + keyString, keyStringOK := key.(string) + if !keyStringOK { + panic("objx: MSI must follow 'string, interface{}' pattern. " + keyString + " is not a valid key.") + } + newMap[keyString] = value + } + return New(newMap) +} + +// ****** Conversion Constructors + +// MustFromJSON creates a new Map containing the data specified in the +// jsonString. +// +// Panics if the JSON is invalid. +func MustFromJSON(jsonString string) Map { + o, err := FromJSON(jsonString) + if err != nil { + panic("objx: MustFromJSON failed with error: " + err.Error()) + } + return o +} + +// FromJSON creates a new Map containing the data specified in the +// jsonString. +// +// Returns an error if the JSON is invalid. +func FromJSON(jsonString string) (Map, error) { + var data interface{} + err := json.Unmarshal([]byte(jsonString), &data) + if err != nil { + return Nil, err + } + return New(data), nil +} + +// FromBase64 creates a new Obj containing the data specified +// in the Base64 string. +// +// The string is an encoded JSON string returned by Base64 +func FromBase64(base64String string) (Map, error) { + decoder := base64.NewDecoder(base64.StdEncoding, strings.NewReader(base64String)) + decoded, err := ioutil.ReadAll(decoder) + if err != nil { + return nil, err + } + return FromJSON(string(decoded)) +} + +// MustFromBase64 creates a new Obj containing the data specified +// in the Base64 string and panics if there is an error. +// +// The string is an encoded JSON string returned by Base64 +func MustFromBase64(base64String string) Map { + result, err := FromBase64(base64String) + if err != nil { + panic("objx: MustFromBase64 failed with error: " + err.Error()) + } + return result +} + +// FromSignedBase64 creates a new Obj containing the data specified +// in the Base64 string. +// +// The string is an encoded JSON string returned by SignedBase64 +func FromSignedBase64(base64String, key string) (Map, error) { + parts := strings.Split(base64String, SignatureSeparator) + if len(parts) != 2 { + return nil, errors.New("objx: Signed base64 string is malformed") + } + + sig := HashWithKey(parts[0], key) + if parts[1] != sig { + return nil, errors.New("objx: Signature for base64 data does not match") + } + return FromBase64(parts[0]) +} + +// MustFromSignedBase64 creates a new Obj containing the data specified +// in the Base64 string and panics if there is an error. +// +// The string is an encoded JSON string returned by Base64 +func MustFromSignedBase64(base64String, key string) Map { + result, err := FromSignedBase64(base64String, key) + if err != nil { + panic("objx: MustFromSignedBase64 failed with error: " + err.Error()) + } + return result +} + +// FromURLQuery generates a new Obj by parsing the specified +// query. +// +// For queries with multiple values, the first value is selected. +func FromURLQuery(query string) (Map, error) { + vals, err := url.ParseQuery(query) + if err != nil { + return nil, err + } + + m := make(map[string]interface{}) + for k, vals := range vals { + m[k] = vals[0] + } + return New(m), nil +} + +// MustFromURLQuery generates a new Obj by parsing the specified +// query. +// +// For queries with multiple values, the first value is selected. +// +// Panics if it encounters an error +func MustFromURLQuery(query string) Map { + o, err := FromURLQuery(query) + if err != nil { + panic("objx: MustFromURLQuery failed with error: " + err.Error()) + } + return o +} diff --git a/api/vendor/github.com/stretchr/objx/map_for_test.go b/api/vendor/github.com/stretchr/objx/map_for_test.go new file mode 100644 index 0000000..3b4d406 --- /dev/null +++ b/api/vendor/github.com/stretchr/objx/map_for_test.go @@ -0,0 +1,10 @@ +package objx + +var TestMap = map[string]interface{}{ + "name": "Tyler", + "address": map[string]interface{}{ + "city": "Salt Lake City", + "state": "UT", + }, + "numbers": []interface{}{"one", "two", "three", "four", "five"}, +} diff --git a/api/vendor/github.com/stretchr/objx/map_test.go b/api/vendor/github.com/stretchr/objx/map_test.go new file mode 100644 index 0000000..214196c --- /dev/null +++ b/api/vendor/github.com/stretchr/objx/map_test.go @@ -0,0 +1,123 @@ +package objx + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +type Convertable struct { + name string +} + +func (c *Convertable) MSI() map[string]interface{} { + return map[string]interface{}{"name": c.name} +} + +type Unconvertable struct { + name string +} + +func TestMapCreation(t *testing.T) { + o := New(nil) + assert.Nil(t, o) + + o = New("Tyler") + assert.Nil(t, o) + + unconvertable := &Unconvertable{name: "Tyler"} + o = New(unconvertable) + assert.Nil(t, o) + + convertable := &Convertable{name: "Tyler"} + o = New(convertable) + if assert.NotNil(t, convertable) { + assert.Equal(t, "Tyler", o["name"], "Tyler") + } + + o = MSI() + if assert.NotNil(t, o) { + assert.NotNil(t, o) + } + + o = MSI("name", "Tyler") + if assert.NotNil(t, o) { + if assert.NotNil(t, o) { + assert.Equal(t, o["name"], "Tyler") + } + } +} + +func TestMapMustFromJSONWithError(t *testing.T) { + _, err := FromJSON(`"name":"Mat"}`) + assert.Error(t, err) +} + +func TestMapFromJSON(t *testing.T) { + o := MustFromJSON(`{"name":"Mat"}`) + + if assert.NotNil(t, o) { + if assert.NotNil(t, o) { + assert.Equal(t, "Mat", o["name"]) + } + } +} + +func TestMapFromJSONWithError(t *testing.T) { + var m Map + + assert.Panics(t, func() { + m = MustFromJSON(`"name":"Mat"}`) + }) + assert.Nil(t, m) +} + +func TestMapFromBase64String(t *testing.T) { + base64String := "eyJuYW1lIjoiTWF0In0=" + o, err := FromBase64(base64String) + + if assert.NoError(t, err) { + assert.Equal(t, o.Get("name").Str(), "Mat") + } + assert.Equal(t, MustFromBase64(base64String).Get("name").Str(), "Mat") +} + +func TestMapFromBase64StringWithError(t *testing.T) { + base64String := "eyJuYW1lIjoiTWFasd0In0=" + _, err := FromBase64(base64String) + + assert.Error(t, err) + assert.Panics(t, func() { + MustFromBase64(base64String) + }) +} + +func TestMapFromSignedBase64String(t *testing.T) { + base64String := "eyJuYW1lIjoiTWF0In0=_67ee82916f90b2c0d68c903266e8998c9ef0c3d6" + + o, err := FromSignedBase64(base64String, "key") + + if assert.NoError(t, err) { + assert.Equal(t, o.Get("name").Str(), "Mat") + } + assert.Equal(t, MustFromSignedBase64(base64String, "key").Get("name").Str(), "Mat") +} + +func TestMapFromSignedBase64StringWithError(t *testing.T) { + base64String := "eyJuYW1lasdIjoiTWF0In0=_67ee82916f90b2c0d68c903266e8998c9ef0c3d6" + _, err := FromSignedBase64(base64String, "key") + + assert.Error(t, err) + assert.Panics(t, func() { + MustFromSignedBase64(base64String, "key") + }) +} + +func TestMapFromURLQuery(t *testing.T) { + m, err := FromURLQuery("name=tyler&state=UT") + + if assert.NoError(t, err) && assert.NotNil(t, m) { + assert.Equal(t, "tyler", m.Get("name").Str()) + assert.Equal(t, "UT", m.Get("state").Str()) + } +} diff --git a/api/vendor/github.com/stretchr/objx/mutations.go b/api/vendor/github.com/stretchr/objx/mutations.go new file mode 100644 index 0000000..e7b8eb7 --- /dev/null +++ b/api/vendor/github.com/stretchr/objx/mutations.go @@ -0,0 +1,74 @@ +package objx + +// Exclude returns a new Map with the keys in the specified []string +// excluded. +func (m Map) Exclude(exclude []string) Map { + excluded := make(Map) + for k, v := range m { + var shouldInclude = true + for _, toExclude := range exclude { + if k == toExclude { + shouldInclude = false + break + } + } + if shouldInclude { + excluded[k] = v + } + } + return excluded +} + +// Copy creates a shallow copy of the Obj. +func (m Map) Copy() Map { + copied := make(map[string]interface{}) + for k, v := range m { + copied[k] = v + } + return New(copied) +} + +// Merge blends the specified map with a copy of this map and returns the result. +// +// Keys that appear in both will be selected from the specified map. +// This method requires that the wrapped object be a map[string]interface{} +func (m Map) Merge(merge Map) Map { + return m.Copy().MergeHere(merge) +} + +// MergeHere blends the specified map with this map and returns the current map. +// +// Keys that appear in both will be selected from the specified map. The original map +// will be modified. This method requires that +// the wrapped object be a map[string]interface{} +func (m Map) MergeHere(merge Map) Map { + for k, v := range merge { + m[k] = v + } + return m +} + +// Transform builds a new Obj giving the transformer a chance +// to change the keys and values as it goes. This method requires that +// the wrapped object be a map[string]interface{} +func (m Map) Transform(transformer func(key string, value interface{}) (string, interface{})) Map { + newMap := make(map[string]interface{}) + for k, v := range m { + modifiedKey, modifiedVal := transformer(k, v) + newMap[modifiedKey] = modifiedVal + } + return New(newMap) +} + +// TransformKeys builds a new map using the specified key mapping. +// +// Unspecified keys will be unaltered. +// This method requires that the wrapped object be a map[string]interface{} +func (m Map) TransformKeys(mapping map[string]string) Map { + return m.Transform(func(key string, value interface{}) (string, interface{}) { + if newKey, ok := mapping[key]; ok { + return newKey, value + } + return key, value + }) +} diff --git a/api/vendor/github.com/stretchr/objx/mutations_test.go b/api/vendor/github.com/stretchr/objx/mutations_test.go new file mode 100644 index 0000000..5587944 --- /dev/null +++ b/api/vendor/github.com/stretchr/objx/mutations_test.go @@ -0,0 +1,72 @@ +package objx + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestExclude(t *testing.T) { + d := make(Map) + d["name"] = "Mat" + d["age"] = 29 + d["secret"] = "ABC" + + excluded := d.Exclude([]string{"secret"}) + + assert.Equal(t, d["name"], excluded["name"]) + assert.Equal(t, d["age"], excluded["age"]) + assert.False(t, excluded.Has("secret"), "secret should be excluded") +} + +func TestCopy(t *testing.T) { + d1 := make(map[string]interface{}) + d1["name"] = "Tyler" + d1["location"] = "UT" + + d1Obj := New(d1) + d2Obj := d1Obj.Copy() + + d2Obj["name"] = "Mat" + + assert.Equal(t, d1Obj.Get("name").Str(), "Tyler") + assert.Equal(t, d2Obj.Get("name").Str(), "Mat") + +} + +func TestMerge(t *testing.T) { + d := make(map[string]interface{}) + d["name"] = "Mat" + + d1 := make(map[string]interface{}) + d1["name"] = "Tyler" + d1["location"] = "UT" + + dObj := New(d) + d1Obj := New(d1) + + merged := dObj.Merge(d1Obj) + + assert.Equal(t, merged.Get("name").Str(), d1Obj.Get("name").Str()) + assert.Equal(t, merged.Get("location").Str(), d1Obj.Get("location").Str()) + assert.Empty(t, dObj.Get("location").Str()) +} + +func TestMergeHere(t *testing.T) { + d := make(map[string]interface{}) + d["name"] = "Mat" + + d1 := make(map[string]interface{}) + d1["name"] = "Tyler" + d1["location"] = "UT" + + dObj := New(d) + d1Obj := New(d1) + + merged := dObj.MergeHere(d1Obj) + + assert.Equal(t, dObj, merged, "With MergeHere, it should return the first modified map") + assert.Equal(t, merged.Get("name").Str(), d1Obj.Get("name").Str()) + assert.Equal(t, merged.Get("location").Str(), d1Obj.Get("location").Str()) + assert.Equal(t, merged.Get("location").Str(), dObj.Get("location").Str()) +} diff --git a/api/vendor/github.com/stretchr/objx/security.go b/api/vendor/github.com/stretchr/objx/security.go new file mode 100644 index 0000000..e052ff8 --- /dev/null +++ b/api/vendor/github.com/stretchr/objx/security.go @@ -0,0 +1,17 @@ +package objx + +import ( + "crypto/sha1" + "encoding/hex" +) + +// HashWithKey hashes the specified string using the security +// key. +func HashWithKey(data, key string) string { + hash := sha1.New() + _, err := hash.Write([]byte(data + ":" + key)) + if err != nil { + return "" + } + return hex.EncodeToString(hash.Sum(nil)) +} diff --git a/api/vendor/github.com/stretchr/objx/security_test.go b/api/vendor/github.com/stretchr/objx/security_test.go new file mode 100644 index 0000000..aef365e --- /dev/null +++ b/api/vendor/github.com/stretchr/objx/security_test.go @@ -0,0 +1,11 @@ +package objx + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestHashWithKey(t *testing.T) { + assert.Equal(t, "0ce84d8d01f2c7b6e0882b784429c54d280ea2d9", HashWithKey("abc", "def")) +} diff --git a/api/vendor/github.com/stretchr/objx/simple_example_test.go b/api/vendor/github.com/stretchr/objx/simple_example_test.go new file mode 100644 index 0000000..ecba958 --- /dev/null +++ b/api/vendor/github.com/stretchr/objx/simple_example_test.go @@ -0,0 +1,40 @@ +package objx + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestSimpleExample(t *testing.T) { + // build a map from a JSON object + o := MustFromJSON(`{"name":"Mat","foods":["indian","chinese"], "location":{"county":"hobbiton","city":"the shire"}}`) + + // Map can be used as a straight map[string]interface{} + assert.Equal(t, o["name"], "Mat") + + // Get an Value object + v := o.Get("name") + assert.Equal(t, v, &Value{data: "Mat"}) + + // Test the contained value + assert.False(t, v.IsInt()) + assert.False(t, v.IsBool()) + assert.True(t, v.IsStr()) + + // Get the contained value + assert.Equal(t, v.Str(), "Mat") + + // Get a default value if the contained value is not of the expected type or does not exist + assert.Equal(t, 1, v.Int(1)) + + // Get a value by using array notation + assert.Equal(t, "indian", o.Get("foods[0]").Data()) + + // Set a value by using array notation + o.Set("foods[0]", "italian") + assert.Equal(t, "italian", o.Get("foods[0]").Str()) + + // Get a value by using dot notation + assert.Equal(t, "hobbiton", o.Get("location.county").Str()) +} diff --git a/api/vendor/github.com/stretchr/objx/tests.go b/api/vendor/github.com/stretchr/objx/tests.go new file mode 100644 index 0000000..d9e0b47 --- /dev/null +++ b/api/vendor/github.com/stretchr/objx/tests.go @@ -0,0 +1,17 @@ +package objx + +// Has gets whether there is something at the specified selector +// or not. +// +// If m is nil, Has will always return false. +func (m Map) Has(selector string) bool { + if m == nil { + return false + } + return !m.Get(selector).IsNil() +} + +// IsNil gets whether the data is nil or not. +func (v *Value) IsNil() bool { + return v == nil || v.data == nil +} diff --git a/api/vendor/github.com/stretchr/objx/tests_test.go b/api/vendor/github.com/stretchr/objx/tests_test.go new file mode 100644 index 0000000..d0e62a5 --- /dev/null +++ b/api/vendor/github.com/stretchr/objx/tests_test.go @@ -0,0 +1,24 @@ +package objx + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestHas(t *testing.T) { + m := New(TestMap) + + assert.True(t, m.Has("name")) + assert.True(t, m.Has("address.state")) + assert.True(t, m.Has("numbers[4]")) + + assert.False(t, m.Has("address.state.nope")) + assert.False(t, m.Has("address.nope")) + assert.False(t, m.Has("nope")) + assert.False(t, m.Has("numbers[5]")) + + m = nil + + assert.False(t, m.Has("nothing")) +} diff --git a/api/vendor/github.com/stretchr/objx/type_specific_codegen.go b/api/vendor/github.com/stretchr/objx/type_specific_codegen.go new file mode 100644 index 0000000..202a91f --- /dev/null +++ b/api/vendor/github.com/stretchr/objx/type_specific_codegen.go @@ -0,0 +1,2501 @@ +package objx + +/* + Inter (interface{} and []interface{}) +*/ + +// Inter gets the value as a interface{}, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Inter(optionalDefault ...interface{}) interface{} { + if s, ok := v.data.(interface{}); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustInter gets the value as a interface{}. +// +// Panics if the object is not a interface{}. +func (v *Value) MustInter() interface{} { + return v.data.(interface{}) +} + +// InterSlice gets the value as a []interface{}, returns the optionalDefault +// value or nil if the value is not a []interface{}. +func (v *Value) InterSlice(optionalDefault ...[]interface{}) []interface{} { + if s, ok := v.data.([]interface{}); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustInterSlice gets the value as a []interface{}. +// +// Panics if the object is not a []interface{}. +func (v *Value) MustInterSlice() []interface{} { + return v.data.([]interface{}) +} + +// IsInter gets whether the object contained is a interface{} or not. +func (v *Value) IsInter() bool { + _, ok := v.data.(interface{}) + return ok +} + +// IsInterSlice gets whether the object contained is a []interface{} or not. +func (v *Value) IsInterSlice() bool { + _, ok := v.data.([]interface{}) + return ok +} + +// EachInter calls the specified callback for each object +// in the []interface{}. +// +// Panics if the object is the wrong type. +func (v *Value) EachInter(callback func(int, interface{}) bool) *Value { + for index, val := range v.MustInterSlice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereInter uses the specified decider function to select items +// from the []interface{}. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereInter(decider func(int, interface{}) bool) *Value { + var selected []interface{} + v.EachInter(func(index int, val interface{}) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupInter uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]interface{}. +func (v *Value) GroupInter(grouper func(int, interface{}) string) *Value { + groups := make(map[string][]interface{}) + v.EachInter(func(index int, val interface{}) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]interface{}, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceInter uses the specified function to replace each interface{}s +// by iterating each item. The data in the returned result will be a +// []interface{} containing the replaced items. +func (v *Value) ReplaceInter(replacer func(int, interface{}) interface{}) *Value { + arr := v.MustInterSlice() + replaced := make([]interface{}, len(arr)) + v.EachInter(func(index int, val interface{}) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectInter uses the specified collector function to collect a value +// for each of the interface{}s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectInter(collector func(int, interface{}) interface{}) *Value { + arr := v.MustInterSlice() + collected := make([]interface{}, len(arr)) + v.EachInter(func(index int, val interface{}) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + MSI (map[string]interface{} and []map[string]interface{}) +*/ + +// MSI gets the value as a map[string]interface{}, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) MSI(optionalDefault ...map[string]interface{}) map[string]interface{} { + if s, ok := v.data.(map[string]interface{}); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustMSI gets the value as a map[string]interface{}. +// +// Panics if the object is not a map[string]interface{}. +func (v *Value) MustMSI() map[string]interface{} { + return v.data.(map[string]interface{}) +} + +// MSISlice gets the value as a []map[string]interface{}, returns the optionalDefault +// value or nil if the value is not a []map[string]interface{}. +func (v *Value) MSISlice(optionalDefault ...[]map[string]interface{}) []map[string]interface{} { + if s, ok := v.data.([]map[string]interface{}); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustMSISlice gets the value as a []map[string]interface{}. +// +// Panics if the object is not a []map[string]interface{}. +func (v *Value) MustMSISlice() []map[string]interface{} { + return v.data.([]map[string]interface{}) +} + +// IsMSI gets whether the object contained is a map[string]interface{} or not. +func (v *Value) IsMSI() bool { + _, ok := v.data.(map[string]interface{}) + return ok +} + +// IsMSISlice gets whether the object contained is a []map[string]interface{} or not. +func (v *Value) IsMSISlice() bool { + _, ok := v.data.([]map[string]interface{}) + return ok +} + +// EachMSI calls the specified callback for each object +// in the []map[string]interface{}. +// +// Panics if the object is the wrong type. +func (v *Value) EachMSI(callback func(int, map[string]interface{}) bool) *Value { + for index, val := range v.MustMSISlice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereMSI uses the specified decider function to select items +// from the []map[string]interface{}. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereMSI(decider func(int, map[string]interface{}) bool) *Value { + var selected []map[string]interface{} + v.EachMSI(func(index int, val map[string]interface{}) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupMSI uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]map[string]interface{}. +func (v *Value) GroupMSI(grouper func(int, map[string]interface{}) string) *Value { + groups := make(map[string][]map[string]interface{}) + v.EachMSI(func(index int, val map[string]interface{}) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]map[string]interface{}, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceMSI uses the specified function to replace each map[string]interface{}s +// by iterating each item. The data in the returned result will be a +// []map[string]interface{} containing the replaced items. +func (v *Value) ReplaceMSI(replacer func(int, map[string]interface{}) map[string]interface{}) *Value { + arr := v.MustMSISlice() + replaced := make([]map[string]interface{}, len(arr)) + v.EachMSI(func(index int, val map[string]interface{}) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectMSI uses the specified collector function to collect a value +// for each of the map[string]interface{}s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectMSI(collector func(int, map[string]interface{}) interface{}) *Value { + arr := v.MustMSISlice() + collected := make([]interface{}, len(arr)) + v.EachMSI(func(index int, val map[string]interface{}) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + ObjxMap ((Map) and [](Map)) +*/ + +// ObjxMap gets the value as a (Map), returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) ObjxMap(optionalDefault ...(Map)) Map { + if s, ok := v.data.((Map)); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return New(nil) +} + +// MustObjxMap gets the value as a (Map). +// +// Panics if the object is not a (Map). +func (v *Value) MustObjxMap() Map { + return v.data.((Map)) +} + +// ObjxMapSlice gets the value as a [](Map), returns the optionalDefault +// value or nil if the value is not a [](Map). +func (v *Value) ObjxMapSlice(optionalDefault ...[](Map)) [](Map) { + if s, ok := v.data.([](Map)); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustObjxMapSlice gets the value as a [](Map). +// +// Panics if the object is not a [](Map). +func (v *Value) MustObjxMapSlice() [](Map) { + return v.data.([](Map)) +} + +// IsObjxMap gets whether the object contained is a (Map) or not. +func (v *Value) IsObjxMap() bool { + _, ok := v.data.((Map)) + return ok +} + +// IsObjxMapSlice gets whether the object contained is a [](Map) or not. +func (v *Value) IsObjxMapSlice() bool { + _, ok := v.data.([](Map)) + return ok +} + +// EachObjxMap calls the specified callback for each object +// in the [](Map). +// +// Panics if the object is the wrong type. +func (v *Value) EachObjxMap(callback func(int, Map) bool) *Value { + for index, val := range v.MustObjxMapSlice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereObjxMap uses the specified decider function to select items +// from the [](Map). The object contained in the result will contain +// only the selected items. +func (v *Value) WhereObjxMap(decider func(int, Map) bool) *Value { + var selected [](Map) + v.EachObjxMap(func(index int, val Map) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupObjxMap uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][](Map). +func (v *Value) GroupObjxMap(grouper func(int, Map) string) *Value { + groups := make(map[string][](Map)) + v.EachObjxMap(func(index int, val Map) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([](Map), 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceObjxMap uses the specified function to replace each (Map)s +// by iterating each item. The data in the returned result will be a +// [](Map) containing the replaced items. +func (v *Value) ReplaceObjxMap(replacer func(int, Map) Map) *Value { + arr := v.MustObjxMapSlice() + replaced := make([](Map), len(arr)) + v.EachObjxMap(func(index int, val Map) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectObjxMap uses the specified collector function to collect a value +// for each of the (Map)s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectObjxMap(collector func(int, Map) interface{}) *Value { + arr := v.MustObjxMapSlice() + collected := make([]interface{}, len(arr)) + v.EachObjxMap(func(index int, val Map) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Bool (bool and []bool) +*/ + +// Bool gets the value as a bool, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Bool(optionalDefault ...bool) bool { + if s, ok := v.data.(bool); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return false +} + +// MustBool gets the value as a bool. +// +// Panics if the object is not a bool. +func (v *Value) MustBool() bool { + return v.data.(bool) +} + +// BoolSlice gets the value as a []bool, returns the optionalDefault +// value or nil if the value is not a []bool. +func (v *Value) BoolSlice(optionalDefault ...[]bool) []bool { + if s, ok := v.data.([]bool); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustBoolSlice gets the value as a []bool. +// +// Panics if the object is not a []bool. +func (v *Value) MustBoolSlice() []bool { + return v.data.([]bool) +} + +// IsBool gets whether the object contained is a bool or not. +func (v *Value) IsBool() bool { + _, ok := v.data.(bool) + return ok +} + +// IsBoolSlice gets whether the object contained is a []bool or not. +func (v *Value) IsBoolSlice() bool { + _, ok := v.data.([]bool) + return ok +} + +// EachBool calls the specified callback for each object +// in the []bool. +// +// Panics if the object is the wrong type. +func (v *Value) EachBool(callback func(int, bool) bool) *Value { + for index, val := range v.MustBoolSlice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereBool uses the specified decider function to select items +// from the []bool. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereBool(decider func(int, bool) bool) *Value { + var selected []bool + v.EachBool(func(index int, val bool) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupBool uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]bool. +func (v *Value) GroupBool(grouper func(int, bool) string) *Value { + groups := make(map[string][]bool) + v.EachBool(func(index int, val bool) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]bool, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceBool uses the specified function to replace each bools +// by iterating each item. The data in the returned result will be a +// []bool containing the replaced items. +func (v *Value) ReplaceBool(replacer func(int, bool) bool) *Value { + arr := v.MustBoolSlice() + replaced := make([]bool, len(arr)) + v.EachBool(func(index int, val bool) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectBool uses the specified collector function to collect a value +// for each of the bools in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectBool(collector func(int, bool) interface{}) *Value { + arr := v.MustBoolSlice() + collected := make([]interface{}, len(arr)) + v.EachBool(func(index int, val bool) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Str (string and []string) +*/ + +// Str gets the value as a string, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Str(optionalDefault ...string) string { + if s, ok := v.data.(string); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return "" +} + +// MustStr gets the value as a string. +// +// Panics if the object is not a string. +func (v *Value) MustStr() string { + return v.data.(string) +} + +// StrSlice gets the value as a []string, returns the optionalDefault +// value or nil if the value is not a []string. +func (v *Value) StrSlice(optionalDefault ...[]string) []string { + if s, ok := v.data.([]string); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustStrSlice gets the value as a []string. +// +// Panics if the object is not a []string. +func (v *Value) MustStrSlice() []string { + return v.data.([]string) +} + +// IsStr gets whether the object contained is a string or not. +func (v *Value) IsStr() bool { + _, ok := v.data.(string) + return ok +} + +// IsStrSlice gets whether the object contained is a []string or not. +func (v *Value) IsStrSlice() bool { + _, ok := v.data.([]string) + return ok +} + +// EachStr calls the specified callback for each object +// in the []string. +// +// Panics if the object is the wrong type. +func (v *Value) EachStr(callback func(int, string) bool) *Value { + for index, val := range v.MustStrSlice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereStr uses the specified decider function to select items +// from the []string. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereStr(decider func(int, string) bool) *Value { + var selected []string + v.EachStr(func(index int, val string) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupStr uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]string. +func (v *Value) GroupStr(grouper func(int, string) string) *Value { + groups := make(map[string][]string) + v.EachStr(func(index int, val string) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]string, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceStr uses the specified function to replace each strings +// by iterating each item. The data in the returned result will be a +// []string containing the replaced items. +func (v *Value) ReplaceStr(replacer func(int, string) string) *Value { + arr := v.MustStrSlice() + replaced := make([]string, len(arr)) + v.EachStr(func(index int, val string) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectStr uses the specified collector function to collect a value +// for each of the strings in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectStr(collector func(int, string) interface{}) *Value { + arr := v.MustStrSlice() + collected := make([]interface{}, len(arr)) + v.EachStr(func(index int, val string) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Int (int and []int) +*/ + +// Int gets the value as a int, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Int(optionalDefault ...int) int { + if s, ok := v.data.(int); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustInt gets the value as a int. +// +// Panics if the object is not a int. +func (v *Value) MustInt() int { + return v.data.(int) +} + +// IntSlice gets the value as a []int, returns the optionalDefault +// value or nil if the value is not a []int. +func (v *Value) IntSlice(optionalDefault ...[]int) []int { + if s, ok := v.data.([]int); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustIntSlice gets the value as a []int. +// +// Panics if the object is not a []int. +func (v *Value) MustIntSlice() []int { + return v.data.([]int) +} + +// IsInt gets whether the object contained is a int or not. +func (v *Value) IsInt() bool { + _, ok := v.data.(int) + return ok +} + +// IsIntSlice gets whether the object contained is a []int or not. +func (v *Value) IsIntSlice() bool { + _, ok := v.data.([]int) + return ok +} + +// EachInt calls the specified callback for each object +// in the []int. +// +// Panics if the object is the wrong type. +func (v *Value) EachInt(callback func(int, int) bool) *Value { + for index, val := range v.MustIntSlice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereInt uses the specified decider function to select items +// from the []int. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereInt(decider func(int, int) bool) *Value { + var selected []int + v.EachInt(func(index int, val int) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupInt uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]int. +func (v *Value) GroupInt(grouper func(int, int) string) *Value { + groups := make(map[string][]int) + v.EachInt(func(index int, val int) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]int, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceInt uses the specified function to replace each ints +// by iterating each item. The data in the returned result will be a +// []int containing the replaced items. +func (v *Value) ReplaceInt(replacer func(int, int) int) *Value { + arr := v.MustIntSlice() + replaced := make([]int, len(arr)) + v.EachInt(func(index int, val int) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectInt uses the specified collector function to collect a value +// for each of the ints in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectInt(collector func(int, int) interface{}) *Value { + arr := v.MustIntSlice() + collected := make([]interface{}, len(arr)) + v.EachInt(func(index int, val int) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Int8 (int8 and []int8) +*/ + +// Int8 gets the value as a int8, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Int8(optionalDefault ...int8) int8 { + if s, ok := v.data.(int8); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustInt8 gets the value as a int8. +// +// Panics if the object is not a int8. +func (v *Value) MustInt8() int8 { + return v.data.(int8) +} + +// Int8Slice gets the value as a []int8, returns the optionalDefault +// value or nil if the value is not a []int8. +func (v *Value) Int8Slice(optionalDefault ...[]int8) []int8 { + if s, ok := v.data.([]int8); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustInt8Slice gets the value as a []int8. +// +// Panics if the object is not a []int8. +func (v *Value) MustInt8Slice() []int8 { + return v.data.([]int8) +} + +// IsInt8 gets whether the object contained is a int8 or not. +func (v *Value) IsInt8() bool { + _, ok := v.data.(int8) + return ok +} + +// IsInt8Slice gets whether the object contained is a []int8 or not. +func (v *Value) IsInt8Slice() bool { + _, ok := v.data.([]int8) + return ok +} + +// EachInt8 calls the specified callback for each object +// in the []int8. +// +// Panics if the object is the wrong type. +func (v *Value) EachInt8(callback func(int, int8) bool) *Value { + for index, val := range v.MustInt8Slice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereInt8 uses the specified decider function to select items +// from the []int8. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereInt8(decider func(int, int8) bool) *Value { + var selected []int8 + v.EachInt8(func(index int, val int8) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupInt8 uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]int8. +func (v *Value) GroupInt8(grouper func(int, int8) string) *Value { + groups := make(map[string][]int8) + v.EachInt8(func(index int, val int8) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]int8, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceInt8 uses the specified function to replace each int8s +// by iterating each item. The data in the returned result will be a +// []int8 containing the replaced items. +func (v *Value) ReplaceInt8(replacer func(int, int8) int8) *Value { + arr := v.MustInt8Slice() + replaced := make([]int8, len(arr)) + v.EachInt8(func(index int, val int8) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectInt8 uses the specified collector function to collect a value +// for each of the int8s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectInt8(collector func(int, int8) interface{}) *Value { + arr := v.MustInt8Slice() + collected := make([]interface{}, len(arr)) + v.EachInt8(func(index int, val int8) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Int16 (int16 and []int16) +*/ + +// Int16 gets the value as a int16, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Int16(optionalDefault ...int16) int16 { + if s, ok := v.data.(int16); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustInt16 gets the value as a int16. +// +// Panics if the object is not a int16. +func (v *Value) MustInt16() int16 { + return v.data.(int16) +} + +// Int16Slice gets the value as a []int16, returns the optionalDefault +// value or nil if the value is not a []int16. +func (v *Value) Int16Slice(optionalDefault ...[]int16) []int16 { + if s, ok := v.data.([]int16); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustInt16Slice gets the value as a []int16. +// +// Panics if the object is not a []int16. +func (v *Value) MustInt16Slice() []int16 { + return v.data.([]int16) +} + +// IsInt16 gets whether the object contained is a int16 or not. +func (v *Value) IsInt16() bool { + _, ok := v.data.(int16) + return ok +} + +// IsInt16Slice gets whether the object contained is a []int16 or not. +func (v *Value) IsInt16Slice() bool { + _, ok := v.data.([]int16) + return ok +} + +// EachInt16 calls the specified callback for each object +// in the []int16. +// +// Panics if the object is the wrong type. +func (v *Value) EachInt16(callback func(int, int16) bool) *Value { + for index, val := range v.MustInt16Slice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereInt16 uses the specified decider function to select items +// from the []int16. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereInt16(decider func(int, int16) bool) *Value { + var selected []int16 + v.EachInt16(func(index int, val int16) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupInt16 uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]int16. +func (v *Value) GroupInt16(grouper func(int, int16) string) *Value { + groups := make(map[string][]int16) + v.EachInt16(func(index int, val int16) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]int16, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceInt16 uses the specified function to replace each int16s +// by iterating each item. The data in the returned result will be a +// []int16 containing the replaced items. +func (v *Value) ReplaceInt16(replacer func(int, int16) int16) *Value { + arr := v.MustInt16Slice() + replaced := make([]int16, len(arr)) + v.EachInt16(func(index int, val int16) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectInt16 uses the specified collector function to collect a value +// for each of the int16s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectInt16(collector func(int, int16) interface{}) *Value { + arr := v.MustInt16Slice() + collected := make([]interface{}, len(arr)) + v.EachInt16(func(index int, val int16) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Int32 (int32 and []int32) +*/ + +// Int32 gets the value as a int32, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Int32(optionalDefault ...int32) int32 { + if s, ok := v.data.(int32); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustInt32 gets the value as a int32. +// +// Panics if the object is not a int32. +func (v *Value) MustInt32() int32 { + return v.data.(int32) +} + +// Int32Slice gets the value as a []int32, returns the optionalDefault +// value or nil if the value is not a []int32. +func (v *Value) Int32Slice(optionalDefault ...[]int32) []int32 { + if s, ok := v.data.([]int32); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustInt32Slice gets the value as a []int32. +// +// Panics if the object is not a []int32. +func (v *Value) MustInt32Slice() []int32 { + return v.data.([]int32) +} + +// IsInt32 gets whether the object contained is a int32 or not. +func (v *Value) IsInt32() bool { + _, ok := v.data.(int32) + return ok +} + +// IsInt32Slice gets whether the object contained is a []int32 or not. +func (v *Value) IsInt32Slice() bool { + _, ok := v.data.([]int32) + return ok +} + +// EachInt32 calls the specified callback for each object +// in the []int32. +// +// Panics if the object is the wrong type. +func (v *Value) EachInt32(callback func(int, int32) bool) *Value { + for index, val := range v.MustInt32Slice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereInt32 uses the specified decider function to select items +// from the []int32. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereInt32(decider func(int, int32) bool) *Value { + var selected []int32 + v.EachInt32(func(index int, val int32) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupInt32 uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]int32. +func (v *Value) GroupInt32(grouper func(int, int32) string) *Value { + groups := make(map[string][]int32) + v.EachInt32(func(index int, val int32) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]int32, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceInt32 uses the specified function to replace each int32s +// by iterating each item. The data in the returned result will be a +// []int32 containing the replaced items. +func (v *Value) ReplaceInt32(replacer func(int, int32) int32) *Value { + arr := v.MustInt32Slice() + replaced := make([]int32, len(arr)) + v.EachInt32(func(index int, val int32) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectInt32 uses the specified collector function to collect a value +// for each of the int32s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectInt32(collector func(int, int32) interface{}) *Value { + arr := v.MustInt32Slice() + collected := make([]interface{}, len(arr)) + v.EachInt32(func(index int, val int32) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Int64 (int64 and []int64) +*/ + +// Int64 gets the value as a int64, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Int64(optionalDefault ...int64) int64 { + if s, ok := v.data.(int64); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustInt64 gets the value as a int64. +// +// Panics if the object is not a int64. +func (v *Value) MustInt64() int64 { + return v.data.(int64) +} + +// Int64Slice gets the value as a []int64, returns the optionalDefault +// value or nil if the value is not a []int64. +func (v *Value) Int64Slice(optionalDefault ...[]int64) []int64 { + if s, ok := v.data.([]int64); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustInt64Slice gets the value as a []int64. +// +// Panics if the object is not a []int64. +func (v *Value) MustInt64Slice() []int64 { + return v.data.([]int64) +} + +// IsInt64 gets whether the object contained is a int64 or not. +func (v *Value) IsInt64() bool { + _, ok := v.data.(int64) + return ok +} + +// IsInt64Slice gets whether the object contained is a []int64 or not. +func (v *Value) IsInt64Slice() bool { + _, ok := v.data.([]int64) + return ok +} + +// EachInt64 calls the specified callback for each object +// in the []int64. +// +// Panics if the object is the wrong type. +func (v *Value) EachInt64(callback func(int, int64) bool) *Value { + for index, val := range v.MustInt64Slice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereInt64 uses the specified decider function to select items +// from the []int64. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereInt64(decider func(int, int64) bool) *Value { + var selected []int64 + v.EachInt64(func(index int, val int64) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupInt64 uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]int64. +func (v *Value) GroupInt64(grouper func(int, int64) string) *Value { + groups := make(map[string][]int64) + v.EachInt64(func(index int, val int64) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]int64, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceInt64 uses the specified function to replace each int64s +// by iterating each item. The data in the returned result will be a +// []int64 containing the replaced items. +func (v *Value) ReplaceInt64(replacer func(int, int64) int64) *Value { + arr := v.MustInt64Slice() + replaced := make([]int64, len(arr)) + v.EachInt64(func(index int, val int64) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectInt64 uses the specified collector function to collect a value +// for each of the int64s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectInt64(collector func(int, int64) interface{}) *Value { + arr := v.MustInt64Slice() + collected := make([]interface{}, len(arr)) + v.EachInt64(func(index int, val int64) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Uint (uint and []uint) +*/ + +// Uint gets the value as a uint, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Uint(optionalDefault ...uint) uint { + if s, ok := v.data.(uint); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustUint gets the value as a uint. +// +// Panics if the object is not a uint. +func (v *Value) MustUint() uint { + return v.data.(uint) +} + +// UintSlice gets the value as a []uint, returns the optionalDefault +// value or nil if the value is not a []uint. +func (v *Value) UintSlice(optionalDefault ...[]uint) []uint { + if s, ok := v.data.([]uint); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustUintSlice gets the value as a []uint. +// +// Panics if the object is not a []uint. +func (v *Value) MustUintSlice() []uint { + return v.data.([]uint) +} + +// IsUint gets whether the object contained is a uint or not. +func (v *Value) IsUint() bool { + _, ok := v.data.(uint) + return ok +} + +// IsUintSlice gets whether the object contained is a []uint or not. +func (v *Value) IsUintSlice() bool { + _, ok := v.data.([]uint) + return ok +} + +// EachUint calls the specified callback for each object +// in the []uint. +// +// Panics if the object is the wrong type. +func (v *Value) EachUint(callback func(int, uint) bool) *Value { + for index, val := range v.MustUintSlice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereUint uses the specified decider function to select items +// from the []uint. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereUint(decider func(int, uint) bool) *Value { + var selected []uint + v.EachUint(func(index int, val uint) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupUint uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]uint. +func (v *Value) GroupUint(grouper func(int, uint) string) *Value { + groups := make(map[string][]uint) + v.EachUint(func(index int, val uint) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]uint, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceUint uses the specified function to replace each uints +// by iterating each item. The data in the returned result will be a +// []uint containing the replaced items. +func (v *Value) ReplaceUint(replacer func(int, uint) uint) *Value { + arr := v.MustUintSlice() + replaced := make([]uint, len(arr)) + v.EachUint(func(index int, val uint) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectUint uses the specified collector function to collect a value +// for each of the uints in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectUint(collector func(int, uint) interface{}) *Value { + arr := v.MustUintSlice() + collected := make([]interface{}, len(arr)) + v.EachUint(func(index int, val uint) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Uint8 (uint8 and []uint8) +*/ + +// Uint8 gets the value as a uint8, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Uint8(optionalDefault ...uint8) uint8 { + if s, ok := v.data.(uint8); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustUint8 gets the value as a uint8. +// +// Panics if the object is not a uint8. +func (v *Value) MustUint8() uint8 { + return v.data.(uint8) +} + +// Uint8Slice gets the value as a []uint8, returns the optionalDefault +// value or nil if the value is not a []uint8. +func (v *Value) Uint8Slice(optionalDefault ...[]uint8) []uint8 { + if s, ok := v.data.([]uint8); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustUint8Slice gets the value as a []uint8. +// +// Panics if the object is not a []uint8. +func (v *Value) MustUint8Slice() []uint8 { + return v.data.([]uint8) +} + +// IsUint8 gets whether the object contained is a uint8 or not. +func (v *Value) IsUint8() bool { + _, ok := v.data.(uint8) + return ok +} + +// IsUint8Slice gets whether the object contained is a []uint8 or not. +func (v *Value) IsUint8Slice() bool { + _, ok := v.data.([]uint8) + return ok +} + +// EachUint8 calls the specified callback for each object +// in the []uint8. +// +// Panics if the object is the wrong type. +func (v *Value) EachUint8(callback func(int, uint8) bool) *Value { + for index, val := range v.MustUint8Slice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereUint8 uses the specified decider function to select items +// from the []uint8. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereUint8(decider func(int, uint8) bool) *Value { + var selected []uint8 + v.EachUint8(func(index int, val uint8) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupUint8 uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]uint8. +func (v *Value) GroupUint8(grouper func(int, uint8) string) *Value { + groups := make(map[string][]uint8) + v.EachUint8(func(index int, val uint8) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]uint8, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceUint8 uses the specified function to replace each uint8s +// by iterating each item. The data in the returned result will be a +// []uint8 containing the replaced items. +func (v *Value) ReplaceUint8(replacer func(int, uint8) uint8) *Value { + arr := v.MustUint8Slice() + replaced := make([]uint8, len(arr)) + v.EachUint8(func(index int, val uint8) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectUint8 uses the specified collector function to collect a value +// for each of the uint8s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectUint8(collector func(int, uint8) interface{}) *Value { + arr := v.MustUint8Slice() + collected := make([]interface{}, len(arr)) + v.EachUint8(func(index int, val uint8) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Uint16 (uint16 and []uint16) +*/ + +// Uint16 gets the value as a uint16, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Uint16(optionalDefault ...uint16) uint16 { + if s, ok := v.data.(uint16); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustUint16 gets the value as a uint16. +// +// Panics if the object is not a uint16. +func (v *Value) MustUint16() uint16 { + return v.data.(uint16) +} + +// Uint16Slice gets the value as a []uint16, returns the optionalDefault +// value or nil if the value is not a []uint16. +func (v *Value) Uint16Slice(optionalDefault ...[]uint16) []uint16 { + if s, ok := v.data.([]uint16); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustUint16Slice gets the value as a []uint16. +// +// Panics if the object is not a []uint16. +func (v *Value) MustUint16Slice() []uint16 { + return v.data.([]uint16) +} + +// IsUint16 gets whether the object contained is a uint16 or not. +func (v *Value) IsUint16() bool { + _, ok := v.data.(uint16) + return ok +} + +// IsUint16Slice gets whether the object contained is a []uint16 or not. +func (v *Value) IsUint16Slice() bool { + _, ok := v.data.([]uint16) + return ok +} + +// EachUint16 calls the specified callback for each object +// in the []uint16. +// +// Panics if the object is the wrong type. +func (v *Value) EachUint16(callback func(int, uint16) bool) *Value { + for index, val := range v.MustUint16Slice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereUint16 uses the specified decider function to select items +// from the []uint16. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereUint16(decider func(int, uint16) bool) *Value { + var selected []uint16 + v.EachUint16(func(index int, val uint16) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupUint16 uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]uint16. +func (v *Value) GroupUint16(grouper func(int, uint16) string) *Value { + groups := make(map[string][]uint16) + v.EachUint16(func(index int, val uint16) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]uint16, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceUint16 uses the specified function to replace each uint16s +// by iterating each item. The data in the returned result will be a +// []uint16 containing the replaced items. +func (v *Value) ReplaceUint16(replacer func(int, uint16) uint16) *Value { + arr := v.MustUint16Slice() + replaced := make([]uint16, len(arr)) + v.EachUint16(func(index int, val uint16) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectUint16 uses the specified collector function to collect a value +// for each of the uint16s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectUint16(collector func(int, uint16) interface{}) *Value { + arr := v.MustUint16Slice() + collected := make([]interface{}, len(arr)) + v.EachUint16(func(index int, val uint16) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Uint32 (uint32 and []uint32) +*/ + +// Uint32 gets the value as a uint32, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Uint32(optionalDefault ...uint32) uint32 { + if s, ok := v.data.(uint32); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustUint32 gets the value as a uint32. +// +// Panics if the object is not a uint32. +func (v *Value) MustUint32() uint32 { + return v.data.(uint32) +} + +// Uint32Slice gets the value as a []uint32, returns the optionalDefault +// value or nil if the value is not a []uint32. +func (v *Value) Uint32Slice(optionalDefault ...[]uint32) []uint32 { + if s, ok := v.data.([]uint32); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustUint32Slice gets the value as a []uint32. +// +// Panics if the object is not a []uint32. +func (v *Value) MustUint32Slice() []uint32 { + return v.data.([]uint32) +} + +// IsUint32 gets whether the object contained is a uint32 or not. +func (v *Value) IsUint32() bool { + _, ok := v.data.(uint32) + return ok +} + +// IsUint32Slice gets whether the object contained is a []uint32 or not. +func (v *Value) IsUint32Slice() bool { + _, ok := v.data.([]uint32) + return ok +} + +// EachUint32 calls the specified callback for each object +// in the []uint32. +// +// Panics if the object is the wrong type. +func (v *Value) EachUint32(callback func(int, uint32) bool) *Value { + for index, val := range v.MustUint32Slice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereUint32 uses the specified decider function to select items +// from the []uint32. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereUint32(decider func(int, uint32) bool) *Value { + var selected []uint32 + v.EachUint32(func(index int, val uint32) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupUint32 uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]uint32. +func (v *Value) GroupUint32(grouper func(int, uint32) string) *Value { + groups := make(map[string][]uint32) + v.EachUint32(func(index int, val uint32) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]uint32, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceUint32 uses the specified function to replace each uint32s +// by iterating each item. The data in the returned result will be a +// []uint32 containing the replaced items. +func (v *Value) ReplaceUint32(replacer func(int, uint32) uint32) *Value { + arr := v.MustUint32Slice() + replaced := make([]uint32, len(arr)) + v.EachUint32(func(index int, val uint32) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectUint32 uses the specified collector function to collect a value +// for each of the uint32s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectUint32(collector func(int, uint32) interface{}) *Value { + arr := v.MustUint32Slice() + collected := make([]interface{}, len(arr)) + v.EachUint32(func(index int, val uint32) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Uint64 (uint64 and []uint64) +*/ + +// Uint64 gets the value as a uint64, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Uint64(optionalDefault ...uint64) uint64 { + if s, ok := v.data.(uint64); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustUint64 gets the value as a uint64. +// +// Panics if the object is not a uint64. +func (v *Value) MustUint64() uint64 { + return v.data.(uint64) +} + +// Uint64Slice gets the value as a []uint64, returns the optionalDefault +// value or nil if the value is not a []uint64. +func (v *Value) Uint64Slice(optionalDefault ...[]uint64) []uint64 { + if s, ok := v.data.([]uint64); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustUint64Slice gets the value as a []uint64. +// +// Panics if the object is not a []uint64. +func (v *Value) MustUint64Slice() []uint64 { + return v.data.([]uint64) +} + +// IsUint64 gets whether the object contained is a uint64 or not. +func (v *Value) IsUint64() bool { + _, ok := v.data.(uint64) + return ok +} + +// IsUint64Slice gets whether the object contained is a []uint64 or not. +func (v *Value) IsUint64Slice() bool { + _, ok := v.data.([]uint64) + return ok +} + +// EachUint64 calls the specified callback for each object +// in the []uint64. +// +// Panics if the object is the wrong type. +func (v *Value) EachUint64(callback func(int, uint64) bool) *Value { + for index, val := range v.MustUint64Slice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereUint64 uses the specified decider function to select items +// from the []uint64. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereUint64(decider func(int, uint64) bool) *Value { + var selected []uint64 + v.EachUint64(func(index int, val uint64) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupUint64 uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]uint64. +func (v *Value) GroupUint64(grouper func(int, uint64) string) *Value { + groups := make(map[string][]uint64) + v.EachUint64(func(index int, val uint64) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]uint64, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceUint64 uses the specified function to replace each uint64s +// by iterating each item. The data in the returned result will be a +// []uint64 containing the replaced items. +func (v *Value) ReplaceUint64(replacer func(int, uint64) uint64) *Value { + arr := v.MustUint64Slice() + replaced := make([]uint64, len(arr)) + v.EachUint64(func(index int, val uint64) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectUint64 uses the specified collector function to collect a value +// for each of the uint64s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectUint64(collector func(int, uint64) interface{}) *Value { + arr := v.MustUint64Slice() + collected := make([]interface{}, len(arr)) + v.EachUint64(func(index int, val uint64) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Uintptr (uintptr and []uintptr) +*/ + +// Uintptr gets the value as a uintptr, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Uintptr(optionalDefault ...uintptr) uintptr { + if s, ok := v.data.(uintptr); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustUintptr gets the value as a uintptr. +// +// Panics if the object is not a uintptr. +func (v *Value) MustUintptr() uintptr { + return v.data.(uintptr) +} + +// UintptrSlice gets the value as a []uintptr, returns the optionalDefault +// value or nil if the value is not a []uintptr. +func (v *Value) UintptrSlice(optionalDefault ...[]uintptr) []uintptr { + if s, ok := v.data.([]uintptr); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustUintptrSlice gets the value as a []uintptr. +// +// Panics if the object is not a []uintptr. +func (v *Value) MustUintptrSlice() []uintptr { + return v.data.([]uintptr) +} + +// IsUintptr gets whether the object contained is a uintptr or not. +func (v *Value) IsUintptr() bool { + _, ok := v.data.(uintptr) + return ok +} + +// IsUintptrSlice gets whether the object contained is a []uintptr or not. +func (v *Value) IsUintptrSlice() bool { + _, ok := v.data.([]uintptr) + return ok +} + +// EachUintptr calls the specified callback for each object +// in the []uintptr. +// +// Panics if the object is the wrong type. +func (v *Value) EachUintptr(callback func(int, uintptr) bool) *Value { + for index, val := range v.MustUintptrSlice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereUintptr uses the specified decider function to select items +// from the []uintptr. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereUintptr(decider func(int, uintptr) bool) *Value { + var selected []uintptr + v.EachUintptr(func(index int, val uintptr) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupUintptr uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]uintptr. +func (v *Value) GroupUintptr(grouper func(int, uintptr) string) *Value { + groups := make(map[string][]uintptr) + v.EachUintptr(func(index int, val uintptr) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]uintptr, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceUintptr uses the specified function to replace each uintptrs +// by iterating each item. The data in the returned result will be a +// []uintptr containing the replaced items. +func (v *Value) ReplaceUintptr(replacer func(int, uintptr) uintptr) *Value { + arr := v.MustUintptrSlice() + replaced := make([]uintptr, len(arr)) + v.EachUintptr(func(index int, val uintptr) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectUintptr uses the specified collector function to collect a value +// for each of the uintptrs in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectUintptr(collector func(int, uintptr) interface{}) *Value { + arr := v.MustUintptrSlice() + collected := make([]interface{}, len(arr)) + v.EachUintptr(func(index int, val uintptr) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Float32 (float32 and []float32) +*/ + +// Float32 gets the value as a float32, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Float32(optionalDefault ...float32) float32 { + if s, ok := v.data.(float32); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustFloat32 gets the value as a float32. +// +// Panics if the object is not a float32. +func (v *Value) MustFloat32() float32 { + return v.data.(float32) +} + +// Float32Slice gets the value as a []float32, returns the optionalDefault +// value or nil if the value is not a []float32. +func (v *Value) Float32Slice(optionalDefault ...[]float32) []float32 { + if s, ok := v.data.([]float32); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustFloat32Slice gets the value as a []float32. +// +// Panics if the object is not a []float32. +func (v *Value) MustFloat32Slice() []float32 { + return v.data.([]float32) +} + +// IsFloat32 gets whether the object contained is a float32 or not. +func (v *Value) IsFloat32() bool { + _, ok := v.data.(float32) + return ok +} + +// IsFloat32Slice gets whether the object contained is a []float32 or not. +func (v *Value) IsFloat32Slice() bool { + _, ok := v.data.([]float32) + return ok +} + +// EachFloat32 calls the specified callback for each object +// in the []float32. +// +// Panics if the object is the wrong type. +func (v *Value) EachFloat32(callback func(int, float32) bool) *Value { + for index, val := range v.MustFloat32Slice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereFloat32 uses the specified decider function to select items +// from the []float32. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereFloat32(decider func(int, float32) bool) *Value { + var selected []float32 + v.EachFloat32(func(index int, val float32) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupFloat32 uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]float32. +func (v *Value) GroupFloat32(grouper func(int, float32) string) *Value { + groups := make(map[string][]float32) + v.EachFloat32(func(index int, val float32) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]float32, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceFloat32 uses the specified function to replace each float32s +// by iterating each item. The data in the returned result will be a +// []float32 containing the replaced items. +func (v *Value) ReplaceFloat32(replacer func(int, float32) float32) *Value { + arr := v.MustFloat32Slice() + replaced := make([]float32, len(arr)) + v.EachFloat32(func(index int, val float32) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectFloat32 uses the specified collector function to collect a value +// for each of the float32s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectFloat32(collector func(int, float32) interface{}) *Value { + arr := v.MustFloat32Slice() + collected := make([]interface{}, len(arr)) + v.EachFloat32(func(index int, val float32) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Float64 (float64 and []float64) +*/ + +// Float64 gets the value as a float64, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Float64(optionalDefault ...float64) float64 { + if s, ok := v.data.(float64); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustFloat64 gets the value as a float64. +// +// Panics if the object is not a float64. +func (v *Value) MustFloat64() float64 { + return v.data.(float64) +} + +// Float64Slice gets the value as a []float64, returns the optionalDefault +// value or nil if the value is not a []float64. +func (v *Value) Float64Slice(optionalDefault ...[]float64) []float64 { + if s, ok := v.data.([]float64); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustFloat64Slice gets the value as a []float64. +// +// Panics if the object is not a []float64. +func (v *Value) MustFloat64Slice() []float64 { + return v.data.([]float64) +} + +// IsFloat64 gets whether the object contained is a float64 or not. +func (v *Value) IsFloat64() bool { + _, ok := v.data.(float64) + return ok +} + +// IsFloat64Slice gets whether the object contained is a []float64 or not. +func (v *Value) IsFloat64Slice() bool { + _, ok := v.data.([]float64) + return ok +} + +// EachFloat64 calls the specified callback for each object +// in the []float64. +// +// Panics if the object is the wrong type. +func (v *Value) EachFloat64(callback func(int, float64) bool) *Value { + for index, val := range v.MustFloat64Slice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereFloat64 uses the specified decider function to select items +// from the []float64. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereFloat64(decider func(int, float64) bool) *Value { + var selected []float64 + v.EachFloat64(func(index int, val float64) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupFloat64 uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]float64. +func (v *Value) GroupFloat64(grouper func(int, float64) string) *Value { + groups := make(map[string][]float64) + v.EachFloat64(func(index int, val float64) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]float64, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceFloat64 uses the specified function to replace each float64s +// by iterating each item. The data in the returned result will be a +// []float64 containing the replaced items. +func (v *Value) ReplaceFloat64(replacer func(int, float64) float64) *Value { + arr := v.MustFloat64Slice() + replaced := make([]float64, len(arr)) + v.EachFloat64(func(index int, val float64) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectFloat64 uses the specified collector function to collect a value +// for each of the float64s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectFloat64(collector func(int, float64) interface{}) *Value { + arr := v.MustFloat64Slice() + collected := make([]interface{}, len(arr)) + v.EachFloat64(func(index int, val float64) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Complex64 (complex64 and []complex64) +*/ + +// Complex64 gets the value as a complex64, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Complex64(optionalDefault ...complex64) complex64 { + if s, ok := v.data.(complex64); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustComplex64 gets the value as a complex64. +// +// Panics if the object is not a complex64. +func (v *Value) MustComplex64() complex64 { + return v.data.(complex64) +} + +// Complex64Slice gets the value as a []complex64, returns the optionalDefault +// value or nil if the value is not a []complex64. +func (v *Value) Complex64Slice(optionalDefault ...[]complex64) []complex64 { + if s, ok := v.data.([]complex64); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustComplex64Slice gets the value as a []complex64. +// +// Panics if the object is not a []complex64. +func (v *Value) MustComplex64Slice() []complex64 { + return v.data.([]complex64) +} + +// IsComplex64 gets whether the object contained is a complex64 or not. +func (v *Value) IsComplex64() bool { + _, ok := v.data.(complex64) + return ok +} + +// IsComplex64Slice gets whether the object contained is a []complex64 or not. +func (v *Value) IsComplex64Slice() bool { + _, ok := v.data.([]complex64) + return ok +} + +// EachComplex64 calls the specified callback for each object +// in the []complex64. +// +// Panics if the object is the wrong type. +func (v *Value) EachComplex64(callback func(int, complex64) bool) *Value { + for index, val := range v.MustComplex64Slice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereComplex64 uses the specified decider function to select items +// from the []complex64. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereComplex64(decider func(int, complex64) bool) *Value { + var selected []complex64 + v.EachComplex64(func(index int, val complex64) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupComplex64 uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]complex64. +func (v *Value) GroupComplex64(grouper func(int, complex64) string) *Value { + groups := make(map[string][]complex64) + v.EachComplex64(func(index int, val complex64) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]complex64, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceComplex64 uses the specified function to replace each complex64s +// by iterating each item. The data in the returned result will be a +// []complex64 containing the replaced items. +func (v *Value) ReplaceComplex64(replacer func(int, complex64) complex64) *Value { + arr := v.MustComplex64Slice() + replaced := make([]complex64, len(arr)) + v.EachComplex64(func(index int, val complex64) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectComplex64 uses the specified collector function to collect a value +// for each of the complex64s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectComplex64(collector func(int, complex64) interface{}) *Value { + arr := v.MustComplex64Slice() + collected := make([]interface{}, len(arr)) + v.EachComplex64(func(index int, val complex64) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Complex128 (complex128 and []complex128) +*/ + +// Complex128 gets the value as a complex128, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Complex128(optionalDefault ...complex128) complex128 { + if s, ok := v.data.(complex128); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustComplex128 gets the value as a complex128. +// +// Panics if the object is not a complex128. +func (v *Value) MustComplex128() complex128 { + return v.data.(complex128) +} + +// Complex128Slice gets the value as a []complex128, returns the optionalDefault +// value or nil if the value is not a []complex128. +func (v *Value) Complex128Slice(optionalDefault ...[]complex128) []complex128 { + if s, ok := v.data.([]complex128); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustComplex128Slice gets the value as a []complex128. +// +// Panics if the object is not a []complex128. +func (v *Value) MustComplex128Slice() []complex128 { + return v.data.([]complex128) +} + +// IsComplex128 gets whether the object contained is a complex128 or not. +func (v *Value) IsComplex128() bool { + _, ok := v.data.(complex128) + return ok +} + +// IsComplex128Slice gets whether the object contained is a []complex128 or not. +func (v *Value) IsComplex128Slice() bool { + _, ok := v.data.([]complex128) + return ok +} + +// EachComplex128 calls the specified callback for each object +// in the []complex128. +// +// Panics if the object is the wrong type. +func (v *Value) EachComplex128(callback func(int, complex128) bool) *Value { + for index, val := range v.MustComplex128Slice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereComplex128 uses the specified decider function to select items +// from the []complex128. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereComplex128(decider func(int, complex128) bool) *Value { + var selected []complex128 + v.EachComplex128(func(index int, val complex128) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupComplex128 uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]complex128. +func (v *Value) GroupComplex128(grouper func(int, complex128) string) *Value { + groups := make(map[string][]complex128) + v.EachComplex128(func(index int, val complex128) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]complex128, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceComplex128 uses the specified function to replace each complex128s +// by iterating each item. The data in the returned result will be a +// []complex128 containing the replaced items. +func (v *Value) ReplaceComplex128(replacer func(int, complex128) complex128) *Value { + arr := v.MustComplex128Slice() + replaced := make([]complex128, len(arr)) + v.EachComplex128(func(index int, val complex128) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectComplex128 uses the specified collector function to collect a value +// for each of the complex128s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectComplex128(collector func(int, complex128) interface{}) *Value { + arr := v.MustComplex128Slice() + collected := make([]interface{}, len(arr)) + v.EachComplex128(func(index int, val complex128) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} diff --git a/api/vendor/github.com/stretchr/objx/type_specific_codegen_test.go b/api/vendor/github.com/stretchr/objx/type_specific_codegen_test.go new file mode 100644 index 0000000..c79c7e0 --- /dev/null +++ b/api/vendor/github.com/stretchr/objx/type_specific_codegen_test.go @@ -0,0 +1,2448 @@ +package objx + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/assert" +) + +/* + Tests for Inter (interface{} and []interface{}) +*/ + +func TestInter(t *testing.T) { + val := interface{}("something") + + m := map[string]interface{}{"value": val, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").Inter()) + assert.Equal(t, val, New(m).Get("value").MustInter()) + assert.Equal(t, interface{}(nil), New(m).Get("nothing").Inter()) + assert.Equal(t, val, New(m).Get("nothing").Inter("something")) + assert.Panics(t, func() { + New(m).Get("age").MustInter() + }) +} + +func TestInterSlice(t *testing.T) { + val := interface{}("something") + + m := map[string]interface{}{"value": []interface{}{val}, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").InterSlice()[0]) + assert.Equal(t, val, New(m).Get("value").MustInterSlice()[0]) + assert.Equal(t, []interface{}(nil), New(m).Get("nothing").InterSlice()) + assert.Equal(t, val, New(m).Get("nothing").InterSlice([]interface{}{interface{}("something")})[0]) + assert.Panics(t, func() { + New(m).Get("nothing").MustInterSlice() + }) +} + +func TestIsInter(t *testing.T) { + v := &Value{data: interface{}("something")} + assert.True(t, v.IsInter()) + +} + +func TestIsInterSlice(t *testing.T) { + v := &Value{data: []interface{}{interface{}("something")}} + assert.True(t, v.IsInterSlice()) +} + +func TestEachInter(t *testing.T) { + v := &Value{data: []interface{}{interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something")}} + count := 0 + replacedVals := make([]interface{}, 0) + assert.Equal(t, v, v.EachInter(func(i int, val interface{}) bool { + count++ + replacedVals = append(replacedVals, val) + + // abort early + return i != 2 + })) + + assert.Equal(t, count, 3) + assert.Equal(t, replacedVals[0], v.MustInterSlice()[0]) + assert.Equal(t, replacedVals[1], v.MustInterSlice()[1]) + assert.Equal(t, replacedVals[2], v.MustInterSlice()[2]) +} + +func TestWhereInter(t *testing.T) { + v := &Value{data: []interface{}{interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something")}} + + selected := v.WhereInter(func(i int, val interface{}) bool { + return i%2 == 0 + }).MustInterSlice() + + assert.Equal(t, 3, len(selected)) +} + +func TestGroupInter(t *testing.T) { + v := &Value{data: []interface{}{interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something")}} + + grouped := v.GroupInter(func(i int, val interface{}) string { + return fmt.Sprintf("%v", i%2 == 0) + }).data.(map[string][]interface{}) + + assert.Equal(t, 2, len(grouped)) + assert.Equal(t, 3, len(grouped["true"])) + assert.Equal(t, 3, len(grouped["false"])) +} + +func TestReplaceInter(t *testing.T) { + v := &Value{data: []interface{}{interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something")}} + + rawArr := v.MustInterSlice() + + replaced := v.ReplaceInter(func(index int, val interface{}) interface{} { + if index < len(rawArr)-1 { + return rawArr[index+1] + } + return rawArr[0] + }) + + replacedArr := replaced.MustInterSlice() + if assert.Equal(t, 6, len(replacedArr)) { + assert.Equal(t, replacedArr[0], rawArr[1]) + assert.Equal(t, replacedArr[1], rawArr[2]) + assert.Equal(t, replacedArr[2], rawArr[3]) + assert.Equal(t, replacedArr[3], rawArr[4]) + assert.Equal(t, replacedArr[4], rawArr[5]) + assert.Equal(t, replacedArr[5], rawArr[0]) + } +} + +func TestCollectInter(t *testing.T) { + v := &Value{data: []interface{}{interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something")}} + + collected := v.CollectInter(func(index int, val interface{}) interface{} { + return index + }) + + collectedArr := collected.MustInterSlice() + if assert.Equal(t, 6, len(collectedArr)) { + assert.Equal(t, collectedArr[0], 0) + assert.Equal(t, collectedArr[1], 1) + assert.Equal(t, collectedArr[2], 2) + assert.Equal(t, collectedArr[3], 3) + assert.Equal(t, collectedArr[4], 4) + assert.Equal(t, collectedArr[5], 5) + } +} + +/* + Tests for MSI (map[string]interface{} and []map[string]interface{}) +*/ + +func TestMSI(t *testing.T) { + val := map[string]interface{}(map[string]interface{}{"name": "Tyler"}) + + m := map[string]interface{}{"value": val, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").MSI()) + assert.Equal(t, val, New(m).Get("value").MustMSI()) + assert.Equal(t, map[string]interface{}(nil), New(m).Get("nothing").MSI()) + assert.Equal(t, val, New(m).Get("nothing").MSI(map[string]interface{}{"name": "Tyler"})) + assert.Panics(t, func() { + New(m).Get("age").MustMSI() + }) +} + +func TestMSISlice(t *testing.T) { + val := map[string]interface{}(map[string]interface{}{"name": "Tyler"}) + + m := map[string]interface{}{"value": []map[string]interface{}{val}, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").MSISlice()[0]) + assert.Equal(t, val, New(m).Get("value").MustMSISlice()[0]) + assert.Equal(t, []map[string]interface{}(nil), New(m).Get("nothing").MSISlice()) + assert.Equal(t, val, New(m).Get("nothing").MSISlice([]map[string]interface{}{map[string]interface{}(map[string]interface{}{"name": "Tyler"})})[0]) + assert.Panics(t, func() { + New(m).Get("nothing").MustMSISlice() + }) +} + +func TestIsMSI(t *testing.T) { + v := &Value{data: map[string]interface{}(map[string]interface{}{"name": "Tyler"})} + assert.True(t, v.IsMSI()) + +} + +func TestIsMSISlice(t *testing.T) { + v := &Value{data: []map[string]interface{}{map[string]interface{}(map[string]interface{}{"name": "Tyler"})}} + assert.True(t, v.IsMSISlice()) +} + +func TestEachMSI(t *testing.T) { + v := &Value{data: []map[string]interface{}{map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"})}} + count := 0 + replacedVals := make([]map[string]interface{}, 0) + assert.Equal(t, v, v.EachMSI(func(i int, val map[string]interface{}) bool { + count++ + replacedVals = append(replacedVals, val) + + // abort early + return i != 2 + })) + + assert.Equal(t, count, 3) + assert.Equal(t, replacedVals[0], v.MustMSISlice()[0]) + assert.Equal(t, replacedVals[1], v.MustMSISlice()[1]) + assert.Equal(t, replacedVals[2], v.MustMSISlice()[2]) +} + +func TestWhereMSI(t *testing.T) { + v := &Value{data: []map[string]interface{}{map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"})}} + + selected := v.WhereMSI(func(i int, val map[string]interface{}) bool { + return i%2 == 0 + }).MustMSISlice() + + assert.Equal(t, 3, len(selected)) +} + +func TestGroupMSI(t *testing.T) { + v := &Value{data: []map[string]interface{}{map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"})}} + + grouped := v.GroupMSI(func(i int, val map[string]interface{}) string { + return fmt.Sprintf("%v", i%2 == 0) + }).data.(map[string][]map[string]interface{}) + + assert.Equal(t, 2, len(grouped)) + assert.Equal(t, 3, len(grouped["true"])) + assert.Equal(t, 3, len(grouped["false"])) +} + +func TestReplaceMSI(t *testing.T) { + v := &Value{data: []map[string]interface{}{map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"})}} + + rawArr := v.MustMSISlice() + + replaced := v.ReplaceMSI(func(index int, val map[string]interface{}) map[string]interface{} { + if index < len(rawArr)-1 { + return rawArr[index+1] + } + return rawArr[0] + }) + + replacedArr := replaced.MustMSISlice() + if assert.Equal(t, 6, len(replacedArr)) { + assert.Equal(t, replacedArr[0], rawArr[1]) + assert.Equal(t, replacedArr[1], rawArr[2]) + assert.Equal(t, replacedArr[2], rawArr[3]) + assert.Equal(t, replacedArr[3], rawArr[4]) + assert.Equal(t, replacedArr[4], rawArr[5]) + assert.Equal(t, replacedArr[5], rawArr[0]) + } +} + +func TestCollectMSI(t *testing.T) { + v := &Value{data: []map[string]interface{}{map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"})}} + + collected := v.CollectMSI(func(index int, val map[string]interface{}) interface{} { + return index + }) + + collectedArr := collected.MustInterSlice() + if assert.Equal(t, 6, len(collectedArr)) { + assert.Equal(t, collectedArr[0], 0) + assert.Equal(t, collectedArr[1], 1) + assert.Equal(t, collectedArr[2], 2) + assert.Equal(t, collectedArr[3], 3) + assert.Equal(t, collectedArr[4], 4) + assert.Equal(t, collectedArr[5], 5) + } +} + +/* + Tests for ObjxMap ((Map) and [](Map)) +*/ + +func TestObjxMap(t *testing.T) { + val := (Map)(New(1)) + + m := map[string]interface{}{"value": val, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").ObjxMap()) + assert.Equal(t, val, New(m).Get("value").MustObjxMap()) + assert.Equal(t, (Map)(New(nil)), New(m).Get("nothing").ObjxMap()) + assert.Equal(t, val, New(m).Get("nothing").ObjxMap(New(1))) + assert.Panics(t, func() { + New(m).Get("age").MustObjxMap() + }) +} + +func TestObjxMapSlice(t *testing.T) { + val := (Map)(New(1)) + + m := map[string]interface{}{"value": [](Map){val}, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").ObjxMapSlice()[0]) + assert.Equal(t, val, New(m).Get("value").MustObjxMapSlice()[0]) + assert.Equal(t, [](Map)(nil), New(m).Get("nothing").ObjxMapSlice()) + assert.Equal(t, val, New(m).Get("nothing").ObjxMapSlice([](Map){(Map)(New(1))})[0]) + assert.Panics(t, func() { + New(m).Get("nothing").MustObjxMapSlice() + }) +} + +func TestIsObjxMap(t *testing.T) { + v := &Value{data: (Map)(New(1))} + assert.True(t, v.IsObjxMap()) + +} + +func TestIsObjxMapSlice(t *testing.T) { + v := &Value{data: [](Map){(Map)(New(1))}} + assert.True(t, v.IsObjxMapSlice()) +} + +func TestEachObjxMap(t *testing.T) { + v := &Value{data: [](Map){(Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1))}} + count := 0 + replacedVals := make([](Map), 0) + assert.Equal(t, v, v.EachObjxMap(func(i int, val Map) bool { + count++ + replacedVals = append(replacedVals, val) + + // abort early + return i != 2 + })) + + assert.Equal(t, count, 3) + assert.Equal(t, replacedVals[0], v.MustObjxMapSlice()[0]) + assert.Equal(t, replacedVals[1], v.MustObjxMapSlice()[1]) + assert.Equal(t, replacedVals[2], v.MustObjxMapSlice()[2]) +} + +func TestWhereObjxMap(t *testing.T) { + v := &Value{data: [](Map){(Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1))}} + + selected := v.WhereObjxMap(func(i int, val Map) bool { + return i%2 == 0 + }).MustObjxMapSlice() + + assert.Equal(t, 3, len(selected)) +} + +func TestGroupObjxMap(t *testing.T) { + v := &Value{data: [](Map){(Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1))}} + + grouped := v.GroupObjxMap(func(i int, val Map) string { + return fmt.Sprintf("%v", i%2 == 0) + }).data.(map[string][](Map)) + + assert.Equal(t, 2, len(grouped)) + assert.Equal(t, 3, len(grouped["true"])) + assert.Equal(t, 3, len(grouped["false"])) +} + +func TestReplaceObjxMap(t *testing.T) { + v := &Value{data: [](Map){(Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1))}} + + rawArr := v.MustObjxMapSlice() + + replaced := v.ReplaceObjxMap(func(index int, val Map) Map { + if index < len(rawArr)-1 { + return rawArr[index+1] + } + return rawArr[0] + }) + + replacedArr := replaced.MustObjxMapSlice() + if assert.Equal(t, 6, len(replacedArr)) { + assert.Equal(t, replacedArr[0], rawArr[1]) + assert.Equal(t, replacedArr[1], rawArr[2]) + assert.Equal(t, replacedArr[2], rawArr[3]) + assert.Equal(t, replacedArr[3], rawArr[4]) + assert.Equal(t, replacedArr[4], rawArr[5]) + assert.Equal(t, replacedArr[5], rawArr[0]) + } +} + +func TestCollectObjxMap(t *testing.T) { + v := &Value{data: [](Map){(Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1))}} + + collected := v.CollectObjxMap(func(index int, val Map) interface{} { + return index + }) + + collectedArr := collected.MustInterSlice() + if assert.Equal(t, 6, len(collectedArr)) { + assert.Equal(t, collectedArr[0], 0) + assert.Equal(t, collectedArr[1], 1) + assert.Equal(t, collectedArr[2], 2) + assert.Equal(t, collectedArr[3], 3) + assert.Equal(t, collectedArr[4], 4) + assert.Equal(t, collectedArr[5], 5) + } +} + +/* + Tests for Bool (bool and []bool) +*/ + +func TestBool(t *testing.T) { + val := bool(true) + + m := map[string]interface{}{"value": val, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").Bool()) + assert.Equal(t, val, New(m).Get("value").MustBool()) + assert.Equal(t, bool(false), New(m).Get("nothing").Bool()) + assert.Equal(t, val, New(m).Get("nothing").Bool(true)) + assert.Panics(t, func() { + New(m).Get("age").MustBool() + }) +} + +func TestBoolSlice(t *testing.T) { + val := bool(true) + + m := map[string]interface{}{"value": []bool{val}, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").BoolSlice()[0]) + assert.Equal(t, val, New(m).Get("value").MustBoolSlice()[0]) + assert.Equal(t, []bool(nil), New(m).Get("nothing").BoolSlice()) + assert.Equal(t, val, New(m).Get("nothing").BoolSlice([]bool{bool(true)})[0]) + assert.Panics(t, func() { + New(m).Get("nothing").MustBoolSlice() + }) +} + +func TestIsBool(t *testing.T) { + v := &Value{data: bool(true)} + assert.True(t, v.IsBool()) + +} + +func TestIsBoolSlice(t *testing.T) { + v := &Value{data: []bool{bool(true)}} + assert.True(t, v.IsBoolSlice()) +} + +func TestEachBool(t *testing.T) { + v := &Value{data: []bool{bool(true), bool(true), bool(true), bool(true), bool(true)}} + count := 0 + replacedVals := make([]bool, 0) + assert.Equal(t, v, v.EachBool(func(i int, val bool) bool { + count++ + replacedVals = append(replacedVals, val) + + // abort early + return i != 2 + })) + + assert.Equal(t, count, 3) + assert.Equal(t, replacedVals[0], v.MustBoolSlice()[0]) + assert.Equal(t, replacedVals[1], v.MustBoolSlice()[1]) + assert.Equal(t, replacedVals[2], v.MustBoolSlice()[2]) +} + +func TestWhereBool(t *testing.T) { + v := &Value{data: []bool{bool(true), bool(true), bool(true), bool(true), bool(true), bool(true)}} + + selected := v.WhereBool(func(i int, val bool) bool { + return i%2 == 0 + }).MustBoolSlice() + + assert.Equal(t, 3, len(selected)) +} + +func TestGroupBool(t *testing.T) { + v := &Value{data: []bool{bool(true), bool(true), bool(true), bool(true), bool(true), bool(true)}} + + grouped := v.GroupBool(func(i int, val bool) string { + return fmt.Sprintf("%v", i%2 == 0) + }).data.(map[string][]bool) + + assert.Equal(t, 2, len(grouped)) + assert.Equal(t, 3, len(grouped["true"])) + assert.Equal(t, 3, len(grouped["false"])) +} + +func TestReplaceBool(t *testing.T) { + v := &Value{data: []bool{bool(true), bool(true), bool(true), bool(true), bool(true), bool(true)}} + + rawArr := v.MustBoolSlice() + + replaced := v.ReplaceBool(func(index int, val bool) bool { + if index < len(rawArr)-1 { + return rawArr[index+1] + } + return rawArr[0] + }) + + replacedArr := replaced.MustBoolSlice() + if assert.Equal(t, 6, len(replacedArr)) { + assert.Equal(t, replacedArr[0], rawArr[1]) + assert.Equal(t, replacedArr[1], rawArr[2]) + assert.Equal(t, replacedArr[2], rawArr[3]) + assert.Equal(t, replacedArr[3], rawArr[4]) + assert.Equal(t, replacedArr[4], rawArr[5]) + assert.Equal(t, replacedArr[5], rawArr[0]) + } +} + +func TestCollectBool(t *testing.T) { + v := &Value{data: []bool{bool(true), bool(true), bool(true), bool(true), bool(true), bool(true)}} + + collected := v.CollectBool(func(index int, val bool) interface{} { + return index + }) + + collectedArr := collected.MustInterSlice() + if assert.Equal(t, 6, len(collectedArr)) { + assert.Equal(t, collectedArr[0], 0) + assert.Equal(t, collectedArr[1], 1) + assert.Equal(t, collectedArr[2], 2) + assert.Equal(t, collectedArr[3], 3) + assert.Equal(t, collectedArr[4], 4) + assert.Equal(t, collectedArr[5], 5) + } +} + +/* + Tests for Str (string and []string) +*/ + +func TestStr(t *testing.T) { + val := string("hello") + + m := map[string]interface{}{"value": val, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").Str()) + assert.Equal(t, val, New(m).Get("value").MustStr()) + assert.Equal(t, string(""), New(m).Get("nothing").Str()) + assert.Equal(t, val, New(m).Get("nothing").Str("hello")) + assert.Panics(t, func() { + New(m).Get("age").MustStr() + }) +} + +func TestStrSlice(t *testing.T) { + val := string("hello") + + m := map[string]interface{}{"value": []string{val}, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").StrSlice()[0]) + assert.Equal(t, val, New(m).Get("value").MustStrSlice()[0]) + assert.Equal(t, []string(nil), New(m).Get("nothing").StrSlice()) + assert.Equal(t, val, New(m).Get("nothing").StrSlice([]string{string("hello")})[0]) + assert.Panics(t, func() { + New(m).Get("nothing").MustStrSlice() + }) +} + +func TestIsStr(t *testing.T) { + v := &Value{data: string("hello")} + assert.True(t, v.IsStr()) + +} + +func TestIsStrSlice(t *testing.T) { + v := &Value{data: []string{string("hello")}} + assert.True(t, v.IsStrSlice()) +} + +func TestEachStr(t *testing.T) { + v := &Value{data: []string{string("hello"), string("hello"), string("hello"), string("hello"), string("hello")}} + count := 0 + replacedVals := make([]string, 0) + assert.Equal(t, v, v.EachStr(func(i int, val string) bool { + count++ + replacedVals = append(replacedVals, val) + + // abort early + return i != 2 + })) + + assert.Equal(t, count, 3) + assert.Equal(t, replacedVals[0], v.MustStrSlice()[0]) + assert.Equal(t, replacedVals[1], v.MustStrSlice()[1]) + assert.Equal(t, replacedVals[2], v.MustStrSlice()[2]) +} + +func TestWhereStr(t *testing.T) { + v := &Value{data: []string{string("hello"), string("hello"), string("hello"), string("hello"), string("hello"), string("hello")}} + + selected := v.WhereStr(func(i int, val string) bool { + return i%2 == 0 + }).MustStrSlice() + + assert.Equal(t, 3, len(selected)) +} + +func TestGroupStr(t *testing.T) { + v := &Value{data: []string{string("hello"), string("hello"), string("hello"), string("hello"), string("hello"), string("hello")}} + + grouped := v.GroupStr(func(i int, val string) string { + return fmt.Sprintf("%v", i%2 == 0) + }).data.(map[string][]string) + + assert.Equal(t, 2, len(grouped)) + assert.Equal(t, 3, len(grouped["true"])) + assert.Equal(t, 3, len(grouped["false"])) +} + +func TestReplaceStr(t *testing.T) { + v := &Value{data: []string{string("hello"), string("hello"), string("hello"), string("hello"), string("hello"), string("hello")}} + + rawArr := v.MustStrSlice() + + replaced := v.ReplaceStr(func(index int, val string) string { + if index < len(rawArr)-1 { + return rawArr[index+1] + } + return rawArr[0] + }) + + replacedArr := replaced.MustStrSlice() + if assert.Equal(t, 6, len(replacedArr)) { + assert.Equal(t, replacedArr[0], rawArr[1]) + assert.Equal(t, replacedArr[1], rawArr[2]) + assert.Equal(t, replacedArr[2], rawArr[3]) + assert.Equal(t, replacedArr[3], rawArr[4]) + assert.Equal(t, replacedArr[4], rawArr[5]) + assert.Equal(t, replacedArr[5], rawArr[0]) + } +} + +func TestCollectStr(t *testing.T) { + v := &Value{data: []string{string("hello"), string("hello"), string("hello"), string("hello"), string("hello"), string("hello")}} + + collected := v.CollectStr(func(index int, val string) interface{} { + return index + }) + + collectedArr := collected.MustInterSlice() + if assert.Equal(t, 6, len(collectedArr)) { + assert.Equal(t, collectedArr[0], 0) + assert.Equal(t, collectedArr[1], 1) + assert.Equal(t, collectedArr[2], 2) + assert.Equal(t, collectedArr[3], 3) + assert.Equal(t, collectedArr[4], 4) + assert.Equal(t, collectedArr[5], 5) + } +} + +/* + Tests for Int (int and []int) +*/ + +func TestInt(t *testing.T) { + val := int(1) + + m := map[string]interface{}{"value": val, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").Int()) + assert.Equal(t, val, New(m).Get("value").MustInt()) + assert.Equal(t, int(0), New(m).Get("nothing").Int()) + assert.Equal(t, val, New(m).Get("nothing").Int(1)) + assert.Panics(t, func() { + New(m).Get("age").MustInt() + }) +} + +func TestIntSlice(t *testing.T) { + val := int(1) + + m := map[string]interface{}{"value": []int{val}, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").IntSlice()[0]) + assert.Equal(t, val, New(m).Get("value").MustIntSlice()[0]) + assert.Equal(t, []int(nil), New(m).Get("nothing").IntSlice()) + assert.Equal(t, val, New(m).Get("nothing").IntSlice([]int{int(1)})[0]) + assert.Panics(t, func() { + New(m).Get("nothing").MustIntSlice() + }) +} + +func TestIsInt(t *testing.T) { + v := &Value{data: int(1)} + assert.True(t, v.IsInt()) + +} + +func TestIsIntSlice(t *testing.T) { + v := &Value{data: []int{int(1)}} + assert.True(t, v.IsIntSlice()) +} + +func TestEachInt(t *testing.T) { + v := &Value{data: []int{int(1), int(1), int(1), int(1), int(1)}} + count := 0 + replacedVals := make([]int, 0) + assert.Equal(t, v, v.EachInt(func(i int, val int) bool { + count++ + replacedVals = append(replacedVals, val) + + // abort early + return i != 2 + })) + + assert.Equal(t, count, 3) + assert.Equal(t, replacedVals[0], v.MustIntSlice()[0]) + assert.Equal(t, replacedVals[1], v.MustIntSlice()[1]) + assert.Equal(t, replacedVals[2], v.MustIntSlice()[2]) +} + +func TestWhereInt(t *testing.T) { + v := &Value{data: []int{int(1), int(1), int(1), int(1), int(1), int(1)}} + + selected := v.WhereInt(func(i int, val int) bool { + return i%2 == 0 + }).MustIntSlice() + + assert.Equal(t, 3, len(selected)) +} + +func TestGroupInt(t *testing.T) { + v := &Value{data: []int{int(1), int(1), int(1), int(1), int(1), int(1)}} + + grouped := v.GroupInt(func(i int, val int) string { + return fmt.Sprintf("%v", i%2 == 0) + }).data.(map[string][]int) + + assert.Equal(t, 2, len(grouped)) + assert.Equal(t, 3, len(grouped["true"])) + assert.Equal(t, 3, len(grouped["false"])) +} + +func TestReplaceInt(t *testing.T) { + v := &Value{data: []int{int(1), int(1), int(1), int(1), int(1), int(1)}} + + rawArr := v.MustIntSlice() + + replaced := v.ReplaceInt(func(index int, val int) int { + if index < len(rawArr)-1 { + return rawArr[index+1] + } + return rawArr[0] + }) + + replacedArr := replaced.MustIntSlice() + if assert.Equal(t, 6, len(replacedArr)) { + assert.Equal(t, replacedArr[0], rawArr[1]) + assert.Equal(t, replacedArr[1], rawArr[2]) + assert.Equal(t, replacedArr[2], rawArr[3]) + assert.Equal(t, replacedArr[3], rawArr[4]) + assert.Equal(t, replacedArr[4], rawArr[5]) + assert.Equal(t, replacedArr[5], rawArr[0]) + } +} + +func TestCollectInt(t *testing.T) { + v := &Value{data: []int{int(1), int(1), int(1), int(1), int(1), int(1)}} + + collected := v.CollectInt(func(index int, val int) interface{} { + return index + }) + + collectedArr := collected.MustInterSlice() + if assert.Equal(t, 6, len(collectedArr)) { + assert.Equal(t, collectedArr[0], 0) + assert.Equal(t, collectedArr[1], 1) + assert.Equal(t, collectedArr[2], 2) + assert.Equal(t, collectedArr[3], 3) + assert.Equal(t, collectedArr[4], 4) + assert.Equal(t, collectedArr[5], 5) + } +} + +/* + Tests for Int8 (int8 and []int8) +*/ + +func TestInt8(t *testing.T) { + val := int8(1) + + m := map[string]interface{}{"value": val, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").Int8()) + assert.Equal(t, val, New(m).Get("value").MustInt8()) + assert.Equal(t, int8(0), New(m).Get("nothing").Int8()) + assert.Equal(t, val, New(m).Get("nothing").Int8(1)) + assert.Panics(t, func() { + New(m).Get("age").MustInt8() + }) +} + +func TestInt8Slice(t *testing.T) { + val := int8(1) + + m := map[string]interface{}{"value": []int8{val}, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").Int8Slice()[0]) + assert.Equal(t, val, New(m).Get("value").MustInt8Slice()[0]) + assert.Equal(t, []int8(nil), New(m).Get("nothing").Int8Slice()) + assert.Equal(t, val, New(m).Get("nothing").Int8Slice([]int8{int8(1)})[0]) + assert.Panics(t, func() { + New(m).Get("nothing").MustInt8Slice() + }) +} + +func TestIsInt8(t *testing.T) { + v := &Value{data: int8(1)} + assert.True(t, v.IsInt8()) + +} + +func TestIsInt8Slice(t *testing.T) { + v := &Value{data: []int8{int8(1)}} + assert.True(t, v.IsInt8Slice()) +} + +func TestEachInt8(t *testing.T) { + v := &Value{data: []int8{int8(1), int8(1), int8(1), int8(1), int8(1)}} + count := 0 + replacedVals := make([]int8, 0) + assert.Equal(t, v, v.EachInt8(func(i int, val int8) bool { + count++ + replacedVals = append(replacedVals, val) + + // abort early + return i != 2 + })) + + assert.Equal(t, count, 3) + assert.Equal(t, replacedVals[0], v.MustInt8Slice()[0]) + assert.Equal(t, replacedVals[1], v.MustInt8Slice()[1]) + assert.Equal(t, replacedVals[2], v.MustInt8Slice()[2]) +} + +func TestWhereInt8(t *testing.T) { + v := &Value{data: []int8{int8(1), int8(1), int8(1), int8(1), int8(1), int8(1)}} + + selected := v.WhereInt8(func(i int, val int8) bool { + return i%2 == 0 + }).MustInt8Slice() + + assert.Equal(t, 3, len(selected)) +} + +func TestGroupInt8(t *testing.T) { + v := &Value{data: []int8{int8(1), int8(1), int8(1), int8(1), int8(1), int8(1)}} + + grouped := v.GroupInt8(func(i int, val int8) string { + return fmt.Sprintf("%v", i%2 == 0) + }).data.(map[string][]int8) + + assert.Equal(t, 2, len(grouped)) + assert.Equal(t, 3, len(grouped["true"])) + assert.Equal(t, 3, len(grouped["false"])) +} + +func TestReplaceInt8(t *testing.T) { + v := &Value{data: []int8{int8(1), int8(1), int8(1), int8(1), int8(1), int8(1)}} + + rawArr := v.MustInt8Slice() + + replaced := v.ReplaceInt8(func(index int, val int8) int8 { + if index < len(rawArr)-1 { + return rawArr[index+1] + } + return rawArr[0] + }) + + replacedArr := replaced.MustInt8Slice() + if assert.Equal(t, 6, len(replacedArr)) { + assert.Equal(t, replacedArr[0], rawArr[1]) + assert.Equal(t, replacedArr[1], rawArr[2]) + assert.Equal(t, replacedArr[2], rawArr[3]) + assert.Equal(t, replacedArr[3], rawArr[4]) + assert.Equal(t, replacedArr[4], rawArr[5]) + assert.Equal(t, replacedArr[5], rawArr[0]) + } +} + +func TestCollectInt8(t *testing.T) { + v := &Value{data: []int8{int8(1), int8(1), int8(1), int8(1), int8(1), int8(1)}} + + collected := v.CollectInt8(func(index int, val int8) interface{} { + return index + }) + + collectedArr := collected.MustInterSlice() + if assert.Equal(t, 6, len(collectedArr)) { + assert.Equal(t, collectedArr[0], 0) + assert.Equal(t, collectedArr[1], 1) + assert.Equal(t, collectedArr[2], 2) + assert.Equal(t, collectedArr[3], 3) + assert.Equal(t, collectedArr[4], 4) + assert.Equal(t, collectedArr[5], 5) + } +} + +/* + Tests for Int16 (int16 and []int16) +*/ + +func TestInt16(t *testing.T) { + val := int16(1) + + m := map[string]interface{}{"value": val, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").Int16()) + assert.Equal(t, val, New(m).Get("value").MustInt16()) + assert.Equal(t, int16(0), New(m).Get("nothing").Int16()) + assert.Equal(t, val, New(m).Get("nothing").Int16(1)) + assert.Panics(t, func() { + New(m).Get("age").MustInt16() + }) +} + +func TestInt16Slice(t *testing.T) { + val := int16(1) + + m := map[string]interface{}{"value": []int16{val}, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").Int16Slice()[0]) + assert.Equal(t, val, New(m).Get("value").MustInt16Slice()[0]) + assert.Equal(t, []int16(nil), New(m).Get("nothing").Int16Slice()) + assert.Equal(t, val, New(m).Get("nothing").Int16Slice([]int16{int16(1)})[0]) + assert.Panics(t, func() { + New(m).Get("nothing").MustInt16Slice() + }) +} + +func TestIsInt16(t *testing.T) { + v := &Value{data: int16(1)} + assert.True(t, v.IsInt16()) + +} + +func TestIsInt16Slice(t *testing.T) { + v := &Value{data: []int16{int16(1)}} + assert.True(t, v.IsInt16Slice()) +} + +func TestEachInt16(t *testing.T) { + v := &Value{data: []int16{int16(1), int16(1), int16(1), int16(1), int16(1)}} + count := 0 + replacedVals := make([]int16, 0) + assert.Equal(t, v, v.EachInt16(func(i int, val int16) bool { + count++ + replacedVals = append(replacedVals, val) + + // abort early + return i != 2 + })) + + assert.Equal(t, count, 3) + assert.Equal(t, replacedVals[0], v.MustInt16Slice()[0]) + assert.Equal(t, replacedVals[1], v.MustInt16Slice()[1]) + assert.Equal(t, replacedVals[2], v.MustInt16Slice()[2]) +} + +func TestWhereInt16(t *testing.T) { + v := &Value{data: []int16{int16(1), int16(1), int16(1), int16(1), int16(1), int16(1)}} + + selected := v.WhereInt16(func(i int, val int16) bool { + return i%2 == 0 + }).MustInt16Slice() + + assert.Equal(t, 3, len(selected)) +} + +func TestGroupInt16(t *testing.T) { + v := &Value{data: []int16{int16(1), int16(1), int16(1), int16(1), int16(1), int16(1)}} + + grouped := v.GroupInt16(func(i int, val int16) string { + return fmt.Sprintf("%v", i%2 == 0) + }).data.(map[string][]int16) + + assert.Equal(t, 2, len(grouped)) + assert.Equal(t, 3, len(grouped["true"])) + assert.Equal(t, 3, len(grouped["false"])) +} + +func TestReplaceInt16(t *testing.T) { + v := &Value{data: []int16{int16(1), int16(1), int16(1), int16(1), int16(1), int16(1)}} + + rawArr := v.MustInt16Slice() + + replaced := v.ReplaceInt16(func(index int, val int16) int16 { + if index < len(rawArr)-1 { + return rawArr[index+1] + } + return rawArr[0] + }) + + replacedArr := replaced.MustInt16Slice() + if assert.Equal(t, 6, len(replacedArr)) { + assert.Equal(t, replacedArr[0], rawArr[1]) + assert.Equal(t, replacedArr[1], rawArr[2]) + assert.Equal(t, replacedArr[2], rawArr[3]) + assert.Equal(t, replacedArr[3], rawArr[4]) + assert.Equal(t, replacedArr[4], rawArr[5]) + assert.Equal(t, replacedArr[5], rawArr[0]) + } +} + +func TestCollectInt16(t *testing.T) { + v := &Value{data: []int16{int16(1), int16(1), int16(1), int16(1), int16(1), int16(1)}} + + collected := v.CollectInt16(func(index int, val int16) interface{} { + return index + }) + + collectedArr := collected.MustInterSlice() + if assert.Equal(t, 6, len(collectedArr)) { + assert.Equal(t, collectedArr[0], 0) + assert.Equal(t, collectedArr[1], 1) + assert.Equal(t, collectedArr[2], 2) + assert.Equal(t, collectedArr[3], 3) + assert.Equal(t, collectedArr[4], 4) + assert.Equal(t, collectedArr[5], 5) + } +} + +/* + Tests for Int32 (int32 and []int32) +*/ + +func TestInt32(t *testing.T) { + val := int32(1) + + m := map[string]interface{}{"value": val, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").Int32()) + assert.Equal(t, val, New(m).Get("value").MustInt32()) + assert.Equal(t, int32(0), New(m).Get("nothing").Int32()) + assert.Equal(t, val, New(m).Get("nothing").Int32(1)) + assert.Panics(t, func() { + New(m).Get("age").MustInt32() + }) +} + +func TestInt32Slice(t *testing.T) { + val := int32(1) + + m := map[string]interface{}{"value": []int32{val}, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").Int32Slice()[0]) + assert.Equal(t, val, New(m).Get("value").MustInt32Slice()[0]) + assert.Equal(t, []int32(nil), New(m).Get("nothing").Int32Slice()) + assert.Equal(t, val, New(m).Get("nothing").Int32Slice([]int32{int32(1)})[0]) + assert.Panics(t, func() { + New(m).Get("nothing").MustInt32Slice() + }) +} + +func TestIsInt32(t *testing.T) { + v := &Value{data: int32(1)} + assert.True(t, v.IsInt32()) + +} + +func TestIsInt32Slice(t *testing.T) { + v := &Value{data: []int32{int32(1)}} + assert.True(t, v.IsInt32Slice()) +} + +func TestEachInt32(t *testing.T) { + v := &Value{data: []int32{int32(1), int32(1), int32(1), int32(1), int32(1)}} + count := 0 + replacedVals := make([]int32, 0) + assert.Equal(t, v, v.EachInt32(func(i int, val int32) bool { + count++ + replacedVals = append(replacedVals, val) + + // abort early + return i != 2 + })) + + assert.Equal(t, count, 3) + assert.Equal(t, replacedVals[0], v.MustInt32Slice()[0]) + assert.Equal(t, replacedVals[1], v.MustInt32Slice()[1]) + assert.Equal(t, replacedVals[2], v.MustInt32Slice()[2]) +} + +func TestWhereInt32(t *testing.T) { + v := &Value{data: []int32{int32(1), int32(1), int32(1), int32(1), int32(1), int32(1)}} + + selected := v.WhereInt32(func(i int, val int32) bool { + return i%2 == 0 + }).MustInt32Slice() + + assert.Equal(t, 3, len(selected)) +} + +func TestGroupInt32(t *testing.T) { + v := &Value{data: []int32{int32(1), int32(1), int32(1), int32(1), int32(1), int32(1)}} + + grouped := v.GroupInt32(func(i int, val int32) string { + return fmt.Sprintf("%v", i%2 == 0) + }).data.(map[string][]int32) + + assert.Equal(t, 2, len(grouped)) + assert.Equal(t, 3, len(grouped["true"])) + assert.Equal(t, 3, len(grouped["false"])) +} + +func TestReplaceInt32(t *testing.T) { + v := &Value{data: []int32{int32(1), int32(1), int32(1), int32(1), int32(1), int32(1)}} + + rawArr := v.MustInt32Slice() + + replaced := v.ReplaceInt32(func(index int, val int32) int32 { + if index < len(rawArr)-1 { + return rawArr[index+1] + } + return rawArr[0] + }) + + replacedArr := replaced.MustInt32Slice() + if assert.Equal(t, 6, len(replacedArr)) { + assert.Equal(t, replacedArr[0], rawArr[1]) + assert.Equal(t, replacedArr[1], rawArr[2]) + assert.Equal(t, replacedArr[2], rawArr[3]) + assert.Equal(t, replacedArr[3], rawArr[4]) + assert.Equal(t, replacedArr[4], rawArr[5]) + assert.Equal(t, replacedArr[5], rawArr[0]) + } +} + +func TestCollectInt32(t *testing.T) { + v := &Value{data: []int32{int32(1), int32(1), int32(1), int32(1), int32(1), int32(1)}} + + collected := v.CollectInt32(func(index int, val int32) interface{} { + return index + }) + + collectedArr := collected.MustInterSlice() + if assert.Equal(t, 6, len(collectedArr)) { + assert.Equal(t, collectedArr[0], 0) + assert.Equal(t, collectedArr[1], 1) + assert.Equal(t, collectedArr[2], 2) + assert.Equal(t, collectedArr[3], 3) + assert.Equal(t, collectedArr[4], 4) + assert.Equal(t, collectedArr[5], 5) + } +} + +/* + Tests for Int64 (int64 and []int64) +*/ + +func TestInt64(t *testing.T) { + val := int64(1) + + m := map[string]interface{}{"value": val, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").Int64()) + assert.Equal(t, val, New(m).Get("value").MustInt64()) + assert.Equal(t, int64(0), New(m).Get("nothing").Int64()) + assert.Equal(t, val, New(m).Get("nothing").Int64(1)) + assert.Panics(t, func() { + New(m).Get("age").MustInt64() + }) +} + +func TestInt64Slice(t *testing.T) { + val := int64(1) + + m := map[string]interface{}{"value": []int64{val}, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").Int64Slice()[0]) + assert.Equal(t, val, New(m).Get("value").MustInt64Slice()[0]) + assert.Equal(t, []int64(nil), New(m).Get("nothing").Int64Slice()) + assert.Equal(t, val, New(m).Get("nothing").Int64Slice([]int64{int64(1)})[0]) + assert.Panics(t, func() { + New(m).Get("nothing").MustInt64Slice() + }) +} + +func TestIsInt64(t *testing.T) { + v := &Value{data: int64(1)} + assert.True(t, v.IsInt64()) + +} + +func TestIsInt64Slice(t *testing.T) { + v := &Value{data: []int64{int64(1)}} + assert.True(t, v.IsInt64Slice()) +} + +func TestEachInt64(t *testing.T) { + v := &Value{data: []int64{int64(1), int64(1), int64(1), int64(1), int64(1)}} + count := 0 + replacedVals := make([]int64, 0) + assert.Equal(t, v, v.EachInt64(func(i int, val int64) bool { + count++ + replacedVals = append(replacedVals, val) + + // abort early + return i != 2 + })) + + assert.Equal(t, count, 3) + assert.Equal(t, replacedVals[0], v.MustInt64Slice()[0]) + assert.Equal(t, replacedVals[1], v.MustInt64Slice()[1]) + assert.Equal(t, replacedVals[2], v.MustInt64Slice()[2]) +} + +func TestWhereInt64(t *testing.T) { + v := &Value{data: []int64{int64(1), int64(1), int64(1), int64(1), int64(1), int64(1)}} + + selected := v.WhereInt64(func(i int, val int64) bool { + return i%2 == 0 + }).MustInt64Slice() + + assert.Equal(t, 3, len(selected)) +} + +func TestGroupInt64(t *testing.T) { + v := &Value{data: []int64{int64(1), int64(1), int64(1), int64(1), int64(1), int64(1)}} + + grouped := v.GroupInt64(func(i int, val int64) string { + return fmt.Sprintf("%v", i%2 == 0) + }).data.(map[string][]int64) + + assert.Equal(t, 2, len(grouped)) + assert.Equal(t, 3, len(grouped["true"])) + assert.Equal(t, 3, len(grouped["false"])) +} + +func TestReplaceInt64(t *testing.T) { + v := &Value{data: []int64{int64(1), int64(1), int64(1), int64(1), int64(1), int64(1)}} + + rawArr := v.MustInt64Slice() + + replaced := v.ReplaceInt64(func(index int, val int64) int64 { + if index < len(rawArr)-1 { + return rawArr[index+1] + } + return rawArr[0] + }) + + replacedArr := replaced.MustInt64Slice() + if assert.Equal(t, 6, len(replacedArr)) { + assert.Equal(t, replacedArr[0], rawArr[1]) + assert.Equal(t, replacedArr[1], rawArr[2]) + assert.Equal(t, replacedArr[2], rawArr[3]) + assert.Equal(t, replacedArr[3], rawArr[4]) + assert.Equal(t, replacedArr[4], rawArr[5]) + assert.Equal(t, replacedArr[5], rawArr[0]) + } +} + +func TestCollectInt64(t *testing.T) { + v := &Value{data: []int64{int64(1), int64(1), int64(1), int64(1), int64(1), int64(1)}} + + collected := v.CollectInt64(func(index int, val int64) interface{} { + return index + }) + + collectedArr := collected.MustInterSlice() + if assert.Equal(t, 6, len(collectedArr)) { + assert.Equal(t, collectedArr[0], 0) + assert.Equal(t, collectedArr[1], 1) + assert.Equal(t, collectedArr[2], 2) + assert.Equal(t, collectedArr[3], 3) + assert.Equal(t, collectedArr[4], 4) + assert.Equal(t, collectedArr[5], 5) + } +} + +/* + Tests for Uint (uint and []uint) +*/ + +func TestUint(t *testing.T) { + val := uint(1) + + m := map[string]interface{}{"value": val, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").Uint()) + assert.Equal(t, val, New(m).Get("value").MustUint()) + assert.Equal(t, uint(0), New(m).Get("nothing").Uint()) + assert.Equal(t, val, New(m).Get("nothing").Uint(1)) + assert.Panics(t, func() { + New(m).Get("age").MustUint() + }) +} + +func TestUintSlice(t *testing.T) { + val := uint(1) + + m := map[string]interface{}{"value": []uint{val}, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").UintSlice()[0]) + assert.Equal(t, val, New(m).Get("value").MustUintSlice()[0]) + assert.Equal(t, []uint(nil), New(m).Get("nothing").UintSlice()) + assert.Equal(t, val, New(m).Get("nothing").UintSlice([]uint{uint(1)})[0]) + assert.Panics(t, func() { + New(m).Get("nothing").MustUintSlice() + }) +} + +func TestIsUint(t *testing.T) { + v := &Value{data: uint(1)} + assert.True(t, v.IsUint()) + +} + +func TestIsUintSlice(t *testing.T) { + v := &Value{data: []uint{uint(1)}} + assert.True(t, v.IsUintSlice()) +} + +func TestEachUint(t *testing.T) { + v := &Value{data: []uint{uint(1), uint(1), uint(1), uint(1), uint(1)}} + count := 0 + replacedVals := make([]uint, 0) + assert.Equal(t, v, v.EachUint(func(i int, val uint) bool { + count++ + replacedVals = append(replacedVals, val) + + // abort early + return i != 2 + })) + + assert.Equal(t, count, 3) + assert.Equal(t, replacedVals[0], v.MustUintSlice()[0]) + assert.Equal(t, replacedVals[1], v.MustUintSlice()[1]) + assert.Equal(t, replacedVals[2], v.MustUintSlice()[2]) +} + +func TestWhereUint(t *testing.T) { + v := &Value{data: []uint{uint(1), uint(1), uint(1), uint(1), uint(1), uint(1)}} + + selected := v.WhereUint(func(i int, val uint) bool { + return i%2 == 0 + }).MustUintSlice() + + assert.Equal(t, 3, len(selected)) +} + +func TestGroupUint(t *testing.T) { + v := &Value{data: []uint{uint(1), uint(1), uint(1), uint(1), uint(1), uint(1)}} + + grouped := v.GroupUint(func(i int, val uint) string { + return fmt.Sprintf("%v", i%2 == 0) + }).data.(map[string][]uint) + + assert.Equal(t, 2, len(grouped)) + assert.Equal(t, 3, len(grouped["true"])) + assert.Equal(t, 3, len(grouped["false"])) +} + +func TestReplaceUint(t *testing.T) { + v := &Value{data: []uint{uint(1), uint(1), uint(1), uint(1), uint(1), uint(1)}} + + rawArr := v.MustUintSlice() + + replaced := v.ReplaceUint(func(index int, val uint) uint { + if index < len(rawArr)-1 { + return rawArr[index+1] + } + return rawArr[0] + }) + + replacedArr := replaced.MustUintSlice() + if assert.Equal(t, 6, len(replacedArr)) { + assert.Equal(t, replacedArr[0], rawArr[1]) + assert.Equal(t, replacedArr[1], rawArr[2]) + assert.Equal(t, replacedArr[2], rawArr[3]) + assert.Equal(t, replacedArr[3], rawArr[4]) + assert.Equal(t, replacedArr[4], rawArr[5]) + assert.Equal(t, replacedArr[5], rawArr[0]) + } +} + +func TestCollectUint(t *testing.T) { + v := &Value{data: []uint{uint(1), uint(1), uint(1), uint(1), uint(1), uint(1)}} + + collected := v.CollectUint(func(index int, val uint) interface{} { + return index + }) + + collectedArr := collected.MustInterSlice() + if assert.Equal(t, 6, len(collectedArr)) { + assert.Equal(t, collectedArr[0], 0) + assert.Equal(t, collectedArr[1], 1) + assert.Equal(t, collectedArr[2], 2) + assert.Equal(t, collectedArr[3], 3) + assert.Equal(t, collectedArr[4], 4) + assert.Equal(t, collectedArr[5], 5) + } +} + +/* + Tests for Uint8 (uint8 and []uint8) +*/ + +func TestUint8(t *testing.T) { + val := uint8(1) + + m := map[string]interface{}{"value": val, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").Uint8()) + assert.Equal(t, val, New(m).Get("value").MustUint8()) + assert.Equal(t, uint8(0), New(m).Get("nothing").Uint8()) + assert.Equal(t, val, New(m).Get("nothing").Uint8(1)) + assert.Panics(t, func() { + New(m).Get("age").MustUint8() + }) +} + +func TestUint8Slice(t *testing.T) { + val := uint8(1) + + m := map[string]interface{}{"value": []uint8{val}, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").Uint8Slice()[0]) + assert.Equal(t, val, New(m).Get("value").MustUint8Slice()[0]) + assert.Equal(t, []uint8(nil), New(m).Get("nothing").Uint8Slice()) + assert.Equal(t, val, New(m).Get("nothing").Uint8Slice([]uint8{uint8(1)})[0]) + assert.Panics(t, func() { + New(m).Get("nothing").MustUint8Slice() + }) +} + +func TestIsUint8(t *testing.T) { + v := &Value{data: uint8(1)} + assert.True(t, v.IsUint8()) + +} + +func TestIsUint8Slice(t *testing.T) { + v := &Value{data: []uint8{uint8(1)}} + assert.True(t, v.IsUint8Slice()) +} + +func TestEachUint8(t *testing.T) { + v := &Value{data: []uint8{uint8(1), uint8(1), uint8(1), uint8(1), uint8(1)}} + count := 0 + replacedVals := make([]uint8, 0) + assert.Equal(t, v, v.EachUint8(func(i int, val uint8) bool { + count++ + replacedVals = append(replacedVals, val) + + // abort early + return i != 2 + })) + + assert.Equal(t, count, 3) + assert.Equal(t, replacedVals[0], v.MustUint8Slice()[0]) + assert.Equal(t, replacedVals[1], v.MustUint8Slice()[1]) + assert.Equal(t, replacedVals[2], v.MustUint8Slice()[2]) +} + +func TestWhereUint8(t *testing.T) { + v := &Value{data: []uint8{uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1)}} + + selected := v.WhereUint8(func(i int, val uint8) bool { + return i%2 == 0 + }).MustUint8Slice() + + assert.Equal(t, 3, len(selected)) +} + +func TestGroupUint8(t *testing.T) { + v := &Value{data: []uint8{uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1)}} + + grouped := v.GroupUint8(func(i int, val uint8) string { + return fmt.Sprintf("%v", i%2 == 0) + }).data.(map[string][]uint8) + + assert.Equal(t, 2, len(grouped)) + assert.Equal(t, 3, len(grouped["true"])) + assert.Equal(t, 3, len(grouped["false"])) +} + +func TestReplaceUint8(t *testing.T) { + v := &Value{data: []uint8{uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1)}} + + rawArr := v.MustUint8Slice() + + replaced := v.ReplaceUint8(func(index int, val uint8) uint8 { + if index < len(rawArr)-1 { + return rawArr[index+1] + } + return rawArr[0] + }) + + replacedArr := replaced.MustUint8Slice() + if assert.Equal(t, 6, len(replacedArr)) { + assert.Equal(t, replacedArr[0], rawArr[1]) + assert.Equal(t, replacedArr[1], rawArr[2]) + assert.Equal(t, replacedArr[2], rawArr[3]) + assert.Equal(t, replacedArr[3], rawArr[4]) + assert.Equal(t, replacedArr[4], rawArr[5]) + assert.Equal(t, replacedArr[5], rawArr[0]) + } +} + +func TestCollectUint8(t *testing.T) { + v := &Value{data: []uint8{uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1)}} + + collected := v.CollectUint8(func(index int, val uint8) interface{} { + return index + }) + + collectedArr := collected.MustInterSlice() + if assert.Equal(t, 6, len(collectedArr)) { + assert.Equal(t, collectedArr[0], 0) + assert.Equal(t, collectedArr[1], 1) + assert.Equal(t, collectedArr[2], 2) + assert.Equal(t, collectedArr[3], 3) + assert.Equal(t, collectedArr[4], 4) + assert.Equal(t, collectedArr[5], 5) + } +} + +/* + Tests for Uint16 (uint16 and []uint16) +*/ + +func TestUint16(t *testing.T) { + val := uint16(1) + + m := map[string]interface{}{"value": val, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").Uint16()) + assert.Equal(t, val, New(m).Get("value").MustUint16()) + assert.Equal(t, uint16(0), New(m).Get("nothing").Uint16()) + assert.Equal(t, val, New(m).Get("nothing").Uint16(1)) + assert.Panics(t, func() { + New(m).Get("age").MustUint16() + }) +} + +func TestUint16Slice(t *testing.T) { + val := uint16(1) + + m := map[string]interface{}{"value": []uint16{val}, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").Uint16Slice()[0]) + assert.Equal(t, val, New(m).Get("value").MustUint16Slice()[0]) + assert.Equal(t, []uint16(nil), New(m).Get("nothing").Uint16Slice()) + assert.Equal(t, val, New(m).Get("nothing").Uint16Slice([]uint16{uint16(1)})[0]) + assert.Panics(t, func() { + New(m).Get("nothing").MustUint16Slice() + }) +} + +func TestIsUint16(t *testing.T) { + v := &Value{data: uint16(1)} + assert.True(t, v.IsUint16()) + +} + +func TestIsUint16Slice(t *testing.T) { + v := &Value{data: []uint16{uint16(1)}} + assert.True(t, v.IsUint16Slice()) +} + +func TestEachUint16(t *testing.T) { + v := &Value{data: []uint16{uint16(1), uint16(1), uint16(1), uint16(1), uint16(1)}} + count := 0 + replacedVals := make([]uint16, 0) + assert.Equal(t, v, v.EachUint16(func(i int, val uint16) bool { + count++ + replacedVals = append(replacedVals, val) + + // abort early + return i != 2 + })) + + assert.Equal(t, count, 3) + assert.Equal(t, replacedVals[0], v.MustUint16Slice()[0]) + assert.Equal(t, replacedVals[1], v.MustUint16Slice()[1]) + assert.Equal(t, replacedVals[2], v.MustUint16Slice()[2]) +} + +func TestWhereUint16(t *testing.T) { + v := &Value{data: []uint16{uint16(1), uint16(1), uint16(1), uint16(1), uint16(1), uint16(1)}} + + selected := v.WhereUint16(func(i int, val uint16) bool { + return i%2 == 0 + }).MustUint16Slice() + + assert.Equal(t, 3, len(selected)) +} + +func TestGroupUint16(t *testing.T) { + v := &Value{data: []uint16{uint16(1), uint16(1), uint16(1), uint16(1), uint16(1), uint16(1)}} + + grouped := v.GroupUint16(func(i int, val uint16) string { + return fmt.Sprintf("%v", i%2 == 0) + }).data.(map[string][]uint16) + + assert.Equal(t, 2, len(grouped)) + assert.Equal(t, 3, len(grouped["true"])) + assert.Equal(t, 3, len(grouped["false"])) +} + +func TestReplaceUint16(t *testing.T) { + v := &Value{data: []uint16{uint16(1), uint16(1), uint16(1), uint16(1), uint16(1), uint16(1)}} + + rawArr := v.MustUint16Slice() + + replaced := v.ReplaceUint16(func(index int, val uint16) uint16 { + if index < len(rawArr)-1 { + return rawArr[index+1] + } + return rawArr[0] + }) + + replacedArr := replaced.MustUint16Slice() + if assert.Equal(t, 6, len(replacedArr)) { + assert.Equal(t, replacedArr[0], rawArr[1]) + assert.Equal(t, replacedArr[1], rawArr[2]) + assert.Equal(t, replacedArr[2], rawArr[3]) + assert.Equal(t, replacedArr[3], rawArr[4]) + assert.Equal(t, replacedArr[4], rawArr[5]) + assert.Equal(t, replacedArr[5], rawArr[0]) + } +} + +func TestCollectUint16(t *testing.T) { + v := &Value{data: []uint16{uint16(1), uint16(1), uint16(1), uint16(1), uint16(1), uint16(1)}} + + collected := v.CollectUint16(func(index int, val uint16) interface{} { + return index + }) + + collectedArr := collected.MustInterSlice() + if assert.Equal(t, 6, len(collectedArr)) { + assert.Equal(t, collectedArr[0], 0) + assert.Equal(t, collectedArr[1], 1) + assert.Equal(t, collectedArr[2], 2) + assert.Equal(t, collectedArr[3], 3) + assert.Equal(t, collectedArr[4], 4) + assert.Equal(t, collectedArr[5], 5) + } +} + +/* + Tests for Uint32 (uint32 and []uint32) +*/ + +func TestUint32(t *testing.T) { + val := uint32(1) + + m := map[string]interface{}{"value": val, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").Uint32()) + assert.Equal(t, val, New(m).Get("value").MustUint32()) + assert.Equal(t, uint32(0), New(m).Get("nothing").Uint32()) + assert.Equal(t, val, New(m).Get("nothing").Uint32(1)) + assert.Panics(t, func() { + New(m).Get("age").MustUint32() + }) +} + +func TestUint32Slice(t *testing.T) { + val := uint32(1) + + m := map[string]interface{}{"value": []uint32{val}, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").Uint32Slice()[0]) + assert.Equal(t, val, New(m).Get("value").MustUint32Slice()[0]) + assert.Equal(t, []uint32(nil), New(m).Get("nothing").Uint32Slice()) + assert.Equal(t, val, New(m).Get("nothing").Uint32Slice([]uint32{uint32(1)})[0]) + assert.Panics(t, func() { + New(m).Get("nothing").MustUint32Slice() + }) +} + +func TestIsUint32(t *testing.T) { + v := &Value{data: uint32(1)} + assert.True(t, v.IsUint32()) + +} + +func TestIsUint32Slice(t *testing.T) { + v := &Value{data: []uint32{uint32(1)}} + assert.True(t, v.IsUint32Slice()) +} + +func TestEachUint32(t *testing.T) { + v := &Value{data: []uint32{uint32(1), uint32(1), uint32(1), uint32(1), uint32(1)}} + count := 0 + replacedVals := make([]uint32, 0) + assert.Equal(t, v, v.EachUint32(func(i int, val uint32) bool { + count++ + replacedVals = append(replacedVals, val) + + // abort early + return i != 2 + })) + + assert.Equal(t, count, 3) + assert.Equal(t, replacedVals[0], v.MustUint32Slice()[0]) + assert.Equal(t, replacedVals[1], v.MustUint32Slice()[1]) + assert.Equal(t, replacedVals[2], v.MustUint32Slice()[2]) +} + +func TestWhereUint32(t *testing.T) { + v := &Value{data: []uint32{uint32(1), uint32(1), uint32(1), uint32(1), uint32(1), uint32(1)}} + + selected := v.WhereUint32(func(i int, val uint32) bool { + return i%2 == 0 + }).MustUint32Slice() + + assert.Equal(t, 3, len(selected)) +} + +func TestGroupUint32(t *testing.T) { + v := &Value{data: []uint32{uint32(1), uint32(1), uint32(1), uint32(1), uint32(1), uint32(1)}} + + grouped := v.GroupUint32(func(i int, val uint32) string { + return fmt.Sprintf("%v", i%2 == 0) + }).data.(map[string][]uint32) + + assert.Equal(t, 2, len(grouped)) + assert.Equal(t, 3, len(grouped["true"])) + assert.Equal(t, 3, len(grouped["false"])) +} + +func TestReplaceUint32(t *testing.T) { + v := &Value{data: []uint32{uint32(1), uint32(1), uint32(1), uint32(1), uint32(1), uint32(1)}} + + rawArr := v.MustUint32Slice() + + replaced := v.ReplaceUint32(func(index int, val uint32) uint32 { + if index < len(rawArr)-1 { + return rawArr[index+1] + } + return rawArr[0] + }) + + replacedArr := replaced.MustUint32Slice() + if assert.Equal(t, 6, len(replacedArr)) { + assert.Equal(t, replacedArr[0], rawArr[1]) + assert.Equal(t, replacedArr[1], rawArr[2]) + assert.Equal(t, replacedArr[2], rawArr[3]) + assert.Equal(t, replacedArr[3], rawArr[4]) + assert.Equal(t, replacedArr[4], rawArr[5]) + assert.Equal(t, replacedArr[5], rawArr[0]) + } +} + +func TestCollectUint32(t *testing.T) { + v := &Value{data: []uint32{uint32(1), uint32(1), uint32(1), uint32(1), uint32(1), uint32(1)}} + + collected := v.CollectUint32(func(index int, val uint32) interface{} { + return index + }) + + collectedArr := collected.MustInterSlice() + if assert.Equal(t, 6, len(collectedArr)) { + assert.Equal(t, collectedArr[0], 0) + assert.Equal(t, collectedArr[1], 1) + assert.Equal(t, collectedArr[2], 2) + assert.Equal(t, collectedArr[3], 3) + assert.Equal(t, collectedArr[4], 4) + assert.Equal(t, collectedArr[5], 5) + } +} + +/* + Tests for Uint64 (uint64 and []uint64) +*/ + +func TestUint64(t *testing.T) { + val := uint64(1) + + m := map[string]interface{}{"value": val, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").Uint64()) + assert.Equal(t, val, New(m).Get("value").MustUint64()) + assert.Equal(t, uint64(0), New(m).Get("nothing").Uint64()) + assert.Equal(t, val, New(m).Get("nothing").Uint64(1)) + assert.Panics(t, func() { + New(m).Get("age").MustUint64() + }) +} + +func TestUint64Slice(t *testing.T) { + val := uint64(1) + + m := map[string]interface{}{"value": []uint64{val}, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").Uint64Slice()[0]) + assert.Equal(t, val, New(m).Get("value").MustUint64Slice()[0]) + assert.Equal(t, []uint64(nil), New(m).Get("nothing").Uint64Slice()) + assert.Equal(t, val, New(m).Get("nothing").Uint64Slice([]uint64{uint64(1)})[0]) + assert.Panics(t, func() { + New(m).Get("nothing").MustUint64Slice() + }) +} + +func TestIsUint64(t *testing.T) { + v := &Value{data: uint64(1)} + assert.True(t, v.IsUint64()) + +} + +func TestIsUint64Slice(t *testing.T) { + v := &Value{data: []uint64{uint64(1)}} + assert.True(t, v.IsUint64Slice()) +} + +func TestEachUint64(t *testing.T) { + v := &Value{data: []uint64{uint64(1), uint64(1), uint64(1), uint64(1), uint64(1)}} + count := 0 + replacedVals := make([]uint64, 0) + assert.Equal(t, v, v.EachUint64(func(i int, val uint64) bool { + count++ + replacedVals = append(replacedVals, val) + + // abort early + return i != 2 + })) + + assert.Equal(t, count, 3) + assert.Equal(t, replacedVals[0], v.MustUint64Slice()[0]) + assert.Equal(t, replacedVals[1], v.MustUint64Slice()[1]) + assert.Equal(t, replacedVals[2], v.MustUint64Slice()[2]) +} + +func TestWhereUint64(t *testing.T) { + v := &Value{data: []uint64{uint64(1), uint64(1), uint64(1), uint64(1), uint64(1), uint64(1)}} + + selected := v.WhereUint64(func(i int, val uint64) bool { + return i%2 == 0 + }).MustUint64Slice() + + assert.Equal(t, 3, len(selected)) +} + +func TestGroupUint64(t *testing.T) { + v := &Value{data: []uint64{uint64(1), uint64(1), uint64(1), uint64(1), uint64(1), uint64(1)}} + + grouped := v.GroupUint64(func(i int, val uint64) string { + return fmt.Sprintf("%v", i%2 == 0) + }).data.(map[string][]uint64) + + assert.Equal(t, 2, len(grouped)) + assert.Equal(t, 3, len(grouped["true"])) + assert.Equal(t, 3, len(grouped["false"])) +} + +func TestReplaceUint64(t *testing.T) { + v := &Value{data: []uint64{uint64(1), uint64(1), uint64(1), uint64(1), uint64(1), uint64(1)}} + + rawArr := v.MustUint64Slice() + + replaced := v.ReplaceUint64(func(index int, val uint64) uint64 { + if index < len(rawArr)-1 { + return rawArr[index+1] + } + return rawArr[0] + }) + + replacedArr := replaced.MustUint64Slice() + if assert.Equal(t, 6, len(replacedArr)) { + assert.Equal(t, replacedArr[0], rawArr[1]) + assert.Equal(t, replacedArr[1], rawArr[2]) + assert.Equal(t, replacedArr[2], rawArr[3]) + assert.Equal(t, replacedArr[3], rawArr[4]) + assert.Equal(t, replacedArr[4], rawArr[5]) + assert.Equal(t, replacedArr[5], rawArr[0]) + } +} + +func TestCollectUint64(t *testing.T) { + v := &Value{data: []uint64{uint64(1), uint64(1), uint64(1), uint64(1), uint64(1), uint64(1)}} + + collected := v.CollectUint64(func(index int, val uint64) interface{} { + return index + }) + + collectedArr := collected.MustInterSlice() + if assert.Equal(t, 6, len(collectedArr)) { + assert.Equal(t, collectedArr[0], 0) + assert.Equal(t, collectedArr[1], 1) + assert.Equal(t, collectedArr[2], 2) + assert.Equal(t, collectedArr[3], 3) + assert.Equal(t, collectedArr[4], 4) + assert.Equal(t, collectedArr[5], 5) + } +} + +/* + Tests for Uintptr (uintptr and []uintptr) +*/ + +func TestUintptr(t *testing.T) { + val := uintptr(1) + + m := map[string]interface{}{"value": val, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").Uintptr()) + assert.Equal(t, val, New(m).Get("value").MustUintptr()) + assert.Equal(t, uintptr(0), New(m).Get("nothing").Uintptr()) + assert.Equal(t, val, New(m).Get("nothing").Uintptr(1)) + assert.Panics(t, func() { + New(m).Get("age").MustUintptr() + }) +} + +func TestUintptrSlice(t *testing.T) { + val := uintptr(1) + + m := map[string]interface{}{"value": []uintptr{val}, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").UintptrSlice()[0]) + assert.Equal(t, val, New(m).Get("value").MustUintptrSlice()[0]) + assert.Equal(t, []uintptr(nil), New(m).Get("nothing").UintptrSlice()) + assert.Equal(t, val, New(m).Get("nothing").UintptrSlice([]uintptr{uintptr(1)})[0]) + assert.Panics(t, func() { + New(m).Get("nothing").MustUintptrSlice() + }) +} + +func TestIsUintptr(t *testing.T) { + v := &Value{data: uintptr(1)} + assert.True(t, v.IsUintptr()) + +} + +func TestIsUintptrSlice(t *testing.T) { + v := &Value{data: []uintptr{uintptr(1)}} + assert.True(t, v.IsUintptrSlice()) +} + +func TestEachUintptr(t *testing.T) { + v := &Value{data: []uintptr{uintptr(1), uintptr(1), uintptr(1), uintptr(1), uintptr(1)}} + count := 0 + replacedVals := make([]uintptr, 0) + assert.Equal(t, v, v.EachUintptr(func(i int, val uintptr) bool { + count++ + replacedVals = append(replacedVals, val) + + // abort early + return i != 2 + })) + + assert.Equal(t, count, 3) + assert.Equal(t, replacedVals[0], v.MustUintptrSlice()[0]) + assert.Equal(t, replacedVals[1], v.MustUintptrSlice()[1]) + assert.Equal(t, replacedVals[2], v.MustUintptrSlice()[2]) +} + +func TestWhereUintptr(t *testing.T) { + v := &Value{data: []uintptr{uintptr(1), uintptr(1), uintptr(1), uintptr(1), uintptr(1), uintptr(1)}} + + selected := v.WhereUintptr(func(i int, val uintptr) bool { + return i%2 == 0 + }).MustUintptrSlice() + + assert.Equal(t, 3, len(selected)) +} + +func TestGroupUintptr(t *testing.T) { + v := &Value{data: []uintptr{uintptr(1), uintptr(1), uintptr(1), uintptr(1), uintptr(1), uintptr(1)}} + + grouped := v.GroupUintptr(func(i int, val uintptr) string { + return fmt.Sprintf("%v", i%2 == 0) + }).data.(map[string][]uintptr) + + assert.Equal(t, 2, len(grouped)) + assert.Equal(t, 3, len(grouped["true"])) + assert.Equal(t, 3, len(grouped["false"])) +} + +func TestReplaceUintptr(t *testing.T) { + v := &Value{data: []uintptr{uintptr(1), uintptr(1), uintptr(1), uintptr(1), uintptr(1), uintptr(1)}} + + rawArr := v.MustUintptrSlice() + + replaced := v.ReplaceUintptr(func(index int, val uintptr) uintptr { + if index < len(rawArr)-1 { + return rawArr[index+1] + } + return rawArr[0] + }) + + replacedArr := replaced.MustUintptrSlice() + if assert.Equal(t, 6, len(replacedArr)) { + assert.Equal(t, replacedArr[0], rawArr[1]) + assert.Equal(t, replacedArr[1], rawArr[2]) + assert.Equal(t, replacedArr[2], rawArr[3]) + assert.Equal(t, replacedArr[3], rawArr[4]) + assert.Equal(t, replacedArr[4], rawArr[5]) + assert.Equal(t, replacedArr[5], rawArr[0]) + } +} + +func TestCollectUintptr(t *testing.T) { + v := &Value{data: []uintptr{uintptr(1), uintptr(1), uintptr(1), uintptr(1), uintptr(1), uintptr(1)}} + + collected := v.CollectUintptr(func(index int, val uintptr) interface{} { + return index + }) + + collectedArr := collected.MustInterSlice() + if assert.Equal(t, 6, len(collectedArr)) { + assert.Equal(t, collectedArr[0], 0) + assert.Equal(t, collectedArr[1], 1) + assert.Equal(t, collectedArr[2], 2) + assert.Equal(t, collectedArr[3], 3) + assert.Equal(t, collectedArr[4], 4) + assert.Equal(t, collectedArr[5], 5) + } +} + +/* + Tests for Float32 (float32 and []float32) +*/ + +func TestFloat32(t *testing.T) { + val := float32(1) + + m := map[string]interface{}{"value": val, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").Float32()) + assert.Equal(t, val, New(m).Get("value").MustFloat32()) + assert.Equal(t, float32(0), New(m).Get("nothing").Float32()) + assert.Equal(t, val, New(m).Get("nothing").Float32(1)) + assert.Panics(t, func() { + New(m).Get("age").MustFloat32() + }) +} + +func TestFloat32Slice(t *testing.T) { + val := float32(1) + + m := map[string]interface{}{"value": []float32{val}, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").Float32Slice()[0]) + assert.Equal(t, val, New(m).Get("value").MustFloat32Slice()[0]) + assert.Equal(t, []float32(nil), New(m).Get("nothing").Float32Slice()) + assert.Equal(t, val, New(m).Get("nothing").Float32Slice([]float32{float32(1)})[0]) + assert.Panics(t, func() { + New(m).Get("nothing").MustFloat32Slice() + }) +} + +func TestIsFloat32(t *testing.T) { + v := &Value{data: float32(1)} + assert.True(t, v.IsFloat32()) + +} + +func TestIsFloat32Slice(t *testing.T) { + v := &Value{data: []float32{float32(1)}} + assert.True(t, v.IsFloat32Slice()) +} + +func TestEachFloat32(t *testing.T) { + v := &Value{data: []float32{float32(1), float32(1), float32(1), float32(1), float32(1)}} + count := 0 + replacedVals := make([]float32, 0) + assert.Equal(t, v, v.EachFloat32(func(i int, val float32) bool { + count++ + replacedVals = append(replacedVals, val) + + // abort early + return i != 2 + })) + + assert.Equal(t, count, 3) + assert.Equal(t, replacedVals[0], v.MustFloat32Slice()[0]) + assert.Equal(t, replacedVals[1], v.MustFloat32Slice()[1]) + assert.Equal(t, replacedVals[2], v.MustFloat32Slice()[2]) +} + +func TestWhereFloat32(t *testing.T) { + v := &Value{data: []float32{float32(1), float32(1), float32(1), float32(1), float32(1), float32(1)}} + + selected := v.WhereFloat32(func(i int, val float32) bool { + return i%2 == 0 + }).MustFloat32Slice() + + assert.Equal(t, 3, len(selected)) +} + +func TestGroupFloat32(t *testing.T) { + v := &Value{data: []float32{float32(1), float32(1), float32(1), float32(1), float32(1), float32(1)}} + + grouped := v.GroupFloat32(func(i int, val float32) string { + return fmt.Sprintf("%v", i%2 == 0) + }).data.(map[string][]float32) + + assert.Equal(t, 2, len(grouped)) + assert.Equal(t, 3, len(grouped["true"])) + assert.Equal(t, 3, len(grouped["false"])) +} + +func TestReplaceFloat32(t *testing.T) { + v := &Value{data: []float32{float32(1), float32(1), float32(1), float32(1), float32(1), float32(1)}} + + rawArr := v.MustFloat32Slice() + + replaced := v.ReplaceFloat32(func(index int, val float32) float32 { + if index < len(rawArr)-1 { + return rawArr[index+1] + } + return rawArr[0] + }) + + replacedArr := replaced.MustFloat32Slice() + if assert.Equal(t, 6, len(replacedArr)) { + assert.Equal(t, replacedArr[0], rawArr[1]) + assert.Equal(t, replacedArr[1], rawArr[2]) + assert.Equal(t, replacedArr[2], rawArr[3]) + assert.Equal(t, replacedArr[3], rawArr[4]) + assert.Equal(t, replacedArr[4], rawArr[5]) + assert.Equal(t, replacedArr[5], rawArr[0]) + } +} + +func TestCollectFloat32(t *testing.T) { + v := &Value{data: []float32{float32(1), float32(1), float32(1), float32(1), float32(1), float32(1)}} + + collected := v.CollectFloat32(func(index int, val float32) interface{} { + return index + }) + + collectedArr := collected.MustInterSlice() + if assert.Equal(t, 6, len(collectedArr)) { + assert.Equal(t, collectedArr[0], 0) + assert.Equal(t, collectedArr[1], 1) + assert.Equal(t, collectedArr[2], 2) + assert.Equal(t, collectedArr[3], 3) + assert.Equal(t, collectedArr[4], 4) + assert.Equal(t, collectedArr[5], 5) + } +} + +/* + Tests for Float64 (float64 and []float64) +*/ + +func TestFloat64(t *testing.T) { + val := float64(1) + + m := map[string]interface{}{"value": val, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").Float64()) + assert.Equal(t, val, New(m).Get("value").MustFloat64()) + assert.Equal(t, float64(0), New(m).Get("nothing").Float64()) + assert.Equal(t, val, New(m).Get("nothing").Float64(1)) + assert.Panics(t, func() { + New(m).Get("age").MustFloat64() + }) +} + +func TestFloat64Slice(t *testing.T) { + val := float64(1) + + m := map[string]interface{}{"value": []float64{val}, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").Float64Slice()[0]) + assert.Equal(t, val, New(m).Get("value").MustFloat64Slice()[0]) + assert.Equal(t, []float64(nil), New(m).Get("nothing").Float64Slice()) + assert.Equal(t, val, New(m).Get("nothing").Float64Slice([]float64{float64(1)})[0]) + assert.Panics(t, func() { + New(m).Get("nothing").MustFloat64Slice() + }) +} + +func TestIsFloat64(t *testing.T) { + v := &Value{data: float64(1)} + assert.True(t, v.IsFloat64()) + +} + +func TestIsFloat64Slice(t *testing.T) { + v := &Value{data: []float64{float64(1)}} + assert.True(t, v.IsFloat64Slice()) +} + +func TestEachFloat64(t *testing.T) { + v := &Value{data: []float64{float64(1), float64(1), float64(1), float64(1), float64(1)}} + count := 0 + replacedVals := make([]float64, 0) + assert.Equal(t, v, v.EachFloat64(func(i int, val float64) bool { + count++ + replacedVals = append(replacedVals, val) + + // abort early + return i != 2 + })) + + assert.Equal(t, count, 3) + assert.Equal(t, replacedVals[0], v.MustFloat64Slice()[0]) + assert.Equal(t, replacedVals[1], v.MustFloat64Slice()[1]) + assert.Equal(t, replacedVals[2], v.MustFloat64Slice()[2]) +} + +func TestWhereFloat64(t *testing.T) { + v := &Value{data: []float64{float64(1), float64(1), float64(1), float64(1), float64(1), float64(1)}} + + selected := v.WhereFloat64(func(i int, val float64) bool { + return i%2 == 0 + }).MustFloat64Slice() + + assert.Equal(t, 3, len(selected)) +} + +func TestGroupFloat64(t *testing.T) { + v := &Value{data: []float64{float64(1), float64(1), float64(1), float64(1), float64(1), float64(1)}} + + grouped := v.GroupFloat64(func(i int, val float64) string { + return fmt.Sprintf("%v", i%2 == 0) + }).data.(map[string][]float64) + + assert.Equal(t, 2, len(grouped)) + assert.Equal(t, 3, len(grouped["true"])) + assert.Equal(t, 3, len(grouped["false"])) +} + +func TestReplaceFloat64(t *testing.T) { + v := &Value{data: []float64{float64(1), float64(1), float64(1), float64(1), float64(1), float64(1)}} + + rawArr := v.MustFloat64Slice() + + replaced := v.ReplaceFloat64(func(index int, val float64) float64 { + if index < len(rawArr)-1 { + return rawArr[index+1] + } + return rawArr[0] + }) + + replacedArr := replaced.MustFloat64Slice() + if assert.Equal(t, 6, len(replacedArr)) { + assert.Equal(t, replacedArr[0], rawArr[1]) + assert.Equal(t, replacedArr[1], rawArr[2]) + assert.Equal(t, replacedArr[2], rawArr[3]) + assert.Equal(t, replacedArr[3], rawArr[4]) + assert.Equal(t, replacedArr[4], rawArr[5]) + assert.Equal(t, replacedArr[5], rawArr[0]) + } +} + +func TestCollectFloat64(t *testing.T) { + v := &Value{data: []float64{float64(1), float64(1), float64(1), float64(1), float64(1), float64(1)}} + + collected := v.CollectFloat64(func(index int, val float64) interface{} { + return index + }) + + collectedArr := collected.MustInterSlice() + if assert.Equal(t, 6, len(collectedArr)) { + assert.Equal(t, collectedArr[0], 0) + assert.Equal(t, collectedArr[1], 1) + assert.Equal(t, collectedArr[2], 2) + assert.Equal(t, collectedArr[3], 3) + assert.Equal(t, collectedArr[4], 4) + assert.Equal(t, collectedArr[5], 5) + } +} + +/* + Tests for Complex64 (complex64 and []complex64) +*/ + +func TestComplex64(t *testing.T) { + val := complex64(1) + + m := map[string]interface{}{"value": val, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").Complex64()) + assert.Equal(t, val, New(m).Get("value").MustComplex64()) + assert.Equal(t, complex64(0), New(m).Get("nothing").Complex64()) + assert.Equal(t, val, New(m).Get("nothing").Complex64(1)) + assert.Panics(t, func() { + New(m).Get("age").MustComplex64() + }) +} + +func TestComplex64Slice(t *testing.T) { + val := complex64(1) + + m := map[string]interface{}{"value": []complex64{val}, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").Complex64Slice()[0]) + assert.Equal(t, val, New(m).Get("value").MustComplex64Slice()[0]) + assert.Equal(t, []complex64(nil), New(m).Get("nothing").Complex64Slice()) + assert.Equal(t, val, New(m).Get("nothing").Complex64Slice([]complex64{complex64(1)})[0]) + assert.Panics(t, func() { + New(m).Get("nothing").MustComplex64Slice() + }) +} + +func TestIsComplex64(t *testing.T) { + v := &Value{data: complex64(1)} + assert.True(t, v.IsComplex64()) + +} + +func TestIsComplex64Slice(t *testing.T) { + v := &Value{data: []complex64{complex64(1)}} + assert.True(t, v.IsComplex64Slice()) +} + +func TestEachComplex64(t *testing.T) { + v := &Value{data: []complex64{complex64(1), complex64(1), complex64(1), complex64(1), complex64(1)}} + count := 0 + replacedVals := make([]complex64, 0) + assert.Equal(t, v, v.EachComplex64(func(i int, val complex64) bool { + count++ + replacedVals = append(replacedVals, val) + + // abort early + return i != 2 + })) + + assert.Equal(t, count, 3) + assert.Equal(t, replacedVals[0], v.MustComplex64Slice()[0]) + assert.Equal(t, replacedVals[1], v.MustComplex64Slice()[1]) + assert.Equal(t, replacedVals[2], v.MustComplex64Slice()[2]) +} + +func TestWhereComplex64(t *testing.T) { + v := &Value{data: []complex64{complex64(1), complex64(1), complex64(1), complex64(1), complex64(1), complex64(1)}} + + selected := v.WhereComplex64(func(i int, val complex64) bool { + return i%2 == 0 + }).MustComplex64Slice() + + assert.Equal(t, 3, len(selected)) +} + +func TestGroupComplex64(t *testing.T) { + v := &Value{data: []complex64{complex64(1), complex64(1), complex64(1), complex64(1), complex64(1), complex64(1)}} + + grouped := v.GroupComplex64(func(i int, val complex64) string { + return fmt.Sprintf("%v", i%2 == 0) + }).data.(map[string][]complex64) + + assert.Equal(t, 2, len(grouped)) + assert.Equal(t, 3, len(grouped["true"])) + assert.Equal(t, 3, len(grouped["false"])) +} + +func TestReplaceComplex64(t *testing.T) { + v := &Value{data: []complex64{complex64(1), complex64(1), complex64(1), complex64(1), complex64(1), complex64(1)}} + + rawArr := v.MustComplex64Slice() + + replaced := v.ReplaceComplex64(func(index int, val complex64) complex64 { + if index < len(rawArr)-1 { + return rawArr[index+1] + } + return rawArr[0] + }) + + replacedArr := replaced.MustComplex64Slice() + if assert.Equal(t, 6, len(replacedArr)) { + assert.Equal(t, replacedArr[0], rawArr[1]) + assert.Equal(t, replacedArr[1], rawArr[2]) + assert.Equal(t, replacedArr[2], rawArr[3]) + assert.Equal(t, replacedArr[3], rawArr[4]) + assert.Equal(t, replacedArr[4], rawArr[5]) + assert.Equal(t, replacedArr[5], rawArr[0]) + } +} + +func TestCollectComplex64(t *testing.T) { + v := &Value{data: []complex64{complex64(1), complex64(1), complex64(1), complex64(1), complex64(1), complex64(1)}} + + collected := v.CollectComplex64(func(index int, val complex64) interface{} { + return index + }) + + collectedArr := collected.MustInterSlice() + if assert.Equal(t, 6, len(collectedArr)) { + assert.Equal(t, collectedArr[0], 0) + assert.Equal(t, collectedArr[1], 1) + assert.Equal(t, collectedArr[2], 2) + assert.Equal(t, collectedArr[3], 3) + assert.Equal(t, collectedArr[4], 4) + assert.Equal(t, collectedArr[5], 5) + } +} + +/* + Tests for Complex128 (complex128 and []complex128) +*/ + +func TestComplex128(t *testing.T) { + val := complex128(1) + + m := map[string]interface{}{"value": val, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").Complex128()) + assert.Equal(t, val, New(m).Get("value").MustComplex128()) + assert.Equal(t, complex128(0), New(m).Get("nothing").Complex128()) + assert.Equal(t, val, New(m).Get("nothing").Complex128(1)) + assert.Panics(t, func() { + New(m).Get("age").MustComplex128() + }) +} + +func TestComplex128Slice(t *testing.T) { + val := complex128(1) + + m := map[string]interface{}{"value": []complex128{val}, "nothing": nil} + assert.Equal(t, val, New(m).Get("value").Complex128Slice()[0]) + assert.Equal(t, val, New(m).Get("value").MustComplex128Slice()[0]) + assert.Equal(t, []complex128(nil), New(m).Get("nothing").Complex128Slice()) + assert.Equal(t, val, New(m).Get("nothing").Complex128Slice([]complex128{complex128(1)})[0]) + assert.Panics(t, func() { + New(m).Get("nothing").MustComplex128Slice() + }) +} + +func TestIsComplex128(t *testing.T) { + v := &Value{data: complex128(1)} + assert.True(t, v.IsComplex128()) + +} + +func TestIsComplex128Slice(t *testing.T) { + v := &Value{data: []complex128{complex128(1)}} + assert.True(t, v.IsComplex128Slice()) +} + +func TestEachComplex128(t *testing.T) { + v := &Value{data: []complex128{complex128(1), complex128(1), complex128(1), complex128(1), complex128(1)}} + count := 0 + replacedVals := make([]complex128, 0) + assert.Equal(t, v, v.EachComplex128(func(i int, val complex128) bool { + count++ + replacedVals = append(replacedVals, val) + + // abort early + return i != 2 + })) + + assert.Equal(t, count, 3) + assert.Equal(t, replacedVals[0], v.MustComplex128Slice()[0]) + assert.Equal(t, replacedVals[1], v.MustComplex128Slice()[1]) + assert.Equal(t, replacedVals[2], v.MustComplex128Slice()[2]) +} + +func TestWhereComplex128(t *testing.T) { + v := &Value{data: []complex128{complex128(1), complex128(1), complex128(1), complex128(1), complex128(1), complex128(1)}} + + selected := v.WhereComplex128(func(i int, val complex128) bool { + return i%2 == 0 + }).MustComplex128Slice() + + assert.Equal(t, 3, len(selected)) +} + +func TestGroupComplex128(t *testing.T) { + v := &Value{data: []complex128{complex128(1), complex128(1), complex128(1), complex128(1), complex128(1), complex128(1)}} + + grouped := v.GroupComplex128(func(i int, val complex128) string { + return fmt.Sprintf("%v", i%2 == 0) + }).data.(map[string][]complex128) + + assert.Equal(t, 2, len(grouped)) + assert.Equal(t, 3, len(grouped["true"])) + assert.Equal(t, 3, len(grouped["false"])) +} + +func TestReplaceComplex128(t *testing.T) { + v := &Value{data: []complex128{complex128(1), complex128(1), complex128(1), complex128(1), complex128(1), complex128(1)}} + + rawArr := v.MustComplex128Slice() + + replaced := v.ReplaceComplex128(func(index int, val complex128) complex128 { + if index < len(rawArr)-1 { + return rawArr[index+1] + } + return rawArr[0] + }) + + replacedArr := replaced.MustComplex128Slice() + if assert.Equal(t, 6, len(replacedArr)) { + assert.Equal(t, replacedArr[0], rawArr[1]) + assert.Equal(t, replacedArr[1], rawArr[2]) + assert.Equal(t, replacedArr[2], rawArr[3]) + assert.Equal(t, replacedArr[3], rawArr[4]) + assert.Equal(t, replacedArr[4], rawArr[5]) + assert.Equal(t, replacedArr[5], rawArr[0]) + } +} + +func TestCollectComplex128(t *testing.T) { + v := &Value{data: []complex128{complex128(1), complex128(1), complex128(1), complex128(1), complex128(1), complex128(1)}} + + collected := v.CollectComplex128(func(index int, val complex128) interface{} { + return index + }) + + collectedArr := collected.MustInterSlice() + if assert.Equal(t, 6, len(collectedArr)) { + assert.Equal(t, collectedArr[0], 0) + assert.Equal(t, collectedArr[1], 1) + assert.Equal(t, collectedArr[2], 2) + assert.Equal(t, collectedArr[3], 3) + assert.Equal(t, collectedArr[4], 4) + assert.Equal(t, collectedArr[5], 5) + } +} diff --git a/api/vendor/github.com/stretchr/objx/value.go b/api/vendor/github.com/stretchr/objx/value.go new file mode 100644 index 0000000..956a221 --- /dev/null +++ b/api/vendor/github.com/stretchr/objx/value.go @@ -0,0 +1,56 @@ +package objx + +import ( + "fmt" + "strconv" +) + +// Value provides methods for extracting interface{} data in various +// types. +type Value struct { + // data contains the raw data being managed by this Value + data interface{} +} + +// Data returns the raw data contained by this Value +func (v *Value) Data() interface{} { + return v.data +} + +// String returns the value always as a string +func (v *Value) String() string { + switch { + case v.IsStr(): + return v.Str() + case v.IsBool(): + return strconv.FormatBool(v.Bool()) + case v.IsFloat32(): + return strconv.FormatFloat(float64(v.Float32()), 'f', -1, 32) + case v.IsFloat64(): + return strconv.FormatFloat(v.Float64(), 'f', -1, 64) + case v.IsInt(): + return strconv.FormatInt(int64(v.Int()), 10) + case v.IsInt(): + return strconv.FormatInt(int64(v.Int()), 10) + case v.IsInt8(): + return strconv.FormatInt(int64(v.Int8()), 10) + case v.IsInt16(): + return strconv.FormatInt(int64(v.Int16()), 10) + case v.IsInt32(): + return strconv.FormatInt(int64(v.Int32()), 10) + case v.IsInt64(): + return strconv.FormatInt(v.Int64(), 10) + case v.IsUint(): + return strconv.FormatUint(uint64(v.Uint()), 10) + case v.IsUint8(): + return strconv.FormatUint(uint64(v.Uint8()), 10) + case v.IsUint16(): + return strconv.FormatUint(uint64(v.Uint16()), 10) + case v.IsUint32(): + return strconv.FormatUint(uint64(v.Uint32()), 10) + case v.IsUint64(): + return strconv.FormatUint(v.Uint64(), 10) + } + + return fmt.Sprintf("%#v", v.Data()) +} diff --git a/api/vendor/github.com/stretchr/objx/value_test.go b/api/vendor/github.com/stretchr/objx/value_test.go new file mode 100644 index 0000000..41fd3a0 --- /dev/null +++ b/api/vendor/github.com/stretchr/objx/value_test.go @@ -0,0 +1,69 @@ +package objx + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestStringTypeString(t *testing.T) { + m := New(map[string]interface{}{"string": "foo"}) + + assert.Equal(t, "foo", m.Get("string").String()) +} + +func TestStringTypeBool(t *testing.T) { + m := New(map[string]interface{}{"bool": true}) + + assert.Equal(t, "true", m.Get("bool").String()) +} + +func TestStringTypeInt(t *testing.T) { + m := New(map[string]interface{}{ + "int": int(1), + "int8": int8(8), + "int16": int16(16), + "int32": int32(32), + "int64": int64(64), + }) + + assert.Equal(t, "1", m.Get("int").String()) + assert.Equal(t, "8", m.Get("int8").String()) + assert.Equal(t, "16", m.Get("int16").String()) + assert.Equal(t, "32", m.Get("int32").String()) + assert.Equal(t, "64", m.Get("int64").String()) +} + +func TestStringTypeUint(t *testing.T) { + m := New(map[string]interface{}{ + "uint": uint(1), + "uint8": uint8(8), + "uint16": uint16(16), + "uint32": uint32(32), + "uint64": uint64(64), + }) + + assert.Equal(t, "1", m.Get("uint").String()) + assert.Equal(t, "8", m.Get("uint8").String()) + assert.Equal(t, "16", m.Get("uint16").String()) + assert.Equal(t, "32", m.Get("uint32").String()) + assert.Equal(t, "64", m.Get("uint64").String()) +} + +func TestStringTypeFloat(t *testing.T) { + m := New(map[string]interface{}{ + "float32": float32(32.32), + "float64": float64(64.64), + }) + + assert.Equal(t, "32.32", m.Get("float32").String()) + assert.Equal(t, "64.64", m.Get("float64").String()) +} + +func TestStringTypeOther(t *testing.T) { + m := New(map[string]interface{}{ + "other": []string{"foo", "bar"}, + }) + + assert.Equal(t, "[]string{\"foo\", \"bar\"}", m.Get("other").String()) +} diff --git a/api/vendor/github.com/stretchr/testify/.gitignore b/api/vendor/github.com/stretchr/testify/.gitignore new file mode 100644 index 0000000..5aacdb7 --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/.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 + +.DS_Store diff --git a/api/vendor/github.com/stretchr/testify/.travis.gofmt.sh b/api/vendor/github.com/stretchr/testify/.travis.gofmt.sh new file mode 100755 index 0000000..bfffdca --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/.travis.gofmt.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +if [ -n "$(gofmt -l .)" ]; then + echo "Go code is not formatted:" + gofmt -d . + exit 1 +fi diff --git a/api/vendor/github.com/stretchr/testify/.travis.gogenerate.sh b/api/vendor/github.com/stretchr/testify/.travis.gogenerate.sh new file mode 100755 index 0000000..161b449 --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/.travis.gogenerate.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +if [[ "$TRAVIS_GO_VERSION" =~ ^1\.[45](\..*)?$ ]]; then + exit 0 +fi + +go get github.com/ernesto-jimenez/gogen/imports +go generate ./... +if [ -n "$(git diff)" ]; then + echo "Go generate had not been run" + git diff + exit 1 +fi diff --git a/api/vendor/github.com/stretchr/testify/.travis.govet.sh b/api/vendor/github.com/stretchr/testify/.travis.govet.sh new file mode 100755 index 0000000..f8fbba7 --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/.travis.govet.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +cd "$(dirname $0)" +DIRS=". assert require mock _codegen" +set -e +for subdir in $DIRS; do + pushd $subdir + go vet + popd +done diff --git a/api/vendor/github.com/stretchr/testify/.travis.yml b/api/vendor/github.com/stretchr/testify/.travis.yml new file mode 100644 index 0000000..6e51e63 --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/.travis.yml @@ -0,0 +1,15 @@ +language: go + +sudo: false + +go: + - 1.7 + - 1.8 + - 1.9 + - tip + +script: + - ./.travis.gogenerate.sh + - ./.travis.gofmt.sh + - ./.travis.govet.sh + - go test -v -race $(go list ./... | grep -v vendor) diff --git a/api/vendor/github.com/stretchr/testify/Gopkg.lock b/api/vendor/github.com/stretchr/testify/Gopkg.lock new file mode 100644 index 0000000..294cda0 --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/Gopkg.lock @@ -0,0 +1,27 @@ +# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. + + +[[projects]] + name = "github.com/davecgh/go-spew" + packages = ["spew"] + revision = "346938d642f2ec3594ed81d874461961cd0faa76" + version = "v1.1.0" + +[[projects]] + name = "github.com/pmezard/go-difflib" + packages = ["difflib"] + revision = "792786c7400a136282c1664665ae0a8db921c6c2" + version = "v1.0.0" + +[[projects]] + name = "github.com/stretchr/objx" + packages = ["."] + revision = "facf9a85c22f48d2f52f2380e4efce1768749a89" + version = "v0.1" + +[solve-meta] + analyzer-name = "dep" + analyzer-version = 1 + inputs-digest = "448ddae4702c6aded2555faafd390c537789bb1c483f70b0431e6634f73f2090" + solver-name = "gps-cdcl" + solver-version = 1 diff --git a/api/vendor/github.com/stretchr/testify/Gopkg.toml b/api/vendor/github.com/stretchr/testify/Gopkg.toml new file mode 100644 index 0000000..a16374c --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/Gopkg.toml @@ -0,0 +1,16 @@ +[prune] + unused-packages = true + non-go = true + go-tests = true + +[[constraint]] + name = "github.com/davecgh/go-spew" + version = "~1.1.0" + +[[constraint]] + name = "github.com/pmezard/go-difflib" + version = "~1.0.0" + +[[constraint]] + name = "github.com/stretchr/objx" + version = "~0.1.0" diff --git a/api/vendor/github.com/stretchr/testify/LICENSE b/api/vendor/github.com/stretchr/testify/LICENSE new file mode 100644 index 0000000..473b670 --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2012 - 2013 Mat Ryer and Tyler Bunnell + +Please consider promoting this project if you find it useful. + +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/api/vendor/github.com/stretchr/testify/README.md b/api/vendor/github.com/stretchr/testify/README.md new file mode 100644 index 0000000..d3b942b --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/README.md @@ -0,0 +1,301 @@ +Testify - Thou Shalt Write Tests +================================ + +[![Build Status](https://travis-ci.org/stretchr/testify.svg)](https://travis-ci.org/stretchr/testify) [![Go Report Card](https://goreportcard.com/badge/github.com/stretchr/testify)](https://goreportcard.com/report/github.com/stretchr/testify) [![GoDoc](https://godoc.org/github.com/stretchr/testify?status.svg)](https://godoc.org/github.com/stretchr/testify) + +Go code (golang) set of packages that provide many tools for testifying that your code will behave as you intend. + +Features include: + + * [Easy assertions](#assert-package) + * [Mocking](#mock-package) + * [Testing suite interfaces and functions](#suite-package) + +Get started: + + * Install testify with [one line of code](#installation), or [update it with another](#staying-up-to-date) + * For an introduction to writing test code in Go, see http://golang.org/doc/code.html#Testing + * Check out the API Documentation http://godoc.org/github.com/stretchr/testify + * To make your testing life easier, check out our other project, [gorc](http://github.com/stretchr/gorc) + * A little about [Test-Driven Development (TDD)](http://en.wikipedia.org/wiki/Test-driven_development) + + + +[`assert`](http://godoc.org/github.com/stretchr/testify/assert "API documentation") package +------------------------------------------------------------------------------------------- + +The `assert` package provides some helpful methods that allow you to write better test code in Go. + + * Prints friendly, easy to read failure descriptions + * Allows for very readable code + * Optionally annotate each assertion with a message + +See it in action: + +```go +package yours + +import ( + "testing" + "github.com/stretchr/testify/assert" +) + +func TestSomething(t *testing.T) { + + // assert equality + assert.Equal(t, 123, 123, "they should be equal") + + // assert inequality + assert.NotEqual(t, 123, 456, "they should not be equal") + + // assert for nil (good for errors) + assert.Nil(t, object) + + // assert for not nil (good when you expect something) + if assert.NotNil(t, object) { + + // now we know that object isn't nil, we are safe to make + // further assertions without causing any errors + assert.Equal(t, "Something", object.Value) + + } + +} +``` + + * Every assert func takes the `testing.T` object as the first argument. This is how it writes the errors out through the normal `go test` capabilities. + * Every assert func returns a bool indicating whether the assertion was successful or not, this is useful for if you want to go on making further assertions under certain conditions. + +if you assert many times, use the below: + +```go +package yours + +import ( + "testing" + "github.com/stretchr/testify/assert" +) + +func TestSomething(t *testing.T) { + assert := assert.New(t) + + // assert equality + assert.Equal(123, 123, "they should be equal") + + // assert inequality + assert.NotEqual(123, 456, "they should not be equal") + + // assert for nil (good for errors) + assert.Nil(object) + + // assert for not nil (good when you expect something) + if assert.NotNil(object) { + + // now we know that object isn't nil, we are safe to make + // further assertions without causing any errors + assert.Equal("Something", object.Value) + } +} +``` + +[`require`](http://godoc.org/github.com/stretchr/testify/require "API documentation") package +--------------------------------------------------------------------------------------------- + +The `require` package provides same global functions as the `assert` package, but instead of returning a boolean result they terminate current test. + +See [t.FailNow](http://golang.org/pkg/testing/#T.FailNow) for details. + +[`mock`](http://godoc.org/github.com/stretchr/testify/mock "API documentation") package +---------------------------------------------------------------------------------------- + +The `mock` package provides a mechanism for easily writing mock objects that can be used in place of real objects when writing test code. + +An example test function that tests a piece of code that relies on an external object `testObj`, can setup expectations (testify) and assert that they indeed happened: + +```go +package yours + +import ( + "testing" + "github.com/stretchr/testify/mock" +) + +/* + Test objects +*/ + +// MyMockedObject is a mocked object that implements an interface +// that describes an object that the code I am testing relies on. +type MyMockedObject struct{ + mock.Mock +} + +// DoSomething is a method on MyMockedObject that implements some interface +// and just records the activity, and returns what the Mock object tells it to. +// +// In the real object, this method would do something useful, but since this +// is a mocked object - we're just going to stub it out. +// +// NOTE: This method is not being tested here, code that uses this object is. +func (m *MyMockedObject) DoSomething(number int) (bool, error) { + + args := m.Called(number) + return args.Bool(0), args.Error(1) + +} + +/* + Actual test functions +*/ + +// TestSomething is an example of how to use our test object to +// make assertions about some target code we are testing. +func TestSomething(t *testing.T) { + + // create an instance of our test object + testObj := new(MyMockedObject) + + // setup expectations + testObj.On("DoSomething", 123).Return(true, nil) + + // call the code we are testing + targetFuncThatDoesSomethingWithObj(testObj) + + // assert that the expectations were met + testObj.AssertExpectations(t) + +} +``` + +For more information on how to write mock code, check out the [API documentation for the `mock` package](http://godoc.org/github.com/stretchr/testify/mock). + +You can use the [mockery tool](http://github.com/vektra/mockery) to autogenerate the mock code against an interface as well, making using mocks much quicker. + +[`suite`](http://godoc.org/github.com/stretchr/testify/suite "API documentation") package +----------------------------------------------------------------------------------------- + +The `suite` package provides functionality that you might be used to from more common object oriented languages. With it, you can build a testing suite as a struct, build setup/teardown methods and testing methods on your struct, and run them with 'go test' as per normal. + +An example suite is shown below: + +```go +// Basic imports +import ( + "testing" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/suite" +) + +// Define the suite, and absorb the built-in basic suite +// functionality from testify - including a T() method which +// returns the current testing context +type ExampleTestSuite struct { + suite.Suite + VariableThatShouldStartAtFive int +} + +// Make sure that VariableThatShouldStartAtFive is set to five +// before each test +func (suite *ExampleTestSuite) SetupTest() { + suite.VariableThatShouldStartAtFive = 5 +} + +// All methods that begin with "Test" are run as tests within a +// suite. +func (suite *ExampleTestSuite) TestExample() { + assert.Equal(suite.T(), 5, suite.VariableThatShouldStartAtFive) +} + +// In order for 'go test' to run this suite, we need to create +// a normal test function and pass our suite to suite.Run +func TestExampleTestSuite(t *testing.T) { + suite.Run(t, new(ExampleTestSuite)) +} +``` + +For a more complete example, using all of the functionality provided by the suite package, look at our [example testing suite](https://github.com/stretchr/testify/blob/master/suite/suite_test.go) + +For more information on writing suites, check out the [API documentation for the `suite` package](http://godoc.org/github.com/stretchr/testify/suite). + +`Suite` object has assertion methods: + +```go +// Basic imports +import ( + "testing" + "github.com/stretchr/testify/suite" +) + +// Define the suite, and absorb the built-in basic suite +// functionality from testify - including assertion methods. +type ExampleTestSuite struct { + suite.Suite + VariableThatShouldStartAtFive int +} + +// Make sure that VariableThatShouldStartAtFive is set to five +// before each test +func (suite *ExampleTestSuite) SetupTest() { + suite.VariableThatShouldStartAtFive = 5 +} + +// All methods that begin with "Test" are run as tests within a +// suite. +func (suite *ExampleTestSuite) TestExample() { + suite.Equal(suite.VariableThatShouldStartAtFive, 5) +} + +// In order for 'go test' to run this suite, we need to create +// a normal test function and pass our suite to suite.Run +func TestExampleTestSuite(t *testing.T) { + suite.Run(t, new(ExampleTestSuite)) +} +``` + +------ + +Installation +============ + +To install Testify, use `go get`: + + go get github.com/stretchr/testify + +This will then make the following packages available to you: + + github.com/stretchr/testify/assert + github.com/stretchr/testify/mock + github.com/stretchr/testify/http + +Import the `testify/assert` package into your code using this template: + +```go +package yours + +import ( + "testing" + "github.com/stretchr/testify/assert" +) + +func TestSomething(t *testing.T) { + + assert.True(t, true, "True is true!") + +} +``` + +------ + +Staying up to date +================== + +To update Testify to the latest version, use `go get -u github.com/stretchr/testify`. + +------ + +Contributing +============ + +Please feel free to submit issues, fork the repository and send pull requests! + +When submitting an issue, we ask that you please include a complete test function that demonstrates the issue. Extra credit for those using Testify to write the test code that demonstrates it. diff --git a/api/vendor/github.com/stretchr/testify/_codegen/main.go b/api/vendor/github.com/stretchr/testify/_codegen/main.go new file mode 100644 index 0000000..2e5e812 --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/_codegen/main.go @@ -0,0 +1,316 @@ +// This program reads all assertion functions from the assert package and +// automatically generates the corresponding requires and forwarded assertions + +package main + +import ( + "bytes" + "flag" + "fmt" + "go/ast" + "go/build" + "go/doc" + "go/format" + "go/importer" + "go/parser" + "go/token" + "go/types" + "io" + "io/ioutil" + "log" + "os" + "path" + "regexp" + "strings" + "text/template" + + "github.com/ernesto-jimenez/gogen/imports" +) + +var ( + pkg = flag.String("assert-path", "github.com/stretchr/testify/assert", "Path to the assert package") + includeF = flag.Bool("include-format-funcs", false, "include format functions such as Errorf and Equalf") + outputPkg = flag.String("output-package", "", "package for the resulting code") + tmplFile = flag.String("template", "", "What file to load the function template from") + out = flag.String("out", "", "What file to write the source code to") +) + +func main() { + flag.Parse() + + scope, docs, err := parsePackageSource(*pkg) + if err != nil { + log.Fatal(err) + } + + importer, funcs, err := analyzeCode(scope, docs) + if err != nil { + log.Fatal(err) + } + + if err := generateCode(importer, funcs); err != nil { + log.Fatal(err) + } +} + +func generateCode(importer imports.Importer, funcs []testFunc) error { + buff := bytes.NewBuffer(nil) + + tmplHead, tmplFunc, err := parseTemplates() + if err != nil { + return err + } + + // Generate header + if err := tmplHead.Execute(buff, struct { + Name string + Imports map[string]string + }{ + *outputPkg, + importer.Imports(), + }); err != nil { + return err + } + + // Generate funcs + for _, fn := range funcs { + buff.Write([]byte("\n\n")) + if err := tmplFunc.Execute(buff, &fn); err != nil { + return err + } + } + + code, err := format.Source(buff.Bytes()) + if err != nil { + return err + } + + // Write file + output, err := outputFile() + if err != nil { + return err + } + defer output.Close() + _, err = io.Copy(output, bytes.NewReader(code)) + return err +} + +func parseTemplates() (*template.Template, *template.Template, error) { + tmplHead, err := template.New("header").Parse(headerTemplate) + if err != nil { + return nil, nil, err + } + if *tmplFile != "" { + f, err := ioutil.ReadFile(*tmplFile) + if err != nil { + return nil, nil, err + } + funcTemplate = string(f) + } + tmpl, err := template.New("function").Parse(funcTemplate) + if err != nil { + return nil, nil, err + } + return tmplHead, tmpl, nil +} + +func outputFile() (*os.File, error) { + filename := *out + if filename == "-" || (filename == "" && *tmplFile == "") { + return os.Stdout, nil + } + if filename == "" { + filename = strings.TrimSuffix(strings.TrimSuffix(*tmplFile, ".tmpl"), ".go") + ".go" + } + return os.Create(filename) +} + +// analyzeCode takes the types scope and the docs and returns the import +// information and information about all the assertion functions. +func analyzeCode(scope *types.Scope, docs *doc.Package) (imports.Importer, []testFunc, error) { + testingT := scope.Lookup("TestingT").Type().Underlying().(*types.Interface) + + importer := imports.New(*outputPkg) + var funcs []testFunc + // Go through all the top level functions + for _, fdocs := range docs.Funcs { + // Find the function + obj := scope.Lookup(fdocs.Name) + + fn, ok := obj.(*types.Func) + if !ok { + continue + } + // Check function signature has at least two arguments + sig := fn.Type().(*types.Signature) + if sig.Params().Len() < 2 { + continue + } + // Check first argument is of type testingT + first, ok := sig.Params().At(0).Type().(*types.Named) + if !ok { + continue + } + firstType, ok := first.Underlying().(*types.Interface) + if !ok { + continue + } + if !types.Implements(firstType, testingT) { + continue + } + + // Skip functions ending with f + if strings.HasSuffix(fdocs.Name, "f") && !*includeF { + continue + } + + funcs = append(funcs, testFunc{*outputPkg, fdocs, fn}) + importer.AddImportsFrom(sig.Params()) + } + return importer, funcs, nil +} + +// parsePackageSource returns the types scope and the package documentation from the package +func parsePackageSource(pkg string) (*types.Scope, *doc.Package, error) { + pd, err := build.Import(pkg, ".", 0) + if err != nil { + return nil, nil, err + } + + fset := token.NewFileSet() + files := make(map[string]*ast.File) + fileList := make([]*ast.File, len(pd.GoFiles)) + for i, fname := range pd.GoFiles { + src, err := ioutil.ReadFile(path.Join(pd.SrcRoot, pd.ImportPath, fname)) + if err != nil { + return nil, nil, err + } + f, err := parser.ParseFile(fset, fname, src, parser.ParseComments|parser.AllErrors) + if err != nil { + return nil, nil, err + } + files[fname] = f + fileList[i] = f + } + + cfg := types.Config{ + Importer: importer.Default(), + } + info := types.Info{ + Defs: make(map[*ast.Ident]types.Object), + } + tp, err := cfg.Check(pkg, fset, fileList, &info) + if err != nil { + return nil, nil, err + } + + scope := tp.Scope() + + ap, _ := ast.NewPackage(fset, files, nil, nil) + docs := doc.New(ap, pkg, 0) + + return scope, docs, nil +} + +type testFunc struct { + CurrentPkg string + DocInfo *doc.Func + TypeInfo *types.Func +} + +func (f *testFunc) Qualifier(p *types.Package) string { + if p == nil || p.Name() == f.CurrentPkg { + return "" + } + return p.Name() +} + +func (f *testFunc) Params() string { + sig := f.TypeInfo.Type().(*types.Signature) + params := sig.Params() + p := "" + comma := "" + to := params.Len() + var i int + + if sig.Variadic() { + to-- + } + for i = 1; i < to; i++ { + param := params.At(i) + p += fmt.Sprintf("%s%s %s", comma, param.Name(), types.TypeString(param.Type(), f.Qualifier)) + comma = ", " + } + if sig.Variadic() { + param := params.At(params.Len() - 1) + p += fmt.Sprintf("%s%s ...%s", comma, param.Name(), types.TypeString(param.Type().(*types.Slice).Elem(), f.Qualifier)) + } + return p +} + +func (f *testFunc) ForwardedParams() string { + sig := f.TypeInfo.Type().(*types.Signature) + params := sig.Params() + p := "" + comma := "" + to := params.Len() + var i int + + if sig.Variadic() { + to-- + } + for i = 1; i < to; i++ { + param := params.At(i) + p += fmt.Sprintf("%s%s", comma, param.Name()) + comma = ", " + } + if sig.Variadic() { + param := params.At(params.Len() - 1) + p += fmt.Sprintf("%s%s...", comma, param.Name()) + } + return p +} + +func (f *testFunc) ParamsFormat() string { + return strings.Replace(f.Params(), "msgAndArgs", "msg string, args", 1) +} + +func (f *testFunc) ForwardedParamsFormat() string { + return strings.Replace(f.ForwardedParams(), "msgAndArgs", "append([]interface{}{msg}, args...)", 1) +} + +func (f *testFunc) Comment() string { + return "// " + strings.Replace(strings.TrimSpace(f.DocInfo.Doc), "\n", "\n// ", -1) +} + +func (f *testFunc) CommentFormat() string { + search := fmt.Sprintf("%s", f.DocInfo.Name) + replace := fmt.Sprintf("%sf", f.DocInfo.Name) + comment := strings.Replace(f.Comment(), search, replace, -1) + exp := regexp.MustCompile(replace + `\(((\(\)|[^)])+)\)`) + return exp.ReplaceAllString(comment, replace+`($1, "error message %s", "formatted")`) +} + +func (f *testFunc) CommentWithoutT(receiver string) string { + search := fmt.Sprintf("assert.%s(t, ", f.DocInfo.Name) + replace := fmt.Sprintf("%s.%s(", receiver, f.DocInfo.Name) + return strings.Replace(f.Comment(), search, replace, -1) +} + +var headerTemplate = `/* +* CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen +* THIS FILE MUST NOT BE EDITED BY HAND +*/ + +package {{.Name}} + +import ( +{{range $path, $name := .Imports}} + {{$name}} "{{$path}}"{{end}} +) +` + +var funcTemplate = `{{.Comment}} +func (fwd *AssertionsForwarder) {{.DocInfo.Name}}({{.Params}}) bool { + return assert.{{.DocInfo.Name}}({{.ForwardedParams}}) +}` diff --git a/api/vendor/github.com/stretchr/testify/assert/assertion_format.go b/api/vendor/github.com/stretchr/testify/assert/assertion_format.go new file mode 100644 index 0000000..ae06a54 --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/assert/assertion_format.go @@ -0,0 +1,349 @@ +/* +* CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen +* THIS FILE MUST NOT BE EDITED BY HAND + */ + +package assert + +import ( + http "net/http" + url "net/url" + time "time" +) + +// Conditionf uses a Comparison to assert a complex condition. +func Conditionf(t TestingT, comp Comparison, msg string, args ...interface{}) bool { + return Condition(t, comp, append([]interface{}{msg}, args...)...) +} + +// Containsf asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// assert.Containsf(t, "Hello World", "World", "error message %s", "formatted") +// assert.Containsf(t, ["Hello", "World"], "World", "error message %s", "formatted") +// assert.Containsf(t, {"Hello": "World"}, "Hello", "error message %s", "formatted") +func Containsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) bool { + return Contains(t, s, contains, append([]interface{}{msg}, args...)...) +} + +// DirExistsf checks whether a directory exists in the given path. It also fails if the path is a file rather a directory or there is an error checking whether it exists. +func DirExistsf(t TestingT, path string, msg string, args ...interface{}) bool { + return DirExists(t, path, append([]interface{}{msg}, args...)...) +} + +// ElementsMatchf asserts that the specified listA(array, slice...) is equal to specified +// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, +// the number of appearances of each of them in both lists should match. +// +// assert.ElementsMatchf(t, [1, 3, 2, 3], [1, 3, 3, 2], "error message %s", "formatted") +func ElementsMatchf(t TestingT, listA interface{}, listB interface{}, msg string, args ...interface{}) bool { + return ElementsMatch(t, listA, listB, append([]interface{}{msg}, args...)...) +} + +// Emptyf asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// assert.Emptyf(t, obj, "error message %s", "formatted") +func Emptyf(t TestingT, object interface{}, msg string, args ...interface{}) bool { + return Empty(t, object, append([]interface{}{msg}, args...)...) +} + +// Equalf asserts that two objects are equal. +// +// assert.Equalf(t, 123, 123, "error message %s", "formatted") +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func Equalf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + return Equal(t, expected, actual, append([]interface{}{msg}, args...)...) +} + +// EqualErrorf asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// assert.EqualErrorf(t, err, expectedErrorString, "error message %s", "formatted") +func EqualErrorf(t TestingT, theError error, errString string, msg string, args ...interface{}) bool { + return EqualError(t, theError, errString, append([]interface{}{msg}, args...)...) +} + +// EqualValuesf asserts that two objects are equal or convertable to the same types +// and equal. +// +// assert.EqualValuesf(t, uint32(123, "error message %s", "formatted"), int32(123)) +func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + return EqualValues(t, expected, actual, append([]interface{}{msg}, args...)...) +} + +// Errorf asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if assert.Errorf(t, err, "error message %s", "formatted") { +// assert.Equal(t, expectedErrorf, err) +// } +func Errorf(t TestingT, err error, msg string, args ...interface{}) bool { + return Error(t, err, append([]interface{}{msg}, args...)...) +} + +// Exactlyf asserts that two objects are equal in value and type. +// +// assert.Exactlyf(t, int32(123, "error message %s", "formatted"), int64(123)) +func Exactlyf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + return Exactly(t, expected, actual, append([]interface{}{msg}, args...)...) +} + +// Failf reports a failure through +func Failf(t TestingT, failureMessage string, msg string, args ...interface{}) bool { + return Fail(t, failureMessage, append([]interface{}{msg}, args...)...) +} + +// FailNowf fails test +func FailNowf(t TestingT, failureMessage string, msg string, args ...interface{}) bool { + return FailNow(t, failureMessage, append([]interface{}{msg}, args...)...) +} + +// Falsef asserts that the specified value is false. +// +// assert.Falsef(t, myBool, "error message %s", "formatted") +func Falsef(t TestingT, value bool, msg string, args ...interface{}) bool { + return False(t, value, append([]interface{}{msg}, args...)...) +} + +// FileExistsf checks whether a file exists in the given path. It also fails if the path points to a directory or there is an error when trying to check the file. +func FileExistsf(t TestingT, path string, msg string, args ...interface{}) bool { + return FileExists(t, path, append([]interface{}{msg}, args...)...) +} + +// HTTPBodyContainsf asserts that a specified handler returns a +// body that contains a string. +// +// assert.HTTPBodyContainsf(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool { + return HTTPBodyContains(t, handler, method, url, values, str, append([]interface{}{msg}, args...)...) +} + +// HTTPBodyNotContainsf asserts that a specified handler returns a +// body that does not contain a string. +// +// assert.HTTPBodyNotContainsf(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool { + return HTTPBodyNotContains(t, handler, method, url, values, str, append([]interface{}{msg}, args...)...) +} + +// HTTPErrorf asserts that a specified handler returns an error status code. +// +// assert.HTTPErrorf(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { + return HTTPError(t, handler, method, url, values, append([]interface{}{msg}, args...)...) +} + +// HTTPRedirectf asserts that a specified handler returns a redirect status code. +// +// assert.HTTPRedirectf(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { + return HTTPRedirect(t, handler, method, url, values, append([]interface{}{msg}, args...)...) +} + +// HTTPSuccessf asserts that a specified handler returns a success status code. +// +// assert.HTTPSuccessf(t, myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { + return HTTPSuccess(t, handler, method, url, values, append([]interface{}{msg}, args...)...) +} + +// Implementsf asserts that an object is implemented by the specified interface. +// +// assert.Implementsf(t, (*MyInterface, "error message %s", "formatted")(nil), new(MyObject)) +func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool { + return Implements(t, interfaceObject, object, append([]interface{}{msg}, args...)...) +} + +// InDeltaf asserts that the two numerals are within delta of each other. +// +// assert.InDeltaf(t, math.Pi, (22 / 7.0, "error message %s", "formatted"), 0.01) +func InDeltaf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { + return InDelta(t, expected, actual, delta, append([]interface{}{msg}, args...)...) +} + +// InDeltaMapValuesf is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys. +func InDeltaMapValuesf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { + return InDeltaMapValues(t, expected, actual, delta, append([]interface{}{msg}, args...)...) +} + +// InDeltaSlicef is the same as InDelta, except it compares two slices. +func InDeltaSlicef(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { + return InDeltaSlice(t, expected, actual, delta, append([]interface{}{msg}, args...)...) +} + +// InEpsilonf asserts that expected and actual have a relative error less than epsilon +func InEpsilonf(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool { + return InEpsilon(t, expected, actual, epsilon, append([]interface{}{msg}, args...)...) +} + +// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices. +func InEpsilonSlicef(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool { + return InEpsilonSlice(t, expected, actual, epsilon, append([]interface{}{msg}, args...)...) +} + +// IsTypef asserts that the specified objects are of the same type. +func IsTypef(t TestingT, expectedType interface{}, object interface{}, msg string, args ...interface{}) bool { + return IsType(t, expectedType, object, append([]interface{}{msg}, args...)...) +} + +// JSONEqf asserts that two JSON strings are equivalent. +// +// assert.JSONEqf(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted") +func JSONEqf(t TestingT, expected string, actual string, msg string, args ...interface{}) bool { + return JSONEq(t, expected, actual, append([]interface{}{msg}, args...)...) +} + +// Lenf asserts that the specified object has specific length. +// Lenf also fails if the object has a type that len() not accept. +// +// assert.Lenf(t, mySlice, 3, "error message %s", "formatted") +func Lenf(t TestingT, object interface{}, length int, msg string, args ...interface{}) bool { + return Len(t, object, length, append([]interface{}{msg}, args...)...) +} + +// Nilf asserts that the specified object is nil. +// +// assert.Nilf(t, err, "error message %s", "formatted") +func Nilf(t TestingT, object interface{}, msg string, args ...interface{}) bool { + return Nil(t, object, append([]interface{}{msg}, args...)...) +} + +// NoErrorf asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if assert.NoErrorf(t, err, "error message %s", "formatted") { +// assert.Equal(t, expectedObj, actualObj) +// } +func NoErrorf(t TestingT, err error, msg string, args ...interface{}) bool { + return NoError(t, err, append([]interface{}{msg}, args...)...) +} + +// NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// assert.NotContainsf(t, "Hello World", "Earth", "error message %s", "formatted") +// assert.NotContainsf(t, ["Hello", "World"], "Earth", "error message %s", "formatted") +// assert.NotContainsf(t, {"Hello": "World"}, "Earth", "error message %s", "formatted") +func NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) bool { + return NotContains(t, s, contains, append([]interface{}{msg}, args...)...) +} + +// NotEmptyf asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if assert.NotEmptyf(t, obj, "error message %s", "formatted") { +// assert.Equal(t, "two", obj[1]) +// } +func NotEmptyf(t TestingT, object interface{}, msg string, args ...interface{}) bool { + return NotEmpty(t, object, append([]interface{}{msg}, args...)...) +} + +// NotEqualf asserts that the specified values are NOT equal. +// +// assert.NotEqualf(t, obj1, obj2, "error message %s", "formatted") +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func NotEqualf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + return NotEqual(t, expected, actual, append([]interface{}{msg}, args...)...) +} + +// NotNilf asserts that the specified object is not nil. +// +// assert.NotNilf(t, err, "error message %s", "formatted") +func NotNilf(t TestingT, object interface{}, msg string, args ...interface{}) bool { + return NotNil(t, object, append([]interface{}{msg}, args...)...) +} + +// NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// assert.NotPanicsf(t, func(){ RemainCalm() }, "error message %s", "formatted") +func NotPanicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bool { + return NotPanics(t, f, append([]interface{}{msg}, args...)...) +} + +// NotRegexpf asserts that a specified regexp does not match a string. +// +// assert.NotRegexpf(t, regexp.MustCompile("starts", "error message %s", "formatted"), "it's starting") +// assert.NotRegexpf(t, "^start", "it's not starting", "error message %s", "formatted") +func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) bool { + return NotRegexp(t, rx, str, append([]interface{}{msg}, args...)...) +} + +// NotSubsetf asserts that the specified list(array, slice...) contains not all +// elements given in the specified subset(array, slice...). +// +// assert.NotSubsetf(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted") +func NotSubsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) bool { + return NotSubset(t, list, subset, append([]interface{}{msg}, args...)...) +} + +// NotZerof asserts that i is not the zero value for its type. +func NotZerof(t TestingT, i interface{}, msg string, args ...interface{}) bool { + return NotZero(t, i, append([]interface{}{msg}, args...)...) +} + +// Panicsf asserts that the code inside the specified PanicTestFunc panics. +// +// assert.Panicsf(t, func(){ GoCrazy() }, "error message %s", "formatted") +func Panicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bool { + return Panics(t, f, append([]interface{}{msg}, args...)...) +} + +// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// assert.PanicsWithValuef(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +func PanicsWithValuef(t TestingT, expected interface{}, f PanicTestFunc, msg string, args ...interface{}) bool { + return PanicsWithValue(t, expected, f, append([]interface{}{msg}, args...)...) +} + +// Regexpf asserts that a specified regexp matches a string. +// +// assert.Regexpf(t, regexp.MustCompile("start", "error message %s", "formatted"), "it's starting") +// assert.Regexpf(t, "start...$", "it's not starting", "error message %s", "formatted") +func Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) bool { + return Regexp(t, rx, str, append([]interface{}{msg}, args...)...) +} + +// Subsetf asserts that the specified list(array, slice...) contains all +// elements given in the specified subset(array, slice...). +// +// assert.Subsetf(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted") +func Subsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) bool { + return Subset(t, list, subset, append([]interface{}{msg}, args...)...) +} + +// Truef asserts that the specified value is true. +// +// assert.Truef(t, myBool, "error message %s", "formatted") +func Truef(t TestingT, value bool, msg string, args ...interface{}) bool { + return True(t, value, append([]interface{}{msg}, args...)...) +} + +// WithinDurationf asserts that the two times are within duration delta of each other. +// +// assert.WithinDurationf(t, time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted") +func WithinDurationf(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) bool { + return WithinDuration(t, expected, actual, delta, append([]interface{}{msg}, args...)...) +} + +// Zerof asserts that i is the zero value for its type. +func Zerof(t TestingT, i interface{}, msg string, args ...interface{}) bool { + return Zero(t, i, append([]interface{}{msg}, args...)...) +} diff --git a/api/vendor/github.com/stretchr/testify/assert/assertion_format.go.tmpl b/api/vendor/github.com/stretchr/testify/assert/assertion_format.go.tmpl new file mode 100644 index 0000000..c5cc66f --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/assert/assertion_format.go.tmpl @@ -0,0 +1,4 @@ +{{.CommentFormat}} +func {{.DocInfo.Name}}f(t TestingT, {{.ParamsFormat}}) bool { + return {{.DocInfo.Name}}(t, {{.ForwardedParamsFormat}}) +} diff --git a/api/vendor/github.com/stretchr/testify/assert/assertion_forward.go b/api/vendor/github.com/stretchr/testify/assert/assertion_forward.go new file mode 100644 index 0000000..ffa5428 --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/assert/assertion_forward.go @@ -0,0 +1,686 @@ +/* +* CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen +* THIS FILE MUST NOT BE EDITED BY HAND + */ + +package assert + +import ( + http "net/http" + url "net/url" + time "time" +) + +// Condition uses a Comparison to assert a complex condition. +func (a *Assertions) Condition(comp Comparison, msgAndArgs ...interface{}) bool { + return Condition(a.t, comp, msgAndArgs...) +} + +// Conditionf uses a Comparison to assert a complex condition. +func (a *Assertions) Conditionf(comp Comparison, msg string, args ...interface{}) bool { + return Conditionf(a.t, comp, msg, args...) +} + +// Contains asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// a.Contains("Hello World", "World") +// a.Contains(["Hello", "World"], "World") +// a.Contains({"Hello": "World"}, "Hello") +func (a *Assertions) Contains(s interface{}, contains interface{}, msgAndArgs ...interface{}) bool { + return Contains(a.t, s, contains, msgAndArgs...) +} + +// Containsf asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// a.Containsf("Hello World", "World", "error message %s", "formatted") +// a.Containsf(["Hello", "World"], "World", "error message %s", "formatted") +// a.Containsf({"Hello": "World"}, "Hello", "error message %s", "formatted") +func (a *Assertions) Containsf(s interface{}, contains interface{}, msg string, args ...interface{}) bool { + return Containsf(a.t, s, contains, msg, args...) +} + +// DirExists checks whether a directory exists in the given path. It also fails if the path is a file rather a directory or there is an error checking whether it exists. +func (a *Assertions) DirExists(path string, msgAndArgs ...interface{}) bool { + return DirExists(a.t, path, msgAndArgs...) +} + +// DirExistsf checks whether a directory exists in the given path. It also fails if the path is a file rather a directory or there is an error checking whether it exists. +func (a *Assertions) DirExistsf(path string, msg string, args ...interface{}) bool { + return DirExistsf(a.t, path, msg, args...) +} + +// ElementsMatch asserts that the specified listA(array, slice...) is equal to specified +// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, +// the number of appearances of each of them in both lists should match. +// +// a.ElementsMatch([1, 3, 2, 3], [1, 3, 3, 2]) +func (a *Assertions) ElementsMatch(listA interface{}, listB interface{}, msgAndArgs ...interface{}) bool { + return ElementsMatch(a.t, listA, listB, msgAndArgs...) +} + +// ElementsMatchf asserts that the specified listA(array, slice...) is equal to specified +// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, +// the number of appearances of each of them in both lists should match. +// +// a.ElementsMatchf([1, 3, 2, 3], [1, 3, 3, 2], "error message %s", "formatted") +func (a *Assertions) ElementsMatchf(listA interface{}, listB interface{}, msg string, args ...interface{}) bool { + return ElementsMatchf(a.t, listA, listB, msg, args...) +} + +// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// a.Empty(obj) +func (a *Assertions) Empty(object interface{}, msgAndArgs ...interface{}) bool { + return Empty(a.t, object, msgAndArgs...) +} + +// Emptyf asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// a.Emptyf(obj, "error message %s", "formatted") +func (a *Assertions) Emptyf(object interface{}, msg string, args ...interface{}) bool { + return Emptyf(a.t, object, msg, args...) +} + +// Equal asserts that two objects are equal. +// +// a.Equal(123, 123) +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func (a *Assertions) Equal(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { + return Equal(a.t, expected, actual, msgAndArgs...) +} + +// EqualError asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// a.EqualError(err, expectedErrorString) +func (a *Assertions) EqualError(theError error, errString string, msgAndArgs ...interface{}) bool { + return EqualError(a.t, theError, errString, msgAndArgs...) +} + +// EqualErrorf asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// a.EqualErrorf(err, expectedErrorString, "error message %s", "formatted") +func (a *Assertions) EqualErrorf(theError error, errString string, msg string, args ...interface{}) bool { + return EqualErrorf(a.t, theError, errString, msg, args...) +} + +// EqualValues asserts that two objects are equal or convertable to the same types +// and equal. +// +// a.EqualValues(uint32(123), int32(123)) +func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { + return EqualValues(a.t, expected, actual, msgAndArgs...) +} + +// EqualValuesf asserts that two objects are equal or convertable to the same types +// and equal. +// +// a.EqualValuesf(uint32(123, "error message %s", "formatted"), int32(123)) +func (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + return EqualValuesf(a.t, expected, actual, msg, args...) +} + +// Equalf asserts that two objects are equal. +// +// a.Equalf(123, 123, "error message %s", "formatted") +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func (a *Assertions) Equalf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + return Equalf(a.t, expected, actual, msg, args...) +} + +// Error asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if a.Error(err) { +// assert.Equal(t, expectedError, err) +// } +func (a *Assertions) Error(err error, msgAndArgs ...interface{}) bool { + return Error(a.t, err, msgAndArgs...) +} + +// Errorf asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if a.Errorf(err, "error message %s", "formatted") { +// assert.Equal(t, expectedErrorf, err) +// } +func (a *Assertions) Errorf(err error, msg string, args ...interface{}) bool { + return Errorf(a.t, err, msg, args...) +} + +// Exactly asserts that two objects are equal in value and type. +// +// a.Exactly(int32(123), int64(123)) +func (a *Assertions) Exactly(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { + return Exactly(a.t, expected, actual, msgAndArgs...) +} + +// Exactlyf asserts that two objects are equal in value and type. +// +// a.Exactlyf(int32(123, "error message %s", "formatted"), int64(123)) +func (a *Assertions) Exactlyf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + return Exactlyf(a.t, expected, actual, msg, args...) +} + +// Fail reports a failure through +func (a *Assertions) Fail(failureMessage string, msgAndArgs ...interface{}) bool { + return Fail(a.t, failureMessage, msgAndArgs...) +} + +// FailNow fails test +func (a *Assertions) FailNow(failureMessage string, msgAndArgs ...interface{}) bool { + return FailNow(a.t, failureMessage, msgAndArgs...) +} + +// FailNowf fails test +func (a *Assertions) FailNowf(failureMessage string, msg string, args ...interface{}) bool { + return FailNowf(a.t, failureMessage, msg, args...) +} + +// Failf reports a failure through +func (a *Assertions) Failf(failureMessage string, msg string, args ...interface{}) bool { + return Failf(a.t, failureMessage, msg, args...) +} + +// False asserts that the specified value is false. +// +// a.False(myBool) +func (a *Assertions) False(value bool, msgAndArgs ...interface{}) bool { + return False(a.t, value, msgAndArgs...) +} + +// Falsef asserts that the specified value is false. +// +// a.Falsef(myBool, "error message %s", "formatted") +func (a *Assertions) Falsef(value bool, msg string, args ...interface{}) bool { + return Falsef(a.t, value, msg, args...) +} + +// FileExists checks whether a file exists in the given path. It also fails if the path points to a directory or there is an error when trying to check the file. +func (a *Assertions) FileExists(path string, msgAndArgs ...interface{}) bool { + return FileExists(a.t, path, msgAndArgs...) +} + +// FileExistsf checks whether a file exists in the given path. It also fails if the path points to a directory or there is an error when trying to check the file. +func (a *Assertions) FileExistsf(path string, msg string, args ...interface{}) bool { + return FileExistsf(a.t, path, msg, args...) +} + +// HTTPBodyContains asserts that a specified handler returns a +// body that contains a string. +// +// a.HTTPBodyContains(myHandler, "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool { + return HTTPBodyContains(a.t, handler, method, url, values, str, msgAndArgs...) +} + +// HTTPBodyContainsf asserts that a specified handler returns a +// body that contains a string. +// +// a.HTTPBodyContainsf(myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool { + return HTTPBodyContainsf(a.t, handler, method, url, values, str, msg, args...) +} + +// HTTPBodyNotContains asserts that a specified handler returns a +// body that does not contain a string. +// +// a.HTTPBodyNotContains(myHandler, "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyNotContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool { + return HTTPBodyNotContains(a.t, handler, method, url, values, str, msgAndArgs...) +} + +// HTTPBodyNotContainsf asserts that a specified handler returns a +// body that does not contain a string. +// +// a.HTTPBodyNotContainsf(myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyNotContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool { + return HTTPBodyNotContainsf(a.t, handler, method, url, values, str, msg, args...) +} + +// HTTPError asserts that a specified handler returns an error status code. +// +// a.HTTPError(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) bool { + return HTTPError(a.t, handler, method, url, values, msgAndArgs...) +} + +// HTTPErrorf asserts that a specified handler returns an error status code. +// +// a.HTTPErrorf(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +func (a *Assertions) HTTPErrorf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { + return HTTPErrorf(a.t, handler, method, url, values, msg, args...) +} + +// HTTPRedirect asserts that a specified handler returns a redirect status code. +// +// a.HTTPRedirect(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) bool { + return HTTPRedirect(a.t, handler, method, url, values, msgAndArgs...) +} + +// HTTPRedirectf asserts that a specified handler returns a redirect status code. +// +// a.HTTPRedirectf(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +func (a *Assertions) HTTPRedirectf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { + return HTTPRedirectf(a.t, handler, method, url, values, msg, args...) +} + +// HTTPSuccess asserts that a specified handler returns a success status code. +// +// a.HTTPSuccess(myHandler, "POST", "http://www.google.com", nil) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPSuccess(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) bool { + return HTTPSuccess(a.t, handler, method, url, values, msgAndArgs...) +} + +// HTTPSuccessf asserts that a specified handler returns a success status code. +// +// a.HTTPSuccessf(myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPSuccessf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { + return HTTPSuccessf(a.t, handler, method, url, values, msg, args...) +} + +// Implements asserts that an object is implemented by the specified interface. +// +// a.Implements((*MyInterface)(nil), new(MyObject)) +func (a *Assertions) Implements(interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool { + return Implements(a.t, interfaceObject, object, msgAndArgs...) +} + +// Implementsf asserts that an object is implemented by the specified interface. +// +// a.Implementsf((*MyInterface, "error message %s", "formatted")(nil), new(MyObject)) +func (a *Assertions) Implementsf(interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool { + return Implementsf(a.t, interfaceObject, object, msg, args...) +} + +// InDelta asserts that the two numerals are within delta of each other. +// +// a.InDelta(math.Pi, (22 / 7.0), 0.01) +func (a *Assertions) InDelta(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { + return InDelta(a.t, expected, actual, delta, msgAndArgs...) +} + +// InDeltaMapValues is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys. +func (a *Assertions) InDeltaMapValues(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { + return InDeltaMapValues(a.t, expected, actual, delta, msgAndArgs...) +} + +// InDeltaMapValuesf is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys. +func (a *Assertions) InDeltaMapValuesf(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { + return InDeltaMapValuesf(a.t, expected, actual, delta, msg, args...) +} + +// InDeltaSlice is the same as InDelta, except it compares two slices. +func (a *Assertions) InDeltaSlice(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { + return InDeltaSlice(a.t, expected, actual, delta, msgAndArgs...) +} + +// InDeltaSlicef is the same as InDelta, except it compares two slices. +func (a *Assertions) InDeltaSlicef(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { + return InDeltaSlicef(a.t, expected, actual, delta, msg, args...) +} + +// InDeltaf asserts that the two numerals are within delta of each other. +// +// a.InDeltaf(math.Pi, (22 / 7.0, "error message %s", "formatted"), 0.01) +func (a *Assertions) InDeltaf(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { + return InDeltaf(a.t, expected, actual, delta, msg, args...) +} + +// InEpsilon asserts that expected and actual have a relative error less than epsilon +func (a *Assertions) InEpsilon(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool { + return InEpsilon(a.t, expected, actual, epsilon, msgAndArgs...) +} + +// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices. +func (a *Assertions) InEpsilonSlice(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool { + return InEpsilonSlice(a.t, expected, actual, epsilon, msgAndArgs...) +} + +// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices. +func (a *Assertions) InEpsilonSlicef(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool { + return InEpsilonSlicef(a.t, expected, actual, epsilon, msg, args...) +} + +// InEpsilonf asserts that expected and actual have a relative error less than epsilon +func (a *Assertions) InEpsilonf(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool { + return InEpsilonf(a.t, expected, actual, epsilon, msg, args...) +} + +// IsType asserts that the specified objects are of the same type. +func (a *Assertions) IsType(expectedType interface{}, object interface{}, msgAndArgs ...interface{}) bool { + return IsType(a.t, expectedType, object, msgAndArgs...) +} + +// IsTypef asserts that the specified objects are of the same type. +func (a *Assertions) IsTypef(expectedType interface{}, object interface{}, msg string, args ...interface{}) bool { + return IsTypef(a.t, expectedType, object, msg, args...) +} + +// JSONEq asserts that two JSON strings are equivalent. +// +// a.JSONEq(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) +func (a *Assertions) JSONEq(expected string, actual string, msgAndArgs ...interface{}) bool { + return JSONEq(a.t, expected, actual, msgAndArgs...) +} + +// JSONEqf asserts that two JSON strings are equivalent. +// +// a.JSONEqf(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted") +func (a *Assertions) JSONEqf(expected string, actual string, msg string, args ...interface{}) bool { + return JSONEqf(a.t, expected, actual, msg, args...) +} + +// Len asserts that the specified object has specific length. +// Len also fails if the object has a type that len() not accept. +// +// a.Len(mySlice, 3) +func (a *Assertions) Len(object interface{}, length int, msgAndArgs ...interface{}) bool { + return Len(a.t, object, length, msgAndArgs...) +} + +// Lenf asserts that the specified object has specific length. +// Lenf also fails if the object has a type that len() not accept. +// +// a.Lenf(mySlice, 3, "error message %s", "formatted") +func (a *Assertions) Lenf(object interface{}, length int, msg string, args ...interface{}) bool { + return Lenf(a.t, object, length, msg, args...) +} + +// Nil asserts that the specified object is nil. +// +// a.Nil(err) +func (a *Assertions) Nil(object interface{}, msgAndArgs ...interface{}) bool { + return Nil(a.t, object, msgAndArgs...) +} + +// Nilf asserts that the specified object is nil. +// +// a.Nilf(err, "error message %s", "formatted") +func (a *Assertions) Nilf(object interface{}, msg string, args ...interface{}) bool { + return Nilf(a.t, object, msg, args...) +} + +// NoError asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if a.NoError(err) { +// assert.Equal(t, expectedObj, actualObj) +// } +func (a *Assertions) NoError(err error, msgAndArgs ...interface{}) bool { + return NoError(a.t, err, msgAndArgs...) +} + +// NoErrorf asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if a.NoErrorf(err, "error message %s", "formatted") { +// assert.Equal(t, expectedObj, actualObj) +// } +func (a *Assertions) NoErrorf(err error, msg string, args ...interface{}) bool { + return NoErrorf(a.t, err, msg, args...) +} + +// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// a.NotContains("Hello World", "Earth") +// a.NotContains(["Hello", "World"], "Earth") +// a.NotContains({"Hello": "World"}, "Earth") +func (a *Assertions) NotContains(s interface{}, contains interface{}, msgAndArgs ...interface{}) bool { + return NotContains(a.t, s, contains, msgAndArgs...) +} + +// NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// a.NotContainsf("Hello World", "Earth", "error message %s", "formatted") +// a.NotContainsf(["Hello", "World"], "Earth", "error message %s", "formatted") +// a.NotContainsf({"Hello": "World"}, "Earth", "error message %s", "formatted") +func (a *Assertions) NotContainsf(s interface{}, contains interface{}, msg string, args ...interface{}) bool { + return NotContainsf(a.t, s, contains, msg, args...) +} + +// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if a.NotEmpty(obj) { +// assert.Equal(t, "two", obj[1]) +// } +func (a *Assertions) NotEmpty(object interface{}, msgAndArgs ...interface{}) bool { + return NotEmpty(a.t, object, msgAndArgs...) +} + +// NotEmptyf asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if a.NotEmptyf(obj, "error message %s", "formatted") { +// assert.Equal(t, "two", obj[1]) +// } +func (a *Assertions) NotEmptyf(object interface{}, msg string, args ...interface{}) bool { + return NotEmptyf(a.t, object, msg, args...) +} + +// NotEqual asserts that the specified values are NOT equal. +// +// a.NotEqual(obj1, obj2) +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func (a *Assertions) NotEqual(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { + return NotEqual(a.t, expected, actual, msgAndArgs...) +} + +// NotEqualf asserts that the specified values are NOT equal. +// +// a.NotEqualf(obj1, obj2, "error message %s", "formatted") +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func (a *Assertions) NotEqualf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + return NotEqualf(a.t, expected, actual, msg, args...) +} + +// NotNil asserts that the specified object is not nil. +// +// a.NotNil(err) +func (a *Assertions) NotNil(object interface{}, msgAndArgs ...interface{}) bool { + return NotNil(a.t, object, msgAndArgs...) +} + +// NotNilf asserts that the specified object is not nil. +// +// a.NotNilf(err, "error message %s", "formatted") +func (a *Assertions) NotNilf(object interface{}, msg string, args ...interface{}) bool { + return NotNilf(a.t, object, msg, args...) +} + +// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// a.NotPanics(func(){ RemainCalm() }) +func (a *Assertions) NotPanics(f PanicTestFunc, msgAndArgs ...interface{}) bool { + return NotPanics(a.t, f, msgAndArgs...) +} + +// NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// a.NotPanicsf(func(){ RemainCalm() }, "error message %s", "formatted") +func (a *Assertions) NotPanicsf(f PanicTestFunc, msg string, args ...interface{}) bool { + return NotPanicsf(a.t, f, msg, args...) +} + +// NotRegexp asserts that a specified regexp does not match a string. +// +// a.NotRegexp(regexp.MustCompile("starts"), "it's starting") +// a.NotRegexp("^start", "it's not starting") +func (a *Assertions) NotRegexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { + return NotRegexp(a.t, rx, str, msgAndArgs...) +} + +// NotRegexpf asserts that a specified regexp does not match a string. +// +// a.NotRegexpf(regexp.MustCompile("starts", "error message %s", "formatted"), "it's starting") +// a.NotRegexpf("^start", "it's not starting", "error message %s", "formatted") +func (a *Assertions) NotRegexpf(rx interface{}, str interface{}, msg string, args ...interface{}) bool { + return NotRegexpf(a.t, rx, str, msg, args...) +} + +// NotSubset asserts that the specified list(array, slice...) contains not all +// elements given in the specified subset(array, slice...). +// +// a.NotSubset([1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]") +func (a *Assertions) NotSubset(list interface{}, subset interface{}, msgAndArgs ...interface{}) bool { + return NotSubset(a.t, list, subset, msgAndArgs...) +} + +// NotSubsetf asserts that the specified list(array, slice...) contains not all +// elements given in the specified subset(array, slice...). +// +// a.NotSubsetf([1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted") +func (a *Assertions) NotSubsetf(list interface{}, subset interface{}, msg string, args ...interface{}) bool { + return NotSubsetf(a.t, list, subset, msg, args...) +} + +// NotZero asserts that i is not the zero value for its type. +func (a *Assertions) NotZero(i interface{}, msgAndArgs ...interface{}) bool { + return NotZero(a.t, i, msgAndArgs...) +} + +// NotZerof asserts that i is not the zero value for its type. +func (a *Assertions) NotZerof(i interface{}, msg string, args ...interface{}) bool { + return NotZerof(a.t, i, msg, args...) +} + +// Panics asserts that the code inside the specified PanicTestFunc panics. +// +// a.Panics(func(){ GoCrazy() }) +func (a *Assertions) Panics(f PanicTestFunc, msgAndArgs ...interface{}) bool { + return Panics(a.t, f, msgAndArgs...) +} + +// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// a.PanicsWithValue("crazy error", func(){ GoCrazy() }) +func (a *Assertions) PanicsWithValue(expected interface{}, f PanicTestFunc, msgAndArgs ...interface{}) bool { + return PanicsWithValue(a.t, expected, f, msgAndArgs...) +} + +// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// a.PanicsWithValuef("crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +func (a *Assertions) PanicsWithValuef(expected interface{}, f PanicTestFunc, msg string, args ...interface{}) bool { + return PanicsWithValuef(a.t, expected, f, msg, args...) +} + +// Panicsf asserts that the code inside the specified PanicTestFunc panics. +// +// a.Panicsf(func(){ GoCrazy() }, "error message %s", "formatted") +func (a *Assertions) Panicsf(f PanicTestFunc, msg string, args ...interface{}) bool { + return Panicsf(a.t, f, msg, args...) +} + +// Regexp asserts that a specified regexp matches a string. +// +// a.Regexp(regexp.MustCompile("start"), "it's starting") +// a.Regexp("start...$", "it's not starting") +func (a *Assertions) Regexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { + return Regexp(a.t, rx, str, msgAndArgs...) +} + +// Regexpf asserts that a specified regexp matches a string. +// +// a.Regexpf(regexp.MustCompile("start", "error message %s", "formatted"), "it's starting") +// a.Regexpf("start...$", "it's not starting", "error message %s", "formatted") +func (a *Assertions) Regexpf(rx interface{}, str interface{}, msg string, args ...interface{}) bool { + return Regexpf(a.t, rx, str, msg, args...) +} + +// Subset asserts that the specified list(array, slice...) contains all +// elements given in the specified subset(array, slice...). +// +// a.Subset([1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]") +func (a *Assertions) Subset(list interface{}, subset interface{}, msgAndArgs ...interface{}) bool { + return Subset(a.t, list, subset, msgAndArgs...) +} + +// Subsetf asserts that the specified list(array, slice...) contains all +// elements given in the specified subset(array, slice...). +// +// a.Subsetf([1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted") +func (a *Assertions) Subsetf(list interface{}, subset interface{}, msg string, args ...interface{}) bool { + return Subsetf(a.t, list, subset, msg, args...) +} + +// True asserts that the specified value is true. +// +// a.True(myBool) +func (a *Assertions) True(value bool, msgAndArgs ...interface{}) bool { + return True(a.t, value, msgAndArgs...) +} + +// Truef asserts that the specified value is true. +// +// a.Truef(myBool, "error message %s", "formatted") +func (a *Assertions) Truef(value bool, msg string, args ...interface{}) bool { + return Truef(a.t, value, msg, args...) +} + +// WithinDuration asserts that the two times are within duration delta of each other. +// +// a.WithinDuration(time.Now(), time.Now(), 10*time.Second) +func (a *Assertions) WithinDuration(expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) bool { + return WithinDuration(a.t, expected, actual, delta, msgAndArgs...) +} + +// WithinDurationf asserts that the two times are within duration delta of each other. +// +// a.WithinDurationf(time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted") +func (a *Assertions) WithinDurationf(expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) bool { + return WithinDurationf(a.t, expected, actual, delta, msg, args...) +} + +// Zero asserts that i is the zero value for its type. +func (a *Assertions) Zero(i interface{}, msgAndArgs ...interface{}) bool { + return Zero(a.t, i, msgAndArgs...) +} + +// Zerof asserts that i is the zero value for its type. +func (a *Assertions) Zerof(i interface{}, msg string, args ...interface{}) bool { + return Zerof(a.t, i, msg, args...) +} diff --git a/api/vendor/github.com/stretchr/testify/assert/assertion_forward.go.tmpl b/api/vendor/github.com/stretchr/testify/assert/assertion_forward.go.tmpl new file mode 100644 index 0000000..99f9acf --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/assert/assertion_forward.go.tmpl @@ -0,0 +1,4 @@ +{{.CommentWithoutT "a"}} +func (a *Assertions) {{.DocInfo.Name}}({{.Params}}) bool { + return {{.DocInfo.Name}}(a.t, {{.ForwardedParams}}) +} diff --git a/api/vendor/github.com/stretchr/testify/assert/assertions.go b/api/vendor/github.com/stretchr/testify/assert/assertions.go new file mode 100644 index 0000000..47bda77 --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/assert/assertions.go @@ -0,0 +1,1256 @@ +package assert + +import ( + "bufio" + "bytes" + "encoding/json" + "errors" + "fmt" + "math" + "os" + "reflect" + "regexp" + "runtime" + "strings" + "time" + "unicode" + "unicode/utf8" + + "github.com/davecgh/go-spew/spew" + "github.com/pmezard/go-difflib/difflib" +) + +//go:generate go run ../_codegen/main.go -output-package=assert -template=assertion_format.go.tmpl + +// TestingT is an interface wrapper around *testing.T +type TestingT interface { + Errorf(format string, args ...interface{}) +} + +// Comparison a custom function that returns true on success and false on failure +type Comparison func() (success bool) + +/* + Helper functions +*/ + +// ObjectsAreEqual determines if two objects are considered equal. +// +// This function does no assertion of any kind. +func ObjectsAreEqual(expected, actual interface{}) bool { + + if expected == nil || actual == nil { + return expected == actual + } + if exp, ok := expected.([]byte); ok { + act, ok := actual.([]byte) + if !ok { + return false + } else if exp == nil || act == nil { + return exp == nil && act == nil + } + return bytes.Equal(exp, act) + } + return reflect.DeepEqual(expected, actual) + +} + +// ObjectsAreEqualValues gets whether two objects are equal, or if their +// values are equal. +func ObjectsAreEqualValues(expected, actual interface{}) bool { + if ObjectsAreEqual(expected, actual) { + return true + } + + actualType := reflect.TypeOf(actual) + if actualType == nil { + return false + } + expectedValue := reflect.ValueOf(expected) + if expectedValue.IsValid() && expectedValue.Type().ConvertibleTo(actualType) { + // Attempt comparison after type conversion + return reflect.DeepEqual(expectedValue.Convert(actualType).Interface(), actual) + } + + return false +} + +/* CallerInfo is necessary because the assert functions use the testing object +internally, causing it to print the file:line of the assert method, rather than where +the problem actually occurred in calling code.*/ + +// CallerInfo returns an array of strings containing the file and line number +// of each stack frame leading from the current test to the assert call that +// failed. +func CallerInfo() []string { + + pc := uintptr(0) + file := "" + line := 0 + ok := false + name := "" + + callers := []string{} + for i := 0; ; i++ { + pc, file, line, ok = runtime.Caller(i) + if !ok { + // The breaks below failed to terminate the loop, and we ran off the + // end of the call stack. + break + } + + // This is a huge edge case, but it will panic if this is the case, see #180 + if file == "" { + break + } + + f := runtime.FuncForPC(pc) + if f == nil { + break + } + name = f.Name() + + // testing.tRunner is the standard library function that calls + // tests. Subtests are called directly by tRunner, without going through + // the Test/Benchmark/Example function that contains the t.Run calls, so + // with subtests we should break when we hit tRunner, without adding it + // to the list of callers. + if name == "testing.tRunner" { + break + } + + parts := strings.Split(file, "/") + file = parts[len(parts)-1] + if len(parts) > 1 { + dir := parts[len(parts)-2] + if (dir != "assert" && dir != "mock" && dir != "require") || file == "mock_test.go" { + callers = append(callers, fmt.Sprintf("%s:%d", file, line)) + } + } + + // Drop the package + segments := strings.Split(name, ".") + name = segments[len(segments)-1] + if isTest(name, "Test") || + isTest(name, "Benchmark") || + isTest(name, "Example") { + break + } + } + + return callers +} + +// Stolen from the `go test` tool. +// isTest tells whether name looks like a test (or benchmark, according to prefix). +// It is a Test (say) if there is a character after Test that is not a lower-case letter. +// We don't want TesticularCancer. +func isTest(name, prefix string) bool { + if !strings.HasPrefix(name, prefix) { + return false + } + if len(name) == len(prefix) { // "Test" is ok + return true + } + rune, _ := utf8.DecodeRuneInString(name[len(prefix):]) + return !unicode.IsLower(rune) +} + +// getWhitespaceString returns a string that is long enough to overwrite the default +// output from the go testing framework. +func getWhitespaceString() string { + + _, file, line, ok := runtime.Caller(1) + if !ok { + return "" + } + parts := strings.Split(file, "/") + file = parts[len(parts)-1] + + return strings.Repeat(" ", len(fmt.Sprintf("%s:%d: ", file, line))) + +} + +func messageFromMsgAndArgs(msgAndArgs ...interface{}) string { + if len(msgAndArgs) == 0 || msgAndArgs == nil { + return "" + } + if len(msgAndArgs) == 1 { + return msgAndArgs[0].(string) + } + if len(msgAndArgs) > 1 { + return fmt.Sprintf(msgAndArgs[0].(string), msgAndArgs[1:]...) + } + return "" +} + +// Aligns the provided message so that all lines after the first line start at the same location as the first line. +// Assumes that the first line starts at the correct location (after carriage return, tab, label, spacer and tab). +// The longestLabelLen parameter specifies the length of the longest label in the output (required becaues this is the +// basis on which the alignment occurs). +func indentMessageLines(message string, longestLabelLen int) string { + outBuf := new(bytes.Buffer) + + for i, scanner := 0, bufio.NewScanner(strings.NewReader(message)); scanner.Scan(); i++ { + // no need to align first line because it starts at the correct location (after the label) + if i != 0 { + // append alignLen+1 spaces to align with "{{longestLabel}}:" before adding tab + outBuf.WriteString("\n\r\t" + strings.Repeat(" ", longestLabelLen+1) + "\t") + } + outBuf.WriteString(scanner.Text()) + } + + return outBuf.String() +} + +type failNower interface { + FailNow() +} + +// FailNow fails test +func FailNow(t TestingT, failureMessage string, msgAndArgs ...interface{}) bool { + Fail(t, failureMessage, msgAndArgs...) + + // We cannot extend TestingT with FailNow() and + // maintain backwards compatibility, so we fallback + // to panicking when FailNow is not available in + // TestingT. + // See issue #263 + + if t, ok := t.(failNower); ok { + t.FailNow() + } else { + panic("test failed and t is missing `FailNow()`") + } + return false +} + +// Fail reports a failure through +func Fail(t TestingT, failureMessage string, msgAndArgs ...interface{}) bool { + content := []labeledContent{ + {"Error Trace", strings.Join(CallerInfo(), "\n\r\t\t\t")}, + {"Error", failureMessage}, + } + + // Add test name if the Go version supports it + if n, ok := t.(interface { + Name() string + }); ok { + content = append(content, labeledContent{"Test", n.Name()}) + } + + message := messageFromMsgAndArgs(msgAndArgs...) + if len(message) > 0 { + content = append(content, labeledContent{"Messages", message}) + } + + t.Errorf("%s", "\r"+getWhitespaceString()+labeledOutput(content...)) + + return false +} + +type labeledContent struct { + label string + content string +} + +// labeledOutput returns a string consisting of the provided labeledContent. Each labeled output is appended in the following manner: +// +// \r\t{{label}}:{{align_spaces}}\t{{content}}\n +// +// The initial carriage return is required to undo/erase any padding added by testing.T.Errorf. The "\t{{label}}:" is for the label. +// If a label is shorter than the longest label provided, padding spaces are added to make all the labels match in length. Once this +// alignment is achieved, "\t{{content}}\n" is added for the output. +// +// If the content of the labeledOutput contains line breaks, the subsequent lines are aligned so that they start at the same location as the first line. +func labeledOutput(content ...labeledContent) string { + longestLabel := 0 + for _, v := range content { + if len(v.label) > longestLabel { + longestLabel = len(v.label) + } + } + var output string + for _, v := range content { + output += "\r\t" + v.label + ":" + strings.Repeat(" ", longestLabel-len(v.label)) + "\t" + indentMessageLines(v.content, longestLabel) + "\n" + } + return output +} + +// Implements asserts that an object is implemented by the specified interface. +// +// assert.Implements(t, (*MyInterface)(nil), new(MyObject)) +func Implements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool { + interfaceType := reflect.TypeOf(interfaceObject).Elem() + + if object == nil { + return Fail(t, fmt.Sprintf("Cannot check if nil implements %v", interfaceType), msgAndArgs...) + } + if !reflect.TypeOf(object).Implements(interfaceType) { + return Fail(t, fmt.Sprintf("%T must implement %v", object, interfaceType), msgAndArgs...) + } + + return true +} + +// IsType asserts that the specified objects are of the same type. +func IsType(t TestingT, expectedType interface{}, object interface{}, msgAndArgs ...interface{}) bool { + + if !ObjectsAreEqual(reflect.TypeOf(object), reflect.TypeOf(expectedType)) { + return Fail(t, fmt.Sprintf("Object expected to be of type %v, but was %v", reflect.TypeOf(expectedType), reflect.TypeOf(object)), msgAndArgs...) + } + + return true +} + +// Equal asserts that two objects are equal. +// +// assert.Equal(t, 123, 123) +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func Equal(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { + if err := validateEqualArgs(expected, actual); err != nil { + return Fail(t, fmt.Sprintf("Invalid operation: %#v == %#v (%s)", + expected, actual, err), msgAndArgs...) + } + + if !ObjectsAreEqual(expected, actual) { + diff := diff(expected, actual) + expected, actual = formatUnequalValues(expected, actual) + return Fail(t, fmt.Sprintf("Not equal: \n"+ + "expected: %s\n"+ + "actual : %s%s", expected, actual, diff), msgAndArgs...) + } + + return true + +} + +// formatUnequalValues takes two values of arbitrary types and returns string +// representations appropriate to be presented to the user. +// +// If the values are not of like type, the returned strings will be prefixed +// with the type name, and the value will be enclosed in parenthesis similar +// to a type conversion in the Go grammar. +func formatUnequalValues(expected, actual interface{}) (e string, a string) { + if reflect.TypeOf(expected) != reflect.TypeOf(actual) { + return fmt.Sprintf("%T(%#v)", expected, expected), + fmt.Sprintf("%T(%#v)", actual, actual) + } + + return fmt.Sprintf("%#v", expected), + fmt.Sprintf("%#v", actual) +} + +// EqualValues asserts that two objects are equal or convertable to the same types +// and equal. +// +// assert.EqualValues(t, uint32(123), int32(123)) +func EqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { + + if !ObjectsAreEqualValues(expected, actual) { + diff := diff(expected, actual) + expected, actual = formatUnequalValues(expected, actual) + return Fail(t, fmt.Sprintf("Not equal: \n"+ + "expected: %s\n"+ + "actual : %s%s", expected, actual, diff), msgAndArgs...) + } + + return true + +} + +// Exactly asserts that two objects are equal in value and type. +// +// assert.Exactly(t, int32(123), int64(123)) +func Exactly(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { + + aType := reflect.TypeOf(expected) + bType := reflect.TypeOf(actual) + + if aType != bType { + return Fail(t, fmt.Sprintf("Types expected to match exactly\n\r\t%v != %v", aType, bType), msgAndArgs...) + } + + return Equal(t, expected, actual, msgAndArgs...) + +} + +// NotNil asserts that the specified object is not nil. +// +// assert.NotNil(t, err) +func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { + if !isNil(object) { + return true + } + return Fail(t, "Expected value not to be nil.", msgAndArgs...) +} + +// isNil checks if a specified object is nil or not, without Failing. +func isNil(object interface{}) bool { + if object == nil { + return true + } + + value := reflect.ValueOf(object) + kind := value.Kind() + if kind >= reflect.Chan && kind <= reflect.Slice && value.IsNil() { + return true + } + + return false +} + +// Nil asserts that the specified object is nil. +// +// assert.Nil(t, err) +func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { + if isNil(object) { + return true + } + return Fail(t, fmt.Sprintf("Expected nil, but got: %#v", object), msgAndArgs...) +} + +// isEmpty gets whether the specified object is considered empty or not. +func isEmpty(object interface{}) bool { + + // get nil case out of the way + if object == nil { + return true + } + + objValue := reflect.ValueOf(object) + + switch objValue.Kind() { + // collection types are empty when they have no element + case reflect.Array, reflect.Chan, reflect.Map, reflect.Slice: + return objValue.Len() == 0 + // pointers are empty if nil or if the value they point to is empty + case reflect.Ptr: + if objValue.IsNil() { + return true + } + deref := objValue.Elem().Interface() + return isEmpty(deref) + // for all other types, compare against the zero value + default: + zero := reflect.Zero(objValue.Type()) + return reflect.DeepEqual(object, zero.Interface()) + } +} + +// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// assert.Empty(t, obj) +func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { + + pass := isEmpty(object) + if !pass { + Fail(t, fmt.Sprintf("Should be empty, but was %v", object), msgAndArgs...) + } + + return pass + +} + +// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if assert.NotEmpty(t, obj) { +// assert.Equal(t, "two", obj[1]) +// } +func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { + + pass := !isEmpty(object) + if !pass { + Fail(t, fmt.Sprintf("Should NOT be empty, but was %v", object), msgAndArgs...) + } + + return pass + +} + +// getLen try to get length of object. +// return (false, 0) if impossible. +func getLen(x interface{}) (ok bool, length int) { + v := reflect.ValueOf(x) + defer func() { + if e := recover(); e != nil { + ok = false + } + }() + return true, v.Len() +} + +// Len asserts that the specified object has specific length. +// Len also fails if the object has a type that len() not accept. +// +// assert.Len(t, mySlice, 3) +func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) bool { + ok, l := getLen(object) + if !ok { + return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", object), msgAndArgs...) + } + + if l != length { + return Fail(t, fmt.Sprintf("\"%s\" should have %d item(s), but has %d", object, length, l), msgAndArgs...) + } + return true +} + +// True asserts that the specified value is true. +// +// assert.True(t, myBool) +func True(t TestingT, value bool, msgAndArgs ...interface{}) bool { + + if value != true { + return Fail(t, "Should be true", msgAndArgs...) + } + + return true + +} + +// False asserts that the specified value is false. +// +// assert.False(t, myBool) +func False(t TestingT, value bool, msgAndArgs ...interface{}) bool { + + if value != false { + return Fail(t, "Should be false", msgAndArgs...) + } + + return true + +} + +// NotEqual asserts that the specified values are NOT equal. +// +// assert.NotEqual(t, obj1, obj2) +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func NotEqual(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { + if err := validateEqualArgs(expected, actual); err != nil { + return Fail(t, fmt.Sprintf("Invalid operation: %#v != %#v (%s)", + expected, actual, err), msgAndArgs...) + } + + if ObjectsAreEqual(expected, actual) { + return Fail(t, fmt.Sprintf("Should not be: %#v\n", actual), msgAndArgs...) + } + + return true + +} + +// containsElement try loop over the list check if the list includes the element. +// return (false, false) if impossible. +// return (true, false) if element was not found. +// return (true, true) if element was found. +func includeElement(list interface{}, element interface{}) (ok, found bool) { + + listValue := reflect.ValueOf(list) + elementValue := reflect.ValueOf(element) + defer func() { + if e := recover(); e != nil { + ok = false + found = false + } + }() + + if reflect.TypeOf(list).Kind() == reflect.String { + return true, strings.Contains(listValue.String(), elementValue.String()) + } + + if reflect.TypeOf(list).Kind() == reflect.Map { + mapKeys := listValue.MapKeys() + for i := 0; i < len(mapKeys); i++ { + if ObjectsAreEqual(mapKeys[i].Interface(), element) { + return true, true + } + } + return true, false + } + + for i := 0; i < listValue.Len(); i++ { + if ObjectsAreEqual(listValue.Index(i).Interface(), element) { + return true, true + } + } + return true, false + +} + +// Contains asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// assert.Contains(t, "Hello World", "World") +// assert.Contains(t, ["Hello", "World"], "World") +// assert.Contains(t, {"Hello": "World"}, "Hello") +func Contains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bool { + + ok, found := includeElement(s, contains) + if !ok { + return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", s), msgAndArgs...) + } + if !found { + return Fail(t, fmt.Sprintf("\"%s\" does not contain \"%s\"", s, contains), msgAndArgs...) + } + + return true + +} + +// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// assert.NotContains(t, "Hello World", "Earth") +// assert.NotContains(t, ["Hello", "World"], "Earth") +// assert.NotContains(t, {"Hello": "World"}, "Earth") +func NotContains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bool { + + ok, found := includeElement(s, contains) + if !ok { + return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", s), msgAndArgs...) + } + if found { + return Fail(t, fmt.Sprintf("\"%s\" should not contain \"%s\"", s, contains), msgAndArgs...) + } + + return true + +} + +// Subset asserts that the specified list(array, slice...) contains all +// elements given in the specified subset(array, slice...). +// +// assert.Subset(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]") +func Subset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok bool) { + if subset == nil { + return true // we consider nil to be equal to the nil set + } + + subsetValue := reflect.ValueOf(subset) + defer func() { + if e := recover(); e != nil { + ok = false + } + }() + + listKind := reflect.TypeOf(list).Kind() + subsetKind := reflect.TypeOf(subset).Kind() + + if listKind != reflect.Array && listKind != reflect.Slice { + return Fail(t, fmt.Sprintf("%q has an unsupported type %s", list, listKind), msgAndArgs...) + } + + if subsetKind != reflect.Array && subsetKind != reflect.Slice { + return Fail(t, fmt.Sprintf("%q has an unsupported type %s", subset, subsetKind), msgAndArgs...) + } + + for i := 0; i < subsetValue.Len(); i++ { + element := subsetValue.Index(i).Interface() + ok, found := includeElement(list, element) + if !ok { + return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", list), msgAndArgs...) + } + if !found { + return Fail(t, fmt.Sprintf("\"%s\" does not contain \"%s\"", list, element), msgAndArgs...) + } + } + + return true +} + +// NotSubset asserts that the specified list(array, slice...) contains not all +// elements given in the specified subset(array, slice...). +// +// assert.NotSubset(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]") +func NotSubset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok bool) { + if subset == nil { + return Fail(t, fmt.Sprintf("nil is the empty set which is a subset of every set"), msgAndArgs...) + } + + subsetValue := reflect.ValueOf(subset) + defer func() { + if e := recover(); e != nil { + ok = false + } + }() + + listKind := reflect.TypeOf(list).Kind() + subsetKind := reflect.TypeOf(subset).Kind() + + if listKind != reflect.Array && listKind != reflect.Slice { + return Fail(t, fmt.Sprintf("%q has an unsupported type %s", list, listKind), msgAndArgs...) + } + + if subsetKind != reflect.Array && subsetKind != reflect.Slice { + return Fail(t, fmt.Sprintf("%q has an unsupported type %s", subset, subsetKind), msgAndArgs...) + } + + for i := 0; i < subsetValue.Len(); i++ { + element := subsetValue.Index(i).Interface() + ok, found := includeElement(list, element) + if !ok { + return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", list), msgAndArgs...) + } + if !found { + return true + } + } + + return Fail(t, fmt.Sprintf("%q is a subset of %q", subset, list), msgAndArgs...) +} + +// ElementsMatch asserts that the specified listA(array, slice...) is equal to specified +// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, +// the number of appearances of each of them in both lists should match. +// +// assert.ElementsMatch(t, [1, 3, 2, 3], [1, 3, 3, 2]) +func ElementsMatch(t TestingT, listA, listB interface{}, msgAndArgs ...interface{}) (ok bool) { + if isEmpty(listA) && isEmpty(listB) { + return true + } + + aKind := reflect.TypeOf(listA).Kind() + bKind := reflect.TypeOf(listB).Kind() + + if aKind != reflect.Array && aKind != reflect.Slice { + return Fail(t, fmt.Sprintf("%q has an unsupported type %s", listA, aKind), msgAndArgs...) + } + + if bKind != reflect.Array && bKind != reflect.Slice { + return Fail(t, fmt.Sprintf("%q has an unsupported type %s", listB, bKind), msgAndArgs...) + } + + aValue := reflect.ValueOf(listA) + bValue := reflect.ValueOf(listB) + + aLen := aValue.Len() + bLen := bValue.Len() + + if aLen != bLen { + return Fail(t, fmt.Sprintf("lengths don't match: %d != %d", aLen, bLen), msgAndArgs...) + } + + // Mark indexes in bValue that we already used + visited := make([]bool, bLen) + for i := 0; i < aLen; i++ { + element := aValue.Index(i).Interface() + found := false + for j := 0; j < bLen; j++ { + if visited[j] { + continue + } + if ObjectsAreEqual(bValue.Index(j).Interface(), element) { + visited[j] = true + found = true + break + } + } + if !found { + return Fail(t, fmt.Sprintf("element %s appears more times in %s than in %s", element, aValue, bValue), msgAndArgs...) + } + } + + return true +} + +// Condition uses a Comparison to assert a complex condition. +func Condition(t TestingT, comp Comparison, msgAndArgs ...interface{}) bool { + result := comp() + if !result { + Fail(t, "Condition failed!", msgAndArgs...) + } + return result +} + +// PanicTestFunc defines a func that should be passed to the assert.Panics and assert.NotPanics +// methods, and represents a simple func that takes no arguments, and returns nothing. +type PanicTestFunc func() + +// didPanic returns true if the function passed to it panics. Otherwise, it returns false. +func didPanic(f PanicTestFunc) (bool, interface{}) { + + didPanic := false + var message interface{} + func() { + + defer func() { + if message = recover(); message != nil { + didPanic = true + } + }() + + // call the target function + f() + + }() + + return didPanic, message + +} + +// Panics asserts that the code inside the specified PanicTestFunc panics. +// +// assert.Panics(t, func(){ GoCrazy() }) +func Panics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool { + + if funcDidPanic, panicValue := didPanic(f); !funcDidPanic { + return Fail(t, fmt.Sprintf("func %#v should panic\n\r\tPanic value:\t%v", f, panicValue), msgAndArgs...) + } + + return true +} + +// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// assert.PanicsWithValue(t, "crazy error", func(){ GoCrazy() }) +func PanicsWithValue(t TestingT, expected interface{}, f PanicTestFunc, msgAndArgs ...interface{}) bool { + + funcDidPanic, panicValue := didPanic(f) + if !funcDidPanic { + return Fail(t, fmt.Sprintf("func %#v should panic\n\r\tPanic value:\t%v", f, panicValue), msgAndArgs...) + } + if panicValue != expected { + return Fail(t, fmt.Sprintf("func %#v should panic with value:\t%v\n\r\tPanic value:\t%v", f, expected, panicValue), msgAndArgs...) + } + + return true +} + +// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// assert.NotPanics(t, func(){ RemainCalm() }) +func NotPanics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool { + + if funcDidPanic, panicValue := didPanic(f); funcDidPanic { + return Fail(t, fmt.Sprintf("func %#v should not panic\n\r\tPanic value:\t%v", f, panicValue), msgAndArgs...) + } + + return true +} + +// WithinDuration asserts that the two times are within duration delta of each other. +// +// assert.WithinDuration(t, time.Now(), time.Now(), 10*time.Second) +func WithinDuration(t TestingT, expected, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) bool { + + dt := expected.Sub(actual) + if dt < -delta || dt > delta { + return Fail(t, fmt.Sprintf("Max difference between %v and %v allowed is %v, but difference was %v", expected, actual, delta, dt), msgAndArgs...) + } + + return true +} + +func toFloat(x interface{}) (float64, bool) { + var xf float64 + xok := true + + switch xn := x.(type) { + case uint8: + xf = float64(xn) + case uint16: + xf = float64(xn) + case uint32: + xf = float64(xn) + case uint64: + xf = float64(xn) + case int: + xf = float64(xn) + case int8: + xf = float64(xn) + case int16: + xf = float64(xn) + case int32: + xf = float64(xn) + case int64: + xf = float64(xn) + case float32: + xf = float64(xn) + case float64: + xf = float64(xn) + case time.Duration: + xf = float64(xn) + default: + xok = false + } + + return xf, xok +} + +// InDelta asserts that the two numerals are within delta of each other. +// +// assert.InDelta(t, math.Pi, (22 / 7.0), 0.01) +func InDelta(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { + + af, aok := toFloat(expected) + bf, bok := toFloat(actual) + + if !aok || !bok { + return Fail(t, fmt.Sprintf("Parameters must be numerical"), msgAndArgs...) + } + + if math.IsNaN(af) { + return Fail(t, fmt.Sprintf("Expected must not be NaN"), msgAndArgs...) + } + + if math.IsNaN(bf) { + return Fail(t, fmt.Sprintf("Expected %v with delta %v, but was NaN", expected, delta), msgAndArgs...) + } + + dt := af - bf + if dt < -delta || dt > delta { + return Fail(t, fmt.Sprintf("Max difference between %v and %v allowed is %v, but difference was %v", expected, actual, delta, dt), msgAndArgs...) + } + + return true +} + +// InDeltaSlice is the same as InDelta, except it compares two slices. +func InDeltaSlice(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { + if expected == nil || actual == nil || + reflect.TypeOf(actual).Kind() != reflect.Slice || + reflect.TypeOf(expected).Kind() != reflect.Slice { + return Fail(t, fmt.Sprintf("Parameters must be slice"), msgAndArgs...) + } + + actualSlice := reflect.ValueOf(actual) + expectedSlice := reflect.ValueOf(expected) + + for i := 0; i < actualSlice.Len(); i++ { + result := InDelta(t, actualSlice.Index(i).Interface(), expectedSlice.Index(i).Interface(), delta, msgAndArgs...) + if !result { + return result + } + } + + return true +} + +// InDeltaMapValues is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys. +func InDeltaMapValues(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { + if expected == nil || actual == nil || + reflect.TypeOf(actual).Kind() != reflect.Map || + reflect.TypeOf(expected).Kind() != reflect.Map { + return Fail(t, "Arguments must be maps", msgAndArgs...) + } + + expectedMap := reflect.ValueOf(expected) + actualMap := reflect.ValueOf(actual) + + if expectedMap.Len() != actualMap.Len() { + return Fail(t, "Arguments must have the same number of keys", msgAndArgs...) + } + + for _, k := range expectedMap.MapKeys() { + ev := expectedMap.MapIndex(k) + av := actualMap.MapIndex(k) + + if !ev.IsValid() { + return Fail(t, fmt.Sprintf("missing key %q in expected map", k), msgAndArgs...) + } + + if !av.IsValid() { + return Fail(t, fmt.Sprintf("missing key %q in actual map", k), msgAndArgs...) + } + + if !InDelta( + t, + ev.Interface(), + av.Interface(), + delta, + msgAndArgs..., + ) { + return false + } + } + + return true +} + +func calcRelativeError(expected, actual interface{}) (float64, error) { + af, aok := toFloat(expected) + if !aok { + return 0, fmt.Errorf("expected value %q cannot be converted to float", expected) + } + if af == 0 { + return 0, fmt.Errorf("expected value must have a value other than zero to calculate the relative error") + } + bf, bok := toFloat(actual) + if !bok { + return 0, fmt.Errorf("actual value %q cannot be converted to float", actual) + } + + return math.Abs(af-bf) / math.Abs(af), nil +} + +// InEpsilon asserts that expected and actual have a relative error less than epsilon +func InEpsilon(t TestingT, expected, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool { + actualEpsilon, err := calcRelativeError(expected, actual) + if err != nil { + return Fail(t, err.Error(), msgAndArgs...) + } + if actualEpsilon > epsilon { + return Fail(t, fmt.Sprintf("Relative error is too high: %#v (expected)\n"+ + " < %#v (actual)", epsilon, actualEpsilon), msgAndArgs...) + } + + return true +} + +// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices. +func InEpsilonSlice(t TestingT, expected, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool { + if expected == nil || actual == nil || + reflect.TypeOf(actual).Kind() != reflect.Slice || + reflect.TypeOf(expected).Kind() != reflect.Slice { + return Fail(t, fmt.Sprintf("Parameters must be slice"), msgAndArgs...) + } + + actualSlice := reflect.ValueOf(actual) + expectedSlice := reflect.ValueOf(expected) + + for i := 0; i < actualSlice.Len(); i++ { + result := InEpsilon(t, actualSlice.Index(i).Interface(), expectedSlice.Index(i).Interface(), epsilon) + if !result { + return result + } + } + + return true +} + +/* + Errors +*/ + +// NoError asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if assert.NoError(t, err) { +// assert.Equal(t, expectedObj, actualObj) +// } +func NoError(t TestingT, err error, msgAndArgs ...interface{}) bool { + if err != nil { + return Fail(t, fmt.Sprintf("Received unexpected error:\n%+v", err), msgAndArgs...) + } + + return true +} + +// Error asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if assert.Error(t, err) { +// assert.Equal(t, expectedError, err) +// } +func Error(t TestingT, err error, msgAndArgs ...interface{}) bool { + + if err == nil { + return Fail(t, "An error is expected but got nil.", msgAndArgs...) + } + + return true +} + +// EqualError asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// assert.EqualError(t, err, expectedErrorString) +func EqualError(t TestingT, theError error, errString string, msgAndArgs ...interface{}) bool { + if !Error(t, theError, msgAndArgs...) { + return false + } + expected := errString + actual := theError.Error() + // don't need to use deep equals here, we know they are both strings + if expected != actual { + return Fail(t, fmt.Sprintf("Error message not equal:\n"+ + "expected: %q\n"+ + "actual : %q", expected, actual), msgAndArgs...) + } + return true +} + +// matchRegexp return true if a specified regexp matches a string. +func matchRegexp(rx interface{}, str interface{}) bool { + + var r *regexp.Regexp + if rr, ok := rx.(*regexp.Regexp); ok { + r = rr + } else { + r = regexp.MustCompile(fmt.Sprint(rx)) + } + + return (r.FindStringIndex(fmt.Sprint(str)) != nil) + +} + +// Regexp asserts that a specified regexp matches a string. +// +// assert.Regexp(t, regexp.MustCompile("start"), "it's starting") +// assert.Regexp(t, "start...$", "it's not starting") +func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { + + match := matchRegexp(rx, str) + + if !match { + Fail(t, fmt.Sprintf("Expect \"%v\" to match \"%v\"", str, rx), msgAndArgs...) + } + + return match +} + +// NotRegexp asserts that a specified regexp does not match a string. +// +// assert.NotRegexp(t, regexp.MustCompile("starts"), "it's starting") +// assert.NotRegexp(t, "^start", "it's not starting") +func NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { + match := matchRegexp(rx, str) + + if match { + Fail(t, fmt.Sprintf("Expect \"%v\" to NOT match \"%v\"", str, rx), msgAndArgs...) + } + + return !match + +} + +// Zero asserts that i is the zero value for its type. +func Zero(t TestingT, i interface{}, msgAndArgs ...interface{}) bool { + if i != nil && !reflect.DeepEqual(i, reflect.Zero(reflect.TypeOf(i)).Interface()) { + return Fail(t, fmt.Sprintf("Should be zero, but was %v", i), msgAndArgs...) + } + return true +} + +// NotZero asserts that i is not the zero value for its type. +func NotZero(t TestingT, i interface{}, msgAndArgs ...interface{}) bool { + if i == nil || reflect.DeepEqual(i, reflect.Zero(reflect.TypeOf(i)).Interface()) { + return Fail(t, fmt.Sprintf("Should not be zero, but was %v", i), msgAndArgs...) + } + return true +} + +// FileExists checks whether a file exists in the given path. It also fails if the path points to a directory or there is an error when trying to check the file. +func FileExists(t TestingT, path string, msgAndArgs ...interface{}) bool { + info, err := os.Lstat(path) + if err != nil { + if os.IsNotExist(err) { + return Fail(t, fmt.Sprintf("unable to find file %q", path), msgAndArgs...) + } + return Fail(t, fmt.Sprintf("error when running os.Lstat(%q): %s", path, err), msgAndArgs...) + } + if info.IsDir() { + return Fail(t, fmt.Sprintf("%q is a directory", path), msgAndArgs...) + } + return true +} + +// DirExists checks whether a directory exists in the given path. It also fails if the path is a file rather a directory or there is an error checking whether it exists. +func DirExists(t TestingT, path string, msgAndArgs ...interface{}) bool { + info, err := os.Lstat(path) + if err != nil { + if os.IsNotExist(err) { + return Fail(t, fmt.Sprintf("unable to find file %q", path), msgAndArgs...) + } + return Fail(t, fmt.Sprintf("error when running os.Lstat(%q): %s", path, err), msgAndArgs...) + } + if !info.IsDir() { + return Fail(t, fmt.Sprintf("%q is a file", path), msgAndArgs...) + } + return true +} + +// JSONEq asserts that two JSON strings are equivalent. +// +// assert.JSONEq(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) +func JSONEq(t TestingT, expected string, actual string, msgAndArgs ...interface{}) bool { + var expectedJSONAsInterface, actualJSONAsInterface interface{} + + if err := json.Unmarshal([]byte(expected), &expectedJSONAsInterface); err != nil { + return Fail(t, fmt.Sprintf("Expected value ('%s') is not valid json.\nJSON parsing error: '%s'", expected, err.Error()), msgAndArgs...) + } + + if err := json.Unmarshal([]byte(actual), &actualJSONAsInterface); err != nil { + return Fail(t, fmt.Sprintf("Input ('%s') needs to be valid json.\nJSON parsing error: '%s'", actual, err.Error()), msgAndArgs...) + } + + return Equal(t, expectedJSONAsInterface, actualJSONAsInterface, msgAndArgs...) +} + +func typeAndKind(v interface{}) (reflect.Type, reflect.Kind) { + t := reflect.TypeOf(v) + k := t.Kind() + + if k == reflect.Ptr { + t = t.Elem() + k = t.Kind() + } + return t, k +} + +// diff returns a diff of both values as long as both are of the same type and +// are a struct, map, slice or array. Otherwise it returns an empty string. +func diff(expected interface{}, actual interface{}) string { + if expected == nil || actual == nil { + return "" + } + + et, ek := typeAndKind(expected) + at, _ := typeAndKind(actual) + + if et != at { + return "" + } + + if ek != reflect.Struct && ek != reflect.Map && ek != reflect.Slice && ek != reflect.Array { + return "" + } + + e := spewConfig.Sdump(expected) + a := spewConfig.Sdump(actual) + + diff, _ := difflib.GetUnifiedDiffString(difflib.UnifiedDiff{ + A: difflib.SplitLines(e), + B: difflib.SplitLines(a), + FromFile: "Expected", + FromDate: "", + ToFile: "Actual", + ToDate: "", + Context: 1, + }) + + return "\n\nDiff:\n" + diff +} + +// validateEqualArgs checks whether provided arguments can be safely used in the +// Equal/NotEqual functions. +func validateEqualArgs(expected, actual interface{}) error { + if isFunction(expected) || isFunction(actual) { + return errors.New("cannot take func type as argument") + } + return nil +} + +func isFunction(arg interface{}) bool { + if arg == nil { + return false + } + return reflect.TypeOf(arg).Kind() == reflect.Func +} + +var spewConfig = spew.ConfigState{ + Indent: " ", + DisablePointerAddresses: true, + DisableCapacities: true, + SortKeys: true, +} diff --git a/api/vendor/github.com/stretchr/testify/assert/assertions_test.go b/api/vendor/github.com/stretchr/testify/assert/assertions_test.go new file mode 100644 index 0000000..6757bd1 --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/assert/assertions_test.go @@ -0,0 +1,1581 @@ +package assert + +import ( + "bytes" + "errors" + "fmt" + "io" + "math" + "os" + "reflect" + "regexp" + "runtime" + "strings" + "testing" + "time" +) + +var ( + i interface{} + zeros = []interface{}{ + false, + byte(0), + complex64(0), + complex128(0), + float32(0), + float64(0), + int(0), + int8(0), + int16(0), + int32(0), + int64(0), + rune(0), + uint(0), + uint8(0), + uint16(0), + uint32(0), + uint64(0), + uintptr(0), + "", + [0]interface{}{}, + []interface{}(nil), + struct{ x int }{}, + (*interface{})(nil), + (func())(nil), + nil, + interface{}(nil), + map[interface{}]interface{}(nil), + (chan interface{})(nil), + (<-chan interface{})(nil), + (chan<- interface{})(nil), + } + nonZeros = []interface{}{ + true, + byte(1), + complex64(1), + complex128(1), + float32(1), + float64(1), + int(1), + int8(1), + int16(1), + int32(1), + int64(1), + rune(1), + uint(1), + uint8(1), + uint16(1), + uint32(1), + uint64(1), + uintptr(1), + "s", + [1]interface{}{1}, + []interface{}{}, + struct{ x int }{1}, + (*interface{})(&i), + (func())(func() {}), + interface{}(1), + map[interface{}]interface{}{}, + (chan interface{})(make(chan interface{})), + (<-chan interface{})(make(chan interface{})), + (chan<- interface{})(make(chan interface{})), + } +) + +// AssertionTesterInterface defines an interface to be used for testing assertion methods +type AssertionTesterInterface interface { + TestMethod() +} + +// AssertionTesterConformingObject is an object that conforms to the AssertionTesterInterface interface +type AssertionTesterConformingObject struct { +} + +func (a *AssertionTesterConformingObject) TestMethod() { +} + +// AssertionTesterNonConformingObject is an object that does not conform to the AssertionTesterInterface interface +type AssertionTesterNonConformingObject struct { +} + +func TestObjectsAreEqual(t *testing.T) { + + if !ObjectsAreEqual("Hello World", "Hello World") { + t.Error("objectsAreEqual should return true") + } + if !ObjectsAreEqual(123, 123) { + t.Error("objectsAreEqual should return true") + } + if !ObjectsAreEqual(123.5, 123.5) { + t.Error("objectsAreEqual should return true") + } + if !ObjectsAreEqual([]byte("Hello World"), []byte("Hello World")) { + t.Error("objectsAreEqual should return true") + } + if !ObjectsAreEqual(nil, nil) { + t.Error("objectsAreEqual should return true") + } + if ObjectsAreEqual(map[int]int{5: 10}, map[int]int{10: 20}) { + t.Error("objectsAreEqual should return false") + } + if ObjectsAreEqual('x', "x") { + t.Error("objectsAreEqual should return false") + } + if ObjectsAreEqual("x", 'x') { + t.Error("objectsAreEqual should return false") + } + if ObjectsAreEqual(0, 0.1) { + t.Error("objectsAreEqual should return false") + } + if ObjectsAreEqual(0.1, 0) { + t.Error("objectsAreEqual should return false") + } + if ObjectsAreEqual(uint32(10), int32(10)) { + t.Error("objectsAreEqual should return false") + } + if !ObjectsAreEqualValues(uint32(10), int32(10)) { + t.Error("ObjectsAreEqualValues should return true") + } + if ObjectsAreEqualValues(0, nil) { + t.Fail() + } + if ObjectsAreEqualValues(nil, 0) { + t.Fail() + } + +} + +func TestImplements(t *testing.T) { + + mockT := new(testing.T) + + if !Implements(mockT, (*AssertionTesterInterface)(nil), new(AssertionTesterConformingObject)) { + t.Error("Implements method should return true: AssertionTesterConformingObject implements AssertionTesterInterface") + } + if Implements(mockT, (*AssertionTesterInterface)(nil), new(AssertionTesterNonConformingObject)) { + t.Error("Implements method should return false: AssertionTesterNonConformingObject does not implements AssertionTesterInterface") + } + if Implements(mockT, (*AssertionTesterInterface)(nil), nil) { + t.Error("Implements method should return false: nil does not implement AssertionTesterInterface") + } + +} + +func TestIsType(t *testing.T) { + + mockT := new(testing.T) + + if !IsType(mockT, new(AssertionTesterConformingObject), new(AssertionTesterConformingObject)) { + t.Error("IsType should return true: AssertionTesterConformingObject is the same type as AssertionTesterConformingObject") + } + if IsType(mockT, new(AssertionTesterConformingObject), new(AssertionTesterNonConformingObject)) { + t.Error("IsType should return false: AssertionTesterConformingObject is not the same type as AssertionTesterNonConformingObject") + } + +} + +func TestEqual(t *testing.T) { + + mockT := new(testing.T) + + if !Equal(mockT, "Hello World", "Hello World") { + t.Error("Equal should return true") + } + if !Equal(mockT, 123, 123) { + t.Error("Equal should return true") + } + if !Equal(mockT, 123.5, 123.5) { + t.Error("Equal should return true") + } + if !Equal(mockT, []byte("Hello World"), []byte("Hello World")) { + t.Error("Equal should return true") + } + if !Equal(mockT, nil, nil) { + t.Error("Equal should return true") + } + if !Equal(mockT, int32(123), int32(123)) { + t.Error("Equal should return true") + } + if !Equal(mockT, uint64(123), uint64(123)) { + t.Error("Equal should return true") + } + if !Equal(mockT, &struct{}{}, &struct{}{}) { + t.Error("Equal should return true (pointer equality is based on equality of underlying value)") + } + var m map[string]interface{} + if Equal(mockT, m["bar"], "something") { + t.Error("Equal should return false") + } +} + +// bufferT implements TestingT. Its implementation of Errorf writes the output that would be produced by +// testing.T.Errorf to an internal bytes.Buffer. +type bufferT struct { + buf bytes.Buffer +} + +func (t *bufferT) Errorf(format string, args ...interface{}) { + // implementation of decorate is copied from testing.T + decorate := func(s string) string { + _, file, line, ok := runtime.Caller(3) // decorate + log + public function. + if ok { + // Truncate file name at last file name separator. + if index := strings.LastIndex(file, "/"); index >= 0 { + file = file[index+1:] + } else if index = strings.LastIndex(file, "\\"); index >= 0 { + file = file[index+1:] + } + } else { + file = "???" + line = 1 + } + buf := new(bytes.Buffer) + // Every line is indented at least one tab. + buf.WriteByte('\t') + fmt.Fprintf(buf, "%s:%d: ", file, line) + lines := strings.Split(s, "\n") + if l := len(lines); l > 1 && lines[l-1] == "" { + lines = lines[:l-1] + } + for i, line := range lines { + if i > 0 { + // Second and subsequent lines are indented an extra tab. + buf.WriteString("\n\t\t") + } + buf.WriteString(line) + } + buf.WriteByte('\n') + return buf.String() + } + t.buf.WriteString(decorate(fmt.Sprintf(format, args...))) +} + +func TestEqualFormatting(t *testing.T) { + for i, currCase := range []struct { + equalWant string + equalGot string + msgAndArgs []interface{} + want string + }{ + {equalWant: "want", equalGot: "got", want: "\tassertions.go:[0-9]+: \r \r\tError Trace:\t\n\t\t\r\tError: \tNot equal: \n\t\t\r\t \texpected: \"want\"\n\t\t\r\t \tactual : \"got\"\n"}, + {equalWant: "want", equalGot: "got", msgAndArgs: []interface{}{"hello, %v!", "world"}, want: "\tassertions.go:[0-9]+: \r \r\tError Trace:\t\n\t\t\r\tError: \tNot equal: \n\t\t\r\t \texpected: \"want\"\n\t\t\r\t \tactual : \"got\"\n\t\t\r\tMessages: \thello, world!\n"}, + } { + mockT := &bufferT{} + Equal(mockT, currCase.equalWant, currCase.equalGot, currCase.msgAndArgs...) + Regexp(t, regexp.MustCompile(currCase.want), mockT.buf.String(), "Case %d", i) + } +} + +func TestFormatUnequalValues(t *testing.T) { + expected, actual := formatUnequalValues("foo", "bar") + Equal(t, `"foo"`, expected, "value should not include type") + Equal(t, `"bar"`, actual, "value should not include type") + + expected, actual = formatUnequalValues(123, 123) + Equal(t, `123`, expected, "value should not include type") + Equal(t, `123`, actual, "value should not include type") + + expected, actual = formatUnequalValues(int64(123), int32(123)) + Equal(t, `int64(123)`, expected, "value should include type") + Equal(t, `int32(123)`, actual, "value should include type") + + expected, actual = formatUnequalValues(int64(123), nil) + Equal(t, `int64(123)`, expected, "value should include type") + Equal(t, `()`, actual, "value should include type") + + type testStructType struct { + Val string + } + + expected, actual = formatUnequalValues(&testStructType{Val: "test"}, &testStructType{Val: "test"}) + Equal(t, `&assert.testStructType{Val:"test"}`, expected, "value should not include type annotation") + Equal(t, `&assert.testStructType{Val:"test"}`, actual, "value should not include type annotation") +} + +func TestNotNil(t *testing.T) { + + mockT := new(testing.T) + + if !NotNil(mockT, new(AssertionTesterConformingObject)) { + t.Error("NotNil should return true: object is not nil") + } + if NotNil(mockT, nil) { + t.Error("NotNil should return false: object is nil") + } + if NotNil(mockT, (*struct{})(nil)) { + t.Error("NotNil should return false: object is (*struct{})(nil)") + } + +} + +func TestNil(t *testing.T) { + + mockT := new(testing.T) + + if !Nil(mockT, nil) { + t.Error("Nil should return true: object is nil") + } + if !Nil(mockT, (*struct{})(nil)) { + t.Error("Nil should return true: object is (*struct{})(nil)") + } + if Nil(mockT, new(AssertionTesterConformingObject)) { + t.Error("Nil should return false: object is not nil") + } + +} + +func TestTrue(t *testing.T) { + + mockT := new(testing.T) + + if !True(mockT, true) { + t.Error("True should return true") + } + if True(mockT, false) { + t.Error("True should return false") + } + +} + +func TestFalse(t *testing.T) { + + mockT := new(testing.T) + + if !False(mockT, false) { + t.Error("False should return true") + } + if False(mockT, true) { + t.Error("False should return false") + } + +} + +func TestExactly(t *testing.T) { + + mockT := new(testing.T) + + a := float32(1) + b := float64(1) + c := float32(1) + d := float32(2) + + if Exactly(mockT, a, b) { + t.Error("Exactly should return false") + } + if Exactly(mockT, a, d) { + t.Error("Exactly should return false") + } + if !Exactly(mockT, a, c) { + t.Error("Exactly should return true") + } + + if Exactly(mockT, nil, a) { + t.Error("Exactly should return false") + } + if Exactly(mockT, a, nil) { + t.Error("Exactly should return false") + } + +} + +func TestNotEqual(t *testing.T) { + + mockT := new(testing.T) + + if !NotEqual(mockT, "Hello World", "Hello World!") { + t.Error("NotEqual should return true") + } + if !NotEqual(mockT, 123, 1234) { + t.Error("NotEqual should return true") + } + if !NotEqual(mockT, 123.5, 123.55) { + t.Error("NotEqual should return true") + } + if !NotEqual(mockT, []byte("Hello World"), []byte("Hello World!")) { + t.Error("NotEqual should return true") + } + if !NotEqual(mockT, nil, new(AssertionTesterConformingObject)) { + t.Error("NotEqual should return true") + } + funcA := func() int { return 23 } + funcB := func() int { return 42 } + if NotEqual(mockT, funcA, funcB) { + t.Error("NotEqual should return false") + } + + if NotEqual(mockT, "Hello World", "Hello World") { + t.Error("NotEqual should return false") + } + if NotEqual(mockT, 123, 123) { + t.Error("NotEqual should return false") + } + if NotEqual(mockT, 123.5, 123.5) { + t.Error("NotEqual should return false") + } + if NotEqual(mockT, []byte("Hello World"), []byte("Hello World")) { + t.Error("NotEqual should return false") + } + if NotEqual(mockT, new(AssertionTesterConformingObject), new(AssertionTesterConformingObject)) { + t.Error("NotEqual should return false") + } + if NotEqual(mockT, &struct{}{}, &struct{}{}) { + t.Error("NotEqual should return false") + } +} + +type A struct { + Name, Value string +} + +func TestContains(t *testing.T) { + + mockT := new(testing.T) + list := []string{"Foo", "Bar"} + complexList := []*A{ + {"b", "c"}, + {"d", "e"}, + {"g", "h"}, + {"j", "k"}, + } + simpleMap := map[interface{}]interface{}{"Foo": "Bar"} + + if !Contains(mockT, "Hello World", "Hello") { + t.Error("Contains should return true: \"Hello World\" contains \"Hello\"") + } + if Contains(mockT, "Hello World", "Salut") { + t.Error("Contains should return false: \"Hello World\" does not contain \"Salut\"") + } + + if !Contains(mockT, list, "Bar") { + t.Error("Contains should return true: \"[\"Foo\", \"Bar\"]\" contains \"Bar\"") + } + if Contains(mockT, list, "Salut") { + t.Error("Contains should return false: \"[\"Foo\", \"Bar\"]\" does not contain \"Salut\"") + } + if !Contains(mockT, complexList, &A{"g", "h"}) { + t.Error("Contains should return true: complexList contains {\"g\", \"h\"}") + } + if Contains(mockT, complexList, &A{"g", "e"}) { + t.Error("Contains should return false: complexList contains {\"g\", \"e\"}") + } + if Contains(mockT, complexList, &A{"g", "e"}) { + t.Error("Contains should return false: complexList contains {\"g\", \"e\"}") + } + if !Contains(mockT, simpleMap, "Foo") { + t.Error("Contains should return true: \"{\"Foo\": \"Bar\"}\" contains \"Foo\"") + } + if Contains(mockT, simpleMap, "Bar") { + t.Error("Contains should return false: \"{\"Foo\": \"Bar\"}\" does not contains \"Bar\"") + } +} + +func TestNotContains(t *testing.T) { + + mockT := new(testing.T) + list := []string{"Foo", "Bar"} + simpleMap := map[interface{}]interface{}{"Foo": "Bar"} + + if !NotContains(mockT, "Hello World", "Hello!") { + t.Error("NotContains should return true: \"Hello World\" does not contain \"Hello!\"") + } + if NotContains(mockT, "Hello World", "Hello") { + t.Error("NotContains should return false: \"Hello World\" contains \"Hello\"") + } + + if !NotContains(mockT, list, "Foo!") { + t.Error("NotContains should return true: \"[\"Foo\", \"Bar\"]\" does not contain \"Foo!\"") + } + if NotContains(mockT, list, "Foo") { + t.Error("NotContains should return false: \"[\"Foo\", \"Bar\"]\" contains \"Foo\"") + } + if NotContains(mockT, simpleMap, "Foo") { + t.Error("Contains should return true: \"{\"Foo\": \"Bar\"}\" contains \"Foo\"") + } + if !NotContains(mockT, simpleMap, "Bar") { + t.Error("Contains should return false: \"{\"Foo\": \"Bar\"}\" does not contains \"Bar\"") + } +} + +func TestSubset(t *testing.T) { + mockT := new(testing.T) + + if !Subset(mockT, []int{1, 2, 3}, nil) { + t.Error("Subset should return true: given subset is nil") + } + if !Subset(mockT, []int{1, 2, 3}, []int{}) { + t.Error("Subset should return true: any set contains the nil set") + } + if !Subset(mockT, []int{1, 2, 3}, []int{1, 2}) { + t.Error("Subset should return true: [1, 2, 3] contains [1, 2]") + } + if !Subset(mockT, []int{1, 2, 3}, []int{1, 2, 3}) { + t.Error("Subset should return true: [1, 2, 3] contains [1, 2, 3]") + } + if !Subset(mockT, []string{"hello", "world"}, []string{"hello"}) { + t.Error("Subset should return true: [\"hello\", \"world\"] contains [\"hello\"]") + } + + if Subset(mockT, []string{"hello", "world"}, []string{"hello", "testify"}) { + t.Error("Subset should return false: [\"hello\", \"world\"] does not contain [\"hello\", \"testify\"]") + } + if Subset(mockT, []int{1, 2, 3}, []int{4, 5}) { + t.Error("Subset should return false: [1, 2, 3] does not contain [4, 5]") + } + if Subset(mockT, []int{1, 2, 3}, []int{1, 5}) { + t.Error("Subset should return false: [1, 2, 3] does not contain [1, 5]") + } +} + +func TestNotSubset(t *testing.T) { + mockT := new(testing.T) + + if NotSubset(mockT, []int{1, 2, 3}, nil) { + t.Error("NotSubset should return false: given subset is nil") + } + if NotSubset(mockT, []int{1, 2, 3}, []int{}) { + t.Error("NotSubset should return false: any set contains the nil set") + } + if NotSubset(mockT, []int{1, 2, 3}, []int{1, 2}) { + t.Error("NotSubset should return false: [1, 2, 3] contains [1, 2]") + } + if NotSubset(mockT, []int{1, 2, 3}, []int{1, 2, 3}) { + t.Error("NotSubset should return false: [1, 2, 3] contains [1, 2, 3]") + } + if NotSubset(mockT, []string{"hello", "world"}, []string{"hello"}) { + t.Error("NotSubset should return false: [\"hello\", \"world\"] contains [\"hello\"]") + } + + if !NotSubset(mockT, []string{"hello", "world"}, []string{"hello", "testify"}) { + t.Error("NotSubset should return true: [\"hello\", \"world\"] does not contain [\"hello\", \"testify\"]") + } + if !NotSubset(mockT, []int{1, 2, 3}, []int{4, 5}) { + t.Error("NotSubset should return true: [1, 2, 3] does not contain [4, 5]") + } + if !NotSubset(mockT, []int{1, 2, 3}, []int{1, 5}) { + t.Error("NotSubset should return true: [1, 2, 3] does not contain [1, 5]") + } +} + +func TestNotSubsetNil(t *testing.T) { + mockT := new(testing.T) + NotSubset(mockT, []string{"foo"}, nil) + if !mockT.Failed() { + t.Error("NotSubset on nil set should have failed the test") + } +} + +func Test_includeElement(t *testing.T) { + + list1 := []string{"Foo", "Bar"} + list2 := []int{1, 2} + simpleMap := map[interface{}]interface{}{"Foo": "Bar"} + + ok, found := includeElement("Hello World", "World") + True(t, ok) + True(t, found) + + ok, found = includeElement(list1, "Foo") + True(t, ok) + True(t, found) + + ok, found = includeElement(list1, "Bar") + True(t, ok) + True(t, found) + + ok, found = includeElement(list2, 1) + True(t, ok) + True(t, found) + + ok, found = includeElement(list2, 2) + True(t, ok) + True(t, found) + + ok, found = includeElement(list1, "Foo!") + True(t, ok) + False(t, found) + + ok, found = includeElement(list2, 3) + True(t, ok) + False(t, found) + + ok, found = includeElement(list2, "1") + True(t, ok) + False(t, found) + + ok, found = includeElement(simpleMap, "Foo") + True(t, ok) + True(t, found) + + ok, found = includeElement(simpleMap, "Bar") + True(t, ok) + False(t, found) + + ok, found = includeElement(1433, "1") + False(t, ok) + False(t, found) +} + +func TestElementsMatch(t *testing.T) { + mockT := new(testing.T) + + if !ElementsMatch(mockT, nil, nil) { + t.Error("ElementsMatch should return true") + } + if !ElementsMatch(mockT, []int{}, []int{}) { + t.Error("ElementsMatch should return true") + } + if !ElementsMatch(mockT, []int{1}, []int{1}) { + t.Error("ElementsMatch should return true") + } + if !ElementsMatch(mockT, []int{1, 1}, []int{1, 1}) { + t.Error("ElementsMatch should return true") + } + if !ElementsMatch(mockT, []int{1, 2}, []int{1, 2}) { + t.Error("ElementsMatch should return true") + } + if !ElementsMatch(mockT, []int{1, 2}, []int{2, 1}) { + t.Error("ElementsMatch should return true") + } + if !ElementsMatch(mockT, [2]int{1, 2}, [2]int{2, 1}) { + t.Error("ElementsMatch should return true") + } + if !ElementsMatch(mockT, []string{"hello", "world"}, []string{"world", "hello"}) { + t.Error("ElementsMatch should return true") + } + if !ElementsMatch(mockT, []string{"hello", "hello"}, []string{"hello", "hello"}) { + t.Error("ElementsMatch should return true") + } + if !ElementsMatch(mockT, []string{"hello", "hello", "world"}, []string{"hello", "world", "hello"}) { + t.Error("ElementsMatch should return true") + } + if !ElementsMatch(mockT, [3]string{"hello", "hello", "world"}, [3]string{"hello", "world", "hello"}) { + t.Error("ElementsMatch should return true") + } + if !ElementsMatch(mockT, []int{}, nil) { + t.Error("ElementsMatch should return true") + } + + if ElementsMatch(mockT, []int{1}, []int{1, 1}) { + t.Error("ElementsMatch should return false") + } + if ElementsMatch(mockT, []int{1, 2}, []int{2, 2}) { + t.Error("ElementsMatch should return false") + } + if ElementsMatch(mockT, []string{"hello", "hello"}, []string{"hello"}) { + t.Error("ElementsMatch should return false") + } +} + +func TestCondition(t *testing.T) { + mockT := new(testing.T) + + if !Condition(mockT, func() bool { return true }, "Truth") { + t.Error("Condition should return true") + } + + if Condition(mockT, func() bool { return false }, "Lie") { + t.Error("Condition should return false") + } + +} + +func TestDidPanic(t *testing.T) { + + if funcDidPanic, _ := didPanic(func() { + panic("Panic!") + }); !funcDidPanic { + t.Error("didPanic should return true") + } + + if funcDidPanic, _ := didPanic(func() { + }); funcDidPanic { + t.Error("didPanic should return false") + } + +} + +func TestPanics(t *testing.T) { + + mockT := new(testing.T) + + if !Panics(mockT, func() { + panic("Panic!") + }) { + t.Error("Panics should return true") + } + + if Panics(mockT, func() { + }) { + t.Error("Panics should return false") + } + +} + +func TestPanicsWithValue(t *testing.T) { + + mockT := new(testing.T) + + if !PanicsWithValue(mockT, "Panic!", func() { + panic("Panic!") + }) { + t.Error("PanicsWithValue should return true") + } + + if PanicsWithValue(mockT, "Panic!", func() { + }) { + t.Error("PanicsWithValue should return false") + } + + if PanicsWithValue(mockT, "at the disco", func() { + panic("Panic!") + }) { + t.Error("PanicsWithValue should return false") + } +} + +func TestNotPanics(t *testing.T) { + + mockT := new(testing.T) + + if !NotPanics(mockT, func() { + }) { + t.Error("NotPanics should return true") + } + + if NotPanics(mockT, func() { + panic("Panic!") + }) { + t.Error("NotPanics should return false") + } + +} + +func TestNoError(t *testing.T) { + + mockT := new(testing.T) + + // start with a nil error + var err error + + True(t, NoError(mockT, err), "NoError should return True for nil arg") + + // now set an error + err = errors.New("some error") + + False(t, NoError(mockT, err), "NoError with error should return False") + + // returning an empty error interface + err = func() error { + var err *customError + if err != nil { + t.Fatal("err should be nil here") + } + return err + }() + + if err == nil { // err is not nil here! + t.Errorf("Error should be nil due to empty interface: %s", err) + } + + False(t, NoError(mockT, err), "NoError should fail with empty error interface") +} + +type customError struct{} + +func (*customError) Error() string { return "fail" } + +func TestError(t *testing.T) { + + mockT := new(testing.T) + + // start with a nil error + var err error + + False(t, Error(mockT, err), "Error should return False for nil arg") + + // now set an error + err = errors.New("some error") + + True(t, Error(mockT, err), "Error with error should return True") + + // go vet check + True(t, Errorf(mockT, err, "example with %s", "formatted message"), "Errorf with error should rturn True") + + // returning an empty error interface + err = func() error { + var err *customError + if err != nil { + t.Fatal("err should be nil here") + } + return err + }() + + if err == nil { // err is not nil here! + t.Errorf("Error should be nil due to empty interface: %s", err) + } + + True(t, Error(mockT, err), "Error should pass with empty error interface") +} + +func TestEqualError(t *testing.T) { + mockT := new(testing.T) + + // start with a nil error + var err error + False(t, EqualError(mockT, err, ""), + "EqualError should return false for nil arg") + + // now set an error + err = errors.New("some error") + False(t, EqualError(mockT, err, "Not some error"), + "EqualError should return false for different error string") + True(t, EqualError(mockT, err, "some error"), + "EqualError should return true") +} + +func Test_isEmpty(t *testing.T) { + + chWithValue := make(chan struct{}, 1) + chWithValue <- struct{}{} + + True(t, isEmpty("")) + True(t, isEmpty(nil)) + True(t, isEmpty([]string{})) + True(t, isEmpty(0)) + True(t, isEmpty(int32(0))) + True(t, isEmpty(int64(0))) + True(t, isEmpty(false)) + True(t, isEmpty(map[string]string{})) + True(t, isEmpty(new(time.Time))) + True(t, isEmpty(time.Time{})) + True(t, isEmpty(make(chan struct{}))) + False(t, isEmpty("something")) + False(t, isEmpty(errors.New("something"))) + False(t, isEmpty([]string{"something"})) + False(t, isEmpty(1)) + False(t, isEmpty(true)) + False(t, isEmpty(map[string]string{"Hello": "World"})) + False(t, isEmpty(chWithValue)) + +} + +func TestEmpty(t *testing.T) { + + mockT := new(testing.T) + chWithValue := make(chan struct{}, 1) + chWithValue <- struct{}{} + var tiP *time.Time + var tiNP time.Time + var s *string + var f *os.File + sP := &s + x := 1 + xP := &x + + type TString string + type TStruct struct { + x int + s []int + } + + True(t, Empty(mockT, ""), "Empty string is empty") + True(t, Empty(mockT, nil), "Nil is empty") + True(t, Empty(mockT, []string{}), "Empty string array is empty") + True(t, Empty(mockT, 0), "Zero int value is empty") + True(t, Empty(mockT, false), "False value is empty") + True(t, Empty(mockT, make(chan struct{})), "Channel without values is empty") + True(t, Empty(mockT, s), "Nil string pointer is empty") + True(t, Empty(mockT, f), "Nil os.File pointer is empty") + True(t, Empty(mockT, tiP), "Nil time.Time pointer is empty") + True(t, Empty(mockT, tiNP), "time.Time is empty") + True(t, Empty(mockT, TStruct{}), "struct with zero values is empty") + True(t, Empty(mockT, TString("")), "empty aliased string is empty") + True(t, Empty(mockT, sP), "ptr to nil value is empty") + + False(t, Empty(mockT, "something"), "Non Empty string is not empty") + False(t, Empty(mockT, errors.New("something")), "Non nil object is not empty") + False(t, Empty(mockT, []string{"something"}), "Non empty string array is not empty") + False(t, Empty(mockT, 1), "Non-zero int value is not empty") + False(t, Empty(mockT, true), "True value is not empty") + False(t, Empty(mockT, chWithValue), "Channel with values is not empty") + False(t, Empty(mockT, TStruct{x: 1}), "struct with initialized values is empty") + False(t, Empty(mockT, TString("abc")), "non-empty aliased string is empty") + False(t, Empty(mockT, xP), "ptr to non-nil value is not empty") +} + +func TestNotEmpty(t *testing.T) { + + mockT := new(testing.T) + chWithValue := make(chan struct{}, 1) + chWithValue <- struct{}{} + + False(t, NotEmpty(mockT, ""), "Empty string is empty") + False(t, NotEmpty(mockT, nil), "Nil is empty") + False(t, NotEmpty(mockT, []string{}), "Empty string array is empty") + False(t, NotEmpty(mockT, 0), "Zero int value is empty") + False(t, NotEmpty(mockT, false), "False value is empty") + False(t, NotEmpty(mockT, make(chan struct{})), "Channel without values is empty") + + True(t, NotEmpty(mockT, "something"), "Non Empty string is not empty") + True(t, NotEmpty(mockT, errors.New("something")), "Non nil object is not empty") + True(t, NotEmpty(mockT, []string{"something"}), "Non empty string array is not empty") + True(t, NotEmpty(mockT, 1), "Non-zero int value is not empty") + True(t, NotEmpty(mockT, true), "True value is not empty") + True(t, NotEmpty(mockT, chWithValue), "Channel with values is not empty") +} + +func Test_getLen(t *testing.T) { + falseCases := []interface{}{ + nil, + 0, + true, + false, + 'A', + struct{}{}, + } + for _, v := range falseCases { + ok, l := getLen(v) + False(t, ok, "Expected getLen fail to get length of %#v", v) + Equal(t, 0, l, "getLen should return 0 for %#v", v) + } + + ch := make(chan int, 5) + ch <- 1 + ch <- 2 + ch <- 3 + trueCases := []struct { + v interface{} + l int + }{ + {[]int{1, 2, 3}, 3}, + {[...]int{1, 2, 3}, 3}, + {"ABC", 3}, + {map[int]int{1: 2, 2: 4, 3: 6}, 3}, + {ch, 3}, + + {[]int{}, 0}, + {map[int]int{}, 0}, + {make(chan int), 0}, + + {[]int(nil), 0}, + {map[int]int(nil), 0}, + {(chan int)(nil), 0}, + } + + for _, c := range trueCases { + ok, l := getLen(c.v) + True(t, ok, "Expected getLen success to get length of %#v", c.v) + Equal(t, c.l, l) + } +} + +func TestLen(t *testing.T) { + mockT := new(testing.T) + + False(t, Len(mockT, nil, 0), "nil does not have length") + False(t, Len(mockT, 0, 0), "int does not have length") + False(t, Len(mockT, true, 0), "true does not have length") + False(t, Len(mockT, false, 0), "false does not have length") + False(t, Len(mockT, 'A', 0), "Rune does not have length") + False(t, Len(mockT, struct{}{}, 0), "Struct does not have length") + + ch := make(chan int, 5) + ch <- 1 + ch <- 2 + ch <- 3 + + cases := []struct { + v interface{} + l int + }{ + {[]int{1, 2, 3}, 3}, + {[...]int{1, 2, 3}, 3}, + {"ABC", 3}, + {map[int]int{1: 2, 2: 4, 3: 6}, 3}, + {ch, 3}, + + {[]int{}, 0}, + {map[int]int{}, 0}, + {make(chan int), 0}, + + {[]int(nil), 0}, + {map[int]int(nil), 0}, + {(chan int)(nil), 0}, + } + + for _, c := range cases { + True(t, Len(mockT, c.v, c.l), "%#v have %d items", c.v, c.l) + } + + cases = []struct { + v interface{} + l int + }{ + {[]int{1, 2, 3}, 4}, + {[...]int{1, 2, 3}, 2}, + {"ABC", 2}, + {map[int]int{1: 2, 2: 4, 3: 6}, 4}, + {ch, 2}, + + {[]int{}, 1}, + {map[int]int{}, 1}, + {make(chan int), 1}, + + {[]int(nil), 1}, + {map[int]int(nil), 1}, + {(chan int)(nil), 1}, + } + + for _, c := range cases { + False(t, Len(mockT, c.v, c.l), "%#v have %d items", c.v, c.l) + } +} + +func TestWithinDuration(t *testing.T) { + + mockT := new(testing.T) + a := time.Now() + b := a.Add(10 * time.Second) + + True(t, WithinDuration(mockT, a, b, 10*time.Second), "A 10s difference is within a 10s time difference") + True(t, WithinDuration(mockT, b, a, 10*time.Second), "A 10s difference is within a 10s time difference") + + False(t, WithinDuration(mockT, a, b, 9*time.Second), "A 10s difference is not within a 9s time difference") + False(t, WithinDuration(mockT, b, a, 9*time.Second), "A 10s difference is not within a 9s time difference") + + False(t, WithinDuration(mockT, a, b, -9*time.Second), "A 10s difference is not within a 9s time difference") + False(t, WithinDuration(mockT, b, a, -9*time.Second), "A 10s difference is not within a 9s time difference") + + False(t, WithinDuration(mockT, a, b, -11*time.Second), "A 10s difference is not within a 9s time difference") + False(t, WithinDuration(mockT, b, a, -11*time.Second), "A 10s difference is not within a 9s time difference") +} + +func TestInDelta(t *testing.T) { + mockT := new(testing.T) + + True(t, InDelta(mockT, 1.001, 1, 0.01), "|1.001 - 1| <= 0.01") + True(t, InDelta(mockT, 1, 1.001, 0.01), "|1 - 1.001| <= 0.01") + True(t, InDelta(mockT, 1, 2, 1), "|1 - 2| <= 1") + False(t, InDelta(mockT, 1, 2, 0.5), "Expected |1 - 2| <= 0.5 to fail") + False(t, InDelta(mockT, 2, 1, 0.5), "Expected |2 - 1| <= 0.5 to fail") + False(t, InDelta(mockT, "", nil, 1), "Expected non numerals to fail") + False(t, InDelta(mockT, 42, math.NaN(), 0.01), "Expected NaN for actual to fail") + False(t, InDelta(mockT, math.NaN(), 42, 0.01), "Expected NaN for expected to fail") + + cases := []struct { + a, b interface{} + delta float64 + }{ + {uint8(2), uint8(1), 1}, + {uint16(2), uint16(1), 1}, + {uint32(2), uint32(1), 1}, + {uint64(2), uint64(1), 1}, + + {int(2), int(1), 1}, + {int8(2), int8(1), 1}, + {int16(2), int16(1), 1}, + {int32(2), int32(1), 1}, + {int64(2), int64(1), 1}, + + {float32(2), float32(1), 1}, + {float64(2), float64(1), 1}, + } + + for _, tc := range cases { + True(t, InDelta(mockT, tc.a, tc.b, tc.delta), "Expected |%V - %V| <= %v", tc.a, tc.b, tc.delta) + } +} + +func TestInDeltaSlice(t *testing.T) { + mockT := new(testing.T) + + True(t, InDeltaSlice(mockT, + []float64{1.001, 0.999}, + []float64{1, 1}, + 0.1), "{1.001, 0.009} is element-wise close to {1, 1} in delta=0.1") + + True(t, InDeltaSlice(mockT, + []float64{1, 2}, + []float64{0, 3}, + 1), "{1, 2} is element-wise close to {0, 3} in delta=1") + + False(t, InDeltaSlice(mockT, + []float64{1, 2}, + []float64{0, 3}, + 0.1), "{1, 2} is not element-wise close to {0, 3} in delta=0.1") + + False(t, InDeltaSlice(mockT, "", nil, 1), "Expected non numeral slices to fail") +} + +func TestInDeltaMapValues(t *testing.T) { + mockT := new(testing.T) + + for _, tc := range []struct { + title string + expect interface{} + actual interface{} + f func(TestingT, bool, ...interface{}) bool + delta float64 + }{ + { + title: "Within delta", + expect: map[string]float64{ + "foo": 1.0, + "bar": 2.0, + }, + actual: map[string]float64{ + "foo": 1.01, + "bar": 1.99, + }, + delta: 0.1, + f: True, + }, + { + title: "Within delta", + expect: map[int]float64{ + 1: 1.0, + 2: 2.0, + }, + actual: map[int]float64{ + 1: 1.0, + 2: 1.99, + }, + delta: 0.1, + f: True, + }, + { + title: "Different number of keys", + expect: map[int]float64{ + 1: 1.0, + 2: 2.0, + }, + actual: map[int]float64{ + 1: 1.0, + }, + delta: 0.1, + f: False, + }, + { + title: "Within delta with zero value", + expect: map[string]float64{ + "zero": 0.0, + }, + actual: map[string]float64{ + "zero": 0.0, + }, + delta: 0.1, + f: True, + }, + { + title: "With missing key with zero value", + expect: map[string]float64{ + "zero": 0.0, + "foo": 0.0, + }, + actual: map[string]float64{ + "zero": 0.0, + "bar": 0.0, + }, + f: False, + }, + } { + tc.f(t, InDeltaMapValues(mockT, tc.expect, tc.actual, tc.delta), tc.title+"\n"+diff(tc.expect, tc.actual)) + } +} + +func TestInEpsilon(t *testing.T) { + mockT := new(testing.T) + + cases := []struct { + a, b interface{} + epsilon float64 + }{ + {uint8(2), uint16(2), .001}, + {2.1, 2.2, 0.1}, + {2.2, 2.1, 0.1}, + {-2.1, -2.2, 0.1}, + {-2.2, -2.1, 0.1}, + {uint64(100), uint8(101), 0.01}, + {0.1, -0.1, 2}, + {0.1, 0, 2}, + {time.Second, time.Second + time.Millisecond, 0.002}, + } + + for _, tc := range cases { + True(t, InEpsilon(t, tc.a, tc.b, tc.epsilon, "Expected %V and %V to have a relative difference of %v", tc.a, tc.b, tc.epsilon), "test: %q", tc) + } + + cases = []struct { + a, b interface{} + epsilon float64 + }{ + {uint8(2), int16(-2), .001}, + {uint64(100), uint8(102), 0.01}, + {2.1, 2.2, 0.001}, + {2.2, 2.1, 0.001}, + {2.1, -2.2, 1}, + {2.1, "bla-bla", 0}, + {0.1, -0.1, 1.99}, + {0, 0.1, 2}, // expected must be different to zero + {time.Second, time.Second + 10*time.Millisecond, 0.002}, + } + + for _, tc := range cases { + False(t, InEpsilon(mockT, tc.a, tc.b, tc.epsilon, "Expected %V and %V to have a relative difference of %v", tc.a, tc.b, tc.epsilon)) + } + +} + +func TestInEpsilonSlice(t *testing.T) { + mockT := new(testing.T) + + True(t, InEpsilonSlice(mockT, + []float64{2.2, 2.0}, + []float64{2.1, 2.1}, + 0.06), "{2.2, 2.0} is element-wise close to {2.1, 2.1} in espilon=0.06") + + False(t, InEpsilonSlice(mockT, + []float64{2.2, 2.0}, + []float64{2.1, 2.1}, + 0.04), "{2.2, 2.0} is not element-wise close to {2.1, 2.1} in espilon=0.04") + + False(t, InEpsilonSlice(mockT, "", nil, 1), "Expected non numeral slices to fail") +} + +func TestRegexp(t *testing.T) { + mockT := new(testing.T) + + cases := []struct { + rx, str string + }{ + {"^start", "start of the line"}, + {"end$", "in the end"}, + {"[0-9]{3}[.-]?[0-9]{2}[.-]?[0-9]{2}", "My phone number is 650.12.34"}, + } + + for _, tc := range cases { + True(t, Regexp(mockT, tc.rx, tc.str)) + True(t, Regexp(mockT, regexp.MustCompile(tc.rx), tc.str)) + False(t, NotRegexp(mockT, tc.rx, tc.str)) + False(t, NotRegexp(mockT, regexp.MustCompile(tc.rx), tc.str)) + } + + cases = []struct { + rx, str string + }{ + {"^asdfastart", "Not the start of the line"}, + {"end$", "in the end."}, + {"[0-9]{3}[.-]?[0-9]{2}[.-]?[0-9]{2}", "My phone number is 650.12a.34"}, + } + + for _, tc := range cases { + False(t, Regexp(mockT, tc.rx, tc.str), "Expected \"%s\" to not match \"%s\"", tc.rx, tc.str) + False(t, Regexp(mockT, regexp.MustCompile(tc.rx), tc.str)) + True(t, NotRegexp(mockT, tc.rx, tc.str)) + True(t, NotRegexp(mockT, regexp.MustCompile(tc.rx), tc.str)) + } +} + +func testAutogeneratedFunction() { + defer func() { + if err := recover(); err == nil { + panic("did not panic") + } + CallerInfo() + }() + t := struct { + io.Closer + }{} + var c io.Closer + c = t + c.Close() +} + +func TestCallerInfoWithAutogeneratedFunctions(t *testing.T) { + NotPanics(t, func() { + testAutogeneratedFunction() + }) +} + +func TestZero(t *testing.T) { + mockT := new(testing.T) + + for _, test := range zeros { + True(t, Zero(mockT, test, "%#v is not the %v zero value", test, reflect.TypeOf(test))) + } + + for _, test := range nonZeros { + False(t, Zero(mockT, test, "%#v is not the %v zero value", test, reflect.TypeOf(test))) + } +} + +func TestNotZero(t *testing.T) { + mockT := new(testing.T) + + for _, test := range zeros { + False(t, NotZero(mockT, test, "%#v is not the %v zero value", test, reflect.TypeOf(test))) + } + + for _, test := range nonZeros { + True(t, NotZero(mockT, test, "%#v is not the %v zero value", test, reflect.TypeOf(test))) + } +} + +func TestFileExists(t *testing.T) { + mockT := new(testing.T) + True(t, FileExists(mockT, "assertions.go")) + + mockT = new(testing.T) + False(t, FileExists(mockT, "random_file")) + + mockT = new(testing.T) + False(t, FileExists(mockT, "../_codegen")) +} + +func TestDirExists(t *testing.T) { + mockT := new(testing.T) + False(t, DirExists(mockT, "assertions.go")) + + mockT = new(testing.T) + False(t, DirExists(mockT, "random_dir")) + + mockT = new(testing.T) + True(t, DirExists(mockT, "../_codegen")) +} + +func TestJSONEq_EqualSONString(t *testing.T) { + mockT := new(testing.T) + True(t, JSONEq(mockT, `{"hello": "world", "foo": "bar"}`, `{"hello": "world", "foo": "bar"}`)) +} + +func TestJSONEq_EquivalentButNotEqual(t *testing.T) { + mockT := new(testing.T) + True(t, JSONEq(mockT, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`)) +} + +func TestJSONEq_HashOfArraysAndHashes(t *testing.T) { + mockT := new(testing.T) + True(t, JSONEq(mockT, "{\r\n\t\"numeric\": 1.5,\r\n\t\"array\": [{\"foo\": \"bar\"}, 1, \"string\", [\"nested\", \"array\", 5.5]],\r\n\t\"hash\": {\"nested\": \"hash\", \"nested_slice\": [\"this\", \"is\", \"nested\"]},\r\n\t\"string\": \"foo\"\r\n}", + "{\r\n\t\"numeric\": 1.5,\r\n\t\"hash\": {\"nested\": \"hash\", \"nested_slice\": [\"this\", \"is\", \"nested\"]},\r\n\t\"string\": \"foo\",\r\n\t\"array\": [{\"foo\": \"bar\"}, 1, \"string\", [\"nested\", \"array\", 5.5]]\r\n}")) +} + +func TestJSONEq_Array(t *testing.T) { + mockT := new(testing.T) + True(t, JSONEq(mockT, `["foo", {"hello": "world", "nested": "hash"}]`, `["foo", {"nested": "hash", "hello": "world"}]`)) +} + +func TestJSONEq_HashAndArrayNotEquivalent(t *testing.T) { + mockT := new(testing.T) + False(t, JSONEq(mockT, `["foo", {"hello": "world", "nested": "hash"}]`, `{"foo": "bar", {"nested": "hash", "hello": "world"}}`)) +} + +func TestJSONEq_HashesNotEquivalent(t *testing.T) { + mockT := new(testing.T) + False(t, JSONEq(mockT, `{"foo": "bar"}`, `{"foo": "bar", "hello": "world"}`)) +} + +func TestJSONEq_ActualIsNotJSON(t *testing.T) { + mockT := new(testing.T) + False(t, JSONEq(mockT, `{"foo": "bar"}`, "Not JSON")) +} + +func TestJSONEq_ExpectedIsNotJSON(t *testing.T) { + mockT := new(testing.T) + False(t, JSONEq(mockT, "Not JSON", `{"foo": "bar", "hello": "world"}`)) +} + +func TestJSONEq_ExpectedAndActualNotJSON(t *testing.T) { + mockT := new(testing.T) + False(t, JSONEq(mockT, "Not JSON", "Not JSON")) +} + +func TestJSONEq_ArraysOfDifferentOrder(t *testing.T) { + mockT := new(testing.T) + False(t, JSONEq(mockT, `["foo", {"hello": "world", "nested": "hash"}]`, `[{ "hello": "world", "nested": "hash"}, "foo"]`)) +} + +func TestDiff(t *testing.T) { + expected := ` + +Diff: +--- Expected ++++ Actual +@@ -1,3 +1,3 @@ + (struct { foo string }) { +- foo: (string) (len=5) "hello" ++ foo: (string) (len=3) "bar" + } +` + actual := diff( + struct{ foo string }{"hello"}, + struct{ foo string }{"bar"}, + ) + Equal(t, expected, actual) + + expected = ` + +Diff: +--- Expected ++++ Actual +@@ -2,5 +2,5 @@ + (int) 1, +- (int) 2, + (int) 3, +- (int) 4 ++ (int) 5, ++ (int) 7 + } +` + actual = diff( + []int{1, 2, 3, 4}, + []int{1, 3, 5, 7}, + ) + Equal(t, expected, actual) + + expected = ` + +Diff: +--- Expected ++++ Actual +@@ -2,4 +2,4 @@ + (int) 1, +- (int) 2, +- (int) 3 ++ (int) 3, ++ (int) 5 + } +` + actual = diff( + []int{1, 2, 3, 4}[0:3], + []int{1, 3, 5, 7}[0:3], + ) + Equal(t, expected, actual) + + expected = ` + +Diff: +--- Expected ++++ Actual +@@ -1,6 +1,6 @@ + (map[string]int) (len=4) { +- (string) (len=4) "four": (int) 4, ++ (string) (len=4) "five": (int) 5, + (string) (len=3) "one": (int) 1, +- (string) (len=5) "three": (int) 3, +- (string) (len=3) "two": (int) 2 ++ (string) (len=5) "seven": (int) 7, ++ (string) (len=5) "three": (int) 3 + } +` + + actual = diff( + map[string]int{"one": 1, "two": 2, "three": 3, "four": 4}, + map[string]int{"one": 1, "three": 3, "five": 5, "seven": 7}, + ) + Equal(t, expected, actual) +} + +func TestDiffEmptyCases(t *testing.T) { + Equal(t, "", diff(nil, nil)) + Equal(t, "", diff(struct{ foo string }{}, nil)) + Equal(t, "", diff(nil, struct{ foo string }{})) + Equal(t, "", diff(1, 2)) + Equal(t, "", diff(1, 2)) + Equal(t, "", diff([]int{1}, []bool{true})) +} + +// Ensure there are no data races +func TestDiffRace(t *testing.T) { + t.Parallel() + + expected := map[string]string{ + "a": "A", + "b": "B", + "c": "C", + } + + actual := map[string]string{ + "d": "D", + "e": "E", + "f": "F", + } + + // run diffs in parallel simulating tests with t.Parallel() + numRoutines := 10 + rChans := make([]chan string, numRoutines) + for idx := range rChans { + rChans[idx] = make(chan string) + go func(ch chan string) { + defer close(ch) + ch <- diff(expected, actual) + }(rChans[idx]) + } + + for _, ch := range rChans { + for msg := range ch { + NotZero(t, msg) // dummy assert + } + } +} + +type mockTestingT struct { +} + +func (m *mockTestingT) Errorf(format string, args ...interface{}) {} + +func TestFailNowWithPlainTestingT(t *testing.T) { + mockT := &mockTestingT{} + + Panics(t, func() { + FailNow(mockT, "failed") + }, "should panic since mockT is missing FailNow()") +} + +type mockFailNowTestingT struct { +} + +func (m *mockFailNowTestingT) Errorf(format string, args ...interface{}) {} + +func (m *mockFailNowTestingT) FailNow() {} + +func TestFailNowWithFullTestingT(t *testing.T) { + mockT := &mockFailNowTestingT{} + + NotPanics(t, func() { + FailNow(mockT, "failed") + }, "should call mockT.FailNow() rather than panicking") +} + +func TestBytesEqual(t *testing.T) { + var cases = []struct { + a, b []byte + }{ + {make([]byte, 2), make([]byte, 2)}, + {make([]byte, 2), make([]byte, 2, 3)}, + {nil, make([]byte, 0)}, + } + for i, c := range cases { + Equal(t, reflect.DeepEqual(c.a, c.b), ObjectsAreEqual(c.a, c.b), "case %d failed", i+1) + } +} + +func BenchmarkBytesEqual(b *testing.B) { + const size = 1024 * 8 + s := make([]byte, size) + for i := range s { + s[i] = byte(i % 255) + } + s2 := make([]byte, size) + copy(s2, s) + + mockT := &mockFailNowTestingT{} + b.ResetTimer() + for i := 0; i < b.N; i++ { + Equal(mockT, s, s2) + } +} + +func TestEqualArgsValidation(t *testing.T) { + err := validateEqualArgs(time.Now, time.Now) + EqualError(t, err, "cannot take func type as argument") +} diff --git a/api/vendor/github.com/stretchr/testify/assert/doc.go b/api/vendor/github.com/stretchr/testify/assert/doc.go new file mode 100644 index 0000000..c9dccc4 --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/assert/doc.go @@ -0,0 +1,45 @@ +// Package assert provides a set of comprehensive testing tools for use with the normal Go testing system. +// +// Example Usage +// +// The following is a complete example using assert in a standard test function: +// import ( +// "testing" +// "github.com/stretchr/testify/assert" +// ) +// +// func TestSomething(t *testing.T) { +// +// var a string = "Hello" +// var b string = "Hello" +// +// assert.Equal(t, a, b, "The two words should be the same.") +// +// } +// +// if you assert many times, use the format below: +// +// import ( +// "testing" +// "github.com/stretchr/testify/assert" +// ) +// +// func TestSomething(t *testing.T) { +// assert := assert.New(t) +// +// var a string = "Hello" +// var b string = "Hello" +// +// assert.Equal(a, b, "The two words should be the same.") +// } +// +// Assertions +// +// Assertions allow you to easily write test code, and are global funcs in the `assert` package. +// All assertion functions take, as the first argument, the `*testing.T` object provided by the +// testing framework. This allows the assertion funcs to write the failings and other details to +// the correct place. +// +// Every assertion function also takes an optional string message as the final argument, +// allowing custom error messages to be appended to the message the assertion method outputs. +package assert diff --git a/api/vendor/github.com/stretchr/testify/assert/errors.go b/api/vendor/github.com/stretchr/testify/assert/errors.go new file mode 100644 index 0000000..ac9dc9d --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/assert/errors.go @@ -0,0 +1,10 @@ +package assert + +import ( + "errors" +) + +// AnError is an error instance useful for testing. If the code does not care +// about error specifics, and only needs to return the error for example, this +// error should be used to make the test code more readable. +var AnError = errors.New("assert.AnError general error for testing") diff --git a/api/vendor/github.com/stretchr/testify/assert/forward_assertions.go b/api/vendor/github.com/stretchr/testify/assert/forward_assertions.go new file mode 100644 index 0000000..9ad5685 --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/assert/forward_assertions.go @@ -0,0 +1,16 @@ +package assert + +// Assertions provides assertion methods around the +// TestingT interface. +type Assertions struct { + t TestingT +} + +// New makes a new Assertions object for the specified TestingT. +func New(t TestingT) *Assertions { + return &Assertions{ + t: t, + } +} + +//go:generate go run ../_codegen/main.go -output-package=assert -template=assertion_forward.go.tmpl -include-format-funcs diff --git a/api/vendor/github.com/stretchr/testify/assert/forward_assertions_test.go b/api/vendor/github.com/stretchr/testify/assert/forward_assertions_test.go new file mode 100644 index 0000000..22e1df1 --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/assert/forward_assertions_test.go @@ -0,0 +1,611 @@ +package assert + +import ( + "errors" + "regexp" + "testing" + "time" +) + +func TestImplementsWrapper(t *testing.T) { + assert := New(new(testing.T)) + + if !assert.Implements((*AssertionTesterInterface)(nil), new(AssertionTesterConformingObject)) { + t.Error("Implements method should return true: AssertionTesterConformingObject implements AssertionTesterInterface") + } + if assert.Implements((*AssertionTesterInterface)(nil), new(AssertionTesterNonConformingObject)) { + t.Error("Implements method should return false: AssertionTesterNonConformingObject does not implements AssertionTesterInterface") + } +} + +func TestIsTypeWrapper(t *testing.T) { + assert := New(new(testing.T)) + + if !assert.IsType(new(AssertionTesterConformingObject), new(AssertionTesterConformingObject)) { + t.Error("IsType should return true: AssertionTesterConformingObject is the same type as AssertionTesterConformingObject") + } + if assert.IsType(new(AssertionTesterConformingObject), new(AssertionTesterNonConformingObject)) { + t.Error("IsType should return false: AssertionTesterConformingObject is not the same type as AssertionTesterNonConformingObject") + } + +} + +func TestEqualWrapper(t *testing.T) { + assert := New(new(testing.T)) + + if !assert.Equal("Hello World", "Hello World") { + t.Error("Equal should return true") + } + if !assert.Equal(123, 123) { + t.Error("Equal should return true") + } + if !assert.Equal(123.5, 123.5) { + t.Error("Equal should return true") + } + if !assert.Equal([]byte("Hello World"), []byte("Hello World")) { + t.Error("Equal should return true") + } + if !assert.Equal(nil, nil) { + t.Error("Equal should return true") + } +} + +func TestEqualValuesWrapper(t *testing.T) { + assert := New(new(testing.T)) + + if !assert.EqualValues(uint32(10), int32(10)) { + t.Error("EqualValues should return true") + } +} + +func TestNotNilWrapper(t *testing.T) { + assert := New(new(testing.T)) + + if !assert.NotNil(new(AssertionTesterConformingObject)) { + t.Error("NotNil should return true: object is not nil") + } + if assert.NotNil(nil) { + t.Error("NotNil should return false: object is nil") + } + +} + +func TestNilWrapper(t *testing.T) { + assert := New(new(testing.T)) + + if !assert.Nil(nil) { + t.Error("Nil should return true: object is nil") + } + if assert.Nil(new(AssertionTesterConformingObject)) { + t.Error("Nil should return false: object is not nil") + } + +} + +func TestTrueWrapper(t *testing.T) { + assert := New(new(testing.T)) + + if !assert.True(true) { + t.Error("True should return true") + } + if assert.True(false) { + t.Error("True should return false") + } + +} + +func TestFalseWrapper(t *testing.T) { + assert := New(new(testing.T)) + + if !assert.False(false) { + t.Error("False should return true") + } + if assert.False(true) { + t.Error("False should return false") + } + +} + +func TestExactlyWrapper(t *testing.T) { + assert := New(new(testing.T)) + + a := float32(1) + b := float64(1) + c := float32(1) + d := float32(2) + + if assert.Exactly(a, b) { + t.Error("Exactly should return false") + } + if assert.Exactly(a, d) { + t.Error("Exactly should return false") + } + if !assert.Exactly(a, c) { + t.Error("Exactly should return true") + } + + if assert.Exactly(nil, a) { + t.Error("Exactly should return false") + } + if assert.Exactly(a, nil) { + t.Error("Exactly should return false") + } + +} + +func TestNotEqualWrapper(t *testing.T) { + + assert := New(new(testing.T)) + + if !assert.NotEqual("Hello World", "Hello World!") { + t.Error("NotEqual should return true") + } + if !assert.NotEqual(123, 1234) { + t.Error("NotEqual should return true") + } + if !assert.NotEqual(123.5, 123.55) { + t.Error("NotEqual should return true") + } + if !assert.NotEqual([]byte("Hello World"), []byte("Hello World!")) { + t.Error("NotEqual should return true") + } + if !assert.NotEqual(nil, new(AssertionTesterConformingObject)) { + t.Error("NotEqual should return true") + } +} + +func TestContainsWrapper(t *testing.T) { + + assert := New(new(testing.T)) + list := []string{"Foo", "Bar"} + + if !assert.Contains("Hello World", "Hello") { + t.Error("Contains should return true: \"Hello World\" contains \"Hello\"") + } + if assert.Contains("Hello World", "Salut") { + t.Error("Contains should return false: \"Hello World\" does not contain \"Salut\"") + } + + if !assert.Contains(list, "Foo") { + t.Error("Contains should return true: \"[\"Foo\", \"Bar\"]\" contains \"Foo\"") + } + if assert.Contains(list, "Salut") { + t.Error("Contains should return false: \"[\"Foo\", \"Bar\"]\" does not contain \"Salut\"") + } + +} + +func TestNotContainsWrapper(t *testing.T) { + + assert := New(new(testing.T)) + list := []string{"Foo", "Bar"} + + if !assert.NotContains("Hello World", "Hello!") { + t.Error("NotContains should return true: \"Hello World\" does not contain \"Hello!\"") + } + if assert.NotContains("Hello World", "Hello") { + t.Error("NotContains should return false: \"Hello World\" contains \"Hello\"") + } + + if !assert.NotContains(list, "Foo!") { + t.Error("NotContains should return true: \"[\"Foo\", \"Bar\"]\" does not contain \"Foo!\"") + } + if assert.NotContains(list, "Foo") { + t.Error("NotContains should return false: \"[\"Foo\", \"Bar\"]\" contains \"Foo\"") + } + +} + +func TestConditionWrapper(t *testing.T) { + + assert := New(new(testing.T)) + + if !assert.Condition(func() bool { return true }, "Truth") { + t.Error("Condition should return true") + } + + if assert.Condition(func() bool { return false }, "Lie") { + t.Error("Condition should return false") + } + +} + +func TestDidPanicWrapper(t *testing.T) { + + if funcDidPanic, _ := didPanic(func() { + panic("Panic!") + }); !funcDidPanic { + t.Error("didPanic should return true") + } + + if funcDidPanic, _ := didPanic(func() { + }); funcDidPanic { + t.Error("didPanic should return false") + } + +} + +func TestPanicsWrapper(t *testing.T) { + + assert := New(new(testing.T)) + + if !assert.Panics(func() { + panic("Panic!") + }) { + t.Error("Panics should return true") + } + + if assert.Panics(func() { + }) { + t.Error("Panics should return false") + } + +} + +func TestNotPanicsWrapper(t *testing.T) { + + assert := New(new(testing.T)) + + if !assert.NotPanics(func() { + }) { + t.Error("NotPanics should return true") + } + + if assert.NotPanics(func() { + panic("Panic!") + }) { + t.Error("NotPanics should return false") + } + +} + +func TestNoErrorWrapper(t *testing.T) { + assert := New(t) + mockAssert := New(new(testing.T)) + + // start with a nil error + var err error + + assert.True(mockAssert.NoError(err), "NoError should return True for nil arg") + + // now set an error + err = errors.New("Some error") + + assert.False(mockAssert.NoError(err), "NoError with error should return False") + +} + +func TestErrorWrapper(t *testing.T) { + assert := New(t) + mockAssert := New(new(testing.T)) + + // start with a nil error + var err error + + assert.False(mockAssert.Error(err), "Error should return False for nil arg") + + // now set an error + err = errors.New("Some error") + + assert.True(mockAssert.Error(err), "Error with error should return True") + +} + +func TestEqualErrorWrapper(t *testing.T) { + assert := New(t) + mockAssert := New(new(testing.T)) + + // start with a nil error + var err error + assert.False(mockAssert.EqualError(err, ""), + "EqualError should return false for nil arg") + + // now set an error + err = errors.New("some error") + assert.False(mockAssert.EqualError(err, "Not some error"), + "EqualError should return false for different error string") + assert.True(mockAssert.EqualError(err, "some error"), + "EqualError should return true") +} + +func TestEmptyWrapper(t *testing.T) { + assert := New(t) + mockAssert := New(new(testing.T)) + + assert.True(mockAssert.Empty(""), "Empty string is empty") + assert.True(mockAssert.Empty(nil), "Nil is empty") + assert.True(mockAssert.Empty([]string{}), "Empty string array is empty") + assert.True(mockAssert.Empty(0), "Zero int value is empty") + assert.True(mockAssert.Empty(false), "False value is empty") + + assert.False(mockAssert.Empty("something"), "Non Empty string is not empty") + assert.False(mockAssert.Empty(errors.New("something")), "Non nil object is not empty") + assert.False(mockAssert.Empty([]string{"something"}), "Non empty string array is not empty") + assert.False(mockAssert.Empty(1), "Non-zero int value is not empty") + assert.False(mockAssert.Empty(true), "True value is not empty") + +} + +func TestNotEmptyWrapper(t *testing.T) { + assert := New(t) + mockAssert := New(new(testing.T)) + + assert.False(mockAssert.NotEmpty(""), "Empty string is empty") + assert.False(mockAssert.NotEmpty(nil), "Nil is empty") + assert.False(mockAssert.NotEmpty([]string{}), "Empty string array is empty") + assert.False(mockAssert.NotEmpty(0), "Zero int value is empty") + assert.False(mockAssert.NotEmpty(false), "False value is empty") + + assert.True(mockAssert.NotEmpty("something"), "Non Empty string is not empty") + assert.True(mockAssert.NotEmpty(errors.New("something")), "Non nil object is not empty") + assert.True(mockAssert.NotEmpty([]string{"something"}), "Non empty string array is not empty") + assert.True(mockAssert.NotEmpty(1), "Non-zero int value is not empty") + assert.True(mockAssert.NotEmpty(true), "True value is not empty") + +} + +func TestLenWrapper(t *testing.T) { + assert := New(t) + mockAssert := New(new(testing.T)) + + assert.False(mockAssert.Len(nil, 0), "nil does not have length") + assert.False(mockAssert.Len(0, 0), "int does not have length") + assert.False(mockAssert.Len(true, 0), "true does not have length") + assert.False(mockAssert.Len(false, 0), "false does not have length") + assert.False(mockAssert.Len('A', 0), "Rune does not have length") + assert.False(mockAssert.Len(struct{}{}, 0), "Struct does not have length") + + ch := make(chan int, 5) + ch <- 1 + ch <- 2 + ch <- 3 + + cases := []struct { + v interface{} + l int + }{ + {[]int{1, 2, 3}, 3}, + {[...]int{1, 2, 3}, 3}, + {"ABC", 3}, + {map[int]int{1: 2, 2: 4, 3: 6}, 3}, + {ch, 3}, + + {[]int{}, 0}, + {map[int]int{}, 0}, + {make(chan int), 0}, + + {[]int(nil), 0}, + {map[int]int(nil), 0}, + {(chan int)(nil), 0}, + } + + for _, c := range cases { + assert.True(mockAssert.Len(c.v, c.l), "%#v have %d items", c.v, c.l) + } +} + +func TestWithinDurationWrapper(t *testing.T) { + assert := New(t) + mockAssert := New(new(testing.T)) + a := time.Now() + b := a.Add(10 * time.Second) + + assert.True(mockAssert.WithinDuration(a, b, 10*time.Second), "A 10s difference is within a 10s time difference") + assert.True(mockAssert.WithinDuration(b, a, 10*time.Second), "A 10s difference is within a 10s time difference") + + assert.False(mockAssert.WithinDuration(a, b, 9*time.Second), "A 10s difference is not within a 9s time difference") + assert.False(mockAssert.WithinDuration(b, a, 9*time.Second), "A 10s difference is not within a 9s time difference") + + assert.False(mockAssert.WithinDuration(a, b, -9*time.Second), "A 10s difference is not within a 9s time difference") + assert.False(mockAssert.WithinDuration(b, a, -9*time.Second), "A 10s difference is not within a 9s time difference") + + assert.False(mockAssert.WithinDuration(a, b, -11*time.Second), "A 10s difference is not within a 9s time difference") + assert.False(mockAssert.WithinDuration(b, a, -11*time.Second), "A 10s difference is not within a 9s time difference") +} + +func TestInDeltaWrapper(t *testing.T) { + assert := New(new(testing.T)) + + True(t, assert.InDelta(1.001, 1, 0.01), "|1.001 - 1| <= 0.01") + True(t, assert.InDelta(1, 1.001, 0.01), "|1 - 1.001| <= 0.01") + True(t, assert.InDelta(1, 2, 1), "|1 - 2| <= 1") + False(t, assert.InDelta(1, 2, 0.5), "Expected |1 - 2| <= 0.5 to fail") + False(t, assert.InDelta(2, 1, 0.5), "Expected |2 - 1| <= 0.5 to fail") + False(t, assert.InDelta("", nil, 1), "Expected non numerals to fail") + + cases := []struct { + a, b interface{} + delta float64 + }{ + {uint8(2), uint8(1), 1}, + {uint16(2), uint16(1), 1}, + {uint32(2), uint32(1), 1}, + {uint64(2), uint64(1), 1}, + + {int(2), int(1), 1}, + {int8(2), int8(1), 1}, + {int16(2), int16(1), 1}, + {int32(2), int32(1), 1}, + {int64(2), int64(1), 1}, + + {float32(2), float32(1), 1}, + {float64(2), float64(1), 1}, + } + + for _, tc := range cases { + True(t, assert.InDelta(tc.a, tc.b, tc.delta), "Expected |%V - %V| <= %v", tc.a, tc.b, tc.delta) + } +} + +func TestInEpsilonWrapper(t *testing.T) { + assert := New(new(testing.T)) + + cases := []struct { + a, b interface{} + epsilon float64 + }{ + {uint8(2), uint16(2), .001}, + {2.1, 2.2, 0.1}, + {2.2, 2.1, 0.1}, + {-2.1, -2.2, 0.1}, + {-2.2, -2.1, 0.1}, + {uint64(100), uint8(101), 0.01}, + {0.1, -0.1, 2}, + } + + for _, tc := range cases { + True(t, assert.InEpsilon(tc.a, tc.b, tc.epsilon, "Expected %V and %V to have a relative difference of %v", tc.a, tc.b, tc.epsilon)) + } + + cases = []struct { + a, b interface{} + epsilon float64 + }{ + {uint8(2), int16(-2), .001}, + {uint64(100), uint8(102), 0.01}, + {2.1, 2.2, 0.001}, + {2.2, 2.1, 0.001}, + {2.1, -2.2, 1}, + {2.1, "bla-bla", 0}, + {0.1, -0.1, 1.99}, + } + + for _, tc := range cases { + False(t, assert.InEpsilon(tc.a, tc.b, tc.epsilon, "Expected %V and %V to have a relative difference of %v", tc.a, tc.b, tc.epsilon)) + } +} + +func TestRegexpWrapper(t *testing.T) { + + assert := New(new(testing.T)) + + cases := []struct { + rx, str string + }{ + {"^start", "start of the line"}, + {"end$", "in the end"}, + {"[0-9]{3}[.-]?[0-9]{2}[.-]?[0-9]{2}", "My phone number is 650.12.34"}, + } + + for _, tc := range cases { + True(t, assert.Regexp(tc.rx, tc.str)) + True(t, assert.Regexp(regexp.MustCompile(tc.rx), tc.str)) + False(t, assert.NotRegexp(tc.rx, tc.str)) + False(t, assert.NotRegexp(regexp.MustCompile(tc.rx), tc.str)) + } + + cases = []struct { + rx, str string + }{ + {"^asdfastart", "Not the start of the line"}, + {"end$", "in the end."}, + {"[0-9]{3}[.-]?[0-9]{2}[.-]?[0-9]{2}", "My phone number is 650.12a.34"}, + } + + for _, tc := range cases { + False(t, assert.Regexp(tc.rx, tc.str), "Expected \"%s\" to not match \"%s\"", tc.rx, tc.str) + False(t, assert.Regexp(regexp.MustCompile(tc.rx), tc.str)) + True(t, assert.NotRegexp(tc.rx, tc.str)) + True(t, assert.NotRegexp(regexp.MustCompile(tc.rx), tc.str)) + } +} + +func TestZeroWrapper(t *testing.T) { + assert := New(t) + mockAssert := New(new(testing.T)) + + for _, test := range zeros { + assert.True(mockAssert.Zero(test), "Zero should return true for %v", test) + } + + for _, test := range nonZeros { + assert.False(mockAssert.Zero(test), "Zero should return false for %v", test) + } +} + +func TestNotZeroWrapper(t *testing.T) { + assert := New(t) + mockAssert := New(new(testing.T)) + + for _, test := range zeros { + assert.False(mockAssert.NotZero(test), "Zero should return true for %v", test) + } + + for _, test := range nonZeros { + assert.True(mockAssert.NotZero(test), "Zero should return false for %v", test) + } +} + +func TestJSONEqWrapper_EqualSONString(t *testing.T) { + assert := New(new(testing.T)) + if !assert.JSONEq(`{"hello": "world", "foo": "bar"}`, `{"hello": "world", "foo": "bar"}`) { + t.Error("JSONEq should return true") + } + +} + +func TestJSONEqWrapper_EquivalentButNotEqual(t *testing.T) { + assert := New(new(testing.T)) + if !assert.JSONEq(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) { + t.Error("JSONEq should return true") + } + +} + +func TestJSONEqWrapper_HashOfArraysAndHashes(t *testing.T) { + assert := New(new(testing.T)) + if !assert.JSONEq("{\r\n\t\"numeric\": 1.5,\r\n\t\"array\": [{\"foo\": \"bar\"}, 1, \"string\", [\"nested\", \"array\", 5.5]],\r\n\t\"hash\": {\"nested\": \"hash\", \"nested_slice\": [\"this\", \"is\", \"nested\"]},\r\n\t\"string\": \"foo\"\r\n}", + "{\r\n\t\"numeric\": 1.5,\r\n\t\"hash\": {\"nested\": \"hash\", \"nested_slice\": [\"this\", \"is\", \"nested\"]},\r\n\t\"string\": \"foo\",\r\n\t\"array\": [{\"foo\": \"bar\"}, 1, \"string\", [\"nested\", \"array\", 5.5]]\r\n}") { + t.Error("JSONEq should return true") + } +} + +func TestJSONEqWrapper_Array(t *testing.T) { + assert := New(new(testing.T)) + if !assert.JSONEq(`["foo", {"hello": "world", "nested": "hash"}]`, `["foo", {"nested": "hash", "hello": "world"}]`) { + t.Error("JSONEq should return true") + } + +} + +func TestJSONEqWrapper_HashAndArrayNotEquivalent(t *testing.T) { + assert := New(new(testing.T)) + if assert.JSONEq(`["foo", {"hello": "world", "nested": "hash"}]`, `{"foo": "bar", {"nested": "hash", "hello": "world"}}`) { + t.Error("JSONEq should return false") + } +} + +func TestJSONEqWrapper_HashesNotEquivalent(t *testing.T) { + assert := New(new(testing.T)) + if assert.JSONEq(`{"foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) { + t.Error("JSONEq should return false") + } +} + +func TestJSONEqWrapper_ActualIsNotJSON(t *testing.T) { + assert := New(new(testing.T)) + if assert.JSONEq(`{"foo": "bar"}`, "Not JSON") { + t.Error("JSONEq should return false") + } +} + +func TestJSONEqWrapper_ExpectedIsNotJSON(t *testing.T) { + assert := New(new(testing.T)) + if assert.JSONEq("Not JSON", `{"foo": "bar", "hello": "world"}`) { + t.Error("JSONEq should return false") + } +} + +func TestJSONEqWrapper_ExpectedAndActualNotJSON(t *testing.T) { + assert := New(new(testing.T)) + if assert.JSONEq("Not JSON", "Not JSON") { + t.Error("JSONEq should return false") + } +} + +func TestJSONEqWrapper_ArraysOfDifferentOrder(t *testing.T) { + assert := New(new(testing.T)) + if assert.JSONEq(`["foo", {"hello": "world", "nested": "hash"}]`, `[{ "hello": "world", "nested": "hash"}, "foo"]`) { + t.Error("JSONEq should return false") + } +} diff --git a/api/vendor/github.com/stretchr/testify/assert/http_assertions.go b/api/vendor/github.com/stretchr/testify/assert/http_assertions.go new file mode 100644 index 0000000..3101e78 --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/assert/http_assertions.go @@ -0,0 +1,127 @@ +package assert + +import ( + "fmt" + "net/http" + "net/http/httptest" + "net/url" + "strings" +) + +// httpCode is a helper that returns HTTP code of the response. It returns -1 and +// an error if building a new request fails. +func httpCode(handler http.HandlerFunc, method, url string, values url.Values) (int, error) { + w := httptest.NewRecorder() + req, err := http.NewRequest(method, url+"?"+values.Encode(), nil) + if err != nil { + return -1, err + } + handler(w, req) + return w.Code, nil +} + +// HTTPSuccess asserts that a specified handler returns a success status code. +// +// assert.HTTPSuccess(t, myHandler, "POST", "http://www.google.com", nil) +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPSuccess(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, msgAndArgs ...interface{}) bool { + code, err := httpCode(handler, method, url, values) + if err != nil { + Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) + return false + } + + isSuccessCode := code >= http.StatusOK && code <= http.StatusPartialContent + if !isSuccessCode { + Fail(t, fmt.Sprintf("Expected HTTP success status code for %q but received %d", url+"?"+values.Encode(), code)) + } + + return isSuccessCode +} + +// HTTPRedirect asserts that a specified handler returns a redirect status code. +// +// assert.HTTPRedirect(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPRedirect(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, msgAndArgs ...interface{}) bool { + code, err := httpCode(handler, method, url, values) + if err != nil { + Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) + return false + } + + isRedirectCode := code >= http.StatusMultipleChoices && code <= http.StatusTemporaryRedirect + if !isRedirectCode { + Fail(t, fmt.Sprintf("Expected HTTP redirect status code for %q but received %d", url+"?"+values.Encode(), code)) + } + + return isRedirectCode +} + +// HTTPError asserts that a specified handler returns an error status code. +// +// assert.HTTPError(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPError(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, msgAndArgs ...interface{}) bool { + code, err := httpCode(handler, method, url, values) + if err != nil { + Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) + return false + } + + isErrorCode := code >= http.StatusBadRequest + if !isErrorCode { + Fail(t, fmt.Sprintf("Expected HTTP error status code for %q but received %d", url+"?"+values.Encode(), code)) + } + + return isErrorCode +} + +// HTTPBody is a helper that returns HTTP body of the response. It returns +// empty string if building a new request fails. +func HTTPBody(handler http.HandlerFunc, method, url string, values url.Values) string { + w := httptest.NewRecorder() + req, err := http.NewRequest(method, url+"?"+values.Encode(), nil) + if err != nil { + return "" + } + handler(w, req) + return w.Body.String() +} + +// HTTPBodyContains asserts that a specified handler returns a +// body that contains a string. +// +// assert.HTTPBodyContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool { + body := HTTPBody(handler, method, url, values) + + contains := strings.Contains(body, fmt.Sprint(str)) + if !contains { + Fail(t, fmt.Sprintf("Expected response body for \"%s\" to contain \"%s\" but found \"%s\"", url+"?"+values.Encode(), str, body)) + } + + return contains +} + +// HTTPBodyNotContains asserts that a specified handler returns a +// body that does not contain a string. +// +// assert.HTTPBodyNotContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool { + body := HTTPBody(handler, method, url, values) + + contains := strings.Contains(body, fmt.Sprint(str)) + if contains { + Fail(t, fmt.Sprintf("Expected response body for \"%s\" to NOT contain \"%s\" but found \"%s\"", url+"?"+values.Encode(), str, body)) + } + + return !contains +} diff --git a/api/vendor/github.com/stretchr/testify/assert/http_assertions_test.go b/api/vendor/github.com/stretchr/testify/assert/http_assertions_test.go new file mode 100644 index 0000000..3ab7683 --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/assert/http_assertions_test.go @@ -0,0 +1,117 @@ +package assert + +import ( + "fmt" + "net/http" + "net/url" + "testing" +) + +func httpOK(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) +} + +func httpRedirect(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusTemporaryRedirect) +} + +func httpError(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusInternalServerError) +} + +func TestHTTPSuccess(t *testing.T) { + assert := New(t) + + mockT1 := new(testing.T) + assert.Equal(HTTPSuccess(mockT1, httpOK, "GET", "/", nil), true) + assert.False(mockT1.Failed()) + + mockT2 := new(testing.T) + assert.Equal(HTTPSuccess(mockT2, httpRedirect, "GET", "/", nil), false) + assert.True(mockT2.Failed()) + + mockT3 := new(testing.T) + assert.Equal(HTTPSuccess(mockT3, httpError, "GET", "/", nil), false) + assert.True(mockT3.Failed()) +} + +func TestHTTPRedirect(t *testing.T) { + assert := New(t) + + mockT1 := new(testing.T) + assert.Equal(HTTPRedirect(mockT1, httpOK, "GET", "/", nil), false) + assert.True(mockT1.Failed()) + + mockT2 := new(testing.T) + assert.Equal(HTTPRedirect(mockT2, httpRedirect, "GET", "/", nil), true) + assert.False(mockT2.Failed()) + + mockT3 := new(testing.T) + assert.Equal(HTTPRedirect(mockT3, httpError, "GET", "/", nil), false) + assert.True(mockT3.Failed()) +} + +func TestHTTPError(t *testing.T) { + assert := New(t) + + mockT1 := new(testing.T) + assert.Equal(HTTPError(mockT1, httpOK, "GET", "/", nil), false) + assert.True(mockT1.Failed()) + + mockT2 := new(testing.T) + assert.Equal(HTTPError(mockT2, httpRedirect, "GET", "/", nil), false) + assert.True(mockT2.Failed()) + + mockT3 := new(testing.T) + assert.Equal(HTTPError(mockT3, httpError, "GET", "/", nil), true) + assert.False(mockT3.Failed()) +} + +func TestHTTPStatusesWrapper(t *testing.T) { + assert := New(t) + mockAssert := New(new(testing.T)) + + assert.Equal(mockAssert.HTTPSuccess(httpOK, "GET", "/", nil), true) + assert.Equal(mockAssert.HTTPSuccess(httpRedirect, "GET", "/", nil), false) + assert.Equal(mockAssert.HTTPSuccess(httpError, "GET", "/", nil), false) + + assert.Equal(mockAssert.HTTPRedirect(httpOK, "GET", "/", nil), false) + assert.Equal(mockAssert.HTTPRedirect(httpRedirect, "GET", "/", nil), true) + assert.Equal(mockAssert.HTTPRedirect(httpError, "GET", "/", nil), false) + + assert.Equal(mockAssert.HTTPError(httpOK, "GET", "/", nil), false) + assert.Equal(mockAssert.HTTPError(httpRedirect, "GET", "/", nil), false) + assert.Equal(mockAssert.HTTPError(httpError, "GET", "/", nil), true) +} + +func httpHelloName(w http.ResponseWriter, r *http.Request) { + name := r.FormValue("name") + w.Write([]byte(fmt.Sprintf("Hello, %s!", name))) +} + +func TestHttpBody(t *testing.T) { + assert := New(t) + mockT := new(testing.T) + + assert.True(HTTPBodyContains(mockT, httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "Hello, World!")) + assert.True(HTTPBodyContains(mockT, httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "World")) + assert.False(HTTPBodyContains(mockT, httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "world")) + + assert.False(HTTPBodyNotContains(mockT, httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "Hello, World!")) + assert.False(HTTPBodyNotContains(mockT, httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "World")) + assert.True(HTTPBodyNotContains(mockT, httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "world")) +} + +func TestHttpBodyWrappers(t *testing.T) { + assert := New(t) + mockAssert := New(new(testing.T)) + + assert.True(mockAssert.HTTPBodyContains(httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "Hello, World!")) + assert.True(mockAssert.HTTPBodyContains(httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "World")) + assert.False(mockAssert.HTTPBodyContains(httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "world")) + + assert.False(mockAssert.HTTPBodyNotContains(httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "Hello, World!")) + assert.False(mockAssert.HTTPBodyNotContains(httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "World")) + assert.True(mockAssert.HTTPBodyNotContains(httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "world")) + +} diff --git a/api/vendor/github.com/stretchr/testify/doc.go b/api/vendor/github.com/stretchr/testify/doc.go new file mode 100644 index 0000000..377d5cc --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/doc.go @@ -0,0 +1,22 @@ +// Package testify is a set of packages that provide many tools for testifying that your code will behave as you intend. +// +// testify contains the following packages: +// +// The assert package provides a comprehensive set of assertion functions that tie in to the Go testing system. +// +// The http package contains tools to make it easier to test http activity using the Go testing system. +// +// The mock package provides a system by which it is possible to mock your objects and verify calls are happening as expected. +// +// The suite package provides a basic structure for using structs as testing suites, and methods on those structs as tests. It includes setup/teardown functionality in the way of interfaces. +package testify + +// blank imports help docs. +import ( + // assert package + _ "github.com/stretchr/testify/assert" + // http package + _ "github.com/stretchr/testify/http" + // mock package + _ "github.com/stretchr/testify/mock" +) diff --git a/api/vendor/github.com/stretchr/testify/http/doc.go b/api/vendor/github.com/stretchr/testify/http/doc.go new file mode 100644 index 0000000..695167c --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/http/doc.go @@ -0,0 +1,2 @@ +// Package http DEPRECATED USE net/http/httptest +package http diff --git a/api/vendor/github.com/stretchr/testify/http/test_response_writer.go b/api/vendor/github.com/stretchr/testify/http/test_response_writer.go new file mode 100644 index 0000000..5c3f813 --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/http/test_response_writer.go @@ -0,0 +1,49 @@ +package http + +import ( + "net/http" +) + +// TestResponseWriter DEPRECATED: We recommend you use http://golang.org/pkg/net/http/httptest instead. +type TestResponseWriter struct { + + // StatusCode is the last int written by the call to WriteHeader(int) + StatusCode int + + // Output is a string containing the written bytes using the Write([]byte) func. + Output string + + // header is the internal storage of the http.Header object + header http.Header +} + +// Header DEPRECATED: We recommend you use http://golang.org/pkg/net/http/httptest instead. +func (rw *TestResponseWriter) Header() http.Header { + + if rw.header == nil { + rw.header = make(http.Header) + } + + return rw.header +} + +// Write DEPRECATED: We recommend you use http://golang.org/pkg/net/http/httptest instead. +func (rw *TestResponseWriter) Write(bytes []byte) (int, error) { + + // assume 200 success if no header has been set + if rw.StatusCode == 0 { + rw.WriteHeader(200) + } + + // add these bytes to the output string + rw.Output = rw.Output + string(bytes) + + // return normal values + return 0, nil + +} + +// WriteHeader DEPRECATED: We recommend you use http://golang.org/pkg/net/http/httptest instead. +func (rw *TestResponseWriter) WriteHeader(i int) { + rw.StatusCode = i +} diff --git a/api/vendor/github.com/stretchr/testify/http/test_round_tripper.go b/api/vendor/github.com/stretchr/testify/http/test_round_tripper.go new file mode 100644 index 0000000..b1e32f1 --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/http/test_round_tripper.go @@ -0,0 +1,17 @@ +package http + +import ( + "github.com/stretchr/testify/mock" + "net/http" +) + +// TestRoundTripper DEPRECATED USE net/http/httptest +type TestRoundTripper struct { + mock.Mock +} + +// RoundTrip DEPRECATED USE net/http/httptest +func (t *TestRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + args := t.Called(req) + return args.Get(0).(*http.Response), args.Error(1) +} diff --git a/api/vendor/github.com/stretchr/testify/mock/doc.go b/api/vendor/github.com/stretchr/testify/mock/doc.go new file mode 100644 index 0000000..7324128 --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/mock/doc.go @@ -0,0 +1,44 @@ +// Package mock provides a system by which it is possible to mock your objects +// and verify calls are happening as expected. +// +// Example Usage +// +// The mock package provides an object, Mock, that tracks activity on another object. It is usually +// embedded into a test object as shown below: +// +// type MyTestObject struct { +// // add a Mock object instance +// mock.Mock +// +// // other fields go here as normal +// } +// +// When implementing the methods of an interface, you wire your functions up +// to call the Mock.Called(args...) method, and return the appropriate values. +// +// For example, to mock a method that saves the name and age of a person and returns +// the year of their birth or an error, you might write this: +// +// func (o *MyTestObject) SavePersonDetails(firstname, lastname string, age int) (int, error) { +// args := o.Called(firstname, lastname, age) +// return args.Int(0), args.Error(1) +// } +// +// The Int, Error and Bool methods are examples of strongly typed getters that take the argument +// index position. Given this argument list: +// +// (12, true, "Something") +// +// You could read them out strongly typed like this: +// +// args.Int(0) +// args.Bool(1) +// args.String(2) +// +// For objects of your own type, use the generic Arguments.Get(index) method and make a type assertion: +// +// return args.Get(0).(*MyObject), args.Get(1).(*AnotherObjectOfMine) +// +// This may cause a panic if the object you are getting is nil (the type assertion will fail), in those +// cases you should check for nil first. +package mock diff --git a/api/vendor/github.com/stretchr/testify/mock/mock.go b/api/vendor/github.com/stretchr/testify/mock/mock.go new file mode 100644 index 0000000..1e232b5 --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/mock/mock.go @@ -0,0 +1,815 @@ +package mock + +import ( + "errors" + "fmt" + "reflect" + "regexp" + "runtime" + "strings" + "sync" + "time" + + "github.com/davecgh/go-spew/spew" + "github.com/pmezard/go-difflib/difflib" + "github.com/stretchr/objx" + "github.com/stretchr/testify/assert" +) + +// TestingT is an interface wrapper around *testing.T +type TestingT interface { + Logf(format string, args ...interface{}) + Errorf(format string, args ...interface{}) + FailNow() +} + +/* + Call +*/ + +// Call represents a method call and is used for setting expectations, +// as well as recording activity. +type Call struct { + Parent *Mock + + // The name of the method that was or will be called. + Method string + + // Holds the arguments of the method. + Arguments Arguments + + // Holds the arguments that should be returned when + // this method is called. + ReturnArguments Arguments + + // The number of times to return the return arguments when setting + // expectations. 0 means to always return the value. + Repeatability int + + // Amount of times this call has been called + totalCalls int + + // Call to this method can be optional + optional bool + + // Holds a channel that will be used to block the Return until it either + // receives a message or is closed. nil means it returns immediately. + WaitFor <-chan time.Time + + waitTime time.Duration + + // Holds a handler used to manipulate arguments content that are passed by + // reference. It's useful when mocking methods such as unmarshalers or + // decoders. + RunFn func(Arguments) +} + +func newCall(parent *Mock, methodName string, methodArguments ...interface{}) *Call { + return &Call{ + Parent: parent, + Method: methodName, + Arguments: methodArguments, + ReturnArguments: make([]interface{}, 0), + Repeatability: 0, + WaitFor: nil, + RunFn: nil, + } +} + +func (c *Call) lock() { + c.Parent.mutex.Lock() +} + +func (c *Call) unlock() { + c.Parent.mutex.Unlock() +} + +// Return specifies the return arguments for the expectation. +// +// Mock.On("DoSomething").Return(errors.New("failed")) +func (c *Call) Return(returnArguments ...interface{}) *Call { + c.lock() + defer c.unlock() + + c.ReturnArguments = returnArguments + + return c +} + +// Once indicates that that the mock should only return the value once. +// +// Mock.On("MyMethod", arg1, arg2).Return(returnArg1, returnArg2).Once() +func (c *Call) Once() *Call { + return c.Times(1) +} + +// Twice indicates that that the mock should only return the value twice. +// +// Mock.On("MyMethod", arg1, arg2).Return(returnArg1, returnArg2).Twice() +func (c *Call) Twice() *Call { + return c.Times(2) +} + +// Times indicates that that the mock should only return the indicated number +// of times. +// +// Mock.On("MyMethod", arg1, arg2).Return(returnArg1, returnArg2).Times(5) +func (c *Call) Times(i int) *Call { + c.lock() + defer c.unlock() + c.Repeatability = i + return c +} + +// WaitUntil sets the channel that will block the mock's return until its closed +// or a message is received. +// +// Mock.On("MyMethod", arg1, arg2).WaitUntil(time.After(time.Second)) +func (c *Call) WaitUntil(w <-chan time.Time) *Call { + c.lock() + defer c.unlock() + c.WaitFor = w + return c +} + +// After sets how long to block until the call returns +// +// Mock.On("MyMethod", arg1, arg2).After(time.Second) +func (c *Call) After(d time.Duration) *Call { + c.lock() + defer c.unlock() + c.waitTime = d + return c +} + +// Run sets a handler to be called before returning. It can be used when +// mocking a method such as unmarshalers that takes a pointer to a struct and +// sets properties in such struct +// +// Mock.On("Unmarshal", AnythingOfType("*map[string]interface{}").Return().Run(func(args Arguments) { +// arg := args.Get(0).(*map[string]interface{}) +// arg["foo"] = "bar" +// }) +func (c *Call) Run(fn func(args Arguments)) *Call { + c.lock() + defer c.unlock() + c.RunFn = fn + return c +} + +// Maybe allows the method call to be optional. Not calling an optional method +// will not cause an error while asserting expectations +func (c *Call) Maybe() *Call { + c.lock() + defer c.unlock() + c.optional = true + return c +} + +// On chains a new expectation description onto the mocked interface. This +// allows syntax like. +// +// Mock. +// On("MyMethod", 1).Return(nil). +// On("MyOtherMethod", 'a', 'b', 'c').Return(errors.New("Some Error")) +func (c *Call) On(methodName string, arguments ...interface{}) *Call { + return c.Parent.On(methodName, arguments...) +} + +// Mock is the workhorse used to track activity on another object. +// For an example of its usage, refer to the "Example Usage" section at the top +// of this document. +type Mock struct { + // Represents the calls that are expected of + // an object. + ExpectedCalls []*Call + + // Holds the calls that were made to this mocked object. + Calls []Call + + // TestData holds any data that might be useful for testing. Testify ignores + // this data completely allowing you to do whatever you like with it. + testData objx.Map + + mutex sync.Mutex +} + +// TestData holds any data that might be useful for testing. Testify ignores +// this data completely allowing you to do whatever you like with it. +func (m *Mock) TestData() objx.Map { + + if m.testData == nil { + m.testData = make(objx.Map) + } + + return m.testData +} + +/* + Setting expectations +*/ + +// On starts a description of an expectation of the specified method +// being called. +// +// Mock.On("MyMethod", arg1, arg2) +func (m *Mock) On(methodName string, arguments ...interface{}) *Call { + for _, arg := range arguments { + if v := reflect.ValueOf(arg); v.Kind() == reflect.Func { + panic(fmt.Sprintf("cannot use Func in expectations. Use mock.AnythingOfType(\"%T\")", arg)) + } + } + + m.mutex.Lock() + defer m.mutex.Unlock() + c := newCall(m, methodName, arguments...) + m.ExpectedCalls = append(m.ExpectedCalls, c) + return c +} + +// /* +// Recording and responding to activity +// */ + +func (m *Mock) findExpectedCall(method string, arguments ...interface{}) (int, *Call) { + for i, call := range m.ExpectedCalls { + if call.Method == method && call.Repeatability > -1 { + + _, diffCount := call.Arguments.Diff(arguments) + if diffCount == 0 { + return i, call + } + + } + } + return -1, nil +} + +func (m *Mock) findClosestCall(method string, arguments ...interface{}) (bool, *Call) { + diffCount := 0 + var closestCall *Call + + for _, call := range m.expectedCalls() { + if call.Method == method { + + _, tempDiffCount := call.Arguments.Diff(arguments) + if tempDiffCount < diffCount || diffCount == 0 { + diffCount = tempDiffCount + closestCall = call + } + + } + } + + if closestCall == nil { + return false, nil + } + + return true, closestCall +} + +func callString(method string, arguments Arguments, includeArgumentValues bool) string { + + var argValsString string + if includeArgumentValues { + var argVals []string + for argIndex, arg := range arguments { + argVals = append(argVals, fmt.Sprintf("%d: %#v", argIndex, arg)) + } + argValsString = fmt.Sprintf("\n\t\t%s", strings.Join(argVals, "\n\t\t")) + } + + return fmt.Sprintf("%s(%s)%s", method, arguments.String(), argValsString) +} + +// Called tells the mock object that a method has been called, and gets an array +// of arguments to return. Panics if the call is unexpected (i.e. not preceded by +// appropriate .On .Return() calls) +// If Call.WaitFor is set, blocks until the channel is closed or receives a message. +func (m *Mock) Called(arguments ...interface{}) Arguments { + // get the calling function's name + pc, _, _, ok := runtime.Caller(1) + if !ok { + panic("Couldn't get the caller information") + } + functionPath := runtime.FuncForPC(pc).Name() + //Next four lines are required to use GCCGO function naming conventions. + //For Ex: github_com_docker_libkv_store_mock.WatchTree.pN39_github_com_docker_libkv_store_mock.Mock + //uses interface information unlike golang github.com/docker/libkv/store/mock.(*Mock).WatchTree + //With GCCGO we need to remove interface information starting from pN
    . + re := regexp.MustCompile("\\.pN\\d+_") + if re.MatchString(functionPath) { + functionPath = re.Split(functionPath, -1)[0] + } + parts := strings.Split(functionPath, ".") + functionName := parts[len(parts)-1] + return m.MethodCalled(functionName, arguments...) +} + +// MethodCalled tells the mock object that the given method has been called, and gets +// an array of arguments to return. Panics if the call is unexpected (i.e. not preceded +// by appropriate .On .Return() calls) +// If Call.WaitFor is set, blocks until the channel is closed or receives a message. +func (m *Mock) MethodCalled(methodName string, arguments ...interface{}) Arguments { + m.mutex.Lock() + found, call := m.findExpectedCall(methodName, arguments...) + + if found < 0 { + // we have to fail here - because we don't know what to do + // as the return arguments. This is because: + // + // a) this is a totally unexpected call to this method, + // b) the arguments are not what was expected, or + // c) the developer has forgotten to add an accompanying On...Return pair. + + closestFound, closestCall := m.findClosestCall(methodName, arguments...) + m.mutex.Unlock() + + if closestFound { + panic(fmt.Sprintf("\n\nmock: Unexpected Method Call\n-----------------------------\n\n%s\n\nThe closest call I have is: \n\n%s\n\n%s\n", callString(methodName, arguments, true), callString(methodName, closestCall.Arguments, true), diffArguments(closestCall.Arguments, arguments))) + } else { + panic(fmt.Sprintf("\nassert: mock: I don't know what to return because the method call was unexpected.\n\tEither do Mock.On(\"%s\").Return(...) first, or remove the %s() call.\n\tThis method was unexpected:\n\t\t%s\n\tat: %s", methodName, methodName, callString(methodName, arguments, true), assert.CallerInfo())) + } + } + + if call.Repeatability == 1 { + call.Repeatability = -1 + } else if call.Repeatability > 1 { + call.Repeatability-- + } + call.totalCalls++ + + // add the call + m.Calls = append(m.Calls, *newCall(m, methodName, arguments...)) + m.mutex.Unlock() + + // block if specified + if call.WaitFor != nil { + <-call.WaitFor + } else { + time.Sleep(call.waitTime) + } + + m.mutex.Lock() + runFn := call.RunFn + m.mutex.Unlock() + + if runFn != nil { + runFn(arguments) + } + + m.mutex.Lock() + returnArgs := call.ReturnArguments + m.mutex.Unlock() + + return returnArgs +} + +/* + Assertions +*/ + +type assertExpectationser interface { + AssertExpectations(TestingT) bool +} + +// AssertExpectationsForObjects asserts that everything specified with On and Return +// of the specified objects was in fact called as expected. +// +// Calls may have occurred in any order. +func AssertExpectationsForObjects(t TestingT, testObjects ...interface{}) bool { + for _, obj := range testObjects { + if m, ok := obj.(Mock); ok { + t.Logf("Deprecated mock.AssertExpectationsForObjects(myMock.Mock) use mock.AssertExpectationsForObjects(myMock)") + obj = &m + } + m := obj.(assertExpectationser) + if !m.AssertExpectations(t) { + return false + } + } + return true +} + +// AssertExpectations asserts that everything specified with On and Return was +// in fact called as expected. Calls may have occurred in any order. +func (m *Mock) AssertExpectations(t TestingT) bool { + m.mutex.Lock() + defer m.mutex.Unlock() + var somethingMissing bool + var failedExpectations int + + // iterate through each expectation + expectedCalls := m.expectedCalls() + for _, expectedCall := range expectedCalls { + if !expectedCall.optional && !m.methodWasCalled(expectedCall.Method, expectedCall.Arguments) && expectedCall.totalCalls == 0 { + somethingMissing = true + failedExpectations++ + t.Logf("FAIL:\t%s(%s)", expectedCall.Method, expectedCall.Arguments.String()) + } else { + if expectedCall.Repeatability > 0 { + somethingMissing = true + failedExpectations++ + t.Logf("FAIL:\t%s(%s)", expectedCall.Method, expectedCall.Arguments.String()) + } else { + t.Logf("PASS:\t%s(%s)", expectedCall.Method, expectedCall.Arguments.String()) + } + } + } + + if somethingMissing { + t.Errorf("FAIL: %d out of %d expectation(s) were met.\n\tThe code you are testing needs to make %d more call(s).\n\tat: %s", len(expectedCalls)-failedExpectations, len(expectedCalls), failedExpectations, assert.CallerInfo()) + } + + return !somethingMissing +} + +// AssertNumberOfCalls asserts that the method was called expectedCalls times. +func (m *Mock) AssertNumberOfCalls(t TestingT, methodName string, expectedCalls int) bool { + m.mutex.Lock() + defer m.mutex.Unlock() + var actualCalls int + for _, call := range m.calls() { + if call.Method == methodName { + actualCalls++ + } + } + return assert.Equal(t, expectedCalls, actualCalls, fmt.Sprintf("Expected number of calls (%d) does not match the actual number of calls (%d).", expectedCalls, actualCalls)) +} + +// AssertCalled asserts that the method was called. +// It can produce a false result when an argument is a pointer type and the underlying value changed after calling the mocked method. +func (m *Mock) AssertCalled(t TestingT, methodName string, arguments ...interface{}) bool { + m.mutex.Lock() + defer m.mutex.Unlock() + if !assert.True(t, m.methodWasCalled(methodName, arguments), fmt.Sprintf("The \"%s\" method should have been called with %d argument(s), but was not.", methodName, len(arguments))) { + t.Logf("%v", m.expectedCalls()) + return false + } + return true +} + +// AssertNotCalled asserts that the method was not called. +// It can produce a false result when an argument is a pointer type and the underlying value changed after calling the mocked method. +func (m *Mock) AssertNotCalled(t TestingT, methodName string, arguments ...interface{}) bool { + m.mutex.Lock() + defer m.mutex.Unlock() + if !assert.False(t, m.methodWasCalled(methodName, arguments), fmt.Sprintf("The \"%s\" method was called with %d argument(s), but should NOT have been.", methodName, len(arguments))) { + t.Logf("%v", m.expectedCalls()) + return false + } + return true +} + +func (m *Mock) methodWasCalled(methodName string, expected []interface{}) bool { + for _, call := range m.calls() { + if call.Method == methodName { + + _, differences := Arguments(expected).Diff(call.Arguments) + + if differences == 0 { + // found the expected call + return true + } + + } + } + // we didn't find the expected call + return false +} + +func (m *Mock) expectedCalls() []*Call { + return append([]*Call{}, m.ExpectedCalls...) +} + +func (m *Mock) calls() []Call { + return append([]Call{}, m.Calls...) +} + +/* + Arguments +*/ + +// Arguments holds an array of method arguments or return values. +type Arguments []interface{} + +const ( + // Anything is used in Diff and Assert when the argument being tested + // shouldn't be taken into consideration. + Anything string = "mock.Anything" +) + +// AnythingOfTypeArgument is a string that contains the type of an argument +// for use when type checking. Used in Diff and Assert. +type AnythingOfTypeArgument string + +// AnythingOfType returns an AnythingOfTypeArgument object containing the +// name of the type to check for. Used in Diff and Assert. +// +// For example: +// Assert(t, AnythingOfType("string"), AnythingOfType("int")) +func AnythingOfType(t string) AnythingOfTypeArgument { + return AnythingOfTypeArgument(t) +} + +// argumentMatcher performs custom argument matching, returning whether or +// not the argument is matched by the expectation fixture function. +type argumentMatcher struct { + // fn is a function which accepts one argument, and returns a bool. + fn reflect.Value +} + +func (f argumentMatcher) Matches(argument interface{}) bool { + expectType := f.fn.Type().In(0) + expectTypeNilSupported := false + switch expectType.Kind() { + case reflect.Interface, reflect.Chan, reflect.Func, reflect.Map, reflect.Slice, reflect.Ptr: + expectTypeNilSupported = true + } + + argType := reflect.TypeOf(argument) + var arg reflect.Value + if argType == nil { + arg = reflect.New(expectType).Elem() + } else { + arg = reflect.ValueOf(argument) + } + + if argType == nil && !expectTypeNilSupported { + panic(errors.New("attempting to call matcher with nil for non-nil expected type")) + } + if argType == nil || argType.AssignableTo(expectType) { + result := f.fn.Call([]reflect.Value{arg}) + return result[0].Bool() + } + return false +} + +func (f argumentMatcher) String() string { + return fmt.Sprintf("func(%s) bool", f.fn.Type().In(0).Name()) +} + +// MatchedBy can be used to match a mock call based on only certain properties +// from a complex struct or some calculation. It takes a function that will be +// evaluated with the called argument and will return true when there's a match +// and false otherwise. +// +// Example: +// m.On("Do", MatchedBy(func(req *http.Request) bool { return req.Host == "example.com" })) +// +// |fn|, must be a function accepting a single argument (of the expected type) +// which returns a bool. If |fn| doesn't match the required signature, +// MatchedBy() panics. +func MatchedBy(fn interface{}) argumentMatcher { + fnType := reflect.TypeOf(fn) + + if fnType.Kind() != reflect.Func { + panic(fmt.Sprintf("assert: arguments: %s is not a func", fn)) + } + if fnType.NumIn() != 1 { + panic(fmt.Sprintf("assert: arguments: %s does not take exactly one argument", fn)) + } + if fnType.NumOut() != 1 || fnType.Out(0).Kind() != reflect.Bool { + panic(fmt.Sprintf("assert: arguments: %s does not return a bool", fn)) + } + + return argumentMatcher{fn: reflect.ValueOf(fn)} +} + +// Get Returns the argument at the specified index. +func (args Arguments) Get(index int) interface{} { + if index+1 > len(args) { + panic(fmt.Sprintf("assert: arguments: Cannot call Get(%d) because there are %d argument(s).", index, len(args))) + } + return args[index] +} + +// Is gets whether the objects match the arguments specified. +func (args Arguments) Is(objects ...interface{}) bool { + for i, obj := range args { + if obj != objects[i] { + return false + } + } + return true +} + +// Diff gets a string describing the differences between the arguments +// and the specified objects. +// +// Returns the diff string and number of differences found. +func (args Arguments) Diff(objects []interface{}) (string, int) { + + var output = "\n" + var differences int + + var maxArgCount = len(args) + if len(objects) > maxArgCount { + maxArgCount = len(objects) + } + + for i := 0; i < maxArgCount; i++ { + var actual, expected interface{} + + if len(objects) <= i { + actual = "(Missing)" + } else { + actual = objects[i] + } + + if len(args) <= i { + expected = "(Missing)" + } else { + expected = args[i] + } + + if matcher, ok := expected.(argumentMatcher); ok { + if matcher.Matches(actual) { + output = fmt.Sprintf("%s\t%d: PASS: %s matched by %s\n", output, i, actual, matcher) + } else { + differences++ + output = fmt.Sprintf("%s\t%d: PASS: %s not matched by %s\n", output, i, actual, matcher) + } + } else if reflect.TypeOf(expected) == reflect.TypeOf((*AnythingOfTypeArgument)(nil)).Elem() { + + // type checking + if reflect.TypeOf(actual).Name() != string(expected.(AnythingOfTypeArgument)) && reflect.TypeOf(actual).String() != string(expected.(AnythingOfTypeArgument)) { + // not match + differences++ + output = fmt.Sprintf("%s\t%d: FAIL: type %s != type %s - %s\n", output, i, expected, reflect.TypeOf(actual).Name(), actual) + } + + } else { + + // normal checking + + if assert.ObjectsAreEqual(expected, Anything) || assert.ObjectsAreEqual(actual, Anything) || assert.ObjectsAreEqual(actual, expected) { + // match + output = fmt.Sprintf("%s\t%d: PASS: %s == %s\n", output, i, actual, expected) + } else { + // not match + differences++ + output = fmt.Sprintf("%s\t%d: FAIL: %s != %s\n", output, i, actual, expected) + } + } + + } + + if differences == 0 { + return "No differences.", differences + } + + return output, differences + +} + +// Assert compares the arguments with the specified objects and fails if +// they do not exactly match. +func (args Arguments) Assert(t TestingT, objects ...interface{}) bool { + + // get the differences + diff, diffCount := args.Diff(objects) + + if diffCount == 0 { + return true + } + + // there are differences... report them... + t.Logf(diff) + t.Errorf("%sArguments do not match.", assert.CallerInfo()) + + return false + +} + +// String gets the argument at the specified index. Panics if there is no argument, or +// if the argument is of the wrong type. +// +// If no index is provided, String() returns a complete string representation +// of the arguments. +func (args Arguments) String(indexOrNil ...int) string { + + if len(indexOrNil) == 0 { + // normal String() method - return a string representation of the args + var argsStr []string + for _, arg := range args { + argsStr = append(argsStr, fmt.Sprintf("%s", reflect.TypeOf(arg))) + } + return strings.Join(argsStr, ",") + } else if len(indexOrNil) == 1 { + // Index has been specified - get the argument at that index + var index = indexOrNil[0] + var s string + var ok bool + if s, ok = args.Get(index).(string); !ok { + panic(fmt.Sprintf("assert: arguments: String(%d) failed because object wasn't correct type: %s", index, args.Get(index))) + } + return s + } + + panic(fmt.Sprintf("assert: arguments: Wrong number of arguments passed to String. Must be 0 or 1, not %d", len(indexOrNil))) + +} + +// Int gets the argument at the specified index. Panics if there is no argument, or +// if the argument is of the wrong type. +func (args Arguments) Int(index int) int { + var s int + var ok bool + if s, ok = args.Get(index).(int); !ok { + panic(fmt.Sprintf("assert: arguments: Int(%d) failed because object wasn't correct type: %v", index, args.Get(index))) + } + return s +} + +// Error gets the argument at the specified index. Panics if there is no argument, or +// if the argument is of the wrong type. +func (args Arguments) Error(index int) error { + obj := args.Get(index) + var s error + var ok bool + if obj == nil { + return nil + } + if s, ok = obj.(error); !ok { + panic(fmt.Sprintf("assert: arguments: Error(%d) failed because object wasn't correct type: %v", index, args.Get(index))) + } + return s +} + +// Bool gets the argument at the specified index. Panics if there is no argument, or +// if the argument is of the wrong type. +func (args Arguments) Bool(index int) bool { + var s bool + var ok bool + if s, ok = args.Get(index).(bool); !ok { + panic(fmt.Sprintf("assert: arguments: Bool(%d) failed because object wasn't correct type: %v", index, args.Get(index))) + } + return s +} + +func typeAndKind(v interface{}) (reflect.Type, reflect.Kind) { + t := reflect.TypeOf(v) + k := t.Kind() + + if k == reflect.Ptr { + t = t.Elem() + k = t.Kind() + } + return t, k +} + +func diffArguments(expected Arguments, actual Arguments) string { + if len(expected) != len(actual) { + return fmt.Sprintf("Provided %v arguments, mocked for %v arguments", len(expected), len(actual)) + } + + for x := range expected { + if diffString := diff(expected[x], actual[x]); diffString != "" { + return fmt.Sprintf("Difference found in argument %v:\n\n%s", x, diffString) + } + } + + return "" +} + +// diff returns a diff of both values as long as both are of the same type and +// are a struct, map, slice or array. Otherwise it returns an empty string. +func diff(expected interface{}, actual interface{}) string { + if expected == nil || actual == nil { + return "" + } + + et, ek := typeAndKind(expected) + at, _ := typeAndKind(actual) + + if et != at { + return "" + } + + if ek != reflect.Struct && ek != reflect.Map && ek != reflect.Slice && ek != reflect.Array { + return "" + } + + e := spewConfig.Sdump(expected) + a := spewConfig.Sdump(actual) + + diff, _ := difflib.GetUnifiedDiffString(difflib.UnifiedDiff{ + A: difflib.SplitLines(e), + B: difflib.SplitLines(a), + FromFile: "Expected", + FromDate: "", + ToFile: "Actual", + ToDate: "", + Context: 1, + }) + + return diff +} + +var spewConfig = spew.ConfigState{ + Indent: " ", + DisablePointerAddresses: true, + DisableCapacities: true, + SortKeys: true, +} diff --git a/api/vendor/github.com/stretchr/testify/mock/mock_test.go b/api/vendor/github.com/stretchr/testify/mock/mock_test.go new file mode 100644 index 0000000..cb245ba --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/mock/mock_test.go @@ -0,0 +1,1352 @@ +package mock + +import ( + "errors" + "fmt" + "sync" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +/* + Test objects +*/ + +// ExampleInterface represents an example interface. +type ExampleInterface interface { + TheExampleMethod(a, b, c int) (int, error) +} + +// TestExampleImplementation is a test implementation of ExampleInterface +type TestExampleImplementation struct { + Mock +} + +func (i *TestExampleImplementation) TheExampleMethod(a, b, c int) (int, error) { + args := i.Called(a, b, c) + return args.Int(0), errors.New("Whoops") +} + +func (i *TestExampleImplementation) TheExampleMethod2(yesorno bool) { + i.Called(yesorno) +} + +type ExampleType struct { + ran bool +} + +func (i *TestExampleImplementation) TheExampleMethod3(et *ExampleType) error { + args := i.Called(et) + return args.Error(0) +} + +func (i *TestExampleImplementation) TheExampleMethod4(v ExampleInterface) error { + args := i.Called(v) + return args.Error(0) +} + +func (i *TestExampleImplementation) TheExampleMethod5(ch chan struct{}) error { + args := i.Called(ch) + return args.Error(0) +} + +func (i *TestExampleImplementation) TheExampleMethod6(m map[string]bool) error { + args := i.Called(m) + return args.Error(0) +} + +func (i *TestExampleImplementation) TheExampleMethod7(slice []bool) error { + args := i.Called(slice) + return args.Error(0) +} + +func (i *TestExampleImplementation) TheExampleMethodFunc(fn func(string) error) error { + args := i.Called(fn) + return args.Error(0) +} + +func (i *TestExampleImplementation) TheExampleMethodVariadic(a ...int) error { + args := i.Called(a) + return args.Error(0) +} + +func (i *TestExampleImplementation) TheExampleMethodVariadicInterface(a ...interface{}) error { + args := i.Called(a) + return args.Error(0) +} + +func (i *TestExampleImplementation) TheExampleMethodMixedVariadic(a int, b ...int) error { + args := i.Called(a, b) + return args.Error(0) +} + +type ExampleFuncType func(string) error + +func (i *TestExampleImplementation) TheExampleMethodFuncType(fn ExampleFuncType) error { + args := i.Called(fn) + return args.Error(0) +} + +/* + Mock +*/ + +func Test_Mock_TestData(t *testing.T) { + + var mockedService = new(TestExampleImplementation) + + if assert.NotNil(t, mockedService.TestData()) { + + mockedService.TestData().Set("something", 123) + assert.Equal(t, 123, mockedService.TestData().Get("something").Data()) + } +} + +func Test_Mock_On(t *testing.T) { + + // make a test impl object + var mockedService = new(TestExampleImplementation) + + c := mockedService.On("TheExampleMethod") + assert.Equal(t, []*Call{c}, mockedService.ExpectedCalls) + assert.Equal(t, "TheExampleMethod", c.Method) +} + +func Test_Mock_Chained_On(t *testing.T) { + // make a test impl object + var mockedService = new(TestExampleImplementation) + + mockedService. + On("TheExampleMethod", 1, 2, 3). + Return(0). + On("TheExampleMethod3", AnythingOfType("*mock.ExampleType")). + Return(nil) + + expectedCalls := []*Call{ + &Call{ + Parent: &mockedService.Mock, + Method: "TheExampleMethod", + Arguments: []interface{}{1, 2, 3}, + ReturnArguments: []interface{}{0}, + }, + &Call{ + Parent: &mockedService.Mock, + Method: "TheExampleMethod3", + Arguments: []interface{}{AnythingOfType("*mock.ExampleType")}, + ReturnArguments: []interface{}{nil}, + }, + } + assert.Equal(t, expectedCalls, mockedService.ExpectedCalls) +} + +func Test_Mock_On_WithArgs(t *testing.T) { + + // make a test impl object + var mockedService = new(TestExampleImplementation) + + c := mockedService.On("TheExampleMethod", 1, 2, 3, 4) + + assert.Equal(t, []*Call{c}, mockedService.ExpectedCalls) + assert.Equal(t, "TheExampleMethod", c.Method) + assert.Equal(t, Arguments{1, 2, 3, 4}, c.Arguments) +} + +func Test_Mock_On_WithFuncArg(t *testing.T) { + + // make a test impl object + var mockedService = new(TestExampleImplementation) + + c := mockedService. + On("TheExampleMethodFunc", AnythingOfType("func(string) error")). + Return(nil) + + assert.Equal(t, []*Call{c}, mockedService.ExpectedCalls) + assert.Equal(t, "TheExampleMethodFunc", c.Method) + assert.Equal(t, 1, len(c.Arguments)) + assert.Equal(t, AnythingOfType("func(string) error"), c.Arguments[0]) + + fn := func(string) error { return nil } + + assert.NotPanics(t, func() { + mockedService.TheExampleMethodFunc(fn) + }) +} + +func Test_Mock_On_WithIntArgMatcher(t *testing.T) { + var mockedService TestExampleImplementation + + mockedService.On("TheExampleMethod", + MatchedBy(func(a int) bool { + return a == 1 + }), MatchedBy(func(b int) bool { + return b == 2 + }), MatchedBy(func(c int) bool { + return c == 3 + })).Return(0, nil) + + assert.Panics(t, func() { + mockedService.TheExampleMethod(1, 2, 4) + }) + assert.Panics(t, func() { + mockedService.TheExampleMethod(2, 2, 3) + }) + assert.NotPanics(t, func() { + mockedService.TheExampleMethod(1, 2, 3) + }) +} + +func Test_Mock_On_WithPtrArgMatcher(t *testing.T) { + var mockedService TestExampleImplementation + + mockedService.On("TheExampleMethod3", + MatchedBy(func(a *ExampleType) bool { return a != nil && a.ran == true }), + ).Return(nil) + + mockedService.On("TheExampleMethod3", + MatchedBy(func(a *ExampleType) bool { return a != nil && a.ran == false }), + ).Return(errors.New("error")) + + mockedService.On("TheExampleMethod3", + MatchedBy(func(a *ExampleType) bool { return a == nil }), + ).Return(errors.New("error2")) + + assert.Equal(t, mockedService.TheExampleMethod3(&ExampleType{true}), nil) + assert.EqualError(t, mockedService.TheExampleMethod3(&ExampleType{false}), "error") + assert.EqualError(t, mockedService.TheExampleMethod3(nil), "error2") +} + +func Test_Mock_On_WithFuncArgMatcher(t *testing.T) { + var mockedService TestExampleImplementation + + fixture1, fixture2 := errors.New("fixture1"), errors.New("fixture2") + + mockedService.On("TheExampleMethodFunc", + MatchedBy(func(a func(string) error) bool { return a != nil && a("string") == fixture1 }), + ).Return(errors.New("fixture1")) + + mockedService.On("TheExampleMethodFunc", + MatchedBy(func(a func(string) error) bool { return a != nil && a("string") == fixture2 }), + ).Return(errors.New("fixture2")) + + mockedService.On("TheExampleMethodFunc", + MatchedBy(func(a func(string) error) bool { return a == nil }), + ).Return(errors.New("fixture3")) + + assert.EqualError(t, mockedService.TheExampleMethodFunc( + func(string) error { return fixture1 }), "fixture1") + assert.EqualError(t, mockedService.TheExampleMethodFunc( + func(string) error { return fixture2 }), "fixture2") + assert.EqualError(t, mockedService.TheExampleMethodFunc(nil), "fixture3") +} + +func Test_Mock_On_WithInterfaceArgMatcher(t *testing.T) { + var mockedService TestExampleImplementation + + mockedService.On("TheExampleMethod4", + MatchedBy(func(a ExampleInterface) bool { return a == nil }), + ).Return(errors.New("fixture1")) + + assert.EqualError(t, mockedService.TheExampleMethod4(nil), "fixture1") +} + +func Test_Mock_On_WithChannelArgMatcher(t *testing.T) { + var mockedService TestExampleImplementation + + mockedService.On("TheExampleMethod5", + MatchedBy(func(ch chan struct{}) bool { return ch == nil }), + ).Return(errors.New("fixture1")) + + assert.EqualError(t, mockedService.TheExampleMethod5(nil), "fixture1") +} + +func Test_Mock_On_WithMapArgMatcher(t *testing.T) { + var mockedService TestExampleImplementation + + mockedService.On("TheExampleMethod6", + MatchedBy(func(m map[string]bool) bool { return m == nil }), + ).Return(errors.New("fixture1")) + + assert.EqualError(t, mockedService.TheExampleMethod6(nil), "fixture1") +} + +func Test_Mock_On_WithSliceArgMatcher(t *testing.T) { + var mockedService TestExampleImplementation + + mockedService.On("TheExampleMethod7", + MatchedBy(func(slice []bool) bool { return slice == nil }), + ).Return(errors.New("fixture1")) + + assert.EqualError(t, mockedService.TheExampleMethod7(nil), "fixture1") +} + +func Test_Mock_On_WithVariadicFunc(t *testing.T) { + + // make a test impl object + var mockedService = new(TestExampleImplementation) + + c := mockedService. + On("TheExampleMethodVariadic", []int{1, 2, 3}). + Return(nil) + + assert.Equal(t, []*Call{c}, mockedService.ExpectedCalls) + assert.Equal(t, 1, len(c.Arguments)) + assert.Equal(t, []int{1, 2, 3}, c.Arguments[0]) + + assert.NotPanics(t, func() { + mockedService.TheExampleMethodVariadic(1, 2, 3) + }) + assert.Panics(t, func() { + mockedService.TheExampleMethodVariadic(1, 2) + }) + +} + +func Test_Mock_On_WithMixedVariadicFunc(t *testing.T) { + + // make a test impl object + var mockedService = new(TestExampleImplementation) + + c := mockedService. + On("TheExampleMethodMixedVariadic", 1, []int{2, 3, 4}). + Return(nil) + + assert.Equal(t, []*Call{c}, mockedService.ExpectedCalls) + assert.Equal(t, 2, len(c.Arguments)) + assert.Equal(t, 1, c.Arguments[0]) + assert.Equal(t, []int{2, 3, 4}, c.Arguments[1]) + + assert.NotPanics(t, func() { + mockedService.TheExampleMethodMixedVariadic(1, 2, 3, 4) + }) + assert.Panics(t, func() { + mockedService.TheExampleMethodMixedVariadic(1, 2, 3, 5) + }) + +} + +func Test_Mock_On_WithVariadicFuncWithInterface(t *testing.T) { + + // make a test impl object + var mockedService = new(TestExampleImplementation) + + c := mockedService.On("TheExampleMethodVariadicInterface", []interface{}{1, 2, 3}). + Return(nil) + + assert.Equal(t, []*Call{c}, mockedService.ExpectedCalls) + assert.Equal(t, 1, len(c.Arguments)) + assert.Equal(t, []interface{}{1, 2, 3}, c.Arguments[0]) + + assert.NotPanics(t, func() { + mockedService.TheExampleMethodVariadicInterface(1, 2, 3) + }) + assert.Panics(t, func() { + mockedService.TheExampleMethodVariadicInterface(1, 2) + }) + +} + +func Test_Mock_On_WithVariadicFuncWithEmptyInterfaceArray(t *testing.T) { + + // make a test impl object + var mockedService = new(TestExampleImplementation) + + var expected []interface{} + c := mockedService. + On("TheExampleMethodVariadicInterface", expected). + Return(nil) + + assert.Equal(t, []*Call{c}, mockedService.ExpectedCalls) + assert.Equal(t, 1, len(c.Arguments)) + assert.Equal(t, expected, c.Arguments[0]) + + assert.NotPanics(t, func() { + mockedService.TheExampleMethodVariadicInterface() + }) + assert.Panics(t, func() { + mockedService.TheExampleMethodVariadicInterface(1, 2) + }) + +} + +func Test_Mock_On_WithFuncPanics(t *testing.T) { + // make a test impl object + var mockedService = new(TestExampleImplementation) + + assert.Panics(t, func() { + mockedService.On("TheExampleMethodFunc", func(string) error { return nil }) + }) +} + +func Test_Mock_On_WithFuncTypeArg(t *testing.T) { + + // make a test impl object + var mockedService = new(TestExampleImplementation) + + c := mockedService. + On("TheExampleMethodFuncType", AnythingOfType("mock.ExampleFuncType")). + Return(nil) + + assert.Equal(t, []*Call{c}, mockedService.ExpectedCalls) + assert.Equal(t, 1, len(c.Arguments)) + assert.Equal(t, AnythingOfType("mock.ExampleFuncType"), c.Arguments[0]) + + fn := func(string) error { return nil } + assert.NotPanics(t, func() { + mockedService.TheExampleMethodFuncType(fn) + }) +} + +func Test_Mock_Return(t *testing.T) { + + // make a test impl object + var mockedService = new(TestExampleImplementation) + + c := mockedService. + On("TheExampleMethod", "A", "B", true). + Return(1, "two", true) + + require.Equal(t, []*Call{c}, mockedService.ExpectedCalls) + + call := mockedService.ExpectedCalls[0] + + assert.Equal(t, "TheExampleMethod", call.Method) + assert.Equal(t, "A", call.Arguments[0]) + assert.Equal(t, "B", call.Arguments[1]) + assert.Equal(t, true, call.Arguments[2]) + assert.Equal(t, 1, call.ReturnArguments[0]) + assert.Equal(t, "two", call.ReturnArguments[1]) + assert.Equal(t, true, call.ReturnArguments[2]) + assert.Equal(t, 0, call.Repeatability) + assert.Nil(t, call.WaitFor) +} + +func Test_Mock_Return_WaitUntil(t *testing.T) { + + // make a test impl object + var mockedService = new(TestExampleImplementation) + ch := time.After(time.Second) + + c := mockedService.Mock. + On("TheExampleMethod", "A", "B", true). + WaitUntil(ch). + Return(1, "two", true) + + // assert that the call was created + require.Equal(t, []*Call{c}, mockedService.ExpectedCalls) + + call := mockedService.ExpectedCalls[0] + + assert.Equal(t, "TheExampleMethod", call.Method) + assert.Equal(t, "A", call.Arguments[0]) + assert.Equal(t, "B", call.Arguments[1]) + assert.Equal(t, true, call.Arguments[2]) + assert.Equal(t, 1, call.ReturnArguments[0]) + assert.Equal(t, "two", call.ReturnArguments[1]) + assert.Equal(t, true, call.ReturnArguments[2]) + assert.Equal(t, 0, call.Repeatability) + assert.Equal(t, ch, call.WaitFor) +} + +func Test_Mock_Return_After(t *testing.T) { + + // make a test impl object + var mockedService = new(TestExampleImplementation) + + c := mockedService.Mock. + On("TheExampleMethod", "A", "B", true). + Return(1, "two", true). + After(time.Second) + + require.Equal(t, []*Call{c}, mockedService.ExpectedCalls) + + call := mockedService.Mock.ExpectedCalls[0] + + assert.Equal(t, "TheExampleMethod", call.Method) + assert.Equal(t, "A", call.Arguments[0]) + assert.Equal(t, "B", call.Arguments[1]) + assert.Equal(t, true, call.Arguments[2]) + assert.Equal(t, 1, call.ReturnArguments[0]) + assert.Equal(t, "two", call.ReturnArguments[1]) + assert.Equal(t, true, call.ReturnArguments[2]) + assert.Equal(t, 0, call.Repeatability) + assert.NotEqual(t, nil, call.WaitFor) + +} + +func Test_Mock_Return_Run(t *testing.T) { + + // make a test impl object + var mockedService = new(TestExampleImplementation) + + fn := func(args Arguments) { + arg := args.Get(0).(*ExampleType) + arg.ran = true + } + + c := mockedService.Mock. + On("TheExampleMethod3", AnythingOfType("*mock.ExampleType")). + Return(nil). + Run(fn) + + require.Equal(t, []*Call{c}, mockedService.ExpectedCalls) + + call := mockedService.Mock.ExpectedCalls[0] + + assert.Equal(t, "TheExampleMethod3", call.Method) + assert.Equal(t, AnythingOfType("*mock.ExampleType"), call.Arguments[0]) + assert.Equal(t, nil, call.ReturnArguments[0]) + assert.Equal(t, 0, call.Repeatability) + assert.NotEqual(t, nil, call.WaitFor) + assert.NotNil(t, call.Run) + + et := ExampleType{} + assert.Equal(t, false, et.ran) + mockedService.TheExampleMethod3(&et) + assert.Equal(t, true, et.ran) +} + +func Test_Mock_Return_Run_Out_Of_Order(t *testing.T) { + // make a test impl object + var mockedService = new(TestExampleImplementation) + f := func(args Arguments) { + arg := args.Get(0).(*ExampleType) + arg.ran = true + } + + c := mockedService.Mock. + On("TheExampleMethod3", AnythingOfType("*mock.ExampleType")). + Run(f). + Return(nil) + + require.Equal(t, []*Call{c}, mockedService.ExpectedCalls) + + call := mockedService.Mock.ExpectedCalls[0] + + assert.Equal(t, "TheExampleMethod3", call.Method) + assert.Equal(t, AnythingOfType("*mock.ExampleType"), call.Arguments[0]) + assert.Equal(t, nil, call.ReturnArguments[0]) + assert.Equal(t, 0, call.Repeatability) + assert.NotEqual(t, nil, call.WaitFor) + assert.NotNil(t, call.Run) +} + +func Test_Mock_Return_Once(t *testing.T) { + + // make a test impl object + var mockedService = new(TestExampleImplementation) + + c := mockedService.On("TheExampleMethod", "A", "B", true). + Return(1, "two", true). + Once() + + require.Equal(t, []*Call{c}, mockedService.ExpectedCalls) + + call := mockedService.ExpectedCalls[0] + + assert.Equal(t, "TheExampleMethod", call.Method) + assert.Equal(t, "A", call.Arguments[0]) + assert.Equal(t, "B", call.Arguments[1]) + assert.Equal(t, true, call.Arguments[2]) + assert.Equal(t, 1, call.ReturnArguments[0]) + assert.Equal(t, "two", call.ReturnArguments[1]) + assert.Equal(t, true, call.ReturnArguments[2]) + assert.Equal(t, 1, call.Repeatability) + assert.Nil(t, call.WaitFor) +} + +func Test_Mock_Return_Twice(t *testing.T) { + + // make a test impl object + var mockedService = new(TestExampleImplementation) + + c := mockedService. + On("TheExampleMethod", "A", "B", true). + Return(1, "two", true). + Twice() + + require.Equal(t, []*Call{c}, mockedService.ExpectedCalls) + + call := mockedService.ExpectedCalls[0] + + assert.Equal(t, "TheExampleMethod", call.Method) + assert.Equal(t, "A", call.Arguments[0]) + assert.Equal(t, "B", call.Arguments[1]) + assert.Equal(t, true, call.Arguments[2]) + assert.Equal(t, 1, call.ReturnArguments[0]) + assert.Equal(t, "two", call.ReturnArguments[1]) + assert.Equal(t, true, call.ReturnArguments[2]) + assert.Equal(t, 2, call.Repeatability) + assert.Nil(t, call.WaitFor) +} + +func Test_Mock_Return_Times(t *testing.T) { + + // make a test impl object + var mockedService = new(TestExampleImplementation) + + c := mockedService. + On("TheExampleMethod", "A", "B", true). + Return(1, "two", true). + Times(5) + + require.Equal(t, []*Call{c}, mockedService.ExpectedCalls) + + call := mockedService.ExpectedCalls[0] + + assert.Equal(t, "TheExampleMethod", call.Method) + assert.Equal(t, "A", call.Arguments[0]) + assert.Equal(t, "B", call.Arguments[1]) + assert.Equal(t, true, call.Arguments[2]) + assert.Equal(t, 1, call.ReturnArguments[0]) + assert.Equal(t, "two", call.ReturnArguments[1]) + assert.Equal(t, true, call.ReturnArguments[2]) + assert.Equal(t, 5, call.Repeatability) + assert.Nil(t, call.WaitFor) +} + +func Test_Mock_Return_Nothing(t *testing.T) { + + // make a test impl object + var mockedService = new(TestExampleImplementation) + + c := mockedService. + On("TheExampleMethod", "A", "B", true). + Return() + + require.Equal(t, []*Call{c}, mockedService.ExpectedCalls) + + call := mockedService.ExpectedCalls[0] + + assert.Equal(t, "TheExampleMethod", call.Method) + assert.Equal(t, "A", call.Arguments[0]) + assert.Equal(t, "B", call.Arguments[1]) + assert.Equal(t, true, call.Arguments[2]) + assert.Equal(t, 0, len(call.ReturnArguments)) +} + +func Test_Mock_findExpectedCall(t *testing.T) { + + m := new(Mock) + m.On("One", 1).Return("one") + m.On("Two", 2).Return("two") + m.On("Two", 3).Return("three") + + f, c := m.findExpectedCall("Two", 3) + + if assert.Equal(t, 2, f) { + if assert.NotNil(t, c) { + assert.Equal(t, "Two", c.Method) + assert.Equal(t, 3, c.Arguments[0]) + assert.Equal(t, "three", c.ReturnArguments[0]) + } + } + +} + +func Test_Mock_findExpectedCall_For_Unknown_Method(t *testing.T) { + + m := new(Mock) + m.On("One", 1).Return("one") + m.On("Two", 2).Return("two") + m.On("Two", 3).Return("three") + + f, _ := m.findExpectedCall("Two") + + assert.Equal(t, -1, f) + +} + +func Test_Mock_findExpectedCall_Respects_Repeatability(t *testing.T) { + + m := new(Mock) + m.On("One", 1).Return("one") + m.On("Two", 2).Return("two").Once() + m.On("Two", 3).Return("three").Twice() + m.On("Two", 3).Return("three").Times(8) + + f, c := m.findExpectedCall("Two", 3) + + if assert.Equal(t, 2, f) { + if assert.NotNil(t, c) { + assert.Equal(t, "Two", c.Method) + assert.Equal(t, 3, c.Arguments[0]) + assert.Equal(t, "three", c.ReturnArguments[0]) + } + } + +} + +func Test_callString(t *testing.T) { + + assert.Equal(t, `Method(int,bool,string)`, callString("Method", []interface{}{1, true, "something"}, false)) + +} + +func Test_Mock_Called(t *testing.T) { + + var mockedService = new(TestExampleImplementation) + + mockedService.On("Test_Mock_Called", 1, 2, 3).Return(5, "6", true) + + returnArguments := mockedService.Called(1, 2, 3) + + if assert.Equal(t, 1, len(mockedService.Calls)) { + assert.Equal(t, "Test_Mock_Called", mockedService.Calls[0].Method) + assert.Equal(t, 1, mockedService.Calls[0].Arguments[0]) + assert.Equal(t, 2, mockedService.Calls[0].Arguments[1]) + assert.Equal(t, 3, mockedService.Calls[0].Arguments[2]) + } + + if assert.Equal(t, 3, len(returnArguments)) { + assert.Equal(t, 5, returnArguments[0]) + assert.Equal(t, "6", returnArguments[1]) + assert.Equal(t, true, returnArguments[2]) + } + +} + +func asyncCall(m *Mock, ch chan Arguments) { + ch <- m.Called(1, 2, 3) +} + +func Test_Mock_Called_blocks(t *testing.T) { + + var mockedService = new(TestExampleImplementation) + + mockedService.Mock.On("asyncCall", 1, 2, 3).Return(5, "6", true).After(2 * time.Millisecond) + + ch := make(chan Arguments) + + go asyncCall(&mockedService.Mock, ch) + + select { + case <-ch: + t.Fatal("should have waited") + case <-time.After(1 * time.Millisecond): + } + + returnArguments := <-ch + + if assert.Equal(t, 1, len(mockedService.Mock.Calls)) { + assert.Equal(t, "asyncCall", mockedService.Mock.Calls[0].Method) + assert.Equal(t, 1, mockedService.Mock.Calls[0].Arguments[0]) + assert.Equal(t, 2, mockedService.Mock.Calls[0].Arguments[1]) + assert.Equal(t, 3, mockedService.Mock.Calls[0].Arguments[2]) + } + + if assert.Equal(t, 3, len(returnArguments)) { + assert.Equal(t, 5, returnArguments[0]) + assert.Equal(t, "6", returnArguments[1]) + assert.Equal(t, true, returnArguments[2]) + } + +} + +func Test_Mock_Called_For_Bounded_Repeatability(t *testing.T) { + + var mockedService = new(TestExampleImplementation) + + mockedService. + On("Test_Mock_Called_For_Bounded_Repeatability", 1, 2, 3). + Return(5, "6", true). + Once() + mockedService. + On("Test_Mock_Called_For_Bounded_Repeatability", 1, 2, 3). + Return(-1, "hi", false) + + returnArguments1 := mockedService.Called(1, 2, 3) + returnArguments2 := mockedService.Called(1, 2, 3) + + if assert.Equal(t, 2, len(mockedService.Calls)) { + assert.Equal(t, "Test_Mock_Called_For_Bounded_Repeatability", mockedService.Calls[0].Method) + assert.Equal(t, 1, mockedService.Calls[0].Arguments[0]) + assert.Equal(t, 2, mockedService.Calls[0].Arguments[1]) + assert.Equal(t, 3, mockedService.Calls[0].Arguments[2]) + + assert.Equal(t, "Test_Mock_Called_For_Bounded_Repeatability", mockedService.Calls[1].Method) + assert.Equal(t, 1, mockedService.Calls[1].Arguments[0]) + assert.Equal(t, 2, mockedService.Calls[1].Arguments[1]) + assert.Equal(t, 3, mockedService.Calls[1].Arguments[2]) + } + + if assert.Equal(t, 3, len(returnArguments1)) { + assert.Equal(t, 5, returnArguments1[0]) + assert.Equal(t, "6", returnArguments1[1]) + assert.Equal(t, true, returnArguments1[2]) + } + + if assert.Equal(t, 3, len(returnArguments2)) { + assert.Equal(t, -1, returnArguments2[0]) + assert.Equal(t, "hi", returnArguments2[1]) + assert.Equal(t, false, returnArguments2[2]) + } + +} + +func Test_Mock_Called_For_SetTime_Expectation(t *testing.T) { + + var mockedService = new(TestExampleImplementation) + + mockedService.On("TheExampleMethod", 1, 2, 3).Return(5, "6", true).Times(4) + + mockedService.TheExampleMethod(1, 2, 3) + mockedService.TheExampleMethod(1, 2, 3) + mockedService.TheExampleMethod(1, 2, 3) + mockedService.TheExampleMethod(1, 2, 3) + assert.Panics(t, func() { + mockedService.TheExampleMethod(1, 2, 3) + }) + +} + +func Test_Mock_Called_Unexpected(t *testing.T) { + + var mockedService = new(TestExampleImplementation) + + // make sure it panics if no expectation was made + assert.Panics(t, func() { + mockedService.Called(1, 2, 3) + }, "Calling unexpected method should panic") + +} + +func Test_AssertExpectationsForObjects_Helper(t *testing.T) { + + var mockedService1 = new(TestExampleImplementation) + var mockedService2 = new(TestExampleImplementation) + var mockedService3 = new(TestExampleImplementation) + + mockedService1.On("Test_AssertExpectationsForObjects_Helper", 1).Return() + mockedService2.On("Test_AssertExpectationsForObjects_Helper", 2).Return() + mockedService3.On("Test_AssertExpectationsForObjects_Helper", 3).Return() + + mockedService1.Called(1) + mockedService2.Called(2) + mockedService3.Called(3) + + assert.True(t, AssertExpectationsForObjects(t, &mockedService1.Mock, &mockedService2.Mock, &mockedService3.Mock)) + assert.True(t, AssertExpectationsForObjects(t, mockedService1, mockedService2, mockedService3)) + +} + +func Test_AssertExpectationsForObjects_Helper_Failed(t *testing.T) { + + var mockedService1 = new(TestExampleImplementation) + var mockedService2 = new(TestExampleImplementation) + var mockedService3 = new(TestExampleImplementation) + + mockedService1.On("Test_AssertExpectationsForObjects_Helper_Failed", 1).Return() + mockedService2.On("Test_AssertExpectationsForObjects_Helper_Failed", 2).Return() + mockedService3.On("Test_AssertExpectationsForObjects_Helper_Failed", 3).Return() + + mockedService1.Called(1) + mockedService3.Called(3) + + tt := new(testing.T) + assert.False(t, AssertExpectationsForObjects(tt, &mockedService1.Mock, &mockedService2.Mock, &mockedService3.Mock)) + assert.False(t, AssertExpectationsForObjects(tt, mockedService1, mockedService2, mockedService3)) + +} + +func Test_Mock_AssertExpectations(t *testing.T) { + + var mockedService = new(TestExampleImplementation) + + mockedService.On("Test_Mock_AssertExpectations", 1, 2, 3).Return(5, 6, 7) + + tt := new(testing.T) + assert.False(t, mockedService.AssertExpectations(tt)) + + // make the call now + mockedService.Called(1, 2, 3) + + // now assert expectations + assert.True(t, mockedService.AssertExpectations(tt)) + +} + +func Test_Mock_AssertExpectations_Placeholder_NoArgs(t *testing.T) { + + var mockedService = new(TestExampleImplementation) + + mockedService.On("Test_Mock_AssertExpectations_Placeholder_NoArgs").Return(5, 6, 7).Once() + mockedService.On("Test_Mock_AssertExpectations_Placeholder_NoArgs").Return(7, 6, 5) + + tt := new(testing.T) + assert.False(t, mockedService.AssertExpectations(tt)) + + // make the call now + mockedService.Called() + + // now assert expectations + assert.True(t, mockedService.AssertExpectations(tt)) + +} + +func Test_Mock_AssertExpectations_Placeholder(t *testing.T) { + + var mockedService = new(TestExampleImplementation) + + mockedService.On("Test_Mock_AssertExpectations_Placeholder", 1, 2, 3).Return(5, 6, 7).Once() + mockedService.On("Test_Mock_AssertExpectations_Placeholder", 3, 2, 1).Return(7, 6, 5) + + tt := new(testing.T) + assert.False(t, mockedService.AssertExpectations(tt)) + + // make the call now + mockedService.Called(1, 2, 3) + + // now assert expectations + assert.False(t, mockedService.AssertExpectations(tt)) + + // make call to the second expectation + mockedService.Called(3, 2, 1) + + // now assert expectations again + assert.True(t, mockedService.AssertExpectations(tt)) +} + +func Test_Mock_AssertExpectations_With_Pointers(t *testing.T) { + + var mockedService = new(TestExampleImplementation) + + mockedService.On("Test_Mock_AssertExpectations_With_Pointers", &struct{ Foo int }{1}).Return(1) + mockedService.On("Test_Mock_AssertExpectations_With_Pointers", &struct{ Foo int }{2}).Return(2) + + tt := new(testing.T) + assert.False(t, mockedService.AssertExpectations(tt)) + + s := struct{ Foo int }{1} + // make the calls now + mockedService.Called(&s) + s.Foo = 2 + mockedService.Called(&s) + + // now assert expectations + assert.True(t, mockedService.AssertExpectations(tt)) + +} + +func Test_Mock_AssertExpectationsCustomType(t *testing.T) { + + var mockedService = new(TestExampleImplementation) + + mockedService.On("TheExampleMethod3", AnythingOfType("*mock.ExampleType")).Return(nil).Once() + + tt := new(testing.T) + assert.False(t, mockedService.AssertExpectations(tt)) + + // make the call now + mockedService.TheExampleMethod3(&ExampleType{}) + + // now assert expectations + assert.True(t, mockedService.AssertExpectations(tt)) + +} + +func Test_Mock_AssertExpectations_With_Repeatability(t *testing.T) { + + var mockedService = new(TestExampleImplementation) + + mockedService.On("Test_Mock_AssertExpectations_With_Repeatability", 1, 2, 3).Return(5, 6, 7).Twice() + + tt := new(testing.T) + assert.False(t, mockedService.AssertExpectations(tt)) + + // make the call now + mockedService.Called(1, 2, 3) + + assert.False(t, mockedService.AssertExpectations(tt)) + + mockedService.Called(1, 2, 3) + + // now assert expectations + assert.True(t, mockedService.AssertExpectations(tt)) + +} + +func Test_Mock_TwoCallsWithDifferentArguments(t *testing.T) { + + var mockedService = new(TestExampleImplementation) + + mockedService.On("Test_Mock_TwoCallsWithDifferentArguments", 1, 2, 3).Return(5, 6, 7) + mockedService.On("Test_Mock_TwoCallsWithDifferentArguments", 4, 5, 6).Return(5, 6, 7) + + args1 := mockedService.Called(1, 2, 3) + assert.Equal(t, 5, args1.Int(0)) + assert.Equal(t, 6, args1.Int(1)) + assert.Equal(t, 7, args1.Int(2)) + + args2 := mockedService.Called(4, 5, 6) + assert.Equal(t, 5, args2.Int(0)) + assert.Equal(t, 6, args2.Int(1)) + assert.Equal(t, 7, args2.Int(2)) + +} + +func Test_Mock_AssertNumberOfCalls(t *testing.T) { + + var mockedService = new(TestExampleImplementation) + + mockedService.On("Test_Mock_AssertNumberOfCalls", 1, 2, 3).Return(5, 6, 7) + + mockedService.Called(1, 2, 3) + assert.True(t, mockedService.AssertNumberOfCalls(t, "Test_Mock_AssertNumberOfCalls", 1)) + + mockedService.Called(1, 2, 3) + assert.True(t, mockedService.AssertNumberOfCalls(t, "Test_Mock_AssertNumberOfCalls", 2)) + +} + +func Test_Mock_AssertCalled(t *testing.T) { + + var mockedService = new(TestExampleImplementation) + + mockedService.On("Test_Mock_AssertCalled", 1, 2, 3).Return(5, 6, 7) + + mockedService.Called(1, 2, 3) + + assert.True(t, mockedService.AssertCalled(t, "Test_Mock_AssertCalled", 1, 2, 3)) + +} + +func Test_Mock_AssertCalled_WithAnythingOfTypeArgument(t *testing.T) { + + var mockedService = new(TestExampleImplementation) + + mockedService. + On("Test_Mock_AssertCalled_WithAnythingOfTypeArgument", Anything, Anything, Anything). + Return() + + mockedService.Called(1, "two", []uint8("three")) + + assert.True(t, mockedService.AssertCalled(t, "Test_Mock_AssertCalled_WithAnythingOfTypeArgument", AnythingOfType("int"), AnythingOfType("string"), AnythingOfType("[]uint8"))) + +} + +func Test_Mock_AssertCalled_WithArguments(t *testing.T) { + + var mockedService = new(TestExampleImplementation) + + mockedService.On("Test_Mock_AssertCalled_WithArguments", 1, 2, 3).Return(5, 6, 7) + + mockedService.Called(1, 2, 3) + + tt := new(testing.T) + assert.True(t, mockedService.AssertCalled(tt, "Test_Mock_AssertCalled_WithArguments", 1, 2, 3)) + assert.False(t, mockedService.AssertCalled(tt, "Test_Mock_AssertCalled_WithArguments", 2, 3, 4)) + +} + +func Test_Mock_AssertCalled_WithArguments_With_Repeatability(t *testing.T) { + + var mockedService = new(TestExampleImplementation) + + mockedService.On("Test_Mock_AssertCalled_WithArguments_With_Repeatability", 1, 2, 3).Return(5, 6, 7).Once() + mockedService.On("Test_Mock_AssertCalled_WithArguments_With_Repeatability", 2, 3, 4).Return(5, 6, 7).Once() + + mockedService.Called(1, 2, 3) + mockedService.Called(2, 3, 4) + + tt := new(testing.T) + assert.True(t, mockedService.AssertCalled(tt, "Test_Mock_AssertCalled_WithArguments_With_Repeatability", 1, 2, 3)) + assert.True(t, mockedService.AssertCalled(tt, "Test_Mock_AssertCalled_WithArguments_With_Repeatability", 2, 3, 4)) + assert.False(t, mockedService.AssertCalled(tt, "Test_Mock_AssertCalled_WithArguments_With_Repeatability", 3, 4, 5)) + +} + +func Test_Mock_AssertNotCalled(t *testing.T) { + + var mockedService = new(TestExampleImplementation) + + mockedService.On("Test_Mock_AssertNotCalled", 1, 2, 3).Return(5, 6, 7) + + mockedService.Called(1, 2, 3) + + assert.True(t, mockedService.AssertNotCalled(t, "Test_Mock_NotCalled")) + +} + +func Test_Mock_AssertOptional(t *testing.T) { + // Optional called + var ms1 = new(TestExampleImplementation) + ms1.On("TheExampleMethod", 1, 2, 3).Maybe().Return(4, nil) + ms1.TheExampleMethod(1, 2, 3) + + tt1 := new(testing.T) + assert.Equal(t, true, ms1.AssertExpectations(tt1)) + + // Optional not called + var ms2 = new(TestExampleImplementation) + ms2.On("TheExampleMethod", 1, 2, 3).Maybe().Return(4, nil) + + tt2 := new(testing.T) + assert.Equal(t, true, ms2.AssertExpectations(tt2)) + + // Non-optional called + var ms3 = new(TestExampleImplementation) + ms3.On("TheExampleMethod", 1, 2, 3).Return(4, nil) + ms3.TheExampleMethod(1, 2, 3) + + tt3 := new(testing.T) + assert.Equal(t, true, ms3.AssertExpectations(tt3)) +} + +/* + Arguments helper methods +*/ +func Test_Arguments_Get(t *testing.T) { + + var args = Arguments([]interface{}{"string", 123, true}) + + assert.Equal(t, "string", args.Get(0).(string)) + assert.Equal(t, 123, args.Get(1).(int)) + assert.Equal(t, true, args.Get(2).(bool)) + +} + +func Test_Arguments_Is(t *testing.T) { + + var args = Arguments([]interface{}{"string", 123, true}) + + assert.True(t, args.Is("string", 123, true)) + assert.False(t, args.Is("wrong", 456, false)) + +} + +func Test_Arguments_Diff(t *testing.T) { + + var args = Arguments([]interface{}{"Hello World", 123, true}) + var diff string + var count int + diff, count = args.Diff([]interface{}{"Hello World", 456, "false"}) + + assert.Equal(t, 2, count) + assert.Contains(t, diff, `%!s(int=456) != %!s(int=123)`) + assert.Contains(t, diff, `false != %!s(bool=true)`) + +} + +func Test_Arguments_Diff_DifferentNumberOfArgs(t *testing.T) { + + var args = Arguments([]interface{}{"string", 123, true}) + var diff string + var count int + diff, count = args.Diff([]interface{}{"string", 456, "false", "extra"}) + + assert.Equal(t, 3, count) + assert.Contains(t, diff, `extra != (Missing)`) + +} + +func Test_Arguments_Diff_WithAnythingArgument(t *testing.T) { + + var args = Arguments([]interface{}{"string", 123, true}) + var count int + _, count = args.Diff([]interface{}{"string", Anything, true}) + + assert.Equal(t, 0, count) + +} + +func Test_Arguments_Diff_WithAnythingArgument_InActualToo(t *testing.T) { + + var args = Arguments([]interface{}{"string", Anything, true}) + var count int + _, count = args.Diff([]interface{}{"string", 123, true}) + + assert.Equal(t, 0, count) + +} + +func Test_Arguments_Diff_WithAnythingOfTypeArgument(t *testing.T) { + + var args = Arguments([]interface{}{"string", AnythingOfType("int"), true}) + var count int + _, count = args.Diff([]interface{}{"string", 123, true}) + + assert.Equal(t, 0, count) + +} + +func Test_Arguments_Diff_WithAnythingOfTypeArgument_Failing(t *testing.T) { + + var args = Arguments([]interface{}{"string", AnythingOfType("string"), true}) + var count int + var diff string + diff, count = args.Diff([]interface{}{"string", 123, true}) + + assert.Equal(t, 1, count) + assert.Contains(t, diff, `string != type int - %!s(int=123)`) + +} + +func Test_Arguments_Diff_WithArgMatcher(t *testing.T) { + matchFn := func(a int) bool { + return a == 123 + } + var args = Arguments([]interface{}{"string", MatchedBy(matchFn), true}) + + diff, count := args.Diff([]interface{}{"string", 124, true}) + assert.Equal(t, 1, count) + assert.Contains(t, diff, `%!s(int=124) not matched by func(int) bool`) + + diff, count = args.Diff([]interface{}{"string", false, true}) + assert.Equal(t, 1, count) + assert.Contains(t, diff, `%!s(bool=false) not matched by func(int) bool`) + + diff, count = args.Diff([]interface{}{"string", 123, false}) + assert.Contains(t, diff, `%!s(int=123) matched by func(int) bool`) + + diff, count = args.Diff([]interface{}{"string", 123, true}) + assert.Equal(t, 0, count) + assert.Contains(t, diff, `No differences.`) +} + +func Test_Arguments_Assert(t *testing.T) { + + var args = Arguments([]interface{}{"string", 123, true}) + + assert.True(t, args.Assert(t, "string", 123, true)) + +} + +func Test_Arguments_String_Representation(t *testing.T) { + + var args = Arguments([]interface{}{"string", 123, true}) + assert.Equal(t, `string,int,bool`, args.String()) + +} + +func Test_Arguments_String(t *testing.T) { + + var args = Arguments([]interface{}{"string", 123, true}) + assert.Equal(t, "string", args.String(0)) + +} + +func Test_Arguments_Error(t *testing.T) { + + var err = errors.New("An Error") + var args = Arguments([]interface{}{"string", 123, true, err}) + assert.Equal(t, err, args.Error(3)) + +} + +func Test_Arguments_Error_Nil(t *testing.T) { + + var args = Arguments([]interface{}{"string", 123, true, nil}) + assert.Equal(t, nil, args.Error(3)) + +} + +func Test_Arguments_Int(t *testing.T) { + + var args = Arguments([]interface{}{"string", 123, true}) + assert.Equal(t, 123, args.Int(1)) + +} + +func Test_Arguments_Bool(t *testing.T) { + + var args = Arguments([]interface{}{"string", 123, true}) + assert.Equal(t, true, args.Bool(2)) + +} + +func Test_WaitUntil_Parallel(t *testing.T) { + + // make a test impl object + var mockedService *TestExampleImplementation = new(TestExampleImplementation) + + ch1 := make(chan time.Time) + ch2 := make(chan time.Time) + + mockedService.Mock.On("TheExampleMethod2", true).Return().WaitUntil(ch2).Run(func(args Arguments) { + ch1 <- time.Now() + }) + + mockedService.Mock.On("TheExampleMethod2", false).Return().WaitUntil(ch1) + + // Lock both goroutines on the .WaitUntil method + go func() { + mockedService.TheExampleMethod2(false) + }() + go func() { + mockedService.TheExampleMethod2(true) + }() + + // Allow the first call to execute, so the second one executes afterwards + ch2 <- time.Now() +} + +func Test_MockMethodCalled(t *testing.T) { + m := new(Mock) + m.On("foo", "hello").Return("world") + + retArgs := m.MethodCalled("foo", "hello") + require.True(t, len(retArgs) == 1) + require.Equal(t, "world", retArgs[0]) + m.AssertExpectations(t) +} + +// Test to validate fix for racy concurrent call access in MethodCalled() +func Test_MockReturnAndCalledConcurrent(t *testing.T) { + iterations := 1000 + m := &Mock{} + call := m.On("ConcurrencyTestMethod") + + wg := sync.WaitGroup{} + wg.Add(2) + + go func() { + for i := 0; i < iterations; i++ { + call.Return(10) + } + wg.Done() + }() + go func() { + for i := 0; i < iterations; i++ { + ConcurrencyTestMethod(m) + } + wg.Done() + }() + wg.Wait() +} + +type timer struct{ Mock } + +func (s *timer) GetTime(i int) string { + return s.Called(i).Get(0).(string) +} + +func TestAfterTotalWaitTimeWhileExecution(t *testing.T) { + waitDuration := 1 + total, waitMs := 5, time.Millisecond*time.Duration(waitDuration) + aTimer := new(timer) + for i := 0; i < total; i++ { + aTimer.On("GetTime", i).After(waitMs).Return(fmt.Sprintf("Time%d", i)).Once() + } + time.Sleep(waitMs) + start := time.Now() + var results []string + + for i := 0; i < total; i++ { + results = append(results, aTimer.GetTime(i)) + } + + end := time.Now() + elapsedTime := end.Sub(start) + assert.True(t, elapsedTime > waitMs, fmt.Sprintf("Total elapsed time:%v should be atleast greater than %v", elapsedTime, waitMs)) + assert.Equal(t, total, len(results)) + for i, _ := range results { + assert.Equal(t, fmt.Sprintf("Time%d", i), results[i], "Return value of method should be same") + } +} + +func ConcurrencyTestMethod(m *Mock) { + m.Called() +} diff --git a/api/vendor/github.com/stretchr/testify/package_test.go b/api/vendor/github.com/stretchr/testify/package_test.go new file mode 100644 index 0000000..7ac5d6d --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/package_test.go @@ -0,0 +1,12 @@ +package testify + +import ( + "github.com/stretchr/testify/assert" + "testing" +) + +func TestImports(t *testing.T) { + if assert.Equal(t, 1, 1) != true { + t.Error("Something is wrong.") + } +} diff --git a/api/vendor/github.com/stretchr/testify/require/doc.go b/api/vendor/github.com/stretchr/testify/require/doc.go new file mode 100644 index 0000000..169de39 --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/require/doc.go @@ -0,0 +1,28 @@ +// Package require implements the same assertions as the `assert` package but +// stops test execution when a test fails. +// +// Example Usage +// +// The following is a complete example using require in a standard test function: +// import ( +// "testing" +// "github.com/stretchr/testify/require" +// ) +// +// func TestSomething(t *testing.T) { +// +// var a string = "Hello" +// var b string = "Hello" +// +// require.Equal(t, a, b, "The two words should be the same.") +// +// } +// +// Assertions +// +// The `require` package have same global functions as in the `assert` package, +// but instead of returning a boolean result they call `t.FailNow()`. +// +// Every assertion function also takes an optional string message as the final argument, +// allowing custom error messages to be appended to the message the assertion method outputs. +package require diff --git a/api/vendor/github.com/stretchr/testify/require/forward_requirements.go b/api/vendor/github.com/stretchr/testify/require/forward_requirements.go new file mode 100644 index 0000000..ac71d40 --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/require/forward_requirements.go @@ -0,0 +1,16 @@ +package require + +// Assertions provides assertion methods around the +// TestingT interface. +type Assertions struct { + t TestingT +} + +// New makes a new Assertions object for the specified TestingT. +func New(t TestingT) *Assertions { + return &Assertions{ + t: t, + } +} + +//go:generate go run ../_codegen/main.go -output-package=require -template=require_forward.go.tmpl -include-format-funcs diff --git a/api/vendor/github.com/stretchr/testify/require/forward_requirements_test.go b/api/vendor/github.com/stretchr/testify/require/forward_requirements_test.go new file mode 100644 index 0000000..b120ae3 --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/require/forward_requirements_test.go @@ -0,0 +1,385 @@ +package require + +import ( + "errors" + "testing" + "time" +) + +func TestImplementsWrapper(t *testing.T) { + require := New(t) + + require.Implements((*AssertionTesterInterface)(nil), new(AssertionTesterConformingObject)) + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.Implements((*AssertionTesterInterface)(nil), new(AssertionTesterNonConformingObject)) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestIsTypeWrapper(t *testing.T) { + require := New(t) + require.IsType(new(AssertionTesterConformingObject), new(AssertionTesterConformingObject)) + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.IsType(new(AssertionTesterConformingObject), new(AssertionTesterNonConformingObject)) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestEqualWrapper(t *testing.T) { + require := New(t) + require.Equal(1, 1) + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.Equal(1, 2) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestNotEqualWrapper(t *testing.T) { + require := New(t) + require.NotEqual(1, 2) + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.NotEqual(2, 2) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestExactlyWrapper(t *testing.T) { + require := New(t) + + a := float32(1) + b := float32(1) + c := float64(1) + + require.Exactly(a, b) + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.Exactly(a, c) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestNotNilWrapper(t *testing.T) { + require := New(t) + require.NotNil(t, new(AssertionTesterConformingObject)) + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.NotNil(nil) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestNilWrapper(t *testing.T) { + require := New(t) + require.Nil(nil) + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.Nil(new(AssertionTesterConformingObject)) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestTrueWrapper(t *testing.T) { + require := New(t) + require.True(true) + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.True(false) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestFalseWrapper(t *testing.T) { + require := New(t) + require.False(false) + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.False(true) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestContainsWrapper(t *testing.T) { + require := New(t) + require.Contains("Hello World", "Hello") + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.Contains("Hello World", "Salut") + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestNotContainsWrapper(t *testing.T) { + require := New(t) + require.NotContains("Hello World", "Hello!") + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.NotContains("Hello World", "Hello") + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestPanicsWrapper(t *testing.T) { + require := New(t) + require.Panics(func() { + panic("Panic!") + }) + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.Panics(func() {}) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestNotPanicsWrapper(t *testing.T) { + require := New(t) + require.NotPanics(func() {}) + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.NotPanics(func() { + panic("Panic!") + }) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestNoErrorWrapper(t *testing.T) { + require := New(t) + require.NoError(nil) + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.NoError(errors.New("some error")) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestErrorWrapper(t *testing.T) { + require := New(t) + require.Error(errors.New("some error")) + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.Error(nil) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestEqualErrorWrapper(t *testing.T) { + require := New(t) + require.EqualError(errors.New("some error"), "some error") + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.EqualError(errors.New("some error"), "Not some error") + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestEmptyWrapper(t *testing.T) { + require := New(t) + require.Empty("") + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.Empty("x") + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestNotEmptyWrapper(t *testing.T) { + require := New(t) + require.NotEmpty("x") + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.NotEmpty("") + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestWithinDurationWrapper(t *testing.T) { + require := New(t) + a := time.Now() + b := a.Add(10 * time.Second) + + require.WithinDuration(a, b, 15*time.Second) + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.WithinDuration(a, b, 5*time.Second) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestInDeltaWrapper(t *testing.T) { + require := New(t) + require.InDelta(1.001, 1, 0.01) + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.InDelta(1, 2, 0.5) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestZeroWrapper(t *testing.T) { + require := New(t) + require.Zero(0) + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.Zero(1) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestNotZeroWrapper(t *testing.T) { + require := New(t) + require.NotZero(1) + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.NotZero(0) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestJSONEqWrapper_EqualSONString(t *testing.T) { + mockT := new(MockT) + mockRequire := New(mockT) + + mockRequire.JSONEq(`{"hello": "world", "foo": "bar"}`, `{"hello": "world", "foo": "bar"}`) + if mockT.Failed { + t.Error("Check should pass") + } +} + +func TestJSONEqWrapper_EquivalentButNotEqual(t *testing.T) { + mockT := new(MockT) + mockRequire := New(mockT) + + mockRequire.JSONEq(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) + if mockT.Failed { + t.Error("Check should pass") + } +} + +func TestJSONEqWrapper_HashOfArraysAndHashes(t *testing.T) { + mockT := new(MockT) + mockRequire := New(mockT) + + mockRequire.JSONEq("{\r\n\t\"numeric\": 1.5,\r\n\t\"array\": [{\"foo\": \"bar\"}, 1, \"string\", [\"nested\", \"array\", 5.5]],\r\n\t\"hash\": {\"nested\": \"hash\", \"nested_slice\": [\"this\", \"is\", \"nested\"]},\r\n\t\"string\": \"foo\"\r\n}", + "{\r\n\t\"numeric\": 1.5,\r\n\t\"hash\": {\"nested\": \"hash\", \"nested_slice\": [\"this\", \"is\", \"nested\"]},\r\n\t\"string\": \"foo\",\r\n\t\"array\": [{\"foo\": \"bar\"}, 1, \"string\", [\"nested\", \"array\", 5.5]]\r\n}") + if mockT.Failed { + t.Error("Check should pass") + } +} + +func TestJSONEqWrapper_Array(t *testing.T) { + mockT := new(MockT) + mockRequire := New(mockT) + + mockRequire.JSONEq(`["foo", {"hello": "world", "nested": "hash"}]`, `["foo", {"nested": "hash", "hello": "world"}]`) + if mockT.Failed { + t.Error("Check should pass") + } +} + +func TestJSONEqWrapper_HashAndArrayNotEquivalent(t *testing.T) { + mockT := new(MockT) + mockRequire := New(mockT) + + mockRequire.JSONEq(`["foo", {"hello": "world", "nested": "hash"}]`, `{"foo": "bar", {"nested": "hash", "hello": "world"}}`) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestJSONEqWrapper_HashesNotEquivalent(t *testing.T) { + mockT := new(MockT) + mockRequire := New(mockT) + + mockRequire.JSONEq(`{"foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestJSONEqWrapper_ActualIsNotJSON(t *testing.T) { + mockT := new(MockT) + mockRequire := New(mockT) + + mockRequire.JSONEq(`{"foo": "bar"}`, "Not JSON") + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestJSONEqWrapper_ExpectedIsNotJSON(t *testing.T) { + mockT := new(MockT) + mockRequire := New(mockT) + + mockRequire.JSONEq("Not JSON", `{"foo": "bar", "hello": "world"}`) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestJSONEqWrapper_ExpectedAndActualNotJSON(t *testing.T) { + mockT := new(MockT) + mockRequire := New(mockT) + + mockRequire.JSONEq("Not JSON", "Not JSON") + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestJSONEqWrapper_ArraysOfDifferentOrder(t *testing.T) { + mockT := new(MockT) + mockRequire := New(mockT) + + mockRequire.JSONEq(`["foo", {"hello": "world", "nested": "hash"}]`, `[{ "hello": "world", "nested": "hash"}, "foo"]`) + if !mockT.Failed { + t.Error("Check should fail") + } +} diff --git a/api/vendor/github.com/stretchr/testify/require/require.go b/api/vendor/github.com/stretchr/testify/require/require.go new file mode 100644 index 0000000..ac3c308 --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/require/require.go @@ -0,0 +1,867 @@ +/* +* CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen +* THIS FILE MUST NOT BE EDITED BY HAND + */ + +package require + +import ( + assert "github.com/stretchr/testify/assert" + http "net/http" + url "net/url" + time "time" +) + +// Condition uses a Comparison to assert a complex condition. +func Condition(t TestingT, comp assert.Comparison, msgAndArgs ...interface{}) { + if !assert.Condition(t, comp, msgAndArgs...) { + t.FailNow() + } +} + +// Conditionf uses a Comparison to assert a complex condition. +func Conditionf(t TestingT, comp assert.Comparison, msg string, args ...interface{}) { + if !assert.Conditionf(t, comp, msg, args...) { + t.FailNow() + } +} + +// Contains asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// assert.Contains(t, "Hello World", "World") +// assert.Contains(t, ["Hello", "World"], "World") +// assert.Contains(t, {"Hello": "World"}, "Hello") +func Contains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...interface{}) { + if !assert.Contains(t, s, contains, msgAndArgs...) { + t.FailNow() + } +} + +// Containsf asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// assert.Containsf(t, "Hello World", "World", "error message %s", "formatted") +// assert.Containsf(t, ["Hello", "World"], "World", "error message %s", "formatted") +// assert.Containsf(t, {"Hello": "World"}, "Hello", "error message %s", "formatted") +func Containsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) { + if !assert.Containsf(t, s, contains, msg, args...) { + t.FailNow() + } +} + +// DirExists checks whether a directory exists in the given path. It also fails if the path is a file rather a directory or there is an error checking whether it exists. +func DirExists(t TestingT, path string, msgAndArgs ...interface{}) { + if !assert.DirExists(t, path, msgAndArgs...) { + t.FailNow() + } +} + +// DirExistsf checks whether a directory exists in the given path. It also fails if the path is a file rather a directory or there is an error checking whether it exists. +func DirExistsf(t TestingT, path string, msg string, args ...interface{}) { + if !assert.DirExistsf(t, path, msg, args...) { + t.FailNow() + } +} + +// ElementsMatch asserts that the specified listA(array, slice...) is equal to specified +// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, +// the number of appearances of each of them in both lists should match. +// +// assert.ElementsMatch(t, [1, 3, 2, 3], [1, 3, 3, 2]) +func ElementsMatch(t TestingT, listA interface{}, listB interface{}, msgAndArgs ...interface{}) { + if !assert.ElementsMatch(t, listA, listB, msgAndArgs...) { + t.FailNow() + } +} + +// ElementsMatchf asserts that the specified listA(array, slice...) is equal to specified +// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, +// the number of appearances of each of them in both lists should match. +// +// assert.ElementsMatchf(t, [1, 3, 2, 3], [1, 3, 3, 2], "error message %s", "formatted") +func ElementsMatchf(t TestingT, listA interface{}, listB interface{}, msg string, args ...interface{}) { + if !assert.ElementsMatchf(t, listA, listB, msg, args...) { + t.FailNow() + } +} + +// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// assert.Empty(t, obj) +func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) { + if !assert.Empty(t, object, msgAndArgs...) { + t.FailNow() + } +} + +// Emptyf asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// assert.Emptyf(t, obj, "error message %s", "formatted") +func Emptyf(t TestingT, object interface{}, msg string, args ...interface{}) { + if !assert.Emptyf(t, object, msg, args...) { + t.FailNow() + } +} + +// Equal asserts that two objects are equal. +// +// assert.Equal(t, 123, 123) +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func Equal(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if !assert.Equal(t, expected, actual, msgAndArgs...) { + t.FailNow() + } +} + +// EqualError asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// assert.EqualError(t, err, expectedErrorString) +func EqualError(t TestingT, theError error, errString string, msgAndArgs ...interface{}) { + if !assert.EqualError(t, theError, errString, msgAndArgs...) { + t.FailNow() + } +} + +// EqualErrorf asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// assert.EqualErrorf(t, err, expectedErrorString, "error message %s", "formatted") +func EqualErrorf(t TestingT, theError error, errString string, msg string, args ...interface{}) { + if !assert.EqualErrorf(t, theError, errString, msg, args...) { + t.FailNow() + } +} + +// EqualValues asserts that two objects are equal or convertable to the same types +// and equal. +// +// assert.EqualValues(t, uint32(123), int32(123)) +func EqualValues(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if !assert.EqualValues(t, expected, actual, msgAndArgs...) { + t.FailNow() + } +} + +// EqualValuesf asserts that two objects are equal or convertable to the same types +// and equal. +// +// assert.EqualValuesf(t, uint32(123, "error message %s", "formatted"), int32(123)) +func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { + if !assert.EqualValuesf(t, expected, actual, msg, args...) { + t.FailNow() + } +} + +// Equalf asserts that two objects are equal. +// +// assert.Equalf(t, 123, 123, "error message %s", "formatted") +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func Equalf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { + if !assert.Equalf(t, expected, actual, msg, args...) { + t.FailNow() + } +} + +// Error asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if assert.Error(t, err) { +// assert.Equal(t, expectedError, err) +// } +func Error(t TestingT, err error, msgAndArgs ...interface{}) { + if !assert.Error(t, err, msgAndArgs...) { + t.FailNow() + } +} + +// Errorf asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if assert.Errorf(t, err, "error message %s", "formatted") { +// assert.Equal(t, expectedErrorf, err) +// } +func Errorf(t TestingT, err error, msg string, args ...interface{}) { + if !assert.Errorf(t, err, msg, args...) { + t.FailNow() + } +} + +// Exactly asserts that two objects are equal in value and type. +// +// assert.Exactly(t, int32(123), int64(123)) +func Exactly(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if !assert.Exactly(t, expected, actual, msgAndArgs...) { + t.FailNow() + } +} + +// Exactlyf asserts that two objects are equal in value and type. +// +// assert.Exactlyf(t, int32(123, "error message %s", "formatted"), int64(123)) +func Exactlyf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { + if !assert.Exactlyf(t, expected, actual, msg, args...) { + t.FailNow() + } +} + +// Fail reports a failure through +func Fail(t TestingT, failureMessage string, msgAndArgs ...interface{}) { + if !assert.Fail(t, failureMessage, msgAndArgs...) { + t.FailNow() + } +} + +// FailNow fails test +func FailNow(t TestingT, failureMessage string, msgAndArgs ...interface{}) { + if !assert.FailNow(t, failureMessage, msgAndArgs...) { + t.FailNow() + } +} + +// FailNowf fails test +func FailNowf(t TestingT, failureMessage string, msg string, args ...interface{}) { + if !assert.FailNowf(t, failureMessage, msg, args...) { + t.FailNow() + } +} + +// Failf reports a failure through +func Failf(t TestingT, failureMessage string, msg string, args ...interface{}) { + if !assert.Failf(t, failureMessage, msg, args...) { + t.FailNow() + } +} + +// False asserts that the specified value is false. +// +// assert.False(t, myBool) +func False(t TestingT, value bool, msgAndArgs ...interface{}) { + if !assert.False(t, value, msgAndArgs...) { + t.FailNow() + } +} + +// Falsef asserts that the specified value is false. +// +// assert.Falsef(t, myBool, "error message %s", "formatted") +func Falsef(t TestingT, value bool, msg string, args ...interface{}) { + if !assert.Falsef(t, value, msg, args...) { + t.FailNow() + } +} + +// FileExists checks whether a file exists in the given path. It also fails if the path points to a directory or there is an error when trying to check the file. +func FileExists(t TestingT, path string, msgAndArgs ...interface{}) { + if !assert.FileExists(t, path, msgAndArgs...) { + t.FailNow() + } +} + +// FileExistsf checks whether a file exists in the given path. It also fails if the path points to a directory or there is an error when trying to check the file. +func FileExistsf(t TestingT, path string, msg string, args ...interface{}) { + if !assert.FileExistsf(t, path, msg, args...) { + t.FailNow() + } +} + +// HTTPBodyContains asserts that a specified handler returns a +// body that contains a string. +// +// assert.HTTPBodyContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) { + if !assert.HTTPBodyContains(t, handler, method, url, values, str, msgAndArgs...) { + t.FailNow() + } +} + +// HTTPBodyContainsf asserts that a specified handler returns a +// body that contains a string. +// +// assert.HTTPBodyContainsf(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) { + if !assert.HTTPBodyContainsf(t, handler, method, url, values, str, msg, args...) { + t.FailNow() + } +} + +// HTTPBodyNotContains asserts that a specified handler returns a +// body that does not contain a string. +// +// assert.HTTPBodyNotContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) { + if !assert.HTTPBodyNotContains(t, handler, method, url, values, str, msgAndArgs...) { + t.FailNow() + } +} + +// HTTPBodyNotContainsf asserts that a specified handler returns a +// body that does not contain a string. +// +// assert.HTTPBodyNotContainsf(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) { + if !assert.HTTPBodyNotContainsf(t, handler, method, url, values, str, msg, args...) { + t.FailNow() + } +} + +// HTTPError asserts that a specified handler returns an error status code. +// +// assert.HTTPError(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPError(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) { + if !assert.HTTPError(t, handler, method, url, values, msgAndArgs...) { + t.FailNow() + } +} + +// HTTPErrorf asserts that a specified handler returns an error status code. +// +// assert.HTTPErrorf(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) { + if !assert.HTTPErrorf(t, handler, method, url, values, msg, args...) { + t.FailNow() + } +} + +// HTTPRedirect asserts that a specified handler returns a redirect status code. +// +// assert.HTTPRedirect(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPRedirect(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) { + if !assert.HTTPRedirect(t, handler, method, url, values, msgAndArgs...) { + t.FailNow() + } +} + +// HTTPRedirectf asserts that a specified handler returns a redirect status code. +// +// assert.HTTPRedirectf(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) { + if !assert.HTTPRedirectf(t, handler, method, url, values, msg, args...) { + t.FailNow() + } +} + +// HTTPSuccess asserts that a specified handler returns a success status code. +// +// assert.HTTPSuccess(t, myHandler, "POST", "http://www.google.com", nil) +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPSuccess(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) { + if !assert.HTTPSuccess(t, handler, method, url, values, msgAndArgs...) { + t.FailNow() + } +} + +// HTTPSuccessf asserts that a specified handler returns a success status code. +// +// assert.HTTPSuccessf(t, myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) { + if !assert.HTTPSuccessf(t, handler, method, url, values, msg, args...) { + t.FailNow() + } +} + +// Implements asserts that an object is implemented by the specified interface. +// +// assert.Implements(t, (*MyInterface)(nil), new(MyObject)) +func Implements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) { + if !assert.Implements(t, interfaceObject, object, msgAndArgs...) { + t.FailNow() + } +} + +// Implementsf asserts that an object is implemented by the specified interface. +// +// assert.Implementsf(t, (*MyInterface, "error message %s", "formatted")(nil), new(MyObject)) +func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) { + if !assert.Implementsf(t, interfaceObject, object, msg, args...) { + t.FailNow() + } +} + +// InDelta asserts that the two numerals are within delta of each other. +// +// assert.InDelta(t, math.Pi, (22 / 7.0), 0.01) +func InDelta(t TestingT, expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) { + if !assert.InDelta(t, expected, actual, delta, msgAndArgs...) { + t.FailNow() + } +} + +// InDeltaMapValues is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys. +func InDeltaMapValues(t TestingT, expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) { + if !assert.InDeltaMapValues(t, expected, actual, delta, msgAndArgs...) { + t.FailNow() + } +} + +// InDeltaMapValuesf is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys. +func InDeltaMapValuesf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) { + if !assert.InDeltaMapValuesf(t, expected, actual, delta, msg, args...) { + t.FailNow() + } +} + +// InDeltaSlice is the same as InDelta, except it compares two slices. +func InDeltaSlice(t TestingT, expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) { + if !assert.InDeltaSlice(t, expected, actual, delta, msgAndArgs...) { + t.FailNow() + } +} + +// InDeltaSlicef is the same as InDelta, except it compares two slices. +func InDeltaSlicef(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) { + if !assert.InDeltaSlicef(t, expected, actual, delta, msg, args...) { + t.FailNow() + } +} + +// InDeltaf asserts that the two numerals are within delta of each other. +// +// assert.InDeltaf(t, math.Pi, (22 / 7.0, "error message %s", "formatted"), 0.01) +func InDeltaf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) { + if !assert.InDeltaf(t, expected, actual, delta, msg, args...) { + t.FailNow() + } +} + +// InEpsilon asserts that expected and actual have a relative error less than epsilon +func InEpsilon(t TestingT, expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) { + if !assert.InEpsilon(t, expected, actual, epsilon, msgAndArgs...) { + t.FailNow() + } +} + +// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices. +func InEpsilonSlice(t TestingT, expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) { + if !assert.InEpsilonSlice(t, expected, actual, epsilon, msgAndArgs...) { + t.FailNow() + } +} + +// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices. +func InEpsilonSlicef(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) { + if !assert.InEpsilonSlicef(t, expected, actual, epsilon, msg, args...) { + t.FailNow() + } +} + +// InEpsilonf asserts that expected and actual have a relative error less than epsilon +func InEpsilonf(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) { + if !assert.InEpsilonf(t, expected, actual, epsilon, msg, args...) { + t.FailNow() + } +} + +// IsType asserts that the specified objects are of the same type. +func IsType(t TestingT, expectedType interface{}, object interface{}, msgAndArgs ...interface{}) { + if !assert.IsType(t, expectedType, object, msgAndArgs...) { + t.FailNow() + } +} + +// IsTypef asserts that the specified objects are of the same type. +func IsTypef(t TestingT, expectedType interface{}, object interface{}, msg string, args ...interface{}) { + if !assert.IsTypef(t, expectedType, object, msg, args...) { + t.FailNow() + } +} + +// JSONEq asserts that two JSON strings are equivalent. +// +// assert.JSONEq(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) +func JSONEq(t TestingT, expected string, actual string, msgAndArgs ...interface{}) { + if !assert.JSONEq(t, expected, actual, msgAndArgs...) { + t.FailNow() + } +} + +// JSONEqf asserts that two JSON strings are equivalent. +// +// assert.JSONEqf(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted") +func JSONEqf(t TestingT, expected string, actual string, msg string, args ...interface{}) { + if !assert.JSONEqf(t, expected, actual, msg, args...) { + t.FailNow() + } +} + +// Len asserts that the specified object has specific length. +// Len also fails if the object has a type that len() not accept. +// +// assert.Len(t, mySlice, 3) +func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) { + if !assert.Len(t, object, length, msgAndArgs...) { + t.FailNow() + } +} + +// Lenf asserts that the specified object has specific length. +// Lenf also fails if the object has a type that len() not accept. +// +// assert.Lenf(t, mySlice, 3, "error message %s", "formatted") +func Lenf(t TestingT, object interface{}, length int, msg string, args ...interface{}) { + if !assert.Lenf(t, object, length, msg, args...) { + t.FailNow() + } +} + +// Nil asserts that the specified object is nil. +// +// assert.Nil(t, err) +func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) { + if !assert.Nil(t, object, msgAndArgs...) { + t.FailNow() + } +} + +// Nilf asserts that the specified object is nil. +// +// assert.Nilf(t, err, "error message %s", "formatted") +func Nilf(t TestingT, object interface{}, msg string, args ...interface{}) { + if !assert.Nilf(t, object, msg, args...) { + t.FailNow() + } +} + +// NoError asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if assert.NoError(t, err) { +// assert.Equal(t, expectedObj, actualObj) +// } +func NoError(t TestingT, err error, msgAndArgs ...interface{}) { + if !assert.NoError(t, err, msgAndArgs...) { + t.FailNow() + } +} + +// NoErrorf asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if assert.NoErrorf(t, err, "error message %s", "formatted") { +// assert.Equal(t, expectedObj, actualObj) +// } +func NoErrorf(t TestingT, err error, msg string, args ...interface{}) { + if !assert.NoErrorf(t, err, msg, args...) { + t.FailNow() + } +} + +// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// assert.NotContains(t, "Hello World", "Earth") +// assert.NotContains(t, ["Hello", "World"], "Earth") +// assert.NotContains(t, {"Hello": "World"}, "Earth") +func NotContains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...interface{}) { + if !assert.NotContains(t, s, contains, msgAndArgs...) { + t.FailNow() + } +} + +// NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// assert.NotContainsf(t, "Hello World", "Earth", "error message %s", "formatted") +// assert.NotContainsf(t, ["Hello", "World"], "Earth", "error message %s", "formatted") +// assert.NotContainsf(t, {"Hello": "World"}, "Earth", "error message %s", "formatted") +func NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) { + if !assert.NotContainsf(t, s, contains, msg, args...) { + t.FailNow() + } +} + +// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if assert.NotEmpty(t, obj) { +// assert.Equal(t, "two", obj[1]) +// } +func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) { + if !assert.NotEmpty(t, object, msgAndArgs...) { + t.FailNow() + } +} + +// NotEmptyf asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if assert.NotEmptyf(t, obj, "error message %s", "formatted") { +// assert.Equal(t, "two", obj[1]) +// } +func NotEmptyf(t TestingT, object interface{}, msg string, args ...interface{}) { + if !assert.NotEmptyf(t, object, msg, args...) { + t.FailNow() + } +} + +// NotEqual asserts that the specified values are NOT equal. +// +// assert.NotEqual(t, obj1, obj2) +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func NotEqual(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if !assert.NotEqual(t, expected, actual, msgAndArgs...) { + t.FailNow() + } +} + +// NotEqualf asserts that the specified values are NOT equal. +// +// assert.NotEqualf(t, obj1, obj2, "error message %s", "formatted") +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func NotEqualf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { + if !assert.NotEqualf(t, expected, actual, msg, args...) { + t.FailNow() + } +} + +// NotNil asserts that the specified object is not nil. +// +// assert.NotNil(t, err) +func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) { + if !assert.NotNil(t, object, msgAndArgs...) { + t.FailNow() + } +} + +// NotNilf asserts that the specified object is not nil. +// +// assert.NotNilf(t, err, "error message %s", "formatted") +func NotNilf(t TestingT, object interface{}, msg string, args ...interface{}) { + if !assert.NotNilf(t, object, msg, args...) { + t.FailNow() + } +} + +// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// assert.NotPanics(t, func(){ RemainCalm() }) +func NotPanics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) { + if !assert.NotPanics(t, f, msgAndArgs...) { + t.FailNow() + } +} + +// NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// assert.NotPanicsf(t, func(){ RemainCalm() }, "error message %s", "formatted") +func NotPanicsf(t TestingT, f assert.PanicTestFunc, msg string, args ...interface{}) { + if !assert.NotPanicsf(t, f, msg, args...) { + t.FailNow() + } +} + +// NotRegexp asserts that a specified regexp does not match a string. +// +// assert.NotRegexp(t, regexp.MustCompile("starts"), "it's starting") +// assert.NotRegexp(t, "^start", "it's not starting") +func NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) { + if !assert.NotRegexp(t, rx, str, msgAndArgs...) { + t.FailNow() + } +} + +// NotRegexpf asserts that a specified regexp does not match a string. +// +// assert.NotRegexpf(t, regexp.MustCompile("starts", "error message %s", "formatted"), "it's starting") +// assert.NotRegexpf(t, "^start", "it's not starting", "error message %s", "formatted") +func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) { + if !assert.NotRegexpf(t, rx, str, msg, args...) { + t.FailNow() + } +} + +// NotSubset asserts that the specified list(array, slice...) contains not all +// elements given in the specified subset(array, slice...). +// +// assert.NotSubset(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]") +func NotSubset(t TestingT, list interface{}, subset interface{}, msgAndArgs ...interface{}) { + if !assert.NotSubset(t, list, subset, msgAndArgs...) { + t.FailNow() + } +} + +// NotSubsetf asserts that the specified list(array, slice...) contains not all +// elements given in the specified subset(array, slice...). +// +// assert.NotSubsetf(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted") +func NotSubsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) { + if !assert.NotSubsetf(t, list, subset, msg, args...) { + t.FailNow() + } +} + +// NotZero asserts that i is not the zero value for its type. +func NotZero(t TestingT, i interface{}, msgAndArgs ...interface{}) { + if !assert.NotZero(t, i, msgAndArgs...) { + t.FailNow() + } +} + +// NotZerof asserts that i is not the zero value for its type. +func NotZerof(t TestingT, i interface{}, msg string, args ...interface{}) { + if !assert.NotZerof(t, i, msg, args...) { + t.FailNow() + } +} + +// Panics asserts that the code inside the specified PanicTestFunc panics. +// +// assert.Panics(t, func(){ GoCrazy() }) +func Panics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) { + if !assert.Panics(t, f, msgAndArgs...) { + t.FailNow() + } +} + +// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// assert.PanicsWithValue(t, "crazy error", func(){ GoCrazy() }) +func PanicsWithValue(t TestingT, expected interface{}, f assert.PanicTestFunc, msgAndArgs ...interface{}) { + if !assert.PanicsWithValue(t, expected, f, msgAndArgs...) { + t.FailNow() + } +} + +// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// assert.PanicsWithValuef(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +func PanicsWithValuef(t TestingT, expected interface{}, f assert.PanicTestFunc, msg string, args ...interface{}) { + if !assert.PanicsWithValuef(t, expected, f, msg, args...) { + t.FailNow() + } +} + +// Panicsf asserts that the code inside the specified PanicTestFunc panics. +// +// assert.Panicsf(t, func(){ GoCrazy() }, "error message %s", "formatted") +func Panicsf(t TestingT, f assert.PanicTestFunc, msg string, args ...interface{}) { + if !assert.Panicsf(t, f, msg, args...) { + t.FailNow() + } +} + +// Regexp asserts that a specified regexp matches a string. +// +// assert.Regexp(t, regexp.MustCompile("start"), "it's starting") +// assert.Regexp(t, "start...$", "it's not starting") +func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) { + if !assert.Regexp(t, rx, str, msgAndArgs...) { + t.FailNow() + } +} + +// Regexpf asserts that a specified regexp matches a string. +// +// assert.Regexpf(t, regexp.MustCompile("start", "error message %s", "formatted"), "it's starting") +// assert.Regexpf(t, "start...$", "it's not starting", "error message %s", "formatted") +func Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) { + if !assert.Regexpf(t, rx, str, msg, args...) { + t.FailNow() + } +} + +// Subset asserts that the specified list(array, slice...) contains all +// elements given in the specified subset(array, slice...). +// +// assert.Subset(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]") +func Subset(t TestingT, list interface{}, subset interface{}, msgAndArgs ...interface{}) { + if !assert.Subset(t, list, subset, msgAndArgs...) { + t.FailNow() + } +} + +// Subsetf asserts that the specified list(array, slice...) contains all +// elements given in the specified subset(array, slice...). +// +// assert.Subsetf(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted") +func Subsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) { + if !assert.Subsetf(t, list, subset, msg, args...) { + t.FailNow() + } +} + +// True asserts that the specified value is true. +// +// assert.True(t, myBool) +func True(t TestingT, value bool, msgAndArgs ...interface{}) { + if !assert.True(t, value, msgAndArgs...) { + t.FailNow() + } +} + +// Truef asserts that the specified value is true. +// +// assert.Truef(t, myBool, "error message %s", "formatted") +func Truef(t TestingT, value bool, msg string, args ...interface{}) { + if !assert.Truef(t, value, msg, args...) { + t.FailNow() + } +} + +// WithinDuration asserts that the two times are within duration delta of each other. +// +// assert.WithinDuration(t, time.Now(), time.Now(), 10*time.Second) +func WithinDuration(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) { + if !assert.WithinDuration(t, expected, actual, delta, msgAndArgs...) { + t.FailNow() + } +} + +// WithinDurationf asserts that the two times are within duration delta of each other. +// +// assert.WithinDurationf(t, time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted") +func WithinDurationf(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) { + if !assert.WithinDurationf(t, expected, actual, delta, msg, args...) { + t.FailNow() + } +} + +// Zero asserts that i is the zero value for its type. +func Zero(t TestingT, i interface{}, msgAndArgs ...interface{}) { + if !assert.Zero(t, i, msgAndArgs...) { + t.FailNow() + } +} + +// Zerof asserts that i is the zero value for its type. +func Zerof(t TestingT, i interface{}, msg string, args ...interface{}) { + if !assert.Zerof(t, i, msg, args...) { + t.FailNow() + } +} diff --git a/api/vendor/github.com/stretchr/testify/require/require.go.tmpl b/api/vendor/github.com/stretchr/testify/require/require.go.tmpl new file mode 100644 index 0000000..d2c38f6 --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/require/require.go.tmpl @@ -0,0 +1,6 @@ +{{.Comment}} +func {{.DocInfo.Name}}(t TestingT, {{.Params}}) { + if !assert.{{.DocInfo.Name}}(t, {{.ForwardedParams}}) { + t.FailNow() + } +} diff --git a/api/vendor/github.com/stretchr/testify/require/require_forward.go b/api/vendor/github.com/stretchr/testify/require/require_forward.go new file mode 100644 index 0000000..299ceb9 --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/require/require_forward.go @@ -0,0 +1,687 @@ +/* +* CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen +* THIS FILE MUST NOT BE EDITED BY HAND + */ + +package require + +import ( + assert "github.com/stretchr/testify/assert" + http "net/http" + url "net/url" + time "time" +) + +// Condition uses a Comparison to assert a complex condition. +func (a *Assertions) Condition(comp assert.Comparison, msgAndArgs ...interface{}) { + Condition(a.t, comp, msgAndArgs...) +} + +// Conditionf uses a Comparison to assert a complex condition. +func (a *Assertions) Conditionf(comp assert.Comparison, msg string, args ...interface{}) { + Conditionf(a.t, comp, msg, args...) +} + +// Contains asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// a.Contains("Hello World", "World") +// a.Contains(["Hello", "World"], "World") +// a.Contains({"Hello": "World"}, "Hello") +func (a *Assertions) Contains(s interface{}, contains interface{}, msgAndArgs ...interface{}) { + Contains(a.t, s, contains, msgAndArgs...) +} + +// Containsf asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// a.Containsf("Hello World", "World", "error message %s", "formatted") +// a.Containsf(["Hello", "World"], "World", "error message %s", "formatted") +// a.Containsf({"Hello": "World"}, "Hello", "error message %s", "formatted") +func (a *Assertions) Containsf(s interface{}, contains interface{}, msg string, args ...interface{}) { + Containsf(a.t, s, contains, msg, args...) +} + +// DirExists checks whether a directory exists in the given path. It also fails if the path is a file rather a directory or there is an error checking whether it exists. +func (a *Assertions) DirExists(path string, msgAndArgs ...interface{}) { + DirExists(a.t, path, msgAndArgs...) +} + +// DirExistsf checks whether a directory exists in the given path. It also fails if the path is a file rather a directory or there is an error checking whether it exists. +func (a *Assertions) DirExistsf(path string, msg string, args ...interface{}) { + DirExistsf(a.t, path, msg, args...) +} + +// ElementsMatch asserts that the specified listA(array, slice...) is equal to specified +// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, +// the number of appearances of each of them in both lists should match. +// +// a.ElementsMatch([1, 3, 2, 3], [1, 3, 3, 2]) +func (a *Assertions) ElementsMatch(listA interface{}, listB interface{}, msgAndArgs ...interface{}) { + ElementsMatch(a.t, listA, listB, msgAndArgs...) +} + +// ElementsMatchf asserts that the specified listA(array, slice...) is equal to specified +// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, +// the number of appearances of each of them in both lists should match. +// +// a.ElementsMatchf([1, 3, 2, 3], [1, 3, 3, 2], "error message %s", "formatted") +func (a *Assertions) ElementsMatchf(listA interface{}, listB interface{}, msg string, args ...interface{}) { + ElementsMatchf(a.t, listA, listB, msg, args...) +} + +// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// a.Empty(obj) +func (a *Assertions) Empty(object interface{}, msgAndArgs ...interface{}) { + Empty(a.t, object, msgAndArgs...) +} + +// Emptyf asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// a.Emptyf(obj, "error message %s", "formatted") +func (a *Assertions) Emptyf(object interface{}, msg string, args ...interface{}) { + Emptyf(a.t, object, msg, args...) +} + +// Equal asserts that two objects are equal. +// +// a.Equal(123, 123) +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func (a *Assertions) Equal(expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + Equal(a.t, expected, actual, msgAndArgs...) +} + +// EqualError asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// a.EqualError(err, expectedErrorString) +func (a *Assertions) EqualError(theError error, errString string, msgAndArgs ...interface{}) { + EqualError(a.t, theError, errString, msgAndArgs...) +} + +// EqualErrorf asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// a.EqualErrorf(err, expectedErrorString, "error message %s", "formatted") +func (a *Assertions) EqualErrorf(theError error, errString string, msg string, args ...interface{}) { + EqualErrorf(a.t, theError, errString, msg, args...) +} + +// EqualValues asserts that two objects are equal or convertable to the same types +// and equal. +// +// a.EqualValues(uint32(123), int32(123)) +func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + EqualValues(a.t, expected, actual, msgAndArgs...) +} + +// EqualValuesf asserts that two objects are equal or convertable to the same types +// and equal. +// +// a.EqualValuesf(uint32(123, "error message %s", "formatted"), int32(123)) +func (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) { + EqualValuesf(a.t, expected, actual, msg, args...) +} + +// Equalf asserts that two objects are equal. +// +// a.Equalf(123, 123, "error message %s", "formatted") +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func (a *Assertions) Equalf(expected interface{}, actual interface{}, msg string, args ...interface{}) { + Equalf(a.t, expected, actual, msg, args...) +} + +// Error asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if a.Error(err) { +// assert.Equal(t, expectedError, err) +// } +func (a *Assertions) Error(err error, msgAndArgs ...interface{}) { + Error(a.t, err, msgAndArgs...) +} + +// Errorf asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if a.Errorf(err, "error message %s", "formatted") { +// assert.Equal(t, expectedErrorf, err) +// } +func (a *Assertions) Errorf(err error, msg string, args ...interface{}) { + Errorf(a.t, err, msg, args...) +} + +// Exactly asserts that two objects are equal in value and type. +// +// a.Exactly(int32(123), int64(123)) +func (a *Assertions) Exactly(expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + Exactly(a.t, expected, actual, msgAndArgs...) +} + +// Exactlyf asserts that two objects are equal in value and type. +// +// a.Exactlyf(int32(123, "error message %s", "formatted"), int64(123)) +func (a *Assertions) Exactlyf(expected interface{}, actual interface{}, msg string, args ...interface{}) { + Exactlyf(a.t, expected, actual, msg, args...) +} + +// Fail reports a failure through +func (a *Assertions) Fail(failureMessage string, msgAndArgs ...interface{}) { + Fail(a.t, failureMessage, msgAndArgs...) +} + +// FailNow fails test +func (a *Assertions) FailNow(failureMessage string, msgAndArgs ...interface{}) { + FailNow(a.t, failureMessage, msgAndArgs...) +} + +// FailNowf fails test +func (a *Assertions) FailNowf(failureMessage string, msg string, args ...interface{}) { + FailNowf(a.t, failureMessage, msg, args...) +} + +// Failf reports a failure through +func (a *Assertions) Failf(failureMessage string, msg string, args ...interface{}) { + Failf(a.t, failureMessage, msg, args...) +} + +// False asserts that the specified value is false. +// +// a.False(myBool) +func (a *Assertions) False(value bool, msgAndArgs ...interface{}) { + False(a.t, value, msgAndArgs...) +} + +// Falsef asserts that the specified value is false. +// +// a.Falsef(myBool, "error message %s", "formatted") +func (a *Assertions) Falsef(value bool, msg string, args ...interface{}) { + Falsef(a.t, value, msg, args...) +} + +// FileExists checks whether a file exists in the given path. It also fails if the path points to a directory or there is an error when trying to check the file. +func (a *Assertions) FileExists(path string, msgAndArgs ...interface{}) { + FileExists(a.t, path, msgAndArgs...) +} + +// FileExistsf checks whether a file exists in the given path. It also fails if the path points to a directory or there is an error when trying to check the file. +func (a *Assertions) FileExistsf(path string, msg string, args ...interface{}) { + FileExistsf(a.t, path, msg, args...) +} + +// HTTPBodyContains asserts that a specified handler returns a +// body that contains a string. +// +// a.HTTPBodyContains(myHandler, "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) { + HTTPBodyContains(a.t, handler, method, url, values, str, msgAndArgs...) +} + +// HTTPBodyContainsf asserts that a specified handler returns a +// body that contains a string. +// +// a.HTTPBodyContainsf(myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) { + HTTPBodyContainsf(a.t, handler, method, url, values, str, msg, args...) +} + +// HTTPBodyNotContains asserts that a specified handler returns a +// body that does not contain a string. +// +// a.HTTPBodyNotContains(myHandler, "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyNotContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) { + HTTPBodyNotContains(a.t, handler, method, url, values, str, msgAndArgs...) +} + +// HTTPBodyNotContainsf asserts that a specified handler returns a +// body that does not contain a string. +// +// a.HTTPBodyNotContainsf(myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyNotContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) { + HTTPBodyNotContainsf(a.t, handler, method, url, values, str, msg, args...) +} + +// HTTPError asserts that a specified handler returns an error status code. +// +// a.HTTPError(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) { + HTTPError(a.t, handler, method, url, values, msgAndArgs...) +} + +// HTTPErrorf asserts that a specified handler returns an error status code. +// +// a.HTTPErrorf(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +func (a *Assertions) HTTPErrorf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) { + HTTPErrorf(a.t, handler, method, url, values, msg, args...) +} + +// HTTPRedirect asserts that a specified handler returns a redirect status code. +// +// a.HTTPRedirect(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) { + HTTPRedirect(a.t, handler, method, url, values, msgAndArgs...) +} + +// HTTPRedirectf asserts that a specified handler returns a redirect status code. +// +// a.HTTPRedirectf(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +func (a *Assertions) HTTPRedirectf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) { + HTTPRedirectf(a.t, handler, method, url, values, msg, args...) +} + +// HTTPSuccess asserts that a specified handler returns a success status code. +// +// a.HTTPSuccess(myHandler, "POST", "http://www.google.com", nil) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPSuccess(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) { + HTTPSuccess(a.t, handler, method, url, values, msgAndArgs...) +} + +// HTTPSuccessf asserts that a specified handler returns a success status code. +// +// a.HTTPSuccessf(myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPSuccessf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) { + HTTPSuccessf(a.t, handler, method, url, values, msg, args...) +} + +// Implements asserts that an object is implemented by the specified interface. +// +// a.Implements((*MyInterface)(nil), new(MyObject)) +func (a *Assertions) Implements(interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) { + Implements(a.t, interfaceObject, object, msgAndArgs...) +} + +// Implementsf asserts that an object is implemented by the specified interface. +// +// a.Implementsf((*MyInterface, "error message %s", "formatted")(nil), new(MyObject)) +func (a *Assertions) Implementsf(interfaceObject interface{}, object interface{}, msg string, args ...interface{}) { + Implementsf(a.t, interfaceObject, object, msg, args...) +} + +// InDelta asserts that the two numerals are within delta of each other. +// +// a.InDelta(math.Pi, (22 / 7.0), 0.01) +func (a *Assertions) InDelta(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) { + InDelta(a.t, expected, actual, delta, msgAndArgs...) +} + +// InDeltaMapValues is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys. +func (a *Assertions) InDeltaMapValues(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) { + InDeltaMapValues(a.t, expected, actual, delta, msgAndArgs...) +} + +// InDeltaMapValuesf is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys. +func (a *Assertions) InDeltaMapValuesf(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) { + InDeltaMapValuesf(a.t, expected, actual, delta, msg, args...) +} + +// InDeltaSlice is the same as InDelta, except it compares two slices. +func (a *Assertions) InDeltaSlice(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) { + InDeltaSlice(a.t, expected, actual, delta, msgAndArgs...) +} + +// InDeltaSlicef is the same as InDelta, except it compares two slices. +func (a *Assertions) InDeltaSlicef(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) { + InDeltaSlicef(a.t, expected, actual, delta, msg, args...) +} + +// InDeltaf asserts that the two numerals are within delta of each other. +// +// a.InDeltaf(math.Pi, (22 / 7.0, "error message %s", "formatted"), 0.01) +func (a *Assertions) InDeltaf(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) { + InDeltaf(a.t, expected, actual, delta, msg, args...) +} + +// InEpsilon asserts that expected and actual have a relative error less than epsilon +func (a *Assertions) InEpsilon(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) { + InEpsilon(a.t, expected, actual, epsilon, msgAndArgs...) +} + +// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices. +func (a *Assertions) InEpsilonSlice(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) { + InEpsilonSlice(a.t, expected, actual, epsilon, msgAndArgs...) +} + +// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices. +func (a *Assertions) InEpsilonSlicef(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) { + InEpsilonSlicef(a.t, expected, actual, epsilon, msg, args...) +} + +// InEpsilonf asserts that expected and actual have a relative error less than epsilon +func (a *Assertions) InEpsilonf(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) { + InEpsilonf(a.t, expected, actual, epsilon, msg, args...) +} + +// IsType asserts that the specified objects are of the same type. +func (a *Assertions) IsType(expectedType interface{}, object interface{}, msgAndArgs ...interface{}) { + IsType(a.t, expectedType, object, msgAndArgs...) +} + +// IsTypef asserts that the specified objects are of the same type. +func (a *Assertions) IsTypef(expectedType interface{}, object interface{}, msg string, args ...interface{}) { + IsTypef(a.t, expectedType, object, msg, args...) +} + +// JSONEq asserts that two JSON strings are equivalent. +// +// a.JSONEq(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) +func (a *Assertions) JSONEq(expected string, actual string, msgAndArgs ...interface{}) { + JSONEq(a.t, expected, actual, msgAndArgs...) +} + +// JSONEqf asserts that two JSON strings are equivalent. +// +// a.JSONEqf(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted") +func (a *Assertions) JSONEqf(expected string, actual string, msg string, args ...interface{}) { + JSONEqf(a.t, expected, actual, msg, args...) +} + +// Len asserts that the specified object has specific length. +// Len also fails if the object has a type that len() not accept. +// +// a.Len(mySlice, 3) +func (a *Assertions) Len(object interface{}, length int, msgAndArgs ...interface{}) { + Len(a.t, object, length, msgAndArgs...) +} + +// Lenf asserts that the specified object has specific length. +// Lenf also fails if the object has a type that len() not accept. +// +// a.Lenf(mySlice, 3, "error message %s", "formatted") +func (a *Assertions) Lenf(object interface{}, length int, msg string, args ...interface{}) { + Lenf(a.t, object, length, msg, args...) +} + +// Nil asserts that the specified object is nil. +// +// a.Nil(err) +func (a *Assertions) Nil(object interface{}, msgAndArgs ...interface{}) { + Nil(a.t, object, msgAndArgs...) +} + +// Nilf asserts that the specified object is nil. +// +// a.Nilf(err, "error message %s", "formatted") +func (a *Assertions) Nilf(object interface{}, msg string, args ...interface{}) { + Nilf(a.t, object, msg, args...) +} + +// NoError asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if a.NoError(err) { +// assert.Equal(t, expectedObj, actualObj) +// } +func (a *Assertions) NoError(err error, msgAndArgs ...interface{}) { + NoError(a.t, err, msgAndArgs...) +} + +// NoErrorf asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if a.NoErrorf(err, "error message %s", "formatted") { +// assert.Equal(t, expectedObj, actualObj) +// } +func (a *Assertions) NoErrorf(err error, msg string, args ...interface{}) { + NoErrorf(a.t, err, msg, args...) +} + +// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// a.NotContains("Hello World", "Earth") +// a.NotContains(["Hello", "World"], "Earth") +// a.NotContains({"Hello": "World"}, "Earth") +func (a *Assertions) NotContains(s interface{}, contains interface{}, msgAndArgs ...interface{}) { + NotContains(a.t, s, contains, msgAndArgs...) +} + +// NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// a.NotContainsf("Hello World", "Earth", "error message %s", "formatted") +// a.NotContainsf(["Hello", "World"], "Earth", "error message %s", "formatted") +// a.NotContainsf({"Hello": "World"}, "Earth", "error message %s", "formatted") +func (a *Assertions) NotContainsf(s interface{}, contains interface{}, msg string, args ...interface{}) { + NotContainsf(a.t, s, contains, msg, args...) +} + +// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if a.NotEmpty(obj) { +// assert.Equal(t, "two", obj[1]) +// } +func (a *Assertions) NotEmpty(object interface{}, msgAndArgs ...interface{}) { + NotEmpty(a.t, object, msgAndArgs...) +} + +// NotEmptyf asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if a.NotEmptyf(obj, "error message %s", "formatted") { +// assert.Equal(t, "two", obj[1]) +// } +func (a *Assertions) NotEmptyf(object interface{}, msg string, args ...interface{}) { + NotEmptyf(a.t, object, msg, args...) +} + +// NotEqual asserts that the specified values are NOT equal. +// +// a.NotEqual(obj1, obj2) +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func (a *Assertions) NotEqual(expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + NotEqual(a.t, expected, actual, msgAndArgs...) +} + +// NotEqualf asserts that the specified values are NOT equal. +// +// a.NotEqualf(obj1, obj2, "error message %s", "formatted") +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func (a *Assertions) NotEqualf(expected interface{}, actual interface{}, msg string, args ...interface{}) { + NotEqualf(a.t, expected, actual, msg, args...) +} + +// NotNil asserts that the specified object is not nil. +// +// a.NotNil(err) +func (a *Assertions) NotNil(object interface{}, msgAndArgs ...interface{}) { + NotNil(a.t, object, msgAndArgs...) +} + +// NotNilf asserts that the specified object is not nil. +// +// a.NotNilf(err, "error message %s", "formatted") +func (a *Assertions) NotNilf(object interface{}, msg string, args ...interface{}) { + NotNilf(a.t, object, msg, args...) +} + +// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// a.NotPanics(func(){ RemainCalm() }) +func (a *Assertions) NotPanics(f assert.PanicTestFunc, msgAndArgs ...interface{}) { + NotPanics(a.t, f, msgAndArgs...) +} + +// NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// a.NotPanicsf(func(){ RemainCalm() }, "error message %s", "formatted") +func (a *Assertions) NotPanicsf(f assert.PanicTestFunc, msg string, args ...interface{}) { + NotPanicsf(a.t, f, msg, args...) +} + +// NotRegexp asserts that a specified regexp does not match a string. +// +// a.NotRegexp(regexp.MustCompile("starts"), "it's starting") +// a.NotRegexp("^start", "it's not starting") +func (a *Assertions) NotRegexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) { + NotRegexp(a.t, rx, str, msgAndArgs...) +} + +// NotRegexpf asserts that a specified regexp does not match a string. +// +// a.NotRegexpf(regexp.MustCompile("starts", "error message %s", "formatted"), "it's starting") +// a.NotRegexpf("^start", "it's not starting", "error message %s", "formatted") +func (a *Assertions) NotRegexpf(rx interface{}, str interface{}, msg string, args ...interface{}) { + NotRegexpf(a.t, rx, str, msg, args...) +} + +// NotSubset asserts that the specified list(array, slice...) contains not all +// elements given in the specified subset(array, slice...). +// +// a.NotSubset([1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]") +func (a *Assertions) NotSubset(list interface{}, subset interface{}, msgAndArgs ...interface{}) { + NotSubset(a.t, list, subset, msgAndArgs...) +} + +// NotSubsetf asserts that the specified list(array, slice...) contains not all +// elements given in the specified subset(array, slice...). +// +// a.NotSubsetf([1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted") +func (a *Assertions) NotSubsetf(list interface{}, subset interface{}, msg string, args ...interface{}) { + NotSubsetf(a.t, list, subset, msg, args...) +} + +// NotZero asserts that i is not the zero value for its type. +func (a *Assertions) NotZero(i interface{}, msgAndArgs ...interface{}) { + NotZero(a.t, i, msgAndArgs...) +} + +// NotZerof asserts that i is not the zero value for its type. +func (a *Assertions) NotZerof(i interface{}, msg string, args ...interface{}) { + NotZerof(a.t, i, msg, args...) +} + +// Panics asserts that the code inside the specified PanicTestFunc panics. +// +// a.Panics(func(){ GoCrazy() }) +func (a *Assertions) Panics(f assert.PanicTestFunc, msgAndArgs ...interface{}) { + Panics(a.t, f, msgAndArgs...) +} + +// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// a.PanicsWithValue("crazy error", func(){ GoCrazy() }) +func (a *Assertions) PanicsWithValue(expected interface{}, f assert.PanicTestFunc, msgAndArgs ...interface{}) { + PanicsWithValue(a.t, expected, f, msgAndArgs...) +} + +// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// a.PanicsWithValuef("crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +func (a *Assertions) PanicsWithValuef(expected interface{}, f assert.PanicTestFunc, msg string, args ...interface{}) { + PanicsWithValuef(a.t, expected, f, msg, args...) +} + +// Panicsf asserts that the code inside the specified PanicTestFunc panics. +// +// a.Panicsf(func(){ GoCrazy() }, "error message %s", "formatted") +func (a *Assertions) Panicsf(f assert.PanicTestFunc, msg string, args ...interface{}) { + Panicsf(a.t, f, msg, args...) +} + +// Regexp asserts that a specified regexp matches a string. +// +// a.Regexp(regexp.MustCompile("start"), "it's starting") +// a.Regexp("start...$", "it's not starting") +func (a *Assertions) Regexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) { + Regexp(a.t, rx, str, msgAndArgs...) +} + +// Regexpf asserts that a specified regexp matches a string. +// +// a.Regexpf(regexp.MustCompile("start", "error message %s", "formatted"), "it's starting") +// a.Regexpf("start...$", "it's not starting", "error message %s", "formatted") +func (a *Assertions) Regexpf(rx interface{}, str interface{}, msg string, args ...interface{}) { + Regexpf(a.t, rx, str, msg, args...) +} + +// Subset asserts that the specified list(array, slice...) contains all +// elements given in the specified subset(array, slice...). +// +// a.Subset([1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]") +func (a *Assertions) Subset(list interface{}, subset interface{}, msgAndArgs ...interface{}) { + Subset(a.t, list, subset, msgAndArgs...) +} + +// Subsetf asserts that the specified list(array, slice...) contains all +// elements given in the specified subset(array, slice...). +// +// a.Subsetf([1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted") +func (a *Assertions) Subsetf(list interface{}, subset interface{}, msg string, args ...interface{}) { + Subsetf(a.t, list, subset, msg, args...) +} + +// True asserts that the specified value is true. +// +// a.True(myBool) +func (a *Assertions) True(value bool, msgAndArgs ...interface{}) { + True(a.t, value, msgAndArgs...) +} + +// Truef asserts that the specified value is true. +// +// a.Truef(myBool, "error message %s", "formatted") +func (a *Assertions) Truef(value bool, msg string, args ...interface{}) { + Truef(a.t, value, msg, args...) +} + +// WithinDuration asserts that the two times are within duration delta of each other. +// +// a.WithinDuration(time.Now(), time.Now(), 10*time.Second) +func (a *Assertions) WithinDuration(expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) { + WithinDuration(a.t, expected, actual, delta, msgAndArgs...) +} + +// WithinDurationf asserts that the two times are within duration delta of each other. +// +// a.WithinDurationf(time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted") +func (a *Assertions) WithinDurationf(expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) { + WithinDurationf(a.t, expected, actual, delta, msg, args...) +} + +// Zero asserts that i is the zero value for its type. +func (a *Assertions) Zero(i interface{}, msgAndArgs ...interface{}) { + Zero(a.t, i, msgAndArgs...) +} + +// Zerof asserts that i is the zero value for its type. +func (a *Assertions) Zerof(i interface{}, msg string, args ...interface{}) { + Zerof(a.t, i, msg, args...) +} diff --git a/api/vendor/github.com/stretchr/testify/require/require_forward.go.tmpl b/api/vendor/github.com/stretchr/testify/require/require_forward.go.tmpl new file mode 100644 index 0000000..b93569e --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/require/require_forward.go.tmpl @@ -0,0 +1,4 @@ +{{.CommentWithoutT "a"}} +func (a *Assertions) {{.DocInfo.Name}}({{.Params}}) { + {{.DocInfo.Name}}(a.t, {{.ForwardedParams}}) +} diff --git a/api/vendor/github.com/stretchr/testify/require/requirements.go b/api/vendor/github.com/stretchr/testify/require/requirements.go new file mode 100644 index 0000000..e404f01 --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/require/requirements.go @@ -0,0 +1,9 @@ +package require + +// TestingT is an interface wrapper around *testing.T +type TestingT interface { + Errorf(format string, args ...interface{}) + FailNow() +} + +//go:generate go run ../_codegen/main.go -output-package=require -template=require.go.tmpl -include-format-funcs diff --git a/api/vendor/github.com/stretchr/testify/require/requirements_test.go b/api/vendor/github.com/stretchr/testify/require/requirements_test.go new file mode 100644 index 0000000..d2ccc99 --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/require/requirements_test.go @@ -0,0 +1,369 @@ +package require + +import ( + "errors" + "testing" + "time" +) + +// AssertionTesterInterface defines an interface to be used for testing assertion methods +type AssertionTesterInterface interface { + TestMethod() +} + +// AssertionTesterConformingObject is an object that conforms to the AssertionTesterInterface interface +type AssertionTesterConformingObject struct { +} + +func (a *AssertionTesterConformingObject) TestMethod() { +} + +// AssertionTesterNonConformingObject is an object that does not conform to the AssertionTesterInterface interface +type AssertionTesterNonConformingObject struct { +} + +type MockT struct { + Failed bool +} + +func (t *MockT) FailNow() { + t.Failed = true +} + +func (t *MockT) Errorf(format string, args ...interface{}) { + _, _ = format, args +} + +func TestImplements(t *testing.T) { + + Implements(t, (*AssertionTesterInterface)(nil), new(AssertionTesterConformingObject)) + + mockT := new(MockT) + Implements(mockT, (*AssertionTesterInterface)(nil), new(AssertionTesterNonConformingObject)) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestIsType(t *testing.T) { + + IsType(t, new(AssertionTesterConformingObject), new(AssertionTesterConformingObject)) + + mockT := new(MockT) + IsType(mockT, new(AssertionTesterConformingObject), new(AssertionTesterNonConformingObject)) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestEqual(t *testing.T) { + + Equal(t, 1, 1) + + mockT := new(MockT) + Equal(mockT, 1, 2) + if !mockT.Failed { + t.Error("Check should fail") + } + +} + +func TestNotEqual(t *testing.T) { + + NotEqual(t, 1, 2) + mockT := new(MockT) + NotEqual(mockT, 2, 2) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestExactly(t *testing.T) { + + a := float32(1) + b := float32(1) + c := float64(1) + + Exactly(t, a, b) + + mockT := new(MockT) + Exactly(mockT, a, c) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestNotNil(t *testing.T) { + + NotNil(t, new(AssertionTesterConformingObject)) + + mockT := new(MockT) + NotNil(mockT, nil) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestNil(t *testing.T) { + + Nil(t, nil) + + mockT := new(MockT) + Nil(mockT, new(AssertionTesterConformingObject)) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestTrue(t *testing.T) { + + True(t, true) + + mockT := new(MockT) + True(mockT, false) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestFalse(t *testing.T) { + + False(t, false) + + mockT := new(MockT) + False(mockT, true) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestContains(t *testing.T) { + + Contains(t, "Hello World", "Hello") + + mockT := new(MockT) + Contains(mockT, "Hello World", "Salut") + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestNotContains(t *testing.T) { + + NotContains(t, "Hello World", "Hello!") + + mockT := new(MockT) + NotContains(mockT, "Hello World", "Hello") + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestPanics(t *testing.T) { + + Panics(t, func() { + panic("Panic!") + }) + + mockT := new(MockT) + Panics(mockT, func() {}) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestNotPanics(t *testing.T) { + + NotPanics(t, func() {}) + + mockT := new(MockT) + NotPanics(mockT, func() { + panic("Panic!") + }) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestNoError(t *testing.T) { + + NoError(t, nil) + + mockT := new(MockT) + NoError(mockT, errors.New("some error")) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestError(t *testing.T) { + + Error(t, errors.New("some error")) + + mockT := new(MockT) + Error(mockT, nil) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestEqualError(t *testing.T) { + + EqualError(t, errors.New("some error"), "some error") + + mockT := new(MockT) + EqualError(mockT, errors.New("some error"), "Not some error") + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestEmpty(t *testing.T) { + + Empty(t, "") + + mockT := new(MockT) + Empty(mockT, "x") + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestNotEmpty(t *testing.T) { + + NotEmpty(t, "x") + + mockT := new(MockT) + NotEmpty(mockT, "") + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestWithinDuration(t *testing.T) { + + a := time.Now() + b := a.Add(10 * time.Second) + + WithinDuration(t, a, b, 15*time.Second) + + mockT := new(MockT) + WithinDuration(mockT, a, b, 5*time.Second) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestInDelta(t *testing.T) { + + InDelta(t, 1.001, 1, 0.01) + + mockT := new(MockT) + InDelta(mockT, 1, 2, 0.5) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestZero(t *testing.T) { + + Zero(t, "") + + mockT := new(MockT) + Zero(mockT, "x") + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestNotZero(t *testing.T) { + + NotZero(t, "x") + + mockT := new(MockT) + NotZero(mockT, "") + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestJSONEq_EqualSONString(t *testing.T) { + mockT := new(MockT) + JSONEq(mockT, `{"hello": "world", "foo": "bar"}`, `{"hello": "world", "foo": "bar"}`) + if mockT.Failed { + t.Error("Check should pass") + } +} + +func TestJSONEq_EquivalentButNotEqual(t *testing.T) { + mockT := new(MockT) + JSONEq(mockT, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) + if mockT.Failed { + t.Error("Check should pass") + } +} + +func TestJSONEq_HashOfArraysAndHashes(t *testing.T) { + mockT := new(MockT) + JSONEq(mockT, "{\r\n\t\"numeric\": 1.5,\r\n\t\"array\": [{\"foo\": \"bar\"}, 1, \"string\", [\"nested\", \"array\", 5.5]],\r\n\t\"hash\": {\"nested\": \"hash\", \"nested_slice\": [\"this\", \"is\", \"nested\"]},\r\n\t\"string\": \"foo\"\r\n}", + "{\r\n\t\"numeric\": 1.5,\r\n\t\"hash\": {\"nested\": \"hash\", \"nested_slice\": [\"this\", \"is\", \"nested\"]},\r\n\t\"string\": \"foo\",\r\n\t\"array\": [{\"foo\": \"bar\"}, 1, \"string\", [\"nested\", \"array\", 5.5]]\r\n}") + if mockT.Failed { + t.Error("Check should pass") + } +} + +func TestJSONEq_Array(t *testing.T) { + mockT := new(MockT) + JSONEq(mockT, `["foo", {"hello": "world", "nested": "hash"}]`, `["foo", {"nested": "hash", "hello": "world"}]`) + if mockT.Failed { + t.Error("Check should pass") + } +} + +func TestJSONEq_HashAndArrayNotEquivalent(t *testing.T) { + mockT := new(MockT) + JSONEq(mockT, `["foo", {"hello": "world", "nested": "hash"}]`, `{"foo": "bar", {"nested": "hash", "hello": "world"}}`) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestJSONEq_HashesNotEquivalent(t *testing.T) { + mockT := new(MockT) + JSONEq(mockT, `{"foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestJSONEq_ActualIsNotJSON(t *testing.T) { + mockT := new(MockT) + JSONEq(mockT, `{"foo": "bar"}`, "Not JSON") + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestJSONEq_ExpectedIsNotJSON(t *testing.T) { + mockT := new(MockT) + JSONEq(mockT, "Not JSON", `{"foo": "bar", "hello": "world"}`) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestJSONEq_ExpectedAndActualNotJSON(t *testing.T) { + mockT := new(MockT) + JSONEq(mockT, "Not JSON", "Not JSON") + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestJSONEq_ArraysOfDifferentOrder(t *testing.T) { + mockT := new(MockT) + JSONEq(mockT, `["foo", {"hello": "world", "nested": "hash"}]`, `[{ "hello": "world", "nested": "hash"}, "foo"]`) + if !mockT.Failed { + t.Error("Check should fail") + } +} diff --git a/api/vendor/github.com/stretchr/testify/suite/doc.go b/api/vendor/github.com/stretchr/testify/suite/doc.go new file mode 100644 index 0000000..f91a245 --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/suite/doc.go @@ -0,0 +1,65 @@ +// Package suite contains logic for creating testing suite structs +// and running the methods on those structs as tests. The most useful +// piece of this package is that you can create setup/teardown methods +// on your testing suites, which will run before/after the whole suite +// or individual tests (depending on which interface(s) you +// implement). +// +// A testing suite is usually built by first extending the built-in +// suite functionality from suite.Suite in testify. Alternatively, +// you could reproduce that logic on your own if you wanted (you +// just need to implement the TestingSuite interface from +// suite/interfaces.go). +// +// After that, you can implement any of the interfaces in +// suite/interfaces.go to add setup/teardown functionality to your +// suite, and add any methods that start with "Test" to add tests. +// Methods that do not match any suite interfaces and do not begin +// with "Test" will not be run by testify, and can safely be used as +// helper methods. +// +// Once you've built your testing suite, you need to run the suite +// (using suite.Run from testify) inside any function that matches the +// identity that "go test" is already looking for (i.e. +// func(*testing.T)). +// +// Regular expression to select test suites specified command-line +// argument "-run". Regular expression to select the methods +// of test suites specified command-line argument "-m". +// Suite object has assertion methods. +// +// A crude example: +// // Basic imports +// import ( +// "testing" +// "github.com/stretchr/testify/assert" +// "github.com/stretchr/testify/suite" +// ) +// +// // Define the suite, and absorb the built-in basic suite +// // functionality from testify - including a T() method which +// // returns the current testing context +// type ExampleTestSuite struct { +// suite.Suite +// VariableThatShouldStartAtFive int +// } +// +// // Make sure that VariableThatShouldStartAtFive is set to five +// // before each test +// func (suite *ExampleTestSuite) SetupTest() { +// suite.VariableThatShouldStartAtFive = 5 +// } +// +// // All methods that begin with "Test" are run as tests within a +// // suite. +// func (suite *ExampleTestSuite) TestExample() { +// assert.Equal(suite.T(), 5, suite.VariableThatShouldStartAtFive) +// suite.Equal(5, suite.VariableThatShouldStartAtFive) +// } +// +// // In order for 'go test' to run this suite, we need to create +// // a normal test function and pass our suite to suite.Run +// func TestExampleTestSuite(t *testing.T) { +// suite.Run(t, new(ExampleTestSuite)) +// } +package suite diff --git a/api/vendor/github.com/stretchr/testify/suite/interfaces.go b/api/vendor/github.com/stretchr/testify/suite/interfaces.go new file mode 100644 index 0000000..b37cb04 --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/suite/interfaces.go @@ -0,0 +1,46 @@ +package suite + +import "testing" + +// TestingSuite can store and return the current *testing.T context +// generated by 'go test'. +type TestingSuite interface { + T() *testing.T + SetT(*testing.T) +} + +// SetupAllSuite has a SetupSuite method, which will run before the +// tests in the suite are run. +type SetupAllSuite interface { + SetupSuite() +} + +// SetupTestSuite has a SetupTest method, which will run before each +// test in the suite. +type SetupTestSuite interface { + SetupTest() +} + +// TearDownAllSuite has a TearDownSuite method, which will run after +// all the tests in the suite have been run. +type TearDownAllSuite interface { + TearDownSuite() +} + +// TearDownTestSuite has a TearDownTest method, which will run after +// each test in the suite. +type TearDownTestSuite interface { + TearDownTest() +} + +// BeforeTest has a function to be executed right before the test +// starts and receives the suite and test names as input +type BeforeTest interface { + BeforeTest(suiteName, testName string) +} + +// AfterTest has a function to be executed right after the test +// finishes and receives the suite and test names as input +type AfterTest interface { + AfterTest(suiteName, testName string) +} diff --git a/api/vendor/github.com/stretchr/testify/suite/suite.go b/api/vendor/github.com/stretchr/testify/suite/suite.go new file mode 100644 index 0000000..e20afbc --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/suite/suite.go @@ -0,0 +1,136 @@ +package suite + +import ( + "flag" + "fmt" + "os" + "reflect" + "regexp" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +var allTestsFilter = func(_, _ string) (bool, error) { return true, nil } +var matchMethod = flag.String("testify.m", "", "regular expression to select tests of the testify suite to run") + +// Suite is a basic testing suite with methods for storing and +// retrieving the current *testing.T context. +type Suite struct { + *assert.Assertions + require *require.Assertions + t *testing.T +} + +// T retrieves the current *testing.T context. +func (suite *Suite) T() *testing.T { + return suite.t +} + +// SetT sets the current *testing.T context. +func (suite *Suite) SetT(t *testing.T) { + suite.t = t + suite.Assertions = assert.New(t) + suite.require = require.New(t) +} + +// Require returns a require context for suite. +func (suite *Suite) Require() *require.Assertions { + if suite.require == nil { + suite.require = require.New(suite.T()) + } + return suite.require +} + +// Assert returns an assert context for suite. Normally, you can call +// `suite.NoError(expected, actual)`, but for situations where the embedded +// methods are overridden (for example, you might want to override +// assert.Assertions with require.Assertions), this method is provided so you +// can call `suite.Assert().NoError()`. +func (suite *Suite) Assert() *assert.Assertions { + if suite.Assertions == nil { + suite.Assertions = assert.New(suite.T()) + } + return suite.Assertions +} + +// Run takes a testing suite and runs all of the tests attached +// to it. +func Run(t *testing.T, suite TestingSuite) { + suite.SetT(t) + + if setupAllSuite, ok := suite.(SetupAllSuite); ok { + setupAllSuite.SetupSuite() + } + defer func() { + if tearDownAllSuite, ok := suite.(TearDownAllSuite); ok { + tearDownAllSuite.TearDownSuite() + } + }() + + methodFinder := reflect.TypeOf(suite) + tests := []testing.InternalTest{} + for index := 0; index < methodFinder.NumMethod(); index++ { + method := methodFinder.Method(index) + ok, err := methodFilter(method.Name) + if err != nil { + fmt.Fprintf(os.Stderr, "testify: invalid regexp for -m: %s\n", err) + os.Exit(1) + } + if ok { + test := testing.InternalTest{ + Name: method.Name, + F: func(t *testing.T) { + parentT := suite.T() + suite.SetT(t) + if setupTestSuite, ok := suite.(SetupTestSuite); ok { + setupTestSuite.SetupTest() + } + if beforeTestSuite, ok := suite.(BeforeTest); ok { + beforeTestSuite.BeforeTest(methodFinder.Elem().Name(), method.Name) + } + defer func() { + if afterTestSuite, ok := suite.(AfterTest); ok { + afterTestSuite.AfterTest(methodFinder.Elem().Name(), method.Name) + } + if tearDownTestSuite, ok := suite.(TearDownTestSuite); ok { + tearDownTestSuite.TearDownTest() + } + suite.SetT(parentT) + }() + method.Func.Call([]reflect.Value{reflect.ValueOf(suite)}) + }, + } + tests = append(tests, test) + } + } + runTests(t, tests) +} + +func runTests(t testing.TB, tests []testing.InternalTest) { + r, ok := t.(runner) + if !ok { // backwards compatibility with Go 1.6 and below + if !testing.RunTests(allTestsFilter, tests) { + t.Fail() + } + return + } + + for _, test := range tests { + r.Run(test.Name, test.F) + } +} + +// Filtering method according to set regular expression +// specified command-line argument -m +func methodFilter(name string) (bool, error) { + if ok, _ := regexp.MatchString("^Test", name); !ok { + return false, nil + } + return regexp.MatchString(*matchMethod, name) +} + +type runner interface { + Run(name string, f func(t *testing.T)) bool +} diff --git a/api/vendor/github.com/stretchr/testify/suite/suite_test.go b/api/vendor/github.com/stretchr/testify/suite/suite_test.go new file mode 100644 index 0000000..b75fa4a --- /dev/null +++ b/api/vendor/github.com/stretchr/testify/suite/suite_test.go @@ -0,0 +1,294 @@ +package suite + +import ( + "errors" + "io/ioutil" + "os" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +// SuiteRequireTwice is intended to test the usage of suite.Require in two +// different tests +type SuiteRequireTwice struct{ Suite } + +// TestSuiteRequireTwice checks for regressions of issue #149 where +// suite.requirements was not initialised in suite.SetT() +// A regression would result on these tests panicking rather than failing. +func TestSuiteRequireTwice(t *testing.T) { + ok := testing.RunTests( + allTestsFilter, + []testing.InternalTest{{ + Name: "TestSuiteRequireTwice", + F: func(t *testing.T) { + suite := new(SuiteRequireTwice) + Run(t, suite) + }, + }}, + ) + assert.Equal(t, false, ok) +} + +func (s *SuiteRequireTwice) TestRequireOne() { + r := s.Require() + r.Equal(1, 2) +} + +func (s *SuiteRequireTwice) TestRequireTwo() { + r := s.Require() + r.Equal(1, 2) +} + +// This suite is intended to store values to make sure that only +// testing-suite-related methods are run. It's also a fully +// functional example of a testing suite, using setup/teardown methods +// and a helper method that is ignored by testify. To make this look +// more like a real world example, all tests in the suite perform some +// type of assertion. +type SuiteTester struct { + // Include our basic suite logic. + Suite + + // Keep counts of how many times each method is run. + SetupSuiteRunCount int + TearDownSuiteRunCount int + SetupTestRunCount int + TearDownTestRunCount int + TestOneRunCount int + TestTwoRunCount int + NonTestMethodRunCount int + + SuiteNameBefore []string + TestNameBefore []string + + SuiteNameAfter []string + TestNameAfter []string + + TimeBefore []time.Time + TimeAfter []time.Time +} + +type SuiteSkipTester struct { + // Include our basic suite logic. + Suite + + // Keep counts of how many times each method is run. + SetupSuiteRunCount int + TearDownSuiteRunCount int +} + +// The SetupSuite method will be run by testify once, at the very +// start of the testing suite, before any tests are run. +func (suite *SuiteTester) SetupSuite() { + suite.SetupSuiteRunCount++ +} + +func (suite *SuiteTester) BeforeTest(suiteName, testName string) { + suite.SuiteNameBefore = append(suite.SuiteNameBefore, suiteName) + suite.TestNameBefore = append(suite.TestNameBefore, testName) + suite.TimeBefore = append(suite.TimeBefore, time.Now()) +} + +func (suite *SuiteTester) AfterTest(suiteName, testName string) { + suite.SuiteNameAfter = append(suite.SuiteNameAfter, suiteName) + suite.TestNameAfter = append(suite.TestNameAfter, testName) + suite.TimeAfter = append(suite.TimeAfter, time.Now()) +} + +func (suite *SuiteSkipTester) SetupSuite() { + suite.SetupSuiteRunCount++ + suite.T().Skip() +} + +// The TearDownSuite method will be run by testify once, at the very +// end of the testing suite, after all tests have been run. +func (suite *SuiteTester) TearDownSuite() { + suite.TearDownSuiteRunCount++ +} + +func (suite *SuiteSkipTester) TearDownSuite() { + suite.TearDownSuiteRunCount++ +} + +// The SetupTest method will be run before every test in the suite. +func (suite *SuiteTester) SetupTest() { + suite.SetupTestRunCount++ +} + +// The TearDownTest method will be run after every test in the suite. +func (suite *SuiteTester) TearDownTest() { + suite.TearDownTestRunCount++ +} + +// Every method in a testing suite that begins with "Test" will be run +// as a test. TestOne is an example of a test. For the purposes of +// this example, we've included assertions in the tests, since most +// tests will issue assertions. +func (suite *SuiteTester) TestOne() { + beforeCount := suite.TestOneRunCount + suite.TestOneRunCount++ + assert.Equal(suite.T(), suite.TestOneRunCount, beforeCount+1) + suite.Equal(suite.TestOneRunCount, beforeCount+1) +} + +// TestTwo is another example of a test. +func (suite *SuiteTester) TestTwo() { + beforeCount := suite.TestTwoRunCount + suite.TestTwoRunCount++ + assert.NotEqual(suite.T(), suite.TestTwoRunCount, beforeCount) + suite.NotEqual(suite.TestTwoRunCount, beforeCount) +} + +func (suite *SuiteTester) TestSkip() { + suite.T().Skip() +} + +// NonTestMethod does not begin with "Test", so it will not be run by +// testify as a test in the suite. This is useful for creating helper +// methods for your tests. +func (suite *SuiteTester) NonTestMethod() { + suite.NonTestMethodRunCount++ +} + +// TestRunSuite will be run by the 'go test' command, so within it, we +// can run our suite using the Run(*testing.T, TestingSuite) function. +func TestRunSuite(t *testing.T) { + suiteTester := new(SuiteTester) + Run(t, suiteTester) + + // Normally, the test would end here. The following are simply + // some assertions to ensure that the Run function is working as + // intended - they are not part of the example. + + // The suite was only run once, so the SetupSuite and TearDownSuite + // methods should have each been run only once. + assert.Equal(t, suiteTester.SetupSuiteRunCount, 1) + assert.Equal(t, suiteTester.TearDownSuiteRunCount, 1) + + assert.Equal(t, len(suiteTester.SuiteNameAfter), 3) + assert.Equal(t, len(suiteTester.SuiteNameBefore), 3) + assert.Equal(t, len(suiteTester.TestNameAfter), 3) + assert.Equal(t, len(suiteTester.TestNameBefore), 3) + + assert.Contains(t, suiteTester.TestNameAfter, "TestOne") + assert.Contains(t, suiteTester.TestNameAfter, "TestTwo") + assert.Contains(t, suiteTester.TestNameAfter, "TestSkip") + + assert.Contains(t, suiteTester.TestNameBefore, "TestOne") + assert.Contains(t, suiteTester.TestNameBefore, "TestTwo") + assert.Contains(t, suiteTester.TestNameBefore, "TestSkip") + + for _, suiteName := range suiteTester.SuiteNameAfter { + assert.Equal(t, "SuiteTester", suiteName) + } + + for _, suiteName := range suiteTester.SuiteNameBefore { + assert.Equal(t, "SuiteTester", suiteName) + } + + for _, when := range suiteTester.TimeAfter { + assert.False(t, when.IsZero()) + } + + for _, when := range suiteTester.TimeBefore { + assert.False(t, when.IsZero()) + } + + // There are three test methods (TestOne, TestTwo, and TestSkip), so + // the SetupTest and TearDownTest methods (which should be run once for + // each test) should have been run three times. + assert.Equal(t, suiteTester.SetupTestRunCount, 3) + assert.Equal(t, suiteTester.TearDownTestRunCount, 3) + + // Each test should have been run once. + assert.Equal(t, suiteTester.TestOneRunCount, 1) + assert.Equal(t, suiteTester.TestTwoRunCount, 1) + + // Methods that don't match the test method identifier shouldn't + // have been run at all. + assert.Equal(t, suiteTester.NonTestMethodRunCount, 0) + + suiteSkipTester := new(SuiteSkipTester) + Run(t, suiteSkipTester) + + // The suite was only run once, so the SetupSuite and TearDownSuite + // methods should have each been run only once, even though SetupSuite + // called Skip() + assert.Equal(t, suiteSkipTester.SetupSuiteRunCount, 1) + assert.Equal(t, suiteSkipTester.TearDownSuiteRunCount, 1) + +} + +func TestSuiteGetters(t *testing.T) { + suite := new(SuiteTester) + suite.SetT(t) + assert.NotNil(t, suite.Assert()) + assert.Equal(t, suite.Assertions, suite.Assert()) + assert.NotNil(t, suite.Require()) + assert.Equal(t, suite.require, suite.Require()) +} + +type SuiteLoggingTester struct { + Suite +} + +func (s *SuiteLoggingTester) TestLoggingPass() { + s.T().Log("TESTLOGPASS") +} + +func (s *SuiteLoggingTester) TestLoggingFail() { + s.T().Log("TESTLOGFAIL") + assert.NotNil(s.T(), nil) // expected to fail +} + +type StdoutCapture struct { + oldStdout *os.File + readPipe *os.File +} + +func (sc *StdoutCapture) StartCapture() { + sc.oldStdout = os.Stdout + sc.readPipe, os.Stdout, _ = os.Pipe() +} + +func (sc *StdoutCapture) StopCapture() (string, error) { + if sc.oldStdout == nil || sc.readPipe == nil { + return "", errors.New("StartCapture not called before StopCapture") + } + os.Stdout.Close() + os.Stdout = sc.oldStdout + bytes, err := ioutil.ReadAll(sc.readPipe) + if err != nil { + return "", err + } + return string(bytes), nil +} + +func TestSuiteLogging(t *testing.T) { + suiteLoggingTester := new(SuiteLoggingTester) + capture := StdoutCapture{} + internalTest := testing.InternalTest{ + Name: "SomeTest", + F: func(subT *testing.T) { + Run(subT, suiteLoggingTester) + }, + } + capture.StartCapture() + testing.RunTests(allTestsFilter, []testing.InternalTest{internalTest}) + output, err := capture.StopCapture() + require.NoError(t, err, "Got an error trying to capture stdout and stderr!") + require.NotEmpty(t, output, "output content must not be empty") + + // Failed tests' output is always printed + assert.Contains(t, output, "TESTLOGFAIL") + + if testing.Verbose() { + // In verbose mode, output from successful tests is also printed + assert.Contains(t, output, "TESTLOGPASS") + } else { + assert.NotContains(t, output, "TESTLOGPASS") + } +} diff --git a/api/vendor/go.uber.org/atomic/.codecov.yml b/api/vendor/go.uber.org/atomic/.codecov.yml new file mode 100644 index 0000000..6d4d1be --- /dev/null +++ b/api/vendor/go.uber.org/atomic/.codecov.yml @@ -0,0 +1,15 @@ +coverage: + range: 80..100 + round: down + precision: 2 + + status: + project: # measuring the overall project coverage + default: # context, you can create multiple ones with custom titles + enabled: yes # must be yes|true to enable this status + target: 100 # specify the target coverage for each commit status + # option: "auto" (must increase from parent commit or pull request base) + # option: "X%" a static target percentage to hit + if_not_found: success # if parent is not found report status as success, error, or failure + if_ci_failed: error # if ci fails report status as success, error, or failure + diff --git a/api/vendor/go.uber.org/atomic/.github/PULL_REQUEST_TEMPLATE.md b/api/vendor/go.uber.org/atomic/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..8ef55f8 --- /dev/null +++ b/api/vendor/go.uber.org/atomic/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,8 @@ +Before opening your pull request, please make sure that you've: + +- [ ] [signed Uber's Contributor License Agreement](https://docs.google.com/a/uber.com/forms/d/1pAwS_-dA1KhPlfxzYLBqK6rsSWwRwH95OCCZrcsY5rk/viewform); +- [ ] added tests to cover your changes; +- [ ] run the test suite locally (`make test`); and finally, +- [ ] run the linters locally (`make lint`). + +Thanks for your contribution! diff --git a/api/vendor/go.uber.org/atomic/.gitignore b/api/vendor/go.uber.org/atomic/.gitignore new file mode 100644 index 0000000..0a4504f --- /dev/null +++ b/api/vendor/go.uber.org/atomic/.gitignore @@ -0,0 +1,11 @@ +.DS_Store +/vendor +/cover +cover.out +lint.log + +# Binaries +*.test + +# Profiling output +*.prof diff --git a/api/vendor/go.uber.org/atomic/.travis.yml b/api/vendor/go.uber.org/atomic/.travis.yml new file mode 100644 index 0000000..5895722 --- /dev/null +++ b/api/vendor/go.uber.org/atomic/.travis.yml @@ -0,0 +1,23 @@ +sudo: false +language: go +go_import_path: go.uber.org/atomic + +go: + - 1.7 + - 1.8 + - 1.9 + +cache: + directories: + - vendor + +install: + - make install_ci + +script: + - make test_ci + - scripts/test-ubergo.sh + - make lint + +after_success: + - bash <(curl -s https://codecov.io/bash) diff --git a/api/vendor/go.uber.org/atomic/LICENSE.txt b/api/vendor/go.uber.org/atomic/LICENSE.txt new file mode 100644 index 0000000..8765c9f --- /dev/null +++ b/api/vendor/go.uber.org/atomic/LICENSE.txt @@ -0,0 +1,19 @@ +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 +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/api/vendor/go.uber.org/atomic/Makefile b/api/vendor/go.uber.org/atomic/Makefile new file mode 100644 index 0000000..dfc63d9 --- /dev/null +++ b/api/vendor/go.uber.org/atomic/Makefile @@ -0,0 +1,64 @@ +PACKAGES := $(shell glide nv) +# Many Go tools take file globs or directories as arguments instead of packages. +PACKAGE_FILES ?= *.go + + +# The linting tools evolve with each Go version, so run them only on the latest +# stable release. +GO_VERSION := $(shell go version | cut -d " " -f 3) +GO_MINOR_VERSION := $(word 2,$(subst ., ,$(GO_VERSION))) +LINTABLE_MINOR_VERSIONS := 7 8 +ifneq ($(filter $(LINTABLE_MINOR_VERSIONS),$(GO_MINOR_VERSION)),) +SHOULD_LINT := true +endif + + +export GO15VENDOREXPERIMENT=1 + + +.PHONY: build +build: + go build -i $(PACKAGES) + + +.PHONY: install +install: + glide --version || go get github.com/Masterminds/glide + glide install + + +.PHONY: test +test: + go test -cover -race $(PACKAGES) + + +.PHONY: install_ci +install_ci: install + go get github.com/wadey/gocovmerge + go get github.com/mattn/goveralls + go get golang.org/x/tools/cmd/cover +ifdef SHOULD_LINT + go get github.com/golang/lint/golint +endif + +.PHONY: lint +lint: +ifdef SHOULD_LINT + @rm -rf lint.log + @echo "Checking formatting..." + @gofmt -d -s $(PACKAGE_FILES) 2>&1 | tee lint.log + @echo "Checking vet..." + @$(foreach dir,$(PACKAGE_FILES),go tool vet $(dir) 2>&1 | tee -a lint.log;) + @echo "Checking lint..." + @$(foreach dir,$(PKGS),golint $(dir) 2>&1 | tee -a lint.log;) + @echo "Checking for unresolved FIXMEs..." + @git grep -i fixme | grep -v -e vendor -e Makefile | tee -a lint.log + @[ ! -s lint.log ] +else + @echo "Skipping linters on" $(GO_VERSION) +endif + + +.PHONY: test_ci +test_ci: install_ci build + ./scripts/cover.sh $(shell go list $(PACKAGES)) diff --git a/api/vendor/go.uber.org/atomic/README.md b/api/vendor/go.uber.org/atomic/README.md new file mode 100644 index 0000000..6505abf --- /dev/null +++ b/api/vendor/go.uber.org/atomic/README.md @@ -0,0 +1,36 @@ +# atomic [![GoDoc][doc-img]][doc] [![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov] [![Go Report Card][reportcard-img]][reportcard] + +Simple wrappers for primitive types to enforce atomic access. + +## Installation +`go get -u go.uber.org/atomic` + +## Usage +The standard library's `sync/atomic` is powerful, but it's easy to forget which +variables must be accessed atomically. `go.uber.org/atomic` preserves all the +functionality of the standard library, but wraps the primitive types to +provide a safer, more convenient API. + +```go +var atom atomic.Uint32 +atom.Store(42) +atom.Sub(2) +atom.CAS(40, 11) +``` + +See the [documentation][doc] for a complete API specification. + +## Development Status +Stable. + +
    +Released under the [MIT License](LICENSE.txt). + +[doc-img]: https://godoc.org/github.com/uber-go/atomic?status.svg +[doc]: https://godoc.org/go.uber.org/atomic +[ci-img]: https://travis-ci.org/uber-go/atomic.svg?branch=master +[ci]: https://travis-ci.org/uber-go/atomic +[cov-img]: https://codecov.io/gh/uber-go/atomic/branch/master/graph/badge.svg +[cov]: https://codecov.io/gh/uber-go/atomic +[reportcard-img]: https://goreportcard.com/badge/go.uber.org/atomic +[reportcard]: https://goreportcard.com/report/go.uber.org/atomic diff --git a/api/vendor/go.uber.org/atomic/atomic.go b/api/vendor/go.uber.org/atomic/atomic.go new file mode 100644 index 0000000..1db6849 --- /dev/null +++ b/api/vendor/go.uber.org/atomic/atomic.go @@ -0,0 +1,351 @@ +// 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 +// 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. + +// Package atomic provides simple wrappers around numerics to enforce atomic +// access. +package atomic + +import ( + "math" + "sync/atomic" + "time" +) + +// Int32 is an atomic wrapper around an int32. +type Int32 struct{ v int32 } + +// NewInt32 creates an Int32. +func NewInt32(i int32) *Int32 { + return &Int32{i} +} + +// Load atomically loads the wrapped value. +func (i *Int32) Load() int32 { + return atomic.LoadInt32(&i.v) +} + +// Add atomically adds to the wrapped int32 and returns the new value. +func (i *Int32) Add(n int32) int32 { + return atomic.AddInt32(&i.v, n) +} + +// Sub atomically subtracts from the wrapped int32 and returns the new value. +func (i *Int32) Sub(n int32) int32 { + return atomic.AddInt32(&i.v, -n) +} + +// Inc atomically increments the wrapped int32 and returns the new value. +func (i *Int32) Inc() int32 { + return i.Add(1) +} + +// Dec atomically decrements the wrapped int32 and returns the new value. +func (i *Int32) Dec() int32 { + return i.Sub(1) +} + +// CAS is an atomic compare-and-swap. +func (i *Int32) CAS(old, new int32) bool { + return atomic.CompareAndSwapInt32(&i.v, old, new) +} + +// Store atomically stores the passed value. +func (i *Int32) Store(n int32) { + atomic.StoreInt32(&i.v, n) +} + +// Swap atomically swaps the wrapped int32 and returns the old value. +func (i *Int32) Swap(n int32) int32 { + return atomic.SwapInt32(&i.v, n) +} + +// Int64 is an atomic wrapper around an int64. +type Int64 struct{ v int64 } + +// NewInt64 creates an Int64. +func NewInt64(i int64) *Int64 { + return &Int64{i} +} + +// Load atomically loads the wrapped value. +func (i *Int64) Load() int64 { + return atomic.LoadInt64(&i.v) +} + +// Add atomically adds to the wrapped int64 and returns the new value. +func (i *Int64) Add(n int64) int64 { + return atomic.AddInt64(&i.v, n) +} + +// Sub atomically subtracts from the wrapped int64 and returns the new value. +func (i *Int64) Sub(n int64) int64 { + return atomic.AddInt64(&i.v, -n) +} + +// Inc atomically increments the wrapped int64 and returns the new value. +func (i *Int64) Inc() int64 { + return i.Add(1) +} + +// Dec atomically decrements the wrapped int64 and returns the new value. +func (i *Int64) Dec() int64 { + return i.Sub(1) +} + +// CAS is an atomic compare-and-swap. +func (i *Int64) CAS(old, new int64) bool { + return atomic.CompareAndSwapInt64(&i.v, old, new) +} + +// Store atomically stores the passed value. +func (i *Int64) Store(n int64) { + atomic.StoreInt64(&i.v, n) +} + +// Swap atomically swaps the wrapped int64 and returns the old value. +func (i *Int64) Swap(n int64) int64 { + return atomic.SwapInt64(&i.v, n) +} + +// Uint32 is an atomic wrapper around an uint32. +type Uint32 struct{ v uint32 } + +// NewUint32 creates a Uint32. +func NewUint32(i uint32) *Uint32 { + return &Uint32{i} +} + +// Load atomically loads the wrapped value. +func (i *Uint32) Load() uint32 { + return atomic.LoadUint32(&i.v) +} + +// Add atomically adds to the wrapped uint32 and returns the new value. +func (i *Uint32) Add(n uint32) uint32 { + return atomic.AddUint32(&i.v, n) +} + +// Sub atomically subtracts from the wrapped uint32 and returns the new value. +func (i *Uint32) Sub(n uint32) uint32 { + return atomic.AddUint32(&i.v, ^(n - 1)) +} + +// Inc atomically increments the wrapped uint32 and returns the new value. +func (i *Uint32) Inc() uint32 { + return i.Add(1) +} + +// Dec atomically decrements the wrapped int32 and returns the new value. +func (i *Uint32) Dec() uint32 { + return i.Sub(1) +} + +// CAS is an atomic compare-and-swap. +func (i *Uint32) CAS(old, new uint32) bool { + return atomic.CompareAndSwapUint32(&i.v, old, new) +} + +// Store atomically stores the passed value. +func (i *Uint32) Store(n uint32) { + atomic.StoreUint32(&i.v, n) +} + +// Swap atomically swaps the wrapped uint32 and returns the old value. +func (i *Uint32) Swap(n uint32) uint32 { + return atomic.SwapUint32(&i.v, n) +} + +// Uint64 is an atomic wrapper around a uint64. +type Uint64 struct{ v uint64 } + +// NewUint64 creates a Uint64. +func NewUint64(i uint64) *Uint64 { + return &Uint64{i} +} + +// Load atomically loads the wrapped value. +func (i *Uint64) Load() uint64 { + return atomic.LoadUint64(&i.v) +} + +// Add atomically adds to the wrapped uint64 and returns the new value. +func (i *Uint64) Add(n uint64) uint64 { + return atomic.AddUint64(&i.v, n) +} + +// Sub atomically subtracts from the wrapped uint64 and returns the new value. +func (i *Uint64) Sub(n uint64) uint64 { + return atomic.AddUint64(&i.v, ^(n - 1)) +} + +// Inc atomically increments the wrapped uint64 and returns the new value. +func (i *Uint64) Inc() uint64 { + return i.Add(1) +} + +// Dec atomically decrements the wrapped uint64 and returns the new value. +func (i *Uint64) Dec() uint64 { + return i.Sub(1) +} + +// CAS is an atomic compare-and-swap. +func (i *Uint64) CAS(old, new uint64) bool { + return atomic.CompareAndSwapUint64(&i.v, old, new) +} + +// Store atomically stores the passed value. +func (i *Uint64) Store(n uint64) { + atomic.StoreUint64(&i.v, n) +} + +// Swap atomically swaps the wrapped uint64 and returns the old value. +func (i *Uint64) Swap(n uint64) uint64 { + return atomic.SwapUint64(&i.v, n) +} + +// Bool is an atomic Boolean. +type Bool struct{ v uint32 } + +// NewBool creates a Bool. +func NewBool(initial bool) *Bool { + return &Bool{boolToInt(initial)} +} + +// Load atomically loads the Boolean. +func (b *Bool) Load() bool { + return truthy(atomic.LoadUint32(&b.v)) +} + +// CAS is an atomic compare-and-swap. +func (b *Bool) CAS(old, new bool) bool { + return atomic.CompareAndSwapUint32(&b.v, boolToInt(old), boolToInt(new)) +} + +// Store atomically stores the passed value. +func (b *Bool) Store(new bool) { + atomic.StoreUint32(&b.v, boolToInt(new)) +} + +// Swap sets the given value and returns the previous value. +func (b *Bool) Swap(new bool) bool { + return truthy(atomic.SwapUint32(&b.v, boolToInt(new))) +} + +// Toggle atomically negates the Boolean and returns the previous value. +func (b *Bool) Toggle() bool { + return truthy(atomic.AddUint32(&b.v, 1) - 1) +} + +func truthy(n uint32) bool { + return n&1 == 1 +} + +func boolToInt(b bool) uint32 { + if b { + return 1 + } + return 0 +} + +// Float64 is an atomic wrapper around float64. +type Float64 struct { + v uint64 +} + +// NewFloat64 creates a Float64. +func NewFloat64(f float64) *Float64 { + return &Float64{math.Float64bits(f)} +} + +// Load atomically loads the wrapped value. +func (f *Float64) Load() float64 { + return math.Float64frombits(atomic.LoadUint64(&f.v)) +} + +// Store atomically stores the passed value. +func (f *Float64) Store(s float64) { + atomic.StoreUint64(&f.v, math.Float64bits(s)) +} + +// Add atomically adds to the wrapped float64 and returns the new value. +func (f *Float64) Add(s float64) float64 { + for { + old := f.Load() + new := old + s + if f.CAS(old, new) { + return new + } + } +} + +// Sub atomically subtracts from the wrapped float64 and returns the new value. +func (f *Float64) Sub(s float64) float64 { + return f.Add(-s) +} + +// CAS is an atomic compare-and-swap. +func (f *Float64) CAS(old, new float64) bool { + return atomic.CompareAndSwapUint64(&f.v, math.Float64bits(old), math.Float64bits(new)) +} + +// Duration is an atomic wrapper around time.Duration +// https://godoc.org/time#Duration +type Duration struct { + v Int64 +} + +// NewDuration creates a Duration. +func NewDuration(d time.Duration) *Duration { + return &Duration{v: *NewInt64(int64(d))} +} + +// Load atomically loads the wrapped value. +func (d *Duration) Load() time.Duration { + return time.Duration(d.v.Load()) +} + +// Store atomically stores the passed value. +func (d *Duration) Store(n time.Duration) { + d.v.Store(int64(n)) +} + +// Add atomically adds to the wrapped time.Duration and returns the new value. +func (d *Duration) Add(n time.Duration) time.Duration { + return time.Duration(d.v.Add(int64(n))) +} + +// Sub atomically subtracts from the wrapped time.Duration and returns the new value. +func (d *Duration) Sub(n time.Duration) time.Duration { + return time.Duration(d.v.Sub(int64(n))) +} + +// Swap atomically swaps the wrapped time.Duration and returns the old value. +func (d *Duration) Swap(n time.Duration) time.Duration { + return time.Duration(d.v.Swap(int64(n))) +} + +// CAS is an atomic compare-and-swap. +func (d *Duration) CAS(old, new time.Duration) bool { + return d.v.CAS(int64(old), int64(new)) +} + +// Value shadows the type of the same name from sync/atomic +// https://godoc.org/sync/atomic#Value +type Value struct{ atomic.Value } diff --git a/api/vendor/go.uber.org/atomic/atomic_test.go b/api/vendor/go.uber.org/atomic/atomic_test.go new file mode 100644 index 0000000..6666f8a --- /dev/null +++ b/api/vendor/go.uber.org/atomic/atomic_test.go @@ -0,0 +1,172 @@ +// 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 +// 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. + +package atomic + +import ( + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestInt32(t *testing.T) { + atom := NewInt32(42) + + require.Equal(t, int32(42), atom.Load(), "Load didn't work.") + require.Equal(t, int32(46), atom.Add(4), "Add didn't work.") + require.Equal(t, int32(44), atom.Sub(2), "Sub didn't work.") + require.Equal(t, int32(45), atom.Inc(), "Inc didn't work.") + require.Equal(t, int32(44), atom.Dec(), "Dec didn't work.") + + require.True(t, atom.CAS(44, 0), "CAS didn't report a swap.") + require.Equal(t, int32(0), atom.Load(), "CAS didn't set the correct value.") + + require.Equal(t, int32(0), atom.Swap(1), "Swap didn't return the old value.") + require.Equal(t, int32(1), atom.Load(), "Swap didn't set the correct value.") + + atom.Store(42) + require.Equal(t, int32(42), atom.Load(), "Store didn't set the correct value.") +} + +func TestInt64(t *testing.T) { + atom := NewInt64(42) + + require.Equal(t, int64(42), atom.Load(), "Load didn't work.") + require.Equal(t, int64(46), atom.Add(4), "Add didn't work.") + require.Equal(t, int64(44), atom.Sub(2), "Sub didn't work.") + require.Equal(t, int64(45), atom.Inc(), "Inc didn't work.") + require.Equal(t, int64(44), atom.Dec(), "Dec didn't work.") + + require.True(t, atom.CAS(44, 0), "CAS didn't report a swap.") + require.Equal(t, int64(0), atom.Load(), "CAS didn't set the correct value.") + + require.Equal(t, int64(0), atom.Swap(1), "Swap didn't return the old value.") + require.Equal(t, int64(1), atom.Load(), "Swap didn't set the correct value.") + + atom.Store(42) + require.Equal(t, int64(42), atom.Load(), "Store didn't set the correct value.") +} + +func TestUint32(t *testing.T) { + atom := NewUint32(42) + + require.Equal(t, uint32(42), atom.Load(), "Load didn't work.") + require.Equal(t, uint32(46), atom.Add(4), "Add didn't work.") + require.Equal(t, uint32(44), atom.Sub(2), "Sub didn't work.") + require.Equal(t, uint32(45), atom.Inc(), "Inc didn't work.") + require.Equal(t, uint32(44), atom.Dec(), "Dec didn't work.") + + require.True(t, atom.CAS(44, 0), "CAS didn't report a swap.") + require.Equal(t, uint32(0), atom.Load(), "CAS didn't set the correct value.") + + require.Equal(t, uint32(0), atom.Swap(1), "Swap didn't return the old value.") + require.Equal(t, uint32(1), atom.Load(), "Swap didn't set the correct value.") + + atom.Store(42) + require.Equal(t, uint32(42), atom.Load(), "Store didn't set the correct value.") +} + +func TestUint64(t *testing.T) { + atom := NewUint64(42) + + require.Equal(t, uint64(42), atom.Load(), "Load didn't work.") + require.Equal(t, uint64(46), atom.Add(4), "Add didn't work.") + require.Equal(t, uint64(44), atom.Sub(2), "Sub didn't work.") + require.Equal(t, uint64(45), atom.Inc(), "Inc didn't work.") + require.Equal(t, uint64(44), atom.Dec(), "Dec didn't work.") + + require.True(t, atom.CAS(44, 0), "CAS didn't report a swap.") + require.Equal(t, uint64(0), atom.Load(), "CAS didn't set the correct value.") + + require.Equal(t, uint64(0), atom.Swap(1), "Swap didn't return the old value.") + require.Equal(t, uint64(1), atom.Load(), "Swap didn't set the correct value.") + + atom.Store(42) + require.Equal(t, uint64(42), atom.Load(), "Store didn't set the correct value.") +} + +func TestBool(t *testing.T) { + atom := NewBool(false) + require.False(t, atom.Toggle(), "Expected swap to return previous value.") + require.True(t, atom.Load(), "Unexpected state after swap.") + + require.True(t, atom.CAS(true, true), "CAS should swap when old matches") + require.True(t, atom.Load(), "CAS should have no effect") + require.True(t, atom.CAS(true, false), "CAS should swap when old matches") + require.False(t, atom.Load(), "CAS should have modified the value") + require.False(t, atom.CAS(true, false), "CAS should fail on old mismatch") + require.False(t, atom.Load(), "CAS should not have modified the value") + + atom.Store(false) + require.False(t, atom.Load(), "Unexpected state after store.") + + prev := atom.Swap(false) + require.False(t, prev, "Expected Swap to return previous value.") + + prev = atom.Swap(true) + require.False(t, prev, "Expected Swap to return previous value.") +} + +func TestFloat64(t *testing.T) { + atom := NewFloat64(4.2) + + require.Equal(t, float64(4.2), atom.Load(), "Load didn't work.") + + require.True(t, atom.CAS(4.2, 0.5), "CAS didn't report a swap.") + require.Equal(t, float64(0.5), atom.Load(), "CAS didn't set the correct value.") + require.False(t, atom.CAS(0.0, 1.5), "CAS reported a swap.") + + atom.Store(42.0) + require.Equal(t, float64(42.0), atom.Load(), "Store didn't set the correct value.") + require.Equal(t, float64(42.5), atom.Add(0.5), "Add didn't work.") + require.Equal(t, float64(42.0), atom.Sub(0.5), "Sub didn't work.") +} + +func TestDuration(t *testing.T) { + atom := NewDuration(5 * time.Minute) + + require.Equal(t, 5*time.Minute, atom.Load(), "Load didn't work.") + require.Equal(t, 6*time.Minute, atom.Add(time.Minute), "Add didn't work.") + require.Equal(t, 4*time.Minute, atom.Sub(2*time.Minute), "Sub didn't work.") + + require.True(t, atom.CAS(4*time.Minute, time.Minute), "CAS didn't report a swap.") + require.Equal(t, time.Minute, atom.Load(), "CAS didn't set the correct value.") + + require.Equal(t, time.Minute, atom.Swap(2*time.Minute), "Swap didn't return the old value.") + require.Equal(t, 2*time.Minute, atom.Load(), "Swap didn't set the correct value.") + + atom.Store(10 * time.Minute) + require.Equal(t, 10*time.Minute, atom.Load(), "Store didn't set the correct value.") +} + +func TestValue(t *testing.T) { + var v Value + assert.Nil(t, v.Load(), "initial Value is not nil") + + v.Store(42) + assert.Equal(t, 42, v.Load()) + + v.Store(84) + assert.Equal(t, 84, v.Load()) + + assert.Panics(t, func() { v.Store("foo") }) +} diff --git a/api/vendor/go.uber.org/atomic/example_test.go b/api/vendor/go.uber.org/atomic/example_test.go new file mode 100644 index 0000000..806e11c --- /dev/null +++ b/api/vendor/go.uber.org/atomic/example_test.go @@ -0,0 +1,43 @@ +// 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 +// 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. + +package atomic_test + +import ( + "fmt" + + "go.uber.org/atomic" +) + +func Example() { + // Uint32 is a thin wrapper around the primitive uint32 type. + var atom atomic.Uint32 + + // The wrapper ensures that all operations are atomic. + atom.Store(42) + fmt.Println(atom.Inc()) + fmt.Println(atom.CAS(43, 0)) + fmt.Println(atom.Load()) + + // Output: + // 43 + // true + // 0 +} diff --git a/api/vendor/go.uber.org/atomic/glide.lock b/api/vendor/go.uber.org/atomic/glide.lock new file mode 100644 index 0000000..3c72c59 --- /dev/null +++ b/api/vendor/go.uber.org/atomic/glide.lock @@ -0,0 +1,17 @@ +hash: f14d51408e3e0e4f73b34e4039484c78059cd7fc5f4996fdd73db20dc8d24f53 +updated: 2016-10-27T00:10:51.16960137-07:00 +imports: [] +testImports: +- name: github.com/davecgh/go-spew + version: 5215b55f46b2b919f50a1df0eaa5886afe4e3b3d + subpackages: + - spew +- name: github.com/pmezard/go-difflib + version: d8ed2627bdf02c080bf22230dbb337003b7aba2d + subpackages: + - difflib +- name: github.com/stretchr/testify + version: d77da356e56a7428ad25149ca77381849a6a5232 + subpackages: + - assert + - require diff --git a/api/vendor/go.uber.org/atomic/glide.yaml b/api/vendor/go.uber.org/atomic/glide.yaml new file mode 100644 index 0000000..4cf608e --- /dev/null +++ b/api/vendor/go.uber.org/atomic/glide.yaml @@ -0,0 +1,6 @@ +package: go.uber.org/atomic +testImport: +- package: github.com/stretchr/testify + subpackages: + - assert + - require diff --git a/api/vendor/go.uber.org/atomic/scripts/cover.sh b/api/vendor/go.uber.org/atomic/scripts/cover.sh new file mode 100755 index 0000000..5dfb65e --- /dev/null +++ b/api/vendor/go.uber.org/atomic/scripts/cover.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +set -e + +COVER=cover +ROOT_PKG=go.uber.org/atomic + +if [[ -d "$COVER" ]]; then + rm -rf "$COVER" +fi +mkdir -p "$COVER" + +i=0 +for pkg in "$@"; do + i=$((i + 1)) + + extracoverpkg="" + if [[ -f "$GOPATH/src/$pkg/.extra-coverpkg" ]]; then + extracoverpkg=$( \ + sed -e "s|^|$pkg/|g" < "$GOPATH/src/$pkg/.extra-coverpkg" \ + | tr '\n' ',') + fi + + coverpkg=$(go list -json "$pkg" | jq -r ' + .Deps + | map(select(startswith("'"$ROOT_PKG"'"))) + | map(select(contains("/vendor/") | not)) + | . + ["'"$pkg"'"] + | join(",") + ') + if [[ -n "$extracoverpkg" ]]; then + coverpkg="$extracoverpkg$coverpkg" + fi + + go test \ + -coverprofile "$COVER/cover.${i}.out" -coverpkg "$coverpkg" \ + -v "$pkg" +done + +gocovmerge "$COVER"/*.out > cover.out diff --git a/api/vendor/go.uber.org/atomic/scripts/test-ubergo.sh b/api/vendor/go.uber.org/atomic/scripts/test-ubergo.sh new file mode 100755 index 0000000..9bc526d --- /dev/null +++ b/api/vendor/go.uber.org/atomic/scripts/test-ubergo.sh @@ -0,0 +1,26 @@ +#!/bin/bash +set -euox pipefail +IFS=$'\n\t' + +# This script creates a fake GOPATH, symlinks in the current +# directory as uber-go/atomic and verifies that tests still pass. + +WORK_DIR=`mktemp -d` +function cleanup { + rm -rf "$WORK_DIR" +} +trap cleanup EXIT + + +export GOPATH="$WORK_DIR" +PKG_PARENT="$WORK_DIR/src/github.com/uber-go" +PKG_DIR="$PKG_PARENT/atomic" + +mkdir -p "$PKG_PARENT" +cp -R `pwd` "$PKG_DIR" +cd "$PKG_DIR" + +# The example imports go.uber.org, fix the import. +sed -e 's/go.uber.org\/atomic/github.com\/uber-go\/atomic/' -i="" example_test.go + +make test diff --git a/api/vendor/go.uber.org/atomic/stress_test.go b/api/vendor/go.uber.org/atomic/stress_test.go new file mode 100644 index 0000000..8fd1251 --- /dev/null +++ b/api/vendor/go.uber.org/atomic/stress_test.go @@ -0,0 +1,258 @@ +// 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 +// 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. + +package atomic + +import ( + "math" + "runtime" + "sync" + "sync/atomic" + "testing" +) + +const ( + _parallelism = 4 + _iterations = 1000 +) + +var _stressTests = map[string]func() func(){ + "i32/std": stressStdInt32, + "i32": stressInt32, + "i64/std": stressStdInt32, + "i64": stressInt64, + "u32/std": stressStdUint32, + "u32": stressUint32, + "u64/std": stressStdUint64, + "u64": stressUint64, + "f64": stressFloat64, + "bool": stressBool, + "string": stressString, + "duration": stressDuration, +} + +func TestStress(t *testing.T) { + for name, ff := range _stressTests { + t.Run(name, func(t *testing.T) { + defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(_parallelism)) + + start := make(chan struct{}) + var wg sync.WaitGroup + wg.Add(_parallelism) + f := ff() + for i := 0; i < _parallelism; i++ { + go func() { + defer wg.Done() + <-start + for j := 0; j < _iterations; j++ { + f() + } + }() + } + close(start) + wg.Wait() + }) + } +} + +func BenchmarkStress(b *testing.B) { + for name, ff := range _stressTests { + b.Run(name, func(b *testing.B) { + f := ff() + + b.Run("serial", func(b *testing.B) { + for i := 0; i < b.N; i++ { + f() + } + }) + + b.Run("parallel", func(b *testing.B) { + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + f() + } + }) + }) + }) + } +} + +func stressStdInt32() func() { + var atom int32 + return func() { + atomic.LoadInt32(&atom) + atomic.AddInt32(&atom, 1) + atomic.AddInt32(&atom, -2) + atomic.AddInt32(&atom, 1) + atomic.AddInt32(&atom, -1) + atomic.CompareAndSwapInt32(&atom, 1, 0) + atomic.SwapInt32(&atom, 5) + atomic.StoreInt32(&atom, 1) + } +} + +func stressInt32() func() { + var atom Int32 + return func() { + atom.Load() + atom.Add(1) + atom.Sub(2) + atom.Inc() + atom.Dec() + atom.CAS(1, 0) + atom.Swap(5) + atom.Store(1) + } +} + +func stressStdInt64() func() { + var atom int64 + return func() { + atomic.LoadInt64(&atom) + atomic.AddInt64(&atom, 1) + atomic.AddInt64(&atom, -2) + atomic.AddInt64(&atom, 1) + atomic.AddInt64(&atom, -1) + atomic.CompareAndSwapInt64(&atom, 1, 0) + atomic.SwapInt64(&atom, 5) + atomic.StoreInt64(&atom, 1) + } +} + +func stressInt64() func() { + var atom Int64 + return func() { + atom.Load() + atom.Add(1) + atom.Sub(2) + atom.Inc() + atom.Dec() + atom.CAS(1, 0) + atom.Swap(5) + atom.Store(1) + } +} + +func stressStdUint32() func() { + var atom uint32 + return func() { + atomic.LoadUint32(&atom) + atomic.AddUint32(&atom, 1) + // Adding `MaxUint32` is the same as subtracting 1 + atomic.AddUint32(&atom, math.MaxUint32-1) + atomic.AddUint32(&atom, 1) + atomic.AddUint32(&atom, math.MaxUint32) + atomic.CompareAndSwapUint32(&atom, 1, 0) + atomic.SwapUint32(&atom, 5) + atomic.StoreUint32(&atom, 1) + } +} + +func stressUint32() func() { + var atom Uint32 + return func() { + atom.Load() + atom.Add(1) + atom.Sub(2) + atom.Inc() + atom.Dec() + atom.CAS(1, 0) + atom.Swap(5) + atom.Store(1) + } +} + +func stressStdUint64() func() { + var atom uint64 + return func() { + atomic.LoadUint64(&atom) + atomic.AddUint64(&atom, 1) + // Adding `MaxUint64` is the same as subtracting 1 + atomic.AddUint64(&atom, math.MaxUint64-1) + atomic.AddUint64(&atom, 1) + atomic.AddUint64(&atom, math.MaxUint64) + atomic.CompareAndSwapUint64(&atom, 1, 0) + atomic.SwapUint64(&atom, 5) + atomic.StoreUint64(&atom, 1) + } +} + +func stressUint64() func() { + var atom Uint64 + return func() { + atom.Load() + atom.Add(1) + atom.Sub(2) + atom.Inc() + atom.Dec() + atom.CAS(1, 0) + atom.Swap(5) + atom.Store(1) + } +} + +func stressFloat64() func() { + var atom Float64 + return func() { + atom.Load() + atom.CAS(1.0, 0.1) + atom.Add(1.1) + atom.Sub(0.2) + atom.Store(1.0) + } +} + +func stressBool() func() { + var atom Bool + return func() { + atom.Load() + atom.Store(false) + atom.Swap(true) + atom.CAS(true, false) + atom.CAS(true, false) + atom.Load() + atom.Toggle() + atom.Toggle() + } +} + +func stressString() func() { + var atom String + return func() { + atom.Load() + atom.Store("abc") + atom.Load() + atom.Store("def") + atom.Load() + atom.Store("") + } +} + +func stressDuration() func() { + var atom = NewDuration(0) + return func() { + atom.Load() + atom.Add(1) + atom.Sub(2) + atom.CAS(1, 0) + atom.Swap(5) + atom.Store(1) + } +} diff --git a/api/vendor/go.uber.org/atomic/string.go b/api/vendor/go.uber.org/atomic/string.go new file mode 100644 index 0000000..ede8136 --- /dev/null +++ b/api/vendor/go.uber.org/atomic/string.go @@ -0,0 +1,49 @@ +// 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 +// 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. + +package atomic + +// String is an atomic type-safe wrapper around Value for strings. +type String struct{ v Value } + +// NewString creates a String. +func NewString(str string) *String { + s := &String{} + if str != "" { + s.Store(str) + } + return s +} + +// Load atomically loads the wrapped string. +func (s *String) Load() string { + v := s.v.Load() + if v == nil { + return "" + } + return v.(string) +} + +// Store atomically stores the passed string. +// Note: Converting the string to an interface{} to store in the Value +// requires an allocation. +func (s *String) Store(str string) { + s.v.Store(str) +} diff --git a/api/vendor/go.uber.org/atomic/string_test.go b/api/vendor/go.uber.org/atomic/string_test.go new file mode 100644 index 0000000..91b793e --- /dev/null +++ b/api/vendor/go.uber.org/atomic/string_test.go @@ -0,0 +1,43 @@ +// 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 +// 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. + +package atomic + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestStringNoInitialValue(t *testing.T) { + atom := &String{} + require.Equal(t, "", atom.Load(), "Initial value should be blank string") +} + +func TestString(t *testing.T) { + atom := NewString("") + require.Equal(t, "", atom.Load(), "Expected Load to return initialized value") + + atom.Store("abc") + require.Equal(t, "abc", atom.Load(), "Unexpected value after Store") + + atom = NewString("bcd") + require.Equal(t, "bcd", atom.Load(), "Expected Load to return initialized value") +} diff --git a/api/vendor/go.uber.org/multierr/.codecov.yml b/api/vendor/go.uber.org/multierr/.codecov.yml new file mode 100644 index 0000000..6d4d1be --- /dev/null +++ b/api/vendor/go.uber.org/multierr/.codecov.yml @@ -0,0 +1,15 @@ +coverage: + range: 80..100 + round: down + precision: 2 + + status: + project: # measuring the overall project coverage + default: # context, you can create multiple ones with custom titles + enabled: yes # must be yes|true to enable this status + target: 100 # specify the target coverage for each commit status + # option: "auto" (must increase from parent commit or pull request base) + # option: "X%" a static target percentage to hit + if_not_found: success # if parent is not found report status as success, error, or failure + if_ci_failed: error # if ci fails report status as success, error, or failure + diff --git a/api/vendor/go.uber.org/multierr/.gitignore b/api/vendor/go.uber.org/multierr/.gitignore new file mode 100644 index 0000000..61ead86 --- /dev/null +++ b/api/vendor/go.uber.org/multierr/.gitignore @@ -0,0 +1 @@ +/vendor diff --git a/api/vendor/go.uber.org/multierr/.travis.yml b/api/vendor/go.uber.org/multierr/.travis.yml new file mode 100644 index 0000000..5ffa8fe --- /dev/null +++ b/api/vendor/go.uber.org/multierr/.travis.yml @@ -0,0 +1,33 @@ +sudo: false +language: go +go_import_path: go.uber.org/multierr + +env: + global: + - GO15VENDOREXPERIMENT=1 + +go: + - 1.7 + - 1.8 + - tip + +cache: + directories: + - vendor + +before_install: +- go version + +install: +- | + set -e + make install_ci + +script: +- | + set -e + make lint + make test_ci + +after_success: +- bash <(curl -s https://codecov.io/bash) diff --git a/api/vendor/go.uber.org/multierr/CHANGELOG.md b/api/vendor/go.uber.org/multierr/CHANGELOG.md new file mode 100644 index 0000000..898445d --- /dev/null +++ b/api/vendor/go.uber.org/multierr/CHANGELOG.md @@ -0,0 +1,28 @@ +Releases +======== + +v1.1.0 (2017-06-30) +=================== + +- Added an `Errors(error) []error` function to extract the underlying list of + errors for a multierr error. + + +v1.0.0 (2017-05-31) +=================== + +No changes since v0.2.0. This release is committing to making no breaking +changes to the current API in the 1.X series. + + +v0.2.0 (2017-04-11) +=================== + +- Repeatedly appending to the same error is now faster due to fewer + allocations. + + +v0.1.0 (2017-31-03) +=================== + +- Initial release diff --git a/api/vendor/go.uber.org/multierr/LICENSE.txt b/api/vendor/go.uber.org/multierr/LICENSE.txt new file mode 100644 index 0000000..858e024 --- /dev/null +++ b/api/vendor/go.uber.org/multierr/LICENSE.txt @@ -0,0 +1,19 @@ +Copyright (c) 2017 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. diff --git a/api/vendor/go.uber.org/multierr/Makefile b/api/vendor/go.uber.org/multierr/Makefile new file mode 100644 index 0000000..a7437d0 --- /dev/null +++ b/api/vendor/go.uber.org/multierr/Makefile @@ -0,0 +1,74 @@ +export GO15VENDOREXPERIMENT=1 + +PACKAGES := $(shell glide nv) + +GO_FILES := $(shell \ + find . '(' -path '*/.*' -o -path './vendor' ')' -prune \ + -o -name '*.go' -print | cut -b3-) + +.PHONY: install +install: + glide --version || go get github.com/Masterminds/glide + glide install + +.PHONY: build +build: + go build -i $(PACKAGES) + +.PHONY: test +test: + go test -cover -race $(PACKAGES) + +.PHONY: gofmt +gofmt: + $(eval FMT_LOG := $(shell mktemp -t gofmt.XXXXX)) + @gofmt -e -s -l $(GO_FILES) > $(FMT_LOG) || true + @[ ! -s "$(FMT_LOG)" ] || (echo "gofmt failed:" | cat - $(FMT_LOG) && false) + +.PHONY: govet +govet: + $(eval VET_LOG := $(shell mktemp -t govet.XXXXX)) + @go vet $(PACKAGES) 2>&1 \ + | grep -v '^exit status' > $(VET_LOG) || true + @[ ! -s "$(VET_LOG)" ] || (echo "govet failed:" | cat - $(VET_LOG) && false) + +.PHONY: golint +golint: + @go get github.com/golang/lint/golint + $(eval LINT_LOG := $(shell mktemp -t golint.XXXXX)) + @cat /dev/null > $(LINT_LOG) + @$(foreach pkg, $(PACKAGES), golint $(pkg) >> $(LINT_LOG) || true;) + @[ ! -s "$(LINT_LOG)" ] || (echo "golint failed:" | cat - $(LINT_LOG) && false) + +.PHONY: staticcheck +staticcheck: + @go get honnef.co/go/tools/cmd/staticcheck + $(eval STATICCHECK_LOG := $(shell mktemp -t staticcheck.XXXXX)) + @staticcheck $(PACKAGES) 2>&1 > $(STATICCHECK_LOG) || true + @[ ! -s "$(STATICCHECK_LOG)" ] || (echo "staticcheck failed:" | cat - $(STATICCHECK_LOG) && false) + +.PHONY: lint +lint: gofmt govet golint staticcheck + +.PHONY: cover +cover: + ./scripts/cover.sh $(shell go list $(PACKAGES)) + go tool cover -html=cover.out -o cover.html + +update-license: + @go get go.uber.org/tools/update-license + @update-license \ + $(shell go list -json $(PACKAGES) | \ + jq -r '.Dir + "/" + (.GoFiles | .[])') + +############################################################################## + +.PHONY: install_ci +install_ci: install + go get github.com/wadey/gocovmerge + go get github.com/mattn/goveralls + go get golang.org/x/tools/cmd/cover + +.PHONY: test_ci +test_ci: install_ci + ./scripts/cover.sh $(shell go list $(PACKAGES)) diff --git a/api/vendor/go.uber.org/multierr/README.md b/api/vendor/go.uber.org/multierr/README.md new file mode 100644 index 0000000..065088f --- /dev/null +++ b/api/vendor/go.uber.org/multierr/README.md @@ -0,0 +1,23 @@ +# multierr [![GoDoc][doc-img]][doc] [![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov] + +`multierr` allows combining one or more Go `error`s together. + +## Installation + + go get -u go.uber.org/multierr + +## Status + +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.org/uber-go/multierr.svg?branch=master +[cov-img]: https://codecov.io/gh/uber-go/multierr/branch/master/graph/badge.svg +[ci]: https://travis-ci.org/uber-go/multierr +[cov]: https://codecov.io/gh/uber-go/multierr diff --git a/api/vendor/go.uber.org/multierr/benchmarks_test.go b/api/vendor/go.uber.org/multierr/benchmarks_test.go new file mode 100644 index 0000000..797f5a0 --- /dev/null +++ b/api/vendor/go.uber.org/multierr/benchmarks_test.go @@ -0,0 +1,62 @@ +// Copyright (c) 2017 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. + +package multierr + +import ( + "errors" + "fmt" + "testing" +) + +func BenchmarkAppend(b *testing.B) { + errorTypes := []struct { + name string + err error + }{ + { + name: "nil", + err: nil, + }, + { + name: "single error", + err: errors.New("test"), + }, + { + name: "multiple errors", + err: appendN(nil, errors.New("err"), 10), + }, + } + + for _, initial := range errorTypes { + for _, v := range errorTypes { + msg := fmt.Sprintf("append %v to %v", v.name, initial.name) + b.Run(msg, func(b *testing.B) { + for _, appends := range []int{1, 2, 10} { + b.Run(fmt.Sprint(appends), func(b *testing.B) { + for i := 0; i < b.N; i++ { + appendN(initial.err, v.err, appends) + } + }) + } + }) + } + } +} diff --git a/api/vendor/go.uber.org/multierr/error.go b/api/vendor/go.uber.org/multierr/error.go new file mode 100644 index 0000000..de6ce47 --- /dev/null +++ b/api/vendor/go.uber.org/multierr/error.go @@ -0,0 +1,401 @@ +// Copyright (c) 2017 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. + +// Package multierr allows combining one or more errors together. +// +// Overview +// +// Errors can be combined with the use of the Combine function. +// +// multierr.Combine( +// reader.Close(), +// writer.Close(), +// conn.Close(), +// ) +// +// If only two errors are being combined, the Append function may be used +// instead. +// +// err = multierr.Combine(reader.Close(), writer.Close()) +// +// This makes it possible to record resource cleanup failures from deferred +// blocks with the help of named return values. +// +// func sendRequest(req Request) (err error) { +// conn, err := openConnection() +// if err != nil { +// return err +// } +// defer func() { +// err = multierr.Append(err, conn.Close()) +// }() +// // ... +// } +// +// 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:") +// } +// +// Advanced Usage +// +// Errors returned by Combine and Append MAY implement the following +// interface. +// +// type errorGroup interface { +// // Returns a slice containing the underlying list of errors. +// // +// // This slice MUST NOT be modified by the caller. +// Errors() []error +// } +// +// Note that if you need access to list of errors behind a multierr error, you +// should prefer using the Errors function. That said, if you need cheap +// read-only access to the underlying errors slice, you can attempt to cast +// the error to this interface. You MUST handle the failure case gracefully +// because errors returned by Combine and Append are not guaranteed to +// implement this interface. +// +// var errors []error +// group, ok := err.(errorGroup) +// if ok { +// errors = group.Errors() +// } else { +// errors = []error{err} +// } +package multierr // import "go.uber.org/multierr" + +import ( + "bytes" + "fmt" + "io" + "strings" + "sync" + + "go.uber.org/atomic" +) + +var ( + // Separator for single-line error messages. + _singlelineSeparator = []byte("; ") + + _newline = []byte("\n") + + // Prefix for multi-line messages + _multilinePrefix = []byte("the following errors occurred:") + + // Prefix for the first and following lines of an item in a list of + // multi-line error messages. + // + // For example, if a single item is: + // + // foo + // bar + // + // It will become, + // + // - foo + // bar + _multilineSeparator = []byte("\n - ") + _multilineIndent = []byte(" ") +) + +// _bufferPool is a pool of bytes.Buffers. +var _bufferPool = sync.Pool{ + New: func() interface{} { + return &bytes.Buffer{} + }, +} + +type errorGroup interface { + Errors() []error +} + +// Errors returns a slice containing zero or more errors that the supplied +// error is composed of. If the error is nil, the returned slice is empty. +// +// err := multierr.Append(r.Close(), w.Close()) +// errors := multierr.Errors(err) +// +// If the error is not composed of other errors, the returned slice contains +// just the error that was passed in. +// +// Callers of this function are free to modify the returned slice. +func Errors(err error) []error { + if err == nil { + return nil + } + + // Note that we're casting to multiError, not errorGroup. Our contract is + // that returned errors MAY implement errorGroup. Errors, however, only + // has special behavior for multierr-specific error objects. + // + // This behavior can be expanded in the future but I think it's prudent to + // start with as little as possible in terms of contract and possibility + // of misuse. + eg, ok := err.(*multiError) + if !ok { + return []error{err} + } + + errors := eg.Errors() + result := make([]error, len(errors)) + copy(result, errors) + return result +} + +// multiError is an error that holds one or more errors. +// +// An instance of this is guaranteed to be non-empty and flattened. That is, +// none of the errors inside multiError are other multiErrors. +// +// multiError formats to a semi-colon delimited list of error messages with +// %v and with a more readable multi-line format with %+v. +type multiError struct { + copyNeeded atomic.Bool + errors []error +} + +var _ errorGroup = (*multiError)(nil) + +// Errors returns the list of underlying errors. +// +// This slice MUST NOT be modified. +func (merr *multiError) Errors() []error { + if merr == nil { + return nil + } + return merr.errors +} + +func (merr *multiError) Error() string { + if merr == nil { + return "" + } + + buff := _bufferPool.Get().(*bytes.Buffer) + buff.Reset() + + merr.writeSingleline(buff) + + result := buff.String() + _bufferPool.Put(buff) + return result +} + +func (merr *multiError) Format(f fmt.State, c rune) { + if c == 'v' && f.Flag('+') { + merr.writeMultiline(f) + } else { + merr.writeSingleline(f) + } +} + +func (merr *multiError) writeSingleline(w io.Writer) { + first := true + for _, item := range merr.errors { + if first { + first = false + } else { + w.Write(_singlelineSeparator) + } + io.WriteString(w, item.Error()) + } +} + +func (merr *multiError) writeMultiline(w io.Writer) { + w.Write(_multilinePrefix) + for _, item := range merr.errors { + w.Write(_multilineSeparator) + writePrefixLine(w, _multilineIndent, fmt.Sprintf("%+v", item)) + } +} + +// Writes s to the writer with the given prefix added before each line after +// the first. +func writePrefixLine(w io.Writer, prefix []byte, s string) { + first := true + for len(s) > 0 { + if first { + first = false + } else { + w.Write(prefix) + } + + idx := strings.IndexByte(s, '\n') + if idx < 0 { + idx = len(s) - 1 + } + + io.WriteString(w, s[:idx+1]) + s = s[idx+1:] + } +} + +type inspectResult struct { + // Number of top-level non-nil errors + Count int + + // Total number of errors including multiErrors + Capacity int + + // Index of the first non-nil error in the list. Value is meaningless if + // Count is zero. + FirstErrorIdx int + + // Whether the list contains at least one multiError + ContainsMultiError bool +} + +// Inspects the given slice of errors so that we can efficiently allocate +// space for it. +func inspect(errors []error) (res inspectResult) { + first := true + for i, err := range errors { + if err == nil { + continue + } + + res.Count++ + if first { + first = false + res.FirstErrorIdx = i + } + + if merr, ok := err.(*multiError); ok { + res.Capacity += len(merr.errors) + res.ContainsMultiError = true + } else { + res.Capacity++ + } + } + return +} + +// fromSlice converts the given list of errors into a single error. +func fromSlice(errors []error) error { + res := inspect(errors) + switch res.Count { + case 0: + return nil + case 1: + // only one non-nil entry + return errors[res.FirstErrorIdx] + case len(errors): + if !res.ContainsMultiError { + // already flat + return &multiError{errors: errors} + } + } + + nonNilErrs := make([]error, 0, res.Capacity) + for _, err := range errors[res.FirstErrorIdx:] { + if err == nil { + continue + } + + if nested, ok := err.(*multiError); ok { + nonNilErrs = append(nonNilErrs, nested.errors...) + } else { + nonNilErrs = append(nonNilErrs, err) + } + } + + return &multiError{errors: nonNilErrs} +} + +// Combine combines the passed errors into a single error. +// +// If zero arguments were passed or if all items are nil, a nil error is +// returned. +// +// Combine(nil, nil) // == nil +// +// If only a single error was passed, it is returned as-is. +// +// Combine(err) // == err +// +// Combine skips over nil arguments so this function may be used to combine +// together errors from operations that fail independently of each other. +// +// multierr.Combine( +// reader.Close(), +// writer.Close(), +// pipe.Close(), +// ) +// +// If any of the passed errors is a multierr error, it will be flattened along +// with the other errors. +// +// multierr.Combine(multierr.Combine(err1, err2), err3) +// // is the same as +// multierr.Combine(err1, err2, err3) +// +// The returned error formats into a readable multi-line error message if +// formatted with %+v. +// +// fmt.Sprintf("%+v", multierr.Combine(err1, err2)) +func Combine(errors ...error) error { + return fromSlice(errors) +} + +// Append appends the given errors together. Either value may be nil. +// +// This function is a specialization of Combine for the common case where +// there are only two errors. +// +// err = multierr.Append(reader.Close(), writer.Close()) +// +// The following pattern may also be used to record failure of deferred +// operations without losing information about the original error. +// +// func doSomething(..) (err error) { +// f := acquireResource() +// defer func() { +// err = multierr.Append(err, f.Close()) +// }() +func Append(left error, right error) error { + switch { + case left == nil: + return right + case right == nil: + return left + } + + if _, ok := right.(*multiError); !ok { + if l, ok := left.(*multiError); ok && !l.copyNeeded.Swap(true) { + // Common case where the error on the left is constantly being + // appended to. + errs := append(l.errors, right) + return &multiError{errors: errs} + } else if !ok { + // Both errors are single errors. + return &multiError{errors: []error{left, right}} + } + } + + // Either right or both, left and right, are multiErrors. Rely on usual + // expensive logic. + errors := [2]error{left, right} + return fromSlice(errors[0:]) +} diff --git a/api/vendor/go.uber.org/multierr/error_test.go b/api/vendor/go.uber.org/multierr/error_test.go new file mode 100644 index 0000000..9384ff5 --- /dev/null +++ b/api/vendor/go.uber.org/multierr/error_test.go @@ -0,0 +1,511 @@ +// Copyright (c) 2017 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. + +package multierr + +import ( + "errors" + "fmt" + "io" + "sync" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +// richFormatError is an error that prints a different output depending on +// whether %v or %+v was used. +type richFormatError struct{} + +func (r richFormatError) Error() string { + return fmt.Sprint(r) +} + +func (richFormatError) Format(f fmt.State, c rune) { + if c == 'v' && f.Flag('+') { + io.WriteString(f, "multiline\nmessage\nwith plus") + } else { + io.WriteString(f, "without plus") + } +} + +func appendN(initial, err error, n int) error { + errs := initial + for i := 0; i < n; i++ { + errs = Append(errs, err) + } + return errs +} + +func newMultiErr(errors ...error) error { + return &multiError{errors: errors} +} + +func TestCombine(t *testing.T) { + tests := []struct { + // Input + giveErrors []error + + // Resulting error + wantError error + + // %+v and %v string representations + wantMultiline string + wantSingleline string + }{ + { + giveErrors: nil, + wantError: nil, + }, + { + giveErrors: []error{}, + wantError: nil, + }, + { + giveErrors: []error{ + errors.New("foo"), + nil, + newMultiErr( + errors.New("bar"), + ), + nil, + }, + wantError: newMultiErr( + errors.New("foo"), + errors.New("bar"), + ), + wantMultiline: "the following errors occurred:\n" + + " - foo\n" + + " - bar", + wantSingleline: "foo; bar", + }, + { + giveErrors: []error{ + errors.New("foo"), + newMultiErr( + errors.New("bar"), + ), + }, + wantError: newMultiErr( + errors.New("foo"), + errors.New("bar"), + ), + wantMultiline: "the following errors occurred:\n" + + " - foo\n" + + " - bar", + wantSingleline: "foo; bar", + }, + { + giveErrors: []error{errors.New("great sadness")}, + wantError: errors.New("great sadness"), + wantMultiline: "great sadness", + wantSingleline: "great sadness", + }, + { + giveErrors: []error{ + errors.New("foo"), + errors.New("bar"), + }, + wantError: newMultiErr( + errors.New("foo"), + errors.New("bar"), + ), + wantMultiline: "the following errors occurred:\n" + + " - foo\n" + + " - bar", + wantSingleline: "foo; bar", + }, + { + giveErrors: []error{ + errors.New("great sadness"), + errors.New("multi\n line\nerror message"), + errors.New("single line error message"), + }, + wantError: newMultiErr( + errors.New("great sadness"), + errors.New("multi\n line\nerror message"), + errors.New("single line error message"), + ), + wantMultiline: "the following errors occurred:\n" + + " - great sadness\n" + + " - multi\n" + + " line\n" + + " error message\n" + + " - single line error message", + wantSingleline: "great sadness; " + + "multi\n line\nerror message; " + + "single line error message", + }, + { + giveErrors: []error{ + errors.New("foo"), + newMultiErr( + errors.New("bar"), + errors.New("baz"), + ), + errors.New("qux"), + }, + wantError: newMultiErr( + errors.New("foo"), + errors.New("bar"), + errors.New("baz"), + errors.New("qux"), + ), + wantMultiline: "the following errors occurred:\n" + + " - foo\n" + + " - bar\n" + + " - baz\n" + + " - qux", + wantSingleline: "foo; bar; baz; qux", + }, + { + giveErrors: []error{ + errors.New("foo"), + nil, + newMultiErr( + errors.New("bar"), + ), + nil, + }, + wantError: newMultiErr( + errors.New("foo"), + errors.New("bar"), + ), + wantMultiline: "the following errors occurred:\n" + + " - foo\n" + + " - bar", + wantSingleline: "foo; bar", + }, + { + giveErrors: []error{ + errors.New("foo"), + newMultiErr( + errors.New("bar"), + ), + }, + wantError: newMultiErr( + errors.New("foo"), + errors.New("bar"), + ), + wantMultiline: "the following errors occurred:\n" + + " - foo\n" + + " - bar", + wantSingleline: "foo; bar", + }, + { + giveErrors: []error{ + errors.New("foo"), + richFormatError{}, + errors.New("bar"), + }, + wantError: newMultiErr( + errors.New("foo"), + richFormatError{}, + errors.New("bar"), + ), + wantMultiline: "the following errors occurred:\n" + + " - foo\n" + + " - multiline\n" + + " message\n" + + " with plus\n" + + " - bar", + wantSingleline: "foo; without plus; bar", + }, + } + + for i, tt := range tests { + t.Run(fmt.Sprint(i), func(t *testing.T) { + err := Combine(tt.giveErrors...) + require.Equal(t, tt.wantError, err) + + if tt.wantMultiline != "" { + t.Run("Sprintf/multiline", func(t *testing.T) { + assert.Equal(t, tt.wantMultiline, fmt.Sprintf("%+v", err)) + }) + } + + if tt.wantSingleline != "" { + t.Run("Sprintf/singleline", func(t *testing.T) { + assert.Equal(t, tt.wantSingleline, fmt.Sprintf("%v", err)) + }) + + t.Run("Error()", func(t *testing.T) { + assert.Equal(t, tt.wantSingleline, err.Error()) + }) + + if s, ok := err.(fmt.Stringer); ok { + t.Run("String()", func(t *testing.T) { + assert.Equal(t, tt.wantSingleline, s.String()) + }) + } + } + }) + } +} + +func TestCombineDoesNotModifySlice(t *testing.T) { + errors := []error{ + errors.New("foo"), + nil, + errors.New("bar"), + } + + assert.NotNil(t, Combine(errors...)) + assert.Len(t, errors, 3) + assert.Nil(t, errors[1], 3) +} + +func TestAppend(t *testing.T) { + tests := []struct { + left error + right error + want error + }{ + { + left: nil, + right: nil, + want: nil, + }, + { + left: nil, + right: errors.New("great sadness"), + want: errors.New("great sadness"), + }, + { + left: errors.New("great sadness"), + right: nil, + want: errors.New("great sadness"), + }, + { + left: errors.New("foo"), + right: errors.New("bar"), + want: newMultiErr( + errors.New("foo"), + errors.New("bar"), + ), + }, + { + left: newMultiErr( + errors.New("foo"), + errors.New("bar"), + ), + right: errors.New("baz"), + want: newMultiErr( + errors.New("foo"), + errors.New("bar"), + errors.New("baz"), + ), + }, + { + left: errors.New("baz"), + right: newMultiErr( + errors.New("foo"), + errors.New("bar"), + ), + want: newMultiErr( + errors.New("baz"), + errors.New("foo"), + errors.New("bar"), + ), + }, + { + left: newMultiErr( + errors.New("foo"), + ), + right: newMultiErr( + errors.New("bar"), + ), + want: newMultiErr( + errors.New("foo"), + errors.New("bar"), + ), + }, + } + + for _, tt := range tests { + assert.Equal(t, tt.want, Append(tt.left, tt.right)) + } +} + +type notMultiErr struct{} + +var _ errorGroup = notMultiErr{} + +func (notMultiErr) Error() string { + return "great sadness" +} + +func (notMultiErr) Errors() []error { + return []error{errors.New("great sadness")} +} + +func TestErrors(t *testing.T) { + tests := []struct { + give error + want []error + + // Don't attempt to cast to errorGroup or *multiError + dontCast bool + }{ + {dontCast: true}, // nil + { + give: errors.New("hi"), + want: []error{errors.New("hi")}, + dontCast: true, + }, + { + // We don't yet support non-multierr errors. + give: notMultiErr{}, + want: []error{notMultiErr{}}, + dontCast: true, + }, + { + give: Combine( + errors.New("foo"), + errors.New("bar"), + ), + want: []error{ + errors.New("foo"), + errors.New("bar"), + }, + }, + { + give: Append( + errors.New("foo"), + errors.New("bar"), + ), + want: []error{ + errors.New("foo"), + errors.New("bar"), + }, + }, + { + give: Append( + errors.New("foo"), + Combine( + errors.New("bar"), + ), + ), + want: []error{ + errors.New("foo"), + errors.New("bar"), + }, + }, + { + give: Combine( + errors.New("foo"), + Append( + errors.New("bar"), + errors.New("baz"), + ), + errors.New("qux"), + ), + want: []error{ + errors.New("foo"), + errors.New("bar"), + errors.New("baz"), + errors.New("qux"), + }, + }, + } + + for i, tt := range tests { + t.Run(fmt.Sprint(i), func(t *testing.T) { + t.Run("Errors()", func(t *testing.T) { + require.Equal(t, tt.want, Errors(tt.give)) + }) + + if tt.dontCast { + return + } + + t.Run("multiError", func(t *testing.T) { + require.Equal(t, tt.want, tt.give.(*multiError).Errors()) + }) + + t.Run("errorGroup", func(t *testing.T) { + require.Equal(t, tt.want, tt.give.(errorGroup).Errors()) + }) + }) + } +} + +func createMultiErrWithCapacity() error { + // Create a multiError that has capacity for more errors so Append will + // modify the underlying array that may be shared. + return appendN(nil, errors.New("append"), 50) +} + +func TestAppendDoesNotModify(t *testing.T) { + initial := createMultiErrWithCapacity() + err1 := Append(initial, errors.New("err1")) + err2 := Append(initial, errors.New("err2")) + + // Make sure the error messages match, since we do modify the copyNeeded + // atomic, the values cannot be compared. + assert.EqualError(t, initial, createMultiErrWithCapacity().Error(), "Initial should not be modified") + + assert.EqualError(t, err1, Append(createMultiErrWithCapacity(), errors.New("err1")).Error()) + assert.EqualError(t, err2, Append(createMultiErrWithCapacity(), errors.New("err2")).Error()) +} + +func TestAppendRace(t *testing.T) { + initial := createMultiErrWithCapacity() + + var wg sync.WaitGroup + for i := 0; i < 10; i++ { + wg.Add(1) + go func() { + defer wg.Done() + + err := initial + for j := 0; j < 10; j++ { + err = Append(err, errors.New("err")) + } + }() + } + + wg.Wait() +} + +func TestErrorsSliceIsImmutable(t *testing.T) { + err1 := errors.New("err1") + err2 := errors.New("err2") + + err := Append(err1, err2) + gotErrors := Errors(err) + require.Equal(t, []error{err1, err2}, gotErrors, "errors must match") + + gotErrors[0] = nil + gotErrors[1] = errors.New("err3") + + require.Equal(t, []error{err1, err2}, Errors(err), + "errors must match after modification") +} + +func TestNilMultierror(t *testing.T) { + // For safety, all operations on multiError should be safe even if it is + // nil. + var err *multiError + + require.Empty(t, err.Error()) + require.Empty(t, err.Errors()) +} diff --git a/api/vendor/go.uber.org/multierr/example_test.go b/api/vendor/go.uber.org/multierr/example_test.go new file mode 100644 index 0000000..da4d914 --- /dev/null +++ b/api/vendor/go.uber.org/multierr/example_test.go @@ -0,0 +1,72 @@ +// Copyright (c) 2017 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. + +package multierr_test + +import ( + "errors" + "fmt" + + "go.uber.org/multierr" +) + +func ExampleCombine() { + err := multierr.Combine( + errors.New("call 1 failed"), + nil, // successful request + errors.New("call 3 failed"), + nil, // successful request + errors.New("call 5 failed"), + ) + fmt.Printf("%+v", err) + // Output: + // the following errors occurred: + // - call 1 failed + // - call 3 failed + // - call 5 failed +} + +func ExampleAppend() { + var err error + err = multierr.Append(err, errors.New("call 1 failed")) + err = multierr.Append(err, errors.New("call 2 failed")) + fmt.Println(err) + // Output: + // call 1 failed; call 2 failed +} + +func ExampleErrors() { + err := multierr.Combine( + nil, // successful request + errors.New("call 2 failed"), + errors.New("call 3 failed"), + ) + err = multierr.Append(err, nil) // successful request + err = multierr.Append(err, errors.New("call 5 failed")) + + errors := multierr.Errors(err) + for _, err := range errors { + fmt.Println(err) + } + // Output: + // call 2 failed + // call 3 failed + // call 5 failed +} diff --git a/api/vendor/go.uber.org/multierr/glide.lock b/api/vendor/go.uber.org/multierr/glide.lock new file mode 100644 index 0000000..f9ea94c --- /dev/null +++ b/api/vendor/go.uber.org/multierr/glide.lock @@ -0,0 +1,19 @@ +hash: b53b5e9a84b9cb3cc4b2d0499e23da2feca1eec318ce9bb717ecf35bf24bf221 +updated: 2017-04-10T13:34:45.671678062-07:00 +imports: +- name: go.uber.org/atomic + version: 3b8db5e93c4c02efbc313e17b2e796b0914a01fb +testImports: +- name: github.com/davecgh/go-spew + version: 6d212800a42e8ab5c146b8ace3490ee17e5225f9 + subpackages: + - spew +- name: github.com/pmezard/go-difflib + version: d8ed2627bdf02c080bf22230dbb337003b7aba2d + subpackages: + - difflib +- name: github.com/stretchr/testify + version: 69483b4bd14f5845b5a1e55bca19e954e827f1d0 + subpackages: + - assert + - require diff --git a/api/vendor/go.uber.org/multierr/glide.yaml b/api/vendor/go.uber.org/multierr/glide.yaml new file mode 100644 index 0000000..6ef084e --- /dev/null +++ b/api/vendor/go.uber.org/multierr/glide.yaml @@ -0,0 +1,8 @@ +package: go.uber.org/multierr +import: +- package: go.uber.org/atomic + version: ^1 +testImport: +- package: github.com/stretchr/testify + subpackages: + - assert diff --git a/api/vendor/go.uber.org/multierr/scripts/cover.sh b/api/vendor/go.uber.org/multierr/scripts/cover.sh new file mode 100755 index 0000000..e7f2b88 --- /dev/null +++ b/api/vendor/go.uber.org/multierr/scripts/cover.sh @@ -0,0 +1,40 @@ +#!/bin/bash -e + +COVER=cover +ROOT_PKG=go.uber.org/multierr + +if [[ -d "$COVER" ]]; then + rm -rf "$COVER" +fi +mkdir -p "$COVER" + +i=0 +for pkg in "$@"; do + i=$((i + 1)) + + extracoverpkg="" + if [[ -f "$GOPATH/src/$pkg/.extra-coverpkg" ]]; then + extracoverpkg=$( \ + sed -e "s|^|$pkg/|g" < "$GOPATH/src/$pkg/.extra-coverpkg" \ + | tr '\n' ',') + fi + + coverpkg=$(go list -json "$pkg" | jq -r ' + .Deps + | . + ["'"$pkg"'"] + | map + ( select(startswith("'"$ROOT_PKG"'")) + | select(contains("/vendor/") | not) + ) + | join(",") + ') + if [[ -n "$extracoverpkg" ]]; then + coverpkg="$extracoverpkg$coverpkg" + fi + + go test \ + -coverprofile "$COVER/cover.${i}.out" -coverpkg "$coverpkg" \ + -v "$pkg" +done + +gocovmerge "$COVER"/*.out > cover.out diff --git a/api/vendor/go.uber.org/zap/.codecov.yml b/api/vendor/go.uber.org/zap/.codecov.yml new file mode 100644 index 0000000..8e5ca7d --- /dev/null +++ b/api/vendor/go.uber.org/zap/.codecov.yml @@ -0,0 +1,17 @@ +coverage: + range: 80..100 + round: down + precision: 2 + + status: + project: # measuring the overall project coverage + default: # context, you can create multiple ones with custom titles + enabled: yes # must be yes|true to enable this status + target: 95% # specify the target coverage for each commit status + # option: "auto" (must increase from parent commit or pull request base) + # option: "X%" a static target percentage to hit + if_not_found: success # if parent is not found report status as success, error, or failure + if_ci_failed: error # if ci fails report status as success, error, or failure +ignore: + - internal/readme/readme.go + diff --git a/api/vendor/go.uber.org/zap/.gitignore b/api/vendor/go.uber.org/zap/.gitignore new file mode 100644 index 0000000..08fbde6 --- /dev/null +++ b/api/vendor/go.uber.org/zap/.gitignore @@ -0,0 +1,28 @@ +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test +vendor + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe +*.test +*.prof +*.pprof +*.out +*.log diff --git a/api/vendor/go.uber.org/zap/.readme.tmpl b/api/vendor/go.uber.org/zap/.readme.tmpl new file mode 100644 index 0000000..550dcda --- /dev/null +++ b/api/vendor/go.uber.org/zap/.readme.tmpl @@ -0,0 +1,108 @@ +# :zap: zap [![GoDoc][doc-img]][doc] [![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov] + +Blazing fast, structured, leveled logging in Go. + +## Installation + +`go get -u go.uber.org/zap` + +Note that zap only supports the two most recent minor versions of Go. + +## Quick Start + +In contexts where performance is nice, but not critical, use the +`SugaredLogger`. It's 4-10x faster than than other structured logging +packages and includes both structured and `printf`-style APIs. + +```go +logger, _ := zap.NewProduction() +defer logger.Sync() // flushes buffer, if any +sugar := logger.Sugar() +sugar.Infow("failed to fetch URL", + // Structured context as loosely typed key-value pairs. + "url", url, + "attempt", 3, + "backoff", time.Second, +) +sugar.Infof("Failed to fetch URL: %s", url) +``` + +When performance and type safety are critical, use the `Logger`. It's even +faster than the `SugaredLogger` and allocates far less, but it only supports +structured logging. + +```go +logger, _ := zap.NewProduction() +defer logger.Sync() +logger.Info("failed to fetch URL", + // Structured context as strongly typed Field values. + zap.String("url", url), + zap.Int("attempt", 3), + zap.Duration("backoff", time.Second), +) +``` + +See the [documentation][doc] and [FAQ](FAQ.md) for more details. + +## Performance + +For applications that log in the hot path, reflection-based serialization and +string formatting are prohibitively expensive — they're CPU-intensive +and make many small allocations. Put differently, using `encoding/json` and +`fmt.Fprintf` to log tons of `interface{}`s makes your application slow. + +Zap takes a different approach. It includes a reflection-free, zero-allocation +JSON encoder, and the base `Logger` strives to avoid serialization overhead +and allocations wherever possible. By building the high-level `SugaredLogger` +on that foundation, zap lets users *choose* when they need to count every +allocation and when they'd prefer a more familiar, loosely typed API. + +As measured by its own [benchmarking suite][], not only is zap more performant +than comparable structured logging packages — it's also faster than the +standard library. Like all benchmarks, take these with a grain of salt.[1](#footnote-versions) + +Log a message and 10 fields: + +{{.BenchmarkAddingFields}} + +Log a message with a logger that already has 10 fields of context: + +{{.BenchmarkAccumulatedContext}} + +Log a static string, without any context or `printf`-style templating: + +{{.BenchmarkWithoutFields}} + +## Development Status: Stable + +All APIs are finalized, and no breaking changes will be made in the 1.x series +of releases. Users of semver-aware dependency management systems should pin +zap to `^1`. + +## Contributing + +We encourage and support an active, healthy community of contributors — +including you! Details are in the [contribution guide](CONTRIBUTING.md) and +the [code of conduct](CODE_OF_CONDUCT.md). The zap maintainers keep an eye on +issues and pull requests, but you can also report any negative conduct to +oss-conduct@uber.com. That email list is a private, safe space; even the zap +maintainers don't have access, so don't hesitate to hold us to a high +standard. + +
    + +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) + +[doc-img]: https://godoc.org/go.uber.org/zap?status.svg +[doc]: https://godoc.org/go.uber.org/zap +[ci-img]: https://travis-ci.org/uber-go/zap.svg?branch=master +[ci]: https://travis-ci.org/uber-go/zap +[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 diff --git a/api/vendor/go.uber.org/zap/.travis.yml b/api/vendor/go.uber.org/zap/.travis.yml new file mode 100644 index 0000000..da1100b --- /dev/null +++ b/api/vendor/go.uber.org/zap/.travis.yml @@ -0,0 +1,21 @@ +language: go +sudo: false +go: + - "1.9" + - "1.10" +go_import_path: go.uber.org/zap +env: + global: + - TEST_TIMEOUT_SCALE=10 +cache: + directories: + - vendor +install: + - make dependencies +script: + - make lint + - make test + - make bench +after_success: + - make cover + - bash <(curl -s https://codecov.io/bash) diff --git a/api/vendor/go.uber.org/zap/CHANGELOG.md b/api/vendor/go.uber.org/zap/CHANGELOG.md new file mode 100644 index 0000000..be28291 --- /dev/null +++ b/api/vendor/go.uber.org/zap/CHANGELOG.md @@ -0,0 +1,286 @@ +# Changelog + +## v1.8.0 (13 Apr 2018) + +Enhancements: +* [#508][]: Make log level configurable when redirecting the standard + library's logger. +* [#518][]: Add a logger that writes to a `*testing.TB`. +* [#577][]: Add a top-level alias for `zapcore.Field` to clean up GoDoc. + +Bugfixes: +* [#574][]: Add a missing import comment to `go.uber.org/zap/buffer`. + +Thanks to @DiSiqueira and @djui for their contributions to this release. + +## v1.7.1 (25 Sep 2017) + +Bugfixes: +* [#504][]: Store strings when using AddByteString with the map encoder. + +## v1.7.0 (21 Sep 2017) + +Enhancements: + +* [#487][]: Add `NewStdLogAt`, which extends `NewStdLog` by allowing the user + to specify the level of the logged messages. + +## v1.6.0 (30 Aug 2017) + +Enhancements: + +* [#491][]: Omit zap stack frames from stacktraces. +* [#490][]: Add a `ContextMap` method to observer logs for simpler + field validation in tests. + +## v1.5.0 (22 Jul 2017) + +Enhancements: + +* [#460][] and [#470][]: Support errors produced by `go.uber.org/multierr`. +* [#465][]: Support user-supplied encoders for logger names. + +Bugfixes: + +* [#477][]: Fix a bug that incorrectly truncated deep stacktraces. + +Thanks to @richard-tunein and @pavius for their contributions to this release. + +## v1.4.1 (08 Jun 2017) + +This release fixes two bugs. + +Bugfixes: + +* [#435][]: Support a variety of case conventions when unmarshaling levels. +* [#444][]: Fix a panic in the observer. + +## v1.4.0 (12 May 2017) + +This release adds a few small features and is fully backward-compatible. + +Enhancements: + +* [#424][]: Add a `LineEnding` field to `EncoderConfig`, allowing users to + override the Unix-style default. +* [#425][]: Preserve time zones when logging times. +* [#431][]: Make `zap.AtomicLevel` implement `fmt.Stringer`, which makes a + variety of operations a bit simpler. + +## v1.3.0 (25 Apr 2017) + +This release adds an enhancement to zap's testing helpers as well as the +ability to marshal an AtomicLevel. It is fully backward-compatible. + +Enhancements: + +* [#415][]: Add a substring-filtering helper to zap's observer. This is + particularly useful when testing the `SugaredLogger`. +* [#416][]: Make `AtomicLevel` implement `encoding.TextMarshaler`. + +## v1.2.0 (13 Apr 2017) + +This release adds a gRPC compatibility wrapper. It is fully backward-compatible. + +Enhancements: + +* [#402][]: Add a `zapgrpc` package that wraps zap's Logger and implements + `grpclog.Logger`. + +## v1.1.0 (31 Mar 2017) + +This release fixes two bugs and adds some enhancements to zap's testing helpers. +It is fully backward-compatible. + +Bugfixes: + +* [#385][]: Fix caller path trimming on Windows. +* [#396][]: Fix a panic when attempting to use non-existent directories with + zap's configuration struct. + +Enhancements: + +* [#386][]: Add filtering helpers to zaptest's observing logger. + +Thanks to @moitias for contributing to this release. + +## v1.0.0 (14 Mar 2017) + +This is zap's first stable release. All exported APIs are now final, and no +further breaking changes will be made in the 1.x release series. Anyone using a +semver-aware dependency manager should now pin to `^1`. + +Breaking changes: + +* [#366][]: Add byte-oriented APIs to encoders to log UTF-8 encoded text without + casting from `[]byte` to `string`. +* [#364][]: To support buffering outputs, add `Sync` methods to `zapcore.Core`, + `zap.Logger`, and `zap.SugaredLogger`. +* [#371][]: Rename the `testutils` package to `zaptest`, which is less likely to + clash with other testing helpers. + +Bugfixes: + +* [#362][]: Make the ISO8601 time formatters fixed-width, which is friendlier + for tab-separated console output. +* [#369][]: Remove the automatic locks in `zapcore.NewCore`, which allows zap to + work with concurrency-safe `WriteSyncer` implementations. +* [#347][]: Stop reporting errors when trying to `fsync` standard out on Linux + systems. +* [#373][]: Report the correct caller from zap's standard library + interoperability wrappers. + +Enhancements: + +* [#348][]: Add a registry allowing third-party encodings to work with zap's + built-in `Config`. +* [#327][]: Make the representation of logger callers configurable (like times, + levels, and durations). +* [#376][]: Allow third-party encoders to use their own buffer pools, which + removes the last performance advantage that zap's encoders have over plugins. +* [#346][]: Add `CombineWriteSyncers`, a convenience function to tee multiple + `WriteSyncer`s and lock the result. +* [#365][]: Make zap's stacktraces compatible with mid-stack inlining (coming in + Go 1.9). +* [#372][]: Export zap's observing logger as `zaptest/observer`. This makes it + easier for particularly punctilious users to unit test their application's + logging. + +Thanks to @suyash, @htrendev, @flisky, @Ulexus, and @skipor for their +contributions to this release. + +## v1.0.0-rc.3 (7 Mar 2017) + +This is the third release candidate for zap's stable release. There are no +breaking changes. + +Bugfixes: + +* [#339][]: Byte slices passed to `zap.Any` are now correctly treated as binary blobs + rather than `[]uint8`. + +Enhancements: + +* [#307][]: Users can opt into colored output for log levels. +* [#353][]: In addition to hijacking the output of the standard library's + package-global logging functions, users can now construct a zap-backed + `log.Logger` instance. +* [#311][]: Frames from common runtime functions and some of zap's internal + machinery are now omitted from stacktraces. + +Thanks to @ansel1 and @suyash for their contributions to this release. + +## v1.0.0-rc.2 (21 Feb 2017) + +This is the second release candidate for zap's stable release. It includes two +breaking changes. + +Breaking changes: + +* [#316][]: Zap's global loggers are now fully concurrency-safe + (previously, users had to ensure that `ReplaceGlobals` was called before the + loggers were in use). However, they must now be accessed via the `L()` and + `S()` functions. Users can update their projects with + + ``` + gofmt -r "zap.L -> zap.L()" -w . + gofmt -r "zap.S -> zap.S()" -w . + ``` +* [#309][] and [#317][]: RC1 was mistakenly shipped with invalid + JSON and YAML struct tags on all config structs. This release fixes the tags + and adds static analysis to prevent similar bugs in the future. + +Bugfixes: + +* [#321][]: Redirecting the standard library's `log` output now + correctly reports the logger's caller. + +Enhancements: + +* [#325][] and [#333][]: Zap now transparently supports non-standard, rich + errors like those produced by `github.com/pkg/errors`. +* [#326][]: Though `New(nil)` continues to return a no-op logger, `NewNop()` is + now preferred. Users can update their projects with `gofmt -r 'zap.New(nil) -> + zap.NewNop()' -w .`. +* [#300][]: Incorrectly importing zap as `github.com/uber-go/zap` now returns a + more informative error. + +Thanks to @skipor and @chapsuk for their contributions to this release. + +## v1.0.0-rc.1 (14 Feb 2017) + +This is the first release candidate for zap's stable release. There are multiple +breaking changes and improvements from the pre-release version. Most notably: + +* **Zap's import path is now "go.uber.org/zap"** — all users will + need to update their code. +* User-facing types and functions remain in the `zap` package. Code relevant + largely to extension authors is now in the `zapcore` package. +* The `zapcore.Core` type makes it easy for third-party packages to use zap's + internals but provide a different user-facing API. +* `Logger` is now a concrete type instead of an interface. +* A less verbose (though slower) logging API is included by default. +* Package-global loggers `L` and `S` are included. +* A human-friendly console encoder is included. +* A declarative config struct allows common logger configurations to be managed + as configuration instead of code. +* Sampling is more accurate, and doesn't depend on the standard library's shared + timer heap. + +## v0.1.0-beta.1 (6 Feb 2017) + +This is a minor version, tagged to allow users to pin to the pre-1.0 APIs and +upgrade at their leisure. Since this is the first tagged release, there are no +backward compatibility concerns and all functionality is new. + +Early zap adopters should pin to the 0.1.x minor version until they're ready to +upgrade to the upcoming stable release. + +[#316]: https://github.com/uber-go/zap/pull/316 +[#309]: https://github.com/uber-go/zap/pull/309 +[#317]: https://github.com/uber-go/zap/pull/317 +[#321]: https://github.com/uber-go/zap/pull/321 +[#325]: https://github.com/uber-go/zap/pull/325 +[#333]: https://github.com/uber-go/zap/pull/333 +[#326]: https://github.com/uber-go/zap/pull/326 +[#300]: https://github.com/uber-go/zap/pull/300 +[#339]: https://github.com/uber-go/zap/pull/339 +[#307]: https://github.com/uber-go/zap/pull/307 +[#353]: https://github.com/uber-go/zap/pull/353 +[#311]: https://github.com/uber-go/zap/pull/311 +[#366]: https://github.com/uber-go/zap/pull/366 +[#364]: https://github.com/uber-go/zap/pull/364 +[#371]: https://github.com/uber-go/zap/pull/371 +[#362]: https://github.com/uber-go/zap/pull/362 +[#369]: https://github.com/uber-go/zap/pull/369 +[#347]: https://github.com/uber-go/zap/pull/347 +[#373]: https://github.com/uber-go/zap/pull/373 +[#348]: https://github.com/uber-go/zap/pull/348 +[#327]: https://github.com/uber-go/zap/pull/327 +[#376]: https://github.com/uber-go/zap/pull/376 +[#346]: https://github.com/uber-go/zap/pull/346 +[#365]: https://github.com/uber-go/zap/pull/365 +[#372]: https://github.com/uber-go/zap/pull/372 +[#385]: https://github.com/uber-go/zap/pull/385 +[#396]: https://github.com/uber-go/zap/pull/396 +[#386]: https://github.com/uber-go/zap/pull/386 +[#402]: https://github.com/uber-go/zap/pull/402 +[#415]: https://github.com/uber-go/zap/pull/415 +[#416]: https://github.com/uber-go/zap/pull/416 +[#424]: https://github.com/uber-go/zap/pull/424 +[#425]: https://github.com/uber-go/zap/pull/425 +[#431]: https://github.com/uber-go/zap/pull/431 +[#435]: https://github.com/uber-go/zap/pull/435 +[#444]: https://github.com/uber-go/zap/pull/444 +[#477]: https://github.com/uber-go/zap/pull/477 +[#465]: https://github.com/uber-go/zap/pull/465 +[#460]: https://github.com/uber-go/zap/pull/460 +[#470]: https://github.com/uber-go/zap/pull/470 +[#487]: https://github.com/uber-go/zap/pull/487 +[#490]: https://github.com/uber-go/zap/pull/490 +[#491]: https://github.com/uber-go/zap/pull/491 +[#504]: https://github.com/uber-go/zap/pull/504 +[#508]: https://github.com/uber-go/zap/pull/508 +[#518]: https://github.com/uber-go/zap/pull/518 +[#577]: https://github.com/uber-go/zap/pull/577 +[#574]: https://github.com/uber-go/zap/pull/574 diff --git a/api/vendor/go.uber.org/zap/CODE_OF_CONDUCT.md b/api/vendor/go.uber.org/zap/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..e327d9a --- /dev/null +++ b/api/vendor/go.uber.org/zap/CODE_OF_CONDUCT.md @@ -0,0 +1,75 @@ +# 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, 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 oss-conduct@uber.com. The project +team will review and investigate all complaints, and will respond in a way +that it deems 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 +[http://contributor-covenant.org/version/1/4][version]. + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/api/vendor/go.uber.org/zap/CONTRIBUTING.md b/api/vendor/go.uber.org/zap/CONTRIBUTING.md new file mode 100644 index 0000000..9454bba --- /dev/null +++ b/api/vendor/go.uber.org/zap/CONTRIBUTING.md @@ -0,0 +1,81 @@ +# Contributing + +We'd love your help making zap the very best structured logging library in Go! + +If you'd like to add new exported APIs, please [open an issue][open-issue] +describing your proposal — discussing API changes ahead of time makes +pull request review much smoother. In your issue, pull request, and any other +communications, please remember to treat your fellow contributors with +respect! We take our [code of conduct](CODE_OF_CONDUCT.md) seriously. + +Note that you'll need to sign [Uber's Contributor License Agreement][cla] +before we can accept any of your contributions. If necessary, a bot will remind +you to accept the CLA when you open your pull request. + +## Setup + +[Fork][fork], then clone the repository: + +``` +mkdir -p $GOPATH/src/go.uber.org +cd $GOPATH/src/go.uber.org +git clone git@github.com:your_github_username/zap.git +cd zap +git remote add upstream https://github.com/uber-go/zap.git +git fetch upstream +``` + +Install zap's dependencies: + +``` +make dependencies +``` + +Make sure that the tests and the linters pass: + +``` +make test +make lint +``` + +If you're not using the minor version of Go specified in the Makefile's +`LINTABLE_MINOR_VERSIONS` variable, `make lint` doesn't do anything. This is +fine, but it means that you'll only discover lint failures after you open your +pull request. + +## Making Changes + +Start by creating a new branch for your changes: + +``` +cd $GOPATH/src/go.uber.org/zap +git checkout master +git fetch upstream +git rebase upstream/master +git checkout -b cool_new_feature +``` + +Make your changes, then ensure that `make lint` and `make test` still pass. If +you're satisfied with your changes, push them to your fork. + +``` +git push origin cool_new_feature +``` + +Then use the GitHub UI to open a pull request. + +At this point, you're waiting on us to review your changes. We *try* to respond +to issues and pull requests within a few business days, and we may suggest some +improvements or alternatives. Once your changes are approved, one of the +project maintainers will merge them. + +We're much more likely to approve your changes if you: + +* Add tests for new functionality. +* Write a [good commit message][commit-message]. +* Maintain backward compatibility. + +[fork]: https://github.com/uber-go/zap/fork +[open-issue]: https://github.com/uber-go/zap/issues/new +[cla]: https://cla-assistant.io/uber-go/zap +[commit-message]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html diff --git a/api/vendor/go.uber.org/zap/FAQ.md b/api/vendor/go.uber.org/zap/FAQ.md new file mode 100644 index 0000000..90ddfe1 --- /dev/null +++ b/api/vendor/go.uber.org/zap/FAQ.md @@ -0,0 +1,154 @@ +# Frequently Asked Questions + +## Design + +### Why spend so much effort on logger performance? + +Of course, most applications won't notice the impact of a slow logger: they +already take tens or hundreds of milliseconds for each operation, so an extra +millisecond doesn't matter. + +On the other hand, why *not* make structured logging fast? The `SugaredLogger` +isn't any harder to use than other logging packages, and the `Logger` makes +structured logging possible in performance-sensitive contexts. Across a fleet +of Go microservices, making each application even slightly more efficient adds +up quickly. + +### Why aren't `Logger` and `SugaredLogger` interfaces? + +Unlike the familiar `io.Writer` and `http.Handler`, `Logger` and +`SugaredLogger` interfaces would include *many* methods. As [Rob Pike points +out][go-proverbs], "The bigger the interface, the weaker the abstraction." +Interfaces are also rigid — *any* change requires releasing a new major +version, since it breaks all third-party implementations. + +Making the `Logger` and `SugaredLogger` concrete types doesn't sacrifice much +abstraction, and it lets us add methods without introducing breaking changes. +Your applications should define and depend upon an interface that includes +just the methods you use. + +### Why sample application logs? + +Applications often experience runs of errors, either because of a bug or +because of a misbehaving user. Logging errors is usually a good idea, but it +can easily make this bad situation worse: not only is your application coping +with a flood of errors, it's also spending extra CPU cycles and I/O logging +those errors. Since writes are typically serialized, logging limits throughput +when you need it most. + +Sampling fixes this problem by dropping repetitive log entries. Under normal +conditions, your application writes out every entry. When similar entries are +logged hundreds or thousands of times each second, though, zap begins dropping +duplicates to preserve throughput. + +### Why do the structured logging APIs take a message in addition to fields? + +Subjectively, we find it helpful to accompany structured context with a brief +description. This isn't critical during development, but it makes debugging +and operating unfamiliar systems much easier. + +More concretely, zap's sampling algorithm uses the message to identify +duplicate entries. In our experience, this is a practical middle ground +between random sampling (which often drops the exact entry that you need while +debugging) and hashing the complete entry (which is prohibitively expensive). + +### Why include package-global loggers? + +Since so many other logging packages include a global logger, many +applications aren't designed to accept loggers as explicit parameters. +Changing function signatures is often a breaking change, so zap includes +global loggers to simplify migration. + +Avoid them where possible. + +### Why include dedicated Panic and Fatal log levels? + +In general, application code should handle errors gracefully instead of using +`panic` or `os.Exit`. However, every rule has exceptions, and it's common to +crash when an error is truly unrecoverable. To avoid losing any information +— especially the reason for the crash — the logger must flush any +buffered entries before the process exits. + +Zap makes this easy by offering `Panic` and `Fatal` logging methods that +automatically flush before exiting. Of course, this doesn't guarantee that +logs will never be lost, but it eliminates a common error. + +See the discussion in uber-go/zap#207 for more details. + +### What's `DPanic`? + +`DPanic` stands for "panic in development." In development, it logs at +`PanicLevel`; otherwise, it logs at `ErrorLevel`. `DPanic` makes it easier to +catch errors that are theoretically possible, but shouldn't actually happen, +*without* crashing in production. + +If you've ever written code like this, you need `DPanic`: + +```go +if err != nil { + panic(fmt.Sprintf("shouldn't ever get here: %v", err)) +} +``` + +## Installation + +### What does the error `expects import "go.uber.org/zap"` mean? + +Either zap was installed incorrectly or you're referencing the wrong package +name in your code. + +Zap's source code happens to be hosted on GitHub, but the [import +path][import-path] is `go.uber.org/zap`. This gives us, the project +maintainers, the freedom to move the source code if necessary. However, it +means that you need to take a little care when installing and using the +package. + +If you follow two simple rules, everything should work: install zap with `go +get -u go.uber.org/zap`, and always import it in your code with `import +"go.uber.org/zap"`. Your code shouldn't contain *any* references to +`github.com/uber-go/zap`. + +## Usage + +### Does zap support log rotation? + +Zap doesn't natively support rotating log files, since we prefer to leave this +to an external program like `logrotate`. + +However, it's easy to integrate a log rotation package like +[`gopkg.in/natefinch/lumberjack.v2`][lumberjack] as a `zapcore.WriteSyncer`. + +```go +// lumberjack.Logger is already safe for concurrent use, so we don't need to +// lock it. +w := zapcore.AddSync(&lumberjack.Logger{ + Filename: "/var/log/myapp/foo.log", + MaxSize: 500, // megabytes + MaxBackups: 3, + MaxAge: 28, // days +}) +core := zapcore.NewCore( + zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()), + w, + zap.InfoLevel, +) +logger := zap.New(core) +``` + +## Extensions + +We'd love to support every logging need within zap itself, but we're only +familiar with a handful of log ingestion systems, flag-parsing packages, and +the like. Rather than merging code that we can't effectively debug and +support, we'd rather grow an ecosystem of zap extensions. + +We're aware of the following extensions, but haven't used them ourselves: + +| Package | Integration | +| --- | --- | +| `github.com/tchap/zapext` | Sentry, syslog | +| `github.com/fgrosse/zaptest` | Ginkgo | + +[go-proverbs]: https://go-proverbs.github.io/ +[import-path]: https://golang.org/cmd/go/#hdr-Remote_import_paths +[lumberjack]: https://godoc.org/gopkg.in/natefinch/lumberjack.v2 diff --git a/api/vendor/go.uber.org/zap/LICENSE.txt b/api/vendor/go.uber.org/zap/LICENSE.txt new file mode 100644 index 0000000..6652bed --- /dev/null +++ b/api/vendor/go.uber.org/zap/LICENSE.txt @@ -0,0 +1,19 @@ +Copyright (c) 2016-2017 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. diff --git a/api/vendor/go.uber.org/zap/Makefile b/api/vendor/go.uber.org/zap/Makefile new file mode 100644 index 0000000..ef7893b --- /dev/null +++ b/api/vendor/go.uber.org/zap/Makefile @@ -0,0 +1,76 @@ +export GO15VENDOREXPERIMENT=1 + +BENCH_FLAGS ?= -cpuprofile=cpu.pprof -memprofile=mem.pprof -benchmem +PKGS ?= $(shell glide novendor) +# Many Go tools take file globs or directories as arguments instead of packages. +PKG_FILES ?= *.go zapcore benchmarks buffer zapgrpc zaptest zaptest/observer internal/bufferpool internal/exit internal/color internal/ztest + +# The linting tools evolve with each Go version, so run them only on the latest +# stable release. +GO_VERSION := $(shell go version | cut -d " " -f 3) +GO_MINOR_VERSION := $(word 2,$(subst ., ,$(GO_VERSION))) +LINTABLE_MINOR_VERSIONS := 10 +ifneq ($(filter $(LINTABLE_MINOR_VERSIONS),$(GO_MINOR_VERSION)),) +SHOULD_LINT := true +endif + + +.PHONY: all +all: lint test + +.PHONY: dependencies +dependencies: + @echo "Installing Glide and locked dependencies..." + glide --version || go get -u -f github.com/Masterminds/glide + glide install + @echo "Installing test dependencies..." + go install ./vendor/github.com/axw/gocov/gocov + go install ./vendor/github.com/mattn/goveralls +ifdef SHOULD_LINT + @echo "Installing golint..." + go install ./vendor/github.com/golang/lint/golint +else + @echo "Not installing golint, since we don't expect to lint on" $(GO_VERSION) +endif + +# Disable printf-like invocation checking due to testify.assert.Error() +VET_RULES := -printf=false + +.PHONY: lint +lint: +ifdef SHOULD_LINT + @rm -rf lint.log + @echo "Checking formatting..." + @gofmt -d -s $(PKG_FILES) 2>&1 | tee lint.log + @echo "Installing test dependencies for vet..." + @go test -i $(PKGS) + @echo "Checking vet..." + @$(foreach dir,$(PKG_FILES),go tool vet $(VET_RULES) $(dir) 2>&1 | tee -a lint.log;) + @echo "Checking lint..." + @$(foreach dir,$(PKGS),golint $(dir) 2>&1 | tee -a lint.log;) + @echo "Checking for unresolved FIXMEs..." + @git grep -i fixme | grep -v -e vendor -e Makefile | tee -a lint.log + @echo "Checking for license headers..." + @./check_license.sh | tee -a lint.log + @[ ! -s lint.log ] +else + @echo "Skipping linters on" $(GO_VERSION) +endif + +.PHONY: test +test: + go test -race $(PKGS) + +.PHONY: cover +cover: + ./scripts/cover.sh $(PKGS) + +.PHONY: bench +BENCH ?= . +bench: + @$(foreach pkg,$(PKGS),go test -bench=$(BENCH) -run="^$$" $(BENCH_FLAGS) $(pkg);) + +.PHONY: updatereadme +updatereadme: + rm -f README.md + cat .readme.tmpl | go run internal/readme/readme.go > README.md diff --git a/api/vendor/go.uber.org/zap/README.md b/api/vendor/go.uber.org/zap/README.md new file mode 100644 index 0000000..4b2bb9d --- /dev/null +++ b/api/vendor/go.uber.org/zap/README.md @@ -0,0 +1,136 @@ +# :zap: zap [![GoDoc][doc-img]][doc] [![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov] + +Blazing fast, structured, leveled logging in Go. + +## Installation + +`go get -u go.uber.org/zap` + +Note that zap only supports the two most recent minor versions of Go. + +## Quick Start + +In contexts where performance is nice, but not critical, use the +`SugaredLogger`. It's 4-10x faster than than other structured logging +packages and includes both structured and `printf`-style APIs. + +```go +logger, _ := zap.NewProduction() +defer logger.Sync() // flushes buffer, if any +sugar := logger.Sugar() +sugar.Infow("failed to fetch URL", + // Structured context as loosely typed key-value pairs. + "url", url, + "attempt", 3, + "backoff", time.Second, +) +sugar.Infof("Failed to fetch URL: %s", url) +``` + +When performance and type safety are critical, use the `Logger`. It's even +faster than the `SugaredLogger` and allocates far less, but it only supports +structured logging. + +```go +logger, _ := zap.NewProduction() +defer logger.Sync() +logger.Info("failed to fetch URL", + // Structured context as strongly typed Field values. + zap.String("url", url), + zap.Int("attempt", 3), + zap.Duration("backoff", time.Second), +) +``` + +See the [documentation][doc] and [FAQ](FAQ.md) for more details. + +## Performance + +For applications that log in the hot path, reflection-based serialization and +string formatting are prohibitively expensive — they're CPU-intensive +and make many small allocations. Put differently, using `encoding/json` and +`fmt.Fprintf` to log tons of `interface{}`s makes your application slow. + +Zap takes a different approach. It includes a reflection-free, zero-allocation +JSON encoder, and the base `Logger` strives to avoid serialization overhead +and allocations wherever possible. By building the high-level `SugaredLogger` +on that foundation, zap lets users *choose* when they need to count every +allocation and when they'd prefer a more familiar, loosely typed API. + +As measured by its own [benchmarking suite][], not only is zap more performant +than comparable structured logging packages — it's also faster than the +standard library. Like all benchmarks, take these with a grain of salt.[1](#footnote-versions) + +Log a message and 10 fields: + +| Package | Time | Objects Allocated | +| :--- | :---: | :---: | +| :zap: zap | 3131 ns/op | 5 allocs/op | +| :zap: zap (sugared) | 4173 ns/op | 21 allocs/op | +| zerolog | 16154 ns/op | 90 allocs/op | +| lion | 16341 ns/op | 111 allocs/op | +| go-kit | 17049 ns/op | 126 allocs/op | +| logrus | 23662 ns/op | 142 allocs/op | +| log15 | 36351 ns/op | 149 allocs/op | +| apex/log | 42530 ns/op | 126 allocs/op | + +Log a message with a logger that already has 10 fields of context: + +| Package | Time | Objects Allocated | +| :--- | :---: | :---: | +| :zap: zap | 380 ns/op | 0 allocs/op | +| :zap: zap (sugared) | 564 ns/op | 2 allocs/op | +| zerolog | 321 ns/op | 0 allocs/op | +| lion | 7092 ns/op | 39 allocs/op | +| go-kit | 20226 ns/op | 115 allocs/op | +| logrus | 22312 ns/op | 130 allocs/op | +| log15 | 28788 ns/op | 79 allocs/op | +| apex/log | 42063 ns/op | 115 allocs/op | + +Log a static string, without any context or `printf`-style templating: + +| Package | Time | Objects Allocated | +| :--- | :---: | :---: | +| :zap: zap | 361 ns/op | 0 allocs/op | +| :zap: zap (sugared) | 534 ns/op | 2 allocs/op | +| zerolog | 323 ns/op | 0 allocs/op | +| standard library | 575 ns/op | 2 allocs/op | +| go-kit | 922 ns/op | 13 allocs/op | +| lion | 1413 ns/op | 10 allocs/op | +| logrus | 2291 ns/op | 27 allocs/op | +| apex/log | 3690 ns/op | 11 allocs/op | +| log15 | 5954 ns/op | 26 allocs/op | + +## Development Status: Stable + +All APIs are finalized, and no breaking changes will be made in the 1.x series +of releases. Users of semver-aware dependency management systems should pin +zap to `^1`. + +## Contributing + +We encourage and support an active, healthy community of contributors — +including you! Details are in the [contribution guide](CONTRIBUTING.md) and +the [code of conduct](CODE_OF_CONDUCT.md). The zap maintainers keep an eye on +issues and pull requests, but you can also report any negative conduct to +oss-conduct@uber.com. That email list is a private, safe space; even the zap +maintainers don't have access, so don't hesitate to hold us to a high +standard. + +
    + +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) + +[doc-img]: https://godoc.org/go.uber.org/zap?status.svg +[doc]: https://godoc.org/go.uber.org/zap +[ci-img]: https://travis-ci.org/uber-go/zap.svg?branch=master +[ci]: https://travis-ci.org/uber-go/zap +[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 diff --git a/api/vendor/go.uber.org/zap/array.go b/api/vendor/go.uber.org/zap/array.go new file mode 100644 index 0000000..5be3704 --- /dev/null +++ b/api/vendor/go.uber.org/zap/array.go @@ -0,0 +1,320 @@ +// 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 +// 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. + +package zap + +import ( + "time" + + "go.uber.org/zap/zapcore" +) + +// Array constructs a field with the given key and ArrayMarshaler. It provides +// a flexible, but still type-safe and efficient, way to add array-like types +// to the logging context. The struct's MarshalLogArray method is called lazily. +func Array(key string, val zapcore.ArrayMarshaler) Field { + return Field{Key: key, Type: zapcore.ArrayMarshalerType, Interface: val} +} + +// Bools constructs a field that carries a slice of bools. +func Bools(key string, bs []bool) Field { + return Array(key, bools(bs)) +} + +// ByteStrings constructs a field that carries a slice of []byte, each of which +// must be UTF-8 encoded text. +func ByteStrings(key string, bss [][]byte) Field { + return Array(key, byteStringsArray(bss)) +} + +// Complex128s constructs a field that carries a slice of complex numbers. +func Complex128s(key string, nums []complex128) Field { + return Array(key, complex128s(nums)) +} + +// Complex64s constructs a field that carries a slice of complex numbers. +func Complex64s(key string, nums []complex64) Field { + return Array(key, complex64s(nums)) +} + +// Durations constructs a field that carries a slice of time.Durations. +func Durations(key string, ds []time.Duration) Field { + return Array(key, durations(ds)) +} + +// Float64s constructs a field that carries a slice of floats. +func Float64s(key string, nums []float64) Field { + return Array(key, float64s(nums)) +} + +// Float32s constructs a field that carries a slice of floats. +func Float32s(key string, nums []float32) Field { + return Array(key, float32s(nums)) +} + +// Ints constructs a field that carries a slice of integers. +func Ints(key string, nums []int) Field { + return Array(key, ints(nums)) +} + +// Int64s constructs a field that carries a slice of integers. +func Int64s(key string, nums []int64) Field { + return Array(key, int64s(nums)) +} + +// Int32s constructs a field that carries a slice of integers. +func Int32s(key string, nums []int32) Field { + return Array(key, int32s(nums)) +} + +// Int16s constructs a field that carries a slice of integers. +func Int16s(key string, nums []int16) Field { + return Array(key, int16s(nums)) +} + +// Int8s constructs a field that carries a slice of integers. +func Int8s(key string, nums []int8) Field { + return Array(key, int8s(nums)) +} + +// Strings constructs a field that carries a slice of strings. +func Strings(key string, ss []string) Field { + return Array(key, stringArray(ss)) +} + +// Times constructs a field that carries a slice of time.Times. +func Times(key string, ts []time.Time) Field { + return Array(key, times(ts)) +} + +// Uints constructs a field that carries a slice of unsigned integers. +func Uints(key string, nums []uint) Field { + return Array(key, uints(nums)) +} + +// Uint64s constructs a field that carries a slice of unsigned integers. +func Uint64s(key string, nums []uint64) Field { + return Array(key, uint64s(nums)) +} + +// Uint32s constructs a field that carries a slice of unsigned integers. +func Uint32s(key string, nums []uint32) Field { + return Array(key, uint32s(nums)) +} + +// Uint16s constructs a field that carries a slice of unsigned integers. +func Uint16s(key string, nums []uint16) Field { + return Array(key, uint16s(nums)) +} + +// Uint8s constructs a field that carries a slice of unsigned integers. +func Uint8s(key string, nums []uint8) Field { + return Array(key, uint8s(nums)) +} + +// Uintptrs constructs a field that carries a slice of pointer addresses. +func Uintptrs(key string, us []uintptr) Field { + return Array(key, uintptrs(us)) +} + +// Errors constructs a field that carries a slice of errors. +func Errors(key string, errs []error) Field { + return Array(key, errArray(errs)) +} + +type bools []bool + +func (bs bools) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range bs { + arr.AppendBool(bs[i]) + } + return nil +} + +type byteStringsArray [][]byte + +func (bss byteStringsArray) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range bss { + arr.AppendByteString(bss[i]) + } + return nil +} + +type complex128s []complex128 + +func (nums complex128s) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendComplex128(nums[i]) + } + return nil +} + +type complex64s []complex64 + +func (nums complex64s) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendComplex64(nums[i]) + } + return nil +} + +type durations []time.Duration + +func (ds durations) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range ds { + arr.AppendDuration(ds[i]) + } + return nil +} + +type float64s []float64 + +func (nums float64s) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendFloat64(nums[i]) + } + return nil +} + +type float32s []float32 + +func (nums float32s) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendFloat32(nums[i]) + } + return nil +} + +type ints []int + +func (nums ints) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendInt(nums[i]) + } + return nil +} + +type int64s []int64 + +func (nums int64s) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendInt64(nums[i]) + } + return nil +} + +type int32s []int32 + +func (nums int32s) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendInt32(nums[i]) + } + return nil +} + +type int16s []int16 + +func (nums int16s) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendInt16(nums[i]) + } + return nil +} + +type int8s []int8 + +func (nums int8s) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendInt8(nums[i]) + } + return nil +} + +type stringArray []string + +func (ss stringArray) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range ss { + arr.AppendString(ss[i]) + } + return nil +} + +type times []time.Time + +func (ts times) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range ts { + arr.AppendTime(ts[i]) + } + return nil +} + +type uints []uint + +func (nums uints) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendUint(nums[i]) + } + return nil +} + +type uint64s []uint64 + +func (nums uint64s) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendUint64(nums[i]) + } + return nil +} + +type uint32s []uint32 + +func (nums uint32s) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendUint32(nums[i]) + } + return nil +} + +type uint16s []uint16 + +func (nums uint16s) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendUint16(nums[i]) + } + return nil +} + +type uint8s []uint8 + +func (nums uint8s) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendUint8(nums[i]) + } + return nil +} + +type uintptrs []uintptr + +func (nums uintptrs) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendUintptr(nums[i]) + } + return nil +} diff --git a/api/vendor/go.uber.org/zap/array_test.go b/api/vendor/go.uber.org/zap/array_test.go new file mode 100644 index 0000000..54116df --- /dev/null +++ b/api/vendor/go.uber.org/zap/array_test.go @@ -0,0 +1,107 @@ +// 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 +// 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. + +package zap + +import ( + "testing" + "time" + + "go.uber.org/zap/zapcore" + + "github.com/stretchr/testify/assert" +) + +func BenchmarkBoolsArrayMarshaler(b *testing.B) { + // Keep this benchmark here to capture the overhead of the ArrayMarshaler + // wrapper. + bs := make([]bool, 50) + enc := zapcore.NewJSONEncoder(zapcore.EncoderConfig{}) + b.ResetTimer() + for i := 0; i < b.N; i++ { + Bools("array", bs).AddTo(enc.Clone()) + } +} + +func BenchmarkBoolsReflect(b *testing.B) { + bs := make([]bool, 50) + enc := zapcore.NewJSONEncoder(zapcore.EncoderConfig{}) + b.ResetTimer() + for i := 0; i < b.N; i++ { + Reflect("array", bs).AddTo(enc.Clone()) + } +} + +func TestArrayWrappers(t *testing.T) { + tests := []struct { + desc string + field Field + expected []interface{} + }{ + {"empty bools", Bools("", []bool{}), []interface{}(nil)}, + {"empty byte strings", ByteStrings("", [][]byte{}), []interface{}(nil)}, + {"empty complex128s", Complex128s("", []complex128{}), []interface{}(nil)}, + {"empty complex64s", Complex64s("", []complex64{}), []interface{}(nil)}, + {"empty durations", Durations("", []time.Duration{}), []interface{}(nil)}, + {"empty float64s", Float64s("", []float64{}), []interface{}(nil)}, + {"empty float32s", Float32s("", []float32{}), []interface{}(nil)}, + {"empty ints", Ints("", []int{}), []interface{}(nil)}, + {"empty int64s", Int64s("", []int64{}), []interface{}(nil)}, + {"empty int32s", Int32s("", []int32{}), []interface{}(nil)}, + {"empty int16s", Int16s("", []int16{}), []interface{}(nil)}, + {"empty int8s", Int8s("", []int8{}), []interface{}(nil)}, + {"empty strings", Strings("", []string{}), []interface{}(nil)}, + {"empty times", Times("", []time.Time{}), []interface{}(nil)}, + {"empty uints", Uints("", []uint{}), []interface{}(nil)}, + {"empty uint64s", Uint64s("", []uint64{}), []interface{}(nil)}, + {"empty uint32s", Uint32s("", []uint32{}), []interface{}(nil)}, + {"empty uint16s", Uint16s("", []uint16{}), []interface{}(nil)}, + {"empty uint8s", Uint8s("", []uint8{}), []interface{}(nil)}, + {"empty uintptrs", Uintptrs("", []uintptr{}), []interface{}(nil)}, + {"bools", Bools("", []bool{true, false}), []interface{}{true, false}}, + {"byte strings", ByteStrings("", [][]byte{{1, 2}, {3, 4}}), []interface{}{[]byte{1, 2}, []byte{3, 4}}}, + {"complex128s", Complex128s("", []complex128{1 + 2i, 3 + 4i}), []interface{}{1 + 2i, 3 + 4i}}, + {"complex64s", Complex64s("", []complex64{1 + 2i, 3 + 4i}), []interface{}{complex64(1 + 2i), complex64(3 + 4i)}}, + {"durations", Durations("", []time.Duration{1, 2}), []interface{}{time.Nanosecond, 2 * time.Nanosecond}}, + {"float64s", Float64s("", []float64{1.2, 3.4}), []interface{}{1.2, 3.4}}, + {"float32s", Float32s("", []float32{1.2, 3.4}), []interface{}{float32(1.2), float32(3.4)}}, + {"ints", Ints("", []int{1, 2}), []interface{}{1, 2}}, + {"int64s", Int64s("", []int64{1, 2}), []interface{}{int64(1), int64(2)}}, + {"int32s", Int32s("", []int32{1, 2}), []interface{}{int32(1), int32(2)}}, + {"int16s", Int16s("", []int16{1, 2}), []interface{}{int16(1), int16(2)}}, + {"int8s", Int8s("", []int8{1, 2}), []interface{}{int8(1), int8(2)}}, + {"strings", Strings("", []string{"foo", "bar"}), []interface{}{"foo", "bar"}}, + {"times", Times("", []time.Time{time.Unix(0, 0), time.Unix(0, 0)}), []interface{}{time.Unix(0, 0), time.Unix(0, 0)}}, + {"uints", Uints("", []uint{1, 2}), []interface{}{uint(1), uint(2)}}, + {"uint64s", Uint64s("", []uint64{1, 2}), []interface{}{uint64(1), uint64(2)}}, + {"uint32s", Uint32s("", []uint32{1, 2}), []interface{}{uint32(1), uint32(2)}}, + {"uint16s", Uint16s("", []uint16{1, 2}), []interface{}{uint16(1), uint16(2)}}, + {"uint8s", Uint8s("", []uint8{1, 2}), []interface{}{uint8(1), uint8(2)}}, + {"uintptrs", Uintptrs("", []uintptr{1, 2}), []interface{}{uintptr(1), uintptr(2)}}, + } + + for _, tt := range tests { + enc := zapcore.NewMapObjectEncoder() + tt.field.Key = "k" + tt.field.AddTo(enc) + assert.Equal(t, tt.expected, enc.Fields["k"], "%s: unexpected map contents.", tt.desc) + assert.Equal(t, 1, len(enc.Fields), "%s: found extra keys in map: %v", tt.desc, enc.Fields) + } +} diff --git a/api/vendor/go.uber.org/zap/benchmarks/apex_test.go b/api/vendor/go.uber.org/zap/benchmarks/apex_test.go new file mode 100644 index 0000000..67d7646 --- /dev/null +++ b/api/vendor/go.uber.org/zap/benchmarks/apex_test.go @@ -0,0 +1,57 @@ +// 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 +// 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. + +package benchmarks + +import ( + "io/ioutil" + + "github.com/apex/log" + "github.com/apex/log/handlers/json" +) + +func newDisabledApexLog() *log.Logger { + return &log.Logger{ + Handler: json.New(ioutil.Discard), + Level: log.ErrorLevel, + } +} + +func newApexLog() *log.Logger { + return &log.Logger{ + Handler: json.New(ioutil.Discard), + Level: log.DebugLevel, + } +} + +func fakeApexFields() log.Fields { + return log.Fields{ + "int": _tenInts[0], + "ints": _tenInts, + "string": _tenStrings[0], + "strings": _tenStrings, + "time": _tenTimes[0], + "times": _tenTimes, + "user1": _oneUser, + "user2": _oneUser, + "users": _tenUsers, + "error": errExample, + } +} diff --git a/api/vendor/go.uber.org/zap/benchmarks/doc.go b/api/vendor/go.uber.org/zap/benchmarks/doc.go new file mode 100644 index 0000000..b79f79f --- /dev/null +++ b/api/vendor/go.uber.org/zap/benchmarks/doc.go @@ -0,0 +1,23 @@ +// 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 +// 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. + +// Package benchmarks contains only benchmarks comparing zap to other +// structured logging libraries. +package benchmarks diff --git a/api/vendor/go.uber.org/zap/benchmarks/kit_test.go b/api/vendor/go.uber.org/zap/benchmarks/kit_test.go new file mode 100644 index 0000000..b9da293 --- /dev/null +++ b/api/vendor/go.uber.org/zap/benchmarks/kit_test.go @@ -0,0 +1,31 @@ +// 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 +// 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. + +package benchmarks + +import ( + "io/ioutil" + + "github.com/go-kit/kit/log" +) + +func newKitLog(fields ...interface{}) log.Logger { + return log.With(log.NewJSONLogger(ioutil.Discard), fields...) +} diff --git a/api/vendor/go.uber.org/zap/benchmarks/lion_test.go b/api/vendor/go.uber.org/zap/benchmarks/lion_test.go new file mode 100644 index 0000000..6c41cb1 --- /dev/null +++ b/api/vendor/go.uber.org/zap/benchmarks/lion_test.go @@ -0,0 +1,31 @@ +// 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 +// 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. + +package benchmarks + +import ( + "io/ioutil" + + "go.pedge.io/lion" +) + +func newLion() lion.Logger { + return lion.NewLogger(lion.NewJSONWritePusher(ioutil.Discard)) +} diff --git a/api/vendor/go.uber.org/zap/benchmarks/log15_test.go b/api/vendor/go.uber.org/zap/benchmarks/log15_test.go new file mode 100644 index 0000000..70a60b3 --- /dev/null +++ b/api/vendor/go.uber.org/zap/benchmarks/log15_test.go @@ -0,0 +1,33 @@ +// 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 +// 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. + +package benchmarks + +import ( + "io/ioutil" + + "gopkg.in/inconshreveable/log15.v2" +) + +func newLog15() log15.Logger { + logger := log15.New() + logger.SetHandler(log15.StreamHandler(ioutil.Discard, log15.JsonFormat())) + return logger +} diff --git a/api/vendor/go.uber.org/zap/benchmarks/logrus_test.go b/api/vendor/go.uber.org/zap/benchmarks/logrus_test.go new file mode 100644 index 0000000..ee684a6 --- /dev/null +++ b/api/vendor/go.uber.org/zap/benchmarks/logrus_test.go @@ -0,0 +1,57 @@ +// 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 +// 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. + +package benchmarks + +import ( + "io/ioutil" + + "github.com/sirupsen/logrus" +) + +func newDisabledLogrus() *logrus.Logger { + logger := newLogrus() + logger.Level = logrus.ErrorLevel + return logger +} + +func newLogrus() *logrus.Logger { + return &logrus.Logger{ + Out: ioutil.Discard, + Formatter: new(logrus.JSONFormatter), + Hooks: make(logrus.LevelHooks), + Level: logrus.DebugLevel, + } +} + +func fakeLogrusFields() logrus.Fields { + return logrus.Fields{ + "int": _tenInts[0], + "ints": _tenInts, + "string": _tenStrings[0], + "strings": _tenStrings, + "time": _tenTimes[0], + "times": _tenTimes, + "user1": _oneUser, + "user2": _oneUser, + "users": _tenUsers, + "error": errExample, + } +} diff --git a/api/vendor/go.uber.org/zap/benchmarks/scenario_bench_test.go b/api/vendor/go.uber.org/zap/benchmarks/scenario_bench_test.go new file mode 100644 index 0000000..4e307d2 --- /dev/null +++ b/api/vendor/go.uber.org/zap/benchmarks/scenario_bench_test.go @@ -0,0 +1,614 @@ +// 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 +// 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. + +package benchmarks + +import ( + "io/ioutil" + "log" + "testing" + + "go.uber.org/zap" +) + +func BenchmarkDisabledWithoutFields(b *testing.B) { + b.Logf("Logging at a disabled level without any structured context.") + b.Run("Zap", func(b *testing.B) { + logger := newZapLogger(zap.ErrorLevel) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0)) + } + }) + }) + b.Run("Zap.Check", func(b *testing.B) { + logger := newZapLogger(zap.ErrorLevel) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + if m := logger.Check(zap.InfoLevel, getMessage(0)); m != nil { + m.Write() + } + } + }) + }) + b.Run("Zap.Sugar", func(b *testing.B) { + logger := newZapLogger(zap.ErrorLevel).Sugar() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0)) + } + }) + }) + b.Run("Zap.SugarFormatting", func(b *testing.B) { + logger := newZapLogger(zap.ErrorLevel).Sugar() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Infof("%v %v %v %s %v %v %v %v %v %s\n", fakeFmtArgs()...) + } + }) + }) + b.Run("apex/log", func(b *testing.B) { + logger := newDisabledApexLog() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0)) + } + }) + }) + b.Run("sirupsen/logrus", func(b *testing.B) { + logger := newDisabledLogrus() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0)) + } + }) + }) + b.Run("rs/zerolog", func(b *testing.B) { + logger := newDisabledZerolog() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info().Msg(getMessage(0)) + } + }) + }) +} + +func BenchmarkDisabledAccumulatedContext(b *testing.B) { + b.Logf("Logging at a disabled level with some accumulated context.") + b.Run("Zap", func(b *testing.B) { + logger := newZapLogger(zap.ErrorLevel).With(fakeFields()...) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0)) + } + }) + }) + b.Run("Zap.Check", func(b *testing.B) { + logger := newZapLogger(zap.ErrorLevel).With(fakeFields()...) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + if m := logger.Check(zap.InfoLevel, getMessage(0)); m != nil { + m.Write() + } + } + }) + }) + b.Run("Zap.Sugar", func(b *testing.B) { + logger := newZapLogger(zap.ErrorLevel).With(fakeFields()...).Sugar() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0)) + } + }) + }) + b.Run("Zap.SugarFormatting", func(b *testing.B) { + logger := newZapLogger(zap.ErrorLevel).With(fakeFields()...).Sugar() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Infof("%v %v %v %s %v %v %v %v %v %s\n", fakeFmtArgs()...) + } + }) + }) + b.Run("apex/log", func(b *testing.B) { + logger := newDisabledApexLog().WithFields(fakeApexFields()) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0)) + } + }) + }) + b.Run("sirupsen/logrus", func(b *testing.B) { + logger := newDisabledLogrus().WithFields(fakeLogrusFields()) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0)) + } + }) + }) + b.Run("rs/zerolog", func(b *testing.B) { + logger := fakeZerologContext(newDisabledZerolog().With()).Logger() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info().Msg(getMessage(0)) + } + }) + }) +} + +func BenchmarkDisabledAddingFields(b *testing.B) { + b.Logf("Logging at a disabled level, adding context at each log site.") + b.Run("Zap", func(b *testing.B) { + logger := newZapLogger(zap.ErrorLevel) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0), fakeFields()...) + } + }) + }) + b.Run("Zap.Check", func(b *testing.B) { + logger := newZapLogger(zap.ErrorLevel) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + if m := logger.Check(zap.InfoLevel, getMessage(0)); m != nil { + m.Write(fakeFields()...) + } + } + }) + }) + b.Run("Zap.Sugar", func(b *testing.B) { + logger := newZapLogger(zap.ErrorLevel).Sugar() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Infow(getMessage(0), fakeSugarFields()...) + } + }) + }) + b.Run("apex/log", func(b *testing.B) { + logger := newDisabledApexLog() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.WithFields(fakeApexFields()).Info(getMessage(0)) + } + }) + }) + b.Run("sirupsen/logrus", func(b *testing.B) { + logger := newDisabledLogrus() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.WithFields(fakeLogrusFields()).Info(getMessage(0)) + } + }) + }) + b.Run("rs/zerolog", func(b *testing.B) { + logger := newDisabledZerolog() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + fakeZerologFields(logger.Info()).Msg(getMessage(0)) + } + }) + }) +} + +func BenchmarkWithoutFields(b *testing.B) { + b.Logf("Logging without any structured context.") + b.Run("Zap", func(b *testing.B) { + logger := newZapLogger(zap.DebugLevel) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0)) + } + }) + }) + b.Run("Zap.Check", func(b *testing.B) { + logger := newZapLogger(zap.DebugLevel) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + if ce := logger.Check(zap.InfoLevel, getMessage(0)); ce != nil { + ce.Write() + } + } + }) + }) + b.Run("Zap.CheckSampled", func(b *testing.B) { + logger := newSampledLogger(zap.DebugLevel) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + i := 0 + for pb.Next() { + i++ + if ce := logger.Check(zap.InfoLevel, getMessage(i)); ce != nil { + ce.Write() + } + } + }) + }) + b.Run("Zap.Sugar", func(b *testing.B) { + logger := newZapLogger(zap.DebugLevel).Sugar() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0)) + } + }) + }) + b.Run("Zap.SugarFormatting", func(b *testing.B) { + logger := newZapLogger(zap.DebugLevel).Sugar() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Infof("%v %v %v %s %v %v %v %v %v %s\n", fakeFmtArgs()...) + } + }) + }) + b.Run("apex/log", func(b *testing.B) { + logger := newApexLog() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0)) + } + }) + }) + b.Run("go-kit/kit/log", func(b *testing.B) { + logger := newKitLog() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Log(getMessage(0), getMessage(1)) + } + }) + }) + b.Run("inconshreveable/log15", func(b *testing.B) { + logger := newLog15() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0)) + } + }) + }) + b.Run("sirupsen/logrus", func(b *testing.B) { + logger := newLogrus() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0)) + } + }) + }) + b.Run("go.pedge.io/lion", func(b *testing.B) { + logger := newLion() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Printf(getMessage(0)) + } + }) + }) + b.Run("stdlib.Println", func(b *testing.B) { + logger := log.New(ioutil.Discard, "", log.LstdFlags) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Println(getMessage(0)) + } + }) + }) + b.Run("stdlib.Printf", func(b *testing.B) { + logger := log.New(ioutil.Discard, "", log.LstdFlags) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Printf("%v %v %v %s %v %v %v %v %v %s\n", fakeFmtArgs()...) + } + }) + }) + b.Run("rs/zerolog", func(b *testing.B) { + logger := newZerolog() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info().Msg(getMessage(0)) + } + }) + }) + b.Run("rs/zerolog.Formatting", func(b *testing.B) { + logger := newZerolog() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info().Msgf("%v %v %v %s %v %v %v %v %v %s\n", fakeFmtArgs()...) + } + }) + }) + b.Run("rs/zerolog.Check", func(b *testing.B) { + logger := newZerolog() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + if e := logger.Info(); e.Enabled() { + e.Msg(getMessage(0)) + } + } + }) + }) +} + +func BenchmarkAccumulatedContext(b *testing.B) { + b.Logf("Logging with some accumulated context.") + b.Run("Zap", func(b *testing.B) { + logger := newZapLogger(zap.DebugLevel).With(fakeFields()...) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0)) + } + }) + }) + b.Run("Zap.Check", func(b *testing.B) { + logger := newZapLogger(zap.DebugLevel).With(fakeFields()...) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + if ce := logger.Check(zap.InfoLevel, getMessage(0)); ce != nil { + ce.Write() + } + } + }) + }) + b.Run("Zap.CheckSampled", func(b *testing.B) { + logger := newSampledLogger(zap.DebugLevel).With(fakeFields()...) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + i := 0 + for pb.Next() { + i++ + if ce := logger.Check(zap.InfoLevel, getMessage(i)); ce != nil { + ce.Write() + } + } + }) + }) + b.Run("Zap.Sugar", func(b *testing.B) { + logger := newZapLogger(zap.DebugLevel).With(fakeFields()...).Sugar() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0)) + } + }) + }) + b.Run("Zap.SugarFormatting", func(b *testing.B) { + logger := newZapLogger(zap.DebugLevel).With(fakeFields()...).Sugar() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Infof("%v %v %v %s %v %v %v %v %v %s\n", fakeFmtArgs()...) + } + }) + }) + b.Run("apex/log", func(b *testing.B) { + logger := newApexLog().WithFields(fakeApexFields()) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0)) + } + }) + }) + b.Run("go-kit/kit/log", func(b *testing.B) { + logger := newKitLog(fakeSugarFields()...) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Log(getMessage(0), getMessage(1)) + } + }) + }) + b.Run("inconshreveable/log15", func(b *testing.B) { + logger := newLog15().New(fakeSugarFields()) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0)) + } + }) + }) + b.Run("sirupsen/logrus", func(b *testing.B) { + logger := newLogrus().WithFields(fakeLogrusFields()) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0)) + } + }) + }) + b.Run("go.pedge.io/lion", func(b *testing.B) { + logger := newLion().WithFields(fakeLogrusFields()) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Infof(getMessage(0)) + } + }) + }) + b.Run("rs/zerolog", func(b *testing.B) { + logger := fakeZerologContext(newZerolog().With()).Logger() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info().Msg(getMessage(0)) + } + }) + }) + b.Run("rs/zerolog.Check", func(b *testing.B) { + logger := fakeZerologContext(newZerolog().With()).Logger() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + if e := logger.Info(); e.Enabled() { + e.Msg(getMessage(0)) + } + } + }) + }) + b.Run("rs/zerolog.Formatting", func(b *testing.B) { + logger := fakeZerologContext(newZerolog().With()).Logger() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info().Msgf("%v %v %v %s %v %v %v %v %v %s\n", fakeFmtArgs()...) + } + }) + }) +} + +func BenchmarkAddingFields(b *testing.B) { + b.Logf("Logging with additional context at each log site.") + b.Run("Zap", func(b *testing.B) { + logger := newZapLogger(zap.DebugLevel) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0), fakeFields()...) + } + }) + }) + b.Run("Zap.Check", func(b *testing.B) { + logger := newZapLogger(zap.DebugLevel) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + if ce := logger.Check(zap.InfoLevel, getMessage(0)); ce != nil { + ce.Write(fakeFields()...) + } + } + }) + }) + b.Run("Zap.CheckSampled", func(b *testing.B) { + logger := newSampledLogger(zap.DebugLevel) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + i := 0 + for pb.Next() { + i++ + if ce := logger.Check(zap.InfoLevel, getMessage(i)); ce != nil { + ce.Write(fakeFields()...) + } + } + }) + }) + b.Run("Zap.Sugar", func(b *testing.B) { + logger := newZapLogger(zap.DebugLevel).Sugar() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Infow(getMessage(0), fakeSugarFields()...) + } + }) + }) + b.Run("apex/log", func(b *testing.B) { + logger := newApexLog() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.WithFields(fakeApexFields()).Info(getMessage(0)) + } + }) + }) + b.Run("go-kit/kit/log", func(b *testing.B) { + logger := newKitLog() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Log(fakeSugarFields()...) + } + }) + }) + b.Run("inconshreveable/log15", func(b *testing.B) { + logger := newLog15() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info(getMessage(0), fakeSugarFields()...) + } + }) + }) + b.Run("sirupsen/logrus", func(b *testing.B) { + logger := newLogrus() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.WithFields(fakeLogrusFields()).Info(getMessage(0)) + } + }) + }) + b.Run("go.pedge.io/lion", func(b *testing.B) { + logger := newLion() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.WithFields(fakeLogrusFields()).Infof(getMessage(0)) + } + }) + }) + b.Run("rs/zerolog", func(b *testing.B) { + logger := newZerolog() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + fakeZerologFields(logger.Info()).Msg(getMessage(0)) + } + }) + }) + b.Run("rs/zerolog.Check", func(b *testing.B) { + logger := newZerolog() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + if e := logger.Info(); e.Enabled() { + fakeZerologFields(e).Msg(getMessage(0)) + } + } + }) + }) +} diff --git a/api/vendor/go.uber.org/zap/benchmarks/zap_test.go b/api/vendor/go.uber.org/zap/benchmarks/zap_test.go new file mode 100644 index 0000000..92f7120 --- /dev/null +++ b/api/vendor/go.uber.org/zap/benchmarks/zap_test.go @@ -0,0 +1,172 @@ +// 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 +// 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. + +package benchmarks + +import ( + "errors" + "fmt" + "time" + + "go.uber.org/multierr" + "go.uber.org/zap" + "go.uber.org/zap/internal/ztest" + "go.uber.org/zap/zapcore" +) + +var ( + errExample = errors.New("fail") + + _messages = fakeMessages(1000) + _tenInts = []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0} + _tenStrings = []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j"} + _tenTimes = []time.Time{ + time.Unix(0, 0), + time.Unix(1, 0), + time.Unix(2, 0), + time.Unix(3, 0), + time.Unix(4, 0), + time.Unix(5, 0), + time.Unix(6, 0), + time.Unix(7, 0), + time.Unix(8, 0), + time.Unix(9, 0), + } + _oneUser = &user{ + Name: "Jane Doe", + Email: "jane@test.com", + CreatedAt: time.Date(1980, 1, 1, 12, 0, 0, 0, time.UTC), + } + _tenUsers = users{ + _oneUser, + _oneUser, + _oneUser, + _oneUser, + _oneUser, + _oneUser, + _oneUser, + _oneUser, + _oneUser, + _oneUser, + } +) + +func fakeMessages(n int) []string { + messages := make([]string, n) + for i := range messages { + messages[i] = fmt.Sprintf("Test logging, but use a somewhat realistic message length. (#%v)", i) + } + return messages +} + +func getMessage(iter int) string { + return _messages[iter%1000] +} + +type users []*user + +func (uu users) MarshalLogArray(arr zapcore.ArrayEncoder) error { + var err error + for i := range uu { + err = multierr.Append(err, arr.AppendObject(uu[i])) + } + return err +} + +type user struct { + Name string `json:"name"` + Email string `json:"email"` + CreatedAt time.Time `json:"created_at"` +} + +func (u *user) MarshalLogObject(enc zapcore.ObjectEncoder) error { + enc.AddString("name", u.Name) + enc.AddString("email", u.Email) + enc.AddInt64("createdAt", u.CreatedAt.UnixNano()) + return nil +} + +func newZapLogger(lvl zapcore.Level) *zap.Logger { + ec := zap.NewProductionEncoderConfig() + ec.EncodeDuration = zapcore.NanosDurationEncoder + ec.EncodeTime = zapcore.EpochNanosTimeEncoder + enc := zapcore.NewJSONEncoder(ec) + return zap.New(zapcore.NewCore( + enc, + &ztest.Discarder{}, + lvl, + )) +} + +func newSampledLogger(lvl zapcore.Level) *zap.Logger { + return zap.New(zapcore.NewSampler( + newZapLogger(zap.DebugLevel).Core(), + 100*time.Millisecond, + 10, // first + 10, // thereafter + )) +} + +func fakeFields() []zap.Field { + return []zap.Field{ + zap.Int("int", _tenInts[0]), + zap.Ints("ints", _tenInts), + zap.String("string", _tenStrings[0]), + zap.Strings("strings", _tenStrings), + zap.Time("time", _tenTimes[0]), + zap.Times("times", _tenTimes), + zap.Object("user1", _oneUser), + zap.Object("user2", _oneUser), + zap.Array("users", _tenUsers), + zap.Error(errExample), + } +} + +func fakeSugarFields() []interface{} { + return []interface{}{ + "int", _tenInts[0], + "ints", _tenInts, + "string", _tenStrings[0], + "strings", _tenStrings, + "time", _tenTimes[0], + "times", _tenTimes, + "user1", _oneUser, + "user2", _oneUser, + "users", _tenUsers, + "error", errExample, + } +} + +func fakeFmtArgs() []interface{} { + // Need to keep this a function instead of a package-global var so that we + // pay the cast-to-interface{} penalty on each call. + return []interface{}{ + _tenInts[0], + _tenInts, + _tenStrings[0], + _tenStrings, + _tenTimes[0], + _tenTimes, + _oneUser, + _oneUser, + _tenUsers, + errExample, + } +} diff --git a/api/vendor/go.uber.org/zap/benchmarks/zerolog_test.go b/api/vendor/go.uber.org/zap/benchmarks/zerolog_test.go new file mode 100644 index 0000000..b14cd9d --- /dev/null +++ b/api/vendor/go.uber.org/zap/benchmarks/zerolog_test.go @@ -0,0 +1,63 @@ +// 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 +// 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. + +package benchmarks + +import ( + "io/ioutil" + + "github.com/rs/zerolog" +) + +func newZerolog() zerolog.Logger { + return zerolog.New(ioutil.Discard).With().Timestamp().Logger() +} + +func newDisabledZerolog() zerolog.Logger { + return newZerolog().Level(zerolog.Disabled) +} + +func fakeZerologFields(e *zerolog.Event) *zerolog.Event { + return e. + Int("int", _tenInts[0]). + Interface("ints", _tenInts). + Str("string", _tenStrings[0]). + Interface("strings", _tenStrings). + Time("time", _tenTimes[0]). + Interface("times", _tenTimes). + Interface("user1", _oneUser). + Interface("user2", _oneUser). + Interface("users", _tenUsers). + Err(errExample) +} + +func fakeZerologContext(c zerolog.Context) zerolog.Context { + return c. + Int("int", _tenInts[0]). + Interface("ints", _tenInts). + Str("string", _tenStrings[0]). + Interface("strings", _tenStrings). + Time("time", _tenTimes[0]). + Interface("times", _tenTimes). + Interface("user1", _oneUser). + Interface("user2", _oneUser). + Interface("users", _tenUsers). + Err(errExample) +} diff --git a/api/vendor/go.uber.org/zap/buffer/buffer.go b/api/vendor/go.uber.org/zap/buffer/buffer.go new file mode 100644 index 0000000..d15f7fd --- /dev/null +++ b/api/vendor/go.uber.org/zap/buffer/buffer.go @@ -0,0 +1,106 @@ +// 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 +// 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. + +// Package buffer provides a thin wrapper around a byte slice. Unlike the +// standard library's bytes.Buffer, it supports a portion of the strconv +// package's zero-allocation formatters. +package buffer // import "go.uber.org/zap/buffer" + +import "strconv" + +const _size = 1024 // by default, create 1 KiB buffers + +// Buffer is a thin wrapper around a byte slice. It's intended to be pooled, so +// the only way to construct one is via a Pool. +type Buffer struct { + bs []byte + pool Pool +} + +// AppendByte writes a single byte to the Buffer. +func (b *Buffer) AppendByte(v byte) { + b.bs = append(b.bs, v) +} + +// AppendString writes a string to the Buffer. +func (b *Buffer) AppendString(s string) { + b.bs = append(b.bs, s...) +} + +// AppendInt appends an integer to the underlying buffer (assuming base 10). +func (b *Buffer) AppendInt(i int64) { + b.bs = strconv.AppendInt(b.bs, i, 10) +} + +// AppendUint appends an unsigned integer to the underlying buffer (assuming +// base 10). +func (b *Buffer) AppendUint(i uint64) { + b.bs = strconv.AppendUint(b.bs, i, 10) +} + +// AppendBool appends a bool to the underlying buffer. +func (b *Buffer) AppendBool(v bool) { + b.bs = strconv.AppendBool(b.bs, v) +} + +// AppendFloat appends a float to the underlying buffer. It doesn't quote NaN +// or +/- Inf. +func (b *Buffer) AppendFloat(f float64, bitSize int) { + b.bs = strconv.AppendFloat(b.bs, f, 'f', -1, bitSize) +} + +// Len returns the length of the underlying byte slice. +func (b *Buffer) Len() int { + return len(b.bs) +} + +// Cap returns the capacity of the underlying byte slice. +func (b *Buffer) Cap() int { + return cap(b.bs) +} + +// Bytes returns a mutable reference to the underlying byte slice. +func (b *Buffer) Bytes() []byte { + return b.bs +} + +// String returns a string copy of the underlying byte slice. +func (b *Buffer) String() string { + return string(b.bs) +} + +// Reset resets the underlying byte slice. Subsequent writes re-use the slice's +// backing array. +func (b *Buffer) Reset() { + b.bs = b.bs[:0] +} + +// Write implements io.Writer. +func (b *Buffer) Write(bs []byte) (int, error) { + b.bs = append(b.bs, bs...) + return len(bs), nil +} + +// Free returns the Buffer to its Pool. +// +// Callers must not retain references to the Buffer after calling Free. +func (b *Buffer) Free() { + b.pool.put(b) +} diff --git a/api/vendor/go.uber.org/zap/buffer/buffer_test.go b/api/vendor/go.uber.org/zap/buffer/buffer_test.go new file mode 100644 index 0000000..59bc08a --- /dev/null +++ b/api/vendor/go.uber.org/zap/buffer/buffer_test.go @@ -0,0 +1,91 @@ +// 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 +// 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. + +package buffer + +import ( + "bytes" + "strings" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestBufferWrites(t *testing.T) { + buf := NewPool().Get() + + tests := []struct { + desc string + f func() + want string + }{ + {"AppendByte", func() { buf.AppendByte('v') }, "v"}, + {"AppendString", func() { buf.AppendString("foo") }, "foo"}, + {"AppendIntPositive", func() { buf.AppendInt(42) }, "42"}, + {"AppendIntNegative", func() { buf.AppendInt(-42) }, "-42"}, + {"AppendUint", func() { buf.AppendUint(42) }, "42"}, + {"AppendBool", func() { buf.AppendBool(true) }, "true"}, + {"AppendFloat64", func() { buf.AppendFloat(3.14, 64) }, "3.14"}, + // Intenationally introduce some floating-point error. + {"AppendFloat32", func() { buf.AppendFloat(float64(float32(3.14)), 32) }, "3.14"}, + {"AppendWrite", func() { buf.Write([]byte("foo")) }, "foo"}, + } + + for _, tt := range tests { + t.Run(tt.desc, func(t *testing.T) { + buf.Reset() + tt.f() + assert.Equal(t, tt.want, buf.String(), "Unexpected buffer.String().") + assert.Equal(t, tt.want, string(buf.Bytes()), "Unexpected string(buffer.Bytes()).") + assert.Equal(t, len(tt.want), buf.Len(), "Unexpected buffer length.") + // We're not writing more than a kibibyte in tests. + assert.Equal(t, _size, buf.Cap(), "Expected buffer capacity to remain constant.") + }) + } +} + +func BenchmarkBuffers(b *testing.B) { + // Because we use the strconv.AppendFoo functions so liberally, we can't + // use the standard library's bytes.Buffer anyways (without incurring a + // bunch of extra allocations). Nevertheless, let's make sure that we're + // not losing any precious nanoseconds. + str := strings.Repeat("a", 1024) + slice := make([]byte, 1024) + buf := bytes.NewBuffer(slice) + custom := NewPool().Get() + b.Run("ByteSlice", func(b *testing.B) { + for i := 0; i < b.N; i++ { + slice = append(slice, str...) + slice = slice[:0] + } + }) + b.Run("BytesBuffer", func(b *testing.B) { + for i := 0; i < b.N; i++ { + buf.WriteString(str) + buf.Reset() + } + }) + b.Run("CustomBuffer", func(b *testing.B) { + for i := 0; i < b.N; i++ { + custom.AppendString(str) + custom.Reset() + } + }) +} diff --git a/api/vendor/go.uber.org/zap/buffer/pool.go b/api/vendor/go.uber.org/zap/buffer/pool.go new file mode 100644 index 0000000..8fb3e20 --- /dev/null +++ b/api/vendor/go.uber.org/zap/buffer/pool.go @@ -0,0 +1,49 @@ +// 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 +// 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. + +package buffer + +import "sync" + +// A Pool is a type-safe wrapper around a sync.Pool. +type Pool struct { + p *sync.Pool +} + +// NewPool constructs a new Pool. +func NewPool() Pool { + return Pool{p: &sync.Pool{ + New: func() interface{} { + return &Buffer{bs: make([]byte, 0, _size)} + }, + }} +} + +// Get retrieves a Buffer from the pool, creating one if necessary. +func (p Pool) Get() *Buffer { + buf := p.p.Get().(*Buffer) + buf.Reset() + buf.pool = p + return buf +} + +func (p Pool) put(buf *Buffer) { + p.p.Put(buf) +} diff --git a/api/vendor/go.uber.org/zap/buffer/pool_test.go b/api/vendor/go.uber.org/zap/buffer/pool_test.go new file mode 100644 index 0000000..a219815 --- /dev/null +++ b/api/vendor/go.uber.org/zap/buffer/pool_test.go @@ -0,0 +1,52 @@ +// 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 +// 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. + +package buffer + +import ( + "sync" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestBuffers(t *testing.T) { + const dummyData = "dummy data" + p := NewPool() + + var wg sync.WaitGroup + for g := 0; g < 10; g++ { + wg.Add(1) + go func() { + for i := 0; i < 100; i++ { + buf := p.Get() + assert.Zero(t, buf.Len(), "Expected truncated buffer") + assert.NotZero(t, buf.Cap(), "Expected non-zero capacity") + + buf.AppendString(dummyData) + assert.Equal(t, buf.Len(), len(dummyData), "Expected buffer to contain dummy data") + + buf.Free() + } + wg.Done() + }() + } + wg.Wait() +} diff --git a/api/vendor/go.uber.org/zap/check_license.sh b/api/vendor/go.uber.org/zap/check_license.sh new file mode 100755 index 0000000..345ac8b --- /dev/null +++ b/api/vendor/go.uber.org/zap/check_license.sh @@ -0,0 +1,17 @@ +#!/bin/bash -e + +ERROR_COUNT=0 +while read -r file +do + case "$(head -1 "${file}")" in + *"Copyright (c) "*" Uber Technologies, Inc.") + # everything's cool + ;; + *) + echo "$file is missing license header." + (( ERROR_COUNT++ )) + ;; + esac +done < <(git ls-files "*\.go") + +exit $ERROR_COUNT diff --git a/api/vendor/go.uber.org/zap/common_test.go b/api/vendor/go.uber.org/zap/common_test.go new file mode 100644 index 0000000..b0a4a2e --- /dev/null +++ b/api/vendor/go.uber.org/zap/common_test.go @@ -0,0 +1,57 @@ +// 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 +// 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. + +package zap + +import ( + "sync" + "testing" + + "go.uber.org/zap/zapcore" + "go.uber.org/zap/zaptest/observer" +) + +func opts(opts ...Option) []Option { + return opts +} + +// Here specifically to introduce an easily-identifiable filename for testing +// stacktraces and caller skips. +func withLogger(t testing.TB, e zapcore.LevelEnabler, opts []Option, f func(*Logger, *observer.ObservedLogs)) { + fac, logs := observer.New(e) + log := New(fac, opts...) + f(log, logs) +} + +func withSugar(t testing.TB, e zapcore.LevelEnabler, opts []Option, f func(*SugaredLogger, *observer.ObservedLogs)) { + withLogger(t, e, opts, func(logger *Logger, logs *observer.ObservedLogs) { f(logger.Sugar(), logs) }) +} + +func runConcurrently(goroutines, iterations int, wg *sync.WaitGroup, f func()) { + wg.Add(goroutines) + for g := 0; g < goroutines; g++ { + go func() { + defer wg.Done() + for i := 0; i < iterations; i++ { + f() + } + }() + } +} diff --git a/api/vendor/go.uber.org/zap/config.go b/api/vendor/go.uber.org/zap/config.go new file mode 100644 index 0000000..dae1303 --- /dev/null +++ b/api/vendor/go.uber.org/zap/config.go @@ -0,0 +1,243 @@ +// 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 +// 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. + +package zap + +import ( + "sort" + "time" + + "go.uber.org/zap/zapcore" +) + +// SamplingConfig sets a sampling strategy for the logger. Sampling caps the +// global CPU and I/O load that logging puts on your process while attempting +// to preserve a representative subset of your logs. +// +// Values configured here are per-second. See zapcore.NewSampler for details. +type SamplingConfig struct { + Initial int `json:"initial" yaml:"initial"` + Thereafter int `json:"thereafter" yaml:"thereafter"` +} + +// Config offers a declarative way to construct a logger. It doesn't do +// anything that can't be done with New, Options, and the various +// zapcore.WriteSyncer and zapcore.Core wrappers, but it's a simpler way to +// toggle common options. +// +// Note that Config intentionally supports only the most common options. More +// unusual logging setups (logging to network connections or message queues, +// splitting output between multiple files, etc.) are possible, but require +// direct use of the zapcore package. For sample code, see the package-level +// BasicConfiguration and AdvancedConfiguration examples. +// +// For an example showing runtime log level changes, see the documentation for +// AtomicLevel. +type Config struct { + // Level is the minimum enabled logging level. Note that this is a dynamic + // level, so calling Config.Level.SetLevel will atomically change the log + // level of all loggers descended from this config. + Level AtomicLevel `json:"level" yaml:"level"` + // Development puts the logger in development mode, which changes the + // behavior of DPanicLevel and takes stacktraces more liberally. + Development bool `json:"development" yaml:"development"` + // DisableCaller stops annotating logs with the calling function's file + // name and line number. By default, all logs are annotated. + DisableCaller bool `json:"disableCaller" yaml:"disableCaller"` + // DisableStacktrace completely disables automatic stacktrace capturing. By + // default, stacktraces are captured for WarnLevel and above logs in + // development and ErrorLevel and above in production. + DisableStacktrace bool `json:"disableStacktrace" yaml:"disableStacktrace"` + // Sampling sets a sampling policy. A nil SamplingConfig disables sampling. + Sampling *SamplingConfig `json:"sampling" yaml:"sampling"` + // Encoding sets the logger's encoding. Valid values are "json" and + // "console", as well as any third-party encodings registered via + // RegisterEncoder. + Encoding string `json:"encoding" yaml:"encoding"` + // EncoderConfig sets options for the chosen encoder. See + // zapcore.EncoderConfig for details. + EncoderConfig zapcore.EncoderConfig `json:"encoderConfig" yaml:"encoderConfig"` + // OutputPaths is a list of paths to write logging output to. See Open for + // details. + OutputPaths []string `json:"outputPaths" yaml:"outputPaths"` + // ErrorOutputPaths is a list of paths to write internal logger errors to. + // The default is standard error. + // + // Note that this setting only affects internal errors; for sample code that + // sends error-level logs to a different location from info- and debug-level + // logs, see the package-level AdvancedConfiguration example. + ErrorOutputPaths []string `json:"errorOutputPaths" yaml:"errorOutputPaths"` + // InitialFields is a collection of fields to add to the root logger. + InitialFields map[string]interface{} `json:"initialFields" yaml:"initialFields"` +} + +// NewProductionEncoderConfig returns an opinionated EncoderConfig for +// production environments. +func NewProductionEncoderConfig() zapcore.EncoderConfig { + return zapcore.EncoderConfig{ + TimeKey: "ts", + LevelKey: "level", + NameKey: "logger", + CallerKey: "caller", + MessageKey: "msg", + StacktraceKey: "stacktrace", + LineEnding: zapcore.DefaultLineEnding, + EncodeLevel: zapcore.LowercaseLevelEncoder, + EncodeTime: zapcore.EpochTimeEncoder, + EncodeDuration: zapcore.SecondsDurationEncoder, + EncodeCaller: zapcore.ShortCallerEncoder, + } +} + +// NewProductionConfig is a reasonable production logging configuration. +// Logging is enabled at InfoLevel and above. +// +// It uses a JSON encoder, writes to standard error, and enables sampling. +// Stacktraces are automatically included on logs of ErrorLevel and above. +func NewProductionConfig() Config { + return Config{ + Level: NewAtomicLevelAt(InfoLevel), + Development: false, + Sampling: &SamplingConfig{ + Initial: 100, + Thereafter: 100, + }, + Encoding: "json", + EncoderConfig: NewProductionEncoderConfig(), + OutputPaths: []string{"stderr"}, + ErrorOutputPaths: []string{"stderr"}, + } +} + +// NewDevelopmentEncoderConfig returns an opinionated EncoderConfig for +// development environments. +func NewDevelopmentEncoderConfig() zapcore.EncoderConfig { + return zapcore.EncoderConfig{ + // Keys can be anything except the empty string. + TimeKey: "T", + LevelKey: "L", + NameKey: "N", + CallerKey: "C", + MessageKey: "M", + StacktraceKey: "S", + LineEnding: zapcore.DefaultLineEnding, + EncodeLevel: zapcore.CapitalLevelEncoder, + EncodeTime: zapcore.ISO8601TimeEncoder, + EncodeDuration: zapcore.StringDurationEncoder, + EncodeCaller: zapcore.ShortCallerEncoder, + } +} + +// NewDevelopmentConfig is a reasonable development logging configuration. +// Logging is enabled at DebugLevel and above. +// +// It enables development mode (which makes DPanicLevel logs panic), uses a +// console encoder, writes to standard error, and disables sampling. +// Stacktraces are automatically included on logs of WarnLevel and above. +func NewDevelopmentConfig() Config { + return Config{ + Level: NewAtomicLevelAt(DebugLevel), + Development: true, + Encoding: "console", + EncoderConfig: NewDevelopmentEncoderConfig(), + OutputPaths: []string{"stderr"}, + ErrorOutputPaths: []string{"stderr"}, + } +} + +// Build constructs a logger from the Config and Options. +func (cfg Config) Build(opts ...Option) (*Logger, error) { + enc, err := cfg.buildEncoder() + if err != nil { + return nil, err + } + + sink, errSink, err := cfg.openSinks() + if err != nil { + return nil, err + } + + log := New( + zapcore.NewCore(enc, sink, cfg.Level), + cfg.buildOptions(errSink)..., + ) + if len(opts) > 0 { + log = log.WithOptions(opts...) + } + return log, nil +} + +func (cfg Config) buildOptions(errSink zapcore.WriteSyncer) []Option { + opts := []Option{ErrorOutput(errSink)} + + if cfg.Development { + opts = append(opts, Development()) + } + + if !cfg.DisableCaller { + opts = append(opts, AddCaller()) + } + + stackLevel := ErrorLevel + if cfg.Development { + stackLevel = WarnLevel + } + if !cfg.DisableStacktrace { + opts = append(opts, AddStacktrace(stackLevel)) + } + + if cfg.Sampling != nil { + opts = append(opts, WrapCore(func(core zapcore.Core) zapcore.Core { + return zapcore.NewSampler(core, time.Second, int(cfg.Sampling.Initial), int(cfg.Sampling.Thereafter)) + })) + } + + if len(cfg.InitialFields) > 0 { + fs := make([]Field, 0, len(cfg.InitialFields)) + keys := make([]string, 0, len(cfg.InitialFields)) + for k := range cfg.InitialFields { + keys = append(keys, k) + } + sort.Strings(keys) + for _, k := range keys { + fs = append(fs, Any(k, cfg.InitialFields[k])) + } + opts = append(opts, Fields(fs...)) + } + + return opts +} + +func (cfg Config) openSinks() (zapcore.WriteSyncer, zapcore.WriteSyncer, error) { + sink, closeOut, err := Open(cfg.OutputPaths...) + if err != nil { + return nil, nil, err + } + errSink, _, err := Open(cfg.ErrorOutputPaths...) + if err != nil { + closeOut() + return nil, nil, err + } + return sink, errSink, nil +} + +func (cfg Config) buildEncoder() (zapcore.Encoder, error) { + return newEncoder(cfg.Encoding, cfg.EncoderConfig) +} diff --git a/api/vendor/go.uber.org/zap/config_test.go b/api/vendor/go.uber.org/zap/config_test.go new file mode 100644 index 0000000..7a87570 --- /dev/null +++ b/api/vendor/go.uber.org/zap/config_test.go @@ -0,0 +1,108 @@ +// 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 +// 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. + +package zap + +import ( + "io/ioutil" + "os" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestConfig(t *testing.T) { + tests := []struct { + desc string + cfg Config + expectN int64 + expectRe string + }{ + { + desc: "production", + cfg: NewProductionConfig(), + expectN: 2 + 100 + 1, // 2 from initial logs, 100 initial sampled logs, 1 from off-by-one in sampler + expectRe: `{"level":"info","caller":"zap/config_test.go:\d+","msg":"info","k":"v","z":"zz"}` + "\n" + + `{"level":"warn","caller":"zap/config_test.go:\d+","msg":"warn","k":"v","z":"zz"}` + "\n", + }, + { + desc: "development", + cfg: NewDevelopmentConfig(), + expectN: 3 + 200, // 3 initial logs, all 200 subsequent logs + expectRe: "DEBUG\tzap/config_test.go:" + `\d+` + "\tdebug\t" + `{"k": "v", "z": "zz"}` + "\n" + + "INFO\tzap/config_test.go:" + `\d+` + "\tinfo\t" + `{"k": "v", "z": "zz"}` + "\n" + + "WARN\tzap/config_test.go:" + `\d+` + "\twarn\t" + `{"k": "v", "z": "zz"}` + "\n" + + `testing.\w+`, + }, + } + + for _, tt := range tests { + t.Run(tt.desc, func(t *testing.T) { + temp, err := ioutil.TempFile("", "zap-prod-config-test") + require.NoError(t, err, "Failed to create temp file.") + defer os.Remove(temp.Name()) + + tt.cfg.OutputPaths = []string{temp.Name()} + tt.cfg.EncoderConfig.TimeKey = "" // no timestamps in tests + tt.cfg.InitialFields = map[string]interface{}{"z": "zz", "k": "v"} + + hook, count := makeCountingHook() + logger, err := tt.cfg.Build(Hooks(hook)) + require.NoError(t, err, "Unexpected error constructing logger.") + + logger.Debug("debug") + logger.Info("info") + logger.Warn("warn") + + byteContents, err := ioutil.ReadAll(temp) + require.NoError(t, err, "Couldn't read log contents from temp file.") + logs := string(byteContents) + assert.Regexp(t, tt.expectRe, logs, "Unexpected log output.") + + for i := 0; i < 200; i++ { + logger.Info("sampling") + } + assert.Equal(t, tt.expectN, count.Load(), "Hook called an unexpected number of times.") + }) + } +} + +func TestConfigWithInvalidPaths(t *testing.T) { + tests := []struct { + desc string + output string + errOutput string + }{ + {"output directory doesn't exist", "/tmp/not-there/foo.log", "stderr"}, + {"error output directory doesn't exist", "stdout", "/tmp/not-there/foo-errors.log"}, + {"neither output directory exists", "/tmp/not-there/foo.log", "/tmp/not-there/foo-errors.log"}, + } + + for _, tt := range tests { + t.Run(tt.desc, func(t *testing.T) { + cfg := NewProductionConfig() + cfg.OutputPaths = []string{tt.output} + cfg.ErrorOutputPaths = []string{tt.errOutput} + _, err := cfg.Build() + assert.Error(t, err, "Expected an error opening a non-existent directory.") + }) + } +} diff --git a/api/vendor/go.uber.org/zap/doc.go b/api/vendor/go.uber.org/zap/doc.go new file mode 100644 index 0000000..3f16a8d --- /dev/null +++ b/api/vendor/go.uber.org/zap/doc.go @@ -0,0 +1,113 @@ +// 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 +// 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. + +// Package zap provides fast, structured, leveled logging. +// +// For applications that log in the hot path, reflection-based serialization +// and string formatting are prohibitively expensive - they're CPU-intensive +// and make many small allocations. Put differently, using json.Marshal and +// fmt.Fprintf to log tons of interface{} makes your application slow. +// +// Zap takes a different approach. It includes a reflection-free, +// zero-allocation JSON encoder, and the base Logger strives to avoid +// serialization overhead and allocations wherever possible. By building the +// high-level SugaredLogger on that foundation, zap lets users choose when +// they need to count every allocation and when they'd prefer a more familiar, +// loosely typed API. +// +// Choosing a Logger +// +// In contexts where performance is nice, but not critical, use the +// SugaredLogger. It's 4-10x faster than other structured logging packages and +// supports both structured and printf-style logging. Like log15 and go-kit, +// the SugaredLogger's structured logging APIs are loosely typed and accept a +// variadic number of key-value pairs. (For more advanced use cases, they also +// accept strongly typed fields - see the SugaredLogger.With documentation for +// details.) +// sugar := zap.NewExample().Sugar() +// defer sugar.Sync() +// sugar.Infow("failed to fetch URL", +// "url", "http://example.com", +// "attempt", 3, +// "backoff", time.Second, +// ) +// sugar.Printf("failed to fetch URL: %s", "http://example.com") +// +// By default, loggers are unbuffered. However, since zap's low-level APIs +// allow buffering, calling Sync before letting your process exit is a good +// habit. +// +// In the rare contexts where every microsecond and every allocation matter, +// use the Logger. It's even faster than the SugaredLogger and allocates far +// less, but it only supports strongly-typed, structured logging. +// logger := zap.NewExample() +// defer logger.Sync() +// logger.Info("failed to fetch URL", +// zap.String("url", "http://example.com"), +// zap.Int("attempt", 3), +// zap.Duration("backoff", time.Second), +// ) +// +// Choosing between the Logger and SugaredLogger doesn't need to be an +// application-wide decision: converting between the two is simple and +// inexpensive. +// logger := zap.NewExample() +// defer logger.Sync() +// sugar := logger.Sugar() +// plain := sugar.Desugar() +// +// Configuring Zap +// +// The simplest way to build a Logger is to use zap's opinionated presets: +// NewExample, NewProduction, and NewDevelopment. These presets build a logger +// with a single function call: +// logger, err := zap.NewProduction() +// if err != nil { +// log.Fatalf("can't initialize zap logger: %v", err) +// } +// defer logger.Sync() +// +// Presets are fine for small projects, but larger projects and organizations +// naturally require a bit more customization. For most users, zap's Config +// struct strikes the right balance between flexibility and convenience. See +// the package-level BasicConfiguration example for sample code. +// +// More unusual configurations (splitting output between files, sending logs +// to a message queue, etc.) are possible, but require direct use of +// go.uber.org/zap/zapcore. See the package-level AdvancedConfiguration +// example for sample code. +// +// Extending Zap +// +// The zap package itself is a relatively thin wrapper around the interfaces +// in go.uber.org/zap/zapcore. Extending zap to support a new encoding (e.g., +// BSON), a new log sink (e.g., Kafka), or something more exotic (perhaps an +// exception aggregation service, like Sentry or Rollbar) typically requires +// implementing the zapcore.Encoder, zapcore.WriteSyncer, or zapcore.Core +// interfaces. See the zapcore documentation for details. +// +// Similarly, package authors can use the high-performance Encoder and Core +// implementations in the zapcore package to build their own loggers. +// +// Frequently Asked Questions +// +// An FAQ covering everything from installation errors to design decisions is +// available at https://github.com/uber-go/zap/blob/master/FAQ.md. +package zap // import "go.uber.org/zap" diff --git a/api/vendor/go.uber.org/zap/encoder.go b/api/vendor/go.uber.org/zap/encoder.go new file mode 100644 index 0000000..2e9d3c3 --- /dev/null +++ b/api/vendor/go.uber.org/zap/encoder.go @@ -0,0 +1,75 @@ +// 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 +// 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. + +package zap + +import ( + "errors" + "fmt" + "sync" + + "go.uber.org/zap/zapcore" +) + +var ( + errNoEncoderNameSpecified = errors.New("no encoder name specified") + + _encoderNameToConstructor = map[string]func(zapcore.EncoderConfig) (zapcore.Encoder, error){ + "console": func(encoderConfig zapcore.EncoderConfig) (zapcore.Encoder, error) { + return zapcore.NewConsoleEncoder(encoderConfig), nil + }, + "json": func(encoderConfig zapcore.EncoderConfig) (zapcore.Encoder, error) { + return zapcore.NewJSONEncoder(encoderConfig), nil + }, + } + _encoderMutex sync.RWMutex +) + +// RegisterEncoder registers an encoder constructor, which the Config struct +// can then reference. By default, the "json" and "console" encoders are +// registered. +// +// Attempting to register an encoder whose name is already taken returns an +// error. +func RegisterEncoder(name string, constructor func(zapcore.EncoderConfig) (zapcore.Encoder, error)) error { + _encoderMutex.Lock() + defer _encoderMutex.Unlock() + if name == "" { + return errNoEncoderNameSpecified + } + if _, ok := _encoderNameToConstructor[name]; ok { + return fmt.Errorf("encoder already registered for name %q", name) + } + _encoderNameToConstructor[name] = constructor + return nil +} + +func newEncoder(name string, encoderConfig zapcore.EncoderConfig) (zapcore.Encoder, error) { + _encoderMutex.RLock() + defer _encoderMutex.RUnlock() + if name == "" { + return nil, errNoEncoderNameSpecified + } + constructor, ok := _encoderNameToConstructor[name] + if !ok { + return nil, fmt.Errorf("no encoder registered for name %q", name) + } + return constructor(encoderConfig) +} diff --git a/api/vendor/go.uber.org/zap/encoder_test.go b/api/vendor/go.uber.org/zap/encoder_test.go new file mode 100644 index 0000000..f6be665 --- /dev/null +++ b/api/vendor/go.uber.org/zap/encoder_test.go @@ -0,0 +1,88 @@ +// 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 +// 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. + +package zap + +import ( + "testing" + + "go.uber.org/zap/zapcore" + + "github.com/stretchr/testify/assert" +) + +func TestRegisterDefaultEncoders(t *testing.T) { + testEncodersRegistered(t, "console", "json") +} + +func TestRegisterEncoder(t *testing.T) { + testEncoders(func() { + assert.NoError(t, RegisterEncoder("foo", newNilEncoder), "expected to be able to register the encoder foo") + testEncodersRegistered(t, "foo") + }) +} + +func TestDuplicateRegisterEncoder(t *testing.T) { + testEncoders(func() { + RegisterEncoder("foo", newNilEncoder) + assert.Error(t, RegisterEncoder("foo", newNilEncoder), "expected an error when registering an encoder with the same name twice") + }) +} + +func TestRegisterEncoderNoName(t *testing.T) { + assert.Equal(t, errNoEncoderNameSpecified, RegisterEncoder("", newNilEncoder), "expected an error when registering an encoder with no name") +} + +func TestNewEncoder(t *testing.T) { + testEncoders(func() { + RegisterEncoder("foo", newNilEncoder) + encoder, err := newEncoder("foo", zapcore.EncoderConfig{}) + assert.NoError(t, err, "could not create an encoder for the registered name foo") + assert.Nil(t, encoder, "the encoder from newNilEncoder is not nil") + }) +} + +func TestNewEncoderNotRegistered(t *testing.T) { + _, err := newEncoder("foo", zapcore.EncoderConfig{}) + assert.Error(t, err, "expected an error when trying to create an encoder of an unregistered name") +} + +func TestNewEncoderNoName(t *testing.T) { + _, err := newEncoder("", zapcore.EncoderConfig{}) + assert.Equal(t, errNoEncoderNameSpecified, err, "expected an error when creating an encoder with no name") +} + +func testEncoders(f func()) { + existing := _encoderNameToConstructor + _encoderNameToConstructor = make(map[string]func(zapcore.EncoderConfig) (zapcore.Encoder, error)) + defer func() { _encoderNameToConstructor = existing }() + f() +} + +func testEncodersRegistered(t *testing.T, names ...string) { + assert.Len(t, _encoderNameToConstructor, len(names), "the expected number of registered encoders does not match the actual number") + for _, name := range names { + assert.NotNil(t, _encoderNameToConstructor[name], "no encoder is registered for name %s", name) + } +} + +func newNilEncoder(_ zapcore.EncoderConfig) (zapcore.Encoder, error) { + return nil, nil +} diff --git a/api/vendor/go.uber.org/zap/error.go b/api/vendor/go.uber.org/zap/error.go new file mode 100644 index 0000000..65982a5 --- /dev/null +++ b/api/vendor/go.uber.org/zap/error.go @@ -0,0 +1,80 @@ +// Copyright (c) 2017 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. + +package zap + +import ( + "sync" + + "go.uber.org/zap/zapcore" +) + +var _errArrayElemPool = sync.Pool{New: func() interface{} { + return &errArrayElem{} +}} + +// Error is shorthand for the common idiom NamedError("error", err). +func Error(err error) Field { + return NamedError("error", err) +} + +// NamedError constructs a field that lazily stores err.Error() under the +// provided key. Errors which also implement fmt.Formatter (like those produced +// by github.com/pkg/errors) will also have their verbose representation stored +// under key+"Verbose". If passed a nil error, the field is a no-op. +// +// For the common case in which the key is simply "error", the Error function +// is shorter and less repetitive. +func NamedError(key string, err error) Field { + if err == nil { + return Skip() + } + return Field{Key: key, Type: zapcore.ErrorType, Interface: err} +} + +type errArray []error + +func (errs errArray) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range errs { + if errs[i] == nil { + continue + } + // To represent each error as an object with an "error" attribute and + // potentially an "errorVerbose" attribute, we need to wrap it in a + // type that implements LogObjectMarshaler. To prevent this from + // allocating, pool the wrapper type. + elem := _errArrayElemPool.Get().(*errArrayElem) + elem.error = errs[i] + arr.AppendObject(elem) + elem.error = nil + _errArrayElemPool.Put(elem) + } + return nil +} + +type errArrayElem struct { + error +} + +func (e *errArrayElem) MarshalLogObject(enc zapcore.ObjectEncoder) error { + // Re-use the error field's logic, which supports non-standard error types. + Error(e.error).AddTo(enc) + return nil +} diff --git a/api/vendor/go.uber.org/zap/error_test.go b/api/vendor/go.uber.org/zap/error_test.go new file mode 100644 index 0000000..ad34180 --- /dev/null +++ b/api/vendor/go.uber.org/zap/error_test.go @@ -0,0 +1,99 @@ +// Copyright (c) 2017 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. + +package zap + +import ( + "errors" + "testing" + + "go.uber.org/zap/zapcore" + + richErrors "github.com/pkg/errors" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestErrorConstructors(t *testing.T) { + fail := errors.New("fail") + + tests := []struct { + name string + field Field + expect Field + }{ + {"Error", Skip(), Error(nil)}, + {"Error", Field{Key: "error", Type: zapcore.ErrorType, Interface: fail}, Error(fail)}, + {"NamedError", Skip(), NamedError("foo", nil)}, + {"NamedError", Field{Key: "foo", Type: zapcore.ErrorType, Interface: fail}, NamedError("foo", fail)}, + {"Any:Error", Any("k", errors.New("v")), NamedError("k", errors.New("v"))}, + {"Any:Errors", Any("k", []error{errors.New("v")}), Errors("k", []error{errors.New("v")})}, + } + + for _, tt := range tests { + if !assert.Equal(t, tt.expect, tt.field, "Unexpected output from convenience field constructor %s.", tt.name) { + t.Logf("type expected: %T\nGot: %T", tt.expect.Interface, tt.field.Interface) + } + assertCanBeReused(t, tt.field) + } +} + +func TestErrorArrayConstructor(t *testing.T) { + tests := []struct { + desc string + field Field + expected []interface{} + }{ + {"empty errors", Errors("", []error{}), []interface{}(nil)}, + { + "errors", + Errors("", []error{nil, errors.New("foo"), nil, errors.New("bar")}), + []interface{}{map[string]interface{}{"error": "foo"}, map[string]interface{}{"error": "bar"}}, + }, + } + + for _, tt := range tests { + enc := zapcore.NewMapObjectEncoder() + tt.field.Key = "k" + tt.field.AddTo(enc) + assert.Equal(t, tt.expected, enc.Fields["k"], "%s: unexpected map contents.", tt.desc) + assert.Equal(t, 1, len(enc.Fields), "%s: found extra keys in map: %v", tt.desc, enc.Fields) + } +} + +func TestErrorsArraysHandleRichErrors(t *testing.T) { + errs := []error{richErrors.New("egad")} + + enc := zapcore.NewMapObjectEncoder() + Errors("k", errs).AddTo(enc) + assert.Equal(t, 1, len(enc.Fields), "Expected only top-level field.") + + val := enc.Fields["k"] + arr, ok := val.([]interface{}) + require.True(t, ok, "Expected top-level field to be an array.") + require.Equal(t, 1, len(arr), "Expected only one error object in array.") + + serialized := arr[0] + errMap, ok := serialized.(map[string]interface{}) + require.True(t, ok, "Expected serialized error to be a map, got %T.", serialized) + assert.Equal(t, "egad", errMap["error"], "Unexpected standard error string.") + assert.Contains(t, errMap["errorVerbose"], "egad", "Verbose error string should be a superset of standard error.") + assert.Contains(t, errMap["errorVerbose"], "TestErrorsArraysHandleRichErrors", "Verbose error string should contain a stacktrace.") +} diff --git a/api/vendor/go.uber.org/zap/example_test.go b/api/vendor/go.uber.org/zap/example_test.go new file mode 100644 index 0000000..b61f153 --- /dev/null +++ b/api/vendor/go.uber.org/zap/example_test.go @@ -0,0 +1,327 @@ +// 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 +// 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. + +package zap_test + +import ( + "encoding/json" + "io/ioutil" + "log" + "os" + "time" + + "go.uber.org/zap" + "go.uber.org/zap/zapcore" +) + +func Example_presets() { + // Using zap's preset constructors is the simplest way to get a feel for the + // package, but they don't allow much customization. + logger := zap.NewExample() // or NewProduction, or NewDevelopment + defer logger.Sync() + + const url = "http://example.com" + + // In most circumstances, use the SugaredLogger. It's 4-10x faster than most + // other structured logging packages and has a familiar, loosely-typed API. + sugar := logger.Sugar() + sugar.Infow("Failed to fetch URL.", + // Structured context as loosely typed key-value pairs. + "url", url, + "attempt", 3, + "backoff", time.Second, + ) + sugar.Infof("Failed to fetch URL: %s", url) + + // In the unusual situations where every microsecond matters, use the + // Logger. It's even faster than the SugaredLogger, but only supports + // structured logging. + logger.Info("Failed to fetch URL.", + // Structured context as strongly typed fields. + zap.String("url", url), + zap.Int("attempt", 3), + zap.Duration("backoff", time.Second), + ) + // Output: + // {"level":"info","msg":"Failed to fetch URL.","url":"http://example.com","attempt":3,"backoff":"1s"} + // {"level":"info","msg":"Failed to fetch URL: http://example.com"} + // {"level":"info","msg":"Failed to fetch URL.","url":"http://example.com","attempt":3,"backoff":"1s"} +} + +func Example_basicConfiguration() { + // For some users, the presets offered by the NewProduction, NewDevelopment, + // and NewExample constructors won't be appropriate. For most of those + // users, the bundled Config struct offers the right balance of flexibility + // and convenience. (For more complex needs, see the AdvancedConfiguration + // example.) + // + // See the documentation for Config and zapcore.EncoderConfig for all the + // available options. + rawJSON := []byte(`{ + "level": "debug", + "encoding": "json", + "outputPaths": ["stdout", "/tmp/logs"], + "errorOutputPaths": ["stderr"], + "initialFields": {"foo": "bar"}, + "encoderConfig": { + "messageKey": "message", + "levelKey": "level", + "levelEncoder": "lowercase" + } + }`) + + var cfg zap.Config + if err := json.Unmarshal(rawJSON, &cfg); err != nil { + panic(err) + } + logger, err := cfg.Build() + if err != nil { + panic(err) + } + defer logger.Sync() + + logger.Info("logger construction succeeded") + // Output: + // {"level":"info","message":"logger construction succeeded","foo":"bar"} +} + +func Example_advancedConfiguration() { + // The bundled Config struct only supports the most common configuration + // options. More complex needs, like splitting logs between multiple files + // or writing to non-file outputs, require use of the zapcore package. + // + // In this example, imagine we're both sending our logs to Kafka and writing + // them to the console. We'd like to encode the console output and the Kafka + // topics differently, and we'd also like special treatment for + // high-priority logs. + + // First, define our level-handling logic. + highPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool { + return lvl >= zapcore.ErrorLevel + }) + lowPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool { + return lvl < zapcore.ErrorLevel + }) + + // Assume that we have clients for two Kafka topics. The clients implement + // zapcore.WriteSyncer and are safe for concurrent use. (If they only + // implement io.Writer, we can use zapcore.AddSync to add a no-op Sync + // method. If they're not safe for concurrent use, we can add a protecting + // mutex with zapcore.Lock.) + topicDebugging := zapcore.AddSync(ioutil.Discard) + topicErrors := zapcore.AddSync(ioutil.Discard) + + // High-priority output should also go to standard error, and low-priority + // output should also go to standard out. + consoleDebugging := zapcore.Lock(os.Stdout) + consoleErrors := zapcore.Lock(os.Stderr) + + // Optimize the Kafka output for machine consumption and the console output + // for human operators. + kafkaEncoder := zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()) + consoleEncoder := zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig()) + + // Join the outputs, encoders, and level-handling functions into + // zapcore.Cores, then tee the four cores together. + core := zapcore.NewTee( + zapcore.NewCore(kafkaEncoder, topicErrors, highPriority), + zapcore.NewCore(consoleEncoder, consoleErrors, highPriority), + zapcore.NewCore(kafkaEncoder, topicDebugging, lowPriority), + zapcore.NewCore(consoleEncoder, consoleDebugging, lowPriority), + ) + + // From a zapcore.Core, it's easy to construct a Logger. + logger := zap.New(core) + defer logger.Sync() + logger.Info("constructed a logger") +} + +func ExampleNamespace() { + logger := zap.NewExample() + defer logger.Sync() + + logger.With( + zap.Namespace("metrics"), + zap.Int("counter", 1), + ).Info("tracked some metrics") + // Output: + // {"level":"info","msg":"tracked some metrics","metrics":{"counter":1}} +} + +func ExampleNewStdLog() { + logger := zap.NewExample() + defer logger.Sync() + + std := zap.NewStdLog(logger) + std.Print("standard logger wrapper") + // Output: + // {"level":"info","msg":"standard logger wrapper"} +} + +func ExampleRedirectStdLog() { + logger := zap.NewExample() + defer logger.Sync() + + undo := zap.RedirectStdLog(logger) + defer undo() + + log.Print("redirected standard library") + // Output: + // {"level":"info","msg":"redirected standard library"} +} + +func ExampleReplaceGlobals() { + logger := zap.NewExample() + defer logger.Sync() + + undo := zap.ReplaceGlobals(logger) + defer undo() + + zap.L().Info("replaced zap's global loggers") + // Output: + // {"level":"info","msg":"replaced zap's global loggers"} +} + +func ExampleAtomicLevel() { + atom := zap.NewAtomicLevel() + + // To keep the example deterministic, disable timestamps in the output. + encoderCfg := zap.NewProductionEncoderConfig() + encoderCfg.TimeKey = "" + + logger := zap.New(zapcore.NewCore( + zapcore.NewJSONEncoder(encoderCfg), + zapcore.Lock(os.Stdout), + atom, + )) + defer logger.Sync() + + logger.Info("info logging enabled") + + atom.SetLevel(zap.ErrorLevel) + logger.Info("info logging disabled") + // Output: + // {"level":"info","msg":"info logging enabled"} +} + +func ExampleAtomicLevel_config() { + // The zap.Config struct includes an AtomicLevel. To use it, keep a + // reference to the Config. + rawJSON := []byte(`{ + "level": "info", + "outputPaths": ["stdout"], + "errorOutputPaths": ["stderr"], + "encoding": "json", + "encoderConfig": { + "messageKey": "message", + "levelKey": "level", + "levelEncoder": "lowercase" + } + }`) + var cfg zap.Config + if err := json.Unmarshal(rawJSON, &cfg); err != nil { + panic(err) + } + logger, err := cfg.Build() + if err != nil { + panic(err) + } + defer logger.Sync() + + logger.Info("info logging enabled") + + cfg.Level.SetLevel(zap.ErrorLevel) + logger.Info("info logging disabled") + // Output: + // {"level":"info","message":"info logging enabled"} +} + +func ExampleLogger_Check() { + logger := zap.NewExample() + defer logger.Sync() + + if ce := logger.Check(zap.DebugLevel, "debugging"); ce != nil { + // If debug-level log output isn't enabled or if zap's sampling would have + // dropped this log entry, we don't allocate the slice that holds these + // fields. + ce.Write( + zap.String("foo", "bar"), + zap.String("baz", "quux"), + ) + } + + // Output: + // {"level":"debug","msg":"debugging","foo":"bar","baz":"quux"} +} + +func ExampleLogger_Named() { + logger := zap.NewExample() + defer logger.Sync() + + // By default, Loggers are unnamed. + logger.Info("no name") + + // The first call to Named sets the Logger name. + main := logger.Named("main") + main.Info("main logger") + + // Additional calls to Named create a period-separated path. + main.Named("subpackage").Info("sub-logger") + // Output: + // {"level":"info","msg":"no name"} + // {"level":"info","logger":"main","msg":"main logger"} + // {"level":"info","logger":"main.subpackage","msg":"sub-logger"} +} + +func ExampleWrapCore_replace() { + // Replacing a Logger's core can alter fundamental behaviors. For example, + // example, it can convert a Logger to a no-op. + nop := zap.WrapCore(func(zapcore.Core) zapcore.Core { + return zapcore.NewNopCore() + }) + + logger := zap.NewExample() + defer logger.Sync() + + logger.Info("working") + logger.WithOptions(nop).Info("no-op") + logger.Info("original logger still works") + // Output: + // {"level":"info","msg":"working"} + // {"level":"info","msg":"original logger still works"} +} + +func ExampleWrapCore_wrap() { + // Wrapping a Logger's core can extend its functionality. As a trivial + // example, it can double-write all logs. + doubled := zap.WrapCore(func(c zapcore.Core) zapcore.Core { + return zapcore.NewTee(c, c) + }) + + logger := zap.NewExample() + defer logger.Sync() + + logger.Info("single") + logger.WithOptions(doubled).Info("doubled") + // Output: + // {"level":"info","msg":"single"} + // {"level":"info","msg":"doubled"} + // {"level":"info","msg":"doubled"} +} diff --git a/api/vendor/go.uber.org/zap/field.go b/api/vendor/go.uber.org/zap/field.go new file mode 100644 index 0000000..5130e13 --- /dev/null +++ b/api/vendor/go.uber.org/zap/field.go @@ -0,0 +1,310 @@ +// 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 +// 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. + +package zap + +import ( + "fmt" + "math" + "time" + + "go.uber.org/zap/zapcore" +) + +// Field is an alias for Field. Aliasing this type dramatically +// improves the navigability of this package's API documentation. +type Field = zapcore.Field + +// Skip constructs a no-op field, which is often useful when handling invalid +// inputs in other Field constructors. +func Skip() Field { + return Field{Type: zapcore.SkipType} +} + +// Binary constructs a field that carries an opaque binary blob. +// +// Binary data is serialized in an encoding-appropriate format. For example, +// zap's JSON encoder base64-encodes binary blobs. To log UTF-8 encoded text, +// use ByteString. +func Binary(key string, val []byte) Field { + return Field{Key: key, Type: zapcore.BinaryType, Interface: val} +} + +// Bool constructs a field that carries a bool. +func Bool(key string, val bool) Field { + var ival int64 + if val { + ival = 1 + } + return Field{Key: key, Type: zapcore.BoolType, Integer: ival} +} + +// ByteString constructs a field that carries UTF-8 encoded text as a []byte. +// To log opaque binary blobs (which aren't necessarily valid UTF-8), use +// Binary. +func ByteString(key string, val []byte) Field { + return Field{Key: key, Type: zapcore.ByteStringType, Interface: val} +} + +// Complex128 constructs a field that carries a complex number. Unlike most +// numeric fields, this costs an allocation (to convert the complex128 to +// interface{}). +func Complex128(key string, val complex128) Field { + return Field{Key: key, Type: zapcore.Complex128Type, Interface: val} +} + +// Complex64 constructs a field that carries a complex number. Unlike most +// numeric fields, this costs an allocation (to convert the complex64 to +// interface{}). +func Complex64(key string, val complex64) Field { + return Field{Key: key, Type: zapcore.Complex64Type, Interface: val} +} + +// Float64 constructs a field that carries a float64. The way the +// floating-point value is represented is encoder-dependent, so marshaling is +// necessarily lazy. +func Float64(key string, val float64) Field { + return Field{Key: key, Type: zapcore.Float64Type, Integer: int64(math.Float64bits(val))} +} + +// Float32 constructs a field that carries a float32. The way the +// floating-point value is represented is encoder-dependent, so marshaling is +// necessarily lazy. +func Float32(key string, val float32) Field { + return Field{Key: key, Type: zapcore.Float32Type, Integer: int64(math.Float32bits(val))} +} + +// Int constructs a field with the given key and value. +func Int(key string, val int) Field { + return Int64(key, int64(val)) +} + +// Int64 constructs a field with the given key and value. +func Int64(key string, val int64) Field { + return Field{Key: key, Type: zapcore.Int64Type, Integer: val} +} + +// Int32 constructs a field with the given key and value. +func Int32(key string, val int32) Field { + return Field{Key: key, Type: zapcore.Int32Type, Integer: int64(val)} +} + +// Int16 constructs a field with the given key and value. +func Int16(key string, val int16) Field { + return Field{Key: key, Type: zapcore.Int16Type, Integer: int64(val)} +} + +// Int8 constructs a field with the given key and value. +func Int8(key string, val int8) Field { + return Field{Key: key, Type: zapcore.Int8Type, Integer: int64(val)} +} + +// String constructs a field with the given key and value. +func String(key string, val string) Field { + return Field{Key: key, Type: zapcore.StringType, String: val} +} + +// Uint constructs a field with the given key and value. +func Uint(key string, val uint) Field { + return Uint64(key, uint64(val)) +} + +// Uint64 constructs a field with the given key and value. +func Uint64(key string, val uint64) Field { + return Field{Key: key, Type: zapcore.Uint64Type, Integer: int64(val)} +} + +// Uint32 constructs a field with the given key and value. +func Uint32(key string, val uint32) Field { + return Field{Key: key, Type: zapcore.Uint32Type, Integer: int64(val)} +} + +// Uint16 constructs a field with the given key and value. +func Uint16(key string, val uint16) Field { + return Field{Key: key, Type: zapcore.Uint16Type, Integer: int64(val)} +} + +// Uint8 constructs a field with the given key and value. +func Uint8(key string, val uint8) Field { + return Field{Key: key, Type: zapcore.Uint8Type, Integer: int64(val)} +} + +// Uintptr constructs a field with the given key and value. +func Uintptr(key string, val uintptr) Field { + return Field{Key: key, Type: zapcore.UintptrType, Integer: int64(val)} +} + +// Reflect constructs a field with the given key and an arbitrary object. It uses +// an encoding-appropriate, reflection-based function to lazily serialize nearly +// any object into the logging context, but it's relatively slow and +// allocation-heavy. Outside tests, Any is always a better choice. +// +// If encoding fails (e.g., trying to serialize a map[int]string to JSON), Reflect +// includes the error message in the final log output. +func Reflect(key string, val interface{}) Field { + return Field{Key: key, Type: zapcore.ReflectType, Interface: val} +} + +// Namespace creates a named, isolated scope within the logger's context. All +// subsequent fields will be added to the new namespace. +// +// This helps prevent key collisions when injecting loggers into sub-components +// or third-party libraries. +func Namespace(key string) Field { + return Field{Key: key, Type: zapcore.NamespaceType} +} + +// Stringer constructs a field with the given key and the output of the value's +// String method. The Stringer's String method is called lazily. +func Stringer(key string, val fmt.Stringer) Field { + return Field{Key: key, Type: zapcore.StringerType, Interface: val} +} + +// Time constructs a Field with the given key and value. The encoder +// controls how the time is serialized. +func Time(key string, val time.Time) Field { + return Field{Key: key, Type: zapcore.TimeType, Integer: val.UnixNano(), Interface: val.Location()} +} + +// Stack constructs a field that stores a stacktrace of the current goroutine +// under provided key. Keep in mind that taking a stacktrace is eager and +// expensive (relatively speaking); this function both makes an allocation and +// takes about two microseconds. +func Stack(key string) Field { + // Returning the stacktrace as a string costs an allocation, but saves us + // from expanding the zapcore.Field union struct to include a byte slice. Since + // taking a stacktrace is already so expensive (~10us), the extra allocation + // is okay. + return String(key, takeStacktrace()) +} + +// Duration constructs a field with the given key and value. The encoder +// controls how the duration is serialized. +func Duration(key string, val time.Duration) Field { + return Field{Key: key, Type: zapcore.DurationType, Integer: int64(val)} +} + +// Object constructs a field with the given key and ObjectMarshaler. It +// provides a flexible, but still type-safe and efficient, way to add map- or +// struct-like user-defined types to the logging context. The struct's +// MarshalLogObject method is called lazily. +func Object(key string, val zapcore.ObjectMarshaler) Field { + return Field{Key: key, Type: zapcore.ObjectMarshalerType, Interface: val} +} + +// Any takes a key and an arbitrary value and chooses the best way to represent +// them as a field, falling back to a reflection-based approach only if +// necessary. +// +// Since byte/uint8 and rune/int32 are aliases, Any can't differentiate between +// them. To minimize surprises, []byte values are treated as binary blobs, byte +// values are treated as uint8, and runes are always treated as integers. +func Any(key string, value interface{}) Field { + switch val := value.(type) { + case zapcore.ObjectMarshaler: + return Object(key, val) + case zapcore.ArrayMarshaler: + return Array(key, val) + case bool: + return Bool(key, val) + case []bool: + return Bools(key, val) + case complex128: + return Complex128(key, val) + case []complex128: + return Complex128s(key, val) + case complex64: + return Complex64(key, val) + case []complex64: + return Complex64s(key, val) + case float64: + return Float64(key, val) + case []float64: + return Float64s(key, val) + case float32: + return Float32(key, val) + case []float32: + return Float32s(key, val) + case int: + return Int(key, val) + case []int: + return Ints(key, val) + case int64: + return Int64(key, val) + case []int64: + return Int64s(key, val) + case int32: + return Int32(key, val) + case []int32: + return Int32s(key, val) + case int16: + return Int16(key, val) + case []int16: + return Int16s(key, val) + case int8: + return Int8(key, val) + case []int8: + return Int8s(key, val) + case string: + return String(key, val) + case []string: + return Strings(key, val) + case uint: + return Uint(key, val) + case []uint: + return Uints(key, val) + case uint64: + return Uint64(key, val) + case []uint64: + return Uint64s(key, val) + case uint32: + return Uint32(key, val) + case []uint32: + return Uint32s(key, val) + case uint16: + return Uint16(key, val) + case []uint16: + return Uint16s(key, val) + case uint8: + return Uint8(key, val) + case []byte: + return Binary(key, val) + case uintptr: + return Uintptr(key, val) + case []uintptr: + return Uintptrs(key, val) + case time.Time: + return Time(key, val) + case []time.Time: + return Times(key, val) + case time.Duration: + return Duration(key, val) + case []time.Duration: + return Durations(key, val) + case error: + return NamedError(key, val) + case []error: + return Errors(key, val) + case fmt.Stringer: + return Stringer(key, val) + default: + return Reflect(key, val) + } +} diff --git a/api/vendor/go.uber.org/zap/field_test.go b/api/vendor/go.uber.org/zap/field_test.go new file mode 100644 index 0000000..069bfe3 --- /dev/null +++ b/api/vendor/go.uber.org/zap/field_test.go @@ -0,0 +1,159 @@ +// 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 +// 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. + +package zap + +import ( + "net" + "sync" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "go.uber.org/zap/zapcore" +) + +type username string + +func (n username) MarshalLogObject(enc zapcore.ObjectEncoder) error { + enc.AddString("username", string(n)) + return nil +} + +func assertCanBeReused(t testing.TB, field Field) { + var wg sync.WaitGroup + + for i := 0; i < 100; i++ { + enc := zapcore.NewMapObjectEncoder() + + // Ensure using the field in multiple encoders in separate goroutines + // does not cause any races or panics. + wg.Add(1) + go func() { + defer wg.Done() + assert.NotPanics(t, func() { + field.AddTo(enc) + }, "Reusing a field should not cause issues") + }() + } + + wg.Wait() +} + +func TestFieldConstructors(t *testing.T) { + // Interface types. + addr := net.ParseIP("1.2.3.4") + name := username("phil") + ints := []int{5, 6} + + tests := []struct { + name string + field Field + expect Field + }{ + {"Skip", Field{Type: zapcore.SkipType}, Skip()}, + {"Binary", Field{Key: "k", Type: zapcore.BinaryType, Interface: []byte("ab12")}, Binary("k", []byte("ab12"))}, + {"Bool", Field{Key: "k", Type: zapcore.BoolType, Integer: 1}, Bool("k", true)}, + {"Bool", Field{Key: "k", Type: zapcore.BoolType, Integer: 1}, Bool("k", true)}, + {"ByteString", Field{Key: "k", Type: zapcore.ByteStringType, Interface: []byte("ab12")}, ByteString("k", []byte("ab12"))}, + {"Complex128", Field{Key: "k", Type: zapcore.Complex128Type, Interface: 1 + 2i}, Complex128("k", 1+2i)}, + {"Complex64", Field{Key: "k", Type: zapcore.Complex64Type, Interface: complex64(1 + 2i)}, Complex64("k", 1+2i)}, + {"Duration", Field{Key: "k", Type: zapcore.DurationType, Integer: 1}, Duration("k", 1)}, + {"Int", Field{Key: "k", Type: zapcore.Int64Type, Integer: 1}, Int("k", 1)}, + {"Int64", Field{Key: "k", Type: zapcore.Int64Type, Integer: 1}, Int64("k", 1)}, + {"Int32", Field{Key: "k", Type: zapcore.Int32Type, Integer: 1}, Int32("k", 1)}, + {"Int16", Field{Key: "k", Type: zapcore.Int16Type, Integer: 1}, Int16("k", 1)}, + {"Int8", Field{Key: "k", Type: zapcore.Int8Type, Integer: 1}, Int8("k", 1)}, + {"String", Field{Key: "k", Type: zapcore.StringType, String: "foo"}, String("k", "foo")}, + {"Time", Field{Key: "k", Type: zapcore.TimeType, Integer: 0, Interface: time.UTC}, Time("k", time.Unix(0, 0).In(time.UTC))}, + {"Time", Field{Key: "k", Type: zapcore.TimeType, Integer: 1000, Interface: time.UTC}, Time("k", time.Unix(0, 1000).In(time.UTC))}, + {"Uint", Field{Key: "k", Type: zapcore.Uint64Type, Integer: 1}, Uint("k", 1)}, + {"Uint64", Field{Key: "k", Type: zapcore.Uint64Type, Integer: 1}, Uint64("k", 1)}, + {"Uint32", Field{Key: "k", Type: zapcore.Uint32Type, Integer: 1}, Uint32("k", 1)}, + {"Uint16", Field{Key: "k", Type: zapcore.Uint16Type, Integer: 1}, Uint16("k", 1)}, + {"Uint8", Field{Key: "k", Type: zapcore.Uint8Type, Integer: 1}, Uint8("k", 1)}, + {"Uintptr", Field{Key: "k", Type: zapcore.UintptrType, Integer: 10}, Uintptr("k", 0xa)}, + {"Reflect", Field{Key: "k", Type: zapcore.ReflectType, Interface: ints}, Reflect("k", ints)}, + {"Stringer", Field{Key: "k", Type: zapcore.StringerType, Interface: addr}, Stringer("k", addr)}, + {"Object", Field{Key: "k", Type: zapcore.ObjectMarshalerType, Interface: name}, Object("k", name)}, + {"Any:ObjectMarshaler", Any("k", name), Object("k", name)}, + {"Any:ArrayMarshaler", Any("k", bools([]bool{true})), Array("k", bools([]bool{true}))}, + {"Any:Stringer", Any("k", addr), Stringer("k", addr)}, + {"Any:Bool", Any("k", true), Bool("k", true)}, + {"Any:Bools", Any("k", []bool{true}), Bools("k", []bool{true})}, + {"Any:Byte", Any("k", byte(1)), Uint8("k", 1)}, + {"Any:Bytes", Any("k", []byte{1}), Binary("k", []byte{1})}, + {"Any:Complex128", Any("k", 1+2i), Complex128("k", 1+2i)}, + {"Any:Complex128s", Any("k", []complex128{1 + 2i}), Complex128s("k", []complex128{1 + 2i})}, + {"Any:Complex64", Any("k", complex64(1+2i)), Complex64("k", 1+2i)}, + {"Any:Complex64s", Any("k", []complex64{1 + 2i}), Complex64s("k", []complex64{1 + 2i})}, + {"Any:Float64", Any("k", 3.14), Float64("k", 3.14)}, + {"Any:Float64s", Any("k", []float64{3.14}), Float64s("k", []float64{3.14})}, + {"Any:Float32", Any("k", float32(3.14)), Float32("k", 3.14)}, + {"Any:Float32s", Any("k", []float32{3.14}), Float32s("k", []float32{3.14})}, + {"Any:Int", Any("k", 1), Int("k", 1)}, + {"Any:Ints", Any("k", []int{1}), Ints("k", []int{1})}, + {"Any:Int64", Any("k", int64(1)), Int64("k", 1)}, + {"Any:Int64s", Any("k", []int64{1}), Int64s("k", []int64{1})}, + {"Any:Int32", Any("k", int32(1)), Int32("k", 1)}, + {"Any:Int32s", Any("k", []int32{1}), Int32s("k", []int32{1})}, + {"Any:Int16", Any("k", int16(1)), Int16("k", 1)}, + {"Any:Int16s", Any("k", []int16{1}), Int16s("k", []int16{1})}, + {"Any:Int8", Any("k", int8(1)), Int8("k", 1)}, + {"Any:Int8s", Any("k", []int8{1}), Int8s("k", []int8{1})}, + {"Any:Rune", Any("k", rune(1)), Int32("k", 1)}, + {"Any:Runes", Any("k", []rune{1}), Int32s("k", []int32{1})}, + {"Any:String", Any("k", "v"), String("k", "v")}, + {"Any:Strings", Any("k", []string{"v"}), Strings("k", []string{"v"})}, + {"Any:Uint", Any("k", uint(1)), Uint("k", 1)}, + {"Any:Uints", Any("k", []uint{1}), Uints("k", []uint{1})}, + {"Any:Uint64", Any("k", uint64(1)), Uint64("k", 1)}, + {"Any:Uint64s", Any("k", []uint64{1}), Uint64s("k", []uint64{1})}, + {"Any:Uint32", Any("k", uint32(1)), Uint32("k", 1)}, + {"Any:Uint32s", Any("k", []uint32{1}), Uint32s("k", []uint32{1})}, + {"Any:Uint16", Any("k", uint16(1)), Uint16("k", 1)}, + {"Any:Uint16s", Any("k", []uint16{1}), Uint16s("k", []uint16{1})}, + {"Any:Uint8", Any("k", uint8(1)), Uint8("k", 1)}, + {"Any:Uint8s", Any("k", []uint8{1}), Binary("k", []uint8{1})}, + {"Any:Uintptr", Any("k", uintptr(1)), Uintptr("k", 1)}, + {"Any:Uintptrs", Any("k", []uintptr{1}), Uintptrs("k", []uintptr{1})}, + {"Any:Time", Any("k", time.Unix(0, 0)), Time("k", time.Unix(0, 0))}, + {"Any:Times", Any("k", []time.Time{time.Unix(0, 0)}), Times("k", []time.Time{time.Unix(0, 0)})}, + {"Any:Duration", Any("k", time.Second), Duration("k", time.Second)}, + {"Any:Durations", Any("k", []time.Duration{time.Second}), Durations("k", []time.Duration{time.Second})}, + {"Any:Fallback", Any("k", struct{}{}), Reflect("k", struct{}{})}, + {"Namespace", Namespace("k"), Field{Key: "k", Type: zapcore.NamespaceType}}, + } + + for _, tt := range tests { + if !assert.Equal(t, tt.expect, tt.field, "Unexpected output from convenience field constructor %s.", tt.name) { + t.Logf("type expected: %T\nGot: %T", tt.expect.Interface, tt.field.Interface) + } + assertCanBeReused(t, tt.field) + } +} + +func TestStackField(t *testing.T) { + f := Stack("stacktrace") + assert.Equal(t, "stacktrace", f.Key, "Unexpected field key.") + assert.Equal(t, zapcore.StringType, f.Type, "Unexpected field type.") + assert.Equal(t, takeStacktrace(), f.String, "Unexpected stack trace") + assertCanBeReused(t, f) +} diff --git a/api/vendor/go.uber.org/zap/flag.go b/api/vendor/go.uber.org/zap/flag.go new file mode 100644 index 0000000..1312875 --- /dev/null +++ b/api/vendor/go.uber.org/zap/flag.go @@ -0,0 +1,39 @@ +// 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 +// 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. + +package zap + +import ( + "flag" + + "go.uber.org/zap/zapcore" +) + +// LevelFlag uses the standard library's flag.Var to declare a global flag +// with the specified name, default, and usage guidance. The returned value is +// a pointer to the value of the flag. +// +// If you don't want to use the flag package's global state, you can use any +// non-nil *Level as a flag.Value with your own *flag.FlagSet. +func LevelFlag(name string, defaultLevel zapcore.Level, usage string) *zapcore.Level { + lvl := defaultLevel + flag.Var(&lvl, name, usage) + return &lvl +} diff --git a/api/vendor/go.uber.org/zap/flag_test.go b/api/vendor/go.uber.org/zap/flag_test.go new file mode 100644 index 0000000..b169894 --- /dev/null +++ b/api/vendor/go.uber.org/zap/flag_test.go @@ -0,0 +1,102 @@ +// 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 +// 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. + +package zap + +import ( + "flag" + "io/ioutil" + "testing" + + "go.uber.org/zap/zapcore" + + "github.com/stretchr/testify/assert" +) + +type flagTestCase struct { + args []string + wantLevel zapcore.Level + wantErr bool +} + +func (tc flagTestCase) runImplicitSet(t testing.TB) { + origCommandLine := flag.CommandLine + flag.CommandLine = flag.NewFlagSet("test", flag.ContinueOnError) + flag.CommandLine.SetOutput(ioutil.Discard) + defer func() { flag.CommandLine = origCommandLine }() + + level := LevelFlag("level", InfoLevel, "") + tc.run(t, flag.CommandLine, level) +} + +func (tc flagTestCase) runExplicitSet(t testing.TB) { + var lvl zapcore.Level + set := flag.NewFlagSet("test", flag.ContinueOnError) + set.Var(&lvl, "level", "minimum enabled logging level") + tc.run(t, set, &lvl) +} + +func (tc flagTestCase) run(t testing.TB, set *flag.FlagSet, actual *zapcore.Level) { + err := set.Parse(tc.args) + if tc.wantErr { + assert.Error(t, err, "Parse(%v) should fail.", tc.args) + return + } + if assert.NoError(t, err, "Parse(%v) should succeed.", tc.args) { + assert.Equal(t, tc.wantLevel, *actual, "Level mismatch.") + } +} + +func TestLevelFlag(t *testing.T) { + tests := []flagTestCase{ + { + args: nil, + wantLevel: zapcore.InfoLevel, + }, + { + args: []string{"--level", "unknown"}, + wantErr: true, + }, + { + args: []string{"--level", "error"}, + wantLevel: zapcore.ErrorLevel, + }, + } + + for _, tt := range tests { + tt.runExplicitSet(t) + tt.runImplicitSet(t) + } +} + +func TestLevelFlagsAreIndependent(t *testing.T) { + origCommandLine := flag.CommandLine + flag.CommandLine = flag.NewFlagSet("test", flag.ContinueOnError) + flag.CommandLine.SetOutput(ioutil.Discard) + defer func() { flag.CommandLine = origCommandLine }() + + // Make sure that these two flags are independent. + fileLevel := LevelFlag("file-level", InfoLevel, "") + consoleLevel := LevelFlag("console-level", InfoLevel, "") + + assert.NoError(t, flag.CommandLine.Parse([]string{"-file-level", "debug"}), "Unexpected flag-parsing error.") + assert.Equal(t, InfoLevel, *consoleLevel, "Expected file logging level to remain unchanged.") + assert.Equal(t, DebugLevel, *fileLevel, "Expected console logging level to have changed.") +} diff --git a/api/vendor/go.uber.org/zap/glide.lock b/api/vendor/go.uber.org/zap/glide.lock new file mode 100644 index 0000000..881b462 --- /dev/null +++ b/api/vendor/go.uber.org/zap/glide.lock @@ -0,0 +1,76 @@ +hash: f073ba522c06c88ea3075bde32a8aaf0969a840a66cab6318a0897d141ffee92 +updated: 2017-07-22T18:06:49.598185334-07:00 +imports: +- name: go.uber.org/atomic + version: 4e336646b2ef9fc6e47be8e21594178f98e5ebcf +- name: go.uber.org/multierr + version: 3c4937480c32f4c13a875a1829af76c98ca3d40a +testImports: +- name: github.com/apex/log + version: d9b960447bfa720077b2da653cc79e533455b499 + subpackages: + - handlers/json +- name: github.com/axw/gocov + version: 3a69a0d2a4ef1f263e2d92b041a69593d6964fe8 + subpackages: + - gocov +- name: github.com/davecgh/go-spew + version: 04cdfd42973bb9c8589fd6a731800cf222fde1a9 + subpackages: + - spew +- name: github.com/fatih/color + version: 62e9147c64a1ed519147b62a56a14e83e2be02c1 +- name: github.com/go-kit/kit + version: e10f5bf035be9af21fd5b2fb4469d5716c6ab07d + subpackages: + - log +- name: github.com/go-logfmt/logfmt + version: 390ab7935ee28ec6b286364bba9b4dd6410cb3d5 +- name: github.com/go-stack/stack + version: 54be5f394ed2c3e19dac9134a40a95ba5a017f7b +- name: github.com/golang/lint + version: c5fb716d6688a859aae56d26d3e6070808df29f7 + subpackages: + - golint +- name: github.com/kr/logfmt + version: b84e30acd515aadc4b783ad4ff83aff3299bdfe0 +- name: github.com/mattn/go-colorable + version: 3fa8c76f9daed4067e4a806fb7e4dc86455c6d6a +- name: github.com/mattn/go-isatty + version: fc9e8d8ef48496124e79ae0df75490096eccf6fe +- name: github.com/mattn/goveralls + version: 6efce81852ad1b7567c17ad71b03aeccc9dd9ae0 +- name: github.com/pborman/uuid + version: e790cca94e6cc75c7064b1332e63811d4aae1a53 +- name: github.com/pkg/errors + version: 645ef00459ed84a119197bfb8d8205042c6df63d +- name: github.com/pmezard/go-difflib + version: d8ed2627bdf02c080bf22230dbb337003b7aba2d + subpackages: + - difflib +- name: github.com/rs/zerolog + version: eed4c2b94d945e0b2456ad6aa518a443986b5f22 +- name: github.com/satori/go.uuid + version: 5bf94b69c6b68ee1b541973bb8e1144db23a194b +- name: github.com/sirupsen/logrus + version: 7dd06bf38e1e13df288d471a57d5adbac106be9e +- name: github.com/stretchr/testify + version: f6abca593680b2315d2075e0f5e2a9751e3f431a + subpackages: + - assert + - require +- name: go.pedge.io/lion + version: 87958e8713f1fa138d993087133b97e976642159 +- name: golang.org/x/sys + version: c4489faa6e5ab84c0ef40d6ee878f7a030281f0f + subpackages: + - unix +- name: golang.org/x/tools + version: 496819729719f9d07692195e0a94d6edd2251389 + subpackages: + - cover +- name: gopkg.in/inconshreveable/log15.v2 + version: b105bd37f74e5d9dc7b6ad7806715c7a2b83fd3f + subpackages: + - stack + - term diff --git a/api/vendor/go.uber.org/zap/glide.yaml b/api/vendor/go.uber.org/zap/glide.yaml new file mode 100644 index 0000000..9441259 --- /dev/null +++ b/api/vendor/go.uber.org/zap/glide.yaml @@ -0,0 +1,35 @@ +package: go.uber.org/zap +license: MIT +import: +- package: go.uber.org/atomic + version: ^1 +- package: go.uber.org/multierr + version: ^1 +testImport: +- package: github.com/satori/go.uuid +- package: github.com/sirupsen/logrus +- package: github.com/apex/log + subpackages: + - handlers/json +- package: github.com/go-kit/kit + subpackages: + - log +- package: github.com/stretchr/testify + subpackages: + - assert + - require +- package: gopkg.in/inconshreveable/log15.v2 +- package: github.com/mattn/goveralls +- package: github.com/pborman/uuid +- package: github.com/pkg/errors +- package: go.pedge.io/lion +- package: github.com/rs/zerolog +- package: golang.org/x/tools + subpackages: + - cover +- package: github.com/golang/lint + subpackages: + - golint +- package: github.com/axw/gocov + subpackages: + - gocov diff --git a/api/vendor/go.uber.org/zap/global.go b/api/vendor/go.uber.org/zap/global.go new file mode 100644 index 0000000..d02232e --- /dev/null +++ b/api/vendor/go.uber.org/zap/global.go @@ -0,0 +1,169 @@ +// 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 +// 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. + +package zap + +import ( + "bytes" + "fmt" + "log" + "os" + "sync" + + "go.uber.org/zap/zapcore" +) + +const ( + _stdLogDefaultDepth = 2 + _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" +) + +var ( + _globalMu sync.RWMutex + _globalL = NewNop() + _globalS = _globalL.Sugar() +) + +// L returns the global Logger, which can be reconfigured with ReplaceGlobals. +// It's safe for concurrent use. +func L() *Logger { + _globalMu.RLock() + l := _globalL + _globalMu.RUnlock() + return l +} + +// S returns the global SugaredLogger, which can be reconfigured with +// ReplaceGlobals. It's safe for concurrent use. +func S() *SugaredLogger { + _globalMu.RLock() + s := _globalS + _globalMu.RUnlock() + return s +} + +// ReplaceGlobals replaces the global Logger and SugaredLogger, and returns a +// function to restore the original values. It's safe for concurrent use. +func ReplaceGlobals(logger *Logger) func() { + _globalMu.Lock() + prev := _globalL + _globalL = logger + _globalS = logger.Sugar() + _globalMu.Unlock() + return func() { ReplaceGlobals(prev) } +} + +// NewStdLog returns a *log.Logger which writes to the supplied zap Logger at +// InfoLevel. To redirect the standard library's package-global logging +// functions, use RedirectStdLog instead. +func NewStdLog(l *Logger) *log.Logger { + logger := l.WithOptions(AddCallerSkip(_stdLogDefaultDepth + _loggerWriterDepth)) + f := logger.Info + return log.New(&loggerWriter{f}, "" /* prefix */, 0 /* flags */) +} + +// NewStdLogAt returns *log.Logger which writes to supplied zap logger at +// required level. +func NewStdLogAt(l *Logger, level zapcore.Level) (*log.Logger, error) { + logger := l.WithOptions(AddCallerSkip(_stdLogDefaultDepth + _loggerWriterDepth)) + logFunc, err := levelToFunc(logger, level) + if err != nil { + return nil, err + } + return log.New(&loggerWriter{logFunc}, "" /* prefix */, 0 /* flags */), nil +} + +// RedirectStdLog redirects output from the standard library's package-global +// logger to the supplied logger at InfoLevel. Since zap already handles caller +// annotations, timestamps, etc., it automatically disables the standard +// library's annotations and prefixing. +// +// It returns a function to restore the original prefix and flags and reset the +// standard library's output to os.Stderr. +func RedirectStdLog(l *Logger) func() { + f, err := redirectStdLogAt(l, InfoLevel) + if err != nil { + // Can't get here, since passing InfoLevel to redirectStdLogAt always + // works. + panic(fmt.Sprintf(_programmerErrorTemplate, err)) + } + return f +} + +// RedirectStdLogAt redirects output from the standard library's package-global +// logger to the supplied logger at the specified level. Since zap already +// handles caller annotations, timestamps, etc., it automatically disables the +// standard library's annotations and prefixing. +// +// It returns a function to restore the original prefix and flags and reset the +// standard library's output to os.Stderr. +func RedirectStdLogAt(l *Logger, level zapcore.Level) (func(), error) { + return redirectStdLogAt(l, level) +} + +func redirectStdLogAt(l *Logger, level zapcore.Level) (func(), error) { + flags := log.Flags() + prefix := log.Prefix() + log.SetFlags(0) + log.SetPrefix("") + logger := l.WithOptions(AddCallerSkip(_stdLogDefaultDepth + _loggerWriterDepth)) + logFunc, err := levelToFunc(logger, level) + if err != nil { + return nil, err + } + log.SetOutput(&loggerWriter{logFunc}) + return func() { + log.SetFlags(flags) + log.SetPrefix(prefix) + log.SetOutput(os.Stderr) + }, nil +} + +func levelToFunc(logger *Logger, lvl zapcore.Level) (func(string, ...Field), error) { + switch lvl { + case DebugLevel: + return logger.Debug, nil + case InfoLevel: + return logger.Info, nil + case WarnLevel: + return logger.Warn, nil + case ErrorLevel: + return logger.Error, nil + case DPanicLevel: + return logger.DPanic, nil + case PanicLevel: + return logger.Panic, nil + case FatalLevel: + return logger.Fatal, nil + } + return nil, fmt.Errorf("unrecognized level: %q", lvl) +} + +type loggerWriter struct { + logFunc func(msg string, fields ...Field) +} + +func (l *loggerWriter) Write(p []byte) (int, error) { + p = bytes.TrimSpace(p) + l.logFunc(string(p)) + return len(p), nil +} diff --git a/api/vendor/go.uber.org/zap/global_test.go b/api/vendor/go.uber.org/zap/global_test.go new file mode 100644 index 0000000..e169f51 --- /dev/null +++ b/api/vendor/go.uber.org/zap/global_test.go @@ -0,0 +1,280 @@ +// 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 +// 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. + +package zap + +import ( + "log" + "sync" + "testing" + "time" + + "go.uber.org/zap/internal/exit" + "go.uber.org/zap/internal/ztest" + + "go.uber.org/zap/zapcore" + "go.uber.org/zap/zaptest/observer" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.uber.org/atomic" +) + +func TestReplaceGlobals(t *testing.T) { + initialL := *L() + initialS := *S() + + withLogger(t, DebugLevel, nil, func(l *Logger, logs *observer.ObservedLogs) { + L().Info("no-op") + S().Info("no-op") + assert.Equal(t, 0, logs.Len(), "Expected initial logs to go to default no-op global.") + + defer ReplaceGlobals(l)() + + L().Info("captured") + S().Info("captured") + expected := observer.LoggedEntry{ + Entry: zapcore.Entry{Message: "captured"}, + Context: []Field{}, + } + assert.Equal( + t, + []observer.LoggedEntry{expected, expected}, + logs.AllUntimed(), + "Unexpected global log output.", + ) + }) + + assert.Equal(t, initialL, *L(), "Expected func returned from ReplaceGlobals to restore initial L.") + assert.Equal(t, initialS, *S(), "Expected func returned from ReplaceGlobals to restore initial S.") +} + +func TestGlobalsConcurrentUse(t *testing.T) { + var ( + stop atomic.Bool + wg sync.WaitGroup + ) + + for i := 0; i < 100; i++ { + wg.Add(2) + go func() { + for !stop.Load() { + ReplaceGlobals(NewNop()) + } + wg.Done() + }() + go func() { + for !stop.Load() { + L().With(Int("foo", 42)).Named("main").WithOptions(Development()).Info("") + S().Info("") + } + wg.Done() + }() + } + + ztest.Sleep(100 * time.Millisecond) + stop.Toggle() + wg.Wait() +} + +func TestNewStdLog(t *testing.T) { + withLogger(t, DebugLevel, []Option{AddCaller()}, func(l *Logger, logs *observer.ObservedLogs) { + std := NewStdLog(l) + std.Print("redirected") + checkStdLogMessage(t, "redirected", logs) + }) +} + +func TestNewStdLogAt(t *testing.T) { + // include DPanicLevel here, but do not include Development in options + levels := []zapcore.Level{DebugLevel, InfoLevel, WarnLevel, ErrorLevel, DPanicLevel} + for _, level := range levels { + withLogger(t, DebugLevel, []Option{AddCaller()}, func(l *Logger, logs *observer.ObservedLogs) { + std, err := NewStdLogAt(l, level) + require.NoError(t, err, "Unexpected error.") + std.Print("redirected") + checkStdLogMessage(t, "redirected", logs) + }) + } +} + +func TestNewStdLogAtPanics(t *testing.T) { + // include DPanicLevel here and enable Development in options + levels := []zapcore.Level{DPanicLevel, PanicLevel} + for _, level := range levels { + withLogger(t, DebugLevel, []Option{AddCaller(), Development()}, func(l *Logger, logs *observer.ObservedLogs) { + std, err := NewStdLogAt(l, level) + require.NoError(t, err, "Unexpected error") + assert.Panics(t, func() { std.Print("redirected") }, "Expected log to panic.") + checkStdLogMessage(t, "redirected", logs) + }) + } +} + +func TestNewStdLogAtFatal(t *testing.T) { + withLogger(t, DebugLevel, []Option{AddCaller()}, func(l *Logger, logs *observer.ObservedLogs) { + stub := exit.WithStub(func() { + std, err := NewStdLogAt(l, FatalLevel) + require.NoError(t, err, "Unexpected error.") + std.Print("redirected") + checkStdLogMessage(t, "redirected", logs) + }) + assert.True(t, true, stub.Exited, "Expected Fatal logger call to terminate process.") + stub.Unstub() + }) +} + +func TestNewStdLogAtInvalid(t *testing.T) { + _, err := NewStdLogAt(NewNop(), zapcore.Level(99)) + assert.Error(t, err, "Expected to get error.") + assert.Contains(t, err.Error(), "99", "Expected level code in error message") +} + +func TestRedirectStdLog(t *testing.T) { + initialFlags := log.Flags() + initialPrefix := log.Prefix() + + withLogger(t, DebugLevel, nil, func(l *Logger, logs *observer.ObservedLogs) { + defer RedirectStdLog(l)() + log.Print("redirected") + + assert.Equal(t, []observer.LoggedEntry{{ + Entry: zapcore.Entry{Message: "redirected"}, + Context: []Field{}, + }}, logs.AllUntimed(), "Unexpected global log output.") + }) + + assert.Equal(t, initialFlags, log.Flags(), "Expected to reset initial flags.") + assert.Equal(t, initialPrefix, log.Prefix(), "Expected to reset initial prefix.") +} + +func TestRedirectStdLogCaller(t *testing.T) { + withLogger(t, DebugLevel, []Option{AddCaller()}, func(l *Logger, logs *observer.ObservedLogs) { + defer RedirectStdLog(l)() + log.Print("redirected") + entries := logs.All() + require.Len(t, entries, 1, "Unexpected number of logs.") + assert.Contains(t, entries[0].Entry.Caller.File, "global_test.go", "Unexpected caller annotation.") + }) +} + +func TestRedirectStdLogAt(t *testing.T) { + initialFlags := log.Flags() + initialPrefix := log.Prefix() + + // include DPanicLevel here, but do not include Development in options + levels := []zapcore.Level{DebugLevel, InfoLevel, WarnLevel, ErrorLevel, DPanicLevel} + for _, level := range levels { + withLogger(t, DebugLevel, nil, func(l *Logger, logs *observer.ObservedLogs) { + restore, err := RedirectStdLogAt(l, level) + require.NoError(t, err, "Unexpected error.") + defer restore() + log.Print("redirected") + + assert.Equal(t, []observer.LoggedEntry{{ + Entry: zapcore.Entry{Level: level, Message: "redirected"}, + Context: []Field{}, + }}, logs.AllUntimed(), "Unexpected global log output.") + }) + } + + assert.Equal(t, initialFlags, log.Flags(), "Expected to reset initial flags.") + assert.Equal(t, initialPrefix, log.Prefix(), "Expected to reset initial prefix.") +} + +func TestRedirectStdLogAtCaller(t *testing.T) { + // include DPanicLevel here, but do not include Development in options + levels := []zapcore.Level{DebugLevel, InfoLevel, WarnLevel, ErrorLevel, DPanicLevel} + for _, level := range levels { + withLogger(t, DebugLevel, []Option{AddCaller()}, func(l *Logger, logs *observer.ObservedLogs) { + restore, err := RedirectStdLogAt(l, level) + require.NoError(t, err, "Unexpected error.") + defer restore() + log.Print("redirected") + entries := logs.All() + require.Len(t, entries, 1, "Unexpected number of logs.") + assert.Contains(t, entries[0].Entry.Caller.File, "global_test.go", "Unexpected caller annotation.") + }) + } +} + +func TestRedirectStdLogAtPanics(t *testing.T) { + initialFlags := log.Flags() + initialPrefix := log.Prefix() + + // include DPanicLevel here and enable Development in options + levels := []zapcore.Level{DPanicLevel, PanicLevel} + for _, level := range levels { + withLogger(t, DebugLevel, []Option{AddCaller(), Development()}, func(l *Logger, logs *observer.ObservedLogs) { + restore, err := RedirectStdLogAt(l, level) + require.NoError(t, err, "Unexpected error.") + defer restore() + assert.Panics(t, func() { log.Print("redirected") }, "Expected log to panic.") + checkStdLogMessage(t, "redirected", logs) + }) + } + + assert.Equal(t, initialFlags, log.Flags(), "Expected to reset initial flags.") + assert.Equal(t, initialPrefix, log.Prefix(), "Expected to reset initial prefix.") +} + +func TestRedirectStdLogAtFatal(t *testing.T) { + initialFlags := log.Flags() + initialPrefix := log.Prefix() + + withLogger(t, DebugLevel, []Option{AddCaller()}, func(l *Logger, logs *observer.ObservedLogs) { + stub := exit.WithStub(func() { + restore, err := RedirectStdLogAt(l, FatalLevel) + require.NoError(t, err, "Unexpected error.") + defer restore() + log.Print("redirected") + checkStdLogMessage(t, "redirected", logs) + }) + assert.True(t, true, stub.Exited, "Expected Fatal logger call to terminate process.") + stub.Unstub() + }) + + assert.Equal(t, initialFlags, log.Flags(), "Expected to reset initial flags.") + assert.Equal(t, initialPrefix, log.Prefix(), "Expected to reset initial prefix.") +} + +func TestRedirectStdLogAtInvalid(t *testing.T) { + restore, err := RedirectStdLogAt(NewNop(), zapcore.Level(99)) + defer func() { + if restore != nil { + restore() + } + }() + require.Error(t, err, "Expected to get error.") + assert.Contains(t, err.Error(), "99", "Expected level code in error message") +} + +func checkStdLogMessage(t *testing.T, msg string, logs *observer.ObservedLogs) { + require.Equal(t, 1, logs.Len(), "Expected exactly one entry to be logged") + entry := logs.AllUntimed()[0] + assert.Equal(t, []Field{}, entry.Context, "Unexpected entry context.") + assert.Equal(t, "redirected", entry.Entry.Message, "Unexpected entry message.") + assert.Regexp( + t, + `go.uber.org/zap/global_test.go:\d+$`, + entry.Entry.Caller.String(), + "Unexpected caller annotation.", + ) +} diff --git a/api/vendor/go.uber.org/zap/http_handler.go b/api/vendor/go.uber.org/zap/http_handler.go new file mode 100644 index 0000000..f171c38 --- /dev/null +++ b/api/vendor/go.uber.org/zap/http_handler.go @@ -0,0 +1,81 @@ +// 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 +// 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. + +package zap + +import ( + "encoding/json" + "fmt" + "net/http" + + "go.uber.org/zap/zapcore" +) + +// ServeHTTP is a simple JSON endpoint that can report on or change the current +// logging level. +// +// GET requests return a JSON description of the current logging level. PUT +// requests change the logging level and expect a payload like: +// {"level":"info"} +// +// It's perfectly safe to change the logging level while a program is running. +func (lvl AtomicLevel) ServeHTTP(w http.ResponseWriter, r *http.Request) { + type errorResponse struct { + Error string `json:"error"` + } + type payload struct { + Level *zapcore.Level `json:"level"` + } + + enc := json.NewEncoder(w) + + switch r.Method { + + case "GET": + current := lvl.Level() + enc.Encode(payload{Level: ¤t}) + + case "PUT": + var req payload + + if errmess := func() string { + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + return fmt.Sprintf("Request body must be well-formed JSON: %v", err) + } + if req.Level == nil { + return "Must specify a logging level." + } + return "" + }(); errmess != "" { + w.WriteHeader(http.StatusBadRequest) + enc.Encode(errorResponse{Error: errmess}) + return + } + + lvl.SetLevel(*req.Level) + enc.Encode(req) + + default: + w.WriteHeader(http.StatusMethodNotAllowed) + enc.Encode(errorResponse{ + Error: "Only GET and PUT are supported.", + }) + } +} diff --git a/api/vendor/go.uber.org/zap/http_handler_test.go b/api/vendor/go.uber.org/zap/http_handler_test.go new file mode 100644 index 0000000..474b3c7 --- /dev/null +++ b/api/vendor/go.uber.org/zap/http_handler_test.go @@ -0,0 +1,131 @@ +// 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 +// 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. + +package zap_test + +import ( + "encoding/json" + "fmt" + "io" + "io/ioutil" + "net/http" + "net/http/httptest" + "strings" + "testing" + + . "go.uber.org/zap" + "go.uber.org/zap/zapcore" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func newHandler() (AtomicLevel, *Logger) { + lvl := NewAtomicLevel() + logger := New(zapcore.NewNopCore()) + return lvl, logger +} + +func assertCodeOK(t testing.TB, code int) { + assert.Equal(t, http.StatusOK, code, "Unexpected response status code.") +} + +func assertCodeBadRequest(t testing.TB, code int) { + assert.Equal(t, http.StatusBadRequest, code, "Unexpected response status code.") +} + +func assertCodeMethodNotAllowed(t testing.TB, code int) { + assert.Equal(t, http.StatusMethodNotAllowed, code, "Unexpected response status code.") +} + +func assertResponse(t testing.TB, expectedLevel zapcore.Level, actualBody string) { + assert.Equal(t, fmt.Sprintf(`{"level":"%s"}`, expectedLevel)+"\n", actualBody, "Unexpected response body.") +} + +func assertJSONError(t testing.TB, body string) { + // Don't need to test exact error message, but one should be present. + var payload map[string]interface{} + require.NoError(t, json.Unmarshal([]byte(body), &payload), "Expected error response to be JSON.") + + msg, ok := payload["error"] + require.True(t, ok, "Error message is an unexpected type.") + assert.NotEqual(t, "", msg, "Expected an error message in response.") +} + +func makeRequest(t testing.TB, method string, handler http.Handler, reader io.Reader) (int, string) { + ts := httptest.NewServer(handler) + defer ts.Close() + + req, err := http.NewRequest(method, ts.URL, reader) + require.NoError(t, err, "Error constructing %s request.", method) + + res, err := http.DefaultClient.Do(req) + require.NoError(t, err, "Error making %s request.", method) + defer res.Body.Close() + + body, err := ioutil.ReadAll(res.Body) + require.NoError(t, err, "Error reading request body.") + + return res.StatusCode, string(body) +} + +func TestHTTPHandlerGetLevel(t *testing.T) { + lvl, _ := newHandler() + code, body := makeRequest(t, "GET", lvl, nil) + assertCodeOK(t, code) + assertResponse(t, lvl.Level(), body) +} + +func TestHTTPHandlerPutLevel(t *testing.T) { + lvl, _ := newHandler() + + code, body := makeRequest(t, "PUT", lvl, strings.NewReader(`{"level":"warn"}`)) + + assertCodeOK(t, code) + assertResponse(t, lvl.Level(), body) +} + +func TestHTTPHandlerPutUnrecognizedLevel(t *testing.T) { + lvl, _ := newHandler() + code, body := makeRequest(t, "PUT", lvl, strings.NewReader(`{"level":"unrecognized-level"}`)) + assertCodeBadRequest(t, code) + assertJSONError(t, body) +} + +func TestHTTPHandlerNotJSON(t *testing.T) { + lvl, _ := newHandler() + code, body := makeRequest(t, "PUT", lvl, strings.NewReader(`{`)) + assertCodeBadRequest(t, code) + assertJSONError(t, body) +} + +func TestHTTPHandlerNoLevelSpecified(t *testing.T) { + lvl, _ := newHandler() + code, body := makeRequest(t, "PUT", lvl, strings.NewReader(`{}`)) + assertCodeBadRequest(t, code) + assertJSONError(t, body) +} + +func TestHTTPHandlerMethodNotAllowed(t *testing.T) { + lvl, _ := newHandler() + code, body := makeRequest(t, "POST", lvl, strings.NewReader(`{`)) + assertCodeMethodNotAllowed(t, code) + assertJSONError(t, body) +} diff --git a/api/vendor/go.uber.org/zap/internal/bufferpool/bufferpool.go b/api/vendor/go.uber.org/zap/internal/bufferpool/bufferpool.go new file mode 100644 index 0000000..dad583a --- /dev/null +++ b/api/vendor/go.uber.org/zap/internal/bufferpool/bufferpool.go @@ -0,0 +1,31 @@ +// 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 +// 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. + +// Package bufferpool houses zap's shared internal buffer pool. Third-party +// packages can recreate the same functionality with buffers.NewPool. +package bufferpool + +import "go.uber.org/zap/buffer" + +var ( + _pool = buffer.NewPool() + // Get retrieves a buffer from the pool, creating one if necessary. + Get = _pool.Get +) diff --git a/api/vendor/go.uber.org/zap/internal/color/color.go b/api/vendor/go.uber.org/zap/internal/color/color.go new file mode 100644 index 0000000..c4d5d02 --- /dev/null +++ b/api/vendor/go.uber.org/zap/internal/color/color.go @@ -0,0 +1,44 @@ +// 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 +// 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. + +// Package color adds coloring functionality for TTY output. +package color + +import "fmt" + +// Foreground colors. +const ( + Black Color = iota + 30 + Red + Green + Yellow + Blue + Magenta + Cyan + White +) + +// Color represents a text color. +type Color uint8 + +// Add adds the coloring to the given string. +func (c Color) Add(s string) string { + return fmt.Sprintf("\x1b[%dm%s\x1b[0m", uint8(c), s) +} diff --git a/api/vendor/go.uber.org/zap/internal/color/color_test.go b/api/vendor/go.uber.org/zap/internal/color/color_test.go new file mode 100644 index 0000000..4982903 --- /dev/null +++ b/api/vendor/go.uber.org/zap/internal/color/color_test.go @@ -0,0 +1,36 @@ +// 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 +// 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. + +package color + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestColorFormatting(t *testing.T) { + assert.Equal( + t, + "\x1b[31mfoo\x1b[0m", + Red.Add("foo"), + "Unexpected colored output.", + ) +} diff --git a/api/vendor/go.uber.org/zap/internal/exit/exit.go b/api/vendor/go.uber.org/zap/internal/exit/exit.go new file mode 100644 index 0000000..dfc5b05 --- /dev/null +++ b/api/vendor/go.uber.org/zap/internal/exit/exit.go @@ -0,0 +1,64 @@ +// 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 +// 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. + +// Package exit provides stubs so that unit tests can exercise code that calls +// os.Exit(1). +package exit + +import "os" + +var real = func() { os.Exit(1) } + +// Exit normally terminates the process by calling os.Exit(1). If the package +// is stubbed, it instead records a call in the testing spy. +func Exit() { + real() +} + +// A StubbedExit is a testing fake for os.Exit. +type StubbedExit struct { + Exited bool + prev func() +} + +// Stub substitutes a fake for the call to os.Exit(1). +func Stub() *StubbedExit { + s := &StubbedExit{prev: real} + real = s.exit + return s +} + +// WithStub runs the supplied function with Exit stubbed. It returns the stub +// used, so that users can test whether the process would have crashed. +func WithStub(f func()) *StubbedExit { + s := Stub() + defer s.Unstub() + f() + return s +} + +// Unstub restores the previous exit function. +func (se *StubbedExit) Unstub() { + real = se.prev +} + +func (se *StubbedExit) exit() { + se.Exited = true +} diff --git a/api/vendor/go.uber.org/zap/internal/exit/exit_test.go b/api/vendor/go.uber.org/zap/internal/exit/exit_test.go new file mode 100644 index 0000000..300cdc3 --- /dev/null +++ b/api/vendor/go.uber.org/zap/internal/exit/exit_test.go @@ -0,0 +1,42 @@ +// 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 +// 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. + +package exit + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestStub(t *testing.T) { + tests := []struct { + f func() + want bool + }{ + {Exit, true}, + {func() {}, false}, + } + + for _, tt := range tests { + s := WithStub(tt.f) + assert.Equal(t, tt.want, s.Exited, "Stub captured unexpected exit value.") + } +} diff --git a/api/vendor/go.uber.org/zap/internal/readme/readme.go b/api/vendor/go.uber.org/zap/internal/readme/readme.go new file mode 100644 index 0000000..5541457 --- /dev/null +++ b/api/vendor/go.uber.org/zap/internal/readme/readme.go @@ -0,0 +1,209 @@ +// 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 +// 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. + +package main + +import ( + "flag" + "fmt" + "io/ioutil" + "log" + "os" + "os/exec" + "sort" + "strconv" + "strings" + "text/template" + "time" +) + +var ( + libraryNameToMarkdownName = map[string]string{ + "Zap": ":zap: zap", + "Zap.Sugar": ":zap: zap (sugared)", + "stdlib.Println": "standard library", + "sirupsen/logrus": "logrus", + "go-kit/kit/log": "go-kit", + "inconshreveable/log15": "log15", + "apex/log": "apex/log", + "go.pedge.io/lion": "lion", + "rs/zerolog": "zerolog", + } +) + +func main() { + flag.Parse() + if err := do(); err != nil { + log.Fatal(err) + } +} + +func do() error { + tmplData, err := getTmplData() + if err != nil { + return err + } + data, err := ioutil.ReadAll(os.Stdin) + if err != nil { + return err + } + t, err := template.New("tmpl").Parse(string(data)) + if err != nil { + return err + } + return t.Execute(os.Stdout, tmplData) +} + +func getTmplData() (*tmplData, error) { + tmplData := &tmplData{} + rows, err := getBenchmarkRows("BenchmarkAddingFields") + if err != nil { + return nil, err + } + tmplData.BenchmarkAddingFields = rows + rows, err = getBenchmarkRows("BenchmarkAccumulatedContext") + if err != nil { + return nil, err + } + tmplData.BenchmarkAccumulatedContext = rows + rows, err = getBenchmarkRows("BenchmarkWithoutFields") + if err != nil { + return nil, err + } + tmplData.BenchmarkWithoutFields = rows + return tmplData, nil +} + +func getBenchmarkRows(benchmarkName string) (string, error) { + benchmarkOutput, err := getBenchmarkOutput(benchmarkName) + if err != nil { + return "", err + } + var benchmarkRows []*benchmarkRow + for libraryName := range libraryNameToMarkdownName { + benchmarkRow, err := getBenchmarkRow(benchmarkOutput, benchmarkName, libraryName) + if err != nil { + return "", err + } + if benchmarkRow == nil { + continue + } + benchmarkRows = append(benchmarkRows, benchmarkRow) + } + sort.Sort(benchmarkRowsByTime(benchmarkRows)) + rows := []string{ + "| Package | Time | Objects Allocated |", + "| :--- | :---: | :---: |", + } + for _, benchmarkRow := range benchmarkRows { + rows = append(rows, benchmarkRow.String()) + } + return strings.Join(rows, "\n"), nil +} + +func getBenchmarkRow(input []string, benchmarkName string, libraryName string) (*benchmarkRow, error) { + line, err := findUniqueSubstring(input, fmt.Sprintf("%s/%s-", benchmarkName, libraryName)) + if err != nil { + return nil, err + } + if line == "" { + return nil, nil + } + split := strings.Split(line, "\t") + if len(split) < 5 { + return nil, fmt.Errorf("unknown benchmark line: %s", line) + } + duration, err := time.ParseDuration(strings.Replace(strings.TrimSuffix(strings.TrimSpace(split[2]), "/op"), " ", "", -1)) + if err != nil { + return nil, err + } + allocatedBytes, err := strconv.Atoi(strings.TrimSuffix(strings.TrimSpace(split[3]), " B/op")) + if err != nil { + return nil, err + } + allocatedObjects, err := strconv.Atoi(strings.TrimSuffix(strings.TrimSpace(split[4]), " allocs/op")) + if err != nil { + return nil, err + } + return &benchmarkRow{ + libraryNameToMarkdownName[libraryName], + duration, + allocatedBytes, + allocatedObjects, + }, nil +} + +func findUniqueSubstring(input []string, substring string) (string, error) { + var output string + for _, line := range input { + if strings.Contains(line, substring) { + if output != "" { + return "", fmt.Errorf("input has duplicate substring %s", substring) + } + output = line + } + } + return output, nil +} + +func getBenchmarkOutput(benchmarkName string) ([]string, error) { + return getOutput("go", "test", fmt.Sprintf("-bench=%s", benchmarkName), "-benchmem", "./benchmarks") +} + +func getOutput(name string, arg ...string) ([]string, error) { + output, err := exec.Command(name, arg...).CombinedOutput() + if err != nil { + return nil, fmt.Errorf("error running %s %s: %v\n%s", name, strings.Join(arg, " "), err, string(output)) + } + return strings.Split(string(output), "\n"), nil +} + +type tmplData struct { + BenchmarkAddingFields string + BenchmarkAccumulatedContext string + BenchmarkWithoutFields string +} + +type benchmarkRow struct { + Name string + Time time.Duration + AllocatedBytes int + AllocatedObjects int +} + +func (b *benchmarkRow) String() string { + return fmt.Sprintf("| %s | %d ns/op | %d allocs/op |", b.Name, b.Time.Nanoseconds(), b.AllocatedObjects) +} + +type benchmarkRowsByTime []*benchmarkRow + +func (b benchmarkRowsByTime) Len() int { return len(b) } +func (b benchmarkRowsByTime) Swap(i, j int) { b[i], b[j] = b[j], b[i] } +func (b benchmarkRowsByTime) Less(i, j int) bool { + left, right := b[i], b[j] + leftZap, rightZap := strings.Contains(left.Name, "zap"), strings.Contains(right.Name, "zap") + + // If neither benchmark is for zap or both are, sort by time. + if !(leftZap || rightZap) || (leftZap && rightZap) { + return left.Time.Nanoseconds() < right.Time.Nanoseconds() + } + // Sort zap benchmark first. + return leftZap +} diff --git a/api/vendor/go.uber.org/zap/internal/ztest/doc.go b/api/vendor/go.uber.org/zap/internal/ztest/doc.go new file mode 100644 index 0000000..cd4b98c --- /dev/null +++ b/api/vendor/go.uber.org/zap/internal/ztest/doc.go @@ -0,0 +1,24 @@ +// 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 +// 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. + +// Package ztest provides low-level helpers for testing log output. These +// utilities are helpful in zap's own unit tests, but any assertions using +// them are strongly coupled to a single encoding. +package ztest // import "go.uber.org/zap/internal/ztest" diff --git a/api/vendor/go.uber.org/zap/internal/ztest/timeout.go b/api/vendor/go.uber.org/zap/internal/ztest/timeout.go new file mode 100644 index 0000000..f7d58f3 --- /dev/null +++ b/api/vendor/go.uber.org/zap/internal/ztest/timeout.go @@ -0,0 +1,59 @@ +// 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 +// 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. + +package ztest + +import ( + "log" + "os" + "strconv" + "time" +) + +var _timeoutScale = 1.0 + +// Timeout scales the provided duration by $TEST_TIMEOUT_SCALE. +func Timeout(base time.Duration) time.Duration { + return time.Duration(float64(base) * _timeoutScale) +} + +// Sleep scales the sleep duration by $TEST_TIMEOUT_SCALE. +func Sleep(base time.Duration) { + time.Sleep(Timeout(base)) +} + +// Initialize checks the environment and alters the timeout scale accordingly. +// It returns a function to undo the scaling. +func Initialize(factor string) func() { + original := _timeoutScale + fv, err := strconv.ParseFloat(factor, 64) + if err != nil { + panic(err) + } + _timeoutScale = fv + return func() { _timeoutScale = original } +} + +func init() { + if v := os.Getenv("TEST_TIMEOUT_SCALE"); v != "" { + Initialize(v) + log.Printf("Scaling timeouts by %vx.\n", _timeoutScale) + } +} diff --git a/api/vendor/go.uber.org/zap/internal/ztest/writer.go b/api/vendor/go.uber.org/zap/internal/ztest/writer.go new file mode 100644 index 0000000..9fdd580 --- /dev/null +++ b/api/vendor/go.uber.org/zap/internal/ztest/writer.go @@ -0,0 +1,96 @@ +// 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 +// 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. + +package ztest + +import ( + "bytes" + "errors" + "io/ioutil" + "strings" +) + +// A Syncer is a spy for the Sync portion of zapcore.WriteSyncer. +type Syncer struct { + err error + called bool +} + +// SetError sets the error that the Sync method will return. +func (s *Syncer) SetError(err error) { + s.err = err +} + +// Sync records that it was called, then returns the user-supplied error (if +// any). +func (s *Syncer) Sync() error { + s.called = true + return s.err +} + +// Called reports whether the Sync method was called. +func (s *Syncer) Called() bool { + return s.called +} + +// A Discarder sends all writes to ioutil.Discard. +type Discarder struct{ Syncer } + +// Write implements io.Writer. +func (d *Discarder) Write(b []byte) (int, error) { + return ioutil.Discard.Write(b) +} + +// FailWriter is a WriteSyncer that always returns an error on writes. +type FailWriter struct{ Syncer } + +// Write implements io.Writer. +func (w FailWriter) Write(b []byte) (int, error) { + return len(b), errors.New("failed") +} + +// ShortWriter is a WriteSyncer whose write method never fails, but +// nevertheless fails to the last byte of the input. +type ShortWriter struct{ Syncer } + +// Write implements io.Writer. +func (w ShortWriter) Write(b []byte) (int, error) { + return len(b) - 1, nil +} + +// Buffer is an implementation of zapcore.WriteSyncer that sends all writes to +// a bytes.Buffer. It has convenience methods to split the accumulated buffer +// on newlines. +type Buffer struct { + bytes.Buffer + Syncer +} + +// Lines returns the current buffer contents, split on newlines. +func (b *Buffer) Lines() []string { + output := strings.Split(b.String(), "\n") + return output[:len(output)-1] +} + +// Stripped returns the current buffer contents with the last trailing newline +// stripped. +func (b *Buffer) Stripped() string { + return strings.TrimRight(b.String(), "\n") +} diff --git a/api/vendor/go.uber.org/zap/level.go b/api/vendor/go.uber.org/zap/level.go new file mode 100644 index 0000000..3567a9a --- /dev/null +++ b/api/vendor/go.uber.org/zap/level.go @@ -0,0 +1,132 @@ +// 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 +// 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. + +package zap + +import ( + "go.uber.org/atomic" + "go.uber.org/zap/zapcore" +) + +const ( + // DebugLevel logs are typically voluminous, and are usually disabled in + // production. + DebugLevel = zapcore.DebugLevel + // InfoLevel is the default logging priority. + InfoLevel = zapcore.InfoLevel + // WarnLevel logs are more important than Info, but don't need individual + // human review. + WarnLevel = zapcore.WarnLevel + // ErrorLevel logs are high-priority. If an application is running smoothly, + // it shouldn't generate any error-level logs. + ErrorLevel = zapcore.ErrorLevel + // DPanicLevel logs are particularly important errors. In development the + // logger panics after writing the message. + DPanicLevel = zapcore.DPanicLevel + // PanicLevel logs a message, then panics. + PanicLevel = zapcore.PanicLevel + // FatalLevel logs a message, then calls os.Exit(1). + FatalLevel = zapcore.FatalLevel +) + +// LevelEnablerFunc is a convenient way to implement zapcore.LevelEnabler with +// an anonymous function. +// +// It's particularly useful when splitting log output between different +// outputs (e.g., standard error and standard out). For sample code, see the +// package-level AdvancedConfiguration example. +type LevelEnablerFunc func(zapcore.Level) bool + +// Enabled calls the wrapped function. +func (f LevelEnablerFunc) Enabled(lvl zapcore.Level) bool { return f(lvl) } + +// An AtomicLevel is an atomically changeable, dynamic logging level. It lets +// you safely change the log level of a tree of loggers (the root logger and +// any children created by adding context) at runtime. +// +// The AtomicLevel itself is an http.Handler that serves a JSON endpoint to +// alter its level. +// +// AtomicLevels must be created with the NewAtomicLevel constructor to allocate +// their internal atomic pointer. +type AtomicLevel struct { + l *atomic.Int32 +} + +// NewAtomicLevel creates an AtomicLevel with InfoLevel and above logging +// enabled. +func NewAtomicLevel() AtomicLevel { + return AtomicLevel{ + l: atomic.NewInt32(int32(InfoLevel)), + } +} + +// NewAtomicLevelAt is a convenience function that creates an AtomicLevel +// and then calls SetLevel with the given level. +func NewAtomicLevelAt(l zapcore.Level) AtomicLevel { + a := NewAtomicLevel() + a.SetLevel(l) + return a +} + +// Enabled implements the zapcore.LevelEnabler interface, which allows the +// AtomicLevel to be used in place of traditional static levels. +func (lvl AtomicLevel) Enabled(l zapcore.Level) bool { + return lvl.Level().Enabled(l) +} + +// Level returns the minimum enabled log level. +func (lvl AtomicLevel) Level() zapcore.Level { + return zapcore.Level(int8(lvl.l.Load())) +} + +// SetLevel alters the logging level. +func (lvl AtomicLevel) SetLevel(l zapcore.Level) { + lvl.l.Store(int32(l)) +} + +// String returns the string representation of the underlying Level. +func (lvl AtomicLevel) String() string { + return lvl.Level().String() +} + +// UnmarshalText unmarshals the text to an AtomicLevel. It uses the same text +// representations as the static zapcore.Levels ("debug", "info", "warn", +// "error", "dpanic", "panic", and "fatal"). +func (lvl *AtomicLevel) UnmarshalText(text []byte) error { + if lvl.l == nil { + lvl.l = &atomic.Int32{} + } + + var l zapcore.Level + if err := l.UnmarshalText(text); err != nil { + return err + } + + lvl.SetLevel(l) + return nil +} + +// MarshalText marshals the AtomicLevel to a byte slice. It uses the same +// text representation as the static zapcore.Levels ("debug", "info", "warn", +// "error", "dpanic", "panic", and "fatal"). +func (lvl AtomicLevel) MarshalText() (text []byte, err error) { + return lvl.Level().MarshalText() +} diff --git a/api/vendor/go.uber.org/zap/level_test.go b/api/vendor/go.uber.org/zap/level_test.go new file mode 100644 index 0000000..a8fb650 --- /dev/null +++ b/api/vendor/go.uber.org/zap/level_test.go @@ -0,0 +1,117 @@ +// 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 +// 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. + +package zap + +import ( + "sync" + "testing" + + "go.uber.org/zap/zapcore" + + "github.com/stretchr/testify/assert" +) + +func TestLevelEnablerFunc(t *testing.T) { + enab := LevelEnablerFunc(func(l zapcore.Level) bool { return l == zapcore.InfoLevel }) + tests := []struct { + level zapcore.Level + enabled bool + }{ + {DebugLevel, false}, + {InfoLevel, true}, + {WarnLevel, false}, + {ErrorLevel, false}, + {DPanicLevel, false}, + {PanicLevel, false}, + {FatalLevel, false}, + } + for _, tt := range tests { + assert.Equal(t, tt.enabled, enab.Enabled(tt.level), "Unexpected result applying LevelEnablerFunc to %s", tt.level) + } +} + +func TestNewAtomicLevel(t *testing.T) { + lvl := NewAtomicLevel() + assert.Equal(t, InfoLevel, lvl.Level(), "Unexpected initial level.") + lvl.SetLevel(ErrorLevel) + assert.Equal(t, ErrorLevel, lvl.Level(), "Unexpected level after SetLevel.") + lvl = NewAtomicLevelAt(WarnLevel) + assert.Equal(t, WarnLevel, lvl.Level(), "Unexpected level after SetLevel.") +} + +func TestAtomicLevelMutation(t *testing.T) { + lvl := NewAtomicLevel() + lvl.SetLevel(WarnLevel) + // Trigger races for non-atomic level mutations. + proceed := make(chan struct{}) + wg := &sync.WaitGroup{} + runConcurrently(10, 100, wg, func() { + <-proceed + assert.Equal(t, WarnLevel, lvl.Level()) + }) + runConcurrently(10, 100, wg, func() { + <-proceed + lvl.SetLevel(WarnLevel) + }) + close(proceed) + wg.Wait() +} + +func TestAtomicLevelText(t *testing.T) { + tests := []struct { + text string + expect zapcore.Level + err bool + }{ + {"debug", DebugLevel, false}, + {"info", InfoLevel, false}, + {"", InfoLevel, false}, + {"warn", WarnLevel, false}, + {"error", ErrorLevel, false}, + {"dpanic", DPanicLevel, false}, + {"panic", PanicLevel, false}, + {"fatal", FatalLevel, false}, + {"foobar", InfoLevel, true}, + } + + for _, tt := range tests { + var lvl AtomicLevel + // Test both initial unmarshaling and overwriting existing value. + for i := 0; i < 2; i++ { + if tt.err { + assert.Error(t, lvl.UnmarshalText([]byte(tt.text)), "Expected unmarshaling %q to fail.", tt.text) + } else { + assert.NoError(t, lvl.UnmarshalText([]byte(tt.text)), "Expected unmarshaling %q to succeed.", tt.text) + } + assert.Equal(t, tt.expect, lvl.Level(), "Unexpected level after unmarshaling.") + lvl.SetLevel(InfoLevel) + } + + // Test marshalling + if tt.text != "" && !tt.err { + lvl.SetLevel(tt.expect) + marshaled, err := lvl.MarshalText() + assert.NoError(t, err, `Unexpected error marshalling level "%v" to text.`, tt.expect) + assert.Equal(t, tt.text, string(marshaled), "Expected marshaled text to match") + assert.Equal(t, tt.text, lvl.String(), "Expected Stringer call to match") + } + } +} diff --git a/api/vendor/go.uber.org/zap/logger.go b/api/vendor/go.uber.org/zap/logger.go new file mode 100644 index 0000000..dc8f6e3 --- /dev/null +++ b/api/vendor/go.uber.org/zap/logger.go @@ -0,0 +1,305 @@ +// 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 +// 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. + +package zap + +import ( + "fmt" + "io/ioutil" + "os" + "runtime" + "strings" + "time" + + "go.uber.org/zap/zapcore" +) + +// A Logger provides fast, leveled, structured logging. All methods are safe +// for concurrent use. +// +// The Logger is designed for contexts in which every microsecond and every +// allocation matters, so its API intentionally favors performance and type +// safety over brevity. For most applications, the SugaredLogger strikes a +// better balance between performance and ergonomics. +type Logger struct { + core zapcore.Core + + development bool + name string + errorOutput zapcore.WriteSyncer + + addCaller bool + addStack zapcore.LevelEnabler + + callerSkip int +} + +// New constructs a new Logger from the provided zapcore.Core and Options. If +// the passed zapcore.Core is nil, it falls back to using a no-op +// implementation. +// +// This is the most flexible way to construct a Logger, but also the most +// verbose. For typical use cases, the highly-opinionated presets +// (NewProduction, NewDevelopment, and NewExample) or the Config struct are +// more convenient. +// +// For sample code, see the package-level AdvancedConfiguration example. +func New(core zapcore.Core, options ...Option) *Logger { + if core == nil { + return NewNop() + } + log := &Logger{ + core: core, + errorOutput: zapcore.Lock(os.Stderr), + addStack: zapcore.FatalLevel + 1, + } + return log.WithOptions(options...) +} + +// NewNop returns a no-op Logger. It never writes out logs or internal errors, +// and it never runs user-defined hooks. +// +// Using WithOptions to replace the Core or error output of a no-op Logger can +// re-enable logging. +func NewNop() *Logger { + return &Logger{ + core: zapcore.NewNopCore(), + errorOutput: zapcore.AddSync(ioutil.Discard), + addStack: zapcore.FatalLevel + 1, + } +} + +// NewProduction builds a sensible production Logger that writes InfoLevel and +// above logs to standard error as JSON. +// +// It's a shortcut for NewProductionConfig().Build(...Option). +func NewProduction(options ...Option) (*Logger, error) { + return NewProductionConfig().Build(options...) +} + +// NewDevelopment builds a development Logger that writes DebugLevel and above +// logs to standard error in a human-friendly format. +// +// It's a shortcut for NewDevelopmentConfig().Build(...Option). +func NewDevelopment(options ...Option) (*Logger, error) { + return NewDevelopmentConfig().Build(options...) +} + +// NewExample builds a Logger that's designed for use in zap's testable +// examples. It writes DebugLevel and above logs to standard out as JSON, but +// omits the timestamp and calling function to keep example output +// short and deterministic. +func NewExample(options ...Option) *Logger { + encoderCfg := zapcore.EncoderConfig{ + MessageKey: "msg", + LevelKey: "level", + NameKey: "logger", + EncodeLevel: zapcore.LowercaseLevelEncoder, + EncodeTime: zapcore.ISO8601TimeEncoder, + EncodeDuration: zapcore.StringDurationEncoder, + } + core := zapcore.NewCore(zapcore.NewJSONEncoder(encoderCfg), os.Stdout, DebugLevel) + return New(core).WithOptions(options...) +} + +// Sugar wraps the Logger to provide a more ergonomic, but slightly slower, +// API. Sugaring a Logger is quite inexpensive, so it's reasonable for a +// single application to use both Loggers and SugaredLoggers, converting +// between them on the boundaries of performance-sensitive code. +func (log *Logger) Sugar() *SugaredLogger { + core := log.clone() + core.callerSkip += 2 + return &SugaredLogger{core} +} + +// Named adds a new path segment to the logger's name. Segments are joined by +// periods. By default, Loggers are unnamed. +func (log *Logger) Named(s string) *Logger { + if s == "" { + return log + } + l := log.clone() + if log.name == "" { + l.name = s + } else { + l.name = strings.Join([]string{l.name, s}, ".") + } + return l +} + +// WithOptions clones the current Logger, applies the supplied Options, and +// returns the resulting Logger. It's safe to use concurrently. +func (log *Logger) WithOptions(opts ...Option) *Logger { + c := log.clone() + for _, opt := range opts { + opt.apply(c) + } + return c +} + +// With creates a child logger and adds structured context to it. Fields added +// to the child don't affect the parent, and vice versa. +func (log *Logger) With(fields ...Field) *Logger { + if len(fields) == 0 { + return log + } + l := log.clone() + l.core = l.core.With(fields) + return l +} + +// Check returns a CheckedEntry if logging a message at the specified level +// is enabled. It's a completely optional optimization; in high-performance +// applications, Check can help avoid allocating a slice to hold fields. +func (log *Logger) Check(lvl zapcore.Level, msg string) *zapcore.CheckedEntry { + return log.check(lvl, msg) +} + +// Debug logs a message at DebugLevel. The message includes any fields passed +// at the log site, as well as any fields accumulated on the logger. +func (log *Logger) Debug(msg string, fields ...Field) { + if ce := log.check(DebugLevel, msg); ce != nil { + ce.Write(fields...) + } +} + +// Info logs a message at InfoLevel. The message includes any fields passed +// at the log site, as well as any fields accumulated on the logger. +func (log *Logger) Info(msg string, fields ...Field) { + if ce := log.check(InfoLevel, msg); ce != nil { + ce.Write(fields...) + } +} + +// Warn logs a message at WarnLevel. The message includes any fields passed +// at the log site, as well as any fields accumulated on the logger. +func (log *Logger) Warn(msg string, fields ...Field) { + if ce := log.check(WarnLevel, msg); ce != nil { + ce.Write(fields...) + } +} + +// Error logs a message at ErrorLevel. The message includes any fields passed +// at the log site, as well as any fields accumulated on the logger. +func (log *Logger) Error(msg string, fields ...Field) { + if ce := log.check(ErrorLevel, msg); ce != nil { + ce.Write(fields...) + } +} + +// DPanic logs a message at DPanicLevel. The message includes any fields +// passed at the log site, as well as any fields accumulated on the logger. +// +// If the logger is in development mode, it then panics (DPanic means +// "development panic"). This is useful for catching errors that are +// recoverable, but shouldn't ever happen. +func (log *Logger) DPanic(msg string, fields ...Field) { + if ce := log.check(DPanicLevel, msg); ce != nil { + ce.Write(fields...) + } +} + +// Panic logs a message at PanicLevel. The message includes any fields passed +// at the log site, as well as any fields accumulated on the logger. +// +// The logger then panics, even if logging at PanicLevel is disabled. +func (log *Logger) Panic(msg string, fields ...Field) { + if ce := log.check(PanicLevel, msg); ce != nil { + ce.Write(fields...) + } +} + +// Fatal logs a message at FatalLevel. The message includes any fields passed +// at the log site, as well as any fields accumulated on the logger. +// +// The logger then calls os.Exit(1), even if logging at FatalLevel is +// disabled. +func (log *Logger) Fatal(msg string, fields ...Field) { + if ce := log.check(FatalLevel, msg); ce != nil { + ce.Write(fields...) + } +} + +// Sync calls the underlying Core's Sync method, flushing any buffered log +// entries. Applications should take care to call Sync before exiting. +func (log *Logger) Sync() error { + return log.core.Sync() +} + +// Core returns the Logger's underlying zapcore.Core. +func (log *Logger) Core() zapcore.Core { + return log.core +} + +func (log *Logger) clone() *Logger { + copy := *log + return © +} + +func (log *Logger) check(lvl zapcore.Level, msg string) *zapcore.CheckedEntry { + // check must always be called directly by a method in the Logger interface + // (e.g., Check, Info, Fatal). + const callerSkipOffset = 2 + + // Create basic checked entry thru the core; this will be non-nil if the + // log message will actually be written somewhere. + ent := zapcore.Entry{ + LoggerName: log.name, + Time: time.Now(), + Level: lvl, + Message: msg, + } + ce := log.core.Check(ent, nil) + willWrite := ce != nil + + // Set up any required terminal behavior. + switch ent.Level { + case zapcore.PanicLevel: + ce = ce.Should(ent, zapcore.WriteThenPanic) + case zapcore.FatalLevel: + ce = ce.Should(ent, zapcore.WriteThenFatal) + case zapcore.DPanicLevel: + if log.development { + ce = ce.Should(ent, zapcore.WriteThenPanic) + } + } + + // Only do further annotation if we're going to write this message; checked + // entries that exist only for terminal behavior don't benefit from + // annotation. + if !willWrite { + return ce + } + + // Thread the error output through to the CheckedEntry. + ce.ErrorOutput = log.errorOutput + if log.addCaller { + ce.Entry.Caller = zapcore.NewEntryCaller(runtime.Caller(log.callerSkip + callerSkipOffset)) + if !ce.Entry.Caller.Defined { + fmt.Fprintf(log.errorOutput, "%v Logger.check error: failed to get caller\n", time.Now().UTC()) + log.errorOutput.Sync() + } + } + if log.addStack.Enabled(ce.Entry.Level) { + ce.Entry.Stack = Stack("").String + } + + return ce +} diff --git a/api/vendor/go.uber.org/zap/logger_bench_test.go b/api/vendor/go.uber.org/zap/logger_bench_test.go new file mode 100644 index 0000000..71c6b59 --- /dev/null +++ b/api/vendor/go.uber.org/zap/logger_bench_test.go @@ -0,0 +1,222 @@ +// 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 +// 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. + +package zap + +import ( + "errors" + "testing" + "time" + + "go.uber.org/zap/internal/ztest" + "go.uber.org/zap/zapcore" +) + +type user struct { + Name string + Email string + CreatedAt time.Time +} + +func (u *user) MarshalLogObject(enc zapcore.ObjectEncoder) error { + enc.AddString("name", u.Name) + enc.AddString("email", u.Email) + enc.AddInt64("created_at", u.CreatedAt.UnixNano()) + return nil +} + +var _jane = &user{ + Name: "Jane Doe", + Email: "jane@test.com", + CreatedAt: time.Date(1980, 1, 1, 12, 0, 0, 0, time.UTC), +} + +func withBenchedLogger(b *testing.B, f func(*Logger)) { + logger := New( + zapcore.NewCore( + zapcore.NewJSONEncoder(NewProductionConfig().EncoderConfig), + &ztest.Discarder{}, + DebugLevel, + )) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + f(logger) + } + }) +} + +func BenchmarkNoContext(b *testing.B) { + withBenchedLogger(b, func(log *Logger) { + log.Info("No context.") + }) +} + +func BenchmarkBoolField(b *testing.B) { + withBenchedLogger(b, func(log *Logger) { + log.Info("Boolean.", Bool("foo", true)) + }) +} + +func BenchmarkByteStringField(b *testing.B) { + val := []byte("bar") + withBenchedLogger(b, func(log *Logger) { + log.Info("ByteString.", ByteString("foo", val)) + }) +} + +func BenchmarkFloat64Field(b *testing.B) { + withBenchedLogger(b, func(log *Logger) { + log.Info("Floating point.", Float64("foo", 3.14)) + }) +} + +func BenchmarkIntField(b *testing.B) { + withBenchedLogger(b, func(log *Logger) { + log.Info("Integer.", Int("foo", 42)) + }) +} + +func BenchmarkInt64Field(b *testing.B) { + withBenchedLogger(b, func(log *Logger) { + log.Info("64-bit integer.", Int64("foo", 42)) + }) +} + +func BenchmarkStringField(b *testing.B) { + withBenchedLogger(b, func(log *Logger) { + log.Info("Strings.", String("foo", "bar")) + }) +} + +func BenchmarkStringerField(b *testing.B) { + withBenchedLogger(b, func(log *Logger) { + log.Info("Level.", Stringer("foo", InfoLevel)) + }) +} + +func BenchmarkTimeField(b *testing.B) { + t := time.Unix(0, 0) + withBenchedLogger(b, func(log *Logger) { + log.Info("Time.", Time("foo", t)) + }) +} + +func BenchmarkDurationField(b *testing.B) { + withBenchedLogger(b, func(log *Logger) { + log.Info("Duration", Duration("foo", time.Second)) + }) +} + +func BenchmarkErrorField(b *testing.B) { + err := errors.New("egad") + withBenchedLogger(b, func(log *Logger) { + log.Info("Error.", Error(err)) + }) +} + +func BenchmarkErrorsField(b *testing.B) { + errs := []error{ + errors.New("egad"), + errors.New("oh no"), + errors.New("dear me"), + errors.New("such fail"), + } + withBenchedLogger(b, func(log *Logger) { + log.Info("Errors.", Errors("errors", errs)) + }) +} + +func BenchmarkStackField(b *testing.B) { + withBenchedLogger(b, func(log *Logger) { + log.Info("Error.", Stack("stacktrace")) + }) +} + +func BenchmarkObjectField(b *testing.B) { + withBenchedLogger(b, func(log *Logger) { + log.Info("Arbitrary ObjectMarshaler.", Object("user", _jane)) + }) +} + +func BenchmarkReflectField(b *testing.B) { + withBenchedLogger(b, func(log *Logger) { + log.Info("Reflection-based serialization.", Reflect("user", _jane)) + }) +} + +func BenchmarkAddCallerHook(b *testing.B) { + logger := New( + zapcore.NewCore( + zapcore.NewJSONEncoder(NewProductionConfig().EncoderConfig), + &ztest.Discarder{}, + InfoLevel, + ), + AddCaller(), + ) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + logger.Info("Caller.") + } + }) +} + +func Benchmark10Fields(b *testing.B) { + withBenchedLogger(b, func(log *Logger) { + log.Info("Ten fields, passed at the log site.", + Int("one", 1), + Int("two", 2), + Int("three", 3), + Int("four", 4), + Int("five", 5), + Int("six", 6), + Int("seven", 7), + Int("eight", 8), + Int("nine", 9), + Int("ten", 10), + ) + }) +} + +func Benchmark100Fields(b *testing.B) { + const batchSize = 50 + logger := New(zapcore.NewCore( + zapcore.NewJSONEncoder(NewProductionConfig().EncoderConfig), + &ztest.Discarder{}, + DebugLevel, + )) + + // Don't include allocating these helper slices in the benchmark. Since + // access to them isn't synchronized, we can't run the benchmark in + // parallel. + first := make([]Field, batchSize) + second := make([]Field, batchSize) + b.ResetTimer() + + for i := 0; i < b.N; i++ { + for i := 0; i < batchSize; i++ { + // We're duplicating keys, but that doesn't affect performance. + first[i] = Int("foo", i) + second[i] = Int("foo", i+batchSize) + } + logger.With(first...).Info("Child loggers with lots of context.", second...) + } +} diff --git a/api/vendor/go.uber.org/zap/logger_test.go b/api/vendor/go.uber.org/zap/logger_test.go new file mode 100644 index 0000000..a9f7057 --- /dev/null +++ b/api/vendor/go.uber.org/zap/logger_test.go @@ -0,0 +1,432 @@ +// 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 +// 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. + +package zap + +import ( + "errors" + "sync" + "testing" + + "go.uber.org/zap/internal/exit" + "go.uber.org/zap/internal/ztest" + "go.uber.org/zap/zapcore" + "go.uber.org/zap/zaptest/observer" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.uber.org/atomic" +) + +func makeCountingHook() (func(zapcore.Entry) error, *atomic.Int64) { + count := &atomic.Int64{} + h := func(zapcore.Entry) error { + count.Inc() + return nil + } + return h, count +} + +func TestLoggerAtomicLevel(t *testing.T) { + // Test that the dynamic level applies to all ancestors and descendants. + dl := NewAtomicLevel() + + withLogger(t, dl, nil, func(grandparent *Logger, _ *observer.ObservedLogs) { + parent := grandparent.With(Int("generation", 1)) + child := parent.With(Int("generation", 2)) + + tests := []struct { + setLevel zapcore.Level + testLevel zapcore.Level + enabled bool + }{ + {DebugLevel, DebugLevel, true}, + {InfoLevel, DebugLevel, false}, + {WarnLevel, PanicLevel, true}, + } + + for _, tt := range tests { + dl.SetLevel(tt.setLevel) + for _, logger := range []*Logger{grandparent, parent, child} { + if tt.enabled { + assert.NotNil( + t, + logger.Check(tt.testLevel, ""), + "Expected level %s to be enabled after setting level %s.", tt.testLevel, tt.setLevel, + ) + } else { + assert.Nil( + t, + logger.Check(tt.testLevel, ""), + "Expected level %s to be enabled after setting level %s.", tt.testLevel, tt.setLevel, + ) + } + } + } + }) +} + +func TestLoggerInitialFields(t *testing.T) { + fieldOpts := opts(Fields(Int("foo", 42), String("bar", "baz"))) + withLogger(t, DebugLevel, fieldOpts, func(logger *Logger, logs *observer.ObservedLogs) { + logger.Info("") + assert.Equal( + t, + observer.LoggedEntry{Context: []Field{Int("foo", 42), String("bar", "baz")}}, + logs.AllUntimed()[0], + "Unexpected output with initial fields set.", + ) + }) +} + +func TestLoggerWith(t *testing.T) { + fieldOpts := opts(Fields(Int("foo", 42))) + withLogger(t, DebugLevel, fieldOpts, func(logger *Logger, logs *observer.ObservedLogs) { + // Child loggers should have copy-on-write semantics, so two children + // shouldn't stomp on each other's fields or affect the parent's fields. + logger.With(String("one", "two")).Info("") + logger.With(String("three", "four")).Info("") + logger.Info("") + + assert.Equal(t, []observer.LoggedEntry{ + {Context: []Field{Int("foo", 42), String("one", "two")}}, + {Context: []Field{Int("foo", 42), String("three", "four")}}, + {Context: []Field{Int("foo", 42)}}, + }, logs.AllUntimed(), "Unexpected cross-talk between child loggers.") + }) +} + +func TestLoggerLogPanic(t *testing.T) { + for _, tt := range []struct { + do func(*Logger) + should bool + expected string + }{ + {func(logger *Logger) { logger.Check(PanicLevel, "bar").Write() }, true, "bar"}, + {func(logger *Logger) { logger.Panic("baz") }, true, "baz"}, + } { + withLogger(t, DebugLevel, nil, func(logger *Logger, logs *observer.ObservedLogs) { + if tt.should { + assert.Panics(t, func() { tt.do(logger) }, "Expected panic") + } else { + assert.NotPanics(t, func() { tt.do(logger) }, "Expected no panic") + } + + output := logs.AllUntimed() + assert.Equal(t, 1, len(output), "Unexpected number of logs.") + assert.Equal(t, 0, len(output[0].Context), "Unexpected context on first log.") + assert.Equal( + t, + zapcore.Entry{Message: tt.expected, Level: PanicLevel}, + output[0].Entry, + "Unexpected output from panic-level Log.", + ) + }) + } +} + +func TestLoggerLogFatal(t *testing.T) { + for _, tt := range []struct { + do func(*Logger) + expected string + }{ + {func(logger *Logger) { logger.Check(FatalLevel, "bar").Write() }, "bar"}, + {func(logger *Logger) { logger.Fatal("baz") }, "baz"}, + } { + withLogger(t, DebugLevel, nil, func(logger *Logger, logs *observer.ObservedLogs) { + stub := exit.WithStub(func() { + tt.do(logger) + }) + assert.True(t, stub.Exited, "Expected Fatal logger call to terminate process.") + output := logs.AllUntimed() + assert.Equal(t, 1, len(output), "Unexpected number of logs.") + assert.Equal(t, 0, len(output[0].Context), "Unexpected context on first log.") + assert.Equal( + t, + zapcore.Entry{Message: tt.expected, Level: FatalLevel}, + output[0].Entry, + "Unexpected output from fatal-level Log.", + ) + }) + } +} + +func TestLoggerLeveledMethods(t *testing.T) { + withLogger(t, DebugLevel, nil, func(logger *Logger, logs *observer.ObservedLogs) { + tests := []struct { + method func(string, ...Field) + expectedLevel zapcore.Level + }{ + {logger.Debug, DebugLevel}, + {logger.Info, InfoLevel}, + {logger.Warn, WarnLevel}, + {logger.Error, ErrorLevel}, + {logger.DPanic, DPanicLevel}, + } + for i, tt := range tests { + tt.method("") + output := logs.AllUntimed() + assert.Equal(t, i+1, len(output), "Unexpected number of logs.") + assert.Equal(t, 0, len(output[i].Context), "Unexpected context on first log.") + assert.Equal( + t, + zapcore.Entry{Level: tt.expectedLevel}, + output[i].Entry, + "Unexpected output from %s-level logger method.", tt.expectedLevel) + } + }) +} + +func TestLoggerAlwaysPanics(t *testing.T) { + // Users can disable writing out panic-level logs, but calls to logger.Panic() + // should still call panic(). + withLogger(t, FatalLevel, nil, func(logger *Logger, logs *observer.ObservedLogs) { + msg := "Even if output is disabled, logger.Panic should always panic." + assert.Panics(t, func() { logger.Panic("foo") }, msg) + assert.Panics(t, func() { + if ce := logger.Check(PanicLevel, "foo"); ce != nil { + ce.Write() + } + }, msg) + assert.Equal(t, 0, logs.Len(), "Panics shouldn't be written out if PanicLevel is disabled.") + }) +} + +func TestLoggerAlwaysFatals(t *testing.T) { + // Users can disable writing out fatal-level logs, but calls to logger.Fatal() + // should still terminate the process. + withLogger(t, FatalLevel+1, nil, func(logger *Logger, logs *observer.ObservedLogs) { + stub := exit.WithStub(func() { logger.Fatal("") }) + assert.True(t, stub.Exited, "Expected calls to logger.Fatal to terminate process.") + + stub = exit.WithStub(func() { + if ce := logger.Check(FatalLevel, ""); ce != nil { + ce.Write() + } + }) + assert.True(t, stub.Exited, "Expected calls to logger.Check(FatalLevel, ...) to terminate process.") + + assert.Equal(t, 0, logs.Len(), "Shouldn't write out logs when fatal-level logging is disabled.") + }) +} + +func TestLoggerDPanic(t *testing.T) { + withLogger(t, DebugLevel, nil, func(logger *Logger, logs *observer.ObservedLogs) { + assert.NotPanics(t, func() { logger.DPanic("") }) + assert.Equal( + t, + []observer.LoggedEntry{{Entry: zapcore.Entry{Level: DPanicLevel}, Context: []Field{}}}, + logs.AllUntimed(), + "Unexpected log output from DPanic in production mode.", + ) + }) + withLogger(t, DebugLevel, opts(Development()), func(logger *Logger, logs *observer.ObservedLogs) { + assert.Panics(t, func() { logger.DPanic("") }) + assert.Equal( + t, + []observer.LoggedEntry{{Entry: zapcore.Entry{Level: DPanicLevel}, Context: []Field{}}}, + logs.AllUntimed(), + "Unexpected log output from DPanic in development mode.", + ) + }) +} + +func TestLoggerNoOpsDisabledLevels(t *testing.T) { + withLogger(t, WarnLevel, nil, func(logger *Logger, logs *observer.ObservedLogs) { + logger.Info("silence!") + assert.Equal( + t, + []observer.LoggedEntry{}, + logs.AllUntimed(), + "Expected logging at a disabled level to produce no output.", + ) + }) +} + +func TestLoggerNames(t *testing.T) { + tests := []struct { + names []string + expected string + }{ + {nil, ""}, + {[]string{""}, ""}, + {[]string{"foo"}, "foo"}, + {[]string{"foo", ""}, "foo"}, + {[]string{"foo", "bar"}, "foo.bar"}, + {[]string{"foo.bar", "baz"}, "foo.bar.baz"}, + // Garbage in, garbage out. + {[]string{"foo.", "bar"}, "foo..bar"}, + {[]string{"foo", ".bar"}, "foo..bar"}, + {[]string{"foo.", ".bar"}, "foo...bar"}, + } + + for _, tt := range tests { + withLogger(t, DebugLevel, nil, func(log *Logger, logs *observer.ObservedLogs) { + for _, n := range tt.names { + log = log.Named(n) + } + log.Info("") + require.Equal(t, 1, logs.Len(), "Expected only one log entry to be written.") + assert.Equal(t, tt.expected, logs.AllUntimed()[0].Entry.LoggerName, "Unexpected logger name.") + }) + withSugar(t, DebugLevel, nil, func(log *SugaredLogger, logs *observer.ObservedLogs) { + for _, n := range tt.names { + log = log.Named(n) + } + log.Infow("") + require.Equal(t, 1, logs.Len(), "Expected only one log entry to be written.") + assert.Equal(t, tt.expected, logs.AllUntimed()[0].Entry.LoggerName, "Unexpected logger name.") + }) + } +} + +func TestLoggerWriteFailure(t *testing.T) { + errSink := &ztest.Buffer{} + logger := New( + zapcore.NewCore( + zapcore.NewJSONEncoder(NewProductionConfig().EncoderConfig), + zapcore.Lock(zapcore.AddSync(ztest.FailWriter{})), + DebugLevel, + ), + ErrorOutput(errSink), + ) + + logger.Info("foo") + // Should log the error. + assert.Regexp(t, `write error: failed`, errSink.Stripped(), "Expected to log the error to the error output.") + assert.True(t, errSink.Called(), "Expected logging an internal error to call Sync the error sink.") +} + +func TestLoggerSync(t *testing.T) { + withLogger(t, DebugLevel, nil, func(logger *Logger, _ *observer.ObservedLogs) { + assert.NoError(t, logger.Sync(), "Expected syncing a test logger to succeed.") + assert.NoError(t, logger.Sugar().Sync(), "Expected syncing a sugared logger to succeed.") + }) +} + +func TestLoggerSyncFail(t *testing.T) { + noSync := &ztest.Buffer{} + err := errors.New("fail") + noSync.SetError(err) + logger := New(zapcore.NewCore( + zapcore.NewJSONEncoder(zapcore.EncoderConfig{}), + noSync, + DebugLevel, + )) + assert.Equal(t, err, logger.Sync(), "Expected Logger.Sync to propagate errors.") + assert.Equal(t, err, logger.Sugar().Sync(), "Expected SugaredLogger.Sync to propagate errors.") +} + +func TestLoggerAddCaller(t *testing.T) { + tests := []struct { + options []Option + pat string + }{ + {opts(AddCaller()), `.+/logger_test.go:[\d]+$`}, + {opts(AddCaller(), AddCallerSkip(1), AddCallerSkip(-1)), `.+/zap/logger_test.go:[\d]+$`}, + {opts(AddCaller(), AddCallerSkip(1)), `.+/zap/common_test.go:[\d]+$`}, + {opts(AddCaller(), AddCallerSkip(1), AddCallerSkip(3)), `.+/src/runtime/.*:[\d]+$`}, + } + for _, tt := range tests { + withLogger(t, DebugLevel, tt.options, func(logger *Logger, logs *observer.ObservedLogs) { + // Make sure that sugaring and desugaring resets caller skip properly. + logger = logger.Sugar().Desugar() + logger.Info("") + output := logs.AllUntimed() + assert.Equal(t, 1, len(output), "Unexpected number of logs written out.") + assert.Regexp( + t, + tt.pat, + output[0].Entry.Caller, + "Expected to find package name and file name in output.", + ) + }) + } +} + +func TestLoggerAddCallerFail(t *testing.T) { + errBuf := &ztest.Buffer{} + withLogger(t, DebugLevel, opts(AddCaller(), ErrorOutput(errBuf)), func(log *Logger, logs *observer.ObservedLogs) { + log.callerSkip = 1e3 + log.Info("Failure.") + assert.Regexp( + t, + `Logger.check error: failed to get caller`, + errBuf.String(), + "Didn't find expected failure message.", + ) + assert.Equal( + t, + logs.AllUntimed()[0].Entry.Message, + "Failure.", + "Expected original message to survive failures in runtime.Caller.") + }) +} + +func TestLoggerReplaceCore(t *testing.T) { + replace := WrapCore(func(zapcore.Core) zapcore.Core { + return zapcore.NewNopCore() + }) + withLogger(t, DebugLevel, opts(replace), func(logger *Logger, logs *observer.ObservedLogs) { + logger.Debug("") + logger.Info("") + logger.Warn("") + assert.Equal(t, 0, logs.Len(), "Expected no-op core to write no logs.") + }) +} + +func TestLoggerHooks(t *testing.T) { + hook, seen := makeCountingHook() + withLogger(t, DebugLevel, opts(Hooks(hook)), func(logger *Logger, logs *observer.ObservedLogs) { + logger.Debug("") + logger.Info("") + }) + assert.Equal(t, int64(2), seen.Load(), "Hook saw an unexpected number of logs.") +} + +func TestLoggerConcurrent(t *testing.T) { + withLogger(t, DebugLevel, nil, func(logger *Logger, logs *observer.ObservedLogs) { + child := logger.With(String("foo", "bar")) + + wg := &sync.WaitGroup{} + runConcurrently(5, 10, wg, func() { + logger.Info("", String("foo", "bar")) + }) + runConcurrently(5, 10, wg, func() { + child.Info("") + }) + + wg.Wait() + + // Make sure the output doesn't contain interspersed entries. + assert.Equal(t, 100, logs.Len(), "Unexpected number of logs written out.") + for _, obs := range logs.AllUntimed() { + assert.Equal( + t, + observer.LoggedEntry{ + Entry: zapcore.Entry{Level: InfoLevel}, + Context: []Field{String("foo", "bar")}, + }, + obs, + "Unexpected log output.", + ) + } + }) +} diff --git a/api/vendor/go.uber.org/zap/options.go b/api/vendor/go.uber.org/zap/options.go new file mode 100644 index 0000000..7a6b0fc --- /dev/null +++ b/api/vendor/go.uber.org/zap/options.go @@ -0,0 +1,109 @@ +// 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 +// 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. + +package zap + +import "go.uber.org/zap/zapcore" + +// An Option configures a Logger. +type Option interface { + apply(*Logger) +} + +// optionFunc wraps a func so it satisfies the Option interface. +type optionFunc func(*Logger) + +func (f optionFunc) apply(log *Logger) { + f(log) +} + +// WrapCore wraps or replaces the Logger's underlying zapcore.Core. +func WrapCore(f func(zapcore.Core) zapcore.Core) Option { + return optionFunc(func(log *Logger) { + log.core = f(log.core) + }) +} + +// Hooks registers functions which will be called each time the Logger writes +// out an Entry. Repeated use of Hooks is additive. +// +// Hooks are useful for simple side effects, like capturing metrics for the +// number of emitted logs. More complex side effects, including anything that +// requires access to the Entry's structured fields, should be implemented as +// a zapcore.Core instead. See zapcore.RegisterHooks for details. +func Hooks(hooks ...func(zapcore.Entry) error) Option { + return optionFunc(func(log *Logger) { + log.core = zapcore.RegisterHooks(log.core, hooks...) + }) +} + +// Fields adds fields to the Logger. +func Fields(fs ...Field) Option { + return optionFunc(func(log *Logger) { + log.core = log.core.With(fs) + }) +} + +// ErrorOutput sets the destination for errors generated by the Logger. Note +// that this option only affects internal errors; for sample code that sends +// error-level logs to a different location from info- and debug-level logs, +// see the package-level AdvancedConfiguration example. +// +// The supplied WriteSyncer must be safe for concurrent use. The Open and +// zapcore.Lock functions are the simplest ways to protect files with a mutex. +func ErrorOutput(w zapcore.WriteSyncer) Option { + return optionFunc(func(log *Logger) { + log.errorOutput = w + }) +} + +// Development puts the logger in development mode, which makes DPanic-level +// logs panic instead of simply logging an error. +func Development() Option { + return optionFunc(func(log *Logger) { + log.development = true + }) +} + +// AddCaller configures the Logger to annotate each message with the filename +// and line number of zap's caller. +func AddCaller() Option { + return optionFunc(func(log *Logger) { + log.addCaller = true + }) +} + +// AddCallerSkip increases the number of callers skipped by caller annotation +// (as enabled by the AddCaller option). When building wrappers around the +// Logger and SugaredLogger, supplying this Option prevents zap from always +// reporting the wrapper code as the caller. +func AddCallerSkip(skip int) Option { + return optionFunc(func(log *Logger) { + log.callerSkip += skip + }) +} + +// AddStacktrace configures the Logger to record a stack trace for all messages at +// or above a given level. +func AddStacktrace(lvl zapcore.LevelEnabler) Option { + return optionFunc(func(log *Logger) { + log.addStack = lvl + }) +} diff --git a/api/vendor/go.uber.org/zap/scripts/cover.sh b/api/vendor/go.uber.org/zap/scripts/cover.sh new file mode 100755 index 0000000..0da503c --- /dev/null +++ b/api/vendor/go.uber.org/zap/scripts/cover.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +set -e +echo "" > cover.out + +for d in $(go list $@); do + go test -race -coverprofile=profile.out $d + if [ -f profile.out ]; then + cat profile.out >> cover.out + rm profile.out + fi +done diff --git a/api/vendor/go.uber.org/zap/stacktrace.go b/api/vendor/go.uber.org/zap/stacktrace.go new file mode 100644 index 0000000..100fac2 --- /dev/null +++ b/api/vendor/go.uber.org/zap/stacktrace.go @@ -0,0 +1,126 @@ +// 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 +// 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. + +package zap + +import ( + "runtime" + "strings" + "sync" + + "go.uber.org/zap/internal/bufferpool" +) + +const _zapPackage = "go.uber.org/zap" + +var ( + _stacktracePool = sync.Pool{ + New: func() interface{} { + return newProgramCounters(64) + }, + } + + // We add "." and "/" suffixes to the package name to ensure we only match + // the exact package and not any package with the same prefix. + _zapStacktracePrefixes = addPrefix(_zapPackage, ".", "/") + _zapStacktraceVendorContains = addPrefix("/vendor/", _zapStacktracePrefixes...) +) + +func takeStacktrace() string { + buffer := bufferpool.Get() + defer buffer.Free() + programCounters := _stacktracePool.Get().(*programCounters) + defer _stacktracePool.Put(programCounters) + + var numFrames int + for { + // Skip the call to runtime.Counters and takeStacktrace so that the + // program counters start at the caller of takeStacktrace. + numFrames = runtime.Callers(2, programCounters.pcs) + if numFrames < len(programCounters.pcs) { + break + } + // Don't put the too-short counter slice back into the pool; this lets + // the pool adjust if we consistently take deep stacktraces. + programCounters = newProgramCounters(len(programCounters.pcs) * 2) + } + + i := 0 + skipZapFrames := true // skip all consecutive zap frames at the beginning. + frames := runtime.CallersFrames(programCounters.pcs[:numFrames]) + + // Note: On the last iteration, frames.Next() returns false, with a valid + // frame, but we ignore this frame. The last frame is a a runtime frame which + // adds noise, since it's only either runtime.main or runtime.goexit. + for frame, more := frames.Next(); more; frame, more = frames.Next() { + if skipZapFrames && isZapFrame(frame.Function) { + continue + } else { + skipZapFrames = false + } + + if i != 0 { + buffer.AppendByte('\n') + } + i++ + buffer.AppendString(frame.Function) + buffer.AppendByte('\n') + buffer.AppendByte('\t') + buffer.AppendString(frame.File) + buffer.AppendByte(':') + buffer.AppendInt(int64(frame.Line)) + } + + return buffer.String() +} + +func isZapFrame(function string) bool { + for _, prefix := range _zapStacktracePrefixes { + if strings.HasPrefix(function, prefix) { + return true + } + } + + // We can't use a prefix match here since the location of the vendor + // directory affects the prefix. Instead we do a contains match. + for _, contains := range _zapStacktraceVendorContains { + if strings.Contains(function, contains) { + return true + } + } + + return false +} + +type programCounters struct { + pcs []uintptr +} + +func newProgramCounters(size int) *programCounters { + return &programCounters{make([]uintptr, size)} +} + +func addPrefix(prefix string, ss ...string) []string { + withPrefix := make([]string, len(ss)) + for i, s := range ss { + withPrefix[i] = prefix + s + } + return withPrefix +} diff --git a/api/vendor/go.uber.org/zap/stacktrace_ext_test.go b/api/vendor/go.uber.org/zap/stacktrace_ext_test.go new file mode 100644 index 0000000..b7e71b6 --- /dev/null +++ b/api/vendor/go.uber.org/zap/stacktrace_ext_test.go @@ -0,0 +1,164 @@ +// Copyright (c) 2016, 2017 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. + +package zap_test + +import ( + "bytes" + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "runtime" + "strings" + "testing" + + "go.uber.org/zap" + "go.uber.org/zap/zapcore" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +// _zapPackages are packages that we search for in the logging output to match a +// zap stack frame. It is different from _zapStacktracePrefixes which is only +// intended to match on the function name, while this is on the full output +// which includes filenames. +var _zapPackages = []string{ + "go.uber.org/zap.", + "go.uber.org/zap/zapcore.", +} + +func TestStacktraceFiltersZapLog(t *testing.T) { + withLogger(t, func(logger *zap.Logger, out *bytes.Buffer) { + logger.Error("test log") + logger.Sugar().Error("sugar test log") + + require.Contains(t, out.String(), "TestStacktraceFiltersZapLog", "Should not strip out non-zap import") + verifyNoZap(t, out.String()) + }) +} + +func TestStacktraceFiltersZapMarshal(t *testing.T) { + withLogger(t, func(logger *zap.Logger, out *bytes.Buffer) { + marshal := func(enc zapcore.ObjectEncoder) error { + logger.Warn("marshal caused warn") + enc.AddString("f", "v") + return nil + } + logger.Error("test log", zap.Object("obj", zapcore.ObjectMarshalerFunc(marshal))) + + logs := out.String() + + // The marshal function (which will be under the test function) should not be stripped. + const marshalFnPrefix = "TestStacktraceFiltersZapMarshal." + require.Contains(t, logs, marshalFnPrefix, "Should not strip out marshal call") + + // There should be no zap stack traces before that point. + marshalIndex := strings.Index(logs, marshalFnPrefix) + verifyNoZap(t, logs[:marshalIndex]) + + // After that point, there should be zap stack traces - we don't want to strip out + // the Marshal caller information. + for _, fnPrefix := range _zapPackages { + require.Contains(t, logs[marshalIndex:], fnPrefix, "Missing zap caller stack for Marshal") + } + }) +} + +func TestStacktraceFiltersVendorZap(t *testing.T) { + // We need to simulate a zap as a vendor library, so we're going to create a fake GOPATH + // and run the above test which will contain zap in the vendor directory. + withGoPath(t, func(goPath string) { + curDir, err := os.Getwd() + require.NoError(t, err, "Failed to get current directory") + + testDir := filepath.Join(goPath, "src/go.uber.org/zap_test/") + vendorDir := filepath.Join(testDir, "vendor") + require.NoError(t, os.MkdirAll(testDir, 0777), "Failed to create source director") + + curFile := getSelfFilename(t) + //copyFile(t, curFile, filepath.Join(testDir, curFile)) + setupSymlink(t, curFile, filepath.Join(testDir, curFile)) + + // Set up symlinks for zap, and for any test dependencies. + setupSymlink(t, curDir, filepath.Join(vendorDir, "go.uber.org/zap")) + for _, testDep := range []string{"github.com/stretchr/testify"} { + target := filepath.Join(curDir, "vendor", testDep) + _, err := os.Stat(target) + require.NoError(t, err, "Required dependency (%v) not installed in vendor", target) + setupSymlink(t, target, filepath.Join(vendorDir, testDep)) + } + + // Now run the above test which ensures we filter out zap stacktraces, but this time + // zap is in a vendor + cmd := exec.Command("go", "test", "-v", "-run", "TestStacktraceFiltersZap") + cmd.Dir = testDir + out, err := cmd.CombinedOutput() + require.NoError(t, err, "Failed to run test in vendor directory, output: %s", out) + assert.Contains(t, string(out), "PASS") + }) +} + +// withLogger sets up a logger with a real encoder set up, so that any marshal functions are called. +// The inbuilt observer does not call Marshal for objects/arrays, which we need for some tests. +func withLogger(t *testing.T, fn func(logger *zap.Logger, out *bytes.Buffer)) { + buf := &bytes.Buffer{} + encoder := zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig()) + core := zapcore.NewCore(encoder, zapcore.AddSync(buf), zapcore.DebugLevel) + logger := zap.New(core, zap.AddStacktrace(zap.DebugLevel)) + fn(logger, buf) +} + +func verifyNoZap(t *testing.T, logs string) { + for _, fnPrefix := range _zapPackages { + require.NotContains(t, logs, fnPrefix, "Should not strip out marshal call") + } +} + +func withGoPath(t *testing.T, f func(goPath string)) { + goPath, err := ioutil.TempDir("", "gopath") + require.NoError(t, err, "Failed to create temporary directory for GOPATH") + //defer os.RemoveAll(goPath) + + os.Setenv("GOPATH", goPath) + defer os.Setenv("GOPATH", os.Getenv("GOPATH")) + + f(goPath) +} + +func getSelfFilename(t *testing.T) string { + _, file, _, ok := runtime.Caller(0) + require.True(t, ok, "Failed to get caller information to identify local file") + + return filepath.Base(file) +} + +func setupSymlink(t *testing.T, src, dst string) { + // Make sure the destination directory exists. + os.MkdirAll(filepath.Dir(dst), 0777) + + // Get absolute path of the source for the symlink, otherwise we can create a symlink + // that uses relative paths. + srcAbs, err := filepath.Abs(src) + require.NoError(t, err, "Failed to get absolute path") + + require.NoError(t, os.Symlink(srcAbs, dst), "Failed to set up symlink") +} diff --git a/api/vendor/go.uber.org/zap/stacktrace_test.go b/api/vendor/go.uber.org/zap/stacktrace_test.go new file mode 100644 index 0000000..3c9a41c --- /dev/null +++ b/api/vendor/go.uber.org/zap/stacktrace_test.go @@ -0,0 +1,75 @@ +// 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 +// 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. + +package zap + +import ( + "strings" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestTakeStacktrace(t *testing.T) { + trace := takeStacktrace() + lines := strings.Split(trace, "\n") + require.True(t, len(lines) > 0, "Expected stacktrace to have at least one frame.") + assert.Contains( + t, + lines[0], + "testing.", + "Expected stacktrace to start with the test runner (zap frames are filtered out) %s.", lines[0], + ) +} + +func TestIsZapFrame(t *testing.T) { + zapFrames := []string{ + "go.uber.org/zap.Stack", + "go.uber.org/zap.(*SugaredLogger).log", + "go.uber.org/zap/zapcore.(ArrayMarshalerFunc).MarshalLogArray", + "github.com/uber/tchannel-go/vendor/go.uber.org/zap.Stack", + "github.com/uber/tchannel-go/vendor/go.uber.org/zap.(*SugaredLogger).log", + "github.com/uber/tchannel-go/vendor/go.uber.org/zap/zapcore.(ArrayMarshalerFunc).MarshalLogArray", + } + nonZapFrames := []string{ + "github.com/uber/tchannel-go.NewChannel", + "go.uber.org/not-zap.New", + "go.uber.org/zapext.ctx", + "go.uber.org/zap_ext/ctx.New", + } + + t.Run("zap frames", func(t *testing.T) { + for _, f := range zapFrames { + require.True(t, isZapFrame(f), f) + } + }) + t.Run("non-zap frames", func(t *testing.T) { + for _, f := range nonZapFrames { + require.False(t, isZapFrame(f), f) + } + }) +} + +func BenchmarkTakeStacktrace(b *testing.B) { + for i := 0; i < b.N; i++ { + takeStacktrace() + } +} diff --git a/api/vendor/go.uber.org/zap/sugar.go b/api/vendor/go.uber.org/zap/sugar.go new file mode 100644 index 0000000..77ca227 --- /dev/null +++ b/api/vendor/go.uber.org/zap/sugar.go @@ -0,0 +1,304 @@ +// 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 +// 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. + +package zap + +import ( + "fmt" + + "go.uber.org/zap/zapcore" + + "go.uber.org/multierr" +) + +const ( + _oddNumberErrMsg = "Ignored key without a value." + _nonStringKeyErrMsg = "Ignored key-value pairs with non-string keys." +) + +// A SugaredLogger wraps the base Logger functionality in a slower, but less +// verbose, API. Any Logger can be converted to a SugaredLogger with its Sugar +// method. +// +// Unlike the Logger, the SugaredLogger doesn't insist on structured logging. +// For each log level, it exposes three methods: one for loosely-typed +// structured logging, one for println-style formatting, and one for +// printf-style formatting. For example, SugaredLoggers can produce InfoLevel +// output with Infow ("info with" structured context), Info, or Infof. +type SugaredLogger struct { + base *Logger +} + +// Desugar unwraps a SugaredLogger, exposing the original Logger. Desugaring +// is quite inexpensive, so it's reasonable for a single application to use +// both Loggers and SugaredLoggers, converting between them on the boundaries +// of performance-sensitive code. +func (s *SugaredLogger) Desugar() *Logger { + base := s.base.clone() + base.callerSkip -= 2 + return base +} + +// Named adds a sub-scope to the logger's name. See Logger.Named for details. +func (s *SugaredLogger) Named(name string) *SugaredLogger { + return &SugaredLogger{base: s.base.Named(name)} +} + +// With adds a variadic number of fields to the logging context. It accepts a +// mix of strongly-typed Field objects and loosely-typed key-value pairs. When +// processing pairs, the first element of the pair is used as the field key +// and the second as the field value. +// +// For example, +// sugaredLogger.With( +// "hello", "world", +// "failure", errors.New("oh no"), +// Stack(), +// "count", 42, +// "user", User{Name: "alice"}, +// ) +// is the equivalent of +// unsugared.With( +// String("hello", "world"), +// String("failure", "oh no"), +// Stack(), +// Int("count", 42), +// Object("user", User{Name: "alice"}), +// ) +// +// Note that the keys in key-value pairs should be strings. In development, +// passing a non-string key panics. In production, the logger is more +// forgiving: a separate error is logged, but the key-value pair is skipped +// and execution continues. Passing an orphaned key triggers similar behavior: +// panics in development and errors in production. +func (s *SugaredLogger) With(args ...interface{}) *SugaredLogger { + return &SugaredLogger{base: s.base.With(s.sweetenFields(args)...)} +} + +// Debug uses fmt.Sprint to construct and log a message. +func (s *SugaredLogger) Debug(args ...interface{}) { + s.log(DebugLevel, "", args, nil) +} + +// Info uses fmt.Sprint to construct and log a message. +func (s *SugaredLogger) Info(args ...interface{}) { + s.log(InfoLevel, "", args, nil) +} + +// Warn uses fmt.Sprint to construct and log a message. +func (s *SugaredLogger) Warn(args ...interface{}) { + s.log(WarnLevel, "", args, nil) +} + +// Error uses fmt.Sprint to construct and log a message. +func (s *SugaredLogger) Error(args ...interface{}) { + s.log(ErrorLevel, "", args, nil) +} + +// DPanic uses fmt.Sprint to construct and log a message. In development, the +// logger then panics. (See DPanicLevel for details.) +func (s *SugaredLogger) DPanic(args ...interface{}) { + s.log(DPanicLevel, "", args, nil) +} + +// Panic uses fmt.Sprint to construct and log a message, then panics. +func (s *SugaredLogger) Panic(args ...interface{}) { + s.log(PanicLevel, "", args, nil) +} + +// Fatal uses fmt.Sprint to construct and log a message, then calls os.Exit. +func (s *SugaredLogger) Fatal(args ...interface{}) { + s.log(FatalLevel, "", args, nil) +} + +// Debugf uses fmt.Sprintf to log a templated message. +func (s *SugaredLogger) Debugf(template string, args ...interface{}) { + s.log(DebugLevel, template, args, nil) +} + +// Infof uses fmt.Sprintf to log a templated message. +func (s *SugaredLogger) Infof(template string, args ...interface{}) { + s.log(InfoLevel, template, args, nil) +} + +// Warnf uses fmt.Sprintf to log a templated message. +func (s *SugaredLogger) Warnf(template string, args ...interface{}) { + s.log(WarnLevel, template, args, nil) +} + +// Errorf uses fmt.Sprintf to log a templated message. +func (s *SugaredLogger) Errorf(template string, args ...interface{}) { + s.log(ErrorLevel, template, args, nil) +} + +// DPanicf uses fmt.Sprintf to log a templated message. In development, the +// logger then panics. (See DPanicLevel for details.) +func (s *SugaredLogger) DPanicf(template string, args ...interface{}) { + s.log(DPanicLevel, template, args, nil) +} + +// Panicf uses fmt.Sprintf to log a templated message, then panics. +func (s *SugaredLogger) Panicf(template string, args ...interface{}) { + s.log(PanicLevel, template, args, nil) +} + +// Fatalf uses fmt.Sprintf to log a templated message, then calls os.Exit. +func (s *SugaredLogger) Fatalf(template string, args ...interface{}) { + s.log(FatalLevel, template, args, nil) +} + +// Debugw logs a message with some additional context. The variadic key-value +// pairs are treated as they are in With. +// +// When debug-level logging is disabled, this is much faster than +// s.With(keysAndValues).Debug(msg) +func (s *SugaredLogger) Debugw(msg string, keysAndValues ...interface{}) { + s.log(DebugLevel, msg, nil, keysAndValues) +} + +// Infow logs a message with some additional context. The variadic key-value +// pairs are treated as they are in With. +func (s *SugaredLogger) Infow(msg string, keysAndValues ...interface{}) { + s.log(InfoLevel, msg, nil, keysAndValues) +} + +// Warnw logs a message with some additional context. The variadic key-value +// pairs are treated as they are in With. +func (s *SugaredLogger) Warnw(msg string, keysAndValues ...interface{}) { + s.log(WarnLevel, msg, nil, keysAndValues) +} + +// Errorw logs a message with some additional context. The variadic key-value +// pairs are treated as they are in With. +func (s *SugaredLogger) Errorw(msg string, keysAndValues ...interface{}) { + s.log(ErrorLevel, msg, nil, keysAndValues) +} + +// DPanicw logs a message with some additional context. In development, the +// logger then panics. (See DPanicLevel for details.) The variadic key-value +// pairs are treated as they are in With. +func (s *SugaredLogger) DPanicw(msg string, keysAndValues ...interface{}) { + s.log(DPanicLevel, msg, nil, keysAndValues) +} + +// Panicw logs a message with some additional context, then panics. The +// variadic key-value pairs are treated as they are in With. +func (s *SugaredLogger) Panicw(msg string, keysAndValues ...interface{}) { + s.log(PanicLevel, msg, nil, keysAndValues) +} + +// Fatalw logs a message with some additional context, then calls os.Exit. The +// variadic key-value pairs are treated as they are in With. +func (s *SugaredLogger) Fatalw(msg string, keysAndValues ...interface{}) { + s.log(FatalLevel, msg, nil, keysAndValues) +} + +// Sync flushes any buffered log entries. +func (s *SugaredLogger) Sync() error { + return s.base.Sync() +} + +func (s *SugaredLogger) log(lvl zapcore.Level, template string, fmtArgs []interface{}, context []interface{}) { + // If logging at this level is completely disabled, skip the overhead of + // string formatting. + if lvl < DPanicLevel && !s.base.Core().Enabled(lvl) { + return + } + + // Format with Sprint, Sprintf, or neither. + msg := template + if msg == "" && len(fmtArgs) > 0 { + msg = fmt.Sprint(fmtArgs...) + } else if msg != "" && len(fmtArgs) > 0 { + msg = fmt.Sprintf(template, fmtArgs...) + } + + if ce := s.base.Check(lvl, msg); ce != nil { + ce.Write(s.sweetenFields(context)...) + } +} + +func (s *SugaredLogger) sweetenFields(args []interface{}) []Field { + if len(args) == 0 { + return nil + } + + // Allocate enough space for the worst case; if users pass only structured + // fields, we shouldn't penalize them with extra allocations. + fields := make([]Field, 0, len(args)) + var invalid invalidPairs + + for i := 0; i < len(args); { + // This is a strongly-typed field. Consume it and move on. + if f, ok := args[i].(Field); ok { + fields = append(fields, f) + i++ + continue + } + + // Make sure this element isn't a dangling key. + if i == len(args)-1 { + s.base.DPanic(_oddNumberErrMsg, Any("ignored", args[i])) + break + } + + // Consume this value and the next, treating them as a key-value pair. If the + // key isn't a string, add this pair to the slice of invalid pairs. + key, val := args[i], args[i+1] + if keyStr, ok := key.(string); !ok { + // Subsequent errors are likely, so allocate once up front. + if cap(invalid) == 0 { + invalid = make(invalidPairs, 0, len(args)/2) + } + invalid = append(invalid, invalidPair{i, key, val}) + } else { + fields = append(fields, Any(keyStr, val)) + } + i += 2 + } + + // If we encountered any invalid key-value pairs, log an error. + if len(invalid) > 0 { + s.base.DPanic(_nonStringKeyErrMsg, Array("invalid", invalid)) + } + return fields +} + +type invalidPair struct { + position int + key, value interface{} +} + +func (p invalidPair) MarshalLogObject(enc zapcore.ObjectEncoder) error { + enc.AddInt64("position", int64(p.position)) + Any("key", p.key).AddTo(enc) + Any("value", p.value).AddTo(enc) + return nil +} + +type invalidPairs []invalidPair + +func (ps invalidPairs) MarshalLogArray(enc zapcore.ArrayEncoder) error { + var err error + for i := range ps { + err = multierr.Append(err, enc.AppendObject(ps[i])) + } + return err +} diff --git a/api/vendor/go.uber.org/zap/sugar_test.go b/api/vendor/go.uber.org/zap/sugar_test.go new file mode 100644 index 0000000..5b1dcfa --- /dev/null +++ b/api/vendor/go.uber.org/zap/sugar_test.go @@ -0,0 +1,374 @@ +// 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 +// 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. + +package zap + +import ( + "testing" + + "go.uber.org/zap/internal/exit" + "go.uber.org/zap/internal/ztest" + "go.uber.org/zap/zapcore" + "go.uber.org/zap/zaptest/observer" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestSugarWith(t *testing.T) { + // Convenience functions to create expected error logs. + ignored := func(msg interface{}) observer.LoggedEntry { + return observer.LoggedEntry{ + Entry: zapcore.Entry{Level: DPanicLevel, Message: _oddNumberErrMsg}, + Context: []Field{Any("ignored", msg)}, + } + } + nonString := func(pairs ...invalidPair) observer.LoggedEntry { + return observer.LoggedEntry{ + Entry: zapcore.Entry{Level: DPanicLevel, Message: _nonStringKeyErrMsg}, + Context: []Field{Array("invalid", invalidPairs(pairs))}, + } + } + + tests := []struct { + desc string + args []interface{} + expected []Field + errLogs []observer.LoggedEntry + }{ + { + desc: "nil args", + args: nil, + expected: []Field{}, + errLogs: nil, + }, + { + desc: "empty slice of args", + args: []interface{}{}, + expected: []Field{}, + errLogs: nil, + }, + { + desc: "just a dangling key", + args: []interface{}{"should ignore"}, + expected: []Field{}, + errLogs: []observer.LoggedEntry{ignored("should ignore")}, + }, + { + desc: "well-formed key-value pairs", + args: []interface{}{"foo", 42, "true", "bar"}, + expected: []Field{Int("foo", 42), String("true", "bar")}, + errLogs: nil, + }, + { + desc: "just a structured field", + args: []interface{}{Int("foo", 42)}, + expected: []Field{Int("foo", 42)}, + errLogs: nil, + }, + { + desc: "structured field and a dangling key", + args: []interface{}{Int("foo", 42), "dangling"}, + expected: []Field{Int("foo", 42)}, + errLogs: []observer.LoggedEntry{ignored("dangling")}, + }, + { + desc: "structured field and a dangling non-string key", + args: []interface{}{Int("foo", 42), 13}, + expected: []Field{Int("foo", 42)}, + errLogs: []observer.LoggedEntry{ignored(13)}, + }, + { + desc: "key-value pair and a dangling key", + args: []interface{}{"foo", 42, "dangling"}, + expected: []Field{Int("foo", 42)}, + errLogs: []observer.LoggedEntry{ignored("dangling")}, + }, + { + desc: "pairs, a structured field, and a dangling key", + args: []interface{}{"first", "field", Int("foo", 42), "baz", "quux", "dangling"}, + expected: []Field{String("first", "field"), Int("foo", 42), String("baz", "quux")}, + errLogs: []observer.LoggedEntry{ignored("dangling")}, + }, + { + desc: "one non-string key", + args: []interface{}{"foo", 42, true, "bar"}, + expected: []Field{Int("foo", 42)}, + errLogs: []observer.LoggedEntry{nonString(invalidPair{2, true, "bar"})}, + }, + { + desc: "pairs, structured fields, non-string keys, and a dangling key", + args: []interface{}{"foo", 42, true, "bar", Int("structure", 11), 42, "reversed", "baz", "quux", "dangling"}, + expected: []Field{Int("foo", 42), Int("structure", 11), String("baz", "quux")}, + errLogs: []observer.LoggedEntry{ + ignored("dangling"), + nonString(invalidPair{2, true, "bar"}, invalidPair{5, 42, "reversed"}), + }, + }, + } + + for _, tt := range tests { + withSugar(t, DebugLevel, nil, func(logger *SugaredLogger, logs *observer.ObservedLogs) { + logger.With(tt.args...).Info("") + output := logs.AllUntimed() + if len(tt.errLogs) > 0 { + for i := range tt.errLogs { + assert.Equal(t, tt.errLogs[i], output[i], "Unexpected error log at position %d for scenario %s.", i, tt.desc) + } + } + assert.Equal(t, len(tt.errLogs)+1, len(output), "Expected only one non-error message to be logged in scenario %s.", tt.desc) + assert.Equal(t, tt.expected, output[len(tt.errLogs)].Context, "Unexpected message context in scenario %s.", tt.desc) + }) + } +} + +func TestSugarFieldsInvalidPairs(t *testing.T) { + withSugar(t, DebugLevel, nil, func(logger *SugaredLogger, logs *observer.ObservedLogs) { + logger.With(42, "foo", []string{"bar"}, "baz").Info("") + output := logs.AllUntimed() + + // Double-check that the actual message was logged. + require.Equal(t, 2, len(output), "Unexpected number of entries logged.") + require.Equal(t, observer.LoggedEntry{Context: []Field{}}, output[1], "Unexpected non-error log entry.") + + // Assert that the error message's structured fields serialize properly. + require.Equal(t, 1, len(output[0].Context), "Expected one field in error entry context.") + enc := zapcore.NewMapObjectEncoder() + output[0].Context[0].AddTo(enc) + assert.Equal(t, []interface{}{ + map[string]interface{}{"position": int64(0), "key": int64(42), "value": "foo"}, + map[string]interface{}{"position": int64(2), "key": []interface{}{"bar"}, "value": "baz"}, + }, enc.Fields["invalid"], "Unexpected output when logging invalid key-value pairs.") + }) +} + +type stringerF func() string + +func (f stringerF) String() string { return f() } + +func TestSugarStructuredLogging(t *testing.T) { + tests := []struct { + msg string + expectMsg string + }{ + {"foo", "foo"}, + {"", ""}, + } + + // Common to all test cases. + context := []interface{}{"foo", "bar"} + extra := []interface{}{"baz", false} + expectedFields := []Field{String("foo", "bar"), Bool("baz", false)} + + for _, tt := range tests { + withSugar(t, DebugLevel, nil, func(logger *SugaredLogger, logs *observer.ObservedLogs) { + logger.With(context...).Debugw(tt.msg, extra...) + logger.With(context...).Infow(tt.msg, extra...) + logger.With(context...).Warnw(tt.msg, extra...) + logger.With(context...).Errorw(tt.msg, extra...) + logger.With(context...).DPanicw(tt.msg, extra...) + + expected := make([]observer.LoggedEntry, 5) + for i, lvl := range []zapcore.Level{DebugLevel, InfoLevel, WarnLevel, ErrorLevel, DPanicLevel} { + expected[i] = observer.LoggedEntry{ + Entry: zapcore.Entry{Message: tt.expectMsg, Level: lvl}, + Context: expectedFields, + } + } + assert.Equal(t, expected, logs.AllUntimed(), "Unexpected log output.") + }) + } +} + +func TestSugarConcatenatingLogging(t *testing.T) { + tests := []struct { + args []interface{} + expect string + }{ + {[]interface{}{nil}, ""}, + } + + // Common to all test cases. + context := []interface{}{"foo", "bar"} + expectedFields := []Field{String("foo", "bar")} + + for _, tt := range tests { + withSugar(t, DebugLevel, nil, func(logger *SugaredLogger, logs *observer.ObservedLogs) { + logger.With(context...).Debug(tt.args...) + logger.With(context...).Info(tt.args...) + logger.With(context...).Warn(tt.args...) + logger.With(context...).Error(tt.args...) + logger.With(context...).DPanic(tt.args...) + + expected := make([]observer.LoggedEntry, 5) + for i, lvl := range []zapcore.Level{DebugLevel, InfoLevel, WarnLevel, ErrorLevel, DPanicLevel} { + expected[i] = observer.LoggedEntry{ + Entry: zapcore.Entry{Message: tt.expect, Level: lvl}, + Context: expectedFields, + } + } + assert.Equal(t, expected, logs.AllUntimed(), "Unexpected log output.") + }) + } +} + +func TestSugarTemplatedLogging(t *testing.T) { + tests := []struct { + format string + args []interface{} + expect string + }{ + {"", nil, ""}, + {"foo", nil, "foo"}, + // If the user fails to pass a template, degrade to fmt.Sprint. + {"", []interface{}{"foo"}, "foo"}, + } + + // Common to all test cases. + context := []interface{}{"foo", "bar"} + expectedFields := []Field{String("foo", "bar")} + + for _, tt := range tests { + withSugar(t, DebugLevel, nil, func(logger *SugaredLogger, logs *observer.ObservedLogs) { + logger.With(context...).Debugf(tt.format, tt.args...) + logger.With(context...).Infof(tt.format, tt.args...) + logger.With(context...).Warnf(tt.format, tt.args...) + logger.With(context...).Errorf(tt.format, tt.args...) + logger.With(context...).DPanicf(tt.format, tt.args...) + + expected := make([]observer.LoggedEntry, 5) + for i, lvl := range []zapcore.Level{DebugLevel, InfoLevel, WarnLevel, ErrorLevel, DPanicLevel} { + expected[i] = observer.LoggedEntry{ + Entry: zapcore.Entry{Message: tt.expect, Level: lvl}, + Context: expectedFields, + } + } + assert.Equal(t, expected, logs.AllUntimed(), "Unexpected log output.") + }) + } +} + +func TestSugarPanicLogging(t *testing.T) { + tests := []struct { + loggerLevel zapcore.Level + f func(*SugaredLogger) + expectedMsg string + }{ + {FatalLevel, func(s *SugaredLogger) { s.Panic("foo") }, ""}, + {PanicLevel, func(s *SugaredLogger) { s.Panic("foo") }, "foo"}, + {DebugLevel, func(s *SugaredLogger) { s.Panic("foo") }, "foo"}, + {FatalLevel, func(s *SugaredLogger) { s.Panicf("%s", "foo") }, ""}, + {PanicLevel, func(s *SugaredLogger) { s.Panicf("%s", "foo") }, "foo"}, + {DebugLevel, func(s *SugaredLogger) { s.Panicf("%s", "foo") }, "foo"}, + {FatalLevel, func(s *SugaredLogger) { s.Panicw("foo") }, ""}, + {PanicLevel, func(s *SugaredLogger) { s.Panicw("foo") }, "foo"}, + {DebugLevel, func(s *SugaredLogger) { s.Panicw("foo") }, "foo"}, + } + + for _, tt := range tests { + withSugar(t, tt.loggerLevel, nil, func(sugar *SugaredLogger, logs *observer.ObservedLogs) { + assert.Panics(t, func() { tt.f(sugar) }, "Expected panic-level logger calls to panic.") + if tt.expectedMsg != "" { + assert.Equal(t, []observer.LoggedEntry{{ + Context: []Field{}, + Entry: zapcore.Entry{Message: tt.expectedMsg, Level: PanicLevel}, + }}, logs.AllUntimed(), "Unexpected log output.") + } else { + assert.Equal(t, 0, logs.Len(), "Didn't expect any log output.") + } + }) + } +} + +func TestSugarFatalLogging(t *testing.T) { + tests := []struct { + loggerLevel zapcore.Level + f func(*SugaredLogger) + expectedMsg string + }{ + {FatalLevel + 1, func(s *SugaredLogger) { s.Fatal("foo") }, ""}, + {FatalLevel, func(s *SugaredLogger) { s.Fatal("foo") }, "foo"}, + {DebugLevel, func(s *SugaredLogger) { s.Fatal("foo") }, "foo"}, + {FatalLevel + 1, func(s *SugaredLogger) { s.Fatalf("%s", "foo") }, ""}, + {FatalLevel, func(s *SugaredLogger) { s.Fatalf("%s", "foo") }, "foo"}, + {DebugLevel, func(s *SugaredLogger) { s.Fatalf("%s", "foo") }, "foo"}, + {FatalLevel + 1, func(s *SugaredLogger) { s.Fatalw("foo") }, ""}, + {FatalLevel, func(s *SugaredLogger) { s.Fatalw("foo") }, "foo"}, + {DebugLevel, func(s *SugaredLogger) { s.Fatalw("foo") }, "foo"}, + } + + for _, tt := range tests { + withSugar(t, tt.loggerLevel, nil, func(sugar *SugaredLogger, logs *observer.ObservedLogs) { + stub := exit.WithStub(func() { tt.f(sugar) }) + assert.True(t, stub.Exited, "Expected all calls to fatal logger methods to exit process.") + if tt.expectedMsg != "" { + assert.Equal(t, []observer.LoggedEntry{{ + Context: []Field{}, + Entry: zapcore.Entry{Message: tt.expectedMsg, Level: FatalLevel}, + }}, logs.AllUntimed(), "Unexpected log output.") + } else { + assert.Equal(t, 0, logs.Len(), "Didn't expect any log output.") + } + }) + } +} + +func TestSugarAddCaller(t *testing.T) { + tests := []struct { + options []Option + pat string + }{ + {opts(AddCaller()), `.+/sugar_test.go:[\d]+$`}, + {opts(AddCaller(), AddCallerSkip(1), AddCallerSkip(-1)), `.+/zap/sugar_test.go:[\d]+$`}, + {opts(AddCaller(), AddCallerSkip(1)), `.+/zap/common_test.go:[\d]+$`}, + {opts(AddCaller(), AddCallerSkip(1), AddCallerSkip(5)), `.+/src/runtime/.*:[\d]+$`}, + } + for _, tt := range tests { + withSugar(t, DebugLevel, tt.options, func(logger *SugaredLogger, logs *observer.ObservedLogs) { + logger.Info("") + output := logs.AllUntimed() + assert.Equal(t, 1, len(output), "Unexpected number of logs written out.") + assert.Regexp( + t, + tt.pat, + output[0].Entry.Caller, + "Expected to find package name and file name in output.", + ) + }) + } +} + +func TestSugarAddCallerFail(t *testing.T) { + errBuf := &ztest.Buffer{} + withSugar(t, DebugLevel, opts(AddCaller(), AddCallerSkip(1e3), ErrorOutput(errBuf)), func(log *SugaredLogger, logs *observer.ObservedLogs) { + log.Info("Failure.") + assert.Regexp( + t, + `Logger.check error: failed to get caller`, + errBuf.String(), + "Didn't find expected failure message.", + ) + assert.Equal( + t, + logs.AllUntimed()[0].Entry.Message, + "Failure.", + "Expected original message to survive failures in runtime.Caller.") + }) +} diff --git a/api/vendor/go.uber.org/zap/time.go b/api/vendor/go.uber.org/zap/time.go new file mode 100644 index 0000000..c5a1f16 --- /dev/null +++ b/api/vendor/go.uber.org/zap/time.go @@ -0,0 +1,27 @@ +// 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 +// 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. + +package zap + +import "time" + +func timeToMillis(t time.Time) int64 { + return t.UnixNano() / int64(time.Millisecond) +} diff --git a/api/vendor/go.uber.org/zap/time_test.go b/api/vendor/go.uber.org/zap/time_test.go new file mode 100644 index 0000000..cb993ab --- /dev/null +++ b/api/vendor/go.uber.org/zap/time_test.go @@ -0,0 +1,42 @@ +// 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 +// 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. + +package zap + +import ( + "testing" + "time" + + "github.com/stretchr/testify/assert" +) + +func TestTimeToMillis(t *testing.T) { + tests := []struct { + t time.Time + stamp int64 + }{ + {t: time.Unix(0, 0), stamp: 0}, + {t: time.Unix(1, 0), stamp: 1000}, + {t: time.Unix(1, int64(500*time.Millisecond)), stamp: 1500}, + } + for _, tt := range tests { + assert.Equal(t, tt.stamp, timeToMillis(tt.t), "Unexpected timestamp for time %v.", tt.t) + } +} diff --git a/api/vendor/go.uber.org/zap/writer.go b/api/vendor/go.uber.org/zap/writer.go new file mode 100644 index 0000000..16f55ce --- /dev/null +++ b/api/vendor/go.uber.org/zap/writer.go @@ -0,0 +1,96 @@ +// 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 +// 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. + +package zap + +import ( + "io/ioutil" + "os" + + "go.uber.org/zap/zapcore" + + "go.uber.org/multierr" +) + +// Open is a high-level wrapper that takes a variadic number of paths, opens or +// creates each of the specified files, and combines them into a locked +// WriteSyncer. It also returns any error encountered and a function to close +// any opened files. +// +// Passing no paths returns a no-op WriteSyncer. The special paths "stdout" and +// "stderr" are interpreted as os.Stdout and os.Stderr, respectively. +func Open(paths ...string) (zapcore.WriteSyncer, func(), error) { + writers, close, err := open(paths) + if err != nil { + return nil, nil, err + } + + writer := CombineWriteSyncers(writers...) + return writer, close, nil +} + +func open(paths []string) ([]zapcore.WriteSyncer, func(), error) { + var openErr error + writers := make([]zapcore.WriteSyncer, 0, len(paths)) + files := make([]*os.File, 0, len(paths)) + close := func() { + for _, f := range files { + f.Close() + } + } + for _, path := range paths { + switch path { + case "stdout": + writers = append(writers, os.Stdout) + // Don't close standard out. + continue + case "stderr": + writers = append(writers, os.Stderr) + // Don't close standard error. + continue + } + f, err := os.OpenFile(path, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644) + openErr = multierr.Append(openErr, err) + if err == nil { + writers = append(writers, f) + files = append(files, f) + } + } + + if openErr != nil { + close() + return writers, nil, openErr + } + + return writers, close, nil +} + +// CombineWriteSyncers is a utility that combines multiple WriteSyncers into a +// single, locked WriteSyncer. If no inputs are supplied, it returns a no-op +// WriteSyncer. +// +// It's provided purely as a convenience; the result is no different from +// using zapcore.NewMultiWriteSyncer and zapcore.Lock individually. +func CombineWriteSyncers(writers ...zapcore.WriteSyncer) zapcore.WriteSyncer { + if len(writers) == 0 { + return zapcore.AddSync(ioutil.Discard) + } + return zapcore.Lock(zapcore.NewMultiWriteSyncer(writers...)) +} diff --git a/api/vendor/go.uber.org/zap/writer_test.go b/api/vendor/go.uber.org/zap/writer_test.go new file mode 100644 index 0000000..1293832 --- /dev/null +++ b/api/vendor/go.uber.org/zap/writer_test.go @@ -0,0 +1,125 @@ +// 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 +// 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. + +package zap + +import ( + "io/ioutil" + "os" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.uber.org/zap/zapcore" +) + +func TestOpenNoPaths(t *testing.T) { + ws, cleanup, err := Open() + defer cleanup() + + assert.NoError(t, err, "Expected opening no paths to succeed.") + assert.Equal( + t, + zapcore.AddSync(ioutil.Discard), + ws, + "Expected opening no paths to return a no-op WriteSyncer.", + ) +} + +func TestOpen(t *testing.T) { + temp, err := ioutil.TempFile("", "zap-open-test") + require.NoError(t, err, "Couldn't create a temporary file for test.") + defer os.Remove(temp.Name()) + + tests := []struct { + paths []string + filenames []string + error string + }{ + {[]string{"stdout"}, []string{os.Stdout.Name()}, ""}, + {[]string{"stderr"}, []string{os.Stderr.Name()}, ""}, + {[]string{temp.Name()}, []string{temp.Name()}, ""}, + {[]string{"/foo/bar/baz"}, []string{}, "open /foo/bar/baz: no such file or directory"}, + { + paths: []string{"stdout", "/foo/bar/baz", temp.Name(), "/baz/quux"}, + filenames: []string{os.Stdout.Name(), temp.Name()}, + error: "open /foo/bar/baz: no such file or directory; open /baz/quux: no such file or directory", + }, + } + + for _, tt := range tests { + wss, cleanup, err := open(tt.paths) + if err == nil { + defer cleanup() + } + + if tt.error == "" { + assert.NoError(t, err, "Unexpected error opening paths %v.", tt.paths) + } else { + assert.Equal(t, tt.error, err.Error(), "Unexpected error opening paths %v.", tt.paths) + } + names := make([]string, len(wss)) + for i, ws := range wss { + f, ok := ws.(*os.File) + require.True(t, ok, "Expected all WriteSyncers returned from open() to be files.") + names[i] = f.Name() + } + assert.Equal(t, tt.filenames, names, "Opened unexpected files given paths %v.", tt.paths) + } +} + +func TestOpenFails(t *testing.T) { + tests := []struct { + paths []string + }{ + { + paths: []string{"./non-existent-dir/file"}, + }, + { + paths: []string{"stdout", "./non-existent-dir/file"}, + }, + } + + for _, tt := range tests { + _, cleanup, err := Open(tt.paths...) + require.Nil(t, cleanup, "Cleanup function should never be nil") + assert.Error(t, err, "Open with non-existent directory should fail") + } +} + +type testWriter struct { + expected string + t testing.TB +} + +func (w *testWriter) Write(actual []byte) (int, error) { + assert.Equal(w.t, []byte(w.expected), actual, "Unexpected write error.") + return len(actual), nil +} + +func (w *testWriter) Sync() error { + return nil +} + +func TestCombineWriteSyncers(t *testing.T) { + tw := &testWriter{"test", t} + w := CombineWriteSyncers(tw) + w.Write([]byte("test")) +} diff --git a/api/vendor/go.uber.org/zap/zapcore/console_encoder.go b/api/vendor/go.uber.org/zap/zapcore/console_encoder.go new file mode 100644 index 0000000..b787596 --- /dev/null +++ b/api/vendor/go.uber.org/zap/zapcore/console_encoder.go @@ -0,0 +1,147 @@ +// 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 +// 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. + +package zapcore + +import ( + "fmt" + "sync" + + "go.uber.org/zap/buffer" + "go.uber.org/zap/internal/bufferpool" +) + +var _sliceEncoderPool = sync.Pool{ + New: func() interface{} { + return &sliceArrayEncoder{elems: make([]interface{}, 0, 2)} + }, +} + +func getSliceEncoder() *sliceArrayEncoder { + return _sliceEncoderPool.Get().(*sliceArrayEncoder) +} + +func putSliceEncoder(e *sliceArrayEncoder) { + e.elems = e.elems[:0] + _sliceEncoderPool.Put(e) +} + +type consoleEncoder struct { + *jsonEncoder +} + +// NewConsoleEncoder creates an encoder whose output is designed for human - +// rather than machine - consumption. It serializes the core log entry data +// (message, level, timestamp, etc.) in a plain-text format and leaves the +// structured context as JSON. +// +// Note that although the console encoder doesn't use the keys specified in the +// encoder configuration, it will omit any element whose key is set to the empty +// string. +func NewConsoleEncoder(cfg EncoderConfig) Encoder { + return consoleEncoder{newJSONEncoder(cfg, true)} +} + +func (c consoleEncoder) Clone() Encoder { + return consoleEncoder{c.jsonEncoder.Clone().(*jsonEncoder)} +} + +func (c consoleEncoder) EncodeEntry(ent Entry, fields []Field) (*buffer.Buffer, error) { + line := bufferpool.Get() + + // We don't want the entry's metadata to be quoted and escaped (if it's + // encoded as strings), which means that we can't use the JSON encoder. The + // simplest option is to use the memory encoder and fmt.Fprint. + // + // If this ever becomes a performance bottleneck, we can implement + // ArrayEncoder for our plain-text format. + arr := getSliceEncoder() + if c.TimeKey != "" && c.EncodeTime != nil { + c.EncodeTime(ent.Time, arr) + } + if c.LevelKey != "" && c.EncodeLevel != nil { + c.EncodeLevel(ent.Level, arr) + } + if ent.LoggerName != "" && c.NameKey != "" { + nameEncoder := c.EncodeName + + if nameEncoder == nil { + // Fall back to FullNameEncoder for backward compatibility. + nameEncoder = FullNameEncoder + } + + nameEncoder(ent.LoggerName, arr) + } + if ent.Caller.Defined && c.CallerKey != "" && c.EncodeCaller != nil { + c.EncodeCaller(ent.Caller, arr) + } + for i := range arr.elems { + if i > 0 { + line.AppendByte('\t') + } + fmt.Fprint(line, arr.elems[i]) + } + putSliceEncoder(arr) + + // Add the message itself. + if c.MessageKey != "" { + c.addTabIfNecessary(line) + line.AppendString(ent.Message) + } + + // Add any structured context. + c.writeContext(line, fields) + + // If there's no stacktrace key, honor that; this allows users to force + // single-line output. + if ent.Stack != "" && c.StacktraceKey != "" { + line.AppendByte('\n') + line.AppendString(ent.Stack) + } + + if c.LineEnding != "" { + line.AppendString(c.LineEnding) + } else { + line.AppendString(DefaultLineEnding) + } + return line, nil +} + +func (c consoleEncoder) writeContext(line *buffer.Buffer, extra []Field) { + context := c.jsonEncoder.Clone().(*jsonEncoder) + defer context.buf.Free() + + addFields(context, extra) + context.closeOpenNamespaces() + if context.buf.Len() == 0 { + return + } + + c.addTabIfNecessary(line) + line.AppendByte('{') + line.Write(context.buf.Bytes()) + line.AppendByte('}') +} + +func (c consoleEncoder) addTabIfNecessary(line *buffer.Buffer) { + if line.Len() > 0 { + line.AppendByte('\t') + } +} diff --git a/api/vendor/go.uber.org/zap/zapcore/console_encoder_bench_test.go b/api/vendor/go.uber.org/zap/zapcore/console_encoder_bench_test.go new file mode 100644 index 0000000..62feaea --- /dev/null +++ b/api/vendor/go.uber.org/zap/zapcore/console_encoder_bench_test.go @@ -0,0 +1,49 @@ +// 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 +// 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. + +package zapcore_test + +import ( + "testing" + + . "go.uber.org/zap/zapcore" +) + +func BenchmarkZapConsole(b *testing.B) { + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + enc := NewConsoleEncoder(humanEncoderConfig()) + enc.AddString("str", "foo") + enc.AddInt64("int64-1", 1) + enc.AddInt64("int64-2", 2) + enc.AddFloat64("float64", 1.0) + enc.AddString("string1", "\n") + enc.AddString("string2", "💩") + enc.AddString("string3", "🤔") + enc.AddString("string4", "🙊") + enc.AddBool("bool", true) + buf, _ := enc.EncodeEntry(Entry{ + Message: "fake", + Level: DebugLevel, + }, nil) + buf.Free() + } + }) +} diff --git a/api/vendor/go.uber.org/zap/zapcore/core.go b/api/vendor/go.uber.org/zap/zapcore/core.go new file mode 100644 index 0000000..a1ef8b0 --- /dev/null +++ b/api/vendor/go.uber.org/zap/zapcore/core.go @@ -0,0 +1,113 @@ +// 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 +// 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. + +package zapcore + +// Core is a minimal, fast logger interface. It's designed for library authors +// to wrap in a more user-friendly API. +type Core interface { + LevelEnabler + + // With adds structured context to the Core. + With([]Field) Core + // Check determines whether the supplied Entry should be logged (using the + // embedded LevelEnabler and possibly some extra logic). If the entry + // should be logged, the Core adds itself to the CheckedEntry and returns + // the result. + // + // Callers must use Check before calling Write. + Check(Entry, *CheckedEntry) *CheckedEntry + // Write serializes the Entry and any Fields supplied at the log site and + // writes them to their destination. + // + // If called, Write should always log the Entry and Fields; it should not + // replicate the logic of Check. + Write(Entry, []Field) error + // Sync flushes buffered logs (if any). + Sync() error +} + +type nopCore struct{} + +// NewNopCore returns a no-op Core. +func NewNopCore() Core { return nopCore{} } +func (nopCore) Enabled(Level) bool { return false } +func (n nopCore) With([]Field) Core { return n } +func (nopCore) Check(_ Entry, ce *CheckedEntry) *CheckedEntry { return ce } +func (nopCore) Write(Entry, []Field) error { return nil } +func (nopCore) Sync() error { return nil } + +// NewCore creates a Core that writes logs to a WriteSyncer. +func NewCore(enc Encoder, ws WriteSyncer, enab LevelEnabler) Core { + return &ioCore{ + LevelEnabler: enab, + enc: enc, + out: ws, + } +} + +type ioCore struct { + LevelEnabler + enc Encoder + out WriteSyncer +} + +func (c *ioCore) With(fields []Field) Core { + clone := c.clone() + addFields(clone.enc, fields) + return clone +} + +func (c *ioCore) Check(ent Entry, ce *CheckedEntry) *CheckedEntry { + if c.Enabled(ent.Level) { + return ce.AddCore(ent, c) + } + return ce +} + +func (c *ioCore) Write(ent Entry, fields []Field) error { + buf, err := c.enc.EncodeEntry(ent, fields) + if err != nil { + return err + } + _, err = c.out.Write(buf.Bytes()) + buf.Free() + if err != nil { + return err + } + if ent.Level > ErrorLevel { + // Since we may be crashing the program, sync the output. Ignore Sync + // errors, pending a clean solution to issue #370. + c.Sync() + } + return nil +} + +func (c *ioCore) Sync() error { + return c.out.Sync() +} + +func (c *ioCore) clone() *ioCore { + return &ioCore{ + LevelEnabler: c.LevelEnabler, + enc: c.enc.Clone(), + out: c.out, + } +} diff --git a/api/vendor/go.uber.org/zap/zapcore/core_test.go b/api/vendor/go.uber.org/zap/zapcore/core_test.go new file mode 100644 index 0000000..cb4065c --- /dev/null +++ b/api/vendor/go.uber.org/zap/zapcore/core_test.go @@ -0,0 +1,163 @@ +// 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 +// 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. + +package zapcore_test + +import ( + "errors" + "io/ioutil" + "os" + "testing" + "time" + + "go.uber.org/zap/internal/ztest" + . "go.uber.org/zap/zapcore" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func makeInt64Field(key string, val int) Field { + return Field{Type: Int64Type, Integer: int64(val), Key: key} +} + +func TestNopCore(t *testing.T) { + entry := Entry{ + Message: "test", + Level: InfoLevel, + Time: time.Now(), + LoggerName: "main", + Stack: "fake-stack", + } + ce := &CheckedEntry{} + + allLevels := []Level{ + DebugLevel, + InfoLevel, + WarnLevel, + ErrorLevel, + DPanicLevel, + PanicLevel, + FatalLevel, + } + core := NewNopCore() + assert.Equal(t, core, core.With([]Field{makeInt64Field("k", 42)}), "Expected no-op With.") + for _, level := range allLevels { + assert.False(t, core.Enabled(level), "Expected all levels to be disabled in no-op core.") + assert.Equal(t, ce, core.Check(entry, ce), "Expected no-op Check to return checked entry unchanged.") + assert.NoError(t, core.Write(entry, nil), "Expected no-op Writes to always succeed.") + assert.NoError(t, core.Sync(), "Expected no-op Syncs to always succeed.") + } +} + +func TestIOCore(t *testing.T) { + temp, err := ioutil.TempFile("", "zapcore-test-iocore") + require.NoError(t, err, "Failed to create temp file.") + defer os.Remove(temp.Name()) + + // Drop timestamps for simpler assertions (timestamp encoding is tested + // elsewhere). + cfg := testEncoderConfig() + cfg.TimeKey = "" + + core := NewCore( + NewJSONEncoder(cfg), + temp, + InfoLevel, + ).With([]Field{makeInt64Field("k", 1)}) + defer assert.NoError(t, core.Sync(), "Expected Syncing a temp file to succeed.") + + if ce := core.Check(Entry{Level: DebugLevel, Message: "debug"}, nil); ce != nil { + ce.Write(makeInt64Field("k", 2)) + } + if ce := core.Check(Entry{Level: InfoLevel, Message: "info"}, nil); ce != nil { + ce.Write(makeInt64Field("k", 3)) + } + if ce := core.Check(Entry{Level: WarnLevel, Message: "warn"}, nil); ce != nil { + ce.Write(makeInt64Field("k", 4)) + } + + logged, err := ioutil.ReadFile(temp.Name()) + require.NoError(t, err, "Failed to read from temp file.") + require.Equal( + t, + `{"level":"info","msg":"info","k":1,"k":3}`+"\n"+ + `{"level":"warn","msg":"warn","k":1,"k":4}`+"\n", + string(logged), + "Unexpected log output.", + ) +} + +func TestIOCoreSyncFail(t *testing.T) { + sink := &ztest.Discarder{} + err := errors.New("failed") + sink.SetError(err) + + core := NewCore( + NewJSONEncoder(testEncoderConfig()), + sink, + DebugLevel, + ) + + assert.Equal( + t, + err, + core.Sync(), + "Expected core.Sync to return errors from underlying WriteSyncer.", + ) +} + +func TestIOCoreSyncsOutput(t *testing.T) { + tests := []struct { + entry Entry + shouldSync bool + }{ + {Entry{Level: DebugLevel}, false}, + {Entry{Level: InfoLevel}, false}, + {Entry{Level: WarnLevel}, false}, + {Entry{Level: ErrorLevel}, false}, + {Entry{Level: DPanicLevel}, true}, + {Entry{Level: PanicLevel}, true}, + {Entry{Level: FatalLevel}, true}, + } + + for _, tt := range tests { + sink := &ztest.Discarder{} + core := NewCore( + NewJSONEncoder(testEncoderConfig()), + sink, + DebugLevel, + ) + + core.Write(tt.entry, nil) + assert.Equal(t, tt.shouldSync, sink.Called(), "Incorrect Sync behavior.") + } +} + +func TestIOCoreWriteFailure(t *testing.T) { + core := NewCore( + NewJSONEncoder(testEncoderConfig()), + Lock(&ztest.FailWriter{}), + DebugLevel, + ) + err := core.Write(Entry{}, nil) + // Should log the error. + assert.Error(t, err, "Expected writing Entry to fail.") +} diff --git a/api/vendor/go.uber.org/zap/zapcore/doc.go b/api/vendor/go.uber.org/zap/zapcore/doc.go new file mode 100644 index 0000000..31000e9 --- /dev/null +++ b/api/vendor/go.uber.org/zap/zapcore/doc.go @@ -0,0 +1,24 @@ +// 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 +// 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. + +// Package zapcore defines and implements the low-level interfaces upon which +// zap is built. By providing alternate implementations of these interfaces, +// external packages can extend zap's capabilities. +package zapcore // import "go.uber.org/zap/zapcore" diff --git a/api/vendor/go.uber.org/zap/zapcore/encoder.go b/api/vendor/go.uber.org/zap/zapcore/encoder.go new file mode 100644 index 0000000..f050952 --- /dev/null +++ b/api/vendor/go.uber.org/zap/zapcore/encoder.go @@ -0,0 +1,348 @@ +// 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 +// 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. + +package zapcore + +import ( + "time" + + "go.uber.org/zap/buffer" +) + +// DefaultLineEnding defines the default line ending when writing logs. +// Alternate line endings specified in EncoderConfig can override this +// behavior. +const DefaultLineEnding = "\n" + +// A LevelEncoder serializes a Level to a primitive type. +type LevelEncoder func(Level, PrimitiveArrayEncoder) + +// LowercaseLevelEncoder serializes a Level to a lowercase string. For example, +// InfoLevel is serialized to "info". +func LowercaseLevelEncoder(l Level, enc PrimitiveArrayEncoder) { + enc.AppendString(l.String()) +} + +// LowercaseColorLevelEncoder serializes a Level to a lowercase string and adds coloring. +// For example, InfoLevel is serialized to "info" and colored blue. +func LowercaseColorLevelEncoder(l Level, enc PrimitiveArrayEncoder) { + s, ok := _levelToLowercaseColorString[l] + if !ok { + s = _unknownLevelColor.Add(l.String()) + } + enc.AppendString(s) +} + +// CapitalLevelEncoder serializes a Level to an all-caps string. For example, +// InfoLevel is serialized to "INFO". +func CapitalLevelEncoder(l Level, enc PrimitiveArrayEncoder) { + enc.AppendString(l.CapitalString()) +} + +// CapitalColorLevelEncoder serializes a Level to an all-caps string and adds color. +// For example, InfoLevel is serialized to "INFO" and colored blue. +func CapitalColorLevelEncoder(l Level, enc PrimitiveArrayEncoder) { + s, ok := _levelToCapitalColorString[l] + if !ok { + s = _unknownLevelColor.Add(l.CapitalString()) + } + enc.AppendString(s) +} + +// UnmarshalText unmarshals text to a LevelEncoder. "capital" is unmarshaled to +// CapitalLevelEncoder, "coloredCapital" is unmarshaled to CapitalColorLevelEncoder, +// "colored" is unmarshaled to LowercaseColorLevelEncoder, and anything else +// is unmarshaled to LowercaseLevelEncoder. +func (e *LevelEncoder) UnmarshalText(text []byte) error { + switch string(text) { + case "capital": + *e = CapitalLevelEncoder + case "capitalColor": + *e = CapitalColorLevelEncoder + case "color": + *e = LowercaseColorLevelEncoder + default: + *e = LowercaseLevelEncoder + } + return nil +} + +// A TimeEncoder serializes a time.Time to a primitive type. +type TimeEncoder func(time.Time, PrimitiveArrayEncoder) + +// EpochTimeEncoder serializes a time.Time to a floating-point number of seconds +// since the Unix epoch. +func EpochTimeEncoder(t time.Time, enc PrimitiveArrayEncoder) { + nanos := t.UnixNano() + sec := float64(nanos) / float64(time.Second) + enc.AppendFloat64(sec) +} + +// EpochMillisTimeEncoder serializes a time.Time to a floating-point number of +// milliseconds since the Unix epoch. +func EpochMillisTimeEncoder(t time.Time, enc PrimitiveArrayEncoder) { + nanos := t.UnixNano() + millis := float64(nanos) / float64(time.Millisecond) + enc.AppendFloat64(millis) +} + +// EpochNanosTimeEncoder serializes a time.Time to an integer number of +// nanoseconds since the Unix epoch. +func EpochNanosTimeEncoder(t time.Time, enc PrimitiveArrayEncoder) { + enc.AppendInt64(t.UnixNano()) +} + +// ISO8601TimeEncoder serializes a time.Time to an ISO8601-formatted string +// with millisecond precision. +func ISO8601TimeEncoder(t time.Time, enc PrimitiveArrayEncoder) { + enc.AppendString(t.Format("2006-01-02T15:04:05.000Z0700")) +} + +// UnmarshalText unmarshals text to a TimeEncoder. "iso8601" and "ISO8601" are +// unmarshaled to ISO8601TimeEncoder, "millis" is unmarshaled to +// EpochMillisTimeEncoder, and anything else is unmarshaled to EpochTimeEncoder. +func (e *TimeEncoder) UnmarshalText(text []byte) error { + switch string(text) { + case "iso8601", "ISO8601": + *e = ISO8601TimeEncoder + case "millis": + *e = EpochMillisTimeEncoder + case "nanos": + *e = EpochNanosTimeEncoder + default: + *e = EpochTimeEncoder + } + return nil +} + +// A DurationEncoder serializes a time.Duration to a primitive type. +type DurationEncoder func(time.Duration, PrimitiveArrayEncoder) + +// SecondsDurationEncoder serializes a time.Duration to a floating-point number of seconds elapsed. +func SecondsDurationEncoder(d time.Duration, enc PrimitiveArrayEncoder) { + enc.AppendFloat64(float64(d) / float64(time.Second)) +} + +// NanosDurationEncoder serializes a time.Duration to an integer number of +// nanoseconds elapsed. +func NanosDurationEncoder(d time.Duration, enc PrimitiveArrayEncoder) { + enc.AppendInt64(int64(d)) +} + +// StringDurationEncoder serializes a time.Duration using its built-in String +// method. +func StringDurationEncoder(d time.Duration, enc PrimitiveArrayEncoder) { + enc.AppendString(d.String()) +} + +// UnmarshalText unmarshals text to a DurationEncoder. "string" is unmarshaled +// to StringDurationEncoder, and anything else is unmarshaled to +// NanosDurationEncoder. +func (e *DurationEncoder) UnmarshalText(text []byte) error { + switch string(text) { + case "string": + *e = StringDurationEncoder + case "nanos": + *e = NanosDurationEncoder + default: + *e = SecondsDurationEncoder + } + return nil +} + +// A CallerEncoder serializes an EntryCaller to a primitive type. +type CallerEncoder func(EntryCaller, PrimitiveArrayEncoder) + +// FullCallerEncoder serializes a caller in /full/path/to/package/file:line +// format. +func FullCallerEncoder(caller EntryCaller, enc PrimitiveArrayEncoder) { + // TODO: consider using a byte-oriented API to save an allocation. + enc.AppendString(caller.String()) +} + +// ShortCallerEncoder serializes a caller in package/file:line format, trimming +// all but the final directory from the full path. +func ShortCallerEncoder(caller EntryCaller, enc PrimitiveArrayEncoder) { + // TODO: consider using a byte-oriented API to save an allocation. + enc.AppendString(caller.TrimmedPath()) +} + +// UnmarshalText unmarshals text to a CallerEncoder. "full" is unmarshaled to +// FullCallerEncoder and anything else is unmarshaled to ShortCallerEncoder. +func (e *CallerEncoder) UnmarshalText(text []byte) error { + switch string(text) { + case "full": + *e = FullCallerEncoder + default: + *e = ShortCallerEncoder + } + return nil +} + +// A NameEncoder serializes a period-separated logger name to a primitive +// type. +type NameEncoder func(string, PrimitiveArrayEncoder) + +// FullNameEncoder serializes the logger name as-is. +func FullNameEncoder(loggerName string, enc PrimitiveArrayEncoder) { + enc.AppendString(loggerName) +} + +// UnmarshalText unmarshals text to a NameEncoder. Currently, everything is +// unmarshaled to FullNameEncoder. +func (e *NameEncoder) UnmarshalText(text []byte) error { + switch string(text) { + case "full": + *e = FullNameEncoder + default: + *e = FullNameEncoder + } + return nil +} + +// An EncoderConfig allows users to configure the concrete encoders supplied by +// zapcore. +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"` + StacktraceKey string `json:"stacktraceKey" yaml:"stacktraceKey"` + 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. + EncodeLevel LevelEncoder `json:"levelEncoder" yaml:"levelEncoder"` + EncodeTime TimeEncoder `json:"timeEncoder" yaml:"timeEncoder"` + EncodeDuration DurationEncoder `json:"durationEncoder" yaml:"durationEncoder"` + EncodeCaller CallerEncoder `json:"callerEncoder" yaml:"callerEncoder"` + // Unlike the other primitive type encoders, EncodeName is optional. The + // zero value falls back to FullNameEncoder. + EncodeName NameEncoder `json:"nameEncoder" yaml:"nameEncoder"` +} + +// ObjectEncoder is a strongly-typed, encoding-agnostic interface for adding a +// map- or struct-like object to the logging context. Like maps, ObjectEncoders +// aren't safe for concurrent use (though typical use shouldn't require locks). +type ObjectEncoder interface { + // Logging-specific marshalers. + AddArray(key string, marshaler ArrayMarshaler) error + AddObject(key string, marshaler ObjectMarshaler) error + + // Built-in types. + AddBinary(key string, value []byte) // for arbitrary bytes + AddByteString(key string, value []byte) // for UTF-8 encoded bytes + AddBool(key string, value bool) + AddComplex128(key string, value complex128) + AddComplex64(key string, value complex64) + AddDuration(key string, value time.Duration) + AddFloat64(key string, value float64) + AddFloat32(key string, value float32) + AddInt(key string, value int) + AddInt64(key string, value int64) + AddInt32(key string, value int32) + AddInt16(key string, value int16) + AddInt8(key string, value int8) + AddString(key, value string) + AddTime(key string, value time.Time) + AddUint(key string, value uint) + AddUint64(key string, value uint64) + AddUint32(key string, value uint32) + AddUint16(key string, value uint16) + AddUint8(key string, value uint8) + AddUintptr(key string, value uintptr) + + // AddReflected uses reflection to serialize arbitrary objects, so it's slow + // and allocation-heavy. + AddReflected(key string, value interface{}) error + // OpenNamespace opens an isolated namespace where all subsequent fields will + // be added. Applications can use namespaces to prevent key collisions when + // injecting loggers into sub-components or third-party libraries. + OpenNamespace(key string) +} + +// ArrayEncoder is a strongly-typed, encoding-agnostic interface for adding +// array-like objects to the logging context. Of note, it supports mixed-type +// arrays even though they aren't typical in Go. Like slices, ArrayEncoders +// aren't safe for concurrent use (though typical use shouldn't require locks). +type ArrayEncoder interface { + // Built-in types. + PrimitiveArrayEncoder + + // Time-related types. + AppendDuration(time.Duration) + AppendTime(time.Time) + + // Logging-specific marshalers. + AppendArray(ArrayMarshaler) error + AppendObject(ObjectMarshaler) error + + // AppendReflected uses reflection to serialize arbitrary objects, so it's + // slow and allocation-heavy. + AppendReflected(value interface{}) error +} + +// PrimitiveArrayEncoder is the subset of the ArrayEncoder interface that deals +// only in Go's built-in types. It's included only so that Duration- and +// TimeEncoders cannot trigger infinite recursion. +type PrimitiveArrayEncoder interface { + // Built-in types. + AppendBool(bool) + AppendByteString([]byte) // for UTF-8 encoded bytes + AppendComplex128(complex128) + AppendComplex64(complex64) + AppendFloat64(float64) + AppendFloat32(float32) + AppendInt(int) + AppendInt64(int64) + AppendInt32(int32) + AppendInt16(int16) + AppendInt8(int8) + AppendString(string) + AppendUint(uint) + AppendUint64(uint64) + AppendUint32(uint32) + AppendUint16(uint16) + AppendUint8(uint8) + AppendUintptr(uintptr) +} + +// Encoder is a format-agnostic interface for all log entry marshalers. Since +// log encoders don't need to support the same wide range of use cases as +// general-purpose marshalers, it's possible to make them faster and +// lower-allocation. +// +// Implementations of the ObjectEncoder interface's methods can, of course, +// freely modify the receiver. However, the Clone and EncodeEntry methods will +// be called concurrently and shouldn't modify the receiver. +type Encoder interface { + ObjectEncoder + + // Clone copies the encoder, ensuring that adding fields to the copy doesn't + // affect the original. + Clone() Encoder + + // EncodeEntry encodes an entry and fields, along with any accumulated + // context, into a byte buffer and returns it. + EncodeEntry(Entry, []Field) (*buffer.Buffer, error) +} diff --git a/api/vendor/go.uber.org/zap/zapcore/encoder_test.go b/api/vendor/go.uber.org/zap/zapcore/encoder_test.go new file mode 100644 index 0000000..0464167 --- /dev/null +++ b/api/vendor/go.uber.org/zap/zapcore/encoder_test.go @@ -0,0 +1,636 @@ +// 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 +// 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. + +package zapcore_test + +import ( + "strings" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + . "go.uber.org/zap/zapcore" +) + +var ( + _epoch = time.Date(1970, time.January, 1, 0, 0, 0, 0, time.UTC) + _testEntry = Entry{ + LoggerName: "main", + Level: InfoLevel, + Message: `hello`, + Time: _epoch, + Stack: "fake-stack", + Caller: EntryCaller{Defined: true, File: "foo.go", Line: 42}, + } +) + +func testEncoderConfig() EncoderConfig { + return EncoderConfig{ + MessageKey: "msg", + LevelKey: "level", + NameKey: "name", + TimeKey: "ts", + CallerKey: "caller", + StacktraceKey: "stacktrace", + LineEnding: "\n", + EncodeTime: EpochTimeEncoder, + EncodeLevel: LowercaseLevelEncoder, + EncodeDuration: SecondsDurationEncoder, + EncodeCaller: ShortCallerEncoder, + } +} + +func humanEncoderConfig() EncoderConfig { + cfg := testEncoderConfig() + cfg.EncodeTime = ISO8601TimeEncoder + cfg.EncodeLevel = CapitalLevelEncoder + cfg.EncodeDuration = StringDurationEncoder + return cfg +} + +func withJSONEncoder(f func(Encoder)) { + f(NewJSONEncoder(testEncoderConfig())) +} + +func withConsoleEncoder(f func(Encoder)) { + f(NewConsoleEncoder(humanEncoderConfig())) +} + +func capitalNameEncoder(loggerName string, enc PrimitiveArrayEncoder) { + enc.AppendString(strings.ToUpper(loggerName)) +} + +func TestEncoderConfiguration(t *testing.T) { + base := testEncoderConfig() + + tests := []struct { + desc string + cfg EncoderConfig + amendEntry func(Entry) Entry + extra func(Encoder) + expectedJSON string + expectedConsole string + }{ + { + desc: "messages to be escaped", + cfg: base, + amendEntry: func(ent Entry) Entry { + ent.Message = `hello\` + return ent + }, + expectedJSON: `{"level":"info","ts":0,"name":"main","caller":"foo.go:42","msg":"hello\\","stacktrace":"fake-stack"}` + "\n", + expectedConsole: "0\tinfo\tmain\tfoo.go:42\thello\\\nfake-stack\n", + }, + { + desc: "use custom entry keys in JSON output and ignore them in console output", + cfg: EncoderConfig{ + LevelKey: "L", + TimeKey: "T", + MessageKey: "M", + NameKey: "N", + CallerKey: "C", + StacktraceKey: "S", + LineEnding: base.LineEnding, + EncodeTime: base.EncodeTime, + EncodeDuration: base.EncodeDuration, + EncodeLevel: base.EncodeLevel, + EncodeCaller: base.EncodeCaller, + }, + expectedJSON: `{"L":"info","T":0,"N":"main","C":"foo.go:42","M":"hello","S":"fake-stack"}` + "\n", + expectedConsole: "0\tinfo\tmain\tfoo.go:42\thello\nfake-stack\n", + }, + { + desc: "skip level if LevelKey is omitted", + cfg: EncoderConfig{ + LevelKey: "", + TimeKey: "T", + MessageKey: "M", + NameKey: "N", + CallerKey: "C", + StacktraceKey: "S", + LineEnding: base.LineEnding, + EncodeTime: base.EncodeTime, + EncodeDuration: base.EncodeDuration, + EncodeLevel: base.EncodeLevel, + EncodeCaller: base.EncodeCaller, + }, + expectedJSON: `{"T":0,"N":"main","C":"foo.go:42","M":"hello","S":"fake-stack"}` + "\n", + expectedConsole: "0\tmain\tfoo.go:42\thello\nfake-stack\n", + }, + { + desc: "skip timestamp if TimeKey is omitted", + cfg: EncoderConfig{ + LevelKey: "L", + TimeKey: "", + MessageKey: "M", + NameKey: "N", + CallerKey: "C", + StacktraceKey: "S", + LineEnding: base.LineEnding, + EncodeTime: base.EncodeTime, + EncodeDuration: base.EncodeDuration, + EncodeLevel: base.EncodeLevel, + EncodeCaller: base.EncodeCaller, + }, + expectedJSON: `{"L":"info","N":"main","C":"foo.go:42","M":"hello","S":"fake-stack"}` + "\n", + expectedConsole: "info\tmain\tfoo.go:42\thello\nfake-stack\n", + }, + { + desc: "skip message if MessageKey is omitted", + cfg: EncoderConfig{ + LevelKey: "L", + TimeKey: "T", + MessageKey: "", + NameKey: "N", + CallerKey: "C", + StacktraceKey: "S", + LineEnding: base.LineEnding, + EncodeTime: base.EncodeTime, + EncodeDuration: base.EncodeDuration, + EncodeLevel: base.EncodeLevel, + EncodeCaller: base.EncodeCaller, + }, + expectedJSON: `{"L":"info","T":0,"N":"main","C":"foo.go:42","S":"fake-stack"}` + "\n", + expectedConsole: "0\tinfo\tmain\tfoo.go:42\nfake-stack\n", + }, + { + desc: "skip name if NameKey is omitted", + cfg: EncoderConfig{ + LevelKey: "L", + TimeKey: "T", + MessageKey: "M", + NameKey: "", + CallerKey: "C", + StacktraceKey: "S", + LineEnding: base.LineEnding, + EncodeTime: base.EncodeTime, + EncodeDuration: base.EncodeDuration, + EncodeLevel: base.EncodeLevel, + EncodeCaller: base.EncodeCaller, + }, + expectedJSON: `{"L":"info","T":0,"C":"foo.go:42","M":"hello","S":"fake-stack"}` + "\n", + expectedConsole: "0\tinfo\tfoo.go:42\thello\nfake-stack\n", + }, + { + desc: "skip caller if CallerKey is omitted", + cfg: EncoderConfig{ + LevelKey: "L", + TimeKey: "T", + MessageKey: "M", + NameKey: "N", + CallerKey: "", + StacktraceKey: "S", + LineEnding: base.LineEnding, + EncodeTime: base.EncodeTime, + EncodeDuration: base.EncodeDuration, + EncodeLevel: base.EncodeLevel, + EncodeCaller: base.EncodeCaller, + }, + expectedJSON: `{"L":"info","T":0,"N":"main","M":"hello","S":"fake-stack"}` + "\n", + expectedConsole: "0\tinfo\tmain\thello\nfake-stack\n", + }, + { + desc: "skip stacktrace if StacktraceKey is omitted", + cfg: EncoderConfig{ + LevelKey: "L", + TimeKey: "T", + MessageKey: "M", + NameKey: "N", + CallerKey: "C", + StacktraceKey: "", + LineEnding: base.LineEnding, + EncodeTime: base.EncodeTime, + EncodeDuration: base.EncodeDuration, + EncodeLevel: base.EncodeLevel, + EncodeCaller: base.EncodeCaller, + }, + expectedJSON: `{"L":"info","T":0,"N":"main","C":"foo.go:42","M":"hello"}` + "\n", + expectedConsole: "0\tinfo\tmain\tfoo.go:42\thello\n", + }, + { + desc: "use the supplied EncodeTime, for both the entry and any times added", + cfg: EncoderConfig{ + LevelKey: "L", + TimeKey: "T", + MessageKey: "M", + NameKey: "N", + CallerKey: "C", + StacktraceKey: "S", + LineEnding: base.LineEnding, + EncodeTime: func(t time.Time, enc PrimitiveArrayEncoder) { enc.AppendString(t.String()) }, + EncodeDuration: base.EncodeDuration, + EncodeLevel: base.EncodeLevel, + EncodeCaller: base.EncodeCaller, + }, + extra: func(enc Encoder) { + enc.AddTime("extra", _epoch) + enc.AddArray("extras", ArrayMarshalerFunc(func(enc ArrayEncoder) error { + enc.AppendTime(_epoch) + return nil + })) + }, + expectedJSON: `{"L":"info","T":"1970-01-01 00:00:00 +0000 UTC","N":"main","C":"foo.go:42","M":"hello","extra":"1970-01-01 00:00:00 +0000 UTC","extras":["1970-01-01 00:00:00 +0000 UTC"],"S":"fake-stack"}` + "\n", + expectedConsole: "1970-01-01 00:00:00 +0000 UTC\tinfo\tmain\tfoo.go:42\thello\t" + // plain-text preamble + `{"extra": "1970-01-01 00:00:00 +0000 UTC", "extras": ["1970-01-01 00:00:00 +0000 UTC"]}` + // JSON context + "\nfake-stack\n", // stacktrace after newline + }, + { + desc: "use the supplied EncodeDuration for any durations added", + cfg: EncoderConfig{ + LevelKey: "L", + TimeKey: "T", + MessageKey: "M", + NameKey: "N", + CallerKey: "C", + StacktraceKey: "S", + LineEnding: base.LineEnding, + EncodeTime: base.EncodeTime, + EncodeDuration: StringDurationEncoder, + EncodeLevel: base.EncodeLevel, + EncodeCaller: base.EncodeCaller, + }, + extra: func(enc Encoder) { + enc.AddDuration("extra", time.Second) + enc.AddArray("extras", ArrayMarshalerFunc(func(enc ArrayEncoder) error { + enc.AppendDuration(time.Minute) + return nil + })) + }, + expectedJSON: `{"L":"info","T":0,"N":"main","C":"foo.go:42","M":"hello","extra":"1s","extras":["1m0s"],"S":"fake-stack"}` + "\n", + expectedConsole: "0\tinfo\tmain\tfoo.go:42\thello\t" + // preamble + `{"extra": "1s", "extras": ["1m0s"]}` + // context + "\nfake-stack\n", // stacktrace + }, + { + desc: "use the supplied EncodeLevel", + cfg: EncoderConfig{ + LevelKey: "L", + TimeKey: "T", + MessageKey: "M", + NameKey: "N", + CallerKey: "C", + StacktraceKey: "S", + LineEnding: base.LineEnding, + EncodeTime: base.EncodeTime, + EncodeDuration: base.EncodeDuration, + EncodeLevel: CapitalLevelEncoder, + EncodeCaller: base.EncodeCaller, + }, + expectedJSON: `{"L":"INFO","T":0,"N":"main","C":"foo.go:42","M":"hello","S":"fake-stack"}` + "\n", + expectedConsole: "0\tINFO\tmain\tfoo.go:42\thello\nfake-stack\n", + }, + { + desc: "use the supplied EncodeName", + cfg: EncoderConfig{ + LevelKey: "L", + TimeKey: "T", + MessageKey: "M", + NameKey: "N", + CallerKey: "C", + StacktraceKey: "S", + LineEnding: base.LineEnding, + EncodeTime: base.EncodeTime, + EncodeDuration: base.EncodeDuration, + EncodeLevel: base.EncodeLevel, + EncodeCaller: base.EncodeCaller, + EncodeName: capitalNameEncoder, + }, + expectedJSON: `{"L":"info","T":0,"N":"MAIN","C":"foo.go:42","M":"hello","S":"fake-stack"}` + "\n", + expectedConsole: "0\tinfo\tMAIN\tfoo.go:42\thello\nfake-stack\n", + }, + { + desc: "close all open namespaces", + cfg: EncoderConfig{ + LevelKey: "L", + TimeKey: "T", + MessageKey: "M", + NameKey: "N", + CallerKey: "C", + StacktraceKey: "S", + LineEnding: base.LineEnding, + EncodeTime: base.EncodeTime, + EncodeDuration: base.EncodeDuration, + EncodeLevel: base.EncodeLevel, + EncodeCaller: base.EncodeCaller, + }, + extra: func(enc Encoder) { + enc.OpenNamespace("outer") + enc.OpenNamespace("inner") + enc.AddString("foo", "bar") + enc.OpenNamespace("innermost") + }, + expectedJSON: `{"L":"info","T":0,"N":"main","C":"foo.go:42","M":"hello","outer":{"inner":{"foo":"bar","innermost":{}}},"S":"fake-stack"}` + "\n", + expectedConsole: "0\tinfo\tmain\tfoo.go:42\thello\t" + + `{"outer": {"inner": {"foo": "bar", "innermost": {}}}}` + + "\nfake-stack\n", + }, + { + desc: "handle no-op EncodeTime", + cfg: EncoderConfig{ + LevelKey: "L", + TimeKey: "T", + MessageKey: "M", + NameKey: "N", + CallerKey: "C", + StacktraceKey: "S", + LineEnding: base.LineEnding, + EncodeTime: func(time.Time, PrimitiveArrayEncoder) {}, + EncodeDuration: base.EncodeDuration, + EncodeLevel: base.EncodeLevel, + EncodeCaller: base.EncodeCaller, + }, + extra: func(enc Encoder) { enc.AddTime("sometime", time.Unix(0, 100)) }, + expectedJSON: `{"L":"info","T":0,"N":"main","C":"foo.go:42","M":"hello","sometime":100,"S":"fake-stack"}` + "\n", + expectedConsole: "info\tmain\tfoo.go:42\thello\t" + `{"sometime": 100}` + "\nfake-stack\n", + }, + { + desc: "handle no-op EncodeDuration", + cfg: EncoderConfig{ + LevelKey: "L", + TimeKey: "T", + MessageKey: "M", + NameKey: "N", + CallerKey: "C", + StacktraceKey: "S", + LineEnding: base.LineEnding, + EncodeTime: base.EncodeTime, + EncodeDuration: func(time.Duration, PrimitiveArrayEncoder) {}, + EncodeLevel: base.EncodeLevel, + EncodeCaller: base.EncodeCaller, + }, + extra: func(enc Encoder) { enc.AddDuration("someduration", time.Microsecond) }, + expectedJSON: `{"L":"info","T":0,"N":"main","C":"foo.go:42","M":"hello","someduration":1000,"S":"fake-stack"}` + "\n", + expectedConsole: "0\tinfo\tmain\tfoo.go:42\thello\t" + `{"someduration": 1000}` + "\nfake-stack\n", + }, + { + desc: "handle no-op EncodeLevel", + cfg: EncoderConfig{ + LevelKey: "L", + TimeKey: "T", + MessageKey: "M", + NameKey: "N", + CallerKey: "C", + StacktraceKey: "S", + LineEnding: base.LineEnding, + EncodeTime: base.EncodeTime, + EncodeDuration: base.EncodeDuration, + EncodeLevel: func(Level, PrimitiveArrayEncoder) {}, + EncodeCaller: base.EncodeCaller, + }, + expectedJSON: `{"L":"info","T":0,"N":"main","C":"foo.go:42","M":"hello","S":"fake-stack"}` + "\n", + expectedConsole: "0\tmain\tfoo.go:42\thello\nfake-stack\n", + }, + { + desc: "handle no-op EncodeCaller", + cfg: EncoderConfig{ + LevelKey: "L", + TimeKey: "T", + MessageKey: "M", + NameKey: "N", + CallerKey: "C", + StacktraceKey: "S", + LineEnding: base.LineEnding, + EncodeTime: base.EncodeTime, + EncodeDuration: base.EncodeDuration, + EncodeLevel: base.EncodeLevel, + EncodeCaller: func(EntryCaller, PrimitiveArrayEncoder) {}, + }, + expectedJSON: `{"L":"info","T":0,"N":"main","C":"foo.go:42","M":"hello","S":"fake-stack"}` + "\n", + expectedConsole: "0\tinfo\tmain\thello\nfake-stack\n", + }, + { + desc: "handle no-op EncodeName", + cfg: EncoderConfig{ + LevelKey: "L", + TimeKey: "T", + MessageKey: "M", + NameKey: "N", + CallerKey: "C", + StacktraceKey: "S", + LineEnding: base.LineEnding, + EncodeTime: base.EncodeTime, + EncodeDuration: base.EncodeDuration, + EncodeLevel: base.EncodeLevel, + EncodeCaller: base.EncodeCaller, + EncodeName: func(string, PrimitiveArrayEncoder) {}, + }, + expectedJSON: `{"L":"info","T":0,"N":"main","C":"foo.go:42","M":"hello","S":"fake-stack"}` + "\n", + expectedConsole: "0\tinfo\tfoo.go:42\thello\nfake-stack\n", + }, + { + desc: "use custom line separator", + cfg: EncoderConfig{ + LevelKey: "L", + TimeKey: "T", + MessageKey: "M", + NameKey: "N", + CallerKey: "C", + StacktraceKey: "S", + LineEnding: "\r\n", + EncodeTime: base.EncodeTime, + EncodeDuration: base.EncodeDuration, + EncodeLevel: base.EncodeLevel, + EncodeCaller: base.EncodeCaller, + }, + expectedJSON: `{"L":"info","T":0,"N":"main","C":"foo.go:42","M":"hello","S":"fake-stack"}` + "\r\n", + expectedConsole: "0\tinfo\tmain\tfoo.go:42\thello\nfake-stack\r\n", + }, + { + desc: "omit line separator definition - fall back to default", + cfg: EncoderConfig{ + LevelKey: "L", + TimeKey: "T", + MessageKey: "M", + NameKey: "N", + CallerKey: "C", + StacktraceKey: "S", + EncodeTime: base.EncodeTime, + EncodeDuration: base.EncodeDuration, + EncodeLevel: base.EncodeLevel, + EncodeCaller: base.EncodeCaller, + }, + expectedJSON: `{"L":"info","T":0,"N":"main","C":"foo.go:42","M":"hello","S":"fake-stack"}` + DefaultLineEnding, + expectedConsole: "0\tinfo\tmain\tfoo.go:42\thello\nfake-stack" + DefaultLineEnding, + }, + } + + for i, tt := range tests { + json := NewJSONEncoder(tt.cfg) + console := NewConsoleEncoder(tt.cfg) + if tt.extra != nil { + tt.extra(json) + tt.extra(console) + } + entry := _testEntry + if tt.amendEntry != nil { + entry = tt.amendEntry(_testEntry) + } + jsonOut, jsonErr := json.EncodeEntry(entry, nil) + if assert.NoError(t, jsonErr, "Unexpected error JSON-encoding entry in case #%d.", i) { + assert.Equal( + t, + tt.expectedJSON, + jsonOut.String(), + "Unexpected JSON output: expected to %v.", tt.desc, + ) + } + consoleOut, consoleErr := console.EncodeEntry(entry, nil) + if assert.NoError(t, consoleErr, "Unexpected error console-encoding entry in case #%d.", i) { + assert.Equal( + t, + tt.expectedConsole, + consoleOut.String(), + "Unexpected console output: expected to %v.", tt.desc, + ) + } + } +} + +func TestLevelEncoders(t *testing.T) { + tests := []struct { + name string + expected interface{} // output of encoding InfoLevel + }{ + {"capital", "INFO"}, + {"lower", "info"}, + {"", "info"}, + {"something-random", "info"}, + } + + for _, tt := range tests { + var le LevelEncoder + require.NoError(t, le.UnmarshalText([]byte(tt.name)), "Unexpected error unmarshaling %q.", tt.name) + assertAppended( + t, + tt.expected, + func(arr ArrayEncoder) { le(InfoLevel, arr) }, + "Unexpected output serializing InfoLevel with %q.", tt.name, + ) + } +} + +func TestTimeEncoders(t *testing.T) { + moment := time.Unix(100, 50005000).UTC() + tests := []struct { + name string + expected interface{} // output of serializing moment + }{ + {"iso8601", "1970-01-01T00:01:40.050Z"}, + {"ISO8601", "1970-01-01T00:01:40.050Z"}, + {"millis", 100050.005}, + {"nanos", int64(100050005000)}, + {"", 100.050005}, + {"something-random", 100.050005}, + } + + for _, tt := range tests { + var te TimeEncoder + require.NoError(t, te.UnmarshalText([]byte(tt.name)), "Unexpected error unmarshaling %q.", tt.name) + assertAppended( + t, + tt.expected, + func(arr ArrayEncoder) { te(moment, arr) }, + "Unexpected output serializing %v with %q.", moment, tt.name, + ) + } +} + +func TestDurationEncoders(t *testing.T) { + elapsed := time.Second + 500*time.Nanosecond + tests := []struct { + name string + expected interface{} // output of serializing elapsed + }{ + {"string", "1.0000005s"}, + {"nanos", int64(1000000500)}, + {"", 1.0000005}, + {"something-random", 1.0000005}, + } + + for _, tt := range tests { + var de DurationEncoder + require.NoError(t, de.UnmarshalText([]byte(tt.name)), "Unexpected error unmarshaling %q.", tt.name) + assertAppended( + t, + tt.expected, + func(arr ArrayEncoder) { de(elapsed, arr) }, + "Unexpected output serializing %v with %q.", elapsed, tt.name, + ) + } +} + +func TestCallerEncoders(t *testing.T) { + caller := EntryCaller{Defined: true, File: "/home/jack/src/github.com/foo/foo.go", Line: 42} + tests := []struct { + name string + expected interface{} // output of serializing caller + }{ + {"", "foo/foo.go:42"}, + {"something-random", "foo/foo.go:42"}, + {"short", "foo/foo.go:42"}, + {"full", "/home/jack/src/github.com/foo/foo.go:42"}, + } + + for _, tt := range tests { + var ce CallerEncoder + require.NoError(t, ce.UnmarshalText([]byte(tt.name)), "Unexpected error unmarshaling %q.", tt.name) + assertAppended( + t, + tt.expected, + func(arr ArrayEncoder) { ce(caller, arr) }, + "Unexpected output serializing file name as %v with %q.", tt.expected, tt.name, + ) + } +} + +func TestNameEncoders(t *testing.T) { + tests := []struct { + name string + expected interface{} // output of encoding InfoLevel + }{ + {"", "main"}, + {"full", "main"}, + {"something-random", "main"}, + } + + for _, tt := range tests { + var ne NameEncoder + require.NoError(t, ne.UnmarshalText([]byte(tt.name)), "Unexpected error unmarshaling %q.", tt.name) + assertAppended( + t, + tt.expected, + func(arr ArrayEncoder) { ne("main", arr) }, + "Unexpected output serializing logger name with %q.", tt.name, + ) + } +} + +func assertAppended(t testing.TB, expected interface{}, f func(ArrayEncoder), msgAndArgs ...interface{}) { + mem := NewMapObjectEncoder() + mem.AddArray("k", ArrayMarshalerFunc(func(arr ArrayEncoder) error { + f(arr) + return nil + })) + arr := mem.Fields["k"].([]interface{}) + require.Equal(t, 1, len(arr), "Expected to append exactly one element to array.") + assert.Equal(t, expected, arr[0], msgAndArgs...) +} diff --git a/api/vendor/go.uber.org/zap/zapcore/entry.go b/api/vendor/go.uber.org/zap/zapcore/entry.go new file mode 100644 index 0000000..7d9893f --- /dev/null +++ b/api/vendor/go.uber.org/zap/zapcore/entry.go @@ -0,0 +1,257 @@ +// 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 +// 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. + +package zapcore + +import ( + "fmt" + "strings" + "sync" + "time" + + "go.uber.org/zap/internal/bufferpool" + "go.uber.org/zap/internal/exit" + + "go.uber.org/multierr" +) + +var ( + _cePool = sync.Pool{New: func() interface{} { + // Pre-allocate some space for cores. + return &CheckedEntry{ + cores: make([]Core, 4), + } + }} +) + +func getCheckedEntry() *CheckedEntry { + ce := _cePool.Get().(*CheckedEntry) + ce.reset() + return ce +} + +func putCheckedEntry(ce *CheckedEntry) { + if ce == nil { + return + } + _cePool.Put(ce) +} + +// NewEntryCaller makes an EntryCaller from the return signature of +// runtime.Caller. +func NewEntryCaller(pc uintptr, file string, line int, ok bool) EntryCaller { + if !ok { + return EntryCaller{} + } + return EntryCaller{ + PC: pc, + File: file, + Line: line, + Defined: true, + } +} + +// EntryCaller represents the caller of a logging function. +type EntryCaller struct { + Defined bool + PC uintptr + File string + Line int +} + +// String returns the full path and line number of the caller. +func (ec EntryCaller) String() string { + return ec.FullPath() +} + +// FullPath returns a /full/path/to/package/file:line description of the +// caller. +func (ec EntryCaller) FullPath() string { + if !ec.Defined { + return "undefined" + } + buf := bufferpool.Get() + buf.AppendString(ec.File) + buf.AppendByte(':') + buf.AppendInt(int64(ec.Line)) + caller := buf.String() + buf.Free() + return caller +} + +// TrimmedPath returns a package/file:line description of the caller, +// preserving only the leaf directory name and file name. +func (ec EntryCaller) TrimmedPath() string { + if !ec.Defined { + return "undefined" + } + // nb. To make sure we trim the path correctly on Windows too, we + // counter-intuitively need to use '/' and *not* os.PathSeparator here, + // because the path given originates from Go stdlib, specifically + // runtime.Caller() which (as of Mar/17) returns forward slashes even on + // Windows. + // + // See https://github.com/golang/go/issues/3335 + // and https://github.com/golang/go/issues/18151 + // + // for discussion on the issue on Go side. + // + // Find the last separator. + // + idx := strings.LastIndexByte(ec.File, '/') + if idx == -1 { + return ec.FullPath() + } + // Find the penultimate separator. + idx = strings.LastIndexByte(ec.File[:idx], '/') + if idx == -1 { + return ec.FullPath() + } + buf := bufferpool.Get() + // Keep everything after the penultimate separator. + buf.AppendString(ec.File[idx+1:]) + buf.AppendByte(':') + buf.AppendInt(int64(ec.Line)) + caller := buf.String() + buf.Free() + return caller +} + +// An Entry represents a complete log message. The entry's structured context +// is already serialized, but the log level, time, message, and call site +// information are available for inspection and modification. +// +// Entries are pooled, so any functions that accept them MUST be careful not to +// retain references to them. +type Entry struct { + Level Level + Time time.Time + LoggerName string + Message string + Caller EntryCaller + Stack string +} + +// CheckWriteAction indicates what action to take after a log entry is +// processed. Actions are ordered in increasing severity. +type CheckWriteAction uint8 + +const ( + // WriteThenNoop indicates that nothing special needs to be done. It's the + // default behavior. + WriteThenNoop CheckWriteAction = iota + // WriteThenPanic causes a panic after Write. + WriteThenPanic + // WriteThenFatal causes a fatal os.Exit after Write. + WriteThenFatal +) + +// CheckedEntry is an Entry together with a collection of Cores that have +// already agreed to log it. +// +// CheckedEntry references should be created by calling AddCore or Should on a +// nil *CheckedEntry. References are returned to a pool after Write, and MUST +// NOT be retained after calling their Write method. +type CheckedEntry struct { + Entry + ErrorOutput WriteSyncer + dirty bool // best-effort detection of pool misuse + should CheckWriteAction + cores []Core +} + +func (ce *CheckedEntry) reset() { + ce.Entry = Entry{} + ce.ErrorOutput = nil + ce.dirty = false + ce.should = WriteThenNoop + for i := range ce.cores { + // don't keep references to cores + ce.cores[i] = nil + } + ce.cores = ce.cores[:0] +} + +// Write writes the entry to the stored Cores, returns any errors, and returns +// the CheckedEntry reference to a pool for immediate re-use. Finally, it +// executes any required CheckWriteAction. +func (ce *CheckedEntry) Write(fields ...Field) { + if ce == nil { + return + } + + if ce.dirty { + if ce.ErrorOutput != nil { + // Make a best effort to detect unsafe re-use of this CheckedEntry. + // If the entry is dirty, log an internal error; because the + // CheckedEntry is being used after it was returned to the pool, + // the message may be an amalgamation from multiple call sites. + fmt.Fprintf(ce.ErrorOutput, "%v Unsafe CheckedEntry re-use near Entry %+v.\n", time.Now(), ce.Entry) + ce.ErrorOutput.Sync() + } + return + } + ce.dirty = true + + var err error + for i := range ce.cores { + err = multierr.Append(err, ce.cores[i].Write(ce.Entry, fields)) + } + if ce.ErrorOutput != nil { + if err != nil { + fmt.Fprintf(ce.ErrorOutput, "%v write error: %v\n", time.Now(), err) + ce.ErrorOutput.Sync() + } + } + + should, msg := ce.should, ce.Message + putCheckedEntry(ce) + + switch should { + case WriteThenPanic: + panic(msg) + case WriteThenFatal: + exit.Exit() + } +} + +// AddCore adds a Core that has agreed to log this CheckedEntry. It's intended to be +// used by Core.Check implementations, and is safe to call on nil CheckedEntry +// references. +func (ce *CheckedEntry) AddCore(ent Entry, core Core) *CheckedEntry { + if ce == nil { + ce = getCheckedEntry() + ce.Entry = ent + } + ce.cores = append(ce.cores, core) + return ce +} + +// Should sets this CheckedEntry's CheckWriteAction, which controls whether a +// Core will panic or fatal after writing this log entry. Like AddCore, it's +// safe to call on nil CheckedEntry references. +func (ce *CheckedEntry) Should(ent Entry, should CheckWriteAction) *CheckedEntry { + if ce == nil { + ce = getCheckedEntry() + ce.Entry = ent + } + ce.should = should + return ce +} diff --git a/api/vendor/go.uber.org/zap/zapcore/entry_test.go b/api/vendor/go.uber.org/zap/zapcore/entry_test.go new file mode 100644 index 0000000..569c4e1 --- /dev/null +++ b/api/vendor/go.uber.org/zap/zapcore/entry_test.go @@ -0,0 +1,107 @@ +// 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 +// 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. + +package zapcore + +import ( + "sync" + "testing" + + "go.uber.org/zap/internal/exit" + + "github.com/stretchr/testify/assert" +) + +func TestPutNilEntry(t *testing.T) { + // Pooling nil entries defeats the purpose. + var wg sync.WaitGroup + wg.Add(2) + + go func() { + defer wg.Done() + for i := 0; i < 1000; i++ { + putCheckedEntry(nil) + } + }() + + go func() { + defer wg.Done() + for i := 0; i < 1000; i++ { + ce := getCheckedEntry() + assert.NotNil(t, ce, "Expected only non-nil CheckedEntries in pool.") + assert.False(t, ce.dirty, "Unexpected dirty bit set.") + assert.Nil(t, ce.ErrorOutput, "Non-nil ErrorOutput.") + assert.Equal(t, WriteThenNoop, ce.should, "Unexpected terminal behavior.") + assert.Equal(t, 0, len(ce.cores), "Expected empty slice of cores.") + assert.True(t, cap(ce.cores) > 0, "Expected pooled CheckedEntries to pre-allocate slice of Cores.") + } + }() + + wg.Wait() +} + +func TestEntryCaller(t *testing.T) { + tests := []struct { + caller EntryCaller + full string + short string + }{ + { + caller: NewEntryCaller(100, "/path/to/foo.go", 42, false), + full: "undefined", + short: "undefined", + }, + { + caller: NewEntryCaller(100, "/path/to/foo.go", 42, true), + full: "/path/to/foo.go:42", + short: "to/foo.go:42", + }, + { + caller: NewEntryCaller(100, "to/foo.go", 42, true), + full: "to/foo.go:42", + short: "to/foo.go:42", + }, + } + + for _, tt := range tests { + assert.Equal(t, tt.full, tt.caller.String(), "Unexpected string from EntryCaller.") + assert.Equal(t, tt.full, tt.caller.FullPath(), "Unexpected FullPath from EntryCaller.") + assert.Equal(t, tt.short, tt.caller.TrimmedPath(), "Unexpected TrimmedPath from EntryCaller.") + } +} + +func TestCheckedEntryWrite(t *testing.T) { + // Nil checked entries are safe. + var ce *CheckedEntry + assert.NotPanics(t, func() { ce.Write() }, "Unexpected panic writing nil CheckedEntry.") + + // WriteThenPanic + ce = ce.Should(Entry{}, WriteThenPanic) + assert.Panics(t, func() { ce.Write() }, "Expected to panic when WriteThenPanic is set.") + ce.reset() + + // WriteThenFatal + ce = ce.Should(Entry{}, WriteThenFatal) + stub := exit.WithStub(func() { + ce.Write() + }) + assert.True(t, stub.Exited, "Expected to exit when WriteThenFatal is set.") + ce.reset() +} diff --git a/api/vendor/go.uber.org/zap/zapcore/error.go b/api/vendor/go.uber.org/zap/zapcore/error.go new file mode 100644 index 0000000..a67c7ba --- /dev/null +++ b/api/vendor/go.uber.org/zap/zapcore/error.go @@ -0,0 +1,120 @@ +// Copyright (c) 2017 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. + +package zapcore + +import ( + "fmt" + "sync" +) + +// Encodes the given error into fields of an object. A field with the given +// name is added for the error message. +// +// If the error implements fmt.Formatter, a field with the name ${key}Verbose +// is also added with the full verbose error message. +// +// Finally, if the error implements errorGroup (from go.uber.org/multierr) or +// causer (from github.com/pkg/errors), a ${key}Causes field is added with an +// array of objects containing the errors this error was comprised of. +// +// { +// "error": err.Error(), +// "errorVerbose": fmt.Sprintf("%+v", err), +// "errorCauses": [ +// ... +// ], +// } +func encodeError(key string, err error, enc ObjectEncoder) error { + basic := err.Error() + enc.AddString(key, basic) + + switch e := err.(type) { + case errorGroup: + return enc.AddArray(key+"Causes", errArray(e.Errors())) + case fmt.Formatter: + verbose := fmt.Sprintf("%+v", e) + if verbose != basic { + // This is a rich error type, like those produced by + // github.com/pkg/errors. + enc.AddString(key+"Verbose", verbose) + } + } + return nil +} + +type errorGroup interface { + // Provides read-only access to the underlying list of errors, preferably + // without causing any allocs. + Errors() []error +} + +type causer interface { + // Provides access to the error that caused this error. + Cause() error +} + +// Note that errArry and errArrayElem are very similar to the version +// implemented in the top-level error.go file. We can't re-use this because +// that would require exporting errArray as part of the zapcore API. + +// Encodes a list of errors using the standard error encoding logic. +type errArray []error + +func (errs errArray) MarshalLogArray(arr ArrayEncoder) error { + for i := range errs { + if errs[i] == nil { + continue + } + + el := newErrArrayElem(errs[i]) + arr.AppendObject(el) + el.Free() + } + return nil +} + +var _errArrayElemPool = sync.Pool{New: func() interface{} { + return &errArrayElem{} +}} + +// Encodes any error into a {"error": ...} re-using the same errors logic. +// +// May be passed in place of an array to build a single-element array. +type errArrayElem struct{ err error } + +func newErrArrayElem(err error) *errArrayElem { + e := _errArrayElemPool.Get().(*errArrayElem) + e.err = err + return e +} + +func (e *errArrayElem) MarshalLogArray(arr ArrayEncoder) error { + return arr.AppendObject(e) +} + +func (e *errArrayElem) MarshalLogObject(enc ObjectEncoder) error { + return encodeError("error", e.err, enc) +} + +func (e *errArrayElem) Free() { + e.err = nil + _errArrayElemPool.Put(e) +} diff --git a/api/vendor/go.uber.org/zap/zapcore/error_test.go b/api/vendor/go.uber.org/zap/zapcore/error_test.go new file mode 100644 index 0000000..900f520 --- /dev/null +++ b/api/vendor/go.uber.org/zap/zapcore/error_test.go @@ -0,0 +1,177 @@ +// Copyright (c) 2017 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. + +package zapcore_test + +import ( + "errors" + "fmt" + "io" + "testing" + + richErrors "github.com/pkg/errors" + "github.com/stretchr/testify/assert" + + "go.uber.org/multierr" + . "go.uber.org/zap/zapcore" +) + +type errTooManyUsers int + +func (e errTooManyUsers) Error() string { + return fmt.Sprintf("%d too many users", int(e)) +} + +func (e errTooManyUsers) Format(s fmt.State, verb rune) { + // Implement fmt.Formatter, but don't add any information beyond the basic + // Error method. + if verb == 'v' && s.Flag('+') { + io.WriteString(s, e.Error()) + } +} + +type customMultierr struct{} + +func (e customMultierr) Error() string { + return "great sadness" +} + +func (e customMultierr) Errors() []error { + return []error{ + errors.New("foo"), + nil, + multierr.Append( + errors.New("bar"), + errors.New("baz"), + ), + } +} + +func TestErrorEncoding(t *testing.T) { + tests := []struct { + k string + t FieldType // defaults to ErrorType + iface interface{} + want map[string]interface{} + }{ + { + k: "k", + iface: errTooManyUsers(2), + want: map[string]interface{}{ + "k": "2 too many users", + }, + }, + { + k: "err", + iface: multierr.Combine( + errors.New("foo"), + errors.New("bar"), + errors.New("baz"), + ), + want: map[string]interface{}{ + "err": "foo; bar; baz", + "errCauses": []interface{}{ + map[string]interface{}{"error": "foo"}, + map[string]interface{}{"error": "bar"}, + map[string]interface{}{"error": "baz"}, + }, + }, + }, + { + k: "e", + iface: customMultierr{}, + want: map[string]interface{}{ + "e": "great sadness", + "eCauses": []interface{}{ + map[string]interface{}{"error": "foo"}, + map[string]interface{}{ + "error": "bar; baz", + "errorCauses": []interface{}{ + map[string]interface{}{"error": "bar"}, + map[string]interface{}{"error": "baz"}, + }, + }, + }, + }, + }, + { + k: "k", + iface: richErrors.WithMessage(errors.New("egad"), "failed"), + want: map[string]interface{}{ + "k": "failed: egad", + "kVerbose": "egad\nfailed", + }, + }, + { + k: "error", + iface: multierr.Combine( + richErrors.WithMessage( + multierr.Combine(errors.New("foo"), errors.New("bar")), + "hello", + ), + errors.New("baz"), + richErrors.WithMessage(errors.New("qux"), "world"), + ), + want: map[string]interface{}{ + "error": "hello: foo; bar; baz; world: qux", + "errorCauses": []interface{}{ + map[string]interface{}{ + "error": "hello: foo; bar", + "errorVerbose": "the following errors occurred:\n" + + " - foo\n" + + " - bar\n" + + "hello", + }, + map[string]interface{}{"error": "baz"}, + map[string]interface{}{"error": "world: qux", "errorVerbose": "qux\nworld"}, + }, + }, + }, + } + + for _, tt := range tests { + if tt.t == UnknownType { + tt.t = ErrorType + } + + enc := NewMapObjectEncoder() + f := Field{Key: tt.k, Type: tt.t, Interface: tt.iface} + f.AddTo(enc) + assert.Equal(t, tt.want, enc.Fields, "Unexpected output from field %+v.", f) + } +} + +func TestRichErrorSupport(t *testing.T) { + f := Field{ + Type: ErrorType, + Interface: richErrors.WithMessage(richErrors.New("egad"), "failed"), + Key: "k", + } + enc := NewMapObjectEncoder() + f.AddTo(enc) + assert.Equal(t, "failed: egad", enc.Fields["k"], "Unexpected basic error message.") + + serialized := enc.Fields["kVerbose"] + // Don't assert the exact format used by a third-party package, but ensure + // that some critical elements are present. + assert.Regexp(t, `egad`, serialized, "Expected original error message to be present.") + assert.Regexp(t, `failed`, serialized, "Expected error annotation to be present.") + assert.Regexp(t, `TestRichErrorSupport`, serialized, "Expected calling function to be present in stacktrace.") +} diff --git a/api/vendor/go.uber.org/zap/zapcore/field.go b/api/vendor/go.uber.org/zap/zapcore/field.go new file mode 100644 index 0000000..6a5e33e --- /dev/null +++ b/api/vendor/go.uber.org/zap/zapcore/field.go @@ -0,0 +1,201 @@ +// 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 +// 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. + +package zapcore + +import ( + "bytes" + "fmt" + "math" + "reflect" + "time" +) + +// A FieldType indicates which member of the Field union struct should be used +// and how it should be serialized. +type FieldType uint8 + +const ( + // UnknownType is the default field type. Attempting to add it to an encoder will panic. + UnknownType FieldType = iota + // ArrayMarshalerType indicates that the field carries an ArrayMarshaler. + ArrayMarshalerType + // ObjectMarshalerType indicates that the field carries an ObjectMarshaler. + ObjectMarshalerType + // BinaryType indicates that the field carries an opaque binary blob. + BinaryType + // BoolType indicates that the field carries a bool. + BoolType + // ByteStringType indicates that the field carries UTF-8 encoded bytes. + ByteStringType + // Complex128Type indicates that the field carries a complex128. + Complex128Type + // Complex64Type indicates that the field carries a complex128. + Complex64Type + // DurationType indicates that the field carries a time.Duration. + DurationType + // Float64Type indicates that the field carries a float64. + Float64Type + // Float32Type indicates that the field carries a float32. + Float32Type + // Int64Type indicates that the field carries an int64. + Int64Type + // Int32Type indicates that the field carries an int32. + Int32Type + // Int16Type indicates that the field carries an int16. + Int16Type + // Int8Type indicates that the field carries an int8. + Int8Type + // StringType indicates that the field carries a string. + StringType + // TimeType indicates that the field carries a time.Time. + TimeType + // Uint64Type indicates that the field carries a uint64. + Uint64Type + // Uint32Type indicates that the field carries a uint32. + Uint32Type + // Uint16Type indicates that the field carries a uint16. + Uint16Type + // Uint8Type indicates that the field carries a uint8. + Uint8Type + // UintptrType indicates that the field carries a uintptr. + UintptrType + // ReflectType indicates that the field carries an interface{}, which should + // be serialized using reflection. + ReflectType + // NamespaceType signals the beginning of an isolated namespace. All + // subsequent fields should be added to the new namespace. + NamespaceType + // StringerType indicates that the field carries a fmt.Stringer. + StringerType + // ErrorType indicates that the field carries an error. + ErrorType + // SkipType indicates that the field is a no-op. + SkipType +) + +// A Field is a marshaling operation used to add a key-value pair to a logger's +// context. Most fields are lazily marshaled, so it's inexpensive to add fields +// to disabled debug-level log statements. +type Field struct { + Key string + Type FieldType + Integer int64 + String string + Interface interface{} +} + +// AddTo exports a field through the ObjectEncoder interface. It's primarily +// useful to library authors, and shouldn't be necessary in most applications. +func (f Field) AddTo(enc ObjectEncoder) { + var err error + + switch f.Type { + case ArrayMarshalerType: + err = enc.AddArray(f.Key, f.Interface.(ArrayMarshaler)) + case ObjectMarshalerType: + err = enc.AddObject(f.Key, f.Interface.(ObjectMarshaler)) + case BinaryType: + enc.AddBinary(f.Key, f.Interface.([]byte)) + case BoolType: + enc.AddBool(f.Key, f.Integer == 1) + case ByteStringType: + enc.AddByteString(f.Key, f.Interface.([]byte)) + case Complex128Type: + enc.AddComplex128(f.Key, f.Interface.(complex128)) + case Complex64Type: + enc.AddComplex64(f.Key, f.Interface.(complex64)) + case DurationType: + enc.AddDuration(f.Key, time.Duration(f.Integer)) + case Float64Type: + enc.AddFloat64(f.Key, math.Float64frombits(uint64(f.Integer))) + case Float32Type: + enc.AddFloat32(f.Key, math.Float32frombits(uint32(f.Integer))) + case Int64Type: + enc.AddInt64(f.Key, f.Integer) + case Int32Type: + enc.AddInt32(f.Key, int32(f.Integer)) + case Int16Type: + enc.AddInt16(f.Key, int16(f.Integer)) + case Int8Type: + enc.AddInt8(f.Key, int8(f.Integer)) + case StringType: + enc.AddString(f.Key, f.String) + case TimeType: + if f.Interface != nil { + enc.AddTime(f.Key, time.Unix(0, f.Integer).In(f.Interface.(*time.Location))) + } else { + // Fall back to UTC if location is nil. + enc.AddTime(f.Key, time.Unix(0, f.Integer)) + } + case Uint64Type: + enc.AddUint64(f.Key, uint64(f.Integer)) + case Uint32Type: + enc.AddUint32(f.Key, uint32(f.Integer)) + case Uint16Type: + enc.AddUint16(f.Key, uint16(f.Integer)) + case Uint8Type: + enc.AddUint8(f.Key, uint8(f.Integer)) + case UintptrType: + enc.AddUintptr(f.Key, uintptr(f.Integer)) + case ReflectType: + err = enc.AddReflected(f.Key, f.Interface) + case NamespaceType: + enc.OpenNamespace(f.Key) + case StringerType: + enc.AddString(f.Key, f.Interface.(fmt.Stringer).String()) + case ErrorType: + encodeError(f.Key, f.Interface.(error), enc) + case SkipType: + break + default: + panic(fmt.Sprintf("unknown field type: %v", f)) + } + + if err != nil { + enc.AddString(fmt.Sprintf("%sError", f.Key), err.Error()) + } +} + +// Equals returns whether two fields are equal. For non-primitive types such as +// errors, marshalers, or reflect types, it uses reflect.DeepEqual. +func (f Field) Equals(other Field) bool { + if f.Type != other.Type { + return false + } + if f.Key != other.Key { + return false + } + + switch f.Type { + case BinaryType, ByteStringType: + return bytes.Equal(f.Interface.([]byte), other.Interface.([]byte)) + case ArrayMarshalerType, ObjectMarshalerType, ErrorType, ReflectType: + return reflect.DeepEqual(f.Interface, other.Interface) + default: + return f == other + } +} + +func addFields(enc ObjectEncoder, fields []Field) { + for i := range fields { + fields[i].AddTo(enc) + } +} diff --git a/api/vendor/go.uber.org/zap/zapcore/field_test.go b/api/vendor/go.uber.org/zap/zapcore/field_test.go new file mode 100644 index 0000000..fb722b4 --- /dev/null +++ b/api/vendor/go.uber.org/zap/zapcore/field_test.go @@ -0,0 +1,231 @@ +// 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 +// 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. + +package zapcore_test + +import ( + "errors" + "fmt" + "math" + "testing" + "time" + + "go.uber.org/zap" + + "github.com/stretchr/testify/assert" + + . "go.uber.org/zap/zapcore" +) + +type users int + +func (u users) String() string { + return fmt.Sprintf("%d users", int(u)) +} + +func (u users) MarshalLogObject(enc ObjectEncoder) error { + if int(u) < 0 { + return errors.New("too few users") + } + enc.AddInt("users", int(u)) + return nil +} + +func (u users) MarshalLogArray(enc ArrayEncoder) error { + if int(u) < 0 { + return errors.New("too few users") + } + for i := 0; i < int(u); i++ { + enc.AppendString("user") + } + return nil +} + +func TestUnknownFieldType(t *testing.T) { + unknown := Field{Key: "k", String: "foo"} + assert.Equal(t, UnknownType, unknown.Type, "Expected zero value of FieldType to be UnknownType.") + assert.Panics(t, func() { + unknown.AddTo(NewMapObjectEncoder()) + }, "Expected using a field with unknown type to panic.") +} + +func TestFieldAddingError(t *testing.T) { + tests := []struct { + t FieldType + want interface{} + }{ + {ArrayMarshalerType, []interface{}(nil)}, + {ObjectMarshalerType, map[string]interface{}{}}, + } + for _, tt := range tests { + f := Field{Key: "k", Interface: users(-1), Type: tt.t} + enc := NewMapObjectEncoder() + assert.NotPanics(t, func() { f.AddTo(enc) }, "Unexpected panic when adding fields returns an error.") + assert.Equal(t, tt.want, enc.Fields["k"], "On error, expected zero value in field.Key.") + assert.Equal(t, "too few users", enc.Fields["kError"], "Expected error message in log context.") + } +} + +func TestFields(t *testing.T) { + tests := []struct { + t FieldType + i int64 + s string + iface interface{} + want interface{} + }{ + {t: ArrayMarshalerType, iface: users(2), want: []interface{}{"user", "user"}}, + {t: ObjectMarshalerType, iface: users(2), want: map[string]interface{}{"users": 2}}, + {t: BinaryType, iface: []byte("foo"), want: []byte("foo")}, + {t: BoolType, i: 0, want: false}, + {t: ByteStringType, iface: []byte("foo"), want: "foo"}, + {t: Complex128Type, iface: 1 + 2i, want: 1 + 2i}, + {t: Complex64Type, iface: complex64(1 + 2i), want: complex64(1 + 2i)}, + {t: DurationType, i: 1000, want: time.Microsecond}, + {t: Float64Type, i: int64(math.Float64bits(3.14)), want: 3.14}, + {t: Float32Type, i: int64(math.Float32bits(3.14)), want: float32(3.14)}, + {t: Int64Type, i: 42, want: int64(42)}, + {t: Int32Type, i: 42, want: int32(42)}, + {t: Int16Type, i: 42, want: int16(42)}, + {t: Int8Type, i: 42, want: int8(42)}, + {t: StringType, s: "foo", want: "foo"}, + {t: TimeType, i: 1000, iface: time.UTC, want: time.Unix(0, 1000).In(time.UTC)}, + {t: TimeType, i: 1000, want: time.Unix(0, 1000)}, + {t: Uint64Type, i: 42, want: uint64(42)}, + {t: Uint32Type, i: 42, want: uint32(42)}, + {t: Uint16Type, i: 42, want: uint16(42)}, + {t: Uint8Type, i: 42, want: uint8(42)}, + {t: UintptrType, i: 42, want: uintptr(42)}, + {t: ReflectType, iface: users(2), want: users(2)}, + {t: NamespaceType, want: map[string]interface{}{}}, + {t: StringerType, iface: users(2), want: "2 users"}, + {t: SkipType, want: interface{}(nil)}, + } + + for _, tt := range tests { + enc := NewMapObjectEncoder() + f := Field{Key: "k", Type: tt.t, Integer: tt.i, Interface: tt.iface, String: tt.s} + f.AddTo(enc) + assert.Equal(t, tt.want, enc.Fields["k"], "Unexpected output from field %+v.", f) + + delete(enc.Fields, "k") + assert.Equal(t, 0, len(enc.Fields), "Unexpected extra fields present.") + + assert.True(t, f.Equals(f), "Field does not equal itself") + } +} + +func TestEquals(t *testing.T) { + tests := []struct { + a, b Field + want bool + }{ + { + a: zap.Int16("a", 1), + b: zap.Int32("a", 1), + want: false, + }, + { + a: zap.String("k", "a"), + b: zap.String("k", "a"), + want: true, + }, + { + a: zap.String("k", "a"), + b: zap.String("k2", "a"), + want: false, + }, + { + a: zap.String("k", "a"), + b: zap.String("k", "b"), + want: false, + }, + { + a: zap.Time("k", time.Unix(1000, 1000)), + b: zap.Time("k", time.Unix(1000, 1000)), + want: true, + }, + { + a: zap.Time("k", time.Unix(1000, 1000).In(time.UTC)), + b: zap.Time("k", time.Unix(1000, 1000).In(time.FixedZone("TEST", -8))), + want: false, + }, + { + a: zap.Time("k", time.Unix(1000, 1000)), + b: zap.Time("k", time.Unix(1000, 2000)), + want: false, + }, + { + a: zap.Binary("k", []byte{1, 2}), + b: zap.Binary("k", []byte{1, 2}), + want: true, + }, + { + a: zap.Binary("k", []byte{1, 2}), + b: zap.Binary("k", []byte{1, 3}), + want: false, + }, + { + a: zap.ByteString("k", []byte("abc")), + b: zap.ByteString("k", []byte("abc")), + want: true, + }, + { + a: zap.ByteString("k", []byte("abc")), + b: zap.ByteString("k", []byte("abd")), + want: false, + }, + { + a: zap.Ints("k", []int{1, 2}), + b: zap.Ints("k", []int{1, 2}), + want: true, + }, + { + a: zap.Ints("k", []int{1, 2}), + b: zap.Ints("k", []int{1, 3}), + want: false, + }, + { + a: zap.Object("k", users(10)), + b: zap.Object("k", users(10)), + want: true, + }, + { + a: zap.Object("k", users(10)), + b: zap.Object("k", users(20)), + want: false, + }, + { + a: zap.Any("k", map[string]string{"a": "b"}), + b: zap.Any("k", map[string]string{"a": "b"}), + want: true, + }, + { + a: zap.Any("k", map[string]string{"a": "b"}), + b: zap.Any("k", map[string]string{"a": "d"}), + want: false, + }, + } + + for _, tt := range tests { + assert.Equal(t, tt.want, tt.a.Equals(tt.b), "a.Equals(b) a: %#v b: %#v", tt.a, tt.b) + assert.Equal(t, tt.want, tt.b.Equals(tt.a), "b.Equals(a) a: %#v b: %#v", tt.a, tt.b) + } +} diff --git a/api/vendor/go.uber.org/zap/zapcore/hook.go b/api/vendor/go.uber.org/zap/zapcore/hook.go new file mode 100644 index 0000000..5db4afb --- /dev/null +++ b/api/vendor/go.uber.org/zap/zapcore/hook.go @@ -0,0 +1,68 @@ +// 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 +// 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. + +package zapcore + +import "go.uber.org/multierr" + +type hooked struct { + Core + funcs []func(Entry) error +} + +// RegisterHooks wraps a Core and runs a collection of user-defined callback +// hooks each time a message is logged. Execution of the callbacks is blocking. +// +// This offers users an easy way to register simple callbacks (e.g., metrics +// collection) without implementing the full Core interface. +func RegisterHooks(core Core, hooks ...func(Entry) error) Core { + funcs := append([]func(Entry) error{}, hooks...) + return &hooked{ + Core: core, + funcs: funcs, + } +} + +func (h *hooked) Check(ent Entry, ce *CheckedEntry) *CheckedEntry { + // Let the wrapped Core decide whether to log this message or not. This + // also gives the downstream a chance to register itself directly with the + // CheckedEntry. + if downstream := h.Core.Check(ent, ce); downstream != nil { + return downstream.AddCore(ent, h) + } + return ce +} + +func (h *hooked) With(fields []Field) Core { + return &hooked{ + Core: h.Core.With(fields), + funcs: h.funcs, + } +} + +func (h *hooked) Write(ent Entry, _ []Field) error { + // Since our downstream had a chance to register itself directly with the + // CheckedMessage, we don't need to call it here. + var err error + for i := range h.funcs { + err = multierr.Append(err, h.funcs[i](ent)) + } + return err +} diff --git a/api/vendor/go.uber.org/zap/zapcore/hook_test.go b/api/vendor/go.uber.org/zap/zapcore/hook_test.go new file mode 100644 index 0000000..0764888 --- /dev/null +++ b/api/vendor/go.uber.org/zap/zapcore/hook_test.go @@ -0,0 +1,73 @@ +// 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 +// 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. + +package zapcore_test + +import ( + "testing" + + . "go.uber.org/zap/zapcore" + "go.uber.org/zap/zaptest/observer" + + "github.com/stretchr/testify/assert" +) + +func TestHooks(t *testing.T) { + tests := []struct { + entryLevel Level + coreLevel Level + expectCall bool + }{ + {DebugLevel, InfoLevel, false}, + {InfoLevel, InfoLevel, true}, + {WarnLevel, InfoLevel, true}, + } + + for _, tt := range tests { + fac, logs := observer.New(tt.coreLevel) + intField := makeInt64Field("foo", 42) + ent := Entry{Message: "bar", Level: tt.entryLevel} + + var called int + f := func(e Entry) error { + called++ + assert.Equal(t, ent, e, "Hook called with unexpected Entry.") + return nil + } + + h := RegisterHooks(fac, f) + if ce := h.With([]Field{intField}).Check(ent, nil); ce != nil { + ce.Write() + } + + if tt.expectCall { + assert.Equal(t, 1, called, "Expected to call hook once.") + assert.Equal( + t, + []observer.LoggedEntry{{Entry: ent, Context: []Field{intField}}}, + logs.AllUntimed(), + "Unexpected logs written out.", + ) + } else { + assert.Equal(t, 0, called, "Didn't expect to call hook.") + assert.Equal(t, 0, logs.Len(), "Unexpected logs written out.") + } + } +} diff --git a/api/vendor/go.uber.org/zap/zapcore/json_encoder.go b/api/vendor/go.uber.org/zap/zapcore/json_encoder.go new file mode 100644 index 0000000..1006ba2 --- /dev/null +++ b/api/vendor/go.uber.org/zap/zapcore/json_encoder.go @@ -0,0 +1,480 @@ +// 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 +// 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. + +package zapcore + +import ( + "encoding/base64" + "encoding/json" + "math" + "sync" + "time" + "unicode/utf8" + + "go.uber.org/zap/buffer" + "go.uber.org/zap/internal/bufferpool" +) + +// For JSON-escaping; see jsonEncoder.safeAddString below. +const _hex = "0123456789abcdef" + +var _jsonPool = sync.Pool{New: func() interface{} { + return &jsonEncoder{} +}} + +func getJSONEncoder() *jsonEncoder { + return _jsonPool.Get().(*jsonEncoder) +} + +func putJSONEncoder(enc *jsonEncoder) { + enc.EncoderConfig = nil + enc.buf = nil + enc.spaced = false + enc.openNamespaces = 0 + _jsonPool.Put(enc) +} + +type jsonEncoder struct { + *EncoderConfig + buf *buffer.Buffer + spaced bool // include spaces after colons and commas + openNamespaces int +} + +// NewJSONEncoder creates a fast, low-allocation JSON encoder. The encoder +// appropriately escapes all field keys and values. +// +// Note that the encoder doesn't deduplicate keys, so it's possible to produce +// a message like +// {"foo":"bar","foo":"baz"} +// This is permitted by the JSON specification, but not encouraged. Many +// libraries will ignore duplicate key-value pairs (typically keeping the last +// pair) when unmarshaling, but users should attempt to avoid adding duplicate +// keys. +func NewJSONEncoder(cfg EncoderConfig) Encoder { + return newJSONEncoder(cfg, false) +} + +func newJSONEncoder(cfg EncoderConfig, spaced bool) *jsonEncoder { + return &jsonEncoder{ + EncoderConfig: &cfg, + buf: bufferpool.Get(), + spaced: spaced, + } +} + +func (enc *jsonEncoder) AddArray(key string, arr ArrayMarshaler) error { + enc.addKey(key) + return enc.AppendArray(arr) +} + +func (enc *jsonEncoder) AddObject(key string, obj ObjectMarshaler) error { + enc.addKey(key) + return enc.AppendObject(obj) +} + +func (enc *jsonEncoder) AddBinary(key string, val []byte) { + enc.AddString(key, base64.StdEncoding.EncodeToString(val)) +} + +func (enc *jsonEncoder) AddByteString(key string, val []byte) { + enc.addKey(key) + enc.AppendByteString(val) +} + +func (enc *jsonEncoder) AddBool(key string, val bool) { + enc.addKey(key) + enc.AppendBool(val) +} + +func (enc *jsonEncoder) AddComplex128(key string, val complex128) { + enc.addKey(key) + enc.AppendComplex128(val) +} + +func (enc *jsonEncoder) AddDuration(key string, val time.Duration) { + enc.addKey(key) + enc.AppendDuration(val) +} + +func (enc *jsonEncoder) AddFloat64(key string, val float64) { + enc.addKey(key) + enc.AppendFloat64(val) +} + +func (enc *jsonEncoder) AddInt64(key string, val int64) { + enc.addKey(key) + enc.AppendInt64(val) +} + +func (enc *jsonEncoder) AddReflected(key string, obj interface{}) error { + marshaled, err := json.Marshal(obj) + if err != nil { + return err + } + enc.addKey(key) + _, err = enc.buf.Write(marshaled) + return err +} + +func (enc *jsonEncoder) OpenNamespace(key string) { + enc.addKey(key) + enc.buf.AppendByte('{') + enc.openNamespaces++ +} + +func (enc *jsonEncoder) AddString(key, val string) { + enc.addKey(key) + enc.AppendString(val) +} + +func (enc *jsonEncoder) AddTime(key string, val time.Time) { + enc.addKey(key) + enc.AppendTime(val) +} + +func (enc *jsonEncoder) AddUint64(key string, val uint64) { + enc.addKey(key) + enc.AppendUint64(val) +} + +func (enc *jsonEncoder) AppendArray(arr ArrayMarshaler) error { + enc.addElementSeparator() + enc.buf.AppendByte('[') + err := arr.MarshalLogArray(enc) + enc.buf.AppendByte(']') + return err +} + +func (enc *jsonEncoder) AppendObject(obj ObjectMarshaler) error { + enc.addElementSeparator() + enc.buf.AppendByte('{') + err := obj.MarshalLogObject(enc) + enc.buf.AppendByte('}') + return err +} + +func (enc *jsonEncoder) AppendBool(val bool) { + enc.addElementSeparator() + enc.buf.AppendBool(val) +} + +func (enc *jsonEncoder) AppendByteString(val []byte) { + enc.addElementSeparator() + enc.buf.AppendByte('"') + enc.safeAddByteString(val) + enc.buf.AppendByte('"') +} + +func (enc *jsonEncoder) AppendComplex128(val complex128) { + 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.AppendByte('+') + enc.buf.AppendFloat(i, 64) + enc.buf.AppendByte('i') + enc.buf.AppendByte('"') +} + +func (enc *jsonEncoder) AppendDuration(val time.Duration) { + cur := enc.buf.Len() + enc.EncodeDuration(val, enc) + if cur == enc.buf.Len() { + // User-supplied EncodeDuration is a no-op. Fall back to nanoseconds to keep + // JSON valid. + enc.AppendInt64(int64(val)) + } +} + +func (enc *jsonEncoder) AppendInt64(val int64) { + enc.addElementSeparator() + enc.buf.AppendInt(val) +} + +func (enc *jsonEncoder) AppendReflected(val interface{}) error { + marshaled, err := json.Marshal(val) + if err != nil { + return err + } + enc.addElementSeparator() + _, err = enc.buf.Write(marshaled) + return err +} + +func (enc *jsonEncoder) AppendString(val string) { + enc.addElementSeparator() + enc.buf.AppendByte('"') + enc.safeAddString(val) + enc.buf.AppendByte('"') +} + +func (enc *jsonEncoder) AppendTime(val time.Time) { + cur := enc.buf.Len() + enc.EncodeTime(val, enc) + if cur == enc.buf.Len() { + // User-supplied EncodeTime is a no-op. Fall back to nanos since epoch to keep + // output JSON valid. + enc.AppendInt64(val.UnixNano()) + } +} + +func (enc *jsonEncoder) AppendUint64(val uint64) { + enc.addElementSeparator() + enc.buf.AppendUint(val) +} + +func (enc *jsonEncoder) AddComplex64(k string, v complex64) { enc.AddComplex128(k, complex128(v)) } +func (enc *jsonEncoder) AddFloat32(k string, v float32) { enc.AddFloat64(k, float64(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) Clone() Encoder { + clone := enc.clone() + clone.buf.Write(enc.buf.Bytes()) + return clone +} + +func (enc *jsonEncoder) clone() *jsonEncoder { + clone := getJSONEncoder() + clone.EncoderConfig = enc.EncoderConfig + clone.spaced = enc.spaced + clone.openNamespaces = enc.openNamespaces + clone.buf = bufferpool.Get() + return clone +} + +func (enc *jsonEncoder) EncodeEntry(ent Entry, fields []Field) (*buffer.Buffer, error) { + final := enc.clone() + final.buf.AppendByte('{') + + if final.LevelKey != "" { + final.addKey(final.LevelKey) + cur := final.buf.Len() + final.EncodeLevel(ent.Level, final) + if cur == final.buf.Len() { + // User-supplied EncodeLevel was a no-op. Fall back to strings to keep + // output JSON valid. + final.AppendString(ent.Level.String()) + } + } + if final.TimeKey != "" { + final.AddTime(final.TimeKey, ent.Time) + } + if ent.LoggerName != "" && final.NameKey != "" { + final.addKey(final.NameKey) + cur := final.buf.Len() + nameEncoder := final.EncodeName + + // if no name encoder provided, fall back to FullNameEncoder for backwards + // compatibility + if nameEncoder == nil { + nameEncoder = FullNameEncoder + } + + nameEncoder(ent.LoggerName, final) + if cur == final.buf.Len() { + // User-supplied EncodeName was a no-op. Fall back to strings to + // keep output JSON valid. + final.AppendString(ent.LoggerName) + } + } + if ent.Caller.Defined && final.CallerKey != "" { + final.addKey(final.CallerKey) + cur := final.buf.Len() + final.EncodeCaller(ent.Caller, final) + if cur == final.buf.Len() { + // User-supplied EncodeCaller was a no-op. Fall back to strings to + // keep output JSON valid. + final.AppendString(ent.Caller.String()) + } + } + if final.MessageKey != "" { + final.addKey(enc.MessageKey) + final.AppendString(ent.Message) + } + if enc.buf.Len() > 0 { + final.addElementSeparator() + final.buf.Write(enc.buf.Bytes()) + } + addFields(final, fields) + final.closeOpenNamespaces() + if ent.Stack != "" && final.StacktraceKey != "" { + final.AddString(final.StacktraceKey, ent.Stack) + } + final.buf.AppendByte('}') + if final.LineEnding != "" { + final.buf.AppendString(final.LineEnding) + } else { + final.buf.AppendString(DefaultLineEnding) + } + + ret := final.buf + putJSONEncoder(final) + return ret, nil +} + +func (enc *jsonEncoder) truncate() { + enc.buf.Reset() +} + +func (enc *jsonEncoder) closeOpenNamespaces() { + for i := 0; i < enc.openNamespaces; i++ { + enc.buf.AppendByte('}') + } +} + +func (enc *jsonEncoder) addKey(key string) { + enc.addElementSeparator() + enc.buf.AppendByte('"') + enc.safeAddString(key) + enc.buf.AppendByte('"') + enc.buf.AppendByte(':') + if enc.spaced { + enc.buf.AppendByte(' ') + } +} + +func (enc *jsonEncoder) addElementSeparator() { + last := enc.buf.Len() - 1 + if last < 0 { + return + } + switch enc.buf.Bytes()[last] { + case '{', '[', ':', ',', ' ': + return + default: + enc.buf.AppendByte(',') + if enc.spaced { + enc.buf.AppendByte(' ') + } + } +} + +func (enc *jsonEncoder) appendFloat(val float64, bitSize int) { + enc.addElementSeparator() + switch { + case math.IsNaN(val): + enc.buf.AppendString(`"NaN"`) + case math.IsInf(val, 1): + enc.buf.AppendString(`"+Inf"`) + case math.IsInf(val, -1): + enc.buf.AppendString(`"-Inf"`) + default: + enc.buf.AppendFloat(val, bitSize) + } +} + +// safeAddString JSON-escapes a string and appends it to the internal buffer. +// Unlike the standard library's encoder, it doesn't attempt to protect the +// user from browser vulnerabilities or JSONP-related problems. +func (enc *jsonEncoder) safeAddString(s string) { + for i := 0; i < len(s); { + if enc.tryAddRuneSelf(s[i]) { + i++ + continue + } + r, size := utf8.DecodeRuneInString(s[i:]) + if enc.tryAddRuneError(r, size) { + i++ + continue + } + enc.buf.AppendString(s[i : i+size]) + i += size + } +} + +// safeAddByteString is no-alloc equivalent of safeAddString(string(s)) for s []byte. +func (enc *jsonEncoder) safeAddByteString(s []byte) { + for i := 0; i < len(s); { + if enc.tryAddRuneSelf(s[i]) { + i++ + continue + } + r, size := utf8.DecodeRune(s[i:]) + if enc.tryAddRuneError(r, size) { + i++ + continue + } + enc.buf.Write(s[i : i+size]) + i += size + } +} + +// tryAddRuneSelf appends b if it is valid UTF-8 character represented in a single byte. +func (enc *jsonEncoder) tryAddRuneSelf(b byte) bool { + if b >= utf8.RuneSelf { + return false + } + if 0x20 <= b && b != '\\' && b != '"' { + enc.buf.AppendByte(b) + return true + } + switch b { + case '\\', '"': + enc.buf.AppendByte('\\') + enc.buf.AppendByte(b) + case '\n': + enc.buf.AppendByte('\\') + enc.buf.AppendByte('n') + case '\r': + enc.buf.AppendByte('\\') + enc.buf.AppendByte('r') + case '\t': + enc.buf.AppendByte('\\') + enc.buf.AppendByte('t') + default: + // Encode bytes < 0x20, except for the escape sequences above. + enc.buf.AppendString(`\u00`) + enc.buf.AppendByte(_hex[b>>4]) + enc.buf.AppendByte(_hex[b&0xF]) + } + return true +} + +func (enc *jsonEncoder) tryAddRuneError(r rune, size int) bool { + if r == utf8.RuneError && size == 1 { + enc.buf.AppendString(`\ufffd`) + return true + } + return false +} diff --git a/api/vendor/go.uber.org/zap/zapcore/json_encoder_bench_test.go b/api/vendor/go.uber.org/zap/zapcore/json_encoder_bench_test.go new file mode 100644 index 0000000..4bd5033 --- /dev/null +++ b/api/vendor/go.uber.org/zap/zapcore/json_encoder_bench_test.go @@ -0,0 +1,91 @@ +// 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 +// 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. + +package zapcore_test + +import ( + "encoding/json" + "testing" + "time" + + . "go.uber.org/zap/zapcore" +) + +func BenchmarkJSONLogMarshalerFunc(b *testing.B) { + for i := 0; i < b.N; i++ { + enc := NewJSONEncoder(testEncoderConfig()) + enc.AddObject("nested", ObjectMarshalerFunc(func(enc ObjectEncoder) error { + enc.AddInt64("i", int64(i)) + return nil + })) + } +} + +func BenchmarkZapJSON(b *testing.B) { + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + enc := NewJSONEncoder(testEncoderConfig()) + enc.AddString("str", "foo") + enc.AddInt64("int64-1", 1) + enc.AddInt64("int64-2", 2) + enc.AddFloat64("float64", 1.0) + enc.AddString("string1", "\n") + enc.AddString("string2", "💩") + enc.AddString("string3", "🤔") + enc.AddString("string4", "🙊") + enc.AddBool("bool", true) + buf, _ := enc.EncodeEntry(Entry{ + Message: "fake", + Level: DebugLevel, + }, nil) + buf.Free() + } + }) +} + +func BenchmarkStandardJSON(b *testing.B) { + record := struct { + Level string `json:"level"` + Message string `json:"msg"` + Time time.Time `json:"ts"` + Fields map[string]interface{} `json:"fields"` + }{ + Level: "debug", + Message: "fake", + Time: time.Unix(0, 0), + Fields: map[string]interface{}{ + "str": "foo", + "int64-1": int64(1), + "int64-2": int64(1), + "float64": float64(1.0), + "string1": "\n", + "string2": "💩", + "string3": "🤔", + "string4": "🙊", + "bool": true, + }, + } + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + json.Marshal(record) + } + }) +} diff --git a/api/vendor/go.uber.org/zap/zapcore/json_encoder_impl_test.go b/api/vendor/go.uber.org/zap/zapcore/json_encoder_impl_test.go new file mode 100644 index 0000000..563d5f6 --- /dev/null +++ b/api/vendor/go.uber.org/zap/zapcore/json_encoder_impl_test.go @@ -0,0 +1,479 @@ +// 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 +// 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. + +package zapcore + +import ( + "encoding/json" + "errors" + "math" + "math/rand" + "reflect" + "testing" + "testing/quick" + "time" + + "go.uber.org/zap/internal/bufferpool" + + "github.com/stretchr/testify/assert" + "go.uber.org/multierr" +) + +func TestJSONClone(t *testing.T) { + // The parent encoder is created with plenty of excess capacity. + parent := &jsonEncoder{buf: bufferpool.Get()} + clone := parent.Clone() + + // Adding to the parent shouldn't affect the clone, and vice versa. + parent.AddString("foo", "bar") + clone.AddString("baz", "bing") + + assertJSON(t, `"foo":"bar"`, parent) + assertJSON(t, `"baz":"bing"`, clone.(*jsonEncoder)) +} + +func TestJSONEscaping(t *testing.T) { + enc := &jsonEncoder{buf: bufferpool.Get()} + // Test all the edge cases of JSON escaping directly. + cases := map[string]string{ + // ASCII. + `foo`: `foo`, + // Special-cased characters. + `"`: `\"`, + `\`: `\\`, + // Special-cased characters within everyday ASCII. + `foo"foo`: `foo\"foo`, + "foo\n": `foo\n`, + // Special-cased control characters. + "\n": `\n`, + "\r": `\r`, + "\t": `\t`, + // \b and \f are sometimes backslash-escaped, but this representation is also + // conformant. + "\b": `\u0008`, + "\f": `\u000c`, + // The standard lib special-cases angle brackets and ampersands by default, + // because it wants to protect users from browser exploits. In a logging + // context, we shouldn't special-case these characters. + "<": "<", + ">": ">", + "&": "&", + // ASCII bell - not special-cased. + string(byte(0x07)): `\u0007`, + // Astral-plane unicode. + `☃`: `☃`, + // Decodes to (RuneError, 1) + "\xed\xa0\x80": `\ufffd\ufffd\ufffd`, + "foo\xed\xa0\x80": `foo\ufffd\ufffd\ufffd`, + } + + t.Run("String", func(t *testing.T) { + for input, output := range cases { + enc.truncate() + enc.safeAddString(input) + assertJSON(t, output, enc) + } + }) + + t.Run("ByteString", func(t *testing.T) { + for input, output := range cases { + enc.truncate() + enc.safeAddByteString([]byte(input)) + assertJSON(t, output, enc) + } + }) +} + +func TestJSONEncoderObjectFields(t *testing.T) { + tests := []struct { + desc string + expected string + f func(Encoder) + }{ + {"binary", `"k":"YWIxMg=="`, func(e Encoder) { e.AddBinary("k", []byte("ab12")) }}, + {"bool", `"k\\":true`, func(e Encoder) { e.AddBool(`k\`, true) }}, // test key escaping once + {"bool", `"k":true`, func(e Encoder) { e.AddBool("k", true) }}, + {"bool", `"k":false`, func(e Encoder) { e.AddBool("k", false) }}, + {"byteString", `"k":"v\\"`, func(e Encoder) { e.AddByteString(`k`, []byte(`v\`)) }}, + {"byteString", `"k":"v"`, func(e Encoder) { e.AddByteString("k", []byte("v")) }}, + {"byteString", `"k":""`, func(e Encoder) { e.AddByteString("k", []byte{}) }}, + {"byteString", `"k":""`, func(e Encoder) { e.AddByteString("k", nil) }}, + {"complex128", `"k":"1+2i"`, func(e Encoder) { e.AddComplex128("k", 1+2i) }}, + {"complex64", `"k":"1+2i"`, func(e Encoder) { e.AddComplex64("k", 1+2i) }}, + {"duration", `"k":0.000000001`, func(e Encoder) { e.AddDuration("k", 1) }}, + {"float64", `"k":1`, func(e Encoder) { e.AddFloat64("k", 1.0) }}, + {"float64", `"k":10000000000`, func(e Encoder) { e.AddFloat64("k", 1e10) }}, + {"float64", `"k":"NaN"`, func(e Encoder) { e.AddFloat64("k", math.NaN()) }}, + {"float64", `"k":"+Inf"`, func(e Encoder) { e.AddFloat64("k", math.Inf(1)) }}, + {"float64", `"k":"-Inf"`, func(e Encoder) { e.AddFloat64("k", math.Inf(-1)) }}, + {"float32", `"k":1`, func(e Encoder) { e.AddFloat32("k", 1.0) }}, + {"float32", `"k":10000000000`, func(e Encoder) { e.AddFloat32("k", 1e10) }}, + {"float32", `"k":"NaN"`, func(e Encoder) { e.AddFloat32("k", float32(math.NaN())) }}, + {"float32", `"k":"+Inf"`, func(e Encoder) { e.AddFloat32("k", float32(math.Inf(1))) }}, + {"float32", `"k":"-Inf"`, func(e Encoder) { e.AddFloat32("k", float32(math.Inf(-1))) }}, + {"int", `"k":42`, func(e Encoder) { e.AddInt("k", 42) }}, + {"int64", `"k":42`, func(e Encoder) { e.AddInt64("k", 42) }}, + {"int32", `"k":42`, func(e Encoder) { e.AddInt32("k", 42) }}, + {"int16", `"k":42`, func(e Encoder) { e.AddInt16("k", 42) }}, + {"int8", `"k":42`, func(e Encoder) { e.AddInt8("k", 42) }}, + {"string", `"k":"v\\"`, func(e Encoder) { e.AddString(`k`, `v\`) }}, + {"string", `"k":"v"`, func(e Encoder) { e.AddString("k", "v") }}, + {"string", `"k":""`, func(e Encoder) { e.AddString("k", "") }}, + {"time", `"k":1`, func(e Encoder) { e.AddTime("k", time.Unix(1, 0)) }}, + {"uint", `"k":42`, func(e Encoder) { e.AddUint("k", 42) }}, + {"uint64", `"k":42`, func(e Encoder) { e.AddUint64("k", 42) }}, + {"uint32", `"k":42`, func(e Encoder) { e.AddUint32("k", 42) }}, + {"uint16", `"k":42`, func(e Encoder) { e.AddUint16("k", 42) }}, + {"uint8", `"k":42`, func(e Encoder) { e.AddUint8("k", 42) }}, + {"uintptr", `"k":42`, func(e Encoder) { e.AddUintptr("k", 42) }}, + { + desc: "object (success)", + expected: `"k":{"loggable":"yes"}`, + f: func(e Encoder) { + assert.NoError(t, e.AddObject("k", loggable{true}), "Unexpected error calling MarshalLogObject.") + }, + }, + { + desc: "object (error)", + expected: `"k":{}`, + f: func(e Encoder) { + assert.Error(t, e.AddObject("k", loggable{false}), "Expected an error calling MarshalLogObject.") + }, + }, + { + desc: "object (with nested array)", + expected: `"turducken":{"ducks":[{"in":"chicken"},{"in":"chicken"}]}`, + f: func(e Encoder) { + assert.NoError( + t, + e.AddObject("turducken", turducken{}), + "Unexpected error calling MarshalLogObject with nested ObjectMarshalers and ArrayMarshalers.", + ) + }, + }, + { + desc: "array (with nested object)", + expected: `"turduckens":[{"ducks":[{"in":"chicken"},{"in":"chicken"}]},{"ducks":[{"in":"chicken"},{"in":"chicken"}]}]`, + f: func(e Encoder) { + assert.NoError( + t, + e.AddArray("turduckens", turduckens(2)), + "Unexpected error calling MarshalLogObject with nested ObjectMarshalers and ArrayMarshalers.", + ) + }, + }, + { + desc: "array (success)", + expected: `"k":[true]`, + f: func(e Encoder) { + assert.NoError(t, e.AddArray(`k`, loggable{true}), "Unexpected error calling MarshalLogArray.") + }, + }, + { + desc: "array (error)", + expected: `"k":[]`, + f: func(e Encoder) { + assert.Error(t, e.AddArray("k", loggable{false}), "Expected an error calling MarshalLogArray.") + }, + }, + { + desc: "reflect (success)", + expected: `"k":{"loggable":"yes"}`, + f: func(e Encoder) { + assert.NoError(t, e.AddReflected("k", map[string]string{"loggable": "yes"}), "Unexpected error JSON-serializing a map.") + }, + }, + { + desc: "reflect (failure)", + expected: "", + f: func(e Encoder) { + assert.Error(t, e.AddReflected("k", noJSON{}), "Unexpected success JSON-serializing a noJSON.") + }, + }, + { + desc: "namespace", + // EncodeEntry is responsible for closing all open namespaces. + expected: `"outermost":{"outer":{"foo":1,"inner":{"foo":2,"innermost":{`, + f: func(e Encoder) { + e.OpenNamespace("outermost") + e.OpenNamespace("outer") + e.AddInt("foo", 1) + e.OpenNamespace("inner") + e.AddInt("foo", 2) + e.OpenNamespace("innermost") + }, + }, + } + + for _, tt := range tests { + t.Run(tt.desc, func(t *testing.T) { + assertOutput(t, tt.expected, tt.f) + }) + } +} + +func TestJSONEncoderArrays(t *testing.T) { + tests := []struct { + desc string + expected string // expect f to be called twice + f func(ArrayEncoder) + }{ + {"bool", `[true,true]`, func(e ArrayEncoder) { e.AppendBool(true) }}, + {"byteString", `["k","k"]`, func(e ArrayEncoder) { e.AppendByteString([]byte("k")) }}, + {"byteString", `["k\\","k\\"]`, func(e ArrayEncoder) { e.AppendByteString([]byte(`k\`)) }}, + {"complex128", `["1+2i","1+2i"]`, func(e ArrayEncoder) { e.AppendComplex128(1 + 2i) }}, + {"complex64", `["1+2i","1+2i"]`, func(e ArrayEncoder) { e.AppendComplex64(1 + 2i) }}, + {"durations", `[0.000000002,0.000000002]`, func(e ArrayEncoder) { e.AppendDuration(2) }}, + {"float64", `[3.14,3.14]`, func(e ArrayEncoder) { e.AppendFloat64(3.14) }}, + {"float32", `[3.14,3.14]`, func(e ArrayEncoder) { e.AppendFloat32(3.14) }}, + {"int", `[42,42]`, func(e ArrayEncoder) { e.AppendInt(42) }}, + {"int64", `[42,42]`, func(e ArrayEncoder) { e.AppendInt64(42) }}, + {"int32", `[42,42]`, func(e ArrayEncoder) { e.AppendInt32(42) }}, + {"int16", `[42,42]`, func(e ArrayEncoder) { e.AppendInt16(42) }}, + {"int8", `[42,42]`, func(e ArrayEncoder) { e.AppendInt8(42) }}, + {"string", `["k","k"]`, func(e ArrayEncoder) { e.AppendString("k") }}, + {"string", `["k\\","k\\"]`, func(e ArrayEncoder) { e.AppendString(`k\`) }}, + {"times", `[1,1]`, func(e ArrayEncoder) { e.AppendTime(time.Unix(1, 0)) }}, + {"uint", `[42,42]`, func(e ArrayEncoder) { e.AppendUint(42) }}, + {"uint64", `[42,42]`, func(e ArrayEncoder) { e.AppendUint64(42) }}, + {"uint32", `[42,42]`, func(e ArrayEncoder) { e.AppendUint32(42) }}, + {"uint16", `[42,42]`, func(e ArrayEncoder) { e.AppendUint16(42) }}, + {"uint8", `[42,42]`, func(e ArrayEncoder) { e.AppendUint8(42) }}, + {"uintptr", `[42,42]`, func(e ArrayEncoder) { e.AppendUintptr(42) }}, + { + desc: "arrays (success)", + expected: `[[true],[true]]`, + f: func(arr ArrayEncoder) { + assert.NoError(t, arr.AppendArray(ArrayMarshalerFunc(func(inner ArrayEncoder) error { + inner.AppendBool(true) + return nil + })), "Unexpected error appending an array.") + }, + }, + { + desc: "arrays (error)", + expected: `[[true],[true]]`, + f: func(arr ArrayEncoder) { + assert.Error(t, arr.AppendArray(ArrayMarshalerFunc(func(inner ArrayEncoder) error { + inner.AppendBool(true) + return errors.New("fail") + })), "Expected an error appending an array.") + }, + }, + { + desc: "objects (success)", + expected: `[{"loggable":"yes"},{"loggable":"yes"}]`, + f: func(arr ArrayEncoder) { + assert.NoError(t, arr.AppendObject(loggable{true}), "Unexpected error appending an object.") + }, + }, + { + desc: "objects (error)", + expected: `[{},{}]`, + f: func(arr ArrayEncoder) { + assert.Error(t, arr.AppendObject(loggable{false}), "Expected an error appending an object.") + }, + }, + { + desc: "reflect (success)", + expected: `[{"foo":5},{"foo":5}]`, + f: func(arr ArrayEncoder) { + assert.NoError( + t, + arr.AppendReflected(map[string]int{"foo": 5}), + "Unexpected an error appending an object with reflection.", + ) + }, + }, + { + desc: "reflect (error)", + expected: `[]`, + f: func(arr ArrayEncoder) { + assert.Error( + t, + arr.AppendReflected(noJSON{}), + "Unexpected an error appending an object with reflection.", + ) + }, + }, + } + + for _, tt := range tests { + t.Run(tt.desc, func(t *testing.T) { + f := func(enc Encoder) error { + return enc.AddArray("array", ArrayMarshalerFunc(func(arr ArrayEncoder) error { + tt.f(arr) + tt.f(arr) + return nil + })) + } + assertOutput(t, `"array":`+tt.expected, func(enc Encoder) { + err := f(enc) + assert.NoError(t, err, "Unexpected error adding array to JSON encoder.") + }) + }) + } +} + +func assertJSON(t *testing.T, expected string, enc *jsonEncoder) { + assert.Equal(t, expected, enc.buf.String(), "Encoded JSON didn't match expectations.") +} + +func assertOutput(t testing.TB, expected string, f func(Encoder)) { + enc := &jsonEncoder{buf: bufferpool.Get(), EncoderConfig: &EncoderConfig{ + EncodeTime: EpochTimeEncoder, + EncodeDuration: SecondsDurationEncoder, + }} + f(enc) + assert.Equal(t, expected, enc.buf.String(), "Unexpected encoder output after adding.") + + enc.truncate() + enc.AddString("foo", "bar") + f(enc) + expectedPrefix := `"foo":"bar"` + if expected != "" { + // If we expect output, it should be comma-separated from the previous + // field. + expectedPrefix += "," + } + assert.Equal(t, expectedPrefix+expected, enc.buf.String(), "Unexpected encoder output after adding as a second field.") +} + +// Nested Array- and ObjectMarshalers. +type turducken struct{} + +func (t turducken) MarshalLogObject(enc ObjectEncoder) error { + return enc.AddArray("ducks", ArrayMarshalerFunc(func(arr ArrayEncoder) error { + for i := 0; i < 2; i++ { + arr.AppendObject(ObjectMarshalerFunc(func(inner ObjectEncoder) error { + inner.AddString("in", "chicken") + return nil + })) + } + return nil + })) +} + +type turduckens int + +func (t turduckens) MarshalLogArray(enc ArrayEncoder) error { + var err error + tur := turducken{} + for i := 0; i < int(t); i++ { + err = multierr.Append(err, enc.AppendObject(tur)) + } + return err +} + +type loggable struct{ bool } + +func (l loggable) MarshalLogObject(enc ObjectEncoder) error { + if !l.bool { + return errors.New("can't marshal") + } + enc.AddString("loggable", "yes") + return nil +} + +func (l loggable) MarshalLogArray(enc ArrayEncoder) error { + if !l.bool { + return errors.New("can't marshal") + } + enc.AppendBool(true) + return nil +} + +type noJSON struct{} + +func (nj noJSON) MarshalJSON() ([]byte, error) { + return nil, errors.New("no") +} + +func zapEncode(encode func(*jsonEncoder, string)) func(s string) []byte { + return func(s string) []byte { + enc := &jsonEncoder{buf: bufferpool.Get()} + // Escape and quote a string using our encoder. + var ret []byte + encode(enc, s) + ret = make([]byte, 0, enc.buf.Len()+2) + ret = append(ret, '"') + ret = append(ret, enc.buf.Bytes()...) + ret = append(ret, '"') + return ret + } +} + +func roundTripsCorrectly(encode func(string) []byte, original string) bool { + // Encode using our encoder, decode using the standard library, and assert + // that we haven't lost any information. + encoded := encode(original) + + var decoded string + err := json.Unmarshal(encoded, &decoded) + if err != nil { + return false + } + return original == decoded +} + +func roundTripsCorrectlyString(original string) bool { + return roundTripsCorrectly(zapEncode((*jsonEncoder).safeAddString), original) +} + +func roundTripsCorrectlyByteString(original string) bool { + return roundTripsCorrectly( + zapEncode(func(enc *jsonEncoder, s string) { + enc.safeAddByteString([]byte(s)) + }), + original) +} + +type ASCII string + +func (s ASCII) Generate(r *rand.Rand, size int) reflect.Value { + bs := make([]byte, size) + for i := range bs { + bs[i] = byte(r.Intn(128)) + } + a := ASCII(bs) + return reflect.ValueOf(a) +} + +func asciiRoundTripsCorrectlyString(s ASCII) bool { + return roundTripsCorrectlyString(string(s)) +} + +func asciiRoundTripsCorrectlyByteString(s ASCII) bool { + return roundTripsCorrectlyByteString(string(s)) +} + +func TestJSONQuick(t *testing.T) { + check := func(f interface{}) { + err := quick.Check(f, &quick.Config{MaxCountScale: 100.0}) + assert.NoError(t, err) + } + // Test the full range of UTF-8 strings. + check(roundTripsCorrectlyString) + check(roundTripsCorrectlyByteString) + + // Focus on ASCII strings. + check(asciiRoundTripsCorrectlyString) + check(asciiRoundTripsCorrectlyByteString) +} diff --git a/api/vendor/go.uber.org/zap/zapcore/level.go b/api/vendor/go.uber.org/zap/zapcore/level.go new file mode 100644 index 0000000..e575c9f --- /dev/null +++ b/api/vendor/go.uber.org/zap/zapcore/level.go @@ -0,0 +1,175 @@ +// 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 +// 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. + +package zapcore + +import ( + "bytes" + "errors" + "fmt" +) + +var errUnmarshalNilLevel = errors.New("can't unmarshal a nil *Level") + +// A Level is a logging priority. Higher levels are more important. +type Level int8 + +const ( + // DebugLevel logs are typically voluminous, and are usually disabled in + // production. + DebugLevel Level = iota - 1 + // InfoLevel is the default logging priority. + InfoLevel + // WarnLevel logs are more important than Info, but don't need individual + // human review. + WarnLevel + // ErrorLevel logs are high-priority. If an application is running smoothly, + // it shouldn't generate any error-level logs. + ErrorLevel + // DPanicLevel logs are particularly important errors. In development the + // logger panics after writing the message. + DPanicLevel + // PanicLevel logs a message, then panics. + PanicLevel + // FatalLevel logs a message, then calls os.Exit(1). + FatalLevel + + _minLevel = DebugLevel + _maxLevel = FatalLevel +) + +// String returns a lower-case ASCII representation of the log level. +func (l Level) String() string { + switch l { + case DebugLevel: + return "debug" + case InfoLevel: + return "info" + case WarnLevel: + return "warn" + case ErrorLevel: + return "error" + case DPanicLevel: + return "dpanic" + case PanicLevel: + return "panic" + case FatalLevel: + return "fatal" + default: + return fmt.Sprintf("Level(%d)", l) + } +} + +// CapitalString returns an all-caps ASCII representation of the log level. +func (l Level) CapitalString() string { + // Printing levels in all-caps is common enough that we should export this + // functionality. + switch l { + case DebugLevel: + return "DEBUG" + case InfoLevel: + return "INFO" + case WarnLevel: + return "WARN" + case ErrorLevel: + return "ERROR" + case DPanicLevel: + return "DPANIC" + case PanicLevel: + return "PANIC" + case FatalLevel: + return "FATAL" + default: + return fmt.Sprintf("LEVEL(%d)", l) + } +} + +// MarshalText marshals the Level to text. Note that the text representation +// drops the -Level suffix (see example). +func (l Level) MarshalText() ([]byte, error) { + return []byte(l.String()), nil +} + +// UnmarshalText unmarshals text to a level. Like MarshalText, UnmarshalText +// expects the text representation of a Level to drop the -Level suffix (see +// example). +// +// In particular, this makes it easy to configure logging levels using YAML, +// TOML, or JSON files. +func (l *Level) UnmarshalText(text []byte) error { + if l == nil { + return errUnmarshalNilLevel + } + if !l.unmarshalText(text) && !l.unmarshalText(bytes.ToLower(text)) { + return fmt.Errorf("unrecognized level: %q", text) + } + return nil +} + +func (l *Level) unmarshalText(text []byte) bool { + switch string(text) { + case "debug", "DEBUG": + *l = DebugLevel + case "info", "INFO", "": // make the zero value useful + *l = InfoLevel + case "warn", "WARN": + *l = WarnLevel + case "error", "ERROR": + *l = ErrorLevel + case "dpanic", "DPANIC": + *l = DPanicLevel + case "panic", "PANIC": + *l = PanicLevel + case "fatal", "FATAL": + *l = FatalLevel + default: + return false + } + return true +} + +// Set sets the level for the flag.Value interface. +func (l *Level) Set(s string) error { + return l.UnmarshalText([]byte(s)) +} + +// Get gets the level for the flag.Getter interface. +func (l *Level) Get() interface{} { + return *l +} + +// Enabled returns true if the given level is at or above this level. +func (l Level) Enabled(lvl Level) bool { + return lvl >= l +} + +// LevelEnabler decides whether a given logging level is enabled when logging a +// message. +// +// Enablers are intended to be used to implement deterministic filters; +// concerns like sampling are better implemented as a Core. +// +// Each concrete Level value implements a static LevelEnabler which returns +// true for itself and all higher logging levels. For example WarnLevel.Enabled() +// will return true for WarnLevel, ErrorLevel, DPanicLevel, PanicLevel, and +// FatalLevel, but return false for InfoLevel and DebugLevel. +type LevelEnabler interface { + Enabled(Level) bool +} diff --git a/api/vendor/go.uber.org/zap/zapcore/level_strings.go b/api/vendor/go.uber.org/zap/zapcore/level_strings.go new file mode 100644 index 0000000..7af8dad --- /dev/null +++ b/api/vendor/go.uber.org/zap/zapcore/level_strings.go @@ -0,0 +1,46 @@ +// 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 +// 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. + +package zapcore + +import "go.uber.org/zap/internal/color" + +var ( + _levelToColor = map[Level]color.Color{ + DebugLevel: color.Magenta, + InfoLevel: color.Blue, + WarnLevel: color.Yellow, + ErrorLevel: color.Red, + DPanicLevel: color.Red, + PanicLevel: color.Red, + FatalLevel: color.Red, + } + _unknownLevelColor = color.Red + + _levelToLowercaseColorString = make(map[Level]string, len(_levelToColor)) + _levelToCapitalColorString = make(map[Level]string, len(_levelToColor)) +) + +func init() { + for level, color := range _levelToColor { + _levelToLowercaseColorString[level] = color.Add(level.String()) + _levelToCapitalColorString[level] = color.Add(level.CapitalString()) + } +} diff --git a/api/vendor/go.uber.org/zap/zapcore/level_strings_test.go b/api/vendor/go.uber.org/zap/zapcore/level_strings_test.go new file mode 100644 index 0000000..14b0bac --- /dev/null +++ b/api/vendor/go.uber.org/zap/zapcore/level_strings_test.go @@ -0,0 +1,38 @@ +// 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 +// 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. + +package zapcore + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestAllLevelsCoveredByLevelString(t *testing.T) { + numLevels := int((_maxLevel - _minLevel) + 1) + + isComplete := func(m map[Level]string) bool { + return len(m) == numLevels + } + + assert.True(t, isComplete(_levelToLowercaseColorString), "Colored lowercase strings don't cover all levels.") + assert.True(t, isComplete(_levelToCapitalColorString), "Colored capital strings don't cover all levels.") +} diff --git a/api/vendor/go.uber.org/zap/zapcore/level_test.go b/api/vendor/go.uber.org/zap/zapcore/level_test.go new file mode 100644 index 0000000..28b75b3 --- /dev/null +++ b/api/vendor/go.uber.org/zap/zapcore/level_test.go @@ -0,0 +1,177 @@ +// 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 +// 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. + +package zapcore + +import ( + "bytes" + "flag" + "strings" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestLevelString(t *testing.T) { + tests := map[Level]string{ + DebugLevel: "debug", + InfoLevel: "info", + WarnLevel: "warn", + ErrorLevel: "error", + DPanicLevel: "dpanic", + PanicLevel: "panic", + FatalLevel: "fatal", + Level(-42): "Level(-42)", + } + + for lvl, stringLevel := range tests { + assert.Equal(t, stringLevel, lvl.String(), "Unexpected lowercase level string.") + assert.Equal(t, strings.ToUpper(stringLevel), lvl.CapitalString(), "Unexpected all-caps level string.") + } +} + +func TestLevelText(t *testing.T) { + tests := []struct { + text string + level Level + }{ + {"debug", DebugLevel}, + {"info", InfoLevel}, + {"", InfoLevel}, // make the zero value useful + {"warn", WarnLevel}, + {"error", ErrorLevel}, + {"dpanic", DPanicLevel}, + {"panic", PanicLevel}, + {"fatal", FatalLevel}, + } + for _, tt := range tests { + if tt.text != "" { + lvl := tt.level + marshaled, err := lvl.MarshalText() + assert.NoError(t, err, "Unexpected error marshaling level %v to text.", &lvl) + assert.Equal(t, tt.text, string(marshaled), "Marshaling level %v to text yielded unexpected result.", &lvl) + } + + var unmarshaled Level + err := unmarshaled.UnmarshalText([]byte(tt.text)) + assert.NoError(t, err, `Unexpected error unmarshaling text %q to level.`, tt.text) + assert.Equal(t, tt.level, unmarshaled, `Text %q unmarshaled to an unexpected level.`, tt.text) + } +} + +func TestCapitalLevelsParse(t *testing.T) { + tests := []struct { + text string + level Level + }{ + {"DEBUG", DebugLevel}, + {"INFO", InfoLevel}, + {"WARN", WarnLevel}, + {"ERROR", ErrorLevel}, + {"DPANIC", DPanicLevel}, + {"PANIC", PanicLevel}, + {"FATAL", FatalLevel}, + } + for _, tt := range tests { + var unmarshaled Level + err := unmarshaled.UnmarshalText([]byte(tt.text)) + assert.NoError(t, err, `Unexpected error unmarshaling text %q to level.`, tt.text) + assert.Equal(t, tt.level, unmarshaled, `Text %q unmarshaled to an unexpected level.`, tt.text) + } +} + +func TestWeirdLevelsParse(t *testing.T) { + tests := []struct { + text string + level Level + }{ + // I guess... + {"Debug", DebugLevel}, + {"Info", InfoLevel}, + {"Warn", WarnLevel}, + {"Error", ErrorLevel}, + {"Dpanic", DPanicLevel}, + {"Panic", PanicLevel}, + {"Fatal", FatalLevel}, + + // What even is... + {"DeBuG", DebugLevel}, + {"InFo", InfoLevel}, + {"WaRn", WarnLevel}, + {"ErRor", ErrorLevel}, + {"DpAnIc", DPanicLevel}, + {"PaNiC", PanicLevel}, + {"FaTaL", FatalLevel}, + } + for _, tt := range tests { + var unmarshaled Level + err := unmarshaled.UnmarshalText([]byte(tt.text)) + assert.NoError(t, err, `Unexpected error unmarshaling text %q to level.`, tt.text) + assert.Equal(t, tt.level, unmarshaled, `Text %q unmarshaled to an unexpected level.`, tt.text) + } +} + +func TestLevelNils(t *testing.T) { + var l *Level + + // The String() method will not handle nil level properly. + assert.Panics(t, func() { + assert.Equal(t, "Level(nil)", l.String(), "Unexpected result stringifying nil *Level.") + }, "Level(nil).String() should panic") + + assert.Panics(t, func() { + l.MarshalText() + }, "Expected to panic when marshalling a nil level.") + + err := l.UnmarshalText([]byte("debug")) + assert.Equal(t, errUnmarshalNilLevel, err, "Expected to error unmarshalling into a nil Level.") +} + +func TestLevelUnmarshalUnknownText(t *testing.T) { + var l Level + err := l.UnmarshalText([]byte("foo")) + assert.Contains(t, err.Error(), "unrecognized level", "Expected unmarshaling arbitrary text to fail.") +} + +func TestLevelAsFlagValue(t *testing.T) { + var ( + buf bytes.Buffer + lvl Level + ) + fs := flag.NewFlagSet("levelTest", flag.ContinueOnError) + fs.SetOutput(&buf) + fs.Var(&lvl, "level", "log level") + + for _, expected := range []Level{DebugLevel, InfoLevel, WarnLevel, ErrorLevel, DPanicLevel, PanicLevel, FatalLevel} { + assert.NoError(t, fs.Parse([]string{"-level", expected.String()})) + assert.Equal(t, expected, lvl, "Unexpected level after parsing flag.") + assert.Equal(t, expected, lvl.Get(), "Unexpected output using flag.Getter API.") + assert.Empty(t, buf.String(), "Unexpected error output parsing level flag.") + buf.Reset() + } + + assert.Error(t, fs.Parse([]string{"-level", "nope"})) + assert.Equal( + t, + `invalid value "nope" for flag -level: unrecognized level: "nope"`, + strings.Split(buf.String(), "\n")[0], // second line is help message + "Unexpected error output from invalid flag input.", + ) +} diff --git a/api/vendor/go.uber.org/zap/zapcore/marshaler.go b/api/vendor/go.uber.org/zap/zapcore/marshaler.go new file mode 100644 index 0000000..2627a65 --- /dev/null +++ b/api/vendor/go.uber.org/zap/zapcore/marshaler.go @@ -0,0 +1,53 @@ +// 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 +// 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. + +package zapcore + +// ObjectMarshaler allows user-defined types to efficiently add themselves to the +// logging context, and to selectively omit information which shouldn't be +// included in logs (e.g., passwords). +type ObjectMarshaler interface { + MarshalLogObject(ObjectEncoder) error +} + +// ObjectMarshalerFunc is a type adapter that turns a function into an +// ObjectMarshaler. +type ObjectMarshalerFunc func(ObjectEncoder) error + +// MarshalLogObject calls the underlying function. +func (f ObjectMarshalerFunc) MarshalLogObject(enc ObjectEncoder) error { + return f(enc) +} + +// ArrayMarshaler allows user-defined types to efficiently add themselves to the +// logging context, and to selectively omit information which shouldn't be +// included in logs (e.g., passwords). +type ArrayMarshaler interface { + MarshalLogArray(ArrayEncoder) error +} + +// ArrayMarshalerFunc is a type adapter that turns a function into an +// ArrayMarshaler. +type ArrayMarshalerFunc func(ArrayEncoder) error + +// MarshalLogArray calls the underlying function. +func (f ArrayMarshalerFunc) MarshalLogArray(enc ArrayEncoder) error { + return f(enc) +} diff --git a/api/vendor/go.uber.org/zap/zapcore/memory_encoder.go b/api/vendor/go.uber.org/zap/zapcore/memory_encoder.go new file mode 100644 index 0000000..5c46bc1 --- /dev/null +++ b/api/vendor/go.uber.org/zap/zapcore/memory_encoder.go @@ -0,0 +1,179 @@ +// 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 +// 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. + +package zapcore + +import "time" + +// MapObjectEncoder is an ObjectEncoder backed by a simple +// map[string]interface{}. It's not fast enough for production use, but it's +// helpful in tests. +type MapObjectEncoder struct { + // Fields contains the entire encoded log context. + Fields map[string]interface{} + // cur is a pointer to the namespace we're currently writing to. + cur map[string]interface{} +} + +// NewMapObjectEncoder creates a new map-backed ObjectEncoder. +func NewMapObjectEncoder() *MapObjectEncoder { + m := make(map[string]interface{}) + return &MapObjectEncoder{ + Fields: m, + cur: m, + } +} + +// AddArray implements ObjectEncoder. +func (m *MapObjectEncoder) AddArray(key string, v ArrayMarshaler) error { + arr := &sliceArrayEncoder{} + err := v.MarshalLogArray(arr) + m.cur[key] = arr.elems + return err +} + +// AddObject implements ObjectEncoder. +func (m *MapObjectEncoder) AddObject(k string, v ObjectMarshaler) error { + newMap := NewMapObjectEncoder() + m.cur[k] = newMap.Fields + return v.MarshalLogObject(newMap) +} + +// AddBinary implements ObjectEncoder. +func (m *MapObjectEncoder) AddBinary(k string, v []byte) { m.cur[k] = v } + +// AddByteString implements ObjectEncoder. +func (m *MapObjectEncoder) AddByteString(k string, v []byte) { m.cur[k] = string(v) } + +// AddBool implements ObjectEncoder. +func (m *MapObjectEncoder) AddBool(k string, v bool) { m.cur[k] = v } + +// AddDuration implements ObjectEncoder. +func (m MapObjectEncoder) AddDuration(k string, v time.Duration) { m.cur[k] = v } + +// AddComplex128 implements ObjectEncoder. +func (m *MapObjectEncoder) AddComplex128(k string, v complex128) { m.cur[k] = v } + +// AddComplex64 implements ObjectEncoder. +func (m *MapObjectEncoder) AddComplex64(k string, v complex64) { m.cur[k] = v } + +// AddFloat64 implements ObjectEncoder. +func (m *MapObjectEncoder) AddFloat64(k string, v float64) { m.cur[k] = v } + +// AddFloat32 implements ObjectEncoder. +func (m *MapObjectEncoder) AddFloat32(k string, v float32) { m.cur[k] = v } + +// AddInt implements ObjectEncoder. +func (m *MapObjectEncoder) AddInt(k string, v int) { m.cur[k] = v } + +// AddInt64 implements ObjectEncoder. +func (m *MapObjectEncoder) AddInt64(k string, v int64) { m.cur[k] = v } + +// AddInt32 implements ObjectEncoder. +func (m *MapObjectEncoder) AddInt32(k string, v int32) { m.cur[k] = v } + +// AddInt16 implements ObjectEncoder. +func (m *MapObjectEncoder) AddInt16(k string, v int16) { m.cur[k] = v } + +// AddInt8 implements ObjectEncoder. +func (m *MapObjectEncoder) AddInt8(k string, v int8) { m.cur[k] = v } + +// AddString implements ObjectEncoder. +func (m *MapObjectEncoder) AddString(k string, v string) { m.cur[k] = v } + +// AddTime implements ObjectEncoder. +func (m MapObjectEncoder) AddTime(k string, v time.Time) { m.cur[k] = v } + +// AddUint implements ObjectEncoder. +func (m *MapObjectEncoder) AddUint(k string, v uint) { m.cur[k] = v } + +// AddUint64 implements ObjectEncoder. +func (m *MapObjectEncoder) AddUint64(k string, v uint64) { m.cur[k] = v } + +// AddUint32 implements ObjectEncoder. +func (m *MapObjectEncoder) AddUint32(k string, v uint32) { m.cur[k] = v } + +// AddUint16 implements ObjectEncoder. +func (m *MapObjectEncoder) AddUint16(k string, v uint16) { m.cur[k] = v } + +// AddUint8 implements ObjectEncoder. +func (m *MapObjectEncoder) AddUint8(k string, v uint8) { m.cur[k] = v } + +// AddUintptr implements ObjectEncoder. +func (m *MapObjectEncoder) AddUintptr(k string, v uintptr) { m.cur[k] = v } + +// AddReflected implements ObjectEncoder. +func (m *MapObjectEncoder) AddReflected(k string, v interface{}) error { + m.cur[k] = v + return nil +} + +// OpenNamespace implements ObjectEncoder. +func (m *MapObjectEncoder) OpenNamespace(k string) { + ns := make(map[string]interface{}) + m.cur[k] = ns + m.cur = ns +} + +// sliceArrayEncoder is an ArrayEncoder backed by a simple []interface{}. Like +// the MapObjectEncoder, it's not designed for production use. +type sliceArrayEncoder struct { + elems []interface{} +} + +func (s *sliceArrayEncoder) AppendArray(v ArrayMarshaler) error { + enc := &sliceArrayEncoder{} + err := v.MarshalLogArray(enc) + s.elems = append(s.elems, enc.elems) + return err +} + +func (s *sliceArrayEncoder) AppendObject(v ObjectMarshaler) error { + m := NewMapObjectEncoder() + err := v.MarshalLogObject(m) + s.elems = append(s.elems, m.Fields) + return err +} + +func (s *sliceArrayEncoder) AppendReflected(v interface{}) error { + s.elems = append(s.elems, v) + return nil +} + +func (s *sliceArrayEncoder) AppendBool(v bool) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendByteString(v []byte) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendComplex128(v complex128) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendComplex64(v complex64) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendDuration(v time.Duration) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendFloat64(v float64) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendFloat32(v float32) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendInt(v int) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendInt64(v int64) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendInt32(v int32) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendInt16(v int16) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendInt8(v int8) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendString(v string) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendTime(v time.Time) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendUint(v uint) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendUint64(v uint64) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendUint32(v uint32) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendUint16(v uint16) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendUint8(v uint8) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendUintptr(v uintptr) { s.elems = append(s.elems, v) } diff --git a/api/vendor/go.uber.org/zap/zapcore/memory_encoder_test.go b/api/vendor/go.uber.org/zap/zapcore/memory_encoder_test.go new file mode 100644 index 0000000..4523a0e --- /dev/null +++ b/api/vendor/go.uber.org/zap/zapcore/memory_encoder_test.go @@ -0,0 +1,285 @@ +// 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 +// 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. + +package zapcore + +import ( + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestMapObjectEncoderAdd(t *testing.T) { + // Expected output of a turducken. + wantTurducken := map[string]interface{}{ + "ducks": []interface{}{ + map[string]interface{}{"in": "chicken"}, + map[string]interface{}{"in": "chicken"}, + }, + } + + tests := []struct { + desc string + f func(ObjectEncoder) + expected interface{} + }{ + { + desc: "AddObject", + f: func(e ObjectEncoder) { + assert.NoError(t, e.AddObject("k", loggable{true}), "Expected AddObject to succeed.") + }, + expected: map[string]interface{}{"loggable": "yes"}, + }, + { + desc: "AddObject (nested)", + f: func(e ObjectEncoder) { + assert.NoError(t, e.AddObject("k", turducken{}), "Expected AddObject to succeed.") + }, + expected: wantTurducken, + }, + { + desc: "AddArray", + f: func(e ObjectEncoder) { + assert.NoError(t, e.AddArray("k", ArrayMarshalerFunc(func(arr ArrayEncoder) error { + arr.AppendBool(true) + arr.AppendBool(false) + arr.AppendBool(true) + return nil + })), "Expected AddArray to succeed.") + }, + expected: []interface{}{true, false, true}, + }, + { + desc: "AddArray (nested)", + f: func(e ObjectEncoder) { + assert.NoError(t, e.AddArray("k", turduckens(2)), "Expected AddArray to succeed.") + }, + expected: []interface{}{wantTurducken, wantTurducken}, + }, + { + desc: "AddBinary", + f: func(e ObjectEncoder) { e.AddBinary("k", []byte("foo")) }, + expected: []byte("foo"), + }, + { + desc: "AddBool", + f: func(e ObjectEncoder) { e.AddBool("k", true) }, + expected: true, + }, + { + desc: "AddComplex128", + f: func(e ObjectEncoder) { e.AddComplex128("k", 1+2i) }, + expected: 1 + 2i, + }, + { + desc: "AddComplex64", + f: func(e ObjectEncoder) { e.AddComplex64("k", 1+2i) }, + expected: complex64(1 + 2i), + }, + { + desc: "AddDuration", + f: func(e ObjectEncoder) { e.AddDuration("k", time.Millisecond) }, + expected: time.Millisecond, + }, + { + desc: "AddFloat64", + f: func(e ObjectEncoder) { e.AddFloat64("k", 3.14) }, + expected: 3.14, + }, + { + desc: "AddFloat32", + f: func(e ObjectEncoder) { e.AddFloat32("k", 3.14) }, + expected: float32(3.14), + }, + { + desc: "AddInt", + f: func(e ObjectEncoder) { e.AddInt("k", 42) }, + expected: 42, + }, + { + desc: "AddInt64", + f: func(e ObjectEncoder) { e.AddInt64("k", 42) }, + expected: int64(42), + }, + { + desc: "AddInt32", + f: func(e ObjectEncoder) { e.AddInt32("k", 42) }, + expected: int32(42), + }, + { + desc: "AddInt16", + f: func(e ObjectEncoder) { e.AddInt16("k", 42) }, + expected: int16(42), + }, + { + desc: "AddInt8", + f: func(e ObjectEncoder) { e.AddInt8("k", 42) }, + expected: int8(42), + }, + { + desc: "AddString", + f: func(e ObjectEncoder) { e.AddString("k", "v") }, + expected: "v", + }, + { + desc: "AddTime", + f: func(e ObjectEncoder) { e.AddTime("k", time.Unix(0, 100)) }, + expected: time.Unix(0, 100), + }, + { + desc: "AddUint", + f: func(e ObjectEncoder) { e.AddUint("k", 42) }, + expected: uint(42), + }, + { + desc: "AddUint64", + f: func(e ObjectEncoder) { e.AddUint64("k", 42) }, + expected: uint64(42), + }, + { + desc: "AddUint32", + f: func(e ObjectEncoder) { e.AddUint32("k", 42) }, + expected: uint32(42), + }, + { + desc: "AddUint16", + f: func(e ObjectEncoder) { e.AddUint16("k", 42) }, + expected: uint16(42), + }, + { + desc: "AddUint8", + f: func(e ObjectEncoder) { e.AddUint8("k", 42) }, + expected: uint8(42), + }, + { + desc: "AddUintptr", + f: func(e ObjectEncoder) { e.AddUintptr("k", 42) }, + expected: uintptr(42), + }, + { + desc: "AddReflected", + f: func(e ObjectEncoder) { + assert.NoError(t, e.AddReflected("k", map[string]interface{}{"foo": 5}), "Expected AddReflected to succeed.") + }, + expected: map[string]interface{}{"foo": 5}, + }, + { + desc: "OpenNamespace", + f: func(e ObjectEncoder) { + e.OpenNamespace("k") + e.AddInt("foo", 1) + e.OpenNamespace("middle") + e.AddInt("foo", 2) + e.OpenNamespace("inner") + e.AddInt("foo", 3) + }, + expected: map[string]interface{}{ + "foo": 1, + "middle": map[string]interface{}{ + "foo": 2, + "inner": map[string]interface{}{ + "foo": 3, + }, + }, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.desc, func(t *testing.T) { + enc := NewMapObjectEncoder() + tt.f(enc) + assert.Equal(t, tt.expected, enc.Fields["k"], "Unexpected encoder output.") + }) + } +} +func TestSliceArrayEncoderAppend(t *testing.T) { + tests := []struct { + desc string + f func(ArrayEncoder) + expected interface{} + }{ + // AppendObject and AppendArray are covered by the AddObject (nested) and + // AddArray (nested) cases above. + {"AppendBool", func(e ArrayEncoder) { e.AppendBool(true) }, true}, + {"AppendComplex128", func(e ArrayEncoder) { e.AppendComplex128(1 + 2i) }, 1 + 2i}, + {"AppendComplex64", func(e ArrayEncoder) { e.AppendComplex64(1 + 2i) }, complex64(1 + 2i)}, + {"AppendDuration", func(e ArrayEncoder) { e.AppendDuration(time.Second) }, time.Second}, + {"AppendFloat64", func(e ArrayEncoder) { e.AppendFloat64(3.14) }, 3.14}, + {"AppendFloat32", func(e ArrayEncoder) { e.AppendFloat32(3.14) }, float32(3.14)}, + {"AppendInt", func(e ArrayEncoder) { e.AppendInt(42) }, 42}, + {"AppendInt64", func(e ArrayEncoder) { e.AppendInt64(42) }, int64(42)}, + {"AppendInt32", func(e ArrayEncoder) { e.AppendInt32(42) }, int32(42)}, + {"AppendInt16", func(e ArrayEncoder) { e.AppendInt16(42) }, int16(42)}, + {"AppendInt8", func(e ArrayEncoder) { e.AppendInt8(42) }, int8(42)}, + {"AppendString", func(e ArrayEncoder) { e.AppendString("foo") }, "foo"}, + {"AppendTime", func(e ArrayEncoder) { e.AppendTime(time.Unix(0, 100)) }, time.Unix(0, 100)}, + {"AppendUint", func(e ArrayEncoder) { e.AppendUint(42) }, uint(42)}, + {"AppendUint64", func(e ArrayEncoder) { e.AppendUint64(42) }, uint64(42)}, + {"AppendUint32", func(e ArrayEncoder) { e.AppendUint32(42) }, uint32(42)}, + {"AppendUint16", func(e ArrayEncoder) { e.AppendUint16(42) }, uint16(42)}, + {"AppendUint8", func(e ArrayEncoder) { e.AppendUint8(42) }, uint8(42)}, + {"AppendUintptr", func(e ArrayEncoder) { e.AppendUintptr(42) }, uintptr(42)}, + { + desc: "AppendReflected", + f: func(e ArrayEncoder) { e.AppendReflected(map[string]interface{}{"foo": 5}) }, + expected: map[string]interface{}{"foo": 5}, + }, + { + desc: "AppendArray (arrays of arrays)", + f: func(e ArrayEncoder) { + e.AppendArray(ArrayMarshalerFunc(func(inner ArrayEncoder) error { + inner.AppendBool(true) + inner.AppendBool(false) + return nil + })) + }, + expected: []interface{}{true, false}, + }, + } + + for _, tt := range tests { + t.Run(tt.desc, func(t *testing.T) { + enc := NewMapObjectEncoder() + assert.NoError(t, enc.AddArray("k", ArrayMarshalerFunc(func(arr ArrayEncoder) error { + tt.f(arr) + tt.f(arr) + return nil + })), "Expected AddArray to succeed.") + + arr, ok := enc.Fields["k"].([]interface{}) + require.True(t, ok, "Test case %s didn't encode an array.", tt.desc) + assert.Equal(t, []interface{}{tt.expected, tt.expected}, arr, "Unexpected encoder output.") + }) + } +} + +func TestMapObjectEncoderReflectionFailures(t *testing.T) { + enc := NewMapObjectEncoder() + assert.Error(t, enc.AddObject("object", loggable{false}), "Expected AddObject to fail.") + assert.Equal( + t, + map[string]interface{}{"object": map[string]interface{}{}}, + enc.Fields, + "Expected encoder to use empty values on errors.", + ) +} diff --git a/api/vendor/go.uber.org/zap/zapcore/sampler.go b/api/vendor/go.uber.org/zap/zapcore/sampler.go new file mode 100644 index 0000000..e316418 --- /dev/null +++ b/api/vendor/go.uber.org/zap/zapcore/sampler.go @@ -0,0 +1,134 @@ +// 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 +// 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. + +package zapcore + +import ( + "time" + + "go.uber.org/atomic" +) + +const ( + _numLevels = _maxLevel - _minLevel + 1 + _countersPerLevel = 4096 +) + +type counter struct { + resetAt atomic.Int64 + counter atomic.Uint64 +} + +type counters [_numLevels][_countersPerLevel]counter + +func newCounters() *counters { + return &counters{} +} + +func (cs *counters) get(lvl Level, key string) *counter { + i := lvl - _minLevel + j := fnv32a(key) % _countersPerLevel + return &cs[i][j] +} + +// fnv32a, adapted from "hash/fnv", but without a []byte(string) alloc +func fnv32a(s string) uint32 { + const ( + offset32 = 2166136261 + prime32 = 16777619 + ) + hash := uint32(offset32) + for i := 0; i < len(s); i++ { + hash ^= uint32(s[i]) + hash *= prime32 + } + return hash +} + +func (c *counter) IncCheckReset(t time.Time, tick time.Duration) uint64 { + tn := t.UnixNano() + resetAfter := c.resetAt.Load() + if resetAfter > tn { + return c.counter.Inc() + } + + c.counter.Store(1) + + newResetAfter := tn + tick.Nanoseconds() + if !c.resetAt.CAS(resetAfter, newResetAfter) { + // We raced with another goroutine trying to reset, and it also reset + // the counter to 1, so we need to reincrement the counter. + return c.counter.Inc() + } + + return 1 +} + +type sampler struct { + Core + + counts *counters + tick time.Duration + first, thereafter uint64 +} + +// NewSampler creates a Core that samples incoming entries, which caps the CPU +// and I/O load of logging while attempting to preserve a representative subset +// of your logs. +// +// Zap samples by logging the first N entries with a given level and message +// 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. +// +// 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 NewSampler(core Core, tick time.Duration, first, thereafter int) Core { + return &sampler{ + Core: core, + tick: tick, + counts: newCounters(), + first: uint64(first), + thereafter: uint64(thereafter), + } +} + +func (s *sampler) With(fields []Field) Core { + return &sampler{ + Core: s.Core.With(fields), + tick: s.tick, + counts: s.counts, + first: s.first, + thereafter: s.thereafter, + } +} + +func (s *sampler) Check(ent Entry, ce *CheckedEntry) *CheckedEntry { + if !s.Enabled(ent.Level) { + return ce + } + + 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 { + return ce + } + return s.Core.Check(ent, ce) +} diff --git a/api/vendor/go.uber.org/zap/zapcore/sampler_bench_test.go b/api/vendor/go.uber.org/zap/zapcore/sampler_bench_test.go new file mode 100644 index 0000000..af2e897 --- /dev/null +++ b/api/vendor/go.uber.org/zap/zapcore/sampler_bench_test.go @@ -0,0 +1,230 @@ +// 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 +// 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. + +package zapcore_test + +import ( + "fmt" + "testing" + "time" + + "go.uber.org/zap/internal/ztest" + . "go.uber.org/zap/zapcore" +) + +var counterTestCases = [][]string{ + // some stuff I made up + { + "foo", + "bar", + "baz", + "alpha", + "bravo", + "charlie", + "delta", + }, + + // shuf -n50 /usr/share/dict/words + { + "unbracing", + "stereotomy", + "supranervian", + "moaning", + "exchangeability", + "gunyang", + "sulcation", + "dariole", + "archheresy", + "synchronistically", + "clips", + "unsanctioned", + "Argoan", + "liparomphalus", + "layship", + "Fregatae", + "microzoology", + "glaciaria", + "Frugivora", + "patterist", + "Grossulariaceae", + "lithotint", + "bargander", + "opisthographical", + "cacography", + "chalkstone", + "nonsubstantialism", + "sardonicism", + "calamiform", + "lodginghouse", + "predisposedly", + "topotypic", + "broideress", + "outrange", + "gingivolabial", + "monoazo", + "sparlike", + "concameration", + "untoothed", + "Camorrism", + "reissuer", + "soap", + "palaiotype", + "countercharm", + "yellowbird", + "palterly", + "writinger", + "boatfalls", + "tuglike", + "underbitten", + }, + + // shuf -n100 /usr/share/dict/words + { + "rooty", + "malcultivation", + "degrade", + "pseudoindependent", + "stillatory", + "antiseptize", + "protoamphibian", + "antiar", + "Esther", + "pseudelminth", + "superfluitance", + "teallite", + "disunity", + "spirignathous", + "vergency", + "myliobatid", + "inosic", + "overabstemious", + "patriarchally", + "foreimagine", + "coetaneity", + "hemimellitene", + "hyperspatial", + "aulophyte", + "electropoion", + "antitrope", + "Amarantus", + "smaltine", + "lighthead", + "syntonically", + "incubous", + "versation", + "cirsophthalmia", + "Ulidian", + "homoeography", + "Velella", + "Hecatean", + "serfage", + "Spermaphyta", + "palatoplasty", + "electroextraction", + "aconite", + "avirulence", + "initiator", + "besmear", + "unrecognizably", + "euphoniousness", + "balbuties", + "pascuage", + "quebracho", + "Yakala", + "auriform", + "sevenbark", + "superorganism", + "telesterion", + "ensand", + "nagaika", + "anisuria", + "etching", + "soundingly", + "grumpish", + "drillmaster", + "perfumed", + "dealkylate", + "anthracitiferous", + "predefiance", + "sulphoxylate", + "freeness", + "untucking", + "misworshiper", + "Nestorianize", + "nonegoistical", + "construe", + "upstroke", + "teated", + "nasolachrymal", + "Mastodontidae", + "gallows", + "radioluminescent", + "uncourtierlike", + "phasmatrope", + "Clunisian", + "drainage", + "sootless", + "brachyfacial", + "antiheroism", + "irreligionize", + "ked", + "unfact", + "nonprofessed", + "milady", + "conjecture", + "Arctomys", + "guapilla", + "Sassenach", + "emmetrope", + "rosewort", + "raphidiferous", + "pooh", + "Tyndallize", + }, +} + +func BenchmarkSampler_Check(b *testing.B) { + for _, keys := range counterTestCases { + b.Run(fmt.Sprintf("%v keys", len(keys)), func(b *testing.B) { + fac := NewSampler( + NewCore( + NewJSONEncoder(testEncoderConfig()), + &ztest.Discarder{}, + DebugLevel, + ), + time.Millisecond, 1, 1000) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + i := 0 + for pb.Next() { + ent := Entry{ + Level: DebugLevel + Level(i%4), + Message: keys[i], + } + _ = fac.Check(ent, nil) + i++ + if n := len(keys); i >= n { + i -= n + } + } + }) + }) + } +} diff --git a/api/vendor/go.uber.org/zap/zapcore/sampler_test.go b/api/vendor/go.uber.org/zap/zapcore/sampler_test.go new file mode 100644 index 0000000..9ba278b --- /dev/null +++ b/api/vendor/go.uber.org/zap/zapcore/sampler_test.go @@ -0,0 +1,225 @@ +// 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 +// 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. + +package zapcore_test + +import ( + "fmt" + "sync" + "testing" + "time" + + "go.uber.org/atomic" + "go.uber.org/zap/internal/ztest" + . "go.uber.org/zap/zapcore" + "go.uber.org/zap/zaptest/observer" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func fakeSampler(lvl LevelEnabler, tick time.Duration, first, thereafter int) (Core, *observer.ObservedLogs) { + core, logs := observer.New(lvl) + core = NewSampler(core, tick, first, thereafter) + return core, logs +} + +func assertSequence(t testing.TB, logs []observer.LoggedEntry, lvl Level, seq ...int64) { + seen := make([]int64, len(logs)) + for i, entry := range logs { + require.Equal(t, "", entry.Message, "Message wasn't created by writeSequence.") + require.Equal(t, 1, len(entry.Context), "Unexpected number of fields.") + require.Equal(t, lvl, entry.Level, "Unexpected level.") + f := entry.Context[0] + require.Equal(t, "iter", f.Key, "Unexpected field key.") + require.Equal(t, Int64Type, f.Type, "Unexpected field type") + seen[i] = f.Integer + } + assert.Equal(t, seq, seen, "Unexpected sequence logged at level %v.", lvl) +} + +func writeSequence(core Core, n int, lvl Level) { + // All tests using writeSequence verify that counters are shared between + // parent and child cores. + core = core.With([]Field{makeInt64Field("iter", n)}) + if ce := core.Check(Entry{Level: lvl, Time: time.Now()}, nil); ce != nil { + ce.Write() + } +} + +func TestSampler(t *testing.T) { + for _, lvl := range []Level{DebugLevel, InfoLevel, WarnLevel, ErrorLevel, DPanicLevel, PanicLevel, FatalLevel} { + sampler, logs := fakeSampler(DebugLevel, time.Minute, 2, 3) + + // Ensure that counts aren't shared between levels. + probeLevel := DebugLevel + if lvl == DebugLevel { + probeLevel = InfoLevel + } + for i := 0; i < 10; i++ { + writeSequence(sampler, 1, probeLevel) + } + // Clear any output. + logs.TakeAll() + + for i := 1; i < 10; i++ { + writeSequence(sampler, i, lvl) + } + assertSequence(t, logs.TakeAll(), lvl, 1, 2, 5, 8) + } +} + +func TestSamplerDisabledLevels(t *testing.T) { + sampler, logs := fakeSampler(InfoLevel, time.Minute, 1, 100) + + // Shouldn't be counted, because debug logging isn't enabled. + writeSequence(sampler, 1, DebugLevel) + writeSequence(sampler, 2, InfoLevel) + assertSequence(t, logs.TakeAll(), InfoLevel, 2) +} + +func TestSamplerTicking(t *testing.T) { + // Ensure that we're resetting the sampler's counter every tick. + sampler, logs := fakeSampler(DebugLevel, 10*time.Millisecond, 5, 10) + + // If we log five or fewer messages every tick, none of them should be + // dropped. + for tick := 0; tick < 2; tick++ { + for i := 1; i <= 5; i++ { + writeSequence(sampler, i, InfoLevel) + } + ztest.Sleep(15 * time.Millisecond) + } + assertSequence( + t, + logs.TakeAll(), + InfoLevel, + 1, 2, 3, 4, 5, // first tick + 1, 2, 3, 4, 5, // second tick + ) + + // If we log quickly, we should drop some logs. The first five statements + // each tick should be logged, then every tenth. + for tick := 0; tick < 3; tick++ { + for i := 1; i < 18; i++ { + writeSequence(sampler, i, InfoLevel) + } + ztest.Sleep(10 * time.Millisecond) + } + + assertSequence( + t, + logs.TakeAll(), + InfoLevel, + 1, 2, 3, 4, 5, 15, // first tick + 1, 2, 3, 4, 5, 15, // second tick + 1, 2, 3, 4, 5, 15, // third tick + ) +} + +type countingCore struct { + logs atomic.Uint32 +} + +func (c *countingCore) Check(ent Entry, ce *CheckedEntry) *CheckedEntry { + return ce.AddCore(ent, c) +} + +func (c *countingCore) Write(Entry, []Field) error { + c.logs.Inc() + return nil +} + +func (c *countingCore) With([]Field) Core { return c } +func (*countingCore) Enabled(Level) bool { return true } +func (*countingCore) Sync() error { return nil } + +func TestSamplerConcurrent(t *testing.T) { + const ( + logsPerTick = 10 + numMessages = 5 + numTicks = 25 + numGoroutines = 10 + expectedCount = numMessages * logsPerTick * numTicks + ) + + tick := ztest.Timeout(10 * time.Millisecond) + cc := &countingCore{} + sampler := NewSampler(cc, tick, logsPerTick, 100000) + + var ( + done atomic.Bool + wg sync.WaitGroup + ) + for i := 0; i < numGoroutines; i++ { + wg.Add(1) + go func(i int) { + defer wg.Done() + + for { + if done.Load() { + return + } + msg := fmt.Sprintf("msg%v", i%numMessages) + ent := Entry{Level: DebugLevel, Message: msg, Time: time.Now()} + if ce := sampler.Check(ent, nil); ce != nil { + ce.Write() + } + + // Give a chance for other goroutines to run. + time.Sleep(time.Microsecond) + } + }(i) + } + + time.AfterFunc(numTicks*tick, func() { + done.Store(true) + }) + wg.Wait() + + assert.InDelta( + t, + expectedCount, + cc.logs.Load(), + expectedCount/10, + "Unexpected number of logs", + ) +} + +func TestSamplerRaces(t *testing.T) { + sampler, _ := fakeSampler(DebugLevel, time.Minute, 1, 1000) + + var wg sync.WaitGroup + start := make(chan struct{}) + + for i := 0; i < 100; i++ { + wg.Add(1) + go func() { + <-start + for j := 0; j < 100; j++ { + writeSequence(sampler, j, InfoLevel) + } + wg.Done() + }() + } + + close(start) + wg.Wait() +} diff --git a/api/vendor/go.uber.org/zap/zapcore/tee.go b/api/vendor/go.uber.org/zap/zapcore/tee.go new file mode 100644 index 0000000..07a32ee --- /dev/null +++ b/api/vendor/go.uber.org/zap/zapcore/tee.go @@ -0,0 +1,81 @@ +// 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 +// 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. + +package zapcore + +import "go.uber.org/multierr" + +type multiCore []Core + +// NewTee creates a Core that duplicates log entries into two or more +// underlying Cores. +// +// Calling it with a single Core returns the input unchanged, and calling +// it with no input returns a no-op Core. +func NewTee(cores ...Core) Core { + switch len(cores) { + case 0: + return NewNopCore() + case 1: + return cores[0] + default: + return multiCore(cores) + } +} + +func (mc multiCore) With(fields []Field) Core { + clone := make(multiCore, len(mc)) + for i := range mc { + clone[i] = mc[i].With(fields) + } + return clone +} + +func (mc multiCore) Enabled(lvl Level) bool { + for i := range mc { + if mc[i].Enabled(lvl) { + return true + } + } + return false +} + +func (mc multiCore) Check(ent Entry, ce *CheckedEntry) *CheckedEntry { + for i := range mc { + ce = mc[i].Check(ent, ce) + } + return ce +} + +func (mc multiCore) Write(ent Entry, fields []Field) error { + var err error + for i := range mc { + err = multierr.Append(err, mc[i].Write(ent, fields)) + } + return err +} + +func (mc multiCore) Sync() error { + var err error + for i := range mc { + err = multierr.Append(err, mc[i].Sync()) + } + return err +} diff --git a/api/vendor/go.uber.org/zap/zapcore/tee_logger_bench_test.go b/api/vendor/go.uber.org/zap/zapcore/tee_logger_bench_test.go new file mode 100644 index 0000000..b30a173 --- /dev/null +++ b/api/vendor/go.uber.org/zap/zapcore/tee_logger_bench_test.go @@ -0,0 +1,62 @@ +// 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 +// 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. + +package zapcore_test + +import ( + "testing" + + "go.uber.org/zap/internal/ztest" + . "go.uber.org/zap/zapcore" +) + +func withBenchedTee(b *testing.B, f func(Core)) { + fac := NewTee( + NewCore(NewJSONEncoder(testEncoderConfig()), &ztest.Discarder{}, DebugLevel), + NewCore(NewJSONEncoder(testEncoderConfig()), &ztest.Discarder{}, InfoLevel), + ) + b.ResetTimer() + f(fac) +} + +func BenchmarkTeeCheck(b *testing.B) { + cases := []struct { + lvl Level + msg string + }{ + {DebugLevel, "foo"}, + {InfoLevel, "bar"}, + {WarnLevel, "baz"}, + {ErrorLevel, "babble"}, + } + withBenchedTee(b, func(core Core) { + b.RunParallel(func(pb *testing.PB) { + i := 0 + for pb.Next() { + tt := cases[i] + entry := Entry{Level: tt.lvl, Message: tt.msg} + if cm := core.Check(entry, nil); cm != nil { + cm.Write(Field{Key: "i", Integer: int64(i), Type: Int64Type}) + } + i = (i + 1) % len(cases) + } + }) + }) +} diff --git a/api/vendor/go.uber.org/zap/zapcore/tee_test.go b/api/vendor/go.uber.org/zap/zapcore/tee_test.go new file mode 100644 index 0000000..e44c21c --- /dev/null +++ b/api/vendor/go.uber.org/zap/zapcore/tee_test.go @@ -0,0 +1,153 @@ +// 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 +// 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. + +package zapcore_test + +import ( + "errors" + "testing" + + "go.uber.org/zap/internal/ztest" + . "go.uber.org/zap/zapcore" + "go.uber.org/zap/zaptest/observer" + + "github.com/stretchr/testify/assert" +) + +func withTee(f func(core Core, debugLogs, warnLogs *observer.ObservedLogs)) { + debugLogger, debugLogs := observer.New(DebugLevel) + warnLogger, warnLogs := observer.New(WarnLevel) + tee := NewTee(debugLogger, warnLogger) + f(tee, debugLogs, warnLogs) +} + +func TestTeeUnusualInput(t *testing.T) { + // Verify that Tee handles receiving one and no inputs correctly. + t.Run("one input", func(t *testing.T) { + obs, _ := observer.New(DebugLevel) + assert.Equal(t, obs, NewTee(obs), "Expected to return single inputs unchanged.") + }) + t.Run("no input", func(t *testing.T) { + assert.Equal(t, NewNopCore(), NewTee(), "Expected to return NopCore.") + }) +} + +func TestTeeCheck(t *testing.T) { + withTee(func(tee Core, debugLogs, warnLogs *observer.ObservedLogs) { + debugEntry := Entry{Level: DebugLevel, Message: "log-at-debug"} + infoEntry := Entry{Level: InfoLevel, Message: "log-at-info"} + warnEntry := Entry{Level: WarnLevel, Message: "log-at-warn"} + errorEntry := Entry{Level: ErrorLevel, Message: "log-at-error"} + for _, ent := range []Entry{debugEntry, infoEntry, warnEntry, errorEntry} { + if ce := tee.Check(ent, nil); ce != nil { + ce.Write() + } + } + + assert.Equal(t, []observer.LoggedEntry{ + {Entry: debugEntry, Context: []Field{}}, + {Entry: infoEntry, Context: []Field{}}, + {Entry: warnEntry, Context: []Field{}}, + {Entry: errorEntry, Context: []Field{}}, + }, debugLogs.All()) + + assert.Equal(t, []observer.LoggedEntry{ + {Entry: warnEntry, Context: []Field{}}, + {Entry: errorEntry, Context: []Field{}}, + }, warnLogs.All()) + }) +} + +func TestTeeWrite(t *testing.T) { + // Calling the tee's Write method directly should always log, regardless of + // the configured level. + withTee(func(tee Core, debugLogs, warnLogs *observer.ObservedLogs) { + debugEntry := Entry{Level: DebugLevel, Message: "log-at-debug"} + warnEntry := Entry{Level: WarnLevel, Message: "log-at-warn"} + for _, ent := range []Entry{debugEntry, warnEntry} { + tee.Write(ent, nil) + } + + for _, logs := range []*observer.ObservedLogs{debugLogs, warnLogs} { + assert.Equal(t, []observer.LoggedEntry{ + {Entry: debugEntry, Context: []Field{}}, + {Entry: warnEntry, Context: []Field{}}, + }, logs.All()) + } + }) +} + +func TestTeeWith(t *testing.T) { + withTee(func(tee Core, debugLogs, warnLogs *observer.ObservedLogs) { + f := makeInt64Field("k", 42) + tee = tee.With([]Field{f}) + ent := Entry{Level: WarnLevel, Message: "log-at-warn"} + if ce := tee.Check(ent, nil); ce != nil { + ce.Write() + } + + for _, logs := range []*observer.ObservedLogs{debugLogs, warnLogs} { + assert.Equal(t, []observer.LoggedEntry{ + {Entry: ent, Context: []Field{f}}, + }, logs.All()) + } + }) +} + +func TestTeeEnabled(t *testing.T) { + infoLogger, _ := observer.New(InfoLevel) + warnLogger, _ := observer.New(WarnLevel) + tee := NewTee(infoLogger, warnLogger) + tests := []struct { + lvl Level + enabled bool + }{ + {DebugLevel, false}, + {InfoLevel, true}, + {WarnLevel, true}, + {ErrorLevel, true}, + {DPanicLevel, true}, + {PanicLevel, true}, + {FatalLevel, true}, + } + + for _, tt := range tests { + assert.Equal(t, tt.enabled, tee.Enabled(tt.lvl), "Unexpected Enabled result for level %s.", tt.lvl) + } +} + +func TestTeeSync(t *testing.T) { + infoLogger, _ := observer.New(InfoLevel) + warnLogger, _ := observer.New(WarnLevel) + tee := NewTee(infoLogger, warnLogger) + assert.NoError(t, tee.Sync(), "Unexpected error from Syncing a tee.") + + sink := &ztest.Discarder{} + err := errors.New("failed") + sink.SetError(err) + + noSync := NewCore( + NewJSONEncoder(testEncoderConfig()), + sink, + DebugLevel, + ) + tee = NewTee(tee, noSync) + assert.Equal(t, err, tee.Sync(), "Expected an error when part of tee can't Sync.") +} diff --git a/api/vendor/go.uber.org/zap/zapcore/write_syncer.go b/api/vendor/go.uber.org/zap/zapcore/write_syncer.go new file mode 100644 index 0000000..209e25f --- /dev/null +++ b/api/vendor/go.uber.org/zap/zapcore/write_syncer.go @@ -0,0 +1,123 @@ +// 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 +// 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. + +package zapcore + +import ( + "io" + "sync" + + "go.uber.org/multierr" +) + +// A WriteSyncer is an io.Writer that can also flush any buffered data. Note +// that *os.File (and thus, os.Stderr and os.Stdout) implement WriteSyncer. +type WriteSyncer interface { + io.Writer + Sync() error +} + +// AddSync converts an io.Writer to a WriteSyncer. It attempts to be +// intelligent: if the concrete type of the io.Writer implements WriteSyncer, +// we'll use the existing Sync method. If it doesn't, we'll add a no-op Sync. +func AddSync(w io.Writer) WriteSyncer { + switch w := w.(type) { + case WriteSyncer: + return w + default: + return writerWrapper{w} + } +} + +type lockedWriteSyncer struct { + sync.Mutex + ws WriteSyncer +} + +// Lock wraps a WriteSyncer in a mutex to make it safe for concurrent use. In +// particular, *os.Files must be locked before use. +func Lock(ws WriteSyncer) WriteSyncer { + if _, ok := ws.(*lockedWriteSyncer); ok { + // no need to layer on another lock + return ws + } + return &lockedWriteSyncer{ws: ws} +} + +func (s *lockedWriteSyncer) Write(bs []byte) (int, error) { + s.Lock() + n, err := s.ws.Write(bs) + s.Unlock() + return n, err +} + +func (s *lockedWriteSyncer) Sync() error { + s.Lock() + err := s.ws.Sync() + s.Unlock() + return err +} + +type writerWrapper struct { + io.Writer +} + +func (w writerWrapper) Sync() error { + return nil +} + +type multiWriteSyncer []WriteSyncer + +// NewMultiWriteSyncer creates a WriteSyncer that duplicates its writes +// and sync calls, much like io.MultiWriter. +func NewMultiWriteSyncer(ws ...WriteSyncer) WriteSyncer { + if len(ws) == 1 { + return ws[0] + } + // Copy to protect against https://github.com/golang/go/issues/7809 + return multiWriteSyncer(append([]WriteSyncer(nil), ws...)) +} + +// See https://golang.org/src/io/multi.go +// When not all underlying syncers write the same number of bytes, +// the smallest number is returned even though Write() is called on +// all of them. +func (ws multiWriteSyncer) Write(p []byte) (int, error) { + var writeErr error + nWritten := 0 + for _, w := range ws { + n, err := w.Write(p) + writeErr = multierr.Append(writeErr, err) + if nWritten == 0 && n != 0 { + nWritten = n + } else if n < nWritten { + nWritten = n + } + } + return nWritten, writeErr +} + +func (ws multiWriteSyncer) Sync() error { + var err error + for _, w := range ws { + err = multierr.Append(err, w.Sync()) + } + return err +} diff --git a/api/vendor/go.uber.org/zap/zapcore/write_syncer_bench_test.go b/api/vendor/go.uber.org/zap/zapcore/write_syncer_bench_test.go new file mode 100644 index 0000000..0209d0f --- /dev/null +++ b/api/vendor/go.uber.org/zap/zapcore/write_syncer_bench_test.go @@ -0,0 +1,56 @@ +// 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 +// 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. + +package zapcore + +import ( + "testing" + + "go.uber.org/zap/internal/ztest" +) + +func BenchmarkMultiWriteSyncer(b *testing.B) { + b.Run("2", func(b *testing.B) { + w := NewMultiWriteSyncer( + &ztest.Discarder{}, + &ztest.Discarder{}, + ) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + w.Write([]byte("foobarbazbabble")) + } + }) + }) + b.Run("4", func(b *testing.B) { + w := NewMultiWriteSyncer( + &ztest.Discarder{}, + &ztest.Discarder{}, + &ztest.Discarder{}, + &ztest.Discarder{}, + ) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + w.Write([]byte("foobarbazbabble")) + } + }) + }) +} diff --git a/api/vendor/go.uber.org/zap/zapcore/write_syncer_test.go b/api/vendor/go.uber.org/zap/zapcore/write_syncer_test.go new file mode 100644 index 0000000..3ccb0af --- /dev/null +++ b/api/vendor/go.uber.org/zap/zapcore/write_syncer_test.go @@ -0,0 +1,137 @@ +// 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 +// 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. + +package zapcore + +import ( + "bytes" + "errors" + "testing" + + "io" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.uber.org/zap/internal/ztest" +) + +type writeSyncSpy struct { + io.Writer + ztest.Syncer +} + +func requireWriteWorks(t testing.TB, ws WriteSyncer) { + n, err := ws.Write([]byte("foo")) + require.NoError(t, err, "Unexpected error writing to WriteSyncer.") + require.Equal(t, 3, n, "Wrote an unexpected number of bytes.") +} + +func TestAddSyncWriteSyncer(t *testing.T) { + buf := &bytes.Buffer{} + concrete := &writeSyncSpy{Writer: buf} + ws := AddSync(concrete) + requireWriteWorks(t, ws) + + require.NoError(t, ws.Sync(), "Unexpected error syncing a WriteSyncer.") + require.True(t, concrete.Called(), "Expected to dispatch to concrete type's Sync method.") + + concrete.SetError(errors.New("fail")) + assert.Error(t, ws.Sync(), "Expected to propagate errors from concrete type's Sync method.") +} + +func TestAddSyncWriter(t *testing.T) { + // If we pass a plain io.Writer, make sure that we still get a WriteSyncer + // with a no-op Sync. + buf := &bytes.Buffer{} + ws := AddSync(buf) + requireWriteWorks(t, ws) + assert.NoError(t, ws.Sync(), "Unexpected error calling a no-op Sync method.") +} + +func TestNewMultiWriteSyncerWorksForSingleWriter(t *testing.T) { + w := &ztest.Buffer{} + + ws := NewMultiWriteSyncer(w) + assert.Equal(t, w, ws, "Expected NewMultiWriteSyncer to return the same WriteSyncer object for a single argument.") + + ws.Sync() + assert.True(t, w.Called(), "Expected Sync to be called on the created WriteSyncer") +} + +func TestMultiWriteSyncerWritesBoth(t *testing.T) { + first := &bytes.Buffer{} + second := &bytes.Buffer{} + ws := NewMultiWriteSyncer(AddSync(first), AddSync(second)) + + msg := []byte("dumbledore") + n, err := ws.Write(msg) + require.NoError(t, err, "Expected successful buffer write") + assert.Equal(t, len(msg), n) + + assert.Equal(t, msg, first.Bytes()) + assert.Equal(t, msg, second.Bytes()) +} + +func TestMultiWriteSyncerFailsWrite(t *testing.T) { + ws := NewMultiWriteSyncer(AddSync(&ztest.FailWriter{})) + _, err := ws.Write([]byte("test")) + assert.Error(t, err, "Write error should propagate") +} + +func TestMultiWriteSyncerFailsShortWrite(t *testing.T) { + ws := NewMultiWriteSyncer(AddSync(&ztest.ShortWriter{})) + n, err := ws.Write([]byte("test")) + assert.NoError(t, err, "Expected fake-success from short write") + assert.Equal(t, 3, n, "Expected byte count to return from underlying writer") +} + +func TestWritestoAllSyncs_EvenIfFirstErrors(t *testing.T) { + failer := &ztest.FailWriter{} + second := &bytes.Buffer{} + ws := NewMultiWriteSyncer(AddSync(failer), AddSync(second)) + + _, err := ws.Write([]byte("fail")) + assert.Error(t, err, "Expected error from call to a writer that failed") + assert.Equal(t, []byte("fail"), second.Bytes(), "Expected second sink to be written after first error") +} + +func TestMultiWriteSyncerSync_PropagatesErrors(t *testing.T) { + badsink := &ztest.Buffer{} + badsink.SetError(errors.New("sink is full")) + ws := NewMultiWriteSyncer(&ztest.Discarder{}, badsink) + + assert.Error(t, ws.Sync(), "Expected sync error to propagate") +} + +func TestMultiWriteSyncerSync_NoErrorsOnDiscard(t *testing.T) { + ws := NewMultiWriteSyncer(&ztest.Discarder{}) + assert.NoError(t, ws.Sync(), "Expected error-free sync to /dev/null") +} + +func TestMultiWriteSyncerSync_AllCalled(t *testing.T) { + failed, second := &ztest.Buffer{}, &ztest.Buffer{} + + failed.SetError(errors.New("disposal broken")) + ws := NewMultiWriteSyncer(failed, second) + + assert.Error(t, ws.Sync(), "Expected first sink to fail") + assert.True(t, failed.Called(), "Expected first sink to have Sync method called.") + assert.True(t, second.Called(), "Expected call to Sync even with first failure.") +} diff --git a/api/vendor/go.uber.org/zap/zapgrpc/zapgrpc.go b/api/vendor/go.uber.org/zap/zapgrpc/zapgrpc.go new file mode 100644 index 0000000..1181e6a --- /dev/null +++ b/api/vendor/go.uber.org/zap/zapgrpc/zapgrpc.go @@ -0,0 +1,100 @@ +// 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 +// 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. + +// Package zapgrpc provides a logger that is compatible with grpclog. +package zapgrpc // import "go.uber.org/zap/zapgrpc" + +import "go.uber.org/zap" + +// An Option overrides a Logger's default configuration. +type Option interface { + apply(*Logger) +} + +type optionFunc func(*Logger) + +func (f optionFunc) apply(log *Logger) { + f(log) +} + +// WithDebug configures a Logger to print at zap's DebugLevel instead of +// InfoLevel. +func WithDebug() Option { + return optionFunc(func(logger *Logger) { + logger.print = (*zap.SugaredLogger).Debug + logger.printf = (*zap.SugaredLogger).Debugf + }) +} + +// NewLogger returns a new Logger. +// +// By default, Loggers print at zap's InfoLevel. +func NewLogger(l *zap.Logger, options ...Option) *Logger { + logger := &Logger{ + log: l.Sugar(), + fatal: (*zap.SugaredLogger).Fatal, + fatalf: (*zap.SugaredLogger).Fatalf, + print: (*zap.SugaredLogger).Info, + printf: (*zap.SugaredLogger).Infof, + } + for _, option := range options { + option.apply(logger) + } + return logger +} + +// Logger adapts zap's Logger to be compatible with grpclog.Logger. +type Logger struct { + log *zap.SugaredLogger + fatal func(*zap.SugaredLogger, ...interface{}) + fatalf func(*zap.SugaredLogger, string, ...interface{}) + print func(*zap.SugaredLogger, ...interface{}) + printf func(*zap.SugaredLogger, string, ...interface{}) +} + +// Fatal implements grpclog.Logger. +func (l *Logger) Fatal(args ...interface{}) { + l.fatal(l.log, args...) +} + +// Fatalf implements grpclog.Logger. +func (l *Logger) Fatalf(format string, args ...interface{}) { + l.fatalf(l.log, format, args...) +} + +// Fatalln implements grpclog.Logger. +func (l *Logger) Fatalln(args ...interface{}) { + l.fatal(l.log, args...) +} + +// Print implements grpclog.Logger. +func (l *Logger) Print(args ...interface{}) { + l.print(l.log, args...) +} + +// Printf implements grpclog.Logger. +func (l *Logger) Printf(format string, args ...interface{}) { + l.printf(l.log, format, args...) +} + +// Println implements grpclog.Logger. +func (l *Logger) Println(args ...interface{}) { + l.print(l.log, args...) +} diff --git a/api/vendor/go.uber.org/zap/zapgrpc/zapgrpc_test.go b/api/vendor/go.uber.org/zap/zapgrpc/zapgrpc_test.go new file mode 100644 index 0000000..036f3d7 --- /dev/null +++ b/api/vendor/go.uber.org/zap/zapgrpc/zapgrpc_test.go @@ -0,0 +1,115 @@ +// 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 +// 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. + +package zapgrpc + +import ( + "testing" + + "go.uber.org/zap" + "go.uber.org/zap/zapcore" + "go.uber.org/zap/zaptest/observer" + + "github.com/stretchr/testify/require" +) + +func TestLoggerInfoExpected(t *testing.T) { + checkMessages(t, zapcore.DebugLevel, nil, zapcore.InfoLevel, []string{ + "hello", + "world", + "foo", + }, func(logger *Logger) { + logger.Print("hello") + logger.Printf("world") + logger.Println("foo") + }) +} + +func TestLoggerDebugExpected(t *testing.T) { + checkMessages(t, zapcore.DebugLevel, []Option{WithDebug()}, zapcore.DebugLevel, []string{ + "hello", + "world", + "foo", + }, func(logger *Logger) { + logger.Print("hello") + logger.Printf("world") + logger.Println("foo") + }) +} + +func TestLoggerDebugSuppressed(t *testing.T) { + checkMessages(t, zapcore.InfoLevel, []Option{WithDebug()}, zapcore.DebugLevel, nil, func(logger *Logger) { + logger.Print("hello") + logger.Printf("world") + logger.Println("foo") + }) +} + +func TestLoggerFatalExpected(t *testing.T) { + checkMessages(t, zapcore.DebugLevel, nil, zapcore.FatalLevel, []string{ + "hello", + "world", + "foo", + }, func(logger *Logger) { + logger.Fatal("hello") + logger.Fatalf("world") + logger.Fatalln("foo") + }) +} + +func checkMessages( + t testing.TB, + enab zapcore.LevelEnabler, + opts []Option, + expectedLevel zapcore.Level, + expectedMessages []string, + f func(*Logger), +) { + if expectedLevel == zapcore.FatalLevel { + expectedLevel = zapcore.WarnLevel + } + withLogger(enab, opts, func(logger *Logger, observedLogs *observer.ObservedLogs) { + f(logger) + logEntries := observedLogs.All() + require.Equal(t, len(expectedMessages), len(logEntries)) + for i, logEntry := range logEntries { + require.Equal(t, expectedLevel, logEntry.Level) + require.Equal(t, expectedMessages[i], logEntry.Message) + } + }) +} + +func withLogger( + enab zapcore.LevelEnabler, + opts []Option, + f func(*Logger, *observer.ObservedLogs), +) { + core, observedLogs := observer.New(enab) + f(NewLogger(zap.New(core), append(opts, withWarn())...), observedLogs) +} + +// withWarn redirects the fatal level to the warn level, which makes testing +// easier. +func withWarn() Option { + return optionFunc(func(logger *Logger) { + logger.fatal = (*zap.SugaredLogger).Warn + logger.fatalf = (*zap.SugaredLogger).Warnf + }) +} diff --git a/api/vendor/go.uber.org/zap/zaptest/doc.go b/api/vendor/go.uber.org/zap/zaptest/doc.go new file mode 100644 index 0000000..b377859 --- /dev/null +++ b/api/vendor/go.uber.org/zap/zaptest/doc.go @@ -0,0 +1,22 @@ +// 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 +// 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. + +// Package zaptest provides a variety of helpers for testing log output. +package zaptest // import "go.uber.org/zap/zaptest" diff --git a/api/vendor/go.uber.org/zap/zaptest/logger.go b/api/vendor/go.uber.org/zap/zaptest/logger.go new file mode 100644 index 0000000..80ace98 --- /dev/null +++ b/api/vendor/go.uber.org/zap/zaptest/logger.go @@ -0,0 +1,124 @@ +// Copyright (c) 2017 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. + +package zaptest + +import ( + "bytes" + + "go.uber.org/zap" + "go.uber.org/zap/zapcore" +) + +// LoggerOption configures the test logger built by NewLogger. +type LoggerOption interface { + applyLoggerOption(*loggerOptions) +} + +type loggerOptions struct { + Level zapcore.LevelEnabler +} + +type loggerOptionFunc func(*loggerOptions) + +func (f loggerOptionFunc) applyLoggerOption(opts *loggerOptions) { + f(opts) +} + +// Level controls which messages are logged by a test Logger built by +// NewLogger. +func Level(enab zapcore.LevelEnabler) LoggerOption { + return loggerOptionFunc(func(opts *loggerOptions) { + opts.Level = enab + }) +} + +// NewLogger builds a new Logger that logs all messages to the given +// testing.TB. +// +// logger := zaptest.NewLogger(t) +// +// Use this with a *testing.T or *testing.B to get logs which get printed only +// if a test fails or if you ran go test -v. +// +// The returned logger defaults to logging debug level messages and above. +// This may be changd by passing a zaptest.Level during construction. +// +// logger := zaptest.NewLogger(t, zaptest.Level(zap.WarnLevel)) +func NewLogger(t TestingT, opts ...LoggerOption) *zap.Logger { + cfg := loggerOptions{ + Level: zapcore.DebugLevel, + } + for _, o := range opts { + o.applyLoggerOption(&cfg) + } + + writer := newTestingWriter(t) + return zap.New( + zapcore.NewCore( + zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig()), + writer, + cfg.Level, + ), + + // Send zap errors to the same writer and mark the test as failed if + // that happens. + zap.ErrorOutput(writer.WithMarkFailed(true)), + ) +} + +// testingWriter is a WriteSyncer that writes to the given testing.TB. +type testingWriter struct { + t TestingT + + // If true, the test will be marked as failed if this testingWriter is + // ever used. + markFailed bool +} + +func newTestingWriter(t TestingT) testingWriter { + return testingWriter{t: t} +} + +// WithMarkFailed returns a copy of this testingWriter with markFailed set to +// the provided value. +func (w testingWriter) WithMarkFailed(v bool) testingWriter { + w.markFailed = v + return w +} + +func (w testingWriter) Write(p []byte) (n int, err error) { + n = len(p) + + // Strip trailing newline because t.Log always adds one. + p = bytes.TrimRight(p, "\n") + + // Note: t.Log is safe for concurrent use. + w.t.Logf("%s", p) + if w.markFailed { + w.t.Fail() + } + + return n, nil +} + +func (w testingWriter) Sync() error { + return nil +} diff --git a/api/vendor/go.uber.org/zap/zaptest/logger_test.go b/api/vendor/go.uber.org/zap/zaptest/logger_test.go new file mode 100644 index 0000000..b69aa28 --- /dev/null +++ b/api/vendor/go.uber.org/zap/zaptest/logger_test.go @@ -0,0 +1,169 @@ +// Copyright (c) 2017 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. + +package zaptest + +import ( + "errors" + "fmt" + "io" + "strings" + "testing" + + "go.uber.org/zap" + "go.uber.org/zap/internal/ztest" + "go.uber.org/zap/zapcore" + + "github.com/stretchr/testify/assert" +) + +func TestTestLogger(t *testing.T) { + ts := newTestLogSpy(t) + defer ts.AssertPassed() + + log := NewLogger(ts) + + log.Info("received work order") + log.Debug("starting work") + log.Warn("work may fail") + log.Error("work failed", zap.Error(errors.New("great sadness"))) + + assert.Panics(t, func() { + log.Panic("failed to do work") + }, "log.Panic should panic") + + ts.AssertMessages( + "INFO received work order", + "DEBUG starting work", + "WARN work may fail", + `ERROR work failed {"error": "great sadness"}`, + "PANIC failed to do work", + ) +} + +func TestTestLoggerSupportsLevels(t *testing.T) { + ts := newTestLogSpy(t) + defer ts.AssertPassed() + + log := NewLogger(ts, Level(zap.WarnLevel)) + + log.Info("received work order") + log.Debug("starting work") + log.Warn("work may fail") + log.Error("work failed", zap.Error(errors.New("great sadness"))) + + assert.Panics(t, func() { + log.Panic("failed to do work") + }, "log.Panic should panic") + + ts.AssertMessages( + "WARN work may fail", + `ERROR work failed {"error": "great sadness"}`, + "PANIC failed to do work", + ) +} + +func TestTestingWriter(t *testing.T) { + ts := newTestLogSpy(t) + w := newTestingWriter(ts) + + n, err := io.WriteString(w, "hello\n\n") + assert.NoError(t, err, "WriteString must not fail") + assert.Equal(t, 7, n) +} + +func TestTestLoggerErrorOutput(t *testing.T) { + // This test verifies that the test logger logs internal messages to the + // testing.T and marks the test as failed. + + ts := newTestLogSpy(t) + defer ts.AssertFailed() + + log := NewLogger(ts) + + // Replace with a core that fails. + log = log.WithOptions(zap.WrapCore(func(zapcore.Core) zapcore.Core { + return zapcore.NewCore( + zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig()), + zapcore.Lock(zapcore.AddSync(ztest.FailWriter{})), + zapcore.DebugLevel, + ) + })) + + log.Info("foo") // this fails + + if assert.Len(t, ts.Messages, 1, "expected a log message") { + assert.Regexp(t, `write error: failed`, ts.Messages[0]) + } +} + +// testLogSpy is a testing.TB that captures logged messages. +type testLogSpy struct { + testing.TB + + failed bool + Messages []string +} + +func newTestLogSpy(t testing.TB) *testLogSpy { + return &testLogSpy{TB: t} +} + +func (t *testLogSpy) Fail() { + t.failed = true +} + +func (t *testLogSpy) Failed() bool { + return t.failed +} + +func (t *testLogSpy) FailNow() { + t.Fail() + t.TB.FailNow() +} + +func (t *testLogSpy) Logf(format string, args ...interface{}) { + // Log messages are in the format, + // + // 2017-10-27T13:03:01.000-0700 DEBUG your message here {data here} + // + // We strip the first part of these messages because we can't really test + // for the timestamp from these tests. + m := fmt.Sprintf(format, args...) + m = m[strings.IndexByte(m, '\t')+1:] + t.Messages = append(t.Messages, m) + t.TB.Log(m) +} + +func (t *testLogSpy) AssertMessages(msgs ...string) { + assert.Equal(t.TB, msgs, t.Messages, "logged messages did not match") +} + +func (t *testLogSpy) AssertPassed() { + t.assertFailed(false, "expected test to pass") +} + +func (t *testLogSpy) AssertFailed() { + t.assertFailed(true, "expected test to fail") +} + +func (t *testLogSpy) assertFailed(v bool, msg string) { + assert.Equal(t.TB, v, t.failed, msg) +} diff --git a/api/vendor/go.uber.org/zap/zaptest/observer/logged_entry.go b/api/vendor/go.uber.org/zap/zaptest/observer/logged_entry.go new file mode 100644 index 0000000..a4ea7ec --- /dev/null +++ b/api/vendor/go.uber.org/zap/zaptest/observer/logged_entry.go @@ -0,0 +1,39 @@ +// Copyright (c) 2017 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. + +package observer + +import "go.uber.org/zap/zapcore" + +// An LoggedEntry is an encoding-agnostic representation of a log message. +// Field availability is context dependant. +type LoggedEntry struct { + zapcore.Entry + Context []zapcore.Field +} + +// ContextMap returns a map for all fields in Context. +func (e LoggedEntry) ContextMap() map[string]interface{} { + encoder := zapcore.NewMapObjectEncoder() + for _, f := range e.Context { + f.AddTo(encoder) + } + return encoder.Fields +} diff --git a/api/vendor/go.uber.org/zap/zaptest/observer/logged_entry_test.go b/api/vendor/go.uber.org/zap/zaptest/observer/logged_entry_test.go new file mode 100644 index 0000000..50f6123 --- /dev/null +++ b/api/vendor/go.uber.org/zap/zaptest/observer/logged_entry_test.go @@ -0,0 +1,88 @@ +// Copyright (c) 2017 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. + +package observer + +import ( + "testing" + + "go.uber.org/zap" + "go.uber.org/zap/zapcore" + + "github.com/stretchr/testify/assert" +) + +func TestLoggedEntryContextMap(t *testing.T) { + tests := []struct { + msg string + fields []zapcore.Field + want map[string]interface{} + }{ + { + msg: "no fields", + fields: nil, + want: map[string]interface{}{}, + }, + { + msg: "simple", + fields: []zapcore.Field{ + zap.String("k1", "v"), + zap.Int64("k2", 10), + }, + want: map[string]interface{}{ + "k1": "v", + "k2": int64(10), + }, + }, + { + msg: "overwrite", + fields: []zapcore.Field{ + zap.String("k1", "v1"), + zap.String("k1", "v2"), + }, + want: map[string]interface{}{ + "k1": "v2", + }, + }, + { + msg: "nested", + fields: []zapcore.Field{ + zap.String("k1", "v1"), + zap.Namespace("nested"), + zap.String("k2", "v2"), + }, + want: map[string]interface{}{ + "k1": "v1", + "nested": map[string]interface{}{ + "k2": "v2", + }, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.msg, func(t *testing.T) { + entry := LoggedEntry{ + Context: tt.fields, + } + assert.Equal(t, tt.want, entry.ContextMap()) + }) + } +} diff --git a/api/vendor/go.uber.org/zap/zaptest/observer/observer.go b/api/vendor/go.uber.org/zap/zaptest/observer/observer.go new file mode 100644 index 0000000..78f5be4 --- /dev/null +++ b/api/vendor/go.uber.org/zap/zaptest/observer/observer.go @@ -0,0 +1,167 @@ +// 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 +// 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. + +// Package observer provides a zapcore.Core that keeps an in-memory, +// encoding-agnostic repesentation of log entries. It's useful for +// applications that want to unit test their log output without tying their +// tests to a particular output encoding. +package observer // import "go.uber.org/zap/zaptest/observer" + +import ( + "strings" + "sync" + "time" + + "go.uber.org/zap/zapcore" +) + +// ObservedLogs is a concurrency-safe, ordered collection of observed logs. +type ObservedLogs struct { + mu sync.RWMutex + logs []LoggedEntry +} + +// Len returns the number of items in the collection. +func (o *ObservedLogs) Len() int { + o.mu.RLock() + n := len(o.logs) + o.mu.RUnlock() + return n +} + +// All returns a copy of all the observed logs. +func (o *ObservedLogs) All() []LoggedEntry { + o.mu.RLock() + ret := make([]LoggedEntry, len(o.logs)) + for i := range o.logs { + ret[i] = o.logs[i] + } + o.mu.RUnlock() + return ret +} + +// TakeAll returns a copy of all the observed logs, and truncates the observed +// slice. +func (o *ObservedLogs) TakeAll() []LoggedEntry { + o.mu.Lock() + ret := o.logs + o.logs = nil + o.mu.Unlock() + return ret +} + +// AllUntimed returns a copy of all the observed logs, but overwrites the +// observed timestamps with time.Time's zero value. This is useful when making +// assertions in tests. +func (o *ObservedLogs) AllUntimed() []LoggedEntry { + ret := o.All() + for i := range ret { + ret[i].Time = time.Time{} + } + return ret +} + +// FilterMessage filters entries to those that have the specified message. +func (o *ObservedLogs) FilterMessage(msg string) *ObservedLogs { + return o.filter(func(e LoggedEntry) bool { + return e.Message == msg + }) +} + +// FilterMessageSnippet filters entries to those that have a message containing the specified snippet. +func (o *ObservedLogs) FilterMessageSnippet(snippet string) *ObservedLogs { + return o.filter(func(e LoggedEntry) bool { + return strings.Contains(e.Message, snippet) + }) +} + +// FilterField filters entries to those that have the specified field. +func (o *ObservedLogs) FilterField(field zapcore.Field) *ObservedLogs { + return o.filter(func(e LoggedEntry) bool { + for _, ctxField := range e.Context { + if ctxField.Equals(field) { + return true + } + } + return false + }) +} + +func (o *ObservedLogs) filter(match func(LoggedEntry) bool) *ObservedLogs { + o.mu.RLock() + defer o.mu.RUnlock() + + var filtered []LoggedEntry + for _, entry := range o.logs { + if match(entry) { + filtered = append(filtered, entry) + } + } + return &ObservedLogs{logs: filtered} +} + +func (o *ObservedLogs) add(log LoggedEntry) { + o.mu.Lock() + o.logs = append(o.logs, log) + o.mu.Unlock() +} + +// New creates a new Core that buffers logs in memory (without any encoding). +// It's particularly useful in tests. +func New(enab zapcore.LevelEnabler) (zapcore.Core, *ObservedLogs) { + ol := &ObservedLogs{} + return &contextObserver{ + LevelEnabler: enab, + logs: ol, + }, ol +} + +type contextObserver struct { + zapcore.LevelEnabler + logs *ObservedLogs + context []zapcore.Field +} + +func (co *contextObserver) Check(ent zapcore.Entry, ce *zapcore.CheckedEntry) *zapcore.CheckedEntry { + if co.Enabled(ent.Level) { + return ce.AddCore(ent, co) + } + return ce +} + +func (co *contextObserver) With(fields []zapcore.Field) zapcore.Core { + return &contextObserver{ + LevelEnabler: co.LevelEnabler, + logs: co.logs, + context: append(co.context[:len(co.context):len(co.context)], fields...), + } +} + +func (co *contextObserver) Write(ent zapcore.Entry, fields []zapcore.Field) error { + all := make([]zapcore.Field, 0, len(fields)+len(co.context)) + all = append(all, co.context...) + all = append(all, fields...) + co.logs.add(LoggedEntry{ent, all}) + return nil +} + +func (co *contextObserver) Sync() error { + return nil +} diff --git a/api/vendor/go.uber.org/zap/zaptest/observer/observer_test.go b/api/vendor/go.uber.org/zap/zaptest/observer/observer_test.go new file mode 100644 index 0000000..e1a0da7 --- /dev/null +++ b/api/vendor/go.uber.org/zap/zaptest/observer/observer_test.go @@ -0,0 +1,215 @@ +// 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 +// 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. + +package observer_test + +import ( + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "go.uber.org/zap" + "go.uber.org/zap/zapcore" + . "go.uber.org/zap/zaptest/observer" +) + +func assertEmpty(t testing.TB, logs *ObservedLogs) { + assert.Equal(t, 0, logs.Len(), "Expected empty ObservedLogs to have zero length.") + assert.Equal(t, []LoggedEntry{}, logs.All(), "Unexpected LoggedEntries in empty ObservedLogs.") +} + +func TestObserver(t *testing.T) { + observer, logs := New(zap.InfoLevel) + assertEmpty(t, logs) + + assert.NoError(t, observer.Sync(), "Unexpected failure in no-op Sync") + + obs := zap.New(observer).With(zap.Int("i", 1)) + obs.Info("foo") + obs.Debug("bar") + want := []LoggedEntry{{ + Entry: zapcore.Entry{Level: zap.InfoLevel, Message: "foo"}, + Context: []zapcore.Field{zap.Int("i", 1)}, + }} + + assert.Equal(t, 1, logs.Len(), "Unexpected observed logs Len.") + assert.Equal(t, want, logs.AllUntimed(), "Unexpected contents from AllUntimed.") + + all := logs.All() + require.Equal(t, 1, len(all), "Unexpected numbed of LoggedEntries returned from All.") + assert.NotEqual(t, time.Time{}, all[0].Time, "Expected non-zero time on LoggedEntry.") + + // copy & zero time for stable assertions + untimed := append([]LoggedEntry{}, all...) + untimed[0].Time = time.Time{} + assert.Equal(t, want, untimed, "Unexpected LoggedEntries from All.") + + assert.Equal(t, all, logs.TakeAll(), "Expected All and TakeAll to return identical results.") + assertEmpty(t, logs) +} + +func TestObserverWith(t *testing.T) { + sf1, logs := New(zap.InfoLevel) + + // need to pad out enough initial fields so that the underlying slice cap() + // gets ahead of its len() so that the sf3/4 With append's could choose + // not to copy (if the implementation doesn't force them) + sf1 = sf1.With([]zapcore.Field{zap.Int("a", 1), zap.Int("b", 2)}) + + sf2 := sf1.With([]zapcore.Field{zap.Int("c", 3)}) + sf3 := sf2.With([]zapcore.Field{zap.Int("d", 4)}) + sf4 := sf2.With([]zapcore.Field{zap.Int("e", 5)}) + ent := zapcore.Entry{Level: zap.InfoLevel, Message: "hello"} + + for i, core := range []zapcore.Core{sf2, sf3, sf4} { + if ce := core.Check(ent, nil); ce != nil { + ce.Write(zap.Int("i", i)) + } + } + + assert.Equal(t, []LoggedEntry{ + { + Entry: ent, + Context: []zapcore.Field{ + zap.Int("a", 1), + zap.Int("b", 2), + zap.Int("c", 3), + zap.Int("i", 0), + }, + }, + { + Entry: ent, + Context: []zapcore.Field{ + zap.Int("a", 1), + zap.Int("b", 2), + zap.Int("c", 3), + zap.Int("d", 4), + zap.Int("i", 1), + }, + }, + { + Entry: ent, + Context: []zapcore.Field{ + zap.Int("a", 1), + zap.Int("b", 2), + zap.Int("c", 3), + zap.Int("e", 5), + zap.Int("i", 2), + }, + }, + }, logs.All(), "expected no field sharing between With siblings") +} + +func TestFilters(t *testing.T) { + logs := []LoggedEntry{ + { + Entry: zapcore.Entry{Level: zap.InfoLevel, Message: "log a"}, + Context: []zapcore.Field{zap.String("fStr", "1"), zap.Int("a", 1)}, + }, + { + Entry: zapcore.Entry{Level: zap.InfoLevel, Message: "log a"}, + Context: []zapcore.Field{zap.String("fStr", "2"), zap.Int("b", 2)}, + }, + { + Entry: zapcore.Entry{Level: zap.InfoLevel, Message: "log b"}, + Context: []zapcore.Field{zap.Int("a", 1), zap.Int("b", 2)}, + }, + { + Entry: zapcore.Entry{Level: zap.InfoLevel, Message: "log c"}, + Context: []zapcore.Field{zap.Int("a", 1), zap.Namespace("ns"), zap.Int("a", 2)}, + }, + { + Entry: zapcore.Entry{Level: zap.InfoLevel, Message: "msg 1"}, + Context: []zapcore.Field{zap.Int("a", 1), zap.Namespace("ns")}, + }, + { + Entry: zapcore.Entry{Level: zap.InfoLevel, Message: "any map"}, + Context: []zapcore.Field{zap.Any("map", map[string]string{"a": "b"})}, + }, + { + Entry: zapcore.Entry{Level: zap.InfoLevel, Message: "any slice"}, + Context: []zapcore.Field{zap.Any("slice", []string{"a"})}, + }, + } + + logger, sink := New(zap.InfoLevel) + for _, log := range logs { + logger.Write(log.Entry, log.Context) + } + + tests := []struct { + msg string + filtered *ObservedLogs + want []LoggedEntry + }{ + { + msg: "filter by message", + filtered: sink.FilterMessage("log a"), + want: logs[0:2], + }, + { + msg: "filter by field", + filtered: sink.FilterField(zap.String("fStr", "1")), + want: logs[0:1], + }, + { + msg: "filter by message and field", + filtered: sink.FilterMessage("log a").FilterField(zap.Int("b", 2)), + want: logs[1:2], + }, + { + msg: "filter by field with duplicate fields", + filtered: sink.FilterField(zap.Int("a", 2)), + want: logs[3:4], + }, + { + msg: "filter doesn't match any messages", + filtered: sink.FilterMessage("no match"), + want: []LoggedEntry{}, + }, + { + msg: "filter by snippet", + filtered: sink.FilterMessageSnippet("log"), + want: logs[0:4], + }, + { + msg: "filter by snippet and field", + filtered: sink.FilterMessageSnippet("a").FilterField(zap.Int("b", 2)), + want: logs[1:2], + }, + { + msg: "filter for map", + filtered: sink.FilterField(zap.Any("map", map[string]string{"a": "b"})), + want: logs[5:6], + }, + { + msg: "filter for slice", + filtered: sink.FilterField(zap.Any("slice", []string{"a"})), + want: logs[6:7], + }, + } + + for _, tt := range tests { + got := tt.filtered.AllUntimed() + assert.Equal(t, tt.want, got, tt.msg) + } +} diff --git a/api/vendor/go.uber.org/zap/zaptest/testingt.go b/api/vendor/go.uber.org/zap/zaptest/testingt.go new file mode 100644 index 0000000..792463b --- /dev/null +++ b/api/vendor/go.uber.org/zap/zaptest/testingt.go @@ -0,0 +1,47 @@ +// Copyright (c) 2017 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. + +package zaptest + +// TestingT is a subset of the API provided by all *testing.T and *testing.B +// objects. +type TestingT interface { + // Logs the given message without failing the test. + Logf(string, ...interface{}) + + // Logs the given message and marks the test as failed. + Errorf(string, ...interface{}) + + // Marks the test as failed. + Fail() + + // Returns true if the test has been marked as failed. + Failed() bool + + // Returns the name of the test. + Name() string + + // Marks the test as failed and stops execution of that test. + FailNow() +} + +// Note: We currently only rely on Logf. We are including Errorf and FailNow +// in the interface in anticipation of future need since we can't extend the +// interface without a breaking change. diff --git a/api/vendor/go.uber.org/zap/zaptest/testingt_test.go b/api/vendor/go.uber.org/zap/zaptest/testingt_test.go new file mode 100644 index 0000000..d847796 --- /dev/null +++ b/api/vendor/go.uber.org/zap/zaptest/testingt_test.go @@ -0,0 +1,29 @@ +// Copyright (c) 2017 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. + +package zaptest + +import "testing" + +// Just a compile-time test to ensure that TestingT matches the testing.TB +// interface. We could do this in testingt.go but that would put a dependency +// on the "testing" package from zaptest. + +var _ TestingT = (testing.TB)(nil) diff --git a/api/vendor/go.uber.org/zap/zaptest/timeout.go b/api/vendor/go.uber.org/zap/zaptest/timeout.go new file mode 100644 index 0000000..f0be444 --- /dev/null +++ b/api/vendor/go.uber.org/zap/zaptest/timeout.go @@ -0,0 +1,45 @@ +// 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 +// 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. + +package zaptest + +import ( + "time" + + "go.uber.org/zap/internal/ztest" +) + +// Timeout scales the provided duration by $TEST_TIMEOUT_SCALE. +// +// Deprecated: This function is intended for internal testing and shouldn't be +// used outside zap itself. It was introduced before Go supported internal +// packages. +func Timeout(base time.Duration) time.Duration { + return ztest.Timeout(base) +} + +// Sleep scales the sleep duration by $TEST_TIMEOUT_SCALE. +// +// Deprecated: This function is intended for internal testing and shouldn't be +// used outside zap itself. It was introduced before Go supported internal +// packages. +func Sleep(base time.Duration) { + ztest.Sleep(base) +} diff --git a/api/vendor/go.uber.org/zap/zaptest/timeout_test.go b/api/vendor/go.uber.org/zap/zaptest/timeout_test.go new file mode 100644 index 0000000..3962ecd --- /dev/null +++ b/api/vendor/go.uber.org/zap/zaptest/timeout_test.go @@ -0,0 +1,43 @@ +// 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 +// 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. + +package zaptest + +import ( + "testing" + "time" + + "github.com/stretchr/testify/assert" + "go.uber.org/zap/internal/ztest" +) + +func TestTimeout(t *testing.T) { + defer ztest.Initialize("2")() + assert.Equal(t, time.Duration(100), Timeout(50), "Expected to scale up timeout.") +} + +func TestSleep(t *testing.T) { + defer ztest.Initialize("2")() + const sleepFor = 50 * time.Millisecond + now := time.Now() + Sleep(sleepFor) + elapsed := time.Since(now) + assert.True(t, 2*sleepFor <= elapsed, "Expected to scale up timeout.") +} diff --git a/api/vendor/go.uber.org/zap/zaptest/writer.go b/api/vendor/go.uber.org/zap/zaptest/writer.go new file mode 100644 index 0000000..0701630 --- /dev/null +++ b/api/vendor/go.uber.org/zap/zaptest/writer.go @@ -0,0 +1,44 @@ +// 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 +// 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. + +package zaptest + +import "go.uber.org/zap/internal/ztest" + +type ( + // A Syncer is a spy for the Sync portion of zapcore.WriteSyncer. + Syncer = ztest.Syncer + + // A Discarder sends all writes to ioutil.Discard. + Discarder = ztest.Discarder + + // FailWriter is a WriteSyncer that always returns an error on writes. + FailWriter = ztest.FailWriter + + // ShortWriter is a WriteSyncer whose write method never returns an error, + // but always reports that it wrote one byte less than the input slice's + // length (thus, a "short write"). + ShortWriter = ztest.ShortWriter + + // Buffer is an implementation of zapcore.WriteSyncer that sends all writes to + // a bytes.Buffer. It has convenience methods to split the accumulated buffer + // on newlines. + Buffer = ztest.Buffer +) diff --git a/api/vendor/go.uber.org/zap/zaptest/writer_test.go b/api/vendor/go.uber.org/zap/zaptest/writer_test.go new file mode 100644 index 0000000..c18f18a --- /dev/null +++ b/api/vendor/go.uber.org/zap/zaptest/writer_test.go @@ -0,0 +1,68 @@ +// 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 +// 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. + +package zaptest + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestSyncer(t *testing.T) { + err := errors.New("sentinel") + s := &Syncer{} + s.SetError(err) + assert.Equal(t, err, s.Sync(), "Expected Sync to fail with provided error.") + assert.True(t, s.Called(), "Expected to record that Sync was called.") +} + +func TestDiscarder(t *testing.T) { + d := &Discarder{} + payload := []byte("foo") + n, err := d.Write(payload) + assert.NoError(t, err, "Unexpected error writing to Discarder.") + assert.Equal(t, len(payload), n, "Wrong number of bytes written.") +} + +func TestFailWriter(t *testing.T) { + w := &FailWriter{} + payload := []byte("foo") + n, err := w.Write(payload) + assert.Error(t, err, "Expected an error writing to FailWriter.") + assert.Equal(t, len(payload), n, "Wrong number of bytes written.") +} + +func TestShortWriter(t *testing.T) { + w := &ShortWriter{} + payload := []byte("foo") + n, err := w.Write(payload) + assert.NoError(t, err, "Unexpected error writing to ShortWriter.") + assert.Equal(t, len(payload)-1, n, "Wrong number of bytes written.") +} + +func TestBuffer(t *testing.T) { + buf := &Buffer{} + buf.WriteString("foo\n") + buf.WriteString("bar\n") + assert.Equal(t, []string{"foo", "bar"}, buf.Lines(), "Unexpected output from Lines.") + assert.Equal(t, "foo\nbar", buf.Stripped(), "Unexpected output from Stripped.") +} diff --git a/api/vendor/golang.org/x/net/.gitattributes b/api/vendor/golang.org/x/net/.gitattributes new file mode 100644 index 0000000..d2f212e --- /dev/null +++ b/api/vendor/golang.org/x/net/.gitattributes @@ -0,0 +1,10 @@ +# Treat all files in this repo as binary, with no git magic updating +# line endings. Windows users contributing to Go will need to use a +# modern version of git and editors capable of LF line endings. +# +# We'll prevent accidental CRLF line endings from entering the repo +# via the git-review gofmt checks. +# +# See golang.org/issue/9281 + +* -text diff --git a/api/vendor/golang.org/x/net/.gitignore b/api/vendor/golang.org/x/net/.gitignore new file mode 100644 index 0000000..8339fd6 --- /dev/null +++ b/api/vendor/golang.org/x/net/.gitignore @@ -0,0 +1,2 @@ +# Add no patterns to .hgignore except for files generated by the build. +last-change diff --git a/api/vendor/golang.org/x/net/AUTHORS b/api/vendor/golang.org/x/net/AUTHORS new file mode 100644 index 0000000..15167cd --- /dev/null +++ b/api/vendor/golang.org/x/net/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 http://tip.golang.org/AUTHORS. diff --git a/api/vendor/golang.org/x/net/CONTRIBUTING.md b/api/vendor/golang.org/x/net/CONTRIBUTING.md new file mode 100644 index 0000000..d0485e8 --- /dev/null +++ b/api/vendor/golang.org/x/net/CONTRIBUTING.md @@ -0,0 +1,26 @@ +# Contributing to Go + +Go is an open source project. + +It is the work of hundreds of contributors. We appreciate your help! + +## Filing issues + +When [filing an issue](https://golang.org/issue/new), make sure to answer these five questions: + +1. What version of Go are you using (`go version`)? +2. What operating system and processor architecture are you using? +3. What did you do? +4. What did you expect to see? +5. What did you see instead? + +General questions should go to the [golang-nuts mailing list](https://groups.google.com/group/golang-nuts) instead of the issue tracker. +The gophers there will answer or ask you to file an issue if you've tripped over a bug. + +## Contributing code + +Please read the [Contribution Guidelines](https://golang.org/doc/contribute.html) +before sending patches. + +Unless otherwise noted, the Go source files are distributed under +the BSD-style license found in the LICENSE file. diff --git a/api/vendor/golang.org/x/net/CONTRIBUTORS b/api/vendor/golang.org/x/net/CONTRIBUTORS new file mode 100644 index 0000000..1c4577e --- /dev/null +++ b/api/vendor/golang.org/x/net/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 http://tip.golang.org/CONTRIBUTORS. diff --git a/api/vendor/golang.org/x/net/LICENSE b/api/vendor/golang.org/x/net/LICENSE new file mode 100644 index 0000000..6a66aea --- /dev/null +++ b/api/vendor/golang.org/x/net/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/api/vendor/golang.org/x/net/PATENTS b/api/vendor/golang.org/x/net/PATENTS new file mode 100644 index 0000000..7330990 --- /dev/null +++ b/api/vendor/golang.org/x/net/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/api/vendor/golang.org/x/net/README.md b/api/vendor/golang.org/x/net/README.md new file mode 100644 index 0000000..00a9b6e --- /dev/null +++ b/api/vendor/golang.org/x/net/README.md @@ -0,0 +1,16 @@ +# Go Networking + +This repository holds supplementary Go networking libraries. + +## Download/Install + +The easiest way to install is to run `go get -u golang.org/x/net`. You can +also manually git clone the repository to `$GOPATH/src/golang.org/x/net`. + +## Report Issues / Send Patches + +This repository uses Gerrit for code changes. To learn how to submit +changes to this repository, see https://golang.org/doc/contribute.html. +The main issue tracker for the net repository is located at +https://github.com/golang/go/issues. Prefix your issue with "x/net:" in the +subject line, so it is easy to find. diff --git a/api/vendor/golang.org/x/net/bpf/asm.go b/api/vendor/golang.org/x/net/bpf/asm.go new file mode 100644 index 0000000..15e21b1 --- /dev/null +++ b/api/vendor/golang.org/x/net/bpf/asm.go @@ -0,0 +1,41 @@ +// 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 bpf + +import "fmt" + +// Assemble converts insts into raw instructions suitable for loading +// into a BPF virtual machine. +// +// Currently, no optimization is attempted, the assembled program flow +// is exactly as provided. +func Assemble(insts []Instruction) ([]RawInstruction, error) { + ret := make([]RawInstruction, len(insts)) + var err error + for i, inst := range insts { + ret[i], err = inst.Assemble() + if err != nil { + return nil, fmt.Errorf("assembling instruction %d: %s", i+1, err) + } + } + return ret, nil +} + +// Disassemble attempts to parse raw back into +// Instructions. Unrecognized RawInstructions are assumed to be an +// extension not implemented by this package, and are passed through +// unchanged to the output. The allDecoded value reports whether insts +// contains no RawInstructions. +func Disassemble(raw []RawInstruction) (insts []Instruction, allDecoded bool) { + insts = make([]Instruction, len(raw)) + allDecoded = true + for i, r := range raw { + insts[i] = r.Disassemble() + if _, ok := insts[i].(RawInstruction); ok { + allDecoded = false + } + } + return insts, allDecoded +} diff --git a/api/vendor/golang.org/x/net/bpf/constants.go b/api/vendor/golang.org/x/net/bpf/constants.go new file mode 100644 index 0000000..b89ca35 --- /dev/null +++ b/api/vendor/golang.org/x/net/bpf/constants.go @@ -0,0 +1,218 @@ +// 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 bpf + +// A Register is a register of the BPF virtual machine. +type Register uint16 + +const ( + // RegA is the accumulator register. RegA is always the + // destination register of ALU operations. + RegA Register = iota + // RegX is the indirection register, used by LoadIndirect + // operations. + RegX +) + +// An ALUOp is an arithmetic or logic operation. +type ALUOp uint16 + +// ALU binary operation types. +const ( + ALUOpAdd ALUOp = iota << 4 + ALUOpSub + ALUOpMul + ALUOpDiv + ALUOpOr + ALUOpAnd + ALUOpShiftLeft + ALUOpShiftRight + aluOpNeg // Not exported because it's the only unary ALU operation, and gets its own instruction type. + ALUOpMod + ALUOpXor +) + +// A JumpTest is a comparison operator used in conditional jumps. +type JumpTest uint16 + +// Supported operators for conditional jumps. +const ( + // K == A + JumpEqual JumpTest = iota + // K != A + JumpNotEqual + // K > A + JumpGreaterThan + // K < A + JumpLessThan + // K >= A + JumpGreaterOrEqual + // K <= A + JumpLessOrEqual + // K & A != 0 + JumpBitsSet + // K & A == 0 + JumpBitsNotSet +) + +// An Extension is a function call provided by the kernel that +// performs advanced operations that are expensive or impossible +// within the BPF virtual machine. +// +// Extensions are only implemented by the Linux kernel. +// +// TODO: should we prune this list? Some of these extensions seem +// either broken or near-impossible to use correctly, whereas other +// (len, random, ifindex) are quite useful. +type Extension int + +// Extension functions available in the Linux kernel. +const ( + // extOffset is the negative maximum number of instructions used + // to load instructions by overloading the K argument. + extOffset = -0x1000 + // ExtLen returns the length of the packet. + ExtLen Extension = 1 + // ExtProto returns the packet's L3 protocol type. + ExtProto Extension = 0 + // ExtType returns the packet's type (skb->pkt_type in the kernel) + // + // TODO: better documentation. How nice an API do we want to + // provide for these esoteric extensions? + ExtType Extension = 4 + // ExtPayloadOffset returns the offset of the packet payload, or + // the first protocol header that the kernel does not know how to + // parse. + ExtPayloadOffset Extension = 52 + // ExtInterfaceIndex returns the index of the interface on which + // the packet was received. + ExtInterfaceIndex Extension = 8 + // ExtNetlinkAttr returns the netlink attribute of type X at + // offset A. + ExtNetlinkAttr Extension = 12 + // ExtNetlinkAttrNested returns the nested netlink attribute of + // type X at offset A. + ExtNetlinkAttrNested Extension = 16 + // ExtMark returns the packet's mark value. + ExtMark Extension = 20 + // ExtQueue returns the packet's assigned hardware queue. + ExtQueue Extension = 24 + // ExtLinkLayerType returns the packet's hardware address type + // (e.g. Ethernet, Infiniband). + ExtLinkLayerType Extension = 28 + // ExtRXHash returns the packets receive hash. + // + // TODO: figure out what this rxhash actually is. + ExtRXHash Extension = 32 + // ExtCPUID returns the ID of the CPU processing the current + // packet. + ExtCPUID Extension = 36 + // ExtVLANTag returns the packet's VLAN tag. + ExtVLANTag Extension = 44 + // ExtVLANTagPresent returns non-zero if the packet has a VLAN + // tag. + // + // TODO: I think this might be a lie: it reads bit 0x1000 of the + // VLAN header, which changed meaning in recent revisions of the + // spec - this extension may now return meaningless information. + ExtVLANTagPresent Extension = 48 + // ExtVLANProto returns 0x8100 if the frame has a VLAN header, + // 0x88a8 if the frame has a "Q-in-Q" double VLAN header, or some + // other value if no VLAN information is present. + ExtVLANProto Extension = 60 + // ExtRand returns a uniformly random uint32. + ExtRand Extension = 56 +) + +// The following gives names to various bit patterns used in opcode construction. + +const ( + opMaskCls uint16 = 0x7 + // opClsLoad masks + opMaskLoadDest = 0x01 + opMaskLoadWidth = 0x18 + opMaskLoadMode = 0xe0 + // opClsALU + opMaskOperandSrc = 0x08 + opMaskOperator = 0xf0 + // opClsJump + opMaskJumpConst = 0x0f + opMaskJumpCond = 0xf0 +) + +const ( + // +---------------+-----------------+---+---+---+ + // | AddrMode (3b) | LoadWidth (2b) | 0 | 0 | 0 | + // +---------------+-----------------+---+---+---+ + opClsLoadA uint16 = iota + // +---------------+-----------------+---+---+---+ + // | AddrMode (3b) | LoadWidth (2b) | 0 | 0 | 1 | + // +---------------+-----------------+---+---+---+ + opClsLoadX + // +---+---+---+---+---+---+---+---+ + // | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | + // +---+---+---+---+---+---+---+---+ + opClsStoreA + // +---+---+---+---+---+---+---+---+ + // | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | + // +---+---+---+---+---+---+---+---+ + opClsStoreX + // +---------------+-----------------+---+---+---+ + // | Operator (4b) | OperandSrc (1b) | 1 | 0 | 0 | + // +---------------+-----------------+---+---+---+ + opClsALU + // +-----------------------------+---+---+---+---+ + // | TestOperator (4b) | 0 | 1 | 0 | 1 | + // +-----------------------------+---+---+---+---+ + opClsJump + // +---+-------------------------+---+---+---+---+ + // | 0 | 0 | 0 | RetSrc (1b) | 0 | 1 | 1 | 0 | + // +---+-------------------------+---+---+---+---+ + opClsReturn + // +---+-------------------------+---+---+---+---+ + // | 0 | 0 | 0 | TXAorTAX (1b) | 0 | 1 | 1 | 1 | + // +---+-------------------------+---+---+---+---+ + opClsMisc +) + +const ( + opAddrModeImmediate uint16 = iota << 5 + opAddrModeAbsolute + opAddrModeIndirect + opAddrModeScratch + opAddrModePacketLen // actually an extension, not an addressing mode. + opAddrModeMemShift +) + +const ( + opLoadWidth4 uint16 = iota << 3 + opLoadWidth2 + opLoadWidth1 +) + +// Operator defined by ALUOp* + +const ( + opALUSrcConstant uint16 = iota << 3 + opALUSrcX +) + +const ( + opJumpAlways = iota << 4 + opJumpEqual + opJumpGT + opJumpGE + opJumpSet +) + +const ( + opRetSrcConstant uint16 = iota << 4 + opRetSrcA +) + +const ( + opMiscTAX = 0x00 + opMiscTXA = 0x80 +) diff --git a/api/vendor/golang.org/x/net/bpf/doc.go b/api/vendor/golang.org/x/net/bpf/doc.go new file mode 100644 index 0000000..ae62feb --- /dev/null +++ b/api/vendor/golang.org/x/net/bpf/doc.go @@ -0,0 +1,82 @@ +// 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 bpf implements marshaling and unmarshaling of programs for the +Berkeley Packet Filter virtual machine, and provides a Go implementation +of the virtual machine. + +BPF's main use is to specify a packet filter for network taps, so that +the kernel doesn't have to expensively copy every packet it sees to +userspace. However, it's been repurposed to other areas where running +user code in-kernel is needed. For example, Linux's seccomp uses BPF +to apply security policies to system calls. For simplicity, this +documentation refers only to packets, but other uses of BPF have their +own data payloads. + +BPF programs run in a restricted virtual machine. It has almost no +access to kernel functions, and while conditional branches are +allowed, they can only jump forwards, to guarantee that there are no +infinite loops. + +The virtual machine + +The BPF VM is an accumulator machine. Its main register, called +register A, is an implicit source and destination in all arithmetic +and logic operations. The machine also has 16 scratch registers for +temporary storage, and an indirection register (register X) for +indirect memory access. All registers are 32 bits wide. + +Each run of a BPF program is given one packet, which is placed in the +VM's read-only "main memory". LoadAbsolute and LoadIndirect +instructions can fetch up to 32 bits at a time into register A for +examination. + +The goal of a BPF program is to produce and return a verdict (uint32), +which tells the kernel what to do with the packet. In the context of +packet filtering, the returned value is the number of bytes of the +packet to forward to userspace, or 0 to ignore the packet. Other +contexts like seccomp define their own return values. + +In order to simplify programs, attempts to read past the end of the +packet terminate the program execution with a verdict of 0 (ignore +packet). This means that the vast majority of BPF programs don't need +to do any explicit bounds checking. + +In addition to the bytes of the packet, some BPF programs have access +to extensions, which are essentially calls to kernel utility +functions. Currently, the only extensions supported by this package +are the Linux packet filter extensions. + +Examples + +This packet filter selects all ARP packets. + + bpf.Assemble([]bpf.Instruction{ + // Load "EtherType" field from the ethernet header. + bpf.LoadAbsolute{Off: 12, Size: 2}, + // Skip over the next instruction if EtherType is not ARP. + bpf.JumpIf{Cond: bpf.JumpNotEqual, Val: 0x0806, SkipTrue: 1}, + // Verdict is "send up to 4k of the packet to userspace." + bpf.RetConstant{Val: 4096}, + // Verdict is "ignore packet." + bpf.RetConstant{Val: 0}, + }) + +This packet filter captures a random 1% sample of traffic. + + bpf.Assemble([]bpf.Instruction{ + // Get a 32-bit random number from the Linux kernel. + bpf.LoadExtension{Num: bpf.ExtRand}, + // 1% dice roll? + bpf.JumpIf{Cond: bpf.JumpLessThan, Val: 2^32/100, SkipFalse: 1}, + // Capture. + bpf.RetConstant{Val: 4096}, + // Ignore. + bpf.RetConstant{Val: 0}, + }) + +*/ +package bpf // import "golang.org/x/net/bpf" diff --git a/api/vendor/golang.org/x/net/bpf/instructions.go b/api/vendor/golang.org/x/net/bpf/instructions.go new file mode 100644 index 0000000..f9dc0e8 --- /dev/null +++ b/api/vendor/golang.org/x/net/bpf/instructions.go @@ -0,0 +1,704 @@ +// 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 bpf + +import "fmt" + +// An Instruction is one instruction executed by the BPF virtual +// machine. +type Instruction interface { + // Assemble assembles the Instruction into a RawInstruction. + Assemble() (RawInstruction, error) +} + +// A RawInstruction is a raw BPF virtual machine instruction. +type RawInstruction struct { + // Operation to execute. + Op uint16 + // For conditional jump instructions, the number of instructions + // to skip if the condition is true/false. + Jt uint8 + Jf uint8 + // Constant parameter. The meaning depends on the Op. + K uint32 +} + +// Assemble implements the Instruction Assemble method. +func (ri RawInstruction) Assemble() (RawInstruction, error) { return ri, nil } + +// Disassemble parses ri into an Instruction and returns it. If ri is +// not recognized by this package, ri itself is returned. +func (ri RawInstruction) Disassemble() Instruction { + switch ri.Op & opMaskCls { + case opClsLoadA, opClsLoadX: + reg := Register(ri.Op & opMaskLoadDest) + sz := 0 + switch ri.Op & opMaskLoadWidth { + case opLoadWidth4: + sz = 4 + case opLoadWidth2: + sz = 2 + case opLoadWidth1: + sz = 1 + default: + return ri + } + switch ri.Op & opMaskLoadMode { + case opAddrModeImmediate: + if sz != 4 { + return ri + } + return LoadConstant{Dst: reg, Val: ri.K} + case opAddrModeScratch: + if sz != 4 || ri.K > 15 { + return ri + } + return LoadScratch{Dst: reg, N: int(ri.K)} + case opAddrModeAbsolute: + if ri.K > extOffset+0xffffffff { + return LoadExtension{Num: Extension(-extOffset + ri.K)} + } + return LoadAbsolute{Size: sz, Off: ri.K} + case opAddrModeIndirect: + return LoadIndirect{Size: sz, Off: ri.K} + case opAddrModePacketLen: + if sz != 4 { + return ri + } + return LoadExtension{Num: ExtLen} + case opAddrModeMemShift: + return LoadMemShift{Off: ri.K} + default: + return ri + } + + case opClsStoreA: + if ri.Op != opClsStoreA || ri.K > 15 { + return ri + } + return StoreScratch{Src: RegA, N: int(ri.K)} + + case opClsStoreX: + if ri.Op != opClsStoreX || ri.K > 15 { + return ri + } + return StoreScratch{Src: RegX, N: int(ri.K)} + + case opClsALU: + switch op := ALUOp(ri.Op & opMaskOperator); op { + case ALUOpAdd, ALUOpSub, ALUOpMul, ALUOpDiv, ALUOpOr, ALUOpAnd, ALUOpShiftLeft, ALUOpShiftRight, ALUOpMod, ALUOpXor: + if ri.Op&opMaskOperandSrc != 0 { + return ALUOpX{Op: op} + } + return ALUOpConstant{Op: op, Val: ri.K} + case aluOpNeg: + return NegateA{} + default: + return ri + } + + case opClsJump: + if ri.Op&opMaskJumpConst != opClsJump { + return ri + } + switch ri.Op & opMaskJumpCond { + case opJumpAlways: + return Jump{Skip: ri.K} + case opJumpEqual: + if ri.Jt == 0 { + return JumpIf{ + Cond: JumpNotEqual, + Val: ri.K, + SkipTrue: ri.Jf, + SkipFalse: 0, + } + } + return JumpIf{ + Cond: JumpEqual, + Val: ri.K, + SkipTrue: ri.Jt, + SkipFalse: ri.Jf, + } + case opJumpGT: + if ri.Jt == 0 { + return JumpIf{ + Cond: JumpLessOrEqual, + Val: ri.K, + SkipTrue: ri.Jf, + SkipFalse: 0, + } + } + return JumpIf{ + Cond: JumpGreaterThan, + Val: ri.K, + SkipTrue: ri.Jt, + SkipFalse: ri.Jf, + } + case opJumpGE: + if ri.Jt == 0 { + return JumpIf{ + Cond: JumpLessThan, + Val: ri.K, + SkipTrue: ri.Jf, + SkipFalse: 0, + } + } + return JumpIf{ + Cond: JumpGreaterOrEqual, + Val: ri.K, + SkipTrue: ri.Jt, + SkipFalse: ri.Jf, + } + case opJumpSet: + return JumpIf{ + Cond: JumpBitsSet, + Val: ri.K, + SkipTrue: ri.Jt, + SkipFalse: ri.Jf, + } + default: + return ri + } + + case opClsReturn: + switch ri.Op { + case opClsReturn | opRetSrcA: + return RetA{} + case opClsReturn | opRetSrcConstant: + return RetConstant{Val: ri.K} + default: + return ri + } + + case opClsMisc: + switch ri.Op { + case opClsMisc | opMiscTAX: + return TAX{} + case opClsMisc | opMiscTXA: + return TXA{} + default: + return ri + } + + default: + panic("unreachable") // switch is exhaustive on the bit pattern + } +} + +// LoadConstant loads Val into register Dst. +type LoadConstant struct { + Dst Register + Val uint32 +} + +// Assemble implements the Instruction Assemble method. +func (a LoadConstant) Assemble() (RawInstruction, error) { + return assembleLoad(a.Dst, 4, opAddrModeImmediate, a.Val) +} + +// String returns the instruction in assembler notation. +func (a LoadConstant) String() string { + switch a.Dst { + case RegA: + return fmt.Sprintf("ld #%d", a.Val) + case RegX: + return fmt.Sprintf("ldx #%d", a.Val) + default: + return fmt.Sprintf("unknown instruction: %#v", a) + } +} + +// LoadScratch loads scratch[N] into register Dst. +type LoadScratch struct { + Dst Register + N int // 0-15 +} + +// Assemble implements the Instruction Assemble method. +func (a LoadScratch) Assemble() (RawInstruction, error) { + if a.N < 0 || a.N > 15 { + return RawInstruction{}, fmt.Errorf("invalid scratch slot %d", a.N) + } + return assembleLoad(a.Dst, 4, opAddrModeScratch, uint32(a.N)) +} + +// String returns the instruction in assembler notation. +func (a LoadScratch) String() string { + switch a.Dst { + case RegA: + return fmt.Sprintf("ld M[%d]", a.N) + case RegX: + return fmt.Sprintf("ldx M[%d]", a.N) + default: + return fmt.Sprintf("unknown instruction: %#v", a) + } +} + +// LoadAbsolute loads packet[Off:Off+Size] as an integer value into +// register A. +type LoadAbsolute struct { + Off uint32 + Size int // 1, 2 or 4 +} + +// Assemble implements the Instruction Assemble method. +func (a LoadAbsolute) Assemble() (RawInstruction, error) { + return assembleLoad(RegA, a.Size, opAddrModeAbsolute, a.Off) +} + +// String returns the instruction in assembler notation. +func (a LoadAbsolute) String() string { + switch a.Size { + case 1: // byte + return fmt.Sprintf("ldb [%d]", a.Off) + case 2: // half word + return fmt.Sprintf("ldh [%d]", a.Off) + case 4: // word + if a.Off > extOffset+0xffffffff { + return LoadExtension{Num: Extension(a.Off + 0x1000)}.String() + } + return fmt.Sprintf("ld [%d]", a.Off) + default: + return fmt.Sprintf("unknown instruction: %#v", a) + } +} + +// LoadIndirect loads packet[X+Off:X+Off+Size] as an integer value +// into register A. +type LoadIndirect struct { + Off uint32 + Size int // 1, 2 or 4 +} + +// Assemble implements the Instruction Assemble method. +func (a LoadIndirect) Assemble() (RawInstruction, error) { + return assembleLoad(RegA, a.Size, opAddrModeIndirect, a.Off) +} + +// String returns the instruction in assembler notation. +func (a LoadIndirect) String() string { + switch a.Size { + case 1: // byte + return fmt.Sprintf("ldb [x + %d]", a.Off) + case 2: // half word + return fmt.Sprintf("ldh [x + %d]", a.Off) + case 4: // word + return fmt.Sprintf("ld [x + %d]", a.Off) + default: + return fmt.Sprintf("unknown instruction: %#v", a) + } +} + +// LoadMemShift multiplies the first 4 bits of the byte at packet[Off] +// by 4 and stores the result in register X. +// +// This instruction is mainly useful to load into X the length of an +// IPv4 packet header in a single instruction, rather than have to do +// the arithmetic on the header's first byte by hand. +type LoadMemShift struct { + Off uint32 +} + +// Assemble implements the Instruction Assemble method. +func (a LoadMemShift) Assemble() (RawInstruction, error) { + return assembleLoad(RegX, 1, opAddrModeMemShift, a.Off) +} + +// String returns the instruction in assembler notation. +func (a LoadMemShift) String() string { + return fmt.Sprintf("ldx 4*([%d]&0xf)", a.Off) +} + +// LoadExtension invokes a linux-specific extension and stores the +// result in register A. +type LoadExtension struct { + Num Extension +} + +// Assemble implements the Instruction Assemble method. +func (a LoadExtension) Assemble() (RawInstruction, error) { + if a.Num == ExtLen { + return assembleLoad(RegA, 4, opAddrModePacketLen, 0) + } + return assembleLoad(RegA, 4, opAddrModeAbsolute, uint32(extOffset+a.Num)) +} + +// String returns the instruction in assembler notation. +func (a LoadExtension) String() string { + switch a.Num { + case ExtLen: + return "ld #len" + case ExtProto: + return "ld #proto" + case ExtType: + return "ld #type" + case ExtPayloadOffset: + return "ld #poff" + case ExtInterfaceIndex: + return "ld #ifidx" + case ExtNetlinkAttr: + return "ld #nla" + case ExtNetlinkAttrNested: + return "ld #nlan" + case ExtMark: + return "ld #mark" + case ExtQueue: + return "ld #queue" + case ExtLinkLayerType: + return "ld #hatype" + case ExtRXHash: + return "ld #rxhash" + case ExtCPUID: + return "ld #cpu" + case ExtVLANTag: + return "ld #vlan_tci" + case ExtVLANTagPresent: + return "ld #vlan_avail" + case ExtVLANProto: + return "ld #vlan_tpid" + case ExtRand: + return "ld #rand" + default: + return fmt.Sprintf("unknown instruction: %#v", a) + } +} + +// StoreScratch stores register Src into scratch[N]. +type StoreScratch struct { + Src Register + N int // 0-15 +} + +// Assemble implements the Instruction Assemble method. +func (a StoreScratch) Assemble() (RawInstruction, error) { + if a.N < 0 || a.N > 15 { + return RawInstruction{}, fmt.Errorf("invalid scratch slot %d", a.N) + } + var op uint16 + switch a.Src { + case RegA: + op = opClsStoreA + case RegX: + op = opClsStoreX + default: + return RawInstruction{}, fmt.Errorf("invalid source register %v", a.Src) + } + + return RawInstruction{ + Op: op, + K: uint32(a.N), + }, nil +} + +// String returns the instruction in assembler notation. +func (a StoreScratch) String() string { + switch a.Src { + case RegA: + return fmt.Sprintf("st M[%d]", a.N) + case RegX: + return fmt.Sprintf("stx M[%d]", a.N) + default: + return fmt.Sprintf("unknown instruction: %#v", a) + } +} + +// ALUOpConstant executes A = A Val. +type ALUOpConstant struct { + Op ALUOp + Val uint32 +} + +// Assemble implements the Instruction Assemble method. +func (a ALUOpConstant) Assemble() (RawInstruction, error) { + return RawInstruction{ + Op: opClsALU | opALUSrcConstant | uint16(a.Op), + K: a.Val, + }, nil +} + +// String returns the instruction in assembler notation. +func (a ALUOpConstant) String() string { + switch a.Op { + case ALUOpAdd: + return fmt.Sprintf("add #%d", a.Val) + case ALUOpSub: + return fmt.Sprintf("sub #%d", a.Val) + case ALUOpMul: + return fmt.Sprintf("mul #%d", a.Val) + case ALUOpDiv: + return fmt.Sprintf("div #%d", a.Val) + case ALUOpMod: + return fmt.Sprintf("mod #%d", a.Val) + case ALUOpAnd: + return fmt.Sprintf("and #%d", a.Val) + case ALUOpOr: + return fmt.Sprintf("or #%d", a.Val) + case ALUOpXor: + return fmt.Sprintf("xor #%d", a.Val) + case ALUOpShiftLeft: + return fmt.Sprintf("lsh #%d", a.Val) + case ALUOpShiftRight: + return fmt.Sprintf("rsh #%d", a.Val) + default: + return fmt.Sprintf("unknown instruction: %#v", a) + } +} + +// ALUOpX executes A = A X +type ALUOpX struct { + Op ALUOp +} + +// Assemble implements the Instruction Assemble method. +func (a ALUOpX) Assemble() (RawInstruction, error) { + return RawInstruction{ + Op: opClsALU | opALUSrcX | uint16(a.Op), + }, nil +} + +// String returns the instruction in assembler notation. +func (a ALUOpX) String() string { + switch a.Op { + case ALUOpAdd: + return "add x" + case ALUOpSub: + return "sub x" + case ALUOpMul: + return "mul x" + case ALUOpDiv: + return "div x" + case ALUOpMod: + return "mod x" + case ALUOpAnd: + return "and x" + case ALUOpOr: + return "or x" + case ALUOpXor: + return "xor x" + case ALUOpShiftLeft: + return "lsh x" + case ALUOpShiftRight: + return "rsh x" + default: + return fmt.Sprintf("unknown instruction: %#v", a) + } +} + +// NegateA executes A = -A. +type NegateA struct{} + +// Assemble implements the Instruction Assemble method. +func (a NegateA) Assemble() (RawInstruction, error) { + return RawInstruction{ + Op: opClsALU | uint16(aluOpNeg), + }, nil +} + +// String returns the instruction in assembler notation. +func (a NegateA) String() string { + return fmt.Sprintf("neg") +} + +// Jump skips the following Skip instructions in the program. +type Jump struct { + Skip uint32 +} + +// Assemble implements the Instruction Assemble method. +func (a Jump) Assemble() (RawInstruction, error) { + return RawInstruction{ + Op: opClsJump | opJumpAlways, + K: a.Skip, + }, nil +} + +// String returns the instruction in assembler notation. +func (a Jump) String() string { + return fmt.Sprintf("ja %d", a.Skip) +} + +// JumpIf skips the following Skip instructions in the program if A +// Val is true. +type JumpIf struct { + Cond JumpTest + Val uint32 + SkipTrue uint8 + SkipFalse uint8 +} + +// Assemble implements the Instruction Assemble method. +func (a JumpIf) Assemble() (RawInstruction, error) { + var ( + cond uint16 + flip bool + ) + switch a.Cond { + case JumpEqual: + cond = opJumpEqual + case JumpNotEqual: + cond, flip = opJumpEqual, true + case JumpGreaterThan: + cond = opJumpGT + case JumpLessThan: + cond, flip = opJumpGE, true + case JumpGreaterOrEqual: + cond = opJumpGE + case JumpLessOrEqual: + cond, flip = opJumpGT, true + case JumpBitsSet: + cond = opJumpSet + case JumpBitsNotSet: + cond, flip = opJumpSet, true + default: + return RawInstruction{}, fmt.Errorf("unknown JumpTest %v", a.Cond) + } + jt, jf := a.SkipTrue, a.SkipFalse + if flip { + jt, jf = jf, jt + } + return RawInstruction{ + Op: opClsJump | cond, + Jt: jt, + Jf: jf, + K: a.Val, + }, nil +} + +// String returns the instruction in assembler notation. +func (a JumpIf) String() string { + switch a.Cond { + // K == A + case JumpEqual: + return conditionalJump(a, "jeq", "jneq") + // K != A + case JumpNotEqual: + return fmt.Sprintf("jneq #%d,%d", a.Val, a.SkipTrue) + // K > A + case JumpGreaterThan: + return conditionalJump(a, "jgt", "jle") + // K < A + case JumpLessThan: + return fmt.Sprintf("jlt #%d,%d", a.Val, a.SkipTrue) + // K >= A + case JumpGreaterOrEqual: + return conditionalJump(a, "jge", "jlt") + // K <= A + case JumpLessOrEqual: + return fmt.Sprintf("jle #%d,%d", a.Val, a.SkipTrue) + // K & A != 0 + case JumpBitsSet: + if a.SkipFalse > 0 { + return fmt.Sprintf("jset #%d,%d,%d", a.Val, a.SkipTrue, a.SkipFalse) + } + return fmt.Sprintf("jset #%d,%d", a.Val, a.SkipTrue) + // K & A == 0, there is no assembler instruction for JumpBitNotSet, use JumpBitSet and invert skips + case JumpBitsNotSet: + return JumpIf{Cond: JumpBitsSet, SkipTrue: a.SkipFalse, SkipFalse: a.SkipTrue, Val: a.Val}.String() + default: + return fmt.Sprintf("unknown instruction: %#v", a) + } +} + +func conditionalJump(inst JumpIf, positiveJump, negativeJump string) string { + if inst.SkipTrue > 0 { + if inst.SkipFalse > 0 { + return fmt.Sprintf("%s #%d,%d,%d", positiveJump, inst.Val, inst.SkipTrue, inst.SkipFalse) + } + return fmt.Sprintf("%s #%d,%d", positiveJump, inst.Val, inst.SkipTrue) + } + return fmt.Sprintf("%s #%d,%d", negativeJump, inst.Val, inst.SkipFalse) +} + +// RetA exits the BPF program, returning the value of register A. +type RetA struct{} + +// Assemble implements the Instruction Assemble method. +func (a RetA) Assemble() (RawInstruction, error) { + return RawInstruction{ + Op: opClsReturn | opRetSrcA, + }, nil +} + +// String returns the instruction in assembler notation. +func (a RetA) String() string { + return fmt.Sprintf("ret a") +} + +// RetConstant exits the BPF program, returning a constant value. +type RetConstant struct { + Val uint32 +} + +// Assemble implements the Instruction Assemble method. +func (a RetConstant) Assemble() (RawInstruction, error) { + return RawInstruction{ + Op: opClsReturn | opRetSrcConstant, + K: a.Val, + }, nil +} + +// String returns the instruction in assembler notation. +func (a RetConstant) String() string { + return fmt.Sprintf("ret #%d", a.Val) +} + +// TXA copies the value of register X to register A. +type TXA struct{} + +// Assemble implements the Instruction Assemble method. +func (a TXA) Assemble() (RawInstruction, error) { + return RawInstruction{ + Op: opClsMisc | opMiscTXA, + }, nil +} + +// String returns the instruction in assembler notation. +func (a TXA) String() string { + return fmt.Sprintf("txa") +} + +// TAX copies the value of register A to register X. +type TAX struct{} + +// Assemble implements the Instruction Assemble method. +func (a TAX) Assemble() (RawInstruction, error) { + return RawInstruction{ + Op: opClsMisc | opMiscTAX, + }, nil +} + +// String returns the instruction in assembler notation. +func (a TAX) String() string { + return fmt.Sprintf("tax") +} + +func assembleLoad(dst Register, loadSize int, mode uint16, k uint32) (RawInstruction, error) { + var ( + cls uint16 + sz uint16 + ) + switch dst { + case RegA: + cls = opClsLoadA + case RegX: + cls = opClsLoadX + default: + return RawInstruction{}, fmt.Errorf("invalid target register %v", dst) + } + switch loadSize { + case 1: + sz = opLoadWidth1 + case 2: + sz = opLoadWidth2 + case 4: + sz = opLoadWidth4 + default: + return RawInstruction{}, fmt.Errorf("invalid load byte length %d", sz) + } + return RawInstruction{ + Op: cls | sz | mode, + K: k, + }, nil +} diff --git a/api/vendor/golang.org/x/net/bpf/instructions_test.go b/api/vendor/golang.org/x/net/bpf/instructions_test.go new file mode 100644 index 0000000..dde474a --- /dev/null +++ b/api/vendor/golang.org/x/net/bpf/instructions_test.go @@ -0,0 +1,525 @@ +// 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 bpf + +import ( + "fmt" + "io/ioutil" + "reflect" + "strconv" + "strings" + "testing" +) + +// This is a direct translation of the program in +// testdata/all_instructions.txt. +var allInstructions = []Instruction{ + LoadConstant{Dst: RegA, Val: 42}, + LoadConstant{Dst: RegX, Val: 42}, + + LoadScratch{Dst: RegA, N: 3}, + LoadScratch{Dst: RegX, N: 3}, + + LoadAbsolute{Off: 42, Size: 1}, + LoadAbsolute{Off: 42, Size: 2}, + LoadAbsolute{Off: 42, Size: 4}, + + LoadIndirect{Off: 42, Size: 1}, + LoadIndirect{Off: 42, Size: 2}, + LoadIndirect{Off: 42, Size: 4}, + + LoadMemShift{Off: 42}, + + LoadExtension{Num: ExtLen}, + LoadExtension{Num: ExtProto}, + LoadExtension{Num: ExtType}, + LoadExtension{Num: ExtRand}, + + StoreScratch{Src: RegA, N: 3}, + StoreScratch{Src: RegX, N: 3}, + + ALUOpConstant{Op: ALUOpAdd, Val: 42}, + ALUOpConstant{Op: ALUOpSub, Val: 42}, + ALUOpConstant{Op: ALUOpMul, Val: 42}, + ALUOpConstant{Op: ALUOpDiv, Val: 42}, + ALUOpConstant{Op: ALUOpOr, Val: 42}, + ALUOpConstant{Op: ALUOpAnd, Val: 42}, + ALUOpConstant{Op: ALUOpShiftLeft, Val: 42}, + ALUOpConstant{Op: ALUOpShiftRight, Val: 42}, + ALUOpConstant{Op: ALUOpMod, Val: 42}, + ALUOpConstant{Op: ALUOpXor, Val: 42}, + + ALUOpX{Op: ALUOpAdd}, + ALUOpX{Op: ALUOpSub}, + ALUOpX{Op: ALUOpMul}, + ALUOpX{Op: ALUOpDiv}, + ALUOpX{Op: ALUOpOr}, + ALUOpX{Op: ALUOpAnd}, + ALUOpX{Op: ALUOpShiftLeft}, + ALUOpX{Op: ALUOpShiftRight}, + ALUOpX{Op: ALUOpMod}, + ALUOpX{Op: ALUOpXor}, + + NegateA{}, + + Jump{Skip: 10}, + JumpIf{Cond: JumpEqual, Val: 42, SkipTrue: 8, SkipFalse: 9}, + JumpIf{Cond: JumpNotEqual, Val: 42, SkipTrue: 8}, + JumpIf{Cond: JumpLessThan, Val: 42, SkipTrue: 7}, + JumpIf{Cond: JumpLessOrEqual, Val: 42, SkipTrue: 6}, + JumpIf{Cond: JumpGreaterThan, Val: 42, SkipTrue: 4, SkipFalse: 5}, + JumpIf{Cond: JumpGreaterOrEqual, Val: 42, SkipTrue: 3, SkipFalse: 4}, + JumpIf{Cond: JumpBitsSet, Val: 42, SkipTrue: 2, SkipFalse: 3}, + + TAX{}, + TXA{}, + + RetA{}, + RetConstant{Val: 42}, +} +var allInstructionsExpected = "testdata/all_instructions.bpf" + +// Check that we produce the same output as the canonical bpf_asm +// linux kernel tool. +func TestInterop(t *testing.T) { + out, err := Assemble(allInstructions) + if err != nil { + t.Fatalf("assembly of allInstructions program failed: %s", err) + } + t.Logf("Assembled program is %d instructions long", len(out)) + + bs, err := ioutil.ReadFile(allInstructionsExpected) + if err != nil { + t.Fatalf("reading %s: %s", allInstructionsExpected, err) + } + // First statement is the number of statements, last statement is + // empty. We just ignore both and rely on slice length. + stmts := strings.Split(string(bs), ",") + if len(stmts)-2 != len(out) { + t.Fatalf("test program lengths don't match: %s has %d, Go implementation has %d", allInstructionsExpected, len(stmts)-2, len(allInstructions)) + } + + for i, stmt := range stmts[1 : len(stmts)-2] { + nums := strings.Split(stmt, " ") + if len(nums) != 4 { + t.Fatalf("malformed instruction %d in %s: %s", i+1, allInstructionsExpected, stmt) + } + + actual := out[i] + + op, err := strconv.ParseUint(nums[0], 10, 16) + if err != nil { + t.Fatalf("malformed opcode %s in instruction %d of %s", nums[0], i+1, allInstructionsExpected) + } + if actual.Op != uint16(op) { + t.Errorf("opcode mismatch on instruction %d (%#v): got 0x%02x, want 0x%02x", i+1, allInstructions[i], actual.Op, op) + } + + jt, err := strconv.ParseUint(nums[1], 10, 8) + if err != nil { + t.Fatalf("malformed jt offset %s in instruction %d of %s", nums[1], i+1, allInstructionsExpected) + } + if actual.Jt != uint8(jt) { + t.Errorf("jt mismatch on instruction %d (%#v): got %d, want %d", i+1, allInstructions[i], actual.Jt, jt) + } + + jf, err := strconv.ParseUint(nums[2], 10, 8) + if err != nil { + t.Fatalf("malformed jf offset %s in instruction %d of %s", nums[2], i+1, allInstructionsExpected) + } + if actual.Jf != uint8(jf) { + t.Errorf("jf mismatch on instruction %d (%#v): got %d, want %d", i+1, allInstructions[i], actual.Jf, jf) + } + + k, err := strconv.ParseUint(nums[3], 10, 32) + if err != nil { + t.Fatalf("malformed constant %s in instruction %d of %s", nums[3], i+1, allInstructionsExpected) + } + if actual.K != uint32(k) { + t.Errorf("constant mismatch on instruction %d (%#v): got %d, want %d", i+1, allInstructions[i], actual.K, k) + } + } +} + +// Check that assembly and disassembly match each other. +func TestAsmDisasm(t *testing.T) { + prog1, err := Assemble(allInstructions) + if err != nil { + t.Fatalf("assembly of allInstructions program failed: %s", err) + } + t.Logf("Assembled program is %d instructions long", len(prog1)) + + got, allDecoded := Disassemble(prog1) + if !allDecoded { + t.Errorf("Disassemble(Assemble(allInstructions)) produced unrecognized instructions:") + for i, inst := range got { + if r, ok := inst.(RawInstruction); ok { + t.Logf(" insn %d, %#v --> %#v", i+1, allInstructions[i], r) + } + } + } + + if len(allInstructions) != len(got) { + t.Fatalf("disassembly changed program size: %d insns before, %d insns after", len(allInstructions), len(got)) + } + if !reflect.DeepEqual(allInstructions, got) { + t.Errorf("program mutated by disassembly:") + for i := range got { + if !reflect.DeepEqual(allInstructions[i], got[i]) { + t.Logf(" insn %d, s: %#v, p1: %#v, got: %#v", i+1, allInstructions[i], prog1[i], got[i]) + } + } + } +} + +type InvalidInstruction struct{} + +func (a InvalidInstruction) Assemble() (RawInstruction, error) { + return RawInstruction{}, fmt.Errorf("Invalid Instruction") +} + +func (a InvalidInstruction) String() string { + return fmt.Sprintf("unknown instruction: %#v", a) +} + +func TestString(t *testing.T) { + testCases := []struct { + instruction Instruction + assembler string + }{ + { + instruction: LoadConstant{Dst: RegA, Val: 42}, + assembler: "ld #42", + }, + { + instruction: LoadConstant{Dst: RegX, Val: 42}, + assembler: "ldx #42", + }, + { + instruction: LoadConstant{Dst: 0xffff, Val: 42}, + assembler: "unknown instruction: bpf.LoadConstant{Dst:0xffff, Val:0x2a}", + }, + { + instruction: LoadScratch{Dst: RegA, N: 3}, + assembler: "ld M[3]", + }, + { + instruction: LoadScratch{Dst: RegX, N: 3}, + assembler: "ldx M[3]", + }, + { + instruction: LoadScratch{Dst: 0xffff, N: 3}, + assembler: "unknown instruction: bpf.LoadScratch{Dst:0xffff, N:3}", + }, + { + instruction: LoadAbsolute{Off: 42, Size: 1}, + assembler: "ldb [42]", + }, + { + instruction: LoadAbsolute{Off: 42, Size: 2}, + assembler: "ldh [42]", + }, + { + instruction: LoadAbsolute{Off: 42, Size: 4}, + assembler: "ld [42]", + }, + { + instruction: LoadAbsolute{Off: 42, Size: -1}, + assembler: "unknown instruction: bpf.LoadAbsolute{Off:0x2a, Size:-1}", + }, + { + instruction: LoadIndirect{Off: 42, Size: 1}, + assembler: "ldb [x + 42]", + }, + { + instruction: LoadIndirect{Off: 42, Size: 2}, + assembler: "ldh [x + 42]", + }, + { + instruction: LoadIndirect{Off: 42, Size: 4}, + assembler: "ld [x + 42]", + }, + { + instruction: LoadIndirect{Off: 42, Size: -1}, + assembler: "unknown instruction: bpf.LoadIndirect{Off:0x2a, Size:-1}", + }, + { + instruction: LoadMemShift{Off: 42}, + assembler: "ldx 4*([42]&0xf)", + }, + { + instruction: LoadExtension{Num: ExtLen}, + assembler: "ld #len", + }, + { + instruction: LoadExtension{Num: ExtProto}, + assembler: "ld #proto", + }, + { + instruction: LoadExtension{Num: ExtType}, + assembler: "ld #type", + }, + { + instruction: LoadExtension{Num: ExtPayloadOffset}, + assembler: "ld #poff", + }, + { + instruction: LoadExtension{Num: ExtInterfaceIndex}, + assembler: "ld #ifidx", + }, + { + instruction: LoadExtension{Num: ExtNetlinkAttr}, + assembler: "ld #nla", + }, + { + instruction: LoadExtension{Num: ExtNetlinkAttrNested}, + assembler: "ld #nlan", + }, + { + instruction: LoadExtension{Num: ExtMark}, + assembler: "ld #mark", + }, + { + instruction: LoadExtension{Num: ExtQueue}, + assembler: "ld #queue", + }, + { + instruction: LoadExtension{Num: ExtLinkLayerType}, + assembler: "ld #hatype", + }, + { + instruction: LoadExtension{Num: ExtRXHash}, + assembler: "ld #rxhash", + }, + { + instruction: LoadExtension{Num: ExtCPUID}, + assembler: "ld #cpu", + }, + { + instruction: LoadExtension{Num: ExtVLANTag}, + assembler: "ld #vlan_tci", + }, + { + instruction: LoadExtension{Num: ExtVLANTagPresent}, + assembler: "ld #vlan_avail", + }, + { + instruction: LoadExtension{Num: ExtVLANProto}, + assembler: "ld #vlan_tpid", + }, + { + instruction: LoadExtension{Num: ExtRand}, + assembler: "ld #rand", + }, + { + instruction: LoadAbsolute{Off: 0xfffff038, Size: 4}, + assembler: "ld #rand", + }, + { + instruction: LoadExtension{Num: 0xfff}, + assembler: "unknown instruction: bpf.LoadExtension{Num:4095}", + }, + { + instruction: StoreScratch{Src: RegA, N: 3}, + assembler: "st M[3]", + }, + { + instruction: StoreScratch{Src: RegX, N: 3}, + assembler: "stx M[3]", + }, + { + instruction: StoreScratch{Src: 0xffff, N: 3}, + assembler: "unknown instruction: bpf.StoreScratch{Src:0xffff, N:3}", + }, + { + instruction: ALUOpConstant{Op: ALUOpAdd, Val: 42}, + assembler: "add #42", + }, + { + instruction: ALUOpConstant{Op: ALUOpSub, Val: 42}, + assembler: "sub #42", + }, + { + instruction: ALUOpConstant{Op: ALUOpMul, Val: 42}, + assembler: "mul #42", + }, + { + instruction: ALUOpConstant{Op: ALUOpDiv, Val: 42}, + assembler: "div #42", + }, + { + instruction: ALUOpConstant{Op: ALUOpOr, Val: 42}, + assembler: "or #42", + }, + { + instruction: ALUOpConstant{Op: ALUOpAnd, Val: 42}, + assembler: "and #42", + }, + { + instruction: ALUOpConstant{Op: ALUOpShiftLeft, Val: 42}, + assembler: "lsh #42", + }, + { + instruction: ALUOpConstant{Op: ALUOpShiftRight, Val: 42}, + assembler: "rsh #42", + }, + { + instruction: ALUOpConstant{Op: ALUOpMod, Val: 42}, + assembler: "mod #42", + }, + { + instruction: ALUOpConstant{Op: ALUOpXor, Val: 42}, + assembler: "xor #42", + }, + { + instruction: ALUOpConstant{Op: 0xffff, Val: 42}, + assembler: "unknown instruction: bpf.ALUOpConstant{Op:0xffff, Val:0x2a}", + }, + { + instruction: ALUOpX{Op: ALUOpAdd}, + assembler: "add x", + }, + { + instruction: ALUOpX{Op: ALUOpSub}, + assembler: "sub x", + }, + { + instruction: ALUOpX{Op: ALUOpMul}, + assembler: "mul x", + }, + { + instruction: ALUOpX{Op: ALUOpDiv}, + assembler: "div x", + }, + { + instruction: ALUOpX{Op: ALUOpOr}, + assembler: "or x", + }, + { + instruction: ALUOpX{Op: ALUOpAnd}, + assembler: "and x", + }, + { + instruction: ALUOpX{Op: ALUOpShiftLeft}, + assembler: "lsh x", + }, + { + instruction: ALUOpX{Op: ALUOpShiftRight}, + assembler: "rsh x", + }, + { + instruction: ALUOpX{Op: ALUOpMod}, + assembler: "mod x", + }, + { + instruction: ALUOpX{Op: ALUOpXor}, + assembler: "xor x", + }, + { + instruction: ALUOpX{Op: 0xffff}, + assembler: "unknown instruction: bpf.ALUOpX{Op:0xffff}", + }, + { + instruction: NegateA{}, + assembler: "neg", + }, + { + instruction: Jump{Skip: 10}, + assembler: "ja 10", + }, + { + instruction: JumpIf{Cond: JumpEqual, Val: 42, SkipTrue: 8, SkipFalse: 9}, + assembler: "jeq #42,8,9", + }, + { + instruction: JumpIf{Cond: JumpEqual, Val: 42, SkipTrue: 8}, + assembler: "jeq #42,8", + }, + { + instruction: JumpIf{Cond: JumpEqual, Val: 42, SkipFalse: 8}, + assembler: "jneq #42,8", + }, + { + instruction: JumpIf{Cond: JumpNotEqual, Val: 42, SkipTrue: 8}, + assembler: "jneq #42,8", + }, + { + instruction: JumpIf{Cond: JumpLessThan, Val: 42, SkipTrue: 7}, + assembler: "jlt #42,7", + }, + { + instruction: JumpIf{Cond: JumpLessOrEqual, Val: 42, SkipTrue: 6}, + assembler: "jle #42,6", + }, + { + instruction: JumpIf{Cond: JumpGreaterThan, Val: 42, SkipTrue: 4, SkipFalse: 5}, + assembler: "jgt #42,4,5", + }, + { + instruction: JumpIf{Cond: JumpGreaterThan, Val: 42, SkipTrue: 4}, + assembler: "jgt #42,4", + }, + { + instruction: JumpIf{Cond: JumpGreaterOrEqual, Val: 42, SkipTrue: 3, SkipFalse: 4}, + assembler: "jge #42,3,4", + }, + { + instruction: JumpIf{Cond: JumpGreaterOrEqual, Val: 42, SkipTrue: 3}, + assembler: "jge #42,3", + }, + { + instruction: JumpIf{Cond: JumpBitsSet, Val: 42, SkipTrue: 2, SkipFalse: 3}, + assembler: "jset #42,2,3", + }, + { + instruction: JumpIf{Cond: JumpBitsSet, Val: 42, SkipTrue: 2}, + assembler: "jset #42,2", + }, + { + instruction: JumpIf{Cond: JumpBitsNotSet, Val: 42, SkipTrue: 2, SkipFalse: 3}, + assembler: "jset #42,3,2", + }, + { + instruction: JumpIf{Cond: JumpBitsNotSet, Val: 42, SkipTrue: 2}, + assembler: "jset #42,0,2", + }, + { + instruction: JumpIf{Cond: 0xffff, Val: 42, SkipTrue: 1, SkipFalse: 2}, + assembler: "unknown instruction: bpf.JumpIf{Cond:0xffff, Val:0x2a, SkipTrue:0x1, SkipFalse:0x2}", + }, + { + instruction: TAX{}, + assembler: "tax", + }, + { + instruction: TXA{}, + assembler: "txa", + }, + { + instruction: RetA{}, + assembler: "ret a", + }, + { + instruction: RetConstant{Val: 42}, + assembler: "ret #42", + }, + // Invalid instruction + { + instruction: InvalidInstruction{}, + assembler: "unknown instruction: bpf.InvalidInstruction{}", + }, + } + + for _, testCase := range testCases { + if input, ok := testCase.instruction.(fmt.Stringer); ok { + got := input.String() + if got != testCase.assembler { + t.Errorf("String did not return expected assembler notation, expected: %s, got: %s", testCase.assembler, got) + } + } else { + t.Errorf("Instruction %#v is not a fmt.Stringer", testCase.instruction) + } + } +} diff --git a/api/vendor/golang.org/x/net/bpf/setter.go b/api/vendor/golang.org/x/net/bpf/setter.go new file mode 100644 index 0000000..43e35f0 --- /dev/null +++ b/api/vendor/golang.org/x/net/bpf/setter.go @@ -0,0 +1,10 @@ +// 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 bpf + +// A Setter is a type which can attach a compiled BPF filter to itself. +type Setter interface { + SetBPF(filter []RawInstruction) error +} diff --git a/api/vendor/golang.org/x/net/bpf/testdata/all_instructions.bpf b/api/vendor/golang.org/x/net/bpf/testdata/all_instructions.bpf new file mode 100644 index 0000000..f871440 --- /dev/null +++ b/api/vendor/golang.org/x/net/bpf/testdata/all_instructions.bpf @@ -0,0 +1 @@ +50,0 0 0 42,1 0 0 42,96 0 0 3,97 0 0 3,48 0 0 42,40 0 0 42,32 0 0 42,80 0 0 42,72 0 0 42,64 0 0 42,177 0 0 42,128 0 0 0,32 0 0 4294963200,32 0 0 4294963204,32 0 0 4294963256,2 0 0 3,3 0 0 3,4 0 0 42,20 0 0 42,36 0 0 42,52 0 0 42,68 0 0 42,84 0 0 42,100 0 0 42,116 0 0 42,148 0 0 42,164 0 0 42,12 0 0 0,28 0 0 0,44 0 0 0,60 0 0 0,76 0 0 0,92 0 0 0,108 0 0 0,124 0 0 0,156 0 0 0,172 0 0 0,132 0 0 0,5 0 0 10,21 8 9 42,21 0 8 42,53 0 7 42,37 0 6 42,37 4 5 42,53 3 4 42,69 2 3 42,7 0 0 0,135 0 0 0,22 0 0 0,6 0 0 0, diff --git a/api/vendor/golang.org/x/net/bpf/testdata/all_instructions.txt b/api/vendor/golang.org/x/net/bpf/testdata/all_instructions.txt new file mode 100644 index 0000000..3045501 --- /dev/null +++ b/api/vendor/golang.org/x/net/bpf/testdata/all_instructions.txt @@ -0,0 +1,79 @@ +# This filter is compiled to all_instructions.bpf by the `bpf_asm` +# tool, which can be found in the linux kernel source tree under +# tools/net. + +# Load immediate +ld #42 +ldx #42 + +# Load scratch +ld M[3] +ldx M[3] + +# Load absolute +ldb [42] +ldh [42] +ld [42] + +# Load indirect +ldb [x + 42] +ldh [x + 42] +ld [x + 42] + +# Load IPv4 header length +ldx 4*([42]&0xf) + +# Run extension function +ld #len +ld #proto +ld #type +ld #rand + +# Store scratch +st M[3] +stx M[3] + +# A constant +add #42 +sub #42 +mul #42 +div #42 +or #42 +and #42 +lsh #42 +rsh #42 +mod #42 +xor #42 + +# A X +add x +sub x +mul x +div x +or x +and x +lsh x +rsh x +mod x +xor x + +# !A +neg + +# Jumps +ja end +jeq #42,prev,end +jne #42,end +jlt #42,end +jle #42,end +jgt #42,prev,end +jge #42,prev,end +jset #42,prev,end + +# Register transfers +tax +txa + +# Returns +prev: ret a +end: ret #42 diff --git a/api/vendor/golang.org/x/net/bpf/vm.go b/api/vendor/golang.org/x/net/bpf/vm.go new file mode 100644 index 0000000..4c656f1 --- /dev/null +++ b/api/vendor/golang.org/x/net/bpf/vm.go @@ -0,0 +1,140 @@ +// 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 bpf + +import ( + "errors" + "fmt" +) + +// A VM is an emulated BPF virtual machine. +type VM struct { + filter []Instruction +} + +// NewVM returns a new VM using the input BPF program. +func NewVM(filter []Instruction) (*VM, error) { + if len(filter) == 0 { + return nil, errors.New("one or more Instructions must be specified") + } + + for i, ins := range filter { + check := len(filter) - (i + 1) + switch ins := ins.(type) { + // Check for out-of-bounds jumps in instructions + case Jump: + if check <= int(ins.Skip) { + return nil, fmt.Errorf("cannot jump %d instructions; jumping past program bounds", ins.Skip) + } + case JumpIf: + if check <= int(ins.SkipTrue) { + return nil, fmt.Errorf("cannot jump %d instructions in true case; jumping past program bounds", ins.SkipTrue) + } + if check <= int(ins.SkipFalse) { + return nil, fmt.Errorf("cannot jump %d instructions in false case; jumping past program bounds", ins.SkipFalse) + } + // Check for division or modulus by zero + case ALUOpConstant: + if ins.Val != 0 { + break + } + + switch ins.Op { + case ALUOpDiv, ALUOpMod: + return nil, errors.New("cannot divide by zero using ALUOpConstant") + } + // Check for unknown extensions + case LoadExtension: + switch ins.Num { + case ExtLen: + default: + return nil, fmt.Errorf("extension %d not implemented", ins.Num) + } + } + } + + // Make sure last instruction is a return instruction + switch filter[len(filter)-1].(type) { + case RetA, RetConstant: + default: + return nil, errors.New("BPF program must end with RetA or RetConstant") + } + + // Though our VM works using disassembled instructions, we + // attempt to assemble the input filter anyway to ensure it is compatible + // with an operating system VM. + _, err := Assemble(filter) + + return &VM{ + filter: filter, + }, err +} + +// Run runs the VM's BPF program against the input bytes. +// Run returns the number of bytes accepted by the BPF program, and any errors +// which occurred while processing the program. +func (v *VM) Run(in []byte) (int, error) { + var ( + // Registers of the virtual machine + regA uint32 + regX uint32 + regScratch [16]uint32 + + // OK is true if the program should continue processing the next + // instruction, or false if not, causing the loop to break + ok = true + ) + + // TODO(mdlayher): implement: + // - NegateA: + // - would require a change from uint32 registers to int32 + // registers + + // TODO(mdlayher): add interop tests that check signedness of ALU + // operations against kernel implementation, and make sure Go + // implementation matches behavior + + for i := 0; i < len(v.filter) && ok; i++ { + ins := v.filter[i] + + switch ins := ins.(type) { + case ALUOpConstant: + regA = aluOpConstant(ins, regA) + case ALUOpX: + regA, ok = aluOpX(ins, regA, regX) + case Jump: + i += int(ins.Skip) + case JumpIf: + jump := jumpIf(ins, regA) + i += jump + case LoadAbsolute: + regA, ok = loadAbsolute(ins, in) + case LoadConstant: + regA, regX = loadConstant(ins, regA, regX) + case LoadExtension: + regA = loadExtension(ins, in) + case LoadIndirect: + regA, ok = loadIndirect(ins, in, regX) + case LoadMemShift: + regX, ok = loadMemShift(ins, in) + case LoadScratch: + regA, regX = loadScratch(ins, regScratch, regA, regX) + case RetA: + return int(regA), nil + case RetConstant: + return int(ins.Val), nil + case StoreScratch: + regScratch = storeScratch(ins, regScratch, regA, regX) + case TAX: + regX = regA + case TXA: + regA = regX + default: + return 0, fmt.Errorf("unknown Instruction at index %d: %T", i, ins) + } + } + + return 0, nil +} diff --git a/api/vendor/golang.org/x/net/bpf/vm_aluop_test.go b/api/vendor/golang.org/x/net/bpf/vm_aluop_test.go new file mode 100644 index 0000000..1667824 --- /dev/null +++ b/api/vendor/golang.org/x/net/bpf/vm_aluop_test.go @@ -0,0 +1,512 @@ +// 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 bpf_test + +import ( + "testing" + + "golang.org/x/net/bpf" +) + +func TestVMALUOpAdd(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 1, + }, + bpf.ALUOpConstant{ + Op: bpf.ALUOpAdd, + Val: 3, + }, + bpf.RetA{}, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 8, 2, 3, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 3, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMALUOpSub(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 1, + }, + bpf.TAX{}, + bpf.ALUOpX{ + Op: bpf.ALUOpSub, + }, + bpf.RetA{}, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 1, 2, 3, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 0, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMALUOpMul(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 1, + }, + bpf.ALUOpConstant{ + Op: bpf.ALUOpMul, + Val: 2, + }, + bpf.RetA{}, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 6, 2, 3, 4, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 4, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMALUOpDiv(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 1, + }, + bpf.ALUOpConstant{ + Op: bpf.ALUOpDiv, + Val: 2, + }, + bpf.RetA{}, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 20, 2, 3, 4, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 2, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMALUOpDivByZeroALUOpConstant(t *testing.T) { + _, _, err := testVM(t, []bpf.Instruction{ + bpf.ALUOpConstant{ + Op: bpf.ALUOpDiv, + Val: 0, + }, + bpf.RetA{}, + }) + if errStr(err) != "cannot divide by zero using ALUOpConstant" { + t.Fatalf("unexpected error: %v", err) + } +} + +func TestVMALUOpDivByZeroALUOpX(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + // Load byte 0 into X + bpf.LoadAbsolute{ + Off: 8, + Size: 1, + }, + bpf.TAX{}, + // Load byte 1 into A + bpf.LoadAbsolute{ + Off: 9, + Size: 1, + }, + // Attempt to perform 1/0 + bpf.ALUOpX{ + Op: bpf.ALUOpDiv, + }, + // Return 4 bytes if program does not terminate + bpf.LoadConstant{ + Val: 12, + }, + bpf.RetA{}, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0, 1, 3, 4, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 0, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMALUOpOr(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 2, + }, + bpf.ALUOpConstant{ + Op: bpf.ALUOpOr, + Val: 0x01, + }, + bpf.RetA{}, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0x00, 0x10, 0x03, 0x04, + 0x05, 0x06, 0x07, 0x08, + 0x09, 0xff, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 9, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMALUOpAnd(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 2, + }, + bpf.ALUOpConstant{ + Op: bpf.ALUOpAnd, + Val: 0x0019, + }, + bpf.RetA{}, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0xaa, 0x09, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 1, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMALUOpShiftLeft(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 1, + }, + bpf.ALUOpConstant{ + Op: bpf.ALUOpShiftLeft, + Val: 0x01, + }, + bpf.JumpIf{ + Cond: bpf.JumpEqual, + Val: 0x02, + SkipTrue: 1, + }, + bpf.RetConstant{ + Val: 0, + }, + bpf.RetConstant{ + Val: 9, + }, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0x01, 0xaa, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 1, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMALUOpShiftRight(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 1, + }, + bpf.ALUOpConstant{ + Op: bpf.ALUOpShiftRight, + Val: 0x01, + }, + bpf.JumpIf{ + Cond: bpf.JumpEqual, + Val: 0x04, + SkipTrue: 1, + }, + bpf.RetConstant{ + Val: 0, + }, + bpf.RetConstant{ + Val: 9, + }, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0x08, 0xff, 0xff, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 1, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMALUOpMod(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 1, + }, + bpf.ALUOpConstant{ + Op: bpf.ALUOpMod, + Val: 20, + }, + bpf.RetA{}, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 30, 0, 0, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 2, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMALUOpModByZeroALUOpConstant(t *testing.T) { + _, _, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 1, + }, + bpf.ALUOpConstant{ + Op: bpf.ALUOpMod, + Val: 0, + }, + bpf.RetA{}, + }) + if errStr(err) != "cannot divide by zero using ALUOpConstant" { + t.Fatalf("unexpected error: %v", err) + } +} + +func TestVMALUOpModByZeroALUOpX(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + // Load byte 0 into X + bpf.LoadAbsolute{ + Off: 8, + Size: 1, + }, + bpf.TAX{}, + // Load byte 1 into A + bpf.LoadAbsolute{ + Off: 9, + Size: 1, + }, + // Attempt to perform 1%0 + bpf.ALUOpX{ + Op: bpf.ALUOpMod, + }, + // Return 4 bytes if program does not terminate + bpf.LoadConstant{ + Val: 12, + }, + bpf.RetA{}, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0, 1, 3, 4, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 0, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMALUOpXor(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 1, + }, + bpf.ALUOpConstant{ + Op: bpf.ALUOpXor, + Val: 0x0a, + }, + bpf.JumpIf{ + Cond: bpf.JumpEqual, + Val: 0x01, + SkipTrue: 1, + }, + bpf.RetConstant{ + Val: 0, + }, + bpf.RetConstant{ + Val: 9, + }, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0x0b, 0x00, 0x00, 0x00, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 1, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMALUOpUnknown(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 1, + }, + bpf.ALUOpConstant{ + Op: bpf.ALUOpAdd, + Val: 1, + }, + // Verify that an unknown operation is a no-op + bpf.ALUOpConstant{ + Op: 100, + }, + bpf.JumpIf{ + Cond: bpf.JumpEqual, + Val: 0x02, + SkipTrue: 1, + }, + bpf.RetConstant{ + Val: 0, + }, + bpf.RetConstant{ + Val: 9, + }, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 1, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 1, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} diff --git a/api/vendor/golang.org/x/net/bpf/vm_bpf_test.go b/api/vendor/golang.org/x/net/bpf/vm_bpf_test.go new file mode 100644 index 0000000..77fa8fe --- /dev/null +++ b/api/vendor/golang.org/x/net/bpf/vm_bpf_test.go @@ -0,0 +1,192 @@ +// 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 bpf_test + +import ( + "net" + "runtime" + "testing" + "time" + + "golang.org/x/net/bpf" + "golang.org/x/net/ipv4" +) + +// A virtualMachine is a BPF virtual machine which can process an +// input packet against a BPF program and render a verdict. +type virtualMachine interface { + Run(in []byte) (int, error) +} + +// canUseOSVM indicates if the OS BPF VM is available on this platform. +func canUseOSVM() bool { + // OS BPF VM can only be used on platforms where x/net/ipv4 supports + // attaching a BPF program to a socket. + switch runtime.GOOS { + case "linux": + return true + } + + return false +} + +// All BPF tests against both the Go VM and OS VM are assumed to +// be used with a UDP socket. As a result, the entire contents +// of a UDP datagram is sent through the BPF program, but only +// the body after the UDP header will ever be returned in output. + +// testVM sets up a Go BPF VM, and if available, a native OS BPF VM +// for integration testing. +func testVM(t *testing.T, filter []bpf.Instruction) (virtualMachine, func(), error) { + goVM, err := bpf.NewVM(filter) + if err != nil { + // Some tests expect an error, so this error must be returned + // instead of fatally exiting the test + return nil, nil, err + } + + mvm := &multiVirtualMachine{ + goVM: goVM, + + t: t, + } + + // If available, add the OS VM for tests which verify that both the Go + // VM and OS VM have exactly the same output for the same input program + // and packet. + done := func() {} + if canUseOSVM() { + osVM, osVMDone := testOSVM(t, filter) + done = func() { osVMDone() } + mvm.osVM = osVM + } + + return mvm, done, nil +} + +// udpHeaderLen is the length of a UDP header. +const udpHeaderLen = 8 + +// A multiVirtualMachine is a virtualMachine which can call out to both the Go VM +// and the native OS VM, if the OS VM is available. +type multiVirtualMachine struct { + goVM virtualMachine + osVM virtualMachine + + t *testing.T +} + +func (mvm *multiVirtualMachine) Run(in []byte) (int, error) { + if len(in) < udpHeaderLen { + mvm.t.Fatalf("input must be at least length of UDP header (%d), got: %d", + udpHeaderLen, len(in)) + } + + // All tests have a UDP header as part of input, because the OS VM + // packets always will. For the Go VM, this output is trimmed before + // being sent back to tests. + goOut, goErr := mvm.goVM.Run(in) + if goOut >= udpHeaderLen { + goOut -= udpHeaderLen + } + + // If Go output is larger than the size of the packet, packet filtering + // interop tests must trim the output bytes to the length of the packet. + // The BPF VM should not do this on its own, as other uses of it do + // not trim the output byte count. + trim := len(in) - udpHeaderLen + if goOut > trim { + goOut = trim + } + + // When the OS VM is not available, process using the Go VM alone + if mvm.osVM == nil { + return goOut, goErr + } + + // The OS VM will apply its own UDP header, so remove the pseudo header + // that the Go VM needs. + osOut, err := mvm.osVM.Run(in[udpHeaderLen:]) + if err != nil { + mvm.t.Fatalf("error while running OS VM: %v", err) + } + + // Verify both VMs return same number of bytes + var mismatch bool + if goOut != osOut { + mismatch = true + mvm.t.Logf("output byte count does not match:\n- go: %v\n- os: %v", goOut, osOut) + } + + if mismatch { + mvm.t.Fatal("Go BPF and OS BPF packet outputs do not match") + } + + return goOut, goErr +} + +// An osVirtualMachine is a virtualMachine which uses the OS's BPF VM for +// processing BPF programs. +type osVirtualMachine struct { + l net.PacketConn + s net.Conn +} + +// testOSVM creates a virtualMachine which uses the OS's BPF VM by injecting +// packets into a UDP listener with a BPF program attached to it. +func testOSVM(t *testing.T, filter []bpf.Instruction) (virtualMachine, func()) { + l, err := net.ListenPacket("udp4", "127.0.0.1:0") + if err != nil { + t.Fatalf("failed to open OS VM UDP listener: %v", err) + } + + prog, err := bpf.Assemble(filter) + if err != nil { + t.Fatalf("failed to compile BPF program: %v", err) + } + + p := ipv4.NewPacketConn(l) + if err = p.SetBPF(prog); err != nil { + t.Fatalf("failed to attach BPF program to listener: %v", err) + } + + s, err := net.Dial("udp4", l.LocalAddr().String()) + if err != nil { + t.Fatalf("failed to dial connection to listener: %v", err) + } + + done := func() { + _ = s.Close() + _ = l.Close() + } + + return &osVirtualMachine{ + l: l, + s: s, + }, done +} + +// Run sends the input bytes into the OS's BPF VM and returns its verdict. +func (vm *osVirtualMachine) Run(in []byte) (int, error) { + go func() { + _, _ = vm.s.Write(in) + }() + + vm.l.SetDeadline(time.Now().Add(50 * time.Millisecond)) + + var b [512]byte + n, _, err := vm.l.ReadFrom(b[:]) + if err != nil { + // A timeout indicates that BPF filtered out the packet, and thus, + // no input should be returned. + if nerr, ok := err.(net.Error); ok && nerr.Timeout() { + return n, nil + } + + return n, err + } + + return n, nil +} diff --git a/api/vendor/golang.org/x/net/bpf/vm_extension_test.go b/api/vendor/golang.org/x/net/bpf/vm_extension_test.go new file mode 100644 index 0000000..7a48c82 --- /dev/null +++ b/api/vendor/golang.org/x/net/bpf/vm_extension_test.go @@ -0,0 +1,49 @@ +// 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 bpf_test + +import ( + "testing" + + "golang.org/x/net/bpf" +) + +func TestVMLoadExtensionNotImplemented(t *testing.T) { + _, _, err := testVM(t, []bpf.Instruction{ + bpf.LoadExtension{ + Num: 100, + }, + bpf.RetA{}, + }) + if errStr(err) != "extension 100 not implemented" { + t.Fatalf("unexpected error: %v", err) + } +} + +func TestVMLoadExtensionExtLen(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadExtension{ + Num: bpf.ExtLen, + }, + bpf.RetA{}, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0, 1, 2, 3, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 4, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} diff --git a/api/vendor/golang.org/x/net/bpf/vm_instructions.go b/api/vendor/golang.org/x/net/bpf/vm_instructions.go new file mode 100644 index 0000000..516f946 --- /dev/null +++ b/api/vendor/golang.org/x/net/bpf/vm_instructions.go @@ -0,0 +1,174 @@ +// 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 bpf + +import ( + "encoding/binary" + "fmt" +) + +func aluOpConstant(ins ALUOpConstant, regA uint32) uint32 { + return aluOpCommon(ins.Op, regA, ins.Val) +} + +func aluOpX(ins ALUOpX, regA uint32, regX uint32) (uint32, bool) { + // Guard against division or modulus by zero by terminating + // the program, as the OS BPF VM does + if regX == 0 { + switch ins.Op { + case ALUOpDiv, ALUOpMod: + return 0, false + } + } + + return aluOpCommon(ins.Op, regA, regX), true +} + +func aluOpCommon(op ALUOp, regA uint32, value uint32) uint32 { + switch op { + case ALUOpAdd: + return regA + value + case ALUOpSub: + return regA - value + case ALUOpMul: + return regA * value + case ALUOpDiv: + // Division by zero not permitted by NewVM and aluOpX checks + return regA / value + case ALUOpOr: + return regA | value + case ALUOpAnd: + return regA & value + case ALUOpShiftLeft: + return regA << value + case ALUOpShiftRight: + return regA >> value + case ALUOpMod: + // Modulus by zero not permitted by NewVM and aluOpX checks + return regA % value + case ALUOpXor: + return regA ^ value + default: + return regA + } +} + +func jumpIf(ins JumpIf, value uint32) int { + var ok bool + inV := uint32(ins.Val) + + switch ins.Cond { + case JumpEqual: + ok = value == inV + case JumpNotEqual: + ok = value != inV + case JumpGreaterThan: + ok = value > inV + case JumpLessThan: + ok = value < inV + case JumpGreaterOrEqual: + ok = value >= inV + case JumpLessOrEqual: + ok = value <= inV + case JumpBitsSet: + ok = (value & inV) != 0 + case JumpBitsNotSet: + ok = (value & inV) == 0 + } + + if ok { + return int(ins.SkipTrue) + } + + return int(ins.SkipFalse) +} + +func loadAbsolute(ins LoadAbsolute, in []byte) (uint32, bool) { + offset := int(ins.Off) + size := int(ins.Size) + + return loadCommon(in, offset, size) +} + +func loadConstant(ins LoadConstant, regA uint32, regX uint32) (uint32, uint32) { + switch ins.Dst { + case RegA: + regA = ins.Val + case RegX: + regX = ins.Val + } + + return regA, regX +} + +func loadExtension(ins LoadExtension, in []byte) uint32 { + switch ins.Num { + case ExtLen: + return uint32(len(in)) + default: + panic(fmt.Sprintf("unimplemented extension: %d", ins.Num)) + } +} + +func loadIndirect(ins LoadIndirect, in []byte, regX uint32) (uint32, bool) { + offset := int(ins.Off) + int(regX) + size := int(ins.Size) + + return loadCommon(in, offset, size) +} + +func loadMemShift(ins LoadMemShift, in []byte) (uint32, bool) { + offset := int(ins.Off) + + if !inBounds(len(in), offset, 0) { + return 0, false + } + + // Mask off high 4 bits and multiply low 4 bits by 4 + return uint32(in[offset]&0x0f) * 4, true +} + +func inBounds(inLen int, offset int, size int) bool { + return offset+size <= inLen +} + +func loadCommon(in []byte, offset int, size int) (uint32, bool) { + if !inBounds(len(in), offset, size) { + return 0, false + } + + switch size { + case 1: + return uint32(in[offset]), true + case 2: + return uint32(binary.BigEndian.Uint16(in[offset : offset+size])), true + case 4: + return uint32(binary.BigEndian.Uint32(in[offset : offset+size])), true + default: + panic(fmt.Sprintf("invalid load size: %d", size)) + } +} + +func loadScratch(ins LoadScratch, regScratch [16]uint32, regA uint32, regX uint32) (uint32, uint32) { + switch ins.Dst { + case RegA: + regA = regScratch[ins.N] + case RegX: + regX = regScratch[ins.N] + } + + return regA, regX +} + +func storeScratch(ins StoreScratch, regScratch [16]uint32, regA uint32, regX uint32) [16]uint32 { + switch ins.Src { + case RegA: + regScratch[ins.N] = regA + case RegX: + regScratch[ins.N] = regX + } + + return regScratch +} diff --git a/api/vendor/golang.org/x/net/bpf/vm_jump_test.go b/api/vendor/golang.org/x/net/bpf/vm_jump_test.go new file mode 100644 index 0000000..e0a3a98 --- /dev/null +++ b/api/vendor/golang.org/x/net/bpf/vm_jump_test.go @@ -0,0 +1,380 @@ +// 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 bpf_test + +import ( + "testing" + + "golang.org/x/net/bpf" +) + +func TestVMJumpOne(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 1, + }, + bpf.Jump{ + Skip: 1, + }, + bpf.RetConstant{ + Val: 0, + }, + bpf.RetConstant{ + Val: 9, + }, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 1, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 1, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMJumpOutOfProgram(t *testing.T) { + _, _, err := testVM(t, []bpf.Instruction{ + bpf.Jump{ + Skip: 1, + }, + bpf.RetA{}, + }) + if errStr(err) != "cannot jump 1 instructions; jumping past program bounds" { + t.Fatalf("unexpected error: %v", err) + } +} + +func TestVMJumpIfTrueOutOfProgram(t *testing.T) { + _, _, err := testVM(t, []bpf.Instruction{ + bpf.JumpIf{ + Cond: bpf.JumpEqual, + SkipTrue: 2, + }, + bpf.RetA{}, + }) + if errStr(err) != "cannot jump 2 instructions in true case; jumping past program bounds" { + t.Fatalf("unexpected error: %v", err) + } +} + +func TestVMJumpIfFalseOutOfProgram(t *testing.T) { + _, _, err := testVM(t, []bpf.Instruction{ + bpf.JumpIf{ + Cond: bpf.JumpEqual, + SkipFalse: 3, + }, + bpf.RetA{}, + }) + if errStr(err) != "cannot jump 3 instructions in false case; jumping past program bounds" { + t.Fatalf("unexpected error: %v", err) + } +} + +func TestVMJumpIfEqual(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 1, + }, + bpf.JumpIf{ + Cond: bpf.JumpEqual, + Val: 1, + SkipTrue: 1, + }, + bpf.RetConstant{ + Val: 0, + }, + bpf.RetConstant{ + Val: 9, + }, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 1, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 1, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMJumpIfNotEqual(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 1, + }, + bpf.JumpIf{ + Cond: bpf.JumpNotEqual, + Val: 1, + SkipFalse: 1, + }, + bpf.RetConstant{ + Val: 0, + }, + bpf.RetConstant{ + Val: 9, + }, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 1, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 1, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMJumpIfGreaterThan(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 4, + }, + bpf.JumpIf{ + Cond: bpf.JumpGreaterThan, + Val: 0x00010202, + SkipTrue: 1, + }, + bpf.RetConstant{ + Val: 0, + }, + bpf.RetConstant{ + Val: 12, + }, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0, 1, 2, 3, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 4, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMJumpIfLessThan(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 4, + }, + bpf.JumpIf{ + Cond: bpf.JumpLessThan, + Val: 0xff010203, + SkipTrue: 1, + }, + bpf.RetConstant{ + Val: 0, + }, + bpf.RetConstant{ + Val: 12, + }, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0, 1, 2, 3, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 4, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMJumpIfGreaterOrEqual(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 4, + }, + bpf.JumpIf{ + Cond: bpf.JumpGreaterOrEqual, + Val: 0x00010203, + SkipTrue: 1, + }, + bpf.RetConstant{ + Val: 0, + }, + bpf.RetConstant{ + Val: 12, + }, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0, 1, 2, 3, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 4, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMJumpIfLessOrEqual(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 4, + }, + bpf.JumpIf{ + Cond: bpf.JumpLessOrEqual, + Val: 0xff010203, + SkipTrue: 1, + }, + bpf.RetConstant{ + Val: 0, + }, + bpf.RetConstant{ + Val: 12, + }, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0, 1, 2, 3, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 4, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMJumpIfBitsSet(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 2, + }, + bpf.JumpIf{ + Cond: bpf.JumpBitsSet, + Val: 0x1122, + SkipTrue: 1, + }, + bpf.RetConstant{ + Val: 0, + }, + bpf.RetConstant{ + Val: 10, + }, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0x01, 0x02, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 2, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMJumpIfBitsNotSet(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 2, + }, + bpf.JumpIf{ + Cond: bpf.JumpBitsNotSet, + Val: 0x1221, + SkipTrue: 1, + }, + bpf.RetConstant{ + Val: 0, + }, + bpf.RetConstant{ + Val: 10, + }, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0x01, 0x02, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 2, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} diff --git a/api/vendor/golang.org/x/net/bpf/vm_load_test.go b/api/vendor/golang.org/x/net/bpf/vm_load_test.go new file mode 100644 index 0000000..04578b6 --- /dev/null +++ b/api/vendor/golang.org/x/net/bpf/vm_load_test.go @@ -0,0 +1,246 @@ +// 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 bpf_test + +import ( + "net" + "testing" + + "golang.org/x/net/bpf" + "golang.org/x/net/ipv4" +) + +func TestVMLoadAbsoluteOffsetOutOfBounds(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 100, + Size: 2, + }, + bpf.RetA{}, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0, 1, 2, 3, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 0, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMLoadAbsoluteOffsetPlusSizeOutOfBounds(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 2, + }, + bpf.RetA{}, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 0, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMLoadAbsoluteBadInstructionSize(t *testing.T) { + _, _, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Size: 5, + }, + bpf.RetA{}, + }) + if errStr(err) != "assembling instruction 1: invalid load byte length 0" { + t.Fatalf("unexpected error: %v", err) + } +} + +func TestVMLoadConstantOK(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadConstant{ + Dst: bpf.RegX, + Val: 9, + }, + bpf.TXA{}, + bpf.RetA{}, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 1, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMLoadIndirectOutOfBounds(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadIndirect{ + Off: 100, + Size: 1, + }, + bpf.RetA{}, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 0, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMLoadMemShiftOutOfBounds(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadMemShift{ + Off: 100, + }, + bpf.RetA{}, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 0, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +const ( + dhcp4Port = 53 +) + +func TestVMLoadMemShiftLoadIndirectNoResult(t *testing.T) { + vm, in, done := testDHCPv4(t) + defer done() + + // Append mostly empty UDP header with incorrect DHCPv4 port + in = append(in, []byte{ + 0, 0, + 0, dhcp4Port + 1, + 0, 0, + 0, 0, + }...) + + out, err := vm.Run(in) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 0, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMLoadMemShiftLoadIndirectOK(t *testing.T) { + vm, in, done := testDHCPv4(t) + defer done() + + // Append mostly empty UDP header with correct DHCPv4 port + in = append(in, []byte{ + 0, 0, + 0, dhcp4Port, + 0, 0, + 0, 0, + }...) + + out, err := vm.Run(in) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := len(in)-8, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func testDHCPv4(t *testing.T) (virtualMachine, []byte, func()) { + // DHCPv4 test data courtesy of David Anderson: + // https://github.com/google/netboot/blob/master/dhcp4/conn_linux.go#L59-L70 + vm, done, err := testVM(t, []bpf.Instruction{ + // Load IPv4 packet length + bpf.LoadMemShift{Off: 8}, + // Get UDP dport + bpf.LoadIndirect{Off: 8 + 2, Size: 2}, + // Correct dport? + bpf.JumpIf{Cond: bpf.JumpEqual, Val: dhcp4Port, SkipFalse: 1}, + // Accept + bpf.RetConstant{Val: 1500}, + // Ignore + bpf.RetConstant{Val: 0}, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + + // Minimal requirements to make a valid IPv4 header + h := &ipv4.Header{ + Len: ipv4.HeaderLen, + Src: net.IPv4(192, 168, 1, 1), + Dst: net.IPv4(192, 168, 1, 2), + } + hb, err := h.Marshal() + if err != nil { + t.Fatalf("failed to marshal IPv4 header: %v", err) + } + + hb = append([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + }, hb...) + + return vm, hb, done +} diff --git a/api/vendor/golang.org/x/net/bpf/vm_ret_test.go b/api/vendor/golang.org/x/net/bpf/vm_ret_test.go new file mode 100644 index 0000000..2d86eae --- /dev/null +++ b/api/vendor/golang.org/x/net/bpf/vm_ret_test.go @@ -0,0 +1,115 @@ +// 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 bpf_test + +import ( + "testing" + + "golang.org/x/net/bpf" +) + +func TestVMRetA(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 1, + }, + bpf.RetA{}, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 9, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 1, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMRetALargerThanInput(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadAbsolute{ + Off: 8, + Size: 2, + }, + bpf.RetA{}, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0, 255, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 2, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMRetConstant(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.RetConstant{ + Val: 9, + }, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0, 1, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 1, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMRetConstantLargerThanInput(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.RetConstant{ + Val: 16, + }, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0, 1, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 2, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} diff --git a/api/vendor/golang.org/x/net/bpf/vm_scratch_test.go b/api/vendor/golang.org/x/net/bpf/vm_scratch_test.go new file mode 100644 index 0000000..e600e3c --- /dev/null +++ b/api/vendor/golang.org/x/net/bpf/vm_scratch_test.go @@ -0,0 +1,247 @@ +// 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 bpf_test + +import ( + "testing" + + "golang.org/x/net/bpf" +) + +func TestVMStoreScratchInvalidScratchRegisterTooSmall(t *testing.T) { + _, _, err := testVM(t, []bpf.Instruction{ + bpf.StoreScratch{ + Src: bpf.RegA, + N: -1, + }, + bpf.RetA{}, + }) + if errStr(err) != "assembling instruction 1: invalid scratch slot -1" { + t.Fatalf("unexpected error: %v", err) + } +} + +func TestVMStoreScratchInvalidScratchRegisterTooLarge(t *testing.T) { + _, _, err := testVM(t, []bpf.Instruction{ + bpf.StoreScratch{ + Src: bpf.RegA, + N: 16, + }, + bpf.RetA{}, + }) + if errStr(err) != "assembling instruction 1: invalid scratch slot 16" { + t.Fatalf("unexpected error: %v", err) + } +} + +func TestVMStoreScratchUnknownSourceRegister(t *testing.T) { + _, _, err := testVM(t, []bpf.Instruction{ + bpf.StoreScratch{ + Src: 100, + N: 0, + }, + bpf.RetA{}, + }) + if errStr(err) != "assembling instruction 1: invalid source register 100" { + t.Fatalf("unexpected error: %v", err) + } +} + +func TestVMLoadScratchInvalidScratchRegisterTooSmall(t *testing.T) { + _, _, err := testVM(t, []bpf.Instruction{ + bpf.LoadScratch{ + Dst: bpf.RegX, + N: -1, + }, + bpf.RetA{}, + }) + if errStr(err) != "assembling instruction 1: invalid scratch slot -1" { + t.Fatalf("unexpected error: %v", err) + } +} + +func TestVMLoadScratchInvalidScratchRegisterTooLarge(t *testing.T) { + _, _, err := testVM(t, []bpf.Instruction{ + bpf.LoadScratch{ + Dst: bpf.RegX, + N: 16, + }, + bpf.RetA{}, + }) + if errStr(err) != "assembling instruction 1: invalid scratch slot 16" { + t.Fatalf("unexpected error: %v", err) + } +} + +func TestVMLoadScratchUnknownDestinationRegister(t *testing.T) { + _, _, err := testVM(t, []bpf.Instruction{ + bpf.LoadScratch{ + Dst: 100, + N: 0, + }, + bpf.RetA{}, + }) + if errStr(err) != "assembling instruction 1: invalid target register 100" { + t.Fatalf("unexpected error: %v", err) + } +} + +func TestVMStoreScratchLoadScratchOneValue(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + // Load byte 255 + bpf.LoadAbsolute{ + Off: 8, + Size: 1, + }, + // Copy to X and store in scratch[0] + bpf.TAX{}, + bpf.StoreScratch{ + Src: bpf.RegX, + N: 0, + }, + // Load byte 1 + bpf.LoadAbsolute{ + Off: 9, + Size: 1, + }, + // Overwrite 1 with 255 from scratch[0] + bpf.LoadScratch{ + Dst: bpf.RegA, + N: 0, + }, + // Return 255 + bpf.RetA{}, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 255, 1, 2, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 3, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} + +func TestVMStoreScratchLoadScratchMultipleValues(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + // Load byte 10 + bpf.LoadAbsolute{ + Off: 8, + Size: 1, + }, + // Store in scratch[0] + bpf.StoreScratch{ + Src: bpf.RegA, + N: 0, + }, + // Load byte 20 + bpf.LoadAbsolute{ + Off: 9, + Size: 1, + }, + // Store in scratch[1] + bpf.StoreScratch{ + Src: bpf.RegA, + N: 1, + }, + // Load byte 30 + bpf.LoadAbsolute{ + Off: 10, + Size: 1, + }, + // Store in scratch[2] + bpf.StoreScratch{ + Src: bpf.RegA, + N: 2, + }, + // Load byte 1 + bpf.LoadAbsolute{ + Off: 11, + Size: 1, + }, + // Store in scratch[3] + bpf.StoreScratch{ + Src: bpf.RegA, + N: 3, + }, + // Load in byte 10 to X + bpf.LoadScratch{ + Dst: bpf.RegX, + N: 0, + }, + // Copy X -> A + bpf.TXA{}, + // Verify value is 10 + bpf.JumpIf{ + Cond: bpf.JumpEqual, + Val: 10, + SkipTrue: 1, + }, + // Fail test if incorrect + bpf.RetConstant{ + Val: 0, + }, + // Load in byte 20 to A + bpf.LoadScratch{ + Dst: bpf.RegA, + N: 1, + }, + // Verify value is 20 + bpf.JumpIf{ + Cond: bpf.JumpEqual, + Val: 20, + SkipTrue: 1, + }, + // Fail test if incorrect + bpf.RetConstant{ + Val: 0, + }, + // Load in byte 30 to A + bpf.LoadScratch{ + Dst: bpf.RegA, + N: 2, + }, + // Verify value is 30 + bpf.JumpIf{ + Cond: bpf.JumpEqual, + Val: 30, + SkipTrue: 1, + }, + // Fail test if incorrect + bpf.RetConstant{ + Val: 0, + }, + // Return first two bytes on success + bpf.RetConstant{ + Val: 10, + }, + }) + if err != nil { + t.Fatalf("failed to load BPF program: %v", err) + } + defer done() + + out, err := vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 10, 20, 30, 1, + }) + if err != nil { + t.Fatalf("unexpected error while running program: %v", err) + } + if want, got := 2, out; want != got { + t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", + want, got) + } +} diff --git a/api/vendor/golang.org/x/net/bpf/vm_test.go b/api/vendor/golang.org/x/net/bpf/vm_test.go new file mode 100644 index 0000000..6bd4dd5 --- /dev/null +++ b/api/vendor/golang.org/x/net/bpf/vm_test.go @@ -0,0 +1,144 @@ +// 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 bpf_test + +import ( + "fmt" + "testing" + + "golang.org/x/net/bpf" +) + +var _ bpf.Instruction = unknown{} + +type unknown struct{} + +func (unknown) Assemble() (bpf.RawInstruction, error) { + return bpf.RawInstruction{}, nil +} + +func TestVMUnknownInstruction(t *testing.T) { + vm, done, err := testVM(t, []bpf.Instruction{ + bpf.LoadConstant{ + Dst: bpf.RegA, + Val: 100, + }, + // Should terminate the program with an error immediately + unknown{}, + bpf.RetA{}, + }) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + defer done() + + _, err = vm.Run([]byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, + }) + if errStr(err) != "unknown Instruction at index 1: bpf_test.unknown" { + t.Fatalf("unexpected error while running program: %v", err) + } +} + +func TestVMNoReturnInstruction(t *testing.T) { + _, _, err := testVM(t, []bpf.Instruction{ + bpf.LoadConstant{ + Dst: bpf.RegA, + Val: 1, + }, + }) + if errStr(err) != "BPF program must end with RetA or RetConstant" { + t.Fatalf("unexpected error: %v", err) + } +} + +func TestVMNoInputInstructions(t *testing.T) { + _, _, err := testVM(t, []bpf.Instruction{}) + if errStr(err) != "one or more Instructions must be specified" { + t.Fatalf("unexpected error: %v", err) + } +} + +// ExampleNewVM demonstrates usage of a VM, using an Ethernet frame +// as input and checking its EtherType to determine if it should be accepted. +func ExampleNewVM() { + // Offset | Length | Comment + // ------------------------- + // 00 | 06 | Ethernet destination MAC address + // 06 | 06 | Ethernet source MAC address + // 12 | 02 | Ethernet EtherType + const ( + etOff = 12 + etLen = 2 + + etARP = 0x0806 + ) + + // Set up a VM to filter traffic based on if its EtherType + // matches the ARP EtherType. + vm, err := bpf.NewVM([]bpf.Instruction{ + // Load EtherType value from Ethernet header + bpf.LoadAbsolute{ + Off: etOff, + Size: etLen, + }, + // If EtherType is equal to the ARP EtherType, jump to allow + // packet to be accepted + bpf.JumpIf{ + Cond: bpf.JumpEqual, + Val: etARP, + SkipTrue: 1, + }, + // EtherType does not match the ARP EtherType + bpf.RetConstant{ + Val: 0, + }, + // EtherType matches the ARP EtherType, accept up to 1500 + // bytes of packet + bpf.RetConstant{ + Val: 1500, + }, + }) + if err != nil { + panic(fmt.Sprintf("failed to load BPF program: %v", err)) + } + + // Create an Ethernet frame with the ARP EtherType for testing + frame := []byte{ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, + 0x08, 0x06, + // Payload omitted for brevity + } + + // Run our VM's BPF program using the Ethernet frame as input + out, err := vm.Run(frame) + if err != nil { + panic(fmt.Sprintf("failed to accept Ethernet frame: %v", err)) + } + + // BPF VM can return a byte count greater than the number of input + // bytes, so trim the output to match the input byte length + if out > len(frame) { + out = len(frame) + } + + fmt.Printf("out: %d bytes", out) + + // Output: + // out: 14 bytes +} + +// errStr returns the string representation of an error, or +// "" if it is nil. +func errStr(err error) string { + if err == nil { + return "" + } + + return err.Error() +} diff --git a/api/vendor/golang.org/x/net/codereview.cfg b/api/vendor/golang.org/x/net/codereview.cfg new file mode 100644 index 0000000..3f8b14b --- /dev/null +++ b/api/vendor/golang.org/x/net/codereview.cfg @@ -0,0 +1 @@ +issuerepo: golang/go diff --git a/api/vendor/golang.org/x/net/context/context.go b/api/vendor/golang.org/x/net/context/context.go new file mode 100644 index 0000000..a3c021d --- /dev/null +++ b/api/vendor/golang.org/x/net/context/context.go @@ -0,0 +1,56 @@ +// 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 context defines the Context type, which carries deadlines, +// cancelation signals, and other request-scoped values across API boundaries +// and between processes. +// As of Go 1.7 this package is available in the standard library under the +// name context. https://golang.org/pkg/context. +// +// Incoming requests to a server should create a Context, and outgoing calls to +// servers should accept a Context. The chain of function calls between must +// propagate the Context, optionally replacing it with a modified copy created +// using WithDeadline, WithTimeout, WithCancel, or WithValue. +// +// Programs that use Contexts should follow these rules to keep interfaces +// consistent across packages and enable static analysis tools to check context +// propagation: +// +// Do not store Contexts inside a struct type; instead, pass a Context +// explicitly to each function that needs it. The Context should be the first +// parameter, typically named ctx: +// +// func DoSomething(ctx context.Context, arg Arg) error { +// // ... use ctx ... +// } +// +// Do not pass a nil Context, even if a function permits it. Pass context.TODO +// if you are unsure about which Context to use. +// +// Use context Values only for request-scoped data that transits processes and +// APIs, not for passing optional parameters to functions. +// +// The same Context may be passed to functions running in different goroutines; +// Contexts are safe for simultaneous use by multiple goroutines. +// +// See http://blog.golang.org/context for example code for a server that uses +// Contexts. +package context // import "golang.org/x/net/context" + +// Background returns a non-nil, empty Context. It is never canceled, has no +// values, and has no deadline. It is typically used by the main function, +// initialization, and tests, and as the top-level Context for incoming +// requests. +func Background() Context { + return background +} + +// TODO returns a non-nil, empty Context. Code should use context.TODO when +// it's unclear which Context to use or it is not yet available (because the +// surrounding function has not yet been extended to accept a Context +// parameter). TODO is recognized by static analysis tools that determine +// whether Contexts are propagated correctly in a program. +func TODO() Context { + return todo +} diff --git a/api/vendor/golang.org/x/net/context/context_test.go b/api/vendor/golang.org/x/net/context/context_test.go new file mode 100644 index 0000000..6284413 --- /dev/null +++ b/api/vendor/golang.org/x/net/context/context_test.go @@ -0,0 +1,583 @@ +// 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. + +// +build !go1.7 + +package context + +import ( + "fmt" + "math/rand" + "runtime" + "strings" + "sync" + "testing" + "time" +) + +// otherContext is a Context that's not one of the types defined in context.go. +// This lets us test code paths that differ based on the underlying type of the +// Context. +type otherContext struct { + Context +} + +func TestBackground(t *testing.T) { + c := Background() + if c == nil { + t.Fatalf("Background returned nil") + } + select { + case x := <-c.Done(): + t.Errorf("<-c.Done() == %v want nothing (it should block)", x) + default: + } + if got, want := fmt.Sprint(c), "context.Background"; got != want { + t.Errorf("Background().String() = %q want %q", got, want) + } +} + +func TestTODO(t *testing.T) { + c := TODO() + if c == nil { + t.Fatalf("TODO returned nil") + } + select { + case x := <-c.Done(): + t.Errorf("<-c.Done() == %v want nothing (it should block)", x) + default: + } + if got, want := fmt.Sprint(c), "context.TODO"; got != want { + t.Errorf("TODO().String() = %q want %q", got, want) + } +} + +func TestWithCancel(t *testing.T) { + c1, cancel := WithCancel(Background()) + + if got, want := fmt.Sprint(c1), "context.Background.WithCancel"; got != want { + t.Errorf("c1.String() = %q want %q", got, want) + } + + o := otherContext{c1} + c2, _ := WithCancel(o) + contexts := []Context{c1, o, c2} + + for i, c := range contexts { + if d := c.Done(); d == nil { + t.Errorf("c[%d].Done() == %v want non-nil", i, d) + } + if e := c.Err(); e != nil { + t.Errorf("c[%d].Err() == %v want nil", i, e) + } + + select { + case x := <-c.Done(): + t.Errorf("<-c.Done() == %v want nothing (it should block)", x) + default: + } + } + + cancel() + time.Sleep(100 * time.Millisecond) // let cancelation propagate + + for i, c := range contexts { + select { + case <-c.Done(): + default: + t.Errorf("<-c[%d].Done() blocked, but shouldn't have", i) + } + if e := c.Err(); e != Canceled { + t.Errorf("c[%d].Err() == %v want %v", i, e, Canceled) + } + } +} + +func TestParentFinishesChild(t *testing.T) { + // Context tree: + // parent -> cancelChild + // parent -> valueChild -> timerChild + parent, cancel := WithCancel(Background()) + cancelChild, stop := WithCancel(parent) + defer stop() + valueChild := WithValue(parent, "key", "value") + timerChild, stop := WithTimeout(valueChild, 10000*time.Hour) + defer stop() + + select { + case x := <-parent.Done(): + t.Errorf("<-parent.Done() == %v want nothing (it should block)", x) + case x := <-cancelChild.Done(): + t.Errorf("<-cancelChild.Done() == %v want nothing (it should block)", x) + case x := <-timerChild.Done(): + t.Errorf("<-timerChild.Done() == %v want nothing (it should block)", x) + case x := <-valueChild.Done(): + t.Errorf("<-valueChild.Done() == %v want nothing (it should block)", x) + default: + } + + // The parent's children should contain the two cancelable children. + pc := parent.(*cancelCtx) + cc := cancelChild.(*cancelCtx) + tc := timerChild.(*timerCtx) + pc.mu.Lock() + if len(pc.children) != 2 || !pc.children[cc] || !pc.children[tc] { + t.Errorf("bad linkage: pc.children = %v, want %v and %v", + pc.children, cc, tc) + } + pc.mu.Unlock() + + if p, ok := parentCancelCtx(cc.Context); !ok || p != pc { + t.Errorf("bad linkage: parentCancelCtx(cancelChild.Context) = %v, %v want %v, true", p, ok, pc) + } + if p, ok := parentCancelCtx(tc.Context); !ok || p != pc { + t.Errorf("bad linkage: parentCancelCtx(timerChild.Context) = %v, %v want %v, true", p, ok, pc) + } + + cancel() + + pc.mu.Lock() + if len(pc.children) != 0 { + t.Errorf("pc.cancel didn't clear pc.children = %v", pc.children) + } + pc.mu.Unlock() + + // parent and children should all be finished. + check := func(ctx Context, name string) { + select { + case <-ctx.Done(): + default: + t.Errorf("<-%s.Done() blocked, but shouldn't have", name) + } + if e := ctx.Err(); e != Canceled { + t.Errorf("%s.Err() == %v want %v", name, e, Canceled) + } + } + check(parent, "parent") + check(cancelChild, "cancelChild") + check(valueChild, "valueChild") + check(timerChild, "timerChild") + + // WithCancel should return a canceled context on a canceled parent. + precanceledChild := WithValue(parent, "key", "value") + select { + case <-precanceledChild.Done(): + default: + t.Errorf("<-precanceledChild.Done() blocked, but shouldn't have") + } + if e := precanceledChild.Err(); e != Canceled { + t.Errorf("precanceledChild.Err() == %v want %v", e, Canceled) + } +} + +func TestChildFinishesFirst(t *testing.T) { + cancelable, stop := WithCancel(Background()) + defer stop() + for _, parent := range []Context{Background(), cancelable} { + child, cancel := WithCancel(parent) + + select { + case x := <-parent.Done(): + t.Errorf("<-parent.Done() == %v want nothing (it should block)", x) + case x := <-child.Done(): + t.Errorf("<-child.Done() == %v want nothing (it should block)", x) + default: + } + + cc := child.(*cancelCtx) + pc, pcok := parent.(*cancelCtx) // pcok == false when parent == Background() + if p, ok := parentCancelCtx(cc.Context); ok != pcok || (ok && pc != p) { + t.Errorf("bad linkage: parentCancelCtx(cc.Context) = %v, %v want %v, %v", p, ok, pc, pcok) + } + + if pcok { + pc.mu.Lock() + if len(pc.children) != 1 || !pc.children[cc] { + t.Errorf("bad linkage: pc.children = %v, cc = %v", pc.children, cc) + } + pc.mu.Unlock() + } + + cancel() + + if pcok { + pc.mu.Lock() + if len(pc.children) != 0 { + t.Errorf("child's cancel didn't remove self from pc.children = %v", pc.children) + } + pc.mu.Unlock() + } + + // child should be finished. + select { + case <-child.Done(): + default: + t.Errorf("<-child.Done() blocked, but shouldn't have") + } + if e := child.Err(); e != Canceled { + t.Errorf("child.Err() == %v want %v", e, Canceled) + } + + // parent should not be finished. + select { + case x := <-parent.Done(): + t.Errorf("<-parent.Done() == %v want nothing (it should block)", x) + default: + } + if e := parent.Err(); e != nil { + t.Errorf("parent.Err() == %v want nil", e) + } + } +} + +func testDeadline(c Context, wait time.Duration, t *testing.T) { + select { + case <-time.After(wait): + t.Fatalf("context should have timed out") + case <-c.Done(): + } + if e := c.Err(); e != DeadlineExceeded { + t.Errorf("c.Err() == %v want %v", e, DeadlineExceeded) + } +} + +func TestDeadline(t *testing.T) { + t.Parallel() + const timeUnit = 500 * time.Millisecond + c, _ := WithDeadline(Background(), time.Now().Add(1*timeUnit)) + if got, prefix := fmt.Sprint(c), "context.Background.WithDeadline("; !strings.HasPrefix(got, prefix) { + t.Errorf("c.String() = %q want prefix %q", got, prefix) + } + testDeadline(c, 2*timeUnit, t) + + c, _ = WithDeadline(Background(), time.Now().Add(1*timeUnit)) + o := otherContext{c} + testDeadline(o, 2*timeUnit, t) + + c, _ = WithDeadline(Background(), time.Now().Add(1*timeUnit)) + o = otherContext{c} + c, _ = WithDeadline(o, time.Now().Add(3*timeUnit)) + testDeadline(c, 2*timeUnit, t) +} + +func TestTimeout(t *testing.T) { + t.Parallel() + const timeUnit = 500 * time.Millisecond + c, _ := WithTimeout(Background(), 1*timeUnit) + if got, prefix := fmt.Sprint(c), "context.Background.WithDeadline("; !strings.HasPrefix(got, prefix) { + t.Errorf("c.String() = %q want prefix %q", got, prefix) + } + testDeadline(c, 2*timeUnit, t) + + c, _ = WithTimeout(Background(), 1*timeUnit) + o := otherContext{c} + testDeadline(o, 2*timeUnit, t) + + c, _ = WithTimeout(Background(), 1*timeUnit) + o = otherContext{c} + c, _ = WithTimeout(o, 3*timeUnit) + testDeadline(c, 2*timeUnit, t) +} + +func TestCanceledTimeout(t *testing.T) { + t.Parallel() + const timeUnit = 500 * time.Millisecond + c, _ := WithTimeout(Background(), 2*timeUnit) + o := otherContext{c} + c, cancel := WithTimeout(o, 4*timeUnit) + cancel() + time.Sleep(1 * timeUnit) // let cancelation propagate + select { + case <-c.Done(): + default: + t.Errorf("<-c.Done() blocked, but shouldn't have") + } + if e := c.Err(); e != Canceled { + t.Errorf("c.Err() == %v want %v", e, Canceled) + } +} + +type key1 int +type key2 int + +var k1 = key1(1) +var k2 = key2(1) // same int as k1, different type +var k3 = key2(3) // same type as k2, different int + +func TestValues(t *testing.T) { + check := func(c Context, nm, v1, v2, v3 string) { + if v, ok := c.Value(k1).(string); ok == (len(v1) == 0) || v != v1 { + t.Errorf(`%s.Value(k1).(string) = %q, %t want %q, %t`, nm, v, ok, v1, len(v1) != 0) + } + if v, ok := c.Value(k2).(string); ok == (len(v2) == 0) || v != v2 { + t.Errorf(`%s.Value(k2).(string) = %q, %t want %q, %t`, nm, v, ok, v2, len(v2) != 0) + } + if v, ok := c.Value(k3).(string); ok == (len(v3) == 0) || v != v3 { + t.Errorf(`%s.Value(k3).(string) = %q, %t want %q, %t`, nm, v, ok, v3, len(v3) != 0) + } + } + + c0 := Background() + check(c0, "c0", "", "", "") + + c1 := WithValue(Background(), k1, "c1k1") + check(c1, "c1", "c1k1", "", "") + + if got, want := fmt.Sprint(c1), `context.Background.WithValue(1, "c1k1")`; got != want { + t.Errorf("c.String() = %q want %q", got, want) + } + + c2 := WithValue(c1, k2, "c2k2") + check(c2, "c2", "c1k1", "c2k2", "") + + c3 := WithValue(c2, k3, "c3k3") + check(c3, "c2", "c1k1", "c2k2", "c3k3") + + c4 := WithValue(c3, k1, nil) + check(c4, "c4", "", "c2k2", "c3k3") + + o0 := otherContext{Background()} + check(o0, "o0", "", "", "") + + o1 := otherContext{WithValue(Background(), k1, "c1k1")} + check(o1, "o1", "c1k1", "", "") + + o2 := WithValue(o1, k2, "o2k2") + check(o2, "o2", "c1k1", "o2k2", "") + + o3 := otherContext{c4} + check(o3, "o3", "", "c2k2", "c3k3") + + o4 := WithValue(o3, k3, nil) + check(o4, "o4", "", "c2k2", "") +} + +func TestAllocs(t *testing.T) { + bg := Background() + for _, test := range []struct { + desc string + f func() + limit float64 + gccgoLimit float64 + }{ + { + desc: "Background()", + f: func() { Background() }, + limit: 0, + gccgoLimit: 0, + }, + { + desc: fmt.Sprintf("WithValue(bg, %v, nil)", k1), + f: func() { + c := WithValue(bg, k1, nil) + c.Value(k1) + }, + limit: 3, + gccgoLimit: 3, + }, + { + desc: "WithTimeout(bg, 15*time.Millisecond)", + f: func() { + c, _ := WithTimeout(bg, 15*time.Millisecond) + <-c.Done() + }, + limit: 8, + gccgoLimit: 16, + }, + { + desc: "WithCancel(bg)", + f: func() { + c, cancel := WithCancel(bg) + cancel() + <-c.Done() + }, + limit: 5, + gccgoLimit: 8, + }, + { + desc: "WithTimeout(bg, 100*time.Millisecond)", + f: func() { + c, cancel := WithTimeout(bg, 100*time.Millisecond) + cancel() + <-c.Done() + }, + limit: 8, + gccgoLimit: 25, + }, + } { + limit := test.limit + if runtime.Compiler == "gccgo" { + // gccgo does not yet do escape analysis. + // TODO(iant): Remove this when gccgo does do escape analysis. + limit = test.gccgoLimit + } + if n := testing.AllocsPerRun(100, test.f); n > limit { + t.Errorf("%s allocs = %f want %d", test.desc, n, int(limit)) + } + } +} + +func TestSimultaneousCancels(t *testing.T) { + root, cancel := WithCancel(Background()) + m := map[Context]CancelFunc{root: cancel} + q := []Context{root} + // Create a tree of contexts. + for len(q) != 0 && len(m) < 100 { + parent := q[0] + q = q[1:] + for i := 0; i < 4; i++ { + ctx, cancel := WithCancel(parent) + m[ctx] = cancel + q = append(q, ctx) + } + } + // Start all the cancels in a random order. + var wg sync.WaitGroup + wg.Add(len(m)) + for _, cancel := range m { + go func(cancel CancelFunc) { + cancel() + wg.Done() + }(cancel) + } + // Wait on all the contexts in a random order. + for ctx := range m { + select { + case <-ctx.Done(): + case <-time.After(1 * time.Second): + buf := make([]byte, 10<<10) + n := runtime.Stack(buf, true) + t.Fatalf("timed out waiting for <-ctx.Done(); stacks:\n%s", buf[:n]) + } + } + // Wait for all the cancel functions to return. + done := make(chan struct{}) + go func() { + wg.Wait() + close(done) + }() + select { + case <-done: + case <-time.After(1 * time.Second): + buf := make([]byte, 10<<10) + n := runtime.Stack(buf, true) + t.Fatalf("timed out waiting for cancel functions; stacks:\n%s", buf[:n]) + } +} + +func TestInterlockedCancels(t *testing.T) { + parent, cancelParent := WithCancel(Background()) + child, cancelChild := WithCancel(parent) + go func() { + parent.Done() + cancelChild() + }() + cancelParent() + select { + case <-child.Done(): + case <-time.After(1 * time.Second): + buf := make([]byte, 10<<10) + n := runtime.Stack(buf, true) + t.Fatalf("timed out waiting for child.Done(); stacks:\n%s", buf[:n]) + } +} + +func TestLayersCancel(t *testing.T) { + testLayers(t, time.Now().UnixNano(), false) +} + +func TestLayersTimeout(t *testing.T) { + testLayers(t, time.Now().UnixNano(), true) +} + +func testLayers(t *testing.T, seed int64, testTimeout bool) { + rand.Seed(seed) + errorf := func(format string, a ...interface{}) { + t.Errorf(fmt.Sprintf("seed=%d: %s", seed, format), a...) + } + const ( + timeout = 200 * time.Millisecond + minLayers = 30 + ) + type value int + var ( + vals []*value + cancels []CancelFunc + numTimers int + ctx = Background() + ) + for i := 0; i < minLayers || numTimers == 0 || len(cancels) == 0 || len(vals) == 0; i++ { + switch rand.Intn(3) { + case 0: + v := new(value) + ctx = WithValue(ctx, v, v) + vals = append(vals, v) + case 1: + var cancel CancelFunc + ctx, cancel = WithCancel(ctx) + cancels = append(cancels, cancel) + case 2: + var cancel CancelFunc + ctx, cancel = WithTimeout(ctx, timeout) + cancels = append(cancels, cancel) + numTimers++ + } + } + checkValues := func(when string) { + for _, key := range vals { + if val := ctx.Value(key).(*value); key != val { + errorf("%s: ctx.Value(%p) = %p want %p", when, key, val, key) + } + } + } + select { + case <-ctx.Done(): + errorf("ctx should not be canceled yet") + default: + } + if s, prefix := fmt.Sprint(ctx), "context.Background."; !strings.HasPrefix(s, prefix) { + t.Errorf("ctx.String() = %q want prefix %q", s, prefix) + } + t.Log(ctx) + checkValues("before cancel") + if testTimeout { + select { + case <-ctx.Done(): + case <-time.After(timeout + 100*time.Millisecond): + errorf("ctx should have timed out") + } + checkValues("after timeout") + } else { + cancel := cancels[rand.Intn(len(cancels))] + cancel() + select { + case <-ctx.Done(): + default: + errorf("ctx should be canceled") + } + checkValues("after cancel") + } +} + +func TestCancelRemoves(t *testing.T) { + checkChildren := func(when string, ctx Context, want int) { + if got := len(ctx.(*cancelCtx).children); got != want { + t.Errorf("%s: context has %d children, want %d", when, got, want) + } + } + + ctx, _ := WithCancel(Background()) + checkChildren("after creation", ctx, 0) + _, cancel := WithCancel(ctx) + checkChildren("with WithCancel child ", ctx, 1) + cancel() + checkChildren("after cancelling WithCancel child", ctx, 0) + + ctx, _ = WithCancel(Background()) + checkChildren("after creation", ctx, 0) + _, cancel = WithTimeout(ctx, 60*time.Minute) + checkChildren("with WithTimeout child ", ctx, 1) + cancel() + checkChildren("after cancelling WithTimeout child", ctx, 0) +} diff --git a/api/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go b/api/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go new file mode 100644 index 0000000..606cf1f --- /dev/null +++ b/api/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go @@ -0,0 +1,74 @@ +// 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. + +// +build go1.7 + +// Package ctxhttp provides helper functions for performing context-aware HTTP requests. +package ctxhttp // import "golang.org/x/net/context/ctxhttp" + +import ( + "io" + "net/http" + "net/url" + "strings" + + "golang.org/x/net/context" +) + +// Do sends an HTTP request with the provided http.Client and returns +// an HTTP response. +// +// If the client is nil, http.DefaultClient is used. +// +// The provided ctx must be non-nil. If it is canceled or times out, +// ctx.Err() will be returned. +func Do(ctx context.Context, client *http.Client, req *http.Request) (*http.Response, error) { + if client == nil { + client = http.DefaultClient + } + resp, err := client.Do(req.WithContext(ctx)) + // If we got an error, and the context has been canceled, + // the context's error is probably more useful. + if err != nil { + select { + case <-ctx.Done(): + err = ctx.Err() + default: + } + } + return resp, err +} + +// Get issues a GET request via the Do function. +func Get(ctx context.Context, client *http.Client, url string) (*http.Response, error) { + req, err := http.NewRequest("GET", url, nil) + if err != nil { + return nil, err + } + return Do(ctx, client, req) +} + +// Head issues a HEAD request via the Do function. +func Head(ctx context.Context, client *http.Client, url string) (*http.Response, error) { + req, err := http.NewRequest("HEAD", url, nil) + if err != nil { + return nil, err + } + return Do(ctx, client, req) +} + +// Post issues a POST request via the Do function. +func Post(ctx context.Context, client *http.Client, url string, bodyType string, body io.Reader) (*http.Response, error) { + req, err := http.NewRequest("POST", url, body) + if err != nil { + return nil, err + } + req.Header.Set("Content-Type", bodyType) + return Do(ctx, client, req) +} + +// PostForm issues a POST request via the Do function. +func PostForm(ctx context.Context, client *http.Client, url string, data url.Values) (*http.Response, error) { + return Post(ctx, client, url, "application/x-www-form-urlencoded", strings.NewReader(data.Encode())) +} diff --git a/api/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_17_test.go b/api/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_17_test.go new file mode 100644 index 0000000..72411b1 --- /dev/null +++ b/api/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_17_test.go @@ -0,0 +1,29 @@ +// Copyright 2015 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 !plan9,go1.7 + +package ctxhttp + +import ( + "io" + "net/http" + "net/http/httptest" + "testing" + + "context" +) + +func TestGo17Context(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + io.WriteString(w, "ok") + })) + defer ts.Close() + ctx := context.Background() + resp, err := Get(ctx, http.DefaultClient, ts.URL) + if resp == nil || err != nil { + t.Fatalf("error received from client: %v %v", err, resp) + } + resp.Body.Close() +} diff --git a/api/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_pre17.go b/api/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_pre17.go new file mode 100644 index 0000000..926870c --- /dev/null +++ b/api/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_pre17.go @@ -0,0 +1,147 @@ +// Copyright 2015 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 !go1.7 + +package ctxhttp // import "golang.org/x/net/context/ctxhttp" + +import ( + "io" + "net/http" + "net/url" + "strings" + + "golang.org/x/net/context" +) + +func nop() {} + +var ( + testHookContextDoneBeforeHeaders = nop + testHookDoReturned = nop + testHookDidBodyClose = nop +) + +// Do sends an HTTP request with the provided http.Client and returns an HTTP response. +// If the client is nil, http.DefaultClient is used. +// If the context is canceled or times out, ctx.Err() will be returned. +func Do(ctx context.Context, client *http.Client, req *http.Request) (*http.Response, error) { + if client == nil { + client = http.DefaultClient + } + + // TODO(djd): Respect any existing value of req.Cancel. + cancel := make(chan struct{}) + req.Cancel = cancel + + type responseAndError struct { + resp *http.Response + err error + } + result := make(chan responseAndError, 1) + + // Make local copies of test hooks closed over by goroutines below. + // Prevents data races in tests. + testHookDoReturned := testHookDoReturned + testHookDidBodyClose := testHookDidBodyClose + + go func() { + resp, err := client.Do(req) + testHookDoReturned() + result <- responseAndError{resp, err} + }() + + var resp *http.Response + + select { + case <-ctx.Done(): + testHookContextDoneBeforeHeaders() + close(cancel) + // Clean up after the goroutine calling client.Do: + go func() { + if r := <-result; r.resp != nil { + testHookDidBodyClose() + r.resp.Body.Close() + } + }() + return nil, ctx.Err() + case r := <-result: + var err error + resp, err = r.resp, r.err + if err != nil { + return resp, err + } + } + + c := make(chan struct{}) + go func() { + select { + case <-ctx.Done(): + close(cancel) + case <-c: + // The response's Body is closed. + } + }() + resp.Body = ¬ifyingReader{resp.Body, c} + + return resp, nil +} + +// Get issues a GET request via the Do function. +func Get(ctx context.Context, client *http.Client, url string) (*http.Response, error) { + req, err := http.NewRequest("GET", url, nil) + if err != nil { + return nil, err + } + return Do(ctx, client, req) +} + +// Head issues a HEAD request via the Do function. +func Head(ctx context.Context, client *http.Client, url string) (*http.Response, error) { + req, err := http.NewRequest("HEAD", url, nil) + if err != nil { + return nil, err + } + return Do(ctx, client, req) +} + +// Post issues a POST request via the Do function. +func Post(ctx context.Context, client *http.Client, url string, bodyType string, body io.Reader) (*http.Response, error) { + req, err := http.NewRequest("POST", url, body) + if err != nil { + return nil, err + } + req.Header.Set("Content-Type", bodyType) + return Do(ctx, client, req) +} + +// PostForm issues a POST request via the Do function. +func PostForm(ctx context.Context, client *http.Client, url string, data url.Values) (*http.Response, error) { + return Post(ctx, client, url, "application/x-www-form-urlencoded", strings.NewReader(data.Encode())) +} + +// notifyingReader is an io.ReadCloser that closes the notify channel after +// Close is called or a Read fails on the underlying ReadCloser. +type notifyingReader struct { + io.ReadCloser + notify chan<- struct{} +} + +func (r *notifyingReader) Read(p []byte) (int, error) { + n, err := r.ReadCloser.Read(p) + if err != nil && r.notify != nil { + close(r.notify) + r.notify = nil + } + return n, err +} + +func (r *notifyingReader) Close() error { + err := r.ReadCloser.Close() + if r.notify != nil { + close(r.notify) + r.notify = nil + } + return err +} diff --git a/api/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_pre17_test.go b/api/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_pre17_test.go new file mode 100644 index 0000000..9159cf0 --- /dev/null +++ b/api/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_pre17_test.go @@ -0,0 +1,79 @@ +// Copyright 2015 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 !plan9,!go1.7 + +package ctxhttp + +import ( + "net" + "net/http" + "net/http/httptest" + "sync" + "testing" + "time" + + "golang.org/x/net/context" +) + +// golang.org/issue/14065 +func TestClosesResponseBodyOnCancel(t *testing.T) { + defer func() { testHookContextDoneBeforeHeaders = nop }() + defer func() { testHookDoReturned = nop }() + defer func() { testHookDidBodyClose = nop }() + + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {})) + defer ts.Close() + + ctx, cancel := context.WithCancel(context.Background()) + + // closed when Do enters select case <-ctx.Done() + enteredDonePath := make(chan struct{}) + + testHookContextDoneBeforeHeaders = func() { + close(enteredDonePath) + } + + testHookDoReturned = func() { + // We now have the result (the Flush'd headers) at least, + // so we can cancel the request. + cancel() + + // But block the client.Do goroutine from sending + // until Do enters into the <-ctx.Done() path, since + // otherwise if both channels are readable, select + // picks a random one. + <-enteredDonePath + } + + sawBodyClose := make(chan struct{}) + testHookDidBodyClose = func() { close(sawBodyClose) } + + tr := &http.Transport{} + defer tr.CloseIdleConnections() + c := &http.Client{Transport: tr} + req, _ := http.NewRequest("GET", ts.URL, nil) + _, doErr := Do(ctx, c, req) + + select { + case <-sawBodyClose: + case <-time.After(5 * time.Second): + t.Fatal("timeout waiting for body to close") + } + + if doErr != ctx.Err() { + t.Errorf("Do error = %v; want %v", doErr, ctx.Err()) + } +} + +type noteCloseConn struct { + net.Conn + onceClose sync.Once + closefn func() +} + +func (c *noteCloseConn) Close() error { + c.onceClose.Do(c.closefn) + return c.Conn.Close() +} diff --git a/api/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_test.go b/api/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_test.go new file mode 100644 index 0000000..1e41551 --- /dev/null +++ b/api/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_test.go @@ -0,0 +1,105 @@ +// Copyright 2015 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 !plan9 + +package ctxhttp + +import ( + "io" + "io/ioutil" + "net/http" + "net/http/httptest" + "testing" + "time" + + "golang.org/x/net/context" +) + +const ( + requestDuration = 100 * time.Millisecond + requestBody = "ok" +) + +func okHandler(w http.ResponseWriter, r *http.Request) { + time.Sleep(requestDuration) + io.WriteString(w, requestBody) +} + +func TestNoTimeout(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(okHandler)) + defer ts.Close() + + ctx := context.Background() + res, err := Get(ctx, nil, ts.URL) + if err != nil { + t.Fatal(err) + } + defer res.Body.Close() + slurp, err := ioutil.ReadAll(res.Body) + if err != nil { + t.Fatal(err) + } + if string(slurp) != requestBody { + t.Errorf("body = %q; want %q", slurp, requestBody) + } +} + +func TestCancelBeforeHeaders(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + + blockServer := make(chan struct{}) + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + cancel() + <-blockServer + io.WriteString(w, requestBody) + })) + defer ts.Close() + defer close(blockServer) + + res, err := Get(ctx, nil, ts.URL) + if err == nil { + res.Body.Close() + t.Fatal("Get returned unexpected nil error") + } + if err != context.Canceled { + t.Errorf("err = %v; want %v", err, context.Canceled) + } +} + +func TestCancelAfterHangingRequest(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) + w.(http.Flusher).Flush() + <-w.(http.CloseNotifier).CloseNotify() + })) + defer ts.Close() + + ctx, cancel := context.WithCancel(context.Background()) + resp, err := Get(ctx, nil, ts.URL) + if err != nil { + t.Fatalf("unexpected error in Get: %v", err) + } + + // Cancel befer reading the body. + // Reading Request.Body should fail, since the request was + // canceled before anything was written. + cancel() + + done := make(chan struct{}) + + go func() { + b, err := ioutil.ReadAll(resp.Body) + if len(b) != 0 || err == nil { + t.Errorf(`Read got (%q, %v); want ("", error)`, b, err) + } + close(done) + }() + + select { + case <-time.After(1 * time.Second): + t.Errorf("Test timed out") + case <-done: + } +} diff --git a/api/vendor/golang.org/x/net/context/go17.go b/api/vendor/golang.org/x/net/context/go17.go new file mode 100644 index 0000000..d20f52b --- /dev/null +++ b/api/vendor/golang.org/x/net/context/go17.go @@ -0,0 +1,72 @@ +// 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. + +// +build go1.7 + +package context + +import ( + "context" // standard library's context, as of Go 1.7 + "time" +) + +var ( + todo = context.TODO() + background = context.Background() +) + +// Canceled is the error returned by Context.Err when the context is canceled. +var Canceled = context.Canceled + +// DeadlineExceeded is the error returned by Context.Err when the context's +// deadline passes. +var DeadlineExceeded = context.DeadlineExceeded + +// WithCancel returns a copy of parent with a new Done channel. The returned +// context's Done channel is closed when the returned cancel function is called +// or when the parent context's Done channel is closed, whichever happens first. +// +// Canceling this context releases resources associated with it, so code should +// call cancel as soon as the operations running in this Context complete. +func WithCancel(parent Context) (ctx Context, cancel CancelFunc) { + ctx, f := context.WithCancel(parent) + return ctx, CancelFunc(f) +} + +// WithDeadline returns a copy of the parent context with the deadline adjusted +// to be no later than d. If the parent's deadline is already earlier than d, +// WithDeadline(parent, d) is semantically equivalent to parent. The returned +// context's Done channel is closed when the deadline expires, when the returned +// cancel function is called, or when the parent context's Done channel is +// closed, whichever happens first. +// +// Canceling this context releases resources associated with it, so code should +// call cancel as soon as the operations running in this Context complete. +func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc) { + ctx, f := context.WithDeadline(parent, deadline) + return ctx, CancelFunc(f) +} + +// WithTimeout returns WithDeadline(parent, time.Now().Add(timeout)). +// +// Canceling this context releases resources associated with it, so code should +// call cancel as soon as the operations running in this Context complete: +// +// func slowOperationWithTimeout(ctx context.Context) (Result, error) { +// ctx, cancel := context.WithTimeout(ctx, 100*time.Millisecond) +// defer cancel() // releases resources if slowOperation completes before timeout elapses +// return slowOperation(ctx) +// } +func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) { + return WithDeadline(parent, time.Now().Add(timeout)) +} + +// WithValue returns a copy of parent in which the value associated with key is +// val. +// +// Use context Values only for request-scoped data that transits processes and +// APIs, not for passing optional parameters to functions. +func WithValue(parent Context, key interface{}, val interface{}) Context { + return context.WithValue(parent, key, val) +} diff --git a/api/vendor/golang.org/x/net/context/go19.go b/api/vendor/golang.org/x/net/context/go19.go new file mode 100644 index 0000000..d88bd1d --- /dev/null +++ b/api/vendor/golang.org/x/net/context/go19.go @@ -0,0 +1,20 @@ +// 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. + +// +build go1.9 + +package context + +import "context" // standard library's context, as of Go 1.7 + +// A Context carries a deadline, a cancelation signal, and other values across +// API boundaries. +// +// Context's methods may be called by multiple goroutines simultaneously. +type Context = context.Context + +// A CancelFunc tells an operation to abandon its work. +// A CancelFunc does not wait for the work to stop. +// After the first call, subsequent calls to a CancelFunc do nothing. +type CancelFunc = context.CancelFunc diff --git a/api/vendor/golang.org/x/net/context/pre_go17.go b/api/vendor/golang.org/x/net/context/pre_go17.go new file mode 100644 index 0000000..0f35592 --- /dev/null +++ b/api/vendor/golang.org/x/net/context/pre_go17.go @@ -0,0 +1,300 @@ +// 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. + +// +build !go1.7 + +package context + +import ( + "errors" + "fmt" + "sync" + "time" +) + +// An emptyCtx is never canceled, has no values, and has no deadline. It is not +// struct{}, since vars of this type must have distinct addresses. +type emptyCtx int + +func (*emptyCtx) Deadline() (deadline time.Time, ok bool) { + return +} + +func (*emptyCtx) Done() <-chan struct{} { + return nil +} + +func (*emptyCtx) Err() error { + return nil +} + +func (*emptyCtx) Value(key interface{}) interface{} { + return nil +} + +func (e *emptyCtx) String() string { + switch e { + case background: + return "context.Background" + case todo: + return "context.TODO" + } + return "unknown empty Context" +} + +var ( + background = new(emptyCtx) + todo = new(emptyCtx) +) + +// Canceled is the error returned by Context.Err when the context is canceled. +var Canceled = errors.New("context canceled") + +// DeadlineExceeded is the error returned by Context.Err when the context's +// deadline passes. +var DeadlineExceeded = errors.New("context deadline exceeded") + +// WithCancel returns a copy of parent with a new Done channel. The returned +// context's Done channel is closed when the returned cancel function is called +// or when the parent context's Done channel is closed, whichever happens first. +// +// Canceling this context releases resources associated with it, so code should +// call cancel as soon as the operations running in this Context complete. +func WithCancel(parent Context) (ctx Context, cancel CancelFunc) { + c := newCancelCtx(parent) + propagateCancel(parent, c) + return c, func() { c.cancel(true, Canceled) } +} + +// newCancelCtx returns an initialized cancelCtx. +func newCancelCtx(parent Context) *cancelCtx { + return &cancelCtx{ + Context: parent, + done: make(chan struct{}), + } +} + +// propagateCancel arranges for child to be canceled when parent is. +func propagateCancel(parent Context, child canceler) { + if parent.Done() == nil { + return // parent is never canceled + } + if p, ok := parentCancelCtx(parent); ok { + p.mu.Lock() + if p.err != nil { + // parent has already been canceled + child.cancel(false, p.err) + } else { + if p.children == nil { + p.children = make(map[canceler]bool) + } + p.children[child] = true + } + p.mu.Unlock() + } else { + go func() { + select { + case <-parent.Done(): + child.cancel(false, parent.Err()) + case <-child.Done(): + } + }() + } +} + +// parentCancelCtx follows a chain of parent references until it finds a +// *cancelCtx. This function understands how each of the concrete types in this +// package represents its parent. +func parentCancelCtx(parent Context) (*cancelCtx, bool) { + for { + switch c := parent.(type) { + case *cancelCtx: + return c, true + case *timerCtx: + return c.cancelCtx, true + case *valueCtx: + parent = c.Context + default: + return nil, false + } + } +} + +// removeChild removes a context from its parent. +func removeChild(parent Context, child canceler) { + p, ok := parentCancelCtx(parent) + if !ok { + return + } + p.mu.Lock() + if p.children != nil { + delete(p.children, child) + } + p.mu.Unlock() +} + +// A canceler is a context type that can be canceled directly. The +// implementations are *cancelCtx and *timerCtx. +type canceler interface { + cancel(removeFromParent bool, err error) + Done() <-chan struct{} +} + +// A cancelCtx can be canceled. When canceled, it also cancels any children +// that implement canceler. +type cancelCtx struct { + Context + + done chan struct{} // closed by the first cancel call. + + mu sync.Mutex + children map[canceler]bool // set to nil by the first cancel call + err error // set to non-nil by the first cancel call +} + +func (c *cancelCtx) Done() <-chan struct{} { + return c.done +} + +func (c *cancelCtx) Err() error { + c.mu.Lock() + defer c.mu.Unlock() + return c.err +} + +func (c *cancelCtx) String() string { + return fmt.Sprintf("%v.WithCancel", c.Context) +} + +// cancel closes c.done, cancels each of c's children, and, if +// removeFromParent is true, removes c from its parent's children. +func (c *cancelCtx) cancel(removeFromParent bool, err error) { + if err == nil { + panic("context: internal error: missing cancel error") + } + c.mu.Lock() + if c.err != nil { + c.mu.Unlock() + return // already canceled + } + c.err = err + close(c.done) + for child := range c.children { + // NOTE: acquiring the child's lock while holding parent's lock. + child.cancel(false, err) + } + c.children = nil + c.mu.Unlock() + + if removeFromParent { + removeChild(c.Context, c) + } +} + +// WithDeadline returns a copy of the parent context with the deadline adjusted +// to be no later than d. If the parent's deadline is already earlier than d, +// WithDeadline(parent, d) is semantically equivalent to parent. The returned +// context's Done channel is closed when the deadline expires, when the returned +// cancel function is called, or when the parent context's Done channel is +// closed, whichever happens first. +// +// Canceling this context releases resources associated with it, so code should +// call cancel as soon as the operations running in this Context complete. +func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc) { + if cur, ok := parent.Deadline(); ok && cur.Before(deadline) { + // The current deadline is already sooner than the new one. + return WithCancel(parent) + } + c := &timerCtx{ + cancelCtx: newCancelCtx(parent), + deadline: deadline, + } + propagateCancel(parent, c) + d := deadline.Sub(time.Now()) + if d <= 0 { + c.cancel(true, DeadlineExceeded) // deadline has already passed + return c, func() { c.cancel(true, Canceled) } + } + c.mu.Lock() + defer c.mu.Unlock() + if c.err == nil { + c.timer = time.AfterFunc(d, func() { + c.cancel(true, DeadlineExceeded) + }) + } + return c, func() { c.cancel(true, Canceled) } +} + +// A timerCtx carries a timer and a deadline. It embeds a cancelCtx to +// implement Done and Err. It implements cancel by stopping its timer then +// delegating to cancelCtx.cancel. +type timerCtx struct { + *cancelCtx + timer *time.Timer // Under cancelCtx.mu. + + deadline time.Time +} + +func (c *timerCtx) Deadline() (deadline time.Time, ok bool) { + return c.deadline, true +} + +func (c *timerCtx) String() string { + return fmt.Sprintf("%v.WithDeadline(%s [%s])", c.cancelCtx.Context, c.deadline, c.deadline.Sub(time.Now())) +} + +func (c *timerCtx) cancel(removeFromParent bool, err error) { + c.cancelCtx.cancel(false, err) + if removeFromParent { + // Remove this timerCtx from its parent cancelCtx's children. + removeChild(c.cancelCtx.Context, c) + } + c.mu.Lock() + if c.timer != nil { + c.timer.Stop() + c.timer = nil + } + c.mu.Unlock() +} + +// WithTimeout returns WithDeadline(parent, time.Now().Add(timeout)). +// +// Canceling this context releases resources associated with it, so code should +// call cancel as soon as the operations running in this Context complete: +// +// func slowOperationWithTimeout(ctx context.Context) (Result, error) { +// ctx, cancel := context.WithTimeout(ctx, 100*time.Millisecond) +// defer cancel() // releases resources if slowOperation completes before timeout elapses +// return slowOperation(ctx) +// } +func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) { + return WithDeadline(parent, time.Now().Add(timeout)) +} + +// WithValue returns a copy of parent in which the value associated with key is +// val. +// +// Use context Values only for request-scoped data that transits processes and +// APIs, not for passing optional parameters to functions. +func WithValue(parent Context, key interface{}, val interface{}) Context { + return &valueCtx{parent, key, val} +} + +// A valueCtx carries a key-value pair. It implements Value for that key and +// delegates all other calls to the embedded Context. +type valueCtx struct { + Context + key, val interface{} +} + +func (c *valueCtx) String() string { + return fmt.Sprintf("%v.WithValue(%#v, %#v)", c.Context, c.key, c.val) +} + +func (c *valueCtx) Value(key interface{}) interface{} { + if c.key == key { + return c.val + } + return c.Context.Value(key) +} diff --git a/api/vendor/golang.org/x/net/context/pre_go19.go b/api/vendor/golang.org/x/net/context/pre_go19.go new file mode 100644 index 0000000..b105f80 --- /dev/null +++ b/api/vendor/golang.org/x/net/context/pre_go19.go @@ -0,0 +1,109 @@ +// 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. + +// +build !go1.9 + +package context + +import "time" + +// A Context carries a deadline, a cancelation signal, and other values across +// API boundaries. +// +// Context's methods may be called by multiple goroutines simultaneously. +type Context interface { + // Deadline returns the time when work done on behalf of this context + // should be canceled. Deadline returns ok==false when no deadline is + // set. Successive calls to Deadline return the same results. + Deadline() (deadline time.Time, ok bool) + + // Done returns a channel that's closed when work done on behalf of this + // context should be canceled. Done may return nil if this context can + // never be canceled. Successive calls to Done return the same value. + // + // WithCancel arranges for Done to be closed when cancel is called; + // WithDeadline arranges for Done to be closed when the deadline + // expires; WithTimeout arranges for Done to be closed when the timeout + // elapses. + // + // Done is provided for use in select statements: + // + // // Stream generates values with DoSomething and sends them to out + // // until DoSomething returns an error or ctx.Done is closed. + // func Stream(ctx context.Context, out chan<- Value) error { + // for { + // v, err := DoSomething(ctx) + // if err != nil { + // return err + // } + // select { + // case <-ctx.Done(): + // return ctx.Err() + // case out <- v: + // } + // } + // } + // + // See http://blog.golang.org/pipelines for more examples of how to use + // a Done channel for cancelation. + Done() <-chan struct{} + + // Err returns a non-nil error value after Done is closed. Err returns + // Canceled if the context was canceled or DeadlineExceeded if the + // context's deadline passed. No other values for Err are defined. + // After Done is closed, successive calls to Err return the same value. + Err() error + + // Value returns the value associated with this context for key, or nil + // if no value is associated with key. Successive calls to Value with + // the same key returns the same result. + // + // Use context values only for request-scoped data that transits + // processes and API boundaries, not for passing optional parameters to + // functions. + // + // A key identifies a specific value in a Context. Functions that wish + // to store values in Context typically allocate a key in a global + // variable then use that key as the argument to context.WithValue and + // Context.Value. A key can be any type that supports equality; + // packages should define keys as an unexported type to avoid + // collisions. + // + // Packages that define a Context key should provide type-safe accessors + // for the values stores using that key: + // + // // Package user defines a User type that's stored in Contexts. + // package user + // + // import "golang.org/x/net/context" + // + // // User is the type of value stored in the Contexts. + // type User struct {...} + // + // // key is an unexported type for keys defined in this package. + // // This prevents collisions with keys defined in other packages. + // type key int + // + // // userKey is the key for user.User values in Contexts. It is + // // unexported; clients use user.NewContext and user.FromContext + // // instead of using this key directly. + // var userKey key = 0 + // + // // NewContext returns a new Context that carries value u. + // func NewContext(ctx context.Context, u *User) context.Context { + // return context.WithValue(ctx, userKey, u) + // } + // + // // FromContext returns the User value stored in ctx, if any. + // func FromContext(ctx context.Context) (*User, bool) { + // u, ok := ctx.Value(userKey).(*User) + // return u, ok + // } + Value(key interface{}) interface{} +} + +// A CancelFunc tells an operation to abandon its work. +// A CancelFunc does not wait for the work to stop. +// After the first call, subsequent calls to a CancelFunc do nothing. +type CancelFunc func() diff --git a/api/vendor/golang.org/x/net/context/withtimeout_test.go b/api/vendor/golang.org/x/net/context/withtimeout_test.go new file mode 100644 index 0000000..e6f5669 --- /dev/null +++ b/api/vendor/golang.org/x/net/context/withtimeout_test.go @@ -0,0 +1,31 @@ +// 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 context_test + +import ( + "fmt" + "time" + + "golang.org/x/net/context" +) + +// This example passes a context with a timeout to tell a blocking function that +// it should abandon its work after the timeout elapses. +func ExampleWithTimeout() { + // Pass a context with a timeout to tell a blocking function that it + // should abandon its work after the timeout elapses. + ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond) + defer cancel() + + select { + case <-time.After(1 * time.Second): + fmt.Println("overslept") + case <-ctx.Done(): + fmt.Println(ctx.Err()) // prints "context deadline exceeded" + } + + // Output: + // context deadline exceeded +} diff --git a/api/vendor/golang.org/x/net/dict/dict.go b/api/vendor/golang.org/x/net/dict/dict.go new file mode 100644 index 0000000..93e65c0 --- /dev/null +++ b/api/vendor/golang.org/x/net/dict/dict.go @@ -0,0 +1,210 @@ +// 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 dict implements the Dictionary Server Protocol +// as defined in RFC 2229. +package dict // import "golang.org/x/net/dict" + +import ( + "net/textproto" + "strconv" + "strings" +) + +// A Client represents a client connection to a dictionary server. +type Client struct { + text *textproto.Conn +} + +// Dial returns a new client connected to a dictionary server at +// addr on the given network. +func Dial(network, addr string) (*Client, error) { + text, err := textproto.Dial(network, addr) + if err != nil { + return nil, err + } + _, _, err = text.ReadCodeLine(220) + if err != nil { + text.Close() + return nil, err + } + return &Client{text: text}, nil +} + +// Close closes the connection to the dictionary server. +func (c *Client) Close() error { + return c.text.Close() +} + +// A Dict represents a dictionary available on the server. +type Dict struct { + Name string // short name of dictionary + Desc string // long description +} + +// Dicts returns a list of the dictionaries available on the server. +func (c *Client) Dicts() ([]Dict, error) { + id, err := c.text.Cmd("SHOW DB") + if err != nil { + return nil, err + } + + c.text.StartResponse(id) + defer c.text.EndResponse(id) + + _, _, err = c.text.ReadCodeLine(110) + if err != nil { + return nil, err + } + lines, err := c.text.ReadDotLines() + if err != nil { + return nil, err + } + _, _, err = c.text.ReadCodeLine(250) + + dicts := make([]Dict, len(lines)) + for i := range dicts { + d := &dicts[i] + a, _ := fields(lines[i]) + if len(a) < 2 { + return nil, textproto.ProtocolError("invalid dictionary: " + lines[i]) + } + d.Name = a[0] + d.Desc = a[1] + } + return dicts, err +} + +// A Defn represents a definition. +type Defn struct { + Dict Dict // Dict where definition was found + Word string // Word being defined + Text []byte // Definition text, typically multiple lines +} + +// Define requests the definition of the given word. +// The argument dict names the dictionary to use, +// the Name field of a Dict returned by Dicts. +// +// The special dictionary name "*" means to look in all the +// server's dictionaries. +// The special dictionary name "!" means to look in all the +// server's dictionaries in turn, stopping after finding the word +// in one of them. +func (c *Client) Define(dict, word string) ([]*Defn, error) { + id, err := c.text.Cmd("DEFINE %s %q", dict, word) + if err != nil { + return nil, err + } + + c.text.StartResponse(id) + defer c.text.EndResponse(id) + + _, line, err := c.text.ReadCodeLine(150) + if err != nil { + return nil, err + } + a, _ := fields(line) + if len(a) < 1 { + return nil, textproto.ProtocolError("malformed response: " + line) + } + n, err := strconv.Atoi(a[0]) + if err != nil { + return nil, textproto.ProtocolError("invalid definition count: " + a[0]) + } + def := make([]*Defn, n) + for i := 0; i < n; i++ { + _, line, err = c.text.ReadCodeLine(151) + if err != nil { + return nil, err + } + a, _ := fields(line) + if len(a) < 3 { + // skip it, to keep protocol in sync + i-- + n-- + def = def[0:n] + continue + } + d := &Defn{Word: a[0], Dict: Dict{a[1], a[2]}} + d.Text, err = c.text.ReadDotBytes() + if err != nil { + return nil, err + } + def[i] = d + } + _, _, err = c.text.ReadCodeLine(250) + return def, err +} + +// Fields returns the fields in s. +// Fields are space separated unquoted words +// or quoted with single or double quote. +func fields(s string) ([]string, error) { + var v []string + i := 0 + for { + for i < len(s) && (s[i] == ' ' || s[i] == '\t') { + i++ + } + if i >= len(s) { + break + } + if s[i] == '"' || s[i] == '\'' { + q := s[i] + // quoted string + var j int + for j = i + 1; ; j++ { + if j >= len(s) { + return nil, textproto.ProtocolError("malformed quoted string") + } + if s[j] == '\\' { + j++ + continue + } + if s[j] == q { + j++ + break + } + } + v = append(v, unquote(s[i+1:j-1])) + i = j + } else { + // atom + var j int + for j = i; j < len(s); j++ { + if s[j] == ' ' || s[j] == '\t' || s[j] == '\\' || s[j] == '"' || s[j] == '\'' { + break + } + } + v = append(v, s[i:j]) + i = j + } + if i < len(s) { + c := s[i] + if c != ' ' && c != '\t' { + return nil, textproto.ProtocolError("quotes not on word boundaries") + } + } + } + return v, nil +} + +func unquote(s string) string { + if strings.Index(s, "\\") < 0 { + return s + } + b := []byte(s) + w := 0 + for r := 0; r < len(b); r++ { + c := b[r] + if c == '\\' { + r++ + c = b[r] + } + b[w] = c + w++ + } + return string(b[0:w]) +} diff --git a/api/vendor/golang.org/x/net/dns/dnsmessage/example_test.go b/api/vendor/golang.org/x/net/dns/dnsmessage/example_test.go new file mode 100644 index 0000000..8600a6b --- /dev/null +++ b/api/vendor/golang.org/x/net/dns/dnsmessage/example_test.go @@ -0,0 +1,132 @@ +// 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 dnsmessage_test + +import ( + "fmt" + "net" + "strings" + + "golang.org/x/net/dns/dnsmessage" +) + +func mustNewName(name string) dnsmessage.Name { + n, err := dnsmessage.NewName(name) + if err != nil { + panic(err) + } + return n +} + +func ExampleParser() { + msg := dnsmessage.Message{ + Header: dnsmessage.Header{Response: true, Authoritative: true}, + Questions: []dnsmessage.Question{ + { + Name: mustNewName("foo.bar.example.com."), + Type: dnsmessage.TypeA, + Class: dnsmessage.ClassINET, + }, + { + Name: mustNewName("bar.example.com."), + Type: dnsmessage.TypeA, + Class: dnsmessage.ClassINET, + }, + }, + Answers: []dnsmessage.Resource{ + { + Header: dnsmessage.ResourceHeader{ + Name: mustNewName("foo.bar.example.com."), + Type: dnsmessage.TypeA, + Class: dnsmessage.ClassINET, + }, + Body: &dnsmessage.AResource{A: [4]byte{127, 0, 0, 1}}, + }, + { + Header: dnsmessage.ResourceHeader{ + Name: mustNewName("bar.example.com."), + Type: dnsmessage.TypeA, + Class: dnsmessage.ClassINET, + }, + Body: &dnsmessage.AResource{A: [4]byte{127, 0, 0, 2}}, + }, + }, + } + + buf, err := msg.Pack() + if err != nil { + panic(err) + } + + wantName := "bar.example.com." + + var p dnsmessage.Parser + if _, err := p.Start(buf); err != nil { + panic(err) + } + + for { + q, err := p.Question() + if err == dnsmessage.ErrSectionDone { + break + } + if err != nil { + panic(err) + } + + if q.Name.String() != wantName { + continue + } + + fmt.Println("Found question for name", wantName) + if err := p.SkipAllQuestions(); err != nil { + panic(err) + } + break + } + + var gotIPs []net.IP + for { + h, err := p.AnswerHeader() + if err == dnsmessage.ErrSectionDone { + break + } + if err != nil { + panic(err) + } + + if (h.Type != dnsmessage.TypeA && h.Type != dnsmessage.TypeAAAA) || h.Class != dnsmessage.ClassINET { + continue + } + + if !strings.EqualFold(h.Name.String(), wantName) { + if err := p.SkipAnswer(); err != nil { + panic(err) + } + continue + } + + switch h.Type { + case dnsmessage.TypeA: + r, err := p.AResource() + if err != nil { + panic(err) + } + gotIPs = append(gotIPs, r.A[:]) + case dnsmessage.TypeAAAA: + r, err := p.AAAAResource() + if err != nil { + panic(err) + } + gotIPs = append(gotIPs, r.AAAA[:]) + } + } + + fmt.Printf("Found A/AAAA records for name %s: %v\n", wantName, gotIPs) + + // Output: + // Found question for name bar.example.com. + // Found A/AAAA records for name bar.example.com.: [127.0.0.2] +} diff --git a/api/vendor/golang.org/x/net/dns/dnsmessage/message.go b/api/vendor/golang.org/x/net/dns/dnsmessage/message.go new file mode 100644 index 0000000..38f8177 --- /dev/null +++ b/api/vendor/golang.org/x/net/dns/dnsmessage/message.go @@ -0,0 +1,2247 @@ +// 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 dnsmessage provides a mostly RFC 1035 compliant implementation of +// DNS message packing and unpacking. +// +// The package also supports messages with Extension Mechanisms for DNS +// (EDNS(0)) as defined in RFC 6891. +// +// This implementation is designed to minimize heap allocations and avoid +// unnecessary packing and unpacking as much as possible. +package dnsmessage + +import ( + "errors" +) + +// Message formats + +// A Type is a type of DNS request and response. +type Type uint16 + +// A Class is a type of network. +type Class uint16 + +// An OpCode is a DNS operation code. +type OpCode uint16 + +// An RCode is a DNS response status code. +type RCode uint16 + +// Wire constants. +const ( + // ResourceHeader.Type and Question.Type + TypeA Type = 1 + TypeNS Type = 2 + TypeCNAME Type = 5 + TypeSOA Type = 6 + TypePTR Type = 12 + TypeMX Type = 15 + TypeTXT Type = 16 + TypeAAAA Type = 28 + TypeSRV Type = 33 + TypeOPT Type = 41 + + // Question.Type + TypeWKS Type = 11 + TypeHINFO Type = 13 + TypeMINFO Type = 14 + TypeAXFR Type = 252 + TypeALL Type = 255 + + // ResourceHeader.Class and Question.Class + ClassINET Class = 1 + ClassCSNET Class = 2 + ClassCHAOS Class = 3 + ClassHESIOD Class = 4 + + // Question.Class + ClassANY Class = 255 + + // Message.Rcode + RCodeSuccess RCode = 0 + RCodeFormatError RCode = 1 + RCodeServerFailure RCode = 2 + RCodeNameError RCode = 3 + RCodeNotImplemented RCode = 4 + RCodeRefused RCode = 5 +) + +var ( + // ErrNotStarted indicates that the prerequisite information isn't + // available yet because the previous records haven't been appropriately + // parsed, skipped or finished. + ErrNotStarted = errors.New("parsing/packing of this type isn't available yet") + + // ErrSectionDone indicated that all records in the section have been + // parsed or finished. + ErrSectionDone = errors.New("parsing/packing of this section has completed") + + errBaseLen = errors.New("insufficient data for base length type") + errCalcLen = errors.New("insufficient data for calculated length type") + errReserved = errors.New("segment prefix is reserved") + errTooManyPtr = errors.New("too many pointers (>10)") + errInvalidPtr = errors.New("invalid pointer") + errNilResouceBody = errors.New("nil resource body") + errResourceLen = errors.New("insufficient data for resource body length") + errSegTooLong = errors.New("segment length too long") + errZeroSegLen = errors.New("zero length segment") + errResTooLong = errors.New("resource length too long") + errTooManyQuestions = errors.New("too many Questions to pack (>65535)") + errTooManyAnswers = errors.New("too many Answers to pack (>65535)") + errTooManyAuthorities = errors.New("too many Authorities to pack (>65535)") + errTooManyAdditionals = errors.New("too many Additionals to pack (>65535)") + errNonCanonicalName = errors.New("name is not in canonical format (it must end with a .)") + errStringTooLong = errors.New("character string exceeds maximum length (255)") + errCompressedSRV = errors.New("compressed name in SRV resource data") +) + +// Internal constants. +const ( + // packStartingCap is the default initial buffer size allocated during + // packing. + // + // The starting capacity doesn't matter too much, but most DNS responses + // Will be <= 512 bytes as it is the limit for DNS over UDP. + packStartingCap = 512 + + // uint16Len is the length (in bytes) of a uint16. + uint16Len = 2 + + // uint32Len is the length (in bytes) of a uint32. + uint32Len = 4 + + // headerLen is the length (in bytes) of a DNS header. + // + // A header is comprised of 6 uint16s and no padding. + headerLen = 6 * uint16Len +) + +type nestedError struct { + // s is the current level's error message. + s string + + // err is the nested error. + err error +} + +// nestedError implements error.Error. +func (e *nestedError) Error() string { + return e.s + ": " + e.err.Error() +} + +// Header is a representation of a DNS message header. +type Header struct { + ID uint16 + Response bool + OpCode OpCode + Authoritative bool + Truncated bool + RecursionDesired bool + RecursionAvailable bool + RCode RCode +} + +func (m *Header) pack() (id uint16, bits uint16) { + id = m.ID + bits = uint16(m.OpCode)<<11 | uint16(m.RCode) + if m.RecursionAvailable { + bits |= headerBitRA + } + if m.RecursionDesired { + bits |= headerBitRD + } + if m.Truncated { + bits |= headerBitTC + } + if m.Authoritative { + bits |= headerBitAA + } + if m.Response { + bits |= headerBitQR + } + return +} + +// Message is a representation of a DNS message. +type Message struct { + Header + Questions []Question + Answers []Resource + Authorities []Resource + Additionals []Resource +} + +type section uint8 + +const ( + sectionNotStarted section = iota + sectionHeader + sectionQuestions + sectionAnswers + sectionAuthorities + sectionAdditionals + sectionDone + + headerBitQR = 1 << 15 // query/response (response=1) + headerBitAA = 1 << 10 // authoritative + headerBitTC = 1 << 9 // truncated + headerBitRD = 1 << 8 // recursion desired + headerBitRA = 1 << 7 // recursion available +) + +var sectionNames = map[section]string{ + sectionHeader: "header", + sectionQuestions: "Question", + sectionAnswers: "Answer", + sectionAuthorities: "Authority", + sectionAdditionals: "Additional", +} + +// header is the wire format for a DNS message header. +type header struct { + id uint16 + bits uint16 + questions uint16 + answers uint16 + authorities uint16 + additionals uint16 +} + +func (h *header) count(sec section) uint16 { + switch sec { + case sectionQuestions: + return h.questions + case sectionAnswers: + return h.answers + case sectionAuthorities: + return h.authorities + case sectionAdditionals: + return h.additionals + } + return 0 +} + +// pack appends the wire format of the header to msg. +func (h *header) pack(msg []byte) []byte { + msg = packUint16(msg, h.id) + msg = packUint16(msg, h.bits) + msg = packUint16(msg, h.questions) + msg = packUint16(msg, h.answers) + msg = packUint16(msg, h.authorities) + return packUint16(msg, h.additionals) +} + +func (h *header) unpack(msg []byte, off int) (int, error) { + newOff := off + var err error + if h.id, newOff, err = unpackUint16(msg, newOff); err != nil { + return off, &nestedError{"id", err} + } + if h.bits, newOff, err = unpackUint16(msg, newOff); err != nil { + return off, &nestedError{"bits", err} + } + if h.questions, newOff, err = unpackUint16(msg, newOff); err != nil { + return off, &nestedError{"questions", err} + } + if h.answers, newOff, err = unpackUint16(msg, newOff); err != nil { + return off, &nestedError{"answers", err} + } + if h.authorities, newOff, err = unpackUint16(msg, newOff); err != nil { + return off, &nestedError{"authorities", err} + } + if h.additionals, newOff, err = unpackUint16(msg, newOff); err != nil { + return off, &nestedError{"additionals", err} + } + return newOff, nil +} + +func (h *header) header() Header { + return Header{ + ID: h.id, + Response: (h.bits & headerBitQR) != 0, + OpCode: OpCode(h.bits>>11) & 0xF, + Authoritative: (h.bits & headerBitAA) != 0, + Truncated: (h.bits & headerBitTC) != 0, + RecursionDesired: (h.bits & headerBitRD) != 0, + RecursionAvailable: (h.bits & headerBitRA) != 0, + RCode: RCode(h.bits & 0xF), + } +} + +// A Resource is a DNS resource record. +type Resource struct { + Header ResourceHeader + Body ResourceBody +} + +// A ResourceBody is a DNS resource record minus the header. +type ResourceBody interface { + // pack packs a Resource except for its header. + pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) + + // realType returns the actual type of the Resource. This is used to + // fill in the header Type field. + realType() Type +} + +// pack appends the wire format of the Resource to msg. +func (r *Resource) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) { + if r.Body == nil { + return msg, errNilResouceBody + } + oldMsg := msg + r.Header.Type = r.Body.realType() + msg, length, err := r.Header.pack(msg, compression, compressionOff) + if err != nil { + return msg, &nestedError{"ResourceHeader", err} + } + preLen := len(msg) + msg, err = r.Body.pack(msg, compression, compressionOff) + if err != nil { + return msg, &nestedError{"content", err} + } + if err := r.Header.fixLen(msg, length, preLen); err != nil { + return oldMsg, err + } + return msg, nil +} + +// A Parser allows incrementally parsing a DNS message. +// +// When parsing is started, the Header is parsed. Next, each Question can be +// either parsed or skipped. Alternatively, all Questions can be skipped at +// once. When all Questions have been parsed, attempting to parse Questions +// will return (nil, nil) and attempting to skip Questions will return +// (true, nil). After all Questions have been either parsed or skipped, all +// Answers, Authorities and Additionals can be either parsed or skipped in the +// same way, and each type of Resource must be fully parsed or skipped before +// proceeding to the next type of Resource. +// +// Note that there is no requirement to fully skip or parse the message. +type Parser struct { + msg []byte + header header + + section section + off int + index int + resHeaderValid bool + resHeader ResourceHeader +} + +// Start parses the header and enables the parsing of Questions. +func (p *Parser) Start(msg []byte) (Header, error) { + if p.msg != nil { + *p = Parser{} + } + p.msg = msg + var err error + if p.off, err = p.header.unpack(msg, 0); err != nil { + return Header{}, &nestedError{"unpacking header", err} + } + p.section = sectionQuestions + return p.header.header(), nil +} + +func (p *Parser) checkAdvance(sec section) error { + if p.section < sec { + return ErrNotStarted + } + if p.section > sec { + return ErrSectionDone + } + p.resHeaderValid = false + if p.index == int(p.header.count(sec)) { + p.index = 0 + p.section++ + return ErrSectionDone + } + return nil +} + +func (p *Parser) resource(sec section) (Resource, error) { + var r Resource + var err error + r.Header, err = p.resourceHeader(sec) + if err != nil { + return r, err + } + p.resHeaderValid = false + r.Body, p.off, err = unpackResourceBody(p.msg, p.off, r.Header) + if err != nil { + return Resource{}, &nestedError{"unpacking " + sectionNames[sec], err} + } + p.index++ + return r, nil +} + +func (p *Parser) resourceHeader(sec section) (ResourceHeader, error) { + if p.resHeaderValid { + return p.resHeader, nil + } + if err := p.checkAdvance(sec); err != nil { + return ResourceHeader{}, err + } + var hdr ResourceHeader + off, err := hdr.unpack(p.msg, p.off) + if err != nil { + return ResourceHeader{}, err + } + p.resHeaderValid = true + p.resHeader = hdr + p.off = off + return hdr, nil +} + +func (p *Parser) skipResource(sec section) error { + if p.resHeaderValid { + newOff := p.off + int(p.resHeader.Length) + if newOff > len(p.msg) { + return errResourceLen + } + p.off = newOff + p.resHeaderValid = false + p.index++ + return nil + } + if err := p.checkAdvance(sec); err != nil { + return err + } + var err error + p.off, err = skipResource(p.msg, p.off) + if err != nil { + return &nestedError{"skipping: " + sectionNames[sec], err} + } + p.index++ + return nil +} + +// Question parses a single Question. +func (p *Parser) Question() (Question, error) { + if err := p.checkAdvance(sectionQuestions); err != nil { + return Question{}, err + } + var name Name + off, err := name.unpack(p.msg, p.off) + if err != nil { + return Question{}, &nestedError{"unpacking Question.Name", err} + } + typ, off, err := unpackType(p.msg, off) + if err != nil { + return Question{}, &nestedError{"unpacking Question.Type", err} + } + class, off, err := unpackClass(p.msg, off) + if err != nil { + return Question{}, &nestedError{"unpacking Question.Class", err} + } + p.off = off + p.index++ + return Question{name, typ, class}, nil +} + +// AllQuestions parses all Questions. +func (p *Parser) AllQuestions() ([]Question, error) { + // Multiple questions are valid according to the spec, + // but servers don't actually support them. There will + // be at most one question here. + // + // Do not pre-allocate based on info in p.header, since + // the data is untrusted. + qs := []Question{} + for { + q, err := p.Question() + if err == ErrSectionDone { + return qs, nil + } + if err != nil { + return nil, err + } + qs = append(qs, q) + } +} + +// SkipQuestion skips a single Question. +func (p *Parser) SkipQuestion() error { + if err := p.checkAdvance(sectionQuestions); err != nil { + return err + } + off, err := skipName(p.msg, p.off) + if err != nil { + return &nestedError{"skipping Question Name", err} + } + if off, err = skipType(p.msg, off); err != nil { + return &nestedError{"skipping Question Type", err} + } + if off, err = skipClass(p.msg, off); err != nil { + return &nestedError{"skipping Question Class", err} + } + p.off = off + p.index++ + return nil +} + +// SkipAllQuestions skips all Questions. +func (p *Parser) SkipAllQuestions() error { + for { + if err := p.SkipQuestion(); err == ErrSectionDone { + return nil + } else if err != nil { + return err + } + } +} + +// AnswerHeader parses a single Answer ResourceHeader. +func (p *Parser) AnswerHeader() (ResourceHeader, error) { + return p.resourceHeader(sectionAnswers) +} + +// Answer parses a single Answer Resource. +func (p *Parser) Answer() (Resource, error) { + return p.resource(sectionAnswers) +} + +// AllAnswers parses all Answer Resources. +func (p *Parser) AllAnswers() ([]Resource, error) { + // The most common query is for A/AAAA, which usually returns + // a handful of IPs. + // + // Pre-allocate up to a certain limit, since p.header is + // untrusted data. + n := int(p.header.answers) + if n > 20 { + n = 20 + } + as := make([]Resource, 0, n) + for { + a, err := p.Answer() + if err == ErrSectionDone { + return as, nil + } + if err != nil { + return nil, err + } + as = append(as, a) + } +} + +// SkipAnswer skips a single Answer Resource. +func (p *Parser) SkipAnswer() error { + return p.skipResource(sectionAnswers) +} + +// SkipAllAnswers skips all Answer Resources. +func (p *Parser) SkipAllAnswers() error { + for { + if err := p.SkipAnswer(); err == ErrSectionDone { + return nil + } else if err != nil { + return err + } + } +} + +// AuthorityHeader parses a single Authority ResourceHeader. +func (p *Parser) AuthorityHeader() (ResourceHeader, error) { + return p.resourceHeader(sectionAuthorities) +} + +// Authority parses a single Authority Resource. +func (p *Parser) Authority() (Resource, error) { + return p.resource(sectionAuthorities) +} + +// AllAuthorities parses all Authority Resources. +func (p *Parser) AllAuthorities() ([]Resource, error) { + // Authorities contains SOA in case of NXDOMAIN and friends, + // otherwise it is empty. + // + // Pre-allocate up to a certain limit, since p.header is + // untrusted data. + n := int(p.header.authorities) + if n > 10 { + n = 10 + } + as := make([]Resource, 0, n) + for { + a, err := p.Authority() + if err == ErrSectionDone { + return as, nil + } + if err != nil { + return nil, err + } + as = append(as, a) + } +} + +// SkipAuthority skips a single Authority Resource. +func (p *Parser) SkipAuthority() error { + return p.skipResource(sectionAuthorities) +} + +// SkipAllAuthorities skips all Authority Resources. +func (p *Parser) SkipAllAuthorities() error { + for { + if err := p.SkipAuthority(); err == ErrSectionDone { + return nil + } else if err != nil { + return err + } + } +} + +// AdditionalHeader parses a single Additional ResourceHeader. +func (p *Parser) AdditionalHeader() (ResourceHeader, error) { + return p.resourceHeader(sectionAdditionals) +} + +// Additional parses a single Additional Resource. +func (p *Parser) Additional() (Resource, error) { + return p.resource(sectionAdditionals) +} + +// AllAdditionals parses all Additional Resources. +func (p *Parser) AllAdditionals() ([]Resource, error) { + // Additionals usually contain OPT, and sometimes A/AAAA + // glue records. + // + // Pre-allocate up to a certain limit, since p.header is + // untrusted data. + n := int(p.header.additionals) + if n > 10 { + n = 10 + } + as := make([]Resource, 0, n) + for { + a, err := p.Additional() + if err == ErrSectionDone { + return as, nil + } + if err != nil { + return nil, err + } + as = append(as, a) + } +} + +// SkipAdditional skips a single Additional Resource. +func (p *Parser) SkipAdditional() error { + return p.skipResource(sectionAdditionals) +} + +// SkipAllAdditionals skips all Additional Resources. +func (p *Parser) SkipAllAdditionals() error { + for { + if err := p.SkipAdditional(); err == ErrSectionDone { + return nil + } else if err != nil { + return err + } + } +} + +// CNAMEResource parses a single CNAMEResource. +// +// One of the XXXHeader methods must have been called before calling this +// method. +func (p *Parser) CNAMEResource() (CNAMEResource, error) { + if !p.resHeaderValid || p.resHeader.Type != TypeCNAME { + return CNAMEResource{}, ErrNotStarted + } + r, err := unpackCNAMEResource(p.msg, p.off) + if err != nil { + return CNAMEResource{}, err + } + p.off += int(p.resHeader.Length) + p.resHeaderValid = false + p.index++ + return r, nil +} + +// MXResource parses a single MXResource. +// +// One of the XXXHeader methods must have been called before calling this +// method. +func (p *Parser) MXResource() (MXResource, error) { + if !p.resHeaderValid || p.resHeader.Type != TypeMX { + return MXResource{}, ErrNotStarted + } + r, err := unpackMXResource(p.msg, p.off) + if err != nil { + return MXResource{}, err + } + p.off += int(p.resHeader.Length) + p.resHeaderValid = false + p.index++ + return r, nil +} + +// NSResource parses a single NSResource. +// +// One of the XXXHeader methods must have been called before calling this +// method. +func (p *Parser) NSResource() (NSResource, error) { + if !p.resHeaderValid || p.resHeader.Type != TypeNS { + return NSResource{}, ErrNotStarted + } + r, err := unpackNSResource(p.msg, p.off) + if err != nil { + return NSResource{}, err + } + p.off += int(p.resHeader.Length) + p.resHeaderValid = false + p.index++ + return r, nil +} + +// PTRResource parses a single PTRResource. +// +// One of the XXXHeader methods must have been called before calling this +// method. +func (p *Parser) PTRResource() (PTRResource, error) { + if !p.resHeaderValid || p.resHeader.Type != TypePTR { + return PTRResource{}, ErrNotStarted + } + r, err := unpackPTRResource(p.msg, p.off) + if err != nil { + return PTRResource{}, err + } + p.off += int(p.resHeader.Length) + p.resHeaderValid = false + p.index++ + return r, nil +} + +// SOAResource parses a single SOAResource. +// +// One of the XXXHeader methods must have been called before calling this +// method. +func (p *Parser) SOAResource() (SOAResource, error) { + if !p.resHeaderValid || p.resHeader.Type != TypeSOA { + return SOAResource{}, ErrNotStarted + } + r, err := unpackSOAResource(p.msg, p.off) + if err != nil { + return SOAResource{}, err + } + p.off += int(p.resHeader.Length) + p.resHeaderValid = false + p.index++ + return r, nil +} + +// TXTResource parses a single TXTResource. +// +// One of the XXXHeader methods must have been called before calling this +// method. +func (p *Parser) TXTResource() (TXTResource, error) { + if !p.resHeaderValid || p.resHeader.Type != TypeTXT { + return TXTResource{}, ErrNotStarted + } + r, err := unpackTXTResource(p.msg, p.off, p.resHeader.Length) + if err != nil { + return TXTResource{}, err + } + p.off += int(p.resHeader.Length) + p.resHeaderValid = false + p.index++ + return r, nil +} + +// SRVResource parses a single SRVResource. +// +// One of the XXXHeader methods must have been called before calling this +// method. +func (p *Parser) SRVResource() (SRVResource, error) { + if !p.resHeaderValid || p.resHeader.Type != TypeSRV { + return SRVResource{}, ErrNotStarted + } + r, err := unpackSRVResource(p.msg, p.off) + if err != nil { + return SRVResource{}, err + } + p.off += int(p.resHeader.Length) + p.resHeaderValid = false + p.index++ + return r, nil +} + +// AResource parses a single AResource. +// +// One of the XXXHeader methods must have been called before calling this +// method. +func (p *Parser) AResource() (AResource, error) { + if !p.resHeaderValid || p.resHeader.Type != TypeA { + return AResource{}, ErrNotStarted + } + r, err := unpackAResource(p.msg, p.off) + if err != nil { + return AResource{}, err + } + p.off += int(p.resHeader.Length) + p.resHeaderValid = false + p.index++ + return r, nil +} + +// AAAAResource parses a single AAAAResource. +// +// One of the XXXHeader methods must have been called before calling this +// method. +func (p *Parser) AAAAResource() (AAAAResource, error) { + if !p.resHeaderValid || p.resHeader.Type != TypeAAAA { + return AAAAResource{}, ErrNotStarted + } + r, err := unpackAAAAResource(p.msg, p.off) + if err != nil { + return AAAAResource{}, err + } + p.off += int(p.resHeader.Length) + p.resHeaderValid = false + p.index++ + return r, nil +} + +// OPTResource parses a single OPTResource. +// +// One of the XXXHeader methods must have been called before calling this +// method. +func (p *Parser) OPTResource() (OPTResource, error) { + if !p.resHeaderValid || p.resHeader.Type != TypeOPT { + return OPTResource{}, ErrNotStarted + } + r, err := unpackOPTResource(p.msg, p.off, p.resHeader.Length) + if err != nil { + return OPTResource{}, err + } + p.off += int(p.resHeader.Length) + p.resHeaderValid = false + p.index++ + return r, nil +} + +// Unpack parses a full Message. +func (m *Message) Unpack(msg []byte) error { + var p Parser + var err error + if m.Header, err = p.Start(msg); err != nil { + return err + } + if m.Questions, err = p.AllQuestions(); err != nil { + return err + } + if m.Answers, err = p.AllAnswers(); err != nil { + return err + } + if m.Authorities, err = p.AllAuthorities(); err != nil { + return err + } + if m.Additionals, err = p.AllAdditionals(); err != nil { + return err + } + return nil +} + +// Pack packs a full Message. +func (m *Message) Pack() ([]byte, error) { + return m.AppendPack(make([]byte, 0, packStartingCap)) +} + +// AppendPack is like Pack but appends the full Message to b and returns the +// extended buffer. +func (m *Message) AppendPack(b []byte) ([]byte, error) { + // Validate the lengths. It is very unlikely that anyone will try to + // pack more than 65535 of any particular type, but it is possible and + // we should fail gracefully. + if len(m.Questions) > int(^uint16(0)) { + return nil, errTooManyQuestions + } + if len(m.Answers) > int(^uint16(0)) { + return nil, errTooManyAnswers + } + if len(m.Authorities) > int(^uint16(0)) { + return nil, errTooManyAuthorities + } + if len(m.Additionals) > int(^uint16(0)) { + return nil, errTooManyAdditionals + } + + var h header + h.id, h.bits = m.Header.pack() + + h.questions = uint16(len(m.Questions)) + h.answers = uint16(len(m.Answers)) + h.authorities = uint16(len(m.Authorities)) + h.additionals = uint16(len(m.Additionals)) + + compressionOff := len(b) + msg := h.pack(b) + + // RFC 1035 allows (but does not require) compression for packing. RFC + // 1035 requires unpacking implementations to support compression, so + // unconditionally enabling it is fine. + // + // DNS lookups are typically done over UDP, and RFC 1035 states that UDP + // DNS messages can be a maximum of 512 bytes long. Without compression, + // many DNS response messages are over this limit, so enabling + // compression will help ensure compliance. + compression := map[string]int{} + + for i := range m.Questions { + var err error + if msg, err = m.Questions[i].pack(msg, compression, compressionOff); err != nil { + return nil, &nestedError{"packing Question", err} + } + } + for i := range m.Answers { + var err error + if msg, err = m.Answers[i].pack(msg, compression, compressionOff); err != nil { + return nil, &nestedError{"packing Answer", err} + } + } + for i := range m.Authorities { + var err error + if msg, err = m.Authorities[i].pack(msg, compression, compressionOff); err != nil { + return nil, &nestedError{"packing Authority", err} + } + } + for i := range m.Additionals { + var err error + if msg, err = m.Additionals[i].pack(msg, compression, compressionOff); err != nil { + return nil, &nestedError{"packing Additional", err} + } + } + + return msg, nil +} + +// A Builder allows incrementally packing a DNS message. +// +// Example usage: +// buf := make([]byte, 2, 514) +// b := NewBuilder(buf, Header{...}) +// b.EnableCompression() +// // Optionally start a section and add things to that section. +// // Repeat adding sections as necessary. +// buf, err := b.Finish() +// // If err is nil, buf[2:] will contain the built bytes. +type Builder struct { + // msg is the storage for the message being built. + msg []byte + + // section keeps track of the current section being built. + section section + + // header keeps track of what should go in the header when Finish is + // called. + header header + + // start is the starting index of the bytes allocated in msg for header. + start int + + // compression is a mapping from name suffixes to their starting index + // in msg. + compression map[string]int +} + +// NewBuilder creates a new builder with compression disabled. +// +// Note: Most users will want to immediately enable compression with the +// EnableCompression method. See that method's comment for why you may or may +// not want to enable compression. +// +// The DNS message is appended to the provided initial buffer buf (which may be +// nil) as it is built. The final message is returned by the (*Builder).Finish +// method, which may return the same underlying array if there was sufficient +// capacity in the slice. +func NewBuilder(buf []byte, h Header) Builder { + if buf == nil { + buf = make([]byte, 0, packStartingCap) + } + b := Builder{msg: buf, start: len(buf)} + b.header.id, b.header.bits = h.pack() + var hb [headerLen]byte + b.msg = append(b.msg, hb[:]...) + b.section = sectionHeader + return b +} + +// EnableCompression enables compression in the Builder. +// +// Leaving compression disabled avoids compression related allocations, but can +// result in larger message sizes. Be careful with this mode as it can cause +// messages to exceed the UDP size limit. +// +// According to RFC 1035, section 4.1.4, the use of compression is optional, but +// all implementations must accept both compressed and uncompressed DNS +// messages. +// +// Compression should be enabled before any sections are added for best results. +func (b *Builder) EnableCompression() { + b.compression = map[string]int{} +} + +func (b *Builder) startCheck(s section) error { + if b.section <= sectionNotStarted { + return ErrNotStarted + } + if b.section > s { + return ErrSectionDone + } + return nil +} + +// StartQuestions prepares the builder for packing Questions. +func (b *Builder) StartQuestions() error { + if err := b.startCheck(sectionQuestions); err != nil { + return err + } + b.section = sectionQuestions + return nil +} + +// StartAnswers prepares the builder for packing Answers. +func (b *Builder) StartAnswers() error { + if err := b.startCheck(sectionAnswers); err != nil { + return err + } + b.section = sectionAnswers + return nil +} + +// StartAuthorities prepares the builder for packing Authorities. +func (b *Builder) StartAuthorities() error { + if err := b.startCheck(sectionAuthorities); err != nil { + return err + } + b.section = sectionAuthorities + return nil +} + +// StartAdditionals prepares the builder for packing Additionals. +func (b *Builder) StartAdditionals() error { + if err := b.startCheck(sectionAdditionals); err != nil { + return err + } + b.section = sectionAdditionals + return nil +} + +func (b *Builder) incrementSectionCount() error { + var count *uint16 + var err error + switch b.section { + case sectionQuestions: + count = &b.header.questions + err = errTooManyQuestions + case sectionAnswers: + count = &b.header.answers + err = errTooManyAnswers + case sectionAuthorities: + count = &b.header.authorities + err = errTooManyAuthorities + case sectionAdditionals: + count = &b.header.additionals + err = errTooManyAdditionals + } + if *count == ^uint16(0) { + return err + } + *count++ + return nil +} + +// Question adds a single Question. +func (b *Builder) Question(q Question) error { + if b.section < sectionQuestions { + return ErrNotStarted + } + if b.section > sectionQuestions { + return ErrSectionDone + } + msg, err := q.pack(b.msg, b.compression, b.start) + if err != nil { + return err + } + if err := b.incrementSectionCount(); err != nil { + return err + } + b.msg = msg + return nil +} + +func (b *Builder) checkResourceSection() error { + if b.section < sectionAnswers { + return ErrNotStarted + } + if b.section > sectionAdditionals { + return ErrSectionDone + } + return nil +} + +// CNAMEResource adds a single CNAMEResource. +func (b *Builder) CNAMEResource(h ResourceHeader, r CNAMEResource) error { + if err := b.checkResourceSection(); err != nil { + return err + } + h.Type = r.realType() + msg, length, err := h.pack(b.msg, b.compression, b.start) + if err != nil { + return &nestedError{"ResourceHeader", err} + } + preLen := len(msg) + if msg, err = r.pack(msg, b.compression, b.start); err != nil { + return &nestedError{"CNAMEResource body", err} + } + if err := h.fixLen(msg, length, preLen); err != nil { + return err + } + if err := b.incrementSectionCount(); err != nil { + return err + } + b.msg = msg + return nil +} + +// MXResource adds a single MXResource. +func (b *Builder) MXResource(h ResourceHeader, r MXResource) error { + if err := b.checkResourceSection(); err != nil { + return err + } + h.Type = r.realType() + msg, length, err := h.pack(b.msg, b.compression, b.start) + if err != nil { + return &nestedError{"ResourceHeader", err} + } + preLen := len(msg) + if msg, err = r.pack(msg, b.compression, b.start); err != nil { + return &nestedError{"MXResource body", err} + } + if err := h.fixLen(msg, length, preLen); err != nil { + return err + } + if err := b.incrementSectionCount(); err != nil { + return err + } + b.msg = msg + return nil +} + +// NSResource adds a single NSResource. +func (b *Builder) NSResource(h ResourceHeader, r NSResource) error { + if err := b.checkResourceSection(); err != nil { + return err + } + h.Type = r.realType() + msg, length, err := h.pack(b.msg, b.compression, b.start) + if err != nil { + return &nestedError{"ResourceHeader", err} + } + preLen := len(msg) + if msg, err = r.pack(msg, b.compression, b.start); err != nil { + return &nestedError{"NSResource body", err} + } + if err := h.fixLen(msg, length, preLen); err != nil { + return err + } + if err := b.incrementSectionCount(); err != nil { + return err + } + b.msg = msg + return nil +} + +// PTRResource adds a single PTRResource. +func (b *Builder) PTRResource(h ResourceHeader, r PTRResource) error { + if err := b.checkResourceSection(); err != nil { + return err + } + h.Type = r.realType() + msg, length, err := h.pack(b.msg, b.compression, b.start) + if err != nil { + return &nestedError{"ResourceHeader", err} + } + preLen := len(msg) + if msg, err = r.pack(msg, b.compression, b.start); err != nil { + return &nestedError{"PTRResource body", err} + } + if err := h.fixLen(msg, length, preLen); err != nil { + return err + } + if err := b.incrementSectionCount(); err != nil { + return err + } + b.msg = msg + return nil +} + +// SOAResource adds a single SOAResource. +func (b *Builder) SOAResource(h ResourceHeader, r SOAResource) error { + if err := b.checkResourceSection(); err != nil { + return err + } + h.Type = r.realType() + msg, length, err := h.pack(b.msg, b.compression, b.start) + if err != nil { + return &nestedError{"ResourceHeader", err} + } + preLen := len(msg) + if msg, err = r.pack(msg, b.compression, b.start); err != nil { + return &nestedError{"SOAResource body", err} + } + if err := h.fixLen(msg, length, preLen); err != nil { + return err + } + if err := b.incrementSectionCount(); err != nil { + return err + } + b.msg = msg + return nil +} + +// TXTResource adds a single TXTResource. +func (b *Builder) TXTResource(h ResourceHeader, r TXTResource) error { + if err := b.checkResourceSection(); err != nil { + return err + } + h.Type = r.realType() + msg, length, err := h.pack(b.msg, b.compression, b.start) + if err != nil { + return &nestedError{"ResourceHeader", err} + } + preLen := len(msg) + if msg, err = r.pack(msg, b.compression, b.start); err != nil { + return &nestedError{"TXTResource body", err} + } + if err := h.fixLen(msg, length, preLen); err != nil { + return err + } + if err := b.incrementSectionCount(); err != nil { + return err + } + b.msg = msg + return nil +} + +// SRVResource adds a single SRVResource. +func (b *Builder) SRVResource(h ResourceHeader, r SRVResource) error { + if err := b.checkResourceSection(); err != nil { + return err + } + h.Type = r.realType() + msg, length, err := h.pack(b.msg, b.compression, b.start) + if err != nil { + return &nestedError{"ResourceHeader", err} + } + preLen := len(msg) + if msg, err = r.pack(msg, b.compression, b.start); err != nil { + return &nestedError{"SRVResource body", err} + } + if err := h.fixLen(msg, length, preLen); err != nil { + return err + } + if err := b.incrementSectionCount(); err != nil { + return err + } + b.msg = msg + return nil +} + +// AResource adds a single AResource. +func (b *Builder) AResource(h ResourceHeader, r AResource) error { + if err := b.checkResourceSection(); err != nil { + return err + } + h.Type = r.realType() + msg, length, err := h.pack(b.msg, b.compression, b.start) + if err != nil { + return &nestedError{"ResourceHeader", err} + } + preLen := len(msg) + if msg, err = r.pack(msg, b.compression, b.start); err != nil { + return &nestedError{"AResource body", err} + } + if err := h.fixLen(msg, length, preLen); err != nil { + return err + } + if err := b.incrementSectionCount(); err != nil { + return err + } + b.msg = msg + return nil +} + +// AAAAResource adds a single AAAAResource. +func (b *Builder) AAAAResource(h ResourceHeader, r AAAAResource) error { + if err := b.checkResourceSection(); err != nil { + return err + } + h.Type = r.realType() + msg, length, err := h.pack(b.msg, b.compression, b.start) + if err != nil { + return &nestedError{"ResourceHeader", err} + } + preLen := len(msg) + if msg, err = r.pack(msg, b.compression, b.start); err != nil { + return &nestedError{"AAAAResource body", err} + } + if err := h.fixLen(msg, length, preLen); err != nil { + return err + } + if err := b.incrementSectionCount(); err != nil { + return err + } + b.msg = msg + return nil +} + +// OPTResource adds a single OPTResource. +func (b *Builder) OPTResource(h ResourceHeader, r OPTResource) error { + if err := b.checkResourceSection(); err != nil { + return err + } + h.Type = r.realType() + msg, length, err := h.pack(b.msg, b.compression, b.start) + if err != nil { + return &nestedError{"ResourceHeader", err} + } + preLen := len(msg) + if msg, err = r.pack(msg, b.compression, b.start); err != nil { + return &nestedError{"OPTResource body", err} + } + if err := h.fixLen(msg, length, preLen); err != nil { + return err + } + if err := b.incrementSectionCount(); err != nil { + return err + } + b.msg = msg + return nil +} + +// Finish ends message building and generates a binary message. +func (b *Builder) Finish() ([]byte, error) { + if b.section < sectionHeader { + return nil, ErrNotStarted + } + b.section = sectionDone + // Space for the header was allocated in NewBuilder. + b.header.pack(b.msg[b.start:b.start]) + return b.msg, nil +} + +// A ResourceHeader is the header of a DNS resource record. There are +// many types of DNS resource records, but they all share the same header. +type ResourceHeader struct { + // Name is the domain name for which this resource record pertains. + Name Name + + // Type is the type of DNS resource record. + // + // This field will be set automatically during packing. + Type Type + + // Class is the class of network to which this DNS resource record + // pertains. + Class Class + + // TTL is the length of time (measured in seconds) which this resource + // record is valid for (time to live). All Resources in a set should + // have the same TTL (RFC 2181 Section 5.2). + TTL uint32 + + // Length is the length of data in the resource record after the header. + // + // This field will be set automatically during packing. + Length uint16 +} + +// pack appends the wire format of the ResourceHeader to oldMsg. +// +// The bytes where length was packed are returned as a slice so they can be +// updated after the rest of the Resource has been packed. +func (h *ResourceHeader) pack(oldMsg []byte, compression map[string]int, compressionOff int) (msg []byte, length []byte, err error) { + msg = oldMsg + if msg, err = h.Name.pack(msg, compression, compressionOff); err != nil { + return oldMsg, nil, &nestedError{"Name", err} + } + msg = packType(msg, h.Type) + msg = packClass(msg, h.Class) + msg = packUint32(msg, h.TTL) + lenBegin := len(msg) + msg = packUint16(msg, h.Length) + return msg, msg[lenBegin : lenBegin+uint16Len], nil +} + +func (h *ResourceHeader) unpack(msg []byte, off int) (int, error) { + newOff := off + var err error + if newOff, err = h.Name.unpack(msg, newOff); err != nil { + return off, &nestedError{"Name", err} + } + if h.Type, newOff, err = unpackType(msg, newOff); err != nil { + return off, &nestedError{"Type", err} + } + if h.Class, newOff, err = unpackClass(msg, newOff); err != nil { + return off, &nestedError{"Class", err} + } + if h.TTL, newOff, err = unpackUint32(msg, newOff); err != nil { + return off, &nestedError{"TTL", err} + } + if h.Length, newOff, err = unpackUint16(msg, newOff); err != nil { + return off, &nestedError{"Length", err} + } + return newOff, nil +} + +func (h *ResourceHeader) fixLen(msg []byte, length []byte, preLen int) error { + conLen := len(msg) - preLen + if conLen > int(^uint16(0)) { + return errResTooLong + } + + // Fill in the length now that we know how long the content is. + packUint16(length[:0], uint16(conLen)) + h.Length = uint16(conLen) + + return nil +} + +// EDNS(0) wire costants. +const ( + edns0Version = 0 + + edns0DNSSECOK = 0x00008000 + ednsVersionMask = 0x00ff0000 + edns0DNSSECOKMask = 0x00ff8000 +) + +// SetEDNS0 configures h for EDNS(0). +// +// The provided extRCode must be an extedned RCode. +func (h *ResourceHeader) SetEDNS0(udpPayloadLen int, extRCode RCode, dnssecOK bool) error { + h.Name = Name{Data: [nameLen]byte{'.'}, Length: 1} // RFC 6891 section 6.1.2 + h.Type = TypeOPT + h.Class = Class(udpPayloadLen) + h.TTL = uint32(extRCode) >> 4 << 24 + if dnssecOK { + h.TTL |= edns0DNSSECOK + } + return nil +} + +// DNSSECAllowed reports whether the DNSSEC OK bit is set. +func (h *ResourceHeader) DNSSECAllowed() bool { + return h.TTL&edns0DNSSECOKMask == edns0DNSSECOK // RFC 6891 section 6.1.3 +} + +// ExtendedRCode returns an extended RCode. +// +// The provided rcode must be the RCode in DNS message header. +func (h *ResourceHeader) ExtendedRCode(rcode RCode) RCode { + if h.TTL&ednsVersionMask == edns0Version { // RFC 6891 section 6.1.3 + return RCode(h.TTL>>24<<4) | rcode + } + return rcode +} + +func skipResource(msg []byte, off int) (int, error) { + newOff, err := skipName(msg, off) + if err != nil { + return off, &nestedError{"Name", err} + } + if newOff, err = skipType(msg, newOff); err != nil { + return off, &nestedError{"Type", err} + } + if newOff, err = skipClass(msg, newOff); err != nil { + return off, &nestedError{"Class", err} + } + if newOff, err = skipUint32(msg, newOff); err != nil { + return off, &nestedError{"TTL", err} + } + length, newOff, err := unpackUint16(msg, newOff) + if err != nil { + return off, &nestedError{"Length", err} + } + if newOff += int(length); newOff > len(msg) { + return off, errResourceLen + } + return newOff, nil +} + +// packUint16 appends the wire format of field to msg. +func packUint16(msg []byte, field uint16) []byte { + return append(msg, byte(field>>8), byte(field)) +} + +func unpackUint16(msg []byte, off int) (uint16, int, error) { + if off+uint16Len > len(msg) { + return 0, off, errBaseLen + } + return uint16(msg[off])<<8 | uint16(msg[off+1]), off + uint16Len, nil +} + +func skipUint16(msg []byte, off int) (int, error) { + if off+uint16Len > len(msg) { + return off, errBaseLen + } + return off + uint16Len, nil +} + +// packType appends the wire format of field to msg. +func packType(msg []byte, field Type) []byte { + return packUint16(msg, uint16(field)) +} + +func unpackType(msg []byte, off int) (Type, int, error) { + t, o, err := unpackUint16(msg, off) + return Type(t), o, err +} + +func skipType(msg []byte, off int) (int, error) { + return skipUint16(msg, off) +} + +// packClass appends the wire format of field to msg. +func packClass(msg []byte, field Class) []byte { + return packUint16(msg, uint16(field)) +} + +func unpackClass(msg []byte, off int) (Class, int, error) { + c, o, err := unpackUint16(msg, off) + return Class(c), o, err +} + +func skipClass(msg []byte, off int) (int, error) { + return skipUint16(msg, off) +} + +// packUint32 appends the wire format of field to msg. +func packUint32(msg []byte, field uint32) []byte { + return append( + msg, + byte(field>>24), + byte(field>>16), + byte(field>>8), + byte(field), + ) +} + +func unpackUint32(msg []byte, off int) (uint32, int, error) { + if off+uint32Len > len(msg) { + return 0, off, errBaseLen + } + v := uint32(msg[off])<<24 | uint32(msg[off+1])<<16 | uint32(msg[off+2])<<8 | uint32(msg[off+3]) + return v, off + uint32Len, nil +} + +func skipUint32(msg []byte, off int) (int, error) { + if off+uint32Len > len(msg) { + return off, errBaseLen + } + return off + uint32Len, nil +} + +// packText appends the wire format of field to msg. +func packText(msg []byte, field string) ([]byte, error) { + l := len(field) + if l > 255 { + return nil, errStringTooLong + } + msg = append(msg, byte(l)) + msg = append(msg, field...) + + return msg, nil +} + +func unpackText(msg []byte, off int) (string, int, error) { + if off >= len(msg) { + return "", off, errBaseLen + } + beginOff := off + 1 + endOff := beginOff + int(msg[off]) + if endOff > len(msg) { + return "", off, errCalcLen + } + return string(msg[beginOff:endOff]), endOff, nil +} + +func skipText(msg []byte, off int) (int, error) { + if off >= len(msg) { + return off, errBaseLen + } + endOff := off + 1 + int(msg[off]) + if endOff > len(msg) { + return off, errCalcLen + } + return endOff, nil +} + +// packBytes appends the wire format of field to msg. +func packBytes(msg []byte, field []byte) []byte { + return append(msg, field...) +} + +func unpackBytes(msg []byte, off int, field []byte) (int, error) { + newOff := off + len(field) + if newOff > len(msg) { + return off, errBaseLen + } + copy(field, msg[off:newOff]) + return newOff, nil +} + +func skipBytes(msg []byte, off int, field []byte) (int, error) { + newOff := off + len(field) + if newOff > len(msg) { + return off, errBaseLen + } + return newOff, nil +} + +const nameLen = 255 + +// A Name is a non-encoded domain name. It is used instead of strings to avoid +// allocations. +type Name struct { + Data [nameLen]byte + Length uint8 +} + +// NewName creates a new Name from a string. +func NewName(name string) (Name, error) { + if len([]byte(name)) > nameLen { + return Name{}, errCalcLen + } + n := Name{Length: uint8(len(name))} + copy(n.Data[:], []byte(name)) + return n, nil +} + +func (n Name) String() string { + return string(n.Data[:n.Length]) +} + +// pack appends the wire format of the Name to msg. +// +// Domain names are a sequence of counted strings split at the dots. They end +// with a zero-length string. Compression can be used to reuse domain suffixes. +// +// The compression map will be updated with new domain suffixes. If compression +// is nil, compression will not be used. +func (n *Name) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) { + oldMsg := msg + + // Add a trailing dot to canonicalize name. + if n.Length == 0 || n.Data[n.Length-1] != '.' { + return oldMsg, errNonCanonicalName + } + + // Allow root domain. + if n.Data[0] == '.' && n.Length == 1 { + return append(msg, 0), nil + } + + // Emit sequence of counted strings, chopping at dots. + for i, begin := 0, 0; i < int(n.Length); i++ { + // Check for the end of the segment. + if n.Data[i] == '.' { + // The two most significant bits have special meaning. + // It isn't allowed for segments to be long enough to + // need them. + if i-begin >= 1<<6 { + return oldMsg, errSegTooLong + } + + // Segments must have a non-zero length. + if i-begin == 0 { + return oldMsg, errZeroSegLen + } + + msg = append(msg, byte(i-begin)) + + for j := begin; j < i; j++ { + msg = append(msg, n.Data[j]) + } + + begin = i + 1 + continue + } + + // We can only compress domain suffixes starting with a new + // segment. A pointer is two bytes with the two most significant + // bits set to 1 to indicate that it is a pointer. + if (i == 0 || n.Data[i-1] == '.') && compression != nil { + if ptr, ok := compression[string(n.Data[i:])]; ok { + // Hit. Emit a pointer instead of the rest of + // the domain. + return append(msg, byte(ptr>>8|0xC0), byte(ptr)), nil + } + + // Miss. Add the suffix to the compression table if the + // offset can be stored in the available 14 bytes. + if len(msg) <= int(^uint16(0)>>2) { + compression[string(n.Data[i:])] = len(msg) - compressionOff + } + } + } + return append(msg, 0), nil +} + +// unpack unpacks a domain name. +func (n *Name) unpack(msg []byte, off int) (int, error) { + return n.unpackCompressed(msg, off, true /* allowCompression */) +} + +func (n *Name) unpackCompressed(msg []byte, off int, allowCompression bool) (int, error) { + // currOff is the current working offset. + currOff := off + + // newOff is the offset where the next record will start. Pointers lead + // to data that belongs to other names and thus doesn't count towards to + // the usage of this name. + newOff := off + + // ptr is the number of pointers followed. + var ptr int + + // Name is a slice representation of the name data. + name := n.Data[:0] + +Loop: + for { + if currOff >= len(msg) { + return off, errBaseLen + } + c := int(msg[currOff]) + currOff++ + switch c & 0xC0 { + case 0x00: // String segment + if c == 0x00 { + // A zero length signals the end of the name. + break Loop + } + endOff := currOff + c + if endOff > len(msg) { + return off, errCalcLen + } + name = append(name, msg[currOff:endOff]...) + name = append(name, '.') + currOff = endOff + case 0xC0: // Pointer + if !allowCompression { + return off, errCompressedSRV + } + if currOff >= len(msg) { + return off, errInvalidPtr + } + c1 := msg[currOff] + currOff++ + if ptr == 0 { + newOff = currOff + } + // Don't follow too many pointers, maybe there's a loop. + if ptr++; ptr > 10 { + return off, errTooManyPtr + } + currOff = (c^0xC0)<<8 | int(c1) + default: + // Prefixes 0x80 and 0x40 are reserved. + return off, errReserved + } + } + if len(name) == 0 { + name = append(name, '.') + } + if len(name) > len(n.Data) { + return off, errCalcLen + } + n.Length = uint8(len(name)) + if ptr == 0 { + newOff = currOff + } + return newOff, nil +} + +func skipName(msg []byte, off int) (int, error) { + // newOff is the offset where the next record will start. Pointers lead + // to data that belongs to other names and thus doesn't count towards to + // the usage of this name. + newOff := off + +Loop: + for { + if newOff >= len(msg) { + return off, errBaseLen + } + c := int(msg[newOff]) + newOff++ + switch c & 0xC0 { + case 0x00: + if c == 0x00 { + // A zero length signals the end of the name. + break Loop + } + // literal string + newOff += c + if newOff > len(msg) { + return off, errCalcLen + } + case 0xC0: + // Pointer to somewhere else in msg. + + // Pointers are two bytes. + newOff++ + + // Don't follow the pointer as the data here has ended. + break Loop + default: + // Prefixes 0x80 and 0x40 are reserved. + return off, errReserved + } + } + + return newOff, nil +} + +// A Question is a DNS query. +type Question struct { + Name Name + Type Type + Class Class +} + +// pack appends the wire format of the Question to msg. +func (q *Question) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) { + msg, err := q.Name.pack(msg, compression, compressionOff) + if err != nil { + return msg, &nestedError{"Name", err} + } + msg = packType(msg, q.Type) + return packClass(msg, q.Class), nil +} + +func unpackResourceBody(msg []byte, off int, hdr ResourceHeader) (ResourceBody, int, error) { + var ( + r ResourceBody + err error + name string + ) + switch hdr.Type { + case TypeA: + var rb AResource + rb, err = unpackAResource(msg, off) + r = &rb + name = "A" + case TypeNS: + var rb NSResource + rb, err = unpackNSResource(msg, off) + r = &rb + name = "NS" + case TypeCNAME: + var rb CNAMEResource + rb, err = unpackCNAMEResource(msg, off) + r = &rb + name = "CNAME" + case TypeSOA: + var rb SOAResource + rb, err = unpackSOAResource(msg, off) + r = &rb + name = "SOA" + case TypePTR: + var rb PTRResource + rb, err = unpackPTRResource(msg, off) + r = &rb + name = "PTR" + case TypeMX: + var rb MXResource + rb, err = unpackMXResource(msg, off) + r = &rb + name = "MX" + case TypeTXT: + var rb TXTResource + rb, err = unpackTXTResource(msg, off, hdr.Length) + r = &rb + name = "TXT" + case TypeAAAA: + var rb AAAAResource + rb, err = unpackAAAAResource(msg, off) + r = &rb + name = "AAAA" + case TypeSRV: + var rb SRVResource + rb, err = unpackSRVResource(msg, off) + r = &rb + name = "SRV" + case TypeOPT: + var rb OPTResource + rb, err = unpackOPTResource(msg, off, hdr.Length) + r = &rb + name = "OPT" + } + if err != nil { + return nil, off, &nestedError{name + " record", err} + } + if r == nil { + return nil, off, errors.New("invalid resource type: " + string(hdr.Type+'0')) + } + return r, off + int(hdr.Length), nil +} + +// A CNAMEResource is a CNAME Resource record. +type CNAMEResource struct { + CNAME Name +} + +func (r *CNAMEResource) realType() Type { + return TypeCNAME +} + +// pack appends the wire format of the CNAMEResource to msg. +func (r *CNAMEResource) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) { + return r.CNAME.pack(msg, compression, compressionOff) +} + +func unpackCNAMEResource(msg []byte, off int) (CNAMEResource, error) { + var cname Name + if _, err := cname.unpack(msg, off); err != nil { + return CNAMEResource{}, err + } + return CNAMEResource{cname}, nil +} + +// An MXResource is an MX Resource record. +type MXResource struct { + Pref uint16 + MX Name +} + +func (r *MXResource) realType() Type { + return TypeMX +} + +// pack appends the wire format of the MXResource to msg. +func (r *MXResource) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) { + oldMsg := msg + msg = packUint16(msg, r.Pref) + msg, err := r.MX.pack(msg, compression, compressionOff) + if err != nil { + return oldMsg, &nestedError{"MXResource.MX", err} + } + return msg, nil +} + +func unpackMXResource(msg []byte, off int) (MXResource, error) { + pref, off, err := unpackUint16(msg, off) + if err != nil { + return MXResource{}, &nestedError{"Pref", err} + } + var mx Name + if _, err := mx.unpack(msg, off); err != nil { + return MXResource{}, &nestedError{"MX", err} + } + return MXResource{pref, mx}, nil +} + +// An NSResource is an NS Resource record. +type NSResource struct { + NS Name +} + +func (r *NSResource) realType() Type { + return TypeNS +} + +// pack appends the wire format of the NSResource to msg. +func (r *NSResource) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) { + return r.NS.pack(msg, compression, compressionOff) +} + +func unpackNSResource(msg []byte, off int) (NSResource, error) { + var ns Name + if _, err := ns.unpack(msg, off); err != nil { + return NSResource{}, err + } + return NSResource{ns}, nil +} + +// A PTRResource is a PTR Resource record. +type PTRResource struct { + PTR Name +} + +func (r *PTRResource) realType() Type { + return TypePTR +} + +// pack appends the wire format of the PTRResource to msg. +func (r *PTRResource) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) { + return r.PTR.pack(msg, compression, compressionOff) +} + +func unpackPTRResource(msg []byte, off int) (PTRResource, error) { + var ptr Name + if _, err := ptr.unpack(msg, off); err != nil { + return PTRResource{}, err + } + return PTRResource{ptr}, nil +} + +// An SOAResource is an SOA Resource record. +type SOAResource struct { + NS Name + MBox Name + Serial uint32 + Refresh uint32 + Retry uint32 + Expire uint32 + + // MinTTL the is the default TTL of Resources records which did not + // contain a TTL value and the TTL of negative responses. (RFC 2308 + // Section 4) + MinTTL uint32 +} + +func (r *SOAResource) realType() Type { + return TypeSOA +} + +// pack appends the wire format of the SOAResource to msg. +func (r *SOAResource) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) { + oldMsg := msg + msg, err := r.NS.pack(msg, compression, compressionOff) + if err != nil { + return oldMsg, &nestedError{"SOAResource.NS", err} + } + msg, err = r.MBox.pack(msg, compression, compressionOff) + if err != nil { + return oldMsg, &nestedError{"SOAResource.MBox", err} + } + msg = packUint32(msg, r.Serial) + msg = packUint32(msg, r.Refresh) + msg = packUint32(msg, r.Retry) + msg = packUint32(msg, r.Expire) + return packUint32(msg, r.MinTTL), nil +} + +func unpackSOAResource(msg []byte, off int) (SOAResource, error) { + var ns Name + off, err := ns.unpack(msg, off) + if err != nil { + return SOAResource{}, &nestedError{"NS", err} + } + var mbox Name + if off, err = mbox.unpack(msg, off); err != nil { + return SOAResource{}, &nestedError{"MBox", err} + } + serial, off, err := unpackUint32(msg, off) + if err != nil { + return SOAResource{}, &nestedError{"Serial", err} + } + refresh, off, err := unpackUint32(msg, off) + if err != nil { + return SOAResource{}, &nestedError{"Refresh", err} + } + retry, off, err := unpackUint32(msg, off) + if err != nil { + return SOAResource{}, &nestedError{"Retry", err} + } + expire, off, err := unpackUint32(msg, off) + if err != nil { + return SOAResource{}, &nestedError{"Expire", err} + } + minTTL, _, err := unpackUint32(msg, off) + if err != nil { + return SOAResource{}, &nestedError{"MinTTL", err} + } + return SOAResource{ns, mbox, serial, refresh, retry, expire, minTTL}, nil +} + +// A TXTResource is a TXT Resource record. +type TXTResource struct { + TXT []string +} + +func (r *TXTResource) realType() Type { + return TypeTXT +} + +// pack appends the wire format of the TXTResource to msg. +func (r *TXTResource) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) { + oldMsg := msg + for _, s := range r.TXT { + var err error + msg, err = packText(msg, s) + if err != nil { + return oldMsg, err + } + } + return msg, nil +} + +func unpackTXTResource(msg []byte, off int, length uint16) (TXTResource, error) { + txts := make([]string, 0, 1) + for n := uint16(0); n < length; { + var t string + var err error + if t, off, err = unpackText(msg, off); err != nil { + return TXTResource{}, &nestedError{"text", err} + } + // Check if we got too many bytes. + if length-n < uint16(len(t))+1 { + return TXTResource{}, errCalcLen + } + n += uint16(len(t)) + 1 + txts = append(txts, t) + } + return TXTResource{txts}, nil +} + +// An SRVResource is an SRV Resource record. +type SRVResource struct { + Priority uint16 + Weight uint16 + Port uint16 + Target Name // Not compressed as per RFC 2782. +} + +func (r *SRVResource) realType() Type { + return TypeSRV +} + +// pack appends the wire format of the SRVResource to msg. +func (r *SRVResource) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) { + oldMsg := msg + msg = packUint16(msg, r.Priority) + msg = packUint16(msg, r.Weight) + msg = packUint16(msg, r.Port) + msg, err := r.Target.pack(msg, nil, compressionOff) + if err != nil { + return oldMsg, &nestedError{"SRVResource.Target", err} + } + return msg, nil +} + +func unpackSRVResource(msg []byte, off int) (SRVResource, error) { + priority, off, err := unpackUint16(msg, off) + if err != nil { + return SRVResource{}, &nestedError{"Priority", err} + } + weight, off, err := unpackUint16(msg, off) + if err != nil { + return SRVResource{}, &nestedError{"Weight", err} + } + port, off, err := unpackUint16(msg, off) + if err != nil { + return SRVResource{}, &nestedError{"Port", err} + } + var target Name + if _, err := target.unpackCompressed(msg, off, false /* allowCompression */); err != nil { + return SRVResource{}, &nestedError{"Target", err} + } + return SRVResource{priority, weight, port, target}, nil +} + +// An AResource is an A Resource record. +type AResource struct { + A [4]byte +} + +func (r *AResource) realType() Type { + return TypeA +} + +// pack appends the wire format of the AResource to msg. +func (r *AResource) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) { + return packBytes(msg, r.A[:]), nil +} + +func unpackAResource(msg []byte, off int) (AResource, error) { + var a [4]byte + if _, err := unpackBytes(msg, off, a[:]); err != nil { + return AResource{}, err + } + return AResource{a}, nil +} + +// An AAAAResource is an AAAA Resource record. +type AAAAResource struct { + AAAA [16]byte +} + +func (r *AAAAResource) realType() Type { + return TypeAAAA +} + +// pack appends the wire format of the AAAAResource to msg. +func (r *AAAAResource) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) { + return packBytes(msg, r.AAAA[:]), nil +} + +func unpackAAAAResource(msg []byte, off int) (AAAAResource, error) { + var aaaa [16]byte + if _, err := unpackBytes(msg, off, aaaa[:]); err != nil { + return AAAAResource{}, err + } + return AAAAResource{aaaa}, nil +} + +// An OPTResource is an OPT pseudo Resource record. +// +// The pseudo resource record is part of the extension mechanisms for DNS +// as defined in RFC 6891. +type OPTResource struct { + Options []Option +} + +// An Option represents a DNS message option within OPTResource. +// +// The message option is part of the extension mechanisms for DNS as +// defined in RFC 6891. +type Option struct { + Code uint16 // option code + Data []byte +} + +func (r *OPTResource) realType() Type { + return TypeOPT +} + +func (r *OPTResource) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) { + for _, opt := range r.Options { + msg = packUint16(msg, opt.Code) + l := uint16(len(opt.Data)) + msg = packUint16(msg, l) + msg = packBytes(msg, opt.Data) + } + return msg, nil +} + +func unpackOPTResource(msg []byte, off int, length uint16) (OPTResource, error) { + var opts []Option + for oldOff := off; off < oldOff+int(length); { + var err error + var o Option + o.Code, off, err = unpackUint16(msg, off) + if err != nil { + return OPTResource{}, &nestedError{"Code", err} + } + var l uint16 + l, off, err = unpackUint16(msg, off) + if err != nil { + return OPTResource{}, &nestedError{"Data", err} + } + o.Data = make([]byte, l) + if copy(o.Data, msg[off:]) != int(l) { + return OPTResource{}, &nestedError{"Data", errCalcLen} + } + off += int(l) + opts = append(opts, o) + } + return OPTResource{opts}, nil +} diff --git a/api/vendor/golang.org/x/net/dns/dnsmessage/message_test.go b/api/vendor/golang.org/x/net/dns/dnsmessage/message_test.go new file mode 100644 index 0000000..7e4e4bd --- /dev/null +++ b/api/vendor/golang.org/x/net/dns/dnsmessage/message_test.go @@ -0,0 +1,1316 @@ +// 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 dnsmessage + +import ( + "bytes" + "fmt" + "reflect" + "strings" + "testing" +) + +func mustNewName(name string) Name { + n, err := NewName(name) + if err != nil { + panic(err) + } + return n +} + +func mustEDNS0ResourceHeader(l int, extrc RCode, do bool) ResourceHeader { + h := ResourceHeader{Class: ClassINET} + if err := h.SetEDNS0(l, extrc, do); err != nil { + panic(err) + } + return h +} + +func (m *Message) String() string { + s := fmt.Sprintf("Message: %#v\n", &m.Header) + if len(m.Questions) > 0 { + s += "-- Questions\n" + for _, q := range m.Questions { + s += fmt.Sprintf("%#v\n", q) + } + } + if len(m.Answers) > 0 { + s += "-- Answers\n" + for _, a := range m.Answers { + s += fmt.Sprintf("%#v\n", a) + } + } + if len(m.Authorities) > 0 { + s += "-- Authorities\n" + for _, ns := range m.Authorities { + s += fmt.Sprintf("%#v\n", ns) + } + } + if len(m.Additionals) > 0 { + s += "-- Additionals\n" + for _, e := range m.Additionals { + s += fmt.Sprintf("%#v\n", e) + } + } + return s +} + +func TestNameString(t *testing.T) { + want := "foo" + name := mustNewName(want) + if got := fmt.Sprint(name); got != want { + t.Errorf("got fmt.Sprint(%#v) = %s, want = %s", name, got, want) + } +} + +func TestQuestionPackUnpack(t *testing.T) { + want := Question{ + Name: mustNewName("."), + Type: TypeA, + Class: ClassINET, + } + buf, err := want.pack(make([]byte, 1, 50), map[string]int{}, 1) + if err != nil { + t.Fatal("Question.pack() =", err) + } + var p Parser + p.msg = buf + p.header.questions = 1 + p.section = sectionQuestions + p.off = 1 + got, err := p.Question() + if err != nil { + t.Fatalf("Parser{%q}.Question() = %v", string(buf[1:]), err) + } + if p.off != len(buf) { + t.Errorf("unpacked different amount than packed: got = %d, want = %d", p.off, len(buf)) + } + if !reflect.DeepEqual(got, want) { + t.Errorf("got from Parser.Question() = %+v, want = %+v", got, want) + } +} + +func TestName(t *testing.T) { + tests := []string{ + "", + ".", + "google..com", + "google.com", + "google..com.", + "google.com.", + ".google.com.", + "www..google.com.", + "www.google.com.", + } + + for _, test := range tests { + n, err := NewName(test) + if err != nil { + t.Errorf("NewName(%q) = %v", test, err) + continue + } + if ns := n.String(); ns != test { + t.Errorf("got %#v.String() = %q, want = %q", n, ns, test) + continue + } + } +} + +func TestNamePackUnpack(t *testing.T) { + tests := []struct { + in string + want string + err error + }{ + {"", "", errNonCanonicalName}, + {".", ".", nil}, + {"google..com", "", errNonCanonicalName}, + {"google.com", "", errNonCanonicalName}, + {"google..com.", "", errZeroSegLen}, + {"google.com.", "google.com.", nil}, + {".google.com.", "", errZeroSegLen}, + {"www..google.com.", "", errZeroSegLen}, + {"www.google.com.", "www.google.com.", nil}, + } + + for _, test := range tests { + in := mustNewName(test.in) + want := mustNewName(test.want) + buf, err := in.pack(make([]byte, 0, 30), map[string]int{}, 0) + if err != test.err { + t.Errorf("got %q.pack() = %v, want = %v", test.in, err, test.err) + continue + } + if test.err != nil { + continue + } + var got Name + n, err := got.unpack(buf, 0) + if err != nil { + t.Errorf("%q.unpack() = %v", test.in, err) + continue + } + if n != len(buf) { + t.Errorf( + "unpacked different amount than packed for %q: got = %d, want = %d", + test.in, + n, + len(buf), + ) + } + if got != want { + t.Errorf("unpacking packing of %q: got = %#v, want = %#v", test.in, got, want) + } + } +} + +func TestIncompressibleName(t *testing.T) { + name := mustNewName("example.com.") + compression := map[string]int{} + buf, err := name.pack(make([]byte, 0, 100), compression, 0) + if err != nil { + t.Fatal("first Name.pack() =", err) + } + buf, err = name.pack(buf, compression, 0) + if err != nil { + t.Fatal("second Name.pack() =", err) + } + var n1 Name + off, err := n1.unpackCompressed(buf, 0, false /* allowCompression */) + if err != nil { + t.Fatal("unpacking incompressible name without pointers failed:", err) + } + var n2 Name + if _, err := n2.unpackCompressed(buf, off, false /* allowCompression */); err != errCompressedSRV { + t.Errorf("unpacking compressed incompressible name with pointers: got %v, want = %v", err, errCompressedSRV) + } +} + +func checkErrorPrefix(err error, prefix string) bool { + e, ok := err.(*nestedError) + return ok && e.s == prefix +} + +func TestHeaderUnpackError(t *testing.T) { + wants := []string{ + "id", + "bits", + "questions", + "answers", + "authorities", + "additionals", + } + var buf []byte + var h header + for _, want := range wants { + n, err := h.unpack(buf, 0) + if n != 0 || !checkErrorPrefix(err, want) { + t.Errorf("got header.unpack([%d]byte, 0) = %d, %v, want = 0, %s", len(buf), n, err, want) + } + buf = append(buf, 0, 0) + } +} + +func TestParserStart(t *testing.T) { + const want = "unpacking header" + var p Parser + for i := 0; i <= 1; i++ { + _, err := p.Start([]byte{}) + if !checkErrorPrefix(err, want) { + t.Errorf("got Parser.Start(nil) = _, %v, want = _, %s", err, want) + } + } +} + +func TestResourceNotStarted(t *testing.T) { + tests := []struct { + name string + fn func(*Parser) error + }{ + {"CNAMEResource", func(p *Parser) error { _, err := p.CNAMEResource(); return err }}, + {"MXResource", func(p *Parser) error { _, err := p.MXResource(); return err }}, + {"NSResource", func(p *Parser) error { _, err := p.NSResource(); return err }}, + {"PTRResource", func(p *Parser) error { _, err := p.PTRResource(); return err }}, + {"SOAResource", func(p *Parser) error { _, err := p.SOAResource(); return err }}, + {"TXTResource", func(p *Parser) error { _, err := p.TXTResource(); return err }}, + {"SRVResource", func(p *Parser) error { _, err := p.SRVResource(); return err }}, + {"AResource", func(p *Parser) error { _, err := p.AResource(); return err }}, + {"AAAAResource", func(p *Parser) error { _, err := p.AAAAResource(); return err }}, + } + + for _, test := range tests { + if err := test.fn(&Parser{}); err != ErrNotStarted { + t.Errorf("got Parser.%s() = _ , %v, want = _, %v", test.name, err, ErrNotStarted) + } + } +} + +func TestDNSPackUnpack(t *testing.T) { + wants := []Message{ + { + Questions: []Question{ + { + Name: mustNewName("."), + Type: TypeAAAA, + Class: ClassINET, + }, + }, + Answers: []Resource{}, + Authorities: []Resource{}, + Additionals: []Resource{}, + }, + largeTestMsg(), + } + for i, want := range wants { + b, err := want.Pack() + if err != nil { + t.Fatalf("%d: Message.Pack() = %v", i, err) + } + var got Message + err = got.Unpack(b) + if err != nil { + t.Fatalf("%d: Message.Unapck() = %v", i, err) + } + if !reflect.DeepEqual(got, want) { + t.Errorf("%d: Message.Pack/Unpack() roundtrip: got = %+v, want = %+v", i, &got, &want) + } + } +} + +func TestDNSAppendPackUnpack(t *testing.T) { + wants := []Message{ + { + Questions: []Question{ + { + Name: mustNewName("."), + Type: TypeAAAA, + Class: ClassINET, + }, + }, + Answers: []Resource{}, + Authorities: []Resource{}, + Additionals: []Resource{}, + }, + largeTestMsg(), + } + for i, want := range wants { + b := make([]byte, 2, 514) + b, err := want.AppendPack(b) + if err != nil { + t.Fatalf("%d: Message.AppendPack() = %v", i, err) + } + b = b[2:] + var got Message + err = got.Unpack(b) + if err != nil { + t.Fatalf("%d: Message.Unapck() = %v", i, err) + } + if !reflect.DeepEqual(got, want) { + t.Errorf("%d: Message.AppendPack/Unpack() roundtrip: got = %+v, want = %+v", i, &got, &want) + } + } +} + +func TestSkipAll(t *testing.T) { + msg := largeTestMsg() + buf, err := msg.Pack() + if err != nil { + t.Fatal("Message.Pack() =", err) + } + var p Parser + if _, err := p.Start(buf); err != nil { + t.Fatal("Parser.Start(non-nil) =", err) + } + + tests := []struct { + name string + f func() error + }{ + {"SkipAllQuestions", p.SkipAllQuestions}, + {"SkipAllAnswers", p.SkipAllAnswers}, + {"SkipAllAuthorities", p.SkipAllAuthorities}, + {"SkipAllAdditionals", p.SkipAllAdditionals}, + } + for _, test := range tests { + for i := 1; i <= 3; i++ { + if err := test.f(); err != nil { + t.Errorf("%d: Parser.%s() = %v", i, test.name, err) + } + } + } +} + +func TestSkipEach(t *testing.T) { + msg := smallTestMsg() + + buf, err := msg.Pack() + if err != nil { + t.Fatal("Message.Pack() =", err) + } + var p Parser + if _, err := p.Start(buf); err != nil { + t.Fatal("Parser.Start(non-nil) =", err) + } + + tests := []struct { + name string + f func() error + }{ + {"SkipQuestion", p.SkipQuestion}, + {"SkipAnswer", p.SkipAnswer}, + {"SkipAuthority", p.SkipAuthority}, + {"SkipAdditional", p.SkipAdditional}, + } + for _, test := range tests { + if err := test.f(); err != nil { + t.Errorf("first Parser.%s() = %v, want = nil", test.name, err) + } + if err := test.f(); err != ErrSectionDone { + t.Errorf("second Parser.%s() = %v, want = %v", test.name, err, ErrSectionDone) + } + } +} + +func TestSkipAfterRead(t *testing.T) { + msg := smallTestMsg() + + buf, err := msg.Pack() + if err != nil { + t.Fatal("Message.Pack() =", err) + } + var p Parser + if _, err := p.Start(buf); err != nil { + t.Fatal("Parser.Srart(non-nil) =", err) + } + + tests := []struct { + name string + skip func() error + read func() error + }{ + {"Question", p.SkipQuestion, func() error { _, err := p.Question(); return err }}, + {"Answer", p.SkipAnswer, func() error { _, err := p.Answer(); return err }}, + {"Authority", p.SkipAuthority, func() error { _, err := p.Authority(); return err }}, + {"Additional", p.SkipAdditional, func() error { _, err := p.Additional(); return err }}, + } + for _, test := range tests { + if err := test.read(); err != nil { + t.Errorf("got Parser.%s() = _, %v, want = _, nil", test.name, err) + } + if err := test.skip(); err != ErrSectionDone { + t.Errorf("got Parser.Skip%s() = %v, want = %v", test.name, err, ErrSectionDone) + } + } +} + +func TestSkipNotStarted(t *testing.T) { + var p Parser + + tests := []struct { + name string + f func() error + }{ + {"SkipAllQuestions", p.SkipAllQuestions}, + {"SkipAllAnswers", p.SkipAllAnswers}, + {"SkipAllAuthorities", p.SkipAllAuthorities}, + {"SkipAllAdditionals", p.SkipAllAdditionals}, + } + for _, test := range tests { + if err := test.f(); err != ErrNotStarted { + t.Errorf("got Parser.%s() = %v, want = %v", test.name, err, ErrNotStarted) + } + } +} + +func TestTooManyRecords(t *testing.T) { + const recs = int(^uint16(0)) + 1 + tests := []struct { + name string + msg Message + want error + }{ + { + "Questions", + Message{ + Questions: make([]Question, recs), + }, + errTooManyQuestions, + }, + { + "Answers", + Message{ + Answers: make([]Resource, recs), + }, + errTooManyAnswers, + }, + { + "Authorities", + Message{ + Authorities: make([]Resource, recs), + }, + errTooManyAuthorities, + }, + { + "Additionals", + Message{ + Additionals: make([]Resource, recs), + }, + errTooManyAdditionals, + }, + } + + for _, test := range tests { + if _, got := test.msg.Pack(); got != test.want { + t.Errorf("got Message.Pack() for %d %s = %v, want = %v", recs, test.name, got, test.want) + } + } +} + +func TestVeryLongTxt(t *testing.T) { + want := Resource{ + ResourceHeader{ + Name: mustNewName("foo.bar.example.com."), + Type: TypeTXT, + Class: ClassINET, + }, + &TXTResource{[]string{ + "", + "", + "foo bar", + "", + "www.example.com", + "www.example.com.", + strings.Repeat(".", 255), + }}, + } + buf, err := want.pack(make([]byte, 0, 8000), map[string]int{}, 0) + if err != nil { + t.Fatal("Resource.pack() =", err) + } + var got Resource + off, err := got.Header.unpack(buf, 0) + if err != nil { + t.Fatal("ResourceHeader.unpack() =", err) + } + body, n, err := unpackResourceBody(buf, off, got.Header) + if err != nil { + t.Fatal("unpackResourceBody() =", err) + } + got.Body = body + if n != len(buf) { + t.Errorf("unpacked different amount than packed: got = %d, want = %d", n, len(buf)) + } + if !reflect.DeepEqual(got, want) { + t.Errorf("Resource.pack/unpack() roundtrip: got = %#v, want = %#v", got, want) + } +} + +func TestTooLongTxt(t *testing.T) { + rb := TXTResource{[]string{strings.Repeat(".", 256)}} + if _, err := rb.pack(make([]byte, 0, 8000), map[string]int{}, 0); err != errStringTooLong { + t.Errorf("packing TXTResource with 256 character string: got err = %v, want = %v", err, errStringTooLong) + } +} + +func TestStartAppends(t *testing.T) { + buf := make([]byte, 2, 514) + wantBuf := []byte{4, 44} + copy(buf, wantBuf) + + b := NewBuilder(buf, Header{}) + b.EnableCompression() + + buf, err := b.Finish() + if err != nil { + t.Fatal("Builder.Finish() =", err) + } + if got, want := len(buf), headerLen+2; got != want { + t.Errorf("got len(buf) = %d, want = %d", got, want) + } + if string(buf[:2]) != string(wantBuf) { + t.Errorf("original data not preserved, got = %#v, want = %#v", buf[:2], wantBuf) + } +} + +func TestStartError(t *testing.T) { + tests := []struct { + name string + fn func(*Builder) error + }{ + {"Questions", func(b *Builder) error { return b.StartQuestions() }}, + {"Answers", func(b *Builder) error { return b.StartAnswers() }}, + {"Authorities", func(b *Builder) error { return b.StartAuthorities() }}, + {"Additionals", func(b *Builder) error { return b.StartAdditionals() }}, + } + + envs := []struct { + name string + fn func() *Builder + want error + }{ + {"sectionNotStarted", func() *Builder { return &Builder{section: sectionNotStarted} }, ErrNotStarted}, + {"sectionDone", func() *Builder { return &Builder{section: sectionDone} }, ErrSectionDone}, + } + + for _, env := range envs { + for _, test := range tests { + if got := test.fn(env.fn()); got != env.want { + t.Errorf("got Builder{%s}.Start%s() = %v, want = %v", env.name, test.name, got, env.want) + } + } + } +} + +func TestBuilderResourceError(t *testing.T) { + tests := []struct { + name string + fn func(*Builder) error + }{ + {"CNAMEResource", func(b *Builder) error { return b.CNAMEResource(ResourceHeader{}, CNAMEResource{}) }}, + {"MXResource", func(b *Builder) error { return b.MXResource(ResourceHeader{}, MXResource{}) }}, + {"NSResource", func(b *Builder) error { return b.NSResource(ResourceHeader{}, NSResource{}) }}, + {"PTRResource", func(b *Builder) error { return b.PTRResource(ResourceHeader{}, PTRResource{}) }}, + {"SOAResource", func(b *Builder) error { return b.SOAResource(ResourceHeader{}, SOAResource{}) }}, + {"TXTResource", func(b *Builder) error { return b.TXTResource(ResourceHeader{}, TXTResource{}) }}, + {"SRVResource", func(b *Builder) error { return b.SRVResource(ResourceHeader{}, SRVResource{}) }}, + {"AResource", func(b *Builder) error { return b.AResource(ResourceHeader{}, AResource{}) }}, + {"AAAAResource", func(b *Builder) error { return b.AAAAResource(ResourceHeader{}, AAAAResource{}) }}, + {"OPTResource", func(b *Builder) error { return b.OPTResource(ResourceHeader{}, OPTResource{}) }}, + } + + envs := []struct { + name string + fn func() *Builder + want error + }{ + {"sectionNotStarted", func() *Builder { return &Builder{section: sectionNotStarted} }, ErrNotStarted}, + {"sectionHeader", func() *Builder { return &Builder{section: sectionHeader} }, ErrNotStarted}, + {"sectionQuestions", func() *Builder { return &Builder{section: sectionQuestions} }, ErrNotStarted}, + {"sectionDone", func() *Builder { return &Builder{section: sectionDone} }, ErrSectionDone}, + } + + for _, env := range envs { + for _, test := range tests { + if got := test.fn(env.fn()); got != env.want { + t.Errorf("got Builder{%s}.%s() = %v, want = %v", env.name, test.name, got, env.want) + } + } + } +} + +func TestFinishError(t *testing.T) { + var b Builder + want := ErrNotStarted + if _, got := b.Finish(); got != want { + t.Errorf("got Builder.Finish() = %v, want = %v", got, want) + } +} + +func TestBuilder(t *testing.T) { + msg := largeTestMsg() + want, err := msg.Pack() + if err != nil { + t.Fatal("Message.Pack() =", err) + } + + b := NewBuilder(nil, msg.Header) + b.EnableCompression() + + if err := b.StartQuestions(); err != nil { + t.Fatal("Builder.StartQuestions() =", err) + } + for _, q := range msg.Questions { + if err := b.Question(q); err != nil { + t.Fatalf("Builder.Question(%#v) = %v", q, err) + } + } + + if err := b.StartAnswers(); err != nil { + t.Fatal("Builder.StartAnswers() =", err) + } + for _, a := range msg.Answers { + switch a.Header.Type { + case TypeA: + if err := b.AResource(a.Header, *a.Body.(*AResource)); err != nil { + t.Fatalf("Builder.AResource(%#v) = %v", a, err) + } + case TypeNS: + if err := b.NSResource(a.Header, *a.Body.(*NSResource)); err != nil { + t.Fatalf("Builder.NSResource(%#v) = %v", a, err) + } + case TypeCNAME: + if err := b.CNAMEResource(a.Header, *a.Body.(*CNAMEResource)); err != nil { + t.Fatalf("Builder.CNAMEResource(%#v) = %v", a, err) + } + case TypeSOA: + if err := b.SOAResource(a.Header, *a.Body.(*SOAResource)); err != nil { + t.Fatalf("Builder.SOAResource(%#v) = %v", a, err) + } + case TypePTR: + if err := b.PTRResource(a.Header, *a.Body.(*PTRResource)); err != nil { + t.Fatalf("Builder.PTRResource(%#v) = %v", a, err) + } + case TypeMX: + if err := b.MXResource(a.Header, *a.Body.(*MXResource)); err != nil { + t.Fatalf("Builder.MXResource(%#v) = %v", a, err) + } + case TypeTXT: + if err := b.TXTResource(a.Header, *a.Body.(*TXTResource)); err != nil { + t.Fatalf("Builder.TXTResource(%#v) = %v", a, err) + } + case TypeAAAA: + if err := b.AAAAResource(a.Header, *a.Body.(*AAAAResource)); err != nil { + t.Fatalf("Builder.AAAAResource(%#v) = %v", a, err) + } + case TypeSRV: + if err := b.SRVResource(a.Header, *a.Body.(*SRVResource)); err != nil { + t.Fatalf("Builder.SRVResource(%#v) = %v", a, err) + } + } + } + + if err := b.StartAuthorities(); err != nil { + t.Fatal("Builder.StartAuthorities() =", err) + } + for _, a := range msg.Authorities { + if err := b.NSResource(a.Header, *a.Body.(*NSResource)); err != nil { + t.Fatalf("Builder.NSResource(%#v) = %v", a, err) + } + } + + if err := b.StartAdditionals(); err != nil { + t.Fatal("Builder.StartAdditionals() =", err) + } + for _, a := range msg.Additionals { + switch a.Body.(type) { + case *TXTResource: + if err := b.TXTResource(a.Header, *a.Body.(*TXTResource)); err != nil { + t.Fatalf("Builder.TXTResource(%#v) = %v", a, err) + } + case *OPTResource: + if err := b.OPTResource(a.Header, *a.Body.(*OPTResource)); err != nil { + t.Fatalf("Builder.OPTResource(%#v) = %v", a, err) + } + } + } + + got, err := b.Finish() + if err != nil { + t.Fatal("Builder.Finish() =", err) + } + if !bytes.Equal(got, want) { + t.Fatalf("got from Builder.Finish() = %#v\nwant = %#v", got, want) + } +} + +func TestResourcePack(t *testing.T) { + for _, tt := range []struct { + m Message + err error + }{ + { + Message{ + Questions: []Question{ + { + Name: mustNewName("."), + Type: TypeAAAA, + Class: ClassINET, + }, + }, + Answers: []Resource{{ResourceHeader{}, nil}}, + }, + &nestedError{"packing Answer", errNilResouceBody}, + }, + { + Message{ + Questions: []Question{ + { + Name: mustNewName("."), + Type: TypeAAAA, + Class: ClassINET, + }, + }, + Authorities: []Resource{{ResourceHeader{}, (*NSResource)(nil)}}, + }, + &nestedError{"packing Authority", + &nestedError{"ResourceHeader", + &nestedError{"Name", errNonCanonicalName}, + }, + }, + }, + { + Message{ + Questions: []Question{ + { + Name: mustNewName("."), + Type: TypeA, + Class: ClassINET, + }, + }, + Additionals: []Resource{{ResourceHeader{}, nil}}, + }, + &nestedError{"packing Additional", errNilResouceBody}, + }, + } { + _, err := tt.m.Pack() + if !reflect.DeepEqual(err, tt.err) { + t.Errorf("got Message{%v}.Pack() = %v, want %v", tt.m, err, tt.err) + } + } +} + +func TestOptionPackUnpack(t *testing.T) { + for _, tt := range []struct { + name string + w []byte // wire format of m.Additionals + m Message + dnssecOK bool + extRCode RCode + }{ + { + name: "without EDNS(0) options", + w: []byte{ + 0x00, 0x00, 0x29, 0x10, 0x00, 0xfe, 0x00, 0x80, + 0x00, 0x00, 0x00, + }, + m: Message{ + Header: Header{RCode: RCodeFormatError}, + Questions: []Question{ + { + Name: mustNewName("."), + Type: TypeA, + Class: ClassINET, + }, + }, + Additionals: []Resource{ + { + mustEDNS0ResourceHeader(4096, 0xfe0|RCodeFormatError, true), + &OPTResource{}, + }, + }, + }, + dnssecOK: true, + extRCode: 0xfe0 | RCodeFormatError, + }, + { + name: "with EDNS(0) options", + w: []byte{ + 0x00, 0x00, 0x29, 0x10, 0x00, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x0b, 0x00, 0x02, 0x12, 0x34, + }, + m: Message{ + Header: Header{RCode: RCodeServerFailure}, + Questions: []Question{ + { + Name: mustNewName("."), + Type: TypeAAAA, + Class: ClassINET, + }, + }, + Additionals: []Resource{ + { + mustEDNS0ResourceHeader(4096, 0xff0|RCodeServerFailure, false), + &OPTResource{ + Options: []Option{ + { + Code: 12, // see RFC 7828 + Data: []byte{0x00, 0x00}, + }, + { + Code: 11, // see RFC 7830 + Data: []byte{0x12, 0x34}, + }, + }, + }, + }, + }, + }, + dnssecOK: false, + extRCode: 0xff0 | RCodeServerFailure, + }, + { + // Containing multiple OPT resources in a + // message is invalid, but it's necessary for + // protocol conformance testing. + name: "with multiple OPT resources", + w: []byte{ + 0x00, 0x00, 0x29, 0x10, 0x00, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x00, 0x0b, 0x00, 0x02, 0x12, + 0x34, 0x00, 0x00, 0x29, 0x10, 0x00, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x02, + 0x00, 0x00, + }, + m: Message{ + Header: Header{RCode: RCodeNameError}, + Questions: []Question{ + { + Name: mustNewName("."), + Type: TypeAAAA, + Class: ClassINET, + }, + }, + Additionals: []Resource{ + { + mustEDNS0ResourceHeader(4096, 0xff0|RCodeNameError, false), + &OPTResource{ + Options: []Option{ + { + Code: 11, // see RFC 7830 + Data: []byte{0x12, 0x34}, + }, + }, + }, + }, + { + mustEDNS0ResourceHeader(4096, 0xff0|RCodeNameError, false), + &OPTResource{ + Options: []Option{ + { + Code: 12, // see RFC 7828 + Data: []byte{0x00, 0x00}, + }, + }, + }, + }, + }, + }, + }, + } { + w, err := tt.m.Pack() + if err != nil { + t.Errorf("Message.Pack() for %s = %v", tt.name, err) + continue + } + if !bytes.Equal(w[len(w)-len(tt.w):], tt.w) { + t.Errorf("got Message.Pack() for %s = %#v, want %#v", tt.name, w[len(w)-len(tt.w):], tt.w) + continue + } + var m Message + if err := m.Unpack(w); err != nil { + t.Errorf("Message.Unpack() for %s = %v", tt.name, err) + continue + } + if !reflect.DeepEqual(m.Additionals, tt.m.Additionals) { + t.Errorf("got Message.Pack/Unpack() roundtrip for %s = %+v, want %+v", tt.name, m, tt.m) + continue + } + } +} + +func benchmarkParsingSetup() ([]byte, error) { + name := mustNewName("foo.bar.example.com.") + msg := Message{ + Header: Header{Response: true, Authoritative: true}, + Questions: []Question{ + { + Name: name, + Type: TypeA, + Class: ClassINET, + }, + }, + Answers: []Resource{ + { + ResourceHeader{ + Name: name, + Class: ClassINET, + }, + &AResource{[4]byte{}}, + }, + { + ResourceHeader{ + Name: name, + Class: ClassINET, + }, + &AAAAResource{[16]byte{}}, + }, + { + ResourceHeader{ + Name: name, + Class: ClassINET, + }, + &CNAMEResource{name}, + }, + { + ResourceHeader{ + Name: name, + Class: ClassINET, + }, + &NSResource{name}, + }, + }, + } + + buf, err := msg.Pack() + if err != nil { + return nil, fmt.Errorf("Message.Pack() = %v", err) + } + return buf, nil +} + +func benchmarkParsing(tb testing.TB, buf []byte) { + var p Parser + if _, err := p.Start(buf); err != nil { + tb.Fatal("Parser.Start(non-nil) =", err) + } + + for { + _, err := p.Question() + if err == ErrSectionDone { + break + } + if err != nil { + tb.Fatal("Parser.Question() =", err) + } + } + + for { + h, err := p.AnswerHeader() + if err == ErrSectionDone { + break + } + if err != nil { + tb.Fatal("Parser.AnswerHeader() =", err) + } + + switch h.Type { + case TypeA: + if _, err := p.AResource(); err != nil { + tb.Fatal("Parser.AResource() =", err) + } + case TypeAAAA: + if _, err := p.AAAAResource(); err != nil { + tb.Fatal("Parser.AAAAResource() =", err) + } + case TypeCNAME: + if _, err := p.CNAMEResource(); err != nil { + tb.Fatal("Parser.CNAMEResource() =", err) + } + case TypeNS: + if _, err := p.NSResource(); err != nil { + tb.Fatal("Parser.NSResource() =", err) + } + case TypeOPT: + if _, err := p.OPTResource(); err != nil { + tb.Fatal("Parser.OPTResource() =", err) + } + default: + tb.Fatalf("got unknown type: %T", h) + } + } +} + +func BenchmarkParsing(b *testing.B) { + buf, err := benchmarkParsingSetup() + if err != nil { + b.Fatal(err) + } + + b.ReportAllocs() + for i := 0; i < b.N; i++ { + benchmarkParsing(b, buf) + } +} + +func TestParsingAllocs(t *testing.T) { + buf, err := benchmarkParsingSetup() + if err != nil { + t.Fatal(err) + } + + if allocs := testing.AllocsPerRun(100, func() { benchmarkParsing(t, buf) }); allocs > 0.5 { + t.Errorf("allocations during parsing: got = %f, want ~0", allocs) + } +} + +func benchmarkBuildingSetup() (Name, []byte) { + name := mustNewName("foo.bar.example.com.") + buf := make([]byte, 0, packStartingCap) + return name, buf +} + +func benchmarkBuilding(tb testing.TB, name Name, buf []byte) { + bld := NewBuilder(buf, Header{Response: true, Authoritative: true}) + + if err := bld.StartQuestions(); err != nil { + tb.Fatal("Builder.StartQuestions() =", err) + } + q := Question{ + Name: name, + Type: TypeA, + Class: ClassINET, + } + if err := bld.Question(q); err != nil { + tb.Fatalf("Builder.Question(%+v) = %v", q, err) + } + + hdr := ResourceHeader{ + Name: name, + Class: ClassINET, + } + if err := bld.StartAnswers(); err != nil { + tb.Fatal("Builder.StartQuestions() =", err) + } + + ar := AResource{[4]byte{}} + if err := bld.AResource(hdr, ar); err != nil { + tb.Fatalf("Builder.AResource(%+v, %+v) = %v", hdr, ar, err) + } + + aaar := AAAAResource{[16]byte{}} + if err := bld.AAAAResource(hdr, aaar); err != nil { + tb.Fatalf("Builder.AAAAResource(%+v, %+v) = %v", hdr, aaar, err) + } + + cnr := CNAMEResource{name} + if err := bld.CNAMEResource(hdr, cnr); err != nil { + tb.Fatalf("Builder.CNAMEResource(%+v, %+v) = %v", hdr, cnr, err) + } + + nsr := NSResource{name} + if err := bld.NSResource(hdr, nsr); err != nil { + tb.Fatalf("Builder.NSResource(%+v, %+v) = %v", hdr, nsr, err) + } + + extrc := 0xfe0 | RCodeNotImplemented + if err := (&hdr).SetEDNS0(4096, extrc, true); err != nil { + tb.Fatalf("ResourceHeader.SetEDNS0(4096, %#x, true) = %v", extrc, err) + } + optr := OPTResource{} + if err := bld.OPTResource(hdr, optr); err != nil { + tb.Fatalf("Builder.OPTResource(%+v, %+v) = %v", hdr, optr, err) + } + + if _, err := bld.Finish(); err != nil { + tb.Fatal("Builder.Finish() =", err) + } +} + +func BenchmarkBuilding(b *testing.B) { + name, buf := benchmarkBuildingSetup() + b.ReportAllocs() + for i := 0; i < b.N; i++ { + benchmarkBuilding(b, name, buf) + } +} + +func TestBuildingAllocs(t *testing.T) { + name, buf := benchmarkBuildingSetup() + if allocs := testing.AllocsPerRun(100, func() { benchmarkBuilding(t, name, buf) }); allocs > 0.5 { + t.Errorf("allocations during building: got = %f, want ~0", allocs) + } +} + +func smallTestMsg() Message { + name := mustNewName("example.com.") + return Message{ + Header: Header{Response: true, Authoritative: true}, + Questions: []Question{ + { + Name: name, + Type: TypeA, + Class: ClassINET, + }, + }, + Answers: []Resource{ + { + ResourceHeader{ + Name: name, + Type: TypeA, + Class: ClassINET, + }, + &AResource{[4]byte{127, 0, 0, 1}}, + }, + }, + Authorities: []Resource{ + { + ResourceHeader{ + Name: name, + Type: TypeA, + Class: ClassINET, + }, + &AResource{[4]byte{127, 0, 0, 1}}, + }, + }, + Additionals: []Resource{ + { + ResourceHeader{ + Name: name, + Type: TypeA, + Class: ClassINET, + }, + &AResource{[4]byte{127, 0, 0, 1}}, + }, + }, + } +} + +func BenchmarkPack(b *testing.B) { + msg := largeTestMsg() + + b.ReportAllocs() + + for i := 0; i < b.N; i++ { + if _, err := msg.Pack(); err != nil { + b.Fatal("Message.Pack() =", err) + } + } +} + +func BenchmarkAppendPack(b *testing.B) { + msg := largeTestMsg() + buf := make([]byte, 0, packStartingCap) + + b.ReportAllocs() + + for i := 0; i < b.N; i++ { + if _, err := msg.AppendPack(buf[:0]); err != nil { + b.Fatal("Message.AppendPack() = ", err) + } + } +} + +func largeTestMsg() Message { + name := mustNewName("foo.bar.example.com.") + return Message{ + Header: Header{Response: true, Authoritative: true}, + Questions: []Question{ + { + Name: name, + Type: TypeA, + Class: ClassINET, + }, + }, + Answers: []Resource{ + { + ResourceHeader{ + Name: name, + Type: TypeA, + Class: ClassINET, + }, + &AResource{[4]byte{127, 0, 0, 1}}, + }, + { + ResourceHeader{ + Name: name, + Type: TypeA, + Class: ClassINET, + }, + &AResource{[4]byte{127, 0, 0, 2}}, + }, + { + ResourceHeader{ + Name: name, + Type: TypeAAAA, + Class: ClassINET, + }, + &AAAAResource{[16]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}}, + }, + { + ResourceHeader{ + Name: name, + Type: TypeCNAME, + Class: ClassINET, + }, + &CNAMEResource{mustNewName("alias.example.com.")}, + }, + { + ResourceHeader{ + Name: name, + Type: TypeSOA, + Class: ClassINET, + }, + &SOAResource{ + NS: mustNewName("ns1.example.com."), + MBox: mustNewName("mb.example.com."), + Serial: 1, + Refresh: 2, + Retry: 3, + Expire: 4, + MinTTL: 5, + }, + }, + { + ResourceHeader{ + Name: name, + Type: TypePTR, + Class: ClassINET, + }, + &PTRResource{mustNewName("ptr.example.com.")}, + }, + { + ResourceHeader{ + Name: name, + Type: TypeMX, + Class: ClassINET, + }, + &MXResource{ + 7, + mustNewName("mx.example.com."), + }, + }, + { + ResourceHeader{ + Name: name, + Type: TypeSRV, + Class: ClassINET, + }, + &SRVResource{ + 8, + 9, + 11, + mustNewName("srv.example.com."), + }, + }, + }, + Authorities: []Resource{ + { + ResourceHeader{ + Name: name, + Type: TypeNS, + Class: ClassINET, + }, + &NSResource{mustNewName("ns1.example.com.")}, + }, + { + ResourceHeader{ + Name: name, + Type: TypeNS, + Class: ClassINET, + }, + &NSResource{mustNewName("ns2.example.com.")}, + }, + }, + Additionals: []Resource{ + { + ResourceHeader{ + Name: name, + Type: TypeTXT, + Class: ClassINET, + }, + &TXTResource{[]string{"So Long, and Thanks for All the Fish"}}, + }, + { + ResourceHeader{ + Name: name, + Type: TypeTXT, + Class: ClassINET, + }, + &TXTResource{[]string{"Hamster Huey and the Gooey Kablooie"}}, + }, + { + mustEDNS0ResourceHeader(4096, 0xfe0|RCodeSuccess, false), + &OPTResource{ + Options: []Option{ + { + Code: 10, // see RFC 7873 + Data: []byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef}, + }, + }, + }, + }, + }, + } +} diff --git a/api/vendor/golang.org/x/net/html/atom/atom.go b/api/vendor/golang.org/x/net/html/atom/atom.go new file mode 100644 index 0000000..cd0a8ac --- /dev/null +++ b/api/vendor/golang.org/x/net/html/atom/atom.go @@ -0,0 +1,78 @@ +// 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 atom provides integer codes (also known as atoms) for a fixed set of +// frequently occurring HTML strings: tag names and attribute keys such as "p" +// and "id". +// +// Sharing an atom's name between all elements with the same tag can result in +// fewer string allocations when tokenizing and parsing HTML. Integer +// comparisons are also generally faster than string comparisons. +// +// The value of an atom's particular code is not guaranteed to stay the same +// between versions of this package. Neither is any ordering guaranteed: +// whether atom.H1 < atom.H2 may also change. The codes are not guaranteed to +// be dense. The only guarantees are that e.g. looking up "div" will yield +// atom.Div, calling atom.Div.String will return "div", and atom.Div != 0. +package atom // import "golang.org/x/net/html/atom" + +// Atom is an integer code for a string. The zero value maps to "". +type Atom uint32 + +// String returns the atom's name. +func (a Atom) String() string { + start := uint32(a >> 8) + n := uint32(a & 0xff) + if start+n > uint32(len(atomText)) { + return "" + } + return atomText[start : start+n] +} + +func (a Atom) string() string { + return atomText[a>>8 : a>>8+a&0xff] +} + +// fnv computes the FNV hash with an arbitrary starting value h. +func fnv(h uint32, s []byte) uint32 { + for i := range s { + h ^= uint32(s[i]) + h *= 16777619 + } + return h +} + +func match(s string, t []byte) bool { + for i, c := range t { + if s[i] != c { + return false + } + } + return true +} + +// Lookup returns the atom whose name is s. It returns zero if there is no +// such atom. The lookup is case sensitive. +func Lookup(s []byte) Atom { + if len(s) == 0 || len(s) > maxAtomLen { + return 0 + } + h := fnv(hash0, s) + if a := table[h&uint32(len(table)-1)]; int(a&0xff) == len(s) && match(a.string(), s) { + return a + } + if a := table[(h>>16)&uint32(len(table)-1)]; int(a&0xff) == len(s) && match(a.string(), s) { + return a + } + return 0 +} + +// String returns a string whose contents are equal to s. In that sense, it is +// equivalent to string(s) but may be more efficient. +func String(s []byte) string { + if a := Lookup(s); a != 0 { + return a.String() + } + return string(s) +} diff --git a/api/vendor/golang.org/x/net/html/atom/atom_test.go b/api/vendor/golang.org/x/net/html/atom/atom_test.go new file mode 100644 index 0000000..6e33704 --- /dev/null +++ b/api/vendor/golang.org/x/net/html/atom/atom_test.go @@ -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. + +package atom + +import ( + "sort" + "testing" +) + +func TestKnown(t *testing.T) { + for _, s := range testAtomList { + if atom := Lookup([]byte(s)); atom.String() != s { + t.Errorf("Lookup(%q) = %#x (%q)", s, uint32(atom), atom.String()) + } + } +} + +func TestHits(t *testing.T) { + for _, a := range table { + if a == 0 { + continue + } + got := Lookup([]byte(a.String())) + if got != a { + t.Errorf("Lookup(%q) = %#x, want %#x", a.String(), uint32(got), uint32(a)) + } + } +} + +func TestMisses(t *testing.T) { + testCases := []string{ + "", + "\x00", + "\xff", + "A", + "DIV", + "Div", + "dIV", + "aa", + "a\x00", + "ab", + "abb", + "abbr0", + "abbr ", + " abbr", + " a", + "acceptcharset", + "acceptCharset", + "accept_charset", + "h0", + "h1h2", + "h7", + "onClick", + "λ", + // The following string has the same hash (0xa1d7fab7) as "onmouseover". + "\x00\x00\x00\x00\x00\x50\x18\xae\x38\xd0\xb7", + } + for _, tc := range testCases { + got := Lookup([]byte(tc)) + if got != 0 { + t.Errorf("Lookup(%q): got %d, want 0", tc, got) + } + } +} + +func TestForeignObject(t *testing.T) { + const ( + afo = Foreignobject + afO = ForeignObject + sfo = "foreignobject" + sfO = "foreignObject" + ) + if got := Lookup([]byte(sfo)); got != afo { + t.Errorf("Lookup(%q): got %#v, want %#v", sfo, got, afo) + } + if got := Lookup([]byte(sfO)); got != afO { + t.Errorf("Lookup(%q): got %#v, want %#v", sfO, got, afO) + } + if got := afo.String(); got != sfo { + t.Errorf("Atom(%#v).String(): got %q, want %q", afo, got, sfo) + } + if got := afO.String(); got != sfO { + t.Errorf("Atom(%#v).String(): got %q, want %q", afO, got, sfO) + } +} + +func BenchmarkLookup(b *testing.B) { + sortedTable := make([]string, 0, len(table)) + for _, a := range table { + if a != 0 { + sortedTable = append(sortedTable, a.String()) + } + } + sort.Strings(sortedTable) + + x := make([][]byte, 1000) + for i := range x { + x[i] = []byte(sortedTable[i%len(sortedTable)]) + } + + b.ResetTimer() + for i := 0; i < b.N; i++ { + for _, s := range x { + Lookup(s) + } + } +} diff --git a/api/vendor/golang.org/x/net/html/atom/gen.go b/api/vendor/golang.org/x/net/html/atom/gen.go new file mode 100644 index 0000000..5d05278 --- /dev/null +++ b/api/vendor/golang.org/x/net/html/atom/gen.go @@ -0,0 +1,712 @@ +// 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. + +// +build ignore + +//go:generate go run gen.go +//go:generate go run gen.go -test + +package main + +import ( + "bytes" + "flag" + "fmt" + "go/format" + "io/ioutil" + "math/rand" + "os" + "sort" + "strings" +) + +// identifier converts s to a Go exported identifier. +// It converts "div" to "Div" and "accept-charset" to "AcceptCharset". +func identifier(s string) string { + b := make([]byte, 0, len(s)) + cap := true + for _, c := range s { + if c == '-' { + cap = true + continue + } + if cap && 'a' <= c && c <= 'z' { + c -= 'a' - 'A' + } + cap = false + b = append(b, byte(c)) + } + return string(b) +} + +var test = flag.Bool("test", false, "generate table_test.go") + +func genFile(name string, buf *bytes.Buffer) { + b, err := format.Source(buf.Bytes()) + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + if err := ioutil.WriteFile(name, b, 0644); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} + +func main() { + flag.Parse() + + var all []string + all = append(all, elements...) + all = append(all, attributes...) + all = append(all, eventHandlers...) + all = append(all, extra...) + sort.Strings(all) + + // uniq - lists have dups + w := 0 + for _, s := range all { + if w == 0 || all[w-1] != s { + all[w] = s + w++ + } + } + all = all[:w] + + if *test { + var buf bytes.Buffer + fmt.Fprintln(&buf, "// Code generated by go generate gen.go; DO NOT EDIT.\n") + fmt.Fprintln(&buf, "//go:generate go run gen.go -test\n") + fmt.Fprintln(&buf, "package atom\n") + fmt.Fprintln(&buf, "var testAtomList = []string{") + for _, s := range all { + fmt.Fprintf(&buf, "\t%q,\n", s) + } + fmt.Fprintln(&buf, "}") + + genFile("table_test.go", &buf) + return + } + + // Find hash that minimizes table size. + var best *table + for i := 0; i < 1000000; i++ { + if best != nil && 1<<(best.k-1) < len(all) { + break + } + h := rand.Uint32() + for k := uint(0); k <= 16; k++ { + if best != nil && k >= best.k { + break + } + var t table + if t.init(h, k, all) { + best = &t + break + } + } + } + if best == nil { + fmt.Fprintf(os.Stderr, "failed to construct string table\n") + os.Exit(1) + } + + // Lay out strings, using overlaps when possible. + layout := append([]string{}, all...) + + // Remove strings that are substrings of other strings + for changed := true; changed; { + changed = false + for i, s := range layout { + if s == "" { + continue + } + for j, t := range layout { + if i != j && t != "" && strings.Contains(s, t) { + changed = true + layout[j] = "" + } + } + } + } + + // Join strings where one suffix matches another prefix. + for { + // Find best i, j, k such that layout[i][len-k:] == layout[j][:k], + // maximizing overlap length k. + besti := -1 + bestj := -1 + bestk := 0 + for i, s := range layout { + if s == "" { + continue + } + for j, t := range layout { + if i == j { + continue + } + for k := bestk + 1; k <= len(s) && k <= len(t); k++ { + if s[len(s)-k:] == t[:k] { + besti = i + bestj = j + bestk = k + } + } + } + } + if bestk > 0 { + layout[besti] += layout[bestj][bestk:] + layout[bestj] = "" + continue + } + break + } + + text := strings.Join(layout, "") + + atom := map[string]uint32{} + for _, s := range all { + off := strings.Index(text, s) + if off < 0 { + panic("lost string " + s) + } + atom[s] = uint32(off<<8 | len(s)) + } + + var buf bytes.Buffer + // Generate the Go code. + fmt.Fprintln(&buf, "// Code generated by go generate gen.go; DO NOT EDIT.\n") + fmt.Fprintln(&buf, "//go:generate go run gen.go\n") + fmt.Fprintln(&buf, "package atom\n\nconst (") + + // compute max len + maxLen := 0 + for _, s := range all { + if maxLen < len(s) { + maxLen = len(s) + } + fmt.Fprintf(&buf, "\t%s Atom = %#x\n", identifier(s), atom[s]) + } + fmt.Fprintln(&buf, ")\n") + + fmt.Fprintf(&buf, "const hash0 = %#x\n\n", best.h0) + fmt.Fprintf(&buf, "const maxAtomLen = %d\n\n", maxLen) + + fmt.Fprintf(&buf, "var table = [1<<%d]Atom{\n", best.k) + for i, s := range best.tab { + if s == "" { + continue + } + fmt.Fprintf(&buf, "\t%#x: %#x, // %s\n", i, atom[s], s) + } + fmt.Fprintf(&buf, "}\n") + datasize := (1 << best.k) * 4 + + fmt.Fprintln(&buf, "const atomText =") + textsize := len(text) + for len(text) > 60 { + fmt.Fprintf(&buf, "\t%q +\n", text[:60]) + text = text[60:] + } + fmt.Fprintf(&buf, "\t%q\n\n", text) + + genFile("table.go", &buf) + + fmt.Fprintf(os.Stdout, "%d atoms; %d string bytes + %d tables = %d total data\n", len(all), textsize, datasize, textsize+datasize) +} + +type byLen []string + +func (x byLen) Less(i, j int) bool { return len(x[i]) > len(x[j]) } +func (x byLen) Swap(i, j int) { x[i], x[j] = x[j], x[i] } +func (x byLen) Len() int { return len(x) } + +// fnv computes the FNV hash with an arbitrary starting value h. +func fnv(h uint32, s string) uint32 { + for i := 0; i < len(s); i++ { + h ^= uint32(s[i]) + h *= 16777619 + } + return h +} + +// A table represents an attempt at constructing the lookup table. +// The lookup table uses cuckoo hashing, meaning that each string +// can be found in one of two positions. +type table struct { + h0 uint32 + k uint + mask uint32 + tab []string +} + +// hash returns the two hashes for s. +func (t *table) hash(s string) (h1, h2 uint32) { + h := fnv(t.h0, s) + h1 = h & t.mask + h2 = (h >> 16) & t.mask + return +} + +// init initializes the table with the given parameters. +// h0 is the initial hash value, +// k is the number of bits of hash value to use, and +// x is the list of strings to store in the table. +// init returns false if the table cannot be constructed. +func (t *table) init(h0 uint32, k uint, x []string) bool { + t.h0 = h0 + t.k = k + t.tab = make([]string, 1< len(t.tab) { + return false + } + s := t.tab[i] + h1, h2 := t.hash(s) + j := h1 + h2 - i + if t.tab[j] != "" && !t.push(j, depth+1) { + return false + } + t.tab[j] = s + return true +} + +// The lists of element names and attribute keys were taken from +// https://html.spec.whatwg.org/multipage/indices.html#index +// as of the "HTML Living Standard - Last Updated 16 April 2018" version. + +// "command", "keygen" and "menuitem" have been removed from the spec, +// but are kept here for backwards compatibility. +var elements = []string{ + "a", + "abbr", + "address", + "area", + "article", + "aside", + "audio", + "b", + "base", + "bdi", + "bdo", + "blockquote", + "body", + "br", + "button", + "canvas", + "caption", + "cite", + "code", + "col", + "colgroup", + "command", + "data", + "datalist", + "dd", + "del", + "details", + "dfn", + "dialog", + "div", + "dl", + "dt", + "em", + "embed", + "fieldset", + "figcaption", + "figure", + "footer", + "form", + "h1", + "h2", + "h3", + "h4", + "h5", + "h6", + "head", + "header", + "hgroup", + "hr", + "html", + "i", + "iframe", + "img", + "input", + "ins", + "kbd", + "keygen", + "label", + "legend", + "li", + "link", + "main", + "map", + "mark", + "menu", + "menuitem", + "meta", + "meter", + "nav", + "noscript", + "object", + "ol", + "optgroup", + "option", + "output", + "p", + "param", + "picture", + "pre", + "progress", + "q", + "rp", + "rt", + "ruby", + "s", + "samp", + "script", + "section", + "select", + "slot", + "small", + "source", + "span", + "strong", + "style", + "sub", + "summary", + "sup", + "table", + "tbody", + "td", + "template", + "textarea", + "tfoot", + "th", + "thead", + "time", + "title", + "tr", + "track", + "u", + "ul", + "var", + "video", + "wbr", +} + +// https://html.spec.whatwg.org/multipage/indices.html#attributes-3 +// +// "challenge", "command", "contextmenu", "dropzone", "icon", "keytype", "mediagroup", +// "radiogroup", "spellcheck", "scoped", "seamless", "sortable" and "sorted" have been removed from the spec, +// but are kept here for backwards compatibility. +var attributes = []string{ + "abbr", + "accept", + "accept-charset", + "accesskey", + "action", + "allowfullscreen", + "allowpaymentrequest", + "allowusermedia", + "alt", + "as", + "async", + "autocomplete", + "autofocus", + "autoplay", + "challenge", + "charset", + "checked", + "cite", + "class", + "color", + "cols", + "colspan", + "command", + "content", + "contenteditable", + "contextmenu", + "controls", + "coords", + "crossorigin", + "data", + "datetime", + "default", + "defer", + "dir", + "dirname", + "disabled", + "download", + "draggable", + "dropzone", + "enctype", + "for", + "form", + "formaction", + "formenctype", + "formmethod", + "formnovalidate", + "formtarget", + "headers", + "height", + "hidden", + "high", + "href", + "hreflang", + "http-equiv", + "icon", + "id", + "inputmode", + "integrity", + "is", + "ismap", + "itemid", + "itemprop", + "itemref", + "itemscope", + "itemtype", + "keytype", + "kind", + "label", + "lang", + "list", + "loop", + "low", + "manifest", + "max", + "maxlength", + "media", + "mediagroup", + "method", + "min", + "minlength", + "multiple", + "muted", + "name", + "nomodule", + "nonce", + "novalidate", + "open", + "optimum", + "pattern", + "ping", + "placeholder", + "playsinline", + "poster", + "preload", + "radiogroup", + "readonly", + "referrerpolicy", + "rel", + "required", + "reversed", + "rows", + "rowspan", + "sandbox", + "spellcheck", + "scope", + "scoped", + "seamless", + "selected", + "shape", + "size", + "sizes", + "sortable", + "sorted", + "slot", + "span", + "spellcheck", + "src", + "srcdoc", + "srclang", + "srcset", + "start", + "step", + "style", + "tabindex", + "target", + "title", + "translate", + "type", + "typemustmatch", + "updateviacache", + "usemap", + "value", + "width", + "workertype", + "wrap", +} + +// "onautocomplete", "onautocompleteerror", "onmousewheel", +// "onshow" and "onsort" have been removed from the spec, +// but are kept here for backwards compatibility. +var eventHandlers = []string{ + "onabort", + "onautocomplete", + "onautocompleteerror", + "onauxclick", + "onafterprint", + "onbeforeprint", + "onbeforeunload", + "onblur", + "oncancel", + "oncanplay", + "oncanplaythrough", + "onchange", + "onclick", + "onclose", + "oncontextmenu", + "oncopy", + "oncuechange", + "oncut", + "ondblclick", + "ondrag", + "ondragend", + "ondragenter", + "ondragexit", + "ondragleave", + "ondragover", + "ondragstart", + "ondrop", + "ondurationchange", + "onemptied", + "onended", + "onerror", + "onfocus", + "onhashchange", + "oninput", + "oninvalid", + "onkeydown", + "onkeypress", + "onkeyup", + "onlanguagechange", + "onload", + "onloadeddata", + "onloadedmetadata", + "onloadend", + "onloadstart", + "onmessage", + "onmessageerror", + "onmousedown", + "onmouseenter", + "onmouseleave", + "onmousemove", + "onmouseout", + "onmouseover", + "onmouseup", + "onmousewheel", + "onwheel", + "onoffline", + "ononline", + "onpagehide", + "onpageshow", + "onpaste", + "onpause", + "onplay", + "onplaying", + "onpopstate", + "onprogress", + "onratechange", + "onreset", + "onresize", + "onrejectionhandled", + "onscroll", + "onsecuritypolicyviolation", + "onseeked", + "onseeking", + "onselect", + "onshow", + "onsort", + "onstalled", + "onstorage", + "onsubmit", + "onsuspend", + "ontimeupdate", + "ontoggle", + "onunhandledrejection", + "onunload", + "onvolumechange", + "onwaiting", +} + +// extra are ad-hoc values not covered by any of the lists above. +var extra = []string{ + "acronym", + "align", + "annotation", + "annotation-xml", + "applet", + "basefont", + "bgsound", + "big", + "blink", + "center", + "color", + "desc", + "face", + "font", + "foreignObject", // HTML is case-insensitive, but SVG-embedded-in-HTML is case-sensitive. + "foreignobject", + "frame", + "frameset", + "image", + "isindex", + "listing", + "malignmark", + "marquee", + "math", + "mglyph", + "mi", + "mn", + "mo", + "ms", + "mtext", + "nobr", + "noembed", + "noframes", + "plaintext", + "prompt", + "public", + "rb", + "rtc", + "spacer", + "strike", + "svg", + "system", + "tt", + "xmp", +} diff --git a/api/vendor/golang.org/x/net/html/atom/table.go b/api/vendor/golang.org/x/net/html/atom/table.go new file mode 100644 index 0000000..2a93886 --- /dev/null +++ b/api/vendor/golang.org/x/net/html/atom/table.go @@ -0,0 +1,783 @@ +// Code generated by go generate gen.go; DO NOT EDIT. + +//go:generate go run gen.go + +package atom + +const ( + A Atom = 0x1 + Abbr Atom = 0x4 + Accept Atom = 0x1a06 + AcceptCharset Atom = 0x1a0e + Accesskey Atom = 0x2c09 + Acronym Atom = 0xaa07 + Action Atom = 0x27206 + Address Atom = 0x6f307 + Align Atom = 0xb105 + Allowfullscreen Atom = 0x2080f + Allowpaymentrequest Atom = 0xc113 + Allowusermedia Atom = 0xdd0e + Alt Atom = 0xf303 + Annotation Atom = 0x1c90a + AnnotationXml Atom = 0x1c90e + Applet Atom = 0x31906 + Area Atom = 0x35604 + Article Atom = 0x3fc07 + As Atom = 0x3c02 + Aside Atom = 0x10705 + Async Atom = 0xff05 + Audio Atom = 0x11505 + Autocomplete Atom = 0x2780c + Autofocus Atom = 0x12109 + Autoplay Atom = 0x13c08 + B Atom = 0x101 + Base Atom = 0x3b04 + Basefont Atom = 0x3b08 + Bdi Atom = 0xba03 + Bdo Atom = 0x14b03 + Bgsound Atom = 0x15e07 + Big Atom = 0x17003 + Blink Atom = 0x17305 + Blockquote Atom = 0x1870a + Body Atom = 0x2804 + Br Atom = 0x202 + Button Atom = 0x19106 + Canvas Atom = 0x10306 + Caption Atom = 0x23107 + Center Atom = 0x22006 + Challenge Atom = 0x29b09 + Charset Atom = 0x2107 + Checked Atom = 0x47907 + Cite Atom = 0x19c04 + Class Atom = 0x56405 + Code Atom = 0x5c504 + Col Atom = 0x1ab03 + Colgroup Atom = 0x1ab08 + Color Atom = 0x1bf05 + Cols Atom = 0x1c404 + Colspan Atom = 0x1c407 + Command Atom = 0x1d707 + Content Atom = 0x58b07 + Contenteditable Atom = 0x58b0f + Contextmenu Atom = 0x3800b + Controls Atom = 0x1de08 + Coords Atom = 0x1ea06 + Crossorigin Atom = 0x1fb0b + Data Atom = 0x4a504 + Datalist Atom = 0x4a508 + Datetime Atom = 0x2b808 + Dd Atom = 0x2d702 + Default Atom = 0x10a07 + Defer Atom = 0x5c705 + Del Atom = 0x45203 + Desc Atom = 0x56104 + Details Atom = 0x7207 + Dfn Atom = 0x8703 + Dialog Atom = 0xbb06 + Dir Atom = 0x9303 + Dirname Atom = 0x9307 + Disabled Atom = 0x16408 + Div Atom = 0x16b03 + Dl Atom = 0x5e602 + Download Atom = 0x46308 + Draggable Atom = 0x17a09 + Dropzone Atom = 0x40508 + Dt Atom = 0x64b02 + Em Atom = 0x6e02 + Embed Atom = 0x6e05 + Enctype Atom = 0x28d07 + Face Atom = 0x21e04 + Fieldset Atom = 0x22608 + Figcaption Atom = 0x22e0a + Figure Atom = 0x24806 + Font Atom = 0x3f04 + Footer Atom = 0xf606 + For Atom = 0x25403 + ForeignObject Atom = 0x2540d + Foreignobject Atom = 0x2610d + Form Atom = 0x26e04 + Formaction Atom = 0x26e0a + Formenctype Atom = 0x2890b + Formmethod Atom = 0x2a40a + Formnovalidate Atom = 0x2ae0e + Formtarget Atom = 0x2c00a + Frame Atom = 0x8b05 + Frameset Atom = 0x8b08 + H1 Atom = 0x15c02 + H2 Atom = 0x2de02 + H3 Atom = 0x30d02 + H4 Atom = 0x34502 + H5 Atom = 0x34f02 + H6 Atom = 0x64d02 + Head Atom = 0x33104 + Header Atom = 0x33106 + Headers Atom = 0x33107 + Height Atom = 0x5206 + Hgroup Atom = 0x2ca06 + Hidden Atom = 0x2d506 + High Atom = 0x2db04 + Hr Atom = 0x15702 + Href Atom = 0x2e004 + Hreflang Atom = 0x2e008 + Html Atom = 0x5604 + HttpEquiv Atom = 0x2e80a + I Atom = 0x601 + Icon Atom = 0x58a04 + Id Atom = 0x10902 + Iframe Atom = 0x2fc06 + Image Atom = 0x30205 + Img Atom = 0x30703 + Input Atom = 0x44b05 + Inputmode Atom = 0x44b09 + Ins Atom = 0x20403 + Integrity Atom = 0x23f09 + Is Atom = 0x16502 + Isindex Atom = 0x30f07 + Ismap Atom = 0x31605 + Itemid Atom = 0x38b06 + Itemprop Atom = 0x19d08 + Itemref Atom = 0x3cd07 + Itemscope Atom = 0x67109 + Itemtype Atom = 0x31f08 + Kbd Atom = 0xb903 + Keygen Atom = 0x3206 + Keytype Atom = 0xd607 + Kind Atom = 0x17704 + Label Atom = 0x5905 + Lang Atom = 0x2e404 + Legend Atom = 0x18106 + Li Atom = 0xb202 + Link Atom = 0x17404 + List Atom = 0x4a904 + Listing Atom = 0x4a907 + Loop Atom = 0x5d04 + Low Atom = 0xc303 + Main Atom = 0x1004 + Malignmark Atom = 0xb00a + Manifest Atom = 0x6d708 + Map Atom = 0x31803 + Mark Atom = 0xb604 + Marquee Atom = 0x32707 + Math Atom = 0x32e04 + Max Atom = 0x33d03 + Maxlength Atom = 0x33d09 + Media Atom = 0xe605 + Mediagroup Atom = 0xe60a + Menu Atom = 0x38704 + Menuitem Atom = 0x38708 + Meta Atom = 0x4b804 + Meter Atom = 0x9805 + Method Atom = 0x2a806 + Mglyph Atom = 0x30806 + Mi Atom = 0x34702 + Min Atom = 0x34703 + Minlength Atom = 0x34709 + Mn Atom = 0x2b102 + Mo Atom = 0xa402 + Ms Atom = 0x67402 + Mtext Atom = 0x35105 + Multiple Atom = 0x35f08 + Muted Atom = 0x36705 + Name Atom = 0x9604 + Nav Atom = 0x1303 + Nobr Atom = 0x3704 + Noembed Atom = 0x6c07 + Noframes Atom = 0x8908 + Nomodule Atom = 0xa208 + Nonce Atom = 0x1a605 + Noscript Atom = 0x21608 + Novalidate Atom = 0x2b20a + Object Atom = 0x26806 + Ol Atom = 0x13702 + Onabort Atom = 0x19507 + Onafterprint Atom = 0x2360c + Onautocomplete Atom = 0x2760e + Onautocompleteerror Atom = 0x27613 + Onauxclick Atom = 0x61f0a + Onbeforeprint Atom = 0x69e0d + Onbeforeunload Atom = 0x6e70e + Onblur Atom = 0x56d06 + Oncancel Atom = 0x11908 + Oncanplay Atom = 0x14d09 + Oncanplaythrough Atom = 0x14d10 + Onchange Atom = 0x41b08 + Onclick Atom = 0x2f507 + Onclose Atom = 0x36c07 + Oncontextmenu Atom = 0x37e0d + Oncopy Atom = 0x39106 + Oncuechange Atom = 0x3970b + Oncut Atom = 0x3a205 + Ondblclick Atom = 0x3a70a + Ondrag Atom = 0x3b106 + Ondragend Atom = 0x3b109 + Ondragenter Atom = 0x3ba0b + Ondragexit Atom = 0x3c50a + Ondragleave Atom = 0x3df0b + Ondragover Atom = 0x3ea0a + Ondragstart Atom = 0x3f40b + Ondrop Atom = 0x40306 + Ondurationchange Atom = 0x41310 + Onemptied Atom = 0x40a09 + Onended Atom = 0x42307 + Onerror Atom = 0x42a07 + Onfocus Atom = 0x43107 + Onhashchange Atom = 0x43d0c + Oninput Atom = 0x44907 + Oninvalid Atom = 0x45509 + Onkeydown Atom = 0x45e09 + Onkeypress Atom = 0x46b0a + Onkeyup Atom = 0x48007 + Onlanguagechange Atom = 0x48d10 + Onload Atom = 0x49d06 + Onloadeddata Atom = 0x49d0c + Onloadedmetadata Atom = 0x4b010 + Onloadend Atom = 0x4c609 + Onloadstart Atom = 0x4cf0b + Onmessage Atom = 0x4da09 + Onmessageerror Atom = 0x4da0e + Onmousedown Atom = 0x4e80b + Onmouseenter Atom = 0x4f30c + Onmouseleave Atom = 0x4ff0c + Onmousemove Atom = 0x50b0b + Onmouseout Atom = 0x5160a + Onmouseover Atom = 0x5230b + Onmouseup Atom = 0x52e09 + Onmousewheel Atom = 0x53c0c + Onoffline Atom = 0x54809 + Ononline Atom = 0x55108 + Onpagehide Atom = 0x5590a + Onpageshow Atom = 0x5730a + Onpaste Atom = 0x57f07 + Onpause Atom = 0x59a07 + Onplay Atom = 0x5a406 + Onplaying Atom = 0x5a409 + Onpopstate Atom = 0x5ad0a + Onprogress Atom = 0x5b70a + Onratechange Atom = 0x5cc0c + Onrejectionhandled Atom = 0x5d812 + Onreset Atom = 0x5ea07 + Onresize Atom = 0x5f108 + Onscroll Atom = 0x60008 + Onsecuritypolicyviolation Atom = 0x60819 + Onseeked Atom = 0x62908 + Onseeking Atom = 0x63109 + Onselect Atom = 0x63a08 + Onshow Atom = 0x64406 + Onsort Atom = 0x64f06 + Onstalled Atom = 0x65909 + Onstorage Atom = 0x66209 + Onsubmit Atom = 0x66b08 + Onsuspend Atom = 0x67b09 + Ontimeupdate Atom = 0x400c + Ontoggle Atom = 0x68408 + Onunhandledrejection Atom = 0x68c14 + Onunload Atom = 0x6ab08 + Onvolumechange Atom = 0x6b30e + Onwaiting Atom = 0x6c109 + Onwheel Atom = 0x6ca07 + Open Atom = 0x1a304 + Optgroup Atom = 0x5f08 + Optimum Atom = 0x6d107 + Option Atom = 0x6e306 + Output Atom = 0x51d06 + P Atom = 0xc01 + Param Atom = 0xc05 + Pattern Atom = 0x6607 + Picture Atom = 0x7b07 + Ping Atom = 0xef04 + Placeholder Atom = 0x1310b + Plaintext Atom = 0x1b209 + Playsinline Atom = 0x1400b + Poster Atom = 0x2cf06 + Pre Atom = 0x47003 + Preload Atom = 0x48607 + Progress Atom = 0x5b908 + Prompt Atom = 0x53606 + Public Atom = 0x58606 + Q Atom = 0xcf01 + Radiogroup Atom = 0x30a + Rb Atom = 0x3a02 + Readonly Atom = 0x35708 + Referrerpolicy Atom = 0x3d10e + Rel Atom = 0x48703 + Required Atom = 0x24c08 + Reversed Atom = 0x8008 + Rows Atom = 0x9c04 + Rowspan Atom = 0x9c07 + Rp Atom = 0x23c02 + Rt Atom = 0x19a02 + Rtc Atom = 0x19a03 + Ruby Atom = 0xfb04 + S Atom = 0x2501 + Samp Atom = 0x7804 + Sandbox Atom = 0x12907 + Scope Atom = 0x67505 + Scoped Atom = 0x67506 + Script Atom = 0x21806 + Seamless Atom = 0x37108 + Section Atom = 0x56807 + Select Atom = 0x63c06 + Selected Atom = 0x63c08 + Shape Atom = 0x1e505 + Size Atom = 0x5f504 + Sizes Atom = 0x5f505 + Slot Atom = 0x1ef04 + Small Atom = 0x20605 + Sortable Atom = 0x65108 + Sorted Atom = 0x33706 + Source Atom = 0x37806 + Spacer Atom = 0x43706 + Span Atom = 0x9f04 + Spellcheck Atom = 0x4740a + Src Atom = 0x5c003 + Srcdoc Atom = 0x5c006 + Srclang Atom = 0x5f907 + Srcset Atom = 0x6f906 + Start Atom = 0x3fa05 + Step Atom = 0x58304 + Strike Atom = 0xd206 + Strong Atom = 0x6dd06 + Style Atom = 0x6ff05 + Sub Atom = 0x66d03 + Summary Atom = 0x70407 + Sup Atom = 0x70b03 + Svg Atom = 0x70e03 + System Atom = 0x71106 + Tabindex Atom = 0x4be08 + Table Atom = 0x59505 + Target Atom = 0x2c406 + Tbody Atom = 0x2705 + Td Atom = 0x9202 + Template Atom = 0x71408 + Textarea Atom = 0x35208 + Tfoot Atom = 0xf505 + Th Atom = 0x15602 + Thead Atom = 0x33005 + Time Atom = 0x4204 + Title Atom = 0x11005 + Tr Atom = 0xcc02 + Track Atom = 0x1ba05 + Translate Atom = 0x1f209 + Tt Atom = 0x6802 + Type Atom = 0xd904 + Typemustmatch Atom = 0x2900d + U Atom = 0xb01 + Ul Atom = 0xa702 + Updateviacache Atom = 0x460e + Usemap Atom = 0x59e06 + Value Atom = 0x1505 + Var Atom = 0x16d03 + Video Atom = 0x2f105 + Wbr Atom = 0x57c03 + Width Atom = 0x64905 + Workertype Atom = 0x71c0a + Wrap Atom = 0x72604 + Xmp Atom = 0x12f03 +) + +const hash0 = 0x81cdf10e + +const maxAtomLen = 25 + +var table = [1 << 9]Atom{ + 0x1: 0xe60a, // mediagroup + 0x2: 0x2e404, // lang + 0x4: 0x2c09, // accesskey + 0x5: 0x8b08, // frameset + 0x7: 0x63a08, // onselect + 0x8: 0x71106, // system + 0xa: 0x64905, // width + 0xc: 0x2890b, // formenctype + 0xd: 0x13702, // ol + 0xe: 0x3970b, // oncuechange + 0x10: 0x14b03, // bdo + 0x11: 0x11505, // audio + 0x12: 0x17a09, // draggable + 0x14: 0x2f105, // video + 0x15: 0x2b102, // mn + 0x16: 0x38704, // menu + 0x17: 0x2cf06, // poster + 0x19: 0xf606, // footer + 0x1a: 0x2a806, // method + 0x1b: 0x2b808, // datetime + 0x1c: 0x19507, // onabort + 0x1d: 0x460e, // updateviacache + 0x1e: 0xff05, // async + 0x1f: 0x49d06, // onload + 0x21: 0x11908, // oncancel + 0x22: 0x62908, // onseeked + 0x23: 0x30205, // image + 0x24: 0x5d812, // onrejectionhandled + 0x26: 0x17404, // link + 0x27: 0x51d06, // output + 0x28: 0x33104, // head + 0x29: 0x4ff0c, // onmouseleave + 0x2a: 0x57f07, // onpaste + 0x2b: 0x5a409, // onplaying + 0x2c: 0x1c407, // colspan + 0x2f: 0x1bf05, // color + 0x30: 0x5f504, // size + 0x31: 0x2e80a, // http-equiv + 0x33: 0x601, // i + 0x34: 0x5590a, // onpagehide + 0x35: 0x68c14, // onunhandledrejection + 0x37: 0x42a07, // onerror + 0x3a: 0x3b08, // basefont + 0x3f: 0x1303, // nav + 0x40: 0x17704, // kind + 0x41: 0x35708, // readonly + 0x42: 0x30806, // mglyph + 0x44: 0xb202, // li + 0x46: 0x2d506, // hidden + 0x47: 0x70e03, // svg + 0x48: 0x58304, // step + 0x49: 0x23f09, // integrity + 0x4a: 0x58606, // public + 0x4c: 0x1ab03, // col + 0x4d: 0x1870a, // blockquote + 0x4e: 0x34f02, // h5 + 0x50: 0x5b908, // progress + 0x51: 0x5f505, // sizes + 0x52: 0x34502, // h4 + 0x56: 0x33005, // thead + 0x57: 0xd607, // keytype + 0x58: 0x5b70a, // onprogress + 0x59: 0x44b09, // inputmode + 0x5a: 0x3b109, // ondragend + 0x5d: 0x3a205, // oncut + 0x5e: 0x43706, // spacer + 0x5f: 0x1ab08, // colgroup + 0x62: 0x16502, // is + 0x65: 0x3c02, // as + 0x66: 0x54809, // onoffline + 0x67: 0x33706, // sorted + 0x69: 0x48d10, // onlanguagechange + 0x6c: 0x43d0c, // onhashchange + 0x6d: 0x9604, // name + 0x6e: 0xf505, // tfoot + 0x6f: 0x56104, // desc + 0x70: 0x33d03, // max + 0x72: 0x1ea06, // coords + 0x73: 0x30d02, // h3 + 0x74: 0x6e70e, // onbeforeunload + 0x75: 0x9c04, // rows + 0x76: 0x63c06, // select + 0x77: 0x9805, // meter + 0x78: 0x38b06, // itemid + 0x79: 0x53c0c, // onmousewheel + 0x7a: 0x5c006, // srcdoc + 0x7d: 0x1ba05, // track + 0x7f: 0x31f08, // itemtype + 0x82: 0xa402, // mo + 0x83: 0x41b08, // onchange + 0x84: 0x33107, // headers + 0x85: 0x5cc0c, // onratechange + 0x86: 0x60819, // onsecuritypolicyviolation + 0x88: 0x4a508, // datalist + 0x89: 0x4e80b, // onmousedown + 0x8a: 0x1ef04, // slot + 0x8b: 0x4b010, // onloadedmetadata + 0x8c: 0x1a06, // accept + 0x8d: 0x26806, // object + 0x91: 0x6b30e, // onvolumechange + 0x92: 0x2107, // charset + 0x93: 0x27613, // onautocompleteerror + 0x94: 0xc113, // allowpaymentrequest + 0x95: 0x2804, // body + 0x96: 0x10a07, // default + 0x97: 0x63c08, // selected + 0x98: 0x21e04, // face + 0x99: 0x1e505, // shape + 0x9b: 0x68408, // ontoggle + 0x9e: 0x64b02, // dt + 0x9f: 0xb604, // mark + 0xa1: 0xb01, // u + 0xa4: 0x6ab08, // onunload + 0xa5: 0x5d04, // loop + 0xa6: 0x16408, // disabled + 0xaa: 0x42307, // onended + 0xab: 0xb00a, // malignmark + 0xad: 0x67b09, // onsuspend + 0xae: 0x35105, // mtext + 0xaf: 0x64f06, // onsort + 0xb0: 0x19d08, // itemprop + 0xb3: 0x67109, // itemscope + 0xb4: 0x17305, // blink + 0xb6: 0x3b106, // ondrag + 0xb7: 0xa702, // ul + 0xb8: 0x26e04, // form + 0xb9: 0x12907, // sandbox + 0xba: 0x8b05, // frame + 0xbb: 0x1505, // value + 0xbc: 0x66209, // onstorage + 0xbf: 0xaa07, // acronym + 0xc0: 0x19a02, // rt + 0xc2: 0x202, // br + 0xc3: 0x22608, // fieldset + 0xc4: 0x2900d, // typemustmatch + 0xc5: 0xa208, // nomodule + 0xc6: 0x6c07, // noembed + 0xc7: 0x69e0d, // onbeforeprint + 0xc8: 0x19106, // button + 0xc9: 0x2f507, // onclick + 0xca: 0x70407, // summary + 0xcd: 0xfb04, // ruby + 0xce: 0x56405, // class + 0xcf: 0x3f40b, // ondragstart + 0xd0: 0x23107, // caption + 0xd4: 0xdd0e, // allowusermedia + 0xd5: 0x4cf0b, // onloadstart + 0xd9: 0x16b03, // div + 0xda: 0x4a904, // list + 0xdb: 0x32e04, // math + 0xdc: 0x44b05, // input + 0xdf: 0x3ea0a, // ondragover + 0xe0: 0x2de02, // h2 + 0xe2: 0x1b209, // plaintext + 0xe4: 0x4f30c, // onmouseenter + 0xe7: 0x47907, // checked + 0xe8: 0x47003, // pre + 0xea: 0x35f08, // multiple + 0xeb: 0xba03, // bdi + 0xec: 0x33d09, // maxlength + 0xed: 0xcf01, // q + 0xee: 0x61f0a, // onauxclick + 0xf0: 0x57c03, // wbr + 0xf2: 0x3b04, // base + 0xf3: 0x6e306, // option + 0xf5: 0x41310, // ondurationchange + 0xf7: 0x8908, // noframes + 0xf9: 0x40508, // dropzone + 0xfb: 0x67505, // scope + 0xfc: 0x8008, // reversed + 0xfd: 0x3ba0b, // ondragenter + 0xfe: 0x3fa05, // start + 0xff: 0x12f03, // xmp + 0x100: 0x5f907, // srclang + 0x101: 0x30703, // img + 0x104: 0x101, // b + 0x105: 0x25403, // for + 0x106: 0x10705, // aside + 0x107: 0x44907, // oninput + 0x108: 0x35604, // area + 0x109: 0x2a40a, // formmethod + 0x10a: 0x72604, // wrap + 0x10c: 0x23c02, // rp + 0x10d: 0x46b0a, // onkeypress + 0x10e: 0x6802, // tt + 0x110: 0x34702, // mi + 0x111: 0x36705, // muted + 0x112: 0xf303, // alt + 0x113: 0x5c504, // code + 0x114: 0x6e02, // em + 0x115: 0x3c50a, // ondragexit + 0x117: 0x9f04, // span + 0x119: 0x6d708, // manifest + 0x11a: 0x38708, // menuitem + 0x11b: 0x58b07, // content + 0x11d: 0x6c109, // onwaiting + 0x11f: 0x4c609, // onloadend + 0x121: 0x37e0d, // oncontextmenu + 0x123: 0x56d06, // onblur + 0x124: 0x3fc07, // article + 0x125: 0x9303, // dir + 0x126: 0xef04, // ping + 0x127: 0x24c08, // required + 0x128: 0x45509, // oninvalid + 0x129: 0xb105, // align + 0x12b: 0x58a04, // icon + 0x12c: 0x64d02, // h6 + 0x12d: 0x1c404, // cols + 0x12e: 0x22e0a, // figcaption + 0x12f: 0x45e09, // onkeydown + 0x130: 0x66b08, // onsubmit + 0x131: 0x14d09, // oncanplay + 0x132: 0x70b03, // sup + 0x133: 0xc01, // p + 0x135: 0x40a09, // onemptied + 0x136: 0x39106, // oncopy + 0x137: 0x19c04, // cite + 0x138: 0x3a70a, // ondblclick + 0x13a: 0x50b0b, // onmousemove + 0x13c: 0x66d03, // sub + 0x13d: 0x48703, // rel + 0x13e: 0x5f08, // optgroup + 0x142: 0x9c07, // rowspan + 0x143: 0x37806, // source + 0x144: 0x21608, // noscript + 0x145: 0x1a304, // open + 0x146: 0x20403, // ins + 0x147: 0x2540d, // foreignObject + 0x148: 0x5ad0a, // onpopstate + 0x14a: 0x28d07, // enctype + 0x14b: 0x2760e, // onautocomplete + 0x14c: 0x35208, // textarea + 0x14e: 0x2780c, // autocomplete + 0x14f: 0x15702, // hr + 0x150: 0x1de08, // controls + 0x151: 0x10902, // id + 0x153: 0x2360c, // onafterprint + 0x155: 0x2610d, // foreignobject + 0x156: 0x32707, // marquee + 0x157: 0x59a07, // onpause + 0x158: 0x5e602, // dl + 0x159: 0x5206, // height + 0x15a: 0x34703, // min + 0x15b: 0x9307, // dirname + 0x15c: 0x1f209, // translate + 0x15d: 0x5604, // html + 0x15e: 0x34709, // minlength + 0x15f: 0x48607, // preload + 0x160: 0x71408, // template + 0x161: 0x3df0b, // ondragleave + 0x162: 0x3a02, // rb + 0x164: 0x5c003, // src + 0x165: 0x6dd06, // strong + 0x167: 0x7804, // samp + 0x168: 0x6f307, // address + 0x169: 0x55108, // ononline + 0x16b: 0x1310b, // placeholder + 0x16c: 0x2c406, // target + 0x16d: 0x20605, // small + 0x16e: 0x6ca07, // onwheel + 0x16f: 0x1c90a, // annotation + 0x170: 0x4740a, // spellcheck + 0x171: 0x7207, // details + 0x172: 0x10306, // canvas + 0x173: 0x12109, // autofocus + 0x174: 0xc05, // param + 0x176: 0x46308, // download + 0x177: 0x45203, // del + 0x178: 0x36c07, // onclose + 0x179: 0xb903, // kbd + 0x17a: 0x31906, // applet + 0x17b: 0x2e004, // href + 0x17c: 0x5f108, // onresize + 0x17e: 0x49d0c, // onloadeddata + 0x180: 0xcc02, // tr + 0x181: 0x2c00a, // formtarget + 0x182: 0x11005, // title + 0x183: 0x6ff05, // style + 0x184: 0xd206, // strike + 0x185: 0x59e06, // usemap + 0x186: 0x2fc06, // iframe + 0x187: 0x1004, // main + 0x189: 0x7b07, // picture + 0x18c: 0x31605, // ismap + 0x18e: 0x4a504, // data + 0x18f: 0x5905, // label + 0x191: 0x3d10e, // referrerpolicy + 0x192: 0x15602, // th + 0x194: 0x53606, // prompt + 0x195: 0x56807, // section + 0x197: 0x6d107, // optimum + 0x198: 0x2db04, // high + 0x199: 0x15c02, // h1 + 0x19a: 0x65909, // onstalled + 0x19b: 0x16d03, // var + 0x19c: 0x4204, // time + 0x19e: 0x67402, // ms + 0x19f: 0x33106, // header + 0x1a0: 0x4da09, // onmessage + 0x1a1: 0x1a605, // nonce + 0x1a2: 0x26e0a, // formaction + 0x1a3: 0x22006, // center + 0x1a4: 0x3704, // nobr + 0x1a5: 0x59505, // table + 0x1a6: 0x4a907, // listing + 0x1a7: 0x18106, // legend + 0x1a9: 0x29b09, // challenge + 0x1aa: 0x24806, // figure + 0x1ab: 0xe605, // media + 0x1ae: 0xd904, // type + 0x1af: 0x3f04, // font + 0x1b0: 0x4da0e, // onmessageerror + 0x1b1: 0x37108, // seamless + 0x1b2: 0x8703, // dfn + 0x1b3: 0x5c705, // defer + 0x1b4: 0xc303, // low + 0x1b5: 0x19a03, // rtc + 0x1b6: 0x5230b, // onmouseover + 0x1b7: 0x2b20a, // novalidate + 0x1b8: 0x71c0a, // workertype + 0x1ba: 0x3cd07, // itemref + 0x1bd: 0x1, // a + 0x1be: 0x31803, // map + 0x1bf: 0x400c, // ontimeupdate + 0x1c0: 0x15e07, // bgsound + 0x1c1: 0x3206, // keygen + 0x1c2: 0x2705, // tbody + 0x1c5: 0x64406, // onshow + 0x1c7: 0x2501, // s + 0x1c8: 0x6607, // pattern + 0x1cc: 0x14d10, // oncanplaythrough + 0x1ce: 0x2d702, // dd + 0x1cf: 0x6f906, // srcset + 0x1d0: 0x17003, // big + 0x1d2: 0x65108, // sortable + 0x1d3: 0x48007, // onkeyup + 0x1d5: 0x5a406, // onplay + 0x1d7: 0x4b804, // meta + 0x1d8: 0x40306, // ondrop + 0x1da: 0x60008, // onscroll + 0x1db: 0x1fb0b, // crossorigin + 0x1dc: 0x5730a, // onpageshow + 0x1dd: 0x4, // abbr + 0x1de: 0x9202, // td + 0x1df: 0x58b0f, // contenteditable + 0x1e0: 0x27206, // action + 0x1e1: 0x1400b, // playsinline + 0x1e2: 0x43107, // onfocus + 0x1e3: 0x2e008, // hreflang + 0x1e5: 0x5160a, // onmouseout + 0x1e6: 0x5ea07, // onreset + 0x1e7: 0x13c08, // autoplay + 0x1e8: 0x63109, // onseeking + 0x1ea: 0x67506, // scoped + 0x1ec: 0x30a, // radiogroup + 0x1ee: 0x3800b, // contextmenu + 0x1ef: 0x52e09, // onmouseup + 0x1f1: 0x2ca06, // hgroup + 0x1f2: 0x2080f, // allowfullscreen + 0x1f3: 0x4be08, // tabindex + 0x1f6: 0x30f07, // isindex + 0x1f7: 0x1a0e, // accept-charset + 0x1f8: 0x2ae0e, // formnovalidate + 0x1fb: 0x1c90e, // annotation-xml + 0x1fc: 0x6e05, // embed + 0x1fd: 0x21806, // script + 0x1fe: 0xbb06, // dialog + 0x1ff: 0x1d707, // command +} + +const atomText = "abbradiogrouparamainavalueaccept-charsetbodyaccesskeygenobrb" + + "asefontimeupdateviacacheightmlabelooptgroupatternoembedetail" + + "sampictureversedfnoframesetdirnameterowspanomoduleacronymali" + + "gnmarkbdialogallowpaymentrequestrikeytypeallowusermediagroup" + + "ingaltfooterubyasyncanvasidefaultitleaudioncancelautofocusan" + + "dboxmplaceholderautoplaysinlinebdoncanplaythrough1bgsoundisa" + + "bledivarbigblinkindraggablegendblockquotebuttonabortcitempro" + + "penoncecolgrouplaintextrackcolorcolspannotation-xmlcommandco" + + "ntrolshapecoordslotranslatecrossoriginsmallowfullscreenoscri" + + "ptfacenterfieldsetfigcaptionafterprintegrityfigurequiredfore" + + "ignObjectforeignobjectformactionautocompleteerrorformenctype" + + "mustmatchallengeformmethodformnovalidatetimeformtargethgroup" + + "osterhiddenhigh2hreflanghttp-equivideonclickiframeimageimgly" + + "ph3isindexismappletitemtypemarqueematheadersortedmaxlength4m" + + "inlength5mtextareadonlymultiplemutedoncloseamlessourceoncont" + + "extmenuitemidoncopyoncuechangeoncutondblclickondragendondrag" + + "enterondragexitemreferrerpolicyondragleaveondragoverondragst" + + "articleondropzonemptiedondurationchangeonendedonerroronfocus" + + "paceronhashchangeoninputmodeloninvalidonkeydownloadonkeypres" + + "spellcheckedonkeyupreloadonlanguagechangeonloadeddatalisting" + + "onloadedmetadatabindexonloadendonloadstartonmessageerroronmo" + + "usedownonmouseenteronmouseleaveonmousemoveonmouseoutputonmou" + + "seoveronmouseupromptonmousewheelonofflineononlineonpagehides" + + "classectionbluronpageshowbronpastepublicontenteditableonpaus" + + "emaponplayingonpopstateonprogressrcdocodeferonratechangeonre" + + "jectionhandledonresetonresizesrclangonscrollonsecuritypolicy" + + "violationauxclickonseekedonseekingonselectedonshowidth6onsor" + + "tableonstalledonstorageonsubmitemscopedonsuspendontoggleonun" + + "handledrejectionbeforeprintonunloadonvolumechangeonwaitingon" + + "wheeloptimumanifestrongoptionbeforeunloaddressrcsetstylesumm" + + "arysupsvgsystemplateworkertypewrap" diff --git a/api/vendor/golang.org/x/net/html/atom/table_test.go b/api/vendor/golang.org/x/net/html/atom/table_test.go new file mode 100644 index 0000000..8a30762 --- /dev/null +++ b/api/vendor/golang.org/x/net/html/atom/table_test.go @@ -0,0 +1,376 @@ +// Code generated by go generate gen.go; DO NOT EDIT. + +//go:generate go run gen.go -test + +package atom + +var testAtomList = []string{ + "a", + "abbr", + "accept", + "accept-charset", + "accesskey", + "acronym", + "action", + "address", + "align", + "allowfullscreen", + "allowpaymentrequest", + "allowusermedia", + "alt", + "annotation", + "annotation-xml", + "applet", + "area", + "article", + "as", + "aside", + "async", + "audio", + "autocomplete", + "autofocus", + "autoplay", + "b", + "base", + "basefont", + "bdi", + "bdo", + "bgsound", + "big", + "blink", + "blockquote", + "body", + "br", + "button", + "canvas", + "caption", + "center", + "challenge", + "charset", + "checked", + "cite", + "class", + "code", + "col", + "colgroup", + "color", + "cols", + "colspan", + "command", + "content", + "contenteditable", + "contextmenu", + "controls", + "coords", + "crossorigin", + "data", + "datalist", + "datetime", + "dd", + "default", + "defer", + "del", + "desc", + "details", + "dfn", + "dialog", + "dir", + "dirname", + "disabled", + "div", + "dl", + "download", + "draggable", + "dropzone", + "dt", + "em", + "embed", + "enctype", + "face", + "fieldset", + "figcaption", + "figure", + "font", + "footer", + "for", + "foreignObject", + "foreignobject", + "form", + "formaction", + "formenctype", + "formmethod", + "formnovalidate", + "formtarget", + "frame", + "frameset", + "h1", + "h2", + "h3", + "h4", + "h5", + "h6", + "head", + "header", + "headers", + "height", + "hgroup", + "hidden", + "high", + "hr", + "href", + "hreflang", + "html", + "http-equiv", + "i", + "icon", + "id", + "iframe", + "image", + "img", + "input", + "inputmode", + "ins", + "integrity", + "is", + "isindex", + "ismap", + "itemid", + "itemprop", + "itemref", + "itemscope", + "itemtype", + "kbd", + "keygen", + "keytype", + "kind", + "label", + "lang", + "legend", + "li", + "link", + "list", + "listing", + "loop", + "low", + "main", + "malignmark", + "manifest", + "map", + "mark", + "marquee", + "math", + "max", + "maxlength", + "media", + "mediagroup", + "menu", + "menuitem", + "meta", + "meter", + "method", + "mglyph", + "mi", + "min", + "minlength", + "mn", + "mo", + "ms", + "mtext", + "multiple", + "muted", + "name", + "nav", + "nobr", + "noembed", + "noframes", + "nomodule", + "nonce", + "noscript", + "novalidate", + "object", + "ol", + "onabort", + "onafterprint", + "onautocomplete", + "onautocompleteerror", + "onauxclick", + "onbeforeprint", + "onbeforeunload", + "onblur", + "oncancel", + "oncanplay", + "oncanplaythrough", + "onchange", + "onclick", + "onclose", + "oncontextmenu", + "oncopy", + "oncuechange", + "oncut", + "ondblclick", + "ondrag", + "ondragend", + "ondragenter", + "ondragexit", + "ondragleave", + "ondragover", + "ondragstart", + "ondrop", + "ondurationchange", + "onemptied", + "onended", + "onerror", + "onfocus", + "onhashchange", + "oninput", + "oninvalid", + "onkeydown", + "onkeypress", + "onkeyup", + "onlanguagechange", + "onload", + "onloadeddata", + "onloadedmetadata", + "onloadend", + "onloadstart", + "onmessage", + "onmessageerror", + "onmousedown", + "onmouseenter", + "onmouseleave", + "onmousemove", + "onmouseout", + "onmouseover", + "onmouseup", + "onmousewheel", + "onoffline", + "ononline", + "onpagehide", + "onpageshow", + "onpaste", + "onpause", + "onplay", + "onplaying", + "onpopstate", + "onprogress", + "onratechange", + "onrejectionhandled", + "onreset", + "onresize", + "onscroll", + "onsecuritypolicyviolation", + "onseeked", + "onseeking", + "onselect", + "onshow", + "onsort", + "onstalled", + "onstorage", + "onsubmit", + "onsuspend", + "ontimeupdate", + "ontoggle", + "onunhandledrejection", + "onunload", + "onvolumechange", + "onwaiting", + "onwheel", + "open", + "optgroup", + "optimum", + "option", + "output", + "p", + "param", + "pattern", + "picture", + "ping", + "placeholder", + "plaintext", + "playsinline", + "poster", + "pre", + "preload", + "progress", + "prompt", + "public", + "q", + "radiogroup", + "rb", + "readonly", + "referrerpolicy", + "rel", + "required", + "reversed", + "rows", + "rowspan", + "rp", + "rt", + "rtc", + "ruby", + "s", + "samp", + "sandbox", + "scope", + "scoped", + "script", + "seamless", + "section", + "select", + "selected", + "shape", + "size", + "sizes", + "slot", + "small", + "sortable", + "sorted", + "source", + "spacer", + "span", + "spellcheck", + "src", + "srcdoc", + "srclang", + "srcset", + "start", + "step", + "strike", + "strong", + "style", + "sub", + "summary", + "sup", + "svg", + "system", + "tabindex", + "table", + "target", + "tbody", + "td", + "template", + "textarea", + "tfoot", + "th", + "thead", + "time", + "title", + "tr", + "track", + "translate", + "tt", + "type", + "typemustmatch", + "u", + "ul", + "updateviacache", + "usemap", + "value", + "var", + "video", + "wbr", + "width", + "workertype", + "wrap", + "xmp", +} diff --git a/api/vendor/golang.org/x/net/html/charset/charset.go b/api/vendor/golang.org/x/net/html/charset/charset.go new file mode 100644 index 0000000..13bed15 --- /dev/null +++ b/api/vendor/golang.org/x/net/html/charset/charset.go @@ -0,0 +1,257 @@ +// 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 charset provides common text encodings for HTML documents. +// +// The mapping from encoding labels to encodings is defined at +// https://encoding.spec.whatwg.org/. +package charset // import "golang.org/x/net/html/charset" + +import ( + "bytes" + "fmt" + "io" + "mime" + "strings" + "unicode/utf8" + + "golang.org/x/net/html" + "golang.org/x/text/encoding" + "golang.org/x/text/encoding/charmap" + "golang.org/x/text/encoding/htmlindex" + "golang.org/x/text/transform" +) + +// Lookup returns the encoding with the specified label, and its canonical +// name. It returns nil and the empty string if label is not one of the +// standard encodings for HTML. Matching is case-insensitive and ignores +// leading and trailing whitespace. Encoders will use HTML escape sequences for +// runes that are not supported by the character set. +func Lookup(label string) (e encoding.Encoding, name string) { + e, err := htmlindex.Get(label) + if err != nil { + return nil, "" + } + name, _ = htmlindex.Name(e) + return &htmlEncoding{e}, name +} + +type htmlEncoding struct{ encoding.Encoding } + +func (h *htmlEncoding) NewEncoder() *encoding.Encoder { + // HTML requires a non-terminating legacy encoder. We use HTML escapes to + // substitute unsupported code points. + return encoding.HTMLEscapeUnsupported(h.Encoding.NewEncoder()) +} + +// DetermineEncoding determines the encoding of an HTML document by examining +// up to the first 1024 bytes of content and the declared Content-Type. +// +// See http://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html#determining-the-character-encoding +func DetermineEncoding(content []byte, contentType string) (e encoding.Encoding, name string, certain bool) { + if len(content) > 1024 { + content = content[:1024] + } + + for _, b := range boms { + if bytes.HasPrefix(content, b.bom) { + e, name = Lookup(b.enc) + return e, name, true + } + } + + if _, params, err := mime.ParseMediaType(contentType); err == nil { + if cs, ok := params["charset"]; ok { + if e, name = Lookup(cs); e != nil { + return e, name, true + } + } + } + + if len(content) > 0 { + e, name = prescan(content) + if e != nil { + return e, name, false + } + } + + // Try to detect UTF-8. + // First eliminate any partial rune at the end. + for i := len(content) - 1; i >= 0 && i > len(content)-4; i-- { + b := content[i] + if b < 0x80 { + break + } + if utf8.RuneStart(b) { + content = content[:i] + break + } + } + hasHighBit := false + for _, c := range content { + if c >= 0x80 { + hasHighBit = true + break + } + } + if hasHighBit && utf8.Valid(content) { + return encoding.Nop, "utf-8", false + } + + // TODO: change default depending on user's locale? + return charmap.Windows1252, "windows-1252", false +} + +// NewReader returns an io.Reader that converts the content of r to UTF-8. +// It calls DetermineEncoding to find out what r's encoding is. +func NewReader(r io.Reader, contentType string) (io.Reader, error) { + preview := make([]byte, 1024) + n, err := io.ReadFull(r, preview) + switch { + case err == io.ErrUnexpectedEOF: + preview = preview[:n] + r = bytes.NewReader(preview) + case err != nil: + return nil, err + default: + r = io.MultiReader(bytes.NewReader(preview), r) + } + + if e, _, _ := DetermineEncoding(preview, contentType); e != encoding.Nop { + r = transform.NewReader(r, e.NewDecoder()) + } + return r, nil +} + +// NewReaderLabel returns a reader that converts from the specified charset to +// UTF-8. It uses Lookup to find the encoding that corresponds to label, and +// returns an error if Lookup returns nil. It is suitable for use as +// encoding/xml.Decoder's CharsetReader function. +func NewReaderLabel(label string, input io.Reader) (io.Reader, error) { + e, _ := Lookup(label) + if e == nil { + return nil, fmt.Errorf("unsupported charset: %q", label) + } + return transform.NewReader(input, e.NewDecoder()), nil +} + +func prescan(content []byte) (e encoding.Encoding, name string) { + z := html.NewTokenizer(bytes.NewReader(content)) + for { + switch z.Next() { + case html.ErrorToken: + return nil, "" + + case html.StartTagToken, html.SelfClosingTagToken: + tagName, hasAttr := z.TagName() + if !bytes.Equal(tagName, []byte("meta")) { + continue + } + attrList := make(map[string]bool) + gotPragma := false + + const ( + dontKnow = iota + doNeedPragma + doNotNeedPragma + ) + needPragma := dontKnow + + name = "" + e = nil + for hasAttr { + var key, val []byte + key, val, hasAttr = z.TagAttr() + ks := string(key) + if attrList[ks] { + continue + } + attrList[ks] = true + for i, c := range val { + if 'A' <= c && c <= 'Z' { + val[i] = c + 0x20 + } + } + + switch ks { + case "http-equiv": + if bytes.Equal(val, []byte("content-type")) { + gotPragma = true + } + + case "content": + if e == nil { + name = fromMetaElement(string(val)) + if name != "" { + e, name = Lookup(name) + if e != nil { + needPragma = doNeedPragma + } + } + } + + case "charset": + e, name = Lookup(string(val)) + needPragma = doNotNeedPragma + } + } + + if needPragma == dontKnow || needPragma == doNeedPragma && !gotPragma { + continue + } + + if strings.HasPrefix(name, "utf-16") { + name = "utf-8" + e = encoding.Nop + } + + if e != nil { + return e, name + } + } + } +} + +func fromMetaElement(s string) string { + for s != "" { + csLoc := strings.Index(s, "charset") + if csLoc == -1 { + return "" + } + s = s[csLoc+len("charset"):] + s = strings.TrimLeft(s, " \t\n\f\r") + if !strings.HasPrefix(s, "=") { + continue + } + s = s[1:] + s = strings.TrimLeft(s, " \t\n\f\r") + if s == "" { + return "" + } + if q := s[0]; q == '"' || q == '\'' { + s = s[1:] + closeQuote := strings.IndexRune(s, rune(q)) + if closeQuote == -1 { + return "" + } + return s[:closeQuote] + } + + end := strings.IndexAny(s, "; \t\n\f\r") + if end == -1 { + end = len(s) + } + return s[:end] + } + return "" +} + +var boms = []struct { + bom []byte + enc string +}{ + {[]byte{0xfe, 0xff}, "utf-16be"}, + {[]byte{0xff, 0xfe}, "utf-16le"}, + {[]byte{0xef, 0xbb, 0xbf}, "utf-8"}, +} diff --git a/api/vendor/golang.org/x/net/html/charset/charset_test.go b/api/vendor/golang.org/x/net/html/charset/charset_test.go new file mode 100644 index 0000000..e4e7d86 --- /dev/null +++ b/api/vendor/golang.org/x/net/html/charset/charset_test.go @@ -0,0 +1,237 @@ +// 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 charset + +import ( + "bytes" + "encoding/xml" + "io/ioutil" + "runtime" + "strings" + "testing" + + "golang.org/x/text/transform" +) + +func transformString(t transform.Transformer, s string) (string, error) { + r := transform.NewReader(strings.NewReader(s), t) + b, err := ioutil.ReadAll(r) + return string(b), err +} + +type testCase struct { + utf8, other, otherEncoding string +} + +// testCases for encoding and decoding. +var testCases = []testCase{ + {"Résumé", "Résumé", "utf8"}, + {"Résumé", "R\xe9sum\xe9", "latin1"}, + {"これは漢字です。", "S0\x8c0o0\"oW[g0Y0\x020", "UTF-16LE"}, + {"これは漢字です。", "0S0\x8c0oo\"[W0g0Y0\x02", "UTF-16BE"}, + {"Hello, world", "Hello, world", "ASCII"}, + {"Gdańsk", "Gda\xf1sk", "ISO-8859-2"}, + {"Ââ Čč Đđ Ŋŋ Õõ Šš Žž Åå Ää", "\xc2\xe2 \xc8\xe8 \xa9\xb9 \xaf\xbf \xd5\xf5 \xaa\xba \xac\xbc \xc5\xe5 \xc4\xe4", "ISO-8859-10"}, + {"สำหรับ", "\xca\xd3\xcb\xc3\u047a", "ISO-8859-11"}, + {"latviešu", "latvie\xf0u", "ISO-8859-13"}, + {"Seònaid", "Se\xf2naid", "ISO-8859-14"}, + {"€1 is cheap", "\xa41 is cheap", "ISO-8859-15"}, + {"românește", "rom\xe2ne\xbate", "ISO-8859-16"}, + {"nutraĵo", "nutra\xbco", "ISO-8859-3"}, + {"Kalâdlit", "Kal\xe2dlit", "ISO-8859-4"}, + {"русский", "\xe0\xe3\xe1\xe1\xda\xd8\xd9", "ISO-8859-5"}, + {"ελληνικά", "\xe5\xeb\xeb\xe7\xed\xe9\xea\xdc", "ISO-8859-7"}, + {"Kağan", "Ka\xf0an", "ISO-8859-9"}, + {"Résumé", "R\x8esum\x8e", "macintosh"}, + {"Gdańsk", "Gda\xf1sk", "windows-1250"}, + {"русский", "\xf0\xf3\xf1\xf1\xea\xe8\xe9", "windows-1251"}, + {"Résumé", "R\xe9sum\xe9", "windows-1252"}, + {"ελληνικά", "\xe5\xeb\xeb\xe7\xed\xe9\xea\xdc", "windows-1253"}, + {"Kağan", "Ka\xf0an", "windows-1254"}, + {"עִבְרִית", "\xf2\xc4\xe1\xc0\xf8\xc4\xe9\xfa", "windows-1255"}, + {"العربية", "\xc7\xe1\xda\xd1\xc8\xed\xc9", "windows-1256"}, + {"latviešu", "latvie\xf0u", "windows-1257"}, + {"Việt", "Vi\xea\xf2t", "windows-1258"}, + {"สำหรับ", "\xca\xd3\xcb\xc3\u047a", "windows-874"}, + {"русский", "\xd2\xd5\xd3\xd3\xcb\xc9\xca", "KOI8-R"}, + {"українська", "\xd5\xcb\xd2\xc1\xa7\xce\xd3\xd8\xcb\xc1", "KOI8-U"}, + {"Hello 常用國字標準字體表", "Hello \xb1`\xa5\u03b0\xea\xa6r\xbc\u0437\u01e6r\xc5\xe9\xaa\xed", "big5"}, + {"Hello 常用國字標準字體表", "Hello \xb3\xa3\xd3\xc3\x87\xf8\xd7\xd6\x98\xcb\x9c\xca\xd7\xd6\xf3\x77\xb1\xed", "gbk"}, + {"Hello 常用國字標準字體表", "Hello \xb3\xa3\xd3\xc3\x87\xf8\xd7\xd6\x98\xcb\x9c\xca\xd7\xd6\xf3\x77\xb1\xed", "gb18030"}, + {"עִבְרִית", "\x81\x30\xfb\x30\x81\x30\xf6\x34\x81\x30\xf9\x33\x81\x30\xf6\x30\x81\x30\xfb\x36\x81\x30\xf6\x34\x81\x30\xfa\x31\x81\x30\xfb\x38", "gb18030"}, + {"㧯", "\x82\x31\x89\x38", "gb18030"}, + {"これは漢字です。", "\x82\xb1\x82\xea\x82\xcd\x8a\xbf\x8e\x9a\x82\xc5\x82\xb7\x81B", "SJIS"}, + {"Hello, 世界!", "Hello, \x90\xa2\x8aE!", "SJIS"}, + {"イウエオカ", "\xb2\xb3\xb4\xb5\xb6", "SJIS"}, + {"これは漢字です。", "\xa4\xb3\xa4\xec\xa4\u03f4\xc1\xbb\xfa\xa4\u01e4\xb9\xa1\xa3", "EUC-JP"}, + {"Hello, 世界!", "Hello, \x1b$B@$3&\x1b(B!", "ISO-2022-JP"}, + {"다음과 같은 조건을 따라야 합니다: 저작자표시", "\xb4\xd9\xc0\xbd\xb0\xfa \xb0\xb0\xc0\xba \xc1\xb6\xb0\xc7\xc0\xbb \xb5\xfb\xb6\xf3\xbe\xdf \xc7մϴ\xd9: \xc0\xfa\xc0\xdb\xc0\xdaǥ\xbd\xc3", "EUC-KR"}, +} + +func TestDecode(t *testing.T) { + testCases := append(testCases, []testCase{ + // Replace multi-byte maximum subpart of ill-formed subsequence with + // single replacement character (WhatWG requirement). + {"Rés\ufffdumé", "Rés\xe1\x80umé", "utf8"}, + }...) + for _, tc := range testCases { + e, _ := Lookup(tc.otherEncoding) + if e == nil { + t.Errorf("%s: not found", tc.otherEncoding) + continue + } + s, err := transformString(e.NewDecoder(), tc.other) + if err != nil { + t.Errorf("%s: decode %q: %v", tc.otherEncoding, tc.other, err) + continue + } + if s != tc.utf8 { + t.Errorf("%s: got %q, want %q", tc.otherEncoding, s, tc.utf8) + } + } +} + +func TestEncode(t *testing.T) { + testCases := append(testCases, []testCase{ + // Use Go-style replacement. + {"Rés\xe1\x80umé", "Rés\ufffd\ufffdumé", "utf8"}, + // U+0144 LATIN SMALL LETTER N WITH ACUTE not supported by encoding. + {"Gdańsk", "Gdańsk", "ISO-8859-11"}, + {"\ufffd", "�", "ISO-8859-11"}, + {"a\xe1\x80b", "a��b", "ISO-8859-11"}, + }...) + for _, tc := range testCases { + e, _ := Lookup(tc.otherEncoding) + if e == nil { + t.Errorf("%s: not found", tc.otherEncoding) + continue + } + s, err := transformString(e.NewEncoder(), tc.utf8) + if err != nil { + t.Errorf("%s: encode %q: %s", tc.otherEncoding, tc.utf8, err) + continue + } + if s != tc.other { + t.Errorf("%s: got %q, want %q", tc.otherEncoding, s, tc.other) + } + } +} + +var sniffTestCases = []struct { + filename, declared, want string +}{ + {"HTTP-charset.html", "text/html; charset=iso-8859-15", "iso-8859-15"}, + {"UTF-16LE-BOM.html", "", "utf-16le"}, + {"UTF-16BE-BOM.html", "", "utf-16be"}, + {"meta-content-attribute.html", "text/html", "iso-8859-15"}, + {"meta-charset-attribute.html", "text/html", "iso-8859-15"}, + {"No-encoding-declaration.html", "text/html", "utf-8"}, + {"HTTP-vs-UTF-8-BOM.html", "text/html; charset=iso-8859-15", "utf-8"}, + {"HTTP-vs-meta-content.html", "text/html; charset=iso-8859-15", "iso-8859-15"}, + {"HTTP-vs-meta-charset.html", "text/html; charset=iso-8859-15", "iso-8859-15"}, + {"UTF-8-BOM-vs-meta-content.html", "text/html", "utf-8"}, + {"UTF-8-BOM-vs-meta-charset.html", "text/html", "utf-8"}, +} + +func TestSniff(t *testing.T) { + switch runtime.GOOS { + case "nacl": // platforms that don't permit direct file system access + t.Skipf("not supported on %q", runtime.GOOS) + } + + for _, tc := range sniffTestCases { + content, err := ioutil.ReadFile("testdata/" + tc.filename) + if err != nil { + t.Errorf("%s: error reading file: %v", tc.filename, err) + continue + } + + _, name, _ := DetermineEncoding(content, tc.declared) + if name != tc.want { + t.Errorf("%s: got %q, want %q", tc.filename, name, tc.want) + continue + } + } +} + +func TestReader(t *testing.T) { + switch runtime.GOOS { + case "nacl": // platforms that don't permit direct file system access + t.Skipf("not supported on %q", runtime.GOOS) + } + + for _, tc := range sniffTestCases { + content, err := ioutil.ReadFile("testdata/" + tc.filename) + if err != nil { + t.Errorf("%s: error reading file: %v", tc.filename, err) + continue + } + + r, err := NewReader(bytes.NewReader(content), tc.declared) + if err != nil { + t.Errorf("%s: error creating reader: %v", tc.filename, err) + continue + } + + got, err := ioutil.ReadAll(r) + if err != nil { + t.Errorf("%s: error reading from charset.NewReader: %v", tc.filename, err) + continue + } + + e, _ := Lookup(tc.want) + want, err := ioutil.ReadAll(transform.NewReader(bytes.NewReader(content), e.NewDecoder())) + if err != nil { + t.Errorf("%s: error decoding with hard-coded charset name: %v", tc.filename, err) + continue + } + + if !bytes.Equal(got, want) { + t.Errorf("%s: got %q, want %q", tc.filename, got, want) + continue + } + } +} + +var metaTestCases = []struct { + meta, want string +}{ + {"", ""}, + {"text/html", ""}, + {"text/html; charset utf-8", ""}, + {"text/html; charset=latin-2", "latin-2"}, + {"text/html; charset; charset = utf-8", "utf-8"}, + {`charset="big5"`, "big5"}, + {"charset='shift_jis'", "shift_jis"}, +} + +func TestFromMeta(t *testing.T) { + for _, tc := range metaTestCases { + got := fromMetaElement(tc.meta) + if got != tc.want { + t.Errorf("%q: got %q, want %q", tc.meta, got, tc.want) + } + } +} + +func TestXML(t *testing.T) { + const s = "
    r\xe9sum\xe9" + + d := xml.NewDecoder(strings.NewReader(s)) + d.CharsetReader = NewReaderLabel + + var a struct { + Word string + } + err := d.Decode(&a) + if err != nil { + t.Fatalf("Decode: %v", err) + } + + want := "résumé" + if a.Word != want { + t.Errorf("got %q, want %q", a.Word, want) + } +} diff --git a/api/vendor/golang.org/x/net/html/charset/testdata/HTTP-charset.html b/api/vendor/golang.org/x/net/html/charset/testdata/HTTP-charset.html new file mode 100644 index 0000000..9915fa0 --- /dev/null +++ b/api/vendor/golang.org/x/net/html/charset/testdata/HTTP-charset.html @@ -0,0 +1,48 @@ + + + + HTTP charset + + + + + + + + + + + +

    HTTP charset

    + + +
    + + +
     
    + + + + + +
    +

    The character encoding of a page can be set using the HTTP header charset declaration.

    +

    The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ÜÀÚ. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.

    The only character encoding declaration for this HTML file is in the HTTP header, which sets the encoding to ISO 8859-15.

    +
    +
    +
    HTML5
    +

    the-input-byte-stream-001
    Result summary & related tests
    Detailed results for this test
    Link to spec

    +
    Assumptions:
    • The default encoding for the browser you are testing is not set to ISO 8859-15.
    • +
    • The test is read from a server that supports HTTP.
    +
    + + + + + + diff --git a/api/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-UTF-8-BOM.html b/api/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-UTF-8-BOM.html new file mode 100644 index 0000000..26e5d8b --- /dev/null +++ b/api/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-UTF-8-BOM.html @@ -0,0 +1,48 @@ + + + + HTTP vs UTF-8 BOM + + + + + + + + + + + +

    HTTP vs UTF-8 BOM

    + + +
    + + +
     
    + + + + + +
    +

    A character encoding set in the HTTP header has lower precedence than the UTF-8 signature.

    +

    The HTTP header attempts to set the character encoding to ISO 8859-15. The page starts with a UTF-8 signature.

    The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ýäè. This matches the sequence of bytes above when they are interpreted as UTF-8. If the class name matches the selector then the test will pass.

    If the test is unsuccessful, the characters  should appear at the top of the page. These represent the bytes that make up the UTF-8 signature when encountered in the ISO 8859-15 encoding.

    +
    +
    +
    HTML5
    +

    the-input-byte-stream-034
    Result summary & related tests
    Detailed results for this test
    Link to spec

    +
    Assumptions:
    • The default encoding for the browser you are testing is not set to ISO 8859-15.
    • +
    • The test is read from a server that supports HTTP.
    +
    + + + + + + diff --git a/api/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-charset.html b/api/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-charset.html new file mode 100644 index 0000000..2f07e95 --- /dev/null +++ b/api/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-charset.html @@ -0,0 +1,49 @@ + + + + HTTP vs meta charset + + + + + + + + + + + +

    HTTP vs meta charset

    + + +
    + + +
     
    + + + + + +
    +

    The HTTP header has a higher precedence than an encoding declaration in a meta charset attribute.

    +

    The HTTP header attempts to set the character encoding to ISO 8859-15. The page contains an encoding declaration in a meta charset attribute that attempts to set the character encoding to ISO 8859-1.

    The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ÜÀÚ. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.

    +
    +
    +
    HTML5
    +

    the-input-byte-stream-018
    Result summary & related tests
    Detailed results for this test
    Link to spec

    +
    Assumptions:
    • The default encoding for the browser you are testing is not set to ISO 8859-15.
    • +
    • The test is read from a server that supports HTTP.
    +
    + + + + + + diff --git a/api/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-content.html b/api/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-content.html new file mode 100644 index 0000000..6853cdd --- /dev/null +++ b/api/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-content.html @@ -0,0 +1,49 @@ + + + + HTTP vs meta content + + + + + + + + + + + +

    HTTP vs meta content

    + + +
    + + +
     
    + + + + + +
    +

    The HTTP header has a higher precedence than an encoding declaration in a meta content attribute.

    +

    The HTTP header attempts to set the character encoding to ISO 8859-15. The page contains an encoding declaration in a meta content attribute that attempts to set the character encoding to ISO 8859-1.

    The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ÜÀÚ. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.

    +
    +
    +
    HTML5
    +

    the-input-byte-stream-016
    Result summary & related tests
    Detailed results for this test
    Link to spec

    +
    Assumptions:
    • The default encoding for the browser you are testing is not set to ISO 8859-15.
    • +
    • The test is read from a server that supports HTTP.
    +
    + + + + + + diff --git a/api/vendor/golang.org/x/net/html/charset/testdata/No-encoding-declaration.html b/api/vendor/golang.org/x/net/html/charset/testdata/No-encoding-declaration.html new file mode 100644 index 0000000..612e26c --- /dev/null +++ b/api/vendor/golang.org/x/net/html/charset/testdata/No-encoding-declaration.html @@ -0,0 +1,47 @@ + + + + No encoding declaration + + + + + + + + + + + +

    No encoding declaration

    + + +
    + + +
     
    + + + + + +
    +

    A page with no encoding information in HTTP, BOM, XML declaration or meta element will be treated as UTF-8.

    +

    The test on this page contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ýäè. This matches the sequence of bytes above when they are interpreted as UTF-8. If the class name matches the selector then the test will pass.

    +
    +
    +
    HTML5
    +

    the-input-byte-stream-015
    Result summary & related tests
    Detailed results for this test
    Link to spec

    +
    Assumptions:
    • The test is read from a server that supports HTTP.
    +
    + + + + + + diff --git a/api/vendor/golang.org/x/net/html/charset/testdata/README b/api/vendor/golang.org/x/net/html/charset/testdata/README new file mode 100644 index 0000000..38ef0f9 --- /dev/null +++ b/api/vendor/golang.org/x/net/html/charset/testdata/README @@ -0,0 +1,9 @@ +These test cases come from +http://www.w3.org/International/tests/repository/html5/the-input-byte-stream/results-basics + +Distributed under both the W3C Test Suite License +(http://www.w3.org/Consortium/Legal/2008/04-testsuite-license) +and the W3C 3-clause BSD License +(http://www.w3.org/Consortium/Legal/2008/03-bsd-license). +To contribute to a W3C Test Suite, see the policies and contribution +forms (http://www.w3.org/2004/10/27-testcases). diff --git a/api/vendor/golang.org/x/net/html/charset/testdata/UTF-16BE-BOM.html b/api/vendor/golang.org/x/net/html/charset/testdata/UTF-16BE-BOM.html new file mode 100644 index 0000000000000000000000000000000000000000..3abf7a9343c20518e57dfea58b374fb0f4fb58a1 GIT binary patch literal 2670 zcmcJR?QRoS5Qc}JAoU&=BQ-(7b^;2j8i*i3RV1JlO@;VXIsPurV!WHiDdLW}i`*CO z^UnC>tih=KsVr;H&Y7?C&O3AV(?534uG?e##U9y_y|!QNi4``n+D>d{2lky^LnFNx z?9HrarH$>rwQR_$g)Hk0*&STI*EYq|47~&U9sfUB+ji})9eR{QqCUra7oDsZ5obtB zdxP%<)-$4Q;rSHJiM>U(#ZI=;?n^BC?Dp6lu=~_1-lnX3u03&2BlmQIY>L+!Uq7XoytKw^Q#oZSM?3*J?)&ojG&yzQRkC!Ml5JE?ax;lp_NYEcdUht`ZswOviB~L5hmJ|pXI71nn20w;>vG! zQGB$EE9&wC``&J#_Ym~PgRu-Bd>1!pOp0||k`kr=VJ zfH6I6rmRaeHA7U-A^OTsT+|d2a^i(>DePzZ{)ibXoCBvJnuYrd-3kkN$uy{qQK;=*Y;S87ro12aTgu^i*%f8zC3>a}9DIe4cfxOzsCw&(cqvP9{ud{N6f` z#TNDY(B6@Gpr|uN+%&x^XZjBHdc@2vsM(Tyc2=vshHQ5w+obmp>tuWT(t4BTUGAQw zxeI$UGSLUBg=WFbF;4f@4=^P2AgY@CFn8A`bcC=_&~)fiDe)#cUARRBzJ^k|%X)69 z+{Cb`wq}Rsg%B62CC_tK!AV(W{(MV?#mndR46CU#BUN<{8e?*oT+!pE5wF#O#TR#a z$9qRT)tpbw8zAI~QQJg2C3|6$I%(T(;`zOMy6SO+&;pG=c#2P|P-WZn$$DpWJlC3U z3*nvmz zwP{u~r$L?-m3uqp9I1+#3yE|3M$(s-BEtih=LQ>`qYoiktOop(wi%!;yh%+Rm z{e|xntY<{q!1F1Z6MKtngPm-p-4|H&+3m4AVE3_AyiHm6Tzlf4M(*ht*%YrezJ6kr zHGj45pc?64*$Cm%-zseWMA`x;)v*~jA=i}szqts9xmQkS`M11|(H7bTXAycsXU53+ zJ?120SRZeyiFjW7enPN`bxk$IaWV3o48oJF7D&2ysoY;6(s6%6vVfaYd&mC=erK!) zNGI^7upQgN)53OHe_VE<@J+G8*Y|p*)zB2Thdi}+YR<5QWHm!|a_*AoZXuv7)$xe| zm3Q$D7{|#}{m4X&UY!6(ZhyYi2(5JLzGE$H)W6BQklnjPMwn<Yvv7Z*TVWwD*=E3QpH37* z#lqXJA0A~J9T_<^W5smspmDg2p6ac5Bjn+~LAoow%1TCdZ*$K8`O zw_$HaCi+0N&@7la#_7KL5r$+QL{)Pi=I&aDjt~|Knht#`CEi4*3%97i_fSfASlwUz0=3V0GCxY}z81UC-nP=CGt2OqYV$ zoRCo+qM9YX*3FFORLC=E3B~S@+KROyk4r5 yX7?DaslDfIebqXgC!KKp4IYy+W~X?ddE6o=`A+x#x0AK&6MF#W&AXxbRrv+SX}PNa literal 0 HcmV?d00001 diff --git a/api/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-charset.html b/api/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-charset.html new file mode 100644 index 0000000..83de433 --- /dev/null +++ b/api/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-charset.html @@ -0,0 +1,49 @@ + + + + UTF-8 BOM vs meta charset + + + + + + + + + + + +

    UTF-8 BOM vs meta charset

    + + +
    + + +
     
    + + + + + +
    +

    A page with a UTF-8 BOM will be recognized as UTF-8 even if the meta charset attribute declares a different encoding.

    +

    The page contains an encoding declaration in a meta charset attribute that attempts to set the character encoding to ISO 8859-15, but the file starts with a UTF-8 signature.

    The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ýäè. This matches the sequence of bytes above when they are interpreted as UTF-8. If the class name matches the selector then the test will pass.

    +
    +
    +
    HTML5
    +

    the-input-byte-stream-038
    Result summary & related tests
    Detailed results for this test
    Link to spec

    +
    Assumptions:
    • The default encoding for the browser you are testing is not set to ISO 8859-15.
    • +
    • The test is read from a server that supports HTTP.
    +
    + + + + + + diff --git a/api/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-content.html b/api/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-content.html new file mode 100644 index 0000000..501aac2 --- /dev/null +++ b/api/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-content.html @@ -0,0 +1,48 @@ + + + + UTF-8 BOM vs meta content + + + + + + + + + + + +

    UTF-8 BOM vs meta content

    + + +
    + + +
     
    + + + + + +
    +

    A page with a UTF-8 BOM will be recognized as UTF-8 even if the meta content attribute declares a different encoding.

    +

    The page contains an encoding declaration in a meta content attribute that attempts to set the character encoding to ISO 8859-15, but the file starts with a UTF-8 signature.

    The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ýäè. This matches the sequence of bytes above when they are interpreted as UTF-8. If the class name matches the selector then the test will pass.

    +
    +
    +
    HTML5
    +

    the-input-byte-stream-037
    Result summary & related tests
    Detailed results for this test
    Link to spec

    +
    Assumptions:
    • The default encoding for the browser you are testing is not set to ISO 8859-15.
    • +
    • The test is read from a server that supports HTTP.
    +
    + + + + + + diff --git a/api/vendor/golang.org/x/net/html/charset/testdata/meta-charset-attribute.html b/api/vendor/golang.org/x/net/html/charset/testdata/meta-charset-attribute.html new file mode 100644 index 0000000..2d7d25a --- /dev/null +++ b/api/vendor/golang.org/x/net/html/charset/testdata/meta-charset-attribute.html @@ -0,0 +1,48 @@ + + + + meta charset attribute + + + + + + + + + + + +

    meta charset attribute

    + + +
    + + +
     
    + + + + + +
    +

    The character encoding of the page can be set by a meta element with charset attribute.

    +

    The only character encoding declaration for this HTML file is in the charset attribute of the meta element, which declares the encoding to be ISO 8859-15.

    The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ÜÀÚ. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.

    +
    +
    +
    HTML5
    +

    the-input-byte-stream-009
    Result summary & related tests
    Detailed results for this test
    Link to spec

    +
    Assumptions:
    • The default encoding for the browser you are testing is not set to ISO 8859-15.
    • +
    • The test is read from a server that supports HTTP.
    +
    + + + + + + diff --git a/api/vendor/golang.org/x/net/html/charset/testdata/meta-content-attribute.html b/api/vendor/golang.org/x/net/html/charset/testdata/meta-content-attribute.html new file mode 100644 index 0000000..1c3f228 --- /dev/null +++ b/api/vendor/golang.org/x/net/html/charset/testdata/meta-content-attribute.html @@ -0,0 +1,48 @@ + + + + meta content attribute + + + + + + + + + + + +

    meta content attribute

    + + +
    + + +
     
    + + + + + +
    +

    The character encoding of the page can be set by a meta element with http-equiv and content attributes.

    +

    The only character encoding declaration for this HTML file is in the content attribute of the meta element, which declares the encoding to be ISO 8859-15.

    The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ÜÀÚ. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.

    +
    +
    +
    HTML5
    +

    the-input-byte-stream-007
    Result summary & related tests
    Detailed results for this test
    Link to spec

    +
    Assumptions:
    • The default encoding for the browser you are testing is not set to ISO 8859-15.
    • +
    • The test is read from a server that supports HTTP.
    +
    + + + + + + diff --git a/api/vendor/golang.org/x/net/html/const.go b/api/vendor/golang.org/x/net/html/const.go new file mode 100644 index 0000000..5eb7c5a --- /dev/null +++ b/api/vendor/golang.org/x/net/html/const.go @@ -0,0 +1,104 @@ +// 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 html + +// Section 12.2.4.2 of the HTML5 specification says "The following elements +// have varying levels of special parsing rules". +// https://html.spec.whatwg.org/multipage/syntax.html#the-stack-of-open-elements +var isSpecialElementMap = map[string]bool{ + "address": true, + "applet": true, + "area": true, + "article": true, + "aside": true, + "base": true, + "basefont": true, + "bgsound": true, + "blockquote": true, + "body": true, + "br": true, + "button": true, + "caption": true, + "center": true, + "col": true, + "colgroup": true, + "dd": true, + "details": true, + "dir": true, + "div": true, + "dl": true, + "dt": true, + "embed": true, + "fieldset": true, + "figcaption": true, + "figure": true, + "footer": true, + "form": true, + "frame": true, + "frameset": true, + "h1": true, + "h2": true, + "h3": true, + "h4": true, + "h5": true, + "h6": true, + "head": true, + "header": true, + "hgroup": true, + "hr": true, + "html": true, + "iframe": true, + "img": true, + "input": true, + "isindex": true, // The 'isindex' element has been removed, but keep it for backwards compatibility. + "keygen": true, + "li": true, + "link": true, + "listing": true, + "main": true, + "marquee": true, + "menu": true, + "meta": true, + "nav": true, + "noembed": true, + "noframes": true, + "noscript": true, + "object": true, + "ol": true, + "p": true, + "param": true, + "plaintext": true, + "pre": true, + "script": true, + "section": true, + "select": true, + "source": true, + "style": true, + "summary": true, + "table": true, + "tbody": true, + "td": true, + "template": true, + "textarea": true, + "tfoot": true, + "th": true, + "thead": true, + "title": true, + "tr": true, + "track": true, + "ul": true, + "wbr": true, + "xmp": true, +} + +func isSpecialElement(element *Node) bool { + switch element.Namespace { + case "", "html": + return isSpecialElementMap[element.Data] + case "svg": + return element.Data == "foreignObject" + } + return false +} diff --git a/api/vendor/golang.org/x/net/html/doc.go b/api/vendor/golang.org/x/net/html/doc.go new file mode 100644 index 0000000..822ed42 --- /dev/null +++ b/api/vendor/golang.org/x/net/html/doc.go @@ -0,0 +1,106 @@ +// 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 html implements an HTML5-compliant tokenizer and parser. + +Tokenization is done by creating a Tokenizer for an io.Reader r. It is the +caller's responsibility to ensure that r provides UTF-8 encoded HTML. + + z := html.NewTokenizer(r) + +Given a Tokenizer z, the HTML is tokenized by repeatedly calling z.Next(), +which parses the next token and returns its type, or an error: + + for { + tt := z.Next() + if tt == html.ErrorToken { + // ... + return ... + } + // Process the current token. + } + +There are two APIs for retrieving the current token. The high-level API is to +call Token; the low-level API is to call Text or TagName / TagAttr. Both APIs +allow optionally calling Raw after Next but before Token, Text, TagName, or +TagAttr. In EBNF notation, the valid call sequence per token is: + + Next {Raw} [ Token | Text | TagName {TagAttr} ] + +Token returns an independent data structure that completely describes a token. +Entities (such as "<") are unescaped, tag names and attribute keys are +lower-cased, and attributes are collected into a []Attribute. For example: + + for { + if z.Next() == html.ErrorToken { + // Returning io.EOF indicates success. + return z.Err() + } + emitToken(z.Token()) + } + +The low-level API performs fewer allocations and copies, but the contents of +the []byte values returned by Text, TagName and TagAttr may change on the next +call to Next. For example, to extract an HTML page's anchor text: + + depth := 0 + for { + tt := z.Next() + switch tt { + case html.ErrorToken: + return z.Err() + case html.TextToken: + if depth > 0 { + // emitBytes should copy the []byte it receives, + // if it doesn't process it immediately. + emitBytes(z.Text()) + } + case html.StartTagToken, html.EndTagToken: + tn, _ := z.TagName() + if len(tn) == 1 && tn[0] == 'a' { + if tt == html.StartTagToken { + depth++ + } else { + depth-- + } + } + } + } + +Parsing is done by calling Parse with an io.Reader, which returns the root of +the parse tree (the document element) as a *Node. It is the caller's +responsibility to ensure that the Reader provides UTF-8 encoded HTML. For +example, to process each anchor node in depth-first order: + + doc, err := html.Parse(r) + if err != nil { + // ... + } + var f func(*html.Node) + f = func(n *html.Node) { + if n.Type == html.ElementNode && n.Data == "a" { + // Do something with n... + } + for c := n.FirstChild; c != nil; c = c.NextSibling { + f(c) + } + } + f(doc) + +The relevant specifications include: +https://html.spec.whatwg.org/multipage/syntax.html and +https://html.spec.whatwg.org/multipage/syntax.html#tokenization +*/ +package html // import "golang.org/x/net/html" + +// The tokenization algorithm implemented by this package is not a line-by-line +// transliteration of the relatively verbose state-machine in the WHATWG +// specification. A more direct approach is used instead, where the program +// counter implies the state, such as whether it is tokenizing a tag or a text +// node. Specification compliance is verified by checking expected and actual +// outputs over a test suite rather than aiming for algorithmic fidelity. + +// TODO(nigeltao): Does a DOM API belong in this package or a separate one? +// TODO(nigeltao): How does parsing interact with a JavaScript engine? diff --git a/api/vendor/golang.org/x/net/html/doctype.go b/api/vendor/golang.org/x/net/html/doctype.go new file mode 100644 index 0000000..c484e5a --- /dev/null +++ b/api/vendor/golang.org/x/net/html/doctype.go @@ -0,0 +1,156 @@ +// 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 html + +import ( + "strings" +) + +// parseDoctype parses the data from a DoctypeToken into a name, +// public identifier, and system identifier. It returns a Node whose Type +// is DoctypeNode, whose Data is the name, and which has attributes +// named "system" and "public" for the two identifiers if they were present. +// quirks is whether the document should be parsed in "quirks mode". +func parseDoctype(s string) (n *Node, quirks bool) { + n = &Node{Type: DoctypeNode} + + // Find the name. + space := strings.IndexAny(s, whitespace) + if space == -1 { + space = len(s) + } + n.Data = s[:space] + // The comparison to "html" is case-sensitive. + if n.Data != "html" { + quirks = true + } + n.Data = strings.ToLower(n.Data) + s = strings.TrimLeft(s[space:], whitespace) + + if len(s) < 6 { + // It can't start with "PUBLIC" or "SYSTEM". + // Ignore the rest of the string. + return n, quirks || s != "" + } + + key := strings.ToLower(s[:6]) + s = s[6:] + for key == "public" || key == "system" { + s = strings.TrimLeft(s, whitespace) + if s == "" { + break + } + quote := s[0] + if quote != '"' && quote != '\'' { + break + } + s = s[1:] + q := strings.IndexRune(s, rune(quote)) + var id string + if q == -1 { + id = s + s = "" + } else { + id = s[:q] + s = s[q+1:] + } + n.Attr = append(n.Attr, Attribute{Key: key, Val: id}) + if key == "public" { + key = "system" + } else { + key = "" + } + } + + if key != "" || s != "" { + quirks = true + } else if len(n.Attr) > 0 { + if n.Attr[0].Key == "public" { + public := strings.ToLower(n.Attr[0].Val) + switch public { + case "-//w3o//dtd w3 html strict 3.0//en//", "-/w3d/dtd html 4.0 transitional/en", "html": + quirks = true + default: + for _, q := range quirkyIDs { + if strings.HasPrefix(public, q) { + quirks = true + break + } + } + } + // The following two public IDs only cause quirks mode if there is no system ID. + if len(n.Attr) == 1 && (strings.HasPrefix(public, "-//w3c//dtd html 4.01 frameset//") || + strings.HasPrefix(public, "-//w3c//dtd html 4.01 transitional//")) { + quirks = true + } + } + if lastAttr := n.Attr[len(n.Attr)-1]; lastAttr.Key == "system" && + strings.ToLower(lastAttr.Val) == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd" { + quirks = true + } + } + + return n, quirks +} + +// quirkyIDs is a list of public doctype identifiers that cause a document +// to be interpreted in quirks mode. The identifiers should be in lower case. +var quirkyIDs = []string{ + "+//silmaril//dtd html pro v0r11 19970101//", + "-//advasoft ltd//dtd html 3.0 aswedit + extensions//", + "-//as//dtd html 3.0 aswedit + extensions//", + "-//ietf//dtd html 2.0 level 1//", + "-//ietf//dtd html 2.0 level 2//", + "-//ietf//dtd html 2.0 strict level 1//", + "-//ietf//dtd html 2.0 strict level 2//", + "-//ietf//dtd html 2.0 strict//", + "-//ietf//dtd html 2.0//", + "-//ietf//dtd html 2.1e//", + "-//ietf//dtd html 3.0//", + "-//ietf//dtd html 3.2 final//", + "-//ietf//dtd html 3.2//", + "-//ietf//dtd html 3//", + "-//ietf//dtd html level 0//", + "-//ietf//dtd html level 1//", + "-//ietf//dtd html level 2//", + "-//ietf//dtd html level 3//", + "-//ietf//dtd html strict level 0//", + "-//ietf//dtd html strict level 1//", + "-//ietf//dtd html strict level 2//", + "-//ietf//dtd html strict level 3//", + "-//ietf//dtd html strict//", + "-//ietf//dtd html//", + "-//metrius//dtd metrius presentational//", + "-//microsoft//dtd internet explorer 2.0 html strict//", + "-//microsoft//dtd internet explorer 2.0 html//", + "-//microsoft//dtd internet explorer 2.0 tables//", + "-//microsoft//dtd internet explorer 3.0 html strict//", + "-//microsoft//dtd internet explorer 3.0 html//", + "-//microsoft//dtd internet explorer 3.0 tables//", + "-//netscape comm. corp.//dtd html//", + "-//netscape comm. corp.//dtd strict html//", + "-//o'reilly and associates//dtd html 2.0//", + "-//o'reilly and associates//dtd html extended 1.0//", + "-//o'reilly and associates//dtd html extended relaxed 1.0//", + "-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//", + "-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//", + "-//spyglass//dtd html 2.0 extended//", + "-//sq//dtd html 2.0 hotmetal + extensions//", + "-//sun microsystems corp.//dtd hotjava html//", + "-//sun microsystems corp.//dtd hotjava strict html//", + "-//w3c//dtd html 3 1995-03-24//", + "-//w3c//dtd html 3.2 draft//", + "-//w3c//dtd html 3.2 final//", + "-//w3c//dtd html 3.2//", + "-//w3c//dtd html 3.2s draft//", + "-//w3c//dtd html 4.0 frameset//", + "-//w3c//dtd html 4.0 transitional//", + "-//w3c//dtd html experimental 19960712//", + "-//w3c//dtd html experimental 970421//", + "-//w3c//dtd w3 html//", + "-//w3o//dtd w3 html 3.0//", + "-//webtechs//dtd mozilla html 2.0//", + "-//webtechs//dtd mozilla html//", +} diff --git a/api/vendor/golang.org/x/net/html/entity.go b/api/vendor/golang.org/x/net/html/entity.go new file mode 100644 index 0000000..b628880 --- /dev/null +++ b/api/vendor/golang.org/x/net/html/entity.go @@ -0,0 +1,2253 @@ +// 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 html + +// All entities that do not end with ';' are 6 or fewer bytes long. +const longestEntityWithoutSemicolon = 6 + +// entity is a map from HTML entity names to their values. The semicolon matters: +// https://html.spec.whatwg.org/multipage/syntax.html#named-character-references +// lists both "amp" and "amp;" as two separate entries. +// +// Note that the HTML5 list is larger than the HTML4 list at +// http://www.w3.org/TR/html4/sgml/entities.html +var entity = map[string]rune{ + "AElig;": '\U000000C6', + "AMP;": '\U00000026', + "Aacute;": '\U000000C1', + "Abreve;": '\U00000102', + "Acirc;": '\U000000C2', + "Acy;": '\U00000410', + "Afr;": '\U0001D504', + "Agrave;": '\U000000C0', + "Alpha;": '\U00000391', + "Amacr;": '\U00000100', + "And;": '\U00002A53', + "Aogon;": '\U00000104', + "Aopf;": '\U0001D538', + "ApplyFunction;": '\U00002061', + "Aring;": '\U000000C5', + "Ascr;": '\U0001D49C', + "Assign;": '\U00002254', + "Atilde;": '\U000000C3', + "Auml;": '\U000000C4', + "Backslash;": '\U00002216', + "Barv;": '\U00002AE7', + "Barwed;": '\U00002306', + "Bcy;": '\U00000411', + "Because;": '\U00002235', + "Bernoullis;": '\U0000212C', + "Beta;": '\U00000392', + "Bfr;": '\U0001D505', + "Bopf;": '\U0001D539', + "Breve;": '\U000002D8', + "Bscr;": '\U0000212C', + "Bumpeq;": '\U0000224E', + "CHcy;": '\U00000427', + "COPY;": '\U000000A9', + "Cacute;": '\U00000106', + "Cap;": '\U000022D2', + "CapitalDifferentialD;": '\U00002145', + "Cayleys;": '\U0000212D', + "Ccaron;": '\U0000010C', + "Ccedil;": '\U000000C7', + "Ccirc;": '\U00000108', + "Cconint;": '\U00002230', + "Cdot;": '\U0000010A', + "Cedilla;": '\U000000B8', + "CenterDot;": '\U000000B7', + "Cfr;": '\U0000212D', + "Chi;": '\U000003A7', + "CircleDot;": '\U00002299', + "CircleMinus;": '\U00002296', + "CirclePlus;": '\U00002295', + "CircleTimes;": '\U00002297', + "ClockwiseContourIntegral;": '\U00002232', + "CloseCurlyDoubleQuote;": '\U0000201D', + "CloseCurlyQuote;": '\U00002019', + "Colon;": '\U00002237', + "Colone;": '\U00002A74', + "Congruent;": '\U00002261', + "Conint;": '\U0000222F', + "ContourIntegral;": '\U0000222E', + "Copf;": '\U00002102', + "Coproduct;": '\U00002210', + "CounterClockwiseContourIntegral;": '\U00002233', + "Cross;": '\U00002A2F', + "Cscr;": '\U0001D49E', + "Cup;": '\U000022D3', + "CupCap;": '\U0000224D', + "DD;": '\U00002145', + "DDotrahd;": '\U00002911', + "DJcy;": '\U00000402', + "DScy;": '\U00000405', + "DZcy;": '\U0000040F', + "Dagger;": '\U00002021', + "Darr;": '\U000021A1', + "Dashv;": '\U00002AE4', + "Dcaron;": '\U0000010E', + "Dcy;": '\U00000414', + "Del;": '\U00002207', + "Delta;": '\U00000394', + "Dfr;": '\U0001D507', + "DiacriticalAcute;": '\U000000B4', + "DiacriticalDot;": '\U000002D9', + "DiacriticalDoubleAcute;": '\U000002DD', + "DiacriticalGrave;": '\U00000060', + "DiacriticalTilde;": '\U000002DC', + "Diamond;": '\U000022C4', + "DifferentialD;": '\U00002146', + "Dopf;": '\U0001D53B', + "Dot;": '\U000000A8', + "DotDot;": '\U000020DC', + "DotEqual;": '\U00002250', + "DoubleContourIntegral;": '\U0000222F', + "DoubleDot;": '\U000000A8', + "DoubleDownArrow;": '\U000021D3', + "DoubleLeftArrow;": '\U000021D0', + "DoubleLeftRightArrow;": '\U000021D4', + "DoubleLeftTee;": '\U00002AE4', + "DoubleLongLeftArrow;": '\U000027F8', + "DoubleLongLeftRightArrow;": '\U000027FA', + "DoubleLongRightArrow;": '\U000027F9', + "DoubleRightArrow;": '\U000021D2', + "DoubleRightTee;": '\U000022A8', + "DoubleUpArrow;": '\U000021D1', + "DoubleUpDownArrow;": '\U000021D5', + "DoubleVerticalBar;": '\U00002225', + "DownArrow;": '\U00002193', + "DownArrowBar;": '\U00002913', + "DownArrowUpArrow;": '\U000021F5', + "DownBreve;": '\U00000311', + "DownLeftRightVector;": '\U00002950', + "DownLeftTeeVector;": '\U0000295E', + "DownLeftVector;": '\U000021BD', + "DownLeftVectorBar;": '\U00002956', + "DownRightTeeVector;": '\U0000295F', + "DownRightVector;": '\U000021C1', + "DownRightVectorBar;": '\U00002957', + "DownTee;": '\U000022A4', + "DownTeeArrow;": '\U000021A7', + "Downarrow;": '\U000021D3', + "Dscr;": '\U0001D49F', + "Dstrok;": '\U00000110', + "ENG;": '\U0000014A', + "ETH;": '\U000000D0', + "Eacute;": '\U000000C9', + "Ecaron;": '\U0000011A', + "Ecirc;": '\U000000CA', + "Ecy;": '\U0000042D', + "Edot;": '\U00000116', + "Efr;": '\U0001D508', + "Egrave;": '\U000000C8', + "Element;": '\U00002208', + "Emacr;": '\U00000112', + "EmptySmallSquare;": '\U000025FB', + "EmptyVerySmallSquare;": '\U000025AB', + "Eogon;": '\U00000118', + "Eopf;": '\U0001D53C', + "Epsilon;": '\U00000395', + "Equal;": '\U00002A75', + "EqualTilde;": '\U00002242', + "Equilibrium;": '\U000021CC', + "Escr;": '\U00002130', + "Esim;": '\U00002A73', + "Eta;": '\U00000397', + "Euml;": '\U000000CB', + "Exists;": '\U00002203', + "ExponentialE;": '\U00002147', + "Fcy;": '\U00000424', + "Ffr;": '\U0001D509', + "FilledSmallSquare;": '\U000025FC', + "FilledVerySmallSquare;": '\U000025AA', + "Fopf;": '\U0001D53D', + "ForAll;": '\U00002200', + "Fouriertrf;": '\U00002131', + "Fscr;": '\U00002131', + "GJcy;": '\U00000403', + "GT;": '\U0000003E', + "Gamma;": '\U00000393', + "Gammad;": '\U000003DC', + "Gbreve;": '\U0000011E', + "Gcedil;": '\U00000122', + "Gcirc;": '\U0000011C', + "Gcy;": '\U00000413', + "Gdot;": '\U00000120', + "Gfr;": '\U0001D50A', + "Gg;": '\U000022D9', + "Gopf;": '\U0001D53E', + "GreaterEqual;": '\U00002265', + "GreaterEqualLess;": '\U000022DB', + "GreaterFullEqual;": '\U00002267', + "GreaterGreater;": '\U00002AA2', + "GreaterLess;": '\U00002277', + "GreaterSlantEqual;": '\U00002A7E', + "GreaterTilde;": '\U00002273', + "Gscr;": '\U0001D4A2', + "Gt;": '\U0000226B', + "HARDcy;": '\U0000042A', + "Hacek;": '\U000002C7', + "Hat;": '\U0000005E', + "Hcirc;": '\U00000124', + "Hfr;": '\U0000210C', + "HilbertSpace;": '\U0000210B', + "Hopf;": '\U0000210D', + "HorizontalLine;": '\U00002500', + "Hscr;": '\U0000210B', + "Hstrok;": '\U00000126', + "HumpDownHump;": '\U0000224E', + "HumpEqual;": '\U0000224F', + "IEcy;": '\U00000415', + "IJlig;": '\U00000132', + "IOcy;": '\U00000401', + "Iacute;": '\U000000CD', + "Icirc;": '\U000000CE', + "Icy;": '\U00000418', + "Idot;": '\U00000130', + "Ifr;": '\U00002111', + "Igrave;": '\U000000CC', + "Im;": '\U00002111', + "Imacr;": '\U0000012A', + "ImaginaryI;": '\U00002148', + "Implies;": '\U000021D2', + "Int;": '\U0000222C', + "Integral;": '\U0000222B', + "Intersection;": '\U000022C2', + "InvisibleComma;": '\U00002063', + "InvisibleTimes;": '\U00002062', + "Iogon;": '\U0000012E', + "Iopf;": '\U0001D540', + "Iota;": '\U00000399', + "Iscr;": '\U00002110', + "Itilde;": '\U00000128', + "Iukcy;": '\U00000406', + "Iuml;": '\U000000CF', + "Jcirc;": '\U00000134', + "Jcy;": '\U00000419', + "Jfr;": '\U0001D50D', + "Jopf;": '\U0001D541', + "Jscr;": '\U0001D4A5', + "Jsercy;": '\U00000408', + "Jukcy;": '\U00000404', + "KHcy;": '\U00000425', + "KJcy;": '\U0000040C', + "Kappa;": '\U0000039A', + "Kcedil;": '\U00000136', + "Kcy;": '\U0000041A', + "Kfr;": '\U0001D50E', + "Kopf;": '\U0001D542', + "Kscr;": '\U0001D4A6', + "LJcy;": '\U00000409', + "LT;": '\U0000003C', + "Lacute;": '\U00000139', + "Lambda;": '\U0000039B', + "Lang;": '\U000027EA', + "Laplacetrf;": '\U00002112', + "Larr;": '\U0000219E', + "Lcaron;": '\U0000013D', + "Lcedil;": '\U0000013B', + "Lcy;": '\U0000041B', + "LeftAngleBracket;": '\U000027E8', + "LeftArrow;": '\U00002190', + "LeftArrowBar;": '\U000021E4', + "LeftArrowRightArrow;": '\U000021C6', + "LeftCeiling;": '\U00002308', + "LeftDoubleBracket;": '\U000027E6', + "LeftDownTeeVector;": '\U00002961', + "LeftDownVector;": '\U000021C3', + "LeftDownVectorBar;": '\U00002959', + "LeftFloor;": '\U0000230A', + "LeftRightArrow;": '\U00002194', + "LeftRightVector;": '\U0000294E', + "LeftTee;": '\U000022A3', + "LeftTeeArrow;": '\U000021A4', + "LeftTeeVector;": '\U0000295A', + "LeftTriangle;": '\U000022B2', + "LeftTriangleBar;": '\U000029CF', + "LeftTriangleEqual;": '\U000022B4', + "LeftUpDownVector;": '\U00002951', + "LeftUpTeeVector;": '\U00002960', + "LeftUpVector;": '\U000021BF', + "LeftUpVectorBar;": '\U00002958', + "LeftVector;": '\U000021BC', + "LeftVectorBar;": '\U00002952', + "Leftarrow;": '\U000021D0', + "Leftrightarrow;": '\U000021D4', + "LessEqualGreater;": '\U000022DA', + "LessFullEqual;": '\U00002266', + "LessGreater;": '\U00002276', + "LessLess;": '\U00002AA1', + "LessSlantEqual;": '\U00002A7D', + "LessTilde;": '\U00002272', + "Lfr;": '\U0001D50F', + "Ll;": '\U000022D8', + "Lleftarrow;": '\U000021DA', + "Lmidot;": '\U0000013F', + "LongLeftArrow;": '\U000027F5', + "LongLeftRightArrow;": '\U000027F7', + "LongRightArrow;": '\U000027F6', + "Longleftarrow;": '\U000027F8', + "Longleftrightarrow;": '\U000027FA', + "Longrightarrow;": '\U000027F9', + "Lopf;": '\U0001D543', + "LowerLeftArrow;": '\U00002199', + "LowerRightArrow;": '\U00002198', + "Lscr;": '\U00002112', + "Lsh;": '\U000021B0', + "Lstrok;": '\U00000141', + "Lt;": '\U0000226A', + "Map;": '\U00002905', + "Mcy;": '\U0000041C', + "MediumSpace;": '\U0000205F', + "Mellintrf;": '\U00002133', + "Mfr;": '\U0001D510', + "MinusPlus;": '\U00002213', + "Mopf;": '\U0001D544', + "Mscr;": '\U00002133', + "Mu;": '\U0000039C', + "NJcy;": '\U0000040A', + "Nacute;": '\U00000143', + "Ncaron;": '\U00000147', + "Ncedil;": '\U00000145', + "Ncy;": '\U0000041D', + "NegativeMediumSpace;": '\U0000200B', + "NegativeThickSpace;": '\U0000200B', + "NegativeThinSpace;": '\U0000200B', + "NegativeVeryThinSpace;": '\U0000200B', + "NestedGreaterGreater;": '\U0000226B', + "NestedLessLess;": '\U0000226A', + "NewLine;": '\U0000000A', + "Nfr;": '\U0001D511', + "NoBreak;": '\U00002060', + "NonBreakingSpace;": '\U000000A0', + "Nopf;": '\U00002115', + "Not;": '\U00002AEC', + "NotCongruent;": '\U00002262', + "NotCupCap;": '\U0000226D', + "NotDoubleVerticalBar;": '\U00002226', + "NotElement;": '\U00002209', + "NotEqual;": '\U00002260', + "NotExists;": '\U00002204', + "NotGreater;": '\U0000226F', + "NotGreaterEqual;": '\U00002271', + "NotGreaterLess;": '\U00002279', + "NotGreaterTilde;": '\U00002275', + "NotLeftTriangle;": '\U000022EA', + "NotLeftTriangleEqual;": '\U000022EC', + "NotLess;": '\U0000226E', + "NotLessEqual;": '\U00002270', + "NotLessGreater;": '\U00002278', + "NotLessTilde;": '\U00002274', + "NotPrecedes;": '\U00002280', + "NotPrecedesSlantEqual;": '\U000022E0', + "NotReverseElement;": '\U0000220C', + "NotRightTriangle;": '\U000022EB', + "NotRightTriangleEqual;": '\U000022ED', + "NotSquareSubsetEqual;": '\U000022E2', + "NotSquareSupersetEqual;": '\U000022E3', + "NotSubsetEqual;": '\U00002288', + "NotSucceeds;": '\U00002281', + "NotSucceedsSlantEqual;": '\U000022E1', + "NotSupersetEqual;": '\U00002289', + "NotTilde;": '\U00002241', + "NotTildeEqual;": '\U00002244', + "NotTildeFullEqual;": '\U00002247', + "NotTildeTilde;": '\U00002249', + "NotVerticalBar;": '\U00002224', + "Nscr;": '\U0001D4A9', + "Ntilde;": '\U000000D1', + "Nu;": '\U0000039D', + "OElig;": '\U00000152', + "Oacute;": '\U000000D3', + "Ocirc;": '\U000000D4', + "Ocy;": '\U0000041E', + "Odblac;": '\U00000150', + "Ofr;": '\U0001D512', + "Ograve;": '\U000000D2', + "Omacr;": '\U0000014C', + "Omega;": '\U000003A9', + "Omicron;": '\U0000039F', + "Oopf;": '\U0001D546', + "OpenCurlyDoubleQuote;": '\U0000201C', + "OpenCurlyQuote;": '\U00002018', + "Or;": '\U00002A54', + "Oscr;": '\U0001D4AA', + "Oslash;": '\U000000D8', + "Otilde;": '\U000000D5', + "Otimes;": '\U00002A37', + "Ouml;": '\U000000D6', + "OverBar;": '\U0000203E', + "OverBrace;": '\U000023DE', + "OverBracket;": '\U000023B4', + "OverParenthesis;": '\U000023DC', + "PartialD;": '\U00002202', + "Pcy;": '\U0000041F', + "Pfr;": '\U0001D513', + "Phi;": '\U000003A6', + "Pi;": '\U000003A0', + "PlusMinus;": '\U000000B1', + "Poincareplane;": '\U0000210C', + "Popf;": '\U00002119', + "Pr;": '\U00002ABB', + "Precedes;": '\U0000227A', + "PrecedesEqual;": '\U00002AAF', + "PrecedesSlantEqual;": '\U0000227C', + "PrecedesTilde;": '\U0000227E', + "Prime;": '\U00002033', + "Product;": '\U0000220F', + "Proportion;": '\U00002237', + "Proportional;": '\U0000221D', + "Pscr;": '\U0001D4AB', + "Psi;": '\U000003A8', + "QUOT;": '\U00000022', + "Qfr;": '\U0001D514', + "Qopf;": '\U0000211A', + "Qscr;": '\U0001D4AC', + "RBarr;": '\U00002910', + "REG;": '\U000000AE', + "Racute;": '\U00000154', + "Rang;": '\U000027EB', + "Rarr;": '\U000021A0', + "Rarrtl;": '\U00002916', + "Rcaron;": '\U00000158', + "Rcedil;": '\U00000156', + "Rcy;": '\U00000420', + "Re;": '\U0000211C', + "ReverseElement;": '\U0000220B', + "ReverseEquilibrium;": '\U000021CB', + "ReverseUpEquilibrium;": '\U0000296F', + "Rfr;": '\U0000211C', + "Rho;": '\U000003A1', + "RightAngleBracket;": '\U000027E9', + "RightArrow;": '\U00002192', + "RightArrowBar;": '\U000021E5', + "RightArrowLeftArrow;": '\U000021C4', + "RightCeiling;": '\U00002309', + "RightDoubleBracket;": '\U000027E7', + "RightDownTeeVector;": '\U0000295D', + "RightDownVector;": '\U000021C2', + "RightDownVectorBar;": '\U00002955', + "RightFloor;": '\U0000230B', + "RightTee;": '\U000022A2', + "RightTeeArrow;": '\U000021A6', + "RightTeeVector;": '\U0000295B', + "RightTriangle;": '\U000022B3', + "RightTriangleBar;": '\U000029D0', + "RightTriangleEqual;": '\U000022B5', + "RightUpDownVector;": '\U0000294F', + "RightUpTeeVector;": '\U0000295C', + "RightUpVector;": '\U000021BE', + "RightUpVectorBar;": '\U00002954', + "RightVector;": '\U000021C0', + "RightVectorBar;": '\U00002953', + "Rightarrow;": '\U000021D2', + "Ropf;": '\U0000211D', + "RoundImplies;": '\U00002970', + "Rrightarrow;": '\U000021DB', + "Rscr;": '\U0000211B', + "Rsh;": '\U000021B1', + "RuleDelayed;": '\U000029F4', + "SHCHcy;": '\U00000429', + "SHcy;": '\U00000428', + "SOFTcy;": '\U0000042C', + "Sacute;": '\U0000015A', + "Sc;": '\U00002ABC', + "Scaron;": '\U00000160', + "Scedil;": '\U0000015E', + "Scirc;": '\U0000015C', + "Scy;": '\U00000421', + "Sfr;": '\U0001D516', + "ShortDownArrow;": '\U00002193', + "ShortLeftArrow;": '\U00002190', + "ShortRightArrow;": '\U00002192', + "ShortUpArrow;": '\U00002191', + "Sigma;": '\U000003A3', + "SmallCircle;": '\U00002218', + "Sopf;": '\U0001D54A', + "Sqrt;": '\U0000221A', + "Square;": '\U000025A1', + "SquareIntersection;": '\U00002293', + "SquareSubset;": '\U0000228F', + "SquareSubsetEqual;": '\U00002291', + "SquareSuperset;": '\U00002290', + "SquareSupersetEqual;": '\U00002292', + "SquareUnion;": '\U00002294', + "Sscr;": '\U0001D4AE', + "Star;": '\U000022C6', + "Sub;": '\U000022D0', + "Subset;": '\U000022D0', + "SubsetEqual;": '\U00002286', + "Succeeds;": '\U0000227B', + "SucceedsEqual;": '\U00002AB0', + "SucceedsSlantEqual;": '\U0000227D', + "SucceedsTilde;": '\U0000227F', + "SuchThat;": '\U0000220B', + "Sum;": '\U00002211', + "Sup;": '\U000022D1', + "Superset;": '\U00002283', + "SupersetEqual;": '\U00002287', + "Supset;": '\U000022D1', + "THORN;": '\U000000DE', + "TRADE;": '\U00002122', + "TSHcy;": '\U0000040B', + "TScy;": '\U00000426', + "Tab;": '\U00000009', + "Tau;": '\U000003A4', + "Tcaron;": '\U00000164', + "Tcedil;": '\U00000162', + "Tcy;": '\U00000422', + "Tfr;": '\U0001D517', + "Therefore;": '\U00002234', + "Theta;": '\U00000398', + "ThinSpace;": '\U00002009', + "Tilde;": '\U0000223C', + "TildeEqual;": '\U00002243', + "TildeFullEqual;": '\U00002245', + "TildeTilde;": '\U00002248', + "Topf;": '\U0001D54B', + "TripleDot;": '\U000020DB', + "Tscr;": '\U0001D4AF', + "Tstrok;": '\U00000166', + "Uacute;": '\U000000DA', + "Uarr;": '\U0000219F', + "Uarrocir;": '\U00002949', + "Ubrcy;": '\U0000040E', + "Ubreve;": '\U0000016C', + "Ucirc;": '\U000000DB', + "Ucy;": '\U00000423', + "Udblac;": '\U00000170', + "Ufr;": '\U0001D518', + "Ugrave;": '\U000000D9', + "Umacr;": '\U0000016A', + "UnderBar;": '\U0000005F', + "UnderBrace;": '\U000023DF', + "UnderBracket;": '\U000023B5', + "UnderParenthesis;": '\U000023DD', + "Union;": '\U000022C3', + "UnionPlus;": '\U0000228E', + "Uogon;": '\U00000172', + "Uopf;": '\U0001D54C', + "UpArrow;": '\U00002191', + "UpArrowBar;": '\U00002912', + "UpArrowDownArrow;": '\U000021C5', + "UpDownArrow;": '\U00002195', + "UpEquilibrium;": '\U0000296E', + "UpTee;": '\U000022A5', + "UpTeeArrow;": '\U000021A5', + "Uparrow;": '\U000021D1', + "Updownarrow;": '\U000021D5', + "UpperLeftArrow;": '\U00002196', + "UpperRightArrow;": '\U00002197', + "Upsi;": '\U000003D2', + "Upsilon;": '\U000003A5', + "Uring;": '\U0000016E', + "Uscr;": '\U0001D4B0', + "Utilde;": '\U00000168', + "Uuml;": '\U000000DC', + "VDash;": '\U000022AB', + "Vbar;": '\U00002AEB', + "Vcy;": '\U00000412', + "Vdash;": '\U000022A9', + "Vdashl;": '\U00002AE6', + "Vee;": '\U000022C1', + "Verbar;": '\U00002016', + "Vert;": '\U00002016', + "VerticalBar;": '\U00002223', + "VerticalLine;": '\U0000007C', + "VerticalSeparator;": '\U00002758', + "VerticalTilde;": '\U00002240', + "VeryThinSpace;": '\U0000200A', + "Vfr;": '\U0001D519', + "Vopf;": '\U0001D54D', + "Vscr;": '\U0001D4B1', + "Vvdash;": '\U000022AA', + "Wcirc;": '\U00000174', + "Wedge;": '\U000022C0', + "Wfr;": '\U0001D51A', + "Wopf;": '\U0001D54E', + "Wscr;": '\U0001D4B2', + "Xfr;": '\U0001D51B', + "Xi;": '\U0000039E', + "Xopf;": '\U0001D54F', + "Xscr;": '\U0001D4B3', + "YAcy;": '\U0000042F', + "YIcy;": '\U00000407', + "YUcy;": '\U0000042E', + "Yacute;": '\U000000DD', + "Ycirc;": '\U00000176', + "Ycy;": '\U0000042B', + "Yfr;": '\U0001D51C', + "Yopf;": '\U0001D550', + "Yscr;": '\U0001D4B4', + "Yuml;": '\U00000178', + "ZHcy;": '\U00000416', + "Zacute;": '\U00000179', + "Zcaron;": '\U0000017D', + "Zcy;": '\U00000417', + "Zdot;": '\U0000017B', + "ZeroWidthSpace;": '\U0000200B', + "Zeta;": '\U00000396', + "Zfr;": '\U00002128', + "Zopf;": '\U00002124', + "Zscr;": '\U0001D4B5', + "aacute;": '\U000000E1', + "abreve;": '\U00000103', + "ac;": '\U0000223E', + "acd;": '\U0000223F', + "acirc;": '\U000000E2', + "acute;": '\U000000B4', + "acy;": '\U00000430', + "aelig;": '\U000000E6', + "af;": '\U00002061', + "afr;": '\U0001D51E', + "agrave;": '\U000000E0', + "alefsym;": '\U00002135', + "aleph;": '\U00002135', + "alpha;": '\U000003B1', + "amacr;": '\U00000101', + "amalg;": '\U00002A3F', + "amp;": '\U00000026', + "and;": '\U00002227', + "andand;": '\U00002A55', + "andd;": '\U00002A5C', + "andslope;": '\U00002A58', + "andv;": '\U00002A5A', + "ang;": '\U00002220', + "ange;": '\U000029A4', + "angle;": '\U00002220', + "angmsd;": '\U00002221', + "angmsdaa;": '\U000029A8', + "angmsdab;": '\U000029A9', + "angmsdac;": '\U000029AA', + "angmsdad;": '\U000029AB', + "angmsdae;": '\U000029AC', + "angmsdaf;": '\U000029AD', + "angmsdag;": '\U000029AE', + "angmsdah;": '\U000029AF', + "angrt;": '\U0000221F', + "angrtvb;": '\U000022BE', + "angrtvbd;": '\U0000299D', + "angsph;": '\U00002222', + "angst;": '\U000000C5', + "angzarr;": '\U0000237C', + "aogon;": '\U00000105', + "aopf;": '\U0001D552', + "ap;": '\U00002248', + "apE;": '\U00002A70', + "apacir;": '\U00002A6F', + "ape;": '\U0000224A', + "apid;": '\U0000224B', + "apos;": '\U00000027', + "approx;": '\U00002248', + "approxeq;": '\U0000224A', + "aring;": '\U000000E5', + "ascr;": '\U0001D4B6', + "ast;": '\U0000002A', + "asymp;": '\U00002248', + "asympeq;": '\U0000224D', + "atilde;": '\U000000E3', + "auml;": '\U000000E4', + "awconint;": '\U00002233', + "awint;": '\U00002A11', + "bNot;": '\U00002AED', + "backcong;": '\U0000224C', + "backepsilon;": '\U000003F6', + "backprime;": '\U00002035', + "backsim;": '\U0000223D', + "backsimeq;": '\U000022CD', + "barvee;": '\U000022BD', + "barwed;": '\U00002305', + "barwedge;": '\U00002305', + "bbrk;": '\U000023B5', + "bbrktbrk;": '\U000023B6', + "bcong;": '\U0000224C', + "bcy;": '\U00000431', + "bdquo;": '\U0000201E', + "becaus;": '\U00002235', + "because;": '\U00002235', + "bemptyv;": '\U000029B0', + "bepsi;": '\U000003F6', + "bernou;": '\U0000212C', + "beta;": '\U000003B2', + "beth;": '\U00002136', + "between;": '\U0000226C', + "bfr;": '\U0001D51F', + "bigcap;": '\U000022C2', + "bigcirc;": '\U000025EF', + "bigcup;": '\U000022C3', + "bigodot;": '\U00002A00', + "bigoplus;": '\U00002A01', + "bigotimes;": '\U00002A02', + "bigsqcup;": '\U00002A06', + "bigstar;": '\U00002605', + "bigtriangledown;": '\U000025BD', + "bigtriangleup;": '\U000025B3', + "biguplus;": '\U00002A04', + "bigvee;": '\U000022C1', + "bigwedge;": '\U000022C0', + "bkarow;": '\U0000290D', + "blacklozenge;": '\U000029EB', + "blacksquare;": '\U000025AA', + "blacktriangle;": '\U000025B4', + "blacktriangledown;": '\U000025BE', + "blacktriangleleft;": '\U000025C2', + "blacktriangleright;": '\U000025B8', + "blank;": '\U00002423', + "blk12;": '\U00002592', + "blk14;": '\U00002591', + "blk34;": '\U00002593', + "block;": '\U00002588', + "bnot;": '\U00002310', + "bopf;": '\U0001D553', + "bot;": '\U000022A5', + "bottom;": '\U000022A5', + "bowtie;": '\U000022C8', + "boxDL;": '\U00002557', + "boxDR;": '\U00002554', + "boxDl;": '\U00002556', + "boxDr;": '\U00002553', + "boxH;": '\U00002550', + "boxHD;": '\U00002566', + "boxHU;": '\U00002569', + "boxHd;": '\U00002564', + "boxHu;": '\U00002567', + "boxUL;": '\U0000255D', + "boxUR;": '\U0000255A', + "boxUl;": '\U0000255C', + "boxUr;": '\U00002559', + "boxV;": '\U00002551', + "boxVH;": '\U0000256C', + "boxVL;": '\U00002563', + "boxVR;": '\U00002560', + "boxVh;": '\U0000256B', + "boxVl;": '\U00002562', + "boxVr;": '\U0000255F', + "boxbox;": '\U000029C9', + "boxdL;": '\U00002555', + "boxdR;": '\U00002552', + "boxdl;": '\U00002510', + "boxdr;": '\U0000250C', + "boxh;": '\U00002500', + "boxhD;": '\U00002565', + "boxhU;": '\U00002568', + "boxhd;": '\U0000252C', + "boxhu;": '\U00002534', + "boxminus;": '\U0000229F', + "boxplus;": '\U0000229E', + "boxtimes;": '\U000022A0', + "boxuL;": '\U0000255B', + "boxuR;": '\U00002558', + "boxul;": '\U00002518', + "boxur;": '\U00002514', + "boxv;": '\U00002502', + "boxvH;": '\U0000256A', + "boxvL;": '\U00002561', + "boxvR;": '\U0000255E', + "boxvh;": '\U0000253C', + "boxvl;": '\U00002524', + "boxvr;": '\U0000251C', + "bprime;": '\U00002035', + "breve;": '\U000002D8', + "brvbar;": '\U000000A6', + "bscr;": '\U0001D4B7', + "bsemi;": '\U0000204F', + "bsim;": '\U0000223D', + "bsime;": '\U000022CD', + "bsol;": '\U0000005C', + "bsolb;": '\U000029C5', + "bsolhsub;": '\U000027C8', + "bull;": '\U00002022', + "bullet;": '\U00002022', + "bump;": '\U0000224E', + "bumpE;": '\U00002AAE', + "bumpe;": '\U0000224F', + "bumpeq;": '\U0000224F', + "cacute;": '\U00000107', + "cap;": '\U00002229', + "capand;": '\U00002A44', + "capbrcup;": '\U00002A49', + "capcap;": '\U00002A4B', + "capcup;": '\U00002A47', + "capdot;": '\U00002A40', + "caret;": '\U00002041', + "caron;": '\U000002C7', + "ccaps;": '\U00002A4D', + "ccaron;": '\U0000010D', + "ccedil;": '\U000000E7', + "ccirc;": '\U00000109', + "ccups;": '\U00002A4C', + "ccupssm;": '\U00002A50', + "cdot;": '\U0000010B', + "cedil;": '\U000000B8', + "cemptyv;": '\U000029B2', + "cent;": '\U000000A2', + "centerdot;": '\U000000B7', + "cfr;": '\U0001D520', + "chcy;": '\U00000447', + "check;": '\U00002713', + "checkmark;": '\U00002713', + "chi;": '\U000003C7', + "cir;": '\U000025CB', + "cirE;": '\U000029C3', + "circ;": '\U000002C6', + "circeq;": '\U00002257', + "circlearrowleft;": '\U000021BA', + "circlearrowright;": '\U000021BB', + "circledR;": '\U000000AE', + "circledS;": '\U000024C8', + "circledast;": '\U0000229B', + "circledcirc;": '\U0000229A', + "circleddash;": '\U0000229D', + "cire;": '\U00002257', + "cirfnint;": '\U00002A10', + "cirmid;": '\U00002AEF', + "cirscir;": '\U000029C2', + "clubs;": '\U00002663', + "clubsuit;": '\U00002663', + "colon;": '\U0000003A', + "colone;": '\U00002254', + "coloneq;": '\U00002254', + "comma;": '\U0000002C', + "commat;": '\U00000040', + "comp;": '\U00002201', + "compfn;": '\U00002218', + "complement;": '\U00002201', + "complexes;": '\U00002102', + "cong;": '\U00002245', + "congdot;": '\U00002A6D', + "conint;": '\U0000222E', + "copf;": '\U0001D554', + "coprod;": '\U00002210', + "copy;": '\U000000A9', + "copysr;": '\U00002117', + "crarr;": '\U000021B5', + "cross;": '\U00002717', + "cscr;": '\U0001D4B8', + "csub;": '\U00002ACF', + "csube;": '\U00002AD1', + "csup;": '\U00002AD0', + "csupe;": '\U00002AD2', + "ctdot;": '\U000022EF', + "cudarrl;": '\U00002938', + "cudarrr;": '\U00002935', + "cuepr;": '\U000022DE', + "cuesc;": '\U000022DF', + "cularr;": '\U000021B6', + "cularrp;": '\U0000293D', + "cup;": '\U0000222A', + "cupbrcap;": '\U00002A48', + "cupcap;": '\U00002A46', + "cupcup;": '\U00002A4A', + "cupdot;": '\U0000228D', + "cupor;": '\U00002A45', + "curarr;": '\U000021B7', + "curarrm;": '\U0000293C', + "curlyeqprec;": '\U000022DE', + "curlyeqsucc;": '\U000022DF', + "curlyvee;": '\U000022CE', + "curlywedge;": '\U000022CF', + "curren;": '\U000000A4', + "curvearrowleft;": '\U000021B6', + "curvearrowright;": '\U000021B7', + "cuvee;": '\U000022CE', + "cuwed;": '\U000022CF', + "cwconint;": '\U00002232', + "cwint;": '\U00002231', + "cylcty;": '\U0000232D', + "dArr;": '\U000021D3', + "dHar;": '\U00002965', + "dagger;": '\U00002020', + "daleth;": '\U00002138', + "darr;": '\U00002193', + "dash;": '\U00002010', + "dashv;": '\U000022A3', + "dbkarow;": '\U0000290F', + "dblac;": '\U000002DD', + "dcaron;": '\U0000010F', + "dcy;": '\U00000434', + "dd;": '\U00002146', + "ddagger;": '\U00002021', + "ddarr;": '\U000021CA', + "ddotseq;": '\U00002A77', + "deg;": '\U000000B0', + "delta;": '\U000003B4', + "demptyv;": '\U000029B1', + "dfisht;": '\U0000297F', + "dfr;": '\U0001D521', + "dharl;": '\U000021C3', + "dharr;": '\U000021C2', + "diam;": '\U000022C4', + "diamond;": '\U000022C4', + "diamondsuit;": '\U00002666', + "diams;": '\U00002666', + "die;": '\U000000A8', + "digamma;": '\U000003DD', + "disin;": '\U000022F2', + "div;": '\U000000F7', + "divide;": '\U000000F7', + "divideontimes;": '\U000022C7', + "divonx;": '\U000022C7', + "djcy;": '\U00000452', + "dlcorn;": '\U0000231E', + "dlcrop;": '\U0000230D', + "dollar;": '\U00000024', + "dopf;": '\U0001D555', + "dot;": '\U000002D9', + "doteq;": '\U00002250', + "doteqdot;": '\U00002251', + "dotminus;": '\U00002238', + "dotplus;": '\U00002214', + "dotsquare;": '\U000022A1', + "doublebarwedge;": '\U00002306', + "downarrow;": '\U00002193', + "downdownarrows;": '\U000021CA', + "downharpoonleft;": '\U000021C3', + "downharpoonright;": '\U000021C2', + "drbkarow;": '\U00002910', + "drcorn;": '\U0000231F', + "drcrop;": '\U0000230C', + "dscr;": '\U0001D4B9', + "dscy;": '\U00000455', + "dsol;": '\U000029F6', + "dstrok;": '\U00000111', + "dtdot;": '\U000022F1', + "dtri;": '\U000025BF', + "dtrif;": '\U000025BE', + "duarr;": '\U000021F5', + "duhar;": '\U0000296F', + "dwangle;": '\U000029A6', + "dzcy;": '\U0000045F', + "dzigrarr;": '\U000027FF', + "eDDot;": '\U00002A77', + "eDot;": '\U00002251', + "eacute;": '\U000000E9', + "easter;": '\U00002A6E', + "ecaron;": '\U0000011B', + "ecir;": '\U00002256', + "ecirc;": '\U000000EA', + "ecolon;": '\U00002255', + "ecy;": '\U0000044D', + "edot;": '\U00000117', + "ee;": '\U00002147', + "efDot;": '\U00002252', + "efr;": '\U0001D522', + "eg;": '\U00002A9A', + "egrave;": '\U000000E8', + "egs;": '\U00002A96', + "egsdot;": '\U00002A98', + "el;": '\U00002A99', + "elinters;": '\U000023E7', + "ell;": '\U00002113', + "els;": '\U00002A95', + "elsdot;": '\U00002A97', + "emacr;": '\U00000113', + "empty;": '\U00002205', + "emptyset;": '\U00002205', + "emptyv;": '\U00002205', + "emsp;": '\U00002003', + "emsp13;": '\U00002004', + "emsp14;": '\U00002005', + "eng;": '\U0000014B', + "ensp;": '\U00002002', + "eogon;": '\U00000119', + "eopf;": '\U0001D556', + "epar;": '\U000022D5', + "eparsl;": '\U000029E3', + "eplus;": '\U00002A71', + "epsi;": '\U000003B5', + "epsilon;": '\U000003B5', + "epsiv;": '\U000003F5', + "eqcirc;": '\U00002256', + "eqcolon;": '\U00002255', + "eqsim;": '\U00002242', + "eqslantgtr;": '\U00002A96', + "eqslantless;": '\U00002A95', + "equals;": '\U0000003D', + "equest;": '\U0000225F', + "equiv;": '\U00002261', + "equivDD;": '\U00002A78', + "eqvparsl;": '\U000029E5', + "erDot;": '\U00002253', + "erarr;": '\U00002971', + "escr;": '\U0000212F', + "esdot;": '\U00002250', + "esim;": '\U00002242', + "eta;": '\U000003B7', + "eth;": '\U000000F0', + "euml;": '\U000000EB', + "euro;": '\U000020AC', + "excl;": '\U00000021', + "exist;": '\U00002203', + "expectation;": '\U00002130', + "exponentiale;": '\U00002147', + "fallingdotseq;": '\U00002252', + "fcy;": '\U00000444', + "female;": '\U00002640', + "ffilig;": '\U0000FB03', + "fflig;": '\U0000FB00', + "ffllig;": '\U0000FB04', + "ffr;": '\U0001D523', + "filig;": '\U0000FB01', + "flat;": '\U0000266D', + "fllig;": '\U0000FB02', + "fltns;": '\U000025B1', + "fnof;": '\U00000192', + "fopf;": '\U0001D557', + "forall;": '\U00002200', + "fork;": '\U000022D4', + "forkv;": '\U00002AD9', + "fpartint;": '\U00002A0D', + "frac12;": '\U000000BD', + "frac13;": '\U00002153', + "frac14;": '\U000000BC', + "frac15;": '\U00002155', + "frac16;": '\U00002159', + "frac18;": '\U0000215B', + "frac23;": '\U00002154', + "frac25;": '\U00002156', + "frac34;": '\U000000BE', + "frac35;": '\U00002157', + "frac38;": '\U0000215C', + "frac45;": '\U00002158', + "frac56;": '\U0000215A', + "frac58;": '\U0000215D', + "frac78;": '\U0000215E', + "frasl;": '\U00002044', + "frown;": '\U00002322', + "fscr;": '\U0001D4BB', + "gE;": '\U00002267', + "gEl;": '\U00002A8C', + "gacute;": '\U000001F5', + "gamma;": '\U000003B3', + "gammad;": '\U000003DD', + "gap;": '\U00002A86', + "gbreve;": '\U0000011F', + "gcirc;": '\U0000011D', + "gcy;": '\U00000433', + "gdot;": '\U00000121', + "ge;": '\U00002265', + "gel;": '\U000022DB', + "geq;": '\U00002265', + "geqq;": '\U00002267', + "geqslant;": '\U00002A7E', + "ges;": '\U00002A7E', + "gescc;": '\U00002AA9', + "gesdot;": '\U00002A80', + "gesdoto;": '\U00002A82', + "gesdotol;": '\U00002A84', + "gesles;": '\U00002A94', + "gfr;": '\U0001D524', + "gg;": '\U0000226B', + "ggg;": '\U000022D9', + "gimel;": '\U00002137', + "gjcy;": '\U00000453', + "gl;": '\U00002277', + "glE;": '\U00002A92', + "gla;": '\U00002AA5', + "glj;": '\U00002AA4', + "gnE;": '\U00002269', + "gnap;": '\U00002A8A', + "gnapprox;": '\U00002A8A', + "gne;": '\U00002A88', + "gneq;": '\U00002A88', + "gneqq;": '\U00002269', + "gnsim;": '\U000022E7', + "gopf;": '\U0001D558', + "grave;": '\U00000060', + "gscr;": '\U0000210A', + "gsim;": '\U00002273', + "gsime;": '\U00002A8E', + "gsiml;": '\U00002A90', + "gt;": '\U0000003E', + "gtcc;": '\U00002AA7', + "gtcir;": '\U00002A7A', + "gtdot;": '\U000022D7', + "gtlPar;": '\U00002995', + "gtquest;": '\U00002A7C', + "gtrapprox;": '\U00002A86', + "gtrarr;": '\U00002978', + "gtrdot;": '\U000022D7', + "gtreqless;": '\U000022DB', + "gtreqqless;": '\U00002A8C', + "gtrless;": '\U00002277', + "gtrsim;": '\U00002273', + "hArr;": '\U000021D4', + "hairsp;": '\U0000200A', + "half;": '\U000000BD', + "hamilt;": '\U0000210B', + "hardcy;": '\U0000044A', + "harr;": '\U00002194', + "harrcir;": '\U00002948', + "harrw;": '\U000021AD', + "hbar;": '\U0000210F', + "hcirc;": '\U00000125', + "hearts;": '\U00002665', + "heartsuit;": '\U00002665', + "hellip;": '\U00002026', + "hercon;": '\U000022B9', + "hfr;": '\U0001D525', + "hksearow;": '\U00002925', + "hkswarow;": '\U00002926', + "hoarr;": '\U000021FF', + "homtht;": '\U0000223B', + "hookleftarrow;": '\U000021A9', + "hookrightarrow;": '\U000021AA', + "hopf;": '\U0001D559', + "horbar;": '\U00002015', + "hscr;": '\U0001D4BD', + "hslash;": '\U0000210F', + "hstrok;": '\U00000127', + "hybull;": '\U00002043', + "hyphen;": '\U00002010', + "iacute;": '\U000000ED', + "ic;": '\U00002063', + "icirc;": '\U000000EE', + "icy;": '\U00000438', + "iecy;": '\U00000435', + "iexcl;": '\U000000A1', + "iff;": '\U000021D4', + "ifr;": '\U0001D526', + "igrave;": '\U000000EC', + "ii;": '\U00002148', + "iiiint;": '\U00002A0C', + "iiint;": '\U0000222D', + "iinfin;": '\U000029DC', + "iiota;": '\U00002129', + "ijlig;": '\U00000133', + "imacr;": '\U0000012B', + "image;": '\U00002111', + "imagline;": '\U00002110', + "imagpart;": '\U00002111', + "imath;": '\U00000131', + "imof;": '\U000022B7', + "imped;": '\U000001B5', + "in;": '\U00002208', + "incare;": '\U00002105', + "infin;": '\U0000221E', + "infintie;": '\U000029DD', + "inodot;": '\U00000131', + "int;": '\U0000222B', + "intcal;": '\U000022BA', + "integers;": '\U00002124', + "intercal;": '\U000022BA', + "intlarhk;": '\U00002A17', + "intprod;": '\U00002A3C', + "iocy;": '\U00000451', + "iogon;": '\U0000012F', + "iopf;": '\U0001D55A', + "iota;": '\U000003B9', + "iprod;": '\U00002A3C', + "iquest;": '\U000000BF', + "iscr;": '\U0001D4BE', + "isin;": '\U00002208', + "isinE;": '\U000022F9', + "isindot;": '\U000022F5', + "isins;": '\U000022F4', + "isinsv;": '\U000022F3', + "isinv;": '\U00002208', + "it;": '\U00002062', + "itilde;": '\U00000129', + "iukcy;": '\U00000456', + "iuml;": '\U000000EF', + "jcirc;": '\U00000135', + "jcy;": '\U00000439', + "jfr;": '\U0001D527', + "jmath;": '\U00000237', + "jopf;": '\U0001D55B', + "jscr;": '\U0001D4BF', + "jsercy;": '\U00000458', + "jukcy;": '\U00000454', + "kappa;": '\U000003BA', + "kappav;": '\U000003F0', + "kcedil;": '\U00000137', + "kcy;": '\U0000043A', + "kfr;": '\U0001D528', + "kgreen;": '\U00000138', + "khcy;": '\U00000445', + "kjcy;": '\U0000045C', + "kopf;": '\U0001D55C', + "kscr;": '\U0001D4C0', + "lAarr;": '\U000021DA', + "lArr;": '\U000021D0', + "lAtail;": '\U0000291B', + "lBarr;": '\U0000290E', + "lE;": '\U00002266', + "lEg;": '\U00002A8B', + "lHar;": '\U00002962', + "lacute;": '\U0000013A', + "laemptyv;": '\U000029B4', + "lagran;": '\U00002112', + "lambda;": '\U000003BB', + "lang;": '\U000027E8', + "langd;": '\U00002991', + "langle;": '\U000027E8', + "lap;": '\U00002A85', + "laquo;": '\U000000AB', + "larr;": '\U00002190', + "larrb;": '\U000021E4', + "larrbfs;": '\U0000291F', + "larrfs;": '\U0000291D', + "larrhk;": '\U000021A9', + "larrlp;": '\U000021AB', + "larrpl;": '\U00002939', + "larrsim;": '\U00002973', + "larrtl;": '\U000021A2', + "lat;": '\U00002AAB', + "latail;": '\U00002919', + "late;": '\U00002AAD', + "lbarr;": '\U0000290C', + "lbbrk;": '\U00002772', + "lbrace;": '\U0000007B', + "lbrack;": '\U0000005B', + "lbrke;": '\U0000298B', + "lbrksld;": '\U0000298F', + "lbrkslu;": '\U0000298D', + "lcaron;": '\U0000013E', + "lcedil;": '\U0000013C', + "lceil;": '\U00002308', + "lcub;": '\U0000007B', + "lcy;": '\U0000043B', + "ldca;": '\U00002936', + "ldquo;": '\U0000201C', + "ldquor;": '\U0000201E', + "ldrdhar;": '\U00002967', + "ldrushar;": '\U0000294B', + "ldsh;": '\U000021B2', + "le;": '\U00002264', + "leftarrow;": '\U00002190', + "leftarrowtail;": '\U000021A2', + "leftharpoondown;": '\U000021BD', + "leftharpoonup;": '\U000021BC', + "leftleftarrows;": '\U000021C7', + "leftrightarrow;": '\U00002194', + "leftrightarrows;": '\U000021C6', + "leftrightharpoons;": '\U000021CB', + "leftrightsquigarrow;": '\U000021AD', + "leftthreetimes;": '\U000022CB', + "leg;": '\U000022DA', + "leq;": '\U00002264', + "leqq;": '\U00002266', + "leqslant;": '\U00002A7D', + "les;": '\U00002A7D', + "lescc;": '\U00002AA8', + "lesdot;": '\U00002A7F', + "lesdoto;": '\U00002A81', + "lesdotor;": '\U00002A83', + "lesges;": '\U00002A93', + "lessapprox;": '\U00002A85', + "lessdot;": '\U000022D6', + "lesseqgtr;": '\U000022DA', + "lesseqqgtr;": '\U00002A8B', + "lessgtr;": '\U00002276', + "lesssim;": '\U00002272', + "lfisht;": '\U0000297C', + "lfloor;": '\U0000230A', + "lfr;": '\U0001D529', + "lg;": '\U00002276', + "lgE;": '\U00002A91', + "lhard;": '\U000021BD', + "lharu;": '\U000021BC', + "lharul;": '\U0000296A', + "lhblk;": '\U00002584', + "ljcy;": '\U00000459', + "ll;": '\U0000226A', + "llarr;": '\U000021C7', + "llcorner;": '\U0000231E', + "llhard;": '\U0000296B', + "lltri;": '\U000025FA', + "lmidot;": '\U00000140', + "lmoust;": '\U000023B0', + "lmoustache;": '\U000023B0', + "lnE;": '\U00002268', + "lnap;": '\U00002A89', + "lnapprox;": '\U00002A89', + "lne;": '\U00002A87', + "lneq;": '\U00002A87', + "lneqq;": '\U00002268', + "lnsim;": '\U000022E6', + "loang;": '\U000027EC', + "loarr;": '\U000021FD', + "lobrk;": '\U000027E6', + "longleftarrow;": '\U000027F5', + "longleftrightarrow;": '\U000027F7', + "longmapsto;": '\U000027FC', + "longrightarrow;": '\U000027F6', + "looparrowleft;": '\U000021AB', + "looparrowright;": '\U000021AC', + "lopar;": '\U00002985', + "lopf;": '\U0001D55D', + "loplus;": '\U00002A2D', + "lotimes;": '\U00002A34', + "lowast;": '\U00002217', + "lowbar;": '\U0000005F', + "loz;": '\U000025CA', + "lozenge;": '\U000025CA', + "lozf;": '\U000029EB', + "lpar;": '\U00000028', + "lparlt;": '\U00002993', + "lrarr;": '\U000021C6', + "lrcorner;": '\U0000231F', + "lrhar;": '\U000021CB', + "lrhard;": '\U0000296D', + "lrm;": '\U0000200E', + "lrtri;": '\U000022BF', + "lsaquo;": '\U00002039', + "lscr;": '\U0001D4C1', + "lsh;": '\U000021B0', + "lsim;": '\U00002272', + "lsime;": '\U00002A8D', + "lsimg;": '\U00002A8F', + "lsqb;": '\U0000005B', + "lsquo;": '\U00002018', + "lsquor;": '\U0000201A', + "lstrok;": '\U00000142', + "lt;": '\U0000003C', + "ltcc;": '\U00002AA6', + "ltcir;": '\U00002A79', + "ltdot;": '\U000022D6', + "lthree;": '\U000022CB', + "ltimes;": '\U000022C9', + "ltlarr;": '\U00002976', + "ltquest;": '\U00002A7B', + "ltrPar;": '\U00002996', + "ltri;": '\U000025C3', + "ltrie;": '\U000022B4', + "ltrif;": '\U000025C2', + "lurdshar;": '\U0000294A', + "luruhar;": '\U00002966', + "mDDot;": '\U0000223A', + "macr;": '\U000000AF', + "male;": '\U00002642', + "malt;": '\U00002720', + "maltese;": '\U00002720', + "map;": '\U000021A6', + "mapsto;": '\U000021A6', + "mapstodown;": '\U000021A7', + "mapstoleft;": '\U000021A4', + "mapstoup;": '\U000021A5', + "marker;": '\U000025AE', + "mcomma;": '\U00002A29', + "mcy;": '\U0000043C', + "mdash;": '\U00002014', + "measuredangle;": '\U00002221', + "mfr;": '\U0001D52A', + "mho;": '\U00002127', + "micro;": '\U000000B5', + "mid;": '\U00002223', + "midast;": '\U0000002A', + "midcir;": '\U00002AF0', + "middot;": '\U000000B7', + "minus;": '\U00002212', + "minusb;": '\U0000229F', + "minusd;": '\U00002238', + "minusdu;": '\U00002A2A', + "mlcp;": '\U00002ADB', + "mldr;": '\U00002026', + "mnplus;": '\U00002213', + "models;": '\U000022A7', + "mopf;": '\U0001D55E', + "mp;": '\U00002213', + "mscr;": '\U0001D4C2', + "mstpos;": '\U0000223E', + "mu;": '\U000003BC', + "multimap;": '\U000022B8', + "mumap;": '\U000022B8', + "nLeftarrow;": '\U000021CD', + "nLeftrightarrow;": '\U000021CE', + "nRightarrow;": '\U000021CF', + "nVDash;": '\U000022AF', + "nVdash;": '\U000022AE', + "nabla;": '\U00002207', + "nacute;": '\U00000144', + "nap;": '\U00002249', + "napos;": '\U00000149', + "napprox;": '\U00002249', + "natur;": '\U0000266E', + "natural;": '\U0000266E', + "naturals;": '\U00002115', + "nbsp;": '\U000000A0', + "ncap;": '\U00002A43', + "ncaron;": '\U00000148', + "ncedil;": '\U00000146', + "ncong;": '\U00002247', + "ncup;": '\U00002A42', + "ncy;": '\U0000043D', + "ndash;": '\U00002013', + "ne;": '\U00002260', + "neArr;": '\U000021D7', + "nearhk;": '\U00002924', + "nearr;": '\U00002197', + "nearrow;": '\U00002197', + "nequiv;": '\U00002262', + "nesear;": '\U00002928', + "nexist;": '\U00002204', + "nexists;": '\U00002204', + "nfr;": '\U0001D52B', + "nge;": '\U00002271', + "ngeq;": '\U00002271', + "ngsim;": '\U00002275', + "ngt;": '\U0000226F', + "ngtr;": '\U0000226F', + "nhArr;": '\U000021CE', + "nharr;": '\U000021AE', + "nhpar;": '\U00002AF2', + "ni;": '\U0000220B', + "nis;": '\U000022FC', + "nisd;": '\U000022FA', + "niv;": '\U0000220B', + "njcy;": '\U0000045A', + "nlArr;": '\U000021CD', + "nlarr;": '\U0000219A', + "nldr;": '\U00002025', + "nle;": '\U00002270', + "nleftarrow;": '\U0000219A', + "nleftrightarrow;": '\U000021AE', + "nleq;": '\U00002270', + "nless;": '\U0000226E', + "nlsim;": '\U00002274', + "nlt;": '\U0000226E', + "nltri;": '\U000022EA', + "nltrie;": '\U000022EC', + "nmid;": '\U00002224', + "nopf;": '\U0001D55F', + "not;": '\U000000AC', + "notin;": '\U00002209', + "notinva;": '\U00002209', + "notinvb;": '\U000022F7', + "notinvc;": '\U000022F6', + "notni;": '\U0000220C', + "notniva;": '\U0000220C', + "notnivb;": '\U000022FE', + "notnivc;": '\U000022FD', + "npar;": '\U00002226', + "nparallel;": '\U00002226', + "npolint;": '\U00002A14', + "npr;": '\U00002280', + "nprcue;": '\U000022E0', + "nprec;": '\U00002280', + "nrArr;": '\U000021CF', + "nrarr;": '\U0000219B', + "nrightarrow;": '\U0000219B', + "nrtri;": '\U000022EB', + "nrtrie;": '\U000022ED', + "nsc;": '\U00002281', + "nsccue;": '\U000022E1', + "nscr;": '\U0001D4C3', + "nshortmid;": '\U00002224', + "nshortparallel;": '\U00002226', + "nsim;": '\U00002241', + "nsime;": '\U00002244', + "nsimeq;": '\U00002244', + "nsmid;": '\U00002224', + "nspar;": '\U00002226', + "nsqsube;": '\U000022E2', + "nsqsupe;": '\U000022E3', + "nsub;": '\U00002284', + "nsube;": '\U00002288', + "nsubseteq;": '\U00002288', + "nsucc;": '\U00002281', + "nsup;": '\U00002285', + "nsupe;": '\U00002289', + "nsupseteq;": '\U00002289', + "ntgl;": '\U00002279', + "ntilde;": '\U000000F1', + "ntlg;": '\U00002278', + "ntriangleleft;": '\U000022EA', + "ntrianglelefteq;": '\U000022EC', + "ntriangleright;": '\U000022EB', + "ntrianglerighteq;": '\U000022ED', + "nu;": '\U000003BD', + "num;": '\U00000023', + "numero;": '\U00002116', + "numsp;": '\U00002007', + "nvDash;": '\U000022AD', + "nvHarr;": '\U00002904', + "nvdash;": '\U000022AC', + "nvinfin;": '\U000029DE', + "nvlArr;": '\U00002902', + "nvrArr;": '\U00002903', + "nwArr;": '\U000021D6', + "nwarhk;": '\U00002923', + "nwarr;": '\U00002196', + "nwarrow;": '\U00002196', + "nwnear;": '\U00002927', + "oS;": '\U000024C8', + "oacute;": '\U000000F3', + "oast;": '\U0000229B', + "ocir;": '\U0000229A', + "ocirc;": '\U000000F4', + "ocy;": '\U0000043E', + "odash;": '\U0000229D', + "odblac;": '\U00000151', + "odiv;": '\U00002A38', + "odot;": '\U00002299', + "odsold;": '\U000029BC', + "oelig;": '\U00000153', + "ofcir;": '\U000029BF', + "ofr;": '\U0001D52C', + "ogon;": '\U000002DB', + "ograve;": '\U000000F2', + "ogt;": '\U000029C1', + "ohbar;": '\U000029B5', + "ohm;": '\U000003A9', + "oint;": '\U0000222E', + "olarr;": '\U000021BA', + "olcir;": '\U000029BE', + "olcross;": '\U000029BB', + "oline;": '\U0000203E', + "olt;": '\U000029C0', + "omacr;": '\U0000014D', + "omega;": '\U000003C9', + "omicron;": '\U000003BF', + "omid;": '\U000029B6', + "ominus;": '\U00002296', + "oopf;": '\U0001D560', + "opar;": '\U000029B7', + "operp;": '\U000029B9', + "oplus;": '\U00002295', + "or;": '\U00002228', + "orarr;": '\U000021BB', + "ord;": '\U00002A5D', + "order;": '\U00002134', + "orderof;": '\U00002134', + "ordf;": '\U000000AA', + "ordm;": '\U000000BA', + "origof;": '\U000022B6', + "oror;": '\U00002A56', + "orslope;": '\U00002A57', + "orv;": '\U00002A5B', + "oscr;": '\U00002134', + "oslash;": '\U000000F8', + "osol;": '\U00002298', + "otilde;": '\U000000F5', + "otimes;": '\U00002297', + "otimesas;": '\U00002A36', + "ouml;": '\U000000F6', + "ovbar;": '\U0000233D', + "par;": '\U00002225', + "para;": '\U000000B6', + "parallel;": '\U00002225', + "parsim;": '\U00002AF3', + "parsl;": '\U00002AFD', + "part;": '\U00002202', + "pcy;": '\U0000043F', + "percnt;": '\U00000025', + "period;": '\U0000002E', + "permil;": '\U00002030', + "perp;": '\U000022A5', + "pertenk;": '\U00002031', + "pfr;": '\U0001D52D', + "phi;": '\U000003C6', + "phiv;": '\U000003D5', + "phmmat;": '\U00002133', + "phone;": '\U0000260E', + "pi;": '\U000003C0', + "pitchfork;": '\U000022D4', + "piv;": '\U000003D6', + "planck;": '\U0000210F', + "planckh;": '\U0000210E', + "plankv;": '\U0000210F', + "plus;": '\U0000002B', + "plusacir;": '\U00002A23', + "plusb;": '\U0000229E', + "pluscir;": '\U00002A22', + "plusdo;": '\U00002214', + "plusdu;": '\U00002A25', + "pluse;": '\U00002A72', + "plusmn;": '\U000000B1', + "plussim;": '\U00002A26', + "plustwo;": '\U00002A27', + "pm;": '\U000000B1', + "pointint;": '\U00002A15', + "popf;": '\U0001D561', + "pound;": '\U000000A3', + "pr;": '\U0000227A', + "prE;": '\U00002AB3', + "prap;": '\U00002AB7', + "prcue;": '\U0000227C', + "pre;": '\U00002AAF', + "prec;": '\U0000227A', + "precapprox;": '\U00002AB7', + "preccurlyeq;": '\U0000227C', + "preceq;": '\U00002AAF', + "precnapprox;": '\U00002AB9', + "precneqq;": '\U00002AB5', + "precnsim;": '\U000022E8', + "precsim;": '\U0000227E', + "prime;": '\U00002032', + "primes;": '\U00002119', + "prnE;": '\U00002AB5', + "prnap;": '\U00002AB9', + "prnsim;": '\U000022E8', + "prod;": '\U0000220F', + "profalar;": '\U0000232E', + "profline;": '\U00002312', + "profsurf;": '\U00002313', + "prop;": '\U0000221D', + "propto;": '\U0000221D', + "prsim;": '\U0000227E', + "prurel;": '\U000022B0', + "pscr;": '\U0001D4C5', + "psi;": '\U000003C8', + "puncsp;": '\U00002008', + "qfr;": '\U0001D52E', + "qint;": '\U00002A0C', + "qopf;": '\U0001D562', + "qprime;": '\U00002057', + "qscr;": '\U0001D4C6', + "quaternions;": '\U0000210D', + "quatint;": '\U00002A16', + "quest;": '\U0000003F', + "questeq;": '\U0000225F', + "quot;": '\U00000022', + "rAarr;": '\U000021DB', + "rArr;": '\U000021D2', + "rAtail;": '\U0000291C', + "rBarr;": '\U0000290F', + "rHar;": '\U00002964', + "racute;": '\U00000155', + "radic;": '\U0000221A', + "raemptyv;": '\U000029B3', + "rang;": '\U000027E9', + "rangd;": '\U00002992', + "range;": '\U000029A5', + "rangle;": '\U000027E9', + "raquo;": '\U000000BB', + "rarr;": '\U00002192', + "rarrap;": '\U00002975', + "rarrb;": '\U000021E5', + "rarrbfs;": '\U00002920', + "rarrc;": '\U00002933', + "rarrfs;": '\U0000291E', + "rarrhk;": '\U000021AA', + "rarrlp;": '\U000021AC', + "rarrpl;": '\U00002945', + "rarrsim;": '\U00002974', + "rarrtl;": '\U000021A3', + "rarrw;": '\U0000219D', + "ratail;": '\U0000291A', + "ratio;": '\U00002236', + "rationals;": '\U0000211A', + "rbarr;": '\U0000290D', + "rbbrk;": '\U00002773', + "rbrace;": '\U0000007D', + "rbrack;": '\U0000005D', + "rbrke;": '\U0000298C', + "rbrksld;": '\U0000298E', + "rbrkslu;": '\U00002990', + "rcaron;": '\U00000159', + "rcedil;": '\U00000157', + "rceil;": '\U00002309', + "rcub;": '\U0000007D', + "rcy;": '\U00000440', + "rdca;": '\U00002937', + "rdldhar;": '\U00002969', + "rdquo;": '\U0000201D', + "rdquor;": '\U0000201D', + "rdsh;": '\U000021B3', + "real;": '\U0000211C', + "realine;": '\U0000211B', + "realpart;": '\U0000211C', + "reals;": '\U0000211D', + "rect;": '\U000025AD', + "reg;": '\U000000AE', + "rfisht;": '\U0000297D', + "rfloor;": '\U0000230B', + "rfr;": '\U0001D52F', + "rhard;": '\U000021C1', + "rharu;": '\U000021C0', + "rharul;": '\U0000296C', + "rho;": '\U000003C1', + "rhov;": '\U000003F1', + "rightarrow;": '\U00002192', + "rightarrowtail;": '\U000021A3', + "rightharpoondown;": '\U000021C1', + "rightharpoonup;": '\U000021C0', + "rightleftarrows;": '\U000021C4', + "rightleftharpoons;": '\U000021CC', + "rightrightarrows;": '\U000021C9', + "rightsquigarrow;": '\U0000219D', + "rightthreetimes;": '\U000022CC', + "ring;": '\U000002DA', + "risingdotseq;": '\U00002253', + "rlarr;": '\U000021C4', + "rlhar;": '\U000021CC', + "rlm;": '\U0000200F', + "rmoust;": '\U000023B1', + "rmoustache;": '\U000023B1', + "rnmid;": '\U00002AEE', + "roang;": '\U000027ED', + "roarr;": '\U000021FE', + "robrk;": '\U000027E7', + "ropar;": '\U00002986', + "ropf;": '\U0001D563', + "roplus;": '\U00002A2E', + "rotimes;": '\U00002A35', + "rpar;": '\U00000029', + "rpargt;": '\U00002994', + "rppolint;": '\U00002A12', + "rrarr;": '\U000021C9', + "rsaquo;": '\U0000203A', + "rscr;": '\U0001D4C7', + "rsh;": '\U000021B1', + "rsqb;": '\U0000005D', + "rsquo;": '\U00002019', + "rsquor;": '\U00002019', + "rthree;": '\U000022CC', + "rtimes;": '\U000022CA', + "rtri;": '\U000025B9', + "rtrie;": '\U000022B5', + "rtrif;": '\U000025B8', + "rtriltri;": '\U000029CE', + "ruluhar;": '\U00002968', + "rx;": '\U0000211E', + "sacute;": '\U0000015B', + "sbquo;": '\U0000201A', + "sc;": '\U0000227B', + "scE;": '\U00002AB4', + "scap;": '\U00002AB8', + "scaron;": '\U00000161', + "sccue;": '\U0000227D', + "sce;": '\U00002AB0', + "scedil;": '\U0000015F', + "scirc;": '\U0000015D', + "scnE;": '\U00002AB6', + "scnap;": '\U00002ABA', + "scnsim;": '\U000022E9', + "scpolint;": '\U00002A13', + "scsim;": '\U0000227F', + "scy;": '\U00000441', + "sdot;": '\U000022C5', + "sdotb;": '\U000022A1', + "sdote;": '\U00002A66', + "seArr;": '\U000021D8', + "searhk;": '\U00002925', + "searr;": '\U00002198', + "searrow;": '\U00002198', + "sect;": '\U000000A7', + "semi;": '\U0000003B', + "seswar;": '\U00002929', + "setminus;": '\U00002216', + "setmn;": '\U00002216', + "sext;": '\U00002736', + "sfr;": '\U0001D530', + "sfrown;": '\U00002322', + "sharp;": '\U0000266F', + "shchcy;": '\U00000449', + "shcy;": '\U00000448', + "shortmid;": '\U00002223', + "shortparallel;": '\U00002225', + "shy;": '\U000000AD', + "sigma;": '\U000003C3', + "sigmaf;": '\U000003C2', + "sigmav;": '\U000003C2', + "sim;": '\U0000223C', + "simdot;": '\U00002A6A', + "sime;": '\U00002243', + "simeq;": '\U00002243', + "simg;": '\U00002A9E', + "simgE;": '\U00002AA0', + "siml;": '\U00002A9D', + "simlE;": '\U00002A9F', + "simne;": '\U00002246', + "simplus;": '\U00002A24', + "simrarr;": '\U00002972', + "slarr;": '\U00002190', + "smallsetminus;": '\U00002216', + "smashp;": '\U00002A33', + "smeparsl;": '\U000029E4', + "smid;": '\U00002223', + "smile;": '\U00002323', + "smt;": '\U00002AAA', + "smte;": '\U00002AAC', + "softcy;": '\U0000044C', + "sol;": '\U0000002F', + "solb;": '\U000029C4', + "solbar;": '\U0000233F', + "sopf;": '\U0001D564', + "spades;": '\U00002660', + "spadesuit;": '\U00002660', + "spar;": '\U00002225', + "sqcap;": '\U00002293', + "sqcup;": '\U00002294', + "sqsub;": '\U0000228F', + "sqsube;": '\U00002291', + "sqsubset;": '\U0000228F', + "sqsubseteq;": '\U00002291', + "sqsup;": '\U00002290', + "sqsupe;": '\U00002292', + "sqsupset;": '\U00002290', + "sqsupseteq;": '\U00002292', + "squ;": '\U000025A1', + "square;": '\U000025A1', + "squarf;": '\U000025AA', + "squf;": '\U000025AA', + "srarr;": '\U00002192', + "sscr;": '\U0001D4C8', + "ssetmn;": '\U00002216', + "ssmile;": '\U00002323', + "sstarf;": '\U000022C6', + "star;": '\U00002606', + "starf;": '\U00002605', + "straightepsilon;": '\U000003F5', + "straightphi;": '\U000003D5', + "strns;": '\U000000AF', + "sub;": '\U00002282', + "subE;": '\U00002AC5', + "subdot;": '\U00002ABD', + "sube;": '\U00002286', + "subedot;": '\U00002AC3', + "submult;": '\U00002AC1', + "subnE;": '\U00002ACB', + "subne;": '\U0000228A', + "subplus;": '\U00002ABF', + "subrarr;": '\U00002979', + "subset;": '\U00002282', + "subseteq;": '\U00002286', + "subseteqq;": '\U00002AC5', + "subsetneq;": '\U0000228A', + "subsetneqq;": '\U00002ACB', + "subsim;": '\U00002AC7', + "subsub;": '\U00002AD5', + "subsup;": '\U00002AD3', + "succ;": '\U0000227B', + "succapprox;": '\U00002AB8', + "succcurlyeq;": '\U0000227D', + "succeq;": '\U00002AB0', + "succnapprox;": '\U00002ABA', + "succneqq;": '\U00002AB6', + "succnsim;": '\U000022E9', + "succsim;": '\U0000227F', + "sum;": '\U00002211', + "sung;": '\U0000266A', + "sup;": '\U00002283', + "sup1;": '\U000000B9', + "sup2;": '\U000000B2', + "sup3;": '\U000000B3', + "supE;": '\U00002AC6', + "supdot;": '\U00002ABE', + "supdsub;": '\U00002AD8', + "supe;": '\U00002287', + "supedot;": '\U00002AC4', + "suphsol;": '\U000027C9', + "suphsub;": '\U00002AD7', + "suplarr;": '\U0000297B', + "supmult;": '\U00002AC2', + "supnE;": '\U00002ACC', + "supne;": '\U0000228B', + "supplus;": '\U00002AC0', + "supset;": '\U00002283', + "supseteq;": '\U00002287', + "supseteqq;": '\U00002AC6', + "supsetneq;": '\U0000228B', + "supsetneqq;": '\U00002ACC', + "supsim;": '\U00002AC8', + "supsub;": '\U00002AD4', + "supsup;": '\U00002AD6', + "swArr;": '\U000021D9', + "swarhk;": '\U00002926', + "swarr;": '\U00002199', + "swarrow;": '\U00002199', + "swnwar;": '\U0000292A', + "szlig;": '\U000000DF', + "target;": '\U00002316', + "tau;": '\U000003C4', + "tbrk;": '\U000023B4', + "tcaron;": '\U00000165', + "tcedil;": '\U00000163', + "tcy;": '\U00000442', + "tdot;": '\U000020DB', + "telrec;": '\U00002315', + "tfr;": '\U0001D531', + "there4;": '\U00002234', + "therefore;": '\U00002234', + "theta;": '\U000003B8', + "thetasym;": '\U000003D1', + "thetav;": '\U000003D1', + "thickapprox;": '\U00002248', + "thicksim;": '\U0000223C', + "thinsp;": '\U00002009', + "thkap;": '\U00002248', + "thksim;": '\U0000223C', + "thorn;": '\U000000FE', + "tilde;": '\U000002DC', + "times;": '\U000000D7', + "timesb;": '\U000022A0', + "timesbar;": '\U00002A31', + "timesd;": '\U00002A30', + "tint;": '\U0000222D', + "toea;": '\U00002928', + "top;": '\U000022A4', + "topbot;": '\U00002336', + "topcir;": '\U00002AF1', + "topf;": '\U0001D565', + "topfork;": '\U00002ADA', + "tosa;": '\U00002929', + "tprime;": '\U00002034', + "trade;": '\U00002122', + "triangle;": '\U000025B5', + "triangledown;": '\U000025BF', + "triangleleft;": '\U000025C3', + "trianglelefteq;": '\U000022B4', + "triangleq;": '\U0000225C', + "triangleright;": '\U000025B9', + "trianglerighteq;": '\U000022B5', + "tridot;": '\U000025EC', + "trie;": '\U0000225C', + "triminus;": '\U00002A3A', + "triplus;": '\U00002A39', + "trisb;": '\U000029CD', + "tritime;": '\U00002A3B', + "trpezium;": '\U000023E2', + "tscr;": '\U0001D4C9', + "tscy;": '\U00000446', + "tshcy;": '\U0000045B', + "tstrok;": '\U00000167', + "twixt;": '\U0000226C', + "twoheadleftarrow;": '\U0000219E', + "twoheadrightarrow;": '\U000021A0', + "uArr;": '\U000021D1', + "uHar;": '\U00002963', + "uacute;": '\U000000FA', + "uarr;": '\U00002191', + "ubrcy;": '\U0000045E', + "ubreve;": '\U0000016D', + "ucirc;": '\U000000FB', + "ucy;": '\U00000443', + "udarr;": '\U000021C5', + "udblac;": '\U00000171', + "udhar;": '\U0000296E', + "ufisht;": '\U0000297E', + "ufr;": '\U0001D532', + "ugrave;": '\U000000F9', + "uharl;": '\U000021BF', + "uharr;": '\U000021BE', + "uhblk;": '\U00002580', + "ulcorn;": '\U0000231C', + "ulcorner;": '\U0000231C', + "ulcrop;": '\U0000230F', + "ultri;": '\U000025F8', + "umacr;": '\U0000016B', + "uml;": '\U000000A8', + "uogon;": '\U00000173', + "uopf;": '\U0001D566', + "uparrow;": '\U00002191', + "updownarrow;": '\U00002195', + "upharpoonleft;": '\U000021BF', + "upharpoonright;": '\U000021BE', + "uplus;": '\U0000228E', + "upsi;": '\U000003C5', + "upsih;": '\U000003D2', + "upsilon;": '\U000003C5', + "upuparrows;": '\U000021C8', + "urcorn;": '\U0000231D', + "urcorner;": '\U0000231D', + "urcrop;": '\U0000230E', + "uring;": '\U0000016F', + "urtri;": '\U000025F9', + "uscr;": '\U0001D4CA', + "utdot;": '\U000022F0', + "utilde;": '\U00000169', + "utri;": '\U000025B5', + "utrif;": '\U000025B4', + "uuarr;": '\U000021C8', + "uuml;": '\U000000FC', + "uwangle;": '\U000029A7', + "vArr;": '\U000021D5', + "vBar;": '\U00002AE8', + "vBarv;": '\U00002AE9', + "vDash;": '\U000022A8', + "vangrt;": '\U0000299C', + "varepsilon;": '\U000003F5', + "varkappa;": '\U000003F0', + "varnothing;": '\U00002205', + "varphi;": '\U000003D5', + "varpi;": '\U000003D6', + "varpropto;": '\U0000221D', + "varr;": '\U00002195', + "varrho;": '\U000003F1', + "varsigma;": '\U000003C2', + "vartheta;": '\U000003D1', + "vartriangleleft;": '\U000022B2', + "vartriangleright;": '\U000022B3', + "vcy;": '\U00000432', + "vdash;": '\U000022A2', + "vee;": '\U00002228', + "veebar;": '\U000022BB', + "veeeq;": '\U0000225A', + "vellip;": '\U000022EE', + "verbar;": '\U0000007C', + "vert;": '\U0000007C', + "vfr;": '\U0001D533', + "vltri;": '\U000022B2', + "vopf;": '\U0001D567', + "vprop;": '\U0000221D', + "vrtri;": '\U000022B3', + "vscr;": '\U0001D4CB', + "vzigzag;": '\U0000299A', + "wcirc;": '\U00000175', + "wedbar;": '\U00002A5F', + "wedge;": '\U00002227', + "wedgeq;": '\U00002259', + "weierp;": '\U00002118', + "wfr;": '\U0001D534', + "wopf;": '\U0001D568', + "wp;": '\U00002118', + "wr;": '\U00002240', + "wreath;": '\U00002240', + "wscr;": '\U0001D4CC', + "xcap;": '\U000022C2', + "xcirc;": '\U000025EF', + "xcup;": '\U000022C3', + "xdtri;": '\U000025BD', + "xfr;": '\U0001D535', + "xhArr;": '\U000027FA', + "xharr;": '\U000027F7', + "xi;": '\U000003BE', + "xlArr;": '\U000027F8', + "xlarr;": '\U000027F5', + "xmap;": '\U000027FC', + "xnis;": '\U000022FB', + "xodot;": '\U00002A00', + "xopf;": '\U0001D569', + "xoplus;": '\U00002A01', + "xotime;": '\U00002A02', + "xrArr;": '\U000027F9', + "xrarr;": '\U000027F6', + "xscr;": '\U0001D4CD', + "xsqcup;": '\U00002A06', + "xuplus;": '\U00002A04', + "xutri;": '\U000025B3', + "xvee;": '\U000022C1', + "xwedge;": '\U000022C0', + "yacute;": '\U000000FD', + "yacy;": '\U0000044F', + "ycirc;": '\U00000177', + "ycy;": '\U0000044B', + "yen;": '\U000000A5', + "yfr;": '\U0001D536', + "yicy;": '\U00000457', + "yopf;": '\U0001D56A', + "yscr;": '\U0001D4CE', + "yucy;": '\U0000044E', + "yuml;": '\U000000FF', + "zacute;": '\U0000017A', + "zcaron;": '\U0000017E', + "zcy;": '\U00000437', + "zdot;": '\U0000017C', + "zeetrf;": '\U00002128', + "zeta;": '\U000003B6', + "zfr;": '\U0001D537', + "zhcy;": '\U00000436', + "zigrarr;": '\U000021DD', + "zopf;": '\U0001D56B', + "zscr;": '\U0001D4CF', + "zwj;": '\U0000200D', + "zwnj;": '\U0000200C', + "AElig": '\U000000C6', + "AMP": '\U00000026', + "Aacute": '\U000000C1', + "Acirc": '\U000000C2', + "Agrave": '\U000000C0', + "Aring": '\U000000C5', + "Atilde": '\U000000C3', + "Auml": '\U000000C4', + "COPY": '\U000000A9', + "Ccedil": '\U000000C7', + "ETH": '\U000000D0', + "Eacute": '\U000000C9', + "Ecirc": '\U000000CA', + "Egrave": '\U000000C8', + "Euml": '\U000000CB', + "GT": '\U0000003E', + "Iacute": '\U000000CD', + "Icirc": '\U000000CE', + "Igrave": '\U000000CC', + "Iuml": '\U000000CF', + "LT": '\U0000003C', + "Ntilde": '\U000000D1', + "Oacute": '\U000000D3', + "Ocirc": '\U000000D4', + "Ograve": '\U000000D2', + "Oslash": '\U000000D8', + "Otilde": '\U000000D5', + "Ouml": '\U000000D6', + "QUOT": '\U00000022', + "REG": '\U000000AE', + "THORN": '\U000000DE', + "Uacute": '\U000000DA', + "Ucirc": '\U000000DB', + "Ugrave": '\U000000D9', + "Uuml": '\U000000DC', + "Yacute": '\U000000DD', + "aacute": '\U000000E1', + "acirc": '\U000000E2', + "acute": '\U000000B4', + "aelig": '\U000000E6', + "agrave": '\U000000E0', + "amp": '\U00000026', + "aring": '\U000000E5', + "atilde": '\U000000E3', + "auml": '\U000000E4', + "brvbar": '\U000000A6', + "ccedil": '\U000000E7', + "cedil": '\U000000B8', + "cent": '\U000000A2', + "copy": '\U000000A9', + "curren": '\U000000A4', + "deg": '\U000000B0', + "divide": '\U000000F7', + "eacute": '\U000000E9', + "ecirc": '\U000000EA', + "egrave": '\U000000E8', + "eth": '\U000000F0', + "euml": '\U000000EB', + "frac12": '\U000000BD', + "frac14": '\U000000BC', + "frac34": '\U000000BE', + "gt": '\U0000003E', + "iacute": '\U000000ED', + "icirc": '\U000000EE', + "iexcl": '\U000000A1', + "igrave": '\U000000EC', + "iquest": '\U000000BF', + "iuml": '\U000000EF', + "laquo": '\U000000AB', + "lt": '\U0000003C', + "macr": '\U000000AF', + "micro": '\U000000B5', + "middot": '\U000000B7', + "nbsp": '\U000000A0', + "not": '\U000000AC', + "ntilde": '\U000000F1', + "oacute": '\U000000F3', + "ocirc": '\U000000F4', + "ograve": '\U000000F2', + "ordf": '\U000000AA', + "ordm": '\U000000BA', + "oslash": '\U000000F8', + "otilde": '\U000000F5', + "ouml": '\U000000F6', + "para": '\U000000B6', + "plusmn": '\U000000B1', + "pound": '\U000000A3', + "quot": '\U00000022', + "raquo": '\U000000BB', + "reg": '\U000000AE', + "sect": '\U000000A7', + "shy": '\U000000AD', + "sup1": '\U000000B9', + "sup2": '\U000000B2', + "sup3": '\U000000B3', + "szlig": '\U000000DF', + "thorn": '\U000000FE', + "times": '\U000000D7', + "uacute": '\U000000FA', + "ucirc": '\U000000FB', + "ugrave": '\U000000F9', + "uml": '\U000000A8', + "uuml": '\U000000FC', + "yacute": '\U000000FD', + "yen": '\U000000A5', + "yuml": '\U000000FF', +} + +// HTML entities that are two unicode codepoints. +var entity2 = map[string][2]rune{ + // TODO(nigeltao): Handle replacements that are wider than their names. + // "nLt;": {'\u226A', '\u20D2'}, + // "nGt;": {'\u226B', '\u20D2'}, + "NotEqualTilde;": {'\u2242', '\u0338'}, + "NotGreaterFullEqual;": {'\u2267', '\u0338'}, + "NotGreaterGreater;": {'\u226B', '\u0338'}, + "NotGreaterSlantEqual;": {'\u2A7E', '\u0338'}, + "NotHumpDownHump;": {'\u224E', '\u0338'}, + "NotHumpEqual;": {'\u224F', '\u0338'}, + "NotLeftTriangleBar;": {'\u29CF', '\u0338'}, + "NotLessLess;": {'\u226A', '\u0338'}, + "NotLessSlantEqual;": {'\u2A7D', '\u0338'}, + "NotNestedGreaterGreater;": {'\u2AA2', '\u0338'}, + "NotNestedLessLess;": {'\u2AA1', '\u0338'}, + "NotPrecedesEqual;": {'\u2AAF', '\u0338'}, + "NotRightTriangleBar;": {'\u29D0', '\u0338'}, + "NotSquareSubset;": {'\u228F', '\u0338'}, + "NotSquareSuperset;": {'\u2290', '\u0338'}, + "NotSubset;": {'\u2282', '\u20D2'}, + "NotSucceedsEqual;": {'\u2AB0', '\u0338'}, + "NotSucceedsTilde;": {'\u227F', '\u0338'}, + "NotSuperset;": {'\u2283', '\u20D2'}, + "ThickSpace;": {'\u205F', '\u200A'}, + "acE;": {'\u223E', '\u0333'}, + "bne;": {'\u003D', '\u20E5'}, + "bnequiv;": {'\u2261', '\u20E5'}, + "caps;": {'\u2229', '\uFE00'}, + "cups;": {'\u222A', '\uFE00'}, + "fjlig;": {'\u0066', '\u006A'}, + "gesl;": {'\u22DB', '\uFE00'}, + "gvertneqq;": {'\u2269', '\uFE00'}, + "gvnE;": {'\u2269', '\uFE00'}, + "lates;": {'\u2AAD', '\uFE00'}, + "lesg;": {'\u22DA', '\uFE00'}, + "lvertneqq;": {'\u2268', '\uFE00'}, + "lvnE;": {'\u2268', '\uFE00'}, + "nGg;": {'\u22D9', '\u0338'}, + "nGtv;": {'\u226B', '\u0338'}, + "nLl;": {'\u22D8', '\u0338'}, + "nLtv;": {'\u226A', '\u0338'}, + "nang;": {'\u2220', '\u20D2'}, + "napE;": {'\u2A70', '\u0338'}, + "napid;": {'\u224B', '\u0338'}, + "nbump;": {'\u224E', '\u0338'}, + "nbumpe;": {'\u224F', '\u0338'}, + "ncongdot;": {'\u2A6D', '\u0338'}, + "nedot;": {'\u2250', '\u0338'}, + "nesim;": {'\u2242', '\u0338'}, + "ngE;": {'\u2267', '\u0338'}, + "ngeqq;": {'\u2267', '\u0338'}, + "ngeqslant;": {'\u2A7E', '\u0338'}, + "nges;": {'\u2A7E', '\u0338'}, + "nlE;": {'\u2266', '\u0338'}, + "nleqq;": {'\u2266', '\u0338'}, + "nleqslant;": {'\u2A7D', '\u0338'}, + "nles;": {'\u2A7D', '\u0338'}, + "notinE;": {'\u22F9', '\u0338'}, + "notindot;": {'\u22F5', '\u0338'}, + "nparsl;": {'\u2AFD', '\u20E5'}, + "npart;": {'\u2202', '\u0338'}, + "npre;": {'\u2AAF', '\u0338'}, + "npreceq;": {'\u2AAF', '\u0338'}, + "nrarrc;": {'\u2933', '\u0338'}, + "nrarrw;": {'\u219D', '\u0338'}, + "nsce;": {'\u2AB0', '\u0338'}, + "nsubE;": {'\u2AC5', '\u0338'}, + "nsubset;": {'\u2282', '\u20D2'}, + "nsubseteqq;": {'\u2AC5', '\u0338'}, + "nsucceq;": {'\u2AB0', '\u0338'}, + "nsupE;": {'\u2AC6', '\u0338'}, + "nsupset;": {'\u2283', '\u20D2'}, + "nsupseteqq;": {'\u2AC6', '\u0338'}, + "nvap;": {'\u224D', '\u20D2'}, + "nvge;": {'\u2265', '\u20D2'}, + "nvgt;": {'\u003E', '\u20D2'}, + "nvle;": {'\u2264', '\u20D2'}, + "nvlt;": {'\u003C', '\u20D2'}, + "nvltrie;": {'\u22B4', '\u20D2'}, + "nvrtrie;": {'\u22B5', '\u20D2'}, + "nvsim;": {'\u223C', '\u20D2'}, + "race;": {'\u223D', '\u0331'}, + "smtes;": {'\u2AAC', '\uFE00'}, + "sqcaps;": {'\u2293', '\uFE00'}, + "sqcups;": {'\u2294', '\uFE00'}, + "varsubsetneq;": {'\u228A', '\uFE00'}, + "varsubsetneqq;": {'\u2ACB', '\uFE00'}, + "varsupsetneq;": {'\u228B', '\uFE00'}, + "varsupsetneqq;": {'\u2ACC', '\uFE00'}, + "vnsub;": {'\u2282', '\u20D2'}, + "vnsup;": {'\u2283', '\u20D2'}, + "vsubnE;": {'\u2ACB', '\uFE00'}, + "vsubne;": {'\u228A', '\uFE00'}, + "vsupnE;": {'\u2ACC', '\uFE00'}, + "vsupne;": {'\u228B', '\uFE00'}, +} diff --git a/api/vendor/golang.org/x/net/html/entity_test.go b/api/vendor/golang.org/x/net/html/entity_test.go new file mode 100644 index 0000000..b53f866 --- /dev/null +++ b/api/vendor/golang.org/x/net/html/entity_test.go @@ -0,0 +1,29 @@ +// 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 html + +import ( + "testing" + "unicode/utf8" +) + +func TestEntityLength(t *testing.T) { + // We verify that the length of UTF-8 encoding of each value is <= 1 + len(key). + // The +1 comes from the leading "&". This property implies that the length of + // unescaped text is <= the length of escaped text. + for k, v := range entity { + if 1+len(k) < utf8.RuneLen(v) { + t.Error("escaped entity &" + k + " is shorter than its UTF-8 encoding " + string(v)) + } + if len(k) > longestEntityWithoutSemicolon && k[len(k)-1] != ';' { + t.Errorf("entity name %s is %d characters, but longestEntityWithoutSemicolon=%d", k, len(k), longestEntityWithoutSemicolon) + } + } + for k, v := range entity2 { + if 1+len(k) < utf8.RuneLen(v[0])+utf8.RuneLen(v[1]) { + t.Error("escaped entity &" + k + " is shorter than its UTF-8 encoding " + string(v[0]) + string(v[1])) + } + } +} diff --git a/api/vendor/golang.org/x/net/html/escape.go b/api/vendor/golang.org/x/net/html/escape.go new file mode 100644 index 0000000..d856139 --- /dev/null +++ b/api/vendor/golang.org/x/net/html/escape.go @@ -0,0 +1,258 @@ +// 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 html + +import ( + "bytes" + "strings" + "unicode/utf8" +) + +// These replacements permit compatibility with old numeric entities that +// assumed Windows-1252 encoding. +// https://html.spec.whatwg.org/multipage/syntax.html#consume-a-character-reference +var replacementTable = [...]rune{ + '\u20AC', // First entry is what 0x80 should be replaced with. + '\u0081', + '\u201A', + '\u0192', + '\u201E', + '\u2026', + '\u2020', + '\u2021', + '\u02C6', + '\u2030', + '\u0160', + '\u2039', + '\u0152', + '\u008D', + '\u017D', + '\u008F', + '\u0090', + '\u2018', + '\u2019', + '\u201C', + '\u201D', + '\u2022', + '\u2013', + '\u2014', + '\u02DC', + '\u2122', + '\u0161', + '\u203A', + '\u0153', + '\u009D', + '\u017E', + '\u0178', // Last entry is 0x9F. + // 0x00->'\uFFFD' is handled programmatically. + // 0x0D->'\u000D' is a no-op. +} + +// unescapeEntity reads an entity like "<" from b[src:] and writes the +// corresponding "<" to b[dst:], returning the incremented dst and src cursors. +// Precondition: b[src] == '&' && dst <= src. +// attribute should be true if parsing an attribute value. +func unescapeEntity(b []byte, dst, src int, attribute bool) (dst1, src1 int) { + // https://html.spec.whatwg.org/multipage/syntax.html#consume-a-character-reference + + // i starts at 1 because we already know that s[0] == '&'. + i, s := 1, b[src:] + + if len(s) <= 1 { + b[dst] = b[src] + return dst + 1, src + 1 + } + + if s[i] == '#' { + if len(s) <= 3 { // We need to have at least "&#.". + b[dst] = b[src] + return dst + 1, src + 1 + } + i++ + c := s[i] + hex := false + if c == 'x' || c == 'X' { + hex = true + i++ + } + + x := '\x00' + for i < len(s) { + c = s[i] + i++ + if hex { + if '0' <= c && c <= '9' { + x = 16*x + rune(c) - '0' + continue + } else if 'a' <= c && c <= 'f' { + x = 16*x + rune(c) - 'a' + 10 + continue + } else if 'A' <= c && c <= 'F' { + x = 16*x + rune(c) - 'A' + 10 + continue + } + } else if '0' <= c && c <= '9' { + x = 10*x + rune(c) - '0' + continue + } + if c != ';' { + i-- + } + break + } + + if i <= 3 { // No characters matched. + b[dst] = b[src] + return dst + 1, src + 1 + } + + if 0x80 <= x && x <= 0x9F { + // Replace characters from Windows-1252 with UTF-8 equivalents. + x = replacementTable[x-0x80] + } else if x == 0 || (0xD800 <= x && x <= 0xDFFF) || x > 0x10FFFF { + // Replace invalid characters with the replacement character. + x = '\uFFFD' + } + + return dst + utf8.EncodeRune(b[dst:], x), src + i + } + + // Consume the maximum number of characters possible, with the + // consumed characters matching one of the named references. + + for i < len(s) { + c := s[i] + i++ + // Lower-cased characters are more common in entities, so we check for them first. + if 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || '0' <= c && c <= '9' { + continue + } + if c != ';' { + i-- + } + break + } + + entityName := string(s[1:i]) + if entityName == "" { + // No-op. + } else if attribute && entityName[len(entityName)-1] != ';' && len(s) > i && s[i] == '=' { + // No-op. + } else if x := entity[entityName]; x != 0 { + return dst + utf8.EncodeRune(b[dst:], x), src + i + } else if x := entity2[entityName]; x[0] != 0 { + dst1 := dst + utf8.EncodeRune(b[dst:], x[0]) + return dst1 + utf8.EncodeRune(b[dst1:], x[1]), src + i + } else if !attribute { + maxLen := len(entityName) - 1 + if maxLen > longestEntityWithoutSemicolon { + maxLen = longestEntityWithoutSemicolon + } + for j := maxLen; j > 1; j-- { + if x := entity[entityName[:j]]; x != 0 { + return dst + utf8.EncodeRune(b[dst:], x), src + j + 1 + } + } + } + + dst1, src1 = dst+i, src+i + copy(b[dst:dst1], b[src:src1]) + return dst1, src1 +} + +// unescape unescapes b's entities in-place, so that "a<b" becomes "a': + esc = ">" + case '"': + // """ is shorter than """. + esc = """ + case '\r': + esc = " " + default: + panic("unrecognized escape character") + } + s = s[i+1:] + if _, err := w.WriteString(esc); err != nil { + return err + } + i = strings.IndexAny(s, escapedChars) + } + _, err := w.WriteString(s) + return err +} + +// EscapeString escapes special characters like "<" to become "<". It +// escapes only five such characters: <, >, &, ' and ". +// UnescapeString(EscapeString(s)) == s always holds, but the converse isn't +// always true. +func EscapeString(s string) string { + if strings.IndexAny(s, escapedChars) == -1 { + return s + } + var buf bytes.Buffer + escape(&buf, s) + return buf.String() +} + +// UnescapeString unescapes entities like "<" to become "<". It unescapes a +// larger range of entities than EscapeString escapes. For example, "á" +// unescapes to "á", as does "á" and "&xE1;". +// UnescapeString(EscapeString(s)) == s always holds, but the converse isn't +// always true. +func UnescapeString(s string) string { + for _, c := range s { + if c == '&' { + return string(unescape([]byte(s), false)) + } + } + return s +} diff --git a/api/vendor/golang.org/x/net/html/escape_test.go b/api/vendor/golang.org/x/net/html/escape_test.go new file mode 100644 index 0000000..b405d4b --- /dev/null +++ b/api/vendor/golang.org/x/net/html/escape_test.go @@ -0,0 +1,97 @@ +// 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 html + +import "testing" + +type unescapeTest struct { + // A short description of the test case. + desc string + // The HTML text. + html string + // The unescaped text. + unescaped string +} + +var unescapeTests = []unescapeTest{ + // Handle no entities. + { + "copy", + "A\ttext\nstring", + "A\ttext\nstring", + }, + // Handle simple named entities. + { + "simple", + "& > <", + "& > <", + }, + // Handle hitting the end of the string. + { + "stringEnd", + "& &", + "& &", + }, + // Handle entities with two codepoints. + { + "multiCodepoint", + "text ⋛︀ blah", + "text \u22db\ufe00 blah", + }, + // Handle decimal numeric entities. + { + "decimalEntity", + "Delta = Δ ", + "Delta = Δ ", + }, + // Handle hexadecimal numeric entities. + { + "hexadecimalEntity", + "Lambda = λ = λ ", + "Lambda = λ = λ ", + }, + // Handle numeric early termination. + { + "numericEnds", + "&# &#x €43 © = ©f = ©", + "&# &#x €43 © = ©f = ©", + }, + // Handle numeric ISO-8859-1 entity replacements. + { + "numericReplacements", + "Footnote‡", + "Footnote‡", + }, +} + +func TestUnescape(t *testing.T) { + for _, tt := range unescapeTests { + unescaped := UnescapeString(tt.html) + if unescaped != tt.unescaped { + t.Errorf("TestUnescape %s: want %q, got %q", tt.desc, tt.unescaped, unescaped) + } + } +} + +func TestUnescapeEscape(t *testing.T) { + ss := []string{ + ``, + `abc def`, + `a & b`, + `a&b`, + `a & b`, + `"`, + `"`, + `"<&>"`, + `"<&>"`, + `3&5==1 && 0<1, "0<1", a+acute=á`, + `The special characters are: <, >, &, ' and "`, + } + for _, s := range ss { + if got := UnescapeString(EscapeString(s)); got != s { + t.Errorf("got %q want %q", got, s) + } + } +} diff --git a/api/vendor/golang.org/x/net/html/example_test.go b/api/vendor/golang.org/x/net/html/example_test.go new file mode 100644 index 0000000..0b06ed7 --- /dev/null +++ b/api/vendor/golang.org/x/net/html/example_test.go @@ -0,0 +1,40 @@ +// 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. + +// This example demonstrates parsing HTML data and walking the resulting tree. +package html_test + +import ( + "fmt" + "log" + "strings" + + "golang.org/x/net/html" +) + +func ExampleParse() { + s := `

    Links:

    ` + doc, err := html.Parse(strings.NewReader(s)) + if err != nil { + log.Fatal(err) + } + var f func(*html.Node) + f = func(n *html.Node) { + if n.Type == html.ElementNode && n.Data == "a" { + for _, a := range n.Attr { + if a.Key == "href" { + fmt.Println(a.Val) + break + } + } + } + for c := n.FirstChild; c != nil; c = c.NextSibling { + f(c) + } + } + f(doc) + // Output: + // foo + // /bar/baz +} diff --git a/api/vendor/golang.org/x/net/html/foreign.go b/api/vendor/golang.org/x/net/html/foreign.go new file mode 100644 index 0000000..01477a9 --- /dev/null +++ b/api/vendor/golang.org/x/net/html/foreign.go @@ -0,0 +1,226 @@ +// 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 html + +import ( + "strings" +) + +func adjustAttributeNames(aa []Attribute, nameMap map[string]string) { + for i := range aa { + if newName, ok := nameMap[aa[i].Key]; ok { + aa[i].Key = newName + } + } +} + +func adjustForeignAttributes(aa []Attribute) { + for i, a := range aa { + if a.Key == "" || a.Key[0] != 'x' { + continue + } + switch a.Key { + case "xlink:actuate", "xlink:arcrole", "xlink:href", "xlink:role", "xlink:show", + "xlink:title", "xlink:type", "xml:base", "xml:lang", "xml:space", "xmlns:xlink": + j := strings.Index(a.Key, ":") + aa[i].Namespace = a.Key[:j] + aa[i].Key = a.Key[j+1:] + } + } +} + +func htmlIntegrationPoint(n *Node) bool { + if n.Type != ElementNode { + return false + } + switch n.Namespace { + case "math": + if n.Data == "annotation-xml" { + for _, a := range n.Attr { + if a.Key == "encoding" { + val := strings.ToLower(a.Val) + if val == "text/html" || val == "application/xhtml+xml" { + return true + } + } + } + } + case "svg": + switch n.Data { + case "desc", "foreignObject", "title": + return true + } + } + return false +} + +func mathMLTextIntegrationPoint(n *Node) bool { + if n.Namespace != "math" { + return false + } + switch n.Data { + case "mi", "mo", "mn", "ms", "mtext": + return true + } + return false +} + +// Section 12.2.6.5. +var breakout = map[string]bool{ + "b": true, + "big": true, + "blockquote": true, + "body": true, + "br": true, + "center": true, + "code": true, + "dd": true, + "div": true, + "dl": true, + "dt": true, + "em": true, + "embed": true, + "h1": true, + "h2": true, + "h3": true, + "h4": true, + "h5": true, + "h6": true, + "head": true, + "hr": true, + "i": true, + "img": true, + "li": true, + "listing": true, + "menu": true, + "meta": true, + "nobr": true, + "ol": true, + "p": true, + "pre": true, + "ruby": true, + "s": true, + "small": true, + "span": true, + "strong": true, + "strike": true, + "sub": true, + "sup": true, + "table": true, + "tt": true, + "u": true, + "ul": true, + "var": true, +} + +// Section 12.2.6.5. +var svgTagNameAdjustments = map[string]string{ + "altglyph": "altGlyph", + "altglyphdef": "altGlyphDef", + "altglyphitem": "altGlyphItem", + "animatecolor": "animateColor", + "animatemotion": "animateMotion", + "animatetransform": "animateTransform", + "clippath": "clipPath", + "feblend": "feBlend", + "fecolormatrix": "feColorMatrix", + "fecomponenttransfer": "feComponentTransfer", + "fecomposite": "feComposite", + "feconvolvematrix": "feConvolveMatrix", + "fediffuselighting": "feDiffuseLighting", + "fedisplacementmap": "feDisplacementMap", + "fedistantlight": "feDistantLight", + "feflood": "feFlood", + "fefunca": "feFuncA", + "fefuncb": "feFuncB", + "fefuncg": "feFuncG", + "fefuncr": "feFuncR", + "fegaussianblur": "feGaussianBlur", + "feimage": "feImage", + "femerge": "feMerge", + "femergenode": "feMergeNode", + "femorphology": "feMorphology", + "feoffset": "feOffset", + "fepointlight": "fePointLight", + "fespecularlighting": "feSpecularLighting", + "fespotlight": "feSpotLight", + "fetile": "feTile", + "feturbulence": "feTurbulence", + "foreignobject": "foreignObject", + "glyphref": "glyphRef", + "lineargradient": "linearGradient", + "radialgradient": "radialGradient", + "textpath": "textPath", +} + +// Section 12.2.6.1 +var mathMLAttributeAdjustments = map[string]string{ + "definitionurl": "definitionURL", +} + +var svgAttributeAdjustments = map[string]string{ + "attributename": "attributeName", + "attributetype": "attributeType", + "basefrequency": "baseFrequency", + "baseprofile": "baseProfile", + "calcmode": "calcMode", + "clippathunits": "clipPathUnits", + "contentscripttype": "contentScriptType", + "contentstyletype": "contentStyleType", + "diffuseconstant": "diffuseConstant", + "edgemode": "edgeMode", + "externalresourcesrequired": "externalResourcesRequired", + "filterres": "filterRes", + "filterunits": "filterUnits", + "glyphref": "glyphRef", + "gradienttransform": "gradientTransform", + "gradientunits": "gradientUnits", + "kernelmatrix": "kernelMatrix", + "kernelunitlength": "kernelUnitLength", + "keypoints": "keyPoints", + "keysplines": "keySplines", + "keytimes": "keyTimes", + "lengthadjust": "lengthAdjust", + "limitingconeangle": "limitingConeAngle", + "markerheight": "markerHeight", + "markerunits": "markerUnits", + "markerwidth": "markerWidth", + "maskcontentunits": "maskContentUnits", + "maskunits": "maskUnits", + "numoctaves": "numOctaves", + "pathlength": "pathLength", + "patterncontentunits": "patternContentUnits", + "patterntransform": "patternTransform", + "patternunits": "patternUnits", + "pointsatx": "pointsAtX", + "pointsaty": "pointsAtY", + "pointsatz": "pointsAtZ", + "preservealpha": "preserveAlpha", + "preserveaspectratio": "preserveAspectRatio", + "primitiveunits": "primitiveUnits", + "refx": "refX", + "refy": "refY", + "repeatcount": "repeatCount", + "repeatdur": "repeatDur", + "requiredextensions": "requiredExtensions", + "requiredfeatures": "requiredFeatures", + "specularconstant": "specularConstant", + "specularexponent": "specularExponent", + "spreadmethod": "spreadMethod", + "startoffset": "startOffset", + "stddeviation": "stdDeviation", + "stitchtiles": "stitchTiles", + "surfacescale": "surfaceScale", + "systemlanguage": "systemLanguage", + "tablevalues": "tableValues", + "targetx": "targetX", + "targety": "targetY", + "textlength": "textLength", + "viewbox": "viewBox", + "viewtarget": "viewTarget", + "xchannelselector": "xChannelSelector", + "ychannelselector": "yChannelSelector", + "zoomandpan": "zoomAndPan", +} diff --git a/api/vendor/golang.org/x/net/html/node.go b/api/vendor/golang.org/x/net/html/node.go new file mode 100644 index 0000000..2c1cade --- /dev/null +++ b/api/vendor/golang.org/x/net/html/node.go @@ -0,0 +1,220 @@ +// 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 html + +import ( + "golang.org/x/net/html/atom" +) + +// A NodeType is the type of a Node. +type NodeType uint32 + +const ( + ErrorNode NodeType = iota + TextNode + DocumentNode + ElementNode + CommentNode + DoctypeNode + scopeMarkerNode +) + +// Section 12.2.4.3 says "The markers are inserted when entering applet, +// object, marquee, template, td, th, and caption elements, and are used +// to prevent formatting from "leaking" into applet, object, marquee, +// template, td, th, and caption elements". +var scopeMarker = Node{Type: scopeMarkerNode} + +// A Node consists of a NodeType and some Data (tag name for element nodes, +// content for text) and are part of a tree of Nodes. Element nodes may also +// have a Namespace and contain a slice of Attributes. Data is unescaped, so +// that it looks like "a 0 { + return (*s)[i-1] + } + return nil +} + +// index returns the index of the top-most occurrence of n in the stack, or -1 +// if n is not present. +func (s *nodeStack) index(n *Node) int { + for i := len(*s) - 1; i >= 0; i-- { + if (*s)[i] == n { + return i + } + } + return -1 +} + +// contains returns whether a is within s. +func (s *nodeStack) contains(a atom.Atom) bool { + for _, n := range *s { + if n.DataAtom == a { + return true + } + } + return false +} + +// insert inserts a node at the given index. +func (s *nodeStack) insert(i int, n *Node) { + (*s) = append(*s, nil) + copy((*s)[i+1:], (*s)[i:]) + (*s)[i] = n +} + +// remove removes a node from the stack. It is a no-op if n is not present. +func (s *nodeStack) remove(n *Node) { + i := s.index(n) + if i == -1 { + return + } + copy((*s)[i:], (*s)[i+1:]) + j := len(*s) - 1 + (*s)[j] = nil + *s = (*s)[:j] +} + +type insertionModeStack []insertionMode + +func (s *insertionModeStack) pop() (im insertionMode) { + i := len(*s) + im = (*s)[i-1] + *s = (*s)[:i-1] + return im +} + +func (s *insertionModeStack) top() insertionMode { + if i := len(*s); i > 0 { + return (*s)[i-1] + } + return nil +} diff --git a/api/vendor/golang.org/x/net/html/node_test.go b/api/vendor/golang.org/x/net/html/node_test.go new file mode 100644 index 0000000..471102f --- /dev/null +++ b/api/vendor/golang.org/x/net/html/node_test.go @@ -0,0 +1,146 @@ +// 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 html + +import ( + "fmt" +) + +// checkTreeConsistency checks that a node and its descendants are all +// consistent in their parent/child/sibling relationships. +func checkTreeConsistency(n *Node) error { + return checkTreeConsistency1(n, 0) +} + +func checkTreeConsistency1(n *Node, depth int) error { + if depth == 1e4 { + return fmt.Errorf("html: tree looks like it contains a cycle") + } + if err := checkNodeConsistency(n); err != nil { + return err + } + for c := n.FirstChild; c != nil; c = c.NextSibling { + if err := checkTreeConsistency1(c, depth+1); err != nil { + return err + } + } + return nil +} + +// checkNodeConsistency checks that a node's parent/child/sibling relationships +// are consistent. +func checkNodeConsistency(n *Node) error { + if n == nil { + return nil + } + + nParent := 0 + for p := n.Parent; p != nil; p = p.Parent { + nParent++ + if nParent == 1e4 { + return fmt.Errorf("html: parent list looks like an infinite loop") + } + } + + nForward := 0 + for c := n.FirstChild; c != nil; c = c.NextSibling { + nForward++ + if nForward == 1e6 { + return fmt.Errorf("html: forward list of children looks like an infinite loop") + } + if c.Parent != n { + return fmt.Errorf("html: inconsistent child/parent relationship") + } + } + + nBackward := 0 + for c := n.LastChild; c != nil; c = c.PrevSibling { + nBackward++ + if nBackward == 1e6 { + return fmt.Errorf("html: backward list of children looks like an infinite loop") + } + if c.Parent != n { + return fmt.Errorf("html: inconsistent child/parent relationship") + } + } + + if n.Parent != nil { + if n.Parent == n { + return fmt.Errorf("html: inconsistent parent relationship") + } + if n.Parent == n.FirstChild { + return fmt.Errorf("html: inconsistent parent/first relationship") + } + if n.Parent == n.LastChild { + return fmt.Errorf("html: inconsistent parent/last relationship") + } + if n.Parent == n.PrevSibling { + return fmt.Errorf("html: inconsistent parent/prev relationship") + } + if n.Parent == n.NextSibling { + return fmt.Errorf("html: inconsistent parent/next relationship") + } + + parentHasNAsAChild := false + for c := n.Parent.FirstChild; c != nil; c = c.NextSibling { + if c == n { + parentHasNAsAChild = true + break + } + } + if !parentHasNAsAChild { + return fmt.Errorf("html: inconsistent parent/child relationship") + } + } + + if n.PrevSibling != nil && n.PrevSibling.NextSibling != n { + return fmt.Errorf("html: inconsistent prev/next relationship") + } + if n.NextSibling != nil && n.NextSibling.PrevSibling != n { + return fmt.Errorf("html: inconsistent next/prev relationship") + } + + if (n.FirstChild == nil) != (n.LastChild == nil) { + return fmt.Errorf("html: inconsistent first/last relationship") + } + if n.FirstChild != nil && n.FirstChild == n.LastChild { + // We have a sole child. + if n.FirstChild.PrevSibling != nil || n.FirstChild.NextSibling != nil { + return fmt.Errorf("html: inconsistent sole child's sibling relationship") + } + } + + seen := map[*Node]bool{} + + var last *Node + for c := n.FirstChild; c != nil; c = c.NextSibling { + if seen[c] { + return fmt.Errorf("html: inconsistent repeated child") + } + seen[c] = true + last = c + } + if last != n.LastChild { + return fmt.Errorf("html: inconsistent last relationship") + } + + var first *Node + for c := n.LastChild; c != nil; c = c.PrevSibling { + if !seen[c] { + return fmt.Errorf("html: inconsistent missing child") + } + delete(seen, c) + first = c + } + if first != n.FirstChild { + return fmt.Errorf("html: inconsistent first relationship") + } + + if len(seen) != 0 { + return fmt.Errorf("html: inconsistent forwards/backwards child list") + } + + return nil +} diff --git a/api/vendor/golang.org/x/net/html/parse.go b/api/vendor/golang.org/x/net/html/parse.go new file mode 100644 index 0000000..d23e05e --- /dev/null +++ b/api/vendor/golang.org/x/net/html/parse.go @@ -0,0 +1,2305 @@ +// 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 html + +import ( + "errors" + "fmt" + "io" + "strings" + + a "golang.org/x/net/html/atom" +) + +// A parser implements the HTML5 parsing algorithm: +// https://html.spec.whatwg.org/multipage/syntax.html#tree-construction +type parser struct { + // tokenizer provides the tokens for the parser. + tokenizer *Tokenizer + // tok is the most recently read token. + tok Token + // Self-closing tags like
    are treated as start tags, except that + // hasSelfClosingToken is set while they are being processed. + hasSelfClosingToken bool + // doc is the document root element. + doc *Node + // The stack of open elements (section 12.2.4.2) and active formatting + // elements (section 12.2.4.3). + oe, afe nodeStack + // Element pointers (section 12.2.4.4). + head, form *Node + // Other parsing state flags (section 12.2.4.5). + scripting, framesetOK bool + // The stack of template insertion modes + templateStack insertionModeStack + // im is the current insertion mode. + im insertionMode + // originalIM is the insertion mode to go back to after completing a text + // or inTableText insertion mode. + originalIM insertionMode + // fosterParenting is whether new elements should be inserted according to + // the foster parenting rules (section 12.2.6.1). + fosterParenting bool + // quirks is whether the parser is operating in "quirks mode." + quirks bool + // fragment is whether the parser is parsing an HTML fragment. + fragment bool + // context is the context element when parsing an HTML fragment + // (section 12.4). + context *Node +} + +func (p *parser) top() *Node { + if n := p.oe.top(); n != nil { + return n + } + return p.doc +} + +// Stop tags for use in popUntil. These come from section 12.2.4.2. +var ( + defaultScopeStopTags = map[string][]a.Atom{ + "": {a.Applet, a.Caption, a.Html, a.Table, a.Td, a.Th, a.Marquee, a.Object, a.Template}, + "math": {a.AnnotationXml, a.Mi, a.Mn, a.Mo, a.Ms, a.Mtext}, + "svg": {a.Desc, a.ForeignObject, a.Title}, + } +) + +type scope int + +const ( + defaultScope scope = iota + listItemScope + buttonScope + tableScope + tableRowScope + tableBodyScope + selectScope +) + +// popUntil pops the stack of open elements at the highest element whose tag +// is in matchTags, provided there is no higher element in the scope's stop +// tags (as defined in section 12.2.4.2). It returns whether or not there was +// such an element. If there was not, popUntil leaves the stack unchanged. +// +// For example, the set of stop tags for table scope is: "html", "table". If +// the stack was: +// ["html", "body", "font", "table", "b", "i", "u"] +// then popUntil(tableScope, "font") would return false, but +// popUntil(tableScope, "i") would return true and the stack would become: +// ["html", "body", "font", "table", "b"] +// +// If an element's tag is in both the stop tags and matchTags, then the stack +// will be popped and the function returns true (provided, of course, there was +// no higher element in the stack that was also in the stop tags). For example, +// popUntil(tableScope, "table") returns true and leaves: +// ["html", "body", "font"] +func (p *parser) popUntil(s scope, matchTags ...a.Atom) bool { + if i := p.indexOfElementInScope(s, matchTags...); i != -1 { + p.oe = p.oe[:i] + return true + } + return false +} + +// indexOfElementInScope returns the index in p.oe of the highest element whose +// tag is in matchTags that is in scope. If no matching element is in scope, it +// returns -1. +func (p *parser) indexOfElementInScope(s scope, matchTags ...a.Atom) int { + for i := len(p.oe) - 1; i >= 0; i-- { + tagAtom := p.oe[i].DataAtom + if p.oe[i].Namespace == "" { + for _, t := range matchTags { + if t == tagAtom { + return i + } + } + switch s { + case defaultScope: + // No-op. + case listItemScope: + if tagAtom == a.Ol || tagAtom == a.Ul { + return -1 + } + case buttonScope: + if tagAtom == a.Button { + return -1 + } + case tableScope: + if tagAtom == a.Html || tagAtom == a.Table || tagAtom == a.Template { + return -1 + } + case selectScope: + if tagAtom != a.Optgroup && tagAtom != a.Option { + return -1 + } + default: + panic("unreachable") + } + } + switch s { + case defaultScope, listItemScope, buttonScope: + for _, t := range defaultScopeStopTags[p.oe[i].Namespace] { + if t == tagAtom { + return -1 + } + } + } + } + return -1 +} + +// elementInScope is like popUntil, except that it doesn't modify the stack of +// open elements. +func (p *parser) elementInScope(s scope, matchTags ...a.Atom) bool { + return p.indexOfElementInScope(s, matchTags...) != -1 +} + +// clearStackToContext pops elements off the stack of open elements until a +// scope-defined element is found. +func (p *parser) clearStackToContext(s scope) { + for i := len(p.oe) - 1; i >= 0; i-- { + tagAtom := p.oe[i].DataAtom + switch s { + case tableScope: + if tagAtom == a.Html || tagAtom == a.Table || tagAtom == a.Template { + p.oe = p.oe[:i+1] + return + } + case tableRowScope: + if tagAtom == a.Html || tagAtom == a.Tr || tagAtom == a.Template { + p.oe = p.oe[:i+1] + return + } + case tableBodyScope: + if tagAtom == a.Html || tagAtom == a.Tbody || tagAtom == a.Tfoot || tagAtom == a.Thead || tagAtom == a.Template { + p.oe = p.oe[:i+1] + return + } + default: + panic("unreachable") + } + } +} + +// generateImpliedEndTags pops nodes off the stack of open elements as long as +// the top node has a tag name of dd, dt, li, optgroup, option, p, rb, rp, rt or rtc. +// If exceptions are specified, nodes with that name will not be popped off. +func (p *parser) generateImpliedEndTags(exceptions ...string) { + var i int +loop: + for i = len(p.oe) - 1; i >= 0; i-- { + n := p.oe[i] + if n.Type == ElementNode { + switch n.DataAtom { + case a.Dd, a.Dt, a.Li, a.Optgroup, a.Option, a.P, a.Rb, a.Rp, a.Rt, a.Rtc: + for _, except := range exceptions { + if n.Data == except { + break loop + } + } + continue + } + } + break + } + + p.oe = p.oe[:i+1] +} + +// generateAllImpliedEndTags pops nodes off the stack of open elements as long as +// the top node has a tag name of caption, colgroup, dd, div, dt, li, optgroup, option, p, rb, +// rp, rt, rtc, span, tbody, td, tfoot, th, thead or tr. +func (p *parser) generateAllImpliedEndTags() { + var i int + for i = len(p.oe) - 1; i >= 0; i-- { + n := p.oe[i] + if n.Type == ElementNode { + switch n.DataAtom { + // TODO: remove this divergence from the HTML5 spec + case a.Caption, a.Colgroup, a.Dd, a.Div, a.Dt, a.Li, a.Optgroup, a.Option, a.P, a.Rb, + a.Rp, a.Rt, a.Rtc, a.Span, a.Tbody, a.Td, a.Tfoot, a.Th, a.Thead, a.Tr: + continue + } + } + break + } + + p.oe = p.oe[:i+1] +} + +// addChild adds a child node n to the top element, and pushes n onto the stack +// of open elements if it is an element node. +func (p *parser) addChild(n *Node) { + if p.shouldFosterParent() { + p.fosterParent(n) + } else { + p.top().AppendChild(n) + } + + if n.Type == ElementNode { + p.oe = append(p.oe, n) + } +} + +// shouldFosterParent returns whether the next node to be added should be +// foster parented. +func (p *parser) shouldFosterParent() bool { + if p.fosterParenting { + switch p.top().DataAtom { + case a.Table, a.Tbody, a.Tfoot, a.Thead, a.Tr: + return true + } + } + return false +} + +// fosterParent adds a child node according to the foster parenting rules. +// Section 12.2.6.1, "foster parenting". +func (p *parser) fosterParent(n *Node) { + var table, parent, prev, template *Node + var i int + for i = len(p.oe) - 1; i >= 0; i-- { + if p.oe[i].DataAtom == a.Table { + table = p.oe[i] + break + } + } + + var j int + for j = len(p.oe) - 1; j >= 0; j-- { + if p.oe[j].DataAtom == a.Template { + template = p.oe[j] + break + } + } + + if template != nil && (table == nil || j < i) { + template.AppendChild(n) + return + } + + if table == nil { + // The foster parent is the html element. + parent = p.oe[0] + } else { + parent = table.Parent + } + if parent == nil { + parent = p.oe[i-1] + } + + if table != nil { + prev = table.PrevSibling + } else { + prev = parent.LastChild + } + if prev != nil && prev.Type == TextNode && n.Type == TextNode { + prev.Data += n.Data + return + } + + parent.InsertBefore(n, table) +} + +// addText adds text to the preceding node if it is a text node, or else it +// calls addChild with a new text node. +func (p *parser) addText(text string) { + if text == "" { + return + } + + if p.shouldFosterParent() { + p.fosterParent(&Node{ + Type: TextNode, + Data: text, + }) + return + } + + t := p.top() + if n := t.LastChild; n != nil && n.Type == TextNode { + n.Data += text + return + } + p.addChild(&Node{ + Type: TextNode, + Data: text, + }) +} + +// addElement adds a child element based on the current token. +func (p *parser) addElement() { + p.addChild(&Node{ + Type: ElementNode, + DataAtom: p.tok.DataAtom, + Data: p.tok.Data, + Attr: p.tok.Attr, + }) +} + +// Section 12.2.4.3. +func (p *parser) addFormattingElement() { + tagAtom, attr := p.tok.DataAtom, p.tok.Attr + p.addElement() + + // Implement the Noah's Ark clause, but with three per family instead of two. + identicalElements := 0 +findIdenticalElements: + for i := len(p.afe) - 1; i >= 0; i-- { + n := p.afe[i] + if n.Type == scopeMarkerNode { + break + } + if n.Type != ElementNode { + continue + } + if n.Namespace != "" { + continue + } + if n.DataAtom != tagAtom { + continue + } + if len(n.Attr) != len(attr) { + continue + } + compareAttributes: + for _, t0 := range n.Attr { + for _, t1 := range attr { + if t0.Key == t1.Key && t0.Namespace == t1.Namespace && t0.Val == t1.Val { + // Found a match for this attribute, continue with the next attribute. + continue compareAttributes + } + } + // If we get here, there is no attribute that matches a. + // Therefore the element is not identical to the new one. + continue findIdenticalElements + } + + identicalElements++ + if identicalElements >= 3 { + p.afe.remove(n) + } + } + + p.afe = append(p.afe, p.top()) +} + +// Section 12.2.4.3. +func (p *parser) clearActiveFormattingElements() { + for { + n := p.afe.pop() + if len(p.afe) == 0 || n.Type == scopeMarkerNode { + return + } + } +} + +// Section 12.2.4.3. +func (p *parser) reconstructActiveFormattingElements() { + n := p.afe.top() + if n == nil { + return + } + if n.Type == scopeMarkerNode || p.oe.index(n) != -1 { + return + } + i := len(p.afe) - 1 + for n.Type != scopeMarkerNode && p.oe.index(n) == -1 { + if i == 0 { + i = -1 + break + } + i-- + n = p.afe[i] + } + for { + i++ + clone := p.afe[i].clone() + p.addChild(clone) + p.afe[i] = clone + if i == len(p.afe)-1 { + break + } + } +} + +// Section 12.2.5. +func (p *parser) acknowledgeSelfClosingTag() { + p.hasSelfClosingToken = false +} + +// An insertion mode (section 12.2.4.1) is the state transition function from +// a particular state in the HTML5 parser's state machine. It updates the +// parser's fields depending on parser.tok (where ErrorToken means EOF). +// It returns whether the token was consumed. +type insertionMode func(*parser) bool + +// setOriginalIM sets the insertion mode to return to after completing a text or +// inTableText insertion mode. +// Section 12.2.4.1, "using the rules for". +func (p *parser) setOriginalIM() { + if p.originalIM != nil { + panic("html: bad parser state: originalIM was set twice") + } + p.originalIM = p.im +} + +// Section 12.2.4.1, "reset the insertion mode". +func (p *parser) resetInsertionMode() { + for i := len(p.oe) - 1; i >= 0; i-- { + n := p.oe[i] + last := i == 0 + if last && p.context != nil { + n = p.context + } + + switch n.DataAtom { + case a.Select: + if !last { + for ancestor, first := n, p.oe[0]; ancestor != first; { + if ancestor == first { + break + } + ancestor = p.oe[p.oe.index(ancestor)-1] + switch ancestor.DataAtom { + case a.Template: + p.im = inSelectIM + return + case a.Table: + p.im = inSelectInTableIM + return + } + } + } + p.im = inSelectIM + case a.Td, a.Th: + // TODO: remove this divergence from the HTML5 spec. + // + // See https://bugs.chromium.org/p/chromium/issues/detail?id=829668 + p.im = inCellIM + case a.Tr: + p.im = inRowIM + case a.Tbody, a.Thead, a.Tfoot: + p.im = inTableBodyIM + case a.Caption: + p.im = inCaptionIM + case a.Colgroup: + p.im = inColumnGroupIM + case a.Table: + p.im = inTableIM + case a.Template: + p.im = p.templateStack.top() + case a.Head: + // TODO: remove this divergence from the HTML5 spec. + // + // See https://bugs.chromium.org/p/chromium/issues/detail?id=829668 + p.im = inHeadIM + case a.Body: + p.im = inBodyIM + case a.Frameset: + p.im = inFramesetIM + case a.Html: + if p.head == nil { + p.im = beforeHeadIM + } else { + p.im = afterHeadIM + } + default: + if last { + p.im = inBodyIM + return + } + continue + } + return + } +} + +const whitespace = " \t\r\n\f" + +// Section 12.2.6.4.1. +func initialIM(p *parser) bool { + switch p.tok.Type { + case TextToken: + p.tok.Data = strings.TrimLeft(p.tok.Data, whitespace) + if len(p.tok.Data) == 0 { + // It was all whitespace, so ignore it. + return true + } + case CommentToken: + p.doc.AppendChild(&Node{ + Type: CommentNode, + Data: p.tok.Data, + }) + return true + case DoctypeToken: + n, quirks := parseDoctype(p.tok.Data) + p.doc.AppendChild(n) + p.quirks = quirks + p.im = beforeHTMLIM + return true + } + p.quirks = true + p.im = beforeHTMLIM + return false +} + +// Section 12.2.6.4.2. +func beforeHTMLIM(p *parser) bool { + switch p.tok.Type { + case DoctypeToken: + // Ignore the token. + return true + case TextToken: + p.tok.Data = strings.TrimLeft(p.tok.Data, whitespace) + if len(p.tok.Data) == 0 { + // It was all whitespace, so ignore it. + return true + } + case StartTagToken: + if p.tok.DataAtom == a.Html { + p.addElement() + p.im = beforeHeadIM + return true + } + case EndTagToken: + switch p.tok.DataAtom { + case a.Head, a.Body, a.Html, a.Br: + p.parseImpliedToken(StartTagToken, a.Html, a.Html.String()) + return false + default: + // Ignore the token. + return true + } + case CommentToken: + p.doc.AppendChild(&Node{ + Type: CommentNode, + Data: p.tok.Data, + }) + return true + } + p.parseImpliedToken(StartTagToken, a.Html, a.Html.String()) + return false +} + +// Section 12.2.6.4.3. +func beforeHeadIM(p *parser) bool { + switch p.tok.Type { + case TextToken: + p.tok.Data = strings.TrimLeft(p.tok.Data, whitespace) + if len(p.tok.Data) == 0 { + // It was all whitespace, so ignore it. + return true + } + case StartTagToken: + switch p.tok.DataAtom { + case a.Head: + p.addElement() + p.head = p.top() + p.im = inHeadIM + return true + case a.Html: + return inBodyIM(p) + } + case EndTagToken: + switch p.tok.DataAtom { + case a.Head, a.Body, a.Html, a.Br: + p.parseImpliedToken(StartTagToken, a.Head, a.Head.String()) + return false + default: + // Ignore the token. + return true + } + case CommentToken: + p.addChild(&Node{ + Type: CommentNode, + Data: p.tok.Data, + }) + return true + case DoctypeToken: + // Ignore the token. + return true + } + + p.parseImpliedToken(StartTagToken, a.Head, a.Head.String()) + return false +} + +// Section 12.2.6.4.4. +func inHeadIM(p *parser) bool { + switch p.tok.Type { + case TextToken: + s := strings.TrimLeft(p.tok.Data, whitespace) + if len(s) < len(p.tok.Data) { + // Add the initial whitespace to the current node. + p.addText(p.tok.Data[:len(p.tok.Data)-len(s)]) + if s == "" { + return true + } + p.tok.Data = s + } + case StartTagToken: + switch p.tok.DataAtom { + case a.Html: + return inBodyIM(p) + case a.Base, a.Basefont, a.Bgsound, a.Command, a.Link, a.Meta: + p.addElement() + p.oe.pop() + p.acknowledgeSelfClosingTag() + return true + case a.Script, a.Title, a.Noscript, a.Noframes, a.Style: + p.addElement() + p.setOriginalIM() + p.im = textIM + return true + case a.Head: + // Ignore the token. + return true + case a.Template: + p.addElement() + p.afe = append(p.afe, &scopeMarker) + p.framesetOK = false + p.im = inTemplateIM + p.templateStack = append(p.templateStack, inTemplateIM) + return true + } + case EndTagToken: + switch p.tok.DataAtom { + case a.Head: + p.oe.pop() + p.im = afterHeadIM + return true + case a.Body, a.Html, a.Br: + p.parseImpliedToken(EndTagToken, a.Head, a.Head.String()) + return false + case a.Template: + if !p.oe.contains(a.Template) { + return true + } + p.generateAllImpliedEndTags() + if n := p.oe.top(); n.DataAtom != a.Template { + return true + } + p.popUntil(defaultScope, a.Template) + p.clearActiveFormattingElements() + p.templateStack.pop() + p.resetInsertionMode() + return true + default: + // Ignore the token. + return true + } + case CommentToken: + p.addChild(&Node{ + Type: CommentNode, + Data: p.tok.Data, + }) + return true + case DoctypeToken: + // Ignore the token. + return true + } + + p.parseImpliedToken(EndTagToken, a.Head, a.Head.String()) + return false +} + +// Section 12.2.6.4.6. +func afterHeadIM(p *parser) bool { + switch p.tok.Type { + case TextToken: + s := strings.TrimLeft(p.tok.Data, whitespace) + if len(s) < len(p.tok.Data) { + // Add the initial whitespace to the current node. + p.addText(p.tok.Data[:len(p.tok.Data)-len(s)]) + if s == "" { + return true + } + p.tok.Data = s + } + case StartTagToken: + switch p.tok.DataAtom { + case a.Html: + return inBodyIM(p) + case a.Body: + p.addElement() + p.framesetOK = false + p.im = inBodyIM + return true + case a.Frameset: + p.addElement() + p.im = inFramesetIM + return true + case a.Base, a.Basefont, a.Bgsound, a.Link, a.Meta, a.Noframes, a.Script, a.Style, a.Template, a.Title: + p.oe = append(p.oe, p.head) + defer p.oe.remove(p.head) + return inHeadIM(p) + case a.Head: + // Ignore the token. + return true + } + case EndTagToken: + switch p.tok.DataAtom { + case a.Body, a.Html, a.Br: + // Drop down to creating an implied tag. + case a.Template: + return inHeadIM(p) + default: + // Ignore the token. + return true + } + case CommentToken: + p.addChild(&Node{ + Type: CommentNode, + Data: p.tok.Data, + }) + return true + case DoctypeToken: + // Ignore the token. + return true + } + + p.parseImpliedToken(StartTagToken, a.Body, a.Body.String()) + p.framesetOK = true + return false +} + +// copyAttributes copies attributes of src not found on dst to dst. +func copyAttributes(dst *Node, src Token) { + if len(src.Attr) == 0 { + return + } + attr := map[string]string{} + for _, t := range dst.Attr { + attr[t.Key] = t.Val + } + for _, t := range src.Attr { + if _, ok := attr[t.Key]; !ok { + dst.Attr = append(dst.Attr, t) + attr[t.Key] = t.Val + } + } +} + +// Section 12.2.6.4.7. +func inBodyIM(p *parser) bool { + switch p.tok.Type { + case TextToken: + d := p.tok.Data + switch n := p.oe.top(); n.DataAtom { + case a.Pre, a.Listing: + if n.FirstChild == nil { + // Ignore a newline at the start of a
     block.
    +				if d != "" && d[0] == '\r' {
    +					d = d[1:]
    +				}
    +				if d != "" && d[0] == '\n' {
    +					d = d[1:]
    +				}
    +			}
    +		}
    +		d = strings.Replace(d, "\x00", "", -1)
    +		if d == "" {
    +			return true
    +		}
    +		p.reconstructActiveFormattingElements()
    +		p.addText(d)
    +		if p.framesetOK && strings.TrimLeft(d, whitespace) != "" {
    +			// There were non-whitespace characters inserted.
    +			p.framesetOK = false
    +		}
    +	case StartTagToken:
    +		switch p.tok.DataAtom {
    +		case a.Html:
    +			if p.oe.contains(a.Template) {
    +				return true
    +			}
    +			copyAttributes(p.oe[0], p.tok)
    +		case a.Base, a.Basefont, a.Bgsound, a.Command, a.Link, a.Meta, a.Noframes, a.Script, a.Style, a.Template, a.Title:
    +			return inHeadIM(p)
    +		case a.Body:
    +			if p.oe.contains(a.Template) {
    +				return true
    +			}
    +			if len(p.oe) >= 2 {
    +				body := p.oe[1]
    +				if body.Type == ElementNode && body.DataAtom == a.Body {
    +					p.framesetOK = false
    +					copyAttributes(body, p.tok)
    +				}
    +			}
    +		case a.Frameset:
    +			if !p.framesetOK || len(p.oe) < 2 || p.oe[1].DataAtom != a.Body {
    +				// Ignore the token.
    +				return true
    +			}
    +			body := p.oe[1]
    +			if body.Parent != nil {
    +				body.Parent.RemoveChild(body)
    +			}
    +			p.oe = p.oe[:1]
    +			p.addElement()
    +			p.im = inFramesetIM
    +			return true
    +		case a.Address, a.Article, a.Aside, a.Blockquote, a.Center, a.Details, a.Dir, a.Div, a.Dl, a.Fieldset, a.Figcaption, a.Figure, a.Footer, a.Header, a.Hgroup, a.Menu, a.Nav, a.Ol, a.P, a.Section, a.Summary, a.Ul:
    +			p.popUntil(buttonScope, a.P)
    +			p.addElement()
    +		case a.H1, a.H2, a.H3, a.H4, a.H5, a.H6:
    +			p.popUntil(buttonScope, a.P)
    +			switch n := p.top(); n.DataAtom {
    +			case a.H1, a.H2, a.H3, a.H4, a.H5, a.H6:
    +				p.oe.pop()
    +			}
    +			p.addElement()
    +		case a.Pre, a.Listing:
    +			p.popUntil(buttonScope, a.P)
    +			p.addElement()
    +			// The newline, if any, will be dealt with by the TextToken case.
    +			p.framesetOK = false
    +		case a.Form:
    +			if p.oe.contains(a.Template) || p.form == nil {
    +				p.popUntil(buttonScope, a.P)
    +				p.addElement()
    +				p.form = p.top()
    +			}
    +		case a.Li:
    +			p.framesetOK = false
    +			for i := len(p.oe) - 1; i >= 0; i-- {
    +				node := p.oe[i]
    +				switch node.DataAtom {
    +				case a.Li:
    +					p.oe = p.oe[:i]
    +				case a.Address, a.Div, a.P:
    +					continue
    +				default:
    +					if !isSpecialElement(node) {
    +						continue
    +					}
    +				}
    +				break
    +			}
    +			p.popUntil(buttonScope, a.P)
    +			p.addElement()
    +		case a.Dd, a.Dt:
    +			p.framesetOK = false
    +			for i := len(p.oe) - 1; i >= 0; i-- {
    +				node := p.oe[i]
    +				switch node.DataAtom {
    +				case a.Dd, a.Dt:
    +					p.oe = p.oe[:i]
    +				case a.Address, a.Div, a.P:
    +					continue
    +				default:
    +					if !isSpecialElement(node) {
    +						continue
    +					}
    +				}
    +				break
    +			}
    +			p.popUntil(buttonScope, a.P)
    +			p.addElement()
    +		case a.Plaintext:
    +			p.popUntil(buttonScope, a.P)
    +			p.addElement()
    +		case a.Button:
    +			p.popUntil(defaultScope, a.Button)
    +			p.reconstructActiveFormattingElements()
    +			p.addElement()
    +			p.framesetOK = false
    +		case a.A:
    +			for i := len(p.afe) - 1; i >= 0 && p.afe[i].Type != scopeMarkerNode; i-- {
    +				if n := p.afe[i]; n.Type == ElementNode && n.DataAtom == a.A {
    +					p.inBodyEndTagFormatting(a.A)
    +					p.oe.remove(n)
    +					p.afe.remove(n)
    +					break
    +				}
    +			}
    +			p.reconstructActiveFormattingElements()
    +			p.addFormattingElement()
    +		case a.B, a.Big, a.Code, a.Em, a.Font, a.I, a.S, a.Small, a.Strike, a.Strong, a.Tt, a.U:
    +			p.reconstructActiveFormattingElements()
    +			p.addFormattingElement()
    +		case a.Nobr:
    +			p.reconstructActiveFormattingElements()
    +			if p.elementInScope(defaultScope, a.Nobr) {
    +				p.inBodyEndTagFormatting(a.Nobr)
    +				p.reconstructActiveFormattingElements()
    +			}
    +			p.addFormattingElement()
    +		case a.Applet, a.Marquee, a.Object:
    +			p.reconstructActiveFormattingElements()
    +			p.addElement()
    +			p.afe = append(p.afe, &scopeMarker)
    +			p.framesetOK = false
    +		case a.Table:
    +			if !p.quirks {
    +				p.popUntil(buttonScope, a.P)
    +			}
    +			p.addElement()
    +			p.framesetOK = false
    +			p.im = inTableIM
    +			return true
    +		case a.Area, a.Br, a.Embed, a.Img, a.Input, a.Keygen, a.Wbr:
    +			p.reconstructActiveFormattingElements()
    +			p.addElement()
    +			p.oe.pop()
    +			p.acknowledgeSelfClosingTag()
    +			if p.tok.DataAtom == a.Input {
    +				for _, t := range p.tok.Attr {
    +					if t.Key == "type" {
    +						if strings.ToLower(t.Val) == "hidden" {
    +							// Skip setting framesetOK = false
    +							return true
    +						}
    +					}
    +				}
    +			}
    +			p.framesetOK = false
    +		case a.Param, a.Source, a.Track:
    +			p.addElement()
    +			p.oe.pop()
    +			p.acknowledgeSelfClosingTag()
    +		case a.Hr:
    +			p.popUntil(buttonScope, a.P)
    +			p.addElement()
    +			p.oe.pop()
    +			p.acknowledgeSelfClosingTag()
    +			p.framesetOK = false
    +		case a.Image:
    +			p.tok.DataAtom = a.Img
    +			p.tok.Data = a.Img.String()
    +			return false
    +		case a.Isindex:
    +			if p.form != nil {
    +				// Ignore the token.
    +				return true
    +			}
    +			action := ""
    +			prompt := "This is a searchable index. Enter search keywords: "
    +			attr := []Attribute{{Key: "name", Val: "isindex"}}
    +			for _, t := range p.tok.Attr {
    +				switch t.Key {
    +				case "action":
    +					action = t.Val
    +				case "name":
    +					// Ignore the attribute.
    +				case "prompt":
    +					prompt = t.Val
    +				default:
    +					attr = append(attr, t)
    +				}
    +			}
    +			p.acknowledgeSelfClosingTag()
    +			p.popUntil(buttonScope, a.P)
    +			p.parseImpliedToken(StartTagToken, a.Form, a.Form.String())
    +			if action != "" {
    +				p.form.Attr = []Attribute{{Key: "action", Val: action}}
    +			}
    +			p.parseImpliedToken(StartTagToken, a.Hr, a.Hr.String())
    +			p.parseImpliedToken(StartTagToken, a.Label, a.Label.String())
    +			p.addText(prompt)
    +			p.addChild(&Node{
    +				Type:     ElementNode,
    +				DataAtom: a.Input,
    +				Data:     a.Input.String(),
    +				Attr:     attr,
    +			})
    +			p.oe.pop()
    +			p.parseImpliedToken(EndTagToken, a.Label, a.Label.String())
    +			p.parseImpliedToken(StartTagToken, a.Hr, a.Hr.String())
    +			p.parseImpliedToken(EndTagToken, a.Form, a.Form.String())
    +		case a.Textarea:
    +			p.addElement()
    +			p.setOriginalIM()
    +			p.framesetOK = false
    +			p.im = textIM
    +		case a.Xmp:
    +			p.popUntil(buttonScope, a.P)
    +			p.reconstructActiveFormattingElements()
    +			p.framesetOK = false
    +			p.addElement()
    +			p.setOriginalIM()
    +			p.im = textIM
    +		case a.Iframe:
    +			p.framesetOK = false
    +			p.addElement()
    +			p.setOriginalIM()
    +			p.im = textIM
    +		case a.Noembed, a.Noscript:
    +			p.addElement()
    +			p.setOriginalIM()
    +			p.im = textIM
    +		case a.Select:
    +			p.reconstructActiveFormattingElements()
    +			p.addElement()
    +			p.framesetOK = false
    +			p.im = inSelectIM
    +			return true
    +		case a.Optgroup, a.Option:
    +			if p.top().DataAtom == a.Option {
    +				p.oe.pop()
    +			}
    +			p.reconstructActiveFormattingElements()
    +			p.addElement()
    +		case a.Rb, a.Rtc:
    +			if p.elementInScope(defaultScope, a.Ruby) {
    +				p.generateImpliedEndTags()
    +			}
    +			p.addElement()
    +		case a.Rp, a.Rt:
    +			if p.elementInScope(defaultScope, a.Ruby) {
    +				p.generateImpliedEndTags("rtc")
    +			}
    +			p.addElement()
    +		case a.Math, a.Svg:
    +			p.reconstructActiveFormattingElements()
    +			if p.tok.DataAtom == a.Math {
    +				adjustAttributeNames(p.tok.Attr, mathMLAttributeAdjustments)
    +			} else {
    +				adjustAttributeNames(p.tok.Attr, svgAttributeAdjustments)
    +			}
    +			adjustForeignAttributes(p.tok.Attr)
    +			p.addElement()
    +			p.top().Namespace = p.tok.Data
    +			if p.hasSelfClosingToken {
    +				p.oe.pop()
    +				p.acknowledgeSelfClosingTag()
    +			}
    +			return true
    +		case a.Frame:
    +			// TODO: remove this divergence from the HTML5 spec.
    +			if p.oe.contains(a.Template) {
    +				p.addElement()
    +				return true
    +			}
    +		case a.Caption, a.Col, a.Colgroup, a.Head, a.Tbody, a.Td, a.Tfoot, a.Th, a.Thead, a.Tr:
    +			// Ignore the token.
    +		default:
    +			p.reconstructActiveFormattingElements()
    +			p.addElement()
    +		}
    +	case EndTagToken:
    +		switch p.tok.DataAtom {
    +		case a.Body:
    +			if p.elementInScope(defaultScope, a.Body) {
    +				p.im = afterBodyIM
    +			}
    +		case a.Html:
    +			if p.elementInScope(defaultScope, a.Body) {
    +				p.parseImpliedToken(EndTagToken, a.Body, a.Body.String())
    +				return false
    +			}
    +			return true
    +		case a.Address, a.Article, a.Aside, a.Blockquote, a.Button, a.Center, a.Details, a.Dir, a.Div, a.Dl, a.Fieldset, a.Figcaption, a.Figure, a.Footer, a.Header, a.Hgroup, a.Listing, a.Menu, a.Nav, a.Ol, a.Pre, a.Section, a.Summary, a.Ul:
    +			p.popUntil(defaultScope, p.tok.DataAtom)
    +		case a.Form:
    +			if p.oe.contains(a.Template) {
    +				if !p.oe.contains(a.Form) {
    +					// Ignore the token.
    +					return true
    +				}
    +				p.generateImpliedEndTags()
    +				if p.tok.DataAtom == a.Form {
    +					// Ignore the token.
    +					return true
    +				}
    +				p.popUntil(defaultScope, a.Form)
    +			} else {
    +				node := p.form
    +				p.form = nil
    +				i := p.indexOfElementInScope(defaultScope, a.Form)
    +				if node == nil || i == -1 || p.oe[i] != node {
    +					// Ignore the token.
    +					return true
    +				}
    +				p.generateImpliedEndTags()
    +				p.oe.remove(node)
    +			}
    +		case a.P:
    +			if !p.elementInScope(buttonScope, a.P) {
    +				p.parseImpliedToken(StartTagToken, a.P, a.P.String())
    +			}
    +			p.popUntil(buttonScope, a.P)
    +		case a.Li:
    +			p.popUntil(listItemScope, a.Li)
    +		case a.Dd, a.Dt:
    +			p.popUntil(defaultScope, p.tok.DataAtom)
    +		case a.H1, a.H2, a.H3, a.H4, a.H5, a.H6:
    +			p.popUntil(defaultScope, a.H1, a.H2, a.H3, a.H4, a.H5, a.H6)
    +		case a.A, a.B, a.Big, a.Code, a.Em, a.Font, a.I, a.Nobr, a.S, a.Small, a.Strike, a.Strong, a.Tt, a.U:
    +			p.inBodyEndTagFormatting(p.tok.DataAtom)
    +		case a.Applet, a.Marquee, a.Object:
    +			if p.popUntil(defaultScope, p.tok.DataAtom) {
    +				p.clearActiveFormattingElements()
    +			}
    +		case a.Br:
    +			p.tok.Type = StartTagToken
    +			return false
    +		case a.Template:
    +			return inHeadIM(p)
    +		default:
    +			p.inBodyEndTagOther(p.tok.DataAtom)
    +		}
    +	case CommentToken:
    +		p.addChild(&Node{
    +			Type: CommentNode,
    +			Data: p.tok.Data,
    +		})
    +	case ErrorToken:
    +		// TODO: remove this divergence from the HTML5 spec.
    +		if len(p.templateStack) > 0 {
    +			p.im = inTemplateIM
    +			return false
    +		} else {
    +			for _, e := range p.oe {
    +				switch e.DataAtom {
    +				case a.Dd, a.Dt, a.Li, a.Optgroup, a.Option, a.P, a.Rb, a.Rp, a.Rt, a.Rtc, a.Tbody, a.Td, a.Tfoot, a.Th,
    +					a.Thead, a.Tr, a.Body, a.Html:
    +				default:
    +					return true
    +				}
    +			}
    +		}
    +	}
    +
    +	return true
    +}
    +
    +func (p *parser) inBodyEndTagFormatting(tagAtom a.Atom) {
    +	// This is the "adoption agency" algorithm, described at
    +	// https://html.spec.whatwg.org/multipage/syntax.html#adoptionAgency
    +
    +	// TODO: this is a fairly literal line-by-line translation of that algorithm.
    +	// Once the code successfully parses the comprehensive test suite, we should
    +	// refactor this code to be more idiomatic.
    +
    +	// Steps 1-4. The outer loop.
    +	for i := 0; i < 8; i++ {
    +		// Step 5. Find the formatting element.
    +		var formattingElement *Node
    +		for j := len(p.afe) - 1; j >= 0; j-- {
    +			if p.afe[j].Type == scopeMarkerNode {
    +				break
    +			}
    +			if p.afe[j].DataAtom == tagAtom {
    +				formattingElement = p.afe[j]
    +				break
    +			}
    +		}
    +		if formattingElement == nil {
    +			p.inBodyEndTagOther(tagAtom)
    +			return
    +		}
    +		feIndex := p.oe.index(formattingElement)
    +		if feIndex == -1 {
    +			p.afe.remove(formattingElement)
    +			return
    +		}
    +		if !p.elementInScope(defaultScope, tagAtom) {
    +			// Ignore the tag.
    +			return
    +		}
    +
    +		// Steps 9-10. Find the furthest block.
    +		var furthestBlock *Node
    +		for _, e := range p.oe[feIndex:] {
    +			if isSpecialElement(e) {
    +				furthestBlock = e
    +				break
    +			}
    +		}
    +		if furthestBlock == nil {
    +			e := p.oe.pop()
    +			for e != formattingElement {
    +				e = p.oe.pop()
    +			}
    +			p.afe.remove(e)
    +			return
    +		}
    +
    +		// Steps 11-12. Find the common ancestor and bookmark node.
    +		commonAncestor := p.oe[feIndex-1]
    +		bookmark := p.afe.index(formattingElement)
    +
    +		// Step 13. The inner loop. Find the lastNode to reparent.
    +		lastNode := furthestBlock
    +		node := furthestBlock
    +		x := p.oe.index(node)
    +		// Steps 13.1-13.2
    +		for j := 0; j < 3; j++ {
    +			// Step 13.3.
    +			x--
    +			node = p.oe[x]
    +			// Step 13.4 - 13.5.
    +			if p.afe.index(node) == -1 {
    +				p.oe.remove(node)
    +				continue
    +			}
    +			// Step 13.6.
    +			if node == formattingElement {
    +				break
    +			}
    +			// Step 13.7.
    +			clone := node.clone()
    +			p.afe[p.afe.index(node)] = clone
    +			p.oe[p.oe.index(node)] = clone
    +			node = clone
    +			// Step 13.8.
    +			if lastNode == furthestBlock {
    +				bookmark = p.afe.index(node) + 1
    +			}
    +			// Step 13.9.
    +			if lastNode.Parent != nil {
    +				lastNode.Parent.RemoveChild(lastNode)
    +			}
    +			node.AppendChild(lastNode)
    +			// Step 13.10.
    +			lastNode = node
    +		}
    +
    +		// Step 14. Reparent lastNode to the common ancestor,
    +		// or for misnested table nodes, to the foster parent.
    +		if lastNode.Parent != nil {
    +			lastNode.Parent.RemoveChild(lastNode)
    +		}
    +		switch commonAncestor.DataAtom {
    +		case a.Table, a.Tbody, a.Tfoot, a.Thead, a.Tr:
    +			p.fosterParent(lastNode)
    +		case a.Template:
    +			// TODO: remove namespace checking
    +			if commonAncestor.Namespace == "html" {
    +				commonAncestor = commonAncestor.LastChild
    +			}
    +			fallthrough
    +		default:
    +			commonAncestor.AppendChild(lastNode)
    +		}
    +
    +		// Steps 15-17. Reparent nodes from the furthest block's children
    +		// to a clone of the formatting element.
    +		clone := formattingElement.clone()
    +		reparentChildren(clone, furthestBlock)
    +		furthestBlock.AppendChild(clone)
    +
    +		// Step 18. Fix up the list of active formatting elements.
    +		if oldLoc := p.afe.index(formattingElement); oldLoc != -1 && oldLoc < bookmark {
    +			// Move the bookmark with the rest of the list.
    +			bookmark--
    +		}
    +		p.afe.remove(formattingElement)
    +		p.afe.insert(bookmark, clone)
    +
    +		// Step 19. Fix up the stack of open elements.
    +		p.oe.remove(formattingElement)
    +		p.oe.insert(p.oe.index(furthestBlock)+1, clone)
    +	}
    +}
    +
    +// inBodyEndTagOther performs the "any other end tag" algorithm for inBodyIM.
    +// "Any other end tag" handling from 12.2.6.5 The rules for parsing tokens in foreign content
    +// https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inforeign
    +func (p *parser) inBodyEndTagOther(tagAtom a.Atom) {
    +	for i := len(p.oe) - 1; i >= 0; i-- {
    +		if p.oe[i].DataAtom == tagAtom {
    +			p.oe = p.oe[:i]
    +			break
    +		}
    +		if isSpecialElement(p.oe[i]) {
    +			break
    +		}
    +	}
    +}
    +
    +// Section 12.2.6.4.8.
    +func textIM(p *parser) bool {
    +	switch p.tok.Type {
    +	case ErrorToken:
    +		p.oe.pop()
    +	case TextToken:
    +		d := p.tok.Data
    +		if n := p.oe.top(); n.DataAtom == a.Textarea && n.FirstChild == nil {
    +			// Ignore a newline at the start of a -->
    +#errors
    +#document
    +| 
    +|   
    +|   
    +|     -->
    +#errors
    +#document
    +| 
    +|   
    +|   
    +|     
    +#errors
    +Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE.
    +#document
    +| 
    +|   
    +|   
    +|     
    +#errors
    +Line: 1 Col: 9 Unexpected end tag (strong). Expected DOCTYPE.
    +Line: 1 Col: 9 Unexpected end tag (strong) after the (implied) root element.
    +Line: 1 Col: 13 Unexpected end tag (b) after the (implied) root element.
    +Line: 1 Col: 18 Unexpected end tag (em) after the (implied) root element.
    +Line: 1 Col: 22 Unexpected end tag (i) after the (implied) root element.
    +Line: 1 Col: 26 Unexpected end tag (u) after the (implied) root element.
    +Line: 1 Col: 35 Unexpected end tag (strike) after the (implied) root element.
    +Line: 1 Col: 39 Unexpected end tag (s) after the (implied) root element.
    +Line: 1 Col: 47 Unexpected end tag (blink) after the (implied) root element.
    +Line: 1 Col: 52 Unexpected end tag (tt) after the (implied) root element.
    +Line: 1 Col: 58 Unexpected end tag (pre) after the (implied) root element.
    +Line: 1 Col: 64 Unexpected end tag (big) after the (implied) root element.
    +Line: 1 Col: 72 Unexpected end tag (small) after the (implied) root element.
    +Line: 1 Col: 79 Unexpected end tag (font) after the (implied) root element.
    +Line: 1 Col: 88 Unexpected end tag (select) after the (implied) root element.
    +Line: 1 Col: 93 Unexpected end tag (h1) after the (implied) root element.
    +Line: 1 Col: 98 Unexpected end tag (h2) after the (implied) root element.
    +Line: 1 Col: 103 Unexpected end tag (h3) after the (implied) root element.
    +Line: 1 Col: 108 Unexpected end tag (h4) after the (implied) root element.
    +Line: 1 Col: 113 Unexpected end tag (h5) after the (implied) root element.
    +Line: 1 Col: 118 Unexpected end tag (h6) after the (implied) root element.
    +Line: 1 Col: 125 Unexpected end tag (body) after the (implied) root element.
    +Line: 1 Col: 130 Unexpected end tag (br). Treated as br element.
    +Line: 1 Col: 134 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm.
    +Line: 1 Col: 140 This element (img) has no end tag.
    +Line: 1 Col: 148 Unexpected end tag (title). Ignored.
    +Line: 1 Col: 155 Unexpected end tag (span). Ignored.
    +Line: 1 Col: 163 Unexpected end tag (style). Ignored.
    +Line: 1 Col: 172 Unexpected end tag (script). Ignored.
    +Line: 1 Col: 180 Unexpected end tag (table). Ignored.
    +Line: 1 Col: 185 Unexpected end tag (th). Ignored.
    +Line: 1 Col: 190 Unexpected end tag (td). Ignored.
    +Line: 1 Col: 195 Unexpected end tag (tr). Ignored.
    +Line: 1 Col: 203 This element (frame) has no end tag.
    +Line: 1 Col: 210 This element (area) has no end tag.
    +Line: 1 Col: 217 Unexpected end tag (link). Ignored.
    +Line: 1 Col: 225 This element (param) has no end tag.
    +Line: 1 Col: 230 This element (hr) has no end tag.
    +Line: 1 Col: 238 This element (input) has no end tag.
    +Line: 1 Col: 244 Unexpected end tag (col). Ignored.
    +Line: 1 Col: 251 Unexpected end tag (base). Ignored.
    +Line: 1 Col: 258 Unexpected end tag (meta). Ignored.
    +Line: 1 Col: 269 This element (basefont) has no end tag.
    +Line: 1 Col: 279 This element (bgsound) has no end tag.
    +Line: 1 Col: 287 This element (embed) has no end tag.
    +Line: 1 Col: 296 This element (spacer) has no end tag.
    +Line: 1 Col: 300 Unexpected end tag (p). Ignored.
    +Line: 1 Col: 305 End tag (dd) seen too early. Expected other end tag.
    +Line: 1 Col: 310 End tag (dt) seen too early. Expected other end tag.
    +Line: 1 Col: 320 Unexpected end tag (caption). Ignored.
    +Line: 1 Col: 331 Unexpected end tag (colgroup). Ignored.
    +Line: 1 Col: 339 Unexpected end tag (tbody). Ignored.
    +Line: 1 Col: 347 Unexpected end tag (tfoot). Ignored.
    +Line: 1 Col: 355 Unexpected end tag (thead). Ignored.
    +Line: 1 Col: 365 End tag (address) seen too early. Expected other end tag.
    +Line: 1 Col: 378 End tag (blockquote) seen too early. Expected other end tag.
    +Line: 1 Col: 387 End tag (center) seen too early. Expected other end tag.
    +Line: 1 Col: 393 Unexpected end tag (dir). Ignored.
    +Line: 1 Col: 399 End tag (div) seen too early. Expected other end tag.
    +Line: 1 Col: 404 End tag (dl) seen too early. Expected other end tag.
    +Line: 1 Col: 415 End tag (fieldset) seen too early. Expected other end tag.
    +Line: 1 Col: 425 End tag (listing) seen too early. Expected other end tag.
    +Line: 1 Col: 432 End tag (menu) seen too early. Expected other end tag.
    +Line: 1 Col: 437 End tag (ol) seen too early. Expected other end tag.
    +Line: 1 Col: 442 End tag (ul) seen too early. Expected other end tag.
    +Line: 1 Col: 447 End tag (li) seen too early. Expected other end tag.
    +Line: 1 Col: 454 End tag (nobr) violates step 1, paragraph 1 of the adoption agency algorithm.
    +Line: 1 Col: 460 This element (wbr) has no end tag.
    +Line: 1 Col: 476 End tag (button) seen too early. Expected other end tag.
    +Line: 1 Col: 486 End tag (marquee) seen too early. Expected other end tag.
    +Line: 1 Col: 495 End tag (object) seen too early. Expected other end tag.
    +Line: 1 Col: 513 Unexpected end tag (html). Ignored.
    +Line: 1 Col: 513 Unexpected end tag (frameset). Ignored.
    +Line: 1 Col: 520 Unexpected end tag (head). Ignored.
    +Line: 1 Col: 529 Unexpected end tag (iframe). Ignored.
    +Line: 1 Col: 537 This element (image) has no end tag.
    +Line: 1 Col: 547 This element (isindex) has no end tag.
    +Line: 1 Col: 557 Unexpected end tag (noembed). Ignored.
    +Line: 1 Col: 568 Unexpected end tag (noframes). Ignored.
    +Line: 1 Col: 579 Unexpected end tag (noscript). Ignored.
    +Line: 1 Col: 590 Unexpected end tag (optgroup). Ignored.
    +Line: 1 Col: 599 Unexpected end tag (option). Ignored.
    +Line: 1 Col: 611 Unexpected end tag (plaintext). Ignored.
    +Line: 1 Col: 622 Unexpected end tag (textarea). Ignored.
    +#document
    +| 
    +|   
    +|   
    +|     
    +|

    + +#data +

    +| +| +|

    + +#data + +#errors +Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. +Line: 1 Col: 10 Expected closing tag. Unexpected end of file. +#document +| +| +| diff --git a/api/vendor/golang.org/x/net/html/testdata/webkit/tests10.dat b/api/vendor/golang.org/x/net/html/testdata/webkit/tests10.dat new file mode 100644 index 0000000..4f8df86 --- /dev/null +++ b/api/vendor/golang.org/x/net/html/testdata/webkit/tests10.dat @@ -0,0 +1,799 @@ +#data + +#errors +#document +| +| +| +| +| + +#data +a +#errors +29: Bogus comment +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| + +#data + +#errors +35: Stray “svg” start tag. +42: Stray end tag “svg” +#document +| +| +| +| +| +#errors +43: Stray “svg” start tag. +50: Stray end tag “svg” +#document +| +| +| +| +|

    +#errors +34: Start tag “svg” seen in “table”. +41: Stray end tag “svg”. +#document +| +| +| +| +| +| + +#data +
    foo
    +#errors +34: Start tag “svg” seen in “table”. +46: Stray end tag “g”. +53: Stray end tag “svg”. +#document +| +| +| +| +| +| +| "foo" +| + +#data +
    foobar
    +#errors +34: Start tag “svg” seen in “table”. +46: Stray end tag “g”. +58: Stray end tag “g”. +65: Stray end tag “svg”. +#document +| +| +| +| +| +| +| "foo" +| +| "bar" +| + +#data +
    foobar
    +#errors +41: Start tag “svg” seen in “table”. +53: Stray end tag “g”. +65: Stray end tag “g”. +72: Stray end tag “svg”. +#document +| +| +| +| +| +| +| "foo" +| +| "bar" +| +| + +#data +
    foobar
    +#errors +45: Start tag “svg” seen in “table”. +57: Stray end tag “g”. +69: Stray end tag “g”. +76: Stray end tag “svg”. +#document +| +| +| +| +| +| +| "foo" +| +| "bar" +| +| +| + +#data +
    foobar
    +#errors +#document +| +| +| +| +| +| +| +|
    +| +| +| "foo" +| +| "bar" + +#data +
    foobar

    baz

    +#errors +#document +| +| +| +| +| +| +| +|
    +| +| +| "foo" +| +| "bar" +|

    +| "baz" + +#data +
    foobar

    baz

    +#errors +#document +| +| +| +| +| +|
    +| +| +| "foo" +| +| "bar" +|

    +| "baz" + +#data +
    foobar

    baz

    quux +#errors +70: HTML start tag “p” in a foreign namespace context. +81: “table” closed but “caption” was still open. +#document +| +| +| +| +| +|
    +| +| +| "foo" +| +| "bar" +|

    +| "baz" +|

    +| "quux" + +#data +
    foobarbaz

    quux +#errors +78: “table” closed but “caption” was still open. +78: Unclosed elements on stack. +#document +| +| +| +| +| +|
    +| +| +| "foo" +| +| "bar" +| "baz" +|

    +| "quux" + +#data +foobar

    baz

    quux +#errors +44: Start tag “svg” seen in “table”. +56: Stray end tag “g”. +68: Stray end tag “g”. +71: HTML start tag “p” in a foreign namespace context. +71: Start tag “p” seen in “table”. +#document +| +| +| +| +| +| +| "foo" +| +| "bar" +|

    +| "baz" +| +| +|

    +| "quux" + +#data +

    quux +#errors +50: Stray “svg” start tag. +54: Stray “g” start tag. +62: Stray end tag “g” +66: Stray “g” start tag. +74: Stray end tag “g” +77: Stray “p” start tag. +88: “table” end tag with “select” open. +#document +| +| +| +| +| +| +| +|
    +|

    quux +#errors +36: Start tag “select” seen in “table”. +42: Stray “svg” start tag. +46: Stray “g” start tag. +54: Stray end tag “g” +58: Stray “g” start tag. +66: Stray end tag “g” +69: Stray “p” start tag. +80: “table” end tag with “select” open. +#document +| +| +| +| +| +|

    +| "quux" + +#data +foobar

    baz +#errors +41: Stray “svg” start tag. +68: HTML start tag “p” in a foreign namespace context. +#document +| +| +| +| +| +| +| "foo" +| +| "bar" +|

    +| "baz" + +#data +foobar

    baz +#errors +34: Stray “svg” start tag. +61: HTML start tag “p” in a foreign namespace context. +#document +| +| +| +| +| +| +| "foo" +| +| "bar" +|

    +| "baz" + +#data +

    +#errors +31: Stray “svg” start tag. +35: Stray “g” start tag. +40: Stray end tag “g” +44: Stray “g” start tag. +49: Stray end tag “g” +52: Stray “p” start tag. +58: Stray “span” start tag. +58: End of file seen and there were open elements. +#document +| +| +| +| + +#data +

    +#errors +42: Stray “svg” start tag. +46: Stray “g” start tag. +51: Stray end tag “g” +55: Stray “g” start tag. +60: Stray end tag “g” +63: Stray “p” start tag. +69: Stray “span” start tag. +#document +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| xlink:href="foo" +| +| xlink href="foo" + +#data + +#errors +#document +| +| +| +| +| xlink:href="foo" +| xml:lang="en" +| +| +| xlink href="foo" +| xml lang="en" + +#data + +#errors +#document +| +| +| +| +| xlink:href="foo" +| xml:lang="en" +| +| +| xlink href="foo" +| xml lang="en" + +#data +bar +#errors +#document +| +| +| +| +| xlink:href="foo" +| xml:lang="en" +| +| +| xlink href="foo" +| xml lang="en" +| "bar" + +#data + +#errors +#document +| +| +| +| + +#data +

    a +#errors +#document +| +| +| +|
    +| +| "a" + +#data +
    a +#errors +#document +| +| +| +|
    +| +| +| "a" + +#data +
    +#errors +#document +| +| +| +|
    +| +| +| + +#data +
    a +#errors +#document +| +| +| +|
    +| +| +| +| +| "a" + +#data +

    a +#errors +#document +| +| +| +|

    +| +| +| +|

    +| "a" + +#data +
      a +#errors +40: HTML start tag “ul” in a foreign namespace context. +41: End of file in a foreign namespace context. +#document +| +| +| +| +| +| +|
      +| +|
        +| "a" + +#data +
          a +#errors +35: HTML start tag “ul” in a foreign namespace context. +36: End of file in a foreign namespace context. +#document +| +| +| +| +| +| +| +|
            +| "a" + +#data +

            +#errors +#document +| +| +| +| +|

            +| +| +|

            + +#data +

            +#errors +#document +| +| +| +| +|

            +| +| +|

            + +#data +

            +#errors +#document +| +| +| +|

            +| +| +| +|

            +|

            + +#data +
            +#errors +#document +| +| +| +| +| +|
            +| +|
            +| +| + +#data +
            +#errors +#document +| +| +| +| +| +| +| +|
            +|
            +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data +

    +#errors +#document +| +| +| +| +|
    +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| +| + +#data +
    +#errors +#document +| +| +| +| +| +| +| +|
    +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| +| +| +| +| +| +| +| +| diff --git a/api/vendor/golang.org/x/net/html/testdata/webkit/tests11.dat b/api/vendor/golang.org/x/net/html/testdata/webkit/tests11.dat new file mode 100644 index 0000000..638cde4 --- /dev/null +++ b/api/vendor/golang.org/x/net/html/testdata/webkit/tests11.dat @@ -0,0 +1,482 @@ +#data + +#errors +#document +| +| +| +| +| +| attributeName="" +| attributeType="" +| baseFrequency="" +| baseProfile="" +| calcMode="" +| clipPathUnits="" +| contentScriptType="" +| contentStyleType="" +| diffuseConstant="" +| edgeMode="" +| externalResourcesRequired="" +| filterRes="" +| filterUnits="" +| glyphRef="" +| gradientTransform="" +| gradientUnits="" +| kernelMatrix="" +| kernelUnitLength="" +| keyPoints="" +| keySplines="" +| keyTimes="" +| lengthAdjust="" +| limitingConeAngle="" +| markerHeight="" +| markerUnits="" +| markerWidth="" +| maskContentUnits="" +| maskUnits="" +| numOctaves="" +| pathLength="" +| patternContentUnits="" +| patternTransform="" +| patternUnits="" +| pointsAtX="" +| pointsAtY="" +| pointsAtZ="" +| preserveAlpha="" +| preserveAspectRatio="" +| primitiveUnits="" +| refX="" +| refY="" +| repeatCount="" +| repeatDur="" +| requiredExtensions="" +| requiredFeatures="" +| specularConstant="" +| specularExponent="" +| spreadMethod="" +| startOffset="" +| stdDeviation="" +| stitchTiles="" +| surfaceScale="" +| systemLanguage="" +| tableValues="" +| targetX="" +| targetY="" +| textLength="" +| viewBox="" +| viewTarget="" +| xChannelSelector="" +| yChannelSelector="" +| zoomAndPan="" + +#data + +#errors +#document +| +| +| +| +| +| attributeName="" +| attributeType="" +| baseFrequency="" +| baseProfile="" +| calcMode="" +| clipPathUnits="" +| contentScriptType="" +| contentStyleType="" +| diffuseConstant="" +| edgeMode="" +| externalResourcesRequired="" +| filterRes="" +| filterUnits="" +| glyphRef="" +| gradientTransform="" +| gradientUnits="" +| kernelMatrix="" +| kernelUnitLength="" +| keyPoints="" +| keySplines="" +| keyTimes="" +| lengthAdjust="" +| limitingConeAngle="" +| markerHeight="" +| markerUnits="" +| markerWidth="" +| maskContentUnits="" +| maskUnits="" +| numOctaves="" +| pathLength="" +| patternContentUnits="" +| patternTransform="" +| patternUnits="" +| pointsAtX="" +| pointsAtY="" +| pointsAtZ="" +| preserveAlpha="" +| preserveAspectRatio="" +| primitiveUnits="" +| refX="" +| refY="" +| repeatCount="" +| repeatDur="" +| requiredExtensions="" +| requiredFeatures="" +| specularConstant="" +| specularExponent="" +| spreadMethod="" +| startOffset="" +| stdDeviation="" +| stitchTiles="" +| surfaceScale="" +| systemLanguage="" +| tableValues="" +| targetX="" +| targetY="" +| textLength="" +| viewBox="" +| viewTarget="" +| xChannelSelector="" +| yChannelSelector="" +| zoomAndPan="" + +#data + +#errors +#document +| +| +| +| +| +| attributeName="" +| attributeType="" +| baseFrequency="" +| baseProfile="" +| calcMode="" +| clipPathUnits="" +| contentScriptType="" +| contentStyleType="" +| diffuseConstant="" +| edgeMode="" +| externalResourcesRequired="" +| filterRes="" +| filterUnits="" +| glyphRef="" +| gradientTransform="" +| gradientUnits="" +| kernelMatrix="" +| kernelUnitLength="" +| keyPoints="" +| keySplines="" +| keyTimes="" +| lengthAdjust="" +| limitingConeAngle="" +| markerHeight="" +| markerUnits="" +| markerWidth="" +| maskContentUnits="" +| maskUnits="" +| numOctaves="" +| pathLength="" +| patternContentUnits="" +| patternTransform="" +| patternUnits="" +| pointsAtX="" +| pointsAtY="" +| pointsAtZ="" +| preserveAlpha="" +| preserveAspectRatio="" +| primitiveUnits="" +| refX="" +| refY="" +| repeatCount="" +| repeatDur="" +| requiredExtensions="" +| requiredFeatures="" +| specularConstant="" +| specularExponent="" +| spreadMethod="" +| startOffset="" +| stdDeviation="" +| stitchTiles="" +| surfaceScale="" +| systemLanguage="" +| tableValues="" +| targetX="" +| targetY="" +| textLength="" +| viewBox="" +| viewTarget="" +| xChannelSelector="" +| yChannelSelector="" +| zoomAndPan="" + +#data + +#errors +#document +| +| +| +| +| +| attributename="" +| attributetype="" +| basefrequency="" +| baseprofile="" +| calcmode="" +| clippathunits="" +| contentscripttype="" +| contentstyletype="" +| diffuseconstant="" +| edgemode="" +| externalresourcesrequired="" +| filterres="" +| filterunits="" +| glyphref="" +| gradienttransform="" +| gradientunits="" +| kernelmatrix="" +| kernelunitlength="" +| keypoints="" +| keysplines="" +| keytimes="" +| lengthadjust="" +| limitingconeangle="" +| markerheight="" +| markerunits="" +| markerwidth="" +| maskcontentunits="" +| maskunits="" +| numoctaves="" +| pathlength="" +| patterncontentunits="" +| patterntransform="" +| patternunits="" +| pointsatx="" +| pointsaty="" +| pointsatz="" +| preservealpha="" +| preserveaspectratio="" +| primitiveunits="" +| refx="" +| refy="" +| repeatcount="" +| repeatdur="" +| requiredextensions="" +| requiredfeatures="" +| specularconstant="" +| specularexponent="" +| spreadmethod="" +| startoffset="" +| stddeviation="" +| stitchtiles="" +| surfacescale="" +| systemlanguage="" +| tablevalues="" +| targetx="" +| targety="" +| textlength="" +| viewbox="" +| viewtarget="" +| xchannelselector="" +| ychannelselector="" +| zoomandpan="" + +#data + +#errors +#document +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| diff --git a/api/vendor/golang.org/x/net/html/testdata/webkit/tests12.dat b/api/vendor/golang.org/x/net/html/testdata/webkit/tests12.dat new file mode 100644 index 0000000..63107d2 --- /dev/null +++ b/api/vendor/golang.org/x/net/html/testdata/webkit/tests12.dat @@ -0,0 +1,62 @@ +#data +

    foobazeggs

    spam

    quuxbar +#errors +#document +| +| +| +| +|

    +| "foo" +| +| +| +| "baz" +| +| +| +| +| "eggs" +| +| +|

    +| "spam" +| +| +| +| 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
  • aL{js4ClRz-#C9MpHB*LQey9qZSx90p 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�i=C0>luT7RiZU?LqaWS;tE8>Gm3G7p`2Jdg9(1zNN$ zTnZXu5Or*?IZDUzrAE47s&b!7kHcc;=^?xlcM6!v<@QZIZ*1aWf?<=oLZ-2|V!KuZ z)2v8n1lv7!W5i`d+a^La+U`1|DXy5rPa{@rmk$vN<-G80PiCRe`e}w+b~MK-t6Rd1 zJU$k~6>rNDqF)xUCRlQ?wU{xZ+}Az}O+Q>D;k&~F%nB>^^$~s>IrL$wFRgTqG@~*F zUbJQ{ZHWA$*n;+IZeLp-`yNs!g{Bj{@0HeP^s4`6-;)LegHBr#i1&y&Da2t+4Pu3+ z{&%J?$$Iehob10_>oQ3{)_jm{Usl`mhG5Sp1ba4eu;+fEfITaPO=Bb`1}Pif5HWUZ zJ!7e|3r*W4uOcswJ%!9+2k&Qfws0CX><<3OjmANzPop~c<%d;+zkgmDd?Pp*qiPSk z#*O^*Ydb)n&3%;df7AKZ9lYU)bO)Q<+@Vpw zgSgFiKNVzFWftuy8T6()xciW57A;UR(}`x;6gsDf_pvL^-o-S4c1K6Y3d zdS+A5+3&*#jT!Q86pPl#Mpl=eE?raHlW4H`9pb*?TlLQ$v;;HEKgma~z}l`0)|Q^X z7g!deW-z(e>Xqb0&zNvAxlzdgle3huVi~{n=T2Y+Ke5DdNTIgZ z6Dv)z^g2yjtm!p%ni4}e!qZ?@ou&=e^!PeWiHl>?{*4=Jn=++grJ;+NNO*57ED`Z` zqqxf$)oxs_NFWa;T{&uZ%E$LuE#8Us+I_XPd#H^A&e>4b;k7%xcCNNIX4ZwX$n~k` zyww`4xn6tFF{|vcNQ_W5Q``=C_@L-yQ?`}LLa&wOPH)$!vM%py()2K}i+02f9)zjk*9{)`>VmGALboPE9Om4Z+?T zqUp;FkiD~4UY!l$fr6B4?CnAeQo`!5qAE>@h*RQnFr6z`amqNr6bmXfoq1Bb6`NES7>zJ%LSsQZE(-!J{7Ikz0r@Fh8IGX4NG6x)XkE z-gE|eUR#0&(?pXs?Sc+4xm0@!VNPXo3B7?iZ}3}kJH+o5^c!VwE9J^4Gv}DiFsDb& zm#KDOPET>Se~&rcz;Nbt8sc$G3i~X)O&^(qQ{Yv2XO7i1=Gf}P{}FR`_wNQ6a}=RP z=Gdp@Eo6(DbM$7I(=FyG9B}4z|GUiTt1zd_nKLA?Xbvy2t%5o0?WeX~VNTweV|9%= z!^-(TV$SquQ)bmqzmYj}Wmd{4YtGzy%-JQFRiA3bt6}jOL?`)Qg0*G_k3B4#~#>Lt?_O?RH><6T*m~vxK#gi>z`Krvrcy`f9mVD z3$jN@T0^pZNVW~hUKbNq-SXGk1@zSV1Y=YszS<6Mv*cz(uo9w__)00nh$aP6Umx>8 z>aLwrfz+f5@8%yR9!TM(^2*@tf}>Hd_?ZMB3<^z|x7B#$z#&LKH7$wy>)jF_$;NL5avy)`5oI_pdFiXzGhY^ zL?}C<;ex-dn%3WZUEP+Ht}1TVe8)Xph1ab0-YPIHwP0pegBcj-_(gR`4Yf6PsI4)* zw#JS%HTtJj*GTmckZg@IVd-UNFd!FF%+NB+#zXgkkuzClk%ht0#$?ym*9|!OB(_>B zVPG{j>t5k@UfJ&$$rN6z74nZ}b(Xf!XpWleXv2^nn4PoN6V>~oOZN`FqfAsK+WGu} zbvy6&&TXK>6njmFQl01MoTZ|c(0QjipAkD}Vw&QGO?TD#%qg9}s($A=?>ukmV2I<= zl;gaQ=^4p6!Zf`cK^J^}trTohsbt!N6&O5yGPNnJ2agN6< z9Lek)I`38Ie_)Poo%fcnOHN>JO<)o2L!TEXQd5OWc=5RXEE|gz!~lNI1H@s!ppSfE z)(QE-%n7w$s|Kv^o?2t|X5}%w1aGr`qOX?pl4IHGr*Y4LRMAFLMLf~!nP2!hhiLU$ z+dDd1eK`W_5iTo)OAIo$XS66gINa}$7|41tiG^CdRJLeB;akOuwqj+C!E&5xKILpR z&Ik9dibhG~krl_LS&=FJS>%JD378S;)z&TM~vq12{;1{cMbHa$N3)V z%$?_rWPbP>Y4hbf+xJM{CUu&(v+ZWH2myR+=`&XKBb^-lwmS|l!s4X% z9uSWSpBNA?(SXGFNUy%0J*7vIE0z3@bfFKc_~1ou6?`SLQJH9o1*Aml$;Gdefn2Qp zEO8BfvP;(uU9>G8v;`@5frI1Jm6CGf6e%~ll!J6D0fXuBFpkm|d26Ix^uekkWdnn} zTGCQZhle(?2%UMYI#Q0|qYZQOwjkwhmooI7z$D?NN%=SXY+1^?kZ2t3nmBAe{q(!ZTazP{rC^UY5mwmKQ?Heg&(u@s4Vrs@MKRq^$BIldlm1QJ)`NEL>;KSn9>wNf8I)+!67n;_M$0Z;0^ z(DcHaQiEpl%U=gIBY?BuxN?%*Jajw^Kn#)H&-A8I1AB{BZ3R8Cw9Y}hue~BvPaU-T z#`zM1odJ+HMU&U5HJD90G{<#BL4w@5T|9Ct!Hv2Km13isiBiOqdgePBkd}!7!GCJ4 zp^)i&V?Ze!UC_dRa?5!EC3Em}8lih{)oUYZ?52b;e7!ZzZVzFyto*ez5hjG$T4WSv zDum(2opK1X_{6j{-twy;jTT9xRn;{539sNge7@s>gUW}zd{k+Q3zknk%ZHf^aFQ?l zF^H5HL`vvJTZ()|v2}{bUVLZZ4`aEXjSM0S6O0lR`_9-(NiYUM_oJpND=XhfE+<@9 zsFKO_QS?XU1}#O+LZ_y`h8oMKp5<4lDP(r_-L4>0CY{rgN8S-|X5`izWAvNGS=!r8 zHFGny2rd(Xw9)}u!m(Eiixd_50t}Q80{D6N{Y3^rOn!vJ#3S>!hskA57cvK)xHqDk z*_I4FR(JC@>3OtP+PzMHpZ8qLpKdSjQJRvr<-;G#uiyag29Xkjn3nc7FP|dq7U$gN zq-}nAOni!d`L?Ojwn|G?$)ufVd9aSO^G;1y4KACq@!f95y!rG3%EwbJf%`g2O_ z@Tc9&J8Jl2`S8c`EBpb1L8QbWrltML*;AzbD(Bqhq;0X*koXj&-Bqk3ZN_q6UNdQL z*aS7LPEEFk8p{V~%db#V$b594w6wL4n!I?gjS;? zt9MfVPH>d`_%jyW{4gZn3&|ZJS$i%a&nt5$(!n(XIq}Lqb#kJ_6~Q^8g*mGP-4RnjpU-( zq%a}N**RwwhhjDfDKIg@s@|C#73OTOnXA+wuip$%U8IJ4DA4>KLPBkZFM-s43BC(` z)xyCgCJTy8n;Y{ZEzNgy^MB61ShGyf0KbCt0&bCCY3X2Fy!Qz!w>hql&~QpEn(qkb z0Gsc)A=D&HSQt(H0NC?!);1P|f2GH3swqR82pI<605z$yabw;oaxf|DkHZNL^6c6EqBpjn!g0 zxj0C@@1XPfrO5-wOV=dLqT+BCLn;PbL(j<){lGKrI&V#ksefVs=7jYSdG2$c?*n}A z#o$makZK)iy5;5JK;n8MG;Ru%Kj^n!VAl)m`eX&?fa3@Kh@HbL5FNbq&>|}QcaCf5 z_t%~7%}WrOLR!A3)O_74-m}*tRm_?}mRP{<_h7@&iLXsT=mcU%>UWOc<_Ek7tWxGW zd~(;w?DacqB79k%&jjh~yu)+zfv=`cEv8dtCcxS(tZiSNJi^(}(z?Sm1Rzm25QiK}$-xKtirVH=};AFhZ1?l92nhu}b zJu-XEY~xjrKGZ5>G=7;L(r2h{28iXK+&eP+x=>x8jgvd{Zv$#>2|aqmDLzDyxczOrulg*zfCCAtvrTn*az){fO6ooPkQ%pBwS=Z zjN`-e+dbSk!*DNmydcBRm1+iuDre=I6R{glFMH8%ixl~7k)mDP{YU0V>Z7ZXuke20 zg1zx2kMOG6&y#oY@%w~Ei9qUFMhkHA_^F&aD&%#*J8024-w9gO?kM{E*1)p3 zg>|2X(%ckB1l>xYHpWcG9$GAfW24C{KNl`!7Ax_#;xH@g;bwTyi|n=Q-T|g-vqkS> z{}5yN+?ekFmEOa*7Bh1(YnmX!ENja6)}r5luzcZT#04 zd`S=m!=bUhoZRw{XYG0eeIxI9+dn+qc2AO@75-_C7?h-}`~+4$mb4T|{|4!~#bYpt#F%XF1KabclM1}-T2_)6)1YrciIl>y47u7=jhig^E-) z7y?HJP{h$>hyR{x2x3(YkXAJYNSI#L0{ID%czz@}rf5wLV4*cEoBzn{d(KaJB}Vba zjT^-{h}pVDeb}wqQXqKOD!L)cnqa@4>y~LHBK|lSpIPCCIJ|U)? z=lZyw3Ykt@hlHQPfX#P0_F53RR=>+Smwf-}>M?Av>QrA1qk5fDeM+Zr`%9mm$|%uj z11LkTA}2mK#oNz!sXecBXNo)VRF+3KKfK4hYJhb+ax_IUN1r_Ko8LztU?UQKUln0n zk2Od;dILd8mxHpJFu-bpyh41n9CrqVF5{9)&5{_XtW!O^rhLze(-#-|RY0nl2-hoJ z#JO6bZt&@E+>14uslQ%Qr&8KFnk-mahi@>7H{NHWtxJM&Yc>N5dywxd=V?I{`4%kB zkQuJLm#DCixoG?SLWv~LYU;G)H@~fwZ>MuCM_MCaD*|N|O_lE&;__NU$QSaz)F)Lg z)inzzGwdVbP7r@xS*Rkrirg#efU$^SGNVTSYHMy#~yz= zXK#-^bbm~YJ@$sZe4mCjf!JvObffQ;8?~ewNtw8YCe`To;-mHXYo5w|URiGb17&-> z(}}50!mgnBTO2M{hzF_R!hXZ4#$>W-bHhbB0>L9z#-BJ`tTSP=u5Kx^gzb&VTiy_c z3ybjZ5{qp+N7}oVdNm5JEQx-?L51N07YnVU$rDTJ2`13&jtH=$BCetubt62hgSv$X z@1x%cHppOTic<65P2C7@nq#^_y+KqprgQ3G8gWXyq-C^Dv7pKh|3X+&YtB)l*3iz} zE+O#j1!qYO*P;Udqij@SI##|jzr!cZ%s&+}f1R~oFw*FI%+`dyY)vT|fPfg(lM^1R z<;Y5th#ypb+j#T#A^aDNac4!SQp<|h)g`0&UVITBjrp5>!!cYzU2P)r92kH-VY%bg03n`RZ?owFBw<^IXjR#(ToZ z(4R20K(;a2_J0HWqs{o7m1x6*PH^BfIc{vPmXuH%9bis+Y@@o1^GrWhn)PVL#wuGz ziKF9UpBOD*02|=Kxa4mqLeJ}`(sSusp{27j7k2I$YB{mZf*LepTJmR2CBe8tMOJ9z zI~+TNQl6+@Lw}{~OsrM%Y`$9GXQoeBvp{EF^bd2TF?!IS^RjG68gbFdeu^Snqf3Z1 z#>GktyG`XaqI}AwZ8&xcZ*vF6=^mlnt2`+8XqzAOq-=83y}W=qQtw{0=JZb7@W^d~2rfV9@wYD!xF3iH~MFq!|Dn8?dQ zh9@U*l`@&P6mE|5TYt{YiOS=;%42_gloEpe7{4n#t|Er1qlH%x)hOOUnRwiAThMFc zv8hbtajhPT(=gZg*Cz-I#eH--?pk{TxHkkE$`{g-!CIwM21j4*6%8txv=WyesC7#^ zT}bD)v}VmkSRa&Uf#t1AVY#KSyo2BRbC=S|Pk$7{YTfprZw3<4Q!&UQnen}# zvbYf0J~rJdo5q>&78XD%-oTwTA_yBlDhcv&M}jmK`)b@^`HUg%#E$aR&IN58WN?KNR8^* zAW>kDDuNxEa;`4jWr@(f!hVY&g$V16B&$o0Yk=+pktl-=JgPHi{7B9;x4SBfVNX_? zs--s$_5L8yqRP-Q8|^@z2Xm}YV3w`W>L$myU3GEHilUGtVB<}dl{0~T%9Qq~yMSEW zJl-^K8%hVV==_CKw7gSBM5{TQVTIsZKf?rjANCWeVC^dxX`Y641vXIvoAPRL6*p{e z4!o;);_OvV=(R72C)eLxyHa8mQJeK@01JjJW$7#hz&f7AV6GKk%tCMZfs<85Ppm4q zxdQoWR*OhNO10xtiu!L|kpkHx7A}-V_ZteEhBsm56?YZ6DV)}+3>cGEryK`RVy!4y z>m{JZv@5v^9Z5NhTE$J?mBTCbu`6F0KMV8P{QG)0F+s!`jT=Zd^p)a_lsZhq2W=3q z^yk@PnLW;vhw(FQAQwpUy_V!#?+`JH(2SKZA6HW&qPPiemi}g>jUfV1{e^k_?xxeS z3A-)v+;S=11tG`CG;-V)+^;w?^liS6Zf)stK2|hEpiX!BBYZWA!BDnT$dnbt!0$c< zJl3l{)AIU&>>09q)HOOM^C)EA^GAIGQXUz1BF|#{frUOd!qVrrbtL_7*xczm$=F2Y zD5phLQ?&V*A8oDGE9W6Id_Ep~!g*CZM1J5G1Hm|C@P?I>5uH=bKrm*-UL9^)^-ZZk zwGBzTU`SW7$Rs!U%#o<_Aw1R0cM6ydxnX>LMH4tLdS;n4dw6;H8Yn6~#_#0$j7COC zgxz>7JNF+~+ZOxVsY`rfo@slVykgUACHR+Mq;YWZR;b`gQ%`SIr6as2)U*5Xg7FSZ zX1`O32_KrWazpLOtA8E#g>-L!*ca;52I5HO*wFM)YqQu-@eTT_IUihBx3+pQL-mI- zIb<1-l)mv}p{mebOLF5`{>ebw&G-pBespl_ZeU|pcbjF%@S;>W&ec%DYMpe7z_2g;IHHzEJuY6B<=lGZe?Jg}sEsd?L>CHU%`fmg6H5dp3}RsxaKK zz-Xv0@eNy|Uz4@ITQKlK0~bkupu9fcZ@4=5#Gsq!MIM{+1I(&`%Meu~gXW3O(3UB( z^)~1cY9K@v^@hwb#a|NXhq21Af>7HozUm&n+Gpz zR~dyo$QM`c=u91}gxSXDCE?fs2x^x@;_9_jZ}!V^0;(l>-)<>tvZ^%As9Ee&5*z+p zVpyfoU@v~3W2jYK8DK#fK=Xw-cLTLu9W@`oLCqY(r1z3o%0=>)I*-F%`wm>cE8bXD z@B8>z5uzCQsdSt?3t<^mB_Hd2~Uh@8K z)tBj;uU!Ni!?xG0CVPFo++?5ndiib7<>}YHUfz6_K4OCogfG-{elKToSkjiabTAwX zDP(T^?7xQO9~TPA%QXhwX@T?L*5a2zhctr@X2Eb{5`P*chZKLV`(uhfcLWj!U;Hm^M(QK;Ql1r(6U7n>r0FmU)JmqV z3g3(suJ#H$dj+YHDlCc>-se5~E*$Ey)_Mk3==pLgfY}u!BTe@|Ys$h4toh;0Mc#Ct zqTS2_)dPh|Aj|V4=gpBjs}9BTg(HukUh-AWVU~W#uV;7U*Qa$V^D=2t;mDsUV@Mgt zhm2>G@nL1m4jB)Tp%>N8Q{DqomfB86GT&F7k){<^mGQtxVLUL>(oyIFE2$HOT2&h{ zUU_ml3O&?7WG)CDTxiMcUh60A%*BZbtIEvRdkqZLK#D47Lma*PPb+csaTc|hp^s#C zGsyE{Ek|cF#oNSHVE*gsdgt%zs%xLC>q1x8epgq^M_ogH=JXxJ?54MojAR~oM(TRW zD@|4BlO46edq^oB?+hJrhFEQ$^ zDISBCeicK@kW$%+`f5$yUmhpPTd1hBT{A@W%&eW39OJY_u^5*4mt??41D2x8aZ8u@ znoL-u5g^@Ta-1H5o%}=9KxD$IYn`Q#8QsNC57J$iqv}sB$$8Ie1S)eN24>5weO&ML zovcFU*fOY^C1KdR(z}dU<$oxjr3gK45_c$qsdM6sy~3$oy+hyn*3*-;^Z&;V_;*9^Huic@3WjL zO8j$JzmJk6bJRl8gsQnD6J1M2(?X3qW-W)KY^V?Lv_aHe}P1&Xs_gmVaoHV^g{O zE)VAST$|s^*9Fap?Ntzf^#q$vU7e+%2elnCoZVc@t7tWgaUkN#Qpmjd*R^YD$+~?~ z9)M`Vd%{rjSHBPeC+fJaLIkb{PI+kg6DMlGMQ@o#u}cvl)1zsxj&Ege#nVHkJ5-8`+e zSF)-+`sdypJ^GppgGWCdzo#9TQr@zOp$6rx`pC33IJMKnekodpS=j1HZ_$2jhP zQnQ%L>@y5IGL=VjhUd0Rf8dFuk&}XCihp2CcIU8E#Nw$tR&U=4-W>y%{i-~-0G!CEUb!4E}N(%s|C8z8V=9KWZGK8A~Odpy3 zt|yGs9eTawGq_*lbVoI(d+6Y^iz*%TNDERO{BiqK2j-_>M(ki_=%7;_91uHDU@t}( zLu#f3AgMq~jBd3wj83AbOZ2E=C@^OoYll!laLu!Xh!!9IW$WYCwtkupZj~?G=|`Ox z#P_4NJ3YJ~rJ{CKF5FsMC3&k?p=+xG{dmi=?fdQ~3mTc(*G4{ZtkJq&;v22yHIPsA z#yLJ<7UE6NtL}Wb70tLtj;>r4j|-W${tCd*H-M5CPYfq2^={u${C}hZmLtso_YF%Z z9y$$-=OlJfA2<_V)BCB-XevvtIpcL44n0mulUT;+6Ia&5X#aD=q5xWUIfu_|#blZF z8e^W58b_M`I%yNTSyD5djXebimP|j12>#Eb$r;4p^4`mYiu;Y^$+zIU@5gs1kLc-q z&8%P4I>EjASz_mIG|AR$IMPP>&P>09)35k@d!O*V>SN#;RCxi+FYu3t6${0tzA*T- z#=OzwyYCThsynczXEkzpX2$W*fJ;U%8=*6XB`wJpbpE)Ixz{TsUpT_z{_oiDs!^iv z_&7>@?j2#2SOXwmq?L9TGJAh4GCT9X4ggmr4AGC49O1)C9tLYrF!EKH0KRnF zXtKDfP4drIA&rITTpWUH0v}Yzqyobwf|}P<_lUA^%Ndm@HK5<`Xm1y+H|@z1b!AQnB-g{Rj3psjTh|5%DZddSzG53RlY^hcY>Q=_B0 zMrWl)heV7==_X5fC%f>LiulnY-oZuR#SjGfEH%|I8rEIY1F%6-4Toqg7;{3+xbo=R zQ$Wb89^*+@tZ%71XyDiYPWc8X6NdKN2H@kRZFPuNtx!82t%yq*D6R0ujTz4ttr08j zwfTUB&pM0=7WqG<1%I4~9I%GpLgpJU?qduRZ*o!;(=dDDJn>|hUS`F#RxypxZLzN- zgR7D1cMuCIK#itA`{MFdv%%jl@%2I$?49fFN@>^^8-@Z4^ci@)mO>yYsdOF`dh>H0 zV66STMN}cM2`>?hoWOj<2XL?q16YiZ;+0BEst0^tUCk8V1gOD=krP``?jsgGf5jKi z{SSh@{nY^y8545+X&T&O!h{f|h255Ht=GUGrt)7i)23-WwU{PM%CNvWw)*uW%7j0R z6Gir3+&9Qm&KONXkZNVzH_xUK!I;IL9<>duB5wC*W5PzR!G;<3&8+}9g3)Y}1^aF= z(Sp4R2$=KjK8+nk(5lC|igVV^)qRJ0u^ob(KXO8Qeq?U;1luNh2xL!KHM!MWhUah9 zdSc=7ty)H!KK*c5w*9q5%qI@d+p0yV1a=Mb6keQ70-;hXbbl0T)pO|2HzZgB1`~kE_EC|8Y_Y8ASvE7KBlmgJJ7h>hs>~9{sHJek z8do@zp3g1zQxQx2sKcP|+#+*pJ+G}t{V&vyITKfAidTtV*lantot}VYk6ci<3PSIU zI6U_`4D(Ihs?w4yeKUcaffy6-<>NCidy%-Q93liCKUn`&VPv}2pt5LZDUL!Z-lz+B z1~?RG>;#8UJM7o0U&T1|z*@Gv(bv=#0$0$q${S7dP8z+FwT7&(6r$qe{MMfuTN%<> zr{9I$PM;CI%P}-w$^Rx%=6XD#w1=yWp5+~uk?Na|hYxWmQ4gJidjIw@6;n;c!mGZ6 zXbcWwLO7a(m>=%_wCGGDfABatK^k*NSg(oDJQj;53#KSpFW}&mUATRLK+B0)>a#I) z%(^7MN3f8I26^dTA8C59uNmS1Ti9*qhSyCi{+ys&;_$%VeWk<@L=-UZD!z%R$y{ofr;tnxELedYzHHsdMm z_ARylFzpR!BLx5*B(pTh!$`!hUh&2fWNkgbXu{9q~&Hz7`2SW0rkgN{Loguj`B)5d*?w3R6DR#Gb^$Rkxi98I& zIA*q4DtFTS?a664B6~N83hl816iMn{Wja+BtLcbhM;#&=nBW@OnYvEYtIXhg-S3Iz zt(4EKE}uy`78u&MP|i@2Zr@D#t7Ca1<&2i0JT#&00wyQ}TqaQ}mF_8hwRBbS90V69 z2c)U^bY9zNSe&z)ixxezUdRtG59=)ir-^=Jx3X*fxso>W(;r(UQ)tg%38{A#6`xd@8U9&ZIZ1$J7K21X?a+g@ItwqiQ*k z#tgB*|YA*&7{D;>a`;XdIFwQAWF#?6;bXeMbJ4E%(TjPGhal6l9R<4BrLv}E?1lu!fyoCbePCD9}r zxEy-I=wGzP3JO#Zd_kw43GQsY0n_CHFgBVipQo1Oi^po;I)orWtTqG>yfBMk@D_j$ z&7Gz4PaAxR-OHPF63oh*RQ{RT@|S(Mp>*ER+?T2FziSJdDLiUuZnIDVqWA$=_~BYK zMd_A@c+o#mS=?O!-AqkjQ-Kyk4GM_Q5UrSxPJ{3UK3sU; z(9r}D(d9JXep=g^y1a>!`9odS<}9^Ail@^C%bMx~8PauOz@w^t8s(`o@M z9nc*{ubOXMdSys<3Q1E)UcEhBdQ4oZ;g3xer@UV|3LW}$3kaUhJ>bBGEWy!F%qBhS z$bRZF^V(DHu5Q}}ILHCsRg}8A{$DlDNyoj&*ixHv3tWZyID+7YQbXx36jni|RD)vT@HB|Mv4dz#B@(=7tV#5Q-g!;tI8;bEyf0 zL5|NL-)-6$5E&0tCq}OrUcqsrPo>czxL$f-B3RaNhivWvXxIJ z$vi`kdKy@hXR*fC=)4nX#DD?NC;;l@uqAOlcRcxgc^7=CrZy zlG>BN0mJ`D^X=1*xH4Y|u$!0AR{afVO&cgMK_LfF=%OPqW~~ixtOO-@m&2yTuQVT<{O_Us%HoxRsWFVxjp|W^@WsIHH+h zni=na83U8+k6?BHY-a|>v!>gbK{LGUhL+|f+KPUSIMfp)fmd!Qy`uT{X-90N&=hE) zSQ%QE)+fI|&WL>~BpbKelKi(1jN)MtfvTS8h@j z#@1LRX*I0s`m3J?`Sl4!He~hBrp6yP3}>kBXkk~tN1PbX1`AvgVs3n@jg&FA0ij-S z?n{q)Kx>z(vd*@jYXu4!1~&LJ@cgzP$`spGLd`BY^lrN&3SZG9Vl6_6IW5V@;kmq| z-ip}A*5Dp;S7cD-m;{s1ghq`Bl#!#YdiIY19Q>)*TUqg->R~am<0i;!7y-Q#UEzY&HaN z20mJPxb%x;#WALIb3*d^ko%%~RY}t^fW|kbla4h4ezui@{DmkHIL)lFt+) zS1WEMQ~a*l+^#WcpHLqi?lEg+h26^LPN$Ihb=e&$-pdr#1EOf4aPO)@g?#5zGJ}#C z66-!gGuxEDnvCgs*qeujq@6oZ)UZ)z!$@b5i^VlIqR4-O`@-^+jX~eyB$)1wueWqT z>HN|=gGKhLcF;=hhDu=sU<_sRkStW5%D>oCvUsk^?8{pro<77=y*`5Fb{n_5L`q(y z#WKZHJ>Ql;aSiJMCD*WF7OvrR6-GxxUt<*V<{WwPNC18njx~l%P5k~d zV zz>Scj$R@>_Ug>I%5fBC4XOl{^JgkZMr{w`x$lSTUGNr*(%n1lKPc6x{tLtu%^n;6( zCQO!mv_eVpGSrS8({;#I)I(Wa|Wz)0a_Un0j0 z3*Tm|K_j)iD)yuIx@3xF=?iUHy7af?#UsocU3jD=Js~+GB&USr@6+*ATd|y78$T2n z`{lsw{Nc21z=0#?h6+c^l@>zkW^XfVsAw@I_uVO|2)kAO(g9TD48&mhUCl<-hsvd* z*3MS$huClYmd;kPR;W^}LA$*f)qrm6oMXTM@=zl$mMaeYy7;CcC{?;AmbVUw6nvI5SmB~yHoEpp<^{4g6zPwp1aIhdC&iwhDA zxtjKhJu}4{48Ys~;R{nB$itKs0M=TZ6fqdspt1GT0KwMDlb$IM%x}R))7GgFW&mN^ z0D(0GsMvi9gh^LI*|(0O^&3uinxS%Y970!1N8 z`#}21T$Hg(XqQvFpHiys=H_bK8G*E$RC~L#`mt|Ye|E+7Ct|xEwHpk08l=InZ-b8Z zffLL$eO*|74s!vuQJ!#BJ-L!zr40U!8vI-288|Pyp=$XJH8Kl8gtCBI?N8p`j`1$g zn&D}B+E-5}>M6l;lboKuBDY{Tn{@z5?nxsOBctxn6KeI1w#tBZ#QbDH7IkE$mTT1* z4A&XWPG=!=(u!~_I-JCWM(e>UL%dZMsTT1hzj{7JZ%5hUfm)AV=)jHZR-W*(ZG7mW z6A1(K6jij~)SHdT`b}phY>gVB?2m?%jZlk&uRt2c9oy#)Q-_(%$FTnIIsWESz~8D_ z*rqS7*;#~7QH3G4K@A#8y9tY&DCt+z0X`%fFtAs=0+Km7A-+xp$%vtIiN< z)s0+uZ~a}-Q0ft76?3fH1=XWD5|t;ryLx6Nn)a8Vp7d#9L{OKsR(%or6-lg`Y?KqI zs$c;`;X~-t&j}Yk%%1#q)3=!b7mRHaycnLDTKr26-6f1ZjwkwQwqzt?OKG-5833KQ zH0Vsecs@E)lwA~`;UC#1s|AM~^|XSogX6-Uc`2K$=!=^T->EWP`eX?j3Bjq};yZvR zebdGuM>s|VbW@}h&VcZTuG~i=y$gwMN}vQbHwdgF_l2i6gWS8mT@N`6<9bV!`D^&RLTT+ zNn5`|USVlvvoZ7(HxOcQ=_@!fHWo^wY6!GkR21Y%;I2UV*9OxyT%(BenR%z39<|W6 zd}{O{;oRv|^_G8xQ{FwAkQ_9g%%rV-1?8aORRfdF{5piMQ`2uD^QA}k1^TSUq4{kr z56*8plvz>>wsE#d2Hx2yFJF6I$Sbp#g{sZ@InPnyu%THys=>jk*psSgr7x#cbSan* z$361Jof$<+Z%6sgEd8V6A7mX=TPWw#FS=n#+B3|wSFOuyoOnQ!DaIB?Iu|>4u+VsQ za>;?FWFP-48gx&3hoPcBwtsh(x~ke=FpaS#aH$Dcw1+5phf2W$jcjZX1c~`DV&qqQ zi7c;~N)+gg?K@~08Dr`c)LuP7a)gyU@fT2iJG|M<`oP+t@81dfZYnptJZzJr@1k78 zfEc1b*L_6*{+RG6of}swoeQKbh+=RO8e~8AG@>_lt`(!!7FM6`gGvvlU)-nWr*2rHTl%?U&*CR;;V@rPgr{M5h zXM@9wUMem?$5$I`V$v-OzjzcRBpaSX)%OZkS!0h6O5Rob#jZ+Y#-sR}vi7mBx`*g* zp637klnrie6_01C^XXeO)v+rk?$-POj#UAPTapKkCm-JxCO-~G%Pffp7%JynhJa8z zZMbxOYPidat9kK|L4)NnF*CV%&miv>G1x4KYUWXl-*T#Ugy*OV0r~PJ8NayMDA-k+ z#p^M3u}>a+CAdF{f(-xFwR>zyO1oJtKi360yyEABZUd|ij zrP*gu*){th^&d6cyjBhXANgs}-ZA5gFAL(wh;DRS@Ee5IeW3OG@1VD@)vxQ4t^SC_ zwzQ_$pdu znJpNVAH^Eh)GF$@YBj1k=3`*+CmW2Is)gZXZfj*J?}(u|sdoGptr5EJ%_3%se6@t} zq8xMzNrnqsl0Dset@N&5;c-}cJ=iGHpg?%AFswR8Z;MuuSy^;t_jzFUarDu2u_d$L zrKEacJ6Xi3!MGIp23wfD-#J;A`mhxFRYz$P3$rT)!IvV(^~@x|d@Nh+!ZopHM z0A5$-fp@V@^G%(~iW5{-YftXpxq|so?5fu1eesKMtn_&C1|{wmqa=Er;}=`H&#khFNrtH~1!DneS(7 z3nwl~RW#mopa#Q}QWze&Nxql%Dg9O_YwU}GZk;t&@nrFR7<+PVyG3E$A({SroWMUA zrPC2k#s3%P#qU|#{{5o5@BiZuB+4qT$q*Gbu2pK5Zu+M1{q2v3A+TLuI4duQK;os# z@r6X!NtUaw)9%G@T{TR7Q|c^ZE&F#<=Vaq!RU<6m+cln#TFsillJMfX@zONgbl$~y z8+_055YsGLGeIj39Qc?@$C0i{16P(Oc9dNGM4gUpMzXlA->UnTob?J(+c{Cjqs_zK zw;oYi#6XjKMYrCHw7q-tDPLE2U~QHM(Z!-E#_(H)ane7Ip&t)k}cA| z1hAJ))@4SFwYBBv2p6wLD_OH2E6ybjvHim2y}v^%FD*|I2tNAiZ{C~5L#$D2b_ccn z_S??M*a)hz2%{p#BDSTB%07+oLs*^CL{1@Ses`D&ML{rmyc=kfJKmU84nSJuytU7m zvHfy8c8MR=jAUTk9(<>=(>FLeOP?iJpiyR7Kl?s=3zF5#dWA+S1mac?ObRYGyw;$hNthd_FHYHIz<XSQLhKks3QLKCvS|;<+pGUUl zFkxY@-s<8)K)YlGovT_9|HLnYV5)q%O~}&6p6#u{qcE(XIsqaybazkpdZ+iV!%VVSiiEL&<#O8upO&`|nNX87iWP{uWi18H;-KYtIDU~&v zE)n(bGN*WkqJ%kFixM7x5}mra?1m^FfZ%MQT&8ZH9T<1I|_Y`~yLz2+kPY#G`WC&r7zVhnC;g@d24 zw6cI9ienIgzL0<$xmG|)%BJv^%k2u%ZXfN{Ibc`FTrtI3rEwLH9x zMpN4u5(hLYsxF1`lo78zss)DuGQ|O_GD}KyGj=yVZec z4U=0lcG_{z2RbLv73-rT}{dV`4~#x zo>Fr6iY<8Wy+0SccZ;mGbt};4tWcHy`~7ov*th=ubFS1D+@tI30HQz7p5##`FixsJ z&z|5>!nJ@@Ca{m*nS)wv-xn`%#?>o)<@GD7WmOIT>boH00*9g+ShQ!YgBLQIA5L0Y zxmhPDbWOMnI^$kHpcmu&cn&E>?{1mYH#qh#{V8$~@x}LS^Lir3pe>aEa{&9-1?+~$n0QcNq9Lu$lH44frtE){BqQ1 zSkr@26ExVtt~$`T+s29f@DD0y`=;A5ULW6Z3o_0ysF;~X0K;(w^__na(LVPuT{4TbJ5;jFUTn+D zGzD3gSKhVLMd1OO)*N6H)a4?O3Z3~Q`5x~yjsWP68|3^FI4APPtbH7hHDQ?ZBR*sM zdhzi!59EjMjVG1&{E?qtv=&5Qfi54|EYf4d(v^Ng^Jg9$g<}38OssOnt%-+Y zlBY6rspHGVFI6sK9(XXEc)d7r2oDG9;ZPnr^q{L|>Z%fXpO$6c+1$rH0}0Gz+GCC7&3zL5F!Bbe3ynpvgnX|OE^ zCxS_}=#H30&*a4P;pJgBzu+mN>>*!&Zc@Gc^v8v2QONxEZr|j^z-r#E{Pt(6*7Bhg zJ@X?C5G7dh4t+{#E$OhVI%u2xreGTz%e~2Uc*i!FqCR=GL%F*Qj*k?{-lr&6gAAS= zhv@#7ep;=*{8{k-@zOr`Pe4>Bf@n2qVLbrBdZ4_~%MAnajRn-}CqEcmz{S@DIh(>~ z2s$A``c{Rmy>z&%$m0!{!x;u&=Cwjsi$iTp9`Er-wp#RRht>NPKa5!tion)1XuwAt zAXtU27pvAa8}idJDF=)R1x!7d15>;n%IJb$v?d2hVUmSpy46`QD`sDIDyd6&)OKI? zFg=Xw?qOmWZNq+;49H64XY8$vM08+=IYFEBAHC6#Y*YPEQ-+6$+XOR*x53?1yiE_N z>My0DwS<&0MOf>oDh=q>!b+xig@f%as}jM7$!g97PUV*r6Dcv9xCtfZd|pD!G94&sP|oPn@AHp4WJMafuk|5pEh~*h>g|>e zhEt(7lYgCtQl`Kt*zS6SEQW%`e&FZ^v(Dz*Pno5+6uIh$VP|M3+pO*8Xe1OJr9Z^uovz8QB52xVP4742_ns5?s!V%m!b@4}V`vbp*&Tg6E%9OWC0*vOY zmF5f}G}N`b+TNF`$hI9{swm4!VCJODPRg3~ujqqN8yH`&U;wOayzaL6U|w53bdi@v z=o}sg$Lzk6e13+ngIcspc|2woq^|j&y_j)>D?{WFQ@uIsDcW^t){F=nwv35(g(T{- zU@tlpPj;2+34MjquF%K=QAfyL{~#mkovVyZQnv!eT{EY<<00_%9pnh?n*vwuup$c~ z^(D*UJH=n35yfBVpNI9&Pxa5w_0I$P=OO)bAO9$_k<#dIGrp#{2g7Yxo|14NEm%Qh zvaUB;^>@Agg1Vgv+@W2|x{F=ed?s2>l)%NbG1J+L`njQtTiteG$pqNM({J<^2L$=I zvLjnXRQ0$t>@`TK{8GrCtMY}J+lsBG<*6}YTrjVClp!Hg+?gr07##t-%OQDLXm@@1wPGz{C3PmvmtmiZ-})>H}&V%V*ZnGBCot4>v5jUoytiO|7%1(Pe9?hm0325 zY>F~x6(*yLMG@|{1Q5qFD%(ewD%E4G9LL4m{isg1dR!c}e&fnWW$I+s#Q0&TqMspH zaEkn#m1)%%0RRb5vyi7qVLy+;#jwTl$Mt)7W?01FZMBwZ$tBfC*BGeV#ejw7QHxP~ z$eKy@a0k6%G1I~hxPe*Q(!5)K8P|BHbv3Th59QTISNU}vT~H}^R!=~<)Me`5sZ9pA zF{S(LeW=6+R5hwZN*@N>+RO8as}xTydZt@KL?tZDL?tYx$3F7)=PF?lG}%Md*`sO= zAHx{!9yHCz1CsClIb5~Qlp@$Rn)3$$GbMTO!M%;^NwKedZ0F9f%yRefcGP1ebKh_{ zm!|gykYl0g%rUK1*txWz7COKaF>rru$9R^|(vR`Hhn9Yf$HyjAM$B{SM6B4{@6_oz zQYzra=R(tetO)0RjA|e(HR_#bi`IyhtCJ)D_PdRx>!I!&Y(*sp@XPM@tsP&$$Ub!T z7saNi(xg}d%tWc_kY>b{MV?;k%f}{b`7O14&8qbDd%_)Cu!pUMrXcQpZ3$T- zvex)!YfUX{ji6D5@`0l9)uH1KbxcsL4Guca8o)T4S`ubch0G6r;&Q!gK}xPe!jAr| z5&g9rmfom*An~}XbRe<$s+*_{BjVd*Y8(U|(2Z|{g_m_XPY5H<;7zivX^t~$Mg7lH zb57P-r>3WLTFnYyYk_s&N@RD3WxaZN@CuK!Jtc3q8GY@1E!_VB`b8!^faVO z6rgcmAnD>v#oY~j0^;ZyHe!|T2FcTjtHOw7$Y{}%+l4+F*1f}i5T;wbA7tkP zjB{1{?GB(%N@|OSnc|O)B7Saed;N*EL7AL3RE^PizKr2C8WQ`Tk`1?ryw4yTDC%lY zU7J7D??`V^*nAFanO9lIUvgQXr?N$ne9vDfMtQZxM{T^B%`M9N(Dm{PnLmCkzzT;Y z!)kqOk}SOomOg~dR;|y&uS>7wY(j_5hP3Ak{DV|;$XfGEn-#y^o<*8ZlWpSHX|!V9 z{HJYjol1ygCG+n{-H?I*&FRDi2XxkSur4L|jL+qaKP3PBA*l7Dk}*C3p%x+3D1;ha zc&L^v-EcB*gVm#mg{JSVmap?|rFKDXq^p+Im3A>F!cWCN^VS;%bvrF{a8`3uVq^KznHMnOdcBbko=FbY18z2nddP46*__2|r)g!H$O zhdiyVM>aGUoKEP<51-gN()8Swa*7{mkzc(zKo~yS&Q^sGM9tD|&wz@#J^A4?xk~u< z(6(J|FN|&dV(NPRp3zI&KH7GSG<_tr?Nr-6V_UoEk61vR`r!^(G9;D^pPU<+eXKRQ z3=hzJ)#K!v7x$$baFX2?nsQ$WBXPeq3(e)|B>>aq^TIRL!N(j-Jng8QLep=?1Aui7 zU{Yxm4T=)*@rVwwueWm7Tz~ba3UEq=|5Z52MbBWWyJD(IubzH|KS|!Mr|b1}nx0PP z2}Su3jx9Mx88gW!Zl^e+z8z8dtXoB+(@@A9JP>}?BPF?i6)+FCeUZBM?BA!~9sh?t zkBb}F^Gc=Iv!&p%f#3RbW=uooVuq~GjrhXPR*X1&?(DzNa70JzeyZtDO#+gB!n-iL zfu<6NA<}%$7-2(A*}MlI6In} z8X)$yRu*Ro^EIMqgk(FawX9IQAGxEDbpK$UqT(M6I!s?-kShKm<}41A98_w^`j6Y* zZUW{N9x=X2mq9O?mp&o^E^%hHxNS@j3YmvK@7`nE^J={Z;=+48_tD@zJ_ua%9*@}g z=-xwosPzD8?{O=wqxaZ5Kqz~UdTrC*V_|4(-s3m)BV#_=yhqssEEN%mU`*-o$sHrJ zkFiFV*#~@-t44FH-G=dwMx&t-ZsTR4kphQaYf$Sln!XS$KFxM2M&}^a6&e9@^xg5K z%3|N@a#dfnW}ND)lW!$Nf1ghNm&9JEOP1+r4_Wf(^z?AB+V?KRY75F(Oh#!0neFj8 zm)Ys>NXd+&7sodSnZ5BNL1volf@Y!V)c`5a$7}d*QPUY{B61r(6OTWQ)=_4&HZL=4 zi?<&+0d+eOkH6+JYilyQ3o^ycD6?KEO0>>+u0}Gu)*1zwUE__S%+#nb`zK!)|K;J& z3w0%`lSNwQYadh5T$fm{Y|hSZMt341vAWoF;#d%&`IQ*;5|OW@Ln88V5`8G=EWjnZ zb8fV>B6+!vkLrf*q)AVmdYYl9=YnX~UW#a*dy0%NlX2kqf%g=@thf78&J2j#8}6s7hdVVP+p%r zB*bIpobcbv41tikca&yH#N(DO_6fX>*dUc2UWH=<|9hP2;PjEXEo8MFdDJO4z5~as zZ2?Vs+Gz*`RR(o7pk^QRMc8G|`zzEbJ8!Dux%aXg>h;abV2tey6a(Xpx_&?`HUmc( z@)8P#B$%=IT*$2ap0lpmKl5!4yKAIrHKrV#7Ihz>rY9?2m;P}TV zRy?A9M1F8AZv)&(eCOgD2JI60pfDkIzn()WuUi?E(ijKEYYjrpn&BuXPD>Ni-r5k3 z3p#U{9~Uo0Cri^{Slf}`zUiT*u<{BlR;=s*R5dFb<;0AYnuVrV*->Vt-=6}!4rAr4 zz)Cl%ejv68DtsJ@&!Mi(I5gYf``n*CE@))ubz!R3B3ZUd1+Y#X&Mjn){I0Wp$=N9n zM${R7sBhe;$NaE3c|0n8;U#iwm)Js~X)~+b@+n%v1r4B|oE@1xms&oHpCg`!S-gdD znn4wsvUj`$roZwDV>-sMy`DZ9b{VSlyjo0V{Rp63wBHziA{%G89R&YaLut13lor?sWokdby`W^m zmmXDbtbAlv3S_evoI&!$%|S@*5>i&YL{hr50ZHW~vwWCN?^qwa`rN&$Px~lla_1dT z{Bo4j1HuZu_>+lnSmw*p)J4yj1IC}M5E$Y?rOxNImB&eyM%QB8&@zVA0|ifQ0yR#} z8j9oAL_8K4PdElorONseN!1zwT?L~IFWkyrno*t;p$5 z4pu%|e=Zk=a?-HARG!4`#ipz1Y&+GY&wvk#+o^VFgRDhkREN^C`HRTbrACL`d z35Po*nf9_u!G%fs67O>=K~js|JmQ#T`mB)+BtqSIsngWSim59&1p|x5=}|oGN3E~e zZm~~#d=g|q#L zGK-fj)@ynz9Lx2eBf4>{#~c0Tota*y99f6Df3fz z6-j<-f%&Yrl%939u~XJi`r)Sfn;ZJ$5~3sYF5MRKRu_gXG7i|s&&Hh1$TsI*&I&yZ zF?9EuNAklzk8j5B`G{=-%d%ecu#Ysiw)Imp4bW5`C5YVYmgDYG_1<8WxMH--7eZlo zPGyXVddC-irmBpZS{w$^7U4O{rJP(bz%9O0Pr#PLFc|UE_>w`;zevOL@434HI433t%)lw8kybY=b zS`(x;;tirGxf~v#p>((`TPCMJE}^*na!i@;EGS{*vZg3vaI-Z_0Dw%?%3@4?BF9JA zAu=mLO;x{yjve9^T=T~8GTEm5f(`;`QNIEq0~j@|Tr`Zbn~m<$fg-|=aUI@D!Zv5` zhwcxprdl=V*?f1PINqvIO|jFr)R0Qi6%-$=SbK8DyMo&^ z)|ft`XciAgR}jN#pAhHES_YM4&Z}jXy8EXav^Opx#VFnj$=@8A)y&EK=_95RPb%4h zN+f^y8VY=3l>(>y<6v92#y4}3zY6i4qA;nj#z0MJEJY=I_^m%@c`rZxQ6s!R2CWtsO%vfndlZ)$tGTQdNQ*$e88|ntVXqb(;D8i3KtlNRmYfC+zb+# zdU`)pkIgGAUJ3e=Q@>KvTz)hf>DJPEp_%HyhxLFpiDiVZ57P!UvG70?w=gkhh7 zbk;3e)6P%3bt3d1@rkEld=XwJ?=!{uiUV!*$mwao&ix<6WAh!`U$E$fclS}}AHWO8 zxe%YaGIL*Uorc(3NSN}0q}AZ}n2?14*^2&LVv{_Ima14QEwSLp7YA1c(~uZ(x0+ZF zg{Gzlh-%2oilyx;7!%Aw)1TLd0yCmcMYp2K1i4UkHB;K>+_1@PYX)`-C@CBr>hy>T zVJpe^O4xnMnN$wUPOK!FV_bWw1n^c){c*29;q~ozeR*0D^0cZn4f0&PNqG(#Xxt^= z&ZtDr<{@b3ur6IV7g8N0ZqA~epHq1j%G9P?4XIQ)$d`)S$ z(kn}gN-r-SpqRX+^s?fs^{_SPiXKpG`J+i2)1UYsLM+M_E7PMwjQv=sH{1| z&>2Lj2%;eMm+R8%e$$mlHb8<|gk_D)zTzDg>^8E>|3)}c$n39-;kk|WV-NcQ$tbls zzsBV9uRp`vPMPf~VIIIhv%pU`&~|-Kep>RT`-zEHCv8IiBnYcUKNau(8~A_!h+6!= zOP2)e75o<{BjSIq{iwqK&RY!sQz@B(e+QY#2q#9t|NJj)3ID>pc%JyC29%}#d177y zmw}qDjawR>Q+aX9=Go^1BF?i9KJt4XK3rdHIZ<%&M4bVGP5Q%P{Z_WZtjXDK)LDu0 zD)L3Loe*`9g=Pz+;Iy?xH-@tof+u9C!zvoy^R?3S8+xex+YM1#l&M%D# z@vH8U;)|H(>wsLnCTlC>2On8F=Yd~<)1ZtAyz^8xBnV0Z-XFga8?s5I?j29zoiF44 z?tpjR@CNBFaECO67#34d+~oSD0dF%pkl*BKl7Qz&IxJo70zO|rr_lT;K#48i*%3VL5LadQQ9oJ8b>P%RV@LVdtN9< z@~}OA6<1=X73|kzxIDXDqx9Y6KW{{{4~aomjX%+}jP*r^yakM4tdIBks4xcUa+o2c z_7I!br}~vYe0E%9MXl_znRc>`C6H(Fx8hcwvUJCntcU*lqOh!*09koD{4Usdzi|bpTZ@1>^mmF`1EDgf#?~qPXY!Mm@$u= zPa}d8LgAI$cKhC}2<^94PN;p?YfqD{PJGow&G^6oJ9*io=DYV9gT-G!0yXn{fB)du zoAwtPbJo$b{?b7Y*&3Sk=h+*0Box&^T(b{|RAi8b2kJ_M#;MbNDV`QX0TDV za9msS@WiaPCkW}4LYX`*^h6=W*fc7GTA1W&xkqN7WVTR3Tx+P+6C%e$G=b(G&rETW zTK4%gzHJz1L^p(RikIIKO6M1jnSR2Y^;dpKRxzKJeZp@cUs|6ze|Xj|^G2F(JX2%C z<-0TBGUA^X~IZC9IJBT(x=^baJD1CJmr2;5Q4Iq>XU~xx!OTKV7r2I0HveV{B zx&G~&A%!(bmA@|AWGy!oe}kk1l=HV=`IjxV*6uyDgrcpXMezfB3XU zGuZ%IifocbqAMJl5W@S8x6AjK58zGGasB8n9)-!~hgZ!XUYp#y22t?g!dvBtn9R-I z>vOW*^x0jRg4^y_&Pv?@fbE_w+vPhka!|!1Q25f-#cv5XGzWy_Lb-$^Q{2i#l{xr5 z$JuIGju@rs0Dk0$XSHoyD{LDD22WArKZ&1j*qdrh(VjjcwY-fRsu_*!11_uI8g@Gt z8y|dgf=D7PYj?ZC^eD9#fIdlmBIPMJR19EwW}aW}Q}`{WbXgX=kIT!nN6-vX-4$%(MO_OWKM z{u%r7-0o#Y!Sf}245lu8F#F0^!x~PDynpM}bjkp{WXMbMYLiomAwZjjRubDrSd2X0a>C04gb0y!HZNc4=xh<;~;Vy17$x+^FDfh=KJ zeO9HF+C?CzHX(L>I`%Bw-m%*Su%TKVxt^1(`cCTIM=hmS%e4c*u0`3(V~cki2YBl~ zqB9&ruR`Vqdl6F06q4)CX}M-4BZh~;HgzFcbsA8M%FM(E+ti~<+Px&FHhHx%1Sn~> z5{Cf-27~e*Z`teR28nWmM0uB&cYApt$l+0*^YXlx8$8+@Jj&O5`35gHc$6DF%7a`N zm*r~kC^vYN2f5N;J-LQ~lDOOrhWca1ItA<8p`IyTj^UMWoL@`u<02ZbJg%^isA77P zhN){zN<{m8X_KZ`5s|u(Al4bsw20KBN+!IdA|gY8l9g6MKx3)H5R06Jjm|=Y1d9w3 zjmQ@%oil~C>-D5$?VYuOV0n4UIq?^eK?opR%f<~>0h`YbL+?9=2F z8G{Il!%$u&SQcHn!_8L*=-Y(#Z@vog0(UF|E^n%Ec6fL0tmK;K% z)L|gaK8LA*Murt)c85fHkC$5jM7hC3kOq(PE-&x)_6Cn~gGYI-wi!Ii4IbsS+Gg-5 zH+Yn9PTM4B#9bbk;j`(LDN}B12zt#AQkO^Uxz_J+YcZT}Xlu1pUfJb*PI50t+RAcP zcrQuLJ!bKh z$wiebF_9maf%f_$4{COUjXN$q(=6ilwZhy(hvFW9D87P!>iLkf@jCY1wfndt;~x;j zyFfF-m0>AI(1+jkE_y1DUFMCq>s zC@^S`1mzOs7DO;;fe5q&t(ux54e4lA(Bd_U9;+6uH>|#>DXkDdk3~@nDijdh!xStR zrB$Tw_xC(&?b$O)E5~!*&;OqfbnV$|t!F*=^{mTYtMKitg1pqY6e7Mt8X2ewDM+6I z%_@jmR8CLGsVRsdKu(wCVEC2>7zkiE)La_!4H5!2NaQaL`Ab5+!6V<`k>4Nk7lwR; zN4~)$zfnO99{C23{6A98A(Hw4Jp7);M#K$*dSvSO%NvYK$h(g2D4_K@EZ@|~ankNiT&ZwvVb z5BLU;{6@|jJn{`5`Hh@6c;p*A^0&tM##kG(u>&sFn7iQ?6>|$r=vf-(FMQzC%^tJV z)h>~uH@e#8015IOu01X`HvVgQ{)29JD$M}DI`4IcRhkNie?8a(n1 z9{F37Cua?eaAjd~!75uCINOucJbAMxCwj8xHY;+cCl6n%@%o0$+(P|$-PTX@qG-JR z;Bnoi-~64TJBuL)ck~GbDa^jfM>)SCC=4^!XbV?G-e?tOsRDc8qV~<#TV@!F3I`eV zsNC4;=I zHrAF~&w{v%G4735ah^_kwLID91rTe7&V% zB?YQ{PAA!Wz~>?1xUGgY&bW$*fz>_w{v>l|a<5AFi8)LhX{xcDJ2ar@A5S=XV_RjA ztV5wYKIE+;tgw`3+>wDAnz7a7=xbp3r|TGAH=oqQ0)WpaZP*n$=dW)ur?t!n)yyX~ z^BVzZ>U^>J+;kp%k8g|Rm)Kl?7p3$UMAhw;rtVCaTYH=UQK5h$ukg5zM=`pG)EHf) zhFoliQYezBG|X>N%1#yLB%WgKONv+b@^0og>RxIC)VIT=hgAls0keH6H`L|$#`3AR zY_9i7)6bJ6dzZeR&-P zu!K<^=nQsh{ykGqo?%d5@x)6PYoFr@8}NoPev?h^<>{6gTc$X4cl({nc=dOJjEAx_ zaQKOaK~g#Qx39g@iTlOA8RACN9)xsDb}aVvm@K*R@2f}E=!l#5y8<1m6u(={OXryG zZYHI!Ju8N=XRxq-n|$@#F<&NY&+w$KUxy*e6ZTSAiAS2MZFH2KWngtec@ZlRESopAogJHJ@B}lg|n_%UY3(edNO`GBAY0 zI!hVHDK({9CoE|tA&Y&y*l%m?!C-ShLU*iktsHB z^10q4*&!S1&(h8eblKXhO>0;Uc?siws6n|-gAhk49KmM!p+4o?49)_d_CPZ_jJ8mZ z{H_4c>H%*&TM>QjRxi}2oEZ-A`o=LJVytWFg}BLULgnT5AZ_ZWCH)1)FXU%<>7 z^Dr2cLZgYvf?!oJzP2dTFeXFa7aKL%@Wo(*XIE%LSV&vdyqu=hfSwJ?r`$$MInc}U z;gi)1^(nUo3RG^bQpsKUW*0Z926T>)>MsyC%Fpn)Rwc@;5hw-5a!P4^5PP*&uvbet zpUX<%(k=b0PoYx7YEnMd4ER8Y;bY$cPoHipi=5^)^_m>@F|hPRFRN#7wr>9^Wwhlu z1&%~FXDeWQVX*#-$HRuECoGxvq!QvB0y9YoLupICKIA7b>D>Bv+ILDidsB>B0&@Bb z+!^L)cw8>BhjJf0^#lR$w`AIUB}hQk#66Xlk6UVmw_vq?nfla^YGbN;=9xpeJvzjn z9S3KXcN{$)$#I;*ELk&PW(`grW!ZZ)uQhy!pZ1Rb`3>(K#m>+e%ieOHLShZ6;8#}b z;1LQer9nm5#C_UIR?Z#!!F_o#xpkI$33+p;1MN<>Yf~>8>fj;>7^%p4cob#1_t5RE z>LGFMah6uA?R#b2JAd7b`n7Stciz^<`zlTJV3mvbCpk_VKsPA>g!4Vns=vVQUVeth zqA4KmLuM^ugI1fF_@b~}lSZ*peqcy_H!4l#o_y*6y$&mQj3n%{YHwA7Q*+{3pHhky zWz*&st#wM20v5tk@T~?)ZZ%Tw#{pk((BR|Phx(M8VA5ftA;7cWhPJe;+ zZlg2QqE)K}l&!hC$`1Iq5*r#Gxe5MWz{s-lPriTgPOU}F`gZH4fPuXNcC&t4XsUx9 z#bwWF3{CG5dX1s!59+D}V7^cL1}o3rYTu@Pq~RjPbc{NJD6P8{X+i^r_bJ^1N6NYF zE;`7S0j>2KC_(a`XCAdtSO|3f1*0&HEAvb}+9lb~R-dle=E!QbQu&oQ7#ZN)+7u*F z$F0FI2E>-$cTjdFOHxesxzWdj1-Qz&0Bl)%W*jkmW<0PHC2j|a@fu#c5bx47Rj9xneh<&J{Ss>DNeIgKi@lH9CHTzLVJ&(}j0N1v%T z33OnSw(c*q^2JFr^!>+`{BTw16!z9}ovQ+8j7((!w_H^F<8bY9v4A0=`e9G#pOcdw zl>G2x9`K?Ef+DS2VfALx6JX#3L`0M!XKBd6IfQ8jYlAvVENASTlerr5&DDU5LBfy> z5|G!)Cdf~elJ7Xz=A6v*$^U=n3IgBy0|772gVq~l+H*pH5d?uo5WY18l%F|V^x2F= zn0=`8pw>EME(};KHnuR}7Ec_tkO|NJ-}3~k-@ufaMS^{PF8MoIR;WJBx#WMXt|$9E zepVi4qf1pz;XWQJC2f0gN3fqQs?-esrv1kl{;O|jF#KQrrNQtgGl|dzKgKxac+0dI zOPy1GWniD@G+N*!ah2L3VWs!7$86yf_a< zau^R8=PgQfPgVLVay8?;pRbc40-lgu^oa%;zEz`!8Wd+ya{%nr1|MfzU!FDk!yCv| z3GT$f0m^yb8*<0v(i-DZuJTPQ)5xfkCarv^dHYdg6pqxOzG<7454CJRdL*p!@0Y$s z#5V?4eNQol2`0`r)a686<5bk1b-7VssYLBttiRT&N`!FMq?L~}Z-1W*2bzCrDtBy@ z>zsE4xlS4n+2J~X*`8=Y$Z^)y_llFM?@YTyk(w<7$E15RYq~bJfOPNW6v*J{3_aIX zZa%>(amx{0kox!P#_C_>AgUXxPgahS^8J}h&L62hR9S$gRDMm-$`s5hdD%B?&VHIF zJ9)C5Cxu=@wCdw^Gx)XnQJcRni2Zf*_nNKjg$v#-+U5^=Q|mY%Gw$do{@J=e+^oJ- zx7m-onfpi@yxG2WJD4%eP1iF-8fyBoCDY1EY=8g+h6?OIGnnZlyPQ@z_o`op z`L=UjlFql$R}3}%;-G^jXdaOt@x-cvFm97s*^IV50NlT!jIT@fVBH8Ea8XzjfJ3Pd zIS9_{@u46^wg$Mp&%A{C=mA0lVg}O!4luZ5)I#5kiSH2;F7#o z^kKBZk`;PyAAbD+#%M@>CPTDCr_N(f^7Lo$X`k0?s&WX!KVHl4efVuLHB^rtBP4U%R5i5( z&o)(Ma=v6B=CQkYJJ8H8Rd}8bRDbYUAE=gwya03;RUW#nY5b$3ax!h`c(MHcY+W9i zdd)FlkGc)&m<=$ut;^Sk{V=in`D~a_I;F_b;iaKzKX0?i20M20IrS0L_ah83i#V@4 zLCrI|kc?g4?k)5j#wIYYi(fSC#U%D{B1@N$3ETZYKou!Nm-352mDZ^qoV4?}Bn6tu zsM5tNy^g6;cfBfERT%4?x3;$em!LGhVP;jZ5W%peag6SBqw)fis=JC^LMd)@KhgTc z+|Ki4>9$c7H2}XB0|9=?=@^nYej}KwcA%NUMfKLkFT1AXVA1>TJ5lbLQ<#XCJfO79-wfVjzA92DS+ zl}YcTUeP=o+-sct$_Dn<2y7a)#^SV8+?|s;7AUonU}7bKIjkDgTpDWHZ)0q(@?|-c zlwclu#n3)60^NnH$;~R>*j3_WrUt=-oYOzZf*ms{drUp}%`GCQpA?l>0yf^bd9_*6EME@$!_0KxfcCnWFU; zX&<)@FszSbf^T=5cPOCK0gOz%21f7)Ru@-UZL>VQiwt}Yv0M3Z^Xo;A7h2Ob&*%zp{Na{)5g$p;H2$2wQUXUwMkAG$a}q_1zwY? z?@}%M_EEbIglavOg-|QQ4#YSP&W2D>)r=B?Rb*K8C)Gbx7gRomgTPN5DI#{N?#SRZ zU){DknIn~|$xfcs-R10$NbU5Q0bv)$;pknSOCB?H~@q%CSz4#;revLi1r=$N1y7*7M%ZT#lua-KjO6FaF_S``~5_ZgF z^oN$!OWAol*XLDd{aO2-LfgJNcMP-oDCtTPyHi4 zPrbrWuK5iokTgxSWZKh5@QauB*`Vh=} zXncK$DPxGdz*)o@7`e(Nf>qAt&VCh*Pi{@l&ZPq&mxR&il=6u`v@C^>@?VHubo(v~ zy^O&DnFF=6l2@n!^jDobLA^aIG_Yq`K*(Pl-%)l+e5ScJ<=2PLO{(*9BQ9(M=H>Mk5PGSI&L+ zf_-TiiG6(=NlY6~25+@>OC8tV47o$OkG{+Y9y%Kaddp2eE@>>)a6v~1R>8~d_>`8R zX{S*$d_DOVYNpqxEf*V++FH_#A&4lwqKSVT>kKiYkd>No)N>)(?K(c4{1$q5AP6OS zepU2YwOwP0@$8L_JUhmCdfj-g2pPGj7ASOUdfJj{&nTfi=Vde>U-5PGu^g0QgKjx!t>iZSFK7W1GXuOl|X-mIm8A`1p)%s;tH|aS0f0Rc-sS`G?dT z&o)&@$c&OU*rr~=kn@gy5w`hWc9oiK4$s6kXKRnCA9)aLYpWJSulDLgu!W(f11y<# zpc3SW3o~A6$HGS7DZg`+J-&Q%U1psSqjLprE_5gzikFr`ySJ>XM!dW1cJjO4RLUQZdcslX9@#7a=tmW~G&N0^hQ!}__Zm7gBX0RA> zJMZ-u5bWTmJsETn9U;76QbT1Qzq2eH9EE#p}_Z_f~G%E`M40E+qf_zc_Hc$T9m zD8){O1&?}5m6ES|(h_>&Fi~NS;bL>8p_sDWF<6gWQav{c_qz@=I0o|_&B;!SeBHxp z6az`pmm-h`HtoSDgFCB@U^PN*jZlJ=wWLm7>>)G_q&Lah_ff>zQxEGWMg~4qFo0zO z2i8c0Rn9%Xav!pUac+LWO~ahERe^Y`0;$cimzJb_t?vOS2*t&Kk=^KUi^D~}Uf5|- zVPdUAxrdW`m>v$Zk*u+tvL*rm6BlU~Y`X5eyr23oqMWj(_q5jL)Q{(r>2!6&EA!pZa%_o zMH(s=6qRZ_sZzF+lB`Nb=VL41gp9ivV=F)6SLI?G3@d!=P&Mg$M%No5R5lU#SH8%o zAX)Zt8*6^WlQ*9MtQ+H4Q$vQj@j^>#Z-3Xfg7eq+2(7_ozC#y#>(*}+U@@uw0uD>` z8Y25FW&4d%^koA@gziSAOn9)a`u$uQ{fC#tMxWuO>RUPaV`bS?&AhrCzMdhcHd}LM zUG8T?ZvEm{J7rj~tWDT>BMu6rG-tD&l}Q)BY*8~;d5z84BZhN#kYa=|8tO$R{zzKG zuTh@#N5QEhsWB|rD`O1xd?9+W9wg~skTHf8fQZJxjj(YTXbr0gAut@u=wjGeDm=?f zq90^}B(7BnpV2jADlcf&tLXPi5)3$Zl19JQ6`yHfLdeg@ca&|8&*0Rrd<3*mDdpDz zTY^rMlCOHAtw)9IrTM-4gWt0^%7$~Oa*v93tDd!MUL?W{ey>|anv>o5mL{#yRZ6Ln z?Q7)Yu1}&CR_%sG7&t>gk>6WzeSe%wl`Vj~ANdPhO8{3;3b?iiuAF<})+q2eFKu{- zI`F{ihy-_kANf#5;>%%Ll(=2L++K# zd9{f}bPaBwb+#EycmC=g>hrmYO%RoHN1Y!0^s z;`2%@UM}8Aez%Vs7U#U1)(1PA`8Sjn)guC4ZaV2u_pxjAlhaHk z36k9T9yitkl-ka^ozgu78P;4bKuBUNYfi7rsb@{Dau~T==T5F7msQ801`f*SKMtyt z*(S`>hYb%pEWe!VHJu&n@GCoxN6F{wM41)xhw5_bDVbEI>y6}(*L6**9;*V9?bKV| zI%(y@&1})B7xK8fAsCly=9%-YH&@%Lud23IUs-*sx_9+u)t6RVDn)WD?;$Vw_;nT; z40*DvCrzHb>SPrBAw}hN@xekA-Q)2E_y*#Gjp&TxgAGcF4=k07RQD*vy(?<3bx=hf zMOHznO&;pLQ=-RD?43Dq>m&S-mifUxOw-wn#-j9$gkIGt=RSB~m~xo=l>1e@jyvL^ zrVFOvw)hU}Nzjn1s^OE~O=j2?+vG%UZ5^h7-%@74K~b(!S5OQ!?H*t)aai%XY^!3! zDWireEuzYXQ-9h%jSjS1h)RjK>u@sc3c|^qMHuAj?J^)Y6#}ue`VNc^6XzS9fkE8;V}h-{N`#eA_)&w;b9Yz^#s*Id~3aiN!|w5FK2 zlmLb_^NVxkzHyJbbe;NIp7w)n5uzs2YPuL0M9kAgLy}~-Qt%w5UHu8Ny#uC|DNj4& zb+2IYToMH?|&rykWg>9$EE3r?I052OfdTWUPScZ-guBotMsk9<|o!)Er1yD4=?g)}#3aL{vVwnJGw?ZKfq3v}c-^zigKK8iKSVlu}J4*7_3)!e3^{2G{ zDAauYs|=gu+VvU9F0{<1eK?apEMDl1G$?*_6tAKv;mT&IA&a4=UUMxwr^Ho{qkIPh zhgeT*QyH|9S>3DctDsXuLBC2T78H%65UcoeTLyNq+ zq!BAdC05i7i%q?a9@x^7tU2eO!70I2@gYXbX9$8`$beYApV@i_QSxbeIL)Hu1&jn} zl2WOS7g8I?FUEr$fxA>-;ByIIs=uHWo%{@s-8^a&Rj<5shS9muex%e{)J~>kYw5(N-k2l0~zu@N@OF^3G!x1@l`r%;~P$wkcX{eCg^F<&G zsR9L=7STV}!wyOT%enXL{;$}deDi{T+Dv8(>^$8#`7+g|JLt8&Bn>=ez!984hNsvD z{t^iX+bCEHW6XwTzh3aNHk3e2I$1zY@P%L0YyC72op)zwx)EP;N_QB5n4ln>Pybq| zOe zRWq<*`P}mlFdfY&r?w`WD?cUfQn4523PGeWb{J+VxSZPK(hOTQPs)tnvAmOXV& zP`6Yb#vo_SM^z`XhC{B+CtjhKkeesfUm#a{DRQkn*yQa^>wQ4oluo68trZ}&IVI0+ zfEs3joq#APu-Y&sE)gy^0rMGo5csfCpxb+(+k1S3y&nvU;OkQ#(GVM?8`h^b1V|eL zWDQO9iCg!AZAwFDq2E~`Q*S{|6hLJG!|2}%Gx|4lYqH;_G;#z!`pw@-whz zBd^D>CT(vV@aQ@bQwE7b(kHZ`3Wb}c&4J-_HZ>|`QfuPlnoz8$VkL3d8mGhr%W*WN z##RFkS`Esr4UpCaNJ%K~$Tuvl0XeA;K>?m@>Va@r`*=e z;ov(~{a(S9BUW7yKLW>B8?!2Qu8XP78bi^_f~5ZBp?Pp27cR9bF%G(%s06OF{(w# z!pm8bsKkbHxEbSk4SZalwqD0Jxdv@OwTePUEukY?GT_O&rcP&OQS#{U1JMsMV9Xn; zpUsP>;$#54_x4z&oO}JTL0`*pXOu$n_ai`22Od&5W1J4?pT)cGS<^?@uRI{oE7wgf4eq!N z@$cVpN9B3ja7N0U1Jtjbx=r49%W3L#V5Ch9Ly<+F@6Rq)?o_vpA8PMm#HlAqTL41z#s8YFUL$fAB!;S0VBzGq} zJ#T^K!#kgo3ff8T=Sc&PQG5k;sFKXI+_Z3S&H9*0hXHOK{<3QL*e@){&|Obl@_sg# zR=)%>r-52>nYNmC#(wcH&*~z)564I@;-#^rJ=cFX)Zc!y}m;AyR>LCh@~x#y_nrBjLU{ga;mxVo!7J)pi@ZvgbALST0Ba$iJaUzPa`8Sw z)bs#l(4o_1ZJe}qTRU3Fc*Qs%iF=uR98>PRZl?djEd=gZK8UQNoG6ti zdV}!sieYAi0*+UWJ8uwoDi128H2h;nXs9ui!e%$CgC05tv`<2rB1unnMjS9L^L_?hvy0M#@^wZ5&oSA{hp zD93x#MT8ar)#ipH`Tq$0IKo<3iuO4nMgY=vg2MM(u$4og_W%tF4czuZ=D^;8hYNNe z?gF2o8dynYoTd6~*q*i^-IdZtJGwljT`4x#1>cQ-o?-o5EbWd)ScTp#d_eWrP^F*L zBLt(KF^Mve)f!7{QSXR;mvevmLduhiUkE&r*IJ=$h8|YTnMkmc%(<|}tr>7@y0|qR zZcVDb+PmlA2?uoPQ+PI1<407-+01utcCFo~{`s%l{bQfU4+UvMp9s{F<6yqJh_S}L z_&=#)y28@can(*Z3Q>w3sttVI4+VEbh)=cF&ny7xV@=ms7EKb_zjdfCslb4S3 zHu+7j1rz6ba)u|Jp8U|0w;zfNKeGO7o@{(;->>Sp5WeT>R*XkXuYYjg3wf)*VAtk$ z%ekvJ&~Hi2%el{=asZEb@#Mgx!zW}|sC1{V)-?rZmF$1N*l12(y*^J^sd;$SK?jO@ zM>t?%oWU_6%#7m=a@!?zp{1fFRqxar!wd^BhcP7V2Ud5lO5S-0r0YtiEWKr>2GaiP zTunU8UvJ&P;4-%y;`tJm0@0d-8Bt@kNc1FgwwFwpy7P$}r=D@=)SU@Dtgt-}*B*sZ zD9|qu=#P3E$vn=={0!3$tX*fN?I;a1q)cgDLbt#dp|G27V5ELc8GU*|Mz3Y0-iVxq zA*Vm&6vSEh9uDbi7x&)e^B?h-X{(m*OEv9LM~%&$Cu^41oX~kVp>ySg&NY`ks7A`UCl~BTCA$9HZ`^NC(*|cT zMva%;G1LC=6AJURo-$`9JP2zkAoTAa}P*=P}FraY;Or)&O5QRWu>ksPuJ)L&2!(HS14G-5#)sV;W+*&h8;y>`+} zy$*hcdXB%>`*&HNoOh~UqK$LOPIRhO@j}gMa;B&hZWmRoBn@liw$*@}R)grkYEUi# zc|qD>Y1rTbwT;{#3FTa_4dFKMq?l^g6h%@Bm@PKU#!7pM3u7c>QYz-!auRgA!50HdfsHeXmmI6P+<1lZ>8bolFeHpK&}yn zR9I_iSY@QV0iwJB8P`L(g`@&}8GtXo=Unsi-Mo_`R5i z9-#3)&MM=dX0|T$`6ycsV6%^~8C>SZNU*d)zu{*GSm-Y>v1mv-nKh5}D+(x(4~3TV zbBt=qlu+TkGTICZOAnhKc1(0Qf@fhqo?3|pweK%wG{?CbhOyqzj7BQFDFBV zN343y^BX;YEg43EZ1&zzY*lgzmywr-gm(x}p&?oE9$!VxqvvN>`0x~U1Lf-s{DO2c z*JL`lV~9g&zYr)ltAibwwfeeocmfl!@Z{>f+~Cd3`we{7tgS)tPsoX8eY(K)^FpxE zyATVaVk*_Bf~s{ov}6|8glq(+w{RXmYb zY>ng>T;NmKZ9+9PChiMjtC{eNhq-zLxAHz(dG3RUs|8NTn%R2X z%!QL*8botzXu`{isaiMM%r#G>l^bp8;%tTaxo^KD$lsR1IBFIwuat=AwHA^qACv6) znoWcn8$rdflOKO6c+-_I^MjOrDn#XRs@u}lAGtJwtnO&k|b0_Ub>(FxZ z&oWCb%tf83>n`~S;f4o%spX2H(hs z17}dXRDLfX4otn~r4C{6SX*^*Khs$E%r5G8mj>Tf7;4(n>$a)xy|jac4IXQIhPO}` zvX6l~Z)+cFdhn0dZiniAB-Uk`U;5VNxOR(4J?t4S4ozEb#jh^0!S-x5b4*D^gX`n5k`>DA~_ zGD}Z?k|mXM?_RtAgyao+@hQD9X(FV6u|naY+`WH6m{OVKLtp-r?;W$Co+EGpS1HIa zPva@8$bjB=7f}+>pQ3WhX!Ix-ZsF7FzMG*vYjM|99-<=#tq<2Z`IsYxHDx(yFImCr|wjJK04qWGB^+ zHR$^E<~m(}-Gf`v^_%wsN(*sgoHVNGyUo|{AXOh&kI$XWV3PUzqV)f<-1>v>y3fOaZI_3u(9>(&yEjWG^HN7s%#IQhmYg~33irq7gTn1Pl2N#V9J4Fj z^J`tX-@aGM=>{uY6{wdFH{l;gwfXHEP?lXs=wJd*yK|;*N(->cXAl zk{5bKQ?+l$isq8Xt4RNM5-#zL_~VnkB6>Dwji7R`MIecc*9=WG?9sUNn@qIK(EA%p>K6DXF6qMG1c>ZPg+k}P$^_!{$C>?3zOdAR`fS`vXm#Ox`PAw*a` zBmY-;gI?TmOq=qgA%qzj+xAvs)P$uydat!2OS_QbgU1F-Qw#8@Q(;=kE$v5E)GY1w zDjF>fLsVQ@Zu;Rrr1!O{K1F*{!m!x)X?B2C|10@~lFuGIl3b@9p=Zgq`t{W6wsrk4 zu&vAV;(lzaPRJ1wCiamj?y61t<=m(4b64HaV!j11-*uyF@Xs$&pKfQvYE<+8nLf?9 z>P6_&?#~5%dh?IQ*QdjN-Jnkw{`|%2(?5RoBK7H4R`B1{ryIPL7o$(_@^%zOkFQS` zZ`!Ipy^+nJ=+kjZq)$ii;QG|Ar=U+W??#_qt`}R=r=#+9`gHQ|#?_}4)BdOWH210h zEq$6d=SAq#9nS`Rdf^A->(gUv8uV$}T`yLjzCqO&<)1!e1^-QbI^J7(G5YjUZ)eN; zw8wK>)u+F+;S+s&Mv3(4aUNWs*6Ate)3c-K(=YX6Yx?wLu1=q}`^~ue)U(SL^+}^& zVgh{YY{ETag7(mfI-tdj8<|xKA^$+O1=qEXHgnts)vHsaplSW>mTFr zZ{U;J;a{uzh}>lllRMPZs|0wRf=nl&rUzDc*c7F$Q#GA_fLa;l41+lWPwU>7rtKW5 z0)S{v_8h03tCTy`)E5ekZAaMD)*r{g^UPgd8obGVejyqDkY+x8B zi~=7i-y<3Hx*EW&Lh{KSUKBz_LkJ0;)H0r^*P6iM2d-JBjfR{xN>k((gnbzCGmea? zzq+!KX_AgL0FT!hxKz}ofPJF^XIay*?8@GnL_p@R-aukofumyD^1!0jer2bq+T?$D znH6q%B#Wn+(;KIZ&r6>RTZVI~yqDOq@&%@yQ0nJ?CI|sNW_z_BsG+sC|71~2KHh|H zx@0T+NoMk$pna_Jq?C64de_8dVGY4kPGKGfIF#WI?E$vR;LM@Gf+7+3v=g7DU$GAX zKMklA{BMJE`Ua+$UoW;6r95^#*Xw!pI>oZDvvJWalnq@!R&b7b{oB-0_dIEECS0MP4+PC!Av0#Rc$;{{@>Gw!=L_tqz@n1 z5ZM}SKY7#OxNQCZnLhmNFA?!nA3nZtT*Uvs(T5ASAEOU8fA~Xmo%j#mKO5a7{_6=5 zOTRK?W>UmFT5r7tN^A2?;eDyu>zB_owFrv@WSX3axlU9S#2O z7yri#*6vSFHnM%+>^4~Jf>y&O4*7`}`PN`{@2cdZd8pF#YZ{(q;xnT!#J5|a&-?pd zWXaX>vbd$R_l#`7g;?z72mFlT0VF9@jeSHp_iM(4dY9n=UzGf)kzSEnV+@?cuO`n< zuIE8SMj=71_?9?Ry&ulr{8P0QiqMlRghua4QU<vWS_X^e4O?yL=29yA9wmx5%Y9whs2)7VLNnSa#apaWqSS0!KC zmH|^g__R#0e^UJFe%IkQ^~1mOuCHJ1f@Yu4>d~w0fSLyI3(@)jZwMN(3 zw`b|%sF4ZD`IDT6b`jSm^h=Vy#qw&yV)-_Y@w*mBlam4-^nEsZ%SMy6AS^0WmfqCP$2MJ4&|1?goCV&r1+xDY zz7uY2y55>S5Q*E_B$fHA`@wvb4TB--nOj|Rtst7KfFx>eS~&UGWR!Qu?BEQIHGNfc zEVy$wn2z9Wc1>{~(U@;tE~gDyIWa81U?NxT9bA3V%QxuLPUGp5)_0bIqW*$zEsu|8 ztF>)KrfY}}?Z%M?d(r2>txsv_KADdxOfcY|e0!cIQ?&XHS~wRnsfmojP$@GcYF185 z^3j9*GMj>+BLf?_S~9q6e4xsDkmkMi<1#+FWT~!3Xj2 z2GMY;ys-^3`eJ;lNV=06#y{Q~mu-DlJtvKtZS}~Hn>;k{J^da|LY*osc-O5#)y@JZ zC1Qh2UR&u`=ov9r1O13l7Jy~-vb-BLp*!nTfOt;v+#}EF#$Horf^a#vJb&3HX9NJTf0K? z=e(bK%Nr-Id??R#kTuEs4ZC0S+;CZBHdiMTe%N!vwUJlMxj^^z&bEfEcM+m~d(c~I zFHx(^)j@|Ch|JYNR{+Ac89^{k!9i?GV>=tb>%mI^9W{tL$K9 zB80e`?k#pG;u@~l6Wbm(s3!%sU4G$}bD&5!smg)&TN*TeV3V$1`bK!=SrMxuw=ex& zw=Z2wHfZEbf)^cm`K3%wMomINqb5m38o=WMaJgop+Iuf^(dn#*mIf!+O`e+X)s*JO zmpyK)K`l1allIo&4~}x>^G^YE z{ikD{sBU8VK<#B#V<%PL%~_o3O;_h%48QD*f{dvII&v*6n zZaryxQAL+%S8mlmpC%)Cgd6!?8pMC9U&Cy6|FK6%eoB`GiMJwKaZa zC0+B%v9Qc3oA}AnR!-^{x8Z1vmXh7=EBR=yrzU;sPo{ps>f4=UpA7kGI!DuOY8pks zNB&*z8>G6_;Li9Jp|d=gA~2&UBMi#=cS`Y`1om{OlF z_5`N@QyzjT_4zrD_dZv-g~vI}C(%~~5&<^a1tl8Hd6{xprW z8sq2kg4Qlvl80O^xGAP2?W+z#E-gHi2)UGo2wEHRu~~g(foK=lhaYiF*4fM$DK9Il zg1!?!blht>^CjBLyzTk1QDHs#lkJgKmY2xnhVlq zVx|TDVFJ*KHGa_Dgeblg&ZL2Y8i_^K?I`U(Dh9PH$5GDG2)h2E$)fb*p%xlQ!Ng!t zbjmfru~l3qF$+dO_Wt*k2LG${+8gXrCVt&rZRM|Qh=$h;tY zs1(|w$G5g9H)7=$g|8|(&`iHU*g%1U!J)jtiQ^KQT5k2O4__NB2=#4hDrDL@^ESH$ zI4@4Ndy;N3rc3R3`|5_{!jv30-0f14=H#1g?yceCEHT2P0ttQ%+&Eku1DmymP5gd3 zUZ&#bEO0{I;Bg4|tsL~S?%P_*eqWx|Ji7MM;G6QoCuslt)iQ=vrNPl;?aLXmJXSd+ z?Z62iG=lJ>4LT|ZV#vZ+-$L0aw_q{Ye+K6HYb?ZcN}q=CQN%UM%uFRfOw&OwUI!|udhCzw6>cc+RKyOJo&fC@e zl+k%4C#a6st$h?E@DjY#Qw2|0=xr$^R+~1=0B-%LCAKav=CbLod({%uQsX4^Ps`2i zILft3ontGRFh!V#j&?+2i;R}fXk@hS6d3bVXX$Bt;~f!6ZoH#<#CX?`27WHrtH3;A zf*Ln{$2LR7V28{RD-?_wQ&D|0Bl$OoV^$PGhGnh&DiJ=fU?6b9A724V zFgVUq>7jW7z9QLkx%=6G6&w@IddFXQy*54~vY-Wsqvk8zKB5+UD! zS!t_n`TuoFY14k2io8{V?cuef8GKxipdrkL&u}1WR7LsA5-7`EqIcm$I^k%`=4?U% zPO&stJFuGH^fUHRTr}f2jTZvUv~tIo%C7RE9)`0}jpDf7fEth`VidAMrd^as92rqG zBAq<59({O$NM%dlMZu-+!B)Y;n=otJ z9zw9T%3OK9M?>+*L190zx@%SPyH}a}+faoCJ5Vyif;xK$^UojMay%n$C{Wj5;I`(Y zrF0v36}va7gwUq{@CZa18&v@1McpAY`4G05(#IE}BYNG9bNSkDgL8uT?f@k`H7E1F zk#SFLVlMoN{w_>W$37crwF^;+ts_1Z^&qi@0RjjS!RY9N>31;(JH@Dx1Y!XcFrfhazJ?ShxfB~|i?Td?=Zq{vFz`3QKp{|jYfMw@>+0X}U9B_md!fa9h?ag}ZQsw+ zQa$Z|SLV32SKL!7Pu@xNn|<;b@329PeqYmje57j?r{4wo!=i5G!;|?4b~h%3X6!c9 z^!u-vvp!Ltck*sxj4jZFVBDw1+x;~sj@nFlhby6(zJ?+Gwph`1&dE2>9r-(B1AhKfDL8CT!8sha!7*ho*X_h9M^u$e|=bJHTW-_K5t_OfZvfZA!WQ45db35)ZiOFmz^49He^Eb zP#BODRM<=nN1Jv)L;`eA78OeeU`0QbH2o5s&WHXC#^=;~o1g!@VZm&SiLxGAG=psi zTFr7@Ol`p%$ck)4^1L-EoFa+^x6_Bnke$wG=cvLsJ8XoQ{o#=BK|5qyl*-STj#xQL zMv73L+@Ap!l##N!(|PJGJHB*a<(jFt+)1%xgiL$sNGP0uueMcZ9hjuu0FVG9n(@9Z zVHYvoHq4GA=GRirN#b+15hjdZAs!%abV}gq#8K7mc3isaIcw-T^6;Pt zXG?*zJuU}lZBOM8Sev43o}I?lfU>sUfbztFkuS{PgYN1nDZb5P@y!cgs}0he*Ib%@ zKOojXCHU?B)~g`K~9+Jo$Nl5Vjnsf+h5tvs*OP0C=jzI&nlI5rKbsp zO;8(m#fsirDwo!4>UHq0bOLsiauk*=3r7r8gT5$k+Q6nlWNe~9DWo2hYDpGlWn55? zx|qh*<6DS>q*Ep)y)QF8-n6GBPkXY%L&);5blg|dUvLlO`$Gugwlcn7PJ{Xj@$Cv8 ziDDH7*ljg8@u0BQ@d@}5d<^S-xr?Jve*M9t6(QX|d1AZx4E;Lb1oHYskHG816~R@v zIij>-EGvd|apK75f1yzLkkCt~ToS-Sa=zWCV_ma4A`7e3J`C=ven=YCsU<%568eCX zDXC4o2*kK`t$b+GuM;$-u*a_kSG{5lO_Z*=pOvILD9AxD{GJ7X^0a68wm}Y`z}KdI zOe%z0!<18uY1}A(0O}w7;4z}!4uUz6gJ9r6u!g}~y;z7-<4~s4HD&Xt($318)e5L)#a->zGd18`VfO7V!CWx#EV0D!FTUll3FU2 zIK~`bD#^DVK)1eLH-;phfxy|sNA$P0(Ax<|=vXJWddeV34=#nGNGyo+c^@cpldg?5 z%o?@yVgp6)&YisT)LZbB9s1@7e@AaY%@zwFCiC%4rk8Ft&ZiTZY_bW6n6UfCHb;tN%p ziA)$%ETDkE*t>!{d{lN@e*=)bCNH<;RZbo99(b@*l~;0^cz|;co$d^3>cE=q(hQ0) zg*`Argn1tY_E@OFgUi9?LYtLK71%NDSba+n$Z~DrqpOg82AzKh>)(WCy>J0X` z0bW5Y>5&L}36$Z{>@nlciD-z}h9^Q+VYE2?Zr@6Bcxez#0tODxCIQsl^VFQ&{P#-S zN@ANygnF&}W;02pT1l4dW)A(B-(zjhr=EOVek7`2w_m)rucAgA7)BQqL`@hQSfa}j zvWzhHnRlzP&$&|L7mVox0E~HuEo-hS5$mkn$lBvd1_l-rc8N3H#s?nqYQbrZ9h&uc ztV1MIhz=xm$^W%=J8XJTpWao~Cz5NY8AICdhavx{XGnv7*ruU@^>BMO!oj3UC|n-| zhBzD=EdB{$etTepBpfpe(u8gazYFbVeL|r!ofol#DVK)u(?_RXub}gg(jdNonmwtY z&BZk*t2br^ZPQ)CXkc~cs_K)~CzJ2(Y9yU=A0%~PG{HSJ#+ywr2l=9B3i_d^7{&nd z6E2|8IF!kWPG8By_|#BHbq0K(5M75GtkpG@Z=nWWLklFL!@Ne9h(|+4!<^lug#?tx zWlrI-6SS|z`{ zU@aW`ZK?z{`Il$5hVMWB?(=sWMAKmSN~`Q?h-qw=qMV!gNyXimD%{B{R!Bbg&iZ-j z+8X1qpi!=!)ZAWN6EcemGhtCf5Qg0M{ar` z)3)R`su)mqeRn2oow!C2mI?wf%5sC$FoSQqpB7Mg>Mavz90^`5a8xb;3lZZu$iU2* zIs&Ljn4WShKI^pNK5~`G!ot?>Hwt}ik+`kSm+T;f)*3?b{MxWbcKTg3KB+oj@}upI zR>-_NnF46$mUO_TrW?7c*v6f|-$#sfLR#yeo#UjlEkL;%mMU{9_7q9#eHLdID;Nd_D zw+(DO5XWPK_l|U^LioLy%9J-|{!)Ml>Q-19w^hW+xdq{D(_k6l6HCN+R1l*h7{B_& zJP6|P;DLtbq;I&gnO`l!U9St$$*xLgs4h%W%)r8@1jlc+GD0+2ZLhwj(!oR4I*01f zO9rNz`OouYjwdhdWG~<8zc%=Z~H2Tw*%k1jvn1Y`ZtcM5s14|ZfT z3ww`WWHwG;{S&_SwI(OCw0>2$J#aUhkxZCz0PEHVNY5isMBm5gQ7ZQ#y;rcAYW=`E zS2>Fvd`_{dt4cMVZvcT*OsTr1fSt;Z`a%ox$*9!LGAl%6I#lwfpn4M#+Ki}rv(j>| zdY#n?)S5w&j&fBboC3B z%Sn|F`o(vTOd&Z$KiQqo!E-x|Im9|WjxCI|R1T)jz{brWJgNG)YG5e3JTZa>%cwWj zTe(t*)7^4>NN7hJyO;r)7@CvAKbIQNjMRWSE7t+GvQn_?R0WqylrDdJ5SD+e^vwpj zHGPx+;v$yPxX!CilPceqy=_Vk-O&u^Cp%cOpZ{9!zwTUv{fu*---6cK{ZbF)5YCqG zml_dQ_zMQzChaQcZv1MdyKN#n`M`rB)B2s(u>aM9E#eVn)m&t&N~(cvFHI9zoLqZsfj1q!4DO0HrHK$E49xl{^L z;1-24&6=p`5aXb&Xz2n!aGT#|sD9VfWhsx$>C=LVY7ic+y3c`P2et&dAoL51tT&20 zIz(7`UC$7{iHW_&qeH}_%6%A$Q(*|928JMxmFXM1DRtQ zqavXJOD2=5>m;_KI?GWtK{syYY`*>?z-jnC*p17YXj zuS?I}Ut0NhhGc6(2(#9R_-yMsrF42LNcD$dK6jYDmWC@sO|!2*o=5BN!$wMwTBl;X zgio5I?D>bj=(2v_qeJna4QB93eGC^VA19N%Q&pL|FY9xap8*!CaJ40#f=aq}1@Bq% z80u4Mp9UE}ZJfy0E!U*KqtrptDjMhZmV#<=VQ5!5%86K{sjy^Q&OLreBsLC3p*Fd4 zC;zywAiRfxuW4QlsJLs&FjMRBJucLjDksx1R3EMEh(k@by+s^>fmB{B^>a(_sywc8yYjLu8 z=dm7caq`}A-X=fGnd5)WwwCvU33Hg`^TcRElPs!-@ z7u^3ak8q@N&57U-lghbm{~R6cqI;_z_KClUxYntuq$}bUrw$&ZLsuo37L2n^LTlGg zq-E1+%HStPW-aI)Kf9FMt#?Jq%)Asox>UV8s(_r`QsK^2mUrvP&3D3-jj%s5McP}S zOkBxm!zFi^PLF-7?_L}D_YgISM?q&ch%vsmm5^@UDgtR!YD^?Lks1c~Dy+-7o$ae! zxJ1ePODLIq>xlJ=Z<--61m=*_B2u9e^2xI?M9K?Z2X=Wl*Jc5)<}rcU-49IB?hD$g zq`|9sqX+rXcBI|MIjOprP}Q?VV{K{**2a3(YI4;mT$_ZwWa%%@Y#s5B51v=QG=Kew znj2i^qZY>Na!_(q>gDwpv`L+Pcy!^!4gyYKFⅈ4CrTKKmbRQL-yh|NW%>iGZ;(O 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%0DljCOeB;%Gj@{KgQY@~3Q?29Zy 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

    }Cg7a3)GY^*)Q!fCSKFSYk@Q@{<}vqH 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∨2zW=$O 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ྌ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

      a7WlM6Y+0&aC#&V!n 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
  • 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

    9wwn1Z+UT?7^BgRy$uvMlt;07|Zy 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࡞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 fYLje8XUt zu<}d!gKxP>$@=J)o2VoADpfyrkBxEt!jqqS@_tW__GGCiH+u3;PxkR-u_wEDa+xOw z%mezCbd-wAH52Qbax)v(_~6&CrA_l*Sz;``xpBZq4XHYKJnLUz;vhdYThpa?V!VY- zxOZ(<|JT=K+F@8a+Hn8#CK~0imxCQ6&*kTR-o zS4~vM%AfS~M>u+*nH<@febs8Zr06tQMSP|YkwNPTv(=aKeLFr+BdsR~N8JcxoyC#P zo{weZF6Q8n-;n&T!EQBkxqkS=YW{cg7s0y7`z! z5jB1x=m4)5@SgPaKa>BTkeNCC(l>0d%P<9(;$qLH{6A6Y!b^ffbL2Dwas zgu@cs%tI)Pyp5%J8%x7574HYb`yr(j0*-FF+w9~(PxkZV?Vh~NlX_3K_GIsiF@jXQ zjHERFYwL~P0i#)OgnsEvlAQja@j^)dg2oT%=Ux4ci%HMCaY7Y7{$i1cc5dbCAj zW7Iy&3XG_|MYSUw7EHZ)?a@;g!ctv(lstbaH?wiI`;%9&I{bzJt+HGPO~+LGeCeWdSdeGHm%*&8!$ z!U%gC)+F6A>Ka2PpDHq@SbVilKXgYQXFkmDS(nD4cgZj$<mB!bY*xacTIsNLAQv?chjaT;= z)|msZ%v^Y7b;(;0`vjy0EcK{D1MtJ)eWVnxu|#P=R*H>zA9V3)TS3@?i6}-$*L(AQ z_#x%Zw@$NC^PO2OSJ;*Rh$4i0?lAZBBTsJiWYy=ehu3UvV}*a&O2PlUS9%S%Id}|Q zOpjcQu+zU_1Y#)y86fFfcQ|VEOS}XxzQc<{kIYY~LfQNIEfy}awB&i5A)(C`rSd!j zWD1@~F!(twYPSKUVEfG?ihxZrGw$F3aD$Y7GO)08)VwFvbL0Yrd*L)Ww0~THi3eWBNi)p001Uj0Y#1kbAmIU$!}-6+F2~Ccf8R7DsJVV7 z!UyA`5VI@=7{RMCkx((Ik0Bw9karso{6$duYEH@qHa3kflr+8abXxS!uvV)~cBA8? zS~GM))_q}(j!dWlPOIV4ir6{LmUi``O=AqDTLTtKr$uweg+;5dIIj$g{9JQp02X;O zHw^N(E&sT>0%P(ewv~;jWPUyn{NB%1SYPz@xp;~-WA8U;nSg?poo_xyJfcRj4e=#S z50tHOZ1Vv34!%lL+D3#a7Q9}~XAfRmMPjezj=hRj3gu3npzv^Ffio}`6@%ceM9>Nw zWui6ibb?Hxybarou;wmh#lsNo%3TOA5KhMdWLy3~N#I?Dcjz0f*epCYo}foQsNCn5 zq9I}fj(Csuyv^4KoDXwvvaqDs;i>S)|9{}`wWH~}x?lfm{9Sd6@pt&VH|6gnIoJ{L z^eBxT>f3_GSuZWEAKrwxpw%WR#&JEKAe%rZ(us~*Xj}+!%xKu+8}^fJbK>`(PGBRbYETt%|(aqKkL;RW+ zz53TtoU`>kLkvpuAVBVc&B?U5G0@f}dTi`TXp5vPA(D>2#IsFW2ALgN1t+ z;pf$`nDsUiZH56ErF0Q2rR`MDTmM3IWLAqrn|N*G2z87j)P(JS5&6_ZT5D-o)*RYj z!H^{VTj*8s>}5OvcEua8oWavrkbakNBJU7iH1=IndsjP0=(Sa!i9@=SmuFI`ROL*9 zCIvyYclrC;yW;n=8ZSH(e|NER^jeNE52hPCE=J&U)UDJPes{rhjh2h|b4X{Ac9FLF z7_)10e{nsRH`$BBY~XgWBc5p|9ZQ*{m+GZVi#lvLGK^m|gz$XF@YrU@|epGCd$te+kwhN`C-r=`K=K(z#dkL zvWUC-r;`3H4ie)s-a&Q#xGX|jY047c6+Z}!{;F(Ew!NAIT&YNnF!d}`(%*Ow2|Uru z&`TrB63-%2C(BZOb3=oukMYw!;1c<%kGwq{;y*^Jj%X)oJL&19ZRM(Bj7x~XM3Sj+ z5psZ1m3Go;(SB=3abV?B&SG0hRR+NbRhca2+HbHl_PDC(XZ`_v88xV;4pWs5gw|eC zl}*C4BjBlYS~Oq7vcN>Rr5?jrc#==0G%eU>s?t%eDx<5a@2FPvVeSX|+DxT`mty#s z#}&~-pT^T|UySI+@OMw7VAHt#T^!$)>GJ;*ey=L@k^Vp8_jLFw0@Qgs%$r#I{0-?G zdN#V;DqLY(&>N=UOmmJ4>xSrNhFObd$#`^UNX4_fE3oN~@w;ld@2BKQ*O>(a;6#4wUBGo}Vua=J1O2zzmiv(Z_Z(=8JJ5vA&8*NlZ_XA5-HRJ1 z>6|9jDx@?sNa?9Rj897Kv6Q6cgW~X;c-SSe&W-f3Wjfa}hR(%}wCP@^qJ@Zct|L&h zMWAMreQ!(+Iv4xlmf(jIIw$RpBU}wki1yef-W+l$~lX-`2U%Wkq5ii%A?ME_ z&Bny_!~Kv#25FpilNk%weAae`pE?m?(0hS05oTCsdP)O&wl2_1{7MdbdyX*KfDZxU zeGC>0v268~)KePqc268z#bSX(P6D9TRSu|K6UPJkU_ibETA9gLtFh+9F3q%+hU1f% zG08M@!>=5_lT;>5Gco?BzHOLhVlNqhh(meVCSHhMes{(hI`YqY&uJH6J3xRh zH$yb5Dd$|H#;oP_;Y72VG#|6(sV9Ge;$e+zMHhU-dSx5FZpk`N{_M$?A4P%R8_$o? zd8a*`13*Tqb$?a6G1;$%sw;N842#*q!WvP8A#`ifj|?kq6E^f{aU}jCtrxr%-e6mY z5YVqxkjV&C;x$u}bowNMBC;%rG<_2isIU7JW zNorRYoSL0{rQMdretz3;3>q}3$`;1CRxr-hoSn&3L;Qg(!p82kdXleoOvqLP`PV(<^Pbyf6ujn^U%*254v0YJ3`PIv1~kKQzgH$9%mk90IW=?S}*s9t&f3*-uv zKfoD!1!6^;vvRtoq5f#{ng{I3o|*4(Sv)j(K4jlD9bTjFd07V0Dn~5o z5Qd%U42FU9xc`}Jd3jw2%dFpzJs~*WG?Id>q{y!(el#5VuMJh&_fiPzgdN!8vv2A- zm-==ltn4~?VsT~Hg{Z}*uZ^-gEQ;q=B%tn9~fzJ&!t}b zVh~uSYIK2}yQ8neQ)^&CTmSA#p@p?G$PG*-w?iotR^Xj6s@zVW>2gEPw3?$cLwbNR z*m8t;1wt75L(W~und@`@av75S4s?7JtfJrXl>fM#BK!*@P1tw9&!jzb3~A%YPREha z7+dQ{J1T<91QJ(T_;z&jS55LKpH6+cj*J$nP9Z@}-{9)Lbz9VaWe~;UE?YaHo1-$+W8%xb zWnUh!FMrY0lKwxh}9C~g$t81)?xOnu+l z2_!p&H}-iCecYb6yY#JXCfVLU>P?F%X+Zm$Rul@Vfcqb5&voTuDD$?yp@~-JHhs1O zc@tmX+BdYNeZ8`91>d=p%q{xC$P90nngVW+;Klx5h34EcKgM87x% zMZBxzf)e_OB1qrRl6MAuGLY{Kp6`&yw?j8}-so{b&=EnrNc!5e)C6#vuZ22&)MAX{>FL#EkMQZIn)r7q$o@x@pq|Ju75M#VR${wZ!tcRm< z`E+h_CY`Gu65b-An$ddg+|UJ~2gWb5ZPkV=5bD(o>PodOXr2f;S}EMi|7;5ofWl8p zASME0qQ4MVL+MKYptFJOgwa}6hLFM+3wlp|%4K;LYGydPaZ*X1fMD%8w+0$mY zF=@CyL1obu6a=+GA3p0{&0dj@Abq`wsf4>%uId`#oAoEt_Jh_=?V-h{_0RzQp*@4@ z=pr;*GB=4LM~mW31^C#EsDzmAx7)9EbEfaPsb0C;oYB?k95-LrE{>hKHMHbEU_qEp zfR^H_l2DEa8ATH-X)J*_v2ZIebE)qP1zkREeL|Nzvr~@SM!H-(|8yJ@IX9-yCtMoq zb3ijK5*0thRP5WjIT4l?a#f(y658(9#5<>uP+p4x(S*5r(%;fc)XChs zgid!rM_O;f*dJl&U6=B8m)cyP_YxQOA5AueFBh)HXd6}~jrR7<9^R1uAok1U|2L1mCl3n{t21EgaxMZ))_AvA&RCBxYJz| z8_dMkNm$C~TV;~Wr53+BGh@K%EL*<0$d7)C&fIgD_lZY>d9&Tcyo;Nent(~h$NmWv z*}rVH-ZtY@v!smNT7+;U4=5>`PSm5B9F~Ftg=>(#g^b>H67ku$D*eNeEGrvz zJ(^-J{fn(%qLB`_H<%t%FPdg*Wvj6j8?vDRV|l^~1(i~Fht2Cx;)U#%)_TT1WcAaR z!;Br1OIgIIgzfuWnlb#$*O%K8+lwGM`sD|UOND63p?NzwYFjFF1b#}ed9j^cMm#or zFDZBzCE+baS%`o|I#M#(6;UeuP9H-n<4R>Fg@w<;IoXJt-E;v?@>Mm=%l}B&gfNy| zo$Bf|t0&r}3lteo!>`yt1OpmHWJlDTfPk4=x9oJl*f@l4l>D@y%;Jh|O||YLJwQ8_ zrkQI>aBTE=j`6PR5jg>UUXvnP4aD)vLd|Pa)ej3=*V)YOyA4(8ztfQn>s6X;z zX$_NH})z;r~{V9J1fI@ zbg7Bbf-qTH3)zf-ZmAu1BcCEgbOj{(H^Upkc+S*Ef{b*w2JciO$7D^Txu~=XVWx3^ z(wUT2@pgT(>~+x(|NLBNLfbHgI;%-wxuA1U4=sgEIva@KY9(-65&h`mEy3zJm;w*m{>ztKV8v&t@gcyb%JT6_sD2^#cOKB5!gj=^R1fFdw8;L659wbHOT3I zrCg=r0# zTLUh2f&~V;mv5kxyC*CSx{%XbuM*J}ERk?t#Ajc1V<2AyhxLNrS%I35_eal=omt&uei;Z z*?TiIxxMdI2gUPVX_pVq+}xN}ioIJ3vpRW>1J?JnR%2L$Y$jV46#cp~@KPuh zgW}u@U@>6zhowPyx><_&`irM>_=IFBdyTTc0uPlvw)cg>7~R!K!H24a<2|NLrsJ8j z%5}WQTNz<8j3DKn7KYi+_(+g6jn<>p8fxs}I^f#*cau+Q)6P7Na$C94F7;uz>UCD` zbIn{Qda=qJ-t1I+U3$~s*bY;qaB`!dYri|=-{93@e0B$;_o~y%pnT?fkswy0nI;5U zA05T?o@xmanYU7cS`i(h4x3XZiXA>%5{2b4LcOxZZXp?o;^;{wQE0W8m>7$~%9$vv zR+#5loPa25t(=MCT$PDM;dQwvY|kvB(9Y{v6zTYPg(xg9qR@Bw0hI}Uz(hgl9{og{ z>d!+V| zWfoDRMom&viWq8w802qF46lExObm-yw6Ae6S%l>=F|1Xk5b2dm41*KK7K4>T4E^C` zDOQdc781h(D>qUMUYCoZL99d!+SMG3K|7o6cZC>~M;4*)!qCc=&mKny{v9zC;AFJ- zIk6ZT_+?_CJ3J=$CTlW&Bdi{kuO|#{F$* zA7buX9;3}G98_9jI%eh}8PQv}VnB)AekAGKi z-}1tJeHZstrqT%RWF>a~EEF@k`K*}xH}K23Uk&%a1~;fXN2Cz=H7Nc7G4;YU_=Epd z0^5h}J5hpCaPfSO_gaYrT-TBE*?w1nkNvK|TkoYc$}7CBtZR)mJo2Oe<`BjFj}U2o zHmcLQIqlcS5g$V!NsNaKBVX8J7|(Ewn*+wH?Rz)@2rQNvWsdQhfbnnw<0$@JfwA%k zV=E&|)U$hjIcbZJW(ng-V9c;D*K$%b^#G^LMcfs3tdx{=Ss-ChDM}id5bv=C9Ofcs zA5^BKnR81@x-USI56A zSYUZ!f%2**@TGKh}n-F>2V5c7_kRnhakfL>#ETT{SwLH{fWWt!s%wk~fP+;zW7^kRvhXc!) zyD!Z{>;Wtfq|%)X%rz*P_WJD9wl@NEAFZ9gtCNsPTSVfW(3ruC#3UGe4JrTG?}7Mt z1%oZGYEu~)tbCOWj%?9%NvCXF7&aP)SnvX)*GFW`9$v3E3tp#$7<^IqZuzMH8u38_ zz`A=>AGr3ClFfcEh<{h$YI(s`d4;R;RpQzTu1V2`M)F5tYe=b0?J=YPrW6ZU5`?r! z$Vo_7y|YY6Up%`cB+Fw$GAN*8P)tZ)`$sG!w}4ncUdD;;6ygxwMaqBnyF30}LA2$C zXyp~r%2!GB(X1BF|C`ff(;Vw@aF;9~zg~edkNfbLe_Ej$l3EfZvBV^RuRU}Jlhk2K z)LV+bD+LkH=SVM6#UQKY0C@J$}6OmuM+92I29z{gPUalE26b-t-*oa z1mvXn!XPbO31MzWX;i4ytXFt0x_L8;pE8|%!XHB`)D#jWX zYRYF=xsgq|*X3eLi`9s!oiq-lI^y3IVzRtosJs%B@>PndzzXdA4YV@R3#!X{T zmvOcRqovi$logQj9BTYZmqC7z@?uui7M0?d058mF2L~jB~a(1Ar*P2c1UjJYXQF3pNzOFfLhgM@o8*O@KTJPTF(*4S^}uY$W6ZZ) zMSz=~e67tnjmfjPY9Bl9%74Z>vw_2St8xyvYT?PTevqI(CFiVvul>A?0H_;0Z$5iA4oPEh@(=)+$La4IkS&B>;uzvdF=}Z{t*1 zjwK<-(vZV)T4fWNI7S2x!pCbovkhp4%?*g4E?RN&V>S(6Z!2VM3t_BV3O*U-=lIQu zg)_pgPr3A@vL*8z7*3d~Q3lJXR`4n;Pt&(`sB~kz3@3jIVL)DkX8AASVDcILd5%X- zvXkV}ul25Qe;9Q_NC%3_gJIF(fS#;YD8`a2*kwoo4AE$0%8b>eZsxjK)fcjc3qpjM=!Sv5^IN?(9m#_@}_ov0O@i zokk0mS{NHkId->*Kb><|Wb0DOol#+Rbo^O1?4S1Ja8C~QYQh&mE{xqqp5we=pA*D2_mf|Fad5*{Dk4xufHBN4=!RXJUA-2)_FKM)1ZeUL` zGDI9!I>m!CIJR8s^xd^OR}4gwb=(6{6&?SCPjZEd=B-ryD{QIC-mYtFgb0kL{9eEJ z$to|e&@`%5`9U$k{4uv zRwOil&R1Xb>`fx488B7R(*3+2(IWkCb6V-*qfI47M5jIe+=l!XihVVR*hWF8G_V*S zV@If^@(n^QQIb0Me>sVwv0yUbk^pF!sJ;{(EHwh-A(k-YLfobnNB>mAGRxzGEDlRw zrG?gDS)|Zz8ROR!$X08kgKfl5Vwv?#^))PFnp_oq=q)jM22riQS6#SPg(_&CSlBNK z3WE3eZIWPWt%`PjOa$jw;l2y&^OM9#jR)#3>vBFQyz;^P+8+;Bv8;);ASF2f{FD17 z6>>WP|JkDmM@zH-MT_1d#v}?M>6+7&@8xH-dLSl%*4OGKsW}R@LveOIB4U z5GPTUBfQ4gU)?C^XXw)cpyyx4B_yjzH&YE)PwGCpskFjbHY-4Pil51Bj*0n4`9DD0 zs!a+LwBuCr@U3z&S&!{XO=Dn1qS1EV9 z*xDa$FH7PT(5EM0+03o}l>*u7MYdUuXsX1{ip=4l9getD0nXa7jg}un)w)o@*`yyM z#o?ED&O2@2tx?*y&eTf6#EnJ|V%mC*jdoZgY=<=`g|HvhM3Y2$IYe#F6vU1Sh&@1z z9gtCn-mL+KFCud0(vhx2pvvw5IG~oMK#6qZ@V# zddtMrHy^mGCCgnc*%O=mEIV6P$u>N&?i`J~T32FnxP?lP1Nqvau9Nii3d(i(fhcdU zp!{M8(Q7a~-FW%YWI-vk@$#-UBY3If7zFY33W)m}Yh)Or5=IV*17S5*PyT6f@rC^B zHE{7Y{n66${NMFUSEJ@%(XT(!D7S9Ls>icz?V&d4Bm{}&-xDR>3XND*wDMQj+<8`z z)@x*u^M98tLUUIYU8y27D1s<2RLRXpEqUO`k{?vbl#0}hTI8QEji{_qMINOcFI?R^ znTECjfwykSkJ~_nVU*EuUin-S3?^R{J@-q%WC3Gcth1amrabhg)bvzoQE{ako?q7V z8ow3;2)f$Rn%G%n>VD|J3n`7>e^d=N@V z*YvKR0vTC!tsDo8E_x=(QXmumJyh-&gq1=m3!S19G$37WxKp1_!XRf=v=uOtIQp2( zv8}b>e<>MS--70xT#k(>-dly=S`j_D4K(Nk+lFM-DlkI@{^-%iF`!mh-&zZ3Rz+9l z+($WADChq{=fBljN4AEM*$m+IWXpd+QH(mD?A% z))2~+p{5&SFS0{`6Zp0pzBeza49VLKm;T}nPch|!*kLpepQ*C!HK<_5rx)m zkk@;`E2(^8y1^})4(v67wgF2y%19~U)BuR;pJ?=NKC9)h2JA~%5NfL&Et(*&!6Vf2 z9NN0mA1nj$em$Q zX?bzw{*ArW9qN0fOKVa)(>eZ7XAg))pV?uJjnrr}*1K$^=5y%tQ~#1agSW&-XI0T` z4=Azz`A^SV{(ADi)AEPSTiwd9?59iG&srQL%Itk8UK6e4y_QIJvInMXg@%YOG$0cT zKPfz7`z=(BwrH|3;#u^nZ=J%&cQ`K%7U*sFc+%V~g4=net5*z~O}&)cv%K6N9ve~a z#TAqr@;#jux$hjA`$x)soy=Mk9a;r~bU&__HpQfZUUp=`3n`fXsKxGqt94@2d%xvw zzdndRjE^9BO~T@ZpViyxeB`KrsHbJm*H5PV7TT-KqP#2ym0syxo%2;RK zZuq`Yal3J#5;vME>rV!u3M{=#=_raywbGBP1uVgf?{Y<|zWDGI{Hlt&$&x>jmZ)!? zB3>KPib3X5$3B`YV6vT|0=rrP#k&;+ri?7`78O{FtLR%dWn_WjGL)=_=ay68UJB%Q zqnc>{w_;IuGtyABs0#n_x+Gq4-Yz8YmUaxAw;ynUwbKM%7H8k9Z~lsKwL?6qcNzLg z9jHJ&(rdn=cvJ`Q6oy)16L5nUYZB`lLa~}uhnkVM|7MP={k0NvUQNbVY=D*S@f72m< z(;>DPf5JxN9^-|fHvlX>8G7+P3U)4~Hm}*ry$~OvL^Hf04irKFszIgTi{6vXw3xaqF4RJ&w!qwqEZxe|qw)4$%Mf!Rs+$G_w%Vw_wFs$P zKd8P-6RBI!7obs}Xl&y zYO+(m^pvKgTi-ID6-(;qBEL-aTRhq@r3(R92oc7wPc-3U>yy5r6=F_2Ze_A5ar9Lr zTB%b^))YDT>P$GOg%0^y{E5DKvbE>ScH*sehL-75uD`KM3S#?X-sATz+bnwK=CBes zq(nTLP1ip~7B<7~)7*CXu)i^Tr0F`kwT_NZL|4s>Q;SK3a41Gh6Ni=pWAmEmUOT#` zshowyt2(RrDh;Vo8pZ=-1pFH=-vRd;UN!+VM4NE|ooChOuLHy|B~xd*5x&7%)VALz z=|OCn;AF7sUzf}#3`FwWMWCM*&CxtQ*ioy$Z@TSVPUu% zlI4tIpoFLt-U*CiU4fR)4%_#5S3=mOK>l>dZ{@W|$rOE|zn?xt7k-{<%BA+Z#}8o< zP%p%C7At&x*k^IN*cq>0m$8^TX^6J{wY#lmy=xK`EyW>qFfbq}lz@s=2?Ru}u4r3t z$cL=d-(vMLD;VlGe2gs*I*`2{OJ|->zy3^m`9Ei*Gf#2e$E5VGPuqRjYPR=UCpuB< z^KtmO)QLYSk!E~=U(Uzt1An!<5?gN)ea+Dg_e*IUs=SvCHyrB*)%tSze zE)97vezB0#0-*b5;1yrT*7NV0qOPOy@^ZCSM zFE0PphWx2~rhhKqT39b(89PxoTYkhUlRByOyp{5+D>TZbIm_=sp7;|xPTCZ2Pi(H` zo0DZqVq#--Jae@o0up_;tW?N{osLSp&~PgHHc_$vQ47>KhcdiGbg>6kEcrpJ!{U&5 z0Bm%WV?mqO8-pwxNcy2oNyN3-phuccD{gWzU&`KVu!i>;saY=dYd zHdVD+E^_X1oCEN|LC!*1oA8obqYrUku-}$m^;g|rMO*I=V%TUhpvF&y8cmkbg>*#= z_lzx$Eew4Z$Dj>92XQPB{uq#0qbV;|PxP(d0AYVqE07Q_17|iz$F1M7#BJD5vbw*z z@hy67z)Vg=bLzlUML%R>Lb4}TgcRBKSR@s}(uivRsQNZzR8~7iWk)3|YuH$2xzygr z2Z??7M+u2lnZ(}zD{s`Ef+?d(?X<&6Qd?+~;r$ctpRkSiC;)QU!w?TYbB8Bduxs>< zR%?J%|MYtazxAlH!=#j1b-1yPv|eAh|MHjCTGl9>JJ?WSPZd5#F>?nw%nVB+)IpnC zD#P`^(;p<1h&|yjIc-*RbWe!)`+zEn<%mNZ;Ry`{R~MZcJmDUOS*0hGuj&vJuA#>C z2D%$O=TE_9$rEmUh_MmtFqPc1onXOQ+b!h(I=YFtIH7ip+B+DxbFhg6DIfbR6 zn~|R|2f@v4B8LktR5q3!M1N)#XMt_e%V%WS9@1nS^w^d;#HFho0! zW0B3UlyuD8ge=tU8l}`?#AGue_4LtV*k>#@7sD^}B$uS}?-9&g>RZPJLtOKNgdwh@ zP&W1R2i*`~v-o?Y`+W4^q#>$I(Gc|@9UQcm<%ZZRp@ZE5*%$xxdlA3&DDnqMM>E8C zgO1CycK*qRQppfIDKo+lJIxTwtZ(a-cszm?u704*3Lhz1AtPXlM+`); z!t?60yL?jxa#-Or9*-Pr@rZPwQyf@Cjll{#^QW5?4n^7bm=*RbDO%wLKZvc+#%nA* zRn%wk$mf0~<+7mE;*s-5#3LXVHw{T8Do%zV^PNJs#&sdtfDk*3+JKyAC4#jMh?GPn zsFIIK*bxUM^|ao-76Quuy)0?xQqzwKde(hgLeJI$F`GJL$o1@7WF5`nf2yUVXMXL6 znrR$<=?;+90IKY=bg5=^t6Pf2KmG3Ew;mB?Zc1vY7(O{zbKGd!5Rvlehd5Ogz4423 z%T~9bZ#n0~W_S74DyhpI*7(Xf4Um6UE{!(S&cB7Ps(g|4BP6HdJ_Hj}5iJArqMsF30$`(oVOGIg zhW7js#GTPU4nz~bkW7g)z!`q+X^z(V_4oEDrA;d zJO4hXFcVu}m?|Uk3$vnwf;?9AlS^HDRM5}WHz)KnqEI&V)1QwWLjLNYq;4v|bdx5G zuJXof+%weZA>{O*D1=m(;+%KUNK99A@p1jqVzIc#GW(W|c!&=^xDgL=t;xsLb1W|8 z@0TX5)!NG&)n~}1`rn%r^jCh2ptsS=&#Rb9%zurgAo(qsQ})HSIv48{?QW{ot}{%n zG~83(G)3<}(gu`{_GGCir_@mGcfzg472}nsNR`XZ<1LO?O2a#S7*}V7asMsPVPs$q zLo|L`OPwjhwwcfT;`b<04YE(e7APrjDxYZ8>1Rq4! z0iPW$LqPsY;=Mzx4HdA8obTtBzIz)H4=m4rlo5E_X&j!?Dtrw-%Qgy@mUYc@oaKmGiM=&q*U zY=~Za!0}n)GQ{1xOp`BRfdLlQ$!km_K8aE7osIE%GbbC= zEB=Gysit@APcmgkOQvqAgpsUnzN$S^yC~4TN^_}w&YjGocmJ(&>sI2^RHeMSw_m0s zh&VdrXsID`7K|lSsLuPsuyP~RLMvyr&{$e683rUe(6MfsyVC|G_#T?O+WBYiYHd}f zT}@stwd}6{glJ?ALaBE(8_|uHOr5G^Y@*-YJwBq3I;u!Cs|m+R@h9&sQG8BA8O6hQ z{wEY87>W7APVtFO@sS&+c;-3dqj>gv6BMV%N%3dV_gKc=Z!4pC&5!;Qii3>LIlyGx zY01yU0 zn)j@Q!+NiXU`cQ#TOruptyOQ zGXB<2N)&%)T7qJnr95YL$|dBGUz-`erVbn0pC%L6_VZ5%L}?gn_-ZX=9cfjx(;wvh zt=~nXN#67CclM=$DbL|3Oa_M*end6{%L2H8Iy75!IMK7s4vN2XaDrkrhU4_rD}Pv` zco+8CsZScZB{lc{7c#zZ52N@jOQwEE$=DQs^P}US`1a`uifu&RTJ244j~~6gMDbg< zEu(nhD4uJRWqf&~QTzoO^wj?NCOMEa+84v%UMDg2Lz?6{jen0&$ zWV~#5qxeQkre3FHY>I#K;c-y>tM?=*_7O)#W}7VISC^J3ZeaCQg5ujp@m!lM<2!dV zitn;y>M|unl@u)W|cz55y9sBCf-aV4yO^&%5oZ?-b z;@vh*@n6mu2gREuDIOX>#c#i*M6s3|CA9kA_l%@?lV!aBE+*pxEScJ@WNaBv7!SqU zy(=N(!SPdk;LRn9_h9)^g5vALFrj&n@%E2TpJo)FVae1FDH)sM+SA7&+Sw@nv?WvLC>fjLT}~SZ#m(xPp&LsSH{q8O6dyZ^=h|c$ ze|JZt_2lA-Y9;;lBrKB z8JpsxJH|orsrx4=UNnA+KmWZF#e1_CJt5=nQ9Rcs%lNlD7{xDIGW8`TV^e%GOE!I0 zCppeFM$FZ^+MT*%8G0uSN zd*3OM+srbdgn*B~d8B|b^EVl~CFUpiPaQwi$ZfY|>Iq85Cil|W;~@9Tdnd@{@{V!! znwEXLMDBsC&P|Z}@U0`seRF*dBh{VT8Mz;}Wa>whj7{#&S5t!A&T&fj>2Hi*PKUvJj3`0`~9>D-}T;CuA5x3C!F8J$CZhko6qU*G3f{$8z| z;Nk0fSfRzOJS@_~D%+Q_I_lHIL#!s!mkadpuvQ-N@JT(aW{Hs=PS?XDS~$?W5d>_3Y^D zVc4I4!3E`e^V8W=8qzF&{iMx5&eVRmnQZ8^m3K4kx0Ex@EFv1E^(?GzjsB4Px6N;| zR;GA79UpAIF|91^TJ6IfeB3M>z3-26-yWwXi%FSzCl&J?J&8 zh`#Xxczq7MiVKKJ>xb+-gOoc!k=-0hQ^HXtlTFoX*EhfFqNA(A*{k7xVoqPRMO3y=h*iZ}qwbV=ZHPj*w9e8Z z9-vfi9&kVz= z=Wz=~R@sj-eqAsJUQyK?a6o<_;`;SJLBHC(Uem9G?YD0mWvkQq{U`@mnO3p9D5+Y; zADAeJeJh(+M6dtQv}*V_p!9{HRSN_p{-;9!1OJYfAvDKY z*W@_bxyem3(5f`TjkdYSISBJ?^wo@_sOc+jH^6wjDC}dqU@i1UlvW z%`Z4@bbO8zdjcBou-`>A^kmAJ)Umr@Rl@389G6{%%N0djSWLfr;k#x0sJ-k;*-F`Y zB4S0mv4S5>@s9>I>$H1@7wX^O+xHLm7citgy?nSj%}tod(JjHmSQCBv0|_^hjzPp5 z_HPvc%W2{bUhNalA=eYlZB*d8lk=r}K$^T$DO;a1VZ8tE8fblS7<;_pSjP{EI!^P@@pXpm26DD&y&mZAkXS?yZX zQ7JoE-7{1-UQYWx*yCZ|fXHTIVLAhG)o27e?KV$en|^(LA(ei8%{v|y0p{2n@DNQa z5|yY*y^7A;!Pbo4^bGiZz+@-AufVskDfntoKZ$QD{|(-NaxQgCe8v0Bi#^5zd6X|Z z<-o6MDbd^ylWP^35q0s3_tj#~S}|vBbj0SRMZOnu1N!FKDgXG2hjz^r=fe8p6^1zc zGMb}5SKG?k+>|CmVzO_Jh^|}6^7J3jJ3IH=3SrC3eEn&-v92h+%KP0Bc7tg_y$oD8 zd!jmr{#A`)j!(7U;O!h%8TGBKTj5@$#7{CT@x{0QpwGqPTd_@xZ&w@jA!V)AFwX+d zHge0MCbjgo&D695pGVVqjv(byN8kMxAb|?jq|T|?SDj{wqiNSA_IosF&o6x92q%La zw)7CjYve1<>ZW1Rer?`B6OU}krgC3abp3@U?P2&^=sTU%6mNsI+>|qP#SQcN0dF>C z)ZVr{olC#X?&MsaKLj4t@USkWjF@_YD6_b<>9||}E5_5*AAi23Qx-b{Ki;LP0n!e? zc2v@^2#SRL8;~}n=Ok%qNNdlgZeMJqwTU#XWS1(P)K*EFt}Tg!fN&7Dd8aKMzxUl8 z;}>t>vB;(LP#0Zy&8TP&1T>de8gFM#NB}t<*^o_bicj8;Z%*Tuq&#our!?w z8ai*K6nBMs0#{5R($-Z1Wf(LF{#x>Y#PsEC@ctXW6FIm-CEun(KzN@ZT#mgZzGt=1 z3uhM>Us+i^Ey{a%n}n*}fDqU1loNC6Bm|@U5K-O}EImOv>UIpV_iBzNK4Vq&Ji&_# zyNmBB++m0N2+{8lg621~U5zobD^z7wo3&{97wHg22W@T6^&6h->B%Bbray^~d5NB) zJVbe8j(_QZC}h-MrE@3D$AC=jZL8Ch>_iz|q2u4#TB`4D>CBVq<$p-|72Y>M1V_o% zetRuc)dp~J@1t0-9R|mRZDFRJw4j4+0A0g1-DaV6?k(5}LG-W&cr&uqm%`%e@Se`k zPtcgE$6nlGjrL2B|9oZr3t6|xR9~mst!4Bmfy4HzqFw5YFWXxp`b+-N`WM$q1|qr}0o1 z^`O>jzZJP3ZSh7b|1dVmNe*3d1?!_T-(q6B1g6Q zBp;eMTLh8wG_37yl90CUx0SX^+jyogsWld6)}8#YC|X^jwjNO1LsdbYW_MY3)QeNZ(HWHdKHTyhAv+@4x*9&b zJ(-(uKpG5f=4$7aQ;|u_izaY^rDO-ac65L;kI3z-Ol~sQiEjs?i~Vqg-1$Q_x-zTT z_*jg`4#!_>(^c)ANSjZf(_}Xgd^N=hN4k3Fi@de_f)~R&_HCh8e(A@FNaF2P;3AOX zQ3J7aM}20yU+2FJJo4+y{K3zp^0z0f&a8-V!?$AMGL>uka*8WX zDXXTQYU<#t*PtssK4<3u_>~^zBnCOU^q$kOX%bfx1~J=VBgj*i`qNQqb&%F%!swxh0?s0@}Mh9dRF53BJr5R zO>kXXQ*{}WN>Wu0_G11^d*3rBXd7B(l~Bfg1k@s;brVf0|6^5cW@w)AMth7g4Ln=4 z#AMvNG@wBxSE`ci5gb9V9Hiz@Dp_4RyI`3WDJzM)sS|h@rKQ@6+Z#f4GHj8XZYUjy z7GDm%xOhBDO~~z~{oGkK-&J})eF#MS)ROqBk>ts=rl!=~Yk2hsOf(n}*OP22mk-k~ zl3QA@mKnrij(B6l_EYEI#KO@@VJHl>13*VOM2Vtqrk^q7qDH zGNyu>sKJ{heKCC>rZB%bK(LV!Iggdax6X9Vn+)?~ez93i^!3k{?(f;#jBH=kY)wFX zHlDgL6KI)u3B1^m=kL{~?Z5E{Z#P9`>i)^^jX>QSNMta=%Be-Dr;DhscGOi9S9JMZ z+IrBf47>=(w*ja{%4Mfh4e~3yrCq&{%6FNw3b+peOt#WK8t#+GX?HI!96!EoMSNv@ zpwDPnpMqu!wENPH8&Y)B zBnw@?FbQ**Msb9 zbeKc>o+r(o?B&UBo*Xhn41GV7dFuU?#m_Sv*Ld*!yd3GgSIom^Zf+caqiKR?r9{ZX zB<6j@sL&pun}d35CMidxIAw-8^UnaxjallU{QM!Jo=uL{Rxw|f1`hL$Poc7TD^>T3 zCDk+r+n84m!zeaWF=qbqYJBA68o?DWk(cbtn5l;~;h`@2wPqZ76XVzG8sI1H0n-B8 z|AW&?WXdcsWv5Hm37q7YtT##0IQJx-vce7@3V5%ytW!8(^?tpQdX-liux!RS&VWEF ze}Jl6RlOXKYQA2jd{CgX@O?43)tKW(?u~p!(`-%WcLQ$Xg0*F#WnS!~Qg-LWPt|&7 z7@JOzM}y(uz_cNLAG6U}8k(k-HhqXwvNy9ZgG`!lN#&oD6HJKBb+JiqW`Qa&2Kdnuewe5zD)C%h z96y1G9=*q2e08L4Grj^biHlZ6!;13j8zv7o&tT;?HBbDXl{5Bfp zI{x1eYc@OW$>E-S-x3_<4{j~G(YIe8yV1!$l5o%pykHfrcE$KlMz!_50*5q=p5srL zDup_xKxM39n5scTPR;4el}^sJaxU4a&t0sMmAeOd;Pj67KyYTB9z;1jhhZr_nknU` z-1d^t(&VtXQyRLD?tFz1@0ZaP_krc9@WXv|xxd!>fs01P70s^1HFM=K)n=z2>iDhU zp@^Rz68Pyc;CDs94>H3vg-GiHl8sJV%e!5^o(^nXK_-T(Y%K| z8M3qkCxVYBkd|@dwmuGx1kwQ7g&4<(qcQPM4cyV$a1MW ze?P_fk58|OB@-ZRnS_KD$(~}L4TMD|I<8J34MTMjZ}?eP`q>~Ez?%UTz;!RNba9A6 z7N_Q-el>J5xge#z1u0f$KInVcQU*(rf_DVy6^n3Do!*`%@=zn=J< z@vB4pdKZFnemUeKzs~$)kzYZ_E$C>F?lES+ZX&brI({gP_u=HYctAC%?i{@N33RmO9$m1wC zv~x57X-!sUmkNQ*)yqh-Q=aY-=|7P=GQQ5pdOFjm2Y!e?hz&a;qT()4*%trMmx4zsDwCdQ5o&$B2OE_0|iv{i$`AZDB>H2p!w zI#1+Xrakzunh*=u6mBVE6ry%Kp^7Z02ml=05UevZ&RK&i+g3zh{JX^sy_S^P))DP% z?Pbfv$-Y;x$vIdGEa=vWA);FUL}R=C!2k5}LryqjJTVr`e?SBKypPRGmmgeb%*tM6 z*>dM{Bj=L@{I1lq9$F{nwM%82b?z+>>15%n#CH++2t(adOpV-dHNA7WK#I#3(j2f- zq5T3hF?c*w@vVHy(DxNvXa$@M1s&aRrDsKS_)93@Z_%eUFS^=AwPz%oFoEi&21%#b z$!RNlD+`bW)tuaZUCGSa^wP|%#RMFsKJRAMBuX13X(X@7D+umXmM(=??Y0!4j)`c_ zO}})m>`LdR&z&MlPGU4MUnfIhdUXDa;Qr_6*1wuy-{VR9-6-)s*hoUeW$k-=v3YH!Yjk-w55sdkx%6GbpcupHFmwZHhf-Neuju5TETzYOP^is8+i2dx z;0*mH0ExdQol(~dCDrKI`O;Q&!$(BosjEZK^enApo{M>b4_FQ6#BCMKp47Rjx=}O>5%N_>EAiv; zKnQ2>$8+`Ko9xF2CnAA05WgWxQ}&asTmK85RBfn&byjIt2?-^gskYG!vE0lm(xo2C z?jkFVM|CI%owp{XK_N?Uq{6)eU|_wyiG^>LK*TF*Od*CHNj%xR0$N^=Wx{$pvTd`b zFHelr6vc}JUKma}(ok*8jt|uk-cZ`A}jUGjTfi~-XPI44^GTF=iDBn z_AurfsgM+zRjpoHo@A!0ZPEjvb0}v7G)@##2J;yqzic7>e`rauv)W_61JYCSb zA&1@-Yn`5h){QQtkElfs8cK;B0T&Uo7!hr}LU<#46AA8-6%)j`E|%-vvL>u?K1iV+ z0gC+1$BNQe0svkXua?$xkcJ3!Hun3ZO_7r&&sb+{b`H}}{fnrouqwZs{9=*zgxen! zbQ=%y`?F&95Na*er);m)4++K=8~nG$k@2WdY?O(SyUt`y@$6R;8uT_KBDR3n2t|Pl zon$T7kys5{KFD zNwrZd-<^+(I%y+xM6;ED=z2R7Xqa|G)EDi z8ZAHgdG4pcr+DbIM6WpUI!FC>0m|;Ox60&xEO2Z+IY0$2*F)TBDIn`xj@#7_qb)w} zdK)P-$1K;dXtnTYG(ia~{%13kl}l~=#1^XBH>v0)5Q;~z|Git`-z*IzsH?}?AtFY< z5~eMGpp<96bk`(fh?JhvtJ)gC4l>I}C8LkrhCciY9UDs@h+c%Stq(dtYfk39(rLWD z+0S5QJjYv1Kc!JB!J4nyJCEsEFstzd$-YAsOTr6%W=d|QL84q@2q}KGgW6B25q_mi z`j9;Zw@Plias5VR&qM3 zE|$4!K;`u1*L)FxW8m__M!iOvXtM9I5+#Dlf;?1Bu1V; zYoE7qRd&yvfVL5>oDU9h)Far^$eG#HJ)iV@i9V84OsA((F|Q#Ld4?B|y&j`6uDDVd;4s*@aA#CL+N70{)l-mIv!a>7WYm==!PRgdOS*NIee#|>wVN>PcI?r-eXcSyGHwsPVFXcbb--4H@f8GGVCwP_83mzzt%`LUJ`%itTXq=?;hh1Na5^e#|`O%@UmV@*%tFa zW7iUcSDeun;w#256y1oaB@ObX!k3oBT7oVtB9ku?t!O1K=?*PK>zQgH99-N;ybrj= zM#A_pqLE0cSh0~{;YOm7$e+VpjM{;!$6@lHqV=rOEZh;B-Bu58#Oz-E)JDwCu0y^d zzlEH(nY+w91oP-@H$2mL%BfB1?0F4%toroyKVx*;(y;))y&gIyvnE^ycTDC1*3VU^ zcm1_p2IoQHti67f&fH-U;jFl00Qe@8%N;hfulFr_#`kx_TGP*F%P>nL6mf2!rId8k ziqocdxyhZNtmIlv(PHb*1$Kf&RclEhM330Tn(%g5sX2ce-yz?S-V~j|#>8BE#nt2u zqCVkcE@~?t;sMm)%|yMEiWNnDP?@MjVwjTcQ%Deg8`7v=ATr&U6tQbziSkIPST4% z;g?x)U~7EhL0$SyzUmE|tBDq#OjXOO4jF7B(h$k*yLP#N(M$9LTld2PLdVTUN2bKe3d6Vd$OG+ zG>h3Q!!TVgRd-1|OZxI!EAppdOCnDue3t<0W;Tc?1FXb&+RVlQ53b(k!PPLF(Bf-T zY=SFG853#-EB%A;btLm2fDa9#!%fdKD7>=*^HvU%iGeh?7Yo#Jx?8aPQl)(z{`+eH zH~CteFCMy-(StKNMQn1mMP6?sXEMtP7L_s9IGY9ajKls*@y_xWtFx1LLcFSh%SAT< zzgQP#(-w#|c);vFYk@EYo_)n}WBDadk_frB%wg?H*Dae~t1_^fk+qxAK5!625s2zPWe3 zmTA8mC6Fz}YgfE|CGdvZ`a6rZu*f)m|qMsfn9tQH{5>(YF63M1HEKGl_`vWMh`lyM7`8-DMONDwlY+EuXeYvvid$TuA?ND%KX~MCNUJty`&f|Gwr@o zk^fkdCP5_W1Zi3TagHL%;&?+ZZn9LbP%Q(2Q8PBla$qf}I>_-{jxYUM7$r1Dg}`nc zis$Sr)n$r^=K);{0J$r6Y{mPfrqq)1&Ywk-*1LWZBE183OPYjs1WA2ge`NP`P5%Sr zSR{ok%5vO{jxl%BDKnWkbR8S>Z7VT{lPCE2PF4ODW@p*^gk4XvU+VI_6f`shNfyxz z@GhOb$2@)i<}oSRDc?QK*G636Wi(4AP6S!+e}2mdo|7 zM%IVjPNk+lNH=*iEAK6hMkmXAD1&D2VR9FXS{>N!T2(R}mv~ssN({6#lv@_^581O# zt%r}+o%v$;?AiG&5|sqQYe`_{aGjVMkuvDZCaPsdb@W45pFvd@>WESQ8EF z92C$Y@N=;FQ^=3pX&|+x_6UV7Rry!Zir)2`1$`B=|FM&gH8!^EaoO63b+ApDt$hm} z?pwYdb7OiqmG1=6{QIy!ZWo@p3i2OkG_i0-{+&ub5dHZni+=v#$%~#mYYB1FNehZ` zQ#3b@n{NHR6}ijvF7@O_PqtZO-@fKgcU(_>_f`Z`1XhW7icX}$T^p~u-9sv;|7O>1 zLMrix`N=eiv03gydd;6OKe=0RellbVg}DQnyf#1Sh2r^1gcU<6E`)6(D{{1ju)7MA zQl`>E*lsCV;!A0cxJx=<=Ad4a&1AmUU!Yc?Xwv(k?CreZmI!j*`DC; zF!|qI_&zPczOYC$j@tUijAJ|>&yRGBj|{`++~{8WER*7eX5K19t0|jqoGH8*uIRT; z7r(WR-1ZR+i8>y%7=K@%YrIcU53DG!zyMQ0iz+B>n$0A3E3_4B83ZZ-wS>M&p!BR- znD1j?X?Fu}fNbVuCn_vWH112j>gco?rMaHn-PmIJwbdEfkYjCniOt7wTN&fs3j4fu zJWP}kP=ESEU-1dMk)DeayY%XV*NyGHJ+b*RwU~c>F&au&_k`_7d zX~&CmKsfSr$W&w{%2?c5&d?JKc)W2*v(*Dx2mj$Qm`C+Eb1rXq6j znkSpxl*ZRYd(|1;nyou9plJt)u-$NC;bZ0ahIJ~wS^^D|mg2`)%5A&hVwxAY&@DG? zvRp*E#xC0f`>bZGGt;;|vv76c4RIy^J6_qgz9W5mW6}(mu{V)8{L+lPe6V`9)~*E? zoX3ED3*V1HE{T5F*p(Dck)A~&#O4bx)vtv7lC+S6AzhuZm|jKI6&YRgixZ1Rtq%hK zlPE6S&rpQCaViQ=+U~BsllX7EM1C2;gY6CbABkQY!W2Zj!`>1+9KqW$G~oA#mj-Ek z%itfO&2<$IttAx`3*$fqE7~_>8rFnTRY#j2obajQt=mmJMy>h1l4GE-N@3c#ZRuk> z!(sbs656hPF9oZypZdRedlUG$>T>@-jTs0_Na}4NvPi%v0a8+Xv1(DgVyU>Lv_QZMw5$aLA{X?GQ?&w0t3v&w*GzPft?_1{89p`zXLOr~Rw_i4Y>M05LZQKe?u6r8 zrZN;gg#v6&t1iCBRtf-UI3Wc|AC*j4_^fHiu#;@-MVF)Jw2#a=*QXyE)Owe<aUFFFyJb9~E_rMp4^7c(fd8znrX7i{AcLgz_fBle> z!DYT6ncz{|>fN z9F4&r6J7=kShtD#sF;Xk#IapOYvj7f+?5TKU1M3opu5M1P&R6Q&^r@N8sjIT5)r7L z1z}d&0xjrY_w9MMDw&|;Te6`^&C+0sQYy`@DsWLfgg*;Pi*cHwzjMB(q_hS1s1q@m z)u6W6z;&s$VCI(?RdODx!w4faBXC1PqZG}ANitNTQ4ON_@=Oyl5Lm3dj9dsEm#DsJ zBY2YqDw)qb+!IuS%zgSuaIRk!No=d=-Gg@?==$4ejsu+-flD#pMVruiCBaFub&2q@a_NP5)YX9GyOTsabf za!}UlgR(|B+lcr9ftLuL>P3ubA-e7$5oBVjON6C1-U$hD8F7IzvwyWDe-$*YKfaY{ zj8-6zLWUsmf~2^x@H=#9g7$Y-`xB{3MKgk00%a>%*qKIj#8{L71c5|RZg%=Rj!w~9 z!$SBzw$`-+^z|w9^{@~n8KAC`tVf@G#KpS_@jlj8er;zV)t-2&2{4*@;J=R%3ye(1 zhblpT9r%Pm)?`({#8|dOYgRkh+Q)dDfvtc=dxs_f`lL zsVb%@iblL`T(`N5*wzV4D+fq)Pz%*I{+gF z=7Z|5Evvk}5j+k~0V4~35c^$+XdNCLj1~(hExGT-9rp3OYC(1GqII?Hf4{qiz==h; z{GPe4rj#=QIMrL<-hi#?%jRpC5jS3#$ZF8X1L-5eZw(R0jgDK@3OT8KSyjcKSmCUs z@C&pgEVP~bfa%*RqIHwZCJ?n{bU1K4ImngZuar&b4t&|G!# zY8vEz*MIs6gVE*TW&zWSu3X(Y$NI?eFt&)C_dru&)T@1)+5BflB_-i3#|wTMZ#N1! z7>YlD0x^pF+wl`UGHdY5Ho7=C?E;5BNk{UDnT0bsnS_@)wdgu#&N7q?hXY#=>;%f? zCV`hZAN(M+z3Gsr&2Gf9iTy>xXVqkL#1Wdd&`CCa%wG+1=~FX!IIBL*Sa~y-g2G#| z1Z51;yuw!keBeX9OKXWH7TBvqFRbmL6avA{W%`^^5}gP~4{^*)b#YeEFqX;$oI&OI zJ%x&47mP@Eh>*hi>^Lw?v?uTX9M#sgi(mLaQM^J#eHPN>>yOmW6RBI@dNx$%+>Uhr(L?;#C95vJf#-ula@?^ zZWaLX+b3;O`I7eIl2PwUL-y(`!DKodbxi!<^3Al25jGj*>@21wv~(N(-*#YlBSR_G z#ocWbaT~mpBwU}G1fXx?Ef!THH8fZawX%j5P>04LqiAq2zYuiGy?J<; zSzY{C0F9FjjS}@=9OmsQ0sQb0bpavlLv9|Ww`1O%($A2uCAZ^`r9sd?SF^~P*Gc1? z=4~-=srhY+H5?696%GD6g>ad_yX3TTSrq`ShEpt|uc92{t(L3oX(0)VOe%!1tN>Si zRTZC!4p~67aE;RsgL@89I?90IflCquKNYMN;9HD#+pEq71iR4=g9^EztbD22D`s0; zAXb+1yBKL0-0`cWx19ZC^+F zqo#^;~&FH^C2aWi}|r( zhR5Oze|k$QLsydFkPmwe2Ao{Ulo_c`uL%ZfH^Di``OGEfRuq4DNdl@q zK*N?F#`F#UN?_6G&_m`&qh6yGC@vF7jbsLk#-aa!;DYY=zkG1B4*0!-cu#^yi~$2T z2ht9aJv`oOCBq7HWV#dm&(}RZgZl9C$|&mcHn+z^hnqyzYDLm6UT@w+ZeFdVH{@F8 zxf+z~SsUZX=5GkYN%I;~83#OLqcVOsWHgjwNku_X1(mQ4lQq$<*~U!a&xneD=)%sc z?KVDqI#akEfb~H~+gh=~8XI1d5E*5Vo>88u86#Ki^GZ6Vl#@MVb`LX?TSF+r>6MwG z?;k*2b>FmP>P<@EjKo*OF}a21-bu=w>Y3+y=J$lm-bY>>I-R~2W=XW|T@Mmp1&!!m zEk&{TqB~$CGzm=(PodJ44XCWM=3z3ZJU=cfg?GT}w4PuRvH#cysI{96x}R&NEUsNF zwaex(amsZORv~w2cG}%&(`RxuKe5S`|1Bg-F%~H#x??0>pC5&DDO%9Pp0tCFubtHG9)XBuh;JhIaL}gptsx?a*ofYu2ti(NqQIkUP~uWQ}cP($>i5JW(TCk*?y>7~D)|~~944~2 zOWfX8p^eyE7szEUpx9dzRJzDQPHue;B5$Eha9*ao(iF@?D}*rO;zEcKMCNuqwTXLS zRFBYD`=8E5S&a>7#w<2k}g^DxtzAb=v#Xn5>O1r|8nj8x_U& z3&pg+zjM*-<~><|!Z_g&<+R+ey7)GYFF9;`oe(8 zWi-KBlXc(5alXiJZIkmA$r(E*d0^#6R`&t;!NFi95ZKPK0D;!29+*I|YYf4z20^Z_ zlg5E#*A|_=@w7D!6uSl}f+b(d`|!9Tc^pX|*YPL{VOPTjCl&_Ws+V~!5lwh@%lBfQ zO$2Ur@iL=Ue)_Jtx;qY0kaMw)gMg6&BURV2p)QDX5(AEM=r>`&VxuSrxV1X6mt*C%by`&Pyrt3>ueG79Laa2~JhD z+4`G5X$3<6`YOpXA<9NkAC<9`SfqjX`jd&Q7tk8rw9g+Vh#OcZPA0i*_po9$_;F;%ZH!W!k~0^D`1)78~az%G!B81Fdpi z`XW4Mb-b8A%nA-3Uu%(MX1jx77{S5U3DaQOV7+uBGzw%(D)8302mh%Dajos(lW84R zCge!+CHv7uYPAe2g(RJ-Qi7=5VzC-A8!ibnFMh6wPA+{FfoWiISP9i*w!}y1OXEFL zzZ=V?4N+R}99F3o+As-0q9q~{#EQb}Fvxb$^l8KOoDRN%QbAirlE-z)W29;U&Z?z) z70^nWVM}id-oFIfrJ;Hi5dj?^bEt~VZOy?23Px8x$Eu3ylXIDYcZdsi#~jdF^@$4Z z6smI@7uK*0_<;^0myeOryJD@CKehoidwBO%8u;bgO@H-aU*it>0z*WR!j>_ zW^P|2?)6nbWd%|zQuZnpm|JUtxX23lcHRYV(7vHl(ZbzwGx=-_gd?f8FM(n`{V&3% ztrEkQVYB0d$9v(aEp@tuhnVCs=(PgGxB+}Z0E zNu6~awm?%$XOzdrm8y%sP0LU`$Xn6+-_@Ee(3x2a{nT+y30}I8Yp#tw+A+*tXnSLN z4;_p{wTkC*RR`zWIDV$Vv5%vx@n9k`2vcc5+IgASj}Z` z|KcU^|1HF>5;K7&k0VF7QFZsPmSf^dl#%Fittad-IHcd_V8q9PwG9X z^<|C^{>|{K z&2n12*r;w-1Ga;X!+&zKheX2OQCydK*ht*YxgD?Zk;u0C8z@Uf1FLIS*5HV9Qmc*Z$CWl7VQ^O#dtO=!kL!}h zD0$q-V>Z9QqYQ8fHaVX;l<{IAH=+zExPQpi9r$)d%DuG;lsnxE}LZX45igC`~!N4Ys<$YJ#!l6=;FMZfL&@J`A#l@ z=J?NRVQ8*3H#P5dG2dIiFr4sD^j2Pn+ojyp4|(1;<$b@mJ2=BSWFbg{0OFTg=~F7+ z-w-KaPDzy}F=10G%h|eWHJt@HkxycM!a)gt&Fve1?WrN!`#|R}dXfx<#$jW87_Fbc z>(0LfQ#UubYIH@jj_+Kcd#4au7^Xm+|=9kVcJ?I)HJdp zW0)ni=1hGQibE{=#ww;r3A;gbr*5%C(BJVLgAxv+WM$xxzD$!@Iadn>t)@3*bMMUN z-d{UAUo-23T+N*)&?x)iLSZX+|06%^WqQ5m_^Dyme$9;Pr=;y>*HjD z#9{pjc4?EDH_g@&SL}&VoP4kwMVExIzAmgrOPBFpt^!sMf^2bsCSe~&nX-8%VcCVF zz;(J71MDSYWq$h3f46Rr6G{sYdaUjp2Xiw=Y6nJZrq|e{_jl58r8-n|H7FvlC7F`E zH96w;YNlM0{2e)31f5(mQYW{Ez%4eJ<&)@RQrVNu_t0^=T=7#W(0%qRNw29#Rb`a} zZNI22+lo@Qgy?90do2<^+xstHP=omzuC6h%O+vYLmRe_d*u?_>g+T8EsXN=`veWcK z@7Ow;#*=m(ex{1)Wa_3ItFgNH!#Id;;Ve6>s?EWPG9FSl6&^vJZ5{U!X;2P?dL09! zwYG4!y7()2eeZux3|H}M>B5q_uWcc>otYf7I6H_%Td2#iX%fD~CX%-gh8;}F+g#l- zs@E=j02w!N=0ZTMHrfdXEzXwZNLblqaM^f?ta^2s9F&c*ov{~X^;hz5h(QK)QG`PBW=P1VKX%QR||Wamw@6(?~ji!$+WS< zIKlg$F}Eb3u~w2Q3`VVniq;5XDqm-581XVbsj^2-NL6M-&^_df3F@XjZeZPuug1z` zGG*c{I|#^@lU6(&2)#vwqasisXCKuI9!Ea>9-lsz75ca!EeP~kJRyCMI#8NyhdG$e z+l-aP$hJD_`CTq@F$|u|^fdXv+=UjoB3l&;p3Yn1rd$?* z0zTGfas{j=XUrDo>h@JN1i*WH036R2cgYh1Q*LT48RDS#CHxijg`jt~PBl}m?%dSp z_DsUwRdFs0cSA0PK7(_hb@&~&_7M3P%L#QxjpTE>nUe0wO}*MH>{2}29aq@pj;%}U zU1m2QwkXSi4-D_==i=tQ5x_-R(}*r2ldz z-4O=cWxBigLt^7Gttl|#7K71=TDia&M77bXOfDojE27gll> zhl&qsVB&vxE^NZrh5}0jW{K`oAFHIheFvTE$rsc85c2O1G`6=c(BJEck8v0M=j{>G z|6=U{s-*oP&_3`FoTd+EI|>(S90(YX612N(Y>uCo)?W(7zEU3*q zaHOlIO-@9^Z)D}e)e3GO>mtuuEn!XKS@VzGPz?W=m49rPf3zsB6C8~g9mr~?Pd^3` z#?dn#F*~NWxjrX|%%*Mo(#=g`iXHrawHv8H%aiZqOli##z3jE#xl!`dDx4d`U6M_u zl7pfzRI+vTzev?N*zc6ZsFnd$>~^3m%tV=m!ocdR+x@bfD??5LUx#Fw7?MHbC@R` zr^AKI;BCr*SMXz3=LZh!90j`i2Z%b$@R;{e$5?N3i=4!BuzJ^vbTGzfKkdo-t3GF> zWb@M@k1;1Vn~J&^yB}Hj_lvPwvj=NNq&mbLn9M;xs%!8osv|e`X7Y1wh-zZi@a>Y? ze*I8^N^m}QmcS9D1FJh$MY%;_{zP_ghZFcsVVB&Gc^K(e9VUxd0|G`!eQzf?({(@cyF453H|ajn}>byN+&(gKN|*MO^&Tl zO7LST!OuE=>refaES2BUfFU=4;)G_o@!C`!B% zB8lr&9w3I4@}*niq2++KTwXhY^%e;?qE|$j!ItCQKXvRIsYV$U?KW6tVH5~Fta84> zG2x!ie5b*)wDR4eX|oH%i{mQY-x`KU`xbsiuC6j}_r&-6Zqh4!dlK8!fnP;DO{oq}q5V0D+7 zY?E4ql+k3b=T4R%*xAYZuE`Fr%D%ELyK>`E*}d+}=4)8IF%z?c0l{91Q1j_>?(naN z;vk_#fFY?w`#iLe+NM}&kErrS+qdDJd{N8|xZto9b$q<~Q{~6Tm%c|2Uu&j)z9$#Y zgVsaPn$BT^dWa2^yk}Y_kC$9n?rX`{Wz;j5};`Mw#BUP(S`9M}{ExW& z_DFuaCBNP52arCAefx`jq%BGXmrVisJVkpv7pPk;YduK8%xk?y*xvD zzONc|K%#|LHPHu{9aVI!q4Iqe#f~6esat%Y_<-N1wlf@wmR#-p_2jdj?BGfBdtrKg zh4C6IzaJaJe;mB=Ur6&T52U{m0V>&V+Y4Vz=O|;L8?t}#Js7fs%#bz7kOlNYD?mak zF{-8ZG+G+QSZ`?VQ=VxLBNE@@3GvvMNa=x+CUG3-h?JlsyYG{d5ah*{HU)XnuZHMd zFB=;)FM<`2yWvR>5+P z7p`2I=E@fBUHz42xy$?u1$vDeX6X~^05XPIr<7ypI)p}#0vKH^-+>ae^U?gPHbs!v zYKdd+~`ZYK5cTSt&vCZf3G;>mOZ-nRFIep&g0mVd&QtKc+=yB zf~o>+g4AB;s7KoqaI`&e6znegzhn2ggMEJ!jv_GD1S>)D&@UL*o;?LjcMX^d+qC`9 z&urf4@$ys#Gl-W>QU;ebTU~iiOZyiQCP@j_v{k8sJgJt&n6)N>GE^3W#s>B4W*3uu zC39uD^07@_LblkZ9vs`O`4wd)CrE>Lt7EfzvNAz|ZpjTUpcF9K2p(Z>^yj~qbVWO; z4t4{ZfRr)@29(*@_=4;hzmh%hEDCHM0Cm{|>THcc{toZbWJyGukt8oF#aBQ1f2a5} zHk6Rj**%PunEgE%$ww}w{Wa0k9ApsN-*~I1Iu(5au79;yys9`-94Wkv5*Pl;KhgG! zO;)bSS@JJW7JBlH4g~1lbbwtEKb$ERliT88%YGchVz zb-P$S5n8;vy zare6I7akR#-gq*+_;lL#N}o&iH*AaJccbFZ#_&6tltXoO-@xYb8I#KVW&FM540sEL z&%tC7TXm4xZ8t=%X%5V@j$$Jy#oUBB7RQBc+R%bfHM-{KK8oCqH9k4E$Q{J}ovWh5 zPGZbpq0rHKnU2)p2Rm)|^DbAbFlpOKq~oF89^h=FAsD}Ii60sSkKiz8QH#Ryj17@x zn6`%1_m`AjaNxPE{mTGU&ETB_qxC#&JMf%Fck-FV+qI(UQyLb{ZDx_+{N`;nTv{_+ zsQDF=U-j_s`!+SbY4cvMZTDh!;GYfja9SAT=%mb|DZ1W__8PLAImDE-aH-kN(m=`H zi==R6^sc}1U9L~iSMEyvG5Mc3pb33f876_x1szhQ7s5~P@ONq=aqXz2zTMI8)pLh* zq1|U*`%2{{$g-;TCO>Zyp6oMwn~}VyW<Ri>kmC*!;l8eY?j>Ggrq3B_CKG9j%dxb$&&s_ z=$l`Vx<7TLuWzymBV3+MAmQ>Xh2Tq}kp5)PJH-+s^t)AvH(h!Iw8{mE$uBtdr{^Ji z@@L^8GKvxLa=yiOTDEgy69Xpt;&_H-?RL4ePA1lucG@y0+hG4Txit$PvV$ot32Y4VOZMa*KZNLkf6)zzT;W9J8v8o0(>e7eZ4Eq^G3?Zhl zdo{nNIHj_H?Pq`9zEE2b9m{?eFGD+lO^bvPf2t&5>zzi93MN23r{WDxMH`R4MmeWF zffu(!XZB@<<1^t%|Lk6?vXcnful0$neeG%h@Auti^Ag#?DRF?RDE^{Ib797ncs07~ zxr>S*Md&!0P%}0OYr>jz@U$H2E;!(EWV6B0Dkso26~^9lqJGYy7up6!8RfnK2{ zyvo&0uC{qJTO7GIG;KBc%E%CK1sRS-VMx%FWH+>BK|>2)5=6<;YAq>qTXa{L3&;1# z8rs^eeI_JUMSM-Ir2q(odnGm^vh1W$7sVL1#>)$e0^QLG=fl(kB-=M3E75Mp^7Cya zmsaM_G_d7exOe$_4>MVV%Ur1NXC_>*xDO8MFR*w~U}&$>1h;W>g-ZHYt8SZ+=;9&i z_vv&)%+%ExCuWbT1m8uprm8cAoAm@g!xrM`ggm;%I#MRFhf(uNG4Nv**_Mnbw7gz6;U#`;zz>XJmAVQDVC8v2zJP zzZ%=nE|m^)WcXkUyX{?R?ihFg->XY#Z^IWsC-0~faw~g)Q}~$hjx3Qs&#q+GDOR*O{MAmJjPtAYH@Ipt~Syt)Acm0J+hA z-%!3FfcN5%0Cj29vFh&%)jE3=<=`{4nIn;m0@}B$`w$2{Z3)#?Pi(d#qdA zS&(TdoX07N=O0Gee53xX+JF|5@he$7OI$@ zUf$efzDF5mc?O*q7iTE`gk7_9Soc}{8xL7M{3hBT4@sXVh;MQy z0KZv~6Oer~6DPnC%otq*DJy8$=j}Ll7SnT~>O%R<+n@`6c%=5{`PTCsR}bpqn_1+` z?Rd4s8Ox*oF-H^RF2Meg;UzM>O&O+qb=ul1IBY3ttK8#@h>7*wE?gXle!M;atI-hv z0F#;N?4^C#?1I#qo3B~6uad1@hyrV3qw^P3vzMs;Dyf^aWF|gr=1g+6&m63|X6E4R zYih*Wp6uW!A>zp#;_`)!;%)sx&6fcCpsim>BS1R@Y$c)%tmN1_&guyi=4*#2*2|Xn z_(OMkV}JfaEbC*R>2PQ~;sh2>ceq?3qrl)SnW@_fjBqdv!!&`qaI2iUT0-@&Gmxcc zWc9l6xj$?v(=cu8!YBrN_}71}DYJ(*U?F=*Su=&%!FACx>MPVDlq#qypV~dHlG*2A zVy(w56Z;LTl9PxO9<+)MjDhqZOq4C?uwwLRyW&p89SbjODOdd^rlPf;^uLRyc1#bx zR*q+MsS{@V!Qc26Q-P)o3GrW}QsO^Lb4LT$g639}?4!Y$PK*p}?r0EaghB7~M>pxY z&GWSBc@24>Y?i9x6k5df5Q-tBEovvdt#n{-UTCY~q!HDz&e{p>5m8ZGMF?UHTH!PO3Tb65uvsjN9BqaZw!ECLj zCT78^6ZLQc53}@eA`d6{euY`q%;hGAh+1HZkin>!wAsRvZ9(Mjng)|cYq08WU6!ek zKZ4u(3tgQJ8nffI&Q(smUZ>XybkGx_aOszQ4A)TnMdF*UY3F~23y|Famp5r^RN_)@ zca6$+R;`y}JM^brKBi1a!UrIIVSU=n}N{SOeiBg zLWMZqFr_)W{D4C3Zf?lds?TvB~cZL1npygKc#o?U_6XJA(i=ddoKiNag|EoVMK5 zcT%23-7VO4i<4)tz91nIV<_aK8zPR-;pA|k^heDSYtiz(#GH@qfv{9@BMRHC>SBp5 zyd66#uTt1s53fYevldfv@`mV1t;#$Fi(dFXB@5rtKR+Q;;T-*w(LWz2mf|*tOyMM` zQV!NQro>GMf??8IW=d@MOp_Lg#!sy4Ub3X?_lHhVnPxM#NGq6tH)vNd%L>S}sOBB` zrT?+9c^0xh`M9s4gINoj8<9nEhXDz41|3;pHOKN;p$XQ$ZY(=Sxg^%PDJ$`bT(_B< zxspm5rPmj#9J2I==B1%NHKE#uE#>eH`@W#L&r)_pT1xm}-$VIHYgARM_)JmzWXF8} zT3VFPoHI4JTLjALi8CQsULPuxa>Hb^y3nAesQz#A@G~{moeWwou7C$210LtHL$=te z;Ei24)V-Uqr5l!p8jxEIWcnBOKGd48>CXm*b}9)vX}U7693=>nX5UUwp|>$YUNupa zs-o%@rs5FNQhKANoZQ)9mgPcf+^wXeufQtb>2@$WI{PIN<0a|nOS!rS|Lo!0M`>MB zQ1gGe$Q|2AWIqP3E$f+#WGt80qi?dK1w|> ztql@kpUl48>GoyE$%!yqdBn!cb1J^oXNyacm~cTD=aPN-(T0?LL3C`eJ1$oak8?Q< z25)SV>4lwzEpd4oYJU4L*@A#A?nU2I_Qk0bRL?S(?8|8%a{JMRnLyHFN!5FfU3A;Up7iF z^O;S%CM>a6v3-euG(^Y!Ib~m(M0mP3*EaVAym|v(eE~01F6_&R!M@yH7;9fn4faK& zTKXGnUn1T*88}#a;`m@Y$LrW}VQ!JUS(1U#zs-7d>KM&U#t)Wlhv_TCgwr zv73H;StjN?lrG#X6Z17aeOv$B$Ug(a|FZk5+8x-$vXp814Iz@yA?h}AFoU8nXV>X9 zx;47U4IqU%^f&E>r2k@I$8Jc<6#l|(GImV)mwD$cc)fVdOe$=bKl#IdC~TiR4lR4d zc#G>Yg+7`}gX-N3^C)YS4SyP)@!fR)565L)*&eS2Lu#%kpLwP^7^z1eNCiQ)B_q{@ z4h19CV(L~F&eL1-xK{%y&A<*h-p^3^ee^8(!9#;R2*BCQ7d@xZw;iN<-RU{M%IEb-7}-rzs_h=nwwhu zeJPIi8yS$}!T~ShjQ+~v&Em_^AGL<_!+0lyZ}%M?KBEH0Bl_nbU6s(H;Hp~`?PLWp zvfN=QljDX#V$+=g-D1Fi9Zf#~^AnvRve4=D3<9q)Iwu8nE*zV&EOh_bWQFdicc)5v z6N|k`l*T~F&tuGLRsB_(B9QOoOq@;zhdKuj{`}zOpRbYDJE+Y129Q+`L0_lj=7579 zj}PXUYpdtxf@LS$*E5Bmh{#)R_A|$XCg;-R+}CN+t5>5d4oo$g6E&|Fo$`m=xV?yf zFw@NOibchPh_cqteApNv7Xt7&li3Lg+uk*QG)g$pzeH4(^AqBGdPu3-PVmF6=e z$7q_ZhCyA3Y@fvV>Ti#~*XEDsJ#Fe3tA_WF(T!LHjNXjoi{3MVMmjUg&M9x;D4R@z1-id>kZ9SGdPcc(j>Njr9|YsR!Ll{6v@NSMn2U#JPNC z?GzVf)nuW@XEr1QIZ-)q+qB;`Fk{ zZE(s!sz!Gbs-?(CY25tXRofO0`7?UINsBn=DIEQap02@Hq-1cn+AYZ7Gk*}hwkU&_ z(KmKjVyv@G3<1Et-dkAo7DyFo1zzg@3PS**?{CWZUR579HSN~cpP7c%qLiR zW1YhdoM$iMdg}pdsIbmJ4(3x_R&A-^&8ZZEH_KcK-oA>17XeDmsb~qI*xUs|(o`qk z3-8wK&uQ?y@L`QIR~4?usd9Emrf?qG>F`hJrt3jsd^g=GItMrXM6sOlrCd0 zP^wMh;Z+d@>bLoghwHC8Eb$xjG2-(F4_-8Q`6B#AC`UKL${~p=hv}V=9c4~qh1izQ+^|z(GVGO+lxpK24N>8D<2sFoK&Qq)rzWN2IF0u`J+ae}?C4K; z#OBkT#!}uoelB07wV@1NnA5P=0NcA&PUB6rDW_pY-D&8t(rHvhxQf*$#7^T5Jykf3 z-%pC2#yA4_y+E&t1h605lm=Sodb8Z$BEa7OPi}i8`lA!&_;#G5OF3MK>H3=xu*gHH z&1*jM8QbllIn9r1PP2=7#H*Rpyc%5(lz4 zpeHwn#ec}KiYt?sWyDv%D~uG`tS(+RMW23ltg#AUh)q@xrdahj_0nMQ#zssIR9Ayi z0pdBc9OCN@;shweF<-ODLf>3wZ_5^3uH`Mc+|&KgIAX?0=%lA`n5sz-4xlu zc%|{!XEAA4>U)0o&mc+9VAAG3!&Le)Psl7xe@4^kr9R^`pp?&K!$$aM&*2o`B9R-~ znw`+aT;6BY>$uOjMC7K=cs(hv?RhAEE)~s==`-HGZk#^jrvJeV{E`)>^ck0Hp{e?e zg;}Cyf&MR*$!E5EH4$hPS0*pZ zS~mS2E6`S#3G}kxjw{es4-#YbAkeDEkxqlb8x!bk06suGbeu!H!XS2>1eD>J2=pf` zTM%f=TN3E^zS{+Qd~}!$3<4cl%3PvSeAz?-JtRmf1p0!<5`orAFR`RX0*xYhJ!5_J z9IGegqucbN)UmtOK4&&=llW+RWelL&_(wx@?33gA=#hYz4LYcE5%4leOLgp)KbrVx znF7HcckGq|g#O0*Xi>rOQyy`|=wcHL=A-R3Lb%9^$EsU40Em+;_3f&QN0d5tR@8m8 z9*bWooIQ#@9&ikbsAE8*x9CYH4iuJa$Zt2s2BQa0we=$-o~-m_zq$7EC;n@hCsY09 zH~iO^Jz3((peLX8u?ZlZQR|Z%^*>Q%+%d=)<*~kNR)}s}I{AHqCihD-gM>9JP5^g)XPY(#oqT4F38n`^3Pq`xmtox}CSi zHRcD1|EQ|XjXvLGxvQegi~kM%Y^+Wnd1~c2Pkj5B>;&Fb(PMut%MMWO;$RaTY*`hx ziN+ssOl&`<>Z{EG0X;h%NY8D3P>&+KW(O^cRrpZ9d{#}HU*u=2clNZ;>IT_o?21Pu`~DmyjUKF;vF`QO4Xy5cH_ zlm2vyt^69pR_q4-q`#D*6{vuUjmd6Ou%0ACf(=53M61JN|mzjP*;{>o7ZN&koho8_>Q`7;xS|8WK`nbdR--y@-wC$^+DGu$c z4M5u+pk>ML;TJCe+QQ|$ae&L@=aO^BrzaJQ?MB99?AgeO;J|C0ls6^r1P99s&H+>; zQJ_u*)D$f*dERJwx}f`1fX--nooIP=%3=q5ZD`Y;4P_aJ5LfL~F9#U9W?`_*r)^uR z4=-XS`X_1;GOPuAAI7?V`K0Lw&|!JVI%%fXvn7g~CgINCK?cs4quc**_LV2IEB|p+ zcHp^5;Xor4VZP_Y`c^h2A8cm4)Y!8$pvGEh?0f=E&w)@R&HYd?a6ZQ1eeszu1HYrS z5fPEraK3T1M&E&r)$Db#yJL(&R+EjBXm(In`5s7H|4?rsfraTeFdyY*{qh+=1D0#Y z%W-?0V;YNPzZG(npjE8%w4!CMAS(m6dLnR{!_!8vx#evc8xFUo9G3mY`93*(pT^eA zcL|je7~)Y@V7v~|3L4dnV=a@;TIL}|y`NZUUe2kn@=lyO1M0;)i7FbsOJI%_jQqi9 z!$sniBxB)IP`b$~o8HjgxB2bV_g5@5Ol1EHpnt+@nE?gwj885b7=_^*5{4_T99O(b zl7I~}%6>_IeozRCpogWtAR9n+zeutfp(_WfObUyi zO{lqWIGacD>{|6$(+XEnN%85zA|;QB64k{iIuZq4v%3w|Gnocc3Kx;1aK4&MWYi#h zqaZxia_d+N+FMe1k1}_t&KC=(>3KiZ^KLygS)RgfdZGKvi!a+gui~Ey)Aj53<<+x8 zgSWIWF#O>3S|t2V=SxCAHvm(~^?JhPHOtP45!J=s@}{bbX9yE<;eC}~j-Qwdd9m~L zxUhh!n&>2P6(^Ocz!X?_`bKG$jtUq|HC2js|rT^N`fBnRN?e4$68e9D=5cN? z!)6oObb|Y#3`*fo>Fb!yMY|YD@QxlsDr(=ydvSI3x079GoHs@vl@X!@F^C0H>hAG@ z-LKjWb+}LwO8N_^`0yioqY@o9xXMQx)l^F0(Ss}RwNnojwg}zVZv3r9D8Uob8*5Z6 zo!-a9KXj`eqaA}u)&ip%LrJ4XzohDX-Q}-}l7x6vQycy8j{7$k{)7fat7~!1y2`$c zdt>;g)t2xN@XrAe_?I>8EEWMSg$bo2dj>ZuGiYpHD@rBa9BU~Tn4B^Ck3G}JXf~=C z1%lBRxh-0a`f5^JU|WSjmp*ihcHy+ySGNU?EM_J~qdeX@AK2TI_$23g!X!Xgc`wQ9iS*J8E?J3tAv;scb*SrH^DVZ{Xt(`fD+SOJMuafubE8u7kqJ@_de@%=o(jo^#^z>u=7;brudUZMO zaj#d|D?d#^r>;Xb@70Bn#%ol-W19&BzNMD(*-b=gnXPFl|3a!Ibwb8%3D{o(c3lL_ zYJx0mnwSum{czpp7wa1^iZAM@wAT95?me^qKzi>h>%TU<*UCk~XO-w;2W3^+_*!Q+Eyd$Ww3FU!}Q!V_{%n~5)%#Z5g z%}}QhsFNvhXUFE^+GuJu%F@9=cbUA}_+y*&qgDEWdItUIkfLJig4DZ=e#oTQTxwX+ zgc^|}RcO9`49?>08~lD*EgsKpHdtSO#DHmA_P*W&Tq`7d^a9 zn@@o4t^jt*&l3V3WaBTVJI#X~8>h&mQRiTjTQuwfq*2GGeX@?u{3>NS;ht7bfE>| zXdtGtG8KQr|()0i+#Wz3_+vjh35Kf8Pf=Iz$f z_xqTFL@E)+*<7FimtpdA6<}}pTb+R&9e-0Qs&)4-w0cw#Xhr+j_i#i?9}wj-Q+`h1 z%l4NiG0@N;-Z(Ge?KM&$R-$B8^wnKCDLkKf%cY^QC%>6$tTUUhd*XgUS*xNJz_B?y zH}$qVGzY=WgKXhD+uLBjCM`i)T@V1;2FTQ$W%L^d4-Fap#=$Ud6-W5%07k_cj2H=@ zSLi)N8n#rSvGMr@vL$?$SRh2)U{nEy2TDL`pV1B{T9KF zl!w)K1k9r}DPFe0)Z+x3!{{HB@p^;FkGWUIkS`vjvI!P2s3t(V)zX;+4>rbku0lnP3G>DXeaX6n&{?TNTp%HIH-vuh(lSDK z6h-LRG1Jial3)CWHbq_dHtfi|up@=HsQ>X%{T#6cHzUz$`te16aQMTCdVVXUH>V1Gcpu$Sew*cwfaPB=yolikE|V$zfor(F!##o(M;Ysn44gCtAocTd6FTw*}= zRx@C6prSLPoB;&&#(-UH&^N_^&GG>gGT@gxS2AEo!UF@OswD;-dABj(ASDwpU>`&1 zf(e^)2GmKzoB_eNcJF#Kaj1n7yMo%cD<($}(m|6frytHvL(db;+$AOJI z@+f3^R8L?pYC|pzrt!5Ro6i#IZ&IZ1nH#s1d0?1eeWQYP&%E1CThcchjIp)%%i^)M<#%i4o@lLZClQ$ko@R`jxxEf<-sjP&mUf5hYfp--(+EWh@7G6YNx5f zbH{ws4ijSzi4=MV5XLtalm9aXLeCbkR@}bDnoc_+Ra56gHPI_LU-n{P<1R^s!@_C| zb#7)5uVgd2C#sN|8cWo8!;V{|#+#BR$EU_XbE-)~t_c{TA#V`TeOyeqR~51vyxkPN z=Wn>9J`Pw){Ey~0kDzaWj->l9?HBG0n1u#TowKBdW{d3x*(fhUc0$? zOPPmD>d((?UgG|356a@-Hi(pi%RJ=8zePsccw=b@&~RsE@riexZl)6&%!oP^>Z)Z5 zD}$x8xE~gId^2wO>y{fdgc3k%C1AUiAm0joC*QE8adZ>PlYhwG zYsdoH&{NbCQDvr}yUWCz(u-|n@S(|8ugv48NUUrKdn zELOFgAh5(raKKn}OX$nod-10MXs{#nW4JF+ydzS!p~E?xB=t+ndMS6KUwopn&aew2 z35z{o2{M`;j3btO-ESV6LOzS~6pGF+-EbSJ`5>gx!rd5OTdw`Nm+7g$_;iK5Q?n5o zf)1--97dLe&c_xB?cM|x5uK(;m+A?0lS2A6F$)TV7G+ha)2>U$s8i3iW7VnfLo8La zd;{ibrK06B`w{y0Ka`?R(7y+dxP#~Yo@>Lg55bYS{aF6#GWNm*6G>ARM9oDmJ`^=k zB7a|2(`;5%TX4a+A$~iLHMrUN?Q%O3 zPZPP2nzq_VN)TFD+NWmnQ*RvJ0a-~eo``Osdm<(_g$O(hvtyWSl1P1MjKV18^%pFG zL@PWF@u>1TB)7EIW+J07s?5;WL=&U1Ar!X8jRQj=$5Q(eUve8tKn*K_HjadRYb<3U zZOA`lX>9J22^u|B7=`d6HVRuIHLdrTNey5uvF5|fS3dKZXM<7r`;wGVXqPd!oFH($ zmB1)G{JrswLc1GB6`E;SpWf!_!X{6^?O&sANknU=&`t| zzo5Kg>UesrFu{&6n83N4P@u;q6zH)D1)?{x9$SeqVic_1I2LyZ$i(xdO5v%?lEgcx z?Y!X2w}Q-<-Wv-??8}!}ttGV`c`B&wQTf+Z+ud)D)wX`2kV36W{(KzO{nK}pU8-BZ zPJlfkXDPvLWkDdGR=pWmzL?>#r_tbc6Ot++_U!YUtXtHcaNt3U-af~Lv zkaJBonEO`?l`#5M))ofPU?_)vhduf{Km5? zH5l`6f#K{p{7Vh~1+^We&hU7>Rge9bCzkWxk_N9+X7oOx8|D!GzHsnz=zyZ zroqeED}(BnWelVP#1SC@=4%Y8F&eyAticDb z@I9i71XCIFnWJwQqktb>qfYMddXR0(hSrX}8TytbwIaw-dz{_^YTN;3c-)vMAU z6i&jVMIU({a=bf)(a&tLXRw54C zH3q*Fc#M&s4S)q4;DJ-LgYdi-k{zuf)*g#K&t|2F*(7}y&6e=<~j4!$NV zZZi6x{<|&EKR+|Rulyq@5B=+5i4FdIg;M;vrO5X>6Q@c~P-X$%ySQwTNEb^*_^v5o z%2q|MeBvQ<(mHDSy(Xgn#gJgJ%GQ;5W=ZH-D#4a4O&P>pKJ*|O**`U*+9Wq-Du-Jz zmCI)idpNj*^9JM&QWMvzXngo}j`vYF$Tgg9lg>LBMA^Y@IceO+YrGdN2N8O4RORi? zY06Elv7+uK?j{~e0=?k)W2Z$axAPE$XK5b(;*6DL{^H6fV}GH%<#s1*S0@%&Dq`}d z9{R1M?fjo2VKjQ)L%vj})|TpYL(})1X&Ji1s-26s{Zyv#Mul&HGNP&mHnuaA`f7Ek zshjL|i@q_XiZwnXEH1x*54Ps_J!ixNpK7@jszaM0{Vp41D8U5tWZ~bVcvQS?spM^I zG(Yf`Zmrg6V%l)Baiwv8z|pm;Y|Z@Rcu3hk)=h1yVU7J=`VB@Rkl1A)<>&p&FHOFQ zuauqqFDv`Skk|5%*UIGQy~@>d?3C9!aq>=j)wXP$9`aVy`-q1w=o4-qx!;@lyphij@pIAq$*;*abDiFZs_YfX zMS29y_Go`a?IC0;E7r(LZ{XR~>kB-HAZzr3Y_SJ8X)v}x$rt4tviu>yj)_96wKjYv zQa467UE!uEG*VsMZ@d=Pn_pMdV&v@Q`F+DLQDDtir&LLF zmH$}smw&y(zItu@SZxJMHWj~DXi^X8-P;gQwP{H57@o3&&uZyFn_g-ayjAA*DthT0 zw`sa*`ZNn+GIrfX;ZT)6WEWfJ_^X{Qx!sdBPhpNP`$t(wlK8{?0@DxgVl}%-?ldMZ zE5A<(es$|T0?}jXwc}iG7G1~+I0;ab6su82)1(-QxmCo=WsY9TRN}OiXuphcc91!G zYPOHY`CO(&Ie6y$+z*DmcqU!-7zO3s3Mk&aB6hq$(WJ`g&1tNED05%~Gcd-ER2 zbz4})I|(_UGq|r9NstMmsOP@q#C{)po#x`uMVSz6rizuu$Txo4J9`~!F1~dsl`(W0 zAk7lmPIs^J!Nt&g7l59BSJ=|b`$eLnfwkQn?}Ic7TvidpQrPl(4^zJuFy{_&UO zZ$4G49RxpjGzX71XG8t*AsS7B5)0o#%76CU8b5Q_*&bRj9lYzF`VJ@bUGktZGJsZx z7RH+D3e2YHi?=*s0uc|`g@H1_RWqukOR1{nd85@Fz6nj$)DS)WFnX);{^%`lKq-!q z8rvmw!2+e0x6g*s6pv5gCKL zoa~Hg5MxjQFawF&Xx;t3C?UMZ=QPQZsugih)yoHEmFAN9ju1(ZV^mE*Br5^gtpsGZ z64X>1YHA2IHCjy-kqAWXRdan-nSNL|`KC~Jmz5PW($j+pC%8mh#xQTa1?QPH3pmy+ z;8?Sz5;j5Gws%R2TT8vJ{*);#CfKUfr1)1Zm3cXb5tsok6L!-zaSK17v#cu3 zTEGRHiqar9qS-DWh=gQq1Q!q1HWAV`Z>Mn!fb^qbOzqM0CcZkYxjUT0xIh zPLB@F`7?2#f2=j=0myS9irSTyI6V#s>@#seg-UCB^O?^!g`j)WCsSiEEg~&I>kNoN zragYUBp!XaxE<1ju~R7(>}^%!oz^4|tf8(uV0l?weBOhOmG8FEnB}t9SaR^IXyGH^ z*Mt-#_~p?%Ubz39r5Lw=eXl9eGWU~oX?jdxG2Wy}Ty$A@(+y4AMSZD-#X3~G6##}IHBF(Vmflub_)n}^_rgGDh%-iE zDG{>LGFGeN$Z(16TRi!LtcmeW;#f=cbKSpT+)6Q8zM3q(qEw$%61+EW%H-*nbQBfG zYfYkGVWTrxrQlVh<~iPDAePEw$E?QkdhWu6$MyK-J6qphU}fK*(!aKnYdz=aYbd`_iicqIuO1$05(ZwL4SdUu`o-j{=LF(W)FeH(DRzFOhr4xcLjOB7%gACHq z#*ef?YS)`!kg~?5l0o_k<~KG-9fA>4zaT_RA-=&NjS7VPZ6O{i6`o%z%;FPkmBlAk ze{3VDt08=7v@{N7Q9h|5JS13)?%7=^rX#aHwFos9SsJQ~9xMfVK-z0YSd5v|$o9l0 z9Y4gG5IS4kykdU(lexMBK5xey?I&K;JUPBe=?EsJqwr(oKiYL89_ex9@vp}RA&PoZ z4zUZb_6Nuxc03SCsySaJWUk*8MxAI=p#Ig;D^6Nk6W#I( zjXe?FOj3A+_($E-ujt2>3WiRuHFfR2pBJZ^x~9gv^9!1Fc%JL)*S7_t{`IwTM(Asm zQuNhQn9!u(2z`sCT>54CVlJs;5goHIvE*)nO%xi*SqheRUXUK5r9%R zwEzecZ%Ijw1zr~2)T^9Z1Yh64|W{vg-iE-E$f?fP$GvS9>WBo!vP|o6O?K^eV&{ z;-l16eif8@{K{KxjuC70Rl>~4wz?ToSKeM5BK{jf|1a(jnq$^X0maJHiqWYSYph~w zKfZyS{DvZ}Q<%%RXj9;>A=Oo;*88#x(T>aTCBGv_)y#jOfny~f$mZuhP@CK1=_}DE zZYB5z&6rL-z{z6|gf6cE2>{i={kZ)CX09;|kG}E}!%GolXb5zD{e>~z4#~=&r&MZTL(o0o3 zUw8NS%fjU2S9@p^%LRv~U@1fNV)Em+zV;S=C^OOh5=P`pGAAG8sW6wYpm=9=3eVZW z$7c@?N5|{+`z%n1B_N(M4%h11!VMX}R2uLXdpjN3IuR z!Uq_(1k9XLE^?tEa5f2HVH94oF*h~0z`Ul7+3QX&qnrdPpJ_cU83l0YkeO)Lc4uOP zqzAIZvOvvhQ)<@`J^D{KHXHQ@Xv(A#D66Wjh^!n z$PnFbHQwb8_jf8wE`2R^0@mqe@VTSbNXcz}0Q(;MTnlVFRoV(5ySG}wU${fX=T;PM zN)^^bJSXJL5ABy5-2J2fyf7Xd)|Xh~Ml3f5!hn(z;)g8~o<=SkBFLIMc0qO9FAM&z zX!L@uwctX?5P|e7tU*Gx&>$?c&IcXk=%fKx-Bytke`CGOF#H9V+N{X6VLS$V41}UE ztS?uiR%;^^zzVj9wj8-qgxyB@B*GRaoonbq%%Q@W8*~KU zOMy~uaE_>xLa{8 zCEFd(z=Ugz@kh|81YM#15b zQsl`}WN3wcBRa#D#*Q#Hs}>x-?Xn~|Os$f>l@e|s0Cv-*V}iqz&vXSDQqBFV1waT6 zx1!B=%o!&Lv=J?fe?nLX{0S5?Q+r3#&Qq)EARrc-~FTDg2>Zud6e6p8ltApdNkQ6(QT6TYAIO}c|u{0W0l0v+>@V+ zn~M!i$U^L4Sp1|567ON zl6J42GnQj<8$!PmL?)LI(eHfS;7w)0%YJK|hJh*+>T-1ep)Oe;4#qTcv(RsfH!F@rsq~i&G`I*fdUBBnJew%+lzm1gWx25=tp(_6qA0-vW0~8=0 zg^8)0n64fH*elaD=#rV7!Ndpc71qr!kD5Xyb;e^FY3GpCi4Z7kf~SUk^oHL)Zdz(w zMc>q)AqP}~W(H!fxWwhAuERNtIZ zyPVR^R+Vl58fSo@T}ERF&^18Nr?h{ycxg^)@gHKR^jV(VDUGGjdp~a!I!(z06!IP8 znZh&fTBbbYu4PE=RkU096?vi;e?fcsGUY-F6Ztd!x?D0)ao)9CX4e>50hC9$!Gkh~oTjiVwh62TachPg(0D?YY+5d7cvv$E;^qy1^x#o_fE z_v&c3G5S)sJD(=C*dkNaDy}1<5=kKKQs&;E<-r#Xx}tXkxt%Y=m)P_$$~y$0iLSe~ zKmumsf;{MKFHA<^3$yq~8rw(ygq9zO-hY-`8-~R>tvj0ibGURC{0bJLf$YPAJt$9;l;><}5eFz`5#8>pE*@QL zQhnVrnaP||Crd?(&qZ^TB>aeH6@&blVWm8vx2e{4xm7b$ z*h*t%5I*TZB7CBnLlk9x29ZV~QU!hfAIr~9D=OrtE|#AK?;l5g&cA44`8oAJgZ!Le zB~$V<>r3VGvoE#$Tk_M$GFRkhvXWf%$J@6cKbmqvztEHPp6l2G*ka%^z8;ZHgvXCz znk}y3Btp0V*PM}Y9phOM_?>W3dKK^BF4fh64$qVb{JWL?B>Km4@SPgR92N4g-tom4 zo`Wi*FDDp6$n5$3z?0?kQrv73DBO1V%?rd$#tz9`vIqpuiZdWVZfYMHm_T7D z=;BM1VMZ8NG#ziC{?iW(^}pBZ4?M>%)IEAliRX>78HcDUw1!e+ZAPP;Tc}1T!%^KD zIcpv@p6{U~7wt?^I2{^9>wn7AE3x$$fMuvIJ{yRU#@)cj9{~&in3x)F4bhywwYp2SQD_O3CZXJ3I0QDR z9;76$CwlK~aOD%?N+O@c!=oM#f868YA(4c5*h1KRNQsBn@m_ynaC4MLIodUrE)Hu} z;;BXJA}|3cSb9aiPO=%L?NvB#k0@2~t8wg>z%hH*owYm1#Wf+Lc9w>A)b*0}U!k-_ z4hw=lcW!L`Dbz){t>Y0+wR*Rz{3k!2SQ+oGpQ>e7eYB*%fVc-lA$B1uv)_cGqK`&$ zN0m}6BGq3u7iieOdWfH)C%+ZwEb55Sfl5tM%NB*aR+4s%5cHEp2pO}jK~eJ2E|NAz z@0&YLs5Wu!>SDNxbQWeHLB%gj++qbSfKjxlq(e0FW2EsykCapLxS+Wc(RGpht(e!p zzC{Tl*`ySaR2sO^saN1`W6f~GhA)~N<})XULd2@CQp;m7tSBW2$mXrSo`vG&TtmDR8|CyLjGZ^(4jU1=4P183dp~ zE!luAyw`V!G;Xfl93K!|8w$%v4C?GF@!SfV#^g0Zz})n(+Qs^AkoDaVjXWC{z+b25p^g z#8%{l@m3VRg5^7IYGDj+u|mw?fi=%+*Q1+qnbD8QKYxm2V^0vX&`@8%%p?!qT9*9Og?7~8l;BgKL_>7bf#V*s zVika>Gy-47Y4*u*oPV>v5FwVv7IaOW!r^d&5WePWg z%ht)-AsrJl33;sb&$FH!^gvV6%%~csVK$%S&E=ZKu{ns)Bw`n z(V6e1{~QO&dguVD6srYAm)J!NwvuT03Z1}+7Iw&f%kIdXn6aIvD}hg;bpq&WDfjd~ zUcCJcdNGpi-_%FFyqL-hwt4@#eLvpsxcveh%Dm z4~RcKZ+n1Ak-S}|32p`kpz>|L0KClsoc08BZf7ZSo%Rw>oqF2$H`&1_v#&grUHQ+W zvU@#YH>Jdf2n6dfL(OepQ91aj9JJSzYA%T)|gf+59LsZX@SK z7pjr3#bdciDMawu4~`jNdEvxzP~#XfQ?qh^nyvfW@ctk_xB1ZFKi1SQf5=yA9-1*R zm<&O%H*v^FXXlkuD{C7qcIHjMJCC^hgPP%_Qr@WeT-qDIBDKrl>?c|HPJB+U4Txt6!0+N2ECW zuE`FriZ7_y>&|SxX0qJCsEEi~BzIEk0M5sDd_Vh;x_u3Z>2!$?*3CUK&(nF?rq(Qe z<%cq~9r5bssw$!!J6xU@jQnx*W2WGuZ{4g?Z|pf^T?_o;ufU0W$9qO6&5B2#Q`z&G%RZDAU~E-Y z)J)ExJaLaqqXUyhWZKHrYTk6z>PoC^p$j8Xct8IXZ?K+v+Yv2IMwyvtwrgm6$^z|c zhS1%3nswxnC7Sjm6fg@sZ52@u!z6Xibc4SlJ>kU4% z@4$`{RjpSu5lOc>9Fo41T_=TYsH&i)-i1>z>n3gcHbGM@0$7Iblnh*t2%9h{KlRRc zQO936lCf}sz=k`hW~n(C-3y+ z7yj+1p1j##e%F5udGfQHhyrTDN|!SKpDp?Su399ge|;Mbt3TYT6#s822(|OO%>SPR zytw@==-WE2PCd9i?65ilmD!Xb|NmU@|D6(Z%Yfo%mC^kFQ;GjS()|B1{~vc>0v}gZ z_MN63n9`P{Kq1IBK-91YL`bE;0D%q=AgqQ>1F}RY5TIa$0x3x$F&QjawIXWVt5n}A zeW40sN(&U(0w|P442p8csZd#4LHqsx|L2^0?<`4+FW>w9KKp~5JNKURoM%7J*^Ar% zJzV?WP}=@0>h#+XT4L>gE0JdVzl;_M!=Pt^o$@6@6vT1~5y>M%6$>q6&QfL*{h*5q|e;kWmE=A1Y(3J+Bi+;%8+ge}HF zu%3g<#s!7aI3rkzSc32i-_HyN6=RTY@W>gh8)|Vc$&u`o`TN6C?q{nMiwg>Yoe^AK zwvvm3(^*Lv7eu8H7d&`M+?Al6st6uEtPoXaNqvb`OXNy^kA!i-LGifYhedJ0A}U=k z+{qtYl;LX)ql|AFv@d#SVO(%>5vTbjYyZy(E-9+d#|58c;o`WUxbQwD zg}s!M!IlJ28W;RG8~8>1Q!XwzYrlfHU^Nz`=eA;8Foz{N@rO!b*4FRToNMCI)|%N*>niqg#6ykhOf)3D2P$CTIB_HOD#iSB z!B{*u;$@m>@VA;yyiEIm;Q^T-+fxe|s%46WX8I2n1OPMBem5Sc2{)Rn8p$V^M`n5- zpNR1TVYoBo!t_9&(0<5Z85+OOsd0^0 zAn|;f8t+W7N1z!DSs(#n=!@B5^}evf0~tsRfHAqR?i3b?U-V2ZL==2!3I|XDUZhvPVaQkt_2fG1U?j!tjoW&UF z19wTe7~^IaW2lwsU^@}XE<5E@gwaPBpL8*XZ~a_2qSlXF(J7unQ*;fWW`-pfh9WdY zm|kRx=wvFyQ%JFkBHuxR>s=g1doc|}B|i30E;KSLlv|Ps$B*`(Rw@|_M6w7`7>LwU zM`kZ?K*B)ef!`?tInI(Lmi)|;A6xPUYAm5nLh>#Uon3 z@-DG0+)s=#J<`B`9ABp9VQjDHGQf=*@N;$T8z6KTr&?UEgg!kiCvq+M|>Dm-s53E#UDg%wTTKo8|YkBpu7(cV&dbEWS z<|^UUTeKbx8nZy~+`23fIhVf`mtDYu7h<<(-$V>KbMP%Yvl5uhqK^-U`2YN%C&Rbq zD%t>CvpeP6`x=cu4(Dr z0=p+>jUng)D%Uv;W4@wgVc6f8s;V$)a3mR=mo`)f_a64>y8Pof)GM2KV+YI9WK#v~ zjSk>z?nJm8jH-;wzn8BFUVTD#w((b?1^Y+~Ab;o)Ct4x@7F^awVnki1Qci^e?=};d zc6~`;O_hjs&!}vGYF4J%vBw{_GLWLCw;K$MUO{h3mAdv#&|yuR?n-(2cj=6qHm$Q) z0F~rZU4|+MR!g_w9OKB$@Deu^7#JW2F0EgBO=W(wh!hgng_(HbKxl4uOjN-;wr8e3 zi$0}y(r2KXHYsd__3E=141U4U6=1=)9nBu$Tgs||f z-qp$Di=mOKKkc3!TJsSEyT=95;}Sdy!3iEg#Fe4fy9`T#wQC3nvOK!ScoeF`j89&~s?Cp`3f{h#q?c6$cVvUc^`y$7uN82qTs^ zjF^`g5DY8h7yjnno#3b6HjHc|PlS=rG!$XffN~C_O!U}7Xb@;MXKKh?2(+dwb|=TM zBP_#?<%kVI5<7n3Z|++SsvUOx5$BiBw1N%>mA68g{O5UxpR`lVX5)$dm_^Ju=OOIP znlu?tP!Q^*JdN_2qNE%xbx8S-CF}VP`2`6OsW`N7DHTEl!2!NfY~r7ZUPCgnm;cmboM|`(4^@y70@{cY86s~hAh6UW_ zTm4(3z2Avq_j4Jpk7X-J$miUr*+8Qz%T>Wf4YaNitrOiS2CmF%v_5Gy2Q_Ij6~X3x zwjZJ{1Kd+o9qv{nW714*z~UCRKe+53*Whje4&#>iJv1_Xfr2`?=&H$3f0(9wT*IQk zRv>_ffpmBTgQxIoBNrsF{YO#lvq3o45?&e)ljH6mc5IE?Ale9R_3e39R$1?2fk z1`LY*kLuvEChLtk1|t{($>G0SL0_W;r!LQg*Lkk@HdR&!MSbANt09~YJf|$Az!SBS)@YFl;K9-W50zug=D(`WU zoQsqO*tvvYdcDg){m%9RmvJ>yoey}=csv0lL8z#LY``Y0I0#hJNhED)*|kN*%;by9 z_-f<$>H1}k)~Q%^%?@Rn>kjp&agt=w|&FKQAAHP+v!J1AGN|&7YJ%evWa{6B(2~h857pFE)CjK>G%)_h+CTJn=W1?nBcKQ=<-| z5o{+17V$?^;v`psw6uzb{@ON2OFPr-sbg>)ZPgd4vXU-(g-zLUNsK!5AGTM8MjN)% zH;z!Ss;1s?z-?Ai2o_cMXDrYsf{-l`Q-v5mRfX_pR$=1JSE5*BrF5|*qM3cUk2U(# zzQFZ-NuB{gJFy1vHvXpeLJF&;4LB!4l(`DkRepvosf_|u&sWPufn;Y^50F`DNhj2k zk2>tv%Pfv!7BTD7hl*KO9GBNnP6HqpFsi7kd$4wYbVgzJZZAw!lGJ)x&28?O0<14}A#`e78hR+u6yHMe^FKHTKsO2Un*1l;H#O6IfV1D`V4kGBcNzOMCWG^u5E93@Ew z4<8Y0mg?C@Z;-w~zgax@PXrXXQy4&wjO50}NJ?Af`xov#GLpG_Fnbfjb8r%A9Rbgs z*MnyrXM(acu7^tDTT9cGbm@@KIyl#IZm);4s0rLFD~SL+~C^c#lQp5Y%&aV4IuA3q#( zU!TCzWsNML8kMH%35u1bhOi{j7|B&9WflFk)k@KkW9rambYqP*x`i%Zo%>GgGI3|D ziXzv#7E9~pj2nZPGfu~yai-82Kj=!xGNpa4Uk(dR^S5`#-oG^VB{n{2FE}vz`?CWtPQ{Phr}*b|`~e+zyp3dS?uxfy;nvUSfR5zO#SmYv z3pD1E{B!H;fB_EDgnx(U+}r%~+tmW`?5mVv)HeE-L`@c&uGQikdP|Oz6$o%#T??p> zSws-hOBg>5kjD-^(oC+q4}fhS`ljqV4I?275b_v`qCfzM zLSjJ)$a{vDL~|aKLW#dkE%XeRS>!>^6?ldsE+6V}HqW5S;2BgIIa<95$uEv0~)-)TQVPok^ihU5Te-`NS1XkI@Ss8C!Aar=wT0)Gn(Dco>gONCUot zmaa@fT=++2AI5WO19$3zNP`3jf+rLTUQpNoDQv)8S#_|BK4Dx&VgN+O{V5MVW=m(> zZg3g#bOHl(GJZ=$U@Sz6#oO4v0kL+aSlyuaVKDrm7z7pt1YQtjJ`Cb{`59&82j@0z zoR$U)er>IfDnaF{gx*g;L8@k{+$0$)@6hbkLYsA)y_}P9%Y17X?Dk#E{l1D$P;mTW z&G9{Vhmxl(dBl?YExFf{XF5=3Gu&zzUrzzlo9S0{gxQ%yW%jCiGO%}{`8Uk>$$9+0149o*#U_Ns(6qVCDdK=>XO0Y#ZNv-E`b8qp)a5b5 z`~dYLxkMeBGG`F8-siE}0=D&SQENLEe!wDXf^BiWU}tAe7CDqjjGW7VP#_Ep(mPSk zUQP*PPrIuHl-6*l`nt;ekr+9;$Y7hO(I0Nr>(B{KDTEI63!z(6DWQXGQ8VWu z41x2W87B&>z(i4m`(5839e0}*=m9Kw+t~u@`9~sl{b^Yuw$ba5h~~m-N{BGA^^OaV zHOE#>JJy^_CZHsAGe~pYaIyIpat-MA2gfavDP}DBnI)gFJ@ZEzL#*va3p#{s1L=c8@D&L&b#JWgm_ZLn4DVOW*)j=BiH zX4>hFEebbgK@A1~h1#hM*(t~T79H!UPoN|FV+CZSG0i`q+D)q<^IX;ksFVWLcrMdy zqMC(KKdWwFA?PN0!pg)B(qL;Cs%OvxhgI0w{u-$QxHS%31;L{_y;tWX&7bz#WrO>) zVi=)!*epjQ!Ejy7>)v$}ia84oXF$J^-g7{?1N$>`AhJ2<%@C z_k~)3Vmtpx=^EHmOXMDtXVce4c)M(3K1(^i*Ez-1Qm|@P6a45*&vq(oD4aGr^Avbd z>daSu)49WJVpMb{q5k}MOszGWQ6 zjG-uV0E)6Apjbgx;VwNx@wdC%VJ1^ULmn*p9^W47b%%r4Jb5N9v*(6RsklYGwGHB&`&npoD>^+#Pha27dq1*%ptl7kQ zZPwKfw%eRxC_M?Z4VyQ-X*$P8T634esRF|B2=RiyT>_8`5cYW&TXfhDY_A1ncif$+LoYZ!Sy`5jd4WZ3~;<_dBd`<;XfeD*lgz4oolzoWob1;$jvVixV0|T`FYch z#)L7Bcp_>~#{+ zO2eDJv9*q4l{Q+AK^wzK4nS@Nwa{CiFttAOldmrf$eSrLl>AU{+MmIu9yDMz;%VARBTl*A)+u9Aq;j1g|4+@ zF2|ukzyXV19#oA zqGEK`l*j~(F-GZf2<~fqQSdUmJeTQxI`htRnWg{0-fF+IQDoS%cVo?B70>+m5Xm5LKc6OuJAkH`rsDcDYROhk4x@WA)Oyak}@YdfFOj*T?#m_~e{nz4v|Q4S_P@sExvmg{l96`;7z}e2ZNg-Tx@9L*%V*ETT)}V zHd*Wf<-(XXvDe=CbC_o;_wcpwiF;F{O>cge{7T}!%WpX3H7qg~TWAZ|3e3TN))Vj> zNKhWQXcdFnCh04x&Dsx~y&P*r9)LSrg{TNHCybfa379W1M)EL=3IHYx+~o>X zb`Ae)+5(jMmdZdSW0JnX!7)kuiceymaC@W16}3g|B<3!^b#IVF+19-ke8dK^A<q1QpN-NP6#UB(0s4%yX=BH{bNxz0Baq zAHWeF5CMU1Ss4nH8?4I;bX>I;XxE^Y%_(qn_H7qV^oY!HwGuQeESc%63{NFvz}U5B zJT9;P5URlA1PEXn6rjjWEOasf{cKp7uQGo$CF_-vri>;T@Pq5#dmaRPBr&5Wo zhh=Vu?p(sy%gm^9se_deI<5A(@XPi^w>AtSK)W zV+%2$Io@;Ii?-apT+MP>zCHg;{^k6o`AhOM^Ovb_ii!2FaKP`v{5$#c^Kaz;p1(3b zGq*9ip3@Fee0Ty%PWy-+rxQp;ZXP~jBK`;J*-qL$&qi&c#oNL5=-%ee#s1Ks`!08+(ZQciLb1 zJxZf%6|{YKOm5(RjDu8nZ`?O&-nJUz_&hj;`_!&rUsHE}!2Nf-eybic4<1qj81kR^ zf}eH#**E1x0Kf!)Jx(3l4L}||q@M4M@zvcG52PDV28i=9iAU7kwLH0O@4;Z|7cgqF z5&=OwsttDIuN#ALr2AmR8>7>64vYizzzSz@sEmKmbf;N0Yt!UFx(<;$!pP0_35%EU zi5a_i)U0Kyx-*?rN80jmGfPPxcOWogH{14~3f&EA*)RYelPP2n&@93wo7nUCiC{dU zmqaB)B6lH6P3FPrN!$Tcf%)$bK}>^JoGmeZ zCmrV0iGO9!TI#$m4;zlPiL+^Vc_n znV*6@u0yYDba~uK&J}cF)YcI<+zOaI4e6yo2e+wBedD?#XqZjFvK14d=xgC{0$${O z8j!v$)wkUkVR%(Fc4uxz43AR8JOdtx9UPu!xb8;aw#wpbEaE@Ntsl{lAEFmn#7uI4 z%lh8jo->t<;890AfNzU53%xJR+Z71_`8MjwFA0C?ydxQuQX={piH zo6rcYdniNu4_|}aEilW#^JEgadD1K^(aU=h_4vRcG!7KPs_e>qBL$zLQLd|zQS$o2 zY~rfRXq4{Q_LR&BhDkN8219BvgP8avvIKv<0Ze&5gmJgQAn&q?gFKA~}N! z>fq(C$_Hi7026r4uNO1MrK%bB)F!8;s^$#>y}k3CnW@a<*mtGC2#s&`GIqz3oohEi zuKcU+$0YuE*8LdIAIm*pmlpB&e&cTg`CCu^*3(d$@m5G=rlr6{9#~D3GCi=A(}Aq; z0}?w#Hr$M5TVjrl$5GQ%WZIb^0rF>j&}*?nhOt9%xeMjxM(b!c&E%~WFO&acf=^E@ z3oFc@zd1PUbZ~O}7$=S3B6@$o@T2fP6wuoO*g&_bwz+dH3BDS+hwI|k(ZtiKS-LrG;>45Swd}Zg_J@CXO44rFvhS{Oipjo)73EFn^meRHz zr71Jpy|xh_4rmJk+FyVuBZqX?(#Jd3Cef=; zhuFO_C5GKcE*TZOjqy47V;8Zb zIwuY&!n-V>3;~@eKxkvO7K$^A;B66yx7X;1RTJJ=huGCc41IWWQD_X^=prwf0)~P$ z6~Unh%fwK!H`x!>*g3CS$gFdi$yspTeH@0{L8aD$D2L3C} zDq2|~ZMH@JiyK(iY_4Pc$vYIU*%ep@v$iqzq{zu)Ka%5t)4?t$gD-D7zC`@U zhVw5kaWDdl1IU}A`4=q?zp0ez*H7w$kqlIH91FE=i=o}{V`_FEXhS2-``9E$@fUCguXDMLb**0gz@BC6%|a@;9zQ5l11NiAUr{Ouk+<`D3Y<$d_SwztRRpP%XqMJNS)ODH-I`GOrq(MYlZf2yX& zo3Uzu3jT@C8Ld<5*F2)YFfE1QkR4$9adLMrA-A=FT=4O9xRlpH?k*fud9d-}HK-I7 zM&vea8YB0M=NFL+bt*^h`N$XSGm8S`QcG%&{G28L$!)rz;8LDm;WUBcPbGXCL5snu z$J{M(W~eaHir}fO2*Gg*{(1z}?pj+3POU_z(<6~hBP#C_{P;ugr8uCDkpSf` zV$-=*pBjW}OU7HWQ#0J)KhgTdn}^tXDUDa~%$3sqeFksUf~KdX&=a|U4kbNpJRZ-q z$4Pi>w#QBIcnAfJw$0kTw2K1IJu%LmDdf(*_zT+M%`=5#0Prh0oY3=+{F>l`OMn&+| zEn-Sk(pT~XN5}{J9SffE)a7FN&NP0ZQpVbdmm0|Y7SAvCUiRu-dp6?PrFhr5b}u}A zLr=xMm#4S{7CHnkqW@LKbS&#kN$VNJBL$c#yq%JvgR8qf&&%vzAVx-0g zZR80Kii5j!bZ{pS+#Ui~*3NrA5$6jI#Ha|WbbiiAd|5gjd|6fG;)?A3E5;x2bOw9T z{DbxmAfMvO%&M(>tFpS_L)ve)8saO$OG5otnS!`jvc z^{(ns3tv~W5vk!H)Z$AAl|-Mz52M9LuKzqD{+(<0M3WIA|C7oX^3|gw|M$~@{B7-C zz73sg&yAWNvEtKlXs;uC=m<(#@f4vQ8;5o{pjGC7UWPHRV1Me!jL97i#+3G-6@T4M zmW~pC70OdOdh3`NOWryyMnq|A^)x;Qy;y^4@=SYqY6uzfUiq`Qj(!Bl1Q%kGhqR<9 z-xAy1jo$nh2=reb|iTI#W5Wi zS!#Q~Hk#Bv)(A?sk5OuBT}1D9NkG@C5$Ww*yIYYCKEG~H++ul!MbO8d8WUeBHGAQ6 z@SBTb)Nts!ybkV6Ohz=$a}NVGX;4#y|G%MsABqz&rzJ)}ss5dZ&%t;RK-^07?E@UpD}G1{^Y34T#C=ZJy?Y~f-&FG9cL!y2P%SZa#7ic#@u`e zn0Y{oAfI0oI2AV06lCoB6{|S z)3fO0QRQJh{BSReuol zaP4-aZ@*d_qo?J>QR$hA&%wg;N2KS7QhILUsPBmWAbsEmAfH0}`P-TpJ?$rqO3(55 z9K3Mei1h4tLy3Iu<*@FE^t4a=0O%?7Z`;M`sTrM~wa0^=i6hf<|Fv;?@$Q&{JqX$Gj7hPZ|i1Vm~{Qo@wWfD4(aVDWPZkQRx}_#0O5#HE+l0sc0URo|ldT zJu}W3k)Dl8={c6o`-t+XC_@jsXEi9LLE0KFpekJPR@C0!LWa#=)yV<~Av)N_!>%M- zN{E-J{T^+dV9##uTO_t>P7?}YC@`DY3KU6zoRyf1+?=rGIpx1$4#UOVx;EI9XUsKIdX zDJFd&=h0)J8_oEY`x!dq!ABbKbUeG}k-W0u{O1qJ;qvpJZh0zah`daueH0#lH`Fon zZ)BNclAACoH{lc(>17w*PmXZq(D-R~2nMFdn%I}eIxg@r z8T>5wq-jm;7*j3N7-j=f9V}480#vPoTt+RGlxhX%eauK`VD5CtL@dV@HboPZ z=rL6UcU-DDoip}>B=?U7St5C=Kdxo%1y>lj38W4uNopE(R(OInj(I@yw!rAIIXlu5 ze6jiW;%JKWU;*cvb=bmpt01^-PVG=lt(v}`Z$WT|S;1uHx7EM(q!AW(66!?O%6y9! zP(Ky!J+ljgWL&&9A!bn8devXssT!HVb4yf!Tl5h$gcb|{;X;Ew^Sj4slOVcPynuS2 zKlpUJc$)k;czTENG~#DuAFD>T4{YgK1RQ{bQ)f`mZROB(ZeVoZ3g?@_GN0S6D3Dhn zx zu)Ax@cefi)Q^e%?!{RQOb7bxb<&r*se-K z#Xm&Uj!N1@pkv_d<>afD8_&g(&iu=JKeYFg*pALYyZp1nz`FstcDCc$#1FOw@x9}) z#NPS)WN_F5!=;)|1HKp^$>AV>HAPG~uqmow??l&rJfSbaKk6a;g!izKKY)L|@=A=) zq+@fZeTPb9b(y|H(GY2&vj!a@{1cD03#sA$fPyp`DEMl@O13~KVyvSP)l}UD?9aoy zlw0b~>Dexr@+V4yk5C}b z;jdw#0pF+K#VC+gcehL0R@SjGyYd3r*=u`(tX&HRa3cCpa>(p$6?=WNSJ9breU`ij z?9IH0QQHEOUV-l-xCI1*=glG-0g4%_S3%##x+5yIb@o%N0Y|TaL>xKXHx5Fvc7vN` zdIZ+lwfET2=s~^*dlI?rRNO9}LGg)`scP+HXorvP;OSuVccKV%zR#VZ0bnu<027Y7 z1S(6gI?a$5H#JsDL8K}`&mE!^!$JUb$=RC5Qt=C zypxz5TW2pPx0mHUQ;7p1K7~K5x|5hu%n+`q1Fe1sDE(H&F_D)}zN1Gy)U3pG5iX;+_ntYBtv1sA?j{ilN@`h(Dikby?Z;Xmw%LeL?01R+L6X zne52C;%RHSTKp-La4{l@+@FXl=!Taa1LJWAsdy#8f;W>XZ(*XsP%$yJut~knML3jr zd!ClU)&!e}-DAkInUt|OsS<*fjP!4S6;ZZylBPSp9tZ|@9v$D63Z9u~iwdoQDql%{ z%lsDkRDS#1rrh84;r!0Q?DJ&wS6OnoB{M8J*OE_J^31Mmf3eRi-u^1S{hqmkPGQRq z5L{kI)t!k~{Uu%cb1U-+&darQc zlRme0W90Ph(y7z!W(*J51yt=?hngW0>#&(8>L5>QQN{bXijVUZAL%Pz^3e%~dp5Dh zn$7VD5`s65D6D1D>u(eNRev`0xz1AP{|T>!{$}qw^dEX8hCUV*O=@^Ij{dDhfL(0X zT8uuNiTIZIEGtf2&WaI%T<9vEbegaDYwx&Rg9)U5kMmwd-x0P z;!ESP`0VIJwJQF{%T}>FC!=@L7+>-5PmOQEGY`io#x}S~r%)|>K>=D%fPXNZOhG03 z5KTLSh#A{gGY z0&NBD!3_vxvIky|kKD9%6k=!WPs$$nS@&WpUfB61*#kfPmSy@d-))VS82SGGroEfY zcl`*2@a}JT7gX>?rM-BMFJ3zyFK*XH%mZ)dix>G~N4y9Ye-uv#7q8xb%$OE6@3I1+TvqlHt)S*>5VgJoqbLy!`jOen0y6AHEQN zADv$}Js4(m7`f2DkX6q-5oQ~mU&lTaW_0jI&;ROU#rdOnkn#7~Me(-n|Wn@ z@3ZDA92gp_d3a~ke3P%)(*LXV{}=96h}GZvzg_=vpDCz+c&Gnm`uD>A+c^FI+x1_9 z{VB2fhj;wnrXTla#p-WeZ~YfT|5NO1)-dp@p)ohm=~4IVy!q8zKym#y{Gpk!Jh^3z zAP&L=%}8CYGYWGdYXdQ=L0>VoEVvjLX^C!V6b1HBb;BA~-nFWYIJFX|R&)eA@lq&t z_?|DoHq-Xu3N%gy=U|5-rip8YZ`qB&hFOfCe21kG9q?^r&=|>JA7{q*9@f}QjoXc@ zv+7t6qKq_#8MML0b)?(lufaBTt;q|ksWQL6uLitx9t-_wR+EUT!FFHQ^#WfoXuZ5` zS)TtogXR>tllLPP<@^Q5D*!QE%h7i#I_1w_@mc59MK}+7!La zCK>#=ib_J~3112d*|En5p$zu00|vxw-)`{e8(`0b;LaU@8OJL!SuB>%Og-QV+y}EW zy=sB{uKXPE10XJ-g6yKTfUFM+VwxhBB!hkC$MgwG!W=PuvRu?iUUP`?@^>w}FxJO3 z@l1h%b<2V&M3BcT72s2K!;dKYg7K7a7zJcH&ImUSc>o7!RQT5M1#cTL!b)Yr-qQk7 zqy%c2gi&?yD5k7A*yh!#j@eNY4sx}Yi#zuTN}Il0NkJMEV1wf7{A0m!+k=Wvj4*z} z_VRu3SDa%66MX(31)Ot?1|JK=@!hW!hy!X7=kI@SSDwFaeJu3Gk5|R{D+7fFj(6-! z+lDtnSz?9i;sM*LJNpLC) zhsszY!3mh8cM>d-(X07ab5}z=x^z1D_O{^3sOw{|ycD{Js%F5tU=L6Rv)6MdoHSS= zUT}T^273_k(t#VX!7duDKSnC3?=s7k2?+5t6$ow^CvgNjt(K`yAXYpyl%@)*54hqM znrha0+yeW!@}lziwF(tO>#ztd$O^K6JPL-l`8`cH0%0_ogG~kheLYbPal7F);daS3 z!0oCyZeJm8H;1i3u|K&E_yIO!Iq(niHU3=|Dw$?huvbY{%h>@#H&7Vo9ltk+NVdr9 z1;gMcMeWDsL3S85{`OU2{HqTEW9~X7H!;0&z!lxVSd$Lr{PVwMpU=L%A@(`;OQYH6 z6yjON|NZCL=Y^R1-Z1+dvo&}!x_!P6c?J6vI!GwgsO{C*w+f_M1gM8A{5l8%zi zKZmG*UJ`TGX$+%2jW_%am%~xR2-vLgSj%T01-0&414)CIgdJ?riTn1QtkTVb(yFBh&2c4%+}BIz}4|X z#8|r~H^xc1mH7{a)hW(mW98k8rv?QOzzlB8lF8hM=x6#8JH9L;He*tTh+zEj9QG{n z=h^PsfMYp2U-I){8m3t0W3Y`=EOVJ=UCPxv_|1P31E#h486(02NF!mS;;*1N&2;_{ zOMh(#^K(W;DP~lZ()oimDTKoi$7!JChepYKQPOY6yP;S!v&XPtJsG~k(7C=Lk5EEY zOZ47hK6^O{(xFp84zr#5hzmiOYO>|3jU~uR3E+}A0j6MS7899cw4C7(33miwA927W zSJF$i6|k%rFV7MhnOK2SCA-#af)go!5^=jlSR1!9y_i~DiD5PB3V7S?j;xewYxuNZ zr^oP1t1DN}6be&M^6aJ0)NeOjB6GVkGn2!cneC;|gmd5o3DXbCTu6-D&k6ghqoxqQ z5!kdQVLXQ-cSf}-`0BPZBW>XbijN56Cmsgqs zh}T+I^~>Rnaj-a!&Y_hAQ3jzQzK8Wty4#M3&<;fitzaompI6|pzjZ~$ zM$p`C46h=|4H8lryq562!)xcF3cS`OayN4LJjSR+EG4`uXy$Qc?RE~#IaD-d@SU80 zo`oqMp6Xf1uLUFEH4wvV*MbVbZD$Qw9V90c32=UdSH-`|<3*c+93{`GOM%z#AyMG9 zNg-ZyN5HEmhS%OB;`PZQygFleRg}l8gkJ|4UIqN(Tz!cUHCSYt)i5GP_hX_mk{}nL znE0@NzM#yA;-jF7#fN1R<lOaTi)6MeHfbkj5MgR zat-0MI{iif$w|%Q5&MkK^lgjmm#@uCeHz)nt?W$`*1|<4Gvm zpLRw6fuhwVMS-L%I#~lFR_nWV?#^~rbn|ynw5FseqO&r!zGt=a+(oQ8nD8Eorb>!} zz%oVuX+^*0ivANt>q?5I%NG3?iy{VOmH$Gy`jT>rkHp?Mp*mowGQSPVZN3iW8lrMu z=D{XMNMXlX^4{V4^_C^CTJnk|!#fJgeMpK*PJyr_>nHv*lr%J*1Jnt!AjI;1qN zk7Z=!^%0VBMWq=fMT=$Rl`$$OwNSayWaKpw%S^Clr zOV{pDO3QCH1}z^aE&LbJlkKjpV`QcN<%J0S(7$YfM`Hi7nQ7LgXpP$OoBv$6%?QFh z_C$}0jC>cS7jmrsdrXd!R5kgJ&bY0-X1ixW7$qaaKyiEH55C6U3*v$jbD841eoMF? zWkXp8wM?JGeD-n@q-I4n$B|j|-Hb|GW97&g0C5>`L@6p$G?h(U{0fd{1}Xfcun0&d zgXA@~yhJ8kO)7?19K}{Lb&J|~bnhm8la9X6EvLmsn&06wnz7zPv80xyu$FGUaeX7u zQwNOkpMrpT|C~*1zjJIo)7GlS_bvOaQ-*3&$nVw_`l+B`!gDKSO!Z_vtjFIShS3FA zOIZ%$9$Qt?@2>uGd`EGULm`KQIa~m{3)RUffQtdfy5T7};(qmQwW<}*+l;DP6hfLDe$81sXDlK`Qu`)G$F;oD{$EL%RvL}gez1#nHDkziqszG2|V(t zfXs;z-Z=ayN`N~&0{*egJI~5Z?YJ~E<_WT{B15IT5$>8JmkY4Jqm(^uarW?Ir>s3x@El8;xyUfOZkTg)Ga`xm&c1kTtT zj^DRnY0O=@$3>(SVNW|!ANJU0A~vVsxLjGUozY$qyvI{sAsy$5)kl>sqT%e2u8Mc@ zMm6K2B55phQLmT_Xd^MKuNYR)Foj@frC7{&!kqxDCczz<;`7Hipt` zG=@wa@H9U;&32v+%n-Zd%3h;v-s-e)SDbg=9z~$e=JLtRRPa+SEd(3t9gX2Cb?iu~ z%%^Dlsv0EAQbC`vo4uUKqM>sZ-HX=ugd4{&v5Ma8@~fw~|X>x?7!(h1s3d16|&(139%fY8zChD}SQf)P9p0 zqiZ&XnVlB}xyBH8#H{A4ktmm~f$}BH1j+}MdK2^4h?p7@h+0^>Eh)BpKXnD}2A)ka zvx%E<8c7DiV&?g(+3$XEcYshXkquBd@|me%-(QyeE=>h;XcMQui z1n^Va%ieRy52#+x0maA>GNN=0IAk~us|;}hCa`mQ@4uqy9~u8{cZal(k=$KM*qqx2 zT?w!2{O~WR8CRSWYDJ_@kvq3m+h44B92mpPNdLM-MR#&V3oNwIJc2)b1Pi!c3|2C^ zEnlB|8J+;+;vdbw7c9rS+$9+68?F4~`^$%Syf?Hiw@l053*+fb7*BVY3o+YTXp;bN zA+$SJK^rvye!BrI4gEIx*vb#!Y%^vW#$21oolE`Ij>Va7YnhK<+-MPG6Wssj0=Eu@ z7PGu{0vw#XZ6~8Tc%I7V`}qSOJvek{FDLfPhy~^yr-yY*sR6+p5$evlgKXf-+zf}Z z00$Y9H7r(RzT5VaMN~p9y)WwzCyN$H&3qSt?G9RwMD7&eBX0}I<7J2ugA&J8xsPmj z7^k$s$bR&^58|EmB!eSxi!W8!wSquZ)&~v^uxeOS8^d?(hU>r6h3{DE{t&)V%eW(s zw6-yr<^D{NV6Nf#>b@zbsl?}N<~&(7hkJ!s;t;GKVtsIo{OMvPM7I?{9r9JAOaH0o zY~t!K#G?H@gpw-*BW4*oJ?57Q(m~WP?oS2VJ!a9qa|>~~YtLNp0@je)$}cQEf1E$| zfzsxF&e8X-HIURj58!}6Sv1BJ2lt{TtwKH_cD3f7+AnC?sQo*Yl+l>cLq1hQG ziQMJtY2@BAh9`i)Q6a-u6fr#5zQnYY1&kPC)&gFC1OxB6Z{bg{@*Vi6&lLM7?a%oV zixu2Q#Bh~>9nz)GXA3{3$lhLku}589#s@*`vgKBR&M2P;y-27X9W z@l_A(tVelffQ4Nc_zgZxl(E{nFdklG@z__W=%b#0KqU|%!p2#nYwxfX_D0=+U9gAu zq$}JWULv2O8Ows&#ZyE~`xjCM+!1OpoZ^Px{rIq-mabhY>B}ogTcJHsI5J;EF0LJ5 z3U+~KXMksR3yKk_!}jnV2DYwu%5LD%5U}CA>D=dP!&fS>hmXZ8y@H z!(MES6Aj0!4X-Q(yPZjydTd*3clUYq@B>g@=rIIQPHrniP~GGrErC{cuh4cg5nMJ`v^M=tQOT46Z<}kZ<+-t!DxYdMIHi7 zqT9R-c&E2KZvo?uOELa?H}bQ-Fn0}eOG8j!k5%XEORGz6nJJXuwCBPw#l@KrhI~IH zi2gbA16;$nc};n3gPZ2@uq-M3<2yDdqJ&mg~?1-9x%nA zfcQOoIoXeU$N-dl;iBX{G2r^_y&7vH03fylh~Oox(ahhSyN8h%AW0yK1-olIi5kPfMDDKu9AjA` z_h0;m{3V3^T_=NpkhYs+gv=*mAtA^7I7Y}~|j5z;ucL4=$H5J8OyiP=%H z$cgSCIRX_~BF>;=gGNefuG9^b>!6c2KpDbIXo;Ot_uwNf6m1L9 z2KWUItmQyk?bP0KLS|GEzJp~2NKs7BtNn8}k+?F}+1br;o8JkaWf)Qkh9XY1I>J!#ec5cXhNSMXS>iKqnF9SUlI|pYK@Q z$$Vn*^LUC_%=aOSTe-N4`(3+h+oQ)$jvs*W{7Qm42tbtzC>Udv_#EiNt3=|SM|@|u zJM17PgHz5fp0Vn5xb`pwe^mjxyhmX~W&RJ<=dIz{Z(9jhOj)r9n@yY<11~l}5Xs=3 zvx>pDJMbOF;8T5*rW*JR2(=kPivRSy(m!Vt*L)_XHg!&I z_?>FQG9*hdiqvN9y~S!%&D`K}jndK8Cb)GAbeh>!3Fh+Y6}XdJz4Ixq1?w72(Zk73 zh?tmk%Qay;Z+&@&oLr%N9rO9XX9@E2!*%#@H6N~4Pf%BHa>$+bpcr5`))t z`1`n(BqZh3rKbiDrh+t^@v3T&Sxj{g~K@q<-E4t`~R zf(>EhW??auhoIYTn^ov`@)CgO8c);LR_3n_f8$QNB>+^Bd1}~}nLnA?afoCrQYkll zJZFfbZ7ejv*Z4fF&#uqLwMp(1vZzhM@0HB5PM`RSNb2gj{5u5Xb19aL<$57k?_8j< zXr5z{3qmk_yb}24{y`0Y1Aoj!*`O#&YgY3j zxp-`KCW}A8JzH|*_@YRqKuI8Y=&lhSgl2G|t#T-6Uz}sfIFTfBhvALzQS-(3p>Lgw z`kZeah#nV3kAp-A>cWiVYZ|4^%?dv1_w`v0xLuV<{O$?wX5nj8n0=v3&NM$5^@UOn z?K-CLN2&mB_RwnF6aO9OW)Z?(DzxE#&CS03Km=YKQCDm38O7kM9r&7J@TtDUliwEj zI!4F|58k<1XOdlmX|uCzqTAIN>{e0<2PGL}@!rh>8tVHJ7g;3@tb}7r^xQ`^n4%an z&6hXRv%;6RAO*Yh-0GjRiG|;Z`SJs$0vHWu8Sso{c<&nXo9V)#BLv_z#(VstaJ zZVjZH9t#rm*h97){k1hJk(l&&q-a83iuS|PiWM#G5X?9oXeL@tk3ajZNRMy!IzT-J z`;<>w(Oug{`9TNTkphgKJN$EB;+MChKa!pF{6h?cC%RD{9OHQmRfGN?!xA+gmTt^5 zSkMW=%JeO+B^-@_Q!VN^!d4%A`;L|Ca=f3Oa(;OtvH!}@<7d+Qe0HtCfEIK z*TSxp)U4$wjG^V+fJl)1tRGs#ctDDBVSFMJLFz=ZTAV@H?@S}6pd3Bby+nt%>niR>-1TY2+AL)6~8-lZ7@qpT*p`0#6Asn zOb~PF6;+QvL=al&VBlZea_6k6UaB2h(~qkoYbxx=uO{XIqqkh{3vZ0&zPDKif9f&} z*i9#oH95Q=pLW4ya5OpmoLgnHhRoYV;S^m~29v`{rXaCJDLj-?teVkxj5|uk=yNFr zua)9pJNJITyFE5P#zS@aFKeCrjcnhSG-2Z zG28;B$}26sd$LUz8#Gr6US2h$l`&qzb2y%g*V)9l{nn=~Ki`5*YZhCEd$cMLM_4Bw zy;c2hu0GE$t}W7`^Wgg#e?WN;;_MKP0{+TG2pY!U%V7xw23CUBHMZ}Ob@^vZanAL`XJGV=4nkjC2~iTevlq_D20CChoZq<=fu20is~>-z2txnQs+>H_zLj! z2~y@K%x&cNn1GxGqvCZg43TpYIF$vsl>!TKIFYVE>c9^=@Scq34#|xfsZuIH#>hw` zX944ioCPZM&IX<%(}#eaT^R1i#vQzkwydRr^r=N&i^z`kYWtlc`3IKYh zzUeuen6YmxNZLuphYp&w3|lsp;x1mM5E6p#Fi1)+8ZAfy5w4rbdlh%W?W({A4E2hT zZYBHRJiKU)$K_R-xyrXA{9>lSVd^<<5LJ#TT`cI_ZCEj#8(>t%DWu%#{KN1q_a#np z=KhL5FXK<}*c1&;@4uyz;pZ?$ePOO(j5;iW7x;I8bV(MIG4@SCEa zn}RGziFK*S3D+q_%f?w?C^;;`jZlGcoX^8MP$(7(9N*z*GrzX*Ycut$GQTUI@j@%; z{1ly^xGGvQ=TMM3))5+)Hp3deO#HHmw{LZg24bdUHB|)<)qDsh+*)SIDyL0>O-Hl< z&@711*r;!3F<5iL3&V+pgh;`1A`cb@$F_?`to%t6TY<`ZbJGrDdxQI{BQIVg) zpWvp=rKnq3Qfo?dGY3QorZ!*ZZ6TOXCoD?SU16iDBNta zr3=k`C-niJ8p&e=@z4 zp9CobL30YW;XIyzjJl5&^Igy6uX z^7v@1;a2Z?oV{+zR6!pj2(;v_d{<*W7IMz;9lZT4#&IslXtfJ*ZqK3xMU#F95MV2( zdDi#S76@}h=n9GYNLJVKb}dDxhbnF9dq^o!zw}gUsB7u#*jw8HxDe-hv^m=n88qi{ z{zTBx$Zq!T(7OCf!2~3^quAEIG=wLfhwE*dX_3Cx8UMk%83=j6|8@tT*gNjFx)l8K zEgi5u@iAj`H4%hV$YXG}t&q{p{Ggx?5^#ZDJ>Q}2WT1z4kdFdFw!wIpjy14peuu1l ze2G3cnFX@j!PE{hmFz2JstEyTPQ!p-oT;n=GA9Cd|4|>sZQO;ZW7J301b3|kYhMoL zJ`RT7UC7XgpV`LRz!rOaj!ebjG{m)cp~e4L>_MCy{3ZN^5VQlSf7j_B#TSbUGtdjJ zG943~^k9tLP-LE^0KP$RZc@r`KmdJpqz_z<$J8AR16c(}kWJ+nd_xj#>>0JMM;wa9 zBXJ0S)I2DFjzpYZgP#%#qt{ZQEMjg@6uhFfcuvzBY>z}Mk%so@eiy%%efuv+Iz?;Q zRXbL7NXV|%VDmMQ(Tl;VMwJ#C0SfA9BUXhnPC82jij`eLejh z=yN=#gm9d};595kUc|pq@4{JxxZh@qFHVCGT9Jn?rg(<_F;mbi(fK<^VwlB4Ot*H2 zoc<>!0EtvJYX^&og57d49f2l)w^B}+KFuDF{s9yV$KOr8@46G%kEyzIX6^KJ&%U^Q zWES#al`uE1OvjA)4Ly-ub_lITxEABsyE5o_8=`sMJVEy37i8(u_r=hO2I`!buF+_9 za8Z`MF%DS+HD{;UW*n@tf*fhdeU^?b`3PjZv&pzXzVprg+Suoxy($pv7S;|kg?yPh z`6j6W;NBX%D%DdCFl2hcyYxE!AVi(BnL$pWM+JU zRyYf{H$I2!Js{^?<#a1@)ZG9l{A-`B-z{h8cFQLnowJvdY#5<>F7mw?OUEmA|FGa| ztQ@Wy#M|us*i7H)SP1qkHlT7f)YbDbKGZj978BqiPQlWv#j)Z_%%u=CmVaKF)Dlqa z!dyWDFg`q_6oXYr+0iV(L>J1S+C=Vjz;>Knz!EXRga+qXT{yrX!>J~*&>ye%Zm0mP zZVzqF;6{T8^Brabu0H*aSgoHxSD)9*1-4Oh9?E2!YGG91g$);Th+Pao|C$VF${sf6 z$f>KZ+k>Xnh!Y@cr#JRY+?o!Y{Axlq#xKi`LD+|(;@}%{&dj7Kh)#uQjIRz%889BI4`=M@K;P7)IolN@D?F0^;b*y6$k~##c^zQWqVv%nE-SB zXi>~rWsD|oLCOq`oU1}?Eudgft77l7{)TH%NO@CmRLx#KfYzTdpwrOzi*FA|39=xQ?z5uAa`1iL7uV{T6Z%IvOwQl ze{nV9pY`__oxyiTyh8L7brXa8?lm=1ID`BH~5Q8%#w9{ZE<&`>Wke#)23Et);2eRmKK~= zG!D_vgk)o1;+?BGQ88`8;lS<~j+5+*b&2e>Wa6EcCy)zWeRU?IPK%H)>P%+PX<3%D zP76*PSsmPoALxVRZzm_xne4~^{NqtNF$+3J>%^pU`?C{s*sq}yuew=|XoRLfKUP|N zu$%cKYm^pRP>T3q06cL@v4T?MOes?SbFbNo>rs6_-h%+E!E2Te7yONdrL$+M-^C1Q($p=Xu0`6^Oz17tCeecWEkJeTV($iM z(bxh7RvH5h;w{_C;P%7UuT8cpiz+g+ww>D4(d66g?8GCXRSzeddYc}uhHBmRd8yXJ zk!n3$MzyX)u2R(!B~Yya;^rxUYPG!*Q?1kSqd>L(deJDVb7N0)*Yr= zF@1uea`~UmxB9PYqO@v-X2%!W!W^j7AbvaD3HS*rwE!vqxz}9M;~urb03K+FIl+3{ z4t@LLvRXwj^hqo)pTQKIuczGW_{A11U{ajkkU^Pppm(g)FNm2}TSsevp42OKD^ii) z%6T|ZSI-RGDSy<(v)4YG+gJgxt5uz2$?WCikkpP;xk2GrGK;0JV!5m6S!fhvWL zm^&e6mmxc{2iQ7r;kZpJA^NvHtHE(h2?tD29Sl=znXuZ0=z-bfU8}W0&mLwPpE6cz zsu_f&9e*-P=hZedMICw%b+`9`1kh+MVEw@tTVi+W0h~L&X|C$*cgw5hg$tkb9+2jH zoFYiyzw8-1d>!jpj??;*ZM7V~sCw{4Xpx|(aI!oa9S#jG@!)VLe-{%}9^zl-7Z3*S z3{uOWbt{lcW|>T{-`7}8MuH_!4&{R3D4hr-8C`b#$e<}-jT?*YcI$EbZ7nA7Yj^kw zZ~7Pgc6b+1Oe$LS)s+SnDvjzeu%ShjkVWv?>}T9!lma1^r}@593TXDitafTqKwaWou-4mbESjDmp1m>jx%s_K>=@G_}$Z*e*s(E_}5&=!}$gI8h=`rhZ%AK zjBi%z*E)BHy9Dihfwnw%a#=cC9G$I>PAxbBpY0O7x6#ny0mplTOI(M?+e)a%86wKL}pTX0;Th8I}Es~_kg7L5c%pjTITugpJx!^^b{gP1CfgrWm%tgxiU&UN6x>!ETt8W(xjub+EKcG{HPNu4JuR`RH$^3gLv#3R=hzJFZ)DH zHG80fe&x~-uyU;!c+qSlCRS6^_ja^D^+Yel2wc~IYy4ON3Gs$&H4GGs=VkzIDGU|E9rr7S@dCOx4=!>UegMZbk!a~^^?j^2pk=AjZtI~P_>w6bni0=$}!nz$njIk21IC*NXl>!uU3 zlMXs-7h59T?KY?T{HPCQdsrX531uBu_IIXZji~YKDI2x z0S9q`Qmndn5LFX6F{t0JCUCXg7Sg@MNam?@LMqPW1KxWE<`uZk5vM#UowsTLOfwKYm{)~m3K*G@T= z$FU%)Vz%@ZR2->O*4|og#V&Ym33^Q5)OWxq^D^{aJ8Q zIR!2^P}WZW&=D52@N`Smn(33>GU7d`;mOzc`L>|mqH<8~0Ix!UT2e=f1npL*tlKEJ%wchiy7(1|K=RfDV*}%I;IULYeM*;Tw@vHo|jRHhZ?02Kv zT*FX=U^qHz0YZOxW|au7qZ{}B%R*Kc0Ko!O0_~fJums33|DaMg-U&1e9X}w&SQ!j% zCvVHI3`z^5{<5c6QQUMzrMm4MQ*ei~Lg{uh=?_wS73=mf3UDJ>JyPnvP75Qw+v@mc zS?3%$LaniZ+v0B^ruSfsy)SSLd+r(2^XBzaLGA!|>UkGTgnEwXl!T9|y0iBsRM`Cx zHVyy7)$CbPNQTCG0Kx$SBlZu`kPZMoR30<7PH|)qsM$^9W~c0beaT5|i$7xPRW%Nh zq6V26VcdjR0Z~kMLo1{WSSd0n6c@YE@AVvw=LX)PL~~gTz(-dG+fd35RdlR6blIeM zn{@^NY*;u%nbD^M)o?fW$VP1ah#~CM7X(Nn!u2B;oy~#psyUlL29Sn7rHCd5njcKp zpb9C$NTTQFQz08&8Vl6ZP&EOmp{z%`{YZf&y6=@wwh2ur%2R~cImtZk5#m_o(TVO;z zKY(6&U$!(@m6FD?+03%w!S4a9IYsT~`>$V)-_^hG`>B6=x%#uv;?TdJn*cepSD9Kb zbSEBK>Wr`rDn$p;Y^v2)*s3|N68!#aWnGi$lhb%ug1IEuEr$F}?gg&tOS{BelbT>( zb72$QO1ygEL@wJS7CgwoQa+F_q!%RMVR))m3$f?923&4FGC76bBc89&G%~Jo<`@t} zjLtKK7Qi~7Grm&v*i#`sb;033vsSNx>I2OQl?HA>oQ74l6F3xHO~~x!l+7}>uqiz7 zpA!tt(>=;J02Pmx%@Fn88f#%;GFr-PVAw9QJX>0Nh)|<}Qt`~7D* zgK9WwaK`1Ig@e~Xs)b*DOS43fVlB<1SC_OjN2Q8e8kGWRgD4%fG~xVk!&q?VPrYeAgIB?PNaIyCRPTq!NC;2n_(-a zcGIz_7IlZif~(sLhXvK>x>X4SgaFNzIlu`@7u-7h;HzBac`h2S;G%EfX-TXH6Y*2) zVShkYmae}837`%VZO_bJ+li_!PvjnCje6Df(sh~H5Ak&m77g>APFlx3Y1z|YJeMMJ z9iN%{hArC1%3>Vh+t`EKHL(CjmkN9uuK#m5iG8RAy7c4~JCc#w7|i;>gXYZA92WQE z7ly8{WE+g_M9Ut4qP)QFX9j|M%L$IT08L9pcn}E|BBz2SXO=8K&SYDF8Or8n5FW_@ z?njj1zPFZ)Pks109Qv(Q(KvM&xNlj2JFm*vg1A3)#n!}qf4Ad6j(P?>W*0ZxVwp}A zaemq3d`O7%%n)Zy?hxm3!g(g+B@Xie!G;KDZB_ox*CEOSW1^ISKzN{f2J{92n$F;< zgIs_+<;U<#nr;_!3U(?(kH0j~8S5$LNnzOw&NQ3I5`@vUyk;57-&-1wRo!r<=?fZ# z84weyv{k(d=b#25Pa(l1ejF|a<3}}qH2NPk_;Hy3k-`sLh0X?kX|4`G4)H(g@gwbj zG~kC+t(E>+s+NpYt?G+kbwo?uj?i-U!}0f|+D806qxLZTJ*W0i{GCyI2>#BjP2=w@ zQ_RMmrpaR(drq2M+1PW&GT&`I$XC`I&(@`Gvxy{3Ogs7ULpWTz6q;I@7^pSQ-AFR7+``0cpSy z6!E)+w@Xgi0N&nlU!1ppo-+z>7o1v-w?LV^J(0XUVm^5L1bHhqhWx~+&S?Bp|EPhs zP)}Q^cTG++ttu@$!$T(X#4xou6T8bW8O-FlSNMu}Q%+xNDrB$pe=yn>8Y7NHSl+NK z_~BPUYq|c>F))7^^bCMO{WV0sUdRJ-ovRnuIA_0sFe4KF*yes6cF)dms!%dY^59*;zU{$6?1X!KgWb*^3zJM4H| zp4byu&p-q}iZ2$@NJfn>EDrV~vuu}LXyJt}5hjD1+?iW0>WJUdL}!6^t0Rp0C3C!K zrGIE6K(*~-hA5?s`9U2#HHPSA6R%(IR374lvTy-E6uQkEK0s6xJUGt6fRGBleG1LM zb;%)iT}i~U$c#!+*4hlK3(vZSh^VtXphxt=ExSrPVkb%sxUBG6(tmiSUfp+`i;~J2^aURTfAGyXzo*X|o8TwLB`>3OR z)X_egy?vy`l}s-bdUJl;T*igl$wE;byqf-lSH&(Av}{ef^9SDOC#u6eQk zoOROw1O3_k{teQfImedMA7gV-aC{Y3qk8@M=A+V|>9=gS{$$GN&*vnj(e(!s2=(Wg zo6GBu+b{Yy=d8-_7ae^Df!$cw2DMRb)=16V$aZ$hz=giE?nNB@t;+R#*ihF|0a8>K zcoFCqnt5Hb0$7U7n3dfORwmPC0IZY6$?C7s5JG$k{j!_qS9D*5eU=}zq9nlbN(YUoU zG=5hh08=3Vv%Y@6n{L5kC(?`jJp$^x;N7mXj74JlzR(8l{2o|$kD`+h?(=)i2&*AY z4fI3=x!Qr0@bCe)4(*?Fng1?Yo;AMLT(ysB4^V`|N5$aOBH-zyzl10|=DAlKTyT#z z=2FO_;8!=n5`%E}W_-U`7AUjtruE`y*?4R_+1$I(#>BFgI`DI&n#4&8OG3dA+y7zj zTfpP2sK zRfiQ|AkFBTf6iq~!exZg0I6Um0a(FOq|EdL*+Mq&0~hdzmuX;sO!blu>}~27T}G6;(%~ z+L#4vwob)!F3S5UP6IvKCh?vIaAWV^%XEnU8KbqDstiBH+k4v6Wi0o0x%+ z|JWgi9`DbY1??hrr4fPS0{LX5H50DU0Lc@SQ6wj|(Md>Km+Cj5*|5?vPPu)M=|<2uW>F zy@Ocj)J-M9o?99#!R?1!(-(Rn$5u)=+G5LOPnf?4WiJW%`>}fL?^#~J!E}P5nw>aY z8h+^$jM!>Pf@bDdOjP%W@Giv9C-X_)YpsjxUR)O#HXY*nn4$nXWb}ZQ3#Ts_Jy4`< zzT&|)NW-+W>-j-TV7iT?BgQB#l5OKq1VjjsKz!uuL`xD#vXU-8g)}<4ctm;8o_+Af z=f-QXOn5W-?kaP}OD$hnu7NJK0mB({;A!ZAG3uDZ%x+N$C}20brZzQ_R#wC?G-KdD zQrG6}3m`6ll7`X3!<@Ef#h-@JJzTZ^We;Qr{{+8D#fBXy-;shp8WO35yIzf?e?Xe+ z@6>Ies*}}Fy;oOv%>hf$+91ne$4hiyQ!!7QkaBpcKp&yG1kcpS#Wj-YQm+2&;Nql1 zHbg!IQ<=)M{k&Mkvq|0R6m5z0&=)>yHm8#Zpb6?B`JsmrPQnlpKh~*{Wc}EeZ!yN_w_Dx95&s9@&_a!^iL8+=$%9gHd4Kk)($nU=3RI-X`yR`I$0V0 zU>UsHcl5w{d3zughB@mP+5Xc<)AoI<9NHSI*8Ij5!u7EiGvC((X&F3^8lFF8cvi=K zOAQ{tGjZT}7Giw_lkv=fa$M10=cMp#KxO)%^gvm`YAPReIJikL9T1ribMcrHzo$B_ z3RAh)u$|zWN@!zk9s0ni(T*1z0wOxug<%w+AdrO7-3_CiXCxSHGzc%{kcMYJDsQ{Yc zH30PJf&i+=bM;QO#971uB?}t%TrEl!Ew}!mpm|3(p!rdIRx;~vwO=E>W!B)bYZ{ecq;V682XCH2VgqYQ z#Q7rR#`S;1(bw^FK?FD!YM`!Y8wbtFT4bubczLphJaZj26CcFywWRbC_`MYecE}HA zE=XtP;$b;E(sFiG)PKDpC(CcX3cofe{EWaUYBy_qRka};{22^^$2~Isz~kF(FIRj! z4L`CQkE*rU2gRHZ7r{}5^P84zyzxi@XGdPv~#~*To)R=}l<1isxP^ z@A5A5E<1lBco%nhAs)e9i4U}_$-0>qQp-oH4y@v4g5UJG>|x%dg(cQS!x)15`Nh63B0ioZGggO*{|R11stWP( z>i<-H+!jcVR@^R+a_WVE_UnR2$>7`LogS3vS|dXLR=j(3ixj@09N>E?iX4&)AhH5J z7qs2Tochp(f_W1!>+z4&1!4FGn^Sk2r5q=;wSuS*rXwDTwvpdq;X&-`pS6_Qdt`v)#WpThQTv@37}qJ6Tmi>tXdwcdV180r^)*1Bg{)yske; zqmDgRk%k&W&WSY8co70yH-3~nHL_4t{uB|_aW16vxJfC&PiaBD`@4acE5E;HlN74l z-{lfi9TcxmoOq}l-I2Vk$I-bUrGgznAF?9g7QA!^D9h^~P!R9$G%v45Izk@cQ(Ab~ z0jbtQW;~S@NaE;^YMrb$bCjA*J3yZ%9QTnI=>Tiq_EH?+N-_ZsfQT>zyY2{j2dbA$s-A=Knqg(7tOL|CiwRWt*Sw39!-_ zm1P@#pP!vTE{@aJED(GLcv%m8Uph<;pV>v1|IXR$cTU<+n8N!r&HUg#8wS&&a)J=2 ztHKmkvp$$AIl%khhc*bN7rp7f1Exn_lfd-MWrFGUX9K2F&rfyK_$9=j_smKm(c;gC z5X(Y*-cFuW@!4Zp@c8B~t;JfLjBt0kJq2vh&Kw>$*if|IXoNc37yDj(Fp4%h3xfGe zIy6_yU!JAYdI|Em2ty!TagZFxn#n4g*onps?+EMwnG6Q5@2XC)T@No1IvzCA+lc z@i3q6*?rPPWfcU#d^Db@3{xTi0jbNUqn~7=vYK}**PD;{k|rvA!D)2*_40tPZU>AH z4uLv@U(YYkd%5z<52UT$;`8oaB*+!)AA-zAZ;Z`fz)Xi zobTMTDoA1a*{O6f6QZk5r8hi8_YH1Pi2ko#Cn1!8%pg=bkR!CPVX5TxJhSwxapuai*cYlalMDpTh^pgCiUY}tb+OjYI)Ok~cn(Xhz6GCRr|QmGh)-d2 zENqsARpBJy2D}2Qnn(M}H#!*LxDB<%cq3nn+<0>Xw|VzJHt}ffR1QLQSU4x3KoG*n z?xL07P}Qkrd$&9Tu$P8zoIBvQK!KunA5jv2l`;fi1I5rxbUhwB;XGN&f z!ye95yB2aMA>yx^*c{Ow)JhuR?6F&LiV2?h>^XTJXU6v z&wfG3*2{6X`>L=y@?l{016iyRu@&)2r$95$>oGocpcC|haaTH9#Z!3NuRmcGME%t6( zO1g6lKIbw1%zc`i+F}qE-YRD5ION-l(eTf^8o*coD5#*c#)AGea9NQCp2%fJ|=0B4h& zQ*Rfym-!(^h)SbKX@7`)#i#R@tLJbA`Z9mlYmXfX2ZtgD4m(5!xt7THWZzH&VKjR; zt-M-fYo%^fuHbeW@04=q9ub0@6G5e-8i(W5u^2)k*Giv|kMcWJiE`CBarY7!2odkp zjlcplWc~H{V3}QDqy;hIBjpGfoqGImIC%nS;3%2YJ%k5P826T;iM>WAG|rABq;|V( zrvP{g_z0)@*fex8CXM)MbL6vYrIU;pqDxnq!-G>((hTbn1z4W=&bor=7rh9PSCs!w z4>k#B)3+^OgD}cQ8eJv48q{kzZQWyU4?*SFxm1T&tv9RFwZ~6>_xQ1JKeLXZH~IYu zhvf`!SHmm1QG0_|GqtO7!Rs@uQOa$1cmgjGK_w9ZaaCqWWeh>&@OeVB!E429s=})p zCkC&WfdDV;{Rm#xpEHa85Dk-ui5gicftLx!;Z-zveG2(a7GBjy65w@Lo#1tT3SL1S z@!Kx|U(=|8PQISuvm|c>e-mwq42Brb6Jc_UgRTUr6lSwZn0sT&*IQi3``wEt=o~uj1vj7 zj`62gOq$F0M4^KeRSu9U6qM%eyLSkn0jE*ZBiR7z_TMRjJ}1O`Gb|9HFa*oxtN>{! zt7W9rWFUk|0D?wSi@A)A5Yq7aJA8w zer%2my)NKXdLeR7nuEtxmx1mI8l_ljv3$ws+vQE@FBKn;|p!%$_`;vfX3E$ zTDLW<(Zp_B_~VJiY5I;%I}X5oXJ%4Skw0HgSY+lCo~U$!Dc3SOgN;?9R@p!JdJgzx z1+m&FR@)v;AiJj^+kgrD`*u+xcsMW66FZ>L3_c;zH^-#T3V2|CY@=fLs*NNQ_R%Kt z^S^JBFqTYu?tfH)HNgnu++WTz<^qb9f^&j`S9j#fOUXis((E(o!_QHhRDpTeIFGsf zb2cRAF>ln6aI(D`v$HFhU3|MSE1;mGsRmA_fj}`hRh{wAM^_&UjW!`D+G@t6`JtAX zGWy)G`QhGf?$RP80L6aow}}>0>$@Eg8Wf&Ym|18_VQBv$SCasX;rnz^&@Fg|)xlz$ zw5F}VR1nQL-?S&D8e<9oQ^kZc+dWi(?jLu-t9$6*yO)adN%vtK(LwKpWN%DK)+C(R z3xLvT{{CEMVO?u1v@f+M0O9W^AQ-ovJk1L3gu$`Wa6(uGkAH=T$(aV&!HOGnO4mHG zV9Xb{aQo+9JIlEK!V55_{$X4V;=@_&8X?E}@fi7P_-r%2umBlO?gnS+PX;AZ&#3YHUFzG5C`vgT-$}K)Hq+?+jx#As} zoXsmR@ZCdolt(LlM?QMx+^Y%wnwU1aGP(?`qpLt~>Hf@Mg@n&v7UqmGsB0{}&k)kMxF_J`A}6hY1( zvkKaZw_4eiv4nc=60y}9P-Bl3w3nA7HjUpI{RwA3$Cs3!h4p0&C=1+ZZAn?#mG6e7 zp6t&EC-$lREe-4?oUi!sBNVY)VuLKPHr`NBIMLfO^g<#93?!Vkj$7?e3MpwjBaZla z0z;2e%)JS^qS3&G+BwE()lnGGTd13g(Ocgg<2^b>2#8cduggqc`7p^o1_-ttA7 ze#}5H{cEN$eZVGRCJG~{V)|`n`cHJdIMd&MbDI9#i>QNO{^&7n&doCC=w`j46U#GX z0^$@%Aoc-%hq#yM8bXQZ-S8T%C`W@Nl(d*rXr+a;FqF(1KbHoCf+}(3<@QCb{>V_P zjt-CCIi3G0bihuZfRid0@lW)@KDndK-i6YG!z&9a{L!}5WA_^1Vi8Op>(gzV=TKJs z<1l50orCjNv7`3qTLxmw;%8s*u@4y%Vo$<2cKJ(^j#8F+~vSO~%K zosS`x=;|8dEewP2#8@Lo#E*c{f`=>(z1^a@gebn?-K zTU7B|mA#v}Lb28>tp&xRTbCVp%ulXtyfTt-%_Ffwu_-XT1tH7ge z#-U|~?~tHev9S`AqtJI)j$|VvuKY+Qp(E=VA05rX%eOO_aX5uN=M!*>bNr_At8LHu zo7*bNE#U=P8&e-4(p0oO`XYIQ=MMv@_erMQ89Xny`NQpoXJdJ(<($CtFvvS^5qp9h ziQLI}9^+l&dCvz}&9fFI9I35gEhZ$V_K~w2SmGFd_bWBJ+j+t0)F-TTt@?Jhx<<&Q zuPTk=qbvXh6F*8gBxXXG4asrB`VYEli7(#}(Ar zjG#G=K{A5F%?R$>J23(P(mA|=zLkIPM7ejb0n`>DfFs_uG7xow zBL67jDHoDHbe~mFuqy1Rc$WSPmCyWRlziUN7VgAd!w14h#xO}q>_h%q&)&Z@ ze|-j6<|u2)Z3}si?!VuPWDI<*1dKs5kxq<`e_Zr%e+kexu*kf31N}wbKra=6@Qd~6 z;(;7BNPbZlxFLUFPYXo6?S(zQ_O;7!6%Ll<^7Z_hJi)@JOHA; zyox{Ssc&XYy}xev9E8!ercroZYU{K}0UPk$wb{&D;H7};IeR11e4zf0$&-M7r>@KT#DPtniDIDa4 z`VYVF;9K=hFuII0$q*j z`}$rc>M_@J+)5D-v7K~GQ-+Qg?waU$iHL@X8v;1xiP#4>>c=@+IoN#k)bpm}hFHf< zRG5gsb_YoeBVdoFe8;$RGv&@l<0cuU#YLK(8ri#0R~au7Mv+UDB&U-mLLYlcMPJLxUKJ zR-h+*OU18*-|0daoPuwF!|jBL4@yF}7)o0lyv|VYN(je07OfP-AlXKJWbz9UxCxU0 zCv^dNoOiY5^O8q%x>1phLi7}+6vcv}I!!Svw&*)e(D)7^j)pbDjJ`d;pJn?a5Eq#B z{O2XDr(AOvC{W}aGh8i(_xw++NW;^CVB2tAoKqzIG%qhbzu%=IzX$q)LrbssLFj}M zg}WM8db25F*N|iolJ}6zhvtjxJ9!`B0$2;HkKyoUP^|ASP%{b#?rP-JPN!v+a-XUX zPAxn*;L{1@_k-*qp6*rV_d85fb!s$2iqQwAha_32rsyFr`F1G)kZ(Z!y)M`KWS{vEj&>XoZ4%jl2iK__?Rluul;dsunW?< ziZh#0vISHDVhhLx)IC*>{~&Yx`#%8hc)5O7dAb~bb-P?-*WNIg--L|_H<-j;lAkdk|1)?@GByrG1{lYqE3HVz@sjiXZ&E4{NjBdvP=cKjn3i+G^MGE6`r?5N8zjr< z5^#fW@|W~3?R+ctC6=WT2M{%Di&^AM33Yg_aG=BrQ=YOId&-05DdRMM>%AcDuT;9H z^!`OU-+x06V|+RC{pWuaYaz+7qxX8L#+LF@f1DvN^($UpY`*`sFIrD^v^E*m)cO9& z6sKHNUnbvwVMVMGS;UmNKJ>C4ix}@`A4)-hmee|TPn?L?$u;=t7gP?tP2npi1g@7g z&+iCnw&j33S)O0qF}TYO&hz1)nFIdisjBXBOq_=qho#tt*_eUgF2BVH0|iEG0-1z7 zznx!12kugWqr*3MX@YTgi7-fac^#fJ$>xBeu~Dwf^PgE`dHy!&KX#c(n!!9jSh8s~ zblyou=^LY?F8v>z?JF)R+NQJp6L&~7ZDC}+*?ya8diIl5H7z1lv;CNXpy{cy{Z?u^ zFrx^RXnI)?HXUQDY5MjLR%$vl9%OAyd^PO&7XddL-{5S2T}zVfKaJ1jGPC^!40YR_ zsu(uMF5i74Zho8DeiFY*aelv?cK)*D_c#84BLcoTbl4nX+U8y)SNd}0_h+#a(dUN- z!}nu%#Lf|~tFcUKnvhjs(?&K$f*+z`Hmz@ugB70*qu%ManJ&g@Jz$fh^{ph-RyD1^ z?vhkmkMuujq-fcaX_VY7rbDUWr6R5W_3lvZE^*w<=-2c49NlKunpK2b-@ld5|1hOq z&*$&7BB{5K9B8`ZAG<+Jb8g^e1M>MIc=LIjhFq|v%U$VhAuF0$#hSza$b4Q;1(b5% ztP5`I#pd%ztf}g@2)hl;=kY#&R1F^LrRVb-o$%uF`J?|RxAloQIQfi^R#r3vtxbCe z*}!Vo>!ggHty77$7YRxl)~(lFqsm@ z7V!d-j1*>2DdgC(MVRSZtMypKcrUy8UzyUMy>;-IFE*v$?oU-c=9q;2e>J6l0MC-V zn3R5}$Nue<{({f`uS@Csw@fr$JrUNDLV5wejV>r3z3C5CH7z3lcT@U5y{A&s)khN6 zy7qZ=gH!t5k4RGbJU*vV`U6i?411eh9^V-^Z=AG%pYpG9et-MRmfwHn)|9{MP>g%- z7As1}xb?2zH^4fzexK)u5KKbIn>GGPIz`dv2ajJ5cu$I7g$>B?k=Og=K+!I|J-Q+E z2ULX&KVLrQrDymJ62y-#dg&Q{2(5#VM&*7-^p89=UGH%;qu(LhpV`^+dnQxN@0l!f ze}-4ji6%tXRxLDr8Ds&*U&Dy8R$q{>967}9J%!OjV5#S)l+UHJZd1_$?A*skAn$xa z@$`qhAS$X`n5Gs~*Q4Y?1cnT3{<`DPetvSeX`@x>`67`4$R zcz}kHYz%bl0jEJxtUO2^{M)gQ$iKx8H~|@&#kJek$o$bWW{sawEX^(y`?pz9>_2`5 zV7Fie>{$Ep$6Lx=NAa>pS<@|uY&OcGC7^aZ!L$C2i|~?}2b?CvU>0K0H7)X(HOJ}l z?Hyo8cchblq@;;GDgQsuTxF-&SOgb@BbOaKEk|7Nk4zFXldWigcl%&Pn|__u!bBhd zxYjn~b%2liK!5?nqfhj3GND&xdt%pJBb}hDhYaIx4MsFPFk^uAMT|TJUMSAJ=^kHC z(A}wy2F)5jj~p~`D$vT7c=B*cRc(VKoyXf^e{J+f zDY2n^md_O8@kP(PS2~)rJ#^HTnlmK&DJ`gXfA=_71-jO(2K9f>-|cu^N>eYw-%XY1 z=gK?!g2fnktI&KnB<+(0xJ4-kvWvX(|1;NhGEra3t=;6Mx~~8D^}p-7?1`v<-*qj- zLohGKbzSvKxvmod)36OW$#u2i!TH&6UD*CwFtf(J7VR6lqoRwn`hyVut2(TQxlHk% zgW#~fR-OsmXF_s?!}`n7vVvoe(PhS~U<}V?9adrw@>e>y*1ZO)(jvGMI4iyPfv$*u zWUv$0$lQ0z&MuP^*<@EJq!a4bBM3RzNnFRh7%Zr8K3S zkvt@9Cy&mnBz>PCA9=P!ykf6%MjxsWKK&4PGp_Y?OW7b?Skk%l7cwgLX==%{T{vZ! zAMfJYOFPb*cdU#)^=`>~U|Y!h%PHrRi4P^5PQpD)xo)k2*t*uNqTwLr8kPasH7rA+ z$Ukb_U~n~xCaYphG=QL;z8b3{SuBWl^HSiB9u(qhPQ)i~>t~yPzX_WsEh)`rlhy0f zlsnN}s^9Wza5(9wvd;YdZXh$~WM1H-B5{WtkyoT}8fn)E2Oi#yf{)qvi@k2PaT3Nm z)w@v)oZ{u{SFwq(#dE93Vb+Sx#p$;IjIjtKoX|D?8SYoD-4v`67dizEEJv@rJo|=} zif4`D*`oU!#P=bLf`6{EW%%kJM^VaN2XUqL>=k1}EbR;LPJu~q!V1(vP1w*uYYLB4 zI2LWNV03_~Mz`29Vcby+197Y2Ex0A5mKA%csIT33)VFqlj;EpQ$(dcotDfk%lo1Ko z9T3A@M@k-eRc%@mMORB~)uGmm=-ERI8GJhjA5hPg`3P@#%h)J*t8f%p=5~gc_>c#A zC8J(>ipQ2ZyjiC=>-AIVTCGd@y| zz*J;{@wB{+W?UP!<1rV;wo$aVv^+F6$}Wz0Cvo^b#Wp?=93Jaq)6m5X4L_X64d-uT zH1POjw8!}&s>zjfcm~&8zTi1TwF~z{R2wR9;!|gV4#GEBA+J$quv2xE^&RD92#XxQ z1_P*MCV54*4DWwi><6mXi>5|z)}*T~rm_!_17po%$l#4Z839=Z2 znmvA&+DDq8$pqtQ@=4y#NJ+A25)&A%Q4YT=9wvEb+)Fggz3Af@X9`iP@l`=>wH%E4 zFs%lhb@~mwTP(OCI2xQs#5mv-^K^<09MP~U`rKU3>v@*Mt;{l13tX;J?HI1H^LpDm z66eL=ik~&UDLt1SBBh9|{hY0TyBp0DFA=|-gu)Fszl3;y?#bVvrVMc17w=ieh*>AH zd{4~&q|!g>=c7lOK-B!?Sj7hDSjNKn_)D~n-uHitaFK1KALh2^Wfd{kFI`47@6hXJS@`dqF1Fzwi7 zM!opeIg<+TfoPh*01-fp3Tl555w4oJC~85gooc?CTrxq%E;8&DU-w9=q0biixnk$VygqeViv6OB)_IW(tC9I!6KebX2gBj1Og#sglUdOCFzO;C*d*JH zUP#kK#D_@6!A6)R*vsd3gWo%1H5?xN9xs*IH0D+Dx{ldO7|Enp&;@m%pPLt1J`n0= zUsP#YGhUU6)J7lL#m1lKxBx|-yb)gXF1pvy7)v@tV6A{7)d+KhB-`C|za(JTyXX!J zscv8@E{t85!Zt4#b2eW}Oa1Eo% z^|2y8*G5+?PRAL_`?n%8=RQ^Og=Lt)kcd^tTZtvj1QiBZ0ScO2@mJ+nDQ)AV9^AD| ztH$W;8lbunc2$Ar)f96jp0lf%CaTFmrfh|`-Ef-s(j)lm`@?(1hW#;DM=%6e!ua!@SoAG$0;IU?7XCMO|@Tw`iQL!H6Q8ZZ_&vj*!| zW_AOI2yz+}KQstF(G{0ixkd~O{Nfjc| zVK?(z1z?cILq1i{ESu!cTG|=rdqF&0=OB1O0)%~p^ z#;p~!H0v-=87gn!Q(n?_yNw4%N!X-cKZ}R2O%yHT7FR9$LIjUXA&FW%mRdu;yNC1Q zJ$mOmezxwS;kg$LqSSzb8({CjVqgyxHJBoWs^68FHU8R4Z!-|BK*E{9FvUUylN<-& z9iGD?e61y`U{fHe;=cx>(<&(rM8{VarIa%ey}j~ov~(jVdfNokiM~t7WtceVdE(D; zF|BLOAme1;()uO5A_eAk?y+~z-4a=tLMSpTUNu=cPz!LB8HRvgJD!+%L9YDcbhY5I zOLu5p1gsWI7mji5b}iR#*G32I$vN4_(N}Jx_c6Vrpxn)aXiX7J%H`rqZPYmHr&@CM zGBNQs^><7C7=YWeaS=TY5yD9qAAGZS0lFjwgrHIfE0u1kth`sM@(?H!P8&2)A0$0w zc}sM~ZY{5vVcSG>u?{H_F$LZ4@d2KnvQf{Ze zCX@6$i;!)K9(H0?*|r}AX1!`Mq{oOG(a4W%p6*!_!bk)8uf`9JB+CX$wD7Zkj-&3W zn5z411Z|qdl`kRCJ)62sNbW~0Oj6yazr`l(QiL82w$V&AVPA2FmVb66AU9D)6Qc*_ z{P@hDt}71%@X>8=z$(sT<$d7&+;|Mz4*RYVT7fV2CTL%%MP8xZ(~MGX&&OQiaB_4i z63ig4!fWTS$+V7!o@Z!=OtVuS%6OGGRA0EijNgILCa^KtWVXQhXE&MA_a-KzM!{s* z(pdP{3-`Fms7xkvmo-OYFob z_{X+(4Kq-NK};ZY)46>mK87d)y>%}IHq>~!~YksMsOzxmSMZe4~n4U8Zppg z3kjv%v&RI*Vx?QU#E>xZ1r$=8DujLrlL<6RZ~pZrq#zZ+9Pa%24$VWQDb4w|m( ziGQN&i>sZV<_uH$$`Lgnfaf7)982pPctyU#tNZlk`H+o5L559Lf7v+bt5e+X_5Rc^zIXC_DOY>L7Q#*R`Y)TuhNXqvVb0M5_-*Mv zn5mTzmy3na{&^EO?}6qWH5WZN_oC*UW+i>a8u~+93E@Lt7Fhe|-K)Ci)UxiYz3zdv zm37Hr|GYt~TgSS;M><1Sc3@p)T{7Q4?<}jEXWbh^-8}312r!ZX4in#nRq$3TF@~fu zgUKI%&oC*K=Bar&9OM;J02W7e^}HVC%e;KKmk;xbB&!WQs!O}!Uf*h`r}}L~POF9J zUv6YgmY^x643Q@Rc!@el_FISe9Yaw$5HP6wA%DNj@^=iqsCpYRbg9az7IeMLTAR~l zVu)O&AzJwzlMr$pPH-Wi0@1RT0|rzlboC8#$XpNxqYX~7k=MSo%r~^-Q}1NQA)q?Q zG4x11R#Fr{=vVxp)(rKl_z@4K&M8`gSuum^R0A9i)73Z9(S2~vy)vr)0ohW2=W-u+ zn^$kwwa0&s3mD{g@FQ~ICy;OU`Ym3+RrPu-#k1U|h3!X?JF=KW7#=X{LUR86Rnq+n8WH z;5Rcm)kgau1L0Pu6rkKDG&ah{L^0kt|Lje+)%j%z8@zGybopxC!6x`kh^$Cv1lJ(PKMKZTU* z^YK2RWgqGDvL(coIR6-et402?S_)fg{tNlXD8HveCB`*|vQ*aL(IItX>ck@wd6*z- zcS^2MKy=%==mav)(^J5qdhW4Yl`&`2)qN`(svKap^0Ylir+p!03ZMjXo_ol)p{p5A zsfJgKY7kfcx!`3mDDKS`4|wfi)wPxc4F5QgG2Ev-vcq=1qT@Bqo|Gc6Yr;o;h5!K> zD4xJ&>em&F6;=}usJ4X7P^~~v4U2&VmLdqk;6{WY9TA49FH=W7o_8T*(|2TYqU1fG zzIs4?^-u|W^t{?ft4?v>+*z0?dkjTHYe7AUWkOdMItbUOgUjNWpORXV!wFXtSt_Y$RTwgVaj#0LNg@rVK)dWb^iUC(LNan>@TIL(t z@#~b|xc38-qta%z-Cj}@Kd2>s(654O#ZZ3!T?@-&;7RU-QsM_hXci#{91uqOyClCp zunp3}nf!EkUk&Clo+rhmW;o5sqO^f=L+Pn?^T=O@$I3_3jbI(_#HK3Tm zELGg<#qD0qDjnf7gB=aVl z&LHn*zcBbZUeS-rLEg&KaE?CRXOuuB?eRH28i)o4O3hA5<)EZ;09EBgTATz$@4v?= z=1CF3+ZPREml(!yX-%qUV6x&2XFS&D#;T50ibbOd0Tg+sb7%?=e&&Z7(jy{jC(TX{x)r=P}Qh!LcsF7HNMiDB$Zqg8bP zXZP#rsrqE$0M5DxNKq?JO$2!(wvAqiQv!V7KBG=zB-3{w3j)TBZot?Ne^(Vd9X|F> zAA2va=t|`ng_UQ<{+^4gYPy9|fTm^X&~%$iMdhHRa_CUySv%=IyDG(2=dI0oYj@sM z4vJQu;qBp%r}WYR4k$SHRb3+uC|C)pZVRb?0K{;!l>5k%O~5yN@ztN>O2qlp!1?t> zxwAuS`g0dwiwOYsKzFtVcVTDG$Sz>E#Qdo=XXmeM3>rbyCqGhE)I%DEpX-Kzmius2 zj^QlR{mgLw+*4IB|AwgR&Z5m+Qhma$Gc^EU+7hI^;n!8i*XZMG^6?dXd@9HItUNQm;m@S{0!!}DMQ zlz%zBD#beIE$_TFIB)6+ysc)BF!M3>oaT`lQft&wYt&Nf3Wxr;rR+G_u$Y=+^v>!$ z&Tt-UoX1+{QRV2}%G10>gQrxYd4%)gzQ>Us{r>NELN=2hMR9)gP0Np#sI#SJGRThx z@ZEEw<;llki3hnTiWn=3SZQfN+6b2pm)#*6SGm{q^^Ekiq*E0zEun2O)9a6?A^lp* zQ<=|q`faZbc+)b8P2?DIj;ks5Z(5wc`ixxpaUE1(MVoh#r(Q)69i4jhXSDwr6oCp1`Mzfwxd73?;c$inMu;3*`_Md8_l_GQv$EyIjKbA}` zywF}e`&xF^KW7{DiDMlaQpf{bvt1)pG&TlotC#W)+4iY~L@D>nH}O}R5l|NP!~q3+ zY0lXou2MXthH6LF^v|ikTH9xD8OL{Q&XZBq28+wt3h`y-R=AfG-HG_g$&hVpq_ce?=UFaHOc zmmhZ;!N?2kb}HypE#M@^Z-&<2*-ME*ut4QP3L#h%Ftp^u)BhdVvAX)Vo|k zBS)aGkdgJbJ_6%1fmn~Nvg>C~Ht6uVfOpC5d`|8x5mo^eGky`8{2f|RlQ5wv)`}V> z!?1dTSr@;%Y!k0FKtZ9jNwt%O0+nOsA??uK`7H_Sa9-$5)MQF4N)hd3Cl?K0m@D5< z!35k^vPIM?g8uXzI%xL}ieBEVD;5KI4diEzQaG*jQYzOD!-1?(%AIq!CF86tBB&%H z$Q4vsVwIKXJPhP1QRkx_udceoV4Q@M(1=i}DF*OWI}G^2H%ZC*3j*e1LyDO;^2zlb z3ssF8pj53@38**vrzc)_h1~zX;KNQ&kUw{582&0}YdYmcGjV2h z{Kw^b_@VLP@!|4DbVCQ?pJ>}xY6*XEo-VgNf_!E#U&&A9GYjf_?eM@nnq=1+vyP=^ zEl6f$HCVE##hCa<24`@5_>@gyBZbJHisIUO%0GP7j<-EXqhNW;=ut~ z3R7eQn6E7XSEMlSm+@H&(+LXXskerT(MjRs`Q4TSU1_=}Aca&#VXeSHae(ZsiEI_5 zX)6rjK0I2|qC+g>e@;t+W)DmMMQh?8_?Seld^4%0M3(Xo#td5BiB_?HU__8?;ZJF9 z;3ZJ&H=CY6wy0mkgkt1L(*MAk9H%CmSml+opoKsiRWN>#PqLuSryr>cG=- zkoBlE$R5C+Y1M8aD!sK~QdBzg*vhD+wjeh|8W{S3uD%+Y668Q9Z=gUGfR81r7zZX# zMWx?1)(iS=rFd*DHRzWM1#8*7YlQG$IsTXOJqYR1hqsdHT<|NH&fW3DJel_a==^)0 za?HFh(gi`@^bv~%er+z62roFY2B5h#XC~hM&u;~?#UePU_WpUBUCPrA=jgP<_dta% z;y|5th--E9&-?usRZHg_J{xN3oP*c09kTv;-?xf52(`bM+}7ya}v&Nt%Iq0CpC9)c8C zLaZ72l@L0ZJnQ_@X*JZrnp({WmfDIfTu=?ZyFj_nMrTlmD`j<<5+~?4DZ&(|bmr`Z z{k&USoPXckFAQO(LnA)$uGw`M5(wO31U4!5eF_AQtnHukrAutH_cYaA7_xEog9i2s zI<1`E=EXw%+WUT{vc8%LxDr3~KDlyU^DFGous)mvF{r!XRbYeC(K!U2JcQJPHX$`V zRQ}^z8yoLzoo1%T*HO8$uV4*bU z&VfB3OnmH~*yfXX@fON8BsoMsFN6rd#pP`zzJ!&`G4KvG2&WBv4hxxNbA`p0D^MD& z&z!)sa|ouLMM?|4!f;f|eQ3odvGjBkmD*SdnlQS0+X9nk$N*j`$@KG4?sCfvC4)Y(9Zl7m{Ms=iSexCYBhToj$+X0dUTN^P6 zDg5DH^-(cJIJCAuH|q&jx^?~2degz~Tjf2C@`~|`3CLU=K&z4N_r&|7 z&H5gWn}j*Jug#;r=zwmc>V+jTKa>Re);@_7O{_P66%62&{Dc}R0R{Rr!$I(F492Wc z6m7F%>&F$V3bf(qVLVb|jbk%~7GQKJoWBBcI*m92Ex(PkYvG%D2N^HOMmN2M)*Dxp z?+LM#2@^5q>jV&6P|IO-`%=R?I-KMV!Un0)4Kc647dkWS7_%A(HL1FL+pZBh-<9QO z;gj*S{3yPR|D$}js*XmN;|OZ`(@ZeAXj8riA+dZ5?_D&EpVj;)ghUC@+Zd0d(_?eQ z8dS&T5Jhg-Tqfz?;>+e~Y_6*4pc0$%5E9CfB3Big1G*(_F7ciQd4WF&4DbePQ!Ujy!8&H4I*zyaUK} z2qPk3z_d<$M$*A5wb4N{>24~qG%Vr^;Xq7J%k{k)mR4l%088apQU7Ohx-p~7mr?^C zU&Ez56XonG8{^i4v)BG(-MWQ+!_mGIKvqAFcJufcUSX9x_50@c7s`dA5dM83laRCO z^U)q(xNqG;c)k_m6-HwYSWunkI(RqQMRu) zepe=<7ebbD`|RMWlQ*7bNjKbp&v98-lMZ+XfvcUo0AX-SDW`#?l1=bT`RsbM08`8$ zA%39^g;&U*d)QTBH z{f%7x4DaK#9aLIDA`8C<+zpbUzAgLb-T&E;I-fm-??FZf*fJ>j>s08cS0nI9u+yVh7JU23OVkjyh;dNNPcK?n3c zVV2ZJ4>E}F)bSEtOY;sG3Dd@qFynd8pXwDXZ~$})NbDegCb(D{YKJ|&l_CKx-q)s)x}ttcIA1(722Yu~M&bNAn`zFfR^gr3=1=%!)}cJIMQ`c@JJ1 zn5848K}0tlR+U+R{FwSy@Ust@1ua4z%4lM%0=wS_H}~d;y~XTl-fc(Pf*1$Dai@CE zJ@Yh`i*Nunpq$yniUZBqm5kI?8|B{9jnWd0pruMdL?^8RT3(oBAPF8cKgO?vaDLoC z8_Cl~@);Xxq>X4vV%9jHB!W1sh~+l(Y9d1OFq4Lra4;YLgnP2zpPKSyb#yR|J)88; z`B}GI%0aY#Y^y|jeCHl`ABY7KksKQ3Mtf%V&-)sx+B`euEY9V8b?8Ysi?8zXgXrA5 zFwoZpv%p|rP>Y~p3`Tn&c?>at7^qx;w*w`ETA%{tUOh8W+J_lqTp<}^UL2O@42)8T zv8%8GnfSeQYOf@o0+g?S!iMj$Y_%K&{B0JF8HG zS|@7eUOqfN19*qglIQM`mX+gcquD=!)OQS0Pn=K%zGl+ZWZr)Xz_KUwXsMILj8S7! z%F=i^LPHH52!^e|!}Jn{30IXjk+@*&*wFiLulsXvhn@-s<@9vq;l)#h+?nI{5EC-B1wT1M&g$rpv5 zpum@!L3)hkP*9tVYayy9(qiPU({K=!0JvLE|kWNABbPmw2S>-;7^ngdH zsy^cI{7hu9zPt9b5(*rB@eiR2OYjZ<75- zEB(pbBCWi+7%TVi6FIL+JZ6vYqAvDjW_TTEwpXKcW9u4e#aF$@TcRXA@M;6r%q`@x zARYb3f@BLcSH96X?EnQlpkAOaf&1$5<*>zOvoVJc<76-KUk5|@fbxeO;zt_A8*-W! z@)me1<-YWhTA&3iA%U%V3%ZL=*3UnshbiR(F*Dc{%A9VP5bR69Y% zRTeQi$QxkXMjUgh_VPioW6zLY!iOS_>8mT|xFs|NrwYXfMKZ2Z~*R9`JpcHRmU zBYs8iy}0rZP|wW^Pt51G5>Y}761A3u*hV)pGm>?{e-ke}6>%tw;Kn65(xZ1T^6sIy zyMP}S2vToBCxcfyyB`(1s7PE;7X#7AY`*-(HH1@`C{+Fyn(W0UrQ8YO`!n|a2z>{C z;k7iS+~*!6Ho9EsP#pYJPDD)?E%q3^@*TxxzN$tO$5agah;zO;+^n*jj{Q$SwfZ+P|h{|vGSvRI-j z#D3`xg&uf>inscl@~8VTypI!id&IJkwK(b;oJMVQ!tLSxBr21mx=PeqgWr<#nCntIw=J@r^4mHZ2)#!-@toGQFv zdj4?4ud>e3XR@#mrvkJ^4G2h7o>Il85WnR)Y1VzOVju2_3jBoTBE$_g)_C@&sz+u! zC5Dgz`cJ~3W0eEi=Dz@U`f=v+wNdHVss~(U48ei`;9*h*rPaEIY%8$Sp~I>GF4=@Y zv<6X;GJ(jD6A|%XY4B1a4!I<32}j=5pswB;qxbBE(~0Q*E;}XL>2)!b}Aixe*(V4bc<8QFf7<~sloJ;}I8Lt)j!NPLrroNIn6_^74Dum9K;&fIaSi+U8({y5KVasAWXxlxCfb zw`+}{^^eA%_b6{RpB-TIzVE@C+#0f&#Gh#WLmN%qYg%coc*hU_firCfr}C#hcOkc*Y0^4X{x=c(Ox6(HdrNT0Dw9+EhMeLp=4<7U*Rt=#A^+?5i9=>H z;2*pUvl4JxQF$~~S?E(A+`Z*!)JP>WQYF<~@sA#;bj1J@O*T-W2Csf5g)E^+z7`hl z{wV7IRux~Hn)T9bdpQ!|06t-HeJ8(!=H_Kz|L&?@c1SgCk(FeY^E{p( zL|c8c3L~CY!`UnmG2dhX5fKMF%S6nHXV?-ryeqYa=NuH3td~9IeCs$F9V%+b8FJAF z=bIGZp}BMfd1%MPpF&mkXD+r?1BwsH*77T?J;@ykX1_C6(VG&>bZA(<5elKTeE`C8 z2WC?=#;{~T*PWu#NE+eY#G-M>_=C*AJ4vN$gr>7Hy5T!8x+U;^!Q>Kug%0_{OPTXH z++yZ>5x0h!|M2R*kekQ;v6y@uWM|+?M_-@~rs_;hhb8CWUgPzRjcQ;V@hVb!ePfjx z1W^9RpA5FO93#)rE6?$>ItH7N4tu|(*QgON zAbfR=F(E&i7ZYMKY`D?g9+;AjxM2-){k3CiTDmsix}At9{q%*yer z-B!mKw^#BIlH3dB)dI;spRifmRY`50UrWu7c_;QenKCr-L3V~S>v zrlw~t0Rfnvon?-n9i%++#~uwH{|?*Ihaaw}QuHdMm6^=t%4?}Lh+;X3N;vmQR?rGd zAQqtn%VM*}&q7x5_=7g9({c)zrJ{NIS*o;t*1FUuaIFB1Zh#S3JQl^1(ouRI`@G4-nQx`)Jqf~3{#Ru_JNFdj zv-E?&r?8bI6+^!<2wMygTN|S7eV?u}!cuO*$(utdRHG-p)*JoYrpF=i{j!g(7Gv^{ zGlYPkYlNj%nFZ592n$iI$Cp4C+lmXsn7B$ch8Sy{2Uc%VMqL;CI<&7H;J)hP ze%|jlsGZlx{U&d(vrM2*v{U}7kNc`WN$tBlHCZSFQEin{AA2*p@sEYT0egZ3qvKSN z76WS&@hyHQ5rZ1zPSJ^|CfHO>u-Wb{JN&+N=Jj#E)$h0Yebq;M)yMrxF{nQ7tNtW0 z?D*tlF~EIoRZh9D*8tGbdk?imZw&;R#u}&?v24W!qrM^fCE_hq0q+u2kH@_0*G}%U zoa4!zEx(1_WSa9h$SUIX;1LF=t~DmMrM9bq{Dk6kZa8B97=%e-RLh)uf0A8M(?%e7 zgfJKrIJA6HIg>eK7S}>s_bxi|kzNmN(kmA%YG%Nyjn4FU{V7{);SFVM@Q@*e4v+Qt zL`1RLVsfa#-8T^HU~8X>@0}X16$i&secnk z0@?*#{XII+k;(ybD^G`}=<0*3&P0Z(E>K#fD^8M1eaYUU%8~V}ye~uXyzHA0U{lMS z*m7KzC?Q2jjWJpaoSWTjQM9I_Gt`!dCDT8{~X}!OUTT{ol`S zg8knI(DScQPp@9yk0THjj8jxF0#Yev^iVtrL}?6l(P4O#gayU*iziz2z6{$?pArOM zAtVTN9K=RDuG1iQ!_*ONe^91BJBS{3(?g0EUSpUQ4?twOZp{*-0pm)qH?F2g!RVN- zzL*B#t>t$JZ$j7bO2RaV$-7#kmRdu^k*H)r@_~;(w61(DCWUd{F5&d&?mK-qbTQ|L zynurai44;LUNN6(=G9%z_>XA~1RYjZayMMgpW&lF+Y%+R+E&ga+eM^l~ID2yJ3L-xIV}p1|Ae5Ct;6yCwd_OQLmt3Gwh_`AH;v>VA zYb)~VaN{B8L4-K)@l=FpBG_?%A^m?)~94azJrxh6exKI^V zgHFkujQwgk*FRl01H28s3bduDYw-)neK~w^2_Kc+*rcy$rK%9p=%JNdhiD^vR56+& zEFd&f>>$x7@w<|`MyNAwdW$oRMVtX{%fxABOsDTzbxg}uGb|zaCLg4ua!?$eOzE!I z+c>3I#8E7jP^$xhZH-^WGBAFE&ju>vH5$nz&$9N)#qUZPv{QT?>z9GAgWGmJ7;rHs=Z zzdzuKrY*!$Fu1QAg{jOn(f6*w@OIW=GImhYgMm}r`dGZHP$L%OuXX(D2VFUZujO~i zQO07e(i<8w9~~sayf=G7HY3kZ9ywW-jU*0P-uwxK!am4yvv;Ir`PAH6NaU%xTZ&zc z8$yc5{oAi#++Plhc^Uu7^T|g{-QUW7@9#@~Oti)=K(qE53TIMpr?I!IQ@y4AHT(O- zr6V_9J6xz*A3n^U@aY(-c_B_B~&*0e>0>&DWLYaQbxozoOq= z4aJ@##X46RdC$F={s%m@6L@V!?7y_RJa2&7)OUK`Kw%&PpPW5@wg&h}9A8Z*2#;;CV|tW61U08eU6& z#Y#pazVi=f4V(DUg;v04oF||?%XU}8zpeL;3&!}DrF9SK; zRgkwaiL^po6zO8m#_T~cmQnI*RF!Q+=FJJG*}_6E>Mt7Q72E%Tu*pJr%d92&6S z!4tZ8gzep%<2&XE_^6*o>YkVhU5;U9A14=sBpb7b^H&|13&QX`#z$KnHL7E2wXleN ziRe6aj1Y}OhR)Ftu2k5*r~-q>rjBTa3jU-ZL=jOWxIf0LW~_hm61x*>!m@nvVTrE3 z(4w=I%g`e1J@jY+CLT(Ziy=ROk42aci>L&pw#g{FhcQALXDRm`Ji;p&99L^FP!0j- zg(YxoB3I$XYwB7&UNkn{I8SV5V zxUt>g+@o#z>CbRz<@e(sJ|5N7yRaV14w&207-r!qtEXEi{`b|+{qEiP_TxhuAfDNq z_s{wM(GoCh?(97%l6TDV}Nksl2Ge{}_7%rAUq{8tDs#z#T043;dG0g z3=T0MVaVe{^y4qs0$QGu8s;q+K!|%-xsdF7>WfZTH6Z6U3e5^bB^ZN10OQ~l_w`*y z@aJ?1#H-3ai?#b5;QbR$qT7{O)6HO6bBpb7TzIi8*|0L~%jwlJ49^?BFU;09v zmx2|kmpQtY<2qHO9)NT`nHXkucvf8@hBkt#l>1o8Gcnv^Z5zx*8Vsz-#sQZxL;669 z;rd~7_o=InbU4AM2H$8t)p`lOag0r&qzG5E*5|e1b18SgND3C)J1o=&%3~YCg7qt5 z(fiR#SPV)uFi2jffQ9PNXjOMTu*m%&z@mF%V?^S=qfuz)c2ShP!j z$~`UDP}A;71fik^C#)I(Sv$dDg@A@be=YTh$`icezP@MNlS(jB)j-W!mrk9JT+{R_ z?uq5`Alnl6)Zy-lMeMoOd!Fo`Uh!#nPq)@ox~Cb=L=CS{EQz>#>NsL*_oQlaPvV-! zB0_Xe1+}Xlqt%Y)1%8`}A)ulKS2Wh=*6_KM`|U4NI1KJdZ6HIoA-k+!iNhHmuEb%j z>!^;`DR8JdpsYIJZd&*B>DvPi;hx(0CF7nD7kquZlzZ^>;G)8kIla`WcFC1RQ zOBM96_-Hf}-HkuV1QiCb6mm0XRf&3LXK>kg*NQ#59KC8F_13Vw`$ViONrISg=!yvk zuch3+g@kRZLbhMG$#iTVT8-^KJZVnn`p(Z~2-A%N(_3sQDGL?|IfBq^E*!gtmgH`7k75RTO`GD<6g`c}I&>3hbG zRRW}_29e?tEV=}H*|LfqvplxrVq(WFZpSQQ&z;`$WII0O9Jk{qW>?yAqchROD-44~ z+>VzWHnknAn(SCyLmoB?+Hr^4Rkvfcb33jj->|AWT!S6w!{<`&C%;PBG1Wz>s|~G< zZNV<QFmG*;Kjqtvrm$T$^de5Wi&XxEUbX5618= zmwU0~yDv4-$M7Sx9EcKe3?Z9l>|d;6z!&lmA}pbReq_L#S4OZgjtfLL2>AtwGCKLZ z6!Hfp+;jvJK?oso!m5EmwXhfK4KZC(McP5!K~hT`fBK$5zDgil)d1PNgRa4m-@%qu zkk9fM`3+FD=R!@?Iuafh5&7-j^JL^N^h7UudS)f^Yn_QYM?Q%-^1pk?)W}ygAzxfm z>LNtsU!Zo?k*{`+{0X)I4rhRW2vMJF!sk+M%`d7TUu_^mwjuIazY_UxKd}<|qtX$4 z4zE)nUv)rPb=HUc@86t4{*C;SL4FI>v4le^0&>i#a^5wLM?uj|DgC{Yt7$TjO5daxip@YdcC1tPP&4an<^3z7wX{oplOT}Sx z&s~3BOAzwvSc$_G6|D;DF0hlREasG79Rm8x2tbT{xdTz(GbW%Cv``H~))mvCE8Hhr zRxtsV$KzWCox2IFrutz5EMm_E?|HHb9CoHV|F!rrUj{f$K{Ur~btc+)1*S;EP2lE( zrZxdplL?4xDAPtk6F5)ps+)k?xd|+B6Bxu5y$hT};d3c>M0$?76YrxJwSf%ThU~I_ zr3vi&{z?;QmnyOA%Ig#+pgN$eI+W&g&VTu`lnGqVFR=*-Q^lv|zHj(xVr2oW;GXw{ zgoxi|0v~;TIun@xjw&W_-e1fF_Ct4y0j~h|pN8OKY_tlJsTfcN`vqeE%0(IMk4m^$ zqhc&-Ae2N2pl$<2VV_lm{Z?v$#l(K7HcaH9*(yh%zGtwn60}ea)NFRxwdjf!3bw3* zeU``L8%nUh+_BFh_T1<_PsaWc?T-Cto~y)u!I>!X3NVp~WB+@Fsj;tW!oIkMJZu!i z{)K8+9s6qM*zY86fyCZ`cYGcQpG&zj(uvPbQcq94+CYYELv~re68i_VRARrGx`HZO zc%1_KssqZZ18Gi+{X1?*VgDw6$zs1%{&W?Y#`8%>2j~MGEE4+5|CkQ_`yNmQ{huB; z^uHY)3jK9>p~irZ zPFZJ-zXHq9>UT!@z2E_*9QGFR;`Ge%KaKyPyf1D=fA54c-t_y-{(Nac{g`d$Y1y}H z%^*qlE%j{0u3@bWxAYPFDt;}}_1RKS^3aS;2(|mJ9ZF^grCjTk_5`-3iObXrQ;UoE z7MQacfI*AZwQY|#u{HCw53-bSY%y$9US$hMj`j&7KSdCF1q_ux$?tolirzUqNLY^B1?#d=ZAw6u-iP1x3O3%K3DAi$IMU8 z8b2RIOS$ux_*mJ6X2#fT;K(q%<9SMCA?6Gq*~-_|wUI_UTD^BkG9cV$T6oYzrGp+O za}bI=N5z1!hW>W|fP8E%KAykA`6!=_Sy{QA+aRO2-OD3W~?nXmq#@q!&4#}eFS>D7eFNXz2S9BPIfxm=3Xtx7h&>y&CM9?D6OEcBuoF zOCc?vhC+Bu4*E#;+jV~CHynTF`A>KrA{iRO+JvrJM_tIho~!IY!2FdE$CbQSnoW_f zz|dAeR0~!>(9gv??Im4#F#U%1G3 zq;n&-5gV}w^!jWEAhKsX$7f;e2YpXtKmL4-eG{Ow`uU4DGa1R8zrgs(rx4nqDTlsP zeZp?;TT=!LuR?>xdN-ELe!xcDgq}5is9EazXl=dOL-AWt_Uv9e6Qh#6l2aGm!*B&M z!G#+}vU86Vdpu5EEE&30D`k+H891jd$j%NdV+vc?t3?E z6#snPL&?-p@!{@|%zfjExtFb&`{m)CR`gCfozgwQY-IzfFZBoR^TZnPC--UR39Cx0 zd_U|c+W1_c>f3a28GHKVyMd)f`l<%{D!s?2Ie-aX&VvwaBSteH`frI3O9DZ8Hyk$a z9%)<|ed!$7^b&{fy@<$gyfBU$Nf_Ut%+!&t3_o)(zD_t?(@LIjjtKvF#O>q_kO3@p zYCp`_QPf5bYNIpSgFaCM;-SaI4Olmg5+MfRHn!2e%z(b>z)OS*p+I$$LT+rb(JdX2 z=mCkHhVg0paX45>jQz0U<|lo zKsCj_-SHkx{14H`t!vrZj{3n=acK7*#M!Ni{j*1%80vSA)U1r&u#AB*kj%(y?!`X^ zGw33%Uud9(Qx?3wz4Sg@Pe=I0E8L&H@OVa!1^u~yG@1-skq$j@FqReeqabHLK=*F% z)$RKLc>WZUru$G8xsoKU)007mT-JYpr#II`_wa&4`Gf%S-D7-8Yr&t7b0SB8qdvYq zAN_D|?v!yA#jtV~pi^oAk7%pkosUj93(%-bxs}9UnA#W==`(^8t&qn#mVdSo@6E(J zoE~6Jc^p6EOMIy1hv>C?RoT_c&Sa42wDoLM>^mHk z55n)J4erUT@VqAe(&ycvL9rg)WQQJ{iK7rz4lAG`9=GBI<4360_v)C(qY8KfVpH*= z2XSi-)J8Ji8SQ&IWc=3HLMj|4#FG!=e$oCZ-MFfIs_maWV4f~Gr_%Ll=k(&`f8I3q z3L}o~b-vl_i6^A&6$^Z3ulx|5*|_2M3d#qy_UG2_CVOqBz0#4=432Kj+AI9WVJ)1} zxWTSur)i7D%>$dOSnQ=BUe#hj@i;U(taS>D#g9YLVq5!nXcm7LG$$4dm!7g%u$r>i zcU&op-Io_x?3?hZ+(?VvgBJVlZ^=}D{hzx0!Y)sI0(JPBj$pCt^S5%4kU_?vi};Bg zH|h1+pZow_xw7{fy`Ca*5a#0(@9^Jm&z#`5E=2U3WX})oI*mR5@`|)Q-}Sy}?D?KI zPHWE}`}lvGJyRF?psT6|T`k|Z{hMi%UY|ZI{OMk1&#lS)g#?suVxry|m}xJr2{ zZB|WA=3b4~fl^F|j~g>om2waKIC+MnUHFb(afvO$sg7RL$d_E|!3~%-9E0Xtob+O` zLyu~ZZj-ua(HnbB2uZ)u;op!wp8PSu;HH!zx(!UTy7y!ZzNf$_ai(Wi(gpbl2Ke^Ql|Je`M|qoKLEdhgzbC~!Vg@9 zr0}*~WEh*H557hb|6R&-@JE-yB%TT(?ySS7F^TW(HjPPqmLh8>7F?xaUF&%8uSLMG zlKH-ER#S@bqWHD2xCyj}gm%{W5rzzrNi@1{Wunmz)9CZprZvi5!zwefl|Vjv>oKfl zc|Lr%B-=l4+3OfTxSe(OW)ud`%a8X)w_OTBJR6;HofO-D3hg^q?0VxhQuz&?Prz5> zR63+3+eU^&b=xof^&iK;1*J3hp8q>cEk0iC-{MIqA0JyWlvNz6H$jq)jXj>i^{jgG=7r+?NAU4AAoPHMg~i-e%*Gq$UIk*F5{z$*#Y`^fopCM4 zkMTATta*YpPi7mXT1c@O9q{BYtqrpWOcWRs;u>}rsBN;j(I@{8Z*Kx$RdM!@hvjNO zV&W2w`&F^VJ#IB9+Mw886x*Pvv2JmX)+M51+!GRP(#vhJ#gEgp&gS zl{En4$Yb1NAZ<#nbe(&|5eCRjje8uA_e^z+`BZ8I=QS)>%$^J?i&PQ- zVKr6c9va7x4G!lE9p1_e_)Nmb3Q$xd#|FE-Zwr&ks6GhJZ&+<}?*X(1X)=+z7a4eC zxtOTjaz)ahd;g*Xl>-foh)?WYg2$;o8huFcturjRs$!*;q!;+zYA0i;bWx3cJ$p;8 z41k89U`NG#HCOj~B|?SrLB#?+mlbfa7hdOV&E-89pHmJ=MR$KZJrdnTq{e3MWeO6e zX#3L76Gj3|gMx(sGz|iQ$n8Z)P(DadK5B#@jD&ex4Ip8Mp^{317?Cgof}<$6nuR0;KmfCqmB{+9rcow>#SOqrf|EY?;jd0W?K=k zWY^$@30qOG2uDmFUR&EiJQ3{;f`|GMrudm9GchxaA22cu|qA-4ZyU%^SX*^~M6 zB37tpkHSxIc|BsHyRqy(`hFArX%lL-{&a@zCoZPRqd(;exD@(RrKmWmrU2{G^D&x# zWyrpGV>2!+&PVqFhKhnU-+2v8AV{GDsbZ&}KcdwQkT{^1CaH9Xo9iQD>4#d~$?~fbl3NwP4muKHda5WmJQ;pf+nMc!|s6TxW&NoIlu# z0j6!{oQG_*NMOnVdJ>P-OUsese_i+bYs^dTyc^JzbREt`1);FszCS9g9as(w zvmAq9;RHFvN!x_f+#98;;KzG$9hFl@%Tj7-N$^-ZlzKWMB04X(R}keTXw7xrstwa% z7~qT_e+U}_pC?qO%g^3Yk#yC}=SydPTw#n(&}VT%a7~?}>&FUTku=AeZR;27L0w}@ z&3U`F+`5{l4~<49Nimn;4z3X?eH%uf%oE1aMH}-)CuUx|@w9Z&k;A%H6pung=n)tg zV1@(cW`h~twW6#b%m~0tH<%G!D=J1k)$+yZS6q4)s5&uLx1*|c^+*&rNCl1<*}VD^ z0FK0#Ps*~*BnGY4a7`ZaoZ&6Rjemf$;$B&8a__c#;nz zVX=xm&_Y)x2N;TqAA0hzqlALrgw|#;PIMT9RpwyE?i%O z`;<~$c7HQ{t8q(WQ;i!KUTR_uI$W#qqDIvC9>)yuHhA(fpQy%5Q6uN$!L-Tz@tP^a z`hJQWL(DHw8{%JEaU#Z17*SR(vnND+7M}=lBM_Iz5g$EF6Z*oIk* z5ZOq(q-lSKJ~6#f%NLEOo$(`-?8Pkzqz(7jWdfI-xGcSI%1DU#tTP8zf6TD#-{A03 zy|+qu@S;tlPD%Y*#}8gp-@>VuMA0!jJ{O8WFoDCx%_=@(M}el^wg#dlJzZ&T7}gcjSRI_B9qlu@GV)8$ue zDoNMnh^_oY1@i=nZ_~Lmd?6?N;JreAEzfy9ge!vMWE^n8t%S$TDoYG zym)s`YatVC9-|FLUc3+tO??H%1;8UO-hFW6w2LlleJcpxsKC2G=@4ViXHW2Fi{k#&UK68WjJGy zxlU2sX)sO{7hQPPMG(atWKt9{{aAl?so-lyjz4=KkLM1{-iuh!c#M_p;QZHQM3|Yx z_9fAV1!WZlR~;EPtf{ckM0ONvF^6F7`SF%!03yJMiv#i>3A??eOm_R9nBDSCsO+}J zHMUfKV{1y6cWorQZDf#=#&gu!F`>~ZN#!)j%+70Vm-SyK3k@ej)^>9Af=C}kDHDxJ z={yTP^@;T&&<1?5&sbyeU{~+R)b`8W7nTE-+T{zzu&a34fp4)WrPMg1h1czzMET45 zCOR7+0HP?Uoe&F!(M+pUG92GpmxB?t89*2P%n8_MQD4~s!$`Hsbi~x zL#A-Z;=4L_{1{$wIdvDIo&-q0r$>%aCn0n6Yv|~AG<*rs1xJ4&`;BF2ho(;#dpt3r z23caejyH8<*nZ(=33_ifZ$-WP8_m6XM_ZIK&#@&a!TgF9|mn!Pz zTOhXM__!P^J%N$oz+9wmq|yoUQy3B}#iQA}Pb@ts94%WZ%rOL~Jdrt_mO zv$z{AZ!gXYkCp{SB2jcPiNa{P6Dj`Jb+^AxC#F^G1_Dcd@$L9%`P>JhUC~ae9`ohI z1)~*CkVBmLqvaEl1xCwruu4>;*CdY#8F*1q&Y!GD* zVS7>Vw~Kh5BFBU?JMlGHjCfb&HQMztK${F#MAbW&)4Fou?52Y`i|Jfm&W;+y>0qY5|q>1PhoUMc2GKbX#&kYy{lYr`$?1dW ze1a8->3n|!9;ow84LGLrVi|~c^Y?uqoqtNbu6LQ!`M*xXT|X9KO6O~N_db_odN-fl zl#{q!u;0E0P&;0oVe{N=OkCN>347YA%?ri=n;qCRjYT?h-{JESz zx8XsaRlO#Ek^l9EaD1>8ruZ0F+k7vkCotc8UY_4N)s3WbE{eyyToZFd&M*{0ofdoI z?ZUgL33y5um4Yuw*~DJ~gWW<Kigvohphf~JSs02g zYOX;g099ESibi^YL9GX5c@@1A4Wuas<>{FYgLxMQ^NH)jj`SyN8H;~JQ7dDVTo;-+wOtbjri$XrXANaBi*E32qWtsc7{Io%q7rP64sL7Kx}jSvnP~yVzdV&7;+{ ztn3DJd|B7Y6ff(PBFO3CJp!)fOfj*8SDkK27jEh?aK#+XRGTxFuqGXk`oC*;2Tyi#0e4b@KzBSU-mLob|JsRJQOAY)6*ENJ_XMJmMm)#KWF0Nf}_R17}Z)Hno98C!e(}rTmu!2XQ^=Ss0aN zKjNt29{dFBABMa`ah3PJl^^ai6|T1rQLN;SbE;4~(4j)5pn{Qk+pu)`BVSPr_me0N zP5)R(74SU21lBZO7qQHJxwlJk1YnoHuJ6(BStMl={kZnP_DTPd;%T$t*fuQe0bk6A#zU0HDH-s zUF$p7wLaa9c)J*{-a7XxDr%p%Q6~_v6fmCDm0h2RS*;fKxcO2dlH?C~QPZl!ci5ZKL z@L9U#lQmTB0}F7&!;;6CW;$jtgFN7*N#Nm9z2^H9QNVTq zrki^R-{D`i?!vZ(ku=`Ex>ry+#ih&77Zvv}M+vyJ?ND(?3vZ}%QsLTQ%ThMYCBey9 zO^WXlM2KrwWsXKabsikMZ=}u!uoenGUEcqNjM~*%60LJqu%-bu{JU>v@Ch!m|3@Ek zF9Y*TVhfmX@H%rZu#Dt!$atC=yIIC_%y@tqS$Y<Svtr*Oqsi7&)aub*0vB{h6VNxcDL>aeEoUpm6qr&x ztV1E%nSl{~Eg|s4AZED}PMjXoyndYg&pZGK+z^4jcW3|RQ48_MNG(m>_@ra$H}bF-IArVgUq z^Q=Hjxi1|vh;k1$;Fxl6FiS8`nSB8RR4DLjs&lWiopP@SzF>RaQMuJ1CD;UaQZ6{* zNtpvVS@!S3oNP20C-bd9jFXXradL?P$2fV*Fgs3087EJX+Oy7boZNFX?vCdjIT2rz zaOXMMK=bS8v(-*wo5VK~;3%KB-j2t?4P^8E&kM7;t5H6%HQsLpVr*^$ve0yy7jL?= z3^>MSzhQQ4?tr%^VC5aE=-M+Ko6k(aT_f+v=FMdKbliD1dAQd=PLhLgk}~23a`Mst ziS-yKC!*$poIGa0F-|s%aZ-o3I-qtKIl1Qy$H@ldd1dZr!m4Kq3A#^aP@G{0-cDNS zjGIXofug*_}eJrz@6ilUlmiV$2gQblNUSpg!hwLMg* zy4=Og;s+%Y*@*;)2w9BaZpE7W5@o#DLMyg8imm60u@)AxTD?{5aLfR!ARKyT!W&nE z+r^65%%$w&<9+h&qR!a`!+D7j$`!km8|5Oqh*1}@i~oEOwF~$d;V@jY+^Kxwn&U!t zvE8>YXE6h>1Myandr13M2d|$3-*qJV7ud_H*=8^L=5H|LU3^r2EjpcGF=4J|1ei(u zJqB|MVXE*Xm_wL15KRDP@lkM!t;|SU#-m3fV;VCiS;mEvk#QO`)<*`Yxe#+ER4%;d z_zk?Y>7XbcZe+q17Rkt)MA*jXD&IbHG1!Q)m%@T3zx2!&vn%Kvo4Aa46$19qLz76P6E z;Q+I_Y{+IAPlL@Q4y4TXI2j#JAMU0CW3V0X7UJ%6-fe`t>@n%R6?c zvRU!X-;c%n%E~NID^{-_=11(jt2Jv?_R>4 zkKhUq9_I8F=H#ToI61=##5lS2yMu7@Z3B*RvTKZ!&&_d`laor%$??D!Z0R{!Moz|f zPO^{Lki7&B?oBEh6J;7qoMZ|sJb3ua`-R!O%ycl&LtJeIVr+IEJ_wsXFyI)QhnWDK z!b*+JJ&_qqsB;Qy1ioNj-ce!ilj)ss=R8FAHI`}ZFFb~LJzJQe*Nw)34Bc)8VhsIz z;vfuNYrrvvZZjo2h7Peo-;E@?@p#A3t-u$Y&O0(Rh3rkmowvY>f}^302jS$g!8lnF zi1ipJ_YTI%Jq8@(WOj^`OKn_t6*>9SagLL-$jMyZk&^?+$xm?SIoSf7oC9w{4{Qr{ z2J6qmSg_l9%^s%kMhc#>uVh9ytT>(6K!iTfgBuPt{sSm_#Gf$3s_CR7hdW!$6u}_9 zSaC1{JCL|#pP!dIKJ4JzTY6ED)DtVCGS$WQwz#gS0G>?$G&z?UhTpk9;cVxjz3A_!$}Pl zgddK+IlGG9#ttd|a5LW?*bctF*)5=9AdFe)pquAX{qeEXa%H)fSr$g`Q4A;xqd8#5 zCBx`n0ZCN$xfdEESW84D2mdpsk{3_`%4N#`STl%Cjj;kI<GpeWCm+% zosoT;wSUaJyPcQ1aWD-H%hS+r-i~Q#nb*(;gOPZi6)+Mb1E%3oGUFOLz>37$*^+|? z(a>lErZyli8)n>Tz|4bw_z_5m{MX0~{__JTf=hV!A@A7EE~7wtac2W2j5`iN#&gWz z2}@D^+_WMh0H>eNt-gW!xxj#pc}LvGK%E=UWk;HRUT1x$dgA^>;--i=KjaytLt;DHO~W1$+0x1DtBJ#GK0?vWge?MmQ{;nNxAqU|jy#3K*9W74ID7G_K;Q zRwSn4;GjWNyt4sQojDc1V8G0SikmF3e*~Gq7TpBS()?^L{*Ns4(O&Z&493Ah^d>3!7GB<@1qu?ccX(ouqr zn%Z85+Jsa(b1MVLl;3q=K|#T*HsCe!@V;xJNZx-l%8a?YZB2Ls?e$>;cFdT&+rl_E zX28xEi^+#me1Dk?2H5NV9V7)e^KN0Z@(W^>|3JRH%cvh%c}=YHO$GdrQR*shMNPL+ zaQm~SRk*v9_3q5OdvW*6ak$$8ciDGsRKvmBknO(njfkWoc3(3X!9TMCCas9w9}put z*1?@*MdEf}T~M9r^1TeW5_%8q-hi10T{K$|{s=OI?T>^MxUhFF?>6Bb?fy1OD1kfg z+AgM$K0Bg--9P$zL;%k2e+1})cK>q&Hs+n(pKX$2UTF7INI)Cv6LDLy_UXL4JG+A$ zsbNU^vIPq^B&}0^Cl02@@!E;(J-HFX0w7lCg1L3Sr{B*2YErnzMI_BkTl z_PCB4ityeE*+Fs=q{_zlE8cC)JH{S=ra6qnosT^l4?xDJDP-iw9*?{l5rH#+^8j7Y z0B$f~W8WFTStcuE-NzoaB%l@b$pE%w?U(V6j<4pMG|=s$mq(a)`nkp=WsLidse$J5&UYPg`>^&G zd3QG@^UdRq`(H-faR%ZJuzx7c)8_Gq;U%>pTmaF80}w?oxp74}kKYa`&CwGYquN3% zzc>ZJV5bRnaBku30iMEn2^~b{Jw;f@Vvesdd)ldSb~v~26U{A@-1Rag_yC;>mk@mg zC~(j*gBiw3JoNH&3%6oBj-OjNHtY_=xrM^Ts_>@67n>R_wt{Rz69eWJ{O&bB@^_-oUBg`?e0JDXehoLUHHUDDGW7Mojm#my}|4XDyZ zxxIC6ZozYzN1e?r{8U9Ixw(ZdaTpHG_kStkh$61_#eD{8=_9RxYqtE@K&HHB??IaF z%P&S-##REpWnTeX%aCgw`-xoZPw*i4U#zg~%c8Mf4V=M!yt@;3-vv3rpK&MGN|Oj# zm}Zq&Ta9e<8$B2c6RbeY^CSjiVbd53=6RMIX4kk6w1LGElDHlTW@vD474G^EW#h)( zb!6s!+}Z5H3)o;`vkOo1YAJsn<Emj=?pJ>aLHFXd@8nxK(BPfASxvzT<+{4784SJNjk_jZ2=>B zVnl0=Pk4dWXRmZzkl|kGM9YbMloR|ok=&;~Y_1d1 ze5SC8#T2G*q_B%X!i9rU>JFsRs#i5mz~VqwG+wf6f|EL+bt;KgzT9Exb@ydV)x6`4 zllg{0Gy#KX0`6{CvPbDG+xe;2w2jE2YV9>GrI>4+&Cs7~oU_Br`M6}`b9$kBDbzfLD!d`*q>^VRXj`LA1|jdKr{gMwL({16vijBw|z>U`)OG|o0S>|pr8 zzH#=CAGC26e${mAv$2MgndM~U1$TS!j$PRuz#eQz#<<-p+lmti;0Fq`v;3LD?35XW10(5Mtw4;O ztx!G29L$S*nJW!A#?G6D*{nKS)}z4UNs@g2L5`iLD{*%U@5s(fGFOW`V`t^-YuDl% zi{D|!OV8?hUtZ6%>z#Rx<4e~DM@`o5pqGwR@|-2zmULP2Y8ilEe8%nh3HSTx`(wAz zv|3kIbCF&Z7wJ{u5aL=`7nYIH1KC@E^kkgVh`uAY8jH&UxD;y=1E(A?p?LCPy8QY# zVb{?pA1Twf`&3b^wA}Gx3yvg>!*LEv^ zD9*~sL=80k{}27|z9IVGV=`p=mwl0=|J^q{{kt3e$CehNfBKb>eJy35qU<3(9xbDF zVA%7Kg4i1*1)Jo>!$#&|zZFDiy)wK)v%Eui;A|zIRMB71unAiYoz@Hswih6)Y2{aY z9@`KkvGev@!Ib97cTbpm+&;MEvj)e9gAhR zI^sOn>_9}U+41{!Ta?b+SY8M+%Op;G65<4-!OwSECNZJ?iCf2zHU_1HJ(Jk*e1Bki z;-D93+mvdC4G~vmLFs><6bcv@#K)GJI}X3b9fzOdqsVdinZ&Ezj(`>rz%qMkBMk#0 zuv5)Wuvxs3*;XFzo=N=4m)Yi9Mzl9f7LgxjE5T+GKRYic{)d+3#P7C#NCTNKavHD|ji!XQu|IaT z&8GpSL6i$-kg`jnnG&SEZEQ0VZ?)3I4%CDT{{T+fQ)$Ob%Tlt)?=D~+N@Iyx(t^L( zDJ^IV7|*D}fovufWVP91u}tEgb91b%=!vjqU^K4N*OE1U0IcI7EyAM{G5qP0{U0~? z@d}n(fEaThkbr2#n=Ym>ax;#mo%2`f+Asw?f+z)*?1Wx<8FZw#d5Q`8A8<33_QX}< z)(N$Zy&kgCnPZ=A>AQ9E+cvCy0-S~shi>qRntHTsP;V5eW9&px24hBAq>;8+l$c4Z zzzHuR8pSMdWNVAulm$P1@)c7yNR=_rS~X zW$DD)rM8HB7o(nEZx||#j8UQU-)3EV0a?m|6^cfGQx?46Z8TPrMi4rc8bt6Z{oC{h zY3=7d_LWP1{D>BO%3*cs#EGC0AJKw`E}eNPPK>2?k4fPdO@m7e_!lSJ$u!;EiAOR2 z=Z^_;2fXV@(F;n%$UWDL0W92L-)#}&4V>}Pj%+|>t(9LH@Oy9-o|yjN0Z<@aa_bVa z#)q+vo3!Z_D;#AL{_z70;f{t;aQkjYLng8C47c9?oG1;Ijs~N}zJURGX+{CVm`Vln zRx?Iq)rg>~a;6Rq-HF4_mE9~DS< z^pgPf0;#l|omw}#Q%W4R86b7D4;84-T~>yd)!}6dm#GZ;9j4IQY%l>olS%yVhxDuN zL8j#MWsF78cnHUlJDJtMB2#{oKsOy5Ot{iK7otx!uQs=B)a~s+F`=gk!1s@Ml)AgJ zf_`-`SzoH-2z;;xm8XOe4Laj?nkuAv`-*(@HICyH(dE!_cw5wtul*QQBu!#9a$Px~T-=ti#91|cNTm^%8t7jvef3+LJzN^@M zW2xK+ys36Ky}bE5rz(%cX0X)FzL|SX)z!k{Eq6T<1m_caaz&Gc;Up;iBbit z!x=Ph;|v;B$Fpa)1rW{)!{J14<8Y#7sR!!n>P|hY>C&_CksyeSJ0(Mrogk65t|>-A zJ4z~#8H)O=QFzJ?lPMgrLs3soe;4Jx4K7A?y;D5ul}T8+2$0zVF$9y-hXDj~oj$tj z-Lg?117rh$Gynv}Ho*Bjqh7&@kC&Xw19Fdw(X@q}Z0qVVfZsFryPv^yFVCqV`xi^>0wKmZT8!o{micibYuIkc|Zl!jeUOE z6aWv>h3&u0Ad4ZAnV;K)bs|v_>%MgKDeU<})E0DAVsfevmcE!5TyAsMX2`w`cd3pg z*~`(2Xy)FT~ zYR#T2kI5aiL`*dEWdJH&^nG^*S9j`un)ziHPJ@|uL1cdt4llAg7!JZBnfZ_P#EWHL zEC&b26!jXK`I)h&2ieoCy6BWr zI375L<*5hHxagb<&%N@jGgIT1V6NxLoZ+D>4~}bv8&+?QK6jOH&$5vSCW@@yxM3HUa&l&tVg+C|oXDWU|I{Kc<9>&~5 z_%n__`|)Ql{_M)1o%oZ)Pej`}F8XF=$ME_3{JD?)%$FE!Wc&H^DStlX&+qu)pS*gD zKd>YR1A>>hP()4>5DaX$viZ+iZ|gH=I~u@41*r` z!p1R?9v6X)${`dh3pTkGTRk`DQL~f_zOUgML<-?C!zMCn~h(GxCorWpt;wrqx zb~Sb*b@AOoW`Q$i(H{#WQ~t(_oYvUXCLR=O1Yfu~3d41bhf5b}%xrQv=iY}&H0N(A3QfsJ_qhNf&3mlRHMpwB>egFLrXqyx^Q@3bSh^sIzbT>&d zUCBuR3{t@zYXMiCO6RCHO0k{bcurz@FI>1M!Mqnb+>>bD)1L70=aN0|L1%^lPvv-0 zI0hzr;A~qo;Eq}y&F-6Zx_r1`9nQ=ZO`K2uH^#?=ozR3|@F=_(9KQ57;&t_9?r(+w z3I2!!Z()X&5J#Xu9Kjz_e&n#mahOs%Pbvv(AkAj(ZlbK?hIXJ#m!Hgv!%^vBzC!EA zgF9DnPK?$XzP|M|?_fnaZX&H;VNC{EYheayb>;ysMH48XnGn-_NAm(l^FpSug-(>@ zAIsV^)avf73}yOnEAGFJwVTKh+Bp z(_k(*EnBcfw>xTQJ8I`LMJ>t)ca|S((VM>*@gYgE>}p=XG?Vz&(QYQ@jk%H8poJtS zli1}>o0khZqYoSS@CoqB1X~sGmoE9;U#UJ$`_xv@7XJ;}Ae|>_phv+~Fr~aOQ9-F- zkm+82Q^q1{qjdT4LUTni^>~}1=$L@-QHI6R<@*u_g^WmBEpn-c<+u*dL?h%{MOtys zREp5x7V0Q`y25NHoViHV{%bjxWGv(yfZBW=16bcp)bl3nCbk{xx`{}|O%*nYt8$Qm z72*4!GZ)$v+O4P)#QO=|b{8Ql_(spI30>%)a=>=8~nY|*v_b6yW@iW-yK51_Tmv$gm6-l8gv&{YyYNL`0u9n zMIET^A(i|xg|V95EEl2=w3H+*mDMTg6Gh>R+UOkl3?Nm<^gJ$1avmERCu{6T>Ghp= zCQgL34lW&sh|fL z+2c4B@Hnr2f+#9@h*wi_g>leAT&Fr-#?_ygyFPMJIqa$(X!#es`C91D7myUtSw_0i z2Oa$v`jRVZ=md6#1(WUxH6~EO02)o0-}|ir{g{JA>*q{+lTsKrQ`EN5Dg!t=Quk~D z@(dN9$|9M{ZMTUKE5|3on;wZH`4Cw|pW%MKO1pgACrP{!7N3_}|JG=Oh4~Z(fBjcD zFV}($&C6{Wp~`eX0<%ZwEYoVpeQuUUM#d;o64=eu3NkAuuGY>ZK~jzfPb-cKQPT$& zJ#xNbzAz%V37Xo%C|3TkhG=T?&=j!JpVfs{DsWlp7W-HqBVwwZ!0O=X`rd zPmtivv)C@1JxLQtr%(U zCEL{xVX7{@%{5FSD#q|B0CK74j<_RP2K zJ#F}YR_j%!Q%S8Wo7gWk^8I6mtk72X4GQ_%~vj{0tPn` zeVXRTFP90b63wsj0V)BAucWd!R*4OTwDMvy7gg{eU65ACQn+=cm|qsWf%9PaP(l2B zkwn3@E^S)UHz&KRtTIvc0CiZhJrhtanb8_!;K9#VLM<1-n4_=H|DLBG%{8>H1R3Xp zAn1qR!CroxZ#Id)+|4>P?LLuYPquX#urEw`2On+ulxFrTF(Ud7{vEN{{9XSR z3c*s@4iZL`W{4Eyzu>j^BCkiQ$Qvw)Hj+tnzO){yfj%@q5np zv9hHS!l+sj{OSE?*Y>qh(P8~yqSF>fJciy2iz7NIl8!rUfPlpj8YrL%_9CBut_cRX zWJ6f4)PHf+4GKW{s(I0#1g#V2|19=B3G6_z$F|6a&LZDLj-&H$Dua{WH+8_TLOUF& zR?@T1XXQED#`ggH9#85BQ$x(n4zr#Na2EtZX0L#pFM;onFG0RU3AC&9+)2D;X(w)%coy0) ztxz*cLhD1mfBi=8+KL{pDK@sXyv%r}`w9Cx`JpnX<(;Rk(FO;eWd`FUN_&P75T&?y z6ZA^fBgv$ql3}$dEPsV&G7-%L(y6De8hG2tr%lYO4duXW05maY$Py@4 z^s$+jN(y8LjhCS#(ka?JxhUv*4~=bWbdOPo7O{7Xw*Y1)pDc#5TUOef$sIO}1C!Tm z4otoVErNf}q*81kkdMa0kdMa4Fr!N5$7YjK>BR623-7prH^&vn5%81IJ1QArZBZM(C2{9<@StCWLauWVwlY$7H=U(pL;|B2I zS{W^N@W(1bo!&H~wyrv0l=ZHzUXVaY%7k?r4L+=Ib4TpXvX`4V+Gv?vl_ZI_ETy1j z(mDPj3T2)Ydh;bv=tk(owDNAq5}!Lt67Nt_ekBvOXo?*?iZ{xcQ73x*;Dp;v{MEEV zn6tiT2jd{W2+tdpVr_-^pJ%cj!M9CquOW=!r^+afeg|Hp`&ss;8m2QF;^H5vw`VT+ z#l4lW8EwWNp+{(E2}Sp&LW6OUdN_pWc9r%hb@R0z4VXhigcA_qaLh{ms(<^)7k%b@ zhh%}CvyeX7ez$H5+Ex;aKZ+qrZ#llV14pDAIEz?V;Sa#_ZDODm)Hor^(b#B!SvfmT z4Ni;fe6F6)bDwIw$8B&3$GZdVyhkdD+PUfg>9wvdK|qFZVPHU+?jaZ|<~@MR9I$7A zZkT3N>%RV|e3Tcwb{uBHq1B1{14z4^wRh68@3GKrj>OtbGCV&PGnN!05DPq!&?tEQRa=M!L{dw^*s0 zqy?~WK)~?+2uAr35)lwQSEmDRR*IfhsV$Kpd=fRvFVb%$vRM_kY`KmzFN&B?b>yja zhjBNlN-!C$O7K>Bwklhf`E-KO6uPlWDjR+qeSykgBH7g?2yjiBV^$_{ z`5m@Y9KKhNAx}K1<}5jzE1VxhuM1MixpSXe#*5(P-~-qjD{oy|C;2!EfCc>zhUMf6 zEmm9^RB-4UkjWm9&${?~9QYx!2J%-={_33_HlyCC=`_i2p)$@LfF#mq-1W|g4`W$2NgA@NZO>1gFDe!!?wJNOR84l^@Ug$w`= z4Ax?XlyD%#MYJ`nI>mNI2G~QkGllH(u%@63VAj{`&Fi`9YV|3m`qovM0 z%Vz5Dm zMEOC8ut(ZqHJEp;9}1*o)!p(0C-PiPK#0U?v!-;>$YIFY{orN*Ts^$+5_`n<1`vEN z2G4L++1kG+S`J=N>A(MJ?cWQx!}~sN?LSo)K_=DHx_Z>~;oz{S@6Al=(bm;lxVxU# z&YQ7E#oayDN4M1&v3pjTBCX(JjJ+Amky;jf`NwD10-%CaGCL{CvS&cdP7uD81;by3 zJRcrho@nlY4c>I-AvSYRDjj#&3|+?3$L$R$q&3)}9}ONNM|!-3*z6n^OIT5}!QZsfBDtgt+J5l7*%^#@m;;Kt*0*l5pM z7@?+&EmrN5#~wfgz%m(4ifWa`uqQbHGiq1`haZJR+zu_t({pf1fK!QI4}g2Q60}x& z3#_dwo%0yfk8gE7iB|9fM`+Nx4(NP%TZRDWu42;8c`A->iymaZ%Wm2*vE2y;M8%l6 z{iLynlT(Y2-D%^X`0(dq5%STdvf* zx=iA|9}k%C-1%Ovn3Agwn>5Z3cgknzK}@wwL5|(4k%L`jx}(GqV~p#;!h9|kNpzz0Z?u$MIopNw{Hos3shwUcaxQ`NprF*p;8D2=9LCzW;E?g;Op259Xg~YqX zp=(OPc~6-npep(|^G|Iy4FuqNF@wX<9W!-GT|QK#{J1eLZ#RtcQAtWd0~H`!jGCPV z%_k8Mj*VgL5gh32JC1_v9P?zfEZE|h_=INO>@aXNI+~i4;=_VWV>GcQtI@wNVQU8Z zWN_1KUxuMp6{(#~(m*Z!9SiDSk=Bj{ot5)vElcU%mgFYAGl|D$n&}kNZ?F|(Kluv< z=es$7#wt0AVdJP|imK~%4^`n>FlcLnf#d~48#2!@_W&-^hno+y*fb7)HpdYyFxTGn0IiubuF zCLgqmN*c#vM@y$tETMC>)I~I9T4UX)N(E4r3ZN<#fV9wAE1p0+5NxJ(9TP3wmkl=4 z_Fxbeow)E@HdyU!5RSrS1G&IJUAw5jIuE9po=q|JhUpX+(a4`zOQ?}^Tca95(W2m? zo`M>g@1(H6NnxRrf^ly4Dj3iv7%(oFoSB$L4#sz25pseN)aJ+RVq#F@IZ^}`xH+f~ zrE){HkdIqt4B+Fl=L+)C?)aGP_?TOO55b@^!GI6J$Z6RLsx~U9PK;@@YdFmFbfOy@(1M?MwxFoZzc~cWyAu0 z6qsmN^$puHXDDcuXfLQvc)Rb^1vD%FdPKV7NC;Z~_`3XPLL}HMD;%=#58Wgrit$^?fL2X?qgFt8g`l`!s>YzO zL23nrR|tw5rpgTpJET@Xc!DzR&od@%$JF~Wgh|*UwF1H`gsT*|9u?G)*fq5R!h0%p zf4FOkqv&7LgkdzzvNG2m+3a{9_tx)R>!%NFlZw1wWIwmHdH24=UcoRcdo@?r4y}r! zt0K+ixW2qRuTMSFP3v5b&|v;9kG?N$TquINUcu7vOUg1hGWt5K(-?wH+zgw@bsCCC?Cge9DomzBKr!p;(5z-avofnh_BOt_ znkP zm|L=)!LB*H;@^-No*6~B3MJ{iG)Pl-{jf8^s8N%8oAOzpg}%}7cDA0O@iN7F$l-mm z=!NPe3&%0O%|u3feQ;bu<$%RSFJkwK;N1%&Ek6tsisgo8*?Bi?vvN}ig_ZjJSkyEI zYRs9WqH{CJBS0JLj1`5a6Uw-!TYW`nlFbmUl)X76OEwD z9f276Mh41$jISR@2hI2(irI!A)~#}A`-hG;`vHA2Pj(~CzJalVWU$?U3g){C7JP#W z9>nlD`)4fc{{{}Q95$OX`{mFK91K4_op4k9L-53>Uzgto(FJ2>PxgzcbEUJ!rj*7e zQ0E?Oa!uw&Dhp+Yus@}Kq_S|NZ3Gr7*tk%`#tkJ#TCS=%G3bHOqI}VK^08(`g4t&wkHgS3m9C4OX4ckF7YZrY1`Op*8r6d;w*pG*jh(a zovW~(DF|v-x~|ZPP$~_gR2o=Sny!xnKKKbP>l}8aDL~D-nq#FJn*1u)ru&t`k+_Pz z=@GqeI>o`?-^#af2A#x{V)|eE_7mabOuoKen*8`+_cyG*GN*ei0#<#PNK$?DIp7a2 zNPP+B;hE-*iOB-dM*5PUK@IWxf@P@6dCvKig)7ANjnUT*mqa}>WQ6lmmlf+rQ`BTsrQ-+s!R{ZxE2`;png;$^n5 zc$qC#70z(fUm9^*J#64SLpG896gB0Ra?T#8>dMQbs)pSZ1!p~%uWFTpROU+MHkC^$ zHINO+xL)k!xe4VNbiz(JO26M~uRXv}?W5}@}$Haf3>Wf_% z5t-!_S~yvu9a1lw*G4aRm3oNxi-!d352&fkHN*<0-^?k6wz_b6zO5EHw8cY5YYfy- zS*^C1P}krg$vlg7c$vLf2WZ53O9s0+B0>i^+bL)6(3O*Y3~?0YR@fY3t>%Y#Z)DS^ zc0vRfCp9r9d0MNh^65*zoG+xL({km|wVXY`jpC!ue{`_d0Nh0mckwsCy*X!{^K2#= zyzo*!-L(#P-8aB}By^TN`6ErYqYCrGm@#WmP=D*tqoaFrZ|mSgy3JQ{1b6DtQ7nt1 z=p+g)NK9lO{_q>cdb>pNEH+Z;HlHsBN-+8L5lL>mh490@A;)+WDB6dP;;?Ezdp~jP zwQkh@*$3ZaC&#zJK^;1ay|miUV-?gl}S8xLv;F9$1#5AuXf}>7(g^T2h%PG!^IItI%0<) z_4z*vTkbVZWL+!0Z4Lp!+FIXXDxmSNjJp{Ta<)t^Y_pf;wunyBhhan;?oB2-Ta4IRUK;x+V09fEuxn098#)dnn`T3A{=`L3}Czrd1&K ziZR%Ain*(=mx*SrRanL=F5yTgVU_NmRx2X4kpXfuyFO~r~r zQ?sSXnC`bYH#Ebm9PI7D47yd@j7CS(paHFeZ2#-8g{ zP>S6iOi}ehr9MB#hLK;$X_UcrkiWK6HnC@DWYR{Yf5du2K_wAr2AVh^tbo8lTj0QW*i^5UVBoGoU!i(@G+#K%ms?;*CtyAFQB zw{La!63%`#^13K{57$Yo&c4laE8gJGO7xc5i?F6AyTU1B2rtqnjf=G$n0h6BO41o! zr8BxJXLQPkO;~=+r<_`Em}Fn@bXaYvwg9K5)K7G6zTzu|=t(R(_%WIT8b}ixNRt}K zEv|tKYDX~&VCtd_rXC&sf3}O6x*@%u zd)iubv&&$qxx9w@6=p*C?RplUfdADd5#cB4P-{q5YRF_M@R*QSJ6S#?z==WX;C*L9 z?|=%p^#xODU^#zzs%P0xjfsAr>E+->Iy$(@;SWVxOWL`L-|!D6(rgz7nZdjT(C^N; z8lc|{JR9HB@5H?pQB$~`$=gT0HKhB9u>6_1+9sT+cCbZbdbaknbQi#DaDUe0EGC5$l~53fD0N!_GFa5k zra?*7h;|16Nm+roq~5&6-tjryHkC=o9FcnPYfTBbC`7%)LgtLK$lWb; zq{jejccd1UW~}|hMGbNBi)THkZph*~XohbRh(VI1a-mcDVktRpPL}829BPdf*bn}M zF;^-bWw}a7T$B$Ubsw^KBh}#uf&o{LB&d?Shbyhu_S-_`9un#`M0Ost*0Rx!U z9SRO$gaEE`E($^z6N$`_V!s8E!NBLMIod`IN^K$lC-7o|;#><$`w$ zwLy##<;sIgdI8qBoGG5`K5T)y1$sUH8mHsfZgiBrwgpXnHUypyRbJl`yE!rirb)KbTBnaX zq|O9u!pnL-&A>?s3auRMurcOO+<6E;i|ipmDC#Hz*=+2^NP$S#W&Rqt<}xo+@~`Xi zK0TsxXg(~*g~}|$kfn?qq0{HCo91aRDU?@SRn6K+KHFr<(VTSml}u5a?txYJU(+b_ zLriFYZLrOrVTj3nn#23{qe2olb}GKSUP<}oOyDE~SN$qSPCwG@Z}I8W2=3sfJq%?r zTFv1Rlp7n$tqkQDp|n_-s0}5Ij3|!)%Ix9%BQ;`^uBE3v{q+(8ecFVn14acgJq_)}9E+?W2mD0gT?I39)Rq}XEg zeZR%*KM zWhraJc0L5V0CzpB**v*MI96vz3@>E}U?;$9G>Sm0jy;2{2)3s(+UNPcf`yU8psK0( zckKAl(-YaxV4CAcA$qWnjXO-m5q{Wg!lS^-iyxt}@I5|lPXNmq$H1InOgWr7K{U2Z6?0#L*Uiwm^k)0r^Rl7xJz~9Flwb} zH`uL9=;PqMzQ=9TAlpF7mw#{PqSUY+I;37!0kHzu{9y%E=hj@|QrDHZ&~;3zIwT+* z0c8?hSGm^*73J{_wZ3g<630x5zNkT)L*;Iz7VOx(A5Nbm4ZxhF8--z=ghSUpYcOA0 z!*-D(>13Tu^(c)?EBhSnq9kS)b5)x);5@td_XD(xZ2~2<`~6?!|r=3?)4>wo=J;1|RjP8z}xIx`7=Lh@l&Z`S%7^D*t|E8H=r~fPdtEwlb#h z?@V3usbLljoRhDSG0%Lw2sYPMEr3}z8w+c-`C%@E%ngG-`s^!p`0yb%=CYFHg%-yX zv%}H8a)-&!YR&dmsLA_g&L)Evf>2n&de_+=av@m2T(sFxXvKsF>M~bO5Sl*$63axS zA|Mw90l1Np#PbHGaLE`xyBy6w1A^_)Q4}c5@r67R>)u(j!Xcr&KWRPH~ z5BKo4fF=aCQZglHhB(|3w@b2baq<*u#iUm+zUj(HLU&yOzMcvX%{v4a>ic<%t9s_) zyyE_m=-s;m`>v_4#Lr2oGDtc3!fdlJcFHSUXokgmneOZa0F${#|H5 zf3NrrXK!lAH~3|%w6F(dT&M*9u55^9UF_ps!!qY0j7T30lS@=NAKW=xT#VY?Wj6`Q zpf3k*{*_A}q%*F0c$$ z3c3_r@zaGhXXlR}$T|(I)A3s;27F-Y;-@gY(qkx~USLp&><{)>!2Y}`jX>LN(F~^f zLducO`oLhqU(FuM=&a@9nq2kGOv7+@UDcRJq>3X>c8r@br74eqDZ9`1P<*1;C`bm6 zF3hK(-BB?6n^BO9BQeE?2$>UGpdU4#0z5fCRZS^_h)(JiVhFCgBI1VInVY7@yf_3; zJ9p&-0iD*WZ79<{gv~WL${U$RI3>zjT0${%1qBTX%FF|@4;DqInBkt{=uE~c8rnh} z)7RNTT=JuX!|%$Me2o5~={~y!TR21xK|c=ZnyYFzAj;+ivoBMzoJc06lT=CC|vp8&7&fLq|Sw@})1_h>+g?6EG#TT&VB9ZwCeaup^rA%W#6#URMtFNZ`d zm>YqdFz94{uDLZ48O%>9DC)sOi@#JH=sh}vzlm{J04nGC68OXkHK|_Uubo*m$k<9`_v^#a}rS`uKXBuNV9EfG+B zjv+y|n8pKgyih9$gL|n9tV&&=KXzpt`nhBmLeaS#32WU zE!Yq-@TeS?--4GrLVHCFX3bIDwcvveAG`$%%(dWV(g*RkBLx;+&-T~gPkd%dcK=aa z{C6J|6+gI;_=SuI8WSlGG-hhyZ%+KvPRJKOMkp(Uw8neV2u_8^S${TZ@%tb zHN%i#+?V`_RcyRTW>Bn5Okr;iio3Y^>O;f0c@5-EU*Y3sfjRT-CIv9x9;DuUm-}nd zFN#VoXo#Ed%sEl>#Wqo?n@H%AiGbcj$jyA|$uWeh3jTInzWGuf>VT9YBxjW{hWSiE zg6_ir%Ch}iL^uxh7=sMvp2n7gVD??m-3a)f;Ov>WIt_Vw^Aq$BirXgEt_&)h^W9sBTDB+KZ1-c~`hQ~=aGM@_FzC1Nww~_&LsSXW1dl^tB=75v~n~{_NQRAePVv32T zGNu@tBUzHoYHW^9L_ivNqw%<#S||6}pv+y)Cy|hyQV`pO#xkb9x`vk-(%iQ|7=7yD}ny&gi}`mCtXVI_oQ z+fiZ2mjx(V3`E)F*@}YujyL&M(Ro$VhR7@FoU1f0-|TOl>z{oGtp10x{~5R%hL|q@ zyl=exr~(R5AdPaS7&$yP*`4)`#e&7Dj@>bo-<`wIYC$SE!}J%Y?8kNE$o9R{BWKt! z40$Ndxk{WGG`w%K^q60a>rQ1*vUDEG0#WPI;w3tV`L7Rg_Aq>Pq^p7Fk&Ef1t!-Cj z4X6xMjwH?1tTp;@lFQ(Wgfs$Q5;pExP_lc+$iJZgN>PL$6VEZoPmOy84@){m{v>2t zCoPZc`wz~FF3G1cHowUi4dy@Iz!U}iN3mSl9X4Nv`OPBSJCm&DBj`J+6t5VS&T*@` zDR_h`RCig>eX6~F178~Ghwt}0?0q6Na#{$PlQmJd{XjqGBs`&E_-k~R$LT%{Pzq<{WfdC)N(ON_-8Wut(hk33; zAqYUW3)1yHKxS~^OOEC4x!}|bbQham>G4Q}^LaeMxxK6wX2Dw!DY-K`~8H2J>y|sj0e;M8@0L-K(4$NRnKJOK$o@uSEo=^`@w+p zS|;?8oUZGVp!miLs&=k2Q-=@Echg4e`mQGf1<3;`u}Bn#&_L!hi4Sh1yG9!VO$Gwt z1n2bU+Kou?7X5=I{4!BEpsPvd>>+0hgAq_8Y0t8yn;@W;_ppctZxJa0pckPgkWZ%S z?SO?Hum{`aAua-3dSnaqF&Y0-V4~p#uVMd67_J7T)y)L2{+i72$(5d4urbw4tL-}A+NCh^DT!z!$AidJ#Cs!;obG!2#66Or0@`89-du3b07 zwB2PRtvr+Xll%A?#VMx%!?Nx_=QMYW>Le+h$)kc=RU$)vq&wnr0EFnuHKTT>5G#xa z(JG&)YPgCfJ#mnzUyyj-Nz!wnf`i9%!Q*+6!(8mj>s~V3HJXDGfP zpW;d$4n2hB=fcE#0>e6$;^BM;>WTxsM`sY>G8}`19#Bdn2`IS&#sh>3U6TGflNhsr zp&^<9UDVcm4zb$k1Fw$($H<@4wB&bnH(42r7bF#q~!kP29sI3>+*)jsAD5!f_zB{c`x0I~FFiuj1g)P8*og{>h zAa&BbYO^QjW_{@fEw>^2o?8j{U-8yST0oOoPmVW!=8`IMy$KtNlVk-`@dPofn+JVd zIh3YJwq0iH=5AnKbERHN+LVF#G+5}4GfL95Dp}1ciOj#|&Fy%J~u_*>vYG^nU_eYrWSO-L~<8%xmz6uYnb#Z$v9&X5ur>_z6b&aRx2VfkP5-3Nc zxT%u7LzmU#_+5_F5!V@B&c|gc6OQum!J)+KKA1wjm1c)MePz7E&Kr!Qt<}2ulkt0p z^Cx#gCv=ZCe*(+%1HE2W3~xyb2F1FjYIF^A;plqbCY1)hVbpXRQna&@LKisP$%(yV^D28)!C?HOkdVym!RL z))YH+5P2O~k6Uws@h0z_Oi+1_`IkJW+ApdQ`LPyG<*PP~cyw=O@3k$5q5@!E1;D%t zu%BidunvSBP9^Xb1)FHMR9Z>rB>6y|CDQjmhBjyc#*x135Gev99c7wDaJ%T#;FeVQFy5G+dp67k=>p zcGzCEACQwz@%?~alClT)u|9I_1k7HeD7CDY7Kd=2cE+u7*Cn#I3yQaRRD(h1>KnPH zf&H88c3c;L+60t%(>vvKc?pqq~%#7?D{!V{=% zf?yk6NXdXpZ3IkY7a^n%X9ep_PVkZ5bNRM7&uvT3Ym4fhV64{mT(FGVRV&&^B3r95 z1G;!ePp*}M1_+b$5RH}LK?U~N=NmvIND0qjoK$IE&Axy^uNIuwXyer+)eik|Kn6;h z#IFmZ;T_slFBV=Pr9!F7d)#|9Q6P0{EyjLh*S-*wq7yK_ScJkn(HmZ(26cN`%aMTF zg{mXBi>2s7zl+6J5Pa~#lUmbRNn$~<>hqpxmK-G_O>J{3bI62T<_LRga1YcD1!cxBK9~+ z7ZtTn7$pcch?Eno`QkkD%#>d+et^gxaD6GH1^sdXt@JAdu;U_Bh6S|;vtmQ)dju_? zvbEV1*1?e4cwUT`)OKV5gg&(%<@x96YQU|#43JB@?JIXM7q`y4Bb@62MQ8|8q8}0Y zwQ}x6Zj=|{pxOFw+NSlwt_0AsQjTaEnF21Q6iXVEVzNNbU3tK(JmBV%Lg1S(O5J_f zBk3`~^%&sYLg!}p5RuL1y)$aZ^KxOL6YD^Whe$;VaEKI;C{m!uV)_nroQxa0+pO=B zQCE=xp#fpNMEC!eP->*c`Y3o>UW3x$tdCyTJF8+E3CQxXN;s1?1m*>jCl|_~f^vck zD^C&z|B=7d~)2{}}&g!`hCYau3KiP{Z#s$4ySMm;qu6?QY6njinW zd|6w(F)KGm;?7@O7r%vNxc!IuGF&Y6MdCjZv`zymB*WnHIq1<|#$KYmJA)tbdY(I8 zY@y?Lfe?>@L>WC-uQWoSN9mXSai(PBdIq?PFyWQ5W4JZxZN5Q08b85j=K}3>c&i!@ zKO+67;*a61sC8vMrzR0Ktv;5C9_;KnpX3%{hu zzC!LTT!sTLOy_SrQz9y8GI_n!@;I-SwaH@V5r9fAeor|5N7-T7T*FS`yv55^6Xf`hpA^Qt3mb zqbgjKIb9wq4b>ng$(%|jCuk7k1@?S8_tUz-Dt4o@XH!GzmVPNp&0T@3$rBQn4Gg!P zq)AEHfc zarY&FQB_y}0T~HG%(!4vH^zz@1vR!pgNlxdIw)$is6nyDx&=jz0vh+E2}%s3RISCj zp;o1pDs@5Hx&%RtxCKxP)Fmj|Hx4T5rv_Z||NYK6cixf-V85^bE#iB3?sD$AXTSH| zcb^*Aix4OG-4~B?hP48Noz2k`J*kxsn**uG~$-l6CTmkt6QN{y7@TQ^*Z%UC4Rywzg7-$AC5Uh}%>C&VbmtVC2)MCPWYCl~Z@F`YJI@NGM5|&^mkG`c5ivgXYB##J~8n9jLh!iRMvw;vpIJzl^ev3=zNB_HFioP%J<%FAL zU*NSEV23cW%9$l10o8|6dgnLNwlk)i470Dyln2em=K2NX`h4%KGaxJNm=}lSxA@x0 zD1{88)A2Bmkl`{sLwgDgU_U8Wz82&OM%@KY3H}Rb^V&m~08>}0__of1BpW(aJM&WyTq0kp% z&sjC-iwRTgnr#Oc9KdhYZst$BkzFm>*rL|k8+tcq-V0-+k=4WNxbWjn@8(-3&IbZMuz-wVq-yc+^w%mIU%)$=XLF0xI;k9F%X3gMB0J4=%E0J1VNk|1u;xO zOfV3SW1cSq*~5Wox+?$z-<2xxc8h{|U{4OD%s^mCRYCj?*)ovCya0%u31Zc^N(+Qe z;w)nm2qO0JcAy3JLiaHcMQ1t?cgZ2r#*q?&xF-rCE+GD7ARdh=7DYW2M00Ff0x?^< z=*3|%FvPdY^Cuwg1>_f!(bEizebitQ)8jIdsK{5;83G|2VxQ|;xxP%p7A zy}(EyK%kY(+smrKB*#0DXOiO?o2(bTfoyCu89I{d)4c{Z7d^!qh-;gzMr@P)q{h~$ z(Hy%ArK#qA0}0~<2jjDWQseU!Yg`$qF~HS$R%&2L?t%eAv6BuBQf$~2VT#34g6mHW z*XK7eiVPE6p$W&f2DmR`{NcI?_wOIX;ePsK9qt7V#I4B2aE}mF7o*e-h7To#?1LSu zFYPF(4jvjr^@hvCsLFH%R=QiV-zj*UV|YAc3;IPj2p%BF`P$31LxR1OcIl;z%q{P> zm))e79@fhU*Gq}(rC57u5B2igWzn%D*o!#Yydt!657PAZ5~b-Pcvzv>5@ds>UmQ;M zUxiXf(_37P_Mb?N#Zu#xKn;D{2EzV;)_6o}3=7mKbueaWjkMJGQJ}`>P+h^}CarOv z)cEp8J|6Bph@vW~0Rg&XL_mPz)cyNAA_6pecMkSpfWi97ccZ}tIg777ChURSsl!?U(=IyC@ zZyF*CnfDlXo27>@vAjo_H%#-sN@&}=nD;E-@<|Wh!|Gknye7@N#PTj--cL2}UTga+ z<}KqwKzjIHmUj&E?$x}@hwM?{4QIxMn(<=;wmb8NY2KH+DI)!u_bi{triUMAc|DkS znC6{oc^@|*?-TAOPY)l4Jnt=L{9ZF^neh@c4%dw9nDIAee9pOediaOCBIA$DxJxrm zV2$a_I1(A&1!IsJhbNo4DMBdzyW~>Dex-~}5{yj}xpid5bkKQtCnOLYB53eFf4x;g zO~eWkh_XgQ3w{M_5kg!fdcqL*$Wf}}lBCcj5bc%D_ui-kVl@z&5I)7%E`&4#C-|xH zs1KZyh)1iS(h_5)3hkS(YLA$UITtedW^-<)kK8iEn8mlWAeOpBJR`C&OpGEo9?bv# zY4g9Ve)Q`|1D6!fiHLS2H+KSxl}n(D?y#{9E}rEjt{f}5RUBLrgGP6_!MT0pO0b?=MU@^uZ_ z2-SKeZ!NGhRO`WTt%z*=^+XWvbr^sy^VzvNpX~u>iTP|RWuzM6kpD5#n)^Dz)f+Y|qPM}<`{Q|vK<^;EzskryYf8@Fp(Tru5QHl(7 zv%l%Cd1S&D;8^C*fm*?>FG+$;1(1fM>!ui}naw#BB*>Ldv-0UuZjURSaXE@DW=IXv!uACM1CYZ&3Oc(5 z(V1c!f|^Zo>laXv=Vw32evmm9<{~qSm**h=nP+)P;?mTb*@EfKHGLDjo_EtPpe8)l zB4^vf`oi_gA7J0ba$^^Ff%n(F^Vx&A(*kn`@4p(d2N-8EVBfzyKEHi`j>HPBndR0S zs>r%h%8|%9NGL`dgr!dr%-+S5Xg)D3fx+EPmhC2J{pM6ookXy}J~7ED*m7<}9z}0v zUMrdN4f{IZphIFC6XAt#1XK*2)o^IK?3Vo``-!&=hqn`Ld&r*uV0w$E9J$xV(0k|g z+RVwv<)`7$Me+Vwlu2Oa3=zybAhh0f0j$tSTK_R1$YXp7l_ zHS@Efp;TM|fjbs+iqpVSP1KY;?s(~vFv+WYhuYMdU5)?hy}K(g%56g~_1~ty_mh`H z0t}qGi)X}3-ZwbJrHH)8h*_R^=DzOfPZEN}us#xN1t{op^AYg4ZV9+0VgpeQi&u6L zhS2?xjfiH<7es>gyM_N2{Ib08Pv0>7(}6!|G9J_c{y(@jJ#%ljbcM+}I zfK~{f;%nce%!i)W8jXr4KhGlIRYSatV70^vr^R!_(JfY98Yl+=Q7(d^q;#uz_XlwX zA1JgSuF$ny>54qaFl`4?05l2?7(Y`SbOrOkNby|ELumzn)-vX)BPQU8K9=>y3=j$& zaufu<$OOI`L@1uTCx12VoY@8Uyz+i5XpzT092DY@*atd+z&k-f+W_2iw&Cd`!G_z( z2C)rKk`0gg(h=duC6my99{W(u{wo7?t|C3eJ}^2KT13`CyRi+Gq-GUuLp8B9+wdb` znYlP<8*U(?O;LHd$ZNYblH}owEgh zZ=ONzY1o46xTL^20 z>X7Y4Ed~L{%q7NaFG)Y_B>3*vd9^sE~NAMqrz{GN-^{e9zBMPf-_cYXz!@5&^OK zG^?N_=d;06=U5IMBpHzs9w)pZLfRaozuH!?d-rf)cX^POx005>39vkj-{rusobsp7 zCY?VzpZrcaekT>tBLorJQb$uD#NdDX0M7+a@6s3CV|JhoqS9a)5I0KT0;00Ups|55?Wt#H06=*)uKPP*^9&!deDFJqZ6-6YC^mfYf~NUnPQd+X!HNieX(L9_Ld2g1}ygyAV2r|0NdycPJ{| zg~X!}gIpK@KK7ESMHvw&^bTnW#P?;y42sL9dK{iqVRvAXj7Do?YW7JoQNDb+$oOQAP8IQPaMv*O; zVk>AMP8GOVJwJ;-tV_@|dYc{!I_25FH5~jZOf?Ob*XNz2?af}}sC^JxX2+CD!*oIm+~;aM|G8FomQn|6BhOsDe(TZN++J6Bgh8+l{N{JAjuN^ z<%G5VU{LFBhlt(7{hf&Zz+7ifeK#Kawl^PK;0Y{@ImhOmai7{q7*W~5np>?Cfkl;y zfEn79UEjhk!~Kmxe-O&?;2(4YA__N#m!*r|{B{tY@=oFot{12*8ZRfgd9iqlr0n2k z^@ar{+%-7myFS3pg~peEjyIy;^=?k0%il!$W4w}Nf1&+?z;uK;CP4fBXzp}$(E2UY z7y!6gs8X6!BB!#sxNiXabe>-coIBXt=xrpGp%$u)@8@I!0f@MO9VJ61gEX%=p|rUV zI~9(WU_ZYDGC%vJOKKBoE?P?& zzsA1#1Ne0zyWb$ck9hV2t&*pGq?!`bvbvk|KV4{pWV%D zn7NOOX-OvZRz_PAu=*GOZL@%#Zp2$Ru=;oI2Z}X2Wy3w(|Hjyp-ya*~SHH-&Rb@V4 zK~z`!&)(NB|D2h`>Cu#eVxE7RqpvvtiF!a@GuJqx1C3x!a*gL_|I5bspXJwj?bAMA zZpc3EeTK77yC4Po^nE#Q|4nwLUl43+z@7XX{^a@)zi?g}dguIhBjyvY{p{c3 z*S*K7Sqa{$cN=&B;*0}Up^eed>xnA+KGX^rUN9diM4&b zJ2)&vi@j{=67Sa|DEVyFz#V>Hl!5m51oSCAVqmN8-+C;D@Th+ETtdVCt=YV%^^Vsd z&dLnZwxA7S}6)l5a#eOegx zV6;XTv70|BLXWm($KEaKtwp`2=yD4;?#Lo3##abE9?WriU!6smd@u{^QQ6o#x4j2% z7tJ7mrXvcQV+E^em5L`Xw0-Br*#dTs%}?z71g~r7AOwr9yKa4*Ul#1VqPxx;vfB9p z;m)y^5@zV&@gzcb>j>eIvgn*m<(M&YM2c zk@G}J*rF!uoVzyA`SbtPmF)O>0gK}6?Yw8O^YZRG?`NIg1wvcr%|%~BB%L7fWri9n zjNOXQrgQ&4*1uImxq_FDeUnujrx7p6<#gOBmyjNLT8t{ae&+}!E4DH_vlr|kgVHd! zg5>?EhVbQ?maf{u29_uXz8<{DQ!UsskNe{&`o@QItqJleSZTNJlln zj;dTo&9S-vqWEAE3S+(-g{tW6&qZ#I#pdyau|ro4;s*Y(ZNz5qgHeea=x;j#mUk&K zN|E6;<5%W-Zj(pR)%-Emeq6*KOSlOhC1>(S%6^>0AJ1?{J4%k^kA3mOOAJD45OBzO zkLdjSJot|?`j7DbkzbmZO;RZBx#BQMW6%Xnc$@r$44sFCO;~}nwb%qxNeV%VuEn0r z&io$FK>B*W*#qeC$!6{W@^n5RxH*7b1i#{IS5c_9|aRsylL}^Du`r~E1!yn5X?r;r%LmxdUcZZIcn?!ksmAex_|!5*WK(EuiRfc@Ua`nec_C0jWfAjK^9 zT?x$7vB_HzUCT|!PW&n^KU<`7>>MfOU<59>=Jkq<#Mx+PvvIH!Ph2|^>*_DQ4|Pvp zE(hQI1typpe~6u8gWmZw9I}Y@gqxU+-X%>sLNE)p0Q6$QTeDP$2;iY zHYiJMy8K2ph+UzM;Ef}TQH6+qbLLB(3}UuWOqz=>{~l(gx&IY%+u=&y(ih`6+joj@ zd=QP@=VwUYQBGRsz1IteuWnH|qB)j*51pqE*y1pV!UT?`*A~1E8AL!$I}FCHx&J~` zn!IGvAuK8CgDfPPV}-2J+@HU56AEtMKs@Rjf-VHFQVFmQ#ZOFK@y z3jO2VgmOBPK>pp8gD^5Ma_E7=$k*g|h>^WUI!6BV3}Ymq3pwX~OL7)HD!2ak@rHA# zRL%ous<0~vQ#tOaZU>7(G(ZnuE0TmL&&s)0I;{1|SmtI34D*syb$h_=Ho;G|_EC`O)+^%KBjSiB+(V&7_&Ku14P7#Bq-Ij zxm|Dgkzy0~g1^{rGr8&h*L=k=fg3TP39J_PuDmZ`kpx&Z3u+jqwUI>lGbSxVlG)S* z{t<^tic=L8n3ai!)Iy2aFc=|w8vrG2$5WTYj^d~{X@N7rq=oEanMkZ?4uJti2N$Jm zz_to*Y@mMvlDFX4V;*Jpy;MYZd;h(4|>p6#wLHsc#5Qkyv6&mc{+C4nVfKv zd&o?1#_4(GU(#%?jPWckw1gbakiJ}uD5?w)-i~H<6C`_yZ#2@e&|~gZ(7{1-7I| z4Lm8;l#*{>VdDq4N1Kp3^yLV%m)~YfJ;Lk;ZJ9g53;_UieUZFb7<<2$Kl_G$QB0W$j<2I7qVKt8x()y{e{=0+96@cWZ ztoiSA;u%<9Xuc?(s{j5Sgr~)gbWEvqqkhh5_cf{Evww^sUn>$@zq$qQ%relK%R2;@ zcR{UjV5?+dmGQ4jAS3&AE&Fwt!-o;+a;tP!lL@SLivvFJ5u z=*Oa!_CQi&DU*Q~LW1zj<{d37Kn5P*AQVJ?yX6;p1AZG&II+sLH0X7#fSAFZsp~DL zj$ba;;Y*akIyC8-x^P4^3_Rr%Lr_$Cu;CnOp;qCq)*^7QApuw*34b#K6==}tduFS44PJ(=o*RHg}T2{heeeF%;=1QT5>`PHul5!8VL5%lJaTB&z9P|3W* zFzn^+(CekXo$}=o_Nn;VCbWWnLFNX_9yKg6zVo`RKjM%`WHw+w8gg4DR~8;`8>0)4 zk0Yyx_s~{2dF9qM-*$RCt$GvR%i05HwVZ>m27342-qGpp@coibuev{e-dvA*?|lAR zr+3+YIH6^0M1~7v7XbvO^45*_ERj9gnS!qN;F9k4>zZLrQb%lly}zU>>R=Sy$QNs< zpbQ>hTQOcYcVa3@Rw4?@&9D#uRA$(F6Q9e0Pi}_2f&IEaWPj$pH-~m!0=0bmGq1cg zR10{DHz)yL67#(qwgrOg+n@QJ^0%665>=e+hxTW}rsQ^FR*(=-L)|u6XfI}gGNVWt z+7Eeu3h&5?b3qPTKy8o^@}UJQ0l~QU^I^G-lk&>kB`m8&XCQublO}P$9amEFucUW)U5%cm?f1HNf^b0utL(7|Ee};mj(pQvnM*23~4=vwOcUd#6M%eicMiP@GX8d|<1%_@S$cKAOHb!ymi7soQMpo3I%ufuqK*Z7~W2*fUklS65o2p}m&lu4LhzA27f4t##J+<9O=!CJN;3e(gs18n$ClFxs zn@#gl^EwVn&GQaQ^=M5k?&v}*eZPZCH^b)PgT*%p&|J?=>^b*K-mKPXP--|QGZ2(w zHb}>I92bZtXt705SjXGy9|1uDdUg`AoX81*nJYwe=kxl4a#RX}Qqdf1Ttd2Dk))vf z7G8^V{Y5e?DB)i?c{n8~2qiW#aD;EEMO z7^^b_87d(&4Lj!OtXp5lN6f*xz*}qdYRv@*koshBeK9H0?e)s!mFjBga;lyDdrR)) zFHWjcsZ{znNKqv;2@ju#tth_n_ktbqdt43<<|0rHz>ESmwFH;$Hxl10YQ=(3E8^rU zTjR|`-fY8q&sUR<&lZeo8r3S|pOet00h-;zThoyP=k>S=J?mO=@jIWTo&+wOw1uW@paN% zHuzQ*5=8tO2`AJBThN1DzR+tP;RhfoMc8rn9+h>o;Pne=*yU)>ij4$Pz zSS0=DOs!Ya3(07e^f;4EkJ~B5jk(i`r3ykvEuR`bgBTP|v0Z@9DQI4WT0)d21gbmh zc&dFVqtVVJb}=`Ei1miG;;8+r=!XbTT51g?RvjorEvRL2xfIipyH3o>)~4pQ!xPb; zKZw^rSYE=qAejsSLy;lD_E!jusdgAO{3?FiWTL}Q780Q}9Fo-5lfvOt)3It6V2o0L zZVFI=-gc^X;AjR{A_%}=z?YOX_n-F4AT-CS1CBrcHQHcwy5NwG4QYwt2S$bd6g!N{ z8_*PGAa*F}0;p|_=a8>_by^mdHi&M5}ao?kHr#AFB3GoC9Ja^ZAazWGrK+EEK6 zO4GL`hb;yTh9bKabVku}kQ6@4!rKZ$o*yH7Ig~Ax9)UB5`FTr%Y{0wh@_oz2BZ;lQ zRFh{u!}raB0OmjG!2>bNdi;fabFaH3SLR+jjMBN+^~mbs6&GS+wckWctR^3XdDiST zOE9Op5JiDG)p?u4E%41;{qyI4(2QD|c8P!MY2onwN)f|Zx&({(mzqegT!uUUOsUH) zn?lCFz`}tgX@scTiI{fLbQEw*j%#`Qs8q*7&;!Z#2&v? z7eu_iv(=`6jaX-R0UhBKCVZP1I^uth*JJ;n;~Ly!mhNzAkV)|rk7t1+XvWG^KvtxX zQkT(-EUd9A`YZ7cSo9Bx&Y}Od{Ea8}Bx@4JpkZwcaoSzv7KqX&aBKx0$h6}(kujFl zA?ZvPL13Z=B*fwZ326)qyi966E{%2N507TSy@|Tq>`u%EGB8e13!+lS-UU2ZGDQH` zRI!{LN(s7>64VswLd_)cM!EbJrtCnFn1ZQ5M!6#6-~&jsq5bVTh#As1zBwXyd~Jkx zS-$LU5D4@9LCC{RJTzrqg^z`F$?QD1Q*jt^0BJgoZZP+@Ib00evzx(Aog8{*=Ig7h z*Zi3nhu4(n#LDKI)sXXa6R<#~T(bGGWQ*DO@CY>t9I|+z;_T`8S>3BZG0A@VX0NKcBb{ z<4wn2+%Z6i5)xwYL*L+7&0U`#BuW+M^y&lTL%EuYyw~JGZ93L}_dv64+3d?dvDv2! z0?l-ufM$P{X5Qyqd}yXx#|{FTc*!KT_lt49QH9m24}cGHKp1&jrR4Ke@!%HJEJ97- zdA)pg2W`0mE*&;XhgbU@DwB#vOJ@sXTg;0xX+M#}72hY1}k$$o6Ab00Zf=@GP8PtH$o%6AUOeb0>Wa(Z> z1iZac>3w@}wGY}n-hBo2ouO2Q^Timc9i$;{24sAXI+o#*dZ2kvHixR`n&0i3BOmW= zPYl8SwG|4pt8vBSp0kVhnupV|OKfnMhuNU(7mx-vk7?-Wfxz)CWIz}}P>`^r2bSla zm*Jc0Ch)O>OJf;+tQU_C4%h?Q(Jfd7Q$;X1_uw@BiRT%B+B16$yD)1GkUg{b;L!%* z`P>N)Ap48#D#ELzgj5kle1coxq2r#}>#_^8`(%ge;RC1!3E_4ZskW7?7R&U8IA%uT zlI@#~XE*mwPl^#eS#Q74+xQs7^}%k}zpq#OQthvg`W{Iv{b=|T5m`9j1jQ9JaL?#1 zc1frd4GoKdNKsip45q^#Iw_haJPNn}FXjcMu$z7;-p&1QX`vx-GJ8M|&Vg=33ApA< z-Y(W9S?Olm!A^T-PYuFojvWZ7@U*+40pv7@{R(W=_undjkl+n?7@~Bet$gyWf>fHZ z8fX;vCLt=yzLDJxRn84nL7))#PC{vB9648z)$gp|f1vR0nN7egKDD=KHDnJkNu$Y> zc=a*;-g=$P9A^!z>h; zYzbV@1kjm=u5^OHNIGS7Yn|yQUlABtyCmQs(AapA0@9YO z^pn*{dZnxR%!6Hkz|tL7)KEYd`S?6>k&XI+ZcvvX8K|z2iat-b?uu8%O64ioNo5B4 zA+2r&8=gVPi*Io9KDh;E^Kc=Ky`OH&9>A$YD*9dB|5z6ie9)d(e5M!&r^y|nAzjfz zzb-4vn718?5Z|Zn@UEaQ-(0DS0m!UKms>cHYJ*DB@^=OA6no1Tt3z`h%iP4ZTNFtZ z&AQyOq%{aCMdCg70d8vTW0_eok)m|$p+`CBM*S)}RIUo0p&t=3%rT@(+bh|ymR$~K z7T}7sLz-175sahZsPrK{Mh;t6eB(<3f#zrH<5Sp0$DMP{{U7|hY>%T$N z;0oBqtP07Ri>5Rvg_ub~q^H^vK%=ck0*r`Aqb(x(+H~sds5TK5qFmrT^HxBEVVXzl zY_P_ptyb>0=)(Y@TZry+hx(8AFN87;11;BZ)7bavyY_F)7^L^TJKXo_n~aed81prVyPZ8{c@ z4ex(aCZ7E;il*Ke(e9jz%*Gbe?0?we35;ki8Ut8C`*Ij&v(lr(>sW#qC}Y&ooxqqzb0b-fa_g1rGt42&RqKt3Qaw z#)8WF1$Dq>zW43VBvAcQZ=dMxUwW(9SIU;_uO)hWNpB1E_IAfBotaYX6>|ZuKi}nk z!LgC`;8XsRZ$0=h$pr^{dqqRp<-*uL$m-$k{YxxmT>cu?INsQ91(t%hLvCOxxC)(T zZ*V>9J>38Q?D>N2pK^tRGg10EUXq;a+gmK}y(D{VUiumoxdhD5?XmekcD`U8@a^t= z!F?6m9f zQ$gU%IfYb?j^aWG7ejqizWEYD#*<^C@&%nMA)96Xb|oY0`qkBv*0@gDTV@U1WN7w1o9o^1;{2(@*JB zTYr8&d7v!`pr}Ah)Z@`AzsgnNatX(S4hvZqW>4C1d}Kl#6x!}VHPE_w9JQociBxw_ zp5=SZSd{m6`b=k|Nz$a8u}KRXV7RTkH*^d@)P5aj1x+xC>Dc!}bZ5Fabg4o|?j5<6 zZT6ClsmHT^I`%}B9|)APd%+TikI^}?8L3%!)LbyFujACxeJU8VkIA@*pz95Sht)!`fazD?9jK$E?YyiJoaB&TX}QzWm^WN#!d zW)cUQ{{76e#*aIH+{Cl+P!qkKs5J^vV@Q&w*gtc|h3D6te#XQ-@i-d2ovby8 z{gImNgXDgi+ziP*G}#x)ZIQ&>WO#@>bMlPuw7lb!9VY46OQ+_S^fH+rJ4uHbDDc|k zwdb&;*AX^UZ;JF`TPhmXQP65F_)%@YL$!VK5@4<$S<%YeZbUm!JZHNUrhzCO8feE& zNGv_9cuum%!SmV+NA#JGY9#z-p=t^Q)kgL_c;3qRh(0f&8kzDAS|1E4*ks;&C4H9G zew}MezMipfd4giI49Eq0*^Rng?H*Em@BaNFIE* z0kj~#HRDeo2jpZUti#tK2RdVfZ-ey3bAHjQZruf__zD?;2d7B3Fe#$@7tJJf@6jYF z_!~`f>dZ%YlP7y=c2agi_M+^C+4HmKWyksEC-V}EPs^T~JtaFPQ-B|tJJBvP zotK+=;oF2T>0|qC91*>WQi;b$>g^D{?XS1dA0t#c4O>iHpwcB?k>{;Nw1(ZhFD*U+ z(kzh%Cm|R)c~VUWR|5$+3CkgKzz7Wskkj#FNY&lQAq!DWqMCHyoHvsP%v@Res&CMh z*}8r@HUME0TY0zMs6JC1e-dw_3^|y6!!sjhyUQNKcrDt*pTMm5Ev4szeP74m>W{6yCL21VE!Sc$Opu-_t9xc+nIc+~2-r-w^nSL6E)EZ&>m3f%H7asoS8PZ9Y*^pkH8W<8b zdl$X!52>QNA>DR={vlP6jAZ~){^mvuX#&DlGCfmBX04U48D&Ny4GZ(T*JH}_bZpdI z!s0T)=Q@MmE(62yCahDQ`Ar$VIjHlSy>|s`>Q`43l0&lwrg+EvM(&9DYVezXZmz>( z1jMz>V}M_c3=SV(Yk(e3qwvV)TKQa_m9vCvx(1`2mMV>@3h!)$B7)FLpvt|6aX|{N z9#{pBcNA+yC^QKh%5g`hl1{pGI@T+=&p{7EY8=RN${yP=A`lo@!omd0O%%Od zpW>@gvbsGAdI>Dr42xxg1-%-&Cs~M+X1YpPfn`3*>!jSsSigYOWtf~J2$W>-6JP;) zf?_fDLL*s2qE%zO1FwqB_@azTW!B(ww^32TYEV(`D4LR^A}fK4V@D_zU4>SoqE=KY zmXH#lV!}}l=~9!TvO6rsa%(eXG3Yzej&oV_zq00FK2OzFhPh6jau)S5jV!wivH zg4c)R1>QMBI0y-JMFilD1O|L1?ndf5KUoMyT5bth3_pdv z=%$9<%oJR}e!&gT9&AjtxT9W86D-5$_e3p2mDIv>Q@NXq_l{hp&zNMjtAr!1uzHoa zo0um3qz95)ZU?EKZXC!gHk27$I+l9X7ca$(;`QE`sPNXAcug_!VsjJT`|t9FcQ!09 zWyys1qgQmDZGa(coE(s9C#C6!NP>sU1mIQ2d(Q$1a5OLZ2yN-wIR2ow&=o$ffMn>|LRxxB7-?nHeHxu~s$lNynaj(Ki(ekfvhH32KOZgI6V{0*28{1)I|l z^=yu9|NBAeMX?dKA8-J{nvN_a*-)L;uv<~F!jTZiu3@mm7y3WAjm`9he%<52mp9o= zk#om9wV47e!yV8>8QNVs9ouTxKNp+Age zK6BXn`P8iOcZD>o5~ar8cCK7@k&KPjEJE@%OQH+VOf(GIm?Xhc-VIoc%4t>wTJT3D zHLHqb5EP(co}nT&kYDG8>1^mTeaW6{ zlFcllRE1iQ><UlD(tRQ`&$_Y(odh`eHlDEl4&e z1us1uofNDg7r>C>Mzp zxcErcaq%!|mY<8#%(z%e4uErIj&n$tyEM+l8xY{4n;=UYkeqGEMb?jUG4|&u7iSAW zp*up*2p6RgAf<3aTx{y;xOfdySpsT!w_02jq*mGa7S8Y(c?;;IBB zND#zvT{0ZleBMEh*)SXYqprKMnaI(am1y4@yQEl#@wKrw&Ev@)9x{SbQ1zEz;av-tIS>NWtZO zh7K_hb9vf}^IbJYfLh#9O^8wF(m-D3`&xkThY9cdS;}@0)gE8hnDW+&@&-nJXn5ph zXm2C0vZ^zLkhajl{$M1q4B~VVeZo+F{d!m)^~6fO9}_ZxyCM5fv>l^WntopcW)F8NlD{Gi_;B#F`!0`@;0 zkIiN;8jmrVN#ThH{rZSbEcwMc=^US*gyC1_`?so=nJhnw136s2F}8pciI zlyt1JImi~6HM~EyIIvk9t3CM`D&0h5X!h?o22V#5i!LLc{tsIylO%?YbI>7<3F6>b zrEyGZ1UM$;fGXu(IA$E|X6p1qg5(_c3kAil+|Pwo5LvL|s@upRA*?>pG)5#hmJz$& z7-R&rx4>(9?T0f$j2}^++;UYc(+n^`1TS&z(PH1sDrb#ucvBb;@TNm_B&ba?7Vsuz zypb9K-bgukBjpj^WOn$1@;ooq(B31pIFsr#&+wY}d2wY+=5$7}KrC!Z@S9zs%bC_C zsZP7R26v-ywI8F^T8zdl)~ZlbeDKrG6gzvo-;&L;^Y;LCbuC#B8U5w^t zA5u+XG-3tszW9CT-OrI``MtX|6Pu1DFSFp&a7U+N!Kb@)I`+no1KvF$e6cp5Hrvp< zvwqaO?{y6PKS_i}AW*>L)ht57WfrD?uAk^*V)TFGN z*@qYy@15U;+-u5b?`-3ISTZ)+CK1vGZBo35Bs4FQBojk6Nl<_g&NWn|2FO!qoKO_4 z9Qm^;cC3$kW*0gBtE*(U86%b%P$$_P{?MoRl0Drdn^~0XN_LTso%1(evK1gDyT{>C z$xfPNr%bZh+$4L!_1#OhR1?W2R*>wk+nr>mrCEN-mS!f|Gboh^&SpAkW}xQM*f;j0 zJd!PKAcky1$!7hiWFLKRRI*!)pshmCh-6D4KuY0;BzrOUS~|&Iz#l5v+#53q?|(%k zyIdvvR`@$Sg}4AHYvd!2y1Z-r+Ahq%s-xUt%XkM_W`M^0V|!ON9eLUvOX*ITqw(u0 zCONJ|;M&?-nTVi!wFv&{m9T=XK|f|c;{=n&lAzEJQzI3vQFl1ea=R26zwUZyRJ00Y z6nGH8JDA1hCR*dB_@Z?WvN4cc{3_KF7^5D42p$ zf@v=1C2xrxo)p4yj|TS6L2iWOK2~BaGhpq~PtbA8P+^cdIAlsEYXl6Kl%szsj~FnT zLJ5PH3D~ZI&};(zABngE;=1E+L;j!*eZz_eM8O+;iaz0wJ<*>h`}HrN?hM?G0?ApOpwXmY)-%Sf>`E;~#j1c46Yant&^uu9< z#OqwJO~)Q+2a zOFnob^&)Y|o&TbIZz%qbQ1!tZ15|BAH%8U=jTP_DCI_i1w)3&)HcVCUbip%SkQxD9 zkaC)BmjCb2g}H)aSQj#9VoOk}X=$qAJ(#s@s?Sm*z9C144J>p^n2aw_CulJ9}2yqd}sj}~$3}bVP5e}>K zV}$6$N~%ftNvsfl*1qY&&&{P-{_s63U_oW>1vn8;`jD}@bf1^-Nu2^ z25e;;V$1r`@blH*MZ?d85wz4~N_?iJu!_>OfNPYM=QfrvH3aQM1cky%HbND%Hx!YNm zXMdT0UhR$2OaAj}LFZZ$8GnXb9ez?(tC&aASjG$zf_JEvM6)0WU9`2C;wNVc+cA0I z9ktpC1v^sy?2DZOpxE^treY@{VVuBAtXYD0Fp|wFcG#2i>QyFoI1Tnu2scAhedeOQ zxTRGJ4dtg0cR-PJ+@&#|8kS=`)x0C@Zmm4cWH1*B9!qS8S~~GF>{RP)tsbktXoqkOBetbRKu-x2?1>PljtuO# z(n>0<1Z!%r?<^6*f{sFHWR{bDNpDBd%@KSH41UhWTtU)RGN)EZ2mB2=so_W`g#amq zs4N75xP(YIQ(*o8(g_qm6)1qJqyvLwXkpUH`gRox5UoM>(UlRi68KuOnyAC%${p~Q z5h1+abb~MZY)C>CdN&S5Zr!L1b10%E&`2Lb1ww>GcA;h3rfgw=3dl|sOm!tS^_O_2Eyah2lgv_QWP8_SHq@QtD6z}k{24uI}d z24wH?S!-yJeoNM4Xh08gha_#oZ{zVNwLXs@gP;X@EY-|Ewy`OA zybO2zlXSaFuZPDs*W}}|Km!j5jR+A^l*a?p0Ul2gegt_;DsfCn0b!c~9gn3D@TIUj z9@h!X{}7LJpRFh*emGy_L*vd>zf|tP+BM2+jKy<`p1v$zFhw4OwE`!nR&&`BByYhT z|0Lb&(ij{q9v>Eugd@8pXZQ5gQ>~AApCp>L9@x2vIIFjapY8Y?G1eW0``i1<4{Hy6X8Dk3iL-%Z3G3rw96eP zn|JUhC3hTlEO$Km;vIcadHBb+S_ZF!-vEysRV|w<$Sc8(7+bJJ;M#hjM>rjwT%aYBNe=C zeqD-k0nfc@>DUbc@JbMZFYN-p!oXKX!6%xFKDu}iKwVzSFCLuhz?T9%_$q^x4lO2! zJe6aF5D}5Bq)Vf&EDS>~b-mKXxcH{Pl|df>y#i!d6|w*WB{Y6mf{;l11Y^Ncp8a0t zC9Vtj01Z-uK7j0|B(%z)ER1#5OA67C6oS=pt4xzfL8>DEXA3eB112>ifv>Ir7!*Ji zC;$+i&4m@1I?E4RDNy%B&~y!{0$gI5 z-y#A7+SIs8mUu!p2$j$cL$UGAHDYvFIawvLO|e#88fVK#a2&R&V}>=JiMvxEKUoD( zmRsW|>(~KwiKV2a1)ksj)(Jcj1-3Z9WRGY>lC=I(yh8{AQRmnik;XzEWO@s52lX`S z#5q=XJJ4>pguefvDD*OeULJvdNW3}r-Gu_agy1>L7VxS|hXlYYK?we>F32Ygd}$PX zqB(Y#f-fcbr$871Z@MIdlpOdE5)HbPz}@LmsY`>qqC=1~eb{1_5c+<>1+*J*6@cEqB|+XsEG@W zSfNxlyEKh0pqw>9T1w4sXenhJgg{%rUCLQM8a2~vv116VT1X@dKp0qkvI55FAQ~h5 zSjittxl5MMKltMu{K)(YRx4A1u*#b;8+i}OG4{E)mi_oj-dEjiS9KH(?0W99@vAD8(!c%U>Vd^2^a~l`{2lnvD(fm92<_~HSUlJVau8Z1_F=9|gNi9~ z1VnYl7-N$r&^lo{>@KU55TJ$xsoeg2N2A)^GBz(~DP+UKZTx_Xq-+DelX4>+>a-Ia zm6CTTC2sS*vHt+C4h65gn`R-!j~e^J80Ft=<=_3Z3iYd%6|*#02mc5#$Ul`Bvk2`{ z=#b&?(?xajD1H5O_0szsSP*g1LJZjrO1YC$>yuiFv3NC&;L>)-xXIAPzw`Zh9m|nl z=$*H7n4#|60!MD2t@~8_Y$fUQvQ>Bkw&qxgbPFmAi-EmUjsRPgo!FN{oWNFAkFxdo zUq{(mLr#LXIUNLWFjnNzW*Q)oCoqln^$W<7`QDT_z{$hO(`WvK)UY5=eSH-BqDOkH zhK7#^bl4Yk;oFxocJJ(n>XM957D+|?a>Eqs22u6?IZxS`Ag-kZpmM-el4FA4`}Qa( zzOb=Xa?Y~Xn`j>|1|)*-Aw5C6h9JH;_0R;)4w^f- z@~uv9);-HQz25b&@wNG6;ih0DY|+=FC}TVk8plGHHpl*T7LS!Kp3IY8AVujRx8k6C zl6VbCyvDn5`75Y@KFdH0>@}yTQ6~@+RLJ8+B>48FfM+gW7Lkx4&V;uxu^h+k*P$Cy zS)$KRkWVm0KdrG-`d98`=v4;MLsXeE^nR;N(nFqH5kl|rWkK{34!trWQjQgHL4>K(oWG*{x_M-x@{DKW(bRb}hGU<>1(|Z8Tb5&q>kYGg1E@#32Fy z1bw*VQpgsJ>UbWjz)SO(1ix2wu2~-_H$_*1ro$x7tpG{|l%&{Aq1Ob7VWBf*GAZI3 z8H69YAf}nX8~EYem#>hM?4EcK2-V1-u0#*R_MbF0)wFZ=x(I$}13w7aU@R@j_jC5D z%6DF3iR6mlzr9KYzZbH4c-Nc&2|o8iNdK4bL;90f<8u3=tVa@EMR=l5xHz>Ec{2X&~cmtdR8 zA+fi##-g*8w9B0w#__5+gA9Ne{^Pg+a2y{}v{9#gT2!(xP?cG%1eX{q`i<|yv`Eo^BPvrZ7kTOk8t6t__aO%uOU&zV9YwsRdMvxVUpF|e-{(CAXSLJT5zgu1vp0hTJ^ z-t#r>5Ullii8U=`Q?Op{ph*&}-||ME_1c82pS5k2^>Yne3-2x}#ha=ZLxmmd7oyB( zJ>WY=matD8r(y? zv?2gx(T3PbCeD2sOdJA^dN7CrnMHk4bjP|gJ>qGI1La%458w5mj-2O=qV{dQc~wi0KA=f zT(*-C$Rv7LD^66KM5?A^{n91{s9eX&kWR9 zd>Ci@D1|=ZR1g57SO+@A&ta|jSQd?h)tszM> zBet4k&h^$S`6ZGN^lPOnW^u}ZpH1zv8g(w0(vprXJt?4g zF_d`?JX;AIb5VqE{Y3gul2CSIu;8@N%!!QiS0W)6aT{Gx8!K{hjy5S0Eg5<7)9zAkU;aT(G0=^?Af^U&$6c>X>v(Cb6kb= zcd&>Ob;`QtMo$X~nk zIm=ec^=@QckNlCTN?J@@_DWzP1M~`s9vrh1B?D8(9@2p&C0a=F#bRCDx`~M8|DB5u69}#Tf9V5)65J|#@ z5O-CGWo%TxpdB}-5Hpzt*mH5`pU)S!GSSsh&SpL68QYLJ0s~Se>_)d5PD~Z4GZu=& z$D&UV1Mi62A!hfAn1$?HyUN$86x#aLGo-g!$^zK8>HH0hTX5%}^&p~;>^kP*&$6eu zq|A5Rn4*hYAuFyzVJ1)fSc1f?10;GeLgeUGM0`Cr7hOdPN?pj6)CGm4E?5lJ6OkQF zXDS#;_y?cP0$4Jp#25|@4pH;LRoKi%Q*sw{8$s$9%m7~UjWU>F5hf*3kUU_3P|qrR z3vUAh>fv{S`VE=N&94T;gavivMAIydM!^Ec6vS@^?)ixCq%$`)0|`=Tc&{g_Hcdz6Gk;P9BhW#%E;jWaG&N~^3EbyB;!y00*?>PUbK868+X2@S=5OMxbQFKZ*(|Q&A3OZKUYqDz=D|umQMK1A<}Uz73&qRJgr? z&%%Q3N_&L~+K>3-Uz}y1DYI-79Y7S(0lFeOfJ_7^QqnVob2fe(GVFAkH#kpc)4Xl+ zEQiz=;gSFX zRw^74QDSor#qqli6equFxG+db(=kaJL=mw=`CONWbc;&^s}7`tlSY<%L2ylpp3_^?~OoiAIP93irooDK3PMU&1AYc=FgzQQ?z_y<ojt6)C7ryM<7w-_GAa-;;bOAGipEWerd;Ln^qKOD4KG#kq$!h0}2n8`ch1HC^runoT< zs)0uiS3j+5`o$-`SiHqlJ>n5oQT4G=7H%a{m{=u|!dbild(~67(&p-^8LMHZ5Y<}T z!CFbzxil!(%5qAJ-0?V*_ol7gyqzROEw*4SLZQ40)JU+f8^;adD>oNr0SMWNjs*uI zfIrjcG681A06vY?nq0_Gy^nL8fKbaKz)lc04Cz#RM+sq!0g)Q0St&JLzN?2wLV&yA z2qWTei6wDpwekXwfNp-76wN&X+7~91kAO&mDFWC5GUl*D#7NV;ZQoS$E4;-Qae)Lc=0Tj;ryN`m54PDj{m2}aL8FBUFqY+eyd|%#auM|id3Ck_ZX{};%5Qg95Pl56z=zZ>6)MMOo!~ZAG+Gvx z6QqjRUkVEXpAzI0c(o(H5qu=N(A6-=cX99h+cvey^Tdq{GG# zp5M)hgxY)Pt3hFxp`k1)jSi(is!o+HKPG@vkY&l~EQP8uiz-zmB#!NTnHe?|XL%91O*@YF2u1n z(Tes_lqa=TPt=O%uf?x@U@4cdHbJctt0fqsQ|Y{+gWnb5hk}ad9D;@6_C)?#{JhOj ztrbJ9()_jf<(s}*Yg5!J%U_Eh#c2mO(PMAaDrc>^N1tAsIHP7#0?`pj_ms>r5d)ZT zE3Rw#v79@sNNIP6(GDkpH+;hn=+p|}k$vW^EbOz0avH3MI{dQEv07&{d_6|%Xg7Bl zN!Id{JG)Aqqx#NUS<+__zKb;O{Ih^p4EW@xFzsTBF!>VEGApKE4O;ROGFY}_Kv^v& z@wVNWxe|cb%mY8fUL+`a0uPd?8+zT`#68xqa*RmIQNNDFL47(Q6+X%7;=h(I4Ee8# zbA9I_4FFR77(l9$LAf#dY2L}NbyYHahTv~&RjG_U4Qq=)nU9PZA&$uxXg<}zJ@cT7aNv)$G>?;tul@NBR6&xnUNMV0KYK?@juY|BKO8u3> ze&*>DPsev?LAuE(rUeg=dmV-SEGr^Veo2T`iszhCII^LG!hW#)JigDo_X_(gbs$(z zkZ4#(VJ|@)er0I0dGE#ZR-&|X3koaswNED{CXBlrn7u)t&=s?OXz>J!@F}8xb?c}X zzsIkfUbKL~Y^8dE4gJ&){ovCqoHUtgJ``T;sDNJdOfc8>gS$RY+G9MrSl| zeRvtn%Wk;%EX@8PvjcNWc-e}V&3So;J@sO$6GxZ3b-h%2sH6}K0pm;U~FG`Im0wI1o(RxYLZXIF6f@# z4VBnbpYExH8v9hJRE=iwoa3Rv??HnXqn3PeDpbqCI0YJv&ph{8j#|{%v#nN8X#fiv z{2nwIu)d+j%6ICV$HK%^wIG>uR}J4#V|iu(T*?OA(+99@{-|@px7xY6uQs6_X|lB(b(Ms zbvO?varl+7&G1z;eC`Y~qrK$bNNe zyQplNs21Lnl-8!YsS~0o(m>{1 ze^MS**`Ma~FKZ3M(743Etgw=>3_1Vuq?D@6_yqU;O~W^o)~Nv)u!EH*rYlH(>9OG( zifdJVU^$1Q;yT2DDXKpIdW}SQHLA~Z{AL?~^$GMDu)|>P|gA_a7Y}Dh7)_svEb3b z>mEBST%>iH^cj>^fyY2f;M(H~NM(VLrcvL_XOzV9sI)fXEeAwjegK>E?wKhN zyiDcgI$oZq-BHE$aBgTFZ1gUoE<%2CZd5WWHKd@k*^_L1eyKRPjBv zmZ@~UT69T0wU%jktBQoWqW8vcy=ldyrr0~wt${T{_m!`m3Q1?!;> zHT)v2BO0Es4mCWbbwtD4h9|~fcm~kgOZx7D78QJRDGGN7FV_!U7NPhf@m9wdF}7_x zd-!>@0=GbQb75xEv^9^sncOXb0Lh%}YEh7XskI=;?_oBSuNDRQXIcw_{2qK$zFHLILak-7RK8jiwg_4j$VMBhf*f*ZW46pE$V(*G=1Wt$xHEwVS*|s>QUhXJDCEORvE*BMRGgo{0}(lJ zAfH3~D`Y*>7rkdT#U;Bu(}}aWGwXQyl9x5OWanoxOt0eQU0zo3@&+$$yu8HALR@^# zXK&0r#oQ-(`3pVRpP8D;%YD4u#fyAi^%kaXA>h=r>zt}+bkM881r~S@Pmg%DgQIgQ0-o2c1G{&<4(ytZa$uvi)&?Bd?pkXD z4ve!uxXcYWu%#R2z-Dfg1Hx>Wy$<^Ft2oJWQy77SB7%gBJC^Y5flDECuHr*yUX&U9&@aADVPsC1Dr8 zVi9y;DBHsHoS1J;1G0XMc#Yi+=d-LADZ;Kpbl(c=c(*kM{L?8YuWYr;5nW80$Gmz&%y zlH#m;Y`XXh=f>VNH->p2)>HC1DGKyM=E!tCC0{MNGOq8!_w+?Atf%CwML|A6YxP4d z!~pqf(U0w+wTe&+F+jdro1<1Igbh7zj#^kx$yciwwO-d+#i)fCU>QHHeZj;8ri9pU z0J#e-Cr&d;s(XCgW_#Z=?oah4k)vwznBtkLFS*l;N;1I%wk?%=H&%mp5x_dT>JrNAIr>Q?t{GC z%gdd-Oy}ihUT)x}2^V#jB4IglWiG~}uFS=(ay~By(087})Gv7%!^>!1c4onmOyS$Q zSlr}ge_n?2vJWqVdD#sY9UU!mW;I^e$dqszI~=Ybi(|A39~YvIi>fgPeD8#yw~T{~ zULAHrgjOJ*Too}dTVM{jH!Ni6sTngrftZCe(dFyN%xM!Bq0+IvPtjfrbE{o^2g=QjGh=6w#Siy)oLqn|KMz_NjCJq%751Q?{KQh>4;qEcdLYEM=e z6`@~z7$pS;_?Zcxct0KBX(#6$;N%;E0}N?ORrdqzlXrkkl53h$CnyBRDDW`GYJ)2^ zFr2szQ~R^>=rG5Bz+rY9O4d-3R%X7mU1zp3umwo5we_ZfK-b{xh%rHNL#$WeZ2_i- z#O-Np#OWeL{J?!gi250G<(3KuEre1bI-oMI5GAK}JHUAN1H4D#u;>6s$goXI zD#HU5U>IPD4X~1zFQO;aVKEY57-PAKQ8mS=)VQHNSz&a5AL1NidGvQFx%_oz3+{V$>zNH5 zTWy5BX+14yZ}9oB0`DHMHzY$#qxNQN0M27?R-K)fj(?fbEgjd`C^h;CIjvqojVK+T zFd7LRQ(-y^Fwn6>fR4~NUQ*VB_GE=oI^OkeL{R!;fO+iA{PXe-u z>XkJXFhQvZ4^V(%fLw`UNd*NZX#>=rtS~yjr{CcKGp|SNO=cA%pb_iZI#YJ-5N>aod=k+dTO7t(2Veft*#vV+Cy*-8}gApSy0pnC88Z zC)eBZUfF`$S8u)a_T4>_`IX*2)tjfcm3mvDx21Y}S#Qtl?HRp2skhmB`=j3O)!XfQ zyG3tly z+YsNdjtjBRYpvjdOr#bUV(-*i!3CK}EiS}P(ptdM%6DM|8R_{6;8pg9Ge{A+g9y4Ie2JCSeP0h^k9I6*7jz~YbGs9850c&^Z~Dqt)wn`s$x$w1rDA- z$(^P}-fw9H6#xAe|FnoURI~B6vqjqWaiIgA7V+*eZkMM_9k|8w$`!3LOf340LX3zm zb!O@|u#d(Y3;Jd2Lk0}e-J{qh{560hP|3aA5$8uqZ4>-kAvC^>61l~_U@PPs~QNQD2eEn)Z>f?U?3f^I& zRx#NQsyf^j3{(gDegzRH2_JCT1!smj7 zKqZ1~%KQZ{b9+a;OwTAPCmQK{*EnkfhdLsFKVyf69^jAx7f&r+QwOH>aGSX?3brKd zgeim{nouN(;s0Xp%j4rHj&Nn;g*8}61~w5SkOd4VHit|&WH7J>Vb;b8B3v@z5VrsW z0&Ebs6v>IidV;tGF(9s>1OpB+AixkAJ6PP}wt;}cm09Ev1xyg9-}hBj&&;mYx!(KZ z>1XfsbXQeZRaaM6_w@7#1Ry&>pZ7`}u39*?mk6M%PN8J?vOn?^yjuC@ZPcVTk!v1o z_kUKhXSoxf)?mKvMr@^nr6JM-U4CP8W39`z2ax~r#x&$s`8s(ydy1R z+QU|RM1*+r2Iyp+WXQT~V26?`sN`~%2vw8}n$i@)Fkl8s!JRFNmnlrymDVVV=jb?P zp^*wU!fu5dVY}Q$xX}6t8~I;1!f);<&8%VT=$Ji+16YH|Q7x zl_0u%wv4d8*-K+JqtAui%d%oLtm1fhx~p~Ka^zUtR+)? z>ZUk-3`Y|VVH+Q3pO_m99FEay!2d<|UPWM=C&*k@P9yWs8^|5_hbRx0xGZs+uFTBa#E5r~n zUdz}g%N)Yx*x_8hepEp&`$!+Qxk9c`pVWt?1i6|G!ZwBLVJ|8PHk2vYfD-IHM|SUK z5iV17JAA7gD*<;xdu$8%{JhGfakF=*A)AiheUn4LBnPgEOu>uP;tDE~u5)QG zR-cUw>O7;Gf(j1wMI2U3cs3p!NHC~>yJPO4-eTu#+iNeG*j~33^sYNfc3{D`M*2*z zNEyC2quv#(sN!9p>nzZ*5dj?5f^m9XL;!5F6x(bhPKKFb(LmbXzQno|z5+vGv=!&8 z>BxJKtz7e-v=T?^T+GxD@gae?)1SYYUh>sG=`EM0N4!D5*-0Jza0y$ZOVqJQpQo+u zlYMM0QyW~3dp*Wqegy5?y*S2U6de(6w;Dm(=?OMzLwxQ_C38Q((leVh9mlT-*4%^O zk6|YoMrE*0i4AaKiIe&u!B>hmOoo+Yyj5g)g5tEB3>|U}M*i7YLEmMp_5=w*>!nSM z-{v04tIN#;_b{*AJoI&#QEr|DX4ScQDZ-_5^U};q<>pm0uQE5UhItjad9}~~ zbSKis`F3V7UgEtyh<0!?lb9)J7nBoiv7t?oL)4>aVpCpXfudDp5?d)+CDAT&XqD_p zQM9x&IY-e_nZ&?YGI>FoXnQ!cbUvC`rkB`T(W*0vMT%BKv@a0zQMM^K=peT?F1%SRLY_7d%iR-Z{sRkQ}8o$t^Z^3lpwwwZ!Vn#l`bQdqNsp8YLGl^$QCqO+9)1rz0A=XcT*4D&~e0=FzUSj2=l=jL_ z!Jnu2Y;NMuclgZ6$CqyCC2mlBntUcPL-A?p#OF?Wsh=77_;Hh8@p}Y+jN;#Zs@!64xKhohd zBOjk_O8Iva{iOtdjN+#azgyATnwXJ~-(&SFezo8~TRegC*BHK?5ZuRpY<&aY)^8dHZewTA09GnjgSsePF`ovBKuwq$BY zre4P`2!9+?9#fk!wI5TZOnreh9e-V>?qllf3y?aAsZW^t9#cM3FXG@5|81sz$FtrT(Cj1APYG!HyQ~M&tb*o!=^DPew#LZQ_`3~PBm^x4eqxg9nC!#iy z=k!5mfe66;v_T1cTWYn~eT{o21NeIaIX{z)@n zvwbiRC!`n`SC0`MmA`&KVIr5qg-D9xnx26da-KJ#6Tl0o zJ<9V_9HD3S*kSf4S9F3d-1Cq2u@Gsn5HXPj=R3obvsxBHowlso0F_&^j@tKPH?9+z zdc!>y`P1(J6PWB__0^sL5Q{d@$SX>cEGehK2@#aYI0EemBy3wC3s{f9qg>!oF4hKo zXRvZF)^!|~MpM`72tjF`q*xlADA~aX@d*5uTksNm&=-23PtnPFx0vXHaiTvQq6dOY z*@0Uj5&uZN9qC*>o_Jo49@8RzzMazn&A__J%Vnw@EKk^&<2o=2M_On72)|`Q(jGAY zPpSaF)m9bxBfWOIC-5i}Wpv;?k`Fb6Do`$s1W;>)gw2M~L_!Mrxk_E6q(h%@VuYlS zfL3dbn}4NMf5J5MoNdu_^od2z^NR5Np_5A>(Av)*>NT6reMS+RV`8G^=p*=N)|_Mm zd$A2K*Z}&%;_00OT*Z;ry!~#T4z#D4I0F@&n?mCKEeklzx-p zDr|p-n_7+yRW4!^z`%+THJQqtHOhVS5(z;nSO#5M9;^imDY=QWD?sceg|$iNs2jqX5_O?gM)4tDSjvJGKs$yO+enmUAQ6sqgW6HT3Zt{ zh>u+>NV((jWKooZBCHTKNo2Orr2*SxM%T@&3%KAccFXAF3Eh^LBqpGV$z~)qPJM(r z9ycWE=F#QwkjmfvDxLc1tVa;5uu_jvF~x2m9S1J9T1e`hS#-zp>wKgp;knkQ7W>g43rq2VGS|u4v)zGo8OVqOKAMWtALG6g#&R-ih#PlkFvCBjsIS%h0b*}d5HJF5R=QKb~|Ny5ZO^hrV)6(f$W z!>aG(6}lz5okg|!+wq{JXHo5lVz#$_6AMpF2nOEtBd5|xLWu5SvEZq@SS4J$12dI7 zXC$p;3r51>5C0_H;nH60?Yc-9s6g#1m2c>ZqH}+4uor9GJ~Ru(qFHR#o&SKTRa( z1vZ(u=5-I41WXL&-|RK;Vhzh8%{!jW53MwkTd2B0uI`)Fxy^giCi%@fB+O#nU1ScL z_mx>W&HKl*3OBD{qfWtwGPQZp+y$DKlk#s)MZ1=mZKP2(rWp8-uDB3VaK5p1kr@xYfoXNl>n<6*O1RxWfUeQF!lK`sVGcZVCwQ=;NRiBrBm>w zzoB)oJ8dIrHkS>BqD0PCTP>Z&6+nflxE!q}XV<)hLYxsZ0w=4DUUG8N7bnz%ly)b3v+Gr)9E+v4hF-Y-kD3^N~H@A@fJlt{h z8b+VcHVjZy?`V@(4Bw3c*P>6cgyM4Kw4hg^by0IKga`)5Zd7J^=oOFPo~7H;mKVEl zyU+_N3-p4U{2|{9)){;C!k!+0YhLj6&qFWh21oURy5~&?NAg8YDgPWCZxOu0gJTb% z-QZY5&M`RF;);Kgu5)QGRw;oJ8kBqPwzOIVhuR}9oHpTQT(QBCd+v@cQSTYHZ?_5A z!>hAkZ`XgGlH)y_P8)8>luWQur(pjZ@995rq79DpqYv=rIgXE2GCr=g53TE}hFMm# zwK>uJ7o8}3E%cH70~T(w8K!>0pF4Pa6qZu63$VEASF-Y{pCPp)Q(vz}Y8+GdGqo90 zbxf5qwH;IIGWFr7NPT?*Qg<@-2~#IB7{g&0^;j0+-UE6J0;KcczT57}BV&0Evn-c;o5OeI=1FMVnVTnb zcn*^h+$8C>=jKVo*qWOMM+hgBn}?ak4E^qaF_L0NeS~_N8Tf>WEcsPf_iD$LnhwW^ z+hHZLTIN~21*}?~v-hw{FY(a@oXKHxhIQ2rUg4hw3Vl$as&0`PoMa}kuHwjS{S=2&&H*XF5hZ(xw{DhtDl&Itc~a(du z*EI5zLXojW_wUqeh7<2WlVeEaun$zMpDDid?-p2KyXQ8*XWQtkdj>vYfho5!itS-F zx;!^SFtoR4L5&!04}b81iWFHvQ>Jm{xWII^OM9{7=0s*=IGs`yNm#lw!9_elc)B!r z*D7xIW;{`{UVc1LDp0mGY6BG}+w0cm#1j*bA3jh~wlb^JQISy#jngNMYr`M*P~&!~ zf6h@DN99oGI;K`Km^j>mi9QP9st=v*!`Qv=9!>O$oDd0tA?R77N{xuiWuSF6#Yvyf zg8XlPhSYqfRx?$@)JIHh!c;#~&+&=yYfN3i)U!+-%+wQ1ZOl|RQ?K%g@V!i3&(s}E z%|r^3LkH7;Wu$WEM5I>YJu~;ZLG*hVFfqP?Ch@{G6Cp63mvV`!ZNa!2UirL~S2T75 zuKc4;8j;Q&gT@@KYO%qpk^3ECz^!oVR8Ke5(*j$Fr7^X|y9SeZL4LcGV*??tXg!1T zXd@n`?KDNVITwovY(rpm;7LAN>ckbzE$J?o296^ z?c3ncnX882@Oh$`aC>(-ysdaOUI8!n@LnSa_~OCHi&U*_E7wlwI-g#c({+wICN$v+ zp@YQ=qbm&uezK>yjB4_d>vfNpdPzT@io4Oa?DYg4#YG&Nr4 z6Vt+ynq1+R#N=9ndl@XS7=TU1>*4j#A7MR6#Sui9ks!(og)La!l8I{bPzS;J z04NBuLUFK^V7V6u&r8OhIiSiE*DR!PQz_gR&^Xdm7BNQVfX^4oJZ)#myKx*~D@bqr zki6^%q>X{ZR~45^j$}zLn8x5XH&Kc=P2IEIXh3V6=;{yu4B9y@QaP}4SJ0*QNOrLFKYC{9!-N2;6#^irE){I7PnUXZ{cxA+e{=}O=+Rsf#=6Fz zd9#e6$TuGI}}B__@f(H7eD^y{4VYrSA#Mf z;#;erYF&Jr_txIU1x&iQhygZKEOzm~y}R}I@ol>8<@D!o$VaxD zaj5EuKDK+3B70L%2rCrv=Z~w9s~y$i#WL33jEQyHI77Erx|>qJZ&#cH|#bpk***yH^~{ z5u^hUqEkxn;wP_@dhrh3-z{n*3`a%8B^($rWe__??=S#Cg@#&%1Rgy|KIZTSS0`5( z60X+4;@0)0h&Co5FhI;;;{`m*wHrq~iZAsP=B+W3`#0jiOE@gDa=6~xG88y?IC?;@*TGyzKerV*h4euN_Od##2( zxk7WKD>WQo%GMBs`GJ2*#sl?Lgvk_=bX6>+nKqJ?7u#h+bweyt?zqzN{0;d&soOZ| z;T4)9y7{Cl-wu7!?a{EqiygjBNL^&ad?oG=cH~p-@t%M;B&7lC z(yoGo`iVnr5I*1KJ@Q$;%k!=E2PJfiO{y>G^2SSc5Y_w$KFh6j2mw?p1lWd%X4ug* zs%bl=fXmzDz=+FRk2iFA3~|1kj++{WILolBP-7c*VI8Ej%Lg5PO%H9R6XIt-M>bYc#8!Ek7@fJDQg zZ3-hr!=Z1mQ6-#TF&z33IgxPagxL+V5e~ftZ3VqmH_;plghR{^ z1n&vMp*{W3Cq8P9n~jLA=!|Diei|nd4lNk1p29!m+I;8GYFxGRiq1x==6b&K zM(BD1-w;>dAYkGfL=3Q@Vlf5&-^>`H_c z9CT9RkX^#(`-YqUk?$LN%{TO^Z`kXMg1%u#$qszOcd?t^`350?YJ~uFpX(dWIH7=V z7@8XK4FkLh!lCR2cnrF>`HpVMmiZ1(VS1oU1t0DS_z4S{7`YDKm;;*E!H&7Po9LUH3s5zp4j7ai+_bLbTw|`u`Gph?a?+3K$x;1peV4pB&%jRp zC&_U=*rBuEnj%ahGcFE-gW6(A=Y4}TgdIjT9H zf={L6lzbcpr61%Im8`%!Y4|`LRKisyo(8o9IdEV&&)B}m$Ip%MGcEebqniZ5*1KS{ z!j!CgT`DE(r!)KppL}rQ6d^S&-uMO2y3g@}-D13XWVF9mZ6+*XN;n;Bu4@nAUKt(n zfwKIciTXgP0Y0tAe4s$U+I{nZjsq$GpL}40d7DP_fpzp@1$-d$10UEK`oM+e1DQo1 zSSnttpbz{ZKU@>>fnB4_2OiX(?*oToq=v^_=2S@4eBef}uH6R;nD{^u13pm2q7QuI zm9_go!80FNPC?)UD{yr_u+pWy*fr4|o?Ds^6dX7s;?M^YKHmr4xGLWVc9{=cs6KG! zsRe!Dbjc2U;Km1pK2QjtS|KpZ2cCLN0Ux+}O2h~Ll{cXeT<>G`fq4ck{o*Jb6$x8L zr;raM?k%^40Ds^B(H8}CbPlLDxPHpso(~*OZKH4V=@S#Tfz;lm1XO4bFYg<9c^{lF<^`zuTb*EqPh`hm4ijvO( zT%@?)=cE)(k=YHc!4Jbdm;=AqTI0OYOFoQ`{zQ>}B_PKFX?Gy;5cu;8Bdx#W!%~NI zP!1B$gs((S$%Dtp=S|*d`tr;(v2=$qQs8n&L~Pyw{I`5zD02v^g~7?Ex&DeA{r2N2 z`To5_I%Xaj{YcZ{n~+Z4w;u~k&{wY$@$bFEVqB>Key-E}yFj2P51M~h4y^ot^6$QR z(m}bxFVjC4@bAnI{Cgw(m#s*&)0JVe%q;r%qP6??J=xPE{=N5G?l-}z{#lpj`}Y;b zRX?wAn51g{edia}?%xGW{JV$&|E^-uzkm7s+WouWnSU>(An@fdiTv7mpyT(SfI{v-Hg7vl;6R4W9A`S-S( z0{(rI$r1m)9&bYbzMUTT@8TWTpQR7Kg{?9c^zch*kIQYI^$%Hw7Z=mg@>zakguCn=YR*U0sj3%`1em0ZCe34LY;%exFvIB1*cAa zlS)Th_3z-9NE-rVTBbfeEmMg~=-)pdO{7KA1|iaA>o56h>FBT0bN>mD7XT6>(Z6>i zr{ux&H(2sv+2~K3zB=oK)A{W6CLvWwwo9eNjYa$($SFeMm@$oCotW?68>D0AkH~E&`wQ5|FzOiSRf0r8I-y6-p3j`pC%)cuKR*w8~dRM?#n3t9N zf4PRyYo4@EuAmH`R>;3IKk)Ch@L%TN>*>ni-?*bY+UaTX!X>1#5Fepu?8JKQR3G|Pmj4JM`kUcZpH1=yCw+wms!?+3iA@w>*@uB&O!I!Yu& zkH#lf(GAjan`ikl5b%Rr5?3RblZ=fGROZNm3q>J&`9Gw6FVb*o4deGWBxiA6FaOyH zelYHBMY1o0h@Zk(xXPDa?rEL1rtb3cAqFJw9ke6J6S*x1Pw zm)^O^UYrb!ssnrTHE6&_SoY#>^F(#rVo=W{iDw69W6)+TRj#ZT1@}0H!lIO%NuY(V|i5-6*f?j z|Liv_WZze^wQAg@vhS-CO%piS^uKJ)o&Kn;*$o4rjrOrsLsp;O-RZ(#Q|^P-oLsmycgStc^WczN z@GAIdO`$ieHJ|-);no!Hnupfl6}9nh>mCIY0Yky=vWl=%<={WNmD`1EJ=D}C652Zw zlX@@3eAHwX2rn%oOqaAZzGcSiq?MOVldt=DqZ+YhI4bQ;9*IqiC+|WV4vcl86Ayds z1RX7)l`0uQsrWY<6KwgCw2g6Fq~a_gUrC`WM@<_wG|t;_lRnfT&1k zj>2)@!knUK&mt{YxN>S$VRRB5O?nznYZuXhd1J0hFZl~umQ!`}GJ^bn7&+YtKNZ=co zq94y*$Di}~nXP$D{gOXF=MTS`m~G$>oq6_5{+!C6X#_r&sU!Jw7=Nnyb0B}F@`r9c zJDESb^Ji!N?7*LL{%p;kE%>u3e>TBS7!GGY;3;y6R255snCHP5qyH)V)cS-&$^z0BLq;b5P*_%BZj&IhL17+r{g05^oP8W0D4dE z5`em@Z47C!Xo7DY$WdpKA28wVq)b?2v)*=pXzK9#+WmJ6rA#kl z^|HQR*3rw?dkDg3dihu{M`&5U-mTQjOL}=mFU$1um|h;#%YAz3(#x%Sxlu1y>t(^3 zXK@C^^T8V&;rpIAPp{+`r*U{|UX|qFh|}fpQ}SSJyYBHtlSiCCasZFdnBBZAxfI!@ zl8pgmlo%a43zsdh{jX$OWz<2%gbwtIn{boljvK$uaf86=y znoP`p1P0IkJ{KE=??C(Y6ayAhjPXJ z5fpfvBELmYE{&jkUr7q$UYgR!h*iR0vsRg0(xla~^f@nFkzC5pxjFov%uM~tz zGfLwpm+ZKtWGl z6#$JzL6ZS!vH<9-W_7}=1hi&!cop;d#cEC6?K0GA5j zQU&0)3*gcLTsjx7b;h`|r2}6KyfAQQwgLSxo90g$e|$#M-TY~lCe87W=baDV2&Q3tl1d8(b_!F3KrAc8;8Ns2{F)jpx{g>5duF6lD!BjNIT5p#Jc!9UnwOO? z^*{RpMph37bNDIw#a*ntc@->n7T!<=PbnB+t?*OLjU@1rHGG3-Qg6vMJ#f_xR0&Gt zdwg*+1h!|;o~sBLW}^qs&fKfQF| zb>Ha^)TjIh$5>NF57w+UV)^ zNnH;>!|N_bu>riJNYKCxV%bln(>su`)$7^nun{-cPNRKOrOd2lYuC}98t~yY8dEIW zWv&BQsu}?jlV~7#sekErA|@fLDQD%@oCJO7pEij~V1Yr+K}m`w>2!t$s%9L^jCX7MyX-e~XBYE_p@#q4&tPhI*a@7WeM!7=C2MS6g`O}A zY`~vX(9o-qi|GRNwZidQ9`cHj zh+a*$``=7d)FzFUbnMm#`~GQk;0b*2DG=9=AWa>7By0q&EN*WG`!E3~^_Cy$ z4$f=9c`c6i%{Nb2EIY=o2q{V)gqmPYBL_B7HB{JVU@EfJkage>B!)SkBjyi&3N?I{ z>m%~?@gKJz9=rZ;?Ke;#@uB}=`|VD~|M&I_dHw&U{pQU6AKI_tlmB<^hs}%sTl-Bo z>%VWm^Z)UG)qWwb|KGIV1Mousb^og${5S1)-VyLc@pRkvIB;Y8ahM{%-(@rB(di5_ zo0r8oaeiKMW#W9(4mxpu1X&~e%PxOzjsM7DE7m+2`zN2;?cWhbtpdfr8)3Vcp+A{l{>nRZHl?+pno07=beAg^Yssf zJW2XiT?-)9axRg@Sq-Nv`d;Lk7g+*E;M$nd0nFnavf}DAVGRxk?#u7p%rcap)hZH%2EgMuyrz~JYj7iK2H6UQ73xH^adv`@%m(D84SMKu{%IXZc< zl~dLOPf$#sZMT(%KrA(5Ts7MNw`~6gc`3RFL}&wPdAvSjTn(CW`IIEo16~2G##4j! z$jp>vIy18z4UD!t691>;khgjvbzwP{V$UI&eam&+s-bvk{?t)qe5y4%zrmS5#Sdmn z08gm_RO;`J;6osJTZ{7DzQ+|pJ;_xTRfQvKs-|UZxuyQt@4{BE;1bJvNM-lL80r6c z6}n_RG9-rWFY(OpNvL^MHEk+Qn@VHGiaK$$2&RO+Skw9`H2CZ;k%gutQ2dkRi*F2L zpqEmzE^U}%s+?RyC5(EYijf1w)EizSKz4GVd|+FORztHLHBM`j10&;p&+F7P8EIZt zjk7P<#vl(;W)uF~yUA+cdX#GCLh;T5HRVQ%1(6ykQiCk&B8Pu8E3sZ!u^N2DiaQ0s z-gyN75KKf2?OUywj8RbknEgmGYQ=Rds1G=f_JAHz2SHGU6|+Q)7K~{3vg3KFC85q| zXXqX+f%#YZk5fF=YJ!{PG@(K z7`iw+F;1u$gvC_j{DLx-$(b8LzBo5dh zp=z3`FZyH)G%agHdZ~ZLCa}?WXrm`E)$C9H2u-9 zo?6N#tnm*0i`s{WZ=i<2q%$c zA6lRfFW`dZAqMyK;IRV#&=M17t}o*HBj=GJX^F*h>Qg56_dE2wK7Ol6p3UIE!9l8S zkg6N>zlP5Fn3_$bI4$eZz;w3~{A>(Wv>g=B6yHfoIMiwZ9&`k)I!~%$XU0p&1f>ZJ z%E4us#5q90Id-KyUE*{@o5DkdVBkEIO7VQd>zC_%w~sZIZkq}F+)-&%lE&taMkQ&q z=)qP{wi}Ct1Dv!xa^O;^<%(A#E7aJ>UF1K}LSaJ}H81b@8OQ)IK3kd&6JB&XxxcUu zW=yZ$wr`!*Dz%|jeIdhIq-hx&YN>zASlIANoCUP)y!czZ$yYz)} zj7N0365!xby=!5M4}!_Aa+cnLxNv|kuHwzRO&bWCL#v<8Frt^lS*M9 zFW8wF+$LjQfX}}y$>*7tBhr(eFS+7=G!d6kxHU~k;wn`vd3V%|wyKTeRhigDo$NT1 zH{KtdT}mq$wK0EpXk9kH(i4MVF<3a7j2@aI0IyBgN^4S4u;;vjw#lx9_u_-2!7o1Fpc9bfZgq zcxNXPySaB)2}{8Q7p+ftHUxO0!-TGq{<{zAV{1_k227~I#P2a?qyBUD&Hsb{Ja!EI zr(c6hb{o?%Po`xExqUDoHX8#QpQiD*-6QjJh<%v@k3s)ImFdTIdGn|%WP zkRR-78}ysjhof!l9rzua4jppWh0m~4?1HA0O<|$A9R+hc_f~euLvuT1%?J=+=d8(A zn0*Y=$HG1|fWT26;&ZWu*%~`;jbCbw&LE$EWY(26+P&hm$fh+FQKkf-E)de_CyRm= zCa2NMt*6!vd%JyNXrmJwTw6hpUJe2J8v9c z1j{IydyOEV)i_f?Z9*O1U8uualzQyi149$f@#^_vz<3yqe~@%04w`gZ;?2kmwP!Xa zY2-t)>t1W}||;K4uTP?ffn)qoLnAETJ$ z6|GEk+vYU>2J`#S{#&Mf_sI?cqxFD94ci%Btrk~cOS;abac04K1^m9?z`TjWY6&l4 z2GwL1_R+%p?Mki2Y`Zb*{QkbRnb^f0=J$IvZl3-h#Lb-kowzPs|7%PgiB$Fn*1OfL z+*2EyAxq3NXFalPvUgEl$gz-D`KC`3Q(o+z{>U@{6Nn=JQTY&C6^1sa`vw!Iv4A-D zT>rm`b8U>`3>5kJdLcN20bn3a)0WCb)fR+9<>I)}e7>lDo_&8CpZMZE;^PJ|4GMU- z!`h~vHwuji6NU6tfTKM1`l#l1Lt$x-j~b#?qOu|rxz6tEc?FTQ*ed8t0Te0)U|su- ze~i2}T1C?^U_5h)ukrtB`4TUr$&j+jRy|AmM8rJY#FzG|*7jlLu6-m8`gQh1t*$`(fLywUb%(Rlk0_<vXR_GTRz6%1!rTr4PD63f?nNqz4x&F$3BC z276JIy5x!HIYs;g`Us$MT5pBWz!q0tp(vu{0JIuFy8#FSj8zbzg$5}{v|;4}k8**h zPT2$ehbzCqs6-D2lxhPNRDcR<0Q##aXqup2?2)Urf&3S3vn~1*ct-1GiXXp9mwC9Y z5n?Y#rj2m;-VQ%mmXek5#R9HtMPwjTJl7DnQ$$_$gJ3}CI!}unU7krC12C)!VZE_r z?k6Z?^XUT?h2^ZmM?QVIcn07eT%Puh#P#f?tgcUb=CU~&vA_!w)SLVo0+dmp%+U3x zBsmJ6R~DsMJ!Vfw!g{8|dfvHGyg96A4sE9G9Q@)Mv^XY@U!%dZVh3NWP>HciN~&^dCwjewZhJ8q)+)5aYHF5l>XUFy~e7%;%%-X zQ5PhB_m}t{^tBdzI1ibI{MDGArYfkVP8dI<^Den!faKMS?e#Gq9Kcc_lY+oE_`6r< z#v9I(e(*h=II#*D7PwnEleeh#H1}Nc%=C#pa!fidZFrFYm(6fa21o2JLi`gSq(3=cNpgUYsU25fOS;3Qz1Z}1BO#MJ*j8|0o`j=~5tkzn zdZPrDSa9n5<#ZrCTzaKBFW=9dGt5}|*EO`l_v$AX3Zw8Cv7C&2`rlmBk8e)^R zEznO?VSRcK_pWuNSv1t36HK8GR*g%6jfWqz1`bCE7Rd16T@@J~VC=HwrweVgb}#G0{I-8t959;PuP|`tT{+E zqcD4Ae1)G{_AS5T%5Tj90}n31J?3rU(zNGl;SjKGT6=?xqM(fFuHc|E@d~xo+p5v3dDay$U_OO1x;^`k4drNlS2m{y8MtGt$#bGsW#nyNrYJ368c55a8V{M>UWk^sz=foy7{I~&Jp1f5mZ6A?MM%Qa$+|v9PkYGi`O}g{VnY?JLdA>*)Wm4eQ&Xg(6W`0u z)*)okI3jVePUy^GIlb&IewF0aUpJ(d%dRPq$t%mNL8Y(iev06hVYq%SQq91uUh8A$$ua-@M?pKE^ z!cj@ryR;YkgM91@{I7Y)P%yr zZFIv~=#Y3qTTbX|RDxz3HI7%>5BWlCB-0u2HE9X9ksifNu_YN0!1ke(@%t!#=A4lO z2bVlJX0!CfUSd@Sprz@D|A4kAVzZUpCu5u#4^$+5md~GZkt!tQ$=-D5x&qS zUsCRoN-@mHbq0rP*J|i+?UL(ucmxa0DCw}0PF_W;u<>&L+AUQE@M2q8YH0kmR0$Jt zcH=I?)gBu34?0(rsP`1t8a~vl^f%~-kwXnB)>bX_*!O5k5Jh&rsBuL|B>m4&2eDuq zY<{nJ^_L9vF<}N6-M0E4Dy4Z@J>Gxlg~j!t*M$AUgRmTzHEyQaSWz*9!lww*z(QV=kb5eSL%!H!J(U;C2br9>znmHi_DG z(bbuP7i;@Tw8{yEsysDXrTBg?cGn*wRmygPjfYj)Xacv&HLP+^`96k|a;HL7{`1cf zDa&Z%cwE^YsS8moURBxAdY??pvtJ=4h4TyK%llXQWCjB^CKQ z46Cx%q^!%6a)mrsbW$b@RaqLXGOkjlhE@59oG2G<%WA8#Ca=oV-z2-P%CbUL-t<;P zvEu5y*b&!7q!jZxU|5wYt1_Ke<$cdbtE3qZv)J*`Du)1pww${lQe`Rf{8!{O$f%SR zR%K;gmES)$+LjfCs(k3ph?Ij`JeNk$>EK%gz_?u;l_%;!F|Xs*NSu_}A>sw}=RTIHldRbI6s zqS$V&a>T+&l_KTjVO1`)D!cQlJS`oqvfxPagJ_itwaQy>k5nmAK84?0DLbvouDmKU zP0=d%DJ12B*CSGPX_X&E2QS!ak$<>VS<2D6jF#3eRbgd9t}e*&VkgarR=ItlDknv& z?9?iE>551Rl@|H$1y5j5Whq0KMw7BNPs(GPqgAGWJj`OBd@UknhgLb`p-7c*bwz&t zuqx}V%7(luca+1>Tqmh4ROKPjD%-WnifbZOO27ODqbA!jRBWwOHO~(22^Bk(W3iJ9 zRoVY)M9NmJ@|jyBRf_psKCH@WtFlI}VU=IhMiskrp(@XaR@tak{;nfZr9=ha9ad$^ zs!Zoq`9@2$%6$t}i7x~>hsRYmFXrLU&2$^sW?YPs8T;*^+gz$x^BxVbs?tXpL0A=^97n_8Wb|{};9j&h>Q=9@0*V0Z>_)KxhX58kFup4K+ zdAp95yCC%b&VYvAto&l^pO>AxNmgF`d4m$#$SRgS*z)>9Ch;c9+#?vCr3rK|@sro7 zwu4O&zUF}GO_>OCx5CT&5O*nj@HuJ#W)hbxK$6dN<~V}eD8Zy^#t4=Q!6OyEg7AAf zf)xQ^CNW6?WYh0xNARuJghQF3iX`MPE(Av_JWfn4nahJSL8@(vJcKrp{qsfSY69@Y zOcD8NB`8b40l^|6*sbujgg?O%tc`GZy#mw`V4@>9T?y6&aO7|Z=9@{JqVNrb|2%FS zHUxl~#8d%zxDn8Vc|u{l#J8_f>MNNaK$GksGBSx$#iBDJ*3XS{6EgzvOd@+8#ebM? zl3>#v@!u+O<_FLu?js|U_=93~8J2zm4&TLQMgX2k%u}$12KEwmWuVkc9IC{bA3&3M zKQc0j!xgIsH)QE5#cFF}MgX2k?4)4526m()zUCEC3-beL5?_IgOyY|@-LG zCMC}N0Gh-pN+z+7V$rP0`FKa183A}EQKn$*P6Yb|%jPKc5@{vQ`~aH7dxZGAvqdfR z5X9mEW`JsIVnzUt_n#DuUW{NDI^v(cBx+%P08QfELVT`b(H#?O4@aCC0XUxjDp<%4 zpkS>AcB6uMiCdI7^8;uS?-1f+6|2Lrj&#JC5rAhBADtrtb{g1Lj`(yX&inwH#M_1V zBE?#0Snpy01XNoSGXn5T!c(wr1N)tVd5O>ZL@mq@ph>({h##R?y@qv~BhHKfJd>zU zus#FhVP+`x5?xB1`2jSEHwy7D&lY+64a+?_XktbHo=Lo{V7`GpqNQHq5GBt10GhE! zLnhIwC_{$A?Y{tNYhp$Kn@L=tV4QZcFYK?SUSfn&W_|!o%JuO7io(e;QR0p=GXmI5 z;s*-Gxii7~ATLV2#C@;;Xb*cC1v#xw$k zIEY|;AV(0y3rW1CQ=Un*;;YCADG(yenZ#<{_v>pJN7Z4ma=YK_V&$NqVN?_{w(Qun z%*X9g|M<7@M7tO9*k7J6#(E;|vJ?5lYdTY3aCy;-JyZM%AG643#t|%fo2egY(Rda;$BcKd`N3bx)Llpc zYdsd-&x})8)Wy_JTJ-*ND7u~*f5-RIe2=MzkOI~c7G2DY^I3EbQ~PMq%`7^O8Efzg zn12LQ%lR^x7rTf>QVb6^i{4~T3GZ)X6(eG2blVtpRe~~$Fb-RW;}!p z|3;=R)1tju)W(c`Sacav>uJ&VSac>cp2Iig{1ch_HBulr^el=FVa9PRn#R;lTJ$Q5 zDw*-wXDHf{sijB(>wXq(&Wtt|ZOqgWT67kRMlxe_77e|L)WB+D6)$*~!FafGI)6ik z+?c@mJ0FAn5w`-$?Zh$32~d;8}w{;*jkC`~h>=q8vMSzRn`jsHc{half=Y z_tCvPyQ<<-EbMBw{Qz&xVqd*bCNOuR7WP-!4**A0=^h$3vU+#|dTa15X$}jL_G0V) zDl$Ri(xP*|WSuy&FNRktGV;*ymgd}thVlRe!8aEm7)JyTG_VJW+QDn0owzLZr@jGI z&!ji_{z9a#N53|uhtD_U{pD&^bt94ShzQe3{y?*2s|AdOZ{p)o%BXRXH}T5}Mk$$3 zt(L1+zdVvJ;|CO)-PgJ!(Ee+=Fd5mag@+N`^l~Vh2dzkI_41$tb$}DPM$r#afWSi! zv<1@k3`5R`IiDFx;Ts!V@X$#Q7fO?AHF0V<@stL}tvta;Q?nqIFAc<{jcgB2wVot4 ze`4te^tD#qyig_weDMif_>ykdz0mp9s`F6a9s*1HS9zXvBtlh~cn{SN6X&>}hKcj) z&zwUAav8$5)o_^S6mu+WGBXWQ{giLrev&R3ug|~Y?2v0-q67j8wFHOApp45$cyfKu zy3$hq@5ZauLkwBV3ZFnH$pwfoP)N72QFT(Qn%HV4*z#g`4~$kiPsk=Ydw+HiO_Yh< zcPi%5c)EV5#Hrvh@BP`uD}yPx7aKWB3CXer5YTI2{Y>}|oe|mA0X}7;n0u8Yf0r-b zfhBU=fwkD$T9=892NT%xT0=%2x9Iec8n&U%11Xt*Cz{8vzuqZ2^e93rldgmL)WUpl z%+8l1@Lgk`&nqyy@_FZtv-QTNrGy%>eUk zuj+hV#e=VC1k?N@TMeRc#7xR%qh!y3Madg9S%a#V=9xE6i$|emb`YRT25#^y(HtHu z+=R`fpceN&0C#PzSz@-cB)z5=#}v?vdOs;SW(gjpI)_RhNG-i{V&57$VF1VHp|G=v zV#aM=5}mL|w)=yOAd4FsYF7wCZ2J z1-3bYaC=SNpPtK<_&w}D37B%O5xp18&X~neisRE(QJ(rko=AW^g*B&=BK==Z$dO)L z9n|W&7+p*FHnrM~o;8LZY6VcD$W2_-LGO+tRT{Mei%+7+E!dX(9w4c>6gwvz(>&dv zhKfq1^>aIC-0UXq&pk{!=dadm0BO;3+x(cF+&X6;YIyi11dS7WK26_E4wyskd*llE z!|r)XoVF7#*dQn^SR?h|^SyGNr)#s|y$9bo*S9xcRbU=ezFJ+E`0!Z88g z%PBFWre&mo!$xfTD7K2nvVW8AI#2CIa*hU2aN2boH%6;0OiG);i?Eb~Rwai#ql&3i zTC(S9Kfu;j0b?g2n3*P8vqr#pp2Aiq$Sh0FQ+Ne>hbgw{c?toN$Ofc3MZ(nVZ^sK# zlGDX&9a2)QxL~*kNrP}t(zH5Q4mWG-h$acloMtizbe$d*7WsX6#1`07Ic2UVL<4(* zsGp9JtidKKc{OGGr}UwDPi1&_G*jb|B8$-`*ckAE!hO_c3Lhd{&@!`FW4f@G2c_73 z=-t3H`+m(Zh23&x z?(Rzo1SM2-V<<+)LJHgM1ydN6R7(i4${Z!JZ<>-;kVhyT>C|De3dWhbig8_IxE(v!QF)5NcIxQPSAw zO-XD$3tXTs?HvEwBD0rqHDKZGAdrEdicIjZ`3#V%WexMBBq{R0u^sL1(*cynLDF7;S0eHlTV$2>_HUm|I zz^G@YP3psDKb&1MbjE7fgVG{=q6isg%^&~aG(ZMKTih(WE_}B;Fx65qa3wXRn z^Yq*|=WIj+AN4fhoe2I@*mpVb_kj|>hlvNVb9&Uk*Lbz@>_3Z(zWg?5DS<94S_6J$ zCs!i&X%G;57=iZXaf*gPm@@@nh%17MWcMS?nqV{`K(G*C6$Aq;CJ_FOPcW!wbI$Ea zd&+Ied{KxVL^UuH!q0w7g!gWR@Np+RG>|9%H54f4ykY5*3?aN&b;Wwr_Bj6l+w>b( zZoT5`76T0r{>UGL3I@7uoCAq4Y)Oetq!&;Qa_>(ut)g{#>I?E9mMN`{DX4oEq;JLn z!~QFsVEmv6QC$Y03Ed9v-4#e%BA@&-tCa>xl7{SMxF4T@0DNesF!2>D>K- zhp8?>-~_tQ~CitMqZs#Ks&Pxdx0vTscVPgrZkApk$b^Az5|;O!RBe)1+poS<(~vx5|`CL@*&23icdaue8{zm+}ScG{L%f1=%57`DfA;p%zP) zhRI}@tU$7mV5CFANC4cQDf@TPX?TljNI|&wVsE^rf|XklDQ*D{NL8ss1QT+hV5_k; zUIg2Cm|*S3K!*voFjuf{+?rs$VRA*7^pPwi80k6FXp#cBguh*R$eo)(XVq#50hb+!F$Vfa^3aI*O(pj z*;}7hMNuN35WuJx$k@;W%BCQqxK`-8NC$={;E0lVMR~QA*9afzRaV|^?Lrm?hK$(O-qPrYLiqynse2uT-5}!zi%A?kfeZMQ7f4pLpZ| zA8COAnIdA6SFiY*>-3S94136yqhv6zSwW_nmi6PZ6c+TijctfOadKohEK?fwkCP-u zb@VFaaG=+vfJ|c7!x)lbpV3Qm_FzbsmaRFi^t)1eL4XOUVnXp%Y8ll1#8QN6tNAj` z223pj$H(8tk$H?nsL-F;n?w!=;FYQDlbEghk98m{7{U`87xL!CGru6`Iq{5)i)1}r z##sf{nljVM(``9R>y-pTz|P*nAPkkp{oD4_HMMF%E*E43X*@tR2U!BQ02!r3J}C!T z=FF*70p#+Wn!y*5%X5%r#+a%ufDBP0Y$p|YVBaX)HNtjn0c1pB5#%yOzBdQCPLL6m z4U@Sv2f0*{&lcn$g4^hNG}Y0%D(_k=FaA7lV*XsC3MZ%+>7xWjxNH$FDMh0FN3Vmu zJRA@V+uuWc#Wfp=2e-zqC&Yv47%h0gxD>C52YEH0T+NOE%dSS2R0)}+CRB<3qCSQ} zH-gnTy`dnWq{a{hf<22S2SS?f;INRx(FWx*FvF~%aLdHJXXF3~8(&S!$R<{vT4azm z{u)>f+&!Hi|13LYwM(r~kDvK0XF7oy2ih{vr(*erWY}mhI0?Sz*~v(#(4^uh56wi-#I6D&*qn6#V0eQjav`%RBh6zegP= z7R^h>&I>-ZEc}2^;RmY&!Ve8aW=weSRO&CsS-TWgG{K6}-fUQt)f5@DI^cXbx|3g7 zf&pDwv4PwbBG)`Sxl9?RX4{z$QXO(#WFG|%-2DC#l0pI`D@{eUrXmJitWxgf%#KHp z6ATP}u9#^5TGBIywDm<&aoZ3($u@>Bae?+c4cAejKpmZYQk*%t$SagIF6#q)7tfs*nmv zY!)G*j2Q|@G@3lE#<1LrO>!Y2zXL)c&Ksmdm!0NvCqn{QC?DQDAoV4A-~$Mn_FNfH4v6qXdK7$hMA=$K zc^2-;q4VF1a{M3FYxqByqO!~SCCp8NG+3}S6oQR|)A9tl`d>Xk4jL6riBUc(Q2iAq z&?#f`1u8Xx$_faiWfbV0J^nL+u6*1CIulPUr~xNXxwK3~AUR8ZTJ3)%Pz?mC%@OF9 zUztGHZICZekqHzpAdr?(pba6A4TOVcn*Yx39(c@T`(&SdyOU5E()QEgpxJzLJVF|d zX9!h@r4mpqwa6@0D-TbNskZ)7V@%1t_!(?%&u+u*P*M9111lb1kN54BJ|ryQRqCL| z`W!XZc&5gK*3VaCzcJz)BT+-wGOBTTB|7d&@GAZp9)h%P>|JsJRV1FOa^I)o(E|vk z#6Pz!&^;&!rrMz{f7Z7AU@J#oTl$mcVI@}$P-+{EFh0$2J3_qJ_4pnyCG|hvNdB^pr*9yMNaY5F2Q7}5gxVX#oqWAN5jOe{QQ+)CPI+x}0KLlD%c#SxNbG4*hQ{`A%{%vHx zOj1G(zGksCNa!ZZlDUn*re3(w(!VeQ4yTRCgy5^E3OFA8>1nQ0k^ns@0*au~K%Y|3 za)8P=JEwpN8WtiPh{mab9%SJ6EP~EH@E_*o5B~kUG+|hYA?CYJusFwxCc()Q23 z9O~pgO=tVO=IHZ09E_jyeZWj?``fpZ=>m2hWQw=L4Xpz9!Eb`&TrJp#oE3W%SL^Zc zgZ1k4C5d%yeE9F{HgI)gSfh29aZyWt|`@lwYBT1%s zpZ(QL&VZ8+%!JDTs59@-@cm)6jI7yIicZns$Jk{fY`O0v^g-M-M3gIrQgJpo9}{2N zrp2bcDs>-mfBG7o;EF9l%lT&uT_d=*ozSbIndx@Id(id4PMdBg)GFM=z-npm> z{F8L8OT*T%QLlJO9hX$hj-aVKFXzG>13k1?S%O#)j945@NQsf7P=-+?>1V`bEBxg( z+-Hcnoxw^Q0k(nnm|`X6if~1)7FW=tpbn`-3##yN2~-psVG9bWZoskc*!~aqfj*XU zo(rFc5B)%EgQNvb56RW->9pN4AcD4X`;**$CIr@o)Ne>`$ZX}kOccIEiuJG(NQk>& z+R#HF&+URyw@pw5i;lno2_Acif$~ONT~kT4h^9(GIrt|{m3C>sb}`Q@-uRT<*82HA z(bkF)2pSh+JVu_H#_7`}#4e21;#uqH!WI6eN4#QZEK-N=NJ>eIuHAN$pTm`8$Fhs6 z_AtJkxj8<3j5{b@p7o&%O9kN`z;?Uu5C(GlqyP8&;Gqtd?cT-f46$E2FLv$j@M5=d zbNAhI0rOh$5IFP~G9J7t97n&GV-BaDY}Kl}ferIvBDS31!*yZ#EDU+g{IE^)&0v}-%897}|ctf5*f*aUN^<7Wu4?8vep2k$5ga-B%v}Y z#ET8h*8wr^Pd$!bYzH4`ByiYK1xhLGg@Y{ezNnFDCYxJmd+&245D3QkC^A_lVub)72MqJJRxFJvYLQZO9;YT zX*;AiCFcCI|obqM7U^CNh~G#YmB>9+0;7X&}R} zFu9_rPSi(W0%7!e;A&Q8i>Ux;Bm#;RQ1#r)Jm|R(S71qcg-d&}4}Z!&V0u2BJcN2s2uP)~~LNr`$M zgpDdO>(%l$f`(vDZRqRa)_UX7i&d@)tE!>Cq$Q5ONBwk?x~@hxt13sG`;!_oWJj~c zNo>?w0_+cfy_wisnA$?X!seIlKiHKnXSR!2kp}H%C3?J99rcL@l`HB`qlnBSoFYZ9 z`28!jK^;K7G=Kxt23^QJG-x-jz>;*2OM9_Tj)*j9qco`QK48NVhYc$<@;XlM!TAkZ zLujyBE7$yvvtsG+j>GdPvv1l$hHL%ct%sm#Zu%%}8VxXM1?2L{eF2L$4MLH%HO)d+qD_;gjA$CULgq>oY10r0O*5@so5lfD ziz*$UHcbcf&@`R60!z|eF73r$KRnVjP1ZClXVVaeO(Qh&nr4S;ZJKiWv2f!)V8Bj+52$eg{gkA0TqeUd`|g z1|rmCaxsT-Nk+yQ&dDTZoeAIEixW5kU&k@UpN&sSrZe>1P^?s5Zi=lasMz-rC*%(n z;mAr9FcLT_8IkaiI(AQB?;;cG^G~}aB5^rHqX~0(*pDQb5k$=xppBWNG3T=wsu?uA z{eU-x1g1zISV)b*42J;DKQnPzAVoG;e)-3Wgc7Welt_^%v?GBi zm(^o0_R2{vHg~91=*WA2qOyfr%{9-P5u4|0QCg5p$a?5*!7b`8GU;=P%v=kR;o9FR z>&!RM{(}1>+E1cdc6Ez4(Favp9F#J97X~wWP|8MNgWX&YN-=wbO1j83V)-Gc2Aa-W z;W*(A7dgk)3-~Z3xG>qmKuqZ${-Ni)cM>E|ba8^{0wCm3;L^+q zA3CtV?Dr8l%S29y05_*qB0zqr0X6=L1l1A4d6_&N1?9Q=_CTK3-*W@XH=wm2SXvv1L1)qS%HfCc||v^C)Mg4=`s6O>8AzU7#`YD@Tdp| ziDmxOhgBQU7%=2Mv1a|X0BBM3DDjE|!1#YP$X7j!WSO3Hoz7nW6 z(Mg^I>L4&8_)1*G3|gfnZK|RzV>7!>LZB@pGrMiC;CM-oGV2hX*(s2%|1kyv693f3 z`j8UEfK8StZfZg}E89W*qikOX*9v26K@n<{s0;YC#W1o@f8fj==Zgt-1}(SU5QeTh z!3}RuH@rQn896XoqM;LPsi%_Mr08XYbaWuAEL>sOzoHfX!va_tt?217q3R%k1~q6H zhJW-to%LE)#=QXN#kLN52^xhQmHPc1p#(cZf(evhf+*?&X{{X6=j4)RZ9926wUKBz z$A02E*M|N=onvnZqS{`=*=u>v={R8TI0-W>41nGBQuT1RagZ7AZdc#z3^>*i&@v=i z5-pgRD*6X!JNG1c;%*P6E_ut=7r2Uuc4hu2bYhhOeTm8FZXZ}I^nyB|oO8}a)=k!X zN3{F5b*m4lBNMiw-tNyUkQ=F$TK?kl=hrwV(C+`N0D}MI*>Eto!U0A7OVzj)`Y_;d zsc{vpkBeKKqDQ+zWYH_EvxoWco!U9D!H4%4@!REU?SL*_fqMXk6D0(vwnPg>SF(ix zq?2%YVRnJQqlk(P<^&C--N+(f)o|3RB^?^JbY&1h0MA@$J{i^aUZtz2Wh_XtK!&?& zjUBdOMja{1aFNp7V(H9rmZb)E8Q59*tJHN`8k=ydi?kJ4c_j~v0-a=|X&H4UU+zw^ zMv#T`1^u``?onA~{Bb=L&(BJ@RmL3u-p)fGL2f%k6ZpJheUVr5*fn?q zy#$*b>g?KpD?_;=`g!~r7}p#vS%xGAh0}H(r3&MEiI1VxuPloU3YBPlL-0vjCp|-9 zGR~DMbSs(xO7q5rTYv4kRm(WyLz$lIRR|`?B<@+lp`jI(`O_}dp@BEip}_$$>M}OE zLpFNDcwCukCy%4-jUh+GSB?lv4oHR^v4r=HLq%#%Bfe62kQ79Xh=pknS;S5eb}bjWPfB=-snK+*pL70M8i`st5l>Trb_qa>CV+lo(OY` zHPs-Xpt3OT)V(oiPX@B^g+$?_LR%SwPFJuNNL5%wmMDb7Fh5le;gc%-#9uh!ubBQc zgJkdjQ1>qIRTWp?e@HkQl{BF>Eo!MpMTxE2SVcp<9TfGTC{a;^*8pBZN@&!z(zyCCMkY51RduSt}gP^#}r)tgaXv6Cx0FRP?$nw#vt zZ<;0#p(dKwM_UTfHbcZ^!`hrwSI4A!H~Vpe2dK<~k_OS#Sp;ac)bl~urm)Qz&K;(- zPSQ0e#c-q^QK$p%R8o}cBt05-KK1R}u=RNs5>GxC%JP|nFG)%{U2!{oBQ&htGaG)o ziqxfA)zUS>_;>Qe7*QJ-WTC|;3h*zL%>p+4P;@@+6~J?p|`!IyR4 zUA>D}RK$)A%r#gRWM!_c8_@X)W5ktIk0cmvPQbIYgl_+VgiG@@N;vGldDrg)nQj}) z{ILbCJj^6c-PN5bGL+(N0tAh;HU^`qKX5Q|l~EoMPAQ~J<3Jv8vM}RiWpC?`vN6kE zqk1gy^;oLV);9K03?jxQDTerKOF?IKIj(Vw1w7wi6!>Z5P=6 z{2WdLF!tg~8{FBJYsg;Urlo9k#7fN8?thuU$?C9AkWvU^%_2|2>s^t;im@=ECNp%G zVSaVwx$1eRk`DRgS4S+L-C;oGElLj|na#Sa4)JW_&iL`m?j1Or87Q(DKVCYeb_3aAnf>hAb1`8{$(yTl4I&Gm7|a!0;F@CHFAec* z;-SyTyTE*CI55H>&+3ozP@eKgK^Tn^1##d0r3#|kgQG_wVprc4=BzJ6ty9_C-zcp|8W>-OD@did8an^zB~NIfiF zfO@zI%@EzD*nx`OsMw#-O3`(SEs%bq7Hdre@^SsTwV|5}>vvq#MBknLu&wa)&ezA zcKsWQx=5Nffe~HUK!!4gL>KO&wi?YIC3;;_)~<_wq3*g!q1n@A9v#+>w5My=>s>o% zXAVe@eBts_#DLnUU&w zST2J}>>=O6Pg-Yidwrtbw&()YnN8Y_3X1d+e+R)p|aaVNyZ+D6_3-0rKX~ zGCvtZuMyXP>bu6&&((1^&lyhhJwG;+_wD>hDCP)8YvvW^!L$fHS~`2QHRm&uF0~Gg z*+=}&7ZDDw-qT4u%uQg*P2vmOBD#$`{v(N7cFOJ%nG%Wrd52Fd@lKt0dB3)m<|Tge z-kXv5?~@-Rae;M#NkrP1LsZ@8ZK*dePV#x%NddElQ}=n>T|K{t2pZw@wi2rJ{wYa5 zjK?nHG7_Qu`5vQt9dst!gL9ARxXq6BQH5&oX7tf~0?yZP(An#J=co!R0Xj0}sJ3ME z=8mdJzu&TL&7J0lSfOE~efB7NPmYd~vcAs>m_pjYbvqnuj|tcGZg$?=&LIUWSyzZQ zc!Q~@>VXYv&}`!TG0qIhXt=UuG`9J(vq|)4s|kYu!I}P4X|TrYB)h~`o=H5ioi~^4 zU|IuPlCJy2Al|EznYlEEIls3xn9FM|n=_Z!`fScz#?9x+QS6 zs;T>c>#ETnT>Gsqb+l6kE<6?wE)no!fcLj8i~+9m;0j{^OJ?8_Uw~_m^8&c;vuqAr z!G8{80L$jV)gqPwS1VxvS6hf@6Bj)i+bUA$!KLQ{m+}Z)Mxz8=SL{&=t}YL*MV|m% zdF`Z30+(g-{&Qx;-##aqFwACv{R#Z%>(?8!G`wDgds+moQ+D4BwEj3`^UyN?xeb!e zf1a+`S>OsoJ+i8-Y|e&q;FazRFPrxky!MjbjKOPt0bXkmu7_77IitIDOYmyx7hd&; zdU!qkr&8Tj?{!y$hnEO=n|a-53%cuj9$vv_S~7!|_yS&kY6L3Rf|v3LUPhw?Ub}p`6keSkUJE_E7Fu1s-wicq z{F-p%pSb+gFg#Nx!OJo&TdVn-0htk34mNlVD8Oq#krN;0Z@lq4==F^og{>Kvf9kSOq`c%pSa930reoDUWuBSnf8juxfSj4O3VZAnNG8 zh^lw1dx_lhQll|MMFm7HMV=l}JrXU5(k&sXxnD%RaEM3Lyj7(ND`|*gB;XMx0$yRI zYYGZ0xKlx4Su#VE_ySSiJSQM(uw`?I%DYn@QI^dkszEG+s1#v9R64}7iJv?aLsU>$ zdM-pMj}T=vN)Ywf@KQvzdqmCmi26kClrjlXmZ{jC`fBwjb*FmuGN^N>w*OX%!urLq zfUADosX^O*oICZJ`UgwZRE>d(v8V@?2zWL1c2z-51yBVwWyuUw;tNpic2)q@J(jJ1P+2w) zs-##3RCR;_RP`aAOg|UC8b{w?Ax7c2!#mpwkaQL1xmsnUozJnU}maz&7jk0J&RTynkot_f18@4vG zoD@9k5+lj^wT@`0Ff(6ze=xr^kWI|xdr-zTQxo-~r^%$~*zZa7mkmp%JMOU^({s1X zBz`3Feg=bCnL#R|8VBYF+FU|&{;17n8m?9_zo;rUFIV1sq}4-B7EK!zt4DW9J?abf zaK~FwkK72^y8T4^og&)aLvpm$Bcs7_+Dl7lKe<(2Mg`i>fWhe5i~G>_w$jn2oywx$ zZWH5sNeS(?{%C(ow7=b#wpW>sHkjgj331wsN@#zvKiWHq_RdDT03HFoi`-td6KCcZZn$7faa!+k=;e0QTcxuUTcKI{Y}JFiO7Meha=S9x;a}RoU{4a`o^~oQZHJ=| z(34kRA`ew`eH88ZoJNu;E5Go|u$GR^3rOBFuC=yQgXs?wD*Cs3Ft5HayE?=O7xwhxby%Tmu4|ckZeYUA< z_6qIsTHYDm(a&9W2~T(d3vt(rwqy7=&s(tJIf*ebX@qkVh`u^Ro9pp*qCZ|^+sytx z266w_Gi);}IS{R|9Z&T&t!>lfQ<37F|5xWXHzfYE^P4M4znSx!x4Hm@rt_Q26e*nF zeES@e%|mHq)6eq7L7&*zIp*^PToNvafPIfwl5l3t7Ok&>tgi z$2z}nxEXk#*)!ldTDu0pq|eafGgwAWb57(|x(v$-8JOwQo6WXT+hOThQ1bap3oP$t z7h$}#mUwA>Q-7^Eb+d|Up(v@#^^{?!Kl^&~83XPt&m9eixg+>-3U@6xWfMz@CvrQu zs#x9AOiJr3K8O*ut1NVuMHc$=0l;ILYm=vYFq&PLTykG*rQ9b}E;g&+X>glo?)xci zE+rDKQ>;z0ZcT&hXrC>e#j<&E+JJGc6^u&oB6U zmdl-l$B{b*5#-Wd>}#zu{Yh%an4~zX%oeR)vecV{yO*JZyU+D~pKDWPmG{o1(cO{f zCl3x{r&3LEu$Q)FdGFWrxps=@Y81Nk9_D6b+Ph!xzP`gVcq;A?1w~MNzju$`FGojS zZki_Lf{`xxnhU<-f?+Ng>Vo}7qm$0Z2*&qgGX;;I<5W_&oQT=$Dsf_@k~9R#V)!Ot%ZA3vIFZMGlZ~d5KK(JB?0|X1c5r`RNtzJp5s(b zhh)2FEq*OUt32UFDvYF|ud-C7n*)@&P0!L8?nXMR_V>Awff76O&RUhqVSmJF;cc;y zMBaJxy~UF(!G%b7JngqdIyUK;yN;NY|El@ zIu@pna>8acUiWMj{;O7=`-+y<>$Z{{olbMfY?YOMZx5D;8@QJ7vb`8~&DxPtv8xUp z(+u6q6S+V86dNqO#(xv%dRITcx<5S(tVC9xr;)X_W|r}>$%9$anDVdP%MM4}c98GD z!4fu0?pE%djw*{|l9~|%T&}*f+6=H|XK+M^pNHvwK>k^ZR=Ri(-%1*!nbW2fTUtXa z{$ICd8r$EBe=64q1bTm@=5fu$wnr0RXvS^BE&@TjCacp`SU^=08l#D#pZ|&5<6Q)h zCf7Qv%N#&JwDwGxjR4DQt*Us77P7riA!MCk3mh0nq_45!@DeS&#_iAmkB#KBjP8N- zG*nz_r|i`aNvGn|&QKm_wR2C^+kk;PooBT%!|>ih|MCWf_vkvCm~}(IB3`U%4M`en z)UD@?W-J}z$13RsxmoABu9)5 zm*d7SK(|MY2czY8U_(oI`Gc_N{f}<#BC_{CCi5kGxu8ZJ3!_jjD4`$UM!JPidMpW@ z=Xi$y)S{9qj(5v;+ldHCR+B_v2vaK`F${4M&1bGHWNx%wMo(zS63?4-#+}byl;(Yg z@w+dWy-HfpSx}nUzs4}5Z|3U@nK>6o)2xS=X0{oFM6RxH<}(YKN6*=yiT{5ym?~o1 zrZN(_U$T`#@QbFNFPnhExBeZM-=wXBQxSYQr#k z^SJvJPOSwP(61Zuik)6?_+@D7OR7_d@@WI_CQ0`Iui7aa9B#eWWbbM1WMYuljiN9@ z=Ae12K<6;6fXt$sKm3<sRBcZbrYl{y{i z4Q?Zh{N5r8Fv2#GhFJw@NRF&{_(2K&i|Q&PM4RVnc%B*G00ntyl&m9&mghUm(Zjzn^<~N0Uv9vFo6&LEgguoba}p` zo^ying}X)6HEb|H*p!o1-XPGfDEXR|;9!t-pdts_PQ~r5HhL3_F3IS>hmDYZ&~|L1 zR41l9>uH6s7|_-uHVOx%_-K;~0a9tJl^+vu{=m)!v^j#Nziul<+gjtlV062<_GlaU z_NLKh$qa4c3bgG%CZO$4Zz)^x;{Ze5DDdga1_Xt3~O(6(1|3~f8WfM=tMiXmH+y@!roj0bol9fGu4Cz^`&>g7jZf-D{!o;!xO8ncLe{ zC|-U~d1?9GzWg4AF%+728_#+WtW!`WWv4tQ=OY{+U08@NlE^@+o{Fn(H7e)#?pQ#o zD^y6m_SPUv=PKYc8$-B*#?UpE-LLkavfd+=^}7>!EWH?3`&EhtV%{&$)@F|gNZrM< zIizmuvzcDZCVG~7ac8NO`gdiN_+=?aWuBwT5{~p{!UJy@OZH|$(7A`!!5EAfOTHHf z`sxLhgiPyMye7o6iK+#$<&T~9ocu~Ff57shbCuqE+-AL{bHB4?X)jn}+%9mZTOt0) za&1EA)}8KqLG&fX{(+T^wpHvG#ByKYCF>bMeMzIdX7Abb9Vn0>vBYo5U zk6$BO8?oS$7y08$wQ(_m6#wnibmtTA5v zfHuzCN}m-gWFtE`)U^?hcy*9v{+0UpQuj7o8R#vq=pop4y_GjFU@HrHqLXBPYnQHM&wU#iYZqsSxFSTwnG;rm+jc-dEokAJaao-M34AGQ6g*5p>noA4ewVtoI zLhQAkeBboz`Brt`H@nqf^vxbZX08{G-vCzt)8PXj2~vOPn`F7(;d(&%;kk4h-mHn zMr@d$%unZ~eXSaOEt?d=gm2JH8bO5lO8+(s!~7*a*HWL_sK`^ZYffpl=NMWG!&z;N z7=3!nKVY?l-zsfs_eb_zoXB0K;cqta*YEhsz>3SnB%delh!$`3#mKdaS~B{wucvQ7 zo6evWT_((}=SW1IFdcbDbzF{Ic2Oeto(9omapn0+02h~#?S>*Tauq38k&;}yKb!7& zD*fKG>17`rlJ0mhz3i2W^iEHt2dpvUl-~V)ZvZaD>CPs$idAiqRms1+OA$+rJF1}^ zppPSdqu<#Jfq{*{mS>0NFK$70MHqgaS-@zL#q)>ldV_}%LUYm{WyV;=Pvxz}D z*Y43Sk2=+42w%#>OjS*^yX^wn11d1n-!35Wc#qA>&fQWd7S&AE)33UWIadp}hX-S; zA`wZqLO|$1?7_><1rwy7`8`jwCrs`xfRqSZp6r2-X`(kxsT~6!)2}DOTU-VbCVE9g zTsbL))2_`iH)*=Da!amD`r+6UnfCpinmvsy*3R{Pz)i8(>8<%`-^13aJNG;7o3=09 zaK0K931Gp<|w+(x?uWJ|Ht9$TvoJy`iYHaH_( zu%wkrf*@*q(qM$wo0J_arL`iiy?JefnvXUYqOB?;%P7#w@+aMJeoJk^yt=Yv$p-$H zgG-HMVng)?kG+&ay4DiP^Mj`c{w6!=hU)bWO#KYijp1zV2M26LeKb_>v~142h7rCS zs=L)(XO&ei#$1OTlu)*0rgnnM#`hLtBYbZ*jVa*+fwW0rShRLRs%-K3Aw_+A; zw4T#gmIvr6k1DD3r50_we?4KNjXH^@UL|etqA9b~G=)hRZ&P8ZMf?5nz(^zfXo+Ig z0u*EY8+4%w9tZBUF~C^^o)POi6t&)pD4Z>zngQ*3qY5*4E{PiP@*9d95nCqcN9Rs= zGkBXSWQ{Lmt%aOIq7a?dgp^E7?g2{$Vpc;!B+=+}*lSj2yT{N~8T};QBFpQ?k0}Y; z?og+No@(eRPVHf6QfXTvUv4C|M2^z-X)R9&9p>m)OFK;DTVuTe)n`%CWS^vKeA2Z( zsbw+$crcv1mRPOQmHm6~l$Nx}XJ6v8hpxHSGbx)drq^)o`(u(@K3ZRhrj#&?r{Xho zi2&0Ag9}~Lm8Djl@{{6LWq*+8Lw!%ERd(Ms_jq~JUDJ};XmKqW=woL#gs%DSOUl-N z*DPdHy~ws`Waygrx@`S+P0QxHX0rimuFV=!W$T))+_QK#@xbf-bWO`c*K9FN@h*%) zd3D0HpM3lF`=woTp%+b;g&)&3cN`bGX02kOYgX#Q=3W7n zs_c%OW8J0qtXpDZ{h%1@<-NQNp#NMKcZRhow+(~X+$;R_zLI;Mz@yo8UWu;j{ao+h zTuvk8@4tz@Yd^!bG2~ou^)5*DFY60KWg9a8|6zaGniqC2J1TqNN|w)$?kzj2W8g~3 zNOIK{EA$rQZ{8P8k9=lkdGGMd&_$%*%>J@pjP?7=x)dqwFFWpZ6W2F(MozU@36oD@ zKEb}9VLK&?z5&EKLX)*vI?ql$ni)=PQpG8z8}G zAm3Q5RDW=tm`@4Wze4>`hxM|JHeWJ5L5|t$8V%)(-8loym!!G&_-oN4zK_x6*4Lwb zR>b^W^}S40@-NP9-4bH{+#Q!YRbxa_Nf*?sIlWn;S1_QOYg6XddxyAn%X{KGKXk^^ zF5mRdWnr|arF836@2%~3sJK*O2>vo=qQ}G%D+^zp&i

    &aF4kz1`AW#(oR-(vN%I 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

    WYgbm+Bv1Dki5_)f& zrK2HUc4b&S8nq4JK()E-ptfvNwlkFNvNS|V>9~VJL2da9c89qcdDVB@u5;)OIsP ziQ>1mG^6vQAz-@F6~I2BcP?*RuWw?jUb8uTR7Yj8)J7;jBxY1jHzW-W+xhIYl9a+NEssd_23WdWE%S_o5GD zo$X2Lg)0!6!o6_{@1TEN2}WZr`>2U_!LotLVNoOQ6^0B0qzQu&xu$LIx^7vU3jt?zh*TX-u=q zMoD0%SkurqWxs=8cxy`=j!~c`vgS+yj26cwu)A7u?2X?q5igp z`aO`Oox{COIt|6fh8?fN%5}_P<5okP9T8#4334lQu=kbc@yFHPB)Zm`pu0eEoNe0; zzhD4HO*x$VMrciTw}9^&Br!JUfEvDQ3|K<1y{*o?IF_+iA)s@)u3YH6unXWL9|{LgcbpdYkhyHdof$ZefUNzqMsQ>|z+S z!zTu-=T+YpMJ?tGJmASao^0{tN1pt^lbb!c!ISl#eA$!FdGbk5uJokr$z`7W!IMEx zLVIubr;*!mMLzK8--&lT3kAi0#m`yJT!MH&ERlJy zgBo|4glJMo$daqw!oiQivZ9%~WmlNaEc>K&hw{P;3$uv7wh&mHbEYj_+^wl%dCu*H z^5X1%g46D@FeH+|J-WUtg&jU#;Plukhcf0+RvVN$x&&n` zhBA$6POs-$fu(-l@$sn?$>N;ee7lw>)Wx9oA|dj zADR%1k?ncu6VXupk!;9?THI6fFP-RBMl|1oF{~{}Zs+xFc*-nZ$>mrg{X74fA|1iR zK%C}P&VeB(-56*<%vxmjjDcL327(k6t`X5T%#QQ1J9B`9?Z~G5#^@!tLgEqFFkAn@ zm@H=o3NdXWCNE;RSg~LfX=2ZG%~o0PMMTCa+E~cd=|>4!^3c7Jan5pYvv%^Tie?Gg zi1sU*(x!pNZyFnm^Xmeb3IEIgXX8UX^?{u=Fky6d>ka>CdhH&g(6<`Y|F6Y|`laT5GGQS;#HYeT zeCP~|5AkjZojer4Ie4rVAL_w5(wsOA0Y7nPEk1NcMg`1RG8G=TU|P#~H6 zA?X1u!r(@1%mOAQ%v?f;(2~JY0OW(D6fLqT(kN5=nJ11Yql(}NTkZDQ}&`jM4plAEdM7StF) z8%8fYj8YPSLDe%{p=3PZ>mR~O|OgyOR{(f8!C^f7jmW&!g z#*YnAJmoM89nXooDsPgTdW0PHL*)lSYp3HZN5eU61J)W1QG7Ak67?sL$W$KWk&|jR zvSV2^ywh%9m~nS1r<=h5h|FQbjodEbG;niJ)QUD9H_;ipeKMy|aH(aLQIaAr+Q-g| z3N)|s^vO1$pWA@2V>;w`8^W3&YUh-FF2nXSNx5tv_LK*{F)nEdWnAg)}W_aT!m_rL^_*;6qIB<`3{m9fMvd;wPO@`^F?s zrhBzc&<3RFTj|pF{?Vz{8^-GkeZ&e0YvESCG&<#bklPNQVyB~y-U~0lw*6zYO3g%T zw{3GiL4-;dq*1#ibmv1Nw1(Bsqc43Itln){CHRy_JG#j7C9>Bl5IMZPM=UR{^Ie<7 zR||TkH}#S>$fT`M3h#$EsoF-B8?f>#eeW!eOP`+YlJ<-<+NXBVfv z=d4n{J;(LEJxOV|FdG&+uChFmA@?=<@fz1!1_`yU$;Mtl zb`xP!51fcWg?2NQwE-;~U}`}k54mc#b-DAq=rewI!kzF7lXVbL!rc}nZ`R~}}MtvBCUX#ECp*-25OHd9EEGbL;k>2s_rFGG7O z2SZ0?o)Losr18vE(|jR|P-iNaH;^%D&nYsT)kWj5Egvu10%pCXIafOk?{XUYEYTN7 zEM|QI=fzGa%#5|1G4LE$OCFr;ue?S0z8MrNZ{Uy6%jLNj{i273+B~#J z51M7J!AZ^N>Bs^JBHg4uuOGFw5ue)E>hK{+Yuh`PRl;9aCCxJO_Rc1jOGF%z8_Z44 zhJ}yYgfImtrY>uhQ!irb4Euz-QQt@G1jch`k@d;scEfOT2Kup)VdE7n*dWgGZ2l0> z>%;R<;JD|@cehS+v|JO4SvKwU%_xx=bWkt?@!kk;t`ZPDMt^#*Ci3>hlnZYJbly}=m8dYsE4`u2m;xq5@^z0(PqyZ90` znFFVp%KZVkxQSHz+2|c%NzYYYCLJ#-IRVu!RB8vNMtxlhUhV{DL*XUzsB|S5m=Xd_E5`qYKm3@Hy0 zEyd{;7j&saaWbCyRt|;5(fl3eAnohP(civ*SLISf->^R=oLBr2=7_=9Bv}jxtQdU7 zbWy4>|xMUha>J5YM z!9pK)Ep1=dOooY?dzuSy5@Oh0v3VdE|4@n%jPmNn92%5)}2K^N5esm(= zL95Ah72xX}8)b<0nH(F%t5q}D%ZbNY6f+IBIX0Z##@G;Q4UBTR#^F~eSI6z7pc&3h zb`P?1E-v|02)X1}Za8-e<@nTMO*jr|CS3|f#jHm_A{V{V?zT;dPjYRriw#GV7`L_t z=|~3Fk0tbmTGOm)T42_ZQN4ERN%gE#)~lWbK56ZQ53W$m+ND@dMmJbf|KxPAErA{3 z^9=6BU;wXPTW0{(wEz$d;I;ogvjL?2A=X`*7)j$32N&S}M>7U4zRE(X2Vhem8_f-UoL+AYpmxJ9S8msUqJm zGbFS)_fw4O<`(srfP~d^B=ocT88zH()mFOehRD0D{rF%?e6lU5B!*;wnuhVXQn2V3 zqGp&C+BE-ZKl7g~&#zl6wG30ToBxlqOEbal6I3rUiGDr+sh;JXeFrv{$(S>Bl`*w6 zG!)QkvUFu|1>L!&`cfLk-_Ms?E(K7J7?U-^{Ne~^1WO^@<~0WuTds*w7BfJzaQV`}ljKf!YVOwX_*WsMB#f=3ZP16%d%TzvUJiP{hUBYc7!7ZQGv9Z<0ns_0{ z6bI#>QnPq&-s$~ZCEiKi&)6PcY8eATHUh;L7x+a6w4aYzn}xNN&&eTrJ{nM2q(3L? z&vQ&6X6SGQFmXk%G0x@gYgFi?N)*bkW2z|%@8_wsc-3ER;qvJs%HD(h8e#8imkzZ0 zYBo}-s8!dvJI=h2gqirL(O#QcRiDaHV6zYu2-=%<^u*lRy*%CbpZ#JwpwV2yp2{M zM2{U_4`ygQz+c-4-#HVjjwuqB9SU-J5p58eEWRH|swoVl7HIS23^J z?H)xj2b3*iIk|(6;qRUYCif?QB!##-JtrIg~#huFlv3!G(GFdEKeSP zz%n24WVKBX^|H+55oI%w=z8mo&pgmX5?djD_OdmgOg#*@|I31=Eq4 zI?wkY)GX5*4^_VrrX!q!ER;|Ax|NuWo-=j-uIlHaKWuaUi0T6v#jyZ&{$h?ik56~) z1*GBaec-P6bgxpT$d)1_X>NlxU`7?*4{uVnjg3xQtU~IlV&(@$^YB3>BKoaQmj#q!K z?MFWrA@x1i-KSccGpLKW27NYL4=CiK&)#3BI3-haSqZzA0HDKvpi1w_C5 zrpaXLx2%bVodFxmr-?qkABiD;E=`P?1)N@BqMBtpypFcbRVlx&c&1`)_VpQ`Q;qc^ z!kLuJSigQ;o0&$eSj+B;v8Cy8ZE3Pob-fwqD|#>{Lc^{m zrtjjm?P{{SC-%ZS62Ks-k@(!3{OoWPHdFblAONY&SQtWG^u!#`PJX>9v2xh(c9ln( zDyQzm&=fB)MEm`quHp3Vp&6V5kOl|e$6WceerbPn3USP1PdGBC+->$Y#Dl{i+g$A` z*$8Wx1eyy)yt5U*5H9s*t?~@T%BsIGA86@TOMc}~cX{$tPbNK?@Z=^>j`Rxa{As>F zecGQs;mP`I@vFYd?bfLoR=x8mS;+#OA{E6D+HqjaRG+J?1PR%UNVd?Ut=zB|wbwYN z!5SV|m$s~|cW-#BIi-c&-lPUB1JmrsR4`&_tL9(;?KShI;LnNf)uVb#G|l25v91Wy z=@45Bo>y$SItK4Eq_*l6`ixTIUPhn2%UHO#5g(H*1hQNdcf*p7{m(5HXu9^?c5X4d z5q@BFmV+?PboN|`YR63qn@rBdOSUJ*ho&Yy?b^k=7R=TMTW@ITkag7>=>la46FM)q z&BbjiP5fE&-}jWBPW#?Zzwxo0x&OU~pv8DZAlc{Y9RF&Ip8fh6F7&Xtu^b4DJsYVr z?|+Nmw-;S^imt%04#B8Vn)`*6?y7z!+V2|F^OsnMC*hY}5j3)$c9%mWDCVVi)>CV@hFon1CXkxb=!A3D zgVu3@nR(G*1#0XRlX&Mzke0B@djmhtJ>{@j%wms1GJ0{KCwv4byj`Ws1y;kcP<~{* zOL9L@h4;^f+yl=owsfe%{?hO0Lfl3@WmWPJ3i_TUat=|>0xPLs+*_!<)v&fx!{C&4y+=M=3ahXK`7Z? zUlI^W$vvAY$B|K^b#3x0%ZE64C5^~Q(mj%N9!VEAMn`S2zW4mqh;&g}qz(GtGNbt5uXGl&}IQAxnyx%2AMwf@OFuFmcZTx6~Ny#34x{$a>VSW2>**t6$ zw|Sh7K+eaoFZu~OcWPncVK$d8IiZ>DLtNlBr78>tam#M6bCvU@SHG)Cc2G;xrY$4P9->&m7hZHwqE&2Lq!4TYA9vOYtkg(sg zwcJl_VT1Q)0Ni5%OMNS)!@fRowq}Idp~ijN6t&Clk5!{MC8`u{AyO%u4<}mAC3A@8 zm>!I()f@cLrso2IKWz>1g~E=)qWiEPTM=HN_z0YujS@b)xa6LefFSTXcHL%IgZ+&e zx*;?Pd?61aJr6=j;@&lQQ%~D{S zzVM`ffo(E!DoX2mQ{xv^$3)hM-MO#_q?AsbLm`!)p^)xfxJRU%I*&rvhC&7bNX8h8 zM*WwX%cFcD6F1JA;fsr0C!u=fm(H0zOU%&2GMRDY2|M2bc-1pB%Pm8N;w_r{u#2N* zt<@X7QfX_OBiXti&D5&1JC4G86w0G5VxB(r1>DElP~}%_ZW+VxHZDLdn`)n%)XP*N zaY4<|*5=Wc>nMp%e^9D!d?S8q%G6c)Fg?3ksoYG3%8mMSi~f91^_RJ9CHFfX7@6Q; zmyxtW?*eSd*dQ#tBzk(B^(H7dE|l(xOP5!U8pWt$lwoc*t90e4@EWG;?D`;U7N3uE z*C)9wMe>=y(NQ&`e;|LHA^tqwHt+cSmU=NhDOyz&gjkSsv?}MQSF7F8(RF|#*N&ta zGA5&dRz6!geU1ecUay&Iik27q%(YG+(1}18m3hb7m9>_Wu1$k`dbU{5CmC{*V_dDG zS=__}fLuApWxQ1H9v8?--W6LepQgBcI*JiP8`XcIa6qlC(vmw`xaHdIhd0ki1f7h3 zG1J-n@8@S~?^)x@*jD)zAbo|-`ylT$BLim8hQRbsNFVET(`y87yoc9tL#nfAvUSDp zVGf$-T4F3(ER=@O4Q%zugf22OYsNNoj^lq*d`3@pO0smSCg~7XAWOO*qSIj0M+=Qe zy}MC9)ZGD$L_IrA|2u6tPRp30StS^|5els;@VeYEUmC!%xLZQ9@IZ{g;(jv6CN zUxCZYgt=&Za4eXMLi#+7gB&)201 zpd%v193vV$oCz$>C?BS*x0Gm>l?x-w@Fop78!I0Wq>BQiAY%V$5y6sJ2VgZL@`BlC zv;<+EuL^OGzS68k=sinnz2|%QI!3~AtbW$|-U*>5eM(&vzBX6)4|Q24g<2Ve+p6Og zm8|GcsvVuKJW~~+c6u+FLoZ2px(_#Knu`js5(mnn*}9aZH}I!VDaz7Ms%f9FNu&In zzXNYxfR_*O3IU!BncxX)!4^NQO=M(kBAZUDLom%!f@xN6w8M-bZp`*l zlZl8A6uT{LuAU#O0ftlpMM_PTuQB_tevHE*=Tu)`?W^2`!LH0@k6?87X7dp5^yK78 zd)j1A%wJ9yXKyRd^2?c$OBf!a@Ld>YS*&31(55U*BD@Ql$6dsGCo)+x>oy}P?B!6N+p?B;QGg#U!#mU zT#Ph&2YLpzRyM5A(%Pie4J#Wky_aWWy1!u1bfy#HQ8>-~fz4KgvI0D=2lM6#Mz_q; z;4AhDl_lbNK~LR0JugT=G{AYAcJJC-&Nv-Hg^s29E}&V?vC8SPlKS;*HD#P&9giCn zPS0v;*QMDv$H{(z4=^k|nAb4Hdp0$mtVxMk-*E>OZ6GB?6Sq zmkJu=hqv3Z16@e-fC62}QuVp!LKvgVHiWc zPm;`8A`ZSm45Re8rOB4FKAscEu)UxbP@P_DDSWhvidlQcdMjn5ks9isu=004ZF4+L zNr5(|5~fB+8{DA#ypetI?u%CxvJt($E4i37&m5QAY^Z)NjSZ0!>GLlL>!(zuH=gH7 z!N5>+JvSDhKW-2HK`9;U9?~-(G~nwk=4bs7|C71i!hMR1x3maapSZI|rCeh$KPgh2 z)uO6$Xi%hal{MQ$bH-k~bf(wbF<@_QLESem-W%DeU?NpJ8L99*u1!n zp{F{Q7PR+d-{~i@SgW=V@&U@qtk4jw+`M>Jts(2o!c0n_o1VU*qI7?&Y_xLy9uv(+ z17?Ojz}*VC5mNabdLJ*M&|e36Hd6dWZ8#=Yu!J$$R3FbderEnX|T;j*M(y> zo#GsZ&*EnBigVZm2;;W}ehbsMr76n`We}Q`5epIwg`CTDIw3g~>$JdBbeJ7?X<$q_ z^NBZwI5#5CK3z@oqfI}eC5t`EZFuJ_>LvwgH~hjG1^Q8^o|!Nhhq))>WwiRj&Qj)k zFVJ;=?`x-X&qYebR}ufJbl_RvA4wYFMJ2#I$B;%XpL|kcJUIn-dM~WmWQZeK8cw>9qb6gcL}o)Glx-- zPKbQuN_k3id|yZOqT7DQpdgSVn{peYJ%ssGbpNFwaxu!53;^}(7vf_V;)6F9(L;d& z4=%N(3CbhK<2nlE;}i<*wvxtduxB#~eT=!*^VIJde{H44w5LsLqy!M}=IsKRw$>Zw z?0xQ{$wC<*tycgBm?N9A8||j^1HUI03(E%lK+8CjbIIDCt~J89I1x8lTJl4N{FV;1 z$n0jfIGL1huKv3+z?K19QOI2IeuQpm>EnF%@DXq<$UB<&wW4hY7nlCgA%SxTMDie7 ztnQ*66h2s=g_fl&&Y4|Y`Uvl1esS@AQ?*5x-$$o?S2X=|@;_zw@_*qKb@Ja_FaNK) z{D=Op$e$PqA}KAt1x5tpVeCdZG`@XVFPGfjVxKo$DouL|`jY@i^k<(L^{2P`ni*l9 zup5NKRBc7cd}x-ng82xB=nWr05kHxjpL%=P zdfCU-m+O`=EVeA~2R-R6(1L7K7SE+ATD8kRW`S){ho-4+jU9Qd1o0k2o*Dk-)3FU2 zdo)5EsZ8K>t3qD+)WSGK&$u`>YOo$+-j=PAERUBMKL39D&MWF{r^u-9&u<5J;4Y^H z?0I*%gSkl4hjergiuckp^snGh!C{fqPJj==+dP9L8v;Ev|q+M)KtLy_p5!q zW1IO^%ng*5J-v0bBa43kBiIQ(H%ejNa3sIgtCmVjg0zbglpH{&k*zu^Tmf$k$>{b$NVP^v6n=6(O?q@X*k}Y zXO0w(TRPgISgVHbDW%linX2pW{J6dxs$^%%4z*-kp|W#rIweY30*oV~A%I4L4 ze5Y2@ooO{z{gTid5||Zt63)L!L$AC0DsK}rmL2qd(G*cO&h0CYBFc-4C?eim)jq0C z;*(z6?1iz!HZv)(++5uc9~)O>be_so-i4}FZfDwDxs^ZF>uY#Gm_EsJf!=E@7uJS= zkwWGad=*SP9g`c}8MXOBU6vhZZHwTcKC2RWG79t+x~pTq&3A86I3I zbyb_NC|=f1Qp)`2Lb<{>XL(pL-n!x&%--NY@zct1Rv3mLwi?7dN59w%1YE}XlSK=7 zDbt3A@q1H4!*jR{MV!F&=?`Eu?I}#`H%qUrMtY=nM)_%1`9o^0%xMR+sj$|{TToqWe+EQ*#Q;K1- zHrf96En`vXlVXCrb!NzqLh7EhS|~64AgDi*W$N-sTWS8gPZ0l}_Xw8tSTSzSBk_dY zxCFr#O>wnVR^=win(q?yvh%e1Gv}yVMxvC42_X`p*VHRaQ~5r2rt)HeD7Qe@*|*RY7TyBrTiO)c z?Gt}>jgFRUo!HgDWzJ#!&l}GV)pM$y9wQ?YTqW6E@W&#&_@-9#M zJ$aKSuk++po-Fa?MV>t0le69fQm5G>M&iHO{=OH;5gOT!ky;L?@F9)Q#I9uUPS2sI zv+)#68wZ4Bblfw=HH84sCrnRpBYVZk0bD!2e9{K<=RWi-S)-e_@jwLOc=%qtR1XqB z0AEzeLh=EHKK#sn?#uMgBW+|eXmv}iutOi7m=g3e+eaRp#kS+tE5XvB@iiAv;mDVj zyQ5NkDHFK(&Bz0@d6`QxcaT_j~zR3Us zoE`7aIZ5K4upfC$n=me}QOWm@{zZ(qQ7hJ1<}-Oyp8wW2>+r?p%1f2}rkBim$*1#X z^ROQDPsQRk-^O0Q>Po(WwC0nr=(niQLBNZy(9?g8Jl2dy@mNC@T@5b)HX_jlt*b53 zSQw;ssYxyKEJMMi#u)rX2UGm;?j@J0*j-GqObuM=(1$sB9f&TJPwQN9?**@cg5q!; z#i8-ip&PukXf2d4?a9KadoR#;AB#qRn)Y{4rc$OqMxSRlX7%CdS|wlCD0T(EEV3EO z+j@b~%E7bDyw@pQK`$$7f(Qe$(HXzH$E@9eN`^t1@~ey$^N%#7Hkbn6c|n`78FMyN z=7w=Ir?&qXJ@zgd{z6#hNctBIh416NMV)N--^bJNrhhhj^N?pea%<2Lc0)VVRm|kt zriJ*sZnV9V8pUqm~)hb<(2+KTC$>mO0c(xDd|D}}q+fH1sHJobXZ;gc*bYBs6E z{}SJ2dMi)~Lu!2Oa@XQTLN2FqZ&KK&N{&e@5QJ1fj@y(`7yB{me1S21^37RN1Cx@g zCP}MRGyXW-ue7c5?V4I$k5V-tXHDAH#>H~Agp&UKZ_!HETQzRv1RtwNzbG~Dno5@# zid)ZA;w^C|D={I~MqQ4KxqDx#US`Y~#7ObEmF`Rgn}elkmy$5lV3#%64a(6qm^fM` zhxsuR=iLA3lsLa5fiXVl98Ph>rKg@zxu4D!eeNoH-wvLC&sRQw@Fg23-?d@Te+F4cP z_R=GzV#!!B8g4yU>1(Z~kMIN!)M~IOrWD1tMu#^E2Z*d*8AIiZ68ZL#ZBH-wac?7$ zJ?u?Q#4p~E6!QJjVU|+PEL$2I?2si+N1uAgZMKc>7;9!{h6Q1n8L&uzg8}t%2)Sv3 zf}^u0qD=UDn6o3GsQH8p-^k9xX2z~l&6G1gcvXU(Wf^w6e*Mp2hu86>*tN0=qDAQS zHPU6fx?;Lo>ga;2Caj#XCx#EC|K@h=oXpA)T|)m{IfnS9(Ga&;2P(U$HiOp4DXiC; zd55cB;uo?jN-d%$eM-&C1Cb|}SH0HI2Zt~KQq>yXIQPO3cW>l@J=q|s53zhmD3=dC zGo!_!d0Q;Ex%#d`agG_Zntb70R|0Axnmr?kZY$_Y+ zhm{+%{JM@mVnd%OALE@@)Gu`E0H!K$O@voRpcml-G|kl);3AH;h?+S+!~<8>(S&p- z0g{GC3)ut_YwTl{ysdnOSBp$Htat+Ckl86h<^=^yngfoQW{n(Do{k!aqS@s}$J`IIHx^ zJat#V&k^Ye7HrU(cS{u`Xl5#9y#6Jp+J;pepHjSXXs2_g(c{GV;_bOHx z)Y#sD%?_dLx~D8g!&@~9u-s7K5y>*d`VS9i*>7u}%4<{tG?*fM-~B4p!#(wSWWl`< z0JEWe2KyYTP&u>l6^RA3EVF=ryU#6Pn^?|x|Ky{@jGPEe&fN|{6B|3vg`IEU)OF&i&dp2Zy$x2rPkHm5?Qr-58oQTl3;Mb*)8|hhSv1C zQk~yD4U&VX=w7tK+{+gQW)RwxfRr=)zC00{Wtq?lzxs!UEmUR@aG`VK#mRADv}mrr zEg==#7OQr{?z@_HFW0oFLAxh~XIi_(^g%IwJbuG-^|HzyT6*&9%8x=7>eSfvIZ^-0 zlo!^e<8k4A1WtVgE5(mg;m=bTh~>`fzXy00;G`yZvMN+&=*SDe_@L$hu>3}#V72U8LHqh)-PA-C(*st zN^3e_$Y?@eD7M&8;_sMZS{bICR;QkvtGQh$Cg&LQqQmucalfby&ZQa^`A%-5Yf?j| zh|J>>8#_aBFIp_HD=_6APjg~_-C$%G>%vY$?BD50S6VOTy8XNRAL&Y1v1RPl_+)j4 z9@`|&lrv|inz1Zv=Bm)lQ!}&Cm#(qdQI{vjcyfd%PxEA+C;#$BrW>odyE05SQtQoS z+zqXB*?i-DbHQ$SyN{>qe28SdcOZyz=Ql044?fk$Lm;`p3E^B7ygUm`_*`OJ-?9{Uoa0-_?&WsC%t;!T`4^6izwPApv z*?j{=KjQ*nhiCC}P1Z{D_c_EuTibXbo@d92hxH&;2@K#E1|T;^P3(WIR_cc49#A(z z_;Q5AiHp66#Puw2tu}=g!QJ>%+2}Q_zQ+83ueB1_gO2>zq;~s z-|ywkB|>|w=Ouev`@{+$^($p|ZWtxAb36xFkjWmL%+ALzI1l8DAM@FH!oSk|2iuKN z<5YoBCsC@LId>pO;bG;~k-XUy#d%ZDL@FImrRciL;N_3CEAA`$brpWkO|t4@k+Txx zeq;i)P(*85@oyWY5^CrUdzk-6Ool26O2)4DKx=wxBJ)?_Ua|2|w#HTs&~T8!PhQ9S zV*y#yE%Vg06c!ytIt^-P^P$CZ1dPQ=+c>j-C zfy{wV*$O<)ZcK?u66(WcX+iB?hKmyCfbh6T@z6t`vTKY;I{FvbpCJg=(bpL1Hc6i# zCOc}6wMya6oYl%LXP)-LWSp`raW#7N7L8L$m1*Jcj`<=m4u6{-hVb{a4n^$!K+*Vc z9qK3^`Z(4mb6(d_AGz)1)|C!~j)wCi31UMks__6nGnH##$)$URIz>4c<|`U~W-vAN zqfoya#XIVitkz^xeSWFdG@)nyjO)H01aOcRe-8XwIUq$`3d2 zDG~h1?@S4POfoeKzl~pYZ6r00d9T+n(}ST8Ha;&hQMQ7mA)1%6@gp9AExC>FI6(6E z2<+}{{1f|IH>k7mm%cssBsQML(T93VhL*mZO3@VCMcu~Vs$W-4XTO~+WDgAn54(3G zE2Nc=%SA=->RN}6$L2rp~$vbg)Q5dZm}gN-WsF(15>KyHa$O+ zP4C)Qxc}oeed~VW(o?eOKmH(ur)_$#M7F`0mbT0J8EyJrTcwJ<2|1|==Ma4H$!h-Z z*!1-ct#RjWZNjNAM!7I+gNd<@lQz)^HmtJfFA`9KM;zN-E70Z4hn}CCz9t$_AT+aQVpHw88o;MbG~ig5A~nlm+{z_Xokg!v^cvlzG^ht=wa{ zD?6@d6A3Z2tYT=oX$ZFTB}{Z-b|pSm62ms(LV`yOrc8h}Pj+PdFA8B+-p7p)mABdn z2XmU{B19(b<}@jTt#p~k4M7HMg&_2jync-v}V+@8**e{k1I9-&sFu)L$&Ht$NwwVQKEv z+(dtG^QptCnWql&b8mT{^cQ{Ajsi|!RDO);NH+30pJ>Gy%+vb#m0Ay4+_AwYXZOQV zCTEjEwz$r{3npjdddAX8J(v`1&gb}%%GsQ6ug@rCHsGlHS9rtF6#^yVzhW0_NcB6o zaYOt}wP5$)fC3sV8_cPZO!?UdlYy?E^JAYV=fWIrjvpjZ?NtV4r2&^W8hb5mS~O%p zCzc!i{JjsDQg#Y@zpE!6N0%IJ!vd>0W^nYHGI>GvoVdgiEkg#!BJjjqC+l>+!t2}q z@^(s97ba*6hWW1FG}wYrnt$72S{J;7xvk&8rb3XY(t}QXDf2azp|Q5;^;^>GgP=b5 zZoMnbzsHIgQmlF?B+E=Y_$g-7q;hy~ zJMK5O9w4Ltqe<^HQ{bwIfz+g~(|mI8C+jq6O4Vt~gVt%_Rge2g@!EBOpLj{LYkpO# z&3H8;K8+oARNy69{bVK_)~TP^OUT9R)VhrzUZ;*3AWeuqL?4mUlg2iB@V%hAH7@70 z_oO^#wP>}E(T~R3qc6t*?85ZMftu;-!;3rCyFJ+9_P_zI^NADo!0ZDmu@(4rL4tPf zNRhfB3C&$y93hHJzglC6#Ru1|`>k{!L`{n3$lCQl?@+S|{MZQ&-D@pS;Flc{*9wIE z96_!{hP<=Z&+?W1?o%lLR_3COS9zfQ=Z8x3yWfxlel6A&`dc8C_h<4x`V~7fs}DwZ zDKYyT1ROd`nC~2F^PQMTi7r}bSl0us+@gIkH;r1bciHI}h~G~$5Q)EF`(e(Q1@ZOw z6~e5Z(OC=#Q&2N{8>*xW^To)XIxF$+H^%HmWpXGTk%+$-R*fZB_j}1Ydtzs9)zcW% zyKM_I_u3Z2B-G7o<})pcd1X7I`XH<=mg22IHt1-Kp8ukQq@I}*k>m;|F9yY?IfxP)TZ=z$~jj*EV2qoVx5dCQ9SB2qZ zSLHkj>hsZWUqZ$eOiUZjYqehXLFad$_8&1K^2b~!T!xU+{jsPT4YDGPD zBc2)@sUq#J)EKdXx@?bL9?87n2)zV|Mq~1^VPW#yEwf-FvvNyw4>%B3*={CQ?W~{- zLTpXo<>T|kOId@pKTKN#DrcUd%B8tSE2*_2t{QB$NbZ2z9@K6o_S0xeWC+4{*ItxKUY0pf4+!&S#AqHF{`Zi9)90mJHlnj4l$=j zJL6g-Mkao@*O6D{s8?9@I2E+L-#=hoYtS{o_+XzL zgc-K9XqPELnC%zLR6Z4~gfpy7xN?3m^Y70}yhHR>W7^km_JQ3>CPqBWr-qtj9y~^Q z+XZ=AFUIq!G&`+w{r*iGz`{6%emZC6Kfe5(bm|H5ms%-3gv}C4XG7>D5jyCaGFw4? zYQ&f50hHsggs6#oxb=uwmX+_L7tHQ5m0M8A=p!F6+x?{%qM>i*%{2Y|qgXeR-mjmU zdIeqY5&E>EsYH4HU!E%`iF+_nIU6|JqG;kCi!;zyLfki}w-^jI4P!%25&)nqq2q#h zUM~wWFemZyIr{M&Tb2#>f^sNpJnDzd!f>?@eeLI730VTlpvzboVG*76@&5`ACg2hM z+zV}D5Kqiv-zo+Xed09u@!!+!>4gj7MZ5Yc?x6k2EdAT_AeV;9nf+cPGcGmy&=NU# zDloFCePdJrT=jZ)n3M6a^zUtj;V16nP)6(M*VGxxqa6csOpn=7IHiY`ht|ukQZ`@p zu#oh+j$Wl@PlFg%D+_02z|xf+gH|-A`(GhJ{AhE=gIlK<(p4y5A~u}Z`lBP7ZtTDW zJyQ6h%9((=L<9Z7?D%L$KM-YTY+zMf%PP1arvDT5c9*QH*R*N-WKqnH}(#Izk^ z+K%WC1NVc~J9w4($C^|oniip3voe!D6^N=Jsvb}HG_&XSVP8PbHIWII79bua})gF!JOPT%u zDju}1_z)nfE~aoIS)wu(?=KYRfTL7yF|Js>sOcl>V+?BfLb17&x#cftDrcJo^BD${ zqb6B#IP;+uev&Zy^n-5yz(F+Ai}I!UMXPw@ATnBUXX}b>m;{-=VP#nL&c0Cnjp^!L zq54a`y0k>q<6cBnM_q(cWh` zC!ksyU7maTiL&zzCfHpBT6r0*M7Q?SL$8g#Phz{{qi^fi;doc_x7O<6=ju!4%y*AU zX-4#l9q7Y5coUuTe9G)H6I!Pc=q5C2thBEH)?a>3$@Ke)Z3hz7o|BL`hA?2 zZXo@h8@67c+ilW~q~8nh_(XJIx(LdNu#dC*PAJUpZ_q zlqfsGJtonagBm+_SKoFUP`wkvV_=y|3Gl%C#2co=Q@M#~&$!+*!*dOfCDePP*Bcq% zw+@t7_UD6Z=m zQi>(^^pcML8*>z}?kQ{3EiOv8)rn47#RHMw6T_oQ;?8_r5DCOnzNH^0r&b<(`@-Vv z|HIt7z}Hn&d;DqXfdCB&N->DQK_Y~Ac&AY06as9pVo=nes8O*5tq=uDcqpkUy$PpB z%hReT@rvH^P%CPw2%6Gb0$jX76bqNz#qqQp~fa9kJ zR|Z0Yowlrn@_=ji*fl$F1wnAH3$A_u=YK-%)md;Uv1X!?2Uh?bo|dQ)V00(Clv;DX z-K4@w&pqL}l)HLgjRkPgIDKVncx+Xe!BrJmJeqAYFX(Oj{k!BAyvXLQk|bBgpTEGg z;lEtc>ynFHa@CPo^wZTAo$81A_g{;!iccieFUvjp{0w&3@f9`u`a&({(y)^3m6ol^ z^>~@--Rj(T$(j^LljBYCLvw#mJod}SH^ukf@aIi&Tm1Boh_if{kA-u^y)ySu&ZaBm;EYSX6Gxi*?2rkn#)gbyDZo6c*w zw|hT|^LvDhyw6y!jGN;tr^A4$_`vb)1N!HF3fhSm=E%?LPw{jH=8s))rnI&IYrF~A zNbs$u{|Y7aeIb2Q-N_FTAt!?ExP6&KBqxKG<@Ki^gt;GgRSWll)DcB)8~?2ptmeuy zTM#q-s0*%&2KE>&c_b_3Gxsv^D+oWL9sTk6eVUt{It@2%wP8F&H`&${Z3Z{JCtfuN z=qKg!@yHL|#=&OAu>994Y+J#$urfY#s$u(fVas%cVavvyqb`^aw&hC`u2$l!`?AL2 zCxGQi4AtZ8*-(Xra8e`NY`CrW(Ckr-jF<7Xpqk<3>TM0X?;Zhm7iW2Sop^a=M&OnB z{b%LfxmkI?+2OdYaQy#=yw`3<-sf*)9R0xI|NoHp@y6Q3b{^i^u>0v@|D?Pp(nlY4 zVV;Rz9+l{&nRUFy?ar9dP;KSG9@o(0F!b zabO`DHP*MPd1X9&2-tqqxg0!SV~yZ(qa!J9xBm96SwyS9Mkg!ZWN+-F1H37o#2se5 z7}Y218dr{P#4l9%gZc&bL8OW?aeM~^@G+yN{@mnsGiq$$er)_JGK;xmp0#0}j#`&; z$DWc$3c2^ctS*ck@O9&5dZH7^q{wa*iTC*cz0u=bd6n;5{&ajj!ALRp;xp<9(JMr2 zd&TOexEg_v9Imay! zmXdjX%m~vOFe5^E?M!FXZJ$7P1&A1JP|re3$}DT$(Xv0!38Cn$v$)pxcG#FVDZ;ATCU*l+>0vhm#Cq`7+cECLU$tZ zu9Vw*mSid-4?N0FjvKK59|l+$*T6>F##?_$xom2)MpcMv(beK~Mbx8{kyf1J%D5U@>c+yD9vb8C3dS zOt_faLj-%3o`wbu)b0L~ETh6Mwj)a++m7!;bN{HTB;n6VJNtWpO1V=u?e1B1&Y;08ClV4NDsx5!Kg z#0M!S_Uk}v;WN4N=d1GDBR^M+OG`_e09&KIhgG#8MdOb&|H7a^;Galh5 zbM4{1NXg~@DruvTg5US^F@8*!konQR&1cukaNqYQTG!{DuhTYAG(x&29d-kk7VYQ z^Z})2awRA*mr?IyjPO6{!Ud;Km%46GqoZHQ*qR<`utg2}0S6wVK@E!A0uc^5TpNI@ zEeh49g&6;AsAY(HOmRw6-`YuTzf%)G9*hs6Bc?)FU@=dU_rufL(Yq-F##0`QRpvKp zu)w4}GjQk{bGa{TT+Nino&!@C1$-#q=m9kNYmk$mZ2Pms`LXm73xt3M%)5lSnnGbs zQEi-|sd8Fvmn{$@utiDCY!<1;4}gvu zrRji%ex88dK7jgct9du-VKG{T0}x0@UGPhNes*mYomx zvaI(T-qkN-O2cl_ID>5WA=aN-{<|ivc%qiO#j1jN?=7>TT*0qD`Jbd^~>JBWpUw` zv{~?=VNZ#nyiwn0eZiRHVZA?ByynX_IEaHr9JRz~JyGA^^u5=gSwUM54vUmriq|!N zt69QwCg06m_RcBAg;&@tpSBy5)FMF(b{nu((&C%6hE1sz> z)GvFn_=DSP8b$b}O`S7~cP_8t#PC7G2aO!G=AiWlZGiVM!9|%F8T4(eJug@O0|+6v zzM&1#z)IblxMIUG^r^MB!$*BzX(n$>?3|{u!sQ)NA-j*P{B1JIOZ4X(`twcw8PuPz z=+AZh8CN?r^FZe{%`_ujETc2G_2D2fnys}Wa_?jCcQbJoFJjE`4(t@6a5I(kJvFJU zyoiT6KR)v#W(rS#*pjDQvT08&;$>DkQiG_lhq)iY*A(PF-Fy#*-vwY%6%7ch+;5*w zx>Pegze3U}7i#@cqgx`nmPR~!`kaY*xK`+8X6Is%&`8hyt7yM|fmS!b0Vo>H&?lk+ zxxf7`J0I8pm`2S9{=u?sKJZ%~6`8AZBVlYD>w zeHtce_sBrq^Xn8QuFhRUU7O%@4KUVO!y845@jJlyckzn1z`a?SSWpzqu0Ka^7wxnz zqVa|LbGPHa_cZY5gL(eUZkb*G>~Pe#8Xr;Szm0|Z&uNq6?D}(am%Y5Z(lY-&&wqcL z-By3@s@e5NwhfbgWZQ`SU1NXO*1W*WUG-;ngZ`eA*WbB7Ke8>}UVqoy-woRX<;b=n zemwgC|2@oqkI$Z2|Lj`*xnF;NsXxEfAGT)P15O#-N^>AkxV^A3;1lg`w8D2$1MUTT%1vc@vHf7W5Z{DIlKP+$3)YLNwe$Ed!&|zhpGAC3-zDP z{r6Ks?7WBa{CRZB?E1%O)}ivO5X=4fABOmY$(x4ciFzt?!uo))zHN7j=-QbH9 zWHyoPHjh#_6Tdo;>O2Kv%=@+Rj6G1o6H_Iu!v6;j|48^3gnvQ3cPF`FKTH>~<%KuB z2^0wqp7~iOwuETecw*P!X7NNre4(K7A}@c6ZO#(eBH1>>aMy`%LS^8Q$G%GiyG0!; zru|sFr47n@o|;#1@8UDx3|$ANbUE*kl~0K+gLoA;QNoaGP-)4f_3yp6 ze*1+@!^)yFuccGdKP{x|%ph$?rOQUdAith|-rJek(0V#fcPX`OjtjgC5Ww<@Iz@&l zJ)~R?xtId%^9m)4b+`PMIhlLwFMpKSK=NDYKPFSF4!puc!c7$1-qgM{(NSzrk~sF6z`G^nA+8dCu&# zSU)q$6`PlBK%V&`=@_dX2(8W(PGbI&)SU>b)>jHg%gO`!lL!N^w+$mO= zoD5zVPI|bEF6y=gZOP|m+H>+*s+I>5`3Tz#^a~RCR5B#syV#0f*{e`++IJokPkz+T z50>4J6HDglhZ+hh5*7PZm>nQ`BO#b-Lga`^+-vW=RZ`}a@g?j7Wk*w~?iZswQ<~8c z76Y=LC;VuLZ@-^q^ABJw@!Pd)^kRkhv{#`)uvA)88-Mvznaw){q=}SE)4scdR`w;_ zKRz0S>%MCu!IqnV8;?fd^B3?r_M37V8GK|}Larg+OZe>1@HYPHuHX}8B8=2OK|v=d zJNvybN8NerY+Vxj)$l_0tJIvse7hpRKNiy5UbxQ`)A5)#;~Rd!YB8H13~J!-XC{wM z&p^QEJ|COUeNqX`7cgm<9jj#iz?z=7N|>zl6@#do$uno5PZJjl=vwvG&J)yfqjZqq zCu}Vba}D$D46|a~SxpqwXfwHnx|_hde_?~jk>p&9>6U%V2cTIW@9nou!yi>aTnPLY zx)QHKo>~etDR5)32gexfJ%;AhFPmShW@cPQ+LFxpLBG ztB1#Oa5R&E+S5rXN53Gi4$86|6-Mqkj`#hYKX1yAN?hT|yw>*RL zc(=yCTT5#1z^+TrVt~B_K}=O@NN+j|e`wdh{n(0Fo;#Gpg2E(R{)zn8#z{qLMFKHs z<;&FrpWqhzJJ=le{NKdU zL%sh}2j(YR*u@(E@G-|yxT#YY1zhQ(Du)xB*My}f->0BN>U7$$pW zo9{+iU6K}H6>I6sEqds59Npcr-HkvlTXE#-c{u@P<)Ni4r6EdHTRd9!Nx zU#seZDo0>Z9TKvZtA^HlALEV}wL0BIi>z_*>=zRJHfs329Q*{;ew%x4kcJtT=B*O* z2zmq2oZJ(f8N0DxqD8{Ybv$7`(@9FkK-~+@e%;eD@Rlxt8Uewx)!HO4syukF? z`w*~+O8vcL$|HkIZa&Yln`Ti2_ghHmqU^bq=f8_@!9BVcbo|PVU;f`%Lw()Xd79+W zA!pRVln3)+ok-LD40VB76YursC(NP3ExBqJ$l}q}IE-kt^qQu;QZTlBgy!<;4ShKm zPq9ap-(qN>4NecxOh2yKLue-*t9Bbi6vRr+g4)&ctltT-?ghjuH~!2YtV0p8?b0Iy zJjr(`$1Rz{+RjJMBwp{fh2 zP*h8b=&j`{Re!6kdTJzRZW!JdR2oHyEZv-{Bj;cNp_mU2`#IvCkl-|7vI#eEx?F(3q`uNoe#2&*nZskbd%{swcTJqEof90V}Pnl1Gk9M_- zygDo;v?lfXlUG)%faB@UvcGu!DSg4|4}dLb3gJD~1yKyM7GRibu`<5;$MkAfX^qQ~ z7+yg!f}&(yrRmR7lN^Wpl!{$))bUx*IQ{Yd0dNf-T%)BP4CGtA30-cY3EMrA(F7wT zLzoeYC_><$B#2_&4%3TT|ZOn^Y9M@=sF)DAi-jk*S?`vBd8CuuF%_{R~Cm`uv3d-Azz>Qq`P z9b3^Xbyk@-7V$!Zm4rGgSwWp^#+UqesO#|5b!MoW40RVX>d6>at`}srxXB=kg~m)6>dh@0Ygg*P)rF+xyI+bbv|31(7Rhpus|)zov9VMj;s=Q z9`3BOMKWs@e%3gQbb;ySgufZ<RT8R}c*yK&FG2E{2fWr@<1$bnfMTS33Qy*vk_=W7!mQ5j7jBnN_ zM{(q}SN2j84Mo?UhPez<*{ozrSDk{xw?W%*>6z zLy#b_suMg_C}VA?jE&(yO;VnCaDBnT2lT4>Ovr zZe_Ugp6FffIh^!R6Gt}U>Wz?K&GZ%&jjE5Gc>r1)vIYbp1{Bn|9>Rh`8 z9nJ0`MfdHwmuERw@5LHbBtzghJ=16Z?0cqnUtZ~Nyv3`!wFLXrl9;Dfs(Yr@2Uhn? z);Ri?x6*J~IP!Z?sgP1?e)oT}IqCuRTMo@a$NdMTR zvANNe(%3spV~5-n{uTOBB{Z}6bPC@IZG3B$yZRv;Hb;Mw;byKEG*fYO2r0zTNgBr4 zT|7%1MvVHpWSp(s_^P{-arXHcz~hhO3m$%yf#1&aX2$Ucr|=2#f}RsOoR7g-KYFQn zlG??zUfEwUH_yz_uZUcKx7az+iiq)^I@K#8n`38uHaks6SEMa7UC>=T>C)-<(Y5F7 zxMBM4o|!!`F@xqkGcT>o;G&F0u+uKes1vtSitd>wDeGTx+AmjR=%~N^*YFPN@3GY# zl}P%{4g3h~lH}r>*EtRBRMbUR>t=SP%QX_pSPeYen(`W0fBA=8Qv>5@VW!_{4Q;AF z`e)dwddr1~-Bq%4h)NB$O6TKWt*IhV00yl%y@jRB1uMmG*2)M8LA6;_`z>UNd9k41 zfV8=#%NFGrSeUZbgSQgohgixr>)(?fs~qLm`|?(fe4_=F>^-uy_vAa3n#ipV$FDzt zfZ+xL0zS;Pm7e!ga8S(M@(U?--K|Pq1x)!Zgdei@d-kXPZW{?ho_?!MxL&sf8S`Eu z8cE|1?e{#Ly#-LOEsQ1p_@JyHHrW=uOpl)Fs>1+KLn8PKL$g~0nps@uc-I~@$;qS2 z_RgfeNbMCW_X22@qZLL%X}a7W#{Rr(AnMu_xA+1UfVQetMiTnNQ)g5Z)IM#yTQZrZ z7q}JswEa?B_?}uU?U?v`YC}SVe_r2)c{C+e+BYH1=!K5pcHqsk>zD7uV`+x7JQDb$7NKayizf zpFR}Q_=Ex=WByxOXwRkG4W0UOH~o-Y_a1tWR`y!D(CfedR0gqiE*9^N326W$;K<6kcoEczqW`Z)Qg9j#1mr4HY&*H7D# z?x5PauG1(u%Xaj>oA$T|>0=plc?%Wd3l}?cL0>E!^8O#$n$kdksFSP}pUWLID)qZi zj>Z!8t-Z;k|J}FYG9I=QA8etnybBy0eMzJY3Nyv7N)ykKp^^P!tACfS%%N_1wb)Df z^5KBdeDn#n1>%iy)OWh36LiVc(CGp|YJq75vV zwix(yZg#E8*j)DQEd6wrQ#X;`kYP9DAa`8p?ZtwFiOSLY^z&_98HMMDcd& zMcVfujv0PbUvEV{etxq9SAi1Ib7k3yh5kdas-m!(Am3#!ujX|p5ef#8 z$gSE-ndPfHI%y|2*%A7J5L)@EqN?W0*E0@@-~AHqbco?ah5yt+MCU(ufk*gHFiq?=bGnHw#o`)w`H?uJ37+077wzs)e#D(?6&(z9={v43whNVELxz ztr7++WyKN2DIWmTFDrDLa~Y&SMrlytj-* zbI^BbaHioV?L~%=+v=nKxuD-zC|$8_)WYw@vsWe)e}%NAfq4SydDPEi+M0_#)mYkq z0j2@xCc~{8!lN-he%(JTK+5ZhC8J>%|3S>xHb z*3xTy7ZM0$Q3NTstd9?HG4p3=CT;9?!6L>bjmsrNGgT;Whb@w_g__saxzAca$83Y znHwl$qXM35AT!fH3|Cg4uzwH;^$!M;5S=dGf_3u{nI#dM*l5!{hjw~mK-K`bSYL?M zb&g}a?p@gK=Z*L3Z)c3R{_>rXQ-uMiN|f=&$Ny&xJHzc@n%DUlFGwuPqq)Rxy8T9u z6fyIpISF4`JzM-WzerDE<40B3g;pCp&8Exo6mws_RaDyq;D?^%csfRD=IG z)s^6bLs_V?aE2dI0h)20Vb&nLGjiX-`k^EM6U;=b_x6q<_dB;#ko!6s`~Qes@BNDM z?-_FGA-R%xd}=@J_m`y9N`_K;NlRU6m2ih{uB4W>{y(C&#|1C?%Eo^)%bJWLvZSZW zS3Pnjy+%`NbvoT+p4zYW*?V-}m=(YK3D=*SgX~V7R&m;oZxRzO>Y+!rRqC01`oZp3 zidVdWzVt7ef4iNhG7-V1@(DIv7>>VbISh}>Cuo|PGFK~SR4duXldYV2%6XDy?JO0b z*=JuANeokgwcP3y+P#qoadcz(QzYesn13$+nMwEZH~163{%In}pZqnm2AVxvoQ!Vz=Ax^~41()}v>p=X;s`nnYIm{LAg z{4dJNjC~`T0K^GB@}!dmy6j`>RtX71=K5P($#cGE_azziyx`CZ)qJgJBZil!A;t#` z2{kX>ss*nwH`EZH{TGSIL(I6b*Up{tPN+rvsZk^}2XzRtQJTu9)Yi1d1^d60@8+-@ zNZ4UFr3Cwf0V(g5G5e)tRmrSX+7$AugZkwHg~1OgB|IEd%1I;=+qvxOWu+JvjI8E_ zHCCJ0Es_i%yoj%KE;56Ym-0uw#WhIE=Cbh87E8OM1`_lYCg{4>Z>56fWY?kI>wZqy zOMOy$Gt&7F@S%GAD%B1%i6IOVh8C+NSg;+0JOxg|Oz-7R7Fiks{_I3%eEOi9zVt#H zF9g(-2zuEQT2%`n_;b~gkrl1lyozoA^XK}c)~-*W*N@9LRJ50bU@{=ITn%-~0`$<8 z#9mroNoXY0te7RmFm+W^r_M#=XDx)>+~jC5=v34`o_PC>si?#1{2;hgin-DovA0Cn z;`4`;Rx2qc{)X3K;y;NSNXie$`+7pgxA%)|H}ij1sq7SfeD0s{0NZ3v%Vq7~{PT9s zKR0U~As?0a!@>6--;g~IpU2@g>pc98mTl+ZuWNGW;TMs`d3dhxj{9!K<(%_PZps`O z;_1dcI3EA(8=l-0Z}Z(hX`Sec&-sganQ;uZawX)U=ZLg-d3y604n+>l* ze|ONmTqAJtAHn~4I)JhG&z%kKwb8(ScAYRHeItCan^3ooie&b2Z!o!2EY}46?Ke9? zum7q9eeR6sHpL%b`pTyGg7z0T#WjsjZHl+u@kwqk9pOED2|bMX#XtOR)9C!l{>J$C zEyur%zKQ5UAR5we9Z-hBq9*ZYJ0CF>K|9PJXynv4#II~AL1@57*TkEKTyc1sDbBAk z#pQ3}k;>xKDJa5lIuaiY4dtT)AB~y(snUlsa4OfpnM?0Y?R>~1 z#LRiUGC{VmKTS9Mc(*5E$;-hs z#_Cu7f;WxvC#if(xt}(@33d>2J?yu4p^Nle#k$pKoDNa1gq9kMvJy*TY%G)bJ@L7aV( z>}sZc_fx$nC^Zn|2+!|y2vqW0u1nD4)w}w96)t3yW*4@JjxOgk^Dp-hsmPH6wejk! zIlw#%EaTt&9v0q{vM|-B()^}I(P8UXSJT@Pl68rl1Gl<%kc&|_ z1N$ztrc*tjrb~2K)24L@^cwU#0SFk$R~ha_I{)J;R>UPAu2WqZ3&KM=?fQXh{3=1! zvJO-7h7g|!dRtdCa9npW_qppO&`UZsFK{$SOQ`Saw4L(_LiZHBuB0Sa(i2PXpl7|M z>3Ii7eX*d+W{jQ|5__CO!o?j>RCdh=#RDr%%eCD>%xK zzS`;KbIJXrUVqZ`M&FlB1&eFz^lH%UwA?~43`Nj;1f(&3&{S;<{WhPDsEV_Zg(e5OjX3MMOUY&q&rjy=Gc$AP z9t>2^I@#*k8D9e0FoCdil&pfXYeO(CCSst~@L?Xi2UO8Bh+@sXWOn5HQ9?dm(L1v#N^rMliIUC)oB>&N(J zg!4JzT!>FM57wq75!)A`!2`@{5z}FQtEGNjXB<7;XK~QO3+huHEMG`mA0MzK?*93} zT#bw;wu{$*d*8N>>4^~)0u@pGQEyG{q5{q4HZxJ7X?anR_f#}19fyiDznD;A(@L_W z@)7EhKAwYyzt}`U{6U_}U(pm1-#$83KYpUApC9Yb09;5q;m4cEph3DwP@kc>wNP#3E|bZs>h71mpZPymmFUem&dpExO^mw3$d5O z#cu3Czfd=2oiH9EN68!H{`(t_197?C5oN)Ui8qQS4GV;sy=bb$*m7)x2zNe7uWhA# z^61T6GnQ~TkT|+7?s^2Fz01WMX}n?axMswVSEJ-b&!Im+%(Lr^F1T1|o4$h2Bz!dF z71}_mS=eXF6sE7>_C=PzlDvVakdz_9fZz5i8ko|=Q?n!;&!6U~;yx~JTN{0F^p<$V z8qhogl?=M2v;yC`7lLa+xU$!QKg8NSChzWn6@BX`vFCa+SEp)4utywo7s9FacC{^! zfr_0k^G{T(q1KD@$=9*I;IOl+6?N67LZJHVhDN^=zeTupgIfhY^$Y&&_-7E?g%jV0 zbDo+PAyhM+0yg55wCoA~cFKr-_bKJq;1G%$w^E57mCeT=@V?9UNmOXn3zXgVeycut ze7N8~Wbj@#tu#1$n5A~)B6Oj3-*9g<{SgWr+CPQ+Ayu8`yL|J$W5I_w-S?YF;a@wl z;RAE5uf@67*}mgle+?TprqOGaeCikckF$TMnnMHdqf7i45;OScJMLjUdduWH=X#V% zgZZTR`fZ&B>zn7ctEQJXLKlhp*{o8B?hmQ|!e4ol-BvS6Oo4CiVns!9f$`K`*yI3( z88Os>(vIn}`$g7F*zSZB^g17Zax1lNqcp_?f&aAP0ftrvssRpqfJ>AjG7s=g;{!xN z<<(IE^J7C+DXb3q7#N8#S-+}#rBkEQVe9V>`-76zCIHZoZb13|b=n`~Cki~~;vB?8 z<$DofeCn?d=8UW`tL?3R!R_P9Qv%dKFV7Jk#lv2uQgO8Sc$4rDITkZ~5ID-+QjQ^n zS`|}<8Y+b#Ql9g86rfRM)nf>1KGuoF*CGrllv=LVt-{t7x&@+%V)d$#=_8DHZsW<{ zW^;mWRyvW-U&BT-C-lfG7v_{JUv6!fMZE?M8&nhMVU9i~quYqPQ|!P&+_9Y*>!%(3T*M5njewkb2SdN<4 zL=Ua)-B^fr`bD(+NVI9#Su4)VWH|k96i3q>Qf=j+=52|ZqaI7`oj>+yy9ZZZ_V(cB z+Som~jXYbgO5y4HEe%7rFj#gUFIITCR_}`*_hbjZ`kvBZ-}^~$A7*!c?aRB5^RJTo z(9TQ5hx?eNE*JMPVAjxSH}eMh)jv6)XwppBT_z;?Xx^LDNBS3=zLNoXP3N zd6((jhH=n#WOCK+-A0{aPZlVH>y@$s{OP5E3+)Q~GSe*CV$#&Nvx{#Q=ug*(d^2}-I4$7j{RI0W9tq0;;4 z@m5~e7VthEytnr@q+6501cM9S;nk$CKBjco_wTGg+qP#|FQv|7?xOM09vHExqI{vz z@6_ny37~P*XnzAVu^K(4QPl9yG0XGZGDR9+VUMw!478Z`yj#a5a+KdLWQ$9)b z772PjzQGpT6ZCxzR6<rEyw_)>o)#?Iku`5mC@KkWSG5;4iY1&1b zkjPAK!(r?pizd&`J=!F_uSxDK#U1tvmQ$uD4BAjxCeK}bYR{$IyYI{_JTgW!ztC@K zMf_^rXR;yqu&-91xkEMNFOjSfhp9RPuQHt(c-Hv#dtv(B7P*b*4-b`PZI*wgB7uKm zg7H-x32Z5#-7PnJ?IyETe5j2dI3{!M9v`W|mlt>pK0Bc;65AB(cDh_sNgQTmV)_Oc zAs!ywa9kfG|J)T^{s`;qi?KVRx{(s zuvAviWJ4`Ovxb$U>*Gf!%YMQfMuq$qx&G|K8pq6Aw_X&}pT$b)&y;%o*KD2_SwW*2 z&GOkeYIjvF<^HxoNh)HU!J-w}2RIhwpL@xZvWb%(sPxT04yTW6RIrq~5yHIO z7jFxS5e}D2Hx7DhwQh6@2l`EBCA@CD^0`zuJ^|8+Zty*^4A5F>uqoVcj;;o3=8Ze{ zKu>Nc*8Puz+9-|NHb89zb}6^+dnu~DBE_ICsDirCuWf`W_y9X!tb3b--7MJO1b|`e z=eY14`srOJeqjj(2u93DNZ0JSlzVU_<0G`UVdAdNA`e^jmrif@rD~n-md*93O*f;v z&|Ne_2ru4rLH3wttW2&wK+L-yDoCI5OzkS8}Z|+U7lXcaH&&r$? z*7|R+TmQWkT;TXU!U^ey_1}@qgx$^S)wN~Te+}c}v_3$vo?Bo&_ahS8%mROL@{R0g z^mC9n64>wNdgF(VbY$~efz&|Ms?z=~Pc5cMzZD+JSJi^JkcSI=v+vMn*x_&k3%#RL zM3ZJOWFx=5fQ4Rt$}fIlCG7uQg|89o1gus)mN~bmeY57`_!KK^_yyEE}c=YYiMtyz)z_BFH7&>uxBQ~$(#@Z3Wy-JvyQ{K*eQ z%!<-*G=TX2WLyb8FRoQ9%UmlJ@ah+QMm<$5PqjM z9lCemM5{0<_-`X|(7fCN15%1WTKHP2+PL;8$1p!X{Am2Azdc5m7uT$Sb6Rc8C|m{q z=IZ+|&B8XX?lzzBPQY8dVLp09hB+IjaYV_&pkf7a{Wop-$HK+kNc&E|$eRfK z9e90N$=Jm$iO-KCkYD_11d}LTa|W~UA?$8kM~@w;|3OnPEzaLkwpPd}*RODTY769) z577M&&j>3IBmTGFGvf8xH;8c-;$|FaIznzSAY2_z6lm-hC0a{$-x5Vn3e`yE?@xZAI@J>NZNBd`~%LA7P-bA2y4u zDz|M1<+v>R+nJDHd$<|j{l3QyfLC1X4Raz|^9>>q<-jL6tDz(BS^)I6r8*fWzh{~1 zWELOpde0P6r%HE8Bi;7+WE=z;Aus;$U2x*>mFAgQUjzPH7oYaH`IbSjR(vXRh)U`F z=PYBK*hKijuoZ53o|d* zG!0o(*ZZbUhw4+iiqi&qtS4kASN-K>A028pm;R^PzDe7$B)v7!xi6B0IT$qgA!}7W z84=Lk`y*Lc-x_PR?#)-B*?gEMSMHU4N+bZcmrzZ$T&+s*+z>A~CVO+*_9~x6L@eTl z$CnInHG=3sO8ZIp*cG+WgTJR`PU@dRD_2}eD|{zN35}th3K%o}Rx z@>P17JJso>nHaLQfqmtuO4IP>nEfQ$eD1A-t;)IxOOqM#l&l{3wUFg2hiN%rw zznzTz^c!AcQ2G8;2n+dZhh`LTAn&h)3!$}JDqv`!bWOa2-wuNws%HUuFWG|LZ)s4+ z@z0*TxMDpm=z5I|=4xSzwSc|W#JA;u2jfEviK)?+qhNg41H*m4U*Eg2VRH?@q8j$s zR5#G+-1w_B(6@H&j6Bd!tVBP4uFk;=9?XJkTUFjX!hk8|R(>thUx~%>>rQk1mC=vQ z`;IB{{Z)&26Z!s1T@^N^xr49Vl=fGaSsTX(R`yq$M<@Q$bJl;~whTi!x_bPY(PxIp z1gWmeTIaf~PV>ySx?|~dSsncLUP!yuByDZ3Q;Z&U`VEZcX`J>3)%30+<5M%P%s=+R zqt#QI*sKxyr!b=z9F1%iuE9Dvnmy{BbkJ3s3s-NB>cU0^_=tQMfYRR)OT)~%jXD{* zjL~qokGk0Gv9F7#v${lCYYav($||xzxL5Bf?`$Q}Y+&*+QO$VmBk6W0orp0H+Y0ZY(LZ=ZGafX>UZhc5F z2Tq00rxR!F-kru7Pw)o2al6K0KrOKJ&r{vNPycAsIN-aMw_>^B3Bjr%ajU54S?}L( zP|Ev8|31|3vfnP~aCN0$ZruC>2PGW^9!XzfL+1x-1)af_L}_Za$lx#Z&Un7Edf{1G8sYU(1X&^;qE_1{E6Ee){ij1-kRrtu-dz+O$R~{z0iHNOyHf4l!Bg zAG&@J0V6e~5TrvX6$+BDxe3!G*ln7`n;wCJ8i%cP(CXqQtZqV`M+}$_ z(Xl$&3r$HE3q1R6{sR4~_9`$D|j z=rL`3-$z7o7p{tUq*Z&`5yjFxk4Q3uw^bF`)OTBPKeA+n)pO1i8KK`wbA$;EiZPqA4bUrZ| zqN0wbY{Eq{77|j&W@|;E2kL01Gbo%WVb(9E8IGY(A}aI{2Cb%deBf&kQBs4r86`FN zlsEX4>lJ+3>sK1I@?TU^z>1ZcboD*}gd8KU_dYlD4qJRY?H$4zg*#Kk8j6ufYSP94a;z%#IVQB0HU!55JPY>c0NS78${k4MD*AoZpN?- zKIIMmf7YPSpj15 z=v{8ksZA>!zSo*Oda}f3sI(WH1ZCypEo1btQQziQi<6TtXBa7=@zHgoUyr|Z6MXp# z)>IYmv^6bp!Opj3vh&tCJ-F2k3J7+jA6}i!giwjKWQ`4W2FaDmEwR+kpI{#90`xCq z6aH}#xeSJKQnNvx)!$fc)NHAKSN1pYj^3%{^`b*e@pcggLuyLeKV)e*B$thH)TBx* zRtf-%PB9KYxC8;K3j#rZ2Yn4kR@fpncI$ViB;O^NoteQF_rx$y10uY6uI)3REAM@F0=Dt5Axz$?K_5=j-q^{!1t;sg!PkpW$qSP zmJeCV7u)cYn&Kr`uPsQWIWNjLru~q$lttN1EU8h7RmbM~q z=6C1oXE8VZQu77-D5>xT*)~0Ur0}K(Fvme#=tgvyk&sBn5Q!jddNzdIVQk=us<_?Q zzya34Tg1C1h}SP;GmfLZewowp-j{1xJaQj@roYynWD%=(e)0kWLtE& z4n6Gp2!rsd@_jE0?Qh_cV1@Q;uZ~_?6Rp?)+G|03jTmM0mX2kjHca{ZdykorYzC<+ zMN*f;`cPP8aNP3EUj7UG!2z_!9wNfPy;63jc&!zk4zE`rU3lFe4g4;8>9J_V-@xn1 zSH%k%Nu<(h4x*i=W;hGd_rztDn&5=ugbyxDdYM;zTZ&PYfFXXp0S!WOUq#-mkmTAy zqQF8L`=|8_|I*B*Q^&yc>jbToJL}ru!E*oGBWsiQxozi4A7+uGcJ5V~U%y~rev2&S z`zwaw_?W6~JiDMki)j@K*D#KDu>`)a1+2M!gi*0>Uym65jP~*Un@G^-`Q3niLoMzJb`y zk93I>1GkQM-@szMg6but`sandl%M`_NG0Uol+wPY67i;ApfKKabgr@SH%j2SSu!#h zNosOl1BbL(7+xxJL5J1xJ`}f17i{jCz9-|ZUB>A(|&gD7y ze&)*@>tie`u(YwHH!3m9Sbwb%905lEJeBSI^pEm7VG4MBq$}rk@|>HM2Ij>b3ou%x z2E?M;AWu)Bro8zc$Bw>|9N+ix2-pX$k7?B5tfYC8UTh(K84AvpQCuUajNKk>)0{1?96l+K3d zZ&oLt$=B?GVs|@%Iu`}H>U>k6tCgrVaRB<3l4cPcUquDkYJj(D2ttU-XVp-@=&EmAKRo0 zJ01m5aod#HD=kVaWhHz12;a4@Gd%oPj%c@*cQTp=r5VLRX9QZX3|qacu`*-lz@R+Y zi}}1*M5ShDleAzx3o7P%7XRB!g4w^oi=7WIhwIYKKql5d1BXZr9N;VU@3<$%>R;MQ z?hwcER9@B?$PF540h`icWxs6;>q+_8YlS#2rqsB(oF_QDH-|}+uwwU>(WFOYQ?bOv zCLOrDUXKIeYIlM*K_K55xtr?rsxEpK#h3hkEFFvDkByUCem8SN3ds{K-ATYVrvthN zLrkT*itg4|V$-64&<vMctzTbjNi@Ki%~lagxqn=tFFj*~ z@tIQ})t0=wT*+lFImRU&Um_lOL0^xmSTAX7+Ti97u48<`c+08(txdgRD&sAsUewE# zRm}bRBl5-ajA0WbYv|27=)0$h!8|QyJZQz;StFs^r6bDSs>#L`x;I`^-iEY9ijMV> zdc^|D%C^V{OpMkKQkkPnlL?&n;XgL!YguH)6SeirhN7*}SboY4HuLhpz9G%CHtYAE zJRIPD@5!K4C1%tTfa+stYMDy(!KIToL=VNu;Z5ogHgjAq*`KFYrmw;O&yh1KPN6|R zOOPu+1rh4dY6yE+LESN+v0vZN2BBdak}gktJB4y($DnY06TkeKmSE=qHWRjvfNe+a zGqcxz(mKHfO0WZygItL*(2Hu`DoKuwe2$TwHWjrKDBwIYO}+Ct9G7R+{;~n~gmQye z1}g}A7+Seo`KpU-7G&j-icld+FGOC?~bP5jkE>2{0Za9 zqe@;yHWg-6$u5&tqp4%-2uSD3(_wn0+USgWg)C1vAfq3-|^Ju?hlH7%py@6#!__>`nO=xs*f9!eyHSCm{dNNN^$Z3%-79#$ycwzbw!zF z-*mpn=7VK~%m;U9sU)0d2NiM^qwKb68m;0kaXPg%(jXoh^blWjTIR@JURK{|&O{wX zLF7c#Kjx}8TK#y(BQ!SEbs__oGSl+jq5ADltet(&iH*9WeB(Pf%rJC;b{E~lu*$j! z%C^jBuZWgt&9BMlL<8>yz&kkLvRYN{yGACR+5D!6;iGfuzZL`Lt+Tb#fm@qejN*3se2p_eM@PcfH2!)a*boI}ryTHMgjXi^&6143_bF1rVO z&X*VHQKyjK=@+|?@N!29P#^YlTeg!f;TO^;bqVJF4|F_o)BbX5^~=tns`;)jyOQR+ zz`;&a$A@SeU=iJf0XTjXMXM91Qg!Q0)!C|An(+wdKi-bY{Ne%~*BzMh2v)l&9{e$i z@sbfyig29$vzn%fgon6~z_1stfXBD;W~^u96>iNGQ_|weln^=VCvWqPD9l4q^A-x5 z>^n;4{!6+17rc4AbV$ZL+N;dt(OG65p9NNG9?X@i_u)c_{!@1nc>lAf|5OmkGDFDV z;W(u(W=czIUyR z^Y@!R?c|czxnx_HG%Z5OZm8akRuw<_{nL*~=_dXj<%n#Ff4&n~!y^$BcZFhJ?Rp_D zhXI)>gB|0(n?UG`h+p!JX4Gn)+Vm)0@Cf175@1B`>WKO;>_{Q`^wm?gK~ut_PCDx< z*+~>`(5B`+UJ4>Sv%?yr-`Qp(;HM20i^LFEii9;z%xB09O!c8DVrVeLF`&lyLf_@1 zS@Iy*6N7`n9(J+v{Y@dGQ@H%; zj<|N%>|&Bj-dMsCa={XCuE=f<{K2_4ONAoS?MI`lF9eA?2<|*d# z%*tEE=~@{#f&ZhBd}95wsoQf0^0x}=ET(Q_$9<+~OEo;D?^Ms?`iEK$;}rp=S>_cn zTd_ezrp-*VzFvF$JtCoEykq^tGH0s2LK!MpPSYQa;e|B+yfH`$95orTEQYLK=K;LV z89Ab+IOTIRhJcgY4aZp5ra=mObk)hYRZ;1{i3D}-dI6^uZidI+?EPTksHu5;8sN#{ zdDZBaYAjOYs7Ak1_{1CyPiRMrwBv2kj^o{}MHEjrsk`D2!q!jpPuVsgmFN?3ze7{p z^+p&1$p8ht5o2ruz)}}MC$PduL`D4iac*LbU0z_^-=MB?0fp};LlwY@1Jt8Z1hA3W<|tfpbq^+ z1S@nHL-J$(5JRn;U2>L40P>A_z&Gk>5%re{4LN3+G-Djf|&ph)e&wT{s*+a+whtIQ5Ba>-Q#*x~-c4nq)F z5f9J36!XkWu^Xk>jq%UV(*@bi;u>Uz&71?A79DR}m-6(VTrtC@);u@9eIrv8lk`P* zaYdUc`Z_DhuvTW)h?(VA#=Cx>F7?^?4NC5c*Y|^=W-S78q#)EFgxJ}nKe&fHtOo`j z*QSH9YKLE5aBG3vkU8#^adc>uq*t~H1pc(uautxG z1z*Lmfq8N?rQD5w)yxW*1&2*-=St;+G>aI2{XTd5xYg-absIVukv$^P`;uNBuvdXUf%pLc2IZuG7U zb{TSsK}x5hayVnI6rX-~{TJ?`X=!;>nmRD6H0A!bV%-~$n^AK-gOyK?*39zEm^Cov zeg+ZuQ=J(>VT**1E>Q1N$2Q1u@ygh*u_>) z-Mw7~oObs*kpGzzWrb%{cK7Y!+N*Zkb`v))K(EhpmY3RF3FoJ%!uA^mL;U@(H%|#Cvm`WVmD4lSa&*xBb zj*jHULe!zcQjUa;!^F&=v|!V5&Z#{G+&t6t2k9GrX=CB3oI2I9 zYPw6~njNj?u&sWi%KQY5&27+1;cf;>FqXsmf5MZ?t=8c%#iybLM^ zUlt1iC-tb@hdUU3qI{)1Kt=;1EXvPmvO7gBPJf8Ctkcm+AnpA~R66u4(Tb;tSN|_! zrgO!{W1`)E9!**=zHboxy&n||YYg{0{nq1@b#%;vj;LRt zgFY{-VH%bV3TOVa34UFOcr5wF+|UeJ{|;A0r8hl@b2(C)JLN&DlH2y6z6DXgy;I-< zxBNOu6vU}s6>*X%l+RKx5B)^EdBTSRFM zV?=IOtD*GGz)Xm6AVpPLLq5SfZueD8`J7vG`CvW5i1N-36uGDIX6whXJR0oA|GZL0g}o zh*29|Nx^Iv!7R7;j)QRaEq#g6AZ^#kkIt=A84^mrrD3LoX)(2BU5+^;#I;Bzuxjhr zI}J~x8Y_2H|LvLJ+|+52*$^*3JCO%{a2X&8{ov((nK+yzUsUHm?5sNdQ&q?BOEQkb=t-})y8NWYw^t+5>JX!;5a z^9BFjav{N;QmqJ#q#02ujZKIJbLX5L^wTq=HopJ)gc+us6|p$cq=FzWLEE9#2SN8< za30z<;4VN*5bPT=1DBd@%0z$}yKiVx9|M;5( zJx|9!Q1bb4Sh8<~_n&EF&ergnYeo(|o;mO7BP>-NmE;cK<>&a1bk+)$g6z08k_!x5 zjJz1;t&()uEZ{c`;hu)X&m`aLCgPF?B2aTO(n@(#a&cUCKS1gq%qvyYM+Dz6Ozk45r{)=o;fge`dbr0~e!+IRZZkibBjH*XHb3_>#6l0opz=FLk4{cUBML{=6iOd(Do}kA4B5sN_A)xbOC) ziu6iy2=WFq+VEehvD#^XJs--Mcd&wiAd~UhhBz^U6&Xh}@O}!8WeFJ&3wj zW_b{&7c(H|6nD#n2XZ4wtiH%m3zDNiA{XkZvO+Tza1DK zqxHk#xMdIl6T%<;e?DV3W!y~0@80H0Y)3}9#{$x$U-o$~-$345T;9Vz?lb_#c2w$*97BOza|86(GCaSeR~sMj%o@`G{HyYK z(SmjHtD;oxxTW%yrPNLX;;xAYP7OV#0p(9YR*)y!;iA0J^TA)ADRzcXg})RA{JW(8 zoznkKqKICg8v5OtPw3$(ZA+*Euk^!u1?8G!(8f&n3B3_tn;MQR3d!X_tvSPn_=_x^ zYqFQV)j~u~pX;^SL$ei}%TER#slg;0HpnAjL9K)yYH{-D2UMBzt~o1V&9$m*L)@G; z=Re%%u2piN)qrKPQh~qT>Ima@t^JV&yERZE>`IjP{L=j+z6D_xKd7`dx+Y zjg{YAJ2^$YAqxk?^l1MO%GAs|c$4|zp=^mE_~6=IQX!#Un%fENZdr8io!b_-2Tf}b-T z<6mujyFZA~APRhJ*z5zVW;!sSj^XqkqUDsVsTdU%{H2Cuxt~p_&rMCW(L&bxXy-_*l1Q> zk3l;%YVq=KDW9#pKiVgdJ*#X;pRg)!{3NQdg>wZ}@_*U+%Vr6m*7-v``}|wRjb|UT zY>Q`4xY@7sZ|h22eDR z+lOo(O1U52ngPLwTWjJYszGdNAPOGD>jQ|Fj`bi`zmfs5zd-!Oz8i)xgheCGeS@;a z+$(#zC{~{|6c%;Y1Q08;lWhA6#P_N}EHV&x7>EnzSoO<8_0xZp!62{dpRTU{VXJtO%LA?Y0M5A-T07w?PknFbh_V@vt9P<%J|YpTUz}w19ix#wpBCT_cFR z#inKHfa^$LlVglAxbY>FH122{hjwi@_s`NkcaaZ(g5I&Eojl&{!#g(Nnun*i(z|{1 zZeKcbdBXmMO;@UAO5jBNl10|-#n<0x^CHKejo_9d!YY2Yb0Q8A;s(Qf>-fyn;J(*d zBAlfIWsl2tRCV_R?m45EO(!Re*35?P6C8PaBITt&Y^8*40d=3+s>0d}3u}aeFsC@< zZeShaV6{0|ZN47fO4KG&uBy0}g$8|kLJH-vg`u4sMV-t}q=SUqu@2y|696>e2_|m$ zs0i6>IN8g(YXTej_W*kmtoS>!u3t7&dtKksH`F_$aGr0k;Myxp&|W10>|9-NkZe+) z%xi1f736Kp%3AVN`z_h)I%(J}?&umc5wf~y0AXFcdSW~#gU68$5AEK1bA_-Ni3p9>*MtVbdgQ=V zSi1#by&14ma!fc->LoAtAVTf2;>+BsVFs@+s6wS!%Q2T#!8SgGxjk=iWwiaV)& zm4ZlZ)vAf{kkrnl7K!fK0zC2++H-(I z5>Orvf3p-b;+8KC|+O;LLdH``Wwa8 z&aKN7^siDCUt@n$`0m*LMxbGn&71fzp;9v^=xj( zS^drJD-vU%zo}Hhw7)S|I$?h^UVD`UpoBZ_n<`;dfAjiWs)Q5vH{)>k-|BD1LwX`6 zUB%}De01@z_c!A;SjnYV?QgcJz#|(b5qKp1jd`vK`Myed?tMoUoj#m8nFIs=|UoPo& z$we;tv`aqWk~3ZM0hheTCGT)a*BKM^H**V&Z5UQ*KA7RD%{LP+DB#GwK6d*g;(a!` z<&9bmzZlDEh=))1JD#Tkd-P^M7T%O;h-B=tR*0w)%2!G!vr?d z?GPMI)_rG5(j(=gBDMPT@t(!kiE0Nk?H?Id`t#XWV2w<&iGNz3?lpv6%52N!JNVfa zrY8JLe+Ss{)v?jjm_{`c+5AU1y&%5`{Dgd9~7Ajjm zra*^>Cb2s1U6iTZsi{~^6Asi0%mD$6zO4b6DHDU4o&{s89VwW70vP+UUnzIjZJv~| z*gXG*3^r`X$YQf^0P}i>&D@E>+>!-ji|;8m`vovNI4}oJ4Cc%%m_j8svjdoE4ov*L z35nVz3&v)DxBx9;HSG@fL!slD3z{>O2h_?RB~m~QzPyS_?2s{Uyn$o!2Pw>g8> zBoQdGO+#OVnkoP&BR(fR_tvYrwjpr~z22L7vipM-n~Wd3VO#9gZ|ieT{!F~Y{=~hGses# zAIrBYlv-egBK~kG#*Rm-?(y*pJeT=hrL-VurIclD8z>#)yboLvCZ05N8*-DVUFev z)pi_#q#)?_3f*$il_@qHfBD_esQm**BVZa#L29`;;P%4g**Cp8FGvmCUZrz074P|I z-qOmg8lVLM(@Tc${BGi6=P`X9`RodRO$Ota^Wvp zGY5jv_tr$m_0ZhQdnvmqv|NoXTg`D9a5^vgo4M22=$AHb4Su_#jk_slSAM*SAB2XK zwH{SR=XQyX7GNd@_lq7}8c-oAb{;6B^pSH!M(3;yG+%noHW}=g;3M=CSzhGJu zod!n_aU89p=M;6dW9&CfAu|9Rq+OfWY^ER-GD#GsVPxgfo`OtQRh&gXK>w-XtL20p zn{2Q(>$jt|zpy!#DU+Et&6OWE2e7%~+7qigQ9Kj4Y*bamhq|BR@9LNBfLz-qP3q?q zEBxEr(4+{0kjXZi$(|O=WHl453F_r~{SfxZx$%2P`=u(db)a$UVKT@ntEr423p+OJKPahNLjQ{56XX(aMf;5e-J<0J&>@C>AB z)sPMa(z0wOh=;Z!Y3gV3`oU87GJAjBSi%5Ms=M*t!)t77diiNsTaKj;0mZROz>2|7 zRpPaI_T|qwEE3Ot048#vOvF4@hcG-q#&RIyZ|0pXCv=FLI3@3)Kg*PK@&j>=Lx?BM zRs)^P%0FhUXKZ%-aM29wn1z-MyI(6@@@PBOcCGI&tNq8fMRoOlxbJN}?)u@EEgMv~ zinsi{8d{xOK-Q$Vi+gM1mHN6!Dfjp8%(|JjoyJGK_A0>7DL8CRz z(g7(Pz~|fEBWI#up>D*zx&5Tcvu#(E^%9LMM>kf}XRAxEWxs;ZlqI2ng6;P!%yb#x z+sIyp$>Z%+xCKL1DI0l>*{kp!y^6#<0)=E($c3js@H>rQlqs*y$PMu54O`REiA14q zQ+UJ}FUkK|kJRIvgxv!x0&30Cz@&{cfn0A6U@&mQ!f0TGOQ|TRivv7i zIIfc?TNgcD>->{P?|1wNC)gY89uQ$@2Ic_$%lu~Y{8jlq?%t4{{{?<;_4b6{RsH7= zK?4yWp*g4|@jw9rJ52<1n7l&-`SEc*r$RRj*Y?C^NnI?&taB8LbfD`3`vRm? zd`lX_y+L}#LF@jET;pH94exPV6}qM)iq9=G$JfgKwL0ou@rz;J887aAW}^h2dCMY_(M|a?rBP?<2sx`ox&e^ zue5ds`NT9zxz@vXBrrl)rQEmo3MZMazSjDRJ5Pq~+FalnUZqb(fuG=;$m-?u?(puw zl?{*)4ScDQq&V%YEp@2kN3wMet{(^A2IlF97>Ebd32+2goOX;Wmv`mt{KY)|P`NNU za}@ho`Lgn%N>;>mLboHMC4xkJ9Np8~FIEU$m$SN8`>V5`?lTH2=$m_4r9PpPEmq&; z-n$q8rp)gVOuP|__V-z0c+=ASI)FS(RhVAzO87a~1~b?!8=8_pAp8E0H9Trg}a z-xG5Z`OVTBb}kXvY8b@j5DS}zfG1gTlM0t(tJH2*>Iq8C+J4fcVG44iN>Z?NrIuvo zPnPDh!C;6J?F3f$k>^5Xe*8#3O7H8{&DxoZFdvFa3wKgwor|zAa_hI6f>zZWqLS{G(c(VVA7QBX+Rcbu@}h8kJB&TRhuLf{_FUKo4|k z;7YkJv9w>LOd5^`f}`g?U3f?;-_OSz%JsquUb=IOYs2b|(4D$ui01-Xyij zXQ1Diq(d$e%rL_cm2W4`)HKXpZ1f!c?dTr1A&E1fZyf!*S2^^;tKz&>(#)0dih1Ty zPIk$0E;-`_6nw9Ahf;-p`}1f$66U;h!zR63P3-+jkRuk*dW*Td)e`dpvu;S1LJgI3X{@B#Z2uQFOSl@dUlXkNkxf9MFRB4c90rVX3Y53ey^-uz9X(OnM>Y*-4a zkGNo?v@Z)6*d(ce&_E6BkfIl0uZj|2xDFKHzDsRppc+la2fS#c9yPfyjn`VEb*$mf z{MY4E7_bUALLLt)e89UP{b^Si=z`m8TTA;v(V?97G3~H3b-_+oNlx$lijp564FR1S z3Md8yfD;B&K%oo`sfiU}5d6sU8`#p4$~4=Dc-HX;nSUynzm=}roNTg#hWJHUTr;sF znW{&8`v90i_Bf6z62YC2^t8}KDa`1snyu=244Oyp{Q>MGI8|(cH`g)T(!n8+O`}ZZ z!y5kpMru%w-HX^YqO-58yMv=7Ax@zvC@&1-K;a%N_5oXmZ=+-AvQQ2S0&q?&06jJv zp1vtFbtM8qhq*U2mbecHcrkY(a@TCgWXoPNc9xT!)%y4YI@C7z!ghtR`JFHl=6Aq9 zLD`k!&OfeD@^>X1z$5#ic<-geII&-j7K6ggzf8`L31&r23D9G3Gq#5S1>Sx*Q`^rG zTj8Q(R+l2qB%^~w_*BcYnKvCrw=hJG3~cNDW7W;OYh_&gUb~(HzJk{v2fdX`xCrvse7%=**6K zJ%~ZspxZ6x4}RX(BLlUwv}S-Q#!ID;ew`9y9;iSA2>X>9 zARn@(1?3W>=yr+?EDHoZsuVSRH%SI9gLlHY%iW3L%yY*4$vzFFVK*2X)FFI>>wDEp zN7!-hfq*$W@)U{Sh%b1$kn*4)j0${cQdTCvfj|d4VnxiW*pW~%TwqbuvDs(Y*NL%L zsy!<95x^r<`}csv?5PJmGMCdi!Z|FWA-XRdlkXB1jqqSG`iCFfnXo#O!}XAS7y6;N z{#}%{3*-p@47<4oXtq(xAZm+hj2nyX&JdlgpTSmiX}oq3t6!CSoj4;(RfoCpixjhryw1x0`$F77scf_(#=h% zOtMt)=A{~czJ56L@gl}hBYo8P^9SP5xeiFq0~)YzGA1qY@%Ko=-;!|nB5Asv^>dq( zCZRZoq?iMhop+(pRKF#Mow zY>6L^72pR17r5EPa86AXdTN6-RtJ0QBiNi<;IVEH1XwB%1fl;GhHYph_JHB=u&qP#>cyxJuLwM5TqZHXlcs1zoY3A>?&F)o_ds^_26e zDtPBtuWbT^)ez7r6jJ==RpM_n3n-_^Lms)b&p&-b634#E5NFY}NVEpPR$c@C_ z9q^Pjbh~8`Lz1*C7IBOUI!{5zd20>tq{1j?>8r@IhJ>2VuG!j%@X3$}$8CuS)s6^I zMSR~ti>)>w;jx*>Vx0#ETZL?iVVP|u&gRbYJXJOEt0I0?2oQ4Ffo=+jRgP6tp3^kp{M< zXk-^|`=9om${YK%N(Ei>Jt0hc;)RlzV=XySiKCNT3k6aE}a{XF_`-y=}c6%ch#x~m-KQ1SIIY( zZO}T zQda@|+)bP%>=v7Bq_2dzK0m?tUwrLjlQ0zHBL#5*6Ibw|qJq0~Y#)y`%~W1D&w2gh zr(fZ5*l5|t$)xrCH2T97{}42znjGDBukVLQOWxaw8%$UP8+{>P8%s4A1|D&n>t8Um z&B*AZQMfMI_lhp<0~KZkd>BBj;+-AKH`?T11S9gVK}7Q}nZlEj6bur*O+!{tFita) zsBHJ%Q5U)8L4Q;v4Zv$UR+PN8X;bIM?LgH}pyBCM{VVa|A^yG;zu{9%H?kD;4d7N|gn$8&K^4qfMX@$cI-!9xy_*Q;29`h;w^C`0Jdz{)6 zOnU!Lw6fh6ArB`)x6hTW`i3RfTavZp&V8YZSNeTZe$b8dF*mbjwYyKz;&IDBN3PE< zVVZL(&|Z$`#2P}g?d+|}^teJDt5_E|RnFAsL`5vC<<+{4Cb%7i()gdhsVepx@{Hf6 z?hqi3OF+AcD$;C<-9v?RfMl{Jy-g;)(;+h~?mPx)I~?Uh92E+G z%j?GWm`<>=*UF?a1f}OnH{U-;$vc)*)IurSVoDk5BjRzFo`tay0?Z8-7#pj#pM&u1 zqa8I6P|e&RKfeNDz5MJb)^11Essab(Y7EF}?ol!?-X06D1-ZQucv*cM8F+i+T#Cuwm>^LYGy7tYQhKoOq~Ql-R=(dtbJN_gME~ecPArK^|Ox*!M@; zq+u-SG`g$LPY`e!$VT6qhZh@rKbE@bkDE5lo&NR?*6oc3cG%w-AdD|dgwGY713W~R z_}B!RO*(_Li1nbFk0&%#atrZX4MV#OdKr0ARtz$W4S)!?e)|&|0Kbcdur+v6!483S z4jc&pu$3CcxZ`@OO?^yIh5tZ+vBQNKpmW9F{#1{xFxr>6QlW1?yPkk13@d{`1rlwp|Vdv9n-Pj&d7f zdpK!=nzPML-nI3$8b~T``m(=7|CQJ1!tP`Y*bQ8SgOVZpO`T{{hru=#;4a{+BB}S{ z3s6Yl;*ojsszk6_meYwBr&9npc!lkv7Kkg2;y;*Ywktaf82@Sy*o{V5uKzZ?XW(AW z{|>zH#XbbQdkzEd5gf{g3Auqd4W=4Cqhap!l6K5! zJ6IUC((zgoR07o}`X75(ofQFtc6-t?OvEmS(gHRV@nKI>YTY5^qO-C7$R=24nBPxh z`1j^_JDK0o!eiW^tL8(6J)UE6uA=Ra;i=84&VjzZptQ5U4E>KKz}0bpcVeSFYqguf z34C|AU(;{j4_F2$9KOL9V-Y3keErA~{igX1$=+9?FnWLQjj;D^(KQ-J1Pndk$2hjI zE$02B`lCLl-*-HwDp#@0wnmO!9SC=P0x$OUmAAK-yYWH^+>%A&Nb+L@Q@u@nkqtw2 zK-3aJw6i%RgR2&TLJ&N5hK$K_OCGS~nKV@4Ef6G+H*nsv4PoCdy%OL71q8@)_#Yn`t?Jr3^VD(W z1hJ>0^_9bUq~T<^i19BiYQL+fA%gK^H(7jTF?(9NXWVpD$>c7p!Zum%n9k17Q5v+} z$%Dy9Vs~g^JwBayD1ST{RE`JhJ_jon!59Y!V{6)M3#S|SNJX@>rHVQ3QdM}Y)rh0R zF`b6pp466frpI+jep*@h?Wm%n&!A{Eit_%GsAzEZX_Btfm3W8%4^U$S69Z5c`KR%l z?WW^UeU5&#qK&g)uyqFDQ(+-osZQ|GJ3PkaOgm&s zIY=XW?_@AO7~InlQBNLCbyQlI9QJ}xy8#IKEf2f-A-cJ>@Ii2XlW;#%iN~F3G`?W0 z>$CacsWw0C0}`Aca%PvwxfG-020Zgmvh4O*^mJ)iKB8DE|8q@DqWlb4K_V@3pNv>+ zyWOU~j16PGEIajC{JM_6CLt>M^YFmx8m+Ln72ioOWbkd4CFq`e7d3@N-vfNcBxK|Noz(se@bi)z{dkMSq$6pz}g>2H2(%K#6F zV!%@PRTWIaX%;@Byg;??h;+9~`|0r_x18?2_kwA&?f>w5Ivj`bMG;h6nLh^f$R7{o zMT~}#p29`~5I6wbOfW+j*E3HcIfiLisvjw30bts9To5GTcU=C2e5b?Mi0yVkdMqIs z1FWwvlfG~jzKFs>dVbAu4c$}9iH>n~vD@%rrH!f?QlimGeI|bnpeF5M!Vf8IO@2=C zYl*V=v=WFTr-S=m8O%6#4?;HaB;|9m+h&Bp#X9$h^9_5Tsr~ zOrGI^s8OognY#N`;^;Wb=xnkMp4`Tw)WUE9Y{KK2T-jLm0`BwshCQjJzl{)RG8w>Y zgFU$8-wf<(f_M-?1Y_OY^dRO{J(1MzlQ%O8UHOgY`bCkzt+aD2W|Y43S^g>USRy{ zg?vNl`;hQ2=4+eTj%$B2w3_O|v4r{3{wipHn&11?$Rh1O7+q2O*T%=Lwa(hMI_+DzhOqky4@6s4`^I$6zxr%#$3?#MLn`Izn>7wZFn6R}@ik zaP#fMHxC0E->Vn|KMO)FVZttUPW2&3V=Zao+ z>s3$tYDxbhb4eg}^hxj`Z$xfSqr+BOIB`gCjl(_tjyZH7INpIg1co!F0i_Q)XDxXW zF25N4<-eg$LpW2lz|xlUoQnq3deKTdTf%ROn|{Y|>*mEEKyjIp!3d=C+VCpXoxn0f zyGeCa(s~ljhS7!UnBr+_q#eX@mk4D!@j@+$L5AAWM1iQ~3rs$^;rsgp+^dwf6u4nM z&0Gi_j01kC1<0!#Jgb7Iad3o>wQLY(AUr?Xu|hQB6*ALF2`~og>X!0A`)+m!O3}69 zd%iP%IOiGf0{;$rOJfH;UXEmCVO!nvk2%mNOy74nUQ%0W$?^)w>AA)J7uS~6*={>7;X^I>p4x%q zOM=s}%e3&b;9vkz=t$~^`#xIpNaC?>fat*f3uV}Ur9gQ-^7-fVV*`GY)ue>!2Vjzh zV>=K&d`cVW9A)gTbg)hB$Nq!eBxQb1T2>Rh#YMYBV{)Dy9$^D2 zKO$&SlH_b$GJ;V!u}6Z@-jH%_By=nN$d*iYdq2RS0N!!&vO4(EOSbx$CN_;RYz9dX zZXg%-?$9EHs8^81)D1#J3R1a6I#85zIs@EM*?-||7(_IvU_TEIAvi>)VTsCJ3>2%= zAu-UjBP3o=`x3_==}2=X3&MZ;F(Me1u}LA><-A6?qPoZO(#i8qHW#E<1P#b}=G5CTI$+cWOWC#fmRsTGj4B|skv!?7&e?KLGr z@_H*~86-n^6bMFwQwi+tDW~lfYrrR0WFJ$AC|Cd5sh4y_!Tz6I`GI;A(^q278+s%LLGX14gQGX?6&|fcY zRmcx}=&I2%boAQ5JkpsnXR`j*)ga@no{oN_=2|{M{xLRjyMecptjPwcw~Cf=S_{fG zU^0!(KCh`Vt+H1#>|R*S-9dPPP|}EQh~M{qWZygCA`j17;VL<6u7N`WPKo2dGlqu3 zw|qXj*E~Gzrk}V%lU5T6{5jjSHu_0%qyV-nRiI7dtRGrk90cqYTTxPUKpm$7K7JLG zT{a(EVE7I!t4Y5bg&^^9DTdkt*&qEjT8pydVFd@0Y!C>g-5k#2Rix)GU@6@mZ>e zm`s{SoC>3!IvS><;ox~MTSgB{lr9Q`MHDLLOPUZdP4gLJqJ*wv6=iW{@LO!oEZi1j zZA<0Db83#y*s^s4G-NzRfVd1UHZF|pIi&OPa1hM&bV{}VZmJy)f-#nP)g})Ustv8? z`~ftsrU)0S^esYbp?!2bL}&5P=u{D%?mX^O-4sljA+4Tl$-@nL`b7#letJU3WBS@v zQ^h#v;WMf#ulYm@aCWR~6}U_7+vQN%7Cu9)+mZ6miFLQKXWCK~$<>C8xXO~xFo4or zV0k^N(qIugibpR}a>0*MPG#X|QDxWAe4taQHA=cpGw8$pY-0b=5Vh-DfuGBEDFlst zkA77S{WiPu0uwbujbayKkA0c$A#F#CY1FAxB8}3ZSENyL`hpfWeWCd{PV>Nw@b5CZ zsE6RewKl{#7-Bwz6J}t%4Dh!T2mGd1={N9nbu>goJ}pa!Q!W@rj1?R;baZ#YqwLMO zpc=i@#)!-i9>Z~@H>$#@IrD_>DVXXWzpFtd{yFNW@#ucmIl?9x;jU3YYqg^9LhLGH z7mIX#4;hz4i0#v}i4JbFix?Z8J*bEcb;J$Chl3Pc{V?q|7b zyE#@2@m>@mMkRa?UZ@;;t8(R&JYf4t9D~#%P zut1TO5ZE20Vb8ezAB~L!l?(1cmqb^i0e(9pAxJR~DY4SDtr#~hM#)@i;hu?kh=~?e zI@op(zz-I9XKFST#H}WPEd4^y52_e!L?&2dN3J26l1uH1{(^7p1IFBlb?R&JBYzsK zXz>XHVGkn`ywuKW{6v=hbS*o*juIG_APkkpJQ<^U&GO9 zWu6QlGGcQbueOjkmM|{`=24|^67+5fEHwtFV7`*dFT)2uqGq0Kr=K3nV2r`lXo-r2 zx!yy8jrTA76gxME=n1Z<&t)-kvqeH0+=Wfoe1tv5 z#&FJ^Fq|%`sYaKS`Lt5lAElV~yL=H6y0C=L&^Xb%V-?w;OD-JnZr0Xic8dcI3dHD5 zQ-$0*i3&vR-p-hK{bvZXmlOoO9jmi(U_h&W?>NkFe)+xUnOX zJEi!(gf*F5SGfTPze_+ZuBmounrYN>D1I{CQGTSB;Ifm+4S4$vbhABjMRdyCG4&)sM03Qr9lG%Yd?x~B4Pa%{kfQ#>?8 z*0X2aHV=pP0)rktFN#6$y4_=gUj9MW%%v_zX7CT}qr?}TW6}gF-vcUhOrBQHb4^PD zX1qXV7(xEq7*c!lf;=FRSX>jhbbXQpp&-kb7*>$Y)1ZAvTvIJzGOQGv0@N}TK5}l8 zg8cq#Bxh)eh7;m6v4Ifxt36!)!4!hJ7O4qp*o0Fll?2~a5-P=#8hj#1f|LF;>RhI+ zg5C5GTxb!jmuxX)$o0BhDVz|cMQVfbYbdJ(2Wm0`Z803ZWI>o7UBfrd$w8+$sX{AP z@A_$Q{bZP8t6nO9Njb4_&Mhk9qLJ0a3UdTL=ti0Dt%yWOk74AaVjGm&f_wxt6^vB5 zbOY0<p%&RZ+`AJ}*yHP#TOwnFFhOHx#9A1gJ^~P{5!$06 z+^cQNqOy|89d-G7*xgeK!It1JVFyA(mM-ST5>Y`?-DRN&a3lEk-9}kRoQwD%U4m9+ z)9hw>b`Z+df@HgKxoVAuo9|IVw;)%&0tox~T)Ipt^ocz{-g;fS#Pulo2U(>L&}FY5 z?J8I7^usq&z6C01jJx@)MIas?Bp;Lme0xJG@)s#_3saOZSWIfIA4fnHfXY<`_wU6a zE96T|7@I)2Z~(rR?mAlT7M9>VQwZZNNZWm{8VsF(vzY-ne+pwh=+l!#qyR}o8ki1q zl`(}^gTuJWHclNy?s`G&8F%*mgGZ`A>=+-Z)+17dk!m$EgHP^OJW?eFqL@I)9Bn}$ zT16Vn(OufEw9BT{5QtVW)aLMU?1gnqAR1N9M~=F}$dT0tr^HsTh>fCkwf`B=@8f_eT1y`v^<$;VQC+G_7(6}3^x3;BG z)Z&#(_5in&5eo}lYE;GGy$K9JsNh`e-Yon+PWnYo2VIxYNi$0dmS?gzaLj@K7whc# z$_3vArO;s%F!y-%jC=k2as9LK$j#fw^v_Fx#)PBa@YWliiaZC*pt0%FDUQY)_zC@b z_GSV0P69Esrvla96a58kJ25;GT!bWl2Fy)}i^#s8*YB92mSFJOZC1NzngU8)YMeqtm^53hZF zC?DgY7MKT(&2HA=ybv^BtgEpW1`Xf1^v07!d^%$Q1YEt|jJBV0cx|mp5~7HJdP@R+ zWmGeyAr5@_^{`|jN_(WzX}f!CmBE_Lj-Lx>M%=&_M1F;&ziRxqK#NlnHvqcLOv zMlDIumPaad|I}DW(>~ZOTIl3lmH*|hLGZwQ3Y@-gB&V7~&n}h!9^VdYJC`TW<|0hY zyDHonytTK2c!4FaTk^6cFIe)NB~MuLQ%fGPWSJ$Wt$TG-z6{|Bu9C*qTV~d{_0hXY zfsS=0WM1||t&jSddO50q{6MgULgF5Kx=kJyn)j7kwwx_vb$l7|jb_MQyF}L8R}E*# z&G81qHTrsz8ZkE;wU($oswb>FPQ17S6j2Wo!yd>MfLRy3a*v7bpbjzP2p0%30_#1F zq28!q<%rcWpVwE7iW}7NAQNw#@)$^O_ITCr<#5##Rzl-AT_{v*XI1>}^}i#^I=uOY z(3)%Kcb+FE9l>_rF}X|=?Mw`}Ay!!b;Nxvi#U6rGTSpc=UAf?Es7VuC@!%Lj8*U%5+HR`G^*w7H z!TAJzAcdgM{kORe^mLKjDG@M=O)!Lx5Mdpc4eLopxSm{&#Uo6NKTix>yf5GgZXb&w z{Yx0qgZY01Rk&X&+6q!cpB%V!flvjSsa*`RCR<>YT8o zk;dY|Za|F)8_n~Za29Z;1_%mSSkGtzO5FTdH zj%s9WBQ%l>0{L6G@R%5hQu(Xh+ZZf;L<$5}Oq+d@DXcGNzdU&USH>);TzpBRPPW2_ zbi8Z1s3_14-;pgM+A5NEtRkhch)C$-1Ti3@iLG!)2%9@16E;^b&>+@Q&=RBE#WvSD zDts;R`oW8ERCp;(ti#aL>jynz`9+S3-hvvz?oS$fADPbeVn#R}I(YlY zbo#cErc?FFXKy--TKEe#!<+GqOs9=X5#DY(6eC|4sp%^wYs?6^J>VqkyWcR;lAVk~ z&i_W!7YjKXr+dcTaz{wZFyy>_dE993VMcS)*02d*<3>&wayBBwrlK1h`UTQMK{l6>e-^5Ofi+kOc1Z6*1j`f)xKweZ=ng*YGNB}6I^jbg5okPpi@ z%LlzBAI5(@p&j04!0RTU>E10?<DQV$79D(Ym{uoFh;P_i!gl{{6$Q^cPy_y;L*z-&wa)+_bLggx>7vi8uU zJ;u0y;41Tc%e(mJI&3}(#_uE#w*OW5YUkqBF!RyA|L%M=8qS-jpyi-BJqEvdvhv~E zY*M%OBTnjeAoDccWmd%%RlW&MlidHc$S&xGd<#%5yZ4l&PbmZ}Ul z&jVuJk^;ZiKnF?P1}(^d3g1{QW(Sv^%YKk<{)M&65*Et>dUvQ4B5j&>0v z;f2Pe-rMz}77h+uh(=Ai!jTL_L#F4BpWMkW4ZDr`Ep%C-X~9v~dGiE9b8=_vI@J(F47#Tzg(%m0>QDWV^uG*@txq*bss>KN0(xRUB=1H zz>5%pZSX7Pej@$|J4y}Ee0+5oI_Ox}M#~QoXl07|xKf6~@XS9a4z?}9;`dbUZWf0J zW})2hP%1Vb1dAUw{Hh7QEEjG;N;4Q)D)ov)MzpKFiY4VZo7^+*RwlZ{at}hO z3vKxdv*P)n#)j~GJ3h~ThonN8b{UTC0s zfmI_Wq-U|PEH(-^Gxsdyp2;6)>dH~ZcCS~%|UGC+vN^fs_amDFN4yVO@2rc*tHc!e65HW z7TO+zOz3Pnx^7?*6fI$w2%r}U=<6eW6}gTOX_f7truwVOI|0}X9g zO$#1-Qcqn6a|~t>-vxb@3#c>Zk7ooHKF)X4;6#YPO(P5%E6dtRQ4C&l+nr?1 zAcC{$7PNW}ju+rhRdD51FKx*OmCUM3Q>YgbVS8i5Lq`GGg% zKvyyjGlxr9f8qo^BwiEsP&u5L`(y?2oB4lX=ITfm!3VO4JYaRV$m3KA&Z;Qdv5EwiS@Za`QzUY!n}51_ zvv&RsLz=aI36u)~z}iUrfkZQ<+c<@t{OHr0wO=^1wp^ zo-Bf9*DHOfSlTCsRh;>%qF4a8;pp8Uu~}G?QM#x`<}8=G_H8p?v}!%6@}8vmif-8u zmf6sJ3E9Zk`{f6Qz_8|Pd^w?mUE$yvnJ+V2{^X1;P5KKMiHzPu7)nT62#<}K8dGMW zEgisG^qdKBnoVm+HVyHPL6L^!Qb$iJGJ1v^jb8WVFnUvI^d6(pJARa`-Sg#23O|F< z+aWZ1F@GOx1);tBtJymv_tKhrk{kXWQ+(gJ8Hw0LdQ+8bRB?`7(B#&sfSS`FZ|ua@ zh~RsKVwL*MKl$Mx$Jm~6Pw)}9hNtppo3X?F;Lf<^QswuVF$l)D#-!U+4jVcM6AE`b z7_X11OrL(oEnyKvH#iYUSVFY~ZFCOb@#RF?S;BU-m~i-*K|};jcEk{FU$vtkA|8&i z9ji!adg!0u+bQnM3uCCs96*o^HL41HZd!Hz`9TEZP$qZPKy2=^^j)uz56NjYr=vHi zwRgPl3wehKsnc31IEMKmBFzh{IIWeI13tppQ<42DulcN8(2iE9O3tavV)$v3*HAS2 z{M*J*?Q*GEO*?^mn7AGNg%|;r2+xZ9_atlO(K3fK$6e7GbxPz$`|S8VPzD`m8_TVG zl?AmI836&P$?GZAJ>!0J4QHObV6<|L=Ar0!BKH%trJEG|9C--@Z~aJmy5{5I^`u_%$rt`7F%!w5d)Dt4}+ zO8H4=&J>3PuL{n(1cvgfw2?m?DdYI_e$>nJ9G?G+*~gjwzS2=tkB)VHB8|Jn62?)0 zLNV7OpMRu7KT@qouay8e2V!bJPHm+5el^R18LUJ8sSS4{W~{zrn*4>R(U51?vv$O@ zThwScEUB}0tD*rtXOY%6N(qF7r7J3L042Op%dAmkicX^La8Okzi7 z$H>ynWoK+E)gp9HdpV!fJ;p?g9vWmN9|oT95u{`5C|MhP-|Z@g2+krlvn`Z@7>)~* z!tLu8br%~quwK%m{<1f*_nwNEuBHk2F+0cpPhQlM?c@WEhq@V>J;93guWl;*Civ!) zkeOdWh$J$RylB72Q|x*3S2nYg`bb8ARN8uOAVz7p{7~`}RVpJkxnNPb*@%Ku7}y5B zU}MQ*!Bmdw$Ol1D0&CfKsua8I7R5vQiyNRiLK(X9NG$aCJ_ipx0YrC&Tj6zsX@qYs zj2G&n&!OXm9Jr_x{G%ZBDJ>2YP+7IQL?yl4ZIlv%2-7J%lnm0n@=i2{NrQl>0FF!V}i>(N(*h7o-*9gL8+4TM;<{kLU*-qIGPwG&DC^uP$cwDXox3uS}Np% zaKWriFXQ8h!TGB|%RU&Wh<=inN-9z3I!Nz4h9vn00jNFieL0I7E*4(=w+?kw@O_2yb@S_l;54ONJ4NknvWJko$gaxOrz_oC@({QPC z`%+ay1Qvv>i+#5PG|Cxow2SrUmj|vF$`ctRa*Gl-|-adA~ z&#G+eXoF#%MC)ADhH0cU#b`0a>l_afIvHpr0n3AbUK&%C7UnhCiBpDM>8PlV=~wzVy5ytYH*Fdw#g(On+0=+$AT6S7!{#8iG{O!d=;Mi4fAPdSS>;L#Ydtejau9JotWdcd$gW@@ zIW%~C{5c|($7*)6uyO#&{mQ9*nmcer}`Re3%E(Cuq;% zzBJf>Bpbt!i93jo+0RUnnW+rl`;W0w27Pnxu9P z2UoO9;R)({D1!hb^laXSjtPKekFkJ-_m$18*(rvAeeU;XFeez1_;UBozV>Mi`0z?` z!%2|XL{kQGK<(HG`03NsyQ6_I!SZsnhFhua6GaK+;c3K?Uk|((bc^AoOJ+X;UMEzA zc}ZW%Eek)2n(j;|i~>B~?1;dDq!pTqj5+@y+^ zD~IW@6dhh@9rCL;yA4OkBn=XT+}RV7U&|R2T!@34AtCW0r9-jhY*>Na}yJsgRzKlZVQ?p z?Dw|j2YXtwyCpkXQf0{~OG+(y|F5d>jwNqevek0fyRk#qyE})pcddZX%pO5i+$A)2 zpDi+Wm>-+5d%PR$bjA*|6v!%A7{gSSZdb$CcTiMz3$vICNUK3DFsB z+FmeAlQeCKW|Q~~Z`ZCyOVEze;d-Mwe#UxB*tJAwNz@a>D>7;{qapER)QosZ<(fu| zc4v}!-l8Qs9*%eij}D0^>(b2VNsIfuJvWg#S%}P8qS?X38``wgp&*F&#HeI%E$oe> z5Q&#kZ!?m%EYVw%dczyChbZ{Diq8z!8x2_&Wr_`1qO&BS6Raw-VsEi2FXysi#;T!A znAgoD;evU8w)lo6XIkq=X^0+kmzyjPngx=r}rfG*7 z5GKTQrE|k%IB!$%@n}4(7=X)wJ90+!XQubzY7@LUAFNv13Bhnyv4Q=j(Jww-t~wYq zcJ1tY0ZBd9dd|K93;OV=*qR?rrfD?U8|{UB*qNhAtf^qsn#RfNu9)As+le|u*tBwn(&|DFEr3uPfX|3CP*=NI+%uk~-=9ht-} z?CpP^f4lJavR?}<`HCf9vZU3L&suVhC1+SN+maJ4nY-j8`?m)l;{4lvPS~7(I|eQP z-}|>`4DH`G>=^pDW1a-7Ht*lw<^0U%@^x5=+b=zGXm zFqnrG2srCibk^(O!Na9abFo6-fUU-!0DZnTl|Pp=vq#Dr=fdsQ>N;0|PASjyjN&(> z^_>TPdNi|Q0H3kn9-Fu3jKCEmGe?Y^i}mO+-E(R_2LHSgE!5;PBj#eIyo_^zkNFQ| zZ-vkVrcY)3l>An6wO99fhpOdOJ~F$eY|@&!Yw{!d>DHHqK#a}w9A7RVc<1K5oQ4R9 zG3b9zDS;>j5Lk5q5TgOaHtcwG<-@aU_N!lm4*^}k=l$we;OAt*fY=nC`F?ceBXerT zOj=X<@Y9v|KWqJJMpT8F3BLb}$>U6xM02_aY&%vjC3HXs3ncqsilHp~2zXhcQ21F$ zXA+*R1oH>Pw9i{IR|zL3$>4gX=P0ayfJgWNEA|PjJ#fs`85cY87j3=Us*ZcKw@+bO%OpN)Z`T3mz_uznrMFe)>0EIta01+z-)3Ujk~ z%$&<*n$e9K(T|@gql+)tQf$4$mtG`~NRo{ADzcZ#pOwbjj~zPqg%Qw9*q zmy!nfA;Al7%dORVAgl^mgZwnHVVB&E)3K4o5oSMwY(R*h;_}J~B|T*wC=DBwn&n%T zd~g>_aQxa>i?t@ws5oxK?x;BCYgz45WZU-Hm~`Rho{D46B-H=_ai`Tn|Jl?5^Mt!6 za35}p>q+gbqK?2du4u&v7dQfcxgjL*l#Zz-=L^}?f$nEd#Vh}21b)eo%%(=;6|t?j z;RO;nb-9vpUuKdWHwJG(;0h!?6?eG03w_-;+8uMIx1m^1#r{mP6JPuv%tQEb+9C@4TEH)0j%Mr44|?#nB%6qTu+}9e|^U zaA1Tz{F3hxjypqRQw&e#HM+^aa~(|nJSZ1vAPsAzh7qP(|04}Cl@t;@DW0~$%@B-c zELRMa@gkiDQi<6aW|s%A>}=X53z?xHvx!Z8d|O+%FD%(eq9Ve)s(xkg;_cwrsS2ef z=vR47K)^cJH51+@!pn<;+5{{73)3M|qq)Fs^&cs>ZFbxT zgfii43?%l=XVd|a_F;`ytHsWSVTw1+eA5!{ZNr=8dXwA~6a2?w z5bL!hu@dqg(Q5=52zK#pAlR$L1dHTL@#>Kr|2x*T3$b}%A5^Z*QRaGNI?BNPvh9T2 zSjYW5sr>yUaxQh(7j_d#>S<0IaNJN&o(`2`hdJ$T<8sFj(LuAAP{^2E9=RkzX{bPM>Y+UOCY%7vp?w-9aSglt8( zJ6s;`79Wf#3A#R9wy6zfGOk<<1f2q77-~!5=GaN?lDFRFO2|4M>7Z?z&1d+0i`}56)>wx5J06^cKiqNg!V!z%XeTN*wM!BV2JF?b?g>> z(-DB%m=3PK;13#qBf$c9WZV2M-$>C!f{sH>w0BTZm+efz7Ok@O&o_N z8VHb8@C__9aEsT>GKm0>QH$RS_}HH%JV4RR6aan z+Wwfd9v!O-_;dmUo5sF~wIJ5#7WT(8@2<_P*l=W~b6|wqR%!=Da2)|iZh8i$vSmT=jX}b7TzOCGvXe2x?7M_#nX{Gn2WZo@AoTXs z4C0SV%Rh}Gb_(y3!wFF8GsjY??I4~NCsOh+a^qUQoW@IkN5n#jOnwSs&ZTxo#bED8 zF)MkJle^vcE0-U~m)S8mRsyqxQs;ldhMg+f<7#ei2)66a%VSQ1%yy$*7hoe5){AhC zq}XEzk@++~_tDw+K|*HAoXjXx1@N@SXu{A2wmM;GA*azQ-;xwo+JP2KKA5?VkhfXeAbgHTnrR-mez?zMQY;Z(Hbc$CBMKWo^N(j|;i&?thW9 zU4UKUz}}$7i`4cdYIuXRl~K9^x5zfc#fvQnEFdnh#1ES0;P+{xOEo(X6z57fQ6tJ4 z#jN}Z4i*}SOx9dtLozzLVm2+9ycb(_-mq+%8Ut0*1n>t0D6}*5(Mk(VQJz1zvgMA# zlK|<^c*Z-*9|8f)@9)$q39D!Qsr95VSr4Lc?{nqNefb}A1WAy9M=joSxpBAxae1LT zut_l&S@+x12!KI=AtoShaGBN=9*Q`2m1bI=92jK~nxJESj?4F4Naf#_0b+;}WCRby z@RyJoXLWGu&V$Umu3 z`2vZEs?C|)41Fy@VKop%U2zTzM+zTez8B?4n$%Z+@3iDA`-fV>6Psaw9v!O4>BmV$ z=AmX*Dgv)Pt{;ctz0;4w)cWB^MEb!=6xiJ>Hdmbd#k2%a;(=`0_>%k&X)bfAk*F7p z`62Y;sUXE<5t)|BO#cUJhgwot4FkJ7l%%jRe>p1VFX2C9)I=ml!TfQ9EY}Ul^44u8 zt(!AQxmdLv=6*?0X%gQSx-SReau5&|Q=^_!)0wQZbsAjQGHu<_8l-j}kS%P&!|8~RQnfS3)Y9?!8=$~py3 z2HClyyT9%b9T!LRmUwZfhG`>R(Lc`|r$Dp&MI{>tT7<7NI?{1dr2lGyjgmMoJlZ#LV9E9k@(^1IBdmtry+Tph}J5>7j)QkX3r9c@!aVpaMFQC<)Ya8;J~kf2p>QZW8vx8dPffOK`qsM zd(~LbrDI(S1tz;xANS#WyBW`J#OuaS9ErUJiO=d~X#^K~De_VF5^5;s32n^d%6Fp` zYv(imNKDN2Ss8+%p$bCRjyHDq#~W4n#S+Zn8^qK)a)etZMAlF&}Vf%IoH@4l2- zvGK^vgnnJG@1_a(AlWShq9^s}?NQj=vM@X1EBZuaLRGL&0}ui&tGR@KI$4w^TqP*Q z?9-Wj65(Nv`I;z0hZCm$7CCzgO*s@8of5$K7+MJMg)BC84M0DWzXanRSY$9A>v z?%76vq9gDpd5Qlry_^8qv>J1CDfhHMJj8``1&bluKQCvA-9r zE3Bt>(7v^+dj#aPfFwj)ZGi^qAbqUexughNy{+h@GpmQYr3BAHwQD?%gMl3J?vn(> zLyzXWg_ZXOBdpabv4K%XF(ZzA2Jfwqc|UuYhb4!@1z*{7G!re+t7wSwMpGAd32EDv zynGvOV*_!@&A=TPeqIPCi+LjI)$-v}wHHN1)k`p~UQAi!8XQE_)nt%}`s_?2s+>Pi zR-XxR?g~0pI}Q*ds;Z&~_T-7WzQTxVy&4*ok5qiMem4vXC5AHVu388Z{uQv5(1-*Nxys$FF$CbIBDV9*0nc`kNBr6NgQJVoR=J1Kpwxf8BFrHky_wj;brC~ zL5-1_sfQX8M^A>&9x6(W2xE$99==mVl?6yu!A$ri@mfh-oWgNhre2*f3s-T5Q^*7j zg1#S_grupB>m8WZV3)fX)y?N|-$p9Gj3qu|7n7IxE+B-`Mhw+MLk~KB#Ks4%G`6KF z;k9fxF5&szFqbNPKfex_SmlqS6a710XO&AGe{otCQyP~`edP#yTmnJLU&ABYZ{Xlh z{vB5PDz0LJJ09S7VWTM^xYNY_btjF|4mw;2VuQGRn-Uf*>9!oQubnhQmDcFN-^a&A zUK45-V&f;tu{r%%dn)HZ`DxZ`rHI3Bv&^TNTOOQ`r7Aw^$n$LGojSL3!$=H>zs7hl zS4Lx7*%5Wj212dnwe9$nTx(|P%P9XRzMHxdzh2_6NiSrwYcub@l3DRSH2CGrh&7y1 zr=4uqI@#`3I@sI?DhHuay2#cUfPv~6vP(!2z_Niwq``C8Z!UGv1zv*@>QwvgYud21 zDr_!>E@qm;p%mSVy0C7+uZ|c}gNK60G&l~1*WjNEYN&#G_fY{zt3ZZIDBodCY)pfV zI8K9A7VM}BuD;(i*w?aF9ZiPO0Wxbi+O8IK2!|*|IE1MiN;NA0L6j$=a!v`NzWUjS zsA>S_Pz`{nDm<8|Hp3uM+oumn)S&<|qQ=4SM4e9u4d}Ah%12T&59AP9aU>G@Uj`1l7l zmP?ImiTGH{`k;y00Uxd1IUL@iTg#$IbUIjmxbd-`c2dI|jHL^?P`MpkY}ZI)Jy;Xu z;|f@Z&j?Fb8dwTyVACg%F-QxlLCRsoamt~xQjYVNnsWGBhKv7h$k2SI^8q^=%?sMp zw-TlKjp{Ai3qpV*uVgHb9Uc z2Fk{@UXnvA7cBBFMlwR%E+V;geo;*9EI~J!Nw8rn{i5T96`5SwXoB4A2-Kn!MlK8C zLOlJoO+c>-{5uc-&%y6GNSh&@?|v?=0VtxNoEo;@$glrQ{U2Cu!%kZ4-c79y=+xanC2r*=p{4AMk^2o8ZLU% z!bQ~x4xO0)>fZs<(|<)E>!oE1WIb=mvzDx~o6dJ0`D4ZMSWU8>R2nPx)Y+1(M zG@FKIL%Q>OG1$mR1>#I;&>i2)YtDnG46kYQz)LKt%(5Ly&HU9uSTlgNQCHrn({i*9 z>|_pR#!Cc+FM^=htM8&{(S9J|^AK6xxvrJ_U9r6f|G02jJ3t{6Z6cgQ>4Y%HV)lj= zusgmU(IKoOoXO@^yk3SWT{%E114yulYzmUxttQz|=c-nLZjINH01d>J>i~8<$38ky z&gO=inrKk;tO(D$((Z%t%TBU#i)k~E9HP%| zh)6Tpo&lmPWGn2jMrTYkYh>GG04mlqPBv?lCQKkHPeDmT%p}c*5JTXbyAWYK0X+U> zx~JkY0FcRjxeC}+5Qw9zFknprfr6{p|2skbJ)+Pl7ea)8QzXJk`_1S(>^?`QG$-9# zY0_O<_yW>W$N@JG0h?;A9gWaR*?87TH^9Zgh6P^_fP3?<*CR>_ud^vMF+SD=cQ%wl z>q-hws91SP;cs|Yj-u5lx{Y0Klt%Vl$f`wFY2nSe)7wk%YoAy<4F<}`LQwL!dvB9( z@~?$^qcJA3#~6s*{!Crs-LdW#YGc-IN6cC3th3ydSoB6>K*vi}!V$aDeU_3V_5li* z90LadfPzE~D9WF3MZ9wYRzeG)l~~&yAx{F6E4HX?xD_g>Wq|wmdJ-<_kD`xjV$qch zRxr%mr`}%>tzcM|n@~W2%z6YZdmD?jf^jGrnx>2)>@&0GP_n&_dC(bIX8t21usQ!!S@-po%);75-I23zN(X)pOlb@>9!lYJUwMTAN zO$&^`Q+|WoA$adrB^$t`Tx#KXs-|s_;{Xp@V6%M1iL;5Y+bIV+^brw+k*{a!5J&Bk zP&*ib{i_97#{S^loAIm11h#=q$qLnrfshQS>mPu9VIVGTgB!hJr9-&;W8tdv6&86j zsqwcAbJhR6y^EHdF+++YJQME|2;a1O9AP*pn)+1C`Q(Q}_*1AIR1wV;!6+uz1_ymt zR_B$^!Rj#VXgV0vzpfg7ht$>+$8f`6$GTdYYp5VSvkX*_sUu2;S>SC0Q^o)OD%xZ5 z0y(k8Y_TMlI`?r$t<$wh+U=s$OWz6~0awoGd^l0#t*jOguG>ru;M-%Wp!!;nuN=sPc;xKid_Q`}IvA*^enI&+*sQ37m_n z0QwMPJN0l$IXVop%`-)amSA{P0hUA*+bgj-w<66i`{;=Scp?Z9)P4i96ln80R|^$@^*sk(_oVPV#S|NP^^l-X%_Q znIYgdAOI@vZ~RaszXxpu=icZ^ej0yWZH`ozNd&+&IpcMtTM5+?Vfq+466?!6uJ4bI z;VOd-noF#FBU$R>FZYl>O1#`gH5QKJ`T&X~a4k#VsWzMX;Vmu?`g zK`WC5ahd35TOLjfID$LZgk4I{!r9pdp-t>gsM-Y7=>w+Zbg{l<3-&u~E97f9$c&tT z%CO>zLB=L0%=Y7qpRQn(VKxSgnKk=s)Y$d_^{&l~lQo#ywUeprPo0>xkBX6giBK7e z^ruZ6M0ysElm1W?Nszv0r?{A@ZIFJokv?epM12(eAxLo3=q@zyuxLHu#}G`n2I6G)WwD8s!g3EVET{F?cAGFe-x~>2bP6rLZ~GosZcpN&YduRkkMsf(+1ET zd(mo9B%uv`!f~+Q4z{zxeBF!>3Hvr4H6*vl2N7 zABCW&K8~oH#Y|VnqrH!VlVb_ydVz~IHl{_k%kuoD?$CA}hpnoi?SjMV9OMl1ri2c1 zhTMx;Ex2(nad~wj*J4M5l)9+WbJ}Z1bEq9QNGvujk#<}~5T~w14CB(_V%H^7jm5SN zs`Gu$sIcSo6R#dQi(&L5u>FMrG>qbSBkvdK(-xw%CP@cv1!2nn70^P_ z-!1%m;l0ASg|iFq6wWK0Q~3A%Cur!K3uo#I^un2iIr%?h$+$45aC+ga{I53PXH)*? zNH)W+;NZn_|9*0tk{?=fpCvomyIy-5WluNSQ;#LzX@=YQi@$ldF`U3*zMAG_zM7Ny zYM3afu$!0}r8Ql~{2g``6RXm~QDh(Hqj=V28gaAI!ZfP%w07Le%?m?l4A^2PF0f=H zoS@SrZ|cir%W4XDvxv@dTah66CUGkEXBBT)P7WsSw-k-2>bcbFN1UoYRT`=)@Ae0P z2sCi%N^a5JyGTRl0u=K^vD+m+SY`3vsVDBrM7!PFM(WAo1Hgkk72iINib+$949qp> zF$9OZGEw8xs1cl=n`bJQ97HGaNcpp+b9*@nzg@t6Bzy3p<%YwgNN4u6? zYU_FM*K6_Yg(CXd#8Np$gy2{4VZqao#Jz?oiJ1@E!E}nvV^eikxU)u;Y0mgQ8x5Uf z$Hs?FTCw1Zlfxm;4Jc%%bAw?9t{11Yq4JBeENrs4>0mcv4E`V(q&;qK)f4S3K`$`` z*aWlKM6YzzHny?LW;I=e70L@6yf1h41d?KO7l#nxwN#$x=lsqJM@0H-Xc;1)Ws_Yv zg+kc(di4$;O{w3e2j-!y16T|xA~OX)0!c=bdq>=25C+e35KLvvphD1slXr_P_oS&` z2ub;6C`^(aBz?lqkz8BA8n{!%Gr>>`)cVkkn{nW6- zn1LHU=S~}exb#&BRH5+vn#SyuuSL{ZoS+VjF>NlVi?Pu9G5-`3QPfVNIEp5plO^V9^a@e(#V36%^m^+}kX0$sSbu%Cc+n7_My2;vWleJ+Q zHlvYTnoDYAGl>nTTaXrMB(n&Y71_K-8cf0fHDqDv!cup2aoN3^4dH_iWi`Py*ia1Y z%F*jW08ck&4BWb-L0Uco>GPO(H1dw(4;;oq;OYx0LgVxRRaX=5$SR3kwx13hJrDfN zRNnuLKAOA%)eR1E0^083{@>p%Ue;4V7jhD2@ms!0p_qq8nXNs8uuGH+6t$RXm+? zi2*${X?K9LL!paEn-+2lwezb;==2Jtt#$Zsj|+I4mlrCpW8jz;=Bcu7)E6&R9uZ+{*vgY8;=z3CgSCjSda@-f?5o9d`)p=* z4>Hm5B#gYT`JHmvr+8gnX2Mz*bk^2-sVTo(K+{vvv1_tUCv`FhcB0#Ky@_|yn zv(7bz@@fa=)egGocjZ^R@@tub8CKuN;c<$V`TBM=6`LijhLte>EOB)2btMcIs3l5U zKk|KC*qd~ObXEm3aOi~cJ%}MjES?kF4cKMNZgm3PDh4)VuxRJL&8~b3uk%KsaNv0M zP(N_6Q>X*{L5<5CIIi6xHeh4m;6`8y5(vamBmW4((CCaj=)yCVx^u;E-hHX^{uKb3 z8jzX(`}%7~LO?fThyrX+OKMA1sM5iOECJ`2)mYAq26-VgYYd= z{ltJC-1g}hOVSD$JCWXk!#xxShD|hdfMBP2FtwLk~=Lq;gfLk_X76C z^Oqb#i=ltN(Bkn+1n^SxXyM=Y;@R{Y-^-S+W;pA2rAzyAf314y+kzAE-;+`2kKincU}hd zu6OlriGvGnEmJ3>^9#4$TgS7N+o!>1y$h z07WN{^>*qS4D1)NoPPrv$wl$cpds7CC7h%2svXUAY~;VF_ZK8#J#GiE#-XrQ5O%0B zEc^fp!?estq3_`5rWJTQ9~q6^vub9r72_PXRSBBK#<|?ZaHoHM)&3mpDj&Y0W=2Ez zwC%X?*~(HFfK-}*;hBZSTtJr#b0*6)5FLX!TV}v(wXfNt^4(B#kgj83D*P+9C0GZqR z*yq0J4a{%Zw6gO47e=f>m-AR+!P5vJX`nM&0aww8GDMGi6L#n&2f7BmUl{keR}0X= z9`}GN8tA>Vu^p?H;Bh57Z$=MuhGJ8l>bbR=qDe1?8Zp7Wl}bO$s5sc9H^6zBW0Nn* z_N3C-wiT-ADe+3iDV7(f+5p*X;}4|ZW|GjTc?*6@nLiZq9$!~XytFV&_|%?wdIcnE zRiwz>LnNb@`Hpzd{J&x#GYBC|rG>WyAiRBu|9LgSLztYmFIL5Y%}ji?52(z5+y z(UxJ_gf?c1h?U4g70yO5{re1jbWZDZ&jy9DmE8k8nIMRMJDbC6SKAlhIwK>S>@)>g=|K$vl#P%zRsxkQ#)svB>;Ns(A zJjVd#<~|�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

    + + ); + + return ( +
    + +
    +
    +
    + ); + } +} + +ServerStatus.propTypes = { + endpoint: React.PropTypes.string.isRequired, + status: React.PropTypes.string.isRequired, + clientUpdatedTime: React.PropTypes.number +}; + +export default ServerStatus; diff --git a/web/src/components/stepper.jsx b/web/src/components/stepper.jsx new file mode 100644 index 0000000..03f9a14 --- /dev/null +++ b/web/src/components/stepper.jsx @@ -0,0 +1,43 @@ +'use strict'; + +import React from 'react'; + +class Stepper extends React.Component { + constructor (props) { + super(props); + this.state = { + }; + } + + stepChanged (index) { + this.props.changeCallback(index); + } + + render () { + return ( +
      + { + this.props.steps.map((step, index) => { + let className = this.props.selectedStep === index ? 'is-current' : undefined; + className = className || this.props.selectedStep > index ? 'is-lower' : undefined; + if (className === 'is-lower' && this.props.selectedStep > index) { className += ' show-bar'; } + let stepName = step.name ? step.name.trim() : undefined; + stepName = stepName || ' '; + return ( +
    1. this.stepChanged(index)} dangerouslySetInnerHTML={{ __html: stepName }}> +
    2. + ); + }) + } +
    + ); + } +} + +Stepper.propTypes = { + steps: React.PropTypes.array.isRequired, + selectedStep: React.PropTypes.number.isRequired, + changeCallback: React.PropTypes.func.isRequired +}; + +export default Stepper; diff --git a/web/src/components/trafficActions.js b/web/src/components/trafficActions.js new file mode 100644 index 0000000..d4083bf --- /dev/null +++ b/web/src/components/trafficActions.js @@ -0,0 +1,24 @@ +'use strict'; + +import AppDispatcher from '../appDispatcher'; +import AppConstants from '../appConstants'; + +export default { + updateTraffic: (traffic) => { + AppDispatcher.handleAction({ + actionType: AppConstants.ActionTypes.UPDATE_TRAFFIC, + data: traffic + }); + }, + clearFilters: () => { + AppDispatcher.handleAction({ + actionType: AppConstants.ActionTypes.CLEAR_TRAFFIC + }); + }, + updateTrafficOffset: (offset) => { + AppDispatcher.handleAction({ + actionType: AppConstants.ActionTypes.UPDATE_TRAFFIC_OFFSET, + data: offset + }); + } +}; diff --git a/web/src/components/trafficFlow.css b/web/src/components/trafficFlow.css new file mode 100644 index 0000000..94df481 --- /dev/null +++ b/web/src/components/trafficFlow.css @@ -0,0 +1,20 @@ +.selected-formatted-date-time, +.layout-actions > div { + white-space: nowrap; +} +.layout-actions > div > label { + display: inline-block; + width: 160px; +} +.layout-link { + display: inline-block; + line-height: 24px; + color: var(--colorNormalDimmed); +} +.layout-link { + padding-left: 15px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} diff --git a/web/src/components/trafficFlow.jsx b/web/src/components/trafficFlow.jsx new file mode 100644 index 0000000..62e4a45 --- /dev/null +++ b/web/src/components/trafficFlow.jsx @@ -0,0 +1,421 @@ +'use strict'; + +import _ from 'lodash'; +import { Alert } from 'react-bootstrap'; +import React from 'react'; +import TWEEN from 'tween.js'; // Start TWEEN updates for sparklines and loading screen fading out +import 'vizceral-react/dist/vizceral.css'; +import keypress from 'keypress.js'; +import queryString from 'query-string'; +import request from 'superagent'; + +import './trafficFlow.css'; +import Breadcrumbs from './breadcrumbs'; +import DisplayOptions from './displayOptions'; +import PhysicsOptions from './physicsOptions'; +import FilterControls from './filterControls'; +import DetailsPanelConnection from './detailsPanelConnection'; +import DetailsPanelNode from './detailsPanelNode'; +import LoadingCover from './loadingCover'; +import Locator from './locator'; +import OptionsPanel from './optionsPanel'; +import CustomVizceral from './customVizceral'; +import ReplayClock from './replayClock'; +import ServerStatus from './serverStatus'; + +import filterActions from './filterActions'; +import filterStore from './filterStore'; + +import trafficActions from './trafficActions'; +import trafficStore from './trafficStore'; + +import AppConstants from '../appConstants'; + +const listener = new keypress.Listener(); + +const hasOwnPropFunc = Object.prototype.hasOwnProperty; + +function animate (time) { + requestAnimationFrame(animate); + TWEEN.update(time); +} +requestAnimationFrame(animate); + +const panelWidth = 400; + +class TrafficFlow extends React.Component { + static defaultProps = { + interval: 10 * 1000, + maxReplayOffset: 12 * 60 * 60 + } + + constructor (props) { + super(props); + + this.state = { + currentView: undefined, + redirectedFrom: undefined, + selectedChart: undefined, + displayOptions: { + allowDraggingOfNodes: false, + showLabels: true + }, + currentGraph_physicsOptions: { + isEnabled: false, + viscousDragCoefficient: 0.2, + hooksSprings: { + restLength: 50, + springConstant: 0.2, + dampingConstant: 0.1 + }, + particles: { + mass: 1 + } + }, + labelDimensions: {}, + appliedFilters: filterStore.getChangedFilters(), + filters: filterStore.getFiltersArray(), + searchTerm: '', + matches: { + total: -1, + visible: -1 + }, + modes: { + detailedNode: 'volume' + }, + traffic: { nodes: [], connections: [] }, + styles: {}, + serverUpdatedTime: Date.now(), + clientUpdatedTime: Date.now(), + serverStatus: AppConstants.ServerStatus.DISCONNECTED + }; + + // Browser history support + window.addEventListener('popstate', event => this.handlePopState(event.state)); + + // Keyboard interactivity + listener.simple_combo('esc', () => { + if (this.state.detailedNode) { + this.setState({ detailedNode: undefined }); + } else if (this.state.currentView.length > 0) { + this.setState({ currentView: this.state.currentView.slice(0, -1) }); + } + }); + } + + handlePopState () { + const state = window.history.state || {}; + this.poppedState = true; + this.setState({ currentView: state.selected, objectToHighlight: state.highlighted }); + } + + viewChanged = (data) => { + const changedState = { + currentView: data.view, + searchTerm: '', + matches: { total: -1, visible: -1 }, + redirectedFrom: data.redirectedFrom + }; + if (hasOwnPropFunc.call(data, 'graph')) { + let oldCurrentGraph = this.state.currentGraph; + if (oldCurrentGraph == null) oldCurrentGraph = null; + let newCurrentGraph = data.graph; + if (newCurrentGraph == null) newCurrentGraph = null; + if (oldCurrentGraph !== newCurrentGraph) { + changedState.currentGraph = newCurrentGraph; + const o = newCurrentGraph === null ? null : newCurrentGraph.getPhysicsOptions(); + changedState.currentGraph_physicsOptions = o; + } + } + this.setState(changedState); + } + + viewUpdated = () => { + this.setState({}); + } + + objectHighlighted = (highlightedObject) => { + // need to set objectToHighlight for diffing on the react component. since it was already highlighted here, it will be a noop + this.setState({ highlightedObject: highlightedObject, objectToHighlight: highlightedObject ? highlightedObject.getName() : undefined, searchTerm: '', matches: { total: -1, visible: -1 }, redirectedFrom: undefined }); + } + + nodeContextSizeChanged = (dimensions) => { + this.setState({ labelDimensions: dimensions }); + } + + checkInitialRoute () { + // Check the location bar for any direct routing information + const pathArray = window.location.pathname.split('/'); + const currentView = []; + if (pathArray[1]) { + currentView.push(pathArray[1]); + if (pathArray[2]) { + currentView.push(pathArray[2]); + } + } + const parsedQuery = queryString.parse(window.location.search); + + this.setState({ currentView: currentView, objectToHighlight: parsedQuery.highlighted }); + } + + fetchData = () => { + request.get(this.props.src) + .set('Accept', 'application/json') + .query({ offset: Math.floor(trafficStore.getTrafficOffset() / 1000) }) + .end((err, res) => { + let serverStatus = AppConstants.ServerStatus.DISCONNECTED; + if (res && res.status === 200) { + trafficActions.updateTraffic(res.body); + this.updateStyles(res.body.classes); + serverStatus = AppConstants.ServerStatus.CONNECTED; + } + this.setState({ serverStatus: serverStatus, clientUpdatedTime: Date.now() }); + }); + }; + + beginFetchingData () { + this.setState({ + fetchInterval: setInterval(this.fetchData, this.props.interval) + }); + this.fetchData(); + } + + updateStyles (classes) { + const styles = {}; + _.map(classes, (clas) => { + styles[clas.name] = clas.color; + }); + this.setState({ + styles: styles + }); + } + + componentDidMount () { + this.checkInitialRoute(); + this.beginFetchingData(); + + // Listen for changes to the stores + filterStore.addChangeListener(this.filtersChanged); + trafficStore.addChangeListener(this.trafficChanged); + } + + componentWillUnmount () { + filterStore.removeChangeListener(this.filtersChanged); + trafficStore.removeChangeListener(this.trafficChanged); + clearInterval(this.state.fetchInterval); + } + + shouldComponentUpdate (nextProps, nextState) { + if (!this.state.currentView || + this.state.currentView[0] !== nextState.currentView[0] || + this.state.currentView[1] !== nextState.currentView[1] || + this.state.highlightedObject !== nextState.highlightedObject) { + const titleArray = (nextState.currentView || []).slice(0); + titleArray.unshift('Vistio'); + document.title = titleArray.join(' / '); + + if (this.poppedState) { + this.poppedState = false; + } else if (nextState.currentView) { + const highlightedObjectName = nextState.highlightedObject && nextState.highlightedObject.getName(); + const state = { + title: document.title, + url: nextState.currentView.join('/') + (highlightedObjectName ? `?highlighted=${highlightedObjectName}` : ''), + selected: nextState.currentView, + highlighted: highlightedObjectName + }; + window.history.pushState(state, state.title, state.url); + } + } + return true; + } + + isSelectedNode () { + return this.state.currentView && this.state.currentView[1] !== undefined; + } + + zoomCallback = () => { + const currentView = _.clone(this.state.currentView); + if (currentView.length === 1 && this.state.focusedNode) { + currentView.push(this.state.focusedNode.name); + } else if (currentView.length === 2) { + currentView.pop(); + } + this.setState({ currentView: currentView }); + } + + displayOptionsChanged = (options) => { + const displayOptions = _.merge({}, this.state.displayOptions, options); + this.setState({ displayOptions: displayOptions }); + } + + physicsOptionsChanged = (physicsOptions) => { + this.setState({ currentGraph_physicsOptions: physicsOptions }); + let currentGraph = this.state.currentGraph; + if (currentGraph == null) currentGraph = null; + if (currentGraph !== null) { + currentGraph.setPhysicsOptions(physicsOptions); + } + } + + navigationCallback = (newNavigationState) => { + this.setState({ currentView: newNavigationState }); + } + + detailsClosed = () => { + // If there is a selected node, deselect the node + if (this.isSelectedNode()) { + this.setState({ currentView: [this.state.currentView[0]] }); + } else { + // If there is just a detailed node, remove the detailed node. + this.setState({ focusedNode: undefined, highlightedObject: undefined, objectToHighlight: undefined }); + } + } + + filtersChanged = () => { + this.setState({ + appliedFilters: filterStore.getChangedFilters(), + filters: filterStore.getFiltersArray() + }); + } + + filtersCleared = () => { + if (!filterStore.isClear()) { + if (!filterStore.isDefault()) { + filterActions.resetFilters(); + } else { + filterActions.clearFilters(); + } + } + } + + trafficChanged = () => { + this.setState({ + traffic: trafficStore.getTraffic(), + serverUpdatedTime: trafficStore.getLastUpdatedServerTime() + }); + } + + locatorChanged = (value) => { + this.setState({ searchTerm: value }); + } + + matchesFound = (matches) => { + this.setState({ matches: matches }); + } + + nodeClicked = (node) => { + if (this.state.currentView.length === 1) { + // highlight node + this.setState({ objectToHighlight: node.getName() }); + } else if (this.state.currentView.length === 2) { + // detailed view of node + this.setState({ currentView: [this.state.currentView[0], node.getName()] }); + } + } + + offsetChanged = (offset) => { + trafficActions.updateTrafficOffset(offset); + this.fetchData(); + }; + + resetLayoutButtonClicked = () => { + const g = this.state.currentGraph; + if (g != null) { + g._relayout(); + } + } + + dismissAlert = () => { + this.setState({ redirectedFrom: undefined }); + } + + render () { + const globalView = this.state.currentView && this.state.currentView.length === 0; + const nodeView = !globalView && this.state.currentView && this.state.currentView[1] !== undefined; + let nodeToShowDetails = this.state.currentGraph && this.state.currentGraph.focusedNode; + nodeToShowDetails = nodeToShowDetails || (this.state.highlightedObject && this.state.highlightedObject.type === 'node' ? this.state.highlightedObject : undefined); + const connectionToShowDetails = this.state.highlightedObject && this.state.highlightedObject.type === 'connection' ? this.state.highlightedObject : undefined; + const showLoadingCover = !this.state.currentGraph; + + let matches; + if (this.state.currentGraph) { + matches = { + totalMatches: this.state.matches.total, + visibleMatches: this.state.matches.visible, + total: this.state.currentGraph.nodeCounts.total, + visible: this.state.currentGraph.nodeCounts.visible + }; + } + + return ( +
    + ); + } +} + +TrafficFlow.propTypes = { + src: React.PropTypes.string.isRequired, + interval: React.PropTypes.number, + maxReplayOffset: React.PropTypes.number +}; + +export default TrafficFlow; diff --git a/web/src/components/trafficStore.js b/web/src/components/trafficStore.js new file mode 100644 index 0000000..e16ff91 --- /dev/null +++ b/web/src/components/trafficStore.js @@ -0,0 +1,192 @@ +'use strict'; + +import _ from 'lodash'; +import EventEmitter from 'events'; + +import AppDispatcher from '../appDispatcher'; +import AppConstants from '../appConstants'; + +const CHANGE_EVENT = 'change'; +const OFFSET_CHANGE_EVENT = 'offset_changed'; + +const store = { + traffic: { nodes: [], connections: [] }, + regions: {}, + lastUpdatedServerTime: 0, + lastUpdatedClientTime: 0, + offset: 0 +}; + +const clearTraffic = function () { + store.traffic = { nodes: [], connections: [] }; +}; + +class TrafficStore extends EventEmitter { + constructor () { + super(); + this.requests = {}; + + AppDispatcher.register((payload) => { + const action = payload.action; + switch (action.actionType) { + case AppConstants.ActionTypes.UPDATE_TRAFFIC: + if (this.updateTraffic(action.data)) { + this.emit(CHANGE_EVENT); + } + break; + case AppConstants.ActionTypes.CLEAR_TRAFFIC: + clearTraffic(); + this.emit(CHANGE_EVENT); + break; + case AppConstants.ActionTypes.UPDATE_TRAFFIC_OFFSET: + this.updateOffset(action.data); + this.emit(OFFSET_CHANGE_EVENT); + break; + default: + return true; + } + return true; + }); + } + + getMaxHistoryLength () { return 30; } + + addChangeListener (cb) { + this.on(CHANGE_EVENT, cb); + } + + addOffsetChangeListener (cb) { + this.on(OFFSET_CHANGE_EVENT, cb); + } + + removeChangeListener (cb) { + this.removeListener(CHANGE_EVENT, cb); + } + + removeOffsetChangeListener (cb) { + this.removeListener(OFFSET_CHANGE_EVENT, cb); + } + + getTraffic () { + return store.traffic; + } + + getHistoryLength () { + return store.traffic.length; + } + + getLastUpdatedServerTime () { + return store.lastUpdatedServerTime; + } + + getLastUpdatedClientTime () { + return store.lastUpdatedClientTime; + } + + findRegionNode (node, region) { + if (!node.nodes || node.nodes.length <= 0) { + return undefined; + } + if (node.renderer === 'region' && node.name === region) { + return node; + } + const result = _.reject(_.map(node.nodes, n => this.findRegionNode(n, region)), r => r === undefined); + return result.length > 0 ? result[0] : undefined; + } + + generateConnectionName (source, target) { + const sourceName = typeof source === 'string' ? source : source.name; + const targetName = typeof target === 'string' ? target : target.name; + return `${sourceName}-${targetName}`; + } + + getNodeHistory (region, name) { + return store.regions[region].nodes[name] || []; + } + + getConnectionHistory (region, source, target) { + return store.regions[region].connections[this.generateConnectionName(source, target)] || []; + } + + getNodeHistoryRange (region, name, since, until) { + return _.filter(this.getNodeHistory(region, name), n => since <= n.updated && n.updated <= until); + } + + getConnectionHistoryRange (region, source, target, since, until) { + return _.filter(this.getConnectionHistory(region, source, target), c => since <= c.updated && c.updated <= until); + } + + getTrafficOffset () { + return store.offset; + } + + updateOffset (offset) { + store.offset = offset; + store.regions = {}; + } + + updateTraffic (traffic) { + store.traffic = traffic; + store.lastUpdatedClientTime = Date.now(); + let serverUpdateTime = Date.now(); + + if (traffic.serverUpdateTime) { + serverUpdateTime = traffic.serverUpdateTime * 1000; + + if (store.lastUpdatedServerTime === serverUpdateTime) { + return false; + } + + store.lastUpdatedServerTime = serverUpdateTime; + } + + const listupRegion = (node, self) => { + if (!node.nodes || node.nodes.length <= 0) { + return []; + } + return _.flatten(_.filter(node.nodes, n => n.renderer === 'region').concat(node.nodes, n => self(n, self))); + }; + + const regionNodes = listupRegion(traffic, listupRegion); + const $this = this; + _.map(regionNodes, (regionNode) => { + if (!store.regions[regionNode.name]) { + store.regions[regionNode.name] = { + nodes: {}, + connections: {} + }; + } + _.map(regionNode.nodes, (node) => { + node.updated = serverUpdateTime; + const region = store.regions[regionNode.name]; + if (!region.nodes[node.name]) { + region.nodes[node.name] = []; + } + const nodes = region.nodes[node.name]; + nodes.push(node); + if (nodes.length > $this.getMaxHistoryLength()) { + nodes.shift(); + } + }); + _.map(regionNode.connections, (connection) => { + connection.updated = serverUpdateTime; + const connectionName = $this.generateConnectionName(connection.source, connection.target); + const region = store.regions[regionNode.name]; + if (!region.connections[connectionName]) { + region.connections[connectionName] = []; + } + const connections = region.connections[connectionName]; + connections.push(connection); + if (connections.length > $this.getMaxHistoryLength()) { + connections.shift(); + } + }); + }); + + return true; + } +} + +const trafficStore = new TrafficStore(); + +export default trafficStore; diff --git a/web/src/favicon.ico b/web/src/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..0682cfe472487a867913a9d0d0d2ccd3e3e83ea6 GIT binary patch literal 440 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10!Ysfi#MLc(L&=0AyG}g% z|Nnn%?XJ(?eg&3nUA*&=B*ua91QzHZ;$>1!@$wC(@$?e~kf-!{lR zJP0&_G0EHAg;|it=M#{_UgGKN%Knf?P*}}4?z=-eP^jM1#WBR<^x4avd<_Z$E`hUy zCWgtptB-WQ!kVhSF5&MdPpyE^r?MLxHZx>#M{t^~WqhD}A(G)?F>8%_3HyU&PQDAD z4{*MSXyUez+QHzN)5v1OtuojZNB>DKOl&h&rj?>C7+r>K^=MwFx^mZVxG7o`Fz1|tJQb6rCtT|@H_LrW`T s3oBDYZ36=<0|PFRFVdQ&MBb@03OhsZvX%Q literal 0 HcmV?d00001 diff --git a/web/src/index.html b/web/src/index.html new file mode 100644 index 0000000..22e388d --- /dev/null +++ b/web/src/index.html @@ -0,0 +1,28 @@ + + + + + + + + Vitsio + + + + +
    +
    + + diff --git a/web/webpack.config.js b/web/webpack.config.js new file mode 100644 index 0000000..b51ef86 --- /dev/null +++ b/web/webpack.config.js @@ -0,0 +1,61 @@ +/* globals __dirname process */ +'use strict'; +var path = require('path'); +var webpack = require('webpack'); +var HtmlWebpackPlugin = require('html-webpack-plugin'); +var Dotenv = require('dotenv-webpack'); + +module.exports = { + devtool: 'source-map', + entry: './src/app.jsx', + output: { + path: path.join(__dirname, 'dist'), + publicPath: '/', + filename: 'vizceral.[hash].bundle.js' + }, + resolve: { + extensions: ['', '.jsx', '.js'], + modulesDirectories: ['node_modules'], + fallback: path.join(__dirname, 'node_modules') + }, + resolveLoader: { fallback: path.join(__dirname, 'node_modules') }, + module: { + loaders: [ + { + test: /\.jsx?$/, + exclude: /node_modules/, + loader: 'babel' + }, + { test: /\.woff2?$/, loader: 'url-loader?limit=10000&mimetype=application/font-woff' }, + { test: /\.otf$/, loader: 'file-loader' }, + { test: /\.ttf$/, loader: 'file-loader' }, + { test: /\.eot$/, loader: 'file-loader' }, + { test: /\.svg$/, loader: 'file-loader' }, + { test: /\.html$/, loader: 'html' }, + { test: /\.css$/, loader: 'style-loader!css-loader' } + ] + }, + plugins: [ + new webpack.ProvidePlugin({ + // Automtically detect jQuery and $ as free var in modules + // and inject the jquery library + // This is required by many jquery plugins + jQuery: 'jquery', + $: 'jquery' + }), + new webpack.DefinePlugin({ + __HIDE_DATA__: !!process.env.HIDE_DATA + }), + new HtmlWebpackPlugin({ + title: 'Vistio', + template: './src/index.html', + favicon: './src/favicon.ico', + inject: true + }), + new Dotenv({ + path: './.env', + safe: false, + systemvars: true + }) + ] +};
    +| +| +| "quux" +| "bar" + +#data +foobazeggs

    spam
    quuxbar +#errors +#document +| +| +| +| +| "foo" +| +| +| +| "baz" +| +| +| +| +| "eggs" +| +| +|

    +| "spam" +| +| +| +|
    +| +| +| "quux" +| "bar" diff --git a/api/vendor/golang.org/x/net/html/testdata/webkit/tests14.dat b/api/vendor/golang.org/x/net/html/testdata/webkit/tests14.dat new file mode 100644 index 0000000..b8713f8 --- /dev/null +++ b/api/vendor/golang.org/x/net/html/testdata/webkit/tests14.dat @@ -0,0 +1,74 @@ +#data + +#errors +#document +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +15: Unexpected start tag html +#document +| +| +| abc:def="gh" +| +| +| + +#data + +#errors +15: Unexpected start tag html +#document +| +| +| xml:lang="bar" +| +| + +#data + +#errors +#document +| +| +| 123="456" +| +| + +#data + +#errors +#document +| +| +| 123="456" +| 789="012" +| +| + +#data + +#errors +#document +| +| +| +| +| 789="012" diff --git a/api/vendor/golang.org/x/net/html/testdata/webkit/tests15.dat b/api/vendor/golang.org/x/net/html/testdata/webkit/tests15.dat new file mode 100644 index 0000000..6ce1c0d --- /dev/null +++ b/api/vendor/golang.org/x/net/html/testdata/webkit/tests15.dat @@ -0,0 +1,208 @@ +#data +

    X +#errors +Line: 1 Col: 31 Unexpected end tag (p). Ignored. +Line: 1 Col: 36 Expected closing tag. Unexpected end of file. +#document +| +| +| +| +|

    +| +| +| +| +| +| +| " " +|

    +| "X" + +#data +

    +

    X +#errors +Line: 1 Col: 3 Unexpected start tag (p). Expected DOCTYPE. +Line: 1 Col: 16 Unexpected end tag (p). Ignored. +Line: 2 Col: 4 Expected closing tag. Unexpected end of file. +#document +| +| +| +|

    +| +| +| +| +| +| +| " +" +|

    +| "X" + +#data + +#errors +Line: 1 Col: 22 Unexpected end tag (html) after the (implied) root element. +#document +| +| +| +| +| " " + +#data + +#errors +Line: 1 Col: 22 Unexpected end tag (body) after the (implied) root element. +#document +| +| +| +| +| + +#data + +#errors +Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. +Line: 1 Col: 13 Unexpected end tag (html) after the (implied) root element. +#document +| +| +| +| + +#data +X +#errors +Line: 1 Col: 22 Unexpected end tag (body) after the (implied) root element. +#document +| +| +| +| +| +| "X" + +#data +<!doctype html><table> X<meta></table> +#errors +Line: 1 Col: 24 Unexpected non-space characters in table context caused voodoo mode. +Line: 1 Col: 30 Unexpected start tag (meta) in table context caused voodoo mode. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| " X" +| <meta> +| <table> + +#data +<!doctype html><table> x</table> +#errors +Line: 1 Col: 24 Unexpected non-space characters in table context caused voodoo mode. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| " x" +| <table> + +#data +<!doctype html><table> x </table> +#errors +Line: 1 Col: 25 Unexpected non-space characters in table context caused voodoo mode. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| " x " +| <table> + +#data +<!doctype html><table><tr> x</table> +#errors +Line: 1 Col: 28 Unexpected non-space characters in table context caused voodoo mode. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| " x" +| <table> +| <tbody> +| <tr> + +#data +<!doctype html><table>X<style> <tr>x </style> </table> +#errors +Line: 1 Col: 23 Unexpected non-space characters in table context caused voodoo mode. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "X" +| <table> +| <style> +| " <tr>x " +| " " + +#data +<!doctype html><div><table><a>foo</a> <tr><td>bar</td> </tr></table></div> +#errors +Line: 1 Col: 30 Unexpected start tag (a) in table context caused voodoo mode. +Line: 1 Col: 37 Unexpected end tag (a) in table context caused voodoo mode. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <div> +| <a> +| "foo" +| <table> +| " " +| <tbody> +| <tr> +| <td> +| "bar" +| " " + +#data +<frame></frame></frame><frameset><frame><frameset><frame></frameset><noframes></frameset><noframes> +#errors +6: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”. +13: Stray start tag “frame”. +21: Stray end tag “frame”. +29: Stray end tag “frame”. +39: “frameset” start tag after “body” already open. +105: End of file seen inside an [R]CDATA element. +105: End of file seen and there were open elements. +XXX: These errors are wrong, please fix me! +#document +| <html> +| <head> +| <frameset> +| <frame> +| <frameset> +| <frame> +| <noframes> +| "</frameset><noframes>" + +#data +<!DOCTYPE html><object></html> +#errors +1: Expected closing tag. Unexpected end of file +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <object> diff --git a/api/vendor/golang.org/x/net/html/testdata/webkit/tests16.dat b/api/vendor/golang.org/x/net/html/testdata/webkit/tests16.dat new file mode 100644 index 0000000..c8ef66f --- /dev/null +++ b/api/vendor/golang.org/x/net/html/testdata/webkit/tests16.dat @@ -0,0 +1,2299 @@ +#data +<!doctype html><script> +#errors +Line: 1 Col: 23 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| <body> + +#data +<!doctype html><script>a +#errors +Line: 1 Col: 24 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "a" +| <body> + +#data +<!doctype html><script>< +#errors +Line: 1 Col: 24 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<" +| <body> + +#data +<!doctype html><script></ +#errors +Line: 1 Col: 25 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</" +| <body> + +#data +<!doctype html><script></S +#errors +Line: 1 Col: 26 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</S" +| <body> + +#data +<!doctype html><script></SC +#errors +Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</SC" +| <body> + +#data +<!doctype html><script></SCR +#errors +Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</SCR" +| <body> + +#data +<!doctype html><script></SCRI +#errors +Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</SCRI" +| <body> + +#data +<!doctype html><script></SCRIP +#errors +Line: 1 Col: 30 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</SCRIP" +| <body> + +#data +<!doctype html><script></SCRIPT +#errors +Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</SCRIPT" +| <body> + +#data +<!doctype html><script></SCRIPT +#errors +Line: 1 Col: 32 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| <body> + +#data +<!doctype html><script></s +#errors +Line: 1 Col: 26 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</s" +| <body> + +#data +<!doctype html><script></sc +#errors +Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</sc" +| <body> + +#data +<!doctype html><script></scr +#errors +Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</scr" +| <body> + +#data +<!doctype html><script></scri +#errors +Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</scri" +| <body> + +#data +<!doctype html><script></scrip +#errors +Line: 1 Col: 30 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</scrip" +| <body> + +#data +<!doctype html><script></script +#errors +Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</script" +| <body> + +#data +<!doctype html><script></script +#errors +Line: 1 Col: 32 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| <body> + +#data +<!doctype html><script><! +#errors +Line: 1 Col: 25 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!" +| <body> + +#data +<!doctype html><script><!a +#errors +Line: 1 Col: 26 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!a" +| <body> + +#data +<!doctype html><script><!- +#errors +Line: 1 Col: 26 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!-" +| <body> + +#data +<!doctype html><script><!-a +#errors +Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!-a" +| <body> + +#data +<!doctype html><script><!-- +#errors +Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--" +| <body> + +#data +<!doctype html><script><!--a +#errors +Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--a" +| <body> + +#data +<!doctype html><script><!--< +#errors +Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<" +| <body> + +#data +<!doctype html><script><!--<a +#errors +Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<a" +| <body> + +#data +<!doctype html><script><!--</ +#errors +Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--</" +| <body> + +#data +<!doctype html><script><!--</script +#errors +Line: 1 Col: 35 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--</script" +| <body> + +#data +<!doctype html><script><!--</script +#errors +Line: 1 Col: 36 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--" +| <body> + +#data +<!doctype html><script><!--<s +#errors +Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<s" +| <body> + +#data +<!doctype html><script><!--<script +#errors +Line: 1 Col: 34 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script" +| <body> + +#data +<!doctype html><script><!--<script +#errors +Line: 1 Col: 35 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script " +| <body> + +#data +<!doctype html><script><!--<script < +#errors +Line: 1 Col: 36 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script <" +| <body> + +#data +<!doctype html><script><!--<script <a +#errors +Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script <a" +| <body> + +#data +<!doctype html><script><!--<script </ +#errors +Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </" +| <body> + +#data +<!doctype html><script><!--<script </s +#errors +Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </s" +| <body> + +#data +<!doctype html><script><!--<script </script +#errors +Line: 1 Col: 43 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script" +| <body> + +#data +<!doctype html><script><!--<script </scripta +#errors +Line: 1 Col: 44 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </scripta" +| <body> + +#data +<!doctype html><script><!--<script </script +#errors +Line: 1 Col: 44 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<!doctype html><script><!--<script </script> +#errors +Line: 1 Col: 44 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script>" +| <body> + +#data +<!doctype html><script><!--<script </script/ +#errors +Line: 1 Col: 44 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script/" +| <body> + +#data +<!doctype html><script><!--<script </script < +#errors +Line: 1 Col: 45 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script <" +| <body> + +#data +<!doctype html><script><!--<script </script <a +#errors +Line: 1 Col: 46 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script <a" +| <body> + +#data +<!doctype html><script><!--<script </script </ +#errors +Line: 1 Col: 46 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script </" +| <body> + +#data +<!doctype html><script><!--<script </script </script +#errors +Line: 1 Col: 52 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script </script" +| <body> + +#data +<!doctype html><script><!--<script </script </script +#errors +Line: 1 Col: 53 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<!doctype html><script><!--<script </script </script/ +#errors +Line: 1 Col: 53 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<!doctype html><script><!--<script </script </script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<!doctype html><script><!--<script - +#errors +Line: 1 Col: 36 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script -" +| <body> + +#data +<!doctype html><script><!--<script -a +#errors +Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script -a" +| <body> + +#data +<!doctype html><script><!--<script -< +#errors +Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script -<" +| <body> + +#data +<!doctype html><script><!--<script -- +#errors +Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script --" +| <body> + +#data +<!doctype html><script><!--<script --a +#errors +Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script --a" +| <body> + +#data +<!doctype html><script><!--<script --< +#errors +Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script --<" +| <body> + +#data +<!doctype html><script><!--<script --> +#errors +Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<!doctype html><script><!--<script -->< +#errors +Line: 1 Col: 39 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script --><" +| <body> + +#data +<!doctype html><script><!--<script --></ +#errors +Line: 1 Col: 40 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script --></" +| <body> + +#data +<!doctype html><script><!--<script --></script +#errors +Line: 1 Col: 46 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script --></script" +| <body> + +#data +<!doctype html><script><!--<script --></script +#errors +Line: 1 Col: 47 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<!doctype html><script><!--<script --></script/ +#errors +Line: 1 Col: 47 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<!doctype html><script><!--<script --></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<!doctype html><script><!--<script><\/script>--></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script><\/script>-->" +| <body> + +#data +<!doctype html><script><!--<script></scr'+'ipt>--></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></scr'+'ipt>-->" +| <body> + +#data +<!doctype html><script><!--<script></script><script></script></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>" +| <body> + +#data +<!doctype html><script><!--<script></script><script></script>--><!--</script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>--><!--" +| <body> + +#data +<!doctype html><script><!--<script></script><script></script>-- ></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>-- >" +| <body> + +#data +<!doctype html><script><!--<script></script><script></script>- -></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>- ->" +| <body> + +#data +<!doctype html><script><!--<script></script><script></script>- - ></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>- - >" +| <body> + +#data +<!doctype html><script><!--<script></script><script></script>-></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>->" +| <body> + +#data +<!doctype html><script><!--<script>--!></script>X +#errors +Line: 1 Col: 49 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script>--!></script>X" +| <body> + +#data +<!doctype html><script><!--<scr'+'ipt></script>--></script> +#errors +Line: 1 Col: 59 Unexpected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<scr'+'ipt>" +| <body> +| "-->" + +#data +<!doctype html><script><!--<script></scr'+'ipt></script>X +#errors +Line: 1 Col: 57 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></scr'+'ipt></script>X" +| <body> + +#data +<!doctype html><style><!--<style></style>--></style> +#errors +Line: 1 Col: 52 Unexpected end tag (style). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "<!--<style>" +| <body> +| "-->" + +#data +<!doctype html><style><!--</style>X +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "<!--" +| <body> +| "X" + +#data +<!doctype html><style><!--...</style>...--></style> +#errors +Line: 1 Col: 51 Unexpected end tag (style). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "<!--..." +| <body> +| "...-->" + +#data +<!doctype html><style><!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style></style>X +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "<!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style>" +| <body> +| "X" + +#data +<!doctype html><style><!--...<style><!--...--!></style>--></style> +#errors +Line: 1 Col: 66 Unexpected end tag (style). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "<!--...<style><!--...--!>" +| <body> +| "-->" + +#data +<!doctype html><style><!--...</style><!-- --><style>@import ...</style> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "<!--..." +| <!-- --> +| <style> +| "@import ..." +| <body> + +#data +<!doctype html><style>...<style><!--...</style><!-- --></style> +#errors +Line: 1 Col: 63 Unexpected end tag (style). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "...<style><!--..." +| <!-- --> +| <body> + +#data +<!doctype html><style>...<!--[if IE]><style>...</style>X +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "...<!--[if IE]><style>..." +| <body> +| "X" + +#data +<!doctype html><title><!--<title>--> +#errors +Line: 1 Col: 52 Unexpected end tag (title). +#document +| +| +| +| +| "<!--<title>" +| <body> +| "-->" + +#data +<!doctype html><title></title> +#errors +#document +| +| +| +| +| "" +| + +#data +foo/title><link></head><body>X +#errors +Line: 1 Col: 52 Unexpected end of file. Expected end tag (title). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <title> +| "foo/title><link></head><body>X" +| <body> + +#data +<!doctype html><noscript><!--<noscript></noscript>--></noscript> +#errors +Line: 1 Col: 64 Unexpected end tag (noscript). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <noscript> +| "<!--<noscript>" +| <body> +| "-->" + +#data +<!doctype html><noscript><!--</noscript>X<noscript>--></noscript> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <noscript> +| "<!--" +| <body> +| "X" +| <noscript> +| "-->" + +#data +<!doctype html><noscript><iframe></noscript>X +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <noscript> +| "<iframe>" +| <body> +| "X" + +#data +<!doctype html><noframes><!--<noframes></noframes>--></noframes> +#errors +Line: 1 Col: 64 Unexpected end tag (noframes). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <noframes> +| "<!--<noframes>" +| <body> +| "-->" + +#data +<!doctype html><noframes><body><script><!--...</script></body></noframes></html> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <noframes> +| "<body><script><!--...</script></body>" +| <body> + +#data +<!doctype html><textarea><!--<textarea></textarea>--></textarea> +#errors +Line: 1 Col: 64 Unexpected end tag (textarea). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <textarea> +| "<!--<textarea>" +| "-->" + +#data +<!doctype html><textarea></textarea></textarea> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <textarea> +| "</textarea>" + +#data +<!doctype html><textarea><</textarea> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <textarea> +| "<" + +#data +<!doctype html><textarea>a<b</textarea> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <textarea> +| "a<b" + +#data +<!doctype html><iframe><!--<iframe></iframe>--></iframe> +#errors +Line: 1 Col: 56 Unexpected end tag (iframe). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <iframe> +| "<!--<iframe>" +| "-->" + +#data +<!doctype html><iframe>...<!--X->...<!--/X->...</iframe> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <iframe> +| "...<!--X->...<!--/X->..." + +#data +<!doctype html><xmp><!--<xmp></xmp>--></xmp> +#errors +Line: 1 Col: 44 Unexpected end tag (xmp). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <xmp> +| "<!--<xmp>" +| "-->" + +#data +<!doctype html><noembed><!--<noembed></noembed>--></noembed> +#errors +Line: 1 Col: 60 Unexpected end tag (noembed). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <noembed> +| "<!--<noembed>" +| "-->" + +#data +<script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 8 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| <body> + +#data +<script>a +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 9 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "a" +| <body> + +#data +<script>< +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 9 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<" +| <body> + +#data +<script></ +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 10 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</" +| <body> + +#data +<script></S +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</S" +| <body> + +#data +<script></SC +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 12 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</SC" +| <body> + +#data +<script></SCR +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 13 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</SCR" +| <body> + +#data +<script></SCRI +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</SCRI" +| <body> + +#data +<script></SCRIP +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 15 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</SCRIP" +| <body> + +#data +<script></SCRIPT +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 16 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</SCRIPT" +| <body> + +#data +<script></SCRIPT +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 17 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| <body> + +#data +<script></s +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</s" +| <body> + +#data +<script></sc +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 12 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</sc" +| <body> + +#data +<script></scr +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 13 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</scr" +| <body> + +#data +<script></scri +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</scri" +| <body> + +#data +<script></scrip +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 15 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</scrip" +| <body> + +#data +<script></script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 16 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</script" +| <body> + +#data +<script></script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 17 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| <body> + +#data +<script><! +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 10 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!" +| <body> + +#data +<script><!a +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!a" +| <body> + +#data +<script><!- +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!-" +| <body> + +#data +<script><!-a +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 12 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!-a" +| <body> + +#data +<script><!-- +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 12 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--" +| <body> + +#data +<script><!--a +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 13 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--a" +| <body> + +#data +<script><!--< +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 13 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<" +| <body> + +#data +<script><!--<a +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<a" +| <body> + +#data +<script><!--</ +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--</" +| <body> + +#data +<script><!--</script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 20 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--</script" +| <body> + +#data +<script><!--</script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 21 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--" +| <body> + +#data +<script><!--<s +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<s" +| <body> + +#data +<script><!--<script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 19 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script" +| <body> + +#data +<script><!--<script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 20 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script " +| <body> + +#data +<script><!--<script < +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 21 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script <" +| <body> + +#data +<script><!--<script <a +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 22 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script <a" +| <body> + +#data +<script><!--<script </ +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 22 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </" +| <body> + +#data +<script><!--<script </s +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 23 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </s" +| <body> + +#data +<script><!--<script </script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script" +| <body> + +#data +<script><!--<script </scripta +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </scripta" +| <body> + +#data +<script><!--<script </script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<script><!--<script </script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script>" +| <body> + +#data +<script><!--<script </script/ +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script/" +| <body> + +#data +<script><!--<script </script < +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 30 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script <" +| <body> + +#data +<script><!--<script </script <a +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script <a" +| <body> + +#data +<script><!--<script </script </ +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script </" +| <body> + +#data +<script><!--<script </script </script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script </script" +| <body> + +#data +<script><!--<script </script </script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<script><!--<script </script </script/ +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<script><!--<script </script </script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<script><!--<script - +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 21 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script -" +| <body> + +#data +<script><!--<script -a +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 22 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script -a" +| <body> + +#data +<script><!--<script -- +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 22 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script --" +| <body> + +#data +<script><!--<script --a +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 23 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script --a" +| <body> + +#data +<script><!--<script --> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 23 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<script><!--<script -->< +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 24 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script --><" +| <body> + +#data +<script><!--<script --></ +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 25 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script --></" +| <body> + +#data +<script><!--<script --></script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script --></script" +| <body> + +#data +<script><!--<script --></script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 32 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<script><!--<script --></script/ +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 32 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<script><!--<script --></script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<script><!--<script><\/script>--></script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script><\/script>-->" +| <body> + +#data +<script><!--<script></scr'+'ipt>--></script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script></scr'+'ipt>-->" +| <body> + +#data +<script><!--<script></script><script></script></script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>" +| <body> + +#data +<script><!--<script></script><script></script>--><!--</script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>--><!--" +| <body> + +#data +<script><!--<script></script><script></script>-- ></script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>-- >" +| <body> + +#data +<script><!--<script></script><script></script>- -></script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>- ->" +| <body> + +#data +<script><!--<script></script><script></script>- - ></script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>- - >" +| <body> + +#data +<script><!--<script></script><script></script>-></script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>->" +| <body> + +#data +<script><!--<script>--!></script>X +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 34 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script>--!></script>X" +| <body> + +#data +<script><!--<scr'+'ipt></script>--></script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 44 Unexpected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<scr'+'ipt>" +| <body> +| "-->" + +#data +<script><!--<script></scr'+'ipt></script>X +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 42 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script></scr'+'ipt></script>X" +| <body> + +#data +<style><!--<style></style>--></style> +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +Line: 1 Col: 37 Unexpected end tag (style). +#document +| <html> +| <head> +| <style> +| "<!--<style>" +| <body> +| "-->" + +#data +<style><!--</style>X +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +#document +| <html> +| <head> +| <style> +| "<!--" +| <body> +| "X" + +#data +<style><!--...</style>...--></style> +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +Line: 1 Col: 36 Unexpected end tag (style). +#document +| <html> +| <head> +| <style> +| "<!--..." +| <body> +| "...-->" + +#data +<style><!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style></style>X +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +#document +| <html> +| <head> +| <style> +| "<!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style>" +| <body> +| "X" + +#data +<style><!--...<style><!--...--!></style>--></style> +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +Line: 1 Col: 51 Unexpected end tag (style). +#document +| <html> +| <head> +| <style> +| "<!--...<style><!--...--!>" +| <body> +| "-->" + +#data +<style><!--...</style><!-- --><style>@import ...</style> +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +#document +| <html> +| <head> +| <style> +| "<!--..." +| <!-- --> +| <style> +| "@import ..." +| <body> + +#data +<style>...<style><!--...</style><!-- --></style> +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +Line: 1 Col: 48 Unexpected end tag (style). +#document +| <html> +| <head> +| <style> +| "...<style><!--..." +| <!-- --> +| <body> + +#data +<style>...<!--[if IE]><style>...</style>X +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +#document +| <html> +| <head> +| <style> +| "...<!--[if IE]><style>..." +| <body> +| "X" + +#data +<title><!--<title>--> +#errors +Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. +Line: 1 Col: 37 Unexpected end tag (title). +#document +| +| +| +| "<!--<title>" +| <body> +| "-->" + +#data +<title></title> +#errors +Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. +#document +| +| +| +| "" +| + +#data +foo/title><link></head><body>X +#errors +Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. +Line: 1 Col: 37 Unexpected end of file. Expected end tag (title). +#document +| <html> +| <head> +| <title> +| "foo/title><link></head><body>X" +| <body> + +#data +<noscript><!--<noscript></noscript>--></noscript> +#errors +Line: 1 Col: 10 Unexpected start tag (noscript). Expected DOCTYPE. +Line: 1 Col: 49 Unexpected end tag (noscript). +#document +| <html> +| <head> +| <noscript> +| "<!--<noscript>" +| <body> +| "-->" + +#data +<noscript><!--</noscript>X<noscript>--></noscript> +#errors +Line: 1 Col: 10 Unexpected start tag (noscript). Expected DOCTYPE. +#document +| <html> +| <head> +| <noscript> +| "<!--" +| <body> +| "X" +| <noscript> +| "-->" + +#data +<noscript><iframe></noscript>X +#errors +Line: 1 Col: 10 Unexpected start tag (noscript). Expected DOCTYPE. +#document +| <html> +| <head> +| <noscript> +| "<iframe>" +| <body> +| "X" + +#data +<noframes><!--<noframes></noframes>--></noframes> +#errors +Line: 1 Col: 10 Unexpected start tag (noframes). Expected DOCTYPE. +Line: 1 Col: 49 Unexpected end tag (noframes). +#document +| <html> +| <head> +| <noframes> +| "<!--<noframes>" +| <body> +| "-->" + +#data +<noframes><body><script><!--...</script></body></noframes></html> +#errors +Line: 1 Col: 10 Unexpected start tag (noframes). Expected DOCTYPE. +#document +| <html> +| <head> +| <noframes> +| "<body><script><!--...</script></body>" +| <body> + +#data +<textarea><!--<textarea></textarea>--></textarea> +#errors +Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. +Line: 1 Col: 49 Unexpected end tag (textarea). +#document +| <html> +| <head> +| <body> +| <textarea> +| "<!--<textarea>" +| "-->" + +#data +<textarea></textarea></textarea> +#errors +Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| <textarea> +| "</textarea>" + +#data +<iframe><!--<iframe></iframe>--></iframe> +#errors +Line: 1 Col: 8 Unexpected start tag (iframe). Expected DOCTYPE. +Line: 1 Col: 41 Unexpected end tag (iframe). +#document +| <html> +| <head> +| <body> +| <iframe> +| "<!--<iframe>" +| "-->" + +#data +<iframe>...<!--X->...<!--/X->...</iframe> +#errors +Line: 1 Col: 8 Unexpected start tag (iframe). Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| <iframe> +| "...<!--X->...<!--/X->..." + +#data +<xmp><!--<xmp></xmp>--></xmp> +#errors +Line: 1 Col: 5 Unexpected start tag (xmp). Expected DOCTYPE. +Line: 1 Col: 29 Unexpected end tag (xmp). +#document +| <html> +| <head> +| <body> +| <xmp> +| "<!--<xmp>" +| "-->" + +#data +<noembed><!--<noembed></noembed>--></noembed> +#errors +Line: 1 Col: 9 Unexpected start tag (noembed). Expected DOCTYPE. +Line: 1 Col: 45 Unexpected end tag (noembed). +#document +| <html> +| <head> +| <body> +| <noembed> +| "<!--<noembed>" +| "-->" + +#data +<!doctype html><table> + +#errors +Line 2 Col 0 Unexpected end of file. Expected table content. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| " +" + +#data +<!doctype html><table><td><span><font></span><span> +#errors +Line 1 Col 26 Unexpected table cell start tag (td) in the table body phase. +Line 1 Col 45 Unexpected end tag (span). +Line 1 Col 51 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <span> +| <font> +| <font> +| <span> + +#data +<!doctype html><form><table></form><form></table></form> +#errors +35: Stray end tag “form”. +41: Start tag “form” seen in “table”. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <form> +| <table> +| <form> diff --git a/api/vendor/golang.org/x/net/html/testdata/webkit/tests17.dat b/api/vendor/golang.org/x/net/html/testdata/webkit/tests17.dat new file mode 100644 index 0000000..7b555f8 --- /dev/null +++ b/api/vendor/golang.org/x/net/html/testdata/webkit/tests17.dat @@ -0,0 +1,153 @@ +#data +<!doctype html><table><tbody><select><tr> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <table> +| <tbody> +| <tr> + +#data +<!doctype html><table><tr><select><td> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <table> +| <tbody> +| <tr> +| <td> + +#data +<!doctype html><table><tr><td><select><td> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <select> +| <td> + +#data +<!doctype html><table><tr><th><select><td> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <th> +| <select> +| <td> + +#data +<!doctype html><table><caption><select><tr> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <caption> +| <select> +| <tbody> +| <tr> + +#data +<!doctype html><select><tr> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><select><td> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><select><th> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><select><tbody> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><select><thead> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><select><tfoot> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><select><caption> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><table><tr></table>a +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| "a" diff --git a/api/vendor/golang.org/x/net/html/testdata/webkit/tests18.dat b/api/vendor/golang.org/x/net/html/testdata/webkit/tests18.dat new file mode 100644 index 0000000..680e1f0 --- /dev/null +++ b/api/vendor/golang.org/x/net/html/testdata/webkit/tests18.dat @@ -0,0 +1,269 @@ +#data +<!doctype html><plaintext></plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <plaintext> +| "</plaintext>" + +#data +<!doctype html><table><plaintext></plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <plaintext> +| "</plaintext>" +| <table> + +#data +<!doctype html><table><tbody><plaintext></plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <plaintext> +| "</plaintext>" +| <table> +| <tbody> + +#data +<!doctype html><table><tbody><tr><plaintext></plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <plaintext> +| "</plaintext>" +| <table> +| <tbody> +| <tr> + +#data +<!doctype html><table><tbody><tr><plaintext></plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <plaintext> +| "</plaintext>" +| <table> +| <tbody> +| <tr> + +#data +<!doctype html><table><td><plaintext></plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <plaintext> +| "</plaintext>" + +#data +<!doctype html><table><caption><plaintext></plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <caption> +| <plaintext> +| "</plaintext>" + +#data +<!doctype html><table><tr><style></script></style>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "abc" +| <table> +| <tbody> +| <tr> +| <style> +| "</script>" + +#data +<!doctype html><table><tr><script></style></script>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "abc" +| <table> +| <tbody> +| <tr> +| <script> +| "</style>" + +#data +<!doctype html><table><caption><style></script></style>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <caption> +| <style> +| "</script>" +| "abc" + +#data +<!doctype html><table><td><style></script></style>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <style> +| "</script>" +| "abc" + +#data +<!doctype html><select><script></style></script>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <script> +| "</style>" +| "abc" + +#data +<!doctype html><table><select><script></style></script>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <script> +| "</style>" +| "abc" +| <table> + +#data +<!doctype html><table><tr><select><script></style></script>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <script> +| "</style>" +| "abc" +| <table> +| <tbody> +| <tr> + +#data +<!doctype html><frameset></frameset><noframes>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <noframes> +| "abc" + +#data +<!doctype html><frameset></frameset><noframes>abc</noframes><!--abc--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <noframes> +| "abc" +| <!-- abc --> + +#data +<!doctype html><frameset></frameset></html><noframes>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <noframes> +| "abc" + +#data +<!doctype html><frameset></frameset></html><noframes>abc</noframes><!--abc--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <noframes> +| "abc" +| <!-- abc --> + +#data +<!doctype html><table><tr></tbody><tfoot> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <tfoot> + +#data +<!doctype html><table><td><svg></svg>abc<td> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <svg svg> +| "abc" +| <td> diff --git a/api/vendor/golang.org/x/net/html/testdata/webkit/tests19.dat b/api/vendor/golang.org/x/net/html/testdata/webkit/tests19.dat new file mode 100644 index 0000000..0d62f5a --- /dev/null +++ b/api/vendor/golang.org/x/net/html/testdata/webkit/tests19.dat @@ -0,0 +1,1237 @@ +#data +<!doctype html><math><mn DefinitionUrl="foo"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <math math> +| <math mn> +| definitionURL="foo" + +#data +<!doctype html><html></p><!--foo--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <!-- foo --> +| <head> +| <body> + +#data +<!doctype html><head></head></p><!--foo--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <!-- foo --> +| <body> + +#data +<!doctype html><body><p><pre> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <pre> + +#data +<!doctype html><body><p><listing> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <listing> + +#data +<!doctype html><p><plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <plaintext> + +#data +<!doctype html><p><h1> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <h1> + +#data +<!doctype html><form><isindex> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <form> + +#data +<!doctype html><isindex action="POST"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <form> +| action="POST" +| <hr> +| <label> +| "This is a searchable index. Enter search keywords: " +| <input> +| name="isindex" +| <hr> + +#data +<!doctype html><isindex prompt="this is isindex"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <form> +| <hr> +| <label> +| "this is isindex" +| <input> +| name="isindex" +| <hr> + +#data +<!doctype html><isindex type="hidden"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <form> +| <hr> +| <label> +| "This is a searchable index. Enter search keywords: " +| <input> +| name="isindex" +| type="hidden" +| <hr> + +#data +<!doctype html><isindex name="foo"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <form> +| <hr> +| <label> +| "This is a searchable index. Enter search keywords: " +| <input> +| name="isindex" +| <hr> + +#data +<!doctype html><ruby><p><rp> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <ruby> +| <p> +| <rp> + +#data +<!doctype html><ruby><div><span><rp> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <ruby> +| <div> +| <span> +| <rp> + +#data +<!doctype html><ruby><div><p><rp> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <ruby> +| <div> +| <p> +| <rp> + +#data +<!doctype html><ruby><p><rt> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <ruby> +| <p> +| <rt> + +#data +<!doctype html><ruby><div><span><rt> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <ruby> +| <div> +| <span> +| <rt> + +#data +<!doctype html><ruby><div><p><rt> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <ruby> +| <div> +| <p> +| <rt> + +#data +<!doctype html><math/><foo> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <math math> +| <foo> + +#data +<!doctype html><svg/><foo> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <svg svg> +| <foo> + +#data +<!doctype html><div></body><!--foo--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <div> +| <!-- foo --> + +#data +<!doctype html><h1><div><h3><span></h1>foo +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <h1> +| <div> +| <h3> +| <span> +| "foo" + +#data +<!doctype html><p></h3>foo +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| "foo" + +#data +<!doctype html><h3><li>abc</h2>foo +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <h3> +| <li> +| "abc" +| "foo" + +#data +<!doctype html><table>abc<!--foo--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "abc" +| <table> +| <!-- foo --> + +#data +<!doctype html><table> <!--foo--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| " " +| <!-- foo --> + +#data +<!doctype html><table> b <!--foo--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| " b " +| <table> +| <!-- foo --> + +#data +<!doctype html><select><option><option> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <option> +| <option> + +#data +<!doctype html><select><option></optgroup> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <option> + +#data +<!doctype html><select><option></optgroup> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <option> + +#data +<!doctype html><p><math><mi><p><h1> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| <math mi> +| <p> +| <h1> + +#data +<!doctype html><p><math><mo><p><h1> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| <math mo> +| <p> +| <h1> + +#data +<!doctype html><p><math><mn><p><h1> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| <math mn> +| <p> +| <h1> + +#data +<!doctype html><p><math><ms><p><h1> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| <math ms> +| <p> +| <h1> + +#data +<!doctype html><p><math><mtext><p><h1> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| <math mtext> +| <p> +| <h1> + +#data +<!doctype html><frameset></noframes> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!doctype html><html c=d><body></html><html a=b> +#errors +#document +| <!DOCTYPE html> +| <html> +| a="b" +| c="d" +| <head> +| <body> + +#data +<!doctype html><html c=d><frameset></frameset></html><html a=b> +#errors +#document +| <!DOCTYPE html> +| <html> +| a="b" +| c="d" +| <head> +| <frameset> + +#data +<!doctype html><html><frameset></frameset></html><!--foo--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <!-- foo --> + +#data +<!doctype html><html><frameset></frameset></html> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| " " + +#data +<!doctype html><html><frameset></frameset></html>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!doctype html><html><frameset></frameset></html><p> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!doctype html><html><frameset></frameset></html></p> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<html><frameset></frameset></html><!doctype html> +#errors +#document +| <html> +| <head> +| <frameset> + +#data +<!doctype html><body><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> + +#data +<!doctype html><p><frameset><frame> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <frame> + +#data +<!doctype html><p>a<frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| "a" + +#data +<!doctype html><p> <frameset><frame> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <frame> + +#data +<!doctype html><pre><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <pre> + +#data +<!doctype html><listing><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <listing> + +#data +<!doctype html><li><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <li> + +#data +<!doctype html><dd><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <dd> + +#data +<!doctype html><dt><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <dt> + +#data +<!doctype html><button><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <button> + +#data +<!doctype html><applet><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <applet> + +#data +<!doctype html><marquee><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <marquee> + +#data +<!doctype html><object><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <object> + +#data +<!doctype html><table><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> + +#data +<!doctype html><area><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <area> + +#data +<!doctype html><basefont><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <basefont> +| <frameset> + +#data +<!doctype html><bgsound><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <bgsound> +| <frameset> + +#data +<!doctype html><br><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <br> + +#data +<!doctype html><embed><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <embed> + +#data +<!doctype html><img><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <img> + +#data +<!doctype html><input><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <input> + +#data +<!doctype html><keygen><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <keygen> + +#data +<!doctype html><wbr><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <wbr> + +#data +<!doctype html><hr><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <hr> + +#data +<!doctype html><textarea></textarea><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <textarea> + +#data +<!doctype html><xmp></xmp><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <xmp> + +#data +<!doctype html><iframe></iframe><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <iframe> + +#data +<!doctype html><select></select><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><svg></svg><frameset><frame> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <frame> + +#data +<!doctype html><math></math><frameset><frame> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <frame> + +#data +<!doctype html><svg><foreignObject><div> <frameset><frame> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <frame> + +#data +<!doctype html><svg>a</svg><frameset><frame> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <svg svg> +| "a" + +#data +<!doctype html><svg> </svg><frameset><frame> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <frame> + +#data +<html>aaa<frameset></frameset> +#errors +#document +| <html> +| <head> +| <body> +| "aaa" + +#data +<html> a <frameset></frameset> +#errors +#document +| <html> +| <head> +| <body> +| "a " + +#data +<!doctype html><div><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!doctype html><div><body><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <div> + +#data +<!doctype html><p><math></p>a +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| "a" + +#data +<!doctype html><p><math><mn><span></p>a +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| <math mn> +| <span> +| <p> +| "a" + +#data +<!doctype html><math></html> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <math math> + +#data +<!doctype html><meta charset="ascii"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <meta> +| charset="ascii" +| <body> + +#data +<!doctype html><meta http-equiv="content-type" content="text/html;charset=ascii"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <meta> +| content="text/html;charset=ascii" +| http-equiv="content-type" +| <body> + +#data +<!doctype html><head><!--aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa--><meta charset="utf8"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <!-- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa --> +| <meta> +| charset="utf8" +| <body> + +#data +<!doctype html><html a=b><head></head><html c=d> +#errors +#document +| <!DOCTYPE html> +| <html> +| a="b" +| c="d" +| <head> +| <body> + +#data +<!doctype html><image/> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <img> + +#data +<!doctype html>a<i>b<table>c<b>d</i>e</b>f +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "a" +| <i> +| "bc" +| <b> +| "de" +| "f" +| <table> + +#data +<!doctype html><table><i>a<b>b<div>c<a>d</i>e</b>f +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <i> +| "a" +| <b> +| "b" +| <b> +| <div> +| <b> +| <i> +| "c" +| <a> +| "d" +| <a> +| "e" +| <a> +| "f" +| <table> + +#data +<!doctype html><i>a<b>b<div>c<a>d</i>e</b>f +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <i> +| "a" +| <b> +| "b" +| <b> +| <div> +| <b> +| <i> +| "c" +| <a> +| "d" +| <a> +| "e" +| <a> +| "f" + +#data +<!doctype html><table><i>a<b>b<div>c</i> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <i> +| "a" +| <b> +| "b" +| <b> +| <div> +| <i> +| "c" +| <table> + +#data +<!doctype html><table><i>a<b>b<div>c<a>d</i>e</b>f +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <i> +| "a" +| <b> +| "b" +| <b> +| <div> +| <b> +| <i> +| "c" +| <a> +| "d" +| <a> +| "e" +| <a> +| "f" +| <table> + +#data +<!doctype html><table><i>a<div>b<tr>c<b>d</i>e +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <i> +| "a" +| <div> +| "b" +| <i> +| "c" +| <b> +| "d" +| <b> +| "e" +| <table> +| <tbody> +| <tr> + +#data +<!doctype html><table><td><table><i>a<div>b<b>c</i>d +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <i> +| "a" +| <div> +| <i> +| "b" +| <b> +| "c" +| <b> +| "d" +| <table> + +#data +<!doctype html><body><bgsound> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <bgsound> + +#data +<!doctype html><body><basefont> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <basefont> + +#data +<!doctype html><a><b></a><basefont> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <a> +| <b> +| <basefont> + +#data +<!doctype html><a><b></a><bgsound> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <a> +| <b> +| <bgsound> + +#data +<!doctype html><figcaption><article></figcaption>a +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <figcaption> +| <article> +| "a" + +#data +<!doctype html><summary><article></summary>a +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <summary> +| <article> +| "a" + +#data +<!doctype html><p><a><plaintext>b +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <a> +| <plaintext> +| <a> +| "b" + +#data +<!DOCTYPE html><div>a<a></div>b<p>c</p>d +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <div> +| "a" +| <a> +| <a> +| "b" +| <p> +| "c" +| "d" diff --git a/api/vendor/golang.org/x/net/html/testdata/webkit/tests2.dat b/api/vendor/golang.org/x/net/html/testdata/webkit/tests2.dat new file mode 100644 index 0000000..60d8592 --- /dev/null +++ b/api/vendor/golang.org/x/net/html/testdata/webkit/tests2.dat @@ -0,0 +1,763 @@ +#data +<!DOCTYPE html>Test +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "Test" + +#data +<textarea>test</div>test +#errors +Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. +Line: 1 Col: 24 Expected closing tag. Unexpected end of file. +#document +| <html> +| <head> +| <body> +| <textarea> +| "test</div>test" + +#data +<table><td> +#errors +Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. +Line: 1 Col: 11 Unexpected table cell start tag (td) in the table body phase. +Line: 1 Col: 11 Expected closing tag. Unexpected end of file. +#document +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> + +#data +<table><td>test</tbody></table> +#errors +Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. +Line: 1 Col: 11 Unexpected table cell start tag (td) in the table body phase. +#document +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| "test" + +#data +<frame>test +#errors +Line: 1 Col: 7 Unexpected start tag (frame). Expected DOCTYPE. +Line: 1 Col: 7 Unexpected start tag frame. Ignored. +#document +| <html> +| <head> +| <body> +| "test" + +#data +<!DOCTYPE html><frameset>test +#errors +Line: 1 Col: 29 Unepxected characters in the frameset phase. Characters ignored. +Line: 1 Col: 29 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!DOCTYPE html><frameset><!DOCTYPE html> +#errors +Line: 1 Col: 40 Unexpected DOCTYPE. Ignored. +Line: 1 Col: 40 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!DOCTYPE html><font><p><b>test</font> +#errors +Line: 1 Col: 38 End tag (font) violates step 1, paragraph 3 of the adoption agency algorithm. +Line: 1 Col: 38 End tag (font) violates step 1, paragraph 3 of the adoption agency algorithm. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <font> +| <p> +| <font> +| <b> +| "test" + +#data +<!DOCTYPE html><dt><div><dd> +#errors +Line: 1 Col: 28 Missing end tag (div, dt). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <dt> +| <div> +| <dd> + +#data +<script></x +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</x" +| <body> + +#data +<table><plaintext><td> +#errors +Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. +Line: 1 Col: 18 Unexpected start tag (plaintext) in table context caused voodoo mode. +Line: 1 Col: 22 Unexpected end of file. Expected table content. +#document +| <html> +| <head> +| <body> +| <plaintext> +| "<td>" +| <table> + +#data +<plaintext></plaintext> +#errors +Line: 1 Col: 11 Unexpected start tag (plaintext). Expected DOCTYPE. +Line: 1 Col: 23 Expected closing tag. Unexpected end of file. +#document +| <html> +| <head> +| <body> +| <plaintext> +| "</plaintext>" + +#data +<!DOCTYPE html><table><tr>TEST +#errors +Line: 1 Col: 30 Unexpected non-space characters in table context caused voodoo mode. +Line: 1 Col: 30 Unexpected end of file. Expected table content. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "TEST" +| <table> +| <tbody> +| <tr> + +#data +<!DOCTYPE html><body t1=1><body t2=2><body t3=3 t4=4> +#errors +Line: 1 Col: 37 Unexpected start tag (body). +Line: 1 Col: 53 Unexpected start tag (body). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| t1="1" +| t2="2" +| t3="3" +| t4="4" + +#data +</b test +#errors +Line: 1 Col: 8 Unexpected end of file in attribute name. +Line: 1 Col: 8 End tag contains unexpected attributes. +Line: 1 Col: 8 Unexpected end tag (b). Expected DOCTYPE. +Line: 1 Col: 8 Unexpected end tag (b) after the (implied) root element. +#document +| <html> +| <head> +| <body> + +#data +<!DOCTYPE html></b test<b &=&>X +#errors +Line: 1 Col: 32 Named entity didn't end with ';'. +Line: 1 Col: 33 End tag contains unexpected attributes. +Line: 1 Col: 33 Unexpected end tag (b) after the (implied) root element. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "X" + +#data +<!doctypehtml><scrIPt type=text/x-foobar;baz>X</SCRipt +#errors +Line: 1 Col: 9 No space after literal string 'DOCTYPE'. +Line: 1 Col: 54 Unexpected end of file in the tag name. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| type="text/x-foobar;baz" +| "X</SCRipt" +| <body> + +#data +& +#errors +Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "&" + +#data +&# +#errors +Line: 1 Col: 1 Numeric entity expected. Got end of file instead. +Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "&#" + +#data +&#X +#errors +Line: 1 Col: 3 Numeric entity expected but none found. +Line: 1 Col: 3 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "&#X" + +#data +&#x +#errors +Line: 1 Col: 3 Numeric entity expected but none found. +Line: 1 Col: 3 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "&#x" + +#data +- +#errors +Line: 1 Col: 4 Numeric entity didn't end with ';'. +Line: 1 Col: 4 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "-" + +#data +&x-test +#errors +Line: 1 Col: 1 Named entity expected. Got none. +Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "&x-test" + +#data +<!doctypehtml><p><li> +#errors +Line: 1 Col: 9 No space after literal string 'DOCTYPE'. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <li> + +#data +<!doctypehtml><p><dt> +#errors +Line: 1 Col: 9 No space after literal string 'DOCTYPE'. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <dt> + +#data +<!doctypehtml><p><dd> +#errors +Line: 1 Col: 9 No space after literal string 'DOCTYPE'. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <dd> + +#data +<!doctypehtml><p><form> +#errors +Line: 1 Col: 9 No space after literal string 'DOCTYPE'. +Line: 1 Col: 23 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <form> + +#data +<!DOCTYPE html><p></P>X +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| "X" + +#data +& +#errors +Line: 1 Col: 4 Named entity didn't end with ';'. +Line: 1 Col: 4 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "&" + +#data +&AMp; +#errors +Line: 1 Col: 1 Named entity expected. Got none. +Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "&AMp;" + +#data +<!DOCTYPE html><html><head></head><body><thisISasillyTESTelementNameToMakeSureCrazyTagNamesArePARSEDcorrectLY> +#errors +Line: 1 Col: 110 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <thisisasillytestelementnametomakesurecrazytagnamesareparsedcorrectly> + +#data +<!DOCTYPE html>X</body>X +#errors +Line: 1 Col: 24 Unexpected non-space characters in the after body phase. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "XX" + +#data +<!DOCTYPE html><!-- X +#errors +Line: 1 Col: 21 Unexpected end of file in comment. +#document +| <!DOCTYPE html> +| <!-- X --> +| <html> +| <head> +| <body> + +#data +<!DOCTYPE html><table><caption>test TEST</caption><td>test +#errors +Line: 1 Col: 54 Unexpected table cell start tag (td) in the table body phase. +Line: 1 Col: 58 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <caption> +| "test TEST" +| <tbody> +| <tr> +| <td> +| "test" + +#data +<!DOCTYPE html><select><option><optgroup> +#errors +Line: 1 Col: 41 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <option> +| <optgroup> + +#data +<!DOCTYPE html><select><optgroup><option></optgroup><option><select><option> +#errors +Line: 1 Col: 68 Unexpected select start tag in the select phase treated as select end tag. +Line: 1 Col: 76 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <optgroup> +| <option> +| <option> +| <option> + +#data +<!DOCTYPE html><select><optgroup><option><optgroup> +#errors +Line: 1 Col: 51 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <optgroup> +| <option> +| <optgroup> + +#data +<!DOCTYPE html><datalist><option>foo</datalist>bar +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <datalist> +| <option> +| "foo" +| "bar" + +#data +<!DOCTYPE html><font><input><input></font> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <font> +| <input> +| <input> + +#data +<!DOCTYPE html><!-- XXX - XXX --> +#errors +#document +| <!DOCTYPE html> +| <!-- XXX - XXX --> +| <html> +| <head> +| <body> + +#data +<!DOCTYPE html><!-- XXX - XXX +#errors +Line: 1 Col: 29 Unexpected end of file in comment (-) +#document +| <!DOCTYPE html> +| <!-- XXX - XXX --> +| <html> +| <head> +| <body> + +#data +<!DOCTYPE html><!-- XXX - XXX - XXX --> +#errors +#document +| <!DOCTYPE html> +| <!-- XXX - XXX - XXX --> +| <html> +| <head> +| <body> + +#data +<isindex test=x name=x> +#errors +Line: 1 Col: 23 Unexpected start tag (isindex). Expected DOCTYPE. +Line: 1 Col: 23 Unexpected start tag isindex. Don't use it! +#document +| <html> +| <head> +| <body> +| <form> +| <hr> +| <label> +| "This is a searchable index. Enter search keywords: " +| <input> +| name="isindex" +| test="x" +| <hr> + +#data +test +test +#errors +Line: 2 Col: 4 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "test +test" + +#data +<!DOCTYPE html><body><title>test</body> +#errors +#document +| +| +| +| +| +| "test</body>" + +#data +<!DOCTYPE html><body><title>X +#errors +#document +| +| +| +| +| +| "X" +| <meta> +| name="z" +| <link> +| rel="foo" +| <style> +| " +x { content:"</style" } " + +#data +<!DOCTYPE html><select><optgroup></optgroup></select> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <optgroup> + +#data + + +#errors +Line: 2 Col: 1 Unexpected End of file. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> + +#data +<!DOCTYPE html> <html> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> + +#data +<!DOCTYPE html><script> +</script> <title>x +#errors +#document +| +| +| +| +#errors +Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. +Line: 1 Col: 21 Unexpected start tag (script) that can be in head. Moved. +#document +| +| +| +#errors +Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. +Line: 1 Col: 28 Unexpected start tag (style) that can be in head. Moved. +#document +| +| +| +#errors +Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. +#document +| +| +| +| +| "x" +| x +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +Line: 1 Col: 22 Unexpected end of file. Expected end tag (style). +#document +| +| +| --> x +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +#document +| +| +| x +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +#document +| +| +| x +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +#document +| +| +| x +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +#document +| +| +|

    +#errors +#document +| +| +| +| +| +| ddd +#errors +#document +| +| +| +#errors +#document +| +| +| +| +|
  • +| +| ", + " +
    << Back to Go HTTP/2 demo server`) + }) +} + +func httpsHost() string { + if *hostHTTPS != "" { + return *hostHTTPS + } + if v := *httpsAddr; strings.HasPrefix(v, ":") { + return "localhost" + v + } else { + return v + } +} + +func httpHost() string { + if *hostHTTP != "" { + return *hostHTTP + } + if v := *httpAddr; strings.HasPrefix(v, ":") { + return "localhost" + v + } else { + return v + } +} + +func serveProdTLS(autocertManager *autocert.Manager) error { + srv := &http.Server{ + TLSConfig: &tls.Config{ + GetCertificate: autocertManager.GetCertificate, + }, + } + http2.ConfigureServer(srv, &http2.Server{ + NewWriteScheduler: func() http2.WriteScheduler { + return http2.NewPriorityWriteScheduler(nil) + }, + }) + ln, err := net.Listen("tcp", ":443") + if err != nil { + return err + } + return srv.Serve(tls.NewListener(tcpKeepAliveListener{ln.(*net.TCPListener)}, srv.TLSConfig)) +} + +type tcpKeepAliveListener struct { + *net.TCPListener +} + +func (ln tcpKeepAliveListener) Accept() (c net.Conn, err error) { + tc, err := ln.AcceptTCP() + if err != nil { + return + } + tc.SetKeepAlive(true) + tc.SetKeepAlivePeriod(3 * time.Minute) + return tc, nil +} + +func serveProd() error { + log.Printf("running in production mode") + + storageClient, err := storage.NewClient(context.Background()) + if err != nil { + log.Fatalf("storage.NewClient: %v", err) + } + autocertManager := &autocert.Manager{ + Prompt: autocert.AcceptTOS, + HostPolicy: autocert.HostWhitelist("http2.golang.org"), + Cache: autocertcache.NewGoogleCloudStorageCache(storageClient, "golang-h2demo-autocert"), + } + + errc := make(chan error, 2) + go func() { errc <- http.ListenAndServe(":80", autocertManager.HTTPHandler(http.DefaultServeMux)) }() + go func() { errc <- serveProdTLS(autocertManager) }() + return <-errc +} + +const idleTimeout = 5 * time.Minute +const activeTimeout = 10 * time.Minute + +// TODO: put this into the standard library and actually send +// PING frames and GOAWAY, etc: golang.org/issue/14204 +func idleTimeoutHook() func(net.Conn, http.ConnState) { + var mu sync.Mutex + m := map[net.Conn]*time.Timer{} + return func(c net.Conn, cs http.ConnState) { + mu.Lock() + defer mu.Unlock() + if t, ok := m[c]; ok { + delete(m, c) + t.Stop() + } + var d time.Duration + switch cs { + case http.StateNew, http.StateIdle: + d = idleTimeout + case http.StateActive: + d = activeTimeout + default: + return + } + m[c] = time.AfterFunc(d, func() { + log.Printf("closing idle conn %v after %v", c.RemoteAddr(), d) + go c.Close() + }) + } +} + +func main() { + var srv http.Server + flag.BoolVar(&http2.VerboseLogs, "verbose", false, "Verbose HTTP/2 debugging.") + flag.Parse() + srv.Addr = *httpsAddr + srv.ConnState = idleTimeoutHook() + + registerHandlers() + + if *prod { + *hostHTTP = "http2.golang.org" + *hostHTTPS = "http2.golang.org" + log.Fatal(serveProd()) + } + + url := "https://" + httpsHost() + "/" + log.Printf("Listening on " + url) + http2.ConfigureServer(&srv, &http2.Server{}) + + if *httpAddr != "" { + go func() { + log.Printf("Listening on http://" + httpHost() + "/ (for unencrypted HTTP/1)") + log.Fatal(http.ListenAndServe(*httpAddr, nil)) + }() + } + + go func() { + log.Fatal(srv.ListenAndServeTLS("server.crt", "server.key")) + }() + select {} +} diff --git a/api/vendor/golang.org/x/net/http2/h2demo/launch.go b/api/vendor/golang.org/x/net/http2/h2demo/launch.go new file mode 100644 index 0000000..df0866a --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/h2demo/launch.go @@ -0,0 +1,302 @@ +// 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. + +// +build ignore + +package main + +import ( + "bufio" + "bytes" + "encoding/json" + "flag" + "fmt" + "io" + "io/ioutil" + "log" + "net/http" + "os" + "strings" + "time" + + "golang.org/x/oauth2" + "golang.org/x/oauth2/google" + compute "google.golang.org/api/compute/v1" +) + +var ( + proj = flag.String("project", "symbolic-datum-552", "name of Project") + zone = flag.String("zone", "us-central1-a", "GCE zone") + mach = flag.String("machinetype", "n1-standard-1", "Machine type") + instName = flag.String("instance_name", "http2-demo", "Name of VM instance.") + sshPub = flag.String("ssh_public_key", "", "ssh public key file to authorize. Can modify later in Google's web UI anyway.") + staticIP = flag.String("static_ip", "130.211.116.44", "Static IP to use. If empty, automatic.") + + writeObject = flag.String("write_object", "", "If non-empty, a VM isn't created and the flag value is Google Cloud Storage bucket/object to write. The contents from stdin.") + publicObject = flag.Bool("write_object_is_public", false, "Whether the object created by --write_object should be public.") +) + +func readFile(v string) string { + slurp, err := ioutil.ReadFile(v) + if err != nil { + log.Fatalf("Error reading %s: %v", v, err) + } + return strings.TrimSpace(string(slurp)) +} + +var config = &oauth2.Config{ + // The client-id and secret should be for an "Installed Application" when using + // the CLI. Later we'll use a web application with a callback. + ClientID: readFile("client-id.dat"), + ClientSecret: readFile("client-secret.dat"), + Endpoint: google.Endpoint, + Scopes: []string{ + compute.DevstorageFullControlScope, + compute.ComputeScope, + "https://www.googleapis.com/auth/sqlservice", + "https://www.googleapis.com/auth/sqlservice.admin", + }, + RedirectURL: "urn:ietf:wg:oauth:2.0:oob", +} + +const baseConfig = `#cloud-config +coreos: + units: + - name: h2demo.service + command: start + content: | + [Unit] + Description=HTTP2 Demo + + [Service] + ExecStartPre=/bin/bash -c 'mkdir -p /opt/bin && curl -s -o /opt/bin/h2demo http://storage.googleapis.com/http2-demo-server-tls/h2demo && chmod +x /opt/bin/h2demo' + ExecStart=/opt/bin/h2demo --prod + RestartSec=5s + Restart=always + Type=simple + + [Install] + WantedBy=multi-user.target +` + +func main() { + flag.Parse() + if *proj == "" { + log.Fatalf("Missing --project flag") + } + prefix := "https://www.googleapis.com/compute/v1/projects/" + *proj + machType := prefix + "/zones/" + *zone + "/machineTypes/" + *mach + + const tokenFileName = "token.dat" + tokenFile := tokenCacheFile(tokenFileName) + tokenSource := oauth2.ReuseTokenSource(nil, tokenFile) + token, err := tokenSource.Token() + if err != nil { + if *writeObject != "" { + log.Fatalf("Can't use --write_object without a valid token.dat file already cached.") + } + log.Printf("Error getting token from %s: %v", tokenFileName, err) + log.Printf("Get auth code from %v", config.AuthCodeURL("my-state")) + fmt.Print("\nEnter auth code: ") + sc := bufio.NewScanner(os.Stdin) + sc.Scan() + authCode := strings.TrimSpace(sc.Text()) + token, err = config.Exchange(oauth2.NoContext, authCode) + if err != nil { + log.Fatalf("Error exchanging auth code for a token: %v", err) + } + if err := tokenFile.WriteToken(token); err != nil { + log.Fatalf("Error writing to %s: %v", tokenFileName, err) + } + tokenSource = oauth2.ReuseTokenSource(token, nil) + } + + oauthClient := oauth2.NewClient(oauth2.NoContext, tokenSource) + + if *writeObject != "" { + writeCloudStorageObject(oauthClient) + return + } + + computeService, _ := compute.New(oauthClient) + + natIP := *staticIP + if natIP == "" { + // Try to find it by name. + aggAddrList, err := computeService.Addresses.AggregatedList(*proj).Do() + if err != nil { + log.Fatal(err) + } + // http://godoc.org/code.google.com/p/google-api-go-client/compute/v1#AddressAggregatedList + IPLoop: + for _, asl := range aggAddrList.Items { + for _, addr := range asl.Addresses { + if addr.Name == *instName+"-ip" && addr.Status == "RESERVED" { + natIP = addr.Address + break IPLoop + } + } + } + } + + cloudConfig := baseConfig + if *sshPub != "" { + key := strings.TrimSpace(readFile(*sshPub)) + cloudConfig += fmt.Sprintf("\nssh_authorized_keys:\n - %s\n", key) + } + if os.Getenv("USER") == "bradfitz" { + cloudConfig += fmt.Sprintf("\nssh_authorized_keys:\n - %s\n", "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAwks9dwWKlRC+73gRbvYtVg0vdCwDSuIlyt4z6xa/YU/jTDynM4R4W10hm2tPjy8iR1k8XhDv4/qdxe6m07NjG/By1tkmGpm1mGwho4Pr5kbAAy/Qg+NLCSdAYnnE00FQEcFOC15GFVMOW2AzDGKisReohwH9eIzHPzdYQNPRWXE= bradfitz@papag.bradfitz.com") + } + const maxCloudConfig = 32 << 10 // per compute API docs + if len(cloudConfig) > maxCloudConfig { + log.Fatalf("cloud config length of %d bytes is over %d byte limit", len(cloudConfig), maxCloudConfig) + } + + instance := &compute.Instance{ + Name: *instName, + Description: "Go Builder", + MachineType: machType, + Disks: []*compute.AttachedDisk{instanceDisk(computeService)}, + Tags: &compute.Tags{ + Items: []string{"http-server", "https-server"}, + }, + Metadata: &compute.Metadata{ + Items: []*compute.MetadataItems{ + { + Key: "user-data", + Value: &cloudConfig, + }, + }, + }, + NetworkInterfaces: []*compute.NetworkInterface{ + { + AccessConfigs: []*compute.AccessConfig{ + { + Type: "ONE_TO_ONE_NAT", + Name: "External NAT", + NatIP: natIP, + }, + }, + Network: prefix + "/global/networks/default", + }, + }, + ServiceAccounts: []*compute.ServiceAccount{ + { + Email: "default", + Scopes: []string{ + compute.DevstorageFullControlScope, + compute.ComputeScope, + }, + }, + }, + } + + log.Printf("Creating instance...") + op, err := computeService.Instances.Insert(*proj, *zone, instance).Do() + if err != nil { + log.Fatalf("Failed to create instance: %v", err) + } + opName := op.Name + log.Printf("Created. Waiting on operation %v", opName) +OpLoop: + for { + time.Sleep(2 * time.Second) + op, err := computeService.ZoneOperations.Get(*proj, *zone, opName).Do() + if err != nil { + log.Fatalf("Failed to get op %s: %v", opName, err) + } + switch op.Status { + case "PENDING", "RUNNING": + log.Printf("Waiting on operation %v", opName) + continue + case "DONE": + if op.Error != nil { + for _, operr := range op.Error.Errors { + log.Printf("Error: %+v", operr) + } + log.Fatalf("Failed to start.") + } + log.Printf("Success. %+v", op) + break OpLoop + default: + log.Fatalf("Unknown status %q: %+v", op.Status, op) + } + } + + inst, err := computeService.Instances.Get(*proj, *zone, *instName).Do() + if err != nil { + log.Fatalf("Error getting instance after creation: %v", err) + } + ij, _ := json.MarshalIndent(inst, "", " ") + log.Printf("Instance: %s", ij) +} + +func instanceDisk(svc *compute.Service) *compute.AttachedDisk { + const imageURL = "https://www.googleapis.com/compute/v1/projects/coreos-cloud/global/images/coreos-stable-444-5-0-v20141016" + diskName := *instName + "-disk" + + return &compute.AttachedDisk{ + AutoDelete: true, + Boot: true, + Type: "PERSISTENT", + InitializeParams: &compute.AttachedDiskInitializeParams{ + DiskName: diskName, + SourceImage: imageURL, + DiskSizeGb: 50, + }, + } +} + +func writeCloudStorageObject(httpClient *http.Client) { + content := os.Stdin + const maxSlurp = 1 << 20 + var buf bytes.Buffer + n, err := io.CopyN(&buf, content, maxSlurp) + if err != nil && err != io.EOF { + log.Fatalf("Error reading from stdin: %v, %v", n, err) + } + contentType := http.DetectContentType(buf.Bytes()) + + req, err := http.NewRequest("PUT", "https://storage.googleapis.com/"+*writeObject, io.MultiReader(&buf, content)) + if err != nil { + log.Fatal(err) + } + req.Header.Set("x-goog-api-version", "2") + if *publicObject { + req.Header.Set("x-goog-acl", "public-read") + } + req.Header.Set("Content-Type", contentType) + res, err := httpClient.Do(req) + if err != nil { + log.Fatal(err) + } + if res.StatusCode != 200 { + res.Write(os.Stderr) + log.Fatalf("Failed.") + } + log.Printf("Success.") + os.Exit(0) +} + +type tokenCacheFile string + +func (f tokenCacheFile) Token() (*oauth2.Token, error) { + slurp, err := ioutil.ReadFile(string(f)) + if err != nil { + return nil, err + } + t := new(oauth2.Token) + if err := json.Unmarshal(slurp, t); err != nil { + return nil, err + } + return t, nil +} + +func (f tokenCacheFile) WriteToken(t *oauth2.Token) error { + jt, err := json.Marshal(t) + if err != nil { + return err + } + return ioutil.WriteFile(string(f), jt, 0600) +} diff --git a/api/vendor/golang.org/x/net/http2/h2demo/rootCA.key b/api/vendor/golang.org/x/net/http2/h2demo/rootCA.key new file mode 100644 index 0000000..a15a6ab --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/h2demo/rootCA.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAt5fAjp4fTcekWUTfzsp0kyih1OYbsGL0KX1eRbSSR8Od0+9Q +62Hyny+GFwMTb4A/KU8mssoHvcceSAAbwfbxFK/+s51TobqUnORZrOoTZjkUygby +XDSK99YBbcR1Pip8vwMTm4XKuLtCigeBBdjjAQdgUO28LENGlsMnmeYkJfODVGnV +mr5Ltb9ANA8IKyTfsnHJ4iOCS/PlPbUj2q7YnoVLposUBMlgUb/CykX3mOoLb4yJ +JQyA/iST6ZxiIEj36D4yWZ5lg7YJl+UiiBQHGCnPdGyipqV06ex0heYWcaiW8LWZ +SUQ93jQ+WVCH8hT7DQO1dmsvUmXlq/JeAlwQ/QIDAQABAoIBAFFHV7JMAqPWnMYA +nezY6J81v9+XN+7xABNWM2Q8uv4WdksbigGLTXR3/680Z2hXqJ7LMeC5XJACFT/e +/Gr0vmpgOCygnCPfjGehGKpavtfksXV3edikUlnCXsOP1C//c1bFL+sMYmFCVgTx +qYdDK8yKzXNGrKYT6q5YG7IglyRNV1rsQa8lM/5taFYiD1Ck/3tQi3YIq8Lcuser +hrxsMABcQ6mi+EIvG6Xr4mfJug0dGJMHG4RG1UGFQn6RXrQq2+q53fC8ZbVUSi0j +NQ918aKFzktwv+DouKU0ME4I9toks03gM860bAL7zCbKGmwR3hfgX/TqzVCWpG9E +LDVfvekCgYEA8fk9N53jbBRmULUGEf4qWypcLGiZnNU0OeXWpbPV9aa3H0VDytA7 +8fCN2dPAVDPqlthMDdVe983NCNwp2Yo8ZimDgowyIAKhdC25s1kejuaiH9OAPj3c +0f8KbriYX4n8zNHxFwK6Ae3pQ6EqOLJVCUsziUaZX9nyKY5aZlyX6xcCgYEAwjws +K62PjC64U5wYddNLp+kNdJ4edx+a7qBb3mEgPvSFT2RO3/xafJyG8kQB30Mfstjd +bRxyUV6N0vtX1zA7VQtRUAvfGCecpMo+VQZzcHXKzoRTnQ7eZg4Lmj5fQ9tOAKAo +QCVBoSW/DI4PZL26CAMDcAba4Pa22ooLapoRIQsCgYA6pIfkkbxLNkpxpt2YwLtt +Kr/590O7UaR9n6k8sW/aQBRDXNsILR1KDl2ifAIxpf9lnXgZJiwE7HiTfCAcW7c1 +nzwDCI0hWuHcMTS/NYsFYPnLsstyyjVZI3FY0h4DkYKV9Q9z3zJLQ2hz/nwoD3gy +b2pHC7giFcTts1VPV4Nt8wKBgHeFn4ihHJweg76vZz3Z78w7VNRWGFklUalVdDK7 +gaQ7w2y/ROn/146mo0OhJaXFIFRlrpvdzVrU3GDf2YXJYDlM5ZRkObwbZADjksev +WInzcgDy3KDg7WnPasRXbTfMU4t/AkW2p1QKbi3DnSVYuokDkbH2Beo45vxDxhKr +C69RAoGBAIyo3+OJenoZmoNzNJl2WPW5MeBUzSh8T/bgyjFTdqFHF5WiYRD/lfHj +x9Glyw2nutuT4hlOqHvKhgTYdDMsF2oQ72fe3v8Q5FU7FuKndNPEAyvKNXZaShVA +hnlhv5DjXKb0wFWnt5PCCiQLtzG0yyHaITrrEme7FikkIcTxaX/Y +-----END RSA PRIVATE KEY----- diff --git a/api/vendor/golang.org/x/net/http2/h2demo/rootCA.pem b/api/vendor/golang.org/x/net/http2/h2demo/rootCA.pem new file mode 100644 index 0000000..3a323e7 --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/h2demo/rootCA.pem @@ -0,0 +1,26 @@ +-----BEGIN CERTIFICATE----- +MIIEWjCCA0KgAwIBAgIJALfRlWsI8YQHMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNV +BAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzEUMBIG +A1UEChMLQnJhZGZpdHppbmMxEjAQBgNVBAMTCWxvY2FsaG9zdDEdMBsGCSqGSIb3 +DQEJARYOYnJhZEBkYW5nYS5jb20wHhcNMTQwNzE1MjA0NjA1WhcNMTcwNTA0MjA0 +NjA1WjB7MQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDVNhbiBG +cmFuY2lzY28xFDASBgNVBAoTC0JyYWRmaXR6aW5jMRIwEAYDVQQDEwlsb2NhbGhv +c3QxHTAbBgkqhkiG9w0BCQEWDmJyYWRAZGFuZ2EuY29tMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEAt5fAjp4fTcekWUTfzsp0kyih1OYbsGL0KX1eRbSS +R8Od0+9Q62Hyny+GFwMTb4A/KU8mssoHvcceSAAbwfbxFK/+s51TobqUnORZrOoT +ZjkUygbyXDSK99YBbcR1Pip8vwMTm4XKuLtCigeBBdjjAQdgUO28LENGlsMnmeYk +JfODVGnVmr5Ltb9ANA8IKyTfsnHJ4iOCS/PlPbUj2q7YnoVLposUBMlgUb/CykX3 +mOoLb4yJJQyA/iST6ZxiIEj36D4yWZ5lg7YJl+UiiBQHGCnPdGyipqV06ex0heYW +caiW8LWZSUQ93jQ+WVCH8hT7DQO1dmsvUmXlq/JeAlwQ/QIDAQABo4HgMIHdMB0G +A1UdDgQWBBRcAROthS4P4U7vTfjByC569R7E6DCBrQYDVR0jBIGlMIGigBRcAROt +hS4P4U7vTfjByC569R7E6KF/pH0wezELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNB +MRYwFAYDVQQHEw1TYW4gRnJhbmNpc2NvMRQwEgYDVQQKEwtCcmFkZml0emluYzES +MBAGA1UEAxMJbG9jYWxob3N0MR0wGwYJKoZIhvcNAQkBFg5icmFkQGRhbmdhLmNv +bYIJALfRlWsI8YQHMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAG6h +U9f9sNH0/6oBbGGy2EVU0UgITUQIrFWo9rFkrW5k/XkDjQm+3lzjT0iGR4IxE/Ao +eU6sQhua7wrWeFEn47GL98lnCsJdD7oZNhFmQ95Tb/LnDUjs5Yj9brP0NWzXfYU4 +UK2ZnINJRcJpB8iRCaCxE8DdcUF0XqIEq6pA272snoLmiXLMvNl3kYEdm+je6voD +58SNVEUsztzQyXmJEhCpwVI0A6QCjzXj+qvpmw3ZZHi8JwXei8ZZBLTSFBki8Z7n +sH9BBH38/SzUmAN4QHSPy1gjqm00OAE8NaYDkh/bzE4d7mLGGMWp/WE3KPSu82HF +kPe6XoSbiLm/kxk32T0= +-----END CERTIFICATE----- diff --git a/api/vendor/golang.org/x/net/http2/h2demo/rootCA.srl b/api/vendor/golang.org/x/net/http2/h2demo/rootCA.srl new file mode 100644 index 0000000..6db3891 --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/h2demo/rootCA.srl @@ -0,0 +1 @@ +E2CE26BF3285059C diff --git a/api/vendor/golang.org/x/net/http2/h2demo/server.crt b/api/vendor/golang.org/x/net/http2/h2demo/server.crt new file mode 100644 index 0000000..c59059b --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/h2demo/server.crt @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDPjCCAiYCCQDizia/MoUFnDANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJV +UzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28xFDASBgNVBAoT +C0JyYWRmaXR6aW5jMRIwEAYDVQQDEwlsb2NhbGhvc3QxHTAbBgkqhkiG9w0BCQEW +DmJyYWRAZGFuZ2EuY29tMB4XDTE0MDcxNTIwNTAyN1oXDTE1MTEyNzIwNTAyN1ow +RzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMQswCQYDVQQHEwJTRjEeMBwGA1UE +ChMVYnJhZGZpdHogaHR0cDIgc2VydmVyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAs1Y9CyLFrdL8VQWN1WaifDqaZFnoqjHhCMlc1TfG2zA+InDifx2l +gZD3o8FeNnAcfM2sPlk3+ZleOYw9P/CklFVDlvqmpCv9ss/BEp/dDaWvy1LmJ4c2 +dbQJfmTxn7CV1H3TsVJvKdwFmdoABb41NoBp6+NNO7OtDyhbIMiCI0pL3Nefb3HL +A7hIMo3DYbORTtJLTIH9W8YKrEWL0lwHLrYFx/UdutZnv+HjdmO6vCN4na55mjws +/vjKQUmc7xeY7Xe20xDEG2oDKVkL2eD7FfyrYMS3rO1ExP2KSqlXYG/1S9I/fz88 +F0GK7HX55b5WjZCl2J3ERVdnv/0MQv+sYQIDAQABMA0GCSqGSIb3DQEBBQUAA4IB +AQC0zL+n/YpRZOdulSu9tS8FxrstXqGWoxfe+vIUgqfMZ5+0MkjJ/vW0FqlLDl2R +rn4XaR3e7FmWkwdDVbq/UB6lPmoAaFkCgh9/5oapMaclNVNnfF3fjCJfRr+qj/iD +EmJStTIN0ZuUjAlpiACmfnpEU55PafT5Zx+i1yE4FGjw8bJpFoyD4Hnm54nGjX19 +KeCuvcYFUPnBm3lcL0FalF2AjqV02WTHYNQk7YF/oeO7NKBoEgvGvKG3x+xaOeBI +dwvdq175ZsGul30h+QjrRlXhH/twcuaT3GSdoysDl9cCYE8f1Mk8PD6gan3uBCJU +90p6/CbU71bGbfpM2PHot2fm +-----END CERTIFICATE----- diff --git a/api/vendor/golang.org/x/net/http2/h2demo/server.key b/api/vendor/golang.org/x/net/http2/h2demo/server.key new file mode 100644 index 0000000..f329c14 --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/h2demo/server.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAs1Y9CyLFrdL8VQWN1WaifDqaZFnoqjHhCMlc1TfG2zA+InDi +fx2lgZD3o8FeNnAcfM2sPlk3+ZleOYw9P/CklFVDlvqmpCv9ss/BEp/dDaWvy1Lm +J4c2dbQJfmTxn7CV1H3TsVJvKdwFmdoABb41NoBp6+NNO7OtDyhbIMiCI0pL3Nef +b3HLA7hIMo3DYbORTtJLTIH9W8YKrEWL0lwHLrYFx/UdutZnv+HjdmO6vCN4na55 +mjws/vjKQUmc7xeY7Xe20xDEG2oDKVkL2eD7FfyrYMS3rO1ExP2KSqlXYG/1S9I/ +fz88F0GK7HX55b5WjZCl2J3ERVdnv/0MQv+sYQIDAQABAoIBADQ2spUwbY+bcz4p +3M66ECrNQTBggP40gYl2XyHxGGOu2xhZ94f9ELf1hjRWU2DUKWco1rJcdZClV6q3 +qwmXvcM2Q/SMS8JW0ImkNVl/0/NqPxGatEnj8zY30d/L8hGFb0orzFu/XYA5gCP4 +NbN2WrXgk3ZLeqwcNxHHtSiJWGJ/fPyeDWAu/apy75u9Xf2GlzBZmV6HYD9EfK80 +LTlI60f5FO487CrJnboL7ovPJrIHn+k05xRQqwma4orpz932rTXnTjs9Lg6KtbQN +a7PrqfAntIISgr11a66Mng3IYH1lYqJsWJJwX/xHT4WLEy0EH4/0+PfYemJekz2+ +Co62drECgYEA6O9zVJZXrLSDsIi54cfxA7nEZWm5CAtkYWeAHa4EJ+IlZ7gIf9sL +W8oFcEfFGpvwVqWZ+AsQ70dsjXAv3zXaG0tmg9FtqWp7pzRSMPidifZcQwWkKeTO +gJnFmnVyed8h6GfjTEu4gxo1/S5U0V+mYSha01z5NTnN6ltKx1Or3b0CgYEAxRgm +S30nZxnyg/V7ys61AZhst1DG2tkZXEMcA7dYhabMoXPJAP/EfhlWwpWYYUs/u0gS +Wwmf5IivX5TlYScgmkvb/NYz0u4ZmOXkLTnLPtdKKFXhjXJcHjUP67jYmOxNlJLp +V4vLRnFxTpffAV+OszzRxsXX6fvruwZBANYJeXUCgYBVouLFsFgfWGYp2rpr9XP4 +KK25kvrBqF6JKOIDB1zjxNJ3pUMKrl8oqccCFoCyXa4oTM2kUX0yWxHfleUjrMq4 +yimwQKiOZmV7fVLSSjSw6e/VfBd0h3gb82ygcplZkN0IclkwTY5SNKqwn/3y07V5 +drqdhkrgdJXtmQ6O5YYECQKBgATERcDToQ1USlI4sKrB/wyv1AlG8dg/IebiVJ4e +ZAyvcQmClFzq0qS+FiQUnB/WQw9TeeYrwGs1hxBHuJh16srwhLyDrbMvQP06qh8R +48F8UXXSRec22dV9MQphaROhu2qZdv1AC0WD3tqov6L33aqmEOi+xi8JgbT/PLk5 +c/c1AoGBAI1A/02ryksW6/wc7/6SP2M2rTy4m1sD/GnrTc67EHnRcVBdKO6qH2RY +nqC8YcveC2ZghgPTDsA3VGuzuBXpwY6wTyV99q6jxQJ6/xcrD9/NUG6Uwv/xfCxl +IJLeBYEqQundSSny3VtaAUK8Ul1nxpTvVRNwtcyWTo8RHAAyNPWd +-----END RSA PRIVATE KEY----- diff --git a/api/vendor/golang.org/x/net/http2/h2demo/service.yaml b/api/vendor/golang.org/x/net/http2/h2demo/service.yaml new file mode 100644 index 0000000..2b7d541 --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/h2demo/service.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +kind: Service +metadata: + name: h2demo +spec: + externalTrafficPolicy: Local + ports: + - port: 80 + targetPort: 80 + name: http + - port: 443 + targetPort: 443 + name: https + selector: + app: h2demo + type: LoadBalancer + loadBalancerIP: 130.211.116.44 diff --git a/api/vendor/golang.org/x/net/http2/h2demo/tmpl.go b/api/vendor/golang.org/x/net/http2/h2demo/tmpl.go new file mode 100644 index 0000000..504d6a7 --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/h2demo/tmpl.go @@ -0,0 +1,1991 @@ +// 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. + +// +build h2demo + +package main + +import "html/template" + +var pushTmpl = template.Must(template.New("serverpush").Parse(` + + + + + + + + + HTTP/2 Server Push Demo + + + + + + + + + +
    +Note: This page exists for demonstration purposes. For the actual cmd/go docs, go to golang.org/cmd/go. +
    + + + +
    +... +
    + + + + +
    +
    +
    +
    + Run + Format + + + +
    +
    + + +
    +
    + + +

    Command go

    + + + + + + + + + + + + + + +

    +Go is a tool for managing Go source code. +

    +

    +Usage: +

    +
    go command [arguments]
    +
    +

    +The commands are: +

    +
    build       compile packages and dependencies
    +clean       remove object files
    +doc         show documentation for package or symbol
    +env         print Go environment information
    +bug         start a bug report
    +fix         run go tool fix on packages
    +fmt         run gofmt on package sources
    +generate    generate Go files by processing source
    +get         download and install packages and dependencies
    +install     compile and install packages and dependencies
    +list        list packages
    +run         compile and run Go program
    +test        test packages
    +tool        run specified go tool
    +version     print Go version
    +vet         run go tool vet on packages
    +
    +

    +Use "go help [command]" for more information about a command. +

    +

    +Additional help topics: +

    +
    c           calling between Go and C
    +buildmode   description of build modes
    +filetype    file types
    +gopath      GOPATH environment variable
    +environment environment variables
    +importpath  import path syntax
    +packages    description of package lists
    +testflag    description of testing flags
    +testfunc    description of testing functions
    +
    +

    +Use "go help [topic]" for more information about that topic. +

    +

    Compile packages and dependencies

    +

    +Usage: +

    +
    go build [-o output] [-i] [build flags] [packages]
    +
    +

    +Build compiles the packages named by the import paths, +along with their dependencies, but it does not install the results. +

    +

    +If the arguments to build are a list of .go files, build treats +them as a list of source files specifying a single package. +

    +

    +When compiling a single main package, build writes +the resulting executable to an output file named after +the first source file ('go build ed.go rx.go' writes 'ed' or 'ed.exe') +or the source code directory ('go build unix/sam' writes 'sam' or 'sam.exe'). +The '.exe' suffix is added when writing a Windows executable. +

    +

    +When compiling multiple packages or a single non-main package, +build compiles the packages but discards the resulting object, +serving only as a check that the packages can be built. +

    +

    +When compiling packages, build ignores files that end in '_test.go'. +

    +

    +The -o flag, only allowed when compiling a single package, +forces build to write the resulting executable or object +to the named output file, instead of the default behavior described +in the last two paragraphs. +

    +

    +The -i flag installs the packages that are dependencies of the target. +

    +

    +The build flags are shared by the build, clean, get, install, list, run, +and test commands: +

    +
    -a
    +	force rebuilding of packages that are already up-to-date.
    +-n
    +	print the commands but do not run them.
    +-p n
    +	the number of programs, such as build commands or
    +	test binaries, that can be run in parallel.
    +	The default is the number of CPUs available.
    +-race
    +	enable data race detection.
    +	Supported only on linux/amd64, freebsd/amd64, darwin/amd64 and windows/amd64.
    +-msan
    +	enable interoperation with memory sanitizer.
    +	Supported only on linux/amd64,
    +	and only with Clang/LLVM as the host C compiler.
    +-v
    +	print the names of packages as they are compiled.
    +-work
    +	print the name of the temporary work directory and
    +	do not delete it when exiting.
    +-x
    +	print the commands.
    +
    +-asmflags 'flag list'
    +	arguments to pass on each go tool asm invocation.
    +-buildmode mode
    +	build mode to use. See 'go help buildmode' for more.
    +-compiler name
    +	name of compiler to use, as in runtime.Compiler (gccgo or gc).
    +-gccgoflags 'arg list'
    +	arguments to pass on each gccgo compiler/linker invocation.
    +-gcflags 'arg list'
    +	arguments to pass on each go tool compile invocation.
    +-installsuffix suffix
    +	a suffix to use in the name of the package installation directory,
    +	in order to keep output separate from default builds.
    +	If using the -race flag, the install suffix is automatically set to race
    +	or, if set explicitly, has _race appended to it.  Likewise for the -msan
    +	flag.  Using a -buildmode option that requires non-default compile flags
    +	has a similar effect.
    +-ldflags 'flag list'
    +	arguments to pass on each go tool link invocation.
    +-linkshared
    +	link against shared libraries previously created with
    +	-buildmode=shared.
    +-pkgdir dir
    +	install and load all packages from dir instead of the usual locations.
    +	For example, when building with a non-standard configuration,
    +	use -pkgdir to keep generated packages in a separate location.
    +-tags 'tag list'
    +	a list of build tags to consider satisfied during the build.
    +	For more information about build tags, see the description of
    +	build constraints in the documentation for the go/build package.
    +-toolexec 'cmd args'
    +	a program to use to invoke toolchain programs like vet and asm.
    +	For example, instead of running asm, the go command will run
    +	'cmd args /path/to/asm <arguments for asm>'.
    +
    +

    +The list flags accept a space-separated list of strings. To embed spaces +in an element in the list, surround it with either single or double quotes. +

    +

    +For more about specifying packages, see 'go help packages'. +For more about where packages and binaries are installed, +run 'go help gopath'. +For more about calling between Go and C/C++, run 'go help c'. +

    +

    +Note: Build adheres to certain conventions such as those described +by 'go help gopath'. Not all projects can follow these conventions, +however. Installations that have their own conventions or that use +a separate software build system may choose to use lower-level +invocations such as 'go tool compile' and 'go tool link' to avoid +some of the overheads and design decisions of the build tool. +

    +

    +See also: go install, go get, go clean. +

    +

    Remove object files

    +

    +Usage: +

    +
    go clean [-i] [-r] [-n] [-x] [build flags] [packages]
    +
    +

    +Clean removes object files from package source directories. +The go command builds most objects in a temporary directory, +so go clean is mainly concerned with object files left by other +tools or by manual invocations of go build. +

    +

    +Specifically, clean removes the following files from each of the +source directories corresponding to the import paths: +

    +
    _obj/            old object directory, left from Makefiles
    +_test/           old test directory, left from Makefiles
    +_testmain.go     old gotest file, left from Makefiles
    +test.out         old test log, left from Makefiles
    +build.out        old test log, left from Makefiles
    +*.[568ao]        object files, left from Makefiles
    +
    +DIR(.exe)        from go build
    +DIR.test(.exe)   from go test -c
    +MAINFILE(.exe)   from go build MAINFILE.go
    +*.so             from SWIG
    +
    +

    +In the list, DIR represents the final path element of the +directory, and MAINFILE is the base name of any Go source +file in the directory that is not included when building +the package. +

    +

    +The -i flag causes clean to remove the corresponding installed +archive or binary (what 'go install' would create). +

    +

    +The -n flag causes clean to print the remove commands it would execute, +but not run them. +

    +

    +The -r flag causes clean to be applied recursively to all the +dependencies of the packages named by the import paths. +

    +

    +The -x flag causes clean to print remove commands as it executes them. +

    +

    +For more about build flags, see 'go help build'. +

    +

    +For more about specifying packages, see 'go help packages'. +

    +

    Show documentation for package or symbol

    +

    +Usage: +

    +
    go doc [-u] [-c] [package|[package.]symbol[.method]]
    +
    +

    +Doc prints the documentation comments associated with the item identified by its +arguments (a package, const, func, type, var, or method) followed by a one-line +summary of each of the first-level items "under" that item (package-level +declarations for a package, methods for a type, etc.). +

    +

    +Doc accepts zero, one, or two arguments. +

    +

    +Given no arguments, that is, when run as +

    +
    go doc
    +
    +

    +it prints the package documentation for the package in the current directory. +If the package is a command (package main), the exported symbols of the package +are elided from the presentation unless the -cmd flag is provided. +

    +

    +When run with one argument, the argument is treated as a Go-syntax-like +representation of the item to be documented. What the argument selects depends +on what is installed in GOROOT and GOPATH, as well as the form of the argument, +which is schematically one of these: +

    +
    go doc <pkg>
    +go doc <sym>[.<method>]
    +go doc [<pkg>.]<sym>[.<method>]
    +go doc [<pkg>.][<sym>.]<method>
    +
    +

    +The first item in this list matched by the argument is the one whose documentation +is printed. (See the examples below.) However, if the argument starts with a capital +letter it is assumed to identify a symbol or method in the current directory. +

    +

    +For packages, the order of scanning is determined lexically in breadth-first order. +That is, the package presented is the one that matches the search and is nearest +the root and lexically first at its level of the hierarchy. The GOROOT tree is +always scanned in its entirety before GOPATH. +

    +

    +If there is no package specified or matched, the package in the current +directory is selected, so "go doc Foo" shows the documentation for symbol Foo in +the current package. +

    +

    +The package path must be either a qualified path or a proper suffix of a +path. The go tool's usual package mechanism does not apply: package path +elements like . and ... are not implemented by go doc. +

    +

    +When run with two arguments, the first must be a full package path (not just a +suffix), and the second is a symbol or symbol and method; this is similar to the +syntax accepted by godoc: +

    +
    go doc <pkg> <sym>[.<method>]
    +
    +

    +In all forms, when matching symbols, lower-case letters in the argument match +either case but upper-case letters match exactly. This means that there may be +multiple matches of a lower-case argument in a package if different symbols have +different cases. If this occurs, documentation for all matches is printed. +

    +

    +Examples: +

    +
    go doc
    +	Show documentation for current package.
    +go doc Foo
    +	Show documentation for Foo in the current package.
    +	(Foo starts with a capital letter so it cannot match
    +	a package path.)
    +go doc encoding/json
    +	Show documentation for the encoding/json package.
    +go doc json
    +	Shorthand for encoding/json.
    +go doc json.Number (or go doc json.number)
    +	Show documentation and method summary for json.Number.
    +go doc json.Number.Int64 (or go doc json.number.int64)
    +	Show documentation for json.Number's Int64 method.
    +go doc cmd/doc
    +	Show package docs for the doc command.
    +go doc -cmd cmd/doc
    +	Show package docs and exported symbols within the doc command.
    +go doc template.new
    +	Show documentation for html/template's New function.
    +	(html/template is lexically before text/template)
    +go doc text/template.new # One argument
    +	Show documentation for text/template's New function.
    +go doc text/template new # Two arguments
    +	Show documentation for text/template's New function.
    +
    +At least in the current tree, these invocations all print the
    +documentation for json.Decoder's Decode method:
    +
    +go doc json.Decoder.Decode
    +go doc json.decoder.decode
    +go doc json.decode
    +cd go/src/encoding/json; go doc decode
    +
    +

    +Flags: +

    +
    -c
    +	Respect case when matching symbols.
    +-cmd
    +	Treat a command (package main) like a regular package.
    +	Otherwise package main's exported symbols are hidden
    +	when showing the package's top-level documentation.
    +-u
    +	Show documentation for unexported as well as exported
    +	symbols and methods.
    +
    +

    Print Go environment information

    +

    +Usage: +

    +
    go env [var ...]
    +
    +

    +Env prints Go environment information. +

    +

    +By default env prints information as a shell script +(on Windows, a batch file). If one or more variable +names is given as arguments, env prints the value of +each named variable on its own line. +

    +

    Start a bug report

    +

    +Usage: +

    +
    go bug
    +
    +

    +Bug opens the default browser and starts a new bug report. +The report includes useful system information. +

    +

    Run go tool fix on packages

    +

    +Usage: +

    +
    go fix [packages]
    +
    +

    +Fix runs the Go fix command on the packages named by the import paths. +

    +

    +For more about fix, see 'go doc cmd/fix'. +For more about specifying packages, see 'go help packages'. +

    +

    +To run fix with specific options, run 'go tool fix'. +

    +

    +See also: go fmt, go vet. +

    +

    Run gofmt on package sources

    +

    +Usage: +

    +
    go fmt [-n] [-x] [packages]
    +
    +

    +Fmt runs the command 'gofmt -l -w' on the packages named +by the import paths. It prints the names of the files that are modified. +

    +

    +For more about gofmt, see 'go doc cmd/gofmt'. +For more about specifying packages, see 'go help packages'. +

    +

    +The -n flag prints commands that would be executed. +The -x flag prints commands as they are executed. +

    +

    +To run gofmt with specific options, run gofmt itself. +

    +

    +See also: go fix, go vet. +

    +

    Generate Go files by processing source

    +

    +Usage: +

    +
    go generate [-run regexp] [-n] [-v] [-x] [build flags] [file.go... | packages]
    +
    +

    +Generate runs commands described by directives within existing +files. Those commands can run any process but the intent is to +create or update Go source files. +

    +

    +Go generate is never run automatically by go build, go get, go test, +and so on. It must be run explicitly. +

    +

    +Go generate scans the file for directives, which are lines of +the form, +

    +
    //go:generate command argument...
    +
    +

    +(note: no leading spaces and no space in "//go") where command +is the generator to be run, corresponding to an executable file +that can be run locally. It must either be in the shell path +(gofmt), a fully qualified path (/usr/you/bin/mytool), or a +command alias, described below. +

    +

    +Note that go generate does not parse the file, so lines that look +like directives in comments or multiline strings will be treated +as directives. +

    +

    +The arguments to the directive are space-separated tokens or +double-quoted strings passed to the generator as individual +arguments when it is run. +

    +

    +Quoted strings use Go syntax and are evaluated before execution; a +quoted string appears as a single argument to the generator. +

    +

    +Go generate sets several variables when it runs the generator: +

    +
    $GOARCH
    +	The execution architecture (arm, amd64, etc.)
    +$GOOS
    +	The execution operating system (linux, windows, etc.)
    +$GOFILE
    +	The base name of the file.
    +$GOLINE
    +	The line number of the directive in the source file.
    +$GOPACKAGE
    +	The name of the package of the file containing the directive.
    +$DOLLAR
    +	A dollar sign.
    +
    +

    +Other than variable substitution and quoted-string evaluation, no +special processing such as "globbing" is performed on the command +line. +

    +

    +As a last step before running the command, any invocations of any +environment variables with alphanumeric names, such as $GOFILE or +$HOME, are expanded throughout the command line. The syntax for +variable expansion is $NAME on all operating systems. Due to the +order of evaluation, variables are expanded even inside quoted +strings. If the variable NAME is not set, $NAME expands to the +empty string. +

    +

    +A directive of the form, +

    +
    //go:generate -command xxx args...
    +
    +

    +specifies, for the remainder of this source file only, that the +string xxx represents the command identified by the arguments. This +can be used to create aliases or to handle multiword generators. +For example, +

    +
    //go:generate -command foo go tool foo
    +
    +

    +specifies that the command "foo" represents the generator +"go tool foo". +

    +

    +Generate processes packages in the order given on the command line, +one at a time. If the command line lists .go files, they are treated +as a single package. Within a package, generate processes the +source files in a package in file name order, one at a time. Within +a source file, generate runs generators in the order they appear +in the file, one at a time. +

    +

    +If any generator returns an error exit status, "go generate" skips +all further processing for that package. +

    +

    +The generator is run in the package's source directory. +

    +

    +Go generate accepts one specific flag: +

    +
    -run=""
    +	if non-empty, specifies a regular expression to select
    +	directives whose full original source text (excluding
    +	any trailing spaces and final newline) matches the
    +	expression.
    +
    +

    +It also accepts the standard build flags including -v, -n, and -x. +The -v flag prints the names of packages and files as they are +processed. +The -n flag prints commands that would be executed. +The -x flag prints commands as they are executed. +

    +

    +For more about build flags, see 'go help build'. +

    +

    +For more about specifying packages, see 'go help packages'. +

    +

    Download and install packages and dependencies

    +

    +Usage: +

    +
    go get [-d] [-f] [-fix] [-insecure] [-t] [-u] [build flags] [packages]
    +
    +

    +Get downloads the packages named by the import paths, along with their +dependencies. It then installs the named packages, like 'go install'. +

    +

    +The -d flag instructs get to stop after downloading the packages; that is, +it instructs get not to install the packages. +

    +

    +The -f flag, valid only when -u is set, forces get -u not to verify that +each package has been checked out from the source control repository +implied by its import path. This can be useful if the source is a local fork +of the original. +

    +

    +The -fix flag instructs get to run the fix tool on the downloaded packages +before resolving dependencies or building the code. +

    +

    +The -insecure flag permits fetching from repositories and resolving +custom domains using insecure schemes such as HTTP. Use with caution. +

    +

    +The -t flag instructs get to also download the packages required to build +the tests for the specified packages. +

    +

    +The -u flag instructs get to use the network to update the named packages +and their dependencies. By default, get uses the network to check out +missing packages but does not use it to look for updates to existing packages. +

    +

    +The -v flag enables verbose progress and debug output. +

    +

    +Get also accepts build flags to control the installation. See 'go help build'. +

    +

    +When checking out a new package, get creates the target directory +GOPATH/src/<import-path>. If the GOPATH contains multiple entries, +get uses the first one. For more details see: 'go help gopath'. +

    +

    +When checking out or updating a package, get looks for a branch or tag +that matches the locally installed version of Go. The most important +rule is that if the local installation is running version "go1", get +searches for a branch or tag named "go1". If no such version exists it +retrieves the most recent version of the package. +

    +

    +When go get checks out or updates a Git repository, +it also updates any git submodules referenced by the repository. +

    +

    +Get never checks out or updates code stored in vendor directories. +

    +

    +For more about specifying packages, see 'go help packages'. +

    +

    +For more about how 'go get' finds source code to +download, see 'go help importpath'. +

    +

    +See also: go build, go install, go clean. +

    +

    Compile and install packages and dependencies

    +

    +Usage: +

    +
    go install [build flags] [packages]
    +
    +

    +Install compiles and installs the packages named by the import paths, +along with their dependencies. +

    +

    +For more about the build flags, see 'go help build'. +For more about specifying packages, see 'go help packages'. +

    +

    +See also: go build, go get, go clean. +

    +

    List packages

    +

    +Usage: +

    +
    go list [-e] [-f format] [-json] [build flags] [packages]
    +
    +

    +List lists the packages named by the import paths, one per line. +

    +

    +The default output shows the package import path: +

    +
    bytes
    +encoding/json
    +github.com/gorilla/mux
    +golang.org/x/net/html
    +
    +

    +The -f flag specifies an alternate format for the list, using the +syntax of package template. The default output is equivalent to -f +''. The struct being passed to the template is: +

    +
    type Package struct {
    +    Dir           string // directory containing package sources
    +    ImportPath    string // import path of package in dir
    +    ImportComment string // path in import comment on package statement
    +    Name          string // package name
    +    Doc           string // package documentation string
    +    Target        string // install path
    +    Shlib         string // the shared library that contains this package (only set when -linkshared)
    +    Goroot        bool   // is this package in the Go root?
    +    Standard      bool   // is this package part of the standard Go library?
    +    Stale         bool   // would 'go install' do anything for this package?
    +    StaleReason   string // explanation for Stale==true
    +    Root          string // Go root or Go path dir containing this package
    +    ConflictDir   string // this directory shadows Dir in $GOPATH
    +    BinaryOnly    bool   // binary-only package: cannot be recompiled from sources
    +
    +    // Source files
    +    GoFiles        []string // .go source files (excluding CgoFiles, TestGoFiles, XTestGoFiles)
    +    CgoFiles       []string // .go sources files that import "C"
    +    IgnoredGoFiles []string // .go sources ignored due to build constraints
    +    CFiles         []string // .c source files
    +    CXXFiles       []string // .cc, .cxx and .cpp source files
    +    MFiles         []string // .m source files
    +    HFiles         []string // .h, .hh, .hpp and .hxx source files
    +    FFiles         []string // .f, .F, .for and .f90 Fortran source files
    +    SFiles         []string // .s source files
    +    SwigFiles      []string // .swig files
    +    SwigCXXFiles   []string // .swigcxx files
    +    SysoFiles      []string // .syso object files to add to archive
    +    TestGoFiles    []string // _test.go files in package
    +    XTestGoFiles   []string // _test.go files outside package
    +
    +    // Cgo directives
    +    CgoCFLAGS    []string // cgo: flags for C compiler
    +    CgoCPPFLAGS  []string // cgo: flags for C preprocessor
    +    CgoCXXFLAGS  []string // cgo: flags for C++ compiler
    +    CgoFFLAGS    []string // cgo: flags for Fortran compiler
    +    CgoLDFLAGS   []string // cgo: flags for linker
    +    CgoPkgConfig []string // cgo: pkg-config names
    +
    +    // Dependency information
    +    Imports      []string // import paths used by this package
    +    Deps         []string // all (recursively) imported dependencies
    +    TestImports  []string // imports from TestGoFiles
    +    XTestImports []string // imports from XTestGoFiles
    +
    +    // Error information
    +    Incomplete bool            // this package or a dependency has an error
    +    Error      *PackageError   // error loading package
    +    DepsErrors []*PackageError // errors loading dependencies
    +}
    +
    +

    +Packages stored in vendor directories report an ImportPath that includes the +path to the vendor directory (for example, "d/vendor/p" instead of "p"), +so that the ImportPath uniquely identifies a given copy of a package. +The Imports, Deps, TestImports, and XTestImports lists also contain these +expanded imports paths. See golang.org/s/go15vendor for more about vendoring. +

    +

    +The error information, if any, is +

    +
    type PackageError struct {
    +    ImportStack   []string // shortest path from package named on command line to this one
    +    Pos           string   // position of error (if present, file:line:col)
    +    Err           string   // the error itself
    +}
    +
    +

    +The template function "join" calls strings.Join. +

    +

    +The template function "context" returns the build context, defined as: +

    +
    type Context struct {
    +	GOARCH        string   // target architecture
    +	GOOS          string   // target operating system
    +	GOROOT        string   // Go root
    +	GOPATH        string   // Go path
    +	CgoEnabled    bool     // whether cgo can be used
    +	UseAllFiles   bool     // use files regardless of +build lines, file names
    +	Compiler      string   // compiler to assume when computing target paths
    +	BuildTags     []string // build constraints to match in +build lines
    +	ReleaseTags   []string // releases the current release is compatible with
    +	InstallSuffix string   // suffix to use in the name of the install dir
    +}
    +
    +

    +For more information about the meaning of these fields see the documentation +for the go/build package's Context type. +

    +

    +The -json flag causes the package data to be printed in JSON format +instead of using the template format. +

    +

    +The -e flag changes the handling of erroneous packages, those that +cannot be found or are malformed. By default, the list command +prints an error to standard error for each erroneous package and +omits the packages from consideration during the usual printing. +With the -e flag, the list command never prints errors to standard +error and instead processes the erroneous packages with the usual +printing. Erroneous packages will have a non-empty ImportPath and +a non-nil Error field; other information may or may not be missing +(zeroed). +

    +

    +For more about build flags, see 'go help build'. +

    +

    +For more about specifying packages, see 'go help packages'. +

    +

    Compile and run Go program

    +

    +Usage: +

    +
    go run [build flags] [-exec xprog] gofiles... [arguments...]
    +
    +

    +Run compiles and runs the main package comprising the named Go source files. +A Go source file is defined to be a file ending in a literal ".go" suffix. +

    +

    +By default, 'go run' runs the compiled binary directly: 'a.out arguments...'. +If the -exec flag is given, 'go run' invokes the binary using xprog: +

    +
    'xprog a.out arguments...'.
    +
    +

    +If the -exec flag is not given, GOOS or GOARCH is different from the system +default, and a program named go_$GOOS_$GOARCH_exec can be found +on the current search path, 'go run' invokes the binary using that program, +for example 'go_nacl_386_exec a.out arguments...'. This allows execution of +cross-compiled programs when a simulator or other execution method is +available. +

    +

    +For more about build flags, see 'go help build'. +

    +

    +See also: go build. +

    +

    Test packages

    +

    +Usage: +

    +
    go test [build/test flags] [packages] [build/test flags & test binary flags]
    +
    +

    +'Go test' automates testing the packages named by the import paths. +It prints a summary of the test results in the format: +

    +
    ok   archive/tar   0.011s
    +FAIL archive/zip   0.022s
    +ok   compress/gzip 0.033s
    +...
    +
    +

    +followed by detailed output for each failed package. +

    +

    +'Go test' recompiles each package along with any files with names matching +the file pattern "*_test.go". +Files whose names begin with "_" (including "_test.go") or "." are ignored. +These additional files can contain test functions, benchmark functions, and +example functions. See 'go help testfunc' for more. +Each listed package causes the execution of a separate test binary. +

    +

    +Test files that declare a package with the suffix "_test" will be compiled as a +separate package, and then linked and run with the main test binary. +

    +

    +The go tool will ignore a directory named "testdata", making it available +to hold ancillary data needed by the tests. +

    +

    +By default, go test needs no arguments. It compiles and tests the package +with source in the current directory, including tests, and runs the tests. +

    +

    +The package is built in a temporary directory so it does not interfere with the +non-test installation. +

    +

    +In addition to the build flags, the flags handled by 'go test' itself are: +

    +
    -args
    +    Pass the remainder of the command line (everything after -args)
    +    to the test binary, uninterpreted and unchanged.
    +    Because this flag consumes the remainder of the command line,
    +    the package list (if present) must appear before this flag.
    +
    +-c
    +    Compile the test binary to pkg.test but do not run it
    +    (where pkg is the last element of the package's import path).
    +    The file name can be changed with the -o flag.
    +
    +-exec xprog
    +    Run the test binary using xprog. The behavior is the same as
    +    in 'go run'. See 'go help run' for details.
    +
    +-i
    +    Install packages that are dependencies of the test.
    +    Do not run the test.
    +
    +-o file
    +    Compile the test binary to the named file.
    +    The test still runs (unless -c or -i is specified).
    +
    +

    +The test binary also accepts flags that control execution of the test; these +flags are also accessible by 'go test'. See 'go help testflag' for details. +

    +

    +For more about build flags, see 'go help build'. +For more about specifying packages, see 'go help packages'. +

    +

    +See also: go build, go vet. +

    +

    Run specified go tool

    +

    +Usage: +

    +
    go tool [-n] command [args...]
    +
    +

    +Tool runs the go tool command identified by the arguments. +With no arguments it prints the list of known tools. +

    +

    +The -n flag causes tool to print the command that would be +executed but not execute it. +

    +

    +For more about each tool command, see 'go tool command -h'. +

    +

    Print Go version

    +

    +Usage: +

    +
    go version
    +
    +

    +Version prints the Go version, as reported by runtime.Version. +

    +

    Run go tool vet on packages

    +

    +Usage: +

    +
    go vet [-n] [-x] [build flags] [packages]
    +
    +

    +Vet runs the Go vet command on the packages named by the import paths. +

    +

    +For more about vet, see 'go doc cmd/vet'. +For more about specifying packages, see 'go help packages'. +

    +

    +To run the vet tool with specific options, run 'go tool vet'. +

    +

    +The -n flag prints commands that would be executed. +The -x flag prints commands as they are executed. +

    +

    +For more about build flags, see 'go help build'. +

    +

    +See also: go fmt, go fix. +

    +

    Calling between Go and C

    +

    +There are two different ways to call between Go and C/C++ code. +

    +

    +The first is the cgo tool, which is part of the Go distribution. For +information on how to use it see the cgo documentation (go doc cmd/cgo). +

    +

    +The second is the SWIG program, which is a general tool for +interfacing between languages. For information on SWIG see +http://swig.org/. When running go build, any file with a .swig +extension will be passed to SWIG. Any file with a .swigcxx extension +will be passed to SWIG with the -c++ option. +

    +

    +When either cgo or SWIG is used, go build will pass any .c, .m, .s, +or .S files to the C compiler, and any .cc, .cpp, .cxx files to the C++ +compiler. The CC or CXX environment variables may be set to determine +the C or C++ compiler, respectively, to use. +

    +

    Description of build modes

    +

    +The 'go build' and 'go install' commands take a -buildmode argument which +indicates which kind of object file is to be built. Currently supported values +are: +

    +
    -buildmode=archive
    +	Build the listed non-main packages into .a files. Packages named
    +	main are ignored.
    +
    +-buildmode=c-archive
    +	Build the listed main package, plus all packages it imports,
    +	into a C archive file. The only callable symbols will be those
    +	functions exported using a cgo //export comment. Requires
    +	exactly one main package to be listed.
    +
    +-buildmode=c-shared
    +	Build the listed main packages, plus all packages that they
    +	import, into C shared libraries. The only callable symbols will
    +	be those functions exported using a cgo //export comment.
    +	Non-main packages are ignored.
    +
    +-buildmode=default
    +	Listed main packages are built into executables and listed
    +	non-main packages are built into .a files (the default
    +	behavior).
    +
    +-buildmode=shared
    +	Combine all the listed non-main packages into a single shared
    +	library that will be used when building with the -linkshared
    +	option. Packages named main are ignored.
    +
    +-buildmode=exe
    +	Build the listed main packages and everything they import into
    +	executables. Packages not named main are ignored.
    +
    +-buildmode=pie
    +	Build the listed main packages and everything they import into
    +	position independent executables (PIE). Packages not named
    +	main are ignored.
    +
    +-buildmode=plugin
    +	Build the listed main packages, plus all packages that they
    +	import, into a Go plugin. Packages not named main are ignored.
    +
    +

    File types

    +

    +The go command examines the contents of a restricted set of files +in each directory. It identifies which files to examine based on +the extension of the file name. These extensions are: +

    +
    .go
    +	Go source files.
    +.c, .h
    +	C source files.
    +	If the package uses cgo or SWIG, these will be compiled with the
    +	OS-native compiler (typically gcc); otherwise they will
    +	trigger an error.
    +.cc, .cpp, .cxx, .hh, .hpp, .hxx
    +	C++ source files. Only useful with cgo or SWIG, and always
    +	compiled with the OS-native compiler.
    +.m
    +	Objective-C source files. Only useful with cgo, and always
    +	compiled with the OS-native compiler.
    +.s, .S
    +	Assembler source files.
    +	If the package uses cgo or SWIG, these will be assembled with the
    +	OS-native assembler (typically gcc (sic)); otherwise they
    +	will be assembled with the Go assembler.
    +.swig, .swigcxx
    +	SWIG definition files.
    +.syso
    +	System object files.
    +
    +

    +Files of each of these types except .syso may contain build +constraints, but the go command stops scanning for build constraints +at the first item in the file that is not a blank line or //-style +line comment. See the go/build package documentation for +more details. +

    +

    +Non-test Go source files can also include a //go:binary-only-package +comment, indicating that the package sources are included +for documentation only and must not be used to build the +package binary. This enables distribution of Go packages in +their compiled form alone. See the go/build package documentation +for more details. +

    +

    GOPATH environment variable

    +

    +The Go path is used to resolve import statements. +It is implemented by and documented in the go/build package. +

    +

    +The GOPATH environment variable lists places to look for Go code. +On Unix, the value is a colon-separated string. +On Windows, the value is a semicolon-separated string. +On Plan 9, the value is a list. +

    +

    +If the environment variable is unset, GOPATH defaults +to a subdirectory named "go" in the user's home directory +($HOME/go on Unix, %USERPROFILE%\go on Windows), +unless that directory holds a Go distribution. +Run "go env GOPATH" to see the current GOPATH. +

    +

    +See https://golang.org/wiki/SettingGOPATH to set a custom GOPATH. +

    +

    +Each directory listed in GOPATH must have a prescribed structure: +

    +

    +The src directory holds source code. The path below src +determines the import path or executable name. +

    +

    +The pkg directory holds installed package objects. +As in the Go tree, each target operating system and +architecture pair has its own subdirectory of pkg +(pkg/GOOS_GOARCH). +

    +

    +If DIR is a directory listed in the GOPATH, a package with +source in DIR/src/foo/bar can be imported as "foo/bar" and +has its compiled form installed to "DIR/pkg/GOOS_GOARCH/foo/bar.a". +

    +

    +The bin directory holds compiled commands. +Each command is named for its source directory, but only +the final element, not the entire path. That is, the +command with source in DIR/src/foo/quux is installed into +DIR/bin/quux, not DIR/bin/foo/quux. The "foo/" prefix is stripped +so that you can add DIR/bin to your PATH to get at the +installed commands. If the GOBIN environment variable is +set, commands are installed to the directory it names instead +of DIR/bin. GOBIN must be an absolute path. +

    +

    +Here's an example directory layout: +

    +
    GOPATH=/home/user/go
    +
    +/home/user/go/
    +    src/
    +        foo/
    +            bar/               (go code in package bar)
    +                x.go
    +            quux/              (go code in package main)
    +                y.go
    +    bin/
    +        quux                   (installed command)
    +    pkg/
    +        linux_amd64/
    +            foo/
    +                bar.a          (installed package object)
    +
    +

    +Go searches each directory listed in GOPATH to find source code, +but new packages are always downloaded into the first directory +in the list. +

    +

    +See https://golang.org/doc/code.html for an example. +

    +

    Internal Directories

    +

    +Code in or below a directory named "internal" is importable only +by code in the directory tree rooted at the parent of "internal". +Here's an extended version of the directory layout above: +

    +
    /home/user/go/
    +    src/
    +        crash/
    +            bang/              (go code in package bang)
    +                b.go
    +        foo/                   (go code in package foo)
    +            f.go
    +            bar/               (go code in package bar)
    +                x.go
    +            internal/
    +                baz/           (go code in package baz)
    +                    z.go
    +            quux/              (go code in package main)
    +                y.go
    +
    +

    +The code in z.go is imported as "foo/internal/baz", but that +import statement can only appear in source files in the subtree +rooted at foo. The source files foo/f.go, foo/bar/x.go, and +foo/quux/y.go can all import "foo/internal/baz", but the source file +crash/bang/b.go cannot. +

    +

    +See https://golang.org/s/go14internal for details. +

    +

    Vendor Directories

    +

    +Go 1.6 includes support for using local copies of external dependencies +to satisfy imports of those dependencies, often referred to as vendoring. +

    +

    +Code below a directory named "vendor" is importable only +by code in the directory tree rooted at the parent of "vendor", +and only using an import path that omits the prefix up to and +including the vendor element. +

    +

    +Here's the example from the previous section, +but with the "internal" directory renamed to "vendor" +and a new foo/vendor/crash/bang directory added: +

    +
    /home/user/go/
    +    src/
    +        crash/
    +            bang/              (go code in package bang)
    +                b.go
    +        foo/                   (go code in package foo)
    +            f.go
    +            bar/               (go code in package bar)
    +                x.go
    +            vendor/
    +                crash/
    +                    bang/      (go code in package bang)
    +                        b.go
    +                baz/           (go code in package baz)
    +                    z.go
    +            quux/              (go code in package main)
    +                y.go
    +
    +

    +The same visibility rules apply as for internal, but the code +in z.go is imported as "baz", not as "foo/vendor/baz". +

    +

    +Code in vendor directories deeper in the source tree shadows +code in higher directories. Within the subtree rooted at foo, an import +of "crash/bang" resolves to "foo/vendor/crash/bang", not the +top-level "crash/bang". +

    +

    +Code in vendor directories is not subject to import path +checking (see 'go help importpath'). +

    +

    +When 'go get' checks out or updates a git repository, it now also +updates submodules. +

    +

    +Vendor directories do not affect the placement of new repositories +being checked out for the first time by 'go get': those are always +placed in the main GOPATH, never in a vendor subtree. +

    +

    +See https://golang.org/s/go15vendor for details. +

    +

    Environment variables

    +

    +The go command, and the tools it invokes, examine a few different +environment variables. For many of these, you can see the default +value of on your system by running 'go env NAME', where NAME is the +name of the variable. +

    +

    +General-purpose environment variables: +

    +
    GCCGO
    +	The gccgo command to run for 'go build -compiler=gccgo'.
    +GOARCH
    +	The architecture, or processor, for which to compile code.
    +	Examples are amd64, 386, arm, ppc64.
    +GOBIN
    +	The directory where 'go install' will install a command.
    +GOOS
    +	The operating system for which to compile code.
    +	Examples are linux, darwin, windows, netbsd.
    +GOPATH
    +	For more details see: 'go help gopath'.
    +GORACE
    +	Options for the race detector.
    +	See https://golang.org/doc/articles/race_detector.html.
    +GOROOT
    +	The root of the go tree.
    +
    +

    +Environment variables for use with cgo: +

    +
    CC
    +	The command to use to compile C code.
    +CGO_ENABLED
    +	Whether the cgo command is supported.  Either 0 or 1.
    +CGO_CFLAGS
    +	Flags that cgo will pass to the compiler when compiling
    +	C code.
    +CGO_CPPFLAGS
    +	Flags that cgo will pass to the compiler when compiling
    +	C or C++ code.
    +CGO_CXXFLAGS
    +	Flags that cgo will pass to the compiler when compiling
    +	C++ code.
    +CGO_FFLAGS
    +	Flags that cgo will pass to the compiler when compiling
    +	Fortran code.
    +CGO_LDFLAGS
    +	Flags that cgo will pass to the compiler when linking.
    +CXX
    +	The command to use to compile C++ code.
    +PKG_CONFIG
    +	Path to pkg-config tool.
    +
    +

    +Architecture-specific environment variables: +

    +
    GOARM
    +	For GOARCH=arm, the ARM architecture for which to compile.
    +	Valid values are 5, 6, 7.
    +GO386
    +	For GOARCH=386, the floating point instruction set.
    +	Valid values are 387, sse2.
    +
    +

    +Special-purpose environment variables: +

    +
    GOROOT_FINAL
    +	The root of the installed Go tree, when it is
    +	installed in a location other than where it is built.
    +	File names in stack traces are rewritten from GOROOT to
    +	GOROOT_FINAL.
    +GO_EXTLINK_ENABLED
    +	Whether the linker should use external linking mode
    +	when using -linkmode=auto with code that uses cgo.
    +	Set to 0 to disable external linking mode, 1 to enable it.
    +GIT_ALLOW_PROTOCOL
    +	Defined by Git. A colon-separated list of schemes that are allowed to be used
    +	with git fetch/clone. If set, any scheme not explicitly mentioned will be
    +	considered insecure by 'go get'.
    +
    +

    Import path syntax

    +

    +An import path (see 'go help packages') denotes a package stored in the local +file system. In general, an import path denotes either a standard package (such +as "unicode/utf8") or a package found in one of the work spaces (For more +details see: 'go help gopath'). +

    +

    Relative import paths

    +

    +An import path beginning with ./ or ../ is called a relative path. +The toolchain supports relative import paths as a shortcut in two ways. +

    +

    +First, a relative path can be used as a shorthand on the command line. +If you are working in the directory containing the code imported as +"unicode" and want to run the tests for "unicode/utf8", you can type +"go test ./utf8" instead of needing to specify the full path. +Similarly, in the reverse situation, "go test .." will test "unicode" from +the "unicode/utf8" directory. Relative patterns are also allowed, like +"go test ./..." to test all subdirectories. See 'go help packages' for details +on the pattern syntax. +

    +

    +Second, if you are compiling a Go program not in a work space, +you can use a relative path in an import statement in that program +to refer to nearby code also not in a work space. +This makes it easy to experiment with small multipackage programs +outside of the usual work spaces, but such programs cannot be +installed with "go install" (there is no work space in which to install them), +so they are rebuilt from scratch each time they are built. +To avoid ambiguity, Go programs cannot use relative import paths +within a work space. +

    +

    Remote import paths

    +

    +Certain import paths also +describe how to obtain the source code for the package using +a revision control system. +

    +

    +A few common code hosting sites have special syntax: +

    +
    Bitbucket (Git, Mercurial)
    +
    +	import "bitbucket.org/user/project"
    +	import "bitbucket.org/user/project/sub/directory"
    +
    +GitHub (Git)
    +
    +	import "github.com/user/project"
    +	import "github.com/user/project/sub/directory"
    +
    +Launchpad (Bazaar)
    +
    +	import "launchpad.net/project"
    +	import "launchpad.net/project/series"
    +	import "launchpad.net/project/series/sub/directory"
    +
    +	import "launchpad.net/~user/project/branch"
    +	import "launchpad.net/~user/project/branch/sub/directory"
    +
    +IBM DevOps Services (Git)
    +
    +	import "hub.jazz.net/git/user/project"
    +	import "hub.jazz.net/git/user/project/sub/directory"
    +
    +

    +For code hosted on other servers, import paths may either be qualified +with the version control type, or the go tool can dynamically fetch +the import path over https/http and discover where the code resides +from a <meta> tag in the HTML. +

    +

    +To declare the code location, an import path of the form +

    +
    repository.vcs/path
    +
    +

    +specifies the given repository, with or without the .vcs suffix, +using the named version control system, and then the path inside +that repository. The supported version control systems are: +

    +
    Bazaar      .bzr
    +Git         .git
    +Mercurial   .hg
    +Subversion  .svn
    +
    +

    +For example, +

    +
    import "example.org/user/foo.hg"
    +
    +

    +denotes the root directory of the Mercurial repository at +example.org/user/foo or foo.hg, and +

    +
    import "example.org/repo.git/foo/bar"
    +
    +

    +denotes the foo/bar directory of the Git repository at +example.org/repo or repo.git. +

    +

    +When a version control system supports multiple protocols, +each is tried in turn when downloading. For example, a Git +download tries https://, then git+ssh://. +

    +

    +By default, downloads are restricted to known secure protocols +(e.g. https, ssh). To override this setting for Git downloads, the +GIT_ALLOW_PROTOCOL environment variable can be set (For more details see: +'go help environment'). +

    +

    +If the import path is not a known code hosting site and also lacks a +version control qualifier, the go tool attempts to fetch the import +over https/http and looks for a <meta> tag in the document's HTML +<head>. +

    +

    +The meta tag has the form: +

    +
    <meta name="go-import" content="import-prefix vcs repo-root">
    +
    +

    +The import-prefix is the import path corresponding to the repository +root. It must be a prefix or an exact match of the package being +fetched with "go get". If it's not an exact match, another http +request is made at the prefix to verify the <meta> tags match. +

    +

    +The meta tag should appear as early in the file as possible. +In particular, it should appear before any raw JavaScript or CSS, +to avoid confusing the go command's restricted parser. +

    +

    +The vcs is one of "git", "hg", "svn", etc, +

    +

    +The repo-root is the root of the version control system +containing a scheme and not containing a .vcs qualifier. +

    +

    +For example, +

    +
    import "example.org/pkg/foo"
    +
    +

    +will result in the following requests: +

    +
    https://example.org/pkg/foo?go-get=1 (preferred)
    +http://example.org/pkg/foo?go-get=1  (fallback, only with -insecure)
    +
    +

    +If that page contains the meta tag +

    +
    <meta name="go-import" content="example.org git https://code.org/r/p/exproj">
    +
    +

    +the go tool will verify that https://example.org/?go-get=1 contains the +same meta tag and then git clone https://code.org/r/p/exproj into +GOPATH/src/example.org. +

    +

    +New downloaded packages are written to the first directory listed in the GOPATH +environment variable (For more details see: 'go help gopath'). +

    +

    +The go command attempts to download the version of the +package appropriate for the Go release being used. +Run 'go help get' for more. +

    +

    Import path checking

    +

    +When the custom import path feature described above redirects to a +known code hosting site, each of the resulting packages has two possible +import paths, using the custom domain or the known hosting site. +

    +

    +A package statement is said to have an "import comment" if it is immediately +followed (before the next newline) by a comment of one of these two forms: +

    +
    package math // import "path"
    +package math /* import "path" */
    +
    +

    +The go command will refuse to install a package with an import comment +unless it is being referred to by that import path. In this way, import comments +let package authors make sure the custom import path is used and not a +direct path to the underlying code hosting site. +

    +

    +Import path checking is disabled for code found within vendor trees. +This makes it possible to copy code into alternate locations in vendor trees +without needing to update import comments. +

    +

    +See https://golang.org/s/go14customimport for details. +

    +

    Description of package lists

    +

    +Many commands apply to a set of packages: +

    +
    go action [packages]
    +
    +

    +Usually, [packages] is a list of import paths. +

    +

    +An import path that is a rooted path or that begins with +a . or .. element is interpreted as a file system path and +denotes the package in that directory. +

    +

    +Otherwise, the import path P denotes the package found in +the directory DIR/src/P for some DIR listed in the GOPATH +environment variable (For more details see: 'go help gopath'). +

    +

    +If no import paths are given, the action applies to the +package in the current directory. +

    +

    +There are four reserved names for paths that should not be used +for packages to be built with the go tool: +

    +

    +- "main" denotes the top-level package in a stand-alone executable. +

    +

    +- "all" expands to all package directories found in all the GOPATH +trees. For example, 'go list all' lists all the packages on the local +system. +

    +

    +- "std" is like all but expands to just the packages in the standard +Go library. +

    +

    +- "cmd" expands to the Go repository's commands and their +internal libraries. +

    +

    +Import paths beginning with "cmd/" only match source code in +the Go repository. +

    +

    +An import path is a pattern if it includes one or more "..." wildcards, +each of which can match any string, including the empty string and +strings containing slashes. Such a pattern expands to all package +directories found in the GOPATH trees with names matching the +patterns. As a special case, x/... matches x as well as x's subdirectories. +For example, net/... expands to net and packages in its subdirectories. +

    +

    +An import path can also name a package to be downloaded from +a remote repository. Run 'go help importpath' for details. +

    +

    +Every package in a program must have a unique import path. +By convention, this is arranged by starting each path with a +unique prefix that belongs to you. For example, paths used +internally at Google all begin with 'google', and paths +denoting remote repositories begin with the path to the code, +such as 'github.com/user/repo'. +

    +

    +Packages in a program need not have unique package names, +but there are two reserved package names with special meaning. +The name main indicates a command, not a library. +Commands are built into binaries and cannot be imported. +The name documentation indicates documentation for +a non-Go program in the directory. Files in package documentation +are ignored by the go command. +

    +

    +As a special case, if the package list is a list of .go files from a +single directory, the command is applied to a single synthesized +package made up of exactly those files, ignoring any build constraints +in those files and ignoring any other files in the directory. +

    +

    +Directory and file names that begin with "." or "_" are ignored +by the go tool, as are directories named "testdata". +

    +

    Description of testing flags

    +

    +The 'go test' command takes both flags that apply to 'go test' itself +and flags that apply to the resulting test binary. +

    +

    +Several of the flags control profiling and write an execution profile +suitable for "go tool pprof"; run "go tool pprof -h" for more +information. The --alloc_space, --alloc_objects, and --show_bytes +options of pprof control how the information is presented. +

    +

    +The following flags are recognized by the 'go test' command and +control the execution of any test: +

    +
    -bench regexp
    +    Run (sub)benchmarks matching a regular expression.
    +    The given regular expression is split into smaller ones by
    +    top-level '/', where each must match the corresponding part of a
    +    benchmark's identifier.
    +    By default, no benchmarks run. To run all benchmarks,
    +    use '-bench .' or '-bench=.'.
    +
    +-benchtime t
    +    Run enough iterations of each benchmark to take t, specified
    +    as a time.Duration (for example, -benchtime 1h30s).
    +    The default is 1 second (1s).
    +
    +-count n
    +    Run each test and benchmark n times (default 1).
    +    If -cpu is set, run n times for each GOMAXPROCS value.
    +    Examples are always run once.
    +
    +-cover
    +    Enable coverage analysis.
    +
    +-covermode set,count,atomic
    +    Set the mode for coverage analysis for the package[s]
    +    being tested. The default is "set" unless -race is enabled,
    +    in which case it is "atomic".
    +    The values:
    +	set: bool: does this statement run?
    +	count: int: how many times does this statement run?
    +	atomic: int: count, but correct in multithreaded tests;
    +		significantly more expensive.
    +    Sets -cover.
    +
    +-coverpkg pkg1,pkg2,pkg3
    +    Apply coverage analysis in each test to the given list of packages.
    +    The default is for each test to analyze only the package being tested.
    +    Packages are specified as import paths.
    +    Sets -cover.
    +
    +-cpu 1,2,4
    +    Specify a list of GOMAXPROCS values for which the tests or
    +    benchmarks should be executed.  The default is the current value
    +    of GOMAXPROCS.
    +
    +-parallel n
    +    Allow parallel execution of test functions that call t.Parallel.
    +    The value of this flag is the maximum number of tests to run
    +    simultaneously; by default, it is set to the value of GOMAXPROCS.
    +    Note that -parallel only applies within a single test binary.
    +    The 'go test' command may run tests for different packages
    +    in parallel as well, according to the setting of the -p flag
    +    (see 'go help build').
    +
    +-run regexp
    +    Run only those tests and examples matching the regular expression.
    +    For tests the regular expression is split into smaller ones by
    +    top-level '/', where each must match the corresponding part of a
    +    test's identifier.
    +
    +-short
    +    Tell long-running tests to shorten their run time.
    +    It is off by default but set during all.bash so that installing
    +    the Go tree can run a sanity check but not spend time running
    +    exhaustive tests.
    +
    +-timeout t
    +    If a test runs longer than t, panic.
    +    The default is 10 minutes (10m).
    +
    +-v
    +    Verbose output: log all tests as they are run. Also print all
    +    text from Log and Logf calls even if the test succeeds.
    +
    +

    +The following flags are also recognized by 'go test' and can be used to +profile the tests during execution: +

    +
    -benchmem
    +    Print memory allocation statistics for benchmarks.
    +
    +-blockprofile block.out
    +    Write a goroutine blocking profile to the specified file
    +    when all tests are complete.
    +    Writes test binary as -c would.
    +
    +-blockprofilerate n
    +    Control the detail provided in goroutine blocking profiles by
    +    calling runtime.SetBlockProfileRate with n.
    +    See 'go doc runtime.SetBlockProfileRate'.
    +    The profiler aims to sample, on average, one blocking event every
    +    n nanoseconds the program spends blocked.  By default,
    +    if -test.blockprofile is set without this flag, all blocking events
    +    are recorded, equivalent to -test.blockprofilerate=1.
    +
    +-coverprofile cover.out
    +    Write a coverage profile to the file after all tests have passed.
    +    Sets -cover.
    +
    +-cpuprofile cpu.out
    +    Write a CPU profile to the specified file before exiting.
    +    Writes test binary as -c would.
    +
    +-memprofile mem.out
    +    Write a memory profile to the file after all tests have passed.
    +    Writes test binary as -c would.
    +
    +-memprofilerate n
    +    Enable more precise (and expensive) memory profiles by setting
    +    runtime.MemProfileRate.  See 'go doc runtime.MemProfileRate'.
    +    To profile all memory allocations, use -test.memprofilerate=1
    +    and pass --alloc_space flag to the pprof tool.
    +
    +-mutexprofile mutex.out
    +    Write a mutex contention profile to the specified file
    +    when all tests are complete.
    +    Writes test binary as -c would.
    +
    +-mutexprofilefraction n
    +    Sample 1 in n stack traces of goroutines holding a
    +    contended mutex.
    +
    +-outputdir directory
    +    Place output files from profiling in the specified directory,
    +    by default the directory in which "go test" is running.
    +
    +-trace trace.out
    +    Write an execution trace to the specified file before exiting.
    +
    +

    +Each of these flags is also recognized with an optional 'test.' prefix, +as in -test.v. When invoking the generated test binary (the result of +'go test -c') directly, however, the prefix is mandatory. +

    +

    +The 'go test' command rewrites or removes recognized flags, +as appropriate, both before and after the optional package list, +before invoking the test binary. +

    +

    +For instance, the command +

    +
    go test -v -myflag testdata -cpuprofile=prof.out -x
    +
    +

    +will compile the test binary and then run it as +

    +
    pkg.test -test.v -myflag testdata -test.cpuprofile=prof.out
    +
    +

    +(The -x flag is removed because it applies only to the go command's +execution, not to the test itself.) +

    +

    +The test flags that generate profiles (other than for coverage) also +leave the test binary in pkg.test for use when analyzing the profiles. +

    +

    +When 'go test' runs a test binary, it does so from within the +corresponding package's source code directory. Depending on the test, +it may be necessary to do the same when invoking a generated test +binary directly. +

    +

    +The command-line package list, if present, must appear before any +flag not known to the go test command. Continuing the example above, +the package list would have to appear before -myflag, but could appear +on either side of -v. +

    +

    +To keep an argument for a test binary from being interpreted as a +known flag or a package name, use -args (see 'go help test') which +passes the remainder of the command line through to the test binary +uninterpreted and unaltered. +

    +

    +For instance, the command +

    +
    go test -v -args -x -v
    +
    +

    +will compile the test binary and then run it as +

    +
    pkg.test -test.v -x -v
    +
    +

    +Similarly, +

    +
    go test -args math
    +
    +

    +will compile the test binary and then run it as +

    +
    pkg.test math
    +
    +

    +In the first example, the -x and the second -v are passed through to the +test binary unchanged and with no effect on the go command itself. +In the second example, the argument math is passed through to the test +binary, instead of being interpreted as the package list. +

    +

    Description of testing functions

    +

    +The 'go test' command expects to find test, benchmark, and example functions +in the "*_test.go" files corresponding to the package under test. +

    +

    +A test function is one named TestXXX (where XXX is any alphanumeric string +not starting with a lower case letter) and should have the signature, +

    +
    func TestXXX(t *testing.T) { ... }
    +
    +

    +A benchmark function is one named BenchmarkXXX and should have the signature, +

    +
    func BenchmarkXXX(b *testing.B) { ... }
    +
    +

    +An example function is similar to a test function but, instead of using +*testing.T to report success or failure, prints output to os.Stdout. +If the last comment in the function starts with "Output:" then the output +is compared exactly against the comment (see examples below). If the last +comment begins with "Unordered output:" then the output is compared to the +comment, however the order of the lines is ignored. An example with no such +comment is compiled but not executed. An example with no text after +"Output:" is compiled, executed, and expected to produce no output. +

    +

    +Godoc displays the body of ExampleXXX to demonstrate the use +of the function, constant, or variable XXX. An example of a method M with +receiver type T or *T is named ExampleT_M. There may be multiple examples +for a given function, constant, or variable, distinguished by a trailing _xxx, +where xxx is a suffix not beginning with an upper case letter. +

    +

    +Here is an example of an example: +

    +
    func ExamplePrintln() {
    +	Println("The output of\nthis example.")
    +	// Output: The output of
    +	// this example.
    +}
    +
    +

    +Here is another example where the ordering of the output is ignored: +

    +
    func ExamplePerm() {
    +	for _, value := range Perm(4) {
    +		fmt.Println(value)
    +	}
    +
    +	// Unordered output: 4
    +	// 2
    +	// 1
    +	// 3
    +	// 0
    +}
    +
    +

    +The entire test file is presented as the example when it contains a single +example function, at least one other function, type, variable, or constant +declaration, and no test or benchmark functions. +

    +

    +See the documentation of the testing package for more information. +

    + + + +
    +
    + + + + + + + + +`)) diff --git a/api/vendor/golang.org/x/net/http2/h2i/README.md b/api/vendor/golang.org/x/net/http2/h2i/README.md new file mode 100644 index 0000000..fb5c5ef --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/h2i/README.md @@ -0,0 +1,97 @@ +# h2i + +**h2i** is an interactive HTTP/2 ("h2") console debugger. Miss the good ol' +days of telnetting to your HTTP/1.n servers? We're bringing you +back. + +Features: +- send raw HTTP/2 frames + - PING + - SETTINGS + - HEADERS + - etc +- type in HTTP/1.n and have it auto-HPACK/frame-ify it for HTTP/2 +- pretty print all received HTTP/2 frames from the peer (including HPACK decoding) +- tab completion of commands, options + +Not yet features, but soon: +- unnecessary CONTINUATION frames on short boundaries, to test peer implementations +- request bodies (DATA frames) +- send invalid frames for testing server implementations (supported by underlying Framer) + +Later: +- act like a server + +## Installation + +``` +$ go get golang.org/x/net/http2/h2i +$ h2i +``` + +## Demo + +``` +$ h2i +Usage: h2i + + -insecure + Whether to skip TLS cert validation + -nextproto string + Comma-separated list of NPN/ALPN protocol names to negotiate. (default "h2,h2-14") + +$ h2i google.com +Connecting to google.com:443 ... +Connected to 74.125.224.41:443 +Negotiated protocol "h2-14" +[FrameHeader SETTINGS len=18] + [MAX_CONCURRENT_STREAMS = 100] + [INITIAL_WINDOW_SIZE = 1048576] + [MAX_FRAME_SIZE = 16384] +[FrameHeader WINDOW_UPDATE len=4] + Window-Increment = 983041 + +h2i> PING h2iSayHI +[FrameHeader PING flags=ACK len=8] + Data = "h2iSayHI" +h2i> headers +(as HTTP/1.1)> GET / HTTP/1.1 +(as HTTP/1.1)> Host: ip.appspot.com +(as HTTP/1.1)> User-Agent: h2i/brad-n-blake +(as HTTP/1.1)> +Opening Stream-ID 1: + :authority = ip.appspot.com + :method = GET + :path = / + :scheme = https + user-agent = h2i/brad-n-blake +[FrameHeader HEADERS flags=END_HEADERS stream=1 len=77] + :status = "200" + alternate-protocol = "443:quic,p=1" + content-length = "15" + content-type = "text/html" + date = "Fri, 01 May 2015 23:06:56 GMT" + server = "Google Frontend" +[FrameHeader DATA flags=END_STREAM stream=1 len=15] + "173.164.155.78\n" +[FrameHeader PING len=8] + Data = "\x00\x00\x00\x00\x00\x00\x00\x00" +h2i> ping +[FrameHeader PING flags=ACK len=8] + Data = "h2i_ping" +h2i> ping +[FrameHeader PING flags=ACK len=8] + Data = "h2i_ping" +h2i> ping +[FrameHeader GOAWAY len=22] + Last-Stream-ID = 1; Error-Code = PROTOCOL_ERROR (1) + +ReadFrame: EOF +``` + +## Status + +Quick few hour hack. So much yet to do. Feel free to file issues for +bugs or wishlist items, but [@bmizerany](https://github.com/bmizerany/) +and I aren't yet accepting pull requests until things settle down. + diff --git a/api/vendor/golang.org/x/net/http2/h2i/h2i.go b/api/vendor/golang.org/x/net/http2/h2i/h2i.go new file mode 100644 index 0000000..62e5752 --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/h2i/h2i.go @@ -0,0 +1,522 @@ +// Copyright 2015 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 !plan9,!solaris + +/* +The h2i command is an interactive HTTP/2 console. + +Usage: + $ h2i [flags] + +Interactive commands in the console: (all parts case-insensitive) + + ping [data] + settings ack + settings FOO=n BAR=z + headers (open a new stream by typing HTTP/1.1) +*/ +package main + +import ( + "bufio" + "bytes" + "crypto/tls" + "errors" + "flag" + "fmt" + "io" + "log" + "net" + "net/http" + "os" + "regexp" + "strconv" + "strings" + + "golang.org/x/crypto/ssh/terminal" + "golang.org/x/net/http2" + "golang.org/x/net/http2/hpack" +) + +// Flags +var ( + flagNextProto = flag.String("nextproto", "h2,h2-14", "Comma-separated list of NPN/ALPN protocol names to negotiate.") + flagInsecure = flag.Bool("insecure", false, "Whether to skip TLS cert validation") + flagSettings = flag.String("settings", "empty", "comma-separated list of KEY=value settings for the initial SETTINGS frame. The magic value 'empty' sends an empty initial settings frame, and the magic value 'omit' causes no initial settings frame to be sent.") + flagDial = flag.String("dial", "", "optional ip:port to dial, to connect to a host:port but use a different SNI name (including a SNI name without DNS)") +) + +type command struct { + run func(*h2i, []string) error // required + + // complete optionally specifies tokens (case-insensitive) which are + // valid for this subcommand. + complete func() []string +} + +var commands = map[string]command{ + "ping": {run: (*h2i).cmdPing}, + "settings": { + run: (*h2i).cmdSettings, + complete: func() []string { + return []string{ + "ACK", + http2.SettingHeaderTableSize.String(), + http2.SettingEnablePush.String(), + http2.SettingMaxConcurrentStreams.String(), + http2.SettingInitialWindowSize.String(), + http2.SettingMaxFrameSize.String(), + http2.SettingMaxHeaderListSize.String(), + } + }, + }, + "quit": {run: (*h2i).cmdQuit}, + "headers": {run: (*h2i).cmdHeaders}, +} + +func usage() { + fmt.Fprintf(os.Stderr, "Usage: h2i \n\n") + flag.PrintDefaults() +} + +// withPort adds ":443" if another port isn't already present. +func withPort(host string) string { + if _, _, err := net.SplitHostPort(host); err != nil { + return net.JoinHostPort(host, "443") + } + return host +} + +// withoutPort strips the port from addr if present. +func withoutPort(addr string) string { + if h, _, err := net.SplitHostPort(addr); err == nil { + return h + } + return addr +} + +// h2i is the app's state. +type h2i struct { + host string + tc *tls.Conn + framer *http2.Framer + term *terminal.Terminal + + // owned by the command loop: + streamID uint32 + hbuf bytes.Buffer + henc *hpack.Encoder + + // owned by the readFrames loop: + peerSetting map[http2.SettingID]uint32 + hdec *hpack.Decoder +} + +func main() { + flag.Usage = usage + flag.Parse() + if flag.NArg() != 1 { + usage() + os.Exit(2) + } + log.SetFlags(0) + + host := flag.Arg(0) + app := &h2i{ + host: host, + peerSetting: make(map[http2.SettingID]uint32), + } + app.henc = hpack.NewEncoder(&app.hbuf) + + if err := app.Main(); err != nil { + if app.term != nil { + app.logf("%v\n", err) + } else { + fmt.Fprintf(os.Stderr, "%v\n", err) + } + os.Exit(1) + } + fmt.Fprintf(os.Stdout, "\n") +} + +func (app *h2i) Main() error { + cfg := &tls.Config{ + ServerName: withoutPort(app.host), + NextProtos: strings.Split(*flagNextProto, ","), + InsecureSkipVerify: *flagInsecure, + } + + hostAndPort := *flagDial + if hostAndPort == "" { + hostAndPort = withPort(app.host) + } + log.Printf("Connecting to %s ...", hostAndPort) + tc, err := tls.Dial("tcp", hostAndPort, cfg) + if err != nil { + return fmt.Errorf("Error dialing %s: %v", hostAndPort, err) + } + log.Printf("Connected to %v", tc.RemoteAddr()) + defer tc.Close() + + if err := tc.Handshake(); err != nil { + return fmt.Errorf("TLS handshake: %v", err) + } + if !*flagInsecure { + if err := tc.VerifyHostname(app.host); err != nil { + return fmt.Errorf("VerifyHostname: %v", err) + } + } + state := tc.ConnectionState() + log.Printf("Negotiated protocol %q", state.NegotiatedProtocol) + if !state.NegotiatedProtocolIsMutual || state.NegotiatedProtocol == "" { + return fmt.Errorf("Could not negotiate protocol mutually") + } + + if _, err := io.WriteString(tc, http2.ClientPreface); err != nil { + return err + } + + app.framer = http2.NewFramer(tc, tc) + + oldState, err := terminal.MakeRaw(int(os.Stdin.Fd())) + if err != nil { + return err + } + defer terminal.Restore(0, oldState) + + var screen = struct { + io.Reader + io.Writer + }{os.Stdin, os.Stdout} + + app.term = terminal.NewTerminal(screen, "h2i> ") + lastWord := regexp.MustCompile(`.+\W(\w+)$`) + app.term.AutoCompleteCallback = func(line string, pos int, key rune) (newLine string, newPos int, ok bool) { + if key != '\t' { + return + } + if pos != len(line) { + // TODO: we're being lazy for now, only supporting tab completion at the end. + return + } + // Auto-complete for the command itself. + if !strings.Contains(line, " ") { + var name string + name, _, ok = lookupCommand(line) + if !ok { + return + } + return name, len(name), true + } + _, c, ok := lookupCommand(line[:strings.IndexByte(line, ' ')]) + if !ok || c.complete == nil { + return + } + if strings.HasSuffix(line, " ") { + app.logf("%s", strings.Join(c.complete(), " ")) + return line, pos, true + } + m := lastWord.FindStringSubmatch(line) + if m == nil { + return line, len(line), true + } + soFar := m[1] + var match []string + for _, cand := range c.complete() { + if len(soFar) > len(cand) || !strings.EqualFold(cand[:len(soFar)], soFar) { + continue + } + match = append(match, cand) + } + if len(match) == 0 { + return + } + if len(match) > 1 { + // TODO: auto-complete any common prefix + app.logf("%s", strings.Join(match, " ")) + return line, pos, true + } + newLine = line[:len(line)-len(soFar)] + match[0] + return newLine, len(newLine), true + + } + + errc := make(chan error, 2) + go func() { errc <- app.readFrames() }() + go func() { errc <- app.readConsole() }() + return <-errc +} + +func (app *h2i) logf(format string, args ...interface{}) { + fmt.Fprintf(app.term, format+"\r\n", args...) +} + +func (app *h2i) readConsole() error { + if s := *flagSettings; s != "omit" { + var args []string + if s != "empty" { + args = strings.Split(s, ",") + } + _, c, ok := lookupCommand("settings") + if !ok { + panic("settings command not found") + } + c.run(app, args) + } + + for { + line, err := app.term.ReadLine() + if err == io.EOF { + return nil + } + if err != nil { + return fmt.Errorf("terminal.ReadLine: %v", err) + } + f := strings.Fields(line) + if len(f) == 0 { + continue + } + cmd, args := f[0], f[1:] + if _, c, ok := lookupCommand(cmd); ok { + err = c.run(app, args) + } else { + app.logf("Unknown command %q", line) + } + if err == errExitApp { + return nil + } + if err != nil { + return err + } + } +} + +func lookupCommand(prefix string) (name string, c command, ok bool) { + prefix = strings.ToLower(prefix) + if c, ok = commands[prefix]; ok { + return prefix, c, ok + } + + for full, candidate := range commands { + if strings.HasPrefix(full, prefix) { + if c.run != nil { + return "", command{}, false // ambiguous + } + c = candidate + name = full + } + } + return name, c, c.run != nil +} + +var errExitApp = errors.New("internal sentinel error value to quit the console reading loop") + +func (a *h2i) cmdQuit(args []string) error { + if len(args) > 0 { + a.logf("the QUIT command takes no argument") + return nil + } + return errExitApp +} + +func (a *h2i) cmdSettings(args []string) error { + if len(args) == 1 && strings.EqualFold(args[0], "ACK") { + return a.framer.WriteSettingsAck() + } + var settings []http2.Setting + for _, arg := range args { + if strings.EqualFold(arg, "ACK") { + a.logf("Error: ACK must be only argument with the SETTINGS command") + return nil + } + eq := strings.Index(arg, "=") + if eq == -1 { + a.logf("Error: invalid argument %q (expected SETTING_NAME=nnnn)", arg) + return nil + } + sid, ok := settingByName(arg[:eq]) + if !ok { + a.logf("Error: unknown setting name %q", arg[:eq]) + return nil + } + val, err := strconv.ParseUint(arg[eq+1:], 10, 32) + if err != nil { + a.logf("Error: invalid argument %q (expected SETTING_NAME=nnnn)", arg) + return nil + } + settings = append(settings, http2.Setting{ + ID: sid, + Val: uint32(val), + }) + } + a.logf("Sending: %v", settings) + return a.framer.WriteSettings(settings...) +} + +func settingByName(name string) (http2.SettingID, bool) { + for _, sid := range [...]http2.SettingID{ + http2.SettingHeaderTableSize, + http2.SettingEnablePush, + http2.SettingMaxConcurrentStreams, + http2.SettingInitialWindowSize, + http2.SettingMaxFrameSize, + http2.SettingMaxHeaderListSize, + } { + if strings.EqualFold(sid.String(), name) { + return sid, true + } + } + return 0, false +} + +func (app *h2i) cmdPing(args []string) error { + if len(args) > 1 { + app.logf("invalid PING usage: only accepts 0 or 1 args") + return nil // nil means don't end the program + } + var data [8]byte + if len(args) == 1 { + copy(data[:], args[0]) + } else { + copy(data[:], "h2i_ping") + } + return app.framer.WritePing(false, data) +} + +func (app *h2i) cmdHeaders(args []string) error { + if len(args) > 0 { + app.logf("Error: HEADERS doesn't yet take arguments.") + // TODO: flags for restricting window size, to force CONTINUATION + // frames. + return nil + } + var h1req bytes.Buffer + app.term.SetPrompt("(as HTTP/1.1)> ") + defer app.term.SetPrompt("h2i> ") + for { + line, err := app.term.ReadLine() + if err != nil { + return err + } + h1req.WriteString(line) + h1req.WriteString("\r\n") + if line == "" { + break + } + } + req, err := http.ReadRequest(bufio.NewReader(&h1req)) + if err != nil { + app.logf("Invalid HTTP/1.1 request: %v", err) + return nil + } + if app.streamID == 0 { + app.streamID = 1 + } else { + app.streamID += 2 + } + app.logf("Opening Stream-ID %d:", app.streamID) + hbf := app.encodeHeaders(req) + if len(hbf) > 16<<10 { + app.logf("TODO: h2i doesn't yet write CONTINUATION frames. Copy it from transport.go") + return nil + } + return app.framer.WriteHeaders(http2.HeadersFrameParam{ + StreamID: app.streamID, + BlockFragment: hbf, + EndStream: req.Method == "GET" || req.Method == "HEAD", // good enough for now + EndHeaders: true, // for now + }) +} + +func (app *h2i) readFrames() error { + for { + f, err := app.framer.ReadFrame() + if err != nil { + return fmt.Errorf("ReadFrame: %v", err) + } + app.logf("%v", f) + switch f := f.(type) { + case *http2.PingFrame: + app.logf(" Data = %q", f.Data) + case *http2.SettingsFrame: + f.ForeachSetting(func(s http2.Setting) error { + app.logf(" %v", s) + app.peerSetting[s.ID] = s.Val + return nil + }) + case *http2.WindowUpdateFrame: + app.logf(" Window-Increment = %v", f.Increment) + case *http2.GoAwayFrame: + app.logf(" Last-Stream-ID = %d; Error-Code = %v (%d)", f.LastStreamID, f.ErrCode, f.ErrCode) + case *http2.DataFrame: + app.logf(" %q", f.Data()) + case *http2.HeadersFrame: + if f.HasPriority() { + app.logf(" PRIORITY = %v", f.Priority) + } + if app.hdec == nil { + // TODO: if the user uses h2i to send a SETTINGS frame advertising + // something larger, we'll need to respect SETTINGS_HEADER_TABLE_SIZE + // and stuff here instead of using the 4k default. But for now: + tableSize := uint32(4 << 10) + app.hdec = hpack.NewDecoder(tableSize, app.onNewHeaderField) + } + app.hdec.Write(f.HeaderBlockFragment()) + case *http2.PushPromiseFrame: + if app.hdec == nil { + // TODO: if the user uses h2i to send a SETTINGS frame advertising + // something larger, we'll need to respect SETTINGS_HEADER_TABLE_SIZE + // and stuff here instead of using the 4k default. But for now: + tableSize := uint32(4 << 10) + app.hdec = hpack.NewDecoder(tableSize, app.onNewHeaderField) + } + app.hdec.Write(f.HeaderBlockFragment()) + } + } +} + +// called from readLoop +func (app *h2i) onNewHeaderField(f hpack.HeaderField) { + if f.Sensitive { + app.logf(" %s = %q (SENSITIVE)", f.Name, f.Value) + } + app.logf(" %s = %q", f.Name, f.Value) +} + +func (app *h2i) encodeHeaders(req *http.Request) []byte { + app.hbuf.Reset() + + // TODO(bradfitz): figure out :authority-vs-Host stuff between http2 and Go + host := req.Host + if host == "" { + host = req.URL.Host + } + + path := req.RequestURI + if path == "" { + path = "/" + } + + app.writeHeader(":authority", host) // probably not right for all sites + app.writeHeader(":method", req.Method) + app.writeHeader(":path", path) + app.writeHeader(":scheme", "https") + + for k, vv := range req.Header { + lowKey := strings.ToLower(k) + if lowKey == "host" { + continue + } + for _, v := range vv { + app.writeHeader(lowKey, v) + } + } + return app.hbuf.Bytes() +} + +func (app *h2i) writeHeader(name, value string) { + app.henc.WriteField(hpack.HeaderField{Name: name, Value: value}) + app.logf(" %s = %s", name, value) +} diff --git a/api/vendor/golang.org/x/net/http2/headermap.go b/api/vendor/golang.org/x/net/http2/headermap.go new file mode 100644 index 0000000..c2805f6 --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/headermap.go @@ -0,0 +1,78 @@ +// 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 http2 + +import ( + "net/http" + "strings" +) + +var ( + commonLowerHeader = map[string]string{} // Go-Canonical-Case -> lower-case + commonCanonHeader = map[string]string{} // lower-case -> Go-Canonical-Case +) + +func init() { + for _, v := range []string{ + "accept", + "accept-charset", + "accept-encoding", + "accept-language", + "accept-ranges", + "age", + "access-control-allow-origin", + "allow", + "authorization", + "cache-control", + "content-disposition", + "content-encoding", + "content-language", + "content-length", + "content-location", + "content-range", + "content-type", + "cookie", + "date", + "etag", + "expect", + "expires", + "from", + "host", + "if-match", + "if-modified-since", + "if-none-match", + "if-unmodified-since", + "last-modified", + "link", + "location", + "max-forwards", + "proxy-authenticate", + "proxy-authorization", + "range", + "referer", + "refresh", + "retry-after", + "server", + "set-cookie", + "strict-transport-security", + "trailer", + "transfer-encoding", + "user-agent", + "vary", + "via", + "www-authenticate", + } { + chk := http.CanonicalHeaderKey(v) + commonLowerHeader[chk] = v + commonCanonHeader[v] = chk + } +} + +func lowerHeader(v string) string { + if s, ok := commonLowerHeader[v]; ok { + return s + } + return strings.ToLower(v) +} diff --git a/api/vendor/golang.org/x/net/http2/hpack/encode.go b/api/vendor/golang.org/x/net/http2/hpack/encode.go new file mode 100644 index 0000000..1565cf2 --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/hpack/encode.go @@ -0,0 +1,240 @@ +// 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 hpack + +import ( + "io" +) + +const ( + uint32Max = ^uint32(0) + initialHeaderTableSize = 4096 +) + +type Encoder struct { + dynTab dynamicTable + // minSize is the minimum table size set by + // SetMaxDynamicTableSize after the previous Header Table Size + // Update. + minSize uint32 + // maxSizeLimit is the maximum table size this encoder + // supports. This will protect the encoder from too large + // size. + maxSizeLimit uint32 + // tableSizeUpdate indicates whether "Header Table Size + // Update" is required. + tableSizeUpdate bool + w io.Writer + buf []byte +} + +// NewEncoder returns a new Encoder which performs HPACK encoding. An +// encoded data is written to w. +func NewEncoder(w io.Writer) *Encoder { + e := &Encoder{ + minSize: uint32Max, + maxSizeLimit: initialHeaderTableSize, + tableSizeUpdate: false, + w: w, + } + e.dynTab.table.init() + e.dynTab.setMaxSize(initialHeaderTableSize) + return e +} + +// WriteField encodes f into a single Write to e's underlying Writer. +// This function may also produce bytes for "Header Table Size Update" +// if necessary. If produced, it is done before encoding f. +func (e *Encoder) WriteField(f HeaderField) error { + e.buf = e.buf[:0] + + if e.tableSizeUpdate { + e.tableSizeUpdate = false + if e.minSize < e.dynTab.maxSize { + e.buf = appendTableSize(e.buf, e.minSize) + } + e.minSize = uint32Max + e.buf = appendTableSize(e.buf, e.dynTab.maxSize) + } + + idx, nameValueMatch := e.searchTable(f) + if nameValueMatch { + e.buf = appendIndexed(e.buf, idx) + } else { + indexing := e.shouldIndex(f) + if indexing { + e.dynTab.add(f) + } + + if idx == 0 { + e.buf = appendNewName(e.buf, f, indexing) + } else { + e.buf = appendIndexedName(e.buf, f, idx, indexing) + } + } + n, err := e.w.Write(e.buf) + if err == nil && n != len(e.buf) { + err = io.ErrShortWrite + } + return err +} + +// searchTable searches f in both stable and dynamic header tables. +// The static header table is searched first. Only when there is no +// exact match for both name and value, the dynamic header table is +// then searched. If there is no match, i is 0. If both name and value +// match, i is the matched index and nameValueMatch becomes true. If +// only name matches, i points to that index and nameValueMatch +// becomes false. +func (e *Encoder) searchTable(f HeaderField) (i uint64, nameValueMatch bool) { + i, nameValueMatch = staticTable.search(f) + if nameValueMatch { + return i, true + } + + j, nameValueMatch := e.dynTab.table.search(f) + if nameValueMatch || (i == 0 && j != 0) { + return j + uint64(staticTable.len()), nameValueMatch + } + + return i, false +} + +// SetMaxDynamicTableSize changes the dynamic header table size to v. +// The actual size is bounded by the value passed to +// SetMaxDynamicTableSizeLimit. +func (e *Encoder) SetMaxDynamicTableSize(v uint32) { + if v > e.maxSizeLimit { + v = e.maxSizeLimit + } + if v < e.minSize { + e.minSize = v + } + e.tableSizeUpdate = true + e.dynTab.setMaxSize(v) +} + +// SetMaxDynamicTableSizeLimit changes the maximum value that can be +// specified in SetMaxDynamicTableSize to v. By default, it is set to +// 4096, which is the same size of the default dynamic header table +// size described in HPACK specification. If the current maximum +// dynamic header table size is strictly greater than v, "Header Table +// Size Update" will be done in the next WriteField call and the +// maximum dynamic header table size is truncated to v. +func (e *Encoder) SetMaxDynamicTableSizeLimit(v uint32) { + e.maxSizeLimit = v + if e.dynTab.maxSize > v { + e.tableSizeUpdate = true + e.dynTab.setMaxSize(v) + } +} + +// shouldIndex reports whether f should be indexed. +func (e *Encoder) shouldIndex(f HeaderField) bool { + return !f.Sensitive && f.Size() <= e.dynTab.maxSize +} + +// appendIndexed appends index i, as encoded in "Indexed Header Field" +// representation, to dst and returns the extended buffer. +func appendIndexed(dst []byte, i uint64) []byte { + first := len(dst) + dst = appendVarInt(dst, 7, i) + dst[first] |= 0x80 + return dst +} + +// appendNewName appends f, as encoded in one of "Literal Header field +// - New Name" representation variants, to dst and returns the +// extended buffer. +// +// If f.Sensitive is true, "Never Indexed" representation is used. If +// f.Sensitive is false and indexing is true, "Inremental Indexing" +// representation is used. +func appendNewName(dst []byte, f HeaderField, indexing bool) []byte { + dst = append(dst, encodeTypeByte(indexing, f.Sensitive)) + dst = appendHpackString(dst, f.Name) + return appendHpackString(dst, f.Value) +} + +// appendIndexedName appends f and index i referring indexed name +// entry, as encoded in one of "Literal Header field - Indexed Name" +// representation variants, to dst and returns the extended buffer. +// +// If f.Sensitive is true, "Never Indexed" representation is used. If +// f.Sensitive is false and indexing is true, "Incremental Indexing" +// representation is used. +func appendIndexedName(dst []byte, f HeaderField, i uint64, indexing bool) []byte { + first := len(dst) + var n byte + if indexing { + n = 6 + } else { + n = 4 + } + dst = appendVarInt(dst, n, i) + dst[first] |= encodeTypeByte(indexing, f.Sensitive) + return appendHpackString(dst, f.Value) +} + +// appendTableSize appends v, as encoded in "Header Table Size Update" +// representation, to dst and returns the extended buffer. +func appendTableSize(dst []byte, v uint32) []byte { + first := len(dst) + dst = appendVarInt(dst, 5, uint64(v)) + dst[first] |= 0x20 + return dst +} + +// appendVarInt appends i, as encoded in variable integer form using n +// bit prefix, to dst and returns the extended buffer. +// +// See +// http://http2.github.io/http2-spec/compression.html#integer.representation +func appendVarInt(dst []byte, n byte, i uint64) []byte { + k := uint64((1 << n) - 1) + if i < k { + return append(dst, byte(i)) + } + dst = append(dst, byte(k)) + i -= k + for ; i >= 128; i >>= 7 { + dst = append(dst, byte(0x80|(i&0x7f))) + } + return append(dst, byte(i)) +} + +// appendHpackString appends s, as encoded in "String Literal" +// representation, to dst and returns the extended buffer. +// +// s will be encoded in Huffman codes only when it produces strictly +// shorter byte string. +func appendHpackString(dst []byte, s string) []byte { + huffmanLength := HuffmanEncodeLength(s) + if huffmanLength < uint64(len(s)) { + first := len(dst) + dst = appendVarInt(dst, 7, huffmanLength) + dst = AppendHuffmanString(dst, s) + dst[first] |= 0x80 + } else { + dst = appendVarInt(dst, 7, uint64(len(s))) + dst = append(dst, s...) + } + return dst +} + +// encodeTypeByte returns type byte. If sensitive is true, type byte +// for "Never Indexed" representation is returned. If sensitive is +// false and indexing is true, type byte for "Incremental Indexing" +// representation is returned. Otherwise, type byte for "Without +// Indexing" is returned. +func encodeTypeByte(indexing, sensitive bool) byte { + if sensitive { + return 0x10 + } + if indexing { + return 0x40 + } + return 0 +} diff --git a/api/vendor/golang.org/x/net/http2/hpack/encode_test.go b/api/vendor/golang.org/x/net/http2/hpack/encode_test.go new file mode 100644 index 0000000..05f12db --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/hpack/encode_test.go @@ -0,0 +1,386 @@ +// 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 hpack + +import ( + "bytes" + "encoding/hex" + "fmt" + "math/rand" + "reflect" + "strings" + "testing" +) + +func TestEncoderTableSizeUpdate(t *testing.T) { + tests := []struct { + size1, size2 uint32 + wantHex string + }{ + // Should emit 2 table size updates (2048 and 4096) + {2048, 4096, "3fe10f 3fe11f 82"}, + + // Should emit 1 table size update (2048) + {16384, 2048, "3fe10f 82"}, + } + for _, tt := range tests { + var buf bytes.Buffer + e := NewEncoder(&buf) + e.SetMaxDynamicTableSize(tt.size1) + e.SetMaxDynamicTableSize(tt.size2) + if err := e.WriteField(pair(":method", "GET")); err != nil { + t.Fatal(err) + } + want := removeSpace(tt.wantHex) + if got := hex.EncodeToString(buf.Bytes()); got != want { + t.Errorf("e.SetDynamicTableSize %v, %v = %q; want %q", tt.size1, tt.size2, got, want) + } + } +} + +func TestEncoderWriteField(t *testing.T) { + var buf bytes.Buffer + e := NewEncoder(&buf) + var got []HeaderField + d := NewDecoder(4<<10, func(f HeaderField) { + got = append(got, f) + }) + + tests := []struct { + hdrs []HeaderField + }{ + {[]HeaderField{ + pair(":method", "GET"), + pair(":scheme", "http"), + pair(":path", "/"), + pair(":authority", "www.example.com"), + }}, + {[]HeaderField{ + pair(":method", "GET"), + pair(":scheme", "http"), + pair(":path", "/"), + pair(":authority", "www.example.com"), + pair("cache-control", "no-cache"), + }}, + {[]HeaderField{ + pair(":method", "GET"), + pair(":scheme", "https"), + pair(":path", "/index.html"), + pair(":authority", "www.example.com"), + pair("custom-key", "custom-value"), + }}, + } + for i, tt := range tests { + buf.Reset() + got = got[:0] + for _, hf := range tt.hdrs { + if err := e.WriteField(hf); err != nil { + t.Fatal(err) + } + } + _, err := d.Write(buf.Bytes()) + if err != nil { + t.Errorf("%d. Decoder Write = %v", i, err) + } + if !reflect.DeepEqual(got, tt.hdrs) { + t.Errorf("%d. Decoded %+v; want %+v", i, got, tt.hdrs) + } + } +} + +func TestEncoderSearchTable(t *testing.T) { + e := NewEncoder(nil) + + e.dynTab.add(pair("foo", "bar")) + e.dynTab.add(pair("blake", "miz")) + e.dynTab.add(pair(":method", "GET")) + + tests := []struct { + hf HeaderField + wantI uint64 + wantMatch bool + }{ + // Name and Value match + {pair("foo", "bar"), uint64(staticTable.len()) + 3, true}, + {pair("blake", "miz"), uint64(staticTable.len()) + 2, true}, + {pair(":method", "GET"), 2, true}, + + // Only name match because Sensitive == true. This is allowed to match + // any ":method" entry. The current implementation uses the last entry + // added in newStaticTable. + {HeaderField{":method", "GET", true}, 3, false}, + + // Only Name matches + {pair("foo", "..."), uint64(staticTable.len()) + 3, false}, + {pair("blake", "..."), uint64(staticTable.len()) + 2, false}, + // As before, this is allowed to match any ":method" entry. + {pair(":method", "..."), 3, false}, + + // None match + {pair("foo-", "bar"), 0, false}, + } + for _, tt := range tests { + if gotI, gotMatch := e.searchTable(tt.hf); gotI != tt.wantI || gotMatch != tt.wantMatch { + t.Errorf("d.search(%+v) = %v, %v; want %v, %v", tt.hf, gotI, gotMatch, tt.wantI, tt.wantMatch) + } + } +} + +func TestAppendVarInt(t *testing.T) { + tests := []struct { + n byte + i uint64 + want []byte + }{ + // Fits in a byte: + {1, 0, []byte{0}}, + {2, 2, []byte{2}}, + {3, 6, []byte{6}}, + {4, 14, []byte{14}}, + {5, 30, []byte{30}}, + {6, 62, []byte{62}}, + {7, 126, []byte{126}}, + {8, 254, []byte{254}}, + + // Multiple bytes: + {5, 1337, []byte{31, 154, 10}}, + } + for _, tt := range tests { + got := appendVarInt(nil, tt.n, tt.i) + if !bytes.Equal(got, tt.want) { + t.Errorf("appendVarInt(nil, %v, %v) = %v; want %v", tt.n, tt.i, got, tt.want) + } + } +} + +func TestAppendHpackString(t *testing.T) { + tests := []struct { + s, wantHex string + }{ + // Huffman encoded + {"www.example.com", "8c f1e3 c2e5 f23a 6ba0 ab90 f4ff"}, + + // Not Huffman encoded + {"a", "01 61"}, + + // zero length + {"", "00"}, + } + for _, tt := range tests { + want := removeSpace(tt.wantHex) + buf := appendHpackString(nil, tt.s) + if got := hex.EncodeToString(buf); want != got { + t.Errorf("appendHpackString(nil, %q) = %q; want %q", tt.s, got, want) + } + } +} + +func TestAppendIndexed(t *testing.T) { + tests := []struct { + i uint64 + wantHex string + }{ + // 1 byte + {1, "81"}, + {126, "fe"}, + + // 2 bytes + {127, "ff00"}, + {128, "ff01"}, + } + for _, tt := range tests { + want := removeSpace(tt.wantHex) + buf := appendIndexed(nil, tt.i) + if got := hex.EncodeToString(buf); want != got { + t.Errorf("appendIndex(nil, %v) = %q; want %q", tt.i, got, want) + } + } +} + +func TestAppendNewName(t *testing.T) { + tests := []struct { + f HeaderField + indexing bool + wantHex string + }{ + // Incremental indexing + {HeaderField{"custom-key", "custom-value", false}, true, "40 88 25a8 49e9 5ba9 7d7f 89 25a8 49e9 5bb8 e8b4 bf"}, + + // Without indexing + {HeaderField{"custom-key", "custom-value", false}, false, "00 88 25a8 49e9 5ba9 7d7f 89 25a8 49e9 5bb8 e8b4 bf"}, + + // Never indexed + {HeaderField{"custom-key", "custom-value", true}, true, "10 88 25a8 49e9 5ba9 7d7f 89 25a8 49e9 5bb8 e8b4 bf"}, + {HeaderField{"custom-key", "custom-value", true}, false, "10 88 25a8 49e9 5ba9 7d7f 89 25a8 49e9 5bb8 e8b4 bf"}, + } + for _, tt := range tests { + want := removeSpace(tt.wantHex) + buf := appendNewName(nil, tt.f, tt.indexing) + if got := hex.EncodeToString(buf); want != got { + t.Errorf("appendNewName(nil, %+v, %v) = %q; want %q", tt.f, tt.indexing, got, want) + } + } +} + +func TestAppendIndexedName(t *testing.T) { + tests := []struct { + f HeaderField + i uint64 + indexing bool + wantHex string + }{ + // Incremental indexing + {HeaderField{":status", "302", false}, 8, true, "48 82 6402"}, + + // Without indexing + {HeaderField{":status", "302", false}, 8, false, "08 82 6402"}, + + // Never indexed + {HeaderField{":status", "302", true}, 8, true, "18 82 6402"}, + {HeaderField{":status", "302", true}, 8, false, "18 82 6402"}, + } + for _, tt := range tests { + want := removeSpace(tt.wantHex) + buf := appendIndexedName(nil, tt.f, tt.i, tt.indexing) + if got := hex.EncodeToString(buf); want != got { + t.Errorf("appendIndexedName(nil, %+v, %v) = %q; want %q", tt.f, tt.indexing, got, want) + } + } +} + +func TestAppendTableSize(t *testing.T) { + tests := []struct { + i uint32 + wantHex string + }{ + // Fits into 1 byte + {30, "3e"}, + + // Extra byte + {31, "3f00"}, + {32, "3f01"}, + } + for _, tt := range tests { + want := removeSpace(tt.wantHex) + buf := appendTableSize(nil, tt.i) + if got := hex.EncodeToString(buf); want != got { + t.Errorf("appendTableSize(nil, %v) = %q; want %q", tt.i, got, want) + } + } +} + +func TestEncoderSetMaxDynamicTableSize(t *testing.T) { + var buf bytes.Buffer + e := NewEncoder(&buf) + tests := []struct { + v uint32 + wantUpdate bool + wantMinSize uint32 + wantMaxSize uint32 + }{ + // Set new table size to 2048 + {2048, true, 2048, 2048}, + + // Set new table size to 16384, but still limited to + // 4096 + {16384, true, 2048, 4096}, + } + for _, tt := range tests { + e.SetMaxDynamicTableSize(tt.v) + if got := e.tableSizeUpdate; tt.wantUpdate != got { + t.Errorf("e.tableSizeUpdate = %v; want %v", got, tt.wantUpdate) + } + if got := e.minSize; tt.wantMinSize != got { + t.Errorf("e.minSize = %v; want %v", got, tt.wantMinSize) + } + if got := e.dynTab.maxSize; tt.wantMaxSize != got { + t.Errorf("e.maxSize = %v; want %v", got, tt.wantMaxSize) + } + } +} + +func TestEncoderSetMaxDynamicTableSizeLimit(t *testing.T) { + e := NewEncoder(nil) + // 4095 < initialHeaderTableSize means maxSize is truncated to + // 4095. + e.SetMaxDynamicTableSizeLimit(4095) + if got, want := e.dynTab.maxSize, uint32(4095); got != want { + t.Errorf("e.dynTab.maxSize = %v; want %v", got, want) + } + if got, want := e.maxSizeLimit, uint32(4095); got != want { + t.Errorf("e.maxSizeLimit = %v; want %v", got, want) + } + if got, want := e.tableSizeUpdate, true; got != want { + t.Errorf("e.tableSizeUpdate = %v; want %v", got, want) + } + // maxSize will be truncated to maxSizeLimit + e.SetMaxDynamicTableSize(16384) + if got, want := e.dynTab.maxSize, uint32(4095); got != want { + t.Errorf("e.dynTab.maxSize = %v; want %v", got, want) + } + // 8192 > current maxSizeLimit, so maxSize does not change. + e.SetMaxDynamicTableSizeLimit(8192) + if got, want := e.dynTab.maxSize, uint32(4095); got != want { + t.Errorf("e.dynTab.maxSize = %v; want %v", got, want) + } + if got, want := e.maxSizeLimit, uint32(8192); got != want { + t.Errorf("e.maxSizeLimit = %v; want %v", got, want) + } +} + +func removeSpace(s string) string { + return strings.Replace(s, " ", "", -1) +} + +func BenchmarkEncoderSearchTable(b *testing.B) { + e := NewEncoder(nil) + + // A sample of possible header fields. + // This is not based on any actual data from HTTP/2 traces. + var possible []HeaderField + for _, f := range staticTable.ents { + if f.Value == "" { + possible = append(possible, f) + continue + } + // Generate 5 random values, except for cookie and set-cookie, + // which we know can have many values in practice. + num := 5 + if f.Name == "cookie" || f.Name == "set-cookie" { + num = 25 + } + for i := 0; i < num; i++ { + f.Value = fmt.Sprintf("%s-%d", f.Name, i) + possible = append(possible, f) + } + } + for k := 0; k < 10; k++ { + f := HeaderField{ + Name: fmt.Sprintf("x-header-%d", k), + Sensitive: rand.Int()%2 == 0, + } + for i := 0; i < 5; i++ { + f.Value = fmt.Sprintf("%s-%d", f.Name, i) + possible = append(possible, f) + } + } + + // Add a random sample to the dynamic table. This very loosely simulates + // a history of 100 requests with 20 header fields per request. + for r := 0; r < 100*20; r++ { + f := possible[rand.Int31n(int32(len(possible)))] + // Skip if this is in the staticTable verbatim. + if _, has := staticTable.search(f); !has { + e.dynTab.add(f) + } + } + + b.ResetTimer() + for n := 0; n < b.N; n++ { + for _, f := range possible { + e.searchTable(f) + } + } +} diff --git a/api/vendor/golang.org/x/net/http2/hpack/hpack.go b/api/vendor/golang.org/x/net/http2/hpack/hpack.go new file mode 100644 index 0000000..166788c --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/hpack/hpack.go @@ -0,0 +1,496 @@ +// 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 hpack implements HPACK, a compression format for +// efficiently representing HTTP header fields in the context of HTTP/2. +// +// See http://tools.ietf.org/html/draft-ietf-httpbis-header-compression-09 +package hpack + +import ( + "bytes" + "errors" + "fmt" +) + +// A DecodingError is something the spec defines as a decoding error. +type DecodingError struct { + Err error +} + +func (de DecodingError) Error() string { + return fmt.Sprintf("decoding error: %v", de.Err) +} + +// An InvalidIndexError is returned when an encoder references a table +// entry before the static table or after the end of the dynamic table. +type InvalidIndexError int + +func (e InvalidIndexError) Error() string { + return fmt.Sprintf("invalid indexed representation index %d", int(e)) +} + +// A HeaderField is a name-value pair. Both the name and value are +// treated as opaque sequences of octets. +type HeaderField struct { + Name, Value string + + // Sensitive means that this header field should never be + // indexed. + Sensitive bool +} + +// IsPseudo reports whether the header field is an http2 pseudo header. +// That is, it reports whether it starts with a colon. +// It is not otherwise guaranteed to be a valid pseudo header field, +// though. +func (hf HeaderField) IsPseudo() bool { + return len(hf.Name) != 0 && hf.Name[0] == ':' +} + +func (hf HeaderField) String() string { + var suffix string + if hf.Sensitive { + suffix = " (sensitive)" + } + return fmt.Sprintf("header field %q = %q%s", hf.Name, hf.Value, suffix) +} + +// Size returns the size of an entry per RFC 7541 section 4.1. +func (hf HeaderField) Size() uint32 { + // http://http2.github.io/http2-spec/compression.html#rfc.section.4.1 + // "The size of the dynamic table is the sum of the size of + // its entries. The size of an entry is the sum of its name's + // length in octets (as defined in Section 5.2), its value's + // length in octets (see Section 5.2), plus 32. The size of + // an entry is calculated using the length of the name and + // value without any Huffman encoding applied." + + // This can overflow if somebody makes a large HeaderField + // Name and/or Value by hand, but we don't care, because that + // won't happen on the wire because the encoding doesn't allow + // it. + return uint32(len(hf.Name) + len(hf.Value) + 32) +} + +// A Decoder is the decoding context for incremental processing of +// header blocks. +type Decoder struct { + dynTab dynamicTable + emit func(f HeaderField) + + emitEnabled bool // whether calls to emit are enabled + maxStrLen int // 0 means unlimited + + // buf is the unparsed buffer. It's only written to + // saveBuf if it was truncated in the middle of a header + // block. Because it's usually not owned, we can only + // process it under Write. + buf []byte // not owned; only valid during Write + + // saveBuf is previous data passed to Write which we weren't able + // to fully parse before. Unlike buf, we own this data. + saveBuf bytes.Buffer +} + +// NewDecoder returns a new decoder with the provided maximum dynamic +// table size. The emitFunc will be called for each valid field +// parsed, in the same goroutine as calls to Write, before Write returns. +func NewDecoder(maxDynamicTableSize uint32, emitFunc func(f HeaderField)) *Decoder { + d := &Decoder{ + emit: emitFunc, + emitEnabled: true, + } + d.dynTab.table.init() + d.dynTab.allowedMaxSize = maxDynamicTableSize + d.dynTab.setMaxSize(maxDynamicTableSize) + return d +} + +// ErrStringLength is returned by Decoder.Write when the max string length +// (as configured by Decoder.SetMaxStringLength) would be violated. +var ErrStringLength = errors.New("hpack: string too long") + +// SetMaxStringLength sets the maximum size of a HeaderField name or +// value string. If a string exceeds this length (even after any +// decompression), Write will return ErrStringLength. +// A value of 0 means unlimited and is the default from NewDecoder. +func (d *Decoder) SetMaxStringLength(n int) { + d.maxStrLen = n +} + +// SetEmitFunc changes the callback used when new header fields +// are decoded. +// It must be non-nil. It does not affect EmitEnabled. +func (d *Decoder) SetEmitFunc(emitFunc func(f HeaderField)) { + d.emit = emitFunc +} + +// SetEmitEnabled controls whether the emitFunc provided to NewDecoder +// should be called. The default is true. +// +// This facility exists to let servers enforce MAX_HEADER_LIST_SIZE +// while still decoding and keeping in-sync with decoder state, but +// without doing unnecessary decompression or generating unnecessary +// garbage for header fields past the limit. +func (d *Decoder) SetEmitEnabled(v bool) { d.emitEnabled = v } + +// EmitEnabled reports whether calls to the emitFunc provided to NewDecoder +// are currently enabled. The default is true. +func (d *Decoder) EmitEnabled() bool { return d.emitEnabled } + +// TODO: add method *Decoder.Reset(maxSize, emitFunc) to let callers re-use Decoders and their +// underlying buffers for garbage reasons. + +func (d *Decoder) SetMaxDynamicTableSize(v uint32) { + d.dynTab.setMaxSize(v) +} + +// SetAllowedMaxDynamicTableSize sets the upper bound that the encoded +// stream (via dynamic table size updates) may set the maximum size +// to. +func (d *Decoder) SetAllowedMaxDynamicTableSize(v uint32) { + d.dynTab.allowedMaxSize = v +} + +type dynamicTable struct { + // http://http2.github.io/http2-spec/compression.html#rfc.section.2.3.2 + table headerFieldTable + size uint32 // in bytes + maxSize uint32 // current maxSize + allowedMaxSize uint32 // maxSize may go up to this, inclusive +} + +func (dt *dynamicTable) setMaxSize(v uint32) { + dt.maxSize = v + dt.evict() +} + +func (dt *dynamicTable) add(f HeaderField) { + dt.table.addEntry(f) + dt.size += f.Size() + dt.evict() +} + +// If we're too big, evict old stuff. +func (dt *dynamicTable) evict() { + var n int + for dt.size > dt.maxSize && n < dt.table.len() { + dt.size -= dt.table.ents[n].Size() + n++ + } + dt.table.evictOldest(n) +} + +func (d *Decoder) maxTableIndex() int { + // This should never overflow. RFC 7540 Section 6.5.2 limits the size of + // the dynamic table to 2^32 bytes, where each entry will occupy more than + // one byte. Further, the staticTable has a fixed, small length. + return d.dynTab.table.len() + staticTable.len() +} + +func (d *Decoder) at(i uint64) (hf HeaderField, ok bool) { + // See Section 2.3.3. + if i == 0 { + return + } + if i <= uint64(staticTable.len()) { + return staticTable.ents[i-1], true + } + if i > uint64(d.maxTableIndex()) { + return + } + // In the dynamic table, newer entries have lower indices. + // However, dt.ents[0] is the oldest entry. Hence, dt.ents is + // the reversed dynamic table. + dt := d.dynTab.table + return dt.ents[dt.len()-(int(i)-staticTable.len())], true +} + +// Decode decodes an entire block. +// +// TODO: remove this method and make it incremental later? This is +// easier for debugging now. +func (d *Decoder) DecodeFull(p []byte) ([]HeaderField, error) { + var hf []HeaderField + saveFunc := d.emit + defer func() { d.emit = saveFunc }() + d.emit = func(f HeaderField) { hf = append(hf, f) } + if _, err := d.Write(p); err != nil { + return nil, err + } + if err := d.Close(); err != nil { + return nil, err + } + return hf, nil +} + +func (d *Decoder) Close() error { + if d.saveBuf.Len() > 0 { + d.saveBuf.Reset() + return DecodingError{errors.New("truncated headers")} + } + return nil +} + +func (d *Decoder) Write(p []byte) (n int, err error) { + if len(p) == 0 { + // Prevent state machine CPU attacks (making us redo + // work up to the point of finding out we don't have + // enough data) + return + } + // Only copy the data if we have to. Optimistically assume + // that p will contain a complete header block. + if d.saveBuf.Len() == 0 { + d.buf = p + } else { + d.saveBuf.Write(p) + d.buf = d.saveBuf.Bytes() + d.saveBuf.Reset() + } + + for len(d.buf) > 0 { + err = d.parseHeaderFieldRepr() + if err == errNeedMore { + // Extra paranoia, making sure saveBuf won't + // get too large. All the varint and string + // reading code earlier should already catch + // overlong things and return ErrStringLength, + // but keep this as a last resort. + const varIntOverhead = 8 // conservative + if d.maxStrLen != 0 && int64(len(d.buf)) > 2*(int64(d.maxStrLen)+varIntOverhead) { + return 0, ErrStringLength + } + d.saveBuf.Write(d.buf) + return len(p), nil + } + if err != nil { + break + } + } + return len(p), err +} + +// errNeedMore is an internal sentinel error value that means the +// buffer is truncated and we need to read more data before we can +// continue parsing. +var errNeedMore = errors.New("need more data") + +type indexType int + +const ( + indexedTrue indexType = iota + indexedFalse + indexedNever +) + +func (v indexType) indexed() bool { return v == indexedTrue } +func (v indexType) sensitive() bool { return v == indexedNever } + +// returns errNeedMore if there isn't enough data available. +// any other error is fatal. +// consumes d.buf iff it returns nil. +// precondition: must be called with len(d.buf) > 0 +func (d *Decoder) parseHeaderFieldRepr() error { + b := d.buf[0] + switch { + case b&128 != 0: + // Indexed representation. + // High bit set? + // http://http2.github.io/http2-spec/compression.html#rfc.section.6.1 + return d.parseFieldIndexed() + case b&192 == 64: + // 6.2.1 Literal Header Field with Incremental Indexing + // 0b10xxxxxx: top two bits are 10 + // http://http2.github.io/http2-spec/compression.html#rfc.section.6.2.1 + return d.parseFieldLiteral(6, indexedTrue) + case b&240 == 0: + // 6.2.2 Literal Header Field without Indexing + // 0b0000xxxx: top four bits are 0000 + // http://http2.github.io/http2-spec/compression.html#rfc.section.6.2.2 + return d.parseFieldLiteral(4, indexedFalse) + case b&240 == 16: + // 6.2.3 Literal Header Field never Indexed + // 0b0001xxxx: top four bits are 0001 + // http://http2.github.io/http2-spec/compression.html#rfc.section.6.2.3 + return d.parseFieldLiteral(4, indexedNever) + case b&224 == 32: + // 6.3 Dynamic Table Size Update + // Top three bits are '001'. + // http://http2.github.io/http2-spec/compression.html#rfc.section.6.3 + return d.parseDynamicTableSizeUpdate() + } + + return DecodingError{errors.New("invalid encoding")} +} + +// (same invariants and behavior as parseHeaderFieldRepr) +func (d *Decoder) parseFieldIndexed() error { + buf := d.buf + idx, buf, err := readVarInt(7, buf) + if err != nil { + return err + } + hf, ok := d.at(idx) + if !ok { + return DecodingError{InvalidIndexError(idx)} + } + d.buf = buf + return d.callEmit(HeaderField{Name: hf.Name, Value: hf.Value}) +} + +// (same invariants and behavior as parseHeaderFieldRepr) +func (d *Decoder) parseFieldLiteral(n uint8, it indexType) error { + buf := d.buf + nameIdx, buf, err := readVarInt(n, buf) + if err != nil { + return err + } + + var hf HeaderField + wantStr := d.emitEnabled || it.indexed() + if nameIdx > 0 { + ihf, ok := d.at(nameIdx) + if !ok { + return DecodingError{InvalidIndexError(nameIdx)} + } + hf.Name = ihf.Name + } else { + hf.Name, buf, err = d.readString(buf, wantStr) + if err != nil { + return err + } + } + hf.Value, buf, err = d.readString(buf, wantStr) + if err != nil { + return err + } + d.buf = buf + if it.indexed() { + d.dynTab.add(hf) + } + hf.Sensitive = it.sensitive() + return d.callEmit(hf) +} + +func (d *Decoder) callEmit(hf HeaderField) error { + if d.maxStrLen != 0 { + if len(hf.Name) > d.maxStrLen || len(hf.Value) > d.maxStrLen { + return ErrStringLength + } + } + if d.emitEnabled { + d.emit(hf) + } + return nil +} + +// (same invariants and behavior as parseHeaderFieldRepr) +func (d *Decoder) parseDynamicTableSizeUpdate() error { + // RFC 7541, sec 4.2: This dynamic table size update MUST occur at the + // beginning of the first header block following the change to the dynamic table size. + if d.dynTab.size > 0 { + return DecodingError{errors.New("dynamic table size update MUST occur at the beginning of a header block")} + } + + buf := d.buf + size, buf, err := readVarInt(5, buf) + if err != nil { + return err + } + if size > uint64(d.dynTab.allowedMaxSize) { + return DecodingError{errors.New("dynamic table size update too large")} + } + d.dynTab.setMaxSize(uint32(size)) + d.buf = buf + return nil +} + +var errVarintOverflow = DecodingError{errors.New("varint integer overflow")} + +// readVarInt reads an unsigned variable length integer off the +// beginning of p. n is the parameter as described in +// http://http2.github.io/http2-spec/compression.html#rfc.section.5.1. +// +// n must always be between 1 and 8. +// +// The returned remain buffer is either a smaller suffix of p, or err != nil. +// The error is errNeedMore if p doesn't contain a complete integer. +func readVarInt(n byte, p []byte) (i uint64, remain []byte, err error) { + if n < 1 || n > 8 { + panic("bad n") + } + if len(p) == 0 { + return 0, p, errNeedMore + } + i = uint64(p[0]) + if n < 8 { + i &= (1 << uint64(n)) - 1 + } + if i < (1< 0 { + b := p[0] + p = p[1:] + i += uint64(b&127) << m + if b&128 == 0 { + return i, p, nil + } + m += 7 + if m >= 63 { // TODO: proper overflow check. making this up. + return 0, origP, errVarintOverflow + } + } + return 0, origP, errNeedMore +} + +// readString decodes an hpack string from p. +// +// wantStr is whether s will be used. If false, decompression and +// []byte->string garbage are skipped if s will be ignored +// anyway. This does mean that huffman decoding errors for non-indexed +// strings past the MAX_HEADER_LIST_SIZE are ignored, but the server +// is returning an error anyway, and because they're not indexed, the error +// won't affect the decoding state. +func (d *Decoder) readString(p []byte, wantStr bool) (s string, remain []byte, err error) { + if len(p) == 0 { + return "", p, errNeedMore + } + isHuff := p[0]&128 != 0 + strLen, p, err := readVarInt(7, p) + if err != nil { + return "", p, err + } + if d.maxStrLen != 0 && strLen > uint64(d.maxStrLen) { + return "", nil, ErrStringLength + } + if uint64(len(p)) < strLen { + return "", p, errNeedMore + } + if !isHuff { + if wantStr { + s = string(p[:strLen]) + } + return s, p[strLen:], nil + } + + if wantStr { + buf := bufPool.Get().(*bytes.Buffer) + buf.Reset() // don't trust others + defer bufPool.Put(buf) + if err := huffmanDecode(buf, d.maxStrLen, p[:strLen]); err != nil { + buf.Reset() + return "", nil, err + } + s = buf.String() + buf.Reset() // be nice to GC + } + return s, p[strLen:], nil +} diff --git a/api/vendor/golang.org/x/net/http2/hpack/hpack_test.go b/api/vendor/golang.org/x/net/http2/hpack/hpack_test.go new file mode 100644 index 0000000..974c35f --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/hpack/hpack_test.go @@ -0,0 +1,741 @@ +// 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 hpack + +import ( + "bytes" + "encoding/hex" + "fmt" + "math/rand" + "reflect" + "strings" + "testing" + "time" +) + +func (d *Decoder) mustAt(idx int) HeaderField { + if hf, ok := d.at(uint64(idx)); !ok { + panic(fmt.Sprintf("bogus index %d", idx)) + } else { + return hf + } +} + +func TestDynamicTableAt(t *testing.T) { + d := NewDecoder(4096, nil) + at := d.mustAt + if got, want := at(2), (pair(":method", "GET")); got != want { + t.Errorf("at(2) = %v; want %v", got, want) + } + d.dynTab.add(pair("foo", "bar")) + d.dynTab.add(pair("blake", "miz")) + if got, want := at(staticTable.len()+1), (pair("blake", "miz")); got != want { + t.Errorf("at(dyn 1) = %v; want %v", got, want) + } + if got, want := at(staticTable.len()+2), (pair("foo", "bar")); got != want { + t.Errorf("at(dyn 2) = %v; want %v", got, want) + } + if got, want := at(3), (pair(":method", "POST")); got != want { + t.Errorf("at(3) = %v; want %v", got, want) + } +} + +func TestDynamicTableSizeEvict(t *testing.T) { + d := NewDecoder(4096, nil) + if want := uint32(0); d.dynTab.size != want { + t.Fatalf("size = %d; want %d", d.dynTab.size, want) + } + add := d.dynTab.add + add(pair("blake", "eats pizza")) + if want := uint32(15 + 32); d.dynTab.size != want { + t.Fatalf("after pizza, size = %d; want %d", d.dynTab.size, want) + } + add(pair("foo", "bar")) + if want := uint32(15 + 32 + 6 + 32); d.dynTab.size != want { + t.Fatalf("after foo bar, size = %d; want %d", d.dynTab.size, want) + } + d.dynTab.setMaxSize(15 + 32 + 1 /* slop */) + if want := uint32(6 + 32); d.dynTab.size != want { + t.Fatalf("after setMaxSize, size = %d; want %d", d.dynTab.size, want) + } + if got, want := d.mustAt(staticTable.len()+1), (pair("foo", "bar")); got != want { + t.Errorf("at(dyn 1) = %v; want %v", got, want) + } + add(pair("long", strings.Repeat("x", 500))) + if want := uint32(0); d.dynTab.size != want { + t.Fatalf("after big one, size = %d; want %d", d.dynTab.size, want) + } +} + +func TestDecoderDecode(t *testing.T) { + tests := []struct { + name string + in []byte + want []HeaderField + wantDynTab []HeaderField // newest entry first + }{ + // C.2.1 Literal Header Field with Indexing + // http://http2.github.io/http2-spec/compression.html#rfc.section.C.2.1 + {"C.2.1", dehex("400a 6375 7374 6f6d 2d6b 6579 0d63 7573 746f 6d2d 6865 6164 6572"), + []HeaderField{pair("custom-key", "custom-header")}, + []HeaderField{pair("custom-key", "custom-header")}, + }, + + // C.2.2 Literal Header Field without Indexing + // http://http2.github.io/http2-spec/compression.html#rfc.section.C.2.2 + {"C.2.2", dehex("040c 2f73 616d 706c 652f 7061 7468"), + []HeaderField{pair(":path", "/sample/path")}, + []HeaderField{}}, + + // C.2.3 Literal Header Field never Indexed + // http://http2.github.io/http2-spec/compression.html#rfc.section.C.2.3 + {"C.2.3", dehex("1008 7061 7373 776f 7264 0673 6563 7265 74"), + []HeaderField{{"password", "secret", true}}, + []HeaderField{}}, + + // C.2.4 Indexed Header Field + // http://http2.github.io/http2-spec/compression.html#rfc.section.C.2.4 + {"C.2.4", []byte("\x82"), + []HeaderField{pair(":method", "GET")}, + []HeaderField{}}, + } + for _, tt := range tests { + d := NewDecoder(4096, nil) + hf, err := d.DecodeFull(tt.in) + if err != nil { + t.Errorf("%s: %v", tt.name, err) + continue + } + if !reflect.DeepEqual(hf, tt.want) { + t.Errorf("%s: Got %v; want %v", tt.name, hf, tt.want) + } + gotDynTab := d.dynTab.reverseCopy() + if !reflect.DeepEqual(gotDynTab, tt.wantDynTab) { + t.Errorf("%s: dynamic table after = %v; want %v", tt.name, gotDynTab, tt.wantDynTab) + } + } +} + +func (dt *dynamicTable) reverseCopy() (hf []HeaderField) { + hf = make([]HeaderField, len(dt.table.ents)) + for i := range hf { + hf[i] = dt.table.ents[len(dt.table.ents)-1-i] + } + return +} + +type encAndWant struct { + enc []byte + want []HeaderField + wantDynTab []HeaderField + wantDynSize uint32 +} + +// C.3 Request Examples without Huffman Coding +// http://http2.github.io/http2-spec/compression.html#rfc.section.C.3 +func TestDecodeC3_NoHuffman(t *testing.T) { + testDecodeSeries(t, 4096, []encAndWant{ + {dehex("8286 8441 0f77 7777 2e65 7861 6d70 6c65 2e63 6f6d"), + []HeaderField{ + pair(":method", "GET"), + pair(":scheme", "http"), + pair(":path", "/"), + pair(":authority", "www.example.com"), + }, + []HeaderField{ + pair(":authority", "www.example.com"), + }, + 57, + }, + {dehex("8286 84be 5808 6e6f 2d63 6163 6865"), + []HeaderField{ + pair(":method", "GET"), + pair(":scheme", "http"), + pair(":path", "/"), + pair(":authority", "www.example.com"), + pair("cache-control", "no-cache"), + }, + []HeaderField{ + pair("cache-control", "no-cache"), + pair(":authority", "www.example.com"), + }, + 110, + }, + {dehex("8287 85bf 400a 6375 7374 6f6d 2d6b 6579 0c63 7573 746f 6d2d 7661 6c75 65"), + []HeaderField{ + pair(":method", "GET"), + pair(":scheme", "https"), + pair(":path", "/index.html"), + pair(":authority", "www.example.com"), + pair("custom-key", "custom-value"), + }, + []HeaderField{ + pair("custom-key", "custom-value"), + pair("cache-control", "no-cache"), + pair(":authority", "www.example.com"), + }, + 164, + }, + }) +} + +// C.4 Request Examples with Huffman Coding +// http://http2.github.io/http2-spec/compression.html#rfc.section.C.4 +func TestDecodeC4_Huffman(t *testing.T) { + testDecodeSeries(t, 4096, []encAndWant{ + {dehex("8286 8441 8cf1 e3c2 e5f2 3a6b a0ab 90f4 ff"), + []HeaderField{ + pair(":method", "GET"), + pair(":scheme", "http"), + pair(":path", "/"), + pair(":authority", "www.example.com"), + }, + []HeaderField{ + pair(":authority", "www.example.com"), + }, + 57, + }, + {dehex("8286 84be 5886 a8eb 1064 9cbf"), + []HeaderField{ + pair(":method", "GET"), + pair(":scheme", "http"), + pair(":path", "/"), + pair(":authority", "www.example.com"), + pair("cache-control", "no-cache"), + }, + []HeaderField{ + pair("cache-control", "no-cache"), + pair(":authority", "www.example.com"), + }, + 110, + }, + {dehex("8287 85bf 4088 25a8 49e9 5ba9 7d7f 8925 a849 e95b b8e8 b4bf"), + []HeaderField{ + pair(":method", "GET"), + pair(":scheme", "https"), + pair(":path", "/index.html"), + pair(":authority", "www.example.com"), + pair("custom-key", "custom-value"), + }, + []HeaderField{ + pair("custom-key", "custom-value"), + pair("cache-control", "no-cache"), + pair(":authority", "www.example.com"), + }, + 164, + }, + }) +} + +// http://http2.github.io/http2-spec/compression.html#rfc.section.C.5 +// "This section shows several consecutive header lists, corresponding +// to HTTP responses, on the same connection. The HTTP/2 setting +// parameter SETTINGS_HEADER_TABLE_SIZE is set to the value of 256 +// octets, causing some evictions to occur." +func TestDecodeC5_ResponsesNoHuff(t *testing.T) { + testDecodeSeries(t, 256, []encAndWant{ + {dehex(` +4803 3330 3258 0770 7269 7661 7465 611d +4d6f 6e2c 2032 3120 4f63 7420 3230 3133 +2032 303a 3133 3a32 3120 474d 546e 1768 +7474 7073 3a2f 2f77 7777 2e65 7861 6d70 +6c65 2e63 6f6d +`), + []HeaderField{ + pair(":status", "302"), + pair("cache-control", "private"), + pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"), + pair("location", "https://www.example.com"), + }, + []HeaderField{ + pair("location", "https://www.example.com"), + pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"), + pair("cache-control", "private"), + pair(":status", "302"), + }, + 222, + }, + {dehex("4803 3330 37c1 c0bf"), + []HeaderField{ + pair(":status", "307"), + pair("cache-control", "private"), + pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"), + pair("location", "https://www.example.com"), + }, + []HeaderField{ + pair(":status", "307"), + pair("location", "https://www.example.com"), + pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"), + pair("cache-control", "private"), + }, + 222, + }, + {dehex(` +88c1 611d 4d6f 6e2c 2032 3120 4f63 7420 +3230 3133 2032 303a 3133 3a32 3220 474d +54c0 5a04 677a 6970 7738 666f 6f3d 4153 +444a 4b48 514b 425a 584f 5157 454f 5049 +5541 5851 5745 4f49 553b 206d 6178 2d61 +6765 3d33 3630 303b 2076 6572 7369 6f6e +3d31 +`), + []HeaderField{ + pair(":status", "200"), + pair("cache-control", "private"), + pair("date", "Mon, 21 Oct 2013 20:13:22 GMT"), + pair("location", "https://www.example.com"), + pair("content-encoding", "gzip"), + pair("set-cookie", "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1"), + }, + []HeaderField{ + pair("set-cookie", "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1"), + pair("content-encoding", "gzip"), + pair("date", "Mon, 21 Oct 2013 20:13:22 GMT"), + }, + 215, + }, + }) +} + +// http://http2.github.io/http2-spec/compression.html#rfc.section.C.6 +// "This section shows the same examples as the previous section, but +// using Huffman encoding for the literal values. The HTTP/2 setting +// parameter SETTINGS_HEADER_TABLE_SIZE is set to the value of 256 +// octets, causing some evictions to occur. The eviction mechanism +// uses the length of the decoded literal values, so the same +// evictions occurs as in the previous section." +func TestDecodeC6_ResponsesHuffman(t *testing.T) { + testDecodeSeries(t, 256, []encAndWant{ + {dehex(` +4882 6402 5885 aec3 771a 4b61 96d0 7abe +9410 54d4 44a8 2005 9504 0b81 66e0 82a6 +2d1b ff6e 919d 29ad 1718 63c7 8f0b 97c8 +e9ae 82ae 43d3 +`), + []HeaderField{ + pair(":status", "302"), + pair("cache-control", "private"), + pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"), + pair("location", "https://www.example.com"), + }, + []HeaderField{ + pair("location", "https://www.example.com"), + pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"), + pair("cache-control", "private"), + pair(":status", "302"), + }, + 222, + }, + {dehex("4883 640e ffc1 c0bf"), + []HeaderField{ + pair(":status", "307"), + pair("cache-control", "private"), + pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"), + pair("location", "https://www.example.com"), + }, + []HeaderField{ + pair(":status", "307"), + pair("location", "https://www.example.com"), + pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"), + pair("cache-control", "private"), + }, + 222, + }, + {dehex(` +88c1 6196 d07a be94 1054 d444 a820 0595 +040b 8166 e084 a62d 1bff c05a 839b d9ab +77ad 94e7 821d d7f2 e6c7 b335 dfdf cd5b +3960 d5af 2708 7f36 72c1 ab27 0fb5 291f +9587 3160 65c0 03ed 4ee5 b106 3d50 07 +`), + []HeaderField{ + pair(":status", "200"), + pair("cache-control", "private"), + pair("date", "Mon, 21 Oct 2013 20:13:22 GMT"), + pair("location", "https://www.example.com"), + pair("content-encoding", "gzip"), + pair("set-cookie", "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1"), + }, + []HeaderField{ + pair("set-cookie", "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1"), + pair("content-encoding", "gzip"), + pair("date", "Mon, 21 Oct 2013 20:13:22 GMT"), + }, + 215, + }, + }) +} + +func testDecodeSeries(t *testing.T, size uint32, steps []encAndWant) { + d := NewDecoder(size, nil) + for i, step := range steps { + hf, err := d.DecodeFull(step.enc) + if err != nil { + t.Fatalf("Error at step index %d: %v", i, err) + } + if !reflect.DeepEqual(hf, step.want) { + t.Fatalf("At step index %d: Got headers %v; want %v", i, hf, step.want) + } + gotDynTab := d.dynTab.reverseCopy() + if !reflect.DeepEqual(gotDynTab, step.wantDynTab) { + t.Errorf("After step index %d, dynamic table = %v; want %v", i, gotDynTab, step.wantDynTab) + } + if d.dynTab.size != step.wantDynSize { + t.Errorf("After step index %d, dynamic table size = %v; want %v", i, d.dynTab.size, step.wantDynSize) + } + } +} + +func TestHuffmanDecodeExcessPadding(t *testing.T) { + tests := [][]byte{ + {0xff}, // Padding Exceeds 7 bits + {0x1f, 0xff}, // {"a", 1 byte excess padding} + {0x1f, 0xff, 0xff}, // {"a", 2 byte excess padding} + {0x1f, 0xff, 0xff, 0xff}, // {"a", 3 byte excess padding} + {0xff, 0x9f, 0xff, 0xff, 0xff}, // {"a", 29 bit excess padding} + {'R', 0xbc, '0', 0xff, 0xff, 0xff, 0xff}, // Padding ends on partial symbol. + } + for i, in := range tests { + var buf bytes.Buffer + if _, err := HuffmanDecode(&buf, in); err != ErrInvalidHuffman { + t.Errorf("test-%d: decode(%q) = %v; want ErrInvalidHuffman", i, in, err) + } + } +} + +func TestHuffmanDecodeEOS(t *testing.T) { + in := []byte{0xff, 0xff, 0xff, 0xff, 0xfc} // {EOS, "?"} + var buf bytes.Buffer + if _, err := HuffmanDecode(&buf, in); err != ErrInvalidHuffman { + t.Errorf("error = %v; want ErrInvalidHuffman", err) + } +} + +func TestHuffmanDecodeMaxLengthOnTrailingByte(t *testing.T) { + in := []byte{0x00, 0x01} // {"0", "0", "0"} + var buf bytes.Buffer + if err := huffmanDecode(&buf, 2, in); err != ErrStringLength { + t.Errorf("error = %v; want ErrStringLength", err) + } +} + +func TestHuffmanDecodeCorruptPadding(t *testing.T) { + in := []byte{0x00} + var buf bytes.Buffer + if _, err := HuffmanDecode(&buf, in); err != ErrInvalidHuffman { + t.Errorf("error = %v; want ErrInvalidHuffman", err) + } +} + +func TestHuffmanDecode(t *testing.T) { + tests := []struct { + inHex, want string + }{ + {"f1e3 c2e5 f23a 6ba0 ab90 f4ff", "www.example.com"}, + {"a8eb 1064 9cbf", "no-cache"}, + {"25a8 49e9 5ba9 7d7f", "custom-key"}, + {"25a8 49e9 5bb8 e8b4 bf", "custom-value"}, + {"6402", "302"}, + {"aec3 771a 4b", "private"}, + {"d07a be94 1054 d444 a820 0595 040b 8166 e082 a62d 1bff", "Mon, 21 Oct 2013 20:13:21 GMT"}, + {"9d29 ad17 1863 c78f 0b97 c8e9 ae82 ae43 d3", "https://www.example.com"}, + {"9bd9 ab", "gzip"}, + {"94e7 821d d7f2 e6c7 b335 dfdf cd5b 3960 d5af 2708 7f36 72c1 ab27 0fb5 291f 9587 3160 65c0 03ed 4ee5 b106 3d50 07", + "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1"}, + } + for i, tt := range tests { + var buf bytes.Buffer + in, err := hex.DecodeString(strings.Replace(tt.inHex, " ", "", -1)) + if err != nil { + t.Errorf("%d. hex input error: %v", i, err) + continue + } + if _, err := HuffmanDecode(&buf, in); err != nil { + t.Errorf("%d. decode error: %v", i, err) + continue + } + if got := buf.String(); tt.want != got { + t.Errorf("%d. decode = %q; want %q", i, got, tt.want) + } + } +} + +func TestAppendHuffmanString(t *testing.T) { + tests := []struct { + in, want string + }{ + {"www.example.com", "f1e3 c2e5 f23a 6ba0 ab90 f4ff"}, + {"no-cache", "a8eb 1064 9cbf"}, + {"custom-key", "25a8 49e9 5ba9 7d7f"}, + {"custom-value", "25a8 49e9 5bb8 e8b4 bf"}, + {"302", "6402"}, + {"private", "aec3 771a 4b"}, + {"Mon, 21 Oct 2013 20:13:21 GMT", "d07a be94 1054 d444 a820 0595 040b 8166 e082 a62d 1bff"}, + {"https://www.example.com", "9d29 ad17 1863 c78f 0b97 c8e9 ae82 ae43 d3"}, + {"gzip", "9bd9 ab"}, + {"foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1", + "94e7 821d d7f2 e6c7 b335 dfdf cd5b 3960 d5af 2708 7f36 72c1 ab27 0fb5 291f 9587 3160 65c0 03ed 4ee5 b106 3d50 07"}, + } + for i, tt := range tests { + buf := []byte{} + want := strings.Replace(tt.want, " ", "", -1) + buf = AppendHuffmanString(buf, tt.in) + if got := hex.EncodeToString(buf); want != got { + t.Errorf("%d. encode = %q; want %q", i, got, want) + } + } +} + +func TestHuffmanMaxStrLen(t *testing.T) { + const msg = "Some string" + huff := AppendHuffmanString(nil, msg) + + testGood := func(max int) { + var out bytes.Buffer + if err := huffmanDecode(&out, max, huff); err != nil { + t.Errorf("For maxLen=%d, unexpected error: %v", max, err) + } + if out.String() != msg { + t.Errorf("For maxLen=%d, out = %q; want %q", max, out.String(), msg) + } + } + testGood(0) + testGood(len(msg)) + testGood(len(msg) + 1) + + var out bytes.Buffer + if err := huffmanDecode(&out, len(msg)-1, huff); err != ErrStringLength { + t.Errorf("err = %v; want ErrStringLength", err) + } +} + +func TestHuffmanRoundtripStress(t *testing.T) { + const Len = 50 // of uncompressed string + input := make([]byte, Len) + var output bytes.Buffer + var huff []byte + + n := 5000 + if testing.Short() { + n = 100 + } + seed := time.Now().UnixNano() + t.Logf("Seed = %v", seed) + src := rand.New(rand.NewSource(seed)) + var encSize int64 + for i := 0; i < n; i++ { + for l := range input { + input[l] = byte(src.Intn(256)) + } + huff = AppendHuffmanString(huff[:0], string(input)) + encSize += int64(len(huff)) + output.Reset() + if err := huffmanDecode(&output, 0, huff); err != nil { + t.Errorf("Failed to decode %q -> %q -> error %v", input, huff, err) + continue + } + if !bytes.Equal(output.Bytes(), input) { + t.Errorf("Roundtrip failure on %q -> %q -> %q", input, huff, output.Bytes()) + } + } + t.Logf("Compressed size of original: %0.02f%% (%v -> %v)", 100*(float64(encSize)/(Len*float64(n))), Len*n, encSize) +} + +func TestHuffmanDecodeFuzz(t *testing.T) { + const Len = 50 // of compressed + var buf, zbuf bytes.Buffer + + n := 5000 + if testing.Short() { + n = 100 + } + seed := time.Now().UnixNano() + t.Logf("Seed = %v", seed) + src := rand.New(rand.NewSource(seed)) + numFail := 0 + for i := 0; i < n; i++ { + zbuf.Reset() + if i == 0 { + // Start with at least one invalid one. + zbuf.WriteString("00\x91\xff\xff\xff\xff\xc8") + } else { + for l := 0; l < Len; l++ { + zbuf.WriteByte(byte(src.Intn(256))) + } + } + + buf.Reset() + if err := huffmanDecode(&buf, 0, zbuf.Bytes()); err != nil { + if err == ErrInvalidHuffman { + numFail++ + continue + } + t.Errorf("Failed to decode %q: %v", zbuf.Bytes(), err) + continue + } + } + t.Logf("%0.02f%% are invalid (%d / %d)", 100*float64(numFail)/float64(n), numFail, n) + if numFail < 1 { + t.Error("expected at least one invalid huffman encoding (test starts with one)") + } +} + +func TestReadVarInt(t *testing.T) { + type res struct { + i uint64 + consumed int + err error + } + tests := []struct { + n byte + p []byte + want res + }{ + // Fits in a byte: + {1, []byte{0}, res{0, 1, nil}}, + {2, []byte{2}, res{2, 1, nil}}, + {3, []byte{6}, res{6, 1, nil}}, + {4, []byte{14}, res{14, 1, nil}}, + {5, []byte{30}, res{30, 1, nil}}, + {6, []byte{62}, res{62, 1, nil}}, + {7, []byte{126}, res{126, 1, nil}}, + {8, []byte{254}, res{254, 1, nil}}, + + // Doesn't fit in a byte: + {1, []byte{1}, res{0, 0, errNeedMore}}, + {2, []byte{3}, res{0, 0, errNeedMore}}, + {3, []byte{7}, res{0, 0, errNeedMore}}, + {4, []byte{15}, res{0, 0, errNeedMore}}, + {5, []byte{31}, res{0, 0, errNeedMore}}, + {6, []byte{63}, res{0, 0, errNeedMore}}, + {7, []byte{127}, res{0, 0, errNeedMore}}, + {8, []byte{255}, res{0, 0, errNeedMore}}, + + // Ignoring top bits: + {5, []byte{255, 154, 10}, res{1337, 3, nil}}, // high dummy three bits: 111 + {5, []byte{159, 154, 10}, res{1337, 3, nil}}, // high dummy three bits: 100 + {5, []byte{191, 154, 10}, res{1337, 3, nil}}, // high dummy three bits: 101 + + // Extra byte: + {5, []byte{191, 154, 10, 2}, res{1337, 3, nil}}, // extra byte + + // Short a byte: + {5, []byte{191, 154}, res{0, 0, errNeedMore}}, + + // integer overflow: + {1, []byte{255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128}, res{0, 0, errVarintOverflow}}, + } + for _, tt := range tests { + i, remain, err := readVarInt(tt.n, tt.p) + consumed := len(tt.p) - len(remain) + got := res{i, consumed, err} + if got != tt.want { + t.Errorf("readVarInt(%d, %v ~ %x) = %+v; want %+v", tt.n, tt.p, tt.p, got, tt.want) + } + } +} + +// Fuzz crash, originally reported at https://github.com/bradfitz/http2/issues/56 +func TestHuffmanFuzzCrash(t *testing.T) { + got, err := HuffmanDecodeToString([]byte("00\x91\xff\xff\xff\xff\xc8")) + if got != "" { + t.Errorf("Got %q; want empty string", got) + } + if err != ErrInvalidHuffman { + t.Errorf("Err = %v; want ErrInvalidHuffman", err) + } +} + +func pair(name, value string) HeaderField { + return HeaderField{Name: name, Value: value} +} + +func dehex(s string) []byte { + s = strings.Replace(s, " ", "", -1) + s = strings.Replace(s, "\n", "", -1) + b, err := hex.DecodeString(s) + if err != nil { + panic(err) + } + return b +} + +func TestEmitEnabled(t *testing.T) { + var buf bytes.Buffer + enc := NewEncoder(&buf) + enc.WriteField(HeaderField{Name: "foo", Value: "bar"}) + enc.WriteField(HeaderField{Name: "foo", Value: "bar"}) + + numCallback := 0 + var dec *Decoder + dec = NewDecoder(8<<20, func(HeaderField) { + numCallback++ + dec.SetEmitEnabled(false) + }) + if !dec.EmitEnabled() { + t.Errorf("initial emit enabled = false; want true") + } + if _, err := dec.Write(buf.Bytes()); err != nil { + t.Error(err) + } + if numCallback != 1 { + t.Errorf("num callbacks = %d; want 1", numCallback) + } + if dec.EmitEnabled() { + t.Errorf("emit enabled = true; want false") + } +} + +func TestSaveBufLimit(t *testing.T) { + const maxStr = 1 << 10 + var got []HeaderField + dec := NewDecoder(initialHeaderTableSize, func(hf HeaderField) { + got = append(got, hf) + }) + dec.SetMaxStringLength(maxStr) + var frag []byte + frag = append(frag[:0], encodeTypeByte(false, false)) + frag = appendVarInt(frag, 7, 3) + frag = append(frag, "foo"...) + frag = appendVarInt(frag, 7, 3) + frag = append(frag, "bar"...) + + if _, err := dec.Write(frag); err != nil { + t.Fatal(err) + } + + want := []HeaderField{{Name: "foo", Value: "bar"}} + if !reflect.DeepEqual(got, want) { + t.Errorf("After small writes, got %v; want %v", got, want) + } + + frag = append(frag[:0], encodeTypeByte(false, false)) + frag = appendVarInt(frag, 7, maxStr*3) + frag = append(frag, make([]byte, maxStr*3)...) + + _, err := dec.Write(frag) + if err != ErrStringLength { + t.Fatalf("Write error = %v; want ErrStringLength", err) + } +} + +func TestDynamicSizeUpdate(t *testing.T) { + var buf bytes.Buffer + enc := NewEncoder(&buf) + enc.SetMaxDynamicTableSize(255) + enc.WriteField(HeaderField{Name: "foo", Value: "bar"}) + + d := NewDecoder(4096, nil) + _, err := d.DecodeFull(buf.Bytes()) + if err != nil { + t.Fatalf("unexpected error: got = %v", err) + } + + // must fail since the dynamic table update must be at the beginning + _, err = d.DecodeFull(buf.Bytes()) + if err == nil { + t.Fatalf("dynamic table size update not at the beginning of a header block") + } +} diff --git a/api/vendor/golang.org/x/net/http2/hpack/huffman.go b/api/vendor/golang.org/x/net/http2/hpack/huffman.go new file mode 100644 index 0000000..8850e39 --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/hpack/huffman.go @@ -0,0 +1,212 @@ +// 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 hpack + +import ( + "bytes" + "errors" + "io" + "sync" +) + +var bufPool = sync.Pool{ + New: func() interface{} { return new(bytes.Buffer) }, +} + +// HuffmanDecode decodes the string in v and writes the expanded +// result to w, returning the number of bytes written to w and the +// Write call's return value. At most one Write call is made. +func HuffmanDecode(w io.Writer, v []byte) (int, error) { + buf := bufPool.Get().(*bytes.Buffer) + buf.Reset() + defer bufPool.Put(buf) + if err := huffmanDecode(buf, 0, v); err != nil { + return 0, err + } + return w.Write(buf.Bytes()) +} + +// HuffmanDecodeToString decodes the string in v. +func HuffmanDecodeToString(v []byte) (string, error) { + buf := bufPool.Get().(*bytes.Buffer) + buf.Reset() + defer bufPool.Put(buf) + if err := huffmanDecode(buf, 0, v); err != nil { + return "", err + } + return buf.String(), nil +} + +// ErrInvalidHuffman is returned for errors found decoding +// Huffman-encoded strings. +var ErrInvalidHuffman = errors.New("hpack: invalid Huffman-encoded data") + +// huffmanDecode decodes v to buf. +// If maxLen is greater than 0, attempts to write more to buf than +// maxLen bytes will return ErrStringLength. +func huffmanDecode(buf *bytes.Buffer, maxLen int, v []byte) error { + n := rootHuffmanNode + // cur is the bit buffer that has not been fed into n. + // cbits is the number of low order bits in cur that are valid. + // sbits is the number of bits of the symbol prefix being decoded. + cur, cbits, sbits := uint(0), uint8(0), uint8(0) + for _, b := range v { + cur = cur<<8 | uint(b) + cbits += 8 + sbits += 8 + for cbits >= 8 { + idx := byte(cur >> (cbits - 8)) + n = n.children[idx] + if n == nil { + return ErrInvalidHuffman + } + if n.children == nil { + if maxLen != 0 && buf.Len() == maxLen { + return ErrStringLength + } + buf.WriteByte(n.sym) + cbits -= n.codeLen + n = rootHuffmanNode + sbits = cbits + } else { + cbits -= 8 + } + } + } + for cbits > 0 { + n = n.children[byte(cur<<(8-cbits))] + if n == nil { + return ErrInvalidHuffman + } + if n.children != nil || n.codeLen > cbits { + break + } + if maxLen != 0 && buf.Len() == maxLen { + return ErrStringLength + } + buf.WriteByte(n.sym) + cbits -= n.codeLen + n = rootHuffmanNode + sbits = cbits + } + if sbits > 7 { + // Either there was an incomplete symbol, or overlong padding. + // Both are decoding errors per RFC 7541 section 5.2. + return ErrInvalidHuffman + } + if mask := uint(1< 8 { + codeLen -= 8 + i := uint8(code >> codeLen) + if cur.children[i] == nil { + cur.children[i] = newInternalNode() + } + cur = cur.children[i] + } + shift := 8 - codeLen + start, end := int(uint8(code<> (nbits - rembits)) + dst[len(dst)-1] |= t + } + + return dst +} + +// HuffmanEncodeLength returns the number of bytes required to encode +// s in Huffman codes. The result is round up to byte boundary. +func HuffmanEncodeLength(s string) uint64 { + n := uint64(0) + for i := 0; i < len(s); i++ { + n += uint64(huffmanCodeLen[s[i]]) + } + return (n + 7) / 8 +} + +// appendByteToHuffmanCode appends Huffman code for c to dst and +// returns the extended buffer and the remaining bits in the last +// element. The appending is not byte aligned and the remaining bits +// in the last element of dst is given in rembits. +func appendByteToHuffmanCode(dst []byte, rembits uint8, c byte) ([]byte, uint8) { + code := huffmanCodes[c] + nbits := huffmanCodeLen[c] + + for { + if rembits > nbits { + t := uint8(code << (rembits - nbits)) + dst[len(dst)-1] |= t + rembits -= nbits + break + } + + t := uint8(code >> (nbits - rembits)) + dst[len(dst)-1] |= t + + nbits -= rembits + rembits = 8 + + if nbits == 0 { + break + } + + dst = append(dst, 0) + } + + return dst, rembits +} diff --git a/api/vendor/golang.org/x/net/http2/hpack/tables.go b/api/vendor/golang.org/x/net/http2/hpack/tables.go new file mode 100644 index 0000000..a66cfbe --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/hpack/tables.go @@ -0,0 +1,479 @@ +// 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 hpack + +import ( + "fmt" +) + +// headerFieldTable implements a list of HeaderFields. +// This is used to implement the static and dynamic tables. +type headerFieldTable struct { + // For static tables, entries are never evicted. + // + // For dynamic tables, entries are evicted from ents[0] and added to the end. + // Each entry has a unique id that starts at one and increments for each + // entry that is added. This unique id is stable across evictions, meaning + // it can be used as a pointer to a specific entry. As in hpack, unique ids + // are 1-based. The unique id for ents[k] is k + evictCount + 1. + // + // Zero is not a valid unique id. + // + // evictCount should not overflow in any remotely practical situation. In + // practice, we will have one dynamic table per HTTP/2 connection. If we + // assume a very powerful server that handles 1M QPS per connection and each + // request adds (then evicts) 100 entries from the table, it would still take + // 2M years for evictCount to overflow. + ents []HeaderField + evictCount uint64 + + // byName maps a HeaderField name to the unique id of the newest entry with + // the same name. See above for a definition of "unique id". + byName map[string]uint64 + + // byNameValue maps a HeaderField name/value pair to the unique id of the newest + // entry with the same name and value. See above for a definition of "unique id". + byNameValue map[pairNameValue]uint64 +} + +type pairNameValue struct { + name, value string +} + +func (t *headerFieldTable) init() { + t.byName = make(map[string]uint64) + t.byNameValue = make(map[pairNameValue]uint64) +} + +// len reports the number of entries in the table. +func (t *headerFieldTable) len() int { + return len(t.ents) +} + +// addEntry adds a new entry. +func (t *headerFieldTable) addEntry(f HeaderField) { + id := uint64(t.len()) + t.evictCount + 1 + t.byName[f.Name] = id + t.byNameValue[pairNameValue{f.Name, f.Value}] = id + t.ents = append(t.ents, f) +} + +// evictOldest evicts the n oldest entries in the table. +func (t *headerFieldTable) evictOldest(n int) { + if n > t.len() { + panic(fmt.Sprintf("evictOldest(%v) on table with %v entries", n, t.len())) + } + for k := 0; k < n; k++ { + f := t.ents[k] + id := t.evictCount + uint64(k) + 1 + if t.byName[f.Name] == id { + delete(t.byName, f.Name) + } + if p := (pairNameValue{f.Name, f.Value}); t.byNameValue[p] == id { + delete(t.byNameValue, p) + } + } + copy(t.ents, t.ents[n:]) + for k := t.len() - n; k < t.len(); k++ { + t.ents[k] = HeaderField{} // so strings can be garbage collected + } + t.ents = t.ents[:t.len()-n] + if t.evictCount+uint64(n) < t.evictCount { + panic("evictCount overflow") + } + t.evictCount += uint64(n) +} + +// search finds f in the table. If there is no match, i is 0. +// If both name and value match, i is the matched index and nameValueMatch +// becomes true. If only name matches, i points to that index and +// nameValueMatch becomes false. +// +// The returned index is a 1-based HPACK index. For dynamic tables, HPACK says +// that index 1 should be the newest entry, but t.ents[0] is the oldest entry, +// meaning t.ents is reversed for dynamic tables. Hence, when t is a dynamic +// table, the return value i actually refers to the entry t.ents[t.len()-i]. +// +// All tables are assumed to be a dynamic tables except for the global +// staticTable pointer. +// +// See Section 2.3.3. +func (t *headerFieldTable) search(f HeaderField) (i uint64, nameValueMatch bool) { + if !f.Sensitive { + if id := t.byNameValue[pairNameValue{f.Name, f.Value}]; id != 0 { + return t.idToIndex(id), true + } + } + if id := t.byName[f.Name]; id != 0 { + return t.idToIndex(id), false + } + return 0, false +} + +// idToIndex converts a unique id to an HPACK index. +// See Section 2.3.3. +func (t *headerFieldTable) idToIndex(id uint64) uint64 { + if id <= t.evictCount { + panic(fmt.Sprintf("id (%v) <= evictCount (%v)", id, t.evictCount)) + } + k := id - t.evictCount - 1 // convert id to an index t.ents[k] + if t != staticTable { + return uint64(t.len()) - k // dynamic table + } + return k + 1 +} + +// http://tools.ietf.org/html/draft-ietf-httpbis-header-compression-07#appendix-B +var staticTable = newStaticTable() +var staticTableEntries = [...]HeaderField{ + {Name: ":authority"}, + {Name: ":method", Value: "GET"}, + {Name: ":method", Value: "POST"}, + {Name: ":path", Value: "/"}, + {Name: ":path", Value: "/index.html"}, + {Name: ":scheme", Value: "http"}, + {Name: ":scheme", Value: "https"}, + {Name: ":status", Value: "200"}, + {Name: ":status", Value: "204"}, + {Name: ":status", Value: "206"}, + {Name: ":status", Value: "304"}, + {Name: ":status", Value: "400"}, + {Name: ":status", Value: "404"}, + {Name: ":status", Value: "500"}, + {Name: "accept-charset"}, + {Name: "accept-encoding", Value: "gzip, deflate"}, + {Name: "accept-language"}, + {Name: "accept-ranges"}, + {Name: "accept"}, + {Name: "access-control-allow-origin"}, + {Name: "age"}, + {Name: "allow"}, + {Name: "authorization"}, + {Name: "cache-control"}, + {Name: "content-disposition"}, + {Name: "content-encoding"}, + {Name: "content-language"}, + {Name: "content-length"}, + {Name: "content-location"}, + {Name: "content-range"}, + {Name: "content-type"}, + {Name: "cookie"}, + {Name: "date"}, + {Name: "etag"}, + {Name: "expect"}, + {Name: "expires"}, + {Name: "from"}, + {Name: "host"}, + {Name: "if-match"}, + {Name: "if-modified-since"}, + {Name: "if-none-match"}, + {Name: "if-range"}, + {Name: "if-unmodified-since"}, + {Name: "last-modified"}, + {Name: "link"}, + {Name: "location"}, + {Name: "max-forwards"}, + {Name: "proxy-authenticate"}, + {Name: "proxy-authorization"}, + {Name: "range"}, + {Name: "referer"}, + {Name: "refresh"}, + {Name: "retry-after"}, + {Name: "server"}, + {Name: "set-cookie"}, + {Name: "strict-transport-security"}, + {Name: "transfer-encoding"}, + {Name: "user-agent"}, + {Name: "vary"}, + {Name: "via"}, + {Name: "www-authenticate"}, +} + +func newStaticTable() *headerFieldTable { + t := &headerFieldTable{} + t.init() + for _, e := range staticTableEntries[:] { + t.addEntry(e) + } + return t +} + +var huffmanCodes = [256]uint32{ + 0x1ff8, + 0x7fffd8, + 0xfffffe2, + 0xfffffe3, + 0xfffffe4, + 0xfffffe5, + 0xfffffe6, + 0xfffffe7, + 0xfffffe8, + 0xffffea, + 0x3ffffffc, + 0xfffffe9, + 0xfffffea, + 0x3ffffffd, + 0xfffffeb, + 0xfffffec, + 0xfffffed, + 0xfffffee, + 0xfffffef, + 0xffffff0, + 0xffffff1, + 0xffffff2, + 0x3ffffffe, + 0xffffff3, + 0xffffff4, + 0xffffff5, + 0xffffff6, + 0xffffff7, + 0xffffff8, + 0xffffff9, + 0xffffffa, + 0xffffffb, + 0x14, + 0x3f8, + 0x3f9, + 0xffa, + 0x1ff9, + 0x15, + 0xf8, + 0x7fa, + 0x3fa, + 0x3fb, + 0xf9, + 0x7fb, + 0xfa, + 0x16, + 0x17, + 0x18, + 0x0, + 0x1, + 0x2, + 0x19, + 0x1a, + 0x1b, + 0x1c, + 0x1d, + 0x1e, + 0x1f, + 0x5c, + 0xfb, + 0x7ffc, + 0x20, + 0xffb, + 0x3fc, + 0x1ffa, + 0x21, + 0x5d, + 0x5e, + 0x5f, + 0x60, + 0x61, + 0x62, + 0x63, + 0x64, + 0x65, + 0x66, + 0x67, + 0x68, + 0x69, + 0x6a, + 0x6b, + 0x6c, + 0x6d, + 0x6e, + 0x6f, + 0x70, + 0x71, + 0x72, + 0xfc, + 0x73, + 0xfd, + 0x1ffb, + 0x7fff0, + 0x1ffc, + 0x3ffc, + 0x22, + 0x7ffd, + 0x3, + 0x23, + 0x4, + 0x24, + 0x5, + 0x25, + 0x26, + 0x27, + 0x6, + 0x74, + 0x75, + 0x28, + 0x29, + 0x2a, + 0x7, + 0x2b, + 0x76, + 0x2c, + 0x8, + 0x9, + 0x2d, + 0x77, + 0x78, + 0x79, + 0x7a, + 0x7b, + 0x7ffe, + 0x7fc, + 0x3ffd, + 0x1ffd, + 0xffffffc, + 0xfffe6, + 0x3fffd2, + 0xfffe7, + 0xfffe8, + 0x3fffd3, + 0x3fffd4, + 0x3fffd5, + 0x7fffd9, + 0x3fffd6, + 0x7fffda, + 0x7fffdb, + 0x7fffdc, + 0x7fffdd, + 0x7fffde, + 0xffffeb, + 0x7fffdf, + 0xffffec, + 0xffffed, + 0x3fffd7, + 0x7fffe0, + 0xffffee, + 0x7fffe1, + 0x7fffe2, + 0x7fffe3, + 0x7fffe4, + 0x1fffdc, + 0x3fffd8, + 0x7fffe5, + 0x3fffd9, + 0x7fffe6, + 0x7fffe7, + 0xffffef, + 0x3fffda, + 0x1fffdd, + 0xfffe9, + 0x3fffdb, + 0x3fffdc, + 0x7fffe8, + 0x7fffe9, + 0x1fffde, + 0x7fffea, + 0x3fffdd, + 0x3fffde, + 0xfffff0, + 0x1fffdf, + 0x3fffdf, + 0x7fffeb, + 0x7fffec, + 0x1fffe0, + 0x1fffe1, + 0x3fffe0, + 0x1fffe2, + 0x7fffed, + 0x3fffe1, + 0x7fffee, + 0x7fffef, + 0xfffea, + 0x3fffe2, + 0x3fffe3, + 0x3fffe4, + 0x7ffff0, + 0x3fffe5, + 0x3fffe6, + 0x7ffff1, + 0x3ffffe0, + 0x3ffffe1, + 0xfffeb, + 0x7fff1, + 0x3fffe7, + 0x7ffff2, + 0x3fffe8, + 0x1ffffec, + 0x3ffffe2, + 0x3ffffe3, + 0x3ffffe4, + 0x7ffffde, + 0x7ffffdf, + 0x3ffffe5, + 0xfffff1, + 0x1ffffed, + 0x7fff2, + 0x1fffe3, + 0x3ffffe6, + 0x7ffffe0, + 0x7ffffe1, + 0x3ffffe7, + 0x7ffffe2, + 0xfffff2, + 0x1fffe4, + 0x1fffe5, + 0x3ffffe8, + 0x3ffffe9, + 0xffffffd, + 0x7ffffe3, + 0x7ffffe4, + 0x7ffffe5, + 0xfffec, + 0xfffff3, + 0xfffed, + 0x1fffe6, + 0x3fffe9, + 0x1fffe7, + 0x1fffe8, + 0x7ffff3, + 0x3fffea, + 0x3fffeb, + 0x1ffffee, + 0x1ffffef, + 0xfffff4, + 0xfffff5, + 0x3ffffea, + 0x7ffff4, + 0x3ffffeb, + 0x7ffffe6, + 0x3ffffec, + 0x3ffffed, + 0x7ffffe7, + 0x7ffffe8, + 0x7ffffe9, + 0x7ffffea, + 0x7ffffeb, + 0xffffffe, + 0x7ffffec, + 0x7ffffed, + 0x7ffffee, + 0x7ffffef, + 0x7fffff0, + 0x3ffffee, +} + +var huffmanCodeLen = [256]uint8{ + 13, 23, 28, 28, 28, 28, 28, 28, 28, 24, 30, 28, 28, 30, 28, 28, + 28, 28, 28, 28, 28, 28, 30, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 6, 10, 10, 12, 13, 6, 8, 11, 10, 10, 8, 11, 8, 6, 6, 6, + 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 8, 15, 6, 12, 10, + 13, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 8, 7, 8, 13, 19, 13, 14, 6, + 15, 5, 6, 5, 6, 5, 6, 6, 6, 5, 7, 7, 6, 6, 6, 5, + 6, 7, 6, 5, 5, 6, 7, 7, 7, 7, 7, 15, 11, 14, 13, 28, + 20, 22, 20, 20, 22, 22, 22, 23, 22, 23, 23, 23, 23, 23, 24, 23, + 24, 24, 22, 23, 24, 23, 23, 23, 23, 21, 22, 23, 22, 23, 23, 24, + 22, 21, 20, 22, 22, 23, 23, 21, 23, 22, 22, 24, 21, 22, 23, 23, + 21, 21, 22, 21, 23, 22, 23, 23, 20, 22, 22, 22, 23, 22, 22, 23, + 26, 26, 20, 19, 22, 23, 22, 25, 26, 26, 26, 27, 27, 26, 24, 25, + 19, 21, 26, 27, 27, 26, 27, 24, 21, 21, 26, 26, 28, 27, 27, 27, + 20, 24, 20, 21, 22, 21, 21, 23, 22, 22, 25, 25, 24, 24, 26, 23, + 26, 27, 26, 26, 27, 27, 27, 27, 27, 28, 27, 27, 27, 27, 27, 26, +} diff --git a/api/vendor/golang.org/x/net/http2/hpack/tables_test.go b/api/vendor/golang.org/x/net/http2/hpack/tables_test.go new file mode 100644 index 0000000..d963f36 --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/hpack/tables_test.go @@ -0,0 +1,214 @@ +// 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 hpack + +import ( + "bufio" + "regexp" + "strconv" + "strings" + "testing" +) + +func TestHeaderFieldTable(t *testing.T) { + table := &headerFieldTable{} + table.init() + table.addEntry(pair("key1", "value1-1")) + table.addEntry(pair("key2", "value2-1")) + table.addEntry(pair("key1", "value1-2")) + table.addEntry(pair("key3", "value3-1")) + table.addEntry(pair("key4", "value4-1")) + table.addEntry(pair("key2", "value2-2")) + + // Tests will be run twice: once before evicting anything, and + // again after evicting the three oldest entries. + tests := []struct { + f HeaderField + beforeWantStaticI uint64 + beforeWantMatch bool + afterWantStaticI uint64 + afterWantMatch bool + }{ + {HeaderField{"key1", "value1-1", false}, 1, true, 0, false}, + {HeaderField{"key1", "value1-2", false}, 3, true, 0, false}, + {HeaderField{"key1", "value1-3", false}, 3, false, 0, false}, + {HeaderField{"key2", "value2-1", false}, 2, true, 3, false}, + {HeaderField{"key2", "value2-2", false}, 6, true, 3, true}, + {HeaderField{"key2", "value2-3", false}, 6, false, 3, false}, + {HeaderField{"key4", "value4-1", false}, 5, true, 2, true}, + // Name match only, because sensitive. + {HeaderField{"key4", "value4-1", true}, 5, false, 2, false}, + // Key not found. + {HeaderField{"key5", "value5-x", false}, 0, false, 0, false}, + } + + staticToDynamic := func(i uint64) uint64 { + if i == 0 { + return 0 + } + return uint64(table.len()) - i + 1 // dynamic is the reversed table + } + + searchStatic := func(f HeaderField) (uint64, bool) { + old := staticTable + staticTable = table + defer func() { staticTable = old }() + return staticTable.search(f) + } + + searchDynamic := func(f HeaderField) (uint64, bool) { + return table.search(f) + } + + for _, test := range tests { + gotI, gotMatch := searchStatic(test.f) + if wantI, wantMatch := test.beforeWantStaticI, test.beforeWantMatch; gotI != wantI || gotMatch != wantMatch { + t.Errorf("before evictions: searchStatic(%+v)=%v,%v want %v,%v", test.f, gotI, gotMatch, wantI, wantMatch) + } + gotI, gotMatch = searchDynamic(test.f) + wantDynamicI := staticToDynamic(test.beforeWantStaticI) + if wantI, wantMatch := wantDynamicI, test.beforeWantMatch; gotI != wantI || gotMatch != wantMatch { + t.Errorf("before evictions: searchDynamic(%+v)=%v,%v want %v,%v", test.f, gotI, gotMatch, wantI, wantMatch) + } + } + + table.evictOldest(3) + + for _, test := range tests { + gotI, gotMatch := searchStatic(test.f) + if wantI, wantMatch := test.afterWantStaticI, test.afterWantMatch; gotI != wantI || gotMatch != wantMatch { + t.Errorf("after evictions: searchStatic(%+v)=%v,%v want %v,%v", test.f, gotI, gotMatch, wantI, wantMatch) + } + gotI, gotMatch = searchDynamic(test.f) + wantDynamicI := staticToDynamic(test.afterWantStaticI) + if wantI, wantMatch := wantDynamicI, test.afterWantMatch; gotI != wantI || gotMatch != wantMatch { + t.Errorf("after evictions: searchDynamic(%+v)=%v,%v want %v,%v", test.f, gotI, gotMatch, wantI, wantMatch) + } + } +} + +func TestHeaderFieldTable_LookupMapEviction(t *testing.T) { + table := &headerFieldTable{} + table.init() + table.addEntry(pair("key1", "value1-1")) + table.addEntry(pair("key2", "value2-1")) + table.addEntry(pair("key1", "value1-2")) + table.addEntry(pair("key3", "value3-1")) + table.addEntry(pair("key4", "value4-1")) + table.addEntry(pair("key2", "value2-2")) + + // evict all pairs + table.evictOldest(table.len()) + + if l := table.len(); l > 0 { + t.Errorf("table.len() = %d, want 0", l) + } + + if l := len(table.byName); l > 0 { + t.Errorf("len(table.byName) = %d, want 0", l) + } + + if l := len(table.byNameValue); l > 0 { + t.Errorf("len(table.byNameValue) = %d, want 0", l) + } +} + +func TestStaticTable(t *testing.T) { + fromSpec := ` + +-------+-----------------------------+---------------+ + | 1 | :authority | | + | 2 | :method | GET | + | 3 | :method | POST | + | 4 | :path | / | + | 5 | :path | /index.html | + | 6 | :scheme | http | + | 7 | :scheme | https | + | 8 | :status | 200 | + | 9 | :status | 204 | + | 10 | :status | 206 | + | 11 | :status | 304 | + | 12 | :status | 400 | + | 13 | :status | 404 | + | 14 | :status | 500 | + | 15 | accept-charset | | + | 16 | accept-encoding | gzip, deflate | + | 17 | accept-language | | + | 18 | accept-ranges | | + | 19 | accept | | + | 20 | access-control-allow-origin | | + | 21 | age | | + | 22 | allow | | + | 23 | authorization | | + | 24 | cache-control | | + | 25 | content-disposition | | + | 26 | content-encoding | | + | 27 | content-language | | + | 28 | content-length | | + | 29 | content-location | | + | 30 | content-range | | + | 31 | content-type | | + | 32 | cookie | | + | 33 | date | | + | 34 | etag | | + | 35 | expect | | + | 36 | expires | | + | 37 | from | | + | 38 | host | | + | 39 | if-match | | + | 40 | if-modified-since | | + | 41 | if-none-match | | + | 42 | if-range | | + | 43 | if-unmodified-since | | + | 44 | last-modified | | + | 45 | link | | + | 46 | location | | + | 47 | max-forwards | | + | 48 | proxy-authenticate | | + | 49 | proxy-authorization | | + | 50 | range | | + | 51 | referer | | + | 52 | refresh | | + | 53 | retry-after | | + | 54 | server | | + | 55 | set-cookie | | + | 56 | strict-transport-security | | + | 57 | transfer-encoding | | + | 58 | user-agent | | + | 59 | vary | | + | 60 | via | | + | 61 | www-authenticate | | + +-------+-----------------------------+---------------+ +` + bs := bufio.NewScanner(strings.NewReader(fromSpec)) + re := regexp.MustCompile(`\| (\d+)\s+\| (\S+)\s*\| (\S(.*\S)?)?\s+\|`) + for bs.Scan() { + l := bs.Text() + if !strings.Contains(l, "|") { + continue + } + m := re.FindStringSubmatch(l) + if m == nil { + continue + } + i, err := strconv.Atoi(m[1]) + if err != nil { + t.Errorf("Bogus integer on line %q", l) + continue + } + if i < 1 || i > staticTable.len() { + t.Errorf("Bogus index %d on line %q", i, l) + continue + } + if got, want := staticTable.ents[i-1].Name, m[2]; got != want { + t.Errorf("header index %d name = %q; want %q", i, got, want) + } + if got, want := staticTable.ents[i-1].Value, m[3]; got != want { + t.Errorf("header index %d value = %q; want %q", i, got, want) + } + } + if err := bs.Err(); err != nil { + t.Error(err) + } +} diff --git a/api/vendor/golang.org/x/net/http2/http2.go b/api/vendor/golang.org/x/net/http2/http2.go new file mode 100644 index 0000000..c824282 --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/http2.go @@ -0,0 +1,391 @@ +// 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 http2 implements the HTTP/2 protocol. +// +// This package is low-level and intended to be used directly by very +// few people. Most users will use it indirectly through the automatic +// use by the net/http package (from Go 1.6 and later). +// For use in earlier Go versions see ConfigureServer. (Transport support +// requires Go 1.6 or later) +// +// See https://http2.github.io/ for more information on HTTP/2. +// +// See https://http2.golang.org/ for a test server running this code. +// +package http2 // import "golang.org/x/net/http2" + +import ( + "bufio" + "crypto/tls" + "errors" + "fmt" + "io" + "net/http" + "os" + "sort" + "strconv" + "strings" + "sync" + + "golang.org/x/net/http/httpguts" +) + +var ( + VerboseLogs bool + logFrameWrites bool + logFrameReads bool + inTests bool +) + +func init() { + e := os.Getenv("GODEBUG") + if strings.Contains(e, "http2debug=1") { + VerboseLogs = true + } + if strings.Contains(e, "http2debug=2") { + VerboseLogs = true + logFrameWrites = true + logFrameReads = true + } +} + +const ( + // ClientPreface is the string that must be sent by new + // connections from clients. + ClientPreface = "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n" + + // SETTINGS_MAX_FRAME_SIZE default + // http://http2.github.io/http2-spec/#rfc.section.6.5.2 + initialMaxFrameSize = 16384 + + // NextProtoTLS is the NPN/ALPN protocol negotiated during + // HTTP/2's TLS setup. + NextProtoTLS = "h2" + + // http://http2.github.io/http2-spec/#SettingValues + initialHeaderTableSize = 4096 + + initialWindowSize = 65535 // 6.9.2 Initial Flow Control Window Size + + defaultMaxReadFrameSize = 1 << 20 +) + +var ( + clientPreface = []byte(ClientPreface) +) + +type streamState int + +// HTTP/2 stream states. +// +// See http://tools.ietf.org/html/rfc7540#section-5.1. +// +// For simplicity, the server code merges "reserved (local)" into +// "half-closed (remote)". This is one less state transition to track. +// The only downside is that we send PUSH_PROMISEs slightly less +// liberally than allowable. More discussion here: +// https://lists.w3.org/Archives/Public/ietf-http-wg/2016JulSep/0599.html +// +// "reserved (remote)" is omitted since the client code does not +// support server push. +const ( + stateIdle streamState = iota + stateOpen + stateHalfClosedLocal + stateHalfClosedRemote + stateClosed +) + +var stateName = [...]string{ + stateIdle: "Idle", + stateOpen: "Open", + stateHalfClosedLocal: "HalfClosedLocal", + stateHalfClosedRemote: "HalfClosedRemote", + stateClosed: "Closed", +} + +func (st streamState) String() string { + return stateName[st] +} + +// Setting is a setting parameter: which setting it is, and its value. +type Setting struct { + // ID is which setting is being set. + // See http://http2.github.io/http2-spec/#SettingValues + ID SettingID + + // Val is the value. + Val uint32 +} + +func (s Setting) String() string { + return fmt.Sprintf("[%v = %d]", s.ID, s.Val) +} + +// Valid reports whether the setting is valid. +func (s Setting) Valid() error { + // Limits and error codes from 6.5.2 Defined SETTINGS Parameters + switch s.ID { + case SettingEnablePush: + if s.Val != 1 && s.Val != 0 { + return ConnectionError(ErrCodeProtocol) + } + case SettingInitialWindowSize: + if s.Val > 1<<31-1 { + return ConnectionError(ErrCodeFlowControl) + } + case SettingMaxFrameSize: + if s.Val < 16384 || s.Val > 1<<24-1 { + return ConnectionError(ErrCodeProtocol) + } + } + return nil +} + +// A SettingID is an HTTP/2 setting as defined in +// http://http2.github.io/http2-spec/#iana-settings +type SettingID uint16 + +const ( + SettingHeaderTableSize SettingID = 0x1 + SettingEnablePush SettingID = 0x2 + SettingMaxConcurrentStreams SettingID = 0x3 + SettingInitialWindowSize SettingID = 0x4 + SettingMaxFrameSize SettingID = 0x5 + SettingMaxHeaderListSize SettingID = 0x6 +) + +var settingName = map[SettingID]string{ + SettingHeaderTableSize: "HEADER_TABLE_SIZE", + SettingEnablePush: "ENABLE_PUSH", + SettingMaxConcurrentStreams: "MAX_CONCURRENT_STREAMS", + SettingInitialWindowSize: "INITIAL_WINDOW_SIZE", + SettingMaxFrameSize: "MAX_FRAME_SIZE", + SettingMaxHeaderListSize: "MAX_HEADER_LIST_SIZE", +} + +func (s SettingID) String() string { + if v, ok := settingName[s]; ok { + return v + } + return fmt.Sprintf("UNKNOWN_SETTING_%d", uint16(s)) +} + +var ( + errInvalidHeaderFieldName = errors.New("http2: invalid header field name") + errInvalidHeaderFieldValue = errors.New("http2: invalid header field value") +) + +// validWireHeaderFieldName reports whether v is a valid header field +// name (key). See httpguts.ValidHeaderName for the base rules. +// +// Further, http2 says: +// "Just as in HTTP/1.x, header field names are strings of ASCII +// characters that are compared in a case-insensitive +// fashion. However, header field names MUST be converted to +// lowercase prior to their encoding in HTTP/2. " +func validWireHeaderFieldName(v string) bool { + if len(v) == 0 { + return false + } + for _, r := range v { + if !httpguts.IsTokenRune(r) { + return false + } + if 'A' <= r && r <= 'Z' { + return false + } + } + return true +} + +var httpCodeStringCommon = map[int]string{} // n -> strconv.Itoa(n) + +func init() { + for i := 100; i <= 999; i++ { + if v := http.StatusText(i); v != "" { + httpCodeStringCommon[i] = strconv.Itoa(i) + } + } +} + +func httpCodeString(code int) string { + if s, ok := httpCodeStringCommon[code]; ok { + return s + } + return strconv.Itoa(code) +} + +// from pkg io +type stringWriter interface { + WriteString(s string) (n int, err error) +} + +// A gate lets two goroutines coordinate their activities. +type gate chan struct{} + +func (g gate) Done() { g <- struct{}{} } +func (g gate) Wait() { <-g } + +// A closeWaiter is like a sync.WaitGroup but only goes 1 to 0 (open to closed). +type closeWaiter chan struct{} + +// Init makes a closeWaiter usable. +// It exists because so a closeWaiter value can be placed inside a +// larger struct and have the Mutex and Cond's memory in the same +// allocation. +func (cw *closeWaiter) Init() { + *cw = make(chan struct{}) +} + +// Close marks the closeWaiter as closed and unblocks any waiters. +func (cw closeWaiter) Close() { + close(cw) +} + +// Wait waits for the closeWaiter to become closed. +func (cw closeWaiter) Wait() { + <-cw +} + +// bufferedWriter is a buffered writer that writes to w. +// Its buffered writer is lazily allocated as needed, to minimize +// idle memory usage with many connections. +type bufferedWriter struct { + w io.Writer // immutable + bw *bufio.Writer // non-nil when data is buffered +} + +func newBufferedWriter(w io.Writer) *bufferedWriter { + return &bufferedWriter{w: w} +} + +// bufWriterPoolBufferSize is the size of bufio.Writer's +// buffers created using bufWriterPool. +// +// TODO: pick a less arbitrary value? this is a bit under +// (3 x typical 1500 byte MTU) at least. Other than that, +// not much thought went into it. +const bufWriterPoolBufferSize = 4 << 10 + +var bufWriterPool = sync.Pool{ + New: func() interface{} { + return bufio.NewWriterSize(nil, bufWriterPoolBufferSize) + }, +} + +func (w *bufferedWriter) Available() int { + if w.bw == nil { + return bufWriterPoolBufferSize + } + return w.bw.Available() +} + +func (w *bufferedWriter) Write(p []byte) (n int, err error) { + if w.bw == nil { + bw := bufWriterPool.Get().(*bufio.Writer) + bw.Reset(w.w) + w.bw = bw + } + return w.bw.Write(p) +} + +func (w *bufferedWriter) Flush() error { + bw := w.bw + if bw == nil { + return nil + } + err := bw.Flush() + bw.Reset(nil) + bufWriterPool.Put(bw) + w.bw = nil + return err +} + +func mustUint31(v int32) uint32 { + if v < 0 || v > 2147483647 { + panic("out of range") + } + return uint32(v) +} + +// bodyAllowedForStatus reports whether a given response status code +// permits a body. See RFC 7230, section 3.3. +func bodyAllowedForStatus(status int) bool { + switch { + case status >= 100 && status <= 199: + return false + case status == 204: + return false + case status == 304: + return false + } + return true +} + +type httpError struct { + msg string + timeout bool +} + +func (e *httpError) Error() string { return e.msg } +func (e *httpError) Timeout() bool { return e.timeout } +func (e *httpError) Temporary() bool { return true } + +var errTimeout error = &httpError{msg: "http2: timeout awaiting response headers", timeout: true} + +type connectionStater interface { + ConnectionState() tls.ConnectionState +} + +var sorterPool = sync.Pool{New: func() interface{} { return new(sorter) }} + +type sorter struct { + v []string // owned by sorter +} + +func (s *sorter) Len() int { return len(s.v) } +func (s *sorter) Swap(i, j int) { s.v[i], s.v[j] = s.v[j], s.v[i] } +func (s *sorter) Less(i, j int) bool { return s.v[i] < s.v[j] } + +// Keys returns the sorted keys of h. +// +// The returned slice is only valid until s used again or returned to +// its pool. +func (s *sorter) Keys(h http.Header) []string { + keys := s.v[:0] + for k := range h { + keys = append(keys, k) + } + s.v = keys + sort.Sort(s) + return keys +} + +func (s *sorter) SortStrings(ss []string) { + // Our sorter works on s.v, which sorter owns, so + // stash it away while we sort the user's buffer. + save := s.v + s.v = ss + sort.Sort(s) + s.v = save +} + +// validPseudoPath reports whether v is a valid :path pseudo-header +// value. It must be either: +// +// *) a non-empty string starting with '/' +// *) the string '*', for OPTIONS requests. +// +// For now this is only used a quick check for deciding when to clean +// up Opaque URLs before sending requests from the Transport. +// See golang.org/issue/16847 +// +// We used to enforce that the path also didn't start with "//", but +// Google's GFE accepts such paths and Chrome sends them, so ignore +// that part of the spec. See golang.org/issue/19103. +func validPseudoPath(v string) bool { + return (len(v) > 0 && v[0] == '/') || v == "*" +} diff --git a/api/vendor/golang.org/x/net/http2/http2_test.go b/api/vendor/golang.org/x/net/http2/http2_test.go new file mode 100644 index 0000000..667db48 --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/http2_test.go @@ -0,0 +1,227 @@ +// 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 http2 + +import ( + "bytes" + "errors" + "flag" + "fmt" + "net/http" + "os/exec" + "strconv" + "strings" + "testing" + "time" + + "golang.org/x/net/http2/hpack" +) + +var knownFailing = flag.Bool("known_failing", false, "Run known-failing tests.") + +func condSkipFailingTest(t *testing.T) { + if !*knownFailing { + t.Skip("Skipping known-failing test without --known_failing") + } +} + +func init() { + inTests = true + DebugGoroutines = true + flag.BoolVar(&VerboseLogs, "verboseh2", VerboseLogs, "Verbose HTTP/2 debug logging") +} + +func TestSettingString(t *testing.T) { + tests := []struct { + s Setting + want string + }{ + {Setting{SettingMaxFrameSize, 123}, "[MAX_FRAME_SIZE = 123]"}, + {Setting{1<<16 - 1, 123}, "[UNKNOWN_SETTING_65535 = 123]"}, + } + for i, tt := range tests { + got := fmt.Sprint(tt.s) + if got != tt.want { + t.Errorf("%d. for %#v, string = %q; want %q", i, tt.s, got, tt.want) + } + } +} + +type twriter struct { + t testing.TB + st *serverTester // optional +} + +func (w twriter) Write(p []byte) (n int, err error) { + if w.st != nil { + ps := string(p) + for _, phrase := range w.st.logFilter { + if strings.Contains(ps, phrase) { + return len(p), nil // no logging + } + } + } + w.t.Logf("%s", p) + return len(p), nil +} + +// like encodeHeader, but don't add implicit pseudo headers. +func encodeHeaderNoImplicit(t *testing.T, headers ...string) []byte { + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + for len(headers) > 0 { + k, v := headers[0], headers[1] + headers = headers[2:] + if err := enc.WriteField(hpack.HeaderField{Name: k, Value: v}); err != nil { + t.Fatalf("HPACK encoding error for %q/%q: %v", k, v, err) + } + } + return buf.Bytes() +} + +// Verify that curl has http2. +func requireCurl(t *testing.T) { + out, err := dockerLogs(curl(t, "--version")) + if err != nil { + t.Skipf("failed to determine curl features; skipping test") + } + if !strings.Contains(string(out), "HTTP2") { + t.Skip("curl doesn't support HTTP2; skipping test") + } +} + +func curl(t *testing.T, args ...string) (container string) { + out, err := exec.Command("docker", append([]string{"run", "-d", "--net=host", "gohttp2/curl"}, args...)...).Output() + if err != nil { + t.Skipf("Failed to run curl in docker: %v, %s", err, out) + } + return strings.TrimSpace(string(out)) +} + +// Verify that h2load exists. +func requireH2load(t *testing.T) { + out, err := dockerLogs(h2load(t, "--version")) + if err != nil { + t.Skipf("failed to probe h2load; skipping test: %s", out) + } + if !strings.Contains(string(out), "h2load nghttp2/") { + t.Skipf("h2load not present; skipping test. (Output=%q)", out) + } +} + +func h2load(t *testing.T, args ...string) (container string) { + out, err := exec.Command("docker", append([]string{"run", "-d", "--net=host", "--entrypoint=/usr/local/bin/h2load", "gohttp2/curl"}, args...)...).Output() + if err != nil { + t.Skipf("Failed to run h2load in docker: %v, %s", err, out) + } + return strings.TrimSpace(string(out)) +} + +type puppetCommand struct { + fn func(w http.ResponseWriter, r *http.Request) + done chan<- bool +} + +type handlerPuppet struct { + ch chan puppetCommand +} + +func newHandlerPuppet() *handlerPuppet { + return &handlerPuppet{ + ch: make(chan puppetCommand), + } +} + +func (p *handlerPuppet) act(w http.ResponseWriter, r *http.Request) { + for cmd := range p.ch { + cmd.fn(w, r) + cmd.done <- true + } +} + +func (p *handlerPuppet) done() { close(p.ch) } +func (p *handlerPuppet) do(fn func(http.ResponseWriter, *http.Request)) { + done := make(chan bool) + p.ch <- puppetCommand{fn, done} + <-done +} +func dockerLogs(container string) ([]byte, error) { + out, err := exec.Command("docker", "wait", container).CombinedOutput() + if err != nil { + return out, err + } + exitStatus, err := strconv.Atoi(strings.TrimSpace(string(out))) + if err != nil { + return out, errors.New("unexpected exit status from docker wait") + } + out, err = exec.Command("docker", "logs", container).CombinedOutput() + exec.Command("docker", "rm", container).Run() + if err == nil && exitStatus != 0 { + err = fmt.Errorf("exit status %d: %s", exitStatus, out) + } + return out, err +} + +func kill(container string) { + exec.Command("docker", "kill", container).Run() + exec.Command("docker", "rm", container).Run() +} + +func cleanDate(res *http.Response) { + if d := res.Header["Date"]; len(d) == 1 { + d[0] = "XXX" + } +} + +func TestSorterPoolAllocs(t *testing.T) { + ss := []string{"a", "b", "c"} + h := http.Header{ + "a": nil, + "b": nil, + "c": nil, + } + sorter := new(sorter) + + if allocs := testing.AllocsPerRun(100, func() { + sorter.SortStrings(ss) + }); allocs >= 1 { + t.Logf("SortStrings allocs = %v; want <1", allocs) + } + + if allocs := testing.AllocsPerRun(5, func() { + if len(sorter.Keys(h)) != 3 { + t.Fatal("wrong result") + } + }); allocs > 0 { + t.Logf("Keys allocs = %v; want <1", allocs) + } +} + +// waitCondition reports whether fn eventually returned true, +// checking immediately and then every checkEvery amount, +// until waitFor has elapsed, at which point it returns false. +func waitCondition(waitFor, checkEvery time.Duration, fn func() bool) bool { + deadline := time.Now().Add(waitFor) + for time.Now().Before(deadline) { + if fn() { + return true + } + time.Sleep(checkEvery) + } + return false +} + +// waitErrCondition is like waitCondition but with errors instead of bools. +func waitErrCondition(waitFor, checkEvery time.Duration, fn func() error) error { + deadline := time.Now().Add(waitFor) + var err error + for time.Now().Before(deadline) { + if err = fn(); err == nil { + return nil + } + time.Sleep(checkEvery) + } + return err +} diff --git a/api/vendor/golang.org/x/net/http2/not_go16.go b/api/vendor/golang.org/x/net/http2/not_go16.go new file mode 100644 index 0000000..508cebc --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/not_go16.go @@ -0,0 +1,21 @@ +// Copyright 2015 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 !go1.6 + +package http2 + +import ( + "net/http" + "time" +) + +func configureTransport(t1 *http.Transport) (*Transport, error) { + return nil, errTransportVersion +} + +func transportExpectContinueTimeout(t1 *http.Transport) time.Duration { + return 0 + +} diff --git a/api/vendor/golang.org/x/net/http2/not_go17.go b/api/vendor/golang.org/x/net/http2/not_go17.go new file mode 100644 index 0000000..140434a --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/not_go17.go @@ -0,0 +1,87 @@ +// 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. + +// +build !go1.7 + +package http2 + +import ( + "crypto/tls" + "net" + "net/http" + "time" +) + +type contextContext interface { + Done() <-chan struct{} + Err() error +} + +type fakeContext struct{} + +func (fakeContext) Done() <-chan struct{} { return nil } +func (fakeContext) Err() error { panic("should not be called") } + +func reqContext(r *http.Request) fakeContext { + return fakeContext{} +} + +func setResponseUncompressed(res *http.Response) { + // Nothing. +} + +type clientTrace struct{} + +func requestTrace(*http.Request) *clientTrace { return nil } +func traceGotConn(*http.Request, *ClientConn) {} +func traceFirstResponseByte(*clientTrace) {} +func traceWroteHeaders(*clientTrace) {} +func traceWroteRequest(*clientTrace, error) {} +func traceGot100Continue(trace *clientTrace) {} +func traceWait100Continue(trace *clientTrace) {} + +func nop() {} + +func serverConnBaseContext(c net.Conn, opts *ServeConnOpts) (ctx contextContext, cancel func()) { + return nil, nop +} + +func contextWithCancel(ctx contextContext) (_ contextContext, cancel func()) { + return ctx, nop +} + +func requestWithContext(req *http.Request, ctx contextContext) *http.Request { + return req +} + +// temporary copy of Go 1.6's private tls.Config.clone: +func cloneTLSConfig(c *tls.Config) *tls.Config { + return &tls.Config{ + Rand: c.Rand, + Time: c.Time, + Certificates: c.Certificates, + NameToCertificate: c.NameToCertificate, + GetCertificate: c.GetCertificate, + RootCAs: c.RootCAs, + NextProtos: c.NextProtos, + ServerName: c.ServerName, + ClientAuth: c.ClientAuth, + ClientCAs: c.ClientCAs, + InsecureSkipVerify: c.InsecureSkipVerify, + CipherSuites: c.CipherSuites, + PreferServerCipherSuites: c.PreferServerCipherSuites, + SessionTicketsDisabled: c.SessionTicketsDisabled, + SessionTicketKey: c.SessionTicketKey, + ClientSessionCache: c.ClientSessionCache, + MinVersion: c.MinVersion, + MaxVersion: c.MaxVersion, + CurvePreferences: c.CurvePreferences, + } +} + +func (cc *ClientConn) Ping(ctx contextContext) error { + return cc.ping(ctx) +} + +func (t *Transport) idleConnTimeout() time.Duration { return 0 } diff --git a/api/vendor/golang.org/x/net/http2/not_go18.go b/api/vendor/golang.org/x/net/http2/not_go18.go new file mode 100644 index 0000000..6f8d3f8 --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/not_go18.go @@ -0,0 +1,29 @@ +// 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. + +// +build !go1.8 + +package http2 + +import ( + "io" + "net/http" +) + +func configureServer18(h1 *http.Server, h2 *Server) error { + // No IdleTimeout to sync prior to Go 1.8. + return nil +} + +func shouldLogPanic(panicValue interface{}) bool { + return panicValue != nil +} + +func reqGetBody(req *http.Request) func() (io.ReadCloser, error) { + return nil +} + +func reqBodyIsNoBody(io.ReadCloser) bool { return false } + +func go18httpNoBody() io.ReadCloser { return nil } // for tests only diff --git a/api/vendor/golang.org/x/net/http2/not_go19.go b/api/vendor/golang.org/x/net/http2/not_go19.go new file mode 100644 index 0000000..5ae0772 --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/not_go19.go @@ -0,0 +1,16 @@ +// 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. + +// +build !go1.9 + +package http2 + +import ( + "net/http" +) + +func configureServer19(s *http.Server, conf *Server) error { + // not supported prior to go1.9 + return nil +} diff --git a/api/vendor/golang.org/x/net/http2/pipe.go b/api/vendor/golang.org/x/net/http2/pipe.go new file mode 100644 index 0000000..a614009 --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/pipe.go @@ -0,0 +1,163 @@ +// 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 http2 + +import ( + "errors" + "io" + "sync" +) + +// pipe is a goroutine-safe io.Reader/io.Writer pair. It's like +// io.Pipe except there are no PipeReader/PipeWriter halves, and the +// underlying buffer is an interface. (io.Pipe is always unbuffered) +type pipe struct { + mu sync.Mutex + c sync.Cond // c.L lazily initialized to &p.mu + b pipeBuffer // nil when done reading + err error // read error once empty. non-nil means closed. + breakErr error // immediate read error (caller doesn't see rest of b) + donec chan struct{} // closed on error + readFn func() // optional code to run in Read before error +} + +type pipeBuffer interface { + Len() int + io.Writer + io.Reader +} + +func (p *pipe) Len() int { + p.mu.Lock() + defer p.mu.Unlock() + if p.b == nil { + return 0 + } + return p.b.Len() +} + +// Read waits until data is available and copies bytes +// from the buffer into p. +func (p *pipe) Read(d []byte) (n int, err error) { + p.mu.Lock() + defer p.mu.Unlock() + if p.c.L == nil { + p.c.L = &p.mu + } + for { + if p.breakErr != nil { + return 0, p.breakErr + } + if p.b != nil && p.b.Len() > 0 { + return p.b.Read(d) + } + if p.err != nil { + if p.readFn != nil { + p.readFn() // e.g. copy trailers + p.readFn = nil // not sticky like p.err + } + p.b = nil + return 0, p.err + } + p.c.Wait() + } +} + +var errClosedPipeWrite = errors.New("write on closed buffer") + +// Write copies bytes from p into the buffer and wakes a reader. +// It is an error to write more data than the buffer can hold. +func (p *pipe) Write(d []byte) (n int, err error) { + p.mu.Lock() + defer p.mu.Unlock() + if p.c.L == nil { + p.c.L = &p.mu + } + defer p.c.Signal() + if p.err != nil { + return 0, errClosedPipeWrite + } + if p.breakErr != nil { + return len(d), nil // discard when there is no reader + } + return p.b.Write(d) +} + +// CloseWithError causes the next Read (waking up a current blocked +// Read if needed) to return the provided err after all data has been +// read. +// +// The error must be non-nil. +func (p *pipe) CloseWithError(err error) { p.closeWithError(&p.err, err, nil) } + +// BreakWithError causes the next Read (waking up a current blocked +// Read if needed) to return the provided err immediately, without +// waiting for unread data. +func (p *pipe) BreakWithError(err error) { p.closeWithError(&p.breakErr, err, nil) } + +// closeWithErrorAndCode is like CloseWithError but also sets some code to run +// in the caller's goroutine before returning the error. +func (p *pipe) closeWithErrorAndCode(err error, fn func()) { p.closeWithError(&p.err, err, fn) } + +func (p *pipe) closeWithError(dst *error, err error, fn func()) { + if err == nil { + panic("err must be non-nil") + } + p.mu.Lock() + defer p.mu.Unlock() + if p.c.L == nil { + p.c.L = &p.mu + } + defer p.c.Signal() + if *dst != nil { + // Already been done. + return + } + p.readFn = fn + if dst == &p.breakErr { + p.b = nil + } + *dst = err + p.closeDoneLocked() +} + +// requires p.mu be held. +func (p *pipe) closeDoneLocked() { + if p.donec == nil { + return + } + // Close if unclosed. This isn't racy since we always + // hold p.mu while closing. + select { + case <-p.donec: + default: + close(p.donec) + } +} + +// Err returns the error (if any) first set by BreakWithError or CloseWithError. +func (p *pipe) Err() error { + p.mu.Lock() + defer p.mu.Unlock() + if p.breakErr != nil { + return p.breakErr + } + return p.err +} + +// Done returns a channel which is closed if and when this pipe is closed +// with CloseWithError. +func (p *pipe) Done() <-chan struct{} { + p.mu.Lock() + defer p.mu.Unlock() + if p.donec == nil { + p.donec = make(chan struct{}) + if p.err != nil || p.breakErr != nil { + // Already hit an error. + p.closeDoneLocked() + } + } + return p.donec +} diff --git a/api/vendor/golang.org/x/net/http2/pipe_test.go b/api/vendor/golang.org/x/net/http2/pipe_test.go new file mode 100644 index 0000000..1bf351f --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/pipe_test.go @@ -0,0 +1,130 @@ +// 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 http2 + +import ( + "bytes" + "errors" + "io" + "io/ioutil" + "testing" +) + +func TestPipeClose(t *testing.T) { + var p pipe + p.b = new(bytes.Buffer) + a := errors.New("a") + b := errors.New("b") + p.CloseWithError(a) + p.CloseWithError(b) + _, err := p.Read(make([]byte, 1)) + if err != a { + t.Errorf("err = %v want %v", err, a) + } +} + +func TestPipeDoneChan(t *testing.T) { + var p pipe + done := p.Done() + select { + case <-done: + t.Fatal("done too soon") + default: + } + p.CloseWithError(io.EOF) + select { + case <-done: + default: + t.Fatal("should be done") + } +} + +func TestPipeDoneChan_ErrFirst(t *testing.T) { + var p pipe + p.CloseWithError(io.EOF) + done := p.Done() + select { + case <-done: + default: + t.Fatal("should be done") + } +} + +func TestPipeDoneChan_Break(t *testing.T) { + var p pipe + done := p.Done() + select { + case <-done: + t.Fatal("done too soon") + default: + } + p.BreakWithError(io.EOF) + select { + case <-done: + default: + t.Fatal("should be done") + } +} + +func TestPipeDoneChan_Break_ErrFirst(t *testing.T) { + var p pipe + p.BreakWithError(io.EOF) + done := p.Done() + select { + case <-done: + default: + t.Fatal("should be done") + } +} + +func TestPipeCloseWithError(t *testing.T) { + p := &pipe{b: new(bytes.Buffer)} + const body = "foo" + io.WriteString(p, body) + a := errors.New("test error") + p.CloseWithError(a) + all, err := ioutil.ReadAll(p) + if string(all) != body { + t.Errorf("read bytes = %q; want %q", all, body) + } + if err != a { + t.Logf("read error = %v, %v", err, a) + } + // Read and Write should fail. + if n, err := p.Write([]byte("abc")); err != errClosedPipeWrite || n != 0 { + t.Errorf("Write(abc) after close\ngot %v, %v\nwant 0, %v", n, err, errClosedPipeWrite) + } + if n, err := p.Read(make([]byte, 1)); err == nil || n != 0 { + t.Errorf("Read() after close\ngot %v, nil\nwant 0, %v", n, errClosedPipeWrite) + } +} + +func TestPipeBreakWithError(t *testing.T) { + p := &pipe{b: new(bytes.Buffer)} + io.WriteString(p, "foo") + a := errors.New("test err") + p.BreakWithError(a) + all, err := ioutil.ReadAll(p) + if string(all) != "" { + t.Errorf("read bytes = %q; want empty string", all) + } + if err != a { + t.Logf("read error = %v, %v", err, a) + } + if p.b != nil { + t.Errorf("buffer should be nil after BreakWithError") + } + // Write should succeed silently. + if n, err := p.Write([]byte("abc")); err != nil || n != 3 { + t.Errorf("Write(abc) after break\ngot %v, %v\nwant 0, nil", n, err) + } + if p.b != nil { + t.Errorf("buffer should be nil after Write") + } + // Read should fail. + if n, err := p.Read(make([]byte, 1)); err == nil || n != 0 { + t.Errorf("Read() after close\ngot %v, nil\nwant 0, not nil", n) + } +} diff --git a/api/vendor/golang.org/x/net/http2/server.go b/api/vendor/golang.org/x/net/http2/server.go new file mode 100644 index 0000000..acf3b24 --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/server.go @@ -0,0 +1,2882 @@ +// 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. + +// TODO: turn off the serve goroutine when idle, so +// an idle conn only has the readFrames goroutine active. (which could +// also be optimized probably to pin less memory in crypto/tls). This +// would involve tracking when the serve goroutine is active (atomic +// int32 read/CAS probably?) and starting it up when frames arrive, +// and shutting it down when all handlers exit. the occasional PING +// packets could use time.AfterFunc to call sc.wakeStartServeLoop() +// (which is a no-op if already running) and then queue the PING write +// as normal. The serve loop would then exit in most cases (if no +// Handlers running) and not be woken up again until the PING packet +// returns. + +// TODO (maybe): add a mechanism for Handlers to going into +// half-closed-local mode (rw.(io.Closer) test?) but not exit their +// handler, and continue to be able to read from the +// Request.Body. This would be a somewhat semantic change from HTTP/1 +// (or at least what we expose in net/http), so I'd probably want to +// add it there too. For now, this package says that returning from +// the Handler ServeHTTP function means you're both done reading and +// done writing, without a way to stop just one or the other. + +package http2 + +import ( + "bufio" + "bytes" + "crypto/tls" + "errors" + "fmt" + "io" + "log" + "math" + "net" + "net/http" + "net/textproto" + "net/url" + "os" + "reflect" + "runtime" + "strconv" + "strings" + "sync" + "time" + + "golang.org/x/net/http/httpguts" + "golang.org/x/net/http2/hpack" +) + +const ( + prefaceTimeout = 10 * time.Second + firstSettingsTimeout = 2 * time.Second // should be in-flight with preface anyway + handlerChunkWriteSize = 4 << 10 + defaultMaxStreams = 250 // TODO: make this 100 as the GFE seems to? +) + +var ( + errClientDisconnected = errors.New("client disconnected") + errClosedBody = errors.New("body closed by handler") + errHandlerComplete = errors.New("http2: request body closed due to handler exiting") + errStreamClosed = errors.New("http2: stream closed") +) + +var responseWriterStatePool = sync.Pool{ + New: func() interface{} { + rws := &responseWriterState{} + rws.bw = bufio.NewWriterSize(chunkWriter{rws}, handlerChunkWriteSize) + return rws + }, +} + +// Test hooks. +var ( + testHookOnConn func() + testHookGetServerConn func(*serverConn) + testHookOnPanicMu *sync.Mutex // nil except in tests + testHookOnPanic func(sc *serverConn, panicVal interface{}) (rePanic bool) +) + +// Server is an HTTP/2 server. +type Server struct { + // MaxHandlers limits the number of http.Handler ServeHTTP goroutines + // which may run at a time over all connections. + // Negative or zero no limit. + // TODO: implement + MaxHandlers int + + // MaxConcurrentStreams optionally specifies the number of + // concurrent streams that each client may have open at a + // time. This is unrelated to the number of http.Handler goroutines + // which may be active globally, which is MaxHandlers. + // If zero, MaxConcurrentStreams defaults to at least 100, per + // the HTTP/2 spec's recommendations. + MaxConcurrentStreams uint32 + + // MaxReadFrameSize optionally specifies the largest frame + // this server is willing to read. A valid value is between + // 16k and 16M, inclusive. If zero or otherwise invalid, a + // default value is used. + MaxReadFrameSize uint32 + + // PermitProhibitedCipherSuites, if true, permits the use of + // cipher suites prohibited by the HTTP/2 spec. + PermitProhibitedCipherSuites bool + + // IdleTimeout specifies how long until idle clients should be + // closed with a GOAWAY frame. PING frames are not considered + // activity for the purposes of IdleTimeout. + IdleTimeout time.Duration + + // MaxUploadBufferPerConnection is the size of the initial flow + // control window for each connections. The HTTP/2 spec does not + // allow this to be smaller than 65535 or larger than 2^32-1. + // If the value is outside this range, a default value will be + // used instead. + MaxUploadBufferPerConnection int32 + + // MaxUploadBufferPerStream is the size of the initial flow control + // window for each stream. The HTTP/2 spec does not allow this to + // be larger than 2^32-1. If the value is zero or larger than the + // maximum, a default value will be used instead. + MaxUploadBufferPerStream int32 + + // NewWriteScheduler constructs a write scheduler for a connection. + // If nil, a default scheduler is chosen. + NewWriteScheduler func() WriteScheduler + + // Internal state. This is a pointer (rather than embedded directly) + // so that we don't embed a Mutex in this struct, which will make the + // struct non-copyable, which might break some callers. + state *serverInternalState +} + +func (s *Server) initialConnRecvWindowSize() int32 { + if s.MaxUploadBufferPerConnection > initialWindowSize { + return s.MaxUploadBufferPerConnection + } + return 1 << 20 +} + +func (s *Server) initialStreamRecvWindowSize() int32 { + if s.MaxUploadBufferPerStream > 0 { + return s.MaxUploadBufferPerStream + } + return 1 << 20 +} + +func (s *Server) maxReadFrameSize() uint32 { + if v := s.MaxReadFrameSize; v >= minMaxFrameSize && v <= maxFrameSize { + return v + } + return defaultMaxReadFrameSize +} + +func (s *Server) maxConcurrentStreams() uint32 { + if v := s.MaxConcurrentStreams; v > 0 { + return v + } + return defaultMaxStreams +} + +type serverInternalState struct { + mu sync.Mutex + activeConns map[*serverConn]struct{} +} + +func (s *serverInternalState) registerConn(sc *serverConn) { + if s == nil { + return // if the Server was used without calling ConfigureServer + } + s.mu.Lock() + s.activeConns[sc] = struct{}{} + s.mu.Unlock() +} + +func (s *serverInternalState) unregisterConn(sc *serverConn) { + if s == nil { + return // if the Server was used without calling ConfigureServer + } + s.mu.Lock() + delete(s.activeConns, sc) + s.mu.Unlock() +} + +func (s *serverInternalState) startGracefulShutdown() { + if s == nil { + return // if the Server was used without calling ConfigureServer + } + s.mu.Lock() + for sc := range s.activeConns { + sc.startGracefulShutdown() + } + s.mu.Unlock() +} + +// ConfigureServer adds HTTP/2 support to a net/http Server. +// +// The configuration conf may be nil. +// +// ConfigureServer must be called before s begins serving. +func ConfigureServer(s *http.Server, conf *Server) error { + if s == nil { + panic("nil *http.Server") + } + if conf == nil { + conf = new(Server) + } + conf.state = &serverInternalState{activeConns: make(map[*serverConn]struct{})} + if err := configureServer18(s, conf); err != nil { + return err + } + if err := configureServer19(s, conf); err != nil { + return err + } + + if s.TLSConfig == nil { + s.TLSConfig = new(tls.Config) + } else if s.TLSConfig.CipherSuites != nil { + // If they already provided a CipherSuite list, return + // an error if it has a bad order or is missing + // ECDHE_RSA_WITH_AES_128_GCM_SHA256 or ECDHE_ECDSA_WITH_AES_128_GCM_SHA256. + haveRequired := false + sawBad := false + for i, cs := range s.TLSConfig.CipherSuites { + switch cs { + case tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, + // Alternative MTI cipher to not discourage ECDSA-only servers. + // See http://golang.org/cl/30721 for further information. + tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256: + haveRequired = true + } + if isBadCipher(cs) { + sawBad = true + } else if sawBad { + return fmt.Errorf("http2: TLSConfig.CipherSuites index %d contains an HTTP/2-approved cipher suite (%#04x), but it comes after unapproved cipher suites. With this configuration, clients that don't support previous, approved cipher suites may be given an unapproved one and reject the connection.", i, cs) + } + } + if !haveRequired { + return fmt.Errorf("http2: TLSConfig.CipherSuites is missing an HTTP/2-required AES_128_GCM_SHA256 cipher.") + } + } + + // Note: not setting MinVersion to tls.VersionTLS12, + // as we don't want to interfere with HTTP/1.1 traffic + // on the user's server. We enforce TLS 1.2 later once + // we accept a connection. Ideally this should be done + // during next-proto selection, but using TLS <1.2 with + // HTTP/2 is still the client's bug. + + s.TLSConfig.PreferServerCipherSuites = true + + haveNPN := false + for _, p := range s.TLSConfig.NextProtos { + if p == NextProtoTLS { + haveNPN = true + break + } + } + if !haveNPN { + s.TLSConfig.NextProtos = append(s.TLSConfig.NextProtos, NextProtoTLS) + } + + if s.TLSNextProto == nil { + s.TLSNextProto = map[string]func(*http.Server, *tls.Conn, http.Handler){} + } + protoHandler := func(hs *http.Server, c *tls.Conn, h http.Handler) { + if testHookOnConn != nil { + testHookOnConn() + } + conf.ServeConn(c, &ServeConnOpts{ + Handler: h, + BaseConfig: hs, + }) + } + s.TLSNextProto[NextProtoTLS] = protoHandler + return nil +} + +// ServeConnOpts are options for the Server.ServeConn method. +type ServeConnOpts struct { + // BaseConfig optionally sets the base configuration + // for values. If nil, defaults are used. + BaseConfig *http.Server + + // Handler specifies which handler to use for processing + // requests. If nil, BaseConfig.Handler is used. If BaseConfig + // or BaseConfig.Handler is nil, http.DefaultServeMux is used. + Handler http.Handler +} + +func (o *ServeConnOpts) baseConfig() *http.Server { + if o != nil && o.BaseConfig != nil { + return o.BaseConfig + } + return new(http.Server) +} + +func (o *ServeConnOpts) handler() http.Handler { + if o != nil { + if o.Handler != nil { + return o.Handler + } + if o.BaseConfig != nil && o.BaseConfig.Handler != nil { + return o.BaseConfig.Handler + } + } + return http.DefaultServeMux +} + +// ServeConn serves HTTP/2 requests on the provided connection and +// blocks until the connection is no longer readable. +// +// ServeConn starts speaking HTTP/2 assuming that c has not had any +// reads or writes. It writes its initial settings frame and expects +// to be able to read the preface and settings frame from the +// client. If c has a ConnectionState method like a *tls.Conn, the +// ConnectionState is used to verify the TLS ciphersuite and to set +// the Request.TLS field in Handlers. +// +// ServeConn does not support h2c by itself. Any h2c support must be +// implemented in terms of providing a suitably-behaving net.Conn. +// +// The opts parameter is optional. If nil, default values are used. +func (s *Server) ServeConn(c net.Conn, opts *ServeConnOpts) { + baseCtx, cancel := serverConnBaseContext(c, opts) + defer cancel() + + sc := &serverConn{ + srv: s, + hs: opts.baseConfig(), + conn: c, + baseCtx: baseCtx, + remoteAddrStr: c.RemoteAddr().String(), + bw: newBufferedWriter(c), + handler: opts.handler(), + streams: make(map[uint32]*stream), + readFrameCh: make(chan readFrameResult), + wantWriteFrameCh: make(chan FrameWriteRequest, 8), + serveMsgCh: make(chan interface{}, 8), + wroteFrameCh: make(chan frameWriteResult, 1), // buffered; one send in writeFrameAsync + bodyReadCh: make(chan bodyReadMsg), // buffering doesn't matter either way + doneServing: make(chan struct{}), + clientMaxStreams: math.MaxUint32, // Section 6.5.2: "Initially, there is no limit to this value" + advMaxStreams: s.maxConcurrentStreams(), + initialStreamSendWindowSize: initialWindowSize, + maxFrameSize: initialMaxFrameSize, + headerTableSize: initialHeaderTableSize, + serveG: newGoroutineLock(), + pushEnabled: true, + } + + s.state.registerConn(sc) + defer s.state.unregisterConn(sc) + + // The net/http package sets the write deadline from the + // http.Server.WriteTimeout during the TLS handshake, but then + // passes the connection off to us with the deadline already set. + // Write deadlines are set per stream in serverConn.newStream. + // Disarm the net.Conn write deadline here. + if sc.hs.WriteTimeout != 0 { + sc.conn.SetWriteDeadline(time.Time{}) + } + + if s.NewWriteScheduler != nil { + sc.writeSched = s.NewWriteScheduler() + } else { + sc.writeSched = NewRandomWriteScheduler() + } + + // These start at the RFC-specified defaults. If there is a higher + // configured value for inflow, that will be updated when we send a + // WINDOW_UPDATE shortly after sending SETTINGS. + sc.flow.add(initialWindowSize) + sc.inflow.add(initialWindowSize) + sc.hpackEncoder = hpack.NewEncoder(&sc.headerWriteBuf) + + fr := NewFramer(sc.bw, c) + fr.ReadMetaHeaders = hpack.NewDecoder(initialHeaderTableSize, nil) + fr.MaxHeaderListSize = sc.maxHeaderListSize() + fr.SetMaxReadFrameSize(s.maxReadFrameSize()) + sc.framer = fr + + if tc, ok := c.(connectionStater); ok { + sc.tlsState = new(tls.ConnectionState) + *sc.tlsState = tc.ConnectionState() + // 9.2 Use of TLS Features + // An implementation of HTTP/2 over TLS MUST use TLS + // 1.2 or higher with the restrictions on feature set + // and cipher suite described in this section. Due to + // implementation limitations, it might not be + // possible to fail TLS negotiation. An endpoint MUST + // immediately terminate an HTTP/2 connection that + // does not meet the TLS requirements described in + // this section with a connection error (Section + // 5.4.1) of type INADEQUATE_SECURITY. + if sc.tlsState.Version < tls.VersionTLS12 { + sc.rejectConn(ErrCodeInadequateSecurity, "TLS version too low") + return + } + + if sc.tlsState.ServerName == "" { + // Client must use SNI, but we don't enforce that anymore, + // since it was causing problems when connecting to bare IP + // addresses during development. + // + // TODO: optionally enforce? Or enforce at the time we receive + // a new request, and verify the ServerName matches the :authority? + // But that precludes proxy situations, perhaps. + // + // So for now, do nothing here again. + } + + if !s.PermitProhibitedCipherSuites && isBadCipher(sc.tlsState.CipherSuite) { + // "Endpoints MAY choose to generate a connection error + // (Section 5.4.1) of type INADEQUATE_SECURITY if one of + // the prohibited cipher suites are negotiated." + // + // We choose that. In my opinion, the spec is weak + // here. It also says both parties must support at least + // TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 so there's no + // excuses here. If we really must, we could allow an + // "AllowInsecureWeakCiphers" option on the server later. + // Let's see how it plays out first. + sc.rejectConn(ErrCodeInadequateSecurity, fmt.Sprintf("Prohibited TLS 1.2 Cipher Suite: %x", sc.tlsState.CipherSuite)) + return + } + } + + if hook := testHookGetServerConn; hook != nil { + hook(sc) + } + sc.serve() +} + +func (sc *serverConn) rejectConn(err ErrCode, debug string) { + sc.vlogf("http2: server rejecting conn: %v, %s", err, debug) + // ignoring errors. hanging up anyway. + sc.framer.WriteGoAway(0, err, []byte(debug)) + sc.bw.Flush() + sc.conn.Close() +} + +type serverConn struct { + // Immutable: + srv *Server + hs *http.Server + conn net.Conn + bw *bufferedWriter // writing to conn + handler http.Handler + baseCtx contextContext + framer *Framer + doneServing chan struct{} // closed when serverConn.serve ends + readFrameCh chan readFrameResult // written by serverConn.readFrames + wantWriteFrameCh chan FrameWriteRequest // from handlers -> serve + wroteFrameCh chan frameWriteResult // from writeFrameAsync -> serve, tickles more frame writes + bodyReadCh chan bodyReadMsg // from handlers -> serve + serveMsgCh chan interface{} // misc messages & code to send to / run on the serve loop + flow flow // conn-wide (not stream-specific) outbound flow control + inflow flow // conn-wide inbound flow control + tlsState *tls.ConnectionState // shared by all handlers, like net/http + remoteAddrStr string + writeSched WriteScheduler + + // Everything following is owned by the serve loop; use serveG.check(): + serveG goroutineLock // used to verify funcs are on serve() + pushEnabled bool + sawFirstSettings bool // got the initial SETTINGS frame after the preface + needToSendSettingsAck bool + unackedSettings int // how many SETTINGS have we sent without ACKs? + clientMaxStreams uint32 // SETTINGS_MAX_CONCURRENT_STREAMS from client (our PUSH_PROMISE limit) + advMaxStreams uint32 // our SETTINGS_MAX_CONCURRENT_STREAMS advertised the client + curClientStreams uint32 // number of open streams initiated by the client + curPushedStreams uint32 // number of open streams initiated by server push + maxClientStreamID uint32 // max ever seen from client (odd), or 0 if there have been no client requests + maxPushPromiseID uint32 // ID of the last push promise (even), or 0 if there have been no pushes + streams map[uint32]*stream + initialStreamSendWindowSize int32 + maxFrameSize int32 + headerTableSize uint32 + peerMaxHeaderListSize uint32 // zero means unknown (default) + canonHeader map[string]string // http2-lower-case -> Go-Canonical-Case + writingFrame bool // started writing a frame (on serve goroutine or separate) + writingFrameAsync bool // started a frame on its own goroutine but haven't heard back on wroteFrameCh + needsFrameFlush bool // last frame write wasn't a flush + inGoAway bool // we've started to or sent GOAWAY + inFrameScheduleLoop bool // whether we're in the scheduleFrameWrite loop + needToSendGoAway bool // we need to schedule a GOAWAY frame write + goAwayCode ErrCode + shutdownTimer *time.Timer // nil until used + idleTimer *time.Timer // nil if unused + + // Owned by the writeFrameAsync goroutine: + headerWriteBuf bytes.Buffer + hpackEncoder *hpack.Encoder + + // Used by startGracefulShutdown. + shutdownOnce sync.Once +} + +func (sc *serverConn) maxHeaderListSize() uint32 { + n := sc.hs.MaxHeaderBytes + if n <= 0 { + n = http.DefaultMaxHeaderBytes + } + // http2's count is in a slightly different unit and includes 32 bytes per pair. + // So, take the net/http.Server value and pad it up a bit, assuming 10 headers. + const perFieldOverhead = 32 // per http2 spec + const typicalHeaders = 10 // conservative + return uint32(n + typicalHeaders*perFieldOverhead) +} + +func (sc *serverConn) curOpenStreams() uint32 { + sc.serveG.check() + return sc.curClientStreams + sc.curPushedStreams +} + +// stream represents a stream. This is the minimal metadata needed by +// the serve goroutine. Most of the actual stream state is owned by +// the http.Handler's goroutine in the responseWriter. Because the +// responseWriter's responseWriterState is recycled at the end of a +// handler, this struct intentionally has no pointer to the +// *responseWriter{,State} itself, as the Handler ending nils out the +// responseWriter's state field. +type stream struct { + // immutable: + sc *serverConn + id uint32 + body *pipe // non-nil if expecting DATA frames + cw closeWaiter // closed wait stream transitions to closed state + ctx contextContext + cancelCtx func() + + // owned by serverConn's serve loop: + bodyBytes int64 // body bytes seen so far + declBodyBytes int64 // or -1 if undeclared + flow flow // limits writing from Handler to client + inflow flow // what the client is allowed to POST/etc to us + parent *stream // or nil + numTrailerValues int64 + weight uint8 + state streamState + resetQueued bool // RST_STREAM queued for write; set by sc.resetStream + gotTrailerHeader bool // HEADER frame for trailers was seen + wroteHeaders bool // whether we wrote headers (not status 100) + writeDeadline *time.Timer // nil if unused + + trailer http.Header // accumulated trailers + reqTrailer http.Header // handler's Request.Trailer +} + +func (sc *serverConn) Framer() *Framer { return sc.framer } +func (sc *serverConn) CloseConn() error { return sc.conn.Close() } +func (sc *serverConn) Flush() error { return sc.bw.Flush() } +func (sc *serverConn) HeaderEncoder() (*hpack.Encoder, *bytes.Buffer) { + return sc.hpackEncoder, &sc.headerWriteBuf +} + +func (sc *serverConn) state(streamID uint32) (streamState, *stream) { + sc.serveG.check() + // http://tools.ietf.org/html/rfc7540#section-5.1 + if st, ok := sc.streams[streamID]; ok { + return st.state, st + } + // "The first use of a new stream identifier implicitly closes all + // streams in the "idle" state that might have been initiated by + // that peer with a lower-valued stream identifier. For example, if + // a client sends a HEADERS frame on stream 7 without ever sending a + // frame on stream 5, then stream 5 transitions to the "closed" + // state when the first frame for stream 7 is sent or received." + if streamID%2 == 1 { + if streamID <= sc.maxClientStreamID { + return stateClosed, nil + } + } else { + if streamID <= sc.maxPushPromiseID { + return stateClosed, nil + } + } + return stateIdle, nil +} + +// setConnState calls the net/http ConnState hook for this connection, if configured. +// Note that the net/http package does StateNew and StateClosed for us. +// There is currently no plan for StateHijacked or hijacking HTTP/2 connections. +func (sc *serverConn) setConnState(state http.ConnState) { + if sc.hs.ConnState != nil { + sc.hs.ConnState(sc.conn, state) + } +} + +func (sc *serverConn) vlogf(format string, args ...interface{}) { + if VerboseLogs { + sc.logf(format, args...) + } +} + +func (sc *serverConn) logf(format string, args ...interface{}) { + if lg := sc.hs.ErrorLog; lg != nil { + lg.Printf(format, args...) + } else { + log.Printf(format, args...) + } +} + +// errno returns v's underlying uintptr, else 0. +// +// TODO: remove this helper function once http2 can use build +// tags. See comment in isClosedConnError. +func errno(v error) uintptr { + if rv := reflect.ValueOf(v); rv.Kind() == reflect.Uintptr { + return uintptr(rv.Uint()) + } + return 0 +} + +// isClosedConnError reports whether err is an error from use of a closed +// network connection. +func isClosedConnError(err error) bool { + if err == nil { + return false + } + + // TODO: remove this string search and be more like the Windows + // case below. That might involve modifying the standard library + // to return better error types. + str := err.Error() + if strings.Contains(str, "use of closed network connection") { + return true + } + + // TODO(bradfitz): x/tools/cmd/bundle doesn't really support + // build tags, so I can't make an http2_windows.go file with + // Windows-specific stuff. Fix that and move this, once we + // have a way to bundle this into std's net/http somehow. + if runtime.GOOS == "windows" { + if oe, ok := err.(*net.OpError); ok && oe.Op == "read" { + if se, ok := oe.Err.(*os.SyscallError); ok && se.Syscall == "wsarecv" { + const WSAECONNABORTED = 10053 + const WSAECONNRESET = 10054 + if n := errno(se.Err); n == WSAECONNRESET || n == WSAECONNABORTED { + return true + } + } + } + } + return false +} + +func (sc *serverConn) condlogf(err error, format string, args ...interface{}) { + if err == nil { + return + } + if err == io.EOF || err == io.ErrUnexpectedEOF || isClosedConnError(err) || err == errPrefaceTimeout { + // Boring, expected errors. + sc.vlogf(format, args...) + } else { + sc.logf(format, args...) + } +} + +func (sc *serverConn) canonicalHeader(v string) string { + sc.serveG.check() + cv, ok := commonCanonHeader[v] + if ok { + return cv + } + cv, ok = sc.canonHeader[v] + if ok { + return cv + } + if sc.canonHeader == nil { + sc.canonHeader = make(map[string]string) + } + cv = http.CanonicalHeaderKey(v) + sc.canonHeader[v] = cv + return cv +} + +type readFrameResult struct { + f Frame // valid until readMore is called + err error + + // readMore should be called once the consumer no longer needs or + // retains f. After readMore, f is invalid and more frames can be + // read. + readMore func() +} + +// readFrames is the loop that reads incoming frames. +// It takes care to only read one frame at a time, blocking until the +// consumer is done with the frame. +// It's run on its own goroutine. +func (sc *serverConn) readFrames() { + gate := make(gate) + gateDone := gate.Done + for { + f, err := sc.framer.ReadFrame() + select { + case sc.readFrameCh <- readFrameResult{f, err, gateDone}: + case <-sc.doneServing: + return + } + select { + case <-gate: + case <-sc.doneServing: + return + } + if terminalReadFrameError(err) { + return + } + } +} + +// frameWriteResult is the message passed from writeFrameAsync to the serve goroutine. +type frameWriteResult struct { + wr FrameWriteRequest // what was written (or attempted) + err error // result of the writeFrame call +} + +// writeFrameAsync runs in its own goroutine and writes a single frame +// and then reports when it's done. +// At most one goroutine can be running writeFrameAsync at a time per +// serverConn. +func (sc *serverConn) writeFrameAsync(wr FrameWriteRequest) { + err := wr.write.writeFrame(sc) + sc.wroteFrameCh <- frameWriteResult{wr, err} +} + +func (sc *serverConn) closeAllStreamsOnConnClose() { + sc.serveG.check() + for _, st := range sc.streams { + sc.closeStream(st, errClientDisconnected) + } +} + +func (sc *serverConn) stopShutdownTimer() { + sc.serveG.check() + if t := sc.shutdownTimer; t != nil { + t.Stop() + } +} + +func (sc *serverConn) notePanic() { + // Note: this is for serverConn.serve panicking, not http.Handler code. + if testHookOnPanicMu != nil { + testHookOnPanicMu.Lock() + defer testHookOnPanicMu.Unlock() + } + if testHookOnPanic != nil { + if e := recover(); e != nil { + if testHookOnPanic(sc, e) { + panic(e) + } + } + } +} + +func (sc *serverConn) serve() { + sc.serveG.check() + defer sc.notePanic() + defer sc.conn.Close() + defer sc.closeAllStreamsOnConnClose() + defer sc.stopShutdownTimer() + defer close(sc.doneServing) // unblocks handlers trying to send + + if VerboseLogs { + sc.vlogf("http2: server connection from %v on %p", sc.conn.RemoteAddr(), sc.hs) + } + + sc.writeFrame(FrameWriteRequest{ + write: writeSettings{ + {SettingMaxFrameSize, sc.srv.maxReadFrameSize()}, + {SettingMaxConcurrentStreams, sc.advMaxStreams}, + {SettingMaxHeaderListSize, sc.maxHeaderListSize()}, + {SettingInitialWindowSize, uint32(sc.srv.initialStreamRecvWindowSize())}, + }, + }) + sc.unackedSettings++ + + // Each connection starts with intialWindowSize inflow tokens. + // If a higher value is configured, we add more tokens. + if diff := sc.srv.initialConnRecvWindowSize() - initialWindowSize; diff > 0 { + sc.sendWindowUpdate(nil, int(diff)) + } + + if err := sc.readPreface(); err != nil { + sc.condlogf(err, "http2: server: error reading preface from client %v: %v", sc.conn.RemoteAddr(), err) + return + } + // Now that we've got the preface, get us out of the + // "StateNew" state. We can't go directly to idle, though. + // Active means we read some data and anticipate a request. We'll + // do another Active when we get a HEADERS frame. + sc.setConnState(http.StateActive) + sc.setConnState(http.StateIdle) + + if sc.srv.IdleTimeout != 0 { + sc.idleTimer = time.AfterFunc(sc.srv.IdleTimeout, sc.onIdleTimer) + defer sc.idleTimer.Stop() + } + + go sc.readFrames() // closed by defer sc.conn.Close above + + settingsTimer := time.AfterFunc(firstSettingsTimeout, sc.onSettingsTimer) + defer settingsTimer.Stop() + + loopNum := 0 + for { + loopNum++ + select { + case wr := <-sc.wantWriteFrameCh: + if se, ok := wr.write.(StreamError); ok { + sc.resetStream(se) + break + } + sc.writeFrame(wr) + case res := <-sc.wroteFrameCh: + sc.wroteFrame(res) + case res := <-sc.readFrameCh: + if !sc.processFrameFromReader(res) { + return + } + res.readMore() + if settingsTimer != nil { + settingsTimer.Stop() + settingsTimer = nil + } + case m := <-sc.bodyReadCh: + sc.noteBodyRead(m.st, m.n) + case msg := <-sc.serveMsgCh: + switch v := msg.(type) { + case func(int): + v(loopNum) // for testing + case *serverMessage: + switch v { + case settingsTimerMsg: + sc.logf("timeout waiting for SETTINGS frames from %v", sc.conn.RemoteAddr()) + return + case idleTimerMsg: + sc.vlogf("connection is idle") + sc.goAway(ErrCodeNo) + case shutdownTimerMsg: + sc.vlogf("GOAWAY close timer fired; closing conn from %v", sc.conn.RemoteAddr()) + return + case gracefulShutdownMsg: + sc.startGracefulShutdownInternal() + default: + panic("unknown timer") + } + case *startPushRequest: + sc.startPush(v) + default: + panic(fmt.Sprintf("unexpected type %T", v)) + } + } + + // Start the shutdown timer after sending a GOAWAY. When sending GOAWAY + // with no error code (graceful shutdown), don't start the timer until + // all open streams have been completed. + sentGoAway := sc.inGoAway && !sc.needToSendGoAway && !sc.writingFrame + gracefulShutdownComplete := sc.goAwayCode == ErrCodeNo && sc.curOpenStreams() == 0 + if sentGoAway && sc.shutdownTimer == nil && (sc.goAwayCode != ErrCodeNo || gracefulShutdownComplete) { + sc.shutDownIn(goAwayTimeout) + } + } +} + +func (sc *serverConn) awaitGracefulShutdown(sharedCh <-chan struct{}, privateCh chan struct{}) { + select { + case <-sc.doneServing: + case <-sharedCh: + close(privateCh) + } +} + +type serverMessage int + +// Message values sent to serveMsgCh. +var ( + settingsTimerMsg = new(serverMessage) + idleTimerMsg = new(serverMessage) + shutdownTimerMsg = new(serverMessage) + gracefulShutdownMsg = new(serverMessage) +) + +func (sc *serverConn) onSettingsTimer() { sc.sendServeMsg(settingsTimerMsg) } +func (sc *serverConn) onIdleTimer() { sc.sendServeMsg(idleTimerMsg) } +func (sc *serverConn) onShutdownTimer() { sc.sendServeMsg(shutdownTimerMsg) } + +func (sc *serverConn) sendServeMsg(msg interface{}) { + sc.serveG.checkNotOn() // NOT + select { + case sc.serveMsgCh <- msg: + case <-sc.doneServing: + } +} + +var errPrefaceTimeout = errors.New("timeout waiting for client preface") + +// readPreface reads the ClientPreface greeting from the peer or +// returns errPrefaceTimeout on timeout, or an error if the greeting +// is invalid. +func (sc *serverConn) readPreface() error { + errc := make(chan error, 1) + go func() { + // Read the client preface + buf := make([]byte, len(ClientPreface)) + if _, err := io.ReadFull(sc.conn, buf); err != nil { + errc <- err + } else if !bytes.Equal(buf, clientPreface) { + errc <- fmt.Errorf("bogus greeting %q", buf) + } else { + errc <- nil + } + }() + timer := time.NewTimer(prefaceTimeout) // TODO: configurable on *Server? + defer timer.Stop() + select { + case <-timer.C: + return errPrefaceTimeout + case err := <-errc: + if err == nil { + if VerboseLogs { + sc.vlogf("http2: server: client %v said hello", sc.conn.RemoteAddr()) + } + } + return err + } +} + +var errChanPool = sync.Pool{ + New: func() interface{} { return make(chan error, 1) }, +} + +var writeDataPool = sync.Pool{ + New: func() interface{} { return new(writeData) }, +} + +// writeDataFromHandler writes DATA response frames from a handler on +// the given stream. +func (sc *serverConn) writeDataFromHandler(stream *stream, data []byte, endStream bool) error { + ch := errChanPool.Get().(chan error) + writeArg := writeDataPool.Get().(*writeData) + *writeArg = writeData{stream.id, data, endStream} + err := sc.writeFrameFromHandler(FrameWriteRequest{ + write: writeArg, + stream: stream, + done: ch, + }) + if err != nil { + return err + } + var frameWriteDone bool // the frame write is done (successfully or not) + select { + case err = <-ch: + frameWriteDone = true + case <-sc.doneServing: + return errClientDisconnected + case <-stream.cw: + // If both ch and stream.cw were ready (as might + // happen on the final Write after an http.Handler + // ends), prefer the write result. Otherwise this + // might just be us successfully closing the stream. + // The writeFrameAsync and serve goroutines guarantee + // that the ch send will happen before the stream.cw + // close. + select { + case err = <-ch: + frameWriteDone = true + default: + return errStreamClosed + } + } + errChanPool.Put(ch) + if frameWriteDone { + writeDataPool.Put(writeArg) + } + return err +} + +// writeFrameFromHandler sends wr to sc.wantWriteFrameCh, but aborts +// if the connection has gone away. +// +// This must not be run from the serve goroutine itself, else it might +// deadlock writing to sc.wantWriteFrameCh (which is only mildly +// buffered and is read by serve itself). If you're on the serve +// goroutine, call writeFrame instead. +func (sc *serverConn) writeFrameFromHandler(wr FrameWriteRequest) error { + sc.serveG.checkNotOn() // NOT + select { + case sc.wantWriteFrameCh <- wr: + return nil + case <-sc.doneServing: + // Serve loop is gone. + // Client has closed their connection to the server. + return errClientDisconnected + } +} + +// writeFrame schedules a frame to write and sends it if there's nothing +// already being written. +// +// There is no pushback here (the serve goroutine never blocks). It's +// the http.Handlers that block, waiting for their previous frames to +// make it onto the wire +// +// If you're not on the serve goroutine, use writeFrameFromHandler instead. +func (sc *serverConn) writeFrame(wr FrameWriteRequest) { + sc.serveG.check() + + // If true, wr will not be written and wr.done will not be signaled. + var ignoreWrite bool + + // We are not allowed to write frames on closed streams. RFC 7540 Section + // 5.1.1 says: "An endpoint MUST NOT send frames other than PRIORITY on + // a closed stream." Our server never sends PRIORITY, so that exception + // does not apply. + // + // The serverConn might close an open stream while the stream's handler + // is still running. For example, the server might close a stream when it + // receives bad data from the client. If this happens, the handler might + // attempt to write a frame after the stream has been closed (since the + // handler hasn't yet been notified of the close). In this case, we simply + // ignore the frame. The handler will notice that the stream is closed when + // it waits for the frame to be written. + // + // As an exception to this rule, we allow sending RST_STREAM after close. + // This allows us to immediately reject new streams without tracking any + // state for those streams (except for the queued RST_STREAM frame). This + // may result in duplicate RST_STREAMs in some cases, but the client should + // ignore those. + if wr.StreamID() != 0 { + _, isReset := wr.write.(StreamError) + if state, _ := sc.state(wr.StreamID()); state == stateClosed && !isReset { + ignoreWrite = true + } + } + + // Don't send a 100-continue response if we've already sent headers. + // See golang.org/issue/14030. + switch wr.write.(type) { + case *writeResHeaders: + wr.stream.wroteHeaders = true + case write100ContinueHeadersFrame: + if wr.stream.wroteHeaders { + // We do not need to notify wr.done because this frame is + // never written with wr.done != nil. + if wr.done != nil { + panic("wr.done != nil for write100ContinueHeadersFrame") + } + ignoreWrite = true + } + } + + if !ignoreWrite { + sc.writeSched.Push(wr) + } + sc.scheduleFrameWrite() +} + +// startFrameWrite starts a goroutine to write wr (in a separate +// goroutine since that might block on the network), and updates the +// serve goroutine's state about the world, updated from info in wr. +func (sc *serverConn) startFrameWrite(wr FrameWriteRequest) { + sc.serveG.check() + if sc.writingFrame { + panic("internal error: can only be writing one frame at a time") + } + + st := wr.stream + if st != nil { + switch st.state { + case stateHalfClosedLocal: + switch wr.write.(type) { + case StreamError, handlerPanicRST, writeWindowUpdate: + // RFC 7540 Section 5.1 allows sending RST_STREAM, PRIORITY, and WINDOW_UPDATE + // in this state. (We never send PRIORITY from the server, so that is not checked.) + default: + panic(fmt.Sprintf("internal error: attempt to send frame on a half-closed-local stream: %v", wr)) + } + case stateClosed: + panic(fmt.Sprintf("internal error: attempt to send frame on a closed stream: %v", wr)) + } + } + if wpp, ok := wr.write.(*writePushPromise); ok { + var err error + wpp.promisedID, err = wpp.allocatePromisedID() + if err != nil { + sc.writingFrameAsync = false + wr.replyToWriter(err) + return + } + } + + sc.writingFrame = true + sc.needsFrameFlush = true + if wr.write.staysWithinBuffer(sc.bw.Available()) { + sc.writingFrameAsync = false + err := wr.write.writeFrame(sc) + sc.wroteFrame(frameWriteResult{wr, err}) + } else { + sc.writingFrameAsync = true + go sc.writeFrameAsync(wr) + } +} + +// errHandlerPanicked is the error given to any callers blocked in a read from +// Request.Body when the main goroutine panics. Since most handlers read in the +// the main ServeHTTP goroutine, this will show up rarely. +var errHandlerPanicked = errors.New("http2: handler panicked") + +// wroteFrame is called on the serve goroutine with the result of +// whatever happened on writeFrameAsync. +func (sc *serverConn) wroteFrame(res frameWriteResult) { + sc.serveG.check() + if !sc.writingFrame { + panic("internal error: expected to be already writing a frame") + } + sc.writingFrame = false + sc.writingFrameAsync = false + + wr := res.wr + + if writeEndsStream(wr.write) { + st := wr.stream + if st == nil { + panic("internal error: expecting non-nil stream") + } + switch st.state { + case stateOpen: + // Here we would go to stateHalfClosedLocal in + // theory, but since our handler is done and + // the net/http package provides no mechanism + // for closing a ResponseWriter while still + // reading data (see possible TODO at top of + // this file), we go into closed state here + // anyway, after telling the peer we're + // hanging up on them. We'll transition to + // stateClosed after the RST_STREAM frame is + // written. + st.state = stateHalfClosedLocal + // Section 8.1: a server MAY request that the client abort + // transmission of a request without error by sending a + // RST_STREAM with an error code of NO_ERROR after sending + // a complete response. + sc.resetStream(streamError(st.id, ErrCodeNo)) + case stateHalfClosedRemote: + sc.closeStream(st, errHandlerComplete) + } + } else { + switch v := wr.write.(type) { + case StreamError: + // st may be unknown if the RST_STREAM was generated to reject bad input. + if st, ok := sc.streams[v.StreamID]; ok { + sc.closeStream(st, v) + } + case handlerPanicRST: + sc.closeStream(wr.stream, errHandlerPanicked) + } + } + + // Reply (if requested) to unblock the ServeHTTP goroutine. + wr.replyToWriter(res.err) + + sc.scheduleFrameWrite() +} + +// scheduleFrameWrite tickles the frame writing scheduler. +// +// If a frame is already being written, nothing happens. This will be called again +// when the frame is done being written. +// +// If a frame isn't being written we need to send one, the best frame +// to send is selected, preferring first things that aren't +// stream-specific (e.g. ACKing settings), and then finding the +// highest priority stream. +// +// If a frame isn't being written and there's nothing else to send, we +// flush the write buffer. +func (sc *serverConn) scheduleFrameWrite() { + sc.serveG.check() + if sc.writingFrame || sc.inFrameScheduleLoop { + return + } + sc.inFrameScheduleLoop = true + for !sc.writingFrameAsync { + if sc.needToSendGoAway { + sc.needToSendGoAway = false + sc.startFrameWrite(FrameWriteRequest{ + write: &writeGoAway{ + maxStreamID: sc.maxClientStreamID, + code: sc.goAwayCode, + }, + }) + continue + } + if sc.needToSendSettingsAck { + sc.needToSendSettingsAck = false + sc.startFrameWrite(FrameWriteRequest{write: writeSettingsAck{}}) + continue + } + if !sc.inGoAway || sc.goAwayCode == ErrCodeNo { + if wr, ok := sc.writeSched.Pop(); ok { + sc.startFrameWrite(wr) + continue + } + } + if sc.needsFrameFlush { + sc.startFrameWrite(FrameWriteRequest{write: flushFrameWriter{}}) + sc.needsFrameFlush = false // after startFrameWrite, since it sets this true + continue + } + break + } + sc.inFrameScheduleLoop = false +} + +// startGracefulShutdown gracefully shuts down a connection. This +// sends GOAWAY with ErrCodeNo to tell the client we're gracefully +// shutting down. The connection isn't closed until all current +// streams are done. +// +// startGracefulShutdown returns immediately; it does not wait until +// the connection has shut down. +func (sc *serverConn) startGracefulShutdown() { + sc.serveG.checkNotOn() // NOT + sc.shutdownOnce.Do(func() { sc.sendServeMsg(gracefulShutdownMsg) }) +} + +// After sending GOAWAY, the connection will close after goAwayTimeout. +// If we close the connection immediately after sending GOAWAY, there may +// be unsent data in our kernel receive buffer, which will cause the kernel +// to send a TCP RST on close() instead of a FIN. This RST will abort the +// connection immediately, whether or not the client had received the GOAWAY. +// +// Ideally we should delay for at least 1 RTT + epsilon so the client has +// a chance to read the GOAWAY and stop sending messages. Measuring RTT +// is hard, so we approximate with 1 second. See golang.org/issue/18701. +// +// This is a var so it can be shorter in tests, where all requests uses the +// loopback interface making the expected RTT very small. +// +// TODO: configurable? +var goAwayTimeout = 1 * time.Second + +func (sc *serverConn) startGracefulShutdownInternal() { + sc.goAway(ErrCodeNo) +} + +func (sc *serverConn) goAway(code ErrCode) { + sc.serveG.check() + if sc.inGoAway { + return + } + sc.inGoAway = true + sc.needToSendGoAway = true + sc.goAwayCode = code + sc.scheduleFrameWrite() +} + +func (sc *serverConn) shutDownIn(d time.Duration) { + sc.serveG.check() + sc.shutdownTimer = time.AfterFunc(d, sc.onShutdownTimer) +} + +func (sc *serverConn) resetStream(se StreamError) { + sc.serveG.check() + sc.writeFrame(FrameWriteRequest{write: se}) + if st, ok := sc.streams[se.StreamID]; ok { + st.resetQueued = true + } +} + +// processFrameFromReader processes the serve loop's read from readFrameCh from the +// frame-reading goroutine. +// processFrameFromReader returns whether the connection should be kept open. +func (sc *serverConn) processFrameFromReader(res readFrameResult) bool { + sc.serveG.check() + err := res.err + if err != nil { + if err == ErrFrameTooLarge { + sc.goAway(ErrCodeFrameSize) + return true // goAway will close the loop + } + clientGone := err == io.EOF || err == io.ErrUnexpectedEOF || isClosedConnError(err) + if clientGone { + // TODO: could we also get into this state if + // the peer does a half close + // (e.g. CloseWrite) because they're done + // sending frames but they're still wanting + // our open replies? Investigate. + // TODO: add CloseWrite to crypto/tls.Conn first + // so we have a way to test this? I suppose + // just for testing we could have a non-TLS mode. + return false + } + } else { + f := res.f + if VerboseLogs { + sc.vlogf("http2: server read frame %v", summarizeFrame(f)) + } + err = sc.processFrame(f) + if err == nil { + return true + } + } + + switch ev := err.(type) { + case StreamError: + sc.resetStream(ev) + return true + case goAwayFlowError: + sc.goAway(ErrCodeFlowControl) + return true + case ConnectionError: + sc.logf("http2: server connection error from %v: %v", sc.conn.RemoteAddr(), ev) + sc.goAway(ErrCode(ev)) + return true // goAway will handle shutdown + default: + if res.err != nil { + sc.vlogf("http2: server closing client connection; error reading frame from client %s: %v", sc.conn.RemoteAddr(), err) + } else { + sc.logf("http2: server closing client connection: %v", err) + } + return false + } +} + +func (sc *serverConn) processFrame(f Frame) error { + sc.serveG.check() + + // First frame received must be SETTINGS. + if !sc.sawFirstSettings { + if _, ok := f.(*SettingsFrame); !ok { + return ConnectionError(ErrCodeProtocol) + } + sc.sawFirstSettings = true + } + + switch f := f.(type) { + case *SettingsFrame: + return sc.processSettings(f) + case *MetaHeadersFrame: + return sc.processHeaders(f) + case *WindowUpdateFrame: + return sc.processWindowUpdate(f) + case *PingFrame: + return sc.processPing(f) + case *DataFrame: + return sc.processData(f) + case *RSTStreamFrame: + return sc.processResetStream(f) + case *PriorityFrame: + return sc.processPriority(f) + case *GoAwayFrame: + return sc.processGoAway(f) + case *PushPromiseFrame: + // A client cannot push. Thus, servers MUST treat the receipt of a PUSH_PROMISE + // frame as a connection error (Section 5.4.1) of type PROTOCOL_ERROR. + return ConnectionError(ErrCodeProtocol) + default: + sc.vlogf("http2: server ignoring frame: %v", f.Header()) + return nil + } +} + +func (sc *serverConn) processPing(f *PingFrame) error { + sc.serveG.check() + if f.IsAck() { + // 6.7 PING: " An endpoint MUST NOT respond to PING frames + // containing this flag." + return nil + } + if f.StreamID != 0 { + // "PING frames are not associated with any individual + // stream. If a PING frame is received with a stream + // identifier field value other than 0x0, the recipient MUST + // respond with a connection error (Section 5.4.1) of type + // PROTOCOL_ERROR." + return ConnectionError(ErrCodeProtocol) + } + if sc.inGoAway && sc.goAwayCode != ErrCodeNo { + return nil + } + sc.writeFrame(FrameWriteRequest{write: writePingAck{f}}) + return nil +} + +func (sc *serverConn) processWindowUpdate(f *WindowUpdateFrame) error { + sc.serveG.check() + switch { + case f.StreamID != 0: // stream-level flow control + state, st := sc.state(f.StreamID) + if state == stateIdle { + // Section 5.1: "Receiving any frame other than HEADERS + // or PRIORITY on a stream in this state MUST be + // treated as a connection error (Section 5.4.1) of + // type PROTOCOL_ERROR." + return ConnectionError(ErrCodeProtocol) + } + if st == nil { + // "WINDOW_UPDATE can be sent by a peer that has sent a + // frame bearing the END_STREAM flag. This means that a + // receiver could receive a WINDOW_UPDATE frame on a "half + // closed (remote)" or "closed" stream. A receiver MUST + // NOT treat this as an error, see Section 5.1." + return nil + } + if !st.flow.add(int32(f.Increment)) { + return streamError(f.StreamID, ErrCodeFlowControl) + } + default: // connection-level flow control + if !sc.flow.add(int32(f.Increment)) { + return goAwayFlowError{} + } + } + sc.scheduleFrameWrite() + return nil +} + +func (sc *serverConn) processResetStream(f *RSTStreamFrame) error { + sc.serveG.check() + + state, st := sc.state(f.StreamID) + if state == stateIdle { + // 6.4 "RST_STREAM frames MUST NOT be sent for a + // stream in the "idle" state. If a RST_STREAM frame + // identifying an idle stream is received, the + // recipient MUST treat this as a connection error + // (Section 5.4.1) of type PROTOCOL_ERROR. + return ConnectionError(ErrCodeProtocol) + } + if st != nil { + st.cancelCtx() + sc.closeStream(st, streamError(f.StreamID, f.ErrCode)) + } + return nil +} + +func (sc *serverConn) closeStream(st *stream, err error) { + sc.serveG.check() + if st.state == stateIdle || st.state == stateClosed { + panic(fmt.Sprintf("invariant; can't close stream in state %v", st.state)) + } + st.state = stateClosed + if st.writeDeadline != nil { + st.writeDeadline.Stop() + } + if st.isPushed() { + sc.curPushedStreams-- + } else { + sc.curClientStreams-- + } + delete(sc.streams, st.id) + if len(sc.streams) == 0 { + sc.setConnState(http.StateIdle) + if sc.srv.IdleTimeout != 0 { + sc.idleTimer.Reset(sc.srv.IdleTimeout) + } + if h1ServerKeepAlivesDisabled(sc.hs) { + sc.startGracefulShutdownInternal() + } + } + if p := st.body; p != nil { + // Return any buffered unread bytes worth of conn-level flow control. + // See golang.org/issue/16481 + sc.sendWindowUpdate(nil, p.Len()) + + p.CloseWithError(err) + } + st.cw.Close() // signals Handler's CloseNotifier, unblocks writes, etc + sc.writeSched.CloseStream(st.id) +} + +func (sc *serverConn) processSettings(f *SettingsFrame) error { + sc.serveG.check() + if f.IsAck() { + sc.unackedSettings-- + if sc.unackedSettings < 0 { + // Why is the peer ACKing settings we never sent? + // The spec doesn't mention this case, but + // hang up on them anyway. + return ConnectionError(ErrCodeProtocol) + } + return nil + } + if err := f.ForeachSetting(sc.processSetting); err != nil { + return err + } + sc.needToSendSettingsAck = true + sc.scheduleFrameWrite() + return nil +} + +func (sc *serverConn) processSetting(s Setting) error { + sc.serveG.check() + if err := s.Valid(); err != nil { + return err + } + if VerboseLogs { + sc.vlogf("http2: server processing setting %v", s) + } + switch s.ID { + case SettingHeaderTableSize: + sc.headerTableSize = s.Val + sc.hpackEncoder.SetMaxDynamicTableSize(s.Val) + case SettingEnablePush: + sc.pushEnabled = s.Val != 0 + case SettingMaxConcurrentStreams: + sc.clientMaxStreams = s.Val + case SettingInitialWindowSize: + return sc.processSettingInitialWindowSize(s.Val) + case SettingMaxFrameSize: + sc.maxFrameSize = int32(s.Val) // the maximum valid s.Val is < 2^31 + case SettingMaxHeaderListSize: + sc.peerMaxHeaderListSize = s.Val + default: + // Unknown setting: "An endpoint that receives a SETTINGS + // frame with any unknown or unsupported identifier MUST + // ignore that setting." + if VerboseLogs { + sc.vlogf("http2: server ignoring unknown setting %v", s) + } + } + return nil +} + +func (sc *serverConn) processSettingInitialWindowSize(val uint32) error { + sc.serveG.check() + // Note: val already validated to be within range by + // processSetting's Valid call. + + // "A SETTINGS frame can alter the initial flow control window + // size for all current streams. When the value of + // SETTINGS_INITIAL_WINDOW_SIZE changes, a receiver MUST + // adjust the size of all stream flow control windows that it + // maintains by the difference between the new value and the + // old value." + old := sc.initialStreamSendWindowSize + sc.initialStreamSendWindowSize = int32(val) + growth := int32(val) - old // may be negative + for _, st := range sc.streams { + if !st.flow.add(growth) { + // 6.9.2 Initial Flow Control Window Size + // "An endpoint MUST treat a change to + // SETTINGS_INITIAL_WINDOW_SIZE that causes any flow + // control window to exceed the maximum size as a + // connection error (Section 5.4.1) of type + // FLOW_CONTROL_ERROR." + return ConnectionError(ErrCodeFlowControl) + } + } + return nil +} + +func (sc *serverConn) processData(f *DataFrame) error { + sc.serveG.check() + if sc.inGoAway && sc.goAwayCode != ErrCodeNo { + return nil + } + data := f.Data() + + // "If a DATA frame is received whose stream is not in "open" + // or "half closed (local)" state, the recipient MUST respond + // with a stream error (Section 5.4.2) of type STREAM_CLOSED." + id := f.Header().StreamID + state, st := sc.state(id) + if id == 0 || state == stateIdle { + // Section 5.1: "Receiving any frame other than HEADERS + // or PRIORITY on a stream in this state MUST be + // treated as a connection error (Section 5.4.1) of + // type PROTOCOL_ERROR." + return ConnectionError(ErrCodeProtocol) + } + if st == nil || state != stateOpen || st.gotTrailerHeader || st.resetQueued { + // This includes sending a RST_STREAM if the stream is + // in stateHalfClosedLocal (which currently means that + // the http.Handler returned, so it's done reading & + // done writing). Try to stop the client from sending + // more DATA. + + // But still enforce their connection-level flow control, + // and return any flow control bytes since we're not going + // to consume them. + if sc.inflow.available() < int32(f.Length) { + return streamError(id, ErrCodeFlowControl) + } + // Deduct the flow control from inflow, since we're + // going to immediately add it back in + // sendWindowUpdate, which also schedules sending the + // frames. + sc.inflow.take(int32(f.Length)) + sc.sendWindowUpdate(nil, int(f.Length)) // conn-level + + if st != nil && st.resetQueued { + // Already have a stream error in flight. Don't send another. + return nil + } + return streamError(id, ErrCodeStreamClosed) + } + if st.body == nil { + panic("internal error: should have a body in this state") + } + + // Sender sending more than they'd declared? + if st.declBodyBytes != -1 && st.bodyBytes+int64(len(data)) > st.declBodyBytes { + st.body.CloseWithError(fmt.Errorf("sender tried to send more than declared Content-Length of %d bytes", st.declBodyBytes)) + // RFC 7540, sec 8.1.2.6: A request or response is also malformed if the + // value of a content-length header field does not equal the sum of the + // DATA frame payload lengths that form the body. + return streamError(id, ErrCodeProtocol) + } + if f.Length > 0 { + // Check whether the client has flow control quota. + if st.inflow.available() < int32(f.Length) { + return streamError(id, ErrCodeFlowControl) + } + st.inflow.take(int32(f.Length)) + + if len(data) > 0 { + wrote, err := st.body.Write(data) + if err != nil { + return streamError(id, ErrCodeStreamClosed) + } + if wrote != len(data) { + panic("internal error: bad Writer") + } + st.bodyBytes += int64(len(data)) + } + + // Return any padded flow control now, since we won't + // refund it later on body reads. + if pad := int32(f.Length) - int32(len(data)); pad > 0 { + sc.sendWindowUpdate32(nil, pad) + sc.sendWindowUpdate32(st, pad) + } + } + if f.StreamEnded() { + st.endStream() + } + return nil +} + +func (sc *serverConn) processGoAway(f *GoAwayFrame) error { + sc.serveG.check() + if f.ErrCode != ErrCodeNo { + sc.logf("http2: received GOAWAY %+v, starting graceful shutdown", f) + } else { + sc.vlogf("http2: received GOAWAY %+v, starting graceful shutdown", f) + } + sc.startGracefulShutdownInternal() + // http://tools.ietf.org/html/rfc7540#section-6.8 + // We should not create any new streams, which means we should disable push. + sc.pushEnabled = false + return nil +} + +// isPushed reports whether the stream is server-initiated. +func (st *stream) isPushed() bool { + return st.id%2 == 0 +} + +// endStream closes a Request.Body's pipe. It is called when a DATA +// frame says a request body is over (or after trailers). +func (st *stream) endStream() { + sc := st.sc + sc.serveG.check() + + if st.declBodyBytes != -1 && st.declBodyBytes != st.bodyBytes { + st.body.CloseWithError(fmt.Errorf("request declared a Content-Length of %d but only wrote %d bytes", + st.declBodyBytes, st.bodyBytes)) + } else { + st.body.closeWithErrorAndCode(io.EOF, st.copyTrailersToHandlerRequest) + st.body.CloseWithError(io.EOF) + } + st.state = stateHalfClosedRemote +} + +// copyTrailersToHandlerRequest is run in the Handler's goroutine in +// its Request.Body.Read just before it gets io.EOF. +func (st *stream) copyTrailersToHandlerRequest() { + for k, vv := range st.trailer { + if _, ok := st.reqTrailer[k]; ok { + // Only copy it over it was pre-declared. + st.reqTrailer[k] = vv + } + } +} + +// onWriteTimeout is run on its own goroutine (from time.AfterFunc) +// when the stream's WriteTimeout has fired. +func (st *stream) onWriteTimeout() { + st.sc.writeFrameFromHandler(FrameWriteRequest{write: streamError(st.id, ErrCodeInternal)}) +} + +func (sc *serverConn) processHeaders(f *MetaHeadersFrame) error { + sc.serveG.check() + id := f.StreamID + if sc.inGoAway { + // Ignore. + return nil + } + // http://tools.ietf.org/html/rfc7540#section-5.1.1 + // Streams initiated by a client MUST use odd-numbered stream + // identifiers. [...] An endpoint that receives an unexpected + // stream identifier MUST respond with a connection error + // (Section 5.4.1) of type PROTOCOL_ERROR. + if id%2 != 1 { + return ConnectionError(ErrCodeProtocol) + } + // A HEADERS frame can be used to create a new stream or + // send a trailer for an open one. If we already have a stream + // open, let it process its own HEADERS frame (trailers at this + // point, if it's valid). + if st := sc.streams[f.StreamID]; st != nil { + if st.resetQueued { + // We're sending RST_STREAM to close the stream, so don't bother + // processing this frame. + return nil + } + return st.processTrailerHeaders(f) + } + + // [...] The identifier of a newly established stream MUST be + // numerically greater than all streams that the initiating + // endpoint has opened or reserved. [...] An endpoint that + // receives an unexpected stream identifier MUST respond with + // a connection error (Section 5.4.1) of type PROTOCOL_ERROR. + if id <= sc.maxClientStreamID { + return ConnectionError(ErrCodeProtocol) + } + sc.maxClientStreamID = id + + if sc.idleTimer != nil { + sc.idleTimer.Stop() + } + + // http://tools.ietf.org/html/rfc7540#section-5.1.2 + // [...] Endpoints MUST NOT exceed the limit set by their peer. An + // endpoint that receives a HEADERS frame that causes their + // advertised concurrent stream limit to be exceeded MUST treat + // this as a stream error (Section 5.4.2) of type PROTOCOL_ERROR + // or REFUSED_STREAM. + if sc.curClientStreams+1 > sc.advMaxStreams { + if sc.unackedSettings == 0 { + // They should know better. + return streamError(id, ErrCodeProtocol) + } + // Assume it's a network race, where they just haven't + // received our last SETTINGS update. But actually + // this can't happen yet, because we don't yet provide + // a way for users to adjust server parameters at + // runtime. + return streamError(id, ErrCodeRefusedStream) + } + + initialState := stateOpen + if f.StreamEnded() { + initialState = stateHalfClosedRemote + } + st := sc.newStream(id, 0, initialState) + + if f.HasPriority() { + if err := checkPriority(f.StreamID, f.Priority); err != nil { + return err + } + sc.writeSched.AdjustStream(st.id, f.Priority) + } + + rw, req, err := sc.newWriterAndRequest(st, f) + if err != nil { + return err + } + st.reqTrailer = req.Trailer + if st.reqTrailer != nil { + st.trailer = make(http.Header) + } + st.body = req.Body.(*requestBody).pipe // may be nil + st.declBodyBytes = req.ContentLength + + handler := sc.handler.ServeHTTP + if f.Truncated { + // Their header list was too long. Send a 431 error. + handler = handleHeaderListTooLong + } else if err := checkValidHTTP2RequestHeaders(req.Header); err != nil { + handler = new400Handler(err) + } + + // The net/http package sets the read deadline from the + // http.Server.ReadTimeout during the TLS handshake, but then + // passes the connection off to us with the deadline already + // set. Disarm it here after the request headers are read, + // similar to how the http1 server works. Here it's + // technically more like the http1 Server's ReadHeaderTimeout + // (in Go 1.8), though. That's a more sane option anyway. + if sc.hs.ReadTimeout != 0 { + sc.conn.SetReadDeadline(time.Time{}) + } + + go sc.runHandler(rw, req, handler) + return nil +} + +func (st *stream) processTrailerHeaders(f *MetaHeadersFrame) error { + sc := st.sc + sc.serveG.check() + if st.gotTrailerHeader { + return ConnectionError(ErrCodeProtocol) + } + st.gotTrailerHeader = true + if !f.StreamEnded() { + return streamError(st.id, ErrCodeProtocol) + } + + if len(f.PseudoFields()) > 0 { + return streamError(st.id, ErrCodeProtocol) + } + if st.trailer != nil { + for _, hf := range f.RegularFields() { + key := sc.canonicalHeader(hf.Name) + if !httpguts.ValidTrailerHeader(key) { + // TODO: send more details to the peer somehow. But http2 has + // no way to send debug data at a stream level. Discuss with + // HTTP folk. + return streamError(st.id, ErrCodeProtocol) + } + st.trailer[key] = append(st.trailer[key], hf.Value) + } + } + st.endStream() + return nil +} + +func checkPriority(streamID uint32, p PriorityParam) error { + if streamID == p.StreamDep { + // Section 5.3.1: "A stream cannot depend on itself. An endpoint MUST treat + // this as a stream error (Section 5.4.2) of type PROTOCOL_ERROR." + // Section 5.3.3 says that a stream can depend on one of its dependencies, + // so it's only self-dependencies that are forbidden. + return streamError(streamID, ErrCodeProtocol) + } + return nil +} + +func (sc *serverConn) processPriority(f *PriorityFrame) error { + if sc.inGoAway { + return nil + } + if err := checkPriority(f.StreamID, f.PriorityParam); err != nil { + return err + } + sc.writeSched.AdjustStream(f.StreamID, f.PriorityParam) + return nil +} + +func (sc *serverConn) newStream(id, pusherID uint32, state streamState) *stream { + sc.serveG.check() + if id == 0 { + panic("internal error: cannot create stream with id 0") + } + + ctx, cancelCtx := contextWithCancel(sc.baseCtx) + st := &stream{ + sc: sc, + id: id, + state: state, + ctx: ctx, + cancelCtx: cancelCtx, + } + st.cw.Init() + st.flow.conn = &sc.flow // link to conn-level counter + st.flow.add(sc.initialStreamSendWindowSize) + st.inflow.conn = &sc.inflow // link to conn-level counter + st.inflow.add(sc.srv.initialStreamRecvWindowSize()) + if sc.hs.WriteTimeout != 0 { + st.writeDeadline = time.AfterFunc(sc.hs.WriteTimeout, st.onWriteTimeout) + } + + sc.streams[id] = st + sc.writeSched.OpenStream(st.id, OpenStreamOptions{PusherID: pusherID}) + if st.isPushed() { + sc.curPushedStreams++ + } else { + sc.curClientStreams++ + } + if sc.curOpenStreams() == 1 { + sc.setConnState(http.StateActive) + } + + return st +} + +func (sc *serverConn) newWriterAndRequest(st *stream, f *MetaHeadersFrame) (*responseWriter, *http.Request, error) { + sc.serveG.check() + + rp := requestParam{ + method: f.PseudoValue("method"), + scheme: f.PseudoValue("scheme"), + authority: f.PseudoValue("authority"), + path: f.PseudoValue("path"), + } + + isConnect := rp.method == "CONNECT" + if isConnect { + if rp.path != "" || rp.scheme != "" || rp.authority == "" { + return nil, nil, streamError(f.StreamID, ErrCodeProtocol) + } + } else if rp.method == "" || rp.path == "" || (rp.scheme != "https" && rp.scheme != "http") { + // See 8.1.2.6 Malformed Requests and Responses: + // + // Malformed requests or responses that are detected + // MUST be treated as a stream error (Section 5.4.2) + // of type PROTOCOL_ERROR." + // + // 8.1.2.3 Request Pseudo-Header Fields + // "All HTTP/2 requests MUST include exactly one valid + // value for the :method, :scheme, and :path + // pseudo-header fields" + return nil, nil, streamError(f.StreamID, ErrCodeProtocol) + } + + bodyOpen := !f.StreamEnded() + if rp.method == "HEAD" && bodyOpen { + // HEAD requests can't have bodies + return nil, nil, streamError(f.StreamID, ErrCodeProtocol) + } + + rp.header = make(http.Header) + for _, hf := range f.RegularFields() { + rp.header.Add(sc.canonicalHeader(hf.Name), hf.Value) + } + if rp.authority == "" { + rp.authority = rp.header.Get("Host") + } + + rw, req, err := sc.newWriterAndRequestNoBody(st, rp) + if err != nil { + return nil, nil, err + } + if bodyOpen { + if vv, ok := rp.header["Content-Length"]; ok { + req.ContentLength, _ = strconv.ParseInt(vv[0], 10, 64) + } else { + req.ContentLength = -1 + } + req.Body.(*requestBody).pipe = &pipe{ + b: &dataBuffer{expected: req.ContentLength}, + } + } + return rw, req, nil +} + +type requestParam struct { + method string + scheme, authority, path string + header http.Header +} + +func (sc *serverConn) newWriterAndRequestNoBody(st *stream, rp requestParam) (*responseWriter, *http.Request, error) { + sc.serveG.check() + + var tlsState *tls.ConnectionState // nil if not scheme https + if rp.scheme == "https" { + tlsState = sc.tlsState + } + + needsContinue := rp.header.Get("Expect") == "100-continue" + if needsContinue { + rp.header.Del("Expect") + } + // Merge Cookie headers into one "; "-delimited value. + if cookies := rp.header["Cookie"]; len(cookies) > 1 { + rp.header.Set("Cookie", strings.Join(cookies, "; ")) + } + + // Setup Trailers + var trailer http.Header + for _, v := range rp.header["Trailer"] { + for _, key := range strings.Split(v, ",") { + key = http.CanonicalHeaderKey(strings.TrimSpace(key)) + switch key { + case "Transfer-Encoding", "Trailer", "Content-Length": + // Bogus. (copy of http1 rules) + // Ignore. + default: + if trailer == nil { + trailer = make(http.Header) + } + trailer[key] = nil + } + } + } + delete(rp.header, "Trailer") + + var url_ *url.URL + var requestURI string + if rp.method == "CONNECT" { + url_ = &url.URL{Host: rp.authority} + requestURI = rp.authority // mimic HTTP/1 server behavior + } else { + var err error + url_, err = url.ParseRequestURI(rp.path) + if err != nil { + return nil, nil, streamError(st.id, ErrCodeProtocol) + } + requestURI = rp.path + } + + body := &requestBody{ + conn: sc, + stream: st, + needsContinue: needsContinue, + } + req := &http.Request{ + Method: rp.method, + URL: url_, + RemoteAddr: sc.remoteAddrStr, + Header: rp.header, + RequestURI: requestURI, + Proto: "HTTP/2.0", + ProtoMajor: 2, + ProtoMinor: 0, + TLS: tlsState, + Host: rp.authority, + Body: body, + Trailer: trailer, + } + req = requestWithContext(req, st.ctx) + + rws := responseWriterStatePool.Get().(*responseWriterState) + bwSave := rws.bw + *rws = responseWriterState{} // zero all the fields + rws.conn = sc + rws.bw = bwSave + rws.bw.Reset(chunkWriter{rws}) + rws.stream = st + rws.req = req + rws.body = body + + rw := &responseWriter{rws: rws} + return rw, req, nil +} + +// Run on its own goroutine. +func (sc *serverConn) runHandler(rw *responseWriter, req *http.Request, handler func(http.ResponseWriter, *http.Request)) { + didPanic := true + defer func() { + rw.rws.stream.cancelCtx() + if didPanic { + e := recover() + sc.writeFrameFromHandler(FrameWriteRequest{ + write: handlerPanicRST{rw.rws.stream.id}, + stream: rw.rws.stream, + }) + // Same as net/http: + if shouldLogPanic(e) { + const size = 64 << 10 + buf := make([]byte, size) + buf = buf[:runtime.Stack(buf, false)] + sc.logf("http2: panic serving %v: %v\n%s", sc.conn.RemoteAddr(), e, buf) + } + return + } + rw.handlerDone() + }() + handler(rw, req) + didPanic = false +} + +func handleHeaderListTooLong(w http.ResponseWriter, r *http.Request) { + // 10.5.1 Limits on Header Block Size: + // .. "A server that receives a larger header block than it is + // willing to handle can send an HTTP 431 (Request Header Fields Too + // Large) status code" + const statusRequestHeaderFieldsTooLarge = 431 // only in Go 1.6+ + w.WriteHeader(statusRequestHeaderFieldsTooLarge) + io.WriteString(w, "

    HTTP Error 431

    Request Header Field(s) Too Large

    ") +} + +// called from handler goroutines. +// h may be nil. +func (sc *serverConn) writeHeaders(st *stream, headerData *writeResHeaders) error { + sc.serveG.checkNotOn() // NOT on + var errc chan error + if headerData.h != nil { + // If there's a header map (which we don't own), so we have to block on + // waiting for this frame to be written, so an http.Flush mid-handler + // writes out the correct value of keys, before a handler later potentially + // mutates it. + errc = errChanPool.Get().(chan error) + } + if err := sc.writeFrameFromHandler(FrameWriteRequest{ + write: headerData, + stream: st, + done: errc, + }); err != nil { + return err + } + if errc != nil { + select { + case err := <-errc: + errChanPool.Put(errc) + return err + case <-sc.doneServing: + return errClientDisconnected + case <-st.cw: + return errStreamClosed + } + } + return nil +} + +// called from handler goroutines. +func (sc *serverConn) write100ContinueHeaders(st *stream) { + sc.writeFrameFromHandler(FrameWriteRequest{ + write: write100ContinueHeadersFrame{st.id}, + stream: st, + }) +} + +// A bodyReadMsg tells the server loop that the http.Handler read n +// bytes of the DATA from the client on the given stream. +type bodyReadMsg struct { + st *stream + n int +} + +// called from handler goroutines. +// Notes that the handler for the given stream ID read n bytes of its body +// and schedules flow control tokens to be sent. +func (sc *serverConn) noteBodyReadFromHandler(st *stream, n int, err error) { + sc.serveG.checkNotOn() // NOT on + if n > 0 { + select { + case sc.bodyReadCh <- bodyReadMsg{st, n}: + case <-sc.doneServing: + } + } +} + +func (sc *serverConn) noteBodyRead(st *stream, n int) { + sc.serveG.check() + sc.sendWindowUpdate(nil, n) // conn-level + if st.state != stateHalfClosedRemote && st.state != stateClosed { + // Don't send this WINDOW_UPDATE if the stream is closed + // remotely. + sc.sendWindowUpdate(st, n) + } +} + +// st may be nil for conn-level +func (sc *serverConn) sendWindowUpdate(st *stream, n int) { + sc.serveG.check() + // "The legal range for the increment to the flow control + // window is 1 to 2^31-1 (2,147,483,647) octets." + // A Go Read call on 64-bit machines could in theory read + // a larger Read than this. Very unlikely, but we handle it here + // rather than elsewhere for now. + const maxUint31 = 1<<31 - 1 + for n >= maxUint31 { + sc.sendWindowUpdate32(st, maxUint31) + n -= maxUint31 + } + sc.sendWindowUpdate32(st, int32(n)) +} + +// st may be nil for conn-level +func (sc *serverConn) sendWindowUpdate32(st *stream, n int32) { + sc.serveG.check() + if n == 0 { + return + } + if n < 0 { + panic("negative update") + } + var streamID uint32 + if st != nil { + streamID = st.id + } + sc.writeFrame(FrameWriteRequest{ + write: writeWindowUpdate{streamID: streamID, n: uint32(n)}, + stream: st, + }) + var ok bool + if st == nil { + ok = sc.inflow.add(n) + } else { + ok = st.inflow.add(n) + } + if !ok { + panic("internal error; sent too many window updates without decrements?") + } +} + +// requestBody is the Handler's Request.Body type. +// Read and Close may be called concurrently. +type requestBody struct { + stream *stream + conn *serverConn + closed bool // for use by Close only + sawEOF bool // for use by Read only + pipe *pipe // non-nil if we have a HTTP entity message body + needsContinue bool // need to send a 100-continue +} + +func (b *requestBody) Close() error { + if b.pipe != nil && !b.closed { + b.pipe.BreakWithError(errClosedBody) + } + b.closed = true + return nil +} + +func (b *requestBody) Read(p []byte) (n int, err error) { + if b.needsContinue { + b.needsContinue = false + b.conn.write100ContinueHeaders(b.stream) + } + if b.pipe == nil || b.sawEOF { + return 0, io.EOF + } + n, err = b.pipe.Read(p) + if err == io.EOF { + b.sawEOF = true + } + if b.conn == nil && inTests { + return + } + b.conn.noteBodyReadFromHandler(b.stream, n, err) + return +} + +// responseWriter is the http.ResponseWriter implementation. It's +// intentionally small (1 pointer wide) to minimize garbage. The +// responseWriterState pointer inside is zeroed at the end of a +// request (in handlerDone) and calls on the responseWriter thereafter +// simply crash (caller's mistake), but the much larger responseWriterState +// and buffers are reused between multiple requests. +type responseWriter struct { + rws *responseWriterState +} + +// Optional http.ResponseWriter interfaces implemented. +var ( + _ http.CloseNotifier = (*responseWriter)(nil) + _ http.Flusher = (*responseWriter)(nil) + _ stringWriter = (*responseWriter)(nil) +) + +type responseWriterState struct { + // immutable within a request: + stream *stream + req *http.Request + body *requestBody // to close at end of request, if DATA frames didn't + conn *serverConn + + // TODO: adjust buffer writing sizes based on server config, frame size updates from peer, etc + bw *bufio.Writer // writing to a chunkWriter{this *responseWriterState} + + // mutated by http.Handler goroutine: + handlerHeader http.Header // nil until called + snapHeader http.Header // snapshot of handlerHeader at WriteHeader time + trailers []string // set in writeChunk + status int // status code passed to WriteHeader + wroteHeader bool // WriteHeader called (explicitly or implicitly). Not necessarily sent to user yet. + sentHeader bool // have we sent the header frame? + handlerDone bool // handler has finished + dirty bool // a Write failed; don't reuse this responseWriterState + + sentContentLen int64 // non-zero if handler set a Content-Length header + wroteBytes int64 + + closeNotifierMu sync.Mutex // guards closeNotifierCh + closeNotifierCh chan bool // nil until first used +} + +type chunkWriter struct{ rws *responseWriterState } + +func (cw chunkWriter) Write(p []byte) (n int, err error) { return cw.rws.writeChunk(p) } + +func (rws *responseWriterState) hasTrailers() bool { return len(rws.trailers) != 0 } + +// declareTrailer is called for each Trailer header when the +// response header is written. It notes that a header will need to be +// written in the trailers at the end of the response. +func (rws *responseWriterState) declareTrailer(k string) { + k = http.CanonicalHeaderKey(k) + if !httpguts.ValidTrailerHeader(k) { + // Forbidden by RFC 7230, section 4.1.2. + rws.conn.logf("ignoring invalid trailer %q", k) + return + } + if !strSliceContains(rws.trailers, k) { + rws.trailers = append(rws.trailers, k) + } +} + +// writeChunk writes chunks from the bufio.Writer. But because +// bufio.Writer may bypass its chunking, sometimes p may be +// arbitrarily large. +// +// writeChunk is also responsible (on the first chunk) for sending the +// HEADER response. +func (rws *responseWriterState) writeChunk(p []byte) (n int, err error) { + if !rws.wroteHeader { + rws.writeHeader(200) + } + + isHeadResp := rws.req.Method == "HEAD" + if !rws.sentHeader { + rws.sentHeader = true + + var ctype, clen string + if clen = rws.snapHeader.Get("Content-Length"); clen != "" { + rws.snapHeader.Del("Content-Length") + clen64, err := strconv.ParseInt(clen, 10, 64) + if err == nil && clen64 >= 0 { + rws.sentContentLen = clen64 + } else { + clen = "" + } + } + if clen == "" && rws.handlerDone && bodyAllowedForStatus(rws.status) && (len(p) > 0 || !isHeadResp) { + clen = strconv.Itoa(len(p)) + } + + _, hasContentType := rws.snapHeader["Content-Type"] + if !hasContentType && bodyAllowedForStatus(rws.status) && len(p) > 0 { + if cto := rws.snapHeader.Get("X-Content-Type-Options"); strings.EqualFold("nosniff", cto) { + // nosniff is an explicit directive not to guess a content-type. + // Content-sniffing is no less susceptible to polyglot attacks via + // hosted content when done on the server. + ctype = "application/octet-stream" + rws.conn.logf("http2: WriteHeader called with X-Content-Type-Options:nosniff but no Content-Type") + } else { + ctype = http.DetectContentType(p) + } + } + + var noSniff bool + if bodyAllowedForStatus(rws.status) && (rws.sentContentLen > 0 || len(p) > 0) { + // If the content type triggers client-side sniffing on old browsers, + // attach a X-Content-Type-Options header if not present (or explicitly nil). + if _, ok := rws.snapHeader["X-Content-Type-Options"]; !ok { + if hasContentType { + noSniff = httpguts.SniffedContentType(rws.snapHeader.Get("Content-Type")) + } else if ctype != "" { + noSniff = httpguts.SniffedContentType(ctype) + } + } + } + + var date string + if _, ok := rws.snapHeader["Date"]; !ok { + // TODO(bradfitz): be faster here, like net/http? measure. + date = time.Now().UTC().Format(http.TimeFormat) + } + + for _, v := range rws.snapHeader["Trailer"] { + foreachHeaderElement(v, rws.declareTrailer) + } + + endStream := (rws.handlerDone && !rws.hasTrailers() && len(p) == 0) || isHeadResp + err = rws.conn.writeHeaders(rws.stream, &writeResHeaders{ + streamID: rws.stream.id, + httpResCode: rws.status, + h: rws.snapHeader, + endStream: endStream, + contentType: ctype, + contentLength: clen, + noSniff: noSniff, + date: date, + }) + if err != nil { + rws.dirty = true + return 0, err + } + if endStream { + return 0, nil + } + } + if isHeadResp { + return len(p), nil + } + if len(p) == 0 && !rws.handlerDone { + return 0, nil + } + + if rws.handlerDone { + rws.promoteUndeclaredTrailers() + } + + endStream := rws.handlerDone && !rws.hasTrailers() + if len(p) > 0 || endStream { + // only send a 0 byte DATA frame if we're ending the stream. + if err := rws.conn.writeDataFromHandler(rws.stream, p, endStream); err != nil { + rws.dirty = true + return 0, err + } + } + + if rws.handlerDone && rws.hasTrailers() { + err = rws.conn.writeHeaders(rws.stream, &writeResHeaders{ + streamID: rws.stream.id, + h: rws.handlerHeader, + trailers: rws.trailers, + endStream: true, + }) + if err != nil { + rws.dirty = true + } + return len(p), err + } + return len(p), nil +} + +// TrailerPrefix is a magic prefix for ResponseWriter.Header map keys +// that, if present, signals that the map entry is actually for +// the response trailers, and not the response headers. The prefix +// is stripped after the ServeHTTP call finishes and the values are +// sent in the trailers. +// +// This mechanism is intended only for trailers that are not known +// prior to the headers being written. If the set of trailers is fixed +// or known before the header is written, the normal Go trailers mechanism +// is preferred: +// https://golang.org/pkg/net/http/#ResponseWriter +// https://golang.org/pkg/net/http/#example_ResponseWriter_trailers +const TrailerPrefix = "Trailer:" + +// promoteUndeclaredTrailers permits http.Handlers to set trailers +// after the header has already been flushed. Because the Go +// ResponseWriter interface has no way to set Trailers (only the +// Header), and because we didn't want to expand the ResponseWriter +// interface, and because nobody used trailers, and because RFC 7230 +// says you SHOULD (but not must) predeclare any trailers in the +// header, the official ResponseWriter rules said trailers in Go must +// be predeclared, and then we reuse the same ResponseWriter.Header() +// map to mean both Headers and Trailers. When it's time to write the +// Trailers, we pick out the fields of Headers that were declared as +// trailers. That worked for a while, until we found the first major +// user of Trailers in the wild: gRPC (using them only over http2), +// and gRPC libraries permit setting trailers mid-stream without +// predeclarnig them. So: change of plans. We still permit the old +// way, but we also permit this hack: if a Header() key begins with +// "Trailer:", the suffix of that key is a Trailer. Because ':' is an +// invalid token byte anyway, there is no ambiguity. (And it's already +// filtered out) It's mildly hacky, but not terrible. +// +// This method runs after the Handler is done and promotes any Header +// fields to be trailers. +func (rws *responseWriterState) promoteUndeclaredTrailers() { + for k, vv := range rws.handlerHeader { + if !strings.HasPrefix(k, TrailerPrefix) { + continue + } + trailerKey := strings.TrimPrefix(k, TrailerPrefix) + rws.declareTrailer(trailerKey) + rws.handlerHeader[http.CanonicalHeaderKey(trailerKey)] = vv + } + + if len(rws.trailers) > 1 { + sorter := sorterPool.Get().(*sorter) + sorter.SortStrings(rws.trailers) + sorterPool.Put(sorter) + } +} + +func (w *responseWriter) Flush() { + rws := w.rws + if rws == nil { + panic("Header called after Handler finished") + } + if rws.bw.Buffered() > 0 { + if err := rws.bw.Flush(); err != nil { + // Ignore the error. The frame writer already knows. + return + } + } else { + // The bufio.Writer won't call chunkWriter.Write + // (writeChunk with zero bytes, so we have to do it + // ourselves to force the HTTP response header and/or + // final DATA frame (with END_STREAM) to be sent. + rws.writeChunk(nil) + } +} + +func (w *responseWriter) CloseNotify() <-chan bool { + rws := w.rws + if rws == nil { + panic("CloseNotify called after Handler finished") + } + rws.closeNotifierMu.Lock() + ch := rws.closeNotifierCh + if ch == nil { + ch = make(chan bool, 1) + rws.closeNotifierCh = ch + cw := rws.stream.cw + go func() { + cw.Wait() // wait for close + ch <- true + }() + } + rws.closeNotifierMu.Unlock() + return ch +} + +func (w *responseWriter) Header() http.Header { + rws := w.rws + if rws == nil { + panic("Header called after Handler finished") + } + if rws.handlerHeader == nil { + rws.handlerHeader = make(http.Header) + } + return rws.handlerHeader +} + +// checkWriteHeaderCode is a copy of net/http's checkWriteHeaderCode. +func checkWriteHeaderCode(code int) { + // Issue 22880: require valid WriteHeader status codes. + // For now we only enforce that it's three digits. + // In the future we might block things over 599 (600 and above aren't defined + // at http://httpwg.org/specs/rfc7231.html#status.codes) + // and we might block under 200 (once we have more mature 1xx support). + // But for now any three digits. + // + // We used to send "HTTP/1.1 000 0" on the wire in responses but there's + // no equivalent bogus thing we can realistically send in HTTP/2, + // so we'll consistently panic instead and help people find their bugs + // early. (We can't return an error from WriteHeader even if we wanted to.) + if code < 100 || code > 999 { + panic(fmt.Sprintf("invalid WriteHeader code %v", code)) + } +} + +func (w *responseWriter) WriteHeader(code int) { + rws := w.rws + if rws == nil { + panic("WriteHeader called after Handler finished") + } + rws.writeHeader(code) +} + +func (rws *responseWriterState) writeHeader(code int) { + if !rws.wroteHeader { + checkWriteHeaderCode(code) + rws.wroteHeader = true + rws.status = code + if len(rws.handlerHeader) > 0 { + rws.snapHeader = cloneHeader(rws.handlerHeader) + } + } +} + +func cloneHeader(h http.Header) http.Header { + h2 := make(http.Header, len(h)) + for k, vv := range h { + vv2 := make([]string, len(vv)) + copy(vv2, vv) + h2[k] = vv2 + } + return h2 +} + +// The Life Of A Write is like this: +// +// * Handler calls w.Write or w.WriteString -> +// * -> rws.bw (*bufio.Writer) -> +// * (Handler might call Flush) +// * -> chunkWriter{rws} +// * -> responseWriterState.writeChunk(p []byte) +// * -> responseWriterState.writeChunk (most of the magic; see comment there) +func (w *responseWriter) Write(p []byte) (n int, err error) { + return w.write(len(p), p, "") +} + +func (w *responseWriter) WriteString(s string) (n int, err error) { + return w.write(len(s), nil, s) +} + +// either dataB or dataS is non-zero. +func (w *responseWriter) write(lenData int, dataB []byte, dataS string) (n int, err error) { + rws := w.rws + if rws == nil { + panic("Write called after Handler finished") + } + if !rws.wroteHeader { + w.WriteHeader(200) + } + if !bodyAllowedForStatus(rws.status) { + return 0, http.ErrBodyNotAllowed + } + rws.wroteBytes += int64(len(dataB)) + int64(len(dataS)) // only one can be set + if rws.sentContentLen != 0 && rws.wroteBytes > rws.sentContentLen { + // TODO: send a RST_STREAM + return 0, errors.New("http2: handler wrote more than declared Content-Length") + } + + if dataB != nil { + return rws.bw.Write(dataB) + } else { + return rws.bw.WriteString(dataS) + } +} + +func (w *responseWriter) handlerDone() { + rws := w.rws + dirty := rws.dirty + rws.handlerDone = true + w.Flush() + w.rws = nil + if !dirty { + // Only recycle the pool if all prior Write calls to + // the serverConn goroutine completed successfully. If + // they returned earlier due to resets from the peer + // there might still be write goroutines outstanding + // from the serverConn referencing the rws memory. See + // issue 20704. + responseWriterStatePool.Put(rws) + } +} + +// Push errors. +var ( + ErrRecursivePush = errors.New("http2: recursive push not allowed") + ErrPushLimitReached = errors.New("http2: push would exceed peer's SETTINGS_MAX_CONCURRENT_STREAMS") +) + +// pushOptions is the internal version of http.PushOptions, which we +// cannot include here because it's only defined in Go 1.8 and later. +type pushOptions struct { + Method string + Header http.Header +} + +func (w *responseWriter) push(target string, opts pushOptions) error { + st := w.rws.stream + sc := st.sc + sc.serveG.checkNotOn() + + // No recursive pushes: "PUSH_PROMISE frames MUST only be sent on a peer-initiated stream." + // http://tools.ietf.org/html/rfc7540#section-6.6 + if st.isPushed() { + return ErrRecursivePush + } + + // Default options. + if opts.Method == "" { + opts.Method = "GET" + } + if opts.Header == nil { + opts.Header = http.Header{} + } + wantScheme := "http" + if w.rws.req.TLS != nil { + wantScheme = "https" + } + + // Validate the request. + u, err := url.Parse(target) + if err != nil { + return err + } + if u.Scheme == "" { + if !strings.HasPrefix(target, "/") { + return fmt.Errorf("target must be an absolute URL or an absolute path: %q", target) + } + u.Scheme = wantScheme + u.Host = w.rws.req.Host + } else { + if u.Scheme != wantScheme { + return fmt.Errorf("cannot push URL with scheme %q from request with scheme %q", u.Scheme, wantScheme) + } + if u.Host == "" { + return errors.New("URL must have a host") + } + } + for k := range opts.Header { + if strings.HasPrefix(k, ":") { + return fmt.Errorf("promised request headers cannot include pseudo header %q", k) + } + // These headers are meaningful only if the request has a body, + // but PUSH_PROMISE requests cannot have a body. + // http://tools.ietf.org/html/rfc7540#section-8.2 + // Also disallow Host, since the promised URL must be absolute. + switch strings.ToLower(k) { + case "content-length", "content-encoding", "trailer", "te", "expect", "host": + return fmt.Errorf("promised request headers cannot include %q", k) + } + } + if err := checkValidHTTP2RequestHeaders(opts.Header); err != nil { + return err + } + + // The RFC effectively limits promised requests to GET and HEAD: + // "Promised requests MUST be cacheable [GET, HEAD, or POST], and MUST be safe [GET or HEAD]" + // http://tools.ietf.org/html/rfc7540#section-8.2 + if opts.Method != "GET" && opts.Method != "HEAD" { + return fmt.Errorf("method %q must be GET or HEAD", opts.Method) + } + + msg := &startPushRequest{ + parent: st, + method: opts.Method, + url: u, + header: cloneHeader(opts.Header), + done: errChanPool.Get().(chan error), + } + + select { + case <-sc.doneServing: + return errClientDisconnected + case <-st.cw: + return errStreamClosed + case sc.serveMsgCh <- msg: + } + + select { + case <-sc.doneServing: + return errClientDisconnected + case <-st.cw: + return errStreamClosed + case err := <-msg.done: + errChanPool.Put(msg.done) + return err + } +} + +type startPushRequest struct { + parent *stream + method string + url *url.URL + header http.Header + done chan error +} + +func (sc *serverConn) startPush(msg *startPushRequest) { + sc.serveG.check() + + // http://tools.ietf.org/html/rfc7540#section-6.6. + // PUSH_PROMISE frames MUST only be sent on a peer-initiated stream that + // is in either the "open" or "half-closed (remote)" state. + if msg.parent.state != stateOpen && msg.parent.state != stateHalfClosedRemote { + // responseWriter.Push checks that the stream is peer-initiaed. + msg.done <- errStreamClosed + return + } + + // http://tools.ietf.org/html/rfc7540#section-6.6. + if !sc.pushEnabled { + msg.done <- http.ErrNotSupported + return + } + + // PUSH_PROMISE frames must be sent in increasing order by stream ID, so + // we allocate an ID for the promised stream lazily, when the PUSH_PROMISE + // is written. Once the ID is allocated, we start the request handler. + allocatePromisedID := func() (uint32, error) { + sc.serveG.check() + + // Check this again, just in case. Technically, we might have received + // an updated SETTINGS by the time we got around to writing this frame. + if !sc.pushEnabled { + return 0, http.ErrNotSupported + } + // http://tools.ietf.org/html/rfc7540#section-6.5.2. + if sc.curPushedStreams+1 > sc.clientMaxStreams { + return 0, ErrPushLimitReached + } + + // http://tools.ietf.org/html/rfc7540#section-5.1.1. + // Streams initiated by the server MUST use even-numbered identifiers. + // A server that is unable to establish a new stream identifier can send a GOAWAY + // frame so that the client is forced to open a new connection for new streams. + if sc.maxPushPromiseID+2 >= 1<<31 { + sc.startGracefulShutdownInternal() + return 0, ErrPushLimitReached + } + sc.maxPushPromiseID += 2 + promisedID := sc.maxPushPromiseID + + // http://tools.ietf.org/html/rfc7540#section-8.2. + // Strictly speaking, the new stream should start in "reserved (local)", then + // transition to "half closed (remote)" after sending the initial HEADERS, but + // we start in "half closed (remote)" for simplicity. + // See further comments at the definition of stateHalfClosedRemote. + promised := sc.newStream(promisedID, msg.parent.id, stateHalfClosedRemote) + rw, req, err := sc.newWriterAndRequestNoBody(promised, requestParam{ + method: msg.method, + scheme: msg.url.Scheme, + authority: msg.url.Host, + path: msg.url.RequestURI(), + header: cloneHeader(msg.header), // clone since handler runs concurrently with writing the PUSH_PROMISE + }) + if err != nil { + // Should not happen, since we've already validated msg.url. + panic(fmt.Sprintf("newWriterAndRequestNoBody(%+v): %v", msg.url, err)) + } + + go sc.runHandler(rw, req, sc.handler.ServeHTTP) + return promisedID, nil + } + + sc.writeFrame(FrameWriteRequest{ + write: &writePushPromise{ + streamID: msg.parent.id, + method: msg.method, + url: msg.url, + h: msg.header, + allocatePromisedID: allocatePromisedID, + }, + stream: msg.parent, + done: msg.done, + }) +} + +// foreachHeaderElement splits v according to the "#rule" construction +// in RFC 7230 section 7 and calls fn for each non-empty element. +func foreachHeaderElement(v string, fn func(string)) { + v = textproto.TrimString(v) + if v == "" { + return + } + if !strings.Contains(v, ",") { + fn(v) + return + } + for _, f := range strings.Split(v, ",") { + if f = textproto.TrimString(f); f != "" { + fn(f) + } + } +} + +// From http://httpwg.org/specs/rfc7540.html#rfc.section.8.1.2.2 +var connHeaders = []string{ + "Connection", + "Keep-Alive", + "Proxy-Connection", + "Transfer-Encoding", + "Upgrade", +} + +// checkValidHTTP2RequestHeaders checks whether h is a valid HTTP/2 request, +// per RFC 7540 Section 8.1.2.2. +// The returned error is reported to users. +func checkValidHTTP2RequestHeaders(h http.Header) error { + for _, k := range connHeaders { + if _, ok := h[k]; ok { + return fmt.Errorf("request header %q is not valid in HTTP/2", k) + } + } + te := h["Te"] + if len(te) > 0 && (len(te) > 1 || (te[0] != "trailers" && te[0] != "")) { + return errors.New(`request header "TE" may only be "trailers" in HTTP/2`) + } + return nil +} + +func new400Handler(err error) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + http.Error(w, err.Error(), http.StatusBadRequest) + } +} + +// h1ServerKeepAlivesDisabled reports whether hs has its keep-alives +// disabled. See comments on h1ServerShutdownChan above for why +// the code is written this way. +func h1ServerKeepAlivesDisabled(hs *http.Server) bool { + var x interface{} = hs + type I interface { + doKeepAlives() bool + } + if hs, ok := x.(I); ok { + return !hs.doKeepAlives() + } + return false +} diff --git a/api/vendor/golang.org/x/net/http2/server_push_test.go b/api/vendor/golang.org/x/net/http2/server_push_test.go new file mode 100644 index 0000000..918fd30 --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/server_push_test.go @@ -0,0 +1,521 @@ +// 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. + +// +build go1.8 + +package http2 + +import ( + "errors" + "fmt" + "io" + "io/ioutil" + "net/http" + "reflect" + "strconv" + "sync" + "testing" + "time" +) + +func TestServer_Push_Success(t *testing.T) { + const ( + mainBody = "index page" + pushedBody = "pushed page" + userAgent = "testagent" + cookie = "testcookie" + ) + + var stURL string + checkPromisedReq := func(r *http.Request, wantMethod string, wantH http.Header) error { + if got, want := r.Method, wantMethod; got != want { + return fmt.Errorf("promised Req.Method=%q, want %q", got, want) + } + if got, want := r.Header, wantH; !reflect.DeepEqual(got, want) { + return fmt.Errorf("promised Req.Header=%q, want %q", got, want) + } + if got, want := "https://"+r.Host, stURL; got != want { + return fmt.Errorf("promised Req.Host=%q, want %q", got, want) + } + if r.Body == nil { + return fmt.Errorf("nil Body") + } + if buf, err := ioutil.ReadAll(r.Body); err != nil || len(buf) != 0 { + return fmt.Errorf("ReadAll(Body)=%q,%v, want '',nil", buf, err) + } + return nil + } + + errc := make(chan error, 3) + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + switch r.URL.RequestURI() { + case "/": + // Push "/pushed?get" as a GET request, using an absolute URL. + opt := &http.PushOptions{ + Header: http.Header{ + "User-Agent": {userAgent}, + }, + } + if err := w.(http.Pusher).Push(stURL+"/pushed?get", opt); err != nil { + errc <- fmt.Errorf("error pushing /pushed?get: %v", err) + return + } + // Push "/pushed?head" as a HEAD request, using a path. + opt = &http.PushOptions{ + Method: "HEAD", + Header: http.Header{ + "User-Agent": {userAgent}, + "Cookie": {cookie}, + }, + } + if err := w.(http.Pusher).Push("/pushed?head", opt); err != nil { + errc <- fmt.Errorf("error pushing /pushed?head: %v", err) + return + } + w.Header().Set("Content-Type", "text/html") + w.Header().Set("Content-Length", strconv.Itoa(len(mainBody))) + w.WriteHeader(200) + io.WriteString(w, mainBody) + errc <- nil + + case "/pushed?get": + wantH := http.Header{} + wantH.Set("User-Agent", userAgent) + if err := checkPromisedReq(r, "GET", wantH); err != nil { + errc <- fmt.Errorf("/pushed?get: %v", err) + return + } + w.Header().Set("Content-Type", "text/html") + w.Header().Set("Content-Length", strconv.Itoa(len(pushedBody))) + w.WriteHeader(200) + io.WriteString(w, pushedBody) + errc <- nil + + case "/pushed?head": + wantH := http.Header{} + wantH.Set("User-Agent", userAgent) + wantH.Set("Cookie", cookie) + if err := checkPromisedReq(r, "HEAD", wantH); err != nil { + errc <- fmt.Errorf("/pushed?head: %v", err) + return + } + w.WriteHeader(204) + errc <- nil + + default: + errc <- fmt.Errorf("unknown RequestURL %q", r.URL.RequestURI()) + } + }) + stURL = st.ts.URL + + // Send one request, which should push two responses. + st.greet() + getSlash(st) + for k := 0; k < 3; k++ { + select { + case <-time.After(2 * time.Second): + t.Errorf("timeout waiting for handler %d to finish", k) + case err := <-errc: + if err != nil { + t.Fatal(err) + } + } + } + + checkPushPromise := func(f Frame, promiseID uint32, wantH [][2]string) error { + pp, ok := f.(*PushPromiseFrame) + if !ok { + return fmt.Errorf("got a %T; want *PushPromiseFrame", f) + } + if !pp.HeadersEnded() { + return fmt.Errorf("want END_HEADERS flag in PushPromiseFrame") + } + if got, want := pp.PromiseID, promiseID; got != want { + return fmt.Errorf("got PromiseID %v; want %v", got, want) + } + gotH := st.decodeHeader(pp.HeaderBlockFragment()) + if !reflect.DeepEqual(gotH, wantH) { + return fmt.Errorf("got promised headers %v; want %v", gotH, wantH) + } + return nil + } + checkHeaders := func(f Frame, wantH [][2]string) error { + hf, ok := f.(*HeadersFrame) + if !ok { + return fmt.Errorf("got a %T; want *HeadersFrame", f) + } + gotH := st.decodeHeader(hf.HeaderBlockFragment()) + if !reflect.DeepEqual(gotH, wantH) { + return fmt.Errorf("got response headers %v; want %v", gotH, wantH) + } + return nil + } + checkData := func(f Frame, wantData string) error { + df, ok := f.(*DataFrame) + if !ok { + return fmt.Errorf("got a %T; want *DataFrame", f) + } + if gotData := string(df.Data()); gotData != wantData { + return fmt.Errorf("got response data %q; want %q", gotData, wantData) + } + return nil + } + + // Stream 1 has 2 PUSH_PROMISE + HEADERS + DATA + // Stream 2 has HEADERS + DATA + // Stream 4 has HEADERS + expected := map[uint32][]func(Frame) error{ + 1: { + func(f Frame) error { + return checkPushPromise(f, 2, [][2]string{ + {":method", "GET"}, + {":scheme", "https"}, + {":authority", st.ts.Listener.Addr().String()}, + {":path", "/pushed?get"}, + {"user-agent", userAgent}, + }) + }, + func(f Frame) error { + return checkPushPromise(f, 4, [][2]string{ + {":method", "HEAD"}, + {":scheme", "https"}, + {":authority", st.ts.Listener.Addr().String()}, + {":path", "/pushed?head"}, + {"cookie", cookie}, + {"user-agent", userAgent}, + }) + }, + func(f Frame) error { + return checkHeaders(f, [][2]string{ + {":status", "200"}, + {"content-type", "text/html"}, + {"content-length", strconv.Itoa(len(mainBody))}, + }) + }, + func(f Frame) error { + return checkData(f, mainBody) + }, + }, + 2: { + func(f Frame) error { + return checkHeaders(f, [][2]string{ + {":status", "200"}, + {"content-type", "text/html"}, + {"content-length", strconv.Itoa(len(pushedBody))}, + }) + }, + func(f Frame) error { + return checkData(f, pushedBody) + }, + }, + 4: { + func(f Frame) error { + return checkHeaders(f, [][2]string{ + {":status", "204"}, + }) + }, + }, + } + + consumed := map[uint32]int{} + for k := 0; len(expected) > 0; k++ { + f, err := st.readFrame() + if err != nil { + for id, left := range expected { + t.Errorf("stream %d: missing %d frames", id, len(left)) + } + t.Fatalf("readFrame %d: %v", k, err) + } + id := f.Header().StreamID + label := fmt.Sprintf("stream %d, frame %d", id, consumed[id]) + if len(expected[id]) == 0 { + t.Fatalf("%s: unexpected frame %#+v", label, f) + } + check := expected[id][0] + expected[id] = expected[id][1:] + if len(expected[id]) == 0 { + delete(expected, id) + } + if err := check(f); err != nil { + t.Fatalf("%s: %v", label, err) + } + consumed[id]++ + } +} + +func TestServer_Push_SuccessNoRace(t *testing.T) { + // Regression test for issue #18326. Ensure the request handler can mutate + // pushed request headers without racing with the PUSH_PROMISE write. + errc := make(chan error, 2) + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + switch r.URL.RequestURI() { + case "/": + opt := &http.PushOptions{ + Header: http.Header{"User-Agent": {"testagent"}}, + } + if err := w.(http.Pusher).Push("/pushed", opt); err != nil { + errc <- fmt.Errorf("error pushing: %v", err) + return + } + w.WriteHeader(200) + errc <- nil + + case "/pushed": + // Update request header, ensure there is no race. + r.Header.Set("User-Agent", "newagent") + r.Header.Set("Cookie", "cookie") + w.WriteHeader(200) + errc <- nil + + default: + errc <- fmt.Errorf("unknown RequestURL %q", r.URL.RequestURI()) + } + }) + + // Send one request, which should push one response. + st.greet() + getSlash(st) + for k := 0; k < 2; k++ { + select { + case <-time.After(2 * time.Second): + t.Errorf("timeout waiting for handler %d to finish", k) + case err := <-errc: + if err != nil { + t.Fatal(err) + } + } + } +} + +func TestServer_Push_RejectRecursivePush(t *testing.T) { + // Expect two requests, but might get three if there's a bug and the second push succeeds. + errc := make(chan error, 3) + handler := func(w http.ResponseWriter, r *http.Request) error { + baseURL := "https://" + r.Host + switch r.URL.Path { + case "/": + if err := w.(http.Pusher).Push(baseURL+"/push1", nil); err != nil { + return fmt.Errorf("first Push()=%v, want nil", err) + } + return nil + + case "/push1": + if got, want := w.(http.Pusher).Push(baseURL+"/push2", nil), ErrRecursivePush; got != want { + return fmt.Errorf("Push()=%v, want %v", got, want) + } + return nil + + default: + return fmt.Errorf("unexpected path: %q", r.URL.Path) + } + } + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + errc <- handler(w, r) + }) + defer st.Close() + st.greet() + getSlash(st) + if err := <-errc; err != nil { + t.Errorf("First request failed: %v", err) + } + if err := <-errc; err != nil { + t.Errorf("Second request failed: %v", err) + } +} + +func testServer_Push_RejectSingleRequest(t *testing.T, doPush func(http.Pusher, *http.Request) error, settings ...Setting) { + // Expect one request, but might get two if there's a bug and the push succeeds. + errc := make(chan error, 2) + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + errc <- doPush(w.(http.Pusher), r) + }) + defer st.Close() + st.greet() + if err := st.fr.WriteSettings(settings...); err != nil { + st.t.Fatalf("WriteSettings: %v", err) + } + st.wantSettingsAck() + getSlash(st) + if err := <-errc; err != nil { + t.Error(err) + } + // Should not get a PUSH_PROMISE frame. + hf := st.wantHeaders() + if !hf.StreamEnded() { + t.Error("stream should end after headers") + } +} + +func TestServer_Push_RejectIfDisabled(t *testing.T) { + testServer_Push_RejectSingleRequest(t, + func(p http.Pusher, r *http.Request) error { + if got, want := p.Push("https://"+r.Host+"/pushed", nil), http.ErrNotSupported; got != want { + return fmt.Errorf("Push()=%v, want %v", got, want) + } + return nil + }, + Setting{SettingEnablePush, 0}) +} + +func TestServer_Push_RejectWhenNoConcurrentStreams(t *testing.T) { + testServer_Push_RejectSingleRequest(t, + func(p http.Pusher, r *http.Request) error { + if got, want := p.Push("https://"+r.Host+"/pushed", nil), ErrPushLimitReached; got != want { + return fmt.Errorf("Push()=%v, want %v", got, want) + } + return nil + }, + Setting{SettingMaxConcurrentStreams, 0}) +} + +func TestServer_Push_RejectWrongScheme(t *testing.T) { + testServer_Push_RejectSingleRequest(t, + func(p http.Pusher, r *http.Request) error { + if err := p.Push("http://"+r.Host+"/pushed", nil); err == nil { + return errors.New("Push() should have failed (push target URL is http)") + } + return nil + }) +} + +func TestServer_Push_RejectMissingHost(t *testing.T) { + testServer_Push_RejectSingleRequest(t, + func(p http.Pusher, r *http.Request) error { + if err := p.Push("https:pushed", nil); err == nil { + return errors.New("Push() should have failed (push target URL missing host)") + } + return nil + }) +} + +func TestServer_Push_RejectRelativePath(t *testing.T) { + testServer_Push_RejectSingleRequest(t, + func(p http.Pusher, r *http.Request) error { + if err := p.Push("../test", nil); err == nil { + return errors.New("Push() should have failed (push target is a relative path)") + } + return nil + }) +} + +func TestServer_Push_RejectForbiddenMethod(t *testing.T) { + testServer_Push_RejectSingleRequest(t, + func(p http.Pusher, r *http.Request) error { + if err := p.Push("https://"+r.Host+"/pushed", &http.PushOptions{Method: "POST"}); err == nil { + return errors.New("Push() should have failed (cannot promise a POST)") + } + return nil + }) +} + +func TestServer_Push_RejectForbiddenHeader(t *testing.T) { + testServer_Push_RejectSingleRequest(t, + func(p http.Pusher, r *http.Request) error { + header := http.Header{ + "Content-Length": {"10"}, + "Content-Encoding": {"gzip"}, + "Trailer": {"Foo"}, + "Te": {"trailers"}, + "Host": {"test.com"}, + ":authority": {"test.com"}, + } + if err := p.Push("https://"+r.Host+"/pushed", &http.PushOptions{Header: header}); err == nil { + return errors.New("Push() should have failed (forbidden headers)") + } + return nil + }) +} + +func TestServer_Push_StateTransitions(t *testing.T) { + const body = "foo" + + gotPromise := make(chan bool) + finishedPush := make(chan bool) + + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + switch r.URL.RequestURI() { + case "/": + if err := w.(http.Pusher).Push("/pushed", nil); err != nil { + t.Errorf("Push error: %v", err) + } + // Don't finish this request until the push finishes so we don't + // nondeterministically interleave output frames with the push. + <-finishedPush + case "/pushed": + <-gotPromise + } + w.Header().Set("Content-Type", "text/html") + w.Header().Set("Content-Length", strconv.Itoa(len(body))) + w.WriteHeader(200) + io.WriteString(w, body) + }) + defer st.Close() + + st.greet() + if st.stream(2) != nil { + t.Fatal("stream 2 should be empty") + } + if got, want := st.streamState(2), stateIdle; got != want { + t.Fatalf("streamState(2)=%v, want %v", got, want) + } + getSlash(st) + // After the PUSH_PROMISE is sent, the stream should be stateHalfClosedRemote. + st.wantPushPromise() + if got, want := st.streamState(2), stateHalfClosedRemote; got != want { + t.Fatalf("streamState(2)=%v, want %v", got, want) + } + // We stall the HTTP handler for "/pushed" until the above check. If we don't + // stall the handler, then the handler might write HEADERS and DATA and finish + // the stream before we check st.streamState(2) -- should that happen, we'll + // see stateClosed and fail the above check. + close(gotPromise) + st.wantHeaders() + if df := st.wantData(); !df.StreamEnded() { + t.Fatal("expected END_STREAM flag on DATA") + } + if got, want := st.streamState(2), stateClosed; got != want { + t.Fatalf("streamState(2)=%v, want %v", got, want) + } + close(finishedPush) +} + +func TestServer_Push_RejectAfterGoAway(t *testing.T) { + var readyOnce sync.Once + ready := make(chan struct{}) + errc := make(chan error, 2) + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + select { + case <-ready: + case <-time.After(5 * time.Second): + errc <- fmt.Errorf("timeout waiting for GOAWAY to be processed") + } + if got, want := w.(http.Pusher).Push("https://"+r.Host+"/pushed", nil), http.ErrNotSupported; got != want { + errc <- fmt.Errorf("Push()=%v, want %v", got, want) + } + errc <- nil + }) + defer st.Close() + st.greet() + getSlash(st) + + // Send GOAWAY and wait for it to be processed. + st.fr.WriteGoAway(1, ErrCodeNo, nil) + go func() { + for { + select { + case <-ready: + return + default: + } + st.sc.serveMsgCh <- func(loopNum int) { + if !st.sc.pushEnabled { + readyOnce.Do(func() { close(ready) }) + } + } + } + }() + if err := <-errc; err != nil { + t.Error(err) + } +} diff --git a/api/vendor/golang.org/x/net/http2/server_test.go b/api/vendor/golang.org/x/net/http2/server_test.go new file mode 100644 index 0000000..ffa40c0 --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/server_test.go @@ -0,0 +1,3785 @@ +// 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 http2 + +import ( + "bytes" + "crypto/tls" + "errors" + "flag" + "fmt" + "io" + "io/ioutil" + "log" + "net" + "net/http" + "net/http/httptest" + "os" + "os/exec" + "reflect" + "runtime" + "strconv" + "strings" + "sync" + "sync/atomic" + "testing" + "time" + + "golang.org/x/net/http2/hpack" +) + +var stderrVerbose = flag.Bool("stderr_verbose", false, "Mirror verbosity to stderr, unbuffered") + +func stderrv() io.Writer { + if *stderrVerbose { + return os.Stderr + } + + return ioutil.Discard +} + +type serverTester struct { + cc net.Conn // client conn + t testing.TB + ts *httptest.Server + fr *Framer + serverLogBuf bytes.Buffer // logger for httptest.Server + logFilter []string // substrings to filter out + scMu sync.Mutex // guards sc + sc *serverConn + hpackDec *hpack.Decoder + decodedHeaders [][2]string + + // If http2debug!=2, then we capture Frame debug logs that will be written + // to t.Log after a test fails. The read and write logs use separate locks + // and buffers so we don't accidentally introduce synchronization between + // the read and write goroutines, which may hide data races. + frameReadLogMu sync.Mutex + frameReadLogBuf bytes.Buffer + frameWriteLogMu sync.Mutex + frameWriteLogBuf bytes.Buffer + + // writing headers: + headerBuf bytes.Buffer + hpackEnc *hpack.Encoder +} + +func init() { + testHookOnPanicMu = new(sync.Mutex) + goAwayTimeout = 25 * time.Millisecond +} + +func resetHooks() { + testHookOnPanicMu.Lock() + testHookOnPanic = nil + testHookOnPanicMu.Unlock() +} + +type serverTesterOpt string + +var optOnlyServer = serverTesterOpt("only_server") +var optQuiet = serverTesterOpt("quiet_logging") +var optFramerReuseFrames = serverTesterOpt("frame_reuse_frames") + +func newServerTester(t testing.TB, handler http.HandlerFunc, opts ...interface{}) *serverTester { + resetHooks() + + ts := httptest.NewUnstartedServer(handler) + + tlsConfig := &tls.Config{ + InsecureSkipVerify: true, + NextProtos: []string{NextProtoTLS}, + } + + var onlyServer, quiet, framerReuseFrames bool + h2server := new(Server) + for _, opt := range opts { + switch v := opt.(type) { + case func(*tls.Config): + v(tlsConfig) + case func(*httptest.Server): + v(ts) + case func(*Server): + v(h2server) + case serverTesterOpt: + switch v { + case optOnlyServer: + onlyServer = true + case optQuiet: + quiet = true + case optFramerReuseFrames: + framerReuseFrames = true + } + case func(net.Conn, http.ConnState): + ts.Config.ConnState = v + default: + t.Fatalf("unknown newServerTester option type %T", v) + } + } + + ConfigureServer(ts.Config, h2server) + + st := &serverTester{ + t: t, + ts: ts, + } + st.hpackEnc = hpack.NewEncoder(&st.headerBuf) + st.hpackDec = hpack.NewDecoder(initialHeaderTableSize, st.onHeaderField) + + ts.TLS = ts.Config.TLSConfig // the httptest.Server has its own copy of this TLS config + if quiet { + ts.Config.ErrorLog = log.New(ioutil.Discard, "", 0) + } else { + ts.Config.ErrorLog = log.New(io.MultiWriter(stderrv(), twriter{t: t, st: st}, &st.serverLogBuf), "", log.LstdFlags) + } + ts.StartTLS() + + if VerboseLogs { + t.Logf("Running test server at: %s", ts.URL) + } + testHookGetServerConn = func(v *serverConn) { + st.scMu.Lock() + defer st.scMu.Unlock() + st.sc = v + } + log.SetOutput(io.MultiWriter(stderrv(), twriter{t: t, st: st})) + if !onlyServer { + cc, err := tls.Dial("tcp", ts.Listener.Addr().String(), tlsConfig) + if err != nil { + t.Fatal(err) + } + st.cc = cc + st.fr = NewFramer(cc, cc) + if framerReuseFrames { + st.fr.SetReuseFrames() + } + if !logFrameReads && !logFrameWrites { + st.fr.debugReadLoggerf = func(m string, v ...interface{}) { + m = time.Now().Format("2006-01-02 15:04:05.999999999 ") + strings.TrimPrefix(m, "http2: ") + "\n" + st.frameReadLogMu.Lock() + fmt.Fprintf(&st.frameReadLogBuf, m, v...) + st.frameReadLogMu.Unlock() + } + st.fr.debugWriteLoggerf = func(m string, v ...interface{}) { + m = time.Now().Format("2006-01-02 15:04:05.999999999 ") + strings.TrimPrefix(m, "http2: ") + "\n" + st.frameWriteLogMu.Lock() + fmt.Fprintf(&st.frameWriteLogBuf, m, v...) + st.frameWriteLogMu.Unlock() + } + st.fr.logReads = true + st.fr.logWrites = true + } + } + return st +} + +func (st *serverTester) closeConn() { + st.scMu.Lock() + defer st.scMu.Unlock() + st.sc.conn.Close() +} + +func (st *serverTester) addLogFilter(phrase string) { + st.logFilter = append(st.logFilter, phrase) +} + +func (st *serverTester) stream(id uint32) *stream { + ch := make(chan *stream, 1) + st.sc.serveMsgCh <- func(int) { + ch <- st.sc.streams[id] + } + return <-ch +} + +func (st *serverTester) streamState(id uint32) streamState { + ch := make(chan streamState, 1) + st.sc.serveMsgCh <- func(int) { + state, _ := st.sc.state(id) + ch <- state + } + return <-ch +} + +// loopNum reports how many times this conn's select loop has gone around. +func (st *serverTester) loopNum() int { + lastc := make(chan int, 1) + st.sc.serveMsgCh <- func(loopNum int) { + lastc <- loopNum + } + return <-lastc +} + +// awaitIdle heuristically awaits for the server conn's select loop to be idle. +// The heuristic is that the server connection's serve loop must schedule +// 50 times in a row without any channel sends or receives occurring. +func (st *serverTester) awaitIdle() { + remain := 50 + last := st.loopNum() + for remain > 0 { + n := st.loopNum() + if n == last+1 { + remain-- + } else { + remain = 50 + } + last = n + } +} + +func (st *serverTester) Close() { + if st.t.Failed() { + st.frameReadLogMu.Lock() + if st.frameReadLogBuf.Len() > 0 { + st.t.Logf("Framer read log:\n%s", st.frameReadLogBuf.String()) + } + st.frameReadLogMu.Unlock() + + st.frameWriteLogMu.Lock() + if st.frameWriteLogBuf.Len() > 0 { + st.t.Logf("Framer write log:\n%s", st.frameWriteLogBuf.String()) + } + st.frameWriteLogMu.Unlock() + + // If we failed already (and are likely in a Fatal, + // unwindowing), force close the connection, so the + // httptest.Server doesn't wait forever for the conn + // to close. + if st.cc != nil { + st.cc.Close() + } + } + st.ts.Close() + if st.cc != nil { + st.cc.Close() + } + log.SetOutput(os.Stderr) +} + +// greet initiates the client's HTTP/2 connection into a state where +// frames may be sent. +func (st *serverTester) greet() { + st.greetAndCheckSettings(func(Setting) error { return nil }) +} + +func (st *serverTester) greetAndCheckSettings(checkSetting func(s Setting) error) { + st.writePreface() + st.writeInitialSettings() + st.wantSettings().ForeachSetting(checkSetting) + st.writeSettingsAck() + + // The initial WINDOW_UPDATE and SETTINGS ACK can come in any order. + var gotSettingsAck bool + var gotWindowUpdate bool + + for i := 0; i < 2; i++ { + f, err := st.readFrame() + if err != nil { + st.t.Fatal(err) + } + switch f := f.(type) { + case *SettingsFrame: + if !f.Header().Flags.Has(FlagSettingsAck) { + st.t.Fatal("Settings Frame didn't have ACK set") + } + gotSettingsAck = true + + case *WindowUpdateFrame: + if f.FrameHeader.StreamID != 0 { + st.t.Fatalf("WindowUpdate StreamID = %d; want 0", f.FrameHeader.StreamID) + } + incr := uint32((&Server{}).initialConnRecvWindowSize() - initialWindowSize) + if f.Increment != incr { + st.t.Fatalf("WindowUpdate increment = %d; want %d", f.Increment, incr) + } + gotWindowUpdate = true + + default: + st.t.Fatalf("Wanting a settings ACK or window update, received a %T", f) + } + } + + if !gotSettingsAck { + st.t.Fatalf("Didn't get a settings ACK") + } + if !gotWindowUpdate { + st.t.Fatalf("Didn't get a window update") + } +} + +func (st *serverTester) writePreface() { + n, err := st.cc.Write(clientPreface) + if err != nil { + st.t.Fatalf("Error writing client preface: %v", err) + } + if n != len(clientPreface) { + st.t.Fatalf("Writing client preface, wrote %d bytes; want %d", n, len(clientPreface)) + } +} + +func (st *serverTester) writeInitialSettings() { + if err := st.fr.WriteSettings(); err != nil { + st.t.Fatalf("Error writing initial SETTINGS frame from client to server: %v", err) + } +} + +func (st *serverTester) writeSettingsAck() { + if err := st.fr.WriteSettingsAck(); err != nil { + st.t.Fatalf("Error writing ACK of server's SETTINGS: %v", err) + } +} + +func (st *serverTester) writeHeaders(p HeadersFrameParam) { + if err := st.fr.WriteHeaders(p); err != nil { + st.t.Fatalf("Error writing HEADERS: %v", err) + } +} + +func (st *serverTester) writePriority(id uint32, p PriorityParam) { + if err := st.fr.WritePriority(id, p); err != nil { + st.t.Fatalf("Error writing PRIORITY: %v", err) + } +} + +func (st *serverTester) encodeHeaderField(k, v string) { + err := st.hpackEnc.WriteField(hpack.HeaderField{Name: k, Value: v}) + if err != nil { + st.t.Fatalf("HPACK encoding error for %q/%q: %v", k, v, err) + } +} + +// encodeHeaderRaw is the magic-free version of encodeHeader. +// It takes 0 or more (k, v) pairs and encodes them. +func (st *serverTester) encodeHeaderRaw(headers ...string) []byte { + if len(headers)%2 == 1 { + panic("odd number of kv args") + } + st.headerBuf.Reset() + for len(headers) > 0 { + k, v := headers[0], headers[1] + st.encodeHeaderField(k, v) + headers = headers[2:] + } + return st.headerBuf.Bytes() +} + +// encodeHeader encodes headers and returns their HPACK bytes. headers +// must contain an even number of key/value pairs. There may be +// multiple pairs for keys (e.g. "cookie"). The :method, :path, and +// :scheme headers default to GET, / and https. The :authority header +// defaults to st.ts.Listener.Addr(). +func (st *serverTester) encodeHeader(headers ...string) []byte { + if len(headers)%2 == 1 { + panic("odd number of kv args") + } + + st.headerBuf.Reset() + defaultAuthority := st.ts.Listener.Addr().String() + + if len(headers) == 0 { + // Fast path, mostly for benchmarks, so test code doesn't pollute + // profiles when we're looking to improve server allocations. + st.encodeHeaderField(":method", "GET") + st.encodeHeaderField(":scheme", "https") + st.encodeHeaderField(":authority", defaultAuthority) + st.encodeHeaderField(":path", "/") + return st.headerBuf.Bytes() + } + + if len(headers) == 2 && headers[0] == ":method" { + // Another fast path for benchmarks. + st.encodeHeaderField(":method", headers[1]) + st.encodeHeaderField(":scheme", "https") + st.encodeHeaderField(":authority", defaultAuthority) + st.encodeHeaderField(":path", "/") + return st.headerBuf.Bytes() + } + + pseudoCount := map[string]int{} + keys := []string{":method", ":scheme", ":authority", ":path"} + vals := map[string][]string{ + ":method": {"GET"}, + ":scheme": {"https"}, + ":authority": {defaultAuthority}, + ":path": {"/"}, + } + for len(headers) > 0 { + k, v := headers[0], headers[1] + headers = headers[2:] + if _, ok := vals[k]; !ok { + keys = append(keys, k) + } + if strings.HasPrefix(k, ":") { + pseudoCount[k]++ + if pseudoCount[k] == 1 { + vals[k] = []string{v} + } else { + // Allows testing of invalid headers w/ dup pseudo fields. + vals[k] = append(vals[k], v) + } + } else { + vals[k] = append(vals[k], v) + } + } + for _, k := range keys { + for _, v := range vals[k] { + st.encodeHeaderField(k, v) + } + } + return st.headerBuf.Bytes() +} + +// bodylessReq1 writes a HEADERS frames with StreamID 1 and EndStream and EndHeaders set. +func (st *serverTester) bodylessReq1(headers ...string) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader(headers...), + EndStream: true, + EndHeaders: true, + }) +} + +func (st *serverTester) writeData(streamID uint32, endStream bool, data []byte) { + if err := st.fr.WriteData(streamID, endStream, data); err != nil { + st.t.Fatalf("Error writing DATA: %v", err) + } +} + +func (st *serverTester) writeDataPadded(streamID uint32, endStream bool, data, pad []byte) { + if err := st.fr.WriteDataPadded(streamID, endStream, data, pad); err != nil { + st.t.Fatalf("Error writing DATA: %v", err) + } +} + +func readFrameTimeout(fr *Framer, wait time.Duration) (Frame, error) { + ch := make(chan interface{}, 1) + go func() { + fr, err := fr.ReadFrame() + if err != nil { + ch <- err + } else { + ch <- fr + } + }() + t := time.NewTimer(wait) + select { + case v := <-ch: + t.Stop() + if fr, ok := v.(Frame); ok { + return fr, nil + } + return nil, v.(error) + case <-t.C: + return nil, errors.New("timeout waiting for frame") + } +} + +func (st *serverTester) readFrame() (Frame, error) { + return readFrameTimeout(st.fr, 2*time.Second) +} + +func (st *serverTester) wantHeaders() *HeadersFrame { + f, err := st.readFrame() + if err != nil { + st.t.Fatalf("Error while expecting a HEADERS frame: %v", err) + } + hf, ok := f.(*HeadersFrame) + if !ok { + st.t.Fatalf("got a %T; want *HeadersFrame", f) + } + return hf +} + +func (st *serverTester) wantContinuation() *ContinuationFrame { + f, err := st.readFrame() + if err != nil { + st.t.Fatalf("Error while expecting a CONTINUATION frame: %v", err) + } + cf, ok := f.(*ContinuationFrame) + if !ok { + st.t.Fatalf("got a %T; want *ContinuationFrame", f) + } + return cf +} + +func (st *serverTester) wantData() *DataFrame { + f, err := st.readFrame() + if err != nil { + st.t.Fatalf("Error while expecting a DATA frame: %v", err) + } + df, ok := f.(*DataFrame) + if !ok { + st.t.Fatalf("got a %T; want *DataFrame", f) + } + return df +} + +func (st *serverTester) wantSettings() *SettingsFrame { + f, err := st.readFrame() + if err != nil { + st.t.Fatalf("Error while expecting a SETTINGS frame: %v", err) + } + sf, ok := f.(*SettingsFrame) + if !ok { + st.t.Fatalf("got a %T; want *SettingsFrame", f) + } + return sf +} + +func (st *serverTester) wantPing() *PingFrame { + f, err := st.readFrame() + if err != nil { + st.t.Fatalf("Error while expecting a PING frame: %v", err) + } + pf, ok := f.(*PingFrame) + if !ok { + st.t.Fatalf("got a %T; want *PingFrame", f) + } + return pf +} + +func (st *serverTester) wantGoAway() *GoAwayFrame { + f, err := st.readFrame() + if err != nil { + st.t.Fatalf("Error while expecting a GOAWAY frame: %v", err) + } + gf, ok := f.(*GoAwayFrame) + if !ok { + st.t.Fatalf("got a %T; want *GoAwayFrame", f) + } + return gf +} + +func (st *serverTester) wantRSTStream(streamID uint32, errCode ErrCode) { + f, err := st.readFrame() + if err != nil { + st.t.Fatalf("Error while expecting an RSTStream frame: %v", err) + } + rs, ok := f.(*RSTStreamFrame) + if !ok { + st.t.Fatalf("got a %T; want *RSTStreamFrame", f) + } + if rs.FrameHeader.StreamID != streamID { + st.t.Fatalf("RSTStream StreamID = %d; want %d", rs.FrameHeader.StreamID, streamID) + } + if rs.ErrCode != errCode { + st.t.Fatalf("RSTStream ErrCode = %d (%s); want %d (%s)", rs.ErrCode, rs.ErrCode, errCode, errCode) + } +} + +func (st *serverTester) wantWindowUpdate(streamID, incr uint32) { + f, err := st.readFrame() + if err != nil { + st.t.Fatalf("Error while expecting a WINDOW_UPDATE frame: %v", err) + } + wu, ok := f.(*WindowUpdateFrame) + if !ok { + st.t.Fatalf("got a %T; want *WindowUpdateFrame", f) + } + if wu.FrameHeader.StreamID != streamID { + st.t.Fatalf("WindowUpdate StreamID = %d; want %d", wu.FrameHeader.StreamID, streamID) + } + if wu.Increment != incr { + st.t.Fatalf("WindowUpdate increment = %d; want %d", wu.Increment, incr) + } +} + +func (st *serverTester) wantSettingsAck() { + f, err := st.readFrame() + if err != nil { + st.t.Fatal(err) + } + sf, ok := f.(*SettingsFrame) + if !ok { + st.t.Fatalf("Wanting a settings ACK, received a %T", f) + } + if !sf.Header().Flags.Has(FlagSettingsAck) { + st.t.Fatal("Settings Frame didn't have ACK set") + } +} + +func (st *serverTester) wantPushPromise() *PushPromiseFrame { + f, err := st.readFrame() + if err != nil { + st.t.Fatal(err) + } + ppf, ok := f.(*PushPromiseFrame) + if !ok { + st.t.Fatalf("Wanted PushPromise, received %T", ppf) + } + return ppf +} + +func TestServer(t *testing.T) { + gotReq := make(chan bool, 1) + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Foo", "Bar") + gotReq <- true + }) + defer st.Close() + + covers("3.5", ` + The server connection preface consists of a potentially empty + SETTINGS frame ([SETTINGS]) that MUST be the first frame the + server sends in the HTTP/2 connection. + `) + + st.greet() + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader(), + EndStream: true, // no DATA frames + EndHeaders: true, + }) + + select { + case <-gotReq: + case <-time.After(2 * time.Second): + t.Error("timeout waiting for request") + } +} + +func TestServer_Request_Get(t *testing.T) { + testServerRequest(t, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader("foo-bar", "some-value"), + EndStream: true, // no DATA frames + EndHeaders: true, + }) + }, func(r *http.Request) { + if r.Method != "GET" { + t.Errorf("Method = %q; want GET", r.Method) + } + if r.URL.Path != "/" { + t.Errorf("URL.Path = %q; want /", r.URL.Path) + } + if r.ContentLength != 0 { + t.Errorf("ContentLength = %v; want 0", r.ContentLength) + } + if r.Close { + t.Error("Close = true; want false") + } + if !strings.Contains(r.RemoteAddr, ":") { + t.Errorf("RemoteAddr = %q; want something with a colon", r.RemoteAddr) + } + if r.Proto != "HTTP/2.0" || r.ProtoMajor != 2 || r.ProtoMinor != 0 { + t.Errorf("Proto = %q Major=%v,Minor=%v; want HTTP/2.0", r.Proto, r.ProtoMajor, r.ProtoMinor) + } + wantHeader := http.Header{ + "Foo-Bar": []string{"some-value"}, + } + if !reflect.DeepEqual(r.Header, wantHeader) { + t.Errorf("Header = %#v; want %#v", r.Header, wantHeader) + } + if n, err := r.Body.Read([]byte(" ")); err != io.EOF || n != 0 { + t.Errorf("Read = %d, %v; want 0, EOF", n, err) + } + }) +} + +func TestServer_Request_Get_PathSlashes(t *testing.T) { + testServerRequest(t, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader(":path", "/%2f/"), + EndStream: true, // no DATA frames + EndHeaders: true, + }) + }, func(r *http.Request) { + if r.RequestURI != "/%2f/" { + t.Errorf("RequestURI = %q; want /%%2f/", r.RequestURI) + } + if r.URL.Path != "///" { + t.Errorf("URL.Path = %q; want ///", r.URL.Path) + } + }) +} + +// TODO: add a test with EndStream=true on the HEADERS but setting a +// Content-Length anyway. Should we just omit it and force it to +// zero? + +func TestServer_Request_Post_NoContentLength_EndStream(t *testing.T) { + testServerRequest(t, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader(":method", "POST"), + EndStream: true, + EndHeaders: true, + }) + }, func(r *http.Request) { + if r.Method != "POST" { + t.Errorf("Method = %q; want POST", r.Method) + } + if r.ContentLength != 0 { + t.Errorf("ContentLength = %v; want 0", r.ContentLength) + } + if n, err := r.Body.Read([]byte(" ")); err != io.EOF || n != 0 { + t.Errorf("Read = %d, %v; want 0, EOF", n, err) + } + }) +} + +func TestServer_Request_Post_Body_ImmediateEOF(t *testing.T) { + testBodyContents(t, -1, "", func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader(":method", "POST"), + EndStream: false, // to say DATA frames are coming + EndHeaders: true, + }) + st.writeData(1, true, nil) // just kidding. empty body. + }) +} + +func TestServer_Request_Post_Body_OneData(t *testing.T) { + const content = "Some content" + testBodyContents(t, -1, content, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader(":method", "POST"), + EndStream: false, // to say DATA frames are coming + EndHeaders: true, + }) + st.writeData(1, true, []byte(content)) + }) +} + +func TestServer_Request_Post_Body_TwoData(t *testing.T) { + const content = "Some content" + testBodyContents(t, -1, content, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader(":method", "POST"), + EndStream: false, // to say DATA frames are coming + EndHeaders: true, + }) + st.writeData(1, false, []byte(content[:5])) + st.writeData(1, true, []byte(content[5:])) + }) +} + +func TestServer_Request_Post_Body_ContentLength_Correct(t *testing.T) { + const content = "Some content" + testBodyContents(t, int64(len(content)), content, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader( + ":method", "POST", + "content-length", strconv.Itoa(len(content)), + ), + EndStream: false, // to say DATA frames are coming + EndHeaders: true, + }) + st.writeData(1, true, []byte(content)) + }) +} + +func TestServer_Request_Post_Body_ContentLength_TooLarge(t *testing.T) { + testBodyContentsFail(t, 3, "request declared a Content-Length of 3 but only wrote 2 bytes", + func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader( + ":method", "POST", + "content-length", "3", + ), + EndStream: false, // to say DATA frames are coming + EndHeaders: true, + }) + st.writeData(1, true, []byte("12")) + }) +} + +func TestServer_Request_Post_Body_ContentLength_TooSmall(t *testing.T) { + testBodyContentsFail(t, 4, "sender tried to send more than declared Content-Length of 4 bytes", + func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader( + ":method", "POST", + "content-length", "4", + ), + EndStream: false, // to say DATA frames are coming + EndHeaders: true, + }) + st.writeData(1, true, []byte("12345")) + }) +} + +func testBodyContents(t *testing.T, wantContentLength int64, wantBody string, write func(st *serverTester)) { + testServerRequest(t, write, func(r *http.Request) { + if r.Method != "POST" { + t.Errorf("Method = %q; want POST", r.Method) + } + if r.ContentLength != wantContentLength { + t.Errorf("ContentLength = %v; want %d", r.ContentLength, wantContentLength) + } + all, err := ioutil.ReadAll(r.Body) + if err != nil { + t.Fatal(err) + } + if string(all) != wantBody { + t.Errorf("Read = %q; want %q", all, wantBody) + } + if err := r.Body.Close(); err != nil { + t.Fatalf("Close: %v", err) + } + }) +} + +func testBodyContentsFail(t *testing.T, wantContentLength int64, wantReadError string, write func(st *serverTester)) { + testServerRequest(t, write, func(r *http.Request) { + if r.Method != "POST" { + t.Errorf("Method = %q; want POST", r.Method) + } + if r.ContentLength != wantContentLength { + t.Errorf("ContentLength = %v; want %d", r.ContentLength, wantContentLength) + } + all, err := ioutil.ReadAll(r.Body) + if err == nil { + t.Fatalf("expected an error (%q) reading from the body. Successfully read %q instead.", + wantReadError, all) + } + if !strings.Contains(err.Error(), wantReadError) { + t.Fatalf("Body.Read = %v; want substring %q", err, wantReadError) + } + if err := r.Body.Close(); err != nil { + t.Fatalf("Close: %v", err) + } + }) +} + +// Using a Host header, instead of :authority +func TestServer_Request_Get_Host(t *testing.T) { + const host = "example.com" + testServerRequest(t, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader(":authority", "", "host", host), + EndStream: true, + EndHeaders: true, + }) + }, func(r *http.Request) { + if r.Host != host { + t.Errorf("Host = %q; want %q", r.Host, host) + } + }) +} + +// Using an :authority pseudo-header, instead of Host +func TestServer_Request_Get_Authority(t *testing.T) { + const host = "example.com" + testServerRequest(t, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader(":authority", host), + EndStream: true, + EndHeaders: true, + }) + }, func(r *http.Request) { + if r.Host != host { + t.Errorf("Host = %q; want %q", r.Host, host) + } + }) +} + +func TestServer_Request_WithContinuation(t *testing.T) { + wantHeader := http.Header{ + "Foo-One": []string{"value-one"}, + "Foo-Two": []string{"value-two"}, + "Foo-Three": []string{"value-three"}, + } + testServerRequest(t, func(st *serverTester) { + fullHeaders := st.encodeHeader( + "foo-one", "value-one", + "foo-two", "value-two", + "foo-three", "value-three", + ) + remain := fullHeaders + chunks := 0 + for len(remain) > 0 { + const maxChunkSize = 5 + chunk := remain + if len(chunk) > maxChunkSize { + chunk = chunk[:maxChunkSize] + } + remain = remain[len(chunk):] + + if chunks == 0 { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: chunk, + EndStream: true, // no DATA frames + EndHeaders: false, // we'll have continuation frames + }) + } else { + err := st.fr.WriteContinuation(1, len(remain) == 0, chunk) + if err != nil { + t.Fatal(err) + } + } + chunks++ + } + if chunks < 2 { + t.Fatal("too few chunks") + } + }, func(r *http.Request) { + if !reflect.DeepEqual(r.Header, wantHeader) { + t.Errorf("Header = %#v; want %#v", r.Header, wantHeader) + } + }) +} + +// Concatenated cookie headers. ("8.1.2.5 Compressing the Cookie Header Field") +func TestServer_Request_CookieConcat(t *testing.T) { + const host = "example.com" + testServerRequest(t, func(st *serverTester) { + st.bodylessReq1( + ":authority", host, + "cookie", "a=b", + "cookie", "c=d", + "cookie", "e=f", + ) + }, func(r *http.Request) { + const want = "a=b; c=d; e=f" + if got := r.Header.Get("Cookie"); got != want { + t.Errorf("Cookie = %q; want %q", got, want) + } + }) +} + +func TestServer_Request_Reject_CapitalHeader(t *testing.T) { + testRejectRequest(t, func(st *serverTester) { st.bodylessReq1("UPPER", "v") }) +} + +func TestServer_Request_Reject_HeaderFieldNameColon(t *testing.T) { + testRejectRequest(t, func(st *serverTester) { st.bodylessReq1("has:colon", "v") }) +} + +func TestServer_Request_Reject_HeaderFieldNameNULL(t *testing.T) { + testRejectRequest(t, func(st *serverTester) { st.bodylessReq1("has\x00null", "v") }) +} + +func TestServer_Request_Reject_HeaderFieldNameEmpty(t *testing.T) { + testRejectRequest(t, func(st *serverTester) { st.bodylessReq1("", "v") }) +} + +func TestServer_Request_Reject_HeaderFieldValueNewline(t *testing.T) { + testRejectRequest(t, func(st *serverTester) { st.bodylessReq1("foo", "has\nnewline") }) +} + +func TestServer_Request_Reject_HeaderFieldValueCR(t *testing.T) { + testRejectRequest(t, func(st *serverTester) { st.bodylessReq1("foo", "has\rcarriage") }) +} + +func TestServer_Request_Reject_HeaderFieldValueDEL(t *testing.T) { + testRejectRequest(t, func(st *serverTester) { st.bodylessReq1("foo", "has\x7fdel") }) +} + +func TestServer_Request_Reject_Pseudo_Missing_method(t *testing.T) { + testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":method", "") }) +} + +func TestServer_Request_Reject_Pseudo_ExactlyOne(t *testing.T) { + // 8.1.2.3 Request Pseudo-Header Fields + // "All HTTP/2 requests MUST include exactly one valid value" ... + testRejectRequest(t, func(st *serverTester) { + st.addLogFilter("duplicate pseudo-header") + st.bodylessReq1(":method", "GET", ":method", "POST") + }) +} + +func TestServer_Request_Reject_Pseudo_AfterRegular(t *testing.T) { + // 8.1.2.3 Request Pseudo-Header Fields + // "All pseudo-header fields MUST appear in the header block + // before regular header fields. Any request or response that + // contains a pseudo-header field that appears in a header + // block after a regular header field MUST be treated as + // malformed (Section 8.1.2.6)." + testRejectRequest(t, func(st *serverTester) { + st.addLogFilter("pseudo-header after regular header") + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + enc.WriteField(hpack.HeaderField{Name: ":method", Value: "GET"}) + enc.WriteField(hpack.HeaderField{Name: "regular", Value: "foobar"}) + enc.WriteField(hpack.HeaderField{Name: ":path", Value: "/"}) + enc.WriteField(hpack.HeaderField{Name: ":scheme", Value: "https"}) + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: buf.Bytes(), + EndStream: true, + EndHeaders: true, + }) + }) +} + +func TestServer_Request_Reject_Pseudo_Missing_path(t *testing.T) { + testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":path", "") }) +} + +func TestServer_Request_Reject_Pseudo_Missing_scheme(t *testing.T) { + testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":scheme", "") }) +} + +func TestServer_Request_Reject_Pseudo_scheme_invalid(t *testing.T) { + testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":scheme", "bogus") }) +} + +func TestServer_Request_Reject_Pseudo_Unknown(t *testing.T) { + testRejectRequest(t, func(st *serverTester) { + st.addLogFilter(`invalid pseudo-header ":unknown_thing"`) + st.bodylessReq1(":unknown_thing", "") + }) +} + +func testRejectRequest(t *testing.T, send func(*serverTester)) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + t.Error("server request made it to handler; should've been rejected") + }) + defer st.Close() + + st.greet() + send(st) + st.wantRSTStream(1, ErrCodeProtocol) +} + +func testRejectRequestWithProtocolError(t *testing.T, send func(*serverTester)) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + t.Error("server request made it to handler; should've been rejected") + }, optQuiet) + defer st.Close() + + st.greet() + send(st) + gf := st.wantGoAway() + if gf.ErrCode != ErrCodeProtocol { + t.Errorf("err code = %v; want %v", gf.ErrCode, ErrCodeProtocol) + } +} + +// Section 5.1, on idle connections: "Receiving any frame other than +// HEADERS or PRIORITY on a stream in this state MUST be treated as a +// connection error (Section 5.4.1) of type PROTOCOL_ERROR." +func TestRejectFrameOnIdle_WindowUpdate(t *testing.T) { + testRejectRequestWithProtocolError(t, func(st *serverTester) { + st.fr.WriteWindowUpdate(123, 456) + }) +} +func TestRejectFrameOnIdle_Data(t *testing.T) { + testRejectRequestWithProtocolError(t, func(st *serverTester) { + st.fr.WriteData(123, true, nil) + }) +} +func TestRejectFrameOnIdle_RSTStream(t *testing.T) { + testRejectRequestWithProtocolError(t, func(st *serverTester) { + st.fr.WriteRSTStream(123, ErrCodeCancel) + }) +} + +func TestServer_Request_Connect(t *testing.T) { + testServerRequest(t, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeaderRaw( + ":method", "CONNECT", + ":authority", "example.com:123", + ), + EndStream: true, + EndHeaders: true, + }) + }, func(r *http.Request) { + if g, w := r.Method, "CONNECT"; g != w { + t.Errorf("Method = %q; want %q", g, w) + } + if g, w := r.RequestURI, "example.com:123"; g != w { + t.Errorf("RequestURI = %q; want %q", g, w) + } + if g, w := r.URL.Host, "example.com:123"; g != w { + t.Errorf("URL.Host = %q; want %q", g, w) + } + }) +} + +func TestServer_Request_Connect_InvalidPath(t *testing.T) { + testServerRejectsStream(t, ErrCodeProtocol, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeaderRaw( + ":method", "CONNECT", + ":authority", "example.com:123", + ":path", "/bogus", + ), + EndStream: true, + EndHeaders: true, + }) + }) +} + +func TestServer_Request_Connect_InvalidScheme(t *testing.T) { + testServerRejectsStream(t, ErrCodeProtocol, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeaderRaw( + ":method", "CONNECT", + ":authority", "example.com:123", + ":scheme", "https", + ), + EndStream: true, + EndHeaders: true, + }) + }) +} + +func TestServer_Ping(t *testing.T) { + st := newServerTester(t, nil) + defer st.Close() + st.greet() + + // Server should ignore this one, since it has ACK set. + ackPingData := [8]byte{1, 2, 4, 8, 16, 32, 64, 128} + if err := st.fr.WritePing(true, ackPingData); err != nil { + t.Fatal(err) + } + + // But the server should reply to this one, since ACK is false. + pingData := [8]byte{1, 2, 3, 4, 5, 6, 7, 8} + if err := st.fr.WritePing(false, pingData); err != nil { + t.Fatal(err) + } + + pf := st.wantPing() + if !pf.Flags.Has(FlagPingAck) { + t.Error("response ping doesn't have ACK set") + } + if pf.Data != pingData { + t.Errorf("response ping has data %q; want %q", pf.Data, pingData) + } +} + +func TestServer_RejectsLargeFrames(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("see golang.org/issue/13434") + } + + st := newServerTester(t, nil) + defer st.Close() + st.greet() + + // Write too large of a frame (too large by one byte) + // We ignore the return value because it's expected that the server + // will only read the first 9 bytes (the headre) and then disconnect. + st.fr.WriteRawFrame(0xff, 0, 0, make([]byte, defaultMaxReadFrameSize+1)) + + gf := st.wantGoAway() + if gf.ErrCode != ErrCodeFrameSize { + t.Errorf("GOAWAY err = %v; want %v", gf.ErrCode, ErrCodeFrameSize) + } + if st.serverLogBuf.Len() != 0 { + // Previously we spun here for a bit until the GOAWAY disconnect + // timer fired, logging while we fired. + t.Errorf("unexpected server output: %.500s\n", st.serverLogBuf.Bytes()) + } +} + +func TestServer_Handler_Sends_WindowUpdate(t *testing.T) { + puppet := newHandlerPuppet() + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + puppet.act(w, r) + }) + defer st.Close() + defer puppet.done() + + st.greet() + + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader(":method", "POST"), + EndStream: false, // data coming + EndHeaders: true, + }) + st.writeData(1, false, []byte("abcdef")) + puppet.do(readBodyHandler(t, "abc")) + st.wantWindowUpdate(0, 3) + st.wantWindowUpdate(1, 3) + + puppet.do(readBodyHandler(t, "def")) + st.wantWindowUpdate(0, 3) + st.wantWindowUpdate(1, 3) + + st.writeData(1, true, []byte("ghijkl")) // END_STREAM here + puppet.do(readBodyHandler(t, "ghi")) + puppet.do(readBodyHandler(t, "jkl")) + st.wantWindowUpdate(0, 3) + st.wantWindowUpdate(0, 3) // no more stream-level, since END_STREAM +} + +// the version of the TestServer_Handler_Sends_WindowUpdate with padding. +// See golang.org/issue/16556 +func TestServer_Handler_Sends_WindowUpdate_Padding(t *testing.T) { + puppet := newHandlerPuppet() + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + puppet.act(w, r) + }) + defer st.Close() + defer puppet.done() + + st.greet() + + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeader(":method", "POST"), + EndStream: false, + EndHeaders: true, + }) + st.writeDataPadded(1, false, []byte("abcdef"), []byte{0, 0, 0, 0}) + + // Expect to immediately get our 5 bytes of padding back for + // both the connection and stream (4 bytes of padding + 1 byte of length) + st.wantWindowUpdate(0, 5) + st.wantWindowUpdate(1, 5) + + puppet.do(readBodyHandler(t, "abc")) + st.wantWindowUpdate(0, 3) + st.wantWindowUpdate(1, 3) + + puppet.do(readBodyHandler(t, "def")) + st.wantWindowUpdate(0, 3) + st.wantWindowUpdate(1, 3) +} + +func TestServer_Send_GoAway_After_Bogus_WindowUpdate(t *testing.T) { + st := newServerTester(t, nil) + defer st.Close() + st.greet() + if err := st.fr.WriteWindowUpdate(0, 1<<31-1); err != nil { + t.Fatal(err) + } + gf := st.wantGoAway() + if gf.ErrCode != ErrCodeFlowControl { + t.Errorf("GOAWAY err = %v; want %v", gf.ErrCode, ErrCodeFlowControl) + } + if gf.LastStreamID != 0 { + t.Errorf("GOAWAY last stream ID = %v; want %v", gf.LastStreamID, 0) + } +} + +func TestServer_Send_RstStream_After_Bogus_WindowUpdate(t *testing.T) { + inHandler := make(chan bool) + blockHandler := make(chan bool) + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + inHandler <- true + <-blockHandler + }) + defer st.Close() + defer close(blockHandler) + st.greet() + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeader(":method", "POST"), + EndStream: false, // keep it open + EndHeaders: true, + }) + <-inHandler + // Send a bogus window update: + if err := st.fr.WriteWindowUpdate(1, 1<<31-1); err != nil { + t.Fatal(err) + } + st.wantRSTStream(1, ErrCodeFlowControl) +} + +// testServerPostUnblock sends a hanging POST with unsent data to handler, +// then runs fn once in the handler, and verifies that the error returned from +// handler is acceptable. It fails if takes over 5 seconds for handler to exit. +func testServerPostUnblock(t *testing.T, + handler func(http.ResponseWriter, *http.Request) error, + fn func(*serverTester), + checkErr func(error), + otherHeaders ...string) { + inHandler := make(chan bool) + errc := make(chan error, 1) + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + inHandler <- true + errc <- handler(w, r) + }) + defer st.Close() + st.greet() + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeader(append([]string{":method", "POST"}, otherHeaders...)...), + EndStream: false, // keep it open + EndHeaders: true, + }) + <-inHandler + fn(st) + select { + case err := <-errc: + if checkErr != nil { + checkErr(err) + } + case <-time.After(5 * time.Second): + t.Fatal("timeout waiting for Handler to return") + } +} + +func TestServer_RSTStream_Unblocks_Read(t *testing.T) { + testServerPostUnblock(t, + func(w http.ResponseWriter, r *http.Request) (err error) { + _, err = r.Body.Read(make([]byte, 1)) + return + }, + func(st *serverTester) { + if err := st.fr.WriteRSTStream(1, ErrCodeCancel); err != nil { + t.Fatal(err) + } + }, + func(err error) { + want := StreamError{StreamID: 0x1, Code: 0x8} + if !reflect.DeepEqual(err, want) { + t.Errorf("Read error = %v; want %v", err, want) + } + }, + ) +} + +func TestServer_RSTStream_Unblocks_Header_Write(t *testing.T) { + // Run this test a bunch, because it doesn't always + // deadlock. But with a bunch, it did. + n := 50 + if testing.Short() { + n = 5 + } + for i := 0; i < n; i++ { + testServer_RSTStream_Unblocks_Header_Write(t) + } +} + +func testServer_RSTStream_Unblocks_Header_Write(t *testing.T) { + inHandler := make(chan bool, 1) + unblockHandler := make(chan bool, 1) + headerWritten := make(chan bool, 1) + wroteRST := make(chan bool, 1) + + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + inHandler <- true + <-wroteRST + w.Header().Set("foo", "bar") + w.WriteHeader(200) + w.(http.Flusher).Flush() + headerWritten <- true + <-unblockHandler + }) + defer st.Close() + + st.greet() + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeader(":method", "POST"), + EndStream: false, // keep it open + EndHeaders: true, + }) + <-inHandler + if err := st.fr.WriteRSTStream(1, ErrCodeCancel); err != nil { + t.Fatal(err) + } + wroteRST <- true + st.awaitIdle() + select { + case <-headerWritten: + case <-time.After(2 * time.Second): + t.Error("timeout waiting for header write") + } + unblockHandler <- true +} + +func TestServer_DeadConn_Unblocks_Read(t *testing.T) { + testServerPostUnblock(t, + func(w http.ResponseWriter, r *http.Request) (err error) { + _, err = r.Body.Read(make([]byte, 1)) + return + }, + func(st *serverTester) { st.cc.Close() }, + func(err error) { + if err == nil { + t.Error("unexpected nil error from Request.Body.Read") + } + }, + ) +} + +var blockUntilClosed = func(w http.ResponseWriter, r *http.Request) error { + <-w.(http.CloseNotifier).CloseNotify() + return nil +} + +func TestServer_CloseNotify_After_RSTStream(t *testing.T) { + testServerPostUnblock(t, blockUntilClosed, func(st *serverTester) { + if err := st.fr.WriteRSTStream(1, ErrCodeCancel); err != nil { + t.Fatal(err) + } + }, nil) +} + +func TestServer_CloseNotify_After_ConnClose(t *testing.T) { + testServerPostUnblock(t, blockUntilClosed, func(st *serverTester) { st.cc.Close() }, nil) +} + +// that CloseNotify unblocks after a stream error due to the client's +// problem that's unrelated to them explicitly canceling it (which is +// TestServer_CloseNotify_After_RSTStream above) +func TestServer_CloseNotify_After_StreamError(t *testing.T) { + testServerPostUnblock(t, blockUntilClosed, func(st *serverTester) { + // data longer than declared Content-Length => stream error + st.writeData(1, true, []byte("1234")) + }, nil, "content-length", "3") +} + +func TestServer_StateTransitions(t *testing.T) { + var st *serverTester + inHandler := make(chan bool) + writeData := make(chan bool) + leaveHandler := make(chan bool) + st = newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + inHandler <- true + if st.stream(1) == nil { + t.Errorf("nil stream 1 in handler") + } + if got, want := st.streamState(1), stateOpen; got != want { + t.Errorf("in handler, state is %v; want %v", got, want) + } + writeData <- true + if n, err := r.Body.Read(make([]byte, 1)); n != 0 || err != io.EOF { + t.Errorf("body read = %d, %v; want 0, EOF", n, err) + } + if got, want := st.streamState(1), stateHalfClosedRemote; got != want { + t.Errorf("in handler, state is %v; want %v", got, want) + } + + <-leaveHandler + }) + st.greet() + if st.stream(1) != nil { + t.Fatal("stream 1 should be empty") + } + if got := st.streamState(1); got != stateIdle { + t.Fatalf("stream 1 should be idle; got %v", got) + } + + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeader(":method", "POST"), + EndStream: false, // keep it open + EndHeaders: true, + }) + <-inHandler + <-writeData + st.writeData(1, true, nil) + + leaveHandler <- true + hf := st.wantHeaders() + if !hf.StreamEnded() { + t.Fatal("expected END_STREAM flag") + } + + if got, want := st.streamState(1), stateClosed; got != want { + t.Errorf("at end, state is %v; want %v", got, want) + } + if st.stream(1) != nil { + t.Fatal("at end, stream 1 should be gone") + } +} + +// test HEADERS w/o EndHeaders + another HEADERS (should get rejected) +func TestServer_Rejects_HeadersNoEnd_Then_Headers(t *testing.T) { + testServerRejectsConn(t, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeader(), + EndStream: true, + EndHeaders: false, + }) + st.writeHeaders(HeadersFrameParam{ // Not a continuation. + StreamID: 3, // different stream. + BlockFragment: st.encodeHeader(), + EndStream: true, + EndHeaders: true, + }) + }) +} + +// test HEADERS w/o EndHeaders + PING (should get rejected) +func TestServer_Rejects_HeadersNoEnd_Then_Ping(t *testing.T) { + testServerRejectsConn(t, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeader(), + EndStream: true, + EndHeaders: false, + }) + if err := st.fr.WritePing(false, [8]byte{}); err != nil { + t.Fatal(err) + } + }) +} + +// test HEADERS w/ EndHeaders + a continuation HEADERS (should get rejected) +func TestServer_Rejects_HeadersEnd_Then_Continuation(t *testing.T) { + testServerRejectsConn(t, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeader(), + EndStream: true, + EndHeaders: true, + }) + st.wantHeaders() + if err := st.fr.WriteContinuation(1, true, encodeHeaderNoImplicit(t, "foo", "bar")); err != nil { + t.Fatal(err) + } + }) +} + +// test HEADERS w/o EndHeaders + a continuation HEADERS on wrong stream ID +func TestServer_Rejects_HeadersNoEnd_Then_ContinuationWrongStream(t *testing.T) { + testServerRejectsConn(t, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeader(), + EndStream: true, + EndHeaders: false, + }) + if err := st.fr.WriteContinuation(3, true, encodeHeaderNoImplicit(t, "foo", "bar")); err != nil { + t.Fatal(err) + } + }) +} + +// No HEADERS on stream 0. +func TestServer_Rejects_Headers0(t *testing.T) { + testServerRejectsConn(t, func(st *serverTester) { + st.fr.AllowIllegalWrites = true + st.writeHeaders(HeadersFrameParam{ + StreamID: 0, + BlockFragment: st.encodeHeader(), + EndStream: true, + EndHeaders: true, + }) + }) +} + +// No CONTINUATION on stream 0. +func TestServer_Rejects_Continuation0(t *testing.T) { + testServerRejectsConn(t, func(st *serverTester) { + st.fr.AllowIllegalWrites = true + if err := st.fr.WriteContinuation(0, true, st.encodeHeader()); err != nil { + t.Fatal(err) + } + }) +} + +// No PRIORITY on stream 0. +func TestServer_Rejects_Priority0(t *testing.T) { + testServerRejectsConn(t, func(st *serverTester) { + st.fr.AllowIllegalWrites = true + st.writePriority(0, PriorityParam{StreamDep: 1}) + }) +} + +// No HEADERS frame with a self-dependence. +func TestServer_Rejects_HeadersSelfDependence(t *testing.T) { + testServerRejectsStream(t, ErrCodeProtocol, func(st *serverTester) { + st.fr.AllowIllegalWrites = true + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeader(), + EndStream: true, + EndHeaders: true, + Priority: PriorityParam{StreamDep: 1}, + }) + }) +} + +// No PRIORTY frame with a self-dependence. +func TestServer_Rejects_PrioritySelfDependence(t *testing.T) { + testServerRejectsStream(t, ErrCodeProtocol, func(st *serverTester) { + st.fr.AllowIllegalWrites = true + st.writePriority(1, PriorityParam{StreamDep: 1}) + }) +} + +func TestServer_Rejects_PushPromise(t *testing.T) { + testServerRejectsConn(t, func(st *serverTester) { + pp := PushPromiseParam{ + StreamID: 1, + PromiseID: 3, + } + if err := st.fr.WritePushPromise(pp); err != nil { + t.Fatal(err) + } + }) +} + +// testServerRejectsConn tests that the server hangs up with a GOAWAY +// frame and a server close after the client does something +// deserving a CONNECTION_ERROR. +func testServerRejectsConn(t *testing.T, writeReq func(*serverTester)) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {}) + st.addLogFilter("connection error: PROTOCOL_ERROR") + defer st.Close() + st.greet() + writeReq(st) + + st.wantGoAway() + errc := make(chan error, 1) + go func() { + fr, err := st.fr.ReadFrame() + if err == nil { + err = fmt.Errorf("got frame of type %T", fr) + } + errc <- err + }() + select { + case err := <-errc: + if err != io.EOF { + t.Errorf("ReadFrame = %v; want io.EOF", err) + } + case <-time.After(2 * time.Second): + t.Error("timeout waiting for disconnect") + } +} + +// testServerRejectsStream tests that the server sends a RST_STREAM with the provided +// error code after a client sends a bogus request. +func testServerRejectsStream(t *testing.T, code ErrCode, writeReq func(*serverTester)) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {}) + defer st.Close() + st.greet() + writeReq(st) + st.wantRSTStream(1, code) +} + +// testServerRequest sets up an idle HTTP/2 connection and lets you +// write a single request with writeReq, and then verify that the +// *http.Request is built correctly in checkReq. +func testServerRequest(t *testing.T, writeReq func(*serverTester), checkReq func(*http.Request)) { + gotReq := make(chan bool, 1) + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + if r.Body == nil { + t.Fatal("nil Body") + } + checkReq(r) + gotReq <- true + }) + defer st.Close() + + st.greet() + writeReq(st) + + select { + case <-gotReq: + case <-time.After(2 * time.Second): + t.Error("timeout waiting for request") + } +} + +func getSlash(st *serverTester) { st.bodylessReq1() } + +func TestServer_Response_NoData(t *testing.T) { + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + // Nothing. + return nil + }, func(st *serverTester) { + getSlash(st) + hf := st.wantHeaders() + if !hf.StreamEnded() { + t.Fatal("want END_STREAM flag") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + }) +} + +func TestServer_Response_NoData_Header_FooBar(t *testing.T) { + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + w.Header().Set("Foo-Bar", "some-value") + return nil + }, func(st *serverTester) { + getSlash(st) + hf := st.wantHeaders() + if !hf.StreamEnded() { + t.Fatal("want END_STREAM flag") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + goth := st.decodeHeader(hf.HeaderBlockFragment()) + wanth := [][2]string{ + {":status", "200"}, + {"foo-bar", "some-value"}, + {"content-length", "0"}, + } + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Got headers %v; want %v", goth, wanth) + } + }) +} + +func TestServer_Response_Data_Sniff_DoesntOverride(t *testing.T) { + const msg = "this is HTML." + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + w.Header().Set("Content-Type", "foo/bar") + io.WriteString(w, msg) + return nil + }, func(st *serverTester) { + getSlash(st) + hf := st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("don't want END_STREAM, expecting data") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + goth := st.decodeHeader(hf.HeaderBlockFragment()) + wanth := [][2]string{ + {":status", "200"}, + {"content-type", "foo/bar"}, + {"content-length", strconv.Itoa(len(msg))}, + } + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Got headers %v; want %v", goth, wanth) + } + df := st.wantData() + if !df.StreamEnded() { + t.Error("expected DATA to have END_STREAM flag") + } + if got := string(df.Data()); got != msg { + t.Errorf("got DATA %q; want %q", got, msg) + } + }) +} + +func TestServer_Response_Nosniff_WithoutContentType(t *testing.T) { + const msg = "this is HTML." + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + w.Header().Set("X-Content-Type-Options", "nosniff") + w.WriteHeader(200) + io.WriteString(w, msg) + return nil + }, func(st *serverTester) { + getSlash(st) + hf := st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("don't want END_STREAM, expecting data") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + goth := st.decodeHeader(hf.HeaderBlockFragment()) + wanth := [][2]string{ + {":status", "200"}, + {"x-content-type-options", "nosniff"}, + {"content-type", "application/octet-stream"}, + {"content-length", strconv.Itoa(len(msg))}, + } + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Got headers %v; want %v", goth, wanth) + } + df := st.wantData() + if !df.StreamEnded() { + t.Error("expected DATA to have END_STREAM flag") + } + if got := string(df.Data()); got != msg { + t.Errorf("got DATA %q; want %q", got, msg) + } + }) +} + +func TestServer_Response_TransferEncoding_chunked(t *testing.T) { + const msg = "hi" + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + w.Header().Set("Transfer-Encoding", "chunked") // should be stripped + io.WriteString(w, msg) + return nil + }, func(st *serverTester) { + getSlash(st) + hf := st.wantHeaders() + goth := st.decodeHeader(hf.HeaderBlockFragment()) + wanth := [][2]string{ + {":status", "200"}, + {"content-type", "text/plain; charset=utf-8"}, + {"content-length", strconv.Itoa(len(msg))}, + {"x-content-type-options", "nosniff"}, + } + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Got headers %v; want %v", goth, wanth) + } + }) +} + +// Header accessed only after the initial write. +func TestServer_Response_Data_IgnoreHeaderAfterWrite_After(t *testing.T) { + const msg = "this is HTML." + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + io.WriteString(w, msg) + w.Header().Set("foo", "should be ignored") + return nil + }, func(st *serverTester) { + getSlash(st) + hf := st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("unexpected END_STREAM") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + goth := st.decodeHeader(hf.HeaderBlockFragment()) + wanth := [][2]string{ + {":status", "200"}, + {"content-type", "text/html; charset=utf-8"}, + {"content-length", strconv.Itoa(len(msg))}, + } + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Got headers %v; want %v", goth, wanth) + } + }) +} + +// Header accessed before the initial write and later mutated. +func TestServer_Response_Data_IgnoreHeaderAfterWrite_Overwrite(t *testing.T) { + const msg = "this is HTML." + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + w.Header().Set("foo", "proper value") + io.WriteString(w, msg) + w.Header().Set("foo", "should be ignored") + return nil + }, func(st *serverTester) { + getSlash(st) + hf := st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("unexpected END_STREAM") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + goth := st.decodeHeader(hf.HeaderBlockFragment()) + wanth := [][2]string{ + {":status", "200"}, + {"foo", "proper value"}, + {"content-type", "text/html; charset=utf-8"}, + {"content-length", strconv.Itoa(len(msg))}, + } + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Got headers %v; want %v", goth, wanth) + } + }) +} + +func TestServer_Response_Data_SniffLenType(t *testing.T) { + const msg = "this is HTML." + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + io.WriteString(w, msg) + return nil + }, func(st *serverTester) { + getSlash(st) + hf := st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("don't want END_STREAM, expecting data") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + goth := st.decodeHeader(hf.HeaderBlockFragment()) + wanth := [][2]string{ + {":status", "200"}, + {"content-type", "text/html; charset=utf-8"}, + {"content-length", strconv.Itoa(len(msg))}, + } + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Got headers %v; want %v", goth, wanth) + } + df := st.wantData() + if !df.StreamEnded() { + t.Error("expected DATA to have END_STREAM flag") + } + if got := string(df.Data()); got != msg { + t.Errorf("got DATA %q; want %q", got, msg) + } + }) +} + +func TestServer_Response_Header_Flush_MidWrite(t *testing.T) { + const msg = "this is HTML" + const msg2 = ", and this is the next chunk" + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + io.WriteString(w, msg) + w.(http.Flusher).Flush() + io.WriteString(w, msg2) + return nil + }, func(st *serverTester) { + getSlash(st) + hf := st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("unexpected END_STREAM flag") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + goth := st.decodeHeader(hf.HeaderBlockFragment()) + wanth := [][2]string{ + {":status", "200"}, + {"content-type", "text/html; charset=utf-8"}, // sniffed + // and no content-length + } + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Got headers %v; want %v", goth, wanth) + } + { + df := st.wantData() + if df.StreamEnded() { + t.Error("unexpected END_STREAM flag") + } + if got := string(df.Data()); got != msg { + t.Errorf("got DATA %q; want %q", got, msg) + } + } + { + df := st.wantData() + if !df.StreamEnded() { + t.Error("wanted END_STREAM flag on last data chunk") + } + if got := string(df.Data()); got != msg2 { + t.Errorf("got DATA %q; want %q", got, msg2) + } + } + }) +} + +func TestServer_Response_LargeWrite(t *testing.T) { + const size = 1 << 20 + const maxFrameSize = 16 << 10 + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + n, err := w.Write(bytes.Repeat([]byte("a"), size)) + if err != nil { + return fmt.Errorf("Write error: %v", err) + } + if n != size { + return fmt.Errorf("wrong size %d from Write", n) + } + return nil + }, func(st *serverTester) { + if err := st.fr.WriteSettings( + Setting{SettingInitialWindowSize, 0}, + Setting{SettingMaxFrameSize, maxFrameSize}, + ); err != nil { + t.Fatal(err) + } + st.wantSettingsAck() + + getSlash(st) // make the single request + + // Give the handler quota to write: + if err := st.fr.WriteWindowUpdate(1, size); err != nil { + t.Fatal(err) + } + // Give the handler quota to write to connection-level + // window as well + if err := st.fr.WriteWindowUpdate(0, size); err != nil { + t.Fatal(err) + } + hf := st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("unexpected END_STREAM flag") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + goth := st.decodeHeader(hf.HeaderBlockFragment()) + wanth := [][2]string{ + {":status", "200"}, + {"content-type", "text/plain; charset=utf-8"}, // sniffed + {"x-content-type-options", "nosniff"}, + // and no content-length + } + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Got headers %v; want %v", goth, wanth) + } + var bytes, frames int + for { + df := st.wantData() + bytes += len(df.Data()) + frames++ + for _, b := range df.Data() { + if b != 'a' { + t.Fatal("non-'a' byte seen in DATA") + } + } + if df.StreamEnded() { + break + } + } + if bytes != size { + t.Errorf("Got %d bytes; want %d", bytes, size) + } + if want := int(size / maxFrameSize); frames < want || frames > want*2 { + t.Errorf("Got %d frames; want %d", frames, size) + } + }) +} + +// Test that the handler can't write more than the client allows +func TestServer_Response_LargeWrite_FlowControlled(t *testing.T) { + // Make these reads. Before each read, the client adds exactly enough + // flow-control to satisfy the read. Numbers chosen arbitrarily. + reads := []int{123, 1, 13, 127} + size := 0 + for _, n := range reads { + size += n + } + + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + w.(http.Flusher).Flush() + n, err := w.Write(bytes.Repeat([]byte("a"), size)) + if err != nil { + return fmt.Errorf("Write error: %v", err) + } + if n != size { + return fmt.Errorf("wrong size %d from Write", n) + } + return nil + }, func(st *serverTester) { + // Set the window size to something explicit for this test. + // It's also how much initial data we expect. + if err := st.fr.WriteSettings(Setting{SettingInitialWindowSize, uint32(reads[0])}); err != nil { + t.Fatal(err) + } + st.wantSettingsAck() + + getSlash(st) // make the single request + + hf := st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("unexpected END_STREAM flag") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + + df := st.wantData() + if got := len(df.Data()); got != reads[0] { + t.Fatalf("Initial window size = %d but got DATA with %d bytes", reads[0], got) + } + + for _, quota := range reads[1:] { + if err := st.fr.WriteWindowUpdate(1, uint32(quota)); err != nil { + t.Fatal(err) + } + df := st.wantData() + if int(quota) != len(df.Data()) { + t.Fatalf("read %d bytes after giving %d quota", len(df.Data()), quota) + } + } + }) +} + +// Test that the handler blocked in a Write is unblocked if the server sends a RST_STREAM. +func TestServer_Response_RST_Unblocks_LargeWrite(t *testing.T) { + const size = 1 << 20 + const maxFrameSize = 16 << 10 + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + w.(http.Flusher).Flush() + errc := make(chan error, 1) + go func() { + _, err := w.Write(bytes.Repeat([]byte("a"), size)) + errc <- err + }() + select { + case err := <-errc: + if err == nil { + return errors.New("unexpected nil error from Write in handler") + } + return nil + case <-time.After(2 * time.Second): + return errors.New("timeout waiting for Write in handler") + } + }, func(st *serverTester) { + if err := st.fr.WriteSettings( + Setting{SettingInitialWindowSize, 0}, + Setting{SettingMaxFrameSize, maxFrameSize}, + ); err != nil { + t.Fatal(err) + } + st.wantSettingsAck() + + getSlash(st) // make the single request + + hf := st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("unexpected END_STREAM flag") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + + if err := st.fr.WriteRSTStream(1, ErrCodeCancel); err != nil { + t.Fatal(err) + } + }) +} + +func TestServer_Response_Empty_Data_Not_FlowControlled(t *testing.T) { + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + w.(http.Flusher).Flush() + // Nothing; send empty DATA + return nil + }, func(st *serverTester) { + // Handler gets no data quota: + if err := st.fr.WriteSettings(Setting{SettingInitialWindowSize, 0}); err != nil { + t.Fatal(err) + } + st.wantSettingsAck() + + getSlash(st) // make the single request + + hf := st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("unexpected END_STREAM flag") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + + df := st.wantData() + if got := len(df.Data()); got != 0 { + t.Fatalf("unexpected %d DATA bytes; want 0", got) + } + if !df.StreamEnded() { + t.Fatal("DATA didn't have END_STREAM") + } + }) +} + +func TestServer_Response_Automatic100Continue(t *testing.T) { + const msg = "foo" + const reply = "bar" + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + if v := r.Header.Get("Expect"); v != "" { + t.Errorf("Expect header = %q; want empty", v) + } + buf := make([]byte, len(msg)) + // This read should trigger the 100-continue being sent. + if n, err := io.ReadFull(r.Body, buf); err != nil || n != len(msg) || string(buf) != msg { + return fmt.Errorf("ReadFull = %q, %v; want %q, nil", buf[:n], err, msg) + } + _, err := io.WriteString(w, reply) + return err + }, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader(":method", "POST", "expect", "100-continue"), + EndStream: false, + EndHeaders: true, + }) + hf := st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("unexpected END_STREAM flag") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + goth := st.decodeHeader(hf.HeaderBlockFragment()) + wanth := [][2]string{ + {":status", "100"}, + } + if !reflect.DeepEqual(goth, wanth) { + t.Fatalf("Got headers %v; want %v", goth, wanth) + } + + // Okay, they sent status 100, so we can send our + // gigantic and/or sensitive "foo" payload now. + st.writeData(1, true, []byte(msg)) + + st.wantWindowUpdate(0, uint32(len(msg))) + + hf = st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("expected data to follow") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + goth = st.decodeHeader(hf.HeaderBlockFragment()) + wanth = [][2]string{ + {":status", "200"}, + {"content-type", "text/plain; charset=utf-8"}, + {"content-length", strconv.Itoa(len(reply))}, + {"x-content-type-options", "nosniff"}, + } + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Got headers %v; want %v", goth, wanth) + } + + df := st.wantData() + if string(df.Data()) != reply { + t.Errorf("Client read %q; want %q", df.Data(), reply) + } + if !df.StreamEnded() { + t.Errorf("expect data stream end") + } + }) +} + +func TestServer_HandlerWriteErrorOnDisconnect(t *testing.T) { + errc := make(chan error, 1) + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + p := []byte("some data.\n") + for { + _, err := w.Write(p) + if err != nil { + errc <- err + return nil + } + } + }, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeader(), + EndStream: false, + EndHeaders: true, + }) + hf := st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("unexpected END_STREAM flag") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + // Close the connection and wait for the handler to (hopefully) notice. + st.cc.Close() + select { + case <-errc: + case <-time.After(5 * time.Second): + t.Error("timeout") + } + }) +} + +func TestServer_Rejects_Too_Many_Streams(t *testing.T) { + const testPath = "/some/path" + + inHandler := make(chan uint32) + leaveHandler := make(chan bool) + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + id := w.(*responseWriter).rws.stream.id + inHandler <- id + if id == 1+(defaultMaxStreams+1)*2 && r.URL.Path != testPath { + t.Errorf("decoded final path as %q; want %q", r.URL.Path, testPath) + } + <-leaveHandler + }) + defer st.Close() + st.greet() + nextStreamID := uint32(1) + streamID := func() uint32 { + defer func() { nextStreamID += 2 }() + return nextStreamID + } + sendReq := func(id uint32, headers ...string) { + st.writeHeaders(HeadersFrameParam{ + StreamID: id, + BlockFragment: st.encodeHeader(headers...), + EndStream: true, + EndHeaders: true, + }) + } + for i := 0; i < defaultMaxStreams; i++ { + sendReq(streamID()) + <-inHandler + } + defer func() { + for i := 0; i < defaultMaxStreams; i++ { + leaveHandler <- true + } + }() + + // And this one should cross the limit: + // (It's also sent as a CONTINUATION, to verify we still track the decoder context, + // even if we're rejecting it) + rejectID := streamID() + headerBlock := st.encodeHeader(":path", testPath) + frag1, frag2 := headerBlock[:3], headerBlock[3:] + st.writeHeaders(HeadersFrameParam{ + StreamID: rejectID, + BlockFragment: frag1, + EndStream: true, + EndHeaders: false, // CONTINUATION coming + }) + if err := st.fr.WriteContinuation(rejectID, true, frag2); err != nil { + t.Fatal(err) + } + st.wantRSTStream(rejectID, ErrCodeProtocol) + + // But let a handler finish: + leaveHandler <- true + st.wantHeaders() + + // And now another stream should be able to start: + goodID := streamID() + sendReq(goodID, ":path", testPath) + select { + case got := <-inHandler: + if got != goodID { + t.Errorf("Got stream %d; want %d", got, goodID) + } + case <-time.After(3 * time.Second): + t.Error("timeout waiting for handler") + } +} + +// So many response headers that the server needs to use CONTINUATION frames: +func TestServer_Response_ManyHeaders_With_Continuation(t *testing.T) { + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + h := w.Header() + for i := 0; i < 5000; i++ { + h.Set(fmt.Sprintf("x-header-%d", i), fmt.Sprintf("x-value-%d", i)) + } + return nil + }, func(st *serverTester) { + getSlash(st) + hf := st.wantHeaders() + if hf.HeadersEnded() { + t.Fatal("got unwanted END_HEADERS flag") + } + n := 0 + for { + n++ + cf := st.wantContinuation() + if cf.HeadersEnded() { + break + } + } + if n < 5 { + t.Errorf("Only got %d CONTINUATION frames; expected 5+ (currently 6)", n) + } + }) +} + +// This previously crashed (reported by Mathieu Lonjaret as observed +// while using Camlistore) because we got a DATA frame from the client +// after the handler exited and our logic at the time was wrong, +// keeping a stream in the map in stateClosed, which tickled an +// invariant check later when we tried to remove that stream (via +// defer sc.closeAllStreamsOnConnClose) when the serverConn serve loop +// ended. +func TestServer_NoCrash_HandlerClose_Then_ClientClose(t *testing.T) { + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + // nothing + return nil + }, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeader(), + EndStream: false, // DATA is coming + EndHeaders: true, + }) + hf := st.wantHeaders() + if !hf.HeadersEnded() || !hf.StreamEnded() { + t.Fatalf("want END_HEADERS+END_STREAM, got %v", hf) + } + + // Sent when the a Handler closes while a client has + // indicated it's still sending DATA: + st.wantRSTStream(1, ErrCodeNo) + + // Now the handler has ended, so it's ended its + // stream, but the client hasn't closed its side + // (stateClosedLocal). So send more data and verify + // it doesn't crash with an internal invariant panic, like + // it did before. + st.writeData(1, true, []byte("foo")) + + // Get our flow control bytes back, since the handler didn't get them. + st.wantWindowUpdate(0, uint32(len("foo"))) + + // Sent after a peer sends data anyway (admittedly the + // previous RST_STREAM might've still been in-flight), + // but they'll get the more friendly 'cancel' code + // first. + st.wantRSTStream(1, ErrCodeStreamClosed) + + // Set up a bunch of machinery to record the panic we saw + // previously. + var ( + panMu sync.Mutex + panicVal interface{} + ) + + testHookOnPanicMu.Lock() + testHookOnPanic = func(sc *serverConn, pv interface{}) bool { + panMu.Lock() + panicVal = pv + panMu.Unlock() + return true + } + testHookOnPanicMu.Unlock() + + // Now force the serve loop to end, via closing the connection. + st.cc.Close() + select { + case <-st.sc.doneServing: + // Loop has exited. + panMu.Lock() + got := panicVal + panMu.Unlock() + if got != nil { + t.Errorf("Got panic: %v", got) + } + case <-time.After(5 * time.Second): + t.Error("timeout") + } + }) +} + +func TestServer_Rejects_TLS10(t *testing.T) { testRejectTLS(t, tls.VersionTLS10) } +func TestServer_Rejects_TLS11(t *testing.T) { testRejectTLS(t, tls.VersionTLS11) } + +func testRejectTLS(t *testing.T, max uint16) { + st := newServerTester(t, nil, func(c *tls.Config) { + c.MaxVersion = max + }) + defer st.Close() + gf := st.wantGoAway() + if got, want := gf.ErrCode, ErrCodeInadequateSecurity; got != want { + t.Errorf("Got error code %v; want %v", got, want) + } +} + +func TestServer_Rejects_TLSBadCipher(t *testing.T) { + st := newServerTester(t, nil, func(c *tls.Config) { + // Only list bad ones: + c.CipherSuites = []uint16{ + tls.TLS_RSA_WITH_RC4_128_SHA, + tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA, + tls.TLS_RSA_WITH_AES_128_CBC_SHA, + tls.TLS_RSA_WITH_AES_256_CBC_SHA, + tls.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, + tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, + tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, + tls.TLS_ECDHE_RSA_WITH_RC4_128_SHA, + tls.TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, + tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, + tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, + cipher_TLS_RSA_WITH_AES_128_CBC_SHA256, + } + }) + defer st.Close() + gf := st.wantGoAway() + if got, want := gf.ErrCode, ErrCodeInadequateSecurity; got != want { + t.Errorf("Got error code %v; want %v", got, want) + } +} + +func TestServer_Advertises_Common_Cipher(t *testing.T) { + const requiredSuite = tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 + st := newServerTester(t, nil, func(c *tls.Config) { + // Have the client only support the one required by the spec. + c.CipherSuites = []uint16{requiredSuite} + }, func(ts *httptest.Server) { + var srv *http.Server = ts.Config + // Have the server configured with no specific cipher suites. + // This tests that Go's defaults include the required one. + srv.TLSConfig = nil + }) + defer st.Close() + st.greet() +} + +func (st *serverTester) onHeaderField(f hpack.HeaderField) { + if f.Name == "date" { + return + } + st.decodedHeaders = append(st.decodedHeaders, [2]string{f.Name, f.Value}) +} + +func (st *serverTester) decodeHeader(headerBlock []byte) (pairs [][2]string) { + st.decodedHeaders = nil + if _, err := st.hpackDec.Write(headerBlock); err != nil { + st.t.Fatalf("hpack decoding error: %v", err) + } + if err := st.hpackDec.Close(); err != nil { + st.t.Fatalf("hpack decoding error: %v", err) + } + return st.decodedHeaders +} + +// testServerResponse sets up an idle HTTP/2 connection. The client function should +// write a single request that must be handled by the handler. This waits up to 5s +// for client to return, then up to an additional 2s for the handler to return. +func testServerResponse(t testing.TB, + handler func(http.ResponseWriter, *http.Request) error, + client func(*serverTester), +) { + errc := make(chan error, 1) + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + if r.Body == nil { + t.Fatal("nil Body") + } + errc <- handler(w, r) + }) + defer st.Close() + + donec := make(chan bool) + go func() { + defer close(donec) + st.greet() + client(st) + }() + + select { + case <-donec: + case <-time.After(5 * time.Second): + t.Fatal("timeout in client") + } + + select { + case err := <-errc: + if err != nil { + t.Fatalf("Error in handler: %v", err) + } + case <-time.After(2 * time.Second): + t.Fatal("timeout in handler") + } +} + +// readBodyHandler returns an http Handler func that reads len(want) +// bytes from r.Body and fails t if the contents read were not +// the value of want. +func readBodyHandler(t *testing.T, want string) func(w http.ResponseWriter, r *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + buf := make([]byte, len(want)) + _, err := io.ReadFull(r.Body, buf) + if err != nil { + t.Error(err) + return + } + if string(buf) != want { + t.Errorf("read %q; want %q", buf, want) + } + } +} + +// TestServerWithCurl currently fails, hence the LenientCipherSuites test. See: +// https://github.com/tatsuhiro-t/nghttp2/issues/140 & +// http://sourceforge.net/p/curl/bugs/1472/ +func TestServerWithCurl(t *testing.T) { testServerWithCurl(t, false) } +func TestServerWithCurl_LenientCipherSuites(t *testing.T) { testServerWithCurl(t, true) } + +func testServerWithCurl(t *testing.T, permitProhibitedCipherSuites bool) { + if runtime.GOOS != "linux" { + t.Skip("skipping Docker test when not on Linux; requires --net which won't work with boot2docker anyway") + } + if testing.Short() { + t.Skip("skipping curl test in short mode") + } + requireCurl(t) + var gotConn int32 + testHookOnConn = func() { atomic.StoreInt32(&gotConn, 1) } + + const msg = "Hello from curl!\n" + ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Foo", "Bar") + w.Header().Set("Client-Proto", r.Proto) + io.WriteString(w, msg) + })) + ConfigureServer(ts.Config, &Server{ + PermitProhibitedCipherSuites: permitProhibitedCipherSuites, + }) + ts.TLS = ts.Config.TLSConfig // the httptest.Server has its own copy of this TLS config + ts.StartTLS() + defer ts.Close() + + t.Logf("Running test server for curl to hit at: %s", ts.URL) + container := curl(t, "--silent", "--http2", "--insecure", "-v", ts.URL) + defer kill(container) + resc := make(chan interface{}, 1) + go func() { + res, err := dockerLogs(container) + if err != nil { + resc <- err + } else { + resc <- res + } + }() + select { + case res := <-resc: + if err, ok := res.(error); ok { + t.Fatal(err) + } + body := string(res.([]byte)) + // Search for both "key: value" and "key:value", since curl changed their format + // Our Dockerfile contains the latest version (no space), but just in case people + // didn't rebuild, check both. + if !strings.Contains(body, "foo: Bar") && !strings.Contains(body, "foo:Bar") { + t.Errorf("didn't see foo: Bar header") + t.Logf("Got: %s", body) + } + if !strings.Contains(body, "client-proto: HTTP/2") && !strings.Contains(body, "client-proto:HTTP/2") { + t.Errorf("didn't see client-proto: HTTP/2 header") + t.Logf("Got: %s", res) + } + if !strings.Contains(string(res.([]byte)), msg) { + t.Errorf("didn't see %q content", msg) + t.Logf("Got: %s", res) + } + case <-time.After(3 * time.Second): + t.Errorf("timeout waiting for curl") + } + + if atomic.LoadInt32(&gotConn) == 0 { + t.Error("never saw an http2 connection") + } +} + +var doh2load = flag.Bool("h2load", false, "Run h2load test") + +func TestServerWithH2Load(t *testing.T) { + if !*doh2load { + t.Skip("Skipping without --h2load flag.") + } + if runtime.GOOS != "linux" { + t.Skip("skipping Docker test when not on Linux; requires --net which won't work with boot2docker anyway") + } + requireH2load(t) + + msg := strings.Repeat("Hello, h2load!\n", 5000) + ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + io.WriteString(w, msg) + w.(http.Flusher).Flush() + io.WriteString(w, msg) + })) + ts.StartTLS() + defer ts.Close() + + cmd := exec.Command("docker", "run", "--net=host", "--entrypoint=/usr/local/bin/h2load", "gohttp2/curl", + "-n100000", "-c100", "-m100", ts.URL) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + if err := cmd.Run(); err != nil { + t.Fatal(err) + } +} + +// Issue 12843 +func TestServerDoS_MaxHeaderListSize(t *testing.T) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {}) + defer st.Close() + + // shake hands + frameSize := defaultMaxReadFrameSize + var advHeaderListSize *uint32 + st.greetAndCheckSettings(func(s Setting) error { + switch s.ID { + case SettingMaxFrameSize: + if s.Val < minMaxFrameSize { + frameSize = minMaxFrameSize + } else if s.Val > maxFrameSize { + frameSize = maxFrameSize + } else { + frameSize = int(s.Val) + } + case SettingMaxHeaderListSize: + advHeaderListSize = &s.Val + } + return nil + }) + + if advHeaderListSize == nil { + t.Errorf("server didn't advertise a max header list size") + } else if *advHeaderListSize == 0 { + t.Errorf("server advertised a max header list size of 0") + } + + st.encodeHeaderField(":method", "GET") + st.encodeHeaderField(":path", "/") + st.encodeHeaderField(":scheme", "https") + cookie := strings.Repeat("*", 4058) + st.encodeHeaderField("cookie", cookie) + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.headerBuf.Bytes(), + EndStream: true, + EndHeaders: false, + }) + + // Capture the short encoding of a duplicate ~4K cookie, now + // that we've already sent it once. + st.headerBuf.Reset() + st.encodeHeaderField("cookie", cookie) + + // Now send 1MB of it. + const size = 1 << 20 + b := bytes.Repeat(st.headerBuf.Bytes(), size/st.headerBuf.Len()) + for len(b) > 0 { + chunk := b + if len(chunk) > frameSize { + chunk = chunk[:frameSize] + } + b = b[len(chunk):] + st.fr.WriteContinuation(1, len(b) == 0, chunk) + } + + h := st.wantHeaders() + if !h.HeadersEnded() { + t.Fatalf("Got HEADERS without END_HEADERS set: %v", h) + } + headers := st.decodeHeader(h.HeaderBlockFragment()) + want := [][2]string{ + {":status", "431"}, + {"content-type", "text/html; charset=utf-8"}, + {"content-length", "63"}, + } + if !reflect.DeepEqual(headers, want) { + t.Errorf("Headers mismatch.\n got: %q\nwant: %q\n", headers, want) + } +} + +func TestCompressionErrorOnWrite(t *testing.T) { + const maxStrLen = 8 << 10 + var serverConfig *http.Server + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + // No response body. + }, func(ts *httptest.Server) { + serverConfig = ts.Config + serverConfig.MaxHeaderBytes = maxStrLen + }) + st.addLogFilter("connection error: COMPRESSION_ERROR") + defer st.Close() + st.greet() + + maxAllowed := st.sc.framer.maxHeaderStringLen() + + // Crank this up, now that we have a conn connected with the + // hpack.Decoder's max string length set has been initialized + // from the earlier low ~8K value. We want this higher so don't + // hit the max header list size. We only want to test hitting + // the max string size. + serverConfig.MaxHeaderBytes = 1 << 20 + + // First a request with a header that's exactly the max allowed size + // for the hpack compression. It's still too long for the header list + // size, so we'll get the 431 error, but that keeps the compression + // context still valid. + hbf := st.encodeHeader("foo", strings.Repeat("a", maxAllowed)) + + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: hbf, + EndStream: true, + EndHeaders: true, + }) + h := st.wantHeaders() + if !h.HeadersEnded() { + t.Fatalf("Got HEADERS without END_HEADERS set: %v", h) + } + headers := st.decodeHeader(h.HeaderBlockFragment()) + want := [][2]string{ + {":status", "431"}, + {"content-type", "text/html; charset=utf-8"}, + {"content-length", "63"}, + } + if !reflect.DeepEqual(headers, want) { + t.Errorf("Headers mismatch.\n got: %q\nwant: %q\n", headers, want) + } + df := st.wantData() + if !strings.Contains(string(df.Data()), "HTTP Error 431") { + t.Errorf("Unexpected data body: %q", df.Data()) + } + if !df.StreamEnded() { + t.Fatalf("expect data stream end") + } + + // And now send one that's just one byte too big. + hbf = st.encodeHeader("bar", strings.Repeat("b", maxAllowed+1)) + st.writeHeaders(HeadersFrameParam{ + StreamID: 3, + BlockFragment: hbf, + EndStream: true, + EndHeaders: true, + }) + ga := st.wantGoAway() + if ga.ErrCode != ErrCodeCompression { + t.Errorf("GOAWAY err = %v; want ErrCodeCompression", ga.ErrCode) + } +} + +func TestCompressionErrorOnClose(t *testing.T) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + // No response body. + }) + st.addLogFilter("connection error: COMPRESSION_ERROR") + defer st.Close() + st.greet() + + hbf := st.encodeHeader("foo", "bar") + hbf = hbf[:len(hbf)-1] // truncate one byte from the end, so hpack.Decoder.Close fails. + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: hbf, + EndStream: true, + EndHeaders: true, + }) + ga := st.wantGoAway() + if ga.ErrCode != ErrCodeCompression { + t.Errorf("GOAWAY err = %v; want ErrCodeCompression", ga.ErrCode) + } +} + +// test that a server handler can read trailers from a client +func TestServerReadsTrailers(t *testing.T) { + const testBody = "some test body" + writeReq := func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader("trailer", "Foo, Bar", "trailer", "Baz"), + EndStream: false, + EndHeaders: true, + }) + st.writeData(1, false, []byte(testBody)) + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeaderRaw( + "foo", "foov", + "bar", "barv", + "baz", "bazv", + "surprise", "wasn't declared; shouldn't show up", + ), + EndStream: true, + EndHeaders: true, + }) + } + checkReq := func(r *http.Request) { + wantTrailer := http.Header{ + "Foo": nil, + "Bar": nil, + "Baz": nil, + } + if !reflect.DeepEqual(r.Trailer, wantTrailer) { + t.Errorf("initial Trailer = %v; want %v", r.Trailer, wantTrailer) + } + slurp, err := ioutil.ReadAll(r.Body) + if string(slurp) != testBody { + t.Errorf("read body %q; want %q", slurp, testBody) + } + if err != nil { + t.Fatalf("Body slurp: %v", err) + } + wantTrailerAfter := http.Header{ + "Foo": {"foov"}, + "Bar": {"barv"}, + "Baz": {"bazv"}, + } + if !reflect.DeepEqual(r.Trailer, wantTrailerAfter) { + t.Errorf("final Trailer = %v; want %v", r.Trailer, wantTrailerAfter) + } + } + testServerRequest(t, writeReq, checkReq) +} + +// test that a server handler can send trailers +func TestServerWritesTrailers_WithFlush(t *testing.T) { testServerWritesTrailers(t, true) } +func TestServerWritesTrailers_WithoutFlush(t *testing.T) { testServerWritesTrailers(t, false) } + +func testServerWritesTrailers(t *testing.T, withFlush bool) { + // See https://httpwg.github.io/specs/rfc7540.html#rfc.section.8.1.3 + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + w.Header().Set("Trailer", "Server-Trailer-A, Server-Trailer-B") + w.Header().Add("Trailer", "Server-Trailer-C") + w.Header().Add("Trailer", "Transfer-Encoding, Content-Length, Trailer") // filtered + + // Regular headers: + w.Header().Set("Foo", "Bar") + w.Header().Set("Content-Length", "5") // len("Hello") + + io.WriteString(w, "Hello") + if withFlush { + w.(http.Flusher).Flush() + } + w.Header().Set("Server-Trailer-A", "valuea") + w.Header().Set("Server-Trailer-C", "valuec") // skipping B + // After a flush, random keys like Server-Surprise shouldn't show up: + w.Header().Set("Server-Surpise", "surprise! this isn't predeclared!") + // But we do permit promoting keys to trailers after a + // flush if they start with the magic + // otherwise-invalid "Trailer:" prefix: + w.Header().Set("Trailer:Post-Header-Trailer", "hi1") + w.Header().Set("Trailer:post-header-trailer2", "hi2") + w.Header().Set("Trailer:Range", "invalid") + w.Header().Set("Trailer:Foo\x01Bogus", "invalid") + w.Header().Set("Transfer-Encoding", "should not be included; Forbidden by RFC 7230 4.1.2") + w.Header().Set("Content-Length", "should not be included; Forbidden by RFC 7230 4.1.2") + w.Header().Set("Trailer", "should not be included; Forbidden by RFC 7230 4.1.2") + return nil + }, func(st *serverTester) { + getSlash(st) + hf := st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("response HEADERS had END_STREAM") + } + if !hf.HeadersEnded() { + t.Fatal("response HEADERS didn't have END_HEADERS") + } + goth := st.decodeHeader(hf.HeaderBlockFragment()) + wanth := [][2]string{ + {":status", "200"}, + {"foo", "Bar"}, + {"trailer", "Server-Trailer-A, Server-Trailer-B"}, + {"trailer", "Server-Trailer-C"}, + {"trailer", "Transfer-Encoding, Content-Length, Trailer"}, + {"content-type", "text/plain; charset=utf-8"}, + {"content-length", "5"}, + {"x-content-type-options", "nosniff"}, + } + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Header mismatch.\n got: %v\nwant: %v", goth, wanth) + } + df := st.wantData() + if string(df.Data()) != "Hello" { + t.Fatalf("Client read %q; want Hello", df.Data()) + } + if df.StreamEnded() { + t.Fatalf("data frame had STREAM_ENDED") + } + tf := st.wantHeaders() // for the trailers + if !tf.StreamEnded() { + t.Fatalf("trailers HEADERS lacked END_STREAM") + } + if !tf.HeadersEnded() { + t.Fatalf("trailers HEADERS lacked END_HEADERS") + } + wanth = [][2]string{ + {"post-header-trailer", "hi1"}, + {"post-header-trailer2", "hi2"}, + {"server-trailer-a", "valuea"}, + {"server-trailer-c", "valuec"}, + } + goth = st.decodeHeader(tf.HeaderBlockFragment()) + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Header mismatch.\n got: %v\nwant: %v", goth, wanth) + } + }) +} + +// validate transmitted header field names & values +// golang.org/issue/14048 +func TestServerDoesntWriteInvalidHeaders(t *testing.T) { + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + w.Header().Add("OK1", "x") + w.Header().Add("Bad:Colon", "x") // colon (non-token byte) in key + w.Header().Add("Bad1\x00", "x") // null in key + w.Header().Add("Bad2", "x\x00y") // null in value + return nil + }, func(st *serverTester) { + getSlash(st) + hf := st.wantHeaders() + if !hf.StreamEnded() { + t.Error("response HEADERS lacked END_STREAM") + } + if !hf.HeadersEnded() { + t.Fatal("response HEADERS didn't have END_HEADERS") + } + goth := st.decodeHeader(hf.HeaderBlockFragment()) + wanth := [][2]string{ + {":status", "200"}, + {"ok1", "x"}, + {"content-length", "0"}, + } + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Header mismatch.\n got: %v\nwant: %v", goth, wanth) + } + }) +} + +func BenchmarkServerGets(b *testing.B) { + defer disableGoroutineTracking()() + b.ReportAllocs() + + const msg = "Hello, world" + st := newServerTester(b, func(w http.ResponseWriter, r *http.Request) { + io.WriteString(w, msg) + }) + defer st.Close() + st.greet() + + // Give the server quota to reply. (plus it has the 64KB) + if err := st.fr.WriteWindowUpdate(0, uint32(b.N*len(msg))); err != nil { + b.Fatal(err) + } + + for i := 0; i < b.N; i++ { + id := 1 + uint32(i)*2 + st.writeHeaders(HeadersFrameParam{ + StreamID: id, + BlockFragment: st.encodeHeader(), + EndStream: true, + EndHeaders: true, + }) + st.wantHeaders() + df := st.wantData() + if !df.StreamEnded() { + b.Fatalf("DATA didn't have END_STREAM; got %v", df) + } + } +} + +func BenchmarkServerPosts(b *testing.B) { + defer disableGoroutineTracking()() + b.ReportAllocs() + + const msg = "Hello, world" + st := newServerTester(b, func(w http.ResponseWriter, r *http.Request) { + // Consume the (empty) body from th peer before replying, otherwise + // the server will sometimes (depending on scheduling) send the peer a + // a RST_STREAM with the CANCEL error code. + if n, err := io.Copy(ioutil.Discard, r.Body); n != 0 || err != nil { + b.Errorf("Copy error; got %v, %v; want 0, nil", n, err) + } + io.WriteString(w, msg) + }) + defer st.Close() + st.greet() + + // Give the server quota to reply. (plus it has the 64KB) + if err := st.fr.WriteWindowUpdate(0, uint32(b.N*len(msg))); err != nil { + b.Fatal(err) + } + + for i := 0; i < b.N; i++ { + id := 1 + uint32(i)*2 + st.writeHeaders(HeadersFrameParam{ + StreamID: id, + BlockFragment: st.encodeHeader(":method", "POST"), + EndStream: false, + EndHeaders: true, + }) + st.writeData(id, true, nil) + st.wantHeaders() + df := st.wantData() + if !df.StreamEnded() { + b.Fatalf("DATA didn't have END_STREAM; got %v", df) + } + } +} + +// Send a stream of messages from server to client in separate data frames. +// Brings up performance issues seen in long streams. +// Created to show problem in go issue #18502 +func BenchmarkServerToClientStreamDefaultOptions(b *testing.B) { + benchmarkServerToClientStream(b) +} + +// Justification for Change-Id: Iad93420ef6c3918f54249d867098f1dadfa324d8 +// Expect to see memory/alloc reduction by opting in to Frame reuse with the Framer. +func BenchmarkServerToClientStreamReuseFrames(b *testing.B) { + benchmarkServerToClientStream(b, optFramerReuseFrames) +} + +func benchmarkServerToClientStream(b *testing.B, newServerOpts ...interface{}) { + defer disableGoroutineTracking()() + b.ReportAllocs() + const msgLen = 1 + // default window size + const windowSize = 1<<16 - 1 + + // next message to send from the server and for the client to expect + nextMsg := func(i int) []byte { + msg := make([]byte, msgLen) + msg[0] = byte(i) + if len(msg) != msgLen { + panic("invalid test setup msg length") + } + return msg + } + + st := newServerTester(b, func(w http.ResponseWriter, r *http.Request) { + // Consume the (empty) body from th peer before replying, otherwise + // the server will sometimes (depending on scheduling) send the peer a + // a RST_STREAM with the CANCEL error code. + if n, err := io.Copy(ioutil.Discard, r.Body); n != 0 || err != nil { + b.Errorf("Copy error; got %v, %v; want 0, nil", n, err) + } + for i := 0; i < b.N; i += 1 { + w.Write(nextMsg(i)) + w.(http.Flusher).Flush() + } + }, newServerOpts...) + defer st.Close() + st.greet() + + const id = uint32(1) + + st.writeHeaders(HeadersFrameParam{ + StreamID: id, + BlockFragment: st.encodeHeader(":method", "POST"), + EndStream: false, + EndHeaders: true, + }) + + st.writeData(id, true, nil) + st.wantHeaders() + + var pendingWindowUpdate = uint32(0) + + for i := 0; i < b.N; i += 1 { + expected := nextMsg(i) + df := st.wantData() + if bytes.Compare(expected, df.data) != 0 { + b.Fatalf("Bad message received; want %v; got %v", expected, df.data) + } + // try to send infrequent but large window updates so they don't overwhelm the test + pendingWindowUpdate += uint32(len(df.data)) + if pendingWindowUpdate >= windowSize/2 { + if err := st.fr.WriteWindowUpdate(0, pendingWindowUpdate); err != nil { + b.Fatal(err) + } + if err := st.fr.WriteWindowUpdate(id, pendingWindowUpdate); err != nil { + b.Fatal(err) + } + pendingWindowUpdate = 0 + } + } + df := st.wantData() + if !df.StreamEnded() { + b.Fatalf("DATA didn't have END_STREAM; got %v", df) + } +} + +// go-fuzz bug, originally reported at https://github.com/bradfitz/http2/issues/53 +// Verify we don't hang. +func TestIssue53(t *testing.T) { + const data = "PRI * HTTP/2.0\r\n\r\nSM" + + "\r\n\r\n\x00\x00\x00\x01\ainfinfin\ad" + s := &http.Server{ + ErrorLog: log.New(io.MultiWriter(stderrv(), twriter{t: t}), "", log.LstdFlags), + Handler: http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + w.Write([]byte("hello")) + }), + } + s2 := &Server{ + MaxReadFrameSize: 1 << 16, + PermitProhibitedCipherSuites: true, + } + c := &issue53Conn{[]byte(data), false, false} + s2.ServeConn(c, &ServeConnOpts{BaseConfig: s}) + if !c.closed { + t.Fatal("connection is not closed") + } +} + +type issue53Conn struct { + data []byte + closed bool + written bool +} + +func (c *issue53Conn) Read(b []byte) (n int, err error) { + if len(c.data) == 0 { + return 0, io.EOF + } + n = copy(b, c.data) + c.data = c.data[n:] + return +} + +func (c *issue53Conn) Write(b []byte) (n int, err error) { + c.written = true + return len(b), nil +} + +func (c *issue53Conn) Close() error { + c.closed = true + return nil +} + +func (c *issue53Conn) LocalAddr() net.Addr { + return &net.TCPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 49706} +} +func (c *issue53Conn) RemoteAddr() net.Addr { + return &net.TCPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 49706} +} +func (c *issue53Conn) SetDeadline(t time.Time) error { return nil } +func (c *issue53Conn) SetReadDeadline(t time.Time) error { return nil } +func (c *issue53Conn) SetWriteDeadline(t time.Time) error { return nil } + +// golang.org/issue/12895 +func TestConfigureServer(t *testing.T) { + tests := []struct { + name string + tlsConfig *tls.Config + wantErr string + }{ + { + name: "empty server", + }, + { + name: "just the required cipher suite", + tlsConfig: &tls.Config{ + CipherSuites: []uint16{tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256}, + }, + }, + { + name: "just the alternative required cipher suite", + tlsConfig: &tls.Config{ + CipherSuites: []uint16{tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256}, + }, + }, + { + name: "missing required cipher suite", + tlsConfig: &tls.Config{ + CipherSuites: []uint16{tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384}, + }, + wantErr: "is missing an HTTP/2-required AES_128_GCM_SHA256 cipher.", + }, + { + name: "required after bad", + tlsConfig: &tls.Config{ + CipherSuites: []uint16{tls.TLS_RSA_WITH_RC4_128_SHA, tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256}, + }, + wantErr: "contains an HTTP/2-approved cipher suite (0xc02f), but it comes after", + }, + { + name: "bad after required", + tlsConfig: &tls.Config{ + CipherSuites: []uint16{tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, tls.TLS_RSA_WITH_RC4_128_SHA}, + }, + }, + } + for _, tt := range tests { + srv := &http.Server{TLSConfig: tt.tlsConfig} + err := ConfigureServer(srv, nil) + if (err != nil) != (tt.wantErr != "") { + if tt.wantErr != "" { + t.Errorf("%s: success, but want error", tt.name) + } else { + t.Errorf("%s: unexpected error: %v", tt.name, err) + } + } + if err != nil && tt.wantErr != "" && !strings.Contains(err.Error(), tt.wantErr) { + t.Errorf("%s: err = %v; want substring %q", tt.name, err, tt.wantErr) + } + if err == nil && !srv.TLSConfig.PreferServerCipherSuites { + t.Errorf("%s: PreferServerCipherSuite is false; want true", tt.name) + } + } +} + +func TestServerRejectHeadWithBody(t *testing.T) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + // No response body. + }) + defer st.Close() + st.greet() + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader(":method", "HEAD"), + EndStream: false, // what we're testing, a bogus HEAD request with body + EndHeaders: true, + }) + st.wantRSTStream(1, ErrCodeProtocol) +} + +func TestServerNoAutoContentLengthOnHead(t *testing.T) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + // No response body. (or smaller than one frame) + }) + defer st.Close() + st.greet() + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader(":method", "HEAD"), + EndStream: true, + EndHeaders: true, + }) + h := st.wantHeaders() + headers := st.decodeHeader(h.HeaderBlockFragment()) + want := [][2]string{ + {":status", "200"}, + } + if !reflect.DeepEqual(headers, want) { + t.Errorf("Headers mismatch.\n got: %q\nwant: %q\n", headers, want) + } +} + +// golang.org/issue/13495 +func TestServerNoDuplicateContentType(t *testing.T) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + w.Header()["Content-Type"] = []string{""} + fmt.Fprintf(w, "hi") + }) + defer st.Close() + st.greet() + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeader(), + EndStream: true, + EndHeaders: true, + }) + h := st.wantHeaders() + headers := st.decodeHeader(h.HeaderBlockFragment()) + want := [][2]string{ + {":status", "200"}, + {"content-type", ""}, + {"content-length", "41"}, + {"x-content-type-options", "nosniff"}, + } + if !reflect.DeepEqual(headers, want) { + t.Errorf("Headers mismatch.\n got: %q\nwant: %q\n", headers, want) + } +} + +func disableGoroutineTracking() (restore func()) { + old := DebugGoroutines + DebugGoroutines = false + return func() { DebugGoroutines = old } +} + +func BenchmarkServer_GetRequest(b *testing.B) { + defer disableGoroutineTracking()() + b.ReportAllocs() + const msg = "Hello, world." + st := newServerTester(b, func(w http.ResponseWriter, r *http.Request) { + n, err := io.Copy(ioutil.Discard, r.Body) + if err != nil || n > 0 { + b.Errorf("Read %d bytes, error %v; want 0 bytes.", n, err) + } + io.WriteString(w, msg) + }) + defer st.Close() + + st.greet() + // Give the server quota to reply. (plus it has the 64KB) + if err := st.fr.WriteWindowUpdate(0, uint32(b.N*len(msg))); err != nil { + b.Fatal(err) + } + hbf := st.encodeHeader(":method", "GET") + for i := 0; i < b.N; i++ { + streamID := uint32(1 + 2*i) + st.writeHeaders(HeadersFrameParam{ + StreamID: streamID, + BlockFragment: hbf, + EndStream: true, + EndHeaders: true, + }) + st.wantHeaders() + st.wantData() + } +} + +func BenchmarkServer_PostRequest(b *testing.B) { + defer disableGoroutineTracking()() + b.ReportAllocs() + const msg = "Hello, world." + st := newServerTester(b, func(w http.ResponseWriter, r *http.Request) { + n, err := io.Copy(ioutil.Discard, r.Body) + if err != nil || n > 0 { + b.Errorf("Read %d bytes, error %v; want 0 bytes.", n, err) + } + io.WriteString(w, msg) + }) + defer st.Close() + st.greet() + // Give the server quota to reply. (plus it has the 64KB) + if err := st.fr.WriteWindowUpdate(0, uint32(b.N*len(msg))); err != nil { + b.Fatal(err) + } + hbf := st.encodeHeader(":method", "POST") + for i := 0; i < b.N; i++ { + streamID := uint32(1 + 2*i) + st.writeHeaders(HeadersFrameParam{ + StreamID: streamID, + BlockFragment: hbf, + EndStream: false, + EndHeaders: true, + }) + st.writeData(streamID, true, nil) + st.wantHeaders() + st.wantData() + } +} + +type connStateConn struct { + net.Conn + cs tls.ConnectionState +} + +func (c connStateConn) ConnectionState() tls.ConnectionState { return c.cs } + +// golang.org/issue/12737 -- handle any net.Conn, not just +// *tls.Conn. +func TestServerHandleCustomConn(t *testing.T) { + var s Server + c1, c2 := net.Pipe() + clientDone := make(chan struct{}) + handlerDone := make(chan struct{}) + var req *http.Request + go func() { + defer close(clientDone) + defer c2.Close() + fr := NewFramer(c2, c2) + io.WriteString(c2, ClientPreface) + fr.WriteSettings() + fr.WriteSettingsAck() + f, err := fr.ReadFrame() + if err != nil { + t.Error(err) + return + } + if sf, ok := f.(*SettingsFrame); !ok || sf.IsAck() { + t.Errorf("Got %v; want non-ACK SettingsFrame", summarizeFrame(f)) + return + } + f, err = fr.ReadFrame() + if err != nil { + t.Error(err) + return + } + if sf, ok := f.(*SettingsFrame); !ok || !sf.IsAck() { + t.Errorf("Got %v; want ACK SettingsFrame", summarizeFrame(f)) + return + } + var henc hpackEncoder + fr.WriteHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: henc.encodeHeaderRaw(t, ":method", "GET", ":path", "/", ":scheme", "https", ":authority", "foo.com"), + EndStream: true, + EndHeaders: true, + }) + go io.Copy(ioutil.Discard, c2) + <-handlerDone + }() + const testString = "my custom ConnectionState" + fakeConnState := tls.ConnectionState{ + ServerName: testString, + Version: tls.VersionTLS12, + CipherSuite: cipher_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, + } + go s.ServeConn(connStateConn{c1, fakeConnState}, &ServeConnOpts{ + BaseConfig: &http.Server{ + Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + defer close(handlerDone) + req = r + }), + }}) + select { + case <-clientDone: + case <-time.After(5 * time.Second): + t.Fatal("timeout waiting for handler") + } + if req.TLS == nil { + t.Fatalf("Request.TLS is nil. Got: %#v", req) + } + if req.TLS.ServerName != testString { + t.Fatalf("Request.TLS = %+v; want ServerName of %q", req.TLS, testString) + } +} + +// golang.org/issue/14214 +func TestServer_Rejects_ConnHeaders(t *testing.T) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + t.Error("should not get to Handler") + }) + defer st.Close() + st.greet() + st.bodylessReq1("connection", "foo") + hf := st.wantHeaders() + goth := st.decodeHeader(hf.HeaderBlockFragment()) + wanth := [][2]string{ + {":status", "400"}, + {"content-type", "text/plain; charset=utf-8"}, + {"x-content-type-options", "nosniff"}, + {"content-length", "51"}, + } + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Got headers %v; want %v", goth, wanth) + } +} + +type hpackEncoder struct { + enc *hpack.Encoder + buf bytes.Buffer +} + +func (he *hpackEncoder) encodeHeaderRaw(t *testing.T, headers ...string) []byte { + if len(headers)%2 == 1 { + panic("odd number of kv args") + } + he.buf.Reset() + if he.enc == nil { + he.enc = hpack.NewEncoder(&he.buf) + } + for len(headers) > 0 { + k, v := headers[0], headers[1] + err := he.enc.WriteField(hpack.HeaderField{Name: k, Value: v}) + if err != nil { + t.Fatalf("HPACK encoding error for %q/%q: %v", k, v, err) + } + headers = headers[2:] + } + return he.buf.Bytes() +} + +func TestCheckValidHTTP2Request(t *testing.T) { + tests := []struct { + h http.Header + want error + }{ + { + h: http.Header{"Te": {"trailers"}}, + want: nil, + }, + { + h: http.Header{"Te": {"trailers", "bogus"}}, + want: errors.New(`request header "TE" may only be "trailers" in HTTP/2`), + }, + { + h: http.Header{"Foo": {""}}, + want: nil, + }, + { + h: http.Header{"Connection": {""}}, + want: errors.New(`request header "Connection" is not valid in HTTP/2`), + }, + { + h: http.Header{"Proxy-Connection": {""}}, + want: errors.New(`request header "Proxy-Connection" is not valid in HTTP/2`), + }, + { + h: http.Header{"Keep-Alive": {""}}, + want: errors.New(`request header "Keep-Alive" is not valid in HTTP/2`), + }, + { + h: http.Header{"Upgrade": {""}}, + want: errors.New(`request header "Upgrade" is not valid in HTTP/2`), + }, + } + for i, tt := range tests { + got := checkValidHTTP2RequestHeaders(tt.h) + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("%d. checkValidHTTP2Request = %v; want %v", i, got, tt.want) + } + } +} + +// golang.org/issue/14030 +func TestExpect100ContinueAfterHandlerWrites(t *testing.T) { + const msg = "Hello" + const msg2 = "World" + + doRead := make(chan bool, 1) + defer close(doRead) // fallback cleanup + + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + io.WriteString(w, msg) + w.(http.Flusher).Flush() + + // Do a read, which might force a 100-continue status to be sent. + <-doRead + r.Body.Read(make([]byte, 10)) + + io.WriteString(w, msg2) + + }, optOnlyServer) + defer st.Close() + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + + req, _ := http.NewRequest("POST", st.ts.URL, io.LimitReader(neverEnding('A'), 2<<20)) + req.Header.Set("Expect", "100-continue") + + res, err := tr.RoundTrip(req) + if err != nil { + t.Fatal(err) + } + defer res.Body.Close() + + buf := make([]byte, len(msg)) + if _, err := io.ReadFull(res.Body, buf); err != nil { + t.Fatal(err) + } + if string(buf) != msg { + t.Fatalf("msg = %q; want %q", buf, msg) + } + + doRead <- true + + if _, err := io.ReadFull(res.Body, buf); err != nil { + t.Fatal(err) + } + if string(buf) != msg2 { + t.Fatalf("second msg = %q; want %q", buf, msg2) + } +} + +type funcReader func([]byte) (n int, err error) + +func (f funcReader) Read(p []byte) (n int, err error) { return f(p) } + +// golang.org/issue/16481 -- return flow control when streams close with unread data. +// (The Server version of the bug. See also TestUnreadFlowControlReturned_Transport) +func TestUnreadFlowControlReturned_Server(t *testing.T) { + unblock := make(chan bool, 1) + defer close(unblock) + + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + // Don't read the 16KB request body. Wait until the client's + // done sending it and then return. This should cause the Server + // to then return those 16KB of flow control to the client. + <-unblock + }, optOnlyServer) + defer st.Close() + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + + // This previously hung on the 4th iteration. + for i := 0; i < 6; i++ { + body := io.MultiReader( + io.LimitReader(neverEnding('A'), 16<<10), + funcReader(func([]byte) (n int, err error) { + unblock <- true + return 0, io.EOF + }), + ) + req, _ := http.NewRequest("POST", st.ts.URL, body) + res, err := tr.RoundTrip(req) + if err != nil { + t.Fatal(err) + } + res.Body.Close() + } + +} + +func TestServerIdleTimeout(t *testing.T) { + if testing.Short() { + t.Skip("skipping in short mode") + } + + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + }, func(h2s *Server) { + h2s.IdleTimeout = 500 * time.Millisecond + }) + defer st.Close() + + st.greet() + ga := st.wantGoAway() + if ga.ErrCode != ErrCodeNo { + t.Errorf("GOAWAY error = %v; want ErrCodeNo", ga.ErrCode) + } +} + +func TestServerIdleTimeout_AfterRequest(t *testing.T) { + if testing.Short() { + t.Skip("skipping in short mode") + } + const timeout = 250 * time.Millisecond + + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + time.Sleep(timeout * 2) + }, func(h2s *Server) { + h2s.IdleTimeout = timeout + }) + defer st.Close() + + st.greet() + + // Send a request which takes twice the timeout. Verifies the + // idle timeout doesn't fire while we're in a request: + st.bodylessReq1() + st.wantHeaders() + + // But the idle timeout should be rearmed after the request + // is done: + ga := st.wantGoAway() + if ga.ErrCode != ErrCodeNo { + t.Errorf("GOAWAY error = %v; want ErrCodeNo", ga.ErrCode) + } +} + +// grpc-go closes the Request.Body currently with a Read. +// Verify that it doesn't race. +// See https://github.com/grpc/grpc-go/pull/938 +func TestRequestBodyReadCloseRace(t *testing.T) { + for i := 0; i < 100; i++ { + body := &requestBody{ + pipe: &pipe{ + b: new(bytes.Buffer), + }, + } + body.pipe.CloseWithError(io.EOF) + + done := make(chan bool, 1) + buf := make([]byte, 10) + go func() { + time.Sleep(1 * time.Millisecond) + body.Close() + done <- true + }() + body.Read(buf) + <-done + } +} + +func TestIssue20704Race(t *testing.T) { + if testing.Short() && os.Getenv("GO_BUILDER_NAME") == "" { + t.Skip("skipping in short mode") + } + const ( + itemSize = 1 << 10 + itemCount = 100 + ) + + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + for i := 0; i < itemCount; i++ { + _, err := w.Write(make([]byte, itemSize)) + if err != nil { + return + } + } + }, optOnlyServer) + defer st.Close() + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + cl := &http.Client{Transport: tr} + + for i := 0; i < 1000; i++ { + resp, err := cl.Get(st.ts.URL) + if err != nil { + t.Fatal(err) + } + // Force a RST stream to the server by closing without + // reading the body: + resp.Body.Close() + } +} + +func TestServer_Rejects_TooSmall(t *testing.T) { + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + return nil + }, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader( + ":method", "POST", + "content-length", "4", + ), + EndStream: false, // to say DATA frames are coming + EndHeaders: true, + }) + st.writeData(1, true, []byte("12345")) + + st.wantRSTStream(1, ErrCodeProtocol) + }) +} diff --git a/api/vendor/golang.org/x/net/http2/testdata/draft-ietf-httpbis-http2.xml b/api/vendor/golang.org/x/net/http2/testdata/draft-ietf-httpbis-http2.xml new file mode 100644 index 0000000..31a84be --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/testdata/draft-ietf-httpbis-http2.xml @@ -0,0 +1,5021 @@ + + + + + + + + + + + + + + + + + + + Hypertext Transfer Protocol version 2 + + + Twist +
    + mbelshe@chromium.org +
    +
    + + + Google, Inc +
    + fenix@google.com +
    +
    + + + Mozilla +
    + + 331 E Evelyn Street + Mountain View + CA + 94041 + US + + martin.thomson@gmail.com +
    +
    + + + Applications + HTTPbis + HTTP + SPDY + Web + + + + This specification describes an optimized expression of the semantics of the Hypertext + Transfer Protocol (HTTP). HTTP/2 enables a more efficient use of network resources and a + reduced perception of latency by introducing header field compression and allowing multiple + concurrent messages on the same connection. It also introduces unsolicited push of + representations from servers to clients. + + + This specification is an alternative to, but does not obsolete, the HTTP/1.1 message syntax. + HTTP's existing semantics remain unchanged. + + + + + + Discussion of this draft takes place on the HTTPBIS working group mailing list + (ietf-http-wg@w3.org), which is archived at . + + + Working Group information can be found at ; that specific to HTTP/2 are at . + + + The changes in this draft are summarized in . + + + +
    + + +
    + + + The Hypertext Transfer Protocol (HTTP) is a wildly successful protocol. However, the + HTTP/1.1 message format () has + several characteristics that have a negative overall effect on application performance + today. + + + In particular, HTTP/1.0 allowed only one request to be outstanding at a time on a given + TCP connection. HTTP/1.1 added request pipelining, but this only partially addressed + request concurrency and still suffers from head-of-line blocking. Therefore, HTTP/1.1 + clients that need to make many requests typically use multiple connections to a server in + order to achieve concurrency and thereby reduce latency. + + + Furthermore, HTTP header fields are often repetitive and verbose, causing unnecessary + network traffic, as well as causing the initial TCP congestion + window to quickly fill. This can result in excessive latency when multiple requests are + made on a new TCP connection. + + + HTTP/2 addresses these issues by defining an optimized mapping of HTTP's semantics to an + underlying connection. Specifically, it allows interleaving of request and response + messages on the same connection and uses an efficient coding for HTTP header fields. It + also allows prioritization of requests, letting more important requests complete more + quickly, further improving performance. + + + The resulting protocol is more friendly to the network, because fewer TCP connections can + be used in comparison to HTTP/1.x. This means less competition with other flows, and + longer-lived connections, which in turn leads to better utilization of available network + capacity. + + + Finally, HTTP/2 also enables more efficient processing of messages through use of binary + message framing. + +
    + +
    + + HTTP/2 provides an optimized transport for HTTP semantics. HTTP/2 supports all of the core + features of HTTP/1.1, but aims to be more efficient in several ways. + + + The basic protocol unit in HTTP/2 is a frame. Each frame + type serves a different purpose. For example, HEADERS and + DATA frames form the basis of HTTP requests and + responses; other frame types like SETTINGS, + WINDOW_UPDATE, and PUSH_PROMISE are used in support of other + HTTP/2 features. + + + Multiplexing of requests is achieved by having each HTTP request-response exchange + associated with its own stream. Streams are largely + independent of each other, so a blocked or stalled request or response does not prevent + progress on other streams. + + + Flow control and prioritization ensure that it is possible to efficiently use multiplexed + streams. Flow control helps to ensure that only data that + can be used by a receiver is transmitted. Prioritization ensures that limited resources can be directed + to the most important streams first. + + + HTTP/2 adds a new interaction mode, whereby a server can push + responses to a client. Server push allows a server to speculatively send a client + data that the server anticipates the client will need, trading off some network usage + against a potential latency gain. The server does this by synthesizing a request, which it + sends as a PUSH_PROMISE frame. The server is then able to send a response to + the synthetic request on a separate stream. + + + Frames that contain HTTP header fields are compressed. + HTTP requests can be highly redundant, so compression can reduce the size of requests and + responses significantly. + + +
    + + The HTTP/2 specification is split into four parts: + + + Starting HTTP/2 covers how an HTTP/2 connection is + initiated. + + + The framing and streams layers describe the way HTTP/2 frames are + structured and formed into multiplexed streams. + + + Frame and error + definitions include details of the frame and error types used in HTTP/2. + + + HTTP mappings and additional + requirements describe how HTTP semantics are expressed using frames and + streams. + + + + + While some of the frame and stream layer concepts are isolated from HTTP, this + specification does not define a completely generic framing layer. The framing and streams + layers are tailored to the needs of the HTTP protocol and server push. + +
    + +
    + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD + NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as + described in RFC 2119. + + + All numeric values are in network byte order. Values are unsigned unless otherwise + indicated. Literal values are provided in decimal or hexadecimal as appropriate. + Hexadecimal literals are prefixed with 0x to distinguish them + from decimal literals. + + + The following terms are used: + + + The endpoint initiating the HTTP/2 connection. + + + A transport-layer connection between two endpoints. + + + An error that affects the entire HTTP/2 connection. + + + Either the client or server of the connection. + + + The smallest unit of communication within an HTTP/2 connection, consisting of a header + and a variable-length sequence of octets structured according to the frame type. + + + An endpoint. When discussing a particular endpoint, "peer" refers to the endpoint + that is remote to the primary subject of discussion. + + + An endpoint that is receiving frames. + + + An endpoint that is transmitting frames. + + + The endpoint which did not initiate the HTTP/2 connection. + + + A bi-directional flow of frames across a virtual channel within the HTTP/2 connection. + + + An error on the individual HTTP/2 stream. + + + + + Finally, the terms "gateway", "intermediary", "proxy", and "tunnel" are defined + in . + +
    +
    + +
    + + An HTTP/2 connection is an application layer protocol running on top of a TCP connection + (). The client is the TCP connection initiator. + + + HTTP/2 uses the same "http" and "https" URI schemes used by HTTP/1.1. HTTP/2 shares the same + default port numbers: 80 for "http" URIs and 443 for "https" URIs. As a result, + implementations processing requests for target resource URIs like http://example.org/foo or https://example.com/bar are required to first discover whether the + upstream server (the immediate peer to which the client wishes to establish a connection) + supports HTTP/2. + + + + The means by which support for HTTP/2 is determined is different for "http" and "https" + URIs. Discovery for "http" URIs is described in . Discovery + for "https" URIs is described in . + + +
    + + The protocol defined in this document has two identifiers. + + + + The string "h2" identifies the protocol where HTTP/2 uses TLS. This identifier is used in the TLS application layer protocol negotiation extension (ALPN) + field and any place that HTTP/2 over TLS is identified. + + + The "h2" string is serialized into an ALPN protocol identifier as the two octet + sequence: 0x68, 0x32. + + + + + The string "h2c" identifies the protocol where HTTP/2 is run over cleartext TCP. + This identifier is used in the HTTP/1.1 Upgrade header field and any place that + HTTP/2 over TCP is identified. + + + + + + Negotiating "h2" or "h2c" implies the use of the transport, security, framing and message + semantics described in this document. + + + RFC Editor's Note: please remove the remainder of this section prior to the + publication of a final version of this document. + + + Only implementations of the final, published RFC can identify themselves as "h2" or "h2c". + Until such an RFC exists, implementations MUST NOT identify themselves using these + strings. + + + Examples and text throughout the rest of this document use "h2" as a matter of + editorial convenience only. Implementations of draft versions MUST NOT identify using + this string. + + + Implementations of draft versions of the protocol MUST add the string "-" and the + corresponding draft number to the identifier. For example, draft-ietf-httpbis-http2-11 + over TLS is identified using the string "h2-11". + + + Non-compatible experiments that are based on these draft versions MUST append the string + "-" and an experiment name to the identifier. For example, an experimental implementation + of packet mood-based encoding based on draft-ietf-httpbis-http2-09 might identify itself + as "h2-09-emo". Note that any label MUST conform to the "token" syntax defined in + . Experimenters are + encouraged to coordinate their experiments on the ietf-http-wg@w3.org mailing list. + +
    + +
    + + A client that makes a request for an "http" URI without prior knowledge about support for + HTTP/2 uses the HTTP Upgrade mechanism (). The client makes an HTTP/1.1 request that includes an Upgrade + header field identifying HTTP/2 with the "h2c" token. The HTTP/1.1 request MUST include + exactly one HTTP2-Settings header field. + +
    + For example: + + +]]> +
    + + Requests that contain an entity body MUST be sent in their entirety before the client can + send HTTP/2 frames. This means that a large request entity can block the use of the + connection until it is completely sent. + + + If concurrency of an initial request with subsequent requests is important, an OPTIONS + request can be used to perform the upgrade to HTTP/2, at the cost of an additional + round-trip. + + + A server that does not support HTTP/2 can respond to the request as though the Upgrade + header field were absent: + +
    + +HTTP/1.1 200 OK +Content-Length: 243 +Content-Type: text/html + +... + +
    + + A server MUST ignore a "h2" token in an Upgrade header field. Presence of a token with + "h2" implies HTTP/2 over TLS, which is instead negotiated as described in . + + + A server that supports HTTP/2 can accept the upgrade with a 101 (Switching Protocols) + response. After the empty line that terminates the 101 response, the server can begin + sending HTTP/2 frames. These frames MUST include a response to the request that initiated + the Upgrade. + + +
    + + For example: + + +HTTP/1.1 101 Switching Protocols +Connection: Upgrade +Upgrade: h2c + +[ HTTP/2 connection ... + +
    + + The first HTTP/2 frame sent by the server is a SETTINGS frame () as the server connection preface (). Upon receiving the 101 response, the client sends a connection preface, which includes a + SETTINGS frame. + + + The HTTP/1.1 request that is sent prior to upgrade is assigned stream identifier 1 and is + assigned default priority values. Stream 1 is + implicitly half closed from the client toward the server, since the request is completed + as an HTTP/1.1 request. After commencing the HTTP/2 connection, stream 1 is used for the + response. + + +
    + + A request that upgrades from HTTP/1.1 to HTTP/2 MUST include exactly one HTTP2-Settings header field. The HTTP2-Settings header field is a connection-specific header field + that includes parameters that govern the HTTP/2 connection, provided in anticipation of + the server accepting the request to upgrade. + +
    + +
    + + A server MUST NOT upgrade the connection to HTTP/2 if this header field is not present, + or if more than one is present. A server MUST NOT send this header field. + + + + The content of the HTTP2-Settings header field is the + payload of a SETTINGS frame (), encoded as a + base64url string (that is, the URL- and filename-safe Base64 encoding described in , with any trailing '=' characters omitted). The + ABNF production for token68 is + defined in . + + + Since the upgrade is only intended to apply to the immediate connection, a client + sending HTTP2-Settings MUST also send HTTP2-Settings as a connection option in the Connection header field to prevent it from being forwarded + downstream. + + + A server decodes and interprets these values as it would any other + SETTINGS frame. Acknowledgement of the + SETTINGS parameters is not necessary, since a 101 response serves as implicit + acknowledgment. Providing these values in the Upgrade request gives a client an + opportunity to provide parameters prior to receiving any frames from the server. + +
    +
    + +
    + + A client that makes a request to an "https" URI uses TLS + with the application layer protocol negotiation extension. + + + HTTP/2 over TLS uses the "h2" application token. The "h2c" token MUST NOT be sent by a + client or selected by a server. + + + Once TLS negotiation is complete, both the client and the server send a connection preface. + +
    + +
    + + A client can learn that a particular server supports HTTP/2 by other means. For example, + describes a mechanism for advertising this capability. + + + A client MAY immediately send HTTP/2 frames to a server that is known to support HTTP/2, + after the connection preface; a server can + identify such a connection by the presence of the connection preface. This only affects + the establishment of HTTP/2 connections over cleartext TCP; implementations that support + HTTP/2 over TLS MUST use protocol negotiation in TLS. + + + Without additional information, prior support for HTTP/2 is not a strong signal that a + given server will support HTTP/2 for future connections. For example, it is possible for + server configurations to change, for configurations to differ between instances in + clustered servers, or for network conditions to change. + +
    + +
    + + Upon establishment of a TCP connection and determination that HTTP/2 will be used by both + peers, each endpoint MUST send a connection preface as a final confirmation and to + establish the initial SETTINGS parameters for the HTTP/2 connection. The client and + server each send a different connection preface. + + + The client connection preface starts with a sequence of 24 octets, which in hex notation + are: + +
    + +
    + + (the string PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n). This sequence + is followed by a SETTINGS frame (). The + SETTINGS frame MAY be empty. The client sends the client connection + preface immediately upon receipt of a 101 Switching Protocols response (indicating a + successful upgrade), or as the first application data octets of a TLS connection. If + starting an HTTP/2 connection with prior knowledge of server support for the protocol, the + client connection preface is sent upon connection establishment. + + + + + The client connection preface is selected so that a large proportion of HTTP/1.1 or + HTTP/1.0 servers and intermediaries do not attempt to process further frames. Note + that this does not address the concerns raised in . + + + + + The server connection preface consists of a potentially empty SETTINGS + frame () that MUST be the first frame the server sends in the + HTTP/2 connection. + + + The SETTINGS frames received from a peer as part of the connection preface + MUST be acknowledged (see ) after sending the connection + preface. + + + To avoid unnecessary latency, clients are permitted to send additional frames to the + server immediately after sending the client connection preface, without waiting to receive + the server connection preface. It is important to note, however, that the server + connection preface SETTINGS frame might include parameters that necessarily + alter how a client is expected to communicate with the server. Upon receiving the + SETTINGS frame, the client is expected to honor any parameters established. + In some configurations, it is possible for the server to transmit SETTINGS + before the client sends additional frames, providing an opportunity to avoid this issue. + + + Clients and servers MUST treat an invalid connection preface as a connection error of type + PROTOCOL_ERROR. A GOAWAY frame () + MAY be omitted in this case, since an invalid preface indicates that the peer is not using + HTTP/2. + +
    +
    + +
    + + Once the HTTP/2 connection is established, endpoints can begin exchanging frames. + + +
    + + All frames begin with a fixed 9-octet header followed by a variable-length payload. + +
    + +
    + + The fields of the frame header are defined as: + + + + The length of the frame payload expressed as an unsigned 24-bit integer. Values + greater than 214 (16,384) MUST NOT be sent unless the receiver has + set a larger value for SETTINGS_MAX_FRAME_SIZE. + + + The 9 octets of the frame header are not included in this value. + + + + + The 8-bit type of the frame. The frame type determines the format and semantics of + the frame. Implementations MUST ignore and discard any frame that has a type that + is unknown. + + + + + An 8-bit field reserved for frame-type specific boolean flags. + + + Flags are assigned semantics specific to the indicated frame type. Flags that have + no defined semantics for a particular frame type MUST be ignored, and MUST be left + unset (0) when sending. + + + + + A reserved 1-bit field. The semantics of this bit are undefined and the bit MUST + remain unset (0) when sending and MUST be ignored when receiving. + + + + + A 31-bit stream identifier (see ). The value 0 is + reserved for frames that are associated with the connection as a whole as opposed to + an individual stream. + + + + + + The structure and content of the frame payload is dependent entirely on the frame type. + +
    + +
    + + The size of a frame payload is limited by the maximum size that a receiver advertises in + the SETTINGS_MAX_FRAME_SIZE setting. This setting can have any value + between 214 (16,384) and 224-1 (16,777,215) octets, + inclusive. + + + All implementations MUST be capable of receiving and minimally processing frames up to + 214 octets in length, plus the 9 octet frame + header. The size of the frame header is not included when describing frame sizes. + + + Certain frame types, such as PING, impose additional limits + on the amount of payload data allowed. + + + + + If a frame size exceeds any defined limit, or is too small to contain mandatory frame + data, the endpoint MUST send a FRAME_SIZE_ERROR error. A frame size error + in a frame that could alter the state of the entire connection MUST be treated as a connection error; this includes any frame carrying + a header block (that is, HEADERS, + PUSH_PROMISE, and CONTINUATION), SETTINGS, + and any WINDOW_UPDATE frame with a stream identifier of 0. + + + Endpoints are not obligated to use all available space in a frame. Responsiveness can be + improved by using frames that are smaller than the permitted maximum size. Sending large + frames can result in delays in sending time-sensitive frames (such + RST_STREAM, WINDOW_UPDATE, or PRIORITY) + which if blocked by the transmission of a large frame, could affect performance. + +
    + +
    + + Just as in HTTP/1, a header field in HTTP/2 is a name with one or more associated values. + They are used within HTTP request and response messages as well as server push operations + (see ). + + + Header lists are collections of zero or more header fields. When transmitted over a + connection, a header list is serialized into a header block using HTTP Header Compression. The serialized header block is then + divided into one or more octet sequences, called header block fragments, and transmitted + within the payload of HEADERS, PUSH_PROMISE or CONTINUATION frames. + + + The Cookie header field is treated specially by the HTTP + mapping (see ). + + + A receiving endpoint reassembles the header block by concatenating its fragments, then + decompresses the block to reconstruct the header list. + + + A complete header block consists of either: + + + a single HEADERS or PUSH_PROMISE frame, + with the END_HEADERS flag set, or + + + a HEADERS or PUSH_PROMISE frame with the END_HEADERS + flag cleared and one or more CONTINUATION frames, + where the last CONTINUATION frame has the END_HEADERS flag set. + + + + + Header compression is stateful. One compression context and one decompression context is + used for the entire connection. Each header block is processed as a discrete unit. + Header blocks MUST be transmitted as a contiguous sequence of frames, with no interleaved + frames of any other type or from any other stream. The last frame in a sequence of + HEADERS or CONTINUATION frames MUST have the END_HEADERS + flag set. The last frame in a sequence of PUSH_PROMISE or + CONTINUATION frames MUST have the END_HEADERS flag set. This allows a + header block to be logically equivalent to a single frame. + + + Header block fragments can only be sent as the payload of HEADERS, + PUSH_PROMISE or CONTINUATION frames, because these frames + carry data that can modify the compression context maintained by a receiver. An endpoint + receiving HEADERS, PUSH_PROMISE or + CONTINUATION frames MUST reassemble header blocks and perform decompression + even if the frames are to be discarded. A receiver MUST terminate the connection with a + connection error of type + COMPRESSION_ERROR if it does not decompress a header block. + +
    +
    + +
    + + A "stream" is an independent, bi-directional sequence of frames exchanged between the client + and server within an HTTP/2 connection. Streams have several important characteristics: + + + A single HTTP/2 connection can contain multiple concurrently open streams, with either + endpoint interleaving frames from multiple streams. + + + Streams can be established and used unilaterally or shared by either the client or + server. + + + Streams can be closed by either endpoint. + + + The order in which frames are sent on a stream is significant. Recipients process frames + in the order they are received. In particular, the order of HEADERS, + and DATA frames is semantically significant. + + + Streams are identified by an integer. Stream identifiers are assigned to streams by the + endpoint initiating the stream. + + + + +
    + + The lifecycle of a stream is shown in . + + +
    + + | |<-----------' | + | R | closed | R | + `-------------------->| |<--------------------' + +--------+ + + H: HEADERS frame (with implied CONTINUATIONs) + PP: PUSH_PROMISE frame (with implied CONTINUATIONs) + ES: END_STREAM flag + R: RST_STREAM frame +]]> + +
    + + + Note that this diagram shows stream state transitions and the frames and flags that affect + those transitions only. In this regard, CONTINUATION frames do not result + in state transitions; they are effectively part of the HEADERS or + PUSH_PROMISE that they follow. For this purpose, the END_STREAM flag is + processed as a separate event to the frame that bears it; a HEADERS frame + with the END_STREAM flag set can cause two state transitions. + + + Both endpoints have a subjective view of the state of a stream that could be different + when frames are in transit. Endpoints do not coordinate the creation of streams; they are + created unilaterally by either endpoint. The negative consequences of a mismatch in + states are limited to the "closed" state after sending RST_STREAM, where + frames might be received for some time after closing. + + + Streams have the following states: + + + + + + All streams start in the "idle" state. In this state, no frames have been + exchanged. + + + The following transitions are valid from this state: + + + Sending or receiving a HEADERS frame causes the stream to become + "open". The stream identifier is selected as described in . The same HEADERS frame can also + cause a stream to immediately become "half closed". + + + Sending a PUSH_PROMISE frame marks the associated stream for + later use. The stream state for the reserved stream transitions to "reserved + (local)". + + + Receiving a PUSH_PROMISE frame marks the associated stream as + reserved by the remote peer. The state of the stream becomes "reserved + (remote)". + + + + + Receiving any frames other than HEADERS or + PUSH_PROMISE on a stream in this state MUST be treated as a connection error of type + PROTOCOL_ERROR. + + + + + + + A stream in the "reserved (local)" state is one that has been promised by sending a + PUSH_PROMISE frame. A PUSH_PROMISE frame reserves an + idle stream by associating the stream with an open stream that was initiated by the + remote peer (see ). + + + In this state, only the following transitions are possible: + + + The endpoint can send a HEADERS frame. This causes the stream to + open in a "half closed (remote)" state. + + + Either endpoint can send a RST_STREAM frame to cause the stream + to become "closed". This releases the stream reservation. + + + + + An endpoint MUST NOT send any type of frame other than HEADERS or + RST_STREAM in this state. + + + A PRIORITY frame MAY be received in this state. Receiving any type + of frame other than RST_STREAM or PRIORITY on a stream + in this state MUST be treated as a connection + error of type PROTOCOL_ERROR. + + + + + + + A stream in the "reserved (remote)" state has been reserved by a remote peer. + + + In this state, only the following transitions are possible: + + + Receiving a HEADERS frame causes the stream to transition to + "half closed (local)". + + + Either endpoint can send a RST_STREAM frame to cause the stream + to become "closed". This releases the stream reservation. + + + + + An endpoint MAY send a PRIORITY frame in this state to reprioritize + the reserved stream. An endpoint MUST NOT send any type of frame other than + RST_STREAM, WINDOW_UPDATE, or PRIORITY + in this state. + + + Receiving any type of frame other than HEADERS or + RST_STREAM on a stream in this state MUST be treated as a connection error of type + PROTOCOL_ERROR. + + + + + + + A stream in the "open" state may be used by both peers to send frames of any type. + In this state, sending peers observe advertised stream + level flow control limits. + + + From this state either endpoint can send a frame with an END_STREAM flag set, which + causes the stream to transition into one of the "half closed" states: an endpoint + sending an END_STREAM flag causes the stream state to become "half closed (local)"; + an endpoint receiving an END_STREAM flag causes the stream state to become "half + closed (remote)". + + + Either endpoint can send a RST_STREAM frame from this state, causing + it to transition immediately to "closed". + + + + + + + A stream that is in the "half closed (local)" state cannot be used for sending + frames. Only WINDOW_UPDATE, PRIORITY and + RST_STREAM frames can be sent in this state. + + + A stream transitions from this state to "closed" when a frame that contains an + END_STREAM flag is received, or when either peer sends a RST_STREAM + frame. + + + A receiver can ignore WINDOW_UPDATE frames in this state, which might + arrive for a short period after a frame bearing the END_STREAM flag is sent. + + + PRIORITY frames received in this state are used to reprioritize + streams that depend on the current stream. + + + + + + + A stream that is "half closed (remote)" is no longer being used by the peer to send + frames. In this state, an endpoint is no longer obligated to maintain a receiver + flow control window if it performs flow control. + + + If an endpoint receives additional frames for a stream that is in this state, other + than WINDOW_UPDATE, PRIORITY or + RST_STREAM, it MUST respond with a stream error of type + STREAM_CLOSED. + + + A stream that is "half closed (remote)" can be used by the endpoint to send frames + of any type. In this state, the endpoint continues to observe advertised stream level flow control limits. + + + A stream can transition from this state to "closed" by sending a frame that contains + an END_STREAM flag, or when either peer sends a RST_STREAM frame. + + + + + + + The "closed" state is the terminal state. + + + An endpoint MUST NOT send frames other than PRIORITY on a closed + stream. An endpoint that receives any frame other than PRIORITY + after receiving a RST_STREAM MUST treat that as a stream error of type + STREAM_CLOSED. Similarly, an endpoint that receives any frames after + receiving a frame with the END_STREAM flag set MUST treat that as a connection error of type + STREAM_CLOSED, unless the frame is permitted as described below. + + + WINDOW_UPDATE or RST_STREAM frames can be received in + this state for a short period after a DATA or HEADERS + frame containing an END_STREAM flag is sent. Until the remote peer receives and + processes RST_STREAM or the frame bearing the END_STREAM flag, it + might send frames of these types. Endpoints MUST ignore + WINDOW_UPDATE or RST_STREAM frames received in this + state, though endpoints MAY choose to treat frames that arrive a significant time + after sending END_STREAM as a connection + error of type PROTOCOL_ERROR. + + + PRIORITY frames can be sent on closed streams to prioritize streams + that are dependent on the closed stream. Endpoints SHOULD process + PRIORITY frame, though they can be ignored if the stream has been + removed from the dependency tree (see ). + + + If this state is reached as a result of sending a RST_STREAM frame, + the peer that receives the RST_STREAM might have already sent - or + enqueued for sending - frames on the stream that cannot be withdrawn. An endpoint + MUST ignore frames that it receives on closed streams after it has sent a + RST_STREAM frame. An endpoint MAY choose to limit the period over + which it ignores frames and treat frames that arrive after this time as being in + error. + + + Flow controlled frames (i.e., DATA) received after sending + RST_STREAM are counted toward the connection flow control window. + Even though these frames might be ignored, because they are sent before the sender + receives the RST_STREAM, the sender will consider the frames to count + against the flow control window. + + + An endpoint might receive a PUSH_PROMISE frame after it sends + RST_STREAM. PUSH_PROMISE causes a stream to become + "reserved" even if the associated stream has been reset. Therefore, a + RST_STREAM is needed to close an unwanted promised stream. + + + + + + In the absence of more specific guidance elsewhere in this document, implementations + SHOULD treat the receipt of a frame that is not expressly permitted in the description of + a state as a connection error of type + PROTOCOL_ERROR. Frame of unknown types are ignored. + + + An example of the state transitions for an HTTP request/response exchange can be found in + . An example of the state transitions for server push can be + found in and . + + +
    + + Streams are identified with an unsigned 31-bit integer. Streams initiated by a client + MUST use odd-numbered stream identifiers; those initiated by the server MUST use + even-numbered stream identifiers. A stream identifier of zero (0x0) is used for + connection control messages; the stream identifier zero cannot be used to establish a + new stream. + + + HTTP/1.1 requests that are upgraded to HTTP/2 (see ) are + responded to with a stream identifier of one (0x1). After the upgrade + completes, stream 0x1 is "half closed (local)" to the client. Therefore, stream 0x1 + cannot be selected as a new stream identifier by a client that upgrades from HTTP/1.1. + + + The identifier of a newly established stream MUST be numerically greater than all + streams that the initiating endpoint has opened or reserved. This governs streams that + are opened using a HEADERS frame and streams that are reserved using + PUSH_PROMISE. An endpoint that receives an unexpected stream identifier + MUST respond with a connection error of + type PROTOCOL_ERROR. + + + The first use of a new stream identifier implicitly closes all streams in the "idle" + state that might have been initiated by that peer with a lower-valued stream identifier. + For example, if a client sends a HEADERS frame on stream 7 without ever + sending a frame on stream 5, then stream 5 transitions to the "closed" state when the + first frame for stream 7 is sent or received. + + + Stream identifiers cannot be reused. Long-lived connections can result in an endpoint + exhausting the available range of stream identifiers. A client that is unable to + establish a new stream identifier can establish a new connection for new streams. A + server that is unable to establish a new stream identifier can send a + GOAWAY frame so that the client is forced to open a new connection for + new streams. + +
    + +
    + + A peer can limit the number of concurrently active streams using the + SETTINGS_MAX_CONCURRENT_STREAMS parameter (see ) within a SETTINGS frame. The maximum concurrent + streams setting is specific to each endpoint and applies only to the peer that receives + the setting. That is, clients specify the maximum number of concurrent streams the + server can initiate, and servers specify the maximum number of concurrent streams the + client can initiate. + + + Streams that are in the "open" state, or either of the "half closed" states count toward + the maximum number of streams that an endpoint is permitted to open. Streams in any of + these three states count toward the limit advertised in the + SETTINGS_MAX_CONCURRENT_STREAMS setting. Streams in either of the + "reserved" states do not count toward the stream limit. + + + Endpoints MUST NOT exceed the limit set by their peer. An endpoint that receives a + HEADERS frame that causes their advertised concurrent stream limit to be + exceeded MUST treat this as a stream error. An + endpoint that wishes to reduce the value of + SETTINGS_MAX_CONCURRENT_STREAMS to a value that is below the current + number of open streams can either close streams that exceed the new value or allow + streams to complete. + +
    +
    + +
    + + Using streams for multiplexing introduces contention over use of the TCP connection, + resulting in blocked streams. A flow control scheme ensures that streams on the same + connection do not destructively interfere with each other. Flow control is used for both + individual streams and for the connection as a whole. + + + HTTP/2 provides for flow control through use of the WINDOW_UPDATE frame. + + +
    + + HTTP/2 stream flow control aims to allow a variety of flow control algorithms to be + used without requiring protocol changes. Flow control in HTTP/2 has the following + characteristics: + + + Flow control is specific to a connection; i.e., it is "hop-by-hop", not + "end-to-end". + + + Flow control is based on window update frames. Receivers advertise how many octets + they are prepared to receive on a stream and for the entire connection. This is a + credit-based scheme. + + + Flow control is directional with overall control provided by the receiver. A + receiver MAY choose to set any window size that it desires for each stream and for + the entire connection. A sender MUST respect flow control limits imposed by a + receiver. Clients, servers and intermediaries all independently advertise their + flow control window as a receiver and abide by the flow control limits set by + their peer when sending. + + + The initial value for the flow control window is 65,535 octets for both new streams + and the overall connection. + + + The frame type determines whether flow control applies to a frame. Of the frames + specified in this document, only DATA frames are subject to flow + control; all other frame types do not consume space in the advertised flow control + window. This ensures that important control frames are not blocked by flow control. + + + Flow control cannot be disabled. + + + HTTP/2 defines only the format and semantics of the WINDOW_UPDATE + frame (). This document does not stipulate how a + receiver decides when to send this frame or the value that it sends, nor does it + specify how a sender chooses to send packets. Implementations are able to select + any algorithm that suits their needs. + + + + + Implementations are also responsible for managing how requests and responses are sent + based on priority; choosing how to avoid head of line blocking for requests; and + managing the creation of new streams. Algorithm choices for these could interact with + any flow control algorithm. + +
    + +
    + + Flow control is defined to protect endpoints that are operating under resource + constraints. For example, a proxy needs to share memory between many connections, and + also might have a slow upstream connection and a fast downstream one. Flow control + addresses cases where the receiver is unable process data on one stream, yet wants to + continue to process other streams in the same connection. + + + Deployments that do not require this capability can advertise a flow control window of + the maximum size, incrementing the available space when new data is received. This + effectively disables flow control for that receiver. Conversely, a sender is always + subject to the flow control window advertised by the receiver. + + + Deployments with constrained resources (for example, memory) can employ flow control to + limit the amount of memory a peer can consume. Note, however, that this can lead to + suboptimal use of available network resources if flow control is enabled without + knowledge of the bandwidth-delay product (see ). + + + Even with full awareness of the current bandwidth-delay product, implementation of flow + control can be difficult. When using flow control, the receiver MUST read from the TCP + receive buffer in a timely fashion. Failure to do so could lead to a deadlock when + critical frames, such as WINDOW_UPDATE, are not read and acted upon. + +
    +
    + +
    + + A client can assign a priority for a new stream by including prioritization information in + the HEADERS frame that opens the stream. For an existing + stream, the PRIORITY frame can be used to change the + priority. + + + The purpose of prioritization is to allow an endpoint to express how it would prefer its + peer allocate resources when managing concurrent streams. Most importantly, priority can + be used to select streams for transmitting frames when there is limited capacity for + sending. + + + Streams can be prioritized by marking them as dependent on the completion of other streams + (). Each dependency is assigned a relative weight, a number + that is used to determine the relative proportion of available resources that are assigned + to streams dependent on the same stream. + + + + Explicitly setting the priority for a stream is input to a prioritization process. It + does not guarantee any particular processing or transmission order for the stream relative + to any other stream. An endpoint cannot force a peer to process concurrent streams in a + particular order using priority. Expressing priority is therefore only ever a suggestion. + + + Providing prioritization information is optional, so default values are used if no + explicit indicator is provided (). + + +
    + + Each stream can be given an explicit dependency on another stream. Including a + dependency expresses a preference to allocate resources to the identified stream rather + than to the dependent stream. + + + A stream that is not dependent on any other stream is given a stream dependency of 0x0. + In other words, the non-existent stream 0 forms the root of the tree. + + + A stream that depends on another stream is a dependent stream. The stream upon which a + stream is dependent is a parent stream. A dependency on a stream that is not currently + in the tree - such as a stream in the "idle" state - results in that stream being given + a default priority. + + + When assigning a dependency on another stream, the stream is added as a new dependency + of the parent stream. Dependent streams that share the same parent are not ordered with + respect to each other. For example, if streams B and C are dependent on stream A, and + if stream D is created with a dependency on stream A, this results in a dependency order + of A followed by B, C, and D in any order. + +
    + /|\ + B C B D C +]]> +
    + + An exclusive flag allows for the insertion of a new level of dependencies. The + exclusive flag causes the stream to become the sole dependency of its parent stream, + causing other dependencies to become dependent on the exclusive stream. In the + previous example, if stream D is created with an exclusive dependency on stream A, this + results in D becoming the dependency parent of B and C. + +
    + D + B C / \ + B C +]]> +
    + + Inside the dependency tree, a dependent stream SHOULD only be allocated resources if all + of the streams that it depends on (the chain of parent streams up to 0x0) are either + closed, or it is not possible to make progress on them. + + + A stream cannot depend on itself. An endpoint MUST treat this as a stream error of type PROTOCOL_ERROR. + +
    + +
    + + All dependent streams are allocated an integer weight between 1 and 256 (inclusive). + + + Streams with the same parent SHOULD be allocated resources proportionally based on their + weight. Thus, if stream B depends on stream A with weight 4, and C depends on stream A + with weight 12, and if no progress can be made on A, stream B ideally receives one third + of the resources allocated to stream C. + +
    + +
    + + Stream priorities are changed using the PRIORITY frame. Setting a + dependency causes a stream to become dependent on the identified parent stream. + + + Dependent streams move with their parent stream if the parent is reprioritized. Setting + a dependency with the exclusive flag for a reprioritized stream moves all the + dependencies of the new parent stream to become dependent on the reprioritized stream. + + + If a stream is made dependent on one of its own dependencies, the formerly dependent + stream is first moved to be dependent on the reprioritized stream's previous parent. + The moved dependency retains its weight. + +
    + + For example, consider an original dependency tree where B and C depend on A, D and E + depend on C, and F depends on D. If A is made dependent on D, then D takes the place + of A. All other dependency relationships stay the same, except for F, which becomes + dependent on A if the reprioritization is exclusive. + + F B C ==> F A OR A + / \ | / \ /|\ + D E E B C B C F + | | | + F E E + (intermediate) (non-exclusive) (exclusive) +]]> +
    +
    + +
    + + When a stream is removed from the dependency tree, its dependencies can be moved to + become dependent on the parent of the closed stream. The weights of new dependencies + are recalculated by distributing the weight of the dependency of the closed stream + proportionally based on the weights of its dependencies. + + + Streams that are removed from the dependency tree cause some prioritization information + to be lost. Resources are shared between streams with the same parent stream, which + means that if a stream in that set closes or becomes blocked, any spare capacity + allocated to a stream is distributed to the immediate neighbors of the stream. However, + if the common dependency is removed from the tree, those streams share resources with + streams at the next highest level. + + + For example, assume streams A and B share a parent, and streams C and D both depend on + stream A. Prior to the removal of stream A, if streams A and D are unable to proceed, + then stream C receives all the resources dedicated to stream A. If stream A is removed + from the tree, the weight of stream A is divided between streams C and D. If stream D + is still unable to proceed, this results in stream C receiving a reduced proportion of + resources. For equal starting weights, C receives one third, rather than one half, of + available resources. + + + It is possible for a stream to become closed while prioritization information that + creates a dependency on that stream is in transit. If a stream identified in a + dependency has no associated priority information, then the dependent stream is instead + assigned a default priority. This potentially creates + suboptimal prioritization, since the stream could be given a priority that is different + to what is intended. + + + To avoid these problems, an endpoint SHOULD retain stream prioritization state for a + period after streams become closed. The longer state is retained, the lower the chance + that streams are assigned incorrect or default priority values. + + + This could create a large state burden for an endpoint, so this state MAY be limited. + An endpoint MAY apply a fixed upper limit on the number of closed streams for which + prioritization state is tracked to limit state exposure. The amount of additional state + an endpoint maintains could be dependent on load; under high load, prioritization state + can be discarded to limit resource commitments. In extreme cases, an endpoint could + even discard prioritization state for active or reserved streams. If a fixed limit is + applied, endpoints SHOULD maintain state for at least as many streams as allowed by + their setting for SETTINGS_MAX_CONCURRENT_STREAMS. + + + An endpoint receiving a PRIORITY frame that changes the priority of a + closed stream SHOULD alter the dependencies of the streams that depend on it, if it has + retained enough state to do so. + +
    + +
    + + Providing priority information is optional. Streams are assigned a non-exclusive + dependency on stream 0x0 by default. Pushed streams + initially depend on their associated stream. In both cases, streams are assigned a + default weight of 16. + +
    +
    + +
    + + HTTP/2 framing permits two classes of error: + + + An error condition that renders the entire connection unusable is a connection error. + + + An error in an individual stream is a stream error. + + + + + A list of error codes is included in . + + +
    + + A connection error is any error which prevents further processing of the framing layer, + or which corrupts any connection state. + + + An endpoint that encounters a connection error SHOULD first send a GOAWAY + frame () with the stream identifier of the last stream that it + successfully received from its peer. The GOAWAY frame includes an error + code that indicates why the connection is terminating. After sending the + GOAWAY frame, the endpoint MUST close the TCP connection. + + + It is possible that the GOAWAY will not be reliably received by the + receiving endpoint (see ). In the event of a connection error, + GOAWAY only provides a best effort attempt to communicate with the peer + about why the connection is being terminated. + + + An endpoint can end a connection at any time. In particular, an endpoint MAY choose to + treat a stream error as a connection error. Endpoints SHOULD send a + GOAWAY frame when ending a connection, providing that circumstances + permit it. + +
    + +
    + + A stream error is an error related to a specific stream that does not affect processing + of other streams. + + + An endpoint that detects a stream error sends a RST_STREAM frame () that contains the stream identifier of the stream where the error + occurred. The RST_STREAM frame includes an error code that indicates the + type of error. + + + A RST_STREAM is the last frame that an endpoint can send on a stream. + The peer that sends the RST_STREAM frame MUST be prepared to receive any + frames that were sent or enqueued for sending by the remote peer. These frames can be + ignored, except where they modify connection state (such as the state maintained for + header compression, or flow control). + + + Normally, an endpoint SHOULD NOT send more than one RST_STREAM frame for + any stream. However, an endpoint MAY send additional RST_STREAM frames if + it receives frames on a closed stream after more than a round-trip time. This behavior + is permitted to deal with misbehaving implementations. + + + An endpoint MUST NOT send a RST_STREAM in response to an + RST_STREAM frame, to avoid looping. + +
    + +
    + + If the TCP connection is closed or reset while streams remain in open or half closed + states, then the endpoint MUST assume that those streams were abnormally interrupted and + could be incomplete. + +
    +
    + +
    + + HTTP/2 permits extension of the protocol. Protocol extensions can be used to provide + additional services or alter any aspect of the protocol, within the limitations described + in this section. Extensions are effective only within the scope of a single HTTP/2 + connection. + + + Extensions are permitted to use new frame types, new + settings, or new error + codes. Registries are established for managing these extension points: frame types, settings and + error codes. + + + Implementations MUST ignore unknown or unsupported values in all extensible protocol + elements. Implementations MUST discard frames that have unknown or unsupported types. + This means that any of these extension points can be safely used by extensions without + prior arrangement or negotiation. However, extension frames that appear in the middle of + a header block are not permitted; these MUST be treated + as a connection error of type + PROTOCOL_ERROR. + + + However, extensions that could change the semantics of existing protocol components MUST + be negotiated before being used. For example, an extension that changes the layout of the + HEADERS frame cannot be used until the peer has given a positive signal + that this is acceptable. In this case, it could also be necessary to coordinate when the + revised layout comes into effect. Note that treating any frame other than + DATA frames as flow controlled is such a change in semantics, and can only + be done through negotiation. + + + This document doesn't mandate a specific method for negotiating the use of an extension, + but notes that a setting could be used for that + purpose. If both peers set a value that indicates willingness to use the extension, then + the extension can be used. If a setting is used for extension negotiation, the initial + value MUST be defined so that the extension is initially disabled. + +
    +
    + +
    + + This specification defines a number of frame types, each identified by a unique 8-bit type + code. Each frame type serves a distinct purpose either in the establishment and management + of the connection as a whole, or of individual streams. + + + The transmission of specific frame types can alter the state of a connection. If endpoints + fail to maintain a synchronized view of the connection state, successful communication + within the connection will no longer be possible. Therefore, it is important that endpoints + have a shared comprehension of how the state is affected by the use any given frame. + + +
    + + DATA frames (type=0x0) convey arbitrary, variable-length sequences of octets associated + with a stream. One or more DATA frames are used, for instance, to carry HTTP request or + response payloads. + + + DATA frames MAY also contain arbitrary padding. Padding can be added to DATA frames to + obscure the size of messages. + +
    + +
    + + The DATA frame contains the following fields: + + + An 8-bit field containing the length of the frame padding in units of octets. This + field is optional and is only present if the PADDED flag is set. + + + Application data. The amount of data is the remainder of the frame payload after + subtracting the length of the other fields that are present. + + + Padding octets that contain no application semantic value. Padding octets MUST be set + to zero when sending and ignored when receiving. + + + + + + The DATA frame defines the following flags: + + + Bit 1 being set indicates that this frame is the last that the endpoint will send for + the identified stream. Setting this flag causes the stream to enter one of the "half closed" states or the "closed" state. + + + Bit 4 being set indicates that the Pad Length field and any padding that it describes + is present. + + + + + DATA frames MUST be associated with a stream. If a DATA frame is received whose stream + identifier field is 0x0, the recipient MUST respond with a connection error of type + PROTOCOL_ERROR. + + + DATA frames are subject to flow control and can only be sent when a stream is in the + "open" or "half closed (remote)" states. The entire DATA frame payload is included in flow + control, including Pad Length and Padding fields if present. If a DATA frame is received + whose stream is not in "open" or "half closed (local)" state, the recipient MUST respond + with a stream error of type + STREAM_CLOSED. + + + The total number of padding octets is determined by the value of the Pad Length field. If + the length of the padding is greater than the length of the frame payload, the recipient + MUST treat this as a connection error of + type PROTOCOL_ERROR. + + + A frame can be increased in size by one octet by including a Pad Length field with a + value of zero. + + + + + Padding is a security feature; see . + +
    + +
    + + The HEADERS frame (type=0x1) is used to open a stream, + and additionally carries a header block fragment. HEADERS frames can be sent on a stream + in the "open" or "half closed (remote)" states. + +
    + +
    + + The HEADERS frame payload has the following fields: + + + An 8-bit field containing the length of the frame padding in units of octets. This + field is only present if the PADDED flag is set. + + + A single bit flag indicates that the stream dependency is exclusive, see . This field is only present if the PRIORITY flag is set. + + + A 31-bit stream identifier for the stream that this stream depends on, see . This field is only present if the PRIORITY flag is set. + + + An 8-bit weight for the stream, see . Add one to the + value to obtain a weight between 1 and 256. This field is only present if the + PRIORITY flag is set. + + + A header block fragment. + + + Padding octets that contain no application semantic value. Padding octets MUST be set + to zero when sending and ignored when receiving. + + + + + + The HEADERS frame defines the following flags: + + + + Bit 1 being set indicates that the header block is + the last that the endpoint will send for the identified stream. Setting this flag + causes the stream to enter one of "half closed" + states. + + + A HEADERS frame carries the END_STREAM flag that signals the end of a stream. + However, a HEADERS frame with the END_STREAM flag set can be followed by + CONTINUATION frames on the same stream. Logically, the + CONTINUATION frames are part of the HEADERS frame. + + + + + Bit 3 being set indicates that this frame contains an entire header block and is not followed by any + CONTINUATION frames. + + + A HEADERS frame without the END_HEADERS flag set MUST be followed by a + CONTINUATION frame for the same stream. A receiver MUST treat the + receipt of any other type of frame or a frame on a different stream as a connection error of type + PROTOCOL_ERROR. + + + + + Bit 4 being set indicates that the Pad Length field and any padding that it + describes is present. + + + + + Bit 6 being set indicates that the Exclusive Flag (E), Stream Dependency, and Weight + fields are present; see . + + + + + + + The payload of a HEADERS frame contains a header block + fragment. A header block that does not fit within a HEADERS frame is continued in + a CONTINUATION frame. + + + + HEADERS frames MUST be associated with a stream. If a HEADERS frame is received whose + stream identifier field is 0x0, the recipient MUST respond with a connection error of type + PROTOCOL_ERROR. + + + + The HEADERS frame changes the connection state as described in . + + + + The HEADERS frame includes optional padding. Padding fields and flags are identical to + those defined for DATA frames. + + + Prioritization information in a HEADERS frame is logically equivalent to a separate + PRIORITY frame, but inclusion in HEADERS avoids the potential for churn in + stream prioritization when new streams are created. Priorization fields in HEADERS frames + subsequent to the first on a stream reprioritize the + stream. + +
    + +
    + + The PRIORITY frame (type=0x2) specifies the sender-advised + priority of a stream. It can be sent at any time for an existing stream, including + closed streams. This enables reprioritization of existing streams. + +
    + +
    + + The payload of a PRIORITY frame contains the following fields: + + + A single bit flag indicates that the stream dependency is exclusive, see . + + + A 31-bit stream identifier for the stream that this stream depends on, see . + + + An 8-bit weight for the identified stream dependency, see . Add one to the value to obtain a weight between 1 and 256. + + + + + + The PRIORITY frame does not define any flags. + + + + The PRIORITY frame is associated with an existing stream. If a PRIORITY frame is received + with a stream identifier of 0x0, the recipient MUST respond with a connection error of type + PROTOCOL_ERROR. + + + The PRIORITY frame can be sent on a stream in any of the "reserved (remote)", "open", + "half closed (local)", "half closed (remote)", or "closed" states, though it cannot be + sent between consecutive frames that comprise a single header + block. Note that this frame could arrive after processing or frame sending has + completed, which would cause it to have no effect on the current stream. For a stream + that is in the "half closed (remote)" or "closed" - state, this frame can only affect + processing of the current stream and not frame transmission. + + + The PRIORITY frame is the only frame that can be sent for a stream in the "closed" state. + This allows for the reprioritization of a group of dependent streams by altering the + priority of a parent stream, which might be closed. However, a PRIORITY frame sent on a + closed stream risks being ignored due to the peer having discarded priority state + information for that stream. + +
    + +
    + + The RST_STREAM frame (type=0x3) allows for abnormal termination of a stream. When sent by + the initiator of a stream, it indicates that they wish to cancel the stream or that an + error condition has occurred. When sent by the receiver of a stream, it indicates that + either the receiver is rejecting the stream, requesting that the stream be cancelled, or + that an error condition has occurred. + +
    + +
    + + + The RST_STREAM frame contains a single unsigned, 32-bit integer identifying the error code. The error code indicates why the stream is being + terminated. + + + + The RST_STREAM frame does not define any flags. + + + + The RST_STREAM frame fully terminates the referenced stream and causes it to enter the + closed state. After receiving a RST_STREAM on a stream, the receiver MUST NOT send + additional frames for that stream, with the exception of PRIORITY. However, + after sending the RST_STREAM, the sending endpoint MUST be prepared to receive and process + additional frames sent on the stream that might have been sent by the peer prior to the + arrival of the RST_STREAM. + + + + RST_STREAM frames MUST be associated with a stream. If a RST_STREAM frame is received + with a stream identifier of 0x0, the recipient MUST treat this as a connection error of type + PROTOCOL_ERROR. + + + + RST_STREAM frames MUST NOT be sent for a stream in the "idle" state. If a RST_STREAM + frame identifying an idle stream is received, the recipient MUST treat this as a connection error of type + PROTOCOL_ERROR. + + +
    + +
    + + The SETTINGS frame (type=0x4) conveys configuration parameters that affect how endpoints + communicate, such as preferences and constraints on peer behavior. The SETTINGS frame is + also used to acknowledge the receipt of those parameters. Individually, a SETTINGS + parameter can also be referred to as a "setting". + + + SETTINGS parameters are not negotiated; they describe characteristics of the sending peer, + which are used by the receiving peer. Different values for the same parameter can be + advertised by each peer. For example, a client might set a high initial flow control + window, whereas a server might set a lower value to conserve resources. + + + + A SETTINGS frame MUST be sent by both endpoints at the start of a connection, and MAY be + sent at any other time by either endpoint over the lifetime of the connection. + Implementations MUST support all of the parameters defined by this specification. + + + + Each parameter in a SETTINGS frame replaces any existing value for that parameter. + Parameters are processed in the order in which they appear, and a receiver of a SETTINGS + frame does not need to maintain any state other than the current value of its + parameters. Therefore, the value of a SETTINGS parameter is the last value that is seen by + a receiver. + + + SETTINGS parameters are acknowledged by the receiving peer. To enable this, the SETTINGS + frame defines the following flag: + + + Bit 1 being set indicates that this frame acknowledges receipt and application of the + peer's SETTINGS frame. When this bit is set, the payload of the SETTINGS frame MUST + be empty. Receipt of a SETTINGS frame with the ACK flag set and a length field value + other than 0 MUST be treated as a connection + error of type FRAME_SIZE_ERROR. For more info, see Settings Synchronization. + + + + + SETTINGS frames always apply to a connection, never a single stream. The stream + identifier for a SETTINGS frame MUST be zero (0x0). If an endpoint receives a SETTINGS + frame whose stream identifier field is anything other than 0x0, the endpoint MUST respond + with a connection error of type + PROTOCOL_ERROR. + + + The SETTINGS frame affects connection state. A badly formed or incomplete SETTINGS frame + MUST be treated as a connection error of type + PROTOCOL_ERROR. + + +
    + + The payload of a SETTINGS frame consists of zero or more parameters, each consisting of + an unsigned 16-bit setting identifier and an unsigned 32-bit value. + + +
    + +
    +
    + +
    + + The following parameters are defined: + + + + Allows the sender to inform the remote endpoint of the maximum size of the header + compression table used to decode header blocks, in octets. The encoder can select + any size equal to or less than this value by using signaling specific to the + header compression format inside a header block. The initial value is 4,096 + octets. + + + + + This setting can be use to disable server + push. An endpoint MUST NOT send a PUSH_PROMISE frame if it + receives this parameter set to a value of 0. An endpoint that has both set this + parameter to 0 and had it acknowledged MUST treat the receipt of a + PUSH_PROMISE frame as a connection error of type + PROTOCOL_ERROR. + + + The initial value is 1, which indicates that server push is permitted. Any value + other than 0 or 1 MUST be treated as a connection error of type + PROTOCOL_ERROR. + + + + + Indicates the maximum number of concurrent streams that the sender will allow. + This limit is directional: it applies to the number of streams that the sender + permits the receiver to create. Initially there is no limit to this value. It is + recommended that this value be no smaller than 100, so as to not unnecessarily + limit parallelism. + + + A value of 0 for SETTINGS_MAX_CONCURRENT_STREAMS SHOULD NOT be treated as special + by endpoints. A zero value does prevent the creation of new streams, however this + can also happen for any limit that is exhausted with active streams. Servers + SHOULD only set a zero value for short durations; if a server does not wish to + accept requests, closing the connection could be preferable. + + + + + Indicates the sender's initial window size (in octets) for stream level flow + control. The initial value is 216-1 (65,535) octets. + + + This setting affects the window size of all streams, including existing streams, + see . + + + Values above the maximum flow control window size of 231-1 MUST + be treated as a connection error of + type FLOW_CONTROL_ERROR. + + + + + Indicates the size of the largest frame payload that the sender is willing to + receive, in octets. + + + The initial value is 214 (16,384) octets. The value advertised by + an endpoint MUST be between this initial value and the maximum allowed frame size + (224-1 or 16,777,215 octets), inclusive. Values outside this range + MUST be treated as a connection error + of type PROTOCOL_ERROR. + + + + + This advisory setting informs a peer of the maximum size of header list that the + sender is prepared to accept, in octets. The value is based on the uncompressed + size of header fields, including the length of the name and value in octets plus + an overhead of 32 octets for each header field. + + + For any given request, a lower limit than what is advertised MAY be enforced. The + initial value of this setting is unlimited. + + + + + + An endpoint that receives a SETTINGS frame with any unknown or unsupported identifier + MUST ignore that setting. + +
    + +
    + + Most values in SETTINGS benefit from or require an understanding of when the peer has + received and applied the changed parameter values. In order to provide + such synchronization timepoints, the recipient of a SETTINGS frame in which the ACK flag + is not set MUST apply the updated parameters as soon as possible upon receipt. + + + The values in the SETTINGS frame MUST be processed in the order they appear, with no + other frame processing between values. Unsupported parameters MUST be ignored. Once + all values have been processed, the recipient MUST immediately emit a SETTINGS frame + with the ACK flag set. Upon receiving a SETTINGS frame with the ACK flag set, the sender + of the altered parameters can rely on the setting having been applied. + + + If the sender of a SETTINGS frame does not receive an acknowledgement within a + reasonable amount of time, it MAY issue a connection error of type + SETTINGS_TIMEOUT. + +
    +
    + +
    + + The PUSH_PROMISE frame (type=0x5) is used to notify the peer endpoint in advance of + streams the sender intends to initiate. The PUSH_PROMISE frame includes the unsigned + 31-bit identifier of the stream the endpoint plans to create along with a set of headers + that provide additional context for the stream. contains a + thorough description of the use of PUSH_PROMISE frames. + + +
    + +
    + + The PUSH_PROMISE frame payload has the following fields: + + + An 8-bit field containing the length of the frame padding in units of octets. This + field is only present if the PADDED flag is set. + + + A single reserved bit. + + + An unsigned 31-bit integer that identifies the stream that is reserved by the + PUSH_PROMISE. The promised stream identifier MUST be a valid choice for the next + stream sent by the sender (see new stream + identifier). + + + A header block fragment containing request header + fields. + + + Padding octets. + + + + + + The PUSH_PROMISE frame defines the following flags: + + + + Bit 3 being set indicates that this frame contains an entire header block and is not followed by any + CONTINUATION frames. + + + A PUSH_PROMISE frame without the END_HEADERS flag set MUST be followed by a + CONTINUATION frame for the same stream. A receiver MUST treat the receipt of any + other type of frame or a frame on a different stream as a connection error of type + PROTOCOL_ERROR. + + + + + Bit 4 being set indicates that the Pad Length field and any padding that it + describes is present. + + + + + + + PUSH_PROMISE frames MUST be associated with an existing, peer-initiated stream. The stream + identifier of a PUSH_PROMISE frame indicates the stream it is associated with. If the + stream identifier field specifies the value 0x0, a recipient MUST respond with a connection error of type + PROTOCOL_ERROR. + + + + Promised streams are not required to be used in the order they are promised. The + PUSH_PROMISE only reserves stream identifiers for later use. + + + + PUSH_PROMISE MUST NOT be sent if the SETTINGS_ENABLE_PUSH setting of the + peer endpoint is set to 0. An endpoint that has set this setting and has received + acknowledgement MUST treat the receipt of a PUSH_PROMISE frame as a connection error of type + PROTOCOL_ERROR. + + + Recipients of PUSH_PROMISE frames can choose to reject promised streams by returning a + RST_STREAM referencing the promised stream identifier back to the sender of + the PUSH_PROMISE. + + + + A PUSH_PROMISE frame modifies the connection state in two ways. The inclusion of a header block potentially modifies the state maintained for + header compression. PUSH_PROMISE also reserves a stream for later use, causing the + promised stream to enter the "reserved" state. A sender MUST NOT send a PUSH_PROMISE on a + stream unless that stream is either "open" or "half closed (remote)"; the sender MUST + ensure that the promised stream is a valid choice for a new stream identifier (that is, the promised stream MUST + be in the "idle" state). + + + Since PUSH_PROMISE reserves a stream, ignoring a PUSH_PROMISE frame causes the stream + state to become indeterminate. A receiver MUST treat the receipt of a PUSH_PROMISE on a + stream that is neither "open" nor "half closed (local)" as a connection error of type + PROTOCOL_ERROR. However, an endpoint that has sent + RST_STREAM on the associated stream MUST handle PUSH_PROMISE frames that + might have been created before the RST_STREAM frame is received and + processed. + + + A receiver MUST treat the receipt of a PUSH_PROMISE that promises an illegal stream identifier (that is, an identifier for a + stream that is not currently in the "idle" state) as a connection error of type + PROTOCOL_ERROR. + + + + The PUSH_PROMISE frame includes optional padding. Padding fields and flags are identical + to those defined for DATA frames. + +
    + +
    + + The PING frame (type=0x6) is a mechanism for measuring a minimal round trip time from the + sender, as well as determining whether an idle connection is still functional. PING + frames can be sent from any endpoint. + +
    + +
    + + + In addition to the frame header, PING frames MUST contain 8 octets of data in the payload. + A sender can include any value it chooses and use those bytes in any fashion. + + + Receivers of a PING frame that does not include an ACK flag MUST send a PING frame with + the ACK flag set in response, with an identical payload. PING responses SHOULD be given + higher priority than any other frame. + + + + The PING frame defines the following flags: + + + Bit 1 being set indicates that this PING frame is a PING response. An endpoint MUST + set this flag in PING responses. An endpoint MUST NOT respond to PING frames + containing this flag. + + + + + PING frames are not associated with any individual stream. If a PING frame is received + with a stream identifier field value other than 0x0, the recipient MUST respond with a + connection error of type + PROTOCOL_ERROR. + + + Receipt of a PING frame with a length field value other than 8 MUST be treated as a connection error of type + FRAME_SIZE_ERROR. + + +
    + +
    + + The GOAWAY frame (type=0x7) informs the remote peer to stop creating streams on this + connection. GOAWAY can be sent by either the client or the server. Once sent, the sender + will ignore frames sent on any new streams with identifiers higher than the included last + stream identifier. Receivers of a GOAWAY frame MUST NOT open additional streams on the + connection, although a new connection can be established for new streams. + + + The purpose of this frame is to allow an endpoint to gracefully stop accepting new + streams, while still finishing processing of previously established streams. This enables + administrative actions, like server maintainance. + + + There is an inherent race condition between an endpoint starting new streams and the + remote sending a GOAWAY frame. To deal with this case, the GOAWAY contains the stream + identifier of the last peer-initiated stream which was or might be processed on the + sending endpoint in this connection. For instance, if the server sends a GOAWAY frame, + the identified stream is the highest numbered stream initiated by the client. + + + If the receiver of the GOAWAY has sent data on streams with a higher stream identifier + than what is indicated in the GOAWAY frame, those streams are not or will not be + processed. The receiver of the GOAWAY frame can treat the streams as though they had + never been created at all, thereby allowing those streams to be retried later on a new + connection. + + + Endpoints SHOULD always send a GOAWAY frame before closing a connection so that the remote + can know whether a stream has been partially processed or not. For example, if an HTTP + client sends a POST at the same time that a server closes a connection, the client cannot + know if the server started to process that POST request if the server does not send a + GOAWAY frame to indicate what streams it might have acted on. + + + An endpoint might choose to close a connection without sending GOAWAY for misbehaving + peers. + + +
    + +
    + + The GOAWAY frame does not define any flags. + + + The GOAWAY frame applies to the connection, not a specific stream. An endpoint MUST treat + a GOAWAY frame with a stream identifier other than 0x0 as a connection error of type + PROTOCOL_ERROR. + + + The last stream identifier in the GOAWAY frame contains the highest numbered stream + identifier for which the sender of the GOAWAY frame might have taken some action on, or + might yet take action on. All streams up to and including the identified stream might + have been processed in some way. The last stream identifier can be set to 0 if no streams + were processed. + + + In this context, "processed" means that some data from the stream was passed to some + higher layer of software that might have taken some action as a result. + + + If a connection terminates without a GOAWAY frame, the last stream identifier is + effectively the highest possible stream identifier. + + + On streams with lower or equal numbered identifiers that were not closed completely prior + to the connection being closed, re-attempting requests, transactions, or any protocol + activity is not possible, with the exception of idempotent actions like HTTP GET, PUT, or + DELETE. Any protocol activity that uses higher numbered streams can be safely retried + using a new connection. + + + Activity on streams numbered lower or equal to the last stream identifier might still + complete successfully. The sender of a GOAWAY frame might gracefully shut down a + connection by sending a GOAWAY frame, maintaining the connection in an open state until + all in-progress streams complete. + + + An endpoint MAY send multiple GOAWAY frames if circumstances change. For instance, an + endpoint that sends GOAWAY with NO_ERROR during graceful shutdown could + subsequently encounter an condition that requires immediate termination of the connection. + The last stream identifier from the last GOAWAY frame received indicates which streams + could have been acted upon. Endpoints MUST NOT increase the value they send in the last + stream identifier, since the peers might already have retried unprocessed requests on + another connection. + + + A client that is unable to retry requests loses all requests that are in flight when the + server closes the connection. This is especially true for intermediaries that might + not be serving clients using HTTP/2. A server that is attempting to gracefully shut down + a connection SHOULD send an initial GOAWAY frame with the last stream identifier set to + 231-1 and a NO_ERROR code. This signals to the client that + a shutdown is imminent and that no further requests can be initiated. After waiting at + least one round trip time, the server can send another GOAWAY frame with an updated last + stream identifier. This ensures that a connection can be cleanly shut down without losing + requests. + + + + After sending a GOAWAY frame, the sender can discard frames for streams with identifiers + higher than the identified last stream. However, any frames that alter connection state + cannot be completely ignored. For instance, HEADERS, + PUSH_PROMISE and CONTINUATION frames MUST be minimally + processed to ensure the state maintained for header compression is consistent (see ); similarly DATA frames MUST be counted toward the connection flow + control window. Failure to process these frames can cause flow control or header + compression state to become unsynchronized. + + + + The GOAWAY frame also contains a 32-bit error code that + contains the reason for closing the connection. + + + Endpoints MAY append opaque data to the payload of any GOAWAY frame. Additional debug + data is intended for diagnostic purposes only and carries no semantic value. Debug + information could contain security- or privacy-sensitive data. Logged or otherwise + persistently stored debug data MUST have adequate safeguards to prevent unauthorized + access. + +
    + +
    + + The WINDOW_UPDATE frame (type=0x8) is used to implement flow control; see for an overview. + + + Flow control operates at two levels: on each individual stream and on the entire + connection. + + + Both types of flow control are hop-by-hop; that is, only between the two endpoints. + Intermediaries do not forward WINDOW_UPDATE frames between dependent connections. + However, throttling of data transfer by any receiver can indirectly cause the propagation + of flow control information toward the original sender. + + + Flow control only applies to frames that are identified as being subject to flow control. + Of the frame types defined in this document, this includes only DATA frames. + Frames that are exempt from flow control MUST be accepted and processed, unless the + receiver is unable to assign resources to handling the frame. A receiver MAY respond with + a stream error or connection error of type + FLOW_CONTROL_ERROR if it is unable to accept a frame. + +
    + +
    + + The payload of a WINDOW_UPDATE frame is one reserved bit, plus an unsigned 31-bit integer + indicating the number of octets that the sender can transmit in addition to the existing + flow control window. The legal range for the increment to the flow control window is 1 to + 231-1 (0x7fffffff) octets. + + + The WINDOW_UPDATE frame does not define any flags. + + + The WINDOW_UPDATE frame can be specific to a stream or to the entire connection. In the + former case, the frame's stream identifier indicates the affected stream; in the latter, + the value "0" indicates that the entire connection is the subject of the frame. + + + A receiver MUST treat the receipt of a WINDOW_UPDATE frame with an flow control window + increment of 0 as a stream error of type + PROTOCOL_ERROR; errors on the connection flow control window MUST be + treated as a connection error. + + + WINDOW_UPDATE can be sent by a peer that has sent a frame bearing the END_STREAM flag. + This means that a receiver could receive a WINDOW_UPDATE frame on a "half closed (remote)" + or "closed" stream. A receiver MUST NOT treat this as an error, see . + + + A receiver that receives a flow controlled frame MUST always account for its contribution + against the connection flow control window, unless the receiver treats this as a connection error. This is necessary even if the + frame is in error. Since the sender counts the frame toward the flow control window, if + the receiver does not, the flow control window at sender and receiver can become + different. + + +
    + + Flow control in HTTP/2 is implemented using a window kept by each sender on every + stream. The flow control window is a simple integer value that indicates how many octets + of data the sender is permitted to transmit; as such, its size is a measure of the + buffering capacity of the receiver. + + + Two flow control windows are applicable: the stream flow control window and the + connection flow control window. The sender MUST NOT send a flow controlled frame with a + length that exceeds the space available in either of the flow control windows advertised + by the receiver. Frames with zero length with the END_STREAM flag set (that is, an + empty DATA frame) MAY be sent if there is no available space in either + flow control window. + + + For flow control calculations, the 9 octet frame header is not counted. + + + After sending a flow controlled frame, the sender reduces the space available in both + windows by the length of the transmitted frame. + + + The receiver of a frame sends a WINDOW_UPDATE frame as it consumes data and frees up + space in flow control windows. Separate WINDOW_UPDATE frames are sent for the stream + and connection level flow control windows. + + + A sender that receives a WINDOW_UPDATE frame updates the corresponding window by the + amount specified in the frame. + + + A sender MUST NOT allow a flow control window to exceed 231-1 octets. + If a sender receives a WINDOW_UPDATE that causes a flow control window to exceed this + maximum it MUST terminate either the stream or the connection, as appropriate. For + streams, the sender sends a RST_STREAM with the error code of + FLOW_CONTROL_ERROR code; for the connection, a GOAWAY + frame with a FLOW_CONTROL_ERROR code. + + + Flow controlled frames from the sender and WINDOW_UPDATE frames from the receiver are + completely asynchronous with respect to each other. This property allows a receiver to + aggressively update the window size kept by the sender to prevent streams from stalling. + +
    + +
    + + When an HTTP/2 connection is first established, new streams are created with an initial + flow control window size of 65,535 octets. The connection flow control window is 65,535 + octets. Both endpoints can adjust the initial window size for new streams by including + a value for SETTINGS_INITIAL_WINDOW_SIZE in the SETTINGS + frame that forms part of the connection preface. The connection flow control window can + only be changed using WINDOW_UPDATE frames. + + + Prior to receiving a SETTINGS frame that sets a value for + SETTINGS_INITIAL_WINDOW_SIZE, an endpoint can only use the default + initial window size when sending flow controlled frames. Similarly, the connection flow + control window is set to the default initial window size until a WINDOW_UPDATE frame is + received. + + + A SETTINGS frame can alter the initial flow control window size for all + current streams. When the value of SETTINGS_INITIAL_WINDOW_SIZE changes, + a receiver MUST adjust the size of all stream flow control windows that it maintains by + the difference between the new value and the old value. + + + A change to SETTINGS_INITIAL_WINDOW_SIZE can cause the available space in + a flow control window to become negative. A sender MUST track the negative flow control + window, and MUST NOT send new flow controlled frames until it receives WINDOW_UPDATE + frames that cause the flow control window to become positive. + + + For example, if the client sends 60KB immediately on connection establishment, and the + server sets the initial window size to be 16KB, the client will recalculate the + available flow control window to be -44KB on receipt of the SETTINGS + frame. The client retains a negative flow control window until WINDOW_UPDATE frames + restore the window to being positive, after which the client can resume sending. + + + A SETTINGS frame cannot alter the connection flow control window. + + + An endpoint MUST treat a change to SETTINGS_INITIAL_WINDOW_SIZE that + causes any flow control window to exceed the maximum size as a connection error of type + FLOW_CONTROL_ERROR. + +
    + +
    + + A receiver that wishes to use a smaller flow control window than the current size can + send a new SETTINGS frame. However, the receiver MUST be prepared to + receive data that exceeds this window size, since the sender might send data that + exceeds the lower limit prior to processing the SETTINGS frame. + + + After sending a SETTINGS frame that reduces the initial flow control window size, a + receiver has two options for handling streams that exceed flow control limits: + + + The receiver can immediately send RST_STREAM with + FLOW_CONTROL_ERROR error code for the affected streams. + + + The receiver can accept the streams and tolerate the resulting head of line + blocking, sending WINDOW_UPDATE frames as it consumes data. + + + +
    +
    + +
    + + The CONTINUATION frame (type=0x9) is used to continue a sequence of header block fragments. Any number of CONTINUATION frames can + be sent on an existing stream, as long as the preceding frame is on the same stream and is + a HEADERS, PUSH_PROMISE or CONTINUATION frame without the + END_HEADERS flag set. + + +
    + +
    + + The CONTINUATION frame payload contains a header block + fragment. + + + + The CONTINUATION frame defines the following flag: + + + + Bit 3 being set indicates that this frame ends a header + block. + + + If the END_HEADERS bit is not set, this frame MUST be followed by another + CONTINUATION frame. A receiver MUST treat the receipt of any other type of frame or + a frame on a different stream as a connection + error of type PROTOCOL_ERROR. + + + + + + + The CONTINUATION frame changes the connection state as defined in . + + + + CONTINUATION frames MUST be associated with a stream. If a CONTINUATION frame is received + whose stream identifier field is 0x0, the recipient MUST respond with a connection error of type PROTOCOL_ERROR. + + + + A CONTINUATION frame MUST be preceded by a HEADERS, + PUSH_PROMISE or CONTINUATION frame without the END_HEADERS flag set. A + recipient that observes violation of this rule MUST respond with a connection error of type + PROTOCOL_ERROR. + +
    +
    + +
    + + Error codes are 32-bit fields that are used in RST_STREAM and + GOAWAY frames to convey the reasons for the stream or connection error. + + + + Error codes share a common code space. Some error codes apply only to either streams or the + entire connection and have no defined semantics in the other context. + + + + The following error codes are defined: + + + The associated condition is not as a result of an error. For example, a + GOAWAY might include this code to indicate graceful shutdown of a + connection. + + + The endpoint detected an unspecific protocol error. This error is for use when a more + specific error code is not available. + + + The endpoint encountered an unexpected internal error. + + + The endpoint detected that its peer violated the flow control protocol. + + + The endpoint sent a SETTINGS frame, but did not receive a response in a + timely manner. See Settings Synchronization. + + + The endpoint received a frame after a stream was half closed. + + + The endpoint received a frame with an invalid size. + + + The endpoint refuses the stream prior to performing any application processing, see + for details. + + + Used by the endpoint to indicate that the stream is no longer needed. + + + The endpoint is unable to maintain the header compression context for the connection. + + + The connection established in response to a CONNECT + request was reset or abnormally closed. + + + The endpoint detected that its peer is exhibiting a behavior that might be generating + excessive load. + + + The underlying transport has properties that do not meet minimum security + requirements (see ). + + + + + Unknown or unsupported error codes MUST NOT trigger any special behavior. These MAY be + treated by an implementation as being equivalent to INTERNAL_ERROR. + +
    + +
    + + HTTP/2 is intended to be as compatible as possible with current uses of HTTP. This means + that, from the application perspective, the features of the protocol are largely + unchanged. To achieve this, all request and response semantics are preserved, although the + syntax of conveying those semantics has changed. + + + Thus, the specification and requirements of HTTP/1.1 Semantics and Content , Conditional Requests , Range Requests , Caching and Authentication are applicable to HTTP/2. Selected portions of HTTP/1.1 Message Syntax + and Routing , such as the HTTP and HTTPS URI schemes, are also + applicable in HTTP/2, but the expression of those semantics for this protocol are defined + in the sections below. + + +
    + + A client sends an HTTP request on a new stream, using a previously unused stream identifier. A server sends an HTTP response on + the same stream as the request. + + + An HTTP message (request or response) consists of: + + + for a response only, zero or more HEADERS frames (each followed by zero + or more CONTINUATION frames) containing the message headers of + informational (1xx) HTTP responses (see and ), + and + + + one HEADERS frame (followed by zero or more CONTINUATION + frames) containing the message headers (see ), and + + + zero or more DATA frames containing the message payload (see ), and + + + optionally, one HEADERS frame, followed by zero or more + CONTINUATION frames containing the trailer-part, if present (see ). + + + The last frame in the sequence bears an END_STREAM flag, noting that a + HEADERS frame bearing the END_STREAM flag can be followed by + CONTINUATION frames that carry any remaining portions of the header block. + + + Other frames (from any stream) MUST NOT occur between either HEADERS frame + and any CONTINUATION frames that might follow. + + + + Trailing header fields are carried in a header block that also terminates the stream. + That is, a sequence starting with a HEADERS frame, followed by zero or more + CONTINUATION frames, where the HEADERS frame bears an + END_STREAM flag. Header blocks after the first that do not terminate the stream are not + part of an HTTP request or response. + + + A HEADERS frame (and associated CONTINUATION frames) can + only appear at the start or end of a stream. An endpoint that receives a + HEADERS frame without the END_STREAM flag set after receiving a final + (non-informational) status code MUST treat the corresponding request or response as malformed. + + + + An HTTP request/response exchange fully consumes a single stream. A request starts with + the HEADERS frame that puts the stream into an "open" state. The request + ends with a frame bearing END_STREAM, which causes the stream to become "half closed + (local)" for the client and "half closed (remote)" for the server. A response starts with + a HEADERS frame and ends with a frame bearing END_STREAM, which places the + stream in the "closed" state. + + + +
    + + HTTP/2 removes support for the 101 (Switching Protocols) informational status code + (). + + + The semantics of 101 (Switching Protocols) aren't applicable to a multiplexed protocol. + Alternative protocols are able to use the same mechanisms that HTTP/2 uses to negotiate + their use (see ). + +
    + +
    + + HTTP header fields carry information as a series of key-value pairs. For a listing of + registered HTTP headers, see the Message Header Field Registry maintained at . + + +
    + + While HTTP/1.x used the message start-line (see ) to convey the target URI and method of the request, and the + status code for the response, HTTP/2 uses special pseudo-header fields beginning with + ':' character (ASCII 0x3a) for this purpose. + + + Pseudo-header fields are not HTTP header fields. Endpoints MUST NOT generate + pseudo-header fields other than those defined in this document. + + + Pseudo-header fields are only valid in the context in which they are defined. + Pseudo-header fields defined for requests MUST NOT appear in responses; pseudo-header + fields defined for responses MUST NOT appear in requests. Pseudo-header fields MUST + NOT appear in trailers. Endpoints MUST treat a request or response that contains + undefined or invalid pseudo-header fields as malformed. + + + Just as in HTTP/1.x, header field names are strings of ASCII characters that are + compared in a case-insensitive fashion. However, header field names MUST be converted + to lowercase prior to their encoding in HTTP/2. A request or response containing + uppercase header field names MUST be treated as malformed. + + + All pseudo-header fields MUST appear in the header block before regular header fields. + Any request or response that contains a pseudo-header field that appears in a header + block after a regular header field MUST be treated as malformed. + +
    + +
    + + HTTP/2 does not use the Connection header field to + indicate connection-specific header fields; in this protocol, connection-specific + metadata is conveyed by other means. An endpoint MUST NOT generate a HTTP/2 message + containing connection-specific header fields; any message containing + connection-specific header fields MUST be treated as malformed. + + + This means that an intermediary transforming an HTTP/1.x message to HTTP/2 will need + to remove any header fields nominated by the Connection header field, along with the + Connection header field itself. Such intermediaries SHOULD also remove other + connection-specific header fields, such as Keep-Alive, Proxy-Connection, + Transfer-Encoding and Upgrade, even if they are not nominated by Connection. + + + One exception to this is the TE header field, which MAY be present in an HTTP/2 + request, but when it is MUST NOT contain any value other than "trailers". + + + + + HTTP/2 purposefully does not support upgrade to another protocol. The handshake + methods described in are believed sufficient to + negotiate the use of alternative protocols. + + + +
    + +
    + + The following pseudo-header fields are defined for HTTP/2 requests: + + + + The :method pseudo-header field includes the HTTP + method (). + + + + + The :scheme pseudo-header field includes the scheme + portion of the target URI (). + + + :scheme is not restricted to http and https schemed URIs. A + proxy or gateway can translate requests for non-HTTP schemes, enabling the use + of HTTP to interact with non-HTTP services. + + + + + The :authority pseudo-header field includes the + authority portion of the target URI (). The authority MUST NOT include the deprecated userinfo subcomponent for http + or https schemed URIs. + + + To ensure that the HTTP/1.1 request line can be reproduced accurately, this + pseudo-header field MUST be omitted when translating from an HTTP/1.1 request + that has a request target in origin or asterisk form (see ). Clients that generate + HTTP/2 requests directly SHOULD use the :authority pseudo-header + field instead of the Host header field. An + intermediary that converts an HTTP/2 request to HTTP/1.1 MUST create a Host header field if one is not present in a request by + copying the value of the :authority pseudo-header + field. + + + + + The :path pseudo-header field includes the path and + query parts of the target URI (the path-absolute + production from and optionally a '?' character + followed by the query production, see and ). A request in asterisk form includes the value '*' for the + :path pseudo-header field. + + + This pseudo-header field MUST NOT be empty for http + or https URIs; http or + https URIs that do not contain a path component + MUST include a value of '/'. The exception to this rule is an OPTIONS request + for an http or https + URI that does not include a path component; these MUST include a :path pseudo-header field with a value of '*' (see ). + + + + + + All HTTP/2 requests MUST include exactly one valid value for the :method, :scheme, and :path pseudo-header fields, unless it is a CONNECT request. An HTTP request that omits mandatory + pseudo-header fields is malformed. + + + HTTP/2 does not define a way to carry the version identifier that is included in the + HTTP/1.1 request line. + +
    + +
    + + For HTTP/2 responses, a single :status pseudo-header + field is defined that carries the HTTP status code field (see ). This pseudo-header field MUST be included in all + responses, otherwise the response is malformed. + + + HTTP/2 does not define a way to carry the version or reason phrase that is included in + an HTTP/1.1 status line. + +
    + +
    + + The Cookie header field can carry a significant amount of + redundant data. + + + The Cookie header field uses a semi-colon (";") to delimit cookie-pairs (or "crumbs"). + This header field doesn't follow the list construction rules in HTTP (see ), which prevents cookie-pairs from + being separated into different name-value pairs. This can significantly reduce + compression efficiency as individual cookie-pairs are updated. + + + To allow for better compression efficiency, the Cookie header field MAY be split into + separate header fields, each with one or more cookie-pairs. If there are multiple + Cookie header fields after decompression, these MUST be concatenated into a single + octet string using the two octet delimiter of 0x3B, 0x20 (the ASCII string "; ") + before being passed into a non-HTTP/2 context, such as an HTTP/1.1 connection, or a + generic HTTP server application. + +
    + + Therefore, the following two lists of Cookie header fields are semantically + equivalent. + + +
    +
    + +
    + + A malformed request or response is one that is an otherwise valid sequence of HTTP/2 + frames, but is otherwise invalid due to the presence of extraneous frames, prohibited + header fields, the absence of mandatory header fields, or the inclusion of uppercase + header field names. + + + A request or response that includes an entity body can include a content-length header field. A request or response is also + malformed if the value of a content-length header field + does not equal the sum of the DATA frame payload lengths that form the + body. A response that is defined to have no payload, as described in , can have a non-zero + content-length header field, even though no content is + included in DATA frames. + + + Intermediaries that process HTTP requests or responses (i.e., any intermediary not + acting as a tunnel) MUST NOT forward a malformed request or response. Malformed + requests or responses that are detected MUST be treated as a stream error of type PROTOCOL_ERROR. + + + For malformed requests, a server MAY send an HTTP response prior to closing or + resetting the stream. Clients MUST NOT accept a malformed response. Note that these + requirements are intended to protect against several types of common attacks against + HTTP; they are deliberately strict, because being permissive can expose + implementations to these vulnerabilities. + +
    +
    + +
    + + This section shows HTTP/1.1 requests and responses, with illustrations of equivalent + HTTP/2 requests and responses. + + + An HTTP GET request includes request header fields and no body and is therefore + transmitted as a single HEADERS frame, followed by zero or more + CONTINUATION frames containing the serialized block of request header + fields. The HEADERS frame in the following has both the END_HEADERS and + END_STREAM flags set; no CONTINUATION frames are sent: + + +
    + + END_STREAM + Accept: image/jpeg + END_HEADERS + :method = GET + :scheme = https + :path = /resource + host = example.org + accept = image/jpeg +]]> +
    + + + Similarly, a response that includes only response header fields is transmitted as a + HEADERS frame (again, followed by zero or more + CONTINUATION frames) containing the serialized block of response header + fields. + + +
    + + END_STREAM + Expires: Thu, 23 Jan ... + END_HEADERS + :status = 304 + etag = "xyzzy" + expires = Thu, 23 Jan ... +]]> +
    + + + An HTTP POST request that includes request header fields and payload data is transmitted + as one HEADERS frame, followed by zero or more + CONTINUATION frames containing the request header fields, followed by one + or more DATA frames, with the last CONTINUATION (or + HEADERS) frame having the END_HEADERS flag set and the final + DATA frame having the END_STREAM flag set: + + +
    + - END_STREAM + Content-Type: image/jpeg - END_HEADERS + Content-Length: 123 :method = POST + :path = /resource + {binary data} :scheme = https + + CONTINUATION + + END_HEADERS + content-type = image/jpeg + host = example.org + content-length = 123 + + DATA + + END_STREAM + {binary data} +]]> + + Note that data contributing to any given header field could be spread between header + block fragments. The allocation of header fields to frames in this example is + illustrative only. + +
    + + + A response that includes header fields and payload data is transmitted as a + HEADERS frame, followed by zero or more CONTINUATION + frames, followed by one or more DATA frames, with the last + DATA frame in the sequence having the END_STREAM flag set: + + +
    + - END_STREAM + Content-Length: 123 + END_HEADERS + :status = 200 + {binary data} content-type = image/jpeg + content-length = 123 + + DATA + + END_STREAM + {binary data} +]]> +
    + + + Trailing header fields are sent as a header block after both the request or response + header block and all the DATA frames have been sent. The + HEADERS frame starting the trailers header block has the END_STREAM flag + set. + + +
    + - END_STREAM + Transfer-Encoding: chunked + END_HEADERS + Trailer: Foo :status = 200 + content-length = 123 + 123 content-type = image/jpeg + {binary data} trailer = Foo + 0 + Foo: bar DATA + - END_STREAM + {binary data} + + HEADERS + + END_STREAM + + END_HEADERS + foo = bar +]]> +
    + + +
    + + An informational response using a 1xx status code other than 101 is transmitted as a + HEADERS frame, followed by zero or more CONTINUATION + frames: + + - END_STREAM + + END_HEADERS + :status = 103 + extension-field = bar +]]> +
    +
    + +
    + + In HTTP/1.1, an HTTP client is unable to retry a non-idempotent request when an error + occurs, because there is no means to determine the nature of the error. It is possible + that some server processing occurred prior to the error, which could result in + undesirable effects if the request were reattempted. + + + HTTP/2 provides two mechanisms for providing a guarantee to a client that a request has + not been processed: + + + The GOAWAY frame indicates the highest stream number that might have + been processed. Requests on streams with higher numbers are therefore guaranteed to + be safe to retry. + + + The REFUSED_STREAM error code can be included in a + RST_STREAM frame to indicate that the stream is being closed prior to + any processing having occurred. Any request that was sent on the reset stream can + be safely retried. + + + + + Requests that have not been processed have not failed; clients MAY automatically retry + them, even those with non-idempotent methods. + + + A server MUST NOT indicate that a stream has not been processed unless it can guarantee + that fact. If frames that are on a stream are passed to the application layer for any + stream, then REFUSED_STREAM MUST NOT be used for that stream, and a + GOAWAY frame MUST include a stream identifier that is greater than or + equal to the given stream identifier. + + + In addition to these mechanisms, the PING frame provides a way for a + client to easily test a connection. Connections that remain idle can become broken as + some middleboxes (for instance, network address translators, or load balancers) silently + discard connection bindings. The PING frame allows a client to safely + test whether a connection is still active without sending a request. + +
    +
    + +
    + + HTTP/2 allows a server to pre-emptively send (or "push") responses (along with + corresponding "promised" requests) to a client in association with a previous + client-initiated request. This can be useful when the server knows the client will need + to have those responses available in order to fully process the response to the original + request. + + + + Pushing additional message exchanges in this fashion is optional, and is negotiated + between individual endpoints. The SETTINGS_ENABLE_PUSH setting can be set + to 0 to indicate that server push is disabled. + + + Promised requests MUST be cacheable (see ), MUST be safe (see ) and MUST NOT include a request body. Clients that receive a + promised request that is not cacheable, unsafe or that includes a request body MUST + reset the stream with a stream error of type + PROTOCOL_ERROR. + + + Pushed responses that are cacheable (see ) can be stored by the client, if it implements a HTTP + cache. Pushed responses are considered successfully validated on the origin server (e.g., + if the "no-cache" cache response directive is present) while the stream identified by the + promised stream ID is still open. + + + Pushed responses that are not cacheable MUST NOT be stored by any HTTP cache. They MAY + be made available to the application separately. + + + An intermediary can receive pushes from the server and choose not to forward them on to + the client. In other words, how to make use of the pushed information is up to that + intermediary. Equally, the intermediary might choose to make additional pushes to the + client, without any action taken by the server. + + + A client cannot push. Thus, servers MUST treat the receipt of a + PUSH_PROMISE frame as a connection + error of type PROTOCOL_ERROR. Clients MUST reject any attempt to + change the SETTINGS_ENABLE_PUSH setting to a value other than 0 by treating + the message as a connection error of type + PROTOCOL_ERROR. + + +
    + + Server push is semantically equivalent to a server responding to a request; however, in + this case that request is also sent by the server, as a PUSH_PROMISE + frame. + + + The PUSH_PROMISE frame includes a header block that contains a complete + set of request header fields that the server attributes to the request. It is not + possible to push a response to a request that includes a request body. + + + + Pushed responses are always associated with an explicit request from the client. The + PUSH_PROMISE frames sent by the server are sent on that explicit + request's stream. The PUSH_PROMISE frame also includes a promised stream + identifier, chosen from the stream identifiers available to the server (see ). + + + + The header fields in PUSH_PROMISE and any subsequent + CONTINUATION frames MUST be a valid and complete set of request header fields. The server MUST include a method in + the :method header field that is safe and cacheable. If a + client receives a PUSH_PROMISE that does not include a complete and valid + set of header fields, or the :method header field identifies + a method that is not safe, it MUST respond with a stream error of type PROTOCOL_ERROR. + + + + The server SHOULD send PUSH_PROMISE () + frames prior to sending any frames that reference the promised responses. This avoids a + race where clients issue requests prior to receiving any PUSH_PROMISE + frames. + + + For example, if the server receives a request for a document containing embedded links + to multiple image files, and the server chooses to push those additional images to the + client, sending push promises before the DATA frames that contain the + image links ensures that the client is able to see the promises before discovering + embedded links. Similarly, if the server pushes responses referenced by the header block + (for instance, in Link header fields), sending the push promises before sending the + header block ensures that clients do not request them. + + + + PUSH_PROMISE frames MUST NOT be sent by the client. + + + PUSH_PROMISE frames can be sent by the server in response to any + client-initiated stream, but the stream MUST be in either the "open" or "half closed + (remote)" state with respect to the server. PUSH_PROMISE frames are + interspersed with the frames that comprise a response, though they cannot be + interspersed with HEADERS and CONTINUATION frames that + comprise a single header block. + + + Sending a PUSH_PROMISE frame creates a new stream and puts the stream + into the “reserved (local)” state for the server and the “reserved (remote)” state for + the client. + +
    + +
    + + After sending the PUSH_PROMISE frame, the server can begin delivering the + pushed response as a response on a server-initiated + stream that uses the promised stream identifier. The server uses this stream to + transmit an HTTP response, using the same sequence of frames as defined in . This stream becomes "half closed" + to the client after the initial HEADERS frame is sent. + + + + Once a client receives a PUSH_PROMISE frame and chooses to accept the + pushed response, the client SHOULD NOT issue any requests for the promised response + until after the promised stream has closed. + + + + If the client determines, for any reason, that it does not wish to receive the pushed + response from the server, or if the server takes too long to begin sending the promised + response, the client can send an RST_STREAM frame, using either the + CANCEL or REFUSED_STREAM codes, and referencing the pushed + stream's identifier. + + + A client can use the SETTINGS_MAX_CONCURRENT_STREAMS setting to limit the + number of responses that can be concurrently pushed by a server. Advertising a + SETTINGS_MAX_CONCURRENT_STREAMS value of zero disables server push by + preventing the server from creating the necessary streams. This does not prohibit a + server from sending PUSH_PROMISE frames; clients need to reset any + promised streams that are not wanted. + + + + Clients receiving a pushed response MUST validate that either the server is + authoritative (see ), or the proxy that provided the pushed + response is configured for the corresponding request. For example, a server that offers + a certificate for only the example.com DNS-ID or Common Name + is not permitted to push a response for https://www.example.org/doc. + + + The response for a PUSH_PROMISE stream begins with a + HEADERS frame, which immediately puts the stream into the “half closed + (remote)” state for the server and “half closed (local)” state for the client, and ends + with a frame bearing END_STREAM, which places the stream in the "closed" state. + + + The client never sends a frame with the END_STREAM flag for a server push. + + + +
    + +
    + +
    + + In HTTP/1.x, the pseudo-method CONNECT () is used to convert an HTTP connection into a tunnel to a remote host. + CONNECT is primarily used with HTTP proxies to establish a TLS session with an origin + server for the purposes of interacting with https resources. + + + In HTTP/2, the CONNECT method is used to establish a tunnel over a single HTTP/2 stream to + a remote host, for similar purposes. The HTTP header field mapping works as defined in + Request Header Fields, with a few + differences. Specifically: + + + The :method header field is set to CONNECT. + + + The :scheme and :path header + fields MUST be omitted. + + + The :authority header field contains the host and port to + connect to (equivalent to the authority-form of the request-target of CONNECT + requests, see ). + + + + + A proxy that supports CONNECT establishes a TCP connection to + the server identified in the :authority header field. Once + this connection is successfully established, the proxy sends a HEADERS + frame containing a 2xx series status code to the client, as defined in . + + + After the initial HEADERS frame sent by each peer, all subsequent + DATA frames correspond to data sent on the TCP connection. The payload of + any DATA frames sent by the client is transmitted by the proxy to the TCP + server; data received from the TCP server is assembled into DATA frames by + the proxy. Frame types other than DATA or stream management frames + (RST_STREAM, WINDOW_UPDATE, and PRIORITY) + MUST NOT be sent on a connected stream, and MUST be treated as a stream error if received. + + + The TCP connection can be closed by either peer. The END_STREAM flag on a + DATA frame is treated as being equivalent to the TCP FIN bit. A client is + expected to send a DATA frame with the END_STREAM flag set after receiving + a frame bearing the END_STREAM flag. A proxy that receives a DATA frame + with the END_STREAM flag set sends the attached data with the FIN bit set on the last TCP + segment. A proxy that receives a TCP segment with the FIN bit set sends a + DATA frame with the END_STREAM flag set. Note that the final TCP segment + or DATA frame could be empty. + + + A TCP connection error is signaled with RST_STREAM. A proxy treats any + error in the TCP connection, which includes receiving a TCP segment with the RST bit set, + as a stream error of type + CONNECT_ERROR. Correspondingly, a proxy MUST send a TCP segment with the + RST bit set if it detects an error with the stream or the HTTP/2 connection. + +
    +
    + +
    + + This section outlines attributes of the HTTP protocol that improve interoperability, reduce + exposure to known security vulnerabilities, or reduce the potential for implementation + variation. + + +
    + + HTTP/2 connections are persistent. For best performance, it is expected clients will not + close connections until it is determined that no further communication with a server is + necessary (for example, when a user navigates away from a particular web page), or until + the server closes the connection. + + + Clients SHOULD NOT open more than one HTTP/2 connection to a given host and port pair, + where host is derived from a URI, a selected alternative + service, or a configured proxy. + + + A client can create additional connections as replacements, either to replace connections + that are near to exhausting the available stream + identifier space, to refresh the keying material for a TLS connection, or to + replace connections that have encountered errors. + + + A client MAY open multiple connections to the same IP address and TCP port using different + Server Name Indication values or to provide different TLS + client certificates, but SHOULD avoid creating multiple connections with the same + configuration. + + + Servers are encouraged to maintain open connections for as long as possible, but are + permitted to terminate idle connections if necessary. When either endpoint chooses to + close the transport-layer TCP connection, the terminating endpoint SHOULD first send a + GOAWAY () frame so that both endpoints can reliably + determine whether previously sent frames have been processed and gracefully complete or + terminate any necessary remaining tasks. + + +
    + + Connections that are made to an origin servers, either directly or through a tunnel + created using the CONNECT method MAY be reused for + requests with multiple different URI authority components. A connection can be reused + as long as the origin server is authoritative. For + http resources, this depends on the host having resolved to + the same IP address. + + + For https resources, connection reuse additionally depends + on having a certificate that is valid for the host in the URI. An origin server might + offer a certificate with multiple subjectAltName attributes, + or names with wildcards, one of which is valid for the authority in the URI. For + example, a certificate with a subjectAltName of *.example.com might permit the use of the same connection for + requests to URIs starting with https://a.example.com/ and + https://b.example.com/. + + + In some deployments, reusing a connection for multiple origins can result in requests + being directed to the wrong origin server. For example, TLS termination might be + performed by a middlebox that uses the TLS Server Name Indication + (SNI) extension to select an origin server. This means that it is possible + for clients to send confidential information to servers that might not be the intended + target for the request, even though the server is otherwise authoritative. + + + A server that does not wish clients to reuse connections can indicate that it is not + authoritative for a request by sending a 421 (Misdirected Request) status code in response + to the request (see ). + + + A client that is configured to use a proxy over HTTP/2 directs requests to that proxy + through a single connection. That is, all requests sent via a proxy reuse the + connection to the proxy. + +
    + +
    + + The 421 (Misdirected Request) status code indicates that the request was directed at a + server that is not able to produce a response. This can be sent by a server that is not + configured to produce responses for the combination of scheme and authority that are + included in the request URI. + + + Clients receiving a 421 (Misdirected Request) response from a server MAY retry the + request - whether the request method is idempotent or not - over a different connection. + This is possible if a connection is reused () or if an alternative + service is selected (). + + + This status code MUST NOT be generated by proxies. + + + A 421 response is cacheable by default; i.e., unless otherwise indicated by the method + definition or explicit cache controls (see ). + +
    +
    + +
    + + Implementations of HTTP/2 MUST support TLS 1.2 for HTTP/2 over + TLS. The general TLS usage guidance in SHOULD be followed, with + some additional restrictions that are specific to HTTP/2. + + + + An implementation of HTTP/2 over TLS MUST use TLS 1.2 or higher with the restrictions on + feature set and cipher suite described in this section. Due to implementation + limitations, it might not be possible to fail TLS negotiation. An endpoint MUST + immediately terminate an HTTP/2 connection that does not meet these minimum requirements + with a connection error of type + INADEQUATE_SECURITY. + + +
    + + The TLS implementation MUST support the Server Name Indication + (SNI) extension to TLS. HTTP/2 clients MUST indicate the target domain name when + negotiating TLS. + + + The TLS implementation MUST disable compression. TLS compression can lead to the + exposure of information that would not otherwise be revealed . + Generic compression is unnecessary since HTTP/2 provides compression features that are + more aware of context and therefore likely to be more appropriate for use for + performance, security or other reasons. + + + The TLS implementation MUST disable renegotiation. An endpoint MUST treat a TLS + renegotiation as a connection error of type + PROTOCOL_ERROR. Note that disabling renegotiation can result in + long-lived connections becoming unusable due to limits on the number of messages the + underlying cipher suite can encipher. + + + A client MAY use renegotiation to provide confidentiality protection for client + credentials offered in the handshake, but any renegotiation MUST occur prior to sending + the connection preface. A server SHOULD request a client certificate if it sees a + renegotiation request immediately after establishing a connection. + + + This effectively prevents the use of renegotiation in response to a request for a + specific protected resource. A future specification might provide a way to support this + use case. + +
    + +
    + + The set of TLS cipher suites that are permitted in HTTP/2 is restricted. HTTP/2 MUST + only be used with cipher suites that have ephemeral key exchange, such as the ephemeral Diffie-Hellman (DHE) or the elliptic curve variant (ECDHE). Ephemeral key exchange MUST + have a minimum size of 2048 bits for DHE or security level of 128 bits for ECDHE. + Clients MUST accept DHE sizes of up to 4096 bits. HTTP MUST NOT be used with cipher + suites that use stream or block ciphers. Authenticated Encryption with Additional Data + (AEAD) modes, such as the Galois Counter Model (GCM) mode for + AES are acceptable. + + + The effect of these restrictions is that TLS 1.2 implementations could have + non-intersecting sets of available cipher suites, since these prevent the use of the + cipher suite that TLS 1.2 makes mandatory. To avoid this problem, implementations of + HTTP/2 that use TLS 1.2 MUST support TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 with P256 . + + + Clients MAY advertise support of cipher suites that are prohibited by the above + restrictions in order to allow for connection to servers that do not support HTTP/2. + This enables a fallback to protocols without these constraints without the additional + latency imposed by using a separate connection for fallback. + +
    +
    +
    + +
    +
    + + HTTP/2 relies on the HTTP/1.1 definition of authority for determining whether a server is + authoritative in providing a given response, see . This relies on local name resolution for the "http" + URI scheme, and the authenticated server identity for the "https" scheme (see ). + +
    + +
    + + In a cross-protocol attack, an attacker causes a client to initiate a transaction in one + protocol toward a server that understands a different protocol. An attacker might be able + to cause the transaction to appear as valid transaction in the second protocol. In + combination with the capabilities of the web context, this can be used to interact with + poorly protected servers in private networks. + + + Completing a TLS handshake with an ALPN identifier for HTTP/2 can be considered sufficient + protection against cross protocol attacks. ALPN provides a positive indication that a + server is willing to proceed with HTTP/2, which prevents attacks on other TLS-based + protocols. + + + The encryption in TLS makes it difficult for attackers to control the data which could be + used in a cross-protocol attack on a cleartext protocol. + + + The cleartext version of HTTP/2 has minimal protection against cross-protocol attacks. + The connection preface contains a string that is + designed to confuse HTTP/1.1 servers, but no special protection is offered for other + protocols. A server that is willing to ignore parts of an HTTP/1.1 request containing an + Upgrade header field in addition to the client connection preface could be exposed to a + cross-protocol attack. + +
    + +
    + + HTTP/2 header field names and values are encoded as sequences of octets with a length + prefix. This enables HTTP/2 to carry any string of octets as the name or value of a + header field. An intermediary that translates HTTP/2 requests or responses into HTTP/1.1 + directly could permit the creation of corrupted HTTP/1.1 messages. An attacker might + exploit this behavior to cause the intermediary to create HTTP/1.1 messages with illegal + header fields, extra header fields, or even new messages that are entirely falsified. + + + Header field names or values that contain characters not permitted by HTTP/1.1, including + carriage return (ASCII 0xd) or line feed (ASCII 0xa) MUST NOT be translated verbatim by an + intermediary, as stipulated in . + + + Translation from HTTP/1.x to HTTP/2 does not produce the same opportunity to an attacker. + Intermediaries that perform translation to HTTP/2 MUST remove any instances of the obs-fold production from header field values. + +
    + +
    + + Pushed responses do not have an explicit request from the client; the request + is provided by the server in the PUSH_PROMISE frame. + + + Caching responses that are pushed is possible based on the guidance provided by the origin + server in the Cache-Control header field. However, this can cause issues if a single + server hosts more than one tenant. For example, a server might offer multiple users each + a small portion of its URI space. + + + Where multiple tenants share space on the same server, that server MUST ensure that + tenants are not able to push representations of resources that they do not have authority + over. Failure to enforce this would allow a tenant to provide a representation that would + be served out of cache, overriding the actual representation that the authoritative tenant + provides. + + + Pushed responses for which an origin server is not authoritative (see + ) are never cached or used. + +
    + +
    + + An HTTP/2 connection can demand a greater commitment of resources to operate than a + HTTP/1.1 connection. The use of header compression and flow control depend on a + commitment of resources for storing a greater amount of state. Settings for these + features ensure that memory commitments for these features are strictly bounded. + + + The number of PUSH_PROMISE frames is not constrained in the same fashion. + A client that accepts server push SHOULD limit the number of streams it allows to be in + the "reserved (remote)" state. Excessive number of server push streams can be treated as + a stream error of type + ENHANCE_YOUR_CALM. + + + Processing capacity cannot be guarded as effectively as state capacity. + + + The SETTINGS frame can be abused to cause a peer to expend additional + processing time. This might be done by pointlessly changing SETTINGS parameters, setting + multiple undefined parameters, or changing the same setting multiple times in the same + frame. WINDOW_UPDATE or PRIORITY frames can be abused to + cause an unnecessary waste of resources. + + + Large numbers of small or empty frames can be abused to cause a peer to expend time + processing frame headers. Note however that some uses are entirely legitimate, such as + the sending of an empty DATA frame to end a stream. + + + Header compression also offers some opportunities to waste processing resources; see for more details on potential abuses. + + + Limits in SETTINGS parameters cannot be reduced instantaneously, which + leaves an endpoint exposed to behavior from a peer that could exceed the new limits. In + particular, immediately after establishing a connection, limits set by a server are not + known to clients and could be exceeded without being an obvious protocol violation. + + + All these features - i.e., SETTINGS changes, small frames, header + compression - have legitimate uses. These features become a burden only when they are + used unnecessarily or to excess. + + + An endpoint that doesn't monitor this behavior exposes itself to a risk of denial of + service attack. Implementations SHOULD track the use of these features and set limits on + their use. An endpoint MAY treat activity that is suspicious as a connection error of type + ENHANCE_YOUR_CALM. + + +
    + + A large header block can cause an implementation to + commit a large amount of state. Header fields that are critical for routing can appear + toward the end of a header block, which prevents streaming of header fields to their + ultimate destination. For this an other reasons, such as ensuring cache correctness, + means that an endpoint might need to buffer the entire header block. Since there is no + hard limit to the size of a header block, some endpoints could be forced commit a large + amount of available memory for header fields. + + + An endpoint can use the SETTINGS_MAX_HEADER_LIST_SIZE to advise peers of + limits that might apply on the size of header blocks. This setting is only advisory, so + endpoints MAY choose to send header blocks that exceed this limit and risk having the + request or response being treated as malformed. This setting specific to a connection, + so any request or response could encounter a hop with a lower, unknown limit. An + intermediary can attempt to avoid this problem by passing on values presented by + different peers, but they are not obligated to do so. + + + A server that receives a larger header block than it is willing to handle can send an + HTTP 431 (Request Header Fields Too Large) status code . A + client can discard responses that it cannot process. The header block MUST be processed + to ensure a consistent connection state, unless the connection is closed. + +
    +
    + +
    + + HTTP/2 enables greater use of compression for both header fields () and entity bodies. Compression can allow an attacker to recover + secret data when it is compressed in the same context as data under attacker control. + + + There are demonstrable attacks on compression that exploit the characteristics of the web + (e.g., ). The attacker induces multiple requests containing + varying plaintext, observing the length of the resulting ciphertext in each, which + reveals a shorter length when a guess about the secret is correct. + + + Implementations communicating on a secure channel MUST NOT compress content that includes + both confidential and attacker-controlled data unless separate compression dictionaries + are used for each source of data. Compression MUST NOT be used if the source of data + cannot be reliably determined. Generic stream compression, such as that provided by TLS + MUST NOT be used with HTTP/2 (). + + + Further considerations regarding the compression of header fields are described in . + +
    + +
    + + Padding within HTTP/2 is not intended as a replacement for general purpose padding, such + as might be provided by TLS. Redundant padding could even be + counterproductive. Correct application can depend on having specific knowledge of the + data that is being padded. + + + To mitigate attacks that rely on compression, disabling or limiting compression might be + preferable to padding as a countermeasure. + + + Padding can be used to obscure the exact size of frame content, and is provided to + mitigate specific attacks within HTTP. For example, attacks where compressed content + includes both attacker-controlled plaintext and secret data (see for example, ). + + + Use of padding can result in less protection than might seem immediately obvious. At + best, padding only makes it more difficult for an attacker to infer length information by + increasing the number of frames an attacker has to observe. Incorrectly implemented + padding schemes can be easily defeated. In particular, randomized padding with a + predictable distribution provides very little protection; similarly, padding payloads to a + fixed size exposes information as payload sizes cross the fixed size boundary, which could + be possible if an attacker can control plaintext. + + + Intermediaries SHOULD retain padding for DATA frames, but MAY drop padding + for HEADERS and PUSH_PROMISE frames. A valid reason for an + intermediary to change the amount of padding of frames is to improve the protections that + padding provides. + +
    + +
    + + Several characteristics of HTTP/2 provide an observer an opportunity to correlate actions + of a single client or server over time. This includes the value of settings, the manner + in which flow control windows are managed, the way priorities are allocated to streams, + timing of reactions to stimulus, and handling of any optional features. + + + As far as this creates observable differences in behavior, they could be used as a basis + for fingerprinting a specific client, as defined in . + +
    +
    + +
    + + A string for identifying HTTP/2 is entered into the "Application Layer Protocol Negotiation + (ALPN) Protocol IDs" registry established in . + + + This document establishes a registry for frame types, settings, and error codes. These new + registries are entered into a new "Hypertext Transfer Protocol (HTTP) 2 Parameters" section. + + + This document registers the HTTP2-Settings header field for + use in HTTP; and the 421 (Misdirected Request) status code. + + + This document registers the PRI method for use in HTTP, to avoid + collisions with the connection preface. + + +
    + + This document creates two registrations for the identification of HTTP/2 in the + "Application Layer Protocol Negotiation (ALPN) Protocol IDs" registry established in . + + + The "h2" string identifies HTTP/2 when used over TLS: + + HTTP/2 over TLS + 0x68 0x32 ("h2") + This document + + + + The "h2c" string identifies HTTP/2 when used over cleartext TCP: + + HTTP/2 over TCP + 0x68 0x32 0x63 ("h2c") + This document + + +
    + +
    + + This document establishes a registry for HTTP/2 frame type codes. The "HTTP/2 Frame + Type" registry manages an 8-bit space. The "HTTP/2 Frame Type" registry operates under + either of the "IETF Review" or "IESG Approval" policies for + values between 0x00 and 0xef, with values between 0xf0 and 0xff being reserved for + experimental use. + + + New entries in this registry require the following information: + + + A name or label for the frame type. + + + The 8-bit code assigned to the frame type. + + + A reference to a specification that includes a description of the frame layout, + it's semantics and flags that the frame type uses, including any parts of the frame + that are conditionally present based on the value of flags. + + + + + The entries in the following table are registered by this document. + + + Frame Type + Code + Section + DATA0x0 + HEADERS0x1 + PRIORITY0x2 + RST_STREAM0x3 + SETTINGS0x4 + PUSH_PROMISE0x5 + PING0x6 + GOAWAY0x7 + WINDOW_UPDATE0x8 + CONTINUATION0x9 + +
    + +
    + + This document establishes a registry for HTTP/2 settings. The "HTTP/2 Settings" registry + manages a 16-bit space. The "HTTP/2 Settings" registry operates under the "Expert Review" policy for values in the range from 0x0000 to + 0xefff, with values between and 0xf000 and 0xffff being reserved for experimental use. + + + New registrations are advised to provide the following information: + + + A symbolic name for the setting. Specifying a setting name is optional. + + + The 16-bit code assigned to the setting. + + + An initial value for the setting. + + + An optional reference to a specification that describes the use of the setting. + + + + + An initial set of setting registrations can be found in . + + + Name + Code + Initial Value + Specification + HEADER_TABLE_SIZE + 0x14096 + ENABLE_PUSH + 0x21 + MAX_CONCURRENT_STREAMS + 0x3(infinite) + INITIAL_WINDOW_SIZE + 0x465535 + MAX_FRAME_SIZE + 0x516384 + MAX_HEADER_LIST_SIZE + 0x6(infinite) + + +
    + +
    + + This document establishes a registry for HTTP/2 error codes. The "HTTP/2 Error Code" + registry manages a 32-bit space. The "HTTP/2 Error Code" registry operates under the + "Expert Review" policy. + + + Registrations for error codes are required to include a description of the error code. An + expert reviewer is advised to examine new registrations for possible duplication with + existing error codes. Use of existing registrations is to be encouraged, but not + mandated. + + + New registrations are advised to provide the following information: + + + A name for the error code. Specifying an error code name is optional. + + + The 32-bit error code value. + + + A brief description of the error code semantics, longer if no detailed specification + is provided. + + + An optional reference for a specification that defines the error code. + + + + + The entries in the following table are registered by this document. + + + Name + Code + Description + Specification + NO_ERROR0x0 + Graceful shutdown + + PROTOCOL_ERROR0x1 + Protocol error detected + + INTERNAL_ERROR0x2 + Implementation fault + + FLOW_CONTROL_ERROR0x3 + Flow control limits exceeded + + SETTINGS_TIMEOUT0x4 + Settings not acknowledged + + STREAM_CLOSED0x5 + Frame received for closed stream + + FRAME_SIZE_ERROR0x6 + Frame size incorrect + + REFUSED_STREAM0x7 + Stream not processed + + CANCEL0x8 + Stream cancelled + + COMPRESSION_ERROR0x9 + Compression state not updated + + CONNECT_ERROR0xa + TCP connection error for CONNECT method + + ENHANCE_YOUR_CALM0xb + Processing capacity exceeded + + INADEQUATE_SECURITY0xc + Negotiated TLS parameters not acceptable + + + +
    + +
    + + This section registers the HTTP2-Settings header field in the + Permanent Message Header Field Registry. + + + HTTP2-Settings + + + http + + + standard + + + IETF + + + of this document + + + This header field is only used by an HTTP/2 client for Upgrade-based negotiation. + + + +
    + +
    + + This section registers the PRI method in the HTTP Method + Registry (). + + + PRI + + + No + + + No + + + of this document + + + This method is never used by an actual client. This method will appear to be used + when an HTTP/1.1 server or intermediary attempts to parse an HTTP/2 connection + preface. + + + +
    + +
    + + This document registers the 421 (Misdirected Request) HTTP Status code in the Hypertext + Transfer Protocol (HTTP) Status Code Registry (). + + + + + 421 + + + Misdirected Request + + + of this document + + + +
    + +
    + +
    + + This document includes substantial input from the following individuals: + + + Adam Langley, Wan-Teh Chang, Jim Morrison, Mark Nottingham, Alyssa Wilk, Costin + Manolache, William Chan, Vitaliy Lvin, Joe Chan, Adam Barth, Ryan Hamilton, Gavin + Peters, Kent Alstad, Kevin Lindsay, Paul Amer, Fan Yang, Jonathan Leighton (SPDY + contributors). + + + Gabriel Montenegro and Willy Tarreau (Upgrade mechanism). + + + William Chan, Salvatore Loreto, Osama Mazahir, Gabriel Montenegro, Jitu Padhye, Roberto + Peon, Rob Trace (Flow control). + + + Mike Bishop (Extensibility). + + + Mark Nottingham, Julian Reschke, James Snell, Jeff Pinner, Mike Bishop, Herve Ruellan + (Substantial editorial contributions). + + + Kari Hurtta, Tatsuhiro Tsujikawa, Greg Wilkins, Poul-Henning Kamp. + + + Alexey Melnikov was an editor of this document during 2013. + + + A substantial proportion of Martin's contribution was supported by Microsoft during his + employment there. + + + +
    +
    + + + + + + HPACK - Header Compression for HTTP/2 + + + + + + + + + + + + Transmission Control Protocol + + + University of Southern California (USC)/Information Sciences + Institute + + + + + + + + + + + Key words for use in RFCs to Indicate Requirement Levels + + + Harvard University +
    sob@harvard.edu
    +
    + +
    + + +
    + + + + + HTTP Over TLS + + + + + + + + + + Uniform Resource Identifier (URI): Generic + Syntax + + + + + + + + + + + + The Base16, Base32, and Base64 Data Encodings + + + + + + + + + Guidelines for Writing an IANA Considerations Section in RFCs + + + + + + + + + + + Augmented BNF for Syntax Specifications: ABNF + + + + + + + + + + + The Transport Layer Security (TLS) Protocol Version 1.2 + + + + + + + + + + + Transport Layer Security (TLS) Extensions: Extension Definitions + + + + + + + + + + Transport Layer Security (TLS) Application-Layer Protocol Negotiation Extension + + + + + + + + + + + + + TLS Elliptic Curve Cipher Suites with SHA-256/384 and AES Galois + Counter Mode (GCM) + + + + + + + + + + + Digital Signature Standard (DSS) + + NIST + + + + + + + + + Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing + + Adobe Systems Incorporated +
    fielding@gbiv.com
    +
    + + greenbytes GmbH +
    julian.reschke@greenbytes.de
    +
    + +
    + + +
    + + + + Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content + + Adobe Systems Incorporated +
    fielding@gbiv.com
    +
    + + greenbytes GmbH +
    julian.reschke@greenbytes.de
    +
    + +
    + + +
    + + + Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests + + Adobe Systems Incorporated +
    fielding@gbiv.com
    +
    + + greenbytes GmbH +
    julian.reschke@greenbytes.de
    +
    + +
    + +
    + + + Hypertext Transfer Protocol (HTTP/1.1): Range Requests + + Adobe Systems Incorporated +
    fielding@gbiv.com
    +
    + + World Wide Web Consortium +
    ylafon@w3.org
    +
    + + greenbytes GmbH +
    julian.reschke@greenbytes.de
    +
    + +
    + +
    + + + Hypertext Transfer Protocol (HTTP/1.1): Caching + + Adobe Systems Incorporated +
    fielding@gbiv.com
    +
    + + Akamai +
    mnot@mnot.net
    +
    + + greenbytes GmbH +
    julian.reschke@greenbytes.de
    +
    + +
    + + +
    + + + Hypertext Transfer Protocol (HTTP/1.1): Authentication + + Adobe Systems Incorporated +
    fielding@gbiv.com
    +
    + + greenbytes GmbH +
    julian.reschke@greenbytes.de
    +
    + +
    + + +
    + + + + HTTP State Management Mechanism + + + + + +
    + + + + + + TCP Extensions for High Performance + + + + + + + + + + + + Transport Layer Security Protocol Compression Methods + + + + + + + + + Additional HTTP Status Codes + + + + + + + + + + + Elliptic Curve Cryptography (ECC) Cipher Suites for Transport Layer Security (TLS) + + + + + + + + + + + + + + + AES Galois Counter Mode (GCM) Cipher Suites for TLS + + + + + + + + + + + + HTML5 + + + + + + + + + + + Latest version available at + . + + + + + + + Talking to Yourself for Fun and Profit + + + + + + + + + + + + + + BREACH: Reviving the CRIME Attack + + + + + + + + + + + Registration Procedures for Message Header Fields + + Nine by Nine +
    GK-IETF@ninebynine.org
    +
    + + BEA Systems +
    mnot@pobox.com
    +
    + + HP Labs +
    JeffMogul@acm.org
    +
    + +
    + + +
    + + + + Recommendations for Secure Use of TLS and DTLS + + + + + + + + + + + + + + + + + + HTTP Alternative Services + + + Akamai + + + Mozilla + + + greenbytes + + + + + + +
    + +
    + + This section is to be removed by RFC Editor before publication. + + +
    + + Renamed Not Authoritative status code to Misdirected Request. + +
    + +
    + + Pseudo-header fields are now required to appear strictly before regular ones. + + + Restored 1xx series status codes, except 101. + + + Changed frame length field 24-bits. Expanded frame header to 9 octets. Added a setting + to limit the damage. + + + Added a setting to advise peers of header set size limits. + + + Removed segments. + + + Made non-semantic-bearing HEADERS frames illegal in the HTTP mapping. + +
    + +
    + + Restored extensibility options. + + + Restricting TLS cipher suites to AEAD only. + + + Removing Content-Encoding requirements. + + + Permitting the use of PRIORITY after stream close. + + + Removed ALTSVC frame. + + + Removed BLOCKED frame. + + + Reducing the maximum padding size to 256 octets; removing padding from + CONTINUATION frames. + + + Removed per-frame GZIP compression. + +
    + +
    + + Added BLOCKED frame (at risk). + + + Simplified priority scheme. + + + Added DATA per-frame GZIP compression. + +
    + +
    + + Changed "connection header" to "connection preface" to avoid confusion. + + + Added dependency-based stream prioritization. + + + Added "h2c" identifier to distinguish between cleartext and secured HTTP/2. + + + Adding missing padding to PUSH_PROMISE. + + + Integrate ALTSVC frame and supporting text. + + + Dropping requirement on "deflate" Content-Encoding. + + + Improving security considerations around use of compression. + +
    + +
    + + Adding padding for data frames. + + + Renumbering frame types, error codes, and settings. + + + Adding INADEQUATE_SECURITY error code. + + + Updating TLS usage requirements to 1.2; forbidding TLS compression. + + + Removing extensibility for frames and settings. + + + Changing setting identifier size. + + + Removing the ability to disable flow control. + + + Changing the protocol identification token to "h2". + + + Changing the use of :authority to make it optional and to allow userinfo in non-HTTP + cases. + + + Allowing split on 0x0 for Cookie. + + + Reserved PRI method in HTTP/1.1 to avoid possible future collisions. + +
    + +
    + + Added cookie crumbling for more efficient header compression. + + + Added header field ordering with the value-concatenation mechanism. + +
    + +
    + + Marked draft for implementation. + +
    + +
    + + Adding definition for CONNECT method. + + + Constraining the use of push to safe, cacheable methods with no request body. + + + Changing from :host to :authority to remove any potential confusion. + + + Adding setting for header compression table size. + + + Adding settings acknowledgement. + + + Removing unnecessary and potentially problematic flags from CONTINUATION. + + + Added denial of service considerations. + +
    +
    + + Marking the draft ready for implementation. + + + Renumbering END_PUSH_PROMISE flag. + + + Editorial clarifications and changes. + +
    + +
    + + Added CONTINUATION frame for HEADERS and PUSH_PROMISE. + + + PUSH_PROMISE is no longer implicitly prohibited if SETTINGS_MAX_CONCURRENT_STREAMS is + zero. + + + Push expanded to allow all safe methods without a request body. + + + Clarified the use of HTTP header fields in requests and responses. Prohibited HTTP/1.1 + hop-by-hop header fields. + + + Requiring that intermediaries not forward requests with missing or illegal routing + :-headers. + + + Clarified requirements around handling different frames after stream close, stream reset + and GOAWAY. + + + Added more specific prohibitions for sending of different frame types in various stream + states. + + + Making the last received setting value the effective value. + + + Clarified requirements on TLS version, extension and ciphers. + +
    + +
    + + Committed major restructuring atrocities. + + + Added reference to first header compression draft. + + + Added more formal description of frame lifecycle. + + + Moved END_STREAM (renamed from FINAL) back to HEADERS/DATA. + + + Removed HEADERS+PRIORITY, added optional priority to HEADERS frame. + + + Added PRIORITY frame. + +
    + +
    + + Added continuations to frames carrying header blocks. + + + Replaced use of "session" with "connection" to avoid confusion with other HTTP stateful + concepts, like cookies. + + + Removed "message". + + + Switched to TLS ALPN from NPN. + + + Editorial changes. + +
    + +
    + + Added IANA considerations section for frame types, error codes and settings. + + + Removed data frame compression. + + + Added PUSH_PROMISE. + + + Added globally applicable flags to framing. + + + Removed zlib-based header compression mechanism. + + + Updated references. + + + Clarified stream identifier reuse. + + + Removed CREDENTIALS frame and associated mechanisms. + + + Added advice against naive implementation of flow control. + + + Added session header section. + + + Restructured frame header. Removed distinction between data and control frames. + + + Altered flow control properties to include session-level limits. + + + Added note on cacheability of pushed resources and multiple tenant servers. + + + Changed protocol label form based on discussions. + +
    + +
    + + Changed title throughout. + + + Removed section on Incompatibilities with SPDY draft#2. + + + Changed INTERNAL_ERROR on GOAWAY to have a value of 2 . + + + Replaced abstract and introduction. + + + Added section on starting HTTP/2.0, including upgrade mechanism. + + + Removed unused references. + + + Added flow control principles based on . + +
    + +
    + + Adopted as base for draft-ietf-httpbis-http2. + + + Updated authors/editors list. + + + Added status note. + +
    +
    + +
    +
    + diff --git a/api/vendor/golang.org/x/net/http2/transport.go b/api/vendor/golang.org/x/net/http2/transport.go new file mode 100644 index 0000000..d23a226 --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/transport.go @@ -0,0 +1,2310 @@ +// Copyright 2015 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. + +// Transport code. + +package http2 + +import ( + "bufio" + "bytes" + "compress/gzip" + "crypto/rand" + "crypto/tls" + "errors" + "fmt" + "io" + "io/ioutil" + "log" + "math" + mathrand "math/rand" + "net" + "net/http" + "sort" + "strconv" + "strings" + "sync" + "time" + + "golang.org/x/net/http/httpguts" + "golang.org/x/net/http2/hpack" + "golang.org/x/net/idna" +) + +const ( + // transportDefaultConnFlow is how many connection-level flow control + // tokens we give the server at start-up, past the default 64k. + transportDefaultConnFlow = 1 << 30 + + // transportDefaultStreamFlow is how many stream-level flow + // control tokens we announce to the peer, and how many bytes + // we buffer per stream. + transportDefaultStreamFlow = 4 << 20 + + // transportDefaultStreamMinRefresh is the minimum number of bytes we'll send + // a stream-level WINDOW_UPDATE for at a time. + transportDefaultStreamMinRefresh = 4 << 10 + + defaultUserAgent = "Go-http-client/2.0" +) + +// Transport is an HTTP/2 Transport. +// +// A Transport internally caches connections to servers. It is safe +// for concurrent use by multiple goroutines. +type Transport struct { + // DialTLS specifies an optional dial function for creating + // TLS connections for requests. + // + // If DialTLS is nil, tls.Dial is used. + // + // If the returned net.Conn has a ConnectionState method like tls.Conn, + // it will be used to set http.Response.TLS. + DialTLS func(network, addr string, cfg *tls.Config) (net.Conn, error) + + // TLSClientConfig specifies the TLS configuration to use with + // tls.Client. If nil, the default configuration is used. + TLSClientConfig *tls.Config + + // ConnPool optionally specifies an alternate connection pool to use. + // If nil, the default is used. + ConnPool ClientConnPool + + // DisableCompression, if true, prevents the Transport from + // requesting compression with an "Accept-Encoding: gzip" + // request header when the Request contains no existing + // Accept-Encoding value. If the Transport requests gzip on + // its own and gets a gzipped response, it's transparently + // decoded in the Response.Body. However, if the user + // explicitly requested gzip it is not automatically + // uncompressed. + DisableCompression bool + + // AllowHTTP, if true, permits HTTP/2 requests using the insecure, + // plain-text "http" scheme. Note that this does not enable h2c support. + AllowHTTP bool + + // MaxHeaderListSize is the http2 SETTINGS_MAX_HEADER_LIST_SIZE to + // send in the initial settings frame. It is how many bytes + // of response headers are allowed. Unlike the http2 spec, zero here + // means to use a default limit (currently 10MB). If you actually + // want to advertise an ulimited value to the peer, Transport + // interprets the highest possible value here (0xffffffff or 1<<32-1) + // to mean no limit. + MaxHeaderListSize uint32 + + // t1, if non-nil, is the standard library Transport using + // this transport. Its settings are used (but not its + // RoundTrip method, etc). + t1 *http.Transport + + connPoolOnce sync.Once + connPoolOrDef ClientConnPool // non-nil version of ConnPool +} + +func (t *Transport) maxHeaderListSize() uint32 { + if t.MaxHeaderListSize == 0 { + return 10 << 20 + } + if t.MaxHeaderListSize == 0xffffffff { + return 0 + } + return t.MaxHeaderListSize +} + +func (t *Transport) disableCompression() bool { + return t.DisableCompression || (t.t1 != nil && t.t1.DisableCompression) +} + +var errTransportVersion = errors.New("http2: ConfigureTransport is only supported starting at Go 1.6") + +// ConfigureTransport configures a net/http HTTP/1 Transport to use HTTP/2. +// It requires Go 1.6 or later and returns an error if the net/http package is too old +// or if t1 has already been HTTP/2-enabled. +func ConfigureTransport(t1 *http.Transport) error { + _, err := configureTransport(t1) // in configure_transport.go (go1.6) or not_go16.go + return err +} + +func (t *Transport) connPool() ClientConnPool { + t.connPoolOnce.Do(t.initConnPool) + return t.connPoolOrDef +} + +func (t *Transport) initConnPool() { + if t.ConnPool != nil { + t.connPoolOrDef = t.ConnPool + } else { + t.connPoolOrDef = &clientConnPool{t: t} + } +} + +// ClientConn is the state of a single HTTP/2 client connection to an +// HTTP/2 server. +type ClientConn struct { + t *Transport + tconn net.Conn // usually *tls.Conn, except specialized impls + tlsState *tls.ConnectionState // nil only for specialized impls + singleUse bool // whether being used for a single http.Request + + // readLoop goroutine fields: + readerDone chan struct{} // closed on error + readerErr error // set before readerDone is closed + + idleTimeout time.Duration // or 0 for never + idleTimer *time.Timer + + mu sync.Mutex // guards following + cond *sync.Cond // hold mu; broadcast on flow/closed changes + flow flow // our conn-level flow control quota (cs.flow is per stream) + inflow flow // peer's conn-level flow control + closed bool + wantSettingsAck bool // we sent a SETTINGS frame and haven't heard back + goAway *GoAwayFrame // if non-nil, the GoAwayFrame we received + goAwayDebug string // goAway frame's debug data, retained as a string + streams map[uint32]*clientStream // client-initiated + nextStreamID uint32 + pendingRequests int // requests blocked and waiting to be sent because len(streams) == maxConcurrentStreams + pings map[[8]byte]chan struct{} // in flight ping data to notification channel + bw *bufio.Writer + br *bufio.Reader + fr *Framer + lastActive time.Time + // Settings from peer: (also guarded by mu) + maxFrameSize uint32 + maxConcurrentStreams uint32 + peerMaxHeaderListSize uint64 + initialWindowSize uint32 + + hbuf bytes.Buffer // HPACK encoder writes into this + henc *hpack.Encoder + freeBuf [][]byte + + wmu sync.Mutex // held while writing; acquire AFTER mu if holding both + werr error // first write error that has occurred +} + +// clientStream is the state for a single HTTP/2 stream. One of these +// is created for each Transport.RoundTrip call. +type clientStream struct { + cc *ClientConn + req *http.Request + trace *clientTrace // or nil + ID uint32 + resc chan resAndError + bufPipe pipe // buffered pipe with the flow-controlled response payload + startedWrite bool // started request body write; guarded by cc.mu + requestedGzip bool + on100 func() // optional code to run if get a 100 continue response + + flow flow // guarded by cc.mu + inflow flow // guarded by cc.mu + bytesRemain int64 // -1 means unknown; owned by transportResponseBody.Read + readErr error // sticky read error; owned by transportResponseBody.Read + stopReqBody error // if non-nil, stop writing req body; guarded by cc.mu + didReset bool // whether we sent a RST_STREAM to the server; guarded by cc.mu + + peerReset chan struct{} // closed on peer reset + resetErr error // populated before peerReset is closed + + done chan struct{} // closed when stream remove from cc.streams map; close calls guarded by cc.mu + + // owned by clientConnReadLoop: + firstByte bool // got the first response byte + pastHeaders bool // got first MetaHeadersFrame (actual headers) + pastTrailers bool // got optional second MetaHeadersFrame (trailers) + + trailer http.Header // accumulated trailers + resTrailer *http.Header // client's Response.Trailer +} + +// awaitRequestCancel waits for the user to cancel a request or for the done +// channel to be signaled. A non-nil error is returned only if the request was +// canceled. +func awaitRequestCancel(req *http.Request, done <-chan struct{}) error { + ctx := reqContext(req) + if req.Cancel == nil && ctx.Done() == nil { + return nil + } + select { + case <-req.Cancel: + return errRequestCanceled + case <-ctx.Done(): + return ctx.Err() + case <-done: + return nil + } +} + +// awaitRequestCancel waits for the user to cancel a request, its context to +// expire, or for the request to be done (any way it might be removed from the +// cc.streams map: peer reset, successful completion, TCP connection breakage, +// etc). If the request is canceled, then cs will be canceled and closed. +func (cs *clientStream) awaitRequestCancel(req *http.Request) { + if err := awaitRequestCancel(req, cs.done); err != nil { + cs.cancelStream() + cs.bufPipe.CloseWithError(err) + } +} + +func (cs *clientStream) cancelStream() { + cc := cs.cc + cc.mu.Lock() + didReset := cs.didReset + cs.didReset = true + cc.mu.Unlock() + + if !didReset { + cc.writeStreamReset(cs.ID, ErrCodeCancel, nil) + cc.forgetStreamID(cs.ID) + } +} + +// checkResetOrDone reports any error sent in a RST_STREAM frame by the +// server, or errStreamClosed if the stream is complete. +func (cs *clientStream) checkResetOrDone() error { + select { + case <-cs.peerReset: + return cs.resetErr + case <-cs.done: + return errStreamClosed + default: + return nil + } +} + +func (cs *clientStream) getStartedWrite() bool { + cc := cs.cc + cc.mu.Lock() + defer cc.mu.Unlock() + return cs.startedWrite +} + +func (cs *clientStream) abortRequestBodyWrite(err error) { + if err == nil { + panic("nil error") + } + cc := cs.cc + cc.mu.Lock() + cs.stopReqBody = err + cc.cond.Broadcast() + cc.mu.Unlock() +} + +type stickyErrWriter struct { + w io.Writer + err *error +} + +func (sew stickyErrWriter) Write(p []byte) (n int, err error) { + if *sew.err != nil { + return 0, *sew.err + } + n, err = sew.w.Write(p) + *sew.err = err + return +} + +// noCachedConnError is the concrete type of ErrNoCachedConn, which +// needs to be detected by net/http regardless of whether it's its +// bundled version (in h2_bundle.go with a rewritten type name) or +// from a user's x/net/http2. As such, as it has a unique method name +// (IsHTTP2NoCachedConnError) that net/http sniffs for via func +// isNoCachedConnError. +type noCachedConnError struct{} + +func (noCachedConnError) IsHTTP2NoCachedConnError() {} +func (noCachedConnError) Error() string { return "http2: no cached connection was available" } + +// isNoCachedConnError reports whether err is of type noCachedConnError +// or its equivalent renamed type in net/http2's h2_bundle.go. Both types +// may coexist in the same running program. +func isNoCachedConnError(err error) bool { + _, ok := err.(interface{ IsHTTP2NoCachedConnError() }) + return ok +} + +var ErrNoCachedConn error = noCachedConnError{} + +// RoundTripOpt are options for the Transport.RoundTripOpt method. +type RoundTripOpt struct { + // OnlyCachedConn controls whether RoundTripOpt may + // create a new TCP connection. If set true and + // no cached connection is available, RoundTripOpt + // will return ErrNoCachedConn. + OnlyCachedConn bool +} + +func (t *Transport) RoundTrip(req *http.Request) (*http.Response, error) { + return t.RoundTripOpt(req, RoundTripOpt{}) +} + +// authorityAddr returns a given authority (a host/IP, or host:port / ip:port) +// and returns a host:port. The port 443 is added if needed. +func authorityAddr(scheme string, authority string) (addr string) { + host, port, err := net.SplitHostPort(authority) + if err != nil { // authority didn't have a port + port = "443" + if scheme == "http" { + port = "80" + } + host = authority + } + if a, err := idna.ToASCII(host); err == nil { + host = a + } + // IPv6 address literal, without a port: + if strings.HasPrefix(host, "[") && strings.HasSuffix(host, "]") { + return host + ":" + port + } + return net.JoinHostPort(host, port) +} + +// RoundTripOpt is like RoundTrip, but takes options. +func (t *Transport) RoundTripOpt(req *http.Request, opt RoundTripOpt) (*http.Response, error) { + if !(req.URL.Scheme == "https" || (req.URL.Scheme == "http" && t.AllowHTTP)) { + return nil, errors.New("http2: unsupported scheme") + } + + addr := authorityAddr(req.URL.Scheme, req.URL.Host) + for retry := 0; ; retry++ { + cc, err := t.connPool().GetClientConn(req, addr) + if err != nil { + t.vlogf("http2: Transport failed to get client conn for %s: %v", addr, err) + return nil, err + } + traceGotConn(req, cc) + res, gotErrAfterReqBodyWrite, err := cc.roundTrip(req) + if err != nil && retry <= 6 { + if req, err = shouldRetryRequest(req, err, gotErrAfterReqBodyWrite); err == nil { + // After the first retry, do exponential backoff with 10% jitter. + if retry == 0 { + continue + } + backoff := float64(uint(1) << (uint(retry) - 1)) + backoff += backoff * (0.1 * mathrand.Float64()) + select { + case <-time.After(time.Second * time.Duration(backoff)): + continue + case <-reqContext(req).Done(): + return nil, reqContext(req).Err() + } + } + } + if err != nil { + t.vlogf("RoundTrip failure: %v", err) + return nil, err + } + return res, nil + } +} + +// CloseIdleConnections closes any connections which were previously +// connected from previous requests but are now sitting idle. +// It does not interrupt any connections currently in use. +func (t *Transport) CloseIdleConnections() { + if cp, ok := t.connPool().(clientConnPoolIdleCloser); ok { + cp.closeIdleConnections() + } +} + +var ( + errClientConnClosed = errors.New("http2: client conn is closed") + errClientConnUnusable = errors.New("http2: client conn not usable") + errClientConnGotGoAway = errors.New("http2: Transport received Server's graceful shutdown GOAWAY") +) + +// shouldRetryRequest is called by RoundTrip when a request fails to get +// response headers. It is always called with a non-nil error. +// It returns either a request to retry (either the same request, or a +// modified clone), or an error if the request can't be replayed. +func shouldRetryRequest(req *http.Request, err error, afterBodyWrite bool) (*http.Request, error) { + if !canRetryError(err) { + return nil, err + } + if !afterBodyWrite { + return req, nil + } + // If the Body is nil (or http.NoBody), it's safe to reuse + // this request and its Body. + if req.Body == nil || reqBodyIsNoBody(req.Body) { + return req, nil + } + // Otherwise we depend on the Request having its GetBody + // func defined. + getBody := reqGetBody(req) // Go 1.8: getBody = req.GetBody + if getBody == nil { + return nil, fmt.Errorf("http2: Transport: cannot retry err [%v] after Request.Body was written; define Request.GetBody to avoid this error", err) + } + body, err := getBody() + if err != nil { + return nil, err + } + newReq := *req + newReq.Body = body + return &newReq, nil +} + +func canRetryError(err error) bool { + if err == errClientConnUnusable || err == errClientConnGotGoAway { + return true + } + if se, ok := err.(StreamError); ok { + return se.Code == ErrCodeRefusedStream + } + return false +} + +func (t *Transport) dialClientConn(addr string, singleUse bool) (*ClientConn, error) { + host, _, err := net.SplitHostPort(addr) + if err != nil { + return nil, err + } + tconn, err := t.dialTLS()("tcp", addr, t.newTLSConfig(host)) + if err != nil { + return nil, err + } + return t.newClientConn(tconn, singleUse) +} + +func (t *Transport) newTLSConfig(host string) *tls.Config { + cfg := new(tls.Config) + if t.TLSClientConfig != nil { + *cfg = *cloneTLSConfig(t.TLSClientConfig) + } + if !strSliceContains(cfg.NextProtos, NextProtoTLS) { + cfg.NextProtos = append([]string{NextProtoTLS}, cfg.NextProtos...) + } + if cfg.ServerName == "" { + cfg.ServerName = host + } + return cfg +} + +func (t *Transport) dialTLS() func(string, string, *tls.Config) (net.Conn, error) { + if t.DialTLS != nil { + return t.DialTLS + } + return t.dialTLSDefault +} + +func (t *Transport) dialTLSDefault(network, addr string, cfg *tls.Config) (net.Conn, error) { + cn, err := tls.Dial(network, addr, cfg) + if err != nil { + return nil, err + } + if err := cn.Handshake(); err != nil { + return nil, err + } + if !cfg.InsecureSkipVerify { + if err := cn.VerifyHostname(cfg.ServerName); err != nil { + return nil, err + } + } + state := cn.ConnectionState() + if p := state.NegotiatedProtocol; p != NextProtoTLS { + return nil, fmt.Errorf("http2: unexpected ALPN protocol %q; want %q", p, NextProtoTLS) + } + if !state.NegotiatedProtocolIsMutual { + return nil, errors.New("http2: could not negotiate protocol mutually") + } + return cn, nil +} + +// disableKeepAlives reports whether connections should be closed as +// soon as possible after handling the first request. +func (t *Transport) disableKeepAlives() bool { + return t.t1 != nil && t.t1.DisableKeepAlives +} + +func (t *Transport) expectContinueTimeout() time.Duration { + if t.t1 == nil { + return 0 + } + return transportExpectContinueTimeout(t.t1) +} + +func (t *Transport) NewClientConn(c net.Conn) (*ClientConn, error) { + return t.newClientConn(c, false) +} + +func (t *Transport) newClientConn(c net.Conn, singleUse bool) (*ClientConn, error) { + cc := &ClientConn{ + t: t, + tconn: c, + readerDone: make(chan struct{}), + nextStreamID: 1, + maxFrameSize: 16 << 10, // spec default + initialWindowSize: 65535, // spec default + maxConcurrentStreams: 1000, // "infinite", per spec. 1000 seems good enough. + peerMaxHeaderListSize: 0xffffffffffffffff, // "infinite", per spec. Use 2^64-1 instead. + streams: make(map[uint32]*clientStream), + singleUse: singleUse, + wantSettingsAck: true, + pings: make(map[[8]byte]chan struct{}), + } + if d := t.idleConnTimeout(); d != 0 { + cc.idleTimeout = d + cc.idleTimer = time.AfterFunc(d, cc.onIdleTimeout) + } + if VerboseLogs { + t.vlogf("http2: Transport creating client conn %p to %v", cc, c.RemoteAddr()) + } + + cc.cond = sync.NewCond(&cc.mu) + cc.flow.add(int32(initialWindowSize)) + + // TODO: adjust this writer size to account for frame size + + // MTU + crypto/tls record padding. + cc.bw = bufio.NewWriter(stickyErrWriter{c, &cc.werr}) + cc.br = bufio.NewReader(c) + cc.fr = NewFramer(cc.bw, cc.br) + cc.fr.ReadMetaHeaders = hpack.NewDecoder(initialHeaderTableSize, nil) + cc.fr.MaxHeaderListSize = t.maxHeaderListSize() + + // TODO: SetMaxDynamicTableSize, SetMaxDynamicTableSizeLimit on + // henc in response to SETTINGS frames? + cc.henc = hpack.NewEncoder(&cc.hbuf) + + if t.AllowHTTP { + cc.nextStreamID = 3 + } + + if cs, ok := c.(connectionStater); ok { + state := cs.ConnectionState() + cc.tlsState = &state + } + + initialSettings := []Setting{ + {ID: SettingEnablePush, Val: 0}, + {ID: SettingInitialWindowSize, Val: transportDefaultStreamFlow}, + } + if max := t.maxHeaderListSize(); max != 0 { + initialSettings = append(initialSettings, Setting{ID: SettingMaxHeaderListSize, Val: max}) + } + + cc.bw.Write(clientPreface) + cc.fr.WriteSettings(initialSettings...) + cc.fr.WriteWindowUpdate(0, transportDefaultConnFlow) + cc.inflow.add(transportDefaultConnFlow + initialWindowSize) + cc.bw.Flush() + if cc.werr != nil { + return nil, cc.werr + } + + go cc.readLoop() + return cc, nil +} + +func (cc *ClientConn) setGoAway(f *GoAwayFrame) { + cc.mu.Lock() + defer cc.mu.Unlock() + + old := cc.goAway + cc.goAway = f + + // Merge the previous and current GoAway error frames. + if cc.goAwayDebug == "" { + cc.goAwayDebug = string(f.DebugData()) + } + if old != nil && old.ErrCode != ErrCodeNo { + cc.goAway.ErrCode = old.ErrCode + } + last := f.LastStreamID + for streamID, cs := range cc.streams { + if streamID > last { + select { + case cs.resc <- resAndError{err: errClientConnGotGoAway}: + default: + } + } + } +} + +// CanTakeNewRequest reports whether the connection can take a new request, +// meaning it has not been closed or received or sent a GOAWAY. +func (cc *ClientConn) CanTakeNewRequest() bool { + cc.mu.Lock() + defer cc.mu.Unlock() + return cc.canTakeNewRequestLocked() +} + +func (cc *ClientConn) canTakeNewRequestLocked() bool { + if cc.singleUse && cc.nextStreamID > 1 { + return false + } + return cc.goAway == nil && !cc.closed && + int64(cc.nextStreamID)+int64(cc.pendingRequests) < math.MaxInt32 +} + +// onIdleTimeout is called from a time.AfterFunc goroutine. It will +// only be called when we're idle, but because we're coming from a new +// goroutine, there could be a new request coming in at the same time, +// so this simply calls the synchronized closeIfIdle to shut down this +// connection. The timer could just call closeIfIdle, but this is more +// clear. +func (cc *ClientConn) onIdleTimeout() { + cc.closeIfIdle() +} + +func (cc *ClientConn) closeIfIdle() { + cc.mu.Lock() + if len(cc.streams) > 0 { + cc.mu.Unlock() + return + } + cc.closed = true + nextID := cc.nextStreamID + // TODO: do clients send GOAWAY too? maybe? Just Close: + cc.mu.Unlock() + + if VerboseLogs { + cc.vlogf("http2: Transport closing idle conn %p (forSingleUse=%v, maxStream=%v)", cc, cc.singleUse, nextID-2) + } + cc.tconn.Close() +} + +const maxAllocFrameSize = 512 << 10 + +// frameBuffer returns a scratch buffer suitable for writing DATA frames. +// They're capped at the min of the peer's max frame size or 512KB +// (kinda arbitrarily), but definitely capped so we don't allocate 4GB +// bufers. +func (cc *ClientConn) frameScratchBuffer() []byte { + cc.mu.Lock() + size := cc.maxFrameSize + if size > maxAllocFrameSize { + size = maxAllocFrameSize + } + for i, buf := range cc.freeBuf { + if len(buf) >= int(size) { + cc.freeBuf[i] = nil + cc.mu.Unlock() + return buf[:size] + } + } + cc.mu.Unlock() + return make([]byte, size) +} + +func (cc *ClientConn) putFrameScratchBuffer(buf []byte) { + cc.mu.Lock() + defer cc.mu.Unlock() + const maxBufs = 4 // arbitrary; 4 concurrent requests per conn? investigate. + if len(cc.freeBuf) < maxBufs { + cc.freeBuf = append(cc.freeBuf, buf) + return + } + for i, old := range cc.freeBuf { + if old == nil { + cc.freeBuf[i] = buf + return + } + } + // forget about it. +} + +// errRequestCanceled is a copy of net/http's errRequestCanceled because it's not +// exported. At least they'll be DeepEqual for h1-vs-h2 comparisons tests. +var errRequestCanceled = errors.New("net/http: request canceled") + +func commaSeparatedTrailers(req *http.Request) (string, error) { + keys := make([]string, 0, len(req.Trailer)) + for k := range req.Trailer { + k = http.CanonicalHeaderKey(k) + switch k { + case "Transfer-Encoding", "Trailer", "Content-Length": + return "", &badStringError{"invalid Trailer key", k} + } + keys = append(keys, k) + } + if len(keys) > 0 { + sort.Strings(keys) + return strings.Join(keys, ","), nil + } + return "", nil +} + +func (cc *ClientConn) responseHeaderTimeout() time.Duration { + if cc.t.t1 != nil { + return cc.t.t1.ResponseHeaderTimeout + } + // No way to do this (yet?) with just an http2.Transport. Probably + // no need. Request.Cancel this is the new way. We only need to support + // this for compatibility with the old http.Transport fields when + // we're doing transparent http2. + return 0 +} + +// checkConnHeaders checks whether req has any invalid connection-level headers. +// per RFC 7540 section 8.1.2.2: Connection-Specific Header Fields. +// Certain headers are special-cased as okay but not transmitted later. +func checkConnHeaders(req *http.Request) error { + if v := req.Header.Get("Upgrade"); v != "" { + return fmt.Errorf("http2: invalid Upgrade request header: %q", req.Header["Upgrade"]) + } + if vv := req.Header["Transfer-Encoding"]; len(vv) > 0 && (len(vv) > 1 || vv[0] != "" && vv[0] != "chunked") { + return fmt.Errorf("http2: invalid Transfer-Encoding request header: %q", vv) + } + if vv := req.Header["Connection"]; len(vv) > 0 && (len(vv) > 1 || vv[0] != "" && vv[0] != "close" && vv[0] != "keep-alive") { + return fmt.Errorf("http2: invalid Connection request header: %q", vv) + } + return nil +} + +// actualContentLength returns a sanitized version of +// req.ContentLength, where 0 actually means zero (not unknown) and -1 +// means unknown. +func actualContentLength(req *http.Request) int64 { + if req.Body == nil || reqBodyIsNoBody(req.Body) { + return 0 + } + if req.ContentLength != 0 { + return req.ContentLength + } + return -1 +} + +func (cc *ClientConn) RoundTrip(req *http.Request) (*http.Response, error) { + resp, _, err := cc.roundTrip(req) + return resp, err +} + +func (cc *ClientConn) roundTrip(req *http.Request) (res *http.Response, gotErrAfterReqBodyWrite bool, err error) { + if err := checkConnHeaders(req); err != nil { + return nil, false, err + } + if cc.idleTimer != nil { + cc.idleTimer.Stop() + } + + trailers, err := commaSeparatedTrailers(req) + if err != nil { + return nil, false, err + } + hasTrailers := trailers != "" + + cc.mu.Lock() + if err := cc.awaitOpenSlotForRequest(req); err != nil { + cc.mu.Unlock() + return nil, false, err + } + + body := req.Body + contentLen := actualContentLength(req) + hasBody := contentLen != 0 + + // TODO(bradfitz): this is a copy of the logic in net/http. Unify somewhere? + var requestedGzip bool + if !cc.t.disableCompression() && + req.Header.Get("Accept-Encoding") == "" && + req.Header.Get("Range") == "" && + req.Method != "HEAD" { + // Request gzip only, not deflate. Deflate is ambiguous and + // not as universally supported anyway. + // See: http://www.gzip.org/zlib/zlib_faq.html#faq38 + // + // Note that we don't request this for HEAD requests, + // due to a bug in nginx: + // http://trac.nginx.org/nginx/ticket/358 + // https://golang.org/issue/5522 + // + // We don't request gzip if the request is for a range, since + // auto-decoding a portion of a gzipped document will just fail + // anyway. See https://golang.org/issue/8923 + requestedGzip = true + } + + // we send: HEADERS{1}, CONTINUATION{0,} + DATA{0,} (DATA is + // sent by writeRequestBody below, along with any Trailers, + // again in form HEADERS{1}, CONTINUATION{0,}) + hdrs, err := cc.encodeHeaders(req, requestedGzip, trailers, contentLen) + if err != nil { + cc.mu.Unlock() + return nil, false, err + } + + cs := cc.newStream() + cs.req = req + cs.trace = requestTrace(req) + cs.requestedGzip = requestedGzip + bodyWriter := cc.t.getBodyWriterState(cs, body) + cs.on100 = bodyWriter.on100 + + cc.wmu.Lock() + endStream := !hasBody && !hasTrailers + werr := cc.writeHeaders(cs.ID, endStream, int(cc.maxFrameSize), hdrs) + cc.wmu.Unlock() + traceWroteHeaders(cs.trace) + cc.mu.Unlock() + + if werr != nil { + if hasBody { + req.Body.Close() // per RoundTripper contract + bodyWriter.cancel() + } + cc.forgetStreamID(cs.ID) + // Don't bother sending a RST_STREAM (our write already failed; + // no need to keep writing) + traceWroteRequest(cs.trace, werr) + return nil, false, werr + } + + var respHeaderTimer <-chan time.Time + if hasBody { + bodyWriter.scheduleBodyWrite() + } else { + traceWroteRequest(cs.trace, nil) + if d := cc.responseHeaderTimeout(); d != 0 { + timer := time.NewTimer(d) + defer timer.Stop() + respHeaderTimer = timer.C + } + } + + readLoopResCh := cs.resc + bodyWritten := false + ctx := reqContext(req) + + handleReadLoopResponse := func(re resAndError) (*http.Response, bool, error) { + res := re.res + if re.err != nil || res.StatusCode > 299 { + // On error or status code 3xx, 4xx, 5xx, etc abort any + // ongoing write, assuming that the server doesn't care + // about our request body. If the server replied with 1xx or + // 2xx, however, then assume the server DOES potentially + // want our body (e.g. full-duplex streaming: + // golang.org/issue/13444). If it turns out the server + // doesn't, they'll RST_STREAM us soon enough. This is a + // heuristic to avoid adding knobs to Transport. Hopefully + // we can keep it. + bodyWriter.cancel() + cs.abortRequestBodyWrite(errStopReqBodyWrite) + } + if re.err != nil { + cc.forgetStreamID(cs.ID) + return nil, cs.getStartedWrite(), re.err + } + res.Request = req + res.TLS = cc.tlsState + return res, false, nil + } + + for { + select { + case re := <-readLoopResCh: + return handleReadLoopResponse(re) + case <-respHeaderTimer: + if !hasBody || bodyWritten { + cc.writeStreamReset(cs.ID, ErrCodeCancel, nil) + } else { + bodyWriter.cancel() + cs.abortRequestBodyWrite(errStopReqBodyWriteAndCancel) + } + cc.forgetStreamID(cs.ID) + return nil, cs.getStartedWrite(), errTimeout + case <-ctx.Done(): + if !hasBody || bodyWritten { + cc.writeStreamReset(cs.ID, ErrCodeCancel, nil) + } else { + bodyWriter.cancel() + cs.abortRequestBodyWrite(errStopReqBodyWriteAndCancel) + } + cc.forgetStreamID(cs.ID) + return nil, cs.getStartedWrite(), ctx.Err() + case <-req.Cancel: + if !hasBody || bodyWritten { + cc.writeStreamReset(cs.ID, ErrCodeCancel, nil) + } else { + bodyWriter.cancel() + cs.abortRequestBodyWrite(errStopReqBodyWriteAndCancel) + } + cc.forgetStreamID(cs.ID) + return nil, cs.getStartedWrite(), errRequestCanceled + case <-cs.peerReset: + // processResetStream already removed the + // stream from the streams map; no need for + // forgetStreamID. + return nil, cs.getStartedWrite(), cs.resetErr + case err := <-bodyWriter.resc: + // Prefer the read loop's response, if available. Issue 16102. + select { + case re := <-readLoopResCh: + return handleReadLoopResponse(re) + default: + } + if err != nil { + return nil, cs.getStartedWrite(), err + } + bodyWritten = true + if d := cc.responseHeaderTimeout(); d != 0 { + timer := time.NewTimer(d) + defer timer.Stop() + respHeaderTimer = timer.C + } + } + } +} + +// awaitOpenSlotForRequest waits until len(streams) < maxConcurrentStreams. +// Must hold cc.mu. +func (cc *ClientConn) awaitOpenSlotForRequest(req *http.Request) error { + var waitingForConn chan struct{} + var waitingForConnErr error // guarded by cc.mu + for { + cc.lastActive = time.Now() + if cc.closed || !cc.canTakeNewRequestLocked() { + if waitingForConn != nil { + close(waitingForConn) + } + return errClientConnUnusable + } + if int64(len(cc.streams))+1 <= int64(cc.maxConcurrentStreams) { + if waitingForConn != nil { + close(waitingForConn) + } + return nil + } + // Unfortunately, we cannot wait on a condition variable and channel at + // the same time, so instead, we spin up a goroutine to check if the + // request is canceled while we wait for a slot to open in the connection. + if waitingForConn == nil { + waitingForConn = make(chan struct{}) + go func() { + if err := awaitRequestCancel(req, waitingForConn); err != nil { + cc.mu.Lock() + waitingForConnErr = err + cc.cond.Broadcast() + cc.mu.Unlock() + } + }() + } + cc.pendingRequests++ + cc.cond.Wait() + cc.pendingRequests-- + if waitingForConnErr != nil { + return waitingForConnErr + } + } +} + +// requires cc.wmu be held +func (cc *ClientConn) writeHeaders(streamID uint32, endStream bool, maxFrameSize int, hdrs []byte) error { + first := true // first frame written (HEADERS is first, then CONTINUATION) + for len(hdrs) > 0 && cc.werr == nil { + chunk := hdrs + if len(chunk) > maxFrameSize { + chunk = chunk[:maxFrameSize] + } + hdrs = hdrs[len(chunk):] + endHeaders := len(hdrs) == 0 + if first { + cc.fr.WriteHeaders(HeadersFrameParam{ + StreamID: streamID, + BlockFragment: chunk, + EndStream: endStream, + EndHeaders: endHeaders, + }) + first = false + } else { + cc.fr.WriteContinuation(streamID, endHeaders, chunk) + } + } + // TODO(bradfitz): this Flush could potentially block (as + // could the WriteHeaders call(s) above), which means they + // wouldn't respond to Request.Cancel being readable. That's + // rare, but this should probably be in a goroutine. + cc.bw.Flush() + return cc.werr +} + +// internal error values; they don't escape to callers +var ( + // abort request body write; don't send cancel + errStopReqBodyWrite = errors.New("http2: aborting request body write") + + // abort request body write, but send stream reset of cancel. + errStopReqBodyWriteAndCancel = errors.New("http2: canceling request") +) + +func (cs *clientStream) writeRequestBody(body io.Reader, bodyCloser io.Closer) (err error) { + cc := cs.cc + sentEnd := false // whether we sent the final DATA frame w/ END_STREAM + buf := cc.frameScratchBuffer() + defer cc.putFrameScratchBuffer(buf) + + defer func() { + traceWroteRequest(cs.trace, err) + // TODO: write h12Compare test showing whether + // Request.Body is closed by the Transport, + // and in multiple cases: server replies <=299 and >299 + // while still writing request body + cerr := bodyCloser.Close() + if err == nil { + err = cerr + } + }() + + req := cs.req + hasTrailers := req.Trailer != nil + + var sawEOF bool + for !sawEOF { + n, err := body.Read(buf) + if err == io.EOF { + sawEOF = true + err = nil + } else if err != nil { + return err + } + + remain := buf[:n] + for len(remain) > 0 && err == nil { + var allowed int32 + allowed, err = cs.awaitFlowControl(len(remain)) + switch { + case err == errStopReqBodyWrite: + return err + case err == errStopReqBodyWriteAndCancel: + cc.writeStreamReset(cs.ID, ErrCodeCancel, nil) + return err + case err != nil: + return err + } + cc.wmu.Lock() + data := remain[:allowed] + remain = remain[allowed:] + sentEnd = sawEOF && len(remain) == 0 && !hasTrailers + err = cc.fr.WriteData(cs.ID, sentEnd, data) + if err == nil { + // TODO(bradfitz): this flush is for latency, not bandwidth. + // Most requests won't need this. Make this opt-in or + // opt-out? Use some heuristic on the body type? Nagel-like + // timers? Based on 'n'? Only last chunk of this for loop, + // unless flow control tokens are low? For now, always. + // If we change this, see comment below. + err = cc.bw.Flush() + } + cc.wmu.Unlock() + } + if err != nil { + return err + } + } + + if sentEnd { + // Already sent END_STREAM (which implies we have no + // trailers) and flushed, because currently all + // WriteData frames above get a flush. So we're done. + return nil + } + + var trls []byte + if hasTrailers { + cc.mu.Lock() + trls, err = cc.encodeTrailers(req) + cc.mu.Unlock() + if err != nil { + cc.writeStreamReset(cs.ID, ErrCodeInternal, err) + cc.forgetStreamID(cs.ID) + return err + } + } + + cc.mu.Lock() + maxFrameSize := int(cc.maxFrameSize) + cc.mu.Unlock() + + cc.wmu.Lock() + defer cc.wmu.Unlock() + + // Two ways to send END_STREAM: either with trailers, or + // with an empty DATA frame. + if len(trls) > 0 { + err = cc.writeHeaders(cs.ID, true, maxFrameSize, trls) + } else { + err = cc.fr.WriteData(cs.ID, true, nil) + } + if ferr := cc.bw.Flush(); ferr != nil && err == nil { + err = ferr + } + return err +} + +// awaitFlowControl waits for [1, min(maxBytes, cc.cs.maxFrameSize)] flow +// control tokens from the server. +// It returns either the non-zero number of tokens taken or an error +// if the stream is dead. +func (cs *clientStream) awaitFlowControl(maxBytes int) (taken int32, err error) { + cc := cs.cc + cc.mu.Lock() + defer cc.mu.Unlock() + for { + if cc.closed { + return 0, errClientConnClosed + } + if cs.stopReqBody != nil { + return 0, cs.stopReqBody + } + if err := cs.checkResetOrDone(); err != nil { + return 0, err + } + if a := cs.flow.available(); a > 0 { + take := a + if int(take) > maxBytes { + + take = int32(maxBytes) // can't truncate int; take is int32 + } + if take > int32(cc.maxFrameSize) { + take = int32(cc.maxFrameSize) + } + cs.flow.take(take) + return take, nil + } + cc.cond.Wait() + } +} + +type badStringError struct { + what string + str string +} + +func (e *badStringError) Error() string { return fmt.Sprintf("%s %q", e.what, e.str) } + +// requires cc.mu be held. +func (cc *ClientConn) encodeHeaders(req *http.Request, addGzipHeader bool, trailers string, contentLength int64) ([]byte, error) { + cc.hbuf.Reset() + + host := req.Host + if host == "" { + host = req.URL.Host + } + host, err := httpguts.PunycodeHostPort(host) + if err != nil { + return nil, err + } + + var path string + if req.Method != "CONNECT" { + path = req.URL.RequestURI() + if !validPseudoPath(path) { + orig := path + path = strings.TrimPrefix(path, req.URL.Scheme+"://"+host) + if !validPseudoPath(path) { + if req.URL.Opaque != "" { + return nil, fmt.Errorf("invalid request :path %q from URL.Opaque = %q", orig, req.URL.Opaque) + } else { + return nil, fmt.Errorf("invalid request :path %q", orig) + } + } + } + } + + // Check for any invalid headers and return an error before we + // potentially pollute our hpack state. (We want to be able to + // continue to reuse the hpack encoder for future requests) + for k, vv := range req.Header { + if !httpguts.ValidHeaderFieldName(k) { + return nil, fmt.Errorf("invalid HTTP header name %q", k) + } + for _, v := range vv { + if !httpguts.ValidHeaderFieldValue(v) { + return nil, fmt.Errorf("invalid HTTP header value %q for header %q", v, k) + } + } + } + + enumerateHeaders := func(f func(name, value string)) { + // 8.1.2.3 Request Pseudo-Header Fields + // The :path pseudo-header field includes the path and query parts of the + // target URI (the path-absolute production and optionally a '?' character + // followed by the query production (see Sections 3.3 and 3.4 of + // [RFC3986]). + f(":authority", host) + f(":method", req.Method) + if req.Method != "CONNECT" { + f(":path", path) + f(":scheme", req.URL.Scheme) + } + if trailers != "" { + f("trailer", trailers) + } + + var didUA bool + for k, vv := range req.Header { + if strings.EqualFold(k, "host") || strings.EqualFold(k, "content-length") { + // Host is :authority, already sent. + // Content-Length is automatic, set below. + continue + } else if strings.EqualFold(k, "connection") || strings.EqualFold(k, "proxy-connection") || + strings.EqualFold(k, "transfer-encoding") || strings.EqualFold(k, "upgrade") || + strings.EqualFold(k, "keep-alive") { + // Per 8.1.2.2 Connection-Specific Header + // Fields, don't send connection-specific + // fields. We have already checked if any + // are error-worthy so just ignore the rest. + continue + } else if strings.EqualFold(k, "user-agent") { + // Match Go's http1 behavior: at most one + // User-Agent. If set to nil or empty string, + // then omit it. Otherwise if not mentioned, + // include the default (below). + didUA = true + if len(vv) < 1 { + continue + } + vv = vv[:1] + if vv[0] == "" { + continue + } + + } + + for _, v := range vv { + f(k, v) + } + } + if shouldSendReqContentLength(req.Method, contentLength) { + f("content-length", strconv.FormatInt(contentLength, 10)) + } + if addGzipHeader { + f("accept-encoding", "gzip") + } + if !didUA { + f("user-agent", defaultUserAgent) + } + } + + // Do a first pass over the headers counting bytes to ensure + // we don't exceed cc.peerMaxHeaderListSize. This is done as a + // separate pass before encoding the headers to prevent + // modifying the hpack state. + hlSize := uint64(0) + enumerateHeaders(func(name, value string) { + hf := hpack.HeaderField{Name: name, Value: value} + hlSize += uint64(hf.Size()) + }) + + if hlSize > cc.peerMaxHeaderListSize { + return nil, errRequestHeaderListSize + } + + // Header list size is ok. Write the headers. + enumerateHeaders(func(name, value string) { + cc.writeHeader(strings.ToLower(name), value) + }) + + return cc.hbuf.Bytes(), nil +} + +// shouldSendReqContentLength reports whether the http2.Transport should send +// a "content-length" request header. This logic is basically a copy of the net/http +// transferWriter.shouldSendContentLength. +// The contentLength is the corrected contentLength (so 0 means actually 0, not unknown). +// -1 means unknown. +func shouldSendReqContentLength(method string, contentLength int64) bool { + if contentLength > 0 { + return true + } + if contentLength < 0 { + return false + } + // For zero bodies, whether we send a content-length depends on the method. + // It also kinda doesn't matter for http2 either way, with END_STREAM. + switch method { + case "POST", "PUT", "PATCH": + return true + default: + return false + } +} + +// requires cc.mu be held. +func (cc *ClientConn) encodeTrailers(req *http.Request) ([]byte, error) { + cc.hbuf.Reset() + + hlSize := uint64(0) + for k, vv := range req.Trailer { + for _, v := range vv { + hf := hpack.HeaderField{Name: k, Value: v} + hlSize += uint64(hf.Size()) + } + } + if hlSize > cc.peerMaxHeaderListSize { + return nil, errRequestHeaderListSize + } + + for k, vv := range req.Trailer { + // Transfer-Encoding, etc.. have already been filtered at the + // start of RoundTrip + lowKey := strings.ToLower(k) + for _, v := range vv { + cc.writeHeader(lowKey, v) + } + } + return cc.hbuf.Bytes(), nil +} + +func (cc *ClientConn) writeHeader(name, value string) { + if VerboseLogs { + log.Printf("http2: Transport encoding header %q = %q", name, value) + } + cc.henc.WriteField(hpack.HeaderField{Name: name, Value: value}) +} + +type resAndError struct { + res *http.Response + err error +} + +// requires cc.mu be held. +func (cc *ClientConn) newStream() *clientStream { + cs := &clientStream{ + cc: cc, + ID: cc.nextStreamID, + resc: make(chan resAndError, 1), + peerReset: make(chan struct{}), + done: make(chan struct{}), + } + cs.flow.add(int32(cc.initialWindowSize)) + cs.flow.setConnFlow(&cc.flow) + cs.inflow.add(transportDefaultStreamFlow) + cs.inflow.setConnFlow(&cc.inflow) + cc.nextStreamID += 2 + cc.streams[cs.ID] = cs + return cs +} + +func (cc *ClientConn) forgetStreamID(id uint32) { + cc.streamByID(id, true) +} + +func (cc *ClientConn) streamByID(id uint32, andRemove bool) *clientStream { + cc.mu.Lock() + defer cc.mu.Unlock() + cs := cc.streams[id] + if andRemove && cs != nil && !cc.closed { + cc.lastActive = time.Now() + delete(cc.streams, id) + if len(cc.streams) == 0 && cc.idleTimer != nil { + cc.idleTimer.Reset(cc.idleTimeout) + } + close(cs.done) + // Wake up checkResetOrDone via clientStream.awaitFlowControl and + // wake up RoundTrip if there is a pending request. + cc.cond.Broadcast() + } + return cs +} + +// clientConnReadLoop is the state owned by the clientConn's frame-reading readLoop. +type clientConnReadLoop struct { + cc *ClientConn + closeWhenIdle bool +} + +// readLoop runs in its own goroutine and reads and dispatches frames. +func (cc *ClientConn) readLoop() { + rl := &clientConnReadLoop{cc: cc} + defer rl.cleanup() + cc.readerErr = rl.run() + if ce, ok := cc.readerErr.(ConnectionError); ok { + cc.wmu.Lock() + cc.fr.WriteGoAway(0, ErrCode(ce), nil) + cc.wmu.Unlock() + } +} + +// GoAwayError is returned by the Transport when the server closes the +// TCP connection after sending a GOAWAY frame. +type GoAwayError struct { + LastStreamID uint32 + ErrCode ErrCode + DebugData string +} + +func (e GoAwayError) Error() string { + return fmt.Sprintf("http2: server sent GOAWAY and closed the connection; LastStreamID=%v, ErrCode=%v, debug=%q", + e.LastStreamID, e.ErrCode, e.DebugData) +} + +func isEOFOrNetReadError(err error) bool { + if err == io.EOF { + return true + } + ne, ok := err.(*net.OpError) + return ok && ne.Op == "read" +} + +func (rl *clientConnReadLoop) cleanup() { + cc := rl.cc + defer cc.tconn.Close() + defer cc.t.connPool().MarkDead(cc) + defer close(cc.readerDone) + + if cc.idleTimer != nil { + cc.idleTimer.Stop() + } + + // Close any response bodies if the server closes prematurely. + // TODO: also do this if we've written the headers but not + // gotten a response yet. + err := cc.readerErr + cc.mu.Lock() + if cc.goAway != nil && isEOFOrNetReadError(err) { + err = GoAwayError{ + LastStreamID: cc.goAway.LastStreamID, + ErrCode: cc.goAway.ErrCode, + DebugData: cc.goAwayDebug, + } + } else if err == io.EOF { + err = io.ErrUnexpectedEOF + } + for _, cs := range cc.streams { + cs.bufPipe.CloseWithError(err) // no-op if already closed + select { + case cs.resc <- resAndError{err: err}: + default: + } + close(cs.done) + } + cc.closed = true + cc.cond.Broadcast() + cc.mu.Unlock() +} + +func (rl *clientConnReadLoop) run() error { + cc := rl.cc + rl.closeWhenIdle = cc.t.disableKeepAlives() || cc.singleUse + gotReply := false // ever saw a HEADERS reply + gotSettings := false + for { + f, err := cc.fr.ReadFrame() + if err != nil { + cc.vlogf("http2: Transport readFrame error on conn %p: (%T) %v", cc, err, err) + } + if se, ok := err.(StreamError); ok { + if cs := cc.streamByID(se.StreamID, false); cs != nil { + cs.cc.writeStreamReset(cs.ID, se.Code, err) + cs.cc.forgetStreamID(cs.ID) + if se.Cause == nil { + se.Cause = cc.fr.errDetail + } + rl.endStreamError(cs, se) + } + continue + } else if err != nil { + return err + } + if VerboseLogs { + cc.vlogf("http2: Transport received %s", summarizeFrame(f)) + } + if !gotSettings { + if _, ok := f.(*SettingsFrame); !ok { + cc.logf("protocol error: received %T before a SETTINGS frame", f) + return ConnectionError(ErrCodeProtocol) + } + gotSettings = true + } + maybeIdle := false // whether frame might transition us to idle + + switch f := f.(type) { + case *MetaHeadersFrame: + err = rl.processHeaders(f) + maybeIdle = true + gotReply = true + case *DataFrame: + err = rl.processData(f) + maybeIdle = true + case *GoAwayFrame: + err = rl.processGoAway(f) + maybeIdle = true + case *RSTStreamFrame: + err = rl.processResetStream(f) + maybeIdle = true + case *SettingsFrame: + err = rl.processSettings(f) + case *PushPromiseFrame: + err = rl.processPushPromise(f) + case *WindowUpdateFrame: + err = rl.processWindowUpdate(f) + case *PingFrame: + err = rl.processPing(f) + default: + cc.logf("Transport: unhandled response frame type %T", f) + } + if err != nil { + if VerboseLogs { + cc.vlogf("http2: Transport conn %p received error from processing frame %v: %v", cc, summarizeFrame(f), err) + } + return err + } + if rl.closeWhenIdle && gotReply && maybeIdle { + cc.closeIfIdle() + } + } +} + +func (rl *clientConnReadLoop) processHeaders(f *MetaHeadersFrame) error { + cc := rl.cc + cs := cc.streamByID(f.StreamID, false) + if cs == nil { + // We'd get here if we canceled a request while the + // server had its response still in flight. So if this + // was just something we canceled, ignore it. + return nil + } + if f.StreamEnded() { + // Issue 20521: If the stream has ended, streamByID() causes + // clientStream.done to be closed, which causes the request's bodyWriter + // to be closed with an errStreamClosed, which may be received by + // clientConn.RoundTrip before the result of processing these headers. + // Deferring stream closure allows the header processing to occur first. + // clientConn.RoundTrip may still receive the bodyWriter error first, but + // the fix for issue 16102 prioritises any response. + // + // Issue 22413: If there is no request body, we should close the + // stream before writing to cs.resc so that the stream is closed + // immediately once RoundTrip returns. + if cs.req.Body != nil { + defer cc.forgetStreamID(f.StreamID) + } else { + cc.forgetStreamID(f.StreamID) + } + } + if !cs.firstByte { + if cs.trace != nil { + // TODO(bradfitz): move first response byte earlier, + // when we first read the 9 byte header, not waiting + // until all the HEADERS+CONTINUATION frames have been + // merged. This works for now. + traceFirstResponseByte(cs.trace) + } + cs.firstByte = true + } + if !cs.pastHeaders { + cs.pastHeaders = true + } else { + return rl.processTrailers(cs, f) + } + + res, err := rl.handleResponse(cs, f) + if err != nil { + if _, ok := err.(ConnectionError); ok { + return err + } + // Any other error type is a stream error. + cs.cc.writeStreamReset(f.StreamID, ErrCodeProtocol, err) + cc.forgetStreamID(cs.ID) + cs.resc <- resAndError{err: err} + return nil // return nil from process* funcs to keep conn alive + } + if res == nil { + // (nil, nil) special case. See handleResponse docs. + return nil + } + cs.resTrailer = &res.Trailer + cs.resc <- resAndError{res: res} + return nil +} + +// may return error types nil, or ConnectionError. Any other error value +// is a StreamError of type ErrCodeProtocol. The returned error in that case +// is the detail. +// +// As a special case, handleResponse may return (nil, nil) to skip the +// frame (currently only used for 100 expect continue). This special +// case is going away after Issue 13851 is fixed. +func (rl *clientConnReadLoop) handleResponse(cs *clientStream, f *MetaHeadersFrame) (*http.Response, error) { + if f.Truncated { + return nil, errResponseHeaderListSize + } + + status := f.PseudoValue("status") + if status == "" { + return nil, errors.New("malformed response from server: missing status pseudo header") + } + statusCode, err := strconv.Atoi(status) + if err != nil { + return nil, errors.New("malformed response from server: malformed non-numeric status pseudo header") + } + + if statusCode == 100 { + traceGot100Continue(cs.trace) + if cs.on100 != nil { + cs.on100() // forces any write delay timer to fire + } + cs.pastHeaders = false // do it all again + return nil, nil + } + + header := make(http.Header) + res := &http.Response{ + Proto: "HTTP/2.0", + ProtoMajor: 2, + Header: header, + StatusCode: statusCode, + Status: status + " " + http.StatusText(statusCode), + } + for _, hf := range f.RegularFields() { + key := http.CanonicalHeaderKey(hf.Name) + if key == "Trailer" { + t := res.Trailer + if t == nil { + t = make(http.Header) + res.Trailer = t + } + foreachHeaderElement(hf.Value, func(v string) { + t[http.CanonicalHeaderKey(v)] = nil + }) + } else { + header[key] = append(header[key], hf.Value) + } + } + + streamEnded := f.StreamEnded() + isHead := cs.req.Method == "HEAD" + if !streamEnded || isHead { + res.ContentLength = -1 + if clens := res.Header["Content-Length"]; len(clens) == 1 { + if clen64, err := strconv.ParseInt(clens[0], 10, 64); err == nil { + res.ContentLength = clen64 + } else { + // TODO: care? unlike http/1, it won't mess up our framing, so it's + // more safe smuggling-wise to ignore. + } + } else if len(clens) > 1 { + // TODO: care? unlike http/1, it won't mess up our framing, so it's + // more safe smuggling-wise to ignore. + } + } + + if streamEnded || isHead { + res.Body = noBody + return res, nil + } + + cs.bufPipe = pipe{b: &dataBuffer{expected: res.ContentLength}} + cs.bytesRemain = res.ContentLength + res.Body = transportResponseBody{cs} + go cs.awaitRequestCancel(cs.req) + + if cs.requestedGzip && res.Header.Get("Content-Encoding") == "gzip" { + res.Header.Del("Content-Encoding") + res.Header.Del("Content-Length") + res.ContentLength = -1 + res.Body = &gzipReader{body: res.Body} + setResponseUncompressed(res) + } + return res, nil +} + +func (rl *clientConnReadLoop) processTrailers(cs *clientStream, f *MetaHeadersFrame) error { + if cs.pastTrailers { + // Too many HEADERS frames for this stream. + return ConnectionError(ErrCodeProtocol) + } + cs.pastTrailers = true + if !f.StreamEnded() { + // We expect that any headers for trailers also + // has END_STREAM. + return ConnectionError(ErrCodeProtocol) + } + if len(f.PseudoFields()) > 0 { + // No pseudo header fields are defined for trailers. + // TODO: ConnectionError might be overly harsh? Check. + return ConnectionError(ErrCodeProtocol) + } + + trailer := make(http.Header) + for _, hf := range f.RegularFields() { + key := http.CanonicalHeaderKey(hf.Name) + trailer[key] = append(trailer[key], hf.Value) + } + cs.trailer = trailer + + rl.endStream(cs) + return nil +} + +// transportResponseBody is the concrete type of Transport.RoundTrip's +// Response.Body. It is an io.ReadCloser. On Read, it reads from cs.body. +// On Close it sends RST_STREAM if EOF wasn't already seen. +type transportResponseBody struct { + cs *clientStream +} + +func (b transportResponseBody) Read(p []byte) (n int, err error) { + cs := b.cs + cc := cs.cc + + if cs.readErr != nil { + return 0, cs.readErr + } + n, err = b.cs.bufPipe.Read(p) + if cs.bytesRemain != -1 { + if int64(n) > cs.bytesRemain { + n = int(cs.bytesRemain) + if err == nil { + err = errors.New("net/http: server replied with more than declared Content-Length; truncated") + cc.writeStreamReset(cs.ID, ErrCodeProtocol, err) + } + cs.readErr = err + return int(cs.bytesRemain), err + } + cs.bytesRemain -= int64(n) + if err == io.EOF && cs.bytesRemain > 0 { + err = io.ErrUnexpectedEOF + cs.readErr = err + return n, err + } + } + if n == 0 { + // No flow control tokens to send back. + return + } + + cc.mu.Lock() + defer cc.mu.Unlock() + + var connAdd, streamAdd int32 + // Check the conn-level first, before the stream-level. + if v := cc.inflow.available(); v < transportDefaultConnFlow/2 { + connAdd = transportDefaultConnFlow - v + cc.inflow.add(connAdd) + } + if err == nil { // No need to refresh if the stream is over or failed. + // Consider any buffered body data (read from the conn but not + // consumed by the client) when computing flow control for this + // stream. + v := int(cs.inflow.available()) + cs.bufPipe.Len() + if v < transportDefaultStreamFlow-transportDefaultStreamMinRefresh { + streamAdd = int32(transportDefaultStreamFlow - v) + cs.inflow.add(streamAdd) + } + } + if connAdd != 0 || streamAdd != 0 { + cc.wmu.Lock() + defer cc.wmu.Unlock() + if connAdd != 0 { + cc.fr.WriteWindowUpdate(0, mustUint31(connAdd)) + } + if streamAdd != 0 { + cc.fr.WriteWindowUpdate(cs.ID, mustUint31(streamAdd)) + } + cc.bw.Flush() + } + return +} + +var errClosedResponseBody = errors.New("http2: response body closed") + +func (b transportResponseBody) Close() error { + cs := b.cs + cc := cs.cc + + serverSentStreamEnd := cs.bufPipe.Err() == io.EOF + unread := cs.bufPipe.Len() + + if unread > 0 || !serverSentStreamEnd { + cc.mu.Lock() + cc.wmu.Lock() + if !serverSentStreamEnd { + cc.fr.WriteRSTStream(cs.ID, ErrCodeCancel) + cs.didReset = true + } + // Return connection-level flow control. + if unread > 0 { + cc.inflow.add(int32(unread)) + cc.fr.WriteWindowUpdate(0, uint32(unread)) + } + cc.bw.Flush() + cc.wmu.Unlock() + cc.mu.Unlock() + } + + cs.bufPipe.BreakWithError(errClosedResponseBody) + cc.forgetStreamID(cs.ID) + return nil +} + +func (rl *clientConnReadLoop) processData(f *DataFrame) error { + cc := rl.cc + cs := cc.streamByID(f.StreamID, f.StreamEnded()) + data := f.Data() + if cs == nil { + cc.mu.Lock() + neverSent := cc.nextStreamID + cc.mu.Unlock() + if f.StreamID >= neverSent { + // We never asked for this. + cc.logf("http2: Transport received unsolicited DATA frame; closing connection") + return ConnectionError(ErrCodeProtocol) + } + // We probably did ask for this, but canceled. Just ignore it. + // TODO: be stricter here? only silently ignore things which + // we canceled, but not things which were closed normally + // by the peer? Tough without accumulating too much state. + + // But at least return their flow control: + if f.Length > 0 { + cc.mu.Lock() + cc.inflow.add(int32(f.Length)) + cc.mu.Unlock() + + cc.wmu.Lock() + cc.fr.WriteWindowUpdate(0, uint32(f.Length)) + cc.bw.Flush() + cc.wmu.Unlock() + } + return nil + } + if !cs.firstByte { + cc.logf("protocol error: received DATA before a HEADERS frame") + rl.endStreamError(cs, StreamError{ + StreamID: f.StreamID, + Code: ErrCodeProtocol, + }) + return nil + } + if f.Length > 0 { + if cs.req.Method == "HEAD" && len(data) > 0 { + cc.logf("protocol error: received DATA on a HEAD request") + rl.endStreamError(cs, StreamError{ + StreamID: f.StreamID, + Code: ErrCodeProtocol, + }) + return nil + } + // Check connection-level flow control. + cc.mu.Lock() + if cs.inflow.available() >= int32(f.Length) { + cs.inflow.take(int32(f.Length)) + } else { + cc.mu.Unlock() + return ConnectionError(ErrCodeFlowControl) + } + // Return any padded flow control now, since we won't + // refund it later on body reads. + var refund int + if pad := int(f.Length) - len(data); pad > 0 { + refund += pad + } + // Return len(data) now if the stream is already closed, + // since data will never be read. + didReset := cs.didReset + if didReset { + refund += len(data) + } + if refund > 0 { + cc.inflow.add(int32(refund)) + cc.wmu.Lock() + cc.fr.WriteWindowUpdate(0, uint32(refund)) + if !didReset { + cs.inflow.add(int32(refund)) + cc.fr.WriteWindowUpdate(cs.ID, uint32(refund)) + } + cc.bw.Flush() + cc.wmu.Unlock() + } + cc.mu.Unlock() + + if len(data) > 0 && !didReset { + if _, err := cs.bufPipe.Write(data); err != nil { + rl.endStreamError(cs, err) + return err + } + } + } + + if f.StreamEnded() { + rl.endStream(cs) + } + return nil +} + +var errInvalidTrailers = errors.New("http2: invalid trailers") + +func (rl *clientConnReadLoop) endStream(cs *clientStream) { + // TODO: check that any declared content-length matches, like + // server.go's (*stream).endStream method. + rl.endStreamError(cs, nil) +} + +func (rl *clientConnReadLoop) endStreamError(cs *clientStream, err error) { + var code func() + if err == nil { + err = io.EOF + code = cs.copyTrailers + } + if isConnectionCloseRequest(cs.req) { + rl.closeWhenIdle = true + } + cs.bufPipe.closeWithErrorAndCode(err, code) + + select { + case cs.resc <- resAndError{err: err}: + default: + } +} + +func (cs *clientStream) copyTrailers() { + for k, vv := range cs.trailer { + t := cs.resTrailer + if *t == nil { + *t = make(http.Header) + } + (*t)[k] = vv + } +} + +func (rl *clientConnReadLoop) processGoAway(f *GoAwayFrame) error { + cc := rl.cc + cc.t.connPool().MarkDead(cc) + if f.ErrCode != 0 { + // TODO: deal with GOAWAY more. particularly the error code + cc.vlogf("transport got GOAWAY with error code = %v", f.ErrCode) + } + cc.setGoAway(f) + return nil +} + +func (rl *clientConnReadLoop) processSettings(f *SettingsFrame) error { + cc := rl.cc + cc.mu.Lock() + defer cc.mu.Unlock() + + if f.IsAck() { + if cc.wantSettingsAck { + cc.wantSettingsAck = false + return nil + } + return ConnectionError(ErrCodeProtocol) + } + + err := f.ForeachSetting(func(s Setting) error { + switch s.ID { + case SettingMaxFrameSize: + cc.maxFrameSize = s.Val + case SettingMaxConcurrentStreams: + cc.maxConcurrentStreams = s.Val + case SettingMaxHeaderListSize: + cc.peerMaxHeaderListSize = uint64(s.Val) + case SettingInitialWindowSize: + // Values above the maximum flow-control + // window size of 2^31-1 MUST be treated as a + // connection error (Section 5.4.1) of type + // FLOW_CONTROL_ERROR. + if s.Val > math.MaxInt32 { + return ConnectionError(ErrCodeFlowControl) + } + + // Adjust flow control of currently-open + // frames by the difference of the old initial + // window size and this one. + delta := int32(s.Val) - int32(cc.initialWindowSize) + for _, cs := range cc.streams { + cs.flow.add(delta) + } + cc.cond.Broadcast() + + cc.initialWindowSize = s.Val + default: + // TODO(bradfitz): handle more settings? SETTINGS_HEADER_TABLE_SIZE probably. + cc.vlogf("Unhandled Setting: %v", s) + } + return nil + }) + if err != nil { + return err + } + + cc.wmu.Lock() + defer cc.wmu.Unlock() + + cc.fr.WriteSettingsAck() + cc.bw.Flush() + return cc.werr +} + +func (rl *clientConnReadLoop) processWindowUpdate(f *WindowUpdateFrame) error { + cc := rl.cc + cs := cc.streamByID(f.StreamID, false) + if f.StreamID != 0 && cs == nil { + return nil + } + + cc.mu.Lock() + defer cc.mu.Unlock() + + fl := &cc.flow + if cs != nil { + fl = &cs.flow + } + if !fl.add(int32(f.Increment)) { + return ConnectionError(ErrCodeFlowControl) + } + cc.cond.Broadcast() + return nil +} + +func (rl *clientConnReadLoop) processResetStream(f *RSTStreamFrame) error { + cs := rl.cc.streamByID(f.StreamID, true) + if cs == nil { + // TODO: return error if server tries to RST_STEAM an idle stream + return nil + } + select { + case <-cs.peerReset: + // Already reset. + // This is the only goroutine + // which closes this, so there + // isn't a race. + default: + err := streamError(cs.ID, f.ErrCode) + cs.resetErr = err + close(cs.peerReset) + cs.bufPipe.CloseWithError(err) + cs.cc.cond.Broadcast() // wake up checkResetOrDone via clientStream.awaitFlowControl + } + return nil +} + +// Ping sends a PING frame to the server and waits for the ack. +// Public implementation is in go17.go and not_go17.go +func (cc *ClientConn) ping(ctx contextContext) error { + c := make(chan struct{}) + // Generate a random payload + var p [8]byte + for { + if _, err := rand.Read(p[:]); err != nil { + return err + } + cc.mu.Lock() + // check for dup before insert + if _, found := cc.pings[p]; !found { + cc.pings[p] = c + cc.mu.Unlock() + break + } + cc.mu.Unlock() + } + cc.wmu.Lock() + if err := cc.fr.WritePing(false, p); err != nil { + cc.wmu.Unlock() + return err + } + if err := cc.bw.Flush(); err != nil { + cc.wmu.Unlock() + return err + } + cc.wmu.Unlock() + select { + case <-c: + return nil + case <-ctx.Done(): + return ctx.Err() + case <-cc.readerDone: + // connection closed + return cc.readerErr + } +} + +func (rl *clientConnReadLoop) processPing(f *PingFrame) error { + if f.IsAck() { + cc := rl.cc + cc.mu.Lock() + defer cc.mu.Unlock() + // If ack, notify listener if any + if c, ok := cc.pings[f.Data]; ok { + close(c) + delete(cc.pings, f.Data) + } + return nil + } + cc := rl.cc + cc.wmu.Lock() + defer cc.wmu.Unlock() + if err := cc.fr.WritePing(true, f.Data); err != nil { + return err + } + return cc.bw.Flush() +} + +func (rl *clientConnReadLoop) processPushPromise(f *PushPromiseFrame) error { + // We told the peer we don't want them. + // Spec says: + // "PUSH_PROMISE MUST NOT be sent if the SETTINGS_ENABLE_PUSH + // setting of the peer endpoint is set to 0. An endpoint that + // has set this setting and has received acknowledgement MUST + // treat the receipt of a PUSH_PROMISE frame as a connection + // error (Section 5.4.1) of type PROTOCOL_ERROR." + return ConnectionError(ErrCodeProtocol) +} + +func (cc *ClientConn) writeStreamReset(streamID uint32, code ErrCode, err error) { + // TODO: map err to more interesting error codes, once the + // HTTP community comes up with some. But currently for + // RST_STREAM there's no equivalent to GOAWAY frame's debug + // data, and the error codes are all pretty vague ("cancel"). + cc.wmu.Lock() + cc.fr.WriteRSTStream(streamID, code) + cc.bw.Flush() + cc.wmu.Unlock() +} + +var ( + errResponseHeaderListSize = errors.New("http2: response header list larger than advertised limit") + errRequestHeaderListSize = errors.New("http2: request header list larger than peer's advertised limit") + errPseudoTrailers = errors.New("http2: invalid pseudo header in trailers") +) + +func (cc *ClientConn) logf(format string, args ...interface{}) { + cc.t.logf(format, args...) +} + +func (cc *ClientConn) vlogf(format string, args ...interface{}) { + cc.t.vlogf(format, args...) +} + +func (t *Transport) vlogf(format string, args ...interface{}) { + if VerboseLogs { + t.logf(format, args...) + } +} + +func (t *Transport) logf(format string, args ...interface{}) { + log.Printf(format, args...) +} + +var noBody io.ReadCloser = ioutil.NopCloser(bytes.NewReader(nil)) + +func strSliceContains(ss []string, s string) bool { + for _, v := range ss { + if v == s { + return true + } + } + return false +} + +type erringRoundTripper struct{ err error } + +func (rt erringRoundTripper) RoundTrip(*http.Request) (*http.Response, error) { return nil, rt.err } + +// gzipReader wraps a response body so it can lazily +// call gzip.NewReader on the first call to Read +type gzipReader struct { + body io.ReadCloser // underlying Response.Body + zr *gzip.Reader // lazily-initialized gzip reader + zerr error // sticky error +} + +func (gz *gzipReader) Read(p []byte) (n int, err error) { + if gz.zerr != nil { + return 0, gz.zerr + } + if gz.zr == nil { + gz.zr, err = gzip.NewReader(gz.body) + if err != nil { + gz.zerr = err + return 0, err + } + } + return gz.zr.Read(p) +} + +func (gz *gzipReader) Close() error { + return gz.body.Close() +} + +type errorReader struct{ err error } + +func (r errorReader) Read(p []byte) (int, error) { return 0, r.err } + +// bodyWriterState encapsulates various state around the Transport's writing +// of the request body, particularly regarding doing delayed writes of the body +// when the request contains "Expect: 100-continue". +type bodyWriterState struct { + cs *clientStream + timer *time.Timer // if non-nil, we're doing a delayed write + fnonce *sync.Once // to call fn with + fn func() // the code to run in the goroutine, writing the body + resc chan error // result of fn's execution + delay time.Duration // how long we should delay a delayed write for +} + +func (t *Transport) getBodyWriterState(cs *clientStream, body io.Reader) (s bodyWriterState) { + s.cs = cs + if body == nil { + return + } + resc := make(chan error, 1) + s.resc = resc + s.fn = func() { + cs.cc.mu.Lock() + cs.startedWrite = true + cs.cc.mu.Unlock() + resc <- cs.writeRequestBody(body, cs.req.Body) + } + s.delay = t.expectContinueTimeout() + if s.delay == 0 || + !httpguts.HeaderValuesContainsToken( + cs.req.Header["Expect"], + "100-continue") { + return + } + s.fnonce = new(sync.Once) + + // Arm the timer with a very large duration, which we'll + // intentionally lower later. It has to be large now because + // we need a handle to it before writing the headers, but the + // s.delay value is defined to not start until after the + // request headers were written. + const hugeDuration = 365 * 24 * time.Hour + s.timer = time.AfterFunc(hugeDuration, func() { + s.fnonce.Do(s.fn) + }) + return +} + +func (s bodyWriterState) cancel() { + if s.timer != nil { + s.timer.Stop() + } +} + +func (s bodyWriterState) on100() { + if s.timer == nil { + // If we didn't do a delayed write, ignore the server's + // bogus 100 continue response. + return + } + s.timer.Stop() + go func() { s.fnonce.Do(s.fn) }() +} + +// scheduleBodyWrite starts writing the body, either immediately (in +// the common case) or after the delay timeout. It should not be +// called until after the headers have been written. +func (s bodyWriterState) scheduleBodyWrite() { + if s.timer == nil { + // We're not doing a delayed write (see + // getBodyWriterState), so just start the writing + // goroutine immediately. + go s.fn() + return + } + traceWait100Continue(s.cs.trace) + if s.timer.Stop() { + s.timer.Reset(s.delay) + } +} + +// isConnectionCloseRequest reports whether req should use its own +// connection for a single request and then close the connection. +func isConnectionCloseRequest(req *http.Request) bool { + return req.Close || httpguts.HeaderValuesContainsToken(req.Header["Connection"], "close") +} diff --git a/api/vendor/golang.org/x/net/http2/transport_test.go b/api/vendor/golang.org/x/net/http2/transport_test.go new file mode 100644 index 0000000..636f155 --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/transport_test.go @@ -0,0 +1,3849 @@ +// Copyright 2015 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 http2 + +import ( + "bufio" + "bytes" + "crypto/tls" + "errors" + "flag" + "fmt" + "io" + "io/ioutil" + "log" + "math/rand" + "net" + "net/http" + "net/http/httptest" + "net/url" + "os" + "reflect" + "runtime" + "sort" + "strconv" + "strings" + "sync" + "sync/atomic" + "testing" + "time" + + "golang.org/x/net/http2/hpack" +) + +var ( + extNet = flag.Bool("extnet", false, "do external network tests") + transportHost = flag.String("transporthost", "http2.golang.org", "hostname to use for TestTransport") + insecure = flag.Bool("insecure", false, "insecure TLS dials") // TODO: dead code. remove? +) + +var tlsConfigInsecure = &tls.Config{InsecureSkipVerify: true} + +type testContext struct{} + +func (testContext) Done() <-chan struct{} { return make(chan struct{}) } +func (testContext) Err() error { panic("should not be called") } +func (testContext) Deadline() (deadline time.Time, ok bool) { return time.Time{}, false } +func (testContext) Value(key interface{}) interface{} { return nil } + +func TestTransportExternal(t *testing.T) { + if !*extNet { + t.Skip("skipping external network test") + } + req, _ := http.NewRequest("GET", "https://"+*transportHost+"/", nil) + rt := &Transport{TLSClientConfig: tlsConfigInsecure} + res, err := rt.RoundTrip(req) + if err != nil { + t.Fatalf("%v", err) + } + res.Write(os.Stdout) +} + +type fakeTLSConn struct { + net.Conn +} + +func (c *fakeTLSConn) ConnectionState() tls.ConnectionState { + return tls.ConnectionState{ + Version: tls.VersionTLS12, + CipherSuite: cipher_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, + } +} + +func startH2cServer(t *testing.T) net.Listener { + h2Server := &Server{} + l := newLocalListener(t) + go func() { + conn, err := l.Accept() + if err != nil { + t.Error(err) + return + } + h2Server.ServeConn(&fakeTLSConn{conn}, &ServeConnOpts{Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + fmt.Fprintf(w, "Hello, %v, http: %v", r.URL.Path, r.TLS == nil) + })}) + }() + return l +} + +func TestTransportH2c(t *testing.T) { + l := startH2cServer(t) + defer l.Close() + req, err := http.NewRequest("GET", "http://"+l.Addr().String()+"/foobar", nil) + if err != nil { + t.Fatal(err) + } + tr := &Transport{ + AllowHTTP: true, + DialTLS: func(network, addr string, cfg *tls.Config) (net.Conn, error) { + return net.Dial(network, addr) + }, + } + res, err := tr.RoundTrip(req) + if err != nil { + t.Fatal(err) + } + if res.ProtoMajor != 2 { + t.Fatal("proto not h2c") + } + body, err := ioutil.ReadAll(res.Body) + if err != nil { + t.Fatal(err) + } + if got, want := string(body), "Hello, /foobar, http: true"; got != want { + t.Fatalf("response got %v, want %v", got, want) + } +} + +func TestTransport(t *testing.T) { + const body = "sup" + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + io.WriteString(w, body) + }, optOnlyServer) + defer st.Close() + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + + req, err := http.NewRequest("GET", st.ts.URL, nil) + if err != nil { + t.Fatal(err) + } + res, err := tr.RoundTrip(req) + if err != nil { + t.Fatal(err) + } + defer res.Body.Close() + + t.Logf("Got res: %+v", res) + if g, w := res.StatusCode, 200; g != w { + t.Errorf("StatusCode = %v; want %v", g, w) + } + if g, w := res.Status, "200 OK"; g != w { + t.Errorf("Status = %q; want %q", g, w) + } + wantHeader := http.Header{ + "Content-Length": []string{"3"}, + "X-Content-Type-Options": []string{"nosniff"}, + "Content-Type": []string{"text/plain; charset=utf-8"}, + "Date": []string{"XXX"}, // see cleanDate + } + cleanDate(res) + if !reflect.DeepEqual(res.Header, wantHeader) { + t.Errorf("res Header = %v; want %v", res.Header, wantHeader) + } + if res.Request != req { + t.Errorf("Response.Request = %p; want %p", res.Request, req) + } + if res.TLS == nil { + t.Error("Response.TLS = nil; want non-nil") + } + slurp, err := ioutil.ReadAll(res.Body) + if err != nil { + t.Errorf("Body read: %v", err) + } else if string(slurp) != body { + t.Errorf("Body = %q; want %q", slurp, body) + } +} + +func onSameConn(t *testing.T, modReq func(*http.Request)) bool { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + io.WriteString(w, r.RemoteAddr) + }, optOnlyServer, func(c net.Conn, st http.ConnState) { + t.Logf("conn %v is now state %v", c.RemoteAddr(), st) + }) + defer st.Close() + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + get := func() string { + req, err := http.NewRequest("GET", st.ts.URL, nil) + if err != nil { + t.Fatal(err) + } + modReq(req) + res, err := tr.RoundTrip(req) + if err != nil { + t.Fatal(err) + } + defer res.Body.Close() + slurp, err := ioutil.ReadAll(res.Body) + if err != nil { + t.Fatalf("Body read: %v", err) + } + addr := strings.TrimSpace(string(slurp)) + if addr == "" { + t.Fatalf("didn't get an addr in response") + } + return addr + } + first := get() + second := get() + return first == second +} + +func TestTransportReusesConns(t *testing.T) { + if !onSameConn(t, func(*http.Request) {}) { + t.Errorf("first and second responses were on different connections") + } +} + +func TestTransportReusesConn_RequestClose(t *testing.T) { + if onSameConn(t, func(r *http.Request) { r.Close = true }) { + t.Errorf("first and second responses were not on different connections") + } +} + +func TestTransportReusesConn_ConnClose(t *testing.T) { + if onSameConn(t, func(r *http.Request) { r.Header.Set("Connection", "close") }) { + t.Errorf("first and second responses were not on different connections") + } +} + +// Tests that the Transport only keeps one pending dial open per destination address. +// https://golang.org/issue/13397 +func TestTransportGroupsPendingDials(t *testing.T) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + io.WriteString(w, r.RemoteAddr) + }, optOnlyServer) + defer st.Close() + tr := &Transport{ + TLSClientConfig: tlsConfigInsecure, + } + defer tr.CloseIdleConnections() + var ( + mu sync.Mutex + dials = map[string]int{} + ) + var wg sync.WaitGroup + for i := 0; i < 10; i++ { + wg.Add(1) + go func() { + defer wg.Done() + req, err := http.NewRequest("GET", st.ts.URL, nil) + if err != nil { + t.Error(err) + return + } + res, err := tr.RoundTrip(req) + if err != nil { + t.Error(err) + return + } + defer res.Body.Close() + slurp, err := ioutil.ReadAll(res.Body) + if err != nil { + t.Errorf("Body read: %v", err) + } + addr := strings.TrimSpace(string(slurp)) + if addr == "" { + t.Errorf("didn't get an addr in response") + } + mu.Lock() + dials[addr]++ + mu.Unlock() + }() + } + wg.Wait() + if len(dials) != 1 { + t.Errorf("saw %d dials; want 1: %v", len(dials), dials) + } + tr.CloseIdleConnections() + if err := retry(50, 10*time.Millisecond, func() error { + cp, ok := tr.connPool().(*clientConnPool) + if !ok { + return fmt.Errorf("Conn pool is %T; want *clientConnPool", tr.connPool()) + } + cp.mu.Lock() + defer cp.mu.Unlock() + if len(cp.dialing) != 0 { + return fmt.Errorf("dialing map = %v; want empty", cp.dialing) + } + if len(cp.conns) != 0 { + return fmt.Errorf("conns = %v; want empty", cp.conns) + } + if len(cp.keys) != 0 { + return fmt.Errorf("keys = %v; want empty", cp.keys) + } + return nil + }); err != nil { + t.Errorf("State of pool after CloseIdleConnections: %v", err) + } +} + +func retry(tries int, delay time.Duration, fn func() error) error { + var err error + for i := 0; i < tries; i++ { + err = fn() + if err == nil { + return nil + } + time.Sleep(delay) + } + return err +} + +func TestTransportAbortClosesPipes(t *testing.T) { + shutdown := make(chan struct{}) + st := newServerTester(t, + func(w http.ResponseWriter, r *http.Request) { + w.(http.Flusher).Flush() + <-shutdown + }, + optOnlyServer, + ) + defer st.Close() + defer close(shutdown) // we must shutdown before st.Close() to avoid hanging + + done := make(chan struct{}) + requestMade := make(chan struct{}) + go func() { + defer close(done) + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + req, err := http.NewRequest("GET", st.ts.URL, nil) + if err != nil { + t.Fatal(err) + } + res, err := tr.RoundTrip(req) + if err != nil { + t.Fatal(err) + } + defer res.Body.Close() + close(requestMade) + _, err = ioutil.ReadAll(res.Body) + if err == nil { + t.Error("expected error from res.Body.Read") + } + }() + + <-requestMade + // Now force the serve loop to end, via closing the connection. + st.closeConn() + // deadlock? that's a bug. + select { + case <-done: + case <-time.After(3 * time.Second): + t.Fatal("timeout") + } +} + +// TODO: merge this with TestTransportBody to make TestTransportRequest? This +// could be a table-driven test with extra goodies. +func TestTransportPath(t *testing.T) { + gotc := make(chan *url.URL, 1) + st := newServerTester(t, + func(w http.ResponseWriter, r *http.Request) { + gotc <- r.URL + }, + optOnlyServer, + ) + defer st.Close() + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + const ( + path = "/testpath" + query = "q=1" + ) + surl := st.ts.URL + path + "?" + query + req, err := http.NewRequest("POST", surl, nil) + if err != nil { + t.Fatal(err) + } + c := &http.Client{Transport: tr} + res, err := c.Do(req) + if err != nil { + t.Fatal(err) + } + defer res.Body.Close() + got := <-gotc + if got.Path != path { + t.Errorf("Read Path = %q; want %q", got.Path, path) + } + if got.RawQuery != query { + t.Errorf("Read RawQuery = %q; want %q", got.RawQuery, query) + } +} + +func randString(n int) string { + rnd := rand.New(rand.NewSource(int64(n))) + b := make([]byte, n) + for i := range b { + b[i] = byte(rnd.Intn(256)) + } + return string(b) +} + +type panicReader struct{} + +func (panicReader) Read([]byte) (int, error) { panic("unexpected Read") } +func (panicReader) Close() error { panic("unexpected Close") } + +func TestActualContentLength(t *testing.T) { + tests := []struct { + req *http.Request + want int64 + }{ + // Verify we don't read from Body: + 0: { + req: &http.Request{Body: panicReader{}}, + want: -1, + }, + // nil Body means 0, regardless of ContentLength: + 1: { + req: &http.Request{Body: nil, ContentLength: 5}, + want: 0, + }, + // ContentLength is used if set. + 2: { + req: &http.Request{Body: panicReader{}, ContentLength: 5}, + want: 5, + }, + // http.NoBody means 0, not -1. + 3: { + req: &http.Request{Body: go18httpNoBody()}, + want: 0, + }, + } + for i, tt := range tests { + got := actualContentLength(tt.req) + if got != tt.want { + t.Errorf("test[%d]: got %d; want %d", i, got, tt.want) + } + } +} + +func TestTransportBody(t *testing.T) { + bodyTests := []struct { + body string + noContentLen bool + }{ + {body: "some message"}, + {body: "some message", noContentLen: true}, + {body: strings.Repeat("a", 1<<20), noContentLen: true}, + {body: strings.Repeat("a", 1<<20)}, + {body: randString(16<<10 - 1)}, + {body: randString(16 << 10)}, + {body: randString(16<<10 + 1)}, + {body: randString(512<<10 - 1)}, + {body: randString(512 << 10)}, + {body: randString(512<<10 + 1)}, + {body: randString(1<<20 - 1)}, + {body: randString(1 << 20)}, + {body: randString(1<<20 + 2)}, + } + + type reqInfo struct { + req *http.Request + slurp []byte + err error + } + gotc := make(chan reqInfo, 1) + st := newServerTester(t, + func(w http.ResponseWriter, r *http.Request) { + slurp, err := ioutil.ReadAll(r.Body) + if err != nil { + gotc <- reqInfo{err: err} + } else { + gotc <- reqInfo{req: r, slurp: slurp} + } + }, + optOnlyServer, + ) + defer st.Close() + + for i, tt := range bodyTests { + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + + var body io.Reader = strings.NewReader(tt.body) + if tt.noContentLen { + body = struct{ io.Reader }{body} // just a Reader, hiding concrete type and other methods + } + req, err := http.NewRequest("POST", st.ts.URL, body) + if err != nil { + t.Fatalf("#%d: %v", i, err) + } + c := &http.Client{Transport: tr} + res, err := c.Do(req) + if err != nil { + t.Fatalf("#%d: %v", i, err) + } + defer res.Body.Close() + ri := <-gotc + if ri.err != nil { + t.Errorf("#%d: read error: %v", i, ri.err) + continue + } + if got := string(ri.slurp); got != tt.body { + t.Errorf("#%d: Read body mismatch.\n got: %q (len %d)\nwant: %q (len %d)", i, shortString(got), len(got), shortString(tt.body), len(tt.body)) + } + wantLen := int64(len(tt.body)) + if tt.noContentLen && tt.body != "" { + wantLen = -1 + } + if ri.req.ContentLength != wantLen { + t.Errorf("#%d. handler got ContentLength = %v; want %v", i, ri.req.ContentLength, wantLen) + } + } +} + +func shortString(v string) string { + const maxLen = 100 + if len(v) <= maxLen { + return v + } + return fmt.Sprintf("%v[...%d bytes omitted...]%v", v[:maxLen/2], len(v)-maxLen, v[len(v)-maxLen/2:]) +} + +func TestTransportDialTLS(t *testing.T) { + var mu sync.Mutex // guards following + var gotReq, didDial bool + + ts := newServerTester(t, + func(w http.ResponseWriter, r *http.Request) { + mu.Lock() + gotReq = true + mu.Unlock() + }, + optOnlyServer, + ) + defer ts.Close() + tr := &Transport{ + DialTLS: func(netw, addr string, cfg *tls.Config) (net.Conn, error) { + mu.Lock() + didDial = true + mu.Unlock() + cfg.InsecureSkipVerify = true + c, err := tls.Dial(netw, addr, cfg) + if err != nil { + return nil, err + } + return c, c.Handshake() + }, + } + defer tr.CloseIdleConnections() + client := &http.Client{Transport: tr} + res, err := client.Get(ts.ts.URL) + if err != nil { + t.Fatal(err) + } + res.Body.Close() + mu.Lock() + if !gotReq { + t.Error("didn't get request") + } + if !didDial { + t.Error("didn't use dial hook") + } +} + +func TestConfigureTransport(t *testing.T) { + t1 := &http.Transport{} + err := ConfigureTransport(t1) + if err == errTransportVersion { + t.Skip(err) + } + if err != nil { + t.Fatal(err) + } + if got := fmt.Sprintf("%#v", t1); !strings.Contains(got, `"h2"`) { + // Laziness, to avoid buildtags. + t.Errorf("stringification of HTTP/1 transport didn't contain \"h2\": %v", got) + } + wantNextProtos := []string{"h2", "http/1.1"} + if t1.TLSClientConfig == nil { + t.Errorf("nil t1.TLSClientConfig") + } else if !reflect.DeepEqual(t1.TLSClientConfig.NextProtos, wantNextProtos) { + t.Errorf("TLSClientConfig.NextProtos = %q; want %q", t1.TLSClientConfig.NextProtos, wantNextProtos) + } + if err := ConfigureTransport(t1); err == nil { + t.Error("unexpected success on second call to ConfigureTransport") + } + + // And does it work? + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + io.WriteString(w, r.Proto) + }, optOnlyServer) + defer st.Close() + + t1.TLSClientConfig.InsecureSkipVerify = true + c := &http.Client{Transport: t1} + res, err := c.Get(st.ts.URL) + if err != nil { + t.Fatal(err) + } + slurp, err := ioutil.ReadAll(res.Body) + if err != nil { + t.Fatal(err) + } + if got, want := string(slurp), "HTTP/2.0"; got != want { + t.Errorf("body = %q; want %q", got, want) + } +} + +type capitalizeReader struct { + r io.Reader +} + +func (cr capitalizeReader) Read(p []byte) (n int, err error) { + n, err = cr.r.Read(p) + for i, b := range p[:n] { + if b >= 'a' && b <= 'z' { + p[i] = b - ('a' - 'A') + } + } + return +} + +type flushWriter struct { + w io.Writer +} + +func (fw flushWriter) Write(p []byte) (n int, err error) { + n, err = fw.w.Write(p) + if f, ok := fw.w.(http.Flusher); ok { + f.Flush() + } + return +} + +type clientTester struct { + t *testing.T + tr *Transport + sc, cc net.Conn // server and client conn + fr *Framer // server's framer + client func() error + server func() error +} + +func newClientTester(t *testing.T) *clientTester { + var dialOnce struct { + sync.Mutex + dialed bool + } + ct := &clientTester{ + t: t, + } + ct.tr = &Transport{ + TLSClientConfig: tlsConfigInsecure, + DialTLS: func(network, addr string, cfg *tls.Config) (net.Conn, error) { + dialOnce.Lock() + defer dialOnce.Unlock() + if dialOnce.dialed { + return nil, errors.New("only one dial allowed in test mode") + } + dialOnce.dialed = true + return ct.cc, nil + }, + } + + ln := newLocalListener(t) + cc, err := net.Dial("tcp", ln.Addr().String()) + if err != nil { + t.Fatal(err) + + } + sc, err := ln.Accept() + if err != nil { + t.Fatal(err) + } + ln.Close() + ct.cc = cc + ct.sc = sc + ct.fr = NewFramer(sc, sc) + return ct +} + +func newLocalListener(t *testing.T) net.Listener { + ln, err := net.Listen("tcp4", "127.0.0.1:0") + if err == nil { + return ln + } + ln, err = net.Listen("tcp6", "[::1]:0") + if err != nil { + t.Fatal(err) + } + return ln +} + +func (ct *clientTester) greet(settings ...Setting) { + buf := make([]byte, len(ClientPreface)) + _, err := io.ReadFull(ct.sc, buf) + if err != nil { + ct.t.Fatalf("reading client preface: %v", err) + } + f, err := ct.fr.ReadFrame() + if err != nil { + ct.t.Fatalf("Reading client settings frame: %v", err) + } + if sf, ok := f.(*SettingsFrame); !ok { + ct.t.Fatalf("Wanted client settings frame; got %v", f) + _ = sf // stash it away? + } + if err := ct.fr.WriteSettings(settings...); err != nil { + ct.t.Fatal(err) + } + if err := ct.fr.WriteSettingsAck(); err != nil { + ct.t.Fatal(err) + } +} + +func (ct *clientTester) readNonSettingsFrame() (Frame, error) { + for { + f, err := ct.fr.ReadFrame() + if err != nil { + return nil, err + } + if _, ok := f.(*SettingsFrame); ok { + continue + } + return f, nil + } +} + +func (ct *clientTester) cleanup() { + ct.tr.CloseIdleConnections() +} + +func (ct *clientTester) run() { + errc := make(chan error, 2) + ct.start("client", errc, ct.client) + ct.start("server", errc, ct.server) + defer ct.cleanup() + for i := 0; i < 2; i++ { + if err := <-errc; err != nil { + ct.t.Error(err) + return + } + } +} + +func (ct *clientTester) start(which string, errc chan<- error, fn func() error) { + go func() { + finished := false + var err error + defer func() { + if !finished { + err = fmt.Errorf("%s goroutine didn't finish.", which) + } else if err != nil { + err = fmt.Errorf("%s: %v", which, err) + } + errc <- err + }() + err = fn() + finished = true + }() +} + +func (ct *clientTester) readFrame() (Frame, error) { + return readFrameTimeout(ct.fr, 2*time.Second) +} + +func (ct *clientTester) firstHeaders() (*HeadersFrame, error) { + for { + f, err := ct.readFrame() + if err != nil { + return nil, fmt.Errorf("ReadFrame while waiting for Headers: %v", err) + } + switch f.(type) { + case *WindowUpdateFrame, *SettingsFrame: + continue + } + hf, ok := f.(*HeadersFrame) + if !ok { + return nil, fmt.Errorf("Got %T; want HeadersFrame", f) + } + return hf, nil + } +} + +type countingReader struct { + n *int64 +} + +func (r countingReader) Read(p []byte) (n int, err error) { + for i := range p { + p[i] = byte(i) + } + atomic.AddInt64(r.n, int64(len(p))) + return len(p), err +} + +func TestTransportReqBodyAfterResponse_200(t *testing.T) { testTransportReqBodyAfterResponse(t, 200) } +func TestTransportReqBodyAfterResponse_403(t *testing.T) { testTransportReqBodyAfterResponse(t, 403) } + +func testTransportReqBodyAfterResponse(t *testing.T, status int) { + const bodySize = 10 << 20 + clientDone := make(chan struct{}) + ct := newClientTester(t) + ct.client = func() error { + defer ct.cc.(*net.TCPConn).CloseWrite() + defer close(clientDone) + + var n int64 // atomic + req, err := http.NewRequest("PUT", "https://dummy.tld/", io.LimitReader(countingReader{&n}, bodySize)) + if err != nil { + return err + } + res, err := ct.tr.RoundTrip(req) + if err != nil { + return fmt.Errorf("RoundTrip: %v", err) + } + defer res.Body.Close() + if res.StatusCode != status { + return fmt.Errorf("status code = %v; want %v", res.StatusCode, status) + } + slurp, err := ioutil.ReadAll(res.Body) + if err != nil { + return fmt.Errorf("Slurp: %v", err) + } + if len(slurp) > 0 { + return fmt.Errorf("unexpected body: %q", slurp) + } + if status == 200 { + if got := atomic.LoadInt64(&n); got != bodySize { + return fmt.Errorf("For 200 response, Transport wrote %d bytes; want %d", got, bodySize) + } + } else { + if got := atomic.LoadInt64(&n); got == 0 || got >= bodySize { + return fmt.Errorf("For %d response, Transport wrote %d bytes; want (0,%d) exclusive", status, got, bodySize) + } + } + return nil + } + ct.server = func() error { + ct.greet() + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + var dataRecv int64 + var closed bool + for { + f, err := ct.fr.ReadFrame() + if err != nil { + select { + case <-clientDone: + // If the client's done, it + // will have reported any + // errors on its side. + return nil + default: + return err + } + } + //println(fmt.Sprintf("server got frame: %v", f)) + switch f := f.(type) { + case *WindowUpdateFrame, *SettingsFrame: + case *HeadersFrame: + if !f.HeadersEnded() { + return fmt.Errorf("headers should have END_HEADERS be ended: %v", f) + } + if f.StreamEnded() { + return fmt.Errorf("headers contains END_STREAM unexpectedly: %v", f) + } + case *DataFrame: + dataLen := len(f.Data()) + if dataLen > 0 { + if dataRecv == 0 { + enc.WriteField(hpack.HeaderField{Name: ":status", Value: strconv.Itoa(status)}) + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: f.StreamID, + EndHeaders: true, + EndStream: false, + BlockFragment: buf.Bytes(), + }) + } + if err := ct.fr.WriteWindowUpdate(0, uint32(dataLen)); err != nil { + return err + } + if err := ct.fr.WriteWindowUpdate(f.StreamID, uint32(dataLen)); err != nil { + return err + } + } + dataRecv += int64(dataLen) + + if !closed && ((status != 200 && dataRecv > 0) || + (status == 200 && dataRecv == bodySize)) { + closed = true + if err := ct.fr.WriteData(f.StreamID, true, nil); err != nil { + return err + } + } + default: + return fmt.Errorf("Unexpected client frame %v", f) + } + } + } + ct.run() +} + +// See golang.org/issue/13444 +func TestTransportFullDuplex(t *testing.T) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(200) // redundant but for clarity + w.(http.Flusher).Flush() + io.Copy(flushWriter{w}, capitalizeReader{r.Body}) + fmt.Fprintf(w, "bye.\n") + }, optOnlyServer) + defer st.Close() + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + c := &http.Client{Transport: tr} + + pr, pw := io.Pipe() + req, err := http.NewRequest("PUT", st.ts.URL, ioutil.NopCloser(pr)) + if err != nil { + t.Fatal(err) + } + req.ContentLength = -1 + res, err := c.Do(req) + if err != nil { + t.Fatal(err) + } + defer res.Body.Close() + if res.StatusCode != 200 { + t.Fatalf("StatusCode = %v; want %v", res.StatusCode, 200) + } + bs := bufio.NewScanner(res.Body) + want := func(v string) { + if !bs.Scan() { + t.Fatalf("wanted to read %q but Scan() = false, err = %v", v, bs.Err()) + } + } + write := func(v string) { + _, err := io.WriteString(pw, v) + if err != nil { + t.Fatalf("pipe write: %v", err) + } + } + write("foo\n") + want("FOO") + write("bar\n") + want("BAR") + pw.Close() + want("bye.") + if err := bs.Err(); err != nil { + t.Fatal(err) + } +} + +func TestTransportConnectRequest(t *testing.T) { + gotc := make(chan *http.Request, 1) + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + gotc <- r + }, optOnlyServer) + defer st.Close() + + u, err := url.Parse(st.ts.URL) + if err != nil { + t.Fatal(err) + } + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + c := &http.Client{Transport: tr} + + tests := []struct { + req *http.Request + want string + }{ + { + req: &http.Request{ + Method: "CONNECT", + Header: http.Header{}, + URL: u, + }, + want: u.Host, + }, + { + req: &http.Request{ + Method: "CONNECT", + Header: http.Header{}, + URL: u, + Host: "example.com:123", + }, + want: "example.com:123", + }, + } + + for i, tt := range tests { + res, err := c.Do(tt.req) + if err != nil { + t.Errorf("%d. RoundTrip = %v", i, err) + continue + } + res.Body.Close() + req := <-gotc + if req.Method != "CONNECT" { + t.Errorf("method = %q; want CONNECT", req.Method) + } + if req.Host != tt.want { + t.Errorf("Host = %q; want %q", req.Host, tt.want) + } + if req.URL.Host != tt.want { + t.Errorf("URL.Host = %q; want %q", req.URL.Host, tt.want) + } + } +} + +type headerType int + +const ( + noHeader headerType = iota // omitted + oneHeader + splitHeader // broken into continuation on purpose +) + +const ( + f0 = noHeader + f1 = oneHeader + f2 = splitHeader + d0 = false + d1 = true +) + +// Test all 36 combinations of response frame orders: +// (3 ways of 100-continue) * (2 ways of headers) * (2 ways of data) * (3 ways of trailers):func TestTransportResponsePattern_00f0(t *testing.T) { testTransportResponsePattern(h0, h1, false, h0) } +// Generated by http://play.golang.org/p/SScqYKJYXd +func TestTransportResPattern_c0h1d0t0(t *testing.T) { testTransportResPattern(t, f0, f1, d0, f0) } +func TestTransportResPattern_c0h1d0t1(t *testing.T) { testTransportResPattern(t, f0, f1, d0, f1) } +func TestTransportResPattern_c0h1d0t2(t *testing.T) { testTransportResPattern(t, f0, f1, d0, f2) } +func TestTransportResPattern_c0h1d1t0(t *testing.T) { testTransportResPattern(t, f0, f1, d1, f0) } +func TestTransportResPattern_c0h1d1t1(t *testing.T) { testTransportResPattern(t, f0, f1, d1, f1) } +func TestTransportResPattern_c0h1d1t2(t *testing.T) { testTransportResPattern(t, f0, f1, d1, f2) } +func TestTransportResPattern_c0h2d0t0(t *testing.T) { testTransportResPattern(t, f0, f2, d0, f0) } +func TestTransportResPattern_c0h2d0t1(t *testing.T) { testTransportResPattern(t, f0, f2, d0, f1) } +func TestTransportResPattern_c0h2d0t2(t *testing.T) { testTransportResPattern(t, f0, f2, d0, f2) } +func TestTransportResPattern_c0h2d1t0(t *testing.T) { testTransportResPattern(t, f0, f2, d1, f0) } +func TestTransportResPattern_c0h2d1t1(t *testing.T) { testTransportResPattern(t, f0, f2, d1, f1) } +func TestTransportResPattern_c0h2d1t2(t *testing.T) { testTransportResPattern(t, f0, f2, d1, f2) } +func TestTransportResPattern_c1h1d0t0(t *testing.T) { testTransportResPattern(t, f1, f1, d0, f0) } +func TestTransportResPattern_c1h1d0t1(t *testing.T) { testTransportResPattern(t, f1, f1, d0, f1) } +func TestTransportResPattern_c1h1d0t2(t *testing.T) { testTransportResPattern(t, f1, f1, d0, f2) } +func TestTransportResPattern_c1h1d1t0(t *testing.T) { testTransportResPattern(t, f1, f1, d1, f0) } +func TestTransportResPattern_c1h1d1t1(t *testing.T) { testTransportResPattern(t, f1, f1, d1, f1) } +func TestTransportResPattern_c1h1d1t2(t *testing.T) { testTransportResPattern(t, f1, f1, d1, f2) } +func TestTransportResPattern_c1h2d0t0(t *testing.T) { testTransportResPattern(t, f1, f2, d0, f0) } +func TestTransportResPattern_c1h2d0t1(t *testing.T) { testTransportResPattern(t, f1, f2, d0, f1) } +func TestTransportResPattern_c1h2d0t2(t *testing.T) { testTransportResPattern(t, f1, f2, d0, f2) } +func TestTransportResPattern_c1h2d1t0(t *testing.T) { testTransportResPattern(t, f1, f2, d1, f0) } +func TestTransportResPattern_c1h2d1t1(t *testing.T) { testTransportResPattern(t, f1, f2, d1, f1) } +func TestTransportResPattern_c1h2d1t2(t *testing.T) { testTransportResPattern(t, f1, f2, d1, f2) } +func TestTransportResPattern_c2h1d0t0(t *testing.T) { testTransportResPattern(t, f2, f1, d0, f0) } +func TestTransportResPattern_c2h1d0t1(t *testing.T) { testTransportResPattern(t, f2, f1, d0, f1) } +func TestTransportResPattern_c2h1d0t2(t *testing.T) { testTransportResPattern(t, f2, f1, d0, f2) } +func TestTransportResPattern_c2h1d1t0(t *testing.T) { testTransportResPattern(t, f2, f1, d1, f0) } +func TestTransportResPattern_c2h1d1t1(t *testing.T) { testTransportResPattern(t, f2, f1, d1, f1) } +func TestTransportResPattern_c2h1d1t2(t *testing.T) { testTransportResPattern(t, f2, f1, d1, f2) } +func TestTransportResPattern_c2h2d0t0(t *testing.T) { testTransportResPattern(t, f2, f2, d0, f0) } +func TestTransportResPattern_c2h2d0t1(t *testing.T) { testTransportResPattern(t, f2, f2, d0, f1) } +func TestTransportResPattern_c2h2d0t2(t *testing.T) { testTransportResPattern(t, f2, f2, d0, f2) } +func TestTransportResPattern_c2h2d1t0(t *testing.T) { testTransportResPattern(t, f2, f2, d1, f0) } +func TestTransportResPattern_c2h2d1t1(t *testing.T) { testTransportResPattern(t, f2, f2, d1, f1) } +func TestTransportResPattern_c2h2d1t2(t *testing.T) { testTransportResPattern(t, f2, f2, d1, f2) } + +func testTransportResPattern(t *testing.T, expect100Continue, resHeader headerType, withData bool, trailers headerType) { + const reqBody = "some request body" + const resBody = "some response body" + + if resHeader == noHeader { + // TODO: test 100-continue followed by immediate + // server stream reset, without headers in the middle? + panic("invalid combination") + } + + ct := newClientTester(t) + ct.client = func() error { + req, _ := http.NewRequest("POST", "https://dummy.tld/", strings.NewReader(reqBody)) + if expect100Continue != noHeader { + req.Header.Set("Expect", "100-continue") + } + res, err := ct.tr.RoundTrip(req) + if err != nil { + return fmt.Errorf("RoundTrip: %v", err) + } + defer res.Body.Close() + if res.StatusCode != 200 { + return fmt.Errorf("status code = %v; want 200", res.StatusCode) + } + slurp, err := ioutil.ReadAll(res.Body) + if err != nil { + return fmt.Errorf("Slurp: %v", err) + } + wantBody := resBody + if !withData { + wantBody = "" + } + if string(slurp) != wantBody { + return fmt.Errorf("body = %q; want %q", slurp, wantBody) + } + if trailers == noHeader { + if len(res.Trailer) > 0 { + t.Errorf("Trailer = %v; want none", res.Trailer) + } + } else { + want := http.Header{"Some-Trailer": {"some-value"}} + if !reflect.DeepEqual(res.Trailer, want) { + t.Errorf("Trailer = %v; want %v", res.Trailer, want) + } + } + return nil + } + ct.server = func() error { + ct.greet() + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + + for { + f, err := ct.fr.ReadFrame() + if err != nil { + return err + } + endStream := false + send := func(mode headerType) { + hbf := buf.Bytes() + switch mode { + case oneHeader: + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: f.Header().StreamID, + EndHeaders: true, + EndStream: endStream, + BlockFragment: hbf, + }) + case splitHeader: + if len(hbf) < 2 { + panic("too small") + } + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: f.Header().StreamID, + EndHeaders: false, + EndStream: endStream, + BlockFragment: hbf[:1], + }) + ct.fr.WriteContinuation(f.Header().StreamID, true, hbf[1:]) + default: + panic("bogus mode") + } + } + switch f := f.(type) { + case *WindowUpdateFrame, *SettingsFrame: + case *DataFrame: + if !f.StreamEnded() { + // No need to send flow control tokens. The test request body is tiny. + continue + } + // Response headers (1+ frames; 1 or 2 in this test, but never 0) + { + buf.Reset() + enc.WriteField(hpack.HeaderField{Name: ":status", Value: "200"}) + enc.WriteField(hpack.HeaderField{Name: "x-foo", Value: "blah"}) + enc.WriteField(hpack.HeaderField{Name: "x-bar", Value: "more"}) + if trailers != noHeader { + enc.WriteField(hpack.HeaderField{Name: "trailer", Value: "some-trailer"}) + } + endStream = withData == false && trailers == noHeader + send(resHeader) + } + if withData { + endStream = trailers == noHeader + ct.fr.WriteData(f.StreamID, endStream, []byte(resBody)) + } + if trailers != noHeader { + endStream = true + buf.Reset() + enc.WriteField(hpack.HeaderField{Name: "some-trailer", Value: "some-value"}) + send(trailers) + } + if endStream { + return nil + } + case *HeadersFrame: + if expect100Continue != noHeader { + buf.Reset() + enc.WriteField(hpack.HeaderField{Name: ":status", Value: "100"}) + send(expect100Continue) + } + } + } + } + ct.run() +} + +func TestTransportReceiveUndeclaredTrailer(t *testing.T) { + ct := newClientTester(t) + ct.client = func() error { + req, _ := http.NewRequest("GET", "https://dummy.tld/", nil) + res, err := ct.tr.RoundTrip(req) + if err != nil { + return fmt.Errorf("RoundTrip: %v", err) + } + defer res.Body.Close() + if res.StatusCode != 200 { + return fmt.Errorf("status code = %v; want 200", res.StatusCode) + } + slurp, err := ioutil.ReadAll(res.Body) + if err != nil { + return fmt.Errorf("res.Body ReadAll error = %q, %v; want %v", slurp, err, nil) + } + if len(slurp) > 0 { + return fmt.Errorf("body = %q; want nothing", slurp) + } + if _, ok := res.Trailer["Some-Trailer"]; !ok { + return fmt.Errorf("expected Some-Trailer") + } + return nil + } + ct.server = func() error { + ct.greet() + + var n int + var hf *HeadersFrame + for hf == nil && n < 10 { + f, err := ct.fr.ReadFrame() + if err != nil { + return err + } + hf, _ = f.(*HeadersFrame) + n++ + } + + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + + // send headers without Trailer header + enc.WriteField(hpack.HeaderField{Name: ":status", Value: "200"}) + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: hf.StreamID, + EndHeaders: true, + EndStream: false, + BlockFragment: buf.Bytes(), + }) + + // send trailers + buf.Reset() + enc.WriteField(hpack.HeaderField{Name: "some-trailer", Value: "I'm an undeclared Trailer!"}) + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: hf.StreamID, + EndHeaders: true, + EndStream: true, + BlockFragment: buf.Bytes(), + }) + return nil + } + ct.run() +} + +func TestTransportInvalidTrailer_Pseudo1(t *testing.T) { + testTransportInvalidTrailer_Pseudo(t, oneHeader) +} +func TestTransportInvalidTrailer_Pseudo2(t *testing.T) { + testTransportInvalidTrailer_Pseudo(t, splitHeader) +} +func testTransportInvalidTrailer_Pseudo(t *testing.T, trailers headerType) { + testInvalidTrailer(t, trailers, pseudoHeaderError(":colon"), func(enc *hpack.Encoder) { + enc.WriteField(hpack.HeaderField{Name: ":colon", Value: "foo"}) + enc.WriteField(hpack.HeaderField{Name: "foo", Value: "bar"}) + }) +} + +func TestTransportInvalidTrailer_Capital1(t *testing.T) { + testTransportInvalidTrailer_Capital(t, oneHeader) +} +func TestTransportInvalidTrailer_Capital2(t *testing.T) { + testTransportInvalidTrailer_Capital(t, splitHeader) +} +func testTransportInvalidTrailer_Capital(t *testing.T, trailers headerType) { + testInvalidTrailer(t, trailers, headerFieldNameError("Capital"), func(enc *hpack.Encoder) { + enc.WriteField(hpack.HeaderField{Name: "foo", Value: "bar"}) + enc.WriteField(hpack.HeaderField{Name: "Capital", Value: "bad"}) + }) +} +func TestTransportInvalidTrailer_EmptyFieldName(t *testing.T) { + testInvalidTrailer(t, oneHeader, headerFieldNameError(""), func(enc *hpack.Encoder) { + enc.WriteField(hpack.HeaderField{Name: "", Value: "bad"}) + }) +} +func TestTransportInvalidTrailer_BinaryFieldValue(t *testing.T) { + testInvalidTrailer(t, oneHeader, headerFieldValueError("has\nnewline"), func(enc *hpack.Encoder) { + enc.WriteField(hpack.HeaderField{Name: "x", Value: "has\nnewline"}) + }) +} + +func testInvalidTrailer(t *testing.T, trailers headerType, wantErr error, writeTrailer func(*hpack.Encoder)) { + ct := newClientTester(t) + ct.client = func() error { + req, _ := http.NewRequest("GET", "https://dummy.tld/", nil) + res, err := ct.tr.RoundTrip(req) + if err != nil { + return fmt.Errorf("RoundTrip: %v", err) + } + defer res.Body.Close() + if res.StatusCode != 200 { + return fmt.Errorf("status code = %v; want 200", res.StatusCode) + } + slurp, err := ioutil.ReadAll(res.Body) + se, ok := err.(StreamError) + if !ok || se.Cause != wantErr { + return fmt.Errorf("res.Body ReadAll error = %q, %#v; want StreamError with cause %T, %#v", slurp, err, wantErr, wantErr) + } + if len(slurp) > 0 { + return fmt.Errorf("body = %q; want nothing", slurp) + } + return nil + } + ct.server = func() error { + ct.greet() + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + + for { + f, err := ct.fr.ReadFrame() + if err != nil { + return err + } + switch f := f.(type) { + case *HeadersFrame: + var endStream bool + send := func(mode headerType) { + hbf := buf.Bytes() + switch mode { + case oneHeader: + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: f.StreamID, + EndHeaders: true, + EndStream: endStream, + BlockFragment: hbf, + }) + case splitHeader: + if len(hbf) < 2 { + panic("too small") + } + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: f.StreamID, + EndHeaders: false, + EndStream: endStream, + BlockFragment: hbf[:1], + }) + ct.fr.WriteContinuation(f.StreamID, true, hbf[1:]) + default: + panic("bogus mode") + } + } + // Response headers (1+ frames; 1 or 2 in this test, but never 0) + { + buf.Reset() + enc.WriteField(hpack.HeaderField{Name: ":status", Value: "200"}) + enc.WriteField(hpack.HeaderField{Name: "trailer", Value: "declared"}) + endStream = false + send(oneHeader) + } + // Trailers: + { + endStream = true + buf.Reset() + writeTrailer(enc) + send(trailers) + } + return nil + } + } + } + ct.run() +} + +// headerListSize returns the HTTP2 header list size of h. +// http://httpwg.org/specs/rfc7540.html#SETTINGS_MAX_HEADER_LIST_SIZE +// http://httpwg.org/specs/rfc7540.html#MaxHeaderBlock +func headerListSize(h http.Header) (size uint32) { + for k, vv := range h { + for _, v := range vv { + hf := hpack.HeaderField{Name: k, Value: v} + size += hf.Size() + } + } + return size +} + +// padHeaders adds data to an http.Header until headerListSize(h) == +// limit. Due to the way header list sizes are calculated, padHeaders +// cannot add fewer than len("Pad-Headers") + 32 bytes to h, and will +// call t.Fatal if asked to do so. PadHeaders first reserves enough +// space for an empty "Pad-Headers" key, then adds as many copies of +// filler as possible. Any remaining bytes necessary to push the +// header list size up to limit are added to h["Pad-Headers"]. +func padHeaders(t *testing.T, h http.Header, limit uint64, filler string) { + if limit > 0xffffffff { + t.Fatalf("padHeaders: refusing to pad to more than 2^32-1 bytes. limit = %v", limit) + } + hf := hpack.HeaderField{Name: "Pad-Headers", Value: ""} + minPadding := uint64(hf.Size()) + size := uint64(headerListSize(h)) + + minlimit := size + minPadding + if limit < minlimit { + t.Fatalf("padHeaders: limit %v < %v", limit, minlimit) + } + + // Use a fixed-width format for name so that fieldSize + // remains constant. + nameFmt := "Pad-Headers-%06d" + hf = hpack.HeaderField{Name: fmt.Sprintf(nameFmt, 1), Value: filler} + fieldSize := uint64(hf.Size()) + + // Add as many complete filler values as possible, leaving + // room for at least one empty "Pad-Headers" key. + limit = limit - minPadding + for i := 0; size+fieldSize < limit; i++ { + name := fmt.Sprintf(nameFmt, i) + h.Add(name, filler) + size += fieldSize + } + + // Add enough bytes to reach limit. + remain := limit - size + lastValue := strings.Repeat("*", int(remain)) + h.Add("Pad-Headers", lastValue) +} + +func TestPadHeaders(t *testing.T) { + check := func(h http.Header, limit uint32, fillerLen int) { + if h == nil { + h = make(http.Header) + } + filler := strings.Repeat("f", fillerLen) + padHeaders(t, h, uint64(limit), filler) + gotSize := headerListSize(h) + if gotSize != limit { + t.Errorf("Got size = %v; want %v", gotSize, limit) + } + } + // Try all possible combinations for small fillerLen and limit. + hf := hpack.HeaderField{Name: "Pad-Headers", Value: ""} + minLimit := hf.Size() + for limit := minLimit; limit <= 128; limit++ { + for fillerLen := 0; uint32(fillerLen) <= limit; fillerLen++ { + check(nil, limit, fillerLen) + } + } + + // Try a few tests with larger limits, plus cumulative + // tests. Since these tests are cumulative, tests[i+1].limit + // must be >= tests[i].limit + minLimit. See the comment on + // padHeaders for more info on why the limit arg has this + // restriction. + tests := []struct { + fillerLen int + limit uint32 + }{ + { + fillerLen: 64, + limit: 1024, + }, + { + fillerLen: 1024, + limit: 1286, + }, + { + fillerLen: 256, + limit: 2048, + }, + { + fillerLen: 1024, + limit: 10 * 1024, + }, + { + fillerLen: 1023, + limit: 11 * 1024, + }, + } + h := make(http.Header) + for _, tc := range tests { + check(nil, tc.limit, tc.fillerLen) + check(h, tc.limit, tc.fillerLen) + } +} + +func TestTransportChecksRequestHeaderListSize(t *testing.T) { + st := newServerTester(t, + func(w http.ResponseWriter, r *http.Request) { + // Consume body & force client to send + // trailers before writing response. + // ioutil.ReadAll returns non-nil err for + // requests that attempt to send greater than + // maxHeaderListSize bytes of trailers, since + // those requests generate a stream reset. + ioutil.ReadAll(r.Body) + r.Body.Close() + }, + func(ts *httptest.Server) { + ts.Config.MaxHeaderBytes = 16 << 10 + }, + optOnlyServer, + optQuiet, + ) + defer st.Close() + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + + checkRoundTrip := func(req *http.Request, wantErr error, desc string) { + res, err := tr.RoundTrip(req) + if err != wantErr { + if res != nil { + res.Body.Close() + } + t.Errorf("%v: RoundTrip err = %v; want %v", desc, err, wantErr) + return + } + if err == nil { + if res == nil { + t.Errorf("%v: response nil; want non-nil.", desc) + return + } + defer res.Body.Close() + if res.StatusCode != http.StatusOK { + t.Errorf("%v: response status = %v; want %v", desc, res.StatusCode, http.StatusOK) + } + return + } + if res != nil { + t.Errorf("%v: RoundTrip err = %v but response non-nil", desc, err) + } + } + headerListSizeForRequest := func(req *http.Request) (size uint64) { + contentLen := actualContentLength(req) + trailers, err := commaSeparatedTrailers(req) + if err != nil { + t.Fatalf("headerListSizeForRequest: %v", err) + } + cc := &ClientConn{peerMaxHeaderListSize: 0xffffffffffffffff} + cc.henc = hpack.NewEncoder(&cc.hbuf) + cc.mu.Lock() + hdrs, err := cc.encodeHeaders(req, true, trailers, contentLen) + cc.mu.Unlock() + if err != nil { + t.Fatalf("headerListSizeForRequest: %v", err) + } + hpackDec := hpack.NewDecoder(initialHeaderTableSize, func(hf hpack.HeaderField) { + size += uint64(hf.Size()) + }) + if len(hdrs) > 0 { + if _, err := hpackDec.Write(hdrs); err != nil { + t.Fatalf("headerListSizeForRequest: %v", err) + } + } + return size + } + // Create a new Request for each test, rather than reusing the + // same Request, to avoid a race when modifying req.Headers. + // See https://github.com/golang/go/issues/21316 + newRequest := func() *http.Request { + // Body must be non-nil to enable writing trailers. + body := strings.NewReader("hello") + req, err := http.NewRequest("POST", st.ts.URL, body) + if err != nil { + t.Fatalf("newRequest: NewRequest: %v", err) + } + return req + } + + // Make an arbitrary request to ensure we get the server's + // settings frame and initialize peerMaxHeaderListSize. + req := newRequest() + checkRoundTrip(req, nil, "Initial request") + + // Get the ClientConn associated with the request and validate + // peerMaxHeaderListSize. + addr := authorityAddr(req.URL.Scheme, req.URL.Host) + cc, err := tr.connPool().GetClientConn(req, addr) + if err != nil { + t.Fatalf("GetClientConn: %v", err) + } + cc.mu.Lock() + peerSize := cc.peerMaxHeaderListSize + cc.mu.Unlock() + st.scMu.Lock() + wantSize := uint64(st.sc.maxHeaderListSize()) + st.scMu.Unlock() + if peerSize != wantSize { + t.Errorf("peerMaxHeaderListSize = %v; want %v", peerSize, wantSize) + } + + // Sanity check peerSize. (*serverConn) maxHeaderListSize adds + // 320 bytes of padding. + wantHeaderBytes := uint64(st.ts.Config.MaxHeaderBytes) + 320 + if peerSize != wantHeaderBytes { + t.Errorf("peerMaxHeaderListSize = %v; want %v.", peerSize, wantHeaderBytes) + } + + // Pad headers & trailers, but stay under peerSize. + req = newRequest() + req.Header = make(http.Header) + req.Trailer = make(http.Header) + filler := strings.Repeat("*", 1024) + padHeaders(t, req.Trailer, peerSize, filler) + // cc.encodeHeaders adds some default headers to the request, + // so we need to leave room for those. + defaultBytes := headerListSizeForRequest(req) + padHeaders(t, req.Header, peerSize-defaultBytes, filler) + checkRoundTrip(req, nil, "Headers & Trailers under limit") + + // Add enough header bytes to push us over peerSize. + req = newRequest() + req.Header = make(http.Header) + padHeaders(t, req.Header, peerSize, filler) + checkRoundTrip(req, errRequestHeaderListSize, "Headers over limit") + + // Push trailers over the limit. + req = newRequest() + req.Trailer = make(http.Header) + padHeaders(t, req.Trailer, peerSize+1, filler) + checkRoundTrip(req, errRequestHeaderListSize, "Trailers over limit") + + // Send headers with a single large value. + req = newRequest() + filler = strings.Repeat("*", int(peerSize)) + req.Header = make(http.Header) + req.Header.Set("Big", filler) + checkRoundTrip(req, errRequestHeaderListSize, "Single large header") + + // Send trailers with a single large value. + req = newRequest() + req.Trailer = make(http.Header) + req.Trailer.Set("Big", filler) + checkRoundTrip(req, errRequestHeaderListSize, "Single large trailer") +} + +func TestTransportChecksResponseHeaderListSize(t *testing.T) { + ct := newClientTester(t) + ct.client = func() error { + req, _ := http.NewRequest("GET", "https://dummy.tld/", nil) + res, err := ct.tr.RoundTrip(req) + if err != errResponseHeaderListSize { + if res != nil { + res.Body.Close() + } + size := int64(0) + for k, vv := range res.Header { + for _, v := range vv { + size += int64(len(k)) + int64(len(v)) + 32 + } + } + return fmt.Errorf("RoundTrip Error = %v (and %d bytes of response headers); want errResponseHeaderListSize", err, size) + } + return nil + } + ct.server = func() error { + ct.greet() + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + + for { + f, err := ct.fr.ReadFrame() + if err != nil { + return err + } + switch f := f.(type) { + case *HeadersFrame: + enc.WriteField(hpack.HeaderField{Name: ":status", Value: "200"}) + large := strings.Repeat("a", 1<<10) + for i := 0; i < 5042; i++ { + enc.WriteField(hpack.HeaderField{Name: large, Value: large}) + } + if size, want := buf.Len(), 6329; size != want { + // Note: this number might change if + // our hpack implementation + // changes. That's fine. This is + // just a sanity check that our + // response can fit in a single + // header block fragment frame. + return fmt.Errorf("encoding over 10MB of duplicate keypairs took %d bytes; expected %d", size, want) + } + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: f.StreamID, + EndHeaders: true, + EndStream: true, + BlockFragment: buf.Bytes(), + }) + return nil + } + } + } + ct.run() +} + +// Test that the Transport returns a typed error from Response.Body.Read calls +// when the server sends an error. (here we use a panic, since that should generate +// a stream error, but others like cancel should be similar) +func TestTransportBodyReadErrorType(t *testing.T) { + doPanic := make(chan bool, 1) + st := newServerTester(t, + func(w http.ResponseWriter, r *http.Request) { + w.(http.Flusher).Flush() // force headers out + <-doPanic + panic("boom") + }, + optOnlyServer, + optQuiet, + ) + defer st.Close() + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + c := &http.Client{Transport: tr} + + res, err := c.Get(st.ts.URL) + if err != nil { + t.Fatal(err) + } + defer res.Body.Close() + doPanic <- true + buf := make([]byte, 100) + n, err := res.Body.Read(buf) + want := StreamError{StreamID: 0x1, Code: 0x2} + if !reflect.DeepEqual(want, err) { + t.Errorf("Read = %v, %#v; want error %#v", n, err, want) + } +} + +// golang.org/issue/13924 +// This used to fail after many iterations, especially with -race: +// go test -v -run=TestTransportDoubleCloseOnWriteError -count=500 -race +func TestTransportDoubleCloseOnWriteError(t *testing.T) { + var ( + mu sync.Mutex + conn net.Conn // to close if set + ) + + st := newServerTester(t, + func(w http.ResponseWriter, r *http.Request) { + mu.Lock() + defer mu.Unlock() + if conn != nil { + conn.Close() + } + }, + optOnlyServer, + ) + defer st.Close() + + tr := &Transport{ + TLSClientConfig: tlsConfigInsecure, + DialTLS: func(network, addr string, cfg *tls.Config) (net.Conn, error) { + tc, err := tls.Dial(network, addr, cfg) + if err != nil { + return nil, err + } + mu.Lock() + defer mu.Unlock() + conn = tc + return tc, nil + }, + } + defer tr.CloseIdleConnections() + c := &http.Client{Transport: tr} + c.Get(st.ts.URL) +} + +// Test that the http1 Transport.DisableKeepAlives option is respected +// and connections are closed as soon as idle. +// See golang.org/issue/14008 +func TestTransportDisableKeepAlives(t *testing.T) { + st := newServerTester(t, + func(w http.ResponseWriter, r *http.Request) { + io.WriteString(w, "hi") + }, + optOnlyServer, + ) + defer st.Close() + + connClosed := make(chan struct{}) // closed on tls.Conn.Close + tr := &Transport{ + t1: &http.Transport{ + DisableKeepAlives: true, + }, + TLSClientConfig: tlsConfigInsecure, + DialTLS: func(network, addr string, cfg *tls.Config) (net.Conn, error) { + tc, err := tls.Dial(network, addr, cfg) + if err != nil { + return nil, err + } + return ¬eCloseConn{Conn: tc, closefn: func() { close(connClosed) }}, nil + }, + } + c := &http.Client{Transport: tr} + res, err := c.Get(st.ts.URL) + if err != nil { + t.Fatal(err) + } + if _, err := ioutil.ReadAll(res.Body); err != nil { + t.Fatal(err) + } + defer res.Body.Close() + + select { + case <-connClosed: + case <-time.After(1 * time.Second): + t.Errorf("timeout") + } + +} + +// Test concurrent requests with Transport.DisableKeepAlives. We can share connections, +// but when things are totally idle, it still needs to close. +func TestTransportDisableKeepAlives_Concurrency(t *testing.T) { + const D = 25 * time.Millisecond + st := newServerTester(t, + func(w http.ResponseWriter, r *http.Request) { + time.Sleep(D) + io.WriteString(w, "hi") + }, + optOnlyServer, + ) + defer st.Close() + + var dials int32 + var conns sync.WaitGroup + tr := &Transport{ + t1: &http.Transport{ + DisableKeepAlives: true, + }, + TLSClientConfig: tlsConfigInsecure, + DialTLS: func(network, addr string, cfg *tls.Config) (net.Conn, error) { + tc, err := tls.Dial(network, addr, cfg) + if err != nil { + return nil, err + } + atomic.AddInt32(&dials, 1) + conns.Add(1) + return ¬eCloseConn{Conn: tc, closefn: func() { conns.Done() }}, nil + }, + } + c := &http.Client{Transport: tr} + var reqs sync.WaitGroup + const N = 20 + for i := 0; i < N; i++ { + reqs.Add(1) + if i == N-1 { + // For the final request, try to make all the + // others close. This isn't verified in the + // count, other than the Log statement, since + // it's so timing dependent. This test is + // really to make sure we don't interrupt a + // valid request. + time.Sleep(D * 2) + } + go func() { + defer reqs.Done() + res, err := c.Get(st.ts.URL) + if err != nil { + t.Error(err) + return + } + if _, err := ioutil.ReadAll(res.Body); err != nil { + t.Error(err) + return + } + res.Body.Close() + }() + } + reqs.Wait() + conns.Wait() + t.Logf("did %d dials, %d requests", atomic.LoadInt32(&dials), N) +} + +type noteCloseConn struct { + net.Conn + onceClose sync.Once + closefn func() +} + +func (c *noteCloseConn) Close() error { + c.onceClose.Do(c.closefn) + return c.Conn.Close() +} + +func isTimeout(err error) bool { + switch err := err.(type) { + case nil: + return false + case *url.Error: + return isTimeout(err.Err) + case net.Error: + return err.Timeout() + } + return false +} + +// Test that the http1 Transport.ResponseHeaderTimeout option and cancel is sent. +func TestTransportResponseHeaderTimeout_NoBody(t *testing.T) { + testTransportResponseHeaderTimeout(t, false) +} +func TestTransportResponseHeaderTimeout_Body(t *testing.T) { + testTransportResponseHeaderTimeout(t, true) +} + +func testTransportResponseHeaderTimeout(t *testing.T, body bool) { + ct := newClientTester(t) + ct.tr.t1 = &http.Transport{ + ResponseHeaderTimeout: 5 * time.Millisecond, + } + ct.client = func() error { + c := &http.Client{Transport: ct.tr} + var err error + var n int64 + const bodySize = 4 << 20 + if body { + _, err = c.Post("https://dummy.tld/", "text/foo", io.LimitReader(countingReader{&n}, bodySize)) + } else { + _, err = c.Get("https://dummy.tld/") + } + if !isTimeout(err) { + t.Errorf("client expected timeout error; got %#v", err) + } + if body && n != bodySize { + t.Errorf("only read %d bytes of body; want %d", n, bodySize) + } + return nil + } + ct.server = func() error { + ct.greet() + for { + f, err := ct.fr.ReadFrame() + if err != nil { + t.Logf("ReadFrame: %v", err) + return nil + } + switch f := f.(type) { + case *DataFrame: + dataLen := len(f.Data()) + if dataLen > 0 { + if err := ct.fr.WriteWindowUpdate(0, uint32(dataLen)); err != nil { + return err + } + if err := ct.fr.WriteWindowUpdate(f.StreamID, uint32(dataLen)); err != nil { + return err + } + } + case *RSTStreamFrame: + if f.StreamID == 1 && f.ErrCode == ErrCodeCancel { + return nil + } + } + } + } + ct.run() +} + +func TestTransportDisableCompression(t *testing.T) { + const body = "sup" + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + want := http.Header{ + "User-Agent": []string{"Go-http-client/2.0"}, + } + if !reflect.DeepEqual(r.Header, want) { + t.Errorf("request headers = %v; want %v", r.Header, want) + } + }, optOnlyServer) + defer st.Close() + + tr := &Transport{ + TLSClientConfig: tlsConfigInsecure, + t1: &http.Transport{ + DisableCompression: true, + }, + } + defer tr.CloseIdleConnections() + + req, err := http.NewRequest("GET", st.ts.URL, nil) + if err != nil { + t.Fatal(err) + } + res, err := tr.RoundTrip(req) + if err != nil { + t.Fatal(err) + } + defer res.Body.Close() +} + +// RFC 7540 section 8.1.2.2 +func TestTransportRejectsConnHeaders(t *testing.T) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + var got []string + for k := range r.Header { + got = append(got, k) + } + sort.Strings(got) + w.Header().Set("Got-Header", strings.Join(got, ",")) + }, optOnlyServer) + defer st.Close() + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + + tests := []struct { + key string + value []string + want string + }{ + { + key: "Upgrade", + value: []string{"anything"}, + want: "ERROR: http2: invalid Upgrade request header: [\"anything\"]", + }, + { + key: "Connection", + value: []string{"foo"}, + want: "ERROR: http2: invalid Connection request header: [\"foo\"]", + }, + { + key: "Connection", + value: []string{"close"}, + want: "Accept-Encoding,User-Agent", + }, + { + key: "Connection", + value: []string{"close", "something-else"}, + want: "ERROR: http2: invalid Connection request header: [\"close\" \"something-else\"]", + }, + { + key: "Connection", + value: []string{"keep-alive"}, + want: "Accept-Encoding,User-Agent", + }, + { + key: "Proxy-Connection", // just deleted and ignored + value: []string{"keep-alive"}, + want: "Accept-Encoding,User-Agent", + }, + { + key: "Transfer-Encoding", + value: []string{""}, + want: "Accept-Encoding,User-Agent", + }, + { + key: "Transfer-Encoding", + value: []string{"foo"}, + want: "ERROR: http2: invalid Transfer-Encoding request header: [\"foo\"]", + }, + { + key: "Transfer-Encoding", + value: []string{"chunked"}, + want: "Accept-Encoding,User-Agent", + }, + { + key: "Transfer-Encoding", + value: []string{"chunked", "other"}, + want: "ERROR: http2: invalid Transfer-Encoding request header: [\"chunked\" \"other\"]", + }, + { + key: "Content-Length", + value: []string{"123"}, + want: "Accept-Encoding,User-Agent", + }, + { + key: "Keep-Alive", + value: []string{"doop"}, + want: "Accept-Encoding,User-Agent", + }, + } + + for _, tt := range tests { + req, _ := http.NewRequest("GET", st.ts.URL, nil) + req.Header[tt.key] = tt.value + res, err := tr.RoundTrip(req) + var got string + if err != nil { + got = fmt.Sprintf("ERROR: %v", err) + } else { + got = res.Header.Get("Got-Header") + res.Body.Close() + } + if got != tt.want { + t.Errorf("For key %q, value %q, got = %q; want %q", tt.key, tt.value, got, tt.want) + } + } +} + +// golang.org/issue/14048 +func TestTransportFailsOnInvalidHeaders(t *testing.T) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + var got []string + for k := range r.Header { + got = append(got, k) + } + sort.Strings(got) + w.Header().Set("Got-Header", strings.Join(got, ",")) + }, optOnlyServer) + defer st.Close() + + tests := [...]struct { + h http.Header + wantErr string + }{ + 0: { + h: http.Header{"with space": {"foo"}}, + wantErr: `invalid HTTP header name "with space"`, + }, + 1: { + h: http.Header{"name": {"Брэд"}}, + wantErr: "", // okay + }, + 2: { + h: http.Header{"имя": {"Brad"}}, + wantErr: `invalid HTTP header name "имя"`, + }, + 3: { + h: http.Header{"foo": {"foo\x01bar"}}, + wantErr: `invalid HTTP header value "foo\x01bar" for header "foo"`, + }, + } + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + + for i, tt := range tests { + req, _ := http.NewRequest("GET", st.ts.URL, nil) + req.Header = tt.h + res, err := tr.RoundTrip(req) + var bad bool + if tt.wantErr == "" { + if err != nil { + bad = true + t.Errorf("case %d: error = %v; want no error", i, err) + } + } else { + if !strings.Contains(fmt.Sprint(err), tt.wantErr) { + bad = true + t.Errorf("case %d: error = %v; want error %q", i, err, tt.wantErr) + } + } + if err == nil { + if bad { + t.Logf("case %d: server got headers %q", i, res.Header.Get("Got-Header")) + } + res.Body.Close() + } + } +} + +// Tests that gzipReader doesn't crash on a second Read call following +// the first Read call's gzip.NewReader returning an error. +func TestGzipReader_DoubleReadCrash(t *testing.T) { + gz := &gzipReader{ + body: ioutil.NopCloser(strings.NewReader("0123456789")), + } + var buf [1]byte + n, err1 := gz.Read(buf[:]) + if n != 0 || !strings.Contains(fmt.Sprint(err1), "invalid header") { + t.Fatalf("Read = %v, %v; want 0, invalid header", n, err1) + } + n, err2 := gz.Read(buf[:]) + if n != 0 || err2 != err1 { + t.Fatalf("second Read = %v, %v; want 0, %v", n, err2, err1) + } +} + +func TestTransportNewTLSConfig(t *testing.T) { + tests := [...]struct { + conf *tls.Config + host string + want *tls.Config + }{ + // Normal case. + 0: { + conf: nil, + host: "foo.com", + want: &tls.Config{ + ServerName: "foo.com", + NextProtos: []string{NextProtoTLS}, + }, + }, + + // User-provided name (bar.com) takes precedence: + 1: { + conf: &tls.Config{ + ServerName: "bar.com", + }, + host: "foo.com", + want: &tls.Config{ + ServerName: "bar.com", + NextProtos: []string{NextProtoTLS}, + }, + }, + + // NextProto is prepended: + 2: { + conf: &tls.Config{ + NextProtos: []string{"foo", "bar"}, + }, + host: "example.com", + want: &tls.Config{ + ServerName: "example.com", + NextProtos: []string{NextProtoTLS, "foo", "bar"}, + }, + }, + + // NextProto is not duplicated: + 3: { + conf: &tls.Config{ + NextProtos: []string{"foo", "bar", NextProtoTLS}, + }, + host: "example.com", + want: &tls.Config{ + ServerName: "example.com", + NextProtos: []string{"foo", "bar", NextProtoTLS}, + }, + }, + } + for i, tt := range tests { + // Ignore the session ticket keys part, which ends up populating + // unexported fields in the Config: + if tt.conf != nil { + tt.conf.SessionTicketsDisabled = true + } + + tr := &Transport{TLSClientConfig: tt.conf} + got := tr.newTLSConfig(tt.host) + + got.SessionTicketsDisabled = false + + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("%d. got %#v; want %#v", i, got, tt.want) + } + } +} + +// The Google GFE responds to HEAD requests with a HEADERS frame +// without END_STREAM, followed by a 0-length DATA frame with +// END_STREAM. Make sure we don't get confused by that. (We did.) +func TestTransportReadHeadResponse(t *testing.T) { + ct := newClientTester(t) + clientDone := make(chan struct{}) + ct.client = func() error { + defer close(clientDone) + req, _ := http.NewRequest("HEAD", "https://dummy.tld/", nil) + res, err := ct.tr.RoundTrip(req) + if err != nil { + return err + } + if res.ContentLength != 123 { + return fmt.Errorf("Content-Length = %d; want 123", res.ContentLength) + } + slurp, err := ioutil.ReadAll(res.Body) + if err != nil { + return fmt.Errorf("ReadAll: %v", err) + } + if len(slurp) > 0 { + return fmt.Errorf("Unexpected non-empty ReadAll body: %q", slurp) + } + return nil + } + ct.server = func() error { + ct.greet() + for { + f, err := ct.fr.ReadFrame() + if err != nil { + t.Logf("ReadFrame: %v", err) + return nil + } + hf, ok := f.(*HeadersFrame) + if !ok { + continue + } + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + enc.WriteField(hpack.HeaderField{Name: ":status", Value: "200"}) + enc.WriteField(hpack.HeaderField{Name: "content-length", Value: "123"}) + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: hf.StreamID, + EndHeaders: true, + EndStream: false, // as the GFE does + BlockFragment: buf.Bytes(), + }) + ct.fr.WriteData(hf.StreamID, true, nil) + + <-clientDone + return nil + } + } + ct.run() +} + +func TestTransportReadHeadResponseWithBody(t *testing.T) { + // This test use not valid response format. + // Discarding logger output to not spam tests output. + log.SetOutput(ioutil.Discard) + defer log.SetOutput(os.Stderr) + + response := "redirecting to /elsewhere" + ct := newClientTester(t) + clientDone := make(chan struct{}) + ct.client = func() error { + defer close(clientDone) + req, _ := http.NewRequest("HEAD", "https://dummy.tld/", nil) + res, err := ct.tr.RoundTrip(req) + if err != nil { + return err + } + if res.ContentLength != int64(len(response)) { + return fmt.Errorf("Content-Length = %d; want %d", res.ContentLength, len(response)) + } + slurp, err := ioutil.ReadAll(res.Body) + if err != nil { + return fmt.Errorf("ReadAll: %v", err) + } + if len(slurp) > 0 { + return fmt.Errorf("Unexpected non-empty ReadAll body: %q", slurp) + } + return nil + } + ct.server = func() error { + ct.greet() + for { + f, err := ct.fr.ReadFrame() + if err != nil { + t.Logf("ReadFrame: %v", err) + return nil + } + hf, ok := f.(*HeadersFrame) + if !ok { + continue + } + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + enc.WriteField(hpack.HeaderField{Name: ":status", Value: "200"}) + enc.WriteField(hpack.HeaderField{Name: "content-length", Value: strconv.Itoa(len(response))}) + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: hf.StreamID, + EndHeaders: true, + EndStream: false, + BlockFragment: buf.Bytes(), + }) + ct.fr.WriteData(hf.StreamID, true, []byte(response)) + + <-clientDone + return nil + } + } + ct.run() +} + +type neverEnding byte + +func (b neverEnding) Read(p []byte) (int, error) { + for i := range p { + p[i] = byte(b) + } + return len(p), nil +} + +// golang.org/issue/15425: test that a handler closing the request +// body doesn't terminate the stream to the peer. (It just stops +// readability from the handler's side, and eventually the client +// runs out of flow control tokens) +func TestTransportHandlerBodyClose(t *testing.T) { + const bodySize = 10 << 20 + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + r.Body.Close() + io.Copy(w, io.LimitReader(neverEnding('A'), bodySize)) + }, optOnlyServer) + defer st.Close() + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + + g0 := runtime.NumGoroutine() + + const numReq = 10 + for i := 0; i < numReq; i++ { + req, err := http.NewRequest("POST", st.ts.URL, struct{ io.Reader }{io.LimitReader(neverEnding('A'), bodySize)}) + if err != nil { + t.Fatal(err) + } + res, err := tr.RoundTrip(req) + if err != nil { + t.Fatal(err) + } + n, err := io.Copy(ioutil.Discard, res.Body) + res.Body.Close() + if n != bodySize || err != nil { + t.Fatalf("req#%d: Copy = %d, %v; want %d, nil", i, n, err, bodySize) + } + } + tr.CloseIdleConnections() + + if !waitCondition(5*time.Second, 100*time.Millisecond, func() bool { + gd := runtime.NumGoroutine() - g0 + return gd < numReq/2 + }) { + t.Errorf("appeared to leak goroutines") + } +} + +// https://golang.org/issue/15930 +func TestTransportFlowControl(t *testing.T) { + const bufLen = 64 << 10 + var total int64 = 100 << 20 // 100MB + if testing.Short() { + total = 10 << 20 + } + + var wrote int64 // updated atomically + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + b := make([]byte, bufLen) + for wrote < total { + n, err := w.Write(b) + atomic.AddInt64(&wrote, int64(n)) + if err != nil { + t.Errorf("ResponseWriter.Write error: %v", err) + break + } + w.(http.Flusher).Flush() + } + }, optOnlyServer) + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + req, err := http.NewRequest("GET", st.ts.URL, nil) + if err != nil { + t.Fatal("NewRequest error:", err) + } + resp, err := tr.RoundTrip(req) + if err != nil { + t.Fatal("RoundTrip error:", err) + } + defer resp.Body.Close() + + var read int64 + b := make([]byte, bufLen) + for { + n, err := resp.Body.Read(b) + if err == io.EOF { + break + } + if err != nil { + t.Fatal("Read error:", err) + } + read += int64(n) + + const max = transportDefaultStreamFlow + if w := atomic.LoadInt64(&wrote); -max > read-w || read-w > max { + t.Fatalf("Too much data inflight: server wrote %v bytes but client only received %v", w, read) + } + + // Let the server get ahead of the client. + time.Sleep(1 * time.Millisecond) + } +} + +// golang.org/issue/14627 -- if the server sends a GOAWAY frame, make +// the Transport remember it and return it back to users (via +// RoundTrip or request body reads) if needed (e.g. if the server +// proceeds to close the TCP connection before the client gets its +// response) +func TestTransportUsesGoAwayDebugError_RoundTrip(t *testing.T) { + testTransportUsesGoAwayDebugError(t, false) +} + +func TestTransportUsesGoAwayDebugError_Body(t *testing.T) { + testTransportUsesGoAwayDebugError(t, true) +} + +func testTransportUsesGoAwayDebugError(t *testing.T, failMidBody bool) { + ct := newClientTester(t) + clientDone := make(chan struct{}) + + const goAwayErrCode = ErrCodeHTTP11Required // arbitrary + const goAwayDebugData = "some debug data" + + ct.client = func() error { + defer close(clientDone) + req, _ := http.NewRequest("GET", "https://dummy.tld/", nil) + res, err := ct.tr.RoundTrip(req) + if failMidBody { + if err != nil { + return fmt.Errorf("unexpected client RoundTrip error: %v", err) + } + _, err = io.Copy(ioutil.Discard, res.Body) + res.Body.Close() + } + want := GoAwayError{ + LastStreamID: 5, + ErrCode: goAwayErrCode, + DebugData: goAwayDebugData, + } + if !reflect.DeepEqual(err, want) { + t.Errorf("RoundTrip error = %T: %#v, want %T (%#v)", err, err, want, want) + } + return nil + } + ct.server = func() error { + ct.greet() + for { + f, err := ct.fr.ReadFrame() + if err != nil { + t.Logf("ReadFrame: %v", err) + return nil + } + hf, ok := f.(*HeadersFrame) + if !ok { + continue + } + if failMidBody { + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + enc.WriteField(hpack.HeaderField{Name: ":status", Value: "200"}) + enc.WriteField(hpack.HeaderField{Name: "content-length", Value: "123"}) + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: hf.StreamID, + EndHeaders: true, + EndStream: false, + BlockFragment: buf.Bytes(), + }) + } + // Write two GOAWAY frames, to test that the Transport takes + // the interesting parts of both. + ct.fr.WriteGoAway(5, ErrCodeNo, []byte(goAwayDebugData)) + ct.fr.WriteGoAway(5, goAwayErrCode, nil) + ct.sc.(*net.TCPConn).CloseWrite() + <-clientDone + return nil + } + } + ct.run() +} + +func testTransportReturnsUnusedFlowControl(t *testing.T, oneDataFrame bool) { + ct := newClientTester(t) + + clientClosed := make(chan struct{}) + serverWroteFirstByte := make(chan struct{}) + + ct.client = func() error { + req, _ := http.NewRequest("GET", "https://dummy.tld/", nil) + res, err := ct.tr.RoundTrip(req) + if err != nil { + return err + } + <-serverWroteFirstByte + + if n, err := res.Body.Read(make([]byte, 1)); err != nil || n != 1 { + return fmt.Errorf("body read = %v, %v; want 1, nil", n, err) + } + res.Body.Close() // leaving 4999 bytes unread + close(clientClosed) + + return nil + } + ct.server = func() error { + ct.greet() + + var hf *HeadersFrame + for { + f, err := ct.fr.ReadFrame() + if err != nil { + return fmt.Errorf("ReadFrame while waiting for Headers: %v", err) + } + switch f.(type) { + case *WindowUpdateFrame, *SettingsFrame: + continue + } + var ok bool + hf, ok = f.(*HeadersFrame) + if !ok { + return fmt.Errorf("Got %T; want HeadersFrame", f) + } + break + } + + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + enc.WriteField(hpack.HeaderField{Name: ":status", Value: "200"}) + enc.WriteField(hpack.HeaderField{Name: "content-length", Value: "5000"}) + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: hf.StreamID, + EndHeaders: true, + EndStream: false, + BlockFragment: buf.Bytes(), + }) + + // Two cases: + // - Send one DATA frame with 5000 bytes. + // - Send two DATA frames with 1 and 4999 bytes each. + // + // In both cases, the client should consume one byte of data, + // refund that byte, then refund the following 4999 bytes. + // + // In the second case, the server waits for the client connection to + // close before seconding the second DATA frame. This tests the case + // where the client receives a DATA frame after it has reset the stream. + if oneDataFrame { + ct.fr.WriteData(hf.StreamID, false /* don't end stream */, make([]byte, 5000)) + close(serverWroteFirstByte) + <-clientClosed + } else { + ct.fr.WriteData(hf.StreamID, false /* don't end stream */, make([]byte, 1)) + close(serverWroteFirstByte) + <-clientClosed + ct.fr.WriteData(hf.StreamID, false /* don't end stream */, make([]byte, 4999)) + } + + waitingFor := "RSTStreamFrame" + for { + f, err := ct.fr.ReadFrame() + if err != nil { + return fmt.Errorf("ReadFrame while waiting for %s: %v", waitingFor, err) + } + if _, ok := f.(*SettingsFrame); ok { + continue + } + switch waitingFor { + case "RSTStreamFrame": + if rf, ok := f.(*RSTStreamFrame); !ok || rf.ErrCode != ErrCodeCancel { + return fmt.Errorf("Expected a RSTStreamFrame with code cancel; got %v", summarizeFrame(f)) + } + waitingFor = "WindowUpdateFrame" + case "WindowUpdateFrame": + if wuf, ok := f.(*WindowUpdateFrame); !ok || wuf.Increment != 4999 { + return fmt.Errorf("Expected WindowUpdateFrame for 4999 bytes; got %v", summarizeFrame(f)) + } + return nil + } + } + } + ct.run() +} + +// See golang.org/issue/16481 +func TestTransportReturnsUnusedFlowControlSingleWrite(t *testing.T) { + testTransportReturnsUnusedFlowControl(t, true) +} + +// See golang.org/issue/20469 +func TestTransportReturnsUnusedFlowControlMultipleWrites(t *testing.T) { + testTransportReturnsUnusedFlowControl(t, false) +} + +// Issue 16612: adjust flow control on open streams when transport +// receives SETTINGS with INITIAL_WINDOW_SIZE from server. +func TestTransportAdjustsFlowControl(t *testing.T) { + ct := newClientTester(t) + clientDone := make(chan struct{}) + + const bodySize = 1 << 20 + + ct.client = func() error { + defer ct.cc.(*net.TCPConn).CloseWrite() + defer close(clientDone) + + req, _ := http.NewRequest("POST", "https://dummy.tld/", struct{ io.Reader }{io.LimitReader(neverEnding('A'), bodySize)}) + res, err := ct.tr.RoundTrip(req) + if err != nil { + return err + } + res.Body.Close() + return nil + } + ct.server = func() error { + _, err := io.ReadFull(ct.sc, make([]byte, len(ClientPreface))) + if err != nil { + return fmt.Errorf("reading client preface: %v", err) + } + + var gotBytes int64 + var sentSettings bool + for { + f, err := ct.fr.ReadFrame() + if err != nil { + select { + case <-clientDone: + return nil + default: + return fmt.Errorf("ReadFrame while waiting for Headers: %v", err) + } + } + switch f := f.(type) { + case *DataFrame: + gotBytes += int64(len(f.Data())) + // After we've got half the client's + // initial flow control window's worth + // of request body data, give it just + // enough flow control to finish. + if gotBytes >= initialWindowSize/2 && !sentSettings { + sentSettings = true + + ct.fr.WriteSettings(Setting{ID: SettingInitialWindowSize, Val: bodySize}) + ct.fr.WriteWindowUpdate(0, bodySize) + ct.fr.WriteSettingsAck() + } + + if f.StreamEnded() { + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + enc.WriteField(hpack.HeaderField{Name: ":status", Value: "200"}) + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: f.StreamID, + EndHeaders: true, + EndStream: true, + BlockFragment: buf.Bytes(), + }) + } + } + } + } + ct.run() +} + +// See golang.org/issue/16556 +func TestTransportReturnsDataPaddingFlowControl(t *testing.T) { + ct := newClientTester(t) + + unblockClient := make(chan bool, 1) + + ct.client = func() error { + req, _ := http.NewRequest("GET", "https://dummy.tld/", nil) + res, err := ct.tr.RoundTrip(req) + if err != nil { + return err + } + defer res.Body.Close() + <-unblockClient + return nil + } + ct.server = func() error { + ct.greet() + + var hf *HeadersFrame + for { + f, err := ct.fr.ReadFrame() + if err != nil { + return fmt.Errorf("ReadFrame while waiting for Headers: %v", err) + } + switch f.(type) { + case *WindowUpdateFrame, *SettingsFrame: + continue + } + var ok bool + hf, ok = f.(*HeadersFrame) + if !ok { + return fmt.Errorf("Got %T; want HeadersFrame", f) + } + break + } + + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + enc.WriteField(hpack.HeaderField{Name: ":status", Value: "200"}) + enc.WriteField(hpack.HeaderField{Name: "content-length", Value: "5000"}) + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: hf.StreamID, + EndHeaders: true, + EndStream: false, + BlockFragment: buf.Bytes(), + }) + pad := make([]byte, 5) + ct.fr.WriteDataPadded(hf.StreamID, false, make([]byte, 5000), pad) // without ending stream + + f, err := ct.readNonSettingsFrame() + if err != nil { + return fmt.Errorf("ReadFrame while waiting for first WindowUpdateFrame: %v", err) + } + wantBack := uint32(len(pad)) + 1 // one byte for the length of the padding + if wuf, ok := f.(*WindowUpdateFrame); !ok || wuf.Increment != wantBack || wuf.StreamID != 0 { + return fmt.Errorf("Expected conn WindowUpdateFrame for %d bytes; got %v", wantBack, summarizeFrame(f)) + } + + f, err = ct.readNonSettingsFrame() + if err != nil { + return fmt.Errorf("ReadFrame while waiting for second WindowUpdateFrame: %v", err) + } + if wuf, ok := f.(*WindowUpdateFrame); !ok || wuf.Increment != wantBack || wuf.StreamID == 0 { + return fmt.Errorf("Expected stream WindowUpdateFrame for %d bytes; got %v", wantBack, summarizeFrame(f)) + } + unblockClient <- true + return nil + } + ct.run() +} + +// golang.org/issue/16572 -- RoundTrip shouldn't hang when it gets a +// StreamError as a result of the response HEADERS +func TestTransportReturnsErrorOnBadResponseHeaders(t *testing.T) { + ct := newClientTester(t) + + ct.client = func() error { + req, _ := http.NewRequest("GET", "https://dummy.tld/", nil) + res, err := ct.tr.RoundTrip(req) + if err == nil { + res.Body.Close() + return errors.New("unexpected successful GET") + } + want := StreamError{1, ErrCodeProtocol, headerFieldNameError(" content-type")} + if !reflect.DeepEqual(want, err) { + t.Errorf("RoundTrip error = %#v; want %#v", err, want) + } + return nil + } + ct.server = func() error { + ct.greet() + + hf, err := ct.firstHeaders() + if err != nil { + return err + } + + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + enc.WriteField(hpack.HeaderField{Name: ":status", Value: "200"}) + enc.WriteField(hpack.HeaderField{Name: " content-type", Value: "bogus"}) // bogus spaces + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: hf.StreamID, + EndHeaders: true, + EndStream: false, + BlockFragment: buf.Bytes(), + }) + + for { + fr, err := ct.readFrame() + if err != nil { + return fmt.Errorf("error waiting for RST_STREAM from client: %v", err) + } + if _, ok := fr.(*SettingsFrame); ok { + continue + } + if rst, ok := fr.(*RSTStreamFrame); !ok || rst.StreamID != 1 || rst.ErrCode != ErrCodeProtocol { + t.Errorf("Frame = %v; want RST_STREAM for stream 1 with ErrCodeProtocol", summarizeFrame(fr)) + } + break + } + + return nil + } + ct.run() +} + +// byteAndEOFReader returns is in an io.Reader which reads one byte +// (the underlying byte) and io.EOF at once in its Read call. +type byteAndEOFReader byte + +func (b byteAndEOFReader) Read(p []byte) (n int, err error) { + if len(p) == 0 { + panic("unexpected useless call") + } + p[0] = byte(b) + return 1, io.EOF +} + +// Issue 16788: the Transport had a regression where it started +// sending a spurious DATA frame with a duplicate END_STREAM bit after +// the request body writer goroutine had already read an EOF from the +// Request.Body and included the END_STREAM on a data-carrying DATA +// frame. +// +// Notably, to trigger this, the requests need to use a Request.Body +// which returns (non-0, io.EOF) and also needs to set the ContentLength +// explicitly. +func TestTransportBodyDoubleEndStream(t *testing.T) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + // Nothing. + }, optOnlyServer) + defer st.Close() + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + + for i := 0; i < 2; i++ { + req, _ := http.NewRequest("POST", st.ts.URL, byteAndEOFReader('a')) + req.ContentLength = 1 + res, err := tr.RoundTrip(req) + if err != nil { + t.Fatalf("failure on req %d: %v", i+1, err) + } + defer res.Body.Close() + } +} + +// golang.org/issue/16847, golang.org/issue/19103 +func TestTransportRequestPathPseudo(t *testing.T) { + type result struct { + path string + err string + } + tests := []struct { + req *http.Request + want result + }{ + 0: { + req: &http.Request{ + Method: "GET", + URL: &url.URL{ + Host: "foo.com", + Path: "/foo", + }, + }, + want: result{path: "/foo"}, + }, + // In Go 1.7, we accepted paths of "//foo". + // In Go 1.8, we rejected it (issue 16847). + // In Go 1.9, we accepted it again (issue 19103). + 1: { + req: &http.Request{ + Method: "GET", + URL: &url.URL{ + Host: "foo.com", + Path: "//foo", + }, + }, + want: result{path: "//foo"}, + }, + + // Opaque with //$Matching_Hostname/path + 2: { + req: &http.Request{ + Method: "GET", + URL: &url.URL{ + Scheme: "https", + Opaque: "//foo.com/path", + Host: "foo.com", + Path: "/ignored", + }, + }, + want: result{path: "/path"}, + }, + + // Opaque with some other Request.Host instead: + 3: { + req: &http.Request{ + Method: "GET", + Host: "bar.com", + URL: &url.URL{ + Scheme: "https", + Opaque: "//bar.com/path", + Host: "foo.com", + Path: "/ignored", + }, + }, + want: result{path: "/path"}, + }, + + // Opaque without the leading "//": + 4: { + req: &http.Request{ + Method: "GET", + URL: &url.URL{ + Opaque: "/path", + Host: "foo.com", + Path: "/ignored", + }, + }, + want: result{path: "/path"}, + }, + + // Opaque we can't handle: + 5: { + req: &http.Request{ + Method: "GET", + URL: &url.URL{ + Scheme: "https", + Opaque: "//unknown_host/path", + Host: "foo.com", + Path: "/ignored", + }, + }, + want: result{err: `invalid request :path "https://unknown_host/path" from URL.Opaque = "//unknown_host/path"`}, + }, + + // A CONNECT request: + 6: { + req: &http.Request{ + Method: "CONNECT", + URL: &url.URL{ + Host: "foo.com", + }, + }, + want: result{}, + }, + } + for i, tt := range tests { + cc := &ClientConn{peerMaxHeaderListSize: 0xffffffffffffffff} + cc.henc = hpack.NewEncoder(&cc.hbuf) + cc.mu.Lock() + hdrs, err := cc.encodeHeaders(tt.req, false, "", -1) + cc.mu.Unlock() + var got result + hpackDec := hpack.NewDecoder(initialHeaderTableSize, func(f hpack.HeaderField) { + if f.Name == ":path" { + got.path = f.Value + } + }) + if err != nil { + got.err = err.Error() + } else if len(hdrs) > 0 { + if _, err := hpackDec.Write(hdrs); err != nil { + t.Errorf("%d. bogus hpack: %v", i, err) + continue + } + } + if got != tt.want { + t.Errorf("%d. got %+v; want %+v", i, got, tt.want) + } + + } + +} + +// golang.org/issue/17071 -- don't sniff the first byte of the request body +// before we've determined that the ClientConn is usable. +func TestRoundTripDoesntConsumeRequestBodyEarly(t *testing.T) { + const body = "foo" + req, _ := http.NewRequest("POST", "http://foo.com/", ioutil.NopCloser(strings.NewReader(body))) + cc := &ClientConn{ + closed: true, + } + _, err := cc.RoundTrip(req) + if err != errClientConnUnusable { + t.Fatalf("RoundTrip = %v; want errClientConnUnusable", err) + } + slurp, err := ioutil.ReadAll(req.Body) + if err != nil { + t.Errorf("ReadAll = %v", err) + } + if string(slurp) != body { + t.Errorf("Body = %q; want %q", slurp, body) + } +} + +func TestClientConnPing(t *testing.T) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {}, optOnlyServer) + defer st.Close() + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + cc, err := tr.dialClientConn(st.ts.Listener.Addr().String(), false) + if err != nil { + t.Fatal(err) + } + if err = cc.Ping(testContext{}); err != nil { + t.Fatal(err) + } +} + +// Issue 16974: if the server sent a DATA frame after the user +// canceled the Transport's Request, the Transport previously wrote to a +// closed pipe, got an error, and ended up closing the whole TCP +// connection. +func TestTransportCancelDataResponseRace(t *testing.T) { + cancel := make(chan struct{}) + clientGotError := make(chan bool, 1) + + const msg = "Hello." + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + if strings.Contains(r.URL.Path, "/hello") { + time.Sleep(50 * time.Millisecond) + io.WriteString(w, msg) + return + } + for i := 0; i < 50; i++ { + io.WriteString(w, "Some data.") + w.(http.Flusher).Flush() + if i == 2 { + close(cancel) + <-clientGotError + } + time.Sleep(10 * time.Millisecond) + } + }, optOnlyServer) + defer st.Close() + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + + c := &http.Client{Transport: tr} + req, _ := http.NewRequest("GET", st.ts.URL, nil) + req.Cancel = cancel + res, err := c.Do(req) + if err != nil { + t.Fatal(err) + } + if _, err = io.Copy(ioutil.Discard, res.Body); err == nil { + t.Fatal("unexpected success") + } + clientGotError <- true + + res, err = c.Get(st.ts.URL + "/hello") + if err != nil { + t.Fatal(err) + } + slurp, err := ioutil.ReadAll(res.Body) + if err != nil { + t.Fatal(err) + } + if string(slurp) != msg { + t.Errorf("Got = %q; want %q", slurp, msg) + } +} + +// Issue 21316: It should be safe to reuse an http.Request after the +// request has completed. +func TestTransportNoRaceOnRequestObjectAfterRequestComplete(t *testing.T) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(200) + io.WriteString(w, "body") + }, optOnlyServer) + defer st.Close() + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + + req, _ := http.NewRequest("GET", st.ts.URL, nil) + resp, err := tr.RoundTrip(req) + if err != nil { + t.Fatal(err) + } + if _, err = io.Copy(ioutil.Discard, resp.Body); err != nil { + t.Fatalf("error reading response body: %v", err) + } + if err := resp.Body.Close(); err != nil { + t.Fatalf("error closing response body: %v", err) + } + + // This access of req.Header should not race with code in the transport. + req.Header = http.Header{} +} + +func TestTransportRetryAfterGOAWAY(t *testing.T) { + var dialer struct { + sync.Mutex + count int + } + ct1 := make(chan *clientTester) + ct2 := make(chan *clientTester) + + ln := newLocalListener(t) + defer ln.Close() + + tr := &Transport{ + TLSClientConfig: tlsConfigInsecure, + } + tr.DialTLS = func(network, addr string, cfg *tls.Config) (net.Conn, error) { + dialer.Lock() + defer dialer.Unlock() + dialer.count++ + if dialer.count == 3 { + return nil, errors.New("unexpected number of dials") + } + cc, err := net.Dial("tcp", ln.Addr().String()) + if err != nil { + return nil, fmt.Errorf("dial error: %v", err) + } + sc, err := ln.Accept() + if err != nil { + return nil, fmt.Errorf("accept error: %v", err) + } + ct := &clientTester{ + t: t, + tr: tr, + cc: cc, + sc: sc, + fr: NewFramer(sc, sc), + } + switch dialer.count { + case 1: + ct1 <- ct + case 2: + ct2 <- ct + } + return cc, nil + } + + errs := make(chan error, 3) + done := make(chan struct{}) + defer close(done) + + // Client. + go func() { + req, _ := http.NewRequest("GET", "https://dummy.tld/", nil) + res, err := tr.RoundTrip(req) + if res != nil { + res.Body.Close() + if got := res.Header.Get("Foo"); got != "bar" { + err = fmt.Errorf("foo header = %q; want bar", got) + } + } + if err != nil { + err = fmt.Errorf("RoundTrip: %v", err) + } + errs <- err + }() + + connToClose := make(chan io.Closer, 2) + + // Server for the first request. + go func() { + var ct *clientTester + select { + case ct = <-ct1: + case <-done: + return + } + + connToClose <- ct.cc + ct.greet() + hf, err := ct.firstHeaders() + if err != nil { + errs <- fmt.Errorf("server1 failed reading HEADERS: %v", err) + return + } + t.Logf("server1 got %v", hf) + if err := ct.fr.WriteGoAway(0 /*max id*/, ErrCodeNo, nil); err != nil { + errs <- fmt.Errorf("server1 failed writing GOAWAY: %v", err) + return + } + errs <- nil + }() + + // Server for the second request. + go func() { + var ct *clientTester + select { + case ct = <-ct2: + case <-done: + return + } + + connToClose <- ct.cc + ct.greet() + hf, err := ct.firstHeaders() + if err != nil { + errs <- fmt.Errorf("server2 failed reading HEADERS: %v", err) + return + } + t.Logf("server2 got %v", hf) + + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + enc.WriteField(hpack.HeaderField{Name: ":status", Value: "200"}) + enc.WriteField(hpack.HeaderField{Name: "foo", Value: "bar"}) + err = ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: hf.StreamID, + EndHeaders: true, + EndStream: false, + BlockFragment: buf.Bytes(), + }) + if err != nil { + errs <- fmt.Errorf("server2 failed writing response HEADERS: %v", err) + } else { + errs <- nil + } + }() + + for k := 0; k < 3; k++ { + select { + case err := <-errs: + if err != nil { + t.Error(err) + } + case <-time.After(1 * time.Second): + t.Errorf("timed out") + } + } + + for { + select { + case c := <-connToClose: + c.Close() + default: + return + } + } +} + +func TestTransportRetryAfterRefusedStream(t *testing.T) { + clientDone := make(chan struct{}) + ct := newClientTester(t) + ct.client = func() error { + defer ct.cc.(*net.TCPConn).CloseWrite() + defer close(clientDone) + req, _ := http.NewRequest("GET", "https://dummy.tld/", nil) + resp, err := ct.tr.RoundTrip(req) + if err != nil { + return fmt.Errorf("RoundTrip: %v", err) + } + resp.Body.Close() + if resp.StatusCode != 204 { + return fmt.Errorf("Status = %v; want 204", resp.StatusCode) + } + return nil + } + ct.server = func() error { + ct.greet() + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + nreq := 0 + + for { + f, err := ct.fr.ReadFrame() + if err != nil { + select { + case <-clientDone: + // If the client's done, it + // will have reported any + // errors on its side. + return nil + default: + return err + } + } + switch f := f.(type) { + case *WindowUpdateFrame, *SettingsFrame: + case *HeadersFrame: + if !f.HeadersEnded() { + return fmt.Errorf("headers should have END_HEADERS be ended: %v", f) + } + nreq++ + if nreq == 1 { + ct.fr.WriteRSTStream(f.StreamID, ErrCodeRefusedStream) + } else { + enc.WriteField(hpack.HeaderField{Name: ":status", Value: "204"}) + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: f.StreamID, + EndHeaders: true, + EndStream: true, + BlockFragment: buf.Bytes(), + }) + } + default: + return fmt.Errorf("Unexpected client frame %v", f) + } + } + } + ct.run() +} + +func TestTransportRetryHasLimit(t *testing.T) { + // Skip in short mode because the total expected delay is 1s+2s+4s+8s+16s=29s. + if testing.Short() { + t.Skip("skipping long test in short mode") + } + clientDone := make(chan struct{}) + ct := newClientTester(t) + ct.client = func() error { + defer ct.cc.(*net.TCPConn).CloseWrite() + defer close(clientDone) + req, _ := http.NewRequest("GET", "https://dummy.tld/", nil) + resp, err := ct.tr.RoundTrip(req) + if err == nil { + return fmt.Errorf("RoundTrip expected error, got response: %+v", resp) + } + t.Logf("expected error, got: %v", err) + return nil + } + ct.server = func() error { + ct.greet() + for { + f, err := ct.fr.ReadFrame() + if err != nil { + select { + case <-clientDone: + // If the client's done, it + // will have reported any + // errors on its side. + return nil + default: + return err + } + } + switch f := f.(type) { + case *WindowUpdateFrame, *SettingsFrame: + case *HeadersFrame: + if !f.HeadersEnded() { + return fmt.Errorf("headers should have END_HEADERS be ended: %v", f) + } + ct.fr.WriteRSTStream(f.StreamID, ErrCodeRefusedStream) + default: + return fmt.Errorf("Unexpected client frame %v", f) + } + } + } + ct.run() +} + +func TestTransportResponseDataBeforeHeaders(t *testing.T) { + // This test use not valid response format. + // Discarding logger output to not spam tests output. + log.SetOutput(ioutil.Discard) + defer log.SetOutput(os.Stderr) + + ct := newClientTester(t) + ct.client = func() error { + defer ct.cc.(*net.TCPConn).CloseWrite() + req := httptest.NewRequest("GET", "https://dummy.tld/", nil) + // First request is normal to ensure the check is per stream and not per connection. + _, err := ct.tr.RoundTrip(req) + if err != nil { + return fmt.Errorf("RoundTrip expected no error, got: %v", err) + } + // Second request returns a DATA frame with no HEADERS. + resp, err := ct.tr.RoundTrip(req) + if err == nil { + return fmt.Errorf("RoundTrip expected error, got response: %+v", resp) + } + if err, ok := err.(StreamError); !ok || err.Code != ErrCodeProtocol { + return fmt.Errorf("expected stream PROTOCOL_ERROR, got: %v", err) + } + return nil + } + ct.server = func() error { + ct.greet() + for { + f, err := ct.fr.ReadFrame() + if err == io.EOF { + return nil + } else if err != nil { + return err + } + switch f := f.(type) { + case *WindowUpdateFrame, *SettingsFrame: + case *HeadersFrame: + switch f.StreamID { + case 1: + // Send a valid response to first request. + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + enc.WriteField(hpack.HeaderField{Name: ":status", Value: "200"}) + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: f.StreamID, + EndHeaders: true, + EndStream: true, + BlockFragment: buf.Bytes(), + }) + case 3: + ct.fr.WriteData(f.StreamID, true, []byte("payload")) + } + default: + return fmt.Errorf("Unexpected client frame %v", f) + } + } + } + ct.run() +} +func TestTransportRequestsStallAtServerLimit(t *testing.T) { + const maxConcurrent = 2 + + greet := make(chan struct{}) // server sends initial SETTINGS frame + gotRequest := make(chan struct{}) // server received a request + clientDone := make(chan struct{}) + + // Collect errors from goroutines. + var wg sync.WaitGroup + errs := make(chan error, 100) + defer func() { + wg.Wait() + close(errs) + for err := range errs { + t.Error(err) + } + }() + + // We will send maxConcurrent+2 requests. This checker goroutine waits for the + // following stages: + // 1. The first maxConcurrent requests are received by the server. + // 2. The client will cancel the next request + // 3. The server is unblocked so it can service the first maxConcurrent requests + // 4. The client will send the final request + wg.Add(1) + unblockClient := make(chan struct{}) + clientRequestCancelled := make(chan struct{}) + unblockServer := make(chan struct{}) + go func() { + defer wg.Done() + // Stage 1. + for k := 0; k < maxConcurrent; k++ { + <-gotRequest + } + // Stage 2. + close(unblockClient) + <-clientRequestCancelled + // Stage 3: give some time for the final RoundTrip call to be scheduled and + // verify that the final request is not sent. + time.Sleep(50 * time.Millisecond) + select { + case <-gotRequest: + errs <- errors.New("last request did not stall") + close(unblockServer) + return + default: + } + close(unblockServer) + // Stage 4. + <-gotRequest + }() + + ct := newClientTester(t) + ct.client = func() error { + var wg sync.WaitGroup + defer func() { + wg.Wait() + close(clientDone) + ct.cc.(*net.TCPConn).CloseWrite() + }() + for k := 0; k < maxConcurrent+2; k++ { + wg.Add(1) + go func(k int) { + defer wg.Done() + // Don't send the second request until after receiving SETTINGS from the server + // to avoid a race where we use the default SettingMaxConcurrentStreams, which + // is much larger than maxConcurrent. We have to send the first request before + // waiting because the first request triggers the dial and greet. + if k > 0 { + <-greet + } + // Block until maxConcurrent requests are sent before sending any more. + if k >= maxConcurrent { + <-unblockClient + } + req, _ := http.NewRequest("GET", fmt.Sprintf("https://dummy.tld/%d", k), nil) + if k == maxConcurrent { + // This request will be canceled. + cancel := make(chan struct{}) + req.Cancel = cancel + close(cancel) + _, err := ct.tr.RoundTrip(req) + close(clientRequestCancelled) + if err == nil { + errs <- fmt.Errorf("RoundTrip(%d) should have failed due to cancel", k) + return + } + } else { + resp, err := ct.tr.RoundTrip(req) + if err != nil { + errs <- fmt.Errorf("RoundTrip(%d): %v", k, err) + return + } + ioutil.ReadAll(resp.Body) + resp.Body.Close() + if resp.StatusCode != 204 { + errs <- fmt.Errorf("Status = %v; want 204", resp.StatusCode) + return + } + } + }(k) + } + return nil + } + + ct.server = func() error { + var wg sync.WaitGroup + defer wg.Wait() + + ct.greet(Setting{SettingMaxConcurrentStreams, maxConcurrent}) + + // Server write loop. + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + writeResp := make(chan uint32, maxConcurrent+1) + + wg.Add(1) + go func() { + defer wg.Done() + <-unblockServer + for id := range writeResp { + buf.Reset() + enc.WriteField(hpack.HeaderField{Name: ":status", Value: "204"}) + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: id, + EndHeaders: true, + EndStream: true, + BlockFragment: buf.Bytes(), + }) + } + }() + + // Server read loop. + var nreq int + for { + f, err := ct.fr.ReadFrame() + if err != nil { + select { + case <-clientDone: + // If the client's done, it will have reported any errors on its side. + return nil + default: + return err + } + } + switch f := f.(type) { + case *WindowUpdateFrame: + case *SettingsFrame: + // Wait for the client SETTINGS ack until ending the greet. + close(greet) + case *HeadersFrame: + if !f.HeadersEnded() { + return fmt.Errorf("headers should have END_HEADERS be ended: %v", f) + } + gotRequest <- struct{}{} + nreq++ + writeResp <- f.StreamID + if nreq == maxConcurrent+1 { + close(writeResp) + } + default: + return fmt.Errorf("Unexpected client frame %v", f) + } + } + } + + ct.run() +} + +func TestAuthorityAddr(t *testing.T) { + tests := []struct { + scheme, authority string + want string + }{ + {"http", "foo.com", "foo.com:80"}, + {"https", "foo.com", "foo.com:443"}, + {"https", "foo.com:1234", "foo.com:1234"}, + {"https", "1.2.3.4:1234", "1.2.3.4:1234"}, + {"https", "1.2.3.4", "1.2.3.4:443"}, + {"https", "[::1]:1234", "[::1]:1234"}, + {"https", "[::1]", "[::1]:443"}, + } + for _, tt := range tests { + got := authorityAddr(tt.scheme, tt.authority) + if got != tt.want { + t.Errorf("authorityAddr(%q, %q) = %q; want %q", tt.scheme, tt.authority, got, tt.want) + } + } +} + +// Issue 20448: stop allocating for DATA frames' payload after +// Response.Body.Close is called. +func TestTransportAllocationsAfterResponseBodyClose(t *testing.T) { + megabyteZero := make([]byte, 1<<20) + + writeErr := make(chan error, 1) + + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + w.(http.Flusher).Flush() + var sum int64 + for i := 0; i < 100; i++ { + n, err := w.Write(megabyteZero) + sum += int64(n) + if err != nil { + writeErr <- err + return + } + } + t.Logf("wrote all %d bytes", sum) + writeErr <- nil + }, optOnlyServer) + defer st.Close() + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + c := &http.Client{Transport: tr} + res, err := c.Get(st.ts.URL) + if err != nil { + t.Fatal(err) + } + var buf [1]byte + if _, err := res.Body.Read(buf[:]); err != nil { + t.Error(err) + } + if err := res.Body.Close(); err != nil { + t.Error(err) + } + + trb, ok := res.Body.(transportResponseBody) + if !ok { + t.Fatalf("res.Body = %T; want transportResponseBody", res.Body) + } + if trb.cs.bufPipe.b != nil { + t.Errorf("response body pipe is still open") + } + + gotErr := <-writeErr + if gotErr == nil { + t.Errorf("Handler unexpectedly managed to write its entire response without getting an error") + } else if gotErr != errStreamClosed { + t.Errorf("Handler Write err = %v; want errStreamClosed", gotErr) + } +} + +// Issue 18891: make sure Request.Body == NoBody means no DATA frame +// is ever sent, even if empty. +func TestTransportNoBodyMeansNoDATA(t *testing.T) { + ct := newClientTester(t) + + unblockClient := make(chan bool) + + ct.client = func() error { + req, _ := http.NewRequest("GET", "https://dummy.tld/", go18httpNoBody()) + ct.tr.RoundTrip(req) + <-unblockClient + return nil + } + ct.server = func() error { + defer close(unblockClient) + defer ct.cc.(*net.TCPConn).Close() + ct.greet() + + for { + f, err := ct.fr.ReadFrame() + if err != nil { + return fmt.Errorf("ReadFrame while waiting for Headers: %v", err) + } + switch f := f.(type) { + default: + return fmt.Errorf("Got %T; want HeadersFrame", f) + case *WindowUpdateFrame, *SettingsFrame: + continue + case *HeadersFrame: + if !f.StreamEnded() { + return fmt.Errorf("got headers frame without END_STREAM") + } + return nil + } + } + } + ct.run() +} + +func benchSimpleRoundTrip(b *testing.B, nHeaders int) { + defer disableGoroutineTracking()() + b.ReportAllocs() + st := newServerTester(b, + func(w http.ResponseWriter, r *http.Request) { + }, + optOnlyServer, + optQuiet, + ) + defer st.Close() + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + + req, err := http.NewRequest("GET", st.ts.URL, nil) + if err != nil { + b.Fatal(err) + } + + for i := 0; i < nHeaders; i++ { + name := fmt.Sprint("A-", i) + req.Header.Set(name, "*") + } + + b.ResetTimer() + + for i := 0; i < b.N; i++ { + res, err := tr.RoundTrip(req) + if err != nil { + if res != nil { + res.Body.Close() + } + b.Fatalf("RoundTrip err = %v; want nil", err) + } + res.Body.Close() + if res.StatusCode != http.StatusOK { + b.Fatalf("Response code = %v; want %v", res.StatusCode, http.StatusOK) + } + } +} + +type infiniteReader struct{} + +func (r infiniteReader) Read(b []byte) (int, error) { + return len(b), nil +} + +// Issue 20521: it is not an error to receive a response and end stream +// from the server without the body being consumed. +func TestTransportResponseAndResetWithoutConsumingBodyRace(t *testing.T) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) + }, optOnlyServer) + defer st.Close() + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + + // The request body needs to be big enough to trigger flow control. + req, _ := http.NewRequest("PUT", st.ts.URL, infiniteReader{}) + res, err := tr.RoundTrip(req) + if err != nil { + t.Fatal(err) + } + if res.StatusCode != http.StatusOK { + t.Fatalf("Response code = %v; want %v", res.StatusCode, http.StatusOK) + } +} + +// Verify transport doesn't crash when receiving bogus response lacking a :status header. +// Issue 22880. +func TestTransportHandlesInvalidStatuslessResponse(t *testing.T) { + ct := newClientTester(t) + ct.client = func() error { + req, _ := http.NewRequest("GET", "https://dummy.tld/", nil) + _, err := ct.tr.RoundTrip(req) + const substr = "malformed response from server: missing status pseudo header" + if !strings.Contains(fmt.Sprint(err), substr) { + return fmt.Errorf("RoundTrip error = %v; want substring %q", err, substr) + } + return nil + } + ct.server = func() error { + ct.greet() + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + + for { + f, err := ct.fr.ReadFrame() + if err != nil { + return err + } + switch f := f.(type) { + case *HeadersFrame: + enc.WriteField(hpack.HeaderField{Name: "content-type", Value: "text/html"}) // no :status header + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: f.StreamID, + EndHeaders: true, + EndStream: false, // we'll send some DATA to try to crash the transport + BlockFragment: buf.Bytes(), + }) + ct.fr.WriteData(f.StreamID, true, []byte("payload")) + return nil + } + } + } + ct.run() +} + +func BenchmarkClientRequestHeaders(b *testing.B) { + b.Run(" 0 Headers", func(b *testing.B) { benchSimpleRoundTrip(b, 0) }) + b.Run(" 10 Headers", func(b *testing.B) { benchSimpleRoundTrip(b, 10) }) + b.Run(" 100 Headers", func(b *testing.B) { benchSimpleRoundTrip(b, 100) }) + b.Run("1000 Headers", func(b *testing.B) { benchSimpleRoundTrip(b, 1000) }) +} diff --git a/api/vendor/golang.org/x/net/http2/write.go b/api/vendor/golang.org/x/net/http2/write.go new file mode 100644 index 0000000..a512041 --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/write.go @@ -0,0 +1,369 @@ +// 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 http2 + +import ( + "bytes" + "fmt" + "log" + "net/http" + "net/url" + + "golang.org/x/net/http/httpguts" + "golang.org/x/net/http2/hpack" +) + +// writeFramer is implemented by any type that is used to write frames. +type writeFramer interface { + writeFrame(writeContext) error + + // staysWithinBuffer reports whether this writer promises that + // it will only write less than or equal to size bytes, and it + // won't Flush the write context. + staysWithinBuffer(size int) bool +} + +// writeContext is the interface needed by the various frame writer +// types below. All the writeFrame methods below are scheduled via the +// frame writing scheduler (see writeScheduler in writesched.go). +// +// This interface is implemented by *serverConn. +// +// TODO: decide whether to a) use this in the client code (which didn't +// end up using this yet, because it has a simpler design, not +// currently implementing priorities), or b) delete this and +// make the server code a bit more concrete. +type writeContext interface { + Framer() *Framer + Flush() error + CloseConn() error + // HeaderEncoder returns an HPACK encoder that writes to the + // returned buffer. + HeaderEncoder() (*hpack.Encoder, *bytes.Buffer) +} + +// writeEndsStream reports whether w writes a frame that will transition +// the stream to a half-closed local state. This returns false for RST_STREAM, +// which closes the entire stream (not just the local half). +func writeEndsStream(w writeFramer) bool { + switch v := w.(type) { + case *writeData: + return v.endStream + case *writeResHeaders: + return v.endStream + case nil: + // This can only happen if the caller reuses w after it's + // been intentionally nil'ed out to prevent use. Keep this + // here to catch future refactoring breaking it. + panic("writeEndsStream called on nil writeFramer") + } + return false +} + +type flushFrameWriter struct{} + +func (flushFrameWriter) writeFrame(ctx writeContext) error { + return ctx.Flush() +} + +func (flushFrameWriter) staysWithinBuffer(max int) bool { return false } + +type writeSettings []Setting + +func (s writeSettings) staysWithinBuffer(max int) bool { + const settingSize = 6 // uint16 + uint32 + return frameHeaderLen+settingSize*len(s) <= max + +} + +func (s writeSettings) writeFrame(ctx writeContext) error { + return ctx.Framer().WriteSettings([]Setting(s)...) +} + +type writeGoAway struct { + maxStreamID uint32 + code ErrCode +} + +func (p *writeGoAway) writeFrame(ctx writeContext) error { + err := ctx.Framer().WriteGoAway(p.maxStreamID, p.code, nil) + ctx.Flush() // ignore error: we're hanging up on them anyway + return err +} + +func (*writeGoAway) staysWithinBuffer(max int) bool { return false } // flushes + +type writeData struct { + streamID uint32 + p []byte + endStream bool +} + +func (w *writeData) String() string { + return fmt.Sprintf("writeData(stream=%d, p=%d, endStream=%v)", w.streamID, len(w.p), w.endStream) +} + +func (w *writeData) writeFrame(ctx writeContext) error { + return ctx.Framer().WriteData(w.streamID, w.endStream, w.p) +} + +func (w *writeData) staysWithinBuffer(max int) bool { + return frameHeaderLen+len(w.p) <= max +} + +// handlerPanicRST is the message sent from handler goroutines when +// the handler panics. +type handlerPanicRST struct { + StreamID uint32 +} + +func (hp handlerPanicRST) writeFrame(ctx writeContext) error { + return ctx.Framer().WriteRSTStream(hp.StreamID, ErrCodeInternal) +} + +func (hp handlerPanicRST) staysWithinBuffer(max int) bool { return frameHeaderLen+4 <= max } + +func (se StreamError) writeFrame(ctx writeContext) error { + return ctx.Framer().WriteRSTStream(se.StreamID, se.Code) +} + +func (se StreamError) staysWithinBuffer(max int) bool { return frameHeaderLen+4 <= max } + +type writePingAck struct{ pf *PingFrame } + +func (w writePingAck) writeFrame(ctx writeContext) error { + return ctx.Framer().WritePing(true, w.pf.Data) +} + +func (w writePingAck) staysWithinBuffer(max int) bool { return frameHeaderLen+len(w.pf.Data) <= max } + +type writeSettingsAck struct{} + +func (writeSettingsAck) writeFrame(ctx writeContext) error { + return ctx.Framer().WriteSettingsAck() +} + +func (writeSettingsAck) staysWithinBuffer(max int) bool { return frameHeaderLen <= max } + +// splitHeaderBlock splits headerBlock into fragments so that each fragment fits +// in a single frame, then calls fn for each fragment. firstFrag/lastFrag are true +// for the first/last fragment, respectively. +func splitHeaderBlock(ctx writeContext, headerBlock []byte, fn func(ctx writeContext, frag []byte, firstFrag, lastFrag bool) error) error { + // For now we're lazy and just pick the minimum MAX_FRAME_SIZE + // that all peers must support (16KB). Later we could care + // more and send larger frames if the peer advertised it, but + // there's little point. Most headers are small anyway (so we + // generally won't have CONTINUATION frames), and extra frames + // only waste 9 bytes anyway. + const maxFrameSize = 16384 + + first := true + for len(headerBlock) > 0 { + frag := headerBlock + if len(frag) > maxFrameSize { + frag = frag[:maxFrameSize] + } + headerBlock = headerBlock[len(frag):] + if err := fn(ctx, frag, first, len(headerBlock) == 0); err != nil { + return err + } + first = false + } + return nil +} + +// writeResHeaders is a request to write a HEADERS and 0+ CONTINUATION frames +// for HTTP response headers or trailers from a server handler. +type writeResHeaders struct { + streamID uint32 + httpResCode int // 0 means no ":status" line + h http.Header // may be nil + trailers []string // if non-nil, which keys of h to write. nil means all. + endStream bool + + date string + contentType string + contentLength string + noSniff bool +} + +func encKV(enc *hpack.Encoder, k, v string) { + if VerboseLogs { + log.Printf("http2: server encoding header %q = %q", k, v) + } + enc.WriteField(hpack.HeaderField{Name: k, Value: v}) +} + +func (w *writeResHeaders) staysWithinBuffer(max int) bool { + // TODO: this is a common one. It'd be nice to return true + // here and get into the fast path if we could be clever and + // calculate the size fast enough, or at least a conservative + // uppper bound that usually fires. (Maybe if w.h and + // w.trailers are nil, so we don't need to enumerate it.) + // Otherwise I'm afraid that just calculating the length to + // answer this question would be slower than the ~2µs benefit. + return false +} + +func (w *writeResHeaders) writeFrame(ctx writeContext) error { + enc, buf := ctx.HeaderEncoder() + buf.Reset() + + if w.httpResCode != 0 { + encKV(enc, ":status", httpCodeString(w.httpResCode)) + } + + encodeHeaders(enc, w.h, w.trailers) + + if w.contentType != "" { + encKV(enc, "content-type", w.contentType) + } + if w.contentLength != "" { + encKV(enc, "content-length", w.contentLength) + } + if w.noSniff { + encKV(enc, "x-content-type-options", "nosniff") + } + if w.date != "" { + encKV(enc, "date", w.date) + } + + headerBlock := buf.Bytes() + if len(headerBlock) == 0 && w.trailers == nil { + panic("unexpected empty hpack") + } + + return splitHeaderBlock(ctx, headerBlock, w.writeHeaderBlock) +} + +func (w *writeResHeaders) writeHeaderBlock(ctx writeContext, frag []byte, firstFrag, lastFrag bool) error { + if firstFrag { + return ctx.Framer().WriteHeaders(HeadersFrameParam{ + StreamID: w.streamID, + BlockFragment: frag, + EndStream: w.endStream, + EndHeaders: lastFrag, + }) + } else { + return ctx.Framer().WriteContinuation(w.streamID, lastFrag, frag) + } +} + +// writePushPromise is a request to write a PUSH_PROMISE and 0+ CONTINUATION frames. +type writePushPromise struct { + streamID uint32 // pusher stream + method string // for :method + url *url.URL // for :scheme, :authority, :path + h http.Header + + // Creates an ID for a pushed stream. This runs on serveG just before + // the frame is written. The returned ID is copied to promisedID. + allocatePromisedID func() (uint32, error) + promisedID uint32 +} + +func (w *writePushPromise) staysWithinBuffer(max int) bool { + // TODO: see writeResHeaders.staysWithinBuffer + return false +} + +func (w *writePushPromise) writeFrame(ctx writeContext) error { + enc, buf := ctx.HeaderEncoder() + buf.Reset() + + encKV(enc, ":method", w.method) + encKV(enc, ":scheme", w.url.Scheme) + encKV(enc, ":authority", w.url.Host) + encKV(enc, ":path", w.url.RequestURI()) + encodeHeaders(enc, w.h, nil) + + headerBlock := buf.Bytes() + if len(headerBlock) == 0 { + panic("unexpected empty hpack") + } + + return splitHeaderBlock(ctx, headerBlock, w.writeHeaderBlock) +} + +func (w *writePushPromise) writeHeaderBlock(ctx writeContext, frag []byte, firstFrag, lastFrag bool) error { + if firstFrag { + return ctx.Framer().WritePushPromise(PushPromiseParam{ + StreamID: w.streamID, + PromiseID: w.promisedID, + BlockFragment: frag, + EndHeaders: lastFrag, + }) + } else { + return ctx.Framer().WriteContinuation(w.streamID, lastFrag, frag) + } +} + +type write100ContinueHeadersFrame struct { + streamID uint32 +} + +func (w write100ContinueHeadersFrame) writeFrame(ctx writeContext) error { + enc, buf := ctx.HeaderEncoder() + buf.Reset() + encKV(enc, ":status", "100") + return ctx.Framer().WriteHeaders(HeadersFrameParam{ + StreamID: w.streamID, + BlockFragment: buf.Bytes(), + EndStream: false, + EndHeaders: true, + }) +} + +func (w write100ContinueHeadersFrame) staysWithinBuffer(max int) bool { + // Sloppy but conservative: + return 9+2*(len(":status")+len("100")) <= max +} + +type writeWindowUpdate struct { + streamID uint32 // or 0 for conn-level + n uint32 +} + +func (wu writeWindowUpdate) staysWithinBuffer(max int) bool { return frameHeaderLen+4 <= max } + +func (wu writeWindowUpdate) writeFrame(ctx writeContext) error { + return ctx.Framer().WriteWindowUpdate(wu.streamID, wu.n) +} + +// encodeHeaders encodes an http.Header. If keys is not nil, then (k, h[k]) +// is encoded only only if k is in keys. +func encodeHeaders(enc *hpack.Encoder, h http.Header, keys []string) { + if keys == nil { + sorter := sorterPool.Get().(*sorter) + // Using defer here, since the returned keys from the + // sorter.Keys method is only valid until the sorter + // is returned: + defer sorterPool.Put(sorter) + keys = sorter.Keys(h) + } + for _, k := range keys { + vv := h[k] + k = lowerHeader(k) + if !validWireHeaderFieldName(k) { + // Skip it as backup paranoia. Per + // golang.org/issue/14048, these should + // already be rejected at a higher level. + continue + } + isTE := k == "transfer-encoding" + for _, v := range vv { + if !httpguts.ValidHeaderFieldValue(v) { + // TODO: return an error? golang.org/issue/14048 + // For now just omit it. + continue + } + // TODO: more of "8.1.2.2 Connection-Specific Header Fields" + if isTE && v != "trailers" { + continue + } + encKV(enc, k, v) + } + } +} diff --git a/api/vendor/golang.org/x/net/http2/writesched.go b/api/vendor/golang.org/x/net/http2/writesched.go new file mode 100644 index 0000000..4fe3073 --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/writesched.go @@ -0,0 +1,242 @@ +// 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 http2 + +import "fmt" + +// WriteScheduler is the interface implemented by HTTP/2 write schedulers. +// Methods are never called concurrently. +type WriteScheduler interface { + // OpenStream opens a new stream in the write scheduler. + // It is illegal to call this with streamID=0 or with a streamID that is + // already open -- the call may panic. + OpenStream(streamID uint32, options OpenStreamOptions) + + // CloseStream closes a stream in the write scheduler. Any frames queued on + // this stream should be discarded. It is illegal to call this on a stream + // that is not open -- the call may panic. + CloseStream(streamID uint32) + + // AdjustStream adjusts the priority of the given stream. This may be called + // on a stream that has not yet been opened or has been closed. Note that + // RFC 7540 allows PRIORITY frames to be sent on streams in any state. See: + // https://tools.ietf.org/html/rfc7540#section-5.1 + AdjustStream(streamID uint32, priority PriorityParam) + + // Push queues a frame in the scheduler. In most cases, this will not be + // called with wr.StreamID()!=0 unless that stream is currently open. The one + // exception is RST_STREAM frames, which may be sent on idle or closed streams. + Push(wr FrameWriteRequest) + + // Pop dequeues the next frame to write. Returns false if no frames can + // be written. Frames with a given wr.StreamID() are Pop'd in the same + // order they are Push'd. + Pop() (wr FrameWriteRequest, ok bool) +} + +// OpenStreamOptions specifies extra options for WriteScheduler.OpenStream. +type OpenStreamOptions struct { + // PusherID is zero if the stream was initiated by the client. Otherwise, + // PusherID names the stream that pushed the newly opened stream. + PusherID uint32 +} + +// FrameWriteRequest is a request to write a frame. +type FrameWriteRequest struct { + // write is the interface value that does the writing, once the + // WriteScheduler has selected this frame to write. The write + // functions are all defined in write.go. + write writeFramer + + // stream is the stream on which this frame will be written. + // nil for non-stream frames like PING and SETTINGS. + stream *stream + + // done, if non-nil, must be a buffered channel with space for + // 1 message and is sent the return value from write (or an + // earlier error) when the frame has been written. + done chan error +} + +// StreamID returns the id of the stream this frame will be written to. +// 0 is used for non-stream frames such as PING and SETTINGS. +func (wr FrameWriteRequest) StreamID() uint32 { + if wr.stream == nil { + if se, ok := wr.write.(StreamError); ok { + // (*serverConn).resetStream doesn't set + // stream because it doesn't necessarily have + // one. So special case this type of write + // message. + return se.StreamID + } + return 0 + } + return wr.stream.id +} + +// DataSize returns the number of flow control bytes that must be consumed +// to write this entire frame. This is 0 for non-DATA frames. +func (wr FrameWriteRequest) DataSize() int { + if wd, ok := wr.write.(*writeData); ok { + return len(wd.p) + } + return 0 +} + +// Consume consumes min(n, available) bytes from this frame, where available +// is the number of flow control bytes available on the stream. Consume returns +// 0, 1, or 2 frames, where the integer return value gives the number of frames +// returned. +// +// If flow control prevents consuming any bytes, this returns (_, _, 0). If +// the entire frame was consumed, this returns (wr, _, 1). Otherwise, this +// returns (consumed, rest, 2), where 'consumed' contains the consumed bytes and +// 'rest' contains the remaining bytes. The consumed bytes are deducted from the +// underlying stream's flow control budget. +func (wr FrameWriteRequest) Consume(n int32) (FrameWriteRequest, FrameWriteRequest, int) { + var empty FrameWriteRequest + + // Non-DATA frames are always consumed whole. + wd, ok := wr.write.(*writeData) + if !ok || len(wd.p) == 0 { + return wr, empty, 1 + } + + // Might need to split after applying limits. + allowed := wr.stream.flow.available() + if n < allowed { + allowed = n + } + if wr.stream.sc.maxFrameSize < allowed { + allowed = wr.stream.sc.maxFrameSize + } + if allowed <= 0 { + return empty, empty, 0 + } + if len(wd.p) > int(allowed) { + wr.stream.flow.take(allowed) + consumed := FrameWriteRequest{ + stream: wr.stream, + write: &writeData{ + streamID: wd.streamID, + p: wd.p[:allowed], + // Even if the original had endStream set, there + // are bytes remaining because len(wd.p) > allowed, + // so we know endStream is false. + endStream: false, + }, + // Our caller is blocking on the final DATA frame, not + // this intermediate frame, so no need to wait. + done: nil, + } + rest := FrameWriteRequest{ + stream: wr.stream, + write: &writeData{ + streamID: wd.streamID, + p: wd.p[allowed:], + endStream: wd.endStream, + }, + done: wr.done, + } + return consumed, rest, 2 + } + + // The frame is consumed whole. + // NB: This cast cannot overflow because allowed is <= math.MaxInt32. + wr.stream.flow.take(int32(len(wd.p))) + return wr, empty, 1 +} + +// String is for debugging only. +func (wr FrameWriteRequest) String() string { + var des string + if s, ok := wr.write.(fmt.Stringer); ok { + des = s.String() + } else { + des = fmt.Sprintf("%T", wr.write) + } + return fmt.Sprintf("[FrameWriteRequest stream=%d, ch=%v, writer=%v]", wr.StreamID(), wr.done != nil, des) +} + +// replyToWriter sends err to wr.done and panics if the send must block +// This does nothing if wr.done is nil. +func (wr *FrameWriteRequest) replyToWriter(err error) { + if wr.done == nil { + return + } + select { + case wr.done <- err: + default: + panic(fmt.Sprintf("unbuffered done channel passed in for type %T", wr.write)) + } + wr.write = nil // prevent use (assume it's tainted after wr.done send) +} + +// writeQueue is used by implementations of WriteScheduler. +type writeQueue struct { + s []FrameWriteRequest +} + +func (q *writeQueue) empty() bool { return len(q.s) == 0 } + +func (q *writeQueue) push(wr FrameWriteRequest) { + q.s = append(q.s, wr) +} + +func (q *writeQueue) shift() FrameWriteRequest { + if len(q.s) == 0 { + panic("invalid use of queue") + } + wr := q.s[0] + // TODO: less copy-happy queue. + copy(q.s, q.s[1:]) + q.s[len(q.s)-1] = FrameWriteRequest{} + q.s = q.s[:len(q.s)-1] + return wr +} + +// consume consumes up to n bytes from q.s[0]. If the frame is +// entirely consumed, it is removed from the queue. If the frame +// is partially consumed, the frame is kept with the consumed +// bytes removed. Returns true iff any bytes were consumed. +func (q *writeQueue) consume(n int32) (FrameWriteRequest, bool) { + if len(q.s) == 0 { + return FrameWriteRequest{}, false + } + consumed, rest, numresult := q.s[0].Consume(n) + switch numresult { + case 0: + return FrameWriteRequest{}, false + case 1: + q.shift() + case 2: + q.s[0] = rest + } + return consumed, true +} + +type writeQueuePool []*writeQueue + +// put inserts an unused writeQueue into the pool. +func (p *writeQueuePool) put(q *writeQueue) { + for i := range q.s { + q.s[i] = FrameWriteRequest{} + } + q.s = q.s[:0] + *p = append(*p, q) +} + +// get returns an empty writeQueue. +func (p *writeQueuePool) get() *writeQueue { + ln := len(*p) + if ln == 0 { + return new(writeQueue) + } + x := ln - 1 + q := (*p)[x] + (*p)[x] = nil + *p = (*p)[:x] + return q +} diff --git a/api/vendor/golang.org/x/net/http2/writesched_priority.go b/api/vendor/golang.org/x/net/http2/writesched_priority.go new file mode 100644 index 0000000..848fed6 --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/writesched_priority.go @@ -0,0 +1,452 @@ +// 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 http2 + +import ( + "fmt" + "math" + "sort" +) + +// RFC 7540, Section 5.3.5: the default weight is 16. +const priorityDefaultWeight = 15 // 16 = 15 + 1 + +// PriorityWriteSchedulerConfig configures a priorityWriteScheduler. +type PriorityWriteSchedulerConfig struct { + // MaxClosedNodesInTree controls the maximum number of closed streams to + // retain in the priority tree. Setting this to zero saves a small amount + // of memory at the cost of performance. + // + // See RFC 7540, Section 5.3.4: + // "It is possible for a stream to become closed while prioritization + // information ... is in transit. ... This potentially creates suboptimal + // prioritization, since the stream could be given a priority that is + // different from what is intended. To avoid these problems, an endpoint + // SHOULD retain stream prioritization state for a period after streams + // become closed. The longer state is retained, the lower the chance that + // streams are assigned incorrect or default priority values." + MaxClosedNodesInTree int + + // MaxIdleNodesInTree controls the maximum number of idle streams to + // retain in the priority tree. Setting this to zero saves a small amount + // of memory at the cost of performance. + // + // See RFC 7540, Section 5.3.4: + // Similarly, streams that are in the "idle" state can be assigned + // priority or become a parent of other streams. This allows for the + // creation of a grouping node in the dependency tree, which enables + // more flexible expressions of priority. Idle streams begin with a + // default priority (Section 5.3.5). + MaxIdleNodesInTree int + + // ThrottleOutOfOrderWrites enables write throttling to help ensure that + // data is delivered in priority order. This works around a race where + // stream B depends on stream A and both streams are about to call Write + // to queue DATA frames. If B wins the race, a naive scheduler would eagerly + // write as much data from B as possible, but this is suboptimal because A + // is a higher-priority stream. With throttling enabled, we write a small + // amount of data from B to minimize the amount of bandwidth that B can + // steal from A. + ThrottleOutOfOrderWrites bool +} + +// NewPriorityWriteScheduler constructs a WriteScheduler that schedules +// frames by following HTTP/2 priorities as described in RFC 7540 Section 5.3. +// If cfg is nil, default options are used. +func NewPriorityWriteScheduler(cfg *PriorityWriteSchedulerConfig) WriteScheduler { + if cfg == nil { + // For justification of these defaults, see: + // https://docs.google.com/document/d/1oLhNg1skaWD4_DtaoCxdSRN5erEXrH-KnLrMwEpOtFY + cfg = &PriorityWriteSchedulerConfig{ + MaxClosedNodesInTree: 10, + MaxIdleNodesInTree: 10, + ThrottleOutOfOrderWrites: false, + } + } + + ws := &priorityWriteScheduler{ + nodes: make(map[uint32]*priorityNode), + maxClosedNodesInTree: cfg.MaxClosedNodesInTree, + maxIdleNodesInTree: cfg.MaxIdleNodesInTree, + enableWriteThrottle: cfg.ThrottleOutOfOrderWrites, + } + ws.nodes[0] = &ws.root + if cfg.ThrottleOutOfOrderWrites { + ws.writeThrottleLimit = 1024 + } else { + ws.writeThrottleLimit = math.MaxInt32 + } + return ws +} + +type priorityNodeState int + +const ( + priorityNodeOpen priorityNodeState = iota + priorityNodeClosed + priorityNodeIdle +) + +// priorityNode is a node in an HTTP/2 priority tree. +// Each node is associated with a single stream ID. +// See RFC 7540, Section 5.3. +type priorityNode struct { + q writeQueue // queue of pending frames to write + id uint32 // id of the stream, or 0 for the root of the tree + weight uint8 // the actual weight is weight+1, so the value is in [1,256] + state priorityNodeState // open | closed | idle + bytes int64 // number of bytes written by this node, or 0 if closed + subtreeBytes int64 // sum(node.bytes) of all nodes in this subtree + + // These links form the priority tree. + parent *priorityNode + kids *priorityNode // start of the kids list + prev, next *priorityNode // doubly-linked list of siblings +} + +func (n *priorityNode) setParent(parent *priorityNode) { + if n == parent { + panic("setParent to self") + } + if n.parent == parent { + return + } + // Unlink from current parent. + if parent := n.parent; parent != nil { + if n.prev == nil { + parent.kids = n.next + } else { + n.prev.next = n.next + } + if n.next != nil { + n.next.prev = n.prev + } + } + // Link to new parent. + // If parent=nil, remove n from the tree. + // Always insert at the head of parent.kids (this is assumed by walkReadyInOrder). + n.parent = parent + if parent == nil { + n.next = nil + n.prev = nil + } else { + n.next = parent.kids + n.prev = nil + if n.next != nil { + n.next.prev = n + } + parent.kids = n + } +} + +func (n *priorityNode) addBytes(b int64) { + n.bytes += b + for ; n != nil; n = n.parent { + n.subtreeBytes += b + } +} + +// walkReadyInOrder iterates over the tree in priority order, calling f for each node +// with a non-empty write queue. When f returns true, this funcion returns true and the +// walk halts. tmp is used as scratch space for sorting. +// +// f(n, openParent) takes two arguments: the node to visit, n, and a bool that is true +// if any ancestor p of n is still open (ignoring the root node). +func (n *priorityNode) walkReadyInOrder(openParent bool, tmp *[]*priorityNode, f func(*priorityNode, bool) bool) bool { + if !n.q.empty() && f(n, openParent) { + return true + } + if n.kids == nil { + return false + } + + // Don't consider the root "open" when updating openParent since + // we can't send data frames on the root stream (only control frames). + if n.id != 0 { + openParent = openParent || (n.state == priorityNodeOpen) + } + + // Common case: only one kid or all kids have the same weight. + // Some clients don't use weights; other clients (like web browsers) + // use mostly-linear priority trees. + w := n.kids.weight + needSort := false + for k := n.kids.next; k != nil; k = k.next { + if k.weight != w { + needSort = true + break + } + } + if !needSort { + for k := n.kids; k != nil; k = k.next { + if k.walkReadyInOrder(openParent, tmp, f) { + return true + } + } + return false + } + + // Uncommon case: sort the child nodes. We remove the kids from the parent, + // then re-insert after sorting so we can reuse tmp for future sort calls. + *tmp = (*tmp)[:0] + for n.kids != nil { + *tmp = append(*tmp, n.kids) + n.kids.setParent(nil) + } + sort.Sort(sortPriorityNodeSiblings(*tmp)) + for i := len(*tmp) - 1; i >= 0; i-- { + (*tmp)[i].setParent(n) // setParent inserts at the head of n.kids + } + for k := n.kids; k != nil; k = k.next { + if k.walkReadyInOrder(openParent, tmp, f) { + return true + } + } + return false +} + +type sortPriorityNodeSiblings []*priorityNode + +func (z sortPriorityNodeSiblings) Len() int { return len(z) } +func (z sortPriorityNodeSiblings) Swap(i, k int) { z[i], z[k] = z[k], z[i] } +func (z sortPriorityNodeSiblings) Less(i, k int) bool { + // Prefer the subtree that has sent fewer bytes relative to its weight. + // See sections 5.3.2 and 5.3.4. + wi, bi := float64(z[i].weight+1), float64(z[i].subtreeBytes) + wk, bk := float64(z[k].weight+1), float64(z[k].subtreeBytes) + if bi == 0 && bk == 0 { + return wi >= wk + } + if bk == 0 { + return false + } + return bi/bk <= wi/wk +} + +type priorityWriteScheduler struct { + // root is the root of the priority tree, where root.id = 0. + // The root queues control frames that are not associated with any stream. + root priorityNode + + // nodes maps stream ids to priority tree nodes. + nodes map[uint32]*priorityNode + + // maxID is the maximum stream id in nodes. + maxID uint32 + + // lists of nodes that have been closed or are idle, but are kept in + // the tree for improved prioritization. When the lengths exceed either + // maxClosedNodesInTree or maxIdleNodesInTree, old nodes are discarded. + closedNodes, idleNodes []*priorityNode + + // From the config. + maxClosedNodesInTree int + maxIdleNodesInTree int + writeThrottleLimit int32 + enableWriteThrottle bool + + // tmp is scratch space for priorityNode.walkReadyInOrder to reduce allocations. + tmp []*priorityNode + + // pool of empty queues for reuse. + queuePool writeQueuePool +} + +func (ws *priorityWriteScheduler) OpenStream(streamID uint32, options OpenStreamOptions) { + // The stream may be currently idle but cannot be opened or closed. + if curr := ws.nodes[streamID]; curr != nil { + if curr.state != priorityNodeIdle { + panic(fmt.Sprintf("stream %d already opened", streamID)) + } + curr.state = priorityNodeOpen + return + } + + // RFC 7540, Section 5.3.5: + // "All streams are initially assigned a non-exclusive dependency on stream 0x0. + // Pushed streams initially depend on their associated stream. In both cases, + // streams are assigned a default weight of 16." + parent := ws.nodes[options.PusherID] + if parent == nil { + parent = &ws.root + } + n := &priorityNode{ + q: *ws.queuePool.get(), + id: streamID, + weight: priorityDefaultWeight, + state: priorityNodeOpen, + } + n.setParent(parent) + ws.nodes[streamID] = n + if streamID > ws.maxID { + ws.maxID = streamID + } +} + +func (ws *priorityWriteScheduler) CloseStream(streamID uint32) { + if streamID == 0 { + panic("violation of WriteScheduler interface: cannot close stream 0") + } + if ws.nodes[streamID] == nil { + panic(fmt.Sprintf("violation of WriteScheduler interface: unknown stream %d", streamID)) + } + if ws.nodes[streamID].state != priorityNodeOpen { + panic(fmt.Sprintf("violation of WriteScheduler interface: stream %d already closed", streamID)) + } + + n := ws.nodes[streamID] + n.state = priorityNodeClosed + n.addBytes(-n.bytes) + + q := n.q + ws.queuePool.put(&q) + n.q.s = nil + if ws.maxClosedNodesInTree > 0 { + ws.addClosedOrIdleNode(&ws.closedNodes, ws.maxClosedNodesInTree, n) + } else { + ws.removeNode(n) + } +} + +func (ws *priorityWriteScheduler) AdjustStream(streamID uint32, priority PriorityParam) { + if streamID == 0 { + panic("adjustPriority on root") + } + + // If streamID does not exist, there are two cases: + // - A closed stream that has been removed (this will have ID <= maxID) + // - An idle stream that is being used for "grouping" (this will have ID > maxID) + n := ws.nodes[streamID] + if n == nil { + if streamID <= ws.maxID || ws.maxIdleNodesInTree == 0 { + return + } + ws.maxID = streamID + n = &priorityNode{ + q: *ws.queuePool.get(), + id: streamID, + weight: priorityDefaultWeight, + state: priorityNodeIdle, + } + n.setParent(&ws.root) + ws.nodes[streamID] = n + ws.addClosedOrIdleNode(&ws.idleNodes, ws.maxIdleNodesInTree, n) + } + + // Section 5.3.1: A dependency on a stream that is not currently in the tree + // results in that stream being given a default priority (Section 5.3.5). + parent := ws.nodes[priority.StreamDep] + if parent == nil { + n.setParent(&ws.root) + n.weight = priorityDefaultWeight + return + } + + // Ignore if the client tries to make a node its own parent. + if n == parent { + return + } + + // Section 5.3.3: + // "If a stream is made dependent on one of its own dependencies, the + // formerly dependent stream is first moved to be dependent on the + // reprioritized stream's previous parent. The moved dependency retains + // its weight." + // + // That is: if parent depends on n, move parent to depend on n.parent. + for x := parent.parent; x != nil; x = x.parent { + if x == n { + parent.setParent(n.parent) + break + } + } + + // Section 5.3.3: The exclusive flag causes the stream to become the sole + // dependency of its parent stream, causing other dependencies to become + // dependent on the exclusive stream. + if priority.Exclusive { + k := parent.kids + for k != nil { + next := k.next + if k != n { + k.setParent(n) + } + k = next + } + } + + n.setParent(parent) + n.weight = priority.Weight +} + +func (ws *priorityWriteScheduler) Push(wr FrameWriteRequest) { + var n *priorityNode + if id := wr.StreamID(); id == 0 { + n = &ws.root + } else { + n = ws.nodes[id] + if n == nil { + // id is an idle or closed stream. wr should not be a HEADERS or + // DATA frame. However, wr can be a RST_STREAM. In this case, we + // push wr onto the root, rather than creating a new priorityNode, + // since RST_STREAM is tiny and the stream's priority is unknown + // anyway. See issue #17919. + if wr.DataSize() > 0 { + panic("add DATA on non-open stream") + } + n = &ws.root + } + } + n.q.push(wr) +} + +func (ws *priorityWriteScheduler) Pop() (wr FrameWriteRequest, ok bool) { + ws.root.walkReadyInOrder(false, &ws.tmp, func(n *priorityNode, openParent bool) bool { + limit := int32(math.MaxInt32) + if openParent { + limit = ws.writeThrottleLimit + } + wr, ok = n.q.consume(limit) + if !ok { + return false + } + n.addBytes(int64(wr.DataSize())) + // If B depends on A and B continuously has data available but A + // does not, gradually increase the throttling limit to allow B to + // steal more and more bandwidth from A. + if openParent { + ws.writeThrottleLimit += 1024 + if ws.writeThrottleLimit < 0 { + ws.writeThrottleLimit = math.MaxInt32 + } + } else if ws.enableWriteThrottle { + ws.writeThrottleLimit = 1024 + } + return true + }) + return wr, ok +} + +func (ws *priorityWriteScheduler) addClosedOrIdleNode(list *[]*priorityNode, maxSize int, n *priorityNode) { + if maxSize == 0 { + return + } + if len(*list) == maxSize { + // Remove the oldest node, then shift left. + ws.removeNode((*list)[0]) + x := (*list)[1:] + copy(*list, x) + *list = (*list)[:len(x)] + } + *list = append(*list, n) +} + +func (ws *priorityWriteScheduler) removeNode(n *priorityNode) { + for k := n.kids; k != nil; k = k.next { + k.setParent(n.parent) + } + n.setParent(nil) + delete(ws.nodes, n.id) +} diff --git a/api/vendor/golang.org/x/net/http2/writesched_priority_test.go b/api/vendor/golang.org/x/net/http2/writesched_priority_test.go new file mode 100644 index 0000000..f2b535a --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/writesched_priority_test.go @@ -0,0 +1,541 @@ +// 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 http2 + +import ( + "bytes" + "fmt" + "sort" + "testing" +) + +func defaultPriorityWriteScheduler() *priorityWriteScheduler { + return NewPriorityWriteScheduler(nil).(*priorityWriteScheduler) +} + +func checkPriorityWellFormed(ws *priorityWriteScheduler) error { + for id, n := range ws.nodes { + if id != n.id { + return fmt.Errorf("bad ws.nodes: ws.nodes[%d] = %d", id, n.id) + } + if n.parent == nil { + if n.next != nil || n.prev != nil { + return fmt.Errorf("bad node %d: nil parent but prev/next not nil", id) + } + continue + } + found := false + for k := n.parent.kids; k != nil; k = k.next { + if k.id == id { + found = true + break + } + } + if !found { + return fmt.Errorf("bad node %d: not found in parent %d kids list", id, n.parent.id) + } + } + return nil +} + +func fmtTree(ws *priorityWriteScheduler, fmtNode func(*priorityNode) string) string { + var ids []int + for _, n := range ws.nodes { + ids = append(ids, int(n.id)) + } + sort.Ints(ids) + + var buf bytes.Buffer + for _, id := range ids { + if buf.Len() != 0 { + buf.WriteString(" ") + } + if id == 0 { + buf.WriteString(fmtNode(&ws.root)) + } else { + buf.WriteString(fmtNode(ws.nodes[uint32(id)])) + } + } + return buf.String() +} + +func fmtNodeParentSkipRoot(n *priorityNode) string { + switch { + case n.id == 0: + return "" + case n.parent == nil: + return fmt.Sprintf("%d{parent:nil}", n.id) + default: + return fmt.Sprintf("%d{parent:%d}", n.id, n.parent.id) + } +} + +func fmtNodeWeightParentSkipRoot(n *priorityNode) string { + switch { + case n.id == 0: + return "" + case n.parent == nil: + return fmt.Sprintf("%d{weight:%d,parent:nil}", n.id, n.weight) + default: + return fmt.Sprintf("%d{weight:%d,parent:%d}", n.id, n.weight, n.parent.id) + } +} + +func TestPriorityTwoStreams(t *testing.T) { + ws := defaultPriorityWriteScheduler() + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{}) + + want := "1{weight:15,parent:0} 2{weight:15,parent:0}" + if got := fmtTree(ws, fmtNodeWeightParentSkipRoot); got != want { + t.Errorf("After open\ngot %q\nwant %q", got, want) + } + + // Move 1's parent to 2. + ws.AdjustStream(1, PriorityParam{ + StreamDep: 2, + Weight: 32, + Exclusive: false, + }) + want = "1{weight:32,parent:2} 2{weight:15,parent:0}" + if got := fmtTree(ws, fmtNodeWeightParentSkipRoot); got != want { + t.Errorf("After adjust\ngot %q\nwant %q", got, want) + } + + if err := checkPriorityWellFormed(ws); err != nil { + t.Error(err) + } +} + +func TestPriorityAdjustExclusiveZero(t *testing.T) { + // 1, 2, and 3 are all children of the 0 stream. + // Exclusive reprioritization to any of the streams should bring + // the rest of the streams under the reprioritized stream. + ws := defaultPriorityWriteScheduler() + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{}) + ws.OpenStream(3, OpenStreamOptions{}) + + want := "1{weight:15,parent:0} 2{weight:15,parent:0} 3{weight:15,parent:0}" + if got := fmtTree(ws, fmtNodeWeightParentSkipRoot); got != want { + t.Errorf("After open\ngot %q\nwant %q", got, want) + } + + ws.AdjustStream(2, PriorityParam{ + StreamDep: 0, + Weight: 20, + Exclusive: true, + }) + want = "1{weight:15,parent:2} 2{weight:20,parent:0} 3{weight:15,parent:2}" + if got := fmtTree(ws, fmtNodeWeightParentSkipRoot); got != want { + t.Errorf("After adjust\ngot %q\nwant %q", got, want) + } + + if err := checkPriorityWellFormed(ws); err != nil { + t.Error(err) + } +} + +func TestPriorityAdjustOwnParent(t *testing.T) { + // Assigning a node as its own parent should have no effect. + ws := defaultPriorityWriteScheduler() + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{}) + ws.AdjustStream(2, PriorityParam{ + StreamDep: 2, + Weight: 20, + Exclusive: true, + }) + want := "1{weight:15,parent:0} 2{weight:15,parent:0}" + if got := fmtTree(ws, fmtNodeWeightParentSkipRoot); got != want { + t.Errorf("After adjust\ngot %q\nwant %q", got, want) + } + if err := checkPriorityWellFormed(ws); err != nil { + t.Error(err) + } +} + +func TestPriorityClosedStreams(t *testing.T) { + ws := NewPriorityWriteScheduler(&PriorityWriteSchedulerConfig{MaxClosedNodesInTree: 2}).(*priorityWriteScheduler) + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{PusherID: 1}) + ws.OpenStream(3, OpenStreamOptions{PusherID: 2}) + ws.OpenStream(4, OpenStreamOptions{PusherID: 3}) + + // Close the first three streams. We lose 1, but keep 2 and 3. + ws.CloseStream(1) + ws.CloseStream(2) + ws.CloseStream(3) + + want := "2{weight:15,parent:0} 3{weight:15,parent:2} 4{weight:15,parent:3}" + if got := fmtTree(ws, fmtNodeWeightParentSkipRoot); got != want { + t.Errorf("After close\ngot %q\nwant %q", got, want) + } + if err := checkPriorityWellFormed(ws); err != nil { + t.Error(err) + } + + // Adding a stream as an exclusive child of 1 gives it default + // priorities, since 1 is gone. + ws.OpenStream(5, OpenStreamOptions{}) + ws.AdjustStream(5, PriorityParam{StreamDep: 1, Weight: 15, Exclusive: true}) + + // Adding a stream as an exclusive child of 2 should work, since 2 is not gone. + ws.OpenStream(6, OpenStreamOptions{}) + ws.AdjustStream(6, PriorityParam{StreamDep: 2, Weight: 15, Exclusive: true}) + + want = "2{weight:15,parent:0} 3{weight:15,parent:6} 4{weight:15,parent:3} 5{weight:15,parent:0} 6{weight:15,parent:2}" + if got := fmtTree(ws, fmtNodeWeightParentSkipRoot); got != want { + t.Errorf("After add streams\ngot %q\nwant %q", got, want) + } + if err := checkPriorityWellFormed(ws); err != nil { + t.Error(err) + } +} + +func TestPriorityClosedStreamsDisabled(t *testing.T) { + ws := NewPriorityWriteScheduler(&PriorityWriteSchedulerConfig{}).(*priorityWriteScheduler) + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{PusherID: 1}) + ws.OpenStream(3, OpenStreamOptions{PusherID: 2}) + + // Close the first two streams. We keep only 3. + ws.CloseStream(1) + ws.CloseStream(2) + + want := "3{weight:15,parent:0}" + if got := fmtTree(ws, fmtNodeWeightParentSkipRoot); got != want { + t.Errorf("After close\ngot %q\nwant %q", got, want) + } + if err := checkPriorityWellFormed(ws); err != nil { + t.Error(err) + } +} + +func TestPriorityIdleStreams(t *testing.T) { + ws := NewPriorityWriteScheduler(&PriorityWriteSchedulerConfig{MaxIdleNodesInTree: 2}).(*priorityWriteScheduler) + ws.AdjustStream(1, PriorityParam{StreamDep: 0, Weight: 15}) // idle + ws.AdjustStream(2, PriorityParam{StreamDep: 0, Weight: 15}) // idle + ws.AdjustStream(3, PriorityParam{StreamDep: 2, Weight: 20}) // idle + ws.OpenStream(4, OpenStreamOptions{}) + ws.OpenStream(5, OpenStreamOptions{}) + ws.OpenStream(6, OpenStreamOptions{}) + ws.AdjustStream(4, PriorityParam{StreamDep: 1, Weight: 15}) + ws.AdjustStream(5, PriorityParam{StreamDep: 2, Weight: 15}) + ws.AdjustStream(6, PriorityParam{StreamDep: 3, Weight: 15}) + + want := "2{weight:15,parent:0} 3{weight:20,parent:2} 4{weight:15,parent:0} 5{weight:15,parent:2} 6{weight:15,parent:3}" + if got := fmtTree(ws, fmtNodeWeightParentSkipRoot); got != want { + t.Errorf("After open\ngot %q\nwant %q", got, want) + } + if err := checkPriorityWellFormed(ws); err != nil { + t.Error(err) + } +} + +func TestPriorityIdleStreamsDisabled(t *testing.T) { + ws := NewPriorityWriteScheduler(&PriorityWriteSchedulerConfig{}).(*priorityWriteScheduler) + ws.AdjustStream(1, PriorityParam{StreamDep: 0, Weight: 15}) // idle + ws.AdjustStream(2, PriorityParam{StreamDep: 0, Weight: 15}) // idle + ws.AdjustStream(3, PriorityParam{StreamDep: 2, Weight: 20}) // idle + ws.OpenStream(4, OpenStreamOptions{}) + + want := "4{weight:15,parent:0}" + if got := fmtTree(ws, fmtNodeWeightParentSkipRoot); got != want { + t.Errorf("After open\ngot %q\nwant %q", got, want) + } + if err := checkPriorityWellFormed(ws); err != nil { + t.Error(err) + } +} + +func TestPrioritySection531NonExclusive(t *testing.T) { + // Example from RFC 7540 Section 5.3.1. + // A,B,C,D = 1,2,3,4 + ws := defaultPriorityWriteScheduler() + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{PusherID: 1}) + ws.OpenStream(3, OpenStreamOptions{PusherID: 1}) + ws.OpenStream(4, OpenStreamOptions{}) + ws.AdjustStream(4, PriorityParam{ + StreamDep: 1, + Weight: 15, + Exclusive: false, + }) + want := "1{parent:0} 2{parent:1} 3{parent:1} 4{parent:1}" + if got := fmtTree(ws, fmtNodeParentSkipRoot); got != want { + t.Errorf("After adjust\ngot %q\nwant %q", got, want) + } + if err := checkPriorityWellFormed(ws); err != nil { + t.Error(err) + } +} + +func TestPrioritySection531Exclusive(t *testing.T) { + // Example from RFC 7540 Section 5.3.1. + // A,B,C,D = 1,2,3,4 + ws := defaultPriorityWriteScheduler() + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{PusherID: 1}) + ws.OpenStream(3, OpenStreamOptions{PusherID: 1}) + ws.OpenStream(4, OpenStreamOptions{}) + ws.AdjustStream(4, PriorityParam{ + StreamDep: 1, + Weight: 15, + Exclusive: true, + }) + want := "1{parent:0} 2{parent:4} 3{parent:4} 4{parent:1}" + if got := fmtTree(ws, fmtNodeParentSkipRoot); got != want { + t.Errorf("After adjust\ngot %q\nwant %q", got, want) + } + if err := checkPriorityWellFormed(ws); err != nil { + t.Error(err) + } +} + +func makeSection533Tree() *priorityWriteScheduler { + // Initial tree from RFC 7540 Section 5.3.3. + // A,B,C,D,E,F = 1,2,3,4,5,6 + ws := defaultPriorityWriteScheduler() + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{PusherID: 1}) + ws.OpenStream(3, OpenStreamOptions{PusherID: 1}) + ws.OpenStream(4, OpenStreamOptions{PusherID: 3}) + ws.OpenStream(5, OpenStreamOptions{PusherID: 3}) + ws.OpenStream(6, OpenStreamOptions{PusherID: 4}) + return ws +} + +func TestPrioritySection533NonExclusive(t *testing.T) { + // Example from RFC 7540 Section 5.3.3. + // A,B,C,D,E,F = 1,2,3,4,5,6 + ws := defaultPriorityWriteScheduler() + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{PusherID: 1}) + ws.OpenStream(3, OpenStreamOptions{PusherID: 1}) + ws.OpenStream(4, OpenStreamOptions{PusherID: 3}) + ws.OpenStream(5, OpenStreamOptions{PusherID: 3}) + ws.OpenStream(6, OpenStreamOptions{PusherID: 4}) + ws.AdjustStream(1, PriorityParam{ + StreamDep: 4, + Weight: 15, + Exclusive: false, + }) + want := "1{parent:4} 2{parent:1} 3{parent:1} 4{parent:0} 5{parent:3} 6{parent:4}" + if got := fmtTree(ws, fmtNodeParentSkipRoot); got != want { + t.Errorf("After adjust\ngot %q\nwant %q", got, want) + } + if err := checkPriorityWellFormed(ws); err != nil { + t.Error(err) + } +} + +func TestPrioritySection533Exclusive(t *testing.T) { + // Example from RFC 7540 Section 5.3.3. + // A,B,C,D,E,F = 1,2,3,4,5,6 + ws := defaultPriorityWriteScheduler() + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{PusherID: 1}) + ws.OpenStream(3, OpenStreamOptions{PusherID: 1}) + ws.OpenStream(4, OpenStreamOptions{PusherID: 3}) + ws.OpenStream(5, OpenStreamOptions{PusherID: 3}) + ws.OpenStream(6, OpenStreamOptions{PusherID: 4}) + ws.AdjustStream(1, PriorityParam{ + StreamDep: 4, + Weight: 15, + Exclusive: true, + }) + want := "1{parent:4} 2{parent:1} 3{parent:1} 4{parent:0} 5{parent:3} 6{parent:1}" + if got := fmtTree(ws, fmtNodeParentSkipRoot); got != want { + t.Errorf("After adjust\ngot %q\nwant %q", got, want) + } + if err := checkPriorityWellFormed(ws); err != nil { + t.Error(err) + } +} + +func checkPopAll(ws WriteScheduler, order []uint32) error { + for k, id := range order { + wr, ok := ws.Pop() + if !ok { + return fmt.Errorf("Pop[%d]: got ok=false, want %d (order=%v)", k, id, order) + } + if got := wr.StreamID(); got != id { + return fmt.Errorf("Pop[%d]: got %v, want %d (order=%v)", k, got, id, order) + } + } + wr, ok := ws.Pop() + if ok { + return fmt.Errorf("Pop[%d]: got %v, want ok=false (order=%v)", len(order), wr.StreamID(), order) + } + return nil +} + +func TestPriorityPopFrom533Tree(t *testing.T) { + ws := makeSection533Tree() + + ws.Push(makeWriteHeadersRequest(3 /*C*/)) + ws.Push(makeWriteNonStreamRequest()) + ws.Push(makeWriteHeadersRequest(5 /*E*/)) + ws.Push(makeWriteHeadersRequest(1 /*A*/)) + t.Log("tree:", fmtTree(ws, fmtNodeParentSkipRoot)) + + if err := checkPopAll(ws, []uint32{0 /*NonStream*/, 1, 3, 5}); err != nil { + t.Error(err) + } +} + +func TestPriorityPopFromLinearTree(t *testing.T) { + ws := defaultPriorityWriteScheduler() + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{PusherID: 1}) + ws.OpenStream(3, OpenStreamOptions{PusherID: 2}) + ws.OpenStream(4, OpenStreamOptions{PusherID: 3}) + + ws.Push(makeWriteHeadersRequest(3)) + ws.Push(makeWriteHeadersRequest(4)) + ws.Push(makeWriteHeadersRequest(1)) + ws.Push(makeWriteHeadersRequest(2)) + ws.Push(makeWriteNonStreamRequest()) + ws.Push(makeWriteNonStreamRequest()) + t.Log("tree:", fmtTree(ws, fmtNodeParentSkipRoot)) + + if err := checkPopAll(ws, []uint32{0, 0 /*NonStreams*/, 1, 2, 3, 4}); err != nil { + t.Error(err) + } +} + +func TestPriorityFlowControl(t *testing.T) { + ws := NewPriorityWriteScheduler(&PriorityWriteSchedulerConfig{ThrottleOutOfOrderWrites: false}) + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{PusherID: 1}) + + sc := &serverConn{maxFrameSize: 16} + st1 := &stream{id: 1, sc: sc} + st2 := &stream{id: 2, sc: sc} + + ws.Push(FrameWriteRequest{&writeData{1, make([]byte, 16), false}, st1, nil}) + ws.Push(FrameWriteRequest{&writeData{2, make([]byte, 16), false}, st2, nil}) + ws.AdjustStream(2, PriorityParam{StreamDep: 1}) + + // No flow-control bytes available. + if wr, ok := ws.Pop(); ok { + t.Fatalf("Pop(limited by flow control)=%v,true, want false", wr) + } + + // Add enough flow-control bytes to write st2 in two Pop calls. + // Should write data from st2 even though it's lower priority than st1. + for i := 1; i <= 2; i++ { + st2.flow.add(8) + wr, ok := ws.Pop() + if !ok { + t.Fatalf("Pop(%d)=false, want true", i) + } + if got, want := wr.DataSize(), 8; got != want { + t.Fatalf("Pop(%d)=%d bytes, want %d bytes", i, got, want) + } + } +} + +func TestPriorityThrottleOutOfOrderWrites(t *testing.T) { + ws := NewPriorityWriteScheduler(&PriorityWriteSchedulerConfig{ThrottleOutOfOrderWrites: true}) + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{PusherID: 1}) + + sc := &serverConn{maxFrameSize: 4096} + st1 := &stream{id: 1, sc: sc} + st2 := &stream{id: 2, sc: sc} + st1.flow.add(4096) + st2.flow.add(4096) + ws.Push(FrameWriteRequest{&writeData{2, make([]byte, 4096), false}, st2, nil}) + ws.AdjustStream(2, PriorityParam{StreamDep: 1}) + + // We have enough flow-control bytes to write st2 in a single Pop call. + // However, due to out-of-order write throttling, the first call should + // only write 1KB. + wr, ok := ws.Pop() + if !ok { + t.Fatalf("Pop(st2.first)=false, want true") + } + if got, want := wr.StreamID(), uint32(2); got != want { + t.Fatalf("Pop(st2.first)=stream %d, want stream %d", got, want) + } + if got, want := wr.DataSize(), 1024; got != want { + t.Fatalf("Pop(st2.first)=%d bytes, want %d bytes", got, want) + } + + // Now add data on st1. This should take precedence. + ws.Push(FrameWriteRequest{&writeData{1, make([]byte, 4096), false}, st1, nil}) + wr, ok = ws.Pop() + if !ok { + t.Fatalf("Pop(st1)=false, want true") + } + if got, want := wr.StreamID(), uint32(1); got != want { + t.Fatalf("Pop(st1)=stream %d, want stream %d", got, want) + } + if got, want := wr.DataSize(), 4096; got != want { + t.Fatalf("Pop(st1)=%d bytes, want %d bytes", got, want) + } + + // Should go back to writing 1KB from st2. + wr, ok = ws.Pop() + if !ok { + t.Fatalf("Pop(st2.last)=false, want true") + } + if got, want := wr.StreamID(), uint32(2); got != want { + t.Fatalf("Pop(st2.last)=stream %d, want stream %d", got, want) + } + if got, want := wr.DataSize(), 1024; got != want { + t.Fatalf("Pop(st2.last)=%d bytes, want %d bytes", got, want) + } +} + +func TestPriorityWeights(t *testing.T) { + ws := defaultPriorityWriteScheduler() + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{}) + + sc := &serverConn{maxFrameSize: 8} + st1 := &stream{id: 1, sc: sc} + st2 := &stream{id: 2, sc: sc} + st1.flow.add(40) + st2.flow.add(40) + + ws.Push(FrameWriteRequest{&writeData{1, make([]byte, 40), false}, st1, nil}) + ws.Push(FrameWriteRequest{&writeData{2, make([]byte, 40), false}, st2, nil}) + ws.AdjustStream(1, PriorityParam{StreamDep: 0, Weight: 34}) + ws.AdjustStream(2, PriorityParam{StreamDep: 0, Weight: 9}) + + // st1 gets 3.5x the bandwidth of st2 (3.5 = (34+1)/(9+1)). + // The maximum frame size is 8 bytes. The write sequence should be: + // st1, total bytes so far is (st1=8, st=0) + // st2, total bytes so far is (st1=8, st=8) + // st1, total bytes so far is (st1=16, st=8) + // st1, total bytes so far is (st1=24, st=8) // 3x bandwidth + // st1, total bytes so far is (st1=32, st=8) // 4x bandwidth + // st2, total bytes so far is (st1=32, st=16) // 2x bandwidth + // st1, total bytes so far is (st1=40, st=16) + // st2, total bytes so far is (st1=40, st=24) + // st2, total bytes so far is (st1=40, st=32) + // st2, total bytes so far is (st1=40, st=40) + if err := checkPopAll(ws, []uint32{1, 2, 1, 1, 1, 2, 1, 2, 2, 2}); err != nil { + t.Error(err) + } +} + +func TestPriorityRstStreamOnNonOpenStreams(t *testing.T) { + ws := NewPriorityWriteScheduler(&PriorityWriteSchedulerConfig{ + MaxClosedNodesInTree: 0, + MaxIdleNodesInTree: 0, + }) + ws.OpenStream(1, OpenStreamOptions{}) + ws.CloseStream(1) + ws.Push(FrameWriteRequest{write: streamError(1, ErrCodeProtocol)}) + ws.Push(FrameWriteRequest{write: streamError(2, ErrCodeProtocol)}) + + if err := checkPopAll(ws, []uint32{1, 2}); err != nil { + t.Error(err) + } +} diff --git a/api/vendor/golang.org/x/net/http2/writesched_random.go b/api/vendor/golang.org/x/net/http2/writesched_random.go new file mode 100644 index 0000000..36d7919 --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/writesched_random.go @@ -0,0 +1,72 @@ +// 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 http2 + +import "math" + +// NewRandomWriteScheduler constructs a WriteScheduler that ignores HTTP/2 +// priorities. Control frames like SETTINGS and PING are written before DATA +// frames, but if no control frames are queued and multiple streams have queued +// HEADERS or DATA frames, Pop selects a ready stream arbitrarily. +func NewRandomWriteScheduler() WriteScheduler { + return &randomWriteScheduler{sq: make(map[uint32]*writeQueue)} +} + +type randomWriteScheduler struct { + // zero are frames not associated with a specific stream. + zero writeQueue + + // sq contains the stream-specific queues, keyed by stream ID. + // When a stream is idle or closed, it's deleted from the map. + sq map[uint32]*writeQueue + + // pool of empty queues for reuse. + queuePool writeQueuePool +} + +func (ws *randomWriteScheduler) OpenStream(streamID uint32, options OpenStreamOptions) { + // no-op: idle streams are not tracked +} + +func (ws *randomWriteScheduler) CloseStream(streamID uint32) { + q, ok := ws.sq[streamID] + if !ok { + return + } + delete(ws.sq, streamID) + ws.queuePool.put(q) +} + +func (ws *randomWriteScheduler) AdjustStream(streamID uint32, priority PriorityParam) { + // no-op: priorities are ignored +} + +func (ws *randomWriteScheduler) Push(wr FrameWriteRequest) { + id := wr.StreamID() + if id == 0 { + ws.zero.push(wr) + return + } + q, ok := ws.sq[id] + if !ok { + q = ws.queuePool.get() + ws.sq[id] = q + } + q.push(wr) +} + +func (ws *randomWriteScheduler) Pop() (FrameWriteRequest, bool) { + // Control frames first. + if !ws.zero.empty() { + return ws.zero.shift(), true + } + // Iterate over all non-idle streams until finding one that can be consumed. + for _, q := range ws.sq { + if wr, ok := q.consume(math.MaxInt32); ok { + return wr, true + } + } + return FrameWriteRequest{}, false +} diff --git a/api/vendor/golang.org/x/net/http2/writesched_random_test.go b/api/vendor/golang.org/x/net/http2/writesched_random_test.go new file mode 100644 index 0000000..3bf4aa3 --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/writesched_random_test.go @@ -0,0 +1,44 @@ +// 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 http2 + +import "testing" + +func TestRandomScheduler(t *testing.T) { + ws := NewRandomWriteScheduler() + ws.Push(makeWriteHeadersRequest(3)) + ws.Push(makeWriteHeadersRequest(4)) + ws.Push(makeWriteHeadersRequest(1)) + ws.Push(makeWriteHeadersRequest(2)) + ws.Push(makeWriteNonStreamRequest()) + ws.Push(makeWriteNonStreamRequest()) + + // Pop all frames. Should get the non-stream requests first, + // followed by the stream requests in any order. + var order []FrameWriteRequest + for { + wr, ok := ws.Pop() + if !ok { + break + } + order = append(order, wr) + } + t.Logf("got frames: %v", order) + if len(order) != 6 { + t.Fatalf("got %d frames, expected 6", len(order)) + } + if order[0].StreamID() != 0 || order[1].StreamID() != 0 { + t.Fatal("expected non-stream frames first", order[0], order[1]) + } + got := make(map[uint32]bool) + for _, wr := range order[2:] { + got[wr.StreamID()] = true + } + for id := uint32(1); id <= 4; id++ { + if !got[id] { + t.Errorf("frame not found for stream %d", id) + } + } +} diff --git a/api/vendor/golang.org/x/net/http2/writesched_test.go b/api/vendor/golang.org/x/net/http2/writesched_test.go new file mode 100644 index 0000000..0807056 --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/writesched_test.go @@ -0,0 +1,125 @@ +// 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 http2 + +import ( + "fmt" + "math" + "reflect" + "testing" +) + +func makeWriteNonStreamRequest() FrameWriteRequest { + return FrameWriteRequest{writeSettingsAck{}, nil, nil} +} + +func makeWriteHeadersRequest(streamID uint32) FrameWriteRequest { + st := &stream{id: streamID} + return FrameWriteRequest{&writeResHeaders{streamID: streamID, httpResCode: 200}, st, nil} +} + +func checkConsume(wr FrameWriteRequest, nbytes int32, want []FrameWriteRequest) error { + consumed, rest, n := wr.Consume(nbytes) + var wantConsumed, wantRest FrameWriteRequest + switch len(want) { + case 0: + case 1: + wantConsumed = want[0] + case 2: + wantConsumed = want[0] + wantRest = want[1] + } + if !reflect.DeepEqual(consumed, wantConsumed) || !reflect.DeepEqual(rest, wantRest) || n != len(want) { + return fmt.Errorf("got %v, %v, %v\nwant %v, %v, %v", consumed, rest, n, wantConsumed, wantRest, len(want)) + } + return nil +} + +func TestFrameWriteRequestNonData(t *testing.T) { + wr := makeWriteNonStreamRequest() + if got, want := wr.DataSize(), 0; got != want { + t.Errorf("DataSize: got %v, want %v", got, want) + } + + // Non-DATA frames are always consumed whole. + if err := checkConsume(wr, 0, []FrameWriteRequest{wr}); err != nil { + t.Errorf("Consume:\n%v", err) + } +} + +func TestFrameWriteRequestData(t *testing.T) { + st := &stream{ + id: 1, + sc: &serverConn{maxFrameSize: 16}, + } + const size = 32 + wr := FrameWriteRequest{&writeData{st.id, make([]byte, size), true}, st, make(chan error)} + if got, want := wr.DataSize(), size; got != want { + t.Errorf("DataSize: got %v, want %v", got, want) + } + + // No flow-control bytes available: cannot consume anything. + if err := checkConsume(wr, math.MaxInt32, []FrameWriteRequest{}); err != nil { + t.Errorf("Consume(limited by flow control):\n%v", err) + } + + // Add enough flow-control bytes to consume the entire frame, + // but we're now restricted by st.sc.maxFrameSize. + st.flow.add(size) + want := []FrameWriteRequest{ + { + write: &writeData{st.id, make([]byte, st.sc.maxFrameSize), false}, + stream: st, + done: nil, + }, + { + write: &writeData{st.id, make([]byte, size-st.sc.maxFrameSize), true}, + stream: st, + done: wr.done, + }, + } + if err := checkConsume(wr, math.MaxInt32, want); err != nil { + t.Errorf("Consume(limited by maxFrameSize):\n%v", err) + } + rest := want[1] + + // Consume 8 bytes from the remaining frame. + want = []FrameWriteRequest{ + { + write: &writeData{st.id, make([]byte, 8), false}, + stream: st, + done: nil, + }, + { + write: &writeData{st.id, make([]byte, size-st.sc.maxFrameSize-8), true}, + stream: st, + done: wr.done, + }, + } + if err := checkConsume(rest, 8, want); err != nil { + t.Errorf("Consume(8):\n%v", err) + } + rest = want[1] + + // Consume all remaining bytes. + want = []FrameWriteRequest{ + { + write: &writeData{st.id, make([]byte, size-st.sc.maxFrameSize-8), true}, + stream: st, + done: wr.done, + }, + } + if err := checkConsume(rest, math.MaxInt32, want); err != nil { + t.Errorf("Consume(remainder):\n%v", err) + } +} + +func TestFrameWriteRequest_StreamID(t *testing.T) { + const streamID = 123 + wr := FrameWriteRequest{write: streamError(streamID, ErrCodeNo)} + if got := wr.StreamID(); got != streamID { + t.Errorf("FrameWriteRequest(StreamError) = %v; want %v", got, streamID) + } +} diff --git a/api/vendor/golang.org/x/net/http2/z_spec_test.go b/api/vendor/golang.org/x/net/http2/z_spec_test.go new file mode 100644 index 0000000..610b2cd --- /dev/null +++ b/api/vendor/golang.org/x/net/http2/z_spec_test.go @@ -0,0 +1,356 @@ +// 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 http2 + +import ( + "bytes" + "encoding/xml" + "flag" + "fmt" + "io" + "os" + "reflect" + "regexp" + "sort" + "strconv" + "strings" + "sync" + "testing" +) + +var coverSpec = flag.Bool("coverspec", false, "Run spec coverage tests") + +// The global map of sentence coverage for the http2 spec. +var defaultSpecCoverage specCoverage + +var loadSpecOnce sync.Once + +func loadSpec() { + if f, err := os.Open("testdata/draft-ietf-httpbis-http2.xml"); err != nil { + panic(err) + } else { + defaultSpecCoverage = readSpecCov(f) + f.Close() + } +} + +// covers marks all sentences for section sec in defaultSpecCoverage. Sentences not +// "covered" will be included in report outputted by TestSpecCoverage. +func covers(sec, sentences string) { + loadSpecOnce.Do(loadSpec) + defaultSpecCoverage.cover(sec, sentences) +} + +type specPart struct { + section string + sentence string +} + +func (ss specPart) Less(oo specPart) bool { + atoi := func(s string) int { + n, err := strconv.Atoi(s) + if err != nil { + panic(err) + } + return n + } + a := strings.Split(ss.section, ".") + b := strings.Split(oo.section, ".") + for len(a) > 0 { + if len(b) == 0 { + return false + } + x, y := atoi(a[0]), atoi(b[0]) + if x == y { + a, b = a[1:], b[1:] + continue + } + return x < y + } + if len(b) > 0 { + return true + } + return false +} + +type bySpecSection []specPart + +func (a bySpecSection) Len() int { return len(a) } +func (a bySpecSection) Less(i, j int) bool { return a[i].Less(a[j]) } +func (a bySpecSection) Swap(i, j int) { a[i], a[j] = a[j], a[i] } + +type specCoverage struct { + coverage map[specPart]bool + d *xml.Decoder +} + +func joinSection(sec []int) string { + s := fmt.Sprintf("%d", sec[0]) + for _, n := range sec[1:] { + s = fmt.Sprintf("%s.%d", s, n) + } + return s +} + +func (sc specCoverage) readSection(sec []int) { + var ( + buf = new(bytes.Buffer) + sub = 0 + ) + for { + tk, err := sc.d.Token() + if err != nil { + if err == io.EOF { + return + } + panic(err) + } + switch v := tk.(type) { + case xml.StartElement: + if skipElement(v) { + if err := sc.d.Skip(); err != nil { + panic(err) + } + if v.Name.Local == "section" { + sub++ + } + break + } + switch v.Name.Local { + case "section": + sub++ + sc.readSection(append(sec, sub)) + case "xref": + buf.Write(sc.readXRef(v)) + } + case xml.CharData: + if len(sec) == 0 { + break + } + buf.Write(v) + case xml.EndElement: + if v.Name.Local == "section" { + sc.addSentences(joinSection(sec), buf.String()) + return + } + } + } +} + +func (sc specCoverage) readXRef(se xml.StartElement) []byte { + var b []byte + for { + tk, err := sc.d.Token() + if err != nil { + panic(err) + } + switch v := tk.(type) { + case xml.CharData: + if b != nil { + panic("unexpected CharData") + } + b = []byte(string(v)) + case xml.EndElement: + if v.Name.Local != "xref" { + panic("expected ") + } + if b != nil { + return b + } + sig := attrSig(se) + switch sig { + case "target": + return []byte(fmt.Sprintf("[%s]", attrValue(se, "target"))) + case "fmt-of,rel,target", "fmt-,,rel,target": + return []byte(fmt.Sprintf("[%s, %s]", attrValue(se, "target"), attrValue(se, "rel"))) + case "fmt-of,sec,target", "fmt-,,sec,target": + return []byte(fmt.Sprintf("[section %s of %s]", attrValue(se, "sec"), attrValue(se, "target"))) + case "fmt-of,rel,sec,target": + return []byte(fmt.Sprintf("[section %s of %s, %s]", attrValue(se, "sec"), attrValue(se, "target"), attrValue(se, "rel"))) + default: + panic(fmt.Sprintf("unknown attribute signature %q in %#v", sig, fmt.Sprintf("%#v", se))) + } + default: + panic(fmt.Sprintf("unexpected tag %q", v)) + } + } +} + +var skipAnchor = map[string]bool{ + "intro": true, + "Overview": true, +} + +var skipTitle = map[string]bool{ + "Acknowledgements": true, + "Change Log": true, + "Document Organization": true, + "Conventions and Terminology": true, +} + +func skipElement(s xml.StartElement) bool { + switch s.Name.Local { + case "artwork": + return true + case "section": + for _, attr := range s.Attr { + switch attr.Name.Local { + case "anchor": + if skipAnchor[attr.Value] || strings.HasPrefix(attr.Value, "changes.since.") { + return true + } + case "title": + if skipTitle[attr.Value] { + return true + } + } + } + } + return false +} + +func readSpecCov(r io.Reader) specCoverage { + sc := specCoverage{ + coverage: map[specPart]bool{}, + d: xml.NewDecoder(r)} + sc.readSection(nil) + return sc +} + +func (sc specCoverage) addSentences(sec string, sentence string) { + for _, s := range parseSentences(sentence) { + sc.coverage[specPart{sec, s}] = false + } +} + +func (sc specCoverage) cover(sec string, sentence string) { + for _, s := range parseSentences(sentence) { + p := specPart{sec, s} + if _, ok := sc.coverage[p]; !ok { + panic(fmt.Sprintf("Not found in spec: %q, %q", sec, s)) + } + sc.coverage[specPart{sec, s}] = true + } + +} + +var whitespaceRx = regexp.MustCompile(`\s+`) + +func parseSentences(sens string) []string { + sens = strings.TrimSpace(sens) + if sens == "" { + return nil + } + ss := strings.Split(whitespaceRx.ReplaceAllString(sens, " "), ". ") + for i, s := range ss { + s = strings.TrimSpace(s) + if !strings.HasSuffix(s, ".") { + s += "." + } + ss[i] = s + } + return ss +} + +func TestSpecParseSentences(t *testing.T) { + tests := []struct { + ss string + want []string + }{ + {"Sentence 1. Sentence 2.", + []string{ + "Sentence 1.", + "Sentence 2.", + }}, + {"Sentence 1. \nSentence 2.\tSentence 3.", + []string{ + "Sentence 1.", + "Sentence 2.", + "Sentence 3.", + }}, + } + + for i, tt := range tests { + got := parseSentences(tt.ss) + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("%d: got = %q, want %q", i, got, tt.want) + } + } +} + +func TestSpecCoverage(t *testing.T) { + if !*coverSpec { + t.Skip() + } + + loadSpecOnce.Do(loadSpec) + + var ( + list []specPart + cv = defaultSpecCoverage.coverage + total = len(cv) + complete = 0 + ) + + for sp, touched := range defaultSpecCoverage.coverage { + if touched { + complete++ + } else { + list = append(list, sp) + } + } + sort.Stable(bySpecSection(list)) + + if testing.Short() && len(list) > 5 { + list = list[:5] + } + + for _, p := range list { + t.Errorf("\tSECTION %s: %s", p.section, p.sentence) + } + + t.Logf("%d/%d (%d%%) sentences covered", complete, total, (complete/total)*100) +} + +func attrSig(se xml.StartElement) string { + var names []string + for _, attr := range se.Attr { + if attr.Name.Local == "fmt" { + names = append(names, "fmt-"+attr.Value) + } else { + names = append(names, attr.Name.Local) + } + } + sort.Strings(names) + return strings.Join(names, ",") +} + +func attrValue(se xml.StartElement, attr string) string { + for _, a := range se.Attr { + if a.Name.Local == attr { + return a.Value + } + } + panic("unknown attribute " + attr) +} + +func TestSpecPartLess(t *testing.T) { + tests := []struct { + sec1, sec2 string + want bool + }{ + {"6.2.1", "6.2", false}, + {"6.2", "6.2.1", true}, + {"6.10", "6.10.1", true}, + {"6.10", "6.1.1", false}, // 10, not 1 + {"6.1", "6.1", false}, // equal, so not less + } + for _, tt := range tests { + got := (specPart{tt.sec1, "foo"}).Less(specPart{tt.sec2, "foo"}) + if got != tt.want { + t.Errorf("Less(%q, %q) = %v; want %v", tt.sec1, tt.sec2, got, tt.want) + } + } +} diff --git a/api/vendor/golang.org/x/net/icmp/diag_test.go b/api/vendor/golang.org/x/net/icmp/diag_test.go new file mode 100644 index 0000000..2ecd465 --- /dev/null +++ b/api/vendor/golang.org/x/net/icmp/diag_test.go @@ -0,0 +1,274 @@ +// 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 icmp_test + +import ( + "errors" + "fmt" + "net" + "os" + "runtime" + "sync" + "testing" + "time" + + "golang.org/x/net/icmp" + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv4" + "golang.org/x/net/ipv6" +) + +type diagTest struct { + network, address string + protocol int + m icmp.Message +} + +func TestDiag(t *testing.T) { + if testing.Short() { + t.Skip("avoid external network") + } + + t.Run("Ping/NonPrivileged", func(t *testing.T) { + switch runtime.GOOS { + case "darwin": + case "linux": + t.Log("you may need to adjust the net.ipv4.ping_group_range kernel state") + default: + t.Logf("not supported on %s", runtime.GOOS) + return + } + for i, dt := range []diagTest{ + { + "udp4", "0.0.0.0", iana.ProtocolICMP, + icmp.Message{ + Type: ipv4.ICMPTypeEcho, Code: 0, + Body: &icmp.Echo{ + ID: os.Getpid() & 0xffff, + Data: []byte("HELLO-R-U-THERE"), + }, + }, + }, + + { + "udp6", "::", iana.ProtocolIPv6ICMP, + icmp.Message{ + Type: ipv6.ICMPTypeEchoRequest, Code: 0, + Body: &icmp.Echo{ + ID: os.Getpid() & 0xffff, + Data: []byte("HELLO-R-U-THERE"), + }, + }, + }, + } { + if err := doDiag(dt, i); err != nil { + t.Error(err) + } + } + }) + t.Run("Ping/Privileged", func(t *testing.T) { + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + for i, dt := range []diagTest{ + { + "ip4:icmp", "0.0.0.0", iana.ProtocolICMP, + icmp.Message{ + Type: ipv4.ICMPTypeEcho, Code: 0, + Body: &icmp.Echo{ + ID: os.Getpid() & 0xffff, + Data: []byte("HELLO-R-U-THERE"), + }, + }, + }, + + { + "ip6:ipv6-icmp", "::", iana.ProtocolIPv6ICMP, + icmp.Message{ + Type: ipv6.ICMPTypeEchoRequest, Code: 0, + Body: &icmp.Echo{ + ID: os.Getpid() & 0xffff, + Data: []byte("HELLO-R-U-THERE"), + }, + }, + }, + } { + if err := doDiag(dt, i); err != nil { + t.Error(err) + } + } + }) + t.Run("Probe/Privileged", func(t *testing.T) { + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + for i, dt := range []diagTest{ + { + "ip4:icmp", "0.0.0.0", iana.ProtocolICMP, + icmp.Message{ + Type: ipv4.ICMPTypeExtendedEchoRequest, Code: 0, + Body: &icmp.ExtendedEchoRequest{ + ID: os.Getpid() & 0xffff, + Local: true, + Extensions: []icmp.Extension{ + &icmp.InterfaceIdent{ + Class: 3, Type: 1, + Name: "doesnotexist", + }, + }, + }, + }, + }, + + { + "ip6:ipv6-icmp", "::", iana.ProtocolIPv6ICMP, + icmp.Message{ + Type: ipv6.ICMPTypeExtendedEchoRequest, Code: 0, + Body: &icmp.ExtendedEchoRequest{ + ID: os.Getpid() & 0xffff, + Local: true, + Extensions: []icmp.Extension{ + &icmp.InterfaceIdent{ + Class: 3, Type: 1, + Name: "doesnotexist", + }, + }, + }, + }, + }, + } { + if err := doDiag(dt, i); err != nil { + t.Error(err) + } + } + }) +} + +func doDiag(dt diagTest, seq int) error { + c, err := icmp.ListenPacket(dt.network, dt.address) + if err != nil { + return err + } + defer c.Close() + + dst, err := googleAddr(c, dt.protocol) + if err != nil { + return err + } + + if dt.network != "udp6" && dt.protocol == iana.ProtocolIPv6ICMP { + var f ipv6.ICMPFilter + f.SetAll(true) + f.Accept(ipv6.ICMPTypeDestinationUnreachable) + f.Accept(ipv6.ICMPTypePacketTooBig) + f.Accept(ipv6.ICMPTypeTimeExceeded) + f.Accept(ipv6.ICMPTypeParameterProblem) + f.Accept(ipv6.ICMPTypeEchoReply) + f.Accept(ipv6.ICMPTypeExtendedEchoReply) + if err := c.IPv6PacketConn().SetICMPFilter(&f); err != nil { + return err + } + } + + switch m := dt.m.Body.(type) { + case *icmp.Echo: + m.Seq = 1 << uint(seq) + case *icmp.ExtendedEchoRequest: + m.Seq = 1 << uint(seq) + } + wb, err := dt.m.Marshal(nil) + if err != nil { + return err + } + if n, err := c.WriteTo(wb, dst); err != nil { + return err + } else if n != len(wb) { + return fmt.Errorf("got %v; want %v", n, len(wb)) + } + + rb := make([]byte, 1500) + if err := c.SetReadDeadline(time.Now().Add(3 * time.Second)); err != nil { + return err + } + n, peer, err := c.ReadFrom(rb) + if err != nil { + return err + } + rm, err := icmp.ParseMessage(dt.protocol, rb[:n]) + if err != nil { + return err + } + switch { + case dt.m.Type == ipv4.ICMPTypeEcho && rm.Type == ipv4.ICMPTypeEchoReply: + fallthrough + case dt.m.Type == ipv6.ICMPTypeEchoRequest && rm.Type == ipv6.ICMPTypeEchoReply: + fallthrough + case dt.m.Type == ipv4.ICMPTypeExtendedEchoRequest && rm.Type == ipv4.ICMPTypeExtendedEchoReply: + fallthrough + case dt.m.Type == ipv6.ICMPTypeExtendedEchoRequest && rm.Type == ipv6.ICMPTypeExtendedEchoReply: + return nil + default: + return fmt.Errorf("got %+v from %v; want echo reply or extended echo reply", rm, peer) + } +} + +func googleAddr(c *icmp.PacketConn, protocol int) (net.Addr, error) { + host := "ipv4.google.com" + if protocol == iana.ProtocolIPv6ICMP { + host = "ipv6.google.com" + } + ips, err := net.LookupIP(host) + if err != nil { + return nil, err + } + netaddr := func(ip net.IP) (net.Addr, error) { + switch c.LocalAddr().(type) { + case *net.UDPAddr: + return &net.UDPAddr{IP: ip}, nil + case *net.IPAddr: + return &net.IPAddr{IP: ip}, nil + default: + return nil, errors.New("neither UDPAddr nor IPAddr") + } + } + if len(ips) > 0 { + return netaddr(ips[0]) + } + return nil, errors.New("no A or AAAA record") +} + +func TestConcurrentNonPrivilegedListenPacket(t *testing.T) { + if testing.Short() { + t.Skip("avoid external network") + } + switch runtime.GOOS { + case "darwin": + case "linux": + t.Log("you may need to adjust the net.ipv4.ping_group_range kernel state") + default: + t.Skipf("not supported on %s", runtime.GOOS) + } + + network, address := "udp4", "127.0.0.1" + if !nettest.SupportsIPv4() { + network, address = "udp6", "::1" + } + const N = 1000 + var wg sync.WaitGroup + wg.Add(N) + for i := 0; i < N; i++ { + go func() { + defer wg.Done() + c, err := icmp.ListenPacket(network, address) + if err != nil { + t.Error(err) + return + } + c.Close() + }() + } + wg.Wait() +} diff --git a/api/vendor/golang.org/x/net/icmp/dstunreach.go b/api/vendor/golang.org/x/net/icmp/dstunreach.go new file mode 100644 index 0000000..7464bf7 --- /dev/null +++ b/api/vendor/golang.org/x/net/icmp/dstunreach.go @@ -0,0 +1,41 @@ +// 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 icmp + +// A DstUnreach represents an ICMP destination unreachable message +// body. +type DstUnreach struct { + Data []byte // data, known as original datagram field + Extensions []Extension // extensions +} + +// Len implements the Len method of MessageBody interface. +func (p *DstUnreach) Len(proto int) int { + if p == nil { + return 0 + } + l, _ := multipartMessageBodyDataLen(proto, true, p.Data, p.Extensions) + return 4 + l +} + +// Marshal implements the Marshal method of MessageBody interface. +func (p *DstUnreach) Marshal(proto int) ([]byte, error) { + return marshalMultipartMessageBody(proto, true, p.Data, p.Extensions) +} + +// parseDstUnreach parses b as an ICMP destination unreachable message +// body. +func parseDstUnreach(proto int, typ Type, b []byte) (MessageBody, error) { + if len(b) < 4 { + return nil, errMessageTooShort + } + p := &DstUnreach{} + var err error + p.Data, p.Extensions, err = parseMultipartMessageBody(proto, typ, b) + if err != nil { + return nil, err + } + return p, nil +} diff --git a/api/vendor/golang.org/x/net/icmp/echo.go b/api/vendor/golang.org/x/net/icmp/echo.go new file mode 100644 index 0000000..c611f65 --- /dev/null +++ b/api/vendor/golang.org/x/net/icmp/echo.go @@ -0,0 +1,157 @@ +// 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 icmp + +import "encoding/binary" + +// An Echo represents an ICMP echo request or reply message body. +type Echo struct { + ID int // identifier + Seq int // sequence number + Data []byte // data +} + +// Len implements the Len method of MessageBody interface. +func (p *Echo) Len(proto int) int { + if p == nil { + return 0 + } + return 4 + len(p.Data) +} + +// Marshal implements the Marshal method of MessageBody interface. +func (p *Echo) Marshal(proto int) ([]byte, error) { + b := make([]byte, 4+len(p.Data)) + binary.BigEndian.PutUint16(b[:2], uint16(p.ID)) + binary.BigEndian.PutUint16(b[2:4], uint16(p.Seq)) + copy(b[4:], p.Data) + return b, nil +} + +// parseEcho parses b as an ICMP echo request or reply message body. +func parseEcho(proto int, _ Type, b []byte) (MessageBody, error) { + bodyLen := len(b) + if bodyLen < 4 { + return nil, errMessageTooShort + } + p := &Echo{ID: int(binary.BigEndian.Uint16(b[:2])), Seq: int(binary.BigEndian.Uint16(b[2:4]))} + if bodyLen > 4 { + p.Data = make([]byte, bodyLen-4) + copy(p.Data, b[4:]) + } + return p, nil +} + +// An ExtendedEchoRequest represents an ICMP extended echo request +// message body. +type ExtendedEchoRequest struct { + ID int // identifier + Seq int // sequence number + Local bool // must be true when identifying by name or index + Extensions []Extension // extensions +} + +// Len implements the Len method of MessageBody interface. +func (p *ExtendedEchoRequest) Len(proto int) int { + if p == nil { + return 0 + } + l, _ := multipartMessageBodyDataLen(proto, false, nil, p.Extensions) + return 4 + l +} + +// Marshal implements the Marshal method of MessageBody interface. +func (p *ExtendedEchoRequest) Marshal(proto int) ([]byte, error) { + b, err := marshalMultipartMessageBody(proto, false, nil, p.Extensions) + if err != nil { + return nil, err + } + bb := make([]byte, 4) + binary.BigEndian.PutUint16(bb[:2], uint16(p.ID)) + bb[2] = byte(p.Seq) + if p.Local { + bb[3] |= 0x01 + } + bb = append(bb, b...) + return bb, nil +} + +// parseExtendedEchoRequest parses b as an ICMP extended echo request +// message body. +func parseExtendedEchoRequest(proto int, typ Type, b []byte) (MessageBody, error) { + if len(b) < 4+4 { + return nil, errMessageTooShort + } + p := &ExtendedEchoRequest{ID: int(binary.BigEndian.Uint16(b[:2])), Seq: int(b[2])} + if b[3]&0x01 != 0 { + p.Local = true + } + var err error + _, p.Extensions, err = parseMultipartMessageBody(proto, typ, b[4:]) + if err != nil { + return nil, err + } + return p, nil +} + +// An ExtendedEchoReply represents an ICMP extended echo reply message +// body. +type ExtendedEchoReply struct { + ID int // identifier + Seq int // sequence number + State int // 3-bit state working together with Message.Code + Active bool // probed interface is active + IPv4 bool // probed interface runs IPv4 + IPv6 bool // probed interface runs IPv6 +} + +// Len implements the Len method of MessageBody interface. +func (p *ExtendedEchoReply) Len(proto int) int { + if p == nil { + return 0 + } + return 4 +} + +// Marshal implements the Marshal method of MessageBody interface. +func (p *ExtendedEchoReply) Marshal(proto int) ([]byte, error) { + b := make([]byte, 4) + binary.BigEndian.PutUint16(b[:2], uint16(p.ID)) + b[2] = byte(p.Seq) + b[3] = byte(p.State<<5) & 0xe0 + if p.Active { + b[3] |= 0x04 + } + if p.IPv4 { + b[3] |= 0x02 + } + if p.IPv6 { + b[3] |= 0x01 + } + return b, nil +} + +// parseExtendedEchoReply parses b as an ICMP extended echo reply +// message body. +func parseExtendedEchoReply(proto int, _ Type, b []byte) (MessageBody, error) { + if len(b) < 4 { + return nil, errMessageTooShort + } + p := &ExtendedEchoReply{ + ID: int(binary.BigEndian.Uint16(b[:2])), + Seq: int(b[2]), + State: int(b[3]) >> 5, + } + if b[3]&0x04 != 0 { + p.Active = true + } + if b[3]&0x02 != 0 { + p.IPv4 = true + } + if b[3]&0x01 != 0 { + p.IPv6 = true + } + return p, nil +} diff --git a/api/vendor/golang.org/x/net/icmp/endpoint.go b/api/vendor/golang.org/x/net/icmp/endpoint.go new file mode 100644 index 0000000..a68bfb0 --- /dev/null +++ b/api/vendor/golang.org/x/net/icmp/endpoint.go @@ -0,0 +1,113 @@ +// 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 icmp + +import ( + "net" + "runtime" + "syscall" + "time" + + "golang.org/x/net/ipv4" + "golang.org/x/net/ipv6" +) + +var _ net.PacketConn = &PacketConn{} + +// A PacketConn represents a packet network endpoint that uses either +// ICMPv4 or ICMPv6. +type PacketConn struct { + c net.PacketConn + p4 *ipv4.PacketConn + p6 *ipv6.PacketConn +} + +func (c *PacketConn) ok() bool { return c != nil && c.c != nil } + +// IPv4PacketConn returns the ipv4.PacketConn of c. +// It returns nil when c is not created as the endpoint for ICMPv4. +func (c *PacketConn) IPv4PacketConn() *ipv4.PacketConn { + if !c.ok() { + return nil + } + return c.p4 +} + +// IPv6PacketConn returns the ipv6.PacketConn of c. +// It returns nil when c is not created as the endpoint for ICMPv6. +func (c *PacketConn) IPv6PacketConn() *ipv6.PacketConn { + if !c.ok() { + return nil + } + return c.p6 +} + +// ReadFrom reads an ICMP message from the connection. +func (c *PacketConn) ReadFrom(b []byte) (int, net.Addr, error) { + if !c.ok() { + return 0, nil, syscall.EINVAL + } + // Please be informed that ipv4.NewPacketConn enables + // IP_STRIPHDR option by default on Darwin. + // See golang.org/issue/9395 for further information. + if runtime.GOOS == "darwin" && c.p4 != nil { + n, _, peer, err := c.p4.ReadFrom(b) + return n, peer, err + } + return c.c.ReadFrom(b) +} + +// WriteTo writes the ICMP message b to dst. +// Dst must be net.UDPAddr when c is a non-privileged +// datagram-oriented ICMP endpoint. Otherwise it must be net.IPAddr. +func (c *PacketConn) WriteTo(b []byte, dst net.Addr) (int, error) { + if !c.ok() { + return 0, syscall.EINVAL + } + return c.c.WriteTo(b, dst) +} + +// Close closes the endpoint. +func (c *PacketConn) Close() error { + if !c.ok() { + return syscall.EINVAL + } + return c.c.Close() +} + +// LocalAddr returns the local network address. +func (c *PacketConn) LocalAddr() net.Addr { + if !c.ok() { + return nil + } + return c.c.LocalAddr() +} + +// SetDeadline sets the read and write deadlines associated with the +// endpoint. +func (c *PacketConn) SetDeadline(t time.Time) error { + if !c.ok() { + return syscall.EINVAL + } + return c.c.SetDeadline(t) +} + +// SetReadDeadline sets the read deadline associated with the +// endpoint. +func (c *PacketConn) SetReadDeadline(t time.Time) error { + if !c.ok() { + return syscall.EINVAL + } + return c.c.SetReadDeadline(t) +} + +// SetWriteDeadline sets the write deadline associated with the +// endpoint. +func (c *PacketConn) SetWriteDeadline(t time.Time) error { + if !c.ok() { + return syscall.EINVAL + } + return c.c.SetWriteDeadline(t) +} diff --git a/api/vendor/golang.org/x/net/icmp/example_test.go b/api/vendor/golang.org/x/net/icmp/example_test.go new file mode 100644 index 0000000..1df4cec --- /dev/null +++ b/api/vendor/golang.org/x/net/icmp/example_test.go @@ -0,0 +1,63 @@ +// 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 icmp_test + +import ( + "log" + "net" + "os" + "runtime" + + "golang.org/x/net/icmp" + "golang.org/x/net/ipv6" +) + +func ExamplePacketConn_nonPrivilegedPing() { + switch runtime.GOOS { + case "darwin": + case "linux": + log.Println("you may need to adjust the net.ipv4.ping_group_range kernel state") + default: + log.Println("not supported on", runtime.GOOS) + return + } + + c, err := icmp.ListenPacket("udp6", "fe80::1%en0") + if err != nil { + log.Fatal(err) + } + defer c.Close() + + wm := icmp.Message{ + Type: ipv6.ICMPTypeEchoRequest, Code: 0, + Body: &icmp.Echo{ + ID: os.Getpid() & 0xffff, Seq: 1, + Data: []byte("HELLO-R-U-THERE"), + }, + } + wb, err := wm.Marshal(nil) + if err != nil { + log.Fatal(err) + } + if _, err := c.WriteTo(wb, &net.UDPAddr{IP: net.ParseIP("ff02::1"), Zone: "en0"}); err != nil { + log.Fatal(err) + } + + rb := make([]byte, 1500) + n, peer, err := c.ReadFrom(rb) + if err != nil { + log.Fatal(err) + } + rm, err := icmp.ParseMessage(58, rb[:n]) + if err != nil { + log.Fatal(err) + } + switch rm.Type { + case ipv6.ICMPTypeEchoReply: + log.Printf("got reflection from %v", peer) + default: + log.Printf("got %+v; want echo reply", rm) + } +} diff --git a/api/vendor/golang.org/x/net/icmp/extension.go b/api/vendor/golang.org/x/net/icmp/extension.go new file mode 100644 index 0000000..2005068 --- /dev/null +++ b/api/vendor/golang.org/x/net/icmp/extension.go @@ -0,0 +1,108 @@ +// Copyright 2015 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 icmp + +import ( + "encoding/binary" + + "golang.org/x/net/ipv4" + "golang.org/x/net/ipv6" +) + +// An Extension represents an ICMP extension. +type Extension interface { + // Len returns the length of ICMP extension. + // Proto must be either the ICMPv4 or ICMPv6 protocol number. + Len(proto int) int + + // Marshal returns the binary encoding of ICMP extension. + // Proto must be either the ICMPv4 or ICMPv6 protocol number. + Marshal(proto int) ([]byte, error) +} + +const extensionVersion = 2 + +func validExtensionHeader(b []byte) bool { + v := int(b[0]&0xf0) >> 4 + s := binary.BigEndian.Uint16(b[2:4]) + if s != 0 { + s = checksum(b) + } + if v != extensionVersion || s != 0 { + return false + } + return true +} + +// parseExtensions parses b as a list of ICMP extensions. +// The length attribute l must be the length attribute field in +// received icmp messages. +// +// It will return a list of ICMP extensions and an adjusted length +// attribute that represents the length of the padded original +// datagram field. Otherwise, it returns an error. +func parseExtensions(typ Type, b []byte, l int) ([]Extension, int, error) { + // Still a lot of non-RFC 4884 compliant implementations are + // out there. Set the length attribute l to 128 when it looks + // inappropriate for backwards compatibility. + // + // A minimal extension at least requires 8 octets; 4 octets + // for an extension header, and 4 octets for a single object + // header. + // + // See RFC 4884 for further information. + switch typ { + case ipv4.ICMPTypeExtendedEchoRequest, ipv6.ICMPTypeExtendedEchoRequest: + if len(b) < 8 || !validExtensionHeader(b) { + return nil, -1, errNoExtension + } + l = 0 + default: + if 128 > l || l+8 > len(b) { + l = 128 + } + if l+8 > len(b) { + return nil, -1, errNoExtension + } + if !validExtensionHeader(b[l:]) { + if l == 128 { + return nil, -1, errNoExtension + } + l = 128 + if !validExtensionHeader(b[l:]) { + return nil, -1, errNoExtension + } + } + } + var exts []Extension + for b = b[l+4:]; len(b) >= 4; { + ol := int(binary.BigEndian.Uint16(b[:2])) + if 4 > ol || ol > len(b) { + break + } + switch b[2] { + case classMPLSLabelStack: + ext, err := parseMPLSLabelStack(b[:ol]) + if err != nil { + return nil, -1, err + } + exts = append(exts, ext) + case classInterfaceInfo: + ext, err := parseInterfaceInfo(b[:ol]) + if err != nil { + return nil, -1, err + } + exts = append(exts, ext) + case classInterfaceIdent: + ext, err := parseInterfaceIdent(b[:ol]) + if err != nil { + return nil, -1, err + } + exts = append(exts, ext) + } + b = b[ol:] + } + return exts, l, nil +} diff --git a/api/vendor/golang.org/x/net/icmp/extension_test.go b/api/vendor/golang.org/x/net/icmp/extension_test.go new file mode 100644 index 0000000..a7669da --- /dev/null +++ b/api/vendor/golang.org/x/net/icmp/extension_test.go @@ -0,0 +1,333 @@ +// Copyright 2015 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 icmp + +import ( + "fmt" + "net" + "reflect" + "testing" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/ipv4" + "golang.org/x/net/ipv6" +) + +func TestMarshalAndParseExtension(t *testing.T) { + fn := func(t *testing.T, proto int, typ Type, hdr, obj []byte, te Extension) error { + b, err := te.Marshal(proto) + if err != nil { + return err + } + if !reflect.DeepEqual(b, obj) { + return fmt.Errorf("got %#v; want %#v", b, obj) + } + switch typ { + case ipv4.ICMPTypeExtendedEchoRequest, ipv6.ICMPTypeExtendedEchoRequest: + exts, l, err := parseExtensions(typ, append(hdr, obj...), 0) + if err != nil { + return err + } + if l != 0 { + return fmt.Errorf("got %d; want 0", l) + } + if !reflect.DeepEqual(exts, []Extension{te}) { + return fmt.Errorf("got %#v; want %#v", exts[0], te) + } + default: + for i, wire := range []struct { + data []byte // original datagram + inlattr int // length of padded original datagram, a hint + outlattr int // length of padded original datagram, a want + err error + }{ + {nil, 0, -1, errNoExtension}, + {make([]byte, 127), 128, -1, errNoExtension}, + + {make([]byte, 128), 127, -1, errNoExtension}, + {make([]byte, 128), 128, -1, errNoExtension}, + {make([]byte, 128), 129, -1, errNoExtension}, + + {append(make([]byte, 128), append(hdr, obj...)...), 127, 128, nil}, + {append(make([]byte, 128), append(hdr, obj...)...), 128, 128, nil}, + {append(make([]byte, 128), append(hdr, obj...)...), 129, 128, nil}, + + {append(make([]byte, 512), append(hdr, obj...)...), 511, -1, errNoExtension}, + {append(make([]byte, 512), append(hdr, obj...)...), 512, 512, nil}, + {append(make([]byte, 512), append(hdr, obj...)...), 513, -1, errNoExtension}, + } { + exts, l, err := parseExtensions(typ, wire.data, wire.inlattr) + if err != wire.err { + return fmt.Errorf("#%d: got %v; want %v", i, err, wire.err) + } + if wire.err != nil { + continue + } + if l != wire.outlattr { + return fmt.Errorf("#%d: got %d; want %d", i, l, wire.outlattr) + } + if !reflect.DeepEqual(exts, []Extension{te}) { + return fmt.Errorf("#%d: got %#v; want %#v", i, exts[0], te) + } + } + } + return nil + } + + t.Run("MPLSLabelStack", func(t *testing.T) { + for _, et := range []struct { + proto int + typ Type + hdr []byte + obj []byte + ext Extension + }{ + // MPLS label stack with no label + { + proto: iana.ProtocolICMP, + typ: ipv4.ICMPTypeDestinationUnreachable, + hdr: []byte{ + 0x20, 0x00, 0x00, 0x00, + }, + obj: []byte{ + 0x00, 0x04, 0x01, 0x01, + }, + ext: &MPLSLabelStack{ + Class: classMPLSLabelStack, + Type: typeIncomingMPLSLabelStack, + }, + }, + // MPLS label stack with a single label + { + proto: iana.ProtocolIPv6ICMP, + typ: ipv6.ICMPTypeDestinationUnreachable, + hdr: []byte{ + 0x20, 0x00, 0x00, 0x00, + }, + obj: []byte{ + 0x00, 0x08, 0x01, 0x01, + 0x03, 0xe8, 0xe9, 0xff, + }, + ext: &MPLSLabelStack{ + Class: classMPLSLabelStack, + Type: typeIncomingMPLSLabelStack, + Labels: []MPLSLabel{ + { + Label: 16014, + TC: 0x4, + S: true, + TTL: 255, + }, + }, + }, + }, + // MPLS label stack with multiple labels + { + proto: iana.ProtocolICMP, + typ: ipv4.ICMPTypeDestinationUnreachable, + hdr: []byte{ + 0x20, 0x00, 0x00, 0x00, + }, + obj: []byte{ + 0x00, 0x0c, 0x01, 0x01, + 0x03, 0xe8, 0xde, 0xfe, + 0x03, 0xe8, 0xe1, 0xff, + }, + ext: &MPLSLabelStack{ + Class: classMPLSLabelStack, + Type: typeIncomingMPLSLabelStack, + Labels: []MPLSLabel{ + { + Label: 16013, + TC: 0x7, + S: false, + TTL: 254, + }, + { + Label: 16014, + TC: 0, + S: true, + TTL: 255, + }, + }, + }, + }, + } { + if err := fn(t, et.proto, et.typ, et.hdr, et.obj, et.ext); err != nil { + t.Error(err) + } + } + }) + t.Run("InterfaceInfo", func(t *testing.T) { + for _, et := range []struct { + proto int + typ Type + hdr []byte + obj []byte + ext Extension + }{ + // Interface information with no attribute + { + proto: iana.ProtocolICMP, + typ: ipv4.ICMPTypeDestinationUnreachable, + hdr: []byte{ + 0x20, 0x00, 0x00, 0x00, + }, + obj: []byte{ + 0x00, 0x04, 0x02, 0x00, + }, + ext: &InterfaceInfo{ + Class: classInterfaceInfo, + }, + }, + // Interface information with ifIndex and name + { + proto: iana.ProtocolICMP, + typ: ipv4.ICMPTypeDestinationUnreachable, + hdr: []byte{ + 0x20, 0x00, 0x00, 0x00, + }, + obj: []byte{ + 0x00, 0x10, 0x02, 0x0a, + 0x00, 0x00, 0x00, 0x10, + 0x08, byte('e'), byte('n'), byte('1'), + byte('0'), byte('1'), 0x00, 0x00, + }, + ext: &InterfaceInfo{ + Class: classInterfaceInfo, + Type: 0x0a, + Interface: &net.Interface{ + Index: 16, + Name: "en101", + }, + }, + }, + // Interface information with ifIndex, IPAddr, name and MTU + { + proto: iana.ProtocolIPv6ICMP, + typ: ipv6.ICMPTypeDestinationUnreachable, + hdr: []byte{ + 0x20, 0x00, 0x00, 0x00, + }, + obj: []byte{ + 0x00, 0x28, 0x02, 0x0f, + 0x00, 0x00, 0x00, 0x0f, + 0x00, 0x02, 0x00, 0x00, + 0xfe, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, + 0x08, byte('e'), byte('n'), byte('1'), + byte('0'), byte('1'), 0x00, 0x00, + 0x00, 0x00, 0x20, 0x00, + }, + ext: &InterfaceInfo{ + Class: classInterfaceInfo, + Type: 0x0f, + Interface: &net.Interface{ + Index: 15, + Name: "en101", + MTU: 8192, + }, + Addr: &net.IPAddr{ + IP: net.ParseIP("fe80::1"), + Zone: "en101", + }, + }, + }, + } { + if err := fn(t, et.proto, et.typ, et.hdr, et.obj, et.ext); err != nil { + t.Error(err) + } + } + }) + t.Run("InterfaceIdent", func(t *testing.T) { + for _, et := range []struct { + proto int + typ Type + hdr []byte + obj []byte + ext Extension + }{ + // Interface identification by name + { + proto: iana.ProtocolICMP, + typ: ipv4.ICMPTypeExtendedEchoRequest, + hdr: []byte{ + 0x20, 0x00, 0x00, 0x00, + }, + obj: []byte{ + 0x00, 0x0c, 0x03, 0x01, + byte('e'), byte('n'), byte('1'), byte('0'), + byte('1'), 0x00, 0x00, 0x00, + }, + ext: &InterfaceIdent{ + Class: classInterfaceIdent, + Type: typeInterfaceByName, + Name: "en101", + }, + }, + // Interface identification by index + { + proto: iana.ProtocolIPv6ICMP, + typ: ipv6.ICMPTypeExtendedEchoRequest, + hdr: []byte{ + 0x20, 0x00, 0x00, 0x00, + }, + obj: []byte{ + 0x00, 0x0c, 0x03, 0x02, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x03, 0x8f, + }, + ext: &InterfaceIdent{ + Class: classInterfaceIdent, + Type: typeInterfaceByIndex, + Index: 911, + }, + }, + // Interface identification by address + { + proto: iana.ProtocolICMP, + typ: ipv4.ICMPTypeExtendedEchoRequest, + hdr: []byte{ + 0x20, 0x00, 0x00, 0x00, + }, + obj: []byte{ + 0x00, 0x10, 0x03, 0x03, + byte(iana.AddrFamily48bitMAC >> 8), byte(iana.AddrFamily48bitMAC & 0x0f), 0x06, 0x00, + 0x01, 0x23, 0x45, 0x67, + 0x89, 0xab, 0x00, 0x00, + }, + ext: &InterfaceIdent{ + Class: classInterfaceIdent, + Type: typeInterfaceByAddress, + AFI: iana.AddrFamily48bitMAC, + Addr: []byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab}, + }, + }, + } { + if err := fn(t, et.proto, et.typ, et.hdr, et.obj, et.ext); err != nil { + t.Error(err) + } + } + }) +} + +func TestParseInterfaceName(t *testing.T) { + ifi := InterfaceInfo{Interface: &net.Interface{}} + for i, tt := range []struct { + b []byte + error + }{ + {[]byte{0, 'e', 'n', '0'}, errInvalidExtension}, + {[]byte{4, 'e', 'n', '0'}, nil}, + {[]byte{7, 'e', 'n', '0', 0xff, 0xff, 0xff, 0xff}, errInvalidExtension}, + {[]byte{8, 'e', 'n', '0', 0xff, 0xff, 0xff}, errMessageTooShort}, + } { + if _, err := ifi.parseName(tt.b); err != tt.error { + t.Errorf("#%d: got %v; want %v", i, err, tt.error) + } + } +} diff --git a/api/vendor/golang.org/x/net/icmp/helper_posix.go b/api/vendor/golang.org/x/net/icmp/helper_posix.go new file mode 100644 index 0000000..398fd38 --- /dev/null +++ b/api/vendor/golang.org/x/net/icmp/helper_posix.go @@ -0,0 +1,75 @@ +// 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows + +package icmp + +import ( + "net" + "strconv" + "syscall" +) + +func sockaddr(family int, address string) (syscall.Sockaddr, error) { + switch family { + case syscall.AF_INET: + a, err := net.ResolveIPAddr("ip4", address) + if err != nil { + return nil, err + } + if len(a.IP) == 0 { + a.IP = net.IPv4zero + } + if a.IP = a.IP.To4(); a.IP == nil { + return nil, net.InvalidAddrError("non-ipv4 address") + } + sa := &syscall.SockaddrInet4{} + copy(sa.Addr[:], a.IP) + return sa, nil + case syscall.AF_INET6: + a, err := net.ResolveIPAddr("ip6", address) + if err != nil { + return nil, err + } + if len(a.IP) == 0 { + a.IP = net.IPv6unspecified + } + if a.IP.Equal(net.IPv4zero) { + a.IP = net.IPv6unspecified + } + if a.IP = a.IP.To16(); a.IP == nil || a.IP.To4() != nil { + return nil, net.InvalidAddrError("non-ipv6 address") + } + sa := &syscall.SockaddrInet6{ZoneId: zoneToUint32(a.Zone)} + copy(sa.Addr[:], a.IP) + return sa, nil + default: + return nil, net.InvalidAddrError("unexpected family") + } +} + +func zoneToUint32(zone string) uint32 { + if zone == "" { + return 0 + } + if ifi, err := net.InterfaceByName(zone); err == nil { + return uint32(ifi.Index) + } + n, err := strconv.Atoi(zone) + if err != nil { + return 0 + } + return uint32(n) +} + +func last(s string, b byte) int { + i := len(s) + for i--; i >= 0; i-- { + if s[i] == b { + break + } + } + return i +} diff --git a/api/vendor/golang.org/x/net/icmp/interface.go b/api/vendor/golang.org/x/net/icmp/interface.go new file mode 100644 index 0000000..617f757 --- /dev/null +++ b/api/vendor/golang.org/x/net/icmp/interface.go @@ -0,0 +1,322 @@ +// Copyright 2015 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 icmp + +import ( + "encoding/binary" + "net" + "strings" + + "golang.org/x/net/internal/iana" +) + +const ( + classInterfaceInfo = 2 +) + +const ( + attrMTU = 1 << iota + attrName + attrIPAddr + attrIfIndex +) + +// An InterfaceInfo represents interface and next-hop identification. +type InterfaceInfo struct { + Class int // extension object class number + Type int // extension object sub-type + Interface *net.Interface + Addr *net.IPAddr +} + +func (ifi *InterfaceInfo) nameLen() int { + if len(ifi.Interface.Name) > 63 { + return 64 + } + l := 1 + len(ifi.Interface.Name) + return (l + 3) &^ 3 +} + +func (ifi *InterfaceInfo) attrsAndLen(proto int) (attrs, l int) { + l = 4 + if ifi.Interface != nil && ifi.Interface.Index > 0 { + attrs |= attrIfIndex + l += 4 + if len(ifi.Interface.Name) > 0 { + attrs |= attrName + l += ifi.nameLen() + } + if ifi.Interface.MTU > 0 { + attrs |= attrMTU + l += 4 + } + } + if ifi.Addr != nil { + switch proto { + case iana.ProtocolICMP: + if ifi.Addr.IP.To4() != nil { + attrs |= attrIPAddr + l += 4 + net.IPv4len + } + case iana.ProtocolIPv6ICMP: + if ifi.Addr.IP.To16() != nil && ifi.Addr.IP.To4() == nil { + attrs |= attrIPAddr + l += 4 + net.IPv6len + } + } + } + return +} + +// Len implements the Len method of Extension interface. +func (ifi *InterfaceInfo) Len(proto int) int { + _, l := ifi.attrsAndLen(proto) + return l +} + +// Marshal implements the Marshal method of Extension interface. +func (ifi *InterfaceInfo) Marshal(proto int) ([]byte, error) { + attrs, l := ifi.attrsAndLen(proto) + b := make([]byte, l) + if err := ifi.marshal(proto, b, attrs, l); err != nil { + return nil, err + } + return b, nil +} + +func (ifi *InterfaceInfo) marshal(proto int, b []byte, attrs, l int) error { + binary.BigEndian.PutUint16(b[:2], uint16(l)) + b[2], b[3] = classInterfaceInfo, byte(ifi.Type) + for b = b[4:]; len(b) > 0 && attrs != 0; { + switch { + case attrs&attrIfIndex != 0: + b = ifi.marshalIfIndex(proto, b) + attrs &^= attrIfIndex + case attrs&attrIPAddr != 0: + b = ifi.marshalIPAddr(proto, b) + attrs &^= attrIPAddr + case attrs&attrName != 0: + b = ifi.marshalName(proto, b) + attrs &^= attrName + case attrs&attrMTU != 0: + b = ifi.marshalMTU(proto, b) + attrs &^= attrMTU + } + } + return nil +} + +func (ifi *InterfaceInfo) marshalIfIndex(proto int, b []byte) []byte { + binary.BigEndian.PutUint32(b[:4], uint32(ifi.Interface.Index)) + return b[4:] +} + +func (ifi *InterfaceInfo) parseIfIndex(b []byte) ([]byte, error) { + if len(b) < 4 { + return nil, errMessageTooShort + } + ifi.Interface.Index = int(binary.BigEndian.Uint32(b[:4])) + return b[4:], nil +} + +func (ifi *InterfaceInfo) marshalIPAddr(proto int, b []byte) []byte { + switch proto { + case iana.ProtocolICMP: + binary.BigEndian.PutUint16(b[:2], uint16(iana.AddrFamilyIPv4)) + copy(b[4:4+net.IPv4len], ifi.Addr.IP.To4()) + b = b[4+net.IPv4len:] + case iana.ProtocolIPv6ICMP: + binary.BigEndian.PutUint16(b[:2], uint16(iana.AddrFamilyIPv6)) + copy(b[4:4+net.IPv6len], ifi.Addr.IP.To16()) + b = b[4+net.IPv6len:] + } + return b +} + +func (ifi *InterfaceInfo) parseIPAddr(b []byte) ([]byte, error) { + if len(b) < 4 { + return nil, errMessageTooShort + } + afi := int(binary.BigEndian.Uint16(b[:2])) + b = b[4:] + switch afi { + case iana.AddrFamilyIPv4: + if len(b) < net.IPv4len { + return nil, errMessageTooShort + } + ifi.Addr.IP = make(net.IP, net.IPv4len) + copy(ifi.Addr.IP, b[:net.IPv4len]) + b = b[net.IPv4len:] + case iana.AddrFamilyIPv6: + if len(b) < net.IPv6len { + return nil, errMessageTooShort + } + ifi.Addr.IP = make(net.IP, net.IPv6len) + copy(ifi.Addr.IP, b[:net.IPv6len]) + b = b[net.IPv6len:] + } + return b, nil +} + +func (ifi *InterfaceInfo) marshalName(proto int, b []byte) []byte { + l := byte(ifi.nameLen()) + b[0] = l + copy(b[1:], []byte(ifi.Interface.Name)) + return b[l:] +} + +func (ifi *InterfaceInfo) parseName(b []byte) ([]byte, error) { + if 4 > len(b) || len(b) < int(b[0]) { + return nil, errMessageTooShort + } + l := int(b[0]) + if l%4 != 0 || 4 > l || l > 64 { + return nil, errInvalidExtension + } + var name [63]byte + copy(name[:], b[1:l]) + ifi.Interface.Name = strings.Trim(string(name[:]), "\000") + return b[l:], nil +} + +func (ifi *InterfaceInfo) marshalMTU(proto int, b []byte) []byte { + binary.BigEndian.PutUint32(b[:4], uint32(ifi.Interface.MTU)) + return b[4:] +} + +func (ifi *InterfaceInfo) parseMTU(b []byte) ([]byte, error) { + if len(b) < 4 { + return nil, errMessageTooShort + } + ifi.Interface.MTU = int(binary.BigEndian.Uint32(b[:4])) + return b[4:], nil +} + +func parseInterfaceInfo(b []byte) (Extension, error) { + ifi := &InterfaceInfo{ + Class: int(b[2]), + Type: int(b[3]), + } + if ifi.Type&(attrIfIndex|attrName|attrMTU) != 0 { + ifi.Interface = &net.Interface{} + } + if ifi.Type&attrIPAddr != 0 { + ifi.Addr = &net.IPAddr{} + } + attrs := ifi.Type & (attrIfIndex | attrIPAddr | attrName | attrMTU) + for b = b[4:]; len(b) > 0 && attrs != 0; { + var err error + switch { + case attrs&attrIfIndex != 0: + b, err = ifi.parseIfIndex(b) + attrs &^= attrIfIndex + case attrs&attrIPAddr != 0: + b, err = ifi.parseIPAddr(b) + attrs &^= attrIPAddr + case attrs&attrName != 0: + b, err = ifi.parseName(b) + attrs &^= attrName + case attrs&attrMTU != 0: + b, err = ifi.parseMTU(b) + attrs &^= attrMTU + } + if err != nil { + return nil, err + } + } + if ifi.Interface != nil && ifi.Interface.Name != "" && ifi.Addr != nil && ifi.Addr.IP.To16() != nil && ifi.Addr.IP.To4() == nil { + ifi.Addr.Zone = ifi.Interface.Name + } + return ifi, nil +} + +const ( + classInterfaceIdent = 3 + typeInterfaceByName = 1 + typeInterfaceByIndex = 2 + typeInterfaceByAddress = 3 +) + +// An InterfaceIdent represents interface identification. +type InterfaceIdent struct { + Class int // extension object class number + Type int // extension object sub-type + Name string // interface name + Index int // interface index + AFI int // address family identifier; see address family numbers in IANA registry + Addr []byte // address +} + +// Len implements the Len method of Extension interface. +func (ifi *InterfaceIdent) Len(_ int) int { + switch ifi.Type { + case typeInterfaceByName: + l := len(ifi.Name) + if l > 255 { + l = 255 + } + return 4 + (l+3)&^3 + case typeInterfaceByIndex: + return 4 + 8 + case typeInterfaceByAddress: + return 4 + 4 + (len(ifi.Addr)+3)&^3 + default: + return 4 + } +} + +// Marshal implements the Marshal method of Extension interface. +func (ifi *InterfaceIdent) Marshal(proto int) ([]byte, error) { + b := make([]byte, ifi.Len(proto)) + if err := ifi.marshal(proto, b); err != nil { + return nil, err + } + return b, nil +} + +func (ifi *InterfaceIdent) marshal(proto int, b []byte) error { + l := ifi.Len(proto) + binary.BigEndian.PutUint16(b[:2], uint16(l)) + b[2], b[3] = classInterfaceIdent, byte(ifi.Type) + switch ifi.Type { + case typeInterfaceByName: + copy(b[4:], ifi.Name) + case typeInterfaceByIndex: + binary.BigEndian.PutUint64(b[4:4+8], uint64(ifi.Index)) + case typeInterfaceByAddress: + binary.BigEndian.PutUint16(b[4:4+2], uint16(ifi.AFI)) + b[4+2] = byte(len(ifi.Addr)) + copy(b[4+4:], ifi.Addr) + } + return nil +} + +func parseInterfaceIdent(b []byte) (Extension, error) { + ifi := &InterfaceIdent{ + Class: int(b[2]), + Type: int(b[3]), + } + switch ifi.Type { + case typeInterfaceByName: + ifi.Name = strings.Trim(string(b[4:]), string(0)) + case typeInterfaceByIndex: + if len(b[4:]) < 8 { + return nil, errInvalidExtension + } + ifi.Index = int(binary.BigEndian.Uint64(b[4 : 4+8])) + case typeInterfaceByAddress: + if len(b[4:]) < 4 { + return nil, errInvalidExtension + } + ifi.AFI = int(binary.BigEndian.Uint16(b[4 : 4+2])) + l := int(b[4+2]) + if len(b[4+4:]) < l { + return nil, errInvalidExtension + } + ifi.Addr = make([]byte, l) + copy(ifi.Addr, b[4+4:]) + } + return ifi, nil +} diff --git a/api/vendor/golang.org/x/net/icmp/ipv4.go b/api/vendor/golang.org/x/net/icmp/ipv4.go new file mode 100644 index 0000000..ffc66ed --- /dev/null +++ b/api/vendor/golang.org/x/net/icmp/ipv4.go @@ -0,0 +1,61 @@ +// 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 icmp + +import ( + "encoding/binary" + "net" + "runtime" + + "golang.org/x/net/internal/socket" + "golang.org/x/net/ipv4" +) + +// freebsdVersion is set in sys_freebsd.go. +// See http://www.freebsd.org/doc/en/books/porters-handbook/freebsd-versions.html. +var freebsdVersion uint32 + +// ParseIPv4Header parses b as an IPv4 header of ICMP error message +// invoking packet, which is contained in ICMP error message. +func ParseIPv4Header(b []byte) (*ipv4.Header, error) { + if len(b) < ipv4.HeaderLen { + return nil, errHeaderTooShort + } + hdrlen := int(b[0]&0x0f) << 2 + if hdrlen > len(b) { + return nil, errBufferTooShort + } + h := &ipv4.Header{ + Version: int(b[0] >> 4), + Len: hdrlen, + TOS: int(b[1]), + ID: int(binary.BigEndian.Uint16(b[4:6])), + FragOff: int(binary.BigEndian.Uint16(b[6:8])), + TTL: int(b[8]), + Protocol: int(b[9]), + Checksum: int(binary.BigEndian.Uint16(b[10:12])), + Src: net.IPv4(b[12], b[13], b[14], b[15]), + Dst: net.IPv4(b[16], b[17], b[18], b[19]), + } + switch runtime.GOOS { + case "darwin": + h.TotalLen = int(socket.NativeEndian.Uint16(b[2:4])) + case "freebsd": + if freebsdVersion >= 1000000 { + h.TotalLen = int(binary.BigEndian.Uint16(b[2:4])) + } else { + h.TotalLen = int(socket.NativeEndian.Uint16(b[2:4])) + } + default: + h.TotalLen = int(binary.BigEndian.Uint16(b[2:4])) + } + h.Flags = ipv4.HeaderFlags(h.FragOff&0xe000) >> 13 + h.FragOff = h.FragOff & 0x1fff + if hdrlen-ipv4.HeaderLen > 0 { + h.Options = make([]byte, hdrlen-ipv4.HeaderLen) + copy(h.Options, b[ipv4.HeaderLen:]) + } + return h, nil +} diff --git a/api/vendor/golang.org/x/net/icmp/ipv4_test.go b/api/vendor/golang.org/x/net/icmp/ipv4_test.go new file mode 100644 index 0000000..3fdee83 --- /dev/null +++ b/api/vendor/golang.org/x/net/icmp/ipv4_test.go @@ -0,0 +1,75 @@ +// 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 icmp + +import ( + "encoding/binary" + "net" + "reflect" + "runtime" + "testing" + + "golang.org/x/net/internal/socket" + "golang.org/x/net/ipv4" +) + +func TestParseIPv4Header(t *testing.T) { + switch socket.NativeEndian { + case binary.LittleEndian: + t.Run("LittleEndian", func(t *testing.T) { + // TODO(mikio): Add platform dependent wire + // header formats when we support new + // platforms. + wireHeaderFromKernel := [ipv4.HeaderLen]byte{ + 0x45, 0x01, 0xbe, 0xef, + 0xca, 0xfe, 0x45, 0xdc, + 0xff, 0x01, 0xde, 0xad, + 172, 16, 254, 254, + 192, 168, 0, 1, + } + wireHeaderFromTradBSDKernel := [ipv4.HeaderLen]byte{ + 0x45, 0x01, 0xef, 0xbe, + 0xca, 0xfe, 0x45, 0xdc, + 0xff, 0x01, 0xde, 0xad, + 172, 16, 254, 254, + 192, 168, 0, 1, + } + th := &ipv4.Header{ + Version: ipv4.Version, + Len: ipv4.HeaderLen, + TOS: 1, + TotalLen: 0xbeef, + ID: 0xcafe, + Flags: ipv4.DontFragment, + FragOff: 1500, + TTL: 255, + Protocol: 1, + Checksum: 0xdead, + Src: net.IPv4(172, 16, 254, 254), + Dst: net.IPv4(192, 168, 0, 1), + } + var wh []byte + switch runtime.GOOS { + case "darwin": + wh = wireHeaderFromTradBSDKernel[:] + case "freebsd": + if freebsdVersion >= 1000000 { + wh = wireHeaderFromKernel[:] + } else { + wh = wireHeaderFromTradBSDKernel[:] + } + default: + wh = wireHeaderFromKernel[:] + } + h, err := ParseIPv4Header(wh) + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(h, th) { + t.Fatalf("got %#v; want %#v", h, th) + } + }) + } +} diff --git a/api/vendor/golang.org/x/net/icmp/ipv6.go b/api/vendor/golang.org/x/net/icmp/ipv6.go new file mode 100644 index 0000000..2e8cfeb --- /dev/null +++ b/api/vendor/golang.org/x/net/icmp/ipv6.go @@ -0,0 +1,23 @@ +// 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 icmp + +import ( + "net" + + "golang.org/x/net/internal/iana" +) + +const ipv6PseudoHeaderLen = 2*net.IPv6len + 8 + +// IPv6PseudoHeader returns an IPv6 pseudo header for checksum +// calculation. +func IPv6PseudoHeader(src, dst net.IP) []byte { + b := make([]byte, ipv6PseudoHeaderLen) + copy(b, src.To16()) + copy(b[net.IPv6len:], dst.To16()) + b[len(b)-1] = byte(iana.ProtocolIPv6ICMP) + return b +} diff --git a/api/vendor/golang.org/x/net/icmp/listen_posix.go b/api/vendor/golang.org/x/net/icmp/listen_posix.go new file mode 100644 index 0000000..7fac4f9 --- /dev/null +++ b/api/vendor/golang.org/x/net/icmp/listen_posix.go @@ -0,0 +1,100 @@ +// 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows + +package icmp + +import ( + "net" + "os" + "runtime" + "syscall" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/ipv4" + "golang.org/x/net/ipv6" +) + +const sysIP_STRIPHDR = 0x17 // for now only darwin supports this option + +// ListenPacket listens for incoming ICMP packets addressed to +// address. See net.Dial for the syntax of address. +// +// For non-privileged datagram-oriented ICMP endpoints, network must +// be "udp4" or "udp6". The endpoint allows to read, write a few +// limited ICMP messages such as echo request and echo reply. +// Currently only Darwin and Linux support this. +// +// Examples: +// ListenPacket("udp4", "192.168.0.1") +// ListenPacket("udp4", "0.0.0.0") +// ListenPacket("udp6", "fe80::1%en0") +// ListenPacket("udp6", "::") +// +// For privileged raw ICMP endpoints, network must be "ip4" or "ip6" +// followed by a colon and an ICMP protocol number or name. +// +// Examples: +// ListenPacket("ip4:icmp", "192.168.0.1") +// ListenPacket("ip4:1", "0.0.0.0") +// ListenPacket("ip6:ipv6-icmp", "fe80::1%en0") +// ListenPacket("ip6:58", "::") +func ListenPacket(network, address string) (*PacketConn, error) { + var family, proto int + switch network { + case "udp4": + family, proto = syscall.AF_INET, iana.ProtocolICMP + case "udp6": + family, proto = syscall.AF_INET6, iana.ProtocolIPv6ICMP + default: + i := last(network, ':') + switch network[:i] { + case "ip4": + proto = iana.ProtocolICMP + case "ip6": + proto = iana.ProtocolIPv6ICMP + } + } + var cerr error + var c net.PacketConn + switch family { + case syscall.AF_INET, syscall.AF_INET6: + s, err := syscall.Socket(family, syscall.SOCK_DGRAM, proto) + if err != nil { + return nil, os.NewSyscallError("socket", err) + } + if runtime.GOOS == "darwin" && family == syscall.AF_INET { + if err := syscall.SetsockoptInt(s, iana.ProtocolIP, sysIP_STRIPHDR, 1); err != nil { + syscall.Close(s) + return nil, os.NewSyscallError("setsockopt", err) + } + } + sa, err := sockaddr(family, address) + if err != nil { + syscall.Close(s) + return nil, err + } + if err := syscall.Bind(s, sa); err != nil { + syscall.Close(s) + return nil, os.NewSyscallError("bind", err) + } + f := os.NewFile(uintptr(s), "datagram-oriented icmp") + c, cerr = net.FilePacketConn(f) + f.Close() + default: + c, cerr = net.ListenPacket(network, address) + } + if cerr != nil { + return nil, cerr + } + switch proto { + case iana.ProtocolICMP: + return &PacketConn{c: c, p4: ipv4.NewPacketConn(c)}, nil + case iana.ProtocolIPv6ICMP: + return &PacketConn{c: c, p6: ipv6.NewPacketConn(c)}, nil + default: + return &PacketConn{c: c}, nil + } +} diff --git a/api/vendor/golang.org/x/net/icmp/listen_stub.go b/api/vendor/golang.org/x/net/icmp/listen_stub.go new file mode 100644 index 0000000..668728d --- /dev/null +++ b/api/vendor/golang.org/x/net/icmp/listen_stub.go @@ -0,0 +1,33 @@ +// 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. + +// +build nacl plan9 + +package icmp + +// ListenPacket listens for incoming ICMP packets addressed to +// address. See net.Dial for the syntax of address. +// +// For non-privileged datagram-oriented ICMP endpoints, network must +// be "udp4" or "udp6". The endpoint allows to read, write a few +// limited ICMP messages such as echo request and echo reply. +// Currently only Darwin and Linux support this. +// +// Examples: +// ListenPacket("udp4", "192.168.0.1") +// ListenPacket("udp4", "0.0.0.0") +// ListenPacket("udp6", "fe80::1%en0") +// ListenPacket("udp6", "::") +// +// For privileged raw ICMP endpoints, network must be "ip4" or "ip6" +// followed by a colon and an ICMP protocol number or name. +// +// Examples: +// ListenPacket("ip4:icmp", "192.168.0.1") +// ListenPacket("ip4:1", "0.0.0.0") +// ListenPacket("ip6:ipv6-icmp", "fe80::1%en0") +// ListenPacket("ip6:58", "::") +func ListenPacket(network, address string) (*PacketConn, error) { + return nil, errOpNoSupport +} diff --git a/api/vendor/golang.org/x/net/icmp/message.go b/api/vendor/golang.org/x/net/icmp/message.go new file mode 100644 index 0000000..46fe95a --- /dev/null +++ b/api/vendor/golang.org/x/net/icmp/message.go @@ -0,0 +1,157 @@ +// 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 icmp provides basic functions for the manipulation of +// messages used in the Internet Control Message Protocols, +// ICMPv4 and ICMPv6. +// +// ICMPv4 and ICMPv6 are defined in RFC 792 and RFC 4443. +// Multi-part message support for ICMP is defined in RFC 4884. +// ICMP extensions for MPLS are defined in RFC 4950. +// ICMP extensions for interface and next-hop identification are +// defined in RFC 5837. +// PROBE: A utility for probing interfaces is defined in RFC 8335. +package icmp // import "golang.org/x/net/icmp" + +import ( + "encoding/binary" + "errors" + "net" + "syscall" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/ipv4" + "golang.org/x/net/ipv6" +) + +// BUG(mikio): This package is not implemented on NaCl and Plan 9. + +var ( + errMessageTooShort = errors.New("message too short") + errHeaderTooShort = errors.New("header too short") + errBufferTooShort = errors.New("buffer too short") + errOpNoSupport = errors.New("operation not supported") + errNoExtension = errors.New("no extension") + errInvalidExtension = errors.New("invalid extension") +) + +func checksum(b []byte) uint16 { + csumcv := len(b) - 1 // checksum coverage + s := uint32(0) + for i := 0; i < csumcv; i += 2 { + s += uint32(b[i+1])<<8 | uint32(b[i]) + } + if csumcv&1 == 0 { + s += uint32(b[csumcv]) + } + s = s>>16 + s&0xffff + s = s + s>>16 + return ^uint16(s) +} + +// A Type represents an ICMP message type. +type Type interface { + Protocol() int +} + +// A Message represents an ICMP message. +type Message struct { + Type Type // type, either ipv4.ICMPType or ipv6.ICMPType + Code int // code + Checksum int // checksum + Body MessageBody // body +} + +// Marshal returns the binary encoding of the ICMP message m. +// +// For an ICMPv4 message, the returned message always contains the +// calculated checksum field. +// +// For an ICMPv6 message, the returned message contains the calculated +// checksum field when psh is not nil, otherwise the kernel will +// compute the checksum field during the message transmission. +// When psh is not nil, it must be the pseudo header for IPv6. +func (m *Message) Marshal(psh []byte) ([]byte, error) { + var mtype int + switch typ := m.Type.(type) { + case ipv4.ICMPType: + mtype = int(typ) + case ipv6.ICMPType: + mtype = int(typ) + default: + return nil, syscall.EINVAL + } + b := []byte{byte(mtype), byte(m.Code), 0, 0} + if m.Type.Protocol() == iana.ProtocolIPv6ICMP && psh != nil { + b = append(psh, b...) + } + if m.Body != nil && m.Body.Len(m.Type.Protocol()) != 0 { + mb, err := m.Body.Marshal(m.Type.Protocol()) + if err != nil { + return nil, err + } + b = append(b, mb...) + } + if m.Type.Protocol() == iana.ProtocolIPv6ICMP { + if psh == nil { // cannot calculate checksum here + return b, nil + } + off, l := 2*net.IPv6len, len(b)-len(psh) + binary.BigEndian.PutUint32(b[off:off+4], uint32(l)) + } + s := checksum(b) + // Place checksum back in header; using ^= avoids the + // assumption the checksum bytes are zero. + b[len(psh)+2] ^= byte(s) + b[len(psh)+3] ^= byte(s >> 8) + return b[len(psh):], nil +} + +var parseFns = map[Type]func(int, Type, []byte) (MessageBody, error){ + ipv4.ICMPTypeDestinationUnreachable: parseDstUnreach, + ipv4.ICMPTypeTimeExceeded: parseTimeExceeded, + ipv4.ICMPTypeParameterProblem: parseParamProb, + + ipv4.ICMPTypeEcho: parseEcho, + ipv4.ICMPTypeEchoReply: parseEcho, + ipv4.ICMPTypeExtendedEchoRequest: parseExtendedEchoRequest, + ipv4.ICMPTypeExtendedEchoReply: parseExtendedEchoReply, + + ipv6.ICMPTypeDestinationUnreachable: parseDstUnreach, + ipv6.ICMPTypePacketTooBig: parsePacketTooBig, + ipv6.ICMPTypeTimeExceeded: parseTimeExceeded, + ipv6.ICMPTypeParameterProblem: parseParamProb, + + ipv6.ICMPTypeEchoRequest: parseEcho, + ipv6.ICMPTypeEchoReply: parseEcho, + ipv6.ICMPTypeExtendedEchoRequest: parseExtendedEchoRequest, + ipv6.ICMPTypeExtendedEchoReply: parseExtendedEchoReply, +} + +// ParseMessage parses b as an ICMP message. +// Proto must be either the ICMPv4 or ICMPv6 protocol number. +func ParseMessage(proto int, b []byte) (*Message, error) { + if len(b) < 4 { + return nil, errMessageTooShort + } + var err error + m := &Message{Code: int(b[1]), Checksum: int(binary.BigEndian.Uint16(b[2:4]))} + switch proto { + case iana.ProtocolICMP: + m.Type = ipv4.ICMPType(b[0]) + case iana.ProtocolIPv6ICMP: + m.Type = ipv6.ICMPType(b[0]) + default: + return nil, syscall.EINVAL + } + if fn, ok := parseFns[m.Type]; !ok { + m.Body, err = parseDefaultMessageBody(proto, b[4:]) + } else { + m.Body, err = fn(proto, m.Type, b[4:]) + } + if err != nil { + return nil, err + } + return m, nil +} diff --git a/api/vendor/golang.org/x/net/icmp/message_test.go b/api/vendor/golang.org/x/net/icmp/message_test.go new file mode 100644 index 0000000..c278b8b --- /dev/null +++ b/api/vendor/golang.org/x/net/icmp/message_test.go @@ -0,0 +1,155 @@ +// 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 icmp_test + +import ( + "net" + "reflect" + "testing" + + "golang.org/x/net/icmp" + "golang.org/x/net/internal/iana" + "golang.org/x/net/ipv4" + "golang.org/x/net/ipv6" +) + +func TestMarshalAndParseMessage(t *testing.T) { + fn := func(t *testing.T, proto int, tms []icmp.Message) { + var pshs [][]byte + switch proto { + case iana.ProtocolICMP: + pshs = [][]byte{nil} + case iana.ProtocolIPv6ICMP: + pshs = [][]byte{ + icmp.IPv6PseudoHeader(net.ParseIP("fe80::1"), net.ParseIP("ff02::1")), + nil, + } + } + for i, tm := range tms { + for _, psh := range pshs { + b, err := tm.Marshal(psh) + if err != nil { + t.Fatal(err) + } + m, err := icmp.ParseMessage(proto, b) + if err != nil { + t.Fatal(err) + } + if m.Type != tm.Type || m.Code != tm.Code { + t.Errorf("#%d: got %#v; want %#v", i, m, &tm) + } + if !reflect.DeepEqual(m.Body, tm.Body) { + t.Errorf("#%d: got %#v; want %#v", i, m.Body, tm.Body) + } + } + } + } + + t.Run("IPv4", func(t *testing.T) { + fn(t, iana.ProtocolICMP, + []icmp.Message{ + { + Type: ipv4.ICMPTypeDestinationUnreachable, Code: 15, + Body: &icmp.DstUnreach{ + Data: []byte("ERROR-INVOKING-PACKET"), + }, + }, + { + Type: ipv4.ICMPTypeTimeExceeded, Code: 1, + Body: &icmp.TimeExceeded{ + Data: []byte("ERROR-INVOKING-PACKET"), + }, + }, + { + Type: ipv4.ICMPTypeParameterProblem, Code: 2, + Body: &icmp.ParamProb{ + Pointer: 8, + Data: []byte("ERROR-INVOKING-PACKET"), + }, + }, + { + Type: ipv4.ICMPTypeEcho, Code: 0, + Body: &icmp.Echo{ + ID: 1, Seq: 2, + Data: []byte("HELLO-R-U-THERE"), + }, + }, + { + Type: ipv4.ICMPTypeExtendedEchoRequest, Code: 0, + Body: &icmp.ExtendedEchoRequest{ + ID: 1, Seq: 2, + }, + }, + { + Type: ipv4.ICMPTypeExtendedEchoReply, Code: 0, + Body: &icmp.ExtendedEchoReply{ + State: 4 /* Delay */, Active: true, IPv4: true, + }, + }, + { + Type: ipv4.ICMPTypePhoturis, + Body: &icmp.DefaultMessageBody{ + Data: []byte{0x80, 0x40, 0x20, 0x10}, + }, + }, + }) + }) + t.Run("IPv6", func(t *testing.T) { + fn(t, iana.ProtocolIPv6ICMP, + []icmp.Message{ + { + Type: ipv6.ICMPTypeDestinationUnreachable, Code: 6, + Body: &icmp.DstUnreach{ + Data: []byte("ERROR-INVOKING-PACKET"), + }, + }, + { + Type: ipv6.ICMPTypePacketTooBig, Code: 0, + Body: &icmp.PacketTooBig{ + MTU: 1<<16 - 1, + Data: []byte("ERROR-INVOKING-PACKET"), + }, + }, + { + Type: ipv6.ICMPTypeTimeExceeded, Code: 1, + Body: &icmp.TimeExceeded{ + Data: []byte("ERROR-INVOKING-PACKET"), + }, + }, + { + Type: ipv6.ICMPTypeParameterProblem, Code: 2, + Body: &icmp.ParamProb{ + Pointer: 8, + Data: []byte("ERROR-INVOKING-PACKET"), + }, + }, + { + Type: ipv6.ICMPTypeEchoRequest, Code: 0, + Body: &icmp.Echo{ + ID: 1, Seq: 2, + Data: []byte("HELLO-R-U-THERE"), + }, + }, + { + Type: ipv6.ICMPTypeExtendedEchoRequest, Code: 0, + Body: &icmp.ExtendedEchoRequest{ + ID: 1, Seq: 2, + }, + }, + { + Type: ipv6.ICMPTypeExtendedEchoReply, Code: 0, + Body: &icmp.ExtendedEchoReply{ + State: 5 /* Probe */, Active: true, IPv6: true, + }, + }, + { + Type: ipv6.ICMPTypeDuplicateAddressConfirmation, + Body: &icmp.DefaultMessageBody{ + Data: []byte{0x80, 0x40, 0x20, 0x10}, + }, + }, + }) + }) +} diff --git a/api/vendor/golang.org/x/net/icmp/messagebody.go b/api/vendor/golang.org/x/net/icmp/messagebody.go new file mode 100644 index 0000000..2463730 --- /dev/null +++ b/api/vendor/golang.org/x/net/icmp/messagebody.go @@ -0,0 +1,41 @@ +// 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 icmp + +// A MessageBody represents an ICMP message body. +type MessageBody interface { + // Len returns the length of ICMP message body. + // Proto must be either the ICMPv4 or ICMPv6 protocol number. + Len(proto int) int + + // Marshal returns the binary encoding of ICMP message body. + // Proto must be either the ICMPv4 or ICMPv6 protocol number. + Marshal(proto int) ([]byte, error) +} + +// A DefaultMessageBody represents the default message body. +type DefaultMessageBody struct { + Data []byte // data +} + +// Len implements the Len method of MessageBody interface. +func (p *DefaultMessageBody) Len(proto int) int { + if p == nil { + return 0 + } + return len(p.Data) +} + +// Marshal implements the Marshal method of MessageBody interface. +func (p *DefaultMessageBody) Marshal(proto int) ([]byte, error) { + return p.Data, nil +} + +// parseDefaultMessageBody parses b as an ICMP message body. +func parseDefaultMessageBody(proto int, b []byte) (MessageBody, error) { + p := &DefaultMessageBody{Data: make([]byte, len(b))} + copy(p.Data, b) + return p, nil +} diff --git a/api/vendor/golang.org/x/net/icmp/mpls.go b/api/vendor/golang.org/x/net/icmp/mpls.go new file mode 100644 index 0000000..f9f4841 --- /dev/null +++ b/api/vendor/golang.org/x/net/icmp/mpls.go @@ -0,0 +1,77 @@ +// Copyright 2015 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 icmp + +import "encoding/binary" + +// MPLSLabel represents an MPLS label stack entry. +type MPLSLabel struct { + Label int // label value + TC int // traffic class; formerly experimental use + S bool // bottom of stack + TTL int // time to live +} + +const ( + classMPLSLabelStack = 1 + typeIncomingMPLSLabelStack = 1 +) + +// MPLSLabelStack represents an MPLS label stack. +type MPLSLabelStack struct { + Class int // extension object class number + Type int // extension object sub-type + Labels []MPLSLabel +} + +// Len implements the Len method of Extension interface. +func (ls *MPLSLabelStack) Len(proto int) int { + return 4 + (4 * len(ls.Labels)) +} + +// Marshal implements the Marshal method of Extension interface. +func (ls *MPLSLabelStack) Marshal(proto int) ([]byte, error) { + b := make([]byte, ls.Len(proto)) + if err := ls.marshal(proto, b); err != nil { + return nil, err + } + return b, nil +} + +func (ls *MPLSLabelStack) marshal(proto int, b []byte) error { + l := ls.Len(proto) + binary.BigEndian.PutUint16(b[:2], uint16(l)) + b[2], b[3] = classMPLSLabelStack, typeIncomingMPLSLabelStack + off := 4 + for _, ll := range ls.Labels { + b[off], b[off+1], b[off+2] = byte(ll.Label>>12), byte(ll.Label>>4&0xff), byte(ll.Label<<4&0xf0) + b[off+2] |= byte(ll.TC << 1 & 0x0e) + if ll.S { + b[off+2] |= 0x1 + } + b[off+3] = byte(ll.TTL) + off += 4 + } + return nil +} + +func parseMPLSLabelStack(b []byte) (Extension, error) { + ls := &MPLSLabelStack{ + Class: int(b[2]), + Type: int(b[3]), + } + for b = b[4:]; len(b) >= 4; b = b[4:] { + ll := MPLSLabel{ + Label: int(b[0])<<12 | int(b[1])<<4 | int(b[2])>>4, + TC: int(b[2]&0x0e) >> 1, + TTL: int(b[3]), + } + if b[2]&0x1 != 0 { + ll.S = true + } + ls.Labels = append(ls.Labels, ll) + } + return ls, nil +} diff --git a/api/vendor/golang.org/x/net/icmp/multipart.go b/api/vendor/golang.org/x/net/icmp/multipart.go new file mode 100644 index 0000000..9ebbbaf --- /dev/null +++ b/api/vendor/golang.org/x/net/icmp/multipart.go @@ -0,0 +1,121 @@ +// Copyright 2015 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 icmp + +import "golang.org/x/net/internal/iana" + +// multipartMessageBodyDataLen takes b as an original datagram and +// exts as extensions, and returns a required length for message body +// and a required length for a padded original datagram in wire +// format. +func multipartMessageBodyDataLen(proto int, withOrigDgram bool, b []byte, exts []Extension) (bodyLen, dataLen int) { + for _, ext := range exts { + bodyLen += ext.Len(proto) + } + if bodyLen > 0 { + if withOrigDgram { + dataLen = multipartMessageOrigDatagramLen(proto, b) + } + bodyLen += 4 // length of extension header + } else { + dataLen = len(b) + } + bodyLen += dataLen + return bodyLen, dataLen +} + +// multipartMessageOrigDatagramLen takes b as an original datagram, +// and returns a required length for a padded orignal datagram in wire +// format. +func multipartMessageOrigDatagramLen(proto int, b []byte) int { + roundup := func(b []byte, align int) int { + // According to RFC 4884, the padded original datagram + // field must contain at least 128 octets. + if len(b) < 128 { + return 128 + } + r := len(b) + return (r + align - 1) & ^(align - 1) + } + switch proto { + case iana.ProtocolICMP: + return roundup(b, 4) + case iana.ProtocolIPv6ICMP: + return roundup(b, 8) + default: + return len(b) + } +} + +// marshalMultipartMessageBody takes data as an original datagram and +// exts as extesnsions, and returns a binary encoding of message body. +// It can be used for non-multipart message bodies when exts is nil. +func marshalMultipartMessageBody(proto int, withOrigDgram bool, data []byte, exts []Extension) ([]byte, error) { + bodyLen, dataLen := multipartMessageBodyDataLen(proto, withOrigDgram, data, exts) + b := make([]byte, 4+bodyLen) + copy(b[4:], data) + off := dataLen + 4 + if len(exts) > 0 { + b[dataLen+4] = byte(extensionVersion << 4) + off += 4 // length of object header + for _, ext := range exts { + switch ext := ext.(type) { + case *MPLSLabelStack: + if err := ext.marshal(proto, b[off:]); err != nil { + return nil, err + } + off += ext.Len(proto) + case *InterfaceInfo: + attrs, l := ext.attrsAndLen(proto) + if err := ext.marshal(proto, b[off:], attrs, l); err != nil { + return nil, err + } + off += ext.Len(proto) + case *InterfaceIdent: + if err := ext.marshal(proto, b[off:]); err != nil { + return nil, err + } + off += ext.Len(proto) + } + } + s := checksum(b[dataLen+4:]) + b[dataLen+4+2] ^= byte(s) + b[dataLen+4+3] ^= byte(s >> 8) + if withOrigDgram { + switch proto { + case iana.ProtocolICMP: + b[1] = byte(dataLen / 4) + case iana.ProtocolIPv6ICMP: + b[0] = byte(dataLen / 8) + } + } + } + return b, nil +} + +// parseMultipartMessageBody parses b as either a non-multipart +// message body or a multipart message body. +func parseMultipartMessageBody(proto int, typ Type, b []byte) ([]byte, []Extension, error) { + var l int + switch proto { + case iana.ProtocolICMP: + l = 4 * int(b[1]) + case iana.ProtocolIPv6ICMP: + l = 8 * int(b[0]) + } + if len(b) == 4 { + return nil, nil, nil + } + exts, l, err := parseExtensions(typ, b[4:], l) + if err != nil { + l = len(b) - 4 + } + var data []byte + if l > 0 { + data = make([]byte, l) + copy(data, b[4:]) + } + return data, exts, nil +} diff --git a/api/vendor/golang.org/x/net/icmp/multipart_test.go b/api/vendor/golang.org/x/net/icmp/multipart_test.go new file mode 100644 index 0000000..7440882 --- /dev/null +++ b/api/vendor/golang.org/x/net/icmp/multipart_test.go @@ -0,0 +1,575 @@ +// Copyright 2015 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 icmp_test + +import ( + "errors" + "fmt" + "net" + "reflect" + "testing" + + "golang.org/x/net/icmp" + "golang.org/x/net/internal/iana" + "golang.org/x/net/ipv4" + "golang.org/x/net/ipv6" +) + +func TestMarshalAndParseMultipartMessage(t *testing.T) { + fn := func(t *testing.T, proto int, tm icmp.Message) error { + b, err := tm.Marshal(nil) + if err != nil { + return err + } + switch tm.Type { + case ipv4.ICMPTypeExtendedEchoRequest, ipv6.ICMPTypeExtendedEchoRequest: + default: + switch proto { + case iana.ProtocolICMP: + if b[5] != 32 { + return fmt.Errorf("got %d; want 32", b[5]) + } + case iana.ProtocolIPv6ICMP: + if b[4] != 16 { + return fmt.Errorf("got %d; want 16", b[4]) + } + default: + return fmt.Errorf("unknown protocol: %d", proto) + } + } + m, err := icmp.ParseMessage(proto, b) + if err != nil { + return err + } + if m.Type != tm.Type || m.Code != tm.Code { + return fmt.Errorf("got %v; want %v", m, &tm) + } + switch m.Type { + case ipv4.ICMPTypeExtendedEchoRequest, ipv6.ICMPTypeExtendedEchoRequest: + got, want := m.Body.(*icmp.ExtendedEchoRequest), tm.Body.(*icmp.ExtendedEchoRequest) + if !reflect.DeepEqual(got.Extensions, want.Extensions) { + return errors.New(dumpExtensions(got.Extensions, want.Extensions)) + } + case ipv4.ICMPTypeDestinationUnreachable: + got, want := m.Body.(*icmp.DstUnreach), tm.Body.(*icmp.DstUnreach) + if !reflect.DeepEqual(got.Extensions, want.Extensions) { + return errors.New(dumpExtensions(got.Extensions, want.Extensions)) + } + if len(got.Data) != 128 { + return fmt.Errorf("got %d; want 128", len(got.Data)) + } + case ipv4.ICMPTypeTimeExceeded: + got, want := m.Body.(*icmp.TimeExceeded), tm.Body.(*icmp.TimeExceeded) + if !reflect.DeepEqual(got.Extensions, want.Extensions) { + return errors.New(dumpExtensions(got.Extensions, want.Extensions)) + } + if len(got.Data) != 128 { + return fmt.Errorf("got %d; want 128", len(got.Data)) + } + case ipv4.ICMPTypeParameterProblem: + got, want := m.Body.(*icmp.ParamProb), tm.Body.(*icmp.ParamProb) + if !reflect.DeepEqual(got.Extensions, want.Extensions) { + return errors.New(dumpExtensions(got.Extensions, want.Extensions)) + } + if len(got.Data) != 128 { + return fmt.Errorf("got %d; want 128", len(got.Data)) + } + case ipv6.ICMPTypeDestinationUnreachable: + got, want := m.Body.(*icmp.DstUnreach), tm.Body.(*icmp.DstUnreach) + if !reflect.DeepEqual(got.Extensions, want.Extensions) { + return errors.New(dumpExtensions(got.Extensions, want.Extensions)) + } + if len(got.Data) != 128 { + return fmt.Errorf("got %d; want 128", len(got.Data)) + } + case ipv6.ICMPTypeTimeExceeded: + got, want := m.Body.(*icmp.TimeExceeded), tm.Body.(*icmp.TimeExceeded) + if !reflect.DeepEqual(got.Extensions, want.Extensions) { + return errors.New(dumpExtensions(got.Extensions, want.Extensions)) + } + if len(got.Data) != 128 { + return fmt.Errorf("got %d; want 128", len(got.Data)) + } + default: + return fmt.Errorf("unknown message type: %v", m.Type) + } + return nil + } + + t.Run("IPv4", func(t *testing.T) { + for i, tm := range []icmp.Message{ + { + Type: ipv4.ICMPTypeDestinationUnreachable, Code: 15, + Body: &icmp.DstUnreach{ + Data: []byte("ERROR-INVOKING-PACKET"), + Extensions: []icmp.Extension{ + &icmp.MPLSLabelStack{ + Class: 1, + Type: 1, + Labels: []icmp.MPLSLabel{ + { + Label: 16014, + TC: 0x4, + S: true, + TTL: 255, + }, + }, + }, + &icmp.InterfaceInfo{ + Class: 2, + Type: 0x0f, + Interface: &net.Interface{ + Index: 15, + Name: "en101", + MTU: 8192, + }, + Addr: &net.IPAddr{ + IP: net.IPv4(192, 168, 0, 1).To4(), + }, + }, + }, + }, + }, + { + Type: ipv4.ICMPTypeTimeExceeded, Code: 1, + Body: &icmp.TimeExceeded{ + Data: []byte("ERROR-INVOKING-PACKET"), + Extensions: []icmp.Extension{ + &icmp.InterfaceInfo{ + Class: 2, + Type: 0x0f, + Interface: &net.Interface{ + Index: 15, + Name: "en101", + MTU: 8192, + }, + Addr: &net.IPAddr{ + IP: net.IPv4(192, 168, 0, 1).To4(), + }, + }, + &icmp.MPLSLabelStack{ + Class: 1, + Type: 1, + Labels: []icmp.MPLSLabel{ + { + Label: 16014, + TC: 0x4, + S: true, + TTL: 255, + }, + }, + }, + }, + }, + }, + { + Type: ipv4.ICMPTypeParameterProblem, Code: 2, + Body: &icmp.ParamProb{ + Pointer: 8, + Data: []byte("ERROR-INVOKING-PACKET"), + Extensions: []icmp.Extension{ + &icmp.MPLSLabelStack{ + Class: 1, + Type: 1, + Labels: []icmp.MPLSLabel{ + { + Label: 16014, + TC: 0x4, + S: true, + TTL: 255, + }, + }, + }, + &icmp.InterfaceInfo{ + Class: 2, + Type: 0x0f, + Interface: &net.Interface{ + Index: 15, + Name: "en101", + MTU: 8192, + }, + Addr: &net.IPAddr{ + IP: net.IPv4(192, 168, 0, 1).To4(), + }, + }, + &icmp.InterfaceInfo{ + Class: 2, + Type: 0x2f, + Interface: &net.Interface{ + Index: 16, + Name: "en102", + MTU: 8192, + }, + Addr: &net.IPAddr{ + IP: net.IPv4(192, 168, 0, 2).To4(), + }, + }, + }, + }, + }, + { + Type: ipv4.ICMPTypeExtendedEchoRequest, Code: 0, + Body: &icmp.ExtendedEchoRequest{ + ID: 1, Seq: 2, Local: true, + Extensions: []icmp.Extension{ + &icmp.InterfaceIdent{ + Class: 3, + Type: 1, + Name: "en101", + }, + }, + }, + }, + { + Type: ipv4.ICMPTypeExtendedEchoRequest, Code: 0, + Body: &icmp.ExtendedEchoRequest{ + ID: 1, Seq: 2, Local: true, + Extensions: []icmp.Extension{ + &icmp.InterfaceIdent{ + Class: 3, + Type: 2, + Index: 911, + }, + &icmp.InterfaceIdent{ + Class: 3, + Type: 1, + Name: "en101", + }, + }, + }, + }, + { + Type: ipv4.ICMPTypeExtendedEchoRequest, Code: 0, + Body: &icmp.ExtendedEchoRequest{ + ID: 1, Seq: 2, + Extensions: []icmp.Extension{ + &icmp.InterfaceIdent{ + Class: 3, + Type: 3, + AFI: iana.AddrFamily48bitMAC, + Addr: []byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab}, + }, + }, + }, + }, + } { + if err := fn(t, iana.ProtocolICMP, tm); err != nil { + t.Errorf("#%d: %v", i, err) + } + } + }) + t.Run("IPv6", func(t *testing.T) { + for i, tm := range []icmp.Message{ + { + Type: ipv6.ICMPTypeDestinationUnreachable, Code: 6, + Body: &icmp.DstUnreach{ + Data: []byte("ERROR-INVOKING-PACKET"), + Extensions: []icmp.Extension{ + &icmp.MPLSLabelStack{ + Class: 1, + Type: 1, + Labels: []icmp.MPLSLabel{ + { + Label: 16014, + TC: 0x4, + S: true, + TTL: 255, + }, + }, + }, + &icmp.InterfaceInfo{ + Class: 2, + Type: 0x0f, + Interface: &net.Interface{ + Index: 15, + Name: "en101", + MTU: 8192, + }, + Addr: &net.IPAddr{ + IP: net.ParseIP("fe80::1"), + Zone: "en101", + }, + }, + }, + }, + }, + { + Type: ipv6.ICMPTypeTimeExceeded, Code: 1, + Body: &icmp.TimeExceeded{ + Data: []byte("ERROR-INVOKING-PACKET"), + Extensions: []icmp.Extension{ + &icmp.InterfaceInfo{ + Class: 2, + Type: 0x0f, + Interface: &net.Interface{ + Index: 15, + Name: "en101", + MTU: 8192, + }, + Addr: &net.IPAddr{ + IP: net.ParseIP("fe80::1"), + Zone: "en101", + }, + }, + &icmp.MPLSLabelStack{ + Class: 1, + Type: 1, + Labels: []icmp.MPLSLabel{ + { + Label: 16014, + TC: 0x4, + S: true, + TTL: 255, + }, + }, + }, + &icmp.InterfaceInfo{ + Class: 2, + Type: 0x2f, + Interface: &net.Interface{ + Index: 16, + Name: "en102", + MTU: 8192, + }, + Addr: &net.IPAddr{ + IP: net.ParseIP("fe80::1"), + Zone: "en102", + }, + }, + }, + }, + }, + { + Type: ipv6.ICMPTypeExtendedEchoRequest, Code: 0, + Body: &icmp.ExtendedEchoRequest{ + ID: 1, Seq: 2, Local: true, + Extensions: []icmp.Extension{ + &icmp.InterfaceIdent{ + Class: 3, + Type: 1, + Name: "en101", + }, + }, + }, + }, + { + Type: ipv6.ICMPTypeExtendedEchoRequest, Code: 0, + Body: &icmp.ExtendedEchoRequest{ + ID: 1, Seq: 2, Local: true, + Extensions: []icmp.Extension{ + &icmp.InterfaceIdent{ + Class: 3, + Type: 1, + Name: "en101", + }, + &icmp.InterfaceIdent{ + Class: 3, + Type: 2, + Index: 911, + }, + }, + }, + }, + { + Type: ipv6.ICMPTypeExtendedEchoRequest, Code: 0, + Body: &icmp.ExtendedEchoRequest{ + ID: 1, Seq: 2, + Extensions: []icmp.Extension{ + &icmp.InterfaceIdent{ + Class: 3, + Type: 3, + AFI: iana.AddrFamilyIPv4, + Addr: []byte{192, 0, 2, 1}, + }, + }, + }, + }, + } { + if err := fn(t, iana.ProtocolIPv6ICMP, tm); err != nil { + t.Errorf("#%d: %v", i, err) + } + } + }) +} + +func dumpExtensions(gotExts, wantExts []icmp.Extension) string { + var s string + for i, got := range gotExts { + switch got := got.(type) { + case *icmp.MPLSLabelStack: + want := wantExts[i].(*icmp.MPLSLabelStack) + if !reflect.DeepEqual(got, want) { + s += fmt.Sprintf("#%d: got %#v; want %#v\n", i, got, want) + } + case *icmp.InterfaceInfo: + want := wantExts[i].(*icmp.InterfaceInfo) + if !reflect.DeepEqual(got, want) { + s += fmt.Sprintf("#%d: got %#v, %#v, %#v; want %#v, %#v, %#v\n", i, got, got.Interface, got.Addr, want, want.Interface, want.Addr) + } + case *icmp.InterfaceIdent: + want := wantExts[i].(*icmp.InterfaceIdent) + if !reflect.DeepEqual(got, want) { + s += fmt.Sprintf("#%d: got %#v; want %#v\n", i, got, want) + } + } + } + if len(s) == 0 { + return "" + } + return s[:len(s)-1] +} + +func TestMultipartMessageBodyLen(t *testing.T) { + for i, tt := range []struct { + proto int + in icmp.MessageBody + out int + }{ + { + iana.ProtocolICMP, + &icmp.DstUnreach{ + Data: make([]byte, ipv4.HeaderLen), + }, + 4 + ipv4.HeaderLen, // unused and original datagram + }, + { + iana.ProtocolICMP, + &icmp.TimeExceeded{ + Data: make([]byte, ipv4.HeaderLen), + }, + 4 + ipv4.HeaderLen, // unused and original datagram + }, + { + iana.ProtocolICMP, + &icmp.ParamProb{ + Data: make([]byte, ipv4.HeaderLen), + }, + 4 + ipv4.HeaderLen, // [pointer, unused] and original datagram + }, + + { + iana.ProtocolICMP, + &icmp.ParamProb{ + Data: make([]byte, ipv4.HeaderLen), + Extensions: []icmp.Extension{ + &icmp.MPLSLabelStack{}, + }, + }, + 4 + 4 + 4 + 0 + 128, // [pointer, length, unused], extension header, object header, object payload, original datagram + }, + { + iana.ProtocolICMP, + &icmp.ParamProb{ + Data: make([]byte, 128), + Extensions: []icmp.Extension{ + &icmp.MPLSLabelStack{}, + }, + }, + 4 + 4 + 4 + 0 + 128, // [pointer, length, unused], extension header, object header, object payload and original datagram + }, + { + iana.ProtocolICMP, + &icmp.ParamProb{ + Data: make([]byte, 129), + Extensions: []icmp.Extension{ + &icmp.MPLSLabelStack{}, + }, + }, + 4 + 4 + 4 + 0 + 132, // [pointer, length, unused], extension header, object header, object payload and original datagram + }, + + { + iana.ProtocolIPv6ICMP, + &icmp.DstUnreach{ + Data: make([]byte, ipv6.HeaderLen), + }, + 4 + ipv6.HeaderLen, // unused and original datagram + }, + { + iana.ProtocolIPv6ICMP, + &icmp.PacketTooBig{ + Data: make([]byte, ipv6.HeaderLen), + }, + 4 + ipv6.HeaderLen, // mtu and original datagram + }, + { + iana.ProtocolIPv6ICMP, + &icmp.TimeExceeded{ + Data: make([]byte, ipv6.HeaderLen), + }, + 4 + ipv6.HeaderLen, // unused and original datagram + }, + { + iana.ProtocolIPv6ICMP, + &icmp.ParamProb{ + Data: make([]byte, ipv6.HeaderLen), + }, + 4 + ipv6.HeaderLen, // pointer and original datagram + }, + + { + iana.ProtocolIPv6ICMP, + &icmp.DstUnreach{ + Data: make([]byte, 127), + Extensions: []icmp.Extension{ + &icmp.MPLSLabelStack{}, + }, + }, + 4 + 4 + 4 + 0 + 128, // [length, unused], extension header, object header, object payload and original datagram + }, + { + iana.ProtocolIPv6ICMP, + &icmp.DstUnreach{ + Data: make([]byte, 128), + Extensions: []icmp.Extension{ + &icmp.MPLSLabelStack{}, + }, + }, + 4 + 4 + 4 + 0 + 128, // [length, unused], extension header, object header, object payload and original datagram + }, + { + iana.ProtocolIPv6ICMP, + &icmp.DstUnreach{ + Data: make([]byte, 129), + Extensions: []icmp.Extension{ + &icmp.MPLSLabelStack{}, + }, + }, + 4 + 4 + 4 + 0 + 136, // [length, unused], extension header, object header, object payload and original datagram + }, + + { + iana.ProtocolICMP, + &icmp.ExtendedEchoRequest{}, + 4, // [id, seq, l-bit] + }, + { + iana.ProtocolICMP, + &icmp.ExtendedEchoRequest{ + Extensions: []icmp.Extension{ + &icmp.InterfaceIdent{}, + }, + }, + 4 + 4 + 4, // [id, seq, l-bit], extension header, object header + }, + { + iana.ProtocolIPv6ICMP, + &icmp.ExtendedEchoRequest{ + Extensions: []icmp.Extension{ + &icmp.InterfaceIdent{ + Type: 3, + AFI: iana.AddrFamilyNSAP, + Addr: []byte{0x49, 0x00, 0x01, 0xaa, 0xaa, 0xbb, 0xbb, 0xcc, 0xcc, 0x00}, + }, + }, + }, + 4 + 4 + 4 + 16, // [id, seq, l-bit], extension header, object header, object payload + }, + } { + if out := tt.in.Len(tt.proto); out != tt.out { + t.Errorf("#%d: got %d; want %d", i, out, tt.out) + } + } +} diff --git a/api/vendor/golang.org/x/net/icmp/packettoobig.go b/api/vendor/golang.org/x/net/icmp/packettoobig.go new file mode 100644 index 0000000..afbf24f --- /dev/null +++ b/api/vendor/golang.org/x/net/icmp/packettoobig.go @@ -0,0 +1,43 @@ +// 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 icmp + +import "encoding/binary" + +// A PacketTooBig represents an ICMP packet too big message body. +type PacketTooBig struct { + MTU int // maximum transmission unit of the nexthop link + Data []byte // data, known as original datagram field +} + +// Len implements the Len method of MessageBody interface. +func (p *PacketTooBig) Len(proto int) int { + if p == nil { + return 0 + } + return 4 + len(p.Data) +} + +// Marshal implements the Marshal method of MessageBody interface. +func (p *PacketTooBig) Marshal(proto int) ([]byte, error) { + b := make([]byte, 4+len(p.Data)) + binary.BigEndian.PutUint32(b[:4], uint32(p.MTU)) + copy(b[4:], p.Data) + return b, nil +} + +// parsePacketTooBig parses b as an ICMP packet too big message body. +func parsePacketTooBig(proto int, _ Type, b []byte) (MessageBody, error) { + bodyLen := len(b) + if bodyLen < 4 { + return nil, errMessageTooShort + } + p := &PacketTooBig{MTU: int(binary.BigEndian.Uint32(b[:4]))} + if bodyLen > 4 { + p.Data = make([]byte, bodyLen-4) + copy(p.Data, b[4:]) + } + return p, nil +} diff --git a/api/vendor/golang.org/x/net/icmp/paramprob.go b/api/vendor/golang.org/x/net/icmp/paramprob.go new file mode 100644 index 0000000..8587255 --- /dev/null +++ b/api/vendor/golang.org/x/net/icmp/paramprob.go @@ -0,0 +1,63 @@ +// 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 icmp + +import ( + "encoding/binary" + "golang.org/x/net/internal/iana" +) + +// A ParamProb represents an ICMP parameter problem message body. +type ParamProb struct { + Pointer uintptr // offset within the data where the error was detected + Data []byte // data, known as original datagram field + Extensions []Extension // extensions +} + +// Len implements the Len method of MessageBody interface. +func (p *ParamProb) Len(proto int) int { + if p == nil { + return 0 + } + l, _ := multipartMessageBodyDataLen(proto, true, p.Data, p.Extensions) + return 4 + l +} + +// Marshal implements the Marshal method of MessageBody interface. +func (p *ParamProb) Marshal(proto int) ([]byte, error) { + if proto == iana.ProtocolIPv6ICMP { + b := make([]byte, p.Len(proto)) + binary.BigEndian.PutUint32(b[:4], uint32(p.Pointer)) + copy(b[4:], p.Data) + return b, nil + } + b, err := marshalMultipartMessageBody(proto, true, p.Data, p.Extensions) + if err != nil { + return nil, err + } + b[0] = byte(p.Pointer) + return b, nil +} + +// parseParamProb parses b as an ICMP parameter problem message body. +func parseParamProb(proto int, typ Type, b []byte) (MessageBody, error) { + if len(b) < 4 { + return nil, errMessageTooShort + } + p := &ParamProb{} + if proto == iana.ProtocolIPv6ICMP { + p.Pointer = uintptr(binary.BigEndian.Uint32(b[:4])) + p.Data = make([]byte, len(b)-4) + copy(p.Data, b[4:]) + return p, nil + } + p.Pointer = uintptr(b[0]) + var err error + p.Data, p.Extensions, err = parseMultipartMessageBody(proto, typ, b) + if err != nil { + return nil, err + } + return p, nil +} diff --git a/api/vendor/golang.org/x/net/icmp/sys_freebsd.go b/api/vendor/golang.org/x/net/icmp/sys_freebsd.go new file mode 100644 index 0000000..c75f3dd --- /dev/null +++ b/api/vendor/golang.org/x/net/icmp/sys_freebsd.go @@ -0,0 +1,11 @@ +// 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 icmp + +import "syscall" + +func init() { + freebsdVersion, _ = syscall.SysctlUint32("kern.osreldate") +} diff --git a/api/vendor/golang.org/x/net/icmp/timeexceeded.go b/api/vendor/golang.org/x/net/icmp/timeexceeded.go new file mode 100644 index 0000000..14e9e23 --- /dev/null +++ b/api/vendor/golang.org/x/net/icmp/timeexceeded.go @@ -0,0 +1,39 @@ +// 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 icmp + +// A TimeExceeded represents an ICMP time exceeded message body. +type TimeExceeded struct { + Data []byte // data, known as original datagram field + Extensions []Extension // extensions +} + +// Len implements the Len method of MessageBody interface. +func (p *TimeExceeded) Len(proto int) int { + if p == nil { + return 0 + } + l, _ := multipartMessageBodyDataLen(proto, true, p.Data, p.Extensions) + return 4 + l +} + +// Marshal implements the Marshal method of MessageBody interface. +func (p *TimeExceeded) Marshal(proto int) ([]byte, error) { + return marshalMultipartMessageBody(proto, true, p.Data, p.Extensions) +} + +// parseTimeExceeded parses b as an ICMP time exceeded message body. +func parseTimeExceeded(proto int, typ Type, b []byte) (MessageBody, error) { + if len(b) < 4 { + return nil, errMessageTooShort + } + p := &TimeExceeded{} + var err error + p.Data, p.Extensions, err = parseMultipartMessageBody(proto, typ, b) + if err != nil { + return nil, err + } + return p, nil +} diff --git a/api/vendor/golang.org/x/net/idna/example_test.go b/api/vendor/golang.org/x/net/idna/example_test.go new file mode 100644 index 0000000..948f6eb --- /dev/null +++ b/api/vendor/golang.org/x/net/idna/example_test.go @@ -0,0 +1,70 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +// 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 idna_test + +import ( + "fmt" + + "golang.org/x/net/idna" +) + +func ExampleProfile() { + // Raw Punycode has no restrictions and does no mappings. + fmt.Println(idna.ToASCII("")) + fmt.Println(idna.ToASCII("*.faß.com")) + fmt.Println(idna.Punycode.ToASCII("*.faß.com")) + + // Rewrite IDN for lookup. This (currently) uses transitional mappings to + // find a balance between IDNA2003 and IDNA2008 compatibility. + fmt.Println(idna.Lookup.ToASCII("")) + fmt.Println(idna.Lookup.ToASCII("www.faß.com")) + + // Convert an IDN to ASCII for registration purposes. This changes the + // encoding, but reports an error if the input was illformed. + fmt.Println(idna.Registration.ToASCII("")) + fmt.Println(idna.Registration.ToASCII("www.faß.com")) + + // Output: + // + // *.xn--fa-hia.com + // *.xn--fa-hia.com + // + // www.fass.com + // idna: invalid label "" + // www.xn--fa-hia.com +} + +func ExampleNew() { + var p *idna.Profile + + // Raw Punycode has no restrictions and does no mappings. + p = idna.New() + fmt.Println(p.ToASCII("*.faß.com")) + + // Do mappings. Note that star is not allowed in a DNS lookup. + p = idna.New( + idna.MapForLookup(), + idna.Transitional(true)) // Map ß -> ss + fmt.Println(p.ToASCII("*.faß.com")) + + // Lookup for registration. Also does not allow '*'. + p = idna.New(idna.ValidateForRegistration()) + fmt.Println(p.ToUnicode("*.faß.com")) + + // Set up a profile maps for lookup, but allows wild cards. + p = idna.New( + idna.MapForLookup(), + idna.Transitional(true), // Map ß -> ss + idna.StrictDomainName(false)) // Set more permissive ASCII rules. + fmt.Println(p.ToASCII("*.faß.com")) + + // Output: + // *.xn--fa-hia.com + // *.fass.com idna: disallowed rune U+002A + // *.faß.com idna: disallowed rune U+002A + // *.fass.com +} diff --git a/api/vendor/golang.org/x/net/idna/idna.go b/api/vendor/golang.org/x/net/idna/idna.go new file mode 100644 index 0000000..346fe44 --- /dev/null +++ b/api/vendor/golang.org/x/net/idna/idna.go @@ -0,0 +1,732 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +// 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 idna implements IDNA2008 using the compatibility processing +// defined by UTS (Unicode Technical Standard) #46, which defines a standard to +// deal with the transition from IDNA2003. +// +// IDNA2008 (Internationalized Domain Names for Applications), is defined in RFC +// 5890, RFC 5891, RFC 5892, RFC 5893 and RFC 5894. +// UTS #46 is defined in http://www.unicode.org/reports/tr46. +// See http://unicode.org/cldr/utility/idna.jsp for a visualization of the +// differences between these two standards. +package idna // import "golang.org/x/net/idna" + +import ( + "fmt" + "strings" + "unicode/utf8" + + "golang.org/x/text/secure/bidirule" + "golang.org/x/text/unicode/bidi" + "golang.org/x/text/unicode/norm" +) + +// NOTE: Unlike common practice in Go APIs, the functions will return a +// sanitized domain name in case of errors. Browsers sometimes use a partially +// evaluated string as lookup. +// TODO: the current error handling is, in my opinion, the least opinionated. +// Other strategies are also viable, though: +// Option 1) Return an empty string in case of error, but allow the user to +// specify explicitly which errors to ignore. +// Option 2) Return the partially evaluated string if it is itself a valid +// string, otherwise return the empty string in case of error. +// Option 3) Option 1 and 2. +// Option 4) Always return an empty string for now and implement Option 1 as +// needed, and document that the return string may not be empty in case of +// error in the future. +// I think Option 1 is best, but it is quite opinionated. + +// ToASCII is a wrapper for Punycode.ToASCII. +func ToASCII(s string) (string, error) { + return Punycode.process(s, true) +} + +// ToUnicode is a wrapper for Punycode.ToUnicode. +func ToUnicode(s string) (string, error) { + return Punycode.process(s, false) +} + +// An Option configures a Profile at creation time. +type Option func(*options) + +// Transitional sets a Profile to use the Transitional mapping as defined in UTS +// #46. This will cause, for example, "ß" to be mapped to "ss". Using the +// transitional mapping provides a compromise between IDNA2003 and IDNA2008 +// compatibility. It is used by most browsers when resolving domain names. This +// option is only meaningful if combined with MapForLookup. +func Transitional(transitional bool) Option { + return func(o *options) { o.transitional = true } +} + +// VerifyDNSLength sets whether a Profile should fail if any of the IDN parts +// are longer than allowed by the RFC. +func VerifyDNSLength(verify bool) Option { + return func(o *options) { o.verifyDNSLength = verify } +} + +// RemoveLeadingDots removes leading label separators. Leading runes that map to +// dots, such as U+3002 IDEOGRAPHIC FULL STOP, are removed as well. +// +// This is the behavior suggested by the UTS #46 and is adopted by some +// browsers. +func RemoveLeadingDots(remove bool) Option { + return func(o *options) { o.removeLeadingDots = remove } +} + +// ValidateLabels sets whether to check the mandatory label validation criteria +// as defined in Section 5.4 of RFC 5891. This includes testing for correct use +// of hyphens ('-'), normalization, validity of runes, and the context rules. +func ValidateLabels(enable bool) Option { + return func(o *options) { + // Don't override existing mappings, but set one that at least checks + // normalization if it is not set. + if o.mapping == nil && enable { + o.mapping = normalize + } + o.trie = trie + o.validateLabels = enable + o.fromPuny = validateFromPunycode + } +} + +// StrictDomainName limits the set of permissible ASCII characters to those +// allowed in domain names as defined in RFC 1034 (A-Z, a-z, 0-9 and the +// hyphen). This is set by default for MapForLookup and ValidateForRegistration. +// +// This option is useful, for instance, for browsers that allow characters +// outside this range, for example a '_' (U+005F LOW LINE). See +// http://www.rfc-editor.org/std/std3.txt for more details This option +// corresponds to the UseSTD3ASCIIRules option in UTS #46. +func StrictDomainName(use bool) Option { + return func(o *options) { + o.trie = trie + o.useSTD3Rules = use + o.fromPuny = validateFromPunycode + } +} + +// NOTE: the following options pull in tables. The tables should not be linked +// in as long as the options are not used. + +// BidiRule enables the Bidi rule as defined in RFC 5893. Any application +// that relies on proper validation of labels should include this rule. +func BidiRule() Option { + return func(o *options) { o.bidirule = bidirule.ValidString } +} + +// ValidateForRegistration sets validation options to verify that a given IDN is +// properly formatted for registration as defined by Section 4 of RFC 5891. +func ValidateForRegistration() Option { + return func(o *options) { + o.mapping = validateRegistration + StrictDomainName(true)(o) + ValidateLabels(true)(o) + VerifyDNSLength(true)(o) + BidiRule()(o) + } +} + +// MapForLookup sets validation and mapping options such that a given IDN is +// transformed for domain name lookup according to the requirements set out in +// Section 5 of RFC 5891. The mappings follow the recommendations of RFC 5894, +// RFC 5895 and UTS 46. It does not add the Bidi Rule. Use the BidiRule option +// to add this check. +// +// The mappings include normalization and mapping case, width and other +// compatibility mappings. +func MapForLookup() Option { + return func(o *options) { + o.mapping = validateAndMap + StrictDomainName(true)(o) + ValidateLabels(true)(o) + } +} + +type options struct { + transitional bool + useSTD3Rules bool + validateLabels bool + verifyDNSLength bool + removeLeadingDots bool + + trie *idnaTrie + + // fromPuny calls validation rules when converting A-labels to U-labels. + fromPuny func(p *Profile, s string) error + + // mapping implements a validation and mapping step as defined in RFC 5895 + // or UTS 46, tailored to, for example, domain registration or lookup. + mapping func(p *Profile, s string) (mapped string, isBidi bool, err error) + + // bidirule, if specified, checks whether s conforms to the Bidi Rule + // defined in RFC 5893. + bidirule func(s string) bool +} + +// A Profile defines the configuration of an IDNA mapper. +type Profile struct { + options +} + +func apply(o *options, opts []Option) { + for _, f := range opts { + f(o) + } +} + +// New creates a new Profile. +// +// With no options, the returned Profile is the most permissive and equals the +// Punycode Profile. Options can be passed to further restrict the Profile. The +// MapForLookup and ValidateForRegistration options set a collection of options, +// for lookup and registration purposes respectively, which can be tailored by +// adding more fine-grained options, where later options override earlier +// options. +func New(o ...Option) *Profile { + p := &Profile{} + apply(&p.options, o) + return p +} + +// ToASCII converts a domain or domain label to its ASCII form. For example, +// ToASCII("bücher.example.com") is "xn--bcher-kva.example.com", and +// ToASCII("golang") is "golang". If an error is encountered it will return +// an error and a (partially) processed result. +func (p *Profile) ToASCII(s string) (string, error) { + return p.process(s, true) +} + +// ToUnicode converts a domain or domain label to its Unicode form. For example, +// ToUnicode("xn--bcher-kva.example.com") is "bücher.example.com", and +// ToUnicode("golang") is "golang". If an error is encountered it will return +// an error and a (partially) processed result. +func (p *Profile) ToUnicode(s string) (string, error) { + pp := *p + pp.transitional = false + return pp.process(s, false) +} + +// String reports a string with a description of the profile for debugging +// purposes. The string format may change with different versions. +func (p *Profile) String() string { + s := "" + if p.transitional { + s = "Transitional" + } else { + s = "NonTransitional" + } + if p.useSTD3Rules { + s += ":UseSTD3Rules" + } + if p.validateLabels { + s += ":ValidateLabels" + } + if p.verifyDNSLength { + s += ":VerifyDNSLength" + } + return s +} + +var ( + // Punycode is a Profile that does raw punycode processing with a minimum + // of validation. + Punycode *Profile = punycode + + // Lookup is the recommended profile for looking up domain names, according + // to Section 5 of RFC 5891. The exact configuration of this profile may + // change over time. + Lookup *Profile = lookup + + // Display is the recommended profile for displaying domain names. + // The configuration of this profile may change over time. + Display *Profile = display + + // Registration is the recommended profile for checking whether a given + // IDN is valid for registration, according to Section 4 of RFC 5891. + Registration *Profile = registration + + punycode = &Profile{} + lookup = &Profile{options{ + transitional: true, + useSTD3Rules: true, + validateLabels: true, + trie: trie, + fromPuny: validateFromPunycode, + mapping: validateAndMap, + bidirule: bidirule.ValidString, + }} + display = &Profile{options{ + useSTD3Rules: true, + validateLabels: true, + trie: trie, + fromPuny: validateFromPunycode, + mapping: validateAndMap, + bidirule: bidirule.ValidString, + }} + registration = &Profile{options{ + useSTD3Rules: true, + validateLabels: true, + verifyDNSLength: true, + trie: trie, + fromPuny: validateFromPunycode, + mapping: validateRegistration, + bidirule: bidirule.ValidString, + }} + + // TODO: profiles + // Register: recommended for approving domain names: don't do any mappings + // but rather reject on invalid input. Bundle or block deviation characters. +) + +type labelError struct{ label, code_ string } + +func (e labelError) code() string { return e.code_ } +func (e labelError) Error() string { + return fmt.Sprintf("idna: invalid label %q", e.label) +} + +type runeError rune + +func (e runeError) code() string { return "P1" } +func (e runeError) Error() string { + return fmt.Sprintf("idna: disallowed rune %U", e) +} + +// process implements the algorithm described in section 4 of UTS #46, +// see http://www.unicode.org/reports/tr46. +func (p *Profile) process(s string, toASCII bool) (string, error) { + var err error + var isBidi bool + if p.mapping != nil { + s, isBidi, err = p.mapping(p, s) + } + // Remove leading empty labels. + if p.removeLeadingDots { + for ; len(s) > 0 && s[0] == '.'; s = s[1:] { + } + } + // TODO: allow for a quick check of the tables data. + // It seems like we should only create this error on ToASCII, but the + // UTS 46 conformance tests suggests we should always check this. + if err == nil && p.verifyDNSLength && s == "" { + err = &labelError{s, "A4"} + } + labels := labelIter{orig: s} + for ; !labels.done(); labels.next() { + label := labels.label() + if label == "" { + // Empty labels are not okay. The label iterator skips the last + // label if it is empty. + if err == nil && p.verifyDNSLength { + err = &labelError{s, "A4"} + } + continue + } + if strings.HasPrefix(label, acePrefix) { + u, err2 := decode(label[len(acePrefix):]) + if err2 != nil { + if err == nil { + err = err2 + } + // Spec says keep the old label. + continue + } + isBidi = isBidi || bidirule.DirectionString(u) != bidi.LeftToRight + labels.set(u) + if err == nil && p.validateLabels { + err = p.fromPuny(p, u) + } + if err == nil { + // This should be called on NonTransitional, according to the + // spec, but that currently does not have any effect. Use the + // original profile to preserve options. + err = p.validateLabel(u) + } + } else if err == nil { + err = p.validateLabel(label) + } + } + if isBidi && p.bidirule != nil && err == nil { + for labels.reset(); !labels.done(); labels.next() { + if !p.bidirule(labels.label()) { + err = &labelError{s, "B"} + break + } + } + } + if toASCII { + for labels.reset(); !labels.done(); labels.next() { + label := labels.label() + if !ascii(label) { + a, err2 := encode(acePrefix, label) + if err == nil { + err = err2 + } + label = a + labels.set(a) + } + n := len(label) + if p.verifyDNSLength && err == nil && (n == 0 || n > 63) { + err = &labelError{label, "A4"} + } + } + } + s = labels.result() + if toASCII && p.verifyDNSLength && err == nil { + // Compute the length of the domain name minus the root label and its dot. + n := len(s) + if n > 0 && s[n-1] == '.' { + n-- + } + if len(s) < 1 || n > 253 { + err = &labelError{s, "A4"} + } + } + return s, err +} + +func normalize(p *Profile, s string) (mapped string, isBidi bool, err error) { + // TODO: consider first doing a quick check to see if any of these checks + // need to be done. This will make it slower in the general case, but + // faster in the common case. + mapped = norm.NFC.String(s) + isBidi = bidirule.DirectionString(mapped) == bidi.RightToLeft + return mapped, isBidi, nil +} + +func validateRegistration(p *Profile, s string) (idem string, bidi bool, err error) { + // TODO: filter need for normalization in loop below. + if !norm.NFC.IsNormalString(s) { + return s, false, &labelError{s, "V1"} + } + for i := 0; i < len(s); { + v, sz := trie.lookupString(s[i:]) + if sz == 0 { + return s, bidi, runeError(utf8.RuneError) + } + bidi = bidi || info(v).isBidi(s[i:]) + // Copy bytes not copied so far. + switch p.simplify(info(v).category()) { + // TODO: handle the NV8 defined in the Unicode idna data set to allow + // for strict conformance to IDNA2008. + case valid, deviation: + case disallowed, mapped, unknown, ignored: + r, _ := utf8.DecodeRuneInString(s[i:]) + return s, bidi, runeError(r) + } + i += sz + } + return s, bidi, nil +} + +func (c info) isBidi(s string) bool { + if !c.isMapped() { + return c&attributesMask == rtl + } + // TODO: also store bidi info for mapped data. This is possible, but a bit + // cumbersome and not for the common case. + p, _ := bidi.LookupString(s) + switch p.Class() { + case bidi.R, bidi.AL, bidi.AN: + return true + } + return false +} + +func validateAndMap(p *Profile, s string) (vm string, bidi bool, err error) { + var ( + b []byte + k int + ) + // combinedInfoBits contains the or-ed bits of all runes. We use this + // to derive the mayNeedNorm bit later. This may trigger normalization + // overeagerly, but it will not do so in the common case. The end result + // is another 10% saving on BenchmarkProfile for the common case. + var combinedInfoBits info + for i := 0; i < len(s); { + v, sz := trie.lookupString(s[i:]) + if sz == 0 { + b = append(b, s[k:i]...) + b = append(b, "\ufffd"...) + k = len(s) + if err == nil { + err = runeError(utf8.RuneError) + } + break + } + combinedInfoBits |= info(v) + bidi = bidi || info(v).isBidi(s[i:]) + start := i + i += sz + // Copy bytes not copied so far. + switch p.simplify(info(v).category()) { + case valid: + continue + case disallowed: + if err == nil { + r, _ := utf8.DecodeRuneInString(s[start:]) + err = runeError(r) + } + continue + case mapped, deviation: + b = append(b, s[k:start]...) + b = info(v).appendMapping(b, s[start:i]) + case ignored: + b = append(b, s[k:start]...) + // drop the rune + case unknown: + b = append(b, s[k:start]...) + b = append(b, "\ufffd"...) + } + k = i + } + if k == 0 { + // No changes so far. + if combinedInfoBits&mayNeedNorm != 0 { + s = norm.NFC.String(s) + } + } else { + b = append(b, s[k:]...) + if norm.NFC.QuickSpan(b) != len(b) { + b = norm.NFC.Bytes(b) + } + // TODO: the punycode converters require strings as input. + s = string(b) + } + return s, bidi, err +} + +// A labelIter allows iterating over domain name labels. +type labelIter struct { + orig string + slice []string + curStart int + curEnd int + i int +} + +func (l *labelIter) reset() { + l.curStart = 0 + l.curEnd = 0 + l.i = 0 +} + +func (l *labelIter) done() bool { + return l.curStart >= len(l.orig) +} + +func (l *labelIter) result() string { + if l.slice != nil { + return strings.Join(l.slice, ".") + } + return l.orig +} + +func (l *labelIter) label() string { + if l.slice != nil { + return l.slice[l.i] + } + p := strings.IndexByte(l.orig[l.curStart:], '.') + l.curEnd = l.curStart + p + if p == -1 { + l.curEnd = len(l.orig) + } + return l.orig[l.curStart:l.curEnd] +} + +// next sets the value to the next label. It skips the last label if it is empty. +func (l *labelIter) next() { + l.i++ + if l.slice != nil { + if l.i >= len(l.slice) || l.i == len(l.slice)-1 && l.slice[l.i] == "" { + l.curStart = len(l.orig) + } + } else { + l.curStart = l.curEnd + 1 + if l.curStart == len(l.orig)-1 && l.orig[l.curStart] == '.' { + l.curStart = len(l.orig) + } + } +} + +func (l *labelIter) set(s string) { + if l.slice == nil { + l.slice = strings.Split(l.orig, ".") + } + l.slice[l.i] = s +} + +// acePrefix is the ASCII Compatible Encoding prefix. +const acePrefix = "xn--" + +func (p *Profile) simplify(cat category) category { + switch cat { + case disallowedSTD3Mapped: + if p.useSTD3Rules { + cat = disallowed + } else { + cat = mapped + } + case disallowedSTD3Valid: + if p.useSTD3Rules { + cat = disallowed + } else { + cat = valid + } + case deviation: + if !p.transitional { + cat = valid + } + case validNV8, validXV8: + // TODO: handle V2008 + cat = valid + } + return cat +} + +func validateFromPunycode(p *Profile, s string) error { + if !norm.NFC.IsNormalString(s) { + return &labelError{s, "V1"} + } + // TODO: detect whether string may have to be normalized in the following + // loop. + for i := 0; i < len(s); { + v, sz := trie.lookupString(s[i:]) + if sz == 0 { + return runeError(utf8.RuneError) + } + if c := p.simplify(info(v).category()); c != valid && c != deviation { + return &labelError{s, "V6"} + } + i += sz + } + return nil +} + +const ( + zwnj = "\u200c" + zwj = "\u200d" +) + +type joinState int8 + +const ( + stateStart joinState = iota + stateVirama + stateBefore + stateBeforeVirama + stateAfter + stateFAIL +) + +var joinStates = [][numJoinTypes]joinState{ + stateStart: { + joiningL: stateBefore, + joiningD: stateBefore, + joinZWNJ: stateFAIL, + joinZWJ: stateFAIL, + joinVirama: stateVirama, + }, + stateVirama: { + joiningL: stateBefore, + joiningD: stateBefore, + }, + stateBefore: { + joiningL: stateBefore, + joiningD: stateBefore, + joiningT: stateBefore, + joinZWNJ: stateAfter, + joinZWJ: stateFAIL, + joinVirama: stateBeforeVirama, + }, + stateBeforeVirama: { + joiningL: stateBefore, + joiningD: stateBefore, + joiningT: stateBefore, + }, + stateAfter: { + joiningL: stateFAIL, + joiningD: stateBefore, + joiningT: stateAfter, + joiningR: stateStart, + joinZWNJ: stateFAIL, + joinZWJ: stateFAIL, + joinVirama: stateAfter, // no-op as we can't accept joiners here + }, + stateFAIL: { + 0: stateFAIL, + joiningL: stateFAIL, + joiningD: stateFAIL, + joiningT: stateFAIL, + joiningR: stateFAIL, + joinZWNJ: stateFAIL, + joinZWJ: stateFAIL, + joinVirama: stateFAIL, + }, +} + +// validateLabel validates the criteria from Section 4.1. Item 1, 4, and 6 are +// already implicitly satisfied by the overall implementation. +func (p *Profile) validateLabel(s string) (err error) { + if s == "" { + if p.verifyDNSLength { + return &labelError{s, "A4"} + } + return nil + } + if !p.validateLabels { + return nil + } + trie := p.trie // p.validateLabels is only set if trie is set. + if len(s) > 4 && s[2] == '-' && s[3] == '-' { + return &labelError{s, "V2"} + } + if s[0] == '-' || s[len(s)-1] == '-' { + return &labelError{s, "V3"} + } + // TODO: merge the use of this in the trie. + v, sz := trie.lookupString(s) + x := info(v) + if x.isModifier() { + return &labelError{s, "V5"} + } + // Quickly return in the absence of zero-width (non) joiners. + if strings.Index(s, zwj) == -1 && strings.Index(s, zwnj) == -1 { + return nil + } + st := stateStart + for i := 0; ; { + jt := x.joinType() + if s[i:i+sz] == zwj { + jt = joinZWJ + } else if s[i:i+sz] == zwnj { + jt = joinZWNJ + } + st = joinStates[st][jt] + if x.isViramaModifier() { + st = joinStates[st][joinVirama] + } + if i += sz; i == len(s) { + break + } + v, sz = trie.lookupString(s[i:]) + x = info(v) + } + if st == stateFAIL || st == stateAfter { + return &labelError{s, "C"} + } + return nil +} + +func ascii(s string) bool { + for i := 0; i < len(s); i++ { + if s[i] >= utf8.RuneSelf { + return false + } + } + return true +} diff --git a/api/vendor/golang.org/x/net/idna/idna_test.go b/api/vendor/golang.org/x/net/idna/idna_test.go new file mode 100644 index 0000000..0b067ca --- /dev/null +++ b/api/vendor/golang.org/x/net/idna/idna_test.go @@ -0,0 +1,108 @@ +// 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 idna + +import ( + "testing" +) + +var idnaTestCases = [...]struct { + ascii, unicode string +}{ + // Labels. + {"books", "books"}, + {"xn--bcher-kva", "bücher"}, + + // Domains. + {"foo--xn--bar.org", "foo--xn--bar.org"}, + {"golang.org", "golang.org"}, + {"example.xn--p1ai", "example.рф"}, + {"xn--czrw28b.tw", "商業.tw"}, + {"www.xn--mller-kva.de", "www.müller.de"}, +} + +func TestIDNA(t *testing.T) { + for _, tc := range idnaTestCases { + if a, err := ToASCII(tc.unicode); err != nil { + t.Errorf("ToASCII(%q): %v", tc.unicode, err) + } else if a != tc.ascii { + t.Errorf("ToASCII(%q): got %q, want %q", tc.unicode, a, tc.ascii) + } + + if u, err := ToUnicode(tc.ascii); err != nil { + t.Errorf("ToUnicode(%q): %v", tc.ascii, err) + } else if u != tc.unicode { + t.Errorf("ToUnicode(%q): got %q, want %q", tc.ascii, u, tc.unicode) + } + } +} + +func TestIDNASeparators(t *testing.T) { + type subCase struct { + unicode string + wantASCII string + wantErr bool + } + + testCases := []struct { + name string + profile *Profile + subCases []subCase + }{ + { + name: "Punycode", profile: Punycode, + subCases: []subCase{ + {"example\u3002jp", "xn--examplejp-ck3h", false}, + {"東京\uFF0Ejp", "xn--jp-l92cn98g071o", false}, + {"大阪\uFF61jp", "xn--jp-ku9cz72u463f", false}, + }, + }, + { + name: "Lookup", profile: Lookup, + subCases: []subCase{ + {"example\u3002jp", "example.jp", false}, + {"東京\uFF0Ejp", "xn--1lqs71d.jp", false}, + {"大阪\uFF61jp", "xn--pssu33l.jp", false}, + }, + }, + { + name: "Display", profile: Display, + subCases: []subCase{ + {"example\u3002jp", "example.jp", false}, + {"東京\uFF0Ejp", "xn--1lqs71d.jp", false}, + {"大阪\uFF61jp", "xn--pssu33l.jp", false}, + }, + }, + { + name: "Registration", profile: Registration, + subCases: []subCase{ + {"example\u3002jp", "", true}, + {"東京\uFF0Ejp", "", true}, + {"大阪\uFF61jp", "", true}, + }, + }, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + for _, c := range tc.subCases { + gotA, err := tc.profile.ToASCII(c.unicode) + if c.wantErr { + if err == nil { + t.Errorf("ToASCII(%q): got no error, but an error expected", c.unicode) + } + } else { + if err != nil { + t.Errorf("ToASCII(%q): got err=%v, but no error expected", c.unicode, err) + } else if gotA != c.wantASCII { + t.Errorf("ToASCII(%q): got %q, want %q", c.unicode, gotA, c.wantASCII) + } + } + } + }) + } +} + +// TODO(nigeltao): test errors, once we've specified when ToASCII and ToUnicode +// return errors. diff --git a/api/vendor/golang.org/x/net/idna/punycode.go b/api/vendor/golang.org/x/net/idna/punycode.go new file mode 100644 index 0000000..02c7d59 --- /dev/null +++ b/api/vendor/golang.org/x/net/idna/punycode.go @@ -0,0 +1,203 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +// 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 idna + +// This file implements the Punycode algorithm from RFC 3492. + +import ( + "math" + "strings" + "unicode/utf8" +) + +// These parameter values are specified in section 5. +// +// All computation is done with int32s, so that overflow behavior is identical +// regardless of whether int is 32-bit or 64-bit. +const ( + base int32 = 36 + damp int32 = 700 + initialBias int32 = 72 + initialN int32 = 128 + skew int32 = 38 + tmax int32 = 26 + tmin int32 = 1 +) + +func punyError(s string) error { return &labelError{s, "A3"} } + +// decode decodes a string as specified in section 6.2. +func decode(encoded string) (string, error) { + if encoded == "" { + return "", nil + } + pos := 1 + strings.LastIndex(encoded, "-") + if pos == 1 { + return "", punyError(encoded) + } + if pos == len(encoded) { + return encoded[:len(encoded)-1], nil + } + output := make([]rune, 0, len(encoded)) + if pos != 0 { + for _, r := range encoded[:pos-1] { + output = append(output, r) + } + } + i, n, bias := int32(0), initialN, initialBias + for pos < len(encoded) { + oldI, w := i, int32(1) + for k := base; ; k += base { + if pos == len(encoded) { + return "", punyError(encoded) + } + digit, ok := decodeDigit(encoded[pos]) + if !ok { + return "", punyError(encoded) + } + pos++ + i += digit * w + if i < 0 { + return "", punyError(encoded) + } + t := k - bias + if t < tmin { + t = tmin + } else if t > tmax { + t = tmax + } + if digit < t { + break + } + w *= base - t + if w >= math.MaxInt32/base { + return "", punyError(encoded) + } + } + x := int32(len(output) + 1) + bias = adapt(i-oldI, x, oldI == 0) + n += i / x + i %= x + if n > utf8.MaxRune || len(output) >= 1024 { + return "", punyError(encoded) + } + output = append(output, 0) + copy(output[i+1:], output[i:]) + output[i] = n + i++ + } + return string(output), nil +} + +// encode encodes a string as specified in section 6.3 and prepends prefix to +// the result. +// +// The "while h < length(input)" line in the specification becomes "for +// remaining != 0" in the Go code, because len(s) in Go is in bytes, not runes. +func encode(prefix, s string) (string, error) { + output := make([]byte, len(prefix), len(prefix)+1+2*len(s)) + copy(output, prefix) + delta, n, bias := int32(0), initialN, initialBias + b, remaining := int32(0), int32(0) + for _, r := range s { + if r < 0x80 { + b++ + output = append(output, byte(r)) + } else { + remaining++ + } + } + h := b + if b > 0 { + output = append(output, '-') + } + for remaining != 0 { + m := int32(0x7fffffff) + for _, r := range s { + if m > r && r >= n { + m = r + } + } + delta += (m - n) * (h + 1) + if delta < 0 { + return "", punyError(s) + } + n = m + for _, r := range s { + if r < n { + delta++ + if delta < 0 { + return "", punyError(s) + } + continue + } + if r > n { + continue + } + q := delta + for k := base; ; k += base { + t := k - bias + if t < tmin { + t = tmin + } else if t > tmax { + t = tmax + } + if q < t { + break + } + output = append(output, encodeDigit(t+(q-t)%(base-t))) + q = (q - t) / (base - t) + } + output = append(output, encodeDigit(q)) + bias = adapt(delta, h+1, h == b) + delta = 0 + h++ + remaining-- + } + delta++ + n++ + } + return string(output), nil +} + +func decodeDigit(x byte) (digit int32, ok bool) { + switch { + case '0' <= x && x <= '9': + return int32(x - ('0' - 26)), true + case 'A' <= x && x <= 'Z': + return int32(x - 'A'), true + case 'a' <= x && x <= 'z': + return int32(x - 'a'), true + } + return 0, false +} + +func encodeDigit(digit int32) byte { + switch { + case 0 <= digit && digit < 26: + return byte(digit + 'a') + case 26 <= digit && digit < 36: + return byte(digit + ('0' - 26)) + } + panic("idna: internal error in punycode encoding") +} + +// adapt is the bias adaptation function specified in section 6.1. +func adapt(delta, numPoints int32, firstTime bool) int32 { + if firstTime { + delta /= damp + } else { + delta /= 2 + } + delta += delta / numPoints + k := int32(0) + for delta > ((base-tmin)*tmax)/2 { + delta /= base - tmin + k += base + } + return k + (base-tmin+1)*delta/(delta+skew) +} diff --git a/api/vendor/golang.org/x/net/idna/punycode_test.go b/api/vendor/golang.org/x/net/idna/punycode_test.go new file mode 100644 index 0000000..bfec81d --- /dev/null +++ b/api/vendor/golang.org/x/net/idna/punycode_test.go @@ -0,0 +1,198 @@ +// 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 idna + +import ( + "strings" + "testing" +) + +var punycodeTestCases = [...]struct { + s, encoded string +}{ + {"", ""}, + {"-", "--"}, + {"-a", "-a-"}, + {"-a-", "-a--"}, + {"a", "a-"}, + {"a-", "a--"}, + {"a-b", "a-b-"}, + {"books", "books-"}, + {"bücher", "bcher-kva"}, + {"Hello世界", "Hello-ck1hg65u"}, + {"ü", "tda"}, + {"üý", "tdac"}, + + // The test cases below come from RFC 3492 section 7.1 with Errata 3026. + { + // (A) Arabic (Egyptian). + "\u0644\u064A\u0647\u0645\u0627\u0628\u062A\u0643\u0644" + + "\u0645\u0648\u0634\u0639\u0631\u0628\u064A\u061F", + "egbpdaj6bu4bxfgehfvwxn", + }, + { + // (B) Chinese (simplified). + "\u4ED6\u4EEC\u4E3A\u4EC0\u4E48\u4E0D\u8BF4\u4E2D\u6587", + "ihqwcrb4cv8a8dqg056pqjye", + }, + { + // (C) Chinese (traditional). + "\u4ED6\u5011\u7232\u4EC0\u9EBD\u4E0D\u8AAA\u4E2D\u6587", + "ihqwctvzc91f659drss3x8bo0yb", + }, + { + // (D) Czech. + "\u0050\u0072\u006F\u010D\u0070\u0072\u006F\u0073\u0074" + + "\u011B\u006E\u0065\u006D\u006C\u0075\u0076\u00ED\u010D" + + "\u0065\u0073\u006B\u0079", + "Proprostnemluvesky-uyb24dma41a", + }, + { + // (E) Hebrew. + "\u05DC\u05DE\u05D4\u05D4\u05DD\u05E4\u05E9\u05D5\u05D8" + + "\u05DC\u05D0\u05DE\u05D3\u05D1\u05E8\u05D9\u05DD\u05E2" + + "\u05D1\u05E8\u05D9\u05EA", + "4dbcagdahymbxekheh6e0a7fei0b", + }, + { + // (F) Hindi (Devanagari). + "\u092F\u0939\u0932\u094B\u0917\u0939\u093F\u0928\u094D" + + "\u0926\u0940\u0915\u094D\u092F\u094B\u0902\u0928\u0939" + + "\u0940\u0902\u092C\u094B\u0932\u0938\u0915\u0924\u0947" + + "\u0939\u0948\u0902", + "i1baa7eci9glrd9b2ae1bj0hfcgg6iyaf8o0a1dig0cd", + }, + { + // (G) Japanese (kanji and hiragana). + "\u306A\u305C\u307F\u3093\u306A\u65E5\u672C\u8A9E\u3092" + + "\u8A71\u3057\u3066\u304F\u308C\u306A\u3044\u306E\u304B", + "n8jok5ay5dzabd5bym9f0cm5685rrjetr6pdxa", + }, + { + // (H) Korean (Hangul syllables). + "\uC138\uACC4\uC758\uBAA8\uB4E0\uC0AC\uB78C\uB4E4\uC774" + + "\uD55C\uAD6D\uC5B4\uB97C\uC774\uD574\uD55C\uB2E4\uBA74" + + "\uC5BC\uB9C8\uB098\uC88B\uC744\uAE4C", + "989aomsvi5e83db1d2a355cv1e0vak1dwrv93d5xbh15a0dt30a5j" + + "psd879ccm6fea98c", + }, + { + // (I) Russian (Cyrillic). + "\u043F\u043E\u0447\u0435\u043C\u0443\u0436\u0435\u043E" + + "\u043D\u0438\u043D\u0435\u0433\u043E\u0432\u043E\u0440" + + "\u044F\u0442\u043F\u043E\u0440\u0443\u0441\u0441\u043A" + + "\u0438", + "b1abfaaepdrnnbgefbadotcwatmq2g4l", + }, + { + // (J) Spanish. + "\u0050\u006F\u0072\u0071\u0075\u00E9\u006E\u006F\u0070" + + "\u0075\u0065\u0064\u0065\u006E\u0073\u0069\u006D\u0070" + + "\u006C\u0065\u006D\u0065\u006E\u0074\u0065\u0068\u0061" + + "\u0062\u006C\u0061\u0072\u0065\u006E\u0045\u0073\u0070" + + "\u0061\u00F1\u006F\u006C", + "PorqunopuedensimplementehablarenEspaol-fmd56a", + }, + { + // (K) Vietnamese. + "\u0054\u1EA1\u0069\u0073\u0061\u006F\u0068\u1ECD\u006B" + + "\u0068\u00F4\u006E\u0067\u0074\u0068\u1EC3\u0063\u0068" + + "\u1EC9\u006E\u00F3\u0069\u0074\u0069\u1EBF\u006E\u0067" + + "\u0056\u0069\u1EC7\u0074", + "TisaohkhngthchnitingVit-kjcr8268qyxafd2f1b9g", + }, + { + // (L) 3B. + "\u0033\u5E74\u0042\u7D44\u91D1\u516B\u5148\u751F", + "3B-ww4c5e180e575a65lsy2b", + }, + { + // (M) -with-SUPER-MONKEYS. + "\u5B89\u5BA4\u5948\u7F8E\u6075\u002D\u0077\u0069\u0074" + + "\u0068\u002D\u0053\u0055\u0050\u0045\u0052\u002D\u004D" + + "\u004F\u004E\u004B\u0045\u0059\u0053", + "-with-SUPER-MONKEYS-pc58ag80a8qai00g7n9n", + }, + { + // (N) Hello-Another-Way-. + "\u0048\u0065\u006C\u006C\u006F\u002D\u0041\u006E\u006F" + + "\u0074\u0068\u0065\u0072\u002D\u0057\u0061\u0079\u002D" + + "\u305D\u308C\u305E\u308C\u306E\u5834\u6240", + "Hello-Another-Way--fc4qua05auwb3674vfr0b", + }, + { + // (O) 2. + "\u3072\u3068\u3064\u5C4B\u6839\u306E\u4E0B\u0032", + "2-u9tlzr9756bt3uc0v", + }, + { + // (P) MajiKoi5 + "\u004D\u0061\u006A\u0069\u3067\u004B\u006F\u0069\u3059" + + "\u308B\u0035\u79D2\u524D", + "MajiKoi5-783gue6qz075azm5e", + }, + { + // (Q) de + "\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0", + "de-jg4avhby1noc0d", + }, + { + // (R) + "\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067", + "d9juau41awczczp", + }, + { + // (S) -> $1.00 <- + "\u002D\u003E\u0020\u0024\u0031\u002E\u0030\u0030\u0020" + + "\u003C\u002D", + "-> $1.00 <--", + }, +} + +func TestPunycode(t *testing.T) { + for _, tc := range punycodeTestCases { + if got, err := decode(tc.encoded); err != nil { + t.Errorf("decode(%q): %v", tc.encoded, err) + } else if got != tc.s { + t.Errorf("decode(%q): got %q, want %q", tc.encoded, got, tc.s) + } + + if got, err := encode("", tc.s); err != nil { + t.Errorf(`encode("", %q): %v`, tc.s, err) + } else if got != tc.encoded { + t.Errorf(`encode("", %q): got %q, want %q`, tc.s, got, tc.encoded) + } + } +} + +var punycodeErrorTestCases = [...]string{ + "decode -", // A sole '-' is invalid. + "decode foo\x00bar", // '\x00' is not in [0-9A-Za-z]. + "decode foo#bar", // '#' is not in [0-9A-Za-z]. + "decode foo\u00A3bar", // '\u00A3' is not in [0-9A-Za-z]. + "decode 9", // "9a" decodes to codepoint \u00A3; "9" is truncated. + "decode 99999a", // "99999a" decodes to codepoint \U0048A3C1, which is > \U0010FFFF. + "decode 9999999999a", // "9999999999a" overflows the int32 calculation. + + "encode " + strings.Repeat("x", 65536) + "\uff00", // int32 overflow. +} + +func TestPunycodeErrors(t *testing.T) { + for _, tc := range punycodeErrorTestCases { + var err error + switch { + case strings.HasPrefix(tc, "decode "): + _, err = decode(tc[7:]) + case strings.HasPrefix(tc, "encode "): + _, err = encode("", tc[7:]) + } + if err == nil { + if len(tc) > 256 { + tc = tc[:100] + "..." + tc[len(tc)-100:] + } + t.Errorf("no error for %s", tc) + } + } +} diff --git a/api/vendor/golang.org/x/net/idna/tables.go b/api/vendor/golang.org/x/net/idna/tables.go new file mode 100644 index 0000000..f910b26 --- /dev/null +++ b/api/vendor/golang.org/x/net/idna/tables.go @@ -0,0 +1,4557 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +package idna + +// UnicodeVersion is the Unicode version from which the tables in this package are derived. +const UnicodeVersion = "10.0.0" + +var mappings string = "" + // Size: 8176 bytes + "\x00\x01 \x03 ̈\x01a\x03 ̄\x012\x013\x03 ́\x03 ̧\x011\x01o\x051⁄4\x051⁄2" + + "\x053⁄4\x03i̇\x03l·\x03ʼn\x01s\x03dž\x03ⱥ\x03ⱦ\x01h\x01j\x01r\x01w\x01y" + + "\x03 ̆\x03 ̇\x03 ̊\x03 ̨\x03 ̃\x03 ̋\x01l\x01x\x04̈́\x03 ι\x01;\x05 ̈́" + + "\x04եւ\x04اٴ\x04وٴ\x04ۇٴ\x04يٴ\x06क़\x06ख़\x06ग़\x06ज़\x06ड़\x06ढ़\x06फ़" + + "\x06य़\x06ড়\x06ঢ়\x06য়\x06ਲ਼\x06ਸ਼\x06ਖ਼\x06ਗ਼\x06ਜ਼\x06ਫ਼\x06ଡ଼\x06ଢ଼" + + "\x06ํา\x06ໍາ\x06ຫນ\x06ຫມ\x06གྷ\x06ཌྷ\x06དྷ\x06བྷ\x06ཛྷ\x06ཀྵ\x06ཱི\x06ཱུ" + + "\x06ྲྀ\x09ྲཱྀ\x06ླྀ\x09ླཱྀ\x06ཱྀ\x06ྒྷ\x06ྜྷ\x06ྡྷ\x06ྦྷ\x06ྫྷ\x06ྐྵ\x02" + + "в\x02д\x02о\x02с\x02т\x02ъ\x02ѣ\x02æ\x01b\x01d\x01e\x02ǝ\x01g\x01i\x01k" + + "\x01m\x01n\x02ȣ\x01p\x01t\x01u\x02ɐ\x02ɑ\x02ə\x02ɛ\x02ɜ\x02ŋ\x02ɔ\x02ɯ" + + "\x01v\x02β\x02γ\x02δ\x02φ\x02χ\x02ρ\x02н\x02ɒ\x01c\x02ɕ\x02ð\x01f\x02ɟ" + + "\x02ɡ\x02ɥ\x02ɨ\x02ɩ\x02ɪ\x02ʝ\x02ɭ\x02ʟ\x02ɱ\x02ɰ\x02ɲ\x02ɳ\x02ɴ\x02ɵ" + + "\x02ɸ\x02ʂ\x02ʃ\x02ƫ\x02ʉ\x02ʊ\x02ʋ\x02ʌ\x01z\x02ʐ\x02ʑ\x02ʒ\x02θ\x02ss" + + "\x02ά\x02έ\x02ή\x02ί\x02ό\x02ύ\x02ώ\x05ἀι\x05ἁι\x05ἂι\x05ἃι\x05ἄι\x05ἅι" + + "\x05ἆι\x05ἇι\x05ἠι\x05ἡι\x05ἢι\x05ἣι\x05ἤι\x05ἥι\x05ἦι\x05ἧι\x05ὠι\x05ὡι" + + "\x05ὢι\x05ὣι\x05ὤι\x05ὥι\x05ὦι\x05ὧι\x05ὰι\x04αι\x04άι\x05ᾶι\x02ι\x05 ̈͂" + + "\x05ὴι\x04ηι\x04ήι\x05ῆι\x05 ̓̀\x05 ̓́\x05 ̓͂\x02ΐ\x05 ̔̀\x05 ̔́\x05 ̔͂" + + "\x02ΰ\x05 ̈̀\x01`\x05ὼι\x04ωι\x04ώι\x05ῶι\x06′′\x09′′′\x06‵‵\x09‵‵‵\x02!" + + "!\x02??\x02?!\x02!?\x0c′′′′\x010\x014\x015\x016\x017\x018\x019\x01+\x01=" + + "\x01(\x01)\x02rs\x02ħ\x02no\x01q\x02sm\x02tm\x02ω\x02å\x02א\x02ב\x02ג" + + "\x02ד\x02π\x051⁄7\x051⁄9\x061⁄10\x051⁄3\x052⁄3\x051⁄5\x052⁄5\x053⁄5\x054" + + "⁄5\x051⁄6\x055⁄6\x051⁄8\x053⁄8\x055⁄8\x057⁄8\x041⁄\x02ii\x02iv\x02vi" + + "\x04viii\x02ix\x02xi\x050⁄3\x06∫∫\x09∫∫∫\x06∮∮\x09∮∮∮\x0210\x0211\x0212" + + "\x0213\x0214\x0215\x0216\x0217\x0218\x0219\x0220\x04(10)\x04(11)\x04(12)" + + "\x04(13)\x04(14)\x04(15)\x04(16)\x04(17)\x04(18)\x04(19)\x04(20)\x0c∫∫∫∫" + + "\x02==\x05⫝̸\x02ɫ\x02ɽ\x02ȿ\x02ɀ\x01.\x04 ゙\x04 ゚\x06より\x06コト\x05(ᄀ)\x05" + + "(ᄂ)\x05(ᄃ)\x05(ᄅ)\x05(ᄆ)\x05(ᄇ)\x05(ᄉ)\x05(ᄋ)\x05(ᄌ)\x05(ᄎ)\x05(ᄏ)\x05(ᄐ" + + ")\x05(ᄑ)\x05(ᄒ)\x05(가)\x05(나)\x05(다)\x05(라)\x05(마)\x05(바)\x05(사)\x05(아)" + + "\x05(자)\x05(차)\x05(카)\x05(타)\x05(파)\x05(하)\x05(주)\x08(오전)\x08(오후)\x05(一)" + + "\x05(二)\x05(三)\x05(四)\x05(五)\x05(六)\x05(七)\x05(八)\x05(九)\x05(十)\x05(月)" + + "\x05(火)\x05(水)\x05(木)\x05(金)\x05(土)\x05(日)\x05(株)\x05(有)\x05(社)\x05(名)" + + "\x05(特)\x05(財)\x05(祝)\x05(労)\x05(代)\x05(呼)\x05(学)\x05(監)\x05(企)\x05(資)" + + "\x05(協)\x05(祭)\x05(休)\x05(自)\x05(至)\x0221\x0222\x0223\x0224\x0225\x0226" + + "\x0227\x0228\x0229\x0230\x0231\x0232\x0233\x0234\x0235\x06참고\x06주의\x0236" + + "\x0237\x0238\x0239\x0240\x0241\x0242\x0243\x0244\x0245\x0246\x0247\x0248" + + "\x0249\x0250\x041月\x042月\x043月\x044月\x045月\x046月\x047月\x048月\x049月\x0510" + + "月\x0511月\x0512月\x02hg\x02ev\x0cアパート\x0cアルファ\x0cアンペア\x09アール\x0cイニング\x09" + + "インチ\x09ウォン\x0fエスクード\x0cエーカー\x09オンス\x09オーム\x09カイリ\x0cカラット\x0cカロリー\x09ガロ" + + "ン\x09ガンマ\x06ギガ\x09ギニー\x0cキュリー\x0cギルダー\x06キロ\x0fキログラム\x12キロメートル\x0fキロワッ" + + "ト\x09グラム\x0fグラムトン\x0fクルゼイロ\x0cクローネ\x09ケース\x09コルナ\x09コーポ\x0cサイクル\x0fサンチ" + + "ーム\x0cシリング\x09センチ\x09セント\x09ダース\x06デシ\x06ドル\x06トン\x06ナノ\x09ノット\x09ハイツ" + + "\x0fパーセント\x09パーツ\x0cバーレル\x0fピアストル\x09ピクル\x06ピコ\x06ビル\x0fファラッド\x0cフィート" + + "\x0fブッシェル\x09フラン\x0fヘクタール\x06ペソ\x09ペニヒ\x09ヘルツ\x09ペンス\x09ページ\x09ベータ\x0cポイ" + + "ント\x09ボルト\x06ホン\x09ポンド\x09ホール\x09ホーン\x0cマイクロ\x09マイル\x09マッハ\x09マルク\x0fマ" + + "ンション\x0cミクロン\x06ミリ\x0fミリバール\x06メガ\x0cメガトン\x0cメートル\x09ヤード\x09ヤール\x09ユアン" + + "\x0cリットル\x06リラ\x09ルピー\x0cルーブル\x06レム\x0fレントゲン\x09ワット\x040点\x041点\x042点" + + "\x043点\x044点\x045点\x046点\x047点\x048点\x049点\x0510点\x0511点\x0512点\x0513点" + + "\x0514点\x0515点\x0516点\x0517点\x0518点\x0519点\x0520点\x0521点\x0522点\x0523点" + + "\x0524点\x02da\x02au\x02ov\x02pc\x02dm\x02iu\x06平成\x06昭和\x06大正\x06明治\x0c株" + + "式会社\x02pa\x02na\x02ma\x02ka\x02kb\x02mb\x02gb\x04kcal\x02pf\x02nf\x02m" + + "g\x02kg\x02hz\x02ml\x02dl\x02kl\x02fm\x02nm\x02mm\x02cm\x02km\x02m2\x02m" + + "3\x05m∕s\x06m∕s2\x07rad∕s\x08rad∕s2\x02ps\x02ns\x02ms\x02pv\x02nv\x02mv" + + "\x02kv\x02pw\x02nw\x02mw\x02kw\x02bq\x02cc\x02cd\x06c∕kg\x02db\x02gy\x02" + + "ha\x02hp\x02in\x02kk\x02kt\x02lm\x02ln\x02lx\x02ph\x02pr\x02sr\x02sv\x02" + + "wb\x05v∕m\x05a∕m\x041日\x042日\x043日\x044日\x045日\x046日\x047日\x048日\x049日" + + "\x0510日\x0511日\x0512日\x0513日\x0514日\x0515日\x0516日\x0517日\x0518日\x0519日" + + "\x0520日\x0521日\x0522日\x0523日\x0524日\x0525日\x0526日\x0527日\x0528日\x0529日" + + "\x0530日\x0531日\x02ь\x02ɦ\x02ɬ\x02ʞ\x02ʇ\x02œ\x04𤋮\x04𢡊\x04𢡄\x04𣏕\x04𥉉" + + "\x04𥳐\x04𧻓\x02ff\x02fi\x02fl\x02st\x04մն\x04մե\x04մի\x04վն\x04մխ\x04יִ" + + "\x04ײַ\x02ע\x02ה\x02כ\x02ל\x02ם\x02ר\x02ת\x04שׁ\x04שׂ\x06שּׁ\x06שּׂ\x04א" + + "ַ\x04אָ\x04אּ\x04בּ\x04גּ\x04דּ\x04הּ\x04וּ\x04זּ\x04טּ\x04יּ\x04ךּ\x04" + + "כּ\x04לּ\x04מּ\x04נּ\x04סּ\x04ףּ\x04פּ\x04צּ\x04קּ\x04רּ\x04שּ\x04תּ" + + "\x04וֹ\x04בֿ\x04כֿ\x04פֿ\x04אל\x02ٱ\x02ٻ\x02پ\x02ڀ\x02ٺ\x02ٿ\x02ٹ\x02ڤ" + + "\x02ڦ\x02ڄ\x02ڃ\x02چ\x02ڇ\x02ڍ\x02ڌ\x02ڎ\x02ڈ\x02ژ\x02ڑ\x02ک\x02گ\x02ڳ" + + "\x02ڱ\x02ں\x02ڻ\x02ۀ\x02ہ\x02ھ\x02ے\x02ۓ\x02ڭ\x02ۇ\x02ۆ\x02ۈ\x02ۋ\x02ۅ" + + "\x02ۉ\x02ې\x02ى\x04ئا\x04ئە\x04ئو\x04ئۇ\x04ئۆ\x04ئۈ\x04ئې\x04ئى\x02ی\x04" + + "ئج\x04ئح\x04ئم\x04ئي\x04بج\x04بح\x04بخ\x04بم\x04بى\x04بي\x04تج\x04تح" + + "\x04تخ\x04تم\x04تى\x04تي\x04ثج\x04ثم\x04ثى\x04ثي\x04جح\x04جم\x04حج\x04حم" + + "\x04خج\x04خح\x04خم\x04سج\x04سح\x04سخ\x04سم\x04صح\x04صم\x04ضج\x04ضح\x04ضخ" + + "\x04ضم\x04طح\x04طم\x04ظم\x04عج\x04عم\x04غج\x04غم\x04فج\x04فح\x04فخ\x04فم" + + "\x04فى\x04في\x04قح\x04قم\x04قى\x04قي\x04كا\x04كج\x04كح\x04كخ\x04كل\x04كم" + + "\x04كى\x04كي\x04لج\x04لح\x04لخ\x04لم\x04لى\x04لي\x04مج\x04مح\x04مخ\x04مم" + + "\x04مى\x04مي\x04نج\x04نح\x04نخ\x04نم\x04نى\x04ني\x04هج\x04هم\x04هى\x04هي" + + "\x04يج\x04يح\x04يخ\x04يم\x04يى\x04يي\x04ذٰ\x04رٰ\x04ىٰ\x05 ٌّ\x05 ٍّ\x05" + + " َّ\x05 ُّ\x05 ِّ\x05 ّٰ\x04ئر\x04ئز\x04ئن\x04بر\x04بز\x04بن\x04تر\x04تز" + + "\x04تن\x04ثر\x04ثز\x04ثن\x04ما\x04نر\x04نز\x04نن\x04ير\x04يز\x04ين\x04ئخ" + + "\x04ئه\x04به\x04ته\x04صخ\x04له\x04نه\x04هٰ\x04يه\x04ثه\x04سه\x04شم\x04شه" + + "\x06ـَّ\x06ـُّ\x06ـِّ\x04طى\x04طي\x04عى\x04عي\x04غى\x04غي\x04سى\x04سي" + + "\x04شى\x04شي\x04حى\x04حي\x04جى\x04جي\x04خى\x04خي\x04صى\x04صي\x04ضى\x04ضي" + + "\x04شج\x04شح\x04شخ\x04شر\x04سر\x04صر\x04ضر\x04اً\x06تجم\x06تحج\x06تحم" + + "\x06تخم\x06تمج\x06تمح\x06تمخ\x06جمح\x06حمي\x06حمى\x06سحج\x06سجح\x06سجى" + + "\x06سمح\x06سمج\x06سمم\x06صحح\x06صمم\x06شحم\x06شجي\x06شمخ\x06شمم\x06ضحى" + + "\x06ضخم\x06طمح\x06طمم\x06طمي\x06عجم\x06عمم\x06عمى\x06غمم\x06غمي\x06غمى" + + "\x06فخم\x06قمح\x06قمم\x06لحم\x06لحي\x06لحى\x06لجج\x06لخم\x06لمح\x06محج" + + "\x06محم\x06محي\x06مجح\x06مجم\x06مخج\x06مخم\x06مجخ\x06همج\x06همم\x06نحم" + + "\x06نحى\x06نجم\x06نجى\x06نمي\x06نمى\x06يمم\x06بخي\x06تجي\x06تجى\x06تخي" + + "\x06تخى\x06تمي\x06تمى\x06جمي\x06جحى\x06جمى\x06سخى\x06صحي\x06شحي\x06ضحي" + + "\x06لجي\x06لمي\x06يحي\x06يجي\x06يمي\x06ممي\x06قمي\x06نحي\x06عمي\x06كمي" + + "\x06نجح\x06مخي\x06لجم\x06كمم\x06جحي\x06حجي\x06مجي\x06فمي\x06بحي\x06سخي" + + "\x06نجي\x06صلے\x06قلے\x08الله\x08اكبر\x08محمد\x08صلعم\x08رسول\x08عليه" + + "\x08وسلم\x06صلى!صلى الله عليه وسلم\x0fجل جلاله\x08ریال\x01,\x01:\x01!" + + "\x01?\x01_\x01{\x01}\x01[\x01]\x01#\x01&\x01*\x01-\x01<\x01>\x01\\\x01$" + + "\x01%\x01@\x04ـً\x04ـَ\x04ـُ\x04ـِ\x04ـّ\x04ـْ\x02ء\x02آ\x02أ\x02ؤ\x02إ" + + "\x02ئ\x02ا\x02ب\x02ة\x02ت\x02ث\x02ج\x02ح\x02خ\x02د\x02ذ\x02ر\x02ز\x02س" + + "\x02ش\x02ص\x02ض\x02ط\x02ظ\x02ع\x02غ\x02ف\x02ق\x02ك\x02ل\x02م\x02ن\x02ه" + + "\x02و\x02ي\x04لآ\x04لأ\x04لإ\x04لا\x01\x22\x01'\x01/\x01^\x01|\x01~\x02¢" + + "\x02£\x02¬\x02¦\x02¥\x08𝅗𝅥\x08𝅘𝅥\x0c𝅘𝅥𝅮\x0c𝅘𝅥𝅯\x0c𝅘𝅥𝅰\x0c𝅘𝅥𝅱\x0c𝅘𝅥𝅲\x08𝆹" + + "𝅥\x08𝆺𝅥\x0c𝆹𝅥𝅮\x0c𝆺𝅥𝅮\x0c𝆹𝅥𝅯\x0c𝆺𝅥𝅯\x02ı\x02ȷ\x02α\x02ε\x02ζ\x02η\x02" + + "κ\x02λ\x02μ\x02ν\x02ξ\x02ο\x02σ\x02τ\x02υ\x02ψ\x03∇\x03∂\x02ϝ\x02ٮ\x02ڡ" + + "\x02ٯ\x020,\x021,\x022,\x023,\x024,\x025,\x026,\x027,\x028,\x029,\x03(a)" + + "\x03(b)\x03(c)\x03(d)\x03(e)\x03(f)\x03(g)\x03(h)\x03(i)\x03(j)\x03(k)" + + "\x03(l)\x03(m)\x03(n)\x03(o)\x03(p)\x03(q)\x03(r)\x03(s)\x03(t)\x03(u)" + + "\x03(v)\x03(w)\x03(x)\x03(y)\x03(z)\x07〔s〕\x02wz\x02hv\x02sd\x03ppv\x02w" + + "c\x02mc\x02md\x02dj\x06ほか\x06ココ\x03サ\x03手\x03字\x03双\x03デ\x03二\x03多\x03解" + + "\x03天\x03交\x03映\x03無\x03料\x03前\x03後\x03再\x03新\x03初\x03終\x03生\x03販\x03声" + + "\x03吹\x03演\x03投\x03捕\x03一\x03三\x03遊\x03左\x03中\x03右\x03指\x03走\x03打\x03禁" + + "\x03空\x03合\x03満\x03有\x03月\x03申\x03割\x03営\x03配\x09〔本〕\x09〔三〕\x09〔二〕\x09〔安" + + "〕\x09〔点〕\x09〔打〕\x09〔盗〕\x09〔勝〕\x09〔敗〕\x03得\x03可\x03丽\x03丸\x03乁\x03你\x03" + + "侮\x03侻\x03倂\x03偺\x03備\x03僧\x03像\x03㒞\x03免\x03兔\x03兤\x03具\x03㒹\x03內\x03" + + "冗\x03冤\x03仌\x03冬\x03况\x03凵\x03刃\x03㓟\x03刻\x03剆\x03剷\x03㔕\x03勇\x03勉\x03" + + "勤\x03勺\x03包\x03匆\x03北\x03卉\x03卑\x03博\x03即\x03卽\x03卿\x03灰\x03及\x03叟\x03" + + "叫\x03叱\x03吆\x03咞\x03吸\x03呈\x03周\x03咢\x03哶\x03唐\x03啓\x03啣\x03善\x03喙\x03" + + "喫\x03喳\x03嗂\x03圖\x03嘆\x03圗\x03噑\x03噴\x03切\x03壮\x03城\x03埴\x03堍\x03型\x03" + + "堲\x03報\x03墬\x03売\x03壷\x03夆\x03夢\x03奢\x03姬\x03娛\x03娧\x03姘\x03婦\x03㛮\x03" + + "嬈\x03嬾\x03寃\x03寘\x03寧\x03寳\x03寿\x03将\x03尢\x03㞁\x03屠\x03屮\x03峀\x03岍\x03" + + "嵃\x03嵮\x03嵫\x03嵼\x03巡\x03巢\x03㠯\x03巽\x03帨\x03帽\x03幩\x03㡢\x03㡼\x03庰\x03" + + "庳\x03庶\x03廊\x03廾\x03舁\x03弢\x03㣇\x03形\x03彫\x03㣣\x03徚\x03忍\x03志\x03忹\x03" + + "悁\x03㤺\x03㤜\x03悔\x03惇\x03慈\x03慌\x03慎\x03慺\x03憎\x03憲\x03憤\x03憯\x03懞\x03" + + "懲\x03懶\x03成\x03戛\x03扝\x03抱\x03拔\x03捐\x03挽\x03拼\x03捨\x03掃\x03揤\x03搢\x03" + + "揅\x03掩\x03㨮\x03摩\x03摾\x03撝\x03摷\x03㩬\x03敏\x03敬\x03旣\x03書\x03晉\x03㬙\x03" + + "暑\x03㬈\x03㫤\x03冒\x03冕\x03最\x03暜\x03肭\x03䏙\x03朗\x03望\x03朡\x03杞\x03杓\x03" + + "㭉\x03柺\x03枅\x03桒\x03梅\x03梎\x03栟\x03椔\x03㮝\x03楂\x03榣\x03槪\x03檨\x03櫛\x03" + + "㰘\x03次\x03歔\x03㱎\x03歲\x03殟\x03殺\x03殻\x03汎\x03沿\x03泍\x03汧\x03洖\x03派\x03" + + "海\x03流\x03浩\x03浸\x03涅\x03洴\x03港\x03湮\x03㴳\x03滋\x03滇\x03淹\x03潮\x03濆\x03" + + "瀹\x03瀞\x03瀛\x03㶖\x03灊\x03災\x03灷\x03炭\x03煅\x03熜\x03爨\x03爵\x03牐\x03犀\x03" + + "犕\x03獺\x03王\x03㺬\x03玥\x03㺸\x03瑇\x03瑜\x03瑱\x03璅\x03瓊\x03㼛\x03甤\x03甾\x03" + + "異\x03瘐\x03㿼\x03䀈\x03直\x03眞\x03真\x03睊\x03䀹\x03瞋\x03䁆\x03䂖\x03硎\x03碌\x03" + + "磌\x03䃣\x03祖\x03福\x03秫\x03䄯\x03穀\x03穊\x03穏\x03䈂\x03篆\x03築\x03䈧\x03糒\x03" + + "䊠\x03糨\x03糣\x03紀\x03絣\x03䌁\x03緇\x03縂\x03繅\x03䌴\x03䍙\x03罺\x03羕\x03翺\x03" + + "者\x03聠\x03聰\x03䏕\x03育\x03脃\x03䐋\x03脾\x03媵\x03舄\x03辞\x03䑫\x03芑\x03芋\x03" + + "芝\x03劳\x03花\x03芳\x03芽\x03苦\x03若\x03茝\x03荣\x03莭\x03茣\x03莽\x03菧\x03著\x03" + + "荓\x03菊\x03菌\x03菜\x03䔫\x03蓱\x03蓳\x03蔖\x03蕤\x03䕝\x03䕡\x03䕫\x03虐\x03虜\x03" + + "虧\x03虩\x03蚩\x03蚈\x03蜎\x03蛢\x03蝹\x03蜨\x03蝫\x03螆\x03蟡\x03蠁\x03䗹\x03衠\x03" + + "衣\x03裗\x03裞\x03䘵\x03裺\x03㒻\x03䚾\x03䛇\x03誠\x03諭\x03變\x03豕\x03貫\x03賁\x03" + + "贛\x03起\x03跋\x03趼\x03跰\x03軔\x03輸\x03邔\x03郱\x03鄑\x03鄛\x03鈸\x03鋗\x03鋘\x03" + + "鉼\x03鏹\x03鐕\x03開\x03䦕\x03閷\x03䧦\x03雃\x03嶲\x03霣\x03䩮\x03䩶\x03韠\x03䪲\x03" + + "頋\x03頩\x03飢\x03䬳\x03餩\x03馧\x03駂\x03駾\x03䯎\x03鬒\x03鱀\x03鳽\x03䳎\x03䳭\x03" + + "鵧\x03䳸\x03麻\x03䵖\x03黹\x03黾\x03鼅\x03鼏\x03鼖\x03鼻" + +var xorData string = "" + // Size: 4855 bytes + "\x02\x0c\x09\x02\xb0\xec\x02\xad\xd8\x02\xad\xd9\x02\x06\x07\x02\x0f\x12" + + "\x02\x0f\x1f\x02\x0f\x1d\x02\x01\x13\x02\x0f\x16\x02\x0f\x0b\x02\x0f3" + + "\x02\x0f7\x02\x0f?\x02\x0f/\x02\x0f*\x02\x0c&\x02\x0c*\x02\x0c;\x02\x0c9" + + "\x02\x0c%\x02\xab\xed\x02\xab\xe2\x02\xab\xe3\x02\xa9\xe0\x02\xa9\xe1" + + "\x02\xa9\xe6\x02\xa3\xcb\x02\xa3\xc8\x02\xa3\xc9\x02\x01#\x02\x01\x08" + + "\x02\x0e>\x02\x0e'\x02\x0f\x03\x02\x03\x0d\x02\x03\x09\x02\x03\x17\x02" + + "\x03\x0e\x02\x02\x03\x02\x011\x02\x01\x00\x02\x01\x10\x02\x03<\x02\x07" + + "\x0d\x02\x02\x0c\x02\x0c0\x02\x01\x03\x02\x01\x01\x02\x01 \x02\x01\x22" + + "\x02\x01)\x02\x01\x0a\x02\x01\x0c\x02\x02\x06\x02\x02\x02\x02\x03\x10" + + "\x03\x037 \x03\x0b+\x03\x02\x01\x04\x02\x01\x02\x02\x019\x02\x03\x1c\x02" + + "\x02$\x03\x80p$\x02\x03:\x02\x03\x0a\x03\xc1r.\x03\xc1r,\x03\xc1r\x02" + + "\x02\x02:\x02\x02>\x02\x02,\x02\x02\x10\x02\x02\x00\x03\xc1s<\x03\xc1s*" + + "\x03\xc2L$\x03\xc2L;\x02\x09)\x02\x0a\x19\x03\x83\xab\xe3\x03\x83\xab" + + "\xf2\x03 4\xe0\x03\x81\xab\xea\x03\x81\xab\xf3\x03 4\xef\x03\x96\xe1\xcd" + + "\x03\x84\xe5\xc3\x02\x0d\x11\x03\x8b\xec\xcb\x03\x94\xec\xcf\x03\x9a\xec" + + "\xc2\x03\x8b\xec\xdb\x03\x94\xec\xdf\x03\x9a\xec\xd2\x03\x01\x0c!\x03" + + "\x01\x0c#\x03ʠ\x9d\x03ʣ\x9c\x03ʢ\x9f\x03ʥ\x9e\x03ʤ\x91\x03ʧ\x90\x03ʦ\x93" + + "\x03ʩ\x92\x03ʨ\x95\x03\xca\xf3\xb5\x03\xca\xf0\xb4\x03\xca\xf1\xb7\x03" + + "\xca\xf6\xb6\x03\xca\xf7\x89\x03\xca\xf4\x88\x03\xca\xf5\x8b\x03\xca\xfa" + + "\x8a\x03\xca\xfb\x8d\x03\xca\xf8\x8c\x03\xca\xf9\x8f\x03\xca\xfe\x8e\x03" + + "\xca\xff\x81\x03\xca\xfc\x80\x03\xca\xfd\x83\x03\xca\xe2\x82\x03\xca\xe3" + + "\x85\x03\xca\xe0\x84\x03\xca\xe1\x87\x03\xca\xe6\x86\x03\xca\xe7\x99\x03" + + "\xca\xe4\x98\x03\xca\xe5\x9b\x03\xca\xea\x9a\x03\xca\xeb\x9d\x03\xca\xe8" + + "\x9c\x03ؓ\x89\x03ߔ\x8b\x02\x010\x03\x03\x04\x1e\x03\x04\x15\x12\x03\x0b" + + "\x05,\x03\x06\x04\x00\x03\x06\x04)\x03\x06\x044\x03\x06\x04<\x03\x06\x05" + + "\x1d\x03\x06\x06\x00\x03\x06\x06\x0a\x03\x06\x06'\x03\x06\x062\x03\x0786" + + "\x03\x079/\x03\x079 \x03\x07:\x0e\x03\x07:\x1b\x03\x07:%\x03\x07;/\x03" + + "\x07;%\x03\x074\x11\x03\x076\x09\x03\x077*\x03\x070\x01\x03\x070\x0f\x03" + + "\x070.\x03\x071\x16\x03\x071\x04\x03\x0710\x03\x072\x18\x03\x072-\x03" + + "\x073\x14\x03\x073>\x03\x07'\x09\x03\x07 \x00\x03\x07\x1f\x0b\x03\x07" + + "\x18#\x03\x07\x18(\x03\x07\x186\x03\x07\x18\x03\x03\x07\x19\x16\x03\x07" + + "\x116\x03\x07\x12'\x03\x07\x13\x10\x03\x07\x0c&\x03\x07\x0c\x08\x03\x07" + + "\x0c\x13\x03\x07\x0d\x02\x03\x07\x0d\x1c\x03\x07\x0b5\x03\x07\x0b\x0a" + + "\x03\x07\x0b\x01\x03\x07\x0b\x0f\x03\x07\x05\x00\x03\x07\x05\x09\x03\x07" + + "\x05\x0b\x03\x07\x07\x01\x03\x07\x07\x08\x03\x07\x00<\x03\x07\x00+\x03" + + "\x07\x01)\x03\x07\x01\x1b\x03\x07\x01\x08\x03\x07\x03?\x03\x0445\x03\x04" + + "4\x08\x03\x0454\x03\x04)/\x03\x04)5\x03\x04+\x05\x03\x04+\x14\x03\x04+ " + + "\x03\x04+<\x03\x04*&\x03\x04*\x22\x03\x04&8\x03\x04!\x01\x03\x04!\x22" + + "\x03\x04\x11+\x03\x04\x10.\x03\x04\x104\x03\x04\x13=\x03\x04\x12\x04\x03" + + "\x04\x12\x0a\x03\x04\x0d\x1d\x03\x04\x0d\x07\x03\x04\x0d \x03\x05<>\x03" + + "\x055<\x03\x055!\x03\x055#\x03\x055&\x03\x054\x1d\x03\x054\x02\x03\x054" + + "\x07\x03\x0571\x03\x053\x1a\x03\x053\x16\x03\x05.<\x03\x05.\x07\x03\x05)" + + ":\x03\x05)<\x03\x05)\x0c\x03\x05)\x15\x03\x05+-\x03\x05+5\x03\x05$\x1e" + + "\x03\x05$\x14\x03\x05'\x04\x03\x05'\x14\x03\x05&\x02\x03\x05\x226\x03" + + "\x05\x22\x0c\x03\x05\x22\x1c\x03\x05\x19\x0a\x03\x05\x1b\x09\x03\x05\x1b" + + "\x0c\x03\x05\x14\x07\x03\x05\x16?\x03\x05\x16\x0c\x03\x05\x0c\x05\x03" + + "\x05\x0e\x0f\x03\x05\x01\x0e\x03\x05\x00(\x03\x05\x030\x03\x05\x03\x06" + + "\x03\x0a==\x03\x0a=1\x03\x0a=,\x03\x0a=\x0c\x03\x0a??\x03\x0a<\x08\x03" + + "\x0a9!\x03\x0a9)\x03\x0a97\x03\x0a99\x03\x0a6\x0a\x03\x0a6\x1c\x03\x0a6" + + "\x17\x03\x0a7'\x03\x0a78\x03\x0a73\x03\x0a'\x01\x03\x0a'&\x03\x0a\x1f" + + "\x0e\x03\x0a\x1f\x03\x03\x0a\x1f3\x03\x0a\x1b/\x03\x0a\x18\x19\x03\x0a" + + "\x19\x01\x03\x0a\x16\x14\x03\x0a\x0e\x22\x03\x0a\x0f\x10\x03\x0a\x0f\x02" + + "\x03\x0a\x0f \x03\x0a\x0c\x04\x03\x0a\x0b>\x03\x0a\x0b+\x03\x0a\x08/\x03" + + "\x0a\x046\x03\x0a\x05\x14\x03\x0a\x00\x04\x03\x0a\x00\x10\x03\x0a\x00" + + "\x14\x03\x0b<3\x03\x0b;*\x03\x0b9\x22\x03\x0b9)\x03\x0b97\x03\x0b+\x10" + + "\x03\x0b((\x03\x0b&5\x03\x0b$\x1c\x03\x0b$\x12\x03\x0b%\x04\x03\x0b#<" + + "\x03\x0b#0\x03\x0b#\x0d\x03\x0b#\x19\x03\x0b!:\x03\x0b!\x1f\x03\x0b!\x00" + + "\x03\x0b\x1e5\x03\x0b\x1c\x1d\x03\x0b\x1d-\x03\x0b\x1d(\x03\x0b\x18.\x03" + + "\x0b\x18 \x03\x0b\x18\x16\x03\x0b\x14\x13\x03\x0b\x15$\x03\x0b\x15\x22" + + "\x03\x0b\x12\x1b\x03\x0b\x12\x10\x03\x0b\x132\x03\x0b\x13=\x03\x0b\x12" + + "\x18\x03\x0b\x0c&\x03\x0b\x061\x03\x0b\x06:\x03\x0b\x05#\x03\x0b\x05<" + + "\x03\x0b\x04\x0b\x03\x0b\x04\x04\x03\x0b\x04\x1b\x03\x0b\x042\x03\x0b" + + "\x041\x03\x0b\x03\x03\x03\x0b\x03\x1d\x03\x0b\x03/\x03\x0b\x03+\x03\x0b" + + "\x02\x1b\x03\x0b\x02\x00\x03\x0b\x01\x1e\x03\x0b\x01\x08\x03\x0b\x015" + + "\x03\x06\x0d9\x03\x06\x0d=\x03\x06\x0d?\x03\x02\x001\x03\x02\x003\x03" + + "\x02\x02\x19\x03\x02\x006\x03\x02\x02\x1b\x03\x02\x004\x03\x02\x00<\x03" + + "\x02\x02\x0a\x03\x02\x02\x0e\x03\x02\x01\x1a\x03\x02\x01\x07\x03\x02\x01" + + "\x05\x03\x02\x01\x0b\x03\x02\x01%\x03\x02\x01\x0c\x03\x02\x01\x04\x03" + + "\x02\x01\x1c\x03\x02\x00.\x03\x02\x002\x03\x02\x00>\x03\x02\x00\x12\x03" + + "\x02\x00\x16\x03\x02\x011\x03\x02\x013\x03\x02\x02 \x03\x02\x02%\x03\x02" + + "\x02$\x03\x02\x028\x03\x02\x02;\x03\x02\x024\x03\x02\x012\x03\x02\x022" + + "\x03\x02\x02/\x03\x02\x01,\x03\x02\x01\x13\x03\x02\x01\x16\x03\x02\x01" + + "\x11\x03\x02\x01\x1e\x03\x02\x01\x15\x03\x02\x01\x17\x03\x02\x01\x0f\x03" + + "\x02\x01\x08\x03\x02\x00?\x03\x02\x03\x07\x03\x02\x03\x0d\x03\x02\x03" + + "\x13\x03\x02\x03\x1d\x03\x02\x03\x1f\x03\x02\x00\x03\x03\x02\x00\x0d\x03" + + "\x02\x00\x01\x03\x02\x00\x1b\x03\x02\x00\x19\x03\x02\x00\x18\x03\x02\x00" + + "\x13\x03\x02\x00/\x03\x07>\x12\x03\x07<\x1f\x03\x07>\x1d\x03\x06\x1d\x0e" + + "\x03\x07>\x1c\x03\x07>:\x03\x07>\x13\x03\x04\x12+\x03\x07?\x03\x03\x07>" + + "\x02\x03\x06\x224\x03\x06\x1a.\x03\x07<%\x03\x06\x1c\x0b\x03\x0609\x03" + + "\x05\x1f\x01\x03\x04'\x08\x03\x93\xfd\xf5\x03\x02\x0d \x03\x02\x0d#\x03" + + "\x02\x0d!\x03\x02\x0d&\x03\x02\x0d\x22\x03\x02\x0d/\x03\x02\x0d,\x03\x02" + + "\x0d$\x03\x02\x0d'\x03\x02\x0d%\x03\x02\x0d;\x03\x02\x0d=\x03\x02\x0d?" + + "\x03\x099.\x03\x08\x0b7\x03\x08\x02\x14\x03\x08\x14\x0d\x03\x08.:\x03" + + "\x089'\x03\x0f\x0b\x18\x03\x0f\x1c1\x03\x0f\x17&\x03\x0f9\x1f\x03\x0f0" + + "\x0c\x03\x0e\x0a9\x03\x0e\x056\x03\x0e\x1c#\x03\x0f\x13\x0e\x03\x072\x00" + + "\x03\x070\x0d\x03\x072\x0b\x03\x06\x11\x18\x03\x070\x10\x03\x06\x0f(\x03" + + "\x072\x05\x03\x06\x0f,\x03\x073\x15\x03\x06\x07\x08\x03\x05\x16\x02\x03" + + "\x04\x0b \x03\x05:8\x03\x05\x16%\x03\x0a\x0d\x1f\x03\x06\x16\x10\x03\x05" + + "\x1d5\x03\x05*;\x03\x05\x16\x1b\x03\x04.-\x03\x06\x1a\x19\x03\x04\x03," + + "\x03\x0b87\x03\x04/\x0a\x03\x06\x00,\x03\x04-\x01\x03\x04\x1e-\x03\x06/(" + + "\x03\x0a\x0b5\x03\x06\x0e7\x03\x06\x07.\x03\x0597\x03\x0a*%\x03\x0760" + + "\x03\x06\x0c;\x03\x05'\x00\x03\x072.\x03\x072\x08\x03\x06=\x01\x03\x06" + + "\x05\x1b\x03\x06\x06\x12\x03\x06$=\x03\x06'\x0d\x03\x04\x11\x0f\x03\x076" + + ",\x03\x06\x07;\x03\x06.,\x03\x86\xf9\xea\x03\x8f\xff\xeb\x02\x092\x02" + + "\x095\x02\x094\x02\x09;\x02\x09>\x02\x098\x02\x09*\x02\x09/\x02\x09,\x02" + + "\x09%\x02\x09&\x02\x09#\x02\x09 \x02\x08!\x02\x08%\x02\x08$\x02\x08+\x02" + + "\x08.\x02\x08*\x02\x08&\x02\x088\x02\x08>\x02\x084\x02\x086\x02\x080\x02" + + "\x08\x10\x02\x08\x17\x02\x08\x12\x02\x08\x1d\x02\x08\x1f\x02\x08\x13\x02" + + "\x08\x15\x02\x08\x14\x02\x08\x0c\x03\x8b\xfd\xd0\x03\x81\xec\xc6\x03\x87" + + "\xe0\x8a\x03-2\xe3\x03\x80\xef\xe4\x03-2\xea\x03\x88\xe6\xeb\x03\x8e\xe6" + + "\xe8\x03\x84\xe6\xe9\x03\x97\xe6\xee\x03-2\xf9\x03-2\xf6\x03\x8e\xe3\xad" + + "\x03\x80\xe3\x92\x03\x88\xe3\x90\x03\x8e\xe3\x90\x03\x80\xe3\x97\x03\x88" + + "\xe3\x95\x03\x88\xfe\xcb\x03\x8e\xfe\xca\x03\x84\xfe\xcd\x03\x91\xef\xc9" + + "\x03-2\xc1\x03-2\xc0\x03-2\xcb\x03\x88@\x09\x03\x8e@\x08\x03\x8f\xe0\xf5" + + "\x03\x8e\xe6\xf9\x03\x8e\xe0\xfa\x03\x93\xff\xf4\x03\x84\xee\xd3\x03\x0b" + + "(\x04\x023 \x021;\x02\x01*\x03\x0b#\x10\x03\x0b 0\x03\x0b!\x10\x03\x0b!0" + + "\x03\x07\x15\x08\x03\x09?5\x03\x07\x1f\x08\x03\x07\x17\x0b\x03\x09\x1f" + + "\x15\x03\x0b\x1c7\x03\x0a+#\x03\x06\x1a\x1b\x03\x06\x1a\x14\x03\x0a\x01" + + "\x18\x03\x06#\x1b\x03\x0a2\x0c\x03\x0a\x01\x04\x03\x09#;\x03\x08='\x03" + + "\x08\x1a\x0a\x03\x07\x03\x0a\x111\x03\x09\x1b\x09\x03\x073.\x03\x07\x01\x00" + + "\x03\x09/,\x03\x07#>\x03\x07\x048\x03\x0a\x1f\x22\x03\x098>\x03\x09\x11" + + "\x00\x03\x08/\x17\x03\x06'\x22\x03\x0b\x1a+\x03\x0a\x22\x19\x03\x0a/1" + + "\x03\x0974\x03\x09\x0f\x22\x03\x08,\x22\x03\x08?\x14\x03\x07$5\x03\x07<3" + + "\x03\x07=*\x03\x07\x13\x18\x03\x068\x0a\x03\x06\x09\x16\x03\x06\x13\x00" + + "\x03\x08\x067\x03\x08\x01\x03\x03\x08\x12\x1d\x03\x07+7\x03\x06(;\x03" + + "\x06\x1c?\x03\x07\x0e\x17\x03\x0a\x06\x1d\x03\x0a\x19\x07\x03\x08\x14$" + + "\x03\x07$;\x03\x08,$\x03\x08\x06\x0d\x03\x07\x16\x0a\x03\x06>>\x03\x0a" + + "\x06\x12\x03\x0a\x14)\x03\x09\x0d\x1f\x03\x09\x12\x17\x03\x09\x19\x01" + + "\x03\x08\x11 \x03\x08\x1d'\x03\x06<\x1a\x03\x0a.\x00\x03\x07'\x18\x03" + + "\x0a\x22\x08\x03\x08\x0d\x0a\x03\x08\x13)\x03\x07*)\x03\x06<,\x03\x07" + + "\x0b\x1a\x03\x09.\x14\x03\x09\x0d\x1e\x03\x07\x0e#\x03\x0b\x1d'\x03\x0a" + + "\x0a8\x03\x09%2\x03\x08+&\x03\x080\x12\x03\x0a)4\x03\x08\x06\x1f\x03\x0b" + + "\x1b\x1a\x03\x0a\x1b\x0f\x03\x0b\x1d*\x03\x09\x16$\x03\x090\x11\x03\x08" + + "\x11\x08\x03\x0a*(\x03\x0a\x042\x03\x089,\x03\x074'\x03\x07\x0f\x05\x03" + + "\x09\x0b\x0a\x03\x07\x1b\x01\x03\x09\x17:\x03\x09.\x0d\x03\x07.\x11\x03" + + "\x09+\x15\x03\x080\x13\x03\x0b\x1f\x19\x03\x0a \x11\x03\x0a\x220\x03\x09" + + "\x07;\x03\x08\x16\x1c\x03\x07,\x13\x03\x07\x0e/\x03\x06\x221\x03\x0a." + + "\x0a\x03\x0a7\x02\x03\x0a\x032\x03\x0a\x1d.\x03\x091\x06\x03\x09\x19:" + + "\x03\x08\x02/\x03\x060+\x03\x06\x0f-\x03\x06\x1c\x1f\x03\x06\x1d\x07\x03" + + "\x0a,\x11\x03\x09=\x0d\x03\x09\x0b;\x03\x07\x1b/\x03\x0a\x1f:\x03\x09 " + + "\x1f\x03\x09.\x10\x03\x094\x0b\x03\x09\x1a1\x03\x08#\x1a\x03\x084\x1d" + + "\x03\x08\x01\x1f\x03\x08\x11\x22\x03\x07'8\x03\x07\x1a>\x03\x0757\x03" + + "\x06&9\x03\x06+\x11\x03\x0a.\x0b\x03\x0a,>\x03\x0a4#\x03\x08%\x17\x03" + + "\x07\x05\x22\x03\x07\x0c\x0b\x03\x0a\x1d+\x03\x0a\x19\x16\x03\x09+\x1f" + + "\x03\x09\x08\x0b\x03\x08\x16\x18\x03\x08+\x12\x03\x0b\x1d\x0c\x03\x0a=" + + "\x10\x03\x0a\x09\x0d\x03\x0a\x10\x11\x03\x09&0\x03\x08(\x1f\x03\x087\x07" + + "\x03\x08\x185\x03\x07'6\x03\x06.\x05\x03\x06=\x04\x03\x06;;\x03\x06\x06," + + "\x03\x0b\x18>\x03\x08\x00\x18\x03\x06 \x03\x03\x06<\x00\x03\x09%\x18\x03" + + "\x0b\x1c<\x03\x0a%!\x03\x0a\x09\x12\x03\x0a\x16\x02\x03\x090'\x03\x09" + + "\x0e=\x03\x08 \x0e\x03\x08>\x03\x03\x074>\x03\x06&?\x03\x06\x19\x09\x03" + + "\x06?(\x03\x0a-\x0e\x03\x09:3\x03\x098:\x03\x09\x12\x0b\x03\x09\x1d\x17" + + "\x03\x087\x05\x03\x082\x14\x03\x08\x06%\x03\x08\x13\x1f\x03\x06\x06\x0e" + + "\x03\x0a\x22<\x03\x09/<\x03\x06>+\x03\x0a'?\x03\x0a\x13\x0c\x03\x09\x10<" + + "\x03\x07\x1b=\x03\x0a\x19\x13\x03\x09\x22\x1d\x03\x09\x07\x0d\x03\x08)" + + "\x1c\x03\x06=\x1a\x03\x0a/4\x03\x0a7\x11\x03\x0a\x16:\x03\x09?3\x03\x09:" + + "/\x03\x09\x05\x0a\x03\x09\x14\x06\x03\x087\x22\x03\x080\x07\x03\x08\x1a" + + "\x1f\x03\x07\x04(\x03\x07\x04\x09\x03\x06 %\x03\x06<\x08\x03\x0a+\x14" + + "\x03\x09\x1d\x16\x03\x0a70\x03\x08 >\x03\x0857\x03\x070\x0a\x03\x06=\x12" + + "\x03\x06\x16%\x03\x06\x1d,\x03\x099#\x03\x09\x10>\x03\x07 \x1e\x03\x08" + + "\x0c<\x03\x08\x0b\x18\x03\x08\x15+\x03\x08,:\x03\x08%\x22\x03\x07\x0a$" + + "\x03\x0b\x1c=\x03\x07+\x08\x03\x0a/\x05\x03\x0a \x07\x03\x0a\x12'\x03" + + "\x09#\x11\x03\x08\x1b\x15\x03\x0a\x06\x01\x03\x09\x1c\x1b\x03\x0922\x03" + + "\x07\x14<\x03\x07\x09\x04\x03\x061\x04\x03\x07\x0e\x01\x03\x0a\x13\x18" + + "\x03\x0a-\x0c\x03\x0a?\x0d\x03\x0a\x09\x0a\x03\x091&\x03\x0a/\x0b\x03" + + "\x08$<\x03\x083\x1d\x03\x08\x0c$\x03\x08\x0d\x07\x03\x08\x0d?\x03\x08" + + "\x0e\x14\x03\x065\x0a\x03\x08\x1a#\x03\x08\x16#\x03\x0702\x03\x07\x03" + + "\x1a\x03\x06(\x1d\x03\x06+\x1b\x03\x06\x0b\x05\x03\x06\x0b\x17\x03\x06" + + "\x0c\x04\x03\x06\x1e\x19\x03\x06+0\x03\x062\x18\x03\x0b\x16\x1e\x03\x0a+" + + "\x16\x03\x0a-?\x03\x0a#:\x03\x0a#\x10\x03\x0a%$\x03\x0a>+\x03\x0a01\x03" + + "\x0a1\x10\x03\x0a\x099\x03\x0a\x0a\x12\x03\x0a\x19\x1f\x03\x0a\x19\x12" + + "\x03\x09*)\x03\x09-\x16\x03\x09.1\x03\x09.2\x03\x09<\x0e\x03\x09> \x03" + + "\x093\x12\x03\x09\x0b\x01\x03\x09\x1c2\x03\x09\x11\x1c\x03\x09\x15%\x03" + + "\x08,&\x03\x08!\x22\x03\x089(\x03\x08\x0b\x1a\x03\x08\x0d2\x03\x08\x0c" + + "\x04\x03\x08\x0c\x06\x03\x08\x0c\x1f\x03\x08\x0c\x0c\x03\x08\x0f\x1f\x03" + + "\x08\x0f\x1d\x03\x08\x00\x14\x03\x08\x03\x14\x03\x08\x06\x16\x03\x08\x1e" + + "#\x03\x08\x11\x11\x03\x08\x10\x18\x03\x08\x14(\x03\x07)\x1e\x03\x07.1" + + "\x03\x07 $\x03\x07 '\x03\x078\x08\x03\x07\x0d0\x03\x07\x0f7\x03\x07\x05#" + + "\x03\x07\x05\x1a\x03\x07\x1a7\x03\x07\x1d-\x03\x07\x17\x10\x03\x06)\x1f" + + "\x03\x062\x0b\x03\x066\x16\x03\x06\x09\x11\x03\x09(\x1e\x03\x07!5\x03" + + "\x0b\x11\x16\x03\x0a/\x04\x03\x0a,\x1a\x03\x0b\x173\x03\x0a,1\x03\x0a/5" + + "\x03\x0a\x221\x03\x0a\x22\x0d\x03\x0a?%\x03\x0a<,\x03\x0a?#\x03\x0a>\x19" + + "\x03\x0a\x08&\x03\x0a\x0b\x0e\x03\x0a\x0c:\x03\x0a\x0c+\x03\x0a\x03\x22" + + "\x03\x0a\x06)\x03\x0a\x11\x10\x03\x0a\x11\x1a\x03\x0a\x17-\x03\x0a\x14(" + + "\x03\x09)\x1e\x03\x09/\x09\x03\x09.\x00\x03\x09,\x07\x03\x09/*\x03\x09-9" + + "\x03\x09\x228\x03\x09%\x09\x03\x09:\x12\x03\x09;\x1d\x03\x09?\x06\x03" + + "\x093%\x03\x096\x05\x03\x096\x08\x03\x097\x02\x03\x09\x07,\x03\x09\x04," + + "\x03\x09\x1f\x16\x03\x09\x11\x03\x03\x09\x11\x12\x03\x09\x168\x03\x08*" + + "\x05\x03\x08/2\x03\x084:\x03\x08\x22+\x03\x08 0\x03\x08&\x0a\x03\x08;" + + "\x10\x03\x08>$\x03\x08>\x18\x03\x0829\x03\x082:\x03\x081,\x03\x081<\x03" + + "\x081\x1c\x03\x087#\x03\x087*\x03\x08\x09'\x03\x08\x00\x1d\x03\x08\x05-" + + "\x03\x08\x1f4\x03\x08\x1d\x04\x03\x08\x16\x0f\x03\x07*7\x03\x07'!\x03" + + "\x07%\x1b\x03\x077\x0c\x03\x07\x0c1\x03\x07\x0c.\x03\x07\x00\x06\x03\x07" + + "\x01\x02\x03\x07\x010\x03\x07\x06=\x03\x07\x01\x03\x03\x07\x01\x13\x03" + + "\x07\x06\x06\x03\x07\x05\x0a\x03\x07\x1f\x09\x03\x07\x17:\x03\x06*1\x03" + + "\x06-\x1d\x03\x06\x223\x03\x062:\x03\x060$\x03\x066\x1e\x03\x064\x12\x03" + + "\x0645\x03\x06\x0b\x00\x03\x06\x0b7\x03\x06\x07\x1f\x03\x06\x15\x12\x03" + + "\x0c\x05\x0f\x03\x0b+\x0b\x03\x0b+-\x03\x06\x16\x1b\x03\x06\x15\x17\x03" + + "\x89\xca\xea\x03\x89\xca\xe8\x03\x0c8\x10\x03\x0c8\x01\x03\x0c8\x0f\x03" + + "\x0d8%\x03\x0d8!\x03\x0c8-\x03\x0c8/\x03\x0c8+\x03\x0c87\x03\x0c85\x03" + + "\x0c9\x09\x03\x0c9\x0d\x03\x0c9\x0f\x03\x0c9\x0b\x03\xcfu\x0c\x03\xcfu" + + "\x0f\x03\xcfu\x0e\x03\xcfu\x09\x03\x0c9\x10\x03\x0d9\x0c\x03\xcf`;\x03" + + "\xcf`>\x03\xcf`9\x03\xcf`8\x03\xcf`7\x03\xcf`*\x03\xcf`-\x03\xcf`,\x03" + + "\x0d\x1b\x1a\x03\x0d\x1b&\x03\x0c=.\x03\x0c=%\x03\x0c>\x1e\x03\x0c>\x14" + + "\x03\x0c?\x06\x03\x0c?\x0b\x03\x0c?\x0c\x03\x0c?\x0d\x03\x0c?\x02\x03" + + "\x0c>\x0f\x03\x0c>\x08\x03\x0c>\x09\x03\x0c>,\x03\x0c>\x0c\x03\x0c?\x13" + + "\x03\x0c?\x16\x03\x0c?\x15\x03\x0c?\x1c\x03\x0c?\x1f\x03\x0c?\x1d\x03" + + "\x0c?\x1a\x03\x0c?\x17\x03\x0c?\x08\x03\x0c?\x09\x03\x0c?\x0e\x03\x0c?" + + "\x04\x03\x0c?\x05\x03\x0c" + + "\x03\x0c=2\x03\x0c=6\x03\x0c<\x07\x03\x0c<\x05\x03\x0e:!\x03\x0e:#\x03" + + "\x0e8\x09\x03\x0e:&\x03\x0e8\x0b\x03\x0e:$\x03\x0e:,\x03\x0e8\x1a\x03" + + "\x0e8\x1e\x03\x0e:*\x03\x0e:7\x03\x0e:5\x03\x0e:;\x03\x0e:\x15\x03\x0e:<" + + "\x03\x0e:4\x03\x0e:'\x03\x0e:-\x03\x0e:%\x03\x0e:?\x03\x0e:=\x03\x0e:)" + + "\x03\x0e:/\x03\xcfs'\x03\x0d=\x0f\x03\x0d+*\x03\x0d99\x03\x0d9;\x03\x0d9" + + "?\x03\x0d)\x0d\x03\x0d(%\x02\x01\x18\x02\x01(\x02\x01\x1e\x03\x0f$!\x03" + + "\x0f87\x03\x0f4\x0e\x03\x0f5\x1d\x03\x06'\x03\x03\x0f\x08\x18\x03\x0f" + + "\x0d\x1b\x03\x0e2=\x03\x0e;\x08\x03\x0e:\x0b\x03\x0e\x06$\x03\x0e\x0d)" + + "\x03\x0e\x16\x1f\x03\x0e\x16\x1b\x03\x0d$\x0a\x03\x05,\x1d\x03\x0d. \x03" + + "\x0d.#\x03\x0c(/\x03\x09%\x02\x03\x0d90\x03\x0d\x0e4\x03\x0d\x0d\x0f\x03" + + "\x0c#\x00\x03\x0c,\x1e\x03\x0c2\x0e\x03\x0c\x01\x17\x03\x0c\x09:\x03\x0e" + + "\x173\x03\x0c\x08\x03\x03\x0c\x11\x07\x03\x0c\x10\x18\x03\x0c\x1f\x1c" + + "\x03\x0c\x19\x0e\x03\x0c\x1a\x1f\x03\x0f0>\x03\x0b->\x03\x0b<+\x03\x0b8" + + "\x13\x03\x0b\x043\x03\x0b\x14\x03\x03\x0b\x16%\x03\x0d\x22&\x03\x0b\x1a" + + "\x1a\x03\x0b\x1a\x04\x03\x0a%9\x03\x0a&2\x03\x0a&0\x03\x0a!\x1a\x03\x0a!" + + "7\x03\x0a5\x10\x03\x0a=4\x03\x0a?\x0e\x03\x0a>\x10\x03\x0a\x00 \x03\x0a" + + "\x0f:\x03\x0a\x0f9\x03\x0a\x0b\x0a\x03\x0a\x17%\x03\x0a\x1b-\x03\x09-" + + "\x1a\x03\x09,4\x03\x09.,\x03\x09)\x09\x03\x096!\x03\x091\x1f\x03\x093" + + "\x16\x03\x0c+\x1f\x03\x098 \x03\x098=\x03\x0c(\x1a\x03\x0c(\x16\x03\x09" + + "\x0a+\x03\x09\x16\x12\x03\x09\x13\x0e\x03\x09\x153\x03\x08)!\x03\x09\x1a" + + "\x01\x03\x09\x18\x01\x03\x08%#\x03\x08>\x22\x03\x08\x05%\x03\x08\x02*" + + "\x03\x08\x15;\x03\x08\x1b7\x03\x0f\x07\x1d\x03\x0f\x04\x03\x03\x070\x0c" + + "\x03\x07;\x0b\x03\x07\x08\x17\x03\x07\x12\x06\x03\x06/-\x03\x0671\x03" + + "\x065+\x03\x06>7\x03\x06\x049\x03\x05+\x1e\x03\x05,\x17\x03\x05 \x1d\x03" + + "\x05\x22\x05\x03\x050\x1d" + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *idnaTrie) lookup(s []byte) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return idnaValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = idnaIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = idnaIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = idnaIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *idnaTrie) lookupUnsafe(s []byte) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return idnaValues[c0] + } + i := idnaIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = idnaIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = idnaIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// lookupString returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *idnaTrie) lookupString(s string) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return idnaValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = idnaIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = idnaIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = idnaIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *idnaTrie) lookupStringUnsafe(s string) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return idnaValues[c0] + } + i := idnaIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = idnaIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = idnaIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// idnaTrie. Total size: 29052 bytes (28.37 KiB). Checksum: ef06e7ecc26f36dd. +type idnaTrie struct{} + +func newIdnaTrie(i int) *idnaTrie { + return &idnaTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *idnaTrie) lookupValue(n uint32, b byte) uint16 { + switch { + case n < 125: + return uint16(idnaValues[n<<6+uint32(b)]) + default: + n -= 125 + return uint16(idnaSparse.lookup(n, b)) + } +} + +// idnaValues: 127 blocks, 8128 entries, 16256 bytes +// The third block is the zero block. +var idnaValues = [8128]uint16{ + // Block 0x0, offset 0x0 + 0x00: 0x0080, 0x01: 0x0080, 0x02: 0x0080, 0x03: 0x0080, 0x04: 0x0080, 0x05: 0x0080, + 0x06: 0x0080, 0x07: 0x0080, 0x08: 0x0080, 0x09: 0x0080, 0x0a: 0x0080, 0x0b: 0x0080, + 0x0c: 0x0080, 0x0d: 0x0080, 0x0e: 0x0080, 0x0f: 0x0080, 0x10: 0x0080, 0x11: 0x0080, + 0x12: 0x0080, 0x13: 0x0080, 0x14: 0x0080, 0x15: 0x0080, 0x16: 0x0080, 0x17: 0x0080, + 0x18: 0x0080, 0x19: 0x0080, 0x1a: 0x0080, 0x1b: 0x0080, 0x1c: 0x0080, 0x1d: 0x0080, + 0x1e: 0x0080, 0x1f: 0x0080, 0x20: 0x0080, 0x21: 0x0080, 0x22: 0x0080, 0x23: 0x0080, + 0x24: 0x0080, 0x25: 0x0080, 0x26: 0x0080, 0x27: 0x0080, 0x28: 0x0080, 0x29: 0x0080, + 0x2a: 0x0080, 0x2b: 0x0080, 0x2c: 0x0080, 0x2d: 0x0008, 0x2e: 0x0008, 0x2f: 0x0080, + 0x30: 0x0008, 0x31: 0x0008, 0x32: 0x0008, 0x33: 0x0008, 0x34: 0x0008, 0x35: 0x0008, + 0x36: 0x0008, 0x37: 0x0008, 0x38: 0x0008, 0x39: 0x0008, 0x3a: 0x0080, 0x3b: 0x0080, + 0x3c: 0x0080, 0x3d: 0x0080, 0x3e: 0x0080, 0x3f: 0x0080, + // Block 0x1, offset 0x40 + 0x40: 0x0080, 0x41: 0xe105, 0x42: 0xe105, 0x43: 0xe105, 0x44: 0xe105, 0x45: 0xe105, + 0x46: 0xe105, 0x47: 0xe105, 0x48: 0xe105, 0x49: 0xe105, 0x4a: 0xe105, 0x4b: 0xe105, + 0x4c: 0xe105, 0x4d: 0xe105, 0x4e: 0xe105, 0x4f: 0xe105, 0x50: 0xe105, 0x51: 0xe105, + 0x52: 0xe105, 0x53: 0xe105, 0x54: 0xe105, 0x55: 0xe105, 0x56: 0xe105, 0x57: 0xe105, + 0x58: 0xe105, 0x59: 0xe105, 0x5a: 0xe105, 0x5b: 0x0080, 0x5c: 0x0080, 0x5d: 0x0080, + 0x5e: 0x0080, 0x5f: 0x0080, 0x60: 0x0080, 0x61: 0x0008, 0x62: 0x0008, 0x63: 0x0008, + 0x64: 0x0008, 0x65: 0x0008, 0x66: 0x0008, 0x67: 0x0008, 0x68: 0x0008, 0x69: 0x0008, + 0x6a: 0x0008, 0x6b: 0x0008, 0x6c: 0x0008, 0x6d: 0x0008, 0x6e: 0x0008, 0x6f: 0x0008, + 0x70: 0x0008, 0x71: 0x0008, 0x72: 0x0008, 0x73: 0x0008, 0x74: 0x0008, 0x75: 0x0008, + 0x76: 0x0008, 0x77: 0x0008, 0x78: 0x0008, 0x79: 0x0008, 0x7a: 0x0008, 0x7b: 0x0080, + 0x7c: 0x0080, 0x7d: 0x0080, 0x7e: 0x0080, 0x7f: 0x0080, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x0040, 0xc1: 0x0040, 0xc2: 0x0040, 0xc3: 0x0040, 0xc4: 0x0040, 0xc5: 0x0040, + 0xc6: 0x0040, 0xc7: 0x0040, 0xc8: 0x0040, 0xc9: 0x0040, 0xca: 0x0040, 0xcb: 0x0040, + 0xcc: 0x0040, 0xcd: 0x0040, 0xce: 0x0040, 0xcf: 0x0040, 0xd0: 0x0040, 0xd1: 0x0040, + 0xd2: 0x0040, 0xd3: 0x0040, 0xd4: 0x0040, 0xd5: 0x0040, 0xd6: 0x0040, 0xd7: 0x0040, + 0xd8: 0x0040, 0xd9: 0x0040, 0xda: 0x0040, 0xdb: 0x0040, 0xdc: 0x0040, 0xdd: 0x0040, + 0xde: 0x0040, 0xdf: 0x0040, 0xe0: 0x000a, 0xe1: 0x0018, 0xe2: 0x0018, 0xe3: 0x0018, + 0xe4: 0x0018, 0xe5: 0x0018, 0xe6: 0x0018, 0xe7: 0x0018, 0xe8: 0x001a, 0xe9: 0x0018, + 0xea: 0x0039, 0xeb: 0x0018, 0xec: 0x0018, 0xed: 0x03c0, 0xee: 0x0018, 0xef: 0x004a, + 0xf0: 0x0018, 0xf1: 0x0018, 0xf2: 0x0069, 0xf3: 0x0079, 0xf4: 0x008a, 0xf5: 0x0005, + 0xf6: 0x0018, 0xf7: 0x0008, 0xf8: 0x00aa, 0xf9: 0x00c9, 0xfa: 0x00d9, 0xfb: 0x0018, + 0xfc: 0x00e9, 0xfd: 0x0119, 0xfe: 0x0149, 0xff: 0x0018, + // Block 0x4, offset 0x100 + 0x100: 0xe00d, 0x101: 0x0008, 0x102: 0xe00d, 0x103: 0x0008, 0x104: 0xe00d, 0x105: 0x0008, + 0x106: 0xe00d, 0x107: 0x0008, 0x108: 0xe00d, 0x109: 0x0008, 0x10a: 0xe00d, 0x10b: 0x0008, + 0x10c: 0xe00d, 0x10d: 0x0008, 0x10e: 0xe00d, 0x10f: 0x0008, 0x110: 0xe00d, 0x111: 0x0008, + 0x112: 0xe00d, 0x113: 0x0008, 0x114: 0xe00d, 0x115: 0x0008, 0x116: 0xe00d, 0x117: 0x0008, + 0x118: 0xe00d, 0x119: 0x0008, 0x11a: 0xe00d, 0x11b: 0x0008, 0x11c: 0xe00d, 0x11d: 0x0008, + 0x11e: 0xe00d, 0x11f: 0x0008, 0x120: 0xe00d, 0x121: 0x0008, 0x122: 0xe00d, 0x123: 0x0008, + 0x124: 0xe00d, 0x125: 0x0008, 0x126: 0xe00d, 0x127: 0x0008, 0x128: 0xe00d, 0x129: 0x0008, + 0x12a: 0xe00d, 0x12b: 0x0008, 0x12c: 0xe00d, 0x12d: 0x0008, 0x12e: 0xe00d, 0x12f: 0x0008, + 0x130: 0x0179, 0x131: 0x0008, 0x132: 0x0035, 0x133: 0x004d, 0x134: 0xe00d, 0x135: 0x0008, + 0x136: 0xe00d, 0x137: 0x0008, 0x138: 0x0008, 0x139: 0xe01d, 0x13a: 0x0008, 0x13b: 0xe03d, + 0x13c: 0x0008, 0x13d: 0xe01d, 0x13e: 0x0008, 0x13f: 0x0199, + // Block 0x5, offset 0x140 + 0x140: 0x0199, 0x141: 0xe01d, 0x142: 0x0008, 0x143: 0xe03d, 0x144: 0x0008, 0x145: 0xe01d, + 0x146: 0x0008, 0x147: 0xe07d, 0x148: 0x0008, 0x149: 0x01b9, 0x14a: 0xe00d, 0x14b: 0x0008, + 0x14c: 0xe00d, 0x14d: 0x0008, 0x14e: 0xe00d, 0x14f: 0x0008, 0x150: 0xe00d, 0x151: 0x0008, + 0x152: 0xe00d, 0x153: 0x0008, 0x154: 0xe00d, 0x155: 0x0008, 0x156: 0xe00d, 0x157: 0x0008, + 0x158: 0xe00d, 0x159: 0x0008, 0x15a: 0xe00d, 0x15b: 0x0008, 0x15c: 0xe00d, 0x15d: 0x0008, + 0x15e: 0xe00d, 0x15f: 0x0008, 0x160: 0xe00d, 0x161: 0x0008, 0x162: 0xe00d, 0x163: 0x0008, + 0x164: 0xe00d, 0x165: 0x0008, 0x166: 0xe00d, 0x167: 0x0008, 0x168: 0xe00d, 0x169: 0x0008, + 0x16a: 0xe00d, 0x16b: 0x0008, 0x16c: 0xe00d, 0x16d: 0x0008, 0x16e: 0xe00d, 0x16f: 0x0008, + 0x170: 0xe00d, 0x171: 0x0008, 0x172: 0xe00d, 0x173: 0x0008, 0x174: 0xe00d, 0x175: 0x0008, + 0x176: 0xe00d, 0x177: 0x0008, 0x178: 0x0065, 0x179: 0xe01d, 0x17a: 0x0008, 0x17b: 0xe03d, + 0x17c: 0x0008, 0x17d: 0xe01d, 0x17e: 0x0008, 0x17f: 0x01d9, + // Block 0x6, offset 0x180 + 0x180: 0x0008, 0x181: 0x007d, 0x182: 0xe00d, 0x183: 0x0008, 0x184: 0xe00d, 0x185: 0x0008, + 0x186: 0x007d, 0x187: 0xe07d, 0x188: 0x0008, 0x189: 0x0095, 0x18a: 0x00ad, 0x18b: 0xe03d, + 0x18c: 0x0008, 0x18d: 0x0008, 0x18e: 0x00c5, 0x18f: 0x00dd, 0x190: 0x00f5, 0x191: 0xe01d, + 0x192: 0x0008, 0x193: 0x010d, 0x194: 0x0125, 0x195: 0x0008, 0x196: 0x013d, 0x197: 0x013d, + 0x198: 0xe00d, 0x199: 0x0008, 0x19a: 0x0008, 0x19b: 0x0008, 0x19c: 0x010d, 0x19d: 0x0155, + 0x19e: 0x0008, 0x19f: 0x016d, 0x1a0: 0xe00d, 0x1a1: 0x0008, 0x1a2: 0xe00d, 0x1a3: 0x0008, + 0x1a4: 0xe00d, 0x1a5: 0x0008, 0x1a6: 0x0185, 0x1a7: 0xe07d, 0x1a8: 0x0008, 0x1a9: 0x019d, + 0x1aa: 0x0008, 0x1ab: 0x0008, 0x1ac: 0xe00d, 0x1ad: 0x0008, 0x1ae: 0x0185, 0x1af: 0xe0fd, + 0x1b0: 0x0008, 0x1b1: 0x01b5, 0x1b2: 0x01cd, 0x1b3: 0xe03d, 0x1b4: 0x0008, 0x1b5: 0xe01d, + 0x1b6: 0x0008, 0x1b7: 0x01e5, 0x1b8: 0xe00d, 0x1b9: 0x0008, 0x1ba: 0x0008, 0x1bb: 0x0008, + 0x1bc: 0xe00d, 0x1bd: 0x0008, 0x1be: 0x0008, 0x1bf: 0x0008, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x0008, 0x1c1: 0x0008, 0x1c2: 0x0008, 0x1c3: 0x0008, 0x1c4: 0x01e9, 0x1c5: 0x01e9, + 0x1c6: 0x01e9, 0x1c7: 0x01fd, 0x1c8: 0x0215, 0x1c9: 0x022d, 0x1ca: 0x0245, 0x1cb: 0x025d, + 0x1cc: 0x0275, 0x1cd: 0xe01d, 0x1ce: 0x0008, 0x1cf: 0xe0fd, 0x1d0: 0x0008, 0x1d1: 0xe01d, + 0x1d2: 0x0008, 0x1d3: 0xe03d, 0x1d4: 0x0008, 0x1d5: 0xe01d, 0x1d6: 0x0008, 0x1d7: 0xe07d, + 0x1d8: 0x0008, 0x1d9: 0xe01d, 0x1da: 0x0008, 0x1db: 0xe03d, 0x1dc: 0x0008, 0x1dd: 0x0008, + 0x1de: 0xe00d, 0x1df: 0x0008, 0x1e0: 0xe00d, 0x1e1: 0x0008, 0x1e2: 0xe00d, 0x1e3: 0x0008, + 0x1e4: 0xe00d, 0x1e5: 0x0008, 0x1e6: 0xe00d, 0x1e7: 0x0008, 0x1e8: 0xe00d, 0x1e9: 0x0008, + 0x1ea: 0xe00d, 0x1eb: 0x0008, 0x1ec: 0xe00d, 0x1ed: 0x0008, 0x1ee: 0xe00d, 0x1ef: 0x0008, + 0x1f0: 0x0008, 0x1f1: 0x028d, 0x1f2: 0x02a5, 0x1f3: 0x02bd, 0x1f4: 0xe00d, 0x1f5: 0x0008, + 0x1f6: 0x02d5, 0x1f7: 0x02ed, 0x1f8: 0xe00d, 0x1f9: 0x0008, 0x1fa: 0xe00d, 0x1fb: 0x0008, + 0x1fc: 0xe00d, 0x1fd: 0x0008, 0x1fe: 0xe00d, 0x1ff: 0x0008, + // Block 0x8, offset 0x200 + 0x200: 0xe00d, 0x201: 0x0008, 0x202: 0xe00d, 0x203: 0x0008, 0x204: 0xe00d, 0x205: 0x0008, + 0x206: 0xe00d, 0x207: 0x0008, 0x208: 0xe00d, 0x209: 0x0008, 0x20a: 0xe00d, 0x20b: 0x0008, + 0x20c: 0xe00d, 0x20d: 0x0008, 0x20e: 0xe00d, 0x20f: 0x0008, 0x210: 0xe00d, 0x211: 0x0008, + 0x212: 0xe00d, 0x213: 0x0008, 0x214: 0xe00d, 0x215: 0x0008, 0x216: 0xe00d, 0x217: 0x0008, + 0x218: 0xe00d, 0x219: 0x0008, 0x21a: 0xe00d, 0x21b: 0x0008, 0x21c: 0xe00d, 0x21d: 0x0008, + 0x21e: 0xe00d, 0x21f: 0x0008, 0x220: 0x0305, 0x221: 0x0008, 0x222: 0xe00d, 0x223: 0x0008, + 0x224: 0xe00d, 0x225: 0x0008, 0x226: 0xe00d, 0x227: 0x0008, 0x228: 0xe00d, 0x229: 0x0008, + 0x22a: 0xe00d, 0x22b: 0x0008, 0x22c: 0xe00d, 0x22d: 0x0008, 0x22e: 0xe00d, 0x22f: 0x0008, + 0x230: 0xe00d, 0x231: 0x0008, 0x232: 0xe00d, 0x233: 0x0008, 0x234: 0x0008, 0x235: 0x0008, + 0x236: 0x0008, 0x237: 0x0008, 0x238: 0x0008, 0x239: 0x0008, 0x23a: 0x0209, 0x23b: 0xe03d, + 0x23c: 0x0008, 0x23d: 0x031d, 0x23e: 0x0229, 0x23f: 0x0008, + // Block 0x9, offset 0x240 + 0x240: 0x0008, 0x241: 0x0008, 0x242: 0x0018, 0x243: 0x0018, 0x244: 0x0018, 0x245: 0x0018, + 0x246: 0x0008, 0x247: 0x0008, 0x248: 0x0008, 0x249: 0x0008, 0x24a: 0x0008, 0x24b: 0x0008, + 0x24c: 0x0008, 0x24d: 0x0008, 0x24e: 0x0008, 0x24f: 0x0008, 0x250: 0x0008, 0x251: 0x0008, + 0x252: 0x0018, 0x253: 0x0018, 0x254: 0x0018, 0x255: 0x0018, 0x256: 0x0018, 0x257: 0x0018, + 0x258: 0x029a, 0x259: 0x02ba, 0x25a: 0x02da, 0x25b: 0x02fa, 0x25c: 0x031a, 0x25d: 0x033a, + 0x25e: 0x0018, 0x25f: 0x0018, 0x260: 0x03ad, 0x261: 0x0359, 0x262: 0x01d9, 0x263: 0x0369, + 0x264: 0x03c5, 0x265: 0x0018, 0x266: 0x0018, 0x267: 0x0018, 0x268: 0x0018, 0x269: 0x0018, + 0x26a: 0x0018, 0x26b: 0x0018, 0x26c: 0x0008, 0x26d: 0x0018, 0x26e: 0x0008, 0x26f: 0x0018, + 0x270: 0x0018, 0x271: 0x0018, 0x272: 0x0018, 0x273: 0x0018, 0x274: 0x0018, 0x275: 0x0018, + 0x276: 0x0018, 0x277: 0x0018, 0x278: 0x0018, 0x279: 0x0018, 0x27a: 0x0018, 0x27b: 0x0018, + 0x27c: 0x0018, 0x27d: 0x0018, 0x27e: 0x0018, 0x27f: 0x0018, + // Block 0xa, offset 0x280 + 0x280: 0x03dd, 0x281: 0x03dd, 0x282: 0x3308, 0x283: 0x03f5, 0x284: 0x0379, 0x285: 0x040d, + 0x286: 0x3308, 0x287: 0x3308, 0x288: 0x3308, 0x289: 0x3308, 0x28a: 0x3308, 0x28b: 0x3308, + 0x28c: 0x3308, 0x28d: 0x3308, 0x28e: 0x3308, 0x28f: 0x33c0, 0x290: 0x3308, 0x291: 0x3308, + 0x292: 0x3308, 0x293: 0x3308, 0x294: 0x3308, 0x295: 0x3308, 0x296: 0x3308, 0x297: 0x3308, + 0x298: 0x3308, 0x299: 0x3308, 0x29a: 0x3308, 0x29b: 0x3308, 0x29c: 0x3308, 0x29d: 0x3308, + 0x29e: 0x3308, 0x29f: 0x3308, 0x2a0: 0x3308, 0x2a1: 0x3308, 0x2a2: 0x3308, 0x2a3: 0x3308, + 0x2a4: 0x3308, 0x2a5: 0x3308, 0x2a6: 0x3308, 0x2a7: 0x3308, 0x2a8: 0x3308, 0x2a9: 0x3308, + 0x2aa: 0x3308, 0x2ab: 0x3308, 0x2ac: 0x3308, 0x2ad: 0x3308, 0x2ae: 0x3308, 0x2af: 0x3308, + 0x2b0: 0xe00d, 0x2b1: 0x0008, 0x2b2: 0xe00d, 0x2b3: 0x0008, 0x2b4: 0x0425, 0x2b5: 0x0008, + 0x2b6: 0xe00d, 0x2b7: 0x0008, 0x2b8: 0x0040, 0x2b9: 0x0040, 0x2ba: 0x03a2, 0x2bb: 0x0008, + 0x2bc: 0x0008, 0x2bd: 0x0008, 0x2be: 0x03c2, 0x2bf: 0x043d, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x0040, 0x2c1: 0x0040, 0x2c2: 0x0040, 0x2c3: 0x0040, 0x2c4: 0x008a, 0x2c5: 0x03d2, + 0x2c6: 0xe155, 0x2c7: 0x0455, 0x2c8: 0xe12d, 0x2c9: 0xe13d, 0x2ca: 0xe12d, 0x2cb: 0x0040, + 0x2cc: 0x03dd, 0x2cd: 0x0040, 0x2ce: 0x046d, 0x2cf: 0x0485, 0x2d0: 0x0008, 0x2d1: 0xe105, + 0x2d2: 0xe105, 0x2d3: 0xe105, 0x2d4: 0xe105, 0x2d5: 0xe105, 0x2d6: 0xe105, 0x2d7: 0xe105, + 0x2d8: 0xe105, 0x2d9: 0xe105, 0x2da: 0xe105, 0x2db: 0xe105, 0x2dc: 0xe105, 0x2dd: 0xe105, + 0x2de: 0xe105, 0x2df: 0xe105, 0x2e0: 0x049d, 0x2e1: 0x049d, 0x2e2: 0x0040, 0x2e3: 0x049d, + 0x2e4: 0x049d, 0x2e5: 0x049d, 0x2e6: 0x049d, 0x2e7: 0x049d, 0x2e8: 0x049d, 0x2e9: 0x049d, + 0x2ea: 0x049d, 0x2eb: 0x049d, 0x2ec: 0x0008, 0x2ed: 0x0008, 0x2ee: 0x0008, 0x2ef: 0x0008, + 0x2f0: 0x0008, 0x2f1: 0x0008, 0x2f2: 0x0008, 0x2f3: 0x0008, 0x2f4: 0x0008, 0x2f5: 0x0008, + 0x2f6: 0x0008, 0x2f7: 0x0008, 0x2f8: 0x0008, 0x2f9: 0x0008, 0x2fa: 0x0008, 0x2fb: 0x0008, + 0x2fc: 0x0008, 0x2fd: 0x0008, 0x2fe: 0x0008, 0x2ff: 0x0008, + // Block 0xc, offset 0x300 + 0x300: 0x0008, 0x301: 0x0008, 0x302: 0xe00f, 0x303: 0x0008, 0x304: 0x0008, 0x305: 0x0008, + 0x306: 0x0008, 0x307: 0x0008, 0x308: 0x0008, 0x309: 0x0008, 0x30a: 0x0008, 0x30b: 0x0008, + 0x30c: 0x0008, 0x30d: 0x0008, 0x30e: 0x0008, 0x30f: 0xe0c5, 0x310: 0x04b5, 0x311: 0x04cd, + 0x312: 0xe0bd, 0x313: 0xe0f5, 0x314: 0xe0fd, 0x315: 0xe09d, 0x316: 0xe0b5, 0x317: 0x0008, + 0x318: 0xe00d, 0x319: 0x0008, 0x31a: 0xe00d, 0x31b: 0x0008, 0x31c: 0xe00d, 0x31d: 0x0008, + 0x31e: 0xe00d, 0x31f: 0x0008, 0x320: 0xe00d, 0x321: 0x0008, 0x322: 0xe00d, 0x323: 0x0008, + 0x324: 0xe00d, 0x325: 0x0008, 0x326: 0xe00d, 0x327: 0x0008, 0x328: 0xe00d, 0x329: 0x0008, + 0x32a: 0xe00d, 0x32b: 0x0008, 0x32c: 0xe00d, 0x32d: 0x0008, 0x32e: 0xe00d, 0x32f: 0x0008, + 0x330: 0x04e5, 0x331: 0xe185, 0x332: 0xe18d, 0x333: 0x0008, 0x334: 0x04fd, 0x335: 0x03dd, + 0x336: 0x0018, 0x337: 0xe07d, 0x338: 0x0008, 0x339: 0xe1d5, 0x33a: 0xe00d, 0x33b: 0x0008, + 0x33c: 0x0008, 0x33d: 0x0515, 0x33e: 0x052d, 0x33f: 0x052d, + // Block 0xd, offset 0x340 + 0x340: 0x0008, 0x341: 0x0008, 0x342: 0x0008, 0x343: 0x0008, 0x344: 0x0008, 0x345: 0x0008, + 0x346: 0x0008, 0x347: 0x0008, 0x348: 0x0008, 0x349: 0x0008, 0x34a: 0x0008, 0x34b: 0x0008, + 0x34c: 0x0008, 0x34d: 0x0008, 0x34e: 0x0008, 0x34f: 0x0008, 0x350: 0x0008, 0x351: 0x0008, + 0x352: 0x0008, 0x353: 0x0008, 0x354: 0x0008, 0x355: 0x0008, 0x356: 0x0008, 0x357: 0x0008, + 0x358: 0x0008, 0x359: 0x0008, 0x35a: 0x0008, 0x35b: 0x0008, 0x35c: 0x0008, 0x35d: 0x0008, + 0x35e: 0x0008, 0x35f: 0x0008, 0x360: 0xe00d, 0x361: 0x0008, 0x362: 0xe00d, 0x363: 0x0008, + 0x364: 0xe00d, 0x365: 0x0008, 0x366: 0xe00d, 0x367: 0x0008, 0x368: 0xe00d, 0x369: 0x0008, + 0x36a: 0xe00d, 0x36b: 0x0008, 0x36c: 0xe00d, 0x36d: 0x0008, 0x36e: 0xe00d, 0x36f: 0x0008, + 0x370: 0xe00d, 0x371: 0x0008, 0x372: 0xe00d, 0x373: 0x0008, 0x374: 0xe00d, 0x375: 0x0008, + 0x376: 0xe00d, 0x377: 0x0008, 0x378: 0xe00d, 0x379: 0x0008, 0x37a: 0xe00d, 0x37b: 0x0008, + 0x37c: 0xe00d, 0x37d: 0x0008, 0x37e: 0xe00d, 0x37f: 0x0008, + // Block 0xe, offset 0x380 + 0x380: 0xe00d, 0x381: 0x0008, 0x382: 0x0018, 0x383: 0x3308, 0x384: 0x3308, 0x385: 0x3308, + 0x386: 0x3308, 0x387: 0x3308, 0x388: 0x3318, 0x389: 0x3318, 0x38a: 0xe00d, 0x38b: 0x0008, + 0x38c: 0xe00d, 0x38d: 0x0008, 0x38e: 0xe00d, 0x38f: 0x0008, 0x390: 0xe00d, 0x391: 0x0008, + 0x392: 0xe00d, 0x393: 0x0008, 0x394: 0xe00d, 0x395: 0x0008, 0x396: 0xe00d, 0x397: 0x0008, + 0x398: 0xe00d, 0x399: 0x0008, 0x39a: 0xe00d, 0x39b: 0x0008, 0x39c: 0xe00d, 0x39d: 0x0008, + 0x39e: 0xe00d, 0x39f: 0x0008, 0x3a0: 0xe00d, 0x3a1: 0x0008, 0x3a2: 0xe00d, 0x3a3: 0x0008, + 0x3a4: 0xe00d, 0x3a5: 0x0008, 0x3a6: 0xe00d, 0x3a7: 0x0008, 0x3a8: 0xe00d, 0x3a9: 0x0008, + 0x3aa: 0xe00d, 0x3ab: 0x0008, 0x3ac: 0xe00d, 0x3ad: 0x0008, 0x3ae: 0xe00d, 0x3af: 0x0008, + 0x3b0: 0xe00d, 0x3b1: 0x0008, 0x3b2: 0xe00d, 0x3b3: 0x0008, 0x3b4: 0xe00d, 0x3b5: 0x0008, + 0x3b6: 0xe00d, 0x3b7: 0x0008, 0x3b8: 0xe00d, 0x3b9: 0x0008, 0x3ba: 0xe00d, 0x3bb: 0x0008, + 0x3bc: 0xe00d, 0x3bd: 0x0008, 0x3be: 0xe00d, 0x3bf: 0x0008, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x0040, 0x3c1: 0xe01d, 0x3c2: 0x0008, 0x3c3: 0xe03d, 0x3c4: 0x0008, 0x3c5: 0xe01d, + 0x3c6: 0x0008, 0x3c7: 0xe07d, 0x3c8: 0x0008, 0x3c9: 0xe01d, 0x3ca: 0x0008, 0x3cb: 0xe03d, + 0x3cc: 0x0008, 0x3cd: 0xe01d, 0x3ce: 0x0008, 0x3cf: 0x0008, 0x3d0: 0xe00d, 0x3d1: 0x0008, + 0x3d2: 0xe00d, 0x3d3: 0x0008, 0x3d4: 0xe00d, 0x3d5: 0x0008, 0x3d6: 0xe00d, 0x3d7: 0x0008, + 0x3d8: 0xe00d, 0x3d9: 0x0008, 0x3da: 0xe00d, 0x3db: 0x0008, 0x3dc: 0xe00d, 0x3dd: 0x0008, + 0x3de: 0xe00d, 0x3df: 0x0008, 0x3e0: 0xe00d, 0x3e1: 0x0008, 0x3e2: 0xe00d, 0x3e3: 0x0008, + 0x3e4: 0xe00d, 0x3e5: 0x0008, 0x3e6: 0xe00d, 0x3e7: 0x0008, 0x3e8: 0xe00d, 0x3e9: 0x0008, + 0x3ea: 0xe00d, 0x3eb: 0x0008, 0x3ec: 0xe00d, 0x3ed: 0x0008, 0x3ee: 0xe00d, 0x3ef: 0x0008, + 0x3f0: 0xe00d, 0x3f1: 0x0008, 0x3f2: 0xe00d, 0x3f3: 0x0008, 0x3f4: 0xe00d, 0x3f5: 0x0008, + 0x3f6: 0xe00d, 0x3f7: 0x0008, 0x3f8: 0xe00d, 0x3f9: 0x0008, 0x3fa: 0xe00d, 0x3fb: 0x0008, + 0x3fc: 0xe00d, 0x3fd: 0x0008, 0x3fe: 0xe00d, 0x3ff: 0x0008, + // Block 0x10, offset 0x400 + 0x400: 0xe00d, 0x401: 0x0008, 0x402: 0xe00d, 0x403: 0x0008, 0x404: 0xe00d, 0x405: 0x0008, + 0x406: 0xe00d, 0x407: 0x0008, 0x408: 0xe00d, 0x409: 0x0008, 0x40a: 0xe00d, 0x40b: 0x0008, + 0x40c: 0xe00d, 0x40d: 0x0008, 0x40e: 0xe00d, 0x40f: 0x0008, 0x410: 0xe00d, 0x411: 0x0008, + 0x412: 0xe00d, 0x413: 0x0008, 0x414: 0xe00d, 0x415: 0x0008, 0x416: 0xe00d, 0x417: 0x0008, + 0x418: 0xe00d, 0x419: 0x0008, 0x41a: 0xe00d, 0x41b: 0x0008, 0x41c: 0xe00d, 0x41d: 0x0008, + 0x41e: 0xe00d, 0x41f: 0x0008, 0x420: 0xe00d, 0x421: 0x0008, 0x422: 0xe00d, 0x423: 0x0008, + 0x424: 0xe00d, 0x425: 0x0008, 0x426: 0xe00d, 0x427: 0x0008, 0x428: 0xe00d, 0x429: 0x0008, + 0x42a: 0xe00d, 0x42b: 0x0008, 0x42c: 0xe00d, 0x42d: 0x0008, 0x42e: 0xe00d, 0x42f: 0x0008, + 0x430: 0x0040, 0x431: 0x03f5, 0x432: 0x03f5, 0x433: 0x03f5, 0x434: 0x03f5, 0x435: 0x03f5, + 0x436: 0x03f5, 0x437: 0x03f5, 0x438: 0x03f5, 0x439: 0x03f5, 0x43a: 0x03f5, 0x43b: 0x03f5, + 0x43c: 0x03f5, 0x43d: 0x03f5, 0x43e: 0x03f5, 0x43f: 0x03f5, + // Block 0x11, offset 0x440 + 0x440: 0x0840, 0x441: 0x0840, 0x442: 0x0840, 0x443: 0x0840, 0x444: 0x0840, 0x445: 0x0840, + 0x446: 0x0018, 0x447: 0x0018, 0x448: 0x0818, 0x449: 0x0018, 0x44a: 0x0018, 0x44b: 0x0818, + 0x44c: 0x0018, 0x44d: 0x0818, 0x44e: 0x0018, 0x44f: 0x0018, 0x450: 0x3308, 0x451: 0x3308, + 0x452: 0x3308, 0x453: 0x3308, 0x454: 0x3308, 0x455: 0x3308, 0x456: 0x3308, 0x457: 0x3308, + 0x458: 0x3308, 0x459: 0x3308, 0x45a: 0x3308, 0x45b: 0x0818, 0x45c: 0x0b40, 0x45d: 0x0040, + 0x45e: 0x0818, 0x45f: 0x0818, 0x460: 0x0a08, 0x461: 0x0808, 0x462: 0x0c08, 0x463: 0x0c08, + 0x464: 0x0c08, 0x465: 0x0c08, 0x466: 0x0a08, 0x467: 0x0c08, 0x468: 0x0a08, 0x469: 0x0c08, + 0x46a: 0x0a08, 0x46b: 0x0a08, 0x46c: 0x0a08, 0x46d: 0x0a08, 0x46e: 0x0a08, 0x46f: 0x0c08, + 0x470: 0x0c08, 0x471: 0x0c08, 0x472: 0x0c08, 0x473: 0x0a08, 0x474: 0x0a08, 0x475: 0x0a08, + 0x476: 0x0a08, 0x477: 0x0a08, 0x478: 0x0a08, 0x479: 0x0a08, 0x47a: 0x0a08, 0x47b: 0x0a08, + 0x47c: 0x0a08, 0x47d: 0x0a08, 0x47e: 0x0a08, 0x47f: 0x0a08, + // Block 0x12, offset 0x480 + 0x480: 0x0818, 0x481: 0x0a08, 0x482: 0x0a08, 0x483: 0x0a08, 0x484: 0x0a08, 0x485: 0x0a08, + 0x486: 0x0a08, 0x487: 0x0a08, 0x488: 0x0c08, 0x489: 0x0a08, 0x48a: 0x0a08, 0x48b: 0x3308, + 0x48c: 0x3308, 0x48d: 0x3308, 0x48e: 0x3308, 0x48f: 0x3308, 0x490: 0x3308, 0x491: 0x3308, + 0x492: 0x3308, 0x493: 0x3308, 0x494: 0x3308, 0x495: 0x3308, 0x496: 0x3308, 0x497: 0x3308, + 0x498: 0x3308, 0x499: 0x3308, 0x49a: 0x3308, 0x49b: 0x3308, 0x49c: 0x3308, 0x49d: 0x3308, + 0x49e: 0x3308, 0x49f: 0x3308, 0x4a0: 0x0808, 0x4a1: 0x0808, 0x4a2: 0x0808, 0x4a3: 0x0808, + 0x4a4: 0x0808, 0x4a5: 0x0808, 0x4a6: 0x0808, 0x4a7: 0x0808, 0x4a8: 0x0808, 0x4a9: 0x0808, + 0x4aa: 0x0018, 0x4ab: 0x0818, 0x4ac: 0x0818, 0x4ad: 0x0818, 0x4ae: 0x0a08, 0x4af: 0x0a08, + 0x4b0: 0x3308, 0x4b1: 0x0c08, 0x4b2: 0x0c08, 0x4b3: 0x0c08, 0x4b4: 0x0808, 0x4b5: 0x0429, + 0x4b6: 0x0451, 0x4b7: 0x0479, 0x4b8: 0x04a1, 0x4b9: 0x0a08, 0x4ba: 0x0a08, 0x4bb: 0x0a08, + 0x4bc: 0x0a08, 0x4bd: 0x0a08, 0x4be: 0x0a08, 0x4bf: 0x0a08, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x0c08, 0x4c1: 0x0a08, 0x4c2: 0x0a08, 0x4c3: 0x0c08, 0x4c4: 0x0c08, 0x4c5: 0x0c08, + 0x4c6: 0x0c08, 0x4c7: 0x0c08, 0x4c8: 0x0c08, 0x4c9: 0x0c08, 0x4ca: 0x0c08, 0x4cb: 0x0c08, + 0x4cc: 0x0a08, 0x4cd: 0x0c08, 0x4ce: 0x0a08, 0x4cf: 0x0c08, 0x4d0: 0x0a08, 0x4d1: 0x0a08, + 0x4d2: 0x0c08, 0x4d3: 0x0c08, 0x4d4: 0x0818, 0x4d5: 0x0c08, 0x4d6: 0x3308, 0x4d7: 0x3308, + 0x4d8: 0x3308, 0x4d9: 0x3308, 0x4da: 0x3308, 0x4db: 0x3308, 0x4dc: 0x3308, 0x4dd: 0x0840, + 0x4de: 0x0018, 0x4df: 0x3308, 0x4e0: 0x3308, 0x4e1: 0x3308, 0x4e2: 0x3308, 0x4e3: 0x3308, + 0x4e4: 0x3308, 0x4e5: 0x0808, 0x4e6: 0x0808, 0x4e7: 0x3308, 0x4e8: 0x3308, 0x4e9: 0x0018, + 0x4ea: 0x3308, 0x4eb: 0x3308, 0x4ec: 0x3308, 0x4ed: 0x3308, 0x4ee: 0x0c08, 0x4ef: 0x0c08, + 0x4f0: 0x0008, 0x4f1: 0x0008, 0x4f2: 0x0008, 0x4f3: 0x0008, 0x4f4: 0x0008, 0x4f5: 0x0008, + 0x4f6: 0x0008, 0x4f7: 0x0008, 0x4f8: 0x0008, 0x4f9: 0x0008, 0x4fa: 0x0a08, 0x4fb: 0x0a08, + 0x4fc: 0x0a08, 0x4fd: 0x0808, 0x4fe: 0x0808, 0x4ff: 0x0a08, + // Block 0x14, offset 0x500 + 0x500: 0x0818, 0x501: 0x0818, 0x502: 0x0818, 0x503: 0x0818, 0x504: 0x0818, 0x505: 0x0818, + 0x506: 0x0818, 0x507: 0x0818, 0x508: 0x0818, 0x509: 0x0818, 0x50a: 0x0818, 0x50b: 0x0818, + 0x50c: 0x0818, 0x50d: 0x0818, 0x50e: 0x0040, 0x50f: 0x0b40, 0x510: 0x0c08, 0x511: 0x3308, + 0x512: 0x0a08, 0x513: 0x0a08, 0x514: 0x0a08, 0x515: 0x0c08, 0x516: 0x0c08, 0x517: 0x0c08, + 0x518: 0x0c08, 0x519: 0x0c08, 0x51a: 0x0a08, 0x51b: 0x0a08, 0x51c: 0x0a08, 0x51d: 0x0a08, + 0x51e: 0x0c08, 0x51f: 0x0a08, 0x520: 0x0a08, 0x521: 0x0a08, 0x522: 0x0a08, 0x523: 0x0a08, + 0x524: 0x0a08, 0x525: 0x0a08, 0x526: 0x0a08, 0x527: 0x0a08, 0x528: 0x0c08, 0x529: 0x0a08, + 0x52a: 0x0c08, 0x52b: 0x0a08, 0x52c: 0x0c08, 0x52d: 0x0a08, 0x52e: 0x0a08, 0x52f: 0x0c08, + 0x530: 0x3308, 0x531: 0x3308, 0x532: 0x3308, 0x533: 0x3308, 0x534: 0x3308, 0x535: 0x3308, + 0x536: 0x3308, 0x537: 0x3308, 0x538: 0x3308, 0x539: 0x3308, 0x53a: 0x3308, 0x53b: 0x3308, + 0x53c: 0x3308, 0x53d: 0x3308, 0x53e: 0x3308, 0x53f: 0x3308, + // Block 0x15, offset 0x540 + 0x540: 0x0c08, 0x541: 0x0a08, 0x542: 0x0a08, 0x543: 0x0a08, 0x544: 0x0a08, 0x545: 0x0a08, + 0x546: 0x0c08, 0x547: 0x0c08, 0x548: 0x0a08, 0x549: 0x0c08, 0x54a: 0x0a08, 0x54b: 0x0a08, + 0x54c: 0x0a08, 0x54d: 0x0a08, 0x54e: 0x0a08, 0x54f: 0x0a08, 0x550: 0x0a08, 0x551: 0x0a08, + 0x552: 0x0a08, 0x553: 0x0a08, 0x554: 0x0c08, 0x555: 0x0a08, 0x556: 0x0808, 0x557: 0x0808, + 0x558: 0x0808, 0x559: 0x3308, 0x55a: 0x3308, 0x55b: 0x3308, 0x55c: 0x0040, 0x55d: 0x0040, + 0x55e: 0x0818, 0x55f: 0x0040, 0x560: 0x0a08, 0x561: 0x0808, 0x562: 0x0a08, 0x563: 0x0a08, + 0x564: 0x0a08, 0x565: 0x0a08, 0x566: 0x0808, 0x567: 0x0c08, 0x568: 0x0a08, 0x569: 0x0c08, + 0x56a: 0x0c08, 0x56b: 0x0040, 0x56c: 0x0040, 0x56d: 0x0040, 0x56e: 0x0040, 0x56f: 0x0040, + 0x570: 0x0040, 0x571: 0x0040, 0x572: 0x0040, 0x573: 0x0040, 0x574: 0x0040, 0x575: 0x0040, + 0x576: 0x0040, 0x577: 0x0040, 0x578: 0x0040, 0x579: 0x0040, 0x57a: 0x0040, 0x57b: 0x0040, + 0x57c: 0x0040, 0x57d: 0x0040, 0x57e: 0x0040, 0x57f: 0x0040, + // Block 0x16, offset 0x580 + 0x580: 0x3008, 0x581: 0x3308, 0x582: 0x3308, 0x583: 0x3308, 0x584: 0x3308, 0x585: 0x3308, + 0x586: 0x3308, 0x587: 0x3308, 0x588: 0x3308, 0x589: 0x3008, 0x58a: 0x3008, 0x58b: 0x3008, + 0x58c: 0x3008, 0x58d: 0x3b08, 0x58e: 0x3008, 0x58f: 0x3008, 0x590: 0x0008, 0x591: 0x3308, + 0x592: 0x3308, 0x593: 0x3308, 0x594: 0x3308, 0x595: 0x3308, 0x596: 0x3308, 0x597: 0x3308, + 0x598: 0x04c9, 0x599: 0x0501, 0x59a: 0x0539, 0x59b: 0x0571, 0x59c: 0x05a9, 0x59d: 0x05e1, + 0x59e: 0x0619, 0x59f: 0x0651, 0x5a0: 0x0008, 0x5a1: 0x0008, 0x5a2: 0x3308, 0x5a3: 0x3308, + 0x5a4: 0x0018, 0x5a5: 0x0018, 0x5a6: 0x0008, 0x5a7: 0x0008, 0x5a8: 0x0008, 0x5a9: 0x0008, + 0x5aa: 0x0008, 0x5ab: 0x0008, 0x5ac: 0x0008, 0x5ad: 0x0008, 0x5ae: 0x0008, 0x5af: 0x0008, + 0x5b0: 0x0018, 0x5b1: 0x0008, 0x5b2: 0x0008, 0x5b3: 0x0008, 0x5b4: 0x0008, 0x5b5: 0x0008, + 0x5b6: 0x0008, 0x5b7: 0x0008, 0x5b8: 0x0008, 0x5b9: 0x0008, 0x5ba: 0x0008, 0x5bb: 0x0008, + 0x5bc: 0x0008, 0x5bd: 0x0008, 0x5be: 0x0008, 0x5bf: 0x0008, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x0008, 0x5c1: 0x3308, 0x5c2: 0x3008, 0x5c3: 0x3008, 0x5c4: 0x0040, 0x5c5: 0x0008, + 0x5c6: 0x0008, 0x5c7: 0x0008, 0x5c8: 0x0008, 0x5c9: 0x0008, 0x5ca: 0x0008, 0x5cb: 0x0008, + 0x5cc: 0x0008, 0x5cd: 0x0040, 0x5ce: 0x0040, 0x5cf: 0x0008, 0x5d0: 0x0008, 0x5d1: 0x0040, + 0x5d2: 0x0040, 0x5d3: 0x0008, 0x5d4: 0x0008, 0x5d5: 0x0008, 0x5d6: 0x0008, 0x5d7: 0x0008, + 0x5d8: 0x0008, 0x5d9: 0x0008, 0x5da: 0x0008, 0x5db: 0x0008, 0x5dc: 0x0008, 0x5dd: 0x0008, + 0x5de: 0x0008, 0x5df: 0x0008, 0x5e0: 0x0008, 0x5e1: 0x0008, 0x5e2: 0x0008, 0x5e3: 0x0008, + 0x5e4: 0x0008, 0x5e5: 0x0008, 0x5e6: 0x0008, 0x5e7: 0x0008, 0x5e8: 0x0008, 0x5e9: 0x0040, + 0x5ea: 0x0008, 0x5eb: 0x0008, 0x5ec: 0x0008, 0x5ed: 0x0008, 0x5ee: 0x0008, 0x5ef: 0x0008, + 0x5f0: 0x0008, 0x5f1: 0x0040, 0x5f2: 0x0008, 0x5f3: 0x0040, 0x5f4: 0x0040, 0x5f5: 0x0040, + 0x5f6: 0x0008, 0x5f7: 0x0008, 0x5f8: 0x0008, 0x5f9: 0x0008, 0x5fa: 0x0040, 0x5fb: 0x0040, + 0x5fc: 0x3308, 0x5fd: 0x0008, 0x5fe: 0x3008, 0x5ff: 0x3008, + // Block 0x18, offset 0x600 + 0x600: 0x3008, 0x601: 0x3308, 0x602: 0x3308, 0x603: 0x3308, 0x604: 0x3308, 0x605: 0x0040, + 0x606: 0x0040, 0x607: 0x3008, 0x608: 0x3008, 0x609: 0x0040, 0x60a: 0x0040, 0x60b: 0x3008, + 0x60c: 0x3008, 0x60d: 0x3b08, 0x60e: 0x0008, 0x60f: 0x0040, 0x610: 0x0040, 0x611: 0x0040, + 0x612: 0x0040, 0x613: 0x0040, 0x614: 0x0040, 0x615: 0x0040, 0x616: 0x0040, 0x617: 0x3008, + 0x618: 0x0040, 0x619: 0x0040, 0x61a: 0x0040, 0x61b: 0x0040, 0x61c: 0x0689, 0x61d: 0x06c1, + 0x61e: 0x0040, 0x61f: 0x06f9, 0x620: 0x0008, 0x621: 0x0008, 0x622: 0x3308, 0x623: 0x3308, + 0x624: 0x0040, 0x625: 0x0040, 0x626: 0x0008, 0x627: 0x0008, 0x628: 0x0008, 0x629: 0x0008, + 0x62a: 0x0008, 0x62b: 0x0008, 0x62c: 0x0008, 0x62d: 0x0008, 0x62e: 0x0008, 0x62f: 0x0008, + 0x630: 0x0008, 0x631: 0x0008, 0x632: 0x0018, 0x633: 0x0018, 0x634: 0x0018, 0x635: 0x0018, + 0x636: 0x0018, 0x637: 0x0018, 0x638: 0x0018, 0x639: 0x0018, 0x63a: 0x0018, 0x63b: 0x0018, + 0x63c: 0x0008, 0x63d: 0x0018, 0x63e: 0x0040, 0x63f: 0x0040, + // Block 0x19, offset 0x640 + 0x640: 0x0040, 0x641: 0x3308, 0x642: 0x3308, 0x643: 0x3008, 0x644: 0x0040, 0x645: 0x0008, + 0x646: 0x0008, 0x647: 0x0008, 0x648: 0x0008, 0x649: 0x0008, 0x64a: 0x0008, 0x64b: 0x0040, + 0x64c: 0x0040, 0x64d: 0x0040, 0x64e: 0x0040, 0x64f: 0x0008, 0x650: 0x0008, 0x651: 0x0040, + 0x652: 0x0040, 0x653: 0x0008, 0x654: 0x0008, 0x655: 0x0008, 0x656: 0x0008, 0x657: 0x0008, + 0x658: 0x0008, 0x659: 0x0008, 0x65a: 0x0008, 0x65b: 0x0008, 0x65c: 0x0008, 0x65d: 0x0008, + 0x65e: 0x0008, 0x65f: 0x0008, 0x660: 0x0008, 0x661: 0x0008, 0x662: 0x0008, 0x663: 0x0008, + 0x664: 0x0008, 0x665: 0x0008, 0x666: 0x0008, 0x667: 0x0008, 0x668: 0x0008, 0x669: 0x0040, + 0x66a: 0x0008, 0x66b: 0x0008, 0x66c: 0x0008, 0x66d: 0x0008, 0x66e: 0x0008, 0x66f: 0x0008, + 0x670: 0x0008, 0x671: 0x0040, 0x672: 0x0008, 0x673: 0x0731, 0x674: 0x0040, 0x675: 0x0008, + 0x676: 0x0769, 0x677: 0x0040, 0x678: 0x0008, 0x679: 0x0008, 0x67a: 0x0040, 0x67b: 0x0040, + 0x67c: 0x3308, 0x67d: 0x0040, 0x67e: 0x3008, 0x67f: 0x3008, + // Block 0x1a, offset 0x680 + 0x680: 0x3008, 0x681: 0x3308, 0x682: 0x3308, 0x683: 0x0040, 0x684: 0x0040, 0x685: 0x0040, + 0x686: 0x0040, 0x687: 0x3308, 0x688: 0x3308, 0x689: 0x0040, 0x68a: 0x0040, 0x68b: 0x3308, + 0x68c: 0x3308, 0x68d: 0x3b08, 0x68e: 0x0040, 0x68f: 0x0040, 0x690: 0x0040, 0x691: 0x3308, + 0x692: 0x0040, 0x693: 0x0040, 0x694: 0x0040, 0x695: 0x0040, 0x696: 0x0040, 0x697: 0x0040, + 0x698: 0x0040, 0x699: 0x07a1, 0x69a: 0x07d9, 0x69b: 0x0811, 0x69c: 0x0008, 0x69d: 0x0040, + 0x69e: 0x0849, 0x69f: 0x0040, 0x6a0: 0x0040, 0x6a1: 0x0040, 0x6a2: 0x0040, 0x6a3: 0x0040, + 0x6a4: 0x0040, 0x6a5: 0x0040, 0x6a6: 0x0008, 0x6a7: 0x0008, 0x6a8: 0x0008, 0x6a9: 0x0008, + 0x6aa: 0x0008, 0x6ab: 0x0008, 0x6ac: 0x0008, 0x6ad: 0x0008, 0x6ae: 0x0008, 0x6af: 0x0008, + 0x6b0: 0x3308, 0x6b1: 0x3308, 0x6b2: 0x0008, 0x6b3: 0x0008, 0x6b4: 0x0008, 0x6b5: 0x3308, + 0x6b6: 0x0040, 0x6b7: 0x0040, 0x6b8: 0x0040, 0x6b9: 0x0040, 0x6ba: 0x0040, 0x6bb: 0x0040, + 0x6bc: 0x0040, 0x6bd: 0x0040, 0x6be: 0x0040, 0x6bf: 0x0040, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0x0040, 0x6c1: 0x3308, 0x6c2: 0x3308, 0x6c3: 0x3008, 0x6c4: 0x0040, 0x6c5: 0x0008, + 0x6c6: 0x0008, 0x6c7: 0x0008, 0x6c8: 0x0008, 0x6c9: 0x0008, 0x6ca: 0x0008, 0x6cb: 0x0008, + 0x6cc: 0x0008, 0x6cd: 0x0008, 0x6ce: 0x0040, 0x6cf: 0x0008, 0x6d0: 0x0008, 0x6d1: 0x0008, + 0x6d2: 0x0040, 0x6d3: 0x0008, 0x6d4: 0x0008, 0x6d5: 0x0008, 0x6d6: 0x0008, 0x6d7: 0x0008, + 0x6d8: 0x0008, 0x6d9: 0x0008, 0x6da: 0x0008, 0x6db: 0x0008, 0x6dc: 0x0008, 0x6dd: 0x0008, + 0x6de: 0x0008, 0x6df: 0x0008, 0x6e0: 0x0008, 0x6e1: 0x0008, 0x6e2: 0x0008, 0x6e3: 0x0008, + 0x6e4: 0x0008, 0x6e5: 0x0008, 0x6e6: 0x0008, 0x6e7: 0x0008, 0x6e8: 0x0008, 0x6e9: 0x0040, + 0x6ea: 0x0008, 0x6eb: 0x0008, 0x6ec: 0x0008, 0x6ed: 0x0008, 0x6ee: 0x0008, 0x6ef: 0x0008, + 0x6f0: 0x0008, 0x6f1: 0x0040, 0x6f2: 0x0008, 0x6f3: 0x0008, 0x6f4: 0x0040, 0x6f5: 0x0008, + 0x6f6: 0x0008, 0x6f7: 0x0008, 0x6f8: 0x0008, 0x6f9: 0x0008, 0x6fa: 0x0040, 0x6fb: 0x0040, + 0x6fc: 0x3308, 0x6fd: 0x0008, 0x6fe: 0x3008, 0x6ff: 0x3008, + // Block 0x1c, offset 0x700 + 0x700: 0x3008, 0x701: 0x3308, 0x702: 0x3308, 0x703: 0x3308, 0x704: 0x3308, 0x705: 0x3308, + 0x706: 0x0040, 0x707: 0x3308, 0x708: 0x3308, 0x709: 0x3008, 0x70a: 0x0040, 0x70b: 0x3008, + 0x70c: 0x3008, 0x70d: 0x3b08, 0x70e: 0x0040, 0x70f: 0x0040, 0x710: 0x0008, 0x711: 0x0040, + 0x712: 0x0040, 0x713: 0x0040, 0x714: 0x0040, 0x715: 0x0040, 0x716: 0x0040, 0x717: 0x0040, + 0x718: 0x0040, 0x719: 0x0040, 0x71a: 0x0040, 0x71b: 0x0040, 0x71c: 0x0040, 0x71d: 0x0040, + 0x71e: 0x0040, 0x71f: 0x0040, 0x720: 0x0008, 0x721: 0x0008, 0x722: 0x3308, 0x723: 0x3308, + 0x724: 0x0040, 0x725: 0x0040, 0x726: 0x0008, 0x727: 0x0008, 0x728: 0x0008, 0x729: 0x0008, + 0x72a: 0x0008, 0x72b: 0x0008, 0x72c: 0x0008, 0x72d: 0x0008, 0x72e: 0x0008, 0x72f: 0x0008, + 0x730: 0x0018, 0x731: 0x0018, 0x732: 0x0040, 0x733: 0x0040, 0x734: 0x0040, 0x735: 0x0040, + 0x736: 0x0040, 0x737: 0x0040, 0x738: 0x0040, 0x739: 0x0008, 0x73a: 0x3308, 0x73b: 0x3308, + 0x73c: 0x3308, 0x73d: 0x3308, 0x73e: 0x3308, 0x73f: 0x3308, + // Block 0x1d, offset 0x740 + 0x740: 0x0040, 0x741: 0x3308, 0x742: 0x3008, 0x743: 0x3008, 0x744: 0x0040, 0x745: 0x0008, + 0x746: 0x0008, 0x747: 0x0008, 0x748: 0x0008, 0x749: 0x0008, 0x74a: 0x0008, 0x74b: 0x0008, + 0x74c: 0x0008, 0x74d: 0x0040, 0x74e: 0x0040, 0x74f: 0x0008, 0x750: 0x0008, 0x751: 0x0040, + 0x752: 0x0040, 0x753: 0x0008, 0x754: 0x0008, 0x755: 0x0008, 0x756: 0x0008, 0x757: 0x0008, + 0x758: 0x0008, 0x759: 0x0008, 0x75a: 0x0008, 0x75b: 0x0008, 0x75c: 0x0008, 0x75d: 0x0008, + 0x75e: 0x0008, 0x75f: 0x0008, 0x760: 0x0008, 0x761: 0x0008, 0x762: 0x0008, 0x763: 0x0008, + 0x764: 0x0008, 0x765: 0x0008, 0x766: 0x0008, 0x767: 0x0008, 0x768: 0x0008, 0x769: 0x0040, + 0x76a: 0x0008, 0x76b: 0x0008, 0x76c: 0x0008, 0x76d: 0x0008, 0x76e: 0x0008, 0x76f: 0x0008, + 0x770: 0x0008, 0x771: 0x0040, 0x772: 0x0008, 0x773: 0x0008, 0x774: 0x0040, 0x775: 0x0008, + 0x776: 0x0008, 0x777: 0x0008, 0x778: 0x0008, 0x779: 0x0008, 0x77a: 0x0040, 0x77b: 0x0040, + 0x77c: 0x3308, 0x77d: 0x0008, 0x77e: 0x3008, 0x77f: 0x3308, + // Block 0x1e, offset 0x780 + 0x780: 0x3008, 0x781: 0x3308, 0x782: 0x3308, 0x783: 0x3308, 0x784: 0x3308, 0x785: 0x0040, + 0x786: 0x0040, 0x787: 0x3008, 0x788: 0x3008, 0x789: 0x0040, 0x78a: 0x0040, 0x78b: 0x3008, + 0x78c: 0x3008, 0x78d: 0x3b08, 0x78e: 0x0040, 0x78f: 0x0040, 0x790: 0x0040, 0x791: 0x0040, + 0x792: 0x0040, 0x793: 0x0040, 0x794: 0x0040, 0x795: 0x0040, 0x796: 0x3308, 0x797: 0x3008, + 0x798: 0x0040, 0x799: 0x0040, 0x79a: 0x0040, 0x79b: 0x0040, 0x79c: 0x0881, 0x79d: 0x08b9, + 0x79e: 0x0040, 0x79f: 0x0008, 0x7a0: 0x0008, 0x7a1: 0x0008, 0x7a2: 0x3308, 0x7a3: 0x3308, + 0x7a4: 0x0040, 0x7a5: 0x0040, 0x7a6: 0x0008, 0x7a7: 0x0008, 0x7a8: 0x0008, 0x7a9: 0x0008, + 0x7aa: 0x0008, 0x7ab: 0x0008, 0x7ac: 0x0008, 0x7ad: 0x0008, 0x7ae: 0x0008, 0x7af: 0x0008, + 0x7b0: 0x0018, 0x7b1: 0x0008, 0x7b2: 0x0018, 0x7b3: 0x0018, 0x7b4: 0x0018, 0x7b5: 0x0018, + 0x7b6: 0x0018, 0x7b7: 0x0018, 0x7b8: 0x0040, 0x7b9: 0x0040, 0x7ba: 0x0040, 0x7bb: 0x0040, + 0x7bc: 0x0040, 0x7bd: 0x0040, 0x7be: 0x0040, 0x7bf: 0x0040, + // Block 0x1f, offset 0x7c0 + 0x7c0: 0x0040, 0x7c1: 0x0040, 0x7c2: 0x3308, 0x7c3: 0x0008, 0x7c4: 0x0040, 0x7c5: 0x0008, + 0x7c6: 0x0008, 0x7c7: 0x0008, 0x7c8: 0x0008, 0x7c9: 0x0008, 0x7ca: 0x0008, 0x7cb: 0x0040, + 0x7cc: 0x0040, 0x7cd: 0x0040, 0x7ce: 0x0008, 0x7cf: 0x0008, 0x7d0: 0x0008, 0x7d1: 0x0040, + 0x7d2: 0x0008, 0x7d3: 0x0008, 0x7d4: 0x0008, 0x7d5: 0x0008, 0x7d6: 0x0040, 0x7d7: 0x0040, + 0x7d8: 0x0040, 0x7d9: 0x0008, 0x7da: 0x0008, 0x7db: 0x0040, 0x7dc: 0x0008, 0x7dd: 0x0040, + 0x7de: 0x0008, 0x7df: 0x0008, 0x7e0: 0x0040, 0x7e1: 0x0040, 0x7e2: 0x0040, 0x7e3: 0x0008, + 0x7e4: 0x0008, 0x7e5: 0x0040, 0x7e6: 0x0040, 0x7e7: 0x0040, 0x7e8: 0x0008, 0x7e9: 0x0008, + 0x7ea: 0x0008, 0x7eb: 0x0040, 0x7ec: 0x0040, 0x7ed: 0x0040, 0x7ee: 0x0008, 0x7ef: 0x0008, + 0x7f0: 0x0008, 0x7f1: 0x0008, 0x7f2: 0x0008, 0x7f3: 0x0008, 0x7f4: 0x0008, 0x7f5: 0x0008, + 0x7f6: 0x0008, 0x7f7: 0x0008, 0x7f8: 0x0008, 0x7f9: 0x0008, 0x7fa: 0x0040, 0x7fb: 0x0040, + 0x7fc: 0x0040, 0x7fd: 0x0040, 0x7fe: 0x3008, 0x7ff: 0x3008, + // Block 0x20, offset 0x800 + 0x800: 0x3308, 0x801: 0x3008, 0x802: 0x3008, 0x803: 0x3008, 0x804: 0x3008, 0x805: 0x0040, + 0x806: 0x3308, 0x807: 0x3308, 0x808: 0x3308, 0x809: 0x0040, 0x80a: 0x3308, 0x80b: 0x3308, + 0x80c: 0x3308, 0x80d: 0x3b08, 0x80e: 0x0040, 0x80f: 0x0040, 0x810: 0x0040, 0x811: 0x0040, + 0x812: 0x0040, 0x813: 0x0040, 0x814: 0x0040, 0x815: 0x3308, 0x816: 0x3308, 0x817: 0x0040, + 0x818: 0x0008, 0x819: 0x0008, 0x81a: 0x0008, 0x81b: 0x0040, 0x81c: 0x0040, 0x81d: 0x0040, + 0x81e: 0x0040, 0x81f: 0x0040, 0x820: 0x0008, 0x821: 0x0008, 0x822: 0x3308, 0x823: 0x3308, + 0x824: 0x0040, 0x825: 0x0040, 0x826: 0x0008, 0x827: 0x0008, 0x828: 0x0008, 0x829: 0x0008, + 0x82a: 0x0008, 0x82b: 0x0008, 0x82c: 0x0008, 0x82d: 0x0008, 0x82e: 0x0008, 0x82f: 0x0008, + 0x830: 0x0040, 0x831: 0x0040, 0x832: 0x0040, 0x833: 0x0040, 0x834: 0x0040, 0x835: 0x0040, + 0x836: 0x0040, 0x837: 0x0040, 0x838: 0x0018, 0x839: 0x0018, 0x83a: 0x0018, 0x83b: 0x0018, + 0x83c: 0x0018, 0x83d: 0x0018, 0x83e: 0x0018, 0x83f: 0x0018, + // Block 0x21, offset 0x840 + 0x840: 0x0008, 0x841: 0x3308, 0x842: 0x3008, 0x843: 0x3008, 0x844: 0x0040, 0x845: 0x0008, + 0x846: 0x0008, 0x847: 0x0008, 0x848: 0x0008, 0x849: 0x0008, 0x84a: 0x0008, 0x84b: 0x0008, + 0x84c: 0x0008, 0x84d: 0x0040, 0x84e: 0x0008, 0x84f: 0x0008, 0x850: 0x0008, 0x851: 0x0040, + 0x852: 0x0008, 0x853: 0x0008, 0x854: 0x0008, 0x855: 0x0008, 0x856: 0x0008, 0x857: 0x0008, + 0x858: 0x0008, 0x859: 0x0008, 0x85a: 0x0008, 0x85b: 0x0008, 0x85c: 0x0008, 0x85d: 0x0008, + 0x85e: 0x0008, 0x85f: 0x0008, 0x860: 0x0008, 0x861: 0x0008, 0x862: 0x0008, 0x863: 0x0008, + 0x864: 0x0008, 0x865: 0x0008, 0x866: 0x0008, 0x867: 0x0008, 0x868: 0x0008, 0x869: 0x0040, + 0x86a: 0x0008, 0x86b: 0x0008, 0x86c: 0x0008, 0x86d: 0x0008, 0x86e: 0x0008, 0x86f: 0x0008, + 0x870: 0x0008, 0x871: 0x0008, 0x872: 0x0008, 0x873: 0x0008, 0x874: 0x0040, 0x875: 0x0008, + 0x876: 0x0008, 0x877: 0x0008, 0x878: 0x0008, 0x879: 0x0008, 0x87a: 0x0040, 0x87b: 0x0040, + 0x87c: 0x3308, 0x87d: 0x0008, 0x87e: 0x3008, 0x87f: 0x3308, + // Block 0x22, offset 0x880 + 0x880: 0x3008, 0x881: 0x3008, 0x882: 0x3008, 0x883: 0x3008, 0x884: 0x3008, 0x885: 0x0040, + 0x886: 0x3308, 0x887: 0x3008, 0x888: 0x3008, 0x889: 0x0040, 0x88a: 0x3008, 0x88b: 0x3008, + 0x88c: 0x3308, 0x88d: 0x3b08, 0x88e: 0x0040, 0x88f: 0x0040, 0x890: 0x0040, 0x891: 0x0040, + 0x892: 0x0040, 0x893: 0x0040, 0x894: 0x0040, 0x895: 0x3008, 0x896: 0x3008, 0x897: 0x0040, + 0x898: 0x0040, 0x899: 0x0040, 0x89a: 0x0040, 0x89b: 0x0040, 0x89c: 0x0040, 0x89d: 0x0040, + 0x89e: 0x0008, 0x89f: 0x0040, 0x8a0: 0x0008, 0x8a1: 0x0008, 0x8a2: 0x3308, 0x8a3: 0x3308, + 0x8a4: 0x0040, 0x8a5: 0x0040, 0x8a6: 0x0008, 0x8a7: 0x0008, 0x8a8: 0x0008, 0x8a9: 0x0008, + 0x8aa: 0x0008, 0x8ab: 0x0008, 0x8ac: 0x0008, 0x8ad: 0x0008, 0x8ae: 0x0008, 0x8af: 0x0008, + 0x8b0: 0x0040, 0x8b1: 0x0008, 0x8b2: 0x0008, 0x8b3: 0x0040, 0x8b4: 0x0040, 0x8b5: 0x0040, + 0x8b6: 0x0040, 0x8b7: 0x0040, 0x8b8: 0x0040, 0x8b9: 0x0040, 0x8ba: 0x0040, 0x8bb: 0x0040, + 0x8bc: 0x0040, 0x8bd: 0x0040, 0x8be: 0x0040, 0x8bf: 0x0040, + // Block 0x23, offset 0x8c0 + 0x8c0: 0x3008, 0x8c1: 0x3308, 0x8c2: 0x3308, 0x8c3: 0x3308, 0x8c4: 0x3308, 0x8c5: 0x0040, + 0x8c6: 0x3008, 0x8c7: 0x3008, 0x8c8: 0x3008, 0x8c9: 0x0040, 0x8ca: 0x3008, 0x8cb: 0x3008, + 0x8cc: 0x3008, 0x8cd: 0x3b08, 0x8ce: 0x0008, 0x8cf: 0x0018, 0x8d0: 0x0040, 0x8d1: 0x0040, + 0x8d2: 0x0040, 0x8d3: 0x0040, 0x8d4: 0x0008, 0x8d5: 0x0008, 0x8d6: 0x0008, 0x8d7: 0x3008, + 0x8d8: 0x0018, 0x8d9: 0x0018, 0x8da: 0x0018, 0x8db: 0x0018, 0x8dc: 0x0018, 0x8dd: 0x0018, + 0x8de: 0x0018, 0x8df: 0x0008, 0x8e0: 0x0008, 0x8e1: 0x0008, 0x8e2: 0x3308, 0x8e3: 0x3308, + 0x8e4: 0x0040, 0x8e5: 0x0040, 0x8e6: 0x0008, 0x8e7: 0x0008, 0x8e8: 0x0008, 0x8e9: 0x0008, + 0x8ea: 0x0008, 0x8eb: 0x0008, 0x8ec: 0x0008, 0x8ed: 0x0008, 0x8ee: 0x0008, 0x8ef: 0x0008, + 0x8f0: 0x0018, 0x8f1: 0x0018, 0x8f2: 0x0018, 0x8f3: 0x0018, 0x8f4: 0x0018, 0x8f5: 0x0018, + 0x8f6: 0x0018, 0x8f7: 0x0018, 0x8f8: 0x0018, 0x8f9: 0x0018, 0x8fa: 0x0008, 0x8fb: 0x0008, + 0x8fc: 0x0008, 0x8fd: 0x0008, 0x8fe: 0x0008, 0x8ff: 0x0008, + // Block 0x24, offset 0x900 + 0x900: 0x0040, 0x901: 0x0008, 0x902: 0x0008, 0x903: 0x0040, 0x904: 0x0008, 0x905: 0x0040, + 0x906: 0x0040, 0x907: 0x0008, 0x908: 0x0008, 0x909: 0x0040, 0x90a: 0x0008, 0x90b: 0x0040, + 0x90c: 0x0040, 0x90d: 0x0008, 0x90e: 0x0040, 0x90f: 0x0040, 0x910: 0x0040, 0x911: 0x0040, + 0x912: 0x0040, 0x913: 0x0040, 0x914: 0x0008, 0x915: 0x0008, 0x916: 0x0008, 0x917: 0x0008, + 0x918: 0x0040, 0x919: 0x0008, 0x91a: 0x0008, 0x91b: 0x0008, 0x91c: 0x0008, 0x91d: 0x0008, + 0x91e: 0x0008, 0x91f: 0x0008, 0x920: 0x0040, 0x921: 0x0008, 0x922: 0x0008, 0x923: 0x0008, + 0x924: 0x0040, 0x925: 0x0008, 0x926: 0x0040, 0x927: 0x0008, 0x928: 0x0040, 0x929: 0x0040, + 0x92a: 0x0008, 0x92b: 0x0008, 0x92c: 0x0040, 0x92d: 0x0008, 0x92e: 0x0008, 0x92f: 0x0008, + 0x930: 0x0008, 0x931: 0x3308, 0x932: 0x0008, 0x933: 0x0929, 0x934: 0x3308, 0x935: 0x3308, + 0x936: 0x3308, 0x937: 0x3308, 0x938: 0x3308, 0x939: 0x3308, 0x93a: 0x0040, 0x93b: 0x3308, + 0x93c: 0x3308, 0x93d: 0x0008, 0x93e: 0x0040, 0x93f: 0x0040, + // Block 0x25, offset 0x940 + 0x940: 0x0008, 0x941: 0x0008, 0x942: 0x0008, 0x943: 0x09d1, 0x944: 0x0008, 0x945: 0x0008, + 0x946: 0x0008, 0x947: 0x0008, 0x948: 0x0040, 0x949: 0x0008, 0x94a: 0x0008, 0x94b: 0x0008, + 0x94c: 0x0008, 0x94d: 0x0a09, 0x94e: 0x0008, 0x94f: 0x0008, 0x950: 0x0008, 0x951: 0x0008, + 0x952: 0x0a41, 0x953: 0x0008, 0x954: 0x0008, 0x955: 0x0008, 0x956: 0x0008, 0x957: 0x0a79, + 0x958: 0x0008, 0x959: 0x0008, 0x95a: 0x0008, 0x95b: 0x0008, 0x95c: 0x0ab1, 0x95d: 0x0008, + 0x95e: 0x0008, 0x95f: 0x0008, 0x960: 0x0008, 0x961: 0x0008, 0x962: 0x0008, 0x963: 0x0008, + 0x964: 0x0008, 0x965: 0x0008, 0x966: 0x0008, 0x967: 0x0008, 0x968: 0x0008, 0x969: 0x0ae9, + 0x96a: 0x0008, 0x96b: 0x0008, 0x96c: 0x0008, 0x96d: 0x0040, 0x96e: 0x0040, 0x96f: 0x0040, + 0x970: 0x0040, 0x971: 0x3308, 0x972: 0x3308, 0x973: 0x0b21, 0x974: 0x3308, 0x975: 0x0b59, + 0x976: 0x0b91, 0x977: 0x0bc9, 0x978: 0x0c19, 0x979: 0x0c51, 0x97a: 0x3308, 0x97b: 0x3308, + 0x97c: 0x3308, 0x97d: 0x3308, 0x97e: 0x3308, 0x97f: 0x3008, + // Block 0x26, offset 0x980 + 0x980: 0x3308, 0x981: 0x0ca1, 0x982: 0x3308, 0x983: 0x3308, 0x984: 0x3b08, 0x985: 0x0018, + 0x986: 0x3308, 0x987: 0x3308, 0x988: 0x0008, 0x989: 0x0008, 0x98a: 0x0008, 0x98b: 0x0008, + 0x98c: 0x0008, 0x98d: 0x3308, 0x98e: 0x3308, 0x98f: 0x3308, 0x990: 0x3308, 0x991: 0x3308, + 0x992: 0x3308, 0x993: 0x0cd9, 0x994: 0x3308, 0x995: 0x3308, 0x996: 0x3308, 0x997: 0x3308, + 0x998: 0x0040, 0x999: 0x3308, 0x99a: 0x3308, 0x99b: 0x3308, 0x99c: 0x3308, 0x99d: 0x0d11, + 0x99e: 0x3308, 0x99f: 0x3308, 0x9a0: 0x3308, 0x9a1: 0x3308, 0x9a2: 0x0d49, 0x9a3: 0x3308, + 0x9a4: 0x3308, 0x9a5: 0x3308, 0x9a6: 0x3308, 0x9a7: 0x0d81, 0x9a8: 0x3308, 0x9a9: 0x3308, + 0x9aa: 0x3308, 0x9ab: 0x3308, 0x9ac: 0x0db9, 0x9ad: 0x3308, 0x9ae: 0x3308, 0x9af: 0x3308, + 0x9b0: 0x3308, 0x9b1: 0x3308, 0x9b2: 0x3308, 0x9b3: 0x3308, 0x9b4: 0x3308, 0x9b5: 0x3308, + 0x9b6: 0x3308, 0x9b7: 0x3308, 0x9b8: 0x3308, 0x9b9: 0x0df1, 0x9ba: 0x3308, 0x9bb: 0x3308, + 0x9bc: 0x3308, 0x9bd: 0x0040, 0x9be: 0x0018, 0x9bf: 0x0018, + // Block 0x27, offset 0x9c0 + 0x9c0: 0x0008, 0x9c1: 0x0008, 0x9c2: 0x0008, 0x9c3: 0x0008, 0x9c4: 0x0008, 0x9c5: 0x0008, + 0x9c6: 0x0008, 0x9c7: 0x0008, 0x9c8: 0x0008, 0x9c9: 0x0008, 0x9ca: 0x0008, 0x9cb: 0x0008, + 0x9cc: 0x0008, 0x9cd: 0x0008, 0x9ce: 0x0008, 0x9cf: 0x0008, 0x9d0: 0x0008, 0x9d1: 0x0008, + 0x9d2: 0x0008, 0x9d3: 0x0008, 0x9d4: 0x0008, 0x9d5: 0x0008, 0x9d6: 0x0008, 0x9d7: 0x0008, + 0x9d8: 0x0008, 0x9d9: 0x0008, 0x9da: 0x0008, 0x9db: 0x0008, 0x9dc: 0x0008, 0x9dd: 0x0008, + 0x9de: 0x0008, 0x9df: 0x0008, 0x9e0: 0x0008, 0x9e1: 0x0008, 0x9e2: 0x0008, 0x9e3: 0x0008, + 0x9e4: 0x0008, 0x9e5: 0x0008, 0x9e6: 0x0008, 0x9e7: 0x0008, 0x9e8: 0x0008, 0x9e9: 0x0008, + 0x9ea: 0x0008, 0x9eb: 0x0008, 0x9ec: 0x0039, 0x9ed: 0x0ed1, 0x9ee: 0x0ee9, 0x9ef: 0x0008, + 0x9f0: 0x0ef9, 0x9f1: 0x0f09, 0x9f2: 0x0f19, 0x9f3: 0x0f31, 0x9f4: 0x0249, 0x9f5: 0x0f41, + 0x9f6: 0x0259, 0x9f7: 0x0f51, 0x9f8: 0x0359, 0x9f9: 0x0f61, 0x9fa: 0x0f71, 0x9fb: 0x0008, + 0x9fc: 0x00d9, 0x9fd: 0x0f81, 0x9fe: 0x0f99, 0x9ff: 0x0269, + // Block 0x28, offset 0xa00 + 0xa00: 0x0fa9, 0xa01: 0x0fb9, 0xa02: 0x0279, 0xa03: 0x0039, 0xa04: 0x0fc9, 0xa05: 0x0fe1, + 0xa06: 0x059d, 0xa07: 0x0ee9, 0xa08: 0x0ef9, 0xa09: 0x0f09, 0xa0a: 0x0ff9, 0xa0b: 0x1011, + 0xa0c: 0x1029, 0xa0d: 0x0f31, 0xa0e: 0x0008, 0xa0f: 0x0f51, 0xa10: 0x0f61, 0xa11: 0x1041, + 0xa12: 0x00d9, 0xa13: 0x1059, 0xa14: 0x05b5, 0xa15: 0x05b5, 0xa16: 0x0f99, 0xa17: 0x0fa9, + 0xa18: 0x0fb9, 0xa19: 0x059d, 0xa1a: 0x1071, 0xa1b: 0x1089, 0xa1c: 0x05cd, 0xa1d: 0x1099, + 0xa1e: 0x10b1, 0xa1f: 0x10c9, 0xa20: 0x10e1, 0xa21: 0x10f9, 0xa22: 0x0f41, 0xa23: 0x0269, + 0xa24: 0x0fb9, 0xa25: 0x1089, 0xa26: 0x1099, 0xa27: 0x10b1, 0xa28: 0x1111, 0xa29: 0x10e1, + 0xa2a: 0x10f9, 0xa2b: 0x0008, 0xa2c: 0x0008, 0xa2d: 0x0008, 0xa2e: 0x0008, 0xa2f: 0x0008, + 0xa30: 0x0008, 0xa31: 0x0008, 0xa32: 0x0008, 0xa33: 0x0008, 0xa34: 0x0008, 0xa35: 0x0008, + 0xa36: 0x0008, 0xa37: 0x0008, 0xa38: 0x1129, 0xa39: 0x0008, 0xa3a: 0x0008, 0xa3b: 0x0008, + 0xa3c: 0x0008, 0xa3d: 0x0008, 0xa3e: 0x0008, 0xa3f: 0x0008, + // Block 0x29, offset 0xa40 + 0xa40: 0x0008, 0xa41: 0x0008, 0xa42: 0x0008, 0xa43: 0x0008, 0xa44: 0x0008, 0xa45: 0x0008, + 0xa46: 0x0008, 0xa47: 0x0008, 0xa48: 0x0008, 0xa49: 0x0008, 0xa4a: 0x0008, 0xa4b: 0x0008, + 0xa4c: 0x0008, 0xa4d: 0x0008, 0xa4e: 0x0008, 0xa4f: 0x0008, 0xa50: 0x0008, 0xa51: 0x0008, + 0xa52: 0x0008, 0xa53: 0x0008, 0xa54: 0x0008, 0xa55: 0x0008, 0xa56: 0x0008, 0xa57: 0x0008, + 0xa58: 0x0008, 0xa59: 0x0008, 0xa5a: 0x0008, 0xa5b: 0x1141, 0xa5c: 0x1159, 0xa5d: 0x1169, + 0xa5e: 0x1181, 0xa5f: 0x1029, 0xa60: 0x1199, 0xa61: 0x11a9, 0xa62: 0x11c1, 0xa63: 0x11d9, + 0xa64: 0x11f1, 0xa65: 0x1209, 0xa66: 0x1221, 0xa67: 0x05e5, 0xa68: 0x1239, 0xa69: 0x1251, + 0xa6a: 0xe17d, 0xa6b: 0x1269, 0xa6c: 0x1281, 0xa6d: 0x1299, 0xa6e: 0x12b1, 0xa6f: 0x12c9, + 0xa70: 0x12e1, 0xa71: 0x12f9, 0xa72: 0x1311, 0xa73: 0x1329, 0xa74: 0x1341, 0xa75: 0x1359, + 0xa76: 0x1371, 0xa77: 0x1389, 0xa78: 0x05fd, 0xa79: 0x13a1, 0xa7a: 0x13b9, 0xa7b: 0x13d1, + 0xa7c: 0x13e1, 0xa7d: 0x13f9, 0xa7e: 0x1411, 0xa7f: 0x1429, + // Block 0x2a, offset 0xa80 + 0xa80: 0xe00d, 0xa81: 0x0008, 0xa82: 0xe00d, 0xa83: 0x0008, 0xa84: 0xe00d, 0xa85: 0x0008, + 0xa86: 0xe00d, 0xa87: 0x0008, 0xa88: 0xe00d, 0xa89: 0x0008, 0xa8a: 0xe00d, 0xa8b: 0x0008, + 0xa8c: 0xe00d, 0xa8d: 0x0008, 0xa8e: 0xe00d, 0xa8f: 0x0008, 0xa90: 0xe00d, 0xa91: 0x0008, + 0xa92: 0xe00d, 0xa93: 0x0008, 0xa94: 0xe00d, 0xa95: 0x0008, 0xa96: 0xe00d, 0xa97: 0x0008, + 0xa98: 0xe00d, 0xa99: 0x0008, 0xa9a: 0xe00d, 0xa9b: 0x0008, 0xa9c: 0xe00d, 0xa9d: 0x0008, + 0xa9e: 0xe00d, 0xa9f: 0x0008, 0xaa0: 0xe00d, 0xaa1: 0x0008, 0xaa2: 0xe00d, 0xaa3: 0x0008, + 0xaa4: 0xe00d, 0xaa5: 0x0008, 0xaa6: 0xe00d, 0xaa7: 0x0008, 0xaa8: 0xe00d, 0xaa9: 0x0008, + 0xaaa: 0xe00d, 0xaab: 0x0008, 0xaac: 0xe00d, 0xaad: 0x0008, 0xaae: 0xe00d, 0xaaf: 0x0008, + 0xab0: 0xe00d, 0xab1: 0x0008, 0xab2: 0xe00d, 0xab3: 0x0008, 0xab4: 0xe00d, 0xab5: 0x0008, + 0xab6: 0xe00d, 0xab7: 0x0008, 0xab8: 0xe00d, 0xab9: 0x0008, 0xaba: 0xe00d, 0xabb: 0x0008, + 0xabc: 0xe00d, 0xabd: 0x0008, 0xabe: 0xe00d, 0xabf: 0x0008, + // Block 0x2b, offset 0xac0 + 0xac0: 0xe00d, 0xac1: 0x0008, 0xac2: 0xe00d, 0xac3: 0x0008, 0xac4: 0xe00d, 0xac5: 0x0008, + 0xac6: 0xe00d, 0xac7: 0x0008, 0xac8: 0xe00d, 0xac9: 0x0008, 0xaca: 0xe00d, 0xacb: 0x0008, + 0xacc: 0xe00d, 0xacd: 0x0008, 0xace: 0xe00d, 0xacf: 0x0008, 0xad0: 0xe00d, 0xad1: 0x0008, + 0xad2: 0xe00d, 0xad3: 0x0008, 0xad4: 0xe00d, 0xad5: 0x0008, 0xad6: 0x0008, 0xad7: 0x0008, + 0xad8: 0x0008, 0xad9: 0x0008, 0xada: 0x0615, 0xadb: 0x0635, 0xadc: 0x0008, 0xadd: 0x0008, + 0xade: 0x1441, 0xadf: 0x0008, 0xae0: 0xe00d, 0xae1: 0x0008, 0xae2: 0xe00d, 0xae3: 0x0008, + 0xae4: 0xe00d, 0xae5: 0x0008, 0xae6: 0xe00d, 0xae7: 0x0008, 0xae8: 0xe00d, 0xae9: 0x0008, + 0xaea: 0xe00d, 0xaeb: 0x0008, 0xaec: 0xe00d, 0xaed: 0x0008, 0xaee: 0xe00d, 0xaef: 0x0008, + 0xaf0: 0xe00d, 0xaf1: 0x0008, 0xaf2: 0xe00d, 0xaf3: 0x0008, 0xaf4: 0xe00d, 0xaf5: 0x0008, + 0xaf6: 0xe00d, 0xaf7: 0x0008, 0xaf8: 0xe00d, 0xaf9: 0x0008, 0xafa: 0xe00d, 0xafb: 0x0008, + 0xafc: 0xe00d, 0xafd: 0x0008, 0xafe: 0xe00d, 0xaff: 0x0008, + // Block 0x2c, offset 0xb00 + 0xb00: 0x0008, 0xb01: 0x0008, 0xb02: 0x0008, 0xb03: 0x0008, 0xb04: 0x0008, 0xb05: 0x0008, + 0xb06: 0x0040, 0xb07: 0x0040, 0xb08: 0xe045, 0xb09: 0xe045, 0xb0a: 0xe045, 0xb0b: 0xe045, + 0xb0c: 0xe045, 0xb0d: 0xe045, 0xb0e: 0x0040, 0xb0f: 0x0040, 0xb10: 0x0008, 0xb11: 0x0008, + 0xb12: 0x0008, 0xb13: 0x0008, 0xb14: 0x0008, 0xb15: 0x0008, 0xb16: 0x0008, 0xb17: 0x0008, + 0xb18: 0x0040, 0xb19: 0xe045, 0xb1a: 0x0040, 0xb1b: 0xe045, 0xb1c: 0x0040, 0xb1d: 0xe045, + 0xb1e: 0x0040, 0xb1f: 0xe045, 0xb20: 0x0008, 0xb21: 0x0008, 0xb22: 0x0008, 0xb23: 0x0008, + 0xb24: 0x0008, 0xb25: 0x0008, 0xb26: 0x0008, 0xb27: 0x0008, 0xb28: 0xe045, 0xb29: 0xe045, + 0xb2a: 0xe045, 0xb2b: 0xe045, 0xb2c: 0xe045, 0xb2d: 0xe045, 0xb2e: 0xe045, 0xb2f: 0xe045, + 0xb30: 0x0008, 0xb31: 0x1459, 0xb32: 0x0008, 0xb33: 0x1471, 0xb34: 0x0008, 0xb35: 0x1489, + 0xb36: 0x0008, 0xb37: 0x14a1, 0xb38: 0x0008, 0xb39: 0x14b9, 0xb3a: 0x0008, 0xb3b: 0x14d1, + 0xb3c: 0x0008, 0xb3d: 0x14e9, 0xb3e: 0x0040, 0xb3f: 0x0040, + // Block 0x2d, offset 0xb40 + 0xb40: 0x1501, 0xb41: 0x1531, 0xb42: 0x1561, 0xb43: 0x1591, 0xb44: 0x15c1, 0xb45: 0x15f1, + 0xb46: 0x1621, 0xb47: 0x1651, 0xb48: 0x1501, 0xb49: 0x1531, 0xb4a: 0x1561, 0xb4b: 0x1591, + 0xb4c: 0x15c1, 0xb4d: 0x15f1, 0xb4e: 0x1621, 0xb4f: 0x1651, 0xb50: 0x1681, 0xb51: 0x16b1, + 0xb52: 0x16e1, 0xb53: 0x1711, 0xb54: 0x1741, 0xb55: 0x1771, 0xb56: 0x17a1, 0xb57: 0x17d1, + 0xb58: 0x1681, 0xb59: 0x16b1, 0xb5a: 0x16e1, 0xb5b: 0x1711, 0xb5c: 0x1741, 0xb5d: 0x1771, + 0xb5e: 0x17a1, 0xb5f: 0x17d1, 0xb60: 0x1801, 0xb61: 0x1831, 0xb62: 0x1861, 0xb63: 0x1891, + 0xb64: 0x18c1, 0xb65: 0x18f1, 0xb66: 0x1921, 0xb67: 0x1951, 0xb68: 0x1801, 0xb69: 0x1831, + 0xb6a: 0x1861, 0xb6b: 0x1891, 0xb6c: 0x18c1, 0xb6d: 0x18f1, 0xb6e: 0x1921, 0xb6f: 0x1951, + 0xb70: 0x0008, 0xb71: 0x0008, 0xb72: 0x1981, 0xb73: 0x19b1, 0xb74: 0x19d9, 0xb75: 0x0040, + 0xb76: 0x0008, 0xb77: 0x1a01, 0xb78: 0xe045, 0xb79: 0xe045, 0xb7a: 0x064d, 0xb7b: 0x1459, + 0xb7c: 0x19b1, 0xb7d: 0x0666, 0xb7e: 0x1a31, 0xb7f: 0x0686, + // Block 0x2e, offset 0xb80 + 0xb80: 0x06a6, 0xb81: 0x1a4a, 0xb82: 0x1a79, 0xb83: 0x1aa9, 0xb84: 0x1ad1, 0xb85: 0x0040, + 0xb86: 0x0008, 0xb87: 0x1af9, 0xb88: 0x06c5, 0xb89: 0x1471, 0xb8a: 0x06dd, 0xb8b: 0x1489, + 0xb8c: 0x1aa9, 0xb8d: 0x1b2a, 0xb8e: 0x1b5a, 0xb8f: 0x1b8a, 0xb90: 0x0008, 0xb91: 0x0008, + 0xb92: 0x0008, 0xb93: 0x1bb9, 0xb94: 0x0040, 0xb95: 0x0040, 0xb96: 0x0008, 0xb97: 0x0008, + 0xb98: 0xe045, 0xb99: 0xe045, 0xb9a: 0x06f5, 0xb9b: 0x14a1, 0xb9c: 0x0040, 0xb9d: 0x1bd2, + 0xb9e: 0x1c02, 0xb9f: 0x1c32, 0xba0: 0x0008, 0xba1: 0x0008, 0xba2: 0x0008, 0xba3: 0x1c61, + 0xba4: 0x0008, 0xba5: 0x0008, 0xba6: 0x0008, 0xba7: 0x0008, 0xba8: 0xe045, 0xba9: 0xe045, + 0xbaa: 0x070d, 0xbab: 0x14d1, 0xbac: 0xe04d, 0xbad: 0x1c7a, 0xbae: 0x03d2, 0xbaf: 0x1caa, + 0xbb0: 0x0040, 0xbb1: 0x0040, 0xbb2: 0x1cb9, 0xbb3: 0x1ce9, 0xbb4: 0x1d11, 0xbb5: 0x0040, + 0xbb6: 0x0008, 0xbb7: 0x1d39, 0xbb8: 0x0725, 0xbb9: 0x14b9, 0xbba: 0x0515, 0xbbb: 0x14e9, + 0xbbc: 0x1ce9, 0xbbd: 0x073e, 0xbbe: 0x075e, 0xbbf: 0x0040, + // Block 0x2f, offset 0xbc0 + 0xbc0: 0x000a, 0xbc1: 0x000a, 0xbc2: 0x000a, 0xbc3: 0x000a, 0xbc4: 0x000a, 0xbc5: 0x000a, + 0xbc6: 0x000a, 0xbc7: 0x000a, 0xbc8: 0x000a, 0xbc9: 0x000a, 0xbca: 0x000a, 0xbcb: 0x03c0, + 0xbcc: 0x0003, 0xbcd: 0x0003, 0xbce: 0x0340, 0xbcf: 0x0b40, 0xbd0: 0x0018, 0xbd1: 0xe00d, + 0xbd2: 0x0018, 0xbd3: 0x0018, 0xbd4: 0x0018, 0xbd5: 0x0018, 0xbd6: 0x0018, 0xbd7: 0x077e, + 0xbd8: 0x0018, 0xbd9: 0x0018, 0xbda: 0x0018, 0xbdb: 0x0018, 0xbdc: 0x0018, 0xbdd: 0x0018, + 0xbde: 0x0018, 0xbdf: 0x0018, 0xbe0: 0x0018, 0xbe1: 0x0018, 0xbe2: 0x0018, 0xbe3: 0x0018, + 0xbe4: 0x0040, 0xbe5: 0x0040, 0xbe6: 0x0040, 0xbe7: 0x0018, 0xbe8: 0x0040, 0xbe9: 0x0040, + 0xbea: 0x0340, 0xbeb: 0x0340, 0xbec: 0x0340, 0xbed: 0x0340, 0xbee: 0x0340, 0xbef: 0x000a, + 0xbf0: 0x0018, 0xbf1: 0x0018, 0xbf2: 0x0018, 0xbf3: 0x1d69, 0xbf4: 0x1da1, 0xbf5: 0x0018, + 0xbf6: 0x1df1, 0xbf7: 0x1e29, 0xbf8: 0x0018, 0xbf9: 0x0018, 0xbfa: 0x0018, 0xbfb: 0x0018, + 0xbfc: 0x1e7a, 0xbfd: 0x0018, 0xbfe: 0x079e, 0xbff: 0x0018, + // Block 0x30, offset 0xc00 + 0xc00: 0x0018, 0xc01: 0x0018, 0xc02: 0x0018, 0xc03: 0x0018, 0xc04: 0x0018, 0xc05: 0x0018, + 0xc06: 0x0018, 0xc07: 0x1e92, 0xc08: 0x1eaa, 0xc09: 0x1ec2, 0xc0a: 0x0018, 0xc0b: 0x0018, + 0xc0c: 0x0018, 0xc0d: 0x0018, 0xc0e: 0x0018, 0xc0f: 0x0018, 0xc10: 0x0018, 0xc11: 0x0018, + 0xc12: 0x0018, 0xc13: 0x0018, 0xc14: 0x0018, 0xc15: 0x0018, 0xc16: 0x0018, 0xc17: 0x1ed9, + 0xc18: 0x0018, 0xc19: 0x0018, 0xc1a: 0x0018, 0xc1b: 0x0018, 0xc1c: 0x0018, 0xc1d: 0x0018, + 0xc1e: 0x0018, 0xc1f: 0x000a, 0xc20: 0x03c0, 0xc21: 0x0340, 0xc22: 0x0340, 0xc23: 0x0340, + 0xc24: 0x03c0, 0xc25: 0x0040, 0xc26: 0x0040, 0xc27: 0x0040, 0xc28: 0x0040, 0xc29: 0x0040, + 0xc2a: 0x0340, 0xc2b: 0x0340, 0xc2c: 0x0340, 0xc2d: 0x0340, 0xc2e: 0x0340, 0xc2f: 0x0340, + 0xc30: 0x1f41, 0xc31: 0x0f41, 0xc32: 0x0040, 0xc33: 0x0040, 0xc34: 0x1f51, 0xc35: 0x1f61, + 0xc36: 0x1f71, 0xc37: 0x1f81, 0xc38: 0x1f91, 0xc39: 0x1fa1, 0xc3a: 0x1fb2, 0xc3b: 0x07bd, + 0xc3c: 0x1fc2, 0xc3d: 0x1fd2, 0xc3e: 0x1fe2, 0xc3f: 0x0f71, + // Block 0x31, offset 0xc40 + 0xc40: 0x1f41, 0xc41: 0x00c9, 0xc42: 0x0069, 0xc43: 0x0079, 0xc44: 0x1f51, 0xc45: 0x1f61, + 0xc46: 0x1f71, 0xc47: 0x1f81, 0xc48: 0x1f91, 0xc49: 0x1fa1, 0xc4a: 0x1fb2, 0xc4b: 0x07d5, + 0xc4c: 0x1fc2, 0xc4d: 0x1fd2, 0xc4e: 0x1fe2, 0xc4f: 0x0040, 0xc50: 0x0039, 0xc51: 0x0f09, + 0xc52: 0x00d9, 0xc53: 0x0369, 0xc54: 0x0ff9, 0xc55: 0x0249, 0xc56: 0x0f51, 0xc57: 0x0359, + 0xc58: 0x0f61, 0xc59: 0x0f71, 0xc5a: 0x0f99, 0xc5b: 0x01d9, 0xc5c: 0x0fa9, 0xc5d: 0x0040, + 0xc5e: 0x0040, 0xc5f: 0x0040, 0xc60: 0x0018, 0xc61: 0x0018, 0xc62: 0x0018, 0xc63: 0x0018, + 0xc64: 0x0018, 0xc65: 0x0018, 0xc66: 0x0018, 0xc67: 0x0018, 0xc68: 0x1ff1, 0xc69: 0x0018, + 0xc6a: 0x0018, 0xc6b: 0x0018, 0xc6c: 0x0018, 0xc6d: 0x0018, 0xc6e: 0x0018, 0xc6f: 0x0018, + 0xc70: 0x0018, 0xc71: 0x0018, 0xc72: 0x0018, 0xc73: 0x0018, 0xc74: 0x0018, 0xc75: 0x0018, + 0xc76: 0x0018, 0xc77: 0x0018, 0xc78: 0x0018, 0xc79: 0x0018, 0xc7a: 0x0018, 0xc7b: 0x0018, + 0xc7c: 0x0018, 0xc7d: 0x0018, 0xc7e: 0x0018, 0xc7f: 0x0018, + // Block 0x32, offset 0xc80 + 0xc80: 0x07ee, 0xc81: 0x080e, 0xc82: 0x1159, 0xc83: 0x082d, 0xc84: 0x0018, 0xc85: 0x084e, + 0xc86: 0x086e, 0xc87: 0x1011, 0xc88: 0x0018, 0xc89: 0x088d, 0xc8a: 0x0f31, 0xc8b: 0x0249, + 0xc8c: 0x0249, 0xc8d: 0x0249, 0xc8e: 0x0249, 0xc8f: 0x2009, 0xc90: 0x0f41, 0xc91: 0x0f41, + 0xc92: 0x0359, 0xc93: 0x0359, 0xc94: 0x0018, 0xc95: 0x0f71, 0xc96: 0x2021, 0xc97: 0x0018, + 0xc98: 0x0018, 0xc99: 0x0f99, 0xc9a: 0x2039, 0xc9b: 0x0269, 0xc9c: 0x0269, 0xc9d: 0x0269, + 0xc9e: 0x0018, 0xc9f: 0x0018, 0xca0: 0x2049, 0xca1: 0x08ad, 0xca2: 0x2061, 0xca3: 0x0018, + 0xca4: 0x13d1, 0xca5: 0x0018, 0xca6: 0x2079, 0xca7: 0x0018, 0xca8: 0x13d1, 0xca9: 0x0018, + 0xcaa: 0x0f51, 0xcab: 0x2091, 0xcac: 0x0ee9, 0xcad: 0x1159, 0xcae: 0x0018, 0xcaf: 0x0f09, + 0xcb0: 0x0f09, 0xcb1: 0x1199, 0xcb2: 0x0040, 0xcb3: 0x0f61, 0xcb4: 0x00d9, 0xcb5: 0x20a9, + 0xcb6: 0x20c1, 0xcb7: 0x20d9, 0xcb8: 0x20f1, 0xcb9: 0x0f41, 0xcba: 0x0018, 0xcbb: 0x08cd, + 0xcbc: 0x2109, 0xcbd: 0x10b1, 0xcbe: 0x10b1, 0xcbf: 0x2109, + // Block 0x33, offset 0xcc0 + 0xcc0: 0x08ed, 0xcc1: 0x0018, 0xcc2: 0x0018, 0xcc3: 0x0018, 0xcc4: 0x0018, 0xcc5: 0x0ef9, + 0xcc6: 0x0ef9, 0xcc7: 0x0f09, 0xcc8: 0x0f41, 0xcc9: 0x0259, 0xcca: 0x0018, 0xccb: 0x0018, + 0xccc: 0x0018, 0xccd: 0x0018, 0xcce: 0x0008, 0xccf: 0x0018, 0xcd0: 0x2121, 0xcd1: 0x2151, + 0xcd2: 0x2181, 0xcd3: 0x21b9, 0xcd4: 0x21e9, 0xcd5: 0x2219, 0xcd6: 0x2249, 0xcd7: 0x2279, + 0xcd8: 0x22a9, 0xcd9: 0x22d9, 0xcda: 0x2309, 0xcdb: 0x2339, 0xcdc: 0x2369, 0xcdd: 0x2399, + 0xcde: 0x23c9, 0xcdf: 0x23f9, 0xce0: 0x0f41, 0xce1: 0x2421, 0xce2: 0x0905, 0xce3: 0x2439, + 0xce4: 0x1089, 0xce5: 0x2451, 0xce6: 0x0925, 0xce7: 0x2469, 0xce8: 0x2491, 0xce9: 0x0369, + 0xcea: 0x24a9, 0xceb: 0x0945, 0xcec: 0x0359, 0xced: 0x1159, 0xcee: 0x0ef9, 0xcef: 0x0f61, + 0xcf0: 0x0f41, 0xcf1: 0x2421, 0xcf2: 0x0965, 0xcf3: 0x2439, 0xcf4: 0x1089, 0xcf5: 0x2451, + 0xcf6: 0x0985, 0xcf7: 0x2469, 0xcf8: 0x2491, 0xcf9: 0x0369, 0xcfa: 0x24a9, 0xcfb: 0x09a5, + 0xcfc: 0x0359, 0xcfd: 0x1159, 0xcfe: 0x0ef9, 0xcff: 0x0f61, + // Block 0x34, offset 0xd00 + 0xd00: 0x0018, 0xd01: 0x0018, 0xd02: 0x0018, 0xd03: 0x0018, 0xd04: 0x0018, 0xd05: 0x0018, + 0xd06: 0x0018, 0xd07: 0x0018, 0xd08: 0x0018, 0xd09: 0x0018, 0xd0a: 0x0018, 0xd0b: 0x0040, + 0xd0c: 0x0040, 0xd0d: 0x0040, 0xd0e: 0x0040, 0xd0f: 0x0040, 0xd10: 0x0040, 0xd11: 0x0040, + 0xd12: 0x0040, 0xd13: 0x0040, 0xd14: 0x0040, 0xd15: 0x0040, 0xd16: 0x0040, 0xd17: 0x0040, + 0xd18: 0x0040, 0xd19: 0x0040, 0xd1a: 0x0040, 0xd1b: 0x0040, 0xd1c: 0x0040, 0xd1d: 0x0040, + 0xd1e: 0x0040, 0xd1f: 0x0040, 0xd20: 0x00c9, 0xd21: 0x0069, 0xd22: 0x0079, 0xd23: 0x1f51, + 0xd24: 0x1f61, 0xd25: 0x1f71, 0xd26: 0x1f81, 0xd27: 0x1f91, 0xd28: 0x1fa1, 0xd29: 0x2601, + 0xd2a: 0x2619, 0xd2b: 0x2631, 0xd2c: 0x2649, 0xd2d: 0x2661, 0xd2e: 0x2679, 0xd2f: 0x2691, + 0xd30: 0x26a9, 0xd31: 0x26c1, 0xd32: 0x26d9, 0xd33: 0x26f1, 0xd34: 0x0a06, 0xd35: 0x0a26, + 0xd36: 0x0a46, 0xd37: 0x0a66, 0xd38: 0x0a86, 0xd39: 0x0aa6, 0xd3a: 0x0ac6, 0xd3b: 0x0ae6, + 0xd3c: 0x0b06, 0xd3d: 0x270a, 0xd3e: 0x2732, 0xd3f: 0x275a, + // Block 0x35, offset 0xd40 + 0xd40: 0x2782, 0xd41: 0x27aa, 0xd42: 0x27d2, 0xd43: 0x27fa, 0xd44: 0x2822, 0xd45: 0x284a, + 0xd46: 0x2872, 0xd47: 0x289a, 0xd48: 0x0040, 0xd49: 0x0040, 0xd4a: 0x0040, 0xd4b: 0x0040, + 0xd4c: 0x0040, 0xd4d: 0x0040, 0xd4e: 0x0040, 0xd4f: 0x0040, 0xd50: 0x0040, 0xd51: 0x0040, + 0xd52: 0x0040, 0xd53: 0x0040, 0xd54: 0x0040, 0xd55: 0x0040, 0xd56: 0x0040, 0xd57: 0x0040, + 0xd58: 0x0040, 0xd59: 0x0040, 0xd5a: 0x0040, 0xd5b: 0x0040, 0xd5c: 0x0b26, 0xd5d: 0x0b46, + 0xd5e: 0x0b66, 0xd5f: 0x0b86, 0xd60: 0x0ba6, 0xd61: 0x0bc6, 0xd62: 0x0be6, 0xd63: 0x0c06, + 0xd64: 0x0c26, 0xd65: 0x0c46, 0xd66: 0x0c66, 0xd67: 0x0c86, 0xd68: 0x0ca6, 0xd69: 0x0cc6, + 0xd6a: 0x0ce6, 0xd6b: 0x0d06, 0xd6c: 0x0d26, 0xd6d: 0x0d46, 0xd6e: 0x0d66, 0xd6f: 0x0d86, + 0xd70: 0x0da6, 0xd71: 0x0dc6, 0xd72: 0x0de6, 0xd73: 0x0e06, 0xd74: 0x0e26, 0xd75: 0x0e46, + 0xd76: 0x0039, 0xd77: 0x0ee9, 0xd78: 0x1159, 0xd79: 0x0ef9, 0xd7a: 0x0f09, 0xd7b: 0x1199, + 0xd7c: 0x0f31, 0xd7d: 0x0249, 0xd7e: 0x0f41, 0xd7f: 0x0259, + // Block 0x36, offset 0xd80 + 0xd80: 0x0f51, 0xd81: 0x0359, 0xd82: 0x0f61, 0xd83: 0x0f71, 0xd84: 0x00d9, 0xd85: 0x0f99, + 0xd86: 0x2039, 0xd87: 0x0269, 0xd88: 0x01d9, 0xd89: 0x0fa9, 0xd8a: 0x0fb9, 0xd8b: 0x1089, + 0xd8c: 0x0279, 0xd8d: 0x0369, 0xd8e: 0x0289, 0xd8f: 0x13d1, 0xd90: 0x0039, 0xd91: 0x0ee9, + 0xd92: 0x1159, 0xd93: 0x0ef9, 0xd94: 0x0f09, 0xd95: 0x1199, 0xd96: 0x0f31, 0xd97: 0x0249, + 0xd98: 0x0f41, 0xd99: 0x0259, 0xd9a: 0x0f51, 0xd9b: 0x0359, 0xd9c: 0x0f61, 0xd9d: 0x0f71, + 0xd9e: 0x00d9, 0xd9f: 0x0f99, 0xda0: 0x2039, 0xda1: 0x0269, 0xda2: 0x01d9, 0xda3: 0x0fa9, + 0xda4: 0x0fb9, 0xda5: 0x1089, 0xda6: 0x0279, 0xda7: 0x0369, 0xda8: 0x0289, 0xda9: 0x13d1, + 0xdaa: 0x1f41, 0xdab: 0x0018, 0xdac: 0x0018, 0xdad: 0x0018, 0xdae: 0x0018, 0xdaf: 0x0018, + 0xdb0: 0x0018, 0xdb1: 0x0018, 0xdb2: 0x0018, 0xdb3: 0x0018, 0xdb4: 0x0018, 0xdb5: 0x0018, + 0xdb6: 0x0018, 0xdb7: 0x0018, 0xdb8: 0x0018, 0xdb9: 0x0018, 0xdba: 0x0018, 0xdbb: 0x0018, + 0xdbc: 0x0018, 0xdbd: 0x0018, 0xdbe: 0x0018, 0xdbf: 0x0018, + // Block 0x37, offset 0xdc0 + 0xdc0: 0x0008, 0xdc1: 0x0008, 0xdc2: 0x0008, 0xdc3: 0x0008, 0xdc4: 0x0008, 0xdc5: 0x0008, + 0xdc6: 0x0008, 0xdc7: 0x0008, 0xdc8: 0x0008, 0xdc9: 0x0008, 0xdca: 0x0008, 0xdcb: 0x0008, + 0xdcc: 0x0008, 0xdcd: 0x0008, 0xdce: 0x0008, 0xdcf: 0x0008, 0xdd0: 0x0008, 0xdd1: 0x0008, + 0xdd2: 0x0008, 0xdd3: 0x0008, 0xdd4: 0x0008, 0xdd5: 0x0008, 0xdd6: 0x0008, 0xdd7: 0x0008, + 0xdd8: 0x0008, 0xdd9: 0x0008, 0xdda: 0x0008, 0xddb: 0x0008, 0xddc: 0x0008, 0xddd: 0x0008, + 0xdde: 0x0008, 0xddf: 0x0040, 0xde0: 0xe00d, 0xde1: 0x0008, 0xde2: 0x2971, 0xde3: 0x0ebd, + 0xde4: 0x2989, 0xde5: 0x0008, 0xde6: 0x0008, 0xde7: 0xe07d, 0xde8: 0x0008, 0xde9: 0xe01d, + 0xdea: 0x0008, 0xdeb: 0xe03d, 0xdec: 0x0008, 0xded: 0x0fe1, 0xdee: 0x1281, 0xdef: 0x0fc9, + 0xdf0: 0x1141, 0xdf1: 0x0008, 0xdf2: 0xe00d, 0xdf3: 0x0008, 0xdf4: 0x0008, 0xdf5: 0xe01d, + 0xdf6: 0x0008, 0xdf7: 0x0008, 0xdf8: 0x0008, 0xdf9: 0x0008, 0xdfa: 0x0008, 0xdfb: 0x0008, + 0xdfc: 0x0259, 0xdfd: 0x1089, 0xdfe: 0x29a1, 0xdff: 0x29b9, + // Block 0x38, offset 0xe00 + 0xe00: 0xe00d, 0xe01: 0x0008, 0xe02: 0xe00d, 0xe03: 0x0008, 0xe04: 0xe00d, 0xe05: 0x0008, + 0xe06: 0xe00d, 0xe07: 0x0008, 0xe08: 0xe00d, 0xe09: 0x0008, 0xe0a: 0xe00d, 0xe0b: 0x0008, + 0xe0c: 0xe00d, 0xe0d: 0x0008, 0xe0e: 0xe00d, 0xe0f: 0x0008, 0xe10: 0xe00d, 0xe11: 0x0008, + 0xe12: 0xe00d, 0xe13: 0x0008, 0xe14: 0xe00d, 0xe15: 0x0008, 0xe16: 0xe00d, 0xe17: 0x0008, + 0xe18: 0xe00d, 0xe19: 0x0008, 0xe1a: 0xe00d, 0xe1b: 0x0008, 0xe1c: 0xe00d, 0xe1d: 0x0008, + 0xe1e: 0xe00d, 0xe1f: 0x0008, 0xe20: 0xe00d, 0xe21: 0x0008, 0xe22: 0xe00d, 0xe23: 0x0008, + 0xe24: 0x0008, 0xe25: 0x0018, 0xe26: 0x0018, 0xe27: 0x0018, 0xe28: 0x0018, 0xe29: 0x0018, + 0xe2a: 0x0018, 0xe2b: 0xe03d, 0xe2c: 0x0008, 0xe2d: 0xe01d, 0xe2e: 0x0008, 0xe2f: 0x3308, + 0xe30: 0x3308, 0xe31: 0x3308, 0xe32: 0xe00d, 0xe33: 0x0008, 0xe34: 0x0040, 0xe35: 0x0040, + 0xe36: 0x0040, 0xe37: 0x0040, 0xe38: 0x0040, 0xe39: 0x0018, 0xe3a: 0x0018, 0xe3b: 0x0018, + 0xe3c: 0x0018, 0xe3d: 0x0018, 0xe3e: 0x0018, 0xe3f: 0x0018, + // Block 0x39, offset 0xe40 + 0xe40: 0x26fd, 0xe41: 0x271d, 0xe42: 0x273d, 0xe43: 0x275d, 0xe44: 0x277d, 0xe45: 0x279d, + 0xe46: 0x27bd, 0xe47: 0x27dd, 0xe48: 0x27fd, 0xe49: 0x281d, 0xe4a: 0x283d, 0xe4b: 0x285d, + 0xe4c: 0x287d, 0xe4d: 0x289d, 0xe4e: 0x28bd, 0xe4f: 0x28dd, 0xe50: 0x28fd, 0xe51: 0x291d, + 0xe52: 0x293d, 0xe53: 0x295d, 0xe54: 0x297d, 0xe55: 0x299d, 0xe56: 0x0040, 0xe57: 0x0040, + 0xe58: 0x0040, 0xe59: 0x0040, 0xe5a: 0x0040, 0xe5b: 0x0040, 0xe5c: 0x0040, 0xe5d: 0x0040, + 0xe5e: 0x0040, 0xe5f: 0x0040, 0xe60: 0x0040, 0xe61: 0x0040, 0xe62: 0x0040, 0xe63: 0x0040, + 0xe64: 0x0040, 0xe65: 0x0040, 0xe66: 0x0040, 0xe67: 0x0040, 0xe68: 0x0040, 0xe69: 0x0040, + 0xe6a: 0x0040, 0xe6b: 0x0040, 0xe6c: 0x0040, 0xe6d: 0x0040, 0xe6e: 0x0040, 0xe6f: 0x0040, + 0xe70: 0x0040, 0xe71: 0x0040, 0xe72: 0x0040, 0xe73: 0x0040, 0xe74: 0x0040, 0xe75: 0x0040, + 0xe76: 0x0040, 0xe77: 0x0040, 0xe78: 0x0040, 0xe79: 0x0040, 0xe7a: 0x0040, 0xe7b: 0x0040, + 0xe7c: 0x0040, 0xe7d: 0x0040, 0xe7e: 0x0040, 0xe7f: 0x0040, + // Block 0x3a, offset 0xe80 + 0xe80: 0x000a, 0xe81: 0x0018, 0xe82: 0x29d1, 0xe83: 0x0018, 0xe84: 0x0018, 0xe85: 0x0008, + 0xe86: 0x0008, 0xe87: 0x0008, 0xe88: 0x0018, 0xe89: 0x0018, 0xe8a: 0x0018, 0xe8b: 0x0018, + 0xe8c: 0x0018, 0xe8d: 0x0018, 0xe8e: 0x0018, 0xe8f: 0x0018, 0xe90: 0x0018, 0xe91: 0x0018, + 0xe92: 0x0018, 0xe93: 0x0018, 0xe94: 0x0018, 0xe95: 0x0018, 0xe96: 0x0018, 0xe97: 0x0018, + 0xe98: 0x0018, 0xe99: 0x0018, 0xe9a: 0x0018, 0xe9b: 0x0018, 0xe9c: 0x0018, 0xe9d: 0x0018, + 0xe9e: 0x0018, 0xe9f: 0x0018, 0xea0: 0x0018, 0xea1: 0x0018, 0xea2: 0x0018, 0xea3: 0x0018, + 0xea4: 0x0018, 0xea5: 0x0018, 0xea6: 0x0018, 0xea7: 0x0018, 0xea8: 0x0018, 0xea9: 0x0018, + 0xeaa: 0x3308, 0xeab: 0x3308, 0xeac: 0x3308, 0xead: 0x3308, 0xeae: 0x3018, 0xeaf: 0x3018, + 0xeb0: 0x0018, 0xeb1: 0x0018, 0xeb2: 0x0018, 0xeb3: 0x0018, 0xeb4: 0x0018, 0xeb5: 0x0018, + 0xeb6: 0xe125, 0xeb7: 0x0018, 0xeb8: 0x29bd, 0xeb9: 0x29dd, 0xeba: 0x29fd, 0xebb: 0x0018, + 0xebc: 0x0008, 0xebd: 0x0018, 0xebe: 0x0018, 0xebf: 0x0018, + // Block 0x3b, offset 0xec0 + 0xec0: 0x2b3d, 0xec1: 0x2b5d, 0xec2: 0x2b7d, 0xec3: 0x2b9d, 0xec4: 0x2bbd, 0xec5: 0x2bdd, + 0xec6: 0x2bdd, 0xec7: 0x2bdd, 0xec8: 0x2bfd, 0xec9: 0x2bfd, 0xeca: 0x2bfd, 0xecb: 0x2bfd, + 0xecc: 0x2c1d, 0xecd: 0x2c1d, 0xece: 0x2c1d, 0xecf: 0x2c3d, 0xed0: 0x2c5d, 0xed1: 0x2c5d, + 0xed2: 0x2a7d, 0xed3: 0x2a7d, 0xed4: 0x2c5d, 0xed5: 0x2c5d, 0xed6: 0x2c7d, 0xed7: 0x2c7d, + 0xed8: 0x2c5d, 0xed9: 0x2c5d, 0xeda: 0x2a7d, 0xedb: 0x2a7d, 0xedc: 0x2c5d, 0xedd: 0x2c5d, + 0xede: 0x2c3d, 0xedf: 0x2c3d, 0xee0: 0x2c9d, 0xee1: 0x2c9d, 0xee2: 0x2cbd, 0xee3: 0x2cbd, + 0xee4: 0x0040, 0xee5: 0x2cdd, 0xee6: 0x2cfd, 0xee7: 0x2d1d, 0xee8: 0x2d1d, 0xee9: 0x2d3d, + 0xeea: 0x2d5d, 0xeeb: 0x2d7d, 0xeec: 0x2d9d, 0xeed: 0x2dbd, 0xeee: 0x2ddd, 0xeef: 0x2dfd, + 0xef0: 0x2e1d, 0xef1: 0x2e3d, 0xef2: 0x2e3d, 0xef3: 0x2e5d, 0xef4: 0x2e7d, 0xef5: 0x2e7d, + 0xef6: 0x2e9d, 0xef7: 0x2ebd, 0xef8: 0x2e5d, 0xef9: 0x2edd, 0xefa: 0x2efd, 0xefb: 0x2edd, + 0xefc: 0x2e5d, 0xefd: 0x2f1d, 0xefe: 0x2f3d, 0xeff: 0x2f5d, + // Block 0x3c, offset 0xf00 + 0xf00: 0x2f7d, 0xf01: 0x2f9d, 0xf02: 0x2cfd, 0xf03: 0x2cdd, 0xf04: 0x2fbd, 0xf05: 0x2fdd, + 0xf06: 0x2ffd, 0xf07: 0x301d, 0xf08: 0x303d, 0xf09: 0x305d, 0xf0a: 0x307d, 0xf0b: 0x309d, + 0xf0c: 0x30bd, 0xf0d: 0x30dd, 0xf0e: 0x30fd, 0xf0f: 0x0040, 0xf10: 0x0018, 0xf11: 0x0018, + 0xf12: 0x311d, 0xf13: 0x313d, 0xf14: 0x315d, 0xf15: 0x317d, 0xf16: 0x319d, 0xf17: 0x31bd, + 0xf18: 0x31dd, 0xf19: 0x31fd, 0xf1a: 0x321d, 0xf1b: 0x323d, 0xf1c: 0x315d, 0xf1d: 0x325d, + 0xf1e: 0x327d, 0xf1f: 0x329d, 0xf20: 0x0008, 0xf21: 0x0008, 0xf22: 0x0008, 0xf23: 0x0008, + 0xf24: 0x0008, 0xf25: 0x0008, 0xf26: 0x0008, 0xf27: 0x0008, 0xf28: 0x0008, 0xf29: 0x0008, + 0xf2a: 0x0008, 0xf2b: 0x0008, 0xf2c: 0x0008, 0xf2d: 0x0008, 0xf2e: 0x0008, 0xf2f: 0x0008, + 0xf30: 0x0008, 0xf31: 0x0008, 0xf32: 0x0008, 0xf33: 0x0008, 0xf34: 0x0008, 0xf35: 0x0008, + 0xf36: 0x0008, 0xf37: 0x0008, 0xf38: 0x0008, 0xf39: 0x0008, 0xf3a: 0x0008, 0xf3b: 0x0040, + 0xf3c: 0x0040, 0xf3d: 0x0040, 0xf3e: 0x0040, 0xf3f: 0x0040, + // Block 0x3d, offset 0xf40 + 0xf40: 0x36a2, 0xf41: 0x36d2, 0xf42: 0x3702, 0xf43: 0x3732, 0xf44: 0x32bd, 0xf45: 0x32dd, + 0xf46: 0x32fd, 0xf47: 0x331d, 0xf48: 0x0018, 0xf49: 0x0018, 0xf4a: 0x0018, 0xf4b: 0x0018, + 0xf4c: 0x0018, 0xf4d: 0x0018, 0xf4e: 0x0018, 0xf4f: 0x0018, 0xf50: 0x333d, 0xf51: 0x3761, + 0xf52: 0x3779, 0xf53: 0x3791, 0xf54: 0x37a9, 0xf55: 0x37c1, 0xf56: 0x37d9, 0xf57: 0x37f1, + 0xf58: 0x3809, 0xf59: 0x3821, 0xf5a: 0x3839, 0xf5b: 0x3851, 0xf5c: 0x3869, 0xf5d: 0x3881, + 0xf5e: 0x3899, 0xf5f: 0x38b1, 0xf60: 0x335d, 0xf61: 0x337d, 0xf62: 0x339d, 0xf63: 0x33bd, + 0xf64: 0x33dd, 0xf65: 0x33dd, 0xf66: 0x33fd, 0xf67: 0x341d, 0xf68: 0x343d, 0xf69: 0x345d, + 0xf6a: 0x347d, 0xf6b: 0x349d, 0xf6c: 0x34bd, 0xf6d: 0x34dd, 0xf6e: 0x34fd, 0xf6f: 0x351d, + 0xf70: 0x353d, 0xf71: 0x355d, 0xf72: 0x357d, 0xf73: 0x359d, 0xf74: 0x35bd, 0xf75: 0x35dd, + 0xf76: 0x35fd, 0xf77: 0x361d, 0xf78: 0x363d, 0xf79: 0x365d, 0xf7a: 0x367d, 0xf7b: 0x369d, + 0xf7c: 0x38c9, 0xf7d: 0x3901, 0xf7e: 0x36bd, 0xf7f: 0x0018, + // Block 0x3e, offset 0xf80 + 0xf80: 0x36dd, 0xf81: 0x36fd, 0xf82: 0x371d, 0xf83: 0x373d, 0xf84: 0x375d, 0xf85: 0x377d, + 0xf86: 0x379d, 0xf87: 0x37bd, 0xf88: 0x37dd, 0xf89: 0x37fd, 0xf8a: 0x381d, 0xf8b: 0x383d, + 0xf8c: 0x385d, 0xf8d: 0x387d, 0xf8e: 0x389d, 0xf8f: 0x38bd, 0xf90: 0x38dd, 0xf91: 0x38fd, + 0xf92: 0x391d, 0xf93: 0x393d, 0xf94: 0x395d, 0xf95: 0x397d, 0xf96: 0x399d, 0xf97: 0x39bd, + 0xf98: 0x39dd, 0xf99: 0x39fd, 0xf9a: 0x3a1d, 0xf9b: 0x3a3d, 0xf9c: 0x3a5d, 0xf9d: 0x3a7d, + 0xf9e: 0x3a9d, 0xf9f: 0x3abd, 0xfa0: 0x3add, 0xfa1: 0x3afd, 0xfa2: 0x3b1d, 0xfa3: 0x3b3d, + 0xfa4: 0x3b5d, 0xfa5: 0x3b7d, 0xfa6: 0x127d, 0xfa7: 0x3b9d, 0xfa8: 0x3bbd, 0xfa9: 0x3bdd, + 0xfaa: 0x3bfd, 0xfab: 0x3c1d, 0xfac: 0x3c3d, 0xfad: 0x3c5d, 0xfae: 0x239d, 0xfaf: 0x3c7d, + 0xfb0: 0x3c9d, 0xfb1: 0x3939, 0xfb2: 0x3951, 0xfb3: 0x3969, 0xfb4: 0x3981, 0xfb5: 0x3999, + 0xfb6: 0x39b1, 0xfb7: 0x39c9, 0xfb8: 0x39e1, 0xfb9: 0x39f9, 0xfba: 0x3a11, 0xfbb: 0x3a29, + 0xfbc: 0x3a41, 0xfbd: 0x3a59, 0xfbe: 0x3a71, 0xfbf: 0x3a89, + // Block 0x3f, offset 0xfc0 + 0xfc0: 0x3aa1, 0xfc1: 0x3ac9, 0xfc2: 0x3af1, 0xfc3: 0x3b19, 0xfc4: 0x3b41, 0xfc5: 0x3b69, + 0xfc6: 0x3b91, 0xfc7: 0x3bb9, 0xfc8: 0x3be1, 0xfc9: 0x3c09, 0xfca: 0x3c39, 0xfcb: 0x3c69, + 0xfcc: 0x3c99, 0xfcd: 0x3cbd, 0xfce: 0x3cb1, 0xfcf: 0x3cdd, 0xfd0: 0x3cfd, 0xfd1: 0x3d15, + 0xfd2: 0x3d2d, 0xfd3: 0x3d45, 0xfd4: 0x3d5d, 0xfd5: 0x3d5d, 0xfd6: 0x3d45, 0xfd7: 0x3d75, + 0xfd8: 0x07bd, 0xfd9: 0x3d8d, 0xfda: 0x3da5, 0xfdb: 0x3dbd, 0xfdc: 0x3dd5, 0xfdd: 0x3ded, + 0xfde: 0x3e05, 0xfdf: 0x3e1d, 0xfe0: 0x3e35, 0xfe1: 0x3e4d, 0xfe2: 0x3e65, 0xfe3: 0x3e7d, + 0xfe4: 0x3e95, 0xfe5: 0x3e95, 0xfe6: 0x3ead, 0xfe7: 0x3ead, 0xfe8: 0x3ec5, 0xfe9: 0x3ec5, + 0xfea: 0x3edd, 0xfeb: 0x3ef5, 0xfec: 0x3f0d, 0xfed: 0x3f25, 0xfee: 0x3f3d, 0xfef: 0x3f3d, + 0xff0: 0x3f55, 0xff1: 0x3f55, 0xff2: 0x3f55, 0xff3: 0x3f6d, 0xff4: 0x3f85, 0xff5: 0x3f9d, + 0xff6: 0x3fb5, 0xff7: 0x3f9d, 0xff8: 0x3fcd, 0xff9: 0x3fe5, 0xffa: 0x3f6d, 0xffb: 0x3ffd, + 0xffc: 0x4015, 0xffd: 0x4015, 0xffe: 0x4015, 0xfff: 0x0040, + // Block 0x40, offset 0x1000 + 0x1000: 0x3cc9, 0x1001: 0x3d31, 0x1002: 0x3d99, 0x1003: 0x3e01, 0x1004: 0x3e51, 0x1005: 0x3eb9, + 0x1006: 0x3f09, 0x1007: 0x3f59, 0x1008: 0x3fd9, 0x1009: 0x4041, 0x100a: 0x4091, 0x100b: 0x40e1, + 0x100c: 0x4131, 0x100d: 0x4199, 0x100e: 0x4201, 0x100f: 0x4251, 0x1010: 0x42a1, 0x1011: 0x42d9, + 0x1012: 0x4329, 0x1013: 0x4391, 0x1014: 0x43f9, 0x1015: 0x4431, 0x1016: 0x44b1, 0x1017: 0x4549, + 0x1018: 0x45c9, 0x1019: 0x4619, 0x101a: 0x4699, 0x101b: 0x4719, 0x101c: 0x4781, 0x101d: 0x47d1, + 0x101e: 0x4821, 0x101f: 0x4871, 0x1020: 0x48d9, 0x1021: 0x4959, 0x1022: 0x49c1, 0x1023: 0x4a11, + 0x1024: 0x4a61, 0x1025: 0x4ab1, 0x1026: 0x4ae9, 0x1027: 0x4b21, 0x1028: 0x4b59, 0x1029: 0x4b91, + 0x102a: 0x4be1, 0x102b: 0x4c31, 0x102c: 0x4cb1, 0x102d: 0x4d01, 0x102e: 0x4d69, 0x102f: 0x4de9, + 0x1030: 0x4e39, 0x1031: 0x4e71, 0x1032: 0x4ea9, 0x1033: 0x4f29, 0x1034: 0x4f91, 0x1035: 0x5011, + 0x1036: 0x5061, 0x1037: 0x50e1, 0x1038: 0x5119, 0x1039: 0x5169, 0x103a: 0x51b9, 0x103b: 0x5209, + 0x103c: 0x5259, 0x103d: 0x52a9, 0x103e: 0x5311, 0x103f: 0x5361, + // Block 0x41, offset 0x1040 + 0x1040: 0x5399, 0x1041: 0x53e9, 0x1042: 0x5439, 0x1043: 0x5489, 0x1044: 0x54f1, 0x1045: 0x5541, + 0x1046: 0x5591, 0x1047: 0x55e1, 0x1048: 0x5661, 0x1049: 0x56c9, 0x104a: 0x5701, 0x104b: 0x5781, + 0x104c: 0x57b9, 0x104d: 0x5821, 0x104e: 0x5889, 0x104f: 0x58d9, 0x1050: 0x5929, 0x1051: 0x5979, + 0x1052: 0x59e1, 0x1053: 0x5a19, 0x1054: 0x5a69, 0x1055: 0x5ad1, 0x1056: 0x5b09, 0x1057: 0x5b89, + 0x1058: 0x5bd9, 0x1059: 0x5c01, 0x105a: 0x5c29, 0x105b: 0x5c51, 0x105c: 0x5c79, 0x105d: 0x5ca1, + 0x105e: 0x5cc9, 0x105f: 0x5cf1, 0x1060: 0x5d19, 0x1061: 0x5d41, 0x1062: 0x5d69, 0x1063: 0x5d99, + 0x1064: 0x5dc9, 0x1065: 0x5df9, 0x1066: 0x5e29, 0x1067: 0x5e59, 0x1068: 0x5e89, 0x1069: 0x5eb9, + 0x106a: 0x5ee9, 0x106b: 0x5f19, 0x106c: 0x5f49, 0x106d: 0x5f79, 0x106e: 0x5fa9, 0x106f: 0x5fd9, + 0x1070: 0x6009, 0x1071: 0x402d, 0x1072: 0x6039, 0x1073: 0x6051, 0x1074: 0x404d, 0x1075: 0x6069, + 0x1076: 0x6081, 0x1077: 0x6099, 0x1078: 0x406d, 0x1079: 0x406d, 0x107a: 0x60b1, 0x107b: 0x60c9, + 0x107c: 0x6101, 0x107d: 0x6139, 0x107e: 0x6171, 0x107f: 0x61a9, + // Block 0x42, offset 0x1080 + 0x1080: 0x6211, 0x1081: 0x6229, 0x1082: 0x408d, 0x1083: 0x6241, 0x1084: 0x6259, 0x1085: 0x6271, + 0x1086: 0x6289, 0x1087: 0x62a1, 0x1088: 0x40ad, 0x1089: 0x62b9, 0x108a: 0x62e1, 0x108b: 0x62f9, + 0x108c: 0x40cd, 0x108d: 0x40cd, 0x108e: 0x6311, 0x108f: 0x6329, 0x1090: 0x6341, 0x1091: 0x40ed, + 0x1092: 0x410d, 0x1093: 0x412d, 0x1094: 0x414d, 0x1095: 0x416d, 0x1096: 0x6359, 0x1097: 0x6371, + 0x1098: 0x6389, 0x1099: 0x63a1, 0x109a: 0x63b9, 0x109b: 0x418d, 0x109c: 0x63d1, 0x109d: 0x63e9, + 0x109e: 0x6401, 0x109f: 0x41ad, 0x10a0: 0x41cd, 0x10a1: 0x6419, 0x10a2: 0x41ed, 0x10a3: 0x420d, + 0x10a4: 0x422d, 0x10a5: 0x6431, 0x10a6: 0x424d, 0x10a7: 0x6449, 0x10a8: 0x6479, 0x10a9: 0x6211, + 0x10aa: 0x426d, 0x10ab: 0x428d, 0x10ac: 0x42ad, 0x10ad: 0x42cd, 0x10ae: 0x64b1, 0x10af: 0x64f1, + 0x10b0: 0x6539, 0x10b1: 0x6551, 0x10b2: 0x42ed, 0x10b3: 0x6569, 0x10b4: 0x6581, 0x10b5: 0x6599, + 0x10b6: 0x430d, 0x10b7: 0x65b1, 0x10b8: 0x65c9, 0x10b9: 0x65b1, 0x10ba: 0x65e1, 0x10bb: 0x65f9, + 0x10bc: 0x432d, 0x10bd: 0x6611, 0x10be: 0x6629, 0x10bf: 0x6611, + // Block 0x43, offset 0x10c0 + 0x10c0: 0x434d, 0x10c1: 0x436d, 0x10c2: 0x0040, 0x10c3: 0x6641, 0x10c4: 0x6659, 0x10c5: 0x6671, + 0x10c6: 0x6689, 0x10c7: 0x0040, 0x10c8: 0x66c1, 0x10c9: 0x66d9, 0x10ca: 0x66f1, 0x10cb: 0x6709, + 0x10cc: 0x6721, 0x10cd: 0x6739, 0x10ce: 0x6401, 0x10cf: 0x6751, 0x10d0: 0x6769, 0x10d1: 0x6781, + 0x10d2: 0x438d, 0x10d3: 0x6799, 0x10d4: 0x6289, 0x10d5: 0x43ad, 0x10d6: 0x43cd, 0x10d7: 0x67b1, + 0x10d8: 0x0040, 0x10d9: 0x43ed, 0x10da: 0x67c9, 0x10db: 0x67e1, 0x10dc: 0x67f9, 0x10dd: 0x6811, + 0x10de: 0x6829, 0x10df: 0x6859, 0x10e0: 0x6889, 0x10e1: 0x68b1, 0x10e2: 0x68d9, 0x10e3: 0x6901, + 0x10e4: 0x6929, 0x10e5: 0x6951, 0x10e6: 0x6979, 0x10e7: 0x69a1, 0x10e8: 0x69c9, 0x10e9: 0x69f1, + 0x10ea: 0x6a21, 0x10eb: 0x6a51, 0x10ec: 0x6a81, 0x10ed: 0x6ab1, 0x10ee: 0x6ae1, 0x10ef: 0x6b11, + 0x10f0: 0x6b41, 0x10f1: 0x6b71, 0x10f2: 0x6ba1, 0x10f3: 0x6bd1, 0x10f4: 0x6c01, 0x10f5: 0x6c31, + 0x10f6: 0x6c61, 0x10f7: 0x6c91, 0x10f8: 0x6cc1, 0x10f9: 0x6cf1, 0x10fa: 0x6d21, 0x10fb: 0x6d51, + 0x10fc: 0x6d81, 0x10fd: 0x6db1, 0x10fe: 0x6de1, 0x10ff: 0x440d, + // Block 0x44, offset 0x1100 + 0x1100: 0xe00d, 0x1101: 0x0008, 0x1102: 0xe00d, 0x1103: 0x0008, 0x1104: 0xe00d, 0x1105: 0x0008, + 0x1106: 0xe00d, 0x1107: 0x0008, 0x1108: 0xe00d, 0x1109: 0x0008, 0x110a: 0xe00d, 0x110b: 0x0008, + 0x110c: 0xe00d, 0x110d: 0x0008, 0x110e: 0xe00d, 0x110f: 0x0008, 0x1110: 0xe00d, 0x1111: 0x0008, + 0x1112: 0xe00d, 0x1113: 0x0008, 0x1114: 0xe00d, 0x1115: 0x0008, 0x1116: 0xe00d, 0x1117: 0x0008, + 0x1118: 0xe00d, 0x1119: 0x0008, 0x111a: 0xe00d, 0x111b: 0x0008, 0x111c: 0xe00d, 0x111d: 0x0008, + 0x111e: 0xe00d, 0x111f: 0x0008, 0x1120: 0xe00d, 0x1121: 0x0008, 0x1122: 0xe00d, 0x1123: 0x0008, + 0x1124: 0xe00d, 0x1125: 0x0008, 0x1126: 0xe00d, 0x1127: 0x0008, 0x1128: 0xe00d, 0x1129: 0x0008, + 0x112a: 0xe00d, 0x112b: 0x0008, 0x112c: 0xe00d, 0x112d: 0x0008, 0x112e: 0x0008, 0x112f: 0x3308, + 0x1130: 0x3318, 0x1131: 0x3318, 0x1132: 0x3318, 0x1133: 0x0018, 0x1134: 0x3308, 0x1135: 0x3308, + 0x1136: 0x3308, 0x1137: 0x3308, 0x1138: 0x3308, 0x1139: 0x3308, 0x113a: 0x3308, 0x113b: 0x3308, + 0x113c: 0x3308, 0x113d: 0x3308, 0x113e: 0x0018, 0x113f: 0x0008, + // Block 0x45, offset 0x1140 + 0x1140: 0xe00d, 0x1141: 0x0008, 0x1142: 0xe00d, 0x1143: 0x0008, 0x1144: 0xe00d, 0x1145: 0x0008, + 0x1146: 0xe00d, 0x1147: 0x0008, 0x1148: 0xe00d, 0x1149: 0x0008, 0x114a: 0xe00d, 0x114b: 0x0008, + 0x114c: 0xe00d, 0x114d: 0x0008, 0x114e: 0xe00d, 0x114f: 0x0008, 0x1150: 0xe00d, 0x1151: 0x0008, + 0x1152: 0xe00d, 0x1153: 0x0008, 0x1154: 0xe00d, 0x1155: 0x0008, 0x1156: 0xe00d, 0x1157: 0x0008, + 0x1158: 0xe00d, 0x1159: 0x0008, 0x115a: 0xe00d, 0x115b: 0x0008, 0x115c: 0x0ea1, 0x115d: 0x6e11, + 0x115e: 0x3308, 0x115f: 0x3308, 0x1160: 0x0008, 0x1161: 0x0008, 0x1162: 0x0008, 0x1163: 0x0008, + 0x1164: 0x0008, 0x1165: 0x0008, 0x1166: 0x0008, 0x1167: 0x0008, 0x1168: 0x0008, 0x1169: 0x0008, + 0x116a: 0x0008, 0x116b: 0x0008, 0x116c: 0x0008, 0x116d: 0x0008, 0x116e: 0x0008, 0x116f: 0x0008, + 0x1170: 0x0008, 0x1171: 0x0008, 0x1172: 0x0008, 0x1173: 0x0008, 0x1174: 0x0008, 0x1175: 0x0008, + 0x1176: 0x0008, 0x1177: 0x0008, 0x1178: 0x0008, 0x1179: 0x0008, 0x117a: 0x0008, 0x117b: 0x0008, + 0x117c: 0x0008, 0x117d: 0x0008, 0x117e: 0x0008, 0x117f: 0x0008, + // Block 0x46, offset 0x1180 + 0x1180: 0x0018, 0x1181: 0x0018, 0x1182: 0x0018, 0x1183: 0x0018, 0x1184: 0x0018, 0x1185: 0x0018, + 0x1186: 0x0018, 0x1187: 0x0018, 0x1188: 0x0018, 0x1189: 0x0018, 0x118a: 0x0018, 0x118b: 0x0018, + 0x118c: 0x0018, 0x118d: 0x0018, 0x118e: 0x0018, 0x118f: 0x0018, 0x1190: 0x0018, 0x1191: 0x0018, + 0x1192: 0x0018, 0x1193: 0x0018, 0x1194: 0x0018, 0x1195: 0x0018, 0x1196: 0x0018, 0x1197: 0x0008, + 0x1198: 0x0008, 0x1199: 0x0008, 0x119a: 0x0008, 0x119b: 0x0008, 0x119c: 0x0008, 0x119d: 0x0008, + 0x119e: 0x0008, 0x119f: 0x0008, 0x11a0: 0x0018, 0x11a1: 0x0018, 0x11a2: 0xe00d, 0x11a3: 0x0008, + 0x11a4: 0xe00d, 0x11a5: 0x0008, 0x11a6: 0xe00d, 0x11a7: 0x0008, 0x11a8: 0xe00d, 0x11a9: 0x0008, + 0x11aa: 0xe00d, 0x11ab: 0x0008, 0x11ac: 0xe00d, 0x11ad: 0x0008, 0x11ae: 0xe00d, 0x11af: 0x0008, + 0x11b0: 0x0008, 0x11b1: 0x0008, 0x11b2: 0xe00d, 0x11b3: 0x0008, 0x11b4: 0xe00d, 0x11b5: 0x0008, + 0x11b6: 0xe00d, 0x11b7: 0x0008, 0x11b8: 0xe00d, 0x11b9: 0x0008, 0x11ba: 0xe00d, 0x11bb: 0x0008, + 0x11bc: 0xe00d, 0x11bd: 0x0008, 0x11be: 0xe00d, 0x11bf: 0x0008, + // Block 0x47, offset 0x11c0 + 0x11c0: 0xe00d, 0x11c1: 0x0008, 0x11c2: 0xe00d, 0x11c3: 0x0008, 0x11c4: 0xe00d, 0x11c5: 0x0008, + 0x11c6: 0xe00d, 0x11c7: 0x0008, 0x11c8: 0xe00d, 0x11c9: 0x0008, 0x11ca: 0xe00d, 0x11cb: 0x0008, + 0x11cc: 0xe00d, 0x11cd: 0x0008, 0x11ce: 0xe00d, 0x11cf: 0x0008, 0x11d0: 0xe00d, 0x11d1: 0x0008, + 0x11d2: 0xe00d, 0x11d3: 0x0008, 0x11d4: 0xe00d, 0x11d5: 0x0008, 0x11d6: 0xe00d, 0x11d7: 0x0008, + 0x11d8: 0xe00d, 0x11d9: 0x0008, 0x11da: 0xe00d, 0x11db: 0x0008, 0x11dc: 0xe00d, 0x11dd: 0x0008, + 0x11de: 0xe00d, 0x11df: 0x0008, 0x11e0: 0xe00d, 0x11e1: 0x0008, 0x11e2: 0xe00d, 0x11e3: 0x0008, + 0x11e4: 0xe00d, 0x11e5: 0x0008, 0x11e6: 0xe00d, 0x11e7: 0x0008, 0x11e8: 0xe00d, 0x11e9: 0x0008, + 0x11ea: 0xe00d, 0x11eb: 0x0008, 0x11ec: 0xe00d, 0x11ed: 0x0008, 0x11ee: 0xe00d, 0x11ef: 0x0008, + 0x11f0: 0xe0fd, 0x11f1: 0x0008, 0x11f2: 0x0008, 0x11f3: 0x0008, 0x11f4: 0x0008, 0x11f5: 0x0008, + 0x11f6: 0x0008, 0x11f7: 0x0008, 0x11f8: 0x0008, 0x11f9: 0xe01d, 0x11fa: 0x0008, 0x11fb: 0xe03d, + 0x11fc: 0x0008, 0x11fd: 0x442d, 0x11fe: 0xe00d, 0x11ff: 0x0008, + // Block 0x48, offset 0x1200 + 0x1200: 0xe00d, 0x1201: 0x0008, 0x1202: 0xe00d, 0x1203: 0x0008, 0x1204: 0xe00d, 0x1205: 0x0008, + 0x1206: 0xe00d, 0x1207: 0x0008, 0x1208: 0x0008, 0x1209: 0x0018, 0x120a: 0x0018, 0x120b: 0xe03d, + 0x120c: 0x0008, 0x120d: 0x11d9, 0x120e: 0x0008, 0x120f: 0x0008, 0x1210: 0xe00d, 0x1211: 0x0008, + 0x1212: 0xe00d, 0x1213: 0x0008, 0x1214: 0x0008, 0x1215: 0x0008, 0x1216: 0xe00d, 0x1217: 0x0008, + 0x1218: 0xe00d, 0x1219: 0x0008, 0x121a: 0xe00d, 0x121b: 0x0008, 0x121c: 0xe00d, 0x121d: 0x0008, + 0x121e: 0xe00d, 0x121f: 0x0008, 0x1220: 0xe00d, 0x1221: 0x0008, 0x1222: 0xe00d, 0x1223: 0x0008, + 0x1224: 0xe00d, 0x1225: 0x0008, 0x1226: 0xe00d, 0x1227: 0x0008, 0x1228: 0xe00d, 0x1229: 0x0008, + 0x122a: 0x6e29, 0x122b: 0x1029, 0x122c: 0x11c1, 0x122d: 0x6e41, 0x122e: 0x1221, 0x122f: 0x0040, + 0x1230: 0x6e59, 0x1231: 0x6e71, 0x1232: 0x1239, 0x1233: 0x444d, 0x1234: 0xe00d, 0x1235: 0x0008, + 0x1236: 0xe00d, 0x1237: 0x0008, 0x1238: 0x0040, 0x1239: 0x0040, 0x123a: 0x0040, 0x123b: 0x0040, + 0x123c: 0x0040, 0x123d: 0x0040, 0x123e: 0x0040, 0x123f: 0x0040, + // Block 0x49, offset 0x1240 + 0x1240: 0x64d5, 0x1241: 0x64f5, 0x1242: 0x6515, 0x1243: 0x6535, 0x1244: 0x6555, 0x1245: 0x6575, + 0x1246: 0x6595, 0x1247: 0x65b5, 0x1248: 0x65d5, 0x1249: 0x65f5, 0x124a: 0x6615, 0x124b: 0x6635, + 0x124c: 0x6655, 0x124d: 0x6675, 0x124e: 0x0008, 0x124f: 0x0008, 0x1250: 0x6695, 0x1251: 0x0008, + 0x1252: 0x66b5, 0x1253: 0x0008, 0x1254: 0x0008, 0x1255: 0x66d5, 0x1256: 0x66f5, 0x1257: 0x6715, + 0x1258: 0x6735, 0x1259: 0x6755, 0x125a: 0x6775, 0x125b: 0x6795, 0x125c: 0x67b5, 0x125d: 0x67d5, + 0x125e: 0x67f5, 0x125f: 0x0008, 0x1260: 0x6815, 0x1261: 0x0008, 0x1262: 0x6835, 0x1263: 0x0008, + 0x1264: 0x0008, 0x1265: 0x6855, 0x1266: 0x6875, 0x1267: 0x0008, 0x1268: 0x0008, 0x1269: 0x0008, + 0x126a: 0x6895, 0x126b: 0x68b5, 0x126c: 0x68d5, 0x126d: 0x68f5, 0x126e: 0x6915, 0x126f: 0x6935, + 0x1270: 0x6955, 0x1271: 0x6975, 0x1272: 0x6995, 0x1273: 0x69b5, 0x1274: 0x69d5, 0x1275: 0x69f5, + 0x1276: 0x6a15, 0x1277: 0x6a35, 0x1278: 0x6a55, 0x1279: 0x6a75, 0x127a: 0x6a95, 0x127b: 0x6ab5, + 0x127c: 0x6ad5, 0x127d: 0x6af5, 0x127e: 0x6b15, 0x127f: 0x6b35, + // Block 0x4a, offset 0x1280 + 0x1280: 0x7a95, 0x1281: 0x7ab5, 0x1282: 0x7ad5, 0x1283: 0x7af5, 0x1284: 0x7b15, 0x1285: 0x7b35, + 0x1286: 0x7b55, 0x1287: 0x7b75, 0x1288: 0x7b95, 0x1289: 0x7bb5, 0x128a: 0x7bd5, 0x128b: 0x7bf5, + 0x128c: 0x7c15, 0x128d: 0x7c35, 0x128e: 0x7c55, 0x128f: 0x6ec9, 0x1290: 0x6ef1, 0x1291: 0x6f19, + 0x1292: 0x7c75, 0x1293: 0x7c95, 0x1294: 0x7cb5, 0x1295: 0x6f41, 0x1296: 0x6f69, 0x1297: 0x6f91, + 0x1298: 0x7cd5, 0x1299: 0x7cf5, 0x129a: 0x0040, 0x129b: 0x0040, 0x129c: 0x0040, 0x129d: 0x0040, + 0x129e: 0x0040, 0x129f: 0x0040, 0x12a0: 0x0040, 0x12a1: 0x0040, 0x12a2: 0x0040, 0x12a3: 0x0040, + 0x12a4: 0x0040, 0x12a5: 0x0040, 0x12a6: 0x0040, 0x12a7: 0x0040, 0x12a8: 0x0040, 0x12a9: 0x0040, + 0x12aa: 0x0040, 0x12ab: 0x0040, 0x12ac: 0x0040, 0x12ad: 0x0040, 0x12ae: 0x0040, 0x12af: 0x0040, + 0x12b0: 0x0040, 0x12b1: 0x0040, 0x12b2: 0x0040, 0x12b3: 0x0040, 0x12b4: 0x0040, 0x12b5: 0x0040, + 0x12b6: 0x0040, 0x12b7: 0x0040, 0x12b8: 0x0040, 0x12b9: 0x0040, 0x12ba: 0x0040, 0x12bb: 0x0040, + 0x12bc: 0x0040, 0x12bd: 0x0040, 0x12be: 0x0040, 0x12bf: 0x0040, + // Block 0x4b, offset 0x12c0 + 0x12c0: 0x6fb9, 0x12c1: 0x6fd1, 0x12c2: 0x6fe9, 0x12c3: 0x7d15, 0x12c4: 0x7d35, 0x12c5: 0x7001, + 0x12c6: 0x7001, 0x12c7: 0x0040, 0x12c8: 0x0040, 0x12c9: 0x0040, 0x12ca: 0x0040, 0x12cb: 0x0040, + 0x12cc: 0x0040, 0x12cd: 0x0040, 0x12ce: 0x0040, 0x12cf: 0x0040, 0x12d0: 0x0040, 0x12d1: 0x0040, + 0x12d2: 0x0040, 0x12d3: 0x7019, 0x12d4: 0x7041, 0x12d5: 0x7069, 0x12d6: 0x7091, 0x12d7: 0x70b9, + 0x12d8: 0x0040, 0x12d9: 0x0040, 0x12da: 0x0040, 0x12db: 0x0040, 0x12dc: 0x0040, 0x12dd: 0x70e1, + 0x12de: 0x3308, 0x12df: 0x7109, 0x12e0: 0x7131, 0x12e1: 0x20a9, 0x12e2: 0x20f1, 0x12e3: 0x7149, + 0x12e4: 0x7161, 0x12e5: 0x7179, 0x12e6: 0x7191, 0x12e7: 0x71a9, 0x12e8: 0x71c1, 0x12e9: 0x1fb2, + 0x12ea: 0x71d9, 0x12eb: 0x7201, 0x12ec: 0x7229, 0x12ed: 0x7261, 0x12ee: 0x7299, 0x12ef: 0x72c1, + 0x12f0: 0x72e9, 0x12f1: 0x7311, 0x12f2: 0x7339, 0x12f3: 0x7361, 0x12f4: 0x7389, 0x12f5: 0x73b1, + 0x12f6: 0x73d9, 0x12f7: 0x0040, 0x12f8: 0x7401, 0x12f9: 0x7429, 0x12fa: 0x7451, 0x12fb: 0x7479, + 0x12fc: 0x74a1, 0x12fd: 0x0040, 0x12fe: 0x74c9, 0x12ff: 0x0040, + // Block 0x4c, offset 0x1300 + 0x1300: 0x74f1, 0x1301: 0x7519, 0x1302: 0x0040, 0x1303: 0x7541, 0x1304: 0x7569, 0x1305: 0x0040, + 0x1306: 0x7591, 0x1307: 0x75b9, 0x1308: 0x75e1, 0x1309: 0x7609, 0x130a: 0x7631, 0x130b: 0x7659, + 0x130c: 0x7681, 0x130d: 0x76a9, 0x130e: 0x76d1, 0x130f: 0x76f9, 0x1310: 0x7721, 0x1311: 0x7721, + 0x1312: 0x7739, 0x1313: 0x7739, 0x1314: 0x7739, 0x1315: 0x7739, 0x1316: 0x7751, 0x1317: 0x7751, + 0x1318: 0x7751, 0x1319: 0x7751, 0x131a: 0x7769, 0x131b: 0x7769, 0x131c: 0x7769, 0x131d: 0x7769, + 0x131e: 0x7781, 0x131f: 0x7781, 0x1320: 0x7781, 0x1321: 0x7781, 0x1322: 0x7799, 0x1323: 0x7799, + 0x1324: 0x7799, 0x1325: 0x7799, 0x1326: 0x77b1, 0x1327: 0x77b1, 0x1328: 0x77b1, 0x1329: 0x77b1, + 0x132a: 0x77c9, 0x132b: 0x77c9, 0x132c: 0x77c9, 0x132d: 0x77c9, 0x132e: 0x77e1, 0x132f: 0x77e1, + 0x1330: 0x77e1, 0x1331: 0x77e1, 0x1332: 0x77f9, 0x1333: 0x77f9, 0x1334: 0x77f9, 0x1335: 0x77f9, + 0x1336: 0x7811, 0x1337: 0x7811, 0x1338: 0x7811, 0x1339: 0x7811, 0x133a: 0x7829, 0x133b: 0x7829, + 0x133c: 0x7829, 0x133d: 0x7829, 0x133e: 0x7841, 0x133f: 0x7841, + // Block 0x4d, offset 0x1340 + 0x1340: 0x7841, 0x1341: 0x7841, 0x1342: 0x7859, 0x1343: 0x7859, 0x1344: 0x7871, 0x1345: 0x7871, + 0x1346: 0x7889, 0x1347: 0x7889, 0x1348: 0x78a1, 0x1349: 0x78a1, 0x134a: 0x78b9, 0x134b: 0x78b9, + 0x134c: 0x78d1, 0x134d: 0x78d1, 0x134e: 0x78e9, 0x134f: 0x78e9, 0x1350: 0x78e9, 0x1351: 0x78e9, + 0x1352: 0x7901, 0x1353: 0x7901, 0x1354: 0x7901, 0x1355: 0x7901, 0x1356: 0x7919, 0x1357: 0x7919, + 0x1358: 0x7919, 0x1359: 0x7919, 0x135a: 0x7931, 0x135b: 0x7931, 0x135c: 0x7931, 0x135d: 0x7931, + 0x135e: 0x7949, 0x135f: 0x7949, 0x1360: 0x7961, 0x1361: 0x7961, 0x1362: 0x7961, 0x1363: 0x7961, + 0x1364: 0x7979, 0x1365: 0x7979, 0x1366: 0x7991, 0x1367: 0x7991, 0x1368: 0x7991, 0x1369: 0x7991, + 0x136a: 0x79a9, 0x136b: 0x79a9, 0x136c: 0x79a9, 0x136d: 0x79a9, 0x136e: 0x79c1, 0x136f: 0x79c1, + 0x1370: 0x79d9, 0x1371: 0x79d9, 0x1372: 0x0818, 0x1373: 0x0818, 0x1374: 0x0818, 0x1375: 0x0818, + 0x1376: 0x0818, 0x1377: 0x0818, 0x1378: 0x0818, 0x1379: 0x0818, 0x137a: 0x0818, 0x137b: 0x0818, + 0x137c: 0x0818, 0x137d: 0x0818, 0x137e: 0x0818, 0x137f: 0x0818, + // Block 0x4e, offset 0x1380 + 0x1380: 0x0818, 0x1381: 0x0818, 0x1382: 0x0040, 0x1383: 0x0040, 0x1384: 0x0040, 0x1385: 0x0040, + 0x1386: 0x0040, 0x1387: 0x0040, 0x1388: 0x0040, 0x1389: 0x0040, 0x138a: 0x0040, 0x138b: 0x0040, + 0x138c: 0x0040, 0x138d: 0x0040, 0x138e: 0x0040, 0x138f: 0x0040, 0x1390: 0x0040, 0x1391: 0x0040, + 0x1392: 0x0040, 0x1393: 0x79f1, 0x1394: 0x79f1, 0x1395: 0x79f1, 0x1396: 0x79f1, 0x1397: 0x7a09, + 0x1398: 0x7a09, 0x1399: 0x7a21, 0x139a: 0x7a21, 0x139b: 0x7a39, 0x139c: 0x7a39, 0x139d: 0x0479, + 0x139e: 0x7a51, 0x139f: 0x7a51, 0x13a0: 0x7a69, 0x13a1: 0x7a69, 0x13a2: 0x7a81, 0x13a3: 0x7a81, + 0x13a4: 0x7a99, 0x13a5: 0x7a99, 0x13a6: 0x7a99, 0x13a7: 0x7a99, 0x13a8: 0x7ab1, 0x13a9: 0x7ab1, + 0x13aa: 0x7ac9, 0x13ab: 0x7ac9, 0x13ac: 0x7af1, 0x13ad: 0x7af1, 0x13ae: 0x7b19, 0x13af: 0x7b19, + 0x13b0: 0x7b41, 0x13b1: 0x7b41, 0x13b2: 0x7b69, 0x13b3: 0x7b69, 0x13b4: 0x7b91, 0x13b5: 0x7b91, + 0x13b6: 0x7bb9, 0x13b7: 0x7bb9, 0x13b8: 0x7bb9, 0x13b9: 0x7be1, 0x13ba: 0x7be1, 0x13bb: 0x7be1, + 0x13bc: 0x7c09, 0x13bd: 0x7c09, 0x13be: 0x7c09, 0x13bf: 0x7c09, + // Block 0x4f, offset 0x13c0 + 0x13c0: 0x85f9, 0x13c1: 0x8621, 0x13c2: 0x8649, 0x13c3: 0x8671, 0x13c4: 0x8699, 0x13c5: 0x86c1, + 0x13c6: 0x86e9, 0x13c7: 0x8711, 0x13c8: 0x8739, 0x13c9: 0x8761, 0x13ca: 0x8789, 0x13cb: 0x87b1, + 0x13cc: 0x87d9, 0x13cd: 0x8801, 0x13ce: 0x8829, 0x13cf: 0x8851, 0x13d0: 0x8879, 0x13d1: 0x88a1, + 0x13d2: 0x88c9, 0x13d3: 0x88f1, 0x13d4: 0x8919, 0x13d5: 0x8941, 0x13d6: 0x8969, 0x13d7: 0x8991, + 0x13d8: 0x89b9, 0x13d9: 0x89e1, 0x13da: 0x8a09, 0x13db: 0x8a31, 0x13dc: 0x8a59, 0x13dd: 0x8a81, + 0x13de: 0x8aaa, 0x13df: 0x8ada, 0x13e0: 0x8b0a, 0x13e1: 0x8b3a, 0x13e2: 0x8b6a, 0x13e3: 0x8b9a, + 0x13e4: 0x8bc9, 0x13e5: 0x8bf1, 0x13e6: 0x7c71, 0x13e7: 0x8c19, 0x13e8: 0x7be1, 0x13e9: 0x7c99, + 0x13ea: 0x8c41, 0x13eb: 0x8c69, 0x13ec: 0x7d39, 0x13ed: 0x8c91, 0x13ee: 0x7d61, 0x13ef: 0x7d89, + 0x13f0: 0x8cb9, 0x13f1: 0x8ce1, 0x13f2: 0x7e29, 0x13f3: 0x8d09, 0x13f4: 0x7e51, 0x13f5: 0x7e79, + 0x13f6: 0x8d31, 0x13f7: 0x8d59, 0x13f8: 0x7ec9, 0x13f9: 0x8d81, 0x13fa: 0x7ef1, 0x13fb: 0x7f19, + 0x13fc: 0x83a1, 0x13fd: 0x83c9, 0x13fe: 0x8441, 0x13ff: 0x8469, + // Block 0x50, offset 0x1400 + 0x1400: 0x8491, 0x1401: 0x8531, 0x1402: 0x8559, 0x1403: 0x8581, 0x1404: 0x85a9, 0x1405: 0x8649, + 0x1406: 0x8671, 0x1407: 0x8699, 0x1408: 0x8da9, 0x1409: 0x8739, 0x140a: 0x8dd1, 0x140b: 0x8df9, + 0x140c: 0x8829, 0x140d: 0x8e21, 0x140e: 0x8851, 0x140f: 0x8879, 0x1410: 0x8a81, 0x1411: 0x8e49, + 0x1412: 0x8e71, 0x1413: 0x89b9, 0x1414: 0x8e99, 0x1415: 0x89e1, 0x1416: 0x8a09, 0x1417: 0x7c21, + 0x1418: 0x7c49, 0x1419: 0x8ec1, 0x141a: 0x7c71, 0x141b: 0x8ee9, 0x141c: 0x7cc1, 0x141d: 0x7ce9, + 0x141e: 0x7d11, 0x141f: 0x7d39, 0x1420: 0x8f11, 0x1421: 0x7db1, 0x1422: 0x7dd9, 0x1423: 0x7e01, + 0x1424: 0x7e29, 0x1425: 0x8f39, 0x1426: 0x7ec9, 0x1427: 0x7f41, 0x1428: 0x7f69, 0x1429: 0x7f91, + 0x142a: 0x7fb9, 0x142b: 0x7fe1, 0x142c: 0x8031, 0x142d: 0x8059, 0x142e: 0x8081, 0x142f: 0x80a9, + 0x1430: 0x80d1, 0x1431: 0x80f9, 0x1432: 0x8f61, 0x1433: 0x8121, 0x1434: 0x8149, 0x1435: 0x8171, + 0x1436: 0x8199, 0x1437: 0x81c1, 0x1438: 0x81e9, 0x1439: 0x8239, 0x143a: 0x8261, 0x143b: 0x8289, + 0x143c: 0x82b1, 0x143d: 0x82d9, 0x143e: 0x8301, 0x143f: 0x8329, + // Block 0x51, offset 0x1440 + 0x1440: 0x8351, 0x1441: 0x8379, 0x1442: 0x83f1, 0x1443: 0x8419, 0x1444: 0x84b9, 0x1445: 0x84e1, + 0x1446: 0x8509, 0x1447: 0x8531, 0x1448: 0x8559, 0x1449: 0x85d1, 0x144a: 0x85f9, 0x144b: 0x8621, + 0x144c: 0x8649, 0x144d: 0x8f89, 0x144e: 0x86c1, 0x144f: 0x86e9, 0x1450: 0x8711, 0x1451: 0x8739, + 0x1452: 0x87b1, 0x1453: 0x87d9, 0x1454: 0x8801, 0x1455: 0x8829, 0x1456: 0x8fb1, 0x1457: 0x88a1, + 0x1458: 0x88c9, 0x1459: 0x8fd9, 0x145a: 0x8941, 0x145b: 0x8969, 0x145c: 0x8991, 0x145d: 0x89b9, + 0x145e: 0x9001, 0x145f: 0x7c71, 0x1460: 0x8ee9, 0x1461: 0x7d39, 0x1462: 0x8f11, 0x1463: 0x7e29, + 0x1464: 0x8f39, 0x1465: 0x7ec9, 0x1466: 0x9029, 0x1467: 0x80d1, 0x1468: 0x9051, 0x1469: 0x9079, + 0x146a: 0x90a1, 0x146b: 0x8531, 0x146c: 0x8559, 0x146d: 0x8649, 0x146e: 0x8829, 0x146f: 0x8fb1, + 0x1470: 0x89b9, 0x1471: 0x9001, 0x1472: 0x90c9, 0x1473: 0x9101, 0x1474: 0x9139, 0x1475: 0x9171, + 0x1476: 0x9199, 0x1477: 0x91c1, 0x1478: 0x91e9, 0x1479: 0x9211, 0x147a: 0x9239, 0x147b: 0x9261, + 0x147c: 0x9289, 0x147d: 0x92b1, 0x147e: 0x92d9, 0x147f: 0x9301, + // Block 0x52, offset 0x1480 + 0x1480: 0x9329, 0x1481: 0x9351, 0x1482: 0x9379, 0x1483: 0x93a1, 0x1484: 0x93c9, 0x1485: 0x93f1, + 0x1486: 0x9419, 0x1487: 0x9441, 0x1488: 0x9469, 0x1489: 0x9491, 0x148a: 0x94b9, 0x148b: 0x94e1, + 0x148c: 0x9079, 0x148d: 0x9509, 0x148e: 0x9531, 0x148f: 0x9559, 0x1490: 0x9581, 0x1491: 0x9171, + 0x1492: 0x9199, 0x1493: 0x91c1, 0x1494: 0x91e9, 0x1495: 0x9211, 0x1496: 0x9239, 0x1497: 0x9261, + 0x1498: 0x9289, 0x1499: 0x92b1, 0x149a: 0x92d9, 0x149b: 0x9301, 0x149c: 0x9329, 0x149d: 0x9351, + 0x149e: 0x9379, 0x149f: 0x93a1, 0x14a0: 0x93c9, 0x14a1: 0x93f1, 0x14a2: 0x9419, 0x14a3: 0x9441, + 0x14a4: 0x9469, 0x14a5: 0x9491, 0x14a6: 0x94b9, 0x14a7: 0x94e1, 0x14a8: 0x9079, 0x14a9: 0x9509, + 0x14aa: 0x9531, 0x14ab: 0x9559, 0x14ac: 0x9581, 0x14ad: 0x9491, 0x14ae: 0x94b9, 0x14af: 0x94e1, + 0x14b0: 0x9079, 0x14b1: 0x9051, 0x14b2: 0x90a1, 0x14b3: 0x8211, 0x14b4: 0x8059, 0x14b5: 0x8081, + 0x14b6: 0x80a9, 0x14b7: 0x9491, 0x14b8: 0x94b9, 0x14b9: 0x94e1, 0x14ba: 0x8211, 0x14bb: 0x8239, + 0x14bc: 0x95a9, 0x14bd: 0x95a9, 0x14be: 0x0018, 0x14bf: 0x0018, + // Block 0x53, offset 0x14c0 + 0x14c0: 0x0040, 0x14c1: 0x0040, 0x14c2: 0x0040, 0x14c3: 0x0040, 0x14c4: 0x0040, 0x14c5: 0x0040, + 0x14c6: 0x0040, 0x14c7: 0x0040, 0x14c8: 0x0040, 0x14c9: 0x0040, 0x14ca: 0x0040, 0x14cb: 0x0040, + 0x14cc: 0x0040, 0x14cd: 0x0040, 0x14ce: 0x0040, 0x14cf: 0x0040, 0x14d0: 0x95d1, 0x14d1: 0x9609, + 0x14d2: 0x9609, 0x14d3: 0x9641, 0x14d4: 0x9679, 0x14d5: 0x96b1, 0x14d6: 0x96e9, 0x14d7: 0x9721, + 0x14d8: 0x9759, 0x14d9: 0x9759, 0x14da: 0x9791, 0x14db: 0x97c9, 0x14dc: 0x9801, 0x14dd: 0x9839, + 0x14de: 0x9871, 0x14df: 0x98a9, 0x14e0: 0x98a9, 0x14e1: 0x98e1, 0x14e2: 0x9919, 0x14e3: 0x9919, + 0x14e4: 0x9951, 0x14e5: 0x9951, 0x14e6: 0x9989, 0x14e7: 0x99c1, 0x14e8: 0x99c1, 0x14e9: 0x99f9, + 0x14ea: 0x9a31, 0x14eb: 0x9a31, 0x14ec: 0x9a69, 0x14ed: 0x9a69, 0x14ee: 0x9aa1, 0x14ef: 0x9ad9, + 0x14f0: 0x9ad9, 0x14f1: 0x9b11, 0x14f2: 0x9b11, 0x14f3: 0x9b49, 0x14f4: 0x9b81, 0x14f5: 0x9bb9, + 0x14f6: 0x9bf1, 0x14f7: 0x9bf1, 0x14f8: 0x9c29, 0x14f9: 0x9c61, 0x14fa: 0x9c99, 0x14fb: 0x9cd1, + 0x14fc: 0x9d09, 0x14fd: 0x9d09, 0x14fe: 0x9d41, 0x14ff: 0x9d79, + // Block 0x54, offset 0x1500 + 0x1500: 0xa949, 0x1501: 0xa981, 0x1502: 0xa9b9, 0x1503: 0xa8a1, 0x1504: 0x9bb9, 0x1505: 0x9989, + 0x1506: 0xa9f1, 0x1507: 0xaa29, 0x1508: 0x0040, 0x1509: 0x0040, 0x150a: 0x0040, 0x150b: 0x0040, + 0x150c: 0x0040, 0x150d: 0x0040, 0x150e: 0x0040, 0x150f: 0x0040, 0x1510: 0x0040, 0x1511: 0x0040, + 0x1512: 0x0040, 0x1513: 0x0040, 0x1514: 0x0040, 0x1515: 0x0040, 0x1516: 0x0040, 0x1517: 0x0040, + 0x1518: 0x0040, 0x1519: 0x0040, 0x151a: 0x0040, 0x151b: 0x0040, 0x151c: 0x0040, 0x151d: 0x0040, + 0x151e: 0x0040, 0x151f: 0x0040, 0x1520: 0x0040, 0x1521: 0x0040, 0x1522: 0x0040, 0x1523: 0x0040, + 0x1524: 0x0040, 0x1525: 0x0040, 0x1526: 0x0040, 0x1527: 0x0040, 0x1528: 0x0040, 0x1529: 0x0040, + 0x152a: 0x0040, 0x152b: 0x0040, 0x152c: 0x0040, 0x152d: 0x0040, 0x152e: 0x0040, 0x152f: 0x0040, + 0x1530: 0xaa61, 0x1531: 0xaa99, 0x1532: 0xaad1, 0x1533: 0xab19, 0x1534: 0xab61, 0x1535: 0xaba9, + 0x1536: 0xabf1, 0x1537: 0xac39, 0x1538: 0xac81, 0x1539: 0xacc9, 0x153a: 0xad02, 0x153b: 0xae12, + 0x153c: 0xae91, 0x153d: 0x0018, 0x153e: 0x0040, 0x153f: 0x0040, + // Block 0x55, offset 0x1540 + 0x1540: 0x33c0, 0x1541: 0x33c0, 0x1542: 0x33c0, 0x1543: 0x33c0, 0x1544: 0x33c0, 0x1545: 0x33c0, + 0x1546: 0x33c0, 0x1547: 0x33c0, 0x1548: 0x33c0, 0x1549: 0x33c0, 0x154a: 0x33c0, 0x154b: 0x33c0, + 0x154c: 0x33c0, 0x154d: 0x33c0, 0x154e: 0x33c0, 0x154f: 0x33c0, 0x1550: 0xaeda, 0x1551: 0x7d55, + 0x1552: 0x0040, 0x1553: 0xaeea, 0x1554: 0x03c2, 0x1555: 0xaefa, 0x1556: 0xaf0a, 0x1557: 0x7d75, + 0x1558: 0x7d95, 0x1559: 0x0040, 0x155a: 0x0040, 0x155b: 0x0040, 0x155c: 0x0040, 0x155d: 0x0040, + 0x155e: 0x0040, 0x155f: 0x0040, 0x1560: 0x3308, 0x1561: 0x3308, 0x1562: 0x3308, 0x1563: 0x3308, + 0x1564: 0x3308, 0x1565: 0x3308, 0x1566: 0x3308, 0x1567: 0x3308, 0x1568: 0x3308, 0x1569: 0x3308, + 0x156a: 0x3308, 0x156b: 0x3308, 0x156c: 0x3308, 0x156d: 0x3308, 0x156e: 0x3308, 0x156f: 0x3308, + 0x1570: 0x0040, 0x1571: 0x7db5, 0x1572: 0x7dd5, 0x1573: 0xaf1a, 0x1574: 0xaf1a, 0x1575: 0x1fd2, + 0x1576: 0x1fe2, 0x1577: 0xaf2a, 0x1578: 0xaf3a, 0x1579: 0x7df5, 0x157a: 0x7e15, 0x157b: 0x7e35, + 0x157c: 0x7df5, 0x157d: 0x7e55, 0x157e: 0x7e75, 0x157f: 0x7e55, + // Block 0x56, offset 0x1580 + 0x1580: 0x7e95, 0x1581: 0x7eb5, 0x1582: 0x7ed5, 0x1583: 0x7eb5, 0x1584: 0x7ef5, 0x1585: 0x0018, + 0x1586: 0x0018, 0x1587: 0xaf4a, 0x1588: 0xaf5a, 0x1589: 0x7f16, 0x158a: 0x7f36, 0x158b: 0x7f56, + 0x158c: 0x7f76, 0x158d: 0xaf1a, 0x158e: 0xaf1a, 0x158f: 0xaf1a, 0x1590: 0xaeda, 0x1591: 0x7f95, + 0x1592: 0x0040, 0x1593: 0x0040, 0x1594: 0x03c2, 0x1595: 0xaeea, 0x1596: 0xaf0a, 0x1597: 0xaefa, + 0x1598: 0x7fb5, 0x1599: 0x1fd2, 0x159a: 0x1fe2, 0x159b: 0xaf2a, 0x159c: 0xaf3a, 0x159d: 0x7e95, + 0x159e: 0x7ef5, 0x159f: 0xaf6a, 0x15a0: 0xaf7a, 0x15a1: 0xaf8a, 0x15a2: 0x1fb2, 0x15a3: 0xaf99, + 0x15a4: 0xafaa, 0x15a5: 0xafba, 0x15a6: 0x1fc2, 0x15a7: 0x0040, 0x15a8: 0xafca, 0x15a9: 0xafda, + 0x15aa: 0xafea, 0x15ab: 0xaffa, 0x15ac: 0x0040, 0x15ad: 0x0040, 0x15ae: 0x0040, 0x15af: 0x0040, + 0x15b0: 0x7fd6, 0x15b1: 0xb009, 0x15b2: 0x7ff6, 0x15b3: 0x0808, 0x15b4: 0x8016, 0x15b5: 0x0040, + 0x15b6: 0x8036, 0x15b7: 0xb031, 0x15b8: 0x8056, 0x15b9: 0xb059, 0x15ba: 0x8076, 0x15bb: 0xb081, + 0x15bc: 0x8096, 0x15bd: 0xb0a9, 0x15be: 0x80b6, 0x15bf: 0xb0d1, + // Block 0x57, offset 0x15c0 + 0x15c0: 0xb0f9, 0x15c1: 0xb111, 0x15c2: 0xb111, 0x15c3: 0xb129, 0x15c4: 0xb129, 0x15c5: 0xb141, + 0x15c6: 0xb141, 0x15c7: 0xb159, 0x15c8: 0xb159, 0x15c9: 0xb171, 0x15ca: 0xb171, 0x15cb: 0xb171, + 0x15cc: 0xb171, 0x15cd: 0xb189, 0x15ce: 0xb189, 0x15cf: 0xb1a1, 0x15d0: 0xb1a1, 0x15d1: 0xb1a1, + 0x15d2: 0xb1a1, 0x15d3: 0xb1b9, 0x15d4: 0xb1b9, 0x15d5: 0xb1d1, 0x15d6: 0xb1d1, 0x15d7: 0xb1d1, + 0x15d8: 0xb1d1, 0x15d9: 0xb1e9, 0x15da: 0xb1e9, 0x15db: 0xb1e9, 0x15dc: 0xb1e9, 0x15dd: 0xb201, + 0x15de: 0xb201, 0x15df: 0xb201, 0x15e0: 0xb201, 0x15e1: 0xb219, 0x15e2: 0xb219, 0x15e3: 0xb219, + 0x15e4: 0xb219, 0x15e5: 0xb231, 0x15e6: 0xb231, 0x15e7: 0xb231, 0x15e8: 0xb231, 0x15e9: 0xb249, + 0x15ea: 0xb249, 0x15eb: 0xb261, 0x15ec: 0xb261, 0x15ed: 0xb279, 0x15ee: 0xb279, 0x15ef: 0xb291, + 0x15f0: 0xb291, 0x15f1: 0xb2a9, 0x15f2: 0xb2a9, 0x15f3: 0xb2a9, 0x15f4: 0xb2a9, 0x15f5: 0xb2c1, + 0x15f6: 0xb2c1, 0x15f7: 0xb2c1, 0x15f8: 0xb2c1, 0x15f9: 0xb2d9, 0x15fa: 0xb2d9, 0x15fb: 0xb2d9, + 0x15fc: 0xb2d9, 0x15fd: 0xb2f1, 0x15fe: 0xb2f1, 0x15ff: 0xb2f1, + // Block 0x58, offset 0x1600 + 0x1600: 0xb2f1, 0x1601: 0xb309, 0x1602: 0xb309, 0x1603: 0xb309, 0x1604: 0xb309, 0x1605: 0xb321, + 0x1606: 0xb321, 0x1607: 0xb321, 0x1608: 0xb321, 0x1609: 0xb339, 0x160a: 0xb339, 0x160b: 0xb339, + 0x160c: 0xb339, 0x160d: 0xb351, 0x160e: 0xb351, 0x160f: 0xb351, 0x1610: 0xb351, 0x1611: 0xb369, + 0x1612: 0xb369, 0x1613: 0xb369, 0x1614: 0xb369, 0x1615: 0xb381, 0x1616: 0xb381, 0x1617: 0xb381, + 0x1618: 0xb381, 0x1619: 0xb399, 0x161a: 0xb399, 0x161b: 0xb399, 0x161c: 0xb399, 0x161d: 0xb3b1, + 0x161e: 0xb3b1, 0x161f: 0xb3b1, 0x1620: 0xb3b1, 0x1621: 0xb3c9, 0x1622: 0xb3c9, 0x1623: 0xb3c9, + 0x1624: 0xb3c9, 0x1625: 0xb3e1, 0x1626: 0xb3e1, 0x1627: 0xb3e1, 0x1628: 0xb3e1, 0x1629: 0xb3f9, + 0x162a: 0xb3f9, 0x162b: 0xb3f9, 0x162c: 0xb3f9, 0x162d: 0xb411, 0x162e: 0xb411, 0x162f: 0x7ab1, + 0x1630: 0x7ab1, 0x1631: 0xb429, 0x1632: 0xb429, 0x1633: 0xb429, 0x1634: 0xb429, 0x1635: 0xb441, + 0x1636: 0xb441, 0x1637: 0xb469, 0x1638: 0xb469, 0x1639: 0xb491, 0x163a: 0xb491, 0x163b: 0xb4b9, + 0x163c: 0xb4b9, 0x163d: 0x0040, 0x163e: 0x0040, 0x163f: 0x03c0, + // Block 0x59, offset 0x1640 + 0x1640: 0x0040, 0x1641: 0xaefa, 0x1642: 0xb4e2, 0x1643: 0xaf6a, 0x1644: 0xafda, 0x1645: 0xafea, + 0x1646: 0xaf7a, 0x1647: 0xb4f2, 0x1648: 0x1fd2, 0x1649: 0x1fe2, 0x164a: 0xaf8a, 0x164b: 0x1fb2, + 0x164c: 0xaeda, 0x164d: 0xaf99, 0x164e: 0x29d1, 0x164f: 0xb502, 0x1650: 0x1f41, 0x1651: 0x00c9, + 0x1652: 0x0069, 0x1653: 0x0079, 0x1654: 0x1f51, 0x1655: 0x1f61, 0x1656: 0x1f71, 0x1657: 0x1f81, + 0x1658: 0x1f91, 0x1659: 0x1fa1, 0x165a: 0xaeea, 0x165b: 0x03c2, 0x165c: 0xafaa, 0x165d: 0x1fc2, + 0x165e: 0xafba, 0x165f: 0xaf0a, 0x1660: 0xaffa, 0x1661: 0x0039, 0x1662: 0x0ee9, 0x1663: 0x1159, + 0x1664: 0x0ef9, 0x1665: 0x0f09, 0x1666: 0x1199, 0x1667: 0x0f31, 0x1668: 0x0249, 0x1669: 0x0f41, + 0x166a: 0x0259, 0x166b: 0x0f51, 0x166c: 0x0359, 0x166d: 0x0f61, 0x166e: 0x0f71, 0x166f: 0x00d9, + 0x1670: 0x0f99, 0x1671: 0x2039, 0x1672: 0x0269, 0x1673: 0x01d9, 0x1674: 0x0fa9, 0x1675: 0x0fb9, + 0x1676: 0x1089, 0x1677: 0x0279, 0x1678: 0x0369, 0x1679: 0x0289, 0x167a: 0x13d1, 0x167b: 0xaf4a, + 0x167c: 0xafca, 0x167d: 0xaf5a, 0x167e: 0xb512, 0x167f: 0xaf1a, + // Block 0x5a, offset 0x1680 + 0x1680: 0x1caa, 0x1681: 0x0039, 0x1682: 0x0ee9, 0x1683: 0x1159, 0x1684: 0x0ef9, 0x1685: 0x0f09, + 0x1686: 0x1199, 0x1687: 0x0f31, 0x1688: 0x0249, 0x1689: 0x0f41, 0x168a: 0x0259, 0x168b: 0x0f51, + 0x168c: 0x0359, 0x168d: 0x0f61, 0x168e: 0x0f71, 0x168f: 0x00d9, 0x1690: 0x0f99, 0x1691: 0x2039, + 0x1692: 0x0269, 0x1693: 0x01d9, 0x1694: 0x0fa9, 0x1695: 0x0fb9, 0x1696: 0x1089, 0x1697: 0x0279, + 0x1698: 0x0369, 0x1699: 0x0289, 0x169a: 0x13d1, 0x169b: 0xaf2a, 0x169c: 0xb522, 0x169d: 0xaf3a, + 0x169e: 0xb532, 0x169f: 0x80d5, 0x16a0: 0x80f5, 0x16a1: 0x29d1, 0x16a2: 0x8115, 0x16a3: 0x8115, + 0x16a4: 0x8135, 0x16a5: 0x8155, 0x16a6: 0x8175, 0x16a7: 0x8195, 0x16a8: 0x81b5, 0x16a9: 0x81d5, + 0x16aa: 0x81f5, 0x16ab: 0x8215, 0x16ac: 0x8235, 0x16ad: 0x8255, 0x16ae: 0x8275, 0x16af: 0x8295, + 0x16b0: 0x82b5, 0x16b1: 0x82d5, 0x16b2: 0x82f5, 0x16b3: 0x8315, 0x16b4: 0x8335, 0x16b5: 0x8355, + 0x16b6: 0x8375, 0x16b7: 0x8395, 0x16b8: 0x83b5, 0x16b9: 0x83d5, 0x16ba: 0x83f5, 0x16bb: 0x8415, + 0x16bc: 0x81b5, 0x16bd: 0x8435, 0x16be: 0x8455, 0x16bf: 0x8215, + // Block 0x5b, offset 0x16c0 + 0x16c0: 0x8475, 0x16c1: 0x8495, 0x16c2: 0x84b5, 0x16c3: 0x84d5, 0x16c4: 0x84f5, 0x16c5: 0x8515, + 0x16c6: 0x8535, 0x16c7: 0x8555, 0x16c8: 0x84d5, 0x16c9: 0x8575, 0x16ca: 0x84d5, 0x16cb: 0x8595, + 0x16cc: 0x8595, 0x16cd: 0x85b5, 0x16ce: 0x85b5, 0x16cf: 0x85d5, 0x16d0: 0x8515, 0x16d1: 0x85f5, + 0x16d2: 0x8615, 0x16d3: 0x85f5, 0x16d4: 0x8635, 0x16d5: 0x8615, 0x16d6: 0x8655, 0x16d7: 0x8655, + 0x16d8: 0x8675, 0x16d9: 0x8675, 0x16da: 0x8695, 0x16db: 0x8695, 0x16dc: 0x8615, 0x16dd: 0x8115, + 0x16de: 0x86b5, 0x16df: 0x86d5, 0x16e0: 0x0040, 0x16e1: 0x86f5, 0x16e2: 0x8715, 0x16e3: 0x8735, + 0x16e4: 0x8755, 0x16e5: 0x8735, 0x16e6: 0x8775, 0x16e7: 0x8795, 0x16e8: 0x87b5, 0x16e9: 0x87b5, + 0x16ea: 0x87d5, 0x16eb: 0x87d5, 0x16ec: 0x87f5, 0x16ed: 0x87f5, 0x16ee: 0x87d5, 0x16ef: 0x87d5, + 0x16f0: 0x8815, 0x16f1: 0x8835, 0x16f2: 0x8855, 0x16f3: 0x8875, 0x16f4: 0x8895, 0x16f5: 0x88b5, + 0x16f6: 0x88b5, 0x16f7: 0x88b5, 0x16f8: 0x88d5, 0x16f9: 0x88d5, 0x16fa: 0x88d5, 0x16fb: 0x88d5, + 0x16fc: 0x87b5, 0x16fd: 0x87b5, 0x16fe: 0x87b5, 0x16ff: 0x0040, + // Block 0x5c, offset 0x1700 + 0x1700: 0x0040, 0x1701: 0x0040, 0x1702: 0x8715, 0x1703: 0x86f5, 0x1704: 0x88f5, 0x1705: 0x86f5, + 0x1706: 0x8715, 0x1707: 0x86f5, 0x1708: 0x0040, 0x1709: 0x0040, 0x170a: 0x8915, 0x170b: 0x8715, + 0x170c: 0x8935, 0x170d: 0x88f5, 0x170e: 0x8935, 0x170f: 0x8715, 0x1710: 0x0040, 0x1711: 0x0040, + 0x1712: 0x8955, 0x1713: 0x8975, 0x1714: 0x8875, 0x1715: 0x8935, 0x1716: 0x88f5, 0x1717: 0x8935, + 0x1718: 0x0040, 0x1719: 0x0040, 0x171a: 0x8995, 0x171b: 0x89b5, 0x171c: 0x8995, 0x171d: 0x0040, + 0x171e: 0x0040, 0x171f: 0x0040, 0x1720: 0xb541, 0x1721: 0xb559, 0x1722: 0xb571, 0x1723: 0x89d6, + 0x1724: 0xb589, 0x1725: 0xb5a1, 0x1726: 0x89f5, 0x1727: 0x0040, 0x1728: 0x8a15, 0x1729: 0x8a35, + 0x172a: 0x8a55, 0x172b: 0x8a35, 0x172c: 0x8a75, 0x172d: 0x8a95, 0x172e: 0x8ab5, 0x172f: 0x0040, + 0x1730: 0x0040, 0x1731: 0x0040, 0x1732: 0x0040, 0x1733: 0x0040, 0x1734: 0x0040, 0x1735: 0x0040, + 0x1736: 0x0040, 0x1737: 0x0040, 0x1738: 0x0040, 0x1739: 0x0340, 0x173a: 0x0340, 0x173b: 0x0340, + 0x173c: 0x0040, 0x173d: 0x0040, 0x173e: 0x0040, 0x173f: 0x0040, + // Block 0x5d, offset 0x1740 + 0x1740: 0x0a08, 0x1741: 0x0a08, 0x1742: 0x0a08, 0x1743: 0x0a08, 0x1744: 0x0a08, 0x1745: 0x0c08, + 0x1746: 0x0808, 0x1747: 0x0c08, 0x1748: 0x0818, 0x1749: 0x0c08, 0x174a: 0x0c08, 0x174b: 0x0808, + 0x174c: 0x0808, 0x174d: 0x0908, 0x174e: 0x0c08, 0x174f: 0x0c08, 0x1750: 0x0c08, 0x1751: 0x0c08, + 0x1752: 0x0c08, 0x1753: 0x0a08, 0x1754: 0x0a08, 0x1755: 0x0a08, 0x1756: 0x0a08, 0x1757: 0x0908, + 0x1758: 0x0a08, 0x1759: 0x0a08, 0x175a: 0x0a08, 0x175b: 0x0a08, 0x175c: 0x0a08, 0x175d: 0x0c08, + 0x175e: 0x0a08, 0x175f: 0x0a08, 0x1760: 0x0a08, 0x1761: 0x0c08, 0x1762: 0x0808, 0x1763: 0x0808, + 0x1764: 0x0c08, 0x1765: 0x3308, 0x1766: 0x3308, 0x1767: 0x0040, 0x1768: 0x0040, 0x1769: 0x0040, + 0x176a: 0x0040, 0x176b: 0x0a18, 0x176c: 0x0a18, 0x176d: 0x0a18, 0x176e: 0x0a18, 0x176f: 0x0c18, + 0x1770: 0x0818, 0x1771: 0x0818, 0x1772: 0x0818, 0x1773: 0x0818, 0x1774: 0x0818, 0x1775: 0x0818, + 0x1776: 0x0818, 0x1777: 0x0040, 0x1778: 0x0040, 0x1779: 0x0040, 0x177a: 0x0040, 0x177b: 0x0040, + 0x177c: 0x0040, 0x177d: 0x0040, 0x177e: 0x0040, 0x177f: 0x0040, + // Block 0x5e, offset 0x1780 + 0x1780: 0x0a08, 0x1781: 0x0c08, 0x1782: 0x0a08, 0x1783: 0x0c08, 0x1784: 0x0c08, 0x1785: 0x0c08, + 0x1786: 0x0a08, 0x1787: 0x0a08, 0x1788: 0x0a08, 0x1789: 0x0c08, 0x178a: 0x0a08, 0x178b: 0x0a08, + 0x178c: 0x0c08, 0x178d: 0x0a08, 0x178e: 0x0c08, 0x178f: 0x0c08, 0x1790: 0x0a08, 0x1791: 0x0c08, + 0x1792: 0x0040, 0x1793: 0x0040, 0x1794: 0x0040, 0x1795: 0x0040, 0x1796: 0x0040, 0x1797: 0x0040, + 0x1798: 0x0040, 0x1799: 0x0818, 0x179a: 0x0818, 0x179b: 0x0818, 0x179c: 0x0818, 0x179d: 0x0040, + 0x179e: 0x0040, 0x179f: 0x0040, 0x17a0: 0x0040, 0x17a1: 0x0040, 0x17a2: 0x0040, 0x17a3: 0x0040, + 0x17a4: 0x0040, 0x17a5: 0x0040, 0x17a6: 0x0040, 0x17a7: 0x0040, 0x17a8: 0x0040, 0x17a9: 0x0c18, + 0x17aa: 0x0c18, 0x17ab: 0x0c18, 0x17ac: 0x0c18, 0x17ad: 0x0a18, 0x17ae: 0x0a18, 0x17af: 0x0818, + 0x17b0: 0x0040, 0x17b1: 0x0040, 0x17b2: 0x0040, 0x17b3: 0x0040, 0x17b4: 0x0040, 0x17b5: 0x0040, + 0x17b6: 0x0040, 0x17b7: 0x0040, 0x17b8: 0x0040, 0x17b9: 0x0040, 0x17ba: 0x0040, 0x17bb: 0x0040, + 0x17bc: 0x0040, 0x17bd: 0x0040, 0x17be: 0x0040, 0x17bf: 0x0040, + // Block 0x5f, offset 0x17c0 + 0x17c0: 0x3308, 0x17c1: 0x3308, 0x17c2: 0x3008, 0x17c3: 0x3008, 0x17c4: 0x0040, 0x17c5: 0x0008, + 0x17c6: 0x0008, 0x17c7: 0x0008, 0x17c8: 0x0008, 0x17c9: 0x0008, 0x17ca: 0x0008, 0x17cb: 0x0008, + 0x17cc: 0x0008, 0x17cd: 0x0040, 0x17ce: 0x0040, 0x17cf: 0x0008, 0x17d0: 0x0008, 0x17d1: 0x0040, + 0x17d2: 0x0040, 0x17d3: 0x0008, 0x17d4: 0x0008, 0x17d5: 0x0008, 0x17d6: 0x0008, 0x17d7: 0x0008, + 0x17d8: 0x0008, 0x17d9: 0x0008, 0x17da: 0x0008, 0x17db: 0x0008, 0x17dc: 0x0008, 0x17dd: 0x0008, + 0x17de: 0x0008, 0x17df: 0x0008, 0x17e0: 0x0008, 0x17e1: 0x0008, 0x17e2: 0x0008, 0x17e3: 0x0008, + 0x17e4: 0x0008, 0x17e5: 0x0008, 0x17e6: 0x0008, 0x17e7: 0x0008, 0x17e8: 0x0008, 0x17e9: 0x0040, + 0x17ea: 0x0008, 0x17eb: 0x0008, 0x17ec: 0x0008, 0x17ed: 0x0008, 0x17ee: 0x0008, 0x17ef: 0x0008, + 0x17f0: 0x0008, 0x17f1: 0x0040, 0x17f2: 0x0008, 0x17f3: 0x0008, 0x17f4: 0x0040, 0x17f5: 0x0008, + 0x17f6: 0x0008, 0x17f7: 0x0008, 0x17f8: 0x0008, 0x17f9: 0x0008, 0x17fa: 0x0040, 0x17fb: 0x0040, + 0x17fc: 0x3308, 0x17fd: 0x0008, 0x17fe: 0x3008, 0x17ff: 0x3008, + // Block 0x60, offset 0x1800 + 0x1800: 0x3308, 0x1801: 0x3008, 0x1802: 0x3008, 0x1803: 0x3008, 0x1804: 0x3008, 0x1805: 0x0040, + 0x1806: 0x0040, 0x1807: 0x3008, 0x1808: 0x3008, 0x1809: 0x0040, 0x180a: 0x0040, 0x180b: 0x3008, + 0x180c: 0x3008, 0x180d: 0x3808, 0x180e: 0x0040, 0x180f: 0x0040, 0x1810: 0x0008, 0x1811: 0x0040, + 0x1812: 0x0040, 0x1813: 0x0040, 0x1814: 0x0040, 0x1815: 0x0040, 0x1816: 0x0040, 0x1817: 0x3008, + 0x1818: 0x0040, 0x1819: 0x0040, 0x181a: 0x0040, 0x181b: 0x0040, 0x181c: 0x0040, 0x181d: 0x0008, + 0x181e: 0x0008, 0x181f: 0x0008, 0x1820: 0x0008, 0x1821: 0x0008, 0x1822: 0x3008, 0x1823: 0x3008, + 0x1824: 0x0040, 0x1825: 0x0040, 0x1826: 0x3308, 0x1827: 0x3308, 0x1828: 0x3308, 0x1829: 0x3308, + 0x182a: 0x3308, 0x182b: 0x3308, 0x182c: 0x3308, 0x182d: 0x0040, 0x182e: 0x0040, 0x182f: 0x0040, + 0x1830: 0x3308, 0x1831: 0x3308, 0x1832: 0x3308, 0x1833: 0x3308, 0x1834: 0x3308, 0x1835: 0x0040, + 0x1836: 0x0040, 0x1837: 0x0040, 0x1838: 0x0040, 0x1839: 0x0040, 0x183a: 0x0040, 0x183b: 0x0040, + 0x183c: 0x0040, 0x183d: 0x0040, 0x183e: 0x0040, 0x183f: 0x0040, + // Block 0x61, offset 0x1840 + 0x1840: 0x0039, 0x1841: 0x0ee9, 0x1842: 0x1159, 0x1843: 0x0ef9, 0x1844: 0x0f09, 0x1845: 0x1199, + 0x1846: 0x0f31, 0x1847: 0x0249, 0x1848: 0x0f41, 0x1849: 0x0259, 0x184a: 0x0f51, 0x184b: 0x0359, + 0x184c: 0x0f61, 0x184d: 0x0f71, 0x184e: 0x00d9, 0x184f: 0x0f99, 0x1850: 0x2039, 0x1851: 0x0269, + 0x1852: 0x01d9, 0x1853: 0x0fa9, 0x1854: 0x0fb9, 0x1855: 0x1089, 0x1856: 0x0279, 0x1857: 0x0369, + 0x1858: 0x0289, 0x1859: 0x13d1, 0x185a: 0x0039, 0x185b: 0x0ee9, 0x185c: 0x1159, 0x185d: 0x0ef9, + 0x185e: 0x0f09, 0x185f: 0x1199, 0x1860: 0x0f31, 0x1861: 0x0249, 0x1862: 0x0f41, 0x1863: 0x0259, + 0x1864: 0x0f51, 0x1865: 0x0359, 0x1866: 0x0f61, 0x1867: 0x0f71, 0x1868: 0x00d9, 0x1869: 0x0f99, + 0x186a: 0x2039, 0x186b: 0x0269, 0x186c: 0x01d9, 0x186d: 0x0fa9, 0x186e: 0x0fb9, 0x186f: 0x1089, + 0x1870: 0x0279, 0x1871: 0x0369, 0x1872: 0x0289, 0x1873: 0x13d1, 0x1874: 0x0039, 0x1875: 0x0ee9, + 0x1876: 0x1159, 0x1877: 0x0ef9, 0x1878: 0x0f09, 0x1879: 0x1199, 0x187a: 0x0f31, 0x187b: 0x0249, + 0x187c: 0x0f41, 0x187d: 0x0259, 0x187e: 0x0f51, 0x187f: 0x0359, + // Block 0x62, offset 0x1880 + 0x1880: 0x0f61, 0x1881: 0x0f71, 0x1882: 0x00d9, 0x1883: 0x0f99, 0x1884: 0x2039, 0x1885: 0x0269, + 0x1886: 0x01d9, 0x1887: 0x0fa9, 0x1888: 0x0fb9, 0x1889: 0x1089, 0x188a: 0x0279, 0x188b: 0x0369, + 0x188c: 0x0289, 0x188d: 0x13d1, 0x188e: 0x0039, 0x188f: 0x0ee9, 0x1890: 0x1159, 0x1891: 0x0ef9, + 0x1892: 0x0f09, 0x1893: 0x1199, 0x1894: 0x0f31, 0x1895: 0x0040, 0x1896: 0x0f41, 0x1897: 0x0259, + 0x1898: 0x0f51, 0x1899: 0x0359, 0x189a: 0x0f61, 0x189b: 0x0f71, 0x189c: 0x00d9, 0x189d: 0x0f99, + 0x189e: 0x2039, 0x189f: 0x0269, 0x18a0: 0x01d9, 0x18a1: 0x0fa9, 0x18a2: 0x0fb9, 0x18a3: 0x1089, + 0x18a4: 0x0279, 0x18a5: 0x0369, 0x18a6: 0x0289, 0x18a7: 0x13d1, 0x18a8: 0x0039, 0x18a9: 0x0ee9, + 0x18aa: 0x1159, 0x18ab: 0x0ef9, 0x18ac: 0x0f09, 0x18ad: 0x1199, 0x18ae: 0x0f31, 0x18af: 0x0249, + 0x18b0: 0x0f41, 0x18b1: 0x0259, 0x18b2: 0x0f51, 0x18b3: 0x0359, 0x18b4: 0x0f61, 0x18b5: 0x0f71, + 0x18b6: 0x00d9, 0x18b7: 0x0f99, 0x18b8: 0x2039, 0x18b9: 0x0269, 0x18ba: 0x01d9, 0x18bb: 0x0fa9, + 0x18bc: 0x0fb9, 0x18bd: 0x1089, 0x18be: 0x0279, 0x18bf: 0x0369, + // Block 0x63, offset 0x18c0 + 0x18c0: 0x0289, 0x18c1: 0x13d1, 0x18c2: 0x0039, 0x18c3: 0x0ee9, 0x18c4: 0x1159, 0x18c5: 0x0ef9, + 0x18c6: 0x0f09, 0x18c7: 0x1199, 0x18c8: 0x0f31, 0x18c9: 0x0249, 0x18ca: 0x0f41, 0x18cb: 0x0259, + 0x18cc: 0x0f51, 0x18cd: 0x0359, 0x18ce: 0x0f61, 0x18cf: 0x0f71, 0x18d0: 0x00d9, 0x18d1: 0x0f99, + 0x18d2: 0x2039, 0x18d3: 0x0269, 0x18d4: 0x01d9, 0x18d5: 0x0fa9, 0x18d6: 0x0fb9, 0x18d7: 0x1089, + 0x18d8: 0x0279, 0x18d9: 0x0369, 0x18da: 0x0289, 0x18db: 0x13d1, 0x18dc: 0x0039, 0x18dd: 0x0040, + 0x18de: 0x1159, 0x18df: 0x0ef9, 0x18e0: 0x0040, 0x18e1: 0x0040, 0x18e2: 0x0f31, 0x18e3: 0x0040, + 0x18e4: 0x0040, 0x18e5: 0x0259, 0x18e6: 0x0f51, 0x18e7: 0x0040, 0x18e8: 0x0040, 0x18e9: 0x0f71, + 0x18ea: 0x00d9, 0x18eb: 0x0f99, 0x18ec: 0x2039, 0x18ed: 0x0040, 0x18ee: 0x01d9, 0x18ef: 0x0fa9, + 0x18f0: 0x0fb9, 0x18f1: 0x1089, 0x18f2: 0x0279, 0x18f3: 0x0369, 0x18f4: 0x0289, 0x18f5: 0x13d1, + 0x18f6: 0x0039, 0x18f7: 0x0ee9, 0x18f8: 0x1159, 0x18f9: 0x0ef9, 0x18fa: 0x0040, 0x18fb: 0x1199, + 0x18fc: 0x0040, 0x18fd: 0x0249, 0x18fe: 0x0f41, 0x18ff: 0x0259, + // Block 0x64, offset 0x1900 + 0x1900: 0x0f51, 0x1901: 0x0359, 0x1902: 0x0f61, 0x1903: 0x0f71, 0x1904: 0x0040, 0x1905: 0x0f99, + 0x1906: 0x2039, 0x1907: 0x0269, 0x1908: 0x01d9, 0x1909: 0x0fa9, 0x190a: 0x0fb9, 0x190b: 0x1089, + 0x190c: 0x0279, 0x190d: 0x0369, 0x190e: 0x0289, 0x190f: 0x13d1, 0x1910: 0x0039, 0x1911: 0x0ee9, + 0x1912: 0x1159, 0x1913: 0x0ef9, 0x1914: 0x0f09, 0x1915: 0x1199, 0x1916: 0x0f31, 0x1917: 0x0249, + 0x1918: 0x0f41, 0x1919: 0x0259, 0x191a: 0x0f51, 0x191b: 0x0359, 0x191c: 0x0f61, 0x191d: 0x0f71, + 0x191e: 0x00d9, 0x191f: 0x0f99, 0x1920: 0x2039, 0x1921: 0x0269, 0x1922: 0x01d9, 0x1923: 0x0fa9, + 0x1924: 0x0fb9, 0x1925: 0x1089, 0x1926: 0x0279, 0x1927: 0x0369, 0x1928: 0x0289, 0x1929: 0x13d1, + 0x192a: 0x0039, 0x192b: 0x0ee9, 0x192c: 0x1159, 0x192d: 0x0ef9, 0x192e: 0x0f09, 0x192f: 0x1199, + 0x1930: 0x0f31, 0x1931: 0x0249, 0x1932: 0x0f41, 0x1933: 0x0259, 0x1934: 0x0f51, 0x1935: 0x0359, + 0x1936: 0x0f61, 0x1937: 0x0f71, 0x1938: 0x00d9, 0x1939: 0x0f99, 0x193a: 0x2039, 0x193b: 0x0269, + 0x193c: 0x01d9, 0x193d: 0x0fa9, 0x193e: 0x0fb9, 0x193f: 0x1089, + // Block 0x65, offset 0x1940 + 0x1940: 0x0279, 0x1941: 0x0369, 0x1942: 0x0289, 0x1943: 0x13d1, 0x1944: 0x0039, 0x1945: 0x0ee9, + 0x1946: 0x0040, 0x1947: 0x0ef9, 0x1948: 0x0f09, 0x1949: 0x1199, 0x194a: 0x0f31, 0x194b: 0x0040, + 0x194c: 0x0040, 0x194d: 0x0259, 0x194e: 0x0f51, 0x194f: 0x0359, 0x1950: 0x0f61, 0x1951: 0x0f71, + 0x1952: 0x00d9, 0x1953: 0x0f99, 0x1954: 0x2039, 0x1955: 0x0040, 0x1956: 0x01d9, 0x1957: 0x0fa9, + 0x1958: 0x0fb9, 0x1959: 0x1089, 0x195a: 0x0279, 0x195b: 0x0369, 0x195c: 0x0289, 0x195d: 0x0040, + 0x195e: 0x0039, 0x195f: 0x0ee9, 0x1960: 0x1159, 0x1961: 0x0ef9, 0x1962: 0x0f09, 0x1963: 0x1199, + 0x1964: 0x0f31, 0x1965: 0x0249, 0x1966: 0x0f41, 0x1967: 0x0259, 0x1968: 0x0f51, 0x1969: 0x0359, + 0x196a: 0x0f61, 0x196b: 0x0f71, 0x196c: 0x00d9, 0x196d: 0x0f99, 0x196e: 0x2039, 0x196f: 0x0269, + 0x1970: 0x01d9, 0x1971: 0x0fa9, 0x1972: 0x0fb9, 0x1973: 0x1089, 0x1974: 0x0279, 0x1975: 0x0369, + 0x1976: 0x0289, 0x1977: 0x13d1, 0x1978: 0x0039, 0x1979: 0x0ee9, 0x197a: 0x0040, 0x197b: 0x0ef9, + 0x197c: 0x0f09, 0x197d: 0x1199, 0x197e: 0x0f31, 0x197f: 0x0040, + // Block 0x66, offset 0x1980 + 0x1980: 0x0f41, 0x1981: 0x0259, 0x1982: 0x0f51, 0x1983: 0x0359, 0x1984: 0x0f61, 0x1985: 0x0040, + 0x1986: 0x00d9, 0x1987: 0x0040, 0x1988: 0x0040, 0x1989: 0x0040, 0x198a: 0x01d9, 0x198b: 0x0fa9, + 0x198c: 0x0fb9, 0x198d: 0x1089, 0x198e: 0x0279, 0x198f: 0x0369, 0x1990: 0x0289, 0x1991: 0x0040, + 0x1992: 0x0039, 0x1993: 0x0ee9, 0x1994: 0x1159, 0x1995: 0x0ef9, 0x1996: 0x0f09, 0x1997: 0x1199, + 0x1998: 0x0f31, 0x1999: 0x0249, 0x199a: 0x0f41, 0x199b: 0x0259, 0x199c: 0x0f51, 0x199d: 0x0359, + 0x199e: 0x0f61, 0x199f: 0x0f71, 0x19a0: 0x00d9, 0x19a1: 0x0f99, 0x19a2: 0x2039, 0x19a3: 0x0269, + 0x19a4: 0x01d9, 0x19a5: 0x0fa9, 0x19a6: 0x0fb9, 0x19a7: 0x1089, 0x19a8: 0x0279, 0x19a9: 0x0369, + 0x19aa: 0x0289, 0x19ab: 0x13d1, 0x19ac: 0x0039, 0x19ad: 0x0ee9, 0x19ae: 0x1159, 0x19af: 0x0ef9, + 0x19b0: 0x0f09, 0x19b1: 0x1199, 0x19b2: 0x0f31, 0x19b3: 0x0249, 0x19b4: 0x0f41, 0x19b5: 0x0259, + 0x19b6: 0x0f51, 0x19b7: 0x0359, 0x19b8: 0x0f61, 0x19b9: 0x0f71, 0x19ba: 0x00d9, 0x19bb: 0x0f99, + 0x19bc: 0x2039, 0x19bd: 0x0269, 0x19be: 0x01d9, 0x19bf: 0x0fa9, + // Block 0x67, offset 0x19c0 + 0x19c0: 0x0fb9, 0x19c1: 0x1089, 0x19c2: 0x0279, 0x19c3: 0x0369, 0x19c4: 0x0289, 0x19c5: 0x13d1, + 0x19c6: 0x0039, 0x19c7: 0x0ee9, 0x19c8: 0x1159, 0x19c9: 0x0ef9, 0x19ca: 0x0f09, 0x19cb: 0x1199, + 0x19cc: 0x0f31, 0x19cd: 0x0249, 0x19ce: 0x0f41, 0x19cf: 0x0259, 0x19d0: 0x0f51, 0x19d1: 0x0359, + 0x19d2: 0x0f61, 0x19d3: 0x0f71, 0x19d4: 0x00d9, 0x19d5: 0x0f99, 0x19d6: 0x2039, 0x19d7: 0x0269, + 0x19d8: 0x01d9, 0x19d9: 0x0fa9, 0x19da: 0x0fb9, 0x19db: 0x1089, 0x19dc: 0x0279, 0x19dd: 0x0369, + 0x19de: 0x0289, 0x19df: 0x13d1, 0x19e0: 0x0039, 0x19e1: 0x0ee9, 0x19e2: 0x1159, 0x19e3: 0x0ef9, + 0x19e4: 0x0f09, 0x19e5: 0x1199, 0x19e6: 0x0f31, 0x19e7: 0x0249, 0x19e8: 0x0f41, 0x19e9: 0x0259, + 0x19ea: 0x0f51, 0x19eb: 0x0359, 0x19ec: 0x0f61, 0x19ed: 0x0f71, 0x19ee: 0x00d9, 0x19ef: 0x0f99, + 0x19f0: 0x2039, 0x19f1: 0x0269, 0x19f2: 0x01d9, 0x19f3: 0x0fa9, 0x19f4: 0x0fb9, 0x19f5: 0x1089, + 0x19f6: 0x0279, 0x19f7: 0x0369, 0x19f8: 0x0289, 0x19f9: 0x13d1, 0x19fa: 0x0039, 0x19fb: 0x0ee9, + 0x19fc: 0x1159, 0x19fd: 0x0ef9, 0x19fe: 0x0f09, 0x19ff: 0x1199, + // Block 0x68, offset 0x1a00 + 0x1a00: 0x0f31, 0x1a01: 0x0249, 0x1a02: 0x0f41, 0x1a03: 0x0259, 0x1a04: 0x0f51, 0x1a05: 0x0359, + 0x1a06: 0x0f61, 0x1a07: 0x0f71, 0x1a08: 0x00d9, 0x1a09: 0x0f99, 0x1a0a: 0x2039, 0x1a0b: 0x0269, + 0x1a0c: 0x01d9, 0x1a0d: 0x0fa9, 0x1a0e: 0x0fb9, 0x1a0f: 0x1089, 0x1a10: 0x0279, 0x1a11: 0x0369, + 0x1a12: 0x0289, 0x1a13: 0x13d1, 0x1a14: 0x0039, 0x1a15: 0x0ee9, 0x1a16: 0x1159, 0x1a17: 0x0ef9, + 0x1a18: 0x0f09, 0x1a19: 0x1199, 0x1a1a: 0x0f31, 0x1a1b: 0x0249, 0x1a1c: 0x0f41, 0x1a1d: 0x0259, + 0x1a1e: 0x0f51, 0x1a1f: 0x0359, 0x1a20: 0x0f61, 0x1a21: 0x0f71, 0x1a22: 0x00d9, 0x1a23: 0x0f99, + 0x1a24: 0x2039, 0x1a25: 0x0269, 0x1a26: 0x01d9, 0x1a27: 0x0fa9, 0x1a28: 0x0fb9, 0x1a29: 0x1089, + 0x1a2a: 0x0279, 0x1a2b: 0x0369, 0x1a2c: 0x0289, 0x1a2d: 0x13d1, 0x1a2e: 0x0039, 0x1a2f: 0x0ee9, + 0x1a30: 0x1159, 0x1a31: 0x0ef9, 0x1a32: 0x0f09, 0x1a33: 0x1199, 0x1a34: 0x0f31, 0x1a35: 0x0249, + 0x1a36: 0x0f41, 0x1a37: 0x0259, 0x1a38: 0x0f51, 0x1a39: 0x0359, 0x1a3a: 0x0f61, 0x1a3b: 0x0f71, + 0x1a3c: 0x00d9, 0x1a3d: 0x0f99, 0x1a3e: 0x2039, 0x1a3f: 0x0269, + // Block 0x69, offset 0x1a40 + 0x1a40: 0x01d9, 0x1a41: 0x0fa9, 0x1a42: 0x0fb9, 0x1a43: 0x1089, 0x1a44: 0x0279, 0x1a45: 0x0369, + 0x1a46: 0x0289, 0x1a47: 0x13d1, 0x1a48: 0x0039, 0x1a49: 0x0ee9, 0x1a4a: 0x1159, 0x1a4b: 0x0ef9, + 0x1a4c: 0x0f09, 0x1a4d: 0x1199, 0x1a4e: 0x0f31, 0x1a4f: 0x0249, 0x1a50: 0x0f41, 0x1a51: 0x0259, + 0x1a52: 0x0f51, 0x1a53: 0x0359, 0x1a54: 0x0f61, 0x1a55: 0x0f71, 0x1a56: 0x00d9, 0x1a57: 0x0f99, + 0x1a58: 0x2039, 0x1a59: 0x0269, 0x1a5a: 0x01d9, 0x1a5b: 0x0fa9, 0x1a5c: 0x0fb9, 0x1a5d: 0x1089, + 0x1a5e: 0x0279, 0x1a5f: 0x0369, 0x1a60: 0x0289, 0x1a61: 0x13d1, 0x1a62: 0x0039, 0x1a63: 0x0ee9, + 0x1a64: 0x1159, 0x1a65: 0x0ef9, 0x1a66: 0x0f09, 0x1a67: 0x1199, 0x1a68: 0x0f31, 0x1a69: 0x0249, + 0x1a6a: 0x0f41, 0x1a6b: 0x0259, 0x1a6c: 0x0f51, 0x1a6d: 0x0359, 0x1a6e: 0x0f61, 0x1a6f: 0x0f71, + 0x1a70: 0x00d9, 0x1a71: 0x0f99, 0x1a72: 0x2039, 0x1a73: 0x0269, 0x1a74: 0x01d9, 0x1a75: 0x0fa9, + 0x1a76: 0x0fb9, 0x1a77: 0x1089, 0x1a78: 0x0279, 0x1a79: 0x0369, 0x1a7a: 0x0289, 0x1a7b: 0x13d1, + 0x1a7c: 0x0039, 0x1a7d: 0x0ee9, 0x1a7e: 0x1159, 0x1a7f: 0x0ef9, + // Block 0x6a, offset 0x1a80 + 0x1a80: 0x0f09, 0x1a81: 0x1199, 0x1a82: 0x0f31, 0x1a83: 0x0249, 0x1a84: 0x0f41, 0x1a85: 0x0259, + 0x1a86: 0x0f51, 0x1a87: 0x0359, 0x1a88: 0x0f61, 0x1a89: 0x0f71, 0x1a8a: 0x00d9, 0x1a8b: 0x0f99, + 0x1a8c: 0x2039, 0x1a8d: 0x0269, 0x1a8e: 0x01d9, 0x1a8f: 0x0fa9, 0x1a90: 0x0fb9, 0x1a91: 0x1089, + 0x1a92: 0x0279, 0x1a93: 0x0369, 0x1a94: 0x0289, 0x1a95: 0x13d1, 0x1a96: 0x0039, 0x1a97: 0x0ee9, + 0x1a98: 0x1159, 0x1a99: 0x0ef9, 0x1a9a: 0x0f09, 0x1a9b: 0x1199, 0x1a9c: 0x0f31, 0x1a9d: 0x0249, + 0x1a9e: 0x0f41, 0x1a9f: 0x0259, 0x1aa0: 0x0f51, 0x1aa1: 0x0359, 0x1aa2: 0x0f61, 0x1aa3: 0x0f71, + 0x1aa4: 0x00d9, 0x1aa5: 0x0f99, 0x1aa6: 0x2039, 0x1aa7: 0x0269, 0x1aa8: 0x01d9, 0x1aa9: 0x0fa9, + 0x1aaa: 0x0fb9, 0x1aab: 0x1089, 0x1aac: 0x0279, 0x1aad: 0x0369, 0x1aae: 0x0289, 0x1aaf: 0x13d1, + 0x1ab0: 0x0039, 0x1ab1: 0x0ee9, 0x1ab2: 0x1159, 0x1ab3: 0x0ef9, 0x1ab4: 0x0f09, 0x1ab5: 0x1199, + 0x1ab6: 0x0f31, 0x1ab7: 0x0249, 0x1ab8: 0x0f41, 0x1ab9: 0x0259, 0x1aba: 0x0f51, 0x1abb: 0x0359, + 0x1abc: 0x0f61, 0x1abd: 0x0f71, 0x1abe: 0x00d9, 0x1abf: 0x0f99, + // Block 0x6b, offset 0x1ac0 + 0x1ac0: 0x2039, 0x1ac1: 0x0269, 0x1ac2: 0x01d9, 0x1ac3: 0x0fa9, 0x1ac4: 0x0fb9, 0x1ac5: 0x1089, + 0x1ac6: 0x0279, 0x1ac7: 0x0369, 0x1ac8: 0x0289, 0x1ac9: 0x13d1, 0x1aca: 0x0039, 0x1acb: 0x0ee9, + 0x1acc: 0x1159, 0x1acd: 0x0ef9, 0x1ace: 0x0f09, 0x1acf: 0x1199, 0x1ad0: 0x0f31, 0x1ad1: 0x0249, + 0x1ad2: 0x0f41, 0x1ad3: 0x0259, 0x1ad4: 0x0f51, 0x1ad5: 0x0359, 0x1ad6: 0x0f61, 0x1ad7: 0x0f71, + 0x1ad8: 0x00d9, 0x1ad9: 0x0f99, 0x1ada: 0x2039, 0x1adb: 0x0269, 0x1adc: 0x01d9, 0x1add: 0x0fa9, + 0x1ade: 0x0fb9, 0x1adf: 0x1089, 0x1ae0: 0x0279, 0x1ae1: 0x0369, 0x1ae2: 0x0289, 0x1ae3: 0x13d1, + 0x1ae4: 0xba81, 0x1ae5: 0xba99, 0x1ae6: 0x0040, 0x1ae7: 0x0040, 0x1ae8: 0xbab1, 0x1ae9: 0x1099, + 0x1aea: 0x10b1, 0x1aeb: 0x10c9, 0x1aec: 0xbac9, 0x1aed: 0xbae1, 0x1aee: 0xbaf9, 0x1aef: 0x1429, + 0x1af0: 0x1a31, 0x1af1: 0xbb11, 0x1af2: 0xbb29, 0x1af3: 0xbb41, 0x1af4: 0xbb59, 0x1af5: 0xbb71, + 0x1af6: 0xbb89, 0x1af7: 0x2109, 0x1af8: 0x1111, 0x1af9: 0x1429, 0x1afa: 0xbba1, 0x1afb: 0xbbb9, + 0x1afc: 0xbbd1, 0x1afd: 0x10e1, 0x1afe: 0x10f9, 0x1aff: 0xbbe9, + // Block 0x6c, offset 0x1b00 + 0x1b00: 0x2079, 0x1b01: 0xbc01, 0x1b02: 0xbab1, 0x1b03: 0x1099, 0x1b04: 0x10b1, 0x1b05: 0x10c9, + 0x1b06: 0xbac9, 0x1b07: 0xbae1, 0x1b08: 0xbaf9, 0x1b09: 0x1429, 0x1b0a: 0x1a31, 0x1b0b: 0xbb11, + 0x1b0c: 0xbb29, 0x1b0d: 0xbb41, 0x1b0e: 0xbb59, 0x1b0f: 0xbb71, 0x1b10: 0xbb89, 0x1b11: 0x2109, + 0x1b12: 0x1111, 0x1b13: 0xbba1, 0x1b14: 0xbba1, 0x1b15: 0xbbb9, 0x1b16: 0xbbd1, 0x1b17: 0x10e1, + 0x1b18: 0x10f9, 0x1b19: 0xbbe9, 0x1b1a: 0x2079, 0x1b1b: 0xbc21, 0x1b1c: 0xbac9, 0x1b1d: 0x1429, + 0x1b1e: 0xbb11, 0x1b1f: 0x10e1, 0x1b20: 0x1111, 0x1b21: 0x2109, 0x1b22: 0xbab1, 0x1b23: 0x1099, + 0x1b24: 0x10b1, 0x1b25: 0x10c9, 0x1b26: 0xbac9, 0x1b27: 0xbae1, 0x1b28: 0xbaf9, 0x1b29: 0x1429, + 0x1b2a: 0x1a31, 0x1b2b: 0xbb11, 0x1b2c: 0xbb29, 0x1b2d: 0xbb41, 0x1b2e: 0xbb59, 0x1b2f: 0xbb71, + 0x1b30: 0xbb89, 0x1b31: 0x2109, 0x1b32: 0x1111, 0x1b33: 0x1429, 0x1b34: 0xbba1, 0x1b35: 0xbbb9, + 0x1b36: 0xbbd1, 0x1b37: 0x10e1, 0x1b38: 0x10f9, 0x1b39: 0xbbe9, 0x1b3a: 0x2079, 0x1b3b: 0xbc01, + 0x1b3c: 0xbab1, 0x1b3d: 0x1099, 0x1b3e: 0x10b1, 0x1b3f: 0x10c9, + // Block 0x6d, offset 0x1b40 + 0x1b40: 0xbac9, 0x1b41: 0xbae1, 0x1b42: 0xbaf9, 0x1b43: 0x1429, 0x1b44: 0x1a31, 0x1b45: 0xbb11, + 0x1b46: 0xbb29, 0x1b47: 0xbb41, 0x1b48: 0xbb59, 0x1b49: 0xbb71, 0x1b4a: 0xbb89, 0x1b4b: 0x2109, + 0x1b4c: 0x1111, 0x1b4d: 0xbba1, 0x1b4e: 0xbba1, 0x1b4f: 0xbbb9, 0x1b50: 0xbbd1, 0x1b51: 0x10e1, + 0x1b52: 0x10f9, 0x1b53: 0xbbe9, 0x1b54: 0x2079, 0x1b55: 0xbc21, 0x1b56: 0xbac9, 0x1b57: 0x1429, + 0x1b58: 0xbb11, 0x1b59: 0x10e1, 0x1b5a: 0x1111, 0x1b5b: 0x2109, 0x1b5c: 0xbab1, 0x1b5d: 0x1099, + 0x1b5e: 0x10b1, 0x1b5f: 0x10c9, 0x1b60: 0xbac9, 0x1b61: 0xbae1, 0x1b62: 0xbaf9, 0x1b63: 0x1429, + 0x1b64: 0x1a31, 0x1b65: 0xbb11, 0x1b66: 0xbb29, 0x1b67: 0xbb41, 0x1b68: 0xbb59, 0x1b69: 0xbb71, + 0x1b6a: 0xbb89, 0x1b6b: 0x2109, 0x1b6c: 0x1111, 0x1b6d: 0x1429, 0x1b6e: 0xbba1, 0x1b6f: 0xbbb9, + 0x1b70: 0xbbd1, 0x1b71: 0x10e1, 0x1b72: 0x10f9, 0x1b73: 0xbbe9, 0x1b74: 0x2079, 0x1b75: 0xbc01, + 0x1b76: 0xbab1, 0x1b77: 0x1099, 0x1b78: 0x10b1, 0x1b79: 0x10c9, 0x1b7a: 0xbac9, 0x1b7b: 0xbae1, + 0x1b7c: 0xbaf9, 0x1b7d: 0x1429, 0x1b7e: 0x1a31, 0x1b7f: 0xbb11, + // Block 0x6e, offset 0x1b80 + 0x1b80: 0xbb29, 0x1b81: 0xbb41, 0x1b82: 0xbb59, 0x1b83: 0xbb71, 0x1b84: 0xbb89, 0x1b85: 0x2109, + 0x1b86: 0x1111, 0x1b87: 0xbba1, 0x1b88: 0xbba1, 0x1b89: 0xbbb9, 0x1b8a: 0xbbd1, 0x1b8b: 0x10e1, + 0x1b8c: 0x10f9, 0x1b8d: 0xbbe9, 0x1b8e: 0x2079, 0x1b8f: 0xbc21, 0x1b90: 0xbac9, 0x1b91: 0x1429, + 0x1b92: 0xbb11, 0x1b93: 0x10e1, 0x1b94: 0x1111, 0x1b95: 0x2109, 0x1b96: 0xbab1, 0x1b97: 0x1099, + 0x1b98: 0x10b1, 0x1b99: 0x10c9, 0x1b9a: 0xbac9, 0x1b9b: 0xbae1, 0x1b9c: 0xbaf9, 0x1b9d: 0x1429, + 0x1b9e: 0x1a31, 0x1b9f: 0xbb11, 0x1ba0: 0xbb29, 0x1ba1: 0xbb41, 0x1ba2: 0xbb59, 0x1ba3: 0xbb71, + 0x1ba4: 0xbb89, 0x1ba5: 0x2109, 0x1ba6: 0x1111, 0x1ba7: 0x1429, 0x1ba8: 0xbba1, 0x1ba9: 0xbbb9, + 0x1baa: 0xbbd1, 0x1bab: 0x10e1, 0x1bac: 0x10f9, 0x1bad: 0xbbe9, 0x1bae: 0x2079, 0x1baf: 0xbc01, + 0x1bb0: 0xbab1, 0x1bb1: 0x1099, 0x1bb2: 0x10b1, 0x1bb3: 0x10c9, 0x1bb4: 0xbac9, 0x1bb5: 0xbae1, + 0x1bb6: 0xbaf9, 0x1bb7: 0x1429, 0x1bb8: 0x1a31, 0x1bb9: 0xbb11, 0x1bba: 0xbb29, 0x1bbb: 0xbb41, + 0x1bbc: 0xbb59, 0x1bbd: 0xbb71, 0x1bbe: 0xbb89, 0x1bbf: 0x2109, + // Block 0x6f, offset 0x1bc0 + 0x1bc0: 0x1111, 0x1bc1: 0xbba1, 0x1bc2: 0xbba1, 0x1bc3: 0xbbb9, 0x1bc4: 0xbbd1, 0x1bc5: 0x10e1, + 0x1bc6: 0x10f9, 0x1bc7: 0xbbe9, 0x1bc8: 0x2079, 0x1bc9: 0xbc21, 0x1bca: 0xbac9, 0x1bcb: 0x1429, + 0x1bcc: 0xbb11, 0x1bcd: 0x10e1, 0x1bce: 0x1111, 0x1bcf: 0x2109, 0x1bd0: 0xbab1, 0x1bd1: 0x1099, + 0x1bd2: 0x10b1, 0x1bd3: 0x10c9, 0x1bd4: 0xbac9, 0x1bd5: 0xbae1, 0x1bd6: 0xbaf9, 0x1bd7: 0x1429, + 0x1bd8: 0x1a31, 0x1bd9: 0xbb11, 0x1bda: 0xbb29, 0x1bdb: 0xbb41, 0x1bdc: 0xbb59, 0x1bdd: 0xbb71, + 0x1bde: 0xbb89, 0x1bdf: 0x2109, 0x1be0: 0x1111, 0x1be1: 0x1429, 0x1be2: 0xbba1, 0x1be3: 0xbbb9, + 0x1be4: 0xbbd1, 0x1be5: 0x10e1, 0x1be6: 0x10f9, 0x1be7: 0xbbe9, 0x1be8: 0x2079, 0x1be9: 0xbc01, + 0x1bea: 0xbab1, 0x1beb: 0x1099, 0x1bec: 0x10b1, 0x1bed: 0x10c9, 0x1bee: 0xbac9, 0x1bef: 0xbae1, + 0x1bf0: 0xbaf9, 0x1bf1: 0x1429, 0x1bf2: 0x1a31, 0x1bf3: 0xbb11, 0x1bf4: 0xbb29, 0x1bf5: 0xbb41, + 0x1bf6: 0xbb59, 0x1bf7: 0xbb71, 0x1bf8: 0xbb89, 0x1bf9: 0x2109, 0x1bfa: 0x1111, 0x1bfb: 0xbba1, + 0x1bfc: 0xbba1, 0x1bfd: 0xbbb9, 0x1bfe: 0xbbd1, 0x1bff: 0x10e1, + // Block 0x70, offset 0x1c00 + 0x1c00: 0x10f9, 0x1c01: 0xbbe9, 0x1c02: 0x2079, 0x1c03: 0xbc21, 0x1c04: 0xbac9, 0x1c05: 0x1429, + 0x1c06: 0xbb11, 0x1c07: 0x10e1, 0x1c08: 0x1111, 0x1c09: 0x2109, 0x1c0a: 0xbc41, 0x1c0b: 0xbc41, + 0x1c0c: 0x0040, 0x1c0d: 0x0040, 0x1c0e: 0x1f41, 0x1c0f: 0x00c9, 0x1c10: 0x0069, 0x1c11: 0x0079, + 0x1c12: 0x1f51, 0x1c13: 0x1f61, 0x1c14: 0x1f71, 0x1c15: 0x1f81, 0x1c16: 0x1f91, 0x1c17: 0x1fa1, + 0x1c18: 0x1f41, 0x1c19: 0x00c9, 0x1c1a: 0x0069, 0x1c1b: 0x0079, 0x1c1c: 0x1f51, 0x1c1d: 0x1f61, + 0x1c1e: 0x1f71, 0x1c1f: 0x1f81, 0x1c20: 0x1f91, 0x1c21: 0x1fa1, 0x1c22: 0x1f41, 0x1c23: 0x00c9, + 0x1c24: 0x0069, 0x1c25: 0x0079, 0x1c26: 0x1f51, 0x1c27: 0x1f61, 0x1c28: 0x1f71, 0x1c29: 0x1f81, + 0x1c2a: 0x1f91, 0x1c2b: 0x1fa1, 0x1c2c: 0x1f41, 0x1c2d: 0x00c9, 0x1c2e: 0x0069, 0x1c2f: 0x0079, + 0x1c30: 0x1f51, 0x1c31: 0x1f61, 0x1c32: 0x1f71, 0x1c33: 0x1f81, 0x1c34: 0x1f91, 0x1c35: 0x1fa1, + 0x1c36: 0x1f41, 0x1c37: 0x00c9, 0x1c38: 0x0069, 0x1c39: 0x0079, 0x1c3a: 0x1f51, 0x1c3b: 0x1f61, + 0x1c3c: 0x1f71, 0x1c3d: 0x1f81, 0x1c3e: 0x1f91, 0x1c3f: 0x1fa1, + // Block 0x71, offset 0x1c40 + 0x1c40: 0xe115, 0x1c41: 0xe115, 0x1c42: 0xe135, 0x1c43: 0xe135, 0x1c44: 0xe115, 0x1c45: 0xe115, + 0x1c46: 0xe175, 0x1c47: 0xe175, 0x1c48: 0xe115, 0x1c49: 0xe115, 0x1c4a: 0xe135, 0x1c4b: 0xe135, + 0x1c4c: 0xe115, 0x1c4d: 0xe115, 0x1c4e: 0xe1f5, 0x1c4f: 0xe1f5, 0x1c50: 0xe115, 0x1c51: 0xe115, + 0x1c52: 0xe135, 0x1c53: 0xe135, 0x1c54: 0xe115, 0x1c55: 0xe115, 0x1c56: 0xe175, 0x1c57: 0xe175, + 0x1c58: 0xe115, 0x1c59: 0xe115, 0x1c5a: 0xe135, 0x1c5b: 0xe135, 0x1c5c: 0xe115, 0x1c5d: 0xe115, + 0x1c5e: 0x8b05, 0x1c5f: 0x8b05, 0x1c60: 0x04b5, 0x1c61: 0x04b5, 0x1c62: 0x0a08, 0x1c63: 0x0a08, + 0x1c64: 0x0a08, 0x1c65: 0x0a08, 0x1c66: 0x0a08, 0x1c67: 0x0a08, 0x1c68: 0x0a08, 0x1c69: 0x0a08, + 0x1c6a: 0x0a08, 0x1c6b: 0x0a08, 0x1c6c: 0x0a08, 0x1c6d: 0x0a08, 0x1c6e: 0x0a08, 0x1c6f: 0x0a08, + 0x1c70: 0x0a08, 0x1c71: 0x0a08, 0x1c72: 0x0a08, 0x1c73: 0x0a08, 0x1c74: 0x0a08, 0x1c75: 0x0a08, + 0x1c76: 0x0a08, 0x1c77: 0x0a08, 0x1c78: 0x0a08, 0x1c79: 0x0a08, 0x1c7a: 0x0a08, 0x1c7b: 0x0a08, + 0x1c7c: 0x0a08, 0x1c7d: 0x0a08, 0x1c7e: 0x0a08, 0x1c7f: 0x0a08, + // Block 0x72, offset 0x1c80 + 0x1c80: 0xb189, 0x1c81: 0xb1a1, 0x1c82: 0xb201, 0x1c83: 0xb249, 0x1c84: 0x0040, 0x1c85: 0xb411, + 0x1c86: 0xb291, 0x1c87: 0xb219, 0x1c88: 0xb309, 0x1c89: 0xb429, 0x1c8a: 0xb399, 0x1c8b: 0xb3b1, + 0x1c8c: 0xb3c9, 0x1c8d: 0xb3e1, 0x1c8e: 0xb2a9, 0x1c8f: 0xb339, 0x1c90: 0xb369, 0x1c91: 0xb2d9, + 0x1c92: 0xb381, 0x1c93: 0xb279, 0x1c94: 0xb2c1, 0x1c95: 0xb1d1, 0x1c96: 0xb1e9, 0x1c97: 0xb231, + 0x1c98: 0xb261, 0x1c99: 0xb2f1, 0x1c9a: 0xb321, 0x1c9b: 0xb351, 0x1c9c: 0xbc59, 0x1c9d: 0x7949, + 0x1c9e: 0xbc71, 0x1c9f: 0xbc89, 0x1ca0: 0x0040, 0x1ca1: 0xb1a1, 0x1ca2: 0xb201, 0x1ca3: 0x0040, + 0x1ca4: 0xb3f9, 0x1ca5: 0x0040, 0x1ca6: 0x0040, 0x1ca7: 0xb219, 0x1ca8: 0x0040, 0x1ca9: 0xb429, + 0x1caa: 0xb399, 0x1cab: 0xb3b1, 0x1cac: 0xb3c9, 0x1cad: 0xb3e1, 0x1cae: 0xb2a9, 0x1caf: 0xb339, + 0x1cb0: 0xb369, 0x1cb1: 0xb2d9, 0x1cb2: 0xb381, 0x1cb3: 0x0040, 0x1cb4: 0xb2c1, 0x1cb5: 0xb1d1, + 0x1cb6: 0xb1e9, 0x1cb7: 0xb231, 0x1cb8: 0x0040, 0x1cb9: 0xb2f1, 0x1cba: 0x0040, 0x1cbb: 0xb351, + 0x1cbc: 0x0040, 0x1cbd: 0x0040, 0x1cbe: 0x0040, 0x1cbf: 0x0040, + // Block 0x73, offset 0x1cc0 + 0x1cc0: 0x0040, 0x1cc1: 0x0040, 0x1cc2: 0xb201, 0x1cc3: 0x0040, 0x1cc4: 0x0040, 0x1cc5: 0x0040, + 0x1cc6: 0x0040, 0x1cc7: 0xb219, 0x1cc8: 0x0040, 0x1cc9: 0xb429, 0x1cca: 0x0040, 0x1ccb: 0xb3b1, + 0x1ccc: 0x0040, 0x1ccd: 0xb3e1, 0x1cce: 0xb2a9, 0x1ccf: 0xb339, 0x1cd0: 0x0040, 0x1cd1: 0xb2d9, + 0x1cd2: 0xb381, 0x1cd3: 0x0040, 0x1cd4: 0xb2c1, 0x1cd5: 0x0040, 0x1cd6: 0x0040, 0x1cd7: 0xb231, + 0x1cd8: 0x0040, 0x1cd9: 0xb2f1, 0x1cda: 0x0040, 0x1cdb: 0xb351, 0x1cdc: 0x0040, 0x1cdd: 0x7949, + 0x1cde: 0x0040, 0x1cdf: 0xbc89, 0x1ce0: 0x0040, 0x1ce1: 0xb1a1, 0x1ce2: 0xb201, 0x1ce3: 0x0040, + 0x1ce4: 0xb3f9, 0x1ce5: 0x0040, 0x1ce6: 0x0040, 0x1ce7: 0xb219, 0x1ce8: 0xb309, 0x1ce9: 0xb429, + 0x1cea: 0xb399, 0x1ceb: 0x0040, 0x1cec: 0xb3c9, 0x1ced: 0xb3e1, 0x1cee: 0xb2a9, 0x1cef: 0xb339, + 0x1cf0: 0xb369, 0x1cf1: 0xb2d9, 0x1cf2: 0xb381, 0x1cf3: 0x0040, 0x1cf4: 0xb2c1, 0x1cf5: 0xb1d1, + 0x1cf6: 0xb1e9, 0x1cf7: 0xb231, 0x1cf8: 0x0040, 0x1cf9: 0xb2f1, 0x1cfa: 0xb321, 0x1cfb: 0xb351, + 0x1cfc: 0xbc59, 0x1cfd: 0x0040, 0x1cfe: 0xbc71, 0x1cff: 0x0040, + // Block 0x74, offset 0x1d00 + 0x1d00: 0xb189, 0x1d01: 0xb1a1, 0x1d02: 0xb201, 0x1d03: 0xb249, 0x1d04: 0xb3f9, 0x1d05: 0xb411, + 0x1d06: 0xb291, 0x1d07: 0xb219, 0x1d08: 0xb309, 0x1d09: 0xb429, 0x1d0a: 0x0040, 0x1d0b: 0xb3b1, + 0x1d0c: 0xb3c9, 0x1d0d: 0xb3e1, 0x1d0e: 0xb2a9, 0x1d0f: 0xb339, 0x1d10: 0xb369, 0x1d11: 0xb2d9, + 0x1d12: 0xb381, 0x1d13: 0xb279, 0x1d14: 0xb2c1, 0x1d15: 0xb1d1, 0x1d16: 0xb1e9, 0x1d17: 0xb231, + 0x1d18: 0xb261, 0x1d19: 0xb2f1, 0x1d1a: 0xb321, 0x1d1b: 0xb351, 0x1d1c: 0x0040, 0x1d1d: 0x0040, + 0x1d1e: 0x0040, 0x1d1f: 0x0040, 0x1d20: 0x0040, 0x1d21: 0xb1a1, 0x1d22: 0xb201, 0x1d23: 0xb249, + 0x1d24: 0x0040, 0x1d25: 0xb411, 0x1d26: 0xb291, 0x1d27: 0xb219, 0x1d28: 0xb309, 0x1d29: 0xb429, + 0x1d2a: 0x0040, 0x1d2b: 0xb3b1, 0x1d2c: 0xb3c9, 0x1d2d: 0xb3e1, 0x1d2e: 0xb2a9, 0x1d2f: 0xb339, + 0x1d30: 0xb369, 0x1d31: 0xb2d9, 0x1d32: 0xb381, 0x1d33: 0xb279, 0x1d34: 0xb2c1, 0x1d35: 0xb1d1, + 0x1d36: 0xb1e9, 0x1d37: 0xb231, 0x1d38: 0xb261, 0x1d39: 0xb2f1, 0x1d3a: 0xb321, 0x1d3b: 0xb351, + 0x1d3c: 0x0040, 0x1d3d: 0x0040, 0x1d3e: 0x0040, 0x1d3f: 0x0040, + // Block 0x75, offset 0x1d40 + 0x1d40: 0x0040, 0x1d41: 0xbca2, 0x1d42: 0xbcba, 0x1d43: 0xbcd2, 0x1d44: 0xbcea, 0x1d45: 0xbd02, + 0x1d46: 0xbd1a, 0x1d47: 0xbd32, 0x1d48: 0xbd4a, 0x1d49: 0xbd62, 0x1d4a: 0xbd7a, 0x1d4b: 0x0018, + 0x1d4c: 0x0018, 0x1d4d: 0x0040, 0x1d4e: 0x0040, 0x1d4f: 0x0040, 0x1d50: 0xbd92, 0x1d51: 0xbdb2, + 0x1d52: 0xbdd2, 0x1d53: 0xbdf2, 0x1d54: 0xbe12, 0x1d55: 0xbe32, 0x1d56: 0xbe52, 0x1d57: 0xbe72, + 0x1d58: 0xbe92, 0x1d59: 0xbeb2, 0x1d5a: 0xbed2, 0x1d5b: 0xbef2, 0x1d5c: 0xbf12, 0x1d5d: 0xbf32, + 0x1d5e: 0xbf52, 0x1d5f: 0xbf72, 0x1d60: 0xbf92, 0x1d61: 0xbfb2, 0x1d62: 0xbfd2, 0x1d63: 0xbff2, + 0x1d64: 0xc012, 0x1d65: 0xc032, 0x1d66: 0xc052, 0x1d67: 0xc072, 0x1d68: 0xc092, 0x1d69: 0xc0b2, + 0x1d6a: 0xc0d1, 0x1d6b: 0x1159, 0x1d6c: 0x0269, 0x1d6d: 0x6671, 0x1d6e: 0xc111, 0x1d6f: 0x0040, + 0x1d70: 0x0039, 0x1d71: 0x0ee9, 0x1d72: 0x1159, 0x1d73: 0x0ef9, 0x1d74: 0x0f09, 0x1d75: 0x1199, + 0x1d76: 0x0f31, 0x1d77: 0x0249, 0x1d78: 0x0f41, 0x1d79: 0x0259, 0x1d7a: 0x0f51, 0x1d7b: 0x0359, + 0x1d7c: 0x0f61, 0x1d7d: 0x0f71, 0x1d7e: 0x00d9, 0x1d7f: 0x0f99, + // Block 0x76, offset 0x1d80 + 0x1d80: 0x2039, 0x1d81: 0x0269, 0x1d82: 0x01d9, 0x1d83: 0x0fa9, 0x1d84: 0x0fb9, 0x1d85: 0x1089, + 0x1d86: 0x0279, 0x1d87: 0x0369, 0x1d88: 0x0289, 0x1d89: 0x13d1, 0x1d8a: 0xc129, 0x1d8b: 0x65b1, + 0x1d8c: 0xc141, 0x1d8d: 0x1441, 0x1d8e: 0xc159, 0x1d8f: 0xc179, 0x1d90: 0x0018, 0x1d91: 0x0018, + 0x1d92: 0x0018, 0x1d93: 0x0018, 0x1d94: 0x0018, 0x1d95: 0x0018, 0x1d96: 0x0018, 0x1d97: 0x0018, + 0x1d98: 0x0018, 0x1d99: 0x0018, 0x1d9a: 0x0018, 0x1d9b: 0x0018, 0x1d9c: 0x0018, 0x1d9d: 0x0018, + 0x1d9e: 0x0018, 0x1d9f: 0x0018, 0x1da0: 0x0018, 0x1da1: 0x0018, 0x1da2: 0x0018, 0x1da3: 0x0018, + 0x1da4: 0x0018, 0x1da5: 0x0018, 0x1da6: 0x0018, 0x1da7: 0x0018, 0x1da8: 0x0018, 0x1da9: 0x0018, + 0x1daa: 0xc191, 0x1dab: 0xc1a9, 0x1dac: 0x0040, 0x1dad: 0x0040, 0x1dae: 0x0040, 0x1daf: 0x0040, + 0x1db0: 0x0018, 0x1db1: 0x0018, 0x1db2: 0x0018, 0x1db3: 0x0018, 0x1db4: 0x0018, 0x1db5: 0x0018, + 0x1db6: 0x0018, 0x1db7: 0x0018, 0x1db8: 0x0018, 0x1db9: 0x0018, 0x1dba: 0x0018, 0x1dbb: 0x0018, + 0x1dbc: 0x0018, 0x1dbd: 0x0018, 0x1dbe: 0x0018, 0x1dbf: 0x0018, + // Block 0x77, offset 0x1dc0 + 0x1dc0: 0xc1d9, 0x1dc1: 0xc211, 0x1dc2: 0xc249, 0x1dc3: 0x0040, 0x1dc4: 0x0040, 0x1dc5: 0x0040, + 0x1dc6: 0x0040, 0x1dc7: 0x0040, 0x1dc8: 0x0040, 0x1dc9: 0x0040, 0x1dca: 0x0040, 0x1dcb: 0x0040, + 0x1dcc: 0x0040, 0x1dcd: 0x0040, 0x1dce: 0x0040, 0x1dcf: 0x0040, 0x1dd0: 0xc269, 0x1dd1: 0xc289, + 0x1dd2: 0xc2a9, 0x1dd3: 0xc2c9, 0x1dd4: 0xc2e9, 0x1dd5: 0xc309, 0x1dd6: 0xc329, 0x1dd7: 0xc349, + 0x1dd8: 0xc369, 0x1dd9: 0xc389, 0x1dda: 0xc3a9, 0x1ddb: 0xc3c9, 0x1ddc: 0xc3e9, 0x1ddd: 0xc409, + 0x1dde: 0xc429, 0x1ddf: 0xc449, 0x1de0: 0xc469, 0x1de1: 0xc489, 0x1de2: 0xc4a9, 0x1de3: 0xc4c9, + 0x1de4: 0xc4e9, 0x1de5: 0xc509, 0x1de6: 0xc529, 0x1de7: 0xc549, 0x1de8: 0xc569, 0x1de9: 0xc589, + 0x1dea: 0xc5a9, 0x1deb: 0xc5c9, 0x1dec: 0xc5e9, 0x1ded: 0xc609, 0x1dee: 0xc629, 0x1def: 0xc649, + 0x1df0: 0xc669, 0x1df1: 0xc689, 0x1df2: 0xc6a9, 0x1df3: 0xc6c9, 0x1df4: 0xc6e9, 0x1df5: 0xc709, + 0x1df6: 0xc729, 0x1df7: 0xc749, 0x1df8: 0xc769, 0x1df9: 0xc789, 0x1dfa: 0xc7a9, 0x1dfb: 0xc7c9, + 0x1dfc: 0x0040, 0x1dfd: 0x0040, 0x1dfe: 0x0040, 0x1dff: 0x0040, + // Block 0x78, offset 0x1e00 + 0x1e00: 0xcaf9, 0x1e01: 0xcb19, 0x1e02: 0xcb39, 0x1e03: 0x8b1d, 0x1e04: 0xcb59, 0x1e05: 0xcb79, + 0x1e06: 0xcb99, 0x1e07: 0xcbb9, 0x1e08: 0xcbd9, 0x1e09: 0xcbf9, 0x1e0a: 0xcc19, 0x1e0b: 0xcc39, + 0x1e0c: 0xcc59, 0x1e0d: 0x8b3d, 0x1e0e: 0xcc79, 0x1e0f: 0xcc99, 0x1e10: 0xccb9, 0x1e11: 0xccd9, + 0x1e12: 0x8b5d, 0x1e13: 0xccf9, 0x1e14: 0xcd19, 0x1e15: 0xc429, 0x1e16: 0x8b7d, 0x1e17: 0xcd39, + 0x1e18: 0xcd59, 0x1e19: 0xcd79, 0x1e1a: 0xcd99, 0x1e1b: 0xcdb9, 0x1e1c: 0x8b9d, 0x1e1d: 0xcdd9, + 0x1e1e: 0xcdf9, 0x1e1f: 0xce19, 0x1e20: 0xce39, 0x1e21: 0xce59, 0x1e22: 0xc789, 0x1e23: 0xce79, + 0x1e24: 0xce99, 0x1e25: 0xceb9, 0x1e26: 0xced9, 0x1e27: 0xcef9, 0x1e28: 0xcf19, 0x1e29: 0xcf39, + 0x1e2a: 0xcf59, 0x1e2b: 0xcf79, 0x1e2c: 0xcf99, 0x1e2d: 0xcfb9, 0x1e2e: 0xcfd9, 0x1e2f: 0xcff9, + 0x1e30: 0xd019, 0x1e31: 0xd039, 0x1e32: 0xd039, 0x1e33: 0xd039, 0x1e34: 0x8bbd, 0x1e35: 0xd059, + 0x1e36: 0xd079, 0x1e37: 0xd099, 0x1e38: 0x8bdd, 0x1e39: 0xd0b9, 0x1e3a: 0xd0d9, 0x1e3b: 0xd0f9, + 0x1e3c: 0xd119, 0x1e3d: 0xd139, 0x1e3e: 0xd159, 0x1e3f: 0xd179, + // Block 0x79, offset 0x1e40 + 0x1e40: 0xd199, 0x1e41: 0xd1b9, 0x1e42: 0xd1d9, 0x1e43: 0xd1f9, 0x1e44: 0xd219, 0x1e45: 0xd239, + 0x1e46: 0xd239, 0x1e47: 0xd259, 0x1e48: 0xd279, 0x1e49: 0xd299, 0x1e4a: 0xd2b9, 0x1e4b: 0xd2d9, + 0x1e4c: 0xd2f9, 0x1e4d: 0xd319, 0x1e4e: 0xd339, 0x1e4f: 0xd359, 0x1e50: 0xd379, 0x1e51: 0xd399, + 0x1e52: 0xd3b9, 0x1e53: 0xd3d9, 0x1e54: 0xd3f9, 0x1e55: 0xd419, 0x1e56: 0xd439, 0x1e57: 0xd459, + 0x1e58: 0xd479, 0x1e59: 0x8bfd, 0x1e5a: 0xd499, 0x1e5b: 0xd4b9, 0x1e5c: 0xd4d9, 0x1e5d: 0xc309, + 0x1e5e: 0xd4f9, 0x1e5f: 0xd519, 0x1e60: 0x8c1d, 0x1e61: 0x8c3d, 0x1e62: 0xd539, 0x1e63: 0xd559, + 0x1e64: 0xd579, 0x1e65: 0xd599, 0x1e66: 0xd5b9, 0x1e67: 0xd5d9, 0x1e68: 0x2040, 0x1e69: 0xd5f9, + 0x1e6a: 0xd619, 0x1e6b: 0xd619, 0x1e6c: 0x8c5d, 0x1e6d: 0xd639, 0x1e6e: 0xd659, 0x1e6f: 0xd679, + 0x1e70: 0xd699, 0x1e71: 0x8c7d, 0x1e72: 0xd6b9, 0x1e73: 0xd6d9, 0x1e74: 0x2040, 0x1e75: 0xd6f9, + 0x1e76: 0xd719, 0x1e77: 0xd739, 0x1e78: 0xd759, 0x1e79: 0xd779, 0x1e7a: 0xd799, 0x1e7b: 0x8c9d, + 0x1e7c: 0xd7b9, 0x1e7d: 0x8cbd, 0x1e7e: 0xd7d9, 0x1e7f: 0xd7f9, + // Block 0x7a, offset 0x1e80 + 0x1e80: 0xd819, 0x1e81: 0xd839, 0x1e82: 0xd859, 0x1e83: 0xd879, 0x1e84: 0xd899, 0x1e85: 0xd8b9, + 0x1e86: 0xd8d9, 0x1e87: 0xd8f9, 0x1e88: 0xd919, 0x1e89: 0x8cdd, 0x1e8a: 0xd939, 0x1e8b: 0xd959, + 0x1e8c: 0xd979, 0x1e8d: 0xd999, 0x1e8e: 0xd9b9, 0x1e8f: 0x8cfd, 0x1e90: 0xd9d9, 0x1e91: 0x8d1d, + 0x1e92: 0x8d3d, 0x1e93: 0xd9f9, 0x1e94: 0xda19, 0x1e95: 0xda19, 0x1e96: 0xda39, 0x1e97: 0x8d5d, + 0x1e98: 0x8d7d, 0x1e99: 0xda59, 0x1e9a: 0xda79, 0x1e9b: 0xda99, 0x1e9c: 0xdab9, 0x1e9d: 0xdad9, + 0x1e9e: 0xdaf9, 0x1e9f: 0xdb19, 0x1ea0: 0xdb39, 0x1ea1: 0xdb59, 0x1ea2: 0xdb79, 0x1ea3: 0xdb99, + 0x1ea4: 0x8d9d, 0x1ea5: 0xdbb9, 0x1ea6: 0xdbd9, 0x1ea7: 0xdbf9, 0x1ea8: 0xdc19, 0x1ea9: 0xdbf9, + 0x1eaa: 0xdc39, 0x1eab: 0xdc59, 0x1eac: 0xdc79, 0x1ead: 0xdc99, 0x1eae: 0xdcb9, 0x1eaf: 0xdcd9, + 0x1eb0: 0xdcf9, 0x1eb1: 0xdd19, 0x1eb2: 0xdd39, 0x1eb3: 0xdd59, 0x1eb4: 0xdd79, 0x1eb5: 0xdd99, + 0x1eb6: 0xddb9, 0x1eb7: 0xddd9, 0x1eb8: 0x8dbd, 0x1eb9: 0xddf9, 0x1eba: 0xde19, 0x1ebb: 0xde39, + 0x1ebc: 0xde59, 0x1ebd: 0xde79, 0x1ebe: 0x8ddd, 0x1ebf: 0xde99, + // Block 0x7b, offset 0x1ec0 + 0x1ec0: 0xe599, 0x1ec1: 0xe5b9, 0x1ec2: 0xe5d9, 0x1ec3: 0xe5f9, 0x1ec4: 0xe619, 0x1ec5: 0xe639, + 0x1ec6: 0x8efd, 0x1ec7: 0xe659, 0x1ec8: 0xe679, 0x1ec9: 0xe699, 0x1eca: 0xe6b9, 0x1ecb: 0xe6d9, + 0x1ecc: 0xe6f9, 0x1ecd: 0x8f1d, 0x1ece: 0xe719, 0x1ecf: 0xe739, 0x1ed0: 0x8f3d, 0x1ed1: 0x8f5d, + 0x1ed2: 0xe759, 0x1ed3: 0xe779, 0x1ed4: 0xe799, 0x1ed5: 0xe7b9, 0x1ed6: 0xe7d9, 0x1ed7: 0xe7f9, + 0x1ed8: 0xe819, 0x1ed9: 0xe839, 0x1eda: 0xe859, 0x1edb: 0x8f7d, 0x1edc: 0xe879, 0x1edd: 0x8f9d, + 0x1ede: 0xe899, 0x1edf: 0x2040, 0x1ee0: 0xe8b9, 0x1ee1: 0xe8d9, 0x1ee2: 0xe8f9, 0x1ee3: 0x8fbd, + 0x1ee4: 0xe919, 0x1ee5: 0xe939, 0x1ee6: 0x8fdd, 0x1ee7: 0x8ffd, 0x1ee8: 0xe959, 0x1ee9: 0xe979, + 0x1eea: 0xe999, 0x1eeb: 0xe9b9, 0x1eec: 0xe9d9, 0x1eed: 0xe9d9, 0x1eee: 0xe9f9, 0x1eef: 0xea19, + 0x1ef0: 0xea39, 0x1ef1: 0xea59, 0x1ef2: 0xea79, 0x1ef3: 0xea99, 0x1ef4: 0xeab9, 0x1ef5: 0x901d, + 0x1ef6: 0xead9, 0x1ef7: 0x903d, 0x1ef8: 0xeaf9, 0x1ef9: 0x905d, 0x1efa: 0xeb19, 0x1efb: 0x907d, + 0x1efc: 0x909d, 0x1efd: 0x90bd, 0x1efe: 0xeb39, 0x1eff: 0xeb59, + // Block 0x7c, offset 0x1f00 + 0x1f00: 0xeb79, 0x1f01: 0x90dd, 0x1f02: 0x90fd, 0x1f03: 0x911d, 0x1f04: 0x913d, 0x1f05: 0xeb99, + 0x1f06: 0xebb9, 0x1f07: 0xebb9, 0x1f08: 0xebd9, 0x1f09: 0xebf9, 0x1f0a: 0xec19, 0x1f0b: 0xec39, + 0x1f0c: 0xec59, 0x1f0d: 0x915d, 0x1f0e: 0xec79, 0x1f0f: 0xec99, 0x1f10: 0xecb9, 0x1f11: 0xecd9, + 0x1f12: 0x917d, 0x1f13: 0xecf9, 0x1f14: 0x919d, 0x1f15: 0x91bd, 0x1f16: 0xed19, 0x1f17: 0xed39, + 0x1f18: 0xed59, 0x1f19: 0xed79, 0x1f1a: 0xed99, 0x1f1b: 0xedb9, 0x1f1c: 0x91dd, 0x1f1d: 0x91fd, + 0x1f1e: 0x921d, 0x1f1f: 0x2040, 0x1f20: 0xedd9, 0x1f21: 0x923d, 0x1f22: 0xedf9, 0x1f23: 0xee19, + 0x1f24: 0xee39, 0x1f25: 0x925d, 0x1f26: 0xee59, 0x1f27: 0xee79, 0x1f28: 0xee99, 0x1f29: 0xeeb9, + 0x1f2a: 0xeed9, 0x1f2b: 0x927d, 0x1f2c: 0xeef9, 0x1f2d: 0xef19, 0x1f2e: 0xef39, 0x1f2f: 0xef59, + 0x1f30: 0xef79, 0x1f31: 0xef99, 0x1f32: 0x929d, 0x1f33: 0x92bd, 0x1f34: 0xefb9, 0x1f35: 0x92dd, + 0x1f36: 0xefd9, 0x1f37: 0x92fd, 0x1f38: 0xeff9, 0x1f39: 0xf019, 0x1f3a: 0xf039, 0x1f3b: 0x931d, + 0x1f3c: 0x933d, 0x1f3d: 0xf059, 0x1f3e: 0x935d, 0x1f3f: 0xf079, + // Block 0x7d, offset 0x1f40 + 0x1f40: 0xf6b9, 0x1f41: 0xf6d9, 0x1f42: 0xf6f9, 0x1f43: 0xf719, 0x1f44: 0xf739, 0x1f45: 0x951d, + 0x1f46: 0xf759, 0x1f47: 0xf779, 0x1f48: 0xf799, 0x1f49: 0xf7b9, 0x1f4a: 0xf7d9, 0x1f4b: 0x953d, + 0x1f4c: 0x955d, 0x1f4d: 0xf7f9, 0x1f4e: 0xf819, 0x1f4f: 0xf839, 0x1f50: 0xf859, 0x1f51: 0xf879, + 0x1f52: 0xf899, 0x1f53: 0x957d, 0x1f54: 0xf8b9, 0x1f55: 0xf8d9, 0x1f56: 0xf8f9, 0x1f57: 0xf919, + 0x1f58: 0x959d, 0x1f59: 0x95bd, 0x1f5a: 0xf939, 0x1f5b: 0xf959, 0x1f5c: 0xf979, 0x1f5d: 0x95dd, + 0x1f5e: 0xf999, 0x1f5f: 0xf9b9, 0x1f60: 0x6815, 0x1f61: 0x95fd, 0x1f62: 0xf9d9, 0x1f63: 0xf9f9, + 0x1f64: 0xfa19, 0x1f65: 0x961d, 0x1f66: 0xfa39, 0x1f67: 0xfa59, 0x1f68: 0xfa79, 0x1f69: 0xfa99, + 0x1f6a: 0xfab9, 0x1f6b: 0xfad9, 0x1f6c: 0xfaf9, 0x1f6d: 0x963d, 0x1f6e: 0xfb19, 0x1f6f: 0xfb39, + 0x1f70: 0xfb59, 0x1f71: 0x965d, 0x1f72: 0xfb79, 0x1f73: 0xfb99, 0x1f74: 0xfbb9, 0x1f75: 0xfbd9, + 0x1f76: 0x7b35, 0x1f77: 0x967d, 0x1f78: 0xfbf9, 0x1f79: 0xfc19, 0x1f7a: 0xfc39, 0x1f7b: 0x969d, + 0x1f7c: 0xfc59, 0x1f7d: 0x96bd, 0x1f7e: 0xfc79, 0x1f7f: 0xfc79, + // Block 0x7e, offset 0x1f80 + 0x1f80: 0xfc99, 0x1f81: 0x96dd, 0x1f82: 0xfcb9, 0x1f83: 0xfcd9, 0x1f84: 0xfcf9, 0x1f85: 0xfd19, + 0x1f86: 0xfd39, 0x1f87: 0xfd59, 0x1f88: 0xfd79, 0x1f89: 0x96fd, 0x1f8a: 0xfd99, 0x1f8b: 0xfdb9, + 0x1f8c: 0xfdd9, 0x1f8d: 0xfdf9, 0x1f8e: 0xfe19, 0x1f8f: 0xfe39, 0x1f90: 0x971d, 0x1f91: 0xfe59, + 0x1f92: 0x973d, 0x1f93: 0x975d, 0x1f94: 0x977d, 0x1f95: 0xfe79, 0x1f96: 0xfe99, 0x1f97: 0xfeb9, + 0x1f98: 0xfed9, 0x1f99: 0xfef9, 0x1f9a: 0xff19, 0x1f9b: 0xff39, 0x1f9c: 0xff59, 0x1f9d: 0x979d, + 0x1f9e: 0x0040, 0x1f9f: 0x0040, 0x1fa0: 0x0040, 0x1fa1: 0x0040, 0x1fa2: 0x0040, 0x1fa3: 0x0040, + 0x1fa4: 0x0040, 0x1fa5: 0x0040, 0x1fa6: 0x0040, 0x1fa7: 0x0040, 0x1fa8: 0x0040, 0x1fa9: 0x0040, + 0x1faa: 0x0040, 0x1fab: 0x0040, 0x1fac: 0x0040, 0x1fad: 0x0040, 0x1fae: 0x0040, 0x1faf: 0x0040, + 0x1fb0: 0x0040, 0x1fb1: 0x0040, 0x1fb2: 0x0040, 0x1fb3: 0x0040, 0x1fb4: 0x0040, 0x1fb5: 0x0040, + 0x1fb6: 0x0040, 0x1fb7: 0x0040, 0x1fb8: 0x0040, 0x1fb9: 0x0040, 0x1fba: 0x0040, 0x1fbb: 0x0040, + 0x1fbc: 0x0040, 0x1fbd: 0x0040, 0x1fbe: 0x0040, 0x1fbf: 0x0040, +} + +// idnaIndex: 36 blocks, 2304 entries, 4608 bytes +// Block 0 is the zero block. +var idnaIndex = [2304]uint16{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x01, 0xc3: 0x7d, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x04, 0xc7: 0x05, + 0xc8: 0x06, 0xc9: 0x7e, 0xca: 0x7f, 0xcb: 0x07, 0xcc: 0x80, 0xcd: 0x08, 0xce: 0x09, 0xcf: 0x0a, + 0xd0: 0x81, 0xd1: 0x0b, 0xd2: 0x0c, 0xd3: 0x0d, 0xd4: 0x0e, 0xd5: 0x82, 0xd6: 0x83, 0xd7: 0x84, + 0xd8: 0x0f, 0xd9: 0x10, 0xda: 0x85, 0xdb: 0x11, 0xdc: 0x12, 0xdd: 0x86, 0xde: 0x87, 0xdf: 0x88, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06, 0xe5: 0x07, 0xe6: 0x07, 0xe7: 0x07, + 0xe8: 0x07, 0xe9: 0x08, 0xea: 0x09, 0xeb: 0x07, 0xec: 0x07, 0xed: 0x0a, 0xee: 0x0b, 0xef: 0x0c, + 0xf0: 0x1d, 0xf1: 0x1e, 0xf2: 0x1e, 0xf3: 0x20, 0xf4: 0x21, + // Block 0x4, offset 0x100 + 0x120: 0x89, 0x121: 0x13, 0x122: 0x8a, 0x123: 0x8b, 0x124: 0x8c, 0x125: 0x14, 0x126: 0x15, 0x127: 0x16, + 0x128: 0x17, 0x129: 0x18, 0x12a: 0x19, 0x12b: 0x1a, 0x12c: 0x1b, 0x12d: 0x1c, 0x12e: 0x1d, 0x12f: 0x8d, + 0x130: 0x8e, 0x131: 0x1e, 0x132: 0x1f, 0x133: 0x20, 0x134: 0x8f, 0x135: 0x21, 0x136: 0x90, 0x137: 0x91, + 0x138: 0x92, 0x139: 0x93, 0x13a: 0x22, 0x13b: 0x94, 0x13c: 0x95, 0x13d: 0x23, 0x13e: 0x24, 0x13f: 0x96, + // Block 0x5, offset 0x140 + 0x140: 0x97, 0x141: 0x98, 0x142: 0x99, 0x143: 0x9a, 0x144: 0x9b, 0x145: 0x9c, 0x146: 0x9d, 0x147: 0x9e, + 0x148: 0x9f, 0x149: 0xa0, 0x14a: 0xa1, 0x14b: 0xa2, 0x14c: 0xa3, 0x14d: 0xa4, 0x14e: 0xa5, 0x14f: 0xa6, + 0x150: 0xa7, 0x151: 0x9f, 0x152: 0x9f, 0x153: 0x9f, 0x154: 0x9f, 0x155: 0x9f, 0x156: 0x9f, 0x157: 0x9f, + 0x158: 0x9f, 0x159: 0xa8, 0x15a: 0xa9, 0x15b: 0xaa, 0x15c: 0xab, 0x15d: 0xac, 0x15e: 0xad, 0x15f: 0xae, + 0x160: 0xaf, 0x161: 0xb0, 0x162: 0xb1, 0x163: 0xb2, 0x164: 0xb3, 0x165: 0xb4, 0x166: 0xb5, 0x167: 0xb6, + 0x168: 0xb7, 0x169: 0xb8, 0x16a: 0xb9, 0x16b: 0xba, 0x16c: 0xbb, 0x16d: 0xbc, 0x16e: 0xbd, 0x16f: 0xbe, + 0x170: 0xbf, 0x171: 0xc0, 0x172: 0xc1, 0x173: 0xc2, 0x174: 0x25, 0x175: 0x26, 0x176: 0x27, 0x177: 0xc3, + 0x178: 0x28, 0x179: 0x28, 0x17a: 0x29, 0x17b: 0x28, 0x17c: 0xc4, 0x17d: 0x2a, 0x17e: 0x2b, 0x17f: 0x2c, + // Block 0x6, offset 0x180 + 0x180: 0x2d, 0x181: 0x2e, 0x182: 0x2f, 0x183: 0xc5, 0x184: 0x30, 0x185: 0x31, 0x186: 0xc6, 0x187: 0x9b, + 0x188: 0xc7, 0x189: 0xc8, 0x18a: 0x9b, 0x18b: 0x9b, 0x18c: 0xc9, 0x18d: 0x9b, 0x18e: 0x9b, 0x18f: 0x9b, + 0x190: 0xca, 0x191: 0x32, 0x192: 0x33, 0x193: 0x34, 0x194: 0x9b, 0x195: 0x9b, 0x196: 0x9b, 0x197: 0x9b, + 0x198: 0x9b, 0x199: 0x9b, 0x19a: 0x9b, 0x19b: 0x9b, 0x19c: 0x9b, 0x19d: 0x9b, 0x19e: 0x9b, 0x19f: 0x9b, + 0x1a0: 0x9b, 0x1a1: 0x9b, 0x1a2: 0x9b, 0x1a3: 0x9b, 0x1a4: 0x9b, 0x1a5: 0x9b, 0x1a6: 0x9b, 0x1a7: 0x9b, + 0x1a8: 0xcb, 0x1a9: 0xcc, 0x1aa: 0x9b, 0x1ab: 0xcd, 0x1ac: 0x9b, 0x1ad: 0xce, 0x1ae: 0xcf, 0x1af: 0xd0, + 0x1b0: 0xd1, 0x1b1: 0x35, 0x1b2: 0x28, 0x1b3: 0x36, 0x1b4: 0xd2, 0x1b5: 0xd3, 0x1b6: 0xd4, 0x1b7: 0xd5, + 0x1b8: 0xd6, 0x1b9: 0xd7, 0x1ba: 0xd8, 0x1bb: 0xd9, 0x1bc: 0xda, 0x1bd: 0xdb, 0x1be: 0xdc, 0x1bf: 0x37, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x38, 0x1c1: 0xdd, 0x1c2: 0xde, 0x1c3: 0xdf, 0x1c4: 0xe0, 0x1c5: 0x39, 0x1c6: 0x3a, 0x1c7: 0xe1, + 0x1c8: 0xe2, 0x1c9: 0x3b, 0x1ca: 0x3c, 0x1cb: 0x3d, 0x1cc: 0x3e, 0x1cd: 0x3f, 0x1ce: 0x40, 0x1cf: 0x41, + 0x1d0: 0x9f, 0x1d1: 0x9f, 0x1d2: 0x9f, 0x1d3: 0x9f, 0x1d4: 0x9f, 0x1d5: 0x9f, 0x1d6: 0x9f, 0x1d7: 0x9f, + 0x1d8: 0x9f, 0x1d9: 0x9f, 0x1da: 0x9f, 0x1db: 0x9f, 0x1dc: 0x9f, 0x1dd: 0x9f, 0x1de: 0x9f, 0x1df: 0x9f, + 0x1e0: 0x9f, 0x1e1: 0x9f, 0x1e2: 0x9f, 0x1e3: 0x9f, 0x1e4: 0x9f, 0x1e5: 0x9f, 0x1e6: 0x9f, 0x1e7: 0x9f, + 0x1e8: 0x9f, 0x1e9: 0x9f, 0x1ea: 0x9f, 0x1eb: 0x9f, 0x1ec: 0x9f, 0x1ed: 0x9f, 0x1ee: 0x9f, 0x1ef: 0x9f, + 0x1f0: 0x9f, 0x1f1: 0x9f, 0x1f2: 0x9f, 0x1f3: 0x9f, 0x1f4: 0x9f, 0x1f5: 0x9f, 0x1f6: 0x9f, 0x1f7: 0x9f, + 0x1f8: 0x9f, 0x1f9: 0x9f, 0x1fa: 0x9f, 0x1fb: 0x9f, 0x1fc: 0x9f, 0x1fd: 0x9f, 0x1fe: 0x9f, 0x1ff: 0x9f, + // Block 0x8, offset 0x200 + 0x200: 0x9f, 0x201: 0x9f, 0x202: 0x9f, 0x203: 0x9f, 0x204: 0x9f, 0x205: 0x9f, 0x206: 0x9f, 0x207: 0x9f, + 0x208: 0x9f, 0x209: 0x9f, 0x20a: 0x9f, 0x20b: 0x9f, 0x20c: 0x9f, 0x20d: 0x9f, 0x20e: 0x9f, 0x20f: 0x9f, + 0x210: 0x9f, 0x211: 0x9f, 0x212: 0x9f, 0x213: 0x9f, 0x214: 0x9f, 0x215: 0x9f, 0x216: 0x9f, 0x217: 0x9f, + 0x218: 0x9f, 0x219: 0x9f, 0x21a: 0x9f, 0x21b: 0x9f, 0x21c: 0x9f, 0x21d: 0x9f, 0x21e: 0x9f, 0x21f: 0x9f, + 0x220: 0x9f, 0x221: 0x9f, 0x222: 0x9f, 0x223: 0x9f, 0x224: 0x9f, 0x225: 0x9f, 0x226: 0x9f, 0x227: 0x9f, + 0x228: 0x9f, 0x229: 0x9f, 0x22a: 0x9f, 0x22b: 0x9f, 0x22c: 0x9f, 0x22d: 0x9f, 0x22e: 0x9f, 0x22f: 0x9f, + 0x230: 0x9f, 0x231: 0x9f, 0x232: 0x9f, 0x233: 0x9f, 0x234: 0x9f, 0x235: 0x9f, 0x236: 0xb2, 0x237: 0x9b, + 0x238: 0x9f, 0x239: 0x9f, 0x23a: 0x9f, 0x23b: 0x9f, 0x23c: 0x9f, 0x23d: 0x9f, 0x23e: 0x9f, 0x23f: 0x9f, + // Block 0x9, offset 0x240 + 0x240: 0x9f, 0x241: 0x9f, 0x242: 0x9f, 0x243: 0x9f, 0x244: 0x9f, 0x245: 0x9f, 0x246: 0x9f, 0x247: 0x9f, + 0x248: 0x9f, 0x249: 0x9f, 0x24a: 0x9f, 0x24b: 0x9f, 0x24c: 0x9f, 0x24d: 0x9f, 0x24e: 0x9f, 0x24f: 0x9f, + 0x250: 0x9f, 0x251: 0x9f, 0x252: 0x9f, 0x253: 0x9f, 0x254: 0x9f, 0x255: 0x9f, 0x256: 0x9f, 0x257: 0x9f, + 0x258: 0x9f, 0x259: 0x9f, 0x25a: 0x9f, 0x25b: 0x9f, 0x25c: 0x9f, 0x25d: 0x9f, 0x25e: 0x9f, 0x25f: 0x9f, + 0x260: 0x9f, 0x261: 0x9f, 0x262: 0x9f, 0x263: 0x9f, 0x264: 0x9f, 0x265: 0x9f, 0x266: 0x9f, 0x267: 0x9f, + 0x268: 0x9f, 0x269: 0x9f, 0x26a: 0x9f, 0x26b: 0x9f, 0x26c: 0x9f, 0x26d: 0x9f, 0x26e: 0x9f, 0x26f: 0x9f, + 0x270: 0x9f, 0x271: 0x9f, 0x272: 0x9f, 0x273: 0x9f, 0x274: 0x9f, 0x275: 0x9f, 0x276: 0x9f, 0x277: 0x9f, + 0x278: 0x9f, 0x279: 0x9f, 0x27a: 0x9f, 0x27b: 0x9f, 0x27c: 0x9f, 0x27d: 0x9f, 0x27e: 0x9f, 0x27f: 0x9f, + // Block 0xa, offset 0x280 + 0x280: 0x9f, 0x281: 0x9f, 0x282: 0x9f, 0x283: 0x9f, 0x284: 0x9f, 0x285: 0x9f, 0x286: 0x9f, 0x287: 0x9f, + 0x288: 0x9f, 0x289: 0x9f, 0x28a: 0x9f, 0x28b: 0x9f, 0x28c: 0x9f, 0x28d: 0x9f, 0x28e: 0x9f, 0x28f: 0x9f, + 0x290: 0x9f, 0x291: 0x9f, 0x292: 0x9f, 0x293: 0x9f, 0x294: 0x9f, 0x295: 0x9f, 0x296: 0x9f, 0x297: 0x9f, + 0x298: 0x9f, 0x299: 0x9f, 0x29a: 0x9f, 0x29b: 0x9f, 0x29c: 0x9f, 0x29d: 0x9f, 0x29e: 0x9f, 0x29f: 0x9f, + 0x2a0: 0x9f, 0x2a1: 0x9f, 0x2a2: 0x9f, 0x2a3: 0x9f, 0x2a4: 0x9f, 0x2a5: 0x9f, 0x2a6: 0x9f, 0x2a7: 0x9f, + 0x2a8: 0x9f, 0x2a9: 0x9f, 0x2aa: 0x9f, 0x2ab: 0x9f, 0x2ac: 0x9f, 0x2ad: 0x9f, 0x2ae: 0x9f, 0x2af: 0x9f, + 0x2b0: 0x9f, 0x2b1: 0x9f, 0x2b2: 0x9f, 0x2b3: 0x9f, 0x2b4: 0x9f, 0x2b5: 0x9f, 0x2b6: 0x9f, 0x2b7: 0x9f, + 0x2b8: 0x9f, 0x2b9: 0x9f, 0x2ba: 0x9f, 0x2bb: 0x9f, 0x2bc: 0x9f, 0x2bd: 0x9f, 0x2be: 0x9f, 0x2bf: 0xe3, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x9f, 0x2c1: 0x9f, 0x2c2: 0x9f, 0x2c3: 0x9f, 0x2c4: 0x9f, 0x2c5: 0x9f, 0x2c6: 0x9f, 0x2c7: 0x9f, + 0x2c8: 0x9f, 0x2c9: 0x9f, 0x2ca: 0x9f, 0x2cb: 0x9f, 0x2cc: 0x9f, 0x2cd: 0x9f, 0x2ce: 0x9f, 0x2cf: 0x9f, + 0x2d0: 0x9f, 0x2d1: 0x9f, 0x2d2: 0xe4, 0x2d3: 0xe5, 0x2d4: 0x9f, 0x2d5: 0x9f, 0x2d6: 0x9f, 0x2d7: 0x9f, + 0x2d8: 0xe6, 0x2d9: 0x42, 0x2da: 0x43, 0x2db: 0xe7, 0x2dc: 0x44, 0x2dd: 0x45, 0x2de: 0x46, 0x2df: 0xe8, + 0x2e0: 0xe9, 0x2e1: 0xea, 0x2e2: 0xeb, 0x2e3: 0xec, 0x2e4: 0xed, 0x2e5: 0xee, 0x2e6: 0xef, 0x2e7: 0xf0, + 0x2e8: 0xf1, 0x2e9: 0xf2, 0x2ea: 0xf3, 0x2eb: 0xf4, 0x2ec: 0xf5, 0x2ed: 0xf6, 0x2ee: 0xf7, 0x2ef: 0xf8, + 0x2f0: 0x9f, 0x2f1: 0x9f, 0x2f2: 0x9f, 0x2f3: 0x9f, 0x2f4: 0x9f, 0x2f5: 0x9f, 0x2f6: 0x9f, 0x2f7: 0x9f, + 0x2f8: 0x9f, 0x2f9: 0x9f, 0x2fa: 0x9f, 0x2fb: 0x9f, 0x2fc: 0x9f, 0x2fd: 0x9f, 0x2fe: 0x9f, 0x2ff: 0x9f, + // Block 0xc, offset 0x300 + 0x300: 0x9f, 0x301: 0x9f, 0x302: 0x9f, 0x303: 0x9f, 0x304: 0x9f, 0x305: 0x9f, 0x306: 0x9f, 0x307: 0x9f, + 0x308: 0x9f, 0x309: 0x9f, 0x30a: 0x9f, 0x30b: 0x9f, 0x30c: 0x9f, 0x30d: 0x9f, 0x30e: 0x9f, 0x30f: 0x9f, + 0x310: 0x9f, 0x311: 0x9f, 0x312: 0x9f, 0x313: 0x9f, 0x314: 0x9f, 0x315: 0x9f, 0x316: 0x9f, 0x317: 0x9f, + 0x318: 0x9f, 0x319: 0x9f, 0x31a: 0x9f, 0x31b: 0x9f, 0x31c: 0x9f, 0x31d: 0x9f, 0x31e: 0xf9, 0x31f: 0xfa, + // Block 0xd, offset 0x340 + 0x340: 0xba, 0x341: 0xba, 0x342: 0xba, 0x343: 0xba, 0x344: 0xba, 0x345: 0xba, 0x346: 0xba, 0x347: 0xba, + 0x348: 0xba, 0x349: 0xba, 0x34a: 0xba, 0x34b: 0xba, 0x34c: 0xba, 0x34d: 0xba, 0x34e: 0xba, 0x34f: 0xba, + 0x350: 0xba, 0x351: 0xba, 0x352: 0xba, 0x353: 0xba, 0x354: 0xba, 0x355: 0xba, 0x356: 0xba, 0x357: 0xba, + 0x358: 0xba, 0x359: 0xba, 0x35a: 0xba, 0x35b: 0xba, 0x35c: 0xba, 0x35d: 0xba, 0x35e: 0xba, 0x35f: 0xba, + 0x360: 0xba, 0x361: 0xba, 0x362: 0xba, 0x363: 0xba, 0x364: 0xba, 0x365: 0xba, 0x366: 0xba, 0x367: 0xba, + 0x368: 0xba, 0x369: 0xba, 0x36a: 0xba, 0x36b: 0xba, 0x36c: 0xba, 0x36d: 0xba, 0x36e: 0xba, 0x36f: 0xba, + 0x370: 0xba, 0x371: 0xba, 0x372: 0xba, 0x373: 0xba, 0x374: 0xba, 0x375: 0xba, 0x376: 0xba, 0x377: 0xba, + 0x378: 0xba, 0x379: 0xba, 0x37a: 0xba, 0x37b: 0xba, 0x37c: 0xba, 0x37d: 0xba, 0x37e: 0xba, 0x37f: 0xba, + // Block 0xe, offset 0x380 + 0x380: 0xba, 0x381: 0xba, 0x382: 0xba, 0x383: 0xba, 0x384: 0xba, 0x385: 0xba, 0x386: 0xba, 0x387: 0xba, + 0x388: 0xba, 0x389: 0xba, 0x38a: 0xba, 0x38b: 0xba, 0x38c: 0xba, 0x38d: 0xba, 0x38e: 0xba, 0x38f: 0xba, + 0x390: 0xba, 0x391: 0xba, 0x392: 0xba, 0x393: 0xba, 0x394: 0xba, 0x395: 0xba, 0x396: 0xba, 0x397: 0xba, + 0x398: 0xba, 0x399: 0xba, 0x39a: 0xba, 0x39b: 0xba, 0x39c: 0xba, 0x39d: 0xba, 0x39e: 0xba, 0x39f: 0xba, + 0x3a0: 0xba, 0x3a1: 0xba, 0x3a2: 0xba, 0x3a3: 0xba, 0x3a4: 0xfb, 0x3a5: 0xfc, 0x3a6: 0xfd, 0x3a7: 0xfe, + 0x3a8: 0x47, 0x3a9: 0xff, 0x3aa: 0x100, 0x3ab: 0x48, 0x3ac: 0x49, 0x3ad: 0x4a, 0x3ae: 0x4b, 0x3af: 0x4c, + 0x3b0: 0x101, 0x3b1: 0x4d, 0x3b2: 0x4e, 0x3b3: 0x4f, 0x3b4: 0x50, 0x3b5: 0x51, 0x3b6: 0x102, 0x3b7: 0x52, + 0x3b8: 0x53, 0x3b9: 0x54, 0x3ba: 0x55, 0x3bb: 0x56, 0x3bc: 0x57, 0x3bd: 0x58, 0x3be: 0x59, 0x3bf: 0x5a, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x103, 0x3c1: 0x104, 0x3c2: 0x9f, 0x3c3: 0x105, 0x3c4: 0x106, 0x3c5: 0x9b, 0x3c6: 0x107, 0x3c7: 0x108, + 0x3c8: 0xba, 0x3c9: 0xba, 0x3ca: 0x109, 0x3cb: 0x10a, 0x3cc: 0x10b, 0x3cd: 0x10c, 0x3ce: 0x10d, 0x3cf: 0x10e, + 0x3d0: 0x10f, 0x3d1: 0x9f, 0x3d2: 0x110, 0x3d3: 0x111, 0x3d4: 0x112, 0x3d5: 0x113, 0x3d6: 0xba, 0x3d7: 0xba, + 0x3d8: 0x9f, 0x3d9: 0x9f, 0x3da: 0x9f, 0x3db: 0x9f, 0x3dc: 0x114, 0x3dd: 0x115, 0x3de: 0xba, 0x3df: 0xba, + 0x3e0: 0x116, 0x3e1: 0x117, 0x3e2: 0x118, 0x3e3: 0x119, 0x3e4: 0x11a, 0x3e5: 0xba, 0x3e6: 0x11b, 0x3e7: 0x11c, + 0x3e8: 0x11d, 0x3e9: 0x11e, 0x3ea: 0x11f, 0x3eb: 0x5b, 0x3ec: 0x120, 0x3ed: 0x121, 0x3ee: 0x5c, 0x3ef: 0xba, + 0x3f0: 0x122, 0x3f1: 0x123, 0x3f2: 0x124, 0x3f3: 0x125, 0x3f4: 0xba, 0x3f5: 0xba, 0x3f6: 0xba, 0x3f7: 0xba, + 0x3f8: 0xba, 0x3f9: 0x126, 0x3fa: 0xba, 0x3fb: 0xba, 0x3fc: 0xba, 0x3fd: 0xba, 0x3fe: 0xba, 0x3ff: 0xba, + // Block 0x10, offset 0x400 + 0x400: 0x127, 0x401: 0x128, 0x402: 0x129, 0x403: 0x12a, 0x404: 0x12b, 0x405: 0x12c, 0x406: 0x12d, 0x407: 0x12e, + 0x408: 0x12f, 0x409: 0xba, 0x40a: 0x130, 0x40b: 0x131, 0x40c: 0x5d, 0x40d: 0x5e, 0x40e: 0xba, 0x40f: 0xba, + 0x410: 0x132, 0x411: 0x133, 0x412: 0x134, 0x413: 0x135, 0x414: 0xba, 0x415: 0xba, 0x416: 0x136, 0x417: 0x137, + 0x418: 0x138, 0x419: 0x139, 0x41a: 0x13a, 0x41b: 0x13b, 0x41c: 0x13c, 0x41d: 0xba, 0x41e: 0xba, 0x41f: 0xba, + 0x420: 0xba, 0x421: 0xba, 0x422: 0x13d, 0x423: 0x13e, 0x424: 0xba, 0x425: 0xba, 0x426: 0xba, 0x427: 0xba, + 0x428: 0x13f, 0x429: 0x140, 0x42a: 0x141, 0x42b: 0x142, 0x42c: 0xba, 0x42d: 0xba, 0x42e: 0xba, 0x42f: 0xba, + 0x430: 0x143, 0x431: 0x144, 0x432: 0x145, 0x433: 0xba, 0x434: 0x146, 0x435: 0x147, 0x436: 0xba, 0x437: 0xba, + 0x438: 0xba, 0x439: 0xba, 0x43a: 0xba, 0x43b: 0xba, 0x43c: 0xba, 0x43d: 0xba, 0x43e: 0xba, 0x43f: 0xba, + // Block 0x11, offset 0x440 + 0x440: 0x9f, 0x441: 0x9f, 0x442: 0x9f, 0x443: 0x9f, 0x444: 0x9f, 0x445: 0x9f, 0x446: 0x9f, 0x447: 0x9f, + 0x448: 0x9f, 0x449: 0x9f, 0x44a: 0x9f, 0x44b: 0x9f, 0x44c: 0x9f, 0x44d: 0x9f, 0x44e: 0x148, 0x44f: 0xba, + 0x450: 0x9b, 0x451: 0x149, 0x452: 0x9f, 0x453: 0x9f, 0x454: 0x9f, 0x455: 0x14a, 0x456: 0xba, 0x457: 0xba, + 0x458: 0xba, 0x459: 0xba, 0x45a: 0xba, 0x45b: 0xba, 0x45c: 0xba, 0x45d: 0xba, 0x45e: 0xba, 0x45f: 0xba, + 0x460: 0xba, 0x461: 0xba, 0x462: 0xba, 0x463: 0xba, 0x464: 0xba, 0x465: 0xba, 0x466: 0xba, 0x467: 0xba, + 0x468: 0xba, 0x469: 0xba, 0x46a: 0xba, 0x46b: 0xba, 0x46c: 0xba, 0x46d: 0xba, 0x46e: 0xba, 0x46f: 0xba, + 0x470: 0xba, 0x471: 0xba, 0x472: 0xba, 0x473: 0xba, 0x474: 0xba, 0x475: 0xba, 0x476: 0xba, 0x477: 0xba, + 0x478: 0xba, 0x479: 0xba, 0x47a: 0xba, 0x47b: 0xba, 0x47c: 0xba, 0x47d: 0xba, 0x47e: 0xba, 0x47f: 0xba, + // Block 0x12, offset 0x480 + 0x480: 0x9f, 0x481: 0x9f, 0x482: 0x9f, 0x483: 0x9f, 0x484: 0x9f, 0x485: 0x9f, 0x486: 0x9f, 0x487: 0x9f, + 0x488: 0x9f, 0x489: 0x9f, 0x48a: 0x9f, 0x48b: 0x9f, 0x48c: 0x9f, 0x48d: 0x9f, 0x48e: 0x9f, 0x48f: 0x9f, + 0x490: 0x14b, 0x491: 0xba, 0x492: 0xba, 0x493: 0xba, 0x494: 0xba, 0x495: 0xba, 0x496: 0xba, 0x497: 0xba, + 0x498: 0xba, 0x499: 0xba, 0x49a: 0xba, 0x49b: 0xba, 0x49c: 0xba, 0x49d: 0xba, 0x49e: 0xba, 0x49f: 0xba, + 0x4a0: 0xba, 0x4a1: 0xba, 0x4a2: 0xba, 0x4a3: 0xba, 0x4a4: 0xba, 0x4a5: 0xba, 0x4a6: 0xba, 0x4a7: 0xba, + 0x4a8: 0xba, 0x4a9: 0xba, 0x4aa: 0xba, 0x4ab: 0xba, 0x4ac: 0xba, 0x4ad: 0xba, 0x4ae: 0xba, 0x4af: 0xba, + 0x4b0: 0xba, 0x4b1: 0xba, 0x4b2: 0xba, 0x4b3: 0xba, 0x4b4: 0xba, 0x4b5: 0xba, 0x4b6: 0xba, 0x4b7: 0xba, + 0x4b8: 0xba, 0x4b9: 0xba, 0x4ba: 0xba, 0x4bb: 0xba, 0x4bc: 0xba, 0x4bd: 0xba, 0x4be: 0xba, 0x4bf: 0xba, + // Block 0x13, offset 0x4c0 + 0x4c0: 0xba, 0x4c1: 0xba, 0x4c2: 0xba, 0x4c3: 0xba, 0x4c4: 0xba, 0x4c5: 0xba, 0x4c6: 0xba, 0x4c7: 0xba, + 0x4c8: 0xba, 0x4c9: 0xba, 0x4ca: 0xba, 0x4cb: 0xba, 0x4cc: 0xba, 0x4cd: 0xba, 0x4ce: 0xba, 0x4cf: 0xba, + 0x4d0: 0x9f, 0x4d1: 0x9f, 0x4d2: 0x9f, 0x4d3: 0x9f, 0x4d4: 0x9f, 0x4d5: 0x9f, 0x4d6: 0x9f, 0x4d7: 0x9f, + 0x4d8: 0x9f, 0x4d9: 0x14c, 0x4da: 0xba, 0x4db: 0xba, 0x4dc: 0xba, 0x4dd: 0xba, 0x4de: 0xba, 0x4df: 0xba, + 0x4e0: 0xba, 0x4e1: 0xba, 0x4e2: 0xba, 0x4e3: 0xba, 0x4e4: 0xba, 0x4e5: 0xba, 0x4e6: 0xba, 0x4e7: 0xba, + 0x4e8: 0xba, 0x4e9: 0xba, 0x4ea: 0xba, 0x4eb: 0xba, 0x4ec: 0xba, 0x4ed: 0xba, 0x4ee: 0xba, 0x4ef: 0xba, + 0x4f0: 0xba, 0x4f1: 0xba, 0x4f2: 0xba, 0x4f3: 0xba, 0x4f4: 0xba, 0x4f5: 0xba, 0x4f6: 0xba, 0x4f7: 0xba, + 0x4f8: 0xba, 0x4f9: 0xba, 0x4fa: 0xba, 0x4fb: 0xba, 0x4fc: 0xba, 0x4fd: 0xba, 0x4fe: 0xba, 0x4ff: 0xba, + // Block 0x14, offset 0x500 + 0x500: 0xba, 0x501: 0xba, 0x502: 0xba, 0x503: 0xba, 0x504: 0xba, 0x505: 0xba, 0x506: 0xba, 0x507: 0xba, + 0x508: 0xba, 0x509: 0xba, 0x50a: 0xba, 0x50b: 0xba, 0x50c: 0xba, 0x50d: 0xba, 0x50e: 0xba, 0x50f: 0xba, + 0x510: 0xba, 0x511: 0xba, 0x512: 0xba, 0x513: 0xba, 0x514: 0xba, 0x515: 0xba, 0x516: 0xba, 0x517: 0xba, + 0x518: 0xba, 0x519: 0xba, 0x51a: 0xba, 0x51b: 0xba, 0x51c: 0xba, 0x51d: 0xba, 0x51e: 0xba, 0x51f: 0xba, + 0x520: 0x9f, 0x521: 0x9f, 0x522: 0x9f, 0x523: 0x9f, 0x524: 0x9f, 0x525: 0x9f, 0x526: 0x9f, 0x527: 0x9f, + 0x528: 0x142, 0x529: 0x14d, 0x52a: 0xba, 0x52b: 0x14e, 0x52c: 0x14f, 0x52d: 0x150, 0x52e: 0x151, 0x52f: 0xba, + 0x530: 0xba, 0x531: 0xba, 0x532: 0xba, 0x533: 0xba, 0x534: 0xba, 0x535: 0xba, 0x536: 0xba, 0x537: 0xba, + 0x538: 0xba, 0x539: 0xba, 0x53a: 0xba, 0x53b: 0xba, 0x53c: 0x9f, 0x53d: 0x152, 0x53e: 0x153, 0x53f: 0x154, + // Block 0x15, offset 0x540 + 0x540: 0x9f, 0x541: 0x9f, 0x542: 0x9f, 0x543: 0x9f, 0x544: 0x9f, 0x545: 0x9f, 0x546: 0x9f, 0x547: 0x9f, + 0x548: 0x9f, 0x549: 0x9f, 0x54a: 0x9f, 0x54b: 0x9f, 0x54c: 0x9f, 0x54d: 0x9f, 0x54e: 0x9f, 0x54f: 0x9f, + 0x550: 0x9f, 0x551: 0x9f, 0x552: 0x9f, 0x553: 0x9f, 0x554: 0x9f, 0x555: 0x9f, 0x556: 0x9f, 0x557: 0x9f, + 0x558: 0x9f, 0x559: 0x9f, 0x55a: 0x9f, 0x55b: 0x9f, 0x55c: 0x9f, 0x55d: 0x9f, 0x55e: 0x9f, 0x55f: 0x155, + 0x560: 0x9f, 0x561: 0x9f, 0x562: 0x9f, 0x563: 0x9f, 0x564: 0x9f, 0x565: 0x9f, 0x566: 0x9f, 0x567: 0x9f, + 0x568: 0x9f, 0x569: 0x9f, 0x56a: 0x9f, 0x56b: 0x156, 0x56c: 0xba, 0x56d: 0xba, 0x56e: 0xba, 0x56f: 0xba, + 0x570: 0xba, 0x571: 0xba, 0x572: 0xba, 0x573: 0xba, 0x574: 0xba, 0x575: 0xba, 0x576: 0xba, 0x577: 0xba, + 0x578: 0xba, 0x579: 0xba, 0x57a: 0xba, 0x57b: 0xba, 0x57c: 0xba, 0x57d: 0xba, 0x57e: 0xba, 0x57f: 0xba, + // Block 0x16, offset 0x580 + 0x580: 0x9f, 0x581: 0x9f, 0x582: 0x9f, 0x583: 0x9f, 0x584: 0x157, 0x585: 0x158, 0x586: 0x9f, 0x587: 0x9f, + 0x588: 0x9f, 0x589: 0x9f, 0x58a: 0x9f, 0x58b: 0x159, 0x58c: 0xba, 0x58d: 0xba, 0x58e: 0xba, 0x58f: 0xba, + 0x590: 0xba, 0x591: 0xba, 0x592: 0xba, 0x593: 0xba, 0x594: 0xba, 0x595: 0xba, 0x596: 0xba, 0x597: 0xba, + 0x598: 0xba, 0x599: 0xba, 0x59a: 0xba, 0x59b: 0xba, 0x59c: 0xba, 0x59d: 0xba, 0x59e: 0xba, 0x59f: 0xba, + 0x5a0: 0xba, 0x5a1: 0xba, 0x5a2: 0xba, 0x5a3: 0xba, 0x5a4: 0xba, 0x5a5: 0xba, 0x5a6: 0xba, 0x5a7: 0xba, + 0x5a8: 0xba, 0x5a9: 0xba, 0x5aa: 0xba, 0x5ab: 0xba, 0x5ac: 0xba, 0x5ad: 0xba, 0x5ae: 0xba, 0x5af: 0xba, + 0x5b0: 0x9f, 0x5b1: 0x15a, 0x5b2: 0x15b, 0x5b3: 0xba, 0x5b4: 0xba, 0x5b5: 0xba, 0x5b6: 0xba, 0x5b7: 0xba, + 0x5b8: 0xba, 0x5b9: 0xba, 0x5ba: 0xba, 0x5bb: 0xba, 0x5bc: 0xba, 0x5bd: 0xba, 0x5be: 0xba, 0x5bf: 0xba, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x9b, 0x5c1: 0x9b, 0x5c2: 0x9b, 0x5c3: 0x15c, 0x5c4: 0x15d, 0x5c5: 0x15e, 0x5c6: 0x15f, 0x5c7: 0x160, + 0x5c8: 0x9b, 0x5c9: 0x161, 0x5ca: 0xba, 0x5cb: 0xba, 0x5cc: 0x9b, 0x5cd: 0x162, 0x5ce: 0xba, 0x5cf: 0xba, + 0x5d0: 0x5f, 0x5d1: 0x60, 0x5d2: 0x61, 0x5d3: 0x62, 0x5d4: 0x63, 0x5d5: 0x64, 0x5d6: 0x65, 0x5d7: 0x66, + 0x5d8: 0x67, 0x5d9: 0x68, 0x5da: 0x69, 0x5db: 0x6a, 0x5dc: 0x6b, 0x5dd: 0x6c, 0x5de: 0x6d, 0x5df: 0x6e, + 0x5e0: 0x9b, 0x5e1: 0x9b, 0x5e2: 0x9b, 0x5e3: 0x9b, 0x5e4: 0x9b, 0x5e5: 0x9b, 0x5e6: 0x9b, 0x5e7: 0x9b, + 0x5e8: 0x163, 0x5e9: 0x164, 0x5ea: 0x165, 0x5eb: 0xba, 0x5ec: 0xba, 0x5ed: 0xba, 0x5ee: 0xba, 0x5ef: 0xba, + 0x5f0: 0xba, 0x5f1: 0xba, 0x5f2: 0xba, 0x5f3: 0xba, 0x5f4: 0xba, 0x5f5: 0xba, 0x5f6: 0xba, 0x5f7: 0xba, + 0x5f8: 0xba, 0x5f9: 0xba, 0x5fa: 0xba, 0x5fb: 0xba, 0x5fc: 0xba, 0x5fd: 0xba, 0x5fe: 0xba, 0x5ff: 0xba, + // Block 0x18, offset 0x600 + 0x600: 0x166, 0x601: 0xba, 0x602: 0xba, 0x603: 0xba, 0x604: 0xba, 0x605: 0xba, 0x606: 0xba, 0x607: 0xba, + 0x608: 0xba, 0x609: 0xba, 0x60a: 0xba, 0x60b: 0xba, 0x60c: 0xba, 0x60d: 0xba, 0x60e: 0xba, 0x60f: 0xba, + 0x610: 0xba, 0x611: 0xba, 0x612: 0xba, 0x613: 0xba, 0x614: 0xba, 0x615: 0xba, 0x616: 0xba, 0x617: 0xba, + 0x618: 0xba, 0x619: 0xba, 0x61a: 0xba, 0x61b: 0xba, 0x61c: 0xba, 0x61d: 0xba, 0x61e: 0xba, 0x61f: 0xba, + 0x620: 0x122, 0x621: 0x122, 0x622: 0x122, 0x623: 0x167, 0x624: 0x6f, 0x625: 0x168, 0x626: 0xba, 0x627: 0xba, + 0x628: 0xba, 0x629: 0xba, 0x62a: 0xba, 0x62b: 0xba, 0x62c: 0xba, 0x62d: 0xba, 0x62e: 0xba, 0x62f: 0xba, + 0x630: 0xba, 0x631: 0xba, 0x632: 0xba, 0x633: 0xba, 0x634: 0xba, 0x635: 0xba, 0x636: 0xba, 0x637: 0xba, + 0x638: 0x70, 0x639: 0x71, 0x63a: 0x72, 0x63b: 0x169, 0x63c: 0xba, 0x63d: 0xba, 0x63e: 0xba, 0x63f: 0xba, + // Block 0x19, offset 0x640 + 0x640: 0x16a, 0x641: 0x9b, 0x642: 0x16b, 0x643: 0x16c, 0x644: 0x73, 0x645: 0x74, 0x646: 0x16d, 0x647: 0x16e, + 0x648: 0x75, 0x649: 0x16f, 0x64a: 0xba, 0x64b: 0xba, 0x64c: 0x9b, 0x64d: 0x9b, 0x64e: 0x9b, 0x64f: 0x9b, + 0x650: 0x9b, 0x651: 0x9b, 0x652: 0x9b, 0x653: 0x9b, 0x654: 0x9b, 0x655: 0x9b, 0x656: 0x9b, 0x657: 0x9b, + 0x658: 0x9b, 0x659: 0x9b, 0x65a: 0x9b, 0x65b: 0x170, 0x65c: 0x9b, 0x65d: 0x171, 0x65e: 0x9b, 0x65f: 0x172, + 0x660: 0x173, 0x661: 0x174, 0x662: 0x175, 0x663: 0xba, 0x664: 0x176, 0x665: 0x177, 0x666: 0x178, 0x667: 0x179, + 0x668: 0xba, 0x669: 0xba, 0x66a: 0xba, 0x66b: 0xba, 0x66c: 0xba, 0x66d: 0xba, 0x66e: 0xba, 0x66f: 0xba, + 0x670: 0xba, 0x671: 0xba, 0x672: 0xba, 0x673: 0xba, 0x674: 0xba, 0x675: 0xba, 0x676: 0xba, 0x677: 0xba, + 0x678: 0xba, 0x679: 0xba, 0x67a: 0xba, 0x67b: 0xba, 0x67c: 0xba, 0x67d: 0xba, 0x67e: 0xba, 0x67f: 0xba, + // Block 0x1a, offset 0x680 + 0x680: 0x9f, 0x681: 0x9f, 0x682: 0x9f, 0x683: 0x9f, 0x684: 0x9f, 0x685: 0x9f, 0x686: 0x9f, 0x687: 0x9f, + 0x688: 0x9f, 0x689: 0x9f, 0x68a: 0x9f, 0x68b: 0x9f, 0x68c: 0x9f, 0x68d: 0x9f, 0x68e: 0x9f, 0x68f: 0x9f, + 0x690: 0x9f, 0x691: 0x9f, 0x692: 0x9f, 0x693: 0x9f, 0x694: 0x9f, 0x695: 0x9f, 0x696: 0x9f, 0x697: 0x9f, + 0x698: 0x9f, 0x699: 0x9f, 0x69a: 0x9f, 0x69b: 0x17a, 0x69c: 0x9f, 0x69d: 0x9f, 0x69e: 0x9f, 0x69f: 0x9f, + 0x6a0: 0x9f, 0x6a1: 0x9f, 0x6a2: 0x9f, 0x6a3: 0x9f, 0x6a4: 0x9f, 0x6a5: 0x9f, 0x6a6: 0x9f, 0x6a7: 0x9f, + 0x6a8: 0x9f, 0x6a9: 0x9f, 0x6aa: 0x9f, 0x6ab: 0x9f, 0x6ac: 0x9f, 0x6ad: 0x9f, 0x6ae: 0x9f, 0x6af: 0x9f, + 0x6b0: 0x9f, 0x6b1: 0x9f, 0x6b2: 0x9f, 0x6b3: 0x9f, 0x6b4: 0x9f, 0x6b5: 0x9f, 0x6b6: 0x9f, 0x6b7: 0x9f, + 0x6b8: 0x9f, 0x6b9: 0x9f, 0x6ba: 0x9f, 0x6bb: 0x9f, 0x6bc: 0x9f, 0x6bd: 0x9f, 0x6be: 0x9f, 0x6bf: 0x9f, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0x9f, 0x6c1: 0x9f, 0x6c2: 0x9f, 0x6c3: 0x9f, 0x6c4: 0x9f, 0x6c5: 0x9f, 0x6c6: 0x9f, 0x6c7: 0x9f, + 0x6c8: 0x9f, 0x6c9: 0x9f, 0x6ca: 0x9f, 0x6cb: 0x9f, 0x6cc: 0x9f, 0x6cd: 0x9f, 0x6ce: 0x9f, 0x6cf: 0x9f, + 0x6d0: 0x9f, 0x6d1: 0x9f, 0x6d2: 0x9f, 0x6d3: 0x9f, 0x6d4: 0x9f, 0x6d5: 0x9f, 0x6d6: 0x9f, 0x6d7: 0x9f, + 0x6d8: 0x9f, 0x6d9: 0x9f, 0x6da: 0x9f, 0x6db: 0x9f, 0x6dc: 0x17b, 0x6dd: 0x9f, 0x6de: 0x9f, 0x6df: 0x9f, + 0x6e0: 0x17c, 0x6e1: 0x9f, 0x6e2: 0x9f, 0x6e3: 0x9f, 0x6e4: 0x9f, 0x6e5: 0x9f, 0x6e6: 0x9f, 0x6e7: 0x9f, + 0x6e8: 0x9f, 0x6e9: 0x9f, 0x6ea: 0x9f, 0x6eb: 0x9f, 0x6ec: 0x9f, 0x6ed: 0x9f, 0x6ee: 0x9f, 0x6ef: 0x9f, + 0x6f0: 0x9f, 0x6f1: 0x9f, 0x6f2: 0x9f, 0x6f3: 0x9f, 0x6f4: 0x9f, 0x6f5: 0x9f, 0x6f6: 0x9f, 0x6f7: 0x9f, + 0x6f8: 0x9f, 0x6f9: 0x9f, 0x6fa: 0x9f, 0x6fb: 0x9f, 0x6fc: 0x9f, 0x6fd: 0x9f, 0x6fe: 0x9f, 0x6ff: 0x9f, + // Block 0x1c, offset 0x700 + 0x700: 0x9f, 0x701: 0x9f, 0x702: 0x9f, 0x703: 0x9f, 0x704: 0x9f, 0x705: 0x9f, 0x706: 0x9f, 0x707: 0x9f, + 0x708: 0x9f, 0x709: 0x9f, 0x70a: 0x9f, 0x70b: 0x9f, 0x70c: 0x9f, 0x70d: 0x9f, 0x70e: 0x9f, 0x70f: 0x9f, + 0x710: 0x9f, 0x711: 0x9f, 0x712: 0x9f, 0x713: 0x9f, 0x714: 0x9f, 0x715: 0x9f, 0x716: 0x9f, 0x717: 0x9f, + 0x718: 0x9f, 0x719: 0x9f, 0x71a: 0x9f, 0x71b: 0x9f, 0x71c: 0x9f, 0x71d: 0x9f, 0x71e: 0x9f, 0x71f: 0x9f, + 0x720: 0x9f, 0x721: 0x9f, 0x722: 0x9f, 0x723: 0x9f, 0x724: 0x9f, 0x725: 0x9f, 0x726: 0x9f, 0x727: 0x9f, + 0x728: 0x9f, 0x729: 0x9f, 0x72a: 0x9f, 0x72b: 0x9f, 0x72c: 0x9f, 0x72d: 0x9f, 0x72e: 0x9f, 0x72f: 0x9f, + 0x730: 0x9f, 0x731: 0x9f, 0x732: 0x9f, 0x733: 0x9f, 0x734: 0x9f, 0x735: 0x9f, 0x736: 0x9f, 0x737: 0x9f, + 0x738: 0x9f, 0x739: 0x9f, 0x73a: 0x17d, 0x73b: 0x9f, 0x73c: 0x9f, 0x73d: 0x9f, 0x73e: 0x9f, 0x73f: 0x9f, + // Block 0x1d, offset 0x740 + 0x740: 0x9f, 0x741: 0x9f, 0x742: 0x9f, 0x743: 0x9f, 0x744: 0x9f, 0x745: 0x9f, 0x746: 0x9f, 0x747: 0x9f, + 0x748: 0x9f, 0x749: 0x9f, 0x74a: 0x9f, 0x74b: 0x9f, 0x74c: 0x9f, 0x74d: 0x9f, 0x74e: 0x9f, 0x74f: 0x9f, + 0x750: 0x9f, 0x751: 0x9f, 0x752: 0x9f, 0x753: 0x9f, 0x754: 0x9f, 0x755: 0x9f, 0x756: 0x9f, 0x757: 0x9f, + 0x758: 0x9f, 0x759: 0x9f, 0x75a: 0x9f, 0x75b: 0x9f, 0x75c: 0x9f, 0x75d: 0x9f, 0x75e: 0x9f, 0x75f: 0x9f, + 0x760: 0x9f, 0x761: 0x9f, 0x762: 0x9f, 0x763: 0x9f, 0x764: 0x9f, 0x765: 0x9f, 0x766: 0x9f, 0x767: 0x9f, + 0x768: 0x9f, 0x769: 0x9f, 0x76a: 0x9f, 0x76b: 0x9f, 0x76c: 0x9f, 0x76d: 0x9f, 0x76e: 0x9f, 0x76f: 0x17e, + 0x770: 0xba, 0x771: 0xba, 0x772: 0xba, 0x773: 0xba, 0x774: 0xba, 0x775: 0xba, 0x776: 0xba, 0x777: 0xba, + 0x778: 0xba, 0x779: 0xba, 0x77a: 0xba, 0x77b: 0xba, 0x77c: 0xba, 0x77d: 0xba, 0x77e: 0xba, 0x77f: 0xba, + // Block 0x1e, offset 0x780 + 0x780: 0xba, 0x781: 0xba, 0x782: 0xba, 0x783: 0xba, 0x784: 0xba, 0x785: 0xba, 0x786: 0xba, 0x787: 0xba, + 0x788: 0xba, 0x789: 0xba, 0x78a: 0xba, 0x78b: 0xba, 0x78c: 0xba, 0x78d: 0xba, 0x78e: 0xba, 0x78f: 0xba, + 0x790: 0xba, 0x791: 0xba, 0x792: 0xba, 0x793: 0xba, 0x794: 0xba, 0x795: 0xba, 0x796: 0xba, 0x797: 0xba, + 0x798: 0xba, 0x799: 0xba, 0x79a: 0xba, 0x79b: 0xba, 0x79c: 0xba, 0x79d: 0xba, 0x79e: 0xba, 0x79f: 0xba, + 0x7a0: 0x76, 0x7a1: 0x77, 0x7a2: 0x78, 0x7a3: 0x17f, 0x7a4: 0x79, 0x7a5: 0x7a, 0x7a6: 0x180, 0x7a7: 0x7b, + 0x7a8: 0x7c, 0x7a9: 0xba, 0x7aa: 0xba, 0x7ab: 0xba, 0x7ac: 0xba, 0x7ad: 0xba, 0x7ae: 0xba, 0x7af: 0xba, + 0x7b0: 0xba, 0x7b1: 0xba, 0x7b2: 0xba, 0x7b3: 0xba, 0x7b4: 0xba, 0x7b5: 0xba, 0x7b6: 0xba, 0x7b7: 0xba, + 0x7b8: 0xba, 0x7b9: 0xba, 0x7ba: 0xba, 0x7bb: 0xba, 0x7bc: 0xba, 0x7bd: 0xba, 0x7be: 0xba, 0x7bf: 0xba, + // Block 0x1f, offset 0x7c0 + 0x7d0: 0x0d, 0x7d1: 0x0e, 0x7d2: 0x0f, 0x7d3: 0x10, 0x7d4: 0x11, 0x7d5: 0x0b, 0x7d6: 0x12, 0x7d7: 0x07, + 0x7d8: 0x13, 0x7d9: 0x0b, 0x7da: 0x0b, 0x7db: 0x14, 0x7dc: 0x0b, 0x7dd: 0x15, 0x7de: 0x16, 0x7df: 0x17, + 0x7e0: 0x07, 0x7e1: 0x07, 0x7e2: 0x07, 0x7e3: 0x07, 0x7e4: 0x07, 0x7e5: 0x07, 0x7e6: 0x07, 0x7e7: 0x07, + 0x7e8: 0x07, 0x7e9: 0x07, 0x7ea: 0x18, 0x7eb: 0x19, 0x7ec: 0x1a, 0x7ed: 0x07, 0x7ee: 0x1b, 0x7ef: 0x1c, + 0x7f0: 0x0b, 0x7f1: 0x0b, 0x7f2: 0x0b, 0x7f3: 0x0b, 0x7f4: 0x0b, 0x7f5: 0x0b, 0x7f6: 0x0b, 0x7f7: 0x0b, + 0x7f8: 0x0b, 0x7f9: 0x0b, 0x7fa: 0x0b, 0x7fb: 0x0b, 0x7fc: 0x0b, 0x7fd: 0x0b, 0x7fe: 0x0b, 0x7ff: 0x0b, + // Block 0x20, offset 0x800 + 0x800: 0x0b, 0x801: 0x0b, 0x802: 0x0b, 0x803: 0x0b, 0x804: 0x0b, 0x805: 0x0b, 0x806: 0x0b, 0x807: 0x0b, + 0x808: 0x0b, 0x809: 0x0b, 0x80a: 0x0b, 0x80b: 0x0b, 0x80c: 0x0b, 0x80d: 0x0b, 0x80e: 0x0b, 0x80f: 0x0b, + 0x810: 0x0b, 0x811: 0x0b, 0x812: 0x0b, 0x813: 0x0b, 0x814: 0x0b, 0x815: 0x0b, 0x816: 0x0b, 0x817: 0x0b, + 0x818: 0x0b, 0x819: 0x0b, 0x81a: 0x0b, 0x81b: 0x0b, 0x81c: 0x0b, 0x81d: 0x0b, 0x81e: 0x0b, 0x81f: 0x0b, + 0x820: 0x0b, 0x821: 0x0b, 0x822: 0x0b, 0x823: 0x0b, 0x824: 0x0b, 0x825: 0x0b, 0x826: 0x0b, 0x827: 0x0b, + 0x828: 0x0b, 0x829: 0x0b, 0x82a: 0x0b, 0x82b: 0x0b, 0x82c: 0x0b, 0x82d: 0x0b, 0x82e: 0x0b, 0x82f: 0x0b, + 0x830: 0x0b, 0x831: 0x0b, 0x832: 0x0b, 0x833: 0x0b, 0x834: 0x0b, 0x835: 0x0b, 0x836: 0x0b, 0x837: 0x0b, + 0x838: 0x0b, 0x839: 0x0b, 0x83a: 0x0b, 0x83b: 0x0b, 0x83c: 0x0b, 0x83d: 0x0b, 0x83e: 0x0b, 0x83f: 0x0b, + // Block 0x21, offset 0x840 + 0x840: 0x181, 0x841: 0x182, 0x842: 0xba, 0x843: 0xba, 0x844: 0x183, 0x845: 0x183, 0x846: 0x183, 0x847: 0x184, + 0x848: 0xba, 0x849: 0xba, 0x84a: 0xba, 0x84b: 0xba, 0x84c: 0xba, 0x84d: 0xba, 0x84e: 0xba, 0x84f: 0xba, + 0x850: 0xba, 0x851: 0xba, 0x852: 0xba, 0x853: 0xba, 0x854: 0xba, 0x855: 0xba, 0x856: 0xba, 0x857: 0xba, + 0x858: 0xba, 0x859: 0xba, 0x85a: 0xba, 0x85b: 0xba, 0x85c: 0xba, 0x85d: 0xba, 0x85e: 0xba, 0x85f: 0xba, + 0x860: 0xba, 0x861: 0xba, 0x862: 0xba, 0x863: 0xba, 0x864: 0xba, 0x865: 0xba, 0x866: 0xba, 0x867: 0xba, + 0x868: 0xba, 0x869: 0xba, 0x86a: 0xba, 0x86b: 0xba, 0x86c: 0xba, 0x86d: 0xba, 0x86e: 0xba, 0x86f: 0xba, + 0x870: 0xba, 0x871: 0xba, 0x872: 0xba, 0x873: 0xba, 0x874: 0xba, 0x875: 0xba, 0x876: 0xba, 0x877: 0xba, + 0x878: 0xba, 0x879: 0xba, 0x87a: 0xba, 0x87b: 0xba, 0x87c: 0xba, 0x87d: 0xba, 0x87e: 0xba, 0x87f: 0xba, + // Block 0x22, offset 0x880 + 0x880: 0x0b, 0x881: 0x0b, 0x882: 0x0b, 0x883: 0x0b, 0x884: 0x0b, 0x885: 0x0b, 0x886: 0x0b, 0x887: 0x0b, + 0x888: 0x0b, 0x889: 0x0b, 0x88a: 0x0b, 0x88b: 0x0b, 0x88c: 0x0b, 0x88d: 0x0b, 0x88e: 0x0b, 0x88f: 0x0b, + 0x890: 0x0b, 0x891: 0x0b, 0x892: 0x0b, 0x893: 0x0b, 0x894: 0x0b, 0x895: 0x0b, 0x896: 0x0b, 0x897: 0x0b, + 0x898: 0x0b, 0x899: 0x0b, 0x89a: 0x0b, 0x89b: 0x0b, 0x89c: 0x0b, 0x89d: 0x0b, 0x89e: 0x0b, 0x89f: 0x0b, + 0x8a0: 0x1f, 0x8a1: 0x0b, 0x8a2: 0x0b, 0x8a3: 0x0b, 0x8a4: 0x0b, 0x8a5: 0x0b, 0x8a6: 0x0b, 0x8a7: 0x0b, + 0x8a8: 0x0b, 0x8a9: 0x0b, 0x8aa: 0x0b, 0x8ab: 0x0b, 0x8ac: 0x0b, 0x8ad: 0x0b, 0x8ae: 0x0b, 0x8af: 0x0b, + 0x8b0: 0x0b, 0x8b1: 0x0b, 0x8b2: 0x0b, 0x8b3: 0x0b, 0x8b4: 0x0b, 0x8b5: 0x0b, 0x8b6: 0x0b, 0x8b7: 0x0b, + 0x8b8: 0x0b, 0x8b9: 0x0b, 0x8ba: 0x0b, 0x8bb: 0x0b, 0x8bc: 0x0b, 0x8bd: 0x0b, 0x8be: 0x0b, 0x8bf: 0x0b, + // Block 0x23, offset 0x8c0 + 0x8c0: 0x0b, 0x8c1: 0x0b, 0x8c2: 0x0b, 0x8c3: 0x0b, 0x8c4: 0x0b, 0x8c5: 0x0b, 0x8c6: 0x0b, 0x8c7: 0x0b, + 0x8c8: 0x0b, 0x8c9: 0x0b, 0x8ca: 0x0b, 0x8cb: 0x0b, 0x8cc: 0x0b, 0x8cd: 0x0b, 0x8ce: 0x0b, 0x8cf: 0x0b, +} + +// idnaSparseOffset: 264 entries, 528 bytes +var idnaSparseOffset = []uint16{0x0, 0x8, 0x19, 0x25, 0x27, 0x2c, 0x34, 0x3f, 0x4b, 0x4f, 0x5e, 0x63, 0x6b, 0x77, 0x85, 0x8a, 0x93, 0xa3, 0xb1, 0xbd, 0xc9, 0xda, 0xe4, 0xeb, 0xf8, 0x109, 0x110, 0x11b, 0x12a, 0x138, 0x142, 0x144, 0x149, 0x14c, 0x14f, 0x151, 0x15d, 0x168, 0x170, 0x176, 0x17c, 0x181, 0x186, 0x189, 0x18d, 0x193, 0x198, 0x1a4, 0x1ae, 0x1b4, 0x1c5, 0x1cf, 0x1d2, 0x1da, 0x1dd, 0x1ea, 0x1f2, 0x1f6, 0x1fd, 0x205, 0x215, 0x221, 0x223, 0x22d, 0x239, 0x245, 0x251, 0x259, 0x25e, 0x268, 0x279, 0x27d, 0x288, 0x28c, 0x295, 0x29d, 0x2a3, 0x2a8, 0x2ab, 0x2af, 0x2b5, 0x2b9, 0x2bd, 0x2c3, 0x2ca, 0x2d0, 0x2d8, 0x2df, 0x2ea, 0x2f4, 0x2f8, 0x2fb, 0x301, 0x305, 0x307, 0x30a, 0x30c, 0x30f, 0x319, 0x31c, 0x32b, 0x32f, 0x334, 0x337, 0x33b, 0x340, 0x345, 0x34b, 0x351, 0x360, 0x366, 0x36a, 0x379, 0x37e, 0x386, 0x390, 0x39b, 0x3a3, 0x3b4, 0x3bd, 0x3cd, 0x3da, 0x3e4, 0x3e9, 0x3f6, 0x3fa, 0x3ff, 0x401, 0x405, 0x407, 0x40b, 0x414, 0x41a, 0x41e, 0x42e, 0x438, 0x43d, 0x440, 0x446, 0x44d, 0x452, 0x456, 0x45c, 0x461, 0x46a, 0x46f, 0x475, 0x47c, 0x483, 0x48a, 0x48e, 0x493, 0x496, 0x49b, 0x4a7, 0x4ad, 0x4b2, 0x4b9, 0x4c1, 0x4c6, 0x4ca, 0x4da, 0x4e1, 0x4e5, 0x4e9, 0x4f0, 0x4f2, 0x4f5, 0x4f8, 0x4fc, 0x500, 0x506, 0x50f, 0x51b, 0x522, 0x52b, 0x533, 0x53a, 0x548, 0x555, 0x562, 0x56b, 0x56f, 0x57d, 0x585, 0x590, 0x599, 0x59f, 0x5a7, 0x5b0, 0x5ba, 0x5bd, 0x5c9, 0x5cc, 0x5d1, 0x5de, 0x5e7, 0x5f3, 0x5f6, 0x600, 0x609, 0x615, 0x622, 0x62a, 0x62d, 0x632, 0x635, 0x638, 0x63b, 0x642, 0x649, 0x64d, 0x658, 0x65b, 0x661, 0x666, 0x66a, 0x66d, 0x670, 0x673, 0x676, 0x679, 0x67e, 0x688, 0x68b, 0x68f, 0x69e, 0x6aa, 0x6ae, 0x6b3, 0x6b8, 0x6bc, 0x6c1, 0x6ca, 0x6d5, 0x6db, 0x6e3, 0x6e7, 0x6eb, 0x6f1, 0x6f7, 0x6fc, 0x6ff, 0x70f, 0x716, 0x719, 0x71c, 0x720, 0x726, 0x72b, 0x730, 0x735, 0x738, 0x73d, 0x740, 0x743, 0x747, 0x74b, 0x74e, 0x75e, 0x76f, 0x774, 0x776, 0x778} + +// idnaSparseValues: 1915 entries, 7660 bytes +var idnaSparseValues = [1915]valueRange{ + // Block 0x0, offset 0x0 + {value: 0x0000, lo: 0x07}, + {value: 0xe105, lo: 0x80, hi: 0x96}, + {value: 0x0018, lo: 0x97, hi: 0x97}, + {value: 0xe105, lo: 0x98, hi: 0x9e}, + {value: 0x001f, lo: 0x9f, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xb7}, + {value: 0x0008, lo: 0xb8, hi: 0xbf}, + // Block 0x1, offset 0x8 + {value: 0x0000, lo: 0x10}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0xe01d, lo: 0x81, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0x82}, + {value: 0x0335, lo: 0x83, hi: 0x83}, + {value: 0x034d, lo: 0x84, hi: 0x84}, + {value: 0x0365, lo: 0x85, hi: 0x85}, + {value: 0xe00d, lo: 0x86, hi: 0x86}, + {value: 0x0008, lo: 0x87, hi: 0x87}, + {value: 0xe00d, lo: 0x88, hi: 0x88}, + {value: 0x0008, lo: 0x89, hi: 0x89}, + {value: 0xe00d, lo: 0x8a, hi: 0x8a}, + {value: 0x0008, lo: 0x8b, hi: 0x8b}, + {value: 0xe00d, lo: 0x8c, hi: 0x8c}, + {value: 0x0008, lo: 0x8d, hi: 0x8d}, + {value: 0xe00d, lo: 0x8e, hi: 0x8e}, + {value: 0x0008, lo: 0x8f, hi: 0xbf}, + // Block 0x2, offset 0x19 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x0249, lo: 0xb0, hi: 0xb0}, + {value: 0x037d, lo: 0xb1, hi: 0xb1}, + {value: 0x0259, lo: 0xb2, hi: 0xb2}, + {value: 0x0269, lo: 0xb3, hi: 0xb3}, + {value: 0x034d, lo: 0xb4, hi: 0xb4}, + {value: 0x0395, lo: 0xb5, hi: 0xb5}, + {value: 0xe1bd, lo: 0xb6, hi: 0xb6}, + {value: 0x0279, lo: 0xb7, hi: 0xb7}, + {value: 0x0289, lo: 0xb8, hi: 0xb8}, + {value: 0x0008, lo: 0xb9, hi: 0xbf}, + // Block 0x3, offset 0x25 + {value: 0x0000, lo: 0x01}, + {value: 0x3308, lo: 0x80, hi: 0xbf}, + // Block 0x4, offset 0x27 + {value: 0x0000, lo: 0x04}, + {value: 0x03f5, lo: 0x80, hi: 0x8f}, + {value: 0xe105, lo: 0x90, hi: 0x9f}, + {value: 0x049d, lo: 0xa0, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x5, offset 0x2c + {value: 0x0000, lo: 0x07}, + {value: 0xe185, lo: 0x80, hi: 0x8f}, + {value: 0x0545, lo: 0x90, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x98}, + {value: 0x0008, lo: 0x99, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xa0}, + {value: 0x0008, lo: 0xa1, hi: 0xbf}, + // Block 0x6, offset 0x34 + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0401, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x88}, + {value: 0x0018, lo: 0x89, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x90}, + {value: 0x3308, lo: 0x91, hi: 0xbd}, + {value: 0x0818, lo: 0xbe, hi: 0xbe}, + {value: 0x3308, lo: 0xbf, hi: 0xbf}, + // Block 0x7, offset 0x3f + {value: 0x0000, lo: 0x0b}, + {value: 0x0818, lo: 0x80, hi: 0x80}, + {value: 0x3308, lo: 0x81, hi: 0x82}, + {value: 0x0818, lo: 0x83, hi: 0x83}, + {value: 0x3308, lo: 0x84, hi: 0x85}, + {value: 0x0818, lo: 0x86, hi: 0x86}, + {value: 0x3308, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0808, lo: 0x90, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xaf}, + {value: 0x0808, lo: 0xb0, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0x8, offset 0x4b + {value: 0x0000, lo: 0x03}, + {value: 0x0a08, lo: 0x80, hi: 0x87}, + {value: 0x0c08, lo: 0x88, hi: 0x99}, + {value: 0x0a08, lo: 0x9a, hi: 0xbf}, + // Block 0x9, offset 0x4f + {value: 0x0000, lo: 0x0e}, + {value: 0x3308, lo: 0x80, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8c}, + {value: 0x0c08, lo: 0x8d, hi: 0x8d}, + {value: 0x0a08, lo: 0x8e, hi: 0x98}, + {value: 0x0c08, lo: 0x99, hi: 0x9b}, + {value: 0x0a08, lo: 0x9c, hi: 0xaa}, + {value: 0x0c08, lo: 0xab, hi: 0xac}, + {value: 0x0a08, lo: 0xad, hi: 0xb0}, + {value: 0x0c08, lo: 0xb1, hi: 0xb1}, + {value: 0x0a08, lo: 0xb2, hi: 0xb2}, + {value: 0x0c08, lo: 0xb3, hi: 0xb4}, + {value: 0x0a08, lo: 0xb5, hi: 0xb7}, + {value: 0x0c08, lo: 0xb8, hi: 0xb9}, + {value: 0x0a08, lo: 0xba, hi: 0xbf}, + // Block 0xa, offset 0x5e + {value: 0x0000, lo: 0x04}, + {value: 0x0808, lo: 0x80, hi: 0xa5}, + {value: 0x3308, lo: 0xa6, hi: 0xb0}, + {value: 0x0808, lo: 0xb1, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xbf}, + // Block 0xb, offset 0x63 + {value: 0x0000, lo: 0x07}, + {value: 0x0808, lo: 0x80, hi: 0x89}, + {value: 0x0a08, lo: 0x8a, hi: 0xaa}, + {value: 0x3308, lo: 0xab, hi: 0xb3}, + {value: 0x0808, lo: 0xb4, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xb9}, + {value: 0x0818, lo: 0xba, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbf}, + // Block 0xc, offset 0x6b + {value: 0x0000, lo: 0x0b}, + {value: 0x0808, lo: 0x80, hi: 0x95}, + {value: 0x3308, lo: 0x96, hi: 0x99}, + {value: 0x0808, lo: 0x9a, hi: 0x9a}, + {value: 0x3308, lo: 0x9b, hi: 0xa3}, + {value: 0x0808, lo: 0xa4, hi: 0xa4}, + {value: 0x3308, lo: 0xa5, hi: 0xa7}, + {value: 0x0808, lo: 0xa8, hi: 0xa8}, + {value: 0x3308, lo: 0xa9, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0818, lo: 0xb0, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xd, offset 0x77 + {value: 0x0000, lo: 0x0d}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0a08, lo: 0xa0, hi: 0xa9}, + {value: 0x0c08, lo: 0xaa, hi: 0xac}, + {value: 0x0808, lo: 0xad, hi: 0xad}, + {value: 0x0c08, lo: 0xae, hi: 0xae}, + {value: 0x0a08, lo: 0xaf, hi: 0xb0}, + {value: 0x0c08, lo: 0xb1, hi: 0xb2}, + {value: 0x0a08, lo: 0xb3, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xb5}, + {value: 0x0a08, lo: 0xb6, hi: 0xb8}, + {value: 0x0c08, lo: 0xb9, hi: 0xb9}, + {value: 0x0a08, lo: 0xba, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0xe, offset 0x85 + {value: 0x0000, lo: 0x04}, + {value: 0x0040, lo: 0x80, hi: 0x93}, + {value: 0x3308, lo: 0x94, hi: 0xa1}, + {value: 0x0840, lo: 0xa2, hi: 0xa2}, + {value: 0x3308, lo: 0xa3, hi: 0xbf}, + // Block 0xf, offset 0x8a + {value: 0x0000, lo: 0x08}, + {value: 0x3308, lo: 0x80, hi: 0x82}, + {value: 0x3008, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0xb9}, + {value: 0x3308, lo: 0xba, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbf}, + // Block 0x10, offset 0x93 + {value: 0x0000, lo: 0x0f}, + {value: 0x3308, lo: 0x80, hi: 0x80}, + {value: 0x3008, lo: 0x81, hi: 0x82}, + {value: 0x0040, lo: 0x83, hi: 0x85}, + {value: 0x3008, lo: 0x86, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x3008, lo: 0x8a, hi: 0x8c}, + {value: 0x3b08, lo: 0x8d, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x96}, + {value: 0x3008, lo: 0x97, hi: 0x97}, + {value: 0x0040, lo: 0x98, hi: 0xa5}, + {value: 0x0008, lo: 0xa6, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbf}, + // Block 0x11, offset 0xa3 + {value: 0x0000, lo: 0x0d}, + {value: 0x3308, lo: 0x80, hi: 0x80}, + {value: 0x3008, lo: 0x81, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8d}, + {value: 0x0008, lo: 0x8e, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x91}, + {value: 0x0008, lo: 0x92, hi: 0xa8}, + {value: 0x0040, lo: 0xa9, hi: 0xa9}, + {value: 0x0008, lo: 0xaa, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x3308, lo: 0xbe, hi: 0xbf}, + // Block 0x12, offset 0xb1 + {value: 0x0000, lo: 0x0b}, + {value: 0x3308, lo: 0x80, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8d}, + {value: 0x0008, lo: 0x8e, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x91}, + {value: 0x0008, lo: 0x92, hi: 0xba}, + {value: 0x3b08, lo: 0xbb, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbf}, + // Block 0x13, offset 0xbd + {value: 0x0000, lo: 0x0b}, + {value: 0x0040, lo: 0x80, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x99}, + {value: 0x0008, lo: 0x9a, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xb2}, + {value: 0x0008, lo: 0xb3, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0x14, offset 0xc9 + {value: 0x0000, lo: 0x10}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x89}, + {value: 0x3b08, lo: 0x8a, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8e}, + {value: 0x3008, lo: 0x8f, hi: 0x91}, + {value: 0x3308, lo: 0x92, hi: 0x94}, + {value: 0x0040, lo: 0x95, hi: 0x95}, + {value: 0x3308, lo: 0x96, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x97}, + {value: 0x3008, lo: 0x98, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xa5}, + {value: 0x0008, lo: 0xa6, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xb1}, + {value: 0x3008, lo: 0xb2, hi: 0xb3}, + {value: 0x0018, lo: 0xb4, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0x15, offset 0xda + {value: 0x0000, lo: 0x09}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0xb0}, + {value: 0x3308, lo: 0xb1, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xb2}, + {value: 0x08f1, lo: 0xb3, hi: 0xb3}, + {value: 0x3308, lo: 0xb4, hi: 0xb9}, + {value: 0x3b08, lo: 0xba, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbe}, + {value: 0x0018, lo: 0xbf, hi: 0xbf}, + // Block 0x16, offset 0xe4 + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x3308, lo: 0x87, hi: 0x8e}, + {value: 0x0018, lo: 0x8f, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0xbf}, + // Block 0x17, offset 0xeb + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x84}, + {value: 0x0040, lo: 0x85, hi: 0x85}, + {value: 0x0008, lo: 0x86, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x87}, + {value: 0x3308, lo: 0x88, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9b}, + {value: 0x0961, lo: 0x9c, hi: 0x9c}, + {value: 0x0999, lo: 0x9d, hi: 0x9d}, + {value: 0x0008, lo: 0x9e, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0x18, offset 0xf8 + {value: 0x0000, lo: 0x10}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x8a}, + {value: 0x0008, lo: 0x8b, hi: 0x8b}, + {value: 0xe03d, lo: 0x8c, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0x97}, + {value: 0x3308, lo: 0x98, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa9}, + {value: 0x0018, lo: 0xaa, hi: 0xb4}, + {value: 0x3308, lo: 0xb5, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xb6}, + {value: 0x3308, lo: 0xb7, hi: 0xb7}, + {value: 0x0018, lo: 0xb8, hi: 0xb8}, + {value: 0x3308, lo: 0xb9, hi: 0xb9}, + {value: 0x0018, lo: 0xba, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbf}, + // Block 0x19, offset 0x109 + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x85}, + {value: 0x3308, lo: 0x86, hi: 0x86}, + {value: 0x0018, lo: 0x87, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8d}, + {value: 0x0018, lo: 0x8e, hi: 0x9a}, + {value: 0x0040, lo: 0x9b, hi: 0xbf}, + // Block 0x1a, offset 0x110 + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0xaa}, + {value: 0x3008, lo: 0xab, hi: 0xac}, + {value: 0x3308, lo: 0xad, hi: 0xb0}, + {value: 0x3008, lo: 0xb1, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb7}, + {value: 0x3008, lo: 0xb8, hi: 0xb8}, + {value: 0x3b08, lo: 0xb9, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbc}, + {value: 0x3308, lo: 0xbd, hi: 0xbe}, + {value: 0x0008, lo: 0xbf, hi: 0xbf}, + // Block 0x1b, offset 0x11b + {value: 0x0000, lo: 0x0e}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0018, lo: 0x8a, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x95}, + {value: 0x3008, lo: 0x96, hi: 0x97}, + {value: 0x3308, lo: 0x98, hi: 0x99}, + {value: 0x0008, lo: 0x9a, hi: 0x9d}, + {value: 0x3308, lo: 0x9e, hi: 0xa0}, + {value: 0x0008, lo: 0xa1, hi: 0xa1}, + {value: 0x3008, lo: 0xa2, hi: 0xa4}, + {value: 0x0008, lo: 0xa5, hi: 0xa6}, + {value: 0x3008, lo: 0xa7, hi: 0xad}, + {value: 0x0008, lo: 0xae, hi: 0xb0}, + {value: 0x3308, lo: 0xb1, hi: 0xb4}, + {value: 0x0008, lo: 0xb5, hi: 0xbf}, + // Block 0x1c, offset 0x12a + {value: 0x0000, lo: 0x0d}, + {value: 0x0008, lo: 0x80, hi: 0x81}, + {value: 0x3308, lo: 0x82, hi: 0x82}, + {value: 0x3008, lo: 0x83, hi: 0x84}, + {value: 0x3308, lo: 0x85, hi: 0x86}, + {value: 0x3008, lo: 0x87, hi: 0x8c}, + {value: 0x3308, lo: 0x8d, hi: 0x8d}, + {value: 0x0008, lo: 0x8e, hi: 0x8e}, + {value: 0x3008, lo: 0x8f, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x3008, lo: 0x9a, hi: 0x9c}, + {value: 0x3308, lo: 0x9d, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0x1d, offset 0x138 + {value: 0x0000, lo: 0x09}, + {value: 0x0040, lo: 0x80, hi: 0x86}, + {value: 0x055d, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8c}, + {value: 0x055d, lo: 0x8d, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xba}, + {value: 0x0018, lo: 0xbb, hi: 0xbb}, + {value: 0xe105, lo: 0xbc, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbf}, + // Block 0x1e, offset 0x142 + {value: 0x0000, lo: 0x01}, + {value: 0x0018, lo: 0x80, hi: 0xbf}, + // Block 0x1f, offset 0x144 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0xa0}, + {value: 0x2018, lo: 0xa1, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xbf}, + // Block 0x20, offset 0x149 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0xa7}, + {value: 0x2018, lo: 0xa8, hi: 0xbf}, + // Block 0x21, offset 0x14c + {value: 0x0000, lo: 0x02}, + {value: 0x2018, lo: 0x80, hi: 0x82}, + {value: 0x0018, lo: 0x83, hi: 0xbf}, + // Block 0x22, offset 0x14f + {value: 0x0000, lo: 0x01}, + {value: 0x0008, lo: 0x80, hi: 0xbf}, + // Block 0x23, offset 0x151 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0008, lo: 0x8a, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0x98}, + {value: 0x0040, lo: 0x99, hi: 0x99}, + {value: 0x0008, lo: 0x9a, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x24, offset 0x15d + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0008, lo: 0x8a, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb7}, + {value: 0x0008, lo: 0xb8, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x25, offset 0x168 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x0040, lo: 0x81, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0xbf}, + // Block 0x26, offset 0x170 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x91}, + {value: 0x0008, lo: 0x92, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0xbf}, + // Block 0x27, offset 0x176 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x9a}, + {value: 0x0040, lo: 0x9b, hi: 0x9c}, + {value: 0x3308, lo: 0x9d, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbf}, + // Block 0x28, offset 0x17c + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x29, offset 0x181 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb7}, + {value: 0xe045, lo: 0xb8, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0x2a, offset 0x186 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0xbf}, + // Block 0x2b, offset 0x189 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xac}, + {value: 0x0018, lo: 0xad, hi: 0xae}, + {value: 0x0008, lo: 0xaf, hi: 0xbf}, + // Block 0x2c, offset 0x18d + {value: 0x0000, lo: 0x05}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9c}, + {value: 0x0040, lo: 0x9d, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x2d, offset 0x193 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xaa}, + {value: 0x0018, lo: 0xab, hi: 0xb0}, + {value: 0x0008, lo: 0xb1, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbf}, + // Block 0x2e, offset 0x198 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8d}, + {value: 0x0008, lo: 0x8e, hi: 0x91}, + {value: 0x3308, lo: 0x92, hi: 0x93}, + {value: 0x3b08, lo: 0x94, hi: 0x94}, + {value: 0x0040, lo: 0x95, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb3}, + {value: 0x3b08, lo: 0xb4, hi: 0xb4}, + {value: 0x0018, lo: 0xb5, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0x2f, offset 0x1a4 + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x91}, + {value: 0x3308, lo: 0x92, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xad}, + {value: 0x0008, lo: 0xae, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xbf}, + // Block 0x30, offset 0x1ae + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0xb3}, + {value: 0x3340, lo: 0xb4, hi: 0xb5}, + {value: 0x3008, lo: 0xb6, hi: 0xb6}, + {value: 0x3308, lo: 0xb7, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbf}, + // Block 0x31, offset 0x1b4 + {value: 0x0000, lo: 0x10}, + {value: 0x3008, lo: 0x80, hi: 0x85}, + {value: 0x3308, lo: 0x86, hi: 0x86}, + {value: 0x3008, lo: 0x87, hi: 0x88}, + {value: 0x3308, lo: 0x89, hi: 0x91}, + {value: 0x3b08, lo: 0x92, hi: 0x92}, + {value: 0x3308, lo: 0x93, hi: 0x93}, + {value: 0x0018, lo: 0x94, hi: 0x96}, + {value: 0x0008, lo: 0x97, hi: 0x97}, + {value: 0x0018, lo: 0x98, hi: 0x9b}, + {value: 0x0008, lo: 0x9c, hi: 0x9c}, + {value: 0x3308, lo: 0x9d, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa9}, + {value: 0x0040, lo: 0xaa, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0x32, offset 0x1c5 + {value: 0x0000, lo: 0x09}, + {value: 0x0018, lo: 0x80, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x86}, + {value: 0x0218, lo: 0x87, hi: 0x87}, + {value: 0x0018, lo: 0x88, hi: 0x8a}, + {value: 0x33c0, lo: 0x8b, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0208, lo: 0xa0, hi: 0xbf}, + // Block 0x33, offset 0x1cf + {value: 0x0000, lo: 0x02}, + {value: 0x0208, lo: 0x80, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbf}, + // Block 0x34, offset 0x1d2 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0x84}, + {value: 0x3308, lo: 0x85, hi: 0x86}, + {value: 0x0208, lo: 0x87, hi: 0xa8}, + {value: 0x3308, lo: 0xa9, hi: 0xa9}, + {value: 0x0208, lo: 0xaa, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x35, offset 0x1da + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xbf}, + // Block 0x36, offset 0x1dd + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x3308, lo: 0xa0, hi: 0xa2}, + {value: 0x3008, lo: 0xa3, hi: 0xa6}, + {value: 0x3308, lo: 0xa7, hi: 0xa8}, + {value: 0x3008, lo: 0xa9, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x3008, lo: 0xb0, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb2}, + {value: 0x3008, lo: 0xb3, hi: 0xb8}, + {value: 0x3308, lo: 0xb9, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0x37, offset 0x1ea + {value: 0x0000, lo: 0x07}, + {value: 0x0018, lo: 0x80, hi: 0x80}, + {value: 0x0040, lo: 0x81, hi: 0x83}, + {value: 0x0018, lo: 0x84, hi: 0x85}, + {value: 0x0008, lo: 0x86, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0x38, offset 0x1f2 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x39, offset 0x1f6 + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0028, lo: 0x9a, hi: 0x9a}, + {value: 0x0040, lo: 0x9b, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0xbf}, + // Block 0x3a, offset 0x1fd + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0x96}, + {value: 0x3308, lo: 0x97, hi: 0x98}, + {value: 0x3008, lo: 0x99, hi: 0x9a}, + {value: 0x3308, lo: 0x9b, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x3b, offset 0x205 + {value: 0x0000, lo: 0x0f}, + {value: 0x0008, lo: 0x80, hi: 0x94}, + {value: 0x3008, lo: 0x95, hi: 0x95}, + {value: 0x3308, lo: 0x96, hi: 0x96}, + {value: 0x3008, lo: 0x97, hi: 0x97}, + {value: 0x3308, lo: 0x98, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x3b08, lo: 0xa0, hi: 0xa0}, + {value: 0x3008, lo: 0xa1, hi: 0xa1}, + {value: 0x3308, lo: 0xa2, hi: 0xa2}, + {value: 0x3008, lo: 0xa3, hi: 0xa4}, + {value: 0x3308, lo: 0xa5, hi: 0xac}, + {value: 0x3008, lo: 0xad, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbe}, + {value: 0x3308, lo: 0xbf, hi: 0xbf}, + // Block 0x3c, offset 0x215 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa6}, + {value: 0x0008, lo: 0xa7, hi: 0xa7}, + {value: 0x0018, lo: 0xa8, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xbd}, + {value: 0x3318, lo: 0xbe, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x3d, offset 0x221 + {value: 0x0000, lo: 0x01}, + {value: 0x0040, lo: 0x80, hi: 0xbf}, + // Block 0x3e, offset 0x223 + {value: 0x0000, lo: 0x09}, + {value: 0x3308, lo: 0x80, hi: 0x83}, + {value: 0x3008, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0xb3}, + {value: 0x3308, lo: 0xb4, hi: 0xb4}, + {value: 0x3008, lo: 0xb5, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbc}, + {value: 0x3008, lo: 0xbd, hi: 0xbf}, + // Block 0x3f, offset 0x22d + {value: 0x0000, lo: 0x0b}, + {value: 0x3008, lo: 0x80, hi: 0x81}, + {value: 0x3308, lo: 0x82, hi: 0x82}, + {value: 0x3008, lo: 0x83, hi: 0x83}, + {value: 0x3808, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0xaa}, + {value: 0x3308, lo: 0xab, hi: 0xb3}, + {value: 0x0018, lo: 0xb4, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbf}, + // Block 0x40, offset 0x239 + {value: 0x0000, lo: 0x0b}, + {value: 0x3308, lo: 0x80, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xa0}, + {value: 0x3008, lo: 0xa1, hi: 0xa1}, + {value: 0x3308, lo: 0xa2, hi: 0xa5}, + {value: 0x3008, lo: 0xa6, hi: 0xa7}, + {value: 0x3308, lo: 0xa8, hi: 0xa9}, + {value: 0x3808, lo: 0xaa, hi: 0xaa}, + {value: 0x3b08, lo: 0xab, hi: 0xab}, + {value: 0x3308, lo: 0xac, hi: 0xad}, + {value: 0x0008, lo: 0xae, hi: 0xbf}, + // Block 0x41, offset 0x245 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0xa5}, + {value: 0x3308, lo: 0xa6, hi: 0xa6}, + {value: 0x3008, lo: 0xa7, hi: 0xa7}, + {value: 0x3308, lo: 0xa8, hi: 0xa9}, + {value: 0x3008, lo: 0xaa, hi: 0xac}, + {value: 0x3308, lo: 0xad, hi: 0xad}, + {value: 0x3008, lo: 0xae, hi: 0xae}, + {value: 0x3308, lo: 0xaf, hi: 0xb1}, + {value: 0x3808, lo: 0xb2, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xbb}, + {value: 0x0018, lo: 0xbc, hi: 0xbf}, + // Block 0x42, offset 0x251 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xa3}, + {value: 0x3008, lo: 0xa4, hi: 0xab}, + {value: 0x3308, lo: 0xac, hi: 0xb3}, + {value: 0x3008, lo: 0xb4, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xba}, + {value: 0x0018, lo: 0xbb, hi: 0xbf}, + // Block 0x43, offset 0x259 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0x8c}, + {value: 0x0008, lo: 0x8d, hi: 0xbd}, + {value: 0x0018, lo: 0xbe, hi: 0xbf}, + // Block 0x44, offset 0x25e + {value: 0x0000, lo: 0x09}, + {value: 0x0e29, lo: 0x80, hi: 0x80}, + {value: 0x0e41, lo: 0x81, hi: 0x81}, + {value: 0x0e59, lo: 0x82, hi: 0x82}, + {value: 0x0e71, lo: 0x83, hi: 0x83}, + {value: 0x0e89, lo: 0x84, hi: 0x85}, + {value: 0x0ea1, lo: 0x86, hi: 0x86}, + {value: 0x0eb9, lo: 0x87, hi: 0x87}, + {value: 0x057d, lo: 0x88, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0xbf}, + // Block 0x45, offset 0x268 + {value: 0x0000, lo: 0x10}, + {value: 0x0018, lo: 0x80, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x3308, lo: 0x90, hi: 0x92}, + {value: 0x0018, lo: 0x93, hi: 0x93}, + {value: 0x3308, lo: 0x94, hi: 0xa0}, + {value: 0x3008, lo: 0xa1, hi: 0xa1}, + {value: 0x3308, lo: 0xa2, hi: 0xa8}, + {value: 0x0008, lo: 0xa9, hi: 0xac}, + {value: 0x3308, lo: 0xad, hi: 0xad}, + {value: 0x0008, lo: 0xae, hi: 0xb1}, + {value: 0x3008, lo: 0xb2, hi: 0xb3}, + {value: 0x3308, lo: 0xb4, hi: 0xb4}, + {value: 0x0008, lo: 0xb5, hi: 0xb6}, + {value: 0x3008, lo: 0xb7, hi: 0xb7}, + {value: 0x3308, lo: 0xb8, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0x46, offset 0x279 + {value: 0x0000, lo: 0x03}, + {value: 0x3308, lo: 0x80, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xba}, + {value: 0x3308, lo: 0xbb, hi: 0xbf}, + // Block 0x47, offset 0x27d + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x87}, + {value: 0xe045, lo: 0x88, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x97}, + {value: 0xe045, lo: 0x98, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa7}, + {value: 0xe045, lo: 0xa8, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb7}, + {value: 0xe045, lo: 0xb8, hi: 0xbf}, + // Block 0x48, offset 0x288 + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0x8f}, + {value: 0x3318, lo: 0x90, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xbf}, + // Block 0x49, offset 0x28c + {value: 0x0000, lo: 0x08}, + {value: 0x0018, lo: 0x80, hi: 0x82}, + {value: 0x0040, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x84}, + {value: 0x0018, lo: 0x85, hi: 0x88}, + {value: 0x24c1, lo: 0x89, hi: 0x89}, + {value: 0x0018, lo: 0x8a, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbf}, + // Block 0x4a, offset 0x295 + {value: 0x0000, lo: 0x07}, + {value: 0x0018, lo: 0x80, hi: 0xab}, + {value: 0x24f1, lo: 0xac, hi: 0xac}, + {value: 0x2529, lo: 0xad, hi: 0xad}, + {value: 0x0018, lo: 0xae, hi: 0xae}, + {value: 0x2579, lo: 0xaf, hi: 0xaf}, + {value: 0x25b1, lo: 0xb0, hi: 0xb0}, + {value: 0x0018, lo: 0xb1, hi: 0xbf}, + // Block 0x4b, offset 0x29d + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x9f}, + {value: 0x0080, lo: 0xa0, hi: 0xa0}, + {value: 0x0018, lo: 0xa1, hi: 0xad}, + {value: 0x0080, lo: 0xae, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbf}, + // Block 0x4c, offset 0x2a3 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0xa8}, + {value: 0x09c5, lo: 0xa9, hi: 0xa9}, + {value: 0x09e5, lo: 0xaa, hi: 0xaa}, + {value: 0x0018, lo: 0xab, hi: 0xbf}, + // Block 0x4d, offset 0x2a8 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xbf}, + // Block 0x4e, offset 0x2ab + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x8b}, + {value: 0x28c1, lo: 0x8c, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0xbf}, + // Block 0x4f, offset 0x2af + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0xb3}, + {value: 0x0e66, lo: 0xb4, hi: 0xb4}, + {value: 0x292a, lo: 0xb5, hi: 0xb5}, + {value: 0x0e86, lo: 0xb6, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xbf}, + // Block 0x50, offset 0x2b5 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x9b}, + {value: 0x2941, lo: 0x9c, hi: 0x9c}, + {value: 0x0018, lo: 0x9d, hi: 0xbf}, + // Block 0x51, offset 0x2b9 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xbf}, + // Block 0x52, offset 0x2bd + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x97}, + {value: 0x0018, lo: 0x98, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbc}, + {value: 0x0018, lo: 0xbd, hi: 0xbf}, + // Block 0x53, offset 0x2c3 + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0018, lo: 0x8a, hi: 0x92}, + {value: 0x0040, lo: 0x93, hi: 0xab}, + {value: 0x0018, lo: 0xac, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0x54, offset 0x2ca + {value: 0x0000, lo: 0x05}, + {value: 0xe185, lo: 0x80, hi: 0x8f}, + {value: 0x03f5, lo: 0x90, hi: 0x9f}, + {value: 0x0ea5, lo: 0xa0, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x55, offset 0x2d0 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xa5}, + {value: 0x0040, lo: 0xa6, hi: 0xa6}, + {value: 0x0008, lo: 0xa7, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xac}, + {value: 0x0008, lo: 0xad, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x56, offset 0x2d8 + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xae}, + {value: 0xe075, lo: 0xaf, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0x57, offset 0x2df + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xa7}, + {value: 0x0008, lo: 0xa8, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xb7}, + {value: 0x0008, lo: 0xb8, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x58, offset 0x2ea + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x8e}, + {value: 0x0040, lo: 0x8f, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x3308, lo: 0xa0, hi: 0xbf}, + // Block 0x59, offset 0x2f4 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xae}, + {value: 0x0008, lo: 0xaf, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbf}, + // Block 0x5a, offset 0x2f8 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0xbf}, + // Block 0x5b, offset 0x2fb + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9e}, + {value: 0x0edd, lo: 0x9f, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xbf}, + // Block 0x5c, offset 0x301 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xb2}, + {value: 0x0efd, lo: 0xb3, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xbf}, + // Block 0x5d, offset 0x305 + {value: 0x0020, lo: 0x01}, + {value: 0x0f1d, lo: 0x80, hi: 0xbf}, + // Block 0x5e, offset 0x307 + {value: 0x0020, lo: 0x02}, + {value: 0x171d, lo: 0x80, hi: 0x8f}, + {value: 0x18fd, lo: 0x90, hi: 0xbf}, + // Block 0x5f, offset 0x30a + {value: 0x0020, lo: 0x01}, + {value: 0x1efd, lo: 0x80, hi: 0xbf}, + // Block 0x60, offset 0x30c + {value: 0x0000, lo: 0x02}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0xbf}, + // Block 0x61, offset 0x30f + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x98}, + {value: 0x3308, lo: 0x99, hi: 0x9a}, + {value: 0x29e2, lo: 0x9b, hi: 0x9b}, + {value: 0x2a0a, lo: 0x9c, hi: 0x9c}, + {value: 0x0008, lo: 0x9d, hi: 0x9e}, + {value: 0x2a31, lo: 0x9f, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa0}, + {value: 0x0008, lo: 0xa1, hi: 0xbf}, + // Block 0x62, offset 0x319 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xbe}, + {value: 0x2a69, lo: 0xbf, hi: 0xbf}, + // Block 0x63, offset 0x31c + {value: 0x0000, lo: 0x0e}, + {value: 0x0040, lo: 0x80, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xb0}, + {value: 0x2a1d, lo: 0xb1, hi: 0xb1}, + {value: 0x2a3d, lo: 0xb2, hi: 0xb2}, + {value: 0x2a5d, lo: 0xb3, hi: 0xb3}, + {value: 0x2a7d, lo: 0xb4, hi: 0xb4}, + {value: 0x2a5d, lo: 0xb5, hi: 0xb5}, + {value: 0x2a9d, lo: 0xb6, hi: 0xb6}, + {value: 0x2abd, lo: 0xb7, hi: 0xb7}, + {value: 0x2add, lo: 0xb8, hi: 0xb9}, + {value: 0x2afd, lo: 0xba, hi: 0xbb}, + {value: 0x2b1d, lo: 0xbc, hi: 0xbd}, + {value: 0x2afd, lo: 0xbe, hi: 0xbf}, + // Block 0x64, offset 0x32b + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x65, offset 0x32f + {value: 0x0030, lo: 0x04}, + {value: 0x2aa2, lo: 0x80, hi: 0x9d}, + {value: 0x305a, lo: 0x9e, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x30a2, lo: 0xa0, hi: 0xbf}, + // Block 0x66, offset 0x334 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xbf}, + // Block 0x67, offset 0x337 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbf}, + // Block 0x68, offset 0x33b + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xbd}, + {value: 0x0018, lo: 0xbe, hi: 0xbf}, + // Block 0x69, offset 0x340 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xbf}, + // Block 0x6a, offset 0x345 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0xa5}, + {value: 0x0018, lo: 0xa6, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb1}, + {value: 0x0018, lo: 0xb2, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbf}, + // Block 0x6b, offset 0x34b + {value: 0x0000, lo: 0x05}, + {value: 0x0040, lo: 0x80, hi: 0xb6}, + {value: 0x0008, lo: 0xb7, hi: 0xb7}, + {value: 0x2009, lo: 0xb8, hi: 0xb8}, + {value: 0x6e89, lo: 0xb9, hi: 0xb9}, + {value: 0x0008, lo: 0xba, hi: 0xbf}, + // Block 0x6c, offset 0x351 + {value: 0x0000, lo: 0x0e}, + {value: 0x0008, lo: 0x80, hi: 0x81}, + {value: 0x3308, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0x85}, + {value: 0x3b08, lo: 0x86, hi: 0x86}, + {value: 0x0008, lo: 0x87, hi: 0x8a}, + {value: 0x3308, lo: 0x8b, hi: 0x8b}, + {value: 0x0008, lo: 0x8c, hi: 0xa2}, + {value: 0x3008, lo: 0xa3, hi: 0xa4}, + {value: 0x3308, lo: 0xa5, hi: 0xa6}, + {value: 0x3008, lo: 0xa7, hi: 0xa7}, + {value: 0x0018, lo: 0xa8, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0x6d, offset 0x360 + {value: 0x0000, lo: 0x05}, + {value: 0x0208, lo: 0x80, hi: 0xb1}, + {value: 0x0108, lo: 0xb2, hi: 0xb2}, + {value: 0x0008, lo: 0xb3, hi: 0xb3}, + {value: 0x0018, lo: 0xb4, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbf}, + // Block 0x6e, offset 0x366 + {value: 0x0000, lo: 0x03}, + {value: 0x3008, lo: 0x80, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0xb3}, + {value: 0x3008, lo: 0xb4, hi: 0xbf}, + // Block 0x6f, offset 0x36a + {value: 0x0000, lo: 0x0e}, + {value: 0x3008, lo: 0x80, hi: 0x83}, + {value: 0x3b08, lo: 0x84, hi: 0x84}, + {value: 0x3308, lo: 0x85, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x8d}, + {value: 0x0018, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x3308, lo: 0xa0, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xb7}, + {value: 0x0018, lo: 0xb8, hi: 0xba}, + {value: 0x0008, lo: 0xbb, hi: 0xbb}, + {value: 0x0018, lo: 0xbc, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0x70, offset 0x379 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xa5}, + {value: 0x3308, lo: 0xa6, hi: 0xad}, + {value: 0x0018, lo: 0xae, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x71, offset 0x37e + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x3308, lo: 0x87, hi: 0x91}, + {value: 0x3008, lo: 0x92, hi: 0x92}, + {value: 0x3808, lo: 0x93, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x9e}, + {value: 0x0018, lo: 0x9f, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbf}, + // Block 0x72, offset 0x386 + {value: 0x0000, lo: 0x09}, + {value: 0x3308, lo: 0x80, hi: 0x82}, + {value: 0x3008, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb3}, + {value: 0x3008, lo: 0xb4, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xb9}, + {value: 0x3008, lo: 0xba, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbc}, + {value: 0x3008, lo: 0xbd, hi: 0xbf}, + // Block 0x73, offset 0x390 + {value: 0x0000, lo: 0x0a}, + {value: 0x3808, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8e}, + {value: 0x0008, lo: 0x8f, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa4}, + {value: 0x3308, lo: 0xa5, hi: 0xa5}, + {value: 0x0008, lo: 0xa6, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x74, offset 0x39b + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xa8}, + {value: 0x3308, lo: 0xa9, hi: 0xae}, + {value: 0x3008, lo: 0xaf, hi: 0xb0}, + {value: 0x3308, lo: 0xb1, hi: 0xb2}, + {value: 0x3008, lo: 0xb3, hi: 0xb4}, + {value: 0x3308, lo: 0xb5, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0x75, offset 0x3a3 + {value: 0x0000, lo: 0x10}, + {value: 0x0008, lo: 0x80, hi: 0x82}, + {value: 0x3308, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x8b}, + {value: 0x3308, lo: 0x8c, hi: 0x8c}, + {value: 0x3008, lo: 0x8d, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9b}, + {value: 0x0018, lo: 0x9c, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xb9}, + {value: 0x0008, lo: 0xba, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbc}, + {value: 0x3008, lo: 0xbd, hi: 0xbd}, + {value: 0x0008, lo: 0xbe, hi: 0xbf}, + // Block 0x76, offset 0x3b4 + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb0}, + {value: 0x0008, lo: 0xb1, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb4}, + {value: 0x0008, lo: 0xb5, hi: 0xb6}, + {value: 0x3308, lo: 0xb7, hi: 0xb8}, + {value: 0x0008, lo: 0xb9, hi: 0xbd}, + {value: 0x3308, lo: 0xbe, hi: 0xbf}, + // Block 0x77, offset 0x3bd + {value: 0x0000, lo: 0x0f}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x3308, lo: 0x81, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0x82}, + {value: 0x0040, lo: 0x83, hi: 0x9a}, + {value: 0x0008, lo: 0x9b, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xaa}, + {value: 0x3008, lo: 0xab, hi: 0xab}, + {value: 0x3308, lo: 0xac, hi: 0xad}, + {value: 0x3008, lo: 0xae, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xb4}, + {value: 0x3008, lo: 0xb5, hi: 0xb5}, + {value: 0x3b08, lo: 0xb6, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0x78, offset 0x3cd + {value: 0x0000, lo: 0x0c}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x88}, + {value: 0x0008, lo: 0x89, hi: 0x8e}, + {value: 0x0040, lo: 0x8f, hi: 0x90}, + {value: 0x0008, lo: 0x91, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xa7}, + {value: 0x0008, lo: 0xa8, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x79, offset 0x3da + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9b}, + {value: 0x4465, lo: 0x9c, hi: 0x9c}, + {value: 0x447d, lo: 0x9d, hi: 0x9d}, + {value: 0x2971, lo: 0x9e, hi: 0x9e}, + {value: 0xe06d, lo: 0x9f, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa5}, + {value: 0x0040, lo: 0xa6, hi: 0xaf}, + {value: 0x4495, lo: 0xb0, hi: 0xbf}, + // Block 0x7a, offset 0x3e4 + {value: 0x0000, lo: 0x04}, + {value: 0x44b5, lo: 0x80, hi: 0x8f}, + {value: 0x44d5, lo: 0x90, hi: 0x9f}, + {value: 0x44f5, lo: 0xa0, hi: 0xaf}, + {value: 0x44d5, lo: 0xb0, hi: 0xbf}, + // Block 0x7b, offset 0x3e9 + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0xa2}, + {value: 0x3008, lo: 0xa3, hi: 0xa4}, + {value: 0x3308, lo: 0xa5, hi: 0xa5}, + {value: 0x3008, lo: 0xa6, hi: 0xa7}, + {value: 0x3308, lo: 0xa8, hi: 0xa8}, + {value: 0x3008, lo: 0xa9, hi: 0xaa}, + {value: 0x0018, lo: 0xab, hi: 0xab}, + {value: 0x3008, lo: 0xac, hi: 0xac}, + {value: 0x3b08, lo: 0xad, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0x7c, offset 0x3f6 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbf}, + // Block 0x7d, offset 0x3fa + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x8a}, + {value: 0x0018, lo: 0x8b, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0x7e, offset 0x3ff + {value: 0x0020, lo: 0x01}, + {value: 0x4515, lo: 0x80, hi: 0xbf}, + // Block 0x7f, offset 0x401 + {value: 0x0020, lo: 0x03}, + {value: 0x4d15, lo: 0x80, hi: 0x94}, + {value: 0x4ad5, lo: 0x95, hi: 0x95}, + {value: 0x4fb5, lo: 0x96, hi: 0xbf}, + // Block 0x80, offset 0x405 + {value: 0x0020, lo: 0x01}, + {value: 0x54f5, lo: 0x80, hi: 0xbf}, + // Block 0x81, offset 0x407 + {value: 0x0020, lo: 0x03}, + {value: 0x5cf5, lo: 0x80, hi: 0x84}, + {value: 0x5655, lo: 0x85, hi: 0x85}, + {value: 0x5d95, lo: 0x86, hi: 0xbf}, + // Block 0x82, offset 0x40b + {value: 0x0020, lo: 0x08}, + {value: 0x6b55, lo: 0x80, hi: 0x8f}, + {value: 0x6d15, lo: 0x90, hi: 0x90}, + {value: 0x6d55, lo: 0x91, hi: 0xab}, + {value: 0x6ea1, lo: 0xac, hi: 0xac}, + {value: 0x70b5, lo: 0xad, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x70d5, lo: 0xb0, hi: 0xbf}, + // Block 0x83, offset 0x414 + {value: 0x0020, lo: 0x05}, + {value: 0x72d5, lo: 0x80, hi: 0xad}, + {value: 0x6535, lo: 0xae, hi: 0xae}, + {value: 0x7895, lo: 0xaf, hi: 0xb5}, + {value: 0x6f55, lo: 0xb6, hi: 0xb6}, + {value: 0x7975, lo: 0xb7, hi: 0xbf}, + // Block 0x84, offset 0x41a + {value: 0x0028, lo: 0x03}, + {value: 0x7c21, lo: 0x80, hi: 0x82}, + {value: 0x7be1, lo: 0x83, hi: 0x83}, + {value: 0x7c99, lo: 0x84, hi: 0xbf}, + // Block 0x85, offset 0x41e + {value: 0x0038, lo: 0x0f}, + {value: 0x9db1, lo: 0x80, hi: 0x83}, + {value: 0x9e59, lo: 0x84, hi: 0x85}, + {value: 0x9e91, lo: 0x86, hi: 0x87}, + {value: 0x9ec9, lo: 0x88, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x91}, + {value: 0xa089, lo: 0x92, hi: 0x97}, + {value: 0xa1a1, lo: 0x98, hi: 0x9c}, + {value: 0xa281, lo: 0x9d, hi: 0xb3}, + {value: 0x9d41, lo: 0xb4, hi: 0xb4}, + {value: 0x9db1, lo: 0xb5, hi: 0xb5}, + {value: 0xa789, lo: 0xb6, hi: 0xbb}, + {value: 0xa869, lo: 0xbc, hi: 0xbc}, + {value: 0xa7f9, lo: 0xbd, hi: 0xbd}, + {value: 0xa8d9, lo: 0xbe, hi: 0xbf}, + // Block 0x86, offset 0x42e + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8c}, + {value: 0x0008, lo: 0x8d, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xa7}, + {value: 0x0008, lo: 0xa8, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbb}, + {value: 0x0008, lo: 0xbc, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbe}, + {value: 0x0008, lo: 0xbf, hi: 0xbf}, + // Block 0x87, offset 0x438 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0xbf}, + // Block 0x88, offset 0x43d + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbf}, + // Block 0x89, offset 0x440 + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x82}, + {value: 0x0040, lo: 0x83, hi: 0x86}, + {value: 0x0018, lo: 0x87, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xbf}, + // Block 0x8a, offset 0x446 + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x8e}, + {value: 0x0040, lo: 0x8f, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa0}, + {value: 0x0040, lo: 0xa1, hi: 0xbf}, + // Block 0x8b, offset 0x44d + {value: 0x0000, lo: 0x04}, + {value: 0x0040, lo: 0x80, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbc}, + {value: 0x3308, lo: 0xbd, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0x8c, offset 0x452 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0x9c}, + {value: 0x0040, lo: 0x9d, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x8d, offset 0x456 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x9f}, + {value: 0x3308, lo: 0xa0, hi: 0xa0}, + {value: 0x0018, lo: 0xa1, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0x8e, offset 0x45c + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xac}, + {value: 0x0008, lo: 0xad, hi: 0xbf}, + // Block 0x8f, offset 0x461 + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0x89}, + {value: 0x0018, lo: 0x8a, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbf}, + // Block 0x90, offset 0x46a + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9e}, + {value: 0x0018, lo: 0x9f, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x91, offset 0x46f + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0xbf}, + // Block 0x92, offset 0x475 + {value: 0x0000, lo: 0x06}, + {value: 0xe145, lo: 0x80, hi: 0x87}, + {value: 0xe1c5, lo: 0x88, hi: 0x8f}, + {value: 0xe145, lo: 0x90, hi: 0x97}, + {value: 0x8ad5, lo: 0x98, hi: 0x9f}, + {value: 0x8aed, lo: 0xa0, hi: 0xa7}, + {value: 0x0008, lo: 0xa8, hi: 0xbf}, + // Block 0x93, offset 0x47c + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa9}, + {value: 0x0040, lo: 0xaa, hi: 0xaf}, + {value: 0x8aed, lo: 0xb0, hi: 0xb7}, + {value: 0x8ad5, lo: 0xb8, hi: 0xbf}, + // Block 0x94, offset 0x483 + {value: 0x0000, lo: 0x06}, + {value: 0xe145, lo: 0x80, hi: 0x87}, + {value: 0xe1c5, lo: 0x88, hi: 0x8f}, + {value: 0xe145, lo: 0x90, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0x95, offset 0x48a + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x96, offset 0x48e + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xae}, + {value: 0x0018, lo: 0xaf, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0x97, offset 0x493 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0x98, offset 0x496 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xbf}, + // Block 0x99, offset 0x49b + {value: 0x0000, lo: 0x0b}, + {value: 0x0808, lo: 0x80, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x87}, + {value: 0x0808, lo: 0x88, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0808, lo: 0x8a, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb6}, + {value: 0x0808, lo: 0xb7, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbb}, + {value: 0x0808, lo: 0xbc, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbe}, + {value: 0x0808, lo: 0xbf, hi: 0xbf}, + // Block 0x9a, offset 0x4a7 + {value: 0x0000, lo: 0x05}, + {value: 0x0808, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x96}, + {value: 0x0818, lo: 0x97, hi: 0x9f}, + {value: 0x0808, lo: 0xa0, hi: 0xb6}, + {value: 0x0818, lo: 0xb7, hi: 0xbf}, + // Block 0x9b, offset 0x4ad + {value: 0x0000, lo: 0x04}, + {value: 0x0808, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0xa6}, + {value: 0x0818, lo: 0xa7, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0x9c, offset 0x4b2 + {value: 0x0000, lo: 0x06}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0808, lo: 0xa0, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xb3}, + {value: 0x0808, lo: 0xb4, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xba}, + {value: 0x0818, lo: 0xbb, hi: 0xbf}, + // Block 0x9d, offset 0x4b9 + {value: 0x0000, lo: 0x07}, + {value: 0x0808, lo: 0x80, hi: 0x95}, + {value: 0x0818, lo: 0x96, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0x9e}, + {value: 0x0018, lo: 0x9f, hi: 0x9f}, + {value: 0x0808, lo: 0xa0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbe}, + {value: 0x0818, lo: 0xbf, hi: 0xbf}, + // Block 0x9e, offset 0x4c1 + {value: 0x0000, lo: 0x04}, + {value: 0x0808, lo: 0x80, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbb}, + {value: 0x0818, lo: 0xbc, hi: 0xbd}, + {value: 0x0808, lo: 0xbe, hi: 0xbf}, + // Block 0x9f, offset 0x4c6 + {value: 0x0000, lo: 0x03}, + {value: 0x0818, lo: 0x80, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x91}, + {value: 0x0818, lo: 0x92, hi: 0xbf}, + // Block 0xa0, offset 0x4ca + {value: 0x0000, lo: 0x0f}, + {value: 0x0808, lo: 0x80, hi: 0x80}, + {value: 0x3308, lo: 0x81, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x84}, + {value: 0x3308, lo: 0x85, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x8b}, + {value: 0x3308, lo: 0x8c, hi: 0x8f}, + {value: 0x0808, lo: 0x90, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x94}, + {value: 0x0808, lo: 0x95, hi: 0x97}, + {value: 0x0040, lo: 0x98, hi: 0x98}, + {value: 0x0808, lo: 0x99, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xb7}, + {value: 0x3308, lo: 0xb8, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0xa1, offset 0x4da + {value: 0x0000, lo: 0x06}, + {value: 0x0818, lo: 0x80, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0818, lo: 0x90, hi: 0x98}, + {value: 0x0040, lo: 0x99, hi: 0x9f}, + {value: 0x0808, lo: 0xa0, hi: 0xbc}, + {value: 0x0818, lo: 0xbd, hi: 0xbf}, + // Block 0xa2, offset 0x4e1 + {value: 0x0000, lo: 0x03}, + {value: 0x0808, lo: 0x80, hi: 0x9c}, + {value: 0x0818, lo: 0x9d, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0xa3, offset 0x4e5 + {value: 0x0000, lo: 0x03}, + {value: 0x0808, lo: 0x80, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb8}, + {value: 0x0018, lo: 0xb9, hi: 0xbf}, + // Block 0xa4, offset 0x4e9 + {value: 0x0000, lo: 0x06}, + {value: 0x0808, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x97}, + {value: 0x0818, lo: 0x98, hi: 0x9f}, + {value: 0x0808, lo: 0xa0, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xb7}, + {value: 0x0818, lo: 0xb8, hi: 0xbf}, + // Block 0xa5, offset 0x4f0 + {value: 0x0000, lo: 0x01}, + {value: 0x0808, lo: 0x80, hi: 0xbf}, + // Block 0xa6, offset 0x4f2 + {value: 0x0000, lo: 0x02}, + {value: 0x0808, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0xbf}, + // Block 0xa7, offset 0x4f5 + {value: 0x0000, lo: 0x02}, + {value: 0x03dd, lo: 0x80, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xbf}, + // Block 0xa8, offset 0x4f8 + {value: 0x0000, lo: 0x03}, + {value: 0x0808, lo: 0x80, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xb9}, + {value: 0x0818, lo: 0xba, hi: 0xbf}, + // Block 0xa9, offset 0x4fc + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0818, lo: 0xa0, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xaa, offset 0x500 + {value: 0x0000, lo: 0x05}, + {value: 0x3008, lo: 0x80, hi: 0x80}, + {value: 0x3308, lo: 0x81, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xb7}, + {value: 0x3308, lo: 0xb8, hi: 0xbf}, + // Block 0xab, offset 0x506 + {value: 0x0000, lo: 0x08}, + {value: 0x3308, lo: 0x80, hi: 0x85}, + {value: 0x3b08, lo: 0x86, hi: 0x86}, + {value: 0x0018, lo: 0x87, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x91}, + {value: 0x0018, lo: 0x92, hi: 0xa5}, + {value: 0x0008, lo: 0xa6, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0xac, offset 0x50f + {value: 0x0000, lo: 0x0b}, + {value: 0x3308, lo: 0x80, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xaf}, + {value: 0x3008, lo: 0xb0, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb6}, + {value: 0x3008, lo: 0xb7, hi: 0xb8}, + {value: 0x3b08, lo: 0xb9, hi: 0xb9}, + {value: 0x3308, lo: 0xba, hi: 0xba}, + {value: 0x0018, lo: 0xbb, hi: 0xbc}, + {value: 0x0340, lo: 0xbd, hi: 0xbd}, + {value: 0x0018, lo: 0xbe, hi: 0xbf}, + // Block 0xad, offset 0x51b + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x81}, + {value: 0x0040, lo: 0x82, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xa8}, + {value: 0x0040, lo: 0xa9, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0xae, offset 0x522 + {value: 0x0000, lo: 0x08}, + {value: 0x3308, lo: 0x80, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xa6}, + {value: 0x3308, lo: 0xa7, hi: 0xab}, + {value: 0x3008, lo: 0xac, hi: 0xac}, + {value: 0x3308, lo: 0xad, hi: 0xb2}, + {value: 0x3b08, lo: 0xb3, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xb5}, + {value: 0x0008, lo: 0xb6, hi: 0xbf}, + // Block 0xaf, offset 0x52b + {value: 0x0000, lo: 0x07}, + {value: 0x0018, lo: 0x80, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb3}, + {value: 0x0018, lo: 0xb4, hi: 0xb5}, + {value: 0x0008, lo: 0xb6, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0xb0, offset 0x533 + {value: 0x0000, lo: 0x06}, + {value: 0x3308, lo: 0x80, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xb2}, + {value: 0x3008, lo: 0xb3, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xbe}, + {value: 0x3008, lo: 0xbf, hi: 0xbf}, + // Block 0xb1, offset 0x53a + {value: 0x0000, lo: 0x0d}, + {value: 0x3808, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0x84}, + {value: 0x0018, lo: 0x85, hi: 0x89}, + {value: 0x3308, lo: 0x8a, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9b}, + {value: 0x0008, lo: 0x9c, hi: 0x9c}, + {value: 0x0018, lo: 0x9d, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xa0}, + {value: 0x0018, lo: 0xa1, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0xb2, offset 0x548 + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x91}, + {value: 0x0040, lo: 0x92, hi: 0x92}, + {value: 0x0008, lo: 0x93, hi: 0xab}, + {value: 0x3008, lo: 0xac, hi: 0xae}, + {value: 0x3308, lo: 0xaf, hi: 0xb1}, + {value: 0x3008, lo: 0xb2, hi: 0xb3}, + {value: 0x3308, lo: 0xb4, hi: 0xb4}, + {value: 0x3808, lo: 0xb5, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xb7}, + {value: 0x0018, lo: 0xb8, hi: 0xbd}, + {value: 0x3308, lo: 0xbe, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xb3, offset 0x555 + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0008, lo: 0x8a, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8e}, + {value: 0x0008, lo: 0x8f, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9e}, + {value: 0x0008, lo: 0x9f, hi: 0xa8}, + {value: 0x0018, lo: 0xa9, hi: 0xa9}, + {value: 0x0040, lo: 0xaa, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0xb4, offset 0x562 + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0x9e}, + {value: 0x3308, lo: 0x9f, hi: 0x9f}, + {value: 0x3008, lo: 0xa0, hi: 0xa2}, + {value: 0x3308, lo: 0xa3, hi: 0xa9}, + {value: 0x3b08, lo: 0xaa, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0xb5, offset 0x56b + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xb4}, + {value: 0x3008, lo: 0xb5, hi: 0xb7}, + {value: 0x3308, lo: 0xb8, hi: 0xbf}, + // Block 0xb6, offset 0x56f + {value: 0x0000, lo: 0x0d}, + {value: 0x3008, lo: 0x80, hi: 0x81}, + {value: 0x3b08, lo: 0x82, hi: 0x82}, + {value: 0x3308, lo: 0x83, hi: 0x84}, + {value: 0x3008, lo: 0x85, hi: 0x85}, + {value: 0x3308, lo: 0x86, hi: 0x86}, + {value: 0x0008, lo: 0x87, hi: 0x8a}, + {value: 0x0018, lo: 0x8b, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0x9c}, + {value: 0x0018, lo: 0x9d, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0xbf}, + // Block 0xb7, offset 0x57d + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x3008, lo: 0xb0, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb8}, + {value: 0x3008, lo: 0xb9, hi: 0xb9}, + {value: 0x3308, lo: 0xba, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbe}, + {value: 0x3308, lo: 0xbf, hi: 0xbf}, + // Block 0xb8, offset 0x585 + {value: 0x0000, lo: 0x0a}, + {value: 0x3308, lo: 0x80, hi: 0x80}, + {value: 0x3008, lo: 0x81, hi: 0x81}, + {value: 0x3b08, lo: 0x82, hi: 0x82}, + {value: 0x3308, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x85}, + {value: 0x0018, lo: 0x86, hi: 0x86}, + {value: 0x0008, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0xbf}, + // Block 0xb9, offset 0x590 + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0xae}, + {value: 0x3008, lo: 0xaf, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb7}, + {value: 0x3008, lo: 0xb8, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0xba, offset 0x599 + {value: 0x0000, lo: 0x05}, + {value: 0x3308, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0x9b}, + {value: 0x3308, lo: 0x9c, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0xbf}, + // Block 0xbb, offset 0x59f + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x3008, lo: 0xb0, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbc}, + {value: 0x3308, lo: 0xbd, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0xbc, offset 0x5a7 + {value: 0x0000, lo: 0x08}, + {value: 0x3308, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x84}, + {value: 0x0040, lo: 0x85, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xbf}, + // Block 0xbd, offset 0x5b0 + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0xaa}, + {value: 0x3308, lo: 0xab, hi: 0xab}, + {value: 0x3008, lo: 0xac, hi: 0xac}, + {value: 0x3308, lo: 0xad, hi: 0xad}, + {value: 0x3008, lo: 0xae, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb5}, + {value: 0x3808, lo: 0xb6, hi: 0xb6}, + {value: 0x3308, lo: 0xb7, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbf}, + // Block 0xbe, offset 0x5ba + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0xbf}, + // Block 0xbf, offset 0x5bd + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9c}, + {value: 0x3308, lo: 0x9d, hi: 0x9f}, + {value: 0x3008, lo: 0xa0, hi: 0xa1}, + {value: 0x3308, lo: 0xa2, hi: 0xa5}, + {value: 0x3008, lo: 0xa6, hi: 0xa6}, + {value: 0x3308, lo: 0xa7, hi: 0xaa}, + {value: 0x3b08, lo: 0xab, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0018, lo: 0xba, hi: 0xbf}, + // Block 0xc0, offset 0x5c9 + {value: 0x0000, lo: 0x02}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x049d, lo: 0xa0, hi: 0xbf}, + // Block 0xc1, offset 0x5cc + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xa9}, + {value: 0x0018, lo: 0xaa, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xbe}, + {value: 0x0008, lo: 0xbf, hi: 0xbf}, + // Block 0xc2, offset 0x5d1 + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x3308, lo: 0x81, hi: 0x86}, + {value: 0x3008, lo: 0x87, hi: 0x88}, + {value: 0x3308, lo: 0x89, hi: 0x8a}, + {value: 0x0008, lo: 0x8b, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb3}, + {value: 0x3b08, lo: 0xb4, hi: 0xb4}, + {value: 0x3308, lo: 0xb5, hi: 0xb8}, + {value: 0x3008, lo: 0xb9, hi: 0xb9}, + {value: 0x0008, lo: 0xba, hi: 0xba}, + {value: 0x3308, lo: 0xbb, hi: 0xbe}, + {value: 0x0018, lo: 0xbf, hi: 0xbf}, + // Block 0xc3, offset 0x5de + {value: 0x0000, lo: 0x08}, + {value: 0x0018, lo: 0x80, hi: 0x86}, + {value: 0x3b08, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x90}, + {value: 0x3308, lo: 0x91, hi: 0x96}, + {value: 0x3008, lo: 0x97, hi: 0x98}, + {value: 0x3308, lo: 0x99, hi: 0x9b}, + {value: 0x0008, lo: 0x9c, hi: 0xbf}, + // Block 0xc4, offset 0x5e7 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x85}, + {value: 0x0008, lo: 0x86, hi: 0x89}, + {value: 0x3308, lo: 0x8a, hi: 0x96}, + {value: 0x3008, lo: 0x97, hi: 0x97}, + {value: 0x3308, lo: 0x98, hi: 0x98}, + {value: 0x3b08, lo: 0x99, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0x9c}, + {value: 0x0040, lo: 0x9d, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0xa2}, + {value: 0x0040, lo: 0xa3, hi: 0xbf}, + // Block 0xc5, offset 0x5f3 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbf}, + // Block 0xc6, offset 0x5f6 + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0008, lo: 0x8a, hi: 0xae}, + {value: 0x3008, lo: 0xaf, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xb7}, + {value: 0x3308, lo: 0xb8, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0xc7, offset 0x600 + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xbf}, + // Block 0xc8, offset 0x609 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x91}, + {value: 0x3308, lo: 0x92, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xa8}, + {value: 0x3008, lo: 0xa9, hi: 0xa9}, + {value: 0x3308, lo: 0xaa, hi: 0xb0}, + {value: 0x3008, lo: 0xb1, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb3}, + {value: 0x3008, lo: 0xb4, hi: 0xb4}, + {value: 0x3308, lo: 0xb5, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0xc9, offset 0x615 + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0x8a}, + {value: 0x0008, lo: 0x8b, hi: 0xb0}, + {value: 0x3308, lo: 0xb1, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xb9}, + {value: 0x3308, lo: 0xba, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbe}, + {value: 0x3308, lo: 0xbf, hi: 0xbf}, + // Block 0xca, offset 0x622 + {value: 0x0000, lo: 0x07}, + {value: 0x3308, lo: 0x80, hi: 0x83}, + {value: 0x3b08, lo: 0x84, hi: 0x85}, + {value: 0x0008, lo: 0x86, hi: 0x86}, + {value: 0x3308, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0xbf}, + // Block 0xcb, offset 0x62a + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0xbf}, + // Block 0xcc, offset 0x62d + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0xcd, offset 0x632 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0xbf}, + // Block 0xce, offset 0x635 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xbf}, + // Block 0xcf, offset 0x638 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0xbf}, + // Block 0xd0, offset 0x63b + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa9}, + {value: 0x0040, lo: 0xaa, hi: 0xad}, + {value: 0x0018, lo: 0xae, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0xd1, offset 0x642 + {value: 0x0000, lo: 0x06}, + {value: 0x0040, lo: 0x80, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb4}, + {value: 0x0018, lo: 0xb5, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xbf}, + // Block 0xd2, offset 0x649 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xbf}, + // Block 0xd3, offset 0x64d + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x83}, + {value: 0x0018, lo: 0x84, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0xa1}, + {value: 0x0040, lo: 0xa2, hi: 0xa2}, + {value: 0x0008, lo: 0xa3, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbf}, + // Block 0xd4, offset 0x658 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0xbf}, + // Block 0xd5, offset 0x65b + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x84}, + {value: 0x0040, lo: 0x85, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x90}, + {value: 0x3008, lo: 0x91, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xd6, offset 0x661 + {value: 0x0000, lo: 0x04}, + {value: 0x0040, lo: 0x80, hi: 0x8e}, + {value: 0x3308, lo: 0x8f, hi: 0x92}, + {value: 0x0008, lo: 0x93, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0xd7, offset 0x666 + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa1}, + {value: 0x0040, lo: 0xa2, hi: 0xbf}, + // Block 0xd8, offset 0x66a + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xbf}, + // Block 0xd9, offset 0x66d + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xbf}, + // Block 0xda, offset 0x670 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0xbf}, + // Block 0xdb, offset 0x673 + {value: 0x0000, lo: 0x02}, + {value: 0x0040, lo: 0x80, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0xdc, offset 0x676 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0xdd, offset 0x679 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbf}, + // Block 0xde, offset 0x67e + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9b}, + {value: 0x0018, lo: 0x9c, hi: 0x9c}, + {value: 0x3308, lo: 0x9d, hi: 0x9e}, + {value: 0x0018, lo: 0x9f, hi: 0x9f}, + {value: 0x03c0, lo: 0xa0, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xbf}, + // Block 0xdf, offset 0x688 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xbf}, + // Block 0xe0, offset 0x68b + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xa8}, + {value: 0x0018, lo: 0xa9, hi: 0xbf}, + // Block 0xe1, offset 0x68f + {value: 0x0000, lo: 0x0e}, + {value: 0x0018, lo: 0x80, hi: 0x9d}, + {value: 0xb5b9, lo: 0x9e, hi: 0x9e}, + {value: 0xb601, lo: 0x9f, hi: 0x9f}, + {value: 0xb649, lo: 0xa0, hi: 0xa0}, + {value: 0xb6b1, lo: 0xa1, hi: 0xa1}, + {value: 0xb719, lo: 0xa2, hi: 0xa2}, + {value: 0xb781, lo: 0xa3, hi: 0xa3}, + {value: 0xb7e9, lo: 0xa4, hi: 0xa4}, + {value: 0x3018, lo: 0xa5, hi: 0xa6}, + {value: 0x3318, lo: 0xa7, hi: 0xa9}, + {value: 0x0018, lo: 0xaa, hi: 0xac}, + {value: 0x3018, lo: 0xad, hi: 0xb2}, + {value: 0x0340, lo: 0xb3, hi: 0xba}, + {value: 0x3318, lo: 0xbb, hi: 0xbf}, + // Block 0xe2, offset 0x69e + {value: 0x0000, lo: 0x0b}, + {value: 0x3318, lo: 0x80, hi: 0x82}, + {value: 0x0018, lo: 0x83, hi: 0x84}, + {value: 0x3318, lo: 0x85, hi: 0x8b}, + {value: 0x0018, lo: 0x8c, hi: 0xa9}, + {value: 0x3318, lo: 0xaa, hi: 0xad}, + {value: 0x0018, lo: 0xae, hi: 0xba}, + {value: 0xb851, lo: 0xbb, hi: 0xbb}, + {value: 0xb899, lo: 0xbc, hi: 0xbc}, + {value: 0xb8e1, lo: 0xbd, hi: 0xbd}, + {value: 0xb949, lo: 0xbe, hi: 0xbe}, + {value: 0xb9b1, lo: 0xbf, hi: 0xbf}, + // Block 0xe3, offset 0x6aa + {value: 0x0000, lo: 0x03}, + {value: 0xba19, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0xa8}, + {value: 0x0040, lo: 0xa9, hi: 0xbf}, + // Block 0xe4, offset 0x6ae + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x81}, + {value: 0x3318, lo: 0x82, hi: 0x84}, + {value: 0x0018, lo: 0x85, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0xbf}, + // Block 0xe5, offset 0x6b3 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xbf}, + // Block 0xe6, offset 0x6b8 + {value: 0x0000, lo: 0x03}, + {value: 0x3308, lo: 0x80, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xba}, + {value: 0x3308, lo: 0xbb, hi: 0xbf}, + // Block 0xe7, offset 0x6bc + {value: 0x0000, lo: 0x04}, + {value: 0x3308, lo: 0x80, hi: 0xac}, + {value: 0x0018, lo: 0xad, hi: 0xb4}, + {value: 0x3308, lo: 0xb5, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xbf}, + // Block 0xe8, offset 0x6c1 + {value: 0x0000, lo: 0x08}, + {value: 0x0018, lo: 0x80, hi: 0x83}, + {value: 0x3308, lo: 0x84, hi: 0x84}, + {value: 0x0018, lo: 0x85, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x9a}, + {value: 0x3308, lo: 0x9b, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xa0}, + {value: 0x3308, lo: 0xa1, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0xe9, offset 0x6ca + {value: 0x0000, lo: 0x0a}, + {value: 0x3308, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x87}, + {value: 0x3308, lo: 0x88, hi: 0x98}, + {value: 0x0040, lo: 0x99, hi: 0x9a}, + {value: 0x3308, lo: 0x9b, hi: 0xa1}, + {value: 0x0040, lo: 0xa2, hi: 0xa2}, + {value: 0x3308, lo: 0xa3, hi: 0xa4}, + {value: 0x0040, lo: 0xa5, hi: 0xa5}, + {value: 0x3308, lo: 0xa6, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xbf}, + // Block 0xea, offset 0x6d5 + {value: 0x0000, lo: 0x05}, + {value: 0x0808, lo: 0x80, hi: 0x84}, + {value: 0x0040, lo: 0x85, hi: 0x86}, + {value: 0x0818, lo: 0x87, hi: 0x8f}, + {value: 0x3308, lo: 0x90, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0xbf}, + // Block 0xeb, offset 0x6db + {value: 0x0000, lo: 0x07}, + {value: 0x0a08, lo: 0x80, hi: 0x83}, + {value: 0x3308, lo: 0x84, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8f}, + {value: 0x0808, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9d}, + {value: 0x0818, lo: 0x9e, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0xec, offset 0x6e3 + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xbf}, + // Block 0xed, offset 0x6e7 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbf}, + // Block 0xee, offset 0x6eb + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xb0}, + {value: 0x0018, lo: 0xb1, hi: 0xbf}, + // Block 0xef, offset 0x6f1 + {value: 0x0000, lo: 0x05}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x90}, + {value: 0x0018, lo: 0x91, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xbf}, + // Block 0xf0, offset 0x6f7 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x8f}, + {value: 0xc1c1, lo: 0x90, hi: 0x90}, + {value: 0x0018, lo: 0x91, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xbf}, + // Block 0xf1, offset 0x6fc + {value: 0x0000, lo: 0x02}, + {value: 0x0040, lo: 0x80, hi: 0xa5}, + {value: 0x0018, lo: 0xa6, hi: 0xbf}, + // Block 0xf2, offset 0x6ff + {value: 0x0000, lo: 0x0f}, + {value: 0xc7e9, lo: 0x80, hi: 0x80}, + {value: 0xc839, lo: 0x81, hi: 0x81}, + {value: 0xc889, lo: 0x82, hi: 0x82}, + {value: 0xc8d9, lo: 0x83, hi: 0x83}, + {value: 0xc929, lo: 0x84, hi: 0x84}, + {value: 0xc979, lo: 0x85, hi: 0x85}, + {value: 0xc9c9, lo: 0x86, hi: 0x86}, + {value: 0xca19, lo: 0x87, hi: 0x87}, + {value: 0xca69, lo: 0x88, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x8f}, + {value: 0xcab9, lo: 0x90, hi: 0x90}, + {value: 0xcad9, lo: 0x91, hi: 0x91}, + {value: 0x0040, lo: 0x92, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa5}, + {value: 0x0040, lo: 0xa6, hi: 0xbf}, + // Block 0xf3, offset 0x70f + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x94}, + {value: 0x0040, lo: 0x95, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbf}, + // Block 0xf4, offset 0x716 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xbf}, + // Block 0xf5, offset 0x719 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x94}, + {value: 0x0040, lo: 0x95, hi: 0xbf}, + // Block 0xf6, offset 0x71c + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbf}, + // Block 0xf7, offset 0x720 + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xbf}, + // Block 0xf8, offset 0x726 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xbf}, + // Block 0xf9, offset 0x72b + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xfa, offset 0x730 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xbf}, + // Block 0xfb, offset 0x735 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x97}, + {value: 0x0040, lo: 0x98, hi: 0xbf}, + // Block 0xfc, offset 0x738 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x80}, + {value: 0x0040, lo: 0x81, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xbf}, + // Block 0xfd, offset 0x73d + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0xbf}, + // Block 0xfe, offset 0x740 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0xff, offset 0x743 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x100, offset 0x747 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xa1}, + {value: 0x0040, lo: 0xa2, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x101, offset 0x74b + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xa0}, + {value: 0x0040, lo: 0xa1, hi: 0xbf}, + // Block 0x102, offset 0x74e + {value: 0x0020, lo: 0x0f}, + {value: 0xdeb9, lo: 0x80, hi: 0x89}, + {value: 0x8dfd, lo: 0x8a, hi: 0x8a}, + {value: 0xdff9, lo: 0x8b, hi: 0x9c}, + {value: 0x8e1d, lo: 0x9d, hi: 0x9d}, + {value: 0xe239, lo: 0x9e, hi: 0xa2}, + {value: 0x8e3d, lo: 0xa3, hi: 0xa3}, + {value: 0xe2d9, lo: 0xa4, hi: 0xab}, + {value: 0x7ed5, lo: 0xac, hi: 0xac}, + {value: 0xe3d9, lo: 0xad, hi: 0xaf}, + {value: 0x8e5d, lo: 0xb0, hi: 0xb0}, + {value: 0xe439, lo: 0xb1, hi: 0xb6}, + {value: 0x8e7d, lo: 0xb7, hi: 0xb9}, + {value: 0xe4f9, lo: 0xba, hi: 0xba}, + {value: 0x8edd, lo: 0xbb, hi: 0xbb}, + {value: 0xe519, lo: 0xbc, hi: 0xbf}, + // Block 0x103, offset 0x75e + {value: 0x0020, lo: 0x10}, + {value: 0x937d, lo: 0x80, hi: 0x80}, + {value: 0xf099, lo: 0x81, hi: 0x86}, + {value: 0x939d, lo: 0x87, hi: 0x8a}, + {value: 0xd9f9, lo: 0x8b, hi: 0x8b}, + {value: 0xf159, lo: 0x8c, hi: 0x96}, + {value: 0x941d, lo: 0x97, hi: 0x97}, + {value: 0xf2b9, lo: 0x98, hi: 0xa3}, + {value: 0x943d, lo: 0xa4, hi: 0xa6}, + {value: 0xf439, lo: 0xa7, hi: 0xaa}, + {value: 0x949d, lo: 0xab, hi: 0xab}, + {value: 0xf4b9, lo: 0xac, hi: 0xac}, + {value: 0x94bd, lo: 0xad, hi: 0xad}, + {value: 0xf4d9, lo: 0xae, hi: 0xaf}, + {value: 0x94dd, lo: 0xb0, hi: 0xb1}, + {value: 0xf519, lo: 0xb2, hi: 0xbe}, + {value: 0x2040, lo: 0xbf, hi: 0xbf}, + // Block 0x104, offset 0x76f + {value: 0x0000, lo: 0x04}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0340, lo: 0x81, hi: 0x81}, + {value: 0x0040, lo: 0x82, hi: 0x9f}, + {value: 0x0340, lo: 0xa0, hi: 0xbf}, + // Block 0x105, offset 0x774 + {value: 0x0000, lo: 0x01}, + {value: 0x0340, lo: 0x80, hi: 0xbf}, + // Block 0x106, offset 0x776 + {value: 0x0000, lo: 0x01}, + {value: 0x33c0, lo: 0x80, hi: 0xbf}, + // Block 0x107, offset 0x778 + {value: 0x0000, lo: 0x02}, + {value: 0x33c0, lo: 0x80, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, +} + +// Total table size 42115 bytes (41KiB); checksum: F4A1FA4E diff --git a/api/vendor/golang.org/x/net/idna/trie.go b/api/vendor/golang.org/x/net/idna/trie.go new file mode 100644 index 0000000..c4ef847 --- /dev/null +++ b/api/vendor/golang.org/x/net/idna/trie.go @@ -0,0 +1,72 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +// 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 idna + +// appendMapping appends the mapping for the respective rune. isMapped must be +// true. A mapping is a categorization of a rune as defined in UTS #46. +func (c info) appendMapping(b []byte, s string) []byte { + index := int(c >> indexShift) + if c&xorBit == 0 { + s := mappings[index:] + return append(b, s[1:s[0]+1]...) + } + b = append(b, s...) + if c&inlineXOR == inlineXOR { + // TODO: support and handle two-byte inline masks + b[len(b)-1] ^= byte(index) + } else { + for p := len(b) - int(xorData[index]); p < len(b); p++ { + index++ + b[p] ^= xorData[index] + } + } + return b +} + +// Sparse block handling code. + +type valueRange struct { + value uint16 // header: value:stride + lo, hi byte // header: lo:n +} + +type sparseBlocks struct { + values []valueRange + offset []uint16 +} + +var idnaSparse = sparseBlocks{ + values: idnaSparseValues[:], + offset: idnaSparseOffset[:], +} + +// Don't use newIdnaTrie to avoid unconditional linking in of the table. +var trie = &idnaTrie{} + +// lookup determines the type of block n and looks up the value for b. +// For n < t.cutoff, the block is a simple lookup table. Otherwise, the block +// is a list of ranges with an accompanying value. Given a matching range r, +// the value for b is by r.value + (b - r.lo) * stride. +func (t *sparseBlocks) lookup(n uint32, b byte) uint16 { + offset := t.offset[n] + header := t.values[offset] + lo := offset + 1 + hi := lo + uint16(header.lo) + for lo < hi { + m := lo + (hi-lo)/2 + r := t.values[m] + if r.lo <= b && b <= r.hi { + return r.value + uint16(b-r.lo)*header.value + } + if b < r.lo { + hi = m + } else { + lo = m + 1 + } + } + return 0 +} diff --git a/api/vendor/golang.org/x/net/idna/trieval.go b/api/vendor/golang.org/x/net/idna/trieval.go new file mode 100644 index 0000000..7a8cf88 --- /dev/null +++ b/api/vendor/golang.org/x/net/idna/trieval.go @@ -0,0 +1,119 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +package idna + +// This file contains definitions for interpreting the trie value of the idna +// trie generated by "go run gen*.go". It is shared by both the generator +// program and the resultant package. Sharing is achieved by the generator +// copying gen_trieval.go to trieval.go and changing what's above this comment. + +// info holds information from the IDNA mapping table for a single rune. It is +// the value returned by a trie lookup. In most cases, all information fits in +// a 16-bit value. For mappings, this value may contain an index into a slice +// with the mapped string. Such mappings can consist of the actual mapped value +// or an XOR pattern to be applied to the bytes of the UTF8 encoding of the +// input rune. This technique is used by the cases packages and reduces the +// table size significantly. +// +// The per-rune values have the following format: +// +// if mapped { +// if inlinedXOR { +// 15..13 inline XOR marker +// 12..11 unused +// 10..3 inline XOR mask +// } else { +// 15..3 index into xor or mapping table +// } +// } else { +// 15..14 unused +// 13 mayNeedNorm +// 12..11 attributes +// 10..8 joining type +// 7..3 category type +// } +// 2 use xor pattern +// 1..0 mapped category +// +// See the definitions below for a more detailed description of the various +// bits. +type info uint16 + +const ( + catSmallMask = 0x3 + catBigMask = 0xF8 + indexShift = 3 + xorBit = 0x4 // interpret the index as an xor pattern + inlineXOR = 0xE000 // These bits are set if the XOR pattern is inlined. + + joinShift = 8 + joinMask = 0x07 + + // Attributes + attributesMask = 0x1800 + viramaModifier = 0x1800 + modifier = 0x1000 + rtl = 0x0800 + + mayNeedNorm = 0x2000 +) + +// A category corresponds to a category defined in the IDNA mapping table. +type category uint16 + +const ( + unknown category = 0 // not currently defined in unicode. + mapped category = 1 + disallowedSTD3Mapped category = 2 + deviation category = 3 +) + +const ( + valid category = 0x08 + validNV8 category = 0x18 + validXV8 category = 0x28 + disallowed category = 0x40 + disallowedSTD3Valid category = 0x80 + ignored category = 0xC0 +) + +// join types and additional rune information +const ( + joiningL = (iota + 1) + joiningD + joiningT + joiningR + + //the following types are derived during processing + joinZWJ + joinZWNJ + joinVirama + numJoinTypes +) + +func (c info) isMapped() bool { + return c&0x3 != 0 +} + +func (c info) category() category { + small := c & catSmallMask + if small != 0 { + return category(small) + } + return category(c & catBigMask) +} + +func (c info) joinType() info { + if c.isMapped() { + return 0 + } + return (c >> joinShift) & joinMask +} + +func (c info) isModifier() bool { + return c&(modifier|catSmallMask) == modifier +} + +func (c info) isViramaModifier() bool { + return c&(attributesMask|catSmallMask) == viramaModifier +} diff --git a/api/vendor/golang.org/x/net/internal/iana/const.go b/api/vendor/golang.org/x/net/internal/iana/const.go new file mode 100644 index 0000000..cea712f --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/iana/const.go @@ -0,0 +1,223 @@ +// go generate gen.go +// Code generated by the command above; DO NOT EDIT. + +// Package iana provides protocol number resources managed by the Internet Assigned Numbers Authority (IANA). +package iana // import "golang.org/x/net/internal/iana" + +// Differentiated Services Field Codepoints (DSCP), Updated: 2018-05-04 +const ( + DiffServCS0 = 0x00 // CS0 + DiffServCS1 = 0x20 // CS1 + DiffServCS2 = 0x40 // CS2 + DiffServCS3 = 0x60 // CS3 + DiffServCS4 = 0x80 // CS4 + DiffServCS5 = 0xa0 // CS5 + DiffServCS6 = 0xc0 // CS6 + DiffServCS7 = 0xe0 // CS7 + DiffServAF11 = 0x28 // AF11 + DiffServAF12 = 0x30 // AF12 + DiffServAF13 = 0x38 // AF13 + DiffServAF21 = 0x48 // AF21 + DiffServAF22 = 0x50 // AF22 + DiffServAF23 = 0x58 // AF23 + DiffServAF31 = 0x68 // AF31 + DiffServAF32 = 0x70 // AF32 + DiffServAF33 = 0x78 // AF33 + DiffServAF41 = 0x88 // AF41 + DiffServAF42 = 0x90 // AF42 + DiffServAF43 = 0x98 // AF43 + DiffServEF = 0xb8 // EF + DiffServVOICEADMIT = 0xb0 // VOICE-ADMIT + NotECNTransport = 0x00 // Not-ECT (Not ECN-Capable Transport) + ECNTransport1 = 0x01 // ECT(1) (ECN-Capable Transport(1)) + ECNTransport0 = 0x02 // ECT(0) (ECN-Capable Transport(0)) + CongestionExperienced = 0x03 // CE (Congestion Experienced) +) + +// Protocol Numbers, Updated: 2017-10-13 +const ( + ProtocolIP = 0 // IPv4 encapsulation, pseudo protocol number + ProtocolHOPOPT = 0 // IPv6 Hop-by-Hop Option + ProtocolICMP = 1 // Internet Control Message + ProtocolIGMP = 2 // Internet Group Management + ProtocolGGP = 3 // Gateway-to-Gateway + ProtocolIPv4 = 4 // IPv4 encapsulation + ProtocolST = 5 // Stream + ProtocolTCP = 6 // Transmission Control + ProtocolCBT = 7 // CBT + ProtocolEGP = 8 // Exterior Gateway Protocol + ProtocolIGP = 9 // any private interior gateway (used by Cisco for their IGRP) + ProtocolBBNRCCMON = 10 // BBN RCC Monitoring + ProtocolNVPII = 11 // Network Voice Protocol + ProtocolPUP = 12 // PUP + ProtocolEMCON = 14 // EMCON + ProtocolXNET = 15 // Cross Net Debugger + ProtocolCHAOS = 16 // Chaos + ProtocolUDP = 17 // User Datagram + ProtocolMUX = 18 // Multiplexing + ProtocolDCNMEAS = 19 // DCN Measurement Subsystems + ProtocolHMP = 20 // Host Monitoring + ProtocolPRM = 21 // Packet Radio Measurement + ProtocolXNSIDP = 22 // XEROX NS IDP + ProtocolTRUNK1 = 23 // Trunk-1 + ProtocolTRUNK2 = 24 // Trunk-2 + ProtocolLEAF1 = 25 // Leaf-1 + ProtocolLEAF2 = 26 // Leaf-2 + ProtocolRDP = 27 // Reliable Data Protocol + ProtocolIRTP = 28 // Internet Reliable Transaction + ProtocolISOTP4 = 29 // ISO Transport Protocol Class 4 + ProtocolNETBLT = 30 // Bulk Data Transfer Protocol + ProtocolMFENSP = 31 // MFE Network Services Protocol + ProtocolMERITINP = 32 // MERIT Internodal Protocol + ProtocolDCCP = 33 // Datagram Congestion Control Protocol + Protocol3PC = 34 // Third Party Connect Protocol + ProtocolIDPR = 35 // Inter-Domain Policy Routing Protocol + ProtocolXTP = 36 // XTP + ProtocolDDP = 37 // Datagram Delivery Protocol + ProtocolIDPRCMTP = 38 // IDPR Control Message Transport Proto + ProtocolTPPP = 39 // TP++ Transport Protocol + ProtocolIL = 40 // IL Transport Protocol + ProtocolIPv6 = 41 // IPv6 encapsulation + ProtocolSDRP = 42 // Source Demand Routing Protocol + ProtocolIPv6Route = 43 // Routing Header for IPv6 + ProtocolIPv6Frag = 44 // Fragment Header for IPv6 + ProtocolIDRP = 45 // Inter-Domain Routing Protocol + ProtocolRSVP = 46 // Reservation Protocol + ProtocolGRE = 47 // Generic Routing Encapsulation + ProtocolDSR = 48 // Dynamic Source Routing Protocol + ProtocolBNA = 49 // BNA + ProtocolESP = 50 // Encap Security Payload + ProtocolAH = 51 // Authentication Header + ProtocolINLSP = 52 // Integrated Net Layer Security TUBA + ProtocolNARP = 54 // NBMA Address Resolution Protocol + ProtocolMOBILE = 55 // IP Mobility + ProtocolTLSP = 56 // Transport Layer Security Protocol using Kryptonet key management + ProtocolSKIP = 57 // SKIP + ProtocolIPv6ICMP = 58 // ICMP for IPv6 + ProtocolIPv6NoNxt = 59 // No Next Header for IPv6 + ProtocolIPv6Opts = 60 // Destination Options for IPv6 + ProtocolCFTP = 62 // CFTP + ProtocolSATEXPAK = 64 // SATNET and Backroom EXPAK + ProtocolKRYPTOLAN = 65 // Kryptolan + ProtocolRVD = 66 // MIT Remote Virtual Disk Protocol + ProtocolIPPC = 67 // Internet Pluribus Packet Core + ProtocolSATMON = 69 // SATNET Monitoring + ProtocolVISA = 70 // VISA Protocol + ProtocolIPCV = 71 // Internet Packet Core Utility + ProtocolCPNX = 72 // Computer Protocol Network Executive + ProtocolCPHB = 73 // Computer Protocol Heart Beat + ProtocolWSN = 74 // Wang Span Network + ProtocolPVP = 75 // Packet Video Protocol + ProtocolBRSATMON = 76 // Backroom SATNET Monitoring + ProtocolSUNND = 77 // SUN ND PROTOCOL-Temporary + ProtocolWBMON = 78 // WIDEBAND Monitoring + ProtocolWBEXPAK = 79 // WIDEBAND EXPAK + ProtocolISOIP = 80 // ISO Internet Protocol + ProtocolVMTP = 81 // VMTP + ProtocolSECUREVMTP = 82 // SECURE-VMTP + ProtocolVINES = 83 // VINES + ProtocolTTP = 84 // Transaction Transport Protocol + ProtocolIPTM = 84 // Internet Protocol Traffic Manager + ProtocolNSFNETIGP = 85 // NSFNET-IGP + ProtocolDGP = 86 // Dissimilar Gateway Protocol + ProtocolTCF = 87 // TCF + ProtocolEIGRP = 88 // EIGRP + ProtocolOSPFIGP = 89 // OSPFIGP + ProtocolSpriteRPC = 90 // Sprite RPC Protocol + ProtocolLARP = 91 // Locus Address Resolution Protocol + ProtocolMTP = 92 // Multicast Transport Protocol + ProtocolAX25 = 93 // AX.25 Frames + ProtocolIPIP = 94 // IP-within-IP Encapsulation Protocol + ProtocolSCCSP = 96 // Semaphore Communications Sec. Pro. + ProtocolETHERIP = 97 // Ethernet-within-IP Encapsulation + ProtocolENCAP = 98 // Encapsulation Header + ProtocolGMTP = 100 // GMTP + ProtocolIFMP = 101 // Ipsilon Flow Management Protocol + ProtocolPNNI = 102 // PNNI over IP + ProtocolPIM = 103 // Protocol Independent Multicast + ProtocolARIS = 104 // ARIS + ProtocolSCPS = 105 // SCPS + ProtocolQNX = 106 // QNX + ProtocolAN = 107 // Active Networks + ProtocolIPComp = 108 // IP Payload Compression Protocol + ProtocolSNP = 109 // Sitara Networks Protocol + ProtocolCompaqPeer = 110 // Compaq Peer Protocol + ProtocolIPXinIP = 111 // IPX in IP + ProtocolVRRP = 112 // Virtual Router Redundancy Protocol + ProtocolPGM = 113 // PGM Reliable Transport Protocol + ProtocolL2TP = 115 // Layer Two Tunneling Protocol + ProtocolDDX = 116 // D-II Data Exchange (DDX) + ProtocolIATP = 117 // Interactive Agent Transfer Protocol + ProtocolSTP = 118 // Schedule Transfer Protocol + ProtocolSRP = 119 // SpectraLink Radio Protocol + ProtocolUTI = 120 // UTI + ProtocolSMP = 121 // Simple Message Protocol + ProtocolPTP = 123 // Performance Transparency Protocol + ProtocolISIS = 124 // ISIS over IPv4 + ProtocolFIRE = 125 // FIRE + ProtocolCRTP = 126 // Combat Radio Transport Protocol + ProtocolCRUDP = 127 // Combat Radio User Datagram + ProtocolSSCOPMCE = 128 // SSCOPMCE + ProtocolIPLT = 129 // IPLT + ProtocolSPS = 130 // Secure Packet Shield + ProtocolPIPE = 131 // Private IP Encapsulation within IP + ProtocolSCTP = 132 // Stream Control Transmission Protocol + ProtocolFC = 133 // Fibre Channel + ProtocolRSVPE2EIGNORE = 134 // RSVP-E2E-IGNORE + ProtocolMobilityHeader = 135 // Mobility Header + ProtocolUDPLite = 136 // UDPLite + ProtocolMPLSinIP = 137 // MPLS-in-IP + ProtocolMANET = 138 // MANET Protocols + ProtocolHIP = 139 // Host Identity Protocol + ProtocolShim6 = 140 // Shim6 Protocol + ProtocolWESP = 141 // Wrapped Encapsulating Security Payload + ProtocolROHC = 142 // Robust Header Compression + ProtocolReserved = 255 // Reserved +) + +// Address Family Numbers, Updated: 2018-04-02 +const ( + AddrFamilyIPv4 = 1 // IP (IP version 4) + AddrFamilyIPv6 = 2 // IP6 (IP version 6) + AddrFamilyNSAP = 3 // NSAP + AddrFamilyHDLC = 4 // HDLC (8-bit multidrop) + AddrFamilyBBN1822 = 5 // BBN 1822 + AddrFamily802 = 6 // 802 (includes all 802 media plus Ethernet "canonical format") + AddrFamilyE163 = 7 // E.163 + AddrFamilyE164 = 8 // E.164 (SMDS, Frame Relay, ATM) + AddrFamilyF69 = 9 // F.69 (Telex) + AddrFamilyX121 = 10 // X.121 (X.25, Frame Relay) + AddrFamilyIPX = 11 // IPX + AddrFamilyAppletalk = 12 // Appletalk + AddrFamilyDecnetIV = 13 // Decnet IV + AddrFamilyBanyanVines = 14 // Banyan Vines + AddrFamilyE164withSubaddress = 15 // E.164 with NSAP format subaddress + AddrFamilyDNS = 16 // DNS (Domain Name System) + AddrFamilyDistinguishedName = 17 // Distinguished Name + AddrFamilyASNumber = 18 // AS Number + AddrFamilyXTPoverIPv4 = 19 // XTP over IP version 4 + AddrFamilyXTPoverIPv6 = 20 // XTP over IP version 6 + AddrFamilyXTPnativemodeXTP = 21 // XTP native mode XTP + AddrFamilyFibreChannelWorldWidePortName = 22 // Fibre Channel World-Wide Port Name + AddrFamilyFibreChannelWorldWideNodeName = 23 // Fibre Channel World-Wide Node Name + AddrFamilyGWID = 24 // GWID + AddrFamilyL2VPN = 25 // AFI for L2VPN information + AddrFamilyMPLSTPSectionEndpointID = 26 // MPLS-TP Section Endpoint Identifier + AddrFamilyMPLSTPLSPEndpointID = 27 // MPLS-TP LSP Endpoint Identifier + AddrFamilyMPLSTPPseudowireEndpointID = 28 // MPLS-TP Pseudowire Endpoint Identifier + AddrFamilyMTIPv4 = 29 // MT IP: Multi-Topology IP version 4 + AddrFamilyMTIPv6 = 30 // MT IPv6: Multi-Topology IP version 6 + AddrFamilyEIGRPCommonServiceFamily = 16384 // EIGRP Common Service Family + AddrFamilyEIGRPIPv4ServiceFamily = 16385 // EIGRP IPv4 Service Family + AddrFamilyEIGRPIPv6ServiceFamily = 16386 // EIGRP IPv6 Service Family + AddrFamilyLISPCanonicalAddressFormat = 16387 // LISP Canonical Address Format (LCAF) + AddrFamilyBGPLS = 16388 // BGP-LS + AddrFamily48bitMAC = 16389 // 48-bit MAC + AddrFamily64bitMAC = 16390 // 64-bit MAC + AddrFamilyOUI = 16391 // OUI + AddrFamilyMACFinal24bits = 16392 // MAC/24 + AddrFamilyMACFinal40bits = 16393 // MAC/40 + AddrFamilyIPv6Initial64bits = 16394 // IPv6/64 + AddrFamilyRBridgePortID = 16395 // RBridge Port ID + AddrFamilyTRILLNickname = 16396 // TRILL Nickname +) diff --git a/api/vendor/golang.org/x/net/internal/iana/gen.go b/api/vendor/golang.org/x/net/internal/iana/gen.go new file mode 100644 index 0000000..2a7661c --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/iana/gen.go @@ -0,0 +1,383 @@ +// 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. + +// +build ignore + +//go:generate go run gen.go + +// This program generates internet protocol constants and tables by +// reading IANA protocol registries. +package main + +import ( + "bytes" + "encoding/xml" + "fmt" + "go/format" + "io" + "io/ioutil" + "net/http" + "os" + "strconv" + "strings" +) + +var registries = []struct { + url string + parse func(io.Writer, io.Reader) error +}{ + { + "https://www.iana.org/assignments/dscp-registry/dscp-registry.xml", + parseDSCPRegistry, + }, + { + "https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xml", + parseProtocolNumbers, + }, + { + "https://www.iana.org/assignments/address-family-numbers/address-family-numbers.xml", + parseAddrFamilyNumbers, + }, +} + +func main() { + var bb bytes.Buffer + fmt.Fprintf(&bb, "// go generate gen.go\n") + fmt.Fprintf(&bb, "// Code generated by the command above; DO NOT EDIT.\n\n") + fmt.Fprintf(&bb, "// Package iana provides protocol number resources managed by the Internet Assigned Numbers Authority (IANA).\n") + fmt.Fprintf(&bb, `package iana // import "golang.org/x/net/internal/iana"`+"\n\n") + for _, r := range registries { + resp, err := http.Get(r.url) + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + fmt.Fprintf(os.Stderr, "got HTTP status code %v for %v\n", resp.StatusCode, r.url) + os.Exit(1) + } + if err := r.parse(&bb, resp.Body); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + fmt.Fprintf(&bb, "\n") + } + b, err := format.Source(bb.Bytes()) + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + if err := ioutil.WriteFile("const.go", b, 0644); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} + +func parseDSCPRegistry(w io.Writer, r io.Reader) error { + dec := xml.NewDecoder(r) + var dr dscpRegistry + if err := dec.Decode(&dr); err != nil { + return err + } + fmt.Fprintf(w, "// %s, Updated: %s\n", dr.Title, dr.Updated) + fmt.Fprintf(w, "const (\n") + for _, dr := range dr.escapeDSCP() { + fmt.Fprintf(w, "DiffServ%s = %#02x", dr.Name, dr.Value) + fmt.Fprintf(w, "// %s\n", dr.OrigName) + } + for _, er := range dr.escapeECN() { + fmt.Fprintf(w, "%s = %#02x", er.Descr, er.Value) + fmt.Fprintf(w, "// %s\n", er.OrigDescr) + } + fmt.Fprintf(w, ")\n") + return nil +} + +type dscpRegistry struct { + XMLName xml.Name `xml:"registry"` + Title string `xml:"title"` + Updated string `xml:"updated"` + Note string `xml:"note"` + Registries []struct { + Title string `xml:"title"` + Registries []struct { + Title string `xml:"title"` + Records []struct { + Name string `xml:"name"` + Space string `xml:"space"` + } `xml:"record"` + } `xml:"registry"` + Records []struct { + Value string `xml:"value"` + Descr string `xml:"description"` + } `xml:"record"` + } `xml:"registry"` +} + +type canonDSCPRecord struct { + OrigName string + Name string + Value int +} + +func (drr *dscpRegistry) escapeDSCP() []canonDSCPRecord { + var drs []canonDSCPRecord + for _, preg := range drr.Registries { + if !strings.Contains(preg.Title, "Differentiated Services Field Codepoints") { + continue + } + for _, reg := range preg.Registries { + if !strings.Contains(reg.Title, "Pool 1 Codepoints") { + continue + } + drs = make([]canonDSCPRecord, len(reg.Records)) + sr := strings.NewReplacer( + "+", "", + "-", "", + "/", "", + ".", "", + " ", "", + ) + for i, dr := range reg.Records { + s := strings.TrimSpace(dr.Name) + drs[i].OrigName = s + drs[i].Name = sr.Replace(s) + n, err := strconv.ParseUint(dr.Space, 2, 8) + if err != nil { + continue + } + drs[i].Value = int(n) << 2 + } + } + } + return drs +} + +type canonECNRecord struct { + OrigDescr string + Descr string + Value int +} + +func (drr *dscpRegistry) escapeECN() []canonECNRecord { + var ers []canonECNRecord + for _, reg := range drr.Registries { + if !strings.Contains(reg.Title, "ECN Field") { + continue + } + ers = make([]canonECNRecord, len(reg.Records)) + sr := strings.NewReplacer( + "Capable", "", + "Not-ECT", "", + "ECT(1)", "", + "ECT(0)", "", + "CE", "", + "(", "", + ")", "", + "+", "", + "-", "", + "/", "", + ".", "", + " ", "", + ) + for i, er := range reg.Records { + s := strings.TrimSpace(er.Descr) + ers[i].OrigDescr = s + ss := strings.Split(s, " ") + if len(ss) > 1 { + ers[i].Descr = strings.Join(ss[1:], " ") + } else { + ers[i].Descr = ss[0] + } + ers[i].Descr = sr.Replace(er.Descr) + n, err := strconv.ParseUint(er.Value, 2, 8) + if err != nil { + continue + } + ers[i].Value = int(n) + } + } + return ers +} + +func parseProtocolNumbers(w io.Writer, r io.Reader) error { + dec := xml.NewDecoder(r) + var pn protocolNumbers + if err := dec.Decode(&pn); err != nil { + return err + } + prs := pn.escape() + prs = append([]canonProtocolRecord{{ + Name: "IP", + Descr: "IPv4 encapsulation, pseudo protocol number", + Value: 0, + }}, prs...) + fmt.Fprintf(w, "// %s, Updated: %s\n", pn.Title, pn.Updated) + fmt.Fprintf(w, "const (\n") + for _, pr := range prs { + if pr.Name == "" { + continue + } + fmt.Fprintf(w, "Protocol%s = %d", pr.Name, pr.Value) + s := pr.Descr + if s == "" { + s = pr.OrigName + } + fmt.Fprintf(w, "// %s\n", s) + } + fmt.Fprintf(w, ")\n") + return nil +} + +type protocolNumbers struct { + XMLName xml.Name `xml:"registry"` + Title string `xml:"title"` + Updated string `xml:"updated"` + RegTitle string `xml:"registry>title"` + Note string `xml:"registry>note"` + Records []struct { + Value string `xml:"value"` + Name string `xml:"name"` + Descr string `xml:"description"` + } `xml:"registry>record"` +} + +type canonProtocolRecord struct { + OrigName string + Name string + Descr string + Value int +} + +func (pn *protocolNumbers) escape() []canonProtocolRecord { + prs := make([]canonProtocolRecord, len(pn.Records)) + sr := strings.NewReplacer( + "-in-", "in", + "-within-", "within", + "-over-", "over", + "+", "P", + "-", "", + "/", "", + ".", "", + " ", "", + ) + for i, pr := range pn.Records { + if strings.Contains(pr.Name, "Deprecated") || + strings.Contains(pr.Name, "deprecated") { + continue + } + prs[i].OrigName = pr.Name + s := strings.TrimSpace(pr.Name) + switch pr.Name { + case "ISIS over IPv4": + prs[i].Name = "ISIS" + case "manet": + prs[i].Name = "MANET" + default: + prs[i].Name = sr.Replace(s) + } + ss := strings.Split(pr.Descr, "\n") + for i := range ss { + ss[i] = strings.TrimSpace(ss[i]) + } + if len(ss) > 1 { + prs[i].Descr = strings.Join(ss, " ") + } else { + prs[i].Descr = ss[0] + } + prs[i].Value, _ = strconv.Atoi(pr.Value) + } + return prs +} + +func parseAddrFamilyNumbers(w io.Writer, r io.Reader) error { + dec := xml.NewDecoder(r) + var afn addrFamilylNumbers + if err := dec.Decode(&afn); err != nil { + return err + } + afrs := afn.escape() + fmt.Fprintf(w, "// %s, Updated: %s\n", afn.Title, afn.Updated) + fmt.Fprintf(w, "const (\n") + for _, afr := range afrs { + if afr.Name == "" { + continue + } + fmt.Fprintf(w, "AddrFamily%s = %d", afr.Name, afr.Value) + fmt.Fprintf(w, "// %s\n", afr.Descr) + } + fmt.Fprintf(w, ")\n") + return nil +} + +type addrFamilylNumbers struct { + XMLName xml.Name `xml:"registry"` + Title string `xml:"title"` + Updated string `xml:"updated"` + RegTitle string `xml:"registry>title"` + Note string `xml:"registry>note"` + Records []struct { + Value string `xml:"value"` + Descr string `xml:"description"` + } `xml:"registry>record"` +} + +type canonAddrFamilyRecord struct { + Name string + Descr string + Value int +} + +func (afn *addrFamilylNumbers) escape() []canonAddrFamilyRecord { + afrs := make([]canonAddrFamilyRecord, len(afn.Records)) + sr := strings.NewReplacer( + "IP version 4", "IPv4", + "IP version 6", "IPv6", + "Identifier", "ID", + "-", "", + "-", "", + "/", "", + ".", "", + " ", "", + ) + for i, afr := range afn.Records { + if strings.Contains(afr.Descr, "Unassigned") || + strings.Contains(afr.Descr, "Reserved") { + continue + } + afrs[i].Descr = afr.Descr + s := strings.TrimSpace(afr.Descr) + switch s { + case "IP (IP version 4)": + afrs[i].Name = "IPv4" + case "IP6 (IP version 6)": + afrs[i].Name = "IPv6" + case "AFI for L2VPN information": + afrs[i].Name = "L2VPN" + case "E.164 with NSAP format subaddress": + afrs[i].Name = "E164withSubaddress" + case "MT IP: Multi-Topology IP version 4": + afrs[i].Name = "MTIPv4" + case "MAC/24": + afrs[i].Name = "MACFinal24bits" + case "MAC/40": + afrs[i].Name = "MACFinal40bits" + case "IPv6/64": + afrs[i].Name = "IPv6Initial64bits" + default: + n := strings.Index(s, "(") + if n > 0 { + s = s[:n] + } + n = strings.Index(s, ":") + if n > 0 { + s = s[:n] + } + afrs[i].Name = sr.Replace(s) + } + afrs[i].Value, _ = strconv.Atoi(afr.Value) + } + return afrs +} diff --git a/api/vendor/golang.org/x/net/internal/nettest/helper_bsd.go b/api/vendor/golang.org/x/net/internal/nettest/helper_bsd.go new file mode 100644 index 0000000..a6e433b --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/nettest/helper_bsd.go @@ -0,0 +1,53 @@ +// 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. + +// +build darwin dragonfly freebsd netbsd openbsd + +package nettest + +import ( + "runtime" + "strconv" + "strings" + "syscall" +) + +var darwinVersion int + +func init() { + if runtime.GOOS == "darwin" { + // See http://support.apple.com/kb/HT1633. + s, err := syscall.Sysctl("kern.osrelease") + if err != nil { + return + } + ss := strings.Split(s, ".") + if len(ss) == 0 { + return + } + darwinVersion, _ = strconv.Atoi(ss[0]) + } +} + +func supportsIPv6MulticastDeliveryOnLoopback() bool { + switch runtime.GOOS { + case "freebsd": + // See http://www.freebsd.org/cgi/query-pr.cgi?pr=180065. + // Even after the fix, it looks like the latest + // kernels don't deliver link-local scoped multicast + // packets correctly. + return false + case "darwin": + return !causesIPv6Crash() + default: + return true + } +} + +func causesIPv6Crash() bool { + // We see some kernel crash when running IPv6 with IP-level + // options on Darwin kernel version 12 or below. + // See golang.org/issues/17015. + return darwinVersion < 13 +} diff --git a/api/vendor/golang.org/x/net/internal/nettest/helper_nobsd.go b/api/vendor/golang.org/x/net/internal/nettest/helper_nobsd.go new file mode 100644 index 0000000..bc7da5e --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/nettest/helper_nobsd.go @@ -0,0 +1,15 @@ +// 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. + +// +build linux solaris + +package nettest + +func supportsIPv6MulticastDeliveryOnLoopback() bool { + return true +} + +func causesIPv6Crash() bool { + return false +} diff --git a/api/vendor/golang.org/x/net/internal/nettest/helper_posix.go b/api/vendor/golang.org/x/net/internal/nettest/helper_posix.go new file mode 100644 index 0000000..963ed99 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/nettest/helper_posix.go @@ -0,0 +1,31 @@ +// 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows + +package nettest + +import ( + "os" + "syscall" +) + +func protocolNotSupported(err error) bool { + switch err := err.(type) { + case syscall.Errno: + switch err { + case syscall.EPROTONOSUPPORT, syscall.ENOPROTOOPT: + return true + } + case *os.SyscallError: + switch err := err.Err.(type) { + case syscall.Errno: + switch err { + case syscall.EPROTONOSUPPORT, syscall.ENOPROTOOPT: + return true + } + } + } + return false +} diff --git a/api/vendor/golang.org/x/net/internal/nettest/helper_stub.go b/api/vendor/golang.org/x/net/internal/nettest/helper_stub.go new file mode 100644 index 0000000..d729156 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/nettest/helper_stub.go @@ -0,0 +1,32 @@ +// 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. + +// +build js,wasm nacl plan9 + +package nettest + +import ( + "fmt" + "runtime" +) + +func maxOpenFiles() int { + return defaultMaxOpenFiles +} + +func supportsRawIPSocket() (string, bool) { + return fmt.Sprintf("not supported on %s", runtime.GOOS), false +} + +func supportsIPv6MulticastDeliveryOnLoopback() bool { + return false +} + +func causesIPv6Crash() bool { + return false +} + +func protocolNotSupported(err error) bool { + return false +} diff --git a/api/vendor/golang.org/x/net/internal/nettest/helper_unix.go b/api/vendor/golang.org/x/net/internal/nettest/helper_unix.go new file mode 100644 index 0000000..ed13e44 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/nettest/helper_unix.go @@ -0,0 +1,29 @@ +// Copyright 2015 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 darwin dragonfly freebsd linux netbsd openbsd solaris + +package nettest + +import ( + "fmt" + "os" + "runtime" + "syscall" +) + +func maxOpenFiles() int { + var rlim syscall.Rlimit + if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rlim); err != nil { + return defaultMaxOpenFiles + } + return int(rlim.Cur) +} + +func supportsRawIPSocket() (string, bool) { + if os.Getuid() != 0 { + return fmt.Sprintf("must be root on %s", runtime.GOOS), false + } + return "", true +} diff --git a/api/vendor/golang.org/x/net/internal/nettest/helper_windows.go b/api/vendor/golang.org/x/net/internal/nettest/helper_windows.go new file mode 100644 index 0000000..3dcb727 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/nettest/helper_windows.go @@ -0,0 +1,42 @@ +// Copyright 2015 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 nettest + +import ( + "fmt" + "runtime" + "syscall" +) + +func maxOpenFiles() int { + return 4 * defaultMaxOpenFiles /* actually it's 16581375 */ +} + +func supportsRawIPSocket() (string, bool) { + // From http://msdn.microsoft.com/en-us/library/windows/desktop/ms740548.aspx: + // Note: To use a socket of type SOCK_RAW requires administrative privileges. + // Users running Winsock applications that use raw sockets must be a member of + // the Administrators group on the local computer, otherwise raw socket calls + // will fail with an error code of WSAEACCES. On Windows Vista and later, access + // for raw sockets is enforced at socket creation. In earlier versions of Windows, + // access for raw sockets is enforced during other socket operations. + s, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_RAW, 0) + if err == syscall.WSAEACCES { + return fmt.Sprintf("no access to raw socket allowed on %s", runtime.GOOS), false + } + if err != nil { + return err.Error(), false + } + syscall.Closesocket(s) + return "", true +} + +func supportsIPv6MulticastDeliveryOnLoopback() bool { + return true +} + +func causesIPv6Crash() bool { + return false +} diff --git a/api/vendor/golang.org/x/net/internal/nettest/interface.go b/api/vendor/golang.org/x/net/internal/nettest/interface.go new file mode 100644 index 0000000..8e6333a --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/nettest/interface.go @@ -0,0 +1,94 @@ +// 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 nettest + +import "net" + +// IsMulticastCapable reports whether ifi is an IP multicast-capable +// network interface. Network must be "ip", "ip4" or "ip6". +func IsMulticastCapable(network string, ifi *net.Interface) (net.IP, bool) { + switch network { + case "ip", "ip4", "ip6": + default: + return nil, false + } + if ifi == nil || ifi.Flags&net.FlagUp == 0 || ifi.Flags&net.FlagMulticast == 0 { + return nil, false + } + return hasRoutableIP(network, ifi) +} + +// RoutedInterface returns a network interface that can route IP +// traffic and satisfies flags. It returns nil when an appropriate +// network interface is not found. Network must be "ip", "ip4" or +// "ip6". +func RoutedInterface(network string, flags net.Flags) *net.Interface { + switch network { + case "ip", "ip4", "ip6": + default: + return nil + } + ift, err := net.Interfaces() + if err != nil { + return nil + } + for _, ifi := range ift { + if ifi.Flags&flags != flags { + continue + } + if _, ok := hasRoutableIP(network, &ifi); !ok { + continue + } + return &ifi + } + return nil +} + +func hasRoutableIP(network string, ifi *net.Interface) (net.IP, bool) { + ifat, err := ifi.Addrs() + if err != nil { + return nil, false + } + for _, ifa := range ifat { + switch ifa := ifa.(type) { + case *net.IPAddr: + if ip := routableIP(network, ifa.IP); ip != nil { + return ip, true + } + case *net.IPNet: + if ip := routableIP(network, ifa.IP); ip != nil { + return ip, true + } + } + } + return nil, false +} + +func routableIP(network string, ip net.IP) net.IP { + if !ip.IsLoopback() && !ip.IsLinkLocalUnicast() && !ip.IsGlobalUnicast() { + return nil + } + switch network { + case "ip4": + if ip := ip.To4(); ip != nil { + return ip + } + case "ip6": + if ip.IsLoopback() { // addressing scope of the loopback address depends on each implementation + return nil + } + if ip := ip.To16(); ip != nil && ip.To4() == nil { + return ip + } + default: + if ip := ip.To4(); ip != nil { + return ip + } + if ip := ip.To16(); ip != nil { + return ip + } + } + return nil +} diff --git a/api/vendor/golang.org/x/net/internal/nettest/rlimit.go b/api/vendor/golang.org/x/net/internal/nettest/rlimit.go new file mode 100644 index 0000000..bb34aec --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/nettest/rlimit.go @@ -0,0 +1,11 @@ +// Copyright 2015 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 nettest + +const defaultMaxOpenFiles = 256 + +// MaxOpenFiles returns the maximum number of open files for the +// caller's process. +func MaxOpenFiles() int { return maxOpenFiles() } diff --git a/api/vendor/golang.org/x/net/internal/nettest/stack.go b/api/vendor/golang.org/x/net/internal/nettest/stack.go new file mode 100644 index 0000000..46d2fcc --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/nettest/stack.go @@ -0,0 +1,152 @@ +// 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 nettest provides utilities for network testing. +package nettest // import "golang.org/x/net/internal/nettest" + +import ( + "fmt" + "io/ioutil" + "net" + "os" + "runtime" +) + +var ( + supportsIPv4 bool + supportsIPv6 bool +) + +func init() { + if ln, err := net.Listen("tcp4", "127.0.0.1:0"); err == nil { + ln.Close() + supportsIPv4 = true + } + if ln, err := net.Listen("tcp6", "[::1]:0"); err == nil { + ln.Close() + supportsIPv6 = true + } +} + +// SupportsIPv4 reports whether the platform supports IPv4 networking +// functionality. +func SupportsIPv4() bool { return supportsIPv4 } + +// SupportsIPv6 reports whether the platform supports IPv6 networking +// functionality. +func SupportsIPv6() bool { return supportsIPv6 } + +// SupportsRawIPSocket reports whether the platform supports raw IP +// sockets. +func SupportsRawIPSocket() (string, bool) { + return supportsRawIPSocket() +} + +// SupportsIPv6MulticastDeliveryOnLoopback reports whether the +// platform supports IPv6 multicast packet delivery on software +// loopback interface. +func SupportsIPv6MulticastDeliveryOnLoopback() bool { + return supportsIPv6MulticastDeliveryOnLoopback() +} + +// ProtocolNotSupported reports whether err is a protocol not +// supported error. +func ProtocolNotSupported(err error) bool { + return protocolNotSupported(err) +} + +// TestableNetwork reports whether network is testable on the current +// platform configuration. +func TestableNetwork(network string) bool { + // This is based on logic from standard library's + // net/platform_test.go. + switch network { + case "unix", "unixgram": + switch runtime.GOOS { + case "android", "js", "nacl", "plan9", "windows": + return false + } + if runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64") { + return false + } + case "unixpacket": + switch runtime.GOOS { + case "android", "darwin", "freebsd", "js", "nacl", "plan9", "windows": + return false + case "netbsd": + // It passes on amd64 at least. 386 fails (Issue 22927). arm is unknown. + if runtime.GOARCH == "386" { + return false + } + } + } + return true +} + +// NewLocalListener returns a listener which listens to a loopback IP +// address or local file system path. +// Network must be "tcp", "tcp4", "tcp6", "unix" or "unixpacket". +func NewLocalListener(network string) (net.Listener, error) { + switch network { + case "tcp": + if supportsIPv4 { + if ln, err := net.Listen("tcp4", "127.0.0.1:0"); err == nil { + return ln, nil + } + } + if supportsIPv6 { + return net.Listen("tcp6", "[::1]:0") + } + case "tcp4": + if supportsIPv4 { + return net.Listen("tcp4", "127.0.0.1:0") + } + case "tcp6": + if supportsIPv6 { + return net.Listen("tcp6", "[::1]:0") + } + case "unix", "unixpacket": + return net.Listen(network, localPath()) + } + return nil, fmt.Errorf("%s is not supported", network) +} + +// NewLocalPacketListener returns a packet listener which listens to a +// loopback IP address or local file system path. +// Network must be "udp", "udp4", "udp6" or "unixgram". +func NewLocalPacketListener(network string) (net.PacketConn, error) { + switch network { + case "udp": + if supportsIPv4 { + if c, err := net.ListenPacket("udp4", "127.0.0.1:0"); err == nil { + return c, nil + } + } + if supportsIPv6 { + return net.ListenPacket("udp6", "[::1]:0") + } + case "udp4": + if supportsIPv4 { + return net.ListenPacket("udp4", "127.0.0.1:0") + } + case "udp6": + if supportsIPv6 { + return net.ListenPacket("udp6", "[::1]:0") + } + case "unixgram": + return net.ListenPacket(network, localPath()) + } + return nil, fmt.Errorf("%s is not supported", network) +} + +func localPath() string { + f, err := ioutil.TempFile("", "nettest") + if err != nil { + panic(err) + } + path := f.Name() + f.Close() + os.Remove(path) + return path +} diff --git a/api/vendor/golang.org/x/net/internal/socket/cmsghdr.go b/api/vendor/golang.org/x/net/internal/socket/cmsghdr.go new file mode 100644 index 0000000..1eb07d2 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/cmsghdr.go @@ -0,0 +1,11 @@ +// 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +package socket + +func (h *cmsghdr) len() int { return int(h.Len) } +func (h *cmsghdr) lvl() int { return int(h.Level) } +func (h *cmsghdr) typ() int { return int(h.Type) } diff --git a/api/vendor/golang.org/x/net/internal/socket/cmsghdr_bsd.go b/api/vendor/golang.org/x/net/internal/socket/cmsghdr_bsd.go new file mode 100644 index 0000000..d1d0c2d --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/cmsghdr_bsd.go @@ -0,0 +1,13 @@ +// 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. + +// +build darwin dragonfly freebsd netbsd openbsd + +package socket + +func (h *cmsghdr) set(l, lvl, typ int) { + h.Len = uint32(l) + h.Level = int32(lvl) + h.Type = int32(typ) +} diff --git a/api/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_32bit.go b/api/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_32bit.go new file mode 100644 index 0000000..bac6681 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_32bit.go @@ -0,0 +1,14 @@ +// 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. + +// +build arm mips mipsle 386 +// +build linux + +package socket + +func (h *cmsghdr) set(l, lvl, typ int) { + h.Len = uint32(l) + h.Level = int32(lvl) + h.Type = int32(typ) +} diff --git a/api/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_64bit.go b/api/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_64bit.go new file mode 100644 index 0000000..63f0534 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_64bit.go @@ -0,0 +1,14 @@ +// 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. + +// +build arm64 amd64 ppc64 ppc64le mips64 mips64le s390x +// +build linux + +package socket + +func (h *cmsghdr) set(l, lvl, typ int) { + h.Len = uint64(l) + h.Level = int32(lvl) + h.Type = int32(typ) +} diff --git a/api/vendor/golang.org/x/net/internal/socket/cmsghdr_solaris_64bit.go b/api/vendor/golang.org/x/net/internal/socket/cmsghdr_solaris_64bit.go new file mode 100644 index 0000000..7dedd43 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/cmsghdr_solaris_64bit.go @@ -0,0 +1,14 @@ +// 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. + +// +build amd64 +// +build solaris + +package socket + +func (h *cmsghdr) set(l, lvl, typ int) { + h.Len = uint32(l) + h.Level = int32(lvl) + h.Type = int32(typ) +} diff --git a/api/vendor/golang.org/x/net/internal/socket/cmsghdr_stub.go b/api/vendor/golang.org/x/net/internal/socket/cmsghdr_stub.go new file mode 100644 index 0000000..a4e7122 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/cmsghdr_stub.go @@ -0,0 +1,17 @@ +// 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. + +// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris + +package socket + +type cmsghdr struct{} + +const sizeofCmsghdr = 0 + +func (h *cmsghdr) len() int { return 0 } +func (h *cmsghdr) lvl() int { return 0 } +func (h *cmsghdr) typ() int { return 0 } + +func (h *cmsghdr) set(l, lvl, typ int) {} diff --git a/api/vendor/golang.org/x/net/internal/socket/defs_darwin.go b/api/vendor/golang.org/x/net/internal/socket/defs_darwin.go new file mode 100644 index 0000000..14e28c0 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/defs_darwin.go @@ -0,0 +1,44 @@ +// 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. + +// +build ignore + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package socket + +/* +#include + +#include +*/ +import "C" + +const ( + sysAF_UNSPEC = C.AF_UNSPEC + sysAF_INET = C.AF_INET + sysAF_INET6 = C.AF_INET6 + + sysSOCK_RAW = C.SOCK_RAW +) + +type iovec C.struct_iovec + +type msghdr C.struct_msghdr + +type cmsghdr C.struct_cmsghdr + +type sockaddrInet C.struct_sockaddr_in + +type sockaddrInet6 C.struct_sockaddr_in6 + +const ( + sizeofIovec = C.sizeof_struct_iovec + sizeofMsghdr = C.sizeof_struct_msghdr + sizeofCmsghdr = C.sizeof_struct_cmsghdr + + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 +) diff --git a/api/vendor/golang.org/x/net/internal/socket/defs_dragonfly.go b/api/vendor/golang.org/x/net/internal/socket/defs_dragonfly.go new file mode 100644 index 0000000..14e28c0 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/defs_dragonfly.go @@ -0,0 +1,44 @@ +// 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. + +// +build ignore + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package socket + +/* +#include + +#include +*/ +import "C" + +const ( + sysAF_UNSPEC = C.AF_UNSPEC + sysAF_INET = C.AF_INET + sysAF_INET6 = C.AF_INET6 + + sysSOCK_RAW = C.SOCK_RAW +) + +type iovec C.struct_iovec + +type msghdr C.struct_msghdr + +type cmsghdr C.struct_cmsghdr + +type sockaddrInet C.struct_sockaddr_in + +type sockaddrInet6 C.struct_sockaddr_in6 + +const ( + sizeofIovec = C.sizeof_struct_iovec + sizeofMsghdr = C.sizeof_struct_msghdr + sizeofCmsghdr = C.sizeof_struct_cmsghdr + + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 +) diff --git a/api/vendor/golang.org/x/net/internal/socket/defs_freebsd.go b/api/vendor/golang.org/x/net/internal/socket/defs_freebsd.go new file mode 100644 index 0000000..14e28c0 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/defs_freebsd.go @@ -0,0 +1,44 @@ +// 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. + +// +build ignore + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package socket + +/* +#include + +#include +*/ +import "C" + +const ( + sysAF_UNSPEC = C.AF_UNSPEC + sysAF_INET = C.AF_INET + sysAF_INET6 = C.AF_INET6 + + sysSOCK_RAW = C.SOCK_RAW +) + +type iovec C.struct_iovec + +type msghdr C.struct_msghdr + +type cmsghdr C.struct_cmsghdr + +type sockaddrInet C.struct_sockaddr_in + +type sockaddrInet6 C.struct_sockaddr_in6 + +const ( + sizeofIovec = C.sizeof_struct_iovec + sizeofMsghdr = C.sizeof_struct_msghdr + sizeofCmsghdr = C.sizeof_struct_cmsghdr + + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 +) diff --git a/api/vendor/golang.org/x/net/internal/socket/defs_linux.go b/api/vendor/golang.org/x/net/internal/socket/defs_linux.go new file mode 100644 index 0000000..ce9ec2f --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/defs_linux.go @@ -0,0 +1,49 @@ +// 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. + +// +build ignore + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package socket + +/* +#include +#include + +#define _GNU_SOURCE +#include +*/ +import "C" + +const ( + sysAF_UNSPEC = C.AF_UNSPEC + sysAF_INET = C.AF_INET + sysAF_INET6 = C.AF_INET6 + + sysSOCK_RAW = C.SOCK_RAW +) + +type iovec C.struct_iovec + +type msghdr C.struct_msghdr + +type mmsghdr C.struct_mmsghdr + +type cmsghdr C.struct_cmsghdr + +type sockaddrInet C.struct_sockaddr_in + +type sockaddrInet6 C.struct_sockaddr_in6 + +const ( + sizeofIovec = C.sizeof_struct_iovec + sizeofMsghdr = C.sizeof_struct_msghdr + sizeofMmsghdr = C.sizeof_struct_mmsghdr + sizeofCmsghdr = C.sizeof_struct_cmsghdr + + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 +) diff --git a/api/vendor/golang.org/x/net/internal/socket/defs_netbsd.go b/api/vendor/golang.org/x/net/internal/socket/defs_netbsd.go new file mode 100644 index 0000000..3f84335 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/defs_netbsd.go @@ -0,0 +1,47 @@ +// 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. + +// +build ignore + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package socket + +/* +#include + +#include +*/ +import "C" + +const ( + sysAF_UNSPEC = C.AF_UNSPEC + sysAF_INET = C.AF_INET + sysAF_INET6 = C.AF_INET6 + + sysSOCK_RAW = C.SOCK_RAW +) + +type iovec C.struct_iovec + +type msghdr C.struct_msghdr + +type mmsghdr C.struct_mmsghdr + +type cmsghdr C.struct_cmsghdr + +type sockaddrInet C.struct_sockaddr_in + +type sockaddrInet6 C.struct_sockaddr_in6 + +const ( + sizeofIovec = C.sizeof_struct_iovec + sizeofMsghdr = C.sizeof_struct_msghdr + sizeofMmsghdr = C.sizeof_struct_mmsghdr + sizeofCmsghdr = C.sizeof_struct_cmsghdr + + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 +) diff --git a/api/vendor/golang.org/x/net/internal/socket/defs_openbsd.go b/api/vendor/golang.org/x/net/internal/socket/defs_openbsd.go new file mode 100644 index 0000000..14e28c0 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/defs_openbsd.go @@ -0,0 +1,44 @@ +// 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. + +// +build ignore + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package socket + +/* +#include + +#include +*/ +import "C" + +const ( + sysAF_UNSPEC = C.AF_UNSPEC + sysAF_INET = C.AF_INET + sysAF_INET6 = C.AF_INET6 + + sysSOCK_RAW = C.SOCK_RAW +) + +type iovec C.struct_iovec + +type msghdr C.struct_msghdr + +type cmsghdr C.struct_cmsghdr + +type sockaddrInet C.struct_sockaddr_in + +type sockaddrInet6 C.struct_sockaddr_in6 + +const ( + sizeofIovec = C.sizeof_struct_iovec + sizeofMsghdr = C.sizeof_struct_msghdr + sizeofCmsghdr = C.sizeof_struct_cmsghdr + + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 +) diff --git a/api/vendor/golang.org/x/net/internal/socket/defs_solaris.go b/api/vendor/golang.org/x/net/internal/socket/defs_solaris.go new file mode 100644 index 0000000..14e28c0 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/defs_solaris.go @@ -0,0 +1,44 @@ +// 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. + +// +build ignore + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package socket + +/* +#include + +#include +*/ +import "C" + +const ( + sysAF_UNSPEC = C.AF_UNSPEC + sysAF_INET = C.AF_INET + sysAF_INET6 = C.AF_INET6 + + sysSOCK_RAW = C.SOCK_RAW +) + +type iovec C.struct_iovec + +type msghdr C.struct_msghdr + +type cmsghdr C.struct_cmsghdr + +type sockaddrInet C.struct_sockaddr_in + +type sockaddrInet6 C.struct_sockaddr_in6 + +const ( + sizeofIovec = C.sizeof_struct_iovec + sizeofMsghdr = C.sizeof_struct_msghdr + sizeofCmsghdr = C.sizeof_struct_cmsghdr + + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 +) diff --git a/api/vendor/golang.org/x/net/internal/socket/error_unix.go b/api/vendor/golang.org/x/net/internal/socket/error_unix.go new file mode 100644 index 0000000..93dff91 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/error_unix.go @@ -0,0 +1,31 @@ +// 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +package socket + +import "syscall" + +var ( + errEAGAIN error = syscall.EAGAIN + errEINVAL error = syscall.EINVAL + errENOENT error = syscall.ENOENT +) + +// errnoErr returns common boxed Errno values, to prevent allocations +// at runtime. +func errnoErr(errno syscall.Errno) error { + switch errno { + case 0: + return nil + case syscall.EAGAIN: + return errEAGAIN + case syscall.EINVAL: + return errEINVAL + case syscall.ENOENT: + return errENOENT + } + return errno +} diff --git a/api/vendor/golang.org/x/net/internal/socket/error_windows.go b/api/vendor/golang.org/x/net/internal/socket/error_windows.go new file mode 100644 index 0000000..6a6379a --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/error_windows.go @@ -0,0 +1,26 @@ +// 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 socket + +import "syscall" + +var ( + errERROR_IO_PENDING error = syscall.ERROR_IO_PENDING + errEINVAL error = syscall.EINVAL +) + +// errnoErr returns common boxed Errno values, to prevent allocations +// at runtime. +func errnoErr(errno syscall.Errno) error { + switch errno { + case 0: + return nil + case syscall.ERROR_IO_PENDING: + return errERROR_IO_PENDING + case syscall.EINVAL: + return errEINVAL + } + return errno +} diff --git a/api/vendor/golang.org/x/net/internal/socket/iovec_32bit.go b/api/vendor/golang.org/x/net/internal/socket/iovec_32bit.go new file mode 100644 index 0000000..05d6082 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/iovec_32bit.go @@ -0,0 +1,19 @@ +// 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. + +// +build arm mips mipsle 386 +// +build darwin dragonfly freebsd linux netbsd openbsd + +package socket + +import "unsafe" + +func (v *iovec) set(b []byte) { + l := len(b) + if l == 0 { + return + } + v.Base = (*byte)(unsafe.Pointer(&b[0])) + v.Len = uint32(l) +} diff --git a/api/vendor/golang.org/x/net/internal/socket/iovec_64bit.go b/api/vendor/golang.org/x/net/internal/socket/iovec_64bit.go new file mode 100644 index 0000000..afb34ad --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/iovec_64bit.go @@ -0,0 +1,19 @@ +// 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. + +// +build arm64 amd64 ppc64 ppc64le mips64 mips64le s390x +// +build darwin dragonfly freebsd linux netbsd openbsd + +package socket + +import "unsafe" + +func (v *iovec) set(b []byte) { + l := len(b) + if l == 0 { + return + } + v.Base = (*byte)(unsafe.Pointer(&b[0])) + v.Len = uint64(l) +} diff --git a/api/vendor/golang.org/x/net/internal/socket/iovec_solaris_64bit.go b/api/vendor/golang.org/x/net/internal/socket/iovec_solaris_64bit.go new file mode 100644 index 0000000..8d17a40 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/iovec_solaris_64bit.go @@ -0,0 +1,19 @@ +// 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. + +// +build amd64 +// +build solaris + +package socket + +import "unsafe" + +func (v *iovec) set(b []byte) { + l := len(b) + if l == 0 { + return + } + v.Base = (*int8)(unsafe.Pointer(&b[0])) + v.Len = uint64(l) +} diff --git a/api/vendor/golang.org/x/net/internal/socket/iovec_stub.go b/api/vendor/golang.org/x/net/internal/socket/iovec_stub.go new file mode 100644 index 0000000..c87d2a9 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/iovec_stub.go @@ -0,0 +1,11 @@ +// 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. + +// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris + +package socket + +type iovec struct{} + +func (v *iovec) set(b []byte) {} diff --git a/api/vendor/golang.org/x/net/internal/socket/mmsghdr_stub.go b/api/vendor/golang.org/x/net/internal/socket/mmsghdr_stub.go new file mode 100644 index 0000000..2e80a9c --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/mmsghdr_stub.go @@ -0,0 +1,21 @@ +// 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. + +// +build !linux,!netbsd + +package socket + +import "net" + +type mmsghdr struct{} + +type mmsghdrs []mmsghdr + +func (hs mmsghdrs) pack(ms []Message, parseFn func([]byte, string) (net.Addr, error), marshalFn func(net.Addr) []byte) error { + return nil +} + +func (hs mmsghdrs) unpack(ms []Message, parseFn func([]byte, string) (net.Addr, error), hint string) error { + return nil +} diff --git a/api/vendor/golang.org/x/net/internal/socket/mmsghdr_unix.go b/api/vendor/golang.org/x/net/internal/socket/mmsghdr_unix.go new file mode 100644 index 0000000..3c42ea7 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/mmsghdr_unix.go @@ -0,0 +1,42 @@ +// 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. + +// +build linux netbsd + +package socket + +import "net" + +type mmsghdrs []mmsghdr + +func (hs mmsghdrs) pack(ms []Message, parseFn func([]byte, string) (net.Addr, error), marshalFn func(net.Addr) []byte) error { + for i := range hs { + vs := make([]iovec, len(ms[i].Buffers)) + var sa []byte + if parseFn != nil { + sa = make([]byte, sizeofSockaddrInet6) + } + if marshalFn != nil { + sa = marshalFn(ms[i].Addr) + } + hs[i].Hdr.pack(vs, ms[i].Buffers, ms[i].OOB, sa) + } + return nil +} + +func (hs mmsghdrs) unpack(ms []Message, parseFn func([]byte, string) (net.Addr, error), hint string) error { + for i := range hs { + ms[i].N = int(hs[i].Len) + ms[i].NN = hs[i].Hdr.controllen() + ms[i].Flags = hs[i].Hdr.flags() + if parseFn != nil { + var err error + ms[i].Addr, err = parseFn(hs[i].Hdr.name(), hint) + if err != nil { + return err + } + } + } + return nil +} diff --git a/api/vendor/golang.org/x/net/internal/socket/msghdr_bsd.go b/api/vendor/golang.org/x/net/internal/socket/msghdr_bsd.go new file mode 100644 index 0000000..5567afc --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/msghdr_bsd.go @@ -0,0 +1,39 @@ +// 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. + +// +build darwin dragonfly freebsd netbsd openbsd + +package socket + +import "unsafe" + +func (h *msghdr) pack(vs []iovec, bs [][]byte, oob []byte, sa []byte) { + for i := range vs { + vs[i].set(bs[i]) + } + h.setIov(vs) + if len(oob) > 0 { + h.Control = (*byte)(unsafe.Pointer(&oob[0])) + h.Controllen = uint32(len(oob)) + } + if sa != nil { + h.Name = (*byte)(unsafe.Pointer(&sa[0])) + h.Namelen = uint32(len(sa)) + } +} + +func (h *msghdr) name() []byte { + if h.Name != nil && h.Namelen > 0 { + return (*[sizeofSockaddrInet6]byte)(unsafe.Pointer(h.Name))[:h.Namelen] + } + return nil +} + +func (h *msghdr) controllen() int { + return int(h.Controllen) +} + +func (h *msghdr) flags() int { + return int(h.Flags) +} diff --git a/api/vendor/golang.org/x/net/internal/socket/msghdr_bsdvar.go b/api/vendor/golang.org/x/net/internal/socket/msghdr_bsdvar.go new file mode 100644 index 0000000..b8c87b7 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/msghdr_bsdvar.go @@ -0,0 +1,16 @@ +// 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. + +// +build darwin dragonfly freebsd netbsd + +package socket + +func (h *msghdr) setIov(vs []iovec) { + l := len(vs) + if l == 0 { + return + } + h.Iov = &vs[0] + h.Iovlen = int32(l) +} diff --git a/api/vendor/golang.org/x/net/internal/socket/msghdr_linux.go b/api/vendor/golang.org/x/net/internal/socket/msghdr_linux.go new file mode 100644 index 0000000..5a38798 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/msghdr_linux.go @@ -0,0 +1,36 @@ +// 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 socket + +import "unsafe" + +func (h *msghdr) pack(vs []iovec, bs [][]byte, oob []byte, sa []byte) { + for i := range vs { + vs[i].set(bs[i]) + } + h.setIov(vs) + if len(oob) > 0 { + h.setControl(oob) + } + if sa != nil { + h.Name = (*byte)(unsafe.Pointer(&sa[0])) + h.Namelen = uint32(len(sa)) + } +} + +func (h *msghdr) name() []byte { + if h.Name != nil && h.Namelen > 0 { + return (*[sizeofSockaddrInet6]byte)(unsafe.Pointer(h.Name))[:h.Namelen] + } + return nil +} + +func (h *msghdr) controllen() int { + return int(h.Controllen) +} + +func (h *msghdr) flags() int { + return int(h.Flags) +} diff --git a/api/vendor/golang.org/x/net/internal/socket/msghdr_linux_32bit.go b/api/vendor/golang.org/x/net/internal/socket/msghdr_linux_32bit.go new file mode 100644 index 0000000..a7a5987 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/msghdr_linux_32bit.go @@ -0,0 +1,24 @@ +// 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. + +// +build arm mips mipsle 386 +// +build linux + +package socket + +import "unsafe" + +func (h *msghdr) setIov(vs []iovec) { + l := len(vs) + if l == 0 { + return + } + h.Iov = &vs[0] + h.Iovlen = uint32(l) +} + +func (h *msghdr) setControl(b []byte) { + h.Control = (*byte)(unsafe.Pointer(&b[0])) + h.Controllen = uint32(len(b)) +} diff --git a/api/vendor/golang.org/x/net/internal/socket/msghdr_linux_64bit.go b/api/vendor/golang.org/x/net/internal/socket/msghdr_linux_64bit.go new file mode 100644 index 0000000..610fc4f --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/msghdr_linux_64bit.go @@ -0,0 +1,24 @@ +// 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. + +// +build arm64 amd64 ppc64 ppc64le mips64 mips64le s390x +// +build linux + +package socket + +import "unsafe" + +func (h *msghdr) setIov(vs []iovec) { + l := len(vs) + if l == 0 { + return + } + h.Iov = &vs[0] + h.Iovlen = uint64(l) +} + +func (h *msghdr) setControl(b []byte) { + h.Control = (*byte)(unsafe.Pointer(&b[0])) + h.Controllen = uint64(len(b)) +} diff --git a/api/vendor/golang.org/x/net/internal/socket/msghdr_openbsd.go b/api/vendor/golang.org/x/net/internal/socket/msghdr_openbsd.go new file mode 100644 index 0000000..71a69e2 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/msghdr_openbsd.go @@ -0,0 +1,14 @@ +// 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 socket + +func (h *msghdr) setIov(vs []iovec) { + l := len(vs) + if l == 0 { + return + } + h.Iov = &vs[0] + h.Iovlen = uint32(l) +} diff --git a/api/vendor/golang.org/x/net/internal/socket/msghdr_solaris_64bit.go b/api/vendor/golang.org/x/net/internal/socket/msghdr_solaris_64bit.go new file mode 100644 index 0000000..6465b20 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/msghdr_solaris_64bit.go @@ -0,0 +1,36 @@ +// 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. + +// +build amd64 +// +build solaris + +package socket + +import "unsafe" + +func (h *msghdr) pack(vs []iovec, bs [][]byte, oob []byte, sa []byte) { + for i := range vs { + vs[i].set(bs[i]) + } + if len(vs) > 0 { + h.Iov = &vs[0] + h.Iovlen = int32(len(vs)) + } + if len(oob) > 0 { + h.Accrights = (*int8)(unsafe.Pointer(&oob[0])) + h.Accrightslen = int32(len(oob)) + } + if sa != nil { + h.Name = (*byte)(unsafe.Pointer(&sa[0])) + h.Namelen = uint32(len(sa)) + } +} + +func (h *msghdr) controllen() int { + return int(h.Accrightslen) +} + +func (h *msghdr) flags() int { + return int(NativeEndian.Uint32(h.Pad_cgo_2[:])) +} diff --git a/api/vendor/golang.org/x/net/internal/socket/msghdr_stub.go b/api/vendor/golang.org/x/net/internal/socket/msghdr_stub.go new file mode 100644 index 0000000..64e8173 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/msghdr_stub.go @@ -0,0 +1,14 @@ +// 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. + +// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris + +package socket + +type msghdr struct{} + +func (h *msghdr) pack(vs []iovec, bs [][]byte, oob []byte, sa []byte) {} +func (h *msghdr) name() []byte { return nil } +func (h *msghdr) controllen() int { return 0 } +func (h *msghdr) flags() int { return 0 } diff --git a/api/vendor/golang.org/x/net/internal/socket/rawconn.go b/api/vendor/golang.org/x/net/internal/socket/rawconn.go new file mode 100644 index 0000000..d6871d5 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/rawconn.go @@ -0,0 +1,66 @@ +// 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. + +// +build go1.9 + +package socket + +import ( + "errors" + "net" + "os" + "syscall" +) + +// A Conn represents a raw connection. +type Conn struct { + network string + c syscall.RawConn +} + +// NewConn returns a new raw connection. +func NewConn(c net.Conn) (*Conn, error) { + var err error + var cc Conn + switch c := c.(type) { + case *net.TCPConn: + cc.network = "tcp" + cc.c, err = c.SyscallConn() + case *net.UDPConn: + cc.network = "udp" + cc.c, err = c.SyscallConn() + case *net.IPConn: + cc.network = "ip" + cc.c, err = c.SyscallConn() + default: + return nil, errors.New("unknown connection type") + } + if err != nil { + return nil, err + } + return &cc, nil +} + +func (o *Option) get(c *Conn, b []byte) (int, error) { + var operr error + var n int + fn := func(s uintptr) { + n, operr = getsockopt(s, o.Level, o.Name, b) + } + if err := c.c.Control(fn); err != nil { + return 0, err + } + return n, os.NewSyscallError("getsockopt", operr) +} + +func (o *Option) set(c *Conn, b []byte) error { + var operr error + fn := func(s uintptr) { + operr = setsockopt(s, o.Level, o.Name, b) + } + if err := c.c.Control(fn); err != nil { + return err + } + return os.NewSyscallError("setsockopt", operr) +} diff --git a/api/vendor/golang.org/x/net/internal/socket/rawconn_mmsg.go b/api/vendor/golang.org/x/net/internal/socket/rawconn_mmsg.go new file mode 100644 index 0000000..499164a --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/rawconn_mmsg.go @@ -0,0 +1,74 @@ +// 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. + +// +build go1.9 +// +build linux + +package socket + +import ( + "net" + "os" + "syscall" +) + +func (c *Conn) recvMsgs(ms []Message, flags int) (int, error) { + hs := make(mmsghdrs, len(ms)) + var parseFn func([]byte, string) (net.Addr, error) + if c.network != "tcp" { + parseFn = parseInetAddr + } + if err := hs.pack(ms, parseFn, nil); err != nil { + return 0, err + } + var operr error + var n int + fn := func(s uintptr) bool { + n, operr = recvmmsg(s, hs, flags) + if operr == syscall.EAGAIN { + return false + } + return true + } + if err := c.c.Read(fn); err != nil { + return n, err + } + if operr != nil { + return n, os.NewSyscallError("recvmmsg", operr) + } + if err := hs[:n].unpack(ms[:n], parseFn, c.network); err != nil { + return n, err + } + return n, nil +} + +func (c *Conn) sendMsgs(ms []Message, flags int) (int, error) { + hs := make(mmsghdrs, len(ms)) + var marshalFn func(net.Addr) []byte + if c.network != "tcp" { + marshalFn = marshalInetAddr + } + if err := hs.pack(ms, nil, marshalFn); err != nil { + return 0, err + } + var operr error + var n int + fn := func(s uintptr) bool { + n, operr = sendmmsg(s, hs, flags) + if operr == syscall.EAGAIN { + return false + } + return true + } + if err := c.c.Write(fn); err != nil { + return n, err + } + if operr != nil { + return n, os.NewSyscallError("sendmmsg", operr) + } + if err := hs[:n].unpack(ms[:n], nil, ""); err != nil { + return n, err + } + return n, nil +} diff --git a/api/vendor/golang.org/x/net/internal/socket/rawconn_msg.go b/api/vendor/golang.org/x/net/internal/socket/rawconn_msg.go new file mode 100644 index 0000000..b21d2e6 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/rawconn_msg.go @@ -0,0 +1,77 @@ +// 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. + +// +build go1.9 +// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows + +package socket + +import ( + "os" + "syscall" +) + +func (c *Conn) recvMsg(m *Message, flags int) error { + var h msghdr + vs := make([]iovec, len(m.Buffers)) + var sa []byte + if c.network != "tcp" { + sa = make([]byte, sizeofSockaddrInet6) + } + h.pack(vs, m.Buffers, m.OOB, sa) + var operr error + var n int + fn := func(s uintptr) bool { + n, operr = recvmsg(s, &h, flags) + if operr == syscall.EAGAIN { + return false + } + return true + } + if err := c.c.Read(fn); err != nil { + return err + } + if operr != nil { + return os.NewSyscallError("recvmsg", operr) + } + if c.network != "tcp" { + var err error + m.Addr, err = parseInetAddr(sa[:], c.network) + if err != nil { + return err + } + } + m.N = n + m.NN = h.controllen() + m.Flags = h.flags() + return nil +} + +func (c *Conn) sendMsg(m *Message, flags int) error { + var h msghdr + vs := make([]iovec, len(m.Buffers)) + var sa []byte + if m.Addr != nil { + sa = marshalInetAddr(m.Addr) + } + h.pack(vs, m.Buffers, m.OOB, sa) + var operr error + var n int + fn := func(s uintptr) bool { + n, operr = sendmsg(s, &h, flags) + if operr == syscall.EAGAIN { + return false + } + return true + } + if err := c.c.Write(fn); err != nil { + return err + } + if operr != nil { + return os.NewSyscallError("sendmsg", operr) + } + m.N = n + m.NN = len(m.OOB) + return nil +} diff --git a/api/vendor/golang.org/x/net/internal/socket/rawconn_nommsg.go b/api/vendor/golang.org/x/net/internal/socket/rawconn_nommsg.go new file mode 100644 index 0000000..f78832a --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/rawconn_nommsg.go @@ -0,0 +1,18 @@ +// 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. + +// +build go1.9 +// +build !linux + +package socket + +import "errors" + +func (c *Conn) recvMsgs(ms []Message, flags int) (int, error) { + return 0, errors.New("not implemented") +} + +func (c *Conn) sendMsgs(ms []Message, flags int) (int, error) { + return 0, errors.New("not implemented") +} diff --git a/api/vendor/golang.org/x/net/internal/socket/rawconn_nomsg.go b/api/vendor/golang.org/x/net/internal/socket/rawconn_nomsg.go new file mode 100644 index 0000000..96733cb --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/rawconn_nomsg.go @@ -0,0 +1,18 @@ +// 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. + +// +build go1.9 +// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows + +package socket + +import "errors" + +func (c *Conn) recvMsg(m *Message, flags int) error { + return errors.New("not implemented") +} + +func (c *Conn) sendMsg(m *Message, flags int) error { + return errors.New("not implemented") +} diff --git a/api/vendor/golang.org/x/net/internal/socket/rawconn_stub.go b/api/vendor/golang.org/x/net/internal/socket/rawconn_stub.go new file mode 100644 index 0000000..d2add1a --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/rawconn_stub.go @@ -0,0 +1,25 @@ +// 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. + +// +build !go1.9 + +package socket + +import "errors" + +func (c *Conn) recvMsg(m *Message, flags int) error { + return errors.New("not implemented") +} + +func (c *Conn) sendMsg(m *Message, flags int) error { + return errors.New("not implemented") +} + +func (c *Conn) recvMsgs(ms []Message, flags int) (int, error) { + return 0, errors.New("not implemented") +} + +func (c *Conn) sendMsgs(ms []Message, flags int) (int, error) { + return 0, errors.New("not implemented") +} diff --git a/api/vendor/golang.org/x/net/internal/socket/reflect.go b/api/vendor/golang.org/x/net/internal/socket/reflect.go new file mode 100644 index 0000000..bb179f1 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/reflect.go @@ -0,0 +1,62 @@ +// 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. + +// +build !go1.9 + +package socket + +import ( + "errors" + "net" + "os" + "reflect" + "runtime" +) + +// A Conn represents a raw connection. +type Conn struct { + c net.Conn +} + +// NewConn returns a new raw connection. +func NewConn(c net.Conn) (*Conn, error) { + return &Conn{c: c}, nil +} + +func (o *Option) get(c *Conn, b []byte) (int, error) { + s, err := socketOf(c.c) + if err != nil { + return 0, err + } + n, err := getsockopt(s, o.Level, o.Name, b) + return n, os.NewSyscallError("getsockopt", err) +} + +func (o *Option) set(c *Conn, b []byte) error { + s, err := socketOf(c.c) + if err != nil { + return err + } + return os.NewSyscallError("setsockopt", setsockopt(s, o.Level, o.Name, b)) +} + +func socketOf(c net.Conn) (uintptr, error) { + switch c.(type) { + case *net.TCPConn, *net.UDPConn, *net.IPConn: + v := reflect.ValueOf(c) + switch e := v.Elem(); e.Kind() { + case reflect.Struct: + fd := e.FieldByName("conn").FieldByName("fd") + switch e := fd.Elem(); e.Kind() { + case reflect.Struct: + sysfd := e.FieldByName("sysfd") + if runtime.GOOS == "windows" { + return uintptr(sysfd.Uint()), nil + } + return uintptr(sysfd.Int()), nil + } + } + } + return 0, errors.New("invalid type") +} diff --git a/api/vendor/golang.org/x/net/internal/socket/socket.go b/api/vendor/golang.org/x/net/internal/socket/socket.go new file mode 100644 index 0000000..5f9730e --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/socket.go @@ -0,0 +1,285 @@ +// 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 socket provides a portable interface for socket system +// calls. +package socket // import "golang.org/x/net/internal/socket" + +import ( + "errors" + "net" + "unsafe" +) + +// An Option represents a sticky socket option. +type Option struct { + Level int // level + Name int // name; must be equal or greater than 1 + Len int // length of value in bytes; must be equal or greater than 1 +} + +// Get reads a value for the option from the kernel. +// It returns the number of bytes written into b. +func (o *Option) Get(c *Conn, b []byte) (int, error) { + if o.Name < 1 || o.Len < 1 { + return 0, errors.New("invalid option") + } + if len(b) < o.Len { + return 0, errors.New("short buffer") + } + return o.get(c, b) +} + +// GetInt returns an integer value for the option. +// +// The Len field of Option must be either 1 or 4. +func (o *Option) GetInt(c *Conn) (int, error) { + if o.Len != 1 && o.Len != 4 { + return 0, errors.New("invalid option") + } + var b []byte + var bb [4]byte + if o.Len == 1 { + b = bb[:1] + } else { + b = bb[:4] + } + n, err := o.get(c, b) + if err != nil { + return 0, err + } + if n != o.Len { + return 0, errors.New("invalid option length") + } + if o.Len == 1 { + return int(b[0]), nil + } + return int(NativeEndian.Uint32(b[:4])), nil +} + +// Set writes the option and value to the kernel. +func (o *Option) Set(c *Conn, b []byte) error { + if o.Name < 1 || o.Len < 1 { + return errors.New("invalid option") + } + if len(b) < o.Len { + return errors.New("short buffer") + } + return o.set(c, b) +} + +// SetInt writes the option and value to the kernel. +// +// The Len field of Option must be either 1 or 4. +func (o *Option) SetInt(c *Conn, v int) error { + if o.Len != 1 && o.Len != 4 { + return errors.New("invalid option") + } + var b []byte + if o.Len == 1 { + b = []byte{byte(v)} + } else { + var bb [4]byte + NativeEndian.PutUint32(bb[:o.Len], uint32(v)) + b = bb[:4] + } + return o.set(c, b) +} + +func controlHeaderLen() int { + return roundup(sizeofCmsghdr) +} + +func controlMessageLen(dataLen int) int { + return roundup(sizeofCmsghdr) + dataLen +} + +// ControlMessageSpace returns the whole length of control message. +func ControlMessageSpace(dataLen int) int { + return roundup(sizeofCmsghdr) + roundup(dataLen) +} + +// A ControlMessage represents the head message in a stream of control +// messages. +// +// A control message comprises of a header, data and a few padding +// fields to conform to the interface to the kernel. +// +// See RFC 3542 for further information. +type ControlMessage []byte + +// Data returns the data field of the control message at the head on +// m. +func (m ControlMessage) Data(dataLen int) []byte { + l := controlHeaderLen() + if len(m) < l || len(m) < l+dataLen { + return nil + } + return m[l : l+dataLen] +} + +// Next returns the control message at the next on m. +// +// Next works only for standard control messages. +func (m ControlMessage) Next(dataLen int) ControlMessage { + l := ControlMessageSpace(dataLen) + if len(m) < l { + return nil + } + return m[l:] +} + +// MarshalHeader marshals the header fields of the control message at +// the head on m. +func (m ControlMessage) MarshalHeader(lvl, typ, dataLen int) error { + if len(m) < controlHeaderLen() { + return errors.New("short message") + } + h := (*cmsghdr)(unsafe.Pointer(&m[0])) + h.set(controlMessageLen(dataLen), lvl, typ) + return nil +} + +// ParseHeader parses and returns the header fields of the control +// message at the head on m. +func (m ControlMessage) ParseHeader() (lvl, typ, dataLen int, err error) { + l := controlHeaderLen() + if len(m) < l { + return 0, 0, 0, errors.New("short message") + } + h := (*cmsghdr)(unsafe.Pointer(&m[0])) + return h.lvl(), h.typ(), int(uint64(h.len()) - uint64(l)), nil +} + +// Marshal marshals the control message at the head on m, and returns +// the next control message. +func (m ControlMessage) Marshal(lvl, typ int, data []byte) (ControlMessage, error) { + l := len(data) + if len(m) < ControlMessageSpace(l) { + return nil, errors.New("short message") + } + h := (*cmsghdr)(unsafe.Pointer(&m[0])) + h.set(controlMessageLen(l), lvl, typ) + if l > 0 { + copy(m.Data(l), data) + } + return m.Next(l), nil +} + +// Parse parses m as a single or multiple control messages. +// +// Parse works for both standard and compatible messages. +func (m ControlMessage) Parse() ([]ControlMessage, error) { + var ms []ControlMessage + for len(m) >= controlHeaderLen() { + h := (*cmsghdr)(unsafe.Pointer(&m[0])) + l := h.len() + if l <= 0 { + return nil, errors.New("invalid header length") + } + if uint64(l) < uint64(controlHeaderLen()) { + return nil, errors.New("invalid message length") + } + if uint64(l) > uint64(len(m)) { + return nil, errors.New("short buffer") + } + // On message reception: + // + // |<- ControlMessageSpace --------------->| + // |<- controlMessageLen ---------->| | + // |<- controlHeaderLen ->| | | + // +---------------+------+---------+------+ + // | Header | PadH | Data | PadD | + // +---------------+------+---------+------+ + // + // On compatible message reception: + // + // | ... |<- controlMessageLen ----------->| + // | ... |<- controlHeaderLen ->| | + // +-----+---------------+------+----------+ + // | ... | Header | PadH | Data | + // +-----+---------------+------+----------+ + ms = append(ms, ControlMessage(m[:l])) + ll := l - controlHeaderLen() + if len(m) >= ControlMessageSpace(ll) { + m = m[ControlMessageSpace(ll):] + } else { + m = m[controlMessageLen(ll):] + } + } + return ms, nil +} + +// NewControlMessage returns a new stream of control messages. +func NewControlMessage(dataLen []int) ControlMessage { + var l int + for i := range dataLen { + l += ControlMessageSpace(dataLen[i]) + } + return make([]byte, l) +} + +// A Message represents an IO message. +type Message struct { + // When writing, the Buffers field must contain at least one + // byte to write. + // When reading, the Buffers field will always contain a byte + // to read. + Buffers [][]byte + + // OOB contains protocol-specific control or miscellaneous + // ancillary data known as out-of-band data. + OOB []byte + + // Addr specifies a destination address when writing. + // It can be nil when the underlying protocol of the raw + // connection uses connection-oriented communication. + // After a successful read, it may contain the source address + // on the received packet. + Addr net.Addr + + N int // # of bytes read or written from/to Buffers + NN int // # of bytes read or written from/to OOB + Flags int // protocol-specific information on the received message +} + +// RecvMsg wraps recvmsg system call. +// +// The provided flags is a set of platform-dependent flags, such as +// syscall.MSG_PEEK. +func (c *Conn) RecvMsg(m *Message, flags int) error { + return c.recvMsg(m, flags) +} + +// SendMsg wraps sendmsg system call. +// +// The provided flags is a set of platform-dependent flags, such as +// syscall.MSG_DONTROUTE. +func (c *Conn) SendMsg(m *Message, flags int) error { + return c.sendMsg(m, flags) +} + +// RecvMsgs wraps recvmmsg system call. +// +// It returns the number of processed messages. +// +// The provided flags is a set of platform-dependent flags, such as +// syscall.MSG_PEEK. +// +// Only Linux supports this. +func (c *Conn) RecvMsgs(ms []Message, flags int) (int, error) { + return c.recvMsgs(ms, flags) +} + +// SendMsgs wraps sendmmsg system call. +// +// It returns the number of processed messages. +// +// The provided flags is a set of platform-dependent flags, such as +// syscall.MSG_DONTROUTE. +// +// Only Linux supports this. +func (c *Conn) SendMsgs(ms []Message, flags int) (int, error) { + return c.sendMsgs(ms, flags) +} diff --git a/api/vendor/golang.org/x/net/internal/socket/socket_go1_9_test.go b/api/vendor/golang.org/x/net/internal/socket/socket_go1_9_test.go new file mode 100644 index 0000000..c4edd4a --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/socket_go1_9_test.go @@ -0,0 +1,259 @@ +// 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. + +// +build go1.9 +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +package socket_test + +import ( + "bytes" + "fmt" + "net" + "runtime" + "testing" + + "golang.org/x/net/internal/nettest" + "golang.org/x/net/internal/socket" +) + +type mockControl struct { + Level int + Type int + Data []byte +} + +func TestControlMessage(t *testing.T) { + for _, tt := range []struct { + cs []mockControl + }{ + { + []mockControl{ + {Level: 1, Type: 1}, + }, + }, + { + []mockControl{ + {Level: 2, Type: 2, Data: []byte{0xfe}}, + }, + }, + { + []mockControl{ + {Level: 3, Type: 3, Data: []byte{0xfe, 0xff, 0xff, 0xfe}}, + }, + }, + { + []mockControl{ + {Level: 4, Type: 4, Data: []byte{0xfe, 0xff, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xfe}}, + }, + }, + { + []mockControl{ + {Level: 4, Type: 4, Data: []byte{0xfe, 0xff, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xfe}}, + {Level: 2, Type: 2, Data: []byte{0xfe}}, + }, + }, + } { + var w []byte + var tailPadLen int + mm := socket.NewControlMessage([]int{0}) + for i, c := range tt.cs { + m := socket.NewControlMessage([]int{len(c.Data)}) + l := len(m) - len(mm) + if i == len(tt.cs)-1 && l > len(c.Data) { + tailPadLen = l - len(c.Data) + } + w = append(w, m...) + } + + var err error + ww := make([]byte, len(w)) + copy(ww, w) + m := socket.ControlMessage(ww) + for _, c := range tt.cs { + if err = m.MarshalHeader(c.Level, c.Type, len(c.Data)); err != nil { + t.Fatalf("(%v).MarshalHeader() = %v", tt.cs, err) + } + copy(m.Data(len(c.Data)), c.Data) + m = m.Next(len(c.Data)) + } + m = socket.ControlMessage(w) + for _, c := range tt.cs { + m, err = m.Marshal(c.Level, c.Type, c.Data) + if err != nil { + t.Fatalf("(%v).Marshal() = %v", tt.cs, err) + } + } + if !bytes.Equal(ww, w) { + t.Fatalf("got %#v; want %#v", ww, w) + } + + ws := [][]byte{w} + if tailPadLen > 0 { + // Test a message with no tail padding. + nopad := w[:len(w)-tailPadLen] + ws = append(ws, [][]byte{nopad}...) + } + for _, w := range ws { + ms, err := socket.ControlMessage(w).Parse() + if err != nil { + t.Fatalf("(%v).Parse() = %v", tt.cs, err) + } + for i, m := range ms { + lvl, typ, dataLen, err := m.ParseHeader() + if err != nil { + t.Fatalf("(%v).ParseHeader() = %v", tt.cs, err) + } + if lvl != tt.cs[i].Level || typ != tt.cs[i].Type || dataLen != len(tt.cs[i].Data) { + t.Fatalf("%v: got %d, %d, %d; want %d, %d, %d", tt.cs[i], lvl, typ, dataLen, tt.cs[i].Level, tt.cs[i].Type, len(tt.cs[i].Data)) + } + } + } + } +} + +func TestUDP(t *testing.T) { + c, err := nettest.NewLocalPacketListener("udp") + if err != nil { + t.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + cc, err := socket.NewConn(c.(net.Conn)) + if err != nil { + t.Fatal(err) + } + + t.Run("Message", func(t *testing.T) { + data := []byte("HELLO-R-U-THERE") + wm := socket.Message{ + Buffers: bytes.SplitAfter(data, []byte("-")), + Addr: c.LocalAddr(), + } + if err := cc.SendMsg(&wm, 0); err != nil { + t.Fatal(err) + } + b := make([]byte, 32) + rm := socket.Message{ + Buffers: [][]byte{b[:1], b[1:3], b[3:7], b[7:11], b[11:]}, + } + if err := cc.RecvMsg(&rm, 0); err != nil { + t.Fatal(err) + } + if !bytes.Equal(b[:rm.N], data) { + t.Fatalf("got %#v; want %#v", b[:rm.N], data) + } + }) + switch runtime.GOOS { + case "android", "linux": + t.Run("Messages", func(t *testing.T) { + data := []byte("HELLO-R-U-THERE") + wmbs := bytes.SplitAfter(data, []byte("-")) + wms := []socket.Message{ + {Buffers: wmbs[:1], Addr: c.LocalAddr()}, + {Buffers: wmbs[1:], Addr: c.LocalAddr()}, + } + n, err := cc.SendMsgs(wms, 0) + if err != nil { + t.Fatal(err) + } + if n != len(wms) { + t.Fatalf("got %d; want %d", n, len(wms)) + } + b := make([]byte, 32) + rmbs := [][][]byte{{b[:len(wmbs[0])]}, {b[len(wmbs[0]):]}} + rms := []socket.Message{ + {Buffers: rmbs[0]}, + {Buffers: rmbs[1]}, + } + n, err = cc.RecvMsgs(rms, 0) + if err != nil { + t.Fatal(err) + } + if n != len(rms) { + t.Fatalf("got %d; want %d", n, len(rms)) + } + nn := 0 + for i := 0; i < n; i++ { + nn += rms[i].N + } + if !bytes.Equal(b[:nn], data) { + t.Fatalf("got %#v; want %#v", b[:nn], data) + } + }) + } + + // The behavior of transmission for zero byte paylaod depends + // on each platform implementation. Some may transmit only + // protocol header and options, other may transmit nothing. + // We test only that SendMsg and SendMsgs will not crash with + // empty buffers. + wm := socket.Message{ + Buffers: [][]byte{{}}, + Addr: c.LocalAddr(), + } + cc.SendMsg(&wm, 0) + wms := []socket.Message{ + {Buffers: [][]byte{{}}, Addr: c.LocalAddr()}, + } + cc.SendMsgs(wms, 0) +} + +func BenchmarkUDP(b *testing.B) { + c, err := nettest.NewLocalPacketListener("udp") + if err != nil { + b.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + cc, err := socket.NewConn(c.(net.Conn)) + if err != nil { + b.Fatal(err) + } + data := []byte("HELLO-R-U-THERE") + wm := socket.Message{ + Buffers: [][]byte{data}, + Addr: c.LocalAddr(), + } + rm := socket.Message{ + Buffers: [][]byte{make([]byte, 128)}, + OOB: make([]byte, 128), + } + + for M := 1; M <= 1<<9; M = M << 1 { + b.Run(fmt.Sprintf("Iter-%d", M), func(b *testing.B) { + for i := 0; i < b.N; i++ { + for j := 0; j < M; j++ { + if err := cc.SendMsg(&wm, 0); err != nil { + b.Fatal(err) + } + if err := cc.RecvMsg(&rm, 0); err != nil { + b.Fatal(err) + } + } + } + }) + switch runtime.GOOS { + case "android", "linux": + wms := make([]socket.Message, M) + for i := range wms { + wms[i].Buffers = [][]byte{data} + wms[i].Addr = c.LocalAddr() + } + rms := make([]socket.Message, M) + for i := range rms { + rms[i].Buffers = [][]byte{make([]byte, 128)} + rms[i].OOB = make([]byte, 128) + } + b.Run(fmt.Sprintf("Batch-%d", M), func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := cc.SendMsgs(wms, 0); err != nil { + b.Fatal(err) + } + if _, err := cc.RecvMsgs(rms, 0); err != nil { + b.Fatal(err) + } + } + }) + } + } +} diff --git a/api/vendor/golang.org/x/net/internal/socket/socket_test.go b/api/vendor/golang.org/x/net/internal/socket/socket_test.go new file mode 100644 index 0000000..bf3751b --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/socket_test.go @@ -0,0 +1,46 @@ +// 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows + +package socket_test + +import ( + "net" + "runtime" + "syscall" + "testing" + + "golang.org/x/net/internal/nettest" + "golang.org/x/net/internal/socket" +) + +func TestSocket(t *testing.T) { + t.Run("Option", func(t *testing.T) { + testSocketOption(t, &socket.Option{Level: syscall.SOL_SOCKET, Name: syscall.SO_RCVBUF, Len: 4}) + }) +} + +func testSocketOption(t *testing.T, so *socket.Option) { + c, err := nettest.NewLocalPacketListener("udp") + if err != nil { + t.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + cc, err := socket.NewConn(c.(net.Conn)) + if err != nil { + t.Fatal(err) + } + const N = 2048 + if err := so.SetInt(cc, N); err != nil { + t.Fatal(err) + } + n, err := so.GetInt(cc) + if err != nil { + t.Fatal(err) + } + if n < N { + t.Fatalf("got %d; want greater than or equal to %d", n, N) + } +} diff --git a/api/vendor/golang.org/x/net/internal/socket/sys.go b/api/vendor/golang.org/x/net/internal/socket/sys.go new file mode 100644 index 0000000..4f0eead --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/sys.go @@ -0,0 +1,33 @@ +// 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 socket + +import ( + "encoding/binary" + "unsafe" +) + +var ( + // NativeEndian is the machine native endian implementation of + // ByteOrder. + NativeEndian binary.ByteOrder + + kernelAlign int +) + +func init() { + i := uint32(1) + b := (*[4]byte)(unsafe.Pointer(&i)) + if b[0] == 1 { + NativeEndian = binary.LittleEndian + } else { + NativeEndian = binary.BigEndian + } + kernelAlign = probeProtocolStack() +} + +func roundup(l int) int { + return (l + kernelAlign - 1) & ^(kernelAlign - 1) +} diff --git a/api/vendor/golang.org/x/net/internal/socket/sys_bsd.go b/api/vendor/golang.org/x/net/internal/socket/sys_bsd.go new file mode 100644 index 0000000..f13e14f --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/sys_bsd.go @@ -0,0 +1,17 @@ +// 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. + +// +build darwin dragonfly freebsd openbsd + +package socket + +import "errors" + +func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + return 0, errors.New("not implemented") +} + +func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + return 0, errors.New("not implemented") +} diff --git a/api/vendor/golang.org/x/net/internal/socket/sys_bsdvar.go b/api/vendor/golang.org/x/net/internal/socket/sys_bsdvar.go new file mode 100644 index 0000000..f723fa3 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/sys_bsdvar.go @@ -0,0 +1,14 @@ +// 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. + +// +build freebsd netbsd openbsd + +package socket + +import "unsafe" + +func probeProtocolStack() int { + var p uintptr + return int(unsafe.Sizeof(p)) +} diff --git a/api/vendor/golang.org/x/net/internal/socket/sys_darwin.go b/api/vendor/golang.org/x/net/internal/socket/sys_darwin.go new file mode 100644 index 0000000..b17d223 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/sys_darwin.go @@ -0,0 +1,7 @@ +// 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 socket + +func probeProtocolStack() int { return 4 } diff --git a/api/vendor/golang.org/x/net/internal/socket/sys_dragonfly.go b/api/vendor/golang.org/x/net/internal/socket/sys_dragonfly.go new file mode 100644 index 0000000..b17d223 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/sys_dragonfly.go @@ -0,0 +1,7 @@ +// 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 socket + +func probeProtocolStack() int { return 4 } diff --git a/api/vendor/golang.org/x/net/internal/socket/sys_linux.go b/api/vendor/golang.org/x/net/internal/socket/sys_linux.go new file mode 100644 index 0000000..1559521 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/sys_linux.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. + +// +build linux,!s390x,!386 + +package socket + +import ( + "syscall" + "unsafe" +) + +func probeProtocolStack() int { + var p uintptr + return int(unsafe.Sizeof(p)) +} + +func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + n, _, errno := syscall.Syscall6(sysRECVMMSG, s, uintptr(unsafe.Pointer(&hs[0])), uintptr(len(hs)), uintptr(flags), 0, 0) + return int(n), errnoErr(errno) +} + +func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + n, _, errno := syscall.Syscall6(sysSENDMMSG, s, uintptr(unsafe.Pointer(&hs[0])), uintptr(len(hs)), uintptr(flags), 0, 0) + return int(n), errnoErr(errno) +} diff --git a/api/vendor/golang.org/x/net/internal/socket/sys_linux_386.go b/api/vendor/golang.org/x/net/internal/socket/sys_linux_386.go new file mode 100644 index 0000000..235b2cc --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/sys_linux_386.go @@ -0,0 +1,55 @@ +// 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 socket + +import ( + "syscall" + "unsafe" +) + +func probeProtocolStack() int { return 4 } + +const ( + sysSETSOCKOPT = 0xe + sysGETSOCKOPT = 0xf + sysSENDMSG = 0x10 + sysRECVMSG = 0x11 + sysRECVMMSG = 0x13 + sysSENDMMSG = 0x14 +) + +func socketcall(call, a0, a1, a2, a3, a4, a5 uintptr) (uintptr, syscall.Errno) +func rawsocketcall(call, a0, a1, a2, a3, a4, a5 uintptr) (uintptr, syscall.Errno) + +func getsockopt(s uintptr, level, name int, b []byte) (int, error) { + l := uint32(len(b)) + _, errno := socketcall(sysGETSOCKOPT, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(unsafe.Pointer(&l)), 0) + return int(l), errnoErr(errno) +} + +func setsockopt(s uintptr, level, name int, b []byte) error { + _, errno := socketcall(sysSETSOCKOPT, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(len(b)), 0) + return errnoErr(errno) +} + +func recvmsg(s uintptr, h *msghdr, flags int) (int, error) { + n, errno := socketcall(sysRECVMSG, s, uintptr(unsafe.Pointer(h)), uintptr(flags), 0, 0, 0) + return int(n), errnoErr(errno) +} + +func sendmsg(s uintptr, h *msghdr, flags int) (int, error) { + n, errno := socketcall(sysSENDMSG, s, uintptr(unsafe.Pointer(h)), uintptr(flags), 0, 0, 0) + return int(n), errnoErr(errno) +} + +func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + n, errno := socketcall(sysRECVMMSG, s, uintptr(unsafe.Pointer(&hs[0])), uintptr(len(hs)), uintptr(flags), 0, 0) + return int(n), errnoErr(errno) +} + +func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + n, errno := socketcall(sysSENDMMSG, s, uintptr(unsafe.Pointer(&hs[0])), uintptr(len(hs)), uintptr(flags), 0, 0) + return int(n), errnoErr(errno) +} diff --git a/api/vendor/golang.org/x/net/internal/socket/sys_linux_386.s b/api/vendor/golang.org/x/net/internal/socket/sys_linux_386.s new file mode 100644 index 0000000..93e7d75 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/sys_linux_386.s @@ -0,0 +1,11 @@ +// 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. + +#include "textflag.h" + +TEXT ·socketcall(SB),NOSPLIT,$0-36 + JMP syscall·socketcall(SB) + +TEXT ·rawsocketcall(SB),NOSPLIT,$0-36 + JMP syscall·rawsocketcall(SB) diff --git a/api/vendor/golang.org/x/net/internal/socket/sys_linux_amd64.go b/api/vendor/golang.org/x/net/internal/socket/sys_linux_amd64.go new file mode 100644 index 0000000..9decee2 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/sys_linux_amd64.go @@ -0,0 +1,10 @@ +// 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 socket + +const ( + sysRECVMMSG = 0x12b + sysSENDMMSG = 0x133 +) diff --git a/api/vendor/golang.org/x/net/internal/socket/sys_linux_arm.go b/api/vendor/golang.org/x/net/internal/socket/sys_linux_arm.go new file mode 100644 index 0000000..d753b43 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/sys_linux_arm.go @@ -0,0 +1,10 @@ +// 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 socket + +const ( + sysRECVMMSG = 0x16d + sysSENDMMSG = 0x176 +) diff --git a/api/vendor/golang.org/x/net/internal/socket/sys_linux_arm64.go b/api/vendor/golang.org/x/net/internal/socket/sys_linux_arm64.go new file mode 100644 index 0000000..b670894 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/sys_linux_arm64.go @@ -0,0 +1,10 @@ +// 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 socket + +const ( + sysRECVMMSG = 0xf3 + sysSENDMMSG = 0x10d +) diff --git a/api/vendor/golang.org/x/net/internal/socket/sys_linux_mips.go b/api/vendor/golang.org/x/net/internal/socket/sys_linux_mips.go new file mode 100644 index 0000000..9c0d740 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/sys_linux_mips.go @@ -0,0 +1,10 @@ +// 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 socket + +const ( + sysRECVMMSG = 0x10ef + sysSENDMMSG = 0x10f7 +) diff --git a/api/vendor/golang.org/x/net/internal/socket/sys_linux_mips64.go b/api/vendor/golang.org/x/net/internal/socket/sys_linux_mips64.go new file mode 100644 index 0000000..071a4ab --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/sys_linux_mips64.go @@ -0,0 +1,10 @@ +// 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 socket + +const ( + sysRECVMMSG = 0x14ae + sysSENDMMSG = 0x14b6 +) diff --git a/api/vendor/golang.org/x/net/internal/socket/sys_linux_mips64le.go b/api/vendor/golang.org/x/net/internal/socket/sys_linux_mips64le.go new file mode 100644 index 0000000..071a4ab --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/sys_linux_mips64le.go @@ -0,0 +1,10 @@ +// 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 socket + +const ( + sysRECVMMSG = 0x14ae + sysSENDMMSG = 0x14b6 +) diff --git a/api/vendor/golang.org/x/net/internal/socket/sys_linux_mipsle.go b/api/vendor/golang.org/x/net/internal/socket/sys_linux_mipsle.go new file mode 100644 index 0000000..9c0d740 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/sys_linux_mipsle.go @@ -0,0 +1,10 @@ +// 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 socket + +const ( + sysRECVMMSG = 0x10ef + sysSENDMMSG = 0x10f7 +) diff --git a/api/vendor/golang.org/x/net/internal/socket/sys_linux_ppc64.go b/api/vendor/golang.org/x/net/internal/socket/sys_linux_ppc64.go new file mode 100644 index 0000000..21c1e3f --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/sys_linux_ppc64.go @@ -0,0 +1,10 @@ +// 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 socket + +const ( + sysRECVMMSG = 0x157 + sysSENDMMSG = 0x15d +) diff --git a/api/vendor/golang.org/x/net/internal/socket/sys_linux_ppc64le.go b/api/vendor/golang.org/x/net/internal/socket/sys_linux_ppc64le.go new file mode 100644 index 0000000..21c1e3f --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/sys_linux_ppc64le.go @@ -0,0 +1,10 @@ +// 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 socket + +const ( + sysRECVMMSG = 0x157 + sysSENDMMSG = 0x15d +) diff --git a/api/vendor/golang.org/x/net/internal/socket/sys_linux_s390x.go b/api/vendor/golang.org/x/net/internal/socket/sys_linux_s390x.go new file mode 100644 index 0000000..327979e --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/sys_linux_s390x.go @@ -0,0 +1,55 @@ +// 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 socket + +import ( + "syscall" + "unsafe" +) + +func probeProtocolStack() int { return 8 } + +const ( + sysSETSOCKOPT = 0xe + sysGETSOCKOPT = 0xf + sysSENDMSG = 0x10 + sysRECVMSG = 0x11 + sysRECVMMSG = 0x13 + sysSENDMMSG = 0x14 +) + +func socketcall(call, a0, a1, a2, a3, a4, a5 uintptr) (uintptr, syscall.Errno) +func rawsocketcall(call, a0, a1, a2, a3, a4, a5 uintptr) (uintptr, syscall.Errno) + +func getsockopt(s uintptr, level, name int, b []byte) (int, error) { + l := uint32(len(b)) + _, errno := socketcall(sysGETSOCKOPT, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(unsafe.Pointer(&l)), 0) + return int(l), errnoErr(errno) +} + +func setsockopt(s uintptr, level, name int, b []byte) error { + _, errno := socketcall(sysSETSOCKOPT, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(len(b)), 0) + return errnoErr(errno) +} + +func recvmsg(s uintptr, h *msghdr, flags int) (int, error) { + n, errno := socketcall(sysRECVMSG, s, uintptr(unsafe.Pointer(h)), uintptr(flags), 0, 0, 0) + return int(n), errnoErr(errno) +} + +func sendmsg(s uintptr, h *msghdr, flags int) (int, error) { + n, errno := socketcall(sysSENDMSG, s, uintptr(unsafe.Pointer(h)), uintptr(flags), 0, 0, 0) + return int(n), errnoErr(errno) +} + +func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + n, errno := socketcall(sysRECVMMSG, s, uintptr(unsafe.Pointer(&hs[0])), uintptr(len(hs)), uintptr(flags), 0, 0) + return int(n), errnoErr(errno) +} + +func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + n, errno := socketcall(sysSENDMMSG, s, uintptr(unsafe.Pointer(&hs[0])), uintptr(len(hs)), uintptr(flags), 0, 0) + return int(n), errnoErr(errno) +} diff --git a/api/vendor/golang.org/x/net/internal/socket/sys_linux_s390x.s b/api/vendor/golang.org/x/net/internal/socket/sys_linux_s390x.s new file mode 100644 index 0000000..06d7562 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/sys_linux_s390x.s @@ -0,0 +1,11 @@ +// 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. + +#include "textflag.h" + +TEXT ·socketcall(SB),NOSPLIT,$0-72 + JMP syscall·socketcall(SB) + +TEXT ·rawsocketcall(SB),NOSPLIT,$0-72 + JMP syscall·rawsocketcall(SB) diff --git a/api/vendor/golang.org/x/net/internal/socket/sys_netbsd.go b/api/vendor/golang.org/x/net/internal/socket/sys_netbsd.go new file mode 100644 index 0000000..431851c --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/sys_netbsd.go @@ -0,0 +1,25 @@ +// 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 socket + +import ( + "syscall" + "unsafe" +) + +const ( + sysRECVMMSG = 0x1db + sysSENDMMSG = 0x1dc +) + +func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + n, _, errno := syscall.Syscall6(sysRECVMMSG, s, uintptr(unsafe.Pointer(&hs[0])), uintptr(len(hs)), uintptr(flags), 0, 0) + return int(n), errnoErr(errno) +} + +func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + n, _, errno := syscall.Syscall6(sysSENDMMSG, s, uintptr(unsafe.Pointer(&hs[0])), uintptr(len(hs)), uintptr(flags), 0, 0) + return int(n), errnoErr(errno) +} diff --git a/api/vendor/golang.org/x/net/internal/socket/sys_posix.go b/api/vendor/golang.org/x/net/internal/socket/sys_posix.go new file mode 100644 index 0000000..dc130c2 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/sys_posix.go @@ -0,0 +1,168 @@ +// 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. + +// +build go1.9 +// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows + +package socket + +import ( + "encoding/binary" + "errors" + "net" + "runtime" + "strconv" + "sync" + "time" +) + +func marshalInetAddr(a net.Addr) []byte { + switch a := a.(type) { + case *net.TCPAddr: + return marshalSockaddr(a.IP, a.Port, a.Zone) + case *net.UDPAddr: + return marshalSockaddr(a.IP, a.Port, a.Zone) + case *net.IPAddr: + return marshalSockaddr(a.IP, 0, a.Zone) + default: + return nil + } +} + +func marshalSockaddr(ip net.IP, port int, zone string) []byte { + if ip4 := ip.To4(); ip4 != nil { + b := make([]byte, sizeofSockaddrInet) + switch runtime.GOOS { + case "android", "linux", "solaris", "windows": + NativeEndian.PutUint16(b[:2], uint16(sysAF_INET)) + default: + b[0] = sizeofSockaddrInet + b[1] = sysAF_INET + } + binary.BigEndian.PutUint16(b[2:4], uint16(port)) + copy(b[4:8], ip4) + return b + } + if ip6 := ip.To16(); ip6 != nil && ip.To4() == nil { + b := make([]byte, sizeofSockaddrInet6) + switch runtime.GOOS { + case "android", "linux", "solaris", "windows": + NativeEndian.PutUint16(b[:2], uint16(sysAF_INET6)) + default: + b[0] = sizeofSockaddrInet6 + b[1] = sysAF_INET6 + } + binary.BigEndian.PutUint16(b[2:4], uint16(port)) + copy(b[8:24], ip6) + if zone != "" { + NativeEndian.PutUint32(b[24:28], uint32(zoneCache.index(zone))) + } + return b + } + return nil +} + +func parseInetAddr(b []byte, network string) (net.Addr, error) { + if len(b) < 2 { + return nil, errors.New("invalid address") + } + var af int + switch runtime.GOOS { + case "android", "linux", "solaris", "windows": + af = int(NativeEndian.Uint16(b[:2])) + default: + af = int(b[1]) + } + var ip net.IP + var zone string + if af == sysAF_INET { + if len(b) < sizeofSockaddrInet { + return nil, errors.New("short address") + } + ip = make(net.IP, net.IPv4len) + copy(ip, b[4:8]) + } + if af == sysAF_INET6 { + if len(b) < sizeofSockaddrInet6 { + return nil, errors.New("short address") + } + ip = make(net.IP, net.IPv6len) + copy(ip, b[8:24]) + if id := int(NativeEndian.Uint32(b[24:28])); id > 0 { + zone = zoneCache.name(id) + } + } + switch network { + case "tcp", "tcp4", "tcp6": + return &net.TCPAddr{IP: ip, Port: int(binary.BigEndian.Uint16(b[2:4])), Zone: zone}, nil + case "udp", "udp4", "udp6": + return &net.UDPAddr{IP: ip, Port: int(binary.BigEndian.Uint16(b[2:4])), Zone: zone}, nil + default: + return &net.IPAddr{IP: ip, Zone: zone}, nil + } +} + +// An ipv6ZoneCache represents a cache holding partial network +// interface information. It is used for reducing the cost of IPv6 +// addressing scope zone resolution. +// +// Multiple names sharing the index are managed by first-come +// first-served basis for consistency. +type ipv6ZoneCache struct { + sync.RWMutex // guard the following + lastFetched time.Time // last time routing information was fetched + toIndex map[string]int // interface name to its index + toName map[int]string // interface index to its name +} + +var zoneCache = ipv6ZoneCache{ + toIndex: make(map[string]int), + toName: make(map[int]string), +} + +func (zc *ipv6ZoneCache) update(ift []net.Interface) { + zc.Lock() + defer zc.Unlock() + now := time.Now() + if zc.lastFetched.After(now.Add(-60 * time.Second)) { + return + } + zc.lastFetched = now + if len(ift) == 0 { + var err error + if ift, err = net.Interfaces(); err != nil { + return + } + } + zc.toIndex = make(map[string]int, len(ift)) + zc.toName = make(map[int]string, len(ift)) + for _, ifi := range ift { + zc.toIndex[ifi.Name] = ifi.Index + if _, ok := zc.toName[ifi.Index]; !ok { + zc.toName[ifi.Index] = ifi.Name + } + } +} + +func (zc *ipv6ZoneCache) name(zone int) string { + zoneCache.update(nil) + zoneCache.RLock() + defer zoneCache.RUnlock() + name, ok := zoneCache.toName[zone] + if !ok { + name = strconv.Itoa(zone) + } + return name +} + +func (zc *ipv6ZoneCache) index(zone string) int { + zoneCache.update(nil) + zoneCache.RLock() + defer zoneCache.RUnlock() + index, ok := zoneCache.toIndex[zone] + if !ok { + index, _ = strconv.Atoi(zone) + } + return index +} diff --git a/api/vendor/golang.org/x/net/internal/socket/sys_solaris.go b/api/vendor/golang.org/x/net/internal/socket/sys_solaris.go new file mode 100644 index 0000000..cced74e --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/sys_solaris.go @@ -0,0 +1,71 @@ +// 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 socket + +import ( + "errors" + "runtime" + "syscall" + "unsafe" +) + +func probeProtocolStack() int { + switch runtime.GOARCH { + case "amd64": + return 4 + default: + var p uintptr + return int(unsafe.Sizeof(p)) + } +} + +//go:cgo_import_dynamic libc___xnet_getsockopt __xnet_getsockopt "libsocket.so" +//go:cgo_import_dynamic libc_setsockopt setsockopt "libsocket.so" +//go:cgo_import_dynamic libc___xnet_recvmsg __xnet_recvmsg "libsocket.so" +//go:cgo_import_dynamic libc___xnet_sendmsg __xnet_sendmsg "libsocket.so" + +//go:linkname procGetsockopt libc___xnet_getsockopt +//go:linkname procSetsockopt libc_setsockopt +//go:linkname procRecvmsg libc___xnet_recvmsg +//go:linkname procSendmsg libc___xnet_sendmsg + +var ( + procGetsockopt uintptr + procSetsockopt uintptr + procRecvmsg uintptr + procSendmsg uintptr +) + +func sysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (uintptr, uintptr, syscall.Errno) +func rawSysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (uintptr, uintptr, syscall.Errno) + +func getsockopt(s uintptr, level, name int, b []byte) (int, error) { + l := uint32(len(b)) + _, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procGetsockopt)), 5, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(unsafe.Pointer(&l)), 0) + return int(l), errnoErr(errno) +} + +func setsockopt(s uintptr, level, name int, b []byte) error { + _, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procSetsockopt)), 5, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(len(b)), 0) + return errnoErr(errno) +} + +func recvmsg(s uintptr, h *msghdr, flags int) (int, error) { + n, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procRecvmsg)), 3, s, uintptr(unsafe.Pointer(h)), uintptr(flags), 0, 0, 0) + return int(n), errnoErr(errno) +} + +func sendmsg(s uintptr, h *msghdr, flags int) (int, error) { + n, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procSendmsg)), 3, s, uintptr(unsafe.Pointer(h)), uintptr(flags), 0, 0, 0) + return int(n), errnoErr(errno) +} + +func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + return 0, errors.New("not implemented") +} + +func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + return 0, errors.New("not implemented") +} diff --git a/api/vendor/golang.org/x/net/internal/socket/sys_solaris_amd64.s b/api/vendor/golang.org/x/net/internal/socket/sys_solaris_amd64.s new file mode 100644 index 0000000..a18ac5e --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/sys_solaris_amd64.s @@ -0,0 +1,11 @@ +// 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. + +#include "textflag.h" + +TEXT ·sysvicall6(SB),NOSPLIT,$0-88 + JMP syscall·sysvicall6(SB) + +TEXT ·rawSysvicall6(SB),NOSPLIT,$0-88 + JMP syscall·rawSysvicall6(SB) diff --git a/api/vendor/golang.org/x/net/internal/socket/sys_stub.go b/api/vendor/golang.org/x/net/internal/socket/sys_stub.go new file mode 100644 index 0000000..d9f06d0 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/sys_stub.go @@ -0,0 +1,64 @@ +// 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. + +// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows + +package socket + +import ( + "errors" + "net" + "runtime" + "unsafe" +) + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0xa + + sysSOCK_RAW = 0x3 +) + +func probeProtocolStack() int { + switch runtime.GOARCH { + case "amd64p32", "mips64p32": + return 4 + default: + var p uintptr + return int(unsafe.Sizeof(p)) + } +} + +func marshalInetAddr(ip net.IP, port int, zone string) []byte { + return nil +} + +func parseInetAddr(b []byte, network string) (net.Addr, error) { + return nil, errors.New("not implemented") +} + +func getsockopt(s uintptr, level, name int, b []byte) (int, error) { + return 0, errors.New("not implemented") +} + +func setsockopt(s uintptr, level, name int, b []byte) error { + return errors.New("not implemented") +} + +func recvmsg(s uintptr, h *msghdr, flags int) (int, error) { + return 0, errors.New("not implemented") +} + +func sendmsg(s uintptr, h *msghdr, flags int) (int, error) { + return 0, errors.New("not implemented") +} + +func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + return 0, errors.New("not implemented") +} + +func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + return 0, errors.New("not implemented") +} diff --git a/api/vendor/golang.org/x/net/internal/socket/sys_unix.go b/api/vendor/golang.org/x/net/internal/socket/sys_unix.go new file mode 100644 index 0000000..18eba30 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/sys_unix.go @@ -0,0 +1,33 @@ +// 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. + +// +build darwin dragonfly freebsd linux,!s390x,!386 netbsd openbsd + +package socket + +import ( + "syscall" + "unsafe" +) + +func getsockopt(s uintptr, level, name int, b []byte) (int, error) { + l := uint32(len(b)) + _, _, errno := syscall.Syscall6(syscall.SYS_GETSOCKOPT, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(unsafe.Pointer(&l)), 0) + return int(l), errnoErr(errno) +} + +func setsockopt(s uintptr, level, name int, b []byte) error { + _, _, errno := syscall.Syscall6(syscall.SYS_SETSOCKOPT, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(len(b)), 0) + return errnoErr(errno) +} + +func recvmsg(s uintptr, h *msghdr, flags int) (int, error) { + n, _, errno := syscall.Syscall(syscall.SYS_RECVMSG, s, uintptr(unsafe.Pointer(h)), uintptr(flags)) + return int(n), errnoErr(errno) +} + +func sendmsg(s uintptr, h *msghdr, flags int) (int, error) { + n, _, errno := syscall.Syscall(syscall.SYS_SENDMSG, s, uintptr(unsafe.Pointer(h)), uintptr(flags)) + return int(n), errnoErr(errno) +} diff --git a/api/vendor/golang.org/x/net/internal/socket/sys_windows.go b/api/vendor/golang.org/x/net/internal/socket/sys_windows.go new file mode 100644 index 0000000..54a470e --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/sys_windows.go @@ -0,0 +1,70 @@ +// 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 socket + +import ( + "errors" + "syscall" + "unsafe" +) + +func probeProtocolStack() int { + var p uintptr + return int(unsafe.Sizeof(p)) +} + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0x17 + + sysSOCK_RAW = 0x3 +) + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) + +func getsockopt(s uintptr, level, name int, b []byte) (int, error) { + l := uint32(len(b)) + err := syscall.Getsockopt(syscall.Handle(s), int32(level), int32(name), (*byte)(unsafe.Pointer(&b[0])), (*int32)(unsafe.Pointer(&l))) + return int(l), err +} + +func setsockopt(s uintptr, level, name int, b []byte) error { + return syscall.Setsockopt(syscall.Handle(s), int32(level), int32(name), (*byte)(unsafe.Pointer(&b[0])), int32(len(b))) +} + +func recvmsg(s uintptr, h *msghdr, flags int) (int, error) { + return 0, errors.New("not implemented") +} + +func sendmsg(s uintptr, h *msghdr, flags int) (int, error) { + return 0, errors.New("not implemented") +} + +func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + return 0, errors.New("not implemented") +} + +func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + return 0, errors.New("not implemented") +} diff --git a/api/vendor/golang.org/x/net/internal/socket/zsys_darwin_386.go b/api/vendor/golang.org/x/net/internal/socket/zsys_darwin_386.go new file mode 100644 index 0000000..26f8fef --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/zsys_darwin_386.go @@ -0,0 +1,59 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_darwin.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0x1e + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint32 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x8 + sizeofMsghdr = 0x1c + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/vendor/golang.org/x/net/internal/socket/zsys_darwin_amd64.go b/api/vendor/golang.org/x/net/internal/socket/zsys_darwin_amd64.go new file mode 100644 index 0000000..e2987f7 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/zsys_darwin_amd64.go @@ -0,0 +1,61 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_darwin.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0x1e + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen int32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x30 + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm.go b/api/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm.go new file mode 100644 index 0000000..26f8fef --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm.go @@ -0,0 +1,59 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_darwin.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0x1e + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint32 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x8 + sizeofMsghdr = 0x1c + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm64.go b/api/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm64.go new file mode 100644 index 0000000..e2987f7 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm64.go @@ -0,0 +1,61 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_darwin.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0x1e + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen int32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x30 + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/vendor/golang.org/x/net/internal/socket/zsys_dragonfly_amd64.go b/api/vendor/golang.org/x/net/internal/socket/zsys_dragonfly_amd64.go new file mode 100644 index 0000000..c582abd --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/zsys_dragonfly_amd64.go @@ -0,0 +1,61 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_dragonfly.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0x1c + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen int32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x30 + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/vendor/golang.org/x/net/internal/socket/zsys_freebsd_386.go b/api/vendor/golang.org/x/net/internal/socket/zsys_freebsd_386.go new file mode 100644 index 0000000..04a2488 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/zsys_freebsd_386.go @@ -0,0 +1,59 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_freebsd.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0x1c + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint32 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x8 + sizeofMsghdr = 0x1c + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/vendor/golang.org/x/net/internal/socket/zsys_freebsd_amd64.go b/api/vendor/golang.org/x/net/internal/socket/zsys_freebsd_amd64.go new file mode 100644 index 0000000..35c7cb9 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/zsys_freebsd_amd64.go @@ -0,0 +1,61 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_freebsd.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0x1c + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen int32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x30 + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm.go b/api/vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm.go new file mode 100644 index 0000000..04a2488 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm.go @@ -0,0 +1,59 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_freebsd.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0x1c + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint32 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x8 + sizeofMsghdr = 0x1c + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/vendor/golang.org/x/net/internal/socket/zsys_linux_386.go b/api/vendor/golang.org/x/net/internal/socket/zsys_linux_386.go new file mode 100644 index 0000000..4302069 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/zsys_linux_386.go @@ -0,0 +1,63 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0xa + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint32 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x8 + sizeofMsghdr = 0x1c + sizeofMmsghdr = 0x20 + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/vendor/golang.org/x/net/internal/socket/zsys_linux_amd64.go b/api/vendor/golang.org/x/net/internal/socket/zsys_linux_amd64.go new file mode 100644 index 0000000..1502f6c --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/zsys_linux_amd64.go @@ -0,0 +1,66 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0xa + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + Pad_cgo_1 [4]byte +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 + Pad_cgo_0 [4]byte +} + +type cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x38 + sizeofMmsghdr = 0x40 + sizeofCmsghdr = 0x10 + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/vendor/golang.org/x/net/internal/socket/zsys_linux_arm.go b/api/vendor/golang.org/x/net/internal/socket/zsys_linux_arm.go new file mode 100644 index 0000000..4302069 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/zsys_linux_arm.go @@ -0,0 +1,63 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0xa + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint32 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x8 + sizeofMsghdr = 0x1c + sizeofMmsghdr = 0x20 + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/vendor/golang.org/x/net/internal/socket/zsys_linux_arm64.go b/api/vendor/golang.org/x/net/internal/socket/zsys_linux_arm64.go new file mode 100644 index 0000000..1502f6c --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/zsys_linux_arm64.go @@ -0,0 +1,66 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0xa + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + Pad_cgo_1 [4]byte +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 + Pad_cgo_0 [4]byte +} + +type cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x38 + sizeofMmsghdr = 0x40 + sizeofCmsghdr = 0x10 + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/vendor/golang.org/x/net/internal/socket/zsys_linux_mips.go b/api/vendor/golang.org/x/net/internal/socket/zsys_linux_mips.go new file mode 100644 index 0000000..4302069 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/zsys_linux_mips.go @@ -0,0 +1,63 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0xa + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint32 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x8 + sizeofMsghdr = 0x1c + sizeofMmsghdr = 0x20 + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64.go b/api/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64.go new file mode 100644 index 0000000..1502f6c --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64.go @@ -0,0 +1,66 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0xa + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + Pad_cgo_1 [4]byte +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 + Pad_cgo_0 [4]byte +} + +type cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x38 + sizeofMmsghdr = 0x40 + sizeofCmsghdr = 0x10 + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64le.go b/api/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64le.go new file mode 100644 index 0000000..1502f6c --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64le.go @@ -0,0 +1,66 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0xa + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + Pad_cgo_1 [4]byte +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 + Pad_cgo_0 [4]byte +} + +type cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x38 + sizeofMmsghdr = 0x40 + sizeofCmsghdr = 0x10 + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/vendor/golang.org/x/net/internal/socket/zsys_linux_mipsle.go b/api/vendor/golang.org/x/net/internal/socket/zsys_linux_mipsle.go new file mode 100644 index 0000000..4302069 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/zsys_linux_mipsle.go @@ -0,0 +1,63 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0xa + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint32 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x8 + sizeofMsghdr = 0x1c + sizeofMmsghdr = 0x20 + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64.go b/api/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64.go new file mode 100644 index 0000000..1502f6c --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64.go @@ -0,0 +1,66 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0xa + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + Pad_cgo_1 [4]byte +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 + Pad_cgo_0 [4]byte +} + +type cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x38 + sizeofMmsghdr = 0x40 + sizeofCmsghdr = 0x10 + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64le.go b/api/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64le.go new file mode 100644 index 0000000..1502f6c --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64le.go @@ -0,0 +1,66 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0xa + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + Pad_cgo_1 [4]byte +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 + Pad_cgo_0 [4]byte +} + +type cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x38 + sizeofMmsghdr = 0x40 + sizeofCmsghdr = 0x10 + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/vendor/golang.org/x/net/internal/socket/zsys_linux_s390x.go b/api/vendor/golang.org/x/net/internal/socket/zsys_linux_s390x.go new file mode 100644 index 0000000..1502f6c --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/zsys_linux_s390x.go @@ -0,0 +1,66 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0xa + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + Pad_cgo_1 [4]byte +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 + Pad_cgo_0 [4]byte +} + +type cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x38 + sizeofMmsghdr = 0x40 + sizeofCmsghdr = 0x10 + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/vendor/golang.org/x/net/internal/socket/zsys_netbsd_386.go b/api/vendor/golang.org/x/net/internal/socket/zsys_netbsd_386.go new file mode 100644 index 0000000..db60491 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/zsys_netbsd_386.go @@ -0,0 +1,65 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_netbsd.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0x18 + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint32 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x8 + sizeofMsghdr = 0x1c + sizeofMmsghdr = 0x20 + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/vendor/golang.org/x/net/internal/socket/zsys_netbsd_amd64.go b/api/vendor/golang.org/x/net/internal/socket/zsys_netbsd_amd64.go new file mode 100644 index 0000000..2a1a799 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/zsys_netbsd_amd64.go @@ -0,0 +1,68 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_netbsd.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0x18 + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen int32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 + Pad_cgo_0 [4]byte +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x30 + sizeofMmsghdr = 0x40 + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm.go b/api/vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm.go new file mode 100644 index 0000000..db60491 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm.go @@ -0,0 +1,65 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_netbsd.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0x18 + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint32 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x8 + sizeofMsghdr = 0x1c + sizeofMmsghdr = 0x20 + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/vendor/golang.org/x/net/internal/socket/zsys_openbsd_386.go b/api/vendor/golang.org/x/net/internal/socket/zsys_openbsd_386.go new file mode 100644 index 0000000..1c83636 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/zsys_openbsd_386.go @@ -0,0 +1,59 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_openbsd.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0x18 + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint32 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x8 + sizeofMsghdr = 0x1c + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/vendor/golang.org/x/net/internal/socket/zsys_openbsd_amd64.go b/api/vendor/golang.org/x/net/internal/socket/zsys_openbsd_amd64.go new file mode 100644 index 0000000..a6c0bf4 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/zsys_openbsd_amd64.go @@ -0,0 +1,61 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_openbsd.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0x18 + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen uint32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x30 + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm.go b/api/vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm.go new file mode 100644 index 0000000..1c83636 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm.go @@ -0,0 +1,59 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_openbsd.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0x18 + + sysSOCK_RAW = 0x3 +) + +type iovec struct { + Base *byte + Len uint32 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x8 + sizeofMsghdr = 0x1c + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/vendor/golang.org/x/net/internal/socket/zsys_solaris_amd64.go b/api/vendor/golang.org/x/net/internal/socket/zsys_solaris_amd64.go new file mode 100644 index 0000000..327c632 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socket/zsys_solaris_amd64.go @@ -0,0 +1,60 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_solaris.go + +package socket + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0x1a + + sysSOCK_RAW = 0x4 +) + +type iovec struct { + Base *int8 + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen int32 + Pad_cgo_1 [4]byte + Accrights *int8 + Accrightslen int32 + Pad_cgo_2 [4]byte +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 + X__sin6_src_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x30 + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x20 +) diff --git a/api/vendor/golang.org/x/net/internal/socks/client.go b/api/vendor/golang.org/x/net/internal/socks/client.go new file mode 100644 index 0000000..3d6f516 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socks/client.go @@ -0,0 +1,168 @@ +// 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 socks + +import ( + "context" + "errors" + "io" + "net" + "strconv" + "time" +) + +var ( + noDeadline = time.Time{} + aLongTimeAgo = time.Unix(1, 0) +) + +func (d *Dialer) connect(ctx context.Context, c net.Conn, address string) (_ net.Addr, ctxErr error) { + host, port, err := splitHostPort(address) + if err != nil { + return nil, err + } + if deadline, ok := ctx.Deadline(); ok && !deadline.IsZero() { + c.SetDeadline(deadline) + defer c.SetDeadline(noDeadline) + } + if ctx != context.Background() { + errCh := make(chan error, 1) + done := make(chan struct{}) + defer func() { + close(done) + if ctxErr == nil { + ctxErr = <-errCh + } + }() + go func() { + select { + case <-ctx.Done(): + c.SetDeadline(aLongTimeAgo) + errCh <- ctx.Err() + case <-done: + errCh <- nil + } + }() + } + + b := make([]byte, 0, 6+len(host)) // the size here is just an estimate + b = append(b, Version5) + if len(d.AuthMethods) == 0 || d.Authenticate == nil { + b = append(b, 1, byte(AuthMethodNotRequired)) + } else { + ams := d.AuthMethods + if len(ams) > 255 { + return nil, errors.New("too many authentication methods") + } + b = append(b, byte(len(ams))) + for _, am := range ams { + b = append(b, byte(am)) + } + } + if _, ctxErr = c.Write(b); ctxErr != nil { + return + } + + if _, ctxErr = io.ReadFull(c, b[:2]); ctxErr != nil { + return + } + if b[0] != Version5 { + return nil, errors.New("unexpected protocol version " + strconv.Itoa(int(b[0]))) + } + am := AuthMethod(b[1]) + if am == AuthMethodNoAcceptableMethods { + return nil, errors.New("no acceptable authentication methods") + } + if d.Authenticate != nil { + if ctxErr = d.Authenticate(ctx, c, am); ctxErr != nil { + return + } + } + + b = b[:0] + b = append(b, Version5, byte(d.cmd), 0) + if ip := net.ParseIP(host); ip != nil { + if ip4 := ip.To4(); ip4 != nil { + b = append(b, AddrTypeIPv4) + b = append(b, ip4...) + } else if ip6 := ip.To16(); ip6 != nil { + b = append(b, AddrTypeIPv6) + b = append(b, ip6...) + } else { + return nil, errors.New("unknown address type") + } + } else { + if len(host) > 255 { + return nil, errors.New("FQDN too long") + } + b = append(b, AddrTypeFQDN) + b = append(b, byte(len(host))) + b = append(b, host...) + } + b = append(b, byte(port>>8), byte(port)) + if _, ctxErr = c.Write(b); ctxErr != nil { + return + } + + if _, ctxErr = io.ReadFull(c, b[:4]); ctxErr != nil { + return + } + if b[0] != Version5 { + return nil, errors.New("unexpected protocol version " + strconv.Itoa(int(b[0]))) + } + if cmdErr := Reply(b[1]); cmdErr != StatusSucceeded { + return nil, errors.New("unknown error " + cmdErr.String()) + } + if b[2] != 0 { + return nil, errors.New("non-zero reserved field") + } + l := 2 + var a Addr + switch b[3] { + case AddrTypeIPv4: + l += net.IPv4len + a.IP = make(net.IP, net.IPv4len) + case AddrTypeIPv6: + l += net.IPv6len + a.IP = make(net.IP, net.IPv6len) + case AddrTypeFQDN: + if _, err := io.ReadFull(c, b[:1]); err != nil { + return nil, err + } + l += int(b[0]) + default: + return nil, errors.New("unknown address type " + strconv.Itoa(int(b[3]))) + } + if cap(b) < l { + b = make([]byte, l) + } else { + b = b[:l] + } + if _, ctxErr = io.ReadFull(c, b); ctxErr != nil { + return + } + if a.IP != nil { + copy(a.IP, b) + } else { + a.Name = string(b[:len(b)-2]) + } + a.Port = int(b[len(b)-2])<<8 | int(b[len(b)-1]) + return &a, nil +} + +func splitHostPort(address string) (string, int, error) { + host, port, err := net.SplitHostPort(address) + if err != nil { + return "", 0, err + } + portnum, err := strconv.Atoi(port) + if err != nil { + return "", 0, err + } + if 1 > portnum || portnum > 0xffff { + return "", 0, errors.New("port number out of range " + port) + } + return host, portnum, nil +} diff --git a/api/vendor/golang.org/x/net/internal/socks/dial_test.go b/api/vendor/golang.org/x/net/internal/socks/dial_test.go new file mode 100644 index 0000000..3a7a31b --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socks/dial_test.go @@ -0,0 +1,170 @@ +// 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 socks_test + +import ( + "context" + "io" + "math/rand" + "net" + "os" + "testing" + "time" + + "golang.org/x/net/internal/socks" + "golang.org/x/net/internal/sockstest" +) + +func TestDial(t *testing.T) { + t.Run("Connect", func(t *testing.T) { + ss, err := sockstest.NewServer(sockstest.NoAuthRequired, sockstest.NoProxyRequired) + if err != nil { + t.Fatal(err) + } + defer ss.Close() + d := socks.NewDialer(ss.Addr().Network(), ss.Addr().String()) + d.AuthMethods = []socks.AuthMethod{ + socks.AuthMethodNotRequired, + socks.AuthMethodUsernamePassword, + } + d.Authenticate = (&socks.UsernamePassword{ + Username: "username", + Password: "password", + }).Authenticate + c, err := d.DialContext(context.Background(), ss.TargetAddr().Network(), ss.TargetAddr().String()) + if err != nil { + t.Fatal(err) + } + c.(*socks.Conn).BoundAddr() + c.Close() + }) + t.Run("ConnectWithConn", func(t *testing.T) { + ss, err := sockstest.NewServer(sockstest.NoAuthRequired, sockstest.NoProxyRequired) + if err != nil { + t.Fatal(err) + } + defer ss.Close() + c, err := net.Dial(ss.Addr().Network(), ss.Addr().String()) + if err != nil { + t.Fatal(err) + } + defer c.Close() + d := socks.NewDialer(ss.Addr().Network(), ss.Addr().String()) + d.AuthMethods = []socks.AuthMethod{ + socks.AuthMethodNotRequired, + socks.AuthMethodUsernamePassword, + } + d.Authenticate = (&socks.UsernamePassword{ + Username: "username", + Password: "password", + }).Authenticate + a, err := d.DialWithConn(context.Background(), c, ss.TargetAddr().Network(), ss.TargetAddr().String()) + if err != nil { + t.Fatal(err) + } + if _, ok := a.(*socks.Addr); !ok { + t.Fatalf("got %+v; want socks.Addr", a) + } + }) + t.Run("Cancel", func(t *testing.T) { + ss, err := sockstest.NewServer(sockstest.NoAuthRequired, blackholeCmdFunc) + if err != nil { + t.Fatal(err) + } + defer ss.Close() + d := socks.NewDialer(ss.Addr().Network(), ss.Addr().String()) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + dialErr := make(chan error) + go func() { + c, err := d.DialContext(ctx, ss.TargetAddr().Network(), ss.TargetAddr().String()) + if err == nil { + c.Close() + } + dialErr <- err + }() + time.Sleep(100 * time.Millisecond) + cancel() + err = <-dialErr + if perr, nerr := parseDialError(err); perr != context.Canceled && nerr == nil { + t.Fatalf("got %v; want context.Canceled or equivalent", err) + } + }) + t.Run("Deadline", func(t *testing.T) { + ss, err := sockstest.NewServer(sockstest.NoAuthRequired, blackholeCmdFunc) + if err != nil { + t.Fatal(err) + } + defer ss.Close() + d := socks.NewDialer(ss.Addr().Network(), ss.Addr().String()) + ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(100*time.Millisecond)) + defer cancel() + c, err := d.DialContext(ctx, ss.TargetAddr().Network(), ss.TargetAddr().String()) + if err == nil { + c.Close() + } + if perr, nerr := parseDialError(err); perr != context.DeadlineExceeded && nerr == nil { + t.Fatalf("got %v; want context.DeadlineExceeded or equivalent", err) + } + }) + t.Run("WithRogueServer", func(t *testing.T) { + ss, err := sockstest.NewServer(sockstest.NoAuthRequired, rogueCmdFunc) + if err != nil { + t.Fatal(err) + } + defer ss.Close() + d := socks.NewDialer(ss.Addr().Network(), ss.Addr().String()) + for i := 0; i < 2*len(rogueCmdList); i++ { + ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(100*time.Millisecond)) + defer cancel() + c, err := d.DialContext(ctx, ss.TargetAddr().Network(), ss.TargetAddr().String()) + if err == nil { + t.Log(c.(*socks.Conn).BoundAddr()) + c.Close() + t.Error("should fail") + } + } + }) +} + +func blackholeCmdFunc(rw io.ReadWriter, b []byte) error { + if _, err := sockstest.ParseCmdRequest(b); err != nil { + return err + } + var bb [1]byte + for { + if _, err := rw.Read(bb[:]); err != nil { + return err + } + } +} + +func rogueCmdFunc(rw io.ReadWriter, b []byte) error { + if _, err := sockstest.ParseCmdRequest(b); err != nil { + return err + } + rw.Write(rogueCmdList[rand.Intn(len(rogueCmdList))]) + return nil +} + +var rogueCmdList = [][]byte{ + {0x05}, + {0x06, 0x00, 0x00, 0x01, 192, 0, 2, 1, 0x17, 0x4b}, + {0x05, 0x00, 0xff, 0x01, 192, 0, 2, 2, 0x17, 0x4b}, + {0x05, 0x00, 0x00, 0x01, 192, 0, 2, 3}, + {0x05, 0x00, 0x00, 0x03, 0x04, 'F', 'Q', 'D', 'N'}, +} + +func parseDialError(err error) (perr, nerr error) { + if e, ok := err.(*net.OpError); ok { + err = e.Err + nerr = e + } + if e, ok := err.(*os.SyscallError); ok { + err = e.Err + } + perr = err + return +} diff --git a/api/vendor/golang.org/x/net/internal/socks/socks.go b/api/vendor/golang.org/x/net/internal/socks/socks.go new file mode 100644 index 0000000..d93e699 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/socks/socks.go @@ -0,0 +1,316 @@ +// 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 socks provides a SOCKS version 5 client implementation. +// +// SOCKS protocol version 5 is defined in RFC 1928. +// Username/Password authentication for SOCKS version 5 is defined in +// RFC 1929. +package socks + +import ( + "context" + "errors" + "io" + "net" + "strconv" +) + +// A Command represents a SOCKS command. +type Command int + +func (cmd Command) String() string { + switch cmd { + case CmdConnect: + return "socks connect" + case cmdBind: + return "socks bind" + default: + return "socks " + strconv.Itoa(int(cmd)) + } +} + +// An AuthMethod represents a SOCKS authentication method. +type AuthMethod int + +// A Reply represents a SOCKS command reply code. +type Reply int + +func (code Reply) String() string { + switch code { + case StatusSucceeded: + return "succeeded" + case 0x01: + return "general SOCKS server failure" + case 0x02: + return "connection not allowed by ruleset" + case 0x03: + return "network unreachable" + case 0x04: + return "host unreachable" + case 0x05: + return "connection refused" + case 0x06: + return "TTL expired" + case 0x07: + return "command not supported" + case 0x08: + return "address type not supported" + default: + return "unknown code: " + strconv.Itoa(int(code)) + } +} + +// Wire protocol constants. +const ( + Version5 = 0x05 + + AddrTypeIPv4 = 0x01 + AddrTypeFQDN = 0x03 + AddrTypeIPv6 = 0x04 + + CmdConnect Command = 0x01 // establishes an active-open forward proxy connection + cmdBind Command = 0x02 // establishes a passive-open forward proxy connection + + AuthMethodNotRequired AuthMethod = 0x00 // no authentication required + AuthMethodUsernamePassword AuthMethod = 0x02 // use username/password + AuthMethodNoAcceptableMethods AuthMethod = 0xff // no acceptable authentication methods + + StatusSucceeded Reply = 0x00 +) + +// An Addr represents a SOCKS-specific address. +// Either Name or IP is used exclusively. +type Addr struct { + Name string // fully-qualified domain name + IP net.IP + Port int +} + +func (a *Addr) Network() string { return "socks" } + +func (a *Addr) String() string { + if a == nil { + return "" + } + port := strconv.Itoa(a.Port) + if a.IP == nil { + return net.JoinHostPort(a.Name, port) + } + return net.JoinHostPort(a.IP.String(), port) +} + +// A Conn represents a forward proxy connection. +type Conn struct { + net.Conn + + boundAddr net.Addr +} + +// BoundAddr returns the address assigned by the proxy server for +// connecting to the command target address from the proxy server. +func (c *Conn) BoundAddr() net.Addr { + if c == nil { + return nil + } + return c.boundAddr +} + +// A Dialer holds SOCKS-specific options. +type Dialer struct { + cmd Command // either CmdConnect or cmdBind + proxyNetwork string // network between a proxy server and a client + proxyAddress string // proxy server address + + // ProxyDial specifies the optional dial function for + // establishing the transport connection. + ProxyDial func(context.Context, string, string) (net.Conn, error) + + // AuthMethods specifies the list of request authention + // methods. + // If empty, SOCKS client requests only AuthMethodNotRequired. + AuthMethods []AuthMethod + + // Authenticate specifies the optional authentication + // function. It must be non-nil when AuthMethods is not empty. + // It must return an error when the authentication is failed. + Authenticate func(context.Context, io.ReadWriter, AuthMethod) error +} + +// DialContext connects to the provided address on the provided +// network. +// +// The returned error value may be a net.OpError. When the Op field of +// net.OpError contains "socks", the Source field contains a proxy +// server address and the Addr field contains a command target +// address. +// +// See func Dial of the net package of standard library for a +// description of the network and address parameters. +func (d *Dialer) DialContext(ctx context.Context, network, address string) (net.Conn, error) { + if err := d.validateTarget(network, address); err != nil { + proxy, dst, _ := d.pathAddrs(address) + return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err} + } + if ctx == nil { + proxy, dst, _ := d.pathAddrs(address) + return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: errors.New("nil context")} + } + var err error + var c net.Conn + if d.ProxyDial != nil { + c, err = d.ProxyDial(ctx, d.proxyNetwork, d.proxyAddress) + } else { + var dd net.Dialer + c, err = dd.DialContext(ctx, d.proxyNetwork, d.proxyAddress) + } + if err != nil { + proxy, dst, _ := d.pathAddrs(address) + return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err} + } + a, err := d.connect(ctx, c, address) + if err != nil { + c.Close() + proxy, dst, _ := d.pathAddrs(address) + return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err} + } + return &Conn{Conn: c, boundAddr: a}, nil +} + +// DialWithConn initiates a connection from SOCKS server to the target +// network and address using the connection c that is already +// connected to the SOCKS server. +// +// It returns the connection's local address assigned by the SOCKS +// server. +func (d *Dialer) DialWithConn(ctx context.Context, c net.Conn, network, address string) (net.Addr, error) { + if err := d.validateTarget(network, address); err != nil { + proxy, dst, _ := d.pathAddrs(address) + return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err} + } + if ctx == nil { + proxy, dst, _ := d.pathAddrs(address) + return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: errors.New("nil context")} + } + a, err := d.connect(ctx, c, address) + if err != nil { + proxy, dst, _ := d.pathAddrs(address) + return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err} + } + return a, nil +} + +// Dial connects to the provided address on the provided network. +// +// Unlike DialContext, it returns a raw transport connection instead +// of a forward proxy connection. +// +// Deprecated: Use DialContext or DialWithConn instead. +func (d *Dialer) Dial(network, address string) (net.Conn, error) { + if err := d.validateTarget(network, address); err != nil { + proxy, dst, _ := d.pathAddrs(address) + return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err} + } + var err error + var c net.Conn + if d.ProxyDial != nil { + c, err = d.ProxyDial(context.Background(), d.proxyNetwork, d.proxyAddress) + } else { + c, err = net.Dial(d.proxyNetwork, d.proxyAddress) + } + if err != nil { + proxy, dst, _ := d.pathAddrs(address) + return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err} + } + if _, err := d.DialWithConn(context.Background(), c, network, address); err != nil { + return nil, err + } + return c, nil +} + +func (d *Dialer) validateTarget(network, address string) error { + switch network { + case "tcp", "tcp6", "tcp4": + default: + return errors.New("network not implemented") + } + switch d.cmd { + case CmdConnect, cmdBind: + default: + return errors.New("command not implemented") + } + return nil +} + +func (d *Dialer) pathAddrs(address string) (proxy, dst net.Addr, err error) { + for i, s := range []string{d.proxyAddress, address} { + host, port, err := splitHostPort(s) + if err != nil { + return nil, nil, err + } + a := &Addr{Port: port} + a.IP = net.ParseIP(host) + if a.IP == nil { + a.Name = host + } + if i == 0 { + proxy = a + } else { + dst = a + } + } + return +} + +// NewDialer returns a new Dialer that dials through the provided +// proxy server's network and address. +func NewDialer(network, address string) *Dialer { + return &Dialer{proxyNetwork: network, proxyAddress: address, cmd: CmdConnect} +} + +const ( + authUsernamePasswordVersion = 0x01 + authStatusSucceeded = 0x00 +) + +// UsernamePassword are the credentials for the username/password +// authentication method. +type UsernamePassword struct { + Username string + Password string +} + +// Authenticate authenticates a pair of username and password with the +// proxy server. +func (up *UsernamePassword) Authenticate(ctx context.Context, rw io.ReadWriter, auth AuthMethod) error { + switch auth { + case AuthMethodNotRequired: + return nil + case AuthMethodUsernamePassword: + if len(up.Username) == 0 || len(up.Username) > 255 || len(up.Password) == 0 || len(up.Password) > 255 { + return errors.New("invalid username/password") + } + b := []byte{authUsernamePasswordVersion} + b = append(b, byte(len(up.Username))) + b = append(b, up.Username...) + b = append(b, byte(len(up.Password))) + b = append(b, up.Password...) + // TODO(mikio): handle IO deadlines and cancelation if + // necessary + if _, err := rw.Write(b); err != nil { + return err + } + if _, err := io.ReadFull(rw, b[:2]); err != nil { + return err + } + if b[0] != authUsernamePasswordVersion { + return errors.New("invalid username/password version") + } + if b[1] != authStatusSucceeded { + return errors.New("username/password authentication failed") + } + return nil + } + return errors.New("unsupported authentication method " + strconv.Itoa(int(auth))) +} diff --git a/api/vendor/golang.org/x/net/internal/sockstest/server.go b/api/vendor/golang.org/x/net/internal/sockstest/server.go new file mode 100644 index 0000000..3c6e9e9 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/sockstest/server.go @@ -0,0 +1,241 @@ +// 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 sockstest provides utilities for SOCKS testing. +package sockstest + +import ( + "errors" + "io" + "net" + + "golang.org/x/net/internal/nettest" + "golang.org/x/net/internal/socks" +) + +// An AuthRequest represents an authentication request. +type AuthRequest struct { + Version int + Methods []socks.AuthMethod +} + +// ParseAuthRequest parses an authentication request. +func ParseAuthRequest(b []byte) (*AuthRequest, error) { + if len(b) < 2 { + return nil, errors.New("short auth request") + } + if b[0] != socks.Version5 { + return nil, errors.New("unexpected protocol version") + } + if len(b)-2 < int(b[1]) { + return nil, errors.New("short auth request") + } + req := &AuthRequest{Version: int(b[0])} + if b[1] > 0 { + req.Methods = make([]socks.AuthMethod, b[1]) + for i, m := range b[2 : 2+b[1]] { + req.Methods[i] = socks.AuthMethod(m) + } + } + return req, nil +} + +// MarshalAuthReply returns an authentication reply in wire format. +func MarshalAuthReply(ver int, m socks.AuthMethod) ([]byte, error) { + return []byte{byte(ver), byte(m)}, nil +} + +// A CmdRequest repesents a command request. +type CmdRequest struct { + Version int + Cmd socks.Command + Addr socks.Addr +} + +// ParseCmdRequest parses a command request. +func ParseCmdRequest(b []byte) (*CmdRequest, error) { + if len(b) < 7 { + return nil, errors.New("short cmd request") + } + if b[0] != socks.Version5 { + return nil, errors.New("unexpected protocol version") + } + if socks.Command(b[1]) != socks.CmdConnect { + return nil, errors.New("unexpected command") + } + if b[2] != 0 { + return nil, errors.New("non-zero reserved field") + } + req := &CmdRequest{Version: int(b[0]), Cmd: socks.Command(b[1])} + l := 2 + off := 4 + switch b[3] { + case socks.AddrTypeIPv4: + l += net.IPv4len + req.Addr.IP = make(net.IP, net.IPv4len) + case socks.AddrTypeIPv6: + l += net.IPv6len + req.Addr.IP = make(net.IP, net.IPv6len) + case socks.AddrTypeFQDN: + l += int(b[4]) + off = 5 + default: + return nil, errors.New("unknown address type") + } + if len(b[off:]) < l { + return nil, errors.New("short cmd request") + } + if req.Addr.IP != nil { + copy(req.Addr.IP, b[off:]) + } else { + req.Addr.Name = string(b[off : off+l-2]) + } + req.Addr.Port = int(b[off+l-2])<<8 | int(b[off+l-1]) + return req, nil +} + +// MarshalCmdReply returns a command reply in wire format. +func MarshalCmdReply(ver int, reply socks.Reply, a *socks.Addr) ([]byte, error) { + b := make([]byte, 4) + b[0] = byte(ver) + b[1] = byte(reply) + if a.Name != "" { + if len(a.Name) > 255 { + return nil, errors.New("fqdn too long") + } + b[3] = socks.AddrTypeFQDN + b = append(b, byte(len(a.Name))) + b = append(b, a.Name...) + } else if ip4 := a.IP.To4(); ip4 != nil { + b[3] = socks.AddrTypeIPv4 + b = append(b, ip4...) + } else if ip6 := a.IP.To16(); ip6 != nil { + b[3] = socks.AddrTypeIPv6 + b = append(b, ip6...) + } else { + return nil, errors.New("unknown address type") + } + b = append(b, byte(a.Port>>8), byte(a.Port)) + return b, nil +} + +// A Server repesents a server for handshake testing. +type Server struct { + ln net.Listener +} + +// Addr rerurns a server address. +func (s *Server) Addr() net.Addr { + return s.ln.Addr() +} + +// TargetAddr returns a fake final destination address. +// +// The returned address is only valid for testing with Server. +func (s *Server) TargetAddr() net.Addr { + a := s.ln.Addr() + switch a := a.(type) { + case *net.TCPAddr: + if a.IP.To4() != nil { + return &net.TCPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 5963} + } + if a.IP.To16() != nil && a.IP.To4() == nil { + return &net.TCPAddr{IP: net.IPv6loopback, Port: 5963} + } + } + return nil +} + +// Close closes the server. +func (s *Server) Close() error { + return s.ln.Close() +} + +func (s *Server) serve(authFunc, cmdFunc func(io.ReadWriter, []byte) error) { + c, err := s.ln.Accept() + if err != nil { + return + } + defer c.Close() + go s.serve(authFunc, cmdFunc) + b := make([]byte, 512) + n, err := c.Read(b) + if err != nil { + return + } + if err := authFunc(c, b[:n]); err != nil { + return + } + n, err = c.Read(b) + if err != nil { + return + } + if err := cmdFunc(c, b[:n]); err != nil { + return + } +} + +// NewServer returns a new server. +// +// The provided authFunc and cmdFunc must parse requests and return +// appropriate replies to clients. +func NewServer(authFunc, cmdFunc func(io.ReadWriter, []byte) error) (*Server, error) { + var err error + s := new(Server) + s.ln, err = nettest.NewLocalListener("tcp") + if err != nil { + return nil, err + } + go s.serve(authFunc, cmdFunc) + return s, nil +} + +// NoAuthRequired handles a no-authentication-required signaling. +func NoAuthRequired(rw io.ReadWriter, b []byte) error { + req, err := ParseAuthRequest(b) + if err != nil { + return err + } + b, err = MarshalAuthReply(req.Version, socks.AuthMethodNotRequired) + if err != nil { + return err + } + n, err := rw.Write(b) + if err != nil { + return err + } + if n != len(b) { + return errors.New("short write") + } + return nil +} + +// NoProxyRequired handles a command signaling without constructing a +// proxy connection to the final destination. +func NoProxyRequired(rw io.ReadWriter, b []byte) error { + req, err := ParseCmdRequest(b) + if err != nil { + return err + } + req.Addr.Port += 1 + if req.Addr.Name != "" { + req.Addr.Name = "boundaddr.doesnotexist" + } else if req.Addr.IP.To4() != nil { + req.Addr.IP = net.IPv4(127, 0, 0, 1) + } else { + req.Addr.IP = net.IPv6loopback + } + b, err = MarshalCmdReply(socks.Version5, socks.StatusSucceeded, &req.Addr) + if err != nil { + return err + } + n, err := rw.Write(b) + if err != nil { + return err + } + if n != len(b) { + return errors.New("short write") + } + return nil +} diff --git a/api/vendor/golang.org/x/net/internal/sockstest/server_test.go b/api/vendor/golang.org/x/net/internal/sockstest/server_test.go new file mode 100644 index 0000000..2b02d81 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/sockstest/server_test.go @@ -0,0 +1,103 @@ +// 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 sockstest + +import ( + "net" + "reflect" + "testing" + + "golang.org/x/net/internal/socks" +) + +func TestParseAuthRequest(t *testing.T) { + for i, tt := range []struct { + wire []byte + req *AuthRequest + }{ + { + []byte{0x05, 0x00}, + &AuthRequest{ + socks.Version5, + nil, + }, + }, + { + []byte{0x05, 0x01, 0xff}, + &AuthRequest{ + socks.Version5, + []socks.AuthMethod{ + socks.AuthMethodNoAcceptableMethods, + }, + }, + }, + { + []byte{0x05, 0x02, 0x00, 0xff}, + &AuthRequest{ + socks.Version5, + []socks.AuthMethod{ + socks.AuthMethodNotRequired, + socks.AuthMethodNoAcceptableMethods, + }, + }, + }, + + // corrupted requests + {nil, nil}, + {[]byte{0x00, 0x01}, nil}, + {[]byte{0x06, 0x00}, nil}, + {[]byte{0x05, 0x02, 0x00}, nil}, + } { + req, err := ParseAuthRequest(tt.wire) + if !reflect.DeepEqual(req, tt.req) { + t.Errorf("#%d: got %v, %v; want %v", i, req, err, tt.req) + continue + } + } +} + +func TestParseCmdRequest(t *testing.T) { + for i, tt := range []struct { + wire []byte + req *CmdRequest + }{ + { + []byte{0x05, 0x01, 0x00, 0x01, 192, 0, 2, 1, 0x17, 0x4b}, + &CmdRequest{ + socks.Version5, + socks.CmdConnect, + socks.Addr{ + IP: net.IP{192, 0, 2, 1}, + Port: 5963, + }, + }, + }, + { + []byte{0x05, 0x01, 0x00, 0x03, 0x04, 'F', 'Q', 'D', 'N', 0x17, 0x4b}, + &CmdRequest{ + socks.Version5, + socks.CmdConnect, + socks.Addr{ + Name: "FQDN", + Port: 5963, + }, + }, + }, + + // corrupted requests + {nil, nil}, + {[]byte{0x05}, nil}, + {[]byte{0x06, 0x01, 0x00, 0x01, 192, 0, 2, 2, 0x17, 0x4b}, nil}, + {[]byte{0x05, 0x01, 0xff, 0x01, 192, 0, 2, 3}, nil}, + {[]byte{0x05, 0x01, 0x00, 0x01, 192, 0, 2, 4}, nil}, + {[]byte{0x05, 0x01, 0x00, 0x03, 0x04, 'F', 'Q', 'D', 'N'}, nil}, + } { + req, err := ParseCmdRequest(tt.wire) + if !reflect.DeepEqual(req, tt.req) { + t.Errorf("#%d: got %v, %v; want %v", i, req, err, tt.req) + continue + } + } +} diff --git a/api/vendor/golang.org/x/net/internal/timeseries/timeseries.go b/api/vendor/golang.org/x/net/internal/timeseries/timeseries.go new file mode 100644 index 0000000..685f0e7 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/timeseries/timeseries.go @@ -0,0 +1,525 @@ +// Copyright 2015 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 timeseries implements a time series structure for stats collection. +package timeseries // import "golang.org/x/net/internal/timeseries" + +import ( + "fmt" + "log" + "time" +) + +const ( + timeSeriesNumBuckets = 64 + minuteHourSeriesNumBuckets = 60 +) + +var timeSeriesResolutions = []time.Duration{ + 1 * time.Second, + 10 * time.Second, + 1 * time.Minute, + 10 * time.Minute, + 1 * time.Hour, + 6 * time.Hour, + 24 * time.Hour, // 1 day + 7 * 24 * time.Hour, // 1 week + 4 * 7 * 24 * time.Hour, // 4 weeks + 16 * 7 * 24 * time.Hour, // 16 weeks +} + +var minuteHourSeriesResolutions = []time.Duration{ + 1 * time.Second, + 1 * time.Minute, +} + +// An Observable is a kind of data that can be aggregated in a time series. +type Observable interface { + Multiply(ratio float64) // Multiplies the data in self by a given ratio + Add(other Observable) // Adds the data from a different observation to self + Clear() // Clears the observation so it can be reused. + CopyFrom(other Observable) // Copies the contents of a given observation to self +} + +// Float attaches the methods of Observable to a float64. +type Float float64 + +// NewFloat returns a Float. +func NewFloat() Observable { + f := Float(0) + return &f +} + +// String returns the float as a string. +func (f *Float) String() string { return fmt.Sprintf("%g", f.Value()) } + +// Value returns the float's value. +func (f *Float) Value() float64 { return float64(*f) } + +func (f *Float) Multiply(ratio float64) { *f *= Float(ratio) } + +func (f *Float) Add(other Observable) { + o := other.(*Float) + *f += *o +} + +func (f *Float) Clear() { *f = 0 } + +func (f *Float) CopyFrom(other Observable) { + o := other.(*Float) + *f = *o +} + +// A Clock tells the current time. +type Clock interface { + Time() time.Time +} + +type defaultClock int + +var defaultClockInstance defaultClock + +func (defaultClock) Time() time.Time { return time.Now() } + +// Information kept per level. Each level consists of a circular list of +// observations. The start of the level may be derived from end and the +// len(buckets) * sizeInMillis. +type tsLevel struct { + oldest int // index to oldest bucketed Observable + newest int // index to newest bucketed Observable + end time.Time // end timestamp for this level + size time.Duration // duration of the bucketed Observable + buckets []Observable // collections of observations + provider func() Observable // used for creating new Observable +} + +func (l *tsLevel) Clear() { + l.oldest = 0 + l.newest = len(l.buckets) - 1 + l.end = time.Time{} + for i := range l.buckets { + if l.buckets[i] != nil { + l.buckets[i].Clear() + l.buckets[i] = nil + } + } +} + +func (l *tsLevel) InitLevel(size time.Duration, numBuckets int, f func() Observable) { + l.size = size + l.provider = f + l.buckets = make([]Observable, numBuckets) +} + +// Keeps a sequence of levels. Each level is responsible for storing data at +// a given resolution. For example, the first level stores data at a one +// minute resolution while the second level stores data at a one hour +// resolution. + +// Each level is represented by a sequence of buckets. Each bucket spans an +// interval equal to the resolution of the level. New observations are added +// to the last bucket. +type timeSeries struct { + provider func() Observable // make more Observable + numBuckets int // number of buckets in each level + levels []*tsLevel // levels of bucketed Observable + lastAdd time.Time // time of last Observable tracked + total Observable // convenient aggregation of all Observable + clock Clock // Clock for getting current time + pending Observable // observations not yet bucketed + pendingTime time.Time // what time are we keeping in pending + dirty bool // if there are pending observations +} + +// init initializes a level according to the supplied criteria. +func (ts *timeSeries) init(resolutions []time.Duration, f func() Observable, numBuckets int, clock Clock) { + ts.provider = f + ts.numBuckets = numBuckets + ts.clock = clock + ts.levels = make([]*tsLevel, len(resolutions)) + + for i := range resolutions { + if i > 0 && resolutions[i-1] >= resolutions[i] { + log.Print("timeseries: resolutions must be monotonically increasing") + break + } + newLevel := new(tsLevel) + newLevel.InitLevel(resolutions[i], ts.numBuckets, ts.provider) + ts.levels[i] = newLevel + } + + ts.Clear() +} + +// Clear removes all observations from the time series. +func (ts *timeSeries) Clear() { + ts.lastAdd = time.Time{} + ts.total = ts.resetObservation(ts.total) + ts.pending = ts.resetObservation(ts.pending) + ts.pendingTime = time.Time{} + ts.dirty = false + + for i := range ts.levels { + ts.levels[i].Clear() + } +} + +// Add records an observation at the current time. +func (ts *timeSeries) Add(observation Observable) { + ts.AddWithTime(observation, ts.clock.Time()) +} + +// AddWithTime records an observation at the specified time. +func (ts *timeSeries) AddWithTime(observation Observable, t time.Time) { + + smallBucketDuration := ts.levels[0].size + + if t.After(ts.lastAdd) { + ts.lastAdd = t + } + + if t.After(ts.pendingTime) { + ts.advance(t) + ts.mergePendingUpdates() + ts.pendingTime = ts.levels[0].end + ts.pending.CopyFrom(observation) + ts.dirty = true + } else if t.After(ts.pendingTime.Add(-1 * smallBucketDuration)) { + // The observation is close enough to go into the pending bucket. + // This compensates for clock skewing and small scheduling delays + // by letting the update stay in the fast path. + ts.pending.Add(observation) + ts.dirty = true + } else { + ts.mergeValue(observation, t) + } +} + +// mergeValue inserts the observation at the specified time in the past into all levels. +func (ts *timeSeries) mergeValue(observation Observable, t time.Time) { + for _, level := range ts.levels { + index := (ts.numBuckets - 1) - int(level.end.Sub(t)/level.size) + if 0 <= index && index < ts.numBuckets { + bucketNumber := (level.oldest + index) % ts.numBuckets + if level.buckets[bucketNumber] == nil { + level.buckets[bucketNumber] = level.provider() + } + level.buckets[bucketNumber].Add(observation) + } + } + ts.total.Add(observation) +} + +// mergePendingUpdates applies the pending updates into all levels. +func (ts *timeSeries) mergePendingUpdates() { + if ts.dirty { + ts.mergeValue(ts.pending, ts.pendingTime) + ts.pending = ts.resetObservation(ts.pending) + ts.dirty = false + } +} + +// advance cycles the buckets at each level until the latest bucket in +// each level can hold the time specified. +func (ts *timeSeries) advance(t time.Time) { + if !t.After(ts.levels[0].end) { + return + } + for i := 0; i < len(ts.levels); i++ { + level := ts.levels[i] + if !level.end.Before(t) { + break + } + + // If the time is sufficiently far, just clear the level and advance + // directly. + if !t.Before(level.end.Add(level.size * time.Duration(ts.numBuckets))) { + for _, b := range level.buckets { + ts.resetObservation(b) + } + level.end = time.Unix(0, (t.UnixNano()/level.size.Nanoseconds())*level.size.Nanoseconds()) + } + + for t.After(level.end) { + level.end = level.end.Add(level.size) + level.newest = level.oldest + level.oldest = (level.oldest + 1) % ts.numBuckets + ts.resetObservation(level.buckets[level.newest]) + } + + t = level.end + } +} + +// Latest returns the sum of the num latest buckets from the level. +func (ts *timeSeries) Latest(level, num int) Observable { + now := ts.clock.Time() + if ts.levels[0].end.Before(now) { + ts.advance(now) + } + + ts.mergePendingUpdates() + + result := ts.provider() + l := ts.levels[level] + index := l.newest + + for i := 0; i < num; i++ { + if l.buckets[index] != nil { + result.Add(l.buckets[index]) + } + if index == 0 { + index = ts.numBuckets + } + index-- + } + + return result +} + +// LatestBuckets returns a copy of the num latest buckets from level. +func (ts *timeSeries) LatestBuckets(level, num int) []Observable { + if level < 0 || level > len(ts.levels) { + log.Print("timeseries: bad level argument: ", level) + return nil + } + if num < 0 || num >= ts.numBuckets { + log.Print("timeseries: bad num argument: ", num) + return nil + } + + results := make([]Observable, num) + now := ts.clock.Time() + if ts.levels[0].end.Before(now) { + ts.advance(now) + } + + ts.mergePendingUpdates() + + l := ts.levels[level] + index := l.newest + + for i := 0; i < num; i++ { + result := ts.provider() + results[i] = result + if l.buckets[index] != nil { + result.CopyFrom(l.buckets[index]) + } + + if index == 0 { + index = ts.numBuckets + } + index -= 1 + } + return results +} + +// ScaleBy updates observations by scaling by factor. +func (ts *timeSeries) ScaleBy(factor float64) { + for _, l := range ts.levels { + for i := 0; i < ts.numBuckets; i++ { + l.buckets[i].Multiply(factor) + } + } + + ts.total.Multiply(factor) + ts.pending.Multiply(factor) +} + +// Range returns the sum of observations added over the specified time range. +// If start or finish times don't fall on bucket boundaries of the same +// level, then return values are approximate answers. +func (ts *timeSeries) Range(start, finish time.Time) Observable { + return ts.ComputeRange(start, finish, 1)[0] +} + +// Recent returns the sum of observations from the last delta. +func (ts *timeSeries) Recent(delta time.Duration) Observable { + now := ts.clock.Time() + return ts.Range(now.Add(-delta), now) +} + +// Total returns the total of all observations. +func (ts *timeSeries) Total() Observable { + ts.mergePendingUpdates() + return ts.total +} + +// ComputeRange computes a specified number of values into a slice using +// the observations recorded over the specified time period. The return +// values are approximate if the start or finish times don't fall on the +// bucket boundaries at the same level or if the number of buckets spanning +// the range is not an integral multiple of num. +func (ts *timeSeries) ComputeRange(start, finish time.Time, num int) []Observable { + if start.After(finish) { + log.Printf("timeseries: start > finish, %v>%v", start, finish) + return nil + } + + if num < 0 { + log.Printf("timeseries: num < 0, %v", num) + return nil + } + + results := make([]Observable, num) + + for _, l := range ts.levels { + if !start.Before(l.end.Add(-l.size * time.Duration(ts.numBuckets))) { + ts.extract(l, start, finish, num, results) + return results + } + } + + // Failed to find a level that covers the desired range. So just + // extract from the last level, even if it doesn't cover the entire + // desired range. + ts.extract(ts.levels[len(ts.levels)-1], start, finish, num, results) + + return results +} + +// RecentList returns the specified number of values in slice over the most +// recent time period of the specified range. +func (ts *timeSeries) RecentList(delta time.Duration, num int) []Observable { + if delta < 0 { + return nil + } + now := ts.clock.Time() + return ts.ComputeRange(now.Add(-delta), now, num) +} + +// extract returns a slice of specified number of observations from a given +// level over a given range. +func (ts *timeSeries) extract(l *tsLevel, start, finish time.Time, num int, results []Observable) { + ts.mergePendingUpdates() + + srcInterval := l.size + dstInterval := finish.Sub(start) / time.Duration(num) + dstStart := start + srcStart := l.end.Add(-srcInterval * time.Duration(ts.numBuckets)) + + srcIndex := 0 + + // Where should scanning start? + if dstStart.After(srcStart) { + advance := dstStart.Sub(srcStart) / srcInterval + srcIndex += int(advance) + srcStart = srcStart.Add(advance * srcInterval) + } + + // The i'th value is computed as show below. + // interval = (finish/start)/num + // i'th value = sum of observation in range + // [ start + i * interval, + // start + (i + 1) * interval ) + for i := 0; i < num; i++ { + results[i] = ts.resetObservation(results[i]) + dstEnd := dstStart.Add(dstInterval) + for srcIndex < ts.numBuckets && srcStart.Before(dstEnd) { + srcEnd := srcStart.Add(srcInterval) + if srcEnd.After(ts.lastAdd) { + srcEnd = ts.lastAdd + } + + if !srcEnd.Before(dstStart) { + srcValue := l.buckets[(srcIndex+l.oldest)%ts.numBuckets] + if !srcStart.Before(dstStart) && !srcEnd.After(dstEnd) { + // dst completely contains src. + if srcValue != nil { + results[i].Add(srcValue) + } + } else { + // dst partially overlaps src. + overlapStart := maxTime(srcStart, dstStart) + overlapEnd := minTime(srcEnd, dstEnd) + base := srcEnd.Sub(srcStart) + fraction := overlapEnd.Sub(overlapStart).Seconds() / base.Seconds() + + used := ts.provider() + if srcValue != nil { + used.CopyFrom(srcValue) + } + used.Multiply(fraction) + results[i].Add(used) + } + + if srcEnd.After(dstEnd) { + break + } + } + srcIndex++ + srcStart = srcStart.Add(srcInterval) + } + dstStart = dstStart.Add(dstInterval) + } +} + +// resetObservation clears the content so the struct may be reused. +func (ts *timeSeries) resetObservation(observation Observable) Observable { + if observation == nil { + observation = ts.provider() + } else { + observation.Clear() + } + return observation +} + +// TimeSeries tracks data at granularities from 1 second to 16 weeks. +type TimeSeries struct { + timeSeries +} + +// NewTimeSeries creates a new TimeSeries using the function provided for creating new Observable. +func NewTimeSeries(f func() Observable) *TimeSeries { + return NewTimeSeriesWithClock(f, defaultClockInstance) +} + +// NewTimeSeriesWithClock creates a new TimeSeries using the function provided for creating new Observable and the clock for +// assigning timestamps. +func NewTimeSeriesWithClock(f func() Observable, clock Clock) *TimeSeries { + ts := new(TimeSeries) + ts.timeSeries.init(timeSeriesResolutions, f, timeSeriesNumBuckets, clock) + return ts +} + +// MinuteHourSeries tracks data at granularities of 1 minute and 1 hour. +type MinuteHourSeries struct { + timeSeries +} + +// NewMinuteHourSeries creates a new MinuteHourSeries using the function provided for creating new Observable. +func NewMinuteHourSeries(f func() Observable) *MinuteHourSeries { + return NewMinuteHourSeriesWithClock(f, defaultClockInstance) +} + +// NewMinuteHourSeriesWithClock creates a new MinuteHourSeries using the function provided for creating new Observable and the clock for +// assigning timestamps. +func NewMinuteHourSeriesWithClock(f func() Observable, clock Clock) *MinuteHourSeries { + ts := new(MinuteHourSeries) + ts.timeSeries.init(minuteHourSeriesResolutions, f, + minuteHourSeriesNumBuckets, clock) + return ts +} + +func (ts *MinuteHourSeries) Minute() Observable { + return ts.timeSeries.Latest(0, 60) +} + +func (ts *MinuteHourSeries) Hour() Observable { + return ts.timeSeries.Latest(1, 60) +} + +func minTime(a, b time.Time) time.Time { + if a.Before(b) { + return a + } + return b +} + +func maxTime(a, b time.Time) time.Time { + if a.After(b) { + return a + } + return b +} diff --git a/api/vendor/golang.org/x/net/internal/timeseries/timeseries_test.go b/api/vendor/golang.org/x/net/internal/timeseries/timeseries_test.go new file mode 100644 index 0000000..66325a9 --- /dev/null +++ b/api/vendor/golang.org/x/net/internal/timeseries/timeseries_test.go @@ -0,0 +1,170 @@ +// Copyright 2015 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 timeseries + +import ( + "math" + "testing" + "time" +) + +func isNear(x *Float, y float64, tolerance float64) bool { + return math.Abs(x.Value()-y) < tolerance +} + +func isApproximate(x *Float, y float64) bool { + return isNear(x, y, 1e-2) +} + +func checkApproximate(t *testing.T, o Observable, y float64) { + x := o.(*Float) + if !isApproximate(x, y) { + t.Errorf("Wanted %g, got %g", y, x.Value()) + } +} + +func checkNear(t *testing.T, o Observable, y, tolerance float64) { + x := o.(*Float) + if !isNear(x, y, tolerance) { + t.Errorf("Wanted %g +- %g, got %g", y, tolerance, x.Value()) + } +} + +var baseTime = time.Date(2013, 1, 1, 0, 0, 0, 0, time.UTC) + +func tu(s int64) time.Time { + return baseTime.Add(time.Duration(s) * time.Second) +} + +func tu2(s int64, ns int64) time.Time { + return baseTime.Add(time.Duration(s)*time.Second + time.Duration(ns)*time.Nanosecond) +} + +func TestBasicTimeSeries(t *testing.T) { + ts := NewTimeSeries(NewFloat) + fo := new(Float) + *fo = Float(10) + ts.AddWithTime(fo, tu(1)) + ts.AddWithTime(fo, tu(1)) + ts.AddWithTime(fo, tu(1)) + ts.AddWithTime(fo, tu(1)) + checkApproximate(t, ts.Range(tu(0), tu(1)), 40) + checkApproximate(t, ts.Total(), 40) + ts.AddWithTime(fo, tu(3)) + ts.AddWithTime(fo, tu(3)) + ts.AddWithTime(fo, tu(3)) + checkApproximate(t, ts.Range(tu(0), tu(2)), 40) + checkApproximate(t, ts.Range(tu(2), tu(4)), 30) + checkApproximate(t, ts.Total(), 70) + ts.AddWithTime(fo, tu(1)) + ts.AddWithTime(fo, tu(1)) + checkApproximate(t, ts.Range(tu(0), tu(2)), 60) + checkApproximate(t, ts.Range(tu(2), tu(4)), 30) + checkApproximate(t, ts.Total(), 90) + *fo = Float(100) + ts.AddWithTime(fo, tu(100)) + checkApproximate(t, ts.Range(tu(99), tu(100)), 100) + checkApproximate(t, ts.Range(tu(0), tu(4)), 36) + checkApproximate(t, ts.Total(), 190) + *fo = Float(10) + ts.AddWithTime(fo, tu(1)) + ts.AddWithTime(fo, tu(1)) + checkApproximate(t, ts.Range(tu(0), tu(4)), 44) + checkApproximate(t, ts.Range(tu(37), tu2(100, 100e6)), 100) + checkApproximate(t, ts.Range(tu(50), tu2(100, 100e6)), 100) + checkApproximate(t, ts.Range(tu(99), tu2(100, 100e6)), 100) + checkApproximate(t, ts.Total(), 210) + + for i, l := range ts.ComputeRange(tu(36), tu(100), 64) { + if i == 63 { + checkApproximate(t, l, 100) + } else { + checkApproximate(t, l, 0) + } + } + + checkApproximate(t, ts.Range(tu(0), tu(100)), 210) + checkApproximate(t, ts.Range(tu(10), tu(100)), 100) + + for i, l := range ts.ComputeRange(tu(0), tu(100), 100) { + if i < 10 { + checkApproximate(t, l, 11) + } else if i >= 90 { + checkApproximate(t, l, 10) + } else { + checkApproximate(t, l, 0) + } + } +} + +func TestFloat(t *testing.T) { + f := Float(1) + if g, w := f.String(), "1"; g != w { + t.Errorf("Float(1).String = %q; want %q", g, w) + } + f2 := Float(2) + var o Observable = &f2 + f.Add(o) + if g, w := f.Value(), 3.0; g != w { + t.Errorf("Float post-add = %v; want %v", g, w) + } + f.Multiply(2) + if g, w := f.Value(), 6.0; g != w { + t.Errorf("Float post-multiply = %v; want %v", g, w) + } + f.Clear() + if g, w := f.Value(), 0.0; g != w { + t.Errorf("Float post-clear = %v; want %v", g, w) + } + f.CopyFrom(&f2) + if g, w := f.Value(), 2.0; g != w { + t.Errorf("Float post-CopyFrom = %v; want %v", g, w) + } +} + +type mockClock struct { + time time.Time +} + +func (m *mockClock) Time() time.Time { return m.time } +func (m *mockClock) Set(t time.Time) { m.time = t } + +const buckets = 6 + +var testResolutions = []time.Duration{ + 10 * time.Second, // level holds one minute of observations + 100 * time.Second, // level holds ten minutes of observations + 10 * time.Minute, // level holds one hour of observations +} + +// TestTimeSeries uses a small number of buckets to force a higher +// error rate on approximations from the timeseries. +type TestTimeSeries struct { + timeSeries +} + +func TestExpectedErrorRate(t *testing.T) { + ts := new(TestTimeSeries) + fake := new(mockClock) + fake.Set(time.Now()) + ts.timeSeries.init(testResolutions, NewFloat, buckets, fake) + for i := 1; i <= 61*61; i++ { + fake.Set(fake.Time().Add(1 * time.Second)) + ob := Float(1) + ts.AddWithTime(&ob, fake.Time()) + + // The results should be accurate within one missing bucket (1/6) of the observations recorded. + checkNear(t, ts.Latest(0, buckets), min(float64(i), 60), 10) + checkNear(t, ts.Latest(1, buckets), min(float64(i), 600), 100) + checkNear(t, ts.Latest(2, buckets), min(float64(i), 3600), 600) + } +} + +func min(a, b float64) float64 { + if a < b { + return a + } + return b +} diff --git a/api/vendor/golang.org/x/net/ipv4/batch.go b/api/vendor/golang.org/x/net/ipv4/batch.go new file mode 100644 index 0000000..b445499 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/batch.go @@ -0,0 +1,191 @@ +// 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. + +// +build go1.9 + +package ipv4 + +import ( + "net" + "runtime" + "syscall" + + "golang.org/x/net/internal/socket" +) + +// BUG(mikio): On Windows, the ReadBatch and WriteBatch methods of +// PacketConn are not implemented. + +// BUG(mikio): On Windows, the ReadBatch and WriteBatch methods of +// RawConn are not implemented. + +// A Message represents an IO message. +// +// type Message struct { +// Buffers [][]byte +// OOB []byte +// Addr net.Addr +// N int +// NN int +// Flags int +// } +// +// The Buffers fields represents a list of contiguous buffers, which +// can be used for vectored IO, for example, putting a header and a +// payload in each slice. +// When writing, the Buffers field must contain at least one byte to +// write. +// When reading, the Buffers field will always contain a byte to read. +// +// The OOB field contains protocol-specific control or miscellaneous +// ancillary data known as out-of-band data. +// It can be nil when not required. +// +// The Addr field specifies a destination address when writing. +// It can be nil when the underlying protocol of the endpoint uses +// connection-oriented communication. +// After a successful read, it may contain the source address on the +// received packet. +// +// The N field indicates the number of bytes read or written from/to +// Buffers. +// +// The NN field indicates the number of bytes read or written from/to +// OOB. +// +// The Flags field contains protocol-specific information on the +// received message. +type Message = socket.Message + +// ReadBatch reads a batch of messages. +// +// The provided flags is a set of platform-dependent flags, such as +// syscall.MSG_PEEK. +// +// On a successful read it returns the number of messages received, up +// to len(ms). +// +// On Linux, a batch read will be optimized. +// On other platforms, this method will read only a single message. +// +// Unlike the ReadFrom method, it doesn't strip the IPv4 header +// followed by option headers from the received IPv4 datagram when the +// underlying transport is net.IPConn. Each Buffers field of Message +// must be large enough to accommodate an IPv4 header and option +// headers. +func (c *payloadHandler) ReadBatch(ms []Message, flags int) (int, error) { + if !c.ok() { + return 0, syscall.EINVAL + } + switch runtime.GOOS { + case "linux": + n, err := c.RecvMsgs([]socket.Message(ms), flags) + if err != nil { + err = &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + return n, err + default: + n := 1 + err := c.RecvMsg(&ms[0], flags) + if err != nil { + n = 0 + err = &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + return n, err + } +} + +// WriteBatch writes a batch of messages. +// +// The provided flags is a set of platform-dependent flags, such as +// syscall.MSG_DONTROUTE. +// +// It returns the number of messages written on a successful write. +// +// On Linux, a batch write will be optimized. +// On other platforms, this method will write only a single message. +func (c *payloadHandler) WriteBatch(ms []Message, flags int) (int, error) { + if !c.ok() { + return 0, syscall.EINVAL + } + switch runtime.GOOS { + case "linux": + n, err := c.SendMsgs([]socket.Message(ms), flags) + if err != nil { + err = &net.OpError{Op: "write", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + return n, err + default: + n := 1 + err := c.SendMsg(&ms[0], flags) + if err != nil { + n = 0 + err = &net.OpError{Op: "write", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + return n, err + } +} + +// ReadBatch reads a batch of messages. +// +// The provided flags is a set of platform-dependent flags, such as +// syscall.MSG_PEEK. +// +// On a successful read it returns the number of messages received, up +// to len(ms). +// +// On Linux, a batch read will be optimized. +// On other platforms, this method will read only a single message. +func (c *packetHandler) ReadBatch(ms []Message, flags int) (int, error) { + if !c.ok() { + return 0, syscall.EINVAL + } + switch runtime.GOOS { + case "linux": + n, err := c.RecvMsgs([]socket.Message(ms), flags) + if err != nil { + err = &net.OpError{Op: "read", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Err: err} + } + return n, err + default: + n := 1 + err := c.RecvMsg(&ms[0], flags) + if err != nil { + n = 0 + err = &net.OpError{Op: "read", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Err: err} + } + return n, err + } +} + +// WriteBatch writes a batch of messages. +// +// The provided flags is a set of platform-dependent flags, such as +// syscall.MSG_DONTROUTE. +// +// It returns the number of messages written on a successful write. +// +// On Linux, a batch write will be optimized. +// On other platforms, this method will write only a single message. +func (c *packetHandler) WriteBatch(ms []Message, flags int) (int, error) { + if !c.ok() { + return 0, syscall.EINVAL + } + switch runtime.GOOS { + case "linux": + n, err := c.SendMsgs([]socket.Message(ms), flags) + if err != nil { + err = &net.OpError{Op: "write", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Err: err} + } + return n, err + default: + n := 1 + err := c.SendMsg(&ms[0], flags) + if err != nil { + n = 0 + err = &net.OpError{Op: "write", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Err: err} + } + return n, err + } +} diff --git a/api/vendor/golang.org/x/net/ipv4/bpf_test.go b/api/vendor/golang.org/x/net/ipv4/bpf_test.go new file mode 100644 index 0000000..b44da90 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/bpf_test.go @@ -0,0 +1,93 @@ +// 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 ipv4_test + +import ( + "net" + "runtime" + "testing" + "time" + + "golang.org/x/net/bpf" + "golang.org/x/net/ipv4" +) + +func TestBPF(t *testing.T) { + if runtime.GOOS != "linux" { + t.Skipf("not supported on %s", runtime.GOOS) + } + + l, err := net.ListenPacket("udp4", "127.0.0.1:0") + if err != nil { + t.Fatal(err) + } + defer l.Close() + + p := ipv4.NewPacketConn(l) + + // This filter accepts UDP packets whose first payload byte is + // even. + prog, err := bpf.Assemble([]bpf.Instruction{ + // Load the first byte of the payload (skipping UDP header). + bpf.LoadAbsolute{Off: 8, Size: 1}, + // Select LSB of the byte. + bpf.ALUOpConstant{Op: bpf.ALUOpAnd, Val: 1}, + // Byte is even? + bpf.JumpIf{Cond: bpf.JumpEqual, Val: 0, SkipFalse: 1}, + // Accept. + bpf.RetConstant{Val: 4096}, + // Ignore. + bpf.RetConstant{Val: 0}, + }) + if err != nil { + t.Fatalf("compiling BPF: %s", err) + } + + if err = p.SetBPF(prog); err != nil { + t.Fatalf("attaching filter to Conn: %s", err) + } + + s, err := net.Dial("udp4", l.LocalAddr().String()) + if err != nil { + t.Fatal(err) + } + defer s.Close() + go func() { + for i := byte(0); i < 10; i++ { + s.Write([]byte{i}) + } + }() + + l.SetDeadline(time.Now().Add(2 * time.Second)) + seen := make([]bool, 5) + for { + var b [512]byte + n, _, err := l.ReadFrom(b[:]) + if err != nil { + t.Fatalf("reading from listener: %s", err) + } + if n != 1 { + t.Fatalf("unexpected packet length, want 1, got %d", n) + } + if b[0] >= 10 { + t.Fatalf("unexpected byte, want 0-9, got %d", b[0]) + } + if b[0]%2 != 0 { + t.Fatalf("got odd byte %d, wanted only even bytes", b[0]) + } + seen[b[0]/2] = true + + seenAll := true + for _, v := range seen { + if !v { + seenAll = false + break + } + } + if seenAll { + break + } + } +} diff --git a/api/vendor/golang.org/x/net/ipv4/control.go b/api/vendor/golang.org/x/net/ipv4/control.go new file mode 100644 index 0000000..a2b02ca --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/control.go @@ -0,0 +1,144 @@ +// 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 ipv4 + +import ( + "fmt" + "net" + "sync" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +type rawOpt struct { + sync.RWMutex + cflags ControlFlags +} + +func (c *rawOpt) set(f ControlFlags) { c.cflags |= f } +func (c *rawOpt) clear(f ControlFlags) { c.cflags &^= f } +func (c *rawOpt) isset(f ControlFlags) bool { return c.cflags&f != 0 } + +type ControlFlags uint + +const ( + FlagTTL ControlFlags = 1 << iota // pass the TTL on the received packet + FlagSrc // pass the source address on the received packet + FlagDst // pass the destination address on the received packet + FlagInterface // pass the interface index on the received packet +) + +// A ControlMessage represents per packet basis IP-level socket options. +type ControlMessage struct { + // Receiving socket options: SetControlMessage allows to + // receive the options from the protocol stack using ReadFrom + // method of PacketConn or RawConn. + // + // Specifying socket options: ControlMessage for WriteTo + // method of PacketConn or RawConn allows to send the options + // to the protocol stack. + // + TTL int // time-to-live, receiving only + Src net.IP // source address, specifying only + Dst net.IP // destination address, receiving only + IfIndex int // interface index, must be 1 <= value when specifying +} + +func (cm *ControlMessage) String() string { + if cm == nil { + return "" + } + return fmt.Sprintf("ttl=%d src=%v dst=%v ifindex=%d", cm.TTL, cm.Src, cm.Dst, cm.IfIndex) +} + +// Marshal returns the binary encoding of cm. +func (cm *ControlMessage) Marshal() []byte { + if cm == nil { + return nil + } + var m socket.ControlMessage + if ctlOpts[ctlPacketInfo].name > 0 && (cm.Src.To4() != nil || cm.IfIndex > 0) { + m = socket.NewControlMessage([]int{ctlOpts[ctlPacketInfo].length}) + } + if len(m) > 0 { + ctlOpts[ctlPacketInfo].marshal(m, cm) + } + return m +} + +// Parse parses b as a control message and stores the result in cm. +func (cm *ControlMessage) Parse(b []byte) error { + ms, err := socket.ControlMessage(b).Parse() + if err != nil { + return err + } + for _, m := range ms { + lvl, typ, l, err := m.ParseHeader() + if err != nil { + return err + } + if lvl != iana.ProtocolIP { + continue + } + switch { + case typ == ctlOpts[ctlTTL].name && l >= ctlOpts[ctlTTL].length: + ctlOpts[ctlTTL].parse(cm, m.Data(l)) + case typ == ctlOpts[ctlDst].name && l >= ctlOpts[ctlDst].length: + ctlOpts[ctlDst].parse(cm, m.Data(l)) + case typ == ctlOpts[ctlInterface].name && l >= ctlOpts[ctlInterface].length: + ctlOpts[ctlInterface].parse(cm, m.Data(l)) + case typ == ctlOpts[ctlPacketInfo].name && l >= ctlOpts[ctlPacketInfo].length: + ctlOpts[ctlPacketInfo].parse(cm, m.Data(l)) + } + } + return nil +} + +// NewControlMessage returns a new control message. +// +// The returned message is large enough for options specified by cf. +func NewControlMessage(cf ControlFlags) []byte { + opt := rawOpt{cflags: cf} + var l int + if opt.isset(FlagTTL) && ctlOpts[ctlTTL].name > 0 { + l += socket.ControlMessageSpace(ctlOpts[ctlTTL].length) + } + if ctlOpts[ctlPacketInfo].name > 0 { + if opt.isset(FlagSrc | FlagDst | FlagInterface) { + l += socket.ControlMessageSpace(ctlOpts[ctlPacketInfo].length) + } + } else { + if opt.isset(FlagDst) && ctlOpts[ctlDst].name > 0 { + l += socket.ControlMessageSpace(ctlOpts[ctlDst].length) + } + if opt.isset(FlagInterface) && ctlOpts[ctlInterface].name > 0 { + l += socket.ControlMessageSpace(ctlOpts[ctlInterface].length) + } + } + var b []byte + if l > 0 { + b = make([]byte, l) + } + return b +} + +// Ancillary data socket options +const ( + ctlTTL = iota // header field + ctlSrc // header field + ctlDst // header field + ctlInterface // inbound or outbound interface + ctlPacketInfo // inbound or outbound packet path + ctlMax +) + +// A ctlOpt represents a binding for ancillary data socket option. +type ctlOpt struct { + name int // option name, must be equal or greater than 1 + length int // option length + marshal func([]byte, *ControlMessage) []byte + parse func(*ControlMessage, []byte) +} diff --git a/api/vendor/golang.org/x/net/ipv4/control_bsd.go b/api/vendor/golang.org/x/net/ipv4/control_bsd.go new file mode 100644 index 0000000..77e7ad5 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/control_bsd.go @@ -0,0 +1,40 @@ +// 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. + +// +build darwin dragonfly freebsd netbsd openbsd + +package ipv4 + +import ( + "net" + "syscall" + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +func marshalDst(b []byte, cm *ControlMessage) []byte { + m := socket.ControlMessage(b) + m.MarshalHeader(iana.ProtocolIP, sysIP_RECVDSTADDR, net.IPv4len) + return m.Next(net.IPv4len) +} + +func parseDst(cm *ControlMessage, b []byte) { + if len(cm.Dst) < net.IPv4len { + cm.Dst = make(net.IP, net.IPv4len) + } + copy(cm.Dst, b[:net.IPv4len]) +} + +func marshalInterface(b []byte, cm *ControlMessage) []byte { + m := socket.ControlMessage(b) + m.MarshalHeader(iana.ProtocolIP, sysIP_RECVIF, syscall.SizeofSockaddrDatalink) + return m.Next(syscall.SizeofSockaddrDatalink) +} + +func parseInterface(cm *ControlMessage, b []byte) { + sadl := (*syscall.SockaddrDatalink)(unsafe.Pointer(&b[0])) + cm.IfIndex = int(sadl.Index) +} diff --git a/api/vendor/golang.org/x/net/ipv4/control_pktinfo.go b/api/vendor/golang.org/x/net/ipv4/control_pktinfo.go new file mode 100644 index 0000000..425338f --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/control_pktinfo.go @@ -0,0 +1,39 @@ +// 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. + +// +build darwin linux solaris + +package ipv4 + +import ( + "net" + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +func marshalPacketInfo(b []byte, cm *ControlMessage) []byte { + m := socket.ControlMessage(b) + m.MarshalHeader(iana.ProtocolIP, sysIP_PKTINFO, sizeofInetPktinfo) + if cm != nil { + pi := (*inetPktinfo)(unsafe.Pointer(&m.Data(sizeofInetPktinfo)[0])) + if ip := cm.Src.To4(); ip != nil { + copy(pi.Spec_dst[:], ip) + } + if cm.IfIndex > 0 { + pi.setIfindex(cm.IfIndex) + } + } + return m.Next(sizeofInetPktinfo) +} + +func parsePacketInfo(cm *ControlMessage, b []byte) { + pi := (*inetPktinfo)(unsafe.Pointer(&b[0])) + cm.IfIndex = int(pi.Ifindex) + if len(cm.Dst) < net.IPv4len { + cm.Dst = make(net.IP, net.IPv4len) + } + copy(cm.Dst, pi.Addr[:]) +} diff --git a/api/vendor/golang.org/x/net/ipv4/control_stub.go b/api/vendor/golang.org/x/net/ipv4/control_stub.go new file mode 100644 index 0000000..5a2f7d8 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/control_stub.go @@ -0,0 +1,13 @@ +// 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. + +// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows + +package ipv4 + +import "golang.org/x/net/internal/socket" + +func setControlMessage(c *socket.Conn, opt *rawOpt, cf ControlFlags, on bool) error { + return errOpNoSupport +} diff --git a/api/vendor/golang.org/x/net/ipv4/control_test.go b/api/vendor/golang.org/x/net/ipv4/control_test.go new file mode 100644 index 0000000..f87fe12 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/control_test.go @@ -0,0 +1,21 @@ +// 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 ipv4_test + +import ( + "testing" + + "golang.org/x/net/ipv4" +) + +func TestControlMessageParseWithFuzz(t *testing.T) { + var cm ipv4.ControlMessage + for _, fuzz := range []string{ + "\f\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00", + "\f\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x00\x00", + } { + cm.Parse([]byte(fuzz)) + } +} diff --git a/api/vendor/golang.org/x/net/ipv4/control_unix.go b/api/vendor/golang.org/x/net/ipv4/control_unix.go new file mode 100644 index 0000000..e1ae816 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/control_unix.go @@ -0,0 +1,73 @@ +// 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +package ipv4 + +import ( + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +func setControlMessage(c *socket.Conn, opt *rawOpt, cf ControlFlags, on bool) error { + opt.Lock() + defer opt.Unlock() + if so, ok := sockOpts[ssoReceiveTTL]; ok && cf&FlagTTL != 0 { + if err := so.SetInt(c, boolint(on)); err != nil { + return err + } + if on { + opt.set(FlagTTL) + } else { + opt.clear(FlagTTL) + } + } + if so, ok := sockOpts[ssoPacketInfo]; ok { + if cf&(FlagSrc|FlagDst|FlagInterface) != 0 { + if err := so.SetInt(c, boolint(on)); err != nil { + return err + } + if on { + opt.set(cf & (FlagSrc | FlagDst | FlagInterface)) + } else { + opt.clear(cf & (FlagSrc | FlagDst | FlagInterface)) + } + } + } else { + if so, ok := sockOpts[ssoReceiveDst]; ok && cf&FlagDst != 0 { + if err := so.SetInt(c, boolint(on)); err != nil { + return err + } + if on { + opt.set(FlagDst) + } else { + opt.clear(FlagDst) + } + } + if so, ok := sockOpts[ssoReceiveInterface]; ok && cf&FlagInterface != 0 { + if err := so.SetInt(c, boolint(on)); err != nil { + return err + } + if on { + opt.set(FlagInterface) + } else { + opt.clear(FlagInterface) + } + } + } + return nil +} + +func marshalTTL(b []byte, cm *ControlMessage) []byte { + m := socket.ControlMessage(b) + m.MarshalHeader(iana.ProtocolIP, sysIP_RECVTTL, 1) + return m.Next(1) +} + +func parseTTL(cm *ControlMessage, b []byte) { + cm.TTL = int(*(*byte)(unsafe.Pointer(&b[:1][0]))) +} diff --git a/api/vendor/golang.org/x/net/ipv4/control_windows.go b/api/vendor/golang.org/x/net/ipv4/control_windows.go new file mode 100644 index 0000000..ce55c66 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/control_windows.go @@ -0,0 +1,16 @@ +// 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 ipv4 + +import ( + "syscall" + + "golang.org/x/net/internal/socket" +) + +func setControlMessage(c *socket.Conn, opt *rawOpt, cf ControlFlags, on bool) error { + // TODO(mikio): implement this + return syscall.EWINDOWS +} diff --git a/api/vendor/golang.org/x/net/ipv4/defs_darwin.go b/api/vendor/golang.org/x/net/ipv4/defs_darwin.go new file mode 100644 index 0000000..c8f2e05 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/defs_darwin.go @@ -0,0 +1,77 @@ +// 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. + +// +build ignore + +// +godefs map struct_in_addr [4]byte /* in_addr */ + +package ipv4 + +/* +#include + +#include +*/ +import "C" + +const ( + sysIP_OPTIONS = C.IP_OPTIONS + sysIP_HDRINCL = C.IP_HDRINCL + sysIP_TOS = C.IP_TOS + sysIP_TTL = C.IP_TTL + sysIP_RECVOPTS = C.IP_RECVOPTS + sysIP_RECVRETOPTS = C.IP_RECVRETOPTS + sysIP_RECVDSTADDR = C.IP_RECVDSTADDR + sysIP_RETOPTS = C.IP_RETOPTS + sysIP_RECVIF = C.IP_RECVIF + sysIP_STRIPHDR = C.IP_STRIPHDR + sysIP_RECVTTL = C.IP_RECVTTL + sysIP_BOUND_IF = C.IP_BOUND_IF + sysIP_PKTINFO = C.IP_PKTINFO + sysIP_RECVPKTINFO = C.IP_RECVPKTINFO + + sysIP_MULTICAST_IF = C.IP_MULTICAST_IF + sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL + sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP + sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP + sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP + sysIP_MULTICAST_VIF = C.IP_MULTICAST_VIF + sysIP_MULTICAST_IFINDEX = C.IP_MULTICAST_IFINDEX + sysIP_ADD_SOURCE_MEMBERSHIP = C.IP_ADD_SOURCE_MEMBERSHIP + sysIP_DROP_SOURCE_MEMBERSHIP = C.IP_DROP_SOURCE_MEMBERSHIP + sysIP_BLOCK_SOURCE = C.IP_BLOCK_SOURCE + sysIP_UNBLOCK_SOURCE = C.IP_UNBLOCK_SOURCE + sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP + sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP + sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP + sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP + sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE + sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE + + sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sizeofInetPktinfo = C.sizeof_struct_in_pktinfo + + sizeofIPMreq = C.sizeof_struct_ip_mreq + sizeofIPMreqn = C.sizeof_struct_ip_mreqn + sizeofIPMreqSource = C.sizeof_struct_ip_mreq_source + sizeofGroupReq = C.sizeof_struct_group_req + sizeofGroupSourceReq = C.sizeof_struct_group_source_req +) + +type sockaddrStorage C.struct_sockaddr_storage + +type sockaddrInet C.struct_sockaddr_in + +type inetPktinfo C.struct_in_pktinfo + +type ipMreq C.struct_ip_mreq + +type ipMreqn C.struct_ip_mreqn + +type ipMreqSource C.struct_ip_mreq_source + +type groupReq C.struct_group_req + +type groupSourceReq C.struct_group_source_req diff --git a/api/vendor/golang.org/x/net/ipv4/defs_dragonfly.go b/api/vendor/golang.org/x/net/ipv4/defs_dragonfly.go new file mode 100644 index 0000000..f30544e --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/defs_dragonfly.go @@ -0,0 +1,38 @@ +// 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. + +// +build ignore + +// +godefs map struct_in_addr [4]byte /* in_addr */ + +package ipv4 + +/* +#include +*/ +import "C" + +const ( + sysIP_OPTIONS = C.IP_OPTIONS + sysIP_HDRINCL = C.IP_HDRINCL + sysIP_TOS = C.IP_TOS + sysIP_TTL = C.IP_TTL + sysIP_RECVOPTS = C.IP_RECVOPTS + sysIP_RECVRETOPTS = C.IP_RECVRETOPTS + sysIP_RECVDSTADDR = C.IP_RECVDSTADDR + sysIP_RETOPTS = C.IP_RETOPTS + sysIP_RECVIF = C.IP_RECVIF + sysIP_RECVTTL = C.IP_RECVTTL + + sysIP_MULTICAST_IF = C.IP_MULTICAST_IF + sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL + sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP + sysIP_MULTICAST_VIF = C.IP_MULTICAST_VIF + sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP + sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP + + sizeofIPMreq = C.sizeof_struct_ip_mreq +) + +type ipMreq C.struct_ip_mreq diff --git a/api/vendor/golang.org/x/net/ipv4/defs_freebsd.go b/api/vendor/golang.org/x/net/ipv4/defs_freebsd.go new file mode 100644 index 0000000..4dd57d8 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/defs_freebsd.go @@ -0,0 +1,75 @@ +// 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. + +// +build ignore + +// +godefs map struct_in_addr [4]byte /* in_addr */ + +package ipv4 + +/* +#include + +#include +*/ +import "C" + +const ( + sysIP_OPTIONS = C.IP_OPTIONS + sysIP_HDRINCL = C.IP_HDRINCL + sysIP_TOS = C.IP_TOS + sysIP_TTL = C.IP_TTL + sysIP_RECVOPTS = C.IP_RECVOPTS + sysIP_RECVRETOPTS = C.IP_RECVRETOPTS + sysIP_RECVDSTADDR = C.IP_RECVDSTADDR + sysIP_SENDSRCADDR = C.IP_SENDSRCADDR + sysIP_RETOPTS = C.IP_RETOPTS + sysIP_RECVIF = C.IP_RECVIF + sysIP_ONESBCAST = C.IP_ONESBCAST + sysIP_BINDANY = C.IP_BINDANY + sysIP_RECVTTL = C.IP_RECVTTL + sysIP_MINTTL = C.IP_MINTTL + sysIP_DONTFRAG = C.IP_DONTFRAG + sysIP_RECVTOS = C.IP_RECVTOS + + sysIP_MULTICAST_IF = C.IP_MULTICAST_IF + sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL + sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP + sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP + sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP + sysIP_MULTICAST_VIF = C.IP_MULTICAST_VIF + sysIP_ADD_SOURCE_MEMBERSHIP = C.IP_ADD_SOURCE_MEMBERSHIP + sysIP_DROP_SOURCE_MEMBERSHIP = C.IP_DROP_SOURCE_MEMBERSHIP + sysIP_BLOCK_SOURCE = C.IP_BLOCK_SOURCE + sysIP_UNBLOCK_SOURCE = C.IP_UNBLOCK_SOURCE + sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP + sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP + sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP + sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP + sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE + sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE + + sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + + sizeofIPMreq = C.sizeof_struct_ip_mreq + sizeofIPMreqn = C.sizeof_struct_ip_mreqn + sizeofIPMreqSource = C.sizeof_struct_ip_mreq_source + sizeofGroupReq = C.sizeof_struct_group_req + sizeofGroupSourceReq = C.sizeof_struct_group_source_req +) + +type sockaddrStorage C.struct_sockaddr_storage + +type sockaddrInet C.struct_sockaddr_in + +type ipMreq C.struct_ip_mreq + +type ipMreqn C.struct_ip_mreqn + +type ipMreqSource C.struct_ip_mreq_source + +type groupReq C.struct_group_req + +type groupSourceReq C.struct_group_source_req diff --git a/api/vendor/golang.org/x/net/ipv4/defs_linux.go b/api/vendor/golang.org/x/net/ipv4/defs_linux.go new file mode 100644 index 0000000..beb1107 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/defs_linux.go @@ -0,0 +1,122 @@ +// 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. + +// +build ignore + +// +godefs map struct_in_addr [4]byte /* in_addr */ + +package ipv4 + +/* +#include + +#include +#include +#include +#include +#include +*/ +import "C" + +const ( + sysIP_TOS = C.IP_TOS + sysIP_TTL = C.IP_TTL + sysIP_HDRINCL = C.IP_HDRINCL + sysIP_OPTIONS = C.IP_OPTIONS + sysIP_ROUTER_ALERT = C.IP_ROUTER_ALERT + sysIP_RECVOPTS = C.IP_RECVOPTS + sysIP_RETOPTS = C.IP_RETOPTS + sysIP_PKTINFO = C.IP_PKTINFO + sysIP_PKTOPTIONS = C.IP_PKTOPTIONS + sysIP_MTU_DISCOVER = C.IP_MTU_DISCOVER + sysIP_RECVERR = C.IP_RECVERR + sysIP_RECVTTL = C.IP_RECVTTL + sysIP_RECVTOS = C.IP_RECVTOS + sysIP_MTU = C.IP_MTU + sysIP_FREEBIND = C.IP_FREEBIND + sysIP_TRANSPARENT = C.IP_TRANSPARENT + sysIP_RECVRETOPTS = C.IP_RECVRETOPTS + sysIP_ORIGDSTADDR = C.IP_ORIGDSTADDR + sysIP_RECVORIGDSTADDR = C.IP_RECVORIGDSTADDR + sysIP_MINTTL = C.IP_MINTTL + sysIP_NODEFRAG = C.IP_NODEFRAG + sysIP_UNICAST_IF = C.IP_UNICAST_IF + + sysIP_MULTICAST_IF = C.IP_MULTICAST_IF + sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL + sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP + sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP + sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP + sysIP_UNBLOCK_SOURCE = C.IP_UNBLOCK_SOURCE + sysIP_BLOCK_SOURCE = C.IP_BLOCK_SOURCE + sysIP_ADD_SOURCE_MEMBERSHIP = C.IP_ADD_SOURCE_MEMBERSHIP + sysIP_DROP_SOURCE_MEMBERSHIP = C.IP_DROP_SOURCE_MEMBERSHIP + sysIP_MSFILTER = C.IP_MSFILTER + sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP + sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP + sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP + sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP + sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE + sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE + sysMCAST_MSFILTER = C.MCAST_MSFILTER + sysIP_MULTICAST_ALL = C.IP_MULTICAST_ALL + + //sysIP_PMTUDISC_DONT = C.IP_PMTUDISC_DONT + //sysIP_PMTUDISC_WANT = C.IP_PMTUDISC_WANT + //sysIP_PMTUDISC_DO = C.IP_PMTUDISC_DO + //sysIP_PMTUDISC_PROBE = C.IP_PMTUDISC_PROBE + //sysIP_PMTUDISC_INTERFACE = C.IP_PMTUDISC_INTERFACE + //sysIP_PMTUDISC_OMIT = C.IP_PMTUDISC_OMIT + + sysICMP_FILTER = C.ICMP_FILTER + + sysSO_EE_ORIGIN_NONE = C.SO_EE_ORIGIN_NONE + sysSO_EE_ORIGIN_LOCAL = C.SO_EE_ORIGIN_LOCAL + sysSO_EE_ORIGIN_ICMP = C.SO_EE_ORIGIN_ICMP + sysSO_EE_ORIGIN_ICMP6 = C.SO_EE_ORIGIN_ICMP6 + sysSO_EE_ORIGIN_TXSTATUS = C.SO_EE_ORIGIN_TXSTATUS + sysSO_EE_ORIGIN_TIMESTAMPING = C.SO_EE_ORIGIN_TIMESTAMPING + + sysSOL_SOCKET = C.SOL_SOCKET + sysSO_ATTACH_FILTER = C.SO_ATTACH_FILTER + + sizeofKernelSockaddrStorage = C.sizeof_struct___kernel_sockaddr_storage + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sizeofInetPktinfo = C.sizeof_struct_in_pktinfo + sizeofSockExtendedErr = C.sizeof_struct_sock_extended_err + + sizeofIPMreq = C.sizeof_struct_ip_mreq + sizeofIPMreqn = C.sizeof_struct_ip_mreqn + sizeofIPMreqSource = C.sizeof_struct_ip_mreq_source + sizeofGroupReq = C.sizeof_struct_group_req + sizeofGroupSourceReq = C.sizeof_struct_group_source_req + + sizeofICMPFilter = C.sizeof_struct_icmp_filter + + sizeofSockFprog = C.sizeof_struct_sock_fprog +) + +type kernelSockaddrStorage C.struct___kernel_sockaddr_storage + +type sockaddrInet C.struct_sockaddr_in + +type inetPktinfo C.struct_in_pktinfo + +type sockExtendedErr C.struct_sock_extended_err + +type ipMreq C.struct_ip_mreq + +type ipMreqn C.struct_ip_mreqn + +type ipMreqSource C.struct_ip_mreq_source + +type groupReq C.struct_group_req + +type groupSourceReq C.struct_group_source_req + +type icmpFilter C.struct_icmp_filter + +type sockFProg C.struct_sock_fprog + +type sockFilter C.struct_sock_filter diff --git a/api/vendor/golang.org/x/net/ipv4/defs_netbsd.go b/api/vendor/golang.org/x/net/ipv4/defs_netbsd.go new file mode 100644 index 0000000..8f8af1b --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/defs_netbsd.go @@ -0,0 +1,37 @@ +// 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. + +// +build ignore + +// +godefs map struct_in_addr [4]byte /* in_addr */ + +package ipv4 + +/* +#include +*/ +import "C" + +const ( + sysIP_OPTIONS = C.IP_OPTIONS + sysIP_HDRINCL = C.IP_HDRINCL + sysIP_TOS = C.IP_TOS + sysIP_TTL = C.IP_TTL + sysIP_RECVOPTS = C.IP_RECVOPTS + sysIP_RECVRETOPTS = C.IP_RECVRETOPTS + sysIP_RECVDSTADDR = C.IP_RECVDSTADDR + sysIP_RETOPTS = C.IP_RETOPTS + sysIP_RECVIF = C.IP_RECVIF + sysIP_RECVTTL = C.IP_RECVTTL + + sysIP_MULTICAST_IF = C.IP_MULTICAST_IF + sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL + sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP + sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP + sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP + + sizeofIPMreq = C.sizeof_struct_ip_mreq +) + +type ipMreq C.struct_ip_mreq diff --git a/api/vendor/golang.org/x/net/ipv4/defs_openbsd.go b/api/vendor/golang.org/x/net/ipv4/defs_openbsd.go new file mode 100644 index 0000000..8f8af1b --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/defs_openbsd.go @@ -0,0 +1,37 @@ +// 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. + +// +build ignore + +// +godefs map struct_in_addr [4]byte /* in_addr */ + +package ipv4 + +/* +#include +*/ +import "C" + +const ( + sysIP_OPTIONS = C.IP_OPTIONS + sysIP_HDRINCL = C.IP_HDRINCL + sysIP_TOS = C.IP_TOS + sysIP_TTL = C.IP_TTL + sysIP_RECVOPTS = C.IP_RECVOPTS + sysIP_RECVRETOPTS = C.IP_RECVRETOPTS + sysIP_RECVDSTADDR = C.IP_RECVDSTADDR + sysIP_RETOPTS = C.IP_RETOPTS + sysIP_RECVIF = C.IP_RECVIF + sysIP_RECVTTL = C.IP_RECVTTL + + sysIP_MULTICAST_IF = C.IP_MULTICAST_IF + sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL + sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP + sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP + sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP + + sizeofIPMreq = C.sizeof_struct_ip_mreq +) + +type ipMreq C.struct_ip_mreq diff --git a/api/vendor/golang.org/x/net/ipv4/defs_solaris.go b/api/vendor/golang.org/x/net/ipv4/defs_solaris.go new file mode 100644 index 0000000..aeb33e9 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/defs_solaris.go @@ -0,0 +1,84 @@ +// 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. + +// +build ignore + +// +godefs map struct_in_addr [4]byte /* in_addr */ + +package ipv4 + +/* +#include + +#include +*/ +import "C" + +const ( + sysIP_OPTIONS = C.IP_OPTIONS + sysIP_HDRINCL = C.IP_HDRINCL + sysIP_TOS = C.IP_TOS + sysIP_TTL = C.IP_TTL + sysIP_RECVOPTS = C.IP_RECVOPTS + sysIP_RECVRETOPTS = C.IP_RECVRETOPTS + sysIP_RECVDSTADDR = C.IP_RECVDSTADDR + sysIP_RETOPTS = C.IP_RETOPTS + sysIP_RECVIF = C.IP_RECVIF + sysIP_RECVSLLA = C.IP_RECVSLLA + sysIP_RECVTTL = C.IP_RECVTTL + + sysIP_MULTICAST_IF = C.IP_MULTICAST_IF + sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL + sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP + sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP + sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP + sysIP_BLOCK_SOURCE = C.IP_BLOCK_SOURCE + sysIP_UNBLOCK_SOURCE = C.IP_UNBLOCK_SOURCE + sysIP_ADD_SOURCE_MEMBERSHIP = C.IP_ADD_SOURCE_MEMBERSHIP + sysIP_DROP_SOURCE_MEMBERSHIP = C.IP_DROP_SOURCE_MEMBERSHIP + sysIP_NEXTHOP = C.IP_NEXTHOP + + sysIP_PKTINFO = C.IP_PKTINFO + sysIP_RECVPKTINFO = C.IP_RECVPKTINFO + sysIP_DONTFRAG = C.IP_DONTFRAG + + sysIP_BOUND_IF = C.IP_BOUND_IF + sysIP_UNSPEC_SRC = C.IP_UNSPEC_SRC + sysIP_BROADCAST_TTL = C.IP_BROADCAST_TTL + sysIP_DHCPINIT_IF = C.IP_DHCPINIT_IF + + sysIP_REUSEADDR = C.IP_REUSEADDR + sysIP_DONTROUTE = C.IP_DONTROUTE + sysIP_BROADCAST = C.IP_BROADCAST + + sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP + sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP + sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE + sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE + sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP + sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP + + sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sizeofInetPktinfo = C.sizeof_struct_in_pktinfo + + sizeofIPMreq = C.sizeof_struct_ip_mreq + sizeofIPMreqSource = C.sizeof_struct_ip_mreq_source + sizeofGroupReq = C.sizeof_struct_group_req + sizeofGroupSourceReq = C.sizeof_struct_group_source_req +) + +type sockaddrStorage C.struct_sockaddr_storage + +type sockaddrInet C.struct_sockaddr_in + +type inetPktinfo C.struct_in_pktinfo + +type ipMreq C.struct_ip_mreq + +type ipMreqSource C.struct_ip_mreq_source + +type groupReq C.struct_group_req + +type groupSourceReq C.struct_group_source_req diff --git a/api/vendor/golang.org/x/net/ipv4/dgramopt.go b/api/vendor/golang.org/x/net/ipv4/dgramopt.go new file mode 100644 index 0000000..54d77d5 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/dgramopt.go @@ -0,0 +1,265 @@ +// 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 ipv4 + +import ( + "net" + "syscall" + + "golang.org/x/net/bpf" +) + +// MulticastTTL returns the time-to-live field value for outgoing +// multicast packets. +func (c *dgramOpt) MulticastTTL() (int, error) { + if !c.ok() { + return 0, syscall.EINVAL + } + so, ok := sockOpts[ssoMulticastTTL] + if !ok { + return 0, errOpNoSupport + } + return so.GetInt(c.Conn) +} + +// SetMulticastTTL sets the time-to-live field value for future +// outgoing multicast packets. +func (c *dgramOpt) SetMulticastTTL(ttl int) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoMulticastTTL] + if !ok { + return errOpNoSupport + } + return so.SetInt(c.Conn, ttl) +} + +// MulticastInterface returns the default interface for multicast +// packet transmissions. +func (c *dgramOpt) MulticastInterface() (*net.Interface, error) { + if !c.ok() { + return nil, syscall.EINVAL + } + so, ok := sockOpts[ssoMulticastInterface] + if !ok { + return nil, errOpNoSupport + } + return so.getMulticastInterface(c.Conn) +} + +// SetMulticastInterface sets the default interface for future +// multicast packet transmissions. +func (c *dgramOpt) SetMulticastInterface(ifi *net.Interface) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoMulticastInterface] + if !ok { + return errOpNoSupport + } + return so.setMulticastInterface(c.Conn, ifi) +} + +// MulticastLoopback reports whether transmitted multicast packets +// should be copied and send back to the originator. +func (c *dgramOpt) MulticastLoopback() (bool, error) { + if !c.ok() { + return false, syscall.EINVAL + } + so, ok := sockOpts[ssoMulticastLoopback] + if !ok { + return false, errOpNoSupport + } + on, err := so.GetInt(c.Conn) + if err != nil { + return false, err + } + return on == 1, nil +} + +// SetMulticastLoopback sets whether transmitted multicast packets +// should be copied and send back to the originator. +func (c *dgramOpt) SetMulticastLoopback(on bool) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoMulticastLoopback] + if !ok { + return errOpNoSupport + } + return so.SetInt(c.Conn, boolint(on)) +} + +// JoinGroup joins the group address group on the interface ifi. +// By default all sources that can cast data to group are accepted. +// It's possible to mute and unmute data transmission from a specific +// source by using ExcludeSourceSpecificGroup and +// IncludeSourceSpecificGroup. +// JoinGroup uses the system assigned multicast interface when ifi is +// nil, although this is not recommended because the assignment +// depends on platforms and sometimes it might require routing +// configuration. +func (c *dgramOpt) JoinGroup(ifi *net.Interface, group net.Addr) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoJoinGroup] + if !ok { + return errOpNoSupport + } + grp := netAddrToIP4(group) + if grp == nil { + return errMissingAddress + } + return so.setGroup(c.Conn, ifi, grp) +} + +// LeaveGroup leaves the group address group on the interface ifi +// regardless of whether the group is any-source group or +// source-specific group. +func (c *dgramOpt) LeaveGroup(ifi *net.Interface, group net.Addr) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoLeaveGroup] + if !ok { + return errOpNoSupport + } + grp := netAddrToIP4(group) + if grp == nil { + return errMissingAddress + } + return so.setGroup(c.Conn, ifi, grp) +} + +// JoinSourceSpecificGroup joins the source-specific group comprising +// group and source on the interface ifi. +// JoinSourceSpecificGroup uses the system assigned multicast +// interface when ifi is nil, although this is not recommended because +// the assignment depends on platforms and sometimes it might require +// routing configuration. +func (c *dgramOpt) JoinSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoJoinSourceGroup] + if !ok { + return errOpNoSupport + } + grp := netAddrToIP4(group) + if grp == nil { + return errMissingAddress + } + src := netAddrToIP4(source) + if src == nil { + return errMissingAddress + } + return so.setSourceGroup(c.Conn, ifi, grp, src) +} + +// LeaveSourceSpecificGroup leaves the source-specific group on the +// interface ifi. +func (c *dgramOpt) LeaveSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoLeaveSourceGroup] + if !ok { + return errOpNoSupport + } + grp := netAddrToIP4(group) + if grp == nil { + return errMissingAddress + } + src := netAddrToIP4(source) + if src == nil { + return errMissingAddress + } + return so.setSourceGroup(c.Conn, ifi, grp, src) +} + +// ExcludeSourceSpecificGroup excludes the source-specific group from +// the already joined any-source groups by JoinGroup on the interface +// ifi. +func (c *dgramOpt) ExcludeSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoBlockSourceGroup] + if !ok { + return errOpNoSupport + } + grp := netAddrToIP4(group) + if grp == nil { + return errMissingAddress + } + src := netAddrToIP4(source) + if src == nil { + return errMissingAddress + } + return so.setSourceGroup(c.Conn, ifi, grp, src) +} + +// IncludeSourceSpecificGroup includes the excluded source-specific +// group by ExcludeSourceSpecificGroup again on the interface ifi. +func (c *dgramOpt) IncludeSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoUnblockSourceGroup] + if !ok { + return errOpNoSupport + } + grp := netAddrToIP4(group) + if grp == nil { + return errMissingAddress + } + src := netAddrToIP4(source) + if src == nil { + return errMissingAddress + } + return so.setSourceGroup(c.Conn, ifi, grp, src) +} + +// ICMPFilter returns an ICMP filter. +// Currently only Linux supports this. +func (c *dgramOpt) ICMPFilter() (*ICMPFilter, error) { + if !c.ok() { + return nil, syscall.EINVAL + } + so, ok := sockOpts[ssoICMPFilter] + if !ok { + return nil, errOpNoSupport + } + return so.getICMPFilter(c.Conn) +} + +// SetICMPFilter deploys the ICMP filter. +// Currently only Linux supports this. +func (c *dgramOpt) SetICMPFilter(f *ICMPFilter) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoICMPFilter] + if !ok { + return errOpNoSupport + } + return so.setICMPFilter(c.Conn, f) +} + +// SetBPF attaches a BPF program to the connection. +// +// Only supported on Linux. +func (c *dgramOpt) SetBPF(filter []bpf.RawInstruction) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoAttachFilter] + if !ok { + return errOpNoSupport + } + return so.setBPF(c.Conn, filter) +} diff --git a/api/vendor/golang.org/x/net/ipv4/doc.go b/api/vendor/golang.org/x/net/ipv4/doc.go new file mode 100644 index 0000000..b43935a --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/doc.go @@ -0,0 +1,244 @@ +// 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 ipv4 implements IP-level socket options for the Internet +// Protocol version 4. +// +// The package provides IP-level socket options that allow +// manipulation of IPv4 facilities. +// +// The IPv4 protocol and basic host requirements for IPv4 are defined +// in RFC 791 and RFC 1122. +// Host extensions for multicasting and socket interface extensions +// for multicast source filters are defined in RFC 1112 and RFC 3678. +// IGMPv1, IGMPv2 and IGMPv3 are defined in RFC 1112, RFC 2236 and RFC +// 3376. +// Source-specific multicast is defined in RFC 4607. +// +// +// Unicasting +// +// The options for unicasting are available for net.TCPConn, +// net.UDPConn and net.IPConn which are created as network connections +// that use the IPv4 transport. When a single TCP connection carrying +// a data flow of multiple packets needs to indicate the flow is +// important, Conn is used to set the type-of-service field on the +// IPv4 header for each packet. +// +// ln, err := net.Listen("tcp4", "0.0.0.0:1024") +// if err != nil { +// // error handling +// } +// defer ln.Close() +// for { +// c, err := ln.Accept() +// if err != nil { +// // error handling +// } +// go func(c net.Conn) { +// defer c.Close() +// +// The outgoing packets will be labeled DiffServ assured forwarding +// class 1 low drop precedence, known as AF11 packets. +// +// if err := ipv4.NewConn(c).SetTOS(0x28); err != nil { +// // error handling +// } +// if _, err := c.Write(data); err != nil { +// // error handling +// } +// }(c) +// } +// +// +// Multicasting +// +// The options for multicasting are available for net.UDPConn and +// net.IPconn which are created as network connections that use the +// IPv4 transport. A few network facilities must be prepared before +// you begin multicasting, at a minimum joining network interfaces and +// multicast groups. +// +// en0, err := net.InterfaceByName("en0") +// if err != nil { +// // error handling +// } +// en1, err := net.InterfaceByIndex(911) +// if err != nil { +// // error handling +// } +// group := net.IPv4(224, 0, 0, 250) +// +// First, an application listens to an appropriate address with an +// appropriate service port. +// +// c, err := net.ListenPacket("udp4", "0.0.0.0:1024") +// if err != nil { +// // error handling +// } +// defer c.Close() +// +// Second, the application joins multicast groups, starts listening to +// the groups on the specified network interfaces. Note that the +// service port for transport layer protocol does not matter with this +// operation as joining groups affects only network and link layer +// protocols, such as IPv4 and Ethernet. +// +// p := ipv4.NewPacketConn(c) +// if err := p.JoinGroup(en0, &net.UDPAddr{IP: group}); err != nil { +// // error handling +// } +// if err := p.JoinGroup(en1, &net.UDPAddr{IP: group}); err != nil { +// // error handling +// } +// +// The application might set per packet control message transmissions +// between the protocol stack within the kernel. When the application +// needs a destination address on an incoming packet, +// SetControlMessage of PacketConn is used to enable control message +// transmissions. +// +// if err := p.SetControlMessage(ipv4.FlagDst, true); err != nil { +// // error handling +// } +// +// The application could identify whether the received packets are +// of interest by using the control message that contains the +// destination address of the received packet. +// +// b := make([]byte, 1500) +// for { +// n, cm, src, err := p.ReadFrom(b) +// if err != nil { +// // error handling +// } +// if cm.Dst.IsMulticast() { +// if cm.Dst.Equal(group) { +// // joined group, do something +// } else { +// // unknown group, discard +// continue +// } +// } +// +// The application can also send both unicast and multicast packets. +// +// p.SetTOS(0x0) +// p.SetTTL(16) +// if _, err := p.WriteTo(data, nil, src); err != nil { +// // error handling +// } +// dst := &net.UDPAddr{IP: group, Port: 1024} +// for _, ifi := range []*net.Interface{en0, en1} { +// if err := p.SetMulticastInterface(ifi); err != nil { +// // error handling +// } +// p.SetMulticastTTL(2) +// if _, err := p.WriteTo(data, nil, dst); err != nil { +// // error handling +// } +// } +// } +// +// +// More multicasting +// +// An application that uses PacketConn or RawConn may join multiple +// multicast groups. For example, a UDP listener with port 1024 might +// join two different groups across over two different network +// interfaces by using: +// +// c, err := net.ListenPacket("udp4", "0.0.0.0:1024") +// if err != nil { +// // error handling +// } +// defer c.Close() +// p := ipv4.NewPacketConn(c) +// if err := p.JoinGroup(en0, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 248)}); err != nil { +// // error handling +// } +// if err := p.JoinGroup(en0, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 249)}); err != nil { +// // error handling +// } +// if err := p.JoinGroup(en1, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 249)}); err != nil { +// // error handling +// } +// +// It is possible for multiple UDP listeners that listen on the same +// UDP port to join the same multicast group. The net package will +// provide a socket that listens to a wildcard address with reusable +// UDP port when an appropriate multicast address prefix is passed to +// the net.ListenPacket or net.ListenUDP. +// +// c1, err := net.ListenPacket("udp4", "224.0.0.0:1024") +// if err != nil { +// // error handling +// } +// defer c1.Close() +// c2, err := net.ListenPacket("udp4", "224.0.0.0:1024") +// if err != nil { +// // error handling +// } +// defer c2.Close() +// p1 := ipv4.NewPacketConn(c1) +// if err := p1.JoinGroup(en0, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 248)}); err != nil { +// // error handling +// } +// p2 := ipv4.NewPacketConn(c2) +// if err := p2.JoinGroup(en0, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 248)}); err != nil { +// // error handling +// } +// +// Also it is possible for the application to leave or rejoin a +// multicast group on the network interface. +// +// if err := p.LeaveGroup(en0, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 248)}); err != nil { +// // error handling +// } +// if err := p.JoinGroup(en0, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 250)}); err != nil { +// // error handling +// } +// +// +// Source-specific multicasting +// +// An application that uses PacketConn or RawConn on IGMPv3 supported +// platform is able to join source-specific multicast groups. +// The application may use JoinSourceSpecificGroup and +// LeaveSourceSpecificGroup for the operation known as "include" mode, +// +// ssmgroup := net.UDPAddr{IP: net.IPv4(232, 7, 8, 9)} +// ssmsource := net.UDPAddr{IP: net.IPv4(192, 168, 0, 1)}) +// if err := p.JoinSourceSpecificGroup(en0, &ssmgroup, &ssmsource); err != nil { +// // error handling +// } +// if err := p.LeaveSourceSpecificGroup(en0, &ssmgroup, &ssmsource); err != nil { +// // error handling +// } +// +// or JoinGroup, ExcludeSourceSpecificGroup, +// IncludeSourceSpecificGroup and LeaveGroup for the operation known +// as "exclude" mode. +// +// exclsource := net.UDPAddr{IP: net.IPv4(192, 168, 0, 254)} +// if err := p.JoinGroup(en0, &ssmgroup); err != nil { +// // error handling +// } +// if err := p.ExcludeSourceSpecificGroup(en0, &ssmgroup, &exclsource); err != nil { +// // error handling +// } +// if err := p.LeaveGroup(en0, &ssmgroup); err != nil { +// // error handling +// } +// +// Note that it depends on each platform implementation what happens +// when an application which runs on IGMPv3 unsupported platform uses +// JoinSourceSpecificGroup and LeaveSourceSpecificGroup. +// In general the platform tries to fall back to conversations using +// IGMPv1 or IGMPv2 and starts to listen to multicast traffic. +// In the fallback case, ExcludeSourceSpecificGroup and +// IncludeSourceSpecificGroup may return an error. +package ipv4 // import "golang.org/x/net/ipv4" + +// BUG(mikio): This package is not implemented on NaCl and Plan 9. diff --git a/api/vendor/golang.org/x/net/ipv4/endpoint.go b/api/vendor/golang.org/x/net/ipv4/endpoint.go new file mode 100644 index 0000000..2ab8773 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/endpoint.go @@ -0,0 +1,187 @@ +// 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 ipv4 + +import ( + "net" + "syscall" + "time" + + "golang.org/x/net/internal/socket" +) + +// BUG(mikio): On Windows, the JoinSourceSpecificGroup, +// LeaveSourceSpecificGroup, ExcludeSourceSpecificGroup and +// IncludeSourceSpecificGroup methods of PacketConn and RawConn are +// not implemented. + +// A Conn represents a network endpoint that uses the IPv4 transport. +// It is used to control basic IP-level socket options such as TOS and +// TTL. +type Conn struct { + genericOpt +} + +type genericOpt struct { + *socket.Conn +} + +func (c *genericOpt) ok() bool { return c != nil && c.Conn != nil } + +// NewConn returns a new Conn. +func NewConn(c net.Conn) *Conn { + cc, _ := socket.NewConn(c) + return &Conn{ + genericOpt: genericOpt{Conn: cc}, + } +} + +// A PacketConn represents a packet network endpoint that uses the +// IPv4 transport. It is used to control several IP-level socket +// options including multicasting. It also provides datagram based +// network I/O methods specific to the IPv4 and higher layer protocols +// such as UDP. +type PacketConn struct { + genericOpt + dgramOpt + payloadHandler +} + +type dgramOpt struct { + *socket.Conn +} + +func (c *dgramOpt) ok() bool { return c != nil && c.Conn != nil } + +// SetControlMessage sets the per packet IP-level socket options. +func (c *PacketConn) SetControlMessage(cf ControlFlags, on bool) error { + if !c.payloadHandler.ok() { + return syscall.EINVAL + } + return setControlMessage(c.dgramOpt.Conn, &c.payloadHandler.rawOpt, cf, on) +} + +// SetDeadline sets the read and write deadlines associated with the +// endpoint. +func (c *PacketConn) SetDeadline(t time.Time) error { + if !c.payloadHandler.ok() { + return syscall.EINVAL + } + return c.payloadHandler.PacketConn.SetDeadline(t) +} + +// SetReadDeadline sets the read deadline associated with the +// endpoint. +func (c *PacketConn) SetReadDeadline(t time.Time) error { + if !c.payloadHandler.ok() { + return syscall.EINVAL + } + return c.payloadHandler.PacketConn.SetReadDeadline(t) +} + +// SetWriteDeadline sets the write deadline associated with the +// endpoint. +func (c *PacketConn) SetWriteDeadline(t time.Time) error { + if !c.payloadHandler.ok() { + return syscall.EINVAL + } + return c.payloadHandler.PacketConn.SetWriteDeadline(t) +} + +// Close closes the endpoint. +func (c *PacketConn) Close() error { + if !c.payloadHandler.ok() { + return syscall.EINVAL + } + return c.payloadHandler.PacketConn.Close() +} + +// NewPacketConn returns a new PacketConn using c as its underlying +// transport. +func NewPacketConn(c net.PacketConn) *PacketConn { + cc, _ := socket.NewConn(c.(net.Conn)) + p := &PacketConn{ + genericOpt: genericOpt{Conn: cc}, + dgramOpt: dgramOpt{Conn: cc}, + payloadHandler: payloadHandler{PacketConn: c, Conn: cc}, + } + return p +} + +// A RawConn represents a packet network endpoint that uses the IPv4 +// transport. It is used to control several IP-level socket options +// including IPv4 header manipulation. It also provides datagram +// based network I/O methods specific to the IPv4 and higher layer +// protocols that handle IPv4 datagram directly such as OSPF, GRE. +type RawConn struct { + genericOpt + dgramOpt + packetHandler +} + +// SetControlMessage sets the per packet IP-level socket options. +func (c *RawConn) SetControlMessage(cf ControlFlags, on bool) error { + if !c.packetHandler.ok() { + return syscall.EINVAL + } + return setControlMessage(c.dgramOpt.Conn, &c.packetHandler.rawOpt, cf, on) +} + +// SetDeadline sets the read and write deadlines associated with the +// endpoint. +func (c *RawConn) SetDeadline(t time.Time) error { + if !c.packetHandler.ok() { + return syscall.EINVAL + } + return c.packetHandler.IPConn.SetDeadline(t) +} + +// SetReadDeadline sets the read deadline associated with the +// endpoint. +func (c *RawConn) SetReadDeadline(t time.Time) error { + if !c.packetHandler.ok() { + return syscall.EINVAL + } + return c.packetHandler.IPConn.SetReadDeadline(t) +} + +// SetWriteDeadline sets the write deadline associated with the +// endpoint. +func (c *RawConn) SetWriteDeadline(t time.Time) error { + if !c.packetHandler.ok() { + return syscall.EINVAL + } + return c.packetHandler.IPConn.SetWriteDeadline(t) +} + +// Close closes the endpoint. +func (c *RawConn) Close() error { + if !c.packetHandler.ok() { + return syscall.EINVAL + } + return c.packetHandler.IPConn.Close() +} + +// NewRawConn returns a new RawConn using c as its underlying +// transport. +func NewRawConn(c net.PacketConn) (*RawConn, error) { + cc, err := socket.NewConn(c.(net.Conn)) + if err != nil { + return nil, err + } + r := &RawConn{ + genericOpt: genericOpt{Conn: cc}, + dgramOpt: dgramOpt{Conn: cc}, + packetHandler: packetHandler{IPConn: c.(*net.IPConn), Conn: cc}, + } + so, ok := sockOpts[ssoHeaderPrepend] + if !ok { + return nil, errOpNoSupport + } + if err := so.SetInt(r.dgramOpt.Conn, boolint(true)); err != nil { + return nil, err + } + return r, nil +} diff --git a/api/vendor/golang.org/x/net/ipv4/example_test.go b/api/vendor/golang.org/x/net/ipv4/example_test.go new file mode 100644 index 0000000..ddc7577 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/example_test.go @@ -0,0 +1,224 @@ +// 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 ipv4_test + +import ( + "fmt" + "log" + "net" + "os" + "runtime" + "time" + + "golang.org/x/net/icmp" + "golang.org/x/net/ipv4" +) + +func ExampleConn_markingTCP() { + ln, err := net.Listen("tcp", "0.0.0.0:1024") + if err != nil { + log.Fatal(err) + } + defer ln.Close() + + for { + c, err := ln.Accept() + if err != nil { + log.Fatal(err) + } + go func(c net.Conn) { + defer c.Close() + if c.RemoteAddr().(*net.TCPAddr).IP.To4() != nil { + p := ipv4.NewConn(c) + if err := p.SetTOS(0x28); err != nil { // DSCP AF11 + log.Fatal(err) + } + if err := p.SetTTL(128); err != nil { + log.Fatal(err) + } + } + if _, err := c.Write([]byte("HELLO-R-U-THERE-ACK")); err != nil { + log.Fatal(err) + } + }(c) + } +} + +func ExamplePacketConn_servingOneShotMulticastDNS() { + c, err := net.ListenPacket("udp4", "0.0.0.0:5353") // mDNS over UDP + if err != nil { + log.Fatal(err) + } + defer c.Close() + p := ipv4.NewPacketConn(c) + + en0, err := net.InterfaceByName("en0") + if err != nil { + log.Fatal(err) + } + mDNSLinkLocal := net.UDPAddr{IP: net.IPv4(224, 0, 0, 251)} + if err := p.JoinGroup(en0, &mDNSLinkLocal); err != nil { + log.Fatal(err) + } + defer p.LeaveGroup(en0, &mDNSLinkLocal) + if err := p.SetControlMessage(ipv4.FlagDst, true); err != nil { + log.Fatal(err) + } + + b := make([]byte, 1500) + for { + _, cm, peer, err := p.ReadFrom(b) + if err != nil { + log.Fatal(err) + } + if !cm.Dst.IsMulticast() || !cm.Dst.Equal(mDNSLinkLocal.IP) { + continue + } + answers := []byte("FAKE-MDNS-ANSWERS") // fake mDNS answers, you need to implement this + if _, err := p.WriteTo(answers, nil, peer); err != nil { + log.Fatal(err) + } + } +} + +func ExamplePacketConn_tracingIPPacketRoute() { + // Tracing an IP packet route to www.google.com. + + const host = "www.google.com" + ips, err := net.LookupIP(host) + if err != nil { + log.Fatal(err) + } + var dst net.IPAddr + for _, ip := range ips { + if ip.To4() != nil { + dst.IP = ip + fmt.Printf("using %v for tracing an IP packet route to %s\n", dst.IP, host) + break + } + } + if dst.IP == nil { + log.Fatal("no A record found") + } + + c, err := net.ListenPacket("ip4:1", "0.0.0.0") // ICMP for IPv4 + if err != nil { + log.Fatal(err) + } + defer c.Close() + p := ipv4.NewPacketConn(c) + + if err := p.SetControlMessage(ipv4.FlagTTL|ipv4.FlagSrc|ipv4.FlagDst|ipv4.FlagInterface, true); err != nil { + log.Fatal(err) + } + wm := icmp.Message{ + Type: ipv4.ICMPTypeEcho, Code: 0, + Body: &icmp.Echo{ + ID: os.Getpid() & 0xffff, + Data: []byte("HELLO-R-U-THERE"), + }, + } + + rb := make([]byte, 1500) + for i := 1; i <= 64; i++ { // up to 64 hops + wm.Body.(*icmp.Echo).Seq = i + wb, err := wm.Marshal(nil) + if err != nil { + log.Fatal(err) + } + if err := p.SetTTL(i); err != nil { + log.Fatal(err) + } + + // In the real world usually there are several + // multiple traffic-engineered paths for each hop. + // You may need to probe a few times to each hop. + begin := time.Now() + if _, err := p.WriteTo(wb, nil, &dst); err != nil { + log.Fatal(err) + } + if err := p.SetReadDeadline(time.Now().Add(3 * time.Second)); err != nil { + log.Fatal(err) + } + n, cm, peer, err := p.ReadFrom(rb) + if err != nil { + if err, ok := err.(net.Error); ok && err.Timeout() { + fmt.Printf("%v\t*\n", i) + continue + } + log.Fatal(err) + } + rm, err := icmp.ParseMessage(1, rb[:n]) + if err != nil { + log.Fatal(err) + } + rtt := time.Since(begin) + + // In the real world you need to determine whether the + // received message is yours using ControlMessage.Src, + // ControlMessage.Dst, icmp.Echo.ID and icmp.Echo.Seq. + switch rm.Type { + case ipv4.ICMPTypeTimeExceeded: + names, _ := net.LookupAddr(peer.String()) + fmt.Printf("%d\t%v %+v %v\n\t%+v\n", i, peer, names, rtt, cm) + case ipv4.ICMPTypeEchoReply: + names, _ := net.LookupAddr(peer.String()) + fmt.Printf("%d\t%v %+v %v\n\t%+v\n", i, peer, names, rtt, cm) + return + default: + log.Printf("unknown ICMP message: %+v\n", rm) + } + } +} + +func ExampleRawConn_advertisingOSPFHello() { + c, err := net.ListenPacket("ip4:89", "0.0.0.0") // OSPF for IPv4 + if err != nil { + log.Fatal(err) + } + defer c.Close() + r, err := ipv4.NewRawConn(c) + if err != nil { + log.Fatal(err) + } + + en0, err := net.InterfaceByName("en0") + if err != nil { + log.Fatal(err) + } + allSPFRouters := net.IPAddr{IP: net.IPv4(224, 0, 0, 5)} + if err := r.JoinGroup(en0, &allSPFRouters); err != nil { + log.Fatal(err) + } + defer r.LeaveGroup(en0, &allSPFRouters) + + hello := make([]byte, 24) // fake hello data, you need to implement this + ospf := make([]byte, 24) // fake ospf header, you need to implement this + ospf[0] = 2 // version 2 + ospf[1] = 1 // hello packet + ospf = append(ospf, hello...) + iph := &ipv4.Header{ + Version: ipv4.Version, + Len: ipv4.HeaderLen, + TOS: 0xc0, // DSCP CS6 + TotalLen: ipv4.HeaderLen + len(ospf), + TTL: 1, + Protocol: 89, + Dst: allSPFRouters.IP.To4(), + } + + var cm *ipv4.ControlMessage + switch runtime.GOOS { + case "darwin", "linux": + cm = &ipv4.ControlMessage{IfIndex: en0.Index} + default: + if err := r.SetMulticastInterface(en0); err != nil { + log.Fatal(err) + } + } + if err := r.WriteTo(iph, ospf, cm); err != nil { + log.Fatal(err) + } +} diff --git a/api/vendor/golang.org/x/net/ipv4/gen.go b/api/vendor/golang.org/x/net/ipv4/gen.go new file mode 100644 index 0000000..1bb1737 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/gen.go @@ -0,0 +1,199 @@ +// 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. + +// +build ignore + +//go:generate go run gen.go + +// This program generates system adaptation constants and types, +// internet protocol constants and tables by reading template files +// and IANA protocol registries. +package main + +import ( + "bytes" + "encoding/xml" + "fmt" + "go/format" + "io" + "io/ioutil" + "net/http" + "os" + "os/exec" + "runtime" + "strconv" + "strings" +) + +func main() { + if err := genzsys(); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + if err := geniana(); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} + +func genzsys() error { + defs := "defs_" + runtime.GOOS + ".go" + f, err := os.Open(defs) + if err != nil { + if os.IsNotExist(err) { + return nil + } + return err + } + f.Close() + cmd := exec.Command("go", "tool", "cgo", "-godefs", defs) + b, err := cmd.Output() + if err != nil { + return err + } + b, err = format.Source(b) + if err != nil { + return err + } + zsys := "zsys_" + runtime.GOOS + ".go" + switch runtime.GOOS { + case "freebsd", "linux": + zsys = "zsys_" + runtime.GOOS + "_" + runtime.GOARCH + ".go" + } + if err := ioutil.WriteFile(zsys, b, 0644); err != nil { + return err + } + return nil +} + +var registries = []struct { + url string + parse func(io.Writer, io.Reader) error +}{ + { + "https://www.iana.org/assignments/icmp-parameters/icmp-parameters.xml", + parseICMPv4Parameters, + }, +} + +func geniana() error { + var bb bytes.Buffer + fmt.Fprintf(&bb, "// go generate gen.go\n") + fmt.Fprintf(&bb, "// Code generated by the command above; DO NOT EDIT.\n\n") + fmt.Fprintf(&bb, "package ipv4\n\n") + for _, r := range registries { + resp, err := http.Get(r.url) + if err != nil { + return err + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + return fmt.Errorf("got HTTP status code %v for %v\n", resp.StatusCode, r.url) + } + if err := r.parse(&bb, resp.Body); err != nil { + return err + } + fmt.Fprintf(&bb, "\n") + } + b, err := format.Source(bb.Bytes()) + if err != nil { + return err + } + if err := ioutil.WriteFile("iana.go", b, 0644); err != nil { + return err + } + return nil +} + +func parseICMPv4Parameters(w io.Writer, r io.Reader) error { + dec := xml.NewDecoder(r) + var icp icmpv4Parameters + if err := dec.Decode(&icp); err != nil { + return err + } + prs := icp.escape() + fmt.Fprintf(w, "// %s, Updated: %s\n", icp.Title, icp.Updated) + fmt.Fprintf(w, "const (\n") + for _, pr := range prs { + if pr.Descr == "" { + continue + } + fmt.Fprintf(w, "ICMPType%s ICMPType = %d", pr.Descr, pr.Value) + fmt.Fprintf(w, "// %s\n", pr.OrigDescr) + } + fmt.Fprintf(w, ")\n\n") + fmt.Fprintf(w, "// %s, Updated: %s\n", icp.Title, icp.Updated) + fmt.Fprintf(w, "var icmpTypes = map[ICMPType]string{\n") + for _, pr := range prs { + if pr.Descr == "" { + continue + } + fmt.Fprintf(w, "%d: %q,\n", pr.Value, strings.ToLower(pr.OrigDescr)) + } + fmt.Fprintf(w, "}\n") + return nil +} + +type icmpv4Parameters struct { + XMLName xml.Name `xml:"registry"` + Title string `xml:"title"` + Updated string `xml:"updated"` + Registries []struct { + Title string `xml:"title"` + Records []struct { + Value string `xml:"value"` + Descr string `xml:"description"` + } `xml:"record"` + } `xml:"registry"` +} + +type canonICMPv4ParamRecord struct { + OrigDescr string + Descr string + Value int +} + +func (icp *icmpv4Parameters) escape() []canonICMPv4ParamRecord { + id := -1 + for i, r := range icp.Registries { + if strings.Contains(r.Title, "Type") || strings.Contains(r.Title, "type") { + id = i + break + } + } + if id < 0 { + return nil + } + prs := make([]canonICMPv4ParamRecord, len(icp.Registries[id].Records)) + sr := strings.NewReplacer( + "Messages", "", + "Message", "", + "ICMP", "", + "+", "P", + "-", "", + "/", "", + ".", "", + " ", "", + ) + for i, pr := range icp.Registries[id].Records { + if strings.Contains(pr.Descr, "Reserved") || + strings.Contains(pr.Descr, "Unassigned") || + strings.Contains(pr.Descr, "Deprecated") || + strings.Contains(pr.Descr, "Experiment") || + strings.Contains(pr.Descr, "experiment") { + continue + } + ss := strings.Split(pr.Descr, "\n") + if len(ss) > 1 { + prs[i].Descr = strings.Join(ss, " ") + } else { + prs[i].Descr = ss[0] + } + s := strings.TrimSpace(prs[i].Descr) + prs[i].OrigDescr = s + prs[i].Descr = sr.Replace(s) + prs[i].Value, _ = strconv.Atoi(pr.Value) + } + return prs +} diff --git a/api/vendor/golang.org/x/net/ipv4/genericopt.go b/api/vendor/golang.org/x/net/ipv4/genericopt.go new file mode 100644 index 0000000..119bf84 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/genericopt.go @@ -0,0 +1,57 @@ +// 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 ipv4 + +import "syscall" + +// TOS returns the type-of-service field value for outgoing packets. +func (c *genericOpt) TOS() (int, error) { + if !c.ok() { + return 0, syscall.EINVAL + } + so, ok := sockOpts[ssoTOS] + if !ok { + return 0, errOpNoSupport + } + return so.GetInt(c.Conn) +} + +// SetTOS sets the type-of-service field value for future outgoing +// packets. +func (c *genericOpt) SetTOS(tos int) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoTOS] + if !ok { + return errOpNoSupport + } + return so.SetInt(c.Conn, tos) +} + +// TTL returns the time-to-live field value for outgoing packets. +func (c *genericOpt) TTL() (int, error) { + if !c.ok() { + return 0, syscall.EINVAL + } + so, ok := sockOpts[ssoTTL] + if !ok { + return 0, errOpNoSupport + } + return so.GetInt(c.Conn) +} + +// SetTTL sets the time-to-live field value for future outgoing +// packets. +func (c *genericOpt) SetTTL(ttl int) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoTTL] + if !ok { + return errOpNoSupport + } + return so.SetInt(c.Conn, ttl) +} diff --git a/api/vendor/golang.org/x/net/ipv4/header.go b/api/vendor/golang.org/x/net/ipv4/header.go new file mode 100644 index 0000000..c8822a6 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/header.go @@ -0,0 +1,159 @@ +// 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 ipv4 + +import ( + "encoding/binary" + "fmt" + "net" + "runtime" + "syscall" + + "golang.org/x/net/internal/socket" +) + +const ( + Version = 4 // protocol version + HeaderLen = 20 // header length without extension headers + maxHeaderLen = 60 // sensible default, revisit if later RFCs define new usage of version and header length fields +) + +type HeaderFlags int + +const ( + MoreFragments HeaderFlags = 1 << iota // more fragments flag + DontFragment // don't fragment flag +) + +// A Header represents an IPv4 header. +type Header struct { + Version int // protocol version + Len int // header length + TOS int // type-of-service + TotalLen int // packet total length + ID int // identification + Flags HeaderFlags // flags + FragOff int // fragment offset + TTL int // time-to-live + Protocol int // next protocol + Checksum int // checksum + Src net.IP // source address + Dst net.IP // destination address + Options []byte // options, extension headers +} + +func (h *Header) String() string { + if h == nil { + return "" + } + return fmt.Sprintf("ver=%d hdrlen=%d tos=%#x totallen=%d id=%#x flags=%#x fragoff=%#x ttl=%d proto=%d cksum=%#x src=%v dst=%v", h.Version, h.Len, h.TOS, h.TotalLen, h.ID, h.Flags, h.FragOff, h.TTL, h.Protocol, h.Checksum, h.Src, h.Dst) +} + +// Marshal returns the binary encoding of h. +func (h *Header) Marshal() ([]byte, error) { + if h == nil { + return nil, syscall.EINVAL + } + if h.Len < HeaderLen { + return nil, errHeaderTooShort + } + hdrlen := HeaderLen + len(h.Options) + b := make([]byte, hdrlen) + b[0] = byte(Version<<4 | (hdrlen >> 2 & 0x0f)) + b[1] = byte(h.TOS) + flagsAndFragOff := (h.FragOff & 0x1fff) | int(h.Flags<<13) + switch runtime.GOOS { + case "darwin", "dragonfly", "netbsd": + socket.NativeEndian.PutUint16(b[2:4], uint16(h.TotalLen)) + socket.NativeEndian.PutUint16(b[6:8], uint16(flagsAndFragOff)) + case "freebsd": + if freebsdVersion < 1100000 { + socket.NativeEndian.PutUint16(b[2:4], uint16(h.TotalLen)) + socket.NativeEndian.PutUint16(b[6:8], uint16(flagsAndFragOff)) + } else { + binary.BigEndian.PutUint16(b[2:4], uint16(h.TotalLen)) + binary.BigEndian.PutUint16(b[6:8], uint16(flagsAndFragOff)) + } + default: + binary.BigEndian.PutUint16(b[2:4], uint16(h.TotalLen)) + binary.BigEndian.PutUint16(b[6:8], uint16(flagsAndFragOff)) + } + binary.BigEndian.PutUint16(b[4:6], uint16(h.ID)) + b[8] = byte(h.TTL) + b[9] = byte(h.Protocol) + binary.BigEndian.PutUint16(b[10:12], uint16(h.Checksum)) + if ip := h.Src.To4(); ip != nil { + copy(b[12:16], ip[:net.IPv4len]) + } + if ip := h.Dst.To4(); ip != nil { + copy(b[16:20], ip[:net.IPv4len]) + } else { + return nil, errMissingAddress + } + if len(h.Options) > 0 { + copy(b[HeaderLen:], h.Options) + } + return b, nil +} + +// Parse parses b as an IPv4 header and stores the result in h. +func (h *Header) Parse(b []byte) error { + if h == nil || len(b) < HeaderLen { + return errHeaderTooShort + } + hdrlen := int(b[0]&0x0f) << 2 + if hdrlen > len(b) { + return errBufferTooShort + } + h.Version = int(b[0] >> 4) + h.Len = hdrlen + h.TOS = int(b[1]) + h.ID = int(binary.BigEndian.Uint16(b[4:6])) + h.TTL = int(b[8]) + h.Protocol = int(b[9]) + h.Checksum = int(binary.BigEndian.Uint16(b[10:12])) + h.Src = net.IPv4(b[12], b[13], b[14], b[15]) + h.Dst = net.IPv4(b[16], b[17], b[18], b[19]) + switch runtime.GOOS { + case "darwin", "dragonfly", "netbsd": + h.TotalLen = int(socket.NativeEndian.Uint16(b[2:4])) + hdrlen + h.FragOff = int(socket.NativeEndian.Uint16(b[6:8])) + case "freebsd": + if freebsdVersion < 1100000 { + h.TotalLen = int(socket.NativeEndian.Uint16(b[2:4])) + if freebsdVersion < 1000000 { + h.TotalLen += hdrlen + } + h.FragOff = int(socket.NativeEndian.Uint16(b[6:8])) + } else { + h.TotalLen = int(binary.BigEndian.Uint16(b[2:4])) + h.FragOff = int(binary.BigEndian.Uint16(b[6:8])) + } + default: + h.TotalLen = int(binary.BigEndian.Uint16(b[2:4])) + h.FragOff = int(binary.BigEndian.Uint16(b[6:8])) + } + h.Flags = HeaderFlags(h.FragOff&0xe000) >> 13 + h.FragOff = h.FragOff & 0x1fff + optlen := hdrlen - HeaderLen + if optlen > 0 && len(b) >= hdrlen { + if cap(h.Options) < optlen { + h.Options = make([]byte, optlen) + } else { + h.Options = h.Options[:optlen] + } + copy(h.Options, b[HeaderLen:hdrlen]) + } + return nil +} + +// ParseHeader parses b as an IPv4 header. +func ParseHeader(b []byte) (*Header, error) { + h := new(Header) + if err := h.Parse(b); err != nil { + return nil, err + } + return h, nil +} diff --git a/api/vendor/golang.org/x/net/ipv4/header_test.go b/api/vendor/golang.org/x/net/ipv4/header_test.go new file mode 100644 index 0000000..a246aee --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/header_test.go @@ -0,0 +1,228 @@ +// 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 ipv4 + +import ( + "bytes" + "encoding/binary" + "net" + "reflect" + "runtime" + "strings" + "testing" + + "golang.org/x/net/internal/socket" +) + +type headerTest struct { + wireHeaderFromKernel []byte + wireHeaderToKernel []byte + wireHeaderFromTradBSDKernel []byte + wireHeaderToTradBSDKernel []byte + wireHeaderFromFreeBSD10Kernel []byte + wireHeaderToFreeBSD10Kernel []byte + *Header +} + +var headerLittleEndianTests = []headerTest{ + // TODO(mikio): Add platform dependent wire header formats when + // we support new platforms. + { + wireHeaderFromKernel: []byte{ + 0x45, 0x01, 0xbe, 0xef, + 0xca, 0xfe, 0x45, 0xdc, + 0xff, 0x01, 0xde, 0xad, + 172, 16, 254, 254, + 192, 168, 0, 1, + }, + wireHeaderToKernel: []byte{ + 0x45, 0x01, 0xbe, 0xef, + 0xca, 0xfe, 0x45, 0xdc, + 0xff, 0x01, 0xde, 0xad, + 172, 16, 254, 254, + 192, 168, 0, 1, + }, + wireHeaderFromTradBSDKernel: []byte{ + 0x45, 0x01, 0xdb, 0xbe, + 0xca, 0xfe, 0xdc, 0x45, + 0xff, 0x01, 0xde, 0xad, + 172, 16, 254, 254, + 192, 168, 0, 1, + }, + wireHeaderToTradBSDKernel: []byte{ + 0x45, 0x01, 0xef, 0xbe, + 0xca, 0xfe, 0xdc, 0x45, + 0xff, 0x01, 0xde, 0xad, + 172, 16, 254, 254, + 192, 168, 0, 1, + }, + wireHeaderFromFreeBSD10Kernel: []byte{ + 0x45, 0x01, 0xef, 0xbe, + 0xca, 0xfe, 0xdc, 0x45, + 0xff, 0x01, 0xde, 0xad, + 172, 16, 254, 254, + 192, 168, 0, 1, + }, + wireHeaderToFreeBSD10Kernel: []byte{ + 0x45, 0x01, 0xef, 0xbe, + 0xca, 0xfe, 0xdc, 0x45, + 0xff, 0x01, 0xde, 0xad, + 172, 16, 254, 254, + 192, 168, 0, 1, + }, + Header: &Header{ + Version: Version, + Len: HeaderLen, + TOS: 1, + TotalLen: 0xbeef, + ID: 0xcafe, + Flags: DontFragment, + FragOff: 1500, + TTL: 255, + Protocol: 1, + Checksum: 0xdead, + Src: net.IPv4(172, 16, 254, 254), + Dst: net.IPv4(192, 168, 0, 1), + }, + }, + + // with option headers + { + wireHeaderFromKernel: []byte{ + 0x46, 0x01, 0xbe, 0xf3, + 0xca, 0xfe, 0x45, 0xdc, + 0xff, 0x01, 0xde, 0xad, + 172, 16, 254, 254, + 192, 168, 0, 1, + 0xff, 0xfe, 0xfe, 0xff, + }, + wireHeaderToKernel: []byte{ + 0x46, 0x01, 0xbe, 0xf3, + 0xca, 0xfe, 0x45, 0xdc, + 0xff, 0x01, 0xde, 0xad, + 172, 16, 254, 254, + 192, 168, 0, 1, + 0xff, 0xfe, 0xfe, 0xff, + }, + wireHeaderFromTradBSDKernel: []byte{ + 0x46, 0x01, 0xdb, 0xbe, + 0xca, 0xfe, 0xdc, 0x45, + 0xff, 0x01, 0xde, 0xad, + 172, 16, 254, 254, + 192, 168, 0, 1, + 0xff, 0xfe, 0xfe, 0xff, + }, + wireHeaderToTradBSDKernel: []byte{ + 0x46, 0x01, 0xf3, 0xbe, + 0xca, 0xfe, 0xdc, 0x45, + 0xff, 0x01, 0xde, 0xad, + 172, 16, 254, 254, + 192, 168, 0, 1, + 0xff, 0xfe, 0xfe, 0xff, + }, + wireHeaderFromFreeBSD10Kernel: []byte{ + 0x46, 0x01, 0xf3, 0xbe, + 0xca, 0xfe, 0xdc, 0x45, + 0xff, 0x01, 0xde, 0xad, + 172, 16, 254, 254, + 192, 168, 0, 1, + 0xff, 0xfe, 0xfe, 0xff, + }, + wireHeaderToFreeBSD10Kernel: []byte{ + 0x46, 0x01, 0xf3, 0xbe, + 0xca, 0xfe, 0xdc, 0x45, + 0xff, 0x01, 0xde, 0xad, + 172, 16, 254, 254, + 192, 168, 0, 1, + 0xff, 0xfe, 0xfe, 0xff, + }, + Header: &Header{ + Version: Version, + Len: HeaderLen + 4, + TOS: 1, + TotalLen: 0xbef3, + ID: 0xcafe, + Flags: DontFragment, + FragOff: 1500, + TTL: 255, + Protocol: 1, + Checksum: 0xdead, + Src: net.IPv4(172, 16, 254, 254), + Dst: net.IPv4(192, 168, 0, 1), + Options: []byte{0xff, 0xfe, 0xfe, 0xff}, + }, + }, +} + +func TestMarshalHeader(t *testing.T) { + if socket.NativeEndian != binary.LittleEndian { + t.Skip("no test for non-little endian machine yet") + } + + for _, tt := range headerLittleEndianTests { + b, err := tt.Header.Marshal() + if err != nil { + t.Fatal(err) + } + var wh []byte + switch runtime.GOOS { + case "darwin", "dragonfly", "netbsd": + wh = tt.wireHeaderToTradBSDKernel + case "freebsd": + switch { + case freebsdVersion < 1000000: + wh = tt.wireHeaderToTradBSDKernel + case 1000000 <= freebsdVersion && freebsdVersion < 1100000: + wh = tt.wireHeaderToFreeBSD10Kernel + default: + wh = tt.wireHeaderToKernel + } + default: + wh = tt.wireHeaderToKernel + } + if !bytes.Equal(b, wh) { + t.Fatalf("got %#v; want %#v", b, wh) + } + } +} + +func TestParseHeader(t *testing.T) { + if socket.NativeEndian != binary.LittleEndian { + t.Skip("no test for big endian machine yet") + } + + for _, tt := range headerLittleEndianTests { + var wh []byte + switch runtime.GOOS { + case "darwin", "dragonfly", "netbsd": + wh = tt.wireHeaderFromTradBSDKernel + case "freebsd": + switch { + case freebsdVersion < 1000000: + wh = tt.wireHeaderFromTradBSDKernel + case 1000000 <= freebsdVersion && freebsdVersion < 1100000: + wh = tt.wireHeaderFromFreeBSD10Kernel + default: + wh = tt.wireHeaderFromKernel + } + default: + wh = tt.wireHeaderFromKernel + } + h, err := ParseHeader(wh) + if err != nil { + t.Fatal(err) + } + if err := h.Parse(wh); err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(h, tt.Header) { + t.Fatalf("got %#v; want %#v", h, tt.Header) + } + s := h.String() + if strings.Contains(s, ",") { + t.Fatalf("should be space-separated values: %s", s) + } + } +} diff --git a/api/vendor/golang.org/x/net/ipv4/helper.go b/api/vendor/golang.org/x/net/ipv4/helper.go new file mode 100644 index 0000000..a5052e3 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/helper.go @@ -0,0 +1,63 @@ +// 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 ipv4 + +import ( + "errors" + "net" +) + +var ( + errMissingAddress = errors.New("missing address") + errMissingHeader = errors.New("missing header") + errHeaderTooShort = errors.New("header too short") + errBufferTooShort = errors.New("buffer too short") + errInvalidConnType = errors.New("invalid conn type") + errOpNoSupport = errors.New("operation not supported") + errNoSuchInterface = errors.New("no such interface") + errNoSuchMulticastInterface = errors.New("no such multicast interface") + + // See http://www.freebsd.org/doc/en/books/porters-handbook/freebsd-versions.html. + freebsdVersion uint32 +) + +func boolint(b bool) int { + if b { + return 1 + } + return 0 +} + +func netAddrToIP4(a net.Addr) net.IP { + switch v := a.(type) { + case *net.UDPAddr: + if ip := v.IP.To4(); ip != nil { + return ip + } + case *net.IPAddr: + if ip := v.IP.To4(); ip != nil { + return ip + } + } + return nil +} + +func opAddr(a net.Addr) net.Addr { + switch a.(type) { + case *net.TCPAddr: + if a == nil { + return nil + } + case *net.UDPAddr: + if a == nil { + return nil + } + case *net.IPAddr: + if a == nil { + return nil + } + } + return a +} diff --git a/api/vendor/golang.org/x/net/ipv4/iana.go b/api/vendor/golang.org/x/net/ipv4/iana.go new file mode 100644 index 0000000..4375b40 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/iana.go @@ -0,0 +1,38 @@ +// go generate gen.go +// Code generated by the command above; DO NOT EDIT. + +package ipv4 + +// Internet Control Message Protocol (ICMP) Parameters, Updated: 2018-02-26 +const ( + ICMPTypeEchoReply ICMPType = 0 // Echo Reply + ICMPTypeDestinationUnreachable ICMPType = 3 // Destination Unreachable + ICMPTypeRedirect ICMPType = 5 // Redirect + ICMPTypeEcho ICMPType = 8 // Echo + ICMPTypeRouterAdvertisement ICMPType = 9 // Router Advertisement + ICMPTypeRouterSolicitation ICMPType = 10 // Router Solicitation + ICMPTypeTimeExceeded ICMPType = 11 // Time Exceeded + ICMPTypeParameterProblem ICMPType = 12 // Parameter Problem + ICMPTypeTimestamp ICMPType = 13 // Timestamp + ICMPTypeTimestampReply ICMPType = 14 // Timestamp Reply + ICMPTypePhoturis ICMPType = 40 // Photuris + ICMPTypeExtendedEchoRequest ICMPType = 42 // Extended Echo Request + ICMPTypeExtendedEchoReply ICMPType = 43 // Extended Echo Reply +) + +// Internet Control Message Protocol (ICMP) Parameters, Updated: 2018-02-26 +var icmpTypes = map[ICMPType]string{ + 0: "echo reply", + 3: "destination unreachable", + 5: "redirect", + 8: "echo", + 9: "router advertisement", + 10: "router solicitation", + 11: "time exceeded", + 12: "parameter problem", + 13: "timestamp", + 14: "timestamp reply", + 40: "photuris", + 42: "extended echo request", + 43: "extended echo reply", +} diff --git a/api/vendor/golang.org/x/net/ipv4/icmp.go b/api/vendor/golang.org/x/net/ipv4/icmp.go new file mode 100644 index 0000000..9902bb3 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/icmp.go @@ -0,0 +1,57 @@ +// 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 ipv4 + +import "golang.org/x/net/internal/iana" + +// An ICMPType represents a type of ICMP message. +type ICMPType int + +func (typ ICMPType) String() string { + s, ok := icmpTypes[typ] + if !ok { + return "" + } + return s +} + +// Protocol returns the ICMPv4 protocol number. +func (typ ICMPType) Protocol() int { + return iana.ProtocolICMP +} + +// An ICMPFilter represents an ICMP message filter for incoming +// packets. The filter belongs to a packet delivery path on a host and +// it cannot interact with forwarding packets or tunnel-outer packets. +// +// Note: RFC 8200 defines a reasonable role model and it works not +// only for IPv6 but IPv4. A node means a device that implements IP. +// A router means a node that forwards IP packets not explicitly +// addressed to itself, and a host means a node that is not a router. +type ICMPFilter struct { + icmpFilter +} + +// Accept accepts incoming ICMP packets including the type field value +// typ. +func (f *ICMPFilter) Accept(typ ICMPType) { + f.accept(typ) +} + +// Block blocks incoming ICMP packets including the type field value +// typ. +func (f *ICMPFilter) Block(typ ICMPType) { + f.block(typ) +} + +// SetAll sets the filter action to the filter. +func (f *ICMPFilter) SetAll(block bool) { + f.setAll(block) +} + +// WillBlock reports whether the ICMP type will be blocked. +func (f *ICMPFilter) WillBlock(typ ICMPType) bool { + return f.willBlock(typ) +} diff --git a/api/vendor/golang.org/x/net/ipv4/icmp_linux.go b/api/vendor/golang.org/x/net/ipv4/icmp_linux.go new file mode 100644 index 0000000..6e1c5c8 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/icmp_linux.go @@ -0,0 +1,25 @@ +// 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 ipv4 + +func (f *icmpFilter) accept(typ ICMPType) { + f.Data &^= 1 << (uint32(typ) & 31) +} + +func (f *icmpFilter) block(typ ICMPType) { + f.Data |= 1 << (uint32(typ) & 31) +} + +func (f *icmpFilter) setAll(block bool) { + if block { + f.Data = 1<<32 - 1 + } else { + f.Data = 0 + } +} + +func (f *icmpFilter) willBlock(typ ICMPType) bool { + return f.Data&(1<<(uint32(typ)&31)) != 0 +} diff --git a/api/vendor/golang.org/x/net/ipv4/icmp_stub.go b/api/vendor/golang.org/x/net/ipv4/icmp_stub.go new file mode 100644 index 0000000..21bb29a --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/icmp_stub.go @@ -0,0 +1,25 @@ +// 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. + +// +build !linux + +package ipv4 + +const sizeofICMPFilter = 0x0 + +type icmpFilter struct { +} + +func (f *icmpFilter) accept(typ ICMPType) { +} + +func (f *icmpFilter) block(typ ICMPType) { +} + +func (f *icmpFilter) setAll(block bool) { +} + +func (f *icmpFilter) willBlock(typ ICMPType) bool { + return false +} diff --git a/api/vendor/golang.org/x/net/ipv4/icmp_test.go b/api/vendor/golang.org/x/net/ipv4/icmp_test.go new file mode 100644 index 0000000..3324b54 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/icmp_test.go @@ -0,0 +1,95 @@ +// 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 ipv4_test + +import ( + "net" + "reflect" + "runtime" + "testing" + + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv4" +) + +var icmpStringTests = []struct { + in ipv4.ICMPType + out string +}{ + {ipv4.ICMPTypeDestinationUnreachable, "destination unreachable"}, + + {256, ""}, +} + +func TestICMPString(t *testing.T) { + for _, tt := range icmpStringTests { + s := tt.in.String() + if s != tt.out { + t.Errorf("got %s; want %s", s, tt.out) + } + } +} + +func TestICMPFilter(t *testing.T) { + switch runtime.GOOS { + case "linux": + default: + t.Skipf("not supported on %s", runtime.GOOS) + } + + var f ipv4.ICMPFilter + for _, toggle := range []bool{false, true} { + f.SetAll(toggle) + for _, typ := range []ipv4.ICMPType{ + ipv4.ICMPTypeDestinationUnreachable, + ipv4.ICMPTypeEchoReply, + ipv4.ICMPTypeTimeExceeded, + ipv4.ICMPTypeParameterProblem, + } { + f.Accept(typ) + if f.WillBlock(typ) { + t.Errorf("ipv4.ICMPFilter.Set(%v, false) failed", typ) + } + f.Block(typ) + if !f.WillBlock(typ) { + t.Errorf("ipv4.ICMPFilter.Set(%v, true) failed", typ) + } + } + } +} + +func TestSetICMPFilter(t *testing.T) { + switch runtime.GOOS { + case "linux": + default: + t.Skipf("not supported on %s", runtime.GOOS) + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + + c, err := net.ListenPacket("ip4:icmp", "127.0.0.1") + if err != nil { + t.Fatal(err) + } + defer c.Close() + + p := ipv4.NewPacketConn(c) + + var f ipv4.ICMPFilter + f.SetAll(true) + f.Accept(ipv4.ICMPTypeEcho) + f.Accept(ipv4.ICMPTypeEchoReply) + if err := p.SetICMPFilter(&f); err != nil { + t.Fatal(err) + } + kf, err := p.ICMPFilter() + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(kf, &f) { + t.Fatalf("got %#v; want %#v", kf, f) + } +} diff --git a/api/vendor/golang.org/x/net/ipv4/multicast_test.go b/api/vendor/golang.org/x/net/ipv4/multicast_test.go new file mode 100644 index 0000000..bcf4973 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/multicast_test.go @@ -0,0 +1,334 @@ +// 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 ipv4_test + +import ( + "bytes" + "net" + "os" + "runtime" + "testing" + "time" + + "golang.org/x/net/icmp" + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv4" +) + +var packetConnReadWriteMulticastUDPTests = []struct { + addr string + grp, src *net.UDPAddr +}{ + {"224.0.0.0:0", &net.UDPAddr{IP: net.IPv4(224, 0, 0, 254)}, nil}, // see RFC 4727 + + {"232.0.1.0:0", &net.UDPAddr{IP: net.IPv4(232, 0, 1, 254)}, &net.UDPAddr{IP: net.IPv4(127, 0, 0, 1)}}, // see RFC 5771 +} + +func TestPacketConnReadWriteMulticastUDP(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "solaris", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagMulticast|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + for _, tt := range packetConnReadWriteMulticastUDPTests { + c, err := net.ListenPacket("udp4", tt.addr) + if err != nil { + t.Fatal(err) + } + defer c.Close() + + grp := *tt.grp + grp.Port = c.LocalAddr().(*net.UDPAddr).Port + p := ipv4.NewPacketConn(c) + defer p.Close() + if tt.src == nil { + if err := p.JoinGroup(ifi, &grp); err != nil { + t.Fatal(err) + } + defer p.LeaveGroup(ifi, &grp) + } else { + if err := p.JoinSourceSpecificGroup(ifi, &grp, tt.src); err != nil { + switch runtime.GOOS { + case "freebsd", "linux": + default: // platforms that don't support IGMPv2/3 fail here + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + defer p.LeaveSourceSpecificGroup(ifi, &grp, tt.src) + } + if err := p.SetMulticastInterface(ifi); err != nil { + t.Fatal(err) + } + if _, err := p.MulticastInterface(); err != nil { + t.Fatal(err) + } + if err := p.SetMulticastLoopback(true); err != nil { + t.Fatal(err) + } + if _, err := p.MulticastLoopback(); err != nil { + t.Fatal(err) + } + cf := ipv4.FlagTTL | ipv4.FlagDst | ipv4.FlagInterface + wb := []byte("HELLO-R-U-THERE") + + for i, toggle := range []bool{true, false, true} { + if err := p.SetControlMessage(cf, toggle); err != nil { + if nettest.ProtocolNotSupported(err) { + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + if err := p.SetDeadline(time.Now().Add(200 * time.Millisecond)); err != nil { + t.Fatal(err) + } + p.SetMulticastTTL(i + 1) + if n, err := p.WriteTo(wb, nil, &grp); err != nil { + t.Fatal(err) + } else if n != len(wb) { + t.Fatalf("got %v; want %v", n, len(wb)) + } + rb := make([]byte, 128) + if n, _, _, err := p.ReadFrom(rb); err != nil { + t.Fatal(err) + } else if !bytes.Equal(rb[:n], wb) { + t.Fatalf("got %v; want %v", rb[:n], wb) + } + } + } +} + +var packetConnReadWriteMulticastICMPTests = []struct { + grp, src *net.IPAddr +}{ + {&net.IPAddr{IP: net.IPv4(224, 0, 0, 254)}, nil}, // see RFC 4727 + + {&net.IPAddr{IP: net.IPv4(232, 0, 1, 254)}, &net.IPAddr{IP: net.IPv4(127, 0, 0, 1)}}, // see RFC 5771 +} + +func TestPacketConnReadWriteMulticastICMP(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "solaris", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagMulticast|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + for _, tt := range packetConnReadWriteMulticastICMPTests { + c, err := net.ListenPacket("ip4:icmp", "0.0.0.0") + if err != nil { + t.Fatal(err) + } + defer c.Close() + + p := ipv4.NewPacketConn(c) + defer p.Close() + if tt.src == nil { + if err := p.JoinGroup(ifi, tt.grp); err != nil { + t.Fatal(err) + } + defer p.LeaveGroup(ifi, tt.grp) + } else { + if err := p.JoinSourceSpecificGroup(ifi, tt.grp, tt.src); err != nil { + switch runtime.GOOS { + case "freebsd", "linux": + default: // platforms that don't support IGMPv2/3 fail here + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + defer p.LeaveSourceSpecificGroup(ifi, tt.grp, tt.src) + } + if err := p.SetMulticastInterface(ifi); err != nil { + t.Fatal(err) + } + if _, err := p.MulticastInterface(); err != nil { + t.Fatal(err) + } + if err := p.SetMulticastLoopback(true); err != nil { + t.Fatal(err) + } + if _, err := p.MulticastLoopback(); err != nil { + t.Fatal(err) + } + cf := ipv4.FlagDst | ipv4.FlagInterface + if runtime.GOOS != "solaris" { + // Solaris never allows to modify ICMP properties. + cf |= ipv4.FlagTTL + } + + for i, toggle := range []bool{true, false, true} { + wb, err := (&icmp.Message{ + Type: ipv4.ICMPTypeEcho, Code: 0, + Body: &icmp.Echo{ + ID: os.Getpid() & 0xffff, Seq: i + 1, + Data: []byte("HELLO-R-U-THERE"), + }, + }).Marshal(nil) + if err != nil { + t.Fatal(err) + } + if err := p.SetControlMessage(cf, toggle); err != nil { + if nettest.ProtocolNotSupported(err) { + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + if err := p.SetDeadline(time.Now().Add(200 * time.Millisecond)); err != nil { + t.Fatal(err) + } + p.SetMulticastTTL(i + 1) + if n, err := p.WriteTo(wb, nil, tt.grp); err != nil { + t.Fatal(err) + } else if n != len(wb) { + t.Fatalf("got %v; want %v", n, len(wb)) + } + rb := make([]byte, 128) + if n, _, _, err := p.ReadFrom(rb); err != nil { + t.Fatal(err) + } else { + m, err := icmp.ParseMessage(iana.ProtocolICMP, rb[:n]) + if err != nil { + t.Fatal(err) + } + switch { + case m.Type == ipv4.ICMPTypeEchoReply && m.Code == 0: // net.inet.icmp.bmcastecho=1 + case m.Type == ipv4.ICMPTypeEcho && m.Code == 0: // net.inet.icmp.bmcastecho=0 + default: + t.Fatalf("got type=%v, code=%v; want type=%v, code=%v", m.Type, m.Code, ipv4.ICMPTypeEchoReply, 0) + } + } + } + } +} + +var rawConnReadWriteMulticastICMPTests = []struct { + grp, src *net.IPAddr +}{ + {&net.IPAddr{IP: net.IPv4(224, 0, 0, 254)}, nil}, // see RFC 4727 + + {&net.IPAddr{IP: net.IPv4(232, 0, 1, 254)}, &net.IPAddr{IP: net.IPv4(127, 0, 0, 1)}}, // see RFC 5771 +} + +func TestRawConnReadWriteMulticastICMP(t *testing.T) { + if testing.Short() { + t.Skip("to avoid external network") + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagMulticast|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + for _, tt := range rawConnReadWriteMulticastICMPTests { + c, err := net.ListenPacket("ip4:icmp", "0.0.0.0") + if err != nil { + t.Fatal(err) + } + defer c.Close() + + r, err := ipv4.NewRawConn(c) + if err != nil { + t.Fatal(err) + } + defer r.Close() + if tt.src == nil { + if err := r.JoinGroup(ifi, tt.grp); err != nil { + t.Fatal(err) + } + defer r.LeaveGroup(ifi, tt.grp) + } else { + if err := r.JoinSourceSpecificGroup(ifi, tt.grp, tt.src); err != nil { + switch runtime.GOOS { + case "freebsd", "linux": + default: // platforms that don't support IGMPv2/3 fail here + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + defer r.LeaveSourceSpecificGroup(ifi, tt.grp, tt.src) + } + if err := r.SetMulticastInterface(ifi); err != nil { + t.Fatal(err) + } + if _, err := r.MulticastInterface(); err != nil { + t.Fatal(err) + } + if err := r.SetMulticastLoopback(true); err != nil { + t.Fatal(err) + } + if _, err := r.MulticastLoopback(); err != nil { + t.Fatal(err) + } + cf := ipv4.FlagTTL | ipv4.FlagDst | ipv4.FlagInterface + + for i, toggle := range []bool{true, false, true} { + wb, err := (&icmp.Message{ + Type: ipv4.ICMPTypeEcho, Code: 0, + Body: &icmp.Echo{ + ID: os.Getpid() & 0xffff, Seq: i + 1, + Data: []byte("HELLO-R-U-THERE"), + }, + }).Marshal(nil) + if err != nil { + t.Fatal(err) + } + wh := &ipv4.Header{ + Version: ipv4.Version, + Len: ipv4.HeaderLen, + TOS: i + 1, + TotalLen: ipv4.HeaderLen + len(wb), + Protocol: 1, + Dst: tt.grp.IP, + } + if err := r.SetControlMessage(cf, toggle); err != nil { + if nettest.ProtocolNotSupported(err) { + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + if err := r.SetDeadline(time.Now().Add(200 * time.Millisecond)); err != nil { + t.Fatal(err) + } + r.SetMulticastTTL(i + 1) + if err := r.WriteTo(wh, wb, nil); err != nil { + t.Fatal(err) + } + rb := make([]byte, ipv4.HeaderLen+128) + if rh, b, _, err := r.ReadFrom(rb); err != nil { + t.Fatal(err) + } else { + m, err := icmp.ParseMessage(iana.ProtocolICMP, b) + if err != nil { + t.Fatal(err) + } + switch { + case (rh.Dst.IsLoopback() || rh.Dst.IsLinkLocalUnicast() || rh.Dst.IsGlobalUnicast()) && m.Type == ipv4.ICMPTypeEchoReply && m.Code == 0: // net.inet.icmp.bmcastecho=1 + case rh.Dst.IsMulticast() && m.Type == ipv4.ICMPTypeEcho && m.Code == 0: // net.inet.icmp.bmcastecho=0 + default: + t.Fatalf("got type=%v, code=%v; want type=%v, code=%v", m.Type, m.Code, ipv4.ICMPTypeEchoReply, 0) + } + } + } + } +} diff --git a/api/vendor/golang.org/x/net/ipv4/multicastlistener_test.go b/api/vendor/golang.org/x/net/ipv4/multicastlistener_test.go new file mode 100644 index 0000000..e43fbbe --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/multicastlistener_test.go @@ -0,0 +1,265 @@ +// 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 ipv4_test + +import ( + "net" + "runtime" + "testing" + + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv4" +) + +var udpMultipleGroupListenerTests = []net.Addr{ + &net.UDPAddr{IP: net.IPv4(224, 0, 0, 249)}, // see RFC 4727 + &net.UDPAddr{IP: net.IPv4(224, 0, 0, 250)}, + &net.UDPAddr{IP: net.IPv4(224, 0, 0, 254)}, +} + +func TestUDPSinglePacketConnWithMultipleGroupListeners(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if testing.Short() { + t.Skip("to avoid external network") + } + + for _, gaddr := range udpMultipleGroupListenerTests { + c, err := net.ListenPacket("udp4", "0.0.0.0:0") // wildcard address with no reusable port + if err != nil { + t.Fatal(err) + } + defer c.Close() + + p := ipv4.NewPacketConn(c) + var mift []*net.Interface + + ift, err := net.Interfaces() + if err != nil { + t.Fatal(err) + } + for i, ifi := range ift { + if _, ok := nettest.IsMulticastCapable("ip4", &ifi); !ok { + continue + } + if err := p.JoinGroup(&ifi, gaddr); err != nil { + t.Fatal(err) + } + mift = append(mift, &ift[i]) + } + for _, ifi := range mift { + if err := p.LeaveGroup(ifi, gaddr); err != nil { + t.Fatal(err) + } + } + } +} + +func TestUDPMultiplePacketConnWithMultipleGroupListeners(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if testing.Short() { + t.Skip("to avoid external network") + } + + for _, gaddr := range udpMultipleGroupListenerTests { + c1, err := net.ListenPacket("udp4", "224.0.0.0:0") // wildcard address with reusable port + if err != nil { + t.Fatal(err) + } + defer c1.Close() + _, port, err := net.SplitHostPort(c1.LocalAddr().String()) + if err != nil { + t.Fatal(err) + } + c2, err := net.ListenPacket("udp4", net.JoinHostPort("224.0.0.0", port)) // wildcard address with reusable port + if err != nil { + t.Fatal(err) + } + defer c2.Close() + + var ps [2]*ipv4.PacketConn + ps[0] = ipv4.NewPacketConn(c1) + ps[1] = ipv4.NewPacketConn(c2) + var mift []*net.Interface + + ift, err := net.Interfaces() + if err != nil { + t.Fatal(err) + } + for i, ifi := range ift { + if _, ok := nettest.IsMulticastCapable("ip4", &ifi); !ok { + continue + } + for _, p := range ps { + if err := p.JoinGroup(&ifi, gaddr); err != nil { + t.Fatal(err) + } + } + mift = append(mift, &ift[i]) + } + for _, ifi := range mift { + for _, p := range ps { + if err := p.LeaveGroup(ifi, gaddr); err != nil { + t.Fatal(err) + } + } + } + } +} + +func TestUDPPerInterfaceSinglePacketConnWithSingleGroupListener(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if testing.Short() { + t.Skip("to avoid external network") + } + + gaddr := net.IPAddr{IP: net.IPv4(224, 0, 0, 254)} // see RFC 4727 + type ml struct { + c *ipv4.PacketConn + ifi *net.Interface + } + var mlt []*ml + + ift, err := net.Interfaces() + if err != nil { + t.Fatal(err) + } + port := "0" + for i, ifi := range ift { + ip, ok := nettest.IsMulticastCapable("ip4", &ifi) + if !ok { + continue + } + c, err := net.ListenPacket("udp4", net.JoinHostPort(ip.String(), port)) // unicast address with non-reusable port + if err != nil { + // The listen may fail when the serivce is + // already in use, but it's fine because the + // purpose of this is not to test the + // bookkeeping of IP control block inside the + // kernel. + t.Log(err) + continue + } + defer c.Close() + if port == "0" { + _, port, err = net.SplitHostPort(c.LocalAddr().String()) + if err != nil { + t.Fatal(err) + } + } + p := ipv4.NewPacketConn(c) + if err := p.JoinGroup(&ifi, &gaddr); err != nil { + t.Fatal(err) + } + mlt = append(mlt, &ml{p, &ift[i]}) + } + for _, m := range mlt { + if err := m.c.LeaveGroup(m.ifi, &gaddr); err != nil { + t.Fatal(err) + } + } +} + +func TestIPSingleRawConnWithSingleGroupListener(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if testing.Short() { + t.Skip("to avoid external network") + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + + c, err := net.ListenPacket("ip4:icmp", "0.0.0.0") // wildcard address + if err != nil { + t.Fatal(err) + } + defer c.Close() + + r, err := ipv4.NewRawConn(c) + if err != nil { + t.Fatal(err) + } + gaddr := net.IPAddr{IP: net.IPv4(224, 0, 0, 254)} // see RFC 4727 + var mift []*net.Interface + + ift, err := net.Interfaces() + if err != nil { + t.Fatal(err) + } + for i, ifi := range ift { + if _, ok := nettest.IsMulticastCapable("ip4", &ifi); !ok { + continue + } + if err := r.JoinGroup(&ifi, &gaddr); err != nil { + t.Fatal(err) + } + mift = append(mift, &ift[i]) + } + for _, ifi := range mift { + if err := r.LeaveGroup(ifi, &gaddr); err != nil { + t.Fatal(err) + } + } +} + +func TestIPPerInterfaceSingleRawConnWithSingleGroupListener(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if testing.Short() { + t.Skip("to avoid external network") + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + + gaddr := net.IPAddr{IP: net.IPv4(224, 0, 0, 254)} // see RFC 4727 + type ml struct { + c *ipv4.RawConn + ifi *net.Interface + } + var mlt []*ml + + ift, err := net.Interfaces() + if err != nil { + t.Fatal(err) + } + for i, ifi := range ift { + ip, ok := nettest.IsMulticastCapable("ip4", &ifi) + if !ok { + continue + } + c, err := net.ListenPacket("ip4:253", ip.String()) // unicast address + if err != nil { + t.Fatal(err) + } + defer c.Close() + r, err := ipv4.NewRawConn(c) + if err != nil { + t.Fatal(err) + } + if err := r.JoinGroup(&ifi, &gaddr); err != nil { + t.Fatal(err) + } + mlt = append(mlt, &ml{r, &ift[i]}) + } + for _, m := range mlt { + if err := m.c.LeaveGroup(m.ifi, &gaddr); err != nil { + t.Fatal(err) + } + } +} diff --git a/api/vendor/golang.org/x/net/ipv4/multicastsockopt_test.go b/api/vendor/golang.org/x/net/ipv4/multicastsockopt_test.go new file mode 100644 index 0000000..f7efac2 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/multicastsockopt_test.go @@ -0,0 +1,195 @@ +// 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 ipv4_test + +import ( + "net" + "runtime" + "testing" + + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv4" +) + +var packetConnMulticastSocketOptionTests = []struct { + net, proto, addr string + grp, src net.Addr +}{ + {"udp4", "", "224.0.0.0:0", &net.UDPAddr{IP: net.IPv4(224, 0, 0, 249)}, nil}, // see RFC 4727 + {"ip4", ":icmp", "0.0.0.0", &net.IPAddr{IP: net.IPv4(224, 0, 0, 250)}, nil}, // see RFC 4727 + + {"udp4", "", "232.0.0.0:0", &net.UDPAddr{IP: net.IPv4(232, 0, 1, 249)}, &net.UDPAddr{IP: net.IPv4(127, 0, 0, 1)}}, // see RFC 5771 + {"ip4", ":icmp", "0.0.0.0", &net.IPAddr{IP: net.IPv4(232, 0, 1, 250)}, &net.UDPAddr{IP: net.IPv4(127, 0, 0, 1)}}, // see RFC 5771 +} + +func TestPacketConnMulticastSocketOptions(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9": + t.Skipf("not supported on %s", runtime.GOOS) + } + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagMulticast|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + m, ok := nettest.SupportsRawIPSocket() + for _, tt := range packetConnMulticastSocketOptionTests { + if tt.net == "ip4" && !ok { + t.Log(m) + continue + } + c, err := net.ListenPacket(tt.net+tt.proto, tt.addr) + if err != nil { + t.Fatal(err) + } + defer c.Close() + p := ipv4.NewPacketConn(c) + defer p.Close() + + if tt.src == nil { + testMulticastSocketOptions(t, p, ifi, tt.grp) + } else { + testSourceSpecificMulticastSocketOptions(t, p, ifi, tt.grp, tt.src) + } + } +} + +var rawConnMulticastSocketOptionTests = []struct { + grp, src net.Addr +}{ + {&net.IPAddr{IP: net.IPv4(224, 0, 0, 250)}, nil}, // see RFC 4727 + + {&net.IPAddr{IP: net.IPv4(232, 0, 1, 250)}, &net.IPAddr{IP: net.IPv4(127, 0, 0, 1)}}, // see RFC 5771 +} + +func TestRawConnMulticastSocketOptions(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9": + t.Skipf("not supported on %s", runtime.GOOS) + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagMulticast|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + for _, tt := range rawConnMulticastSocketOptionTests { + c, err := net.ListenPacket("ip4:icmp", "0.0.0.0") + if err != nil { + t.Fatal(err) + } + defer c.Close() + r, err := ipv4.NewRawConn(c) + if err != nil { + t.Fatal(err) + } + defer r.Close() + + if tt.src == nil { + testMulticastSocketOptions(t, r, ifi, tt.grp) + } else { + testSourceSpecificMulticastSocketOptions(t, r, ifi, tt.grp, tt.src) + } + } +} + +type testIPv4MulticastConn interface { + MulticastTTL() (int, error) + SetMulticastTTL(ttl int) error + MulticastLoopback() (bool, error) + SetMulticastLoopback(bool) error + JoinGroup(*net.Interface, net.Addr) error + LeaveGroup(*net.Interface, net.Addr) error + JoinSourceSpecificGroup(*net.Interface, net.Addr, net.Addr) error + LeaveSourceSpecificGroup(*net.Interface, net.Addr, net.Addr) error + ExcludeSourceSpecificGroup(*net.Interface, net.Addr, net.Addr) error + IncludeSourceSpecificGroup(*net.Interface, net.Addr, net.Addr) error +} + +func testMulticastSocketOptions(t *testing.T, c testIPv4MulticastConn, ifi *net.Interface, grp net.Addr) { + const ttl = 255 + if err := c.SetMulticastTTL(ttl); err != nil { + t.Error(err) + return + } + if v, err := c.MulticastTTL(); err != nil { + t.Error(err) + return + } else if v != ttl { + t.Errorf("got %v; want %v", v, ttl) + return + } + + for _, toggle := range []bool{true, false} { + if err := c.SetMulticastLoopback(toggle); err != nil { + t.Error(err) + return + } + if v, err := c.MulticastLoopback(); err != nil { + t.Error(err) + return + } else if v != toggle { + t.Errorf("got %v; want %v", v, toggle) + return + } + } + + if err := c.JoinGroup(ifi, grp); err != nil { + t.Error(err) + return + } + if err := c.LeaveGroup(ifi, grp); err != nil { + t.Error(err) + return + } +} + +func testSourceSpecificMulticastSocketOptions(t *testing.T, c testIPv4MulticastConn, ifi *net.Interface, grp, src net.Addr) { + // MCAST_JOIN_GROUP -> MCAST_BLOCK_SOURCE -> MCAST_UNBLOCK_SOURCE -> MCAST_LEAVE_GROUP + if err := c.JoinGroup(ifi, grp); err != nil { + t.Error(err) + return + } + if err := c.ExcludeSourceSpecificGroup(ifi, grp, src); err != nil { + switch runtime.GOOS { + case "freebsd", "linux": + default: // platforms that don't support IGMPv2/3 fail here + t.Logf("not supported on %s", runtime.GOOS) + return + } + t.Error(err) + return + } + if err := c.IncludeSourceSpecificGroup(ifi, grp, src); err != nil { + t.Error(err) + return + } + if err := c.LeaveGroup(ifi, grp); err != nil { + t.Error(err) + return + } + + // MCAST_JOIN_SOURCE_GROUP -> MCAST_LEAVE_SOURCE_GROUP + if err := c.JoinSourceSpecificGroup(ifi, grp, src); err != nil { + t.Error(err) + return + } + if err := c.LeaveSourceSpecificGroup(ifi, grp, src); err != nil { + t.Error(err) + return + } + + // MCAST_JOIN_SOURCE_GROUP -> MCAST_LEAVE_GROUP + if err := c.JoinSourceSpecificGroup(ifi, grp, src); err != nil { + t.Error(err) + return + } + if err := c.LeaveGroup(ifi, grp); err != nil { + t.Error(err) + return + } +} diff --git a/api/vendor/golang.org/x/net/ipv4/packet.go b/api/vendor/golang.org/x/net/ipv4/packet.go new file mode 100644 index 0000000..f00f5b0 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/packet.go @@ -0,0 +1,69 @@ +// 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 ipv4 + +import ( + "net" + "syscall" + + "golang.org/x/net/internal/socket" +) + +// BUG(mikio): On Windows, the ReadFrom and WriteTo methods of RawConn +// are not implemented. + +// A packetHandler represents the IPv4 datagram handler. +type packetHandler struct { + *net.IPConn + *socket.Conn + rawOpt +} + +func (c *packetHandler) ok() bool { return c != nil && c.IPConn != nil && c.Conn != nil } + +// ReadFrom reads an IPv4 datagram from the endpoint c, copying the +// datagram into b. It returns the received datagram as the IPv4 +// header h, the payload p and the control message cm. +func (c *packetHandler) ReadFrom(b []byte) (h *Header, p []byte, cm *ControlMessage, err error) { + if !c.ok() { + return nil, nil, nil, syscall.EINVAL + } + return c.readFrom(b) +} + +func slicePacket(b []byte) (h, p []byte, err error) { + if len(b) < HeaderLen { + return nil, nil, errHeaderTooShort + } + hdrlen := int(b[0]&0x0f) << 2 + return b[:hdrlen], b[hdrlen:], nil +} + +// WriteTo writes an IPv4 datagram through the endpoint c, copying the +// datagram from the IPv4 header h and the payload p. The control +// message cm allows the datagram path and the outgoing interface to be +// specified. Currently only Darwin and Linux support this. The cm +// may be nil if control of the outgoing datagram is not required. +// +// The IPv4 header h must contain appropriate fields that include: +// +// Version = +// Len = +// TOS = +// TotalLen = +// ID = platform sets an appropriate value if ID is zero +// FragOff = +// TTL = +// Protocol = +// Checksum = platform sets an appropriate value if Checksum is zero +// Src = platform sets an appropriate value if Src is nil +// Dst = +// Options = optional +func (c *packetHandler) WriteTo(h *Header, p []byte, cm *ControlMessage) error { + if !c.ok() { + return syscall.EINVAL + } + return c.writeTo(h, p, cm) +} diff --git a/api/vendor/golang.org/x/net/ipv4/packet_go1_8.go b/api/vendor/golang.org/x/net/ipv4/packet_go1_8.go new file mode 100644 index 0000000..b47d186 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/packet_go1_8.go @@ -0,0 +1,56 @@ +// 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. + +// +build !go1.9 + +package ipv4 + +import "net" + +func (c *packetHandler) readFrom(b []byte) (h *Header, p []byte, cm *ControlMessage, err error) { + c.rawOpt.RLock() + oob := NewControlMessage(c.rawOpt.cflags) + c.rawOpt.RUnlock() + n, nn, _, src, err := c.ReadMsgIP(b, oob) + if err != nil { + return nil, nil, nil, err + } + var hs []byte + if hs, p, err = slicePacket(b[:n]); err != nil { + return nil, nil, nil, err + } + if h, err = ParseHeader(hs); err != nil { + return nil, nil, nil, err + } + if nn > 0 { + cm = new(ControlMessage) + if err := cm.Parse(oob[:nn]); err != nil { + return nil, nil, nil, err + } + } + if src != nil && cm != nil { + cm.Src = src.IP + } + return +} + +func (c *packetHandler) writeTo(h *Header, p []byte, cm *ControlMessage) error { + oob := cm.Marshal() + wh, err := h.Marshal() + if err != nil { + return err + } + dst := new(net.IPAddr) + if cm != nil { + if ip := cm.Dst.To4(); ip != nil { + dst.IP = ip + } + } + if dst.IP == nil { + dst.IP = h.Dst + } + wh = append(wh, p...) + _, _, err = c.WriteMsgIP(wh, oob, dst) + return err +} diff --git a/api/vendor/golang.org/x/net/ipv4/packet_go1_9.go b/api/vendor/golang.org/x/net/ipv4/packet_go1_9.go new file mode 100644 index 0000000..082c36d --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/packet_go1_9.go @@ -0,0 +1,67 @@ +// 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. + +// +build go1.9 + +package ipv4 + +import ( + "net" + + "golang.org/x/net/internal/socket" +) + +func (c *packetHandler) readFrom(b []byte) (h *Header, p []byte, cm *ControlMessage, err error) { + c.rawOpt.RLock() + m := socket.Message{ + Buffers: [][]byte{b}, + OOB: NewControlMessage(c.rawOpt.cflags), + } + c.rawOpt.RUnlock() + if err := c.RecvMsg(&m, 0); err != nil { + return nil, nil, nil, &net.OpError{Op: "read", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Err: err} + } + var hs []byte + if hs, p, err = slicePacket(b[:m.N]); err != nil { + return nil, nil, nil, &net.OpError{Op: "read", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Err: err} + } + if h, err = ParseHeader(hs); err != nil { + return nil, nil, nil, &net.OpError{Op: "read", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Err: err} + } + if m.NN > 0 { + cm = new(ControlMessage) + if err := cm.Parse(m.OOB[:m.NN]); err != nil { + return nil, nil, nil, &net.OpError{Op: "read", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Err: err} + } + } + if src, ok := m.Addr.(*net.IPAddr); ok && cm != nil { + cm.Src = src.IP + } + return +} + +func (c *packetHandler) writeTo(h *Header, p []byte, cm *ControlMessage) error { + m := socket.Message{ + OOB: cm.Marshal(), + } + wh, err := h.Marshal() + if err != nil { + return err + } + m.Buffers = [][]byte{wh, p} + dst := new(net.IPAddr) + if cm != nil { + if ip := cm.Dst.To4(); ip != nil { + dst.IP = ip + } + } + if dst.IP == nil { + dst.IP = h.Dst + } + m.Addr = dst + if err := c.SendMsg(&m, 0); err != nil { + return &net.OpError{Op: "write", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Addr: opAddr(dst), Err: err} + } + return nil +} diff --git a/api/vendor/golang.org/x/net/ipv4/payload.go b/api/vendor/golang.org/x/net/ipv4/payload.go new file mode 100644 index 0000000..f95f811 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/payload.go @@ -0,0 +1,23 @@ +// 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 ipv4 + +import ( + "net" + + "golang.org/x/net/internal/socket" +) + +// BUG(mikio): On Windows, the ControlMessage for ReadFrom and WriteTo +// methods of PacketConn is not implemented. + +// A payloadHandler represents the IPv4 datagram payload handler. +type payloadHandler struct { + net.PacketConn + *socket.Conn + rawOpt +} + +func (c *payloadHandler) ok() bool { return c != nil && c.PacketConn != nil && c.Conn != nil } diff --git a/api/vendor/golang.org/x/net/ipv4/payload_cmsg.go b/api/vendor/golang.org/x/net/ipv4/payload_cmsg.go new file mode 100644 index 0000000..3f06d76 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/payload_cmsg.go @@ -0,0 +1,36 @@ +// 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. + +// +build !nacl,!plan9,!windows + +package ipv4 + +import ( + "net" + "syscall" +) + +// ReadFrom reads a payload of the received IPv4 datagram, from the +// endpoint c, copying the payload into b. It returns the number of +// bytes copied into b, the control message cm and the source address +// src of the received datagram. +func (c *payloadHandler) ReadFrom(b []byte) (n int, cm *ControlMessage, src net.Addr, err error) { + if !c.ok() { + return 0, nil, nil, syscall.EINVAL + } + return c.readFrom(b) +} + +// WriteTo writes a payload of the IPv4 datagram, to the destination +// address dst through the endpoint c, copying the payload from b. It +// returns the number of bytes written. The control message cm allows +// the datagram path and the outgoing interface to be specified. +// Currently only Darwin and Linux support this. The cm may be nil if +// control of the outgoing datagram is not required. +func (c *payloadHandler) WriteTo(b []byte, cm *ControlMessage, dst net.Addr) (n int, err error) { + if !c.ok() { + return 0, syscall.EINVAL + } + return c.writeTo(b, cm, dst) +} diff --git a/api/vendor/golang.org/x/net/ipv4/payload_cmsg_go1_8.go b/api/vendor/golang.org/x/net/ipv4/payload_cmsg_go1_8.go new file mode 100644 index 0000000..d26ccd9 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/payload_cmsg_go1_8.go @@ -0,0 +1,59 @@ +// 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. + +// +build !go1.9 +// +build !nacl,!plan9,!windows + +package ipv4 + +import "net" + +func (c *payloadHandler) readFrom(b []byte) (n int, cm *ControlMessage, src net.Addr, err error) { + c.rawOpt.RLock() + oob := NewControlMessage(c.rawOpt.cflags) + c.rawOpt.RUnlock() + var nn int + switch c := c.PacketConn.(type) { + case *net.UDPConn: + if n, nn, _, src, err = c.ReadMsgUDP(b, oob); err != nil { + return 0, nil, nil, err + } + case *net.IPConn: + nb := make([]byte, maxHeaderLen+len(b)) + if n, nn, _, src, err = c.ReadMsgIP(nb, oob); err != nil { + return 0, nil, nil, err + } + hdrlen := int(nb[0]&0x0f) << 2 + copy(b, nb[hdrlen:]) + n -= hdrlen + default: + return 0, nil, nil, &net.OpError{Op: "read", Net: c.LocalAddr().Network(), Source: c.LocalAddr(), Err: errInvalidConnType} + } + if nn > 0 { + cm = new(ControlMessage) + if err = cm.Parse(oob[:nn]); err != nil { + return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + } + if cm != nil { + cm.Src = netAddrToIP4(src) + } + return +} + +func (c *payloadHandler) writeTo(b []byte, cm *ControlMessage, dst net.Addr) (n int, err error) { + oob := cm.Marshal() + if dst == nil { + return 0, &net.OpError{Op: "write", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: errMissingAddress} + } + switch c := c.PacketConn.(type) { + case *net.UDPConn: + n, _, err = c.WriteMsgUDP(b, oob, dst.(*net.UDPAddr)) + case *net.IPConn: + n, _, err = c.WriteMsgIP(b, oob, dst.(*net.IPAddr)) + default: + return 0, &net.OpError{Op: "write", Net: c.LocalAddr().Network(), Source: c.LocalAddr(), Addr: opAddr(dst), Err: errInvalidConnType} + } + return +} diff --git a/api/vendor/golang.org/x/net/ipv4/payload_cmsg_go1_9.go b/api/vendor/golang.org/x/net/ipv4/payload_cmsg_go1_9.go new file mode 100644 index 0000000..2f19311 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/payload_cmsg_go1_9.go @@ -0,0 +1,67 @@ +// 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. + +// +build go1.9 +// +build !nacl,!plan9,!windows + +package ipv4 + +import ( + "net" + + "golang.org/x/net/internal/socket" +) + +func (c *payloadHandler) readFrom(b []byte) (int, *ControlMessage, net.Addr, error) { + c.rawOpt.RLock() + m := socket.Message{ + OOB: NewControlMessage(c.rawOpt.cflags), + } + c.rawOpt.RUnlock() + switch c.PacketConn.(type) { + case *net.UDPConn: + m.Buffers = [][]byte{b} + if err := c.RecvMsg(&m, 0); err != nil { + return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + case *net.IPConn: + h := make([]byte, HeaderLen) + m.Buffers = [][]byte{h, b} + if err := c.RecvMsg(&m, 0); err != nil { + return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + hdrlen := int(h[0]&0x0f) << 2 + if hdrlen > len(h) { + d := hdrlen - len(h) + copy(b, b[d:]) + m.N -= d + } else { + m.N -= hdrlen + } + default: + return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: errInvalidConnType} + } + var cm *ControlMessage + if m.NN > 0 { + cm = new(ControlMessage) + if err := cm.Parse(m.OOB[:m.NN]); err != nil { + return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + cm.Src = netAddrToIP4(m.Addr) + } + return m.N, cm, m.Addr, nil +} + +func (c *payloadHandler) writeTo(b []byte, cm *ControlMessage, dst net.Addr) (int, error) { + m := socket.Message{ + Buffers: [][]byte{b}, + OOB: cm.Marshal(), + Addr: dst, + } + err := c.SendMsg(&m, 0) + if err != nil { + err = &net.OpError{Op: "write", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Addr: opAddr(dst), Err: err} + } + return m.N, err +} diff --git a/api/vendor/golang.org/x/net/ipv4/payload_nocmsg.go b/api/vendor/golang.org/x/net/ipv4/payload_nocmsg.go new file mode 100644 index 0000000..3926de7 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/payload_nocmsg.go @@ -0,0 +1,42 @@ +// 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. + +// +build nacl plan9 windows + +package ipv4 + +import ( + "net" + "syscall" +) + +// ReadFrom reads a payload of the received IPv4 datagram, from the +// endpoint c, copying the payload into b. It returns the number of +// bytes copied into b, the control message cm and the source address +// src of the received datagram. +func (c *payloadHandler) ReadFrom(b []byte) (n int, cm *ControlMessage, src net.Addr, err error) { + if !c.ok() { + return 0, nil, nil, syscall.EINVAL + } + if n, src, err = c.PacketConn.ReadFrom(b); err != nil { + return 0, nil, nil, err + } + return +} + +// WriteTo writes a payload of the IPv4 datagram, to the destination +// address dst through the endpoint c, copying the payload from b. It +// returns the number of bytes written. The control message cm allows +// the datagram path and the outgoing interface to be specified. +// Currently only Darwin and Linux support this. The cm may be nil if +// control of the outgoing datagram is not required. +func (c *payloadHandler) WriteTo(b []byte, cm *ControlMessage, dst net.Addr) (n int, err error) { + if !c.ok() { + return 0, syscall.EINVAL + } + if dst == nil { + return 0, errMissingAddress + } + return c.PacketConn.WriteTo(b, dst) +} diff --git a/api/vendor/golang.org/x/net/ipv4/readwrite_go1_8_test.go b/api/vendor/golang.org/x/net/ipv4/readwrite_go1_8_test.go new file mode 100644 index 0000000..1cd926e --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/readwrite_go1_8_test.go @@ -0,0 +1,248 @@ +// 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. + +// +build !go1.9 + +package ipv4_test + +import ( + "bytes" + "fmt" + "net" + "runtime" + "strings" + "sync" + "testing" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv4" +) + +func BenchmarkPacketConnReadWriteUnicast(b *testing.B) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + b.Skipf("not supported on %s", runtime.GOOS) + } + + payload := []byte("HELLO-R-U-THERE") + iph, err := (&ipv4.Header{ + Version: ipv4.Version, + Len: ipv4.HeaderLen, + TotalLen: ipv4.HeaderLen + len(payload), + TTL: 1, + Protocol: iana.ProtocolReserved, + Src: net.IPv4(192, 0, 2, 1), + Dst: net.IPv4(192, 0, 2, 254), + }).Marshal() + if err != nil { + b.Fatal(err) + } + greh := []byte{0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00} + datagram := append(greh, append(iph, payload...)...) + bb := make([]byte, 128) + cm := ipv4.ControlMessage{ + Src: net.IPv4(127, 0, 0, 1), + } + if ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback); ifi != nil { + cm.IfIndex = ifi.Index + } + + b.Run("UDP", func(b *testing.B) { + c, err := nettest.NewLocalPacketListener("udp4") + if err != nil { + b.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + p := ipv4.NewPacketConn(c) + dst := c.LocalAddr() + cf := ipv4.FlagTTL | ipv4.FlagInterface + if err := p.SetControlMessage(cf, true); err != nil { + b.Fatal(err) + } + b.Run("Net", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := c.WriteTo(payload, dst); err != nil { + b.Fatal(err) + } + if _, _, err := c.ReadFrom(bb); err != nil { + b.Fatal(err) + } + } + }) + b.Run("ToFrom", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := p.WriteTo(payload, &cm, dst); err != nil { + b.Fatal(err) + } + if _, _, _, err := p.ReadFrom(bb); err != nil { + b.Fatal(err) + } + } + }) + }) + b.Run("IP", func(b *testing.B) { + switch runtime.GOOS { + case "netbsd": + b.Skip("need to configure gre on netbsd") + case "openbsd": + b.Skip("net.inet.gre.allow=0 by default on openbsd") + } + + c, err := net.ListenPacket(fmt.Sprintf("ip4:%d", iana.ProtocolGRE), "127.0.0.1") + if err != nil { + b.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + p := ipv4.NewPacketConn(c) + dst := c.LocalAddr() + cf := ipv4.FlagTTL | ipv4.FlagInterface + if err := p.SetControlMessage(cf, true); err != nil { + b.Fatal(err) + } + b.Run("Net", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := c.WriteTo(datagram, dst); err != nil { + b.Fatal(err) + } + if _, _, err := c.ReadFrom(bb); err != nil { + b.Fatal(err) + } + } + }) + b.Run("ToFrom", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := p.WriteTo(datagram, &cm, dst); err != nil { + b.Fatal(err) + } + if _, _, _, err := p.ReadFrom(bb); err != nil { + b.Fatal(err) + } + } + }) + }) +} + +func TestPacketConnConcurrentReadWriteUnicast(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + + payload := []byte("HELLO-R-U-THERE") + iph, err := (&ipv4.Header{ + Version: ipv4.Version, + Len: ipv4.HeaderLen, + TotalLen: ipv4.HeaderLen + len(payload), + TTL: 1, + Protocol: iana.ProtocolReserved, + Src: net.IPv4(192, 0, 2, 1), + Dst: net.IPv4(192, 0, 2, 254), + }).Marshal() + if err != nil { + t.Fatal(err) + } + greh := []byte{0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00} + datagram := append(greh, append(iph, payload...)...) + + t.Run("UDP", func(t *testing.T) { + c, err := nettest.NewLocalPacketListener("udp4") + if err != nil { + t.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + p := ipv4.NewPacketConn(c) + t.Run("ToFrom", func(t *testing.T) { + testPacketConnConcurrentReadWriteUnicast(t, p, payload, c.LocalAddr()) + }) + }) + t.Run("IP", func(t *testing.T) { + switch runtime.GOOS { + case "netbsd": + t.Skip("need to configure gre on netbsd") + case "openbsd": + t.Skip("net.inet.gre.allow=0 by default on openbsd") + } + + c, err := net.ListenPacket(fmt.Sprintf("ip4:%d", iana.ProtocolGRE), "127.0.0.1") + if err != nil { + t.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + p := ipv4.NewPacketConn(c) + t.Run("ToFrom", func(t *testing.T) { + testPacketConnConcurrentReadWriteUnicast(t, p, datagram, c.LocalAddr()) + }) + }) +} + +func testPacketConnConcurrentReadWriteUnicast(t *testing.T, p *ipv4.PacketConn, data []byte, dst net.Addr) { + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback) + cf := ipv4.FlagTTL | ipv4.FlagSrc | ipv4.FlagDst | ipv4.FlagInterface + + if err := p.SetControlMessage(cf, true); err != nil { // probe before test + if nettest.ProtocolNotSupported(err) { + t.Skipf("not supported on %s", runtime.GOOS) + } + t.Fatal(err) + } + + var wg sync.WaitGroup + reader := func() { + defer wg.Done() + b := make([]byte, 128) + n, cm, _, err := p.ReadFrom(b) + if err != nil { + t.Error(err) + return + } + if !bytes.Equal(b[:n], data) { + t.Errorf("got %#v; want %#v", b[:n], data) + return + } + s := cm.String() + if strings.Contains(s, ",") { + t.Errorf("should be space-separated values: %s", s) + return + } + } + writer := func(toggle bool) { + defer wg.Done() + cm := ipv4.ControlMessage{ + Src: net.IPv4(127, 0, 0, 1), + } + if ifi != nil { + cm.IfIndex = ifi.Index + } + if err := p.SetControlMessage(cf, toggle); err != nil { + t.Error(err) + return + } + n, err := p.WriteTo(data, &cm, dst) + if err != nil { + t.Error(err) + return + } + if n != len(data) { + t.Errorf("got %d; want %d", n, len(data)) + return + } + } + + const N = 10 + wg.Add(N) + for i := 0; i < N; i++ { + go reader() + } + wg.Add(2 * N) + for i := 0; i < 2*N; i++ { + go writer(i%2 != 0) + + } + wg.Add(N) + for i := 0; i < N; i++ { + go reader() + } + wg.Wait() +} diff --git a/api/vendor/golang.org/x/net/ipv4/readwrite_go1_9_test.go b/api/vendor/golang.org/x/net/ipv4/readwrite_go1_9_test.go new file mode 100644 index 0000000..365de02 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/readwrite_go1_9_test.go @@ -0,0 +1,388 @@ +// 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. + +// +build go1.9 + +package ipv4_test + +import ( + "bytes" + "fmt" + "net" + "runtime" + "strings" + "sync" + "testing" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv4" +) + +func BenchmarkPacketConnReadWriteUnicast(b *testing.B) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + b.Skipf("not supported on %s", runtime.GOOS) + } + + payload := []byte("HELLO-R-U-THERE") + iph, err := (&ipv4.Header{ + Version: ipv4.Version, + Len: ipv4.HeaderLen, + TotalLen: ipv4.HeaderLen + len(payload), + TTL: 1, + Protocol: iana.ProtocolReserved, + Src: net.IPv4(192, 0, 2, 1), + Dst: net.IPv4(192, 0, 2, 254), + }).Marshal() + if err != nil { + b.Fatal(err) + } + greh := []byte{0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00} + datagram := append(greh, append(iph, payload...)...) + bb := make([]byte, 128) + cm := ipv4.ControlMessage{ + Src: net.IPv4(127, 0, 0, 1), + } + if ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback); ifi != nil { + cm.IfIndex = ifi.Index + } + + b.Run("UDP", func(b *testing.B) { + c, err := nettest.NewLocalPacketListener("udp4") + if err != nil { + b.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + p := ipv4.NewPacketConn(c) + dst := c.LocalAddr() + cf := ipv4.FlagTTL | ipv4.FlagInterface + if err := p.SetControlMessage(cf, true); err != nil { + b.Fatal(err) + } + wms := []ipv4.Message{ + { + Buffers: [][]byte{payload}, + Addr: dst, + OOB: cm.Marshal(), + }, + } + rms := []ipv4.Message{ + { + Buffers: [][]byte{bb}, + OOB: ipv4.NewControlMessage(cf), + }, + } + b.Run("Net", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := c.WriteTo(payload, dst); err != nil { + b.Fatal(err) + } + if _, _, err := c.ReadFrom(bb); err != nil { + b.Fatal(err) + } + } + }) + b.Run("ToFrom", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := p.WriteTo(payload, &cm, dst); err != nil { + b.Fatal(err) + } + if _, _, _, err := p.ReadFrom(bb); err != nil { + b.Fatal(err) + } + } + }) + b.Run("Batch", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := p.WriteBatch(wms, 0); err != nil { + b.Fatal(err) + } + if _, err := p.ReadBatch(rms, 0); err != nil { + b.Fatal(err) + } + } + }) + }) + b.Run("IP", func(b *testing.B) { + switch runtime.GOOS { + case "netbsd": + b.Skip("need to configure gre on netbsd") + case "openbsd": + b.Skip("net.inet.gre.allow=0 by default on openbsd") + } + + c, err := net.ListenPacket(fmt.Sprintf("ip4:%d", iana.ProtocolGRE), "127.0.0.1") + if err != nil { + b.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + p := ipv4.NewPacketConn(c) + dst := c.LocalAddr() + cf := ipv4.FlagTTL | ipv4.FlagInterface + if err := p.SetControlMessage(cf, true); err != nil { + b.Fatal(err) + } + wms := []ipv4.Message{ + { + Buffers: [][]byte{datagram}, + Addr: dst, + OOB: cm.Marshal(), + }, + } + rms := []ipv4.Message{ + { + Buffers: [][]byte{bb}, + OOB: ipv4.NewControlMessage(cf), + }, + } + b.Run("Net", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := c.WriteTo(datagram, dst); err != nil { + b.Fatal(err) + } + if _, _, err := c.ReadFrom(bb); err != nil { + b.Fatal(err) + } + } + }) + b.Run("ToFrom", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := p.WriteTo(datagram, &cm, dst); err != nil { + b.Fatal(err) + } + if _, _, _, err := p.ReadFrom(bb); err != nil { + b.Fatal(err) + } + } + }) + b.Run("Batch", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := p.WriteBatch(wms, 0); err != nil { + b.Fatal(err) + } + if _, err := p.ReadBatch(rms, 0); err != nil { + b.Fatal(err) + } + } + }) + }) +} + +func TestPacketConnConcurrentReadWriteUnicast(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + + payload := []byte("HELLO-R-U-THERE") + iph, err := (&ipv4.Header{ + Version: ipv4.Version, + Len: ipv4.HeaderLen, + TotalLen: ipv4.HeaderLen + len(payload), + TTL: 1, + Protocol: iana.ProtocolReserved, + Src: net.IPv4(192, 0, 2, 1), + Dst: net.IPv4(192, 0, 2, 254), + }).Marshal() + if err != nil { + t.Fatal(err) + } + greh := []byte{0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00} + datagram := append(greh, append(iph, payload...)...) + + t.Run("UDP", func(t *testing.T) { + c, err := nettest.NewLocalPacketListener("udp4") + if err != nil { + t.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + p := ipv4.NewPacketConn(c) + t.Run("ToFrom", func(t *testing.T) { + testPacketConnConcurrentReadWriteUnicast(t, p, payload, c.LocalAddr(), false) + }) + t.Run("Batch", func(t *testing.T) { + testPacketConnConcurrentReadWriteUnicast(t, p, payload, c.LocalAddr(), true) + }) + }) + t.Run("IP", func(t *testing.T) { + switch runtime.GOOS { + case "netbsd": + t.Skip("need to configure gre on netbsd") + case "openbsd": + t.Skip("net.inet.gre.allow=0 by default on openbsd") + } + + c, err := net.ListenPacket(fmt.Sprintf("ip4:%d", iana.ProtocolGRE), "127.0.0.1") + if err != nil { + t.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + p := ipv4.NewPacketConn(c) + t.Run("ToFrom", func(t *testing.T) { + testPacketConnConcurrentReadWriteUnicast(t, p, datagram, c.LocalAddr(), false) + }) + t.Run("Batch", func(t *testing.T) { + testPacketConnConcurrentReadWriteUnicast(t, p, datagram, c.LocalAddr(), true) + }) + }) +} + +func testPacketConnConcurrentReadWriteUnicast(t *testing.T, p *ipv4.PacketConn, data []byte, dst net.Addr, batch bool) { + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback) + cf := ipv4.FlagTTL | ipv4.FlagSrc | ipv4.FlagDst | ipv4.FlagInterface + + if err := p.SetControlMessage(cf, true); err != nil { // probe before test + if nettest.ProtocolNotSupported(err) { + t.Skipf("not supported on %s", runtime.GOOS) + } + t.Fatal(err) + } + + var wg sync.WaitGroup + reader := func() { + defer wg.Done() + b := make([]byte, 128) + n, cm, _, err := p.ReadFrom(b) + if err != nil { + t.Error(err) + return + } + if !bytes.Equal(b[:n], data) { + t.Errorf("got %#v; want %#v", b[:n], data) + return + } + s := cm.String() + if strings.Contains(s, ",") { + t.Errorf("should be space-separated values: %s", s) + return + } + } + batchReader := func() { + defer wg.Done() + ms := []ipv4.Message{ + { + Buffers: [][]byte{make([]byte, 128)}, + OOB: ipv4.NewControlMessage(cf), + }, + } + n, err := p.ReadBatch(ms, 0) + if err != nil { + t.Error(err) + return + } + if n != len(ms) { + t.Errorf("got %d; want %d", n, len(ms)) + return + } + var cm ipv4.ControlMessage + if err := cm.Parse(ms[0].OOB[:ms[0].NN]); err != nil { + t.Error(err) + return + } + var b []byte + if _, ok := dst.(*net.IPAddr); ok { + var h ipv4.Header + if err := h.Parse(ms[0].Buffers[0][:ms[0].N]); err != nil { + t.Error(err) + return + } + b = ms[0].Buffers[0][h.Len:ms[0].N] + } else { + b = ms[0].Buffers[0][:ms[0].N] + } + if !bytes.Equal(b, data) { + t.Errorf("got %#v; want %#v", b, data) + return + } + s := cm.String() + if strings.Contains(s, ",") { + t.Errorf("should be space-separated values: %s", s) + return + } + } + writer := func(toggle bool) { + defer wg.Done() + cm := ipv4.ControlMessage{ + Src: net.IPv4(127, 0, 0, 1), + } + if ifi != nil { + cm.IfIndex = ifi.Index + } + if err := p.SetControlMessage(cf, toggle); err != nil { + t.Error(err) + return + } + n, err := p.WriteTo(data, &cm, dst) + if err != nil { + t.Error(err) + return + } + if n != len(data) { + t.Errorf("got %d; want %d", n, len(data)) + return + } + } + batchWriter := func(toggle bool) { + defer wg.Done() + cm := ipv4.ControlMessage{ + Src: net.IPv4(127, 0, 0, 1), + } + if ifi != nil { + cm.IfIndex = ifi.Index + } + if err := p.SetControlMessage(cf, toggle); err != nil { + t.Error(err) + return + } + ms := []ipv4.Message{ + { + Buffers: [][]byte{data}, + OOB: cm.Marshal(), + Addr: dst, + }, + } + n, err := p.WriteBatch(ms, 0) + if err != nil { + t.Error(err) + return + } + if n != len(ms) { + t.Errorf("got %d; want %d", n, len(ms)) + return + } + if ms[0].N != len(data) { + t.Errorf("got %d; want %d", ms[0].N, len(data)) + return + } + } + + const N = 10 + wg.Add(N) + for i := 0; i < N; i++ { + if batch { + go batchReader() + } else { + go reader() + } + } + wg.Add(2 * N) + for i := 0; i < 2*N; i++ { + if batch { + go batchWriter(i%2 != 0) + } else { + go writer(i%2 != 0) + } + + } + wg.Add(N) + for i := 0; i < N; i++ { + if batch { + go batchReader() + } else { + go reader() + } + } + wg.Wait() +} diff --git a/api/vendor/golang.org/x/net/ipv4/readwrite_test.go b/api/vendor/golang.org/x/net/ipv4/readwrite_test.go new file mode 100644 index 0000000..3896a8a --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/readwrite_test.go @@ -0,0 +1,140 @@ +// 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 ipv4_test + +import ( + "bytes" + "net" + "runtime" + "strings" + "sync" + "testing" + + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv4" +) + +func BenchmarkReadWriteUnicast(b *testing.B) { + c, err := nettest.NewLocalPacketListener("udp4") + if err != nil { + b.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + + dst := c.LocalAddr() + wb, rb := []byte("HELLO-R-U-THERE"), make([]byte, 128) + + b.Run("NetUDP", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := c.WriteTo(wb, dst); err != nil { + b.Fatal(err) + } + if _, _, err := c.ReadFrom(rb); err != nil { + b.Fatal(err) + } + } + }) + b.Run("IPv4UDP", func(b *testing.B) { + p := ipv4.NewPacketConn(c) + cf := ipv4.FlagTTL | ipv4.FlagInterface + if err := p.SetControlMessage(cf, true); err != nil { + b.Fatal(err) + } + cm := ipv4.ControlMessage{TTL: 1} + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback) + if ifi != nil { + cm.IfIndex = ifi.Index + } + + for i := 0; i < b.N; i++ { + if _, err := p.WriteTo(wb, &cm, dst); err != nil { + b.Fatal(err) + } + if _, _, _, err := p.ReadFrom(rb); err != nil { + b.Fatal(err) + } + } + }) +} + +func TestPacketConnConcurrentReadWriteUnicastUDP(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + + c, err := nettest.NewLocalPacketListener("udp4") + if err != nil { + t.Fatal(err) + } + defer c.Close() + p := ipv4.NewPacketConn(c) + defer p.Close() + + dst := c.LocalAddr() + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback) + cf := ipv4.FlagTTL | ipv4.FlagSrc | ipv4.FlagDst | ipv4.FlagInterface + wb := []byte("HELLO-R-U-THERE") + + if err := p.SetControlMessage(cf, true); err != nil { // probe before test + if nettest.ProtocolNotSupported(err) { + t.Skipf("not supported on %s", runtime.GOOS) + } + t.Fatal(err) + } + + var wg sync.WaitGroup + reader := func() { + defer wg.Done() + rb := make([]byte, 128) + if n, cm, _, err := p.ReadFrom(rb); err != nil { + t.Error(err) + return + } else if !bytes.Equal(rb[:n], wb) { + t.Errorf("got %v; want %v", rb[:n], wb) + return + } else { + s := cm.String() + if strings.Contains(s, ",") { + t.Errorf("should be space-separated values: %s", s) + } + } + } + writer := func(toggle bool) { + defer wg.Done() + cm := ipv4.ControlMessage{ + Src: net.IPv4(127, 0, 0, 1), + } + if ifi != nil { + cm.IfIndex = ifi.Index + } + if err := p.SetControlMessage(cf, toggle); err != nil { + t.Error(err) + return + } + if n, err := p.WriteTo(wb, &cm, dst); err != nil { + t.Error(err) + return + } else if n != len(wb) { + t.Errorf("got %d; want %d", n, len(wb)) + return + } + } + + const N = 10 + wg.Add(N) + for i := 0; i < N; i++ { + go reader() + } + wg.Add(2 * N) + for i := 0; i < 2*N; i++ { + go writer(i%2 != 0) + } + wg.Add(N) + for i := 0; i < N; i++ { + go reader() + } + wg.Wait() +} diff --git a/api/vendor/golang.org/x/net/ipv4/sockopt.go b/api/vendor/golang.org/x/net/ipv4/sockopt.go new file mode 100644 index 0000000..22e90c0 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/sockopt.go @@ -0,0 +1,44 @@ +// 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 ipv4 + +import "golang.org/x/net/internal/socket" + +// Sticky socket options +const ( + ssoTOS = iota // header field for unicast packet + ssoTTL // header field for unicast packet + ssoMulticastTTL // header field for multicast packet + ssoMulticastInterface // outbound interface for multicast packet + ssoMulticastLoopback // loopback for multicast packet + ssoReceiveTTL // header field on received packet + ssoReceiveDst // header field on received packet + ssoReceiveInterface // inbound interface on received packet + ssoPacketInfo // incbound or outbound packet path + ssoHeaderPrepend // ipv4 header prepend + ssoStripHeader // strip ipv4 header + ssoICMPFilter // icmp filter + ssoJoinGroup // any-source multicast + ssoLeaveGroup // any-source multicast + ssoJoinSourceGroup // source-specific multicast + ssoLeaveSourceGroup // source-specific multicast + ssoBlockSourceGroup // any-source or source-specific multicast + ssoUnblockSourceGroup // any-source or source-specific multicast + ssoAttachFilter // attach BPF for filtering inbound traffic +) + +// Sticky socket option value types +const ( + ssoTypeIPMreq = iota + 1 + ssoTypeIPMreqn + ssoTypeGroupReq + ssoTypeGroupSourceReq +) + +// A sockOpt represents a binding for sticky socket option. +type sockOpt struct { + socket.Option + typ int // hint for option value type; optional +} diff --git a/api/vendor/golang.org/x/net/ipv4/sockopt_posix.go b/api/vendor/golang.org/x/net/ipv4/sockopt_posix.go new file mode 100644 index 0000000..e96955b --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/sockopt_posix.go @@ -0,0 +1,71 @@ +// 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows + +package ipv4 + +import ( + "net" + "unsafe" + + "golang.org/x/net/bpf" + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) getMulticastInterface(c *socket.Conn) (*net.Interface, error) { + switch so.typ { + case ssoTypeIPMreqn: + return so.getIPMreqn(c) + default: + return so.getMulticastIf(c) + } +} + +func (so *sockOpt) setMulticastInterface(c *socket.Conn, ifi *net.Interface) error { + switch so.typ { + case ssoTypeIPMreqn: + return so.setIPMreqn(c, ifi, nil) + default: + return so.setMulticastIf(c, ifi) + } +} + +func (so *sockOpt) getICMPFilter(c *socket.Conn) (*ICMPFilter, error) { + b := make([]byte, so.Len) + n, err := so.Get(c, b) + if err != nil { + return nil, err + } + if n != sizeofICMPFilter { + return nil, errOpNoSupport + } + return (*ICMPFilter)(unsafe.Pointer(&b[0])), nil +} + +func (so *sockOpt) setICMPFilter(c *socket.Conn, f *ICMPFilter) error { + b := (*[sizeofICMPFilter]byte)(unsafe.Pointer(f))[:sizeofICMPFilter] + return so.Set(c, b) +} + +func (so *sockOpt) setGroup(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + switch so.typ { + case ssoTypeIPMreq: + return so.setIPMreq(c, ifi, grp) + case ssoTypeIPMreqn: + return so.setIPMreqn(c, ifi, grp) + case ssoTypeGroupReq: + return so.setGroupReq(c, ifi, grp) + default: + return errOpNoSupport + } +} + +func (so *sockOpt) setSourceGroup(c *socket.Conn, ifi *net.Interface, grp, src net.IP) error { + return so.setGroupSourceReq(c, ifi, grp, src) +} + +func (so *sockOpt) setBPF(c *socket.Conn, f []bpf.RawInstruction) error { + return so.setAttachFilter(c, f) +} diff --git a/api/vendor/golang.org/x/net/ipv4/sockopt_stub.go b/api/vendor/golang.org/x/net/ipv4/sockopt_stub.go new file mode 100644 index 0000000..23249b7 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/sockopt_stub.go @@ -0,0 +1,42 @@ +// 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. + +// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows + +package ipv4 + +import ( + "net" + + "golang.org/x/net/bpf" + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) getMulticastInterface(c *socket.Conn) (*net.Interface, error) { + return nil, errOpNoSupport +} + +func (so *sockOpt) setMulticastInterface(c *socket.Conn, ifi *net.Interface) error { + return errOpNoSupport +} + +func (so *sockOpt) getICMPFilter(c *socket.Conn) (*ICMPFilter, error) { + return nil, errOpNoSupport +} + +func (so *sockOpt) setICMPFilter(c *socket.Conn, f *ICMPFilter) error { + return errOpNoSupport +} + +func (so *sockOpt) setGroup(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + return errOpNoSupport +} + +func (so *sockOpt) setSourceGroup(c *socket.Conn, ifi *net.Interface, grp, src net.IP) error { + return errOpNoSupport +} + +func (so *sockOpt) setBPF(c *socket.Conn, f []bpf.RawInstruction) error { + return errOpNoSupport +} diff --git a/api/vendor/golang.org/x/net/ipv4/sys_asmreq.go b/api/vendor/golang.org/x/net/ipv4/sys_asmreq.go new file mode 100644 index 0000000..0388cba --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/sys_asmreq.go @@ -0,0 +1,119 @@ +// 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. + +// +build darwin dragonfly freebsd netbsd openbsd solaris windows + +package ipv4 + +import ( + "net" + "unsafe" + + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) setIPMreq(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + mreq := ipMreq{Multiaddr: [4]byte{grp[0], grp[1], grp[2], grp[3]}} + if err := setIPMreqInterface(&mreq, ifi); err != nil { + return err + } + b := (*[sizeofIPMreq]byte)(unsafe.Pointer(&mreq))[:sizeofIPMreq] + return so.Set(c, b) +} + +func (so *sockOpt) getMulticastIf(c *socket.Conn) (*net.Interface, error) { + var b [4]byte + if _, err := so.Get(c, b[:]); err != nil { + return nil, err + } + ifi, err := netIP4ToInterface(net.IPv4(b[0], b[1], b[2], b[3])) + if err != nil { + return nil, err + } + return ifi, nil +} + +func (so *sockOpt) setMulticastIf(c *socket.Conn, ifi *net.Interface) error { + ip, err := netInterfaceToIP4(ifi) + if err != nil { + return err + } + var b [4]byte + copy(b[:], ip) + return so.Set(c, b[:]) +} + +func setIPMreqInterface(mreq *ipMreq, ifi *net.Interface) error { + if ifi == nil { + return nil + } + ifat, err := ifi.Addrs() + if err != nil { + return err + } + for _, ifa := range ifat { + switch ifa := ifa.(type) { + case *net.IPAddr: + if ip := ifa.IP.To4(); ip != nil { + copy(mreq.Interface[:], ip) + return nil + } + case *net.IPNet: + if ip := ifa.IP.To4(); ip != nil { + copy(mreq.Interface[:], ip) + return nil + } + } + } + return errNoSuchInterface +} + +func netIP4ToInterface(ip net.IP) (*net.Interface, error) { + ift, err := net.Interfaces() + if err != nil { + return nil, err + } + for _, ifi := range ift { + ifat, err := ifi.Addrs() + if err != nil { + return nil, err + } + for _, ifa := range ifat { + switch ifa := ifa.(type) { + case *net.IPAddr: + if ip.Equal(ifa.IP) { + return &ifi, nil + } + case *net.IPNet: + if ip.Equal(ifa.IP) { + return &ifi, nil + } + } + } + } + return nil, errNoSuchInterface +} + +func netInterfaceToIP4(ifi *net.Interface) (net.IP, error) { + if ifi == nil { + return net.IPv4zero.To4(), nil + } + ifat, err := ifi.Addrs() + if err != nil { + return nil, err + } + for _, ifa := range ifat { + switch ifa := ifa.(type) { + case *net.IPAddr: + if ip := ifa.IP.To4(); ip != nil { + return ip, nil + } + case *net.IPNet: + if ip := ifa.IP.To4(); ip != nil { + return ip, nil + } + } + } + return nil, errNoSuchInterface +} diff --git a/api/vendor/golang.org/x/net/ipv4/sys_asmreq_stub.go b/api/vendor/golang.org/x/net/ipv4/sys_asmreq_stub.go new file mode 100644 index 0000000..f391920 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/sys_asmreq_stub.go @@ -0,0 +1,25 @@ +// 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. + +// +build !darwin,!dragonfly,!freebsd,!netbsd,!openbsd,!solaris,!windows + +package ipv4 + +import ( + "net" + + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) setIPMreq(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + return errOpNoSupport +} + +func (so *sockOpt) getMulticastIf(c *socket.Conn) (*net.Interface, error) { + return nil, errOpNoSupport +} + +func (so *sockOpt) setMulticastIf(c *socket.Conn, ifi *net.Interface) error { + return errOpNoSupport +} diff --git a/api/vendor/golang.org/x/net/ipv4/sys_asmreqn.go b/api/vendor/golang.org/x/net/ipv4/sys_asmreqn.go new file mode 100644 index 0000000..1f24f69 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/sys_asmreqn.go @@ -0,0 +1,42 @@ +// 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. + +// +build darwin freebsd linux + +package ipv4 + +import ( + "net" + "unsafe" + + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) getIPMreqn(c *socket.Conn) (*net.Interface, error) { + b := make([]byte, so.Len) + if _, err := so.Get(c, b); err != nil { + return nil, err + } + mreqn := (*ipMreqn)(unsafe.Pointer(&b[0])) + if mreqn.Ifindex == 0 { + return nil, nil + } + ifi, err := net.InterfaceByIndex(int(mreqn.Ifindex)) + if err != nil { + return nil, err + } + return ifi, nil +} + +func (so *sockOpt) setIPMreqn(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + var mreqn ipMreqn + if ifi != nil { + mreqn.Ifindex = int32(ifi.Index) + } + if grp != nil { + mreqn.Multiaddr = [4]byte{grp[0], grp[1], grp[2], grp[3]} + } + b := (*[sizeofIPMreqn]byte)(unsafe.Pointer(&mreqn))[:sizeofIPMreqn] + return so.Set(c, b) +} diff --git a/api/vendor/golang.org/x/net/ipv4/sys_asmreqn_stub.go b/api/vendor/golang.org/x/net/ipv4/sys_asmreqn_stub.go new file mode 100644 index 0000000..0711d3d --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/sys_asmreqn_stub.go @@ -0,0 +1,21 @@ +// 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. + +// +build !darwin,!freebsd,!linux + +package ipv4 + +import ( + "net" + + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) getIPMreqn(c *socket.Conn) (*net.Interface, error) { + return nil, errOpNoSupport +} + +func (so *sockOpt) setIPMreqn(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + return errOpNoSupport +} diff --git a/api/vendor/golang.org/x/net/ipv4/sys_bpf.go b/api/vendor/golang.org/x/net/ipv4/sys_bpf.go new file mode 100644 index 0000000..9f30b73 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/sys_bpf.go @@ -0,0 +1,23 @@ +// 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. + +// +build linux + +package ipv4 + +import ( + "unsafe" + + "golang.org/x/net/bpf" + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) setAttachFilter(c *socket.Conn, f []bpf.RawInstruction) error { + prog := sockFProg{ + Len: uint16(len(f)), + Filter: (*sockFilter)(unsafe.Pointer(&f[0])), + } + b := (*[sizeofSockFprog]byte)(unsafe.Pointer(&prog))[:sizeofSockFprog] + return so.Set(c, b) +} diff --git a/api/vendor/golang.org/x/net/ipv4/sys_bpf_stub.go b/api/vendor/golang.org/x/net/ipv4/sys_bpf_stub.go new file mode 100644 index 0000000..9a21320 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/sys_bpf_stub.go @@ -0,0 +1,16 @@ +// 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. + +// +build !linux + +package ipv4 + +import ( + "golang.org/x/net/bpf" + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) setAttachFilter(c *socket.Conn, f []bpf.RawInstruction) error { + return errOpNoSupport +} diff --git a/api/vendor/golang.org/x/net/ipv4/sys_bsd.go b/api/vendor/golang.org/x/net/ipv4/sys_bsd.go new file mode 100644 index 0000000..58256dd --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/sys_bsd.go @@ -0,0 +1,37 @@ +// 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. + +// +build netbsd openbsd + +package ipv4 + +import ( + "net" + "syscall" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTTL: {sysIP_RECVTTL, 1, marshalTTL, parseTTL}, + ctlDst: {sysIP_RECVDSTADDR, net.IPv4len, marshalDst, parseDst}, + ctlInterface: {sysIP_RECVIF, syscall.SizeofSockaddrDatalink, marshalInterface, parseInterface}, + } + + sockOpts = map[int]*sockOpt{ + ssoTOS: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TOS, Len: 4}}, + ssoTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TTL, Len: 4}}, + ssoMulticastTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_TTL, Len: 1}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_IF, Len: 4}}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_LOOP, Len: 1}}, + ssoReceiveTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVTTL, Len: 4}}, + ssoReceiveDst: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVDSTADDR, Len: 4}}, + ssoReceiveInterface: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVIF, Len: 4}}, + ssoHeaderPrepend: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_HDRINCL, Len: 4}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_ADD_MEMBERSHIP, Len: sizeofIPMreq}, typ: ssoTypeIPMreq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_DROP_MEMBERSHIP, Len: sizeofIPMreq}, typ: ssoTypeIPMreq}, + } +) diff --git a/api/vendor/golang.org/x/net/ipv4/sys_darwin.go b/api/vendor/golang.org/x/net/ipv4/sys_darwin.go new file mode 100644 index 0000000..e8fb191 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/sys_darwin.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 ipv4 + +import ( + "net" + "strconv" + "strings" + "syscall" + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTTL: {sysIP_RECVTTL, 1, marshalTTL, parseTTL}, + ctlDst: {sysIP_RECVDSTADDR, net.IPv4len, marshalDst, parseDst}, + ctlInterface: {sysIP_RECVIF, syscall.SizeofSockaddrDatalink, marshalInterface, parseInterface}, + } + + sockOpts = map[int]*sockOpt{ + ssoTOS: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TOS, Len: 4}}, + ssoTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TTL, Len: 4}}, + ssoMulticastTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_TTL, Len: 1}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_IF, Len: 4}}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_LOOP, Len: 4}}, + ssoReceiveTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVTTL, Len: 4}}, + ssoReceiveDst: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVDSTADDR, Len: 4}}, + ssoReceiveInterface: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVIF, Len: 4}}, + ssoHeaderPrepend: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_HDRINCL, Len: 4}}, + ssoStripHeader: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_STRIPHDR, Len: 4}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_ADD_MEMBERSHIP, Len: sizeofIPMreq}, typ: ssoTypeIPMreq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_DROP_MEMBERSHIP, Len: sizeofIPMreq}, typ: ssoTypeIPMreq}, + } +) + +func init() { + // Seems like kern.osreldate is veiled on latest OS X. We use + // kern.osrelease instead. + s, err := syscall.Sysctl("kern.osrelease") + if err != nil { + return + } + ss := strings.Split(s, ".") + if len(ss) == 0 { + return + } + // The IP_PKTINFO and protocol-independent multicast API were + // introduced in OS X 10.7 (Darwin 11). But it looks like + // those features require OS X 10.8 (Darwin 12) or above. + // See http://support.apple.com/kb/HT1633. + if mjver, err := strconv.Atoi(ss[0]); err != nil || mjver < 12 { + return + } + ctlOpts[ctlPacketInfo].name = sysIP_PKTINFO + ctlOpts[ctlPacketInfo].length = sizeofInetPktinfo + ctlOpts[ctlPacketInfo].marshal = marshalPacketInfo + ctlOpts[ctlPacketInfo].parse = parsePacketInfo + sockOpts[ssoPacketInfo] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVPKTINFO, Len: 4}} + sockOpts[ssoMulticastInterface] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_IF, Len: sizeofIPMreqn}, typ: ssoTypeIPMreqn} + sockOpts[ssoJoinGroup] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_JOIN_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq} + sockOpts[ssoLeaveGroup] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_LEAVE_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq} + sockOpts[ssoJoinSourceGroup] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_JOIN_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq} + sockOpts[ssoLeaveSourceGroup] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_LEAVE_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq} + sockOpts[ssoBlockSourceGroup] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_BLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq} + sockOpts[ssoUnblockSourceGroup] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_UNBLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq} +} + +func (pi *inetPktinfo) setIfindex(i int) { + pi.Ifindex = uint32(i) +} + +func (gr *groupReq) setGroup(grp net.IP) { + sa := (*sockaddrInet)(unsafe.Pointer(uintptr(unsafe.Pointer(gr)) + 4)) + sa.Len = sizeofSockaddrInet + sa.Family = syscall.AF_INET + copy(sa.Addr[:], grp) +} + +func (gsr *groupSourceReq) setSourceGroup(grp, src net.IP) { + sa := (*sockaddrInet)(unsafe.Pointer(uintptr(unsafe.Pointer(gsr)) + 4)) + sa.Len = sizeofSockaddrInet + sa.Family = syscall.AF_INET + copy(sa.Addr[:], grp) + sa = (*sockaddrInet)(unsafe.Pointer(uintptr(unsafe.Pointer(gsr)) + 132)) + sa.Len = sizeofSockaddrInet + sa.Family = syscall.AF_INET + copy(sa.Addr[:], src) +} diff --git a/api/vendor/golang.org/x/net/ipv4/sys_dragonfly.go b/api/vendor/golang.org/x/net/ipv4/sys_dragonfly.go new file mode 100644 index 0000000..859764f --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/sys_dragonfly.go @@ -0,0 +1,35 @@ +// 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 ipv4 + +import ( + "net" + "syscall" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTTL: {sysIP_RECVTTL, 1, marshalTTL, parseTTL}, + ctlDst: {sysIP_RECVDSTADDR, net.IPv4len, marshalDst, parseDst}, + ctlInterface: {sysIP_RECVIF, syscall.SizeofSockaddrDatalink, marshalInterface, parseInterface}, + } + + sockOpts = map[int]*sockOpt{ + ssoTOS: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TOS, Len: 4}}, + ssoTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TTL, Len: 4}}, + ssoMulticastTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_TTL, Len: 1}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_IF, Len: 4}}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_LOOP, Len: 4}}, + ssoReceiveTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVTTL, Len: 4}}, + ssoReceiveDst: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVDSTADDR, Len: 4}}, + ssoReceiveInterface: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVIF, Len: 4}}, + ssoHeaderPrepend: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_HDRINCL, Len: 4}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_ADD_MEMBERSHIP, Len: sizeofIPMreq}, typ: ssoTypeIPMreq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_DROP_MEMBERSHIP, Len: sizeofIPMreq}, typ: ssoTypeIPMreq}, + } +) diff --git a/api/vendor/golang.org/x/net/ipv4/sys_freebsd.go b/api/vendor/golang.org/x/net/ipv4/sys_freebsd.go new file mode 100644 index 0000000..b800324 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/sys_freebsd.go @@ -0,0 +1,76 @@ +// 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 ipv4 + +import ( + "net" + "runtime" + "strings" + "syscall" + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTTL: {sysIP_RECVTTL, 1, marshalTTL, parseTTL}, + ctlDst: {sysIP_RECVDSTADDR, net.IPv4len, marshalDst, parseDst}, + ctlInterface: {sysIP_RECVIF, syscall.SizeofSockaddrDatalink, marshalInterface, parseInterface}, + } + + sockOpts = map[int]*sockOpt{ + ssoTOS: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TOS, Len: 4}}, + ssoTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TTL, Len: 4}}, + ssoMulticastTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_TTL, Len: 1}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_IF, Len: 4}}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_LOOP, Len: 4}}, + ssoReceiveTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVTTL, Len: 4}}, + ssoReceiveDst: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVDSTADDR, Len: 4}}, + ssoReceiveInterface: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVIF, Len: 4}}, + ssoHeaderPrepend: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_HDRINCL, Len: 4}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_JOIN_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_LEAVE_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoJoinSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_JOIN_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoLeaveSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_LEAVE_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoBlockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_BLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoUnblockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_UNBLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + } +) + +func init() { + freebsdVersion, _ = syscall.SysctlUint32("kern.osreldate") + if freebsdVersion >= 1000000 { + sockOpts[ssoMulticastInterface] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_IF, Len: sizeofIPMreqn}, typ: ssoTypeIPMreqn} + } + if runtime.GOOS == "freebsd" && runtime.GOARCH == "386" { + archs, _ := syscall.Sysctl("kern.supported_archs") + for _, s := range strings.Fields(archs) { + if s == "amd64" { + freebsd32o64 = true + break + } + } + } +} + +func (gr *groupReq) setGroup(grp net.IP) { + sa := (*sockaddrInet)(unsafe.Pointer(&gr.Group)) + sa.Len = sizeofSockaddrInet + sa.Family = syscall.AF_INET + copy(sa.Addr[:], grp) +} + +func (gsr *groupSourceReq) setSourceGroup(grp, src net.IP) { + sa := (*sockaddrInet)(unsafe.Pointer(&gsr.Group)) + sa.Len = sizeofSockaddrInet + sa.Family = syscall.AF_INET + copy(sa.Addr[:], grp) + sa = (*sockaddrInet)(unsafe.Pointer(&gsr.Source)) + sa.Len = sizeofSockaddrInet + sa.Family = syscall.AF_INET + copy(sa.Addr[:], src) +} diff --git a/api/vendor/golang.org/x/net/ipv4/sys_linux.go b/api/vendor/golang.org/x/net/ipv4/sys_linux.go new file mode 100644 index 0000000..60defe1 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/sys_linux.go @@ -0,0 +1,59 @@ +// 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 ipv4 + +import ( + "net" + "syscall" + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTTL: {sysIP_TTL, 1, marshalTTL, parseTTL}, + ctlPacketInfo: {sysIP_PKTINFO, sizeofInetPktinfo, marshalPacketInfo, parsePacketInfo}, + } + + sockOpts = map[int]*sockOpt{ + ssoTOS: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TOS, Len: 4}}, + ssoTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TTL, Len: 4}}, + ssoMulticastTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_TTL, Len: 4}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_IF, Len: sizeofIPMreqn}, typ: ssoTypeIPMreqn}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_LOOP, Len: 4}}, + ssoReceiveTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVTTL, Len: 4}}, + ssoPacketInfo: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_PKTINFO, Len: 4}}, + ssoHeaderPrepend: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_HDRINCL, Len: 4}}, + ssoICMPFilter: {Option: socket.Option{Level: iana.ProtocolReserved, Name: sysICMP_FILTER, Len: sizeofICMPFilter}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_JOIN_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_LEAVE_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoJoinSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_JOIN_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoLeaveSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_LEAVE_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoBlockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_BLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoUnblockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_UNBLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoAttachFilter: {Option: socket.Option{Level: sysSOL_SOCKET, Name: sysSO_ATTACH_FILTER, Len: sizeofSockFprog}}, + } +) + +func (pi *inetPktinfo) setIfindex(i int) { + pi.Ifindex = int32(i) +} + +func (gr *groupReq) setGroup(grp net.IP) { + sa := (*sockaddrInet)(unsafe.Pointer(&gr.Group)) + sa.Family = syscall.AF_INET + copy(sa.Addr[:], grp) +} + +func (gsr *groupSourceReq) setSourceGroup(grp, src net.IP) { + sa := (*sockaddrInet)(unsafe.Pointer(&gsr.Group)) + sa.Family = syscall.AF_INET + copy(sa.Addr[:], grp) + sa = (*sockaddrInet)(unsafe.Pointer(&gsr.Source)) + sa.Family = syscall.AF_INET + copy(sa.Addr[:], src) +} diff --git a/api/vendor/golang.org/x/net/ipv4/sys_solaris.go b/api/vendor/golang.org/x/net/ipv4/sys_solaris.go new file mode 100644 index 0000000..832fef1 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/sys_solaris.go @@ -0,0 +1,57 @@ +// 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 ipv4 + +import ( + "net" + "syscall" + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTTL: {sysIP_RECVTTL, 4, marshalTTL, parseTTL}, + ctlPacketInfo: {sysIP_PKTINFO, sizeofInetPktinfo, marshalPacketInfo, parsePacketInfo}, + } + + sockOpts = map[int]sockOpt{ + ssoTOS: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TOS, Len: 4}}, + ssoTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TTL, Len: 4}}, + ssoMulticastTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_TTL, Len: 1}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_IF, Len: 4}}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_LOOP, Len: 1}}, + ssoReceiveTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVTTL, Len: 4}}, + ssoPacketInfo: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVPKTINFO, Len: 4}}, + ssoHeaderPrepend: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_HDRINCL, Len: 4}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_JOIN_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_LEAVE_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoJoinSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_JOIN_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoLeaveSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_LEAVE_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoBlockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_BLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoUnblockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_UNBLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + } +) + +func (pi *inetPktinfo) setIfindex(i int) { + pi.Ifindex = uint32(i) +} + +func (gr *groupReq) setGroup(grp net.IP) { + sa := (*sockaddrInet)(unsafe.Pointer(uintptr(unsafe.Pointer(gr)) + 4)) + sa.Family = syscall.AF_INET + copy(sa.Addr[:], grp) +} + +func (gsr *groupSourceReq) setSourceGroup(grp, src net.IP) { + sa := (*sockaddrInet)(unsafe.Pointer(uintptr(unsafe.Pointer(gsr)) + 4)) + sa.Family = syscall.AF_INET + copy(sa.Addr[:], grp) + sa = (*sockaddrInet)(unsafe.Pointer(uintptr(unsafe.Pointer(gsr)) + 260)) + sa.Family = syscall.AF_INET + copy(sa.Addr[:], src) +} diff --git a/api/vendor/golang.org/x/net/ipv4/sys_ssmreq.go b/api/vendor/golang.org/x/net/ipv4/sys_ssmreq.go new file mode 100644 index 0000000..ae5704e --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/sys_ssmreq.go @@ -0,0 +1,54 @@ +// 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. + +// +build darwin freebsd linux solaris + +package ipv4 + +import ( + "net" + "unsafe" + + "golang.org/x/net/internal/socket" +) + +var freebsd32o64 bool + +func (so *sockOpt) setGroupReq(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + var gr groupReq + if ifi != nil { + gr.Interface = uint32(ifi.Index) + } + gr.setGroup(grp) + var b []byte + if freebsd32o64 { + var d [sizeofGroupReq + 4]byte + s := (*[sizeofGroupReq]byte)(unsafe.Pointer(&gr)) + copy(d[:4], s[:4]) + copy(d[8:], s[4:]) + b = d[:] + } else { + b = (*[sizeofGroupReq]byte)(unsafe.Pointer(&gr))[:sizeofGroupReq] + } + return so.Set(c, b) +} + +func (so *sockOpt) setGroupSourceReq(c *socket.Conn, ifi *net.Interface, grp, src net.IP) error { + var gsr groupSourceReq + if ifi != nil { + gsr.Interface = uint32(ifi.Index) + } + gsr.setSourceGroup(grp, src) + var b []byte + if freebsd32o64 { + var d [sizeofGroupSourceReq + 4]byte + s := (*[sizeofGroupSourceReq]byte)(unsafe.Pointer(&gsr)) + copy(d[:4], s[:4]) + copy(d[8:], s[4:]) + b = d[:] + } else { + b = (*[sizeofGroupSourceReq]byte)(unsafe.Pointer(&gsr))[:sizeofGroupSourceReq] + } + return so.Set(c, b) +} diff --git a/api/vendor/golang.org/x/net/ipv4/sys_ssmreq_stub.go b/api/vendor/golang.org/x/net/ipv4/sys_ssmreq_stub.go new file mode 100644 index 0000000..e6b7623 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/sys_ssmreq_stub.go @@ -0,0 +1,21 @@ +// 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. + +// +build !darwin,!freebsd,!linux,!solaris + +package ipv4 + +import ( + "net" + + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) setGroupReq(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + return errOpNoSupport +} + +func (so *sockOpt) setGroupSourceReq(c *socket.Conn, ifi *net.Interface, grp, src net.IP) error { + return errOpNoSupport +} diff --git a/api/vendor/golang.org/x/net/ipv4/sys_stub.go b/api/vendor/golang.org/x/net/ipv4/sys_stub.go new file mode 100644 index 0000000..4f07647 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/sys_stub.go @@ -0,0 +1,13 @@ +// 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. + +// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows + +package ipv4 + +var ( + ctlOpts = [ctlMax]ctlOpt{} + + sockOpts = map[int]*sockOpt{} +) diff --git a/api/vendor/golang.org/x/net/ipv4/sys_windows.go b/api/vendor/golang.org/x/net/ipv4/sys_windows.go new file mode 100644 index 0000000..b0913d5 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/sys_windows.go @@ -0,0 +1,67 @@ +// 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 ipv4 + +import ( + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +const ( + // See ws2tcpip.h. + sysIP_OPTIONS = 0x1 + sysIP_HDRINCL = 0x2 + sysIP_TOS = 0x3 + sysIP_TTL = 0x4 + sysIP_MULTICAST_IF = 0x9 + sysIP_MULTICAST_TTL = 0xa + sysIP_MULTICAST_LOOP = 0xb + sysIP_ADD_MEMBERSHIP = 0xc + sysIP_DROP_MEMBERSHIP = 0xd + sysIP_DONTFRAGMENT = 0xe + sysIP_ADD_SOURCE_MEMBERSHIP = 0xf + sysIP_DROP_SOURCE_MEMBERSHIP = 0x10 + sysIP_PKTINFO = 0x13 + + sizeofInetPktinfo = 0x8 + sizeofIPMreq = 0x8 + sizeofIPMreqSource = 0xc +) + +type inetPktinfo struct { + Addr [4]byte + Ifindex int32 +} + +type ipMreq struct { + Multiaddr [4]byte + Interface [4]byte +} + +type ipMreqSource struct { + Multiaddr [4]byte + Sourceaddr [4]byte + Interface [4]byte +} + +// See http://msdn.microsoft.com/en-us/library/windows/desktop/ms738586(v=vs.85).aspx +var ( + ctlOpts = [ctlMax]ctlOpt{} + + sockOpts = map[int]*sockOpt{ + ssoTOS: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TOS, Len: 4}}, + ssoTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TTL, Len: 4}}, + ssoMulticastTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_TTL, Len: 4}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_IF, Len: 4}}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_LOOP, Len: 4}}, + ssoHeaderPrepend: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_HDRINCL, Len: 4}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_ADD_MEMBERSHIP, Len: sizeofIPMreq}, typ: ssoTypeIPMreq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_DROP_MEMBERSHIP, Len: sizeofIPMreq}, typ: ssoTypeIPMreq}, + } +) + +func (pi *inetPktinfo) setIfindex(i int) { + pi.Ifindex = int32(i) +} diff --git a/api/vendor/golang.org/x/net/ipv4/unicast_test.go b/api/vendor/golang.org/x/net/ipv4/unicast_test.go new file mode 100644 index 0000000..02c089f --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/unicast_test.go @@ -0,0 +1,247 @@ +// 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 ipv4_test + +import ( + "bytes" + "net" + "os" + "runtime" + "testing" + "time" + + "golang.org/x/net/icmp" + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv4" +) + +func TestPacketConnReadWriteUnicastUDP(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + c, err := nettest.NewLocalPacketListener("udp4") + if err != nil { + t.Fatal(err) + } + defer c.Close() + p := ipv4.NewPacketConn(c) + defer p.Close() + + dst := c.LocalAddr() + cf := ipv4.FlagTTL | ipv4.FlagDst | ipv4.FlagInterface + wb := []byte("HELLO-R-U-THERE") + + for i, toggle := range []bool{true, false, true} { + if err := p.SetControlMessage(cf, toggle); err != nil { + if nettest.ProtocolNotSupported(err) { + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + p.SetTTL(i + 1) + if err := p.SetWriteDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { + t.Fatal(err) + } + if n, err := p.WriteTo(wb, nil, dst); err != nil { + t.Fatal(err) + } else if n != len(wb) { + t.Fatalf("got %v; want %v", n, len(wb)) + } + rb := make([]byte, 128) + if err := p.SetReadDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { + t.Fatal(err) + } + if n, _, _, err := p.ReadFrom(rb); err != nil { + t.Fatal(err) + } else if !bytes.Equal(rb[:n], wb) { + t.Fatalf("got %v; want %v", rb[:n], wb) + } + } +} + +func TestPacketConnReadWriteUnicastICMP(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + c, err := net.ListenPacket("ip4:icmp", "0.0.0.0") + if err != nil { + t.Fatal(err) + } + defer c.Close() + + dst, err := net.ResolveIPAddr("ip4", "127.0.0.1") + if err != nil { + t.Fatal(err) + } + p := ipv4.NewPacketConn(c) + defer p.Close() + cf := ipv4.FlagDst | ipv4.FlagInterface + if runtime.GOOS != "solaris" { + // Solaris never allows to modify ICMP properties. + cf |= ipv4.FlagTTL + } + + for i, toggle := range []bool{true, false, true} { + wb, err := (&icmp.Message{ + Type: ipv4.ICMPTypeEcho, Code: 0, + Body: &icmp.Echo{ + ID: os.Getpid() & 0xffff, Seq: i + 1, + Data: []byte("HELLO-R-U-THERE"), + }, + }).Marshal(nil) + if err != nil { + t.Fatal(err) + } + if err := p.SetControlMessage(cf, toggle); err != nil { + if nettest.ProtocolNotSupported(err) { + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + p.SetTTL(i + 1) + if err := p.SetWriteDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { + t.Fatal(err) + } + if n, err := p.WriteTo(wb, nil, dst); err != nil { + t.Fatal(err) + } else if n != len(wb) { + t.Fatalf("got %v; want %v", n, len(wb)) + } + rb := make([]byte, 128) + loop: + if err := p.SetReadDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { + t.Fatal(err) + } + if n, _, _, err := p.ReadFrom(rb); err != nil { + switch runtime.GOOS { + case "darwin": // older darwin kernels have some limitation on receiving icmp packet through raw socket + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } else { + m, err := icmp.ParseMessage(iana.ProtocolICMP, rb[:n]) + if err != nil { + t.Fatal(err) + } + if runtime.GOOS == "linux" && m.Type == ipv4.ICMPTypeEcho { + // On Linux we must handle own sent packets. + goto loop + } + if m.Type != ipv4.ICMPTypeEchoReply || m.Code != 0 { + t.Fatalf("got type=%v, code=%v; want type=%v, code=%v", m.Type, m.Code, ipv4.ICMPTypeEchoReply, 0) + } + } + } +} + +func TestRawConnReadWriteUnicastICMP(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + c, err := net.ListenPacket("ip4:icmp", "0.0.0.0") + if err != nil { + t.Fatal(err) + } + defer c.Close() + + dst, err := net.ResolveIPAddr("ip4", "127.0.0.1") + if err != nil { + t.Fatal(err) + } + r, err := ipv4.NewRawConn(c) + if err != nil { + t.Fatal(err) + } + defer r.Close() + cf := ipv4.FlagTTL | ipv4.FlagDst | ipv4.FlagInterface + + for i, toggle := range []bool{true, false, true} { + wb, err := (&icmp.Message{ + Type: ipv4.ICMPTypeEcho, Code: 0, + Body: &icmp.Echo{ + ID: os.Getpid() & 0xffff, Seq: i + 1, + Data: []byte("HELLO-R-U-THERE"), + }, + }).Marshal(nil) + if err != nil { + t.Fatal(err) + } + wh := &ipv4.Header{ + Version: ipv4.Version, + Len: ipv4.HeaderLen, + TOS: i + 1, + TotalLen: ipv4.HeaderLen + len(wb), + TTL: i + 1, + Protocol: 1, + Dst: dst.IP, + } + if err := r.SetControlMessage(cf, toggle); err != nil { + if nettest.ProtocolNotSupported(err) { + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + if err := r.SetWriteDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { + t.Fatal(err) + } + if err := r.WriteTo(wh, wb, nil); err != nil { + t.Fatal(err) + } + rb := make([]byte, ipv4.HeaderLen+128) + loop: + if err := r.SetReadDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { + t.Fatal(err) + } + if _, b, _, err := r.ReadFrom(rb); err != nil { + switch runtime.GOOS { + case "darwin": // older darwin kernels have some limitation on receiving icmp packet through raw socket + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } else { + m, err := icmp.ParseMessage(iana.ProtocolICMP, b) + if err != nil { + t.Fatal(err) + } + if runtime.GOOS == "linux" && m.Type == ipv4.ICMPTypeEcho { + // On Linux we must handle own sent packets. + goto loop + } + if m.Type != ipv4.ICMPTypeEchoReply || m.Code != 0 { + t.Fatalf("got type=%v, code=%v; want type=%v, code=%v", m.Type, m.Code, ipv4.ICMPTypeEchoReply, 0) + } + } + } +} diff --git a/api/vendor/golang.org/x/net/ipv4/unicastsockopt_test.go b/api/vendor/golang.org/x/net/ipv4/unicastsockopt_test.go new file mode 100644 index 0000000..db5213b --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/unicastsockopt_test.go @@ -0,0 +1,148 @@ +// 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 ipv4_test + +import ( + "net" + "runtime" + "testing" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv4" +) + +func TestConnUnicastSocketOptions(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + ln, err := net.Listen("tcp4", "127.0.0.1:0") + if err != nil { + t.Fatal(err) + } + defer ln.Close() + + errc := make(chan error, 1) + go func() { + c, err := ln.Accept() + if err != nil { + errc <- err + return + } + errc <- c.Close() + }() + + c, err := net.Dial("tcp4", ln.Addr().String()) + if err != nil { + t.Fatal(err) + } + defer c.Close() + + testUnicastSocketOptions(t, ipv4.NewConn(c)) + + if err := <-errc; err != nil { + t.Errorf("server: %v", err) + } +} + +var packetConnUnicastSocketOptionTests = []struct { + net, proto, addr string +}{ + {"udp4", "", "127.0.0.1:0"}, + {"ip4", ":icmp", "127.0.0.1"}, +} + +func TestPacketConnUnicastSocketOptions(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + m, ok := nettest.SupportsRawIPSocket() + for _, tt := range packetConnUnicastSocketOptionTests { + if tt.net == "ip4" && !ok { + t.Log(m) + continue + } + c, err := net.ListenPacket(tt.net+tt.proto, tt.addr) + if err != nil { + t.Fatal(err) + } + defer c.Close() + + testUnicastSocketOptions(t, ipv4.NewPacketConn(c)) + } +} + +func TestRawConnUnicastSocketOptions(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + c, err := net.ListenPacket("ip4:icmp", "127.0.0.1") + if err != nil { + t.Fatal(err) + } + defer c.Close() + + r, err := ipv4.NewRawConn(c) + if err != nil { + t.Fatal(err) + } + + testUnicastSocketOptions(t, r) +} + +type testIPv4UnicastConn interface { + TOS() (int, error) + SetTOS(int) error + TTL() (int, error) + SetTTL(int) error +} + +func testUnicastSocketOptions(t *testing.T, c testIPv4UnicastConn) { + tos := iana.DiffServCS0 | iana.NotECNTransport + switch runtime.GOOS { + case "windows": + // IP_TOS option is supported on Windows 8 and beyond. + t.Skipf("not supported on %s", runtime.GOOS) + } + + if err := c.SetTOS(tos); err != nil { + t.Fatal(err) + } + if v, err := c.TOS(); err != nil { + t.Fatal(err) + } else if v != tos { + t.Fatalf("got %v; want %v", v, tos) + } + const ttl = 255 + if err := c.SetTTL(ttl); err != nil { + t.Fatal(err) + } + if v, err := c.TTL(); err != nil { + t.Fatal(err) + } else if v != ttl { + t.Fatalf("got %v; want %v", v, ttl) + } +} diff --git a/api/vendor/golang.org/x/net/ipv4/zsys_darwin.go b/api/vendor/golang.org/x/net/ipv4/zsys_darwin.go new file mode 100644 index 0000000..c07cc88 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/zsys_darwin.go @@ -0,0 +1,99 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_darwin.go + +package ipv4 + +const ( + sysIP_OPTIONS = 0x1 + sysIP_HDRINCL = 0x2 + sysIP_TOS = 0x3 + sysIP_TTL = 0x4 + sysIP_RECVOPTS = 0x5 + sysIP_RECVRETOPTS = 0x6 + sysIP_RECVDSTADDR = 0x7 + sysIP_RETOPTS = 0x8 + sysIP_RECVIF = 0x14 + sysIP_STRIPHDR = 0x17 + sysIP_RECVTTL = 0x18 + sysIP_BOUND_IF = 0x19 + sysIP_PKTINFO = 0x1a + sysIP_RECVPKTINFO = 0x1a + + sysIP_MULTICAST_IF = 0x9 + sysIP_MULTICAST_TTL = 0xa + sysIP_MULTICAST_LOOP = 0xb + sysIP_ADD_MEMBERSHIP = 0xc + sysIP_DROP_MEMBERSHIP = 0xd + sysIP_MULTICAST_VIF = 0xe + sysIP_MULTICAST_IFINDEX = 0x42 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x46 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x47 + sysIP_BLOCK_SOURCE = 0x48 + sysIP_UNBLOCK_SOURCE = 0x49 + sysMCAST_JOIN_GROUP = 0x50 + sysMCAST_LEAVE_GROUP = 0x51 + sysMCAST_JOIN_SOURCE_GROUP = 0x52 + sysMCAST_LEAVE_SOURCE_GROUP = 0x53 + sysMCAST_BLOCK_SOURCE = 0x54 + sysMCAST_UNBLOCK_SOURCE = 0x55 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 +) + +type sockaddrStorage struct { + Len uint8 + Family uint8 + X__ss_pad1 [6]int8 + X__ss_align int64 + X__ss_pad2 [112]int8 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type inetPktinfo struct { + Ifindex uint32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr [4]byte /* in_addr */ + Sourceaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [128]byte +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [128]byte + Pad_cgo_1 [128]byte +} diff --git a/api/vendor/golang.org/x/net/ipv4/zsys_dragonfly.go b/api/vendor/golang.org/x/net/ipv4/zsys_dragonfly.go new file mode 100644 index 0000000..c4365e9 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/zsys_dragonfly.go @@ -0,0 +1,31 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_dragonfly.go + +package ipv4 + +const ( + sysIP_OPTIONS = 0x1 + sysIP_HDRINCL = 0x2 + sysIP_TOS = 0x3 + sysIP_TTL = 0x4 + sysIP_RECVOPTS = 0x5 + sysIP_RECVRETOPTS = 0x6 + sysIP_RECVDSTADDR = 0x7 + sysIP_RETOPTS = 0x8 + sysIP_RECVIF = 0x14 + sysIP_RECVTTL = 0x41 + + sysIP_MULTICAST_IF = 0x9 + sysIP_MULTICAST_TTL = 0xa + sysIP_MULTICAST_LOOP = 0xb + sysIP_MULTICAST_VIF = 0xe + sysIP_ADD_MEMBERSHIP = 0xc + sysIP_DROP_MEMBERSHIP = 0xd + + sizeofIPMreq = 0x8 +) + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} diff --git a/api/vendor/golang.org/x/net/ipv4/zsys_freebsd_386.go b/api/vendor/golang.org/x/net/ipv4/zsys_freebsd_386.go new file mode 100644 index 0000000..8c4aec9 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/zsys_freebsd_386.go @@ -0,0 +1,93 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_freebsd.go + +package ipv4 + +const ( + sysIP_OPTIONS = 0x1 + sysIP_HDRINCL = 0x2 + sysIP_TOS = 0x3 + sysIP_TTL = 0x4 + sysIP_RECVOPTS = 0x5 + sysIP_RECVRETOPTS = 0x6 + sysIP_RECVDSTADDR = 0x7 + sysIP_SENDSRCADDR = 0x7 + sysIP_RETOPTS = 0x8 + sysIP_RECVIF = 0x14 + sysIP_ONESBCAST = 0x17 + sysIP_BINDANY = 0x18 + sysIP_RECVTTL = 0x41 + sysIP_MINTTL = 0x42 + sysIP_DONTFRAG = 0x43 + sysIP_RECVTOS = 0x44 + + sysIP_MULTICAST_IF = 0x9 + sysIP_MULTICAST_TTL = 0xa + sysIP_MULTICAST_LOOP = 0xb + sysIP_ADD_MEMBERSHIP = 0xc + sysIP_DROP_MEMBERSHIP = 0xd + sysIP_MULTICAST_VIF = 0xe + sysIP_ADD_SOURCE_MEMBERSHIP = 0x46 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x47 + sysIP_BLOCK_SOURCE = 0x48 + sysIP_UNBLOCK_SOURCE = 0x49 + sysMCAST_JOIN_GROUP = 0x50 + sysMCAST_LEAVE_GROUP = 0x51 + sysMCAST_JOIN_SOURCE_GROUP = 0x52 + sysMCAST_LEAVE_SOURCE_GROUP = 0x53 + sysMCAST_BLOCK_SOURCE = 0x54 + sysMCAST_UNBLOCK_SOURCE = 0x55 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 +) + +type sockaddrStorage struct { + Len uint8 + Family uint8 + X__ss_pad1 [6]int8 + X__ss_align int64 + X__ss_pad2 [112]int8 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr [4]byte /* in_addr */ + Sourceaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type groupReq struct { + Interface uint32 + Group sockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Group sockaddrStorage + Source sockaddrStorage +} diff --git a/api/vendor/golang.org/x/net/ipv4/zsys_freebsd_amd64.go b/api/vendor/golang.org/x/net/ipv4/zsys_freebsd_amd64.go new file mode 100644 index 0000000..4b10b7c --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/zsys_freebsd_amd64.go @@ -0,0 +1,95 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_freebsd.go + +package ipv4 + +const ( + sysIP_OPTIONS = 0x1 + sysIP_HDRINCL = 0x2 + sysIP_TOS = 0x3 + sysIP_TTL = 0x4 + sysIP_RECVOPTS = 0x5 + sysIP_RECVRETOPTS = 0x6 + sysIP_RECVDSTADDR = 0x7 + sysIP_SENDSRCADDR = 0x7 + sysIP_RETOPTS = 0x8 + sysIP_RECVIF = 0x14 + sysIP_ONESBCAST = 0x17 + sysIP_BINDANY = 0x18 + sysIP_RECVTTL = 0x41 + sysIP_MINTTL = 0x42 + sysIP_DONTFRAG = 0x43 + sysIP_RECVTOS = 0x44 + + sysIP_MULTICAST_IF = 0x9 + sysIP_MULTICAST_TTL = 0xa + sysIP_MULTICAST_LOOP = 0xb + sysIP_ADD_MEMBERSHIP = 0xc + sysIP_DROP_MEMBERSHIP = 0xd + sysIP_MULTICAST_VIF = 0xe + sysIP_ADD_SOURCE_MEMBERSHIP = 0x46 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x47 + sysIP_BLOCK_SOURCE = 0x48 + sysIP_UNBLOCK_SOURCE = 0x49 + sysMCAST_JOIN_GROUP = 0x50 + sysMCAST_LEAVE_GROUP = 0x51 + sysMCAST_JOIN_SOURCE_GROUP = 0x52 + sysMCAST_LEAVE_SOURCE_GROUP = 0x53 + sysMCAST_BLOCK_SOURCE = 0x54 + sysMCAST_UNBLOCK_SOURCE = 0x55 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 +) + +type sockaddrStorage struct { + Len uint8 + Family uint8 + X__ss_pad1 [6]int8 + X__ss_align int64 + X__ss_pad2 [112]int8 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr [4]byte /* in_addr */ + Sourceaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sockaddrStorage + Source sockaddrStorage +} diff --git a/api/vendor/golang.org/x/net/ipv4/zsys_freebsd_arm.go b/api/vendor/golang.org/x/net/ipv4/zsys_freebsd_arm.go new file mode 100644 index 0000000..4b10b7c --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/zsys_freebsd_arm.go @@ -0,0 +1,95 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_freebsd.go + +package ipv4 + +const ( + sysIP_OPTIONS = 0x1 + sysIP_HDRINCL = 0x2 + sysIP_TOS = 0x3 + sysIP_TTL = 0x4 + sysIP_RECVOPTS = 0x5 + sysIP_RECVRETOPTS = 0x6 + sysIP_RECVDSTADDR = 0x7 + sysIP_SENDSRCADDR = 0x7 + sysIP_RETOPTS = 0x8 + sysIP_RECVIF = 0x14 + sysIP_ONESBCAST = 0x17 + sysIP_BINDANY = 0x18 + sysIP_RECVTTL = 0x41 + sysIP_MINTTL = 0x42 + sysIP_DONTFRAG = 0x43 + sysIP_RECVTOS = 0x44 + + sysIP_MULTICAST_IF = 0x9 + sysIP_MULTICAST_TTL = 0xa + sysIP_MULTICAST_LOOP = 0xb + sysIP_ADD_MEMBERSHIP = 0xc + sysIP_DROP_MEMBERSHIP = 0xd + sysIP_MULTICAST_VIF = 0xe + sysIP_ADD_SOURCE_MEMBERSHIP = 0x46 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x47 + sysIP_BLOCK_SOURCE = 0x48 + sysIP_UNBLOCK_SOURCE = 0x49 + sysMCAST_JOIN_GROUP = 0x50 + sysMCAST_LEAVE_GROUP = 0x51 + sysMCAST_JOIN_SOURCE_GROUP = 0x52 + sysMCAST_LEAVE_SOURCE_GROUP = 0x53 + sysMCAST_BLOCK_SOURCE = 0x54 + sysMCAST_UNBLOCK_SOURCE = 0x55 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 +) + +type sockaddrStorage struct { + Len uint8 + Family uint8 + X__ss_pad1 [6]int8 + X__ss_align int64 + X__ss_pad2 [112]int8 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr [4]byte /* in_addr */ + Sourceaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sockaddrStorage + Source sockaddrStorage +} diff --git a/api/vendor/golang.org/x/net/ipv4/zsys_linux_386.go b/api/vendor/golang.org/x/net/ipv4/zsys_linux_386.go new file mode 100644 index 0000000..c0260f0 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/zsys_linux_386.go @@ -0,0 +1,148 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 + + sizeofICMPFilter = 0x4 + + sizeofSockFprog = 0x8 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type inetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type groupReq struct { + Interface uint32 + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpFilter struct { + Data uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [2]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/vendor/golang.org/x/net/ipv4/zsys_linux_amd64.go b/api/vendor/golang.org/x/net/ipv4/zsys_linux_amd64.go new file mode 100644 index 0000000..9c967ea --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/zsys_linux_amd64.go @@ -0,0 +1,150 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPFilter = 0x4 + + sizeofSockFprog = 0x10 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type inetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpFilter struct { + Data uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/vendor/golang.org/x/net/ipv4/zsys_linux_arm.go b/api/vendor/golang.org/x/net/ipv4/zsys_linux_arm.go new file mode 100644 index 0000000..c0260f0 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/zsys_linux_arm.go @@ -0,0 +1,148 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 + + sizeofICMPFilter = 0x4 + + sizeofSockFprog = 0x8 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type inetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type groupReq struct { + Interface uint32 + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpFilter struct { + Data uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [2]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/vendor/golang.org/x/net/ipv4/zsys_linux_arm64.go b/api/vendor/golang.org/x/net/ipv4/zsys_linux_arm64.go new file mode 100644 index 0000000..9c967ea --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/zsys_linux_arm64.go @@ -0,0 +1,150 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPFilter = 0x4 + + sizeofSockFprog = 0x10 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type inetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpFilter struct { + Data uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/vendor/golang.org/x/net/ipv4/zsys_linux_mips.go b/api/vendor/golang.org/x/net/ipv4/zsys_linux_mips.go new file mode 100644 index 0000000..c0260f0 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/zsys_linux_mips.go @@ -0,0 +1,148 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 + + sizeofICMPFilter = 0x4 + + sizeofSockFprog = 0x8 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type inetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type groupReq struct { + Interface uint32 + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpFilter struct { + Data uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [2]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/vendor/golang.org/x/net/ipv4/zsys_linux_mips64.go b/api/vendor/golang.org/x/net/ipv4/zsys_linux_mips64.go new file mode 100644 index 0000000..9c967ea --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/zsys_linux_mips64.go @@ -0,0 +1,150 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPFilter = 0x4 + + sizeofSockFprog = 0x10 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type inetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpFilter struct { + Data uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/vendor/golang.org/x/net/ipv4/zsys_linux_mips64le.go b/api/vendor/golang.org/x/net/ipv4/zsys_linux_mips64le.go new file mode 100644 index 0000000..9c967ea --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/zsys_linux_mips64le.go @@ -0,0 +1,150 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPFilter = 0x4 + + sizeofSockFprog = 0x10 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type inetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpFilter struct { + Data uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/vendor/golang.org/x/net/ipv4/zsys_linux_mipsle.go b/api/vendor/golang.org/x/net/ipv4/zsys_linux_mipsle.go new file mode 100644 index 0000000..c0260f0 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/zsys_linux_mipsle.go @@ -0,0 +1,148 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 + + sizeofICMPFilter = 0x4 + + sizeofSockFprog = 0x8 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type inetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type groupReq struct { + Interface uint32 + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpFilter struct { + Data uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [2]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/vendor/golang.org/x/net/ipv4/zsys_linux_ppc.go b/api/vendor/golang.org/x/net/ipv4/zsys_linux_ppc.go new file mode 100644 index 0000000..f65bd9a --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/zsys_linux_ppc.go @@ -0,0 +1,148 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 + + sizeofICMPFilter = 0x4 + + sizeofSockFprog = 0x8 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]uint8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type inetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type groupReq struct { + Interface uint32 + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpFilter struct { + Data uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [2]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64.go b/api/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64.go new file mode 100644 index 0000000..9c967ea --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64.go @@ -0,0 +1,150 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPFilter = 0x4 + + sizeofSockFprog = 0x10 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type inetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpFilter struct { + Data uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64le.go b/api/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64le.go new file mode 100644 index 0000000..9c967ea --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64le.go @@ -0,0 +1,150 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPFilter = 0x4 + + sizeofSockFprog = 0x10 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type inetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpFilter struct { + Data uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/vendor/golang.org/x/net/ipv4/zsys_linux_s390x.go b/api/vendor/golang.org/x/net/ipv4/zsys_linux_s390x.go new file mode 100644 index 0000000..9c967ea --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/zsys_linux_s390x.go @@ -0,0 +1,150 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPFilter = 0x4 + + sizeofSockFprog = 0x10 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type inetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpFilter struct { + Data uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/vendor/golang.org/x/net/ipv4/zsys_netbsd.go b/api/vendor/golang.org/x/net/ipv4/zsys_netbsd.go new file mode 100644 index 0000000..fd3624d --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/zsys_netbsd.go @@ -0,0 +1,30 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_netbsd.go + +package ipv4 + +const ( + sysIP_OPTIONS = 0x1 + sysIP_HDRINCL = 0x2 + sysIP_TOS = 0x3 + sysIP_TTL = 0x4 + sysIP_RECVOPTS = 0x5 + sysIP_RECVRETOPTS = 0x6 + sysIP_RECVDSTADDR = 0x7 + sysIP_RETOPTS = 0x8 + sysIP_RECVIF = 0x14 + sysIP_RECVTTL = 0x17 + + sysIP_MULTICAST_IF = 0x9 + sysIP_MULTICAST_TTL = 0xa + sysIP_MULTICAST_LOOP = 0xb + sysIP_ADD_MEMBERSHIP = 0xc + sysIP_DROP_MEMBERSHIP = 0xd + + sizeofIPMreq = 0x8 +) + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} diff --git a/api/vendor/golang.org/x/net/ipv4/zsys_openbsd.go b/api/vendor/golang.org/x/net/ipv4/zsys_openbsd.go new file mode 100644 index 0000000..12f36be --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/zsys_openbsd.go @@ -0,0 +1,30 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_openbsd.go + +package ipv4 + +const ( + sysIP_OPTIONS = 0x1 + sysIP_HDRINCL = 0x2 + sysIP_TOS = 0x3 + sysIP_TTL = 0x4 + sysIP_RECVOPTS = 0x5 + sysIP_RECVRETOPTS = 0x6 + sysIP_RECVDSTADDR = 0x7 + sysIP_RETOPTS = 0x8 + sysIP_RECVIF = 0x1e + sysIP_RECVTTL = 0x1f + + sysIP_MULTICAST_IF = 0x9 + sysIP_MULTICAST_TTL = 0xa + sysIP_MULTICAST_LOOP = 0xb + sysIP_ADD_MEMBERSHIP = 0xc + sysIP_DROP_MEMBERSHIP = 0xd + + sizeofIPMreq = 0x8 +) + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} diff --git a/api/vendor/golang.org/x/net/ipv4/zsys_solaris.go b/api/vendor/golang.org/x/net/ipv4/zsys_solaris.go new file mode 100644 index 0000000..0a3875c --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv4/zsys_solaris.go @@ -0,0 +1,100 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_solaris.go + +package ipv4 + +const ( + sysIP_OPTIONS = 0x1 + sysIP_HDRINCL = 0x2 + sysIP_TOS = 0x3 + sysIP_TTL = 0x4 + sysIP_RECVOPTS = 0x5 + sysIP_RECVRETOPTS = 0x6 + sysIP_RECVDSTADDR = 0x7 + sysIP_RETOPTS = 0x8 + sysIP_RECVIF = 0x9 + sysIP_RECVSLLA = 0xa + sysIP_RECVTTL = 0xb + + sysIP_MULTICAST_IF = 0x10 + sysIP_MULTICAST_TTL = 0x11 + sysIP_MULTICAST_LOOP = 0x12 + sysIP_ADD_MEMBERSHIP = 0x13 + sysIP_DROP_MEMBERSHIP = 0x14 + sysIP_BLOCK_SOURCE = 0x15 + sysIP_UNBLOCK_SOURCE = 0x16 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x17 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x18 + sysIP_NEXTHOP = 0x19 + + sysIP_PKTINFO = 0x1a + sysIP_RECVPKTINFO = 0x1a + sysIP_DONTFRAG = 0x1b + + sysIP_BOUND_IF = 0x41 + sysIP_UNSPEC_SRC = 0x42 + sysIP_BROADCAST_TTL = 0x43 + sysIP_DHCPINIT_IF = 0x45 + + sysIP_REUSEADDR = 0x104 + sysIP_DONTROUTE = 0x105 + sysIP_BROADCAST = 0x106 + + sysMCAST_JOIN_GROUP = 0x29 + sysMCAST_LEAVE_GROUP = 0x2a + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_JOIN_SOURCE_GROUP = 0x2d + sysMCAST_LEAVE_SOURCE_GROUP = 0x2e + + sizeofSockaddrStorage = 0x100 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + + sizeofIPMreq = 0x8 + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x104 + sizeofGroupSourceReq = 0x204 +) + +type sockaddrStorage struct { + Family uint16 + X_ss_pad1 [6]int8 + X_ss_align float64 + X_ss_pad2 [240]int8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type inetPktinfo struct { + Ifindex uint32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqSource struct { + Multiaddr [4]byte /* in_addr */ + Sourceaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [256]byte +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [256]byte + Pad_cgo_1 [256]byte +} diff --git a/api/vendor/golang.org/x/net/ipv6/batch.go b/api/vendor/golang.org/x/net/ipv6/batch.go new file mode 100644 index 0000000..4f5fe68 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/batch.go @@ -0,0 +1,119 @@ +// 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. + +// +build go1.9 + +package ipv6 + +import ( + "net" + "runtime" + "syscall" + + "golang.org/x/net/internal/socket" +) + +// BUG(mikio): On Windows, the ReadBatch and WriteBatch methods of +// PacketConn are not implemented. + +// A Message represents an IO message. +// +// type Message struct { +// Buffers [][]byte +// OOB []byte +// Addr net.Addr +// N int +// NN int +// Flags int +// } +// +// The Buffers fields represents a list of contiguous buffers, which +// can be used for vectored IO, for example, putting a header and a +// payload in each slice. +// When writing, the Buffers field must contain at least one byte to +// write. +// When reading, the Buffers field will always contain a byte to read. +// +// The OOB field contains protocol-specific control or miscellaneous +// ancillary data known as out-of-band data. +// It can be nil when not required. +// +// The Addr field specifies a destination address when writing. +// It can be nil when the underlying protocol of the endpoint uses +// connection-oriented communication. +// After a successful read, it may contain the source address on the +// received packet. +// +// The N field indicates the number of bytes read or written from/to +// Buffers. +// +// The NN field indicates the number of bytes read or written from/to +// OOB. +// +// The Flags field contains protocol-specific information on the +// received message. +type Message = socket.Message + +// ReadBatch reads a batch of messages. +// +// The provided flags is a set of platform-dependent flags, such as +// syscall.MSG_PEEK. +// +// On a successful read it returns the number of messages received, up +// to len(ms). +// +// On Linux, a batch read will be optimized. +// On other platforms, this method will read only a single message. +func (c *payloadHandler) ReadBatch(ms []Message, flags int) (int, error) { + if !c.ok() { + return 0, syscall.EINVAL + } + switch runtime.GOOS { + case "linux": + n, err := c.RecvMsgs([]socket.Message(ms), flags) + if err != nil { + err = &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + return n, err + default: + n := 1 + err := c.RecvMsg(&ms[0], flags) + if err != nil { + n = 0 + err = &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + return n, err + } +} + +// WriteBatch writes a batch of messages. +// +// The provided flags is a set of platform-dependent flags, such as +// syscall.MSG_DONTROUTE. +// +// It returns the number of messages written on a successful write. +// +// On Linux, a batch write will be optimized. +// On other platforms, this method will write only a single message. +func (c *payloadHandler) WriteBatch(ms []Message, flags int) (int, error) { + if !c.ok() { + return 0, syscall.EINVAL + } + switch runtime.GOOS { + case "linux": + n, err := c.SendMsgs([]socket.Message(ms), flags) + if err != nil { + err = &net.OpError{Op: "write", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + return n, err + default: + n := 1 + err := c.SendMsg(&ms[0], flags) + if err != nil { + n = 0 + err = &net.OpError{Op: "write", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + return n, err + } +} diff --git a/api/vendor/golang.org/x/net/ipv6/bpf_test.go b/api/vendor/golang.org/x/net/ipv6/bpf_test.go new file mode 100644 index 0000000..8253e1f --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/bpf_test.go @@ -0,0 +1,96 @@ +// 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 ipv6_test + +import ( + "net" + "runtime" + "testing" + "time" + + "golang.org/x/net/bpf" + "golang.org/x/net/ipv6" +) + +func TestBPF(t *testing.T) { + if runtime.GOOS != "linux" { + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + + l, err := net.ListenPacket("udp6", "[::1]:0") + if err != nil { + t.Fatal(err) + } + defer l.Close() + + p := ipv6.NewPacketConn(l) + + // This filter accepts UDP packets whose first payload byte is + // even. + prog, err := bpf.Assemble([]bpf.Instruction{ + // Load the first byte of the payload (skipping UDP header). + bpf.LoadAbsolute{Off: 8, Size: 1}, + // Select LSB of the byte. + bpf.ALUOpConstant{Op: bpf.ALUOpAnd, Val: 1}, + // Byte is even? + bpf.JumpIf{Cond: bpf.JumpEqual, Val: 0, SkipFalse: 1}, + // Accept. + bpf.RetConstant{Val: 4096}, + // Ignore. + bpf.RetConstant{Val: 0}, + }) + if err != nil { + t.Fatalf("compiling BPF: %s", err) + } + + if err = p.SetBPF(prog); err != nil { + t.Fatalf("attaching filter to Conn: %s", err) + } + + s, err := net.Dial("udp6", l.LocalAddr().String()) + if err != nil { + t.Fatal(err) + } + defer s.Close() + go func() { + for i := byte(0); i < 10; i++ { + s.Write([]byte{i}) + } + }() + + l.SetDeadline(time.Now().Add(2 * time.Second)) + seen := make([]bool, 5) + for { + var b [512]byte + n, _, err := l.ReadFrom(b[:]) + if err != nil { + t.Fatalf("reading from listener: %s", err) + } + if n != 1 { + t.Fatalf("unexpected packet length, want 1, got %d", n) + } + if b[0] >= 10 { + t.Fatalf("unexpected byte, want 0-9, got %d", b[0]) + } + if b[0]%2 != 0 { + t.Fatalf("got odd byte %d, wanted only even bytes", b[0]) + } + seen[b[0]/2] = true + + seenAll := true + for _, v := range seen { + if !v { + seenAll = false + break + } + } + if seenAll { + break + } + } +} diff --git a/api/vendor/golang.org/x/net/ipv6/control.go b/api/vendor/golang.org/x/net/ipv6/control.go new file mode 100644 index 0000000..2da6444 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/control.go @@ -0,0 +1,187 @@ +// 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 ipv6 + +import ( + "fmt" + "net" + "sync" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +// Note that RFC 3542 obsoletes RFC 2292 but OS X Snow Leopard and the +// former still support RFC 2292 only. Please be aware that almost +// all protocol implementations prohibit using a combination of RFC +// 2292 and RFC 3542 for some practical reasons. + +type rawOpt struct { + sync.RWMutex + cflags ControlFlags +} + +func (c *rawOpt) set(f ControlFlags) { c.cflags |= f } +func (c *rawOpt) clear(f ControlFlags) { c.cflags &^= f } +func (c *rawOpt) isset(f ControlFlags) bool { return c.cflags&f != 0 } + +// A ControlFlags represents per packet basis IP-level socket option +// control flags. +type ControlFlags uint + +const ( + FlagTrafficClass ControlFlags = 1 << iota // pass the traffic class on the received packet + FlagHopLimit // pass the hop limit on the received packet + FlagSrc // pass the source address on the received packet + FlagDst // pass the destination address on the received packet + FlagInterface // pass the interface index on the received packet + FlagPathMTU // pass the path MTU on the received packet path +) + +const flagPacketInfo = FlagDst | FlagInterface + +// A ControlMessage represents per packet basis IP-level socket +// options. +type ControlMessage struct { + // Receiving socket options: SetControlMessage allows to + // receive the options from the protocol stack using ReadFrom + // method of PacketConn. + // + // Specifying socket options: ControlMessage for WriteTo + // method of PacketConn allows to send the options to the + // protocol stack. + // + TrafficClass int // traffic class, must be 1 <= value <= 255 when specifying + HopLimit int // hop limit, must be 1 <= value <= 255 when specifying + Src net.IP // source address, specifying only + Dst net.IP // destination address, receiving only + IfIndex int // interface index, must be 1 <= value when specifying + NextHop net.IP // next hop address, specifying only + MTU int // path MTU, receiving only +} + +func (cm *ControlMessage) String() string { + if cm == nil { + return "" + } + return fmt.Sprintf("tclass=%#x hoplim=%d src=%v dst=%v ifindex=%d nexthop=%v mtu=%d", cm.TrafficClass, cm.HopLimit, cm.Src, cm.Dst, cm.IfIndex, cm.NextHop, cm.MTU) +} + +// Marshal returns the binary encoding of cm. +func (cm *ControlMessage) Marshal() []byte { + if cm == nil { + return nil + } + var l int + tclass := false + if ctlOpts[ctlTrafficClass].name > 0 && cm.TrafficClass > 0 { + tclass = true + l += socket.ControlMessageSpace(ctlOpts[ctlTrafficClass].length) + } + hoplimit := false + if ctlOpts[ctlHopLimit].name > 0 && cm.HopLimit > 0 { + hoplimit = true + l += socket.ControlMessageSpace(ctlOpts[ctlHopLimit].length) + } + pktinfo := false + if ctlOpts[ctlPacketInfo].name > 0 && (cm.Src.To16() != nil && cm.Src.To4() == nil || cm.IfIndex > 0) { + pktinfo = true + l += socket.ControlMessageSpace(ctlOpts[ctlPacketInfo].length) + } + nexthop := false + if ctlOpts[ctlNextHop].name > 0 && cm.NextHop.To16() != nil && cm.NextHop.To4() == nil { + nexthop = true + l += socket.ControlMessageSpace(ctlOpts[ctlNextHop].length) + } + var b []byte + if l > 0 { + b = make([]byte, l) + bb := b + if tclass { + bb = ctlOpts[ctlTrafficClass].marshal(bb, cm) + } + if hoplimit { + bb = ctlOpts[ctlHopLimit].marshal(bb, cm) + } + if pktinfo { + bb = ctlOpts[ctlPacketInfo].marshal(bb, cm) + } + if nexthop { + bb = ctlOpts[ctlNextHop].marshal(bb, cm) + } + } + return b +} + +// Parse parses b as a control message and stores the result in cm. +func (cm *ControlMessage) Parse(b []byte) error { + ms, err := socket.ControlMessage(b).Parse() + if err != nil { + return err + } + for _, m := range ms { + lvl, typ, l, err := m.ParseHeader() + if err != nil { + return err + } + if lvl != iana.ProtocolIPv6 { + continue + } + switch { + case typ == ctlOpts[ctlTrafficClass].name && l >= ctlOpts[ctlTrafficClass].length: + ctlOpts[ctlTrafficClass].parse(cm, m.Data(l)) + case typ == ctlOpts[ctlHopLimit].name && l >= ctlOpts[ctlHopLimit].length: + ctlOpts[ctlHopLimit].parse(cm, m.Data(l)) + case typ == ctlOpts[ctlPacketInfo].name && l >= ctlOpts[ctlPacketInfo].length: + ctlOpts[ctlPacketInfo].parse(cm, m.Data(l)) + case typ == ctlOpts[ctlPathMTU].name && l >= ctlOpts[ctlPathMTU].length: + ctlOpts[ctlPathMTU].parse(cm, m.Data(l)) + } + } + return nil +} + +// NewControlMessage returns a new control message. +// +// The returned message is large enough for options specified by cf. +func NewControlMessage(cf ControlFlags) []byte { + opt := rawOpt{cflags: cf} + var l int + if opt.isset(FlagTrafficClass) && ctlOpts[ctlTrafficClass].name > 0 { + l += socket.ControlMessageSpace(ctlOpts[ctlTrafficClass].length) + } + if opt.isset(FlagHopLimit) && ctlOpts[ctlHopLimit].name > 0 { + l += socket.ControlMessageSpace(ctlOpts[ctlHopLimit].length) + } + if opt.isset(flagPacketInfo) && ctlOpts[ctlPacketInfo].name > 0 { + l += socket.ControlMessageSpace(ctlOpts[ctlPacketInfo].length) + } + if opt.isset(FlagPathMTU) && ctlOpts[ctlPathMTU].name > 0 { + l += socket.ControlMessageSpace(ctlOpts[ctlPathMTU].length) + } + var b []byte + if l > 0 { + b = make([]byte, l) + } + return b +} + +// Ancillary data socket options +const ( + ctlTrafficClass = iota // header field + ctlHopLimit // header field + ctlPacketInfo // inbound or outbound packet path + ctlNextHop // nexthop + ctlPathMTU // path mtu + ctlMax +) + +// A ctlOpt represents a binding for ancillary data socket option. +type ctlOpt struct { + name int // option name, must be equal or greater than 1 + length int // option length + marshal func([]byte, *ControlMessage) []byte + parse func(*ControlMessage, []byte) +} diff --git a/api/vendor/golang.org/x/net/ipv6/control_rfc2292_unix.go b/api/vendor/golang.org/x/net/ipv6/control_rfc2292_unix.go new file mode 100644 index 0000000..9fd9eb1 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/control_rfc2292_unix.go @@ -0,0 +1,48 @@ +// 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. + +// +build darwin + +package ipv6 + +import ( + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +func marshal2292HopLimit(b []byte, cm *ControlMessage) []byte { + m := socket.ControlMessage(b) + m.MarshalHeader(iana.ProtocolIPv6, sysIPV6_2292HOPLIMIT, 4) + if cm != nil { + socket.NativeEndian.PutUint32(m.Data(4), uint32(cm.HopLimit)) + } + return m.Next(4) +} + +func marshal2292PacketInfo(b []byte, cm *ControlMessage) []byte { + m := socket.ControlMessage(b) + m.MarshalHeader(iana.ProtocolIPv6, sysIPV6_2292PKTINFO, sizeofInet6Pktinfo) + if cm != nil { + pi := (*inet6Pktinfo)(unsafe.Pointer(&m.Data(sizeofInet6Pktinfo)[0])) + if ip := cm.Src.To16(); ip != nil && ip.To4() == nil { + copy(pi.Addr[:], ip) + } + if cm.IfIndex > 0 { + pi.setIfindex(cm.IfIndex) + } + } + return m.Next(sizeofInet6Pktinfo) +} + +func marshal2292NextHop(b []byte, cm *ControlMessage) []byte { + m := socket.ControlMessage(b) + m.MarshalHeader(iana.ProtocolIPv6, sysIPV6_2292NEXTHOP, sizeofSockaddrInet6) + if cm != nil { + sa := (*sockaddrInet6)(unsafe.Pointer(&m.Data(sizeofSockaddrInet6)[0])) + sa.setSockaddr(cm.NextHop, cm.IfIndex) + } + return m.Next(sizeofSockaddrInet6) +} diff --git a/api/vendor/golang.org/x/net/ipv6/control_rfc3542_unix.go b/api/vendor/golang.org/x/net/ipv6/control_rfc3542_unix.go new file mode 100644 index 0000000..eec529c --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/control_rfc3542_unix.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. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +package ipv6 + +import ( + "net" + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +func marshalTrafficClass(b []byte, cm *ControlMessage) []byte { + m := socket.ControlMessage(b) + m.MarshalHeader(iana.ProtocolIPv6, sysIPV6_TCLASS, 4) + if cm != nil { + socket.NativeEndian.PutUint32(m.Data(4), uint32(cm.TrafficClass)) + } + return m.Next(4) +} + +func parseTrafficClass(cm *ControlMessage, b []byte) { + cm.TrafficClass = int(socket.NativeEndian.Uint32(b[:4])) +} + +func marshalHopLimit(b []byte, cm *ControlMessage) []byte { + m := socket.ControlMessage(b) + m.MarshalHeader(iana.ProtocolIPv6, sysIPV6_HOPLIMIT, 4) + if cm != nil { + socket.NativeEndian.PutUint32(m.Data(4), uint32(cm.HopLimit)) + } + return m.Next(4) +} + +func parseHopLimit(cm *ControlMessage, b []byte) { + cm.HopLimit = int(socket.NativeEndian.Uint32(b[:4])) +} + +func marshalPacketInfo(b []byte, cm *ControlMessage) []byte { + m := socket.ControlMessage(b) + m.MarshalHeader(iana.ProtocolIPv6, sysIPV6_PKTINFO, sizeofInet6Pktinfo) + if cm != nil { + pi := (*inet6Pktinfo)(unsafe.Pointer(&m.Data(sizeofInet6Pktinfo)[0])) + if ip := cm.Src.To16(); ip != nil && ip.To4() == nil { + copy(pi.Addr[:], ip) + } + if cm.IfIndex > 0 { + pi.setIfindex(cm.IfIndex) + } + } + return m.Next(sizeofInet6Pktinfo) +} + +func parsePacketInfo(cm *ControlMessage, b []byte) { + pi := (*inet6Pktinfo)(unsafe.Pointer(&b[0])) + if len(cm.Dst) < net.IPv6len { + cm.Dst = make(net.IP, net.IPv6len) + } + copy(cm.Dst, pi.Addr[:]) + cm.IfIndex = int(pi.Ifindex) +} + +func marshalNextHop(b []byte, cm *ControlMessage) []byte { + m := socket.ControlMessage(b) + m.MarshalHeader(iana.ProtocolIPv6, sysIPV6_NEXTHOP, sizeofSockaddrInet6) + if cm != nil { + sa := (*sockaddrInet6)(unsafe.Pointer(&m.Data(sizeofSockaddrInet6)[0])) + sa.setSockaddr(cm.NextHop, cm.IfIndex) + } + return m.Next(sizeofSockaddrInet6) +} + +func parseNextHop(cm *ControlMessage, b []byte) { +} + +func marshalPathMTU(b []byte, cm *ControlMessage) []byte { + m := socket.ControlMessage(b) + m.MarshalHeader(iana.ProtocolIPv6, sysIPV6_PATHMTU, sizeofIPv6Mtuinfo) + return m.Next(sizeofIPv6Mtuinfo) +} + +func parsePathMTU(cm *ControlMessage, b []byte) { + mi := (*ipv6Mtuinfo)(unsafe.Pointer(&b[0])) + if len(cm.Dst) < net.IPv6len { + cm.Dst = make(net.IP, net.IPv6len) + } + copy(cm.Dst, mi.Addr.Addr[:]) + cm.IfIndex = int(mi.Addr.Scope_id) + cm.MTU = int(mi.Mtu) +} diff --git a/api/vendor/golang.org/x/net/ipv6/control_stub.go b/api/vendor/golang.org/x/net/ipv6/control_stub.go new file mode 100644 index 0000000..a045f28 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/control_stub.go @@ -0,0 +1,13 @@ +// 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. + +// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows + +package ipv6 + +import "golang.org/x/net/internal/socket" + +func setControlMessage(c *socket.Conn, opt *rawOpt, cf ControlFlags, on bool) error { + return errOpNoSupport +} diff --git a/api/vendor/golang.org/x/net/ipv6/control_test.go b/api/vendor/golang.org/x/net/ipv6/control_test.go new file mode 100644 index 0000000..c186ca9 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/control_test.go @@ -0,0 +1,21 @@ +// 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 ipv6_test + +import ( + "testing" + + "golang.org/x/net/ipv6" +) + +func TestControlMessageParseWithFuzz(t *testing.T) { + var cm ipv6.ControlMessage + for _, fuzz := range []string{ + "\f\x00\x00\x00)\x00\x00\x00.\x00\x00\x00", + "\f\x00\x00\x00)\x00\x00\x00,\x00\x00\x00", + } { + cm.Parse([]byte(fuzz)) + } +} diff --git a/api/vendor/golang.org/x/net/ipv6/control_unix.go b/api/vendor/golang.org/x/net/ipv6/control_unix.go new file mode 100644 index 0000000..6651506 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/control_unix.go @@ -0,0 +1,55 @@ +// 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +package ipv6 + +import "golang.org/x/net/internal/socket" + +func setControlMessage(c *socket.Conn, opt *rawOpt, cf ControlFlags, on bool) error { + opt.Lock() + defer opt.Unlock() + if so, ok := sockOpts[ssoReceiveTrafficClass]; ok && cf&FlagTrafficClass != 0 { + if err := so.SetInt(c, boolint(on)); err != nil { + return err + } + if on { + opt.set(FlagTrafficClass) + } else { + opt.clear(FlagTrafficClass) + } + } + if so, ok := sockOpts[ssoReceiveHopLimit]; ok && cf&FlagHopLimit != 0 { + if err := so.SetInt(c, boolint(on)); err != nil { + return err + } + if on { + opt.set(FlagHopLimit) + } else { + opt.clear(FlagHopLimit) + } + } + if so, ok := sockOpts[ssoReceivePacketInfo]; ok && cf&flagPacketInfo != 0 { + if err := so.SetInt(c, boolint(on)); err != nil { + return err + } + if on { + opt.set(cf & flagPacketInfo) + } else { + opt.clear(cf & flagPacketInfo) + } + } + if so, ok := sockOpts[ssoReceivePathMTU]; ok && cf&FlagPathMTU != 0 { + if err := so.SetInt(c, boolint(on)); err != nil { + return err + } + if on { + opt.set(FlagPathMTU) + } else { + opt.clear(FlagPathMTU) + } + } + return nil +} diff --git a/api/vendor/golang.org/x/net/ipv6/control_windows.go b/api/vendor/golang.org/x/net/ipv6/control_windows.go new file mode 100644 index 0000000..ef2563b --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/control_windows.go @@ -0,0 +1,16 @@ +// 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 ipv6 + +import ( + "syscall" + + "golang.org/x/net/internal/socket" +) + +func setControlMessage(c *socket.Conn, opt *rawOpt, cf ControlFlags, on bool) error { + // TODO(mikio): implement this + return syscall.EWINDOWS +} diff --git a/api/vendor/golang.org/x/net/ipv6/defs_darwin.go b/api/vendor/golang.org/x/net/ipv6/defs_darwin.go new file mode 100644 index 0000000..55ddc11 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/defs_darwin.go @@ -0,0 +1,112 @@ +// 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. + +// +build ignore + +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package ipv6 + +/* +#define __APPLE_USE_RFC_3542 +#include +#include +*/ +import "C" + +const ( + sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS + sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF + sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS + sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP + sysIPV6_JOIN_GROUP = C.IPV6_JOIN_GROUP + sysIPV6_LEAVE_GROUP = C.IPV6_LEAVE_GROUP + + sysIPV6_PORTRANGE = C.IPV6_PORTRANGE + sysICMP6_FILTER = C.ICMP6_FILTER + sysIPV6_2292PKTINFO = C.IPV6_2292PKTINFO + sysIPV6_2292HOPLIMIT = C.IPV6_2292HOPLIMIT + sysIPV6_2292NEXTHOP = C.IPV6_2292NEXTHOP + sysIPV6_2292HOPOPTS = C.IPV6_2292HOPOPTS + sysIPV6_2292DSTOPTS = C.IPV6_2292DSTOPTS + sysIPV6_2292RTHDR = C.IPV6_2292RTHDR + + sysIPV6_2292PKTOPTIONS = C.IPV6_2292PKTOPTIONS + + sysIPV6_CHECKSUM = C.IPV6_CHECKSUM + sysIPV6_V6ONLY = C.IPV6_V6ONLY + + sysIPV6_IPSEC_POLICY = C.IPV6_IPSEC_POLICY + + sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS + sysIPV6_TCLASS = C.IPV6_TCLASS + + sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS + + sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO + + sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT + sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR + sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS + sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS + + sysIPV6_USE_MIN_MTU = C.IPV6_USE_MIN_MTU + sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU + + sysIPV6_PATHMTU = C.IPV6_PATHMTU + + sysIPV6_PKTINFO = C.IPV6_PKTINFO + sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT + sysIPV6_NEXTHOP = C.IPV6_NEXTHOP + sysIPV6_HOPOPTS = C.IPV6_HOPOPTS + sysIPV6_DSTOPTS = C.IPV6_DSTOPTS + sysIPV6_RTHDR = C.IPV6_RTHDR + + sysIPV6_AUTOFLOWLABEL = C.IPV6_AUTOFLOWLABEL + + sysIPV6_DONTFRAG = C.IPV6_DONTFRAG + + sysIPV6_PREFER_TEMPADDR = C.IPV6_PREFER_TEMPADDR + + sysIPV6_MSFILTER = C.IPV6_MSFILTER + sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP + sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP + sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP + sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP + sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE + sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE + + sysIPV6_BOUND_IF = C.IPV6_BOUND_IF + + sysIPV6_PORTRANGE_DEFAULT = C.IPV6_PORTRANGE_DEFAULT + sysIPV6_PORTRANGE_HIGH = C.IPV6_PORTRANGE_HIGH + sysIPV6_PORTRANGE_LOW = C.IPV6_PORTRANGE_LOW + + sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + sizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + sizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo + + sizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + sizeofGroupReq = C.sizeof_struct_group_req + sizeofGroupSourceReq = C.sizeof_struct_group_source_req + + sizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +type sockaddrStorage C.struct_sockaddr_storage + +type sockaddrInet6 C.struct_sockaddr_in6 + +type inet6Pktinfo C.struct_in6_pktinfo + +type ipv6Mtuinfo C.struct_ip6_mtuinfo + +type ipv6Mreq C.struct_ipv6_mreq + +type icmpv6Filter C.struct_icmp6_filter + +type groupReq C.struct_group_req + +type groupSourceReq C.struct_group_source_req diff --git a/api/vendor/golang.org/x/net/ipv6/defs_dragonfly.go b/api/vendor/golang.org/x/net/ipv6/defs_dragonfly.go new file mode 100644 index 0000000..a4c383a --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/defs_dragonfly.go @@ -0,0 +1,84 @@ +// 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. + +// +build ignore + +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package ipv6 + +/* +#include +#include + +#include +#include +*/ +import "C" + +const ( + sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS + sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF + sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS + sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP + sysIPV6_JOIN_GROUP = C.IPV6_JOIN_GROUP + sysIPV6_LEAVE_GROUP = C.IPV6_LEAVE_GROUP + sysIPV6_PORTRANGE = C.IPV6_PORTRANGE + sysICMP6_FILTER = C.ICMP6_FILTER + + sysIPV6_CHECKSUM = C.IPV6_CHECKSUM + sysIPV6_V6ONLY = C.IPV6_V6ONLY + + sysIPV6_IPSEC_POLICY = C.IPV6_IPSEC_POLICY + + sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS + sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO + sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT + sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR + sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS + sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS + + sysIPV6_USE_MIN_MTU = C.IPV6_USE_MIN_MTU + sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU + + sysIPV6_PATHMTU = C.IPV6_PATHMTU + + sysIPV6_PKTINFO = C.IPV6_PKTINFO + sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT + sysIPV6_NEXTHOP = C.IPV6_NEXTHOP + sysIPV6_HOPOPTS = C.IPV6_HOPOPTS + sysIPV6_DSTOPTS = C.IPV6_DSTOPTS + sysIPV6_RTHDR = C.IPV6_RTHDR + + sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS + + sysIPV6_AUTOFLOWLABEL = C.IPV6_AUTOFLOWLABEL + + sysIPV6_TCLASS = C.IPV6_TCLASS + sysIPV6_DONTFRAG = C.IPV6_DONTFRAG + + sysIPV6_PREFER_TEMPADDR = C.IPV6_PREFER_TEMPADDR + + sysIPV6_PORTRANGE_DEFAULT = C.IPV6_PORTRANGE_DEFAULT + sysIPV6_PORTRANGE_HIGH = C.IPV6_PORTRANGE_HIGH + sysIPV6_PORTRANGE_LOW = C.IPV6_PORTRANGE_LOW + + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + sizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + sizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo + + sizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + + sizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +type sockaddrInet6 C.struct_sockaddr_in6 + +type inet6Pktinfo C.struct_in6_pktinfo + +type ipv6Mtuinfo C.struct_ip6_mtuinfo + +type ipv6Mreq C.struct_ipv6_mreq + +type icmpv6Filter C.struct_icmp6_filter diff --git a/api/vendor/golang.org/x/net/ipv6/defs_freebsd.go b/api/vendor/golang.org/x/net/ipv6/defs_freebsd.go new file mode 100644 index 0000000..53e6253 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/defs_freebsd.go @@ -0,0 +1,105 @@ +// 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. + +// +build ignore + +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package ipv6 + +/* +#include +#include + +#include +#include +*/ +import "C" + +const ( + sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS + sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF + sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS + sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP + sysIPV6_JOIN_GROUP = C.IPV6_JOIN_GROUP + sysIPV6_LEAVE_GROUP = C.IPV6_LEAVE_GROUP + sysIPV6_PORTRANGE = C.IPV6_PORTRANGE + sysICMP6_FILTER = C.ICMP6_FILTER + + sysIPV6_CHECKSUM = C.IPV6_CHECKSUM + sysIPV6_V6ONLY = C.IPV6_V6ONLY + + sysIPV6_IPSEC_POLICY = C.IPV6_IPSEC_POLICY + + sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS + + sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO + sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT + sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR + sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS + sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS + + sysIPV6_USE_MIN_MTU = C.IPV6_USE_MIN_MTU + sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU + + sysIPV6_PATHMTU = C.IPV6_PATHMTU + + sysIPV6_PKTINFO = C.IPV6_PKTINFO + sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT + sysIPV6_NEXTHOP = C.IPV6_NEXTHOP + sysIPV6_HOPOPTS = C.IPV6_HOPOPTS + sysIPV6_DSTOPTS = C.IPV6_DSTOPTS + sysIPV6_RTHDR = C.IPV6_RTHDR + + sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS + + sysIPV6_AUTOFLOWLABEL = C.IPV6_AUTOFLOWLABEL + + sysIPV6_TCLASS = C.IPV6_TCLASS + sysIPV6_DONTFRAG = C.IPV6_DONTFRAG + + sysIPV6_PREFER_TEMPADDR = C.IPV6_PREFER_TEMPADDR + + sysIPV6_BINDANY = C.IPV6_BINDANY + + sysIPV6_MSFILTER = C.IPV6_MSFILTER + + sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP + sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP + sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP + sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP + sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE + sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE + + sysIPV6_PORTRANGE_DEFAULT = C.IPV6_PORTRANGE_DEFAULT + sysIPV6_PORTRANGE_HIGH = C.IPV6_PORTRANGE_HIGH + sysIPV6_PORTRANGE_LOW = C.IPV6_PORTRANGE_LOW + + sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + sizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + sizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo + + sizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + sizeofGroupReq = C.sizeof_struct_group_req + sizeofGroupSourceReq = C.sizeof_struct_group_source_req + + sizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +type sockaddrStorage C.struct_sockaddr_storage + +type sockaddrInet6 C.struct_sockaddr_in6 + +type inet6Pktinfo C.struct_in6_pktinfo + +type ipv6Mtuinfo C.struct_ip6_mtuinfo + +type ipv6Mreq C.struct_ipv6_mreq + +type groupReq C.struct_group_req + +type groupSourceReq C.struct_group_source_req + +type icmpv6Filter C.struct_icmp6_filter diff --git a/api/vendor/golang.org/x/net/ipv6/defs_linux.go b/api/vendor/golang.org/x/net/ipv6/defs_linux.go new file mode 100644 index 0000000..3308cb2 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/defs_linux.go @@ -0,0 +1,147 @@ +// 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. + +// +build ignore + +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package ipv6 + +/* +#include +#include +#include +#include +#include +#include +*/ +import "C" + +const ( + sysIPV6_ADDRFORM = C.IPV6_ADDRFORM + sysIPV6_2292PKTINFO = C.IPV6_2292PKTINFO + sysIPV6_2292HOPOPTS = C.IPV6_2292HOPOPTS + sysIPV6_2292DSTOPTS = C.IPV6_2292DSTOPTS + sysIPV6_2292RTHDR = C.IPV6_2292RTHDR + sysIPV6_2292PKTOPTIONS = C.IPV6_2292PKTOPTIONS + sysIPV6_CHECKSUM = C.IPV6_CHECKSUM + sysIPV6_2292HOPLIMIT = C.IPV6_2292HOPLIMIT + sysIPV6_NEXTHOP = C.IPV6_NEXTHOP + sysIPV6_FLOWINFO = C.IPV6_FLOWINFO + + sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS + sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF + sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS + sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP + sysIPV6_ADD_MEMBERSHIP = C.IPV6_ADD_MEMBERSHIP + sysIPV6_DROP_MEMBERSHIP = C.IPV6_DROP_MEMBERSHIP + sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP + sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP + sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP + sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP + sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE + sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE + sysMCAST_MSFILTER = C.MCAST_MSFILTER + sysIPV6_ROUTER_ALERT = C.IPV6_ROUTER_ALERT + sysIPV6_MTU_DISCOVER = C.IPV6_MTU_DISCOVER + sysIPV6_MTU = C.IPV6_MTU + sysIPV6_RECVERR = C.IPV6_RECVERR + sysIPV6_V6ONLY = C.IPV6_V6ONLY + sysIPV6_JOIN_ANYCAST = C.IPV6_JOIN_ANYCAST + sysIPV6_LEAVE_ANYCAST = C.IPV6_LEAVE_ANYCAST + + //sysIPV6_PMTUDISC_DONT = C.IPV6_PMTUDISC_DONT + //sysIPV6_PMTUDISC_WANT = C.IPV6_PMTUDISC_WANT + //sysIPV6_PMTUDISC_DO = C.IPV6_PMTUDISC_DO + //sysIPV6_PMTUDISC_PROBE = C.IPV6_PMTUDISC_PROBE + //sysIPV6_PMTUDISC_INTERFACE = C.IPV6_PMTUDISC_INTERFACE + //sysIPV6_PMTUDISC_OMIT = C.IPV6_PMTUDISC_OMIT + + sysIPV6_FLOWLABEL_MGR = C.IPV6_FLOWLABEL_MGR + sysIPV6_FLOWINFO_SEND = C.IPV6_FLOWINFO_SEND + + sysIPV6_IPSEC_POLICY = C.IPV6_IPSEC_POLICY + sysIPV6_XFRM_POLICY = C.IPV6_XFRM_POLICY + + sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO + sysIPV6_PKTINFO = C.IPV6_PKTINFO + sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT + sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT + sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS + sysIPV6_HOPOPTS = C.IPV6_HOPOPTS + sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS + sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR + sysIPV6_RTHDR = C.IPV6_RTHDR + sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS + sysIPV6_DSTOPTS = C.IPV6_DSTOPTS + sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU + sysIPV6_PATHMTU = C.IPV6_PATHMTU + sysIPV6_DONTFRAG = C.IPV6_DONTFRAG + + sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS + sysIPV6_TCLASS = C.IPV6_TCLASS + + sysIPV6_ADDR_PREFERENCES = C.IPV6_ADDR_PREFERENCES + + sysIPV6_PREFER_SRC_TMP = C.IPV6_PREFER_SRC_TMP + sysIPV6_PREFER_SRC_PUBLIC = C.IPV6_PREFER_SRC_PUBLIC + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = C.IPV6_PREFER_SRC_PUBTMP_DEFAULT + sysIPV6_PREFER_SRC_COA = C.IPV6_PREFER_SRC_COA + sysIPV6_PREFER_SRC_HOME = C.IPV6_PREFER_SRC_HOME + sysIPV6_PREFER_SRC_CGA = C.IPV6_PREFER_SRC_CGA + sysIPV6_PREFER_SRC_NONCGA = C.IPV6_PREFER_SRC_NONCGA + + sysIPV6_MINHOPCOUNT = C.IPV6_MINHOPCOUNT + + sysIPV6_ORIGDSTADDR = C.IPV6_ORIGDSTADDR + sysIPV6_RECVORIGDSTADDR = C.IPV6_RECVORIGDSTADDR + sysIPV6_TRANSPARENT = C.IPV6_TRANSPARENT + sysIPV6_UNICAST_IF = C.IPV6_UNICAST_IF + + sysICMPV6_FILTER = C.ICMPV6_FILTER + + sysICMPV6_FILTER_BLOCK = C.ICMPV6_FILTER_BLOCK + sysICMPV6_FILTER_PASS = C.ICMPV6_FILTER_PASS + sysICMPV6_FILTER_BLOCKOTHERS = C.ICMPV6_FILTER_BLOCKOTHERS + sysICMPV6_FILTER_PASSONLY = C.ICMPV6_FILTER_PASSONLY + + sysSOL_SOCKET = C.SOL_SOCKET + sysSO_ATTACH_FILTER = C.SO_ATTACH_FILTER + + sizeofKernelSockaddrStorage = C.sizeof_struct___kernel_sockaddr_storage + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + sizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + sizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo + sizeofIPv6FlowlabelReq = C.sizeof_struct_in6_flowlabel_req + + sizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + sizeofGroupReq = C.sizeof_struct_group_req + sizeofGroupSourceReq = C.sizeof_struct_group_source_req + + sizeofICMPv6Filter = C.sizeof_struct_icmp6_filter + + sizeofSockFprog = C.sizeof_struct_sock_fprog +) + +type kernelSockaddrStorage C.struct___kernel_sockaddr_storage + +type sockaddrInet6 C.struct_sockaddr_in6 + +type inet6Pktinfo C.struct_in6_pktinfo + +type ipv6Mtuinfo C.struct_ip6_mtuinfo + +type ipv6FlowlabelReq C.struct_in6_flowlabel_req + +type ipv6Mreq C.struct_ipv6_mreq + +type groupReq C.struct_group_req + +type groupSourceReq C.struct_group_source_req + +type icmpv6Filter C.struct_icmp6_filter + +type sockFProg C.struct_sock_fprog + +type sockFilter C.struct_sock_filter diff --git a/api/vendor/golang.org/x/net/ipv6/defs_netbsd.go b/api/vendor/golang.org/x/net/ipv6/defs_netbsd.go new file mode 100644 index 0000000..be9ceb9 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/defs_netbsd.go @@ -0,0 +1,80 @@ +// 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. + +// +build ignore + +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package ipv6 + +/* +#include +#include + +#include +#include +*/ +import "C" + +const ( + sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS + sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF + sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS + sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP + sysIPV6_JOIN_GROUP = C.IPV6_JOIN_GROUP + sysIPV6_LEAVE_GROUP = C.IPV6_LEAVE_GROUP + sysIPV6_PORTRANGE = C.IPV6_PORTRANGE + sysICMP6_FILTER = C.ICMP6_FILTER + + sysIPV6_CHECKSUM = C.IPV6_CHECKSUM + sysIPV6_V6ONLY = C.IPV6_V6ONLY + + sysIPV6_IPSEC_POLICY = C.IPV6_IPSEC_POLICY + + sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS + + sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO + sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT + sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR + sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS + sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS + + sysIPV6_USE_MIN_MTU = C.IPV6_USE_MIN_MTU + sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU + sysIPV6_PATHMTU = C.IPV6_PATHMTU + + sysIPV6_PKTINFO = C.IPV6_PKTINFO + sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT + sysIPV6_NEXTHOP = C.IPV6_NEXTHOP + sysIPV6_HOPOPTS = C.IPV6_HOPOPTS + sysIPV6_DSTOPTS = C.IPV6_DSTOPTS + sysIPV6_RTHDR = C.IPV6_RTHDR + + sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS + + sysIPV6_TCLASS = C.IPV6_TCLASS + sysIPV6_DONTFRAG = C.IPV6_DONTFRAG + + sysIPV6_PORTRANGE_DEFAULT = C.IPV6_PORTRANGE_DEFAULT + sysIPV6_PORTRANGE_HIGH = C.IPV6_PORTRANGE_HIGH + sysIPV6_PORTRANGE_LOW = C.IPV6_PORTRANGE_LOW + + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + sizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + sizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo + + sizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + + sizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +type sockaddrInet6 C.struct_sockaddr_in6 + +type inet6Pktinfo C.struct_in6_pktinfo + +type ipv6Mtuinfo C.struct_ip6_mtuinfo + +type ipv6Mreq C.struct_ipv6_mreq + +type icmpv6Filter C.struct_icmp6_filter diff --git a/api/vendor/golang.org/x/net/ipv6/defs_openbsd.go b/api/vendor/golang.org/x/net/ipv6/defs_openbsd.go new file mode 100644 index 0000000..177ddf8 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/defs_openbsd.go @@ -0,0 +1,89 @@ +// 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. + +// +build ignore + +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package ipv6 + +/* +#include +#include + +#include +#include +*/ +import "C" + +const ( + sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS + sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF + sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS + sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP + sysIPV6_JOIN_GROUP = C.IPV6_JOIN_GROUP + sysIPV6_LEAVE_GROUP = C.IPV6_LEAVE_GROUP + sysIPV6_PORTRANGE = C.IPV6_PORTRANGE + sysICMP6_FILTER = C.ICMP6_FILTER + + sysIPV6_CHECKSUM = C.IPV6_CHECKSUM + sysIPV6_V6ONLY = C.IPV6_V6ONLY + + sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS + + sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO + sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT + sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR + sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS + sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS + + sysIPV6_USE_MIN_MTU = C.IPV6_USE_MIN_MTU + sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU + + sysIPV6_PATHMTU = C.IPV6_PATHMTU + + sysIPV6_PKTINFO = C.IPV6_PKTINFO + sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT + sysIPV6_NEXTHOP = C.IPV6_NEXTHOP + sysIPV6_HOPOPTS = C.IPV6_HOPOPTS + sysIPV6_DSTOPTS = C.IPV6_DSTOPTS + sysIPV6_RTHDR = C.IPV6_RTHDR + + sysIPV6_AUTH_LEVEL = C.IPV6_AUTH_LEVEL + sysIPV6_ESP_TRANS_LEVEL = C.IPV6_ESP_TRANS_LEVEL + sysIPV6_ESP_NETWORK_LEVEL = C.IPV6_ESP_NETWORK_LEVEL + sysIPSEC6_OUTSA = C.IPSEC6_OUTSA + sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS + + sysIPV6_AUTOFLOWLABEL = C.IPV6_AUTOFLOWLABEL + sysIPV6_IPCOMP_LEVEL = C.IPV6_IPCOMP_LEVEL + + sysIPV6_TCLASS = C.IPV6_TCLASS + sysIPV6_DONTFRAG = C.IPV6_DONTFRAG + sysIPV6_PIPEX = C.IPV6_PIPEX + + sysIPV6_RTABLE = C.IPV6_RTABLE + + sysIPV6_PORTRANGE_DEFAULT = C.IPV6_PORTRANGE_DEFAULT + sysIPV6_PORTRANGE_HIGH = C.IPV6_PORTRANGE_HIGH + sysIPV6_PORTRANGE_LOW = C.IPV6_PORTRANGE_LOW + + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + sizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + sizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo + + sizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + + sizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +type sockaddrInet6 C.struct_sockaddr_in6 + +type inet6Pktinfo C.struct_in6_pktinfo + +type ipv6Mtuinfo C.struct_ip6_mtuinfo + +type ipv6Mreq C.struct_ipv6_mreq + +type icmpv6Filter C.struct_icmp6_filter diff --git a/api/vendor/golang.org/x/net/ipv6/defs_solaris.go b/api/vendor/golang.org/x/net/ipv6/defs_solaris.go new file mode 100644 index 0000000..0f8ce2b --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/defs_solaris.go @@ -0,0 +1,114 @@ +// 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. + +// +build ignore + +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package ipv6 + +/* +#include + +#include +#include +*/ +import "C" + +const ( + sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS + sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF + sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS + sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP + sysIPV6_JOIN_GROUP = C.IPV6_JOIN_GROUP + sysIPV6_LEAVE_GROUP = C.IPV6_LEAVE_GROUP + + sysIPV6_PKTINFO = C.IPV6_PKTINFO + + sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT + sysIPV6_NEXTHOP = C.IPV6_NEXTHOP + sysIPV6_HOPOPTS = C.IPV6_HOPOPTS + sysIPV6_DSTOPTS = C.IPV6_DSTOPTS + + sysIPV6_RTHDR = C.IPV6_RTHDR + sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS + + sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO + sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT + sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS + + sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR + + sysIPV6_RECVRTHDRDSTOPTS = C.IPV6_RECVRTHDRDSTOPTS + + sysIPV6_CHECKSUM = C.IPV6_CHECKSUM + sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS + sysIPV6_USE_MIN_MTU = C.IPV6_USE_MIN_MTU + sysIPV6_DONTFRAG = C.IPV6_DONTFRAG + sysIPV6_SEC_OPT = C.IPV6_SEC_OPT + sysIPV6_SRC_PREFERENCES = C.IPV6_SRC_PREFERENCES + sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU + sysIPV6_PATHMTU = C.IPV6_PATHMTU + sysIPV6_TCLASS = C.IPV6_TCLASS + sysIPV6_V6ONLY = C.IPV6_V6ONLY + + sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS + + sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP + sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP + sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE + sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE + sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP + sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP + + sysIPV6_PREFER_SRC_HOME = C.IPV6_PREFER_SRC_HOME + sysIPV6_PREFER_SRC_COA = C.IPV6_PREFER_SRC_COA + sysIPV6_PREFER_SRC_PUBLIC = C.IPV6_PREFER_SRC_PUBLIC + sysIPV6_PREFER_SRC_TMP = C.IPV6_PREFER_SRC_TMP + sysIPV6_PREFER_SRC_NONCGA = C.IPV6_PREFER_SRC_NONCGA + sysIPV6_PREFER_SRC_CGA = C.IPV6_PREFER_SRC_CGA + + sysIPV6_PREFER_SRC_MIPMASK = C.IPV6_PREFER_SRC_MIPMASK + sysIPV6_PREFER_SRC_MIPDEFAULT = C.IPV6_PREFER_SRC_MIPDEFAULT + sysIPV6_PREFER_SRC_TMPMASK = C.IPV6_PREFER_SRC_TMPMASK + sysIPV6_PREFER_SRC_TMPDEFAULT = C.IPV6_PREFER_SRC_TMPDEFAULT + sysIPV6_PREFER_SRC_CGAMASK = C.IPV6_PREFER_SRC_CGAMASK + sysIPV6_PREFER_SRC_CGADEFAULT = C.IPV6_PREFER_SRC_CGADEFAULT + + sysIPV6_PREFER_SRC_MASK = C.IPV6_PREFER_SRC_MASK + + sysIPV6_PREFER_SRC_DEFAULT = C.IPV6_PREFER_SRC_DEFAULT + + sysIPV6_BOUND_IF = C.IPV6_BOUND_IF + sysIPV6_UNSPEC_SRC = C.IPV6_UNSPEC_SRC + + sysICMP6_FILTER = C.ICMP6_FILTER + + sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + sizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + sizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo + + sizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + sizeofGroupReq = C.sizeof_struct_group_req + sizeofGroupSourceReq = C.sizeof_struct_group_source_req + + sizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +type sockaddrStorage C.struct_sockaddr_storage + +type sockaddrInet6 C.struct_sockaddr_in6 + +type inet6Pktinfo C.struct_in6_pktinfo + +type ipv6Mtuinfo C.struct_ip6_mtuinfo + +type ipv6Mreq C.struct_ipv6_mreq + +type groupReq C.struct_group_req + +type groupSourceReq C.struct_group_source_req + +type icmpv6Filter C.struct_icmp6_filter diff --git a/api/vendor/golang.org/x/net/ipv6/dgramopt.go b/api/vendor/golang.org/x/net/ipv6/dgramopt.go new file mode 100644 index 0000000..703dafe --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/dgramopt.go @@ -0,0 +1,302 @@ +// 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 ipv6 + +import ( + "net" + "syscall" + + "golang.org/x/net/bpf" +) + +// MulticastHopLimit returns the hop limit field value for outgoing +// multicast packets. +func (c *dgramOpt) MulticastHopLimit() (int, error) { + if !c.ok() { + return 0, syscall.EINVAL + } + so, ok := sockOpts[ssoMulticastHopLimit] + if !ok { + return 0, errOpNoSupport + } + return so.GetInt(c.Conn) +} + +// SetMulticastHopLimit sets the hop limit field value for future +// outgoing multicast packets. +func (c *dgramOpt) SetMulticastHopLimit(hoplim int) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoMulticastHopLimit] + if !ok { + return errOpNoSupport + } + return so.SetInt(c.Conn, hoplim) +} + +// MulticastInterface returns the default interface for multicast +// packet transmissions. +func (c *dgramOpt) MulticastInterface() (*net.Interface, error) { + if !c.ok() { + return nil, syscall.EINVAL + } + so, ok := sockOpts[ssoMulticastInterface] + if !ok { + return nil, errOpNoSupport + } + return so.getMulticastInterface(c.Conn) +} + +// SetMulticastInterface sets the default interface for future +// multicast packet transmissions. +func (c *dgramOpt) SetMulticastInterface(ifi *net.Interface) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoMulticastInterface] + if !ok { + return errOpNoSupport + } + return so.setMulticastInterface(c.Conn, ifi) +} + +// MulticastLoopback reports whether transmitted multicast packets +// should be copied and send back to the originator. +func (c *dgramOpt) MulticastLoopback() (bool, error) { + if !c.ok() { + return false, syscall.EINVAL + } + so, ok := sockOpts[ssoMulticastLoopback] + if !ok { + return false, errOpNoSupport + } + on, err := so.GetInt(c.Conn) + if err != nil { + return false, err + } + return on == 1, nil +} + +// SetMulticastLoopback sets whether transmitted multicast packets +// should be copied and send back to the originator. +func (c *dgramOpt) SetMulticastLoopback(on bool) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoMulticastLoopback] + if !ok { + return errOpNoSupport + } + return so.SetInt(c.Conn, boolint(on)) +} + +// JoinGroup joins the group address group on the interface ifi. +// By default all sources that can cast data to group are accepted. +// It's possible to mute and unmute data transmission from a specific +// source by using ExcludeSourceSpecificGroup and +// IncludeSourceSpecificGroup. +// JoinGroup uses the system assigned multicast interface when ifi is +// nil, although this is not recommended because the assignment +// depends on platforms and sometimes it might require routing +// configuration. +func (c *dgramOpt) JoinGroup(ifi *net.Interface, group net.Addr) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoJoinGroup] + if !ok { + return errOpNoSupport + } + grp := netAddrToIP16(group) + if grp == nil { + return errMissingAddress + } + return so.setGroup(c.Conn, ifi, grp) +} + +// LeaveGroup leaves the group address group on the interface ifi +// regardless of whether the group is any-source group or +// source-specific group. +func (c *dgramOpt) LeaveGroup(ifi *net.Interface, group net.Addr) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoLeaveGroup] + if !ok { + return errOpNoSupport + } + grp := netAddrToIP16(group) + if grp == nil { + return errMissingAddress + } + return so.setGroup(c.Conn, ifi, grp) +} + +// JoinSourceSpecificGroup joins the source-specific group comprising +// group and source on the interface ifi. +// JoinSourceSpecificGroup uses the system assigned multicast +// interface when ifi is nil, although this is not recommended because +// the assignment depends on platforms and sometimes it might require +// routing configuration. +func (c *dgramOpt) JoinSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoJoinSourceGroup] + if !ok { + return errOpNoSupport + } + grp := netAddrToIP16(group) + if grp == nil { + return errMissingAddress + } + src := netAddrToIP16(source) + if src == nil { + return errMissingAddress + } + return so.setSourceGroup(c.Conn, ifi, grp, src) +} + +// LeaveSourceSpecificGroup leaves the source-specific group on the +// interface ifi. +func (c *dgramOpt) LeaveSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoLeaveSourceGroup] + if !ok { + return errOpNoSupport + } + grp := netAddrToIP16(group) + if grp == nil { + return errMissingAddress + } + src := netAddrToIP16(source) + if src == nil { + return errMissingAddress + } + return so.setSourceGroup(c.Conn, ifi, grp, src) +} + +// ExcludeSourceSpecificGroup excludes the source-specific group from +// the already joined any-source groups by JoinGroup on the interface +// ifi. +func (c *dgramOpt) ExcludeSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoBlockSourceGroup] + if !ok { + return errOpNoSupport + } + grp := netAddrToIP16(group) + if grp == nil { + return errMissingAddress + } + src := netAddrToIP16(source) + if src == nil { + return errMissingAddress + } + return so.setSourceGroup(c.Conn, ifi, grp, src) +} + +// IncludeSourceSpecificGroup includes the excluded source-specific +// group by ExcludeSourceSpecificGroup again on the interface ifi. +func (c *dgramOpt) IncludeSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoUnblockSourceGroup] + if !ok { + return errOpNoSupport + } + grp := netAddrToIP16(group) + if grp == nil { + return errMissingAddress + } + src := netAddrToIP16(source) + if src == nil { + return errMissingAddress + } + return so.setSourceGroup(c.Conn, ifi, grp, src) +} + +// Checksum reports whether the kernel will compute, store or verify a +// checksum for both incoming and outgoing packets. If on is true, it +// returns an offset in bytes into the data of where the checksum +// field is located. +func (c *dgramOpt) Checksum() (on bool, offset int, err error) { + if !c.ok() { + return false, 0, syscall.EINVAL + } + so, ok := sockOpts[ssoChecksum] + if !ok { + return false, 0, errOpNoSupport + } + offset, err = so.GetInt(c.Conn) + if err != nil { + return false, 0, err + } + if offset < 0 { + return false, 0, nil + } + return true, offset, nil +} + +// SetChecksum enables the kernel checksum processing. If on is ture, +// the offset should be an offset in bytes into the data of where the +// checksum field is located. +func (c *dgramOpt) SetChecksum(on bool, offset int) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoChecksum] + if !ok { + return errOpNoSupport + } + if !on { + offset = -1 + } + return so.SetInt(c.Conn, offset) +} + +// ICMPFilter returns an ICMP filter. +func (c *dgramOpt) ICMPFilter() (*ICMPFilter, error) { + if !c.ok() { + return nil, syscall.EINVAL + } + so, ok := sockOpts[ssoICMPFilter] + if !ok { + return nil, errOpNoSupport + } + return so.getICMPFilter(c.Conn) +} + +// SetICMPFilter deploys the ICMP filter. +func (c *dgramOpt) SetICMPFilter(f *ICMPFilter) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoICMPFilter] + if !ok { + return errOpNoSupport + } + return so.setICMPFilter(c.Conn, f) +} + +// SetBPF attaches a BPF program to the connection. +// +// Only supported on Linux. +func (c *dgramOpt) SetBPF(filter []bpf.RawInstruction) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoAttachFilter] + if !ok { + return errOpNoSupport + } + return so.setBPF(c.Conn, filter) +} diff --git a/api/vendor/golang.org/x/net/ipv6/doc.go b/api/vendor/golang.org/x/net/ipv6/doc.go new file mode 100644 index 0000000..664a97d --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/doc.go @@ -0,0 +1,243 @@ +// 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 ipv6 implements IP-level socket options for the Internet +// Protocol version 6. +// +// The package provides IP-level socket options that allow +// manipulation of IPv6 facilities. +// +// The IPv6 protocol is defined in RFC 8200. +// Socket interface extensions are defined in RFC 3493, RFC 3542 and +// RFC 3678. +// MLDv1 and MLDv2 are defined in RFC 2710 and RFC 3810. +// Source-specific multicast is defined in RFC 4607. +// +// On Darwin, this package requires OS X Mavericks version 10.9 or +// above, or equivalent. +// +// +// Unicasting +// +// The options for unicasting are available for net.TCPConn, +// net.UDPConn and net.IPConn which are created as network connections +// that use the IPv6 transport. When a single TCP connection carrying +// a data flow of multiple packets needs to indicate the flow is +// important, Conn is used to set the traffic class field on the IPv6 +// header for each packet. +// +// ln, err := net.Listen("tcp6", "[::]:1024") +// if err != nil { +// // error handling +// } +// defer ln.Close() +// for { +// c, err := ln.Accept() +// if err != nil { +// // error handling +// } +// go func(c net.Conn) { +// defer c.Close() +// +// The outgoing packets will be labeled DiffServ assured forwarding +// class 1 low drop precedence, known as AF11 packets. +// +// if err := ipv6.NewConn(c).SetTrafficClass(0x28); err != nil { +// // error handling +// } +// if _, err := c.Write(data); err != nil { +// // error handling +// } +// }(c) +// } +// +// +// Multicasting +// +// The options for multicasting are available for net.UDPConn and +// net.IPconn which are created as network connections that use the +// IPv6 transport. A few network facilities must be prepared before +// you begin multicasting, at a minimum joining network interfaces and +// multicast groups. +// +// en0, err := net.InterfaceByName("en0") +// if err != nil { +// // error handling +// } +// en1, err := net.InterfaceByIndex(911) +// if err != nil { +// // error handling +// } +// group := net.ParseIP("ff02::114") +// +// First, an application listens to an appropriate address with an +// appropriate service port. +// +// c, err := net.ListenPacket("udp6", "[::]:1024") +// if err != nil { +// // error handling +// } +// defer c.Close() +// +// Second, the application joins multicast groups, starts listening to +// the groups on the specified network interfaces. Note that the +// service port for transport layer protocol does not matter with this +// operation as joining groups affects only network and link layer +// protocols, such as IPv6 and Ethernet. +// +// p := ipv6.NewPacketConn(c) +// if err := p.JoinGroup(en0, &net.UDPAddr{IP: group}); err != nil { +// // error handling +// } +// if err := p.JoinGroup(en1, &net.UDPAddr{IP: group}); err != nil { +// // error handling +// } +// +// The application might set per packet control message transmissions +// between the protocol stack within the kernel. When the application +// needs a destination address on an incoming packet, +// SetControlMessage of PacketConn is used to enable control message +// transmissions. +// +// if err := p.SetControlMessage(ipv6.FlagDst, true); err != nil { +// // error handling +// } +// +// The application could identify whether the received packets are +// of interest by using the control message that contains the +// destination address of the received packet. +// +// b := make([]byte, 1500) +// for { +// n, rcm, src, err := p.ReadFrom(b) +// if err != nil { +// // error handling +// } +// if rcm.Dst.IsMulticast() { +// if rcm.Dst.Equal(group) { +// // joined group, do something +// } else { +// // unknown group, discard +// continue +// } +// } +// +// The application can also send both unicast and multicast packets. +// +// p.SetTrafficClass(0x0) +// p.SetHopLimit(16) +// if _, err := p.WriteTo(data[:n], nil, src); err != nil { +// // error handling +// } +// dst := &net.UDPAddr{IP: group, Port: 1024} +// wcm := ipv6.ControlMessage{TrafficClass: 0xe0, HopLimit: 1} +// for _, ifi := range []*net.Interface{en0, en1} { +// wcm.IfIndex = ifi.Index +// if _, err := p.WriteTo(data[:n], &wcm, dst); err != nil { +// // error handling +// } +// } +// } +// +// +// More multicasting +// +// An application that uses PacketConn may join multiple multicast +// groups. For example, a UDP listener with port 1024 might join two +// different groups across over two different network interfaces by +// using: +// +// c, err := net.ListenPacket("udp6", "[::]:1024") +// if err != nil { +// // error handling +// } +// defer c.Close() +// p := ipv6.NewPacketConn(c) +// if err := p.JoinGroup(en0, &net.UDPAddr{IP: net.ParseIP("ff02::1:114")}); err != nil { +// // error handling +// } +// if err := p.JoinGroup(en0, &net.UDPAddr{IP: net.ParseIP("ff02::2:114")}); err != nil { +// // error handling +// } +// if err := p.JoinGroup(en1, &net.UDPAddr{IP: net.ParseIP("ff02::2:114")}); err != nil { +// // error handling +// } +// +// It is possible for multiple UDP listeners that listen on the same +// UDP port to join the same multicast group. The net package will +// provide a socket that listens to a wildcard address with reusable +// UDP port when an appropriate multicast address prefix is passed to +// the net.ListenPacket or net.ListenUDP. +// +// c1, err := net.ListenPacket("udp6", "[ff02::]:1024") +// if err != nil { +// // error handling +// } +// defer c1.Close() +// c2, err := net.ListenPacket("udp6", "[ff02::]:1024") +// if err != nil { +// // error handling +// } +// defer c2.Close() +// p1 := ipv6.NewPacketConn(c1) +// if err := p1.JoinGroup(en0, &net.UDPAddr{IP: net.ParseIP("ff02::114")}); err != nil { +// // error handling +// } +// p2 := ipv6.NewPacketConn(c2) +// if err := p2.JoinGroup(en0, &net.UDPAddr{IP: net.ParseIP("ff02::114")}); err != nil { +// // error handling +// } +// +// Also it is possible for the application to leave or rejoin a +// multicast group on the network interface. +// +// if err := p.LeaveGroup(en0, &net.UDPAddr{IP: net.ParseIP("ff02::114")}); err != nil { +// // error handling +// } +// if err := p.JoinGroup(en0, &net.UDPAddr{IP: net.ParseIP("ff01::114")}); err != nil { +// // error handling +// } +// +// +// Source-specific multicasting +// +// An application that uses PacketConn on MLDv2 supported platform is +// able to join source-specific multicast groups. +// The application may use JoinSourceSpecificGroup and +// LeaveSourceSpecificGroup for the operation known as "include" mode, +// +// ssmgroup := net.UDPAddr{IP: net.ParseIP("ff32::8000:9")} +// ssmsource := net.UDPAddr{IP: net.ParseIP("fe80::cafe")} +// if err := p.JoinSourceSpecificGroup(en0, &ssmgroup, &ssmsource); err != nil { +// // error handling +// } +// if err := p.LeaveSourceSpecificGroup(en0, &ssmgroup, &ssmsource); err != nil { +// // error handling +// } +// +// or JoinGroup, ExcludeSourceSpecificGroup, +// IncludeSourceSpecificGroup and LeaveGroup for the operation known +// as "exclude" mode. +// +// exclsource := net.UDPAddr{IP: net.ParseIP("fe80::dead")} +// if err := p.JoinGroup(en0, &ssmgroup); err != nil { +// // error handling +// } +// if err := p.ExcludeSourceSpecificGroup(en0, &ssmgroup, &exclsource); err != nil { +// // error handling +// } +// if err := p.LeaveGroup(en0, &ssmgroup); err != nil { +// // error handling +// } +// +// Note that it depends on each platform implementation what happens +// when an application which runs on MLDv2 unsupported platform uses +// JoinSourceSpecificGroup and LeaveSourceSpecificGroup. +// In general the platform tries to fall back to conversations using +// MLDv1 and starts to listen to multicast traffic. +// In the fallback case, ExcludeSourceSpecificGroup and +// IncludeSourceSpecificGroup may return an error. +package ipv6 // import "golang.org/x/net/ipv6" + +// BUG(mikio): This package is not implemented on NaCl and Plan 9. diff --git a/api/vendor/golang.org/x/net/ipv6/endpoint.go b/api/vendor/golang.org/x/net/ipv6/endpoint.go new file mode 100644 index 0000000..0624c17 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/endpoint.go @@ -0,0 +1,128 @@ +// 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 ipv6 + +import ( + "net" + "syscall" + "time" + + "golang.org/x/net/internal/socket" +) + +// BUG(mikio): On Windows, the JoinSourceSpecificGroup, +// LeaveSourceSpecificGroup, ExcludeSourceSpecificGroup and +// IncludeSourceSpecificGroup methods of PacketConn are not +// implemented. + +// A Conn represents a network endpoint that uses IPv6 transport. +// It allows to set basic IP-level socket options such as traffic +// class and hop limit. +type Conn struct { + genericOpt +} + +type genericOpt struct { + *socket.Conn +} + +func (c *genericOpt) ok() bool { return c != nil && c.Conn != nil } + +// PathMTU returns a path MTU value for the destination associated +// with the endpoint. +func (c *Conn) PathMTU() (int, error) { + if !c.ok() { + return 0, syscall.EINVAL + } + so, ok := sockOpts[ssoPathMTU] + if !ok { + return 0, errOpNoSupport + } + _, mtu, err := so.getMTUInfo(c.Conn) + if err != nil { + return 0, err + } + return mtu, nil +} + +// NewConn returns a new Conn. +func NewConn(c net.Conn) *Conn { + cc, _ := socket.NewConn(c) + return &Conn{ + genericOpt: genericOpt{Conn: cc}, + } +} + +// A PacketConn represents a packet network endpoint that uses IPv6 +// transport. It is used to control several IP-level socket options +// including IPv6 header manipulation. It also provides datagram +// based network I/O methods specific to the IPv6 and higher layer +// protocols such as OSPF, GRE, and UDP. +type PacketConn struct { + genericOpt + dgramOpt + payloadHandler +} + +type dgramOpt struct { + *socket.Conn +} + +func (c *dgramOpt) ok() bool { return c != nil && c.Conn != nil } + +// SetControlMessage allows to receive the per packet basis IP-level +// socket options. +func (c *PacketConn) SetControlMessage(cf ControlFlags, on bool) error { + if !c.payloadHandler.ok() { + return syscall.EINVAL + } + return setControlMessage(c.dgramOpt.Conn, &c.payloadHandler.rawOpt, cf, on) +} + +// SetDeadline sets the read and write deadlines associated with the +// endpoint. +func (c *PacketConn) SetDeadline(t time.Time) error { + if !c.payloadHandler.ok() { + return syscall.EINVAL + } + return c.payloadHandler.SetDeadline(t) +} + +// SetReadDeadline sets the read deadline associated with the +// endpoint. +func (c *PacketConn) SetReadDeadline(t time.Time) error { + if !c.payloadHandler.ok() { + return syscall.EINVAL + } + return c.payloadHandler.SetReadDeadline(t) +} + +// SetWriteDeadline sets the write deadline associated with the +// endpoint. +func (c *PacketConn) SetWriteDeadline(t time.Time) error { + if !c.payloadHandler.ok() { + return syscall.EINVAL + } + return c.payloadHandler.SetWriteDeadline(t) +} + +// Close closes the endpoint. +func (c *PacketConn) Close() error { + if !c.payloadHandler.ok() { + return syscall.EINVAL + } + return c.payloadHandler.Close() +} + +// NewPacketConn returns a new PacketConn using c as its underlying +// transport. +func NewPacketConn(c net.PacketConn) *PacketConn { + cc, _ := socket.NewConn(c.(net.Conn)) + return &PacketConn{ + genericOpt: genericOpt{Conn: cc}, + dgramOpt: dgramOpt{Conn: cc}, + payloadHandler: payloadHandler{PacketConn: c, Conn: cc}, + } +} diff --git a/api/vendor/golang.org/x/net/ipv6/example_test.go b/api/vendor/golang.org/x/net/ipv6/example_test.go new file mode 100644 index 0000000..e761aa2 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/example_test.go @@ -0,0 +1,216 @@ +// 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 ipv6_test + +import ( + "fmt" + "log" + "net" + "os" + "time" + + "golang.org/x/net/icmp" + "golang.org/x/net/ipv6" +) + +func ExampleConn_markingTCP() { + ln, err := net.Listen("tcp", "[::]:1024") + if err != nil { + log.Fatal(err) + } + defer ln.Close() + + for { + c, err := ln.Accept() + if err != nil { + log.Fatal(err) + } + go func(c net.Conn) { + defer c.Close() + if c.RemoteAddr().(*net.TCPAddr).IP.To16() != nil && c.RemoteAddr().(*net.TCPAddr).IP.To4() == nil { + p := ipv6.NewConn(c) + if err := p.SetTrafficClass(0x28); err != nil { // DSCP AF11 + log.Fatal(err) + } + if err := p.SetHopLimit(128); err != nil { + log.Fatal(err) + } + } + if _, err := c.Write([]byte("HELLO-R-U-THERE-ACK")); err != nil { + log.Fatal(err) + } + }(c) + } +} + +func ExamplePacketConn_servingOneShotMulticastDNS() { + c, err := net.ListenPacket("udp6", "[::]:5353") // mDNS over UDP + if err != nil { + log.Fatal(err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + + en0, err := net.InterfaceByName("en0") + if err != nil { + log.Fatal(err) + } + mDNSLinkLocal := net.UDPAddr{IP: net.ParseIP("ff02::fb")} + if err := p.JoinGroup(en0, &mDNSLinkLocal); err != nil { + log.Fatal(err) + } + defer p.LeaveGroup(en0, &mDNSLinkLocal) + if err := p.SetControlMessage(ipv6.FlagDst|ipv6.FlagInterface, true); err != nil { + log.Fatal(err) + } + + var wcm ipv6.ControlMessage + b := make([]byte, 1500) + for { + _, rcm, peer, err := p.ReadFrom(b) + if err != nil { + log.Fatal(err) + } + if !rcm.Dst.IsMulticast() || !rcm.Dst.Equal(mDNSLinkLocal.IP) { + continue + } + wcm.IfIndex = rcm.IfIndex + answers := []byte("FAKE-MDNS-ANSWERS") // fake mDNS answers, you need to implement this + if _, err := p.WriteTo(answers, &wcm, peer); err != nil { + log.Fatal(err) + } + } +} + +func ExamplePacketConn_tracingIPPacketRoute() { + // Tracing an IP packet route to www.google.com. + + const host = "www.google.com" + ips, err := net.LookupIP(host) + if err != nil { + log.Fatal(err) + } + var dst net.IPAddr + for _, ip := range ips { + if ip.To16() != nil && ip.To4() == nil { + dst.IP = ip + fmt.Printf("using %v for tracing an IP packet route to %s\n", dst.IP, host) + break + } + } + if dst.IP == nil { + log.Fatal("no AAAA record found") + } + + c, err := net.ListenPacket("ip6:58", "::") // ICMP for IPv6 + if err != nil { + log.Fatal(err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + + if err := p.SetControlMessage(ipv6.FlagHopLimit|ipv6.FlagSrc|ipv6.FlagDst|ipv6.FlagInterface, true); err != nil { + log.Fatal(err) + } + wm := icmp.Message{ + Type: ipv6.ICMPTypeEchoRequest, Code: 0, + Body: &icmp.Echo{ + ID: os.Getpid() & 0xffff, + Data: []byte("HELLO-R-U-THERE"), + }, + } + var f ipv6.ICMPFilter + f.SetAll(true) + f.Accept(ipv6.ICMPTypeTimeExceeded) + f.Accept(ipv6.ICMPTypeEchoReply) + if err := p.SetICMPFilter(&f); err != nil { + log.Fatal(err) + } + + var wcm ipv6.ControlMessage + rb := make([]byte, 1500) + for i := 1; i <= 64; i++ { // up to 64 hops + wm.Body.(*icmp.Echo).Seq = i + wb, err := wm.Marshal(nil) + if err != nil { + log.Fatal(err) + } + + // In the real world usually there are several + // multiple traffic-engineered paths for each hop. + // You may need to probe a few times to each hop. + begin := time.Now() + wcm.HopLimit = i + if _, err := p.WriteTo(wb, &wcm, &dst); err != nil { + log.Fatal(err) + } + if err := p.SetReadDeadline(time.Now().Add(3 * time.Second)); err != nil { + log.Fatal(err) + } + n, rcm, peer, err := p.ReadFrom(rb) + if err != nil { + if err, ok := err.(net.Error); ok && err.Timeout() { + fmt.Printf("%v\t*\n", i) + continue + } + log.Fatal(err) + } + rm, err := icmp.ParseMessage(58, rb[:n]) + if err != nil { + log.Fatal(err) + } + rtt := time.Since(begin) + + // In the real world you need to determine whether the + // received message is yours using ControlMessage.Src, + // ControlMesage.Dst, icmp.Echo.ID and icmp.Echo.Seq. + switch rm.Type { + case ipv6.ICMPTypeTimeExceeded: + names, _ := net.LookupAddr(peer.String()) + fmt.Printf("%d\t%v %+v %v\n\t%+v\n", i, peer, names, rtt, rcm) + case ipv6.ICMPTypeEchoReply: + names, _ := net.LookupAddr(peer.String()) + fmt.Printf("%d\t%v %+v %v\n\t%+v\n", i, peer, names, rtt, rcm) + return + } + } +} + +func ExamplePacketConn_advertisingOSPFHello() { + c, err := net.ListenPacket("ip6:89", "::") // OSPF for IPv6 + if err != nil { + log.Fatal(err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + + en0, err := net.InterfaceByName("en0") + if err != nil { + log.Fatal(err) + } + allSPFRouters := net.IPAddr{IP: net.ParseIP("ff02::5")} + if err := p.JoinGroup(en0, &allSPFRouters); err != nil { + log.Fatal(err) + } + defer p.LeaveGroup(en0, &allSPFRouters) + + hello := make([]byte, 24) // fake hello data, you need to implement this + ospf := make([]byte, 16) // fake ospf header, you need to implement this + ospf[0] = 3 // version 3 + ospf[1] = 1 // hello packet + ospf = append(ospf, hello...) + if err := p.SetChecksum(true, 12); err != nil { + log.Fatal(err) + } + + cm := ipv6.ControlMessage{ + TrafficClass: 0xc0, // DSCP CS6 + HopLimit: 1, + IfIndex: en0.Index, + } + if _, err := p.WriteTo(ospf, &cm, &allSPFRouters); err != nil { + log.Fatal(err) + } +} diff --git a/api/vendor/golang.org/x/net/ipv6/gen.go b/api/vendor/golang.org/x/net/ipv6/gen.go new file mode 100644 index 0000000..5885664 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/gen.go @@ -0,0 +1,199 @@ +// 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. + +// +build ignore + +//go:generate go run gen.go + +// This program generates system adaptation constants and types, +// internet protocol constants and tables by reading template files +// and IANA protocol registries. +package main + +import ( + "bytes" + "encoding/xml" + "fmt" + "go/format" + "io" + "io/ioutil" + "net/http" + "os" + "os/exec" + "runtime" + "strconv" + "strings" +) + +func main() { + if err := genzsys(); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + if err := geniana(); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} + +func genzsys() error { + defs := "defs_" + runtime.GOOS + ".go" + f, err := os.Open(defs) + if err != nil { + if os.IsNotExist(err) { + return nil + } + return err + } + f.Close() + cmd := exec.Command("go", "tool", "cgo", "-godefs", defs) + b, err := cmd.Output() + if err != nil { + return err + } + b, err = format.Source(b) + if err != nil { + return err + } + zsys := "zsys_" + runtime.GOOS + ".go" + switch runtime.GOOS { + case "freebsd", "linux": + zsys = "zsys_" + runtime.GOOS + "_" + runtime.GOARCH + ".go" + } + if err := ioutil.WriteFile(zsys, b, 0644); err != nil { + return err + } + return nil +} + +var registries = []struct { + url string + parse func(io.Writer, io.Reader) error +}{ + { + "https://www.iana.org/assignments/icmpv6-parameters/icmpv6-parameters.xml", + parseICMPv6Parameters, + }, +} + +func geniana() error { + var bb bytes.Buffer + fmt.Fprintf(&bb, "// go generate gen.go\n") + fmt.Fprintf(&bb, "// Code generated by the command above; DO NOT EDIT.\n\n") + fmt.Fprintf(&bb, "package ipv6\n\n") + for _, r := range registries { + resp, err := http.Get(r.url) + if err != nil { + return err + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + return fmt.Errorf("got HTTP status code %v for %v\n", resp.StatusCode, r.url) + } + if err := r.parse(&bb, resp.Body); err != nil { + return err + } + fmt.Fprintf(&bb, "\n") + } + b, err := format.Source(bb.Bytes()) + if err != nil { + return err + } + if err := ioutil.WriteFile("iana.go", b, 0644); err != nil { + return err + } + return nil +} + +func parseICMPv6Parameters(w io.Writer, r io.Reader) error { + dec := xml.NewDecoder(r) + var icp icmpv6Parameters + if err := dec.Decode(&icp); err != nil { + return err + } + prs := icp.escape() + fmt.Fprintf(w, "// %s, Updated: %s\n", icp.Title, icp.Updated) + fmt.Fprintf(w, "const (\n") + for _, pr := range prs { + if pr.Name == "" { + continue + } + fmt.Fprintf(w, "ICMPType%s ICMPType = %d", pr.Name, pr.Value) + fmt.Fprintf(w, "// %s\n", pr.OrigName) + } + fmt.Fprintf(w, ")\n\n") + fmt.Fprintf(w, "// %s, Updated: %s\n", icp.Title, icp.Updated) + fmt.Fprintf(w, "var icmpTypes = map[ICMPType]string{\n") + for _, pr := range prs { + if pr.Name == "" { + continue + } + fmt.Fprintf(w, "%d: %q,\n", pr.Value, strings.ToLower(pr.OrigName)) + } + fmt.Fprintf(w, "}\n") + return nil +} + +type icmpv6Parameters struct { + XMLName xml.Name `xml:"registry"` + Title string `xml:"title"` + Updated string `xml:"updated"` + Registries []struct { + Title string `xml:"title"` + Records []struct { + Value string `xml:"value"` + Name string `xml:"name"` + } `xml:"record"` + } `xml:"registry"` +} + +type canonICMPv6ParamRecord struct { + OrigName string + Name string + Value int +} + +func (icp *icmpv6Parameters) escape() []canonICMPv6ParamRecord { + id := -1 + for i, r := range icp.Registries { + if strings.Contains(r.Title, "Type") || strings.Contains(r.Title, "type") { + id = i + break + } + } + if id < 0 { + return nil + } + prs := make([]canonICMPv6ParamRecord, len(icp.Registries[id].Records)) + sr := strings.NewReplacer( + "Messages", "", + "Message", "", + "ICMP", "", + "+", "P", + "-", "", + "/", "", + ".", "", + " ", "", + ) + for i, pr := range icp.Registries[id].Records { + if strings.Contains(pr.Name, "Reserved") || + strings.Contains(pr.Name, "Unassigned") || + strings.Contains(pr.Name, "Deprecated") || + strings.Contains(pr.Name, "Experiment") || + strings.Contains(pr.Name, "experiment") { + continue + } + ss := strings.Split(pr.Name, "\n") + if len(ss) > 1 { + prs[i].Name = strings.Join(ss, " ") + } else { + prs[i].Name = ss[0] + } + s := strings.TrimSpace(prs[i].Name) + prs[i].OrigName = s + prs[i].Name = sr.Replace(s) + prs[i].Value, _ = strconv.Atoi(pr.Value) + } + return prs +} diff --git a/api/vendor/golang.org/x/net/ipv6/genericopt.go b/api/vendor/golang.org/x/net/ipv6/genericopt.go new file mode 100644 index 0000000..e9dbc2e --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/genericopt.go @@ -0,0 +1,58 @@ +// 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 ipv6 + +import "syscall" + +// TrafficClass returns the traffic class field value for outgoing +// packets. +func (c *genericOpt) TrafficClass() (int, error) { + if !c.ok() { + return 0, syscall.EINVAL + } + so, ok := sockOpts[ssoTrafficClass] + if !ok { + return 0, errOpNoSupport + } + return so.GetInt(c.Conn) +} + +// SetTrafficClass sets the traffic class field value for future +// outgoing packets. +func (c *genericOpt) SetTrafficClass(tclass int) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoTrafficClass] + if !ok { + return errOpNoSupport + } + return so.SetInt(c.Conn, tclass) +} + +// HopLimit returns the hop limit field value for outgoing packets. +func (c *genericOpt) HopLimit() (int, error) { + if !c.ok() { + return 0, syscall.EINVAL + } + so, ok := sockOpts[ssoHopLimit] + if !ok { + return 0, errOpNoSupport + } + return so.GetInt(c.Conn) +} + +// SetHopLimit sets the hop limit field value for future outgoing +// packets. +func (c *genericOpt) SetHopLimit(hoplim int) error { + if !c.ok() { + return syscall.EINVAL + } + so, ok := sockOpts[ssoHopLimit] + if !ok { + return errOpNoSupport + } + return so.SetInt(c.Conn, hoplim) +} diff --git a/api/vendor/golang.org/x/net/ipv6/header.go b/api/vendor/golang.org/x/net/ipv6/header.go new file mode 100644 index 0000000..e05cb08 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/header.go @@ -0,0 +1,55 @@ +// 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 ipv6 + +import ( + "encoding/binary" + "fmt" + "net" +) + +const ( + Version = 6 // protocol version + HeaderLen = 40 // header length +) + +// A Header represents an IPv6 base header. +type Header struct { + Version int // protocol version + TrafficClass int // traffic class + FlowLabel int // flow label + PayloadLen int // payload length + NextHeader int // next header + HopLimit int // hop limit + Src net.IP // source address + Dst net.IP // destination address +} + +func (h *Header) String() string { + if h == nil { + return "" + } + return fmt.Sprintf("ver=%d tclass=%#x flowlbl=%#x payloadlen=%d nxthdr=%d hoplim=%d src=%v dst=%v", h.Version, h.TrafficClass, h.FlowLabel, h.PayloadLen, h.NextHeader, h.HopLimit, h.Src, h.Dst) +} + +// ParseHeader parses b as an IPv6 base header. +func ParseHeader(b []byte) (*Header, error) { + if len(b) < HeaderLen { + return nil, errHeaderTooShort + } + h := &Header{ + Version: int(b[0]) >> 4, + TrafficClass: int(b[0]&0x0f)<<4 | int(b[1])>>4, + FlowLabel: int(b[1]&0x0f)<<16 | int(b[2])<<8 | int(b[3]), + PayloadLen: int(binary.BigEndian.Uint16(b[4:6])), + NextHeader: int(b[6]), + HopLimit: int(b[7]), + } + h.Src = make(net.IP, net.IPv6len) + copy(h.Src, b[8:24]) + h.Dst = make(net.IP, net.IPv6len) + copy(h.Dst, b[24:40]) + return h, nil +} diff --git a/api/vendor/golang.org/x/net/ipv6/header_test.go b/api/vendor/golang.org/x/net/ipv6/header_test.go new file mode 100644 index 0000000..ca11dc2 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/header_test.go @@ -0,0 +1,55 @@ +// 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 ipv6_test + +import ( + "net" + "reflect" + "strings" + "testing" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/ipv6" +) + +var ( + wireHeaderFromKernel = [ipv6.HeaderLen]byte{ + 0x69, 0x8b, 0xee, 0xf1, + 0xca, 0xfe, 0x2c, 0x01, + 0x20, 0x01, 0x0d, 0xb8, + 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, + 0x20, 0x01, 0x0d, 0xb8, + 0x00, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, + } + + testHeader = &ipv6.Header{ + Version: ipv6.Version, + TrafficClass: iana.DiffServAF43, + FlowLabel: 0xbeef1, + PayloadLen: 0xcafe, + NextHeader: iana.ProtocolIPv6Frag, + HopLimit: 1, + Src: net.ParseIP("2001:db8:1::1"), + Dst: net.ParseIP("2001:db8:2::1"), + } +) + +func TestParseHeader(t *testing.T) { + h, err := ipv6.ParseHeader(wireHeaderFromKernel[:]) + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(h, testHeader) { + t.Fatalf("got %#v; want %#v", h, testHeader) + } + s := h.String() + if strings.Contains(s, ",") { + t.Fatalf("should be space-separated values: %s", s) + } +} diff --git a/api/vendor/golang.org/x/net/ipv6/helper.go b/api/vendor/golang.org/x/net/ipv6/helper.go new file mode 100644 index 0000000..2597401 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/helper.go @@ -0,0 +1,57 @@ +// 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 ipv6 + +import ( + "errors" + "net" +) + +var ( + errMissingAddress = errors.New("missing address") + errHeaderTooShort = errors.New("header too short") + errInvalidConnType = errors.New("invalid conn type") + errOpNoSupport = errors.New("operation not supported") + errNoSuchInterface = errors.New("no such interface") +) + +func boolint(b bool) int { + if b { + return 1 + } + return 0 +} + +func netAddrToIP16(a net.Addr) net.IP { + switch v := a.(type) { + case *net.UDPAddr: + if ip := v.IP.To16(); ip != nil && ip.To4() == nil { + return ip + } + case *net.IPAddr: + if ip := v.IP.To16(); ip != nil && ip.To4() == nil { + return ip + } + } + return nil +} + +func opAddr(a net.Addr) net.Addr { + switch a.(type) { + case *net.TCPAddr: + if a == nil { + return nil + } + case *net.UDPAddr: + if a == nil { + return nil + } + case *net.IPAddr: + if a == nil { + return nil + } + } + return a +} diff --git a/api/vendor/golang.org/x/net/ipv6/iana.go b/api/vendor/golang.org/x/net/ipv6/iana.go new file mode 100644 index 0000000..32db1aa --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/iana.go @@ -0,0 +1,86 @@ +// go generate gen.go +// Code generated by the command above; DO NOT EDIT. + +package ipv6 + +// Internet Control Message Protocol version 6 (ICMPv6) Parameters, Updated: 2018-03-09 +const ( + ICMPTypeDestinationUnreachable ICMPType = 1 // Destination Unreachable + ICMPTypePacketTooBig ICMPType = 2 // Packet Too Big + ICMPTypeTimeExceeded ICMPType = 3 // Time Exceeded + ICMPTypeParameterProblem ICMPType = 4 // Parameter Problem + ICMPTypeEchoRequest ICMPType = 128 // Echo Request + ICMPTypeEchoReply ICMPType = 129 // Echo Reply + ICMPTypeMulticastListenerQuery ICMPType = 130 // Multicast Listener Query + ICMPTypeMulticastListenerReport ICMPType = 131 // Multicast Listener Report + ICMPTypeMulticastListenerDone ICMPType = 132 // Multicast Listener Done + ICMPTypeRouterSolicitation ICMPType = 133 // Router Solicitation + ICMPTypeRouterAdvertisement ICMPType = 134 // Router Advertisement + ICMPTypeNeighborSolicitation ICMPType = 135 // Neighbor Solicitation + ICMPTypeNeighborAdvertisement ICMPType = 136 // Neighbor Advertisement + ICMPTypeRedirect ICMPType = 137 // Redirect Message + ICMPTypeRouterRenumbering ICMPType = 138 // Router Renumbering + ICMPTypeNodeInformationQuery ICMPType = 139 // ICMP Node Information Query + ICMPTypeNodeInformationResponse ICMPType = 140 // ICMP Node Information Response + ICMPTypeInverseNeighborDiscoverySolicitation ICMPType = 141 // Inverse Neighbor Discovery Solicitation Message + ICMPTypeInverseNeighborDiscoveryAdvertisement ICMPType = 142 // Inverse Neighbor Discovery Advertisement Message + ICMPTypeVersion2MulticastListenerReport ICMPType = 143 // Version 2 Multicast Listener Report + ICMPTypeHomeAgentAddressDiscoveryRequest ICMPType = 144 // Home Agent Address Discovery Request Message + ICMPTypeHomeAgentAddressDiscoveryReply ICMPType = 145 // Home Agent Address Discovery Reply Message + ICMPTypeMobilePrefixSolicitation ICMPType = 146 // Mobile Prefix Solicitation + ICMPTypeMobilePrefixAdvertisement ICMPType = 147 // Mobile Prefix Advertisement + ICMPTypeCertificationPathSolicitation ICMPType = 148 // Certification Path Solicitation Message + ICMPTypeCertificationPathAdvertisement ICMPType = 149 // Certification Path Advertisement Message + ICMPTypeMulticastRouterAdvertisement ICMPType = 151 // Multicast Router Advertisement + ICMPTypeMulticastRouterSolicitation ICMPType = 152 // Multicast Router Solicitation + ICMPTypeMulticastRouterTermination ICMPType = 153 // Multicast Router Termination + ICMPTypeFMIPv6 ICMPType = 154 // FMIPv6 Messages + ICMPTypeRPLControl ICMPType = 155 // RPL Control Message + ICMPTypeILNPv6LocatorUpdate ICMPType = 156 // ILNPv6 Locator Update Message + ICMPTypeDuplicateAddressRequest ICMPType = 157 // Duplicate Address Request + ICMPTypeDuplicateAddressConfirmation ICMPType = 158 // Duplicate Address Confirmation + ICMPTypeMPLControl ICMPType = 159 // MPL Control Message + ICMPTypeExtendedEchoRequest ICMPType = 160 // Extended Echo Request + ICMPTypeExtendedEchoReply ICMPType = 161 // Extended Echo Reply +) + +// Internet Control Message Protocol version 6 (ICMPv6) Parameters, Updated: 2018-03-09 +var icmpTypes = map[ICMPType]string{ + 1: "destination unreachable", + 2: "packet too big", + 3: "time exceeded", + 4: "parameter problem", + 128: "echo request", + 129: "echo reply", + 130: "multicast listener query", + 131: "multicast listener report", + 132: "multicast listener done", + 133: "router solicitation", + 134: "router advertisement", + 135: "neighbor solicitation", + 136: "neighbor advertisement", + 137: "redirect message", + 138: "router renumbering", + 139: "icmp node information query", + 140: "icmp node information response", + 141: "inverse neighbor discovery solicitation message", + 142: "inverse neighbor discovery advertisement message", + 143: "version 2 multicast listener report", + 144: "home agent address discovery request message", + 145: "home agent address discovery reply message", + 146: "mobile prefix solicitation", + 147: "mobile prefix advertisement", + 148: "certification path solicitation message", + 149: "certification path advertisement message", + 151: "multicast router advertisement", + 152: "multicast router solicitation", + 153: "multicast router termination", + 154: "fmipv6 messages", + 155: "rpl control message", + 156: "ilnpv6 locator update message", + 157: "duplicate address request", + 158: "duplicate address confirmation", + 159: "mpl control message", + 160: "extended echo request", + 161: "extended echo reply", +} diff --git a/api/vendor/golang.org/x/net/ipv6/icmp.go b/api/vendor/golang.org/x/net/ipv6/icmp.go new file mode 100644 index 0000000..b7f48e2 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/icmp.go @@ -0,0 +1,60 @@ +// 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 ipv6 + +import "golang.org/x/net/internal/iana" + +// BUG(mikio): On Windows, methods related to ICMPFilter are not +// implemented. + +// An ICMPType represents a type of ICMP message. +type ICMPType int + +func (typ ICMPType) String() string { + s, ok := icmpTypes[typ] + if !ok { + return "" + } + return s +} + +// Protocol returns the ICMPv6 protocol number. +func (typ ICMPType) Protocol() int { + return iana.ProtocolIPv6ICMP +} + +// An ICMPFilter represents an ICMP message filter for incoming +// packets. The filter belongs to a packet delivery path on a host and +// it cannot interact with forwarding packets or tunnel-outer packets. +// +// Note: RFC 8200 defines a reasonable role model. A node means a +// device that implements IP. A router means a node that forwards IP +// packets not explicitly addressed to itself, and a host means a node +// that is not a router. +type ICMPFilter struct { + icmpv6Filter +} + +// Accept accepts incoming ICMP packets including the type field value +// typ. +func (f *ICMPFilter) Accept(typ ICMPType) { + f.accept(typ) +} + +// Block blocks incoming ICMP packets including the type field value +// typ. +func (f *ICMPFilter) Block(typ ICMPType) { + f.block(typ) +} + +// SetAll sets the filter action to the filter. +func (f *ICMPFilter) SetAll(block bool) { + f.setAll(block) +} + +// WillBlock reports whether the ICMP type will be blocked. +func (f *ICMPFilter) WillBlock(typ ICMPType) bool { + return f.willBlock(typ) +} diff --git a/api/vendor/golang.org/x/net/ipv6/icmp_bsd.go b/api/vendor/golang.org/x/net/ipv6/icmp_bsd.go new file mode 100644 index 0000000..e1a791d --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/icmp_bsd.go @@ -0,0 +1,29 @@ +// 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. + +// +build darwin dragonfly freebsd netbsd openbsd + +package ipv6 + +func (f *icmpv6Filter) accept(typ ICMPType) { + f.Filt[typ>>5] |= 1 << (uint32(typ) & 31) +} + +func (f *icmpv6Filter) block(typ ICMPType) { + f.Filt[typ>>5] &^= 1 << (uint32(typ) & 31) +} + +func (f *icmpv6Filter) setAll(block bool) { + for i := range f.Filt { + if block { + f.Filt[i] = 0 + } else { + f.Filt[i] = 1<<32 - 1 + } + } +} + +func (f *icmpv6Filter) willBlock(typ ICMPType) bool { + return f.Filt[typ>>5]&(1<<(uint32(typ)&31)) == 0 +} diff --git a/api/vendor/golang.org/x/net/ipv6/icmp_linux.go b/api/vendor/golang.org/x/net/ipv6/icmp_linux.go new file mode 100644 index 0000000..647f6b4 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/icmp_linux.go @@ -0,0 +1,27 @@ +// 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 ipv6 + +func (f *icmpv6Filter) accept(typ ICMPType) { + f.Data[typ>>5] &^= 1 << (uint32(typ) & 31) +} + +func (f *icmpv6Filter) block(typ ICMPType) { + f.Data[typ>>5] |= 1 << (uint32(typ) & 31) +} + +func (f *icmpv6Filter) setAll(block bool) { + for i := range f.Data { + if block { + f.Data[i] = 1<<32 - 1 + } else { + f.Data[i] = 0 + } + } +} + +func (f *icmpv6Filter) willBlock(typ ICMPType) bool { + return f.Data[typ>>5]&(1<<(uint32(typ)&31)) != 0 +} diff --git a/api/vendor/golang.org/x/net/ipv6/icmp_solaris.go b/api/vendor/golang.org/x/net/ipv6/icmp_solaris.go new file mode 100644 index 0000000..7c23bb1 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/icmp_solaris.go @@ -0,0 +1,27 @@ +// 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 ipv6 + +func (f *icmpv6Filter) accept(typ ICMPType) { + f.X__icmp6_filt[typ>>5] |= 1 << (uint32(typ) & 31) +} + +func (f *icmpv6Filter) block(typ ICMPType) { + f.X__icmp6_filt[typ>>5] &^= 1 << (uint32(typ) & 31) +} + +func (f *icmpv6Filter) setAll(block bool) { + for i := range f.X__icmp6_filt { + if block { + f.X__icmp6_filt[i] = 0 + } else { + f.X__icmp6_filt[i] = 1<<32 - 1 + } + } +} + +func (f *icmpv6Filter) willBlock(typ ICMPType) bool { + return f.X__icmp6_filt[typ>>5]&(1<<(uint32(typ)&31)) == 0 +} diff --git a/api/vendor/golang.org/x/net/ipv6/icmp_stub.go b/api/vendor/golang.org/x/net/ipv6/icmp_stub.go new file mode 100644 index 0000000..c4b9be6 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/icmp_stub.go @@ -0,0 +1,23 @@ +// 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. + +// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows + +package ipv6 + +type icmpv6Filter struct { +} + +func (f *icmpv6Filter) accept(typ ICMPType) { +} + +func (f *icmpv6Filter) block(typ ICMPType) { +} + +func (f *icmpv6Filter) setAll(block bool) { +} + +func (f *icmpv6Filter) willBlock(typ ICMPType) bool { + return false +} diff --git a/api/vendor/golang.org/x/net/ipv6/icmp_test.go b/api/vendor/golang.org/x/net/ipv6/icmp_test.go new file mode 100644 index 0000000..d8e9675 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/icmp_test.go @@ -0,0 +1,96 @@ +// 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 ipv6_test + +import ( + "net" + "reflect" + "runtime" + "testing" + + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv6" +) + +var icmpStringTests = []struct { + in ipv6.ICMPType + out string +}{ + {ipv6.ICMPTypeDestinationUnreachable, "destination unreachable"}, + + {256, ""}, +} + +func TestICMPString(t *testing.T) { + for _, tt := range icmpStringTests { + s := tt.in.String() + if s != tt.out { + t.Errorf("got %s; want %s", s, tt.out) + } + } +} + +func TestICMPFilter(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + + var f ipv6.ICMPFilter + for _, toggle := range []bool{false, true} { + f.SetAll(toggle) + for _, typ := range []ipv6.ICMPType{ + ipv6.ICMPTypeDestinationUnreachable, + ipv6.ICMPTypeEchoReply, + ipv6.ICMPTypeNeighborSolicitation, + ipv6.ICMPTypeDuplicateAddressConfirmation, + } { + f.Accept(typ) + if f.WillBlock(typ) { + t.Errorf("ipv6.ICMPFilter.Set(%v, false) failed", typ) + } + f.Block(typ) + if !f.WillBlock(typ) { + t.Errorf("ipv6.ICMPFilter.Set(%v, true) failed", typ) + } + } + } +} + +func TestSetICMPFilter(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + + c, err := net.ListenPacket("ip6:ipv6-icmp", "::1") + if err != nil { + t.Fatal(err) + } + defer c.Close() + + p := ipv6.NewPacketConn(c) + + var f ipv6.ICMPFilter + f.SetAll(true) + f.Accept(ipv6.ICMPTypeEchoRequest) + f.Accept(ipv6.ICMPTypeEchoReply) + if err := p.SetICMPFilter(&f); err != nil { + t.Fatal(err) + } + kf, err := p.ICMPFilter() + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(kf, &f) { + t.Fatalf("got %#v; want %#v", kf, f) + } +} diff --git a/api/vendor/golang.org/x/net/ipv6/icmp_windows.go b/api/vendor/golang.org/x/net/ipv6/icmp_windows.go new file mode 100644 index 0000000..443cd07 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/icmp_windows.go @@ -0,0 +1,22 @@ +// 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 ipv6 + +func (f *icmpv6Filter) accept(typ ICMPType) { + // TODO(mikio): implement this +} + +func (f *icmpv6Filter) block(typ ICMPType) { + // TODO(mikio): implement this +} + +func (f *icmpv6Filter) setAll(block bool) { + // TODO(mikio): implement this +} + +func (f *icmpv6Filter) willBlock(typ ICMPType) bool { + // TODO(mikio): implement this + return false +} diff --git a/api/vendor/golang.org/x/net/ipv6/mocktransponder_test.go b/api/vendor/golang.org/x/net/ipv6/mocktransponder_test.go new file mode 100644 index 0000000..6efe56c --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/mocktransponder_test.go @@ -0,0 +1,32 @@ +// 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 ipv6_test + +import ( + "net" + "testing" +) + +func connector(t *testing.T, network, addr string, done chan<- bool) { + defer func() { done <- true }() + + c, err := net.Dial(network, addr) + if err != nil { + t.Error(err) + return + } + c.Close() +} + +func acceptor(t *testing.T, ln net.Listener, done chan<- bool) { + defer func() { done <- true }() + + c, err := ln.Accept() + if err != nil { + t.Error(err) + return + } + c.Close() +} diff --git a/api/vendor/golang.org/x/net/ipv6/multicast_test.go b/api/vendor/golang.org/x/net/ipv6/multicast_test.go new file mode 100644 index 0000000..69a21cd --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/multicast_test.go @@ -0,0 +1,264 @@ +// 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 ipv6_test + +import ( + "bytes" + "net" + "os" + "runtime" + "testing" + "time" + + "golang.org/x/net/icmp" + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv6" +) + +var packetConnReadWriteMulticastUDPTests = []struct { + addr string + grp, src *net.UDPAddr +}{ + {"[ff02::]:0", &net.UDPAddr{IP: net.ParseIP("ff02::114")}, nil}, // see RFC 4727 + + {"[ff30::8000:0]:0", &net.UDPAddr{IP: net.ParseIP("ff30::8000:1")}, &net.UDPAddr{IP: net.IPv6loopback}}, // see RFC 5771 +} + +func TestPacketConnReadWriteMulticastUDP(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + if !nettest.SupportsIPv6MulticastDeliveryOnLoopback() { + t.Skipf("multicast delivery doesn't work correctly on %s", runtime.GOOS) + } + ifi := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagMulticast|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + for _, tt := range packetConnReadWriteMulticastUDPTests { + c, err := net.ListenPacket("udp6", tt.addr) + if err != nil { + t.Fatal(err) + } + defer c.Close() + + grp := *tt.grp + grp.Port = c.LocalAddr().(*net.UDPAddr).Port + p := ipv6.NewPacketConn(c) + defer p.Close() + if tt.src == nil { + if err := p.JoinGroup(ifi, &grp); err != nil { + t.Fatal(err) + } + defer p.LeaveGroup(ifi, &grp) + } else { + if err := p.JoinSourceSpecificGroup(ifi, &grp, tt.src); err != nil { + switch runtime.GOOS { + case "freebsd", "linux": + default: // platforms that don't support MLDv2 fail here + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + defer p.LeaveSourceSpecificGroup(ifi, &grp, tt.src) + } + if err := p.SetMulticastInterface(ifi); err != nil { + t.Fatal(err) + } + if _, err := p.MulticastInterface(); err != nil { + t.Fatal(err) + } + if err := p.SetMulticastLoopback(true); err != nil { + t.Fatal(err) + } + if _, err := p.MulticastLoopback(); err != nil { + t.Fatal(err) + } + + cm := ipv6.ControlMessage{ + TrafficClass: iana.DiffServAF11 | iana.CongestionExperienced, + Src: net.IPv6loopback, + IfIndex: ifi.Index, + } + cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagSrc | ipv6.FlagDst | ipv6.FlagInterface | ipv6.FlagPathMTU + wb := []byte("HELLO-R-U-THERE") + + for i, toggle := range []bool{true, false, true} { + if err := p.SetControlMessage(cf, toggle); err != nil { + if nettest.ProtocolNotSupported(err) { + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + if err := p.SetDeadline(time.Now().Add(200 * time.Millisecond)); err != nil { + t.Fatal(err) + } + cm.HopLimit = i + 1 + if n, err := p.WriteTo(wb, &cm, &grp); err != nil { + t.Fatal(err) + } else if n != len(wb) { + t.Fatal(err) + } + rb := make([]byte, 128) + if n, _, _, err := p.ReadFrom(rb); err != nil { + t.Fatal(err) + } else if !bytes.Equal(rb[:n], wb) { + t.Fatalf("got %v; want %v", rb[:n], wb) + } + } + } +} + +var packetConnReadWriteMulticastICMPTests = []struct { + grp, src *net.IPAddr +}{ + {&net.IPAddr{IP: net.ParseIP("ff02::114")}, nil}, // see RFC 4727 + + {&net.IPAddr{IP: net.ParseIP("ff30::8000:1")}, &net.IPAddr{IP: net.IPv6loopback}}, // see RFC 5771 +} + +func TestPacketConnReadWriteMulticastICMP(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + if !nettest.SupportsIPv6MulticastDeliveryOnLoopback() { + t.Skipf("multicast delivery doesn't work correctly on %s", runtime.GOOS) + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + ifi := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagMulticast|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + for _, tt := range packetConnReadWriteMulticastICMPTests { + c, err := net.ListenPacket("ip6:ipv6-icmp", "::") + if err != nil { + t.Fatal(err) + } + defer c.Close() + + pshicmp := icmp.IPv6PseudoHeader(c.LocalAddr().(*net.IPAddr).IP, tt.grp.IP) + p := ipv6.NewPacketConn(c) + defer p.Close() + if tt.src == nil { + if err := p.JoinGroup(ifi, tt.grp); err != nil { + t.Fatal(err) + } + defer p.LeaveGroup(ifi, tt.grp) + } else { + if err := p.JoinSourceSpecificGroup(ifi, tt.grp, tt.src); err != nil { + switch runtime.GOOS { + case "freebsd", "linux": + default: // platforms that don't support MLDv2 fail here + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + defer p.LeaveSourceSpecificGroup(ifi, tt.grp, tt.src) + } + if err := p.SetMulticastInterface(ifi); err != nil { + t.Fatal(err) + } + if _, err := p.MulticastInterface(); err != nil { + t.Fatal(err) + } + if err := p.SetMulticastLoopback(true); err != nil { + t.Fatal(err) + } + if _, err := p.MulticastLoopback(); err != nil { + t.Fatal(err) + } + + cm := ipv6.ControlMessage{ + TrafficClass: iana.DiffServAF11 | iana.CongestionExperienced, + Src: net.IPv6loopback, + IfIndex: ifi.Index, + } + cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagSrc | ipv6.FlagDst | ipv6.FlagInterface | ipv6.FlagPathMTU + + var f ipv6.ICMPFilter + f.SetAll(true) + f.Accept(ipv6.ICMPTypeEchoReply) + if err := p.SetICMPFilter(&f); err != nil { + t.Fatal(err) + } + + var psh []byte + for i, toggle := range []bool{true, false, true} { + if toggle { + psh = nil + if err := p.SetChecksum(true, 2); err != nil { + // Solaris never allows to + // modify ICMP properties. + if runtime.GOOS != "solaris" { + t.Fatal(err) + } + } + } else { + psh = pshicmp + // Some platforms never allow to + // disable the kernel checksum + // processing. + p.SetChecksum(false, -1) + } + wb, err := (&icmp.Message{ + Type: ipv6.ICMPTypeEchoRequest, Code: 0, + Body: &icmp.Echo{ + ID: os.Getpid() & 0xffff, Seq: i + 1, + Data: []byte("HELLO-R-U-THERE"), + }, + }).Marshal(psh) + if err != nil { + t.Fatal(err) + } + if err := p.SetControlMessage(cf, toggle); err != nil { + if nettest.ProtocolNotSupported(err) { + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + if err := p.SetDeadline(time.Now().Add(200 * time.Millisecond)); err != nil { + t.Fatal(err) + } + cm.HopLimit = i + 1 + if n, err := p.WriteTo(wb, &cm, tt.grp); err != nil { + t.Fatal(err) + } else if n != len(wb) { + t.Fatalf("got %v; want %v", n, len(wb)) + } + rb := make([]byte, 128) + if n, _, _, err := p.ReadFrom(rb); err != nil { + switch runtime.GOOS { + case "darwin": // older darwin kernels have some limitation on receiving icmp packet through raw socket + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } else { + if m, err := icmp.ParseMessage(iana.ProtocolIPv6ICMP, rb[:n]); err != nil { + t.Fatal(err) + } else if m.Type != ipv6.ICMPTypeEchoReply || m.Code != 0 { + t.Fatalf("got type=%v, code=%v; want type=%v, code=%v", m.Type, m.Code, ipv6.ICMPTypeEchoReply, 0) + } + } + } + } +} diff --git a/api/vendor/golang.org/x/net/ipv6/multicastlistener_test.go b/api/vendor/golang.org/x/net/ipv6/multicastlistener_test.go new file mode 100644 index 0000000..b27713e --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/multicastlistener_test.go @@ -0,0 +1,261 @@ +// 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 ipv6_test + +import ( + "net" + "runtime" + "testing" + + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv6" +) + +var udpMultipleGroupListenerTests = []net.Addr{ + &net.UDPAddr{IP: net.ParseIP("ff02::114")}, // see RFC 4727 + &net.UDPAddr{IP: net.ParseIP("ff02::1:114")}, + &net.UDPAddr{IP: net.ParseIP("ff02::2:114")}, +} + +func TestUDPSinglePacketConnWithMultipleGroupListeners(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + + for _, gaddr := range udpMultipleGroupListenerTests { + c, err := net.ListenPacket("udp6", "[::]:0") // wildcard address with non-reusable port + if err != nil { + t.Fatal(err) + } + defer c.Close() + + p := ipv6.NewPacketConn(c) + var mift []*net.Interface + + ift, err := net.Interfaces() + if err != nil { + t.Fatal(err) + } + for i, ifi := range ift { + if _, ok := nettest.IsMulticastCapable("ip6", &ifi); !ok { + continue + } + if err := p.JoinGroup(&ifi, gaddr); err != nil { + t.Fatal(err) + } + mift = append(mift, &ift[i]) + } + for _, ifi := range mift { + if err := p.LeaveGroup(ifi, gaddr); err != nil { + t.Fatal(err) + } + } + } +} + +func TestUDPMultiplePacketConnWithMultipleGroupListeners(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + + for _, gaddr := range udpMultipleGroupListenerTests { + c1, err := net.ListenPacket("udp6", "[ff02::]:0") // wildcard address with reusable port + if err != nil { + t.Fatal(err) + } + defer c1.Close() + _, port, err := net.SplitHostPort(c1.LocalAddr().String()) + if err != nil { + t.Fatal(err) + } + c2, err := net.ListenPacket("udp6", net.JoinHostPort("ff02::", port)) // wildcard address with reusable port + if err != nil { + t.Fatal(err) + } + defer c2.Close() + + var ps [2]*ipv6.PacketConn + ps[0] = ipv6.NewPacketConn(c1) + ps[1] = ipv6.NewPacketConn(c2) + var mift []*net.Interface + + ift, err := net.Interfaces() + if err != nil { + t.Fatal(err) + } + for i, ifi := range ift { + if _, ok := nettest.IsMulticastCapable("ip6", &ifi); !ok { + continue + } + for _, p := range ps { + if err := p.JoinGroup(&ifi, gaddr); err != nil { + t.Fatal(err) + } + } + mift = append(mift, &ift[i]) + } + for _, ifi := range mift { + for _, p := range ps { + if err := p.LeaveGroup(ifi, gaddr); err != nil { + t.Fatal(err) + } + } + } + } +} + +func TestUDPPerInterfaceSinglePacketConnWithSingleGroupListener(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + + gaddr := net.IPAddr{IP: net.ParseIP("ff02::114")} // see RFC 4727 + type ml struct { + c *ipv6.PacketConn + ifi *net.Interface + } + var mlt []*ml + + ift, err := net.Interfaces() + if err != nil { + t.Fatal(err) + } + port := "0" + for i, ifi := range ift { + ip, ok := nettest.IsMulticastCapable("ip6", &ifi) + if !ok { + continue + } + c, err := net.ListenPacket("udp6", net.JoinHostPort(ip.String()+"%"+ifi.Name, port)) // unicast address with non-reusable port + if err != nil { + // The listen may fail when the serivce is + // already in use, but it's fine because the + // purpose of this is not to test the + // bookkeeping of IP control block inside the + // kernel. + t.Log(err) + continue + } + defer c.Close() + if port == "0" { + _, port, err = net.SplitHostPort(c.LocalAddr().String()) + if err != nil { + t.Fatal(err) + } + } + p := ipv6.NewPacketConn(c) + if err := p.JoinGroup(&ifi, &gaddr); err != nil { + t.Fatal(err) + } + mlt = append(mlt, &ml{p, &ift[i]}) + } + for _, m := range mlt { + if err := m.c.LeaveGroup(m.ifi, &gaddr); err != nil { + t.Fatal(err) + } + } +} + +func TestIPSinglePacketConnWithSingleGroupListener(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + + c, err := net.ListenPacket("ip6:ipv6-icmp", "::") // wildcard address + if err != nil { + t.Fatal(err) + } + defer c.Close() + + p := ipv6.NewPacketConn(c) + gaddr := net.IPAddr{IP: net.ParseIP("ff02::114")} // see RFC 4727 + var mift []*net.Interface + + ift, err := net.Interfaces() + if err != nil { + t.Fatal(err) + } + for i, ifi := range ift { + if _, ok := nettest.IsMulticastCapable("ip6", &ifi); !ok { + continue + } + if err := p.JoinGroup(&ifi, &gaddr); err != nil { + t.Fatal(err) + } + mift = append(mift, &ift[i]) + } + for _, ifi := range mift { + if err := p.LeaveGroup(ifi, &gaddr); err != nil { + t.Fatal(err) + } + } +} + +func TestIPPerInterfaceSinglePacketConnWithSingleGroupListener(t *testing.T) { + switch runtime.GOOS { + case "darwin", "dragonfly", "openbsd": // platforms that return fe80::1%lo0: bind: can't assign requested address + t.Skipf("not supported on %s", runtime.GOOS) + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + + gaddr := net.IPAddr{IP: net.ParseIP("ff02::114")} // see RFC 4727 + type ml struct { + c *ipv6.PacketConn + ifi *net.Interface + } + var mlt []*ml + + ift, err := net.Interfaces() + if err != nil { + t.Fatal(err) + } + for i, ifi := range ift { + ip, ok := nettest.IsMulticastCapable("ip6", &ifi) + if !ok { + continue + } + c, err := net.ListenPacket("ip6:ipv6-icmp", ip.String()+"%"+ifi.Name) // unicast address + if err != nil { + t.Fatal(err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + if err := p.JoinGroup(&ifi, &gaddr); err != nil { + t.Fatal(err) + } + mlt = append(mlt, &ml{p, &ift[i]}) + } + for _, m := range mlt { + if err := m.c.LeaveGroup(m.ifi, &gaddr); err != nil { + t.Fatal(err) + } + } +} diff --git a/api/vendor/golang.org/x/net/ipv6/multicastsockopt_test.go b/api/vendor/golang.org/x/net/ipv6/multicastsockopt_test.go new file mode 100644 index 0000000..9e6b902 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/multicastsockopt_test.go @@ -0,0 +1,157 @@ +// 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 ipv6_test + +import ( + "net" + "runtime" + "testing" + + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv6" +) + +var packetConnMulticastSocketOptionTests = []struct { + net, proto, addr string + grp, src net.Addr +}{ + {"udp6", "", "[ff02::]:0", &net.UDPAddr{IP: net.ParseIP("ff02::114")}, nil}, // see RFC 4727 + {"ip6", ":ipv6-icmp", "::", &net.IPAddr{IP: net.ParseIP("ff02::115")}, nil}, // see RFC 4727 + + {"udp6", "", "[ff30::8000:0]:0", &net.UDPAddr{IP: net.ParseIP("ff30::8000:1")}, &net.UDPAddr{IP: net.IPv6loopback}}, // see RFC 5771 + {"ip6", ":ipv6-icmp", "::", &net.IPAddr{IP: net.ParseIP("ff30::8000:2")}, &net.IPAddr{IP: net.IPv6loopback}}, // see RFC 5771 +} + +func TestPacketConnMulticastSocketOptions(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + ifi := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagMulticast|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + m, ok := nettest.SupportsRawIPSocket() + for _, tt := range packetConnMulticastSocketOptionTests { + if tt.net == "ip6" && !ok { + t.Log(m) + continue + } + c, err := net.ListenPacket(tt.net+tt.proto, tt.addr) + if err != nil { + t.Fatal(err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + defer p.Close() + + if tt.src == nil { + testMulticastSocketOptions(t, p, ifi, tt.grp) + } else { + testSourceSpecificMulticastSocketOptions(t, p, ifi, tt.grp, tt.src) + } + } +} + +type testIPv6MulticastConn interface { + MulticastHopLimit() (int, error) + SetMulticastHopLimit(ttl int) error + MulticastLoopback() (bool, error) + SetMulticastLoopback(bool) error + JoinGroup(*net.Interface, net.Addr) error + LeaveGroup(*net.Interface, net.Addr) error + JoinSourceSpecificGroup(*net.Interface, net.Addr, net.Addr) error + LeaveSourceSpecificGroup(*net.Interface, net.Addr, net.Addr) error + ExcludeSourceSpecificGroup(*net.Interface, net.Addr, net.Addr) error + IncludeSourceSpecificGroup(*net.Interface, net.Addr, net.Addr) error +} + +func testMulticastSocketOptions(t *testing.T, c testIPv6MulticastConn, ifi *net.Interface, grp net.Addr) { + const hoplim = 255 + if err := c.SetMulticastHopLimit(hoplim); err != nil { + t.Error(err) + return + } + if v, err := c.MulticastHopLimit(); err != nil { + t.Error(err) + return + } else if v != hoplim { + t.Errorf("got %v; want %v", v, hoplim) + return + } + + for _, toggle := range []bool{true, false} { + if err := c.SetMulticastLoopback(toggle); err != nil { + t.Error(err) + return + } + if v, err := c.MulticastLoopback(); err != nil { + t.Error(err) + return + } else if v != toggle { + t.Errorf("got %v; want %v", v, toggle) + return + } + } + + if err := c.JoinGroup(ifi, grp); err != nil { + t.Error(err) + return + } + if err := c.LeaveGroup(ifi, grp); err != nil { + t.Error(err) + return + } +} + +func testSourceSpecificMulticastSocketOptions(t *testing.T, c testIPv6MulticastConn, ifi *net.Interface, grp, src net.Addr) { + // MCAST_JOIN_GROUP -> MCAST_BLOCK_SOURCE -> MCAST_UNBLOCK_SOURCE -> MCAST_LEAVE_GROUP + if err := c.JoinGroup(ifi, grp); err != nil { + t.Error(err) + return + } + if err := c.ExcludeSourceSpecificGroup(ifi, grp, src); err != nil { + switch runtime.GOOS { + case "freebsd", "linux": + default: // platforms that don't support MLDv2 fail here + t.Logf("not supported on %s", runtime.GOOS) + return + } + t.Error(err) + return + } + if err := c.IncludeSourceSpecificGroup(ifi, grp, src); err != nil { + t.Error(err) + return + } + if err := c.LeaveGroup(ifi, grp); err != nil { + t.Error(err) + return + } + + // MCAST_JOIN_SOURCE_GROUP -> MCAST_LEAVE_SOURCE_GROUP + if err := c.JoinSourceSpecificGroup(ifi, grp, src); err != nil { + t.Error(err) + return + } + if err := c.LeaveSourceSpecificGroup(ifi, grp, src); err != nil { + t.Error(err) + return + } + + // MCAST_JOIN_SOURCE_GROUP -> MCAST_LEAVE_GROUP + if err := c.JoinSourceSpecificGroup(ifi, grp, src); err != nil { + t.Error(err) + return + } + if err := c.LeaveGroup(ifi, grp); err != nil { + t.Error(err) + return + } +} diff --git a/api/vendor/golang.org/x/net/ipv6/payload.go b/api/vendor/golang.org/x/net/ipv6/payload.go new file mode 100644 index 0000000..a8197f1 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/payload.go @@ -0,0 +1,23 @@ +// 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 ipv6 + +import ( + "net" + + "golang.org/x/net/internal/socket" +) + +// BUG(mikio): On Windows, the ControlMessage for ReadFrom and WriteTo +// methods of PacketConn is not implemented. + +// A payloadHandler represents the IPv6 datagram payload handler. +type payloadHandler struct { + net.PacketConn + *socket.Conn + rawOpt +} + +func (c *payloadHandler) ok() bool { return c != nil && c.PacketConn != nil && c.Conn != nil } diff --git a/api/vendor/golang.org/x/net/ipv6/payload_cmsg.go b/api/vendor/golang.org/x/net/ipv6/payload_cmsg.go new file mode 100644 index 0000000..4ee4b06 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/payload_cmsg.go @@ -0,0 +1,35 @@ +// 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. + +// +build !nacl,!plan9,!windows + +package ipv6 + +import ( + "net" + "syscall" +) + +// ReadFrom reads a payload of the received IPv6 datagram, from the +// endpoint c, copying the payload into b. It returns the number of +// bytes copied into b, the control message cm and the source address +// src of the received datagram. +func (c *payloadHandler) ReadFrom(b []byte) (n int, cm *ControlMessage, src net.Addr, err error) { + if !c.ok() { + return 0, nil, nil, syscall.EINVAL + } + return c.readFrom(b) +} + +// WriteTo writes a payload of the IPv6 datagram, to the destination +// address dst through the endpoint c, copying the payload from b. It +// returns the number of bytes written. The control message cm allows +// the IPv6 header fields and the datagram path to be specified. The +// cm may be nil if control of the outgoing datagram is not required. +func (c *payloadHandler) WriteTo(b []byte, cm *ControlMessage, dst net.Addr) (n int, err error) { + if !c.ok() { + return 0, syscall.EINVAL + } + return c.writeTo(b, cm, dst) +} diff --git a/api/vendor/golang.org/x/net/ipv6/payload_cmsg_go1_8.go b/api/vendor/golang.org/x/net/ipv6/payload_cmsg_go1_8.go new file mode 100644 index 0000000..fdc6c39 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/payload_cmsg_go1_8.go @@ -0,0 +1,55 @@ +// 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. + +// +build !go1.9 +// +build !nacl,!plan9,!windows + +package ipv6 + +import "net" + +func (c *payloadHandler) readFrom(b []byte) (n int, cm *ControlMessage, src net.Addr, err error) { + c.rawOpt.RLock() + oob := NewControlMessage(c.rawOpt.cflags) + c.rawOpt.RUnlock() + var nn int + switch c := c.PacketConn.(type) { + case *net.UDPConn: + if n, nn, _, src, err = c.ReadMsgUDP(b, oob); err != nil { + return 0, nil, nil, err + } + case *net.IPConn: + if n, nn, _, src, err = c.ReadMsgIP(b, oob); err != nil { + return 0, nil, nil, err + } + default: + return 0, nil, nil, &net.OpError{Op: "read", Net: c.LocalAddr().Network(), Source: c.LocalAddr(), Err: errInvalidConnType} + } + if nn > 0 { + cm = new(ControlMessage) + if err = cm.Parse(oob[:nn]); err != nil { + return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + } + if cm != nil { + cm.Src = netAddrToIP16(src) + } + return +} + +func (c *payloadHandler) writeTo(b []byte, cm *ControlMessage, dst net.Addr) (n int, err error) { + oob := cm.Marshal() + if dst == nil { + return 0, &net.OpError{Op: "write", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: errMissingAddress} + } + switch c := c.PacketConn.(type) { + case *net.UDPConn: + n, _, err = c.WriteMsgUDP(b, oob, dst.(*net.UDPAddr)) + case *net.IPConn: + n, _, err = c.WriteMsgIP(b, oob, dst.(*net.IPAddr)) + default: + return 0, &net.OpError{Op: "write", Net: c.LocalAddr().Network(), Source: c.LocalAddr(), Addr: opAddr(dst), Err: errInvalidConnType} + } + return +} diff --git a/api/vendor/golang.org/x/net/ipv6/payload_cmsg_go1_9.go b/api/vendor/golang.org/x/net/ipv6/payload_cmsg_go1_9.go new file mode 100644 index 0000000..8f6d02e --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/payload_cmsg_go1_9.go @@ -0,0 +1,57 @@ +// 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. + +// +build go1.9 +// +build !nacl,!plan9,!windows + +package ipv6 + +import ( + "net" + + "golang.org/x/net/internal/socket" +) + +func (c *payloadHandler) readFrom(b []byte) (int, *ControlMessage, net.Addr, error) { + c.rawOpt.RLock() + m := socket.Message{ + Buffers: [][]byte{b}, + OOB: NewControlMessage(c.rawOpt.cflags), + } + c.rawOpt.RUnlock() + switch c.PacketConn.(type) { + case *net.UDPConn: + if err := c.RecvMsg(&m, 0); err != nil { + return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + case *net.IPConn: + if err := c.RecvMsg(&m, 0); err != nil { + return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + default: + return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: errInvalidConnType} + } + var cm *ControlMessage + if m.NN > 0 { + cm = new(ControlMessage) + if err := cm.Parse(m.OOB[:m.NN]); err != nil { + return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + cm.Src = netAddrToIP16(m.Addr) + } + return m.N, cm, m.Addr, nil +} + +func (c *payloadHandler) writeTo(b []byte, cm *ControlMessage, dst net.Addr) (int, error) { + m := socket.Message{ + Buffers: [][]byte{b}, + OOB: cm.Marshal(), + Addr: dst, + } + err := c.SendMsg(&m, 0) + if err != nil { + err = &net.OpError{Op: "write", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Addr: opAddr(dst), Err: err} + } + return m.N, err +} diff --git a/api/vendor/golang.org/x/net/ipv6/payload_nocmsg.go b/api/vendor/golang.org/x/net/ipv6/payload_nocmsg.go new file mode 100644 index 0000000..99a4354 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/payload_nocmsg.go @@ -0,0 +1,41 @@ +// 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. + +// +build nacl plan9 windows + +package ipv6 + +import ( + "net" + "syscall" +) + +// ReadFrom reads a payload of the received IPv6 datagram, from the +// endpoint c, copying the payload into b. It returns the number of +// bytes copied into b, the control message cm and the source address +// src of the received datagram. +func (c *payloadHandler) ReadFrom(b []byte) (n int, cm *ControlMessage, src net.Addr, err error) { + if !c.ok() { + return 0, nil, nil, syscall.EINVAL + } + if n, src, err = c.PacketConn.ReadFrom(b); err != nil { + return 0, nil, nil, err + } + return +} + +// WriteTo writes a payload of the IPv6 datagram, to the destination +// address dst through the endpoint c, copying the payload from b. It +// returns the number of bytes written. The control message cm allows +// the IPv6 header fields and the datagram path to be specified. The +// cm may be nil if control of the outgoing datagram is not required. +func (c *payloadHandler) WriteTo(b []byte, cm *ControlMessage, dst net.Addr) (n int, err error) { + if !c.ok() { + return 0, syscall.EINVAL + } + if dst == nil { + return 0, errMissingAddress + } + return c.PacketConn.WriteTo(b, dst) +} diff --git a/api/vendor/golang.org/x/net/ipv6/readwrite_go1_8_test.go b/api/vendor/golang.org/x/net/ipv6/readwrite_go1_8_test.go new file mode 100644 index 0000000..c11d92a --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/readwrite_go1_8_test.go @@ -0,0 +1,242 @@ +// 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. + +// +build !go1.9 + +package ipv6_test + +import ( + "bytes" + "fmt" + "net" + "runtime" + "strings" + "sync" + "testing" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv6" +) + +func BenchmarkPacketConnReadWriteUnicast(b *testing.B) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + b.Skipf("not supported on %s", runtime.GOOS) + } + + payload := []byte("HELLO-R-U-THERE") + iph := []byte{ + 0x69, 0x8b, 0xee, 0xf1, 0xca, 0xfe, 0xff, 0x01, + 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + } + greh := []byte{0x00, 0x00, 0x86, 0xdd, 0x00, 0x00, 0x00, 0x00} + datagram := append(greh, append(iph, payload...)...) + bb := make([]byte, 128) + cm := ipv6.ControlMessage{ + TrafficClass: iana.DiffServAF11 | iana.CongestionExperienced, + HopLimit: 1, + Src: net.IPv6loopback, + } + if ifi := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagLoopback); ifi != nil { + cm.IfIndex = ifi.Index + } + + b.Run("UDP", func(b *testing.B) { + c, err := nettest.NewLocalPacketListener("udp6") + if err != nil { + b.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + dst := c.LocalAddr() + cf := ipv6.FlagHopLimit | ipv6.FlagInterface + if err := p.SetControlMessage(cf, true); err != nil { + b.Fatal(err) + } + b.Run("Net", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := c.WriteTo(payload, dst); err != nil { + b.Fatal(err) + } + if _, _, err := c.ReadFrom(bb); err != nil { + b.Fatal(err) + } + } + }) + b.Run("ToFrom", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := p.WriteTo(payload, &cm, dst); err != nil { + b.Fatal(err) + } + if _, _, _, err := p.ReadFrom(bb); err != nil { + b.Fatal(err) + } + } + }) + }) + b.Run("IP", func(b *testing.B) { + switch runtime.GOOS { + case "netbsd": + b.Skip("need to configure gre on netbsd") + case "openbsd": + b.Skip("net.inet.gre.allow=0 by default on openbsd") + } + + c, err := net.ListenPacket(fmt.Sprintf("ip6:%d", iana.ProtocolGRE), "::1") + if err != nil { + b.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + dst := c.LocalAddr() + cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagSrc | ipv6.FlagDst | ipv6.FlagInterface | ipv6.FlagPathMTU + if err := p.SetControlMessage(cf, true); err != nil { + b.Fatal(err) + } + b.Run("Net", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := c.WriteTo(datagram, dst); err != nil { + b.Fatal(err) + } + if _, _, err := c.ReadFrom(bb); err != nil { + b.Fatal(err) + } + } + }) + b.Run("ToFrom", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := p.WriteTo(datagram, &cm, dst); err != nil { + b.Fatal(err) + } + if _, _, _, err := p.ReadFrom(bb); err != nil { + b.Fatal(err) + } + } + }) + }) +} + +func TestPacketConnConcurrentReadWriteUnicast(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + + payload := []byte("HELLO-R-U-THERE") + iph := []byte{ + 0x69, 0x8b, 0xee, 0xf1, 0xca, 0xfe, 0xff, 0x01, + 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + } + greh := []byte{0x00, 0x00, 0x86, 0xdd, 0x00, 0x00, 0x00, 0x00} + datagram := append(greh, append(iph, payload...)...) + + t.Run("UDP", func(t *testing.T) { + c, err := nettest.NewLocalPacketListener("udp6") + if err != nil { + t.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + t.Run("ToFrom", func(t *testing.T) { + testPacketConnConcurrentReadWriteUnicast(t, p, payload, c.LocalAddr()) + }) + }) + t.Run("IP", func(t *testing.T) { + switch runtime.GOOS { + case "netbsd": + t.Skip("need to configure gre on netbsd") + case "openbsd": + t.Skip("net.inet.gre.allow=0 by default on openbsd") + } + + c, err := net.ListenPacket(fmt.Sprintf("ip6:%d", iana.ProtocolGRE), "::1") + if err != nil { + t.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + t.Run("ToFrom", func(t *testing.T) { + testPacketConnConcurrentReadWriteUnicast(t, p, datagram, c.LocalAddr()) + }) + }) +} + +func testPacketConnConcurrentReadWriteUnicast(t *testing.T, p *ipv6.PacketConn, data []byte, dst net.Addr) { + ifi := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagLoopback) + cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagSrc | ipv6.FlagDst | ipv6.FlagInterface | ipv6.FlagPathMTU + + if err := p.SetControlMessage(cf, true); err != nil { // probe before test + if nettest.ProtocolNotSupported(err) { + t.Skipf("not supported on %s", runtime.GOOS) + } + t.Fatal(err) + } + + var wg sync.WaitGroup + reader := func() { + defer wg.Done() + b := make([]byte, 128) + n, cm, _, err := p.ReadFrom(b) + if err != nil { + t.Error(err) + return + } + if !bytes.Equal(b[:n], data) { + t.Errorf("got %#v; want %#v", b[:n], data) + return + } + s := cm.String() + if strings.Contains(s, ",") { + t.Errorf("should be space-separated values: %s", s) + return + } + } + writer := func(toggle bool) { + defer wg.Done() + cm := ipv6.ControlMessage{ + TrafficClass: iana.DiffServAF11 | iana.CongestionExperienced, + HopLimit: 1, + Src: net.IPv6loopback, + } + if ifi != nil { + cm.IfIndex = ifi.Index + } + if err := p.SetControlMessage(cf, toggle); err != nil { + t.Error(err) + return + } + n, err := p.WriteTo(data, &cm, dst) + if err != nil { + t.Error(err) + return + } + if n != len(data) { + t.Errorf("got %d; want %d", n, len(data)) + return + } + } + + const N = 10 + wg.Add(N) + for i := 0; i < N; i++ { + go reader() + } + wg.Add(2 * N) + for i := 0; i < 2*N; i++ { + go writer(i%2 != 0) + + } + wg.Add(N) + for i := 0; i < N; i++ { + go reader() + } + wg.Wait() +} diff --git a/api/vendor/golang.org/x/net/ipv6/readwrite_go1_9_test.go b/api/vendor/golang.org/x/net/ipv6/readwrite_go1_9_test.go new file mode 100644 index 0000000..e2fd733 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/readwrite_go1_9_test.go @@ -0,0 +1,373 @@ +// 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. + +// +build go1.9 + +package ipv6_test + +import ( + "bytes" + "fmt" + "net" + "runtime" + "strings" + "sync" + "testing" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv6" +) + +func BenchmarkPacketConnReadWriteUnicast(b *testing.B) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + b.Skipf("not supported on %s", runtime.GOOS) + } + + payload := []byte("HELLO-R-U-THERE") + iph := []byte{ + 0x69, 0x8b, 0xee, 0xf1, 0xca, 0xfe, 0xff, 0x01, + 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + } + greh := []byte{0x00, 0x00, 0x86, 0xdd, 0x00, 0x00, 0x00, 0x00} + datagram := append(greh, append(iph, payload...)...) + bb := make([]byte, 128) + cm := ipv6.ControlMessage{ + TrafficClass: iana.DiffServAF11 | iana.CongestionExperienced, + HopLimit: 1, + Src: net.IPv6loopback, + } + if ifi := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagLoopback); ifi != nil { + cm.IfIndex = ifi.Index + } + + b.Run("UDP", func(b *testing.B) { + c, err := nettest.NewLocalPacketListener("udp6") + if err != nil { + b.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + dst := c.LocalAddr() + cf := ipv6.FlagHopLimit | ipv6.FlagInterface + if err := p.SetControlMessage(cf, true); err != nil { + b.Fatal(err) + } + wms := []ipv6.Message{ + { + Buffers: [][]byte{payload}, + Addr: dst, + OOB: cm.Marshal(), + }, + } + rms := []ipv6.Message{ + { + Buffers: [][]byte{bb}, + OOB: ipv6.NewControlMessage(cf), + }, + } + b.Run("Net", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := c.WriteTo(payload, dst); err != nil { + b.Fatal(err) + } + if _, _, err := c.ReadFrom(bb); err != nil { + b.Fatal(err) + } + } + }) + b.Run("ToFrom", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := p.WriteTo(payload, &cm, dst); err != nil { + b.Fatal(err) + } + if _, _, _, err := p.ReadFrom(bb); err != nil { + b.Fatal(err) + } + } + }) + b.Run("Batch", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := p.WriteBatch(wms, 0); err != nil { + b.Fatal(err) + } + if _, err := p.ReadBatch(rms, 0); err != nil { + b.Fatal(err) + } + } + }) + }) + b.Run("IP", func(b *testing.B) { + switch runtime.GOOS { + case "netbsd": + b.Skip("need to configure gre on netbsd") + case "openbsd": + b.Skip("net.inet.gre.allow=0 by default on openbsd") + } + + c, err := net.ListenPacket(fmt.Sprintf("ip6:%d", iana.ProtocolGRE), "::1") + if err != nil { + b.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + dst := c.LocalAddr() + cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagSrc | ipv6.FlagDst | ipv6.FlagInterface | ipv6.FlagPathMTU + if err := p.SetControlMessage(cf, true); err != nil { + b.Fatal(err) + } + wms := []ipv6.Message{ + { + Buffers: [][]byte{datagram}, + Addr: dst, + OOB: cm.Marshal(), + }, + } + rms := []ipv6.Message{ + { + Buffers: [][]byte{bb}, + OOB: ipv6.NewControlMessage(cf), + }, + } + b.Run("Net", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := c.WriteTo(datagram, dst); err != nil { + b.Fatal(err) + } + if _, _, err := c.ReadFrom(bb); err != nil { + b.Fatal(err) + } + } + }) + b.Run("ToFrom", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := p.WriteTo(datagram, &cm, dst); err != nil { + b.Fatal(err) + } + if _, _, _, err := p.ReadFrom(bb); err != nil { + b.Fatal(err) + } + } + }) + b.Run("Batch", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := p.WriteBatch(wms, 0); err != nil { + b.Fatal(err) + } + if _, err := p.ReadBatch(rms, 0); err != nil { + b.Fatal(err) + } + } + }) + }) +} + +func TestPacketConnConcurrentReadWriteUnicast(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + + payload := []byte("HELLO-R-U-THERE") + iph := []byte{ + 0x69, 0x8b, 0xee, 0xf1, 0xca, 0xfe, 0xff, 0x01, + 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + } + greh := []byte{0x00, 0x00, 0x86, 0xdd, 0x00, 0x00, 0x00, 0x00} + datagram := append(greh, append(iph, payload...)...) + + t.Run("UDP", func(t *testing.T) { + c, err := nettest.NewLocalPacketListener("udp6") + if err != nil { + t.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + t.Run("ToFrom", func(t *testing.T) { + testPacketConnConcurrentReadWriteUnicast(t, p, payload, c.LocalAddr(), false) + }) + t.Run("Batch", func(t *testing.T) { + testPacketConnConcurrentReadWriteUnicast(t, p, payload, c.LocalAddr(), true) + }) + }) + t.Run("IP", func(t *testing.T) { + switch runtime.GOOS { + case "netbsd": + t.Skip("need to configure gre on netbsd") + case "openbsd": + t.Skip("net.inet.gre.allow=0 by default on openbsd") + } + + c, err := net.ListenPacket(fmt.Sprintf("ip6:%d", iana.ProtocolGRE), "::1") + if err != nil { + t.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + t.Run("ToFrom", func(t *testing.T) { + testPacketConnConcurrentReadWriteUnicast(t, p, datagram, c.LocalAddr(), false) + }) + t.Run("Batch", func(t *testing.T) { + testPacketConnConcurrentReadWriteUnicast(t, p, datagram, c.LocalAddr(), true) + }) + }) +} + +func testPacketConnConcurrentReadWriteUnicast(t *testing.T, p *ipv6.PacketConn, data []byte, dst net.Addr, batch bool) { + ifi := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagLoopback) + cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagSrc | ipv6.FlagDst | ipv6.FlagInterface | ipv6.FlagPathMTU + + if err := p.SetControlMessage(cf, true); err != nil { // probe before test + if nettest.ProtocolNotSupported(err) { + t.Skipf("not supported on %s", runtime.GOOS) + } + t.Fatal(err) + } + + var wg sync.WaitGroup + reader := func() { + defer wg.Done() + b := make([]byte, 128) + n, cm, _, err := p.ReadFrom(b) + if err != nil { + t.Error(err) + return + } + if !bytes.Equal(b[:n], data) { + t.Errorf("got %#v; want %#v", b[:n], data) + return + } + s := cm.String() + if strings.Contains(s, ",") { + t.Errorf("should be space-separated values: %s", s) + return + } + } + batchReader := func() { + defer wg.Done() + ms := []ipv6.Message{ + { + Buffers: [][]byte{make([]byte, 128)}, + OOB: ipv6.NewControlMessage(cf), + }, + } + n, err := p.ReadBatch(ms, 0) + if err != nil { + t.Error(err) + return + } + if n != len(ms) { + t.Errorf("got %d; want %d", n, len(ms)) + return + } + var cm ipv6.ControlMessage + if err := cm.Parse(ms[0].OOB[:ms[0].NN]); err != nil { + t.Error(err) + return + } + b := ms[0].Buffers[0][:ms[0].N] + if !bytes.Equal(b, data) { + t.Errorf("got %#v; want %#v", b, data) + return + } + s := cm.String() + if strings.Contains(s, ",") { + t.Errorf("should be space-separated values: %s", s) + return + } + } + writer := func(toggle bool) { + defer wg.Done() + cm := ipv6.ControlMessage{ + TrafficClass: iana.DiffServAF11 | iana.CongestionExperienced, + HopLimit: 1, + Src: net.IPv6loopback, + } + if ifi != nil { + cm.IfIndex = ifi.Index + } + if err := p.SetControlMessage(cf, toggle); err != nil { + t.Error(err) + return + } + n, err := p.WriteTo(data, &cm, dst) + if err != nil { + t.Error(err) + return + } + if n != len(data) { + t.Errorf("got %d; want %d", n, len(data)) + return + } + } + batchWriter := func(toggle bool) { + defer wg.Done() + cm := ipv6.ControlMessage{ + TrafficClass: iana.DiffServAF11 | iana.CongestionExperienced, + HopLimit: 1, + Src: net.IPv6loopback, + } + if ifi != nil { + cm.IfIndex = ifi.Index + } + if err := p.SetControlMessage(cf, toggle); err != nil { + t.Error(err) + return + } + ms := []ipv6.Message{ + { + Buffers: [][]byte{data}, + OOB: cm.Marshal(), + Addr: dst, + }, + } + n, err := p.WriteBatch(ms, 0) + if err != nil { + t.Error(err) + return + } + if n != len(ms) { + t.Errorf("got %d; want %d", n, len(ms)) + return + } + if ms[0].N != len(data) { + t.Errorf("got %d; want %d", ms[0].N, len(data)) + return + } + } + + const N = 10 + wg.Add(N) + for i := 0; i < N; i++ { + if batch { + go batchReader() + } else { + go reader() + } + } + wg.Add(2 * N) + for i := 0; i < 2*N; i++ { + if batch { + go batchWriter(i%2 != 0) + } else { + go writer(i%2 != 0) + } + } + wg.Add(N) + for i := 0; i < N; i++ { + if batch { + go batchReader() + } else { + go reader() + } + } + wg.Wait() +} diff --git a/api/vendor/golang.org/x/net/ipv6/readwrite_test.go b/api/vendor/golang.org/x/net/ipv6/readwrite_test.go new file mode 100644 index 0000000..206b915 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/readwrite_test.go @@ -0,0 +1,148 @@ +// 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 ipv6_test + +import ( + "bytes" + "net" + "runtime" + "strings" + "sync" + "testing" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv6" +) + +func BenchmarkReadWriteUnicast(b *testing.B) { + c, err := nettest.NewLocalPacketListener("udp6") + if err != nil { + b.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err) + } + defer c.Close() + + dst := c.LocalAddr() + wb, rb := []byte("HELLO-R-U-THERE"), make([]byte, 128) + + b.Run("NetUDP", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := c.WriteTo(wb, dst); err != nil { + b.Fatal(err) + } + if _, _, err := c.ReadFrom(rb); err != nil { + b.Fatal(err) + } + } + }) + b.Run("IPv6UDP", func(b *testing.B) { + p := ipv6.NewPacketConn(c) + cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagSrc | ipv6.FlagDst | ipv6.FlagInterface | ipv6.FlagPathMTU + if err := p.SetControlMessage(cf, true); err != nil { + b.Fatal(err) + } + cm := ipv6.ControlMessage{ + TrafficClass: iana.DiffServAF11 | iana.CongestionExperienced, + HopLimit: 1, + } + ifi := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagLoopback) + if ifi != nil { + cm.IfIndex = ifi.Index + } + + for i := 0; i < b.N; i++ { + if _, err := p.WriteTo(wb, &cm, dst); err != nil { + b.Fatal(err) + } + if _, _, _, err := p.ReadFrom(rb); err != nil { + b.Fatal(err) + } + } + }) +} + +func TestPacketConnConcurrentReadWriteUnicastUDP(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + + c, err := nettest.NewLocalPacketListener("udp6") + if err != nil { + t.Fatal(err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + defer p.Close() + + dst := c.LocalAddr() + ifi := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagLoopback) + cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagSrc | ipv6.FlagDst | ipv6.FlagInterface | ipv6.FlagPathMTU + wb := []byte("HELLO-R-U-THERE") + + if err := p.SetControlMessage(cf, true); err != nil { // probe before test + if nettest.ProtocolNotSupported(err) { + t.Skipf("not supported on %s", runtime.GOOS) + } + t.Fatal(err) + } + + var wg sync.WaitGroup + reader := func() { + defer wg.Done() + rb := make([]byte, 128) + if n, cm, _, err := p.ReadFrom(rb); err != nil { + t.Error(err) + return + } else if !bytes.Equal(rb[:n], wb) { + t.Errorf("got %v; want %v", rb[:n], wb) + return + } else { + s := cm.String() + if strings.Contains(s, ",") { + t.Errorf("should be space-separated values: %s", s) + } + } + } + writer := func(toggle bool) { + defer wg.Done() + cm := ipv6.ControlMessage{ + TrafficClass: iana.DiffServAF11 | iana.CongestionExperienced, + Src: net.IPv6loopback, + } + if ifi != nil { + cm.IfIndex = ifi.Index + } + if err := p.SetControlMessage(cf, toggle); err != nil { + t.Error(err) + return + } + if n, err := p.WriteTo(wb, &cm, dst); err != nil { + t.Error(err) + return + } else if n != len(wb) { + t.Errorf("got %d; want %d", n, len(wb)) + return + } + } + + const N = 10 + wg.Add(N) + for i := 0; i < N; i++ { + go reader() + } + wg.Add(2 * N) + for i := 0; i < 2*N; i++ { + go writer(i%2 != 0) + } + wg.Add(N) + for i := 0; i < N; i++ { + go reader() + } + wg.Wait() +} diff --git a/api/vendor/golang.org/x/net/ipv6/sockopt.go b/api/vendor/golang.org/x/net/ipv6/sockopt.go new file mode 100644 index 0000000..cc3907d --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/sockopt.go @@ -0,0 +1,43 @@ +// 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 ipv6 + +import "golang.org/x/net/internal/socket" + +// Sticky socket options +const ( + ssoTrafficClass = iota // header field for unicast packet, RFC 3542 + ssoHopLimit // header field for unicast packet, RFC 3493 + ssoMulticastInterface // outbound interface for multicast packet, RFC 3493 + ssoMulticastHopLimit // header field for multicast packet, RFC 3493 + ssoMulticastLoopback // loopback for multicast packet, RFC 3493 + ssoReceiveTrafficClass // header field on received packet, RFC 3542 + ssoReceiveHopLimit // header field on received packet, RFC 2292 or 3542 + ssoReceivePacketInfo // incbound or outbound packet path, RFC 2292 or 3542 + ssoReceivePathMTU // path mtu, RFC 3542 + ssoPathMTU // path mtu, RFC 3542 + ssoChecksum // packet checksum, RFC 2292 or 3542 + ssoICMPFilter // icmp filter, RFC 2292 or 3542 + ssoJoinGroup // any-source multicast, RFC 3493 + ssoLeaveGroup // any-source multicast, RFC 3493 + ssoJoinSourceGroup // source-specific multicast + ssoLeaveSourceGroup // source-specific multicast + ssoBlockSourceGroup // any-source or source-specific multicast + ssoUnblockSourceGroup // any-source or source-specific multicast + ssoAttachFilter // attach BPF for filtering inbound traffic +) + +// Sticky socket option value types +const ( + ssoTypeIPMreq = iota + 1 + ssoTypeGroupReq + ssoTypeGroupSourceReq +) + +// A sockOpt represents a binding for sticky socket option. +type sockOpt struct { + socket.Option + typ int // hint for option value type; optional +} diff --git a/api/vendor/golang.org/x/net/ipv6/sockopt_posix.go b/api/vendor/golang.org/x/net/ipv6/sockopt_posix.go new file mode 100644 index 0000000..0eac86e --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/sockopt_posix.go @@ -0,0 +1,87 @@ +// 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows + +package ipv6 + +import ( + "net" + "unsafe" + + "golang.org/x/net/bpf" + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) getMulticastInterface(c *socket.Conn) (*net.Interface, error) { + n, err := so.GetInt(c) + if err != nil { + return nil, err + } + return net.InterfaceByIndex(n) +} + +func (so *sockOpt) setMulticastInterface(c *socket.Conn, ifi *net.Interface) error { + var n int + if ifi != nil { + n = ifi.Index + } + return so.SetInt(c, n) +} + +func (so *sockOpt) getICMPFilter(c *socket.Conn) (*ICMPFilter, error) { + b := make([]byte, so.Len) + n, err := so.Get(c, b) + if err != nil { + return nil, err + } + if n != sizeofICMPv6Filter { + return nil, errOpNoSupport + } + return (*ICMPFilter)(unsafe.Pointer(&b[0])), nil +} + +func (so *sockOpt) setICMPFilter(c *socket.Conn, f *ICMPFilter) error { + b := (*[sizeofICMPv6Filter]byte)(unsafe.Pointer(f))[:sizeofICMPv6Filter] + return so.Set(c, b) +} + +func (so *sockOpt) getMTUInfo(c *socket.Conn) (*net.Interface, int, error) { + b := make([]byte, so.Len) + n, err := so.Get(c, b) + if err != nil { + return nil, 0, err + } + if n != sizeofIPv6Mtuinfo { + return nil, 0, errOpNoSupport + } + mi := (*ipv6Mtuinfo)(unsafe.Pointer(&b[0])) + if mi.Addr.Scope_id == 0 { + return nil, int(mi.Mtu), nil + } + ifi, err := net.InterfaceByIndex(int(mi.Addr.Scope_id)) + if err != nil { + return nil, 0, err + } + return ifi, int(mi.Mtu), nil +} + +func (so *sockOpt) setGroup(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + switch so.typ { + case ssoTypeIPMreq: + return so.setIPMreq(c, ifi, grp) + case ssoTypeGroupReq: + return so.setGroupReq(c, ifi, grp) + default: + return errOpNoSupport + } +} + +func (so *sockOpt) setSourceGroup(c *socket.Conn, ifi *net.Interface, grp, src net.IP) error { + return so.setGroupSourceReq(c, ifi, grp, src) +} + +func (so *sockOpt) setBPF(c *socket.Conn, f []bpf.RawInstruction) error { + return so.setAttachFilter(c, f) +} diff --git a/api/vendor/golang.org/x/net/ipv6/sockopt_stub.go b/api/vendor/golang.org/x/net/ipv6/sockopt_stub.go new file mode 100644 index 0000000..1f4a273 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/sockopt_stub.go @@ -0,0 +1,46 @@ +// 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. + +// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows + +package ipv6 + +import ( + "net" + + "golang.org/x/net/bpf" + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) getMulticastInterface(c *socket.Conn) (*net.Interface, error) { + return nil, errOpNoSupport +} + +func (so *sockOpt) setMulticastInterface(c *socket.Conn, ifi *net.Interface) error { + return errOpNoSupport +} + +func (so *sockOpt) getICMPFilter(c *socket.Conn) (*ICMPFilter, error) { + return nil, errOpNoSupport +} + +func (so *sockOpt) setICMPFilter(c *socket.Conn, f *ICMPFilter) error { + return errOpNoSupport +} + +func (so *sockOpt) getMTUInfo(c *socket.Conn) (*net.Interface, int, error) { + return nil, 0, errOpNoSupport +} + +func (so *sockOpt) setGroup(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + return errOpNoSupport +} + +func (so *sockOpt) setSourceGroup(c *socket.Conn, ifi *net.Interface, grp, src net.IP) error { + return errOpNoSupport +} + +func (so *sockOpt) setBPF(c *socket.Conn, f []bpf.RawInstruction) error { + return errOpNoSupport +} diff --git a/api/vendor/golang.org/x/net/ipv6/sockopt_test.go b/api/vendor/golang.org/x/net/ipv6/sockopt_test.go new file mode 100644 index 0000000..774338d --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/sockopt_test.go @@ -0,0 +1,133 @@ +// 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 ipv6_test + +import ( + "fmt" + "net" + "runtime" + "testing" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv6" +) + +var supportsIPv6 bool = nettest.SupportsIPv6() + +func TestConnInitiatorPathMTU(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + + ln, err := net.Listen("tcp6", "[::1]:0") + if err != nil { + t.Fatal(err) + } + defer ln.Close() + + done := make(chan bool) + go acceptor(t, ln, done) + + c, err := net.Dial("tcp6", ln.Addr().String()) + if err != nil { + t.Fatal(err) + } + defer c.Close() + + if pmtu, err := ipv6.NewConn(c).PathMTU(); err != nil { + switch runtime.GOOS { + case "darwin": // older darwin kernels don't support IPV6_PATHMTU option + t.Logf("not supported on %s", runtime.GOOS) + default: + t.Fatal(err) + } + } else { + t.Logf("path mtu for %v: %v", c.RemoteAddr(), pmtu) + } + + <-done +} + +func TestConnResponderPathMTU(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + + ln, err := net.Listen("tcp6", "[::1]:0") + if err != nil { + t.Fatal(err) + } + defer ln.Close() + + done := make(chan bool) + go connector(t, "tcp6", ln.Addr().String(), done) + + c, err := ln.Accept() + if err != nil { + t.Fatal(err) + } + defer c.Close() + + if pmtu, err := ipv6.NewConn(c).PathMTU(); err != nil { + switch runtime.GOOS { + case "darwin": // older darwin kernels don't support IPV6_PATHMTU option + t.Logf("not supported on %s", runtime.GOOS) + default: + t.Fatal(err) + } + } else { + t.Logf("path mtu for %v: %v", c.RemoteAddr(), pmtu) + } + + <-done +} + +func TestPacketConnChecksum(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + + c, err := net.ListenPacket(fmt.Sprintf("ip6:%d", iana.ProtocolOSPFIGP), "::") // OSPF for IPv6 + if err != nil { + t.Fatal(err) + } + defer c.Close() + + p := ipv6.NewPacketConn(c) + offset := 12 // see RFC 5340 + + for _, toggle := range []bool{false, true} { + if err := p.SetChecksum(toggle, offset); err != nil { + if toggle { + t.Fatalf("ipv6.PacketConn.SetChecksum(%v, %v) failed: %v", toggle, offset, err) + } else { + // Some platforms never allow to disable the kernel + // checksum processing. + t.Logf("ipv6.PacketConn.SetChecksum(%v, %v) failed: %v", toggle, offset, err) + } + } + if on, offset, err := p.Checksum(); err != nil { + t.Fatal(err) + } else { + t.Logf("kernel checksum processing enabled=%v, offset=%v", on, offset) + } + } +} diff --git a/api/vendor/golang.org/x/net/ipv6/sys_asmreq.go b/api/vendor/golang.org/x/net/ipv6/sys_asmreq.go new file mode 100644 index 0000000..b0510c0 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/sys_asmreq.go @@ -0,0 +1,24 @@ +// 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows + +package ipv6 + +import ( + "net" + "unsafe" + + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) setIPMreq(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + var mreq ipv6Mreq + copy(mreq.Multiaddr[:], grp) + if ifi != nil { + mreq.setIfindex(ifi.Index) + } + b := (*[sizeofIPv6Mreq]byte)(unsafe.Pointer(&mreq))[:sizeofIPv6Mreq] + return so.Set(c, b) +} diff --git a/api/vendor/golang.org/x/net/ipv6/sys_asmreq_stub.go b/api/vendor/golang.org/x/net/ipv6/sys_asmreq_stub.go new file mode 100644 index 0000000..eece961 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/sys_asmreq_stub.go @@ -0,0 +1,17 @@ +// 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. + +// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows + +package ipv6 + +import ( + "net" + + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) setIPMreq(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + return errOpNoSupport +} diff --git a/api/vendor/golang.org/x/net/ipv6/sys_bpf.go b/api/vendor/golang.org/x/net/ipv6/sys_bpf.go new file mode 100644 index 0000000..b2dbcb2 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/sys_bpf.go @@ -0,0 +1,23 @@ +// 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. + +// +build linux + +package ipv6 + +import ( + "unsafe" + + "golang.org/x/net/bpf" + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) setAttachFilter(c *socket.Conn, f []bpf.RawInstruction) error { + prog := sockFProg{ + Len: uint16(len(f)), + Filter: (*sockFilter)(unsafe.Pointer(&f[0])), + } + b := (*[sizeofSockFprog]byte)(unsafe.Pointer(&prog))[:sizeofSockFprog] + return so.Set(c, b) +} diff --git a/api/vendor/golang.org/x/net/ipv6/sys_bpf_stub.go b/api/vendor/golang.org/x/net/ipv6/sys_bpf_stub.go new file mode 100644 index 0000000..676bea5 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/sys_bpf_stub.go @@ -0,0 +1,16 @@ +// 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. + +// +build !linux + +package ipv6 + +import ( + "golang.org/x/net/bpf" + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) setAttachFilter(c *socket.Conn, f []bpf.RawInstruction) error { + return errOpNoSupport +} diff --git a/api/vendor/golang.org/x/net/ipv6/sys_bsd.go b/api/vendor/golang.org/x/net/ipv6/sys_bsd.go new file mode 100644 index 0000000..e416eaa --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/sys_bsd.go @@ -0,0 +1,57 @@ +// 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. + +// +build dragonfly netbsd openbsd + +package ipv6 + +import ( + "net" + "syscall" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTrafficClass: {sysIPV6_TCLASS, 4, marshalTrafficClass, parseTrafficClass}, + ctlHopLimit: {sysIPV6_HOPLIMIT, 4, marshalHopLimit, parseHopLimit}, + ctlPacketInfo: {sysIPV6_PKTINFO, sizeofInet6Pktinfo, marshalPacketInfo, parsePacketInfo}, + ctlNextHop: {sysIPV6_NEXTHOP, sizeofSockaddrInet6, marshalNextHop, parseNextHop}, + ctlPathMTU: {sysIPV6_PATHMTU, sizeofIPv6Mtuinfo, marshalPathMTU, parsePathMTU}, + } + + sockOpts = map[int]*sockOpt{ + ssoTrafficClass: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_TCLASS, Len: 4}}, + ssoHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_UNICAST_HOPS, Len: 4}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_IF, Len: 4}}, + ssoMulticastHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_HOPS, Len: 4}}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_LOOP, Len: 4}}, + ssoReceiveTrafficClass: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVTCLASS, Len: 4}}, + ssoReceiveHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVHOPLIMIT, Len: 4}}, + ssoReceivePacketInfo: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVPKTINFO, Len: 4}}, + ssoReceivePathMTU: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVPATHMTU, Len: 4}}, + ssoPathMTU: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_PATHMTU, Len: sizeofIPv6Mtuinfo}}, + ssoChecksum: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_CHECKSUM, Len: 4}}, + ssoICMPFilter: {Option: socket.Option{Level: iana.ProtocolIPv6ICMP, Name: sysICMP6_FILTER, Len: sizeofICMPv6Filter}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_JOIN_GROUP, Len: sizeofIPv6Mreq}, typ: ssoTypeIPMreq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_LEAVE_GROUP, Len: sizeofIPv6Mreq}, typ: ssoTypeIPMreq}, + } +) + +func (sa *sockaddrInet6) setSockaddr(ip net.IP, i int) { + sa.Len = sizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], ip) + sa.Scope_id = uint32(i) +} + +func (pi *inet6Pktinfo) setIfindex(i int) { + pi.Ifindex = uint32(i) +} + +func (mreq *ipv6Mreq) setIfindex(i int) { + mreq.Interface = uint32(i) +} diff --git a/api/vendor/golang.org/x/net/ipv6/sys_darwin.go b/api/vendor/golang.org/x/net/ipv6/sys_darwin.go new file mode 100644 index 0000000..e3d0443 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/sys_darwin.go @@ -0,0 +1,106 @@ +// 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 ipv6 + +import ( + "net" + "strconv" + "strings" + "syscall" + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlHopLimit: {sysIPV6_2292HOPLIMIT, 4, marshal2292HopLimit, parseHopLimit}, + ctlPacketInfo: {sysIPV6_2292PKTINFO, sizeofInet6Pktinfo, marshal2292PacketInfo, parsePacketInfo}, + } + + sockOpts = map[int]*sockOpt{ + ssoHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_UNICAST_HOPS, Len: 4}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_IF, Len: 4}}, + ssoMulticastHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_HOPS, Len: 4}}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_LOOP, Len: 4}}, + ssoReceiveHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_2292HOPLIMIT, Len: 4}}, + ssoReceivePacketInfo: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_2292PKTINFO, Len: 4}}, + ssoChecksum: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_CHECKSUM, Len: 4}}, + ssoICMPFilter: {Option: socket.Option{Level: iana.ProtocolIPv6ICMP, Name: sysICMP6_FILTER, Len: sizeofICMPv6Filter}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_JOIN_GROUP, Len: sizeofIPv6Mreq}, typ: ssoTypeIPMreq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_LEAVE_GROUP, Len: sizeofIPv6Mreq}, typ: ssoTypeIPMreq}, + } +) + +func init() { + // Seems like kern.osreldate is veiled on latest OS X. We use + // kern.osrelease instead. + s, err := syscall.Sysctl("kern.osrelease") + if err != nil { + return + } + ss := strings.Split(s, ".") + if len(ss) == 0 { + return + } + // The IP_PKTINFO and protocol-independent multicast API were + // introduced in OS X 10.7 (Darwin 11). But it looks like + // those features require OS X 10.8 (Darwin 12) or above. + // See http://support.apple.com/kb/HT1633. + if mjver, err := strconv.Atoi(ss[0]); err != nil || mjver < 12 { + return + } + ctlOpts[ctlTrafficClass] = ctlOpt{sysIPV6_TCLASS, 4, marshalTrafficClass, parseTrafficClass} + ctlOpts[ctlHopLimit] = ctlOpt{sysIPV6_HOPLIMIT, 4, marshalHopLimit, parseHopLimit} + ctlOpts[ctlPacketInfo] = ctlOpt{sysIPV6_PKTINFO, sizeofInet6Pktinfo, marshalPacketInfo, parsePacketInfo} + ctlOpts[ctlNextHop] = ctlOpt{sysIPV6_NEXTHOP, sizeofSockaddrInet6, marshalNextHop, parseNextHop} + ctlOpts[ctlPathMTU] = ctlOpt{sysIPV6_PATHMTU, sizeofIPv6Mtuinfo, marshalPathMTU, parsePathMTU} + sockOpts[ssoTrafficClass] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_TCLASS, Len: 4}} + sockOpts[ssoReceiveTrafficClass] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVTCLASS, Len: 4}} + sockOpts[ssoReceiveHopLimit] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVHOPLIMIT, Len: 4}} + sockOpts[ssoReceivePacketInfo] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVPKTINFO, Len: 4}} + sockOpts[ssoReceivePathMTU] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVPATHMTU, Len: 4}} + sockOpts[ssoPathMTU] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_PATHMTU, Len: sizeofIPv6Mtuinfo}} + sockOpts[ssoJoinGroup] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_JOIN_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq} + sockOpts[ssoLeaveGroup] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_LEAVE_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq} + sockOpts[ssoJoinSourceGroup] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_JOIN_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq} + sockOpts[ssoLeaveSourceGroup] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_LEAVE_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq} + sockOpts[ssoBlockSourceGroup] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_BLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq} + sockOpts[ssoUnblockSourceGroup] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_UNBLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq} +} + +func (sa *sockaddrInet6) setSockaddr(ip net.IP, i int) { + sa.Len = sizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], ip) + sa.Scope_id = uint32(i) +} + +func (pi *inet6Pktinfo) setIfindex(i int) { + pi.Ifindex = uint32(i) +} + +func (mreq *ipv6Mreq) setIfindex(i int) { + mreq.Interface = uint32(i) +} + +func (gr *groupReq) setGroup(grp net.IP) { + sa := (*sockaddrInet6)(unsafe.Pointer(uintptr(unsafe.Pointer(gr)) + 4)) + sa.Len = sizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], grp) +} + +func (gsr *groupSourceReq) setSourceGroup(grp, src net.IP) { + sa := (*sockaddrInet6)(unsafe.Pointer(uintptr(unsafe.Pointer(gsr)) + 4)) + sa.Len = sizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], grp) + sa = (*sockaddrInet6)(unsafe.Pointer(uintptr(unsafe.Pointer(gsr)) + 132)) + sa.Len = sizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], src) +} diff --git a/api/vendor/golang.org/x/net/ipv6/sys_freebsd.go b/api/vendor/golang.org/x/net/ipv6/sys_freebsd.go new file mode 100644 index 0000000..e9349dc --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/sys_freebsd.go @@ -0,0 +1,92 @@ +// 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 ipv6 + +import ( + "net" + "runtime" + "strings" + "syscall" + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTrafficClass: {sysIPV6_TCLASS, 4, marshalTrafficClass, parseTrafficClass}, + ctlHopLimit: {sysIPV6_HOPLIMIT, 4, marshalHopLimit, parseHopLimit}, + ctlPacketInfo: {sysIPV6_PKTINFO, sizeofInet6Pktinfo, marshalPacketInfo, parsePacketInfo}, + ctlNextHop: {sysIPV6_NEXTHOP, sizeofSockaddrInet6, marshalNextHop, parseNextHop}, + ctlPathMTU: {sysIPV6_PATHMTU, sizeofIPv6Mtuinfo, marshalPathMTU, parsePathMTU}, + } + + sockOpts = map[int]sockOpt{ + ssoTrafficClass: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_TCLASS, Len: 4}}, + ssoHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_UNICAST_HOPS, Len: 4}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_IF, Len: 4}}, + ssoMulticastHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_HOPS, Len: 4}}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_LOOP, Len: 4}}, + ssoReceiveTrafficClass: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVTCLASS, Len: 4}}, + ssoReceiveHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVHOPLIMIT, Len: 4}}, + ssoReceivePacketInfo: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVPKTINFO, Len: 4}}, + ssoReceivePathMTU: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVPATHMTU, Len: 4}}, + ssoPathMTU: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_PATHMTU, Len: sizeofIPv6Mtuinfo}}, + ssoChecksum: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_CHECKSUM, Len: 4}}, + ssoICMPFilter: {Option: socket.Option{Level: iana.ProtocolIPv6ICMP, Name: sysICMP6_FILTER, Len: sizeofICMPv6Filter}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_JOIN_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_LEAVE_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoJoinSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_JOIN_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoLeaveSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_LEAVE_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoBlockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_BLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoUnblockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_UNBLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + } +) + +func init() { + if runtime.GOOS == "freebsd" && runtime.GOARCH == "386" { + archs, _ := syscall.Sysctl("kern.supported_archs") + for _, s := range strings.Fields(archs) { + if s == "amd64" { + freebsd32o64 = true + break + } + } + } +} + +func (sa *sockaddrInet6) setSockaddr(ip net.IP, i int) { + sa.Len = sizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], ip) + sa.Scope_id = uint32(i) +} + +func (pi *inet6Pktinfo) setIfindex(i int) { + pi.Ifindex = uint32(i) +} + +func (mreq *ipv6Mreq) setIfindex(i int) { + mreq.Interface = uint32(i) +} + +func (gr *groupReq) setGroup(grp net.IP) { + sa := (*sockaddrInet6)(unsafe.Pointer(&gr.Group)) + sa.Len = sizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], grp) +} + +func (gsr *groupSourceReq) setSourceGroup(grp, src net.IP) { + sa := (*sockaddrInet6)(unsafe.Pointer(&gsr.Group)) + sa.Len = sizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], grp) + sa = (*sockaddrInet6)(unsafe.Pointer(&gsr.Source)) + sa.Len = sizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], src) +} diff --git a/api/vendor/golang.org/x/net/ipv6/sys_linux.go b/api/vendor/golang.org/x/net/ipv6/sys_linux.go new file mode 100644 index 0000000..bc21810 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/sys_linux.go @@ -0,0 +1,74 @@ +// 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 ipv6 + +import ( + "net" + "syscall" + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTrafficClass: {sysIPV6_TCLASS, 4, marshalTrafficClass, parseTrafficClass}, + ctlHopLimit: {sysIPV6_HOPLIMIT, 4, marshalHopLimit, parseHopLimit}, + ctlPacketInfo: {sysIPV6_PKTINFO, sizeofInet6Pktinfo, marshalPacketInfo, parsePacketInfo}, + ctlPathMTU: {sysIPV6_PATHMTU, sizeofIPv6Mtuinfo, marshalPathMTU, parsePathMTU}, + } + + sockOpts = map[int]*sockOpt{ + ssoTrafficClass: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_TCLASS, Len: 4}}, + ssoHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_UNICAST_HOPS, Len: 4}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_IF, Len: 4}}, + ssoMulticastHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_HOPS, Len: 4}}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_LOOP, Len: 4}}, + ssoReceiveTrafficClass: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVTCLASS, Len: 4}}, + ssoReceiveHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVHOPLIMIT, Len: 4}}, + ssoReceivePacketInfo: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVPKTINFO, Len: 4}}, + ssoReceivePathMTU: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVPATHMTU, Len: 4}}, + ssoPathMTU: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_PATHMTU, Len: sizeofIPv6Mtuinfo}}, + ssoChecksum: {Option: socket.Option{Level: iana.ProtocolReserved, Name: sysIPV6_CHECKSUM, Len: 4}}, + ssoICMPFilter: {Option: socket.Option{Level: iana.ProtocolIPv6ICMP, Name: sysICMPV6_FILTER, Len: sizeofICMPv6Filter}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_JOIN_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_LEAVE_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoJoinSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_JOIN_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoLeaveSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_LEAVE_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoBlockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_BLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoUnblockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_UNBLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoAttachFilter: {Option: socket.Option{Level: sysSOL_SOCKET, Name: sysSO_ATTACH_FILTER, Len: sizeofSockFprog}}, + } +) + +func (sa *sockaddrInet6) setSockaddr(ip net.IP, i int) { + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], ip) + sa.Scope_id = uint32(i) +} + +func (pi *inet6Pktinfo) setIfindex(i int) { + pi.Ifindex = int32(i) +} + +func (mreq *ipv6Mreq) setIfindex(i int) { + mreq.Ifindex = int32(i) +} + +func (gr *groupReq) setGroup(grp net.IP) { + sa := (*sockaddrInet6)(unsafe.Pointer(&gr.Group)) + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], grp) +} + +func (gsr *groupSourceReq) setSourceGroup(grp, src net.IP) { + sa := (*sockaddrInet6)(unsafe.Pointer(&gsr.Group)) + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], grp) + sa = (*sockaddrInet6)(unsafe.Pointer(&gsr.Source)) + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], src) +} diff --git a/api/vendor/golang.org/x/net/ipv6/sys_solaris.go b/api/vendor/golang.org/x/net/ipv6/sys_solaris.go new file mode 100644 index 0000000..d348b5f --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/sys_solaris.go @@ -0,0 +1,74 @@ +// 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 ipv6 + +import ( + "net" + "syscall" + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTrafficClass: {sysIPV6_TCLASS, 4, marshalTrafficClass, parseTrafficClass}, + ctlHopLimit: {sysIPV6_HOPLIMIT, 4, marshalHopLimit, parseHopLimit}, + ctlPacketInfo: {sysIPV6_PKTINFO, sizeofInet6Pktinfo, marshalPacketInfo, parsePacketInfo}, + ctlNextHop: {sysIPV6_NEXTHOP, sizeofSockaddrInet6, marshalNextHop, parseNextHop}, + ctlPathMTU: {sysIPV6_PATHMTU, sizeofIPv6Mtuinfo, marshalPathMTU, parsePathMTU}, + } + + sockOpts = map[int]*sockOpt{ + ssoTrafficClass: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_TCLASS, Len: 4}}, + ssoHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_UNICAST_HOPS, Len: 4}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_IF, Len: 4}}, + ssoMulticastHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_HOPS, Len: 4}}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_LOOP, Len: 4}}, + ssoReceiveTrafficClass: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVTCLASS, Len: 4}}, + ssoReceiveHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVHOPLIMIT, Len: 4}}, + ssoReceivePacketInfo: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVPKTINFO, Len: 4}}, + ssoReceivePathMTU: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVPATHMTU, Len: 4}}, + ssoPathMTU: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_PATHMTU, Len: sizeofIPv6Mtuinfo}}, + ssoChecksum: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_CHECKSUM, Len: 4}}, + ssoICMPFilter: {Option: socket.Option{Level: iana.ProtocolIPv6ICMP, Name: sysICMP6_FILTER, Len: sizeofICMPv6Filter}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_JOIN_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_LEAVE_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoJoinSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_JOIN_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoLeaveSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_LEAVE_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoBlockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_BLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoUnblockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_UNBLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + } +) + +func (sa *sockaddrInet6) setSockaddr(ip net.IP, i int) { + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], ip) + sa.Scope_id = uint32(i) +} + +func (pi *inet6Pktinfo) setIfindex(i int) { + pi.Ifindex = uint32(i) +} + +func (mreq *ipv6Mreq) setIfindex(i int) { + mreq.Interface = uint32(i) +} + +func (gr *groupReq) setGroup(grp net.IP) { + sa := (*sockaddrInet6)(unsafe.Pointer(uintptr(unsafe.Pointer(gr)) + 4)) + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], grp) +} + +func (gsr *groupSourceReq) setSourceGroup(grp, src net.IP) { + sa := (*sockaddrInet6)(unsafe.Pointer(uintptr(unsafe.Pointer(gsr)) + 4)) + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], grp) + sa = (*sockaddrInet6)(unsafe.Pointer(uintptr(unsafe.Pointer(gsr)) + 260)) + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], src) +} diff --git a/api/vendor/golang.org/x/net/ipv6/sys_ssmreq.go b/api/vendor/golang.org/x/net/ipv6/sys_ssmreq.go new file mode 100644 index 0000000..add8ccc --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/sys_ssmreq.go @@ -0,0 +1,54 @@ +// 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. + +// +build darwin freebsd linux solaris + +package ipv6 + +import ( + "net" + "unsafe" + + "golang.org/x/net/internal/socket" +) + +var freebsd32o64 bool + +func (so *sockOpt) setGroupReq(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + var gr groupReq + if ifi != nil { + gr.Interface = uint32(ifi.Index) + } + gr.setGroup(grp) + var b []byte + if freebsd32o64 { + var d [sizeofGroupReq + 4]byte + s := (*[sizeofGroupReq]byte)(unsafe.Pointer(&gr)) + copy(d[:4], s[:4]) + copy(d[8:], s[4:]) + b = d[:] + } else { + b = (*[sizeofGroupReq]byte)(unsafe.Pointer(&gr))[:sizeofGroupReq] + } + return so.Set(c, b) +} + +func (so *sockOpt) setGroupSourceReq(c *socket.Conn, ifi *net.Interface, grp, src net.IP) error { + var gsr groupSourceReq + if ifi != nil { + gsr.Interface = uint32(ifi.Index) + } + gsr.setSourceGroup(grp, src) + var b []byte + if freebsd32o64 { + var d [sizeofGroupSourceReq + 4]byte + s := (*[sizeofGroupSourceReq]byte)(unsafe.Pointer(&gsr)) + copy(d[:4], s[:4]) + copy(d[8:], s[4:]) + b = d[:] + } else { + b = (*[sizeofGroupSourceReq]byte)(unsafe.Pointer(&gsr))[:sizeofGroupSourceReq] + } + return so.Set(c, b) +} diff --git a/api/vendor/golang.org/x/net/ipv6/sys_ssmreq_stub.go b/api/vendor/golang.org/x/net/ipv6/sys_ssmreq_stub.go new file mode 100644 index 0000000..581ee49 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/sys_ssmreq_stub.go @@ -0,0 +1,21 @@ +// 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. + +// +build !darwin,!freebsd,!linux,!solaris + +package ipv6 + +import ( + "net" + + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) setGroupReq(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + return errOpNoSupport +} + +func (so *sockOpt) setGroupSourceReq(c *socket.Conn, ifi *net.Interface, grp, src net.IP) error { + return errOpNoSupport +} diff --git a/api/vendor/golang.org/x/net/ipv6/sys_stub.go b/api/vendor/golang.org/x/net/ipv6/sys_stub.go new file mode 100644 index 0000000..b845388 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/sys_stub.go @@ -0,0 +1,13 @@ +// 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. + +// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows + +package ipv6 + +var ( + ctlOpts = [ctlMax]ctlOpt{} + + sockOpts = map[int]*sockOpt{} +) diff --git a/api/vendor/golang.org/x/net/ipv6/sys_windows.go b/api/vendor/golang.org/x/net/ipv6/sys_windows.go new file mode 100644 index 0000000..fc36b01 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/sys_windows.go @@ -0,0 +1,75 @@ +// 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 ipv6 + +import ( + "net" + "syscall" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +const ( + // See ws2tcpip.h. + sysIPV6_UNICAST_HOPS = 0x4 + sysIPV6_MULTICAST_IF = 0x9 + sysIPV6_MULTICAST_HOPS = 0xa + sysIPV6_MULTICAST_LOOP = 0xb + sysIPV6_JOIN_GROUP = 0xc + sysIPV6_LEAVE_GROUP = 0xd + sysIPV6_PKTINFO = 0x13 + + sizeofSockaddrInet6 = 0x1c + + sizeofIPv6Mreq = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofICMPv6Filter = 0 +) + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type icmpv6Filter struct { + // TODO(mikio): implement this +} + +var ( + ctlOpts = [ctlMax]ctlOpt{} + + sockOpts = map[int]*sockOpt{ + ssoHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_UNICAST_HOPS, Len: 4}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_IF, Len: 4}}, + ssoMulticastHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_HOPS, Len: 4}}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_LOOP, Len: 4}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_JOIN_GROUP, Len: sizeofIPv6Mreq}, typ: ssoTypeIPMreq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_LEAVE_GROUP, Len: sizeofIPv6Mreq}, typ: ssoTypeIPMreq}, + } +) + +func (sa *sockaddrInet6) setSockaddr(ip net.IP, i int) { + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], ip) + sa.Scope_id = uint32(i) +} + +func (mreq *ipv6Mreq) setIfindex(i int) { + mreq.Interface = uint32(i) +} diff --git a/api/vendor/golang.org/x/net/ipv6/unicast_test.go b/api/vendor/golang.org/x/net/ipv6/unicast_test.go new file mode 100644 index 0000000..a0b7d95 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/unicast_test.go @@ -0,0 +1,184 @@ +// 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 ipv6_test + +import ( + "bytes" + "net" + "os" + "runtime" + "testing" + "time" + + "golang.org/x/net/icmp" + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv6" +) + +func TestPacketConnReadWriteUnicastUDP(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + + c, err := nettest.NewLocalPacketListener("udp6") + if err != nil { + t.Fatal(err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + defer p.Close() + + dst := c.LocalAddr() + cm := ipv6.ControlMessage{ + TrafficClass: iana.DiffServAF11 | iana.CongestionExperienced, + Src: net.IPv6loopback, + } + cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagSrc | ipv6.FlagDst | ipv6.FlagInterface | ipv6.FlagPathMTU + ifi := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagLoopback) + if ifi != nil { + cm.IfIndex = ifi.Index + } + wb := []byte("HELLO-R-U-THERE") + + for i, toggle := range []bool{true, false, true} { + if err := p.SetControlMessage(cf, toggle); err != nil { + if nettest.ProtocolNotSupported(err) { + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + cm.HopLimit = i + 1 + if err := p.SetWriteDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { + t.Fatal(err) + } + if n, err := p.WriteTo(wb, &cm, dst); err != nil { + t.Fatal(err) + } else if n != len(wb) { + t.Fatalf("got %v; want %v", n, len(wb)) + } + rb := make([]byte, 128) + if err := p.SetReadDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { + t.Fatal(err) + } + if n, _, _, err := p.ReadFrom(rb); err != nil { + t.Fatal(err) + } else if !bytes.Equal(rb[:n], wb) { + t.Fatalf("got %v; want %v", rb[:n], wb) + } + } +} + +func TestPacketConnReadWriteUnicastICMP(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + + c, err := net.ListenPacket("ip6:ipv6-icmp", "::1") + if err != nil { + t.Fatal(err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + defer p.Close() + + dst, err := net.ResolveIPAddr("ip6", "::1") + if err != nil { + t.Fatal(err) + } + + pshicmp := icmp.IPv6PseudoHeader(c.LocalAddr().(*net.IPAddr).IP, dst.IP) + cm := ipv6.ControlMessage{ + TrafficClass: iana.DiffServAF11 | iana.CongestionExperienced, + Src: net.IPv6loopback, + } + cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagSrc | ipv6.FlagDst | ipv6.FlagInterface | ipv6.FlagPathMTU + ifi := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagLoopback) + if ifi != nil { + cm.IfIndex = ifi.Index + } + + var f ipv6.ICMPFilter + f.SetAll(true) + f.Accept(ipv6.ICMPTypeEchoReply) + if err := p.SetICMPFilter(&f); err != nil { + t.Fatal(err) + } + + var psh []byte + for i, toggle := range []bool{true, false, true} { + if toggle { + psh = nil + if err := p.SetChecksum(true, 2); err != nil { + // Solaris never allows to modify + // ICMP properties. + if runtime.GOOS != "solaris" { + t.Fatal(err) + } + } + } else { + psh = pshicmp + // Some platforms never allow to disable the + // kernel checksum processing. + p.SetChecksum(false, -1) + } + wb, err := (&icmp.Message{ + Type: ipv6.ICMPTypeEchoRequest, Code: 0, + Body: &icmp.Echo{ + ID: os.Getpid() & 0xffff, Seq: i + 1, + Data: []byte("HELLO-R-U-THERE"), + }, + }).Marshal(psh) + if err != nil { + t.Fatal(err) + } + if err := p.SetControlMessage(cf, toggle); err != nil { + if nettest.ProtocolNotSupported(err) { + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + cm.HopLimit = i + 1 + if err := p.SetWriteDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { + t.Fatal(err) + } + if n, err := p.WriteTo(wb, &cm, dst); err != nil { + t.Fatal(err) + } else if n != len(wb) { + t.Fatalf("got %v; want %v", n, len(wb)) + } + rb := make([]byte, 128) + if err := p.SetReadDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { + t.Fatal(err) + } + if n, _, _, err := p.ReadFrom(rb); err != nil { + switch runtime.GOOS { + case "darwin": // older darwin kernels have some limitation on receiving icmp packet through raw socket + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } else { + if m, err := icmp.ParseMessage(iana.ProtocolIPv6ICMP, rb[:n]); err != nil { + t.Fatal(err) + } else if m.Type != ipv6.ICMPTypeEchoReply || m.Code != 0 { + t.Fatalf("got type=%v, code=%v; want type=%v, code=%v", m.Type, m.Code, ipv6.ICMPTypeEchoReply, 0) + } + } + } +} diff --git a/api/vendor/golang.org/x/net/ipv6/unicastsockopt_test.go b/api/vendor/golang.org/x/net/ipv6/unicastsockopt_test.go new file mode 100644 index 0000000..e175dcc --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/unicastsockopt_test.go @@ -0,0 +1,120 @@ +// 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 ipv6_test + +import ( + "net" + "runtime" + "testing" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv6" +) + +func TestConnUnicastSocketOptions(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + + ln, err := net.Listen("tcp6", "[::1]:0") + if err != nil { + t.Fatal(err) + } + defer ln.Close() + + errc := make(chan error, 1) + go func() { + c, err := ln.Accept() + if err != nil { + errc <- err + return + } + errc <- c.Close() + }() + + c, err := net.Dial("tcp6", ln.Addr().String()) + if err != nil { + t.Fatal(err) + } + defer c.Close() + + testUnicastSocketOptions(t, ipv6.NewConn(c)) + + if err := <-errc; err != nil { + t.Errorf("server: %v", err) + } +} + +var packetConnUnicastSocketOptionTests = []struct { + net, proto, addr string +}{ + {"udp6", "", "[::1]:0"}, + {"ip6", ":ipv6-icmp", "::1"}, +} + +func TestPacketConnUnicastSocketOptions(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + + m, ok := nettest.SupportsRawIPSocket() + for _, tt := range packetConnUnicastSocketOptionTests { + if tt.net == "ip6" && !ok { + t.Log(m) + continue + } + c, err := net.ListenPacket(tt.net+tt.proto, tt.addr) + if err != nil { + t.Fatal(err) + } + defer c.Close() + + testUnicastSocketOptions(t, ipv6.NewPacketConn(c)) + } +} + +type testIPv6UnicastConn interface { + TrafficClass() (int, error) + SetTrafficClass(int) error + HopLimit() (int, error) + SetHopLimit(int) error +} + +func testUnicastSocketOptions(t *testing.T, c testIPv6UnicastConn) { + tclass := iana.DiffServCS0 | iana.NotECNTransport + if err := c.SetTrafficClass(tclass); err != nil { + switch runtime.GOOS { + case "darwin": // older darwin kernels don't support IPV6_TCLASS option + t.Logf("not supported on %s", runtime.GOOS) + goto next + } + t.Fatal(err) + } + if v, err := c.TrafficClass(); err != nil { + t.Fatal(err) + } else if v != tclass { + t.Fatalf("got %v; want %v", v, tclass) + } + +next: + hoplim := 255 + if err := c.SetHopLimit(hoplim); err != nil { + t.Fatal(err) + } + if v, err := c.HopLimit(); err != nil { + t.Fatal(err) + } else if v != hoplim { + t.Fatalf("got %v; want %v", v, hoplim) + } +} diff --git a/api/vendor/golang.org/x/net/ipv6/zsys_darwin.go b/api/vendor/golang.org/x/net/ipv6/zsys_darwin.go new file mode 100644 index 0000000..6aab1df --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/zsys_darwin.go @@ -0,0 +1,131 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_darwin.go + +package ipv6 + +const ( + sysIPV6_UNICAST_HOPS = 0x4 + sysIPV6_MULTICAST_IF = 0x9 + sysIPV6_MULTICAST_HOPS = 0xa + sysIPV6_MULTICAST_LOOP = 0xb + sysIPV6_JOIN_GROUP = 0xc + sysIPV6_LEAVE_GROUP = 0xd + + sysIPV6_PORTRANGE = 0xe + sysICMP6_FILTER = 0x12 + sysIPV6_2292PKTINFO = 0x13 + sysIPV6_2292HOPLIMIT = 0x14 + sysIPV6_2292NEXTHOP = 0x15 + sysIPV6_2292HOPOPTS = 0x16 + sysIPV6_2292DSTOPTS = 0x17 + sysIPV6_2292RTHDR = 0x18 + + sysIPV6_2292PKTOPTIONS = 0x19 + + sysIPV6_CHECKSUM = 0x1a + sysIPV6_V6ONLY = 0x1b + + sysIPV6_IPSEC_POLICY = 0x1c + + sysIPV6_RECVTCLASS = 0x23 + sysIPV6_TCLASS = 0x24 + + sysIPV6_RTHDRDSTOPTS = 0x39 + + sysIPV6_RECVPKTINFO = 0x3d + + sysIPV6_RECVHOPLIMIT = 0x25 + sysIPV6_RECVRTHDR = 0x26 + sysIPV6_RECVHOPOPTS = 0x27 + sysIPV6_RECVDSTOPTS = 0x28 + + sysIPV6_USE_MIN_MTU = 0x2a + sysIPV6_RECVPATHMTU = 0x2b + + sysIPV6_PATHMTU = 0x2c + + sysIPV6_PKTINFO = 0x2e + sysIPV6_HOPLIMIT = 0x2f + sysIPV6_NEXTHOP = 0x30 + sysIPV6_HOPOPTS = 0x31 + sysIPV6_DSTOPTS = 0x32 + sysIPV6_RTHDR = 0x33 + + sysIPV6_AUTOFLOWLABEL = 0x3b + + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_PREFER_TEMPADDR = 0x3f + + sysIPV6_MSFILTER = 0x4a + sysMCAST_JOIN_GROUP = 0x50 + sysMCAST_LEAVE_GROUP = 0x51 + sysMCAST_JOIN_SOURCE_GROUP = 0x52 + sysMCAST_LEAVE_SOURCE_GROUP = 0x53 + sysMCAST_BLOCK_SOURCE = 0x54 + sysMCAST_UNBLOCK_SOURCE = 0x55 + + sysIPV6_BOUND_IF = 0x7d + + sysIPV6_PORTRANGE_DEFAULT = 0x0 + sysIPV6_PORTRANGE_HIGH = 0x1 + sysIPV6_PORTRANGE_LOW = 0x2 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 + + sizeofICMPv6Filter = 0x20 +) + +type sockaddrStorage struct { + Len uint8 + Family uint8 + X__ss_pad1 [6]int8 + X__ss_align int64 + X__ss_pad2 [112]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type icmpv6Filter struct { + Filt [8]uint32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [128]byte +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [128]byte + Pad_cgo_1 [128]byte +} diff --git a/api/vendor/golang.org/x/net/ipv6/zsys_dragonfly.go b/api/vendor/golang.org/x/net/ipv6/zsys_dragonfly.go new file mode 100644 index 0000000..d2de804 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/zsys_dragonfly.go @@ -0,0 +1,88 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_dragonfly.go + +package ipv6 + +const ( + sysIPV6_UNICAST_HOPS = 0x4 + sysIPV6_MULTICAST_IF = 0x9 + sysIPV6_MULTICAST_HOPS = 0xa + sysIPV6_MULTICAST_LOOP = 0xb + sysIPV6_JOIN_GROUP = 0xc + sysIPV6_LEAVE_GROUP = 0xd + sysIPV6_PORTRANGE = 0xe + sysICMP6_FILTER = 0x12 + + sysIPV6_CHECKSUM = 0x1a + sysIPV6_V6ONLY = 0x1b + + sysIPV6_IPSEC_POLICY = 0x1c + + sysIPV6_RTHDRDSTOPTS = 0x23 + sysIPV6_RECVPKTINFO = 0x24 + sysIPV6_RECVHOPLIMIT = 0x25 + sysIPV6_RECVRTHDR = 0x26 + sysIPV6_RECVHOPOPTS = 0x27 + sysIPV6_RECVDSTOPTS = 0x28 + + sysIPV6_USE_MIN_MTU = 0x2a + sysIPV6_RECVPATHMTU = 0x2b + + sysIPV6_PATHMTU = 0x2c + + sysIPV6_PKTINFO = 0x2e + sysIPV6_HOPLIMIT = 0x2f + sysIPV6_NEXTHOP = 0x30 + sysIPV6_HOPOPTS = 0x31 + sysIPV6_DSTOPTS = 0x32 + sysIPV6_RTHDR = 0x33 + + sysIPV6_RECVTCLASS = 0x39 + + sysIPV6_AUTOFLOWLABEL = 0x3b + + sysIPV6_TCLASS = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_PREFER_TEMPADDR = 0x3f + + sysIPV6_PORTRANGE_DEFAULT = 0x0 + sysIPV6_PORTRANGE_HIGH = 0x1 + sysIPV6_PORTRANGE_LOW = 0x2 + + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + + sizeofIPv6Mreq = 0x14 + + sizeofICMPv6Filter = 0x20 +) + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type icmpv6Filter struct { + Filt [8]uint32 +} diff --git a/api/vendor/golang.org/x/net/ipv6/zsys_freebsd_386.go b/api/vendor/golang.org/x/net/ipv6/zsys_freebsd_386.go new file mode 100644 index 0000000..919e572 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/zsys_freebsd_386.go @@ -0,0 +1,122 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_freebsd.go + +package ipv6 + +const ( + sysIPV6_UNICAST_HOPS = 0x4 + sysIPV6_MULTICAST_IF = 0x9 + sysIPV6_MULTICAST_HOPS = 0xa + sysIPV6_MULTICAST_LOOP = 0xb + sysIPV6_JOIN_GROUP = 0xc + sysIPV6_LEAVE_GROUP = 0xd + sysIPV6_PORTRANGE = 0xe + sysICMP6_FILTER = 0x12 + + sysIPV6_CHECKSUM = 0x1a + sysIPV6_V6ONLY = 0x1b + + sysIPV6_IPSEC_POLICY = 0x1c + + sysIPV6_RTHDRDSTOPTS = 0x23 + + sysIPV6_RECVPKTINFO = 0x24 + sysIPV6_RECVHOPLIMIT = 0x25 + sysIPV6_RECVRTHDR = 0x26 + sysIPV6_RECVHOPOPTS = 0x27 + sysIPV6_RECVDSTOPTS = 0x28 + + sysIPV6_USE_MIN_MTU = 0x2a + sysIPV6_RECVPATHMTU = 0x2b + + sysIPV6_PATHMTU = 0x2c + + sysIPV6_PKTINFO = 0x2e + sysIPV6_HOPLIMIT = 0x2f + sysIPV6_NEXTHOP = 0x30 + sysIPV6_HOPOPTS = 0x31 + sysIPV6_DSTOPTS = 0x32 + sysIPV6_RTHDR = 0x33 + + sysIPV6_RECVTCLASS = 0x39 + + sysIPV6_AUTOFLOWLABEL = 0x3b + + sysIPV6_TCLASS = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_PREFER_TEMPADDR = 0x3f + + sysIPV6_BINDANY = 0x40 + + sysIPV6_MSFILTER = 0x4a + + sysMCAST_JOIN_GROUP = 0x50 + sysMCAST_LEAVE_GROUP = 0x51 + sysMCAST_JOIN_SOURCE_GROUP = 0x52 + sysMCAST_LEAVE_SOURCE_GROUP = 0x53 + sysMCAST_BLOCK_SOURCE = 0x54 + sysMCAST_UNBLOCK_SOURCE = 0x55 + + sysIPV6_PORTRANGE_DEFAULT = 0x0 + sysIPV6_PORTRANGE_HIGH = 0x1 + sysIPV6_PORTRANGE_LOW = 0x2 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 + + sizeofICMPv6Filter = 0x20 +) + +type sockaddrStorage struct { + Len uint8 + Family uint8 + X__ss_pad1 [6]int8 + X__ss_align int64 + X__ss_pad2 [112]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type groupReq struct { + Interface uint32 + Group sockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Group sockaddrStorage + Source sockaddrStorage +} + +type icmpv6Filter struct { + Filt [8]uint32 +} diff --git a/api/vendor/golang.org/x/net/ipv6/zsys_freebsd_amd64.go b/api/vendor/golang.org/x/net/ipv6/zsys_freebsd_amd64.go new file mode 100644 index 0000000..cb8141f --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/zsys_freebsd_amd64.go @@ -0,0 +1,124 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_freebsd.go + +package ipv6 + +const ( + sysIPV6_UNICAST_HOPS = 0x4 + sysIPV6_MULTICAST_IF = 0x9 + sysIPV6_MULTICAST_HOPS = 0xa + sysIPV6_MULTICAST_LOOP = 0xb + sysIPV6_JOIN_GROUP = 0xc + sysIPV6_LEAVE_GROUP = 0xd + sysIPV6_PORTRANGE = 0xe + sysICMP6_FILTER = 0x12 + + sysIPV6_CHECKSUM = 0x1a + sysIPV6_V6ONLY = 0x1b + + sysIPV6_IPSEC_POLICY = 0x1c + + sysIPV6_RTHDRDSTOPTS = 0x23 + + sysIPV6_RECVPKTINFO = 0x24 + sysIPV6_RECVHOPLIMIT = 0x25 + sysIPV6_RECVRTHDR = 0x26 + sysIPV6_RECVHOPOPTS = 0x27 + sysIPV6_RECVDSTOPTS = 0x28 + + sysIPV6_USE_MIN_MTU = 0x2a + sysIPV6_RECVPATHMTU = 0x2b + + sysIPV6_PATHMTU = 0x2c + + sysIPV6_PKTINFO = 0x2e + sysIPV6_HOPLIMIT = 0x2f + sysIPV6_NEXTHOP = 0x30 + sysIPV6_HOPOPTS = 0x31 + sysIPV6_DSTOPTS = 0x32 + sysIPV6_RTHDR = 0x33 + + sysIPV6_RECVTCLASS = 0x39 + + sysIPV6_AUTOFLOWLABEL = 0x3b + + sysIPV6_TCLASS = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_PREFER_TEMPADDR = 0x3f + + sysIPV6_BINDANY = 0x40 + + sysIPV6_MSFILTER = 0x4a + + sysMCAST_JOIN_GROUP = 0x50 + sysMCAST_LEAVE_GROUP = 0x51 + sysMCAST_JOIN_SOURCE_GROUP = 0x52 + sysMCAST_LEAVE_SOURCE_GROUP = 0x53 + sysMCAST_BLOCK_SOURCE = 0x54 + sysMCAST_UNBLOCK_SOURCE = 0x55 + + sysIPV6_PORTRANGE_DEFAULT = 0x0 + sysIPV6_PORTRANGE_HIGH = 0x1 + sysIPV6_PORTRANGE_LOW = 0x2 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPv6Filter = 0x20 +) + +type sockaddrStorage struct { + Len uint8 + Family uint8 + X__ss_pad1 [6]int8 + X__ss_align int64 + X__ss_pad2 [112]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sockaddrStorage + Source sockaddrStorage +} + +type icmpv6Filter struct { + Filt [8]uint32 +} diff --git a/api/vendor/golang.org/x/net/ipv6/zsys_freebsd_arm.go b/api/vendor/golang.org/x/net/ipv6/zsys_freebsd_arm.go new file mode 100644 index 0000000..cb8141f --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/zsys_freebsd_arm.go @@ -0,0 +1,124 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_freebsd.go + +package ipv6 + +const ( + sysIPV6_UNICAST_HOPS = 0x4 + sysIPV6_MULTICAST_IF = 0x9 + sysIPV6_MULTICAST_HOPS = 0xa + sysIPV6_MULTICAST_LOOP = 0xb + sysIPV6_JOIN_GROUP = 0xc + sysIPV6_LEAVE_GROUP = 0xd + sysIPV6_PORTRANGE = 0xe + sysICMP6_FILTER = 0x12 + + sysIPV6_CHECKSUM = 0x1a + sysIPV6_V6ONLY = 0x1b + + sysIPV6_IPSEC_POLICY = 0x1c + + sysIPV6_RTHDRDSTOPTS = 0x23 + + sysIPV6_RECVPKTINFO = 0x24 + sysIPV6_RECVHOPLIMIT = 0x25 + sysIPV6_RECVRTHDR = 0x26 + sysIPV6_RECVHOPOPTS = 0x27 + sysIPV6_RECVDSTOPTS = 0x28 + + sysIPV6_USE_MIN_MTU = 0x2a + sysIPV6_RECVPATHMTU = 0x2b + + sysIPV6_PATHMTU = 0x2c + + sysIPV6_PKTINFO = 0x2e + sysIPV6_HOPLIMIT = 0x2f + sysIPV6_NEXTHOP = 0x30 + sysIPV6_HOPOPTS = 0x31 + sysIPV6_DSTOPTS = 0x32 + sysIPV6_RTHDR = 0x33 + + sysIPV6_RECVTCLASS = 0x39 + + sysIPV6_AUTOFLOWLABEL = 0x3b + + sysIPV6_TCLASS = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_PREFER_TEMPADDR = 0x3f + + sysIPV6_BINDANY = 0x40 + + sysIPV6_MSFILTER = 0x4a + + sysMCAST_JOIN_GROUP = 0x50 + sysMCAST_LEAVE_GROUP = 0x51 + sysMCAST_JOIN_SOURCE_GROUP = 0x52 + sysMCAST_LEAVE_SOURCE_GROUP = 0x53 + sysMCAST_BLOCK_SOURCE = 0x54 + sysMCAST_UNBLOCK_SOURCE = 0x55 + + sysIPV6_PORTRANGE_DEFAULT = 0x0 + sysIPV6_PORTRANGE_HIGH = 0x1 + sysIPV6_PORTRANGE_LOW = 0x2 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPv6Filter = 0x20 +) + +type sockaddrStorage struct { + Len uint8 + Family uint8 + X__ss_pad1 [6]int8 + X__ss_align int64 + X__ss_pad2 [112]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sockaddrStorage + Source sockaddrStorage +} + +type icmpv6Filter struct { + Filt [8]uint32 +} diff --git a/api/vendor/golang.org/x/net/ipv6/zsys_linux_386.go b/api/vendor/golang.org/x/net/ipv6/zsys_linux_386.go new file mode 100644 index 0000000..73aa8c6 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/zsys_linux_386.go @@ -0,0 +1,170 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 + + sizeofICMPv6Filter = 0x20 + + sizeofSockFprog = 0x8 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type groupReq struct { + Interface uint32 + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpv6Filter struct { + Data [8]uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [2]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/vendor/golang.org/x/net/ipv6/zsys_linux_amd64.go b/api/vendor/golang.org/x/net/ipv6/zsys_linux_amd64.go new file mode 100644 index 0000000..b64f015 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/zsys_linux_amd64.go @@ -0,0 +1,172 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPv6Filter = 0x20 + + sizeofSockFprog = 0x10 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpv6Filter struct { + Data [8]uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/vendor/golang.org/x/net/ipv6/zsys_linux_arm.go b/api/vendor/golang.org/x/net/ipv6/zsys_linux_arm.go new file mode 100644 index 0000000..73aa8c6 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/zsys_linux_arm.go @@ -0,0 +1,170 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 + + sizeofICMPv6Filter = 0x20 + + sizeofSockFprog = 0x8 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type groupReq struct { + Interface uint32 + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpv6Filter struct { + Data [8]uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [2]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/vendor/golang.org/x/net/ipv6/zsys_linux_arm64.go b/api/vendor/golang.org/x/net/ipv6/zsys_linux_arm64.go new file mode 100644 index 0000000..b64f015 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/zsys_linux_arm64.go @@ -0,0 +1,172 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPv6Filter = 0x20 + + sizeofSockFprog = 0x10 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpv6Filter struct { + Data [8]uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/vendor/golang.org/x/net/ipv6/zsys_linux_mips.go b/api/vendor/golang.org/x/net/ipv6/zsys_linux_mips.go new file mode 100644 index 0000000..73aa8c6 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/zsys_linux_mips.go @@ -0,0 +1,170 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 + + sizeofICMPv6Filter = 0x20 + + sizeofSockFprog = 0x8 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type groupReq struct { + Interface uint32 + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpv6Filter struct { + Data [8]uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [2]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/vendor/golang.org/x/net/ipv6/zsys_linux_mips64.go b/api/vendor/golang.org/x/net/ipv6/zsys_linux_mips64.go new file mode 100644 index 0000000..b64f015 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/zsys_linux_mips64.go @@ -0,0 +1,172 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPv6Filter = 0x20 + + sizeofSockFprog = 0x10 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpv6Filter struct { + Data [8]uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/vendor/golang.org/x/net/ipv6/zsys_linux_mips64le.go b/api/vendor/golang.org/x/net/ipv6/zsys_linux_mips64le.go new file mode 100644 index 0000000..b64f015 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/zsys_linux_mips64le.go @@ -0,0 +1,172 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPv6Filter = 0x20 + + sizeofSockFprog = 0x10 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpv6Filter struct { + Data [8]uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/vendor/golang.org/x/net/ipv6/zsys_linux_mipsle.go b/api/vendor/golang.org/x/net/ipv6/zsys_linux_mipsle.go new file mode 100644 index 0000000..73aa8c6 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/zsys_linux_mipsle.go @@ -0,0 +1,170 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 + + sizeofICMPv6Filter = 0x20 + + sizeofSockFprog = 0x8 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type groupReq struct { + Interface uint32 + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpv6Filter struct { + Data [8]uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [2]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/vendor/golang.org/x/net/ipv6/zsys_linux_ppc.go b/api/vendor/golang.org/x/net/ipv6/zsys_linux_ppc.go new file mode 100644 index 0000000..c9bf6a8 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/zsys_linux_ppc.go @@ -0,0 +1,170 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 + + sizeofICMPv6Filter = 0x20 + + sizeofSockFprog = 0x8 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type groupReq struct { + Interface uint32 + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpv6Filter struct { + Data [8]uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [2]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64.go b/api/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64.go new file mode 100644 index 0000000..b64f015 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64.go @@ -0,0 +1,172 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPv6Filter = 0x20 + + sizeofSockFprog = 0x10 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpv6Filter struct { + Data [8]uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64le.go b/api/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64le.go new file mode 100644 index 0000000..b64f015 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64le.go @@ -0,0 +1,172 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPv6Filter = 0x20 + + sizeofSockFprog = 0x10 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpv6Filter struct { + Data [8]uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/vendor/golang.org/x/net/ipv6/zsys_linux_s390x.go b/api/vendor/golang.org/x/net/ipv6/zsys_linux_s390x.go new file mode 100644 index 0000000..b64f015 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/zsys_linux_s390x.go @@ -0,0 +1,172 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPv6Filter = 0x20 + + sizeofSockFprog = 0x10 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpv6Filter struct { + Data [8]uint32 +} + +type sockFProg struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/api/vendor/golang.org/x/net/ipv6/zsys_netbsd.go b/api/vendor/golang.org/x/net/ipv6/zsys_netbsd.go new file mode 100644 index 0000000..bcada13 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/zsys_netbsd.go @@ -0,0 +1,84 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_netbsd.go + +package ipv6 + +const ( + sysIPV6_UNICAST_HOPS = 0x4 + sysIPV6_MULTICAST_IF = 0x9 + sysIPV6_MULTICAST_HOPS = 0xa + sysIPV6_MULTICAST_LOOP = 0xb + sysIPV6_JOIN_GROUP = 0xc + sysIPV6_LEAVE_GROUP = 0xd + sysIPV6_PORTRANGE = 0xe + sysICMP6_FILTER = 0x12 + + sysIPV6_CHECKSUM = 0x1a + sysIPV6_V6ONLY = 0x1b + + sysIPV6_IPSEC_POLICY = 0x1c + + sysIPV6_RTHDRDSTOPTS = 0x23 + + sysIPV6_RECVPKTINFO = 0x24 + sysIPV6_RECVHOPLIMIT = 0x25 + sysIPV6_RECVRTHDR = 0x26 + sysIPV6_RECVHOPOPTS = 0x27 + sysIPV6_RECVDSTOPTS = 0x28 + + sysIPV6_USE_MIN_MTU = 0x2a + sysIPV6_RECVPATHMTU = 0x2b + sysIPV6_PATHMTU = 0x2c + + sysIPV6_PKTINFO = 0x2e + sysIPV6_HOPLIMIT = 0x2f + sysIPV6_NEXTHOP = 0x30 + sysIPV6_HOPOPTS = 0x31 + sysIPV6_DSTOPTS = 0x32 + sysIPV6_RTHDR = 0x33 + + sysIPV6_RECVTCLASS = 0x39 + + sysIPV6_TCLASS = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_PORTRANGE_DEFAULT = 0x0 + sysIPV6_PORTRANGE_HIGH = 0x1 + sysIPV6_PORTRANGE_LOW = 0x2 + + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + + sizeofIPv6Mreq = 0x14 + + sizeofICMPv6Filter = 0x20 +) + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type icmpv6Filter struct { + Filt [8]uint32 +} diff --git a/api/vendor/golang.org/x/net/ipv6/zsys_openbsd.go b/api/vendor/golang.org/x/net/ipv6/zsys_openbsd.go new file mode 100644 index 0000000..86cf3c6 --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/zsys_openbsd.go @@ -0,0 +1,93 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_openbsd.go + +package ipv6 + +const ( + sysIPV6_UNICAST_HOPS = 0x4 + sysIPV6_MULTICAST_IF = 0x9 + sysIPV6_MULTICAST_HOPS = 0xa + sysIPV6_MULTICAST_LOOP = 0xb + sysIPV6_JOIN_GROUP = 0xc + sysIPV6_LEAVE_GROUP = 0xd + sysIPV6_PORTRANGE = 0xe + sysICMP6_FILTER = 0x12 + + sysIPV6_CHECKSUM = 0x1a + sysIPV6_V6ONLY = 0x1b + + sysIPV6_RTHDRDSTOPTS = 0x23 + + sysIPV6_RECVPKTINFO = 0x24 + sysIPV6_RECVHOPLIMIT = 0x25 + sysIPV6_RECVRTHDR = 0x26 + sysIPV6_RECVHOPOPTS = 0x27 + sysIPV6_RECVDSTOPTS = 0x28 + + sysIPV6_USE_MIN_MTU = 0x2a + sysIPV6_RECVPATHMTU = 0x2b + + sysIPV6_PATHMTU = 0x2c + + sysIPV6_PKTINFO = 0x2e + sysIPV6_HOPLIMIT = 0x2f + sysIPV6_NEXTHOP = 0x30 + sysIPV6_HOPOPTS = 0x31 + sysIPV6_DSTOPTS = 0x32 + sysIPV6_RTHDR = 0x33 + + sysIPV6_AUTH_LEVEL = 0x35 + sysIPV6_ESP_TRANS_LEVEL = 0x36 + sysIPV6_ESP_NETWORK_LEVEL = 0x37 + sysIPSEC6_OUTSA = 0x38 + sysIPV6_RECVTCLASS = 0x39 + + sysIPV6_AUTOFLOWLABEL = 0x3b + sysIPV6_IPCOMP_LEVEL = 0x3c + + sysIPV6_TCLASS = 0x3d + sysIPV6_DONTFRAG = 0x3e + sysIPV6_PIPEX = 0x3f + + sysIPV6_RTABLE = 0x1021 + + sysIPV6_PORTRANGE_DEFAULT = 0x0 + sysIPV6_PORTRANGE_HIGH = 0x1 + sysIPV6_PORTRANGE_LOW = 0x2 + + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + + sizeofIPv6Mreq = 0x14 + + sizeofICMPv6Filter = 0x20 +) + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type icmpv6Filter struct { + Filt [8]uint32 +} diff --git a/api/vendor/golang.org/x/net/ipv6/zsys_solaris.go b/api/vendor/golang.org/x/net/ipv6/zsys_solaris.go new file mode 100644 index 0000000..cf1837d --- /dev/null +++ b/api/vendor/golang.org/x/net/ipv6/zsys_solaris.go @@ -0,0 +1,131 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_solaris.go + +package ipv6 + +const ( + sysIPV6_UNICAST_HOPS = 0x5 + sysIPV6_MULTICAST_IF = 0x6 + sysIPV6_MULTICAST_HOPS = 0x7 + sysIPV6_MULTICAST_LOOP = 0x8 + sysIPV6_JOIN_GROUP = 0x9 + sysIPV6_LEAVE_GROUP = 0xa + + sysIPV6_PKTINFO = 0xb + + sysIPV6_HOPLIMIT = 0xc + sysIPV6_NEXTHOP = 0xd + sysIPV6_HOPOPTS = 0xe + sysIPV6_DSTOPTS = 0xf + + sysIPV6_RTHDR = 0x10 + sysIPV6_RTHDRDSTOPTS = 0x11 + + sysIPV6_RECVPKTINFO = 0x12 + sysIPV6_RECVHOPLIMIT = 0x13 + sysIPV6_RECVHOPOPTS = 0x14 + + sysIPV6_RECVRTHDR = 0x16 + + sysIPV6_RECVRTHDRDSTOPTS = 0x17 + + sysIPV6_CHECKSUM = 0x18 + sysIPV6_RECVTCLASS = 0x19 + sysIPV6_USE_MIN_MTU = 0x20 + sysIPV6_DONTFRAG = 0x21 + sysIPV6_SEC_OPT = 0x22 + sysIPV6_SRC_PREFERENCES = 0x23 + sysIPV6_RECVPATHMTU = 0x24 + sysIPV6_PATHMTU = 0x25 + sysIPV6_TCLASS = 0x26 + sysIPV6_V6ONLY = 0x27 + + sysIPV6_RECVDSTOPTS = 0x28 + + sysMCAST_JOIN_GROUP = 0x29 + sysMCAST_LEAVE_GROUP = 0x2a + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_JOIN_SOURCE_GROUP = 0x2d + sysMCAST_LEAVE_SOURCE_GROUP = 0x2e + + sysIPV6_PREFER_SRC_HOME = 0x1 + sysIPV6_PREFER_SRC_COA = 0x2 + sysIPV6_PREFER_SRC_PUBLIC = 0x4 + sysIPV6_PREFER_SRC_TMP = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x10 + sysIPV6_PREFER_SRC_CGA = 0x20 + + sysIPV6_PREFER_SRC_MIPMASK = 0x3 + sysIPV6_PREFER_SRC_MIPDEFAULT = 0x1 + sysIPV6_PREFER_SRC_TMPMASK = 0xc + sysIPV6_PREFER_SRC_TMPDEFAULT = 0x4 + sysIPV6_PREFER_SRC_CGAMASK = 0x30 + sysIPV6_PREFER_SRC_CGADEFAULT = 0x10 + + sysIPV6_PREFER_SRC_MASK = 0x3f + + sysIPV6_PREFER_SRC_DEFAULT = 0x15 + + sysIPV6_BOUND_IF = 0x41 + sysIPV6_UNSPEC_SRC = 0x42 + + sysICMP6_FILTER = 0x1 + + sizeofSockaddrStorage = 0x100 + sizeofSockaddrInet6 = 0x20 + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x24 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x104 + sizeofGroupSourceReq = 0x204 + + sizeofICMPv6Filter = 0x20 +) + +type sockaddrStorage struct { + Family uint16 + X_ss_pad1 [6]int8 + X_ss_align float64 + X_ss_pad2 [240]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 + X__sin6_src_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [256]byte +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [256]byte + Pad_cgo_1 [256]byte +} + +type icmpv6Filter struct { + X__icmp6_filt [8]uint32 +} diff --git a/api/vendor/golang.org/x/net/lif/address.go b/api/vendor/golang.org/x/net/lif/address.go new file mode 100644 index 0000000..afb957f --- /dev/null +++ b/api/vendor/golang.org/x/net/lif/address.go @@ -0,0 +1,105 @@ +// 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. + +// +build solaris + +package lif + +import ( + "errors" + "unsafe" +) + +// An Addr represents an address associated with packet routing. +type Addr interface { + // Family returns an address family. + Family() int +} + +// An Inet4Addr represents an internet address for IPv4. +type Inet4Addr struct { + IP [4]byte // IP address + PrefixLen int // address prefix length +} + +// Family implements the Family method of Addr interface. +func (a *Inet4Addr) Family() int { return sysAF_INET } + +// An Inet6Addr represents an internet address for IPv6. +type Inet6Addr struct { + IP [16]byte // IP address + PrefixLen int // address prefix length + ZoneID int // zone identifier +} + +// Family implements the Family method of Addr interface. +func (a *Inet6Addr) Family() int { return sysAF_INET6 } + +// Addrs returns a list of interface addresses. +// +// The provided af must be an address family and name must be a data +// link name. The zero value of af or name means a wildcard. +func Addrs(af int, name string) ([]Addr, error) { + eps, err := newEndpoints(af) + if len(eps) == 0 { + return nil, err + } + defer func() { + for _, ep := range eps { + ep.close() + } + }() + lls, err := links(eps, name) + if len(lls) == 0 { + return nil, err + } + var as []Addr + for _, ll := range lls { + var lifr lifreq + for i := 0; i < len(ll.Name); i++ { + lifr.Name[i] = int8(ll.Name[i]) + } + for _, ep := range eps { + ioc := int64(sysSIOCGLIFADDR) + err := ioctl(ep.s, uintptr(ioc), unsafe.Pointer(&lifr)) + if err != nil { + continue + } + sa := (*sockaddrStorage)(unsafe.Pointer(&lifr.Lifru[0])) + l := int(nativeEndian.Uint32(lifr.Lifru1[:4])) + if l == 0 { + continue + } + switch sa.Family { + case sysAF_INET: + a := &Inet4Addr{PrefixLen: l} + copy(a.IP[:], lifr.Lifru[4:8]) + as = append(as, a) + case sysAF_INET6: + a := &Inet6Addr{PrefixLen: l, ZoneID: int(nativeEndian.Uint32(lifr.Lifru[24:28]))} + copy(a.IP[:], lifr.Lifru[8:24]) + as = append(as, a) + } + } + } + return as, nil +} + +func parseLinkAddr(b []byte) ([]byte, error) { + nlen, alen, slen := int(b[1]), int(b[2]), int(b[3]) + l := 4 + nlen + alen + slen + if len(b) < l { + return nil, errors.New("invalid address") + } + b = b[4:] + var addr []byte + if nlen > 0 { + b = b[nlen:] + } + if alen > 0 { + addr = make([]byte, alen) + copy(addr, b[:alen]) + } + return addr, nil +} diff --git a/api/vendor/golang.org/x/net/lif/address_test.go b/api/vendor/golang.org/x/net/lif/address_test.go new file mode 100644 index 0000000..a25f10b --- /dev/null +++ b/api/vendor/golang.org/x/net/lif/address_test.go @@ -0,0 +1,123 @@ +// 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. + +// +build solaris + +package lif + +import ( + "fmt" + "testing" +) + +type addrFamily int + +func (af addrFamily) String() string { + switch af { + case sysAF_UNSPEC: + return "unspec" + case sysAF_INET: + return "inet4" + case sysAF_INET6: + return "inet6" + default: + return fmt.Sprintf("%d", af) + } +} + +const hexDigit = "0123456789abcdef" + +type llAddr []byte + +func (a llAddr) String() string { + if len(a) == 0 { + return "" + } + buf := make([]byte, 0, len(a)*3-1) + for i, b := range a { + if i > 0 { + buf = append(buf, ':') + } + buf = append(buf, hexDigit[b>>4]) + buf = append(buf, hexDigit[b&0xF]) + } + return string(buf) +} + +type ipAddr []byte + +func (a ipAddr) String() string { + if len(a) == 0 { + return "" + } + if len(a) == 4 { + return fmt.Sprintf("%d.%d.%d.%d", a[0], a[1], a[2], a[3]) + } + if len(a) == 16 { + return fmt.Sprintf("%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x", a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]) + } + s := make([]byte, len(a)*2) + for i, tn := range a { + s[i*2], s[i*2+1] = hexDigit[tn>>4], hexDigit[tn&0xf] + } + return string(s) +} + +func (a *Inet4Addr) String() string { + return fmt.Sprintf("(%s %s %d)", addrFamily(a.Family()), ipAddr(a.IP[:]), a.PrefixLen) +} + +func (a *Inet6Addr) String() string { + return fmt.Sprintf("(%s %s %d %d)", addrFamily(a.Family()), ipAddr(a.IP[:]), a.PrefixLen, a.ZoneID) +} + +type addrPack struct { + af int + as []Addr +} + +func addrPacks() ([]addrPack, error) { + var lastErr error + var aps []addrPack + for _, af := range [...]int{sysAF_UNSPEC, sysAF_INET, sysAF_INET6} { + as, err := Addrs(af, "") + if err != nil { + lastErr = err + continue + } + aps = append(aps, addrPack{af: af, as: as}) + } + return aps, lastErr +} + +func TestAddrs(t *testing.T) { + aps, err := addrPacks() + if len(aps) == 0 && err != nil { + t.Fatal(err) + } + lps, err := linkPacks() + if len(lps) == 0 && err != nil { + t.Fatal(err) + } + for _, lp := range lps { + n := 0 + for _, ll := range lp.lls { + as, err := Addrs(lp.af, ll.Name) + if err != nil { + t.Fatal(lp.af, ll.Name, err) + } + t.Logf("af=%s name=%s %v", addrFamily(lp.af), ll.Name, as) + n += len(as) + } + for _, ap := range aps { + if ap.af != lp.af { + continue + } + if n != len(ap.as) { + t.Errorf("af=%s got %d; want %d", addrFamily(lp.af), n, len(ap.as)) + continue + } + } + } +} diff --git a/api/vendor/golang.org/x/net/lif/binary.go b/api/vendor/golang.org/x/net/lif/binary.go new file mode 100644 index 0000000..738a94f --- /dev/null +++ b/api/vendor/golang.org/x/net/lif/binary.go @@ -0,0 +1,115 @@ +// 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. + +// +build solaris + +package lif + +// This file contains duplicates of encoding/binary package. +// +// This package is supposed to be used by the net package of standard +// library. Therefore the package set used in the package must be the +// same as net package. + +var ( + littleEndian binaryLittleEndian + bigEndian binaryBigEndian +) + +type binaryByteOrder interface { + Uint16([]byte) uint16 + Uint32([]byte) uint32 + Uint64([]byte) uint64 + PutUint16([]byte, uint16) + PutUint32([]byte, uint32) + PutUint64([]byte, uint64) +} + +type binaryLittleEndian struct{} + +func (binaryLittleEndian) Uint16(b []byte) uint16 { + _ = b[1] // bounds check hint to compiler; see golang.org/issue/14808 + return uint16(b[0]) | uint16(b[1])<<8 +} + +func (binaryLittleEndian) PutUint16(b []byte, v uint16) { + _ = b[1] // early bounds check to guarantee safety of writes below + b[0] = byte(v) + b[1] = byte(v >> 8) +} + +func (binaryLittleEndian) 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 (binaryLittleEndian) PutUint32(b []byte, v uint32) { + _ = b[3] // early bounds check to guarantee safety of writes below + b[0] = byte(v) + b[1] = byte(v >> 8) + b[2] = byte(v >> 16) + b[3] = byte(v >> 24) +} + +func (binaryLittleEndian) 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 (binaryLittleEndian) PutUint64(b []byte, v uint64) { + _ = b[7] // early bounds check to guarantee safety of writes below + b[0] = byte(v) + b[1] = byte(v >> 8) + b[2] = byte(v >> 16) + b[3] = byte(v >> 24) + b[4] = byte(v >> 32) + b[5] = byte(v >> 40) + b[6] = byte(v >> 48) + b[7] = byte(v >> 56) +} + +type binaryBigEndian struct{} + +func (binaryBigEndian) Uint16(b []byte) uint16 { + _ = b[1] // bounds check hint to compiler; see golang.org/issue/14808 + return uint16(b[1]) | uint16(b[0])<<8 +} + +func (binaryBigEndian) PutUint16(b []byte, v uint16) { + _ = b[1] // early bounds check to guarantee safety of writes below + b[0] = byte(v >> 8) + b[1] = byte(v) +} + +func (binaryBigEndian) 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 (binaryBigEndian) PutUint32(b []byte, v uint32) { + _ = b[3] // early bounds check to guarantee safety of writes below + b[0] = byte(v >> 24) + b[1] = byte(v >> 16) + b[2] = byte(v >> 8) + b[3] = byte(v) +} + +func (binaryBigEndian) 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 +} + +func (binaryBigEndian) PutUint64(b []byte, v uint64) { + _ = b[7] // early bounds check to guarantee safety of writes below + b[0] = byte(v >> 56) + b[1] = byte(v >> 48) + b[2] = byte(v >> 40) + b[3] = byte(v >> 32) + b[4] = byte(v >> 24) + b[5] = byte(v >> 16) + b[6] = byte(v >> 8) + b[7] = byte(v) +} diff --git a/api/vendor/golang.org/x/net/lif/defs_solaris.go b/api/vendor/golang.org/x/net/lif/defs_solaris.go new file mode 100644 index 0000000..02c1998 --- /dev/null +++ b/api/vendor/golang.org/x/net/lif/defs_solaris.go @@ -0,0 +1,90 @@ +// 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. + +// +build ignore + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package lif + +/* +#include +#include + +#include +#include +*/ +import "C" + +const ( + sysAF_UNSPEC = C.AF_UNSPEC + sysAF_INET = C.AF_INET + sysAF_INET6 = C.AF_INET6 + + sysSOCK_DGRAM = C.SOCK_DGRAM +) + +type sockaddrStorage C.struct_sockaddr_storage + +const ( + sysLIFC_NOXMIT = C.LIFC_NOXMIT + sysLIFC_EXTERNAL_SOURCE = C.LIFC_EXTERNAL_SOURCE + sysLIFC_TEMPORARY = C.LIFC_TEMPORARY + sysLIFC_ALLZONES = C.LIFC_ALLZONES + sysLIFC_UNDER_IPMP = C.LIFC_UNDER_IPMP + sysLIFC_ENABLED = C.LIFC_ENABLED + + sysSIOCGLIFADDR = C.SIOCGLIFADDR + sysSIOCGLIFDSTADDR = C.SIOCGLIFDSTADDR + sysSIOCGLIFFLAGS = C.SIOCGLIFFLAGS + sysSIOCGLIFMTU = C.SIOCGLIFMTU + sysSIOCGLIFNETMASK = C.SIOCGLIFNETMASK + sysSIOCGLIFMETRIC = C.SIOCGLIFMETRIC + sysSIOCGLIFNUM = C.SIOCGLIFNUM + sysSIOCGLIFINDEX = C.SIOCGLIFINDEX + sysSIOCGLIFSUBNET = C.SIOCGLIFSUBNET + sysSIOCGLIFLNKINFO = C.SIOCGLIFLNKINFO + sysSIOCGLIFCONF = C.SIOCGLIFCONF + sysSIOCGLIFHWADDR = C.SIOCGLIFHWADDR +) + +const ( + sysIFF_UP = C.IFF_UP + sysIFF_BROADCAST = C.IFF_BROADCAST + sysIFF_DEBUG = C.IFF_DEBUG + sysIFF_LOOPBACK = C.IFF_LOOPBACK + sysIFF_POINTOPOINT = C.IFF_POINTOPOINT + sysIFF_NOTRAILERS = C.IFF_NOTRAILERS + sysIFF_RUNNING = C.IFF_RUNNING + sysIFF_NOARP = C.IFF_NOARP + sysIFF_PROMISC = C.IFF_PROMISC + sysIFF_ALLMULTI = C.IFF_ALLMULTI + sysIFF_INTELLIGENT = C.IFF_INTELLIGENT + sysIFF_MULTICAST = C.IFF_MULTICAST + sysIFF_MULTI_BCAST = C.IFF_MULTI_BCAST + sysIFF_UNNUMBERED = C.IFF_UNNUMBERED + sysIFF_PRIVATE = C.IFF_PRIVATE +) + +const ( + sizeofLifnum = C.sizeof_struct_lifnum + sizeofLifreq = C.sizeof_struct_lifreq + sizeofLifconf = C.sizeof_struct_lifconf + sizeofLifIfinfoReq = C.sizeof_struct_lif_ifinfo_req +) + +type lifnum C.struct_lifnum + +type lifreq C.struct_lifreq + +type lifconf C.struct_lifconf + +type lifIfinfoReq C.struct_lif_ifinfo_req + +const ( + sysIFT_IPV4 = C.IFT_IPV4 + sysIFT_IPV6 = C.IFT_IPV6 + sysIFT_6TO4 = C.IFT_6TO4 +) diff --git a/api/vendor/golang.org/x/net/lif/lif.go b/api/vendor/golang.org/x/net/lif/lif.go new file mode 100644 index 0000000..6e81f81 --- /dev/null +++ b/api/vendor/golang.org/x/net/lif/lif.go @@ -0,0 +1,43 @@ +// 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. + +// +build solaris + +// Package lif provides basic functions for the manipulation of +// logical network interfaces and interface addresses on Solaris. +// +// The package supports Solaris 11 or above. +package lif + +import "syscall" + +type endpoint struct { + af int + s uintptr +} + +func (ep *endpoint) close() error { + return syscall.Close(int(ep.s)) +} + +func newEndpoints(af int) ([]endpoint, error) { + var lastErr error + var eps []endpoint + afs := []int{sysAF_INET, sysAF_INET6} + if af != sysAF_UNSPEC { + afs = []int{af} + } + for _, af := range afs { + s, err := syscall.Socket(af, sysSOCK_DGRAM, 0) + if err != nil { + lastErr = err + continue + } + eps = append(eps, endpoint{af: af, s: uintptr(s)}) + } + if len(eps) == 0 { + return nil, lastErr + } + return eps, nil +} diff --git a/api/vendor/golang.org/x/net/lif/link.go b/api/vendor/golang.org/x/net/lif/link.go new file mode 100644 index 0000000..913a53e --- /dev/null +++ b/api/vendor/golang.org/x/net/lif/link.go @@ -0,0 +1,126 @@ +// 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. + +// +build solaris + +package lif + +import "unsafe" + +// A Link represents logical data link information. +// +// It also represents base information for logical network interface. +// On Solaris, each logical network interface represents network layer +// adjacency information and the interface has a only single network +// address or address pair for tunneling. It's usual that multiple +// logical network interfaces share the same logical data link. +type Link struct { + Name string // name, equivalent to IP interface name + Index int // index, equivalent to IP interface index + Type int // type + Flags int // flags + MTU int // maximum transmission unit, basically link MTU but may differ between IP address families + Addr []byte // address +} + +func (ll *Link) fetch(s uintptr) { + var lifr lifreq + for i := 0; i < len(ll.Name); i++ { + lifr.Name[i] = int8(ll.Name[i]) + } + ioc := int64(sysSIOCGLIFINDEX) + if err := ioctl(s, uintptr(ioc), unsafe.Pointer(&lifr)); err == nil { + ll.Index = int(nativeEndian.Uint32(lifr.Lifru[:4])) + } + ioc = int64(sysSIOCGLIFFLAGS) + if err := ioctl(s, uintptr(ioc), unsafe.Pointer(&lifr)); err == nil { + ll.Flags = int(nativeEndian.Uint64(lifr.Lifru[:8])) + } + ioc = int64(sysSIOCGLIFMTU) + if err := ioctl(s, uintptr(ioc), unsafe.Pointer(&lifr)); err == nil { + ll.MTU = int(nativeEndian.Uint32(lifr.Lifru[:4])) + } + switch ll.Type { + case sysIFT_IPV4, sysIFT_IPV6, sysIFT_6TO4: + default: + ioc = int64(sysSIOCGLIFHWADDR) + if err := ioctl(s, uintptr(ioc), unsafe.Pointer(&lifr)); err == nil { + ll.Addr, _ = parseLinkAddr(lifr.Lifru[4:]) + } + } +} + +// Links returns a list of logical data links. +// +// The provided af must be an address family and name must be a data +// link name. The zero value of af or name means a wildcard. +func Links(af int, name string) ([]Link, error) { + eps, err := newEndpoints(af) + if len(eps) == 0 { + return nil, err + } + defer func() { + for _, ep := range eps { + ep.close() + } + }() + return links(eps, name) +} + +func links(eps []endpoint, name string) ([]Link, error) { + var lls []Link + lifn := lifnum{Flags: sysLIFC_NOXMIT | sysLIFC_TEMPORARY | sysLIFC_ALLZONES | sysLIFC_UNDER_IPMP} + lifc := lifconf{Flags: sysLIFC_NOXMIT | sysLIFC_TEMPORARY | sysLIFC_ALLZONES | sysLIFC_UNDER_IPMP} + for _, ep := range eps { + lifn.Family = uint16(ep.af) + ioc := int64(sysSIOCGLIFNUM) + if err := ioctl(ep.s, uintptr(ioc), unsafe.Pointer(&lifn)); err != nil { + continue + } + if lifn.Count == 0 { + continue + } + b := make([]byte, lifn.Count*sizeofLifreq) + lifc.Family = uint16(ep.af) + lifc.Len = lifn.Count * sizeofLifreq + if len(lifc.Lifcu) == 8 { + nativeEndian.PutUint64(lifc.Lifcu[:], uint64(uintptr(unsafe.Pointer(&b[0])))) + } else { + nativeEndian.PutUint32(lifc.Lifcu[:], uint32(uintptr(unsafe.Pointer(&b[0])))) + } + ioc = int64(sysSIOCGLIFCONF) + if err := ioctl(ep.s, uintptr(ioc), unsafe.Pointer(&lifc)); err != nil { + continue + } + nb := make([]byte, 32) // see LIFNAMSIZ in net/if.h + for i := 0; i < int(lifn.Count); i++ { + lifr := (*lifreq)(unsafe.Pointer(&b[i*sizeofLifreq])) + for i := 0; i < 32; i++ { + if lifr.Name[i] == 0 { + nb = nb[:i] + break + } + nb[i] = byte(lifr.Name[i]) + } + llname := string(nb) + nb = nb[:32] + if isDupLink(lls, llname) || name != "" && name != llname { + continue + } + ll := Link{Name: llname, Type: int(lifr.Type)} + ll.fetch(ep.s) + lls = append(lls, ll) + } + } + return lls, nil +} + +func isDupLink(lls []Link, name string) bool { + for _, ll := range lls { + if ll.Name == name { + return true + } + } + return false +} diff --git a/api/vendor/golang.org/x/net/lif/link_test.go b/api/vendor/golang.org/x/net/lif/link_test.go new file mode 100644 index 0000000..0cb9b95 --- /dev/null +++ b/api/vendor/golang.org/x/net/lif/link_test.go @@ -0,0 +1,63 @@ +// 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. + +// +build solaris + +package lif + +import ( + "fmt" + "testing" +) + +func (ll *Link) String() string { + return fmt.Sprintf("name=%s index=%d type=%d flags=%#x mtu=%d addr=%v", ll.Name, ll.Index, ll.Type, ll.Flags, ll.MTU, llAddr(ll.Addr)) +} + +type linkPack struct { + af int + lls []Link +} + +func linkPacks() ([]linkPack, error) { + var lastErr error + var lps []linkPack + for _, af := range [...]int{sysAF_UNSPEC, sysAF_INET, sysAF_INET6} { + lls, err := Links(af, "") + if err != nil { + lastErr = err + continue + } + lps = append(lps, linkPack{af: af, lls: lls}) + } + return lps, lastErr +} + +func TestLinks(t *testing.T) { + lps, err := linkPacks() + if len(lps) == 0 && err != nil { + t.Fatal(err) + } + for _, lp := range lps { + n := 0 + for _, sll := range lp.lls { + lls, err := Links(lp.af, sll.Name) + if err != nil { + t.Fatal(lp.af, sll.Name, err) + } + for _, ll := range lls { + if ll.Name != sll.Name || ll.Index != sll.Index { + t.Errorf("af=%s got %v; want %v", addrFamily(lp.af), &ll, &sll) + continue + } + t.Logf("af=%s name=%s %v", addrFamily(lp.af), sll.Name, &ll) + n++ + } + } + if n != len(lp.lls) { + t.Errorf("af=%s got %d; want %d", addrFamily(lp.af), n, len(lp.lls)) + continue + } + } +} diff --git a/api/vendor/golang.org/x/net/lif/sys.go b/api/vendor/golang.org/x/net/lif/sys.go new file mode 100644 index 0000000..c896041 --- /dev/null +++ b/api/vendor/golang.org/x/net/lif/sys.go @@ -0,0 +1,21 @@ +// 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. + +// +build solaris + +package lif + +import "unsafe" + +var nativeEndian binaryByteOrder + +func init() { + i := uint32(1) + b := (*[4]byte)(unsafe.Pointer(&i)) + if b[0] == 1 { + nativeEndian = littleEndian + } else { + nativeEndian = bigEndian + } +} diff --git a/api/vendor/golang.org/x/net/lif/sys_solaris_amd64.s b/api/vendor/golang.org/x/net/lif/sys_solaris_amd64.s new file mode 100644 index 0000000..39d76af --- /dev/null +++ b/api/vendor/golang.org/x/net/lif/sys_solaris_amd64.s @@ -0,0 +1,8 @@ +// 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. + +#include "textflag.h" + +TEXT ·sysvicall6(SB),NOSPLIT,$0-88 + JMP syscall·sysvicall6(SB) diff --git a/api/vendor/golang.org/x/net/lif/syscall.go b/api/vendor/golang.org/x/net/lif/syscall.go new file mode 100644 index 0000000..aadab2e --- /dev/null +++ b/api/vendor/golang.org/x/net/lif/syscall.go @@ -0,0 +1,28 @@ +// 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. + +// +build solaris + +package lif + +import ( + "syscall" + "unsafe" +) + +//go:cgo_import_dynamic libc_ioctl ioctl "libc.so" + +//go:linkname procIoctl libc_ioctl + +var procIoctl uintptr + +func sysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (uintptr, uintptr, syscall.Errno) + +func ioctl(s, ioc uintptr, arg unsafe.Pointer) error { + _, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procIoctl)), 3, s, ioc, uintptr(arg), 0, 0, 0) + if errno != 0 { + return error(errno) + } + return nil +} diff --git a/api/vendor/golang.org/x/net/lif/zsys_solaris_amd64.go b/api/vendor/golang.org/x/net/lif/zsys_solaris_amd64.go new file mode 100644 index 0000000..b5e999b --- /dev/null +++ b/api/vendor/golang.org/x/net/lif/zsys_solaris_amd64.go @@ -0,0 +1,103 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_solaris.go + +package lif + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0x1a + + sysSOCK_DGRAM = 0x1 +) + +type sockaddrStorage struct { + Family uint16 + X_ss_pad1 [6]int8 + X_ss_align float64 + X_ss_pad2 [240]int8 +} + +const ( + sysLIFC_NOXMIT = 0x1 + sysLIFC_EXTERNAL_SOURCE = 0x2 + sysLIFC_TEMPORARY = 0x4 + sysLIFC_ALLZONES = 0x8 + sysLIFC_UNDER_IPMP = 0x10 + sysLIFC_ENABLED = 0x20 + + sysSIOCGLIFADDR = -0x3f87968f + sysSIOCGLIFDSTADDR = -0x3f87968d + sysSIOCGLIFFLAGS = -0x3f87968b + sysSIOCGLIFMTU = -0x3f879686 + sysSIOCGLIFNETMASK = -0x3f879683 + sysSIOCGLIFMETRIC = -0x3f879681 + sysSIOCGLIFNUM = -0x3ff3967e + sysSIOCGLIFINDEX = -0x3f87967b + sysSIOCGLIFSUBNET = -0x3f879676 + sysSIOCGLIFLNKINFO = -0x3f879674 + sysSIOCGLIFCONF = -0x3fef965b + sysSIOCGLIFHWADDR = -0x3f879640 +) + +const ( + sysIFF_UP = 0x1 + sysIFF_BROADCAST = 0x2 + sysIFF_DEBUG = 0x4 + sysIFF_LOOPBACK = 0x8 + sysIFF_POINTOPOINT = 0x10 + sysIFF_NOTRAILERS = 0x20 + sysIFF_RUNNING = 0x40 + sysIFF_NOARP = 0x80 + sysIFF_PROMISC = 0x100 + sysIFF_ALLMULTI = 0x200 + sysIFF_INTELLIGENT = 0x400 + sysIFF_MULTICAST = 0x800 + sysIFF_MULTI_BCAST = 0x1000 + sysIFF_UNNUMBERED = 0x2000 + sysIFF_PRIVATE = 0x8000 +) + +const ( + sizeofLifnum = 0xc + sizeofLifreq = 0x178 + sizeofLifconf = 0x18 + sizeofLifIfinfoReq = 0x10 +) + +type lifnum struct { + Family uint16 + Pad_cgo_0 [2]byte + Flags int32 + Count int32 +} + +type lifreq struct { + Name [32]int8 + Lifru1 [4]byte + Type uint32 + Lifru [336]byte +} + +type lifconf struct { + Family uint16 + Pad_cgo_0 [2]byte + Flags int32 + Len int32 + Pad_cgo_1 [4]byte + Lifcu [8]byte +} + +type lifIfinfoReq struct { + Maxhops uint8 + Pad_cgo_0 [3]byte + Reachtime uint32 + Reachretrans uint32 + Maxmtu uint32 +} + +const ( + sysIFT_IPV4 = 0xc8 + sysIFT_IPV6 = 0xc9 + sysIFT_6TO4 = 0xca +) diff --git a/api/vendor/golang.org/x/net/nettest/conntest.go b/api/vendor/golang.org/x/net/nettest/conntest.go new file mode 100644 index 0000000..5bd3a8c --- /dev/null +++ b/api/vendor/golang.org/x/net/nettest/conntest.go @@ -0,0 +1,456 @@ +// 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 nettest provides utilities for network testing. +package nettest + +import ( + "bytes" + "encoding/binary" + "io" + "io/ioutil" + "math/rand" + "net" + "runtime" + "sync" + "testing" + "time" +) + +var ( + aLongTimeAgo = time.Unix(233431200, 0) + neverTimeout = time.Time{} +) + +// MakePipe creates a connection between two endpoints and returns the pair +// as c1 and c2, such that anything written to c1 is read by c2 and vice-versa. +// The stop function closes all resources, including c1, c2, and the underlying +// net.Listener (if there is one), and should not be nil. +type MakePipe func() (c1, c2 net.Conn, stop func(), err error) + +// TestConn tests that a net.Conn implementation properly satisfies the interface. +// The tests should not produce any false positives, but may experience +// false negatives. Thus, some issues may only be detected when the test is +// run multiple times. For maximal effectiveness, run the tests under the +// race detector. +func TestConn(t *testing.T, mp MakePipe) { + testConn(t, mp) +} + +type connTester func(t *testing.T, c1, c2 net.Conn) + +func timeoutWrapper(t *testing.T, mp MakePipe, f connTester) { + c1, c2, stop, err := mp() + if err != nil { + t.Fatalf("unable to make pipe: %v", err) + } + var once sync.Once + defer once.Do(func() { stop() }) + timer := time.AfterFunc(time.Minute, func() { + once.Do(func() { + t.Error("test timed out; terminating pipe") + stop() + }) + }) + defer timer.Stop() + f(t, c1, c2) +} + +// testBasicIO tests that the data sent on c1 is properly received on c2. +func testBasicIO(t *testing.T, c1, c2 net.Conn) { + want := make([]byte, 1<<20) + rand.New(rand.NewSource(0)).Read(want) + + dataCh := make(chan []byte) + go func() { + rd := bytes.NewReader(want) + if err := chunkedCopy(c1, rd); err != nil { + t.Errorf("unexpected c1.Write error: %v", err) + } + if err := c1.Close(); err != nil { + t.Errorf("unexpected c1.Close error: %v", err) + } + }() + + go func() { + wr := new(bytes.Buffer) + if err := chunkedCopy(wr, c2); err != nil { + t.Errorf("unexpected c2.Read error: %v", err) + } + if err := c2.Close(); err != nil { + t.Errorf("unexpected c2.Close error: %v", err) + } + dataCh <- wr.Bytes() + }() + + if got := <-dataCh; !bytes.Equal(got, want) { + t.Errorf("transmitted data differs") + } +} + +// testPingPong tests that the two endpoints can synchronously send data to +// each other in a typical request-response pattern. +func testPingPong(t *testing.T, c1, c2 net.Conn) { + var wg sync.WaitGroup + defer wg.Wait() + + pingPonger := func(c net.Conn) { + defer wg.Done() + buf := make([]byte, 8) + var prev uint64 + for { + if _, err := io.ReadFull(c, buf); err != nil { + if err == io.EOF { + break + } + t.Errorf("unexpected Read error: %v", err) + } + + v := binary.LittleEndian.Uint64(buf) + binary.LittleEndian.PutUint64(buf, v+1) + if prev != 0 && prev+2 != v { + t.Errorf("mismatching value: got %d, want %d", v, prev+2) + } + prev = v + if v == 1000 { + break + } + + if _, err := c.Write(buf); err != nil { + t.Errorf("unexpected Write error: %v", err) + break + } + } + if err := c.Close(); err != nil { + t.Errorf("unexpected Close error: %v", err) + } + } + + wg.Add(2) + go pingPonger(c1) + go pingPonger(c2) + + // Start off the chain reaction. + if _, err := c1.Write(make([]byte, 8)); err != nil { + t.Errorf("unexpected c1.Write error: %v", err) + } +} + +// testRacyRead tests that it is safe to mutate the input Read buffer +// immediately after cancelation has occurred. +func testRacyRead(t *testing.T, c1, c2 net.Conn) { + go chunkedCopy(c2, rand.New(rand.NewSource(0))) + + var wg sync.WaitGroup + defer wg.Wait() + + c1.SetReadDeadline(time.Now().Add(time.Millisecond)) + for i := 0; i < 10; i++ { + wg.Add(1) + go func() { + defer wg.Done() + + b1 := make([]byte, 1024) + b2 := make([]byte, 1024) + for j := 0; j < 100; j++ { + _, err := c1.Read(b1) + copy(b1, b2) // Mutate b1 to trigger potential race + if err != nil { + checkForTimeoutError(t, err) + c1.SetReadDeadline(time.Now().Add(time.Millisecond)) + } + } + }() + } +} + +// testRacyWrite tests that it is safe to mutate the input Write buffer +// immediately after cancelation has occurred. +func testRacyWrite(t *testing.T, c1, c2 net.Conn) { + go chunkedCopy(ioutil.Discard, c2) + + var wg sync.WaitGroup + defer wg.Wait() + + c1.SetWriteDeadline(time.Now().Add(time.Millisecond)) + for i := 0; i < 10; i++ { + wg.Add(1) + go func() { + defer wg.Done() + + b1 := make([]byte, 1024) + b2 := make([]byte, 1024) + for j := 0; j < 100; j++ { + _, err := c1.Write(b1) + copy(b1, b2) // Mutate b1 to trigger potential race + if err != nil { + checkForTimeoutError(t, err) + c1.SetWriteDeadline(time.Now().Add(time.Millisecond)) + } + } + }() + } +} + +// testReadTimeout tests that Read timeouts do not affect Write. +func testReadTimeout(t *testing.T, c1, c2 net.Conn) { + go chunkedCopy(ioutil.Discard, c2) + + c1.SetReadDeadline(aLongTimeAgo) + _, err := c1.Read(make([]byte, 1024)) + checkForTimeoutError(t, err) + if _, err := c1.Write(make([]byte, 1024)); err != nil { + t.Errorf("unexpected Write error: %v", err) + } +} + +// testWriteTimeout tests that Write timeouts do not affect Read. +func testWriteTimeout(t *testing.T, c1, c2 net.Conn) { + go chunkedCopy(c2, rand.New(rand.NewSource(0))) + + c1.SetWriteDeadline(aLongTimeAgo) + _, err := c1.Write(make([]byte, 1024)) + checkForTimeoutError(t, err) + if _, err := c1.Read(make([]byte, 1024)); err != nil { + t.Errorf("unexpected Read error: %v", err) + } +} + +// testPastTimeout tests that a deadline set in the past immediately times out +// Read and Write requests. +func testPastTimeout(t *testing.T, c1, c2 net.Conn) { + go chunkedCopy(c2, c2) + + testRoundtrip(t, c1) + + c1.SetDeadline(aLongTimeAgo) + n, err := c1.Write(make([]byte, 1024)) + if n != 0 { + t.Errorf("unexpected Write count: got %d, want 0", n) + } + checkForTimeoutError(t, err) + n, err = c1.Read(make([]byte, 1024)) + if n != 0 { + t.Errorf("unexpected Read count: got %d, want 0", n) + } + checkForTimeoutError(t, err) + + testRoundtrip(t, c1) +} + +// testPresentTimeout tests that a deadline set while there are pending +// Read and Write operations immediately times out those operations. +func testPresentTimeout(t *testing.T, c1, c2 net.Conn) { + var wg sync.WaitGroup + defer wg.Wait() + wg.Add(3) + + deadlineSet := make(chan bool, 1) + go func() { + defer wg.Done() + time.Sleep(100 * time.Millisecond) + deadlineSet <- true + c1.SetReadDeadline(aLongTimeAgo) + c1.SetWriteDeadline(aLongTimeAgo) + }() + go func() { + defer wg.Done() + n, err := c1.Read(make([]byte, 1024)) + if n != 0 { + t.Errorf("unexpected Read count: got %d, want 0", n) + } + checkForTimeoutError(t, err) + if len(deadlineSet) == 0 { + t.Error("Read timed out before deadline is set") + } + }() + go func() { + defer wg.Done() + var err error + for err == nil { + _, err = c1.Write(make([]byte, 1024)) + } + checkForTimeoutError(t, err) + if len(deadlineSet) == 0 { + t.Error("Write timed out before deadline is set") + } + }() +} + +// testFutureTimeout tests that a future deadline will eventually time out +// Read and Write operations. +func testFutureTimeout(t *testing.T, c1, c2 net.Conn) { + var wg sync.WaitGroup + wg.Add(2) + + c1.SetDeadline(time.Now().Add(100 * time.Millisecond)) + go func() { + defer wg.Done() + _, err := c1.Read(make([]byte, 1024)) + checkForTimeoutError(t, err) + }() + go func() { + defer wg.Done() + var err error + for err == nil { + _, err = c1.Write(make([]byte, 1024)) + } + checkForTimeoutError(t, err) + }() + wg.Wait() + + go chunkedCopy(c2, c2) + resyncConn(t, c1) + testRoundtrip(t, c1) +} + +// testCloseTimeout tests that calling Close immediately times out pending +// Read and Write operations. +func testCloseTimeout(t *testing.T, c1, c2 net.Conn) { + go chunkedCopy(c2, c2) + + var wg sync.WaitGroup + defer wg.Wait() + wg.Add(3) + + // Test for cancelation upon connection closure. + c1.SetDeadline(neverTimeout) + go func() { + defer wg.Done() + time.Sleep(100 * time.Millisecond) + c1.Close() + }() + go func() { + defer wg.Done() + var err error + buf := make([]byte, 1024) + for err == nil { + _, err = c1.Read(buf) + } + }() + go func() { + defer wg.Done() + var err error + buf := make([]byte, 1024) + for err == nil { + _, err = c1.Write(buf) + } + }() +} + +// testConcurrentMethods tests that the methods of net.Conn can safely +// be called concurrently. +func testConcurrentMethods(t *testing.T, c1, c2 net.Conn) { + if runtime.GOOS == "plan9" { + t.Skip("skipping on plan9; see https://golang.org/issue/20489") + } + go chunkedCopy(c2, c2) + + // The results of the calls may be nonsensical, but this should + // not trigger a race detector warning. + var wg sync.WaitGroup + for i := 0; i < 100; i++ { + wg.Add(7) + go func() { + defer wg.Done() + c1.Read(make([]byte, 1024)) + }() + go func() { + defer wg.Done() + c1.Write(make([]byte, 1024)) + }() + go func() { + defer wg.Done() + c1.SetDeadline(time.Now().Add(10 * time.Millisecond)) + }() + go func() { + defer wg.Done() + c1.SetReadDeadline(aLongTimeAgo) + }() + go func() { + defer wg.Done() + c1.SetWriteDeadline(aLongTimeAgo) + }() + go func() { + defer wg.Done() + c1.LocalAddr() + }() + go func() { + defer wg.Done() + c1.RemoteAddr() + }() + } + wg.Wait() // At worst, the deadline is set 10ms into the future + + resyncConn(t, c1) + testRoundtrip(t, c1) +} + +// checkForTimeoutError checks that the error satisfies the Error interface +// and that Timeout returns true. +func checkForTimeoutError(t *testing.T, err error) { + if nerr, ok := err.(net.Error); ok { + if !nerr.Timeout() { + t.Errorf("err.Timeout() = false, want true") + } + } else { + t.Errorf("got %T, want net.Error", err) + } +} + +// testRoundtrip writes something into c and reads it back. +// It assumes that everything written into c is echoed back to itself. +func testRoundtrip(t *testing.T, c net.Conn) { + if err := c.SetDeadline(neverTimeout); err != nil { + t.Errorf("roundtrip SetDeadline error: %v", err) + } + + const s = "Hello, world!" + buf := []byte(s) + if _, err := c.Write(buf); err != nil { + t.Errorf("roundtrip Write error: %v", err) + } + if _, err := io.ReadFull(c, buf); err != nil { + t.Errorf("roundtrip Read error: %v", err) + } + if string(buf) != s { + t.Errorf("roundtrip data mismatch: got %q, want %q", buf, s) + } +} + +// resyncConn resynchronizes the connection into a sane state. +// It assumes that everything written into c is echoed back to itself. +// It assumes that 0xff is not currently on the wire or in the read buffer. +func resyncConn(t *testing.T, c net.Conn) { + c.SetDeadline(neverTimeout) + errCh := make(chan error) + go func() { + _, err := c.Write([]byte{0xff}) + errCh <- err + }() + buf := make([]byte, 1024) + for { + n, err := c.Read(buf) + if n > 0 && bytes.IndexByte(buf[:n], 0xff) == n-1 { + break + } + if err != nil { + t.Errorf("unexpected Read error: %v", err) + break + } + } + if err := <-errCh; err != nil { + t.Errorf("unexpected Write error: %v", err) + } +} + +// chunkedCopy copies from r to w in fixed-width chunks to avoid +// causing a Write that exceeds the maximum packet size for packet-based +// connections like "unixpacket". +// We assume that the maximum packet size is at least 1024. +func chunkedCopy(w io.Writer, r io.Reader) error { + b := make([]byte, 1024) + _, err := io.CopyBuffer(struct{ io.Writer }{w}, struct{ io.Reader }{r}, b) + return err +} diff --git a/api/vendor/golang.org/x/net/nettest/conntest_go16.go b/api/vendor/golang.org/x/net/nettest/conntest_go16.go new file mode 100644 index 0000000..4cbf48e --- /dev/null +++ b/api/vendor/golang.org/x/net/nettest/conntest_go16.go @@ -0,0 +1,24 @@ +// 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. + +// +build !go1.7 + +package nettest + +import "testing" + +func testConn(t *testing.T, mp MakePipe) { + // Avoid using subtests on Go 1.6 and below. + timeoutWrapper(t, mp, testBasicIO) + timeoutWrapper(t, mp, testPingPong) + timeoutWrapper(t, mp, testRacyRead) + timeoutWrapper(t, mp, testRacyWrite) + timeoutWrapper(t, mp, testReadTimeout) + timeoutWrapper(t, mp, testWriteTimeout) + timeoutWrapper(t, mp, testPastTimeout) + timeoutWrapper(t, mp, testPresentTimeout) + timeoutWrapper(t, mp, testFutureTimeout) + timeoutWrapper(t, mp, testCloseTimeout) + timeoutWrapper(t, mp, testConcurrentMethods) +} diff --git a/api/vendor/golang.org/x/net/nettest/conntest_go17.go b/api/vendor/golang.org/x/net/nettest/conntest_go17.go new file mode 100644 index 0000000..fa039f0 --- /dev/null +++ b/api/vendor/golang.org/x/net/nettest/conntest_go17.go @@ -0,0 +1,24 @@ +// 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. + +// +build go1.7 + +package nettest + +import "testing" + +func testConn(t *testing.T, mp MakePipe) { + // Use subtests on Go 1.7 and above since it is better organized. + t.Run("BasicIO", func(t *testing.T) { timeoutWrapper(t, mp, testBasicIO) }) + t.Run("PingPong", func(t *testing.T) { timeoutWrapper(t, mp, testPingPong) }) + t.Run("RacyRead", func(t *testing.T) { timeoutWrapper(t, mp, testRacyRead) }) + t.Run("RacyWrite", func(t *testing.T) { timeoutWrapper(t, mp, testRacyWrite) }) + t.Run("ReadTimeout", func(t *testing.T) { timeoutWrapper(t, mp, testReadTimeout) }) + t.Run("WriteTimeout", func(t *testing.T) { timeoutWrapper(t, mp, testWriteTimeout) }) + t.Run("PastTimeout", func(t *testing.T) { timeoutWrapper(t, mp, testPastTimeout) }) + t.Run("PresentTimeout", func(t *testing.T) { timeoutWrapper(t, mp, testPresentTimeout) }) + t.Run("FutureTimeout", func(t *testing.T) { timeoutWrapper(t, mp, testFutureTimeout) }) + t.Run("CloseTimeout", func(t *testing.T) { timeoutWrapper(t, mp, testCloseTimeout) }) + t.Run("ConcurrentMethods", func(t *testing.T) { timeoutWrapper(t, mp, testConcurrentMethods) }) +} diff --git a/api/vendor/golang.org/x/net/nettest/conntest_test.go b/api/vendor/golang.org/x/net/nettest/conntest_test.go new file mode 100644 index 0000000..9f9453f --- /dev/null +++ b/api/vendor/golang.org/x/net/nettest/conntest_test.go @@ -0,0 +1,76 @@ +// 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. + +// +build go1.8 + +package nettest + +import ( + "net" + "os" + "runtime" + "testing" + + "golang.org/x/net/internal/nettest" +) + +func TestTestConn(t *testing.T) { + tests := []struct{ name, network string }{ + {"TCP", "tcp"}, + {"UnixPipe", "unix"}, + {"UnixPacketPipe", "unixpacket"}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if !nettest.TestableNetwork(tt.network) { + t.Skipf("not supported on %s", runtime.GOOS) + } + + mp := func() (c1, c2 net.Conn, stop func(), err error) { + ln, err := nettest.NewLocalListener(tt.network) + if err != nil { + return nil, nil, nil, err + } + + // Start a connection between two endpoints. + var err1, err2 error + done := make(chan bool) + go func() { + c2, err2 = ln.Accept() + close(done) + }() + c1, err1 = net.Dial(ln.Addr().Network(), ln.Addr().String()) + <-done + + stop = func() { + if err1 == nil { + c1.Close() + } + if err2 == nil { + c2.Close() + } + ln.Close() + switch tt.network { + case "unix", "unixpacket": + os.Remove(ln.Addr().String()) + } + } + + switch { + case err1 != nil: + stop() + return nil, nil, nil, err1 + case err2 != nil: + stop() + return nil, nil, nil, err2 + default: + return c1, c2, stop, nil + } + } + + TestConn(t, mp) + }) + } +} diff --git a/api/vendor/golang.org/x/net/netutil/listen.go b/api/vendor/golang.org/x/net/netutil/listen.go new file mode 100644 index 0000000..cee46e3 --- /dev/null +++ b/api/vendor/golang.org/x/net/netutil/listen.go @@ -0,0 +1,74 @@ +// 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 netutil provides network utility functions, complementing the more +// common ones in the net package. +package netutil // import "golang.org/x/net/netutil" + +import ( + "net" + "sync" +) + +// LimitListener returns a Listener that accepts at most n simultaneous +// connections from the provided Listener. +func LimitListener(l net.Listener, n int) net.Listener { + return &limitListener{ + Listener: l, + sem: make(chan struct{}, n), + done: make(chan struct{}), + } +} + +type limitListener struct { + net.Listener + sem chan struct{} + closeOnce sync.Once // ensures the done chan is only closed once + done chan struct{} // no values sent; closed when Close is called +} + +// acquire acquires the limiting semaphore. Returns true if successfully +// accquired, false if the listener is closed and the semaphore is not +// acquired. +func (l *limitListener) acquire() bool { + select { + case <-l.done: + return false + case l.sem <- struct{}{}: + return true + } +} +func (l *limitListener) release() { <-l.sem } + +func (l *limitListener) Accept() (net.Conn, error) { + acquired := l.acquire() + // If the semaphore isn't acquired because the listener was closed, expect + // that this call to accept won't block, but immediately return an error. + c, err := l.Listener.Accept() + if err != nil { + if acquired { + l.release() + } + return nil, err + } + return &limitListenerConn{Conn: c, release: l.release}, nil +} + +func (l *limitListener) Close() error { + err := l.Listener.Close() + l.closeOnce.Do(func() { close(l.done) }) + return err +} + +type limitListenerConn struct { + net.Conn + releaseOnce sync.Once + release func() +} + +func (l *limitListenerConn) Close() error { + err := l.Conn.Close() + l.releaseOnce.Do(l.release) + return err +} diff --git a/api/vendor/golang.org/x/net/netutil/listen_test.go b/api/vendor/golang.org/x/net/netutil/listen_test.go new file mode 100644 index 0000000..f40c9aa --- /dev/null +++ b/api/vendor/golang.org/x/net/netutil/listen_test.go @@ -0,0 +1,147 @@ +// 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 netutil + +import ( + "errors" + "fmt" + "io" + "io/ioutil" + "net" + "net/http" + "sync" + "sync/atomic" + "testing" + "time" + + "golang.org/x/net/internal/nettest" +) + +func TestLimitListener(t *testing.T) { + const max = 5 + attempts := (nettest.MaxOpenFiles() - max) / 2 + if attempts > 256 { // maximum length of accept queue is 128 by default + attempts = 256 + } + + l, err := net.Listen("tcp", "127.0.0.1:0") + if err != nil { + t.Fatal(err) + } + defer l.Close() + l = LimitListener(l, max) + + var open int32 + go http.Serve(l, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if n := atomic.AddInt32(&open, 1); n > max { + t.Errorf("%d open connections, want <= %d", n, max) + } + defer atomic.AddInt32(&open, -1) + time.Sleep(10 * time.Millisecond) + fmt.Fprint(w, "some body") + })) + + var wg sync.WaitGroup + var failed int32 + for i := 0; i < attempts; i++ { + wg.Add(1) + go func() { + defer wg.Done() + c := http.Client{Timeout: 3 * time.Second} + r, err := c.Get("http://" + l.Addr().String()) + if err != nil { + t.Log(err) + atomic.AddInt32(&failed, 1) + return + } + defer r.Body.Close() + io.Copy(ioutil.Discard, r.Body) + }() + } + wg.Wait() + + // We expect some Gets to fail as the kernel's accept queue is filled, + // but most should succeed. + if int(failed) >= attempts/2 { + t.Errorf("%d requests failed within %d attempts", failed, attempts) + } +} + +type errorListener struct { + net.Listener +} + +func (errorListener) Accept() (net.Conn, error) { + return nil, errFake +} + +var errFake = errors.New("fake error from errorListener") + +// This used to hang. +func TestLimitListenerError(t *testing.T) { + donec := make(chan bool, 1) + go func() { + const n = 2 + ll := LimitListener(errorListener{}, n) + for i := 0; i < n+1; i++ { + _, err := ll.Accept() + if err != errFake { + t.Fatalf("Accept error = %v; want errFake", err) + } + } + donec <- true + }() + select { + case <-donec: + case <-time.After(5 * time.Second): + t.Fatal("timeout. deadlock?") + } +} + +func TestLimitListenerClose(t *testing.T) { + ln, err := net.Listen("tcp", "127.0.0.1:0") + if err != nil { + t.Fatal(err) + } + defer ln.Close() + ln = LimitListener(ln, 1) + + doneCh := make(chan struct{}) + defer close(doneCh) + go func() { + c, err := net.Dial("tcp", ln.Addr().String()) + if err != nil { + t.Fatal(err) + } + defer c.Close() + <-doneCh + }() + + c, err := ln.Accept() + if err != nil { + t.Fatal(err) + } + defer c.Close() + + acceptDone := make(chan struct{}) + go func() { + c, err := ln.Accept() + if err == nil { + c.Close() + t.Errorf("Unexpected successful Accept()") + } + close(acceptDone) + }() + + // Wait a tiny bit to ensure the Accept() is blocking. + time.Sleep(10 * time.Millisecond) + ln.Close() + + select { + case <-acceptDone: + case <-time.After(5 * time.Second): + t.Fatalf("Accept() still blocking") + } +} diff --git a/api/vendor/golang.org/x/net/proxy/direct.go b/api/vendor/golang.org/x/net/proxy/direct.go new file mode 100644 index 0000000..4c5ad88 --- /dev/null +++ b/api/vendor/golang.org/x/net/proxy/direct.go @@ -0,0 +1,18 @@ +// 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 proxy + +import ( + "net" +) + +type direct struct{} + +// Direct is a direct proxy: one that makes network connections directly. +var Direct = direct{} + +func (direct) Dial(network, addr string) (net.Conn, error) { + return net.Dial(network, addr) +} diff --git a/api/vendor/golang.org/x/net/proxy/per_host.go b/api/vendor/golang.org/x/net/proxy/per_host.go new file mode 100644 index 0000000..0689bb6 --- /dev/null +++ b/api/vendor/golang.org/x/net/proxy/per_host.go @@ -0,0 +1,140 @@ +// 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 proxy + +import ( + "net" + "strings" +) + +// A PerHost directs connections to a default Dialer unless the host name +// requested matches one of a number of exceptions. +type PerHost struct { + def, bypass Dialer + + bypassNetworks []*net.IPNet + bypassIPs []net.IP + bypassZones []string + bypassHosts []string +} + +// NewPerHost returns a PerHost Dialer that directs connections to either +// defaultDialer or bypass, depending on whether the connection matches one of +// the configured rules. +func NewPerHost(defaultDialer, bypass Dialer) *PerHost { + return &PerHost{ + def: defaultDialer, + bypass: bypass, + } +} + +// Dial connects to the address addr on the given network through either +// defaultDialer or bypass. +func (p *PerHost) Dial(network, addr string) (c net.Conn, err error) { + host, _, err := net.SplitHostPort(addr) + if err != nil { + return nil, err + } + + return p.dialerForRequest(host).Dial(network, addr) +} + +func (p *PerHost) dialerForRequest(host string) Dialer { + if ip := net.ParseIP(host); ip != nil { + for _, net := range p.bypassNetworks { + if net.Contains(ip) { + return p.bypass + } + } + for _, bypassIP := range p.bypassIPs { + if bypassIP.Equal(ip) { + return p.bypass + } + } + return p.def + } + + for _, zone := range p.bypassZones { + if strings.HasSuffix(host, zone) { + return p.bypass + } + if host == zone[1:] { + // For a zone ".example.com", we match "example.com" + // too. + return p.bypass + } + } + for _, bypassHost := range p.bypassHosts { + if bypassHost == host { + return p.bypass + } + } + return p.def +} + +// AddFromString parses a string that contains comma-separated values +// specifying hosts that should use the bypass proxy. Each value is either an +// IP address, a CIDR range, a zone (*.example.com) or a host name +// (localhost). A best effort is made to parse the string and errors are +// ignored. +func (p *PerHost) AddFromString(s string) { + hosts := strings.Split(s, ",") + for _, host := range hosts { + host = strings.TrimSpace(host) + if len(host) == 0 { + continue + } + if strings.Contains(host, "/") { + // We assume that it's a CIDR address like 127.0.0.0/8 + if _, net, err := net.ParseCIDR(host); err == nil { + p.AddNetwork(net) + } + continue + } + if ip := net.ParseIP(host); ip != nil { + p.AddIP(ip) + continue + } + if strings.HasPrefix(host, "*.") { + p.AddZone(host[1:]) + continue + } + p.AddHost(host) + } +} + +// AddIP specifies an IP address that will use the bypass proxy. Note that +// this will only take effect if a literal IP address is dialed. A connection +// to a named host will never match an IP. +func (p *PerHost) AddIP(ip net.IP) { + p.bypassIPs = append(p.bypassIPs, ip) +} + +// AddNetwork specifies an IP range that will use the bypass proxy. Note that +// this will only take effect if a literal IP address is dialed. A connection +// to a named host will never match. +func (p *PerHost) AddNetwork(net *net.IPNet) { + p.bypassNetworks = append(p.bypassNetworks, net) +} + +// AddZone specifies a DNS suffix that will use the bypass proxy. A zone of +// "example.com" matches "example.com" and all of its subdomains. +func (p *PerHost) AddZone(zone string) { + if strings.HasSuffix(zone, ".") { + zone = zone[:len(zone)-1] + } + if !strings.HasPrefix(zone, ".") { + zone = "." + zone + } + p.bypassZones = append(p.bypassZones, zone) +} + +// AddHost specifies a host name that will use the bypass proxy. +func (p *PerHost) AddHost(host string) { + if strings.HasSuffix(host, ".") { + host = host[:len(host)-1] + } + p.bypassHosts = append(p.bypassHosts, host) +} diff --git a/api/vendor/golang.org/x/net/proxy/per_host_test.go b/api/vendor/golang.org/x/net/proxy/per_host_test.go new file mode 100644 index 0000000..a7d8095 --- /dev/null +++ b/api/vendor/golang.org/x/net/proxy/per_host_test.go @@ -0,0 +1,55 @@ +// 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 proxy + +import ( + "errors" + "net" + "reflect" + "testing" +) + +type recordingProxy struct { + addrs []string +} + +func (r *recordingProxy) Dial(network, addr string) (net.Conn, error) { + r.addrs = append(r.addrs, addr) + return nil, errors.New("recordingProxy") +} + +func TestPerHost(t *testing.T) { + var def, bypass recordingProxy + perHost := NewPerHost(&def, &bypass) + perHost.AddFromString("localhost,*.zone,127.0.0.1,10.0.0.1/8,1000::/16") + + expectedDef := []string{ + "example.com:123", + "1.2.3.4:123", + "[1001::]:123", + } + expectedBypass := []string{ + "localhost:123", + "zone:123", + "foo.zone:123", + "127.0.0.1:123", + "10.1.2.3:123", + "[1000::]:123", + } + + for _, addr := range expectedDef { + perHost.Dial("tcp", addr) + } + for _, addr := range expectedBypass { + perHost.Dial("tcp", addr) + } + + if !reflect.DeepEqual(expectedDef, def.addrs) { + t.Errorf("Hosts which went to the default proxy didn't match. Got %v, want %v", def.addrs, expectedDef) + } + if !reflect.DeepEqual(expectedBypass, bypass.addrs) { + t.Errorf("Hosts which went to the bypass proxy didn't match. Got %v, want %v", bypass.addrs, expectedBypass) + } +} diff --git a/api/vendor/golang.org/x/net/proxy/proxy.go b/api/vendor/golang.org/x/net/proxy/proxy.go new file mode 100644 index 0000000..553ead7 --- /dev/null +++ b/api/vendor/golang.org/x/net/proxy/proxy.go @@ -0,0 +1,134 @@ +// 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 proxy provides support for a variety of protocols to proxy network +// data. +package proxy // import "golang.org/x/net/proxy" + +import ( + "errors" + "net" + "net/url" + "os" + "sync" +) + +// A Dialer is a means to establish a connection. +type Dialer interface { + // Dial connects to the given address via the proxy. + Dial(network, addr string) (c net.Conn, err error) +} + +// Auth contains authentication parameters that specific Dialers may require. +type Auth struct { + User, Password string +} + +// FromEnvironment returns the dialer specified by the proxy related variables in +// the environment. +func FromEnvironment() Dialer { + allProxy := allProxyEnv.Get() + if len(allProxy) == 0 { + return Direct + } + + proxyURL, err := url.Parse(allProxy) + if err != nil { + return Direct + } + proxy, err := FromURL(proxyURL, Direct) + if err != nil { + return Direct + } + + noProxy := noProxyEnv.Get() + if len(noProxy) == 0 { + return proxy + } + + perHost := NewPerHost(proxy, Direct) + perHost.AddFromString(noProxy) + return perHost +} + +// proxySchemes is a map from URL schemes to a function that creates a Dialer +// from a URL with such a scheme. +var proxySchemes map[string]func(*url.URL, Dialer) (Dialer, error) + +// RegisterDialerType takes a URL scheme and a function to generate Dialers from +// a URL with that scheme and a forwarding Dialer. Registered schemes are used +// by FromURL. +func RegisterDialerType(scheme string, f func(*url.URL, Dialer) (Dialer, error)) { + if proxySchemes == nil { + proxySchemes = make(map[string]func(*url.URL, Dialer) (Dialer, error)) + } + proxySchemes[scheme] = f +} + +// FromURL returns a Dialer given a URL specification and an underlying +// Dialer for it to make network requests. +func FromURL(u *url.URL, forward Dialer) (Dialer, error) { + var auth *Auth + if u.User != nil { + auth = new(Auth) + auth.User = u.User.Username() + if p, ok := u.User.Password(); ok { + auth.Password = p + } + } + + switch u.Scheme { + case "socks5": + return SOCKS5("tcp", u.Host, auth, forward) + } + + // If the scheme doesn't match any of the built-in schemes, see if it + // was registered by another package. + if proxySchemes != nil { + if f, ok := proxySchemes[u.Scheme]; ok { + return f(u, forward) + } + } + + return nil, errors.New("proxy: unknown scheme: " + u.Scheme) +} + +var ( + allProxyEnv = &envOnce{ + names: []string{"ALL_PROXY", "all_proxy"}, + } + noProxyEnv = &envOnce{ + names: []string{"NO_PROXY", "no_proxy"}, + } +) + +// envOnce looks up an environment variable (optionally by multiple +// names) once. It mitigates expensive lookups on some platforms +// (e.g. Windows). +// (Borrowed from net/http/transport.go) +type envOnce struct { + names []string + once sync.Once + val string +} + +func (e *envOnce) Get() string { + e.once.Do(e.init) + return e.val +} + +func (e *envOnce) init() { + for _, n := range e.names { + e.val = os.Getenv(n) + if e.val != "" { + return + } + } +} + +// reset is used by tests +func (e *envOnce) reset() { + e.once = sync.Once{} + e.val = "" +} diff --git a/api/vendor/golang.org/x/net/proxy/proxy_test.go b/api/vendor/golang.org/x/net/proxy/proxy_test.go new file mode 100644 index 0000000..0be1b42 --- /dev/null +++ b/api/vendor/golang.org/x/net/proxy/proxy_test.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 proxy + +import ( + "bytes" + "fmt" + "net/url" + "os" + "strings" + "testing" + + "golang.org/x/net/internal/sockstest" +) + +type proxyFromEnvTest struct { + allProxyEnv string + noProxyEnv string + wantTypeOf Dialer +} + +func (t proxyFromEnvTest) String() string { + var buf bytes.Buffer + space := func() { + if buf.Len() > 0 { + buf.WriteByte(' ') + } + } + if t.allProxyEnv != "" { + fmt.Fprintf(&buf, "all_proxy=%q", t.allProxyEnv) + } + if t.noProxyEnv != "" { + space() + fmt.Fprintf(&buf, "no_proxy=%q", t.noProxyEnv) + } + return strings.TrimSpace(buf.String()) +} + +func TestFromEnvironment(t *testing.T) { + ResetProxyEnv() + + type dummyDialer struct { + direct + } + + RegisterDialerType("irc", func(_ *url.URL, _ Dialer) (Dialer, error) { + return dummyDialer{}, nil + }) + + proxyFromEnvTests := []proxyFromEnvTest{ + {allProxyEnv: "127.0.0.1:8080", noProxyEnv: "localhost, 127.0.0.1", wantTypeOf: direct{}}, + {allProxyEnv: "ftp://example.com:8000", noProxyEnv: "localhost, 127.0.0.1", wantTypeOf: direct{}}, + {allProxyEnv: "socks5://example.com:8080", noProxyEnv: "localhost, 127.0.0.1", wantTypeOf: &PerHost{}}, + {allProxyEnv: "irc://example.com:8000", wantTypeOf: dummyDialer{}}, + {noProxyEnv: "localhost, 127.0.0.1", wantTypeOf: direct{}}, + {wantTypeOf: direct{}}, + } + + for _, tt := range proxyFromEnvTests { + os.Setenv("ALL_PROXY", tt.allProxyEnv) + os.Setenv("NO_PROXY", tt.noProxyEnv) + ResetCachedEnvironment() + + d := FromEnvironment() + if got, want := fmt.Sprintf("%T", d), fmt.Sprintf("%T", tt.wantTypeOf); got != want { + t.Errorf("%v: got type = %T, want %T", tt, d, tt.wantTypeOf) + } + } +} + +func TestFromURL(t *testing.T) { + ss, err := sockstest.NewServer(sockstest.NoAuthRequired, sockstest.NoProxyRequired) + if err != nil { + t.Fatal(err) + } + defer ss.Close() + url, err := url.Parse("socks5://user:password@" + ss.Addr().String()) + if err != nil { + t.Fatal(err) + } + proxy, err := FromURL(url, nil) + if err != nil { + t.Fatal(err) + } + c, err := proxy.Dial("tcp", "fqdn.doesnotexist:5963") + if err != nil { + t.Fatal(err) + } + c.Close() +} + +func TestSOCKS5(t *testing.T) { + ss, err := sockstest.NewServer(sockstest.NoAuthRequired, sockstest.NoProxyRequired) + if err != nil { + t.Fatal(err) + } + defer ss.Close() + proxy, err := SOCKS5("tcp", ss.Addr().String(), nil, nil) + if err != nil { + t.Fatal(err) + } + c, err := proxy.Dial("tcp", ss.TargetAddr().String()) + if err != nil { + t.Fatal(err) + } + c.Close() +} + +func ResetProxyEnv() { + for _, env := range []*envOnce{allProxyEnv, noProxyEnv} { + for _, v := range env.names { + os.Setenv(v, "") + } + } + ResetCachedEnvironment() +} + +func ResetCachedEnvironment() { + allProxyEnv.reset() + noProxyEnv.reset() +} diff --git a/api/vendor/golang.org/x/net/proxy/socks5.go b/api/vendor/golang.org/x/net/proxy/socks5.go new file mode 100644 index 0000000..56345ec --- /dev/null +++ b/api/vendor/golang.org/x/net/proxy/socks5.go @@ -0,0 +1,36 @@ +// 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 proxy + +import ( + "context" + "net" + + "golang.org/x/net/internal/socks" +) + +// SOCKS5 returns a Dialer that makes SOCKSv5 connections to the given +// address with an optional username and password. +// See RFC 1928 and RFC 1929. +func SOCKS5(network, address string, auth *Auth, forward Dialer) (Dialer, error) { + d := socks.NewDialer(network, address) + if forward != nil { + d.ProxyDial = func(_ context.Context, network string, address string) (net.Conn, error) { + return forward.Dial(network, address) + } + } + if auth != nil { + up := socks.UsernamePassword{ + Username: auth.User, + Password: auth.Password, + } + d.AuthMethods = []socks.AuthMethod{ + socks.AuthMethodNotRequired, + socks.AuthMethodUsernamePassword, + } + d.Authenticate = up.Authenticate + } + return d, nil +} diff --git a/api/vendor/golang.org/x/net/publicsuffix/gen.go b/api/vendor/golang.org/x/net/publicsuffix/gen.go new file mode 100644 index 0000000..f85a3c3 --- /dev/null +++ b/api/vendor/golang.org/x/net/publicsuffix/gen.go @@ -0,0 +1,713 @@ +// 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. + +// +build ignore + +package main + +// This program generates table.go and table_test.go based on the authoritative +// public suffix list at https://publicsuffix.org/list/effective_tld_names.dat +// +// The version is derived from +// https://api.github.com/repos/publicsuffix/list/commits?path=public_suffix_list.dat +// and a human-readable form is at +// https://github.com/publicsuffix/list/commits/master/public_suffix_list.dat +// +// To fetch a particular git revision, such as 5c70ccd250, pass +// -url "https://raw.githubusercontent.com/publicsuffix/list/5c70ccd250/public_suffix_list.dat" +// and -version "an explicit version string". + +import ( + "bufio" + "bytes" + "flag" + "fmt" + "go/format" + "io" + "io/ioutil" + "net/http" + "os" + "regexp" + "sort" + "strings" + + "golang.org/x/net/idna" +) + +const ( + // These sum of these four values must be no greater than 32. + nodesBitsChildren = 10 + nodesBitsICANN = 1 + nodesBitsTextOffset = 15 + nodesBitsTextLength = 6 + + // These sum of these four values must be no greater than 32. + childrenBitsWildcard = 1 + childrenBitsNodeType = 2 + childrenBitsHi = 14 + childrenBitsLo = 14 +) + +var ( + maxChildren int + maxTextOffset int + maxTextLength int + maxHi uint32 + maxLo uint32 +) + +func max(a, b int) int { + if a < b { + return b + } + return a +} + +func u32max(a, b uint32) uint32 { + if a < b { + return b + } + return a +} + +const ( + nodeTypeNormal = 0 + nodeTypeException = 1 + nodeTypeParentOnly = 2 + numNodeType = 3 +) + +func nodeTypeStr(n int) string { + switch n { + case nodeTypeNormal: + return "+" + case nodeTypeException: + return "!" + case nodeTypeParentOnly: + return "o" + } + panic("unreachable") +} + +const ( + defaultURL = "https://publicsuffix.org/list/effective_tld_names.dat" + gitCommitURL = "https://api.github.com/repos/publicsuffix/list/commits?path=public_suffix_list.dat" +) + +var ( + labelEncoding = map[string]uint32{} + labelsList = []string{} + labelsMap = map[string]bool{} + rules = []string{} + + // validSuffixRE is used to check that the entries in the public suffix + // list are in canonical form (after Punycode encoding). Specifically, + // capital letters are not allowed. + validSuffixRE = regexp.MustCompile(`^[a-z0-9_\!\*\-\.]+$`) + + shaRE = regexp.MustCompile(`"sha":"([^"]+)"`) + dateRE = regexp.MustCompile(`"committer":{[^{]+"date":"([^"]+)"`) + + comments = flag.Bool("comments", false, "generate table.go comments, for debugging") + subset = flag.Bool("subset", false, "generate only a subset of the full table, for debugging") + url = flag.String("url", defaultURL, "URL of the publicsuffix.org list. If empty, stdin is read instead") + v = flag.Bool("v", false, "verbose output (to stderr)") + version = flag.String("version", "", "the effective_tld_names.dat version") +) + +func main() { + if err := main1(); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} + +func main1() error { + flag.Parse() + if nodesBitsTextLength+nodesBitsTextOffset+nodesBitsICANN+nodesBitsChildren > 32 { + return fmt.Errorf("not enough bits to encode the nodes table") + } + if childrenBitsLo+childrenBitsHi+childrenBitsNodeType+childrenBitsWildcard > 32 { + return fmt.Errorf("not enough bits to encode the children table") + } + if *version == "" { + if *url != defaultURL { + return fmt.Errorf("-version was not specified, and the -url is not the default one") + } + sha, date, err := gitCommit() + if err != nil { + return err + } + *version = fmt.Sprintf("publicsuffix.org's public_suffix_list.dat, git revision %s (%s)", sha, date) + } + var r io.Reader = os.Stdin + if *url != "" { + res, err := http.Get(*url) + if err != nil { + return err + } + if res.StatusCode != http.StatusOK { + return fmt.Errorf("bad GET status for %s: %d", *url, res.Status) + } + r = res.Body + defer res.Body.Close() + } + + var root node + icann := false + br := bufio.NewReader(r) + for { + s, err := br.ReadString('\n') + if err != nil { + if err == io.EOF { + break + } + return err + } + s = strings.TrimSpace(s) + if strings.Contains(s, "BEGIN ICANN DOMAINS") { + icann = true + continue + } + if strings.Contains(s, "END ICANN DOMAINS") { + icann = false + continue + } + if s == "" || strings.HasPrefix(s, "//") { + continue + } + s, err = idna.ToASCII(s) + if err != nil { + return err + } + if !validSuffixRE.MatchString(s) { + return fmt.Errorf("bad publicsuffix.org list data: %q", s) + } + + if *subset { + switch { + case s == "ac.jp" || strings.HasSuffix(s, ".ac.jp"): + case s == "ak.us" || strings.HasSuffix(s, ".ak.us"): + case s == "ao" || strings.HasSuffix(s, ".ao"): + case s == "ar" || strings.HasSuffix(s, ".ar"): + case s == "arpa" || strings.HasSuffix(s, ".arpa"): + case s == "cy" || strings.HasSuffix(s, ".cy"): + case s == "dyndns.org" || strings.HasSuffix(s, ".dyndns.org"): + case s == "jp": + case s == "kobe.jp" || strings.HasSuffix(s, ".kobe.jp"): + case s == "kyoto.jp" || strings.HasSuffix(s, ".kyoto.jp"): + case s == "om" || strings.HasSuffix(s, ".om"): + case s == "uk" || strings.HasSuffix(s, ".uk"): + case s == "uk.com" || strings.HasSuffix(s, ".uk.com"): + case s == "tw" || strings.HasSuffix(s, ".tw"): + case s == "zw" || strings.HasSuffix(s, ".zw"): + case s == "xn--p1ai" || strings.HasSuffix(s, ".xn--p1ai"): + // xn--p1ai is Russian-Cyrillic "рф". + default: + continue + } + } + + rules = append(rules, s) + + nt, wildcard := nodeTypeNormal, false + switch { + case strings.HasPrefix(s, "*."): + s, nt = s[2:], nodeTypeParentOnly + wildcard = true + case strings.HasPrefix(s, "!"): + s, nt = s[1:], nodeTypeException + } + labels := strings.Split(s, ".") + for n, i := &root, len(labels)-1; i >= 0; i-- { + label := labels[i] + n = n.child(label) + if i == 0 { + if nt != nodeTypeParentOnly && n.nodeType == nodeTypeParentOnly { + n.nodeType = nt + } + n.icann = n.icann && icann + n.wildcard = n.wildcard || wildcard + } + labelsMap[label] = true + } + } + labelsList = make([]string, 0, len(labelsMap)) + for label := range labelsMap { + labelsList = append(labelsList, label) + } + sort.Strings(labelsList) + + if err := generate(printReal, &root, "table.go"); err != nil { + return err + } + if err := generate(printTest, &root, "table_test.go"); err != nil { + return err + } + return nil +} + +func generate(p func(io.Writer, *node) error, root *node, filename string) error { + buf := new(bytes.Buffer) + if err := p(buf, root); err != nil { + return err + } + b, err := format.Source(buf.Bytes()) + if err != nil { + return err + } + return ioutil.WriteFile(filename, b, 0644) +} + +func gitCommit() (sha, date string, retErr error) { + res, err := http.Get(gitCommitURL) + if err != nil { + return "", "", err + } + if res.StatusCode != http.StatusOK { + return "", "", fmt.Errorf("bad GET status for %s: %d", gitCommitURL, res.Status) + } + defer res.Body.Close() + b, err := ioutil.ReadAll(res.Body) + if err != nil { + return "", "", err + } + if m := shaRE.FindSubmatch(b); m != nil { + sha = string(m[1]) + } + if m := dateRE.FindSubmatch(b); m != nil { + date = string(m[1]) + } + if sha == "" || date == "" { + retErr = fmt.Errorf("could not find commit SHA and date in %s", gitCommitURL) + } + return sha, date, retErr +} + +func printTest(w io.Writer, n *node) error { + fmt.Fprintf(w, "// generated by go run gen.go; DO NOT EDIT\n\n") + fmt.Fprintf(w, "package publicsuffix\n\nvar rules = [...]string{\n") + for _, rule := range rules { + fmt.Fprintf(w, "%q,\n", rule) + } + fmt.Fprintf(w, "}\n\nvar nodeLabels = [...]string{\n") + if err := n.walk(w, printNodeLabel); err != nil { + return err + } + fmt.Fprintf(w, "}\n") + return nil +} + +func printReal(w io.Writer, n *node) error { + const header = `// generated by go run gen.go; DO NOT EDIT + +package publicsuffix + +const version = %q + +const ( + nodesBitsChildren = %d + nodesBitsICANN = %d + nodesBitsTextOffset = %d + nodesBitsTextLength = %d + + childrenBitsWildcard = %d + childrenBitsNodeType = %d + childrenBitsHi = %d + childrenBitsLo = %d +) + +const ( + nodeTypeNormal = %d + nodeTypeException = %d + nodeTypeParentOnly = %d +) + +// numTLD is the number of top level domains. +const numTLD = %d + +` + fmt.Fprintf(w, header, *version, + nodesBitsChildren, nodesBitsICANN, nodesBitsTextOffset, nodesBitsTextLength, + childrenBitsWildcard, childrenBitsNodeType, childrenBitsHi, childrenBitsLo, + nodeTypeNormal, nodeTypeException, nodeTypeParentOnly, len(n.children)) + + text := combineText(labelsList) + if text == "" { + return fmt.Errorf("internal error: makeText returned no text") + } + for _, label := range labelsList { + offset, length := strings.Index(text, label), len(label) + if offset < 0 { + return fmt.Errorf("internal error: could not find %q in text %q", label, text) + } + maxTextOffset, maxTextLength = max(maxTextOffset, offset), max(maxTextLength, length) + if offset >= 1<= 1< 64 { + n, plus = 64, " +" + } + fmt.Fprintf(w, "%q%s\n", text[:n], plus) + text = text[n:] + } + + if err := n.walk(w, assignIndexes); err != nil { + return err + } + + fmt.Fprintf(w, ` + +// nodes is the list of nodes. Each node is represented as a uint32, which +// encodes the node's children, wildcard bit and node type (as an index into +// the children array), ICANN bit and text. +// +// If the table was generated with the -comments flag, there is a //-comment +// after each node's data. In it is the nodes-array indexes of the children, +// formatted as (n0x1234-n0x1256), with * denoting the wildcard bit. The +// nodeType is printed as + for normal, ! for exception, and o for parent-only +// nodes that have children but don't match a domain label in their own right. +// An I denotes an ICANN domain. +// +// The layout within the uint32, from MSB to LSB, is: +// [%2d bits] unused +// [%2d bits] children index +// [%2d bits] ICANN bit +// [%2d bits] text index +// [%2d bits] text length +var nodes = [...]uint32{ +`, + 32-nodesBitsChildren-nodesBitsICANN-nodesBitsTextOffset-nodesBitsTextLength, + nodesBitsChildren, nodesBitsICANN, nodesBitsTextOffset, nodesBitsTextLength) + if err := n.walk(w, printNode); err != nil { + return err + } + fmt.Fprintf(w, `} + +// children is the list of nodes' children, the parent's wildcard bit and the +// parent's node type. If a node has no children then their children index +// will be in the range [0, 6), depending on the wildcard bit and node type. +// +// The layout within the uint32, from MSB to LSB, is: +// [%2d bits] unused +// [%2d bits] wildcard bit +// [%2d bits] node type +// [%2d bits] high nodes index (exclusive) of children +// [%2d bits] low nodes index (inclusive) of children +var children=[...]uint32{ +`, + 32-childrenBitsWildcard-childrenBitsNodeType-childrenBitsHi-childrenBitsLo, + childrenBitsWildcard, childrenBitsNodeType, childrenBitsHi, childrenBitsLo) + for i, c := range childrenEncoding { + s := "---------------" + lo := c & (1<> childrenBitsLo) & (1<>(childrenBitsLo+childrenBitsHi)) & (1<>(childrenBitsLo+childrenBitsHi+childrenBitsNodeType) != 0 + if *comments { + fmt.Fprintf(w, "0x%08x, // c0x%04x (%s)%s %s\n", + c, i, s, wildcardStr(wildcard), nodeTypeStr(nodeType)) + } else { + fmt.Fprintf(w, "0x%x,\n", c) + } + } + fmt.Fprintf(w, "}\n\n") + fmt.Fprintf(w, "// max children %d (capacity %d)\n", maxChildren, 1<= 1<= 1<= 1< 0 && ss[0] == "" { + ss = ss[1:] + } + return ss +} + +// crush combines a list of strings, taking advantage of overlaps. It returns a +// single string that contains each input string as a substring. +func crush(ss []string) string { + maxLabelLen := 0 + for _, s := range ss { + if maxLabelLen < len(s) { + maxLabelLen = len(s) + } + } + + for prefixLen := maxLabelLen; prefixLen > 0; prefixLen-- { + prefixes := makePrefixMap(ss, prefixLen) + for i, s := range ss { + if len(s) <= prefixLen { + continue + } + mergeLabel(ss, i, prefixLen, prefixes) + } + } + + return strings.Join(ss, "") +} + +// mergeLabel merges the label at ss[i] with the first available matching label +// in prefixMap, where the last "prefixLen" characters in ss[i] match the first +// "prefixLen" characters in the matching label. +// It will merge ss[i] repeatedly until no more matches are available. +// All matching labels merged into ss[i] are replaced by "". +func mergeLabel(ss []string, i, prefixLen int, prefixes prefixMap) { + s := ss[i] + suffix := s[len(s)-prefixLen:] + for _, j := range prefixes[suffix] { + // Empty strings mean "already used." Also avoid merging with self. + if ss[j] == "" || i == j { + continue + } + if *v { + fmt.Fprintf(os.Stderr, "%d-length overlap at (%4d,%4d): %q and %q share %q\n", + prefixLen, i, j, ss[i], ss[j], suffix) + } + ss[i] += ss[j][prefixLen:] + ss[j] = "" + // ss[i] has a new suffix, so merge again if possible. + // Note: we only have to merge again at the same prefix length. Shorter + // prefix lengths will be handled in the next iteration of crush's for loop. + // Can there be matches for longer prefix lengths, introduced by the merge? + // I believe that any such matches would by necessity have been eliminated + // during substring removal or merged at a higher prefix length. For + // instance, in crush("abc", "cde", "bcdef"), combining "abc" and "cde" + // would yield "abcde", which could be merged with "bcdef." However, in + // practice "cde" would already have been elimintated by removeSubstrings. + mergeLabel(ss, i, prefixLen, prefixes) + return + } +} + +// prefixMap maps from a prefix to a list of strings containing that prefix. The +// list of strings is represented as indexes into a slice of strings stored +// elsewhere. +type prefixMap map[string][]int + +// makePrefixMap constructs a prefixMap from a slice of strings. +func makePrefixMap(ss []string, prefixLen int) prefixMap { + prefixes := make(prefixMap) + for i, s := range ss { + // We use < rather than <= because if a label matches on a prefix equal to + // its full length, that's actually a substring match handled by + // removeSubstrings. + if prefixLen < len(s) { + prefix := s[:prefixLen] + prefixes[prefix] = append(prefixes[prefix], i) + } + } + + return prefixes +} diff --git a/api/vendor/golang.org/x/net/publicsuffix/list.go b/api/vendor/golang.org/x/net/publicsuffix/list.go new file mode 100644 index 0000000..8bbf3bc --- /dev/null +++ b/api/vendor/golang.org/x/net/publicsuffix/list.go @@ -0,0 +1,135 @@ +// 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:generate go run gen.go + +// Package publicsuffix provides a public suffix list based on data from +// http://publicsuffix.org/. A public suffix is one under which Internet users +// can directly register names. +package publicsuffix // import "golang.org/x/net/publicsuffix" + +// TODO: specify case sensitivity and leading/trailing dot behavior for +// func PublicSuffix and func EffectiveTLDPlusOne. + +import ( + "fmt" + "net/http/cookiejar" + "strings" +) + +// List implements the cookiejar.PublicSuffixList interface by calling the +// PublicSuffix function. +var List cookiejar.PublicSuffixList = list{} + +type list struct{} + +func (list) PublicSuffix(domain string) string { + ps, _ := PublicSuffix(domain) + return ps +} + +func (list) String() string { + return version +} + +// PublicSuffix returns the public suffix of the domain using a copy of the +// publicsuffix.org database compiled into the library. +// +// icann is whether the public suffix is managed by the Internet Corporation +// for Assigned Names and Numbers. If not, the public suffix is privately +// managed. For example, foo.org and foo.co.uk are ICANN domains, +// foo.dyndns.org and foo.blogspot.co.uk are private domains. +// +// Use cases for distinguishing ICANN domains like foo.com from private +// domains like foo.appspot.com can be found at +// https://wiki.mozilla.org/Public_Suffix_List/Use_Cases +func PublicSuffix(domain string) (publicSuffix string, icann bool) { + lo, hi := uint32(0), uint32(numTLD) + s, suffix, wildcard := domain, len(domain), false +loop: + for { + dot := strings.LastIndex(s, ".") + if wildcard { + suffix = 1 + dot + } + if lo == hi { + break + } + f := find(s[1+dot:], lo, hi) + if f == notFound { + break + } + + u := nodes[f] >> (nodesBitsTextOffset + nodesBitsTextLength) + icann = u&(1<>= nodesBitsICANN + u = children[u&(1<>= childrenBitsLo + hi = u & (1<>= childrenBitsHi + switch u & (1<>= childrenBitsNodeType + wildcard = u&(1<>= nodesBitsTextLength + offset := x & (1< len(b[j]) +} + +// eTLDPlusOneTestCases come from +// https://github.com/publicsuffix/list/blob/master/tests/test_psl.txt +var eTLDPlusOneTestCases = []struct { + domain, want string +}{ + // Empty input. + {"", ""}, + // Unlisted TLD. + {"example", ""}, + {"example.example", "example.example"}, + {"b.example.example", "example.example"}, + {"a.b.example.example", "example.example"}, + // TLD with only 1 rule. + {"biz", ""}, + {"domain.biz", "domain.biz"}, + {"b.domain.biz", "domain.biz"}, + {"a.b.domain.biz", "domain.biz"}, + // TLD with some 2-level rules. + {"com", ""}, + {"example.com", "example.com"}, + {"b.example.com", "example.com"}, + {"a.b.example.com", "example.com"}, + {"uk.com", ""}, + {"example.uk.com", "example.uk.com"}, + {"b.example.uk.com", "example.uk.com"}, + {"a.b.example.uk.com", "example.uk.com"}, + {"test.ac", "test.ac"}, + // TLD with only 1 (wildcard) rule. + {"mm", ""}, + {"c.mm", ""}, + {"b.c.mm", "b.c.mm"}, + {"a.b.c.mm", "b.c.mm"}, + // More complex TLD. + {"jp", ""}, + {"test.jp", "test.jp"}, + {"www.test.jp", "test.jp"}, + {"ac.jp", ""}, + {"test.ac.jp", "test.ac.jp"}, + {"www.test.ac.jp", "test.ac.jp"}, + {"kyoto.jp", ""}, + {"test.kyoto.jp", "test.kyoto.jp"}, + {"ide.kyoto.jp", ""}, + {"b.ide.kyoto.jp", "b.ide.kyoto.jp"}, + {"a.b.ide.kyoto.jp", "b.ide.kyoto.jp"}, + {"c.kobe.jp", ""}, + {"b.c.kobe.jp", "b.c.kobe.jp"}, + {"a.b.c.kobe.jp", "b.c.kobe.jp"}, + {"city.kobe.jp", "city.kobe.jp"}, + {"www.city.kobe.jp", "city.kobe.jp"}, + // TLD with a wildcard rule and exceptions. + {"ck", ""}, + {"test.ck", ""}, + {"b.test.ck", "b.test.ck"}, + {"a.b.test.ck", "b.test.ck"}, + {"www.ck", "www.ck"}, + {"www.www.ck", "www.ck"}, + // US K12. + {"us", ""}, + {"test.us", "test.us"}, + {"www.test.us", "test.us"}, + {"ak.us", ""}, + {"test.ak.us", "test.ak.us"}, + {"www.test.ak.us", "test.ak.us"}, + {"k12.ak.us", ""}, + {"test.k12.ak.us", "test.k12.ak.us"}, + {"www.test.k12.ak.us", "test.k12.ak.us"}, + // Punycoded IDN labels + {"xn--85x722f.com.cn", "xn--85x722f.com.cn"}, + {"xn--85x722f.xn--55qx5d.cn", "xn--85x722f.xn--55qx5d.cn"}, + {"www.xn--85x722f.xn--55qx5d.cn", "xn--85x722f.xn--55qx5d.cn"}, + {"shishi.xn--55qx5d.cn", "shishi.xn--55qx5d.cn"}, + {"xn--55qx5d.cn", ""}, + {"xn--85x722f.xn--fiqs8s", "xn--85x722f.xn--fiqs8s"}, + {"www.xn--85x722f.xn--fiqs8s", "xn--85x722f.xn--fiqs8s"}, + {"shishi.xn--fiqs8s", "shishi.xn--fiqs8s"}, + {"xn--fiqs8s", ""}, +} + +func TestEffectiveTLDPlusOne(t *testing.T) { + for _, tc := range eTLDPlusOneTestCases { + got, _ := EffectiveTLDPlusOne(tc.domain) + if got != tc.want { + t.Errorf("%q: got %q, want %q", tc.domain, got, tc.want) + } + } +} diff --git a/api/vendor/golang.org/x/net/publicsuffix/table.go b/api/vendor/golang.org/x/net/publicsuffix/table.go new file mode 100644 index 0000000..ca7f32c --- /dev/null +++ b/api/vendor/golang.org/x/net/publicsuffix/table.go @@ -0,0 +1,9745 @@ +// generated by go run gen.go; DO NOT EDIT + +package publicsuffix + +const version = "publicsuffix.org's public_suffix_list.dat, git revision 2225db8d9f4a2a27ec697c883360632fa0c16261 (2018-05-23T23:26:06Z)" + +const ( + nodesBitsChildren = 10 + nodesBitsICANN = 1 + nodesBitsTextOffset = 15 + nodesBitsTextLength = 6 + + childrenBitsWildcard = 1 + childrenBitsNodeType = 2 + childrenBitsHi = 14 + childrenBitsLo = 14 +) + +const ( + nodeTypeNormal = 0 + nodeTypeException = 1 + nodeTypeParentOnly = 2 +) + +// numTLD is the number of top level domains. +const numTLD = 1555 + +// Text is the combined text of all labels. +const text = "9guacuiababia-goracleaningroks-theatreebinagisobetsumidatlantica" + + "sertairanzanquannefrankfurtashkentatamotors3-ap-northeast-20001w" + + "wwebredirectmemsettsupport3l3p0rtargets-itargivestbytomaritimeke" + + "eping12038biomutashinaindustriabirdartcenterprisesakimobetsuitai" + + "nairforceoppdalimoliserniabirkenesoddtangenovaraholtalenikkoeben" + + "havnikolaevents3-website-eu-west-1birthplacebitballooningjovikar" + + "iyaltakasakiyosatokigawabjarkoyukuhashimoichinosekigaharabjerkre" + + "imbarclaycards3-eu-west-2bjugnieznord-aurdalpha-myqnapcloud66bla" + + "ckfridayurihonjournalisteinkjerusalembroideryusuharablancomedica" + + "ltanissettaipeiheijindustriesteamfamberkeleyusuisserveirchattano" + + "oganordkappanamatta-varjjatjmaxxxboxenapponazure-mobilebloomberg" + + "bauernuorochesterbloxcms3-website-sa-east-1bluedancebmoattachmen" + + "ts3-website-us-east-1bms3-website-us-west-1bmweddingladefensells" + + "-for-less3-website-us-west-2bnpparibaselburglassassinationalheri" + + "tagebnrwedeployuu2-localhostrowwlkpmgleezebomloabathsbcheltenham" + + "-radio-openairbusantiquest-a-la-maisondre-landroidivttasvuotnaka" + + "nojohanamakinoharabondiyuzawabonnikonanporovnobookingliwicebooml" + + "adbrokes5yboschaefflerdalvdalaskanittedallasallebesbyglandroverh" + + "alla-speziabostikarlsoybostonakijinsekikogentinglobalashovhachin" + + "ohedmarkarmoybotanicalgardeninohekinannestadnpanasonichernigover" + + "nmentjomemorialindaskvollindesnesakyotanabellunombresciabotanicg" + + "ardeninomiyakonojorpelandrangedalinkyard-cloudeitybotanybounceme" + + "rckmsdnipropetrovskjervoyagebounty-fullensakerrypropertiesalange" + + "nirasakinfinitintuitjxfinityboutiquebechernihivgubarclays3-eu-we" + + "st-3utilitiesquare7bozen-suedtirolkuszczytnord-frontierbplacedek" + + "agaminord-odalwaysdatabaseballangenoamishirasatochigiessensiosit" + + "elekommunikationishiazainuyamashinatsukigatakasagotembaixadabran" + + "dywinevalleybrasiliabrindisibenikebristoloseyouripirangap-northe" + + "ast-3britishcolumbialowiezachpomorskienishigovtkmaxxjavald-aosta" + + "plesalondonetskarpaczeladzlgloboavistaprintelligencebroadcastlef" + + "rakkestadray-dnstracebroadwaybroke-itksatxn--0trq7p7nnishiharabr" + + "okerbronnoysundrayddnsfreebox-osascoli-picenordlandraydnsupdater" + + "brothermesaverdealstahaugesunderseaportsinfolldalivornobrowsersa" + + "fetymarketsaltdalomzaporizhzhegurinvestmentsaludrivefsnillfjordr" + + "obaknoluoktagajobojinzais-a-candidatebrumunddalondrinaplesalvado" + + "rdalibabalsan-suedtirollagdenesnaaseralingenkainanaejrietisalati" + + "nabenonichernivtsiciliabrunelasticbeanstalkaruizawabrusselsalzbu" + + "rglogowegroweibolognagatorockartuzybruxellesamegawabryanskleppga" + + "fanpachigasakievennodesaarlandrudunsamnangerbrynewjerseybuskerud" + + "inewportlligatmparaglidingloppenzaolbia-tempio-olbiatempioolbial" + + "ystokkembuchikumagayagawakuyabukihokumakogenglandupontariodejane" + + "irodoybuzentsujiiebuzzparisor-fronishiizunazukis-a-catererbweirb" + + "zhitomirumalatvuopmicrolightinglugmbhartiffanycolumbusheycommuni" + + "tysvardoharuovatoystre-slidrettozawacomobaracomparemarkerryhotel" + + "sanokashiharacompute-1computerhistoryofscience-fictioncomsecurit" + + "ytacticsantabarbaracondoshichinohealth-carereformitakeharaconfer" + + "enceconstructionconsuladollsantacruzsantafedjejuifminamidaitoman" + + "dalucerneconsultanthropologyconsultingrossetouchihayaakasakawaha" + + "racontactozsdeloittemp-dnsantamariakecontagematsubaracontemporar" + + "yarteducationalchikugojomedio-campidano-mediocampidanomediocontr" + + "actorskenconventureshinodearthdfcbankashiwaracookingchannelsdvrd" + + "nsdojoetsuwanouchikujogaszkolahppiacenzagancoolukowfashioncooper" + + "ativano-frankivskoleikangercopenhagencyclopedichitachinakagawatc" + + "handclockarumaifarmsteadurhamburgmodellingmxn--11b4c3dyndns-at-w" + + "orkinggrouparliamentoyosatoyonakagyokutoyokawacorsicagliaribeira" + + "okinawashirosatochiokinoshimaizuruhrcorvettemasekashiwazakiyosem" + + "itecosenzakopanerairguardiannakadomarinebraskaunjargalsacertmgre" + + "tachikawakeisenbahncosidnsfor-better-thanawatchesantoandreamhost" + + "ersanukis-a-cubicle-slavellinotairestaurantrani-andria-barletta-" + + "trani-andriacostumedizinhistorischesaobernardownloadyndns-remote" + + "wdyndns-serverdaluroycouchpotatofriesaogoncartoonartdecologiacou" + + "ncilutskasukabedzin-the-bandaioiraseeklogesurancechirealmpmncoup" + + "onsaotomeloyalistjordalshalsencoursesapodlasiellaktyubinskiptvet" + + "erinairealtorlandyndns-webhopencraftraniandriabarlettatraniandri" + + "acq-acranbrookuwanalyticsapporocreditcardyndns-wikiracreditunion" + + "cremonashgabadaddjaguarqhachiojiyahoooshikamaishimodatecrewhalin" + + "groundhandlingroznycricketrzyncrimeast-kazakhstanangercrotonexus" + + "-3crowniparsardegnaroycrsvpartis-a-democratranoycruisesardiniacr" + + "yptonomichigangwoncuisinellair-traffic-controlleyculturalcentern" + + "opilawawhoswhokksundyndns-workisboringrpartsarluxembourgruecuneo" + + "cupcakecuritibaghdadyndns1cxn--12c1fe0bradescorporationcyberleva" + + "gangaviikanonjis-a-designercymrussiacyonabaruminamiechizencyouth" + + "eworkpccwiiheyakageferrarittoguraferreroticanonoichinomiyakefets" + + "undynservebbsarufutsunomiyawakasaikaitakoelnfguitarsassaris-a-do" + + "ctorayfhvalerfidonnakanotoddenfieldynuconnectransportefigueresin" + + "stagingujoinvillevangerfilateliafilegearfilminamiiselectrapaniiz" + + "afinalvivanovodkamisatokashikiwakunigamiharulminamiizukamishihor" + + "onobeauxartsandcraftsaudafinancefineartsauheradynv6finlandynvpnp" + + "lus-4finnoyfirebaseappartyfirenzefirestonefirmdaleirvikasumigaur" + + "awa-mazowszextraspacekitagatajirissagamiharafishingolffansavanna" + + "hgafitjarfitnessettlementravelchannelfjalerflesbergulenflickrage" + + "rotikakamigaharaflightsaves-the-whalessandria-trani-barletta-and" + + "riatranibarlettaandriaflirflogintohmalvikasuyamelbournefloraflor" + + "encefloridavvenjargaulardalfloripaderbornfloristanohatakahamamur" + + "ogawaflorogersavonarusawaflowersaxofltravelersinsuranceflynnhost" + + "ing-clusterflynnhubargainstitutelemarkarasjohkamikoaniikappueblo" + + "ckbustermezgorzeleccoffeedbackplaneapplegodoesntexisteingeekaras" + + "jokarasuyamarugame-hostrolekamiminers3-external-1fndyroyfor-ourf" + + "or-someeresistancefor-theaterforexrothachirogatakamoriokalmykiaf" + + "orgotdnsbschokokekschokoladenforsaleitungsenforsandasuololfortal" + + "fortmissoulancashireggio-calabriafortworthadanorthwesternmutualf" + + "orumzwildlifedorainfracloudcontrolappasadenaritakurashikis-a-fin" + + "ancialadvisor-aurdalfosnescholarshipschoolfotarivnefoxfordeatnur" + + "embergunmapartmentschulefozorafredrikstadtvschwarzgwangjuniperfr" + + "eeddnsgeekgalaxyfreedesktoperauniteroizumizakirovogradoyfreemaso" + + "nryfreesitevadsoccertificationfreetlschweizfreiburguovdageaidnul" + + "vikaszubyfreightrdfreseniuscountryestateofdelawarezzoologyfribou" + + "rgushikamifuranorth-kazakhstanfriuli-v-giuliafriuli-ve-giuliafri" + + "uli-vegiuliafriuli-venezia-giuliafriuli-veneziagiuliafriuli-vgiu" + + "liafriuliv-giuliafriulive-giuliafriulivegiuliafriulivenezia-giul" + + "iafriuliveneziagiuliafriulivgiuliafrlfrogansciencecenterscienceh" + + "istoryfrognfrolandfrom-akrehamnfrom-alfrom-arfrom-azfrom-capebre" + + "tonamicrosoftbankatowicefrom-codynaliasdaburfrom-ctrentin-sued-t" + + "irolfrom-dchitosetogitsuldalorenskogrimstadyndns-blogdnsampagesp" + + "eedmobilizerofrom-debianfrom-flanderscientistockholmestrandfrom-" + + "gausdalfrom-hichisochildrensgardenfrom-iafrom-idfrom-ilfrom-inch" + + "eonfrom-kscjohnsonfrom-kyowariasahikawafrom-lancasterfrom-mangon" + + "ohejis-a-geekatsushikabeeldengeluidfrom-mdfrom-meethnologyfrom-m" + + "ifunefrom-mnfrom-modalenfrom-mscotlandfrom-mtnfrom-nchocolatelev" + + "isionishikatsuragit-repostre-totendofinternet-dnsamsclubindalote" + + "nkawafrom-ndfrom-nefrom-nh-serveblogsitexashorokanaiefrom-njawor" + + "znotogawafrom-nminamimakis-a-greenfrom-nv-infoodnetworkshoppingw" + + "iddlewismillerfrom-nyfrom-ohkurafrom-oketohnoshooguyfrom-orfrom-" + + "padovaksdalfrom-pratohobby-sitextileksvikatsuyamarylandfrom-ris-" + + "a-gurunzenfrom-schoenbrunnfrom-sdfrom-tnfrom-txn--12co0c3b4evall" + + "eaostaticscrapper-sitefrom-utazuerichardlikescandynamic-dnscrapp" + + "ingxn--1ck2e1barreauctionavigationavoiiyamanouchikuhokuryugasaki" + + "tchenavuotnarashinoceanographics3-fips-us-gov-west-1from-val-dao" + + "stavalleyfrom-vtrentin-suedtirolfrom-wafrom-wielunnerfrom-wvalle" + + "d-aostatoilfrom-wyfrosinonefrostalowa-wolawafroyahikobeardubaidu" + + "ckdnscrysechofunatoriginsurecreationishikawazukamitsuefstavernfu" + + "jiiderafujikawaguchikonefujiminokamoenairtelecitychyattorneyagaw" + + "akkanaibetsubamericanfamilydscloudapplinzis-a-hard-workerfujinom" + + "iyadavvesiidattowebcampinashikiminohosteroyrvikingfujiokayamangy" + + "shlakasamatsudontexistmein-iservebeerfujisatoshonairtrafficplexu" + + "s-1fujisawafujishiroishidakabiratoridedyn-ip24fujitsurugashimani" + + "wakuratefujixeroxn--1ctwolominamatakkokaminoyamaxunusualpersonfu" + + "jiyoshidazaifudaigokaseljordfukayabeatserveminecraftrentino-a-ad" + + "igefukuchiyamadafukudominichonanbuildingripescaravantaafukuis-a-" + + "hunterfukumitsubishigakiryuohtawaramotoineppuboliviajessheimperi" + + "afukuokazakisarazurecontainerdpolicefukuroishikarikaturindalfuku" + + "sakishiwadafukuyamagatakahashimamakisofukushimannore-og-uvdalfun" + + "abashiriuchinadafunagatakahatakaishimogosenfunahashikamiamakusat" + + "sumasendaisennangoodyearfundaciofuoiskujukuriyamansionservemp3fu" + + "osskoczowilliamhillfurnitureggio-emilia-romagnakatsugawafurubira" + + "furudonostiaarpassagenservep2passenger-associationfurukawais-a-k" + + "nightpointtokamachintaifun-dnsaliasiafusodegaurafussaikisosakita" + + "gawafutabayamaguchinomigawafutboldlygoingnowhere-for-morenakayam" + + "anxn--1lqs03nfuttsurugiminamiminowafuturecmservepicservequakefut" + + "urehostingfuturemailingfvgfylkesbiblackbaudcdn77-securecifederat" + + "ionfyresdalhannanmokuizumodenaklodzkobierzycehannosegawahanyuzen" + + "hapmirhareidsbergenharstadharvestcelebrationhasamarcheapaviancar" + + "rierhasaminami-alpssells-itrentino-aadigehashbanghasudahasura-ap" + + "pfizerhasvikautokeinow-dnservesarcasmatartanddesignhatogayaitaka" + + "nabeautysneservicesevastopolehatoyamazakitakamiizumisanofidelity" + + "hatsukaichikaiseis-a-liberalhattfjelldalhayashimamotobungotakada" + + "pliernewmexicoalhazuminobusellsyourhomegoodsevenassisicilyhbodoe" + + "s-itvedestrandhelsinkitakatakanezawahembygdsforbundhemnesewinbar" + + "rel-of-knowledgeologyokozeu-1hemsedalhepforgeherokussldheroyhgtv" + + "alledaostavangerhigashiagatsumagoianiahigashichichibunkyonanaosh" + + "imageandsoundandvisionhigashihiroshimanehigashiizumozakitakyushu" + + "aiahigashikagawahigashikagurasoedahigashikawakitaaikitamihamadah" + + "igashikurumeguromskoghigashimatsushimaritimodernhigashimatsuyama" + + "kitaakitadaitoigawahigashimurayamamotorcyclesharis-a-libertarian" + + "higashinarusembokukitamotosumy-gatewayhigashinehigashiomihachima" + + "naustdalhigashiosakasayamanakakogawahigashishirakawamatakaokalug" + + "anskypehigashisumiyoshikawaminamiaikitanakagusukumoduminamioguni" + + "comcastresindevicesharpgfoggiahigashitsunoshiroomurahigashiuraus" + + "ukitashiobarahigashiyamatokoriyamanashifteditchyouripharmaciensh" + + "awaiijimarnardalhigashiyodogawahigashiyoshinogaris-a-linux-usera" + + "nishiaritabashijonawatehiraizumisatokaizukamakurazakitaurayasuda" + + "hirakatashinagawahiranais-a-llamarriottrentino-alto-adigehirarah" + + "iratsukagawahirayaizuwakamatsubushikusakadogawahistorichouseshel" + + "laspeziahitachiomiyagildeskaliszhitachiotagooglecodespotaruis-a-" + + "musicianhitraeumtgeradellogliastradinghjartdalhjelmelandholeckoc" + + "hikushinonsenergyholidayhomeipharmacyshimojis-a-nascarfanhomelin" + + "kitoolsztynsettlershimokawahomelinuxn--1lqs71dhomeofficehomesecu" + + "ritymacaparecidahomesecuritypchoseiroumuenchenishimerahomesensem" + + "inehomeunixn--1qqw23ahondahoneywellbeingzonehongopocznorfolkebib" + + "lelhonjyoitakarazukameokameyamatotakadahornindalhorseoullensvang" + + "uardhorteneis-a-nurservegame-serverhospitalhoteleshimokitayamaho" + + "tmailhoyangerhoylandetroitskazohumanitieshimonitayanagithubuserc" + + "ontentrentino-altoadigehurdalhurumajis-a-painteractivegaskimitsu" + + "batamibudejjuedischesapeakebayernrtrentino-s-tirolhyllestadhyogo" + + "ris-a-patsfanhyugawarahyundaiwafunejfkharkivanylvenicejlchoyodob" + + "ashichikashukujitawaravennakamagayachtsamsungriwataraidyndns-fre" + + "eboxosloftranakasatsunairportland-4-salernoboribetsucksandnessjo" + + "enishinomiyashironojlljmphilipsynology-diskstationjnjcphilatelyj" + + "oyentrentinoa-adigejoyokaichibalatinogiftshinichinanjpmorganjpnc" + + "hristiansburgroks-thisayamanobeokakudamatsuejprshinjournalismail" + + "illehammerfeste-iphoenixn--2m4a15ejurkoshimizumakizunokunimimata" + + "kasugais-a-studentalkoshunantankhersonkosugekotohiradomainshinsh" + + "irokotourakouhokutamakis-a-teacherkassymantechnologykounosupplie" + + "shintokushimakouyamashikekouzushimashikis-a-techietis-a-personal" + + "trainerkozagawakozakis-a-therapistoiakozowindmillkpnkppspdnshint" + + "omikasaharakrasnodarkredstonekristiansandcatshinyoshitomiokamoga" + + "wakristiansundkrodsheradkrokstadelvaldaostarnbergkryminamisanrik" + + "ubetsurfastpanelblagrarchaeologyeongbuklugsmileasinglest-mon-blo" + + "gueurovisionionjukudoyamaceratabusebastopologyeonggiehtavuoatnag" + + "aivuotnagaokakyotambabydgoszczecinemadridvagsoygardendoftheinter" + + "netflixilovecollegefantasyleaguernseykumatorinokumejimasoykumena" + + "ntokonamegatakatoris-an-accountantshimonosekikawakunisakis-an-ac" + + "torkunitachiarailwaykunitomigusukumamotoyamashikokuchuokunneppug" + + "liakunstsammlungkunstunddesignkuokgroupictetrentinoaadigekurehab" + + "merkurgankurobelaudiblebtimnetzkurogiminamiashigarakuroisoftware" + + "ndalenugkuromatsunais-an-actresshimosuwalkis-a-photographerokuap" + + "phdkurotakikawasakis-an-anarchistoricalsocietykushirogawakustana" + + "is-an-artisteigenkusupplykutchanelkutnokuzumakis-an-engineeringk" + + "vafjordkvalsundkvamlidlugolekafjordkvanangenkvinesdalkvinnheradk" + + "viteseidskogkvitsoykwpspectruminamitanekzmissilezajsklabudhabiki" + + "nokawabarthadselfipatriamisugitokuyamatsumaebashikshacknetrentin" + + "oalto-adigemitourismolangevagrigentomologyeongnamegawakayamagazi" + + "neat-urlmitoyoakemiuramiyazurewebsiteshikagamiishibukawamiyotama" + + "nomjondalenmlbfanmonstermontrealestatefarmequipmentrentinoaltoad" + + "igemonza-brianzaporizhzhiamonza-e-della-brianzapposhirahamatonbe" + + "tsurnadalmonzabrianzaptokyotangotpantheonsitemonzaebrianzaramonz" + + "aedellabrianzamoonscalemoparachutingmordoviamoriyamatsumotofukem" + + "oriyoshiminamiawajikis-foundationmormonmouthaebaruericssonyoursi" + + "degreemoroyamatsunomortgagemoscowindowshirakofuefukihaborokunohe" + + "althcareershiranukanagawamoseushistorymosjoenmoskeneshiraois-gon" + + "emosshiraokananiimihoboleslawiechromedicinakamurataishinomakindl" + + "egnicafedexhibitionishinoomotegomosvikmpspbarrell-of-knowledgeom" + + "etre-experts-comptables3-sa-east-1moteginowaniihamatamakawajimao" + + "ris-into-animeiwamarshallstatebankddielddanuorrikuzentakatajimid" + + "oriopretogoldpoint2thisamitsukemoviemovimientolgamovistargardmoz" + + "illa-iotrentinos-tirolmtranbymuenstermuginozawaonsenmuikamisunag" + + "awamukodairamulhouservehalflifestylemunakatanemuncienciamuosatte" + + "mupictureshiratakahagitlabormurmansknx-serverrankoshigayanagawam" + + "urotorcraftrentinostirolmusashimurayamatsusakahoginankokubunjis-" + + "into-carshimotsukemusashinoharamuseetrentinosued-tirolmuseumvere" + + "nigingmusicargodaddyn-vpndnshishikuis-into-cartoonshimotsumamuts" + + "uzawamy-vigorgemy-wanggouvicenzamyactivedirectorymyasustor-elvda" + + "lmycdn77-sslattuminamiuonumassa-carrara-massacarraramassabusines" + + "sebyklegalloanshiojirishirifujiedamydattolocalhistorymyddnskingm" + + "ydissentrentinosuedtirolmydroboehringerikemydshisognemyeffectren" + + "tinsued-tirolmyfirewallonieruchomoscienceandindustrynmyfritzmyft" + + "paccesshisuifuelveruminamiyamashirokawanabelembetsukubankhmelnit" + + "skiyamarylhurstgorymyhome-servermyjinomykolaivarggatrentinsuedti" + + "rolmymailermymediapchryslermyokohamamatsudamypepiemontemypetshit" + + "aramamyphotoshibalestrandabergamoarekeymachinewhampshirebungoono" + + "ipifonyminanomypiagetmyiphostfoldnavymypsxn--30rr7ymysecuritycam" + + "erakermyshopblockshizukuishimofusaitamatsukuris-into-gamessinaza" + + "wamytis-a-bookkeeperugiamytuleapilotshizuokanazawamyvnchungnamda" + + "lseidfjordyndns-homednsandoymywireitrentoyonezawapiszpittsburgho" + + "fficialpiwatepixolinopizzapkomaganeplanetariumincommbankhmelnyts" + + "kyivaporcloudnshinjukumanoplantationplantshoujis-lostrodawarapla" + + "tformshangrilanshowaplaystationplazaplchurcharternidyndns-iparma" + + "ttelefonicarbonia-iglesias-carboniaiglesiascarboniaplumbingoplur" + + "inacionalpodzonepohlpoivronpokerpokrovskomakiyosunndalpoliticart" + + "ierpolitiendapolkowicepoltavalle-aostarostwodzislawinnershowtime" + + "mergencyahabahcavuotnagareyamakeupowiathletajimabaridagawalbrzyc" + + "haritysfjordpomorzeszowioshriramsterdamnserverbaniapordenoneporn" + + "porsangerporsangugeporsgrunnanyokoshibahikariwanumataketomisatos" + + "himayfirstjohnpoznanpraxis-a-bruinsfanprdpreservationpresidioprg" + + "mrprimelhusdecorativeartsienarutomobellevuelosangelesjabbottrevi" + + "sohughesigdalprincipeprivatizehealthinsuranceprochowiceproductio" + + "nsilkomatsushimasfjordenprofesionalprogressivenneslaskerrylogist" + + "icsimple-urlpromombetsurgeonshalloffameldalpropertyprotectionpro" + + "tonetritonprudentialpruszkowitdkomforbarsycentertainmentattoocea" + + "nographiqueu-2przeworskogptplusgardenpupimientakazakis-leetnedal" + + "pvhagakhanamigawapvtroandinosaurepaircraftingvollombardynamische" + + "s-dnsirdalpwcircleverappspotagerpzqldqponqslgbtrogstadquicksytes" + + "tingquipelementslingqvcircustomerstoregontrailroadstorfjordstorj" + + "devcloudcontrolledstpetersburgstreamuneuesokaneyamazoestudiostud" + + "yndns-at-homedepotenzamamidsundstuff-4-salestufftoread-booksneso" + + "kndalstuttgartrusteesusakis-not-certifieducatorahimeshimamateram" + + "obilysusonosuzakaniepcesuzukanmakiwiensuzukis-savedunetbankfhapp" + + "ouslivinghistorysvalbardunloppacificistrondheimmobilienishinoshi" + + "matsuurasveiosvelvikomvuxn--2scrj9christmasakinderoysvizzerasvn-" + + "reposolarssonswedenswidnicasacamdvrcampinagrandebugattipschlesis" + + "chesologneswiebodzindianapolis-a-bloggerswiftcoverswinoujscience" + + "andhistoryswisshikis-slickhakassiasynology-dsolundbeckommunetush" + + "uissier-justicetuvalle-daostatic-accessootuxfamilytwmailvestre-s" + + "lidrepbodynathomebuiltrvbashkiriautoscanadaejeonbuk12vestre-tote" + + "nnishiawakuravestvagoyvevelstadvibo-valentiavibovalentiavideovil" + + "lasnesoddenmarkhangelskjakdnepropetrovskiervaapsteiermarkongsvin" + + "gervinnicasadelamonedatingvinnytsiavipsinaappinkolobrzegersundvi" + + "rginiavirtual-userveexchangevirtualuserveftpioneervirtueeldomein" + + "-vigorlicevirtuelvisakegawaviterboknowsitallvivoldavixn--32vp30h" + + "agebostadvlaanderenvladikavkazimierz-dolnyvladimirvlogoipippulaw" + + "yvolkswagentsor-odalvologdanskoninjambylvolvolkenkundenvolyngdal" + + "vossevangenvotevotingvotoyonowiwatsukiyonoticiaskoyabearalvahkij" + + "observeronagarahkkeravjuegoshikikonaikawachinaganoharamcoachampi" + + "onshiphoptobishimaintenancebetsuikidsmynasushiobarackmazerbaijan" + + "-mayenebakkeshibechambagriculturennebudapest-a-la-masionthewifia" + + "t-band-campaniawloclawekonskowolayangrouphotographysiowmflabsor-" + + "varangerworldworse-thandawowithgoogleapisa-hockeynutsiracusakata" + + "kinouewpdevcloudyclusterwritesthisblogsytewroclawithyoutuberspac" + + "ewtcminnesotaketakatsukis-an-entertainerwtfastvps-serverisignwuo" + + "zuwzmiuwajimaxn--3pxu8konsulatrobeepilepsydneyxn--42c2d9axn--45b" + + "r5cylxn--45brj9citichernovtsykkylvenetogakushimotoganewyorkshire" + + "cipesaro-urbino-pesarourbinopesaromasvuotnakaiwamizawassamukawat" + + "aricohdatsunanjoburgminakamichiharaxn--45q11civilaviationishioko" + + "ppegardyndns-mailottexn--4gbriminingxn--4it168dxn--4it797konyvel" + + "ombardiamondshinshinotsurgeryxn--4pvxs4allxn--54b7fta0ccivilisat" + + "ionishitosashimizunaminamibosogndalottokorozawaxn--55qw42gxn--55" + + "qx5dxn--5js045dxn--5rtp49civilizationishiwakis-a-chefarsundyndns" + + "-office-on-the-weberlincolnissandiegoxn--5rtq34kooris-a-socialis" + + "tcgrouphiladelphiaareadmyblogspotrentino-stirolxn--5su34j936bgsg" + + "xn--5tzm5gxn--6btw5axn--6frz82gxn--6orx2rxn--6qq986b3xlxn--7t0a2" + + "64civilwarmanagementoyotaparocherkasyno-dsandvikcoromantovalle-d" + + "-aostathellexn--80adxhksorfoldxn--80ao21axn--80aqecdr1axn--80ase" + + "hdbasilicataniaveroykeniwaizumiotsukumiyamazonawsadodgemological" + + "lavangenaval-d-aosta-valleyokotemrevistanbulsan-suedtirolaziobni" + + "nskaragandaustraliaisondriobranconagawalesundemoneyboltateshinan" + + "omachimkentateyamaurskog-holandingjerdrumetacentrumeteorappalerm" + + "omahachijolstereviewskrakowebspacempresashibetsukuibmdds3-ap-sou" + + "theast-1kappchizippodhaleangaviikadenaamesjevuemielno-ip6xn--80a" + + "swgxn--80audnedalnxn--8ltr62kopervikharkovaoxn--8pvr4uxn--8y0a06" + + "3axn--90a3academiamicaaarborteaches-yogasawaracingxn--90aeroport" + + "alabamagasakishimabaraogakibichuoxn--90aishobarakawagoexn--90azh" + + "ytomyravendbasketballyngenvironmentalconservationflfanfshostrowi" + + "ecasinorddalillesandefjordgcahcesuolocus-2xn--9dbhblg6dietcimdba" + + "todayolasiteu-3xn--9dbq2axn--9et52uxn--9krt00axn--andy-iraxn--ar" + + "oport-byandexn--3bst00minternationalfirearmshioyanaizutwentexn--" + + "asky-iraxn--aurskog-hland-jnbatsfjordiscountyombolzano-altoadige" + + "u-4xn--avery-yuasakuhokkaidoomdnsiskinkyotobetsulikes-piedmontic" + + "ellodingenxn--b-5gaxn--b4w605ferdxn--balsan-sudtirol-rqis-uberle" + + "etrentino-sued-tirolxn--bck1b9a5dre4claimsanfranciscofreakunemur" + + "orangeiseiyoichippubetsubetsugarugbyengerdalaheadjudygarlandyndn" + + "s-picsangoxn--bdddj-mrabdxn--bearalvhki-y4axn--berlevg-jxaxn--bh" + + "cavuotna-s4axn--bhccavuotna-k7axn--bidr-5nachikatsuuraxn--bievt-" + + "0qa2xn--bjarky-fyaotsurreyxn--bjddar-ptamayufuettertdasnetzxn--b" + + "lt-elabourxn--bmlo-graingerxn--bod-2natalxn--bozen-sudtirol-76ha" + + "ibarakitahiroshimarburgxn--brnny-wuacademy-firewall-gatewayxn--b" + + "rnnysund-m8accident-investigation-aptibleaseating-organicbcieszy" + + "nxn--brum-voagatrysiljanxn--btsfjord-9zaxn--bulsan-sudtirol-rqis" + + "-very-badajozxn--c1avgxn--c2br7gxn--c3s14misakis-byxn--cck2b3bau" + + "hausposts-and-telecommunicationsncfdiscoveryomitanoddavocatanzar" + + "ownproviderhcloudfunctions3-eu-central-1xn--cesena-forli-c2gxn--" + + "cesenaforli-0jgoraxn--cg4bkis-very-evillagexn--ciqpnxn--clchc0ea" + + "0b2g2a9gcdxn--comunicaes-v6a2oxn--correios-e-telecomunicaes-ghc2" + + "9axn--czr694bbcn-north-1xn--czrs0tulanxessolutionslupskommunalfo" + + "rbundxn--czru2dxn--czrw28bbtcp4xn--d1acj3bbvacationswatch-and-cl" + + "ockerxn--d1alfaromeoxn--d1atunesomaxn--d5qv7z876clanbibaidarmeni" + + "axn--davvenjrga-y4axn--djrs72d6uyxn--djty4koryokamikawanehonbets" + + "urutaharaxn--dnna-grajewolterskluwerxn--drbak-wuaxn--dyry-iraxn-" + + "-e1a4cldmailouvreisenissayokkaichiropractichirurgiens-dentistes-" + + "en-francexn--eckvdtc9dxn--efvn9sorocabalsfjordxn--efvy88hair-sur" + + "veillancexn--ehqz56nxn--elqq16hakatanortonxn--estv75gxn--eveni-0" + + "qa01gaxn--f6qx53axn--fct429kosaigawaxn--fhbeiarnxn--finny-yuaxn-" + + "-fiq228c5hsorreisahayakawakamiichikawamisatourslzxn--fiq64beneve" + + "ntoeidsvollillyonagoyavoues3-eu-west-1xn--fiqs8sortlandxn--fiqz9" + + "soruminiserversicherungxn--fjord-lraxn--fjq720axn--fl-ziaxn--flo" + + "r-jraxn--flw351exn--forli-cesena-41gxn--forlicesena-ujgxn--fpcrj" + + "9c3dxn--frde-grandrapidsoundcastronomy-routerxn--frna-woaraisaij" + + "osoyrorosouthcarolinarvikomonowtvareservehttphonefosshinkamigoto" + + "yohashimotottoris-a-republicancerresearchaeologicaliforniaxn--fr" + + "ya-hraxn--fzc2c9e2clickashibatakashimarumorimachidaxn--fzys8d69u" + + "vgmailxn--g2xx48clinichiryukyuragifuchungbukharaumalopolskanland" + + "urbanamexnetlifyis-a-celticsfanishikatakayamatsushigexn--gckr3f0" + + "fauskedsmokorsetagayasells-for-ufcfanxn--gecrj9cliniquenoharaxn-" + + "-ggaviika-8ya47hakodatexn--gildeskl-g0axn--givuotna-8yasakaimina" + + "toyookannamilanotteroyxn--gjvik-wuaxn--gk3at1exn--gls-elacaixaxn" + + "--gmq050is-very-goodhandsonxn--gmqw5axn--h-2failxn--h1aeghakonex" + + "n--h2breg3evenesouthwestfalenxn--h2brj9c8clintonoshoesanjotoyoto" + + "miyazakis-a-conservativegarsheis-a-cpadualstackspace-to-rentalst" + + "omakomaibaraxn--h3cuzk1digitalxn--hbmer-xqaxn--hcesuolo-7ya35ben" + + "tleyonaguniversityoriikarateverbankaratsuginamikatagamilitaryosh" + + "iokaracoldwarmiastagevje-og-hornnes3-us-east-2xn--hery-iraxn--hg" + + "ebostad-g3axn--hmmrfeasta-s4accident-prevention-webhostingxn--hn" + + "efoss-q1axn--hobl-iraxn--holtlen-hxaxn--hpmir-xqaxn--hxt814exn--" + + "hyanger-q1axn--hylandet-54axn--i1b6b1a6a2exn--imr513nxn--indery-" + + "fyasugivingxn--io0a7is-very-nicexn--j1aefbsbxn--12cfi8ixb8luxury" + + "xn--j1amhakubahccavuotnagasakikuchikuseikarugamvikaufenxn--j6w19" + + "3gxn--jlq61u9w7beppublishproxyzjampagefrontappalmspringsakerxn--" + + "jlster-byasuokanraxn--jrpeland-54axn--jvr189misasaguris-certifie" + + "dogawarabikomaezakirunordreisa-geekazunowruzhgorodeoxn--k7yn95ex" + + "n--karmy-yuaxn--kbrq7oxn--kcrx77d1x4axn--kfjord-iuaxn--klbu-woax" + + "n--klt787dxn--kltp7dxn--kltx9axn--klty5xn--3ds443gxn--koluokta-7" + + "ya57hakuis-a-landscaperxn--kprw13dxn--kpry57dxn--kpu716fbx-osasa" + + "yamaxn--kput3is-very-sweetpepperxn--krager-gyatomitamamuraxn--kr" + + "anghke-b0axn--krdsherad-m8axn--krehamn-dxaxn--krjohka-hwab49jdfa" + + "stlylbarefootballfinanzgorauthordalandeportenrightathomeftpalmas" + + "eratiitatebayashiibajddarchitecturealtydalces3-ca-central-1xn--k" + + "snes-uuaxn--kvfjord-nxaxn--kvitsy-fyatsukanumazuryxn--kvnangen-k" + + "0axn--l-1fairwindsowaxn--l1accentureklamborghinikis-with-theband" + + "ovre-eikerxn--laheadju-7yatsushiroxn--langevg-jxaxn--lcvr32dxn--" + + "ldingen-q1axn--leagaviika-52beskidyn-o-saurlandes3-us-gov-west-1" + + "xn--lesund-huaxn--lgbbat1ad8jelenia-goraxn--lgrd-poacctunkongsbe" + + "rgxn--lhppi-xqaxn--linds-pramericanarturystykanoyakumoldelmenhor" + + "stalbansomnarviikamitondabayashiogamagoriziaxn--lns-qlapyxn--loa" + + "bt-0qaxn--lrdal-sraxn--lrenskog-54axn--lt-liaclothingdustkagoshi" + + "malselvendrellowiczest-le-patronissedalucaniaxn--lten-granexn--l" + + "ury-iraxn--m3ch0j3axn--mely-iraxn--merker-kuaxn--mgb2ddespeedpar" + + "tnersnoasaitotalxn--mgb9awbfbxosasebofagexn--mgba3a3ejtuscanyxn-" + + "-mgba3a4f16axn--mgba3a4franamizuholdingspiegelxn--mgba7c0bbn0axn" + + "--mgbaakc7dvfedorapeopleirfjordynnsarpsborguidefinimakanegasakin" + + "kobayashikaoirminamifuranoxn--mgbaam7a8hakusanagochijiwadell-ogl" + + "iastraderxn--mgbab2bdxn--mgbai9a5eva00bestbuyshouses3-us-west-1x" + + "n--mgbai9azgqp6jeonnamerikawauexn--mgbayh7gpalacexn--mgbb9fbpoba" + + "nazawaxn--mgbbh1a71exn--mgbc0a9azcgxn--mgbca7dzdoxn--mgberp4a5d4" + + "a87gxn--mgberp4a5d4arxn--mgbgu82axn--mgbi4ecexposedxn--mgbpl2fhs" + + "kydivingxn--mgbqly7c0a67fbcngrondarxn--mgbqly7cvafranziskanerima" + + "ringatlantakaharuxn--mgbt3dhdxn--mgbtf8flatangerxn--mgbtx2betain" + + "aboxfusejnynysagaeroclubmedecincinnationwidealerimo-i-ranadexete" + + "rxn--mgbx4cd0abbvieeexn--mix082fedoraprojectransurluzernxn--mix8" + + "91feiraquarelleborkangerxn--mjndalen-64axn--mk0axindianmarketing" + + "xn--mk1bu44cnpyatigorskodjeffersonisshingucciprianiigataitogliat" + + "tiresannaniyodogawaxn--mkru45isleofmanchesterxn--mlatvuopmi-s4ax" + + "n--mli-tlaquilanciaxn--mlselv-iuaxn--moreke-juaxn--mori-qsakurag" + + "awaxn--mosjen-eyawaraxn--mot-tlarvikosakaerodromegallupinbarsyon" + + "linewhollandevelopmentaxihuanayorovigotsukitahatakamatsukawautom" + + "otiveconomiasakuchinotsuchiurakawalmartatsunobiraustinnatuurwete" + + "nschappenaumburgjerstadotsuruokakegawaukraanghkepnogataijibigawa" + + "etnagahamaroyereportatarantoyakokonoebinordre-landd-dnshome-webs" + + "ervercelliguriagrocerybnikahokutobamagentositecnologiajudaicable" + + "-modemocraciaugustowadaeguambulancebizenakatombetsumitakagiizehi" + + "mejibestaddnslivelanddnss3-ap-south-16-bambleclerc66xn--mre-og-r" + + "omsdal-qqbhzcateringebuilderschmidtre-gauldalimanowarudaxaustrhe" + + "imatunduhrennesoyokosukanzakiyokawaraustevoll-o-g-i-naturhistori" + + "sches3-ap-southeast-2ix4432-bananarepublicaseihicampobassociates" + + "t-iservecounterstrike12hpaleobihirosakikamijimatsuzaki234lima-ci" + + "tyeatselinogradultarnobrzegyptian4tarumizusawabogadocscbgdyniabr" + + "uzzoologicalvinklein-addrammenuernberggfarmerseine164-barcelonag" + + "asukeastcoastaldefenceatonsbergjemnes3-ap-northeast-1337xn--msy-" + + "ula0haldenxn--mtta-vrjjat-k7afamilycompanycnsannohelplfinancialu" + + "ccapitalonewspaperxn--muost-0qaxn--mxtq1misawaxn--ngbc5azdxn--ng" + + "be9e0axn--ngbrxn--3e0b707exn--nit225koseis-a-soxfanxn--nmesjevue" + + "mie-tcbaltimore-og-romsdalipayxn--nnx388axn--nodessakuraissmarte" + + "rthanyousrlxn--nqv7fs00emaxn--nry-yla5gxn--ntso0iqx3axn--ntsq17g" + + "xn--nttery-byaeservehumourxn--nvuotna-hwaxn--nyqy26axn--o1achase" + + "ljeepsongdalenviknaharimalborkdalxn--o3cw4halsaintlouis-a-anarch" + + "istoireggiocalabriaxn--o3cyx2axn--od0algxn--od0aq3bieigersundish" + + "akotanhktjeldsundisrechtrainingjesdalimitedivtasvuodnakaniikawat" + + "anaguraxn--ogbpf8flekkefjordxn--oppegrd-ixaxn--ostery-fyawataham" + + "axn--osyro-wuaxn--otu796dxn--p1acfermochizukirkenesaskatchewanxn" + + "--p1aiwchoshibuyachiyodattorelayxn--pbt977cntoyotsukaidoxn--pgbs" + + "0dhlxn--porsgu-sta26ferraraxn--pssu33lxn--pssy2uxn--q9jyb4coguch" + + "ikuzenxn--qcka1pmckinseyxn--qqqt11misconfusedxn--qxamusementdllc" + + "ube-serversaillespjelkavikomorotsukamiokamikitayamatsuris-a-rock" + + "starachowicexn--rady-iraxn--rdal-poaxn--rde-ulavagiskexn--rdy-0n" + + "abarixn--rennesy-v1axn--rhkkervju-01aflakstadaokagakicks-assedic" + + "ollectionxn--rholt-mragowoodsideltaiwanairlinedre-eikerxn--rhqv9" + + "6gxn--rht27zxn--rht3dxn--rht61exn--risa-5nativeamericanantiquesp" + + "readbettingxn--risr-iraxn--rland-uuaxn--rlingen-mxaxn--rmskog-by" + + "axn--rny31hammarfeastafricapetownnews-stagingxn--rovu88bielawalt" + + "erxn--rros-granvindafjordxn--rskog-uuaxn--rst-0naturalhistorymus" + + "eumcenterxn--rsta-francaiseharaxn--rvc1e0am3exn--ryken-vuaxn--ry" + + "rvik-byaxn--s-1faithruheredumbrellajollamericanexpressexyxn--s9b" + + "rj9colognextdirectoyouraxn--sandnessjen-ogbizxn--sandy-yuaxn--se" + + "ral-lraxn--ses554gxn--sgne-gratangenxn--skierv-utazassnasabaerob" + + "aticketspydebergxn--skjervy-v1axn--skjk-soaxn--sknit-yqaxn--sknl" + + "and-fxaxn--slat-5naturalsciencesnaturellesrtromsojamisonxn--slt-" + + "elabcgxn--smla-hraxn--smna-gratis-a-bulls-fanxn--snase-nraxn--sn" + + "dre-land-0cbremangerxn--snes-poaxn--snsa-roaxn--sr-aurdal-l8axn-" + + "-sr-fron-q1axn--sr-odal-q1axn--sr-varanger-ggbiellaakesvuemielec" + + "cexn--srfold-byaxn--srreisa-q1axn--srum-grazxn--stfold-9xaxn--st" + + "jrdal-s1axn--stjrdalshalsen-sqbieszczadygeyachimataikikugawarsza" + + "washingtondclkareliancexn--stre-toten-zcbsrvaroyxn--sudtirol-y0e" + + "mmafann-arboretumbriamallamaceioxn--t60b56axn--tckweatherchannel" + + "xn--tiq49xqyjetztrentino-suedtirolxn--tjme-hraxn--tn0agrinet-fre" + + "akstoragexn--tnsberg-q1axn--tor131oxn--trany-yuaxn--trentin-sud-" + + "tirol-tsjcbnlxn--trentin-sudtirol-b9ixn--trentino-sud-tirol-dcko" + + "sherbrookegawaxn--trentino-sudtirol-usjevnakershuscultureggioemi" + + "liaromagnamsskoganeis-a-playerxn--trentinosud-tirol-tsjewelryxn-" + + "-trentinosudtirol-b9ixn--trentinsud-tirol-98ixn--trentinsudtirol" + + "-rqixn--trgstad-r1axn--trna-woaxn--troms-zuaxn--tysvr-vraxn--uc0" + + "atvestfoldxn--uc0ay4axn--uist22hamurakamigoris-a-lawyerxn--uisz3" + + "gxn--unjrga-rtaobaomoriguchiharagusartstordalxn--unup4yxn--uuwu5" + + "8axn--vads-jraxn--vallee-aoste-i2gxn--vallee-d-aoste-43hangglidi" + + "ngxn--valleeaoste-6jgxn--valleedaoste-i2gxn--vard-jraxn--vegrshe" + + "i-c0axn--vermgensberater-ctbievatmallorcadaques3-us-west-2xn--ve" + + "rmgensberatung-pwbifukagawashtenawdev-myqnapcloudaccesscambridge" + + "stoneustarhubs3-website-ap-northeast-1xn--vestvgy-ixa6oxn--vg-yi" + + "abkhaziaxn--vgan-qoaxn--vgsy-qoa0jewishartgalleryxn--vgu402colon" + + "ialwilliamsburgrongaxn--vhquvestnesopotromsakakinokiaxn--vler-qo" + + "axn--vre-eiker-k8axn--vrggt-xqadxn--vry-yla5gxn--vuq861bihorolog" + + "yukindigenamsosnowiecatholicaxiascolipicenodumetlifeinsurancexn-" + + "-w4r85el8fhu5dnraxn--w4rs40lxn--wcvs22dxn--wgbh1coloradoplateaud" + + "ioxn--wgbl6axn--xhq521bikedagestangeorgeorgiaxn--xkc2al3hye2axn-" + + "-xkc2dl3a5ee0hangoutsystemscloudfrontdoorxn--y9a3aquariumishimas" + + "udaxn--yer-znaturbruksgymnxn--yfro4i67oxn--ygarden-p1axn--ygbi2a" + + "mmxn--3hcrj9citadeliveryggeelvinckasaokaminokawanishiaizubangexn" + + "--ystre-slidre-ujbilbaogashimadachicagoboats3-website-ap-southea" + + "st-1xn--zbx025dxn--zf0ao64axn--zf0avxn--3oq18vl8pn36axn--zfr164b" + + "illustrationhlfanhs3-website-ap-southeast-2xnbayxperiaxz" + +// nodes is the list of nodes. Each node is represented as a uint32, which +// encodes the node's children, wildcard bit and node type (as an index into +// the children array), ICANN bit and text. +// +// If the table was generated with the -comments flag, there is a //-comment +// after each node's data. In it is the nodes-array indexes of the children, +// formatted as (n0x1234-n0x1256), with * denoting the wildcard bit. The +// nodeType is printed as + for normal, ! for exception, and o for parent-only +// nodes that have children but don't match a domain label in their own right. +// An I denotes an ICANN domain. +// +// The layout within the uint32, from MSB to LSB, is: +// [ 0 bits] unused +// [10 bits] children index +// [ 1 bits] ICANN bit +// [15 bits] text index +// [ 6 bits] text length +var nodes = [...]uint32{ + 0x32b543, + 0x2872c4, + 0x2c8146, + 0x2f4d83, + 0x2f4d86, + 0x382346, + 0x3b2083, + 0x2d4484, + 0x393b47, + 0x2c7d88, + 0x1a000c2, + 0x1f3a8c7, + 0x36e6c9, + 0x2bf60a, + 0x2bf60b, + 0x22b8c3, + 0x2acc06, + 0x232005, + 0x220cd42, + 0x3d0744, + 0x25f303, + 0x393345, + 0x2605202, + 0x358d83, + 0x2b2be04, + 0x38afc5, + 0x2e20fc2, + 0x39670e, + 0x2513c3, + 0x3aa546, + 0x3200a82, + 0x2fa0c7, + 0x234846, + 0x3601102, + 0x27f3c3, + 0x27f3c4, + 0x20f2c6, + 0x204048, + 0x279986, + 0x309604, + 0x3a04342, + 0x3442c9, + 0x223087, + 0x399606, + 0x36b389, + 0x2d5588, + 0x32d484, + 0x238d06, + 0x35af06, + 0x3e01902, + 0x3ad9cf, + 0x27a34e, + 0x354144, + 0x2097c5, + 0x32b445, + 0x2f1789, + 0x240409, + 0x20fac7, + 0x201286, + 0x2011c3, + 0x421cec2, + 0x227843, + 0x25d24a, + 0x460a203, + 0x2568c5, + 0x323bc2, + 0x383189, + 0x4a02842, + 0x206d84, + 0x310cc6, + 0x2c4685, + 0x366104, + 0x521d3c4, + 0x2038c3, + 0x231044, + 0x5600fc2, + 0x266944, + 0x5a88844, + 0x391d8a, + 0x5e00882, + 0x2f0947, + 0x279d08, + 0x6e07982, + 0x274487, + 0x2c2404, + 0x2c2407, + 0x3cbf45, + 0x33e047, + 0x36b686, + 0x28f304, + 0x307805, + 0x28de07, + 0x7e06542, + 0x324b83, + 0x20a742, + 0x38fdc3, + 0x820aac2, + 0x20aac5, + 0x8600202, + 0x2bd4c4, + 0x277ec5, + 0x354087, + 0x39170e, + 0x23d604, + 0x232844, + 0x207083, + 0x394d89, + 0x20708b, + 0x217c48, + 0x36b148, + 0x255488, + 0x219588, + 0x32d2ca, + 0x33df47, + 0x2ad6c6, + 0x8a49282, + 0x342303, + 0x343643, + 0x343a44, + 0x3b20c3, + 0x342343, + 0x1736382, + 0x8e00bc2, + 0x27f885, + 0x290086, + 0x27c844, + 0x35bf47, + 0x31f446, + 0x37b984, + 0x37b987, + 0x200bc3, + 0x92cb342, + 0x9720f02, + 0x9a2a8c2, + 0x22a8c6, + 0x9e00282, + 0x2a8f45, + 0x3378c3, + 0x3cc584, + 0x2eddc4, + 0x2eddc5, + 0x203283, + 0xa38d8c3, + 0xa606602, + 0x207f45, + 0x207f4b, + 0x208d06, + 0x255f4b, + 0x267c44, + 0x20adc9, + 0x20bac4, + 0xaa0bd02, + 0x20c543, + 0x20cac3, + 0x160d702, + 0x3bb283, + 0x20d70a, + 0xae0a842, + 0x3d09c5, + 0x2e074a, + 0x3778c4, + 0x20ea83, + 0x210484, + 0x210b83, + 0x210b84, + 0x210b87, + 0x211285, + 0x2122c6, + 0x2125c6, + 0x213343, + 0x217708, + 0x20a843, + 0xb2020c2, + 0x246988, + 0x3c5e8b, + 0x21e548, + 0x21ef86, + 0x220007, + 0x224cc8, + 0xc2054c2, + 0xc6c25c2, + 0x312908, + 0x303c07, + 0x280805, + 0x38f548, + 0x2dee48, + 0x37ba83, + 0x229484, + 0x343a82, + 0xca29e82, + 0xce02c82, + 0xd629fc2, + 0x229fc3, + 0xda00f82, + 0x3488c3, + 0x2d3104, + 0x208f83, + 0x324f44, + 0x39424b, + 0x231783, + 0x2e6f46, + 0x231784, + 0x3516ce, + 0x248a85, + 0x3aa648, + 0x397047, + 0x39704a, + 0x207243, + 0x280b47, + 0x207245, + 0x22d9c4, + 0x2d1106, + 0x2d1107, + 0x2db144, + 0x2eef07, + 0x303644, + 0x200f84, + 0x391a46, + 0x25a344, + 0x32e046, + 0x229cc3, + 0x38f308, + 0x3ca508, + 0x232803, + 0x3bb243, + 0x3b3284, + 0x3b79c3, + 0xde48182, + 0xe28bac2, + 0x205a83, + 0x203986, + 0x2041c3, + 0x22f104, + 0xe73e842, + 0x355843, + 0x33e843, + 0x214f82, + 0xea06a82, + 0x2c5706, + 0x232d07, + 0x2f0fc7, + 0x39bec5, + 0x209e04, + 0x28dcc5, + 0x288407, + 0x302889, + 0x2d27c6, + 0x2e44c8, + 0x2ec986, + 0xee14d42, + 0x384ac8, + 0x2fb306, + 0x334c05, + 0x3cf307, + 0x3183c4, + 0x3183c5, + 0x279b44, + 0x392f88, + 0xf208002, + 0xf600482, + 0x334906, + 0x200488, + 0x352485, + 0x353406, + 0x355bc8, + 0x374b48, + 0xfa07d85, + 0xfe6dd04, + 0x381507, + 0x1020b542, + 0x10742382, + 0x11a08e02, + 0x310dc5, + 0x2a3c05, + 0x2564c6, + 0x2be307, + 0x3ae0c7, + 0x12208e03, + 0x29d007, + 0x2eac08, + 0x1b62ae49, + 0x3968c7, + 0x22bb07, + 0x22c588, + 0x22cd86, + 0x22d4c6, + 0x22e10c, + 0x22f70a, + 0x230087, + 0x231ecb, + 0x232b47, + 0x232b4e, + 0x1ba33ac4, + 0x233e84, + 0x236b87, + 0x2606c7, + 0x23df06, + 0x23df07, + 0x23e787, + 0x1be2a502, + 0x2407c6, + 0x2407ca, + 0x240d4b, + 0x2424c7, + 0x243085, + 0x243583, + 0x243c06, + 0x243c07, + 0x273203, + 0x1c200102, + 0x24448a, + 0x1c76fd82, + 0x1ca481c2, + 0x1ce46682, + 0x1d234942, + 0x2476c5, + 0x247e84, + 0x1da18982, + 0x2669c5, + 0x241343, + 0x20bbc5, + 0x219484, + 0x21fec4, + 0x30a506, + 0x31a186, + 0x208143, + 0x3b7284, + 0x328d43, + 0x1ea08a42, + 0x220384, + 0x381a86, + 0x220385, + 0x2d0006, + 0x3cf408, + 0x2358c4, + 0x230308, + 0x3a7785, + 0x2438c8, + 0x2b5386, + 0x347d87, + 0x2474c4, + 0x2474c6, + 0x29d303, + 0x3a2043, + 0x31c148, + 0x32ed84, + 0x35b5c7, + 0x1fe02186, + 0x2dda09, + 0x331908, + 0x33e8c8, + 0x39df04, + 0x210543, + 0x22eac2, + 0x2020a182, + 0x206130c2, + 0x213ac3, + 0x20a1d202, + 0x393c84, + 0x249f86, + 0x324c85, + 0x29f643, + 0x22b184, + 0x2b5d07, + 0x38a583, + 0x23bb08, + 0x221bc5, + 0x25da03, + 0x277e45, + 0x277f84, + 0x3015c6, + 0x226804, + 0x228c06, + 0x353fc6, + 0x2bda04, + 0x232f03, + 0x20e1d602, + 0x232645, + 0x200843, + 0x21202242, + 0x22e0c3, + 0x218f05, + 0x231103, + 0x231109, + 0x21600942, + 0x21e21742, + 0x28b3c5, + 0x215f46, + 0x2a52c6, + 0x2c5d08, + 0x2c5d0b, + 0x2039cb, + 0x26d545, + 0x39c0c5, + 0x2cba89, + 0x1601042, + 0x2cfc88, + 0x204544, + 0x22602bc2, + 0x2182c3, + 0x22e60886, + 0x23da48, + 0x23200c02, + 0x223dc8, + 0x23605642, + 0x2bc08a, + 0x23ad1703, + 0x205246, + 0x35c6c8, + 0x30b508, + 0x2d4146, + 0x37eb07, + 0x3adbc7, + 0x24f2ca, + 0x377944, + 0x358b04, + 0x36e249, + 0x243ad3c5, + 0x27a546, + 0x226003, + 0x24fd84, + 0x246353c4, + 0x3949c7, + 0x233cc7, + 0x2bb1c4, + 0x2d3185, + 0x256588, + 0x2484c7, + 0x248847, + 0x24a17242, + 0x312f44, + 0x290e08, + 0x24a344, + 0x24ba04, + 0x24c045, + 0x24d647, + 0x25bf49, + 0x24e2c4, + 0x24e849, + 0x24ea88, + 0x24fb04, + 0x24fb07, + 0x24e500c3, + 0x250247, + 0x1621e82, + 0x16ae902, + 0x250dc6, + 0x251407, + 0x252584, + 0x253a47, + 0x254647, + 0x254dc3, + 0x22ec42, + 0x204102, + 0x26fb03, + 0x26fb04, + 0x26fb0b, + 0x36b248, + 0x25cd84, + 0x258745, + 0x259747, + 0x25afc5, + 0x2cf5ca, + 0x25ccc3, + 0x25201482, + 0x21f584, + 0x260489, + 0x264883, + 0x264947, + 0x3cd809, + 0x218bc8, + 0x23f883, + 0x27db87, + 0x27e209, + 0x26c043, + 0x285604, + 0x2864c9, + 0x2896c6, + 0x354383, + 0x206502, + 0x238cc3, + 0x3c7a87, + 0x2df1c5, + 0x387c46, + 0x257384, + 0x2e7d45, + 0x21bd83, + 0x213586, + 0x20afc2, + 0x3aea44, + 0x25623642, + 0x25a67d03, + 0x25e028c2, + 0x24b903, + 0x212a44, + 0x212a47, + 0x3cc886, + 0x27bc42, + 0x26236142, + 0x3cf604, + 0x2662a642, + 0x26a00ac2, + 0x2b2944, + 0x2b2945, + 0x202b05, + 0x361146, + 0x26e0ccc2, + 0x20ccc5, + 0x20dac5, + 0x20e903, + 0x212bc6, + 0x21d6c5, + 0x22a842, + 0x353045, + 0x22a844, + 0x235803, + 0x235a43, + 0x27207702, + 0x2dc347, + 0x2d6244, + 0x2d6249, + 0x24fc84, + 0x285403, + 0x358409, + 0x285408, + 0x276a3a84, + 0x2a3a86, + 0x2a8bc3, + 0x21ac03, + 0x213ec3, + 0x27af9602, + 0x2fc0c2, + 0x27e00642, + 0x3394c8, + 0x275608, + 0x3b26c6, + 0x26f745, + 0x2809c5, + 0x38c3c7, + 0x236185, + 0x259a02, + 0x28294f42, + 0x28600042, + 0x238508, + 0x384a05, + 0x2f23c4, + 0x379a85, + 0x249b47, + 0x272084, + 0x244382, + 0x28a2f682, + 0x348e04, + 0x235687, + 0x3cd347, + 0x33e004, + 0x292e83, + 0x232744, + 0x232748, + 0x22d806, + 0x2d0f8a, + 0x396c44, + 0x293388, + 0x289b04, + 0x220106, + 0x294f04, + 0x3110c6, + 0x2d6509, + 0x234bc7, + 0x217b03, + 0x28e01742, + 0x39e183, + 0x20bf02, + 0x29239442, + 0x314ac6, + 0x378808, + 0x2a5447, + 0x2fe249, + 0x2928c9, + 0x2a6e05, + 0x2a7d89, + 0x2a8545, + 0x2a8689, + 0x2a9c05, + 0x2aa8c8, + 0x2960e604, + 0x29a54f07, + 0x22bec3, + 0x2aaac7, + 0x22bec6, + 0x2aaf87, + 0x2a2dc5, + 0x2ec403, + 0x29e2f4c2, + 0x20ecc4, + 0x2a22a682, + 0x2a655402, + 0x2f5086, + 0x279c85, + 0x2ae587, + 0x328c83, + 0x33bdc4, + 0x210e03, + 0x312643, + 0x2aa00d42, + 0x2b207782, + 0x382444, + 0x22ec03, + 0x2471c5, + 0x2b60ad02, + 0x2be02ec2, + 0x2ffd86, + 0x32eec4, + 0x301b44, + 0x301b4a, + 0x2c6005c2, + 0x269f03, + 0x2094ca, + 0x2171c8, + 0x2ca20a04, + 0x2005c3, + 0x208643, + 0x2555c9, + 0x254b89, + 0x278586, + 0x2ce17383, + 0x21da05, + 0x3305cd, + 0x217386, + 0x22184b, + 0x2d2032c2, + 0x21bc08, + 0x2fa0f502, + 0x2fe01142, + 0x2df4c5, + 0x30200b02, + 0x24bc47, + 0x2b3e87, + 0x208543, + 0x325908, + 0x30602a02, + 0x2a0d04, + 0x293083, + 0x389085, + 0x3a1143, + 0x241446, + 0x21cd04, + 0x3bb203, + 0x2b1d03, + 0x30a06e82, + 0x39c044, + 0x3b9305, + 0x3bdd87, + 0x27bd03, + 0x2aed83, + 0x2b14c3, + 0x160a6c2, + 0x2b1583, + 0x2b1c83, + 0x30e05e42, + 0x30ffc4, + 0x31a386, + 0x359e03, + 0x2b1fc3, + 0x312b2d02, + 0x2b2d08, + 0x2b3b04, + 0x310586, + 0x25ddc7, + 0x362c46, + 0x2d5844, + 0x3ee01782, + 0x22bd8b, + 0x2f6d4e, + 0x216acf, + 0x300e83, + 0x3f65e242, + 0x1642ac2, + 0x3fa03cc2, + 0x258f03, + 0x203cc3, + 0x302b06, + 0x2d2ec6, + 0x274f87, + 0x300804, + 0x3fe16082, + 0x402220c2, + 0x2499c5, + 0x2f6107, + 0x3bbf86, + 0x4060e842, + 0x20e844, + 0x2b8c43, + 0x40a06f42, + 0x40f6a383, + 0x2b9504, + 0x2c1789, + 0x16c74c2, + 0x41214882, + 0x332985, + 0x416c79c2, + 0x41a00e42, + 0x357dc7, + 0x210fc9, + 0x36e94b, + 0x3ad985, + 0x26ab09, + 0x386346, + 0x208d47, + 0x41e0fa84, + 0x211d89, + 0x3428c7, + 0x211a47, + 0x223f03, + 0x2b27c6, + 0x3176c7, + 0x2450c3, + 0x3c0c46, + 0x4260d9c2, + 0x42a31382, + 0x39e2c3, + 0x33b9c5, + 0x38eac7, + 0x21df46, + 0x2df145, + 0x256984, + 0x27cf05, + 0x2fbac4, + 0x42e04382, + 0x326407, + 0x2c64c4, + 0x25b244, + 0x3cac0d, + 0x2d86c9, + 0x22a5c8, + 0x273a04, + 0x34c285, + 0x39e907, + 0x204384, + 0x31f507, + 0x214605, + 0x43215804, + 0x2b16c5, + 0x263544, + 0x3010c6, + 0x2be105, + 0x4360e802, + 0x3a3f43, + 0x2df284, + 0x2df285, + 0x343fc6, + 0x32e8c5, + 0x2b0184, + 0x259dc3, + 0x21d146, + 0x31b405, + 0x31d885, + 0x2be204, + 0x396cc3, + 0x396ccc, + 0x43afcb42, + 0x43e0cf82, + 0x44204c82, + 0x221303, + 0x221304, + 0x4460bb02, + 0x305b88, + 0x387d05, + 0x245b84, + 0x361e86, + 0x44a11602, + 0x44e27fc2, + 0x45202d82, + 0x2a5845, + 0x2bd8c6, + 0x235304, + 0x20f806, + 0x2f0706, + 0x22ef43, + 0x4572228a, + 0x26ae85, + 0x25d203, + 0x221106, + 0x383dc9, + 0x221107, + 0x2a17c8, + 0x2d5449, + 0x36bf48, + 0x2ecf86, + 0x207043, + 0x45a9d082, + 0x3a3408, + 0x45e4eb42, + 0x46202302, + 0x208e83, + 0x2e4345, + 0x26bbc4, + 0x252b89, + 0x2eff84, + 0x2141c8, + 0x20bf43, + 0x46b946c4, + 0x2a6c03, + 0x215f88, + 0x3cab47, + 0x46e0e8c2, + 0x239ec2, + 0x32b3c5, + 0x266109, + 0x270203, + 0x280584, + 0x330584, + 0x22dc03, + 0x28128a, + 0x47327182, + 0x4760eb02, + 0x2cb2c3, + 0x3865c3, + 0x161a142, + 0x3aa303, + 0x47a26942, + 0x47e01942, + 0x4820ac44, + 0x20ac46, + 0x2fffc6, + 0x241c44, + 0x279883, + 0x2069c3, + 0x2f73c3, + 0x2410c6, + 0x326b85, + 0x2cb447, + 0x2ce5c5, + 0x2cf846, + 0x2d04c8, + 0x2d06c6, + 0x201944, + 0x29988b, + 0x2d67c3, + 0x2d67c5, + 0x2d6c48, + 0x227382, + 0x3580c2, + 0x48647742, + 0x48a02382, + 0x2160c3, + 0x48e6cac2, + 0x26cac3, + 0x2d7583, + 0x49603342, + 0x49adbd86, + 0x25ae46, + 0x49edbec2, + 0x4a20cb02, + 0x4a635a82, + 0x4aa07c02, + 0x4ae21482, + 0x4b200a42, + 0x2149c3, + 0x381e05, + 0x34c406, + 0x4b6bf144, + 0x38188a, + 0x3abbc6, + 0x2e6844, + 0x239383, + 0x4c208dc2, + 0x201402, + 0x22f1c3, + 0x4c61d283, + 0x300d07, + 0x2be007, + 0x4de6fc07, + 0x3c60c7, + 0x226bc3, + 0x38808a, + 0x397244, + 0x3ae204, + 0x3ae20a, + 0x242ec5, + 0x4e217202, + 0x250d83, + 0x4e600602, + 0x24fc43, + 0x39e143, + 0x4ee00582, + 0x29cf84, + 0x21b784, + 0x210805, + 0x30e7c5, + 0x31f686, + 0x347506, + 0x4f23bbc2, + 0x4f601c02, + 0x3c8c05, + 0x25ab52, + 0x349906, + 0x289a43, + 0x365986, + 0x350705, + 0x160d742, + 0x57a0e142, + 0x3643c3, + 0x20e143, + 0x288203, + 0x57e0b142, + 0x22ab03, + 0x58201202, + 0x20ac83, + 0x310008, + 0x256503, + 0x2a6c86, + 0x237007, + 0x313786, + 0x31378b, + 0x2e6787, + 0x2fab84, + 0x58a02d42, + 0x387b85, + 0x58e1d243, + 0x2a8b43, + 0x2bc285, + 0x387f83, + 0x59387f86, + 0x2cfe0a, + 0x2418c3, + 0x20f1c4, + 0x2003c6, + 0x335006, + 0x59659003, + 0x33bc87, + 0x278487, + 0x29b3c5, + 0x3a1bc6, + 0x2a1903, + 0x5c212e03, + 0x5c60a282, + 0x267e84, + 0x213b49, + 0x238307, + 0x229585, + 0x243204, + 0x376f48, + 0x2459c5, + 0x5ca4e545, + 0x287389, + 0x3996c3, + 0x248144, + 0x5ce09302, + 0x2162c3, + 0x5d28f002, + 0x28f006, + 0x1625f42, + 0x5d607b02, + 0x2a5748, + 0x2c4003, + 0x2b1607, + 0x350b05, + 0x2c3bc5, + 0x313a0b, + 0x2e51c6, + 0x313c06, + 0x2e63c6, + 0x28ac04, + 0x2c1986, + 0x5dad9088, + 0x231843, + 0x203043, + 0x203044, + 0x30ab04, + 0x30bac7, + 0x2ea545, + 0x5deea682, + 0x5e2059c2, + 0x2059c5, + 0x2ec504, + 0x2ec50b, + 0x2edcc8, + 0x24dfc4, + 0x5ea0e882, + 0x5ee4df42, + 0x2b2f43, + 0x2ee404, + 0x2ee6c5, + 0x2ef0c7, + 0x2f1f04, + 0x26d584, + 0x5f203b02, + 0x372649, + 0x2f3505, + 0x3adc45, + 0x2f4085, + 0x5f616203, + 0x2f5dc4, + 0x2f5dcb, + 0x2f6604, + 0x2f68cb, + 0x2f7305, + 0x216c0a, + 0x2f7ac8, + 0x2f7cca, + 0x2f8283, + 0x2f828a, + 0x5fe5c8c2, + 0x6023eec2, + 0x60681ac3, + 0x60afb282, + 0x2fb283, + 0x60f73dc2, + 0x61338042, + 0x2fb944, + 0x217846, + 0x20f545, + 0x2fc503, + 0x32bb06, + 0x20f045, + 0x2afcc4, + 0x61600902, + 0x2fec84, + 0x2cb70a, + 0x23f187, + 0x36c846, + 0x318f87, + 0x202103, + 0x2b9548, + 0x3ad60b, + 0x2c1ec5, + 0x3473c5, + 0x3473c6, + 0x2e9804, + 0x3b73c8, + 0x22dfc3, + 0x266cc4, + 0x35ae07, + 0x2fa7c6, + 0x38b386, + 0x35150a, + 0x23a844, + 0x23a84a, + 0x61b28386, + 0x328387, + 0x2587c7, + 0x273844, + 0x273849, + 0x31a045, + 0x36bb4b, + 0x2ec283, + 0x228dc3, + 0x61e1bbc3, + 0x22dbc4, + 0x62200682, + 0x3226c6, + 0x627a4f05, + 0x365bc5, + 0x254206, + 0x29db44, + 0x62a01a42, + 0x2435c4, + 0x62e08782, + 0x3357c5, + 0x237804, + 0x63a24603, + 0x63e0e182, + 0x20e183, + 0x353606, + 0x64203c42, + 0x226588, + 0x220f84, + 0x220f86, + 0x386e46, + 0x208804, + 0x21d0c5, + 0x26dc08, + 0x2af987, + 0x322a47, + 0x322a4f, + 0x290d06, + 0x23e903, + 0x23e904, + 0x245ac4, + 0x20dbc3, + 0x220244, + 0x2547c4, + 0x6460ed02, + 0x28b7c3, + 0x2591c3, + 0x64a11302, + 0x273b03, + 0x393d43, + 0x21130a, + 0x38f707, + 0x25c64c, + 0x25c906, + 0x25d486, + 0x25dac7, + 0x64e2c9c7, + 0x26a249, + 0x246ac4, + 0x26c784, + 0x65216102, + 0x65601002, + 0x3518c6, + 0x33ba84, + 0x28bc46, + 0x22ce48, + 0x23d884, + 0x24bc86, + 0x2a5285, + 0x2902c8, + 0x203bc3, + 0x292ac5, + 0x293e03, + 0x3add43, + 0x3add44, + 0x21f543, + 0x65a5e142, + 0x65e01702, + 0x2ec149, + 0x29d485, + 0x29ef84, + 0x2a2f05, + 0x21a444, + 0x2c8b87, + 0x359c45, + 0x6626fdc4, + 0x26fdc8, + 0x2eba46, + 0x2ec3c4, + 0x2efe08, + 0x2f1647, + 0x66605502, + 0x2f6044, + 0x20dc84, + 0x2bbc07, + 0x66a05504, + 0x255a42, + 0x66e11782, + 0x21c883, + 0x2dfe84, + 0x29c083, + 0x29c085, + 0x6722b5c2, + 0x2fc3c5, + 0x2701c2, + 0x399e85, + 0x2bba85, + 0x67614742, + 0x33e7c4, + 0x67a00b42, + 0x25f386, + 0x31fe06, + 0x266248, + 0x2c2e08, + 0x2f5004, + 0x303105, + 0x342a49, + 0x39c144, + 0x2cfdc4, + 0x212503, + 0x67e4f405, + 0x3789c7, + 0x24ac05, + 0x2a3d04, + 0x3a8f8d, + 0x374402, + 0x39a203, + 0x3b1a43, + 0x68201dc2, + 0x3a6a45, + 0x21cf47, + 0x2baa04, + 0x3c6187, + 0x2d5649, + 0x2cb849, + 0x277107, + 0x28d7c3, + 0x31ffc8, + 0x268ac9, + 0x3ba087, + 0x2fc845, + 0x2fd786, + 0x2fdd86, + 0x2fdf05, + 0x2d87c5, + 0x68600c82, + 0x2b0c85, + 0x2b6e48, + 0x2c54c6, + 0x68a024c7, + 0x2bb104, + 0x31c587, + 0x300986, + 0x68e0fdc2, + 0x343cc6, + 0x304a0a, + 0x305285, + 0x692e6a02, + 0x69692782, + 0x317a06, + 0x2b6948, + 0x69bcd507, + 0x69e18902, + 0x219503, + 0x209246, + 0x2249c4, + 0x3c1346, + 0x202806, + 0x20184a, + 0x38b4c5, + 0x2f8dc6, + 0x388543, + 0x388544, + 0x203942, + 0x32ee43, + 0x6a221342, + 0x2f8743, + 0x209744, + 0x2b6a84, + 0x2b6a8a, + 0x219fc3, + 0x279a48, + 0x2ed04a, + 0x237a87, + 0x307f86, + 0x25f244, + 0x2917c2, + 0x2a4402, + 0x6a6007c2, + 0x232703, + 0x258587, + 0x2007c7, + 0x287244, + 0x3b0047, + 0x2ef1c6, + 0x22a9c7, + 0x303d44, + 0x385005, + 0x218745, + 0x6aa0a682, + 0x20a686, + 0x2174c3, + 0x21cb82, + 0x21cb86, + 0x6ae00e02, + 0x6b2022c2, + 0x3c4805, + 0x6b60fec2, + 0x6ba019c2, + 0x32f005, + 0x2cd585, + 0x2a6085, + 0x6be5e603, + 0x24a045, + 0x2e5287, + 0x3772c5, + 0x34ba85, + 0x3aa744, + 0x3224c6, + 0x22b3c4, + 0x6c2008c2, + 0x6cf7b0c5, + 0x2a47c7, + 0x39e5c8, + 0x250606, + 0x25060d, + 0x254949, + 0x254952, + 0x2ff345, + 0x307543, + 0x6d202442, + 0x315dc4, + 0x217403, + 0x3446c5, + 0x305f05, + 0x6d62a342, + 0x25da43, + 0x6da5a902, + 0x6e2c2742, + 0x6e600082, + 0x2e2d05, + 0x3c62c3, + 0x24a948, + 0x6ea076c2, + 0x6ee067c2, + 0x29cf46, + 0x35c20a, + 0x214b43, + 0x259d43, + 0x342cc3, + 0x6fe03642, + 0x7e21a642, + 0x7ea10602, + 0x204b02, + 0x343ac9, + 0x2c6904, + 0x2a9f08, + 0x7eefc542, + 0x7f202b82, + 0x2acd05, + 0x232308, + 0x316d48, + 0x34d2cc, + 0x2379c3, + 0x7f617b82, + 0x7fa05ec2, + 0x281c46, + 0x308e05, + 0x274683, + 0x27bb06, + 0x308f46, + 0x2c6b43, + 0x30a8c3, + 0x30af86, + 0x30c444, + 0x26cfc6, + 0x21d845, + 0x21d84a, + 0x24c184, + 0x30cb04, + 0x30d24a, + 0x7fe05082, + 0x24c305, + 0x30e04a, + 0x30ea05, + 0x30f2c4, + 0x30f3c6, + 0x30f544, + 0x216586, + 0x8020fe02, + 0x2f4a06, + 0x326945, + 0x389807, + 0x3aaf06, + 0x25dcc4, + 0x2dd487, + 0x3221c6, + 0x234f05, + 0x239a87, + 0x3b8c87, + 0x3b8c8e, + 0x27b406, + 0x31f3c5, + 0x205447, + 0x20cb43, + 0x20cb47, + 0x2252c5, + 0x229ec4, + 0x233c82, + 0x2451c7, + 0x300884, + 0x240bc4, + 0x28620b, + 0x21b083, + 0x2d0807, + 0x21b084, + 0x2efc87, + 0x2921c3, + 0x3465cd, + 0x3a7608, + 0x235fc4, + 0x26fcc5, + 0x314205, + 0x314643, + 0x80620e82, + 0x316043, + 0x316a03, + 0x20a804, + 0x27e305, + 0x217547, + 0x3885c6, + 0x383c03, + 0x235acb, + 0x2740cb, + 0x2a828b, + 0x30260b, + 0x2e6a4a, + 0x33030b, + 0x3679cb, + 0x39838c, + 0x3cf08b, + 0x3d1911, + 0x31734a, + 0x317b8b, + 0x317e4c, + 0x31814b, + 0x31a8ca, + 0x31b54a, + 0x31ca8e, + 0x31dbcb, + 0x31de8a, + 0x320bd1, + 0x32100a, + 0x32150b, + 0x321a4e, + 0x32330c, + 0x32378b, + 0x323a4e, + 0x323dcc, + 0x329e4a, + 0x32ad8c, + 0x80b2b08a, + 0x32bc88, + 0x32c849, + 0x32f3ca, + 0x32f64a, + 0x32f8cb, + 0x3334ce, + 0x334511, + 0x33d349, + 0x33d58a, + 0x33dccb, + 0x34048a, + 0x340d16, + 0x34208b, + 0x34260a, + 0x34314a, + 0x3437cb, + 0x344149, + 0x346f49, + 0x34824d, + 0x348b8b, + 0x349a8b, + 0x34a44b, + 0x34a909, + 0x34af4e, + 0x34bc4a, + 0x34c98a, + 0x34cdca, + 0x34d90b, + 0x34e14b, + 0x34edcd, + 0x35218d, + 0x352cd0, + 0x35318b, + 0x354d4c, + 0x35594b, + 0x3578cb, + 0x358fce, + 0x35974b, + 0x35974d, + 0x35fc4b, + 0x3606cf, + 0x360a8b, + 0x3612ca, + 0x361809, + 0x362009, + 0x80f62dcb, + 0x36308e, + 0x36488b, + 0x36658f, + 0x3685cb, + 0x36888b, + 0x368b4b, + 0x36910a, + 0x36e549, + 0x37138f, + 0x376b4c, + 0x37740c, + 0x377a4e, + 0x377f4f, + 0x37830e, + 0x378b90, + 0x378f8f, + 0x37a68e, + 0x37b24c, + 0x37b552, + 0x37bfd1, + 0x37c7ce, + 0x37cc4e, + 0x37d18b, + 0x37d18e, + 0x37d50f, + 0x37d8ce, + 0x37dc53, + 0x37e111, + 0x37e54c, + 0x37e84e, + 0x37eccc, + 0x37f213, + 0x37f8d0, + 0x38044c, + 0x38074c, + 0x380c0b, + 0x38204e, + 0x38254b, + 0x382e0b, + 0x38400c, + 0x3977ca, + 0x397b8c, + 0x397e8c, + 0x398189, + 0x39978b, + 0x399a48, + 0x39a2c9, + 0x39a2cf, + 0x39ba4b, + 0x8139c84a, + 0x39f1cc, + 0x3a038b, + 0x3a0649, + 0x3a0f88, + 0x3a180b, + 0x3a1e0b, + 0x3a298a, + 0x3a2c0b, + 0x3a318c, + 0x3a3b48, + 0x3a7dcb, + 0x3aab4b, + 0x3ac7ce, + 0x3ade4b, + 0x3af1cb, + 0x3b880b, + 0x3b8ac9, + 0x3b900d, + 0x3c1b4a, + 0x3c4157, + 0x3c4e98, + 0x3c8509, + 0x3c9b4b, + 0x3caf54, + 0x3cb44b, + 0x3cb9ca, + 0x3cc08a, + 0x3cc30b, + 0x3ccb50, + 0x3ccf51, + 0x3cda4a, + 0x3ce68d, + 0x3ced8d, + 0x3d1d4b, + 0x3d2c06, + 0x20a783, + 0x81763703, + 0x2af846, + 0x241805, + 0x27eb07, + 0x3301c6, + 0x1660842, + 0x2aeec9, + 0x32b904, + 0x2e4708, + 0x21bb03, + 0x315d07, + 0x202cc2, + 0x2ae5c3, + 0x81a01242, + 0x2ccb46, + 0x2cde04, + 0x268244, + 0x3293c3, + 0x3293c5, + 0x822c7a02, + 0x826a8a04, + 0x273787, + 0x82a5b102, + 0x208e03, + 0x231103, + 0x213ec3, + 0x270203, + 0x21d283, + 0x259003, + 0xe9fc8, + 0x214b83, + 0x2000c2, + 0x120648, + 0x208e02, + 0x213ec3, + 0x270203, + 0x21d283, + 0x14b83, + 0x259003, + 0x211303, + 0x33b2d6, + 0x35e713, + 0x3afec9, + 0x381408, + 0x387a09, + 0x30e1c6, + 0x348e50, + 0x2446d3, + 0x2fa888, + 0x3a79c7, + 0x2b0587, + 0x27cc4a, + 0x38d689, + 0x3a3cc9, + 0x2879cb, + 0x36b686, + 0x205bca, + 0x21ef86, + 0x32b503, + 0x2dc285, + 0x38f308, + 0x25f44d, + 0x310e8c, + 0x2eca87, + 0x31ab0d, + 0x26dd04, + 0x22de8a, + 0x22f24a, + 0x22f70a, + 0x2449c7, + 0x23cf47, + 0x241dc4, + 0x2474c6, + 0x32e644, + 0x2ff9c8, + 0x2effc9, + 0x2c5d06, + 0x2c5d08, + 0x2f8acd, + 0x2cba89, + 0x30b508, + 0x3adbc7, + 0x28be4a, + 0x251406, + 0x260247, + 0x2e2304, + 0x2274c7, + 0x213eca, + 0x24200e, + 0x236185, + 0x3c2dcb, + 0x307349, + 0x254b89, + 0x208387, + 0x20838a, + 0x2bbb47, + 0x2f6e89, + 0x2c9e88, + 0x31140b, + 0x2e4345, + 0x22a48a, + 0x235849, + 0x27460a, + 0x2ce64b, + 0x2273cb, + 0x287755, + 0x2e87c5, + 0x3adc45, + 0x2f5dca, + 0x27868a, + 0x3070c7, + 0x214c83, + 0x351848, + 0x2da04a, + 0x220f86, + 0x268909, + 0x2902c8, + 0x2ec3c4, + 0x37efc9, + 0x2c2e08, + 0x2b52c7, + 0x37b0c6, + 0x2a47c7, + 0x2b8007, + 0x240ec5, + 0x235fcc, + 0x26fcc5, + 0x208e03, + 0x231103, + 0x213ec3, + 0x21d283, + 0x14b83, + 0x259003, + 0x208e02, + 0x208e03, + 0x21d283, + 0x214b83, + 0x259003, + 0x208e03, + 0x21d283, + 0x14b83, + 0x256503, + 0x259003, + 0x120648, + 0x208e03, + 0x231103, + 0x213ec3, + 0x270203, + 0x21d283, + 0x14b83, + 0x259003, + 0x120648, + 0x208e02, + 0x202142, + 0x2fab02, + 0x202a02, + 0x20a002, + 0x2d3a42, + 0x8edc6, + 0x4e08e03, + 0x231103, + 0x3d0943, + 0x213ec3, + 0x217383, + 0x270203, + 0x2dc186, + 0x21d283, + 0x259003, + 0x2323c3, + 0x120648, + 0x394c44, + 0x394487, + 0x329d83, + 0x24f784, + 0x208203, + 0x208403, + 0x213ec3, + 0xeb207, + 0x192544, + 0x191503, + 0x192e05, + 0x2000c2, + 0x18d8c3, + 0x6208e02, + 0x648a8c9, + 0x8af4d, + 0x8b28d, + 0x2fab02, + 0x20a04, + 0x192e49, + 0x2003c2, + 0x6a20908, + 0xf5544, + 0x120648, + 0x1442f02, + 0x14005c2, + 0x1442f02, + 0x150ec46, + 0x22d083, + 0x2b9343, + 0x7208e03, + 0x22de84, + 0x7631103, + 0x7a13ec3, + 0x200d42, + 0x220a04, + 0x21d283, + 0x303303, + 0x200ec2, + 0x259003, + 0x218502, + 0x2fb883, + 0x203c42, + 0x201683, + 0x290383, + 0x206582, + 0x120648, + 0x22d083, + 0x303303, + 0x200ec2, + 0x2fb883, + 0x203c42, + 0x201683, + 0x290383, + 0x206582, + 0x2fb883, + 0x203c42, + 0x201683, + 0x290383, + 0x206582, + 0x208e03, + 0x38d8c3, + 0x208e03, + 0x231103, + 0x213ec3, + 0x220a04, + 0x217383, + 0x270203, + 0x2bf144, + 0x21d283, + 0x259003, + 0x202542, + 0x216203, + 0x120648, + 0x208e03, + 0x231103, + 0x213ec3, + 0x270203, + 0x21d283, + 0x259003, + 0x38d8c3, + 0x208e02, + 0x208e03, + 0x231103, + 0x213ec3, + 0x220a04, + 0x21d283, + 0x259003, + 0x2fc845, + 0x22a342, + 0x2000c2, + 0x120648, + 0x1582ac8, + 0x15ec0a, + 0x213ec3, + 0x201ec1, + 0x201f81, + 0x201e81, + 0x201ac1, + 0x235c81, + 0x211201, + 0x207ec1, + 0x218481, + 0x203241, + 0x200001, + 0x2000c1, + 0x200201, + 0xf8945, + 0x120648, + 0x200101, + 0x200d81, + 0x200501, + 0x201481, + 0x200041, + 0x200801, + 0x200181, + 0x205e41, + 0x200701, + 0x2004c1, + 0x200d01, + 0x200581, + 0x2003c1, + 0x201b81, + 0x201301, + 0x200401, + 0x200741, + 0x2007c1, + 0x200081, + 0x202b81, + 0x201fc1, + 0x20a781, + 0x202cc1, + 0x201241, + 0x208e03, + 0x231103, + 0x213ec3, + 0x21d283, + 0x259003, + 0x208e02, + 0x208e03, + 0x231103, + 0x2003c2, + 0x259003, + 0xeb207, + 0x7a6c7, + 0x35d46, + 0x3968a, + 0x89c48, + 0x57fc8, + 0x58487, + 0x1b8006, + 0xe1f05, + 0x129cc5, + 0xc8346, + 0x3f5c6, + 0x2879c4, + 0x274347, + 0x120648, + 0x2dd584, + 0x208e03, + 0x231103, + 0x213ec3, + 0x21d283, + 0x259003, + 0x32b288, + 0x38c384, + 0x231044, + 0x267c44, + 0x281b47, + 0x2d8c47, + 0x208e03, + 0x233e8b, + 0x38d0ca, + 0x36b947, + 0x23cd48, + 0x389108, + 0x231103, + 0x328847, + 0x3d0943, + 0x3ca0c8, + 0x203589, + 0x220a04, + 0x217383, + 0x2d28c8, + 0x270203, + 0x2d690a, + 0x2dc186, + 0x3abbc7, + 0x21d283, + 0x214b86, + 0x30fa08, + 0x259003, + 0x2c8486, + 0x2edf0d, + 0x2eed88, + 0x2f660b, + 0x255e86, + 0x325847, + 0x221ac5, + 0x38cb0a, + 0x21e905, + 0x24ab0a, + 0x22a342, + 0x202043, + 0x240bc4, + 0x200006, + 0x3b2083, + 0x320543, + 0x25c183, + 0x2bb483, + 0x38cd43, + 0x201902, + 0x2d22c5, + 0x2a71c9, + 0x241543, + 0x2038c3, + 0x2063c3, + 0x200201, + 0x2cfb87, + 0x2e2a45, + 0x38f243, + 0x203283, + 0x267c44, + 0x328cc3, + 0x21d788, + 0x361a43, + 0x3038cd, + 0x27b4c8, + 0x3ca6c6, + 0x32ee83, + 0x37f683, + 0x3a1a83, + 0xb608e03, + 0x230948, + 0x233e84, + 0x2424c3, + 0x200106, + 0x2461c8, + 0x20cd83, + 0x38cb43, + 0x22e0c3, + 0x231103, + 0x227a43, + 0x228a83, + 0x267f43, + 0x32ee03, + 0x223dc3, + 0x2353c3, + 0x383085, + 0x252684, + 0x2536c7, + 0x22ec42, + 0x257c43, + 0x259e86, + 0x25ca83, + 0x25d603, + 0x278d83, + 0x203103, + 0x394943, + 0x2957c7, + 0xba13ec3, + 0x245dc3, + 0x207003, + 0x203583, + 0x2171c3, + 0x2f4d43, + 0x3637c5, + 0x36af03, + 0x24b209, + 0x215403, + 0x306203, + 0xbe4b883, + 0x2a9003, + 0x222b88, + 0x2a7106, + 0x3b8686, + 0x29af86, + 0x37ff87, + 0x20a383, + 0x208e83, + 0x270203, + 0x289d46, + 0x227382, + 0x2a4003, + 0x339905, + 0x21d283, + 0x25e7c7, + 0x1614b83, + 0x23a703, + 0x231f43, + 0x229083, + 0x259003, + 0x21f786, + 0x36be86, + 0x371c43, + 0x225f03, + 0x216203, + 0x25c8c3, + 0x30a943, + 0x2fa003, + 0x2fba43, + 0x20f045, + 0x202203, + 0x28bd46, + 0x236e48, + 0x228dc3, + 0x326609, + 0x2d6048, + 0x222e48, + 0x267dc5, + 0x23064a, + 0x239c0a, + 0x23b8cb, + 0x23c908, + 0x3bb1c3, + 0x2fba83, + 0x34bb83, + 0x3487c8, + 0x3b7a43, + 0x388544, + 0x260983, + 0x2007c3, + 0x227343, + 0x2603c3, + 0x2323c3, + 0x22a342, + 0x226f83, + 0x2379c3, + 0x30ccc3, + 0x30dc84, + 0x240bc4, + 0x21d643, + 0x120648, + 0x2000c2, + 0x204342, + 0x201902, + 0x201b42, + 0x200202, + 0x203982, + 0x232782, + 0x202bc2, + 0x200382, + 0x202d82, + 0x20e8c2, + 0x202382, + 0x26cac2, + 0x20a282, + 0x2d3a42, + 0x209302, + 0x203042, + 0x203b02, + 0x20a582, + 0x204582, + 0x200682, + 0x216b42, + 0x201a42, + 0x211302, + 0x201002, + 0x212142, + 0x2019c2, + 0xc2, + 0x4342, + 0x1902, + 0x1b42, + 0x202, + 0x3982, + 0x32782, + 0x2bc2, + 0x382, + 0x2d82, + 0xe8c2, + 0x2382, + 0x6cac2, + 0xa282, + 0xd3a42, + 0x9302, + 0x3042, + 0x3b02, + 0xa582, + 0x4582, + 0x682, + 0x16b42, + 0x1a42, + 0x11302, + 0x1002, + 0x12142, + 0x19c2, + 0x208e03, + 0x231103, + 0x213ec3, + 0x21d283, + 0x259003, + 0x2042, + 0x208e03, + 0x231103, + 0x213ec3, + 0x21d283, + 0x259003, + 0x208e02, + 0x259003, + 0xd208e03, + 0x213ec3, + 0x270203, + 0xe6143, + 0x22c942, + 0x120648, + 0x208e03, + 0x231103, + 0x213ec3, + 0x21d283, + 0xe6143, + 0x259003, + 0x1242, + 0x2001c2, + 0x15c5805, + 0x20ed42, + 0x120648, + 0x8e02, + 0x232cc2, + 0x207042, + 0x239382, + 0x217202, + 0x23bbc2, + 0x129cc5, + 0x20ce82, + 0x200ec2, + 0x20b142, + 0x205d02, + 0x209302, + 0x3a3282, + 0x211782, + 0x258ec2, + 0xeb207, + 0xbe4cd, + 0xe1f89, + 0xaa60b, + 0xe5148, + 0x73e89, + 0x106c86, + 0x213ec3, + 0x120648, + 0x192544, + 0x191503, + 0x192e05, + 0x120648, + 0xdfe07, + 0x59086, + 0x192e49, + 0x1580e, + 0x18307, + 0x2000c2, + 0x2879c4, + 0x208e02, + 0x208e03, + 0x202142, + 0x231103, + 0x200382, + 0x2dd584, + 0x217383, + 0x24eb42, + 0x21d283, + 0x2003c2, + 0x259003, + 0x3adc46, + 0x32fe8f, + 0x601fc3, + 0x120648, + 0x208e02, + 0x3d0943, + 0x213ec3, + 0x270203, + 0x14b83, + 0x15808, + 0x158c8cb, + 0x1419dca, + 0x14730c7, + 0x7cd0b, + 0xeb0c5, + 0xf8945, + 0xeb207, + 0x208e02, + 0x208e03, + 0x213ec3, + 0x21d283, + 0x2000c2, + 0x204bc2, + 0x206602, + 0x10a08e03, + 0x240042, + 0x231103, + 0x221e82, + 0x223642, + 0x213ec3, + 0x259a02, + 0x274082, + 0x2a89c2, + 0x205002, + 0x28eb02, + 0x200802, + 0x203482, + 0x201742, + 0x27c042, + 0x239442, + 0x2aed82, + 0x2c7c82, + 0x217502, + 0x249a82, + 0x270203, + 0x201942, + 0x21d283, + 0x214002, + 0x28a042, + 0x259003, + 0x2415c2, + 0x211302, + 0x216102, + 0x201702, + 0x214742, + 0x2e6a02, + 0x20a682, + 0x25a902, + 0x21ccc2, + 0x31de8a, + 0x3612ca, + 0x39d78a, + 0x3d2d82, + 0x226b82, + 0x363782, + 0x10f24a09, + 0x1134238a, + 0x142c347, + 0x11600982, + 0x140d983, + 0x1a82, + 0x14238a, + 0x245a04, + 0x11e08e03, + 0x231103, + 0x24ea84, + 0x213ec3, + 0x220a04, + 0x217383, + 0x270203, + 0xe6344, + 0x193803, + 0x21d283, + 0x1caa45, + 0x214b83, + 0x259003, + 0x1522584, + 0x202203, + 0x202043, + 0x120648, + 0x1f06, + 0x15b7f84, + 0x1291c5, + 0x180ca, + 0x12ad02, + 0x1aa546, + 0x7a91, + 0x12724a09, + 0x129248, + 0x7a888, + 0xfb547, + 0x2842, + 0xf894b, + 0x187e4b, + 0x180e8a, + 0x5b0a, + 0x67c47, + 0x120648, + 0x115888, + 0xb447, + 0x1901670b, + 0x18dc7, + 0x20c2, + 0x3dbc7, + 0x134c0a, + 0x5b58f, + 0xfd0cf, + 0x142382, + 0x8e02, + 0xa3c08, + 0xf190a, + 0xdf90a, + 0x1a158a, + 0x7b2c8, + 0x1f488, + 0x5e088, + 0xdfdc8, + 0x18e248, + 0x8a42, + 0x1c588f, + 0x9ea8b, + 0x886c8, + 0x32fc7, + 0x13278a, + 0x56a8b, + 0x7c349, + 0x132687, + 0x1f388, + 0x39dcc, + 0x1118c7, + 0x17084a, + 0x667c8, + 0xfdfce, + 0x35d4e, + 0x67a8b, + 0xafd8b, + 0xe924b, + 0xeccc9, + 0x11b18b, + 0x11ee8d, + 0x135ecb, + 0x3bccd, + 0x3c04d, + 0x3f40a, + 0x40a0b, + 0x454cb, + 0x179785, + 0x194246d0, + 0xf5cf, + 0x112a4f, + 0x1754cd, + 0xbbd50, + 0x5642, + 0x19a26388, + 0x7a548, + 0x116a8e, + 0x19f61a05, + 0x4e2cb, + 0x13aad0, + 0x552c8, + 0x1f58a, + 0xaff49, + 0x65487, + 0x657c7, + 0x65987, + 0x65d07, + 0x66b07, + 0x67107, + 0x68347, + 0x68607, + 0x68ec7, + 0x691c7, + 0x69887, + 0x69a47, + 0x69c07, + 0x69dc7, + 0x6a0c7, + 0x6a487, + 0x6ad47, + 0x6b8c7, + 0x6be87, + 0x6c147, + 0x6c307, + 0x6c607, + 0x6c987, + 0x6cb87, + 0x6e147, + 0x6e307, + 0x6e4c7, + 0x6ed47, + 0x6f247, + 0x6f887, + 0x70547, + 0x70807, + 0x70d07, + 0x70ec7, + 0x712c7, + 0x71dc7, + 0x72287, + 0x72687, + 0x72847, + 0x72a07, + 0x73587, + 0x75d07, + 0x76247, + 0x76807, + 0x769c7, + 0x76d47, + 0x772c7, + 0xafc2, + 0x5e18a, + 0xe6487, + 0x18de45, + 0xabd51, + 0xe906, + 0x1147ca, + 0xa3a8a, + 0x59086, + 0xcd78b, + 0x642, + 0x2d811, + 0xc3e09, + 0x94b49, + 0x1742, + 0x7154a, + 0xa66c9, + 0xa6e0f, + 0xa740e, + 0xa80c8, + 0x55402, + 0x1b84c9, + 0x19cd4e, + 0x10470c, + 0xe814f, + 0x1b27ce, + 0x29b8c, + 0x11eb09, + 0x15a1d1, + 0x15a788, + 0x3a1d2, + 0x4378d, + 0x4738d, + 0x49e4b, + 0x5be15, + 0x6b109, + 0x6f60a, + 0x71f49, + 0x7aa50, + 0x80ecb, + 0x16820f, + 0x1c0b0b, + 0x9140c, + 0x99c10, + 0xa15ca, + 0xa3ecd, + 0xa5ace, + 0xaa2ca, + 0xac90c, + 0xb7cd4, + 0xc3a91, + 0x1bd4cb, + 0x1513cf, + 0x1a4dcd, + 0x11fcce, + 0xb518c, + 0xb658c, + 0xb79cb, + 0xb850e, + 0xbf490, + 0xbfe0b, + 0xc34cd, + 0xc448f, + 0xc500c, + 0xc5b8e, + 0x1165d1, + 0x164d4c, + 0xd1e87, + 0xd504d, + 0xdaf4c, + 0xdc8d0, + 0xe7b4d, + 0xf9d07, + 0xff650, + 0x105488, + 0x133dcb, + 0x16ec4f, + 0x1656c8, + 0x1149cd, + 0x199e10, + 0xfcfc9, + 0x1a2b1fc6, + 0xb2f03, + 0xb8945, + 0x6f42, + 0x132c09, + 0x73a0a, + 0x1a63ddc4, + 0x10dcc6, + 0x1ba0a, + 0x1a927c89, + 0x92203, + 0x14d10a, + 0xdd811, + 0xddc49, + 0xdf887, + 0xe0607, + 0xe6548, + 0x7c0b, + 0x12d0c9, + 0xe6cd0, + 0xe718c, + 0xe8608, + 0xe8c85, + 0xca008, + 0x1b9e4a, + 0x154247, + 0x12dd47, + 0x1c02, + 0x13b7ca, + 0x112d89, + 0x70bc5, + 0x5e64a, + 0x1cd44f, + 0x13f00b, + 0x16388c, + 0x67e92, + 0x9d585, + 0xea348, + 0xd634a, + 0x1aef3f45, + 0x16348c, + 0x138043, + 0x1a3282, + 0xfbd8a, + 0x14fc10c, + 0x111c48, + 0x3be88, + 0x13f287, + 0x8782, + 0x3c42, + 0x51590, + 0x78107, + 0x2ce4f, + 0xc8346, + 0xcece, + 0x15554b, + 0x49148, + 0x7c709, + 0x1920d2, + 0x10b3cd, + 0x10b908, + 0xaa4c9, + 0xd848d, + 0x150909, + 0x19b3cb, + 0x9c48, + 0x85d88, + 0x87588, + 0x8aac9, + 0x8acca, + 0x8f64c, + 0xf708a, + 0x10a987, + 0x15abcd, + 0xfeacb, + 0x12b70c, + 0x30488, + 0x47f89, + 0x1aa750, + 0x67c2, + 0x7ec4d, + 0x3642, + 0x1a642, + 0x10a8ca, + 0x1146ca, + 0x115c0b, + 0x4568c, + 0x11518a, + 0x11560e, + 0xa8cd, + 0x1b1d2ac5, + 0x12f108, + 0x1242, + 0x12b959ce, + 0x13201b4e, + 0x13b8e6ca, + 0x14328e8e, + 0x14b911ce, + 0x1536cbcc, + 0x142c347, + 0x142c349, + 0x140d983, + 0x15b3f70c, + 0x16205649, + 0x16a07409, + 0x17217ec9, + 0x1a82, + 0x195911, + 0x1a91, + 0x18e60d, + 0x128dd1, + 0x191111, + 0x16cb0f, + 0x13f64f, + 0x14c68c, + 0x734c, + 0x17e0c, + 0x5790d, + 0x757d5, + 0xd458c, + 0x15d88c, + 0x170c10, + 0x17bccc, + 0x1c4b8c, + 0x1c6359, + 0x1d0ad9, + 0x1d2499, + 0x5394, + 0xb5d4, + 0xc054, + 0xc5d4, + 0xd214, + 0x17a0b889, + 0x1800c309, + 0x18b5d949, + 0x12f5a989, + 0x1a82, + 0x1375a989, + 0x1a82, + 0x538a, + 0x1a82, + 0x13f5a989, + 0x1a82, + 0x538a, + 0x1a82, + 0x1475a989, + 0x1a82, + 0x14f5a989, + 0x1a82, + 0x1575a989, + 0x1a82, + 0x538a, + 0x1a82, + 0x15f5a989, + 0x1a82, + 0x538a, + 0x1a82, + 0x1675a989, + 0x1a82, + 0x16f5a989, + 0x1a82, + 0x538a, + 0x1a82, + 0x1775a989, + 0x1a82, + 0x538a, + 0x1a82, + 0x17f5a989, + 0x1a82, + 0x1875a989, + 0x1a82, + 0x18f5a989, + 0x1a82, + 0x538a, + 0x1a82, + 0x7a85, + 0x180e84, + 0x1959ce, + 0x1b4e, + 0x1bdce, + 0x18e6ca, + 0x128e8e, + 0x1911ce, + 0x16cbcc, + 0x13f70c, + 0x5649, + 0x7409, + 0x17ec9, + 0xb889, + 0xc309, + 0x15d949, + 0x759cd, + 0xc889, + 0xd4c9, + 0x94644, + 0xf9284, + 0x12f2c4, + 0x131fc4, + 0x7cfc4, + 0x12e984, + 0x42f84, + 0x4e044, + 0xfb544, + 0x1596a83, + 0xa203, + 0x5642, + 0xa8c3, + 0xe402, + 0xe408, + 0x12d147, + 0x8a42, + 0x2000c2, + 0x208e02, + 0x202142, + 0x217242, + 0x200382, + 0x2003c2, + 0x203c42, + 0x208e03, + 0x231103, + 0x213ec3, + 0x2171c3, + 0x21d283, + 0x259003, + 0x120648, + 0x208e03, + 0x231103, + 0x21d283, + 0x259003, + 0xec43, + 0x213ec3, + 0x20a04, + 0x2000c2, + 0x38d8c3, + 0x1d608e03, + 0x23d907, + 0x213ec3, + 0x221303, + 0x2bf144, + 0x21d283, + 0x259003, + 0x23628a, + 0x3adc45, + 0x216203, + 0x2022c2, + 0x120648, + 0x120648, + 0x8e02, + 0x134882, + 0x1df27a0b, + 0x1e21a184, + 0x3dd05, + 0x7d85, + 0xfc646, + 0x1e607d85, + 0x548c3, + 0x19a1c3, + 0x192544, + 0x191503, + 0x192e05, + 0xf8945, + 0x120648, + 0x18dc7, + 0x8e03, + 0x1ee394c7, + 0x18bc46, + 0x1f18e505, + 0x18bd07, + 0x1fd8a, + 0x1e208, + 0x1fc87, + 0x7d988, + 0xdc487, + 0xfad8f, + 0x464c7, + 0x4de46, + 0x13aad0, + 0x138b0f, + 0x6d409, + 0x10dd44, + 0x1f58bdce, + 0x6d94c, + 0x56c8a, + 0x7c4c7, + 0xe590a, + 0x190b09, + 0x1a3f8c, + 0xc254a, + 0x5988a, + 0x192e49, + 0x10dcc6, + 0x7c58a, + 0x10bf0a, + 0x9a70a, + 0x14f909, + 0xdd148, + 0xdd3c6, + 0xe34cd, + 0xb8dc5, + 0x1fb76e0c, + 0x18307, + 0x102f09, + 0x1228c7, + 0xb1794, + 0x10588b, + 0x8850a, + 0x191f4a, + 0xa428d, + 0x1515e09, + 0x10b18c, + 0x10b70b, + 0x35d43, + 0x35d43, + 0x35d46, + 0x35d43, + 0xfc648, + 0xbb1c9, + 0x18d8c3, + 0x120648, + 0x8e02, + 0x4ea84, + 0x5a483, + 0xfc845, + 0x208e03, + 0x231103, + 0x213ec3, + 0x21d283, + 0x259003, + 0x2038c3, + 0x208e03, + 0x231103, + 0x3d0943, + 0x213ec3, + 0x270203, + 0x21d283, + 0x259003, + 0x294d03, + 0x202043, + 0x2038c3, + 0x2879c4, + 0x208e03, + 0x231103, + 0x213ec3, + 0x21d283, + 0x259003, + 0x22f583, + 0x208e03, + 0x231103, + 0x217243, + 0x3d0943, + 0x213ec3, + 0x220a04, + 0x307c83, + 0x208e83, + 0x270203, + 0x21d283, + 0x259003, + 0x216203, + 0x209283, + 0x21a08e03, + 0x231103, + 0x24a783, + 0x213ec3, + 0x2230c3, + 0x208e83, + 0x259003, + 0x203b03, + 0x35c4c4, + 0x120648, + 0x22208e03, + 0x231103, + 0x2a8183, + 0x213ec3, + 0x270203, + 0x2bf144, + 0x21d283, + 0x259003, + 0x214d03, + 0x120648, + 0x22a08e03, + 0x231103, + 0x3d0943, + 0x214b83, + 0x259003, + 0x120648, + 0x142c347, + 0x38d8c3, + 0x208e03, + 0x231103, + 0x213ec3, + 0x220a04, + 0x2bf144, + 0x21d283, + 0x259003, + 0xf8945, + 0xeb207, + 0xb19cb, + 0xde044, + 0xb8dc5, + 0x1582ac8, + 0xa87cd, + 0x23e4e545, + 0x9fec4, + 0x11243, + 0xfcec5, + 0x36b845, + 0x120648, + 0x1b002, + 0x40c03, + 0xf9646, + 0x32be08, + 0x3a6e47, + 0x2879c4, + 0x33ed46, + 0x34c546, + 0x120648, + 0x31cd83, + 0x312449, + 0x347a95, + 0x147a9f, + 0x208e03, + 0x2d4152, + 0x168dc6, + 0x1776c5, + 0x1f58a, + 0xaff49, + 0x2d3f0f, + 0x2dd584, + 0x238f45, + 0x305fd0, + 0x381607, + 0x214b83, + 0x23a708, + 0x15eb46, + 0x29ed0a, + 0x202584, + 0x2f3983, + 0x3adc46, + 0x2022c2, + 0x23ef4b, + 0x14b83, + 0x1842c4, + 0x208e03, + 0x231103, + 0x213ec3, + 0x270203, + 0x21d283, + 0x14b83, + 0x259003, + 0x2fa443, + 0x208e02, + 0xf0183, + 0x21d283, + 0x259003, + 0x208e03, + 0x231103, + 0x213ec3, + 0x270203, + 0x259003, + 0x208e03, + 0x231103, + 0x213ec3, + 0x221303, + 0x235843, + 0x259003, + 0x208e02, + 0x208e03, + 0x231103, + 0x21d283, + 0x14b83, + 0x259003, + 0x2000c2, + 0x208e03, + 0x231103, + 0x213ec3, + 0x21d283, + 0x259003, + 0x7d85, + 0x2879c4, + 0x208e03, + 0x231103, + 0x20ac44, + 0x21d283, + 0x259003, + 0x120648, + 0x208e03, + 0x231103, + 0x213ec3, + 0x21d283, + 0xe6143, + 0x259003, + 0x208e03, + 0x231103, + 0x3d0943, + 0x203583, + 0x270203, + 0x21d283, + 0x14b83, + 0x259003, + 0x208e03, + 0x231103, + 0x213ec3, + 0x38d604, + 0x220a04, + 0x21d283, + 0x259003, + 0x202043, + 0x208e02, + 0x208e03, + 0x231103, + 0x213ec3, + 0x21d283, + 0xe6143, + 0x259003, + 0x120648, + 0x208e03, + 0x231103, + 0x213ec3, + 0x2bd9c3, + 0x69f03, + 0x21303, + 0x21d283, + 0x259003, + 0x31de8a, + 0x340ac9, + 0x357f8b, + 0x3586ca, + 0x3612ca, + 0x36fc4b, + 0x383a0a, + 0x3977ca, + 0x39d78a, + 0x39da0b, + 0x3b9b89, + 0x3bfe4a, + 0x3c028b, + 0x3cb70b, + 0x3d16ca, + 0x208e03, + 0x231103, + 0x3d0943, + 0x270203, + 0x21d283, + 0x14b83, + 0x259003, + 0x1c5b0b, + 0x5f0c8, + 0xd85c4, + 0x7d46, + 0x3f6c9, + 0x120648, + 0x208e03, + 0x265484, + 0x221602, + 0x2bf144, + 0x393345, + 0x2038c3, + 0x2879c4, + 0x208e03, + 0x233e84, + 0x231103, + 0x24ea84, + 0x2dd584, + 0x220a04, + 0x208e83, + 0x21d283, + 0x259003, + 0x27ee05, + 0x22f583, + 0x216203, + 0x294003, + 0x26fdc4, + 0x201e84, + 0x2bb485, + 0x120648, + 0x326cc4, + 0x32e046, + 0x279b44, + 0x208e02, + 0x248947, + 0x250fc7, + 0x24ba04, + 0x25afc5, + 0x2e7d45, + 0x22bec5, + 0x220a04, + 0x380048, + 0x233506, + 0x31be48, + 0x27c085, + 0x2e4345, + 0x397244, + 0x259003, + 0x2f5544, + 0x36e886, + 0x3add43, + 0x26fdc4, + 0x24ac05, + 0x332b84, + 0x24f244, + 0x2022c2, + 0x230206, + 0x3afbc6, + 0x308e05, + 0x2000c2, + 0x38d8c3, + 0x2ae08e02, + 0x226504, + 0x200382, + 0x270203, + 0x207c02, + 0x21d283, + 0x2003c2, + 0x211303, + 0x202043, + 0xa8a04, + 0x120648, + 0x120648, + 0x213ec3, + 0xe6143, + 0x2000c2, + 0x2ba08e02, + 0x213ec3, + 0x269b83, + 0x307c83, + 0x21a184, + 0x21d283, + 0x259003, + 0x120648, + 0x2000c2, + 0x2c208e02, + 0x208e03, + 0x21d283, + 0x14b83, + 0x259003, + 0x682, + 0x202442, + 0x22a342, + 0x221303, + 0x2ec903, + 0x2000c2, + 0xf8945, + 0x120648, + 0xeb207, + 0x208e02, + 0x231103, + 0x24ea84, + 0x204a03, + 0x213ec3, + 0x203583, + 0x270203, + 0x21d283, + 0x213443, + 0x259003, + 0x214c83, + 0x93f53, + 0xd3a94, + 0xf8945, + 0xeb207, + 0x103806, + 0x73c0b, + 0x35d46, + 0x57e07, + 0x5afc6, + 0x649, + 0xb330a, + 0x89b0d, + 0xbe1cc, + 0x10c88a, + 0xf3088, + 0x129cc5, + 0x1fdc8, + 0xc8346, + 0x6fa06, + 0x3f5c6, + 0x205642, + 0x3184, + 0x823ce, + 0x5668c, + 0xf8945, + 0x181047, + 0x20dd1, + 0xfb3ca, + 0x208e03, + 0x7d905, + 0x179b48, + 0x26744, + 0x2d4240c6, + 0xabd46, + 0xd9506, + 0x8edca, + 0x18f283, + 0x2da44684, + 0x605, + 0xecc43, + 0x2de32587, + 0x1caa45, + 0xcd84c, + 0xf7f48, + 0x9d1cb, + 0x2e24aecc, + 0x14111c3, + 0xb9948, + 0x9e909, + 0x4f408, + 0x141b946, + 0x2e774c09, + 0x130d47, + 0xeb0ca, + 0xe1c8, + 0xfc648, + 0xfb544, + 0x15d405, + 0x9d307, + 0x2ea9d303, + 0x2ef9e406, + 0x2f2f5dc4, + 0x2f6fbf47, + 0xfc644, + 0xfc644, + 0xfc644, + 0xfc644, + 0x208e03, + 0x231103, + 0x213ec3, + 0x270203, + 0x21d283, + 0x259003, + 0x2000c2, + 0x208e02, + 0x213ec3, + 0x200d42, + 0x21d283, + 0x259003, + 0x211303, + 0x377f4f, + 0x37830e, + 0x120648, + 0x208e03, + 0x46007, + 0x231103, + 0x213ec3, + 0x217383, + 0x21d283, + 0x259003, + 0x18e904, + 0x191644, + 0x194cc4, + 0x21aec3, + 0x393f47, + 0x200a82, + 0x2c96c9, + 0x204342, + 0x25188b, + 0x2a1bca, + 0x2ac389, + 0x200542, + 0x326746, + 0x23ac15, + 0x2519d5, + 0x23fa13, + 0x251f53, + 0x21cec2, + 0x21cec5, + 0x3253cc, + 0x275f8b, + 0x3c2645, + 0x201b42, + 0x323bc2, + 0x386246, + 0x202842, + 0x260bc6, + 0x21f80d, + 0x3ca7cc, + 0x224744, + 0x200882, + 0x205042, + 0x23a588, + 0x200202, + 0x2231c6, + 0x33394f, + 0x2231d0, + 0x2f0c04, + 0x23add5, + 0x23fb93, + 0x20d8c3, + 0x32408a, + 0x214a47, + 0x34be89, + 0x2e5687, + 0x320f02, + 0x200282, + 0x3b4b46, + 0x207f42, + 0x120648, + 0x20d702, + 0x20a842, + 0x225387, + 0x331bc7, + 0x331bd1, + 0x2184c5, + 0x339b4e, + 0x2184cf, + 0x2020c2, + 0x214c47, + 0x21b508, + 0x2054c2, + 0x2c25c2, + 0x325a46, + 0x33cb0f, + 0x325a50, + 0x229fc2, + 0x200f82, + 0x236cc8, + 0x208f83, + 0x25a648, + 0x208f8d, + 0x231783, + 0x3131c8, + 0x23178f, + 0x231b4e, + 0x391c0a, + 0x2ed251, + 0x2ed6d0, + 0x2de80d, + 0x2deb4c, + 0x200f87, + 0x324207, + 0x33ee09, + 0x224842, + 0x203982, + 0x33fb0c, + 0x34000b, + 0x206a82, + 0x2b7b86, + 0x214d42, + 0x200482, + 0x342382, + 0x208e02, + 0x22b904, + 0x2380c7, + 0x22a502, + 0x241007, + 0x242d87, + 0x22d182, + 0x202282, + 0x245ec5, + 0x218982, + 0x37ae0e, + 0x2a454d, + 0x231103, + 0x28684e, + 0x3bcf4d, + 0x3257c3, + 0x2017c2, + 0x2852c4, + 0x2327c2, + 0x20ce02, + 0x3a0845, + 0x3a2507, + 0x249b02, + 0x217242, + 0x24e687, + 0x252f08, + 0x22ec42, + 0x29d606, + 0x34e50c, + 0x34ea0b, + 0x201482, + 0x26178f, + 0x261b50, + 0x261f4f, + 0x262315, + 0x262854, + 0x262d4e, + 0x2630ce, + 0x26344f, + 0x26380e, + 0x263b94, + 0x264093, + 0x26454d, + 0x277489, + 0x28b5c3, + 0x2028c2, + 0x219805, + 0x204a06, + 0x200382, + 0x373947, + 0x213ec3, + 0x200642, + 0x22f948, + 0x2ed491, + 0x2ed8d0, + 0x202ec2, + 0x281e87, + 0x200b02, + 0x2044c7, + 0x206f42, + 0x212089, + 0x386207, + 0x2a3008, + 0x223f06, + 0x2ec803, + 0x325e05, + 0x231382, + 0x2004c2, + 0x3b4f45, + 0x256405, + 0x204382, + 0x21db43, + 0x38c207, + 0x220c07, + 0x205c82, + 0x333084, + 0x221403, + 0x31bfc9, + 0x2fac08, + 0x204c82, + 0x20bb02, + 0x375987, + 0x396f85, + 0x2bc5c8, + 0x322d07, + 0x202d83, + 0x28dc06, + 0x2de68d, + 0x2dea0c, + 0x2ffe46, + 0x207042, + 0x29d082, + 0x202302, + 0x23160f, + 0x231a0e, + 0x2e7dc7, + 0x200d02, + 0x357285, + 0x357286, + 0x226942, + 0x201942, + 0x28c606, + 0x204403, + 0x204406, + 0x2cc0c5, + 0x2cc0cd, + 0x2cc695, + 0x2cd24c, + 0x2cdb4d, + 0x2cdf12, + 0x202382, + 0x26cac2, + 0x200a42, + 0x222d06, + 0x3045c6, + 0x201c02, + 0x204a86, + 0x20b142, + 0x20b145, + 0x20a002, + 0x2a4649, + 0x22788c, + 0x227bcb, + 0x2003c2, + 0x253ac8, + 0x201982, + 0x20a282, + 0x271006, + 0x35a905, + 0x327e87, + 0x2ecec5, + 0x28ddc5, + 0x207d42, + 0x2042c2, + 0x209302, + 0x2e8447, + 0x31908d, + 0x31940c, + 0x280a87, + 0x225f42, + 0x203042, + 0x233808, + 0x332d88, + 0x2e4bc8, + 0x314984, + 0x2b8787, + 0x23de43, + 0x24df42, + 0x202582, + 0x2f1cc9, + 0x2fe3c7, + 0x203b02, + 0x271405, + 0x23eec2, + 0x22c402, + 0x2c0f43, + 0x2c0f46, + 0x2fa002, + 0x2fb802, + 0x200402, + 0x3c1786, + 0x2af507, + 0x204182, + 0x200902, + 0x25a48f, + 0x28668d, + 0x39d14e, + 0x3bcdcc, + 0x202882, + 0x202e02, + 0x223d45, + 0x31b706, + 0x213242, + 0x204582, + 0x200682, + 0x286a04, + 0x2d2844, + 0x388806, + 0x203c42, + 0x2b0907, + 0x2432c3, + 0x2432c8, + 0x243d88, + 0x249cc7, + 0x254346, + 0x205502, + 0x224403, + 0x224407, + 0x292d06, + 0x2f4605, + 0x314d08, + 0x200b42, + 0x326507, + 0x212142, + 0x374402, + 0x209142, + 0x218649, + 0x20fdc2, + 0x2010c2, + 0x252383, + 0x38b547, + 0x203a42, + 0x227a0c, + 0x227d0b, + 0x2ffec6, + 0x2ecb85, + 0x20fec2, + 0x2019c2, + 0x2bea46, + 0x267343, + 0x307887, + 0x288102, + 0x2008c2, + 0x23aa95, + 0x251b95, + 0x23f8d3, + 0x2520d3, + 0x24bdc7, + 0x3bad11, + 0x3bb450, + 0x266c92, + 0x2763d1, + 0x27fcc8, + 0x27fcd0, + 0x28e68f, + 0x2a1993, + 0x2ac152, + 0x2ad890, + 0x32080f, + 0x3bba52, + 0x3bc491, + 0x334053, + 0x3b9412, + 0x2b210f, + 0x2c1ace, + 0x2c8e52, + 0x2cbc91, + 0x2d71cf, + 0x2da28e, + 0x3bd891, + 0x3be050, + 0x2db912, + 0x2e01d1, + 0x3be650, + 0x3bec4f, + 0x2e0f11, + 0x2e3cd0, + 0x2e98c6, + 0x2f4ec7, + 0x209607, + 0x200c42, + 0x282d05, + 0x377d87, + 0x22a342, + 0x207e42, + 0x226f85, + 0x21c3c3, + 0x3b83c6, + 0x31924d, + 0x31958c, + 0x204b02, + 0x32524b, + 0x275e4a, + 0x21cd8a, + 0x2ba889, + 0x2ef6cb, + 0x322e4d, + 0x30644c, + 0x272f0a, + 0x276ecc, + 0x294fcb, + 0x3c248c, + 0x3c298e, + 0x3c318b, + 0x3c364c, + 0x32aa43, + 0x350806, + 0x3075c2, + 0x2fc542, + 0x211643, + 0x202b82, + 0x205283, + 0x318846, + 0x2624c7, + 0x2aec06, + 0x2f1ac8, + 0x38c088, + 0x310146, + 0x205ec2, + 0x3087cd, + 0x308b0c, + 0x2dd647, + 0x30c6c7, + 0x232f42, + 0x216402, + 0x20fcc2, + 0x2532c2, + 0x333857, + 0x339a56, + 0x33ca17, + 0x33fa14, + 0x33ff13, + 0x34e414, + 0x34e913, + 0x3b7c10, + 0x3bac19, + 0x3bb358, + 0x3bb95a, + 0x3bc399, + 0x3bd799, + 0x3bdf58, + 0x3be558, + 0x3beb57, + 0x3c2394, + 0x3c2896, + 0x3c3093, + 0x3c3554, + 0x208e02, + 0x21d283, + 0x259003, + 0x208e03, + 0x231103, + 0x213ec3, + 0x270203, + 0x2bf144, + 0x21d283, + 0x259003, + 0x211303, + 0x2000c2, + 0x20cd42, + 0x31691185, + 0x31a88ec5, + 0x31fc1446, + 0x120648, + 0x322b2685, + 0x208e02, + 0x202142, + 0x3278df45, + 0x32a80dc5, + 0x32e82047, + 0x33283989, + 0x33753804, + 0x200382, + 0x200642, + 0x33a5d145, + 0x33e96749, + 0x34332508, + 0x346adec5, + 0x34b3a007, + 0x34e78908, + 0x352ea205, + 0x35634e06, + 0x35b74e49, + 0x35ed1448, + 0x362c42c8, + 0x36696d8a, + 0x36a77cc4, + 0x36ea4f45, + 0x372c0808, + 0x37732985, + 0x213542, + 0x37a47c43, + 0x37ea3406, + 0x3835a008, + 0x38710b06, + 0x38b62588, + 0x38f4c406, + 0x39275284, + 0x201402, + 0x39784c47, + 0x39aa9204, + 0x39e7bd87, + 0x3a237007, + 0x2003c2, + 0x3a69b3c5, + 0x3aa4f884, + 0x3aee7807, + 0x3b240607, + 0x3b685106, + 0x3ba81445, + 0x3be96847, + 0x3c2e8908, + 0x3c619b87, + 0x3cab7109, + 0x3cecd585, + 0x3d351247, + 0x3d6907c6, + 0x3dac9d08, + 0x21ea4d, + 0x27e409, + 0x28a08b, + 0x2a68cb, + 0x2b45cb, + 0x30cd4b, + 0x31b90b, + 0x31bbcb, + 0x31c749, + 0x31e10b, + 0x31e3cb, + 0x31f94b, + 0x32128a, + 0x3217ca, + 0x321dcc, + 0x32a48b, + 0x32ab0a, + 0x33d80a, + 0x3448ce, + 0x3454ce, + 0x34584a, + 0x34858a, + 0x34924b, + 0x34950b, + 0x34a18b, + 0x365d0b, + 0x36630a, + 0x366fcb, + 0x36728a, + 0x36750a, + 0x36778a, + 0x3854cb, + 0x39868b, + 0x39a9ce, + 0x39ad4b, + 0x3a26cb, + 0x3a360b, + 0x3a808a, + 0x3a8309, + 0x3a854a, + 0x3aa04a, + 0x3ba60b, + 0x3c054b, + 0x3c0dca, + 0x3c1dcb, + 0x3c7c4b, + 0x3d110b, + 0x3de833c8, + 0x3e289289, + 0x3e69e789, + 0x3eae4708, + 0x34fe85, + 0x20a343, + 0x31a304, + 0x395005, + 0x353546, + 0x234b85, + 0x288944, + 0x373848, + 0x314505, + 0x292404, + 0x2137c7, + 0x29dd0a, + 0x248c0a, + 0x2e7ec7, + 0x21a5c7, + 0x305307, + 0x27dfc7, + 0x3003c5, + 0x205f46, + 0x2b5007, + 0x240c44, + 0x2eeac6, + 0x2ee9c6, + 0x210885, + 0x39e044, + 0x297dc6, + 0x29c407, + 0x31ae06, + 0x384847, + 0x291d03, + 0x3a2ec6, + 0x22b1c5, + 0x282147, + 0x26a64a, + 0x22fa44, + 0x26d188, + 0x2b5e89, + 0x2e4f07, + 0x3460c6, + 0x253d48, + 0x311249, + 0x34c044, + 0x2d61c4, + 0x2a0885, + 0x2bf048, + 0x2ca287, + 0x350f89, + 0x236988, + 0x2e99c6, + 0x3224c6, + 0x298788, + 0x369b06, + 0x288ec5, + 0x2851c6, + 0x27c948, + 0x231506, + 0x25894b, + 0x300f06, + 0x29a00d, + 0x2082c5, + 0x2a90c6, + 0x239105, + 0x255b49, + 0x3a4887, + 0x35cbc8, + 0x365886, + 0x299009, + 0x3878c6, + 0x26a5c5, + 0x24c446, + 0x2c7846, + 0x2cefc9, + 0x38c5c6, + 0x29da07, + 0x241c85, + 0x20a003, + 0x258ac5, + 0x29a2c7, + 0x325686, + 0x2081c9, + 0x3c1446, + 0x26af46, + 0x212e89, + 0x284bc9, + 0x2a1447, + 0x3927c8, + 0x2abb89, + 0x282988, + 0x397a06, + 0x2dcf05, + 0x23870a, + 0x26afc6, + 0x23d786, + 0x2d4a45, + 0x2d0e08, + 0x396b07, + 0x22d60a, + 0x24fb86, + 0x27e845, + 0x38d446, + 0x335687, + 0x345f87, + 0x3651c5, + 0x26a785, + 0x280686, + 0x2a7746, + 0x3a11c6, + 0x2c0cc4, + 0x283f49, + 0x28a346, + 0x2fa1ca, + 0x31a6c8, + 0x34b788, + 0x248c0a, + 0x2224c5, + 0x29c345, + 0x2af6c8, + 0x2b9e88, + 0x232907, + 0x2bf346, + 0x337b88, + 0x2ace47, + 0x282288, + 0x2b83c6, + 0x285948, + 0x295d86, + 0x27c207, + 0x2d5f46, + 0x297dc6, + 0x31d50a, + 0x22b986, + 0x2dcf09, + 0x310246, + 0x2f050a, + 0x275289, + 0x25ba86, + 0x2b93c4, + 0x2198cd, + 0x289507, + 0x2bc346, + 0x2c4185, + 0x387945, + 0x386e46, + 0x2e7649, + 0x2d0987, + 0x27d3c6, + 0x2e2186, + 0x2889c9, + 0x288e04, + 0x249944, + 0x327288, + 0x318c06, + 0x270a08, + 0x2f2dc8, + 0x2a0dc7, + 0x3b6a89, + 0x3a13c7, + 0x2b254a, + 0x2f278f, + 0x3a1b8a, + 0x223b45, + 0x27cb85, + 0x354885, + 0x2f0b47, + 0x2062c3, + 0x3929c8, + 0x2287c6, + 0x2288c9, + 0x302a06, + 0x2d0307, + 0x298dc9, + 0x35cac8, + 0x2d4b07, + 0x316fc3, + 0x34ff05, + 0x3351c5, + 0x2c0b0b, + 0x332a44, + 0x23cb44, + 0x279406, + 0x317187, + 0x39fdca, + 0x247cc7, + 0x209347, + 0x280dc5, + 0x3cc5c5, + 0x271a09, + 0x297dc6, + 0x247b4d, + 0x38c805, + 0x2b5bc3, + 0x215343, + 0x3afe05, + 0x356dc5, + 0x253d48, + 0x27dc87, + 0x2496c6, + 0x29e406, + 0x229185, + 0x2313c7, + 0x274b87, + 0x2333c7, + 0x2a4fca, + 0x3a2f88, + 0x2c0cc4, + 0x27f1c7, + 0x2800c7, + 0x349786, + 0x295407, + 0x2e27c8, + 0x2b34c8, + 0x24cc86, + 0x21a808, + 0x2dab04, + 0x2b5006, + 0x252a06, + 0x3907c6, + 0x239246, + 0x29b784, + 0x27e086, + 0x2c27c6, + 0x298186, + 0x22ec86, + 0x215206, + 0x2e2606, + 0x2495c8, + 0x2b4a88, + 0x2d8908, + 0x234d88, + 0x2af646, + 0x21a3c5, + 0x38ac46, + 0x2adf45, + 0x3a6b87, + 0x236a45, + 0x206443, + 0x203305, + 0x3c8404, + 0x215345, + 0x201983, + 0x34a747, + 0x364b88, + 0x384906, + 0x2b9b0d, + 0x27cb46, + 0x297745, + 0x218643, + 0x2c01c9, + 0x288f86, + 0x293586, + 0x2714c4, + 0x3a1b07, + 0x311746, + 0x2d0c45, + 0x200cc3, + 0x209b04, + 0x280286, + 0x252b04, + 0x2d9dc8, + 0x206789, + 0x3cfd49, + 0x2a068a, + 0x2a244d, + 0x22fdc7, + 0x23d606, + 0x21fec4, + 0x283989, + 0x287008, + 0x289106, + 0x239986, + 0x295407, + 0x2d9286, + 0x2b1346, + 0x36c106, + 0x23708a, + 0x278908, + 0x31ea05, + 0x25e949, + 0x2caa0a, + 0x2fdac8, + 0x29bc08, + 0x293508, + 0x29e04c, + 0x31fbc5, + 0x29e688, + 0x2b4d86, + 0x24c986, + 0x3cde07, + 0x247bc5, + 0x285345, + 0x3cfc09, + 0x21c987, + 0x228885, + 0x2d3647, + 0x215343, + 0x2caec5, + 0x225ac8, + 0x284847, + 0x29bac9, + 0x2ec3c5, + 0x3447c4, + 0x2a2108, + 0x2d2c47, + 0x2d4cc8, + 0x39efc8, + 0x2aa1c5, + 0x2286c6, + 0x29e506, + 0x3a4bc9, + 0x330bc7, + 0x2ae386, + 0x226047, + 0x20a903, + 0x353804, + 0x2dac05, + 0x256a04, + 0x24b184, + 0x283647, + 0x269307, + 0x27d584, + 0x29b910, + 0x38ae47, + 0x3cc5c5, + 0x25110c, + 0x2117c4, + 0x2b90c8, + 0x27c109, + 0x37c646, + 0x24f548, + 0x2190c4, + 0x279708, + 0x22dc06, + 0x31d388, + 0x29a586, + 0x286b4b, + 0x32c585, + 0x2daa88, + 0x206bc4, + 0x206bca, + 0x29bac9, + 0x2d5e46, + 0x354948, + 0x2a3dc5, + 0x206404, + 0x2b8fc6, + 0x233288, + 0x2833c8, + 0x338406, + 0x388784, + 0x238686, + 0x3a1447, + 0x27bc87, + 0x29540f, + 0x203b87, + 0x25bb47, + 0x357145, + 0x364345, + 0x2a1109, + 0x2c8086, + 0x281585, + 0x284ec7, + 0x2c8a48, + 0x2d5305, + 0x2d5f46, + 0x31a508, + 0x310b0a, + 0x20ff08, + 0x28c387, + 0x2f2bc6, + 0x25e906, + 0x2003c3, + 0x213383, + 0x2cabc9, + 0x2aba09, + 0x2b7006, + 0x2ec3c5, + 0x206108, + 0x354948, + 0x369c88, + 0x36c18b, + 0x2b9d47, + 0x30f849, + 0x295688, + 0x355d44, + 0x35cf08, + 0x28e149, + 0x2ae685, + 0x2f0a47, + 0x353885, + 0x2832c8, + 0x29100b, + 0x296590, + 0x2a8b05, + 0x21280c, + 0x249885, + 0x280e43, + 0x2eb506, + 0x2c1e44, + 0x24f986, + 0x29c407, + 0x20ff04, + 0x2440c8, + 0x39288d, + 0x316285, + 0x22fe04, + 0x223884, + 0x29ff09, + 0x2b2a48, + 0x32ca47, + 0x22dc88, + 0x284008, + 0x27d6c5, + 0x27a147, + 0x27d647, + 0x312207, + 0x26a789, + 0x3289c9, + 0x26ea46, + 0x2ded46, + 0x284f86, + 0x344d05, + 0x39dc84, + 0x3c5446, + 0x3c9dc6, + 0x27d708, + 0x33534b, + 0x267287, + 0x21fec4, + 0x311686, + 0x2e2b07, + 0x324545, + 0x381b85, + 0x239bc4, + 0x328946, + 0x3c54c8, + 0x283989, + 0x261286, + 0x286e08, + 0x2d0d06, + 0x3563c8, + 0x2ccdcc, + 0x27d586, + 0x29740d, + 0x29788b, + 0x29dac5, + 0x274cc7, + 0x38c6c6, + 0x345e48, + 0x26eac9, + 0x24cf48, + 0x3cc5c5, + 0x379c87, + 0x282a88, + 0x319b49, + 0x3a78c6, + 0x26118a, + 0x345bc8, + 0x24cd8b, + 0x2d7dcc, + 0x279808, + 0x27f786, + 0x228148, + 0x310787, + 0x203cc9, + 0x33a14d, + 0x297cc6, + 0x206288, + 0x2b4949, + 0x2c0dc8, + 0x285a48, + 0x2c320c, + 0x2c4b87, + 0x2c5647, + 0x26a5c5, + 0x2b7487, + 0x2c8908, + 0x2b9046, + 0x37a38c, + 0x2f73c8, + 0x2d1648, + 0x319e46, + 0x334f47, + 0x26ec44, + 0x234d88, + 0x2b030c, + 0x38d9cc, + 0x223bc5, + 0x210907, + 0x388706, + 0x334ec6, + 0x255d08, + 0x36eb84, + 0x31ae0b, + 0x2b0a4b, + 0x2f2bc6, + 0x392707, + 0x389b05, + 0x270945, + 0x31af46, + 0x2a3d85, + 0x332a05, + 0x2cee07, + 0x281909, + 0x2a7904, + 0x25d645, + 0x30de05, + 0x2d9b48, + 0x2e5d85, + 0x2baf49, + 0x2df507, + 0x2df50b, + 0x319786, + 0x249309, + 0x39df88, + 0x299b05, + 0x312308, + 0x328a08, + 0x26b447, + 0x37a187, + 0x2836c9, + 0x2b49c7, + 0x2a6489, + 0x31c30c, + 0x2b7008, + 0x2d1289, + 0x2d1d07, + 0x2840c9, + 0x200b47, + 0x2d7ec8, + 0x3b6c45, + 0x2b4f86, + 0x2c41c8, + 0x314f88, + 0x2ca8c9, + 0x332a47, + 0x252805, + 0x35afc9, + 0x202d06, + 0x2907c4, + 0x38b686, + 0x359e88, + 0x3ae447, + 0x335548, + 0x21a8c9, + 0x3896c7, + 0x29dec6, + 0x274d84, + 0x203389, + 0x279fc8, + 0x319d07, + 0x372c06, + 0x335286, + 0x23d704, + 0x352786, + 0x2152c3, + 0x32c109, + 0x32c546, + 0x21ab45, + 0x29e406, + 0x2cf385, + 0x282f08, + 0x310647, + 0x39c4c6, + 0x38df86, + 0x34b788, + 0x2a1287, + 0x297d05, + 0x29b708, + 0x3c0948, + 0x345bc8, + 0x249745, + 0x2b5006, + 0x3cfb09, + 0x3a4a44, + 0x2cf20b, + 0x2b104b, + 0x31e909, + 0x215343, + 0x259bc5, + 0x385106, + 0x368f08, + 0x3475c4, + 0x384906, + 0x2a5109, + 0x2e0b45, + 0x2ced46, + 0x2d2c46, + 0x206104, + 0x2a928a, + 0x21aa88, + 0x314f86, + 0x2bd405, + 0x389987, + 0x357007, + 0x2286c4, + 0x2b1287, + 0x236a04, + 0x236a06, + 0x219083, + 0x26a785, + 0x36ef05, + 0x362808, + 0x27f385, + 0x27d2c9, + 0x234bc7, + 0x234bcb, + 0x2a320c, + 0x2a380a, + 0x33a007, + 0x200a03, + 0x27b5c8, + 0x249905, + 0x2d5385, + 0x34ffc4, + 0x2d7dc6, + 0x27c106, + 0x3527c7, + 0x24ed8b, + 0x29b784, + 0x2d2444, + 0x2c92c4, + 0x2ceb06, + 0x20ff04, + 0x2bf148, + 0x34fdc5, + 0x254005, + 0x369bc7, + 0x274dc9, + 0x356dc5, + 0x386e4a, + 0x241b89, + 0x2dcc8a, + 0x2371c9, + 0x36e444, + 0x2e2245, + 0x2d9388, + 0x2e78cb, + 0x2a0885, + 0x2f47c6, + 0x242e44, + 0x27d806, + 0x389549, + 0x2e2c07, + 0x3c1608, + 0x2a27c6, + 0x3a13c7, + 0x2833c8, + 0x3873c6, + 0x3ca004, + 0x378647, + 0x368105, + 0x37a9c7, + 0x218fc4, + 0x38c646, + 0x2e8a88, + 0x297a48, + 0x2f6107, + 0x24a488, + 0x295e45, + 0x215184, + 0x248b08, + 0x24a584, + 0x241985, + 0x3005c4, + 0x2acf47, + 0x28a407, + 0x284208, + 0x2d4e46, + 0x27f305, + 0x27d0c8, + 0x210108, + 0x2a05c9, + 0x2b1346, + 0x22d688, + 0x206a4a, + 0x3245c8, + 0x2ea205, + 0x222386, + 0x241a48, + 0x379d4a, + 0x235207, + 0x287d85, + 0x2909c8, + 0x2af304, + 0x2d0e86, + 0x2c59c8, + 0x215206, + 0x393988, + 0x258c87, + 0x2136c6, + 0x2b93c4, + 0x278307, + 0x2b5544, + 0x389507, + 0x2d5b8d, + 0x232985, + 0x2e744b, + 0x38dc46, + 0x253bc8, + 0x244084, + 0x2f01c6, + 0x280286, + 0x228487, + 0x2970cd, + 0x247207, + 0x2b5b08, + 0x283b45, + 0x257288, + 0x2ca206, + 0x295ec8, + 0x23a086, + 0x38a507, + 0x388bc9, + 0x359b47, + 0x2893c8, + 0x2736c5, + 0x229208, + 0x334e05, + 0x2fe545, + 0x237445, + 0x223e43, + 0x2392c4, + 0x25e945, + 0x374e49, + 0x372b06, + 0x2e28c8, + 0x379f45, + 0x2b7347, + 0x2a0aca, + 0x2cec89, + 0x2c774a, + 0x2d8988, + 0x2d348c, + 0x284f4d, + 0x306983, + 0x393888, + 0x209ac5, + 0x3108c6, + 0x35c946, + 0x355485, + 0x226149, + 0x200985, + 0x27d0c8, + 0x25aa46, + 0x358e46, + 0x2a1fc9, + 0x3ac607, + 0x2912c6, + 0x2a0a48, + 0x3906c8, + 0x2e4907, + 0x2c294e, + 0x2ca445, + 0x319a45, + 0x215108, + 0x2ebd87, + 0x206a02, + 0x2c2d84, + 0x24f88a, + 0x319dc8, + 0x328b46, + 0x298f08, + 0x29e506, + 0x390408, + 0x2ae388, + 0x2fe504, + 0x2b7705, + 0x679b44, + 0x679b44, + 0x679b44, + 0x203c83, + 0x335106, + 0x27d586, + 0x29d78c, + 0x206b03, + 0x218fc6, + 0x24c3c4, + 0x288f08, + 0x2a4f45, + 0x24f986, + 0x2c0908, + 0x2d9fc6, + 0x39c446, + 0x2d2a48, + 0x2dac87, + 0x31d089, + 0x38524a, + 0x219bc4, + 0x236a45, + 0x30f585, + 0x388946, + 0x22fe06, + 0x29cb46, + 0x2ff506, + 0x31d1c4, + 0x31d1cb, + 0x2364c4, + 0x249485, + 0x2ac805, + 0x2a0e86, + 0x208b08, + 0x284e07, + 0x32c4c4, + 0x213c03, + 0x2aee05, + 0x236847, + 0x284d0b, + 0x362707, + 0x2c0808, + 0x2b7847, + 0x26bfc6, + 0x27e6c8, + 0x29cd4b, + 0x394f46, + 0x21ed49, + 0x29cec5, + 0x316fc3, + 0x2ced46, + 0x258b88, + 0x21a943, + 0x236943, + 0x2833c6, + 0x29e506, + 0x36f60a, + 0x27f7c5, + 0x2800cb, + 0x29e34b, + 0x208a03, + 0x21b0c3, + 0x2b24c4, + 0x2a9487, + 0x258c04, + 0x24f544, + 0x2b4c04, + 0x3248c8, + 0x2bd348, + 0x214889, + 0x2cd608, + 0x2376c7, + 0x22ec86, + 0x2e250f, + 0x2ca586, + 0x2d80c4, + 0x2bd18a, + 0x236747, + 0x2b5646, + 0x290809, + 0x214805, + 0x362945, + 0x214946, + 0x229343, + 0x2af349, + 0x278a86, + 0x21a689, + 0x39fdc6, + 0x26a785, + 0x223fc5, + 0x203b83, + 0x2a95c8, + 0x32cc07, + 0x2287c4, + 0x288d88, + 0x24c704, + 0x350606, + 0x2eb506, + 0x240346, + 0x2da949, + 0x2d5305, + 0x297dc6, + 0x24bac9, + 0x2c8606, + 0x2e2606, + 0x3a5fc6, + 0x237605, + 0x3005c6, + 0x38a504, + 0x3b6c45, + 0x2c41c4, + 0x2b6446, + 0x38c7c4, + 0x200c43, + 0x2870c5, + 0x232408, + 0x2afbc7, + 0x347649, + 0x287c88, + 0x298551, + 0x2d2cca, + 0x2f2b07, + 0x2b3806, + 0x24c3c4, + 0x2c42c8, + 0x352908, + 0x29870a, + 0x2bad0d, + 0x24c446, + 0x2d2b46, + 0x2783c6, + 0x365047, + 0x2b5bc5, + 0x326807, + 0x288e45, + 0x2df644, + 0x2a7f46, + 0x352607, + 0x2af04d, + 0x241987, + 0x373748, + 0x27d3c9, + 0x222286, + 0x3a7845, + 0x23e144, + 0x359f86, + 0x2285c6, + 0x319f46, + 0x299788, + 0x227803, + 0x228483, + 0x38b905, + 0x27f446, + 0x2ae345, + 0x2a29c8, + 0x29c5ca, + 0x30ff44, + 0x288f08, + 0x293508, + 0x2a0cc7, + 0x37a009, + 0x2c0508, + 0x283a07, + 0x2b4e86, + 0x21520a, + 0x35a008, + 0x3a46c9, + 0x2b2b08, + 0x2a7b49, + 0x2b36c7, + 0x377205, + 0x36c386, + 0x2b8ec8, + 0x380248, + 0x28ff08, + 0x2f9b48, + 0x249485, + 0x212ec4, + 0x230a48, + 0x242bc4, + 0x236fc4, + 0x26a785, + 0x292447, + 0x274b89, + 0x228287, + 0x206a85, + 0x279606, + 0x362206, + 0x206d44, + 0x2a2306, + 0x27b244, + 0x29f0c6, + 0x274946, + 0x229946, + 0x3cc5c5, + 0x2a2887, + 0x200a03, + 0x224a89, + 0x34b588, + 0x283884, + 0x28388d, + 0x297b48, + 0x2ea6c8, + 0x3a4646, + 0x388cc9, + 0x2cec89, + 0x389245, + 0x29c6ca, + 0x26f3ca, + 0x28a5cc, + 0x28a746, + 0x27afc6, + 0x2cae06, + 0x3a0909, + 0x310b06, + 0x2a12c6, + 0x200a46, + 0x234d88, + 0x20ff06, + 0x2d7a4b, + 0x2925c5, + 0x254005, + 0x27bd85, + 0x327006, + 0x2151c3, + 0x2402c6, + 0x241907, + 0x2c4185, + 0x25cac5, + 0x387945, + 0x3c8a86, + 0x332404, + 0x332406, + 0x2c37c9, + 0x326e8c, + 0x2df388, + 0x233204, + 0x3002c6, + 0x38dd46, + 0x258b88, + 0x354948, + 0x326d89, + 0x389987, + 0x318949, + 0x2486c6, + 0x22a0c4, + 0x20bb44, + 0x2831c4, + 0x2833c8, + 0x2749ca, + 0x356d46, + 0x364207, + 0x37ac47, + 0x249405, + 0x350f04, + 0x28e106, + 0x2b5c06, + 0x240c03, + 0x34b3c7, + 0x39eec8, + 0x38938a, + 0x302008, + 0x362588, + 0x38c805, + 0x29dbc5, + 0x267385, + 0x2497c6, + 0x3777c6, + 0x391ac5, + 0x32c349, + 0x350d0c, + 0x267447, + 0x298788, + 0x272145, + 0x679b44, + 0x2e95c4, + 0x284984, + 0x221706, + 0x29f7ce, + 0x3629c7, + 0x365245, + 0x3a49cc, + 0x3006c7, + 0x352587, + 0x22c109, + 0x26d249, + 0x287d85, + 0x34b588, + 0x3cfb09, + 0x345a85, + 0x2c40c8, + 0x278c06, + 0x248d86, + 0x275284, + 0x28cc08, + 0x222443, + 0x27a7c4, + 0x2aee85, + 0x399c87, + 0x336145, + 0x206909, + 0x2aac4d, + 0x2b3bc6, + 0x213c44, + 0x2bf2c8, + 0x28174a, + 0x26df87, + 0x36ba85, + 0x24d583, + 0x29e50e, + 0x2a96cc, + 0x2fdbc7, + 0x29f987, + 0x219003, + 0x310b45, + 0x284985, + 0x2992c8, + 0x296bc9, + 0x233106, + 0x258c04, + 0x2f2a46, + 0x237c0b, + 0x2de40c, + 0x2d6607, + 0x2d7d05, + 0x3c0848, + 0x2e46c5, + 0x2bd187, + 0x384c47, + 0x241745, + 0x2151c3, + 0x324c04, + 0x359d45, + 0x2a7805, + 0x2a7806, + 0x2bfa48, + 0x352607, + 0x35cc46, + 0x203f46, + 0x237386, + 0x288289, + 0x27a247, + 0x31a206, + 0x2de586, + 0x277bc6, + 0x2a91c5, + 0x2105c6, + 0x3633c5, + 0x2e5e08, + 0x291d4b, + 0x28db06, + 0x37ac84, + 0x2ffc09, + 0x234bc4, + 0x278b88, + 0x38b787, + 0x285944, + 0x2bfc48, + 0x2c5444, + 0x2a9204, + 0x288cc5, + 0x3162c6, + 0x324807, + 0x2087c3, + 0x29df85, + 0x338a84, + 0x319a86, + 0x3892c8, + 0x38d8c5, + 0x291a09, + 0x33a005, + 0x218fc8, + 0x3cf847, + 0x32c648, + 0x2bee87, + 0x25bc09, + 0x27df06, + 0x33da46, + 0x200a44, + 0x2d2385, + 0x30804c, + 0x27bd87, + 0x27ca47, + 0x22fa48, + 0x2b3bc6, + 0x270b44, + 0x3b1bc4, + 0x283549, + 0x2caf06, + 0x271a87, + 0x2391c4, + 0x248346, + 0x35c185, + 0x2d4987, + 0x2d79c6, + 0x261049, + 0x2cfac7, + 0x295407, + 0x2a1e46, + 0x248285, + 0x281408, + 0x278908, + 0x22ee86, + 0x38d905, + 0x329806, + 0x210283, + 0x299149, + 0x29c8ce, + 0x2bebc8, + 0x24c808, + 0x22ec8b, + 0x291c46, + 0x34c404, + 0x284b44, + 0x29c9ca, + 0x212707, + 0x31a2c5, + 0x21ed49, + 0x2c2885, + 0x237007, + 0x24a404, + 0x2a5947, + 0x2f2cc8, + 0x2e4fc6, + 0x24c549, + 0x2c060a, + 0x212686, + 0x297686, + 0x2ac785, + 0x39b305, + 0x33eac7, + 0x247948, + 0x35c0c8, + 0x2fe506, + 0x224045, + 0x22fb8e, + 0x2c0cc4, + 0x22ee05, + 0x278f89, + 0x2c7e88, + 0x28c2c6, + 0x29b20c, + 0x29c1d0, + 0x29f40f, + 0x2a1008, + 0x33a007, + 0x3cc5c5, + 0x25e945, + 0x324689, + 0x290bc9, + 0x238786, + 0x2a0907, + 0x2d2285, + 0x232909, + 0x349806, + 0x31094d, + 0x283089, + 0x24f544, + 0x2be948, + 0x230b09, + 0x356f06, + 0x27b7c5, + 0x33da46, + 0x3c14c9, + 0x279e48, + 0x21a3c5, + 0x206b44, + 0x29b3cb, + 0x356dc5, + 0x29b506, + 0x285286, + 0x2023c6, + 0x2a030b, + 0x291b09, + 0x203e85, + 0x3a6a87, + 0x2d2c46, + 0x24f6c6, + 0x284708, + 0x3163c9, + 0x37350c, + 0x236648, + 0x30f5c6, + 0x338403, + 0x2307c6, + 0x25bac5, + 0x280408, + 0x223a46, + 0x2d4bc8, + 0x247d45, + 0x2988c5, + 0x2576c8, + 0x390587, + 0x35c887, + 0x3527c7, + 0x24f548, + 0x388a48, + 0x2e3046, + 0x2b6287, + 0x3536c7, + 0x2a000a, + 0x23ce43, + 0x327006, + 0x22fb05, + 0x24f884, + 0x27d3c9, + 0x25bb84, + 0x2afc44, + 0x29a604, + 0x29f98b, + 0x32cb47, + 0x22fdc5, + 0x295b48, + 0x279606, + 0x279608, + 0x27f706, + 0x28cb45, + 0x28ce05, + 0x28ec46, + 0x28fcc8, + 0x290748, + 0x27d586, + 0x29598f, + 0x298c10, + 0x2082c5, + 0x200a03, + 0x22a185, + 0x30f788, + 0x290ac9, + 0x345bc8, + 0x24c3c8, + 0x23d1c8, + 0x32cc07, + 0x2792c9, + 0x2d4dc8, + 0x2ab6c4, + 0x29a488, + 0x2d9c09, + 0x2b6d07, + 0x29a404, + 0x228348, + 0x2a264a, + 0x2e61c6, + 0x24c446, + 0x2b1209, + 0x29c407, + 0x2d0188, + 0x2254c8, + 0x2c9b88, + 0x24bf05, + 0x20a005, + 0x254005, + 0x284945, + 0x3bc1c7, + 0x2151c5, + 0x2c4185, + 0x201186, + 0x345b07, + 0x2e7807, + 0x2a2946, + 0x2d8ec5, + 0x29b506, + 0x24c645, + 0x2d2108, + 0x2fda44, + 0x2c8686, + 0x32f004, + 0x206408, + 0x31d94a, + 0x27dc8c, + 0x24ef85, + 0x365106, + 0x3736c6, + 0x294506, + 0x30f644, + 0x35c445, + 0x27f087, + 0x29c489, + 0x2cf0c7, + 0x679b44, + 0x679b44, + 0x32c9c5, + 0x2d6bc4, + 0x29abca, + 0x279486, + 0x27e904, + 0x210885, + 0x398905, + 0x2b5b04, + 0x284ec7, + 0x35b147, + 0x2ceb08, + 0x38b088, + 0x21a3c9, + 0x26f048, + 0x29ad8b, + 0x2db304, + 0x248605, + 0x281605, + 0x352749, + 0x3163c9, + 0x2ffb08, + 0x2364c8, + 0x2a0e84, + 0x38dd85, + 0x20a343, + 0x388905, + 0x297e46, + 0x296a0c, + 0x2390c6, + 0x27b6c6, + 0x28c545, + 0x3c8b08, + 0x3cdf46, + 0x2b3986, + 0x24c446, + 0x301d8c, + 0x31a104, + 0x2374ca, + 0x28c488, + 0x296847, + 0x338986, + 0x2331c7, + 0x2f2645, + 0x372c06, + 0x361046, + 0x36d8c7, + 0x2afc84, + 0x2ad045, + 0x278f84, + 0x2df6c7, + 0x2791c8, + 0x27ae4a, + 0x282907, + 0x21ac07, + 0x339f87, + 0x2e4809, + 0x296a0a, + 0x22a083, + 0x2afb85, + 0x229983, + 0x2b4c49, + 0x38a788, + 0x357147, + 0x345cc9, + 0x278a06, + 0x3b6d08, + 0x34a6c5, + 0x21020a, + 0x392b49, + 0x24cb49, + 0x3cde07, + 0x352a09, + 0x229848, + 0x36da86, + 0x3652c8, + 0x3d0647, + 0x2b49c7, + 0x241b87, + 0x2e8908, + 0x300146, + 0x2a2405, + 0x27f087, + 0x297188, + 0x32ef84, + 0x2fa084, + 0x2911c7, + 0x2ae707, + 0x3cf98a, + 0x36da06, + 0x25708a, + 0x2c2cc7, + 0x2c0a87, + 0x2ad104, + 0x2a6544, + 0x2d4886, + 0x3119c4, + 0x3119cc, + 0x204dc5, + 0x354789, + 0x2b28c4, + 0x2b5bc5, + 0x2816c8, + 0x27eac5, + 0x386e46, + 0x22c004, + 0x2db20a, + 0x330ac6, + 0x29368a, + 0x219b87, + 0x286c45, + 0x229345, + 0x24944a, + 0x28fe45, + 0x2a0686, + 0x242bc4, + 0x2b2646, + 0x33eb85, + 0x223b06, + 0x2f610c, + 0x354aca, + 0x26f4c4, + 0x22ec86, + 0x29c407, + 0x2d7944, + 0x234d88, + 0x2f46c6, + 0x37aac9, + 0x2dc6c9, + 0x2b7109, + 0x2cf3c6, + 0x3d0746, + 0x365407, + 0x32c288, + 0x3d0549, + 0x32cb47, + 0x295cc6, + 0x3a1447, + 0x278285, + 0x2c0cc4, + 0x364fc7, + 0x353885, + 0x288c05, + 0x3280c7, + 0x241608, + 0x3c07c6, + 0x297fcd, + 0x2994cf, + 0x29e34d, + 0x206ac4, + 0x232506, + 0x2db5c8, + 0x200a05, + 0x2a01c8, + 0x26b30a, + 0x24f544, + 0x237e46, + 0x2d8147, + 0x3bd347, + 0x2dad49, + 0x365285, + 0x2b5b04, + 0x2b764a, + 0x2c00c9, + 0x352b07, + 0x298286, + 0x356f06, + 0x38dcc6, + 0x378706, + 0x2da60f, + 0x2db489, + 0x20ff06, + 0x37fe86, + 0x32b949, + 0x2b6387, + 0x208e43, + 0x2375c6, + 0x213383, + 0x355348, + 0x3a1287, + 0x2a1209, + 0x2eb388, + 0x35c9c8, + 0x200c86, + 0x239009, + 0x384d85, + 0x230704, + 0x2f2f47, + 0x3a0985, + 0x206ac4, + 0x22fe88, + 0x2129c4, + 0x2b60c7, + 0x364b06, + 0x280745, + 0x2b2b08, + 0x356dcb, + 0x351247, + 0x2496c6, + 0x2ca604, + 0x34c386, + 0x26a785, + 0x353885, + 0x281189, + 0x284ac9, + 0x2b4a04, + 0x2b4a45, + 0x22ecc5, + 0x210086, + 0x34b688, + 0x2c2246, + 0x39ed0b, + 0x37c4ca, + 0x2bef85, + 0x28ce86, + 0x30fc45, + 0x2010c5, + 0x29bd87, + 0x327288, + 0x26f0c4, + 0x266006, + 0x2907c6, + 0x229a07, + 0x316f84, + 0x280286, + 0x2f0c45, + 0x2f0c49, + 0x3d0944, + 0x351089, + 0x27d586, + 0x2c4c48, + 0x22ecc5, + 0x37ad45, + 0x223b06, + 0x373409, + 0x26d249, + 0x27b746, + 0x2c7f88, + 0x2aad88, + 0x30fc04, + 0x2b81c4, + 0x2b81c8, + 0x2bc448, + 0x318a49, + 0x297dc6, + 0x24c446, + 0x337a4d, + 0x384906, + 0x2ccc89, + 0x38ad45, + 0x214946, + 0x2c9d08, + 0x332345, + 0x353704, + 0x26a785, + 0x284408, + 0x29a989, + 0x279044, + 0x38c646, + 0x27e98a, + 0x2fdac8, + 0x3cfb09, + 0x253eca, + 0x345c46, + 0x299688, + 0x2bcf45, + 0x289e48, + 0x2f26c5, + 0x2788c9, + 0x37cf49, + 0x204ec2, + 0x29cec5, + 0x270686, + 0x27d4c7, + 0x381345, + 0x314e86, + 0x30c4c8, + 0x2b3bc6, + 0x2d9249, + 0x27cb46, + 0x284588, + 0x26d7c5, + 0x22b786, + 0x38a608, + 0x2833c8, + 0x2b35c8, + 0x2e9a48, + 0x2105c4, + 0x228703, + 0x2d9484, + 0x282b06, + 0x2782c4, + 0x24c747, + 0x2b3889, + 0x2c92c5, + 0x2254c6, + 0x2375c6, + 0x2bf88b, + 0x2b5586, + 0x2bc746, + 0x2c8788, + 0x3224c6, + 0x2bb003, + 0x20e383, + 0x2c0cc4, + 0x22d585, + 0x2d0b47, + 0x2791c8, + 0x2791cf, + 0x27ef8b, + 0x34b488, + 0x38c6c6, + 0x34b78e, + 0x223b03, + 0x2d0ac4, + 0x2b5505, + 0x2b5986, + 0x28e20b, + 0x292506, + 0x31a589, + 0x280745, + 0x254448, + 0x217008, + 0x26d10c, + 0x29f9c6, + 0x388946, + 0x2ec3c5, + 0x289188, + 0x27dc85, + 0x355d48, + 0x29b58a, + 0x29e789, + 0x679b44, + 0x2000c2, + 0x3f208e02, + 0x200382, + 0x220a04, + 0x202302, + 0x20ac44, + 0x201402, + 0x14b83, + 0x2003c2, + 0x211302, + 0x120648, + 0x208e03, + 0x231103, + 0x213ec3, + 0x270203, + 0x21d283, + 0x259003, + 0x38d8c3, + 0x208e03, + 0x231103, + 0x213ec3, + 0x220a04, + 0x21d283, + 0x259003, + 0x20db43, + 0x2879c4, + 0x208e03, + 0x233e84, + 0x231103, + 0x2dd584, + 0x213ec3, + 0x381607, + 0x270203, + 0x214b83, + 0x23a708, + 0x259003, + 0x29ed0b, + 0x2f3983, + 0x3adc46, + 0x2022c2, + 0x23ef4b, + 0x231103, + 0x213ec3, + 0x21d283, + 0x259003, + 0x208e03, + 0x231103, + 0x213ec3, + 0x259003, + 0x26d503, + 0x21e403, + 0x2000c2, + 0x120648, + 0x20f385, + 0x353908, + 0x2e8d88, + 0x208e02, + 0x38d545, + 0x307a47, + 0x202bc2, + 0x2442c7, + 0x200382, + 0x25dc87, + 0x2bb789, + 0x2bcb08, + 0x2c9a09, + 0x20ecc2, + 0x269f07, + 0x22eb04, + 0x307b07, + 0x37c3c7, + 0x25e242, + 0x270203, + 0x202382, + 0x201402, + 0x2003c2, + 0x209302, + 0x200902, + 0x211302, + 0x2a9cc5, + 0x325a85, + 0x8e02, + 0x31103, + 0x208e03, + 0x231103, + 0x213ec3, + 0x21d283, + 0x259003, + 0x208e03, + 0x231103, + 0x213ec3, + 0x270203, + 0x21d283, + 0xe6143, + 0x259003, + 0xe103, + 0x101, + 0x208e03, + 0x231103, + 0x213ec3, + 0x220a04, + 0x217383, + 0x21d283, + 0xe6143, + 0x259003, + 0x216cc3, + 0x420730c6, + 0x9d303, + 0xca845, + 0x208e03, + 0x231103, + 0x213ec3, + 0x21d283, + 0x259003, + 0x208e02, + 0x208e03, + 0x231103, + 0x213ec3, + 0x21d283, + 0xe6143, + 0x259003, + 0x6742, + 0x120648, + 0x14b83, + 0xe6143, + 0x47904, + 0xe4ac5, + 0x2000c2, + 0x3afcc4, + 0x208e03, + 0x231103, + 0x213ec3, + 0x245943, + 0x22bec5, + 0x217383, + 0x221303, + 0x21d283, + 0x24fc43, + 0x259003, + 0x211303, + 0x25f383, + 0x202043, + 0x208e03, + 0x231103, + 0x213ec3, + 0x21d283, + 0x259003, + 0x208e02, + 0x259003, + 0x120648, + 0x213ec3, + 0xe6143, + 0x120648, + 0xe6143, + 0x2b9343, + 0x208e03, + 0x22de84, + 0x231103, + 0x213ec3, + 0x200d42, + 0x270203, + 0x21d283, + 0x259003, + 0x208e03, + 0x231103, + 0x213ec3, + 0x200d42, + 0x208e83, + 0x21d283, + 0x259003, + 0x2ec903, + 0x211303, + 0x2000c2, + 0x208e02, + 0x213ec3, + 0x21d283, + 0x259003, + 0x3adc45, + 0x14f9c6, + 0x2879c4, + 0x2022c2, + 0x120648, + 0x2000c2, + 0xf8945, + 0x1b308, + 0x18ec43, + 0x208e02, + 0x46491f86, + 0x1f484, + 0xb19cb, + 0x395c6, + 0x7a6c7, + 0x231103, + 0x4b808, + 0x213ec3, + 0x111185, + 0x192d44, + 0x267503, + 0x526c7, + 0xe0a84, + 0x21d283, + 0x7b846, + 0xe5f84, + 0xe6143, + 0x259003, + 0x2f5544, + 0x12d147, + 0x14f5c9, + 0xb1788, + 0x1436c4, + 0x3f5c6, + 0xe1c8, + 0x131b05, + 0xe4c9, + 0xf8945, + 0x208e02, + 0x208e03, + 0x231103, + 0x213ec3, + 0x270203, + 0x214b83, + 0x259003, + 0x2f3983, + 0x2022c2, + 0x120648, + 0x208e03, + 0x231103, + 0x213ec3, + 0x2171c3, + 0x2bf144, + 0x21d283, + 0x14b83, + 0x259003, + 0x208e03, + 0x231103, + 0x2dd584, + 0x213ec3, + 0x21d283, + 0x259003, + 0x3adc46, + 0x231103, + 0x213ec3, + 0x2ab03, + 0xe6143, + 0x259003, + 0x208e03, + 0x231103, + 0x213ec3, + 0x21d283, + 0x259003, + 0xf8945, + 0x7a6c7, + 0x120648, + 0x213ec3, + 0x208e03, + 0x231103, + 0x213ec3, + 0x21d283, + 0x259003, + 0x49208e03, + 0x231103, + 0x21d283, + 0x259003, + 0x120648, + 0x2000c2, + 0x208e02, + 0x208e03, + 0x213ec3, + 0x21d283, + 0x2003c2, + 0x259003, + 0x33a8c7, + 0x31258b, + 0x201103, + 0x238448, + 0x32c007, + 0x2116c6, + 0x209885, + 0x38d689, + 0x27a348, + 0x3726c9, + 0x3a8bd0, + 0x3726cb, + 0x2f1789, + 0x20fac3, + 0x201389, + 0x22f406, + 0x22f40c, + 0x20f448, + 0x3cdc48, + 0x3b8209, + 0x35194e, + 0x2bb54b, + 0x36c5cc, + 0x2038c3, + 0x28f9cc, + 0x2038c9, + 0x23cc47, + 0x23104c, + 0x3c79ca, + 0x245a04, + 0x24d20d, + 0x28f888, + 0x20db4d, + 0x292c06, + 0x2879cb, + 0x34f749, + 0x380107, + 0x389c06, + 0x326289, + 0x388eca, + 0x31ac48, + 0x2f3584, + 0x33d187, + 0x246347, + 0x2393c4, + 0x2e53c4, + 0x399189, + 0x394d89, + 0x219588, + 0x20d8c5, + 0x20ec05, + 0x20b006, + 0x24d0c9, + 0x26b58d, + 0x2f48c8, + 0x20af07, + 0x209908, + 0x31f446, + 0x23b984, + 0x2a8f45, + 0x3d0446, + 0x3d1fc4, + 0x2037c7, + 0x20588a, + 0x210744, + 0x2125c6, + 0x213349, + 0x21334f, + 0x214e0d, + 0x215c86, + 0x21af10, + 0x21b306, + 0x21b887, + 0x21c147, + 0x21c14f, + 0x21dd09, + 0x2245c6, + 0x224cc7, + 0x224cc8, + 0x2258c9, + 0x280808, + 0x2e9e87, + 0x20f383, + 0x22acc6, + 0x3c49c8, + 0x351c0a, + 0x3c5dc9, + 0x222703, + 0x307946, + 0x265e4a, + 0x28df47, + 0x23ca8a, + 0x30a20e, + 0x21de46, + 0x29d0c7, + 0x354546, + 0x203986, + 0x209e0b, + 0x20ed8a, + 0x2ad44d, + 0x3d0807, + 0x2694c8, + 0x2694c9, + 0x2694cf, + 0x3477cc, + 0x26cd09, + 0x2b2fce, + 0x38170a, + 0x2bd7c6, + 0x2fc586, + 0x31cdcc, + 0x31e64c, + 0x322088, + 0x359a47, + 0x235105, + 0x292304, + 0x39520e, + 0x266744, + 0x35d187, + 0x3a6fca, + 0x3c7ed4, + 0x3cbc0f, + 0x21c308, + 0x22ab88, + 0x33e48d, + 0x33e48e, + 0x22ae49, + 0x22c588, + 0x22c58f, + 0x230d4c, + 0x230d4f, + 0x232247, + 0x2346ca, + 0x246b0b, + 0x237908, + 0x23b307, + 0x2606cd, + 0x3319c6, + 0x24d3c6, + 0x240149, + 0x278708, + 0x244c48, + 0x244c4e, + 0x312687, + 0x246dc5, + 0x2476c5, + 0x204304, + 0x211986, + 0x219488, + 0x394583, + 0x2f42ce, + 0x260a88, + 0x372dcb, + 0x309207, + 0x2fe345, + 0x2474c6, + 0x2ab4c7, + 0x2fa608, + 0x33e8c9, + 0x22e5c5, + 0x287108, + 0x2355c6, + 0x3aa44a, + 0x395109, + 0x231109, + 0x23110b, + 0x393648, + 0x239289, + 0x20d986, + 0x37510a, + 0x2088ca, + 0x2348cc, + 0x228a87, + 0x2c980a, + 0x32d60b, + 0x32d619, + 0x317888, + 0x3adcc5, + 0x260886, + 0x26bc49, + 0x381ec6, + 0x2d324a, + 0x27a546, + 0x2353c4, + 0x2cb98d, + 0x3949c7, + 0x2353c9, + 0x24a785, + 0x24ad88, + 0x24b5c9, + 0x24ba04, + 0x24d807, + 0x24d808, + 0x24dcc7, + 0x268748, + 0x253107, + 0x204105, + 0x25a00c, + 0x25a849, + 0x2cf5ca, + 0x3ac489, + 0x201489, + 0x37fc4c, + 0x25ee0b, + 0x25fac8, + 0x260e88, + 0x264944, + 0x285608, + 0x2864c9, + 0x3c7a87, + 0x213586, + 0x29a7c7, + 0x3cf649, + 0x324d4b, + 0x294387, + 0x3cc987, + 0x219cc7, + 0x20dac4, + 0x20dac5, + 0x2dd285, + 0x34f34b, + 0x3b5a04, + 0x2be748, + 0x2f774a, + 0x235687, + 0x358507, + 0x28d692, + 0x29efc6, + 0x22d806, + 0x38ff8e, + 0x2a2f46, + 0x293388, + 0x29390f, + 0x20df08, + 0x39cfc8, + 0x2c474a, + 0x2c4751, + 0x2a2bce, + 0x23b60a, + 0x23b60c, + 0x22c787, + 0x22c790, + 0x3c9e48, + 0x2a2dc5, + 0x2ab7ca, + 0x3d200c, + 0x29600d, + 0x304486, + 0x304487, + 0x30448c, + 0x383c4c, + 0x21da0c, + 0x2acacb, + 0x383104, + 0x2b1384, + 0x385749, + 0x3b1c47, + 0x384649, + 0x208709, + 0x3bdd87, + 0x3c7846, + 0x3c7849, + 0x2ae8c3, + 0x2b3cca, + 0x38cd87, + 0x335c4b, + 0x2ad2ca, + 0x22eb84, + 0x35c586, + 0x282b89, + 0x311844, + 0x204e8a, + 0x2499c5, + 0x2c10c5, + 0x2c10cd, + 0x2c140e, + 0x2d95c5, + 0x339106, + 0x3ad847, + 0x25a28a, + 0x370ac6, + 0x2ec304, + 0x303187, + 0x2700cb, + 0x31f507, + 0x27a944, + 0x3010c6, + 0x3010cd, + 0x2dfa4c, + 0x21d146, + 0x2f4aca, + 0x3472c6, + 0x23e248, + 0x22f087, + 0x245b8a, + 0x382c86, + 0x280303, + 0x2bd8c6, + 0x3c4848, + 0x3858ca, + 0x285bc7, + 0x285bc8, + 0x289fc4, + 0x33a407, + 0x202d88, + 0x298908, + 0x271bc8, + 0x2e314a, + 0x2e4345, + 0x208e87, + 0x23b453, + 0x258146, + 0x2141c8, + 0x2201c9, + 0x244188, + 0x200d0b, + 0x35cd48, + 0x270204, + 0x2577c6, + 0x31b786, + 0x316109, + 0x2c7a47, + 0x25a108, + 0x298a86, + 0x327fc4, + 0x326b85, + 0x2cf908, + 0x332e8a, + 0x2cb608, + 0x2d06c6, + 0x29988a, + 0x2a7988, + 0x2d7748, + 0x2d8308, + 0x2d8b86, + 0x2db7c6, + 0x3abf4c, + 0x2dbd90, + 0x2a4005, + 0x20dd08, + 0x330710, + 0x20dd10, + 0x3a8a4e, + 0x3abbce, + 0x3abbd4, + 0x3b144f, + 0x3b1806, + 0x390d11, + 0x389d93, + 0x38a208, + 0x3251c5, + 0x238988, + 0x2fd945, + 0x2e5b0c, + 0x226bc9, + 0x292149, + 0x227047, + 0x397249, + 0x318d07, + 0x300446, + 0x2a8d47, + 0x201c05, + 0x20e143, + 0x394749, + 0x25cf49, + 0x22ab03, + 0x381244, + 0x27548d, + 0x2f8f0f, + 0x328005, + 0x387f86, + 0x228cc7, + 0x20f1c7, + 0x2fc8c6, + 0x2fc8cb, + 0x2a39c5, + 0x25cd06, + 0x301747, + 0x253809, + 0x37cac6, + 0x392605, + 0x363b4b, + 0x20a286, + 0x229585, + 0x25b908, + 0x2a5748, + 0x32018c, + 0x320190, + 0x2b1d89, + 0x2b4447, + 0x313a0b, + 0x2e87c6, + 0x2e9d4a, + 0x2ea8cb, + 0x2eb68a, + 0x2eb906, + 0x2ec7c5, + 0x32bf06, + 0x2b0648, + 0x22710a, + 0x33e11c, + 0x2f3a4c, + 0x2f3d48, + 0x3adc45, + 0x382947, + 0x351586, + 0x281ac5, + 0x217846, + 0x2fca88, + 0x2c0347, + 0x351848, + 0x25820a, + 0x228dcc, + 0x20b209, + 0x225647, + 0x286a04, + 0x247786, + 0x39cb4a, + 0x208805, + 0x222e4c, + 0x224e88, + 0x31f748, + 0x334a4c, + 0x22d1cc, + 0x22e6c9, + 0x22e907, + 0x3a0c8c, + 0x21e984, + 0x24fe4a, + 0x303e0c, + 0x2723cb, + 0x25948b, + 0x25c906, + 0x25f907, + 0x22c9c7, + 0x22c9cf, + 0x304e51, + 0x2e1892, + 0x264acd, + 0x264ace, + 0x264e0e, + 0x3b1608, + 0x3b1612, + 0x26c788, + 0x220807, + 0x2503ca, + 0x2a62c8, + 0x2a2f05, + 0x3bc00a, + 0x21b687, + 0x2f6044, + 0x21c883, + 0x2343c5, + 0x2c49c7, + 0x3040c7, + 0x29620e, + 0x35020d, + 0x3593c9, + 0x24f405, + 0x3b01c3, + 0x218306, + 0x25d945, + 0x373008, + 0x2baa09, + 0x2608c5, + 0x2608cf, + 0x2b1ac7, + 0x209705, + 0x309bca, + 0x2f3206, + 0x268ac9, + 0x2fd48c, + 0x2ff149, + 0x209b46, + 0x2f754c, + 0x338506, + 0x302d08, + 0x303346, + 0x317a06, + 0x2b5704, + 0x316083, + 0x2b6a8a, + 0x219fd1, + 0x26ceca, + 0x26e985, + 0x271747, + 0x258587, + 0x202e84, + 0x202e8b, + 0x2bc988, + 0x2bea46, + 0x22fac5, + 0x3aa744, + 0x24ab09, + 0x2008c4, + 0x244a87, + 0x2ff345, + 0x2ff347, + 0x3901c5, + 0x24cac3, + 0x2206c8, + 0x35c20a, + 0x2087c3, + 0x20f3ca, + 0x3c1846, + 0x26064f, + 0x3bcc09, + 0x2f4250, + 0x2f9748, + 0x2d1749, + 0x296f07, + 0x30104f, + 0x346084, + 0x2dd604, + 0x21b186, + 0x280c46, + 0x3a41ca, + 0x27bb06, + 0x340907, + 0x30af88, + 0x30b187, + 0x30c287, + 0x30d24a, + 0x30eacb, + 0x326945, + 0x2e14c8, + 0x232a43, + 0x3b700c, + 0x343d0f, + 0x234f0d, + 0x25ac87, + 0x359509, + 0x241e87, + 0x25b148, + 0x3c80cc, + 0x2b8a48, + 0x26fcc8, + 0x32ea8e, + 0x341294, + 0x3417a4, + 0x358c0a, + 0x373b0b, + 0x318dc4, + 0x318dc9, + 0x237ec8, + 0x247ec5, + 0x39408a, + 0x260cc7, + 0x32be04, + 0x38d8c3, + 0x208e03, + 0x233e84, + 0x231103, + 0x213ec3, + 0x220a04, + 0x217383, + 0x270203, + 0x2dbd86, + 0x2bf144, + 0x21d283, + 0x259003, + 0x216203, + 0x2000c2, + 0x38d8c3, + 0x208e02, + 0x208e03, + 0x233e84, + 0x231103, + 0x213ec3, + 0x217383, + 0x2dbd86, + 0x21d283, + 0x259003, + 0x120648, + 0x208e03, + 0x231103, + 0x3d0943, + 0x21d283, + 0xe6143, + 0x259003, + 0x120648, + 0x208e03, + 0x231103, + 0x213ec3, + 0x270203, + 0x2bf144, + 0x21d283, + 0x259003, + 0x2000c2, + 0x25c183, + 0x208e02, + 0x231103, + 0x213ec3, + 0x270203, + 0x21d283, + 0x259003, + 0x200f82, + 0x248182, + 0x208e02, + 0x208e03, + 0x20f982, + 0x2005c2, + 0x220a04, + 0x20ac44, + 0x235a82, + 0x2bf144, + 0x2003c2, + 0x259003, + 0x216203, + 0x25c906, + 0x22a342, + 0x203642, + 0x220e82, + 0x4ba0df03, + 0x4be2c783, + 0x58fc6, + 0x58fc6, + 0x2879c4, + 0x214b83, + 0x1930a, + 0x112fcc, + 0xaacc, + 0xca64d, + 0xf8945, + 0x8b88c, + 0x67c47, + 0x10ec6, + 0x15e08, + 0x18dc7, + 0x1e748, + 0x17ba8a, + 0x103647, + 0x4ca8bac5, + 0xde0c9, + 0x32d0b, + 0x1c5b0b, + 0x7a748, + 0x15a49, + 0x1cd6ca, + 0x13f30e, + 0x1152cd, + 0x1443f8b, + 0xdf90a, + 0x1f484, + 0x68486, + 0x179b48, + 0x886c8, + 0x32fc7, + 0x1fd85, + 0x92f47, + 0x7c349, + 0x1118c7, + 0x667c8, + 0x107209, + 0x4a884, + 0x4db85, + 0x13bace, + 0x6d80d, + 0x7a548, + 0x4cf6af86, + 0x4d96af88, + 0xb4288, + 0x13aad0, + 0x54dcc, + 0x65b47, + 0x66607, + 0x6a9c7, + 0x70387, + 0xafc2, + 0x28c7, + 0xef4c, + 0x191b85, + 0x16bd07, + 0xa5606, + 0xa66c9, + 0xa80c8, + 0x55402, + 0x5c2, + 0x3d44b, + 0xe6007, + 0x11eb09, + 0x6b109, + 0x1656c8, + 0xb2d02, + 0x1a6cc9, + 0xd98ca, + 0x2306, + 0xce389, + 0xdf887, + 0xdffc9, + 0xe0d48, + 0xe1d47, + 0xe42c9, + 0xe6945, + 0xe6cd0, + 0x1d22c6, + 0x129cc5, + 0x8f4c7, + 0x11f04d, + 0x43105, + 0x25f46, + 0xee247, + 0xf5558, + 0x111c48, + 0x210a, + 0x8782, + 0x5924a, + 0x7324d, + 0x1002, + 0xc8346, + 0x8e4c8, + 0x49148, + 0x6e6c9, + 0x10b908, + 0x7f98e, + 0x18307, + 0x10668d, + 0xfbec5, + 0x2648, + 0x1ad488, + 0x106c86, + 0x67c2, + 0xdc586, + 0x3f5c6, + 0x1242, + 0x401, + 0x5f787, + 0x5d203, + 0x4d2f5dc4, + 0x4d694cc3, + 0xc1, + 0x12bc6, + 0xc1, + 0x201, + 0x12bc6, + 0x5d203, + 0x156ca05, + 0x245a04, + 0x208e03, + 0x24ea84, + 0x220a04, + 0x21d283, + 0x220085, + 0x216cc3, + 0x202203, + 0x2fc845, + 0x202043, + 0x4ea08e03, + 0x231103, + 0x213ec3, + 0x200181, + 0x270203, + 0x20ac44, + 0x2bf144, + 0x21d283, + 0x259003, + 0x211303, + 0x120648, + 0x2000c2, + 0x38d8c3, + 0x208e02, + 0x208e03, + 0x231103, + 0x3d0943, + 0x2005c2, + 0x220a04, + 0x217383, + 0x270203, + 0x21d283, + 0x214b83, + 0x259003, + 0x202043, + 0x120648, + 0x343a82, + 0x1018c7, + 0x8e02, + 0x126b05, + 0x54f0f, + 0x1582ac8, + 0x10bc8e, + 0x4fa23802, + 0x32b588, + 0x223c86, + 0x2c6046, + 0x223607, + 0x4fe04bc2, + 0x503bca88, + 0x22208a, + 0x2655c8, + 0x204342, + 0x335a89, + 0x326987, + 0x213506, + 0x220409, + 0x206084, + 0x2115c6, + 0x2c6444, + 0x201904, + 0x259c09, + 0x303b06, + 0x2e95c5, + 0x253585, + 0x22bc07, + 0x2c2f47, + 0x29f204, + 0x223846, + 0x2f6cc5, + 0x2acdc5, + 0x30fb85, + 0x214487, + 0x309045, + 0x32a249, + 0x38a945, + 0x2fa744, + 0x370a07, + 0x32744e, + 0x390909, + 0x38fe49, + 0x324386, + 0x2412c8, + 0x2f02cb, + 0x36230c, + 0x344d86, + 0x36c487, + 0x2b2745, + 0x2e53ca, + 0x219689, + 0x348949, + 0x38e9c6, + 0x301505, + 0x247a45, + 0x331709, + 0x30fd0b, + 0x277d46, + 0x34aa86, + 0x20af04, + 0x28d346, + 0x246e48, + 0x3c46c6, + 0x26ddc6, + 0x204688, + 0x206607, + 0x206e49, + 0x207645, + 0x120648, + 0x292ec4, + 0x30c804, + 0x20ea85, + 0x3b32c9, + 0x21f107, + 0x21f10b, + 0x22294a, + 0x226b05, + 0x5060da02, + 0x2ad187, + 0x50a26e08, + 0x211cc7, + 0x2df085, + 0x32e6ca, + 0x8e02, + 0x25324b, + 0x27b0ca, + 0x25ce46, + 0x20e243, + 0x2d58cd, + 0x39ea8c, + 0x20fc4d, + 0x24a3c5, + 0x36efc5, + 0x3945c7, + 0x215609, + 0x221f86, + 0x257cc5, + 0x30ad88, + 0x28d243, + 0x2e9088, + 0x28d248, + 0x2c7147, + 0x34c0c8, + 0x39dd09, + 0x2e2387, + 0x312107, + 0x335908, + 0x2f9e44, + 0x2f9e47, + 0x292b08, + 0x359286, + 0x35d50f, + 0x31ed07, + 0x355006, + 0x22ea45, + 0x221003, + 0x248f07, + 0x37ef43, + 0x24e146, + 0x2500c6, + 0x250946, + 0x291805, + 0x268743, + 0x3a6948, + 0x3809c9, + 0x39f44b, + 0x250ac8, + 0x252dc5, + 0x254145, + 0x50e2ec42, + 0x2a8e09, + 0x220a87, + 0x25cd85, + 0x259b07, + 0x25c506, + 0x3785c5, + 0x25d78b, + 0x25fac4, + 0x265185, + 0x2652c7, + 0x2776c6, + 0x277b05, + 0x285807, + 0x285f87, + 0x2e7784, + 0x28b68a, + 0x28c0c8, + 0x2bcfc9, + 0x238cc5, + 0x362b06, + 0x24700a, + 0x253486, + 0x269007, + 0x2bcc8d, + 0x2a3509, + 0x3a5c45, + 0x395787, + 0x327848, + 0x38a3c8, + 0x39e787, + 0x205e06, + 0x227647, + 0x24fc83, + 0x303a84, + 0x375d85, + 0x3ab2c7, + 0x3af6c9, + 0x2678c8, + 0x3c8385, + 0x245dc4, + 0x250c85, + 0x25fc8d, + 0x205002, + 0x2c1f46, + 0x2c8286, + 0x30cfca, + 0x396106, + 0x39ca85, + 0x38b185, + 0x38b187, + 0x3aa28c, + 0x2b410a, + 0x28d006, + 0x2db6c5, + 0x28d186, + 0x28d4c7, + 0x28f186, + 0x29170c, + 0x220549, + 0x51213047, + 0x293cc5, + 0x293cc6, + 0x294748, + 0x24da85, + 0x2a4205, + 0x2a4988, + 0x2a4b8a, + 0x5167c042, + 0x51a0bf02, + 0x2d24c5, + 0x2782c3, + 0x245308, + 0x204c03, + 0x2a4e04, + 0x268c0b, + 0x204c08, + 0x350b48, + 0x51f6b749, + 0x2a99c9, + 0x2aa106, + 0x2ab148, + 0x2ab349, + 0x2ac5c6, + 0x2ac745, + 0x24a1c6, + 0x2adc89, + 0x38e0c7, + 0x22b646, + 0x302b47, + 0x38e387, + 0x217b44, + 0x52311f49, + 0x281d08, + 0x3bc988, + 0x328207, + 0x2cb0c6, + 0x215409, + 0x2c6707, + 0x25594a, + 0x256ec8, + 0x212407, + 0x2131c6, + 0x28f2ca, + 0x3a0ac8, + 0x2c7d05, + 0x225e45, + 0x305d47, + 0x371e49, + 0x309e0b, + 0x32a708, + 0x38a9c9, + 0x250ec7, + 0x2b974c, + 0x2ba08c, + 0x2ba38a, + 0x2ba60c, + 0x2c5fc8, + 0x2c61c8, + 0x2c63c4, + 0x2c68c9, + 0x2c6b09, + 0x2c6d4a, + 0x2c6fc9, + 0x2c7307, + 0x3b4c4c, + 0x233706, + 0x2c9548, + 0x253546, + 0x387786, + 0x3a5b47, + 0x325008, + 0x3295cb, + 0x211b87, + 0x234489, + 0x379589, + 0x24ec07, + 0x257644, + 0x271887, + 0x39c2c6, + 0x2114c6, + 0x2f4c85, + 0x24b3c8, + 0x292044, + 0x292046, + 0x2b3fcb, + 0x32e2c9, + 0x214386, + 0x214609, + 0x20eb46, + 0x333088, + 0x221403, + 0x301685, + 0x2676c9, + 0x26df05, + 0x305b84, + 0x276bc6, + 0x23c405, + 0x255146, + 0x30ee47, + 0x32d506, + 0x22a24b, + 0x375007, + 0x2528c6, + 0x22ef46, + 0x22bcc6, + 0x29f1c9, + 0x2f638a, + 0x2bed45, + 0x20a38d, + 0x2a4c86, + 0x2f7946, + 0x2f4146, + 0x23e1c5, + 0x2e6fc7, + 0x2fe607, + 0x38f7ce, + 0x270203, + 0x2cb089, + 0x381c49, + 0x2e57c7, + 0x26c447, + 0x29cc45, + 0x372d05, + 0x527992cf, + 0x2d1987, + 0x2d1b48, + 0x2d2044, + 0x2d3806, + 0x52a47742, + 0x2d8e06, + 0x2dbd86, + 0x32990e, + 0x2e8eca, + 0x3ca246, + 0x3bd20a, + 0x2138c9, + 0x243445, + 0x373288, + 0x3504c6, + 0x29b008, + 0x275108, + 0x3a7b0b, + 0x223705, + 0x3090c8, + 0x2047cc, + 0x2def47, + 0x250306, + 0x3757c8, + 0x211848, + 0x52e3bbc2, + 0x20784b, + 0x218a89, + 0x219149, + 0x32e147, + 0x20a0c8, + 0x5321fac8, + 0x38b9cb, + 0x365549, + 0x283c0d, + 0x24a588, + 0x357388, + 0x53600ec2, + 0x33ec84, + 0x53a2c942, + 0x2fee46, + 0x53e04442, + 0x31984a, + 0x204246, + 0x31afc8, + 0x383408, + 0x39c6c6, + 0x23f2c6, + 0x2f94c6, + 0x372f85, + 0x238104, + 0x542b0104, + 0x350006, + 0x27b907, + 0x546e6687, + 0x26d5cb, + 0x211ec9, + 0x36f00a, + 0x38b2c4, + 0x2bdb48, + 0x22b40d, + 0x2f2009, + 0x2f2248, + 0x2f24c9, + 0x2f5544, + 0x2469c4, + 0x25ecc5, + 0x31034b, + 0x204b86, + 0x34fe45, + 0x21e009, + 0x223908, + 0x2a14c4, + 0x2e5549, + 0x353b85, + 0x2c2f88, + 0x3127c7, + 0x390248, + 0x282d86, + 0x38f407, + 0x2e0849, + 0x363cc9, + 0x229605, + 0x24f7c5, + 0x54a12482, + 0x2fa504, + 0x229045, + 0x223506, + 0x3c89c5, + 0x298387, + 0x350105, + 0x277704, + 0x324446, + 0x27ba07, + 0x22b286, + 0x3cf585, + 0x216e48, + 0x223e85, + 0x221287, + 0x2268c9, + 0x32e40a, + 0x2b0d87, + 0x2b0d8c, + 0x2e9586, + 0x379889, + 0x24d505, + 0x24d9c8, + 0x20cec3, + 0x20d945, + 0x39bf85, + 0x27f547, + 0x54e1f542, + 0x23eac7, + 0x2f51c6, + 0x33c486, + 0x2fb106, + 0x211786, + 0x353e08, + 0x238ac5, + 0x3550c7, + 0x3550cd, + 0x21c883, + 0x21c885, + 0x309987, + 0x23ee08, + 0x309545, + 0x216448, + 0x384546, + 0x2de287, + 0x2c9485, + 0x223786, + 0x3afd45, + 0x221d4a, + 0x377106, + 0x31d707, + 0x2e0c05, + 0x2fef87, + 0x303104, + 0x305b06, + 0x3731c5, + 0x20f8cb, + 0x39c149, + 0x25c28a, + 0x229688, + 0x30e308, + 0x313f0c, + 0x3235c7, + 0x34b288, + 0x34cbc8, + 0x34d005, + 0x3a440a, + 0x3b01c9, + 0x55201dc2, + 0x3cc786, + 0x2608c4, + 0x3230c9, + 0x2951c9, + 0x278dc7, + 0x2c5287, + 0x208589, + 0x23e3c8, + 0x23e3cf, + 0x228046, + 0x2ddd8b, + 0x3c1985, + 0x3c1987, + 0x2fcc89, + 0x268d46, + 0x2e54c7, + 0x2e1c05, + 0x22e4c4, + 0x267586, + 0x21f2c4, + 0x2eebc7, + 0x2cd048, + 0x55701408, + 0x302205, + 0x302347, + 0x3186c9, + 0x214944, + 0x242b88, + 0x55a55788, + 0x202e84, + 0x2faa48, + 0x389cc4, + 0x39e209, + 0x214105, + 0x55e022c2, + 0x228085, + 0x2d6b05, + 0x3955c8, + 0x232087, + 0x562008c2, + 0x2b0245, + 0x2d75c6, + 0x243a86, + 0x2fa4c8, + 0x2fbb88, + 0x3c8986, + 0x3b1ac6, + 0x301989, + 0x33c3c6, + 0x2930cb, + 0x36c945, + 0x2a6206, + 0x2f1108, + 0x290186, + 0x22b006, + 0x21690a, + 0x2a9d8a, + 0x25ff85, + 0x238b87, + 0x314c86, + 0x56604b02, + 0x309ac7, + 0x25f2c5, + 0x246f84, + 0x246f85, + 0x2bda46, + 0x271107, + 0x21b185, + 0x24b444, + 0x2aeac8, + 0x22b0c5, + 0x2e3b47, + 0x3b7ac5, + 0x221c85, + 0x2aa584, + 0x35a589, + 0x2f6b08, + 0x23c2c6, + 0x2d9a86, + 0x202b86, + 0x56bc0088, + 0x3c8707, + 0x306e0d, + 0x307d4c, + 0x308349, + 0x308589, + 0x56f6d342, + 0x3c7603, + 0x205ec3, + 0x39c385, + 0x3ab3ca, + 0x33c286, + 0x30cb85, + 0x30f004, + 0x30f00b, + 0x32fb8c, + 0x330f0c, + 0x331215, + 0x3320cd, + 0x33628f, + 0x336652, + 0x336acf, + 0x336e92, + 0x337313, + 0x3377cd, + 0x337d8d, + 0x33810e, + 0x33868e, + 0x338ecc, + 0x33928c, + 0x3396cb, + 0x33a5ce, + 0x33aed2, + 0x33c04c, + 0x33c610, + 0x345052, + 0x34624c, + 0x34690d, + 0x346c4c, + 0x349d51, + 0x34ac0d, + 0x34d5cd, + 0x34dbca, + 0x34de4c, + 0x34f10c, + 0x34fb4c, + 0x351e8c, + 0x355f53, + 0x3565d0, + 0x3569d0, + 0x35758d, + 0x357b8c, + 0x358949, + 0x35b78d, + 0x35bad3, + 0x35de91, + 0x35e2d3, + 0x35ee8f, + 0x35f24c, + 0x35f54f, + 0x35f90d, + 0x35ff0f, + 0x3602d0, + 0x360d4e, + 0x363f0e, + 0x364490, + 0x365fcd, + 0x36694e, + 0x366ccc, + 0x367c93, + 0x36980e, + 0x369e90, + 0x36a291, + 0x36a6cf, + 0x36aa93, + 0x36cecd, + 0x36d20f, + 0x36d5ce, + 0x36dc90, + 0x36e089, + 0x36f290, + 0x36f88f, + 0x36ff0f, + 0x3702d2, + 0x37100e, + 0x371a0d, + 0x37208d, + 0x3723cd, + 0x373e4d, + 0x37418d, + 0x3744d0, + 0x3748cb, + 0x375b4c, + 0x375ecc, + 0x3764cc, + 0x3767ce, + 0x383610, + 0x385b52, + 0x385fcb, + 0x3864ce, + 0x38684e, + 0x3870ce, + 0x38754b, + 0x5738ed16, + 0x395e0d, + 0x396294, + 0x39748d, + 0x398cd5, + 0x39a68d, + 0x39b00f, + 0x39b68f, + 0x39f70f, + 0x39face, + 0x3a004d, + 0x3a2111, + 0x3a530c, + 0x3a560c, + 0x3a590b, + 0x3a5d8c, + 0x3a614f, + 0x3a6512, + 0x3a724d, + 0x3a87cc, + 0x3a92cc, + 0x3a95cd, + 0x3a990f, + 0x3a9cce, + 0x3ab08c, + 0x3ab64d, + 0x3ab98b, + 0x3ac24c, + 0x3acb4d, + 0x3ace8e, + 0x3ad209, + 0x3ae613, + 0x3aeb4d, + 0x3aee8d, + 0x3af48c, + 0x3af90e, + 0x3b040f, + 0x3b07cc, + 0x3b0acd, + 0x3b0e0f, + 0x3b11cc, + 0x3b1e0c, + 0x3b218c, + 0x3b248c, + 0x3b2b4d, + 0x3b2e92, + 0x3b350c, + 0x3b380c, + 0x3b3b11, + 0x3b3f4f, + 0x3b430f, + 0x3b46d3, + 0x3b508e, + 0x3b540f, + 0x3b57cc, + 0x577b5b0e, + 0x3b5e8f, + 0x3b6256, + 0x3b75d2, + 0x3b988c, + 0x3ba24f, + 0x3ba8cd, + 0x3bf10f, + 0x3bf4cc, + 0x3bf7cd, + 0x3bfb0d, + 0x3c104e, + 0x3c208c, + 0x3c3a4c, + 0x3c3d50, + 0x3c6991, + 0x3c6dcb, + 0x3c720c, + 0x3c750e, + 0x3c9051, + 0x3c948e, + 0x3c980d, + 0x3ce0cb, + 0x3ce9cf, + 0x3cff94, + 0x259a02, + 0x259a02, + 0x2047c3, + 0x259a02, + 0x2047c3, + 0x259a02, + 0x206342, + 0x24a205, + 0x3c8d4c, + 0x259a02, + 0x259a02, + 0x206342, + 0x259a02, + 0x294dc5, + 0x32e405, + 0x259a02, + 0x259a02, + 0x20a842, + 0x294dc5, + 0x333289, + 0x35db8c, + 0x259a02, + 0x259a02, + 0x259a02, + 0x259a02, + 0x24a205, + 0x259a02, + 0x259a02, + 0x259a02, + 0x259a02, + 0x20a842, + 0x333289, + 0x259a02, + 0x259a02, + 0x259a02, + 0x32e405, + 0x259a02, + 0x32e405, + 0x35db8c, + 0x3c8d4c, + 0x38d8c3, + 0x208e03, + 0x231103, + 0x213ec3, + 0x220a04, + 0x21d283, + 0x259003, + 0x194a88, + 0x577c4, + 0x14b83, + 0xc8c88, + 0x2000c2, + 0x58608e02, + 0x2424c3, + 0x256e04, + 0x204a03, + 0x21cac4, + 0x22d806, + 0x210d83, + 0x300804, + 0x2d4f45, + 0x270203, + 0x21d283, + 0xe6143, + 0x259003, + 0x23628a, + 0x25c906, + 0x386bcc, + 0x120648, + 0x208e02, + 0x208e03, + 0x231103, + 0x213ec3, + 0x208e83, + 0x2dbd86, + 0x21d283, + 0x259003, + 0x216203, + 0xa5e48, + 0xf8945, + 0x1c5c49, + 0x5202, + 0x59afd885, + 0xf8945, + 0x67c47, + 0x6e808, + 0xbd0e, + 0x89792, + 0x18cecb, + 0x103746, + 0x59e8bac5, + 0x5a28bacc, + 0x38e07, + 0xeb207, + 0xbe30a, + 0x3c550, + 0x18e505, + 0xb19cb, + 0x886c8, + 0x32fc7, + 0x56a8b, + 0x7c349, + 0x132687, + 0x1118c7, + 0x77f87, + 0x32f06, + 0x667c8, + 0x5a835d46, + 0x49087, + 0x6d80d, + 0xbdcd0, + 0x5ac05642, + 0x7a548, + 0x5b2d0, + 0x17930c, + 0x5b3827cd, + 0x5df88, + 0x5e40b, + 0x6ba87, + 0x57389, + 0x59086, + 0x94948, + 0x1742, + 0x7154a, + 0xe9407, + 0x16bd07, + 0xa66c9, + 0xa80c8, + 0x111185, + 0xf360e, + 0x225ce, + 0x15440f, + 0x11eb09, + 0x6b109, + 0x87e8b, + 0x9fc0f, + 0xae04c, + 0x198a0b, + 0xcf508, + 0xebb87, + 0x100ac8, + 0x13cf8b, + 0x1406cc, + 0x15820c, + 0x16150c, + 0x16934d, + 0x1656c8, + 0xc7c82, + 0x1a6cc9, + 0xf3088, + 0x1a388b, + 0xcb2c6, + 0xd6f4b, + 0x13aa0b, + 0xe134a, + 0xe1f05, + 0xe6cd0, + 0xe9706, + 0x12dc06, + 0x129cc5, + 0x8f4c7, + 0xf99c8, + 0xee247, + 0xee507, + 0xfb647, + 0xfec8a, + 0x1204ca, + 0xc8346, + 0x9268d, + 0x49148, + 0x10b908, + 0xaa4c9, + 0xb8dc5, + 0xfe7cc, + 0x16954b, + 0x171d84, + 0x106a49, + 0x106c86, + 0x1557c6, + 0xbb946, + 0x3642, + 0x3f5c6, + 0x204b, + 0x113d87, + 0x1242, + 0xcd4c5, + 0x19fc4, + 0x101, + 0x64dc3, + 0x5a678486, + 0x94cc3, + 0x382, + 0x928c4, + 0x4342, + 0x879c4, + 0x882, + 0x7982, + 0xbc2, + 0x120f02, + 0xf82, + 0x8bac2, + 0x6a82, + 0x142382, + 0x34942, + 0x18982, + 0x8a42, + 0xa182, + 0x31103, + 0x942, + 0x2bc2, + 0x17242, + 0x1482, + 0x642, + 0x2f4c2, + 0x55402, + 0x7782, + 0xad02, + 0x5c2, + 0x17383, + 0xb02, + 0x2a02, + 0xb2d02, + 0x6f42, + 0x4c82, + 0xbb02, + 0x11602, + 0x9d082, + 0x2302, + 0x127182, + 0x6cac2, + 0x7c02, + 0x1d283, + 0x602, + 0x3bbc2, + 0x1c02, + 0x1202, + 0x29585, + 0x59c2, + 0x3eec2, + 0x40083, + 0x682, + 0x8782, + 0x1002, + 0x5502, + 0x11782, + 0x8c2, + 0x67c2, + 0x3642, + 0x7d85, + 0x5b606342, + 0x5bae3343, + 0xa203, + 0x5be06342, + 0xa203, + 0x82687, + 0x210443, + 0x2000c2, + 0x208e03, + 0x231103, + 0x3d0943, + 0x2005c3, + 0x208e83, + 0x21d283, + 0x214b83, + 0x259003, + 0x294d03, + 0x11243, + 0x120648, + 0x208e03, + 0x231103, + 0x3d0943, + 0x270203, + 0x21d283, + 0x214b83, + 0xe6143, + 0x259003, + 0x208e03, + 0x231103, + 0x259003, + 0x208e03, + 0x231103, + 0x213ec3, + 0x200181, + 0x270203, + 0x21d283, + 0x24fc43, + 0x259003, + 0x195d04, + 0x38d8c3, + 0x208e03, + 0x231103, + 0x209843, + 0x3d0943, + 0x27f443, + 0x23c9c3, + 0x2a8bc3, + 0x284983, + 0x213ec3, + 0x220a04, + 0x21d283, + 0x259003, + 0x202043, + 0x38c384, + 0x25fe83, + 0x38c3, + 0x227303, + 0x38d308, + 0x28f304, + 0x20020a, + 0x23d346, + 0x117804, + 0x370707, + 0x21c44a, + 0x227f09, + 0x3aadc7, + 0x3b678a, + 0x38d8c3, + 0x2d254b, + 0x2bd549, + 0x202c85, + 0x33be87, + 0x8e02, + 0x208e03, + 0x21d4c7, + 0x375445, + 0x2c6549, + 0x231103, + 0x2bb386, + 0x2c5803, + 0xf5243, + 0x10e606, + 0x193e06, + 0x10d07, + 0x225046, + 0x31a4c5, + 0x207707, + 0x30c0c7, + 0x5e613ec3, + 0x346487, + 0x2bba43, + 0x245085, + 0x220a04, + 0x26eec8, + 0x37170c, + 0x340345, + 0x2a3686, + 0x21d387, + 0x225707, + 0x260087, + 0x266408, + 0x30d6cf, + 0x38ab85, + 0x2425c7, + 0x28c787, + 0x28c8ca, + 0x30abc9, + 0x30e745, + 0x3135ca, + 0x128546, + 0x2c5885, + 0x373d44, + 0x383346, + 0x2d2fc7, + 0x2c7b87, + 0x38fb08, + 0x221405, + 0x375346, + 0x26dd45, + 0x233b85, + 0x28b404, + 0x39c5c7, + 0x353c4a, + 0x24f108, + 0x36db06, + 0x8e83, + 0x2e4345, + 0x35d346, + 0x3b4e86, + 0x329bc6, + 0x270203, + 0x3a74c7, + 0x28c705, + 0x21d283, + 0x2e160d, + 0x214b83, + 0x38fc08, + 0x3812c4, + 0x2779c5, + 0x2a4e46, + 0x218806, + 0x2a6107, + 0x2a8c07, + 0x290605, + 0x259003, + 0x2ebc87, + 0x257509, + 0x32de49, + 0x20e64a, + 0x207d42, + 0x245044, + 0x2e9c44, + 0x329487, + 0x23e988, + 0x2ef349, + 0x21c749, + 0x2f1307, + 0x2f0846, + 0xf3386, + 0x2f5544, + 0x2f5b4a, + 0x2f8508, + 0x2f9389, + 0x30dec6, + 0x2b5c85, + 0x24efc8, + 0x2cb70a, + 0x294003, + 0x38c506, + 0x2f1407, + 0x22c005, + 0x381185, + 0x3add43, + 0x26fdc4, + 0x225e05, + 0x286087, + 0x2f6c45, + 0x342c46, + 0x1c8885, + 0x288e03, + 0x3ca309, + 0x27778c, + 0x3a500c, + 0x2d6d48, + 0x2c3907, + 0x3034c8, + 0x30428a, + 0x304c8b, + 0x2bd688, + 0x218908, + 0x233606, + 0x202a45, + 0x39344a, + 0x2e3385, + 0x2022c2, + 0x2c9347, + 0x250606, + 0x36e805, + 0x372949, + 0x279bc5, + 0x374d85, + 0x2f0e09, + 0x35d286, + 0x3b6e88, + 0x245143, + 0x225186, + 0x276b06, + 0x3133c5, + 0x3133c9, + 0x2efa89, + 0x27e5c7, + 0x115a84, + 0x315a87, + 0x21c649, + 0x233985, + 0x38208, + 0x33ef45, + 0x36b585, + 0x256289, + 0x201b42, + 0x2afb04, + 0x200f42, + 0x200b02, + 0x2d3945, + 0x317588, + 0x2b8d05, + 0x2c74c3, + 0x2c74c5, + 0x2d9003, + 0x20cb02, + 0x37a2c4, + 0x2a7903, + 0x20a282, + 0x387d84, + 0x2ea1c3, + 0x202582, + 0x2b8d83, + 0x28e444, + 0x2f9943, + 0x25dc04, + 0x203c42, + 0x216103, + 0x2343c3, + 0x200b42, + 0x374402, + 0x2ef8c9, + 0x2076c2, + 0x28a504, + 0x200cc2, + 0x24ee44, + 0x2f0804, + 0x202504, + 0x203642, + 0x233242, + 0x22e883, + 0x304a43, + 0x248204, + 0x293e84, + 0x2f1584, + 0x2f86c4, + 0x30f743, + 0x324bc3, + 0x3284c4, + 0x316f44, + 0x317086, + 0x229542, + 0x3bb43, + 0x208e02, + 0x231103, + 0x213ec3, + 0x21d283, + 0x259003, + 0x2000c2, + 0x38d8c3, + 0x208e03, + 0x231103, + 0x202bc3, + 0x213ec3, + 0x220a04, + 0x2efb84, + 0x2bf144, + 0x21d283, + 0x259003, + 0x216203, + 0x2f6604, + 0x32b543, + 0x2a7143, + 0x371cc4, + 0x33ed46, + 0x207083, + 0xf8945, + 0xeb207, + 0x35a8c3, + 0x5fa1e348, + 0x228a83, + 0x2b4883, + 0x2450c3, + 0x208e83, + 0x39e4c5, + 0x13be43, + 0x208e03, + 0x231103, + 0x213ec3, + 0x21d283, + 0x259003, + 0x20e2c3, + 0x22ce43, + 0x120648, + 0x208e03, + 0x231103, + 0x213ec3, + 0x217383, + 0x21d283, + 0x231d04, + 0xe6143, + 0x259003, + 0x351584, + 0xf8945, + 0x2c2345, + 0xeb207, + 0x208e02, + 0x202142, + 0x200382, + 0x201402, + 0x14b83, + 0x2003c2, + 0x191584, + 0x208e03, + 0x233e84, + 0x231103, + 0x213ec3, + 0x270203, + 0x21d283, + 0x259003, + 0x120648, + 0x208e03, + 0x231103, + 0x213ec3, + 0x270203, + 0x2bf144, + 0x21d283, + 0x14b83, + 0x259003, + 0x211303, + 0x2879c4, + 0x120648, + 0x208e03, + 0x214b83, + 0x11243, + 0x144c04, + 0x245a04, + 0x120648, + 0x208e03, + 0x24ea84, + 0x220a04, + 0x214b83, + 0x200ec2, + 0xe6143, + 0x259003, + 0x202203, + 0x6fdc4, + 0x2fc845, + 0x2022c2, + 0x201fc3, + 0x192e49, + 0xdfd46, + 0x128688, + 0x2000c2, + 0x120648, + 0x208e02, + 0x231103, + 0x213ec3, + 0x2005c2, + 0x14b83, + 0x259003, + 0xa882, + 0x2000c2, + 0x1b6947, + 0x107609, + 0x37c3, + 0x120648, + 0x193d83, + 0x63347147, + 0x8e03, + 0x1cc688, + 0x231103, + 0x213ec3, + 0x42346, + 0x217383, + 0x58dc8, + 0xc4e48, + 0x38886, + 0x270203, + 0xce908, + 0x98403, + 0x634e3806, + 0xe8085, + 0x31307, + 0x1d283, + 0x4a83, + 0x59003, + 0x2542, + 0x18434a, + 0x17083, + 0xd3a03, + 0x2fbf44, + 0x10d4cb, + 0x10da88, + 0x8eb02, + 0x1454f07, + 0x15276c7, + 0x14c7588, + 0x1516b83, + 0x1882cb, + 0x12d147, + 0x2000c2, + 0x208e02, + 0x208e03, + 0x231103, + 0x2dd584, + 0x213ec3, + 0x217383, + 0x270203, + 0x21d283, + 0x208e03, + 0x231103, + 0x213ec3, + 0x208e83, + 0x21d283, + 0x259003, + 0x281ac3, + 0x211303, + 0x208e03, + 0x231103, + 0x213ec3, + 0x21d283, + 0x259003, + 0x208e03, + 0x231103, + 0x213ec3, + 0x21d283, + 0x259003, + 0x11243, + 0x208e03, + 0x231103, + 0x213ec3, + 0x220a04, + 0x208e83, + 0x21d283, + 0x259003, + 0x22a342, + 0x2000c1, + 0x2000c2, + 0x200201, + 0x336382, + 0x120648, + 0x21af05, + 0x200101, + 0x8e03, + 0x200d81, + 0x200501, + 0x201481, + 0x24a182, + 0x37ef44, + 0x24a183, + 0x200041, + 0x200801, + 0x200181, + 0x200701, + 0x2f87c7, + 0x342d8f, + 0x3024c6, + 0x2004c1, + 0x344c46, + 0x200d01, + 0x200581, + 0x3ce30e, + 0x2003c1, + 0x259003, + 0x201b81, + 0x243685, + 0x202542, + 0x3adc45, + 0x200401, + 0x200741, + 0x2007c1, + 0x2022c2, + 0x200081, + 0x201fc1, + 0x20a781, + 0x202cc1, + 0x201241, + 0x120648, + 0x208e03, + 0x231103, + 0x213ec3, + 0x21d283, + 0x259003, + 0x216cc3, + 0x208e03, + 0x213ec3, + 0x8ea48, + 0x270203, + 0x21d283, + 0x89a43, + 0x259003, + 0x14ebf48, + 0xe1c8, + 0xf8945, + 0x120648, + 0x14b83, + 0xf8945, + 0x135884, + 0x47904, + 0x14ebf4a, + 0x120648, + 0xe6143, + 0x208e03, + 0x231103, + 0x213ec3, + 0x21d283, + 0x259003, + 0x2038c3, + 0x120648, + 0x208e03, + 0x231103, + 0x2dd584, + 0x259003, + 0x27ee05, + 0x35c204, + 0x208e03, + 0x21d283, + 0x259003, + 0xa5f4a, + 0x15aa8a, + 0x115e04, + 0x11c906, + 0x208e02, + 0x208e03, + 0x22e409, + 0x231103, + 0x21acc9, + 0x213ec3, + 0x270203, + 0x21d283, + 0x7b844, + 0x14b83, + 0x259003, + 0x2f5348, + 0x23e087, + 0x2fc845, + 0x1c7008, + 0x1b6947, + 0x3ec0a, + 0x10930b, + 0x144e87, + 0x41188, + 0x111d8a, + 0x12c88, + 0x107609, + 0x25cc7, + 0x153a47, + 0x1270c8, + 0x1cc688, + 0x4288f, + 0x1541c5, + 0x1cc987, + 0x42346, + 0x4c1c7, + 0x10e886, + 0x58dc8, + 0x9bec6, + 0x15d087, + 0x126089, + 0x1b7347, + 0x105649, + 0xb92c9, + 0xc20c6, + 0xc4e48, + 0xc30c5, + 0x7beca, + 0xce908, + 0x98403, + 0xd9708, + 0x31307, + 0x74845, + 0x61390, + 0x4a83, + 0xe6143, + 0x125f07, + 0x27745, + 0xee808, + 0x69445, + 0xd3a03, + 0x1688, + 0x56146, + 0x184e49, + 0xab547, + 0x19310b, + 0x142844, + 0x1063c4, + 0x10d4cb, + 0x10da88, + 0x10e507, + 0xf8945, + 0x208e03, + 0x231103, + 0x3d0943, + 0x259003, + 0x202103, + 0x213ec3, + 0xe6143, + 0x208e03, + 0x231103, + 0x213ec3, + 0x270203, + 0x21d283, + 0x259003, + 0x87fcb, + 0x2000c2, + 0x208e02, + 0x259003, + 0x120648, + 0x2000c2, + 0x208e02, + 0x200382, + 0x2005c2, + 0x200d02, + 0x21d283, + 0x2003c2, + 0x2000c2, + 0x38d8c3, + 0x208e02, + 0x208e03, + 0x231103, + 0x200382, + 0x213ec3, + 0x217383, + 0x270203, + 0x2bf144, + 0x21d283, + 0x213443, + 0x14b83, + 0x259003, + 0x2fbf44, + 0x202043, + 0x213ec3, + 0x208e02, + 0x208e03, + 0x231103, + 0x213ec3, + 0x270203, + 0x21d283, + 0x214b83, + 0x259003, + 0x3b9d47, + 0x208e03, + 0x20cd87, + 0x300c46, + 0x20ce43, + 0x217243, + 0x213ec3, + 0x203583, + 0x220a04, + 0x39cbc4, + 0x2eab46, + 0x20dd03, + 0x21d283, + 0x259003, + 0x27ee05, + 0x2ad7c4, + 0x2be803, + 0x20b103, + 0x2c9347, + 0x312745, + 0x208e03, + 0x231103, + 0x213ec3, + 0x270203, + 0x21d283, + 0x259003, + 0x4df07, + 0x8f4c7, + 0x1a3e85, + 0x205042, + 0x249283, + 0x214a43, + 0x38d8c3, + 0x6c608e03, + 0x20f982, + 0x231103, + 0x204a03, + 0x213ec3, + 0x220a04, + 0x307c83, + 0x38ab83, + 0x270203, + 0x2bf144, + 0x6ca08dc2, + 0x21d283, + 0x259003, + 0x22f583, + 0x219fc3, + 0x22a342, + 0x202043, + 0x120648, + 0x213ec3, + 0x11243, + 0x32be04, + 0x38d8c3, + 0x208e02, + 0x208e03, + 0x233e84, + 0x231103, + 0x213ec3, + 0x220a04, + 0x217383, + 0x30ffc4, + 0x20ac44, + 0x2dbd86, + 0x2bf144, + 0x21d283, + 0x259003, + 0x216203, + 0x250606, + 0x3978b, + 0x35d46, + 0x11f20a, + 0x11434a, + 0x120648, + 0x26dd04, + 0x6de08e03, + 0x38d884, + 0x231103, + 0x257384, + 0x213ec3, + 0x2bd9c3, + 0x270203, + 0x21d283, + 0xe6143, + 0x259003, + 0xca143, + 0x3433cb, + 0x3bfe4a, + 0x3d13cc, + 0xe40c8, + 0x2000c2, + 0x208e02, + 0x200382, + 0x22bec5, + 0x220a04, + 0x202302, + 0x270203, + 0x20ac44, + 0x201402, + 0x2003c2, + 0x211302, + 0x22a342, + 0x18d8c3, + 0x48182, + 0x2b6789, + 0x322748, + 0x213d49, + 0x217989, + 0x22420a, + 0x3184ca, + 0x208002, + 0x342382, + 0x8e02, + 0x208e03, + 0x22a502, + 0x242786, + 0x36fd82, + 0x213ac2, + 0x30968e, + 0x21614e, + 0x280507, + 0x21d207, + 0x282742, + 0x231103, + 0x213ec3, + 0x22aa02, + 0x2005c2, + 0x171c3, + 0x23408f, + 0x242ac2, + 0x2ae947, + 0x32a8c7, + 0x2b57c7, + 0x2e2e0c, + 0x2eadcc, + 0x226304, + 0x25eb0a, + 0x216082, + 0x206f42, + 0x2bac44, + 0x200702, + 0x214502, + 0x2eb004, + 0x213542, + 0x204c82, + 0x21303, + 0x29bf47, + 0x23d0c5, + 0x211602, + 0x24c144, + 0x327182, + 0x2e3988, + 0x21d283, + 0x2050c8, + 0x204882, + 0x2264c5, + 0x399b86, + 0x259003, + 0x2059c2, + 0x2ef587, + 0x2542, + 0x25cb85, + 0x210a45, + 0x209cc2, + 0x20ed02, + 0x2bc84a, + 0x29048a, + 0x2701c2, + 0x29a684, + 0x203a42, + 0x244f08, + 0x210602, + 0x365a88, + 0x30a0c7, + 0x30a689, + 0x205082, + 0x30edc5, + 0x206045, + 0x2214cb, + 0x2cc38c, + 0x22a008, + 0x32cf88, + 0x229542, + 0x2a61c2, + 0x2000c2, + 0x120648, + 0x208e02, + 0x208e03, + 0x200382, + 0x201402, + 0x14b83, + 0x2003c2, + 0x259003, + 0x211302, + 0x2000c2, + 0xf8945, + 0x6f208e02, + 0x6f613ec3, + 0x221303, + 0x202302, + 0x21d283, + 0x3d2403, + 0x6fa59003, + 0x2ec903, + 0x282786, + 0x1611303, + 0xf8945, + 0x187e4b, + 0x120648, + 0x6ff87, + 0x6e607, + 0x129cc5, + 0xa87cd, + 0xa6b8a, + 0x902c7, + 0x2a784, + 0x2a7c3, + 0xbb9c4, + 0x70203c82, + 0x70604342, + 0x70a02842, + 0x70e00fc2, + 0x7120aac2, + 0x71600f82, + 0xeb207, + 0x71a08e02, + 0x71e02282, + 0x7221de02, + 0x72608a42, + 0x216143, + 0x26744, + 0x22ea43, + 0x72a11482, + 0x5df88, + 0x72e06502, + 0x4fc87, + 0x73200042, + 0x73603482, + 0x73a00182, + 0x73e00d42, + 0x7420ad02, + 0x746005c2, + 0x13db85, + 0x223e43, + 0x311844, + 0x74a00702, + 0x74e14882, + 0x75200e42, + 0xb074b, + 0x75602d82, + 0x75e4eb42, + 0x76202302, + 0x76600d02, + 0x76a26942, + 0x76e01942, + 0x77202382, + 0x7766cac2, + 0x77a08dc2, + 0x77e035c2, + 0x78201402, + 0x78604fc2, + 0x78a08342, + 0x78e14002, + 0xe5f84, + 0x33e783, + 0x79221882, + 0x79615d82, + 0x79a100c2, + 0x79e006c2, + 0x7a2003c2, + 0x7a60a282, + 0x88147, + 0x7aa03b02, + 0x7ae02e02, + 0x7b211302, + 0x7b616102, + 0xfe7cc, + 0x7ba0fec2, + 0x7be1ea02, + 0x7c203382, + 0x7c604b02, + 0x7ca05ec2, + 0x7ce0fcc2, + 0x7d206582, + 0x7d610dc2, + 0x7da76e82, + 0x7de77402, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x75b07c83, + 0x2230c3, + 0x39e544, + 0x322646, + 0x2fa443, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x3b8109, + 0x248182, + 0x3a2e83, + 0x2b95c3, + 0x395545, + 0x204a03, + 0x307c83, + 0x2230c3, + 0x2a4003, + 0x238043, + 0x3c5649, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x307c83, + 0x2230c3, + 0x248182, + 0x248182, + 0x307c83, + 0x2230c3, + 0x7e608e03, + 0x231103, + 0x217bc3, + 0x270203, + 0x21d283, + 0x14b83, + 0x259003, + 0x120648, + 0x208e02, + 0x208e03, + 0x21d283, + 0x259003, + 0x208e03, + 0x231103, + 0x213ec3, + 0x270203, + 0x21d283, + 0x14b83, + 0x259003, + 0x245a04, + 0x208e02, + 0x208e03, + 0x392503, + 0x231103, + 0x24ea84, + 0x3d0943, + 0x213ec3, + 0x220a04, + 0x217383, + 0x270203, + 0x21d283, + 0x259003, + 0x202203, + 0x2fc845, + 0x238043, + 0x202043, + 0x14b83, + 0x208e02, + 0x208e03, + 0x307c83, + 0x21d283, + 0x259003, + 0x2000c2, + 0x38d8c3, + 0x120648, + 0x208e03, + 0x231103, + 0x213ec3, + 0x22d806, + 0x220a04, + 0x217383, + 0x2bf144, + 0x21d283, + 0x259003, + 0x216203, + 0x208e03, + 0x231103, + 0x21d283, + 0x259003, + 0x145c187, + 0x7d87, + 0x208e03, + 0x35d46, + 0x231103, + 0x213ec3, + 0xe4dc6, + 0x21d283, + 0x259003, + 0x32a0c8, + 0x32cdc9, + 0x33d349, + 0x344508, + 0x39bd08, + 0x39bd09, + 0x31de8a, + 0x3586ca, + 0x3977ca, + 0x39d78a, + 0x3bfe4a, + 0x3cb70b, + 0x2466cd, + 0x361b0f, + 0x272b90, + 0x35b30d, + 0x3761cc, + 0x39d4cb, + 0x6e808, + 0xfa948, + 0x100ec5, + 0xcd4c5, + 0x2000c2, + 0x312585, + 0x206083, + 0x81e08e02, + 0x231103, + 0x213ec3, + 0x37f707, + 0x2450c3, + 0x270203, + 0x21d283, + 0x24fc43, + 0x2090c3, + 0x214b83, + 0x259003, + 0x25c906, + 0x2022c2, + 0x202043, + 0x120648, + 0x2000c2, + 0x38d8c3, + 0x208e02, + 0x208e03, + 0x231103, + 0x213ec3, + 0x220a04, + 0x270203, + 0x21d283, + 0x259003, + 0x211303, + 0x18fb04, + 0x14f8106, + 0x2000c2, + 0x208e02, + 0x213ec3, + 0x270203, + 0x259003, +} + +// children is the list of nodes' children, the parent's wildcard bit and the +// parent's node type. If a node has no children then their children index +// will be in the range [0, 6), depending on the wildcard bit and node type. +// +// The layout within the uint32, from MSB to LSB, is: +// [ 1 bits] unused +// [ 1 bits] wildcard bit +// [ 2 bits] node type +// [14 bits] high nodes index (exclusive) of children +// [14 bits] low nodes index (inclusive) of children +var children = [...]uint32{ + 0x0, + 0x10000000, + 0x20000000, + 0x40000000, + 0x50000000, + 0x60000000, + 0x1864613, + 0x1868619, + 0x186c61a, + 0x189061b, + 0x19ec624, + 0x1a0467b, + 0x1a18681, + 0x1a2c686, + 0x1a4c68b, + 0x1a50693, + 0x1a68694, + 0x1a6c69a, + 0x1a9469b, + 0x1a986a5, + 0x1ab06a6, + 0x1ab46ac, + 0x1ab86ad, + 0x1af46ae, + 0x1af86bd, + 0x61b006be, + 0x21b086c0, + 0x1b506c2, + 0x1b546d4, + 0x1b746d5, + 0x1b886dd, + 0x1b8c6e2, + 0x1bbc6e3, + 0x1bd86ef, + 0x1c006f6, + 0x1c10700, + 0x1c14704, + 0x1cac705, + 0x1cc072b, + 0x1cd4730, + 0x1d04735, + 0x1d14741, + 0x1d28745, + 0x1dcc74a, + 0x1fc8773, + 0x1fcc7f2, + 0x20387f3, + 0x20a480e, + 0x20bc829, + 0x20d082f, + 0x20d8834, + 0x20ec836, + 0x20f083b, + 0x210c83c, + 0x2158843, + 0x2174856, + 0x217885d, + 0x217c85e, + 0x21a085f, + 0x21dc868, + 0x621e0877, + 0x21f8878, + 0x221087e, + 0x2218884, + 0x2228886, + 0x22d888a, + 0x22dc8b6, + 0x222ec8b7, + 0x222f08bb, + 0x222f48bc, + 0x23388bd, + 0x233c8ce, + 0x27f88cf, + 0x228a09fe, + 0x228a4a28, + 0x228a8a29, + 0x228b4a2a, + 0x228b8a2d, + 0x228c4a2e, + 0x228c8a31, + 0x228cca32, + 0x228d0a33, + 0x228d4a34, + 0x228d8a35, + 0x228e4a36, + 0x228e8a39, + 0x228f4a3a, + 0x228f8a3d, + 0x228fca3e, + 0x22900a3f, + 0x2290ca40, + 0x22910a43, + 0x2291ca44, + 0x22920a47, + 0x22924a48, + 0x22928a49, + 0x292ca4a, + 0x22930a4b, + 0x2293ca4c, + 0x22940a4f, + 0x2948a50, + 0x298ca52, + 0x229aca63, + 0x229b0a6b, + 0x229b4a6c, + 0x229b8a6d, + 0x29bca6e, + 0x229c0a6f, + 0x29c8a70, + 0x29cca72, + 0x29d0a73, + 0x29eca74, + 0x2a04a7b, + 0x2a08a81, + 0x2a18a82, + 0x2a24a86, + 0x2a58a89, + 0x2a5ca96, + 0x2a74a97, + 0x22a7ca9d, + 0x22a80a9f, + 0x22a88aa0, + 0x2b60aa2, + 0x22b64ad8, + 0x2b6cad9, + 0x2b70adb, + 0x22b74adc, + 0x2b78add, + 0x2b90ade, + 0x2ba4ae4, + 0x2bccae9, + 0x2becaf3, + 0x2c1cafb, + 0x2c44b07, + 0x2c48b11, + 0x2c6cb12, + 0x2c70b1b, + 0x2c84b1c, + 0x2c88b21, + 0x2c8cb22, + 0x2cacb23, + 0x2cc8b2b, + 0x2cccb32, + 0x22cd0b33, + 0x2cd4b34, + 0x2cd8b35, + 0x2ce8b36, + 0x2cecb3a, + 0x2d64b3b, + 0x2d68b59, + 0x2d6cb5a, + 0x2d8cb5b, + 0x2d9cb63, + 0x2db0b67, + 0x2dc8b6c, + 0x2de0b72, + 0x2df8b78, + 0x2dfcb7e, + 0x2e14b7f, + 0x2e30b85, + 0x2e50b8c, + 0x2e70b94, + 0x2e8cb9c, + 0x2eecba3, + 0x2f08bbb, + 0x2f18bc2, + 0x2f1cbc6, + 0x2f30bc7, + 0x2f74bcc, + 0x2ff4bdd, + 0x3024bfd, + 0x3028c09, + 0x3034c0a, + 0x3054c0d, + 0x3058c15, + 0x307cc16, + 0x3084c1f, + 0x30c0c21, + 0x3110c30, + 0x3114c44, + 0x319cc45, + 0x31a0c67, + 0x231a4c68, + 0x231a8c69, + 0x231acc6a, + 0x231bcc6b, + 0x231c0c6f, + 0x231c4c70, + 0x231c8c71, + 0x231ccc72, + 0x31e4c73, + 0x3208c79, + 0x3228c82, + 0x3890c8a, + 0x389ce24, + 0x38bce27, + 0x3a78e2f, + 0x3b48e9e, + 0x3bb8ed2, + 0x3c10eee, + 0x3cf8f04, + 0x3d50f3e, + 0x3d8cf54, + 0x3e88f63, + 0x3f54fa2, + 0x3fecfd5, + 0x407cffb, + 0x40e101f, + 0x4319038, + 0x43d10c6, + 0x449d0f4, + 0x44e9127, + 0x457113a, + 0x45ad15c, + 0x45fd16b, + 0x467517f, + 0x6467919d, + 0x6467d19e, + 0x6468119f, + 0x46fd1a0, + 0x47591bf, + 0x47d51d6, + 0x484d1f5, + 0x48cd213, + 0x4939233, + 0x4a6524e, + 0x4abd299, + 0x64ac12af, + 0x4b592b0, + 0x4be12d6, + 0x4c2d2f8, + 0x4c9530b, + 0x4d3d325, + 0x4e0534f, + 0x4e6d381, + 0x4f8139b, + 0x64f853e0, + 0x64f893e1, + 0x4fe53e2, + 0x50413f9, + 0x50d1410, + 0x514d434, + 0x5191453, + 0x5275464, + 0x52a949d, + 0x53094aa, + 0x537d4c2, + 0x54054df, + 0x5445501, + 0x54b5511, + 0x654b952d, + 0x54e152e, + 0x54e5538, + 0x54fd539, + 0x551953f, + 0x555d546, + 0x556d557, + 0x558555b, + 0x55fd561, + 0x560557f, + 0x5619581, + 0x5635586, + 0x566158d, + 0x5665598, + 0x566d599, + 0x568159b, + 0x56a15a0, + 0x56ad5a8, + 0x56b55ab, + 0x56f15ad, + 0x57055bc, + 0x570d5c1, + 0x57195c3, + 0x57215c6, + 0x57455c8, + 0x57695d1, + 0x57815da, + 0x57855e0, + 0x578d5e1, + 0x57915e3, + 0x580d5e4, + 0x5811603, + 0x5815604, + 0x5839605, + 0x585d60e, + 0x5879617, + 0x588d61e, + 0x58a1623, + 0x58a9628, + 0x58b162a, + 0x58c562c, + 0x58d5631, + 0x58d9635, + 0x58f5636, + 0x618563d, + 0x61bd861, + 0x61e986f, + 0x620587a, + 0x6225881, + 0x6245889, + 0x6289891, + 0x62918a2, + 0x262958a4, + 0x262998a5, + 0x62a18a6, + 0x64498a8, + 0x2644d912, + 0x2645d913, + 0x26465917, + 0x26471919, + 0x647591c, + 0x647991d, + 0x64a191e, + 0x64c9928, + 0x64cd932, + 0x6505933, + 0x6525941, + 0x707d949, + 0x7081c1f, + 0x7085c20, + 0x27089c21, + 0x708dc22, + 0x27091c23, + 0x7095c24, + 0x270a1c25, + 0x70a5c28, + 0x70a9c29, + 0x270adc2a, + 0x70b1c2b, + 0x270b9c2c, + 0x70bdc2e, + 0x70c1c2f, + 0x270d1c30, + 0x70d5c34, + 0x70d9c35, + 0x70ddc36, + 0x70e1c37, + 0x270e5c38, + 0x70e9c39, + 0x70edc3a, + 0x70f1c3b, + 0x70f5c3c, + 0x270fdc3d, + 0x7101c3f, + 0x7105c40, + 0x7109c41, + 0x2710dc42, + 0x7111c43, + 0x27119c44, + 0x2711dc46, + 0x7139c47, + 0x7149c4e, + 0x718dc52, + 0x7191c63, + 0x71b5c64, + 0x71b9c6d, + 0x71bdc6e, + 0x7365c6f, + 0x27369cd9, + 0x27371cda, + 0x27375cdc, + 0x27379cdd, + 0x7381cde, + 0x745dce0, + 0x27469d17, + 0x2746dd1a, + 0x27471d1b, + 0x27475d1c, + 0x7479d1d, + 0x74a5d1e, + 0x74a9d29, + 0x74cdd2a, + 0x74d9d33, + 0x74f9d36, + 0x74fdd3e, + 0x7535d3f, + 0x77cdd4d, + 0x7889df3, + 0x788de22, + 0x78a1e23, + 0x78d5e28, + 0x790de35, + 0x27911e43, + 0x792de44, + 0x7955e4b, + 0x7959e55, + 0x797de56, + 0x7999e5f, + 0x79c1e66, + 0x79d1e70, + 0x79d5e74, + 0x79d9e75, + 0x7a11e76, + 0x7a1de84, + 0x7a41e87, + 0x7ac1e90, + 0x27ac5eb0, + 0x7ad5eb1, + 0x7addeb5, + 0x7b01eb7, + 0x7b21ec0, + 0x7b35ec8, + 0x7b49ecd, + 0x7b4ded2, + 0x7b6ded3, + 0x7c11edb, + 0x7c2df04, + 0x7c51f0b, + 0x7c55f14, + 0x7c5df15, + 0x7c6df17, + 0x7c75f1b, + 0x7c89f1d, + 0x7ca9f22, + 0x7cb5f2a, + 0x7cc5f2d, + 0x7cfdf31, + 0x7dd1f3f, + 0x7dd5f74, + 0x7de9f75, + 0x7df1f7a, + 0x7e09f7c, + 0x7e0df82, + 0x7e19f83, + 0x7e1df86, + 0x7e39f87, + 0x7e79f8e, + 0x7e7df9e, + 0x7e9df9f, + 0x7eedfa7, + 0x7f09fbb, + 0x7f11fc2, + 0x7f65fc4, + 0x7f69fd9, + 0x7f6dfda, + 0x7f71fdb, + 0x7fb5fdc, + 0x7fc5fed, + 0x8005ff1, + 0x800a001, + 0x803a002, + 0x818200e, + 0x81aa060, + 0x81da06a, + 0x81f6076, + 0x81fe07d, + 0x820a07f, + 0x831e082, + 0x832a0c7, + 0x83360ca, + 0x83420cd, + 0x834e0d0, + 0x835a0d3, + 0x83660d6, + 0x83720d9, + 0x837e0dc, + 0x838a0df, + 0x83960e2, + 0x83a20e5, + 0x83ae0e8, + 0x83ba0eb, + 0x83c20ee, + 0x83ce0f0, + 0x83da0f3, + 0x83e60f6, + 0x83f20f9, + 0x83fe0fc, + 0x840a0ff, + 0x8416102, + 0x8422105, + 0x842e108, + 0x843a10b, + 0x844610e, + 0x8472111, + 0x847e11c, + 0x848a11f, + 0x8496122, + 0x84a2125, + 0x84ae128, + 0x84b612b, + 0x84c212d, + 0x84ce130, + 0x84da133, + 0x84e6136, + 0x84f2139, + 0x84fe13c, + 0x850a13f, + 0x8516142, + 0x8522145, + 0x852e148, + 0x853a14b, + 0x854614e, + 0x8552151, + 0x855a154, + 0x8566156, + 0x8572159, + 0x857e15c, + 0x858a15f, + 0x8596162, + 0x85a2165, + 0x85ae168, + 0x85ba16b, + 0x85be16e, + 0x85ca16f, + 0x85e6172, + 0x85ea179, + 0x85fa17a, + 0x861617e, + 0x865a185, + 0x865e196, + 0x8672197, + 0x86a619c, + 0x86b61a9, + 0x86da1ad, + 0x86f21b6, + 0x870a1bc, + 0x87221c2, + 0x87321c8, + 0x287761cc, + 0x877a1dd, + 0x87a61de, + 0x87ae1e9, + 0x87c21eb, +} + +// max children 522 (capacity 1023) +// max text offset 29878 (capacity 32767) +// max text length 36 (capacity 63) +// max hi 8688 (capacity 16383) +// max lo 8683 (capacity 16383) diff --git a/api/vendor/golang.org/x/net/publicsuffix/table_test.go b/api/vendor/golang.org/x/net/publicsuffix/table_test.go new file mode 100644 index 0000000..c05b8f2 --- /dev/null +++ b/api/vendor/golang.org/x/net/publicsuffix/table_test.go @@ -0,0 +1,17308 @@ +// generated by go run gen.go; DO NOT EDIT + +package publicsuffix + +var rules = [...]string{ + "ac", + "com.ac", + "edu.ac", + "gov.ac", + "net.ac", + "mil.ac", + "org.ac", + "ad", + "nom.ad", + "ae", + "co.ae", + "net.ae", + "org.ae", + "sch.ae", + "ac.ae", + "gov.ae", + "mil.ae", + "aero", + "accident-investigation.aero", + "accident-prevention.aero", + "aerobatic.aero", + "aeroclub.aero", + "aerodrome.aero", + "agents.aero", + "aircraft.aero", + "airline.aero", + "airport.aero", + "air-surveillance.aero", + "airtraffic.aero", + "air-traffic-control.aero", + "ambulance.aero", + "amusement.aero", + "association.aero", + "author.aero", + "ballooning.aero", + "broker.aero", + "caa.aero", + "cargo.aero", + "catering.aero", + "certification.aero", + "championship.aero", + "charter.aero", + "civilaviation.aero", + "club.aero", + "conference.aero", + "consultant.aero", + "consulting.aero", + "control.aero", + "council.aero", + "crew.aero", + "design.aero", + "dgca.aero", + "educator.aero", + "emergency.aero", + "engine.aero", + "engineer.aero", + "entertainment.aero", + "equipment.aero", + "exchange.aero", + "express.aero", + "federation.aero", + "flight.aero", + "freight.aero", + "fuel.aero", + "gliding.aero", + "government.aero", + "groundhandling.aero", + "group.aero", + "hanggliding.aero", + "homebuilt.aero", + "insurance.aero", + "journal.aero", + "journalist.aero", + "leasing.aero", + "logistics.aero", + "magazine.aero", + "maintenance.aero", + "media.aero", + "microlight.aero", + "modelling.aero", + "navigation.aero", + "parachuting.aero", + "paragliding.aero", + "passenger-association.aero", + "pilot.aero", + "press.aero", + "production.aero", + "recreation.aero", + "repbody.aero", + "res.aero", + "research.aero", + "rotorcraft.aero", + "safety.aero", + "scientist.aero", + "services.aero", + "show.aero", + "skydiving.aero", + "software.aero", + "student.aero", + "trader.aero", + "trading.aero", + "trainer.aero", + "union.aero", + "workinggroup.aero", + "works.aero", + "af", + "gov.af", + "com.af", + "org.af", + "net.af", + "edu.af", + "ag", + "com.ag", + "org.ag", + "net.ag", + "co.ag", + "nom.ag", + "ai", + "off.ai", + "com.ai", + "net.ai", + "org.ai", + "al", + "com.al", + "edu.al", + "gov.al", + "mil.al", + "net.al", + "org.al", + "am", + "ao", + "ed.ao", + "gv.ao", + "og.ao", + "co.ao", + "pb.ao", + "it.ao", + "aq", + "ar", + "com.ar", + "edu.ar", + "gob.ar", + "gov.ar", + "int.ar", + "mil.ar", + "musica.ar", + "net.ar", + "org.ar", + "tur.ar", + "arpa", + "e164.arpa", + "in-addr.arpa", + "ip6.arpa", + "iris.arpa", + "uri.arpa", + "urn.arpa", + "as", + "gov.as", + "asia", + "at", + "ac.at", + "co.at", + "gv.at", + "or.at", + "au", + "com.au", + "net.au", + "org.au", + "edu.au", + "gov.au", + "asn.au", + "id.au", + "info.au", + "conf.au", + "oz.au", + "act.au", + "nsw.au", + "nt.au", + "qld.au", + "sa.au", + "tas.au", + "vic.au", + "wa.au", + "act.edu.au", + "nsw.edu.au", + "nt.edu.au", + "qld.edu.au", + "sa.edu.au", + "tas.edu.au", + "vic.edu.au", + "wa.edu.au", + "qld.gov.au", + "sa.gov.au", + "tas.gov.au", + "vic.gov.au", + "wa.gov.au", + "aw", + "com.aw", + "ax", + "az", + "com.az", + "net.az", + "int.az", + "gov.az", + "org.az", + "edu.az", + "info.az", + "pp.az", + "mil.az", + "name.az", + "pro.az", + "biz.az", + "ba", + "com.ba", + "edu.ba", + "gov.ba", + "mil.ba", + "net.ba", + "org.ba", + "bb", + "biz.bb", + "co.bb", + "com.bb", + "edu.bb", + "gov.bb", + "info.bb", + "net.bb", + "org.bb", + "store.bb", + "tv.bb", + "*.bd", + "be", + "ac.be", + "bf", + "gov.bf", + "bg", + "a.bg", + "b.bg", + "c.bg", + "d.bg", + "e.bg", + "f.bg", + "g.bg", + "h.bg", + "i.bg", + "j.bg", + "k.bg", + "l.bg", + "m.bg", + "n.bg", + "o.bg", + "p.bg", + "q.bg", + "r.bg", + "s.bg", + "t.bg", + "u.bg", + "v.bg", + "w.bg", + "x.bg", + "y.bg", + "z.bg", + "0.bg", + "1.bg", + "2.bg", + "3.bg", + "4.bg", + "5.bg", + "6.bg", + "7.bg", + "8.bg", + "9.bg", + "bh", + "com.bh", + "edu.bh", + "net.bh", + "org.bh", + "gov.bh", + "bi", + "co.bi", + "com.bi", + "edu.bi", + "or.bi", + "org.bi", + "biz", + "bj", + "asso.bj", + "barreau.bj", + "gouv.bj", + "bm", + "com.bm", + "edu.bm", + "gov.bm", + "net.bm", + "org.bm", + "*.bn", + "bo", + "com.bo", + "edu.bo", + "gob.bo", + "int.bo", + "org.bo", + "net.bo", + "mil.bo", + "tv.bo", + "web.bo", + "academia.bo", + "agro.bo", + "arte.bo", + "blog.bo", + "bolivia.bo", + "ciencia.bo", + "cooperativa.bo", + "democracia.bo", + "deporte.bo", + "ecologia.bo", + "economia.bo", + "empresa.bo", + "indigena.bo", + "industria.bo", + "info.bo", + "medicina.bo", + "movimiento.bo", + "musica.bo", + "natural.bo", + "nombre.bo", + "noticias.bo", + "patria.bo", + "politica.bo", + "profesional.bo", + "plurinacional.bo", + "pueblo.bo", + "revista.bo", + "salud.bo", + "tecnologia.bo", + "tksat.bo", + "transporte.bo", + "wiki.bo", + "br", + "9guacu.br", + "abc.br", + "adm.br", + "adv.br", + "agr.br", + "aju.br", + "am.br", + "anani.br", + "aparecida.br", + "arq.br", + "art.br", + "ato.br", + "b.br", + "barueri.br", + "belem.br", + "bhz.br", + "bio.br", + "blog.br", + "bmd.br", + "boavista.br", + "bsb.br", + "campinagrande.br", + "campinas.br", + "caxias.br", + "cim.br", + "cng.br", + "cnt.br", + "com.br", + "contagem.br", + "coop.br", + "cri.br", + "cuiaba.br", + "curitiba.br", + "def.br", + "ecn.br", + "eco.br", + "edu.br", + "emp.br", + "eng.br", + "esp.br", + "etc.br", + "eti.br", + "far.br", + "feira.br", + "flog.br", + "floripa.br", + "fm.br", + "fnd.br", + "fortal.br", + "fot.br", + "foz.br", + "fst.br", + "g12.br", + "ggf.br", + "goiania.br", + "gov.br", + "ac.gov.br", + "al.gov.br", + "am.gov.br", + "ap.gov.br", + "ba.gov.br", + "ce.gov.br", + "df.gov.br", + "es.gov.br", + "go.gov.br", + "ma.gov.br", + "mg.gov.br", + "ms.gov.br", + "mt.gov.br", + "pa.gov.br", + "pb.gov.br", + "pe.gov.br", + "pi.gov.br", + "pr.gov.br", + "rj.gov.br", + "rn.gov.br", + "ro.gov.br", + "rr.gov.br", + "rs.gov.br", + "sc.gov.br", + "se.gov.br", + "sp.gov.br", + "to.gov.br", + "gru.br", + "imb.br", + "ind.br", + "inf.br", + "jab.br", + "jampa.br", + "jdf.br", + "joinville.br", + "jor.br", + "jus.br", + "leg.br", + "lel.br", + "londrina.br", + "macapa.br", + "maceio.br", + "manaus.br", + "maringa.br", + "mat.br", + "med.br", + "mil.br", + "morena.br", + "mp.br", + "mus.br", + "natal.br", + "net.br", + "niteroi.br", + "*.nom.br", + "not.br", + "ntr.br", + "odo.br", + "org.br", + "osasco.br", + "palmas.br", + "poa.br", + "ppg.br", + "pro.br", + "psc.br", + "psi.br", + "pvh.br", + "qsl.br", + "radio.br", + "rec.br", + "recife.br", + "ribeirao.br", + "rio.br", + "riobranco.br", + "riopreto.br", + "salvador.br", + "sampa.br", + "santamaria.br", + "santoandre.br", + "saobernardo.br", + "saogonca.br", + "sjc.br", + "slg.br", + "slz.br", + "sorocaba.br", + "srv.br", + "taxi.br", + "teo.br", + "the.br", + "tmp.br", + "trd.br", + "tur.br", + "tv.br", + "udi.br", + "vet.br", + "vix.br", + "vlog.br", + "wiki.br", + "zlg.br", + "bs", + "com.bs", + "net.bs", + "org.bs", + "edu.bs", + "gov.bs", + "bt", + "com.bt", + "edu.bt", + "gov.bt", + "net.bt", + "org.bt", + "bv", + "bw", + "co.bw", + "org.bw", + "by", + "gov.by", + "mil.by", + "com.by", + "of.by", + "bz", + "com.bz", + "net.bz", + "org.bz", + "edu.bz", + "gov.bz", + "ca", + "ab.ca", + "bc.ca", + "mb.ca", + "nb.ca", + "nf.ca", + "nl.ca", + "ns.ca", + "nt.ca", + "nu.ca", + "on.ca", + "pe.ca", + "qc.ca", + "sk.ca", + "yk.ca", + "gc.ca", + "cat", + "cc", + "cd", + "gov.cd", + "cf", + "cg", + "ch", + "ci", + "org.ci", + "or.ci", + "com.ci", + "co.ci", + "edu.ci", + "ed.ci", + "ac.ci", + "net.ci", + "go.ci", + "asso.ci", + "xn--aroport-bya.ci", + "int.ci", + "presse.ci", + "md.ci", + "gouv.ci", + "*.ck", + "!www.ck", + "cl", + "gov.cl", + "gob.cl", + "co.cl", + "mil.cl", + "cm", + "co.cm", + "com.cm", + "gov.cm", + "net.cm", + "cn", + "ac.cn", + "com.cn", + "edu.cn", + "gov.cn", + "net.cn", + "org.cn", + "mil.cn", + "xn--55qx5d.cn", + "xn--io0a7i.cn", + "xn--od0alg.cn", + "ah.cn", + "bj.cn", + "cq.cn", + "fj.cn", + "gd.cn", + "gs.cn", + "gz.cn", + "gx.cn", + "ha.cn", + "hb.cn", + "he.cn", + "hi.cn", + "hl.cn", + "hn.cn", + "jl.cn", + "js.cn", + "jx.cn", + "ln.cn", + "nm.cn", + "nx.cn", + "qh.cn", + "sc.cn", + "sd.cn", + "sh.cn", + "sn.cn", + "sx.cn", + "tj.cn", + "xj.cn", + "xz.cn", + "yn.cn", + "zj.cn", + "hk.cn", + "mo.cn", + "tw.cn", + "co", + "arts.co", + "com.co", + "edu.co", + "firm.co", + "gov.co", + "info.co", + "int.co", + "mil.co", + "net.co", + "nom.co", + "org.co", + "rec.co", + "web.co", + "com", + "coop", + "cr", + "ac.cr", + "co.cr", + "ed.cr", + "fi.cr", + "go.cr", + "or.cr", + "sa.cr", + "cu", + "com.cu", + "edu.cu", + "org.cu", + "net.cu", + "gov.cu", + "inf.cu", + "cv", + "cw", + "com.cw", + "edu.cw", + "net.cw", + "org.cw", + "cx", + "gov.cx", + "cy", + "ac.cy", + "biz.cy", + "com.cy", + "ekloges.cy", + "gov.cy", + "ltd.cy", + "name.cy", + "net.cy", + "org.cy", + "parliament.cy", + "press.cy", + "pro.cy", + "tm.cy", + "cz", + "de", + "dj", + "dk", + "dm", + "com.dm", + "net.dm", + "org.dm", + "edu.dm", + "gov.dm", + "do", + "art.do", + "com.do", + "edu.do", + "gob.do", + "gov.do", + "mil.do", + "net.do", + "org.do", + "sld.do", + "web.do", + "dz", + "com.dz", + "org.dz", + "net.dz", + "gov.dz", + "edu.dz", + "asso.dz", + "pol.dz", + "art.dz", + "ec", + "com.ec", + "info.ec", + "net.ec", + "fin.ec", + "k12.ec", + "med.ec", + "pro.ec", + "org.ec", + "edu.ec", + "gov.ec", + "gob.ec", + "mil.ec", + "edu", + "ee", + "edu.ee", + "gov.ee", + "riik.ee", + "lib.ee", + "med.ee", + "com.ee", + "pri.ee", + "aip.ee", + "org.ee", + "fie.ee", + "eg", + "com.eg", + "edu.eg", + "eun.eg", + "gov.eg", + "mil.eg", + "name.eg", + "net.eg", + "org.eg", + "sci.eg", + "*.er", + "es", + "com.es", + "nom.es", + "org.es", + "gob.es", + "edu.es", + "et", + "com.et", + "gov.et", + "org.et", + "edu.et", + "biz.et", + "name.et", + "info.et", + "net.et", + "eu", + "fi", + "aland.fi", + "*.fj", + "*.fk", + "fm", + "fo", + "fr", + "com.fr", + "asso.fr", + "nom.fr", + "prd.fr", + "presse.fr", + "tm.fr", + "aeroport.fr", + "assedic.fr", + "avocat.fr", + "avoues.fr", + "cci.fr", + "chambagri.fr", + "chirurgiens-dentistes.fr", + "experts-comptables.fr", + "geometre-expert.fr", + "gouv.fr", + "greta.fr", + "huissier-justice.fr", + "medecin.fr", + "notaires.fr", + "pharmacien.fr", + "port.fr", + "veterinaire.fr", + "ga", + "gb", + "gd", + "ge", + "com.ge", + "edu.ge", + "gov.ge", + "org.ge", + "mil.ge", + "net.ge", + "pvt.ge", + "gf", + "gg", + "co.gg", + "net.gg", + "org.gg", + "gh", + "com.gh", + "edu.gh", + "gov.gh", + "org.gh", + "mil.gh", + "gi", + "com.gi", + "ltd.gi", + "gov.gi", + "mod.gi", + "edu.gi", + "org.gi", + "gl", + "co.gl", + "com.gl", + "edu.gl", + "net.gl", + "org.gl", + "gm", + "gn", + "ac.gn", + "com.gn", + "edu.gn", + "gov.gn", + "org.gn", + "net.gn", + "gov", + "gp", + "com.gp", + "net.gp", + "mobi.gp", + "edu.gp", + "org.gp", + "asso.gp", + "gq", + "gr", + "com.gr", + "edu.gr", + "net.gr", + "org.gr", + "gov.gr", + "gs", + "gt", + "com.gt", + "edu.gt", + "gob.gt", + "ind.gt", + "mil.gt", + "net.gt", + "org.gt", + "gu", + "com.gu", + "edu.gu", + "gov.gu", + "guam.gu", + "info.gu", + "net.gu", + "org.gu", + "web.gu", + "gw", + "gy", + "co.gy", + "com.gy", + "edu.gy", + "gov.gy", + "net.gy", + "org.gy", + "hk", + "com.hk", + "edu.hk", + "gov.hk", + "idv.hk", + "net.hk", + "org.hk", + "xn--55qx5d.hk", + "xn--wcvs22d.hk", + "xn--lcvr32d.hk", + "xn--mxtq1m.hk", + "xn--gmqw5a.hk", + "xn--ciqpn.hk", + "xn--gmq050i.hk", + "xn--zf0avx.hk", + "xn--io0a7i.hk", + "xn--mk0axi.hk", + "xn--od0alg.hk", + "xn--od0aq3b.hk", + "xn--tn0ag.hk", + "xn--uc0atv.hk", + "xn--uc0ay4a.hk", + "hm", + "hn", + "com.hn", + "edu.hn", + "org.hn", + "net.hn", + "mil.hn", + "gob.hn", + "hr", + "iz.hr", + "from.hr", + "name.hr", + "com.hr", + "ht", + "com.ht", + "shop.ht", + "firm.ht", + "info.ht", + "adult.ht", + "net.ht", + "pro.ht", + "org.ht", + "med.ht", + "art.ht", + "coop.ht", + "pol.ht", + "asso.ht", + "edu.ht", + "rel.ht", + "gouv.ht", + "perso.ht", + "hu", + "co.hu", + "info.hu", + "org.hu", + "priv.hu", + "sport.hu", + "tm.hu", + "2000.hu", + "agrar.hu", + "bolt.hu", + "casino.hu", + "city.hu", + "erotica.hu", + "erotika.hu", + "film.hu", + "forum.hu", + "games.hu", + "hotel.hu", + "ingatlan.hu", + "jogasz.hu", + "konyvelo.hu", + "lakas.hu", + "media.hu", + "news.hu", + "reklam.hu", + "sex.hu", + "shop.hu", + "suli.hu", + "szex.hu", + "tozsde.hu", + "utazas.hu", + "video.hu", + "id", + "ac.id", + "biz.id", + "co.id", + "desa.id", + "go.id", + "mil.id", + "my.id", + "net.id", + "or.id", + "sch.id", + "web.id", + "ie", + "gov.ie", + "il", + "ac.il", + "co.il", + "gov.il", + "idf.il", + "k12.il", + "muni.il", + "net.il", + "org.il", + "im", + "ac.im", + "co.im", + "com.im", + "ltd.co.im", + "net.im", + "org.im", + "plc.co.im", + "tt.im", + "tv.im", + "in", + "co.in", + "firm.in", + "net.in", + "org.in", + "gen.in", + "ind.in", + "nic.in", + "ac.in", + "edu.in", + "res.in", + "gov.in", + "mil.in", + "info", + "int", + "eu.int", + "io", + "com.io", + "iq", + "gov.iq", + "edu.iq", + "mil.iq", + "com.iq", + "org.iq", + "net.iq", + "ir", + "ac.ir", + "co.ir", + "gov.ir", + "id.ir", + "net.ir", + "org.ir", + "sch.ir", + "xn--mgba3a4f16a.ir", + "xn--mgba3a4fra.ir", + "is", + "net.is", + "com.is", + "edu.is", + "gov.is", + "org.is", + "int.is", + "it", + "gov.it", + "edu.it", + "abr.it", + "abruzzo.it", + "aosta-valley.it", + "aostavalley.it", + "bas.it", + "basilicata.it", + "cal.it", + "calabria.it", + "cam.it", + "campania.it", + "emilia-romagna.it", + "emiliaromagna.it", + "emr.it", + "friuli-v-giulia.it", + "friuli-ve-giulia.it", + "friuli-vegiulia.it", + "friuli-venezia-giulia.it", + "friuli-veneziagiulia.it", + "friuli-vgiulia.it", + "friuliv-giulia.it", + "friulive-giulia.it", + "friulivegiulia.it", + "friulivenezia-giulia.it", + "friuliveneziagiulia.it", + "friulivgiulia.it", + "fvg.it", + "laz.it", + "lazio.it", + "lig.it", + "liguria.it", + "lom.it", + "lombardia.it", + "lombardy.it", + "lucania.it", + "mar.it", + "marche.it", + "mol.it", + "molise.it", + "piedmont.it", + "piemonte.it", + "pmn.it", + "pug.it", + "puglia.it", + "sar.it", + "sardegna.it", + "sardinia.it", + "sic.it", + "sicilia.it", + "sicily.it", + "taa.it", + "tos.it", + "toscana.it", + "trentin-sud-tirol.it", + "xn--trentin-sud-tirol-tsj.it", + "trentin-sudtirol.it", + "xn--trentin-sudtirol-b9i.it", + "trentin-sued-tirol.it", + "trentin-suedtirol.it", + "trentino-a-adige.it", + "trentino-aadige.it", + "trentino-alto-adige.it", + "trentino-altoadige.it", + "trentino-s-tirol.it", + "trentino-stirol.it", + "trentino-sud-tirol.it", + "xn--trentino-sud-tirol-dck.it", + "trentino-sudtirol.it", + "xn--trentino-sudtirol-usj.it", + "trentino-sued-tirol.it", + "trentino-suedtirol.it", + "trentino.it", + "trentinoa-adige.it", + "trentinoaadige.it", + "trentinoalto-adige.it", + "trentinoaltoadige.it", + "trentinos-tirol.it", + "trentinostirol.it", + "trentinosud-tirol.it", + "xn--trentinosud-tirol-tsj.it", + "trentinosudtirol.it", + "xn--trentinosudtirol-b9i.it", + "trentinosued-tirol.it", + "trentinosuedtirol.it", + "trentinsud-tirol.it", + "xn--trentinsud-tirol-98i.it", + "trentinsudtirol.it", + "xn--trentinsudtirol-rqi.it", + "trentinsued-tirol.it", + "trentinsuedtirol.it", + "tuscany.it", + "umb.it", + "umbria.it", + "val-d-aosta.it", + "val-daosta.it", + "vald-aosta.it", + "valdaosta.it", + "valle-aosta.it", + "valle-d-aosta.it", + "valle-daosta.it", + "valleaosta.it", + "valled-aosta.it", + "valledaosta.it", + "vallee-aoste.it", + "xn--vallee-aoste-i2g.it", + "vallee-d-aoste.it", + "xn--vallee-d-aoste-43h.it", + "valleeaoste.it", + "xn--valleeaoste-6jg.it", + "valleedaoste.it", + "xn--valleedaoste-i2g.it", + "vao.it", + "vda.it", + "ven.it", + "veneto.it", + "ag.it", + "agrigento.it", + "al.it", + "alessandria.it", + "alto-adige.it", + "altoadige.it", + "an.it", + "ancona.it", + "andria-barletta-trani.it", + "andria-trani-barletta.it", + "andriabarlettatrani.it", + "andriatranibarletta.it", + "ao.it", + "aosta.it", + "aoste.it", + "ap.it", + "aq.it", + "aquila.it", + "ar.it", + "arezzo.it", + "ascoli-piceno.it", + "ascolipiceno.it", + "asti.it", + "at.it", + "av.it", + "avellino.it", + "ba.it", + "balsan-sudtirol.it", + "xn--balsan-sudtirol-rqi.it", + "balsan-suedtirol.it", + "balsan.it", + "bari.it", + "barletta-trani-andria.it", + "barlettatraniandria.it", + "belluno.it", + "benevento.it", + "bergamo.it", + "bg.it", + "bi.it", + "biella.it", + "bl.it", + "bn.it", + "bo.it", + "bologna.it", + "bolzano-altoadige.it", + "bolzano.it", + "bozen-sudtirol.it", + "xn--bozen-sudtirol-76h.it", + "bozen-suedtirol.it", + "bozen.it", + "br.it", + "brescia.it", + "brindisi.it", + "bs.it", + "bt.it", + "bulsan-sudtirol.it", + "xn--bulsan-sudtirol-rqi.it", + "bulsan-suedtirol.it", + "bulsan.it", + "bz.it", + "ca.it", + "cagliari.it", + "caltanissetta.it", + "campidano-medio.it", + "campidanomedio.it", + "campobasso.it", + "carbonia-iglesias.it", + "carboniaiglesias.it", + "carrara-massa.it", + "carraramassa.it", + "caserta.it", + "catania.it", + "catanzaro.it", + "cb.it", + "ce.it", + "cesena-forli.it", + "xn--cesena-forli-c2g.it", + "cesenaforli.it", + "xn--cesenaforli-0jg.it", + "ch.it", + "chieti.it", + "ci.it", + "cl.it", + "cn.it", + "co.it", + "como.it", + "cosenza.it", + "cr.it", + "cremona.it", + "crotone.it", + "cs.it", + "ct.it", + "cuneo.it", + "cz.it", + "dell-ogliastra.it", + "dellogliastra.it", + "en.it", + "enna.it", + "fc.it", + "fe.it", + "fermo.it", + "ferrara.it", + "fg.it", + "fi.it", + "firenze.it", + "florence.it", + "fm.it", + "foggia.it", + "forli-cesena.it", + "xn--forli-cesena-41g.it", + "forlicesena.it", + "xn--forlicesena-ujg.it", + "fr.it", + "frosinone.it", + "ge.it", + "genoa.it", + "genova.it", + "go.it", + "gorizia.it", + "gr.it", + "grosseto.it", + "iglesias-carbonia.it", + "iglesiascarbonia.it", + "im.it", + "imperia.it", + "is.it", + "isernia.it", + "kr.it", + "la-spezia.it", + "laquila.it", + "laspezia.it", + "latina.it", + "lc.it", + "le.it", + "lecce.it", + "lecco.it", + "li.it", + "livorno.it", + "lo.it", + "lodi.it", + "lt.it", + "lu.it", + "lucca.it", + "macerata.it", + "mantova.it", + "massa-carrara.it", + "massacarrara.it", + "matera.it", + "mb.it", + "mc.it", + "me.it", + "medio-campidano.it", + "mediocampidano.it", + "messina.it", + "mi.it", + "milan.it", + "milano.it", + "mn.it", + "mo.it", + "modena.it", + "monza-brianza.it", + "monza-e-della-brianza.it", + "monza.it", + "monzabrianza.it", + "monzaebrianza.it", + "monzaedellabrianza.it", + "ms.it", + "mt.it", + "na.it", + "naples.it", + "napoli.it", + "no.it", + "novara.it", + "nu.it", + "nuoro.it", + "og.it", + "ogliastra.it", + "olbia-tempio.it", + "olbiatempio.it", + "or.it", + "oristano.it", + "ot.it", + "pa.it", + "padova.it", + "padua.it", + "palermo.it", + "parma.it", + "pavia.it", + "pc.it", + "pd.it", + "pe.it", + "perugia.it", + "pesaro-urbino.it", + "pesarourbino.it", + "pescara.it", + "pg.it", + "pi.it", + "piacenza.it", + "pisa.it", + "pistoia.it", + "pn.it", + "po.it", + "pordenone.it", + "potenza.it", + "pr.it", + "prato.it", + "pt.it", + "pu.it", + "pv.it", + "pz.it", + "ra.it", + "ragusa.it", + "ravenna.it", + "rc.it", + "re.it", + "reggio-calabria.it", + "reggio-emilia.it", + "reggiocalabria.it", + "reggioemilia.it", + "rg.it", + "ri.it", + "rieti.it", + "rimini.it", + "rm.it", + "rn.it", + "ro.it", + "roma.it", + "rome.it", + "rovigo.it", + "sa.it", + "salerno.it", + "sassari.it", + "savona.it", + "si.it", + "siena.it", + "siracusa.it", + "so.it", + "sondrio.it", + "sp.it", + "sr.it", + "ss.it", + "suedtirol.it", + "xn--sudtirol-y0e.it", + "sv.it", + "ta.it", + "taranto.it", + "te.it", + "tempio-olbia.it", + "tempioolbia.it", + "teramo.it", + "terni.it", + "tn.it", + "to.it", + "torino.it", + "tp.it", + "tr.it", + "trani-andria-barletta.it", + "trani-barletta-andria.it", + "traniandriabarletta.it", + "tranibarlettaandria.it", + "trapani.it", + "trento.it", + "treviso.it", + "trieste.it", + "ts.it", + "turin.it", + "tv.it", + "ud.it", + "udine.it", + "urbino-pesaro.it", + "urbinopesaro.it", + "va.it", + "varese.it", + "vb.it", + "vc.it", + "ve.it", + "venezia.it", + "venice.it", + "verbania.it", + "vercelli.it", + "verona.it", + "vi.it", + "vibo-valentia.it", + "vibovalentia.it", + "vicenza.it", + "viterbo.it", + "vr.it", + "vs.it", + "vt.it", + "vv.it", + "je", + "co.je", + "net.je", + "org.je", + "*.jm", + "jo", + "com.jo", + "org.jo", + "net.jo", + "edu.jo", + "sch.jo", + "gov.jo", + "mil.jo", + "name.jo", + "jobs", + "jp", + "ac.jp", + "ad.jp", + "co.jp", + "ed.jp", + "go.jp", + "gr.jp", + "lg.jp", + "ne.jp", + "or.jp", + "aichi.jp", + "akita.jp", + "aomori.jp", + "chiba.jp", + "ehime.jp", + "fukui.jp", + "fukuoka.jp", + "fukushima.jp", + "gifu.jp", + "gunma.jp", + "hiroshima.jp", + "hokkaido.jp", + "hyogo.jp", + "ibaraki.jp", + "ishikawa.jp", + "iwate.jp", + "kagawa.jp", + "kagoshima.jp", + "kanagawa.jp", + "kochi.jp", + "kumamoto.jp", + "kyoto.jp", + "mie.jp", + "miyagi.jp", + "miyazaki.jp", + "nagano.jp", + "nagasaki.jp", + "nara.jp", + "niigata.jp", + "oita.jp", + "okayama.jp", + "okinawa.jp", + "osaka.jp", + "saga.jp", + "saitama.jp", + "shiga.jp", + "shimane.jp", + "shizuoka.jp", + "tochigi.jp", + "tokushima.jp", + "tokyo.jp", + "tottori.jp", + "toyama.jp", + "wakayama.jp", + "yamagata.jp", + "yamaguchi.jp", + "yamanashi.jp", + "xn--4pvxs.jp", + "xn--vgu402c.jp", + "xn--c3s14m.jp", + "xn--f6qx53a.jp", + "xn--8pvr4u.jp", + "xn--uist22h.jp", + "xn--djrs72d6uy.jp", + "xn--mkru45i.jp", + "xn--0trq7p7nn.jp", + "xn--8ltr62k.jp", + "xn--2m4a15e.jp", + "xn--efvn9s.jp", + "xn--32vp30h.jp", + "xn--4it797k.jp", + "xn--1lqs71d.jp", + "xn--5rtp49c.jp", + "xn--5js045d.jp", + "xn--ehqz56n.jp", + "xn--1lqs03n.jp", + "xn--qqqt11m.jp", + "xn--kbrq7o.jp", + "xn--pssu33l.jp", + "xn--ntsq17g.jp", + "xn--uisz3g.jp", + "xn--6btw5a.jp", + "xn--1ctwo.jp", + "xn--6orx2r.jp", + "xn--rht61e.jp", + "xn--rht27z.jp", + "xn--djty4k.jp", + "xn--nit225k.jp", + "xn--rht3d.jp", + "xn--klty5x.jp", + "xn--kltx9a.jp", + "xn--kltp7d.jp", + "xn--uuwu58a.jp", + "xn--zbx025d.jp", + "xn--ntso0iqx3a.jp", + "xn--elqq16h.jp", + "xn--4it168d.jp", + "xn--klt787d.jp", + "xn--rny31h.jp", + "xn--7t0a264c.jp", + "xn--5rtq34k.jp", + "xn--k7yn95e.jp", + "xn--tor131o.jp", + "xn--d5qv7z876c.jp", + "*.kawasaki.jp", + "*.kitakyushu.jp", + "*.kobe.jp", + "*.nagoya.jp", + "*.sapporo.jp", + "*.sendai.jp", + "*.yokohama.jp", + "!city.kawasaki.jp", + "!city.kitakyushu.jp", + "!city.kobe.jp", + "!city.nagoya.jp", + "!city.sapporo.jp", + "!city.sendai.jp", + "!city.yokohama.jp", + "aisai.aichi.jp", + "ama.aichi.jp", + "anjo.aichi.jp", + "asuke.aichi.jp", + "chiryu.aichi.jp", + "chita.aichi.jp", + "fuso.aichi.jp", + "gamagori.aichi.jp", + "handa.aichi.jp", + "hazu.aichi.jp", + "hekinan.aichi.jp", + "higashiura.aichi.jp", + "ichinomiya.aichi.jp", + "inazawa.aichi.jp", + "inuyama.aichi.jp", + "isshiki.aichi.jp", + "iwakura.aichi.jp", + "kanie.aichi.jp", + "kariya.aichi.jp", + "kasugai.aichi.jp", + "kira.aichi.jp", + "kiyosu.aichi.jp", + "komaki.aichi.jp", + "konan.aichi.jp", + "kota.aichi.jp", + "mihama.aichi.jp", + "miyoshi.aichi.jp", + "nishio.aichi.jp", + "nisshin.aichi.jp", + "obu.aichi.jp", + "oguchi.aichi.jp", + "oharu.aichi.jp", + "okazaki.aichi.jp", + "owariasahi.aichi.jp", + "seto.aichi.jp", + "shikatsu.aichi.jp", + "shinshiro.aichi.jp", + "shitara.aichi.jp", + "tahara.aichi.jp", + "takahama.aichi.jp", + "tobishima.aichi.jp", + "toei.aichi.jp", + "togo.aichi.jp", + "tokai.aichi.jp", + "tokoname.aichi.jp", + "toyoake.aichi.jp", + "toyohashi.aichi.jp", + "toyokawa.aichi.jp", + "toyone.aichi.jp", + "toyota.aichi.jp", + "tsushima.aichi.jp", + "yatomi.aichi.jp", + "akita.akita.jp", + "daisen.akita.jp", + "fujisato.akita.jp", + "gojome.akita.jp", + "hachirogata.akita.jp", + "happou.akita.jp", + "higashinaruse.akita.jp", + "honjo.akita.jp", + "honjyo.akita.jp", + "ikawa.akita.jp", + "kamikoani.akita.jp", + "kamioka.akita.jp", + "katagami.akita.jp", + "kazuno.akita.jp", + "kitaakita.akita.jp", + "kosaka.akita.jp", + "kyowa.akita.jp", + "misato.akita.jp", + "mitane.akita.jp", + "moriyoshi.akita.jp", + "nikaho.akita.jp", + "noshiro.akita.jp", + "odate.akita.jp", + "oga.akita.jp", + "ogata.akita.jp", + "semboku.akita.jp", + "yokote.akita.jp", + "yurihonjo.akita.jp", + "aomori.aomori.jp", + "gonohe.aomori.jp", + "hachinohe.aomori.jp", + "hashikami.aomori.jp", + "hiranai.aomori.jp", + "hirosaki.aomori.jp", + "itayanagi.aomori.jp", + "kuroishi.aomori.jp", + "misawa.aomori.jp", + "mutsu.aomori.jp", + "nakadomari.aomori.jp", + "noheji.aomori.jp", + "oirase.aomori.jp", + "owani.aomori.jp", + "rokunohe.aomori.jp", + "sannohe.aomori.jp", + "shichinohe.aomori.jp", + "shingo.aomori.jp", + "takko.aomori.jp", + "towada.aomori.jp", + "tsugaru.aomori.jp", + "tsuruta.aomori.jp", + "abiko.chiba.jp", + "asahi.chiba.jp", + "chonan.chiba.jp", + "chosei.chiba.jp", + "choshi.chiba.jp", + "chuo.chiba.jp", + "funabashi.chiba.jp", + "futtsu.chiba.jp", + "hanamigawa.chiba.jp", + "ichihara.chiba.jp", + "ichikawa.chiba.jp", + "ichinomiya.chiba.jp", + "inzai.chiba.jp", + "isumi.chiba.jp", + "kamagaya.chiba.jp", + "kamogawa.chiba.jp", + "kashiwa.chiba.jp", + "katori.chiba.jp", + "katsuura.chiba.jp", + "kimitsu.chiba.jp", + "kisarazu.chiba.jp", + "kozaki.chiba.jp", + "kujukuri.chiba.jp", + "kyonan.chiba.jp", + "matsudo.chiba.jp", + "midori.chiba.jp", + "mihama.chiba.jp", + "minamiboso.chiba.jp", + "mobara.chiba.jp", + "mutsuzawa.chiba.jp", + "nagara.chiba.jp", + "nagareyama.chiba.jp", + "narashino.chiba.jp", + "narita.chiba.jp", + "noda.chiba.jp", + "oamishirasato.chiba.jp", + "omigawa.chiba.jp", + "onjuku.chiba.jp", + "otaki.chiba.jp", + "sakae.chiba.jp", + "sakura.chiba.jp", + "shimofusa.chiba.jp", + "shirako.chiba.jp", + "shiroi.chiba.jp", + "shisui.chiba.jp", + "sodegaura.chiba.jp", + "sosa.chiba.jp", + "tako.chiba.jp", + "tateyama.chiba.jp", + "togane.chiba.jp", + "tohnosho.chiba.jp", + "tomisato.chiba.jp", + "urayasu.chiba.jp", + "yachimata.chiba.jp", + "yachiyo.chiba.jp", + "yokaichiba.chiba.jp", + "yokoshibahikari.chiba.jp", + "yotsukaido.chiba.jp", + "ainan.ehime.jp", + "honai.ehime.jp", + "ikata.ehime.jp", + "imabari.ehime.jp", + "iyo.ehime.jp", + "kamijima.ehime.jp", + "kihoku.ehime.jp", + "kumakogen.ehime.jp", + "masaki.ehime.jp", + "matsuno.ehime.jp", + "matsuyama.ehime.jp", + "namikata.ehime.jp", + "niihama.ehime.jp", + "ozu.ehime.jp", + "saijo.ehime.jp", + "seiyo.ehime.jp", + "shikokuchuo.ehime.jp", + "tobe.ehime.jp", + "toon.ehime.jp", + "uchiko.ehime.jp", + "uwajima.ehime.jp", + "yawatahama.ehime.jp", + "echizen.fukui.jp", + "eiheiji.fukui.jp", + "fukui.fukui.jp", + "ikeda.fukui.jp", + "katsuyama.fukui.jp", + "mihama.fukui.jp", + "minamiechizen.fukui.jp", + "obama.fukui.jp", + "ohi.fukui.jp", + "ono.fukui.jp", + "sabae.fukui.jp", + "sakai.fukui.jp", + "takahama.fukui.jp", + "tsuruga.fukui.jp", + "wakasa.fukui.jp", + "ashiya.fukuoka.jp", + "buzen.fukuoka.jp", + "chikugo.fukuoka.jp", + "chikuho.fukuoka.jp", + "chikujo.fukuoka.jp", + "chikushino.fukuoka.jp", + "chikuzen.fukuoka.jp", + "chuo.fukuoka.jp", + "dazaifu.fukuoka.jp", + "fukuchi.fukuoka.jp", + "hakata.fukuoka.jp", + "higashi.fukuoka.jp", + "hirokawa.fukuoka.jp", + "hisayama.fukuoka.jp", + "iizuka.fukuoka.jp", + "inatsuki.fukuoka.jp", + "kaho.fukuoka.jp", + "kasuga.fukuoka.jp", + "kasuya.fukuoka.jp", + "kawara.fukuoka.jp", + "keisen.fukuoka.jp", + "koga.fukuoka.jp", + "kurate.fukuoka.jp", + "kurogi.fukuoka.jp", + "kurume.fukuoka.jp", + "minami.fukuoka.jp", + "miyako.fukuoka.jp", + "miyama.fukuoka.jp", + "miyawaka.fukuoka.jp", + "mizumaki.fukuoka.jp", + "munakata.fukuoka.jp", + "nakagawa.fukuoka.jp", + "nakama.fukuoka.jp", + "nishi.fukuoka.jp", + "nogata.fukuoka.jp", + "ogori.fukuoka.jp", + "okagaki.fukuoka.jp", + "okawa.fukuoka.jp", + "oki.fukuoka.jp", + "omuta.fukuoka.jp", + "onga.fukuoka.jp", + "onojo.fukuoka.jp", + "oto.fukuoka.jp", + "saigawa.fukuoka.jp", + "sasaguri.fukuoka.jp", + "shingu.fukuoka.jp", + "shinyoshitomi.fukuoka.jp", + "shonai.fukuoka.jp", + "soeda.fukuoka.jp", + "sue.fukuoka.jp", + "tachiarai.fukuoka.jp", + "tagawa.fukuoka.jp", + "takata.fukuoka.jp", + "toho.fukuoka.jp", + "toyotsu.fukuoka.jp", + "tsuiki.fukuoka.jp", + "ukiha.fukuoka.jp", + "umi.fukuoka.jp", + "usui.fukuoka.jp", + "yamada.fukuoka.jp", + "yame.fukuoka.jp", + "yanagawa.fukuoka.jp", + "yukuhashi.fukuoka.jp", + "aizubange.fukushima.jp", + "aizumisato.fukushima.jp", + "aizuwakamatsu.fukushima.jp", + "asakawa.fukushima.jp", + "bandai.fukushima.jp", + "date.fukushima.jp", + "fukushima.fukushima.jp", + "furudono.fukushima.jp", + "futaba.fukushima.jp", + "hanawa.fukushima.jp", + "higashi.fukushima.jp", + "hirata.fukushima.jp", + "hirono.fukushima.jp", + "iitate.fukushima.jp", + "inawashiro.fukushima.jp", + "ishikawa.fukushima.jp", + "iwaki.fukushima.jp", + "izumizaki.fukushima.jp", + "kagamiishi.fukushima.jp", + "kaneyama.fukushima.jp", + "kawamata.fukushima.jp", + "kitakata.fukushima.jp", + "kitashiobara.fukushima.jp", + "koori.fukushima.jp", + "koriyama.fukushima.jp", + "kunimi.fukushima.jp", + "miharu.fukushima.jp", + "mishima.fukushima.jp", + "namie.fukushima.jp", + "nango.fukushima.jp", + "nishiaizu.fukushima.jp", + "nishigo.fukushima.jp", + "okuma.fukushima.jp", + "omotego.fukushima.jp", + "ono.fukushima.jp", + "otama.fukushima.jp", + "samegawa.fukushima.jp", + "shimogo.fukushima.jp", + "shirakawa.fukushima.jp", + "showa.fukushima.jp", + "soma.fukushima.jp", + "sukagawa.fukushima.jp", + "taishin.fukushima.jp", + "tamakawa.fukushima.jp", + "tanagura.fukushima.jp", + "tenei.fukushima.jp", + "yabuki.fukushima.jp", + "yamato.fukushima.jp", + "yamatsuri.fukushima.jp", + "yanaizu.fukushima.jp", + "yugawa.fukushima.jp", + "anpachi.gifu.jp", + "ena.gifu.jp", + "gifu.gifu.jp", + "ginan.gifu.jp", + "godo.gifu.jp", + "gujo.gifu.jp", + "hashima.gifu.jp", + "hichiso.gifu.jp", + "hida.gifu.jp", + "higashishirakawa.gifu.jp", + "ibigawa.gifu.jp", + "ikeda.gifu.jp", + "kakamigahara.gifu.jp", + "kani.gifu.jp", + "kasahara.gifu.jp", + "kasamatsu.gifu.jp", + "kawaue.gifu.jp", + "kitagata.gifu.jp", + "mino.gifu.jp", + "minokamo.gifu.jp", + "mitake.gifu.jp", + "mizunami.gifu.jp", + "motosu.gifu.jp", + "nakatsugawa.gifu.jp", + "ogaki.gifu.jp", + "sakahogi.gifu.jp", + "seki.gifu.jp", + "sekigahara.gifu.jp", + "shirakawa.gifu.jp", + "tajimi.gifu.jp", + "takayama.gifu.jp", + "tarui.gifu.jp", + "toki.gifu.jp", + "tomika.gifu.jp", + "wanouchi.gifu.jp", + "yamagata.gifu.jp", + "yaotsu.gifu.jp", + "yoro.gifu.jp", + "annaka.gunma.jp", + "chiyoda.gunma.jp", + "fujioka.gunma.jp", + "higashiagatsuma.gunma.jp", + "isesaki.gunma.jp", + "itakura.gunma.jp", + "kanna.gunma.jp", + "kanra.gunma.jp", + "katashina.gunma.jp", + "kawaba.gunma.jp", + "kiryu.gunma.jp", + "kusatsu.gunma.jp", + "maebashi.gunma.jp", + "meiwa.gunma.jp", + "midori.gunma.jp", + "minakami.gunma.jp", + "naganohara.gunma.jp", + "nakanojo.gunma.jp", + "nanmoku.gunma.jp", + "numata.gunma.jp", + "oizumi.gunma.jp", + "ora.gunma.jp", + "ota.gunma.jp", + "shibukawa.gunma.jp", + "shimonita.gunma.jp", + "shinto.gunma.jp", + "showa.gunma.jp", + "takasaki.gunma.jp", + "takayama.gunma.jp", + "tamamura.gunma.jp", + "tatebayashi.gunma.jp", + "tomioka.gunma.jp", + "tsukiyono.gunma.jp", + "tsumagoi.gunma.jp", + "ueno.gunma.jp", + "yoshioka.gunma.jp", + "asaminami.hiroshima.jp", + "daiwa.hiroshima.jp", + "etajima.hiroshima.jp", + "fuchu.hiroshima.jp", + "fukuyama.hiroshima.jp", + "hatsukaichi.hiroshima.jp", + "higashihiroshima.hiroshima.jp", + "hongo.hiroshima.jp", + "jinsekikogen.hiroshima.jp", + "kaita.hiroshima.jp", + "kui.hiroshima.jp", + "kumano.hiroshima.jp", + "kure.hiroshima.jp", + "mihara.hiroshima.jp", + "miyoshi.hiroshima.jp", + "naka.hiroshima.jp", + "onomichi.hiroshima.jp", + "osakikamijima.hiroshima.jp", + "otake.hiroshima.jp", + "saka.hiroshima.jp", + "sera.hiroshima.jp", + "seranishi.hiroshima.jp", + "shinichi.hiroshima.jp", + "shobara.hiroshima.jp", + "takehara.hiroshima.jp", + "abashiri.hokkaido.jp", + "abira.hokkaido.jp", + "aibetsu.hokkaido.jp", + "akabira.hokkaido.jp", + "akkeshi.hokkaido.jp", + "asahikawa.hokkaido.jp", + "ashibetsu.hokkaido.jp", + "ashoro.hokkaido.jp", + "assabu.hokkaido.jp", + "atsuma.hokkaido.jp", + "bibai.hokkaido.jp", + "biei.hokkaido.jp", + "bifuka.hokkaido.jp", + "bihoro.hokkaido.jp", + "biratori.hokkaido.jp", + "chippubetsu.hokkaido.jp", + "chitose.hokkaido.jp", + "date.hokkaido.jp", + "ebetsu.hokkaido.jp", + "embetsu.hokkaido.jp", + "eniwa.hokkaido.jp", + "erimo.hokkaido.jp", + "esan.hokkaido.jp", + "esashi.hokkaido.jp", + "fukagawa.hokkaido.jp", + "fukushima.hokkaido.jp", + "furano.hokkaido.jp", + "furubira.hokkaido.jp", + "haboro.hokkaido.jp", + "hakodate.hokkaido.jp", + "hamatonbetsu.hokkaido.jp", + "hidaka.hokkaido.jp", + "higashikagura.hokkaido.jp", + "higashikawa.hokkaido.jp", + "hiroo.hokkaido.jp", + "hokuryu.hokkaido.jp", + "hokuto.hokkaido.jp", + "honbetsu.hokkaido.jp", + "horokanai.hokkaido.jp", + "horonobe.hokkaido.jp", + "ikeda.hokkaido.jp", + "imakane.hokkaido.jp", + "ishikari.hokkaido.jp", + "iwamizawa.hokkaido.jp", + "iwanai.hokkaido.jp", + "kamifurano.hokkaido.jp", + "kamikawa.hokkaido.jp", + "kamishihoro.hokkaido.jp", + "kamisunagawa.hokkaido.jp", + "kamoenai.hokkaido.jp", + "kayabe.hokkaido.jp", + "kembuchi.hokkaido.jp", + "kikonai.hokkaido.jp", + "kimobetsu.hokkaido.jp", + "kitahiroshima.hokkaido.jp", + "kitami.hokkaido.jp", + "kiyosato.hokkaido.jp", + "koshimizu.hokkaido.jp", + "kunneppu.hokkaido.jp", + "kuriyama.hokkaido.jp", + "kuromatsunai.hokkaido.jp", + "kushiro.hokkaido.jp", + "kutchan.hokkaido.jp", + "kyowa.hokkaido.jp", + "mashike.hokkaido.jp", + "matsumae.hokkaido.jp", + "mikasa.hokkaido.jp", + "minamifurano.hokkaido.jp", + "mombetsu.hokkaido.jp", + "moseushi.hokkaido.jp", + "mukawa.hokkaido.jp", + "muroran.hokkaido.jp", + "naie.hokkaido.jp", + "nakagawa.hokkaido.jp", + "nakasatsunai.hokkaido.jp", + "nakatombetsu.hokkaido.jp", + "nanae.hokkaido.jp", + "nanporo.hokkaido.jp", + "nayoro.hokkaido.jp", + "nemuro.hokkaido.jp", + "niikappu.hokkaido.jp", + "niki.hokkaido.jp", + "nishiokoppe.hokkaido.jp", + "noboribetsu.hokkaido.jp", + "numata.hokkaido.jp", + "obihiro.hokkaido.jp", + "obira.hokkaido.jp", + "oketo.hokkaido.jp", + "okoppe.hokkaido.jp", + "otaru.hokkaido.jp", + "otobe.hokkaido.jp", + "otofuke.hokkaido.jp", + "otoineppu.hokkaido.jp", + "oumu.hokkaido.jp", + "ozora.hokkaido.jp", + "pippu.hokkaido.jp", + "rankoshi.hokkaido.jp", + "rebun.hokkaido.jp", + "rikubetsu.hokkaido.jp", + "rishiri.hokkaido.jp", + "rishirifuji.hokkaido.jp", + "saroma.hokkaido.jp", + "sarufutsu.hokkaido.jp", + "shakotan.hokkaido.jp", + "shari.hokkaido.jp", + "shibecha.hokkaido.jp", + "shibetsu.hokkaido.jp", + "shikabe.hokkaido.jp", + "shikaoi.hokkaido.jp", + "shimamaki.hokkaido.jp", + "shimizu.hokkaido.jp", + "shimokawa.hokkaido.jp", + "shinshinotsu.hokkaido.jp", + "shintoku.hokkaido.jp", + "shiranuka.hokkaido.jp", + "shiraoi.hokkaido.jp", + "shiriuchi.hokkaido.jp", + "sobetsu.hokkaido.jp", + "sunagawa.hokkaido.jp", + "taiki.hokkaido.jp", + "takasu.hokkaido.jp", + "takikawa.hokkaido.jp", + "takinoue.hokkaido.jp", + "teshikaga.hokkaido.jp", + "tobetsu.hokkaido.jp", + "tohma.hokkaido.jp", + "tomakomai.hokkaido.jp", + "tomari.hokkaido.jp", + "toya.hokkaido.jp", + "toyako.hokkaido.jp", + "toyotomi.hokkaido.jp", + "toyoura.hokkaido.jp", + "tsubetsu.hokkaido.jp", + "tsukigata.hokkaido.jp", + "urakawa.hokkaido.jp", + "urausu.hokkaido.jp", + "uryu.hokkaido.jp", + "utashinai.hokkaido.jp", + "wakkanai.hokkaido.jp", + "wassamu.hokkaido.jp", + "yakumo.hokkaido.jp", + "yoichi.hokkaido.jp", + "aioi.hyogo.jp", + "akashi.hyogo.jp", + "ako.hyogo.jp", + "amagasaki.hyogo.jp", + "aogaki.hyogo.jp", + "asago.hyogo.jp", + "ashiya.hyogo.jp", + "awaji.hyogo.jp", + "fukusaki.hyogo.jp", + "goshiki.hyogo.jp", + "harima.hyogo.jp", + "himeji.hyogo.jp", + "ichikawa.hyogo.jp", + "inagawa.hyogo.jp", + "itami.hyogo.jp", + "kakogawa.hyogo.jp", + "kamigori.hyogo.jp", + "kamikawa.hyogo.jp", + "kasai.hyogo.jp", + "kasuga.hyogo.jp", + "kawanishi.hyogo.jp", + "miki.hyogo.jp", + "minamiawaji.hyogo.jp", + "nishinomiya.hyogo.jp", + "nishiwaki.hyogo.jp", + "ono.hyogo.jp", + "sanda.hyogo.jp", + "sannan.hyogo.jp", + "sasayama.hyogo.jp", + "sayo.hyogo.jp", + "shingu.hyogo.jp", + "shinonsen.hyogo.jp", + "shiso.hyogo.jp", + "sumoto.hyogo.jp", + "taishi.hyogo.jp", + "taka.hyogo.jp", + "takarazuka.hyogo.jp", + "takasago.hyogo.jp", + "takino.hyogo.jp", + "tamba.hyogo.jp", + "tatsuno.hyogo.jp", + "toyooka.hyogo.jp", + "yabu.hyogo.jp", + "yashiro.hyogo.jp", + "yoka.hyogo.jp", + "yokawa.hyogo.jp", + "ami.ibaraki.jp", + "asahi.ibaraki.jp", + "bando.ibaraki.jp", + "chikusei.ibaraki.jp", + "daigo.ibaraki.jp", + "fujishiro.ibaraki.jp", + "hitachi.ibaraki.jp", + "hitachinaka.ibaraki.jp", + "hitachiomiya.ibaraki.jp", + "hitachiota.ibaraki.jp", + "ibaraki.ibaraki.jp", + "ina.ibaraki.jp", + "inashiki.ibaraki.jp", + "itako.ibaraki.jp", + "iwama.ibaraki.jp", + "joso.ibaraki.jp", + "kamisu.ibaraki.jp", + "kasama.ibaraki.jp", + "kashima.ibaraki.jp", + "kasumigaura.ibaraki.jp", + "koga.ibaraki.jp", + "miho.ibaraki.jp", + "mito.ibaraki.jp", + "moriya.ibaraki.jp", + "naka.ibaraki.jp", + "namegata.ibaraki.jp", + "oarai.ibaraki.jp", + "ogawa.ibaraki.jp", + "omitama.ibaraki.jp", + "ryugasaki.ibaraki.jp", + "sakai.ibaraki.jp", + "sakuragawa.ibaraki.jp", + "shimodate.ibaraki.jp", + "shimotsuma.ibaraki.jp", + "shirosato.ibaraki.jp", + "sowa.ibaraki.jp", + "suifu.ibaraki.jp", + "takahagi.ibaraki.jp", + "tamatsukuri.ibaraki.jp", + "tokai.ibaraki.jp", + "tomobe.ibaraki.jp", + "tone.ibaraki.jp", + "toride.ibaraki.jp", + "tsuchiura.ibaraki.jp", + "tsukuba.ibaraki.jp", + "uchihara.ibaraki.jp", + "ushiku.ibaraki.jp", + "yachiyo.ibaraki.jp", + "yamagata.ibaraki.jp", + "yawara.ibaraki.jp", + "yuki.ibaraki.jp", + "anamizu.ishikawa.jp", + "hakui.ishikawa.jp", + "hakusan.ishikawa.jp", + "kaga.ishikawa.jp", + "kahoku.ishikawa.jp", + "kanazawa.ishikawa.jp", + "kawakita.ishikawa.jp", + "komatsu.ishikawa.jp", + "nakanoto.ishikawa.jp", + "nanao.ishikawa.jp", + "nomi.ishikawa.jp", + "nonoichi.ishikawa.jp", + "noto.ishikawa.jp", + "shika.ishikawa.jp", + "suzu.ishikawa.jp", + "tsubata.ishikawa.jp", + "tsurugi.ishikawa.jp", + "uchinada.ishikawa.jp", + "wajima.ishikawa.jp", + "fudai.iwate.jp", + "fujisawa.iwate.jp", + "hanamaki.iwate.jp", + "hiraizumi.iwate.jp", + "hirono.iwate.jp", + "ichinohe.iwate.jp", + "ichinoseki.iwate.jp", + "iwaizumi.iwate.jp", + "iwate.iwate.jp", + "joboji.iwate.jp", + "kamaishi.iwate.jp", + "kanegasaki.iwate.jp", + "karumai.iwate.jp", + "kawai.iwate.jp", + "kitakami.iwate.jp", + "kuji.iwate.jp", + "kunohe.iwate.jp", + "kuzumaki.iwate.jp", + "miyako.iwate.jp", + "mizusawa.iwate.jp", + "morioka.iwate.jp", + "ninohe.iwate.jp", + "noda.iwate.jp", + "ofunato.iwate.jp", + "oshu.iwate.jp", + "otsuchi.iwate.jp", + "rikuzentakata.iwate.jp", + "shiwa.iwate.jp", + "shizukuishi.iwate.jp", + "sumita.iwate.jp", + "tanohata.iwate.jp", + "tono.iwate.jp", + "yahaba.iwate.jp", + "yamada.iwate.jp", + "ayagawa.kagawa.jp", + "higashikagawa.kagawa.jp", + "kanonji.kagawa.jp", + "kotohira.kagawa.jp", + "manno.kagawa.jp", + "marugame.kagawa.jp", + "mitoyo.kagawa.jp", + "naoshima.kagawa.jp", + "sanuki.kagawa.jp", + "tadotsu.kagawa.jp", + "takamatsu.kagawa.jp", + "tonosho.kagawa.jp", + "uchinomi.kagawa.jp", + "utazu.kagawa.jp", + "zentsuji.kagawa.jp", + "akune.kagoshima.jp", + "amami.kagoshima.jp", + "hioki.kagoshima.jp", + "isa.kagoshima.jp", + "isen.kagoshima.jp", + "izumi.kagoshima.jp", + "kagoshima.kagoshima.jp", + "kanoya.kagoshima.jp", + "kawanabe.kagoshima.jp", + "kinko.kagoshima.jp", + "kouyama.kagoshima.jp", + "makurazaki.kagoshima.jp", + "matsumoto.kagoshima.jp", + "minamitane.kagoshima.jp", + "nakatane.kagoshima.jp", + "nishinoomote.kagoshima.jp", + "satsumasendai.kagoshima.jp", + "soo.kagoshima.jp", + "tarumizu.kagoshima.jp", + "yusui.kagoshima.jp", + "aikawa.kanagawa.jp", + "atsugi.kanagawa.jp", + "ayase.kanagawa.jp", + "chigasaki.kanagawa.jp", + "ebina.kanagawa.jp", + "fujisawa.kanagawa.jp", + "hadano.kanagawa.jp", + "hakone.kanagawa.jp", + "hiratsuka.kanagawa.jp", + "isehara.kanagawa.jp", + "kaisei.kanagawa.jp", + "kamakura.kanagawa.jp", + "kiyokawa.kanagawa.jp", + "matsuda.kanagawa.jp", + "minamiashigara.kanagawa.jp", + "miura.kanagawa.jp", + "nakai.kanagawa.jp", + "ninomiya.kanagawa.jp", + "odawara.kanagawa.jp", + "oi.kanagawa.jp", + "oiso.kanagawa.jp", + "sagamihara.kanagawa.jp", + "samukawa.kanagawa.jp", + "tsukui.kanagawa.jp", + "yamakita.kanagawa.jp", + "yamato.kanagawa.jp", + "yokosuka.kanagawa.jp", + "yugawara.kanagawa.jp", + "zama.kanagawa.jp", + "zushi.kanagawa.jp", + "aki.kochi.jp", + "geisei.kochi.jp", + "hidaka.kochi.jp", + "higashitsuno.kochi.jp", + "ino.kochi.jp", + "kagami.kochi.jp", + "kami.kochi.jp", + "kitagawa.kochi.jp", + "kochi.kochi.jp", + "mihara.kochi.jp", + "motoyama.kochi.jp", + "muroto.kochi.jp", + "nahari.kochi.jp", + "nakamura.kochi.jp", + "nankoku.kochi.jp", + "nishitosa.kochi.jp", + "niyodogawa.kochi.jp", + "ochi.kochi.jp", + "okawa.kochi.jp", + "otoyo.kochi.jp", + "otsuki.kochi.jp", + "sakawa.kochi.jp", + "sukumo.kochi.jp", + "susaki.kochi.jp", + "tosa.kochi.jp", + "tosashimizu.kochi.jp", + "toyo.kochi.jp", + "tsuno.kochi.jp", + "umaji.kochi.jp", + "yasuda.kochi.jp", + "yusuhara.kochi.jp", + "amakusa.kumamoto.jp", + "arao.kumamoto.jp", + "aso.kumamoto.jp", + "choyo.kumamoto.jp", + "gyokuto.kumamoto.jp", + "kamiamakusa.kumamoto.jp", + "kikuchi.kumamoto.jp", + "kumamoto.kumamoto.jp", + "mashiki.kumamoto.jp", + "mifune.kumamoto.jp", + "minamata.kumamoto.jp", + "minamioguni.kumamoto.jp", + "nagasu.kumamoto.jp", + "nishihara.kumamoto.jp", + "oguni.kumamoto.jp", + "ozu.kumamoto.jp", + "sumoto.kumamoto.jp", + "takamori.kumamoto.jp", + "uki.kumamoto.jp", + "uto.kumamoto.jp", + "yamaga.kumamoto.jp", + "yamato.kumamoto.jp", + "yatsushiro.kumamoto.jp", + "ayabe.kyoto.jp", + "fukuchiyama.kyoto.jp", + "higashiyama.kyoto.jp", + "ide.kyoto.jp", + "ine.kyoto.jp", + "joyo.kyoto.jp", + "kameoka.kyoto.jp", + "kamo.kyoto.jp", + "kita.kyoto.jp", + "kizu.kyoto.jp", + "kumiyama.kyoto.jp", + "kyotamba.kyoto.jp", + "kyotanabe.kyoto.jp", + "kyotango.kyoto.jp", + "maizuru.kyoto.jp", + "minami.kyoto.jp", + "minamiyamashiro.kyoto.jp", + "miyazu.kyoto.jp", + "muko.kyoto.jp", + "nagaokakyo.kyoto.jp", + "nakagyo.kyoto.jp", + "nantan.kyoto.jp", + "oyamazaki.kyoto.jp", + "sakyo.kyoto.jp", + "seika.kyoto.jp", + "tanabe.kyoto.jp", + "uji.kyoto.jp", + "ujitawara.kyoto.jp", + "wazuka.kyoto.jp", + "yamashina.kyoto.jp", + "yawata.kyoto.jp", + "asahi.mie.jp", + "inabe.mie.jp", + "ise.mie.jp", + "kameyama.mie.jp", + "kawagoe.mie.jp", + "kiho.mie.jp", + "kisosaki.mie.jp", + "kiwa.mie.jp", + "komono.mie.jp", + "kumano.mie.jp", + "kuwana.mie.jp", + "matsusaka.mie.jp", + "meiwa.mie.jp", + "mihama.mie.jp", + "minamiise.mie.jp", + "misugi.mie.jp", + "miyama.mie.jp", + "nabari.mie.jp", + "shima.mie.jp", + "suzuka.mie.jp", + "tado.mie.jp", + "taiki.mie.jp", + "taki.mie.jp", + "tamaki.mie.jp", + "toba.mie.jp", + "tsu.mie.jp", + "udono.mie.jp", + "ureshino.mie.jp", + "watarai.mie.jp", + "yokkaichi.mie.jp", + "furukawa.miyagi.jp", + "higashimatsushima.miyagi.jp", + "ishinomaki.miyagi.jp", + "iwanuma.miyagi.jp", + "kakuda.miyagi.jp", + "kami.miyagi.jp", + "kawasaki.miyagi.jp", + "marumori.miyagi.jp", + "matsushima.miyagi.jp", + "minamisanriku.miyagi.jp", + "misato.miyagi.jp", + "murata.miyagi.jp", + "natori.miyagi.jp", + "ogawara.miyagi.jp", + "ohira.miyagi.jp", + "onagawa.miyagi.jp", + "osaki.miyagi.jp", + "rifu.miyagi.jp", + "semine.miyagi.jp", + "shibata.miyagi.jp", + "shichikashuku.miyagi.jp", + "shikama.miyagi.jp", + "shiogama.miyagi.jp", + "shiroishi.miyagi.jp", + "tagajo.miyagi.jp", + "taiwa.miyagi.jp", + "tome.miyagi.jp", + "tomiya.miyagi.jp", + "wakuya.miyagi.jp", + "watari.miyagi.jp", + "yamamoto.miyagi.jp", + "zao.miyagi.jp", + "aya.miyazaki.jp", + "ebino.miyazaki.jp", + "gokase.miyazaki.jp", + "hyuga.miyazaki.jp", + "kadogawa.miyazaki.jp", + "kawaminami.miyazaki.jp", + "kijo.miyazaki.jp", + "kitagawa.miyazaki.jp", + "kitakata.miyazaki.jp", + "kitaura.miyazaki.jp", + "kobayashi.miyazaki.jp", + "kunitomi.miyazaki.jp", + "kushima.miyazaki.jp", + "mimata.miyazaki.jp", + "miyakonojo.miyazaki.jp", + "miyazaki.miyazaki.jp", + "morotsuka.miyazaki.jp", + "nichinan.miyazaki.jp", + "nishimera.miyazaki.jp", + "nobeoka.miyazaki.jp", + "saito.miyazaki.jp", + "shiiba.miyazaki.jp", + "shintomi.miyazaki.jp", + "takaharu.miyazaki.jp", + "takanabe.miyazaki.jp", + "takazaki.miyazaki.jp", + "tsuno.miyazaki.jp", + "achi.nagano.jp", + "agematsu.nagano.jp", + "anan.nagano.jp", + "aoki.nagano.jp", + "asahi.nagano.jp", + "azumino.nagano.jp", + "chikuhoku.nagano.jp", + "chikuma.nagano.jp", + "chino.nagano.jp", + "fujimi.nagano.jp", + "hakuba.nagano.jp", + "hara.nagano.jp", + "hiraya.nagano.jp", + "iida.nagano.jp", + "iijima.nagano.jp", + "iiyama.nagano.jp", + "iizuna.nagano.jp", + "ikeda.nagano.jp", + "ikusaka.nagano.jp", + "ina.nagano.jp", + "karuizawa.nagano.jp", + "kawakami.nagano.jp", + "kiso.nagano.jp", + "kisofukushima.nagano.jp", + "kitaaiki.nagano.jp", + "komagane.nagano.jp", + "komoro.nagano.jp", + "matsukawa.nagano.jp", + "matsumoto.nagano.jp", + "miasa.nagano.jp", + "minamiaiki.nagano.jp", + "minamimaki.nagano.jp", + "minamiminowa.nagano.jp", + "minowa.nagano.jp", + "miyada.nagano.jp", + "miyota.nagano.jp", + "mochizuki.nagano.jp", + "nagano.nagano.jp", + "nagawa.nagano.jp", + "nagiso.nagano.jp", + "nakagawa.nagano.jp", + "nakano.nagano.jp", + "nozawaonsen.nagano.jp", + "obuse.nagano.jp", + "ogawa.nagano.jp", + "okaya.nagano.jp", + "omachi.nagano.jp", + "omi.nagano.jp", + "ookuwa.nagano.jp", + "ooshika.nagano.jp", + "otaki.nagano.jp", + "otari.nagano.jp", + "sakae.nagano.jp", + "sakaki.nagano.jp", + "saku.nagano.jp", + "sakuho.nagano.jp", + "shimosuwa.nagano.jp", + "shinanomachi.nagano.jp", + "shiojiri.nagano.jp", + "suwa.nagano.jp", + "suzaka.nagano.jp", + "takagi.nagano.jp", + "takamori.nagano.jp", + "takayama.nagano.jp", + "tateshina.nagano.jp", + "tatsuno.nagano.jp", + "togakushi.nagano.jp", + "togura.nagano.jp", + "tomi.nagano.jp", + "ueda.nagano.jp", + "wada.nagano.jp", + "yamagata.nagano.jp", + "yamanouchi.nagano.jp", + "yasaka.nagano.jp", + "yasuoka.nagano.jp", + "chijiwa.nagasaki.jp", + "futsu.nagasaki.jp", + "goto.nagasaki.jp", + "hasami.nagasaki.jp", + "hirado.nagasaki.jp", + "iki.nagasaki.jp", + "isahaya.nagasaki.jp", + "kawatana.nagasaki.jp", + "kuchinotsu.nagasaki.jp", + "matsuura.nagasaki.jp", + "nagasaki.nagasaki.jp", + "obama.nagasaki.jp", + "omura.nagasaki.jp", + "oseto.nagasaki.jp", + "saikai.nagasaki.jp", + "sasebo.nagasaki.jp", + "seihi.nagasaki.jp", + "shimabara.nagasaki.jp", + "shinkamigoto.nagasaki.jp", + "togitsu.nagasaki.jp", + "tsushima.nagasaki.jp", + "unzen.nagasaki.jp", + "ando.nara.jp", + "gose.nara.jp", + "heguri.nara.jp", + "higashiyoshino.nara.jp", + "ikaruga.nara.jp", + "ikoma.nara.jp", + "kamikitayama.nara.jp", + "kanmaki.nara.jp", + "kashiba.nara.jp", + "kashihara.nara.jp", + "katsuragi.nara.jp", + "kawai.nara.jp", + "kawakami.nara.jp", + "kawanishi.nara.jp", + "koryo.nara.jp", + "kurotaki.nara.jp", + "mitsue.nara.jp", + "miyake.nara.jp", + "nara.nara.jp", + "nosegawa.nara.jp", + "oji.nara.jp", + "ouda.nara.jp", + "oyodo.nara.jp", + "sakurai.nara.jp", + "sango.nara.jp", + "shimoichi.nara.jp", + "shimokitayama.nara.jp", + "shinjo.nara.jp", + "soni.nara.jp", + "takatori.nara.jp", + "tawaramoto.nara.jp", + "tenkawa.nara.jp", + "tenri.nara.jp", + "uda.nara.jp", + "yamatokoriyama.nara.jp", + "yamatotakada.nara.jp", + "yamazoe.nara.jp", + "yoshino.nara.jp", + "aga.niigata.jp", + "agano.niigata.jp", + "gosen.niigata.jp", + "itoigawa.niigata.jp", + "izumozaki.niigata.jp", + "joetsu.niigata.jp", + "kamo.niigata.jp", + "kariwa.niigata.jp", + "kashiwazaki.niigata.jp", + "minamiuonuma.niigata.jp", + "mitsuke.niigata.jp", + "muika.niigata.jp", + "murakami.niigata.jp", + "myoko.niigata.jp", + "nagaoka.niigata.jp", + "niigata.niigata.jp", + "ojiya.niigata.jp", + "omi.niigata.jp", + "sado.niigata.jp", + "sanjo.niigata.jp", + "seiro.niigata.jp", + "seirou.niigata.jp", + "sekikawa.niigata.jp", + "shibata.niigata.jp", + "tagami.niigata.jp", + "tainai.niigata.jp", + "tochio.niigata.jp", + "tokamachi.niigata.jp", + "tsubame.niigata.jp", + "tsunan.niigata.jp", + "uonuma.niigata.jp", + "yahiko.niigata.jp", + "yoita.niigata.jp", + "yuzawa.niigata.jp", + "beppu.oita.jp", + "bungoono.oita.jp", + "bungotakada.oita.jp", + "hasama.oita.jp", + "hiji.oita.jp", + "himeshima.oita.jp", + "hita.oita.jp", + "kamitsue.oita.jp", + "kokonoe.oita.jp", + "kuju.oita.jp", + "kunisaki.oita.jp", + "kusu.oita.jp", + "oita.oita.jp", + "saiki.oita.jp", + "taketa.oita.jp", + "tsukumi.oita.jp", + "usa.oita.jp", + "usuki.oita.jp", + "yufu.oita.jp", + "akaiwa.okayama.jp", + "asakuchi.okayama.jp", + "bizen.okayama.jp", + "hayashima.okayama.jp", + "ibara.okayama.jp", + "kagamino.okayama.jp", + "kasaoka.okayama.jp", + "kibichuo.okayama.jp", + "kumenan.okayama.jp", + "kurashiki.okayama.jp", + "maniwa.okayama.jp", + "misaki.okayama.jp", + "nagi.okayama.jp", + "niimi.okayama.jp", + "nishiawakura.okayama.jp", + "okayama.okayama.jp", + "satosho.okayama.jp", + "setouchi.okayama.jp", + "shinjo.okayama.jp", + "shoo.okayama.jp", + "soja.okayama.jp", + "takahashi.okayama.jp", + "tamano.okayama.jp", + "tsuyama.okayama.jp", + "wake.okayama.jp", + "yakage.okayama.jp", + "aguni.okinawa.jp", + "ginowan.okinawa.jp", + "ginoza.okinawa.jp", + "gushikami.okinawa.jp", + "haebaru.okinawa.jp", + "higashi.okinawa.jp", + "hirara.okinawa.jp", + "iheya.okinawa.jp", + "ishigaki.okinawa.jp", + "ishikawa.okinawa.jp", + "itoman.okinawa.jp", + "izena.okinawa.jp", + "kadena.okinawa.jp", + "kin.okinawa.jp", + "kitadaito.okinawa.jp", + "kitanakagusuku.okinawa.jp", + "kumejima.okinawa.jp", + "kunigami.okinawa.jp", + "minamidaito.okinawa.jp", + "motobu.okinawa.jp", + "nago.okinawa.jp", + "naha.okinawa.jp", + "nakagusuku.okinawa.jp", + "nakijin.okinawa.jp", + "nanjo.okinawa.jp", + "nishihara.okinawa.jp", + "ogimi.okinawa.jp", + "okinawa.okinawa.jp", + "onna.okinawa.jp", + "shimoji.okinawa.jp", + "taketomi.okinawa.jp", + "tarama.okinawa.jp", + "tokashiki.okinawa.jp", + "tomigusuku.okinawa.jp", + "tonaki.okinawa.jp", + "urasoe.okinawa.jp", + "uruma.okinawa.jp", + "yaese.okinawa.jp", + "yomitan.okinawa.jp", + "yonabaru.okinawa.jp", + "yonaguni.okinawa.jp", + "zamami.okinawa.jp", + "abeno.osaka.jp", + "chihayaakasaka.osaka.jp", + "chuo.osaka.jp", + "daito.osaka.jp", + "fujiidera.osaka.jp", + "habikino.osaka.jp", + "hannan.osaka.jp", + "higashiosaka.osaka.jp", + "higashisumiyoshi.osaka.jp", + "higashiyodogawa.osaka.jp", + "hirakata.osaka.jp", + "ibaraki.osaka.jp", + "ikeda.osaka.jp", + "izumi.osaka.jp", + "izumiotsu.osaka.jp", + "izumisano.osaka.jp", + "kadoma.osaka.jp", + "kaizuka.osaka.jp", + "kanan.osaka.jp", + "kashiwara.osaka.jp", + "katano.osaka.jp", + "kawachinagano.osaka.jp", + "kishiwada.osaka.jp", + "kita.osaka.jp", + "kumatori.osaka.jp", + "matsubara.osaka.jp", + "minato.osaka.jp", + "minoh.osaka.jp", + "misaki.osaka.jp", + "moriguchi.osaka.jp", + "neyagawa.osaka.jp", + "nishi.osaka.jp", + "nose.osaka.jp", + "osakasayama.osaka.jp", + "sakai.osaka.jp", + "sayama.osaka.jp", + "sennan.osaka.jp", + "settsu.osaka.jp", + "shijonawate.osaka.jp", + "shimamoto.osaka.jp", + "suita.osaka.jp", + "tadaoka.osaka.jp", + "taishi.osaka.jp", + "tajiri.osaka.jp", + "takaishi.osaka.jp", + "takatsuki.osaka.jp", + "tondabayashi.osaka.jp", + "toyonaka.osaka.jp", + "toyono.osaka.jp", + "yao.osaka.jp", + "ariake.saga.jp", + "arita.saga.jp", + "fukudomi.saga.jp", + "genkai.saga.jp", + "hamatama.saga.jp", + "hizen.saga.jp", + "imari.saga.jp", + "kamimine.saga.jp", + "kanzaki.saga.jp", + "karatsu.saga.jp", + "kashima.saga.jp", + "kitagata.saga.jp", + "kitahata.saga.jp", + "kiyama.saga.jp", + "kouhoku.saga.jp", + "kyuragi.saga.jp", + "nishiarita.saga.jp", + "ogi.saga.jp", + "omachi.saga.jp", + "ouchi.saga.jp", + "saga.saga.jp", + "shiroishi.saga.jp", + "taku.saga.jp", + "tara.saga.jp", + "tosu.saga.jp", + "yoshinogari.saga.jp", + "arakawa.saitama.jp", + "asaka.saitama.jp", + "chichibu.saitama.jp", + "fujimi.saitama.jp", + "fujimino.saitama.jp", + "fukaya.saitama.jp", + "hanno.saitama.jp", + "hanyu.saitama.jp", + "hasuda.saitama.jp", + "hatogaya.saitama.jp", + "hatoyama.saitama.jp", + "hidaka.saitama.jp", + "higashichichibu.saitama.jp", + "higashimatsuyama.saitama.jp", + "honjo.saitama.jp", + "ina.saitama.jp", + "iruma.saitama.jp", + "iwatsuki.saitama.jp", + "kamiizumi.saitama.jp", + "kamikawa.saitama.jp", + "kamisato.saitama.jp", + "kasukabe.saitama.jp", + "kawagoe.saitama.jp", + "kawaguchi.saitama.jp", + "kawajima.saitama.jp", + "kazo.saitama.jp", + "kitamoto.saitama.jp", + "koshigaya.saitama.jp", + "kounosu.saitama.jp", + "kuki.saitama.jp", + "kumagaya.saitama.jp", + "matsubushi.saitama.jp", + "minano.saitama.jp", + "misato.saitama.jp", + "miyashiro.saitama.jp", + "miyoshi.saitama.jp", + "moroyama.saitama.jp", + "nagatoro.saitama.jp", + "namegawa.saitama.jp", + "niiza.saitama.jp", + "ogano.saitama.jp", + "ogawa.saitama.jp", + "ogose.saitama.jp", + "okegawa.saitama.jp", + "omiya.saitama.jp", + "otaki.saitama.jp", + "ranzan.saitama.jp", + "ryokami.saitama.jp", + "saitama.saitama.jp", + "sakado.saitama.jp", + "satte.saitama.jp", + "sayama.saitama.jp", + "shiki.saitama.jp", + "shiraoka.saitama.jp", + "soka.saitama.jp", + "sugito.saitama.jp", + "toda.saitama.jp", + "tokigawa.saitama.jp", + "tokorozawa.saitama.jp", + "tsurugashima.saitama.jp", + "urawa.saitama.jp", + "warabi.saitama.jp", + "yashio.saitama.jp", + "yokoze.saitama.jp", + "yono.saitama.jp", + "yorii.saitama.jp", + "yoshida.saitama.jp", + "yoshikawa.saitama.jp", + "yoshimi.saitama.jp", + "aisho.shiga.jp", + "gamo.shiga.jp", + "higashiomi.shiga.jp", + "hikone.shiga.jp", + "koka.shiga.jp", + "konan.shiga.jp", + "kosei.shiga.jp", + "koto.shiga.jp", + "kusatsu.shiga.jp", + "maibara.shiga.jp", + "moriyama.shiga.jp", + "nagahama.shiga.jp", + "nishiazai.shiga.jp", + "notogawa.shiga.jp", + "omihachiman.shiga.jp", + "otsu.shiga.jp", + "ritto.shiga.jp", + "ryuoh.shiga.jp", + "takashima.shiga.jp", + "takatsuki.shiga.jp", + "torahime.shiga.jp", + "toyosato.shiga.jp", + "yasu.shiga.jp", + "akagi.shimane.jp", + "ama.shimane.jp", + "gotsu.shimane.jp", + "hamada.shimane.jp", + "higashiizumo.shimane.jp", + "hikawa.shimane.jp", + "hikimi.shimane.jp", + "izumo.shimane.jp", + "kakinoki.shimane.jp", + "masuda.shimane.jp", + "matsue.shimane.jp", + "misato.shimane.jp", + "nishinoshima.shimane.jp", + "ohda.shimane.jp", + "okinoshima.shimane.jp", + "okuizumo.shimane.jp", + "shimane.shimane.jp", + "tamayu.shimane.jp", + "tsuwano.shimane.jp", + "unnan.shimane.jp", + "yakumo.shimane.jp", + "yasugi.shimane.jp", + "yatsuka.shimane.jp", + "arai.shizuoka.jp", + "atami.shizuoka.jp", + "fuji.shizuoka.jp", + "fujieda.shizuoka.jp", + "fujikawa.shizuoka.jp", + "fujinomiya.shizuoka.jp", + "fukuroi.shizuoka.jp", + "gotemba.shizuoka.jp", + "haibara.shizuoka.jp", + "hamamatsu.shizuoka.jp", + "higashiizu.shizuoka.jp", + "ito.shizuoka.jp", + "iwata.shizuoka.jp", + "izu.shizuoka.jp", + "izunokuni.shizuoka.jp", + "kakegawa.shizuoka.jp", + "kannami.shizuoka.jp", + "kawanehon.shizuoka.jp", + "kawazu.shizuoka.jp", + "kikugawa.shizuoka.jp", + "kosai.shizuoka.jp", + "makinohara.shizuoka.jp", + "matsuzaki.shizuoka.jp", + "minamiizu.shizuoka.jp", + "mishima.shizuoka.jp", + "morimachi.shizuoka.jp", + "nishiizu.shizuoka.jp", + "numazu.shizuoka.jp", + "omaezaki.shizuoka.jp", + "shimada.shizuoka.jp", + "shimizu.shizuoka.jp", + "shimoda.shizuoka.jp", + "shizuoka.shizuoka.jp", + "susono.shizuoka.jp", + "yaizu.shizuoka.jp", + "yoshida.shizuoka.jp", + "ashikaga.tochigi.jp", + "bato.tochigi.jp", + "haga.tochigi.jp", + "ichikai.tochigi.jp", + "iwafune.tochigi.jp", + "kaminokawa.tochigi.jp", + "kanuma.tochigi.jp", + "karasuyama.tochigi.jp", + "kuroiso.tochigi.jp", + "mashiko.tochigi.jp", + "mibu.tochigi.jp", + "moka.tochigi.jp", + "motegi.tochigi.jp", + "nasu.tochigi.jp", + "nasushiobara.tochigi.jp", + "nikko.tochigi.jp", + "nishikata.tochigi.jp", + "nogi.tochigi.jp", + "ohira.tochigi.jp", + "ohtawara.tochigi.jp", + "oyama.tochigi.jp", + "sakura.tochigi.jp", + "sano.tochigi.jp", + "shimotsuke.tochigi.jp", + "shioya.tochigi.jp", + "takanezawa.tochigi.jp", + "tochigi.tochigi.jp", + "tsuga.tochigi.jp", + "ujiie.tochigi.jp", + "utsunomiya.tochigi.jp", + "yaita.tochigi.jp", + "aizumi.tokushima.jp", + "anan.tokushima.jp", + "ichiba.tokushima.jp", + "itano.tokushima.jp", + "kainan.tokushima.jp", + "komatsushima.tokushima.jp", + "matsushige.tokushima.jp", + "mima.tokushima.jp", + "minami.tokushima.jp", + "miyoshi.tokushima.jp", + "mugi.tokushima.jp", + "nakagawa.tokushima.jp", + "naruto.tokushima.jp", + "sanagochi.tokushima.jp", + "shishikui.tokushima.jp", + "tokushima.tokushima.jp", + "wajiki.tokushima.jp", + "adachi.tokyo.jp", + "akiruno.tokyo.jp", + "akishima.tokyo.jp", + "aogashima.tokyo.jp", + "arakawa.tokyo.jp", + "bunkyo.tokyo.jp", + "chiyoda.tokyo.jp", + "chofu.tokyo.jp", + "chuo.tokyo.jp", + "edogawa.tokyo.jp", + "fuchu.tokyo.jp", + "fussa.tokyo.jp", + "hachijo.tokyo.jp", + "hachioji.tokyo.jp", + "hamura.tokyo.jp", + "higashikurume.tokyo.jp", + "higashimurayama.tokyo.jp", + "higashiyamato.tokyo.jp", + "hino.tokyo.jp", + "hinode.tokyo.jp", + "hinohara.tokyo.jp", + "inagi.tokyo.jp", + "itabashi.tokyo.jp", + "katsushika.tokyo.jp", + "kita.tokyo.jp", + "kiyose.tokyo.jp", + "kodaira.tokyo.jp", + "koganei.tokyo.jp", + "kokubunji.tokyo.jp", + "komae.tokyo.jp", + "koto.tokyo.jp", + "kouzushima.tokyo.jp", + "kunitachi.tokyo.jp", + "machida.tokyo.jp", + "meguro.tokyo.jp", + "minato.tokyo.jp", + "mitaka.tokyo.jp", + "mizuho.tokyo.jp", + "musashimurayama.tokyo.jp", + "musashino.tokyo.jp", + "nakano.tokyo.jp", + "nerima.tokyo.jp", + "ogasawara.tokyo.jp", + "okutama.tokyo.jp", + "ome.tokyo.jp", + "oshima.tokyo.jp", + "ota.tokyo.jp", + "setagaya.tokyo.jp", + "shibuya.tokyo.jp", + "shinagawa.tokyo.jp", + "shinjuku.tokyo.jp", + "suginami.tokyo.jp", + "sumida.tokyo.jp", + "tachikawa.tokyo.jp", + "taito.tokyo.jp", + "tama.tokyo.jp", + "toshima.tokyo.jp", + "chizu.tottori.jp", + "hino.tottori.jp", + "kawahara.tottori.jp", + "koge.tottori.jp", + "kotoura.tottori.jp", + "misasa.tottori.jp", + "nanbu.tottori.jp", + "nichinan.tottori.jp", + "sakaiminato.tottori.jp", + "tottori.tottori.jp", + "wakasa.tottori.jp", + "yazu.tottori.jp", + "yonago.tottori.jp", + "asahi.toyama.jp", + "fuchu.toyama.jp", + "fukumitsu.toyama.jp", + "funahashi.toyama.jp", + "himi.toyama.jp", + "imizu.toyama.jp", + "inami.toyama.jp", + "johana.toyama.jp", + "kamiichi.toyama.jp", + "kurobe.toyama.jp", + "nakaniikawa.toyama.jp", + "namerikawa.toyama.jp", + "nanto.toyama.jp", + "nyuzen.toyama.jp", + "oyabe.toyama.jp", + "taira.toyama.jp", + "takaoka.toyama.jp", + "tateyama.toyama.jp", + "toga.toyama.jp", + "tonami.toyama.jp", + "toyama.toyama.jp", + "unazuki.toyama.jp", + "uozu.toyama.jp", + "yamada.toyama.jp", + "arida.wakayama.jp", + "aridagawa.wakayama.jp", + "gobo.wakayama.jp", + "hashimoto.wakayama.jp", + "hidaka.wakayama.jp", + "hirogawa.wakayama.jp", + "inami.wakayama.jp", + "iwade.wakayama.jp", + "kainan.wakayama.jp", + "kamitonda.wakayama.jp", + "katsuragi.wakayama.jp", + "kimino.wakayama.jp", + "kinokawa.wakayama.jp", + "kitayama.wakayama.jp", + "koya.wakayama.jp", + "koza.wakayama.jp", + "kozagawa.wakayama.jp", + "kudoyama.wakayama.jp", + "kushimoto.wakayama.jp", + "mihama.wakayama.jp", + "misato.wakayama.jp", + "nachikatsuura.wakayama.jp", + "shingu.wakayama.jp", + "shirahama.wakayama.jp", + "taiji.wakayama.jp", + "tanabe.wakayama.jp", + "wakayama.wakayama.jp", + "yuasa.wakayama.jp", + "yura.wakayama.jp", + "asahi.yamagata.jp", + "funagata.yamagata.jp", + "higashine.yamagata.jp", + "iide.yamagata.jp", + "kahoku.yamagata.jp", + "kaminoyama.yamagata.jp", + "kaneyama.yamagata.jp", + "kawanishi.yamagata.jp", + "mamurogawa.yamagata.jp", + "mikawa.yamagata.jp", + "murayama.yamagata.jp", + "nagai.yamagata.jp", + "nakayama.yamagata.jp", + "nanyo.yamagata.jp", + "nishikawa.yamagata.jp", + "obanazawa.yamagata.jp", + "oe.yamagata.jp", + "oguni.yamagata.jp", + "ohkura.yamagata.jp", + "oishida.yamagata.jp", + "sagae.yamagata.jp", + "sakata.yamagata.jp", + "sakegawa.yamagata.jp", + "shinjo.yamagata.jp", + "shirataka.yamagata.jp", + "shonai.yamagata.jp", + "takahata.yamagata.jp", + "tendo.yamagata.jp", + "tozawa.yamagata.jp", + "tsuruoka.yamagata.jp", + "yamagata.yamagata.jp", + "yamanobe.yamagata.jp", + "yonezawa.yamagata.jp", + "yuza.yamagata.jp", + "abu.yamaguchi.jp", + "hagi.yamaguchi.jp", + "hikari.yamaguchi.jp", + "hofu.yamaguchi.jp", + "iwakuni.yamaguchi.jp", + "kudamatsu.yamaguchi.jp", + "mitou.yamaguchi.jp", + "nagato.yamaguchi.jp", + "oshima.yamaguchi.jp", + "shimonoseki.yamaguchi.jp", + "shunan.yamaguchi.jp", + "tabuse.yamaguchi.jp", + "tokuyama.yamaguchi.jp", + "toyota.yamaguchi.jp", + "ube.yamaguchi.jp", + "yuu.yamaguchi.jp", + "chuo.yamanashi.jp", + "doshi.yamanashi.jp", + "fuefuki.yamanashi.jp", + "fujikawa.yamanashi.jp", + "fujikawaguchiko.yamanashi.jp", + "fujiyoshida.yamanashi.jp", + "hayakawa.yamanashi.jp", + "hokuto.yamanashi.jp", + "ichikawamisato.yamanashi.jp", + "kai.yamanashi.jp", + "kofu.yamanashi.jp", + "koshu.yamanashi.jp", + "kosuge.yamanashi.jp", + "minami-alps.yamanashi.jp", + "minobu.yamanashi.jp", + "nakamichi.yamanashi.jp", + "nanbu.yamanashi.jp", + "narusawa.yamanashi.jp", + "nirasaki.yamanashi.jp", + "nishikatsura.yamanashi.jp", + "oshino.yamanashi.jp", + "otsuki.yamanashi.jp", + "showa.yamanashi.jp", + "tabayama.yamanashi.jp", + "tsuru.yamanashi.jp", + "uenohara.yamanashi.jp", + "yamanakako.yamanashi.jp", + "yamanashi.yamanashi.jp", + "ke", + "ac.ke", + "co.ke", + "go.ke", + "info.ke", + "me.ke", + "mobi.ke", + "ne.ke", + "or.ke", + "sc.ke", + "kg", + "org.kg", + "net.kg", + "com.kg", + "edu.kg", + "gov.kg", + "mil.kg", + "*.kh", + "ki", + "edu.ki", + "biz.ki", + "net.ki", + "org.ki", + "gov.ki", + "info.ki", + "com.ki", + "km", + "org.km", + "nom.km", + "gov.km", + "prd.km", + "tm.km", + "edu.km", + "mil.km", + "ass.km", + "com.km", + "coop.km", + "asso.km", + "presse.km", + "medecin.km", + "notaires.km", + "pharmaciens.km", + "veterinaire.km", + "gouv.km", + "kn", + "net.kn", + "org.kn", + "edu.kn", + "gov.kn", + "kp", + "com.kp", + "edu.kp", + "gov.kp", + "org.kp", + "rep.kp", + "tra.kp", + "kr", + "ac.kr", + "co.kr", + "es.kr", + "go.kr", + "hs.kr", + "kg.kr", + "mil.kr", + "ms.kr", + "ne.kr", + "or.kr", + "pe.kr", + "re.kr", + "sc.kr", + "busan.kr", + "chungbuk.kr", + "chungnam.kr", + "daegu.kr", + "daejeon.kr", + "gangwon.kr", + "gwangju.kr", + "gyeongbuk.kr", + "gyeonggi.kr", + "gyeongnam.kr", + "incheon.kr", + "jeju.kr", + "jeonbuk.kr", + "jeonnam.kr", + "seoul.kr", + "ulsan.kr", + "*.kw", + "ky", + "edu.ky", + "gov.ky", + "com.ky", + "org.ky", + "net.ky", + "kz", + "org.kz", + "edu.kz", + "net.kz", + "gov.kz", + "mil.kz", + "com.kz", + "la", + "int.la", + "net.la", + "info.la", + "edu.la", + "gov.la", + "per.la", + "com.la", + "org.la", + "lb", + "com.lb", + "edu.lb", + "gov.lb", + "net.lb", + "org.lb", + "lc", + "com.lc", + "net.lc", + "co.lc", + "org.lc", + "edu.lc", + "gov.lc", + "li", + "lk", + "gov.lk", + "sch.lk", + "net.lk", + "int.lk", + "com.lk", + "org.lk", + "edu.lk", + "ngo.lk", + "soc.lk", + "web.lk", + "ltd.lk", + "assn.lk", + "grp.lk", + "hotel.lk", + "ac.lk", + "lr", + "com.lr", + "edu.lr", + "gov.lr", + "org.lr", + "net.lr", + "ls", + "co.ls", + "org.ls", + "lt", + "gov.lt", + "lu", + "lv", + "com.lv", + "edu.lv", + "gov.lv", + "org.lv", + "mil.lv", + "id.lv", + "net.lv", + "asn.lv", + "conf.lv", + "ly", + "com.ly", + "net.ly", + "gov.ly", + "plc.ly", + "edu.ly", + "sch.ly", + "med.ly", + "org.ly", + "id.ly", + "ma", + "co.ma", + "net.ma", + "gov.ma", + "org.ma", + "ac.ma", + "press.ma", + "mc", + "tm.mc", + "asso.mc", + "md", + "me", + "co.me", + "net.me", + "org.me", + "edu.me", + "ac.me", + "gov.me", + "its.me", + "priv.me", + "mg", + "org.mg", + "nom.mg", + "gov.mg", + "prd.mg", + "tm.mg", + "edu.mg", + "mil.mg", + "com.mg", + "co.mg", + "mh", + "mil", + "mk", + "com.mk", + "org.mk", + "net.mk", + "edu.mk", + "gov.mk", + "inf.mk", + "name.mk", + "ml", + "com.ml", + "edu.ml", + "gouv.ml", + "gov.ml", + "net.ml", + "org.ml", + "presse.ml", + "*.mm", + "mn", + "gov.mn", + "edu.mn", + "org.mn", + "mo", + "com.mo", + "net.mo", + "org.mo", + "edu.mo", + "gov.mo", + "mobi", + "mp", + "mq", + "mr", + "gov.mr", + "ms", + "com.ms", + "edu.ms", + "gov.ms", + "net.ms", + "org.ms", + "mt", + "com.mt", + "edu.mt", + "net.mt", + "org.mt", + "mu", + "com.mu", + "net.mu", + "org.mu", + "gov.mu", + "ac.mu", + "co.mu", + "or.mu", + "museum", + "academy.museum", + "agriculture.museum", + "air.museum", + "airguard.museum", + "alabama.museum", + "alaska.museum", + "amber.museum", + "ambulance.museum", + "american.museum", + "americana.museum", + "americanantiques.museum", + "americanart.museum", + "amsterdam.museum", + "and.museum", + "annefrank.museum", + "anthro.museum", + "anthropology.museum", + "antiques.museum", + "aquarium.museum", + "arboretum.museum", + "archaeological.museum", + "archaeology.museum", + "architecture.museum", + "art.museum", + "artanddesign.museum", + "artcenter.museum", + "artdeco.museum", + "arteducation.museum", + "artgallery.museum", + "arts.museum", + "artsandcrafts.museum", + "asmatart.museum", + "assassination.museum", + "assisi.museum", + "association.museum", + "astronomy.museum", + "atlanta.museum", + "austin.museum", + "australia.museum", + "automotive.museum", + "aviation.museum", + "axis.museum", + "badajoz.museum", + "baghdad.museum", + "bahn.museum", + "bale.museum", + "baltimore.museum", + "barcelona.museum", + "baseball.museum", + "basel.museum", + "baths.museum", + "bauern.museum", + "beauxarts.museum", + "beeldengeluid.museum", + "bellevue.museum", + "bergbau.museum", + "berkeley.museum", + "berlin.museum", + "bern.museum", + "bible.museum", + "bilbao.museum", + "bill.museum", + "birdart.museum", + "birthplace.museum", + "bonn.museum", + "boston.museum", + "botanical.museum", + "botanicalgarden.museum", + "botanicgarden.museum", + "botany.museum", + "brandywinevalley.museum", + "brasil.museum", + "bristol.museum", + "british.museum", + "britishcolumbia.museum", + "broadcast.museum", + "brunel.museum", + "brussel.museum", + "brussels.museum", + "bruxelles.museum", + "building.museum", + "burghof.museum", + "bus.museum", + "bushey.museum", + "cadaques.museum", + "california.museum", + "cambridge.museum", + "can.museum", + "canada.museum", + "capebreton.museum", + "carrier.museum", + "cartoonart.museum", + "casadelamoneda.museum", + "castle.museum", + "castres.museum", + "celtic.museum", + "center.museum", + "chattanooga.museum", + "cheltenham.museum", + "chesapeakebay.museum", + "chicago.museum", + "children.museum", + "childrens.museum", + "childrensgarden.museum", + "chiropractic.museum", + "chocolate.museum", + "christiansburg.museum", + "cincinnati.museum", + "cinema.museum", + "circus.museum", + "civilisation.museum", + "civilization.museum", + "civilwar.museum", + "clinton.museum", + "clock.museum", + "coal.museum", + "coastaldefence.museum", + "cody.museum", + "coldwar.museum", + "collection.museum", + "colonialwilliamsburg.museum", + "coloradoplateau.museum", + "columbia.museum", + "columbus.museum", + "communication.museum", + "communications.museum", + "community.museum", + "computer.museum", + "computerhistory.museum", + "xn--comunicaes-v6a2o.museum", + "contemporary.museum", + "contemporaryart.museum", + "convent.museum", + "copenhagen.museum", + "corporation.museum", + "xn--correios-e-telecomunicaes-ghc29a.museum", + "corvette.museum", + "costume.museum", + "countryestate.museum", + "county.museum", + "crafts.museum", + "cranbrook.museum", + "creation.museum", + "cultural.museum", + "culturalcenter.museum", + "culture.museum", + "cyber.museum", + "cymru.museum", + "dali.museum", + "dallas.museum", + "database.museum", + "ddr.museum", + "decorativearts.museum", + "delaware.museum", + "delmenhorst.museum", + "denmark.museum", + "depot.museum", + "design.museum", + "detroit.museum", + "dinosaur.museum", + "discovery.museum", + "dolls.museum", + "donostia.museum", + "durham.museum", + "eastafrica.museum", + "eastcoast.museum", + "education.museum", + "educational.museum", + "egyptian.museum", + "eisenbahn.museum", + "elburg.museum", + "elvendrell.museum", + "embroidery.museum", + "encyclopedic.museum", + "england.museum", + "entomology.museum", + "environment.museum", + "environmentalconservation.museum", + "epilepsy.museum", + "essex.museum", + "estate.museum", + "ethnology.museum", + "exeter.museum", + "exhibition.museum", + "family.museum", + "farm.museum", + "farmequipment.museum", + "farmers.museum", + "farmstead.museum", + "field.museum", + "figueres.museum", + "filatelia.museum", + "film.museum", + "fineart.museum", + "finearts.museum", + "finland.museum", + "flanders.museum", + "florida.museum", + "force.museum", + "fortmissoula.museum", + "fortworth.museum", + "foundation.museum", + "francaise.museum", + "frankfurt.museum", + "franziskaner.museum", + "freemasonry.museum", + "freiburg.museum", + "fribourg.museum", + "frog.museum", + "fundacio.museum", + "furniture.museum", + "gallery.museum", + "garden.museum", + "gateway.museum", + "geelvinck.museum", + "gemological.museum", + "geology.museum", + "georgia.museum", + "giessen.museum", + "glas.museum", + "glass.museum", + "gorge.museum", + "grandrapids.museum", + "graz.museum", + "guernsey.museum", + "halloffame.museum", + "hamburg.museum", + "handson.museum", + "harvestcelebration.museum", + "hawaii.museum", + "health.museum", + "heimatunduhren.museum", + "hellas.museum", + "helsinki.museum", + "hembygdsforbund.museum", + "heritage.museum", + "histoire.museum", + "historical.museum", + "historicalsociety.museum", + "historichouses.museum", + "historisch.museum", + "historisches.museum", + "history.museum", + "historyofscience.museum", + "horology.museum", + "house.museum", + "humanities.museum", + "illustration.museum", + "imageandsound.museum", + "indian.museum", + "indiana.museum", + "indianapolis.museum", + "indianmarket.museum", + "intelligence.museum", + "interactive.museum", + "iraq.museum", + "iron.museum", + "isleofman.museum", + "jamison.museum", + "jefferson.museum", + "jerusalem.museum", + "jewelry.museum", + "jewish.museum", + "jewishart.museum", + "jfk.museum", + "journalism.museum", + "judaica.museum", + "judygarland.museum", + "juedisches.museum", + "juif.museum", + "karate.museum", + "karikatur.museum", + "kids.museum", + "koebenhavn.museum", + "koeln.museum", + "kunst.museum", + "kunstsammlung.museum", + "kunstunddesign.museum", + "labor.museum", + "labour.museum", + "lajolla.museum", + "lancashire.museum", + "landes.museum", + "lans.museum", + "xn--lns-qla.museum", + "larsson.museum", + "lewismiller.museum", + "lincoln.museum", + "linz.museum", + "living.museum", + "livinghistory.museum", + "localhistory.museum", + "london.museum", + "losangeles.museum", + "louvre.museum", + "loyalist.museum", + "lucerne.museum", + "luxembourg.museum", + "luzern.museum", + "mad.museum", + "madrid.museum", + "mallorca.museum", + "manchester.museum", + "mansion.museum", + "mansions.museum", + "manx.museum", + "marburg.museum", + "maritime.museum", + "maritimo.museum", + "maryland.museum", + "marylhurst.museum", + "media.museum", + "medical.museum", + "medizinhistorisches.museum", + "meeres.museum", + "memorial.museum", + "mesaverde.museum", + "michigan.museum", + "midatlantic.museum", + "military.museum", + "mill.museum", + "miners.museum", + "mining.museum", + "minnesota.museum", + "missile.museum", + "missoula.museum", + "modern.museum", + "moma.museum", + "money.museum", + "monmouth.museum", + "monticello.museum", + "montreal.museum", + "moscow.museum", + "motorcycle.museum", + "muenchen.museum", + "muenster.museum", + "mulhouse.museum", + "muncie.museum", + "museet.museum", + "museumcenter.museum", + "museumvereniging.museum", + "music.museum", + "national.museum", + "nationalfirearms.museum", + "nationalheritage.museum", + "nativeamerican.museum", + "naturalhistory.museum", + "naturalhistorymuseum.museum", + "naturalsciences.museum", + "nature.museum", + "naturhistorisches.museum", + "natuurwetenschappen.museum", + "naumburg.museum", + "naval.museum", + "nebraska.museum", + "neues.museum", + "newhampshire.museum", + "newjersey.museum", + "newmexico.museum", + "newport.museum", + "newspaper.museum", + "newyork.museum", + "niepce.museum", + "norfolk.museum", + "north.museum", + "nrw.museum", + "nuernberg.museum", + "nuremberg.museum", + "nyc.museum", + "nyny.museum", + "oceanographic.museum", + "oceanographique.museum", + "omaha.museum", + "online.museum", + "ontario.museum", + "openair.museum", + "oregon.museum", + "oregontrail.museum", + "otago.museum", + "oxford.museum", + "pacific.museum", + "paderborn.museum", + "palace.museum", + "paleo.museum", + "palmsprings.museum", + "panama.museum", + "paris.museum", + "pasadena.museum", + "pharmacy.museum", + "philadelphia.museum", + "philadelphiaarea.museum", + "philately.museum", + "phoenix.museum", + "photography.museum", + "pilots.museum", + "pittsburgh.museum", + "planetarium.museum", + "plantation.museum", + "plants.museum", + "plaza.museum", + "portal.museum", + "portland.museum", + "portlligat.museum", + "posts-and-telecommunications.museum", + "preservation.museum", + "presidio.museum", + "press.museum", + "project.museum", + "public.museum", + "pubol.museum", + "quebec.museum", + "railroad.museum", + "railway.museum", + "research.museum", + "resistance.museum", + "riodejaneiro.museum", + "rochester.museum", + "rockart.museum", + "roma.museum", + "russia.museum", + "saintlouis.museum", + "salem.museum", + "salvadordali.museum", + "salzburg.museum", + "sandiego.museum", + "sanfrancisco.museum", + "santabarbara.museum", + "santacruz.museum", + "santafe.museum", + "saskatchewan.museum", + "satx.museum", + "savannahga.museum", + "schlesisches.museum", + "schoenbrunn.museum", + "schokoladen.museum", + "school.museum", + "schweiz.museum", + "science.museum", + "scienceandhistory.museum", + "scienceandindustry.museum", + "sciencecenter.museum", + "sciencecenters.museum", + "science-fiction.museum", + "sciencehistory.museum", + "sciences.museum", + "sciencesnaturelles.museum", + "scotland.museum", + "seaport.museum", + "settlement.museum", + "settlers.museum", + "shell.museum", + "sherbrooke.museum", + "sibenik.museum", + "silk.museum", + "ski.museum", + "skole.museum", + "society.museum", + "sologne.museum", + "soundandvision.museum", + "southcarolina.museum", + "southwest.museum", + "space.museum", + "spy.museum", + "square.museum", + "stadt.museum", + "stalbans.museum", + "starnberg.museum", + "state.museum", + "stateofdelaware.museum", + "station.museum", + "steam.museum", + "steiermark.museum", + "stjohn.museum", + "stockholm.museum", + "stpetersburg.museum", + "stuttgart.museum", + "suisse.museum", + "surgeonshall.museum", + "surrey.museum", + "svizzera.museum", + "sweden.museum", + "sydney.museum", + "tank.museum", + "tcm.museum", + "technology.museum", + "telekommunikation.museum", + "television.museum", + "texas.museum", + "textile.museum", + "theater.museum", + "time.museum", + "timekeeping.museum", + "topology.museum", + "torino.museum", + "touch.museum", + "town.museum", + "transport.museum", + "tree.museum", + "trolley.museum", + "trust.museum", + "trustee.museum", + "uhren.museum", + "ulm.museum", + "undersea.museum", + "university.museum", + "usa.museum", + "usantiques.museum", + "usarts.museum", + "uscountryestate.museum", + "usculture.museum", + "usdecorativearts.museum", + "usgarden.museum", + "ushistory.museum", + "ushuaia.museum", + "uslivinghistory.museum", + "utah.museum", + "uvic.museum", + "valley.museum", + "vantaa.museum", + "versailles.museum", + "viking.museum", + "village.museum", + "virginia.museum", + "virtual.museum", + "virtuel.museum", + "vlaanderen.museum", + "volkenkunde.museum", + "wales.museum", + "wallonie.museum", + "war.museum", + "washingtondc.museum", + "watchandclock.museum", + "watch-and-clock.museum", + "western.museum", + "westfalen.museum", + "whaling.museum", + "wildlife.museum", + "williamsburg.museum", + "windmill.museum", + "workshop.museum", + "york.museum", + "yorkshire.museum", + "yosemite.museum", + "youth.museum", + "zoological.museum", + "zoology.museum", + "xn--9dbhblg6di.museum", + "xn--h1aegh.museum", + "mv", + "aero.mv", + "biz.mv", + "com.mv", + "coop.mv", + "edu.mv", + "gov.mv", + "info.mv", + "int.mv", + "mil.mv", + "museum.mv", + "name.mv", + "net.mv", + "org.mv", + "pro.mv", + "mw", + "ac.mw", + "biz.mw", + "co.mw", + "com.mw", + "coop.mw", + "edu.mw", + "gov.mw", + "int.mw", + "museum.mw", + "net.mw", + "org.mw", + "mx", + "com.mx", + "org.mx", + "gob.mx", + "edu.mx", + "net.mx", + "my", + "com.my", + "net.my", + "org.my", + "gov.my", + "edu.my", + "mil.my", + "name.my", + "mz", + "ac.mz", + "adv.mz", + "co.mz", + "edu.mz", + "gov.mz", + "mil.mz", + "net.mz", + "org.mz", + "na", + "info.na", + "pro.na", + "name.na", + "school.na", + "or.na", + "dr.na", + "us.na", + "mx.na", + "ca.na", + "in.na", + "cc.na", + "tv.na", + "ws.na", + "mobi.na", + "co.na", + "com.na", + "org.na", + "name", + "nc", + "asso.nc", + "nom.nc", + "ne", + "net", + "nf", + "com.nf", + "net.nf", + "per.nf", + "rec.nf", + "web.nf", + "arts.nf", + "firm.nf", + "info.nf", + "other.nf", + "store.nf", + "ng", + "com.ng", + "edu.ng", + "gov.ng", + "i.ng", + "mil.ng", + "mobi.ng", + "name.ng", + "net.ng", + "org.ng", + "sch.ng", + "ni", + "ac.ni", + "biz.ni", + "co.ni", + "com.ni", + "edu.ni", + "gob.ni", + "in.ni", + "info.ni", + "int.ni", + "mil.ni", + "net.ni", + "nom.ni", + "org.ni", + "web.ni", + "nl", + "bv.nl", + "no", + "fhs.no", + "vgs.no", + "fylkesbibl.no", + "folkebibl.no", + "museum.no", + "idrett.no", + "priv.no", + "mil.no", + "stat.no", + "dep.no", + "kommune.no", + "herad.no", + "aa.no", + "ah.no", + "bu.no", + "fm.no", + "hl.no", + "hm.no", + "jan-mayen.no", + "mr.no", + "nl.no", + "nt.no", + "of.no", + "ol.no", + "oslo.no", + "rl.no", + "sf.no", + "st.no", + "svalbard.no", + "tm.no", + "tr.no", + "va.no", + "vf.no", + "gs.aa.no", + "gs.ah.no", + "gs.bu.no", + "gs.fm.no", + "gs.hl.no", + "gs.hm.no", + "gs.jan-mayen.no", + "gs.mr.no", + "gs.nl.no", + "gs.nt.no", + "gs.of.no", + "gs.ol.no", + "gs.oslo.no", + "gs.rl.no", + "gs.sf.no", + "gs.st.no", + "gs.svalbard.no", + "gs.tm.no", + "gs.tr.no", + "gs.va.no", + "gs.vf.no", + "akrehamn.no", + "xn--krehamn-dxa.no", + "algard.no", + "xn--lgrd-poac.no", + "arna.no", + "brumunddal.no", + "bryne.no", + "bronnoysund.no", + "xn--brnnysund-m8ac.no", + "drobak.no", + "xn--drbak-wua.no", + "egersund.no", + "fetsund.no", + "floro.no", + "xn--flor-jra.no", + "fredrikstad.no", + "hokksund.no", + "honefoss.no", + "xn--hnefoss-q1a.no", + "jessheim.no", + "jorpeland.no", + "xn--jrpeland-54a.no", + "kirkenes.no", + "kopervik.no", + "krokstadelva.no", + "langevag.no", + "xn--langevg-jxa.no", + "leirvik.no", + "mjondalen.no", + "xn--mjndalen-64a.no", + "mo-i-rana.no", + "mosjoen.no", + "xn--mosjen-eya.no", + "nesoddtangen.no", + "orkanger.no", + "osoyro.no", + "xn--osyro-wua.no", + "raholt.no", + "xn--rholt-mra.no", + "sandnessjoen.no", + "xn--sandnessjen-ogb.no", + "skedsmokorset.no", + "slattum.no", + "spjelkavik.no", + "stathelle.no", + "stavern.no", + "stjordalshalsen.no", + "xn--stjrdalshalsen-sqb.no", + "tananger.no", + "tranby.no", + "vossevangen.no", + "afjord.no", + "xn--fjord-lra.no", + "agdenes.no", + "al.no", + "xn--l-1fa.no", + "alesund.no", + "xn--lesund-hua.no", + "alstahaug.no", + "alta.no", + "xn--lt-liac.no", + "alaheadju.no", + "xn--laheadju-7ya.no", + "alvdal.no", + "amli.no", + "xn--mli-tla.no", + "amot.no", + "xn--mot-tla.no", + "andebu.no", + "andoy.no", + "xn--andy-ira.no", + "andasuolo.no", + "ardal.no", + "xn--rdal-poa.no", + "aremark.no", + "arendal.no", + "xn--s-1fa.no", + "aseral.no", + "xn--seral-lra.no", + "asker.no", + "askim.no", + "askvoll.no", + "askoy.no", + "xn--asky-ira.no", + "asnes.no", + "xn--snes-poa.no", + "audnedaln.no", + "aukra.no", + "aure.no", + "aurland.no", + "aurskog-holand.no", + "xn--aurskog-hland-jnb.no", + "austevoll.no", + "austrheim.no", + "averoy.no", + "xn--avery-yua.no", + "balestrand.no", + "ballangen.no", + "balat.no", + "xn--blt-elab.no", + "balsfjord.no", + "bahccavuotna.no", + "xn--bhccavuotna-k7a.no", + "bamble.no", + "bardu.no", + "beardu.no", + "beiarn.no", + "bajddar.no", + "xn--bjddar-pta.no", + "baidar.no", + "xn--bidr-5nac.no", + "berg.no", + "bergen.no", + "berlevag.no", + "xn--berlevg-jxa.no", + "bearalvahki.no", + "xn--bearalvhki-y4a.no", + "bindal.no", + "birkenes.no", + "bjarkoy.no", + "xn--bjarky-fya.no", + "bjerkreim.no", + "bjugn.no", + "bodo.no", + "xn--bod-2na.no", + "badaddja.no", + "xn--bdddj-mrabd.no", + "budejju.no", + "bokn.no", + "bremanger.no", + "bronnoy.no", + "xn--brnny-wuac.no", + "bygland.no", + "bykle.no", + "barum.no", + "xn--brum-voa.no", + "bo.telemark.no", + "xn--b-5ga.telemark.no", + "bo.nordland.no", + "xn--b-5ga.nordland.no", + "bievat.no", + "xn--bievt-0qa.no", + "bomlo.no", + "xn--bmlo-gra.no", + "batsfjord.no", + "xn--btsfjord-9za.no", + "bahcavuotna.no", + "xn--bhcavuotna-s4a.no", + "dovre.no", + "drammen.no", + "drangedal.no", + "dyroy.no", + "xn--dyry-ira.no", + "donna.no", + "xn--dnna-gra.no", + "eid.no", + "eidfjord.no", + "eidsberg.no", + "eidskog.no", + "eidsvoll.no", + "eigersund.no", + "elverum.no", + "enebakk.no", + "engerdal.no", + "etne.no", + "etnedal.no", + "evenes.no", + "evenassi.no", + "xn--eveni-0qa01ga.no", + "evje-og-hornnes.no", + "farsund.no", + "fauske.no", + "fuossko.no", + "fuoisku.no", + "fedje.no", + "fet.no", + "finnoy.no", + "xn--finny-yua.no", + "fitjar.no", + "fjaler.no", + "fjell.no", + "flakstad.no", + "flatanger.no", + "flekkefjord.no", + "flesberg.no", + "flora.no", + "fla.no", + "xn--fl-zia.no", + "folldal.no", + "forsand.no", + "fosnes.no", + "frei.no", + "frogn.no", + "froland.no", + "frosta.no", + "frana.no", + "xn--frna-woa.no", + "froya.no", + "xn--frya-hra.no", + "fusa.no", + "fyresdal.no", + "forde.no", + "xn--frde-gra.no", + "gamvik.no", + "gangaviika.no", + "xn--ggaviika-8ya47h.no", + "gaular.no", + "gausdal.no", + "gildeskal.no", + "xn--gildeskl-g0a.no", + "giske.no", + "gjemnes.no", + "gjerdrum.no", + "gjerstad.no", + "gjesdal.no", + "gjovik.no", + "xn--gjvik-wua.no", + "gloppen.no", + "gol.no", + "gran.no", + "grane.no", + "granvin.no", + "gratangen.no", + "grimstad.no", + "grong.no", + "kraanghke.no", + "xn--kranghke-b0a.no", + "grue.no", + "gulen.no", + "hadsel.no", + "halden.no", + "halsa.no", + "hamar.no", + "hamaroy.no", + "habmer.no", + "xn--hbmer-xqa.no", + "hapmir.no", + "xn--hpmir-xqa.no", + "hammerfest.no", + "hammarfeasta.no", + "xn--hmmrfeasta-s4ac.no", + "haram.no", + "hareid.no", + "harstad.no", + "hasvik.no", + "aknoluokta.no", + "xn--koluokta-7ya57h.no", + "hattfjelldal.no", + "aarborte.no", + "haugesund.no", + "hemne.no", + "hemnes.no", + "hemsedal.no", + "heroy.more-og-romsdal.no", + "xn--hery-ira.xn--mre-og-romsdal-qqb.no", + "heroy.nordland.no", + "xn--hery-ira.nordland.no", + "hitra.no", + "hjartdal.no", + "hjelmeland.no", + "hobol.no", + "xn--hobl-ira.no", + "hof.no", + "hol.no", + "hole.no", + "holmestrand.no", + "holtalen.no", + "xn--holtlen-hxa.no", + "hornindal.no", + "horten.no", + "hurdal.no", + "hurum.no", + "hvaler.no", + "hyllestad.no", + "hagebostad.no", + "xn--hgebostad-g3a.no", + "hoyanger.no", + "xn--hyanger-q1a.no", + "hoylandet.no", + "xn--hylandet-54a.no", + "ha.no", + "xn--h-2fa.no", + "ibestad.no", + "inderoy.no", + "xn--indery-fya.no", + "iveland.no", + "jevnaker.no", + "jondal.no", + "jolster.no", + "xn--jlster-bya.no", + "karasjok.no", + "karasjohka.no", + "xn--krjohka-hwab49j.no", + "karlsoy.no", + "galsa.no", + "xn--gls-elac.no", + "karmoy.no", + "xn--karmy-yua.no", + "kautokeino.no", + "guovdageaidnu.no", + "klepp.no", + "klabu.no", + "xn--klbu-woa.no", + "kongsberg.no", + "kongsvinger.no", + "kragero.no", + "xn--krager-gya.no", + "kristiansand.no", + "kristiansund.no", + "krodsherad.no", + "xn--krdsherad-m8a.no", + "kvalsund.no", + "rahkkeravju.no", + "xn--rhkkervju-01af.no", + "kvam.no", + "kvinesdal.no", + "kvinnherad.no", + "kviteseid.no", + "kvitsoy.no", + "xn--kvitsy-fya.no", + "kvafjord.no", + "xn--kvfjord-nxa.no", + "giehtavuoatna.no", + "kvanangen.no", + "xn--kvnangen-k0a.no", + "navuotna.no", + "xn--nvuotna-hwa.no", + "kafjord.no", + "xn--kfjord-iua.no", + "gaivuotna.no", + "xn--givuotna-8ya.no", + "larvik.no", + "lavangen.no", + "lavagis.no", + "loabat.no", + "xn--loabt-0qa.no", + "lebesby.no", + "davvesiida.no", + "leikanger.no", + "leirfjord.no", + "leka.no", + "leksvik.no", + "lenvik.no", + "leangaviika.no", + "xn--leagaviika-52b.no", + "lesja.no", + "levanger.no", + "lier.no", + "lierne.no", + "lillehammer.no", + "lillesand.no", + "lindesnes.no", + "lindas.no", + "xn--linds-pra.no", + "lom.no", + "loppa.no", + "lahppi.no", + "xn--lhppi-xqa.no", + "lund.no", + "lunner.no", + "luroy.no", + "xn--lury-ira.no", + "luster.no", + "lyngdal.no", + "lyngen.no", + "ivgu.no", + "lardal.no", + "lerdal.no", + "xn--lrdal-sra.no", + "lodingen.no", + "xn--ldingen-q1a.no", + "lorenskog.no", + "xn--lrenskog-54a.no", + "loten.no", + "xn--lten-gra.no", + "malvik.no", + "masoy.no", + "xn--msy-ula0h.no", + "muosat.no", + "xn--muost-0qa.no", + "mandal.no", + "marker.no", + "marnardal.no", + "masfjorden.no", + "meland.no", + "meldal.no", + "melhus.no", + "meloy.no", + "xn--mely-ira.no", + "meraker.no", + "xn--merker-kua.no", + "moareke.no", + "xn--moreke-jua.no", + "midsund.no", + "midtre-gauldal.no", + "modalen.no", + "modum.no", + "molde.no", + "moskenes.no", + "moss.no", + "mosvik.no", + "malselv.no", + "xn--mlselv-iua.no", + "malatvuopmi.no", + "xn--mlatvuopmi-s4a.no", + "namdalseid.no", + "aejrie.no", + "namsos.no", + "namsskogan.no", + "naamesjevuemie.no", + "xn--nmesjevuemie-tcba.no", + "laakesvuemie.no", + "nannestad.no", + "narvik.no", + "narviika.no", + "naustdal.no", + "nedre-eiker.no", + "nes.akershus.no", + "nes.buskerud.no", + "nesna.no", + "nesodden.no", + "nesseby.no", + "unjarga.no", + "xn--unjrga-rta.no", + "nesset.no", + "nissedal.no", + "nittedal.no", + "nord-aurdal.no", + "nord-fron.no", + "nord-odal.no", + "norddal.no", + "nordkapp.no", + "davvenjarga.no", + "xn--davvenjrga-y4a.no", + "nordre-land.no", + "nordreisa.no", + "raisa.no", + "xn--risa-5na.no", + "nore-og-uvdal.no", + "notodden.no", + "naroy.no", + "xn--nry-yla5g.no", + "notteroy.no", + "xn--nttery-byae.no", + "odda.no", + "oksnes.no", + "xn--ksnes-uua.no", + "oppdal.no", + "oppegard.no", + "xn--oppegrd-ixa.no", + "orkdal.no", + "orland.no", + "xn--rland-uua.no", + "orskog.no", + "xn--rskog-uua.no", + "orsta.no", + "xn--rsta-fra.no", + "os.hedmark.no", + "os.hordaland.no", + "osen.no", + "osteroy.no", + "xn--ostery-fya.no", + "ostre-toten.no", + "xn--stre-toten-zcb.no", + "overhalla.no", + "ovre-eiker.no", + "xn--vre-eiker-k8a.no", + "oyer.no", + "xn--yer-zna.no", + "oygarden.no", + "xn--ygarden-p1a.no", + "oystre-slidre.no", + "xn--ystre-slidre-ujb.no", + "porsanger.no", + "porsangu.no", + "xn--porsgu-sta26f.no", + "porsgrunn.no", + "radoy.no", + "xn--rady-ira.no", + "rakkestad.no", + "rana.no", + "ruovat.no", + "randaberg.no", + "rauma.no", + "rendalen.no", + "rennebu.no", + "rennesoy.no", + "xn--rennesy-v1a.no", + "rindal.no", + "ringebu.no", + "ringerike.no", + "ringsaker.no", + "rissa.no", + "risor.no", + "xn--risr-ira.no", + "roan.no", + "rollag.no", + "rygge.no", + "ralingen.no", + "xn--rlingen-mxa.no", + "rodoy.no", + "xn--rdy-0nab.no", + "romskog.no", + "xn--rmskog-bya.no", + "roros.no", + "xn--rros-gra.no", + "rost.no", + "xn--rst-0na.no", + "royken.no", + "xn--ryken-vua.no", + "royrvik.no", + "xn--ryrvik-bya.no", + "rade.no", + "xn--rde-ula.no", + "salangen.no", + "siellak.no", + "saltdal.no", + "salat.no", + "xn--slt-elab.no", + "xn--slat-5na.no", + "samnanger.no", + "sande.more-og-romsdal.no", + "sande.xn--mre-og-romsdal-qqb.no", + "sande.vestfold.no", + "sandefjord.no", + "sandnes.no", + "sandoy.no", + "xn--sandy-yua.no", + "sarpsborg.no", + "sauda.no", + "sauherad.no", + "sel.no", + "selbu.no", + "selje.no", + "seljord.no", + "sigdal.no", + "siljan.no", + "sirdal.no", + "skaun.no", + "skedsmo.no", + "ski.no", + "skien.no", + "skiptvet.no", + "skjervoy.no", + "xn--skjervy-v1a.no", + "skierva.no", + "xn--skierv-uta.no", + "skjak.no", + "xn--skjk-soa.no", + "skodje.no", + "skanland.no", + "xn--sknland-fxa.no", + "skanit.no", + "xn--sknit-yqa.no", + "smola.no", + "xn--smla-hra.no", + "snillfjord.no", + "snasa.no", + "xn--snsa-roa.no", + "snoasa.no", + "snaase.no", + "xn--snase-nra.no", + "sogndal.no", + "sokndal.no", + "sola.no", + "solund.no", + "songdalen.no", + "sortland.no", + "spydeberg.no", + "stange.no", + "stavanger.no", + "steigen.no", + "steinkjer.no", + "stjordal.no", + "xn--stjrdal-s1a.no", + "stokke.no", + "stor-elvdal.no", + "stord.no", + "stordal.no", + "storfjord.no", + "omasvuotna.no", + "strand.no", + "stranda.no", + "stryn.no", + "sula.no", + "suldal.no", + "sund.no", + "sunndal.no", + "surnadal.no", + "sveio.no", + "svelvik.no", + "sykkylven.no", + "sogne.no", + "xn--sgne-gra.no", + "somna.no", + "xn--smna-gra.no", + "sondre-land.no", + "xn--sndre-land-0cb.no", + "sor-aurdal.no", + "xn--sr-aurdal-l8a.no", + "sor-fron.no", + "xn--sr-fron-q1a.no", + "sor-odal.no", + "xn--sr-odal-q1a.no", + "sor-varanger.no", + "xn--sr-varanger-ggb.no", + "matta-varjjat.no", + "xn--mtta-vrjjat-k7af.no", + "sorfold.no", + "xn--srfold-bya.no", + "sorreisa.no", + "xn--srreisa-q1a.no", + "sorum.no", + "xn--srum-gra.no", + "tana.no", + "deatnu.no", + "time.no", + "tingvoll.no", + "tinn.no", + "tjeldsund.no", + "dielddanuorri.no", + "tjome.no", + "xn--tjme-hra.no", + "tokke.no", + "tolga.no", + "torsken.no", + "tranoy.no", + "xn--trany-yua.no", + "tromso.no", + "xn--troms-zua.no", + "tromsa.no", + "romsa.no", + "trondheim.no", + "troandin.no", + "trysil.no", + "trana.no", + "xn--trna-woa.no", + "trogstad.no", + "xn--trgstad-r1a.no", + "tvedestrand.no", + "tydal.no", + "tynset.no", + "tysfjord.no", + "divtasvuodna.no", + "divttasvuotna.no", + "tysnes.no", + "tysvar.no", + "xn--tysvr-vra.no", + "tonsberg.no", + "xn--tnsberg-q1a.no", + "ullensaker.no", + "ullensvang.no", + "ulvik.no", + "utsira.no", + "vadso.no", + "xn--vads-jra.no", + "cahcesuolo.no", + "xn--hcesuolo-7ya35b.no", + "vaksdal.no", + "valle.no", + "vang.no", + "vanylven.no", + "vardo.no", + "xn--vard-jra.no", + "varggat.no", + "xn--vrggt-xqad.no", + "vefsn.no", + "vaapste.no", + "vega.no", + "vegarshei.no", + "xn--vegrshei-c0a.no", + "vennesla.no", + "verdal.no", + "verran.no", + "vestby.no", + "vestnes.no", + "vestre-slidre.no", + "vestre-toten.no", + "vestvagoy.no", + "xn--vestvgy-ixa6o.no", + "vevelstad.no", + "vik.no", + "vikna.no", + "vindafjord.no", + "volda.no", + "voss.no", + "varoy.no", + "xn--vry-yla5g.no", + "vagan.no", + "xn--vgan-qoa.no", + "voagat.no", + "vagsoy.no", + "xn--vgsy-qoa0j.no", + "vaga.no", + "xn--vg-yiab.no", + "valer.ostfold.no", + "xn--vler-qoa.xn--stfold-9xa.no", + "valer.hedmark.no", + "xn--vler-qoa.hedmark.no", + "*.np", + "nr", + "biz.nr", + "info.nr", + "gov.nr", + "edu.nr", + "org.nr", + "net.nr", + "com.nr", + "nu", + "nz", + "ac.nz", + "co.nz", + "cri.nz", + "geek.nz", + "gen.nz", + "govt.nz", + "health.nz", + "iwi.nz", + "kiwi.nz", + "maori.nz", + "mil.nz", + "xn--mori-qsa.nz", + "net.nz", + "org.nz", + "parliament.nz", + "school.nz", + "om", + "co.om", + "com.om", + "edu.om", + "gov.om", + "med.om", + "museum.om", + "net.om", + "org.om", + "pro.om", + "onion", + "org", + "pa", + "ac.pa", + "gob.pa", + "com.pa", + "org.pa", + "sld.pa", + "edu.pa", + "net.pa", + "ing.pa", + "abo.pa", + "med.pa", + "nom.pa", + "pe", + "edu.pe", + "gob.pe", + "nom.pe", + "mil.pe", + "org.pe", + "com.pe", + "net.pe", + "pf", + "com.pf", + "org.pf", + "edu.pf", + "*.pg", + "ph", + "com.ph", + "net.ph", + "org.ph", + "gov.ph", + "edu.ph", + "ngo.ph", + "mil.ph", + "i.ph", + "pk", + "com.pk", + "net.pk", + "edu.pk", + "org.pk", + "fam.pk", + "biz.pk", + "web.pk", + "gov.pk", + "gob.pk", + "gok.pk", + "gon.pk", + "gop.pk", + "gos.pk", + "info.pk", + "pl", + "com.pl", + "net.pl", + "org.pl", + "aid.pl", + "agro.pl", + "atm.pl", + "auto.pl", + "biz.pl", + "edu.pl", + "gmina.pl", + "gsm.pl", + "info.pl", + "mail.pl", + "miasta.pl", + "media.pl", + "mil.pl", + "nieruchomosci.pl", + "nom.pl", + "pc.pl", + "powiat.pl", + "priv.pl", + "realestate.pl", + "rel.pl", + "sex.pl", + "shop.pl", + "sklep.pl", + "sos.pl", + "szkola.pl", + "targi.pl", + "tm.pl", + "tourism.pl", + "travel.pl", + "turystyka.pl", + "gov.pl", + "ap.gov.pl", + "ic.gov.pl", + "is.gov.pl", + "us.gov.pl", + "kmpsp.gov.pl", + "kppsp.gov.pl", + "kwpsp.gov.pl", + "psp.gov.pl", + "wskr.gov.pl", + "kwp.gov.pl", + "mw.gov.pl", + "ug.gov.pl", + "um.gov.pl", + "umig.gov.pl", + "ugim.gov.pl", + "upow.gov.pl", + "uw.gov.pl", + "starostwo.gov.pl", + "pa.gov.pl", + "po.gov.pl", + "psse.gov.pl", + "pup.gov.pl", + "rzgw.gov.pl", + "sa.gov.pl", + "so.gov.pl", + "sr.gov.pl", + "wsa.gov.pl", + "sko.gov.pl", + "uzs.gov.pl", + "wiih.gov.pl", + "winb.gov.pl", + "pinb.gov.pl", + "wios.gov.pl", + "witd.gov.pl", + "wzmiuw.gov.pl", + "piw.gov.pl", + "wiw.gov.pl", + "griw.gov.pl", + "wif.gov.pl", + "oum.gov.pl", + "sdn.gov.pl", + "zp.gov.pl", + "uppo.gov.pl", + "mup.gov.pl", + "wuoz.gov.pl", + "konsulat.gov.pl", + "oirm.gov.pl", + "augustow.pl", + "babia-gora.pl", + "bedzin.pl", + "beskidy.pl", + "bialowieza.pl", + "bialystok.pl", + "bielawa.pl", + "bieszczady.pl", + "boleslawiec.pl", + "bydgoszcz.pl", + "bytom.pl", + "cieszyn.pl", + "czeladz.pl", + "czest.pl", + "dlugoleka.pl", + "elblag.pl", + "elk.pl", + "glogow.pl", + "gniezno.pl", + "gorlice.pl", + "grajewo.pl", + "ilawa.pl", + "jaworzno.pl", + "jelenia-gora.pl", + "jgora.pl", + "kalisz.pl", + "kazimierz-dolny.pl", + "karpacz.pl", + "kartuzy.pl", + "kaszuby.pl", + "katowice.pl", + "kepno.pl", + "ketrzyn.pl", + "klodzko.pl", + "kobierzyce.pl", + "kolobrzeg.pl", + "konin.pl", + "konskowola.pl", + "kutno.pl", + "lapy.pl", + "lebork.pl", + "legnica.pl", + "lezajsk.pl", + "limanowa.pl", + "lomza.pl", + "lowicz.pl", + "lubin.pl", + "lukow.pl", + "malbork.pl", + "malopolska.pl", + "mazowsze.pl", + "mazury.pl", + "mielec.pl", + "mielno.pl", + "mragowo.pl", + "naklo.pl", + "nowaruda.pl", + "nysa.pl", + "olawa.pl", + "olecko.pl", + "olkusz.pl", + "olsztyn.pl", + "opoczno.pl", + "opole.pl", + "ostroda.pl", + "ostroleka.pl", + "ostrowiec.pl", + "ostrowwlkp.pl", + "pila.pl", + "pisz.pl", + "podhale.pl", + "podlasie.pl", + "polkowice.pl", + "pomorze.pl", + "pomorskie.pl", + "prochowice.pl", + "pruszkow.pl", + "przeworsk.pl", + "pulawy.pl", + "radom.pl", + "rawa-maz.pl", + "rybnik.pl", + "rzeszow.pl", + "sanok.pl", + "sejny.pl", + "slask.pl", + "slupsk.pl", + "sosnowiec.pl", + "stalowa-wola.pl", + "skoczow.pl", + "starachowice.pl", + "stargard.pl", + "suwalki.pl", + "swidnica.pl", + "swiebodzin.pl", + "swinoujscie.pl", + "szczecin.pl", + "szczytno.pl", + "tarnobrzeg.pl", + "tgory.pl", + "turek.pl", + "tychy.pl", + "ustka.pl", + "walbrzych.pl", + "warmia.pl", + "warszawa.pl", + "waw.pl", + "wegrow.pl", + "wielun.pl", + "wlocl.pl", + "wloclawek.pl", + "wodzislaw.pl", + "wolomin.pl", + "wroclaw.pl", + "zachpomor.pl", + "zagan.pl", + "zarow.pl", + "zgora.pl", + "zgorzelec.pl", + "pm", + "pn", + "gov.pn", + "co.pn", + "org.pn", + "edu.pn", + "net.pn", + "post", + "pr", + "com.pr", + "net.pr", + "org.pr", + "gov.pr", + "edu.pr", + "isla.pr", + "pro.pr", + "biz.pr", + "info.pr", + "name.pr", + "est.pr", + "prof.pr", + "ac.pr", + "pro", + "aaa.pro", + "aca.pro", + "acct.pro", + "avocat.pro", + "bar.pro", + "cpa.pro", + "eng.pro", + "jur.pro", + "law.pro", + "med.pro", + "recht.pro", + "ps", + "edu.ps", + "gov.ps", + "sec.ps", + "plo.ps", + "com.ps", + "org.ps", + "net.ps", + "pt", + "net.pt", + "gov.pt", + "org.pt", + "edu.pt", + "int.pt", + "publ.pt", + "com.pt", + "nome.pt", + "pw", + "co.pw", + "ne.pw", + "or.pw", + "ed.pw", + "go.pw", + "belau.pw", + "py", + "com.py", + "coop.py", + "edu.py", + "gov.py", + "mil.py", + "net.py", + "org.py", + "qa", + "com.qa", + "edu.qa", + "gov.qa", + "mil.qa", + "name.qa", + "net.qa", + "org.qa", + "sch.qa", + "re", + "asso.re", + "com.re", + "nom.re", + "ro", + "arts.ro", + "com.ro", + "firm.ro", + "info.ro", + "nom.ro", + "nt.ro", + "org.ro", + "rec.ro", + "store.ro", + "tm.ro", + "www.ro", + "rs", + "ac.rs", + "co.rs", + "edu.rs", + "gov.rs", + "in.rs", + "org.rs", + "ru", + "ac.ru", + "edu.ru", + "gov.ru", + "int.ru", + "mil.ru", + "test.ru", + "rw", + "gov.rw", + "net.rw", + "edu.rw", + "ac.rw", + "com.rw", + "co.rw", + "int.rw", + "mil.rw", + "gouv.rw", + "sa", + "com.sa", + "net.sa", + "org.sa", + "gov.sa", + "med.sa", + "pub.sa", + "edu.sa", + "sch.sa", + "sb", + "com.sb", + "edu.sb", + "gov.sb", + "net.sb", + "org.sb", + "sc", + "com.sc", + "gov.sc", + "net.sc", + "org.sc", + "edu.sc", + "sd", + "com.sd", + "net.sd", + "org.sd", + "edu.sd", + "med.sd", + "tv.sd", + "gov.sd", + "info.sd", + "se", + "a.se", + "ac.se", + "b.se", + "bd.se", + "brand.se", + "c.se", + "d.se", + "e.se", + "f.se", + "fh.se", + "fhsk.se", + "fhv.se", + "g.se", + "h.se", + "i.se", + "k.se", + "komforb.se", + "kommunalforbund.se", + "komvux.se", + "l.se", + "lanbib.se", + "m.se", + "n.se", + "naturbruksgymn.se", + "o.se", + "org.se", + "p.se", + "parti.se", + "pp.se", + "press.se", + "r.se", + "s.se", + "t.se", + "tm.se", + "u.se", + "w.se", + "x.se", + "y.se", + "z.se", + "sg", + "com.sg", + "net.sg", + "org.sg", + "gov.sg", + "edu.sg", + "per.sg", + "sh", + "com.sh", + "net.sh", + "gov.sh", + "org.sh", + "mil.sh", + "si", + "sj", + "sk", + "sl", + "com.sl", + "net.sl", + "edu.sl", + "gov.sl", + "org.sl", + "sm", + "sn", + "art.sn", + "com.sn", + "edu.sn", + "gouv.sn", + "org.sn", + "perso.sn", + "univ.sn", + "so", + "com.so", + "net.so", + "org.so", + "sr", + "st", + "co.st", + "com.st", + "consulado.st", + "edu.st", + "embaixada.st", + "gov.st", + "mil.st", + "net.st", + "org.st", + "principe.st", + "saotome.st", + "store.st", + "su", + "sv", + "com.sv", + "edu.sv", + "gob.sv", + "org.sv", + "red.sv", + "sx", + "gov.sx", + "sy", + "edu.sy", + "gov.sy", + "net.sy", + "mil.sy", + "com.sy", + "org.sy", + "sz", + "co.sz", + "ac.sz", + "org.sz", + "tc", + "td", + "tel", + "tf", + "tg", + "th", + "ac.th", + "co.th", + "go.th", + "in.th", + "mi.th", + "net.th", + "or.th", + "tj", + "ac.tj", + "biz.tj", + "co.tj", + "com.tj", + "edu.tj", + "go.tj", + "gov.tj", + "int.tj", + "mil.tj", + "name.tj", + "net.tj", + "nic.tj", + "org.tj", + "test.tj", + "web.tj", + "tk", + "tl", + "gov.tl", + "tm", + "com.tm", + "co.tm", + "org.tm", + "net.tm", + "nom.tm", + "gov.tm", + "mil.tm", + "edu.tm", + "tn", + "com.tn", + "ens.tn", + "fin.tn", + "gov.tn", + "ind.tn", + "intl.tn", + "nat.tn", + "net.tn", + "org.tn", + "info.tn", + "perso.tn", + "tourism.tn", + "edunet.tn", + "rnrt.tn", + "rns.tn", + "rnu.tn", + "mincom.tn", + "agrinet.tn", + "defense.tn", + "turen.tn", + "to", + "com.to", + "gov.to", + "net.to", + "org.to", + "edu.to", + "mil.to", + "tr", + "com.tr", + "info.tr", + "biz.tr", + "net.tr", + "org.tr", + "web.tr", + "gen.tr", + "tv.tr", + "av.tr", + "dr.tr", + "bbs.tr", + "name.tr", + "tel.tr", + "gov.tr", + "bel.tr", + "pol.tr", + "mil.tr", + "k12.tr", + "edu.tr", + "kep.tr", + "nc.tr", + "gov.nc.tr", + "tt", + "co.tt", + "com.tt", + "org.tt", + "net.tt", + "biz.tt", + "info.tt", + "pro.tt", + "int.tt", + "coop.tt", + "jobs.tt", + "mobi.tt", + "travel.tt", + "museum.tt", + "aero.tt", + "name.tt", + "gov.tt", + "edu.tt", + "tv", + "tw", + "edu.tw", + "gov.tw", + "mil.tw", + "com.tw", + "net.tw", + "org.tw", + "idv.tw", + "game.tw", + "ebiz.tw", + "club.tw", + "xn--zf0ao64a.tw", + "xn--uc0atv.tw", + "xn--czrw28b.tw", + "tz", + "ac.tz", + "co.tz", + "go.tz", + "hotel.tz", + "info.tz", + "me.tz", + "mil.tz", + "mobi.tz", + "ne.tz", + "or.tz", + "sc.tz", + "tv.tz", + "ua", + "com.ua", + "edu.ua", + "gov.ua", + "in.ua", + "net.ua", + "org.ua", + "cherkassy.ua", + "cherkasy.ua", + "chernigov.ua", + "chernihiv.ua", + "chernivtsi.ua", + "chernovtsy.ua", + "ck.ua", + "cn.ua", + "cr.ua", + "crimea.ua", + "cv.ua", + "dn.ua", + "dnepropetrovsk.ua", + "dnipropetrovsk.ua", + "dominic.ua", + "donetsk.ua", + "dp.ua", + "if.ua", + "ivano-frankivsk.ua", + "kh.ua", + "kharkiv.ua", + "kharkov.ua", + "kherson.ua", + "khmelnitskiy.ua", + "khmelnytskyi.ua", + "kiev.ua", + "kirovograd.ua", + "km.ua", + "kr.ua", + "krym.ua", + "ks.ua", + "kv.ua", + "kyiv.ua", + "lg.ua", + "lt.ua", + "lugansk.ua", + "lutsk.ua", + "lv.ua", + "lviv.ua", + "mk.ua", + "mykolaiv.ua", + "nikolaev.ua", + "od.ua", + "odesa.ua", + "odessa.ua", + "pl.ua", + "poltava.ua", + "rivne.ua", + "rovno.ua", + "rv.ua", + "sb.ua", + "sebastopol.ua", + "sevastopol.ua", + "sm.ua", + "sumy.ua", + "te.ua", + "ternopil.ua", + "uz.ua", + "uzhgorod.ua", + "vinnica.ua", + "vinnytsia.ua", + "vn.ua", + "volyn.ua", + "yalta.ua", + "zaporizhzhe.ua", + "zaporizhzhia.ua", + "zhitomir.ua", + "zhytomyr.ua", + "zp.ua", + "zt.ua", + "ug", + "co.ug", + "or.ug", + "ac.ug", + "sc.ug", + "go.ug", + "ne.ug", + "com.ug", + "org.ug", + "uk", + "ac.uk", + "co.uk", + "gov.uk", + "ltd.uk", + "me.uk", + "net.uk", + "nhs.uk", + "org.uk", + "plc.uk", + "police.uk", + "*.sch.uk", + "us", + "dni.us", + "fed.us", + "isa.us", + "kids.us", + "nsn.us", + "ak.us", + "al.us", + "ar.us", + "as.us", + "az.us", + "ca.us", + "co.us", + "ct.us", + "dc.us", + "de.us", + "fl.us", + "ga.us", + "gu.us", + "hi.us", + "ia.us", + "id.us", + "il.us", + "in.us", + "ks.us", + "ky.us", + "la.us", + "ma.us", + "md.us", + "me.us", + "mi.us", + "mn.us", + "mo.us", + "ms.us", + "mt.us", + "nc.us", + "nd.us", + "ne.us", + "nh.us", + "nj.us", + "nm.us", + "nv.us", + "ny.us", + "oh.us", + "ok.us", + "or.us", + "pa.us", + "pr.us", + "ri.us", + "sc.us", + "sd.us", + "tn.us", + "tx.us", + "ut.us", + "vi.us", + "vt.us", + "va.us", + "wa.us", + "wi.us", + "wv.us", + "wy.us", + "k12.ak.us", + "k12.al.us", + "k12.ar.us", + "k12.as.us", + "k12.az.us", + "k12.ca.us", + "k12.co.us", + "k12.ct.us", + "k12.dc.us", + "k12.de.us", + "k12.fl.us", + "k12.ga.us", + "k12.gu.us", + "k12.ia.us", + "k12.id.us", + "k12.il.us", + "k12.in.us", + "k12.ks.us", + "k12.ky.us", + "k12.la.us", + "k12.ma.us", + "k12.md.us", + "k12.me.us", + "k12.mi.us", + "k12.mn.us", + "k12.mo.us", + "k12.ms.us", + "k12.mt.us", + "k12.nc.us", + "k12.ne.us", + "k12.nh.us", + "k12.nj.us", + "k12.nm.us", + "k12.nv.us", + "k12.ny.us", + "k12.oh.us", + "k12.ok.us", + "k12.or.us", + "k12.pa.us", + "k12.pr.us", + "k12.ri.us", + "k12.sc.us", + "k12.tn.us", + "k12.tx.us", + "k12.ut.us", + "k12.vi.us", + "k12.vt.us", + "k12.va.us", + "k12.wa.us", + "k12.wi.us", + "k12.wy.us", + "cc.ak.us", + "cc.al.us", + "cc.ar.us", + "cc.as.us", + "cc.az.us", + "cc.ca.us", + "cc.co.us", + "cc.ct.us", + "cc.dc.us", + "cc.de.us", + "cc.fl.us", + "cc.ga.us", + "cc.gu.us", + "cc.hi.us", + "cc.ia.us", + "cc.id.us", + "cc.il.us", + "cc.in.us", + "cc.ks.us", + "cc.ky.us", + "cc.la.us", + "cc.ma.us", + "cc.md.us", + "cc.me.us", + "cc.mi.us", + "cc.mn.us", + "cc.mo.us", + "cc.ms.us", + "cc.mt.us", + "cc.nc.us", + "cc.nd.us", + "cc.ne.us", + "cc.nh.us", + "cc.nj.us", + "cc.nm.us", + "cc.nv.us", + "cc.ny.us", + "cc.oh.us", + "cc.ok.us", + "cc.or.us", + "cc.pa.us", + "cc.pr.us", + "cc.ri.us", + "cc.sc.us", + "cc.sd.us", + "cc.tn.us", + "cc.tx.us", + "cc.ut.us", + "cc.vi.us", + "cc.vt.us", + "cc.va.us", + "cc.wa.us", + "cc.wi.us", + "cc.wv.us", + "cc.wy.us", + "lib.ak.us", + "lib.al.us", + "lib.ar.us", + "lib.as.us", + "lib.az.us", + "lib.ca.us", + "lib.co.us", + "lib.ct.us", + "lib.dc.us", + "lib.fl.us", + "lib.ga.us", + "lib.gu.us", + "lib.hi.us", + "lib.ia.us", + "lib.id.us", + "lib.il.us", + "lib.in.us", + "lib.ks.us", + "lib.ky.us", + "lib.la.us", + "lib.ma.us", + "lib.md.us", + "lib.me.us", + "lib.mi.us", + "lib.mn.us", + "lib.mo.us", + "lib.ms.us", + "lib.mt.us", + "lib.nc.us", + "lib.nd.us", + "lib.ne.us", + "lib.nh.us", + "lib.nj.us", + "lib.nm.us", + "lib.nv.us", + "lib.ny.us", + "lib.oh.us", + "lib.ok.us", + "lib.or.us", + "lib.pa.us", + "lib.pr.us", + "lib.ri.us", + "lib.sc.us", + "lib.sd.us", + "lib.tn.us", + "lib.tx.us", + "lib.ut.us", + "lib.vi.us", + "lib.vt.us", + "lib.va.us", + "lib.wa.us", + "lib.wi.us", + "lib.wy.us", + "pvt.k12.ma.us", + "chtr.k12.ma.us", + "paroch.k12.ma.us", + "ann-arbor.mi.us", + "cog.mi.us", + "dst.mi.us", + "eaton.mi.us", + "gen.mi.us", + "mus.mi.us", + "tec.mi.us", + "washtenaw.mi.us", + "uy", + "com.uy", + "edu.uy", + "gub.uy", + "mil.uy", + "net.uy", + "org.uy", + "uz", + "co.uz", + "com.uz", + "net.uz", + "org.uz", + "va", + "vc", + "com.vc", + "net.vc", + "org.vc", + "gov.vc", + "mil.vc", + "edu.vc", + "ve", + "arts.ve", + "co.ve", + "com.ve", + "e12.ve", + "edu.ve", + "firm.ve", + "gob.ve", + "gov.ve", + "info.ve", + "int.ve", + "mil.ve", + "net.ve", + "org.ve", + "rec.ve", + "store.ve", + "tec.ve", + "web.ve", + "vg", + "vi", + "co.vi", + "com.vi", + "k12.vi", + "net.vi", + "org.vi", + "vn", + "com.vn", + "net.vn", + "org.vn", + "edu.vn", + "gov.vn", + "int.vn", + "ac.vn", + "biz.vn", + "info.vn", + "name.vn", + "pro.vn", + "health.vn", + "vu", + "com.vu", + "edu.vu", + "net.vu", + "org.vu", + "wf", + "ws", + "com.ws", + "net.ws", + "org.ws", + "gov.ws", + "edu.ws", + "yt", + "xn--mgbaam7a8h", + "xn--y9a3aq", + "xn--54b7fta0cc", + "xn--90ae", + "xn--90ais", + "xn--fiqs8s", + "xn--fiqz9s", + "xn--lgbbat1ad8j", + "xn--wgbh1c", + "xn--e1a4c", + "xn--node", + "xn--qxam", + "xn--j6w193g", + "xn--55qx5d.xn--j6w193g", + "xn--wcvs22d.xn--j6w193g", + "xn--mxtq1m.xn--j6w193g", + "xn--gmqw5a.xn--j6w193g", + "xn--od0alg.xn--j6w193g", + "xn--uc0atv.xn--j6w193g", + "xn--2scrj9c", + "xn--3hcrj9c", + "xn--45br5cyl", + "xn--h2breg3eve", + "xn--h2brj9c8c", + "xn--mgbgu82a", + "xn--rvc1e0am3e", + "xn--h2brj9c", + "xn--mgbbh1a", + "xn--mgbbh1a71e", + "xn--fpcrj9c3d", + "xn--gecrj9c", + "xn--s9brj9c", + "xn--45brj9c", + "xn--xkc2dl3a5ee0h", + "xn--mgba3a4f16a", + "xn--mgba3a4fra", + "xn--mgbtx2b", + "xn--mgbayh7gpa", + "xn--3e0b707e", + "xn--80ao21a", + "xn--fzc2c9e2c", + "xn--xkc2al3hye2a", + "xn--mgbc0a9azcg", + "xn--d1alf", + "xn--l1acc", + "xn--mix891f", + "xn--mix082f", + "xn--mgbx4cd0ab", + "xn--mgb9awbf", + "xn--mgbai9azgqp6j", + "xn--mgbai9a5eva00b", + "xn--ygbi2ammx", + "xn--90a3ac", + "xn--o1ac.xn--90a3ac", + "xn--c1avg.xn--90a3ac", + "xn--90azh.xn--90a3ac", + "xn--d1at.xn--90a3ac", + "xn--o1ach.xn--90a3ac", + "xn--80au.xn--90a3ac", + "xn--p1ai", + "xn--wgbl6a", + "xn--mgberp4a5d4ar", + "xn--mgberp4a5d4a87g", + "xn--mgbqly7c0a67fbc", + "xn--mgbqly7cvafr", + "xn--mgbpl2fh", + "xn--yfro4i67o", + "xn--clchc0ea0b2g2a9gcd", + "xn--ogbpf8fl", + "xn--mgbtf8fl", + "xn--o3cw4h", + "xn--12c1fe0br.xn--o3cw4h", + "xn--12co0c3b4eva.xn--o3cw4h", + "xn--h3cuzk1di.xn--o3cw4h", + "xn--o3cyx2a.xn--o3cw4h", + "xn--m3ch0j3a.xn--o3cw4h", + "xn--12cfi8ixb8l.xn--o3cw4h", + "xn--pgbs0dh", + "xn--kpry57d", + "xn--kprw13d", + "xn--nnx388a", + "xn--j1amh", + "xn--mgb2ddes", + "xxx", + "*.ye", + "ac.za", + "agric.za", + "alt.za", + "co.za", + "edu.za", + "gov.za", + "grondar.za", + "law.za", + "mil.za", + "net.za", + "ngo.za", + "nis.za", + "nom.za", + "org.za", + "school.za", + "tm.za", + "web.za", + "zm", + "ac.zm", + "biz.zm", + "co.zm", + "com.zm", + "edu.zm", + "gov.zm", + "info.zm", + "mil.zm", + "net.zm", + "org.zm", + "sch.zm", + "zw", + "ac.zw", + "co.zw", + "gov.zw", + "mil.zw", + "org.zw", + "aaa", + "aarp", + "abarth", + "abb", + "abbott", + "abbvie", + "abc", + "able", + "abogado", + "abudhabi", + "academy", + "accenture", + "accountant", + "accountants", + "aco", + "active", + "actor", + "adac", + "ads", + "adult", + "aeg", + "aetna", + "afamilycompany", + "afl", + "africa", + "agakhan", + "agency", + "aig", + "aigo", + "airbus", + "airforce", + "airtel", + "akdn", + "alfaromeo", + "alibaba", + "alipay", + "allfinanz", + "allstate", + "ally", + "alsace", + "alstom", + "americanexpress", + "americanfamily", + "amex", + "amfam", + "amica", + "amsterdam", + "analytics", + "android", + "anquan", + "anz", + "aol", + "apartments", + "app", + "apple", + "aquarelle", + "arab", + "aramco", + "archi", + "army", + "art", + "arte", + "asda", + "associates", + "athleta", + "attorney", + "auction", + "audi", + "audible", + "audio", + "auspost", + "author", + "auto", + "autos", + "avianca", + "aws", + "axa", + "azure", + "baby", + "baidu", + "banamex", + "bananarepublic", + "band", + "bank", + "bar", + "barcelona", + "barclaycard", + "barclays", + "barefoot", + "bargains", + "baseball", + "basketball", + "bauhaus", + "bayern", + "bbc", + "bbt", + "bbva", + "bcg", + "bcn", + "beats", + "beauty", + "beer", + "bentley", + "berlin", + "best", + "bestbuy", + "bet", + "bharti", + "bible", + "bid", + "bike", + "bing", + "bingo", + "bio", + "black", + "blackfriday", + "blanco", + "blockbuster", + "blog", + "bloomberg", + "blue", + "bms", + "bmw", + "bnl", + "bnpparibas", + "boats", + "boehringer", + "bofa", + "bom", + "bond", + "boo", + "book", + "booking", + "bosch", + "bostik", + "boston", + "bot", + "boutique", + "box", + "bradesco", + "bridgestone", + "broadway", + "broker", + "brother", + "brussels", + "budapest", + "bugatti", + "build", + "builders", + "business", + "buy", + "buzz", + "bzh", + "cab", + "cafe", + "cal", + "call", + "calvinklein", + "cam", + "camera", + "camp", + "cancerresearch", + "canon", + "capetown", + "capital", + "capitalone", + "car", + "caravan", + "cards", + "care", + "career", + "careers", + "cars", + "cartier", + "casa", + "case", + "caseih", + "cash", + "casino", + "catering", + "catholic", + "cba", + "cbn", + "cbre", + "cbs", + "ceb", + "center", + "ceo", + "cern", + "cfa", + "cfd", + "chanel", + "channel", + "charity", + "chase", + "chat", + "cheap", + "chintai", + "christmas", + "chrome", + "chrysler", + "church", + "cipriani", + "circle", + "cisco", + "citadel", + "citi", + "citic", + "city", + "cityeats", + "claims", + "cleaning", + "click", + "clinic", + "clinique", + "clothing", + "cloud", + "club", + "clubmed", + "coach", + "codes", + "coffee", + "college", + "cologne", + "comcast", + "commbank", + "community", + "company", + "compare", + "computer", + "comsec", + "condos", + "construction", + "consulting", + "contact", + "contractors", + "cooking", + "cookingchannel", + "cool", + "corsica", + "country", + "coupon", + "coupons", + "courses", + "credit", + "creditcard", + "creditunion", + "cricket", + "crown", + "crs", + "cruise", + "cruises", + "csc", + "cuisinella", + "cymru", + "cyou", + "dabur", + "dad", + "dance", + "data", + "date", + "dating", + "datsun", + "day", + "dclk", + "dds", + "deal", + "dealer", + "deals", + "degree", + "delivery", + "dell", + "deloitte", + "delta", + "democrat", + "dental", + "dentist", + "desi", + "design", + "dev", + "dhl", + "diamonds", + "diet", + "digital", + "direct", + "directory", + "discount", + "discover", + "dish", + "diy", + "dnp", + "docs", + "doctor", + "dodge", + "dog", + "doha", + "domains", + "dot", + "download", + "drive", + "dtv", + "dubai", + "duck", + "dunlop", + "duns", + "dupont", + "durban", + "dvag", + "dvr", + "earth", + "eat", + "eco", + "edeka", + "education", + "email", + "emerck", + "energy", + "engineer", + "engineering", + "enterprises", + "epost", + "epson", + "equipment", + "ericsson", + "erni", + "esq", + "estate", + "esurance", + "etisalat", + "eurovision", + "eus", + "events", + "everbank", + "exchange", + "expert", + "exposed", + "express", + "extraspace", + "fage", + "fail", + "fairwinds", + "faith", + "family", + "fan", + "fans", + "farm", + "farmers", + "fashion", + "fast", + "fedex", + "feedback", + "ferrari", + "ferrero", + "fiat", + "fidelity", + "fido", + "film", + "final", + "finance", + "financial", + "fire", + "firestone", + "firmdale", + "fish", + "fishing", + "fit", + "fitness", + "flickr", + "flights", + "flir", + "florist", + "flowers", + "fly", + "foo", + "food", + "foodnetwork", + "football", + "ford", + "forex", + "forsale", + "forum", + "foundation", + "fox", + "free", + "fresenius", + "frl", + "frogans", + "frontdoor", + "frontier", + "ftr", + "fujitsu", + "fujixerox", + "fun", + "fund", + "furniture", + "futbol", + "fyi", + "gal", + "gallery", + "gallo", + "gallup", + "game", + "games", + "gap", + "garden", + "gbiz", + "gdn", + "gea", + "gent", + "genting", + "george", + "ggee", + "gift", + "gifts", + "gives", + "giving", + "glade", + "glass", + "gle", + "global", + "globo", + "gmail", + "gmbh", + "gmo", + "gmx", + "godaddy", + "gold", + "goldpoint", + "golf", + "goo", + "goodhands", + "goodyear", + "goog", + "google", + "gop", + "got", + "grainger", + "graphics", + "gratis", + "green", + "gripe", + "grocery", + "group", + "guardian", + "gucci", + "guge", + "guide", + "guitars", + "guru", + "hair", + "hamburg", + "hangout", + "haus", + "hbo", + "hdfc", + "hdfcbank", + "health", + "healthcare", + "help", + "helsinki", + "here", + "hermes", + "hgtv", + "hiphop", + "hisamitsu", + "hitachi", + "hiv", + "hkt", + "hockey", + "holdings", + "holiday", + "homedepot", + "homegoods", + "homes", + "homesense", + "honda", + "honeywell", + "horse", + "hospital", + "host", + "hosting", + "hot", + "hoteles", + "hotels", + "hotmail", + "house", + "how", + "hsbc", + "hughes", + "hyatt", + "hyundai", + "ibm", + "icbc", + "ice", + "icu", + "ieee", + "ifm", + "ikano", + "imamat", + "imdb", + "immo", + "immobilien", + "inc", + "industries", + "infiniti", + "ing", + "ink", + "institute", + "insurance", + "insure", + "intel", + "international", + "intuit", + "investments", + "ipiranga", + "irish", + "iselect", + "ismaili", + "ist", + "istanbul", + "itau", + "itv", + "iveco", + "iwc", + "jaguar", + "java", + "jcb", + "jcp", + "jeep", + "jetzt", + "jewelry", + "jio", + "jlc", + "jll", + "jmp", + "jnj", + "joburg", + "jot", + "joy", + "jpmorgan", + "jprs", + "juegos", + "juniper", + "kaufen", + "kddi", + "kerryhotels", + "kerrylogistics", + "kerryproperties", + "kfh", + "kia", + "kim", + "kinder", + "kindle", + "kitchen", + "kiwi", + "koeln", + "komatsu", + "kosher", + "kpmg", + "kpn", + "krd", + "kred", + "kuokgroup", + "kyoto", + "lacaixa", + "ladbrokes", + "lamborghini", + "lamer", + "lancaster", + "lancia", + "lancome", + "land", + "landrover", + "lanxess", + "lasalle", + "lat", + "latino", + "latrobe", + "law", + "lawyer", + "lds", + "lease", + "leclerc", + "lefrak", + "legal", + "lego", + "lexus", + "lgbt", + "liaison", + "lidl", + "life", + "lifeinsurance", + "lifestyle", + "lighting", + "like", + "lilly", + "limited", + "limo", + "lincoln", + "linde", + "link", + "lipsy", + "live", + "living", + "lixil", + "llc", + "loan", + "loans", + "locker", + "locus", + "loft", + "lol", + "london", + "lotte", + "lotto", + "love", + "lpl", + "lplfinancial", + "ltd", + "ltda", + "lundbeck", + "lupin", + "luxe", + "luxury", + "macys", + "madrid", + "maif", + "maison", + "makeup", + "man", + "management", + "mango", + "map", + "market", + "marketing", + "markets", + "marriott", + "marshalls", + "maserati", + "mattel", + "mba", + "mckinsey", + "med", + "media", + "meet", + "melbourne", + "meme", + "memorial", + "men", + "menu", + "meo", + "merckmsd", + "metlife", + "miami", + "microsoft", + "mini", + "mint", + "mit", + "mitsubishi", + "mlb", + "mls", + "mma", + "mobile", + "mobily", + "moda", + "moe", + "moi", + "mom", + "monash", + "money", + "monster", + "mopar", + "mormon", + "mortgage", + "moscow", + "moto", + "motorcycles", + "mov", + "movie", + "movistar", + "msd", + "mtn", + "mtr", + "mutual", + "nab", + "nadex", + "nagoya", + "nationwide", + "natura", + "navy", + "nba", + "nec", + "netbank", + "netflix", + "network", + "neustar", + "new", + "newholland", + "news", + "next", + "nextdirect", + "nexus", + "nfl", + "ngo", + "nhk", + "nico", + "nike", + "nikon", + "ninja", + "nissan", + "nissay", + "nokia", + "northwesternmutual", + "norton", + "now", + "nowruz", + "nowtv", + "nra", + "nrw", + "ntt", + "nyc", + "obi", + "observer", + "off", + "office", + "okinawa", + "olayan", + "olayangroup", + "oldnavy", + "ollo", + "omega", + "one", + "ong", + "onl", + "online", + "onyourside", + "ooo", + "open", + "oracle", + "orange", + "organic", + "origins", + "osaka", + "otsuka", + "ott", + "ovh", + "page", + "panasonic", + "panerai", + "paris", + "pars", + "partners", + "parts", + "party", + "passagens", + "pay", + "pccw", + "pet", + "pfizer", + "pharmacy", + "phd", + "philips", + "phone", + "photo", + "photography", + "photos", + "physio", + "piaget", + "pics", + "pictet", + "pictures", + "pid", + "pin", + "ping", + "pink", + "pioneer", + "pizza", + "place", + "play", + "playstation", + "plumbing", + "plus", + "pnc", + "pohl", + "poker", + "politie", + "porn", + "pramerica", + "praxi", + "press", + "prime", + "prod", + "productions", + "prof", + "progressive", + "promo", + "properties", + "property", + "protection", + "pru", + "prudential", + "pub", + "pwc", + "qpon", + "quebec", + "quest", + "qvc", + "racing", + "radio", + "raid", + "read", + "realestate", + "realtor", + "realty", + "recipes", + "red", + "redstone", + "redumbrella", + "rehab", + "reise", + "reisen", + "reit", + "reliance", + "ren", + "rent", + "rentals", + "repair", + "report", + "republican", + "rest", + "restaurant", + "review", + "reviews", + "rexroth", + "rich", + "richardli", + "ricoh", + "rightathome", + "ril", + "rio", + "rip", + "rmit", + "rocher", + "rocks", + "rodeo", + "rogers", + "room", + "rsvp", + "rugby", + "ruhr", + "run", + "rwe", + "ryukyu", + "saarland", + "safe", + "safety", + "sakura", + "sale", + "salon", + "samsclub", + "samsung", + "sandvik", + "sandvikcoromant", + "sanofi", + "sap", + "sapo", + "sarl", + "sas", + "save", + "saxo", + "sbi", + "sbs", + "sca", + "scb", + "schaeffler", + "schmidt", + "scholarships", + "school", + "schule", + "schwarz", + "science", + "scjohnson", + "scor", + "scot", + "search", + "seat", + "secure", + "security", + "seek", + "select", + "sener", + "services", + "ses", + "seven", + "sew", + "sex", + "sexy", + "sfr", + "shangrila", + "sharp", + "shaw", + "shell", + "shia", + "shiksha", + "shoes", + "shop", + "shopping", + "shouji", + "show", + "showtime", + "shriram", + "silk", + "sina", + "singles", + "site", + "ski", + "skin", + "sky", + "skype", + "sling", + "smart", + "smile", + "sncf", + "soccer", + "social", + "softbank", + "software", + "sohu", + "solar", + "solutions", + "song", + "sony", + "soy", + "space", + "spiegel", + "sport", + "spot", + "spreadbetting", + "srl", + "srt", + "stada", + "staples", + "star", + "starhub", + "statebank", + "statefarm", + "statoil", + "stc", + "stcgroup", + "stockholm", + "storage", + "store", + "stream", + "studio", + "study", + "style", + "sucks", + "supplies", + "supply", + "support", + "surf", + "surgery", + "suzuki", + "swatch", + "swiftcover", + "swiss", + "sydney", + "symantec", + "systems", + "tab", + "taipei", + "talk", + "taobao", + "target", + "tatamotors", + "tatar", + "tattoo", + "tax", + "taxi", + "tci", + "tdk", + "team", + "tech", + "technology", + "telecity", + "telefonica", + "temasek", + "tennis", + "teva", + "thd", + "theater", + "theatre", + "tiaa", + "tickets", + "tienda", + "tiffany", + "tips", + "tires", + "tirol", + "tjmaxx", + "tjx", + "tkmaxx", + "tmall", + "today", + "tokyo", + "tools", + "top", + "toray", + "toshiba", + "total", + "tours", + "town", + "toyota", + "toys", + "trade", + "trading", + "training", + "travel", + "travelchannel", + "travelers", + "travelersinsurance", + "trust", + "trv", + "tube", + "tui", + "tunes", + "tushu", + "tvs", + "ubank", + "ubs", + "uconnect", + "unicom", + "university", + "uno", + "uol", + "ups", + "vacations", + "vana", + "vanguard", + "vegas", + "ventures", + "verisign", + "versicherung", + "vet", + "viajes", + "video", + "vig", + "viking", + "villas", + "vin", + "vip", + "virgin", + "visa", + "vision", + "vista", + "vistaprint", + "viva", + "vivo", + "vlaanderen", + "vodka", + "volkswagen", + "volvo", + "vote", + "voting", + "voto", + "voyage", + "vuelos", + "wales", + "walmart", + "walter", + "wang", + "wanggou", + "warman", + "watch", + "watches", + "weather", + "weatherchannel", + "webcam", + "weber", + "website", + "wed", + "wedding", + "weibo", + "weir", + "whoswho", + "wien", + "wiki", + "williamhill", + "win", + "windows", + "wine", + "winners", + "wme", + "wolterskluwer", + "woodside", + "work", + "works", + "world", + "wow", + "wtc", + "wtf", + "xbox", + "xerox", + "xfinity", + "xihuan", + "xin", + "xn--11b4c3d", + "xn--1ck2e1b", + "xn--1qqw23a", + "xn--30rr7y", + "xn--3bst00m", + "xn--3ds443g", + "xn--3oq18vl8pn36a", + "xn--3pxu8k", + "xn--42c2d9a", + "xn--45q11c", + "xn--4gbrim", + "xn--55qw42g", + "xn--55qx5d", + "xn--5su34j936bgsg", + "xn--5tzm5g", + "xn--6frz82g", + "xn--6qq986b3xl", + "xn--80adxhks", + "xn--80aqecdr1a", + "xn--80asehdb", + "xn--80aswg", + "xn--8y0a063a", + "xn--9dbq2a", + "xn--9et52u", + "xn--9krt00a", + "xn--b4w605ferd", + "xn--bck1b9a5dre4c", + "xn--c1avg", + "xn--c2br7g", + "xn--cck2b3b", + "xn--cg4bki", + "xn--czr694b", + "xn--czrs0t", + "xn--czru2d", + "xn--d1acj3b", + "xn--eckvdtc9d", + "xn--efvy88h", + "xn--estv75g", + "xn--fct429k", + "xn--fhbei", + "xn--fiq228c5hs", + "xn--fiq64b", + "xn--fjq720a", + "xn--flw351e", + "xn--fzys8d69uvgm", + "xn--g2xx48c", + "xn--gckr3f0f", + "xn--gk3at1e", + "xn--hxt814e", + "xn--i1b6b1a6a2e", + "xn--imr513n", + "xn--io0a7i", + "xn--j1aef", + "xn--jlq61u9w7b", + "xn--jvr189m", + "xn--kcrx77d1x4a", + "xn--kpu716f", + "xn--kput3i", + "xn--mgba3a3ejt", + "xn--mgba7c0bbn0a", + "xn--mgbaakc7dvf", + "xn--mgbab2bd", + "xn--mgbb9fbpob", + "xn--mgbca7dzdo", + "xn--mgbi4ecexp", + "xn--mgbt3dhd", + "xn--mk1bu44c", + "xn--mxtq1m", + "xn--ngbc5azd", + "xn--ngbe9e0a", + "xn--ngbrx", + "xn--nqv7f", + "xn--nqv7fs00ema", + "xn--nyqy26a", + "xn--otu796d", + "xn--p1acf", + "xn--pbt977c", + "xn--pssy2u", + "xn--q9jyb4c", + "xn--qcka1pmc", + "xn--rhqv96g", + "xn--rovu88b", + "xn--ses554g", + "xn--t60b56a", + "xn--tckwe", + "xn--tiq49xqyj", + "xn--unup4y", + "xn--vermgensberater-ctb", + "xn--vermgensberatung-pwb", + "xn--vhquv", + "xn--vuq861b", + "xn--w4r85el8fhu5dnra", + "xn--w4rs40l", + "xn--xhq521b", + "xn--zfr164b", + "xperia", + "xyz", + "yachts", + "yahoo", + "yamaxun", + "yandex", + "yodobashi", + "yoga", + "yokohama", + "you", + "youtube", + "yun", + "zappos", + "zara", + "zero", + "zip", + "zippo", + "zone", + "zuerich", + "cc.ua", + "inf.ua", + "ltd.ua", + "beep.pl", + "*.compute.estate", + "*.alces.network", + "alwaysdata.net", + "cloudfront.net", + "*.compute.amazonaws.com", + "*.compute-1.amazonaws.com", + "*.compute.amazonaws.com.cn", + "us-east-1.amazonaws.com", + "cn-north-1.eb.amazonaws.com.cn", + "elasticbeanstalk.com", + "ap-northeast-1.elasticbeanstalk.com", + "ap-northeast-2.elasticbeanstalk.com", + "ap-northeast-3.elasticbeanstalk.com", + "ap-south-1.elasticbeanstalk.com", + "ap-southeast-1.elasticbeanstalk.com", + "ap-southeast-2.elasticbeanstalk.com", + "ca-central-1.elasticbeanstalk.com", + "eu-central-1.elasticbeanstalk.com", + "eu-west-1.elasticbeanstalk.com", + "eu-west-2.elasticbeanstalk.com", + "eu-west-3.elasticbeanstalk.com", + "sa-east-1.elasticbeanstalk.com", + "us-east-1.elasticbeanstalk.com", + "us-east-2.elasticbeanstalk.com", + "us-gov-west-1.elasticbeanstalk.com", + "us-west-1.elasticbeanstalk.com", + "us-west-2.elasticbeanstalk.com", + "*.elb.amazonaws.com", + "*.elb.amazonaws.com.cn", + "s3.amazonaws.com", + "s3-ap-northeast-1.amazonaws.com", + "s3-ap-northeast-2.amazonaws.com", + "s3-ap-south-1.amazonaws.com", + "s3-ap-southeast-1.amazonaws.com", + "s3-ap-southeast-2.amazonaws.com", + "s3-ca-central-1.amazonaws.com", + "s3-eu-central-1.amazonaws.com", + "s3-eu-west-1.amazonaws.com", + "s3-eu-west-2.amazonaws.com", + "s3-eu-west-3.amazonaws.com", + "s3-external-1.amazonaws.com", + "s3-fips-us-gov-west-1.amazonaws.com", + "s3-sa-east-1.amazonaws.com", + "s3-us-gov-west-1.amazonaws.com", + "s3-us-east-2.amazonaws.com", + "s3-us-west-1.amazonaws.com", + "s3-us-west-2.amazonaws.com", + "s3.ap-northeast-2.amazonaws.com", + "s3.ap-south-1.amazonaws.com", + "s3.cn-north-1.amazonaws.com.cn", + "s3.ca-central-1.amazonaws.com", + "s3.eu-central-1.amazonaws.com", + "s3.eu-west-2.amazonaws.com", + "s3.eu-west-3.amazonaws.com", + "s3.us-east-2.amazonaws.com", + "s3.dualstack.ap-northeast-1.amazonaws.com", + "s3.dualstack.ap-northeast-2.amazonaws.com", + "s3.dualstack.ap-south-1.amazonaws.com", + "s3.dualstack.ap-southeast-1.amazonaws.com", + "s3.dualstack.ap-southeast-2.amazonaws.com", + "s3.dualstack.ca-central-1.amazonaws.com", + "s3.dualstack.eu-central-1.amazonaws.com", + "s3.dualstack.eu-west-1.amazonaws.com", + "s3.dualstack.eu-west-2.amazonaws.com", + "s3.dualstack.eu-west-3.amazonaws.com", + "s3.dualstack.sa-east-1.amazonaws.com", + "s3.dualstack.us-east-1.amazonaws.com", + "s3.dualstack.us-east-2.amazonaws.com", + "s3-website-us-east-1.amazonaws.com", + "s3-website-us-west-1.amazonaws.com", + "s3-website-us-west-2.amazonaws.com", + "s3-website-ap-northeast-1.amazonaws.com", + "s3-website-ap-southeast-1.amazonaws.com", + "s3-website-ap-southeast-2.amazonaws.com", + "s3-website-eu-west-1.amazonaws.com", + "s3-website-sa-east-1.amazonaws.com", + "s3-website.ap-northeast-2.amazonaws.com", + "s3-website.ap-south-1.amazonaws.com", + "s3-website.ca-central-1.amazonaws.com", + "s3-website.eu-central-1.amazonaws.com", + "s3-website.eu-west-2.amazonaws.com", + "s3-website.eu-west-3.amazonaws.com", + "s3-website.us-east-2.amazonaws.com", + "t3l3p0rt.net", + "tele.amune.org", + "on-aptible.com", + "user.party.eus", + "pimienta.org", + "poivron.org", + "potager.org", + "sweetpepper.org", + "myasustor.com", + "myfritz.net", + "*.awdev.ca", + "*.advisor.ws", + "backplaneapp.io", + "betainabox.com", + "bnr.la", + "blackbaudcdn.net", + "boomla.net", + "boxfuse.io", + "square7.ch", + "bplaced.com", + "bplaced.de", + "square7.de", + "bplaced.net", + "square7.net", + "browsersafetymark.io", + "mycd.eu", + "ae.org", + "ar.com", + "br.com", + "cn.com", + "com.de", + "com.se", + "de.com", + "eu.com", + "gb.com", + "gb.net", + "hu.com", + "hu.net", + "jp.net", + "jpn.com", + "kr.com", + "mex.com", + "no.com", + "qc.com", + "ru.com", + "sa.com", + "se.net", + "uk.com", + "uk.net", + "us.com", + "uy.com", + "za.bz", + "za.com", + "africa.com", + "gr.com", + "in.net", + "us.org", + "co.com", + "c.la", + "certmgr.org", + "xenapponazure.com", + "virtueeldomein.nl", + "cleverapps.io", + "c66.me", + "cloud66.ws", + "jdevcloud.com", + "wpdevcloud.com", + "cloudaccess.host", + "freesite.host", + "cloudaccess.net", + "cloudcontrolled.com", + "cloudcontrolapp.com", + "co.ca", + "*.otap.co", + "co.cz", + "c.cdn77.org", + "cdn77-ssl.net", + "r.cdn77.net", + "rsc.cdn77.org", + "ssl.origin.cdn77-secure.org", + "cloudns.asia", + "cloudns.biz", + "cloudns.club", + "cloudns.cc", + "cloudns.eu", + "cloudns.in", + "cloudns.info", + "cloudns.org", + "cloudns.pro", + "cloudns.pw", + "cloudns.us", + "cloudeity.net", + "cnpy.gdn", + "co.nl", + "co.no", + "webhosting.be", + "hosting-cluster.nl", + "dyn.cosidns.de", + "dynamisches-dns.de", + "dnsupdater.de", + "internet-dns.de", + "l-o-g-i-n.de", + "dynamic-dns.info", + "feste-ip.net", + "knx-server.net", + "static-access.net", + "realm.cz", + "*.cryptonomic.net", + "cupcake.is", + "cyon.link", + "cyon.site", + "daplie.me", + "localhost.daplie.me", + "dattolocal.com", + "dattorelay.com", + "dattoweb.com", + "mydatto.com", + "dattolocal.net", + "mydatto.net", + "biz.dk", + "co.dk", + "firm.dk", + "reg.dk", + "store.dk", + "debian.net", + "dedyn.io", + "dnshome.de", + "drayddns.com", + "dreamhosters.com", + "mydrobo.com", + "drud.io", + "drud.us", + "duckdns.org", + "dy.fi", + "tunk.org", + "dyndns-at-home.com", + "dyndns-at-work.com", + "dyndns-blog.com", + "dyndns-free.com", + "dyndns-home.com", + "dyndns-ip.com", + "dyndns-mail.com", + "dyndns-office.com", + "dyndns-pics.com", + "dyndns-remote.com", + "dyndns-server.com", + "dyndns-web.com", + "dyndns-wiki.com", + "dyndns-work.com", + "dyndns.biz", + "dyndns.info", + "dyndns.org", + "dyndns.tv", + "at-band-camp.net", + "ath.cx", + "barrel-of-knowledge.info", + "barrell-of-knowledge.info", + "better-than.tv", + "blogdns.com", + "blogdns.net", + "blogdns.org", + "blogsite.org", + "boldlygoingnowhere.org", + "broke-it.net", + "buyshouses.net", + "cechire.com", + "dnsalias.com", + "dnsalias.net", + "dnsalias.org", + "dnsdojo.com", + "dnsdojo.net", + "dnsdojo.org", + "does-it.net", + "doesntexist.com", + "doesntexist.org", + "dontexist.com", + "dontexist.net", + "dontexist.org", + "doomdns.com", + "doomdns.org", + "dvrdns.org", + "dyn-o-saur.com", + "dynalias.com", + "dynalias.net", + "dynalias.org", + "dynathome.net", + "dyndns.ws", + "endofinternet.net", + "endofinternet.org", + "endoftheinternet.org", + "est-a-la-maison.com", + "est-a-la-masion.com", + "est-le-patron.com", + "est-mon-blogueur.com", + "for-better.biz", + "for-more.biz", + "for-our.info", + "for-some.biz", + "for-the.biz", + "forgot.her.name", + "forgot.his.name", + "from-ak.com", + "from-al.com", + "from-ar.com", + "from-az.net", + "from-ca.com", + "from-co.net", + "from-ct.com", + "from-dc.com", + "from-de.com", + "from-fl.com", + "from-ga.com", + "from-hi.com", + "from-ia.com", + "from-id.com", + "from-il.com", + "from-in.com", + "from-ks.com", + "from-ky.com", + "from-la.net", + "from-ma.com", + "from-md.com", + "from-me.org", + "from-mi.com", + "from-mn.com", + "from-mo.com", + "from-ms.com", + "from-mt.com", + "from-nc.com", + "from-nd.com", + "from-ne.com", + "from-nh.com", + "from-nj.com", + "from-nm.com", + "from-nv.com", + "from-ny.net", + "from-oh.com", + "from-ok.com", + "from-or.com", + "from-pa.com", + "from-pr.com", + "from-ri.com", + "from-sc.com", + "from-sd.com", + "from-tn.com", + "from-tx.com", + "from-ut.com", + "from-va.com", + "from-vt.com", + "from-wa.com", + "from-wi.com", + "from-wv.com", + "from-wy.com", + "ftpaccess.cc", + "fuettertdasnetz.de", + "game-host.org", + "game-server.cc", + "getmyip.com", + "gets-it.net", + "go.dyndns.org", + "gotdns.com", + "gotdns.org", + "groks-the.info", + "groks-this.info", + "ham-radio-op.net", + "here-for-more.info", + "hobby-site.com", + "hobby-site.org", + "home.dyndns.org", + "homedns.org", + "homeftp.net", + "homeftp.org", + "homeip.net", + "homelinux.com", + "homelinux.net", + "homelinux.org", + "homeunix.com", + "homeunix.net", + "homeunix.org", + "iamallama.com", + "in-the-band.net", + "is-a-anarchist.com", + "is-a-blogger.com", + "is-a-bookkeeper.com", + "is-a-bruinsfan.org", + "is-a-bulls-fan.com", + "is-a-candidate.org", + "is-a-caterer.com", + "is-a-celticsfan.org", + "is-a-chef.com", + "is-a-chef.net", + "is-a-chef.org", + "is-a-conservative.com", + "is-a-cpa.com", + "is-a-cubicle-slave.com", + "is-a-democrat.com", + "is-a-designer.com", + "is-a-doctor.com", + "is-a-financialadvisor.com", + "is-a-geek.com", + "is-a-geek.net", + "is-a-geek.org", + "is-a-green.com", + "is-a-guru.com", + "is-a-hard-worker.com", + "is-a-hunter.com", + "is-a-knight.org", + "is-a-landscaper.com", + "is-a-lawyer.com", + "is-a-liberal.com", + "is-a-libertarian.com", + "is-a-linux-user.org", + "is-a-llama.com", + "is-a-musician.com", + "is-a-nascarfan.com", + "is-a-nurse.com", + "is-a-painter.com", + "is-a-patsfan.org", + "is-a-personaltrainer.com", + "is-a-photographer.com", + "is-a-player.com", + "is-a-republican.com", + "is-a-rockstar.com", + "is-a-socialist.com", + "is-a-soxfan.org", + "is-a-student.com", + "is-a-teacher.com", + "is-a-techie.com", + "is-a-therapist.com", + "is-an-accountant.com", + "is-an-actor.com", + "is-an-actress.com", + "is-an-anarchist.com", + "is-an-artist.com", + "is-an-engineer.com", + "is-an-entertainer.com", + "is-by.us", + "is-certified.com", + "is-found.org", + "is-gone.com", + "is-into-anime.com", + "is-into-cars.com", + "is-into-cartoons.com", + "is-into-games.com", + "is-leet.com", + "is-lost.org", + "is-not-certified.com", + "is-saved.org", + "is-slick.com", + "is-uberleet.com", + "is-very-bad.org", + "is-very-evil.org", + "is-very-good.org", + "is-very-nice.org", + "is-very-sweet.org", + "is-with-theband.com", + "isa-geek.com", + "isa-geek.net", + "isa-geek.org", + "isa-hockeynut.com", + "issmarterthanyou.com", + "isteingeek.de", + "istmein.de", + "kicks-ass.net", + "kicks-ass.org", + "knowsitall.info", + "land-4-sale.us", + "lebtimnetz.de", + "leitungsen.de", + "likes-pie.com", + "likescandy.com", + "merseine.nu", + "mine.nu", + "misconfused.org", + "mypets.ws", + "myphotos.cc", + "neat-url.com", + "office-on-the.net", + "on-the-web.tv", + "podzone.net", + "podzone.org", + "readmyblog.org", + "saves-the-whales.com", + "scrapper-site.net", + "scrapping.cc", + "selfip.biz", + "selfip.com", + "selfip.info", + "selfip.net", + "selfip.org", + "sells-for-less.com", + "sells-for-u.com", + "sells-it.net", + "sellsyourhome.org", + "servebbs.com", + "servebbs.net", + "servebbs.org", + "serveftp.net", + "serveftp.org", + "servegame.org", + "shacknet.nu", + "simple-url.com", + "space-to-rent.com", + "stuff-4-sale.org", + "stuff-4-sale.us", + "teaches-yoga.com", + "thruhere.net", + "traeumtgerade.de", + "webhop.biz", + "webhop.info", + "webhop.net", + "webhop.org", + "worse-than.tv", + "writesthisblog.com", + "ddnss.de", + "dyn.ddnss.de", + "dyndns.ddnss.de", + "dyndns1.de", + "dyn-ip24.de", + "home-webserver.de", + "dyn.home-webserver.de", + "myhome-server.de", + "ddnss.org", + "definima.net", + "definima.io", + "bci.dnstrace.pro", + "ddnsfree.com", + "ddnsgeek.com", + "giize.com", + "gleeze.com", + "kozow.com", + "loseyourip.com", + "ooguy.com", + "theworkpc.com", + "casacam.net", + "dynu.net", + "accesscam.org", + "camdvr.org", + "freeddns.org", + "mywire.org", + "webredirect.org", + "myddns.rocks", + "blogsite.xyz", + "dynv6.net", + "e4.cz", + "mytuleap.com", + "enonic.io", + "customer.enonic.io", + "eu.org", + "al.eu.org", + "asso.eu.org", + "at.eu.org", + "au.eu.org", + "be.eu.org", + "bg.eu.org", + "ca.eu.org", + "cd.eu.org", + "ch.eu.org", + "cn.eu.org", + "cy.eu.org", + "cz.eu.org", + "de.eu.org", + "dk.eu.org", + "edu.eu.org", + "ee.eu.org", + "es.eu.org", + "fi.eu.org", + "fr.eu.org", + "gr.eu.org", + "hr.eu.org", + "hu.eu.org", + "ie.eu.org", + "il.eu.org", + "in.eu.org", + "int.eu.org", + "is.eu.org", + "it.eu.org", + "jp.eu.org", + "kr.eu.org", + "lt.eu.org", + "lu.eu.org", + "lv.eu.org", + "mc.eu.org", + "me.eu.org", + "mk.eu.org", + "mt.eu.org", + "my.eu.org", + "net.eu.org", + "ng.eu.org", + "nl.eu.org", + "no.eu.org", + "nz.eu.org", + "paris.eu.org", + "pl.eu.org", + "pt.eu.org", + "q-a.eu.org", + "ro.eu.org", + "ru.eu.org", + "se.eu.org", + "si.eu.org", + "sk.eu.org", + "tr.eu.org", + "uk.eu.org", + "us.eu.org", + "eu-1.evennode.com", + "eu-2.evennode.com", + "eu-3.evennode.com", + "eu-4.evennode.com", + "us-1.evennode.com", + "us-2.evennode.com", + "us-3.evennode.com", + "us-4.evennode.com", + "twmail.cc", + "twmail.net", + "twmail.org", + "mymailer.com.tw", + "url.tw", + "apps.fbsbx.com", + "ru.net", + "adygeya.ru", + "bashkiria.ru", + "bir.ru", + "cbg.ru", + "com.ru", + "dagestan.ru", + "grozny.ru", + "kalmykia.ru", + "kustanai.ru", + "marine.ru", + "mordovia.ru", + "msk.ru", + "mytis.ru", + "nalchik.ru", + "nov.ru", + "pyatigorsk.ru", + "spb.ru", + "vladikavkaz.ru", + "vladimir.ru", + "abkhazia.su", + "adygeya.su", + "aktyubinsk.su", + "arkhangelsk.su", + "armenia.su", + "ashgabad.su", + "azerbaijan.su", + "balashov.su", + "bashkiria.su", + "bryansk.su", + "bukhara.su", + "chimkent.su", + "dagestan.su", + "east-kazakhstan.su", + "exnet.su", + "georgia.su", + "grozny.su", + "ivanovo.su", + "jambyl.su", + "kalmykia.su", + "kaluga.su", + "karacol.su", + "karaganda.su", + "karelia.su", + "khakassia.su", + "krasnodar.su", + "kurgan.su", + "kustanai.su", + "lenug.su", + "mangyshlak.su", + "mordovia.su", + "msk.su", + "murmansk.su", + "nalchik.su", + "navoi.su", + "north-kazakhstan.su", + "nov.su", + "obninsk.su", + "penza.su", + "pokrovsk.su", + "sochi.su", + "spb.su", + "tashkent.su", + "termez.su", + "togliatti.su", + "troitsk.su", + "tselinograd.su", + "tula.su", + "tuva.su", + "vladikavkaz.su", + "vladimir.su", + "vologda.su", + "channelsdvr.net", + "fastlylb.net", + "map.fastlylb.net", + "freetls.fastly.net", + "map.fastly.net", + "a.prod.fastly.net", + "global.prod.fastly.net", + "a.ssl.fastly.net", + "b.ssl.fastly.net", + "global.ssl.fastly.net", + "fastpanel.direct", + "fastvps-server.com", + "fhapp.xyz", + "fedorainfracloud.org", + "fedorapeople.org", + "cloud.fedoraproject.org", + "app.os.fedoraproject.org", + "app.os.stg.fedoraproject.org", + "filegear.me", + "firebaseapp.com", + "flynnhub.com", + "flynnhosting.net", + "freebox-os.com", + "freeboxos.com", + "fbx-os.fr", + "fbxos.fr", + "freebox-os.fr", + "freeboxos.fr", + "freedesktop.org", + "*.futurecms.at", + "*.ex.futurecms.at", + "*.in.futurecms.at", + "futurehosting.at", + "futuremailing.at", + "*.ex.ortsinfo.at", + "*.kunden.ortsinfo.at", + "*.statics.cloud", + "service.gov.uk", + "github.io", + "githubusercontent.com", + "gitlab.io", + "homeoffice.gov.uk", + "ro.im", + "shop.ro", + "goip.de", + "*.0emm.com", + "appspot.com", + "blogspot.ae", + "blogspot.al", + "blogspot.am", + "blogspot.ba", + "blogspot.be", + "blogspot.bg", + "blogspot.bj", + "blogspot.ca", + "blogspot.cf", + "blogspot.ch", + "blogspot.cl", + "blogspot.co.at", + "blogspot.co.id", + "blogspot.co.il", + "blogspot.co.ke", + "blogspot.co.nz", + "blogspot.co.uk", + "blogspot.co.za", + "blogspot.com", + "blogspot.com.ar", + "blogspot.com.au", + "blogspot.com.br", + "blogspot.com.by", + "blogspot.com.co", + "blogspot.com.cy", + "blogspot.com.ee", + "blogspot.com.eg", + "blogspot.com.es", + "blogspot.com.mt", + "blogspot.com.ng", + "blogspot.com.tr", + "blogspot.com.uy", + "blogspot.cv", + "blogspot.cz", + "blogspot.de", + "blogspot.dk", + "blogspot.fi", + "blogspot.fr", + "blogspot.gr", + "blogspot.hk", + "blogspot.hr", + "blogspot.hu", + "blogspot.ie", + "blogspot.in", + "blogspot.is", + "blogspot.it", + "blogspot.jp", + "blogspot.kr", + "blogspot.li", + "blogspot.lt", + "blogspot.lu", + "blogspot.md", + "blogspot.mk", + "blogspot.mr", + "blogspot.mx", + "blogspot.my", + "blogspot.nl", + "blogspot.no", + "blogspot.pe", + "blogspot.pt", + "blogspot.qa", + "blogspot.re", + "blogspot.ro", + "blogspot.rs", + "blogspot.ru", + "blogspot.se", + "blogspot.sg", + "blogspot.si", + "blogspot.sk", + "blogspot.sn", + "blogspot.td", + "blogspot.tw", + "blogspot.ug", + "blogspot.vn", + "cloudfunctions.net", + "cloud.goog", + "codespot.com", + "googleapis.com", + "googlecode.com", + "pagespeedmobilizer.com", + "publishproxy.com", + "withgoogle.com", + "withyoutube.com", + "hashbang.sh", + "hasura.app", + "hasura-app.io", + "hepforge.org", + "herokuapp.com", + "herokussl.com", + "myravendb.com", + "ravendb.community", + "ravendb.me", + "development.run", + "ravendb.run", + "moonscale.net", + "iki.fi", + "biz.at", + "info.at", + "info.cx", + "ac.leg.br", + "al.leg.br", + "am.leg.br", + "ap.leg.br", + "ba.leg.br", + "ce.leg.br", + "df.leg.br", + "es.leg.br", + "go.leg.br", + "ma.leg.br", + "mg.leg.br", + "ms.leg.br", + "mt.leg.br", + "pa.leg.br", + "pb.leg.br", + "pe.leg.br", + "pi.leg.br", + "pr.leg.br", + "rj.leg.br", + "rn.leg.br", + "ro.leg.br", + "rr.leg.br", + "rs.leg.br", + "sc.leg.br", + "se.leg.br", + "sp.leg.br", + "to.leg.br", + "pixolino.com", + "ipifony.net", + "mein-iserv.de", + "test-iserv.de", + "myjino.ru", + "*.hosting.myjino.ru", + "*.landing.myjino.ru", + "*.spectrum.myjino.ru", + "*.vps.myjino.ru", + "*.triton.zone", + "*.cns.joyent.com", + "js.org", + "keymachine.de", + "knightpoint.systems", + "co.krd", + "edu.krd", + "git-repos.de", + "lcube-server.de", + "svn-repos.de", + "app.lmpm.com", + "linkitools.space", + "linkyard.cloud", + "linkyard-cloud.ch", + "we.bs", + "uklugs.org", + "glug.org.uk", + "lug.org.uk", + "lugs.org.uk", + "barsy.bg", + "barsy.co.uk", + "barsyonline.co.uk", + "barsycenter.com", + "barsyonline.com", + "barsy.club", + "barsy.de", + "barsy.eu", + "barsy.in", + "barsy.info", + "barsy.io", + "barsy.me", + "barsy.menu", + "barsy.mobi", + "barsy.net", + "barsy.online", + "barsy.org", + "barsy.pro", + "barsy.pub", + "barsy.shop", + "barsy.site", + "barsy.support", + "barsy.uk", + "*.magentosite.cloud", + "mayfirst.info", + "mayfirst.org", + "hb.cldmail.ru", + "miniserver.com", + "memset.net", + "cloud.metacentrum.cz", + "custom.metacentrum.cz", + "flt.cloud.muni.cz", + "usr.cloud.muni.cz", + "meteorapp.com", + "eu.meteorapp.com", + "co.pl", + "azurecontainer.io", + "azurewebsites.net", + "azure-mobile.net", + "cloudapp.net", + "mozilla-iot.org", + "bmoattachments.org", + "net.ru", + "org.ru", + "pp.ru", + "bitballoon.com", + "netlify.com", + "4u.com", + "ngrok.io", + "nh-serv.co.uk", + "nfshost.com", + "dnsking.ch", + "mypi.co", + "n4t.co", + "001www.com", + "ddnslive.com", + "myiphost.com", + "forumz.info", + "16-b.it", + "32-b.it", + "64-b.it", + "soundcast.me", + "tcp4.me", + "dnsup.net", + "hicam.net", + "now-dns.net", + "ownip.net", + "vpndns.net", + "dynserv.org", + "now-dns.org", + "x443.pw", + "now-dns.top", + "ntdll.top", + "freeddns.us", + "crafting.xyz", + "zapto.xyz", + "nsupdate.info", + "nerdpol.ovh", + "blogsyte.com", + "brasilia.me", + "cable-modem.org", + "ciscofreak.com", + "collegefan.org", + "couchpotatofries.org", + "damnserver.com", + "ddns.me", + "ditchyourip.com", + "dnsfor.me", + "dnsiskinky.com", + "dvrcam.info", + "dynns.com", + "eating-organic.net", + "fantasyleague.cc", + "geekgalaxy.com", + "golffan.us", + "health-carereform.com", + "homesecuritymac.com", + "homesecuritypc.com", + "hopto.me", + "ilovecollege.info", + "loginto.me", + "mlbfan.org", + "mmafan.biz", + "myactivedirectory.com", + "mydissent.net", + "myeffect.net", + "mymediapc.net", + "mypsx.net", + "mysecuritycamera.com", + "mysecuritycamera.net", + "mysecuritycamera.org", + "net-freaks.com", + "nflfan.org", + "nhlfan.net", + "no-ip.ca", + "no-ip.co.uk", + "no-ip.net", + "noip.us", + "onthewifi.com", + "pgafan.net", + "point2this.com", + "pointto.us", + "privatizehealthinsurance.net", + "quicksytes.com", + "read-books.org", + "securitytactics.com", + "serveexchange.com", + "servehumour.com", + "servep2p.com", + "servesarcasm.com", + "stufftoread.com", + "ufcfan.org", + "unusualperson.com", + "workisboring.com", + "3utilities.com", + "bounceme.net", + "ddns.net", + "ddnsking.com", + "gotdns.ch", + "hopto.org", + "myftp.biz", + "myftp.org", + "myvnc.com", + "no-ip.biz", + "no-ip.info", + "no-ip.org", + "noip.me", + "redirectme.net", + "servebeer.com", + "serveblog.net", + "servecounterstrike.com", + "serveftp.com", + "servegame.com", + "servehalflife.com", + "servehttp.com", + "serveirc.com", + "serveminecraft.net", + "servemp3.com", + "servepics.com", + "servequake.com", + "sytes.net", + "webhop.me", + "zapto.org", + "stage.nodeart.io", + "nodum.co", + "nodum.io", + "pcloud.host", + "nyc.mn", + "nom.ae", + "nom.af", + "nom.ai", + "nom.al", + "nym.by", + "nym.bz", + "nom.cl", + "nom.gd", + "nom.ge", + "nom.gl", + "nym.gr", + "nom.gt", + "nym.gy", + "nom.hn", + "nym.ie", + "nom.im", + "nom.ke", + "nym.kz", + "nym.la", + "nym.lc", + "nom.li", + "nym.li", + "nym.lt", + "nym.lu", + "nym.me", + "nom.mk", + "nym.mn", + "nym.mx", + "nom.nu", + "nym.nz", + "nym.pe", + "nym.pt", + "nom.pw", + "nom.qa", + "nym.ro", + "nom.rs", + "nom.si", + "nym.sk", + "nom.st", + "nym.su", + "nym.sx", + "nom.tj", + "nym.tw", + "nom.ug", + "nom.uy", + "nom.vc", + "nom.vg", + "cya.gg", + "cloudycluster.net", + "nid.io", + "opencraft.hosting", + "operaunite.com", + "outsystemscloud.com", + "ownprovider.com", + "own.pm", + "ox.rs", + "oy.lc", + "pgfog.com", + "pagefrontapp.com", + "art.pl", + "gliwice.pl", + "krakow.pl", + "poznan.pl", + "wroc.pl", + "zakopane.pl", + "pantheonsite.io", + "gotpantheon.com", + "mypep.link", + "on-web.fr", + "*.platform.sh", + "*.platformsh.site", + "xen.prgmr.com", + "priv.at", + "protonet.io", + "chirurgiens-dentistes-en-france.fr", + "byen.site", + "ras.ru", + "qa2.com", + "dev-myqnapcloud.com", + "alpha-myqnapcloud.com", + "myqnapcloud.com", + "*.quipelements.com", + "vapor.cloud", + "vaporcloud.io", + "rackmaze.com", + "rackmaze.net", + "rhcloud.com", + "resindevice.io", + "devices.resinstaging.io", + "hzc.io", + "wellbeingzone.eu", + "ptplus.fit", + "wellbeingzone.co.uk", + "sandcats.io", + "logoip.de", + "logoip.com", + "schokokeks.net", + "scrysec.com", + "firewall-gateway.com", + "firewall-gateway.de", + "my-gateway.de", + "my-router.de", + "spdns.de", + "spdns.eu", + "firewall-gateway.net", + "my-firewall.org", + "myfirewall.org", + "spdns.org", + "*.s5y.io", + "*.sensiosite.cloud", + "biz.ua", + "co.ua", + "pp.ua", + "shiftedit.io", + "myshopblocks.com", + "1kapp.com", + "appchizi.com", + "applinzi.com", + "sinaapp.com", + "vipsinaapp.com", + "bounty-full.com", + "alpha.bounty-full.com", + "beta.bounty-full.com", + "static.land", + "dev.static.land", + "sites.static.land", + "apps.lair.io", + "*.stolos.io", + "spacekit.io", + "customer.speedpartner.de", + "stackspace.space", + "storj.farm", + "utwente.io", + "temp-dns.com", + "diskstation.me", + "dscloud.biz", + "dscloud.me", + "dscloud.mobi", + "dsmynas.com", + "dsmynas.net", + "dsmynas.org", + "familyds.com", + "familyds.net", + "familyds.org", + "i234.me", + "myds.me", + "synology.me", + "vpnplus.to", + "taifun-dns.de", + "gda.pl", + "gdansk.pl", + "gdynia.pl", + "med.pl", + "sopot.pl", + "gwiddle.co.uk", + "cust.dev.thingdust.io", + "cust.disrec.thingdust.io", + "cust.prod.thingdust.io", + "cust.testing.thingdust.io", + "bloxcms.com", + "townnews-staging.com", + "12hp.at", + "2ix.at", + "4lima.at", + "lima-city.at", + "12hp.ch", + "2ix.ch", + "4lima.ch", + "lima-city.ch", + "trafficplex.cloud", + "de.cool", + "12hp.de", + "2ix.de", + "4lima.de", + "lima-city.de", + "1337.pictures", + "clan.rip", + "lima-city.rocks", + "webspace.rocks", + "lima.zone", + "*.transurl.be", + "*.transurl.eu", + "*.transurl.nl", + "tuxfamily.org", + "dd-dns.de", + "diskstation.eu", + "diskstation.org", + "dray-dns.de", + "draydns.de", + "dyn-vpn.de", + "dynvpn.de", + "mein-vigor.de", + "my-vigor.de", + "my-wan.de", + "syno-ds.de", + "synology-diskstation.de", + "synology-ds.de", + "uber.space", + "*.uberspace.de", + "hk.com", + "hk.org", + "ltd.hk", + "inc.hk", + "virtualuser.de", + "virtual-user.de", + "lib.de.us", + "2038.io", + "router.management", + "v-info.info", + "wedeploy.io", + "wedeploy.me", + "wedeploy.sh", + "remotewd.com", + "wmflabs.org", + "half.host", + "xnbay.com", + "u2.xnbay.com", + "u2-local.xnbay.com", + "cistron.nl", + "demon.nl", + "xs4all.space", + "official.academy", + "yolasite.com", + "ybo.faith", + "yombo.me", + "homelink.one", + "ybo.party", + "ybo.review", + "ybo.science", + "ybo.trade", + "nohost.me", + "noho.st", + "za.net", + "za.org", + "now.sh", + "zone.id", +} + +var nodeLabels = [...]string{ + "aaa", + "aarp", + "abarth", + "abb", + "abbott", + "abbvie", + "abc", + "able", + "abogado", + "abudhabi", + "ac", + "academy", + "accenture", + "accountant", + "accountants", + "aco", + "active", + "actor", + "ad", + "adac", + "ads", + "adult", + "ae", + "aeg", + "aero", + "aetna", + "af", + "afamilycompany", + "afl", + "africa", + "ag", + "agakhan", + "agency", + "ai", + "aig", + "aigo", + "airbus", + "airforce", + "airtel", + "akdn", + "al", + "alfaromeo", + "alibaba", + "alipay", + "allfinanz", + "allstate", + "ally", + "alsace", + "alstom", + "am", + "americanexpress", + "americanfamily", + "amex", + "amfam", + "amica", + "amsterdam", + "analytics", + "android", + "anquan", + "anz", + "ao", + "aol", + "apartments", + "app", + "apple", + "aq", + "aquarelle", + "ar", + "arab", + "aramco", + "archi", + "army", + "arpa", + "art", + "arte", + "as", + "asda", + "asia", + "associates", + "at", + "athleta", + "attorney", + "au", + "auction", + "audi", + "audible", + "audio", + "auspost", + "author", + "auto", + "autos", + "avianca", + "aw", + "aws", + "ax", + "axa", + "az", + "azure", + "ba", + "baby", + "baidu", + "banamex", + "bananarepublic", + "band", + "bank", + "bar", + "barcelona", + "barclaycard", + "barclays", + "barefoot", + "bargains", + "baseball", + "basketball", + "bauhaus", + "bayern", + "bb", + "bbc", + "bbt", + "bbva", + "bcg", + "bcn", + "bd", + "be", + "beats", + "beauty", + "beer", + "bentley", + "berlin", + "best", + "bestbuy", + "bet", + "bf", + "bg", + "bh", + "bharti", + "bi", + "bible", + "bid", + "bike", + "bing", + "bingo", + "bio", + "biz", + "bj", + "black", + "blackfriday", + "blanco", + "blockbuster", + "blog", + "bloomberg", + "blue", + "bm", + "bms", + "bmw", + "bn", + "bnl", + "bnpparibas", + "bo", + "boats", + "boehringer", + "bofa", + "bom", + "bond", + "boo", + "book", + "booking", + "bosch", + "bostik", + "boston", + "bot", + "boutique", + "box", + "br", + "bradesco", + "bridgestone", + "broadway", + "broker", + "brother", + "brussels", + "bs", + "bt", + "budapest", + "bugatti", + "build", + "builders", + "business", + "buy", + "buzz", + "bv", + "bw", + "by", + "bz", + "bzh", + "ca", + "cab", + "cafe", + "cal", + "call", + "calvinklein", + "cam", + "camera", + "camp", + "cancerresearch", + "canon", + "capetown", + "capital", + "capitalone", + "car", + "caravan", + "cards", + "care", + "career", + "careers", + "cars", + "cartier", + "casa", + "case", + "caseih", + "cash", + "casino", + "cat", + "catering", + "catholic", + "cba", + "cbn", + "cbre", + "cbs", + "cc", + "cd", + "ceb", + "center", + "ceo", + "cern", + "cf", + "cfa", + "cfd", + "cg", + "ch", + "chanel", + "channel", + "charity", + "chase", + "chat", + "cheap", + "chintai", + "christmas", + "chrome", + "chrysler", + "church", + "ci", + "cipriani", + "circle", + "cisco", + "citadel", + "citi", + "citic", + "city", + "cityeats", + "ck", + "cl", + "claims", + "cleaning", + "click", + "clinic", + "clinique", + "clothing", + "cloud", + "club", + "clubmed", + "cm", + "cn", + "co", + "coach", + "codes", + "coffee", + "college", + "cologne", + "com", + "comcast", + "commbank", + "community", + "company", + "compare", + "computer", + "comsec", + "condos", + "construction", + "consulting", + "contact", + "contractors", + "cooking", + "cookingchannel", + "cool", + "coop", + "corsica", + "country", + "coupon", + "coupons", + "courses", + "cr", + "credit", + "creditcard", + "creditunion", + "cricket", + "crown", + "crs", + "cruise", + "cruises", + "csc", + "cu", + "cuisinella", + "cv", + "cw", + "cx", + "cy", + "cymru", + "cyou", + "cz", + "dabur", + "dad", + "dance", + "data", + "date", + "dating", + "datsun", + "day", + "dclk", + "dds", + "de", + "deal", + "dealer", + "deals", + "degree", + "delivery", + "dell", + "deloitte", + "delta", + "democrat", + "dental", + "dentist", + "desi", + "design", + "dev", + "dhl", + "diamonds", + "diet", + "digital", + "direct", + "directory", + "discount", + "discover", + "dish", + "diy", + "dj", + "dk", + "dm", + "dnp", + "do", + "docs", + "doctor", + "dodge", + "dog", + "doha", + "domains", + "dot", + "download", + "drive", + "dtv", + "dubai", + "duck", + "dunlop", + "duns", + "dupont", + "durban", + "dvag", + "dvr", + "dz", + "earth", + "eat", + "ec", + "eco", + "edeka", + "edu", + "education", + "ee", + "eg", + "email", + "emerck", + "energy", + "engineer", + "engineering", + "enterprises", + "epost", + "epson", + "equipment", + "er", + "ericsson", + "erni", + "es", + "esq", + "estate", + "esurance", + "et", + "etisalat", + "eu", + "eurovision", + "eus", + "events", + "everbank", + "exchange", + "expert", + "exposed", + "express", + "extraspace", + "fage", + "fail", + "fairwinds", + "faith", + "family", + "fan", + "fans", + "farm", + "farmers", + "fashion", + "fast", + "fedex", + "feedback", + "ferrari", + "ferrero", + "fi", + "fiat", + "fidelity", + "fido", + "film", + "final", + "finance", + "financial", + "fire", + "firestone", + "firmdale", + "fish", + "fishing", + "fit", + "fitness", + "fj", + "fk", + "flickr", + "flights", + "flir", + "florist", + "flowers", + "fly", + "fm", + "fo", + "foo", + "food", + "foodnetwork", + "football", + "ford", + "forex", + "forsale", + "forum", + "foundation", + "fox", + "fr", + "free", + "fresenius", + "frl", + "frogans", + "frontdoor", + "frontier", + "ftr", + "fujitsu", + "fujixerox", + "fun", + "fund", + "furniture", + "futbol", + "fyi", + "ga", + "gal", + "gallery", + "gallo", + "gallup", + "game", + "games", + "gap", + "garden", + "gb", + "gbiz", + "gd", + "gdn", + "ge", + "gea", + "gent", + "genting", + "george", + "gf", + "gg", + "ggee", + "gh", + "gi", + "gift", + "gifts", + "gives", + "giving", + "gl", + "glade", + "glass", + "gle", + "global", + "globo", + "gm", + "gmail", + "gmbh", + "gmo", + "gmx", + "gn", + "godaddy", + "gold", + "goldpoint", + "golf", + "goo", + "goodhands", + "goodyear", + "goog", + "google", + "gop", + "got", + "gov", + "gp", + "gq", + "gr", + "grainger", + "graphics", + "gratis", + "green", + "gripe", + "grocery", + "group", + "gs", + "gt", + "gu", + "guardian", + "gucci", + "guge", + "guide", + "guitars", + "guru", + "gw", + "gy", + "hair", + "hamburg", + "hangout", + "haus", + "hbo", + "hdfc", + "hdfcbank", + "health", + "healthcare", + "help", + "helsinki", + "here", + "hermes", + "hgtv", + "hiphop", + "hisamitsu", + "hitachi", + "hiv", + "hk", + "hkt", + "hm", + "hn", + "hockey", + "holdings", + "holiday", + "homedepot", + "homegoods", + "homes", + "homesense", + "honda", + "honeywell", + "horse", + "hospital", + "host", + "hosting", + "hot", + "hoteles", + "hotels", + "hotmail", + "house", + "how", + "hr", + "hsbc", + "ht", + "hu", + "hughes", + "hyatt", + "hyundai", + "ibm", + "icbc", + "ice", + "icu", + "id", + "ie", + "ieee", + "ifm", + "ikano", + "il", + "im", + "imamat", + "imdb", + "immo", + "immobilien", + "in", + "inc", + "industries", + "infiniti", + "info", + "ing", + "ink", + "institute", + "insurance", + "insure", + "int", + "intel", + "international", + "intuit", + "investments", + "io", + "ipiranga", + "iq", + "ir", + "irish", + "is", + "iselect", + "ismaili", + "ist", + "istanbul", + "it", + "itau", + "itv", + "iveco", + "iwc", + "jaguar", + "java", + "jcb", + "jcp", + "je", + "jeep", + "jetzt", + "jewelry", + "jio", + "jlc", + "jll", + "jm", + "jmp", + "jnj", + "jo", + "jobs", + "joburg", + "jot", + "joy", + "jp", + "jpmorgan", + "jprs", + "juegos", + "juniper", + "kaufen", + "kddi", + "ke", + "kerryhotels", + "kerrylogistics", + "kerryproperties", + "kfh", + "kg", + "kh", + "ki", + "kia", + "kim", + "kinder", + "kindle", + "kitchen", + "kiwi", + "km", + "kn", + "koeln", + "komatsu", + "kosher", + "kp", + "kpmg", + "kpn", + "kr", + "krd", + "kred", + "kuokgroup", + "kw", + "ky", + "kyoto", + "kz", + "la", + "lacaixa", + "ladbrokes", + "lamborghini", + "lamer", + "lancaster", + "lancia", + "lancome", + "land", + "landrover", + "lanxess", + "lasalle", + "lat", + "latino", + "latrobe", + "law", + "lawyer", + "lb", + "lc", + "lds", + "lease", + "leclerc", + "lefrak", + "legal", + "lego", + "lexus", + "lgbt", + "li", + "liaison", + "lidl", + "life", + "lifeinsurance", + "lifestyle", + "lighting", + "like", + "lilly", + "limited", + "limo", + "lincoln", + "linde", + "link", + "lipsy", + "live", + "living", + "lixil", + "lk", + "llc", + "loan", + "loans", + "locker", + "locus", + "loft", + "lol", + "london", + "lotte", + "lotto", + "love", + "lpl", + "lplfinancial", + "lr", + "ls", + "lt", + "ltd", + "ltda", + "lu", + "lundbeck", + "lupin", + "luxe", + "luxury", + "lv", + "ly", + "ma", + "macys", + "madrid", + "maif", + "maison", + "makeup", + "man", + "management", + "mango", + "map", + "market", + "marketing", + "markets", + "marriott", + "marshalls", + "maserati", + "mattel", + "mba", + "mc", + "mckinsey", + "md", + "me", + "med", + "media", + "meet", + "melbourne", + "meme", + "memorial", + "men", + "menu", + "meo", + "merckmsd", + "metlife", + "mg", + "mh", + "miami", + "microsoft", + "mil", + "mini", + "mint", + "mit", + "mitsubishi", + "mk", + "ml", + "mlb", + "mls", + "mm", + "mma", + "mn", + "mo", + "mobi", + "mobile", + "mobily", + "moda", + "moe", + "moi", + "mom", + "monash", + "money", + "monster", + "mopar", + "mormon", + "mortgage", + "moscow", + "moto", + "motorcycles", + "mov", + "movie", + "movistar", + "mp", + "mq", + "mr", + "ms", + "msd", + "mt", + "mtn", + "mtr", + "mu", + "museum", + "mutual", + "mv", + "mw", + "mx", + "my", + "mz", + "na", + "nab", + "nadex", + "nagoya", + "name", + "nationwide", + "natura", + "navy", + "nba", + "nc", + "ne", + "nec", + "net", + "netbank", + "netflix", + "network", + "neustar", + "new", + "newholland", + "news", + "next", + "nextdirect", + "nexus", + "nf", + "nfl", + "ng", + "ngo", + "nhk", + "ni", + "nico", + "nike", + "nikon", + "ninja", + "nissan", + "nissay", + "nl", + "no", + "nokia", + "northwesternmutual", + "norton", + "now", + "nowruz", + "nowtv", + "np", + "nr", + "nra", + "nrw", + "ntt", + "nu", + "nyc", + "nz", + "obi", + "observer", + "off", + "office", + "okinawa", + "olayan", + "olayangroup", + "oldnavy", + "ollo", + "om", + "omega", + "one", + "ong", + "onion", + "onl", + "online", + "onyourside", + "ooo", + "open", + "oracle", + "orange", + "org", + "organic", + "origins", + "osaka", + "otsuka", + "ott", + "ovh", + "pa", + "page", + "panasonic", + "panerai", + "paris", + "pars", + "partners", + "parts", + "party", + "passagens", + "pay", + "pccw", + "pe", + "pet", + "pf", + "pfizer", + "pg", + "ph", + "pharmacy", + "phd", + "philips", + "phone", + "photo", + "photography", + "photos", + "physio", + "piaget", + "pics", + "pictet", + "pictures", + "pid", + "pin", + "ping", + "pink", + "pioneer", + "pizza", + "pk", + "pl", + "place", + "play", + "playstation", + "plumbing", + "plus", + "pm", + "pn", + "pnc", + "pohl", + "poker", + "politie", + "porn", + "post", + "pr", + "pramerica", + "praxi", + "press", + "prime", + "pro", + "prod", + "productions", + "prof", + "progressive", + "promo", + "properties", + "property", + "protection", + "pru", + "prudential", + "ps", + "pt", + "pub", + "pw", + "pwc", + "py", + "qa", + "qpon", + "quebec", + "quest", + "qvc", + "racing", + "radio", + "raid", + "re", + "read", + "realestate", + "realtor", + "realty", + "recipes", + "red", + "redstone", + "redumbrella", + "rehab", + "reise", + "reisen", + "reit", + "reliance", + "ren", + "rent", + "rentals", + "repair", + "report", + "republican", + "rest", + "restaurant", + "review", + "reviews", + "rexroth", + "rich", + "richardli", + "ricoh", + "rightathome", + "ril", + "rio", + "rip", + "rmit", + "ro", + "rocher", + "rocks", + "rodeo", + "rogers", + "room", + "rs", + "rsvp", + "ru", + "rugby", + "ruhr", + "run", + "rw", + "rwe", + "ryukyu", + "sa", + "saarland", + "safe", + "safety", + "sakura", + "sale", + "salon", + "samsclub", + "samsung", + "sandvik", + "sandvikcoromant", + "sanofi", + "sap", + "sapo", + "sarl", + "sas", + "save", + "saxo", + "sb", + "sbi", + "sbs", + "sc", + "sca", + "scb", + "schaeffler", + "schmidt", + "scholarships", + "school", + "schule", + "schwarz", + "science", + "scjohnson", + "scor", + "scot", + "sd", + "se", + "search", + "seat", + "secure", + "security", + "seek", + "select", + "sener", + "services", + "ses", + "seven", + "sew", + "sex", + "sexy", + "sfr", + "sg", + "sh", + "shangrila", + "sharp", + "shaw", + "shell", + "shia", + "shiksha", + "shoes", + "shop", + "shopping", + "shouji", + "show", + "showtime", + "shriram", + "si", + "silk", + "sina", + "singles", + "site", + "sj", + "sk", + "ski", + "skin", + "sky", + "skype", + "sl", + "sling", + "sm", + "smart", + "smile", + "sn", + "sncf", + "so", + "soccer", + "social", + "softbank", + "software", + "sohu", + "solar", + "solutions", + "song", + "sony", + "soy", + "space", + "spiegel", + "sport", + "spot", + "spreadbetting", + "sr", + "srl", + "srt", + "st", + "stada", + "staples", + "star", + "starhub", + "statebank", + "statefarm", + "statoil", + "stc", + "stcgroup", + "stockholm", + "storage", + "store", + "stream", + "studio", + "study", + "style", + "su", + "sucks", + "supplies", + "supply", + "support", + "surf", + "surgery", + "suzuki", + "sv", + "swatch", + "swiftcover", + "swiss", + "sx", + "sy", + "sydney", + "symantec", + "systems", + "sz", + "tab", + "taipei", + "talk", + "taobao", + "target", + "tatamotors", + "tatar", + "tattoo", + "tax", + "taxi", + "tc", + "tci", + "td", + "tdk", + "team", + "tech", + "technology", + "tel", + "telecity", + "telefonica", + "temasek", + "tennis", + "teva", + "tf", + "tg", + "th", + "thd", + "theater", + "theatre", + "tiaa", + "tickets", + "tienda", + "tiffany", + "tips", + "tires", + "tirol", + "tj", + "tjmaxx", + "tjx", + "tk", + "tkmaxx", + "tl", + "tm", + "tmall", + "tn", + "to", + "today", + "tokyo", + "tools", + "top", + "toray", + "toshiba", + "total", + "tours", + "town", + "toyota", + "toys", + "tr", + "trade", + "trading", + "training", + "travel", + "travelchannel", + "travelers", + "travelersinsurance", + "trust", + "trv", + "tt", + "tube", + "tui", + "tunes", + "tushu", + "tv", + "tvs", + "tw", + "tz", + "ua", + "ubank", + "ubs", + "uconnect", + "ug", + "uk", + "unicom", + "university", + "uno", + "uol", + "ups", + "us", + "uy", + "uz", + "va", + "vacations", + "vana", + "vanguard", + "vc", + "ve", + "vegas", + "ventures", + "verisign", + "versicherung", + "vet", + "vg", + "vi", + "viajes", + "video", + "vig", + "viking", + "villas", + "vin", + "vip", + "virgin", + "visa", + "vision", + "vista", + "vistaprint", + "viva", + "vivo", + "vlaanderen", + "vn", + "vodka", + "volkswagen", + "volvo", + "vote", + "voting", + "voto", + "voyage", + "vu", + "vuelos", + "wales", + "walmart", + "walter", + "wang", + "wanggou", + "warman", + "watch", + "watches", + "weather", + "weatherchannel", + "webcam", + "weber", + "website", + "wed", + "wedding", + "weibo", + "weir", + "wf", + "whoswho", + "wien", + "wiki", + "williamhill", + "win", + "windows", + "wine", + "winners", + "wme", + "wolterskluwer", + "woodside", + "work", + "works", + "world", + "wow", + "ws", + "wtc", + "wtf", + "xbox", + "xerox", + "xfinity", + "xihuan", + "xin", + "xn--11b4c3d", + "xn--1ck2e1b", + "xn--1qqw23a", + "xn--2scrj9c", + "xn--30rr7y", + "xn--3bst00m", + "xn--3ds443g", + "xn--3e0b707e", + "xn--3hcrj9c", + "xn--3oq18vl8pn36a", + "xn--3pxu8k", + "xn--42c2d9a", + "xn--45br5cyl", + "xn--45brj9c", + "xn--45q11c", + "xn--4gbrim", + "xn--54b7fta0cc", + "xn--55qw42g", + "xn--55qx5d", + "xn--5su34j936bgsg", + "xn--5tzm5g", + "xn--6frz82g", + "xn--6qq986b3xl", + "xn--80adxhks", + "xn--80ao21a", + "xn--80aqecdr1a", + "xn--80asehdb", + "xn--80aswg", + "xn--8y0a063a", + "xn--90a3ac", + "xn--90ae", + "xn--90ais", + "xn--9dbq2a", + "xn--9et52u", + "xn--9krt00a", + "xn--b4w605ferd", + "xn--bck1b9a5dre4c", + "xn--c1avg", + "xn--c2br7g", + "xn--cck2b3b", + "xn--cg4bki", + "xn--clchc0ea0b2g2a9gcd", + "xn--czr694b", + "xn--czrs0t", + "xn--czru2d", + "xn--d1acj3b", + "xn--d1alf", + "xn--e1a4c", + "xn--eckvdtc9d", + "xn--efvy88h", + "xn--estv75g", + "xn--fct429k", + "xn--fhbei", + "xn--fiq228c5hs", + "xn--fiq64b", + "xn--fiqs8s", + "xn--fiqz9s", + "xn--fjq720a", + "xn--flw351e", + "xn--fpcrj9c3d", + "xn--fzc2c9e2c", + "xn--fzys8d69uvgm", + "xn--g2xx48c", + "xn--gckr3f0f", + "xn--gecrj9c", + "xn--gk3at1e", + "xn--h2breg3eve", + "xn--h2brj9c", + "xn--h2brj9c8c", + "xn--hxt814e", + "xn--i1b6b1a6a2e", + "xn--imr513n", + "xn--io0a7i", + "xn--j1aef", + "xn--j1amh", + "xn--j6w193g", + "xn--jlq61u9w7b", + "xn--jvr189m", + "xn--kcrx77d1x4a", + "xn--kprw13d", + "xn--kpry57d", + "xn--kpu716f", + "xn--kput3i", + "xn--l1acc", + "xn--lgbbat1ad8j", + "xn--mgb2ddes", + "xn--mgb9awbf", + "xn--mgba3a3ejt", + "xn--mgba3a4f16a", + "xn--mgba3a4fra", + "xn--mgba7c0bbn0a", + "xn--mgbaakc7dvf", + "xn--mgbaam7a8h", + "xn--mgbab2bd", + "xn--mgbai9a5eva00b", + "xn--mgbai9azgqp6j", + "xn--mgbayh7gpa", + "xn--mgbb9fbpob", + "xn--mgbbh1a", + "xn--mgbbh1a71e", + "xn--mgbc0a9azcg", + "xn--mgbca7dzdo", + "xn--mgberp4a5d4a87g", + "xn--mgberp4a5d4ar", + "xn--mgbgu82a", + "xn--mgbi4ecexp", + "xn--mgbpl2fh", + "xn--mgbqly7c0a67fbc", + "xn--mgbqly7cvafr", + "xn--mgbt3dhd", + "xn--mgbtf8fl", + "xn--mgbtx2b", + "xn--mgbx4cd0ab", + "xn--mix082f", + "xn--mix891f", + "xn--mk1bu44c", + "xn--mxtq1m", + "xn--ngbc5azd", + "xn--ngbe9e0a", + "xn--ngbrx", + "xn--nnx388a", + "xn--node", + "xn--nqv7f", + "xn--nqv7fs00ema", + "xn--nyqy26a", + "xn--o3cw4h", + "xn--ogbpf8fl", + "xn--otu796d", + "xn--p1acf", + "xn--p1ai", + "xn--pbt977c", + "xn--pgbs0dh", + "xn--pssy2u", + "xn--q9jyb4c", + "xn--qcka1pmc", + "xn--qxam", + "xn--rhqv96g", + "xn--rovu88b", + "xn--rvc1e0am3e", + "xn--s9brj9c", + "xn--ses554g", + "xn--t60b56a", + "xn--tckwe", + "xn--tiq49xqyj", + "xn--unup4y", + "xn--vermgensberater-ctb", + "xn--vermgensberatung-pwb", + "xn--vhquv", + "xn--vuq861b", + "xn--w4r85el8fhu5dnra", + "xn--w4rs40l", + "xn--wgbh1c", + "xn--wgbl6a", + "xn--xhq521b", + "xn--xkc2al3hye2a", + "xn--xkc2dl3a5ee0h", + "xn--y9a3aq", + "xn--yfro4i67o", + "xn--ygbi2ammx", + "xn--zfr164b", + "xperia", + "xxx", + "xyz", + "yachts", + "yahoo", + "yamaxun", + "yandex", + "ye", + "yodobashi", + "yoga", + "yokohama", + "you", + "youtube", + "yt", + "yun", + "za", + "zappos", + "zara", + "zero", + "zip", + "zippo", + "zm", + "zone", + "zuerich", + "zw", + "com", + "edu", + "gov", + "mil", + "net", + "org", + "official", + "nom", + "ac", + "blogspot", + "co", + "gov", + "mil", + "net", + "nom", + "org", + "sch", + "accident-investigation", + "accident-prevention", + "aerobatic", + "aeroclub", + "aerodrome", + "agents", + "air-surveillance", + "air-traffic-control", + "aircraft", + "airline", + "airport", + "airtraffic", + "ambulance", + "amusement", + "association", + "author", + "ballooning", + "broker", + "caa", + "cargo", + "catering", + "certification", + "championship", + "charter", + "civilaviation", + "club", + "conference", + "consultant", + "consulting", + "control", + "council", + "crew", + "design", + "dgca", + "educator", + "emergency", + "engine", + "engineer", + "entertainment", + "equipment", + "exchange", + "express", + "federation", + "flight", + "freight", + "fuel", + "gliding", + "government", + "groundhandling", + "group", + "hanggliding", + "homebuilt", + "insurance", + "journal", + "journalist", + "leasing", + "logistics", + "magazine", + "maintenance", + "media", + "microlight", + "modelling", + "navigation", + "parachuting", + "paragliding", + "passenger-association", + "pilot", + "press", + "production", + "recreation", + "repbody", + "res", + "research", + "rotorcraft", + "safety", + "scientist", + "services", + "show", + "skydiving", + "software", + "student", + "trader", + "trading", + "trainer", + "union", + "workinggroup", + "works", + "com", + "edu", + "gov", + "net", + "nom", + "org", + "co", + "com", + "net", + "nom", + "org", + "com", + "net", + "nom", + "off", + "org", + "blogspot", + "com", + "edu", + "gov", + "mil", + "net", + "nom", + "org", + "blogspot", + "co", + "ed", + "gv", + "it", + "og", + "pb", + "hasura", + "com", + "edu", + "gob", + "gov", + "int", + "mil", + "musica", + "net", + "org", + "tur", + "blogspot", + "e164", + "in-addr", + "ip6", + "iris", + "uri", + "urn", + "gov", + "cloudns", + "12hp", + "2ix", + "4lima", + "ac", + "biz", + "co", + "futurecms", + "futurehosting", + "futuremailing", + "gv", + "info", + "lima-city", + "or", + "ortsinfo", + "priv", + "blogspot", + "ex", + "in", + "ex", + "kunden", + "act", + "asn", + "com", + "conf", + "edu", + "gov", + "id", + "info", + "net", + "nsw", + "nt", + "org", + "oz", + "qld", + "sa", + "tas", + "vic", + "wa", + "blogspot", + "act", + "nsw", + "nt", + "qld", + "sa", + "tas", + "vic", + "wa", + "qld", + "sa", + "tas", + "vic", + "wa", + "com", + "biz", + "com", + "edu", + "gov", + "info", + "int", + "mil", + "name", + "net", + "org", + "pp", + "pro", + "blogspot", + "com", + "edu", + "gov", + "mil", + "net", + "org", + "biz", + "co", + "com", + "edu", + "gov", + "info", + "net", + "org", + "store", + "tv", + "ac", + "blogspot", + "transurl", + "webhosting", + "gov", + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "a", + "b", + "barsy", + "blogspot", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "com", + "edu", + "gov", + "net", + "org", + "co", + "com", + "edu", + "or", + "org", + "cloudns", + "dscloud", + "dyndns", + "for-better", + "for-more", + "for-some", + "for-the", + "mmafan", + "myftp", + "no-ip", + "selfip", + "webhop", + "asso", + "barreau", + "blogspot", + "gouv", + "com", + "edu", + "gov", + "net", + "org", + "academia", + "agro", + "arte", + "blog", + "bolivia", + "ciencia", + "com", + "cooperativa", + "democracia", + "deporte", + "ecologia", + "economia", + "edu", + "empresa", + "gob", + "indigena", + "industria", + "info", + "int", + "medicina", + "mil", + "movimiento", + "musica", + "natural", + "net", + "nombre", + "noticias", + "org", + "patria", + "plurinacional", + "politica", + "profesional", + "pueblo", + "revista", + "salud", + "tecnologia", + "tksat", + "transporte", + "tv", + "web", + "wiki", + "9guacu", + "abc", + "adm", + "adv", + "agr", + "aju", + "am", + "anani", + "aparecida", + "arq", + "art", + "ato", + "b", + "barueri", + "belem", + "bhz", + "bio", + "blog", + "bmd", + "boavista", + "bsb", + "campinagrande", + "campinas", + "caxias", + "cim", + "cng", + "cnt", + "com", + "contagem", + "coop", + "cri", + "cuiaba", + "curitiba", + "def", + "ecn", + "eco", + "edu", + "emp", + "eng", + "esp", + "etc", + "eti", + "far", + "feira", + "flog", + "floripa", + "fm", + "fnd", + "fortal", + "fot", + "foz", + "fst", + "g12", + "ggf", + "goiania", + "gov", + "gru", + "imb", + "ind", + "inf", + "jab", + "jampa", + "jdf", + "joinville", + "jor", + "jus", + "leg", + "lel", + "londrina", + "macapa", + "maceio", + "manaus", + "maringa", + "mat", + "med", + "mil", + "morena", + "mp", + "mus", + "natal", + "net", + "niteroi", + "nom", + "not", + "ntr", + "odo", + "org", + "osasco", + "palmas", + "poa", + "ppg", + "pro", + "psc", + "psi", + "pvh", + "qsl", + "radio", + "rec", + "recife", + "ribeirao", + "rio", + "riobranco", + "riopreto", + "salvador", + "sampa", + "santamaria", + "santoandre", + "saobernardo", + "saogonca", + "sjc", + "slg", + "slz", + "sorocaba", + "srv", + "taxi", + "teo", + "the", + "tmp", + "trd", + "tur", + "tv", + "udi", + "vet", + "vix", + "vlog", + "wiki", + "zlg", + "blogspot", + "ac", + "al", + "am", + "ap", + "ba", + "ce", + "df", + "es", + "go", + "ma", + "mg", + "ms", + "mt", + "pa", + "pb", + "pe", + "pi", + "pr", + "rj", + "rn", + "ro", + "rr", + "rs", + "sc", + "se", + "sp", + "to", + "ac", + "al", + "am", + "ap", + "ba", + "ce", + "df", + "es", + "go", + "ma", + "mg", + "ms", + "mt", + "pa", + "pb", + "pe", + "pi", + "pr", + "rj", + "rn", + "ro", + "rr", + "rs", + "sc", + "se", + "sp", + "to", + "com", + "edu", + "gov", + "net", + "org", + "we", + "com", + "edu", + "gov", + "net", + "org", + "co", + "org", + "com", + "gov", + "mil", + "nym", + "of", + "blogspot", + "com", + "edu", + "gov", + "net", + "nym", + "org", + "za", + "ab", + "awdev", + "bc", + "blogspot", + "co", + "gc", + "mb", + "nb", + "nf", + "nl", + "no-ip", + "ns", + "nt", + "nu", + "on", + "pe", + "qc", + "sk", + "yk", + "cloudns", + "fantasyleague", + "ftpaccess", + "game-server", + "myphotos", + "scrapping", + "twmail", + "gov", + "blogspot", + "12hp", + "2ix", + "4lima", + "blogspot", + "dnsking", + "gotdns", + "lima-city", + "linkyard-cloud", + "square7", + "ac", + "asso", + "co", + "com", + "ed", + "edu", + "go", + "gouv", + "int", + "md", + "net", + "or", + "org", + "presse", + "xn--aroport-bya", + "www", + "blogspot", + "co", + "gob", + "gov", + "mil", + "nom", + "linkyard", + "magentosite", + "sensiosite", + "statics", + "trafficplex", + "vapor", + "barsy", + "cloudns", + "co", + "com", + "gov", + "net", + "ac", + "ah", + "bj", + "com", + "cq", + "edu", + "fj", + "gd", + "gov", + "gs", + "gx", + "gz", + "ha", + "hb", + "he", + "hi", + "hk", + "hl", + "hn", + "jl", + "js", + "jx", + "ln", + "mil", + "mo", + "net", + "nm", + "nx", + "org", + "qh", + "sc", + "sd", + "sh", + "sn", + "sx", + "tj", + "tw", + "xj", + "xn--55qx5d", + "xn--io0a7i", + "xn--od0alg", + "xz", + "yn", + "zj", + "amazonaws", + "cn-north-1", + "compute", + "eb", + "elb", + "s3", + "cn-north-1", + "arts", + "com", + "edu", + "firm", + "gov", + "info", + "int", + "mil", + "mypi", + "n4t", + "net", + "nodum", + "nom", + "org", + "otap", + "rec", + "web", + "blogspot", + "001www", + "0emm", + "1kapp", + "3utilities", + "4u", + "africa", + "alpha-myqnapcloud", + "amazonaws", + "appchizi", + "applinzi", + "appspot", + "ar", + "barsycenter", + "barsyonline", + "betainabox", + "bitballoon", + "blogdns", + "blogspot", + "blogsyte", + "bloxcms", + "bounty-full", + "bplaced", + "br", + "cechire", + "ciscofreak", + "cloudcontrolapp", + "cloudcontrolled", + "cn", + "co", + "codespot", + "damnserver", + "dattolocal", + "dattorelay", + "dattoweb", + "ddnsfree", + "ddnsgeek", + "ddnsking", + "ddnslive", + "de", + "dev-myqnapcloud", + "ditchyourip", + "dnsalias", + "dnsdojo", + "dnsiskinky", + "doesntexist", + "dontexist", + "doomdns", + "drayddns", + "dreamhosters", + "dsmynas", + "dyn-o-saur", + "dynalias", + "dyndns-at-home", + "dyndns-at-work", + "dyndns-blog", + "dyndns-free", + "dyndns-home", + "dyndns-ip", + "dyndns-mail", + "dyndns-office", + "dyndns-pics", + "dyndns-remote", + "dyndns-server", + "dyndns-web", + "dyndns-wiki", + "dyndns-work", + "dynns", + "elasticbeanstalk", + "est-a-la-maison", + "est-a-la-masion", + "est-le-patron", + "est-mon-blogueur", + "eu", + "evennode", + "familyds", + "fastvps-server", + "fbsbx", + "firebaseapp", + "firewall-gateway", + "flynnhub", + "freebox-os", + "freeboxos", + "from-ak", + "from-al", + "from-ar", + "from-ca", + "from-ct", + "from-dc", + "from-de", + "from-fl", + "from-ga", + "from-hi", + "from-ia", + "from-id", + "from-il", + "from-in", + "from-ks", + "from-ky", + "from-ma", + "from-md", + "from-mi", + "from-mn", + "from-mo", + "from-ms", + "from-mt", + "from-nc", + "from-nd", + "from-ne", + "from-nh", + "from-nj", + "from-nm", + "from-nv", + "from-oh", + "from-ok", + "from-or", + "from-pa", + "from-pr", + "from-ri", + "from-sc", + "from-sd", + "from-tn", + "from-tx", + "from-ut", + "from-va", + "from-vt", + "from-wa", + "from-wi", + "from-wv", + "from-wy", + "gb", + "geekgalaxy", + "getmyip", + "giize", + "githubusercontent", + "gleeze", + "googleapis", + "googlecode", + "gotdns", + "gotpantheon", + "gr", + "health-carereform", + "herokuapp", + "herokussl", + "hk", + "hobby-site", + "homelinux", + "homesecuritymac", + "homesecuritypc", + "homeunix", + "hu", + "iamallama", + "is-a-anarchist", + "is-a-blogger", + "is-a-bookkeeper", + "is-a-bulls-fan", + "is-a-caterer", + "is-a-chef", + "is-a-conservative", + "is-a-cpa", + "is-a-cubicle-slave", + "is-a-democrat", + "is-a-designer", + "is-a-doctor", + "is-a-financialadvisor", + "is-a-geek", + "is-a-green", + "is-a-guru", + "is-a-hard-worker", + "is-a-hunter", + "is-a-landscaper", + "is-a-lawyer", + "is-a-liberal", + "is-a-libertarian", + "is-a-llama", + "is-a-musician", + "is-a-nascarfan", + "is-a-nurse", + "is-a-painter", + "is-a-personaltrainer", + "is-a-photographer", + "is-a-player", + "is-a-republican", + "is-a-rockstar", + "is-a-socialist", + "is-a-student", + "is-a-teacher", + "is-a-techie", + "is-a-therapist", + "is-an-accountant", + "is-an-actor", + "is-an-actress", + "is-an-anarchist", + "is-an-artist", + "is-an-engineer", + "is-an-entertainer", + "is-certified", + "is-gone", + "is-into-anime", + "is-into-cars", + "is-into-cartoons", + "is-into-games", + "is-leet", + "is-not-certified", + "is-slick", + "is-uberleet", + "is-with-theband", + "isa-geek", + "isa-hockeynut", + "issmarterthanyou", + "jdevcloud", + "joyent", + "jpn", + "kozow", + "kr", + "likes-pie", + "likescandy", + "lmpm", + "logoip", + "loseyourip", + "meteorapp", + "mex", + "miniserver", + "myactivedirectory", + "myasustor", + "mydatto", + "mydrobo", + "myiphost", + "myqnapcloud", + "myravendb", + "mysecuritycamera", + "myshopblocks", + "mytuleap", + "myvnc", + "neat-url", + "net-freaks", + "netlify", + "nfshost", + "no", + "on-aptible", + "onthewifi", + "ooguy", + "operaunite", + "outsystemscloud", + "ownprovider", + "pagefrontapp", + "pagespeedmobilizer", + "pgfog", + "pixolino", + "point2this", + "prgmr", + "publishproxy", + "qa2", + "qc", + "quicksytes", + "quipelements", + "rackmaze", + "remotewd", + "rhcloud", + "ru", + "sa", + "saves-the-whales", + "scrysec", + "securitytactics", + "selfip", + "sells-for-less", + "sells-for-u", + "servebbs", + "servebeer", + "servecounterstrike", + "serveexchange", + "serveftp", + "servegame", + "servehalflife", + "servehttp", + "servehumour", + "serveirc", + "servemp3", + "servep2p", + "servepics", + "servequake", + "servesarcasm", + "simple-url", + "sinaapp", + "space-to-rent", + "stufftoread", + "teaches-yoga", + "temp-dns", + "theworkpc", + "townnews-staging", + "uk", + "unusualperson", + "us", + "uy", + "vipsinaapp", + "withgoogle", + "withyoutube", + "workisboring", + "wpdevcloud", + "writesthisblog", + "xenapponazure", + "xnbay", + "yolasite", + "za", + "ap-northeast-1", + "ap-northeast-2", + "ap-south-1", + "ap-southeast-1", + "ap-southeast-2", + "ca-central-1", + "compute", + "compute-1", + "elb", + "eu-central-1", + "eu-west-1", + "eu-west-2", + "eu-west-3", + "s3", + "s3-ap-northeast-1", + "s3-ap-northeast-2", + "s3-ap-south-1", + "s3-ap-southeast-1", + "s3-ap-southeast-2", + "s3-ca-central-1", + "s3-eu-central-1", + "s3-eu-west-1", + "s3-eu-west-2", + "s3-eu-west-3", + "s3-external-1", + "s3-fips-us-gov-west-1", + "s3-sa-east-1", + "s3-us-east-2", + "s3-us-gov-west-1", + "s3-us-west-1", + "s3-us-west-2", + "s3-website-ap-northeast-1", + "s3-website-ap-southeast-1", + "s3-website-ap-southeast-2", + "s3-website-eu-west-1", + "s3-website-sa-east-1", + "s3-website-us-east-1", + "s3-website-us-west-1", + "s3-website-us-west-2", + "sa-east-1", + "us-east-1", + "us-east-2", + "dualstack", + "s3", + "dualstack", + "s3", + "s3-website", + "s3", + "dualstack", + "s3", + "s3-website", + "s3", + "dualstack", + "s3", + "dualstack", + "s3", + "dualstack", + "s3", + "s3-website", + "s3", + "dualstack", + "s3", + "s3-website", + "s3", + "dualstack", + "s3", + "dualstack", + "s3", + "s3-website", + "s3", + "dualstack", + "s3", + "s3-website", + "s3", + "dualstack", + "s3", + "dualstack", + "s3", + "dualstack", + "s3", + "s3-website", + "s3", + "alpha", + "beta", + "ap-northeast-1", + "ap-northeast-2", + "ap-northeast-3", + "ap-south-1", + "ap-southeast-1", + "ap-southeast-2", + "ca-central-1", + "eu-central-1", + "eu-west-1", + "eu-west-2", + "eu-west-3", + "sa-east-1", + "us-east-1", + "us-east-2", + "us-gov-west-1", + "us-west-1", + "us-west-2", + "eu-1", + "eu-2", + "eu-3", + "eu-4", + "us-1", + "us-2", + "us-3", + "us-4", + "apps", + "cns", + "app", + "eu", + "xen", + "u2", + "u2-local", + "ravendb", + "de", + "ac", + "co", + "ed", + "fi", + "go", + "or", + "sa", + "com", + "edu", + "gov", + "inf", + "net", + "org", + "blogspot", + "com", + "edu", + "net", + "org", + "ath", + "gov", + "info", + "ac", + "biz", + "com", + "ekloges", + "gov", + "ltd", + "name", + "net", + "org", + "parliament", + "press", + "pro", + "tm", + "blogspot", + "blogspot", + "co", + "e4", + "metacentrum", + "muni", + "realm", + "cloud", + "custom", + "cloud", + "flt", + "usr", + "12hp", + "2ix", + "4lima", + "barsy", + "blogspot", + "bplaced", + "com", + "cosidns", + "dd-dns", + "ddnss", + "dnshome", + "dnsupdater", + "dray-dns", + "draydns", + "dyn-ip24", + "dyn-vpn", + "dynamisches-dns", + "dyndns1", + "dynvpn", + "firewall-gateway", + "fuettertdasnetz", + "git-repos", + "goip", + "home-webserver", + "internet-dns", + "isteingeek", + "istmein", + "keymachine", + "l-o-g-i-n", + "lcube-server", + "lebtimnetz", + "leitungsen", + "lima-city", + "logoip", + "mein-iserv", + "mein-vigor", + "my-gateway", + "my-router", + "my-vigor", + "my-wan", + "myhome-server", + "spdns", + "speedpartner", + "square7", + "svn-repos", + "syno-ds", + "synology-diskstation", + "synology-ds", + "taifun-dns", + "test-iserv", + "traeumtgerade", + "uberspace", + "virtual-user", + "virtualuser", + "dyn", + "dyn", + "dyndns", + "dyn", + "customer", + "fastpanel", + "biz", + "blogspot", + "co", + "firm", + "reg", + "store", + "com", + "edu", + "gov", + "net", + "org", + "art", + "com", + "edu", + "gob", + "gov", + "mil", + "net", + "org", + "sld", + "web", + "art", + "asso", + "com", + "edu", + "gov", + "net", + "org", + "pol", + "com", + "edu", + "fin", + "gob", + "gov", + "info", + "k12", + "med", + "mil", + "net", + "org", + "pro", + "aip", + "com", + "edu", + "fie", + "gov", + "lib", + "med", + "org", + "pri", + "riik", + "blogspot", + "com", + "edu", + "eun", + "gov", + "mil", + "name", + "net", + "org", + "sci", + "blogspot", + "com", + "edu", + "gob", + "nom", + "org", + "blogspot", + "compute", + "biz", + "com", + "edu", + "gov", + "info", + "name", + "net", + "org", + "barsy", + "cloudns", + "diskstation", + "mycd", + "spdns", + "transurl", + "wellbeingzone", + "party", + "user", + "ybo", + "storj", + "aland", + "blogspot", + "dy", + "iki", + "ptplus", + "aeroport", + "assedic", + "asso", + "avocat", + "avoues", + "blogspot", + "cci", + "chambagri", + "chirurgiens-dentistes", + "chirurgiens-dentistes-en-france", + "com", + "experts-comptables", + "fbx-os", + "fbxos", + "freebox-os", + "freeboxos", + "geometre-expert", + "gouv", + "greta", + "huissier-justice", + "medecin", + "nom", + "notaires", + "on-web", + "pharmacien", + "port", + "prd", + "presse", + "tm", + "veterinaire", + "nom", + "cnpy", + "com", + "edu", + "gov", + "mil", + "net", + "nom", + "org", + "pvt", + "co", + "cya", + "net", + "org", + "com", + "edu", + "gov", + "mil", + "org", + "com", + "edu", + "gov", + "ltd", + "mod", + "org", + "co", + "com", + "edu", + "net", + "nom", + "org", + "ac", + "com", + "edu", + "gov", + "net", + "org", + "cloud", + "asso", + "com", + "edu", + "mobi", + "net", + "org", + "blogspot", + "com", + "edu", + "gov", + "net", + "nym", + "org", + "com", + "edu", + "gob", + "ind", + "mil", + "net", + "nom", + "org", + "com", + "edu", + "gov", + "guam", + "info", + "net", + "org", + "web", + "co", + "com", + "edu", + "gov", + "net", + "nym", + "org", + "blogspot", + "com", + "edu", + "gov", + "idv", + "inc", + "ltd", + "net", + "org", + "xn--55qx5d", + "xn--ciqpn", + "xn--gmq050i", + "xn--gmqw5a", + "xn--io0a7i", + "xn--lcvr32d", + "xn--mk0axi", + "xn--mxtq1m", + "xn--od0alg", + "xn--od0aq3b", + "xn--tn0ag", + "xn--uc0atv", + "xn--uc0ay4a", + "xn--wcvs22d", + "xn--zf0avx", + "com", + "edu", + "gob", + "mil", + "net", + "nom", + "org", + "cloudaccess", + "freesite", + "half", + "pcloud", + "opencraft", + "blogspot", + "com", + "from", + "iz", + "name", + "adult", + "art", + "asso", + "com", + "coop", + "edu", + "firm", + "gouv", + "info", + "med", + "net", + "org", + "perso", + "pol", + "pro", + "rel", + "shop", + "2000", + "agrar", + "blogspot", + "bolt", + "casino", + "city", + "co", + "erotica", + "erotika", + "film", + "forum", + "games", + "hotel", + "info", + "ingatlan", + "jogasz", + "konyvelo", + "lakas", + "media", + "news", + "org", + "priv", + "reklam", + "sex", + "shop", + "sport", + "suli", + "szex", + "tm", + "tozsde", + "utazas", + "video", + "ac", + "biz", + "co", + "desa", + "go", + "mil", + "my", + "net", + "or", + "sch", + "web", + "zone", + "blogspot", + "blogspot", + "gov", + "nym", + "ac", + "co", + "gov", + "idf", + "k12", + "muni", + "net", + "org", + "blogspot", + "ac", + "co", + "com", + "net", + "nom", + "org", + "ro", + "tt", + "tv", + "ltd", + "plc", + "ac", + "barsy", + "blogspot", + "cloudns", + "co", + "edu", + "firm", + "gen", + "gov", + "ind", + "mil", + "net", + "nic", + "org", + "res", + "barrel-of-knowledge", + "barrell-of-knowledge", + "barsy", + "cloudns", + "dvrcam", + "dynamic-dns", + "dyndns", + "for-our", + "forumz", + "groks-the", + "groks-this", + "here-for-more", + "ilovecollege", + "knowsitall", + "mayfirst", + "no-ip", + "nsupdate", + "selfip", + "v-info", + "webhop", + "eu", + "2038", + "azurecontainer", + "backplaneapp", + "barsy", + "boxfuse", + "browsersafetymark", + "cleverapps", + "com", + "dedyn", + "definima", + "drud", + "enonic", + "github", + "gitlab", + "hasura-app", + "hzc", + "lair", + "ngrok", + "nid", + "nodeart", + "nodum", + "pantheonsite", + "protonet", + "resindevice", + "resinstaging", + "s5y", + "sandcats", + "shiftedit", + "spacekit", + "stolos", + "thingdust", + "utwente", + "vaporcloud", + "wedeploy", + "customer", + "apps", + "stage", + "devices", + "dev", + "disrec", + "prod", + "testing", + "cust", + "cust", + "cust", + "cust", + "com", + "edu", + "gov", + "mil", + "net", + "org", + "ac", + "co", + "gov", + "id", + "net", + "org", + "sch", + "xn--mgba3a4f16a", + "xn--mgba3a4fra", + "blogspot", + "com", + "cupcake", + "edu", + "gov", + "int", + "net", + "org", + "16-b", + "32-b", + "64-b", + "abr", + "abruzzo", + "ag", + "agrigento", + "al", + "alessandria", + "alto-adige", + "altoadige", + "an", + "ancona", + "andria-barletta-trani", + "andria-trani-barletta", + "andriabarlettatrani", + "andriatranibarletta", + "ao", + "aosta", + "aosta-valley", + "aostavalley", + "aoste", + "ap", + "aq", + "aquila", + "ar", + "arezzo", + "ascoli-piceno", + "ascolipiceno", + "asti", + "at", + "av", + "avellino", + "ba", + "balsan", + "balsan-sudtirol", + "balsan-suedtirol", + "bari", + "barletta-trani-andria", + "barlettatraniandria", + "bas", + "basilicata", + "belluno", + "benevento", + "bergamo", + "bg", + "bi", + "biella", + "bl", + "blogspot", + "bn", + "bo", + "bologna", + "bolzano", + "bolzano-altoadige", + "bozen", + "bozen-sudtirol", + "bozen-suedtirol", + "br", + "brescia", + "brindisi", + "bs", + "bt", + "bulsan", + "bulsan-sudtirol", + "bulsan-suedtirol", + "bz", + "ca", + "cagliari", + "cal", + "calabria", + "caltanissetta", + "cam", + "campania", + "campidano-medio", + "campidanomedio", + "campobasso", + "carbonia-iglesias", + "carboniaiglesias", + "carrara-massa", + "carraramassa", + "caserta", + "catania", + "catanzaro", + "cb", + "ce", + "cesena-forli", + "cesenaforli", + "ch", + "chieti", + "ci", + "cl", + "cn", + "co", + "como", + "cosenza", + "cr", + "cremona", + "crotone", + "cs", + "ct", + "cuneo", + "cz", + "dell-ogliastra", + "dellogliastra", + "edu", + "emilia-romagna", + "emiliaromagna", + "emr", + "en", + "enna", + "fc", + "fe", + "fermo", + "ferrara", + "fg", + "fi", + "firenze", + "florence", + "fm", + "foggia", + "forli-cesena", + "forlicesena", + "fr", + "friuli-v-giulia", + "friuli-ve-giulia", + "friuli-vegiulia", + "friuli-venezia-giulia", + "friuli-veneziagiulia", + "friuli-vgiulia", + "friuliv-giulia", + "friulive-giulia", + "friulivegiulia", + "friulivenezia-giulia", + "friuliveneziagiulia", + "friulivgiulia", + "frosinone", + "fvg", + "ge", + "genoa", + "genova", + "go", + "gorizia", + "gov", + "gr", + "grosseto", + "iglesias-carbonia", + "iglesiascarbonia", + "im", + "imperia", + "is", + "isernia", + "kr", + "la-spezia", + "laquila", + "laspezia", + "latina", + "laz", + "lazio", + "lc", + "le", + "lecce", + "lecco", + "li", + "lig", + "liguria", + "livorno", + "lo", + "lodi", + "lom", + "lombardia", + "lombardy", + "lt", + "lu", + "lucania", + "lucca", + "macerata", + "mantova", + "mar", + "marche", + "massa-carrara", + "massacarrara", + "matera", + "mb", + "mc", + "me", + "medio-campidano", + "mediocampidano", + "messina", + "mi", + "milan", + "milano", + "mn", + "mo", + "modena", + "mol", + "molise", + "monza", + "monza-brianza", + "monza-e-della-brianza", + "monzabrianza", + "monzaebrianza", + "monzaedellabrianza", + "ms", + "mt", + "na", + "naples", + "napoli", + "no", + "novara", + "nu", + "nuoro", + "og", + "ogliastra", + "olbia-tempio", + "olbiatempio", + "or", + "oristano", + "ot", + "pa", + "padova", + "padua", + "palermo", + "parma", + "pavia", + "pc", + "pd", + "pe", + "perugia", + "pesaro-urbino", + "pesarourbino", + "pescara", + "pg", + "pi", + "piacenza", + "piedmont", + "piemonte", + "pisa", + "pistoia", + "pmn", + "pn", + "po", + "pordenone", + "potenza", + "pr", + "prato", + "pt", + "pu", + "pug", + "puglia", + "pv", + "pz", + "ra", + "ragusa", + "ravenna", + "rc", + "re", + "reggio-calabria", + "reggio-emilia", + "reggiocalabria", + "reggioemilia", + "rg", + "ri", + "rieti", + "rimini", + "rm", + "rn", + "ro", + "roma", + "rome", + "rovigo", + "sa", + "salerno", + "sar", + "sardegna", + "sardinia", + "sassari", + "savona", + "si", + "sic", + "sicilia", + "sicily", + "siena", + "siracusa", + "so", + "sondrio", + "sp", + "sr", + "ss", + "suedtirol", + "sv", + "ta", + "taa", + "taranto", + "te", + "tempio-olbia", + "tempioolbia", + "teramo", + "terni", + "tn", + "to", + "torino", + "tos", + "toscana", + "tp", + "tr", + "trani-andria-barletta", + "trani-barletta-andria", + "traniandriabarletta", + "tranibarlettaandria", + "trapani", + "trentin-sud-tirol", + "trentin-sudtirol", + "trentin-sued-tirol", + "trentin-suedtirol", + "trentino", + "trentino-a-adige", + "trentino-aadige", + "trentino-alto-adige", + "trentino-altoadige", + "trentino-s-tirol", + "trentino-stirol", + "trentino-sud-tirol", + "trentino-sudtirol", + "trentino-sued-tirol", + "trentino-suedtirol", + "trentinoa-adige", + "trentinoaadige", + "trentinoalto-adige", + "trentinoaltoadige", + "trentinos-tirol", + "trentinostirol", + "trentinosud-tirol", + "trentinosudtirol", + "trentinosued-tirol", + "trentinosuedtirol", + "trentinsud-tirol", + "trentinsudtirol", + "trentinsued-tirol", + "trentinsuedtirol", + "trento", + "treviso", + "trieste", + "ts", + "turin", + "tuscany", + "tv", + "ud", + "udine", + "umb", + "umbria", + "urbino-pesaro", + "urbinopesaro", + "va", + "val-d-aosta", + "val-daosta", + "vald-aosta", + "valdaosta", + "valle-aosta", + "valle-d-aosta", + "valle-daosta", + "valleaosta", + "valled-aosta", + "valledaosta", + "vallee-aoste", + "vallee-d-aoste", + "valleeaoste", + "valleedaoste", + "vao", + "varese", + "vb", + "vc", + "vda", + "ve", + "ven", + "veneto", + "venezia", + "venice", + "verbania", + "vercelli", + "verona", + "vi", + "vibo-valentia", + "vibovalentia", + "vicenza", + "viterbo", + "vr", + "vs", + "vt", + "vv", + "xn--balsan-sudtirol-rqi", + "xn--bozen-sudtirol-76h", + "xn--bulsan-sudtirol-rqi", + "xn--cesena-forli-c2g", + "xn--cesenaforli-0jg", + "xn--forli-cesena-41g", + "xn--forlicesena-ujg", + "xn--sudtirol-y0e", + "xn--trentin-sud-tirol-tsj", + "xn--trentin-sudtirol-b9i", + "xn--trentino-sud-tirol-dck", + "xn--trentino-sudtirol-usj", + "xn--trentinosud-tirol-tsj", + "xn--trentinosudtirol-b9i", + "xn--trentinsud-tirol-98i", + "xn--trentinsudtirol-rqi", + "xn--vallee-aoste-i2g", + "xn--vallee-d-aoste-43h", + "xn--valleeaoste-6jg", + "xn--valleedaoste-i2g", + "co", + "net", + "org", + "com", + "edu", + "gov", + "mil", + "name", + "net", + "org", + "sch", + "ac", + "ad", + "aichi", + "akita", + "aomori", + "blogspot", + "chiba", + "co", + "ed", + "ehime", + "fukui", + "fukuoka", + "fukushima", + "gifu", + "go", + "gr", + "gunma", + "hiroshima", + "hokkaido", + "hyogo", + "ibaraki", + "ishikawa", + "iwate", + "kagawa", + "kagoshima", + "kanagawa", + "kawasaki", + "kitakyushu", + "kobe", + "kochi", + "kumamoto", + "kyoto", + "lg", + "mie", + "miyagi", + "miyazaki", + "nagano", + "nagasaki", + "nagoya", + "nara", + "ne", + "niigata", + "oita", + "okayama", + "okinawa", + "or", + "osaka", + "saga", + "saitama", + "sapporo", + "sendai", + "shiga", + "shimane", + "shizuoka", + "tochigi", + "tokushima", + "tokyo", + "tottori", + "toyama", + "wakayama", + "xn--0trq7p7nn", + "xn--1ctwo", + "xn--1lqs03n", + "xn--1lqs71d", + "xn--2m4a15e", + "xn--32vp30h", + "xn--4it168d", + "xn--4it797k", + "xn--4pvxs", + "xn--5js045d", + "xn--5rtp49c", + "xn--5rtq34k", + "xn--6btw5a", + "xn--6orx2r", + "xn--7t0a264c", + "xn--8ltr62k", + "xn--8pvr4u", + "xn--c3s14m", + "xn--d5qv7z876c", + "xn--djrs72d6uy", + "xn--djty4k", + "xn--efvn9s", + "xn--ehqz56n", + "xn--elqq16h", + "xn--f6qx53a", + "xn--k7yn95e", + "xn--kbrq7o", + "xn--klt787d", + "xn--kltp7d", + "xn--kltx9a", + "xn--klty5x", + "xn--mkru45i", + "xn--nit225k", + "xn--ntso0iqx3a", + "xn--ntsq17g", + "xn--pssu33l", + "xn--qqqt11m", + "xn--rht27z", + "xn--rht3d", + "xn--rht61e", + "xn--rny31h", + "xn--tor131o", + "xn--uist22h", + "xn--uisz3g", + "xn--uuwu58a", + "xn--vgu402c", + "xn--zbx025d", + "yamagata", + "yamaguchi", + "yamanashi", + "yokohama", + "aisai", + "ama", + "anjo", + "asuke", + "chiryu", + "chita", + "fuso", + "gamagori", + "handa", + "hazu", + "hekinan", + "higashiura", + "ichinomiya", + "inazawa", + "inuyama", + "isshiki", + "iwakura", + "kanie", + "kariya", + "kasugai", + "kira", + "kiyosu", + "komaki", + "konan", + "kota", + "mihama", + "miyoshi", + "nishio", + "nisshin", + "obu", + "oguchi", + "oharu", + "okazaki", + "owariasahi", + "seto", + "shikatsu", + "shinshiro", + "shitara", + "tahara", + "takahama", + "tobishima", + "toei", + "togo", + "tokai", + "tokoname", + "toyoake", + "toyohashi", + "toyokawa", + "toyone", + "toyota", + "tsushima", + "yatomi", + "akita", + "daisen", + "fujisato", + "gojome", + "hachirogata", + "happou", + "higashinaruse", + "honjo", + "honjyo", + "ikawa", + "kamikoani", + "kamioka", + "katagami", + "kazuno", + "kitaakita", + "kosaka", + "kyowa", + "misato", + "mitane", + "moriyoshi", + "nikaho", + "noshiro", + "odate", + "oga", + "ogata", + "semboku", + "yokote", + "yurihonjo", + "aomori", + "gonohe", + "hachinohe", + "hashikami", + "hiranai", + "hirosaki", + "itayanagi", + "kuroishi", + "misawa", + "mutsu", + "nakadomari", + "noheji", + "oirase", + "owani", + "rokunohe", + "sannohe", + "shichinohe", + "shingo", + "takko", + "towada", + "tsugaru", + "tsuruta", + "abiko", + "asahi", + "chonan", + "chosei", + "choshi", + "chuo", + "funabashi", + "futtsu", + "hanamigawa", + "ichihara", + "ichikawa", + "ichinomiya", + "inzai", + "isumi", + "kamagaya", + "kamogawa", + "kashiwa", + "katori", + "katsuura", + "kimitsu", + "kisarazu", + "kozaki", + "kujukuri", + "kyonan", + "matsudo", + "midori", + "mihama", + "minamiboso", + "mobara", + "mutsuzawa", + "nagara", + "nagareyama", + "narashino", + "narita", + "noda", + "oamishirasato", + "omigawa", + "onjuku", + "otaki", + "sakae", + "sakura", + "shimofusa", + "shirako", + "shiroi", + "shisui", + "sodegaura", + "sosa", + "tako", + "tateyama", + "togane", + "tohnosho", + "tomisato", + "urayasu", + "yachimata", + "yachiyo", + "yokaichiba", + "yokoshibahikari", + "yotsukaido", + "ainan", + "honai", + "ikata", + "imabari", + "iyo", + "kamijima", + "kihoku", + "kumakogen", + "masaki", + "matsuno", + "matsuyama", + "namikata", + "niihama", + "ozu", + "saijo", + "seiyo", + "shikokuchuo", + "tobe", + "toon", + "uchiko", + "uwajima", + "yawatahama", + "echizen", + "eiheiji", + "fukui", + "ikeda", + "katsuyama", + "mihama", + "minamiechizen", + "obama", + "ohi", + "ono", + "sabae", + "sakai", + "takahama", + "tsuruga", + "wakasa", + "ashiya", + "buzen", + "chikugo", + "chikuho", + "chikujo", + "chikushino", + "chikuzen", + "chuo", + "dazaifu", + "fukuchi", + "hakata", + "higashi", + "hirokawa", + "hisayama", + "iizuka", + "inatsuki", + "kaho", + "kasuga", + "kasuya", + "kawara", + "keisen", + "koga", + "kurate", + "kurogi", + "kurume", + "minami", + "miyako", + "miyama", + "miyawaka", + "mizumaki", + "munakata", + "nakagawa", + "nakama", + "nishi", + "nogata", + "ogori", + "okagaki", + "okawa", + "oki", + "omuta", + "onga", + "onojo", + "oto", + "saigawa", + "sasaguri", + "shingu", + "shinyoshitomi", + "shonai", + "soeda", + "sue", + "tachiarai", + "tagawa", + "takata", + "toho", + "toyotsu", + "tsuiki", + "ukiha", + "umi", + "usui", + "yamada", + "yame", + "yanagawa", + "yukuhashi", + "aizubange", + "aizumisato", + "aizuwakamatsu", + "asakawa", + "bandai", + "date", + "fukushima", + "furudono", + "futaba", + "hanawa", + "higashi", + "hirata", + "hirono", + "iitate", + "inawashiro", + "ishikawa", + "iwaki", + "izumizaki", + "kagamiishi", + "kaneyama", + "kawamata", + "kitakata", + "kitashiobara", + "koori", + "koriyama", + "kunimi", + "miharu", + "mishima", + "namie", + "nango", + "nishiaizu", + "nishigo", + "okuma", + "omotego", + "ono", + "otama", + "samegawa", + "shimogo", + "shirakawa", + "showa", + "soma", + "sukagawa", + "taishin", + "tamakawa", + "tanagura", + "tenei", + "yabuki", + "yamato", + "yamatsuri", + "yanaizu", + "yugawa", + "anpachi", + "ena", + "gifu", + "ginan", + "godo", + "gujo", + "hashima", + "hichiso", + "hida", + "higashishirakawa", + "ibigawa", + "ikeda", + "kakamigahara", + "kani", + "kasahara", + "kasamatsu", + "kawaue", + "kitagata", + "mino", + "minokamo", + "mitake", + "mizunami", + "motosu", + "nakatsugawa", + "ogaki", + "sakahogi", + "seki", + "sekigahara", + "shirakawa", + "tajimi", + "takayama", + "tarui", + "toki", + "tomika", + "wanouchi", + "yamagata", + "yaotsu", + "yoro", + "annaka", + "chiyoda", + "fujioka", + "higashiagatsuma", + "isesaki", + "itakura", + "kanna", + "kanra", + "katashina", + "kawaba", + "kiryu", + "kusatsu", + "maebashi", + "meiwa", + "midori", + "minakami", + "naganohara", + "nakanojo", + "nanmoku", + "numata", + "oizumi", + "ora", + "ota", + "shibukawa", + "shimonita", + "shinto", + "showa", + "takasaki", + "takayama", + "tamamura", + "tatebayashi", + "tomioka", + "tsukiyono", + "tsumagoi", + "ueno", + "yoshioka", + "asaminami", + "daiwa", + "etajima", + "fuchu", + "fukuyama", + "hatsukaichi", + "higashihiroshima", + "hongo", + "jinsekikogen", + "kaita", + "kui", + "kumano", + "kure", + "mihara", + "miyoshi", + "naka", + "onomichi", + "osakikamijima", + "otake", + "saka", + "sera", + "seranishi", + "shinichi", + "shobara", + "takehara", + "abashiri", + "abira", + "aibetsu", + "akabira", + "akkeshi", + "asahikawa", + "ashibetsu", + "ashoro", + "assabu", + "atsuma", + "bibai", + "biei", + "bifuka", + "bihoro", + "biratori", + "chippubetsu", + "chitose", + "date", + "ebetsu", + "embetsu", + "eniwa", + "erimo", + "esan", + "esashi", + "fukagawa", + "fukushima", + "furano", + "furubira", + "haboro", + "hakodate", + "hamatonbetsu", + "hidaka", + "higashikagura", + "higashikawa", + "hiroo", + "hokuryu", + "hokuto", + "honbetsu", + "horokanai", + "horonobe", + "ikeda", + "imakane", + "ishikari", + "iwamizawa", + "iwanai", + "kamifurano", + "kamikawa", + "kamishihoro", + "kamisunagawa", + "kamoenai", + "kayabe", + "kembuchi", + "kikonai", + "kimobetsu", + "kitahiroshima", + "kitami", + "kiyosato", + "koshimizu", + "kunneppu", + "kuriyama", + "kuromatsunai", + "kushiro", + "kutchan", + "kyowa", + "mashike", + "matsumae", + "mikasa", + "minamifurano", + "mombetsu", + "moseushi", + "mukawa", + "muroran", + "naie", + "nakagawa", + "nakasatsunai", + "nakatombetsu", + "nanae", + "nanporo", + "nayoro", + "nemuro", + "niikappu", + "niki", + "nishiokoppe", + "noboribetsu", + "numata", + "obihiro", + "obira", + "oketo", + "okoppe", + "otaru", + "otobe", + "otofuke", + "otoineppu", + "oumu", + "ozora", + "pippu", + "rankoshi", + "rebun", + "rikubetsu", + "rishiri", + "rishirifuji", + "saroma", + "sarufutsu", + "shakotan", + "shari", + "shibecha", + "shibetsu", + "shikabe", + "shikaoi", + "shimamaki", + "shimizu", + "shimokawa", + "shinshinotsu", + "shintoku", + "shiranuka", + "shiraoi", + "shiriuchi", + "sobetsu", + "sunagawa", + "taiki", + "takasu", + "takikawa", + "takinoue", + "teshikaga", + "tobetsu", + "tohma", + "tomakomai", + "tomari", + "toya", + "toyako", + "toyotomi", + "toyoura", + "tsubetsu", + "tsukigata", + "urakawa", + "urausu", + "uryu", + "utashinai", + "wakkanai", + "wassamu", + "yakumo", + "yoichi", + "aioi", + "akashi", + "ako", + "amagasaki", + "aogaki", + "asago", + "ashiya", + "awaji", + "fukusaki", + "goshiki", + "harima", + "himeji", + "ichikawa", + "inagawa", + "itami", + "kakogawa", + "kamigori", + "kamikawa", + "kasai", + "kasuga", + "kawanishi", + "miki", + "minamiawaji", + "nishinomiya", + "nishiwaki", + "ono", + "sanda", + "sannan", + "sasayama", + "sayo", + "shingu", + "shinonsen", + "shiso", + "sumoto", + "taishi", + "taka", + "takarazuka", + "takasago", + "takino", + "tamba", + "tatsuno", + "toyooka", + "yabu", + "yashiro", + "yoka", + "yokawa", + "ami", + "asahi", + "bando", + "chikusei", + "daigo", + "fujishiro", + "hitachi", + "hitachinaka", + "hitachiomiya", + "hitachiota", + "ibaraki", + "ina", + "inashiki", + "itako", + "iwama", + "joso", + "kamisu", + "kasama", + "kashima", + "kasumigaura", + "koga", + "miho", + "mito", + "moriya", + "naka", + "namegata", + "oarai", + "ogawa", + "omitama", + "ryugasaki", + "sakai", + "sakuragawa", + "shimodate", + "shimotsuma", + "shirosato", + "sowa", + "suifu", + "takahagi", + "tamatsukuri", + "tokai", + "tomobe", + "tone", + "toride", + "tsuchiura", + "tsukuba", + "uchihara", + "ushiku", + "yachiyo", + "yamagata", + "yawara", + "yuki", + "anamizu", + "hakui", + "hakusan", + "kaga", + "kahoku", + "kanazawa", + "kawakita", + "komatsu", + "nakanoto", + "nanao", + "nomi", + "nonoichi", + "noto", + "shika", + "suzu", + "tsubata", + "tsurugi", + "uchinada", + "wajima", + "fudai", + "fujisawa", + "hanamaki", + "hiraizumi", + "hirono", + "ichinohe", + "ichinoseki", + "iwaizumi", + "iwate", + "joboji", + "kamaishi", + "kanegasaki", + "karumai", + "kawai", + "kitakami", + "kuji", + "kunohe", + "kuzumaki", + "miyako", + "mizusawa", + "morioka", + "ninohe", + "noda", + "ofunato", + "oshu", + "otsuchi", + "rikuzentakata", + "shiwa", + "shizukuishi", + "sumita", + "tanohata", + "tono", + "yahaba", + "yamada", + "ayagawa", + "higashikagawa", + "kanonji", + "kotohira", + "manno", + "marugame", + "mitoyo", + "naoshima", + "sanuki", + "tadotsu", + "takamatsu", + "tonosho", + "uchinomi", + "utazu", + "zentsuji", + "akune", + "amami", + "hioki", + "isa", + "isen", + "izumi", + "kagoshima", + "kanoya", + "kawanabe", + "kinko", + "kouyama", + "makurazaki", + "matsumoto", + "minamitane", + "nakatane", + "nishinoomote", + "satsumasendai", + "soo", + "tarumizu", + "yusui", + "aikawa", + "atsugi", + "ayase", + "chigasaki", + "ebina", + "fujisawa", + "hadano", + "hakone", + "hiratsuka", + "isehara", + "kaisei", + "kamakura", + "kiyokawa", + "matsuda", + "minamiashigara", + "miura", + "nakai", + "ninomiya", + "odawara", + "oi", + "oiso", + "sagamihara", + "samukawa", + "tsukui", + "yamakita", + "yamato", + "yokosuka", + "yugawara", + "zama", + "zushi", + "city", + "city", + "city", + "aki", + "geisei", + "hidaka", + "higashitsuno", + "ino", + "kagami", + "kami", + "kitagawa", + "kochi", + "mihara", + "motoyama", + "muroto", + "nahari", + "nakamura", + "nankoku", + "nishitosa", + "niyodogawa", + "ochi", + "okawa", + "otoyo", + "otsuki", + "sakawa", + "sukumo", + "susaki", + "tosa", + "tosashimizu", + "toyo", + "tsuno", + "umaji", + "yasuda", + "yusuhara", + "amakusa", + "arao", + "aso", + "choyo", + "gyokuto", + "kamiamakusa", + "kikuchi", + "kumamoto", + "mashiki", + "mifune", + "minamata", + "minamioguni", + "nagasu", + "nishihara", + "oguni", + "ozu", + "sumoto", + "takamori", + "uki", + "uto", + "yamaga", + "yamato", + "yatsushiro", + "ayabe", + "fukuchiyama", + "higashiyama", + "ide", + "ine", + "joyo", + "kameoka", + "kamo", + "kita", + "kizu", + "kumiyama", + "kyotamba", + "kyotanabe", + "kyotango", + "maizuru", + "minami", + "minamiyamashiro", + "miyazu", + "muko", + "nagaokakyo", + "nakagyo", + "nantan", + "oyamazaki", + "sakyo", + "seika", + "tanabe", + "uji", + "ujitawara", + "wazuka", + "yamashina", + "yawata", + "asahi", + "inabe", + "ise", + "kameyama", + "kawagoe", + "kiho", + "kisosaki", + "kiwa", + "komono", + "kumano", + "kuwana", + "matsusaka", + "meiwa", + "mihama", + "minamiise", + "misugi", + "miyama", + "nabari", + "shima", + "suzuka", + "tado", + "taiki", + "taki", + "tamaki", + "toba", + "tsu", + "udono", + "ureshino", + "watarai", + "yokkaichi", + "furukawa", + "higashimatsushima", + "ishinomaki", + "iwanuma", + "kakuda", + "kami", + "kawasaki", + "marumori", + "matsushima", + "minamisanriku", + "misato", + "murata", + "natori", + "ogawara", + "ohira", + "onagawa", + "osaki", + "rifu", + "semine", + "shibata", + "shichikashuku", + "shikama", + "shiogama", + "shiroishi", + "tagajo", + "taiwa", + "tome", + "tomiya", + "wakuya", + "watari", + "yamamoto", + "zao", + "aya", + "ebino", + "gokase", + "hyuga", + "kadogawa", + "kawaminami", + "kijo", + "kitagawa", + "kitakata", + "kitaura", + "kobayashi", + "kunitomi", + "kushima", + "mimata", + "miyakonojo", + "miyazaki", + "morotsuka", + "nichinan", + "nishimera", + "nobeoka", + "saito", + "shiiba", + "shintomi", + "takaharu", + "takanabe", + "takazaki", + "tsuno", + "achi", + "agematsu", + "anan", + "aoki", + "asahi", + "azumino", + "chikuhoku", + "chikuma", + "chino", + "fujimi", + "hakuba", + "hara", + "hiraya", + "iida", + "iijima", + "iiyama", + "iizuna", + "ikeda", + "ikusaka", + "ina", + "karuizawa", + "kawakami", + "kiso", + "kisofukushima", + "kitaaiki", + "komagane", + "komoro", + "matsukawa", + "matsumoto", + "miasa", + "minamiaiki", + "minamimaki", + "minamiminowa", + "minowa", + "miyada", + "miyota", + "mochizuki", + "nagano", + "nagawa", + "nagiso", + "nakagawa", + "nakano", + "nozawaonsen", + "obuse", + "ogawa", + "okaya", + "omachi", + "omi", + "ookuwa", + "ooshika", + "otaki", + "otari", + "sakae", + "sakaki", + "saku", + "sakuho", + "shimosuwa", + "shinanomachi", + "shiojiri", + "suwa", + "suzaka", + "takagi", + "takamori", + "takayama", + "tateshina", + "tatsuno", + "togakushi", + "togura", + "tomi", + "ueda", + "wada", + "yamagata", + "yamanouchi", + "yasaka", + "yasuoka", + "chijiwa", + "futsu", + "goto", + "hasami", + "hirado", + "iki", + "isahaya", + "kawatana", + "kuchinotsu", + "matsuura", + "nagasaki", + "obama", + "omura", + "oseto", + "saikai", + "sasebo", + "seihi", + "shimabara", + "shinkamigoto", + "togitsu", + "tsushima", + "unzen", + "city", + "ando", + "gose", + "heguri", + "higashiyoshino", + "ikaruga", + "ikoma", + "kamikitayama", + "kanmaki", + "kashiba", + "kashihara", + "katsuragi", + "kawai", + "kawakami", + "kawanishi", + "koryo", + "kurotaki", + "mitsue", + "miyake", + "nara", + "nosegawa", + "oji", + "ouda", + "oyodo", + "sakurai", + "sango", + "shimoichi", + "shimokitayama", + "shinjo", + "soni", + "takatori", + "tawaramoto", + "tenkawa", + "tenri", + "uda", + "yamatokoriyama", + "yamatotakada", + "yamazoe", + "yoshino", + "aga", + "agano", + "gosen", + "itoigawa", + "izumozaki", + "joetsu", + "kamo", + "kariwa", + "kashiwazaki", + "minamiuonuma", + "mitsuke", + "muika", + "murakami", + "myoko", + "nagaoka", + "niigata", + "ojiya", + "omi", + "sado", + "sanjo", + "seiro", + "seirou", + "sekikawa", + "shibata", + "tagami", + "tainai", + "tochio", + "tokamachi", + "tsubame", + "tsunan", + "uonuma", + "yahiko", + "yoita", + "yuzawa", + "beppu", + "bungoono", + "bungotakada", + "hasama", + "hiji", + "himeshima", + "hita", + "kamitsue", + "kokonoe", + "kuju", + "kunisaki", + "kusu", + "oita", + "saiki", + "taketa", + "tsukumi", + "usa", + "usuki", + "yufu", + "akaiwa", + "asakuchi", + "bizen", + "hayashima", + "ibara", + "kagamino", + "kasaoka", + "kibichuo", + "kumenan", + "kurashiki", + "maniwa", + "misaki", + "nagi", + "niimi", + "nishiawakura", + "okayama", + "satosho", + "setouchi", + "shinjo", + "shoo", + "soja", + "takahashi", + "tamano", + "tsuyama", + "wake", + "yakage", + "aguni", + "ginowan", + "ginoza", + "gushikami", + "haebaru", + "higashi", + "hirara", + "iheya", + "ishigaki", + "ishikawa", + "itoman", + "izena", + "kadena", + "kin", + "kitadaito", + "kitanakagusuku", + "kumejima", + "kunigami", + "minamidaito", + "motobu", + "nago", + "naha", + "nakagusuku", + "nakijin", + "nanjo", + "nishihara", + "ogimi", + "okinawa", + "onna", + "shimoji", + "taketomi", + "tarama", + "tokashiki", + "tomigusuku", + "tonaki", + "urasoe", + "uruma", + "yaese", + "yomitan", + "yonabaru", + "yonaguni", + "zamami", + "abeno", + "chihayaakasaka", + "chuo", + "daito", + "fujiidera", + "habikino", + "hannan", + "higashiosaka", + "higashisumiyoshi", + "higashiyodogawa", + "hirakata", + "ibaraki", + "ikeda", + "izumi", + "izumiotsu", + "izumisano", + "kadoma", + "kaizuka", + "kanan", + "kashiwara", + "katano", + "kawachinagano", + "kishiwada", + "kita", + "kumatori", + "matsubara", + "minato", + "minoh", + "misaki", + "moriguchi", + "neyagawa", + "nishi", + "nose", + "osakasayama", + "sakai", + "sayama", + "sennan", + "settsu", + "shijonawate", + "shimamoto", + "suita", + "tadaoka", + "taishi", + "tajiri", + "takaishi", + "takatsuki", + "tondabayashi", + "toyonaka", + "toyono", + "yao", + "ariake", + "arita", + "fukudomi", + "genkai", + "hamatama", + "hizen", + "imari", + "kamimine", + "kanzaki", + "karatsu", + "kashima", + "kitagata", + "kitahata", + "kiyama", + "kouhoku", + "kyuragi", + "nishiarita", + "ogi", + "omachi", + "ouchi", + "saga", + "shiroishi", + "taku", + "tara", + "tosu", + "yoshinogari", + "arakawa", + "asaka", + "chichibu", + "fujimi", + "fujimino", + "fukaya", + "hanno", + "hanyu", + "hasuda", + "hatogaya", + "hatoyama", + "hidaka", + "higashichichibu", + "higashimatsuyama", + "honjo", + "ina", + "iruma", + "iwatsuki", + "kamiizumi", + "kamikawa", + "kamisato", + "kasukabe", + "kawagoe", + "kawaguchi", + "kawajima", + "kazo", + "kitamoto", + "koshigaya", + "kounosu", + "kuki", + "kumagaya", + "matsubushi", + "minano", + "misato", + "miyashiro", + "miyoshi", + "moroyama", + "nagatoro", + "namegawa", + "niiza", + "ogano", + "ogawa", + "ogose", + "okegawa", + "omiya", + "otaki", + "ranzan", + "ryokami", + "saitama", + "sakado", + "satte", + "sayama", + "shiki", + "shiraoka", + "soka", + "sugito", + "toda", + "tokigawa", + "tokorozawa", + "tsurugashima", + "urawa", + "warabi", + "yashio", + "yokoze", + "yono", + "yorii", + "yoshida", + "yoshikawa", + "yoshimi", + "city", + "city", + "aisho", + "gamo", + "higashiomi", + "hikone", + "koka", + "konan", + "kosei", + "koto", + "kusatsu", + "maibara", + "moriyama", + "nagahama", + "nishiazai", + "notogawa", + "omihachiman", + "otsu", + "ritto", + "ryuoh", + "takashima", + "takatsuki", + "torahime", + "toyosato", + "yasu", + "akagi", + "ama", + "gotsu", + "hamada", + "higashiizumo", + "hikawa", + "hikimi", + "izumo", + "kakinoki", + "masuda", + "matsue", + "misato", + "nishinoshima", + "ohda", + "okinoshima", + "okuizumo", + "shimane", + "tamayu", + "tsuwano", + "unnan", + "yakumo", + "yasugi", + "yatsuka", + "arai", + "atami", + "fuji", + "fujieda", + "fujikawa", + "fujinomiya", + "fukuroi", + "gotemba", + "haibara", + "hamamatsu", + "higashiizu", + "ito", + "iwata", + "izu", + "izunokuni", + "kakegawa", + "kannami", + "kawanehon", + "kawazu", + "kikugawa", + "kosai", + "makinohara", + "matsuzaki", + "minamiizu", + "mishima", + "morimachi", + "nishiizu", + "numazu", + "omaezaki", + "shimada", + "shimizu", + "shimoda", + "shizuoka", + "susono", + "yaizu", + "yoshida", + "ashikaga", + "bato", + "haga", + "ichikai", + "iwafune", + "kaminokawa", + "kanuma", + "karasuyama", + "kuroiso", + "mashiko", + "mibu", + "moka", + "motegi", + "nasu", + "nasushiobara", + "nikko", + "nishikata", + "nogi", + "ohira", + "ohtawara", + "oyama", + "sakura", + "sano", + "shimotsuke", + "shioya", + "takanezawa", + "tochigi", + "tsuga", + "ujiie", + "utsunomiya", + "yaita", + "aizumi", + "anan", + "ichiba", + "itano", + "kainan", + "komatsushima", + "matsushige", + "mima", + "minami", + "miyoshi", + "mugi", + "nakagawa", + "naruto", + "sanagochi", + "shishikui", + "tokushima", + "wajiki", + "adachi", + "akiruno", + "akishima", + "aogashima", + "arakawa", + "bunkyo", + "chiyoda", + "chofu", + "chuo", + "edogawa", + "fuchu", + "fussa", + "hachijo", + "hachioji", + "hamura", + "higashikurume", + "higashimurayama", + "higashiyamato", + "hino", + "hinode", + "hinohara", + "inagi", + "itabashi", + "katsushika", + "kita", + "kiyose", + "kodaira", + "koganei", + "kokubunji", + "komae", + "koto", + "kouzushima", + "kunitachi", + "machida", + "meguro", + "minato", + "mitaka", + "mizuho", + "musashimurayama", + "musashino", + "nakano", + "nerima", + "ogasawara", + "okutama", + "ome", + "oshima", + "ota", + "setagaya", + "shibuya", + "shinagawa", + "shinjuku", + "suginami", + "sumida", + "tachikawa", + "taito", + "tama", + "toshima", + "chizu", + "hino", + "kawahara", + "koge", + "kotoura", + "misasa", + "nanbu", + "nichinan", + "sakaiminato", + "tottori", + "wakasa", + "yazu", + "yonago", + "asahi", + "fuchu", + "fukumitsu", + "funahashi", + "himi", + "imizu", + "inami", + "johana", + "kamiichi", + "kurobe", + "nakaniikawa", + "namerikawa", + "nanto", + "nyuzen", + "oyabe", + "taira", + "takaoka", + "tateyama", + "toga", + "tonami", + "toyama", + "unazuki", + "uozu", + "yamada", + "arida", + "aridagawa", + "gobo", + "hashimoto", + "hidaka", + "hirogawa", + "inami", + "iwade", + "kainan", + "kamitonda", + "katsuragi", + "kimino", + "kinokawa", + "kitayama", + "koya", + "koza", + "kozagawa", + "kudoyama", + "kushimoto", + "mihama", + "misato", + "nachikatsuura", + "shingu", + "shirahama", + "taiji", + "tanabe", + "wakayama", + "yuasa", + "yura", + "asahi", + "funagata", + "higashine", + "iide", + "kahoku", + "kaminoyama", + "kaneyama", + "kawanishi", + "mamurogawa", + "mikawa", + "murayama", + "nagai", + "nakayama", + "nanyo", + "nishikawa", + "obanazawa", + "oe", + "oguni", + "ohkura", + "oishida", + "sagae", + "sakata", + "sakegawa", + "shinjo", + "shirataka", + "shonai", + "takahata", + "tendo", + "tozawa", + "tsuruoka", + "yamagata", + "yamanobe", + "yonezawa", + "yuza", + "abu", + "hagi", + "hikari", + "hofu", + "iwakuni", + "kudamatsu", + "mitou", + "nagato", + "oshima", + "shimonoseki", + "shunan", + "tabuse", + "tokuyama", + "toyota", + "ube", + "yuu", + "chuo", + "doshi", + "fuefuki", + "fujikawa", + "fujikawaguchiko", + "fujiyoshida", + "hayakawa", + "hokuto", + "ichikawamisato", + "kai", + "kofu", + "koshu", + "kosuge", + "minami-alps", + "minobu", + "nakamichi", + "nanbu", + "narusawa", + "nirasaki", + "nishikatsura", + "oshino", + "otsuki", + "showa", + "tabayama", + "tsuru", + "uenohara", + "yamanakako", + "yamanashi", + "city", + "ac", + "co", + "go", + "info", + "me", + "mobi", + "ne", + "nom", + "or", + "sc", + "blogspot", + "com", + "edu", + "gov", + "mil", + "net", + "org", + "biz", + "com", + "edu", + "gov", + "info", + "net", + "org", + "ass", + "asso", + "com", + "coop", + "edu", + "gouv", + "gov", + "medecin", + "mil", + "nom", + "notaires", + "org", + "pharmaciens", + "prd", + "presse", + "tm", + "veterinaire", + "edu", + "gov", + "net", + "org", + "com", + "edu", + "gov", + "org", + "rep", + "tra", + "ac", + "blogspot", + "busan", + "chungbuk", + "chungnam", + "co", + "daegu", + "daejeon", + "es", + "gangwon", + "go", + "gwangju", + "gyeongbuk", + "gyeonggi", + "gyeongnam", + "hs", + "incheon", + "jeju", + "jeonbuk", + "jeonnam", + "kg", + "mil", + "ms", + "ne", + "or", + "pe", + "re", + "sc", + "seoul", + "ulsan", + "co", + "edu", + "com", + "edu", + "gov", + "net", + "org", + "com", + "edu", + "gov", + "mil", + "net", + "nym", + "org", + "bnr", + "c", + "com", + "edu", + "gov", + "info", + "int", + "net", + "nym", + "org", + "per", + "static", + "dev", + "sites", + "com", + "edu", + "gov", + "net", + "org", + "co", + "com", + "edu", + "gov", + "net", + "nym", + "org", + "oy", + "blogspot", + "nom", + "nym", + "cyon", + "mypep", + "ac", + "assn", + "com", + "edu", + "gov", + "grp", + "hotel", + "int", + "ltd", + "net", + "ngo", + "org", + "sch", + "soc", + "web", + "com", + "edu", + "gov", + "net", + "org", + "co", + "org", + "blogspot", + "gov", + "nym", + "blogspot", + "nym", + "asn", + "com", + "conf", + "edu", + "gov", + "id", + "mil", + "net", + "org", + "com", + "edu", + "gov", + "id", + "med", + "net", + "org", + "plc", + "sch", + "ac", + "co", + "gov", + "net", + "org", + "press", + "router", + "asso", + "tm", + "blogspot", + "ac", + "barsy", + "brasilia", + "c66", + "co", + "daplie", + "ddns", + "diskstation", + "dnsfor", + "dscloud", + "edu", + "filegear", + "gov", + "hopto", + "i234", + "its", + "loginto", + "myds", + "net", + "nohost", + "noip", + "nym", + "org", + "priv", + "ravendb", + "soundcast", + "synology", + "tcp4", + "webhop", + "wedeploy", + "yombo", + "localhost", + "barsy", + "co", + "com", + "edu", + "gov", + "mil", + "nom", + "org", + "prd", + "tm", + "blogspot", + "com", + "edu", + "gov", + "inf", + "name", + "net", + "nom", + "org", + "com", + "edu", + "gouv", + "gov", + "net", + "org", + "presse", + "edu", + "gov", + "nyc", + "nym", + "org", + "com", + "edu", + "gov", + "net", + "org", + "barsy", + "dscloud", + "blogspot", + "gov", + "com", + "edu", + "gov", + "net", + "org", + "com", + "edu", + "net", + "org", + "blogspot", + "ac", + "co", + "com", + "gov", + "net", + "or", + "org", + "academy", + "agriculture", + "air", + "airguard", + "alabama", + "alaska", + "amber", + "ambulance", + "american", + "americana", + "americanantiques", + "americanart", + "amsterdam", + "and", + "annefrank", + "anthro", + "anthropology", + "antiques", + "aquarium", + "arboretum", + "archaeological", + "archaeology", + "architecture", + "art", + "artanddesign", + "artcenter", + "artdeco", + "arteducation", + "artgallery", + "arts", + "artsandcrafts", + "asmatart", + "assassination", + "assisi", + "association", + "astronomy", + "atlanta", + "austin", + "australia", + "automotive", + "aviation", + "axis", + "badajoz", + "baghdad", + "bahn", + "bale", + "baltimore", + "barcelona", + "baseball", + "basel", + "baths", + "bauern", + "beauxarts", + "beeldengeluid", + "bellevue", + "bergbau", + "berkeley", + "berlin", + "bern", + "bible", + "bilbao", + "bill", + "birdart", + "birthplace", + "bonn", + "boston", + "botanical", + "botanicalgarden", + "botanicgarden", + "botany", + "brandywinevalley", + "brasil", + "bristol", + "british", + "britishcolumbia", + "broadcast", + "brunel", + "brussel", + "brussels", + "bruxelles", + "building", + "burghof", + "bus", + "bushey", + "cadaques", + "california", + "cambridge", + "can", + "canada", + "capebreton", + "carrier", + "cartoonart", + "casadelamoneda", + "castle", + "castres", + "celtic", + "center", + "chattanooga", + "cheltenham", + "chesapeakebay", + "chicago", + "children", + "childrens", + "childrensgarden", + "chiropractic", + "chocolate", + "christiansburg", + "cincinnati", + "cinema", + "circus", + "civilisation", + "civilization", + "civilwar", + "clinton", + "clock", + "coal", + "coastaldefence", + "cody", + "coldwar", + "collection", + "colonialwilliamsburg", + "coloradoplateau", + "columbia", + "columbus", + "communication", + "communications", + "community", + "computer", + "computerhistory", + "contemporary", + "contemporaryart", + "convent", + "copenhagen", + "corporation", + "corvette", + "costume", + "countryestate", + "county", + "crafts", + "cranbrook", + "creation", + "cultural", + "culturalcenter", + "culture", + "cyber", + "cymru", + "dali", + "dallas", + "database", + "ddr", + "decorativearts", + "delaware", + "delmenhorst", + "denmark", + "depot", + "design", + "detroit", + "dinosaur", + "discovery", + "dolls", + "donostia", + "durham", + "eastafrica", + "eastcoast", + "education", + "educational", + "egyptian", + "eisenbahn", + "elburg", + "elvendrell", + "embroidery", + "encyclopedic", + "england", + "entomology", + "environment", + "environmentalconservation", + "epilepsy", + "essex", + "estate", + "ethnology", + "exeter", + "exhibition", + "family", + "farm", + "farmequipment", + "farmers", + "farmstead", + "field", + "figueres", + "filatelia", + "film", + "fineart", + "finearts", + "finland", + "flanders", + "florida", + "force", + "fortmissoula", + "fortworth", + "foundation", + "francaise", + "frankfurt", + "franziskaner", + "freemasonry", + "freiburg", + "fribourg", + "frog", + "fundacio", + "furniture", + "gallery", + "garden", + "gateway", + "geelvinck", + "gemological", + "geology", + "georgia", + "giessen", + "glas", + "glass", + "gorge", + "grandrapids", + "graz", + "guernsey", + "halloffame", + "hamburg", + "handson", + "harvestcelebration", + "hawaii", + "health", + "heimatunduhren", + "hellas", + "helsinki", + "hembygdsforbund", + "heritage", + "histoire", + "historical", + "historicalsociety", + "historichouses", + "historisch", + "historisches", + "history", + "historyofscience", + "horology", + "house", + "humanities", + "illustration", + "imageandsound", + "indian", + "indiana", + "indianapolis", + "indianmarket", + "intelligence", + "interactive", + "iraq", + "iron", + "isleofman", + "jamison", + "jefferson", + "jerusalem", + "jewelry", + "jewish", + "jewishart", + "jfk", + "journalism", + "judaica", + "judygarland", + "juedisches", + "juif", + "karate", + "karikatur", + "kids", + "koebenhavn", + "koeln", + "kunst", + "kunstsammlung", + "kunstunddesign", + "labor", + "labour", + "lajolla", + "lancashire", + "landes", + "lans", + "larsson", + "lewismiller", + "lincoln", + "linz", + "living", + "livinghistory", + "localhistory", + "london", + "losangeles", + "louvre", + "loyalist", + "lucerne", + "luxembourg", + "luzern", + "mad", + "madrid", + "mallorca", + "manchester", + "mansion", + "mansions", + "manx", + "marburg", + "maritime", + "maritimo", + "maryland", + "marylhurst", + "media", + "medical", + "medizinhistorisches", + "meeres", + "memorial", + "mesaverde", + "michigan", + "midatlantic", + "military", + "mill", + "miners", + "mining", + "minnesota", + "missile", + "missoula", + "modern", + "moma", + "money", + "monmouth", + "monticello", + "montreal", + "moscow", + "motorcycle", + "muenchen", + "muenster", + "mulhouse", + "muncie", + "museet", + "museumcenter", + "museumvereniging", + "music", + "national", + "nationalfirearms", + "nationalheritage", + "nativeamerican", + "naturalhistory", + "naturalhistorymuseum", + "naturalsciences", + "nature", + "naturhistorisches", + "natuurwetenschappen", + "naumburg", + "naval", + "nebraska", + "neues", + "newhampshire", + "newjersey", + "newmexico", + "newport", + "newspaper", + "newyork", + "niepce", + "norfolk", + "north", + "nrw", + "nuernberg", + "nuremberg", + "nyc", + "nyny", + "oceanographic", + "oceanographique", + "omaha", + "online", + "ontario", + "openair", + "oregon", + "oregontrail", + "otago", + "oxford", + "pacific", + "paderborn", + "palace", + "paleo", + "palmsprings", + "panama", + "paris", + "pasadena", + "pharmacy", + "philadelphia", + "philadelphiaarea", + "philately", + "phoenix", + "photography", + "pilots", + "pittsburgh", + "planetarium", + "plantation", + "plants", + "plaza", + "portal", + "portland", + "portlligat", + "posts-and-telecommunications", + "preservation", + "presidio", + "press", + "project", + "public", + "pubol", + "quebec", + "railroad", + "railway", + "research", + "resistance", + "riodejaneiro", + "rochester", + "rockart", + "roma", + "russia", + "saintlouis", + "salem", + "salvadordali", + "salzburg", + "sandiego", + "sanfrancisco", + "santabarbara", + "santacruz", + "santafe", + "saskatchewan", + "satx", + "savannahga", + "schlesisches", + "schoenbrunn", + "schokoladen", + "school", + "schweiz", + "science", + "science-fiction", + "scienceandhistory", + "scienceandindustry", + "sciencecenter", + "sciencecenters", + "sciencehistory", + "sciences", + "sciencesnaturelles", + "scotland", + "seaport", + "settlement", + "settlers", + "shell", + "sherbrooke", + "sibenik", + "silk", + "ski", + "skole", + "society", + "sologne", + "soundandvision", + "southcarolina", + "southwest", + "space", + "spy", + "square", + "stadt", + "stalbans", + "starnberg", + "state", + "stateofdelaware", + "station", + "steam", + "steiermark", + "stjohn", + "stockholm", + "stpetersburg", + "stuttgart", + "suisse", + "surgeonshall", + "surrey", + "svizzera", + "sweden", + "sydney", + "tank", + "tcm", + "technology", + "telekommunikation", + "television", + "texas", + "textile", + "theater", + "time", + "timekeeping", + "topology", + "torino", + "touch", + "town", + "transport", + "tree", + "trolley", + "trust", + "trustee", + "uhren", + "ulm", + "undersea", + "university", + "usa", + "usantiques", + "usarts", + "uscountryestate", + "usculture", + "usdecorativearts", + "usgarden", + "ushistory", + "ushuaia", + "uslivinghistory", + "utah", + "uvic", + "valley", + "vantaa", + "versailles", + "viking", + "village", + "virginia", + "virtual", + "virtuel", + "vlaanderen", + "volkenkunde", + "wales", + "wallonie", + "war", + "washingtondc", + "watch-and-clock", + "watchandclock", + "western", + "westfalen", + "whaling", + "wildlife", + "williamsburg", + "windmill", + "workshop", + "xn--9dbhblg6di", + "xn--comunicaes-v6a2o", + "xn--correios-e-telecomunicaes-ghc29a", + "xn--h1aegh", + "xn--lns-qla", + "york", + "yorkshire", + "yosemite", + "youth", + "zoological", + "zoology", + "aero", + "biz", + "com", + "coop", + "edu", + "gov", + "info", + "int", + "mil", + "museum", + "name", + "net", + "org", + "pro", + "ac", + "biz", + "co", + "com", + "coop", + "edu", + "gov", + "int", + "museum", + "net", + "org", + "blogspot", + "com", + "edu", + "gob", + "net", + "nym", + "org", + "blogspot", + "com", + "edu", + "gov", + "mil", + "name", + "net", + "org", + "ac", + "adv", + "co", + "edu", + "gov", + "mil", + "net", + "org", + "ca", + "cc", + "co", + "com", + "dr", + "in", + "info", + "mobi", + "mx", + "name", + "or", + "org", + "pro", + "school", + "tv", + "us", + "ws", + "her", + "his", + "forgot", + "forgot", + "asso", + "nom", + "alwaysdata", + "at-band-camp", + "azure-mobile", + "azurewebsites", + "barsy", + "blackbaudcdn", + "blogdns", + "boomla", + "bounceme", + "bplaced", + "broke-it", + "buyshouses", + "casacam", + "cdn77", + "cdn77-ssl", + "channelsdvr", + "cloudaccess", + "cloudapp", + "cloudeity", + "cloudfront", + "cloudfunctions", + "cloudycluster", + "cryptonomic", + "dattolocal", + "ddns", + "debian", + "definima", + "dnsalias", + "dnsdojo", + "dnsup", + "does-it", + "dontexist", + "dsmynas", + "dynalias", + "dynathome", + "dynu", + "dynv6", + "eating-organic", + "endofinternet", + "familyds", + "fastly", + "fastlylb", + "feste-ip", + "firewall-gateway", + "flynnhosting", + "from-az", + "from-co", + "from-la", + "from-ny", + "gb", + "gets-it", + "ham-radio-op", + "hicam", + "homeftp", + "homeip", + "homelinux", + "homeunix", + "hu", + "in", + "in-the-band", + "ipifony", + "is-a-chef", + "is-a-geek", + "isa-geek", + "jp", + "kicks-ass", + "knx-server", + "memset", + "moonscale", + "mydatto", + "mydissent", + "myeffect", + "myfritz", + "mymediapc", + "mypsx", + "mysecuritycamera", + "nhlfan", + "no-ip", + "now-dns", + "office-on-the", + "ownip", + "pgafan", + "podzone", + "privatizehealthinsurance", + "rackmaze", + "redirectme", + "ru", + "schokokeks", + "scrapper-site", + "se", + "selfip", + "sells-it", + "servebbs", + "serveblog", + "serveftp", + "serveminecraft", + "square7", + "static-access", + "sytes", + "t3l3p0rt", + "thruhere", + "twmail", + "uk", + "vpndns", + "webhop", + "za", + "r", + "freetls", + "map", + "prod", + "ssl", + "a", + "global", + "a", + "b", + "global", + "map", + "alces", + "arts", + "com", + "firm", + "info", + "net", + "other", + "per", + "rec", + "store", + "web", + "com", + "edu", + "gov", + "i", + "mil", + "mobi", + "name", + "net", + "org", + "sch", + "blogspot", + "ac", + "biz", + "co", + "com", + "edu", + "gob", + "in", + "info", + "int", + "mil", + "net", + "nom", + "org", + "web", + "blogspot", + "bv", + "cistron", + "co", + "demon", + "hosting-cluster", + "transurl", + "virtueeldomein", + "aa", + "aarborte", + "aejrie", + "afjord", + "agdenes", + "ah", + "akershus", + "aknoluokta", + "akrehamn", + "al", + "alaheadju", + "alesund", + "algard", + "alstahaug", + "alta", + "alvdal", + "amli", + "amot", + "andasuolo", + "andebu", + "andoy", + "ardal", + "aremark", + "arendal", + "arna", + "aseral", + "asker", + "askim", + "askoy", + "askvoll", + "asnes", + "audnedaln", + "aukra", + "aure", + "aurland", + "aurskog-holand", + "austevoll", + "austrheim", + "averoy", + "badaddja", + "bahcavuotna", + "bahccavuotna", + "baidar", + "bajddar", + "balat", + "balestrand", + "ballangen", + "balsfjord", + "bamble", + "bardu", + "barum", + "batsfjord", + "bearalvahki", + "beardu", + "beiarn", + "berg", + "bergen", + "berlevag", + "bievat", + "bindal", + "birkenes", + "bjarkoy", + "bjerkreim", + "bjugn", + "blogspot", + "bodo", + "bokn", + "bomlo", + "bremanger", + "bronnoy", + "bronnoysund", + "brumunddal", + "bryne", + "bu", + "budejju", + "buskerud", + "bygland", + "bykle", + "cahcesuolo", + "co", + "davvenjarga", + "davvesiida", + "deatnu", + "dep", + "dielddanuorri", + "divtasvuodna", + "divttasvuotna", + "donna", + "dovre", + "drammen", + "drangedal", + "drobak", + "dyroy", + "egersund", + "eid", + "eidfjord", + "eidsberg", + "eidskog", + "eidsvoll", + "eigersund", + "elverum", + "enebakk", + "engerdal", + "etne", + "etnedal", + "evenassi", + "evenes", + "evje-og-hornnes", + "farsund", + "fauske", + "fedje", + "fet", + "fetsund", + "fhs", + "finnoy", + "fitjar", + "fjaler", + "fjell", + "fla", + "flakstad", + "flatanger", + "flekkefjord", + "flesberg", + "flora", + "floro", + "fm", + "folkebibl", + "folldal", + "forde", + "forsand", + "fosnes", + "frana", + "fredrikstad", + "frei", + "frogn", + "froland", + "frosta", + "froya", + "fuoisku", + "fuossko", + "fusa", + "fylkesbibl", + "fyresdal", + "gaivuotna", + "galsa", + "gamvik", + "gangaviika", + "gaular", + "gausdal", + "giehtavuoatna", + "gildeskal", + "giske", + "gjemnes", + "gjerdrum", + "gjerstad", + "gjesdal", + "gjovik", + "gloppen", + "gol", + "gran", + "grane", + "granvin", + "gratangen", + "grimstad", + "grong", + "grue", + "gulen", + "guovdageaidnu", + "ha", + "habmer", + "hadsel", + "hagebostad", + "halden", + "halsa", + "hamar", + "hamaroy", + "hammarfeasta", + "hammerfest", + "hapmir", + "haram", + "hareid", + "harstad", + "hasvik", + "hattfjelldal", + "haugesund", + "hedmark", + "hemne", + "hemnes", + "hemsedal", + "herad", + "hitra", + "hjartdal", + "hjelmeland", + "hl", + "hm", + "hobol", + "hof", + "hokksund", + "hol", + "hole", + "holmestrand", + "holtalen", + "honefoss", + "hordaland", + "hornindal", + "horten", + "hoyanger", + "hoylandet", + "hurdal", + "hurum", + "hvaler", + "hyllestad", + "ibestad", + "idrett", + "inderoy", + "iveland", + "ivgu", + "jan-mayen", + "jessheim", + "jevnaker", + "jolster", + "jondal", + "jorpeland", + "kafjord", + "karasjohka", + "karasjok", + "karlsoy", + "karmoy", + "kautokeino", + "kirkenes", + "klabu", + "klepp", + "kommune", + "kongsberg", + "kongsvinger", + "kopervik", + "kraanghke", + "kragero", + "kristiansand", + "kristiansund", + "krodsherad", + "krokstadelva", + "kvafjord", + "kvalsund", + "kvam", + "kvanangen", + "kvinesdal", + "kvinnherad", + "kviteseid", + "kvitsoy", + "laakesvuemie", + "lahppi", + "langevag", + "lardal", + "larvik", + "lavagis", + "lavangen", + "leangaviika", + "lebesby", + "leikanger", + "leirfjord", + "leirvik", + "leka", + "leksvik", + "lenvik", + "lerdal", + "lesja", + "levanger", + "lier", + "lierne", + "lillehammer", + "lillesand", + "lindas", + "lindesnes", + "loabat", + "lodingen", + "lom", + "loppa", + "lorenskog", + "loten", + "lund", + "lunner", + "luroy", + "luster", + "lyngdal", + "lyngen", + "malatvuopmi", + "malselv", + "malvik", + "mandal", + "marker", + "marnardal", + "masfjorden", + "masoy", + "matta-varjjat", + "meland", + "meldal", + "melhus", + "meloy", + "meraker", + "midsund", + "midtre-gauldal", + "mil", + "mjondalen", + "mo-i-rana", + "moareke", + "modalen", + "modum", + "molde", + "more-og-romsdal", + "mosjoen", + "moskenes", + "moss", + "mosvik", + "mr", + "muosat", + "museum", + "naamesjevuemie", + "namdalseid", + "namsos", + "namsskogan", + "nannestad", + "naroy", + "narviika", + "narvik", + "naustdal", + "navuotna", + "nedre-eiker", + "nesna", + "nesodden", + "nesoddtangen", + "nesseby", + "nesset", + "nissedal", + "nittedal", + "nl", + "nord-aurdal", + "nord-fron", + "nord-odal", + "norddal", + "nordkapp", + "nordland", + "nordre-land", + "nordreisa", + "nore-og-uvdal", + "notodden", + "notteroy", + "nt", + "odda", + "of", + "oksnes", + "ol", + "omasvuotna", + "oppdal", + "oppegard", + "orkanger", + "orkdal", + "orland", + "orskog", + "orsta", + "osen", + "oslo", + "osoyro", + "osteroy", + "ostfold", + "ostre-toten", + "overhalla", + "ovre-eiker", + "oyer", + "oygarden", + "oystre-slidre", + "porsanger", + "porsangu", + "porsgrunn", + "priv", + "rade", + "radoy", + "rahkkeravju", + "raholt", + "raisa", + "rakkestad", + "ralingen", + "rana", + "randaberg", + "rauma", + "rendalen", + "rennebu", + "rennesoy", + "rindal", + "ringebu", + "ringerike", + "ringsaker", + "risor", + "rissa", + "rl", + "roan", + "rodoy", + "rollag", + "romsa", + "romskog", + "roros", + "rost", + "royken", + "royrvik", + "ruovat", + "rygge", + "salangen", + "salat", + "saltdal", + "samnanger", + "sandefjord", + "sandnes", + "sandnessjoen", + "sandoy", + "sarpsborg", + "sauda", + "sauherad", + "sel", + "selbu", + "selje", + "seljord", + "sf", + "siellak", + "sigdal", + "siljan", + "sirdal", + "skanit", + "skanland", + "skaun", + "skedsmo", + "skedsmokorset", + "ski", + "skien", + "skierva", + "skiptvet", + "skjak", + "skjervoy", + "skodje", + "slattum", + "smola", + "snaase", + "snasa", + "snillfjord", + "snoasa", + "sogndal", + "sogne", + "sokndal", + "sola", + "solund", + "somna", + "sondre-land", + "songdalen", + "sor-aurdal", + "sor-fron", + "sor-odal", + "sor-varanger", + "sorfold", + "sorreisa", + "sortland", + "sorum", + "spjelkavik", + "spydeberg", + "st", + "stange", + "stat", + "stathelle", + "stavanger", + "stavern", + "steigen", + "steinkjer", + "stjordal", + "stjordalshalsen", + "stokke", + "stor-elvdal", + "stord", + "stordal", + "storfjord", + "strand", + "stranda", + "stryn", + "sula", + "suldal", + "sund", + "sunndal", + "surnadal", + "svalbard", + "sveio", + "svelvik", + "sykkylven", + "tana", + "tananger", + "telemark", + "time", + "tingvoll", + "tinn", + "tjeldsund", + "tjome", + "tm", + "tokke", + "tolga", + "tonsberg", + "torsken", + "tr", + "trana", + "tranby", + "tranoy", + "troandin", + "trogstad", + "tromsa", + "tromso", + "trondheim", + "trysil", + "tvedestrand", + "tydal", + "tynset", + "tysfjord", + "tysnes", + "tysvar", + "ullensaker", + "ullensvang", + "ulvik", + "unjarga", + "utsira", + "va", + "vaapste", + "vadso", + "vaga", + "vagan", + "vagsoy", + "vaksdal", + "valle", + "vang", + "vanylven", + "vardo", + "varggat", + "varoy", + "vefsn", + "vega", + "vegarshei", + "vennesla", + "verdal", + "verran", + "vestby", + "vestfold", + "vestnes", + "vestre-slidre", + "vestre-toten", + "vestvagoy", + "vevelstad", + "vf", + "vgs", + "vik", + "vikna", + "vindafjord", + "voagat", + "volda", + "voss", + "vossevangen", + "xn--andy-ira", + "xn--asky-ira", + "xn--aurskog-hland-jnb", + "xn--avery-yua", + "xn--bdddj-mrabd", + "xn--bearalvhki-y4a", + "xn--berlevg-jxa", + "xn--bhcavuotna-s4a", + "xn--bhccavuotna-k7a", + "xn--bidr-5nac", + "xn--bievt-0qa", + "xn--bjarky-fya", + "xn--bjddar-pta", + "xn--blt-elab", + "xn--bmlo-gra", + "xn--bod-2na", + "xn--brnny-wuac", + "xn--brnnysund-m8ac", + "xn--brum-voa", + "xn--btsfjord-9za", + "xn--davvenjrga-y4a", + "xn--dnna-gra", + "xn--drbak-wua", + "xn--dyry-ira", + "xn--eveni-0qa01ga", + "xn--finny-yua", + "xn--fjord-lra", + "xn--fl-zia", + "xn--flor-jra", + "xn--frde-gra", + "xn--frna-woa", + "xn--frya-hra", + "xn--ggaviika-8ya47h", + "xn--gildeskl-g0a", + "xn--givuotna-8ya", + "xn--gjvik-wua", + "xn--gls-elac", + "xn--h-2fa", + "xn--hbmer-xqa", + "xn--hcesuolo-7ya35b", + "xn--hgebostad-g3a", + "xn--hmmrfeasta-s4ac", + "xn--hnefoss-q1a", + "xn--hobl-ira", + "xn--holtlen-hxa", + "xn--hpmir-xqa", + "xn--hyanger-q1a", + "xn--hylandet-54a", + "xn--indery-fya", + "xn--jlster-bya", + "xn--jrpeland-54a", + "xn--karmy-yua", + "xn--kfjord-iua", + "xn--klbu-woa", + "xn--koluokta-7ya57h", + "xn--krager-gya", + "xn--kranghke-b0a", + "xn--krdsherad-m8a", + "xn--krehamn-dxa", + "xn--krjohka-hwab49j", + "xn--ksnes-uua", + "xn--kvfjord-nxa", + "xn--kvitsy-fya", + "xn--kvnangen-k0a", + "xn--l-1fa", + "xn--laheadju-7ya", + "xn--langevg-jxa", + "xn--ldingen-q1a", + "xn--leagaviika-52b", + "xn--lesund-hua", + "xn--lgrd-poac", + "xn--lhppi-xqa", + "xn--linds-pra", + "xn--loabt-0qa", + "xn--lrdal-sra", + "xn--lrenskog-54a", + "xn--lt-liac", + "xn--lten-gra", + "xn--lury-ira", + "xn--mely-ira", + "xn--merker-kua", + "xn--mjndalen-64a", + "xn--mlatvuopmi-s4a", + "xn--mli-tla", + "xn--mlselv-iua", + "xn--moreke-jua", + "xn--mosjen-eya", + "xn--mot-tla", + "xn--mre-og-romsdal-qqb", + "xn--msy-ula0h", + "xn--mtta-vrjjat-k7af", + "xn--muost-0qa", + "xn--nmesjevuemie-tcba", + "xn--nry-yla5g", + "xn--nttery-byae", + "xn--nvuotna-hwa", + "xn--oppegrd-ixa", + "xn--ostery-fya", + "xn--osyro-wua", + "xn--porsgu-sta26f", + "xn--rady-ira", + "xn--rdal-poa", + "xn--rde-ula", + "xn--rdy-0nab", + "xn--rennesy-v1a", + "xn--rhkkervju-01af", + "xn--rholt-mra", + "xn--risa-5na", + "xn--risr-ira", + "xn--rland-uua", + "xn--rlingen-mxa", + "xn--rmskog-bya", + "xn--rros-gra", + "xn--rskog-uua", + "xn--rst-0na", + "xn--rsta-fra", + "xn--ryken-vua", + "xn--ryrvik-bya", + "xn--s-1fa", + "xn--sandnessjen-ogb", + "xn--sandy-yua", + "xn--seral-lra", + "xn--sgne-gra", + "xn--skierv-uta", + "xn--skjervy-v1a", + "xn--skjk-soa", + "xn--sknit-yqa", + "xn--sknland-fxa", + "xn--slat-5na", + "xn--slt-elab", + "xn--smla-hra", + "xn--smna-gra", + "xn--snase-nra", + "xn--sndre-land-0cb", + "xn--snes-poa", + "xn--snsa-roa", + "xn--sr-aurdal-l8a", + "xn--sr-fron-q1a", + "xn--sr-odal-q1a", + "xn--sr-varanger-ggb", + "xn--srfold-bya", + "xn--srreisa-q1a", + "xn--srum-gra", + "xn--stfold-9xa", + "xn--stjrdal-s1a", + "xn--stjrdalshalsen-sqb", + "xn--stre-toten-zcb", + "xn--tjme-hra", + "xn--tnsberg-q1a", + "xn--trany-yua", + "xn--trgstad-r1a", + "xn--trna-woa", + "xn--troms-zua", + "xn--tysvr-vra", + "xn--unjrga-rta", + "xn--vads-jra", + "xn--vard-jra", + "xn--vegrshei-c0a", + "xn--vestvgy-ixa6o", + "xn--vg-yiab", + "xn--vgan-qoa", + "xn--vgsy-qoa0j", + "xn--vre-eiker-k8a", + "xn--vrggt-xqad", + "xn--vry-yla5g", + "xn--yer-zna", + "xn--ygarden-p1a", + "xn--ystre-slidre-ujb", + "gs", + "gs", + "nes", + "gs", + "nes", + "gs", + "os", + "valer", + "xn--vler-qoa", + "gs", + "gs", + "os", + "gs", + "heroy", + "sande", + "gs", + "gs", + "bo", + "heroy", + "xn--b-5ga", + "xn--hery-ira", + "gs", + "gs", + "gs", + "gs", + "valer", + "gs", + "gs", + "gs", + "gs", + "bo", + "xn--b-5ga", + "gs", + "gs", + "gs", + "sande", + "gs", + "sande", + "xn--hery-ira", + "xn--vler-qoa", + "biz", + "com", + "edu", + "gov", + "info", + "net", + "org", + "merseine", + "mine", + "nom", + "shacknet", + "ac", + "co", + "cri", + "geek", + "gen", + "govt", + "health", + "iwi", + "kiwi", + "maori", + "mil", + "net", + "nym", + "org", + "parliament", + "school", + "xn--mori-qsa", + "blogspot", + "co", + "com", + "edu", + "gov", + "med", + "museum", + "net", + "org", + "pro", + "homelink", + "barsy", + "accesscam", + "ae", + "amune", + "barsy", + "blogdns", + "blogsite", + "bmoattachments", + "boldlygoingnowhere", + "cable-modem", + "camdvr", + "cdn77", + "cdn77-secure", + "certmgr", + "cloudns", + "collegefan", + "couchpotatofries", + "ddnss", + "diskstation", + "dnsalias", + "dnsdojo", + "doesntexist", + "dontexist", + "doomdns", + "dsmynas", + "duckdns", + "dvrdns", + "dynalias", + "dyndns", + "dynserv", + "endofinternet", + "endoftheinternet", + "eu", + "familyds", + "fedorainfracloud", + "fedorapeople", + "fedoraproject", + "freeddns", + "freedesktop", + "from-me", + "game-host", + "gotdns", + "hepforge", + "hk", + "hobby-site", + "homedns", + "homeftp", + "homelinux", + "homeunix", + "hopto", + "is-a-bruinsfan", + "is-a-candidate", + "is-a-celticsfan", + "is-a-chef", + "is-a-geek", + "is-a-knight", + "is-a-linux-user", + "is-a-patsfan", + "is-a-soxfan", + "is-found", + "is-lost", + "is-saved", + "is-very-bad", + "is-very-evil", + "is-very-good", + "is-very-nice", + "is-very-sweet", + "isa-geek", + "js", + "kicks-ass", + "mayfirst", + "misconfused", + "mlbfan", + "mozilla-iot", + "my-firewall", + "myfirewall", + "myftp", + "mysecuritycamera", + "mywire", + "nflfan", + "no-ip", + "now-dns", + "pimienta", + "podzone", + "poivron", + "potager", + "read-books", + "readmyblog", + "selfip", + "sellsyourhome", + "servebbs", + "serveftp", + "servegame", + "spdns", + "stuff-4-sale", + "sweetpepper", + "tunk", + "tuxfamily", + "twmail", + "ufcfan", + "uklugs", + "us", + "webhop", + "webredirect", + "wmflabs", + "za", + "zapto", + "tele", + "c", + "rsc", + "origin", + "ssl", + "go", + "home", + "al", + "asso", + "at", + "au", + "be", + "bg", + "ca", + "cd", + "ch", + "cn", + "cy", + "cz", + "de", + "dk", + "edu", + "ee", + "es", + "fi", + "fr", + "gr", + "hr", + "hu", + "ie", + "il", + "in", + "int", + "is", + "it", + "jp", + "kr", + "lt", + "lu", + "lv", + "mc", + "me", + "mk", + "mt", + "my", + "net", + "ng", + "nl", + "no", + "nz", + "paris", + "pl", + "pt", + "q-a", + "ro", + "ru", + "se", + "si", + "sk", + "tr", + "uk", + "us", + "cloud", + "os", + "stg", + "app", + "os", + "app", + "nerdpol", + "abo", + "ac", + "com", + "edu", + "gob", + "ing", + "med", + "net", + "nom", + "org", + "sld", + "ybo", + "blogspot", + "com", + "edu", + "gob", + "mil", + "net", + "nom", + "nym", + "org", + "com", + "edu", + "org", + "com", + "edu", + "gov", + "i", + "mil", + "net", + "ngo", + "org", + "1337", + "biz", + "com", + "edu", + "fam", + "gob", + "gok", + "gon", + "gop", + "gos", + "gov", + "info", + "net", + "org", + "web", + "agro", + "aid", + "art", + "atm", + "augustow", + "auto", + "babia-gora", + "bedzin", + "beep", + "beskidy", + "bialowieza", + "bialystok", + "bielawa", + "bieszczady", + "biz", + "boleslawiec", + "bydgoszcz", + "bytom", + "cieszyn", + "co", + "com", + "czeladz", + "czest", + "dlugoleka", + "edu", + "elblag", + "elk", + "gda", + "gdansk", + "gdynia", + "gliwice", + "glogow", + "gmina", + "gniezno", + "gorlice", + "gov", + "grajewo", + "gsm", + "ilawa", + "info", + "jaworzno", + "jelenia-gora", + "jgora", + "kalisz", + "karpacz", + "kartuzy", + "kaszuby", + "katowice", + "kazimierz-dolny", + "kepno", + "ketrzyn", + "klodzko", + "kobierzyce", + "kolobrzeg", + "konin", + "konskowola", + "krakow", + "kutno", + "lapy", + "lebork", + "legnica", + "lezajsk", + "limanowa", + "lomza", + "lowicz", + "lubin", + "lukow", + "mail", + "malbork", + "malopolska", + "mazowsze", + "mazury", + "med", + "media", + "miasta", + "mielec", + "mielno", + "mil", + "mragowo", + "naklo", + "net", + "nieruchomosci", + "nom", + "nowaruda", + "nysa", + "olawa", + "olecko", + "olkusz", + "olsztyn", + "opoczno", + "opole", + "org", + "ostroda", + "ostroleka", + "ostrowiec", + "ostrowwlkp", + "pc", + "pila", + "pisz", + "podhale", + "podlasie", + "polkowice", + "pomorskie", + "pomorze", + "powiat", + "poznan", + "priv", + "prochowice", + "pruszkow", + "przeworsk", + "pulawy", + "radom", + "rawa-maz", + "realestate", + "rel", + "rybnik", + "rzeszow", + "sanok", + "sejny", + "sex", + "shop", + "sklep", + "skoczow", + "slask", + "slupsk", + "sopot", + "sos", + "sosnowiec", + "stalowa-wola", + "starachowice", + "stargard", + "suwalki", + "swidnica", + "swiebodzin", + "swinoujscie", + "szczecin", + "szczytno", + "szkola", + "targi", + "tarnobrzeg", + "tgory", + "tm", + "tourism", + "travel", + "turek", + "turystyka", + "tychy", + "ustka", + "walbrzych", + "warmia", + "warszawa", + "waw", + "wegrow", + "wielun", + "wlocl", + "wloclawek", + "wodzislaw", + "wolomin", + "wroc", + "wroclaw", + "zachpomor", + "zagan", + "zakopane", + "zarow", + "zgora", + "zgorzelec", + "ap", + "griw", + "ic", + "is", + "kmpsp", + "konsulat", + "kppsp", + "kwp", + "kwpsp", + "mup", + "mw", + "oirm", + "oum", + "pa", + "pinb", + "piw", + "po", + "psp", + "psse", + "pup", + "rzgw", + "sa", + "sdn", + "sko", + "so", + "sr", + "starostwo", + "ug", + "ugim", + "um", + "umig", + "upow", + "uppo", + "us", + "uw", + "uzs", + "wif", + "wiih", + "winb", + "wios", + "witd", + "wiw", + "wsa", + "wskr", + "wuoz", + "wzmiuw", + "zp", + "own", + "co", + "edu", + "gov", + "net", + "org", + "ac", + "biz", + "com", + "edu", + "est", + "gov", + "info", + "isla", + "name", + "net", + "org", + "pro", + "prof", + "aaa", + "aca", + "acct", + "avocat", + "bar", + "barsy", + "cloudns", + "cpa", + "dnstrace", + "eng", + "jur", + "law", + "med", + "recht", + "bci", + "com", + "edu", + "gov", + "net", + "org", + "plo", + "sec", + "blogspot", + "com", + "edu", + "gov", + "int", + "net", + "nome", + "nym", + "org", + "publ", + "barsy", + "belau", + "cloudns", + "co", + "ed", + "go", + "ne", + "nom", + "or", + "x443", + "com", + "coop", + "edu", + "gov", + "mil", + "net", + "org", + "blogspot", + "com", + "edu", + "gov", + "mil", + "name", + "net", + "nom", + "org", + "sch", + "asso", + "blogspot", + "com", + "nom", + "ybo", + "clan", + "arts", + "blogspot", + "com", + "firm", + "info", + "nom", + "nt", + "nym", + "org", + "rec", + "shop", + "store", + "tm", + "www", + "lima-city", + "myddns", + "webspace", + "ac", + "blogspot", + "co", + "edu", + "gov", + "in", + "nom", + "org", + "ox", + "ac", + "adygeya", + "bashkiria", + "bir", + "blogspot", + "cbg", + "cldmail", + "com", + "dagestan", + "edu", + "gov", + "grozny", + "int", + "kalmykia", + "kustanai", + "marine", + "mil", + "mordovia", + "msk", + "myjino", + "mytis", + "nalchik", + "net", + "nov", + "org", + "pp", + "pyatigorsk", + "ras", + "spb", + "test", + "vladikavkaz", + "vladimir", + "hb", + "hosting", + "landing", + "spectrum", + "vps", + "development", + "ravendb", + "ac", + "co", + "com", + "edu", + "gouv", + "gov", + "int", + "mil", + "net", + "com", + "edu", + "gov", + "med", + "net", + "org", + "pub", + "sch", + "com", + "edu", + "gov", + "net", + "org", + "com", + "edu", + "gov", + "net", + "org", + "ybo", + "com", + "edu", + "gov", + "info", + "med", + "net", + "org", + "tv", + "a", + "ac", + "b", + "bd", + "blogspot", + "brand", + "c", + "com", + "d", + "e", + "f", + "fh", + "fhsk", + "fhv", + "g", + "h", + "i", + "k", + "komforb", + "kommunalforbund", + "komvux", + "l", + "lanbib", + "m", + "n", + "naturbruksgymn", + "o", + "org", + "p", + "parti", + "pp", + "press", + "r", + "s", + "t", + "tm", + "u", + "w", + "x", + "y", + "z", + "blogspot", + "com", + "edu", + "gov", + "net", + "org", + "per", + "com", + "gov", + "hashbang", + "mil", + "net", + "now", + "org", + "platform", + "wedeploy", + "barsy", + "blogspot", + "nom", + "barsy", + "byen", + "cyon", + "platformsh", + "blogspot", + "nym", + "com", + "edu", + "gov", + "net", + "org", + "art", + "blogspot", + "com", + "edu", + "gouv", + "org", + "perso", + "univ", + "com", + "net", + "org", + "linkitools", + "stackspace", + "uber", + "xs4all", + "co", + "com", + "consulado", + "edu", + "embaixada", + "gov", + "mil", + "net", + "noho", + "nom", + "org", + "principe", + "saotome", + "store", + "abkhazia", + "adygeya", + "aktyubinsk", + "arkhangelsk", + "armenia", + "ashgabad", + "azerbaijan", + "balashov", + "bashkiria", + "bryansk", + "bukhara", + "chimkent", + "dagestan", + "east-kazakhstan", + "exnet", + "georgia", + "grozny", + "ivanovo", + "jambyl", + "kalmykia", + "kaluga", + "karacol", + "karaganda", + "karelia", + "khakassia", + "krasnodar", + "kurgan", + "kustanai", + "lenug", + "mangyshlak", + "mordovia", + "msk", + "murmansk", + "nalchik", + "navoi", + "north-kazakhstan", + "nov", + "nym", + "obninsk", + "penza", + "pokrovsk", + "sochi", + "spb", + "tashkent", + "termez", + "togliatti", + "troitsk", + "tselinograd", + "tula", + "tuva", + "vladikavkaz", + "vladimir", + "vologda", + "barsy", + "com", + "edu", + "gob", + "org", + "red", + "gov", + "nym", + "com", + "edu", + "gov", + "mil", + "net", + "org", + "knightpoint", + "ac", + "co", + "org", + "blogspot", + "ac", + "co", + "go", + "in", + "mi", + "net", + "or", + "ac", + "biz", + "co", + "com", + "edu", + "go", + "gov", + "int", + "mil", + "name", + "net", + "nic", + "nom", + "org", + "test", + "web", + "gov", + "co", + "com", + "edu", + "gov", + "mil", + "net", + "nom", + "org", + "agrinet", + "com", + "defense", + "edunet", + "ens", + "fin", + "gov", + "ind", + "info", + "intl", + "mincom", + "nat", + "net", + "org", + "perso", + "rnrt", + "rns", + "rnu", + "tourism", + "turen", + "com", + "edu", + "gov", + "mil", + "net", + "org", + "vpnplus", + "now-dns", + "ntdll", + "av", + "bbs", + "bel", + "biz", + "com", + "dr", + "edu", + "gen", + "gov", + "info", + "k12", + "kep", + "mil", + "name", + "nc", + "net", + "org", + "pol", + "tel", + "tv", + "web", + "blogspot", + "gov", + "ybo", + "aero", + "biz", + "co", + "com", + "coop", + "edu", + "gov", + "info", + "int", + "jobs", + "mobi", + "museum", + "name", + "net", + "org", + "pro", + "travel", + "better-than", + "dyndns", + "on-the-web", + "worse-than", + "blogspot", + "club", + "com", + "ebiz", + "edu", + "game", + "gov", + "idv", + "mil", + "net", + "nym", + "org", + "url", + "xn--czrw28b", + "xn--uc0atv", + "xn--zf0ao64a", + "mymailer", + "ac", + "co", + "go", + "hotel", + "info", + "me", + "mil", + "mobi", + "ne", + "or", + "sc", + "tv", + "biz", + "cc", + "cherkassy", + "cherkasy", + "chernigov", + "chernihiv", + "chernivtsi", + "chernovtsy", + "ck", + "cn", + "co", + "com", + "cr", + "crimea", + "cv", + "dn", + "dnepropetrovsk", + "dnipropetrovsk", + "dominic", + "donetsk", + "dp", + "edu", + "gov", + "if", + "in", + "inf", + "ivano-frankivsk", + "kh", + "kharkiv", + "kharkov", + "kherson", + "khmelnitskiy", + "khmelnytskyi", + "kiev", + "kirovograd", + "km", + "kr", + "krym", + "ks", + "kv", + "kyiv", + "lg", + "lt", + "ltd", + "lugansk", + "lutsk", + "lv", + "lviv", + "mk", + "mykolaiv", + "net", + "nikolaev", + "od", + "odesa", + "odessa", + "org", + "pl", + "poltava", + "pp", + "rivne", + "rovno", + "rv", + "sb", + "sebastopol", + "sevastopol", + "sm", + "sumy", + "te", + "ternopil", + "uz", + "uzhgorod", + "vinnica", + "vinnytsia", + "vn", + "volyn", + "yalta", + "zaporizhzhe", + "zaporizhzhia", + "zhitomir", + "zhytomyr", + "zp", + "zt", + "ac", + "blogspot", + "co", + "com", + "go", + "ne", + "nom", + "or", + "org", + "sc", + "ac", + "barsy", + "co", + "gov", + "ltd", + "me", + "net", + "nhs", + "org", + "plc", + "police", + "sch", + "barsy", + "barsyonline", + "blogspot", + "gwiddle", + "nh-serv", + "no-ip", + "wellbeingzone", + "homeoffice", + "service", + "glug", + "lug", + "lugs", + "ak", + "al", + "ar", + "as", + "az", + "ca", + "cloudns", + "co", + "ct", + "dc", + "de", + "dni", + "drud", + "fed", + "fl", + "freeddns", + "ga", + "golffan", + "gu", + "hi", + "ia", + "id", + "il", + "in", + "is-by", + "isa", + "kids", + "ks", + "ky", + "la", + "land-4-sale", + "ma", + "md", + "me", + "mi", + "mn", + "mo", + "ms", + "mt", + "nc", + "nd", + "ne", + "nh", + "nj", + "nm", + "noip", + "nsn", + "nv", + "ny", + "oh", + "ok", + "or", + "pa", + "pointto", + "pr", + "ri", + "sc", + "sd", + "stuff-4-sale", + "tn", + "tx", + "ut", + "va", + "vi", + "vt", + "wa", + "wi", + "wv", + "wy", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "chtr", + "paroch", + "pvt", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "ann-arbor", + "cc", + "cog", + "dst", + "eaton", + "gen", + "k12", + "lib", + "mus", + "tec", + "washtenaw", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "cc", + "k12", + "lib", + "com", + "edu", + "gub", + "mil", + "net", + "nom", + "org", + "blogspot", + "co", + "com", + "net", + "org", + "com", + "edu", + "gov", + "mil", + "net", + "nom", + "org", + "arts", + "co", + "com", + "e12", + "edu", + "firm", + "gob", + "gov", + "info", + "int", + "mil", + "net", + "org", + "rec", + "store", + "tec", + "web", + "nom", + "co", + "com", + "k12", + "net", + "org", + "ac", + "biz", + "blogspot", + "com", + "edu", + "gov", + "health", + "info", + "int", + "name", + "net", + "org", + "pro", + "com", + "edu", + "net", + "org", + "advisor", + "cloud66", + "com", + "dyndns", + "edu", + "gov", + "mypets", + "net", + "org", + "xn--80au", + "xn--90azh", + "xn--c1avg", + "xn--d1at", + "xn--o1ac", + "xn--o1ach", + "xn--55qx5d", + "xn--gmqw5a", + "xn--mxtq1m", + "xn--od0alg", + "xn--uc0atv", + "xn--wcvs22d", + "xn--12c1fe0br", + "xn--12cfi8ixb8l", + "xn--12co0c3b4eva", + "xn--h3cuzk1di", + "xn--m3ch0j3a", + "xn--o3cyx2a", + "blogsite", + "crafting", + "fhapp", + "zapto", + "ac", + "agric", + "alt", + "co", + "edu", + "gov", + "grondar", + "law", + "mil", + "net", + "ngo", + "nis", + "nom", + "org", + "school", + "tm", + "web", + "blogspot", + "ac", + "biz", + "co", + "com", + "edu", + "gov", + "info", + "mil", + "net", + "org", + "sch", + "lima", + "triton", + "ac", + "co", + "gov", + "mil", + "org", +} diff --git a/api/vendor/golang.org/x/net/route/address.go b/api/vendor/golang.org/x/net/route/address.go new file mode 100644 index 0000000..e6bfa39 --- /dev/null +++ b/api/vendor/golang.org/x/net/route/address.go @@ -0,0 +1,425 @@ +// 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. + +// +build darwin dragonfly freebsd netbsd openbsd + +package route + +import "runtime" + +// An Addr represents an address associated with packet routing. +type Addr interface { + // Family returns an address family. + Family() int +} + +// A LinkAddr represents a link-layer address. +type LinkAddr struct { + Index int // interface index when attached + Name string // interface name when attached + Addr []byte // link-layer address when attached +} + +// Family implements the Family method of Addr interface. +func (a *LinkAddr) Family() int { return sysAF_LINK } + +func (a *LinkAddr) lenAndSpace() (int, int) { + l := 8 + len(a.Name) + len(a.Addr) + return l, roundup(l) +} + +func (a *LinkAddr) marshal(b []byte) (int, error) { + l, ll := a.lenAndSpace() + if len(b) < ll { + return 0, errShortBuffer + } + nlen, alen := len(a.Name), len(a.Addr) + if nlen > 255 || alen > 255 { + return 0, errInvalidAddr + } + b[0] = byte(l) + b[1] = sysAF_LINK + if a.Index > 0 { + nativeEndian.PutUint16(b[2:4], uint16(a.Index)) + } + data := b[8:] + if nlen > 0 { + b[5] = byte(nlen) + copy(data[:nlen], a.Addr) + data = data[nlen:] + } + if alen > 0 { + b[6] = byte(alen) + copy(data[:alen], a.Name) + data = data[alen:] + } + return ll, nil +} + +func parseLinkAddr(b []byte) (Addr, error) { + if len(b) < 8 { + return nil, errInvalidAddr + } + _, a, err := parseKernelLinkAddr(sysAF_LINK, b[4:]) + if err != nil { + return nil, err + } + a.(*LinkAddr).Index = int(nativeEndian.Uint16(b[2:4])) + return a, nil +} + +// parseKernelLinkAddr parses b as a link-layer address in +// conventional BSD kernel form. +func parseKernelLinkAddr(_ int, b []byte) (int, Addr, error) { + // The encoding looks like the following: + // +----------------------------+ + // | Type (1 octet) | + // +----------------------------+ + // | Name length (1 octet) | + // +----------------------------+ + // | Address length (1 octet) | + // +----------------------------+ + // | Selector length (1 octet) | + // +----------------------------+ + // | Data (variable) | + // +----------------------------+ + // + // On some platforms, all-bit-one of length field means "don't + // care". + nlen, alen, slen := int(b[1]), int(b[2]), int(b[3]) + if nlen == 0xff { + nlen = 0 + } + if alen == 0xff { + alen = 0 + } + if slen == 0xff { + slen = 0 + } + l := 4 + nlen + alen + slen + if len(b) < l { + return 0, nil, errInvalidAddr + } + data := b[4:] + var name string + var addr []byte + if nlen > 0 { + name = string(data[:nlen]) + data = data[nlen:] + } + if alen > 0 { + addr = data[:alen] + data = data[alen:] + } + return l, &LinkAddr{Name: name, Addr: addr}, nil +} + +// An Inet4Addr represents an internet address for IPv4. +type Inet4Addr struct { + IP [4]byte // IP address +} + +// Family implements the Family method of Addr interface. +func (a *Inet4Addr) Family() int { return sysAF_INET } + +func (a *Inet4Addr) lenAndSpace() (int, int) { + return sizeofSockaddrInet, roundup(sizeofSockaddrInet) +} + +func (a *Inet4Addr) marshal(b []byte) (int, error) { + l, ll := a.lenAndSpace() + if len(b) < ll { + return 0, errShortBuffer + } + b[0] = byte(l) + b[1] = sysAF_INET + copy(b[4:8], a.IP[:]) + return ll, nil +} + +// An Inet6Addr represents an internet address for IPv6. +type Inet6Addr struct { + IP [16]byte // IP address + ZoneID int // zone identifier +} + +// Family implements the Family method of Addr interface. +func (a *Inet6Addr) Family() int { return sysAF_INET6 } + +func (a *Inet6Addr) lenAndSpace() (int, int) { + return sizeofSockaddrInet6, roundup(sizeofSockaddrInet6) +} + +func (a *Inet6Addr) marshal(b []byte) (int, error) { + l, ll := a.lenAndSpace() + if len(b) < ll { + return 0, errShortBuffer + } + b[0] = byte(l) + b[1] = sysAF_INET6 + copy(b[8:24], a.IP[:]) + if a.ZoneID > 0 { + nativeEndian.PutUint32(b[24:28], uint32(a.ZoneID)) + } + return ll, nil +} + +// parseInetAddr parses b as an internet address for IPv4 or IPv6. +func parseInetAddr(af int, b []byte) (Addr, error) { + switch af { + case sysAF_INET: + if len(b) < sizeofSockaddrInet { + return nil, errInvalidAddr + } + a := &Inet4Addr{} + copy(a.IP[:], b[4:8]) + return a, nil + case sysAF_INET6: + if len(b) < sizeofSockaddrInet6 { + return nil, errInvalidAddr + } + a := &Inet6Addr{ZoneID: int(nativeEndian.Uint32(b[24:28]))} + copy(a.IP[:], b[8:24]) + if a.IP[0] == 0xfe && a.IP[1]&0xc0 == 0x80 || a.IP[0] == 0xff && (a.IP[1]&0x0f == 0x01 || a.IP[1]&0x0f == 0x02) { + // KAME based IPv6 protocol stack usually + // embeds the interface index in the + // interface-local or link-local address as + // the kernel-internal form. + id := int(bigEndian.Uint16(a.IP[2:4])) + if id != 0 { + a.ZoneID = id + a.IP[2], a.IP[3] = 0, 0 + } + } + return a, nil + default: + return nil, errInvalidAddr + } +} + +// parseKernelInetAddr parses b as an internet address in conventional +// BSD kernel form. +func parseKernelInetAddr(af int, b []byte) (int, Addr, error) { + // The encoding looks similar to the NLRI encoding. + // +----------------------------+ + // | Length (1 octet) | + // +----------------------------+ + // | Address prefix (variable) | + // +----------------------------+ + // + // The differences between the kernel form and the NLRI + // encoding are: + // + // - The length field of the kernel form indicates the prefix + // length in bytes, not in bits + // + // - In the kernel form, zero value of the length field + // doesn't mean 0.0.0.0/0 or ::/0 + // + // - The kernel form appends leading bytes to the prefix field + // to make the tuple to be conformed with + // the routing message boundary + l := int(b[0]) + if runtime.GOOS == "darwin" { + // On Darwn, an address in the kernel form is also + // used as a message filler. + if l == 0 || len(b) > roundup(l) { + l = roundup(l) + } + } else { + l = roundup(l) + } + if len(b) < l { + return 0, nil, errInvalidAddr + } + // Don't reorder case expressions. + // The case expressions for IPv6 must come first. + const ( + off4 = 4 // offset of in_addr + off6 = 8 // offset of in6_addr + ) + switch { + case b[0] == sizeofSockaddrInet6: + a := &Inet6Addr{} + copy(a.IP[:], b[off6:off6+16]) + return int(b[0]), a, nil + case af == sysAF_INET6: + a := &Inet6Addr{} + if l-1 < off6 { + copy(a.IP[:], b[1:l]) + } else { + copy(a.IP[:], b[l-off6:l]) + } + return int(b[0]), a, nil + case b[0] == sizeofSockaddrInet: + a := &Inet4Addr{} + copy(a.IP[:], b[off4:off4+4]) + return int(b[0]), a, nil + default: // an old fashion, AF_UNSPEC or unknown means AF_INET + a := &Inet4Addr{} + if l-1 < off4 { + copy(a.IP[:], b[1:l]) + } else { + copy(a.IP[:], b[l-off4:l]) + } + return int(b[0]), a, nil + } +} + +// A DefaultAddr represents an address of various operating +// system-specific features. +type DefaultAddr struct { + af int + Raw []byte // raw format of address +} + +// Family implements the Family method of Addr interface. +func (a *DefaultAddr) Family() int { return a.af } + +func (a *DefaultAddr) lenAndSpace() (int, int) { + l := len(a.Raw) + return l, roundup(l) +} + +func (a *DefaultAddr) marshal(b []byte) (int, error) { + l, ll := a.lenAndSpace() + if len(b) < ll { + return 0, errShortBuffer + } + if l > 255 { + return 0, errInvalidAddr + } + b[1] = byte(l) + copy(b[:l], a.Raw) + return ll, nil +} + +func parseDefaultAddr(b []byte) (Addr, error) { + if len(b) < 2 || len(b) < int(b[0]) { + return nil, errInvalidAddr + } + a := &DefaultAddr{af: int(b[1]), Raw: b[:b[0]]} + return a, nil +} + +func addrsSpace(as []Addr) int { + var l int + for _, a := range as { + switch a := a.(type) { + case *LinkAddr: + _, ll := a.lenAndSpace() + l += ll + case *Inet4Addr: + _, ll := a.lenAndSpace() + l += ll + case *Inet6Addr: + _, ll := a.lenAndSpace() + l += ll + case *DefaultAddr: + _, ll := a.lenAndSpace() + l += ll + } + } + return l +} + +// marshalAddrs marshals as and returns a bitmap indicating which +// address is stored in b. +func marshalAddrs(b []byte, as []Addr) (uint, error) { + var attrs uint + for i, a := range as { + switch a := a.(type) { + case *LinkAddr: + l, err := a.marshal(b) + if err != nil { + return 0, err + } + b = b[l:] + attrs |= 1 << uint(i) + case *Inet4Addr: + l, err := a.marshal(b) + if err != nil { + return 0, err + } + b = b[l:] + attrs |= 1 << uint(i) + case *Inet6Addr: + l, err := a.marshal(b) + if err != nil { + return 0, err + } + b = b[l:] + attrs |= 1 << uint(i) + case *DefaultAddr: + l, err := a.marshal(b) + if err != nil { + return 0, err + } + b = b[l:] + attrs |= 1 << uint(i) + } + } + return attrs, nil +} + +func parseAddrs(attrs uint, fn func(int, []byte) (int, Addr, error), b []byte) ([]Addr, error) { + var as [sysRTAX_MAX]Addr + af := int(sysAF_UNSPEC) + for i := uint(0); i < sysRTAX_MAX && len(b) >= roundup(0); i++ { + if attrs&(1<> 8) +} + +func (binaryLittleEndian) 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 (binaryLittleEndian) PutUint32(b []byte, v uint32) { + _ = b[3] // early bounds check to guarantee safety of writes below + b[0] = byte(v) + b[1] = byte(v >> 8) + b[2] = byte(v >> 16) + b[3] = byte(v >> 24) +} + +func (binaryLittleEndian) 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 +} + +type binaryBigEndian struct{} + +func (binaryBigEndian) Uint16(b []byte) uint16 { + _ = b[1] // bounds check hint to compiler; see golang.org/issue/14808 + return uint16(b[1]) | uint16(b[0])<<8 +} + +func (binaryBigEndian) PutUint16(b []byte, v uint16) { + _ = b[1] // early bounds check to guarantee safety of writes below + b[0] = byte(v >> 8) + b[1] = byte(v) +} + +func (binaryBigEndian) 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 (binaryBigEndian) PutUint32(b []byte, v uint32) { + _ = b[3] // early bounds check to guarantee safety of writes below + b[0] = byte(v >> 24) + b[1] = byte(v >> 16) + b[2] = byte(v >> 8) + b[3] = byte(v) +} + +func (binaryBigEndian) 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 +} diff --git a/api/vendor/golang.org/x/net/route/defs_darwin.go b/api/vendor/golang.org/x/net/route/defs_darwin.go new file mode 100644 index 0000000..e771644 --- /dev/null +++ b/api/vendor/golang.org/x/net/route/defs_darwin.go @@ -0,0 +1,114 @@ +// 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. + +// +build ignore + +package route + +/* +#include +#include + +#include +#include +#include + +#include +*/ +import "C" + +const ( + sysAF_UNSPEC = C.AF_UNSPEC + sysAF_INET = C.AF_INET + sysAF_ROUTE = C.AF_ROUTE + sysAF_LINK = C.AF_LINK + sysAF_INET6 = C.AF_INET6 + + sysSOCK_RAW = C.SOCK_RAW + + sysNET_RT_DUMP = C.NET_RT_DUMP + sysNET_RT_FLAGS = C.NET_RT_FLAGS + sysNET_RT_IFLIST = C.NET_RT_IFLIST + sysNET_RT_STAT = C.NET_RT_STAT + sysNET_RT_TRASH = C.NET_RT_TRASH + sysNET_RT_IFLIST2 = C.NET_RT_IFLIST2 + sysNET_RT_DUMP2 = C.NET_RT_DUMP2 + sysNET_RT_MAXID = C.NET_RT_MAXID +) + +const ( + sysCTL_MAXNAME = C.CTL_MAXNAME + + sysCTL_UNSPEC = C.CTL_UNSPEC + sysCTL_KERN = C.CTL_KERN + sysCTL_VM = C.CTL_VM + sysCTL_VFS = C.CTL_VFS + sysCTL_NET = C.CTL_NET + sysCTL_DEBUG = C.CTL_DEBUG + sysCTL_HW = C.CTL_HW + sysCTL_MACHDEP = C.CTL_MACHDEP + sysCTL_USER = C.CTL_USER + sysCTL_MAXID = C.CTL_MAXID +) + +const ( + sysRTM_VERSION = C.RTM_VERSION + + sysRTM_ADD = C.RTM_ADD + sysRTM_DELETE = C.RTM_DELETE + sysRTM_CHANGE = C.RTM_CHANGE + sysRTM_GET = C.RTM_GET + sysRTM_LOSING = C.RTM_LOSING + sysRTM_REDIRECT = C.RTM_REDIRECT + sysRTM_MISS = C.RTM_MISS + sysRTM_LOCK = C.RTM_LOCK + sysRTM_OLDADD = C.RTM_OLDADD + sysRTM_OLDDEL = C.RTM_OLDDEL + sysRTM_RESOLVE = C.RTM_RESOLVE + sysRTM_NEWADDR = C.RTM_NEWADDR + sysRTM_DELADDR = C.RTM_DELADDR + sysRTM_IFINFO = C.RTM_IFINFO + sysRTM_NEWMADDR = C.RTM_NEWMADDR + sysRTM_DELMADDR = C.RTM_DELMADDR + sysRTM_IFINFO2 = C.RTM_IFINFO2 + sysRTM_NEWMADDR2 = C.RTM_NEWMADDR2 + sysRTM_GET2 = C.RTM_GET2 + + sysRTA_DST = C.RTA_DST + sysRTA_GATEWAY = C.RTA_GATEWAY + sysRTA_NETMASK = C.RTA_NETMASK + sysRTA_GENMASK = C.RTA_GENMASK + sysRTA_IFP = C.RTA_IFP + sysRTA_IFA = C.RTA_IFA + sysRTA_AUTHOR = C.RTA_AUTHOR + sysRTA_BRD = C.RTA_BRD + + sysRTAX_DST = C.RTAX_DST + sysRTAX_GATEWAY = C.RTAX_GATEWAY + sysRTAX_NETMASK = C.RTAX_NETMASK + sysRTAX_GENMASK = C.RTAX_GENMASK + sysRTAX_IFP = C.RTAX_IFP + sysRTAX_IFA = C.RTAX_IFA + sysRTAX_AUTHOR = C.RTAX_AUTHOR + sysRTAX_BRD = C.RTAX_BRD + sysRTAX_MAX = C.RTAX_MAX +) + +const ( + sizeofIfMsghdrDarwin15 = C.sizeof_struct_if_msghdr + sizeofIfaMsghdrDarwin15 = C.sizeof_struct_ifa_msghdr + sizeofIfmaMsghdrDarwin15 = C.sizeof_struct_ifma_msghdr + sizeofIfMsghdr2Darwin15 = C.sizeof_struct_if_msghdr2 + sizeofIfmaMsghdr2Darwin15 = C.sizeof_struct_ifma_msghdr2 + sizeofIfDataDarwin15 = C.sizeof_struct_if_data + sizeofIfData64Darwin15 = C.sizeof_struct_if_data64 + + sizeofRtMsghdrDarwin15 = C.sizeof_struct_rt_msghdr + sizeofRtMsghdr2Darwin15 = C.sizeof_struct_rt_msghdr2 + sizeofRtMetricsDarwin15 = C.sizeof_struct_rt_metrics + + sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 +) diff --git a/api/vendor/golang.org/x/net/route/defs_dragonfly.go b/api/vendor/golang.org/x/net/route/defs_dragonfly.go new file mode 100644 index 0000000..dd31de2 --- /dev/null +++ b/api/vendor/golang.org/x/net/route/defs_dragonfly.go @@ -0,0 +1,113 @@ +// 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. + +// +build ignore + +package route + +/* +#include +#include + +#include +#include +#include + +#include +*/ +import "C" + +const ( + sysAF_UNSPEC = C.AF_UNSPEC + sysAF_INET = C.AF_INET + sysAF_ROUTE = C.AF_ROUTE + sysAF_LINK = C.AF_LINK + sysAF_INET6 = C.AF_INET6 + + sysSOCK_RAW = C.SOCK_RAW + + sysNET_RT_DUMP = C.NET_RT_DUMP + sysNET_RT_FLAGS = C.NET_RT_FLAGS + sysNET_RT_IFLIST = C.NET_RT_IFLIST + sysNET_RT_MAXID = C.NET_RT_MAXID +) + +const ( + sysCTL_MAXNAME = C.CTL_MAXNAME + + sysCTL_UNSPEC = C.CTL_UNSPEC + sysCTL_KERN = C.CTL_KERN + sysCTL_VM = C.CTL_VM + sysCTL_VFS = C.CTL_VFS + sysCTL_NET = C.CTL_NET + sysCTL_DEBUG = C.CTL_DEBUG + sysCTL_HW = C.CTL_HW + sysCTL_MACHDEP = C.CTL_MACHDEP + sysCTL_USER = C.CTL_USER + sysCTL_P1003_1B = C.CTL_P1003_1B + sysCTL_LWKT = C.CTL_LWKT + sysCTL_MAXID = C.CTL_MAXID +) + +const ( + sysRTM_VERSION = C.RTM_VERSION + + sysRTM_ADD = C.RTM_ADD + sysRTM_DELETE = C.RTM_DELETE + sysRTM_CHANGE = C.RTM_CHANGE + sysRTM_GET = C.RTM_GET + sysRTM_LOSING = C.RTM_LOSING + sysRTM_REDIRECT = C.RTM_REDIRECT + sysRTM_MISS = C.RTM_MISS + sysRTM_LOCK = C.RTM_LOCK + sysRTM_OLDADD = C.RTM_OLDADD + sysRTM_OLDDEL = C.RTM_OLDDEL + sysRTM_RESOLVE = C.RTM_RESOLVE + sysRTM_NEWADDR = C.RTM_NEWADDR + sysRTM_DELADDR = C.RTM_DELADDR + sysRTM_IFINFO = C.RTM_IFINFO + sysRTM_NEWMADDR = C.RTM_NEWMADDR + sysRTM_DELMADDR = C.RTM_DELMADDR + sysRTM_IFANNOUNCE = C.RTM_IFANNOUNCE + sysRTM_IEEE80211 = C.RTM_IEEE80211 + + sysRTA_DST = C.RTA_DST + sysRTA_GATEWAY = C.RTA_GATEWAY + sysRTA_NETMASK = C.RTA_NETMASK + sysRTA_GENMASK = C.RTA_GENMASK + sysRTA_IFP = C.RTA_IFP + sysRTA_IFA = C.RTA_IFA + sysRTA_AUTHOR = C.RTA_AUTHOR + sysRTA_BRD = C.RTA_BRD + sysRTA_MPLS1 = C.RTA_MPLS1 + sysRTA_MPLS2 = C.RTA_MPLS2 + sysRTA_MPLS3 = C.RTA_MPLS3 + + sysRTAX_DST = C.RTAX_DST + sysRTAX_GATEWAY = C.RTAX_GATEWAY + sysRTAX_NETMASK = C.RTAX_NETMASK + sysRTAX_GENMASK = C.RTAX_GENMASK + sysRTAX_IFP = C.RTAX_IFP + sysRTAX_IFA = C.RTAX_IFA + sysRTAX_AUTHOR = C.RTAX_AUTHOR + sysRTAX_BRD = C.RTAX_BRD + sysRTAX_MPLS1 = C.RTAX_MPLS1 + sysRTAX_MPLS2 = C.RTAX_MPLS2 + sysRTAX_MPLS3 = C.RTAX_MPLS3 + sysRTAX_MAX = C.RTAX_MAX +) + +const ( + sizeofIfMsghdrDragonFlyBSD4 = C.sizeof_struct_if_msghdr + sizeofIfaMsghdrDragonFlyBSD4 = C.sizeof_struct_ifa_msghdr + sizeofIfmaMsghdrDragonFlyBSD4 = C.sizeof_struct_ifma_msghdr + sizeofIfAnnouncemsghdrDragonFlyBSD4 = C.sizeof_struct_if_announcemsghdr + + sizeofRtMsghdrDragonFlyBSD4 = C.sizeof_struct_rt_msghdr + sizeofRtMetricsDragonFlyBSD4 = C.sizeof_struct_rt_metrics + + sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 +) diff --git a/api/vendor/golang.org/x/net/route/defs_freebsd.go b/api/vendor/golang.org/x/net/route/defs_freebsd.go new file mode 100644 index 0000000..d95594d --- /dev/null +++ b/api/vendor/golang.org/x/net/route/defs_freebsd.go @@ -0,0 +1,337 @@ +// 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. + +// +build ignore + +package route + +/* +#include +#include + +#include +#include +#include + +#include + +struct if_data_freebsd7 { + u_char ifi_type; + u_char ifi_physical; + u_char ifi_addrlen; + u_char ifi_hdrlen; + u_char ifi_link_state; + u_char ifi_spare_char1; + u_char ifi_spare_char2; + u_char ifi_datalen; + u_long ifi_mtu; + u_long ifi_metric; + u_long ifi_baudrate; + u_long ifi_ipackets; + u_long ifi_ierrors; + u_long ifi_opackets; + u_long ifi_oerrors; + u_long ifi_collisions; + u_long ifi_ibytes; + u_long ifi_obytes; + u_long ifi_imcasts; + u_long ifi_omcasts; + u_long ifi_iqdrops; + u_long ifi_noproto; + u_long ifi_hwassist; + time_t __ifi_epoch; + struct timeval __ifi_lastchange; +}; + +struct if_data_freebsd8 { + u_char ifi_type; + u_char ifi_physical; + u_char ifi_addrlen; + u_char ifi_hdrlen; + u_char ifi_link_state; + u_char ifi_spare_char1; + u_char ifi_spare_char2; + u_char ifi_datalen; + u_long ifi_mtu; + u_long ifi_metric; + u_long ifi_baudrate; + u_long ifi_ipackets; + u_long ifi_ierrors; + u_long ifi_opackets; + u_long ifi_oerrors; + u_long ifi_collisions; + u_long ifi_ibytes; + u_long ifi_obytes; + u_long ifi_imcasts; + u_long ifi_omcasts; + u_long ifi_iqdrops; + u_long ifi_noproto; + u_long ifi_hwassist; + time_t __ifi_epoch; + struct timeval __ifi_lastchange; +}; + +struct if_data_freebsd9 { + u_char ifi_type; + u_char ifi_physical; + u_char ifi_addrlen; + u_char ifi_hdrlen; + u_char ifi_link_state; + u_char ifi_spare_char1; + u_char ifi_spare_char2; + u_char ifi_datalen; + u_long ifi_mtu; + u_long ifi_metric; + u_long ifi_baudrate; + u_long ifi_ipackets; + u_long ifi_ierrors; + u_long ifi_opackets; + u_long ifi_oerrors; + u_long ifi_collisions; + u_long ifi_ibytes; + u_long ifi_obytes; + u_long ifi_imcasts; + u_long ifi_omcasts; + u_long ifi_iqdrops; + u_long ifi_noproto; + u_long ifi_hwassist; + time_t __ifi_epoch; + struct timeval __ifi_lastchange; +}; + +struct if_data_freebsd10 { + u_char ifi_type; + u_char ifi_physical; + u_char ifi_addrlen; + u_char ifi_hdrlen; + u_char ifi_link_state; + u_char ifi_vhid; + u_char ifi_baudrate_pf; + u_char ifi_datalen; + u_long ifi_mtu; + u_long ifi_metric; + u_long ifi_baudrate; + u_long ifi_ipackets; + u_long ifi_ierrors; + u_long ifi_opackets; + u_long ifi_oerrors; + u_long ifi_collisions; + u_long ifi_ibytes; + u_long ifi_obytes; + u_long ifi_imcasts; + u_long ifi_omcasts; + u_long ifi_iqdrops; + u_long ifi_noproto; + uint64_t ifi_hwassist; + time_t __ifi_epoch; + struct timeval __ifi_lastchange; +}; + +struct if_data_freebsd11 { + uint8_t ifi_type; + uint8_t ifi_physical; + uint8_t ifi_addrlen; + uint8_t ifi_hdrlen; + uint8_t ifi_link_state; + uint8_t ifi_vhid; + uint16_t ifi_datalen; + uint32_t ifi_mtu; + uint32_t ifi_metric; + uint64_t ifi_baudrate; + uint64_t ifi_ipackets; + uint64_t ifi_ierrors; + uint64_t ifi_opackets; + uint64_t ifi_oerrors; + uint64_t ifi_collisions; + uint64_t ifi_ibytes; + uint64_t ifi_obytes; + uint64_t ifi_imcasts; + uint64_t ifi_omcasts; + uint64_t ifi_iqdrops; + uint64_t ifi_oqdrops; + uint64_t ifi_noproto; + uint64_t ifi_hwassist; + union { + time_t tt; + uint64_t ph; + } __ifi_epoch; + union { + struct timeval tv; + struct { + uint64_t ph1; + uint64_t ph2; + } ph; + } __ifi_lastchange; +}; + +struct if_msghdr_freebsd7 { + u_short ifm_msglen; + u_char ifm_version; + u_char ifm_type; + int ifm_addrs; + int ifm_flags; + u_short ifm_index; + struct if_data_freebsd7 ifm_data; +}; + +struct if_msghdr_freebsd8 { + u_short ifm_msglen; + u_char ifm_version; + u_char ifm_type; + int ifm_addrs; + int ifm_flags; + u_short ifm_index; + struct if_data_freebsd8 ifm_data; +}; + +struct if_msghdr_freebsd9 { + u_short ifm_msglen; + u_char ifm_version; + u_char ifm_type; + int ifm_addrs; + int ifm_flags; + u_short ifm_index; + struct if_data_freebsd9 ifm_data; +}; + +struct if_msghdr_freebsd10 { + u_short ifm_msglen; + u_char ifm_version; + u_char ifm_type; + int ifm_addrs; + int ifm_flags; + u_short ifm_index; + struct if_data_freebsd10 ifm_data; +}; + +struct if_msghdr_freebsd11 { + u_short ifm_msglen; + u_char ifm_version; + u_char ifm_type; + int ifm_addrs; + int ifm_flags; + u_short ifm_index; + struct if_data_freebsd11 ifm_data; +}; +*/ +import "C" + +const ( + sysAF_UNSPEC = C.AF_UNSPEC + sysAF_INET = C.AF_INET + sysAF_ROUTE = C.AF_ROUTE + sysAF_LINK = C.AF_LINK + sysAF_INET6 = C.AF_INET6 + + sysSOCK_RAW = C.SOCK_RAW + + sysNET_RT_DUMP = C.NET_RT_DUMP + sysNET_RT_FLAGS = C.NET_RT_FLAGS + sysNET_RT_IFLIST = C.NET_RT_IFLIST + sysNET_RT_IFMALIST = C.NET_RT_IFMALIST + sysNET_RT_IFLISTL = C.NET_RT_IFLISTL +) + +const ( + sysCTL_MAXNAME = C.CTL_MAXNAME + + sysCTL_UNSPEC = C.CTL_UNSPEC + sysCTL_KERN = C.CTL_KERN + sysCTL_VM = C.CTL_VM + sysCTL_VFS = C.CTL_VFS + sysCTL_NET = C.CTL_NET + sysCTL_DEBUG = C.CTL_DEBUG + sysCTL_HW = C.CTL_HW + sysCTL_MACHDEP = C.CTL_MACHDEP + sysCTL_USER = C.CTL_USER + sysCTL_P1003_1B = C.CTL_P1003_1B +) + +const ( + sysRTM_VERSION = C.RTM_VERSION + + sysRTM_ADD = C.RTM_ADD + sysRTM_DELETE = C.RTM_DELETE + sysRTM_CHANGE = C.RTM_CHANGE + sysRTM_GET = C.RTM_GET + sysRTM_LOSING = C.RTM_LOSING + sysRTM_REDIRECT = C.RTM_REDIRECT + sysRTM_MISS = C.RTM_MISS + sysRTM_LOCK = C.RTM_LOCK + sysRTM_RESOLVE = C.RTM_RESOLVE + sysRTM_NEWADDR = C.RTM_NEWADDR + sysRTM_DELADDR = C.RTM_DELADDR + sysRTM_IFINFO = C.RTM_IFINFO + sysRTM_NEWMADDR = C.RTM_NEWMADDR + sysRTM_DELMADDR = C.RTM_DELMADDR + sysRTM_IFANNOUNCE = C.RTM_IFANNOUNCE + sysRTM_IEEE80211 = C.RTM_IEEE80211 + + sysRTA_DST = C.RTA_DST + sysRTA_GATEWAY = C.RTA_GATEWAY + sysRTA_NETMASK = C.RTA_NETMASK + sysRTA_GENMASK = C.RTA_GENMASK + sysRTA_IFP = C.RTA_IFP + sysRTA_IFA = C.RTA_IFA + sysRTA_AUTHOR = C.RTA_AUTHOR + sysRTA_BRD = C.RTA_BRD + + sysRTAX_DST = C.RTAX_DST + sysRTAX_GATEWAY = C.RTAX_GATEWAY + sysRTAX_NETMASK = C.RTAX_NETMASK + sysRTAX_GENMASK = C.RTAX_GENMASK + sysRTAX_IFP = C.RTAX_IFP + sysRTAX_IFA = C.RTAX_IFA + sysRTAX_AUTHOR = C.RTAX_AUTHOR + sysRTAX_BRD = C.RTAX_BRD + sysRTAX_MAX = C.RTAX_MAX +) + +const ( + sizeofIfMsghdrlFreeBSD10 = C.sizeof_struct_if_msghdrl + sizeofIfaMsghdrFreeBSD10 = C.sizeof_struct_ifa_msghdr + sizeofIfaMsghdrlFreeBSD10 = C.sizeof_struct_ifa_msghdrl + sizeofIfmaMsghdrFreeBSD10 = C.sizeof_struct_ifma_msghdr + sizeofIfAnnouncemsghdrFreeBSD10 = C.sizeof_struct_if_announcemsghdr + + sizeofRtMsghdrFreeBSD10 = C.sizeof_struct_rt_msghdr + sizeofRtMetricsFreeBSD10 = C.sizeof_struct_rt_metrics + + sizeofIfMsghdrFreeBSD7 = C.sizeof_struct_if_msghdr_freebsd7 + sizeofIfMsghdrFreeBSD8 = C.sizeof_struct_if_msghdr_freebsd8 + sizeofIfMsghdrFreeBSD9 = C.sizeof_struct_if_msghdr_freebsd9 + sizeofIfMsghdrFreeBSD10 = C.sizeof_struct_if_msghdr_freebsd10 + sizeofIfMsghdrFreeBSD11 = C.sizeof_struct_if_msghdr_freebsd11 + + sizeofIfDataFreeBSD7 = C.sizeof_struct_if_data_freebsd7 + sizeofIfDataFreeBSD8 = C.sizeof_struct_if_data_freebsd8 + sizeofIfDataFreeBSD9 = C.sizeof_struct_if_data_freebsd9 + sizeofIfDataFreeBSD10 = C.sizeof_struct_if_data_freebsd10 + sizeofIfDataFreeBSD11 = C.sizeof_struct_if_data_freebsd11 + + sizeofIfMsghdrlFreeBSD10Emu = C.sizeof_struct_if_msghdrl + sizeofIfaMsghdrFreeBSD10Emu = C.sizeof_struct_ifa_msghdr + sizeofIfaMsghdrlFreeBSD10Emu = C.sizeof_struct_ifa_msghdrl + sizeofIfmaMsghdrFreeBSD10Emu = C.sizeof_struct_ifma_msghdr + sizeofIfAnnouncemsghdrFreeBSD10Emu = C.sizeof_struct_if_announcemsghdr + + sizeofRtMsghdrFreeBSD10Emu = C.sizeof_struct_rt_msghdr + sizeofRtMetricsFreeBSD10Emu = C.sizeof_struct_rt_metrics + + sizeofIfMsghdrFreeBSD7Emu = C.sizeof_struct_if_msghdr_freebsd7 + sizeofIfMsghdrFreeBSD8Emu = C.sizeof_struct_if_msghdr_freebsd8 + sizeofIfMsghdrFreeBSD9Emu = C.sizeof_struct_if_msghdr_freebsd9 + sizeofIfMsghdrFreeBSD10Emu = C.sizeof_struct_if_msghdr_freebsd10 + sizeofIfMsghdrFreeBSD11Emu = C.sizeof_struct_if_msghdr_freebsd11 + + sizeofIfDataFreeBSD7Emu = C.sizeof_struct_if_data_freebsd7 + sizeofIfDataFreeBSD8Emu = C.sizeof_struct_if_data_freebsd8 + sizeofIfDataFreeBSD9Emu = C.sizeof_struct_if_data_freebsd9 + sizeofIfDataFreeBSD10Emu = C.sizeof_struct_if_data_freebsd10 + sizeofIfDataFreeBSD11Emu = C.sizeof_struct_if_data_freebsd11 + + sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 +) diff --git a/api/vendor/golang.org/x/net/route/defs_netbsd.go b/api/vendor/golang.org/x/net/route/defs_netbsd.go new file mode 100644 index 0000000..b0abd54 --- /dev/null +++ b/api/vendor/golang.org/x/net/route/defs_netbsd.go @@ -0,0 +1,112 @@ +// 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. + +// +build ignore + +package route + +/* +#include +#include + +#include +#include +#include + +#include +*/ +import "C" + +const ( + sysAF_UNSPEC = C.AF_UNSPEC + sysAF_INET = C.AF_INET + sysAF_ROUTE = C.AF_ROUTE + sysAF_LINK = C.AF_LINK + sysAF_INET6 = C.AF_INET6 + + sysSOCK_RAW = C.SOCK_RAW + + sysNET_RT_DUMP = C.NET_RT_DUMP + sysNET_RT_FLAGS = C.NET_RT_FLAGS + sysNET_RT_IFLIST = C.NET_RT_IFLIST + sysNET_RT_MAXID = C.NET_RT_MAXID +) + +const ( + sysCTL_MAXNAME = C.CTL_MAXNAME + + sysCTL_UNSPEC = C.CTL_UNSPEC + sysCTL_KERN = C.CTL_KERN + sysCTL_VM = C.CTL_VM + sysCTL_VFS = C.CTL_VFS + sysCTL_NET = C.CTL_NET + sysCTL_DEBUG = C.CTL_DEBUG + sysCTL_HW = C.CTL_HW + sysCTL_MACHDEP = C.CTL_MACHDEP + sysCTL_USER = C.CTL_USER + sysCTL_DDB = C.CTL_DDB + sysCTL_PROC = C.CTL_PROC + sysCTL_VENDOR = C.CTL_VENDOR + sysCTL_EMUL = C.CTL_EMUL + sysCTL_SECURITY = C.CTL_SECURITY + sysCTL_MAXID = C.CTL_MAXID +) + +const ( + sysRTM_VERSION = C.RTM_VERSION + + sysRTM_ADD = C.RTM_ADD + sysRTM_DELETE = C.RTM_DELETE + sysRTM_CHANGE = C.RTM_CHANGE + sysRTM_GET = C.RTM_GET + sysRTM_LOSING = C.RTM_LOSING + sysRTM_REDIRECT = C.RTM_REDIRECT + sysRTM_MISS = C.RTM_MISS + sysRTM_LOCK = C.RTM_LOCK + sysRTM_OLDADD = C.RTM_OLDADD + sysRTM_OLDDEL = C.RTM_OLDDEL + sysRTM_RESOLVE = C.RTM_RESOLVE + sysRTM_NEWADDR = C.RTM_NEWADDR + sysRTM_DELADDR = C.RTM_DELADDR + sysRTM_IFANNOUNCE = C.RTM_IFANNOUNCE + sysRTM_IEEE80211 = C.RTM_IEEE80211 + sysRTM_SETGATE = C.RTM_SETGATE + sysRTM_LLINFO_UPD = C.RTM_LLINFO_UPD + sysRTM_IFINFO = C.RTM_IFINFO + sysRTM_CHGADDR = C.RTM_CHGADDR + + sysRTA_DST = C.RTA_DST + sysRTA_GATEWAY = C.RTA_GATEWAY + sysRTA_NETMASK = C.RTA_NETMASK + sysRTA_GENMASK = C.RTA_GENMASK + sysRTA_IFP = C.RTA_IFP + sysRTA_IFA = C.RTA_IFA + sysRTA_AUTHOR = C.RTA_AUTHOR + sysRTA_BRD = C.RTA_BRD + sysRTA_TAG = C.RTA_TAG + + sysRTAX_DST = C.RTAX_DST + sysRTAX_GATEWAY = C.RTAX_GATEWAY + sysRTAX_NETMASK = C.RTAX_NETMASK + sysRTAX_GENMASK = C.RTAX_GENMASK + sysRTAX_IFP = C.RTAX_IFP + sysRTAX_IFA = C.RTAX_IFA + sysRTAX_AUTHOR = C.RTAX_AUTHOR + sysRTAX_BRD = C.RTAX_BRD + sysRTAX_TAG = C.RTAX_TAG + sysRTAX_MAX = C.RTAX_MAX +) + +const ( + sizeofIfMsghdrNetBSD7 = C.sizeof_struct_if_msghdr + sizeofIfaMsghdrNetBSD7 = C.sizeof_struct_ifa_msghdr + sizeofIfAnnouncemsghdrNetBSD7 = C.sizeof_struct_if_announcemsghdr + + sizeofRtMsghdrNetBSD7 = C.sizeof_struct_rt_msghdr + sizeofRtMetricsNetBSD7 = C.sizeof_struct_rt_metrics + + sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 +) diff --git a/api/vendor/golang.org/x/net/route/defs_openbsd.go b/api/vendor/golang.org/x/net/route/defs_openbsd.go new file mode 100644 index 0000000..173bb5d --- /dev/null +++ b/api/vendor/golang.org/x/net/route/defs_openbsd.go @@ -0,0 +1,116 @@ +// 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. + +// +build ignore + +package route + +/* +#include +#include + +#include +#include +#include + +#include +*/ +import "C" + +const ( + sysAF_UNSPEC = C.AF_UNSPEC + sysAF_INET = C.AF_INET + sysAF_ROUTE = C.AF_ROUTE + sysAF_LINK = C.AF_LINK + sysAF_INET6 = C.AF_INET6 + + sysSOCK_RAW = C.SOCK_RAW + + sysNET_RT_DUMP = C.NET_RT_DUMP + sysNET_RT_FLAGS = C.NET_RT_FLAGS + sysNET_RT_IFLIST = C.NET_RT_IFLIST + sysNET_RT_STATS = C.NET_RT_STATS + sysNET_RT_TABLE = C.NET_RT_TABLE + sysNET_RT_IFNAMES = C.NET_RT_IFNAMES + sysNET_RT_MAXID = C.NET_RT_MAXID +) + +const ( + sysCTL_MAXNAME = C.CTL_MAXNAME + + sysCTL_UNSPEC = C.CTL_UNSPEC + sysCTL_KERN = C.CTL_KERN + sysCTL_VM = C.CTL_VM + sysCTL_FS = C.CTL_FS + sysCTL_NET = C.CTL_NET + sysCTL_DEBUG = C.CTL_DEBUG + sysCTL_HW = C.CTL_HW + sysCTL_MACHDEP = C.CTL_MACHDEP + sysCTL_DDB = C.CTL_DDB + sysCTL_VFS = C.CTL_VFS + sysCTL_MAXID = C.CTL_MAXID +) + +const ( + sysRTM_VERSION = C.RTM_VERSION + + sysRTM_ADD = C.RTM_ADD + sysRTM_DELETE = C.RTM_DELETE + sysRTM_CHANGE = C.RTM_CHANGE + sysRTM_GET = C.RTM_GET + sysRTM_LOSING = C.RTM_LOSING + sysRTM_REDIRECT = C.RTM_REDIRECT + sysRTM_MISS = C.RTM_MISS + sysRTM_LOCK = C.RTM_LOCK + sysRTM_RESOLVE = C.RTM_RESOLVE + sysRTM_NEWADDR = C.RTM_NEWADDR + sysRTM_DELADDR = C.RTM_DELADDR + sysRTM_IFINFO = C.RTM_IFINFO + sysRTM_IFANNOUNCE = C.RTM_IFANNOUNCE + sysRTM_DESYNC = C.RTM_DESYNC + sysRTM_INVALIDATE = C.RTM_INVALIDATE + sysRTM_BFD = C.RTM_BFD + sysRTM_PROPOSAL = C.RTM_PROPOSAL + + sysRTA_DST = C.RTA_DST + sysRTA_GATEWAY = C.RTA_GATEWAY + sysRTA_NETMASK = C.RTA_NETMASK + sysRTA_GENMASK = C.RTA_GENMASK + sysRTA_IFP = C.RTA_IFP + sysRTA_IFA = C.RTA_IFA + sysRTA_AUTHOR = C.RTA_AUTHOR + sysRTA_BRD = C.RTA_BRD + sysRTA_SRC = C.RTA_SRC + sysRTA_SRCMASK = C.RTA_SRCMASK + sysRTA_LABEL = C.RTA_LABEL + sysRTA_BFD = C.RTA_BFD + sysRTA_DNS = C.RTA_DNS + sysRTA_STATIC = C.RTA_STATIC + sysRTA_SEARCH = C.RTA_SEARCH + + sysRTAX_DST = C.RTAX_DST + sysRTAX_GATEWAY = C.RTAX_GATEWAY + sysRTAX_NETMASK = C.RTAX_NETMASK + sysRTAX_GENMASK = C.RTAX_GENMASK + sysRTAX_IFP = C.RTAX_IFP + sysRTAX_IFA = C.RTAX_IFA + sysRTAX_AUTHOR = C.RTAX_AUTHOR + sysRTAX_BRD = C.RTAX_BRD + sysRTAX_SRC = C.RTAX_SRC + sysRTAX_SRCMASK = C.RTAX_SRCMASK + sysRTAX_LABEL = C.RTAX_LABEL + sysRTAX_BFD = C.RTAX_BFD + sysRTAX_DNS = C.RTAX_DNS + sysRTAX_STATIC = C.RTAX_STATIC + sysRTAX_SEARCH = C.RTAX_SEARCH + sysRTAX_MAX = C.RTAX_MAX +) + +const ( + sizeofRtMsghdr = C.sizeof_struct_rt_msghdr + + sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 +) diff --git a/api/vendor/golang.org/x/net/route/interface.go b/api/vendor/golang.org/x/net/route/interface.go new file mode 100644 index 0000000..854906d --- /dev/null +++ b/api/vendor/golang.org/x/net/route/interface.go @@ -0,0 +1,64 @@ +// 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. + +// +build darwin dragonfly freebsd netbsd openbsd + +package route + +// An InterfaceMessage represents an interface message. +type InterfaceMessage struct { + Version int // message version + Type int // message type + Flags int // interface flags + Index int // interface index + Name string // interface name + Addrs []Addr // addresses + + extOff int // offset of header extension + raw []byte // raw message +} + +// An InterfaceAddrMessage represents an interface address message. +type InterfaceAddrMessage struct { + Version int // message version + Type int // message type + Flags int // interface flags + Index int // interface index + Addrs []Addr // addresses + + raw []byte // raw message +} + +// Sys implements the Sys method of Message interface. +func (m *InterfaceAddrMessage) Sys() []Sys { return nil } + +// An InterfaceMulticastAddrMessage represents an interface multicast +// address message. +type InterfaceMulticastAddrMessage struct { + Version int // message version + Type int // messsage type + Flags int // interface flags + Index int // interface index + Addrs []Addr // addresses + + raw []byte // raw message +} + +// Sys implements the Sys method of Message interface. +func (m *InterfaceMulticastAddrMessage) Sys() []Sys { return nil } + +// An InterfaceAnnounceMessage represents an interface announcement +// message. +type InterfaceAnnounceMessage struct { + Version int // message version + Type int // message type + Index int // interface index + Name string // interface name + What int // what type of announcement + + raw []byte // raw message +} + +// Sys implements the Sys method of Message interface. +func (m *InterfaceAnnounceMessage) Sys() []Sys { return nil } diff --git a/api/vendor/golang.org/x/net/route/interface_announce.go b/api/vendor/golang.org/x/net/route/interface_announce.go new file mode 100644 index 0000000..520d657 --- /dev/null +++ b/api/vendor/golang.org/x/net/route/interface_announce.go @@ -0,0 +1,32 @@ +// 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. + +// +build dragonfly freebsd netbsd + +package route + +func (w *wireFormat) parseInterfaceAnnounceMessage(_ RIBType, b []byte) (Message, error) { + if len(b) < w.bodyOff { + return nil, errMessageTooShort + } + l := int(nativeEndian.Uint16(b[:2])) + if len(b) < l { + return nil, errInvalidMessage + } + m := &InterfaceAnnounceMessage{ + Version: int(b[2]), + Type: int(b[3]), + Index: int(nativeEndian.Uint16(b[4:6])), + What: int(nativeEndian.Uint16(b[22:24])), + raw: b[:l], + } + for i := 0; i < 16; i++ { + if b[6+i] != 0 { + continue + } + m.Name = string(b[6 : 6+i]) + break + } + return m, nil +} diff --git a/api/vendor/golang.org/x/net/route/interface_classic.go b/api/vendor/golang.org/x/net/route/interface_classic.go new file mode 100644 index 0000000..ac4e7a6 --- /dev/null +++ b/api/vendor/golang.org/x/net/route/interface_classic.go @@ -0,0 +1,66 @@ +// 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. + +// +build darwin dragonfly netbsd + +package route + +import "runtime" + +func (w *wireFormat) parseInterfaceMessage(_ RIBType, b []byte) (Message, error) { + if len(b) < w.bodyOff { + return nil, errMessageTooShort + } + l := int(nativeEndian.Uint16(b[:2])) + if len(b) < l { + return nil, errInvalidMessage + } + attrs := uint(nativeEndian.Uint32(b[4:8])) + if attrs&sysRTA_IFP == 0 { + return nil, nil + } + m := &InterfaceMessage{ + Version: int(b[2]), + Type: int(b[3]), + Addrs: make([]Addr, sysRTAX_MAX), + Flags: int(nativeEndian.Uint32(b[8:12])), + Index: int(nativeEndian.Uint16(b[12:14])), + extOff: w.extOff, + raw: b[:l], + } + a, err := parseLinkAddr(b[w.bodyOff:]) + if err != nil { + return nil, err + } + m.Addrs[sysRTAX_IFP] = a + m.Name = a.(*LinkAddr).Name + return m, nil +} + +func (w *wireFormat) parseInterfaceAddrMessage(_ RIBType, b []byte) (Message, error) { + if len(b) < w.bodyOff { + return nil, errMessageTooShort + } + l := int(nativeEndian.Uint16(b[:2])) + if len(b) < l { + return nil, errInvalidMessage + } + m := &InterfaceAddrMessage{ + Version: int(b[2]), + Type: int(b[3]), + Flags: int(nativeEndian.Uint32(b[8:12])), + raw: b[:l], + } + if runtime.GOOS == "netbsd" { + m.Index = int(nativeEndian.Uint16(b[16:18])) + } else { + m.Index = int(nativeEndian.Uint16(b[12:14])) + } + var err error + m.Addrs, err = parseAddrs(uint(nativeEndian.Uint32(b[4:8])), parseKernelInetAddr, b[w.bodyOff:]) + if err != nil { + return nil, err + } + return m, nil +} diff --git a/api/vendor/golang.org/x/net/route/interface_freebsd.go b/api/vendor/golang.org/x/net/route/interface_freebsd.go new file mode 100644 index 0000000..9f6f50c --- /dev/null +++ b/api/vendor/golang.org/x/net/route/interface_freebsd.go @@ -0,0 +1,78 @@ +// 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 route + +func (w *wireFormat) parseInterfaceMessage(typ RIBType, b []byte) (Message, error) { + var extOff, bodyOff int + if typ == sysNET_RT_IFLISTL { + if len(b) < 20 { + return nil, errMessageTooShort + } + extOff = int(nativeEndian.Uint16(b[18:20])) + bodyOff = int(nativeEndian.Uint16(b[16:18])) + } else { + extOff = w.extOff + bodyOff = w.bodyOff + } + if len(b) < extOff || len(b) < bodyOff { + return nil, errInvalidMessage + } + l := int(nativeEndian.Uint16(b[:2])) + if len(b) < l { + return nil, errInvalidMessage + } + attrs := uint(nativeEndian.Uint32(b[4:8])) + if attrs&sysRTA_IFP == 0 { + return nil, nil + } + m := &InterfaceMessage{ + Version: int(b[2]), + Type: int(b[3]), + Flags: int(nativeEndian.Uint32(b[8:12])), + Index: int(nativeEndian.Uint16(b[12:14])), + Addrs: make([]Addr, sysRTAX_MAX), + extOff: extOff, + raw: b[:l], + } + a, err := parseLinkAddr(b[bodyOff:]) + if err != nil { + return nil, err + } + m.Addrs[sysRTAX_IFP] = a + m.Name = a.(*LinkAddr).Name + return m, nil +} + +func (w *wireFormat) parseInterfaceAddrMessage(typ RIBType, b []byte) (Message, error) { + var bodyOff int + if typ == sysNET_RT_IFLISTL { + if len(b) < 24 { + return nil, errMessageTooShort + } + bodyOff = int(nativeEndian.Uint16(b[16:18])) + } else { + bodyOff = w.bodyOff + } + if len(b) < bodyOff { + return nil, errInvalidMessage + } + l := int(nativeEndian.Uint16(b[:2])) + if len(b) < l { + return nil, errInvalidMessage + } + m := &InterfaceAddrMessage{ + Version: int(b[2]), + Type: int(b[3]), + Flags: int(nativeEndian.Uint32(b[8:12])), + Index: int(nativeEndian.Uint16(b[12:14])), + raw: b[:l], + } + var err error + m.Addrs, err = parseAddrs(uint(nativeEndian.Uint32(b[4:8])), parseKernelInetAddr, b[bodyOff:]) + if err != nil { + return nil, err + } + return m, nil +} diff --git a/api/vendor/golang.org/x/net/route/interface_multicast.go b/api/vendor/golang.org/x/net/route/interface_multicast.go new file mode 100644 index 0000000..1e99a9c --- /dev/null +++ b/api/vendor/golang.org/x/net/route/interface_multicast.go @@ -0,0 +1,30 @@ +// 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. + +// +build darwin dragonfly freebsd + +package route + +func (w *wireFormat) parseInterfaceMulticastAddrMessage(_ RIBType, b []byte) (Message, error) { + if len(b) < w.bodyOff { + return nil, errMessageTooShort + } + l := int(nativeEndian.Uint16(b[:2])) + if len(b) < l { + return nil, errInvalidMessage + } + m := &InterfaceMulticastAddrMessage{ + Version: int(b[2]), + Type: int(b[3]), + Flags: int(nativeEndian.Uint32(b[8:12])), + Index: int(nativeEndian.Uint16(b[12:14])), + raw: b[:l], + } + var err error + m.Addrs, err = parseAddrs(uint(nativeEndian.Uint32(b[4:8])), parseKernelInetAddr, b[w.bodyOff:]) + if err != nil { + return nil, err + } + return m, nil +} diff --git a/api/vendor/golang.org/x/net/route/interface_openbsd.go b/api/vendor/golang.org/x/net/route/interface_openbsd.go new file mode 100644 index 0000000..e4a143c --- /dev/null +++ b/api/vendor/golang.org/x/net/route/interface_openbsd.go @@ -0,0 +1,90 @@ +// 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 route + +func (*wireFormat) parseInterfaceMessage(_ RIBType, b []byte) (Message, error) { + if len(b) < 32 { + return nil, errMessageTooShort + } + l := int(nativeEndian.Uint16(b[:2])) + if len(b) < l { + return nil, errInvalidMessage + } + attrs := uint(nativeEndian.Uint32(b[12:16])) + if attrs&sysRTA_IFP == 0 { + return nil, nil + } + m := &InterfaceMessage{ + Version: int(b[2]), + Type: int(b[3]), + Flags: int(nativeEndian.Uint32(b[16:20])), + Index: int(nativeEndian.Uint16(b[6:8])), + Addrs: make([]Addr, sysRTAX_MAX), + raw: b[:l], + } + ll := int(nativeEndian.Uint16(b[4:6])) + if len(b) < ll { + return nil, errInvalidMessage + } + a, err := parseLinkAddr(b[ll:]) + if err != nil { + return nil, err + } + m.Addrs[sysRTAX_IFP] = a + m.Name = a.(*LinkAddr).Name + return m, nil +} + +func (*wireFormat) parseInterfaceAddrMessage(_ RIBType, b []byte) (Message, error) { + if len(b) < 24 { + return nil, errMessageTooShort + } + l := int(nativeEndian.Uint16(b[:2])) + if len(b) < l { + return nil, errInvalidMessage + } + bodyOff := int(nativeEndian.Uint16(b[4:6])) + if len(b) < bodyOff { + return nil, errInvalidMessage + } + m := &InterfaceAddrMessage{ + Version: int(b[2]), + Type: int(b[3]), + Flags: int(nativeEndian.Uint32(b[12:16])), + Index: int(nativeEndian.Uint16(b[6:8])), + raw: b[:l], + } + var err error + m.Addrs, err = parseAddrs(uint(nativeEndian.Uint32(b[12:16])), parseKernelInetAddr, b[bodyOff:]) + if err != nil { + return nil, err + } + return m, nil +} + +func (*wireFormat) parseInterfaceAnnounceMessage(_ RIBType, b []byte) (Message, error) { + if len(b) < 26 { + return nil, errMessageTooShort + } + l := int(nativeEndian.Uint16(b[:2])) + if len(b) < l { + return nil, errInvalidMessage + } + m := &InterfaceAnnounceMessage{ + Version: int(b[2]), + Type: int(b[3]), + Index: int(nativeEndian.Uint16(b[6:8])), + What: int(nativeEndian.Uint16(b[8:10])), + raw: b[:l], + } + for i := 0; i < 16; i++ { + if b[10+i] != 0 { + continue + } + m.Name = string(b[10 : 10+i]) + break + } + return m, nil +} diff --git a/api/vendor/golang.org/x/net/route/message.go b/api/vendor/golang.org/x/net/route/message.go new file mode 100644 index 0000000..0fa7e09 --- /dev/null +++ b/api/vendor/golang.org/x/net/route/message.go @@ -0,0 +1,72 @@ +// 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. + +// +build darwin dragonfly freebsd netbsd openbsd + +package route + +// A Message represents a routing message. +type Message interface { + // Sys returns operating system-specific information. + Sys() []Sys +} + +// A Sys reprensents operating system-specific information. +type Sys interface { + // SysType returns a type of operating system-specific + // information. + SysType() SysType +} + +// A SysType represents a type of operating system-specific +// information. +type SysType int + +const ( + SysMetrics SysType = iota + SysStats +) + +// ParseRIB parses b as a routing information base and returns a list +// of routing messages. +func ParseRIB(typ RIBType, b []byte) ([]Message, error) { + if !typ.parseable() { + return nil, errUnsupportedMessage + } + var msgs []Message + nmsgs, nskips := 0, 0 + for len(b) > 4 { + nmsgs++ + l := int(nativeEndian.Uint16(b[:2])) + if l == 0 { + return nil, errInvalidMessage + } + if len(b) < l { + return nil, errMessageTooShort + } + if b[2] != sysRTM_VERSION { + b = b[l:] + continue + } + if w, ok := wireFormats[int(b[3])]; !ok { + nskips++ + } else { + m, err := w.parse(typ, b) + if err != nil { + return nil, err + } + if m == nil { + nskips++ + } else { + msgs = append(msgs, m) + } + } + b = b[l:] + } + // We failed to parse any of the messages - version mismatch? + if nmsgs != len(msgs)+nskips { + return nil, errMessageMismatch + } + return msgs, nil +} diff --git a/api/vendor/golang.org/x/net/route/message_darwin_test.go b/api/vendor/golang.org/x/net/route/message_darwin_test.go new file mode 100644 index 0000000..316aa75 --- /dev/null +++ b/api/vendor/golang.org/x/net/route/message_darwin_test.go @@ -0,0 +1,34 @@ +// 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 route + +import "testing" + +func TestFetchAndParseRIBOnDarwin(t *testing.T) { + for _, typ := range []RIBType{sysNET_RT_FLAGS, sysNET_RT_DUMP2, sysNET_RT_IFLIST2} { + var lastErr error + var ms []Message + for _, af := range []int{sysAF_UNSPEC, sysAF_INET, sysAF_INET6} { + rs, err := fetchAndParseRIB(af, typ) + if err != nil { + lastErr = err + continue + } + ms = append(ms, rs...) + } + if len(ms) == 0 && lastErr != nil { + t.Error(typ, lastErr) + continue + } + ss, err := msgs(ms).validate() + if err != nil { + t.Error(typ, err) + continue + } + for _, s := range ss { + t.Log(s) + } + } +} diff --git a/api/vendor/golang.org/x/net/route/message_freebsd_test.go b/api/vendor/golang.org/x/net/route/message_freebsd_test.go new file mode 100644 index 0000000..db4b567 --- /dev/null +++ b/api/vendor/golang.org/x/net/route/message_freebsd_test.go @@ -0,0 +1,92 @@ +// 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 route + +import ( + "testing" + "unsafe" +) + +func TestFetchAndParseRIBOnFreeBSD(t *testing.T) { + for _, typ := range []RIBType{sysNET_RT_IFMALIST} { + var lastErr error + var ms []Message + for _, af := range []int{sysAF_UNSPEC, sysAF_INET, sysAF_INET6} { + rs, err := fetchAndParseRIB(af, typ) + if err != nil { + lastErr = err + continue + } + ms = append(ms, rs...) + } + if len(ms) == 0 && lastErr != nil { + t.Error(typ, lastErr) + continue + } + ss, err := msgs(ms).validate() + if err != nil { + t.Error(typ, err) + continue + } + for _, s := range ss { + t.Log(s) + } + } +} + +func TestFetchAndParseRIBOnFreeBSD10AndAbove(t *testing.T) { + if _, err := FetchRIB(sysAF_UNSPEC, sysNET_RT_IFLISTL, 0); err != nil { + t.Skip("NET_RT_IFLISTL not supported") + } + var p uintptr + if kernelAlign != int(unsafe.Sizeof(p)) { + t.Skip("NET_RT_IFLIST vs. NET_RT_IFLISTL doesn't work for 386 emulation on amd64") + } + + var tests = [2]struct { + typ RIBType + b []byte + msgs []Message + ss []string + }{ + {typ: sysNET_RT_IFLIST}, + {typ: sysNET_RT_IFLISTL}, + } + for i := range tests { + var lastErr error + for _, af := range []int{sysAF_UNSPEC, sysAF_INET, sysAF_INET6} { + rs, err := fetchAndParseRIB(af, tests[i].typ) + if err != nil { + lastErr = err + continue + } + tests[i].msgs = append(tests[i].msgs, rs...) + } + if len(tests[i].msgs) == 0 && lastErr != nil { + t.Error(tests[i].typ, lastErr) + continue + } + tests[i].ss, lastErr = msgs(tests[i].msgs).validate() + if lastErr != nil { + t.Error(tests[i].typ, lastErr) + continue + } + for _, s := range tests[i].ss { + t.Log(s) + } + } + for i := len(tests) - 1; i > 0; i-- { + if len(tests[i].ss) != len(tests[i-1].ss) { + t.Errorf("got %v; want %v", tests[i].ss, tests[i-1].ss) + continue + } + for j, s1 := range tests[i].ss { + s0 := tests[i-1].ss[j] + if s1 != s0 { + t.Errorf("got %s; want %s", s1, s0) + } + } + } +} diff --git a/api/vendor/golang.org/x/net/route/message_test.go b/api/vendor/golang.org/x/net/route/message_test.go new file mode 100644 index 0000000..e848dab --- /dev/null +++ b/api/vendor/golang.org/x/net/route/message_test.go @@ -0,0 +1,239 @@ +// 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. + +// +build darwin dragonfly freebsd netbsd openbsd + +package route + +import ( + "os" + "syscall" + "testing" + "time" +) + +func TestFetchAndParseRIB(t *testing.T) { + for _, typ := range []RIBType{sysNET_RT_DUMP, sysNET_RT_IFLIST} { + var lastErr error + var ms []Message + for _, af := range []int{sysAF_UNSPEC, sysAF_INET, sysAF_INET6} { + rs, err := fetchAndParseRIB(af, typ) + if err != nil { + lastErr = err + continue + } + ms = append(ms, rs...) + } + if len(ms) == 0 && lastErr != nil { + t.Error(typ, lastErr) + continue + } + ss, err := msgs(ms).validate() + if err != nil { + t.Error(typ, err) + continue + } + for _, s := range ss { + t.Log(typ, s) + } + } +} + +var ( + rtmonSock int + rtmonErr error +) + +func init() { + // We need to keep rtmonSock alive to avoid treading on + // recycled socket descriptors. + rtmonSock, rtmonErr = syscall.Socket(sysAF_ROUTE, sysSOCK_RAW, sysAF_UNSPEC) +} + +// TestMonitorAndParseRIB leaks a worker goroutine and a socket +// descriptor but that's intentional. +func TestMonitorAndParseRIB(t *testing.T) { + if testing.Short() || os.Getuid() != 0 { + t.Skip("must be root") + } + + if rtmonErr != nil { + t.Fatal(rtmonErr) + } + + // We suppose that using an IPv4 link-local address and the + // dot1Q ID for Token Ring and FDDI doesn't harm anyone. + pv := &propVirtual{addr: "169.254.0.1", mask: "255.255.255.0"} + if err := pv.configure(1002); err != nil { + t.Skip(err) + } + if err := pv.setup(); err != nil { + t.Skip(err) + } + pv.teardown() + + go func() { + b := make([]byte, os.Getpagesize()) + for { + // There's no easy way to unblock this read + // call because the routing message exchange + // over routing socket is a connectionless + // message-oriented protocol, no control plane + // for signaling connectivity, and we cannot + // use the net package of standard library due + // to the lack of support for routing socket + // and circular dependency. + n, err := syscall.Read(rtmonSock, b) + if err != nil { + return + } + ms, err := ParseRIB(0, b[:n]) + if err != nil { + t.Error(err) + return + } + ss, err := msgs(ms).validate() + if err != nil { + t.Error(err) + return + } + for _, s := range ss { + t.Log(s) + } + } + }() + + for _, vid := range []int{1002, 1003, 1004, 1005} { + pv := &propVirtual{addr: "169.254.0.1", mask: "255.255.255.0"} + if err := pv.configure(vid); err != nil { + t.Fatal(err) + } + if err := pv.setup(); err != nil { + t.Fatal(err) + } + time.Sleep(200 * time.Millisecond) + if err := pv.teardown(); err != nil { + t.Fatal(err) + } + time.Sleep(200 * time.Millisecond) + } +} + +func TestParseRIBWithFuzz(t *testing.T) { + for _, fuzz := range []string{ + "0\x00\x05\x050000000000000000" + + "00000000000000000000" + + "00000000000000000000" + + "00000000000000000000" + + "0000000000000\x02000000" + + "00000000", + "\x02\x00\x05\f0000000000000000" + + "0\x0200000000000000", + "\x02\x00\x05\x100000000000000\x1200" + + "0\x00\xff\x00", + "\x02\x00\x05\f0000000000000000" + + "0\x12000\x00\x02\x0000", + "\x00\x00\x00\x01\x00", + "00000", + } { + for typ := RIBType(0); typ < 256; typ++ { + ParseRIB(typ, []byte(fuzz)) + } + } +} + +func TestRouteMessage(t *testing.T) { + s, err := syscall.Socket(sysAF_ROUTE, sysSOCK_RAW, sysAF_UNSPEC) + if err != nil { + t.Fatal(err) + } + defer syscall.Close(s) + + var ms []RouteMessage + for _, af := range []int{sysAF_INET, sysAF_INET6} { + if _, err := fetchAndParseRIB(af, sysNET_RT_DUMP); err != nil { + t.Log(err) + continue + } + switch af { + case sysAF_INET: + ms = append(ms, []RouteMessage{ + { + Type: sysRTM_GET, + Addrs: []Addr{ + &Inet4Addr{IP: [4]byte{127, 0, 0, 1}}, + nil, + nil, + nil, + &LinkAddr{}, + &Inet4Addr{}, + nil, + &Inet4Addr{}, + }, + }, + { + Type: sysRTM_GET, + Addrs: []Addr{ + &Inet4Addr{IP: [4]byte{127, 0, 0, 1}}, + }, + }, + }...) + case sysAF_INET6: + ms = append(ms, []RouteMessage{ + { + Type: sysRTM_GET, + Addrs: []Addr{ + &Inet6Addr{IP: [16]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}}, + nil, + nil, + nil, + &LinkAddr{}, + &Inet6Addr{}, + nil, + &Inet6Addr{}, + }, + }, + { + Type: sysRTM_GET, + Addrs: []Addr{ + &Inet6Addr{IP: [16]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}}, + }, + }, + }...) + } + } + for i, m := range ms { + m.ID = uintptr(os.Getpid()) + m.Seq = i + 1 + wb, err := m.Marshal() + if err != nil { + t.Fatalf("%v: %v", m, err) + } + if _, err := syscall.Write(s, wb); err != nil { + t.Fatalf("%v: %v", m, err) + } + rb := make([]byte, os.Getpagesize()) + n, err := syscall.Read(s, rb) + if err != nil { + t.Fatalf("%v: %v", m, err) + } + rms, err := ParseRIB(0, rb[:n]) + if err != nil { + t.Fatalf("%v: %v", m, err) + } + for _, rm := range rms { + err := rm.(*RouteMessage).Err + if err != nil { + t.Errorf("%v: %v", m, err) + } + } + ss, err := msgs(rms).validate() + if err != nil { + t.Fatalf("%v: %v", m, err) + } + for _, s := range ss { + t.Log(s) + } + } +} diff --git a/api/vendor/golang.org/x/net/route/route.go b/api/vendor/golang.org/x/net/route/route.go new file mode 100644 index 0000000..081da0d --- /dev/null +++ b/api/vendor/golang.org/x/net/route/route.go @@ -0,0 +1,123 @@ +// 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. + +// +build darwin dragonfly freebsd netbsd openbsd + +// Package route provides basic functions for the manipulation of +// packet routing facilities on BSD variants. +// +// The package supports any version of Darwin, any version of +// DragonFly BSD, FreeBSD 7 through 11, NetBSD 6 and above, and +// OpenBSD 5.6 and above. +package route + +import ( + "errors" + "os" + "syscall" +) + +var ( + errUnsupportedMessage = errors.New("unsupported message") + errMessageMismatch = errors.New("message mismatch") + errMessageTooShort = errors.New("message too short") + errInvalidMessage = errors.New("invalid message") + errInvalidAddr = errors.New("invalid address") + errShortBuffer = errors.New("short buffer") +) + +// A RouteMessage represents a message conveying an address prefix, a +// nexthop address and an output interface. +// +// Unlike other messages, this message can be used to query adjacency +// information for the given address prefix, to add a new route, and +// to delete or modify the existing route from the routing information +// base inside the kernel by writing and reading route messages on a +// routing socket. +// +// For the manipulation of routing information, the route message must +// contain appropriate fields that include: +// +// Version = +// Type = +// Flags = +// Index = +// ID = +// Seq = +// Addrs = +// +// The Type field specifies a type of manipulation, the Flags field +// specifies a class of target information and the Addrs field +// specifies target information like the following: +// +// route.RouteMessage{ +// Version: RTM_VERSION, +// Type: RTM_GET, +// Flags: RTF_UP | RTF_HOST, +// ID: uintptr(os.Getpid()), +// Seq: 1, +// Addrs: []route.Addrs{ +// RTAX_DST: &route.Inet4Addr{ ... }, +// RTAX_IFP: &route.LinkAddr{ ... }, +// RTAX_BRD: &route.Inet4Addr{ ... }, +// }, +// } +// +// The values for the above fields depend on the implementation of +// each operating system. +// +// The Err field on a response message contains an error value on the +// requested operation. If non-nil, the requested operation is failed. +type RouteMessage struct { + Version int // message version + Type int // message type + Flags int // route flags + Index int // interface index when atatched + ID uintptr // sender's identifier; usually process ID + Seq int // sequence number + Err error // error on requested operation + Addrs []Addr // addresses + + extOff int // offset of header extension + raw []byte // raw message +} + +// Marshal returns the binary encoding of m. +func (m *RouteMessage) Marshal() ([]byte, error) { + return m.marshal() +} + +// A RIBType reprensents a type of routing information base. +type RIBType int + +const ( + RIBTypeRoute RIBType = syscall.NET_RT_DUMP + RIBTypeInterface RIBType = syscall.NET_RT_IFLIST +) + +// FetchRIB fetches a routing information base from the operating +// system. +// +// The provided af must be an address family. +// +// The provided arg must be a RIBType-specific argument. +// When RIBType is related to routes, arg might be a set of route +// flags. When RIBType is related to network interfaces, arg might be +// an interface index or a set of interface flags. In most cases, zero +// means a wildcard. +func FetchRIB(af int, typ RIBType, arg int) ([]byte, error) { + mib := [6]int32{sysCTL_NET, sysAF_ROUTE, 0, int32(af), int32(typ), int32(arg)} + n := uintptr(0) + if err := sysctl(mib[:], nil, &n, nil, 0); err != nil { + return nil, os.NewSyscallError("sysctl", err) + } + if n == 0 { + return nil, nil + } + b := make([]byte, n) + if err := sysctl(mib[:], &b[0], &n, nil, 0); err != nil { + return nil, os.NewSyscallError("sysctl", err) + } + return b[:n], nil +} diff --git a/api/vendor/golang.org/x/net/route/route_classic.go b/api/vendor/golang.org/x/net/route/route_classic.go new file mode 100644 index 0000000..02fa688 --- /dev/null +++ b/api/vendor/golang.org/x/net/route/route_classic.go @@ -0,0 +1,75 @@ +// 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. + +// +build darwin dragonfly freebsd netbsd + +package route + +import ( + "runtime" + "syscall" +) + +func (m *RouteMessage) marshal() ([]byte, error) { + w, ok := wireFormats[m.Type] + if !ok { + return nil, errUnsupportedMessage + } + l := w.bodyOff + addrsSpace(m.Addrs) + if runtime.GOOS == "darwin" { + // Fix stray pointer writes on macOS. + // See golang.org/issue/22456. + l += 1024 + } + b := make([]byte, l) + nativeEndian.PutUint16(b[:2], uint16(l)) + if m.Version == 0 { + b[2] = sysRTM_VERSION + } else { + b[2] = byte(m.Version) + } + b[3] = byte(m.Type) + nativeEndian.PutUint32(b[8:12], uint32(m.Flags)) + nativeEndian.PutUint16(b[4:6], uint16(m.Index)) + nativeEndian.PutUint32(b[16:20], uint32(m.ID)) + nativeEndian.PutUint32(b[20:24], uint32(m.Seq)) + attrs, err := marshalAddrs(b[w.bodyOff:], m.Addrs) + if err != nil { + return nil, err + } + if attrs > 0 { + nativeEndian.PutUint32(b[12:16], uint32(attrs)) + } + return b, nil +} + +func (w *wireFormat) parseRouteMessage(typ RIBType, b []byte) (Message, error) { + if len(b) < w.bodyOff { + return nil, errMessageTooShort + } + l := int(nativeEndian.Uint16(b[:2])) + if len(b) < l { + return nil, errInvalidMessage + } + m := &RouteMessage{ + Version: int(b[2]), + Type: int(b[3]), + Flags: int(nativeEndian.Uint32(b[8:12])), + Index: int(nativeEndian.Uint16(b[4:6])), + ID: uintptr(nativeEndian.Uint32(b[16:20])), + Seq: int(nativeEndian.Uint32(b[20:24])), + extOff: w.extOff, + raw: b[:l], + } + errno := syscall.Errno(nativeEndian.Uint32(b[28:32])) + if errno != 0 { + m.Err = errno + } + var err error + m.Addrs, err = parseAddrs(uint(nativeEndian.Uint32(b[12:16])), parseKernelInetAddr, b[w.bodyOff:]) + if err != nil { + return nil, err + } + return m, nil +} diff --git a/api/vendor/golang.org/x/net/route/route_openbsd.go b/api/vendor/golang.org/x/net/route/route_openbsd.go new file mode 100644 index 0000000..daf2e90 --- /dev/null +++ b/api/vendor/golang.org/x/net/route/route_openbsd.go @@ -0,0 +1,65 @@ +// 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 route + +import "syscall" + +func (m *RouteMessage) marshal() ([]byte, error) { + l := sizeofRtMsghdr + addrsSpace(m.Addrs) + b := make([]byte, l) + nativeEndian.PutUint16(b[:2], uint16(l)) + if m.Version == 0 { + b[2] = sysRTM_VERSION + } else { + b[2] = byte(m.Version) + } + b[3] = byte(m.Type) + nativeEndian.PutUint16(b[4:6], uint16(sizeofRtMsghdr)) + nativeEndian.PutUint32(b[16:20], uint32(m.Flags)) + nativeEndian.PutUint16(b[6:8], uint16(m.Index)) + nativeEndian.PutUint32(b[24:28], uint32(m.ID)) + nativeEndian.PutUint32(b[28:32], uint32(m.Seq)) + attrs, err := marshalAddrs(b[sizeofRtMsghdr:], m.Addrs) + if err != nil { + return nil, err + } + if attrs > 0 { + nativeEndian.PutUint32(b[12:16], uint32(attrs)) + } + return b, nil +} + +func (*wireFormat) parseRouteMessage(_ RIBType, b []byte) (Message, error) { + if len(b) < sizeofRtMsghdr { + return nil, errMessageTooShort + } + l := int(nativeEndian.Uint16(b[:2])) + if len(b) < l { + return nil, errInvalidMessage + } + m := &RouteMessage{ + Version: int(b[2]), + Type: int(b[3]), + Flags: int(nativeEndian.Uint32(b[16:20])), + Index: int(nativeEndian.Uint16(b[6:8])), + ID: uintptr(nativeEndian.Uint32(b[24:28])), + Seq: int(nativeEndian.Uint32(b[28:32])), + raw: b[:l], + } + ll := int(nativeEndian.Uint16(b[4:6])) + if len(b) < ll { + return nil, errInvalidMessage + } + errno := syscall.Errno(nativeEndian.Uint32(b[32:36])) + if errno != 0 { + m.Err = errno + } + as, err := parseAddrs(uint(nativeEndian.Uint32(b[12:16])), parseKernelInetAddr, b[ll:]) + if err != nil { + return nil, err + } + m.Addrs = as + return m, nil +} diff --git a/api/vendor/golang.org/x/net/route/route_test.go b/api/vendor/golang.org/x/net/route/route_test.go new file mode 100644 index 0000000..61bd174 --- /dev/null +++ b/api/vendor/golang.org/x/net/route/route_test.go @@ -0,0 +1,390 @@ +// 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. + +// +build darwin dragonfly freebsd netbsd openbsd + +package route + +import ( + "fmt" + "os/exec" + "runtime" + "time" +) + +func (m *RouteMessage) String() string { + return fmt.Sprintf("%s", addrAttrs(nativeEndian.Uint32(m.raw[12:16]))) +} + +func (m *InterfaceMessage) String() string { + var attrs addrAttrs + if runtime.GOOS == "openbsd" { + attrs = addrAttrs(nativeEndian.Uint32(m.raw[12:16])) + } else { + attrs = addrAttrs(nativeEndian.Uint32(m.raw[4:8])) + } + return fmt.Sprintf("%s", attrs) +} + +func (m *InterfaceAddrMessage) String() string { + var attrs addrAttrs + if runtime.GOOS == "openbsd" { + attrs = addrAttrs(nativeEndian.Uint32(m.raw[12:16])) + } else { + attrs = addrAttrs(nativeEndian.Uint32(m.raw[4:8])) + } + return fmt.Sprintf("%s", attrs) +} + +func (m *InterfaceMulticastAddrMessage) String() string { + return fmt.Sprintf("%s", addrAttrs(nativeEndian.Uint32(m.raw[4:8]))) +} + +func (m *InterfaceAnnounceMessage) String() string { + what := "" + switch m.What { + case 0: + what = "arrival" + case 1: + what = "departure" + } + return fmt.Sprintf("(%d %s %s)", m.Index, m.Name, what) +} + +func (m *InterfaceMetrics) String() string { + return fmt.Sprintf("(type=%d mtu=%d)", m.Type, m.MTU) +} + +func (m *RouteMetrics) String() string { + return fmt.Sprintf("(pmtu=%d)", m.PathMTU) +} + +type addrAttrs uint + +var addrAttrNames = [...]string{ + "dst", + "gateway", + "netmask", + "genmask", + "ifp", + "ifa", + "author", + "brd", + "df:mpls1-n:tag-o:src", // mpls1 for dragonfly, tag for netbsd, src for openbsd + "df:mpls2-o:srcmask", // mpls2 for dragonfly, srcmask for openbsd + "df:mpls3-o:label", // mpls3 for dragonfly, label for openbsd + "o:bfd", // bfd for openbsd + "o:dns", // dns for openbsd + "o:static", // static for openbsd + "o:search", // search for openbsd +} + +func (attrs addrAttrs) String() string { + var s string + for i, name := range addrAttrNames { + if attrs&(1<" + } + return s +} + +type msgs []Message + +func (ms msgs) validate() ([]string, error) { + var ss []string + for _, m := range ms { + switch m := m.(type) { + case *RouteMessage: + if err := addrs(m.Addrs).match(addrAttrs(nativeEndian.Uint32(m.raw[12:16]))); err != nil { + return nil, err + } + sys := m.Sys() + if sys == nil { + return nil, fmt.Errorf("no sys for %s", m.String()) + } + ss = append(ss, m.String()+" "+syss(sys).String()+" "+addrs(m.Addrs).String()) + case *InterfaceMessage: + var attrs addrAttrs + if runtime.GOOS == "openbsd" { + attrs = addrAttrs(nativeEndian.Uint32(m.raw[12:16])) + } else { + attrs = addrAttrs(nativeEndian.Uint32(m.raw[4:8])) + } + if err := addrs(m.Addrs).match(attrs); err != nil { + return nil, err + } + sys := m.Sys() + if sys == nil { + return nil, fmt.Errorf("no sys for %s", m.String()) + } + ss = append(ss, m.String()+" "+syss(sys).String()+" "+addrs(m.Addrs).String()) + case *InterfaceAddrMessage: + var attrs addrAttrs + if runtime.GOOS == "openbsd" { + attrs = addrAttrs(nativeEndian.Uint32(m.raw[12:16])) + } else { + attrs = addrAttrs(nativeEndian.Uint32(m.raw[4:8])) + } + if err := addrs(m.Addrs).match(attrs); err != nil { + return nil, err + } + ss = append(ss, m.String()+" "+addrs(m.Addrs).String()) + case *InterfaceMulticastAddrMessage: + if err := addrs(m.Addrs).match(addrAttrs(nativeEndian.Uint32(m.raw[4:8]))); err != nil { + return nil, err + } + ss = append(ss, m.String()+" "+addrs(m.Addrs).String()) + case *InterfaceAnnounceMessage: + ss = append(ss, m.String()) + default: + ss = append(ss, fmt.Sprintf("%+v", m)) + } + } + return ss, nil +} + +type syss []Sys + +func (sys syss) String() string { + var s string + for _, sy := range sys { + switch sy := sy.(type) { + case *InterfaceMetrics: + if len(s) > 0 { + s += " " + } + s += sy.String() + case *RouteMetrics: + if len(s) > 0 { + s += " " + } + s += sy.String() + } + } + return s +} + +type addrFamily int + +func (af addrFamily) String() string { + switch af { + case sysAF_UNSPEC: + return "unspec" + case sysAF_LINK: + return "link" + case sysAF_INET: + return "inet4" + case sysAF_INET6: + return "inet6" + default: + return fmt.Sprintf("%d", af) + } +} + +const hexDigit = "0123456789abcdef" + +type llAddr []byte + +func (a llAddr) String() string { + if len(a) == 0 { + return "" + } + buf := make([]byte, 0, len(a)*3-1) + for i, b := range a { + if i > 0 { + buf = append(buf, ':') + } + buf = append(buf, hexDigit[b>>4]) + buf = append(buf, hexDigit[b&0xF]) + } + return string(buf) +} + +type ipAddr []byte + +func (a ipAddr) String() string { + if len(a) == 0 { + return "" + } + if len(a) == 4 { + return fmt.Sprintf("%d.%d.%d.%d", a[0], a[1], a[2], a[3]) + } + if len(a) == 16 { + return fmt.Sprintf("%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x", a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]) + } + s := make([]byte, len(a)*2) + for i, tn := range a { + s[i*2], s[i*2+1] = hexDigit[tn>>4], hexDigit[tn&0xf] + } + return string(s) +} + +func (a *LinkAddr) String() string { + name := a.Name + if name == "" { + name = "" + } + lla := llAddr(a.Addr).String() + if lla == "" { + lla = "" + } + return fmt.Sprintf("(%v %d %s %s)", addrFamily(a.Family()), a.Index, name, lla) +} + +func (a *Inet4Addr) String() string { + return fmt.Sprintf("(%v %v)", addrFamily(a.Family()), ipAddr(a.IP[:])) +} + +func (a *Inet6Addr) String() string { + return fmt.Sprintf("(%v %v %d)", addrFamily(a.Family()), ipAddr(a.IP[:]), a.ZoneID) +} + +func (a *DefaultAddr) String() string { + return fmt.Sprintf("(%v %s)", addrFamily(a.Family()), ipAddr(a.Raw[2:]).String()) +} + +type addrs []Addr + +func (as addrs) String() string { + var s string + for _, a := range as { + if a == nil { + continue + } + if len(s) > 0 { + s += " " + } + switch a := a.(type) { + case *LinkAddr: + s += a.String() + case *Inet4Addr: + s += a.String() + case *Inet6Addr: + s += a.String() + case *DefaultAddr: + s += a.String() + } + } + if s == "" { + return "" + } + return s +} + +func (as addrs) match(attrs addrAttrs) error { + var ts addrAttrs + af := sysAF_UNSPEC + for i := range as { + if as[i] != nil { + ts |= 1 << uint(i) + } + switch as[i].(type) { + case *Inet4Addr: + if af == sysAF_UNSPEC { + af = sysAF_INET + } + if af != sysAF_INET { + return fmt.Errorf("got %v; want %v", addrs(as), addrFamily(af)) + } + case *Inet6Addr: + if af == sysAF_UNSPEC { + af = sysAF_INET6 + } + if af != sysAF_INET6 { + return fmt.Errorf("got %v; want %v", addrs(as), addrFamily(af)) + } + } + } + if ts != attrs && ts > attrs { + return fmt.Errorf("%v not included in %v", ts, attrs) + } + return nil +} + +func fetchAndParseRIB(af int, typ RIBType) ([]Message, error) { + var err error + var b []byte + for i := 0; i < 3; i++ { + if b, err = FetchRIB(af, typ, 0); err != nil { + time.Sleep(10 * time.Millisecond) + continue + } + break + } + if err != nil { + return nil, fmt.Errorf("%v %d %v", addrFamily(af), typ, err) + } + ms, err := ParseRIB(typ, b) + if err != nil { + return nil, fmt.Errorf("%v %d %v", addrFamily(af), typ, err) + } + return ms, nil +} + +// propVirtual is a proprietary virtual network interface. +type propVirtual struct { + name string + addr, mask string + setupCmds []*exec.Cmd + teardownCmds []*exec.Cmd +} + +func (pv *propVirtual) setup() error { + for _, cmd := range pv.setupCmds { + if err := cmd.Run(); err != nil { + pv.teardown() + return err + } + } + return nil +} + +func (pv *propVirtual) teardown() error { + for _, cmd := range pv.teardownCmds { + if err := cmd.Run(); err != nil { + return err + } + } + return nil +} + +func (pv *propVirtual) configure(suffix int) error { + if runtime.GOOS == "openbsd" { + pv.name = fmt.Sprintf("vether%d", suffix) + } else { + pv.name = fmt.Sprintf("vlan%d", suffix) + } + xname, err := exec.LookPath("ifconfig") + if err != nil { + return err + } + pv.setupCmds = append(pv.setupCmds, &exec.Cmd{ + Path: xname, + Args: []string{"ifconfig", pv.name, "create"}, + }) + if runtime.GOOS == "netbsd" { + // NetBSD requires an underlying dot1Q-capable network + // interface. + pv.setupCmds = append(pv.setupCmds, &exec.Cmd{ + Path: xname, + Args: []string{"ifconfig", pv.name, "vlan", fmt.Sprintf("%d", suffix&0xfff), "vlanif", "wm0"}, + }) + } + pv.setupCmds = append(pv.setupCmds, &exec.Cmd{ + Path: xname, + Args: []string{"ifconfig", pv.name, "inet", pv.addr, "netmask", pv.mask}, + }) + pv.teardownCmds = append(pv.teardownCmds, &exec.Cmd{ + Path: xname, + Args: []string{"ifconfig", pv.name, "destroy"}, + }) + return nil +} diff --git a/api/vendor/golang.org/x/net/route/sys.go b/api/vendor/golang.org/x/net/route/sys.go new file mode 100644 index 0000000..3d0ee9b --- /dev/null +++ b/api/vendor/golang.org/x/net/route/sys.go @@ -0,0 +1,39 @@ +// 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. + +// +build darwin dragonfly freebsd netbsd openbsd + +package route + +import "unsafe" + +var ( + nativeEndian binaryByteOrder + kernelAlign int + wireFormats map[int]*wireFormat +) + +func init() { + i := uint32(1) + b := (*[4]byte)(unsafe.Pointer(&i)) + if b[0] == 1 { + nativeEndian = littleEndian + } else { + nativeEndian = bigEndian + } + kernelAlign, wireFormats = probeRoutingStack() +} + +func roundup(l int) int { + if l == 0 { + return kernelAlign + } + return (l + kernelAlign - 1) & ^(kernelAlign - 1) +} + +type wireFormat struct { + extOff int // offset of header extension + bodyOff int // offset of message body + parse func(RIBType, []byte) (Message, error) +} diff --git a/api/vendor/golang.org/x/net/route/sys_darwin.go b/api/vendor/golang.org/x/net/route/sys_darwin.go new file mode 100644 index 0000000..d2daf5c --- /dev/null +++ b/api/vendor/golang.org/x/net/route/sys_darwin.go @@ -0,0 +1,87 @@ +// 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 route + +func (typ RIBType) parseable() bool { + switch typ { + case sysNET_RT_STAT, sysNET_RT_TRASH: + return false + default: + return true + } +} + +// RouteMetrics represents route metrics. +type RouteMetrics struct { + PathMTU int // path maximum transmission unit +} + +// SysType implements the SysType method of Sys interface. +func (rmx *RouteMetrics) SysType() SysType { return SysMetrics } + +// Sys implements the Sys method of Message interface. +func (m *RouteMessage) Sys() []Sys { + return []Sys{ + &RouteMetrics{ + PathMTU: int(nativeEndian.Uint32(m.raw[m.extOff+4 : m.extOff+8])), + }, + } +} + +// InterfaceMetrics represents interface metrics. +type InterfaceMetrics struct { + Type int // interface type + MTU int // maximum transmission unit +} + +// SysType implements the SysType method of Sys interface. +func (imx *InterfaceMetrics) SysType() SysType { return SysMetrics } + +// Sys implements the Sys method of Message interface. +func (m *InterfaceMessage) Sys() []Sys { + return []Sys{ + &InterfaceMetrics{ + Type: int(m.raw[m.extOff]), + MTU: int(nativeEndian.Uint32(m.raw[m.extOff+8 : m.extOff+12])), + }, + } +} + +func probeRoutingStack() (int, map[int]*wireFormat) { + rtm := &wireFormat{extOff: 36, bodyOff: sizeofRtMsghdrDarwin15} + rtm.parse = rtm.parseRouteMessage + rtm2 := &wireFormat{extOff: 36, bodyOff: sizeofRtMsghdr2Darwin15} + rtm2.parse = rtm2.parseRouteMessage + ifm := &wireFormat{extOff: 16, bodyOff: sizeofIfMsghdrDarwin15} + ifm.parse = ifm.parseInterfaceMessage + ifm2 := &wireFormat{extOff: 32, bodyOff: sizeofIfMsghdr2Darwin15} + ifm2.parse = ifm2.parseInterfaceMessage + ifam := &wireFormat{extOff: sizeofIfaMsghdrDarwin15, bodyOff: sizeofIfaMsghdrDarwin15} + ifam.parse = ifam.parseInterfaceAddrMessage + ifmam := &wireFormat{extOff: sizeofIfmaMsghdrDarwin15, bodyOff: sizeofIfmaMsghdrDarwin15} + ifmam.parse = ifmam.parseInterfaceMulticastAddrMessage + ifmam2 := &wireFormat{extOff: sizeofIfmaMsghdr2Darwin15, bodyOff: sizeofIfmaMsghdr2Darwin15} + ifmam2.parse = ifmam2.parseInterfaceMulticastAddrMessage + // Darwin kernels require 32-bit aligned access to routing facilities. + return 4, map[int]*wireFormat{ + sysRTM_ADD: rtm, + sysRTM_DELETE: rtm, + sysRTM_CHANGE: rtm, + sysRTM_GET: rtm, + sysRTM_LOSING: rtm, + sysRTM_REDIRECT: rtm, + sysRTM_MISS: rtm, + sysRTM_LOCK: rtm, + sysRTM_RESOLVE: rtm, + sysRTM_NEWADDR: ifam, + sysRTM_DELADDR: ifam, + sysRTM_IFINFO: ifm, + sysRTM_NEWMADDR: ifmam, + sysRTM_DELMADDR: ifmam, + sysRTM_IFINFO2: ifm2, + sysRTM_NEWMADDR2: ifmam2, + sysRTM_GET2: rtm2, + } +} diff --git a/api/vendor/golang.org/x/net/route/sys_dragonfly.go b/api/vendor/golang.org/x/net/route/sys_dragonfly.go new file mode 100644 index 0000000..0c14bc2 --- /dev/null +++ b/api/vendor/golang.org/x/net/route/sys_dragonfly.go @@ -0,0 +1,76 @@ +// 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 route + +import "unsafe" + +func (typ RIBType) parseable() bool { return true } + +// RouteMetrics represents route metrics. +type RouteMetrics struct { + PathMTU int // path maximum transmission unit +} + +// SysType implements the SysType method of Sys interface. +func (rmx *RouteMetrics) SysType() SysType { return SysMetrics } + +// Sys implements the Sys method of Message interface. +func (m *RouteMessage) Sys() []Sys { + return []Sys{ + &RouteMetrics{ + PathMTU: int(nativeEndian.Uint64(m.raw[m.extOff+8 : m.extOff+16])), + }, + } +} + +// InterfaceMetrics represents interface metrics. +type InterfaceMetrics struct { + Type int // interface type + MTU int // maximum transmission unit +} + +// SysType implements the SysType method of Sys interface. +func (imx *InterfaceMetrics) SysType() SysType { return SysMetrics } + +// Sys implements the Sys method of Message interface. +func (m *InterfaceMessage) Sys() []Sys { + return []Sys{ + &InterfaceMetrics{ + Type: int(m.raw[m.extOff]), + MTU: int(nativeEndian.Uint32(m.raw[m.extOff+8 : m.extOff+12])), + }, + } +} + +func probeRoutingStack() (int, map[int]*wireFormat) { + var p uintptr + rtm := &wireFormat{extOff: 40, bodyOff: sizeofRtMsghdrDragonFlyBSD4} + rtm.parse = rtm.parseRouteMessage + ifm := &wireFormat{extOff: 16, bodyOff: sizeofIfMsghdrDragonFlyBSD4} + ifm.parse = ifm.parseInterfaceMessage + ifam := &wireFormat{extOff: sizeofIfaMsghdrDragonFlyBSD4, bodyOff: sizeofIfaMsghdrDragonFlyBSD4} + ifam.parse = ifam.parseInterfaceAddrMessage + ifmam := &wireFormat{extOff: sizeofIfmaMsghdrDragonFlyBSD4, bodyOff: sizeofIfmaMsghdrDragonFlyBSD4} + ifmam.parse = ifmam.parseInterfaceMulticastAddrMessage + ifanm := &wireFormat{extOff: sizeofIfAnnouncemsghdrDragonFlyBSD4, bodyOff: sizeofIfAnnouncemsghdrDragonFlyBSD4} + ifanm.parse = ifanm.parseInterfaceAnnounceMessage + return int(unsafe.Sizeof(p)), map[int]*wireFormat{ + sysRTM_ADD: rtm, + sysRTM_DELETE: rtm, + sysRTM_CHANGE: rtm, + sysRTM_GET: rtm, + sysRTM_LOSING: rtm, + sysRTM_REDIRECT: rtm, + sysRTM_MISS: rtm, + sysRTM_LOCK: rtm, + sysRTM_RESOLVE: rtm, + sysRTM_NEWADDR: ifam, + sysRTM_DELADDR: ifam, + sysRTM_IFINFO: ifm, + sysRTM_NEWMADDR: ifmam, + sysRTM_DELMADDR: ifmam, + sysRTM_IFANNOUNCE: ifanm, + } +} diff --git a/api/vendor/golang.org/x/net/route/sys_freebsd.go b/api/vendor/golang.org/x/net/route/sys_freebsd.go new file mode 100644 index 0000000..89ba1c4 --- /dev/null +++ b/api/vendor/golang.org/x/net/route/sys_freebsd.go @@ -0,0 +1,155 @@ +// 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 route + +import ( + "syscall" + "unsafe" +) + +func (typ RIBType) parseable() bool { return true } + +// RouteMetrics represents route metrics. +type RouteMetrics struct { + PathMTU int // path maximum transmission unit +} + +// SysType implements the SysType method of Sys interface. +func (rmx *RouteMetrics) SysType() SysType { return SysMetrics } + +// Sys implements the Sys method of Message interface. +func (m *RouteMessage) Sys() []Sys { + if kernelAlign == 8 { + return []Sys{ + &RouteMetrics{ + PathMTU: int(nativeEndian.Uint64(m.raw[m.extOff+8 : m.extOff+16])), + }, + } + } + return []Sys{ + &RouteMetrics{ + PathMTU: int(nativeEndian.Uint32(m.raw[m.extOff+4 : m.extOff+8])), + }, + } +} + +// InterfaceMetrics represents interface metrics. +type InterfaceMetrics struct { + Type int // interface type + MTU int // maximum transmission unit +} + +// SysType implements the SysType method of Sys interface. +func (imx *InterfaceMetrics) SysType() SysType { return SysMetrics } + +// Sys implements the Sys method of Message interface. +func (m *InterfaceMessage) Sys() []Sys { + return []Sys{ + &InterfaceMetrics{ + Type: int(m.raw[m.extOff]), + MTU: int(nativeEndian.Uint32(m.raw[m.extOff+8 : m.extOff+12])), + }, + } +} + +func probeRoutingStack() (int, map[int]*wireFormat) { + var p uintptr + wordSize := int(unsafe.Sizeof(p)) + align := int(unsafe.Sizeof(p)) + // In the case of kern.supported_archs="amd64 i386", we need + // to know the underlying kernel's architecture because the + // alignment for routing facilities are set at the build time + // of the kernel. + conf, _ := syscall.Sysctl("kern.conftxt") + for i, j := 0, 0; j < len(conf); j++ { + if conf[j] != '\n' { + continue + } + s := conf[i:j] + i = j + 1 + if len(s) > len("machine") && s[:len("machine")] == "machine" { + s = s[len("machine"):] + for k := 0; k < len(s); k++ { + if s[k] == ' ' || s[k] == '\t' { + s = s[1:] + } + break + } + if s == "amd64" { + align = 8 + } + break + } + } + var rtm, ifm, ifam, ifmam, ifanm *wireFormat + if align != wordSize { // 386 emulation on amd64 + rtm = &wireFormat{extOff: sizeofRtMsghdrFreeBSD10Emu - sizeofRtMetricsFreeBSD10Emu, bodyOff: sizeofRtMsghdrFreeBSD10Emu} + ifm = &wireFormat{extOff: 16} + ifam = &wireFormat{extOff: sizeofIfaMsghdrFreeBSD10Emu, bodyOff: sizeofIfaMsghdrFreeBSD10Emu} + ifmam = &wireFormat{extOff: sizeofIfmaMsghdrFreeBSD10Emu, bodyOff: sizeofIfmaMsghdrFreeBSD10Emu} + ifanm = &wireFormat{extOff: sizeofIfAnnouncemsghdrFreeBSD10Emu, bodyOff: sizeofIfAnnouncemsghdrFreeBSD10Emu} + } else { + rtm = &wireFormat{extOff: sizeofRtMsghdrFreeBSD10 - sizeofRtMetricsFreeBSD10, bodyOff: sizeofRtMsghdrFreeBSD10} + ifm = &wireFormat{extOff: 16} + ifam = &wireFormat{extOff: sizeofIfaMsghdrFreeBSD10, bodyOff: sizeofIfaMsghdrFreeBSD10} + ifmam = &wireFormat{extOff: sizeofIfmaMsghdrFreeBSD10, bodyOff: sizeofIfmaMsghdrFreeBSD10} + ifanm = &wireFormat{extOff: sizeofIfAnnouncemsghdrFreeBSD10, bodyOff: sizeofIfAnnouncemsghdrFreeBSD10} + } + rel, _ := syscall.SysctlUint32("kern.osreldate") + switch { + case rel < 800000: + if align != wordSize { // 386 emulation on amd64 + ifm.bodyOff = sizeofIfMsghdrFreeBSD7Emu + } else { + ifm.bodyOff = sizeofIfMsghdrFreeBSD7 + } + case 800000 <= rel && rel < 900000: + if align != wordSize { // 386 emulation on amd64 + ifm.bodyOff = sizeofIfMsghdrFreeBSD8Emu + } else { + ifm.bodyOff = sizeofIfMsghdrFreeBSD8 + } + case 900000 <= rel && rel < 1000000: + if align != wordSize { // 386 emulation on amd64 + ifm.bodyOff = sizeofIfMsghdrFreeBSD9Emu + } else { + ifm.bodyOff = sizeofIfMsghdrFreeBSD9 + } + case 1000000 <= rel && rel < 1100000: + if align != wordSize { // 386 emulation on amd64 + ifm.bodyOff = sizeofIfMsghdrFreeBSD10Emu + } else { + ifm.bodyOff = sizeofIfMsghdrFreeBSD10 + } + default: + if align != wordSize { // 386 emulation on amd64 + ifm.bodyOff = sizeofIfMsghdrFreeBSD11Emu + } else { + ifm.bodyOff = sizeofIfMsghdrFreeBSD11 + } + } + rtm.parse = rtm.parseRouteMessage + ifm.parse = ifm.parseInterfaceMessage + ifam.parse = ifam.parseInterfaceAddrMessage + ifmam.parse = ifmam.parseInterfaceMulticastAddrMessage + ifanm.parse = ifanm.parseInterfaceAnnounceMessage + return align, map[int]*wireFormat{ + sysRTM_ADD: rtm, + sysRTM_DELETE: rtm, + sysRTM_CHANGE: rtm, + sysRTM_GET: rtm, + sysRTM_LOSING: rtm, + sysRTM_REDIRECT: rtm, + sysRTM_MISS: rtm, + sysRTM_LOCK: rtm, + sysRTM_RESOLVE: rtm, + sysRTM_NEWADDR: ifam, + sysRTM_DELADDR: ifam, + sysRTM_IFINFO: ifm, + sysRTM_NEWMADDR: ifmam, + sysRTM_DELMADDR: ifmam, + sysRTM_IFANNOUNCE: ifanm, + } +} diff --git a/api/vendor/golang.org/x/net/route/sys_netbsd.go b/api/vendor/golang.org/x/net/route/sys_netbsd.go new file mode 100644 index 0000000..02f71d5 --- /dev/null +++ b/api/vendor/golang.org/x/net/route/sys_netbsd.go @@ -0,0 +1,71 @@ +// 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 route + +func (typ RIBType) parseable() bool { return true } + +// RouteMetrics represents route metrics. +type RouteMetrics struct { + PathMTU int // path maximum transmission unit +} + +// SysType implements the SysType method of Sys interface. +func (rmx *RouteMetrics) SysType() SysType { return SysMetrics } + +// Sys implements the Sys method of Message interface. +func (m *RouteMessage) Sys() []Sys { + return []Sys{ + &RouteMetrics{ + PathMTU: int(nativeEndian.Uint64(m.raw[m.extOff+8 : m.extOff+16])), + }, + } +} + +// RouteMetrics represents route metrics. +type InterfaceMetrics struct { + Type int // interface type + MTU int // maximum transmission unit +} + +// SysType implements the SysType method of Sys interface. +func (imx *InterfaceMetrics) SysType() SysType { return SysMetrics } + +// Sys implements the Sys method of Message interface. +func (m *InterfaceMessage) Sys() []Sys { + return []Sys{ + &InterfaceMetrics{ + Type: int(m.raw[m.extOff]), + MTU: int(nativeEndian.Uint32(m.raw[m.extOff+8 : m.extOff+12])), + }, + } +} + +func probeRoutingStack() (int, map[int]*wireFormat) { + rtm := &wireFormat{extOff: 40, bodyOff: sizeofRtMsghdrNetBSD7} + rtm.parse = rtm.parseRouteMessage + ifm := &wireFormat{extOff: 16, bodyOff: sizeofIfMsghdrNetBSD7} + ifm.parse = ifm.parseInterfaceMessage + ifam := &wireFormat{extOff: sizeofIfaMsghdrNetBSD7, bodyOff: sizeofIfaMsghdrNetBSD7} + ifam.parse = ifam.parseInterfaceAddrMessage + ifanm := &wireFormat{extOff: sizeofIfAnnouncemsghdrNetBSD7, bodyOff: sizeofIfAnnouncemsghdrNetBSD7} + ifanm.parse = ifanm.parseInterfaceAnnounceMessage + // NetBSD 6 and above kernels require 64-bit aligned access to + // routing facilities. + return 8, map[int]*wireFormat{ + sysRTM_ADD: rtm, + sysRTM_DELETE: rtm, + sysRTM_CHANGE: rtm, + sysRTM_GET: rtm, + sysRTM_LOSING: rtm, + sysRTM_REDIRECT: rtm, + sysRTM_MISS: rtm, + sysRTM_LOCK: rtm, + sysRTM_RESOLVE: rtm, + sysRTM_NEWADDR: ifam, + sysRTM_DELADDR: ifam, + sysRTM_IFANNOUNCE: ifanm, + sysRTM_IFINFO: ifm, + } +} diff --git a/api/vendor/golang.org/x/net/route/sys_openbsd.go b/api/vendor/golang.org/x/net/route/sys_openbsd.go new file mode 100644 index 0000000..c5674e8 --- /dev/null +++ b/api/vendor/golang.org/x/net/route/sys_openbsd.go @@ -0,0 +1,80 @@ +// 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 route + +import "unsafe" + +func (typ RIBType) parseable() bool { + switch typ { + case sysNET_RT_STATS, sysNET_RT_TABLE: + return false + default: + return true + } +} + +// RouteMetrics represents route metrics. +type RouteMetrics struct { + PathMTU int // path maximum transmission unit +} + +// SysType implements the SysType method of Sys interface. +func (rmx *RouteMetrics) SysType() SysType { return SysMetrics } + +// Sys implements the Sys method of Message interface. +func (m *RouteMessage) Sys() []Sys { + return []Sys{ + &RouteMetrics{ + PathMTU: int(nativeEndian.Uint32(m.raw[60:64])), + }, + } +} + +// InterfaceMetrics represents interface metrics. +type InterfaceMetrics struct { + Type int // interface type + MTU int // maximum transmission unit +} + +// SysType implements the SysType method of Sys interface. +func (imx *InterfaceMetrics) SysType() SysType { return SysMetrics } + +// Sys implements the Sys method of Message interface. +func (m *InterfaceMessage) Sys() []Sys { + return []Sys{ + &InterfaceMetrics{ + Type: int(m.raw[24]), + MTU: int(nativeEndian.Uint32(m.raw[28:32])), + }, + } +} + +func probeRoutingStack() (int, map[int]*wireFormat) { + var p uintptr + rtm := &wireFormat{extOff: -1, bodyOff: -1} + rtm.parse = rtm.parseRouteMessage + ifm := &wireFormat{extOff: -1, bodyOff: -1} + ifm.parse = ifm.parseInterfaceMessage + ifam := &wireFormat{extOff: -1, bodyOff: -1} + ifam.parse = ifam.parseInterfaceAddrMessage + ifanm := &wireFormat{extOff: -1, bodyOff: -1} + ifanm.parse = ifanm.parseInterfaceAnnounceMessage + return int(unsafe.Sizeof(p)), map[int]*wireFormat{ + sysRTM_ADD: rtm, + sysRTM_DELETE: rtm, + sysRTM_CHANGE: rtm, + sysRTM_GET: rtm, + sysRTM_LOSING: rtm, + sysRTM_REDIRECT: rtm, + sysRTM_MISS: rtm, + sysRTM_LOCK: rtm, + sysRTM_RESOLVE: rtm, + sysRTM_NEWADDR: ifam, + sysRTM_DELADDR: ifam, + sysRTM_IFINFO: ifm, + sysRTM_IFANNOUNCE: ifanm, + sysRTM_DESYNC: rtm, + } +} diff --git a/api/vendor/golang.org/x/net/route/syscall.go b/api/vendor/golang.org/x/net/route/syscall.go new file mode 100644 index 0000000..5f69ea6 --- /dev/null +++ b/api/vendor/golang.org/x/net/route/syscall.go @@ -0,0 +1,28 @@ +// 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. + +// +build darwin dragonfly freebsd netbsd openbsd + +package route + +import ( + "syscall" + "unsafe" +) + +var zero uintptr + +func sysctl(mib []int32, old *byte, oldlen *uintptr, new *byte, newlen uintptr) error { + var p unsafe.Pointer + if len(mib) > 0 { + p = unsafe.Pointer(&mib[0]) + } else { + p = unsafe.Pointer(&zero) + } + _, _, errno := syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(p), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), newlen) + if errno != 0 { + return error(errno) + } + return nil +} diff --git a/api/vendor/golang.org/x/net/route/zsys_darwin.go b/api/vendor/golang.org/x/net/route/zsys_darwin.go new file mode 100644 index 0000000..4e2e1ab --- /dev/null +++ b/api/vendor/golang.org/x/net/route/zsys_darwin.go @@ -0,0 +1,99 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_darwin.go + +package route + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_ROUTE = 0x11 + sysAF_LINK = 0x12 + sysAF_INET6 = 0x1e + + sysSOCK_RAW = 0x3 + + sysNET_RT_DUMP = 0x1 + sysNET_RT_FLAGS = 0x2 + sysNET_RT_IFLIST = 0x3 + sysNET_RT_STAT = 0x4 + sysNET_RT_TRASH = 0x5 + sysNET_RT_IFLIST2 = 0x6 + sysNET_RT_DUMP2 = 0x7 + sysNET_RT_MAXID = 0xa +) + +const ( + sysCTL_MAXNAME = 0xc + + sysCTL_UNSPEC = 0x0 + sysCTL_KERN = 0x1 + sysCTL_VM = 0x2 + sysCTL_VFS = 0x3 + sysCTL_NET = 0x4 + sysCTL_DEBUG = 0x5 + sysCTL_HW = 0x6 + sysCTL_MACHDEP = 0x7 + sysCTL_USER = 0x8 + sysCTL_MAXID = 0x9 +) + +const ( + sysRTM_VERSION = 0x5 + + sysRTM_ADD = 0x1 + sysRTM_DELETE = 0x2 + sysRTM_CHANGE = 0x3 + sysRTM_GET = 0x4 + sysRTM_LOSING = 0x5 + sysRTM_REDIRECT = 0x6 + sysRTM_MISS = 0x7 + sysRTM_LOCK = 0x8 + sysRTM_OLDADD = 0x9 + sysRTM_OLDDEL = 0xa + sysRTM_RESOLVE = 0xb + sysRTM_NEWADDR = 0xc + sysRTM_DELADDR = 0xd + sysRTM_IFINFO = 0xe + sysRTM_NEWMADDR = 0xf + sysRTM_DELMADDR = 0x10 + sysRTM_IFINFO2 = 0x12 + sysRTM_NEWMADDR2 = 0x13 + sysRTM_GET2 = 0x14 + + sysRTA_DST = 0x1 + sysRTA_GATEWAY = 0x2 + sysRTA_NETMASK = 0x4 + sysRTA_GENMASK = 0x8 + sysRTA_IFP = 0x10 + sysRTA_IFA = 0x20 + sysRTA_AUTHOR = 0x40 + sysRTA_BRD = 0x80 + + sysRTAX_DST = 0x0 + sysRTAX_GATEWAY = 0x1 + sysRTAX_NETMASK = 0x2 + sysRTAX_GENMASK = 0x3 + sysRTAX_IFP = 0x4 + sysRTAX_IFA = 0x5 + sysRTAX_AUTHOR = 0x6 + sysRTAX_BRD = 0x7 + sysRTAX_MAX = 0x8 +) + +const ( + sizeofIfMsghdrDarwin15 = 0x70 + sizeofIfaMsghdrDarwin15 = 0x14 + sizeofIfmaMsghdrDarwin15 = 0x10 + sizeofIfMsghdr2Darwin15 = 0xa0 + sizeofIfmaMsghdr2Darwin15 = 0x14 + sizeofIfDataDarwin15 = 0x60 + sizeofIfData64Darwin15 = 0x80 + + sizeofRtMsghdrDarwin15 = 0x5c + sizeofRtMsghdr2Darwin15 = 0x5c + sizeofRtMetricsDarwin15 = 0x38 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/vendor/golang.org/x/net/route/zsys_dragonfly.go b/api/vendor/golang.org/x/net/route/zsys_dragonfly.go new file mode 100644 index 0000000..719c88d --- /dev/null +++ b/api/vendor/golang.org/x/net/route/zsys_dragonfly.go @@ -0,0 +1,98 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_dragonfly.go + +package route + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_ROUTE = 0x11 + sysAF_LINK = 0x12 + sysAF_INET6 = 0x1c + + sysSOCK_RAW = 0x3 + + sysNET_RT_DUMP = 0x1 + sysNET_RT_FLAGS = 0x2 + sysNET_RT_IFLIST = 0x3 + sysNET_RT_MAXID = 0x4 +) + +const ( + sysCTL_MAXNAME = 0xc + + sysCTL_UNSPEC = 0x0 + sysCTL_KERN = 0x1 + sysCTL_VM = 0x2 + sysCTL_VFS = 0x3 + sysCTL_NET = 0x4 + sysCTL_DEBUG = 0x5 + sysCTL_HW = 0x6 + sysCTL_MACHDEP = 0x7 + sysCTL_USER = 0x8 + sysCTL_P1003_1B = 0x9 + sysCTL_LWKT = 0xa + sysCTL_MAXID = 0xb +) + +const ( + sysRTM_VERSION = 0x6 + + sysRTM_ADD = 0x1 + sysRTM_DELETE = 0x2 + sysRTM_CHANGE = 0x3 + sysRTM_GET = 0x4 + sysRTM_LOSING = 0x5 + sysRTM_REDIRECT = 0x6 + sysRTM_MISS = 0x7 + sysRTM_LOCK = 0x8 + sysRTM_OLDADD = 0x9 + sysRTM_OLDDEL = 0xa + sysRTM_RESOLVE = 0xb + sysRTM_NEWADDR = 0xc + sysRTM_DELADDR = 0xd + sysRTM_IFINFO = 0xe + sysRTM_NEWMADDR = 0xf + sysRTM_DELMADDR = 0x10 + sysRTM_IFANNOUNCE = 0x11 + sysRTM_IEEE80211 = 0x12 + + sysRTA_DST = 0x1 + sysRTA_GATEWAY = 0x2 + sysRTA_NETMASK = 0x4 + sysRTA_GENMASK = 0x8 + sysRTA_IFP = 0x10 + sysRTA_IFA = 0x20 + sysRTA_AUTHOR = 0x40 + sysRTA_BRD = 0x80 + sysRTA_MPLS1 = 0x100 + sysRTA_MPLS2 = 0x200 + sysRTA_MPLS3 = 0x400 + + sysRTAX_DST = 0x0 + sysRTAX_GATEWAY = 0x1 + sysRTAX_NETMASK = 0x2 + sysRTAX_GENMASK = 0x3 + sysRTAX_IFP = 0x4 + sysRTAX_IFA = 0x5 + sysRTAX_AUTHOR = 0x6 + sysRTAX_BRD = 0x7 + sysRTAX_MPLS1 = 0x8 + sysRTAX_MPLS2 = 0x9 + sysRTAX_MPLS3 = 0xa + sysRTAX_MAX = 0xb +) + +const ( + sizeofIfMsghdrDragonFlyBSD4 = 0xb0 + sizeofIfaMsghdrDragonFlyBSD4 = 0x14 + sizeofIfmaMsghdrDragonFlyBSD4 = 0x10 + sizeofIfAnnouncemsghdrDragonFlyBSD4 = 0x18 + + sizeofRtMsghdrDragonFlyBSD4 = 0x98 + sizeofRtMetricsDragonFlyBSD4 = 0x70 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/vendor/golang.org/x/net/route/zsys_freebsd_386.go b/api/vendor/golang.org/x/net/route/zsys_freebsd_386.go new file mode 100644 index 0000000..b03bc01 --- /dev/null +++ b/api/vendor/golang.org/x/net/route/zsys_freebsd_386.go @@ -0,0 +1,126 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_freebsd.go + +package route + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_ROUTE = 0x11 + sysAF_LINK = 0x12 + sysAF_INET6 = 0x1c + + sysSOCK_RAW = 0x3 + + sysNET_RT_DUMP = 0x1 + sysNET_RT_FLAGS = 0x2 + sysNET_RT_IFLIST = 0x3 + sysNET_RT_IFMALIST = 0x4 + sysNET_RT_IFLISTL = 0x5 +) + +const ( + sysCTL_MAXNAME = 0x18 + + sysCTL_UNSPEC = 0x0 + sysCTL_KERN = 0x1 + sysCTL_VM = 0x2 + sysCTL_VFS = 0x3 + sysCTL_NET = 0x4 + sysCTL_DEBUG = 0x5 + sysCTL_HW = 0x6 + sysCTL_MACHDEP = 0x7 + sysCTL_USER = 0x8 + sysCTL_P1003_1B = 0x9 +) + +const ( + sysRTM_VERSION = 0x5 + + sysRTM_ADD = 0x1 + sysRTM_DELETE = 0x2 + sysRTM_CHANGE = 0x3 + sysRTM_GET = 0x4 + sysRTM_LOSING = 0x5 + sysRTM_REDIRECT = 0x6 + sysRTM_MISS = 0x7 + sysRTM_LOCK = 0x8 + sysRTM_RESOLVE = 0xb + sysRTM_NEWADDR = 0xc + sysRTM_DELADDR = 0xd + sysRTM_IFINFO = 0xe + sysRTM_NEWMADDR = 0xf + sysRTM_DELMADDR = 0x10 + sysRTM_IFANNOUNCE = 0x11 + sysRTM_IEEE80211 = 0x12 + + sysRTA_DST = 0x1 + sysRTA_GATEWAY = 0x2 + sysRTA_NETMASK = 0x4 + sysRTA_GENMASK = 0x8 + sysRTA_IFP = 0x10 + sysRTA_IFA = 0x20 + sysRTA_AUTHOR = 0x40 + sysRTA_BRD = 0x80 + + sysRTAX_DST = 0x0 + sysRTAX_GATEWAY = 0x1 + sysRTAX_NETMASK = 0x2 + sysRTAX_GENMASK = 0x3 + sysRTAX_IFP = 0x4 + sysRTAX_IFA = 0x5 + sysRTAX_AUTHOR = 0x6 + sysRTAX_BRD = 0x7 + sysRTAX_MAX = 0x8 +) + +const ( + sizeofIfMsghdrlFreeBSD10 = 0x68 + sizeofIfaMsghdrFreeBSD10 = 0x14 + sizeofIfaMsghdrlFreeBSD10 = 0x6c + sizeofIfmaMsghdrFreeBSD10 = 0x10 + sizeofIfAnnouncemsghdrFreeBSD10 = 0x18 + + sizeofRtMsghdrFreeBSD10 = 0x5c + sizeofRtMetricsFreeBSD10 = 0x38 + + sizeofIfMsghdrFreeBSD7 = 0x60 + sizeofIfMsghdrFreeBSD8 = 0x60 + sizeofIfMsghdrFreeBSD9 = 0x60 + sizeofIfMsghdrFreeBSD10 = 0x64 + sizeofIfMsghdrFreeBSD11 = 0xa8 + + sizeofIfDataFreeBSD7 = 0x50 + sizeofIfDataFreeBSD8 = 0x50 + sizeofIfDataFreeBSD9 = 0x50 + sizeofIfDataFreeBSD10 = 0x54 + sizeofIfDataFreeBSD11 = 0x98 + + // MODIFIED BY HAND FOR 386 EMULATION ON AMD64 + // 386 EMULATION USES THE UNDERLYING RAW DATA LAYOUT + + sizeofIfMsghdrlFreeBSD10Emu = 0xb0 + sizeofIfaMsghdrFreeBSD10Emu = 0x14 + sizeofIfaMsghdrlFreeBSD10Emu = 0xb0 + sizeofIfmaMsghdrFreeBSD10Emu = 0x10 + sizeofIfAnnouncemsghdrFreeBSD10Emu = 0x18 + + sizeofRtMsghdrFreeBSD10Emu = 0x98 + sizeofRtMetricsFreeBSD10Emu = 0x70 + + sizeofIfMsghdrFreeBSD7Emu = 0xa8 + sizeofIfMsghdrFreeBSD8Emu = 0xa8 + sizeofIfMsghdrFreeBSD9Emu = 0xa8 + sizeofIfMsghdrFreeBSD10Emu = 0xa8 + sizeofIfMsghdrFreeBSD11Emu = 0xa8 + + sizeofIfDataFreeBSD7Emu = 0x98 + sizeofIfDataFreeBSD8Emu = 0x98 + sizeofIfDataFreeBSD9Emu = 0x98 + sizeofIfDataFreeBSD10Emu = 0x98 + sizeofIfDataFreeBSD11Emu = 0x98 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/vendor/golang.org/x/net/route/zsys_freebsd_amd64.go b/api/vendor/golang.org/x/net/route/zsys_freebsd_amd64.go new file mode 100644 index 0000000..0b675b3 --- /dev/null +++ b/api/vendor/golang.org/x/net/route/zsys_freebsd_amd64.go @@ -0,0 +1,123 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_freebsd.go + +package route + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_ROUTE = 0x11 + sysAF_LINK = 0x12 + sysAF_INET6 = 0x1c + + sysSOCK_RAW = 0x3 + + sysNET_RT_DUMP = 0x1 + sysNET_RT_FLAGS = 0x2 + sysNET_RT_IFLIST = 0x3 + sysNET_RT_IFMALIST = 0x4 + sysNET_RT_IFLISTL = 0x5 +) + +const ( + sysCTL_MAXNAME = 0x18 + + sysCTL_UNSPEC = 0x0 + sysCTL_KERN = 0x1 + sysCTL_VM = 0x2 + sysCTL_VFS = 0x3 + sysCTL_NET = 0x4 + sysCTL_DEBUG = 0x5 + sysCTL_HW = 0x6 + sysCTL_MACHDEP = 0x7 + sysCTL_USER = 0x8 + sysCTL_P1003_1B = 0x9 +) + +const ( + sysRTM_VERSION = 0x5 + + sysRTM_ADD = 0x1 + sysRTM_DELETE = 0x2 + sysRTM_CHANGE = 0x3 + sysRTM_GET = 0x4 + sysRTM_LOSING = 0x5 + sysRTM_REDIRECT = 0x6 + sysRTM_MISS = 0x7 + sysRTM_LOCK = 0x8 + sysRTM_RESOLVE = 0xb + sysRTM_NEWADDR = 0xc + sysRTM_DELADDR = 0xd + sysRTM_IFINFO = 0xe + sysRTM_NEWMADDR = 0xf + sysRTM_DELMADDR = 0x10 + sysRTM_IFANNOUNCE = 0x11 + sysRTM_IEEE80211 = 0x12 + + sysRTA_DST = 0x1 + sysRTA_GATEWAY = 0x2 + sysRTA_NETMASK = 0x4 + sysRTA_GENMASK = 0x8 + sysRTA_IFP = 0x10 + sysRTA_IFA = 0x20 + sysRTA_AUTHOR = 0x40 + sysRTA_BRD = 0x80 + + sysRTAX_DST = 0x0 + sysRTAX_GATEWAY = 0x1 + sysRTAX_NETMASK = 0x2 + sysRTAX_GENMASK = 0x3 + sysRTAX_IFP = 0x4 + sysRTAX_IFA = 0x5 + sysRTAX_AUTHOR = 0x6 + sysRTAX_BRD = 0x7 + sysRTAX_MAX = 0x8 +) + +const ( + sizeofIfMsghdrlFreeBSD10 = 0xb0 + sizeofIfaMsghdrFreeBSD10 = 0x14 + sizeofIfaMsghdrlFreeBSD10 = 0xb0 + sizeofIfmaMsghdrFreeBSD10 = 0x10 + sizeofIfAnnouncemsghdrFreeBSD10 = 0x18 + + sizeofRtMsghdrFreeBSD10 = 0x98 + sizeofRtMetricsFreeBSD10 = 0x70 + + sizeofIfMsghdrFreeBSD7 = 0xa8 + sizeofIfMsghdrFreeBSD8 = 0xa8 + sizeofIfMsghdrFreeBSD9 = 0xa8 + sizeofIfMsghdrFreeBSD10 = 0xa8 + sizeofIfMsghdrFreeBSD11 = 0xa8 + + sizeofIfDataFreeBSD7 = 0x98 + sizeofIfDataFreeBSD8 = 0x98 + sizeofIfDataFreeBSD9 = 0x98 + sizeofIfDataFreeBSD10 = 0x98 + sizeofIfDataFreeBSD11 = 0x98 + + sizeofIfMsghdrlFreeBSD10Emu = 0xb0 + sizeofIfaMsghdrFreeBSD10Emu = 0x14 + sizeofIfaMsghdrlFreeBSD10Emu = 0xb0 + sizeofIfmaMsghdrFreeBSD10Emu = 0x10 + sizeofIfAnnouncemsghdrFreeBSD10Emu = 0x18 + + sizeofRtMsghdrFreeBSD10Emu = 0x98 + sizeofRtMetricsFreeBSD10Emu = 0x70 + + sizeofIfMsghdrFreeBSD7Emu = 0xa8 + sizeofIfMsghdrFreeBSD8Emu = 0xa8 + sizeofIfMsghdrFreeBSD9Emu = 0xa8 + sizeofIfMsghdrFreeBSD10Emu = 0xa8 + sizeofIfMsghdrFreeBSD11Emu = 0xa8 + + sizeofIfDataFreeBSD7Emu = 0x98 + sizeofIfDataFreeBSD8Emu = 0x98 + sizeofIfDataFreeBSD9Emu = 0x98 + sizeofIfDataFreeBSD10Emu = 0x98 + sizeofIfDataFreeBSD11Emu = 0x98 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/vendor/golang.org/x/net/route/zsys_freebsd_arm.go b/api/vendor/golang.org/x/net/route/zsys_freebsd_arm.go new file mode 100644 index 0000000..58f8ea1 --- /dev/null +++ b/api/vendor/golang.org/x/net/route/zsys_freebsd_arm.go @@ -0,0 +1,123 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_freebsd.go + +package route + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_ROUTE = 0x11 + sysAF_LINK = 0x12 + sysAF_INET6 = 0x1c + + sysSOCK_RAW = 0x3 + + sysNET_RT_DUMP = 0x1 + sysNET_RT_FLAGS = 0x2 + sysNET_RT_IFLIST = 0x3 + sysNET_RT_IFMALIST = 0x4 + sysNET_RT_IFLISTL = 0x5 +) + +const ( + sysCTL_MAXNAME = 0x18 + + sysCTL_UNSPEC = 0x0 + sysCTL_KERN = 0x1 + sysCTL_VM = 0x2 + sysCTL_VFS = 0x3 + sysCTL_NET = 0x4 + sysCTL_DEBUG = 0x5 + sysCTL_HW = 0x6 + sysCTL_MACHDEP = 0x7 + sysCTL_USER = 0x8 + sysCTL_P1003_1B = 0x9 +) + +const ( + sysRTM_VERSION = 0x5 + + sysRTM_ADD = 0x1 + sysRTM_DELETE = 0x2 + sysRTM_CHANGE = 0x3 + sysRTM_GET = 0x4 + sysRTM_LOSING = 0x5 + sysRTM_REDIRECT = 0x6 + sysRTM_MISS = 0x7 + sysRTM_LOCK = 0x8 + sysRTM_RESOLVE = 0xb + sysRTM_NEWADDR = 0xc + sysRTM_DELADDR = 0xd + sysRTM_IFINFO = 0xe + sysRTM_NEWMADDR = 0xf + sysRTM_DELMADDR = 0x10 + sysRTM_IFANNOUNCE = 0x11 + sysRTM_IEEE80211 = 0x12 + + sysRTA_DST = 0x1 + sysRTA_GATEWAY = 0x2 + sysRTA_NETMASK = 0x4 + sysRTA_GENMASK = 0x8 + sysRTA_IFP = 0x10 + sysRTA_IFA = 0x20 + sysRTA_AUTHOR = 0x40 + sysRTA_BRD = 0x80 + + sysRTAX_DST = 0x0 + sysRTAX_GATEWAY = 0x1 + sysRTAX_NETMASK = 0x2 + sysRTAX_GENMASK = 0x3 + sysRTAX_IFP = 0x4 + sysRTAX_IFA = 0x5 + sysRTAX_AUTHOR = 0x6 + sysRTAX_BRD = 0x7 + sysRTAX_MAX = 0x8 +) + +const ( + sizeofIfMsghdrlFreeBSD10 = 0x68 + sizeofIfaMsghdrFreeBSD10 = 0x14 + sizeofIfaMsghdrlFreeBSD10 = 0x6c + sizeofIfmaMsghdrFreeBSD10 = 0x10 + sizeofIfAnnouncemsghdrFreeBSD10 = 0x18 + + sizeofRtMsghdrFreeBSD10 = 0x5c + sizeofRtMetricsFreeBSD10 = 0x38 + + sizeofIfMsghdrFreeBSD7 = 0x70 + sizeofIfMsghdrFreeBSD8 = 0x70 + sizeofIfMsghdrFreeBSD9 = 0x70 + sizeofIfMsghdrFreeBSD10 = 0x70 + sizeofIfMsghdrFreeBSD11 = 0xa8 + + sizeofIfDataFreeBSD7 = 0x60 + sizeofIfDataFreeBSD8 = 0x60 + sizeofIfDataFreeBSD9 = 0x60 + sizeofIfDataFreeBSD10 = 0x60 + sizeofIfDataFreeBSD11 = 0x98 + + sizeofIfMsghdrlFreeBSD10Emu = 0x68 + sizeofIfaMsghdrFreeBSD10Emu = 0x14 + sizeofIfaMsghdrlFreeBSD10Emu = 0x6c + sizeofIfmaMsghdrFreeBSD10Emu = 0x10 + sizeofIfAnnouncemsghdrFreeBSD10Emu = 0x18 + + sizeofRtMsghdrFreeBSD10Emu = 0x5c + sizeofRtMetricsFreeBSD10Emu = 0x38 + + sizeofIfMsghdrFreeBSD7Emu = 0x70 + sizeofIfMsghdrFreeBSD8Emu = 0x70 + sizeofIfMsghdrFreeBSD9Emu = 0x70 + sizeofIfMsghdrFreeBSD10Emu = 0x70 + sizeofIfMsghdrFreeBSD11Emu = 0xa8 + + sizeofIfDataFreeBSD7Emu = 0x60 + sizeofIfDataFreeBSD8Emu = 0x60 + sizeofIfDataFreeBSD9Emu = 0x60 + sizeofIfDataFreeBSD10Emu = 0x60 + sizeofIfDataFreeBSD11Emu = 0x98 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/vendor/golang.org/x/net/route/zsys_netbsd.go b/api/vendor/golang.org/x/net/route/zsys_netbsd.go new file mode 100644 index 0000000..e0df45e --- /dev/null +++ b/api/vendor/golang.org/x/net/route/zsys_netbsd.go @@ -0,0 +1,97 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_netbsd.go + +package route + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_ROUTE = 0x22 + sysAF_LINK = 0x12 + sysAF_INET6 = 0x18 + + sysSOCK_RAW = 0x3 + + sysNET_RT_DUMP = 0x1 + sysNET_RT_FLAGS = 0x2 + sysNET_RT_IFLIST = 0x5 + sysNET_RT_MAXID = 0x6 +) + +const ( + sysCTL_MAXNAME = 0xc + + sysCTL_UNSPEC = 0x0 + sysCTL_KERN = 0x1 + sysCTL_VM = 0x2 + sysCTL_VFS = 0x3 + sysCTL_NET = 0x4 + sysCTL_DEBUG = 0x5 + sysCTL_HW = 0x6 + sysCTL_MACHDEP = 0x7 + sysCTL_USER = 0x8 + sysCTL_DDB = 0x9 + sysCTL_PROC = 0xa + sysCTL_VENDOR = 0xb + sysCTL_EMUL = 0xc + sysCTL_SECURITY = 0xd + sysCTL_MAXID = 0xe +) + +const ( + sysRTM_VERSION = 0x4 + + sysRTM_ADD = 0x1 + sysRTM_DELETE = 0x2 + sysRTM_CHANGE = 0x3 + sysRTM_GET = 0x4 + sysRTM_LOSING = 0x5 + sysRTM_REDIRECT = 0x6 + sysRTM_MISS = 0x7 + sysRTM_LOCK = 0x8 + sysRTM_OLDADD = 0x9 + sysRTM_OLDDEL = 0xa + sysRTM_RESOLVE = 0xb + sysRTM_NEWADDR = 0xc + sysRTM_DELADDR = 0xd + sysRTM_IFANNOUNCE = 0x10 + sysRTM_IEEE80211 = 0x11 + sysRTM_SETGATE = 0x12 + sysRTM_LLINFO_UPD = 0x13 + sysRTM_IFINFO = 0x14 + sysRTM_CHGADDR = 0x15 + + sysRTA_DST = 0x1 + sysRTA_GATEWAY = 0x2 + sysRTA_NETMASK = 0x4 + sysRTA_GENMASK = 0x8 + sysRTA_IFP = 0x10 + sysRTA_IFA = 0x20 + sysRTA_AUTHOR = 0x40 + sysRTA_BRD = 0x80 + sysRTA_TAG = 0x100 + + sysRTAX_DST = 0x0 + sysRTAX_GATEWAY = 0x1 + sysRTAX_NETMASK = 0x2 + sysRTAX_GENMASK = 0x3 + sysRTAX_IFP = 0x4 + sysRTAX_IFA = 0x5 + sysRTAX_AUTHOR = 0x6 + sysRTAX_BRD = 0x7 + sysRTAX_TAG = 0x8 + sysRTAX_MAX = 0x9 +) + +const ( + sizeofIfMsghdrNetBSD7 = 0x98 + sizeofIfaMsghdrNetBSD7 = 0x18 + sizeofIfAnnouncemsghdrNetBSD7 = 0x18 + + sizeofRtMsghdrNetBSD7 = 0x78 + sizeofRtMetricsNetBSD7 = 0x50 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/vendor/golang.org/x/net/route/zsys_openbsd.go b/api/vendor/golang.org/x/net/route/zsys_openbsd.go new file mode 100644 index 0000000..db8c8ef --- /dev/null +++ b/api/vendor/golang.org/x/net/route/zsys_openbsd.go @@ -0,0 +1,101 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_openbsd.go + +package route + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_ROUTE = 0x11 + sysAF_LINK = 0x12 + sysAF_INET6 = 0x18 + + sysSOCK_RAW = 0x3 + + sysNET_RT_DUMP = 0x1 + sysNET_RT_FLAGS = 0x2 + sysNET_RT_IFLIST = 0x3 + sysNET_RT_STATS = 0x4 + sysNET_RT_TABLE = 0x5 + sysNET_RT_IFNAMES = 0x6 + sysNET_RT_MAXID = 0x7 +) + +const ( + sysCTL_MAXNAME = 0xc + + sysCTL_UNSPEC = 0x0 + sysCTL_KERN = 0x1 + sysCTL_VM = 0x2 + sysCTL_FS = 0x3 + sysCTL_NET = 0x4 + sysCTL_DEBUG = 0x5 + sysCTL_HW = 0x6 + sysCTL_MACHDEP = 0x7 + sysCTL_DDB = 0x9 + sysCTL_VFS = 0xa + sysCTL_MAXID = 0xb +) + +const ( + sysRTM_VERSION = 0x5 + + sysRTM_ADD = 0x1 + sysRTM_DELETE = 0x2 + sysRTM_CHANGE = 0x3 + sysRTM_GET = 0x4 + sysRTM_LOSING = 0x5 + sysRTM_REDIRECT = 0x6 + sysRTM_MISS = 0x7 + sysRTM_LOCK = 0x8 + sysRTM_RESOLVE = 0xb + sysRTM_NEWADDR = 0xc + sysRTM_DELADDR = 0xd + sysRTM_IFINFO = 0xe + sysRTM_IFANNOUNCE = 0xf + sysRTM_DESYNC = 0x10 + sysRTM_INVALIDATE = 0x11 + sysRTM_BFD = 0x12 + sysRTM_PROPOSAL = 0x13 + + sysRTA_DST = 0x1 + sysRTA_GATEWAY = 0x2 + sysRTA_NETMASK = 0x4 + sysRTA_GENMASK = 0x8 + sysRTA_IFP = 0x10 + sysRTA_IFA = 0x20 + sysRTA_AUTHOR = 0x40 + sysRTA_BRD = 0x80 + sysRTA_SRC = 0x100 + sysRTA_SRCMASK = 0x200 + sysRTA_LABEL = 0x400 + sysRTA_BFD = 0x800 + sysRTA_DNS = 0x1000 + sysRTA_STATIC = 0x2000 + sysRTA_SEARCH = 0x4000 + + sysRTAX_DST = 0x0 + sysRTAX_GATEWAY = 0x1 + sysRTAX_NETMASK = 0x2 + sysRTAX_GENMASK = 0x3 + sysRTAX_IFP = 0x4 + sysRTAX_IFA = 0x5 + sysRTAX_AUTHOR = 0x6 + sysRTAX_BRD = 0x7 + sysRTAX_SRC = 0x8 + sysRTAX_SRCMASK = 0x9 + sysRTAX_LABEL = 0xa + sysRTAX_BFD = 0xb + sysRTAX_DNS = 0xc + sysRTAX_STATIC = 0xd + sysRTAX_SEARCH = 0xe + sysRTAX_MAX = 0xf +) + +const ( + sizeofRtMsghdr = 0x60 + + sizeofSockaddrStorage = 0x100 + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/api/vendor/golang.org/x/net/trace/events.go b/api/vendor/golang.org/x/net/trace/events.go new file mode 100644 index 0000000..c646a69 --- /dev/null +++ b/api/vendor/golang.org/x/net/trace/events.go @@ -0,0 +1,532 @@ +// Copyright 2015 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 trace + +import ( + "bytes" + "fmt" + "html/template" + "io" + "log" + "net/http" + "runtime" + "sort" + "strconv" + "strings" + "sync" + "sync/atomic" + "text/tabwriter" + "time" +) + +const maxEventsPerLog = 100 + +type bucket struct { + MaxErrAge time.Duration + String string +} + +var buckets = []bucket{ + {0, "total"}, + {10 * time.Second, "errs<10s"}, + {1 * time.Minute, "errs<1m"}, + {10 * time.Minute, "errs<10m"}, + {1 * time.Hour, "errs<1h"}, + {10 * time.Hour, "errs<10h"}, + {24000 * time.Hour, "errors"}, +} + +// RenderEvents renders the HTML page typically served at /debug/events. +// It does not do any auth checking. The request may be nil. +// +// Most users will use the Events handler. +func RenderEvents(w http.ResponseWriter, req *http.Request, sensitive bool) { + now := time.Now() + data := &struct { + Families []string // family names + Buckets []bucket + Counts [][]int // eventLog count per family/bucket + + // Set when a bucket has been selected. + Family string + Bucket int + EventLogs eventLogs + Expanded bool + }{ + Buckets: buckets, + } + + data.Families = make([]string, 0, len(families)) + famMu.RLock() + for name := range families { + data.Families = append(data.Families, name) + } + famMu.RUnlock() + sort.Strings(data.Families) + + // Count the number of eventLogs in each family for each error age. + data.Counts = make([][]int, len(data.Families)) + for i, name := range data.Families { + // TODO(sameer): move this loop under the family lock. + f := getEventFamily(name) + data.Counts[i] = make([]int, len(data.Buckets)) + for j, b := range data.Buckets { + data.Counts[i][j] = f.Count(now, b.MaxErrAge) + } + } + + if req != nil { + var ok bool + data.Family, data.Bucket, ok = parseEventsArgs(req) + if !ok { + // No-op + } else { + data.EventLogs = getEventFamily(data.Family).Copy(now, buckets[data.Bucket].MaxErrAge) + } + if data.EventLogs != nil { + defer data.EventLogs.Free() + sort.Sort(data.EventLogs) + } + if exp, err := strconv.ParseBool(req.FormValue("exp")); err == nil { + data.Expanded = exp + } + } + + famMu.RLock() + defer famMu.RUnlock() + if err := eventsTmpl().Execute(w, data); err != nil { + log.Printf("net/trace: Failed executing template: %v", err) + } +} + +func parseEventsArgs(req *http.Request) (fam string, b int, ok bool) { + fam, bStr := req.FormValue("fam"), req.FormValue("b") + if fam == "" || bStr == "" { + return "", 0, false + } + b, err := strconv.Atoi(bStr) + if err != nil || b < 0 || b >= len(buckets) { + return "", 0, false + } + return fam, b, true +} + +// An EventLog provides a log of events associated with a specific object. +type EventLog interface { + // Printf formats its arguments with fmt.Sprintf and adds the + // result to the event log. + Printf(format string, a ...interface{}) + + // Errorf is like Printf, but it marks this event as an error. + Errorf(format string, a ...interface{}) + + // Finish declares that this event log is complete. + // The event log should not be used after calling this method. + Finish() +} + +// NewEventLog returns a new EventLog with the specified family name +// and title. +func NewEventLog(family, title string) EventLog { + el := newEventLog() + el.ref() + el.Family, el.Title = family, title + el.Start = time.Now() + el.events = make([]logEntry, 0, maxEventsPerLog) + el.stack = make([]uintptr, 32) + n := runtime.Callers(2, el.stack) + el.stack = el.stack[:n] + + getEventFamily(family).add(el) + return el +} + +func (el *eventLog) Finish() { + getEventFamily(el.Family).remove(el) + el.unref() // matches ref in New +} + +var ( + famMu sync.RWMutex + families = make(map[string]*eventFamily) // family name => family +) + +func getEventFamily(fam string) *eventFamily { + famMu.Lock() + defer famMu.Unlock() + f := families[fam] + if f == nil { + f = &eventFamily{} + families[fam] = f + } + return f +} + +type eventFamily struct { + mu sync.RWMutex + eventLogs eventLogs +} + +func (f *eventFamily) add(el *eventLog) { + f.mu.Lock() + f.eventLogs = append(f.eventLogs, el) + f.mu.Unlock() +} + +func (f *eventFamily) remove(el *eventLog) { + f.mu.Lock() + defer f.mu.Unlock() + for i, el0 := range f.eventLogs { + if el == el0 { + copy(f.eventLogs[i:], f.eventLogs[i+1:]) + f.eventLogs = f.eventLogs[:len(f.eventLogs)-1] + return + } + } +} + +func (f *eventFamily) Count(now time.Time, maxErrAge time.Duration) (n int) { + f.mu.RLock() + defer f.mu.RUnlock() + for _, el := range f.eventLogs { + if el.hasRecentError(now, maxErrAge) { + n++ + } + } + return +} + +func (f *eventFamily) Copy(now time.Time, maxErrAge time.Duration) (els eventLogs) { + f.mu.RLock() + defer f.mu.RUnlock() + els = make(eventLogs, 0, len(f.eventLogs)) + for _, el := range f.eventLogs { + if el.hasRecentError(now, maxErrAge) { + el.ref() + els = append(els, el) + } + } + return +} + +type eventLogs []*eventLog + +// Free calls unref on each element of the list. +func (els eventLogs) Free() { + for _, el := range els { + el.unref() + } +} + +// eventLogs may be sorted in reverse chronological order. +func (els eventLogs) Len() int { return len(els) } +func (els eventLogs) Less(i, j int) bool { return els[i].Start.After(els[j].Start) } +func (els eventLogs) Swap(i, j int) { els[i], els[j] = els[j], els[i] } + +// A logEntry is a timestamped log entry in an event log. +type logEntry struct { + When time.Time + Elapsed time.Duration // since previous event in log + NewDay bool // whether this event is on a different day to the previous event + What string + IsErr bool +} + +// WhenString returns a string representation of the elapsed time of the event. +// It will include the date if midnight was crossed. +func (e logEntry) WhenString() string { + if e.NewDay { + return e.When.Format("2006/01/02 15:04:05.000000") + } + return e.When.Format("15:04:05.000000") +} + +// An eventLog represents an active event log. +type eventLog struct { + // Family is the top-level grouping of event logs to which this belongs. + Family string + + // Title is the title of this event log. + Title string + + // Timing information. + Start time.Time + + // Call stack where this event log was created. + stack []uintptr + + // Append-only sequence of events. + // + // TODO(sameer): change this to a ring buffer to avoid the array copy + // when we hit maxEventsPerLog. + mu sync.RWMutex + events []logEntry + LastErrorTime time.Time + discarded int + + refs int32 // how many buckets this is in +} + +func (el *eventLog) reset() { + // Clear all but the mutex. Mutexes may not be copied, even when unlocked. + el.Family = "" + el.Title = "" + el.Start = time.Time{} + el.stack = nil + el.events = nil + el.LastErrorTime = time.Time{} + el.discarded = 0 + el.refs = 0 +} + +func (el *eventLog) hasRecentError(now time.Time, maxErrAge time.Duration) bool { + if maxErrAge == 0 { + return true + } + el.mu.RLock() + defer el.mu.RUnlock() + return now.Sub(el.LastErrorTime) < maxErrAge +} + +// delta returns the elapsed time since the last event or the log start, +// and whether it spans midnight. +// L >= el.mu +func (el *eventLog) delta(t time.Time) (time.Duration, bool) { + if len(el.events) == 0 { + return t.Sub(el.Start), false + } + prev := el.events[len(el.events)-1].When + return t.Sub(prev), prev.Day() != t.Day() + +} + +func (el *eventLog) Printf(format string, a ...interface{}) { + el.printf(false, format, a...) +} + +func (el *eventLog) Errorf(format string, a ...interface{}) { + el.printf(true, format, a...) +} + +func (el *eventLog) printf(isErr bool, format string, a ...interface{}) { + e := logEntry{When: time.Now(), IsErr: isErr, What: fmt.Sprintf(format, a...)} + el.mu.Lock() + e.Elapsed, e.NewDay = el.delta(e.When) + if len(el.events) < maxEventsPerLog { + el.events = append(el.events, e) + } else { + // Discard the oldest event. + if el.discarded == 0 { + // el.discarded starts at two to count for the event it + // is replacing, plus the next one that we are about to + // drop. + el.discarded = 2 + } else { + el.discarded++ + } + // TODO(sameer): if this causes allocations on a critical path, + // change eventLog.What to be a fmt.Stringer, as in trace.go. + el.events[0].What = fmt.Sprintf("(%d events discarded)", el.discarded) + // The timestamp of the discarded meta-event should be + // the time of the last event it is representing. + el.events[0].When = el.events[1].When + copy(el.events[1:], el.events[2:]) + el.events[maxEventsPerLog-1] = e + } + if e.IsErr { + el.LastErrorTime = e.When + } + el.mu.Unlock() +} + +func (el *eventLog) ref() { + atomic.AddInt32(&el.refs, 1) +} + +func (el *eventLog) unref() { + if atomic.AddInt32(&el.refs, -1) == 0 { + freeEventLog(el) + } +} + +func (el *eventLog) When() string { + return el.Start.Format("2006/01/02 15:04:05.000000") +} + +func (el *eventLog) ElapsedTime() string { + elapsed := time.Since(el.Start) + return fmt.Sprintf("%.6f", elapsed.Seconds()) +} + +func (el *eventLog) Stack() string { + buf := new(bytes.Buffer) + tw := tabwriter.NewWriter(buf, 1, 8, 1, '\t', 0) + printStackRecord(tw, el.stack) + tw.Flush() + return buf.String() +} + +// printStackRecord prints the function + source line information +// for a single stack trace. +// Adapted from runtime/pprof/pprof.go. +func printStackRecord(w io.Writer, stk []uintptr) { + for _, pc := range stk { + f := runtime.FuncForPC(pc) + if f == nil { + continue + } + file, line := f.FileLine(pc) + name := f.Name() + // Hide runtime.goexit and any runtime functions at the beginning. + if strings.HasPrefix(name, "runtime.") { + continue + } + fmt.Fprintf(w, "# %s\t%s:%d\n", name, file, line) + } +} + +func (el *eventLog) Events() []logEntry { + el.mu.RLock() + defer el.mu.RUnlock() + return el.events +} + +// freeEventLogs is a freelist of *eventLog +var freeEventLogs = make(chan *eventLog, 1000) + +// newEventLog returns a event log ready to use. +func newEventLog() *eventLog { + select { + case el := <-freeEventLogs: + return el + default: + return new(eventLog) + } +} + +// freeEventLog adds el to freeEventLogs if there's room. +// This is non-blocking. +func freeEventLog(el *eventLog) { + el.reset() + select { + case freeEventLogs <- el: + default: + } +} + +var eventsTmplCache *template.Template +var eventsTmplOnce sync.Once + +func eventsTmpl() *template.Template { + eventsTmplOnce.Do(func() { + eventsTmplCache = template.Must(template.New("events").Funcs(template.FuncMap{ + "elapsed": elapsed, + "trimSpace": strings.TrimSpace, + }).Parse(eventsHTML)) + }) + return eventsTmplCache +} + +const eventsHTML = ` + + + events + + + + +

    /debug/events

    + +
  • + {{range $i, $fam := .Families}} + + + + {{range $j, $bucket := $.Buckets}} + {{$n := index $.Counts $i $j}} + + {{end}} + + {{end}} +
    {{$fam}} + {{if $n}}{{end}} + [{{$n}} {{$bucket.String}}] + {{if $n}}{{end}} +
    + +{{if $.EventLogs}} +


    +

    Family: {{$.Family}}

    + +{{if $.Expanded}}{{end}} +[Summary]{{if $.Expanded}}{{end}} + +{{if not $.Expanded}}{{end}} +[Expanded]{{if not $.Expanded}}{{end}} + + + + {{range $el := $.EventLogs}} + + + + + {{if $.Expanded}} + + + + + + {{range $el.Events}} + + + + + + {{end}} + {{end}} + {{end}} +
    WhenElapsed
    {{$el.When}}{{$el.ElapsedTime}}{{$el.Title}} +
    {{$el.Stack|trimSpace}}
    {{.WhenString}}{{elapsed .Elapsed}}.{{if .IsErr}}E{{else}}.{{end}}. {{.What}}
    +{{end}} + + +` diff --git a/api/vendor/golang.org/x/net/trace/histogram.go b/api/vendor/golang.org/x/net/trace/histogram.go new file mode 100644 index 0000000..9bf4286 --- /dev/null +++ b/api/vendor/golang.org/x/net/trace/histogram.go @@ -0,0 +1,365 @@ +// Copyright 2015 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 trace + +// This file implements histogramming for RPC statistics collection. + +import ( + "bytes" + "fmt" + "html/template" + "log" + "math" + "sync" + + "golang.org/x/net/internal/timeseries" +) + +const ( + bucketCount = 38 +) + +// histogram keeps counts of values in buckets that are spaced +// out in powers of 2: 0-1, 2-3, 4-7... +// histogram implements timeseries.Observable +type histogram struct { + sum int64 // running total of measurements + sumOfSquares float64 // square of running total + buckets []int64 // bucketed values for histogram + value int // holds a single value as an optimization + valueCount int64 // number of values recorded for single value +} + +// AddMeasurement records a value measurement observation to the histogram. +func (h *histogram) addMeasurement(value int64) { + // TODO: assert invariant + h.sum += value + h.sumOfSquares += float64(value) * float64(value) + + bucketIndex := getBucket(value) + + if h.valueCount == 0 || (h.valueCount > 0 && h.value == bucketIndex) { + h.value = bucketIndex + h.valueCount++ + } else { + h.allocateBuckets() + h.buckets[bucketIndex]++ + } +} + +func (h *histogram) allocateBuckets() { + if h.buckets == nil { + h.buckets = make([]int64, bucketCount) + h.buckets[h.value] = h.valueCount + h.value = 0 + h.valueCount = -1 + } +} + +func log2(i int64) int { + n := 0 + for ; i >= 0x100; i >>= 8 { + n += 8 + } + for ; i > 0; i >>= 1 { + n += 1 + } + return n +} + +func getBucket(i int64) (index int) { + index = log2(i) - 1 + if index < 0 { + index = 0 + } + if index >= bucketCount { + index = bucketCount - 1 + } + return +} + +// Total returns the number of recorded observations. +func (h *histogram) total() (total int64) { + if h.valueCount >= 0 { + total = h.valueCount + } + for _, val := range h.buckets { + total += int64(val) + } + return +} + +// Average returns the average value of recorded observations. +func (h *histogram) average() float64 { + t := h.total() + if t == 0 { + return 0 + } + return float64(h.sum) / float64(t) +} + +// Variance returns the variance of recorded observations. +func (h *histogram) variance() float64 { + t := float64(h.total()) + if t == 0 { + return 0 + } + s := float64(h.sum) / t + return h.sumOfSquares/t - s*s +} + +// StandardDeviation returns the standard deviation of recorded observations. +func (h *histogram) standardDeviation() float64 { + return math.Sqrt(h.variance()) +} + +// PercentileBoundary estimates the value that the given fraction of recorded +// observations are less than. +func (h *histogram) percentileBoundary(percentile float64) int64 { + total := h.total() + + // Corner cases (make sure result is strictly less than Total()) + if total == 0 { + return 0 + } else if total == 1 { + return int64(h.average()) + } + + percentOfTotal := round(float64(total) * percentile) + var runningTotal int64 + + for i := range h.buckets { + value := h.buckets[i] + runningTotal += value + if runningTotal == percentOfTotal { + // We hit an exact bucket boundary. If the next bucket has data, it is a + // good estimate of the value. If the bucket is empty, we interpolate the + // midpoint between the next bucket's boundary and the next non-zero + // bucket. If the remaining buckets are all empty, then we use the + // boundary for the next bucket as the estimate. + j := uint8(i + 1) + min := bucketBoundary(j) + if runningTotal < total { + for h.buckets[j] == 0 { + j++ + } + } + max := bucketBoundary(j) + return min + round(float64(max-min)/2) + } else if runningTotal > percentOfTotal { + // The value is in this bucket. Interpolate the value. + delta := runningTotal - percentOfTotal + percentBucket := float64(value-delta) / float64(value) + bucketMin := bucketBoundary(uint8(i)) + nextBucketMin := bucketBoundary(uint8(i + 1)) + bucketSize := nextBucketMin - bucketMin + return bucketMin + round(percentBucket*float64(bucketSize)) + } + } + return bucketBoundary(bucketCount - 1) +} + +// Median returns the estimated median of the observed values. +func (h *histogram) median() int64 { + return h.percentileBoundary(0.5) +} + +// Add adds other to h. +func (h *histogram) Add(other timeseries.Observable) { + o := other.(*histogram) + if o.valueCount == 0 { + // Other histogram is empty + } else if h.valueCount >= 0 && o.valueCount > 0 && h.value == o.value { + // Both have a single bucketed value, aggregate them + h.valueCount += o.valueCount + } else { + // Two different values necessitate buckets in this histogram + h.allocateBuckets() + if o.valueCount >= 0 { + h.buckets[o.value] += o.valueCount + } else { + for i := range h.buckets { + h.buckets[i] += o.buckets[i] + } + } + } + h.sumOfSquares += o.sumOfSquares + h.sum += o.sum +} + +// Clear resets the histogram to an empty state, removing all observed values. +func (h *histogram) Clear() { + h.buckets = nil + h.value = 0 + h.valueCount = 0 + h.sum = 0 + h.sumOfSquares = 0 +} + +// CopyFrom copies from other, which must be a *histogram, into h. +func (h *histogram) CopyFrom(other timeseries.Observable) { + o := other.(*histogram) + if o.valueCount == -1 { + h.allocateBuckets() + copy(h.buckets, o.buckets) + } + h.sum = o.sum + h.sumOfSquares = o.sumOfSquares + h.value = o.value + h.valueCount = o.valueCount +} + +// Multiply scales the histogram by the specified ratio. +func (h *histogram) Multiply(ratio float64) { + if h.valueCount == -1 { + for i := range h.buckets { + h.buckets[i] = int64(float64(h.buckets[i]) * ratio) + } + } else { + h.valueCount = int64(float64(h.valueCount) * ratio) + } + h.sum = int64(float64(h.sum) * ratio) + h.sumOfSquares = h.sumOfSquares * ratio +} + +// New creates a new histogram. +func (h *histogram) New() timeseries.Observable { + r := new(histogram) + r.Clear() + return r +} + +func (h *histogram) String() string { + return fmt.Sprintf("%d, %f, %d, %d, %v", + h.sum, h.sumOfSquares, h.value, h.valueCount, h.buckets) +} + +// round returns the closest int64 to the argument +func round(in float64) int64 { + return int64(math.Floor(in + 0.5)) +} + +// bucketBoundary returns the first value in the bucket. +func bucketBoundary(bucket uint8) int64 { + if bucket == 0 { + return 0 + } + return 1 << bucket +} + +// bucketData holds data about a specific bucket for use in distTmpl. +type bucketData struct { + Lower, Upper int64 + N int64 + Pct, CumulativePct float64 + GraphWidth int +} + +// data holds data about a Distribution for use in distTmpl. +type data struct { + Buckets []*bucketData + Count, Median int64 + Mean, StandardDeviation float64 +} + +// maxHTMLBarWidth is the maximum width of the HTML bar for visualizing buckets. +const maxHTMLBarWidth = 350.0 + +// newData returns data representing h for use in distTmpl. +func (h *histogram) newData() *data { + // Force the allocation of buckets to simplify the rendering implementation + h.allocateBuckets() + // We scale the bars on the right so that the largest bar is + // maxHTMLBarWidth pixels in width. + maxBucket := int64(0) + for _, n := range h.buckets { + if n > maxBucket { + maxBucket = n + } + } + total := h.total() + barsizeMult := maxHTMLBarWidth / float64(maxBucket) + var pctMult float64 + if total == 0 { + pctMult = 1.0 + } else { + pctMult = 100.0 / float64(total) + } + + buckets := make([]*bucketData, len(h.buckets)) + runningTotal := int64(0) + for i, n := range h.buckets { + if n == 0 { + continue + } + runningTotal += n + var upperBound int64 + if i < bucketCount-1 { + upperBound = bucketBoundary(uint8(i + 1)) + } else { + upperBound = math.MaxInt64 + } + buckets[i] = &bucketData{ + Lower: bucketBoundary(uint8(i)), + Upper: upperBound, + N: n, + Pct: float64(n) * pctMult, + CumulativePct: float64(runningTotal) * pctMult, + GraphWidth: int(float64(n) * barsizeMult), + } + } + return &data{ + Buckets: buckets, + Count: total, + Median: h.median(), + Mean: h.average(), + StandardDeviation: h.standardDeviation(), + } +} + +func (h *histogram) html() template.HTML { + buf := new(bytes.Buffer) + if err := distTmpl().Execute(buf, h.newData()); err != nil { + buf.Reset() + log.Printf("net/trace: couldn't execute template: %v", err) + } + return template.HTML(buf.String()) +} + +var distTmplCache *template.Template +var distTmplOnce sync.Once + +func distTmpl() *template.Template { + distTmplOnce.Do(func() { + // Input: data + distTmplCache = template.Must(template.New("distTmpl").Parse(` + + + + + + + +
    Count: {{.Count}}Mean: {{printf "%.0f" .Mean}}StdDev: {{printf "%.0f" .StandardDeviation}}Median: {{.Median}}
    +
    + +{{range $b := .Buckets}} +{{if $b}} + + + + + + + + + +{{end}} +{{end}} +
    [{{.Lower}},{{.Upper}}){{.N}}{{printf "%#.3f" .Pct}}%{{printf "%#.3f" .CumulativePct}}%
    +`)) + }) + return distTmplCache +} diff --git a/api/vendor/golang.org/x/net/trace/histogram_test.go b/api/vendor/golang.org/x/net/trace/histogram_test.go new file mode 100644 index 0000000..d384b93 --- /dev/null +++ b/api/vendor/golang.org/x/net/trace/histogram_test.go @@ -0,0 +1,325 @@ +// Copyright 2015 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 trace + +import ( + "math" + "testing" +) + +type sumTest struct { + value int64 + sum int64 + sumOfSquares float64 + total int64 +} + +var sumTests = []sumTest{ + {100, 100, 10000, 1}, + {50, 150, 12500, 2}, + {50, 200, 15000, 3}, + {50, 250, 17500, 4}, +} + +type bucketingTest struct { + in int64 + log int + bucket int +} + +var bucketingTests = []bucketingTest{ + {0, 0, 0}, + {1, 1, 0}, + {2, 2, 1}, + {3, 2, 1}, + {4, 3, 2}, + {1000, 10, 9}, + {1023, 10, 9}, + {1024, 11, 10}, + {1000000, 20, 19}, +} + +type multiplyTest struct { + in int64 + ratio float64 + expectedSum int64 + expectedTotal int64 + expectedSumOfSquares float64 +} + +var multiplyTests = []multiplyTest{ + {15, 2.5, 37, 2, 562.5}, + {128, 4.6, 758, 13, 77953.9}, +} + +type percentileTest struct { + fraction float64 + expected int64 +} + +var percentileTests = []percentileTest{ + {0.25, 48}, + {0.5, 96}, + {0.6, 109}, + {0.75, 128}, + {0.90, 205}, + {0.95, 230}, + {0.99, 256}, +} + +func TestSum(t *testing.T) { + var h histogram + + for _, test := range sumTests { + h.addMeasurement(test.value) + sum := h.sum + if sum != test.sum { + t.Errorf("h.Sum = %v WANT: %v", sum, test.sum) + } + + sumOfSquares := h.sumOfSquares + if sumOfSquares != test.sumOfSquares { + t.Errorf("h.SumOfSquares = %v WANT: %v", sumOfSquares, test.sumOfSquares) + } + + total := h.total() + if total != test.total { + t.Errorf("h.Total = %v WANT: %v", total, test.total) + } + } +} + +func TestMultiply(t *testing.T) { + var h histogram + for i, test := range multiplyTests { + h.addMeasurement(test.in) + h.Multiply(test.ratio) + if h.sum != test.expectedSum { + t.Errorf("#%v: h.sum = %v WANT: %v", i, h.sum, test.expectedSum) + } + if h.total() != test.expectedTotal { + t.Errorf("#%v: h.total = %v WANT: %v", i, h.total(), test.expectedTotal) + } + if h.sumOfSquares != test.expectedSumOfSquares { + t.Errorf("#%v: h.SumOfSquares = %v WANT: %v", i, test.expectedSumOfSquares, h.sumOfSquares) + } + } +} + +func TestBucketingFunctions(t *testing.T) { + for _, test := range bucketingTests { + log := log2(test.in) + if log != test.log { + t.Errorf("log2 = %v WANT: %v", log, test.log) + } + + bucket := getBucket(test.in) + if bucket != test.bucket { + t.Errorf("getBucket = %v WANT: %v", bucket, test.bucket) + } + } +} + +func TestAverage(t *testing.T) { + a := new(histogram) + average := a.average() + if average != 0 { + t.Errorf("Average of empty histogram was %v WANT: 0", average) + } + + a.addMeasurement(1) + a.addMeasurement(1) + a.addMeasurement(3) + const expected = float64(5) / float64(3) + average = a.average() + + if !isApproximate(average, expected) { + t.Errorf("Average = %g WANT: %v", average, expected) + } +} + +func TestStandardDeviation(t *testing.T) { + a := new(histogram) + add(a, 10, 1<<4) + add(a, 10, 1<<5) + add(a, 10, 1<<6) + stdDev := a.standardDeviation() + const expected = 19.95 + + if !isApproximate(stdDev, expected) { + t.Errorf("StandardDeviation = %v WANT: %v", stdDev, expected) + } + + // No values + a = new(histogram) + stdDev = a.standardDeviation() + + if !isApproximate(stdDev, 0) { + t.Errorf("StandardDeviation = %v WANT: 0", stdDev) + } + + add(a, 1, 1<<4) + if !isApproximate(stdDev, 0) { + t.Errorf("StandardDeviation = %v WANT: 0", stdDev) + } + + add(a, 10, 1<<4) + if !isApproximate(stdDev, 0) { + t.Errorf("StandardDeviation = %v WANT: 0", stdDev) + } +} + +func TestPercentileBoundary(t *testing.T) { + a := new(histogram) + add(a, 5, 1<<4) + add(a, 10, 1<<6) + add(a, 5, 1<<7) + + for _, test := range percentileTests { + percentile := a.percentileBoundary(test.fraction) + if percentile != test.expected { + t.Errorf("h.PercentileBoundary (fraction=%v) = %v WANT: %v", test.fraction, percentile, test.expected) + } + } +} + +func TestCopyFrom(t *testing.T) { + a := histogram{5, 25, []int64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38}, 4, -1} + b := histogram{6, 36, []int64{2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39}, 5, -1} + + a.CopyFrom(&b) + + if a.String() != b.String() { + t.Errorf("a.String = %s WANT: %s", a.String(), b.String()) + } +} + +func TestClear(t *testing.T) { + a := histogram{5, 25, []int64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38}, 4, -1} + + a.Clear() + + expected := "0, 0.000000, 0, 0, []" + if a.String() != expected { + t.Errorf("a.String = %s WANT %s", a.String(), expected) + } +} + +func TestNew(t *testing.T) { + a := histogram{5, 25, []int64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38}, 4, -1} + b := a.New() + + expected := "0, 0.000000, 0, 0, []" + if b.(*histogram).String() != expected { + t.Errorf("b.(*histogram).String = %s WANT: %s", b.(*histogram).String(), expected) + } +} + +func TestAdd(t *testing.T) { + // The tests here depend on the associativity of addMeasurement and Add. + // Add empty observation + a := histogram{5, 25, []int64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38}, 4, -1} + b := a.New() + + expected := a.String() + a.Add(b) + if a.String() != expected { + t.Errorf("a.String = %s WANT: %s", a.String(), expected) + } + + // Add same bucketed value, no new buckets + c := new(histogram) + d := new(histogram) + e := new(histogram) + c.addMeasurement(12) + d.addMeasurement(11) + e.addMeasurement(12) + e.addMeasurement(11) + c.Add(d) + if c.String() != e.String() { + t.Errorf("c.String = %s WANT: %s", c.String(), e.String()) + } + + // Add bucketed values + f := new(histogram) + g := new(histogram) + h := new(histogram) + f.addMeasurement(4) + f.addMeasurement(12) + f.addMeasurement(100) + g.addMeasurement(18) + g.addMeasurement(36) + g.addMeasurement(255) + h.addMeasurement(4) + h.addMeasurement(12) + h.addMeasurement(100) + h.addMeasurement(18) + h.addMeasurement(36) + h.addMeasurement(255) + f.Add(g) + if f.String() != h.String() { + t.Errorf("f.String = %q WANT: %q", f.String(), h.String()) + } + + // add buckets to no buckets + i := new(histogram) + j := new(histogram) + k := new(histogram) + j.addMeasurement(18) + j.addMeasurement(36) + j.addMeasurement(255) + k.addMeasurement(18) + k.addMeasurement(36) + k.addMeasurement(255) + i.Add(j) + if i.String() != k.String() { + t.Errorf("i.String = %q WANT: %q", i.String(), k.String()) + } + + // add buckets to single value (no overlap) + l := new(histogram) + m := new(histogram) + n := new(histogram) + l.addMeasurement(0) + m.addMeasurement(18) + m.addMeasurement(36) + m.addMeasurement(255) + n.addMeasurement(0) + n.addMeasurement(18) + n.addMeasurement(36) + n.addMeasurement(255) + l.Add(m) + if l.String() != n.String() { + t.Errorf("l.String = %q WANT: %q", l.String(), n.String()) + } + + // mixed order + o := new(histogram) + p := new(histogram) + o.addMeasurement(0) + o.addMeasurement(2) + o.addMeasurement(0) + p.addMeasurement(0) + p.addMeasurement(0) + p.addMeasurement(2) + if o.String() != p.String() { + t.Errorf("o.String = %q WANT: %q", o.String(), p.String()) + } +} + +func add(h *histogram, times int, val int64) { + for i := 0; i < times; i++ { + h.addMeasurement(val) + } +} + +func isApproximate(x, y float64) bool { + return math.Abs(x-y) < 1e-2 +} diff --git a/api/vendor/golang.org/x/net/trace/trace.go b/api/vendor/golang.org/x/net/trace/trace.go new file mode 100644 index 0000000..a46ee0e --- /dev/null +++ b/api/vendor/golang.org/x/net/trace/trace.go @@ -0,0 +1,1103 @@ +// Copyright 2015 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 trace implements tracing of requests and long-lived objects. +It exports HTTP interfaces on /debug/requests and /debug/events. + +A trace.Trace provides tracing for short-lived objects, usually requests. +A request handler might be implemented like this: + + func fooHandler(w http.ResponseWriter, req *http.Request) { + tr := trace.New("mypkg.Foo", req.URL.Path) + defer tr.Finish() + ... + tr.LazyPrintf("some event %q happened", str) + ... + if err := somethingImportant(); err != nil { + tr.LazyPrintf("somethingImportant failed: %v", err) + tr.SetError() + } + } + +The /debug/requests HTTP endpoint organizes the traces by family, +errors, and duration. It also provides histogram of request duration +for each family. + +A trace.EventLog provides tracing for long-lived objects, such as RPC +connections. + + // A Fetcher fetches URL paths for a single domain. + type Fetcher struct { + domain string + events trace.EventLog + } + + func NewFetcher(domain string) *Fetcher { + return &Fetcher{ + domain, + trace.NewEventLog("mypkg.Fetcher", domain), + } + } + + func (f *Fetcher) Fetch(path string) (string, error) { + resp, err := http.Get("http://" + f.domain + "/" + path) + if err != nil { + f.events.Errorf("Get(%q) = %v", path, err) + return "", err + } + f.events.Printf("Get(%q) = %s", path, resp.Status) + ... + } + + func (f *Fetcher) Close() error { + f.events.Finish() + return nil + } + +The /debug/events HTTP endpoint organizes the event logs by family and +by time since the last error. The expanded view displays recent log +entries and the log's call stack. +*/ +package trace // import "golang.org/x/net/trace" + +import ( + "bytes" + "fmt" + "html/template" + "io" + "log" + "net" + "net/http" + "runtime" + "sort" + "strconv" + "sync" + "sync/atomic" + "time" + + "golang.org/x/net/internal/timeseries" +) + +// DebugUseAfterFinish controls whether to debug uses of Trace values after finishing. +// FOR DEBUGGING ONLY. This will slow down the program. +var DebugUseAfterFinish = false + +// AuthRequest determines whether a specific request is permitted to load the +// /debug/requests or /debug/events pages. +// +// It returns two bools; the first indicates whether the page may be viewed at all, +// and the second indicates whether sensitive events will be shown. +// +// AuthRequest may be replaced by a program to customize its authorization requirements. +// +// The default AuthRequest function returns (true, true) if and only if the request +// comes from localhost/127.0.0.1/[::1]. +var AuthRequest = func(req *http.Request) (any, sensitive bool) { + // RemoteAddr is commonly in the form "IP" or "IP:port". + // If it is in the form "IP:port", split off the port. + host, _, err := net.SplitHostPort(req.RemoteAddr) + if err != nil { + host = req.RemoteAddr + } + switch host { + case "localhost", "127.0.0.1", "::1": + return true, true + default: + return false, false + } +} + +func init() { + // TODO(jbd): Serve Traces from /debug/traces in the future? + // There is no requirement for a request to be present to have traces. + http.HandleFunc("/debug/requests", Traces) + http.HandleFunc("/debug/events", Events) +} + +// Traces responds with traces from the program. +// The package initialization registers it in http.DefaultServeMux +// at /debug/requests. +// +// It performs authorization by running AuthRequest. +func Traces(w http.ResponseWriter, req *http.Request) { + any, sensitive := AuthRequest(req) + if !any { + http.Error(w, "not allowed", http.StatusUnauthorized) + return + } + w.Header().Set("Content-Type", "text/html; charset=utf-8") + Render(w, req, sensitive) +} + +// Events responds with a page of events collected by EventLogs. +// The package initialization registers it in http.DefaultServeMux +// at /debug/events. +// +// It performs authorization by running AuthRequest. +func Events(w http.ResponseWriter, req *http.Request) { + any, sensitive := AuthRequest(req) + if !any { + http.Error(w, "not allowed", http.StatusUnauthorized) + return + } + w.Header().Set("Content-Type", "text/html; charset=utf-8") + RenderEvents(w, req, sensitive) +} + +// Render renders the HTML page typically served at /debug/requests. +// It does not do any auth checking. The request may be nil. +// +// Most users will use the Traces handler. +func Render(w io.Writer, req *http.Request, sensitive bool) { + data := &struct { + Families []string + ActiveTraceCount map[string]int + CompletedTraces map[string]*family + + // Set when a bucket has been selected. + Traces traceList + Family string + Bucket int + Expanded bool + Traced bool + Active bool + ShowSensitive bool // whether to show sensitive events + + Histogram template.HTML + HistogramWindow string // e.g. "last minute", "last hour", "all time" + + // If non-zero, the set of traces is a partial set, + // and this is the total number. + Total int + }{ + CompletedTraces: completedTraces, + } + + data.ShowSensitive = sensitive + if req != nil { + // Allow show_sensitive=0 to force hiding of sensitive data for testing. + // This only goes one way; you can't use show_sensitive=1 to see things. + if req.FormValue("show_sensitive") == "0" { + data.ShowSensitive = false + } + + if exp, err := strconv.ParseBool(req.FormValue("exp")); err == nil { + data.Expanded = exp + } + if exp, err := strconv.ParseBool(req.FormValue("rtraced")); err == nil { + data.Traced = exp + } + } + + completedMu.RLock() + data.Families = make([]string, 0, len(completedTraces)) + for fam := range completedTraces { + data.Families = append(data.Families, fam) + } + completedMu.RUnlock() + sort.Strings(data.Families) + + // We are careful here to minimize the time spent locking activeMu, + // since that lock is required every time an RPC starts and finishes. + data.ActiveTraceCount = make(map[string]int, len(data.Families)) + activeMu.RLock() + for fam, s := range activeTraces { + data.ActiveTraceCount[fam] = s.Len() + } + activeMu.RUnlock() + + var ok bool + data.Family, data.Bucket, ok = parseArgs(req) + switch { + case !ok: + // No-op + case data.Bucket == -1: + data.Active = true + n := data.ActiveTraceCount[data.Family] + data.Traces = getActiveTraces(data.Family) + if len(data.Traces) < n { + data.Total = n + } + case data.Bucket < bucketsPerFamily: + if b := lookupBucket(data.Family, data.Bucket); b != nil { + data.Traces = b.Copy(data.Traced) + } + default: + if f := getFamily(data.Family, false); f != nil { + var obs timeseries.Observable + f.LatencyMu.RLock() + switch o := data.Bucket - bucketsPerFamily; o { + case 0: + obs = f.Latency.Minute() + data.HistogramWindow = "last minute" + case 1: + obs = f.Latency.Hour() + data.HistogramWindow = "last hour" + case 2: + obs = f.Latency.Total() + data.HistogramWindow = "all time" + } + f.LatencyMu.RUnlock() + if obs != nil { + data.Histogram = obs.(*histogram).html() + } + } + } + + if data.Traces != nil { + defer data.Traces.Free() + sort.Sort(data.Traces) + } + + completedMu.RLock() + defer completedMu.RUnlock() + if err := pageTmpl().ExecuteTemplate(w, "Page", data); err != nil { + log.Printf("net/trace: Failed executing template: %v", err) + } +} + +func parseArgs(req *http.Request) (fam string, b int, ok bool) { + if req == nil { + return "", 0, false + } + fam, bStr := req.FormValue("fam"), req.FormValue("b") + if fam == "" || bStr == "" { + return "", 0, false + } + b, err := strconv.Atoi(bStr) + if err != nil || b < -1 { + return "", 0, false + } + + return fam, b, true +} + +func lookupBucket(fam string, b int) *traceBucket { + f := getFamily(fam, false) + if f == nil || b < 0 || b >= len(f.Buckets) { + return nil + } + return f.Buckets[b] +} + +type contextKeyT string + +var contextKey = contextKeyT("golang.org/x/net/trace.Trace") + +// Trace represents an active request. +type Trace interface { + // LazyLog adds x to the event log. It will be evaluated each time the + // /debug/requests page is rendered. Any memory referenced by x will be + // pinned until the trace is finished and later discarded. + LazyLog(x fmt.Stringer, sensitive bool) + + // LazyPrintf evaluates its arguments with fmt.Sprintf each time the + // /debug/requests page is rendered. Any memory referenced by a will be + // pinned until the trace is finished and later discarded. + LazyPrintf(format string, a ...interface{}) + + // SetError declares that this trace resulted in an error. + SetError() + + // SetRecycler sets a recycler for the trace. + // f will be called for each event passed to LazyLog at a time when + // it is no longer required, whether while the trace is still active + // and the event is discarded, or when a completed trace is discarded. + SetRecycler(f func(interface{})) + + // SetTraceInfo sets the trace info for the trace. + // This is currently unused. + SetTraceInfo(traceID, spanID uint64) + + // SetMaxEvents sets the maximum number of events that will be stored + // in the trace. This has no effect if any events have already been + // added to the trace. + SetMaxEvents(m int) + + // Finish declares that this trace is complete. + // The trace should not be used after calling this method. + Finish() +} + +type lazySprintf struct { + format string + a []interface{} +} + +func (l *lazySprintf) String() string { + return fmt.Sprintf(l.format, l.a...) +} + +// New returns a new Trace with the specified family and title. +func New(family, title string) Trace { + tr := newTrace() + tr.ref() + tr.Family, tr.Title = family, title + tr.Start = time.Now() + tr.maxEvents = maxEventsPerTrace + tr.events = tr.eventsBuf[:0] + + activeMu.RLock() + s := activeTraces[tr.Family] + activeMu.RUnlock() + if s == nil { + activeMu.Lock() + s = activeTraces[tr.Family] // check again + if s == nil { + s = new(traceSet) + activeTraces[tr.Family] = s + } + activeMu.Unlock() + } + s.Add(tr) + + // Trigger allocation of the completed trace structure for this family. + // This will cause the family to be present in the request page during + // the first trace of this family. We don't care about the return value, + // nor is there any need for this to run inline, so we execute it in its + // own goroutine, but only if the family isn't allocated yet. + completedMu.RLock() + if _, ok := completedTraces[tr.Family]; !ok { + go allocFamily(tr.Family) + } + completedMu.RUnlock() + + return tr +} + +func (tr *trace) Finish() { + elapsed := time.Now().Sub(tr.Start) + tr.mu.Lock() + tr.Elapsed = elapsed + tr.mu.Unlock() + + if DebugUseAfterFinish { + buf := make([]byte, 4<<10) // 4 KB should be enough + n := runtime.Stack(buf, false) + tr.finishStack = buf[:n] + } + + activeMu.RLock() + m := activeTraces[tr.Family] + activeMu.RUnlock() + m.Remove(tr) + + f := getFamily(tr.Family, true) + tr.mu.RLock() // protects tr fields in Cond.match calls + for _, b := range f.Buckets { + if b.Cond.match(tr) { + b.Add(tr) + } + } + tr.mu.RUnlock() + + // Add a sample of elapsed time as microseconds to the family's timeseries + h := new(histogram) + h.addMeasurement(elapsed.Nanoseconds() / 1e3) + f.LatencyMu.Lock() + f.Latency.Add(h) + f.LatencyMu.Unlock() + + tr.unref() // matches ref in New +} + +const ( + bucketsPerFamily = 9 + tracesPerBucket = 10 + maxActiveTraces = 20 // Maximum number of active traces to show. + maxEventsPerTrace = 10 + numHistogramBuckets = 38 +) + +var ( + // The active traces. + activeMu sync.RWMutex + activeTraces = make(map[string]*traceSet) // family -> traces + + // Families of completed traces. + completedMu sync.RWMutex + completedTraces = make(map[string]*family) // family -> traces +) + +type traceSet struct { + mu sync.RWMutex + m map[*trace]bool + + // We could avoid the entire map scan in FirstN by having a slice of all the traces + // ordered by start time, and an index into that from the trace struct, with a periodic + // repack of the slice after enough traces finish; we could also use a skip list or similar. + // However, that would shift some of the expense from /debug/requests time to RPC time, + // which is probably the wrong trade-off. +} + +func (ts *traceSet) Len() int { + ts.mu.RLock() + defer ts.mu.RUnlock() + return len(ts.m) +} + +func (ts *traceSet) Add(tr *trace) { + ts.mu.Lock() + if ts.m == nil { + ts.m = make(map[*trace]bool) + } + ts.m[tr] = true + ts.mu.Unlock() +} + +func (ts *traceSet) Remove(tr *trace) { + ts.mu.Lock() + delete(ts.m, tr) + ts.mu.Unlock() +} + +// FirstN returns the first n traces ordered by time. +func (ts *traceSet) FirstN(n int) traceList { + ts.mu.RLock() + defer ts.mu.RUnlock() + + if n > len(ts.m) { + n = len(ts.m) + } + trl := make(traceList, 0, n) + + // Fast path for when no selectivity is needed. + if n == len(ts.m) { + for tr := range ts.m { + tr.ref() + trl = append(trl, tr) + } + sort.Sort(trl) + return trl + } + + // Pick the oldest n traces. + // This is inefficient. See the comment in the traceSet struct. + for tr := range ts.m { + // Put the first n traces into trl in the order they occur. + // When we have n, sort trl, and thereafter maintain its order. + if len(trl) < n { + tr.ref() + trl = append(trl, tr) + if len(trl) == n { + // This is guaranteed to happen exactly once during this loop. + sort.Sort(trl) + } + continue + } + if tr.Start.After(trl[n-1].Start) { + continue + } + + // Find where to insert this one. + tr.ref() + i := sort.Search(n, func(i int) bool { return trl[i].Start.After(tr.Start) }) + trl[n-1].unref() + copy(trl[i+1:], trl[i:]) + trl[i] = tr + } + + return trl +} + +func getActiveTraces(fam string) traceList { + activeMu.RLock() + s := activeTraces[fam] + activeMu.RUnlock() + if s == nil { + return nil + } + return s.FirstN(maxActiveTraces) +} + +func getFamily(fam string, allocNew bool) *family { + completedMu.RLock() + f := completedTraces[fam] + completedMu.RUnlock() + if f == nil && allocNew { + f = allocFamily(fam) + } + return f +} + +func allocFamily(fam string) *family { + completedMu.Lock() + defer completedMu.Unlock() + f := completedTraces[fam] + if f == nil { + f = newFamily() + completedTraces[fam] = f + } + return f +} + +// family represents a set of trace buckets and associated latency information. +type family struct { + // traces may occur in multiple buckets. + Buckets [bucketsPerFamily]*traceBucket + + // latency time series + LatencyMu sync.RWMutex + Latency *timeseries.MinuteHourSeries +} + +func newFamily() *family { + return &family{ + Buckets: [bucketsPerFamily]*traceBucket{ + {Cond: minCond(0)}, + {Cond: minCond(50 * time.Millisecond)}, + {Cond: minCond(100 * time.Millisecond)}, + {Cond: minCond(200 * time.Millisecond)}, + {Cond: minCond(500 * time.Millisecond)}, + {Cond: minCond(1 * time.Second)}, + {Cond: minCond(10 * time.Second)}, + {Cond: minCond(100 * time.Second)}, + {Cond: errorCond{}}, + }, + Latency: timeseries.NewMinuteHourSeries(func() timeseries.Observable { return new(histogram) }), + } +} + +// traceBucket represents a size-capped bucket of historic traces, +// along with a condition for a trace to belong to the bucket. +type traceBucket struct { + Cond cond + + // Ring buffer implementation of a fixed-size FIFO queue. + mu sync.RWMutex + buf [tracesPerBucket]*trace + start int // < tracesPerBucket + length int // <= tracesPerBucket +} + +func (b *traceBucket) Add(tr *trace) { + b.mu.Lock() + defer b.mu.Unlock() + + i := b.start + b.length + if i >= tracesPerBucket { + i -= tracesPerBucket + } + if b.length == tracesPerBucket { + // "Remove" an element from the bucket. + b.buf[i].unref() + b.start++ + if b.start == tracesPerBucket { + b.start = 0 + } + } + b.buf[i] = tr + if b.length < tracesPerBucket { + b.length++ + } + tr.ref() +} + +// Copy returns a copy of the traces in the bucket. +// If tracedOnly is true, only the traces with trace information will be returned. +// The logs will be ref'd before returning; the caller should call +// the Free method when it is done with them. +// TODO(dsymonds): keep track of traced requests in separate buckets. +func (b *traceBucket) Copy(tracedOnly bool) traceList { + b.mu.RLock() + defer b.mu.RUnlock() + + trl := make(traceList, 0, b.length) + for i, x := 0, b.start; i < b.length; i++ { + tr := b.buf[x] + if !tracedOnly || tr.spanID != 0 { + tr.ref() + trl = append(trl, tr) + } + x++ + if x == b.length { + x = 0 + } + } + return trl +} + +func (b *traceBucket) Empty() bool { + b.mu.RLock() + defer b.mu.RUnlock() + return b.length == 0 +} + +// cond represents a condition on a trace. +type cond interface { + match(t *trace) bool + String() string +} + +type minCond time.Duration + +func (m minCond) match(t *trace) bool { return t.Elapsed >= time.Duration(m) } +func (m minCond) String() string { return fmt.Sprintf("≥%gs", time.Duration(m).Seconds()) } + +type errorCond struct{} + +func (e errorCond) match(t *trace) bool { return t.IsError } +func (e errorCond) String() string { return "errors" } + +type traceList []*trace + +// Free calls unref on each element of the list. +func (trl traceList) Free() { + for _, t := range trl { + t.unref() + } +} + +// traceList may be sorted in reverse chronological order. +func (trl traceList) Len() int { return len(trl) } +func (trl traceList) Less(i, j int) bool { return trl[i].Start.After(trl[j].Start) } +func (trl traceList) Swap(i, j int) { trl[i], trl[j] = trl[j], trl[i] } + +// An event is a timestamped log entry in a trace. +type event struct { + When time.Time + Elapsed time.Duration // since previous event in trace + NewDay bool // whether this event is on a different day to the previous event + Recyclable bool // whether this event was passed via LazyLog + Sensitive bool // whether this event contains sensitive information + What interface{} // string or fmt.Stringer +} + +// WhenString returns a string representation of the elapsed time of the event. +// It will include the date if midnight was crossed. +func (e event) WhenString() string { + if e.NewDay { + return e.When.Format("2006/01/02 15:04:05.000000") + } + return e.When.Format("15:04:05.000000") +} + +// discarded represents a number of discarded events. +// It is stored as *discarded to make it easier to update in-place. +type discarded int + +func (d *discarded) String() string { + return fmt.Sprintf("(%d events discarded)", int(*d)) +} + +// trace represents an active or complete request, +// either sent or received by this program. +type trace struct { + // Family is the top-level grouping of traces to which this belongs. + Family string + + // Title is the title of this trace. + Title string + + // Start time of the this trace. + Start time.Time + + mu sync.RWMutex + events []event // Append-only sequence of events (modulo discards). + maxEvents int + recycler func(interface{}) + IsError bool // Whether this trace resulted in an error. + Elapsed time.Duration // Elapsed time for this trace, zero while active. + traceID uint64 // Trace information if non-zero. + spanID uint64 + + refs int32 // how many buckets this is in + disc discarded // scratch space to avoid allocation + + finishStack []byte // where finish was called, if DebugUseAfterFinish is set + + eventsBuf [4]event // preallocated buffer in case we only log a few events +} + +func (tr *trace) reset() { + // Clear all but the mutex. Mutexes may not be copied, even when unlocked. + tr.Family = "" + tr.Title = "" + tr.Start = time.Time{} + + tr.mu.Lock() + tr.Elapsed = 0 + tr.traceID = 0 + tr.spanID = 0 + tr.IsError = false + tr.maxEvents = 0 + tr.events = nil + tr.recycler = nil + tr.mu.Unlock() + + tr.refs = 0 + tr.disc = 0 + tr.finishStack = nil + for i := range tr.eventsBuf { + tr.eventsBuf[i] = event{} + } +} + +// delta returns the elapsed time since the last event or the trace start, +// and whether it spans midnight. +// L >= tr.mu +func (tr *trace) delta(t time.Time) (time.Duration, bool) { + if len(tr.events) == 0 { + return t.Sub(tr.Start), false + } + prev := tr.events[len(tr.events)-1].When + return t.Sub(prev), prev.Day() != t.Day() +} + +func (tr *trace) addEvent(x interface{}, recyclable, sensitive bool) { + if DebugUseAfterFinish && tr.finishStack != nil { + buf := make([]byte, 4<<10) // 4 KB should be enough + n := runtime.Stack(buf, false) + log.Printf("net/trace: trace used after finish:\nFinished at:\n%s\nUsed at:\n%s", tr.finishStack, buf[:n]) + } + + /* + NOTE TO DEBUGGERS + + If you are here because your program panicked in this code, + it is almost definitely the fault of code using this package, + and very unlikely to be the fault of this code. + + The most likely scenario is that some code elsewhere is using + a trace.Trace after its Finish method is called. + You can temporarily set the DebugUseAfterFinish var + to help discover where that is; do not leave that var set, + since it makes this package much less efficient. + */ + + e := event{When: time.Now(), What: x, Recyclable: recyclable, Sensitive: sensitive} + tr.mu.Lock() + e.Elapsed, e.NewDay = tr.delta(e.When) + if len(tr.events) < tr.maxEvents { + tr.events = append(tr.events, e) + } else { + // Discard the middle events. + di := int((tr.maxEvents - 1) / 2) + if d, ok := tr.events[di].What.(*discarded); ok { + (*d)++ + } else { + // disc starts at two to count for the event it is replacing, + // plus the next one that we are about to drop. + tr.disc = 2 + if tr.recycler != nil && tr.events[di].Recyclable { + go tr.recycler(tr.events[di].What) + } + tr.events[di].What = &tr.disc + } + // The timestamp of the discarded meta-event should be + // the time of the last event it is representing. + tr.events[di].When = tr.events[di+1].When + + if tr.recycler != nil && tr.events[di+1].Recyclable { + go tr.recycler(tr.events[di+1].What) + } + copy(tr.events[di+1:], tr.events[di+2:]) + tr.events[tr.maxEvents-1] = e + } + tr.mu.Unlock() +} + +func (tr *trace) LazyLog(x fmt.Stringer, sensitive bool) { + tr.addEvent(x, true, sensitive) +} + +func (tr *trace) LazyPrintf(format string, a ...interface{}) { + tr.addEvent(&lazySprintf{format, a}, false, false) +} + +func (tr *trace) SetError() { + tr.mu.Lock() + tr.IsError = true + tr.mu.Unlock() +} + +func (tr *trace) SetRecycler(f func(interface{})) { + tr.mu.Lock() + tr.recycler = f + tr.mu.Unlock() +} + +func (tr *trace) SetTraceInfo(traceID, spanID uint64) { + tr.mu.Lock() + tr.traceID, tr.spanID = traceID, spanID + tr.mu.Unlock() +} + +func (tr *trace) SetMaxEvents(m int) { + tr.mu.Lock() + // Always keep at least three events: first, discarded count, last. + if len(tr.events) == 0 && m > 3 { + tr.maxEvents = m + } + tr.mu.Unlock() +} + +func (tr *trace) ref() { + atomic.AddInt32(&tr.refs, 1) +} + +func (tr *trace) unref() { + if atomic.AddInt32(&tr.refs, -1) == 0 { + tr.mu.RLock() + if tr.recycler != nil { + // freeTrace clears tr, so we hold tr.recycler and tr.events here. + go func(f func(interface{}), es []event) { + for _, e := range es { + if e.Recyclable { + f(e.What) + } + } + }(tr.recycler, tr.events) + } + tr.mu.RUnlock() + + freeTrace(tr) + } +} + +func (tr *trace) When() string { + return tr.Start.Format("2006/01/02 15:04:05.000000") +} + +func (tr *trace) ElapsedTime() string { + tr.mu.RLock() + t := tr.Elapsed + tr.mu.RUnlock() + + if t == 0 { + // Active trace. + t = time.Since(tr.Start) + } + return fmt.Sprintf("%.6f", t.Seconds()) +} + +func (tr *trace) Events() []event { + tr.mu.RLock() + defer tr.mu.RUnlock() + return tr.events +} + +var traceFreeList = make(chan *trace, 1000) // TODO(dsymonds): Use sync.Pool? + +// newTrace returns a trace ready to use. +func newTrace() *trace { + select { + case tr := <-traceFreeList: + return tr + default: + return new(trace) + } +} + +// freeTrace adds tr to traceFreeList if there's room. +// This is non-blocking. +func freeTrace(tr *trace) { + if DebugUseAfterFinish { + return // never reuse + } + tr.reset() + select { + case traceFreeList <- tr: + default: + } +} + +func elapsed(d time.Duration) string { + b := []byte(fmt.Sprintf("%.6f", d.Seconds())) + + // For subsecond durations, blank all zeros before decimal point, + // and all zeros between the decimal point and the first non-zero digit. + if d < time.Second { + dot := bytes.IndexByte(b, '.') + for i := 0; i < dot; i++ { + b[i] = ' ' + } + for i := dot + 1; i < len(b); i++ { + if b[i] == '0' { + b[i] = ' ' + } else { + break + } + } + } + + return string(b) +} + +var pageTmplCache *template.Template +var pageTmplOnce sync.Once + +func pageTmpl() *template.Template { + pageTmplOnce.Do(func() { + pageTmplCache = template.Must(template.New("Page").Funcs(template.FuncMap{ + "elapsed": elapsed, + "add": func(a, b int) int { return a + b }, + }).Parse(pageHTML)) + }) + return pageTmplCache +} + +const pageHTML = ` +{{template "Prolog" .}} +{{template "StatusTable" .}} +{{template "Epilog" .}} + +{{define "Prolog"}} + + + /debug/requests + + + + +

    /debug/requests

    +{{end}} {{/* end of Prolog */}} + +{{define "StatusTable"}} + + {{range $fam := .Families}} + + + + {{$n := index $.ActiveTraceCount $fam}} + + + {{$f := index $.CompletedTraces $fam}} + {{range $i, $b := $f.Buckets}} + {{$empty := $b.Empty}} + + {{end}} + + {{$nb := len $f.Buckets}} + + + + + + {{end}} +
    {{$fam}} + {{if $n}}{{end}} + [{{$n}} active] + {{if $n}}{{end}} + + {{if not $empty}}{{end}} + [{{.Cond}}] + {{if not $empty}}{{end}} + + [minute] + + [hour] + + [total] +
    +{{end}} {{/* end of StatusTable */}} + +{{define "Epilog"}} +{{if $.Traces}} +
    +

    Family: {{$.Family}}

    + +{{if or $.Expanded $.Traced}} + [Normal/Summary] +{{else}} + [Normal/Summary] +{{end}} + +{{if or (not $.Expanded) $.Traced}} + [Normal/Expanded] +{{else}} + [Normal/Expanded] +{{end}} + +{{if not $.Active}} + {{if or $.Expanded (not $.Traced)}} + [Traced/Summary] + {{else}} + [Traced/Summary] + {{end}} + {{if or (not $.Expanded) (not $.Traced)}} + [Traced/Expanded] + {{else}} + [Traced/Expanded] + {{end}} +{{end}} + +{{if $.Total}} +

    Showing {{len $.Traces}} of {{$.Total}} traces.

    +{{end}} + + + + + {{range $tr := $.Traces}} + + + + + {{/* TODO: include traceID/spanID */}} + + {{if $.Expanded}} + {{range $tr.Events}} + + + + + + {{end}} + {{end}} + {{end}} +
    + {{if $.Active}}Active{{else}}Completed{{end}} Requests +
    WhenElapsed (s)
    {{$tr.When}}{{$tr.ElapsedTime}}{{$tr.Title}}
    {{.WhenString}}{{elapsed .Elapsed}}{{if or $.ShowSensitive (not .Sensitive)}}... {{.What}}{{else}}[redacted]{{end}}
    +{{end}} {{/* if $.Traces */}} + +{{if $.Histogram}} +

    Latency (µs) of {{$.Family}} over {{$.HistogramWindow}}

    +{{$.Histogram}} +{{end}} {{/* if $.Histogram */}} + + + +{{end}} {{/* end of Epilog */}} +` diff --git a/api/vendor/golang.org/x/net/trace/trace_go16.go b/api/vendor/golang.org/x/net/trace/trace_go16.go new file mode 100644 index 0000000..d608191 --- /dev/null +++ b/api/vendor/golang.org/x/net/trace/trace_go16.go @@ -0,0 +1,21 @@ +// 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. + +// +build !go1.7 + +package trace + +import "golang.org/x/net/context" + +// NewContext returns a copy of the parent context +// and associates it with a Trace. +func NewContext(ctx context.Context, tr Trace) context.Context { + return context.WithValue(ctx, contextKey, tr) +} + +// FromContext returns the Trace bound to the context, if any. +func FromContext(ctx context.Context) (tr Trace, ok bool) { + tr, ok = ctx.Value(contextKey).(Trace) + return +} diff --git a/api/vendor/golang.org/x/net/trace/trace_go17.go b/api/vendor/golang.org/x/net/trace/trace_go17.go new file mode 100644 index 0000000..df6e1fb --- /dev/null +++ b/api/vendor/golang.org/x/net/trace/trace_go17.go @@ -0,0 +1,21 @@ +// 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. + +// +build go1.7 + +package trace + +import "context" + +// NewContext returns a copy of the parent context +// and associates it with a Trace. +func NewContext(ctx context.Context, tr Trace) context.Context { + return context.WithValue(ctx, contextKey, tr) +} + +// FromContext returns the Trace bound to the context, if any. +func FromContext(ctx context.Context) (tr Trace, ok bool) { + tr, ok = ctx.Value(contextKey).(Trace) + return +} diff --git a/api/vendor/golang.org/x/net/trace/trace_test.go b/api/vendor/golang.org/x/net/trace/trace_test.go new file mode 100644 index 0000000..bfd9dfe --- /dev/null +++ b/api/vendor/golang.org/x/net/trace/trace_test.go @@ -0,0 +1,178 @@ +// Copyright 2015 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 trace + +import ( + "net/http" + "reflect" + "testing" +) + +type s struct{} + +func (s) String() string { return "lazy string" } + +// TestReset checks whether all the fields are zeroed after reset. +func TestReset(t *testing.T) { + tr := New("foo", "bar") + tr.LazyLog(s{}, false) + tr.LazyPrintf("%d", 1) + tr.SetRecycler(func(_ interface{}) {}) + tr.SetTraceInfo(3, 4) + tr.SetMaxEvents(100) + tr.SetError() + tr.Finish() + + tr.(*trace).reset() + + if !reflect.DeepEqual(tr, new(trace)) { + t.Errorf("reset didn't clear all fields: %+v", tr) + } +} + +// TestResetLog checks whether all the fields are zeroed after reset. +func TestResetLog(t *testing.T) { + el := NewEventLog("foo", "bar") + el.Printf("message") + el.Errorf("error") + el.Finish() + + el.(*eventLog).reset() + + if !reflect.DeepEqual(el, new(eventLog)) { + t.Errorf("reset didn't clear all fields: %+v", el) + } +} + +func TestAuthRequest(t *testing.T) { + testCases := []struct { + host string + want bool + }{ + {host: "192.168.23.1", want: false}, + {host: "192.168.23.1:8080", want: false}, + {host: "malformed remote addr", want: false}, + {host: "localhost", want: true}, + {host: "localhost:8080", want: true}, + {host: "127.0.0.1", want: true}, + {host: "127.0.0.1:8080", want: true}, + {host: "::1", want: true}, + {host: "[::1]:8080", want: true}, + } + for _, tt := range testCases { + req := &http.Request{RemoteAddr: tt.host} + any, sensitive := AuthRequest(req) + if any != tt.want || sensitive != tt.want { + t.Errorf("AuthRequest(%q) = %t, %t; want %t, %t", tt.host, any, sensitive, tt.want, tt.want) + } + } +} + +// TestParseTemplate checks that all templates used by this package are valid +// as they are parsed on first usage +func TestParseTemplate(t *testing.T) { + if tmpl := distTmpl(); tmpl == nil { + t.Error("invalid template returned from distTmpl()") + } + if tmpl := pageTmpl(); tmpl == nil { + t.Error("invalid template returned from pageTmpl()") + } + if tmpl := eventsTmpl(); tmpl == nil { + t.Error("invalid template returned from eventsTmpl()") + } +} + +func benchmarkTrace(b *testing.B, maxEvents, numEvents int) { + numSpans := (b.N + numEvents + 1) / numEvents + + for i := 0; i < numSpans; i++ { + tr := New("test", "test") + tr.SetMaxEvents(maxEvents) + for j := 0; j < numEvents; j++ { + tr.LazyPrintf("%d", j) + } + tr.Finish() + } +} + +func BenchmarkTrace_Default_2(b *testing.B) { + benchmarkTrace(b, 0, 2) +} + +func BenchmarkTrace_Default_10(b *testing.B) { + benchmarkTrace(b, 0, 10) +} + +func BenchmarkTrace_Default_100(b *testing.B) { + benchmarkTrace(b, 0, 100) +} + +func BenchmarkTrace_Default_1000(b *testing.B) { + benchmarkTrace(b, 0, 1000) +} + +func BenchmarkTrace_Default_10000(b *testing.B) { + benchmarkTrace(b, 0, 10000) +} + +func BenchmarkTrace_10_2(b *testing.B) { + benchmarkTrace(b, 10, 2) +} + +func BenchmarkTrace_10_10(b *testing.B) { + benchmarkTrace(b, 10, 10) +} + +func BenchmarkTrace_10_100(b *testing.B) { + benchmarkTrace(b, 10, 100) +} + +func BenchmarkTrace_10_1000(b *testing.B) { + benchmarkTrace(b, 10, 1000) +} + +func BenchmarkTrace_10_10000(b *testing.B) { + benchmarkTrace(b, 10, 10000) +} + +func BenchmarkTrace_100_2(b *testing.B) { + benchmarkTrace(b, 100, 2) +} + +func BenchmarkTrace_100_10(b *testing.B) { + benchmarkTrace(b, 100, 10) +} + +func BenchmarkTrace_100_100(b *testing.B) { + benchmarkTrace(b, 100, 100) +} + +func BenchmarkTrace_100_1000(b *testing.B) { + benchmarkTrace(b, 100, 1000) +} + +func BenchmarkTrace_100_10000(b *testing.B) { + benchmarkTrace(b, 100, 10000) +} + +func BenchmarkTrace_1000_2(b *testing.B) { + benchmarkTrace(b, 1000, 2) +} + +func BenchmarkTrace_1000_10(b *testing.B) { + benchmarkTrace(b, 1000, 10) +} + +func BenchmarkTrace_1000_100(b *testing.B) { + benchmarkTrace(b, 1000, 100) +} + +func BenchmarkTrace_1000_1000(b *testing.B) { + benchmarkTrace(b, 1000, 1000) +} + +func BenchmarkTrace_1000_10000(b *testing.B) { + benchmarkTrace(b, 1000, 10000) +} diff --git a/api/vendor/golang.org/x/net/webdav/file.go b/api/vendor/golang.org/x/net/webdav/file.go new file mode 100644 index 0000000..748118d --- /dev/null +++ b/api/vendor/golang.org/x/net/webdav/file.go @@ -0,0 +1,796 @@ +// 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 webdav + +import ( + "encoding/xml" + "io" + "net/http" + "os" + "path" + "path/filepath" + "strings" + "sync" + "time" + + "golang.org/x/net/context" +) + +// slashClean is equivalent to but slightly more efficient than +// path.Clean("/" + name). +func slashClean(name string) string { + if name == "" || name[0] != '/' { + name = "/" + name + } + return path.Clean(name) +} + +// A FileSystem implements access to a collection of named files. The elements +// in a file path are separated by slash ('/', U+002F) characters, regardless +// of host operating system convention. +// +// Each method has the same semantics as the os package's function of the same +// name. +// +// Note that the os.Rename documentation says that "OS-specific restrictions +// might apply". In particular, whether or not renaming a file or directory +// overwriting another existing file or directory is an error is OS-dependent. +type FileSystem interface { + Mkdir(ctx context.Context, name string, perm os.FileMode) error + OpenFile(ctx context.Context, name string, flag int, perm os.FileMode) (File, error) + RemoveAll(ctx context.Context, name string) error + Rename(ctx context.Context, oldName, newName string) error + Stat(ctx context.Context, name string) (os.FileInfo, error) +} + +// A File is returned by a FileSystem's OpenFile method and can be served by a +// Handler. +// +// A File may optionally implement the DeadPropsHolder interface, if it can +// load and save dead properties. +type File interface { + http.File + io.Writer +} + +// A Dir implements FileSystem using the native file system restricted to a +// specific directory tree. +// +// While the FileSystem.OpenFile method takes '/'-separated paths, a Dir's +// string value is a filename on the native file system, not a URL, so it is +// separated by filepath.Separator, which isn't necessarily '/'. +// +// An empty Dir is treated as ".". +type Dir string + +func (d Dir) resolve(name string) string { + // This implementation is based on Dir.Open's code in the standard net/http package. + if filepath.Separator != '/' && strings.IndexRune(name, filepath.Separator) >= 0 || + strings.Contains(name, "\x00") { + return "" + } + dir := string(d) + if dir == "" { + dir = "." + } + return filepath.Join(dir, filepath.FromSlash(slashClean(name))) +} + +func (d Dir) Mkdir(ctx context.Context, name string, perm os.FileMode) error { + if name = d.resolve(name); name == "" { + return os.ErrNotExist + } + return os.Mkdir(name, perm) +} + +func (d Dir) OpenFile(ctx context.Context, name string, flag int, perm os.FileMode) (File, error) { + if name = d.resolve(name); name == "" { + return nil, os.ErrNotExist + } + f, err := os.OpenFile(name, flag, perm) + if err != nil { + return nil, err + } + return f, nil +} + +func (d Dir) RemoveAll(ctx context.Context, name string) error { + if name = d.resolve(name); name == "" { + return os.ErrNotExist + } + if name == filepath.Clean(string(d)) { + // Prohibit removing the virtual root directory. + return os.ErrInvalid + } + return os.RemoveAll(name) +} + +func (d Dir) Rename(ctx context.Context, oldName, newName string) error { + if oldName = d.resolve(oldName); oldName == "" { + return os.ErrNotExist + } + if newName = d.resolve(newName); newName == "" { + return os.ErrNotExist + } + if root := filepath.Clean(string(d)); root == oldName || root == newName { + // Prohibit renaming from or to the virtual root directory. + return os.ErrInvalid + } + return os.Rename(oldName, newName) +} + +func (d Dir) Stat(ctx context.Context, name string) (os.FileInfo, error) { + if name = d.resolve(name); name == "" { + return nil, os.ErrNotExist + } + return os.Stat(name) +} + +// NewMemFS returns a new in-memory FileSystem implementation. +func NewMemFS() FileSystem { + return &memFS{ + root: memFSNode{ + children: make(map[string]*memFSNode), + mode: 0660 | os.ModeDir, + modTime: time.Now(), + }, + } +} + +// A memFS implements FileSystem, storing all metadata and actual file data +// in-memory. No limits on filesystem size are used, so it is not recommended +// this be used where the clients are untrusted. +// +// Concurrent access is permitted. The tree structure is protected by a mutex, +// and each node's contents and metadata are protected by a per-node mutex. +// +// TODO: Enforce file permissions. +type memFS struct { + mu sync.Mutex + root memFSNode +} + +// TODO: clean up and rationalize the walk/find code. + +// walk walks the directory tree for the fullname, calling f at each step. If f +// returns an error, the walk will be aborted and return that same error. +// +// dir is the directory at that step, frag is the name fragment, and final is +// whether it is the final step. For example, walking "/foo/bar/x" will result +// in 3 calls to f: +// - "/", "foo", false +// - "/foo/", "bar", false +// - "/foo/bar/", "x", true +// The frag argument will be empty only if dir is the root node and the walk +// ends at that root node. +func (fs *memFS) walk(op, fullname string, f func(dir *memFSNode, frag string, final bool) error) error { + original := fullname + fullname = slashClean(fullname) + + // Strip any leading "/"s to make fullname a relative path, as the walk + // starts at fs.root. + if fullname[0] == '/' { + fullname = fullname[1:] + } + dir := &fs.root + + for { + frag, remaining := fullname, "" + i := strings.IndexRune(fullname, '/') + final := i < 0 + if !final { + frag, remaining = fullname[:i], fullname[i+1:] + } + if frag == "" && dir != &fs.root { + panic("webdav: empty path fragment for a clean path") + } + if err := f(dir, frag, final); err != nil { + return &os.PathError{ + Op: op, + Path: original, + Err: err, + } + } + if final { + break + } + child := dir.children[frag] + if child == nil { + return &os.PathError{ + Op: op, + Path: original, + Err: os.ErrNotExist, + } + } + if !child.mode.IsDir() { + return &os.PathError{ + Op: op, + Path: original, + Err: os.ErrInvalid, + } + } + dir, fullname = child, remaining + } + return nil +} + +// find returns the parent of the named node and the relative name fragment +// from the parent to the child. For example, if finding "/foo/bar/baz" then +// parent will be the node for "/foo/bar" and frag will be "baz". +// +// If the fullname names the root node, then parent, frag and err will be zero. +// +// find returns an error if the parent does not already exist or the parent +// isn't a directory, but it will not return an error per se if the child does +// not already exist. The error returned is either nil or an *os.PathError +// whose Op is op. +func (fs *memFS) find(op, fullname string) (parent *memFSNode, frag string, err error) { + err = fs.walk(op, fullname, func(parent0 *memFSNode, frag0 string, final bool) error { + if !final { + return nil + } + if frag0 != "" { + parent, frag = parent0, frag0 + } + return nil + }) + return parent, frag, err +} + +func (fs *memFS) Mkdir(ctx context.Context, name string, perm os.FileMode) error { + fs.mu.Lock() + defer fs.mu.Unlock() + + dir, frag, err := fs.find("mkdir", name) + if err != nil { + return err + } + if dir == nil { + // We can't create the root. + return os.ErrInvalid + } + if _, ok := dir.children[frag]; ok { + return os.ErrExist + } + dir.children[frag] = &memFSNode{ + children: make(map[string]*memFSNode), + mode: perm.Perm() | os.ModeDir, + modTime: time.Now(), + } + return nil +} + +func (fs *memFS) OpenFile(ctx context.Context, name string, flag int, perm os.FileMode) (File, error) { + fs.mu.Lock() + defer fs.mu.Unlock() + + dir, frag, err := fs.find("open", name) + if err != nil { + return nil, err + } + var n *memFSNode + if dir == nil { + // We're opening the root. + if flag&(os.O_WRONLY|os.O_RDWR) != 0 { + return nil, os.ErrPermission + } + n, frag = &fs.root, "/" + + } else { + n = dir.children[frag] + if flag&(os.O_SYNC|os.O_APPEND) != 0 { + // memFile doesn't support these flags yet. + return nil, os.ErrInvalid + } + if flag&os.O_CREATE != 0 { + if flag&os.O_EXCL != 0 && n != nil { + return nil, os.ErrExist + } + if n == nil { + n = &memFSNode{ + mode: perm.Perm(), + } + dir.children[frag] = n + } + } + if n == nil { + return nil, os.ErrNotExist + } + if flag&(os.O_WRONLY|os.O_RDWR) != 0 && flag&os.O_TRUNC != 0 { + n.mu.Lock() + n.data = nil + n.mu.Unlock() + } + } + + children := make([]os.FileInfo, 0, len(n.children)) + for cName, c := range n.children { + children = append(children, c.stat(cName)) + } + return &memFile{ + n: n, + nameSnapshot: frag, + childrenSnapshot: children, + }, nil +} + +func (fs *memFS) RemoveAll(ctx context.Context, name string) error { + fs.mu.Lock() + defer fs.mu.Unlock() + + dir, frag, err := fs.find("remove", name) + if err != nil { + return err + } + if dir == nil { + // We can't remove the root. + return os.ErrInvalid + } + delete(dir.children, frag) + return nil +} + +func (fs *memFS) Rename(ctx context.Context, oldName, newName string) error { + fs.mu.Lock() + defer fs.mu.Unlock() + + oldName = slashClean(oldName) + newName = slashClean(newName) + if oldName == newName { + return nil + } + if strings.HasPrefix(newName, oldName+"/") { + // We can't rename oldName to be a sub-directory of itself. + return os.ErrInvalid + } + + oDir, oFrag, err := fs.find("rename", oldName) + if err != nil { + return err + } + if oDir == nil { + // We can't rename from the root. + return os.ErrInvalid + } + + nDir, nFrag, err := fs.find("rename", newName) + if err != nil { + return err + } + if nDir == nil { + // We can't rename to the root. + return os.ErrInvalid + } + + oNode, ok := oDir.children[oFrag] + if !ok { + return os.ErrNotExist + } + if oNode.children != nil { + if nNode, ok := nDir.children[nFrag]; ok { + if nNode.children == nil { + return errNotADirectory + } + if len(nNode.children) != 0 { + return errDirectoryNotEmpty + } + } + } + delete(oDir.children, oFrag) + nDir.children[nFrag] = oNode + return nil +} + +func (fs *memFS) Stat(ctx context.Context, name string) (os.FileInfo, error) { + fs.mu.Lock() + defer fs.mu.Unlock() + + dir, frag, err := fs.find("stat", name) + if err != nil { + return nil, err + } + if dir == nil { + // We're stat'ting the root. + return fs.root.stat("/"), nil + } + if n, ok := dir.children[frag]; ok { + return n.stat(path.Base(name)), nil + } + return nil, os.ErrNotExist +} + +// A memFSNode represents a single entry in the in-memory filesystem and also +// implements os.FileInfo. +type memFSNode struct { + // children is protected by memFS.mu. + children map[string]*memFSNode + + mu sync.Mutex + data []byte + mode os.FileMode + modTime time.Time + deadProps map[xml.Name]Property +} + +func (n *memFSNode) stat(name string) *memFileInfo { + n.mu.Lock() + defer n.mu.Unlock() + return &memFileInfo{ + name: name, + size: int64(len(n.data)), + mode: n.mode, + modTime: n.modTime, + } +} + +func (n *memFSNode) DeadProps() (map[xml.Name]Property, error) { + n.mu.Lock() + defer n.mu.Unlock() + if len(n.deadProps) == 0 { + return nil, nil + } + ret := make(map[xml.Name]Property, len(n.deadProps)) + for k, v := range n.deadProps { + ret[k] = v + } + return ret, nil +} + +func (n *memFSNode) Patch(patches []Proppatch) ([]Propstat, error) { + n.mu.Lock() + defer n.mu.Unlock() + pstat := Propstat{Status: http.StatusOK} + for _, patch := range patches { + for _, p := range patch.Props { + pstat.Props = append(pstat.Props, Property{XMLName: p.XMLName}) + if patch.Remove { + delete(n.deadProps, p.XMLName) + continue + } + if n.deadProps == nil { + n.deadProps = map[xml.Name]Property{} + } + n.deadProps[p.XMLName] = p + } + } + return []Propstat{pstat}, nil +} + +type memFileInfo struct { + name string + size int64 + mode os.FileMode + modTime time.Time +} + +func (f *memFileInfo) Name() string { return f.name } +func (f *memFileInfo) Size() int64 { return f.size } +func (f *memFileInfo) Mode() os.FileMode { return f.mode } +func (f *memFileInfo) ModTime() time.Time { return f.modTime } +func (f *memFileInfo) IsDir() bool { return f.mode.IsDir() } +func (f *memFileInfo) Sys() interface{} { return nil } + +// A memFile is a File implementation for a memFSNode. It is a per-file (not +// per-node) read/write position, and a snapshot of the memFS' tree structure +// (a node's name and children) for that node. +type memFile struct { + n *memFSNode + nameSnapshot string + childrenSnapshot []os.FileInfo + // pos is protected by n.mu. + pos int +} + +// A *memFile implements the optional DeadPropsHolder interface. +var _ DeadPropsHolder = (*memFile)(nil) + +func (f *memFile) DeadProps() (map[xml.Name]Property, error) { return f.n.DeadProps() } +func (f *memFile) Patch(patches []Proppatch) ([]Propstat, error) { return f.n.Patch(patches) } + +func (f *memFile) Close() error { + return nil +} + +func (f *memFile) Read(p []byte) (int, error) { + f.n.mu.Lock() + defer f.n.mu.Unlock() + if f.n.mode.IsDir() { + return 0, os.ErrInvalid + } + if f.pos >= len(f.n.data) { + return 0, io.EOF + } + n := copy(p, f.n.data[f.pos:]) + f.pos += n + return n, nil +} + +func (f *memFile) Readdir(count int) ([]os.FileInfo, error) { + f.n.mu.Lock() + defer f.n.mu.Unlock() + if !f.n.mode.IsDir() { + return nil, os.ErrInvalid + } + old := f.pos + if old >= len(f.childrenSnapshot) { + // The os.File Readdir docs say that at the end of a directory, + // the error is io.EOF if count > 0 and nil if count <= 0. + if count > 0 { + return nil, io.EOF + } + return nil, nil + } + if count > 0 { + f.pos += count + if f.pos > len(f.childrenSnapshot) { + f.pos = len(f.childrenSnapshot) + } + } else { + f.pos = len(f.childrenSnapshot) + old = 0 + } + return f.childrenSnapshot[old:f.pos], nil +} + +func (f *memFile) Seek(offset int64, whence int) (int64, error) { + f.n.mu.Lock() + defer f.n.mu.Unlock() + npos := f.pos + // TODO: How to handle offsets greater than the size of system int? + switch whence { + case os.SEEK_SET: + npos = int(offset) + case os.SEEK_CUR: + npos += int(offset) + case os.SEEK_END: + npos = len(f.n.data) + int(offset) + default: + npos = -1 + } + if npos < 0 { + return 0, os.ErrInvalid + } + f.pos = npos + return int64(f.pos), nil +} + +func (f *memFile) Stat() (os.FileInfo, error) { + return f.n.stat(f.nameSnapshot), nil +} + +func (f *memFile) Write(p []byte) (int, error) { + lenp := len(p) + f.n.mu.Lock() + defer f.n.mu.Unlock() + + if f.n.mode.IsDir() { + return 0, os.ErrInvalid + } + if f.pos < len(f.n.data) { + n := copy(f.n.data[f.pos:], p) + f.pos += n + p = p[n:] + } else if f.pos > len(f.n.data) { + // Write permits the creation of holes, if we've seek'ed past the + // existing end of file. + if f.pos <= cap(f.n.data) { + oldLen := len(f.n.data) + f.n.data = f.n.data[:f.pos] + hole := f.n.data[oldLen:] + for i := range hole { + hole[i] = 0 + } + } else { + d := make([]byte, f.pos, f.pos+len(p)) + copy(d, f.n.data) + f.n.data = d + } + } + + if len(p) > 0 { + // We should only get here if f.pos == len(f.n.data). + f.n.data = append(f.n.data, p...) + f.pos = len(f.n.data) + } + f.n.modTime = time.Now() + return lenp, nil +} + +// moveFiles moves files and/or directories from src to dst. +// +// See section 9.9.4 for when various HTTP status codes apply. +func moveFiles(ctx context.Context, fs FileSystem, src, dst string, overwrite bool) (status int, err error) { + created := false + if _, err := fs.Stat(ctx, dst); err != nil { + if !os.IsNotExist(err) { + return http.StatusForbidden, err + } + created = true + } else if overwrite { + // Section 9.9.3 says that "If a resource exists at the destination + // and the Overwrite header is "T", then prior to performing the move, + // the server must perform a DELETE with "Depth: infinity" on the + // destination resource. + if err := fs.RemoveAll(ctx, dst); err != nil { + return http.StatusForbidden, err + } + } else { + return http.StatusPreconditionFailed, os.ErrExist + } + if err := fs.Rename(ctx, src, dst); err != nil { + return http.StatusForbidden, err + } + if created { + return http.StatusCreated, nil + } + return http.StatusNoContent, nil +} + +func copyProps(dst, src File) error { + d, ok := dst.(DeadPropsHolder) + if !ok { + return nil + } + s, ok := src.(DeadPropsHolder) + if !ok { + return nil + } + m, err := s.DeadProps() + if err != nil { + return err + } + props := make([]Property, 0, len(m)) + for _, prop := range m { + props = append(props, prop) + } + _, err = d.Patch([]Proppatch{{Props: props}}) + return err +} + +// copyFiles copies files and/or directories from src to dst. +// +// See section 9.8.5 for when various HTTP status codes apply. +func copyFiles(ctx context.Context, fs FileSystem, src, dst string, overwrite bool, depth int, recursion int) (status int, err error) { + if recursion == 1000 { + return http.StatusInternalServerError, errRecursionTooDeep + } + recursion++ + + // TODO: section 9.8.3 says that "Note that an infinite-depth COPY of /A/ + // into /A/B/ could lead to infinite recursion if not handled correctly." + + srcFile, err := fs.OpenFile(ctx, src, os.O_RDONLY, 0) + if err != nil { + if os.IsNotExist(err) { + return http.StatusNotFound, err + } + return http.StatusInternalServerError, err + } + defer srcFile.Close() + srcStat, err := srcFile.Stat() + if err != nil { + if os.IsNotExist(err) { + return http.StatusNotFound, err + } + return http.StatusInternalServerError, err + } + srcPerm := srcStat.Mode() & os.ModePerm + + created := false + if _, err := fs.Stat(ctx, dst); err != nil { + if os.IsNotExist(err) { + created = true + } else { + return http.StatusForbidden, err + } + } else { + if !overwrite { + return http.StatusPreconditionFailed, os.ErrExist + } + if err := fs.RemoveAll(ctx, dst); err != nil && !os.IsNotExist(err) { + return http.StatusForbidden, err + } + } + + if srcStat.IsDir() { + if err := fs.Mkdir(ctx, dst, srcPerm); err != nil { + return http.StatusForbidden, err + } + if depth == infiniteDepth { + children, err := srcFile.Readdir(-1) + if err != nil { + return http.StatusForbidden, err + } + for _, c := range children { + name := c.Name() + s := path.Join(src, name) + d := path.Join(dst, name) + cStatus, cErr := copyFiles(ctx, fs, s, d, overwrite, depth, recursion) + if cErr != nil { + // TODO: MultiStatus. + return cStatus, cErr + } + } + } + + } else { + dstFile, err := fs.OpenFile(ctx, dst, os.O_RDWR|os.O_CREATE|os.O_TRUNC, srcPerm) + if err != nil { + if os.IsNotExist(err) { + return http.StatusConflict, err + } + return http.StatusForbidden, err + + } + _, copyErr := io.Copy(dstFile, srcFile) + propsErr := copyProps(dstFile, srcFile) + closeErr := dstFile.Close() + if copyErr != nil { + return http.StatusInternalServerError, copyErr + } + if propsErr != nil { + return http.StatusInternalServerError, propsErr + } + if closeErr != nil { + return http.StatusInternalServerError, closeErr + } + } + + if created { + return http.StatusCreated, nil + } + return http.StatusNoContent, nil +} + +// walkFS traverses filesystem fs starting at name up to depth levels. +// +// Allowed values for depth are 0, 1 or infiniteDepth. For each visited node, +// walkFS calls walkFn. If a visited file system node is a directory and +// walkFn returns filepath.SkipDir, walkFS will skip traversal of this node. +func walkFS(ctx context.Context, fs FileSystem, depth int, name string, info os.FileInfo, walkFn filepath.WalkFunc) error { + // This implementation is based on Walk's code in the standard path/filepath package. + err := walkFn(name, info, nil) + if err != nil { + if info.IsDir() && err == filepath.SkipDir { + return nil + } + return err + } + if !info.IsDir() || depth == 0 { + return nil + } + if depth == 1 { + depth = 0 + } + + // Read directory names. + f, err := fs.OpenFile(ctx, name, os.O_RDONLY, 0) + if err != nil { + return walkFn(name, info, err) + } + fileInfos, err := f.Readdir(0) + f.Close() + if err != nil { + return walkFn(name, info, err) + } + + for _, fileInfo := range fileInfos { + filename := path.Join(name, fileInfo.Name()) + fileInfo, err := fs.Stat(ctx, filename) + if err != nil { + if err := walkFn(filename, fileInfo, err); err != nil && err != filepath.SkipDir { + return err + } + } else { + err = walkFS(ctx, fs, depth, filename, fileInfo, walkFn) + if err != nil { + if !fileInfo.IsDir() || err != filepath.SkipDir { + return err + } + } + } + } + return nil +} diff --git a/api/vendor/golang.org/x/net/webdav/file_go1.6.go b/api/vendor/golang.org/x/net/webdav/file_go1.6.go new file mode 100644 index 0000000..fa38770 --- /dev/null +++ b/api/vendor/golang.org/x/net/webdav/file_go1.6.go @@ -0,0 +1,17 @@ +// 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. + +// +build !go1.7 + +package webdav + +import ( + "net/http" + + "golang.org/x/net/context" +) + +func getContext(r *http.Request) context.Context { + return context.Background() +} diff --git a/api/vendor/golang.org/x/net/webdav/file_go1.7.go b/api/vendor/golang.org/x/net/webdav/file_go1.7.go new file mode 100644 index 0000000..d1c3de8 --- /dev/null +++ b/api/vendor/golang.org/x/net/webdav/file_go1.7.go @@ -0,0 +1,16 @@ +// 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. + +// +build go1.7 + +package webdav + +import ( + "context" + "net/http" +) + +func getContext(r *http.Request) context.Context { + return r.Context() +} diff --git a/api/vendor/golang.org/x/net/webdav/file_test.go b/api/vendor/golang.org/x/net/webdav/file_test.go new file mode 100644 index 0000000..bfd96e1 --- /dev/null +++ b/api/vendor/golang.org/x/net/webdav/file_test.go @@ -0,0 +1,1184 @@ +// 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 webdav + +import ( + "encoding/xml" + "fmt" + "io" + "io/ioutil" + "os" + "path" + "path/filepath" + "reflect" + "runtime" + "sort" + "strconv" + "strings" + "testing" + + "golang.org/x/net/context" +) + +func TestSlashClean(t *testing.T) { + testCases := []string{ + "", + ".", + "/", + "/./", + "//", + "//.", + "//a", + "/a", + "/a/b/c", + "/a//b/./../c/d/", + "a", + "a/b/c", + } + for _, tc := range testCases { + got := slashClean(tc) + want := path.Clean("/" + tc) + if got != want { + t.Errorf("tc=%q: got %q, want %q", tc, got, want) + } + } +} + +func TestDirResolve(t *testing.T) { + testCases := []struct { + dir, name, want string + }{ + {"/", "", "/"}, + {"/", "/", "/"}, + {"/", ".", "/"}, + {"/", "./a", "/a"}, + {"/", "..", "/"}, + {"/", "..", "/"}, + {"/", "../", "/"}, + {"/", "../.", "/"}, + {"/", "../a", "/a"}, + {"/", "../..", "/"}, + {"/", "../bar/a", "/bar/a"}, + {"/", "../baz/a", "/baz/a"}, + {"/", "...", "/..."}, + {"/", ".../a", "/.../a"}, + {"/", ".../..", "/"}, + {"/", "a", "/a"}, + {"/", "a/./b", "/a/b"}, + {"/", "a/../../b", "/b"}, + {"/", "a/../b", "/b"}, + {"/", "a/b", "/a/b"}, + {"/", "a/b/c/../../d", "/a/d"}, + {"/", "a/b/c/../../../d", "/d"}, + {"/", "a/b/c/../../../../d", "/d"}, + {"/", "a/b/c/d", "/a/b/c/d"}, + + {"/foo/bar", "", "/foo/bar"}, + {"/foo/bar", "/", "/foo/bar"}, + {"/foo/bar", ".", "/foo/bar"}, + {"/foo/bar", "./a", "/foo/bar/a"}, + {"/foo/bar", "..", "/foo/bar"}, + {"/foo/bar", "../", "/foo/bar"}, + {"/foo/bar", "../.", "/foo/bar"}, + {"/foo/bar", "../a", "/foo/bar/a"}, + {"/foo/bar", "../..", "/foo/bar"}, + {"/foo/bar", "../bar/a", "/foo/bar/bar/a"}, + {"/foo/bar", "../baz/a", "/foo/bar/baz/a"}, + {"/foo/bar", "...", "/foo/bar/..."}, + {"/foo/bar", ".../a", "/foo/bar/.../a"}, + {"/foo/bar", ".../..", "/foo/bar"}, + {"/foo/bar", "a", "/foo/bar/a"}, + {"/foo/bar", "a/./b", "/foo/bar/a/b"}, + {"/foo/bar", "a/../../b", "/foo/bar/b"}, + {"/foo/bar", "a/../b", "/foo/bar/b"}, + {"/foo/bar", "a/b", "/foo/bar/a/b"}, + {"/foo/bar", "a/b/c/../../d", "/foo/bar/a/d"}, + {"/foo/bar", "a/b/c/../../../d", "/foo/bar/d"}, + {"/foo/bar", "a/b/c/../../../../d", "/foo/bar/d"}, + {"/foo/bar", "a/b/c/d", "/foo/bar/a/b/c/d"}, + + {"/foo/bar/", "", "/foo/bar"}, + {"/foo/bar/", "/", "/foo/bar"}, + {"/foo/bar/", ".", "/foo/bar"}, + {"/foo/bar/", "./a", "/foo/bar/a"}, + {"/foo/bar/", "..", "/foo/bar"}, + + {"/foo//bar///", "", "/foo/bar"}, + {"/foo//bar///", "/", "/foo/bar"}, + {"/foo//bar///", ".", "/foo/bar"}, + {"/foo//bar///", "./a", "/foo/bar/a"}, + {"/foo//bar///", "..", "/foo/bar"}, + + {"/x/y/z", "ab/c\x00d/ef", ""}, + + {".", "", "."}, + {".", "/", "."}, + {".", ".", "."}, + {".", "./a", "a"}, + {".", "..", "."}, + {".", "..", "."}, + {".", "../", "."}, + {".", "../.", "."}, + {".", "../a", "a"}, + {".", "../..", "."}, + {".", "../bar/a", "bar/a"}, + {".", "../baz/a", "baz/a"}, + {".", "...", "..."}, + {".", ".../a", ".../a"}, + {".", ".../..", "."}, + {".", "a", "a"}, + {".", "a/./b", "a/b"}, + {".", "a/../../b", "b"}, + {".", "a/../b", "b"}, + {".", "a/b", "a/b"}, + {".", "a/b/c/../../d", "a/d"}, + {".", "a/b/c/../../../d", "d"}, + {".", "a/b/c/../../../../d", "d"}, + {".", "a/b/c/d", "a/b/c/d"}, + + {"", "", "."}, + {"", "/", "."}, + {"", ".", "."}, + {"", "./a", "a"}, + {"", "..", "."}, + } + + for _, tc := range testCases { + d := Dir(filepath.FromSlash(tc.dir)) + if got := filepath.ToSlash(d.resolve(tc.name)); got != tc.want { + t.Errorf("dir=%q, name=%q: got %q, want %q", tc.dir, tc.name, got, tc.want) + } + } +} + +func TestWalk(t *testing.T) { + type walkStep struct { + name, frag string + final bool + } + + testCases := []struct { + dir string + want []walkStep + }{ + {"", []walkStep{ + {"", "", true}, + }}, + {"/", []walkStep{ + {"", "", true}, + }}, + {"/a", []walkStep{ + {"", "a", true}, + }}, + {"/a/", []walkStep{ + {"", "a", true}, + }}, + {"/a/b", []walkStep{ + {"", "a", false}, + {"a", "b", true}, + }}, + {"/a/b/", []walkStep{ + {"", "a", false}, + {"a", "b", true}, + }}, + {"/a/b/c", []walkStep{ + {"", "a", false}, + {"a", "b", false}, + {"b", "c", true}, + }}, + // The following test case is the one mentioned explicitly + // in the method description. + {"/foo/bar/x", []walkStep{ + {"", "foo", false}, + {"foo", "bar", false}, + {"bar", "x", true}, + }}, + } + + ctx := context.Background() + + for _, tc := range testCases { + fs := NewMemFS().(*memFS) + + parts := strings.Split(tc.dir, "/") + for p := 2; p < len(parts); p++ { + d := strings.Join(parts[:p], "/") + if err := fs.Mkdir(ctx, d, 0666); err != nil { + t.Errorf("tc.dir=%q: mkdir: %q: %v", tc.dir, d, err) + } + } + + i, prevFrag := 0, "" + err := fs.walk("test", tc.dir, func(dir *memFSNode, frag string, final bool) error { + got := walkStep{ + name: prevFrag, + frag: frag, + final: final, + } + want := tc.want[i] + + if got != want { + return fmt.Errorf("got %+v, want %+v", got, want) + } + i, prevFrag = i+1, frag + return nil + }) + if err != nil { + t.Errorf("tc.dir=%q: %v", tc.dir, err) + } + } +} + +// find appends to ss the names of the named file and its children. It is +// analogous to the Unix find command. +// +// The returned strings are not guaranteed to be in any particular order. +func find(ctx context.Context, ss []string, fs FileSystem, name string) ([]string, error) { + stat, err := fs.Stat(ctx, name) + if err != nil { + return nil, err + } + ss = append(ss, name) + if stat.IsDir() { + f, err := fs.OpenFile(ctx, name, os.O_RDONLY, 0) + if err != nil { + return nil, err + } + defer f.Close() + children, err := f.Readdir(-1) + if err != nil { + return nil, err + } + for _, c := range children { + ss, err = find(ctx, ss, fs, path.Join(name, c.Name())) + if err != nil { + return nil, err + } + } + } + return ss, nil +} + +func testFS(t *testing.T, fs FileSystem) { + errStr := func(err error) string { + switch { + case os.IsExist(err): + return "errExist" + case os.IsNotExist(err): + return "errNotExist" + case err != nil: + return "err" + } + return "ok" + } + + // The non-"find" non-"stat" test cases should change the file system state. The + // indentation of the "find"s and "stat"s helps distinguish such test cases. + testCases := []string{ + " stat / want dir", + " stat /a want errNotExist", + " stat /d want errNotExist", + " stat /d/e want errNotExist", + "create /a A want ok", + " stat /a want 1", + "create /d/e EEE want errNotExist", + "mk-dir /a want errExist", + "mk-dir /d/m want errNotExist", + "mk-dir /d want ok", + " stat /d want dir", + "create /d/e EEE want ok", + " stat /d/e want 3", + " find / /a /d /d/e", + "create /d/f FFFF want ok", + "create /d/g GGGGGGG want ok", + "mk-dir /d/m want ok", + "mk-dir /d/m want errExist", + "create /d/m/p PPPPP want ok", + " stat /d/e want 3", + " stat /d/f want 4", + " stat /d/g want 7", + " stat /d/h want errNotExist", + " stat /d/m want dir", + " stat /d/m/p want 5", + " find / /a /d /d/e /d/f /d/g /d/m /d/m/p", + "rm-all /d want ok", + " stat /a want 1", + " stat /d want errNotExist", + " stat /d/e want errNotExist", + " stat /d/f want errNotExist", + " stat /d/g want errNotExist", + " stat /d/m want errNotExist", + " stat /d/m/p want errNotExist", + " find / /a", + "mk-dir /d/m want errNotExist", + "mk-dir /d want ok", + "create /d/f FFFF want ok", + "rm-all /d/f want ok", + "mk-dir /d/m want ok", + "rm-all /z want ok", + "rm-all / want err", + "create /b BB want ok", + " stat / want dir", + " stat /a want 1", + " stat /b want 2", + " stat /c want errNotExist", + " stat /d want dir", + " stat /d/m want dir", + " find / /a /b /d /d/m", + "move__ o=F /b /c want ok", + " stat /b want errNotExist", + " stat /c want 2", + " stat /d/m want dir", + " stat /d/n want errNotExist", + " find / /a /c /d /d/m", + "move__ o=F /d/m /d/n want ok", + "create /d/n/q QQQQ want ok", + " stat /d/m want errNotExist", + " stat /d/n want dir", + " stat /d/n/q want 4", + "move__ o=F /d /d/n/z want err", + "move__ o=T /c /d/n/q want ok", + " stat /c want errNotExist", + " stat /d/n/q want 2", + " find / /a /d /d/n /d/n/q", + "create /d/n/r RRRRR want ok", + "mk-dir /u want ok", + "mk-dir /u/v want ok", + "move__ o=F /d/n /u want errExist", + "create /t TTTTTT want ok", + "move__ o=F /d/n /t want errExist", + "rm-all /t want ok", + "move__ o=F /d/n /t want ok", + " stat /d want dir", + " stat /d/n want errNotExist", + " stat /d/n/r want errNotExist", + " stat /t want dir", + " stat /t/q want 2", + " stat /t/r want 5", + " find / /a /d /t /t/q /t/r /u /u/v", + "move__ o=F /t / want errExist", + "move__ o=T /t /u/v want ok", + " stat /u/v/r want 5", + "move__ o=F / /z want err", + " find / /a /d /u /u/v /u/v/q /u/v/r", + " stat /a want 1", + " stat /b want errNotExist", + " stat /c want errNotExist", + " stat /u/v/r want 5", + "copy__ o=F d=0 /a /b want ok", + "copy__ o=T d=0 /a /c want ok", + " stat /a want 1", + " stat /b want 1", + " stat /c want 1", + " stat /u/v/r want 5", + "copy__ o=F d=0 /u/v/r /b want errExist", + " stat /b want 1", + "copy__ o=T d=0 /u/v/r /b want ok", + " stat /a want 1", + " stat /b want 5", + " stat /u/v/r want 5", + "rm-all /a want ok", + "rm-all /b want ok", + "mk-dir /u/v/w want ok", + "create /u/v/w/s SSSSSSSS want ok", + " stat /d want dir", + " stat /d/x want errNotExist", + " stat /d/y want errNotExist", + " stat /u/v/r want 5", + " stat /u/v/w/s want 8", + " find / /c /d /u /u/v /u/v/q /u/v/r /u/v/w /u/v/w/s", + "copy__ o=T d=0 /u/v /d/x want ok", + "copy__ o=T d=∞ /u/v /d/y want ok", + "rm-all /u want ok", + " stat /d/x want dir", + " stat /d/x/q want errNotExist", + " stat /d/x/r want errNotExist", + " stat /d/x/w want errNotExist", + " stat /d/x/w/s want errNotExist", + " stat /d/y want dir", + " stat /d/y/q want 2", + " stat /d/y/r want 5", + " stat /d/y/w want dir", + " stat /d/y/w/s want 8", + " stat /u want errNotExist", + " find / /c /d /d/x /d/y /d/y/q /d/y/r /d/y/w /d/y/w/s", + "copy__ o=F d=∞ /d/y /d/x want errExist", + } + + ctx := context.Background() + + for i, tc := range testCases { + tc = strings.TrimSpace(tc) + j := strings.IndexByte(tc, ' ') + if j < 0 { + t.Fatalf("test case #%d %q: invalid command", i, tc) + } + op, arg := tc[:j], tc[j+1:] + + switch op { + default: + t.Fatalf("test case #%d %q: invalid operation %q", i, tc, op) + + case "create": + parts := strings.Split(arg, " ") + if len(parts) != 4 || parts[2] != "want" { + t.Fatalf("test case #%d %q: invalid write", i, tc) + } + f, opErr := fs.OpenFile(ctx, parts[0], os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) + if got := errStr(opErr); got != parts[3] { + t.Fatalf("test case #%d %q: OpenFile: got %q (%v), want %q", i, tc, got, opErr, parts[3]) + } + if f != nil { + if _, err := f.Write([]byte(parts[1])); err != nil { + t.Fatalf("test case #%d %q: Write: %v", i, tc, err) + } + if err := f.Close(); err != nil { + t.Fatalf("test case #%d %q: Close: %v", i, tc, err) + } + } + + case "find": + got, err := find(ctx, nil, fs, "/") + if err != nil { + t.Fatalf("test case #%d %q: find: %v", i, tc, err) + } + sort.Strings(got) + want := strings.Split(arg, " ") + if !reflect.DeepEqual(got, want) { + t.Fatalf("test case #%d %q:\ngot %s\nwant %s", i, tc, got, want) + } + + case "copy__", "mk-dir", "move__", "rm-all", "stat": + nParts := 3 + switch op { + case "copy__": + nParts = 6 + case "move__": + nParts = 5 + } + parts := strings.Split(arg, " ") + if len(parts) != nParts { + t.Fatalf("test case #%d %q: invalid %s", i, tc, op) + } + + got, opErr := "", error(nil) + switch op { + case "copy__": + depth := 0 + if parts[1] == "d=∞" { + depth = infiniteDepth + } + _, opErr = copyFiles(ctx, fs, parts[2], parts[3], parts[0] == "o=T", depth, 0) + case "mk-dir": + opErr = fs.Mkdir(ctx, parts[0], 0777) + case "move__": + _, opErr = moveFiles(ctx, fs, parts[1], parts[2], parts[0] == "o=T") + case "rm-all": + opErr = fs.RemoveAll(ctx, parts[0]) + case "stat": + var stat os.FileInfo + fileName := parts[0] + if stat, opErr = fs.Stat(ctx, fileName); opErr == nil { + if stat.IsDir() { + got = "dir" + } else { + got = strconv.Itoa(int(stat.Size())) + } + + if fileName == "/" { + // For a Dir FileSystem, the virtual file system root maps to a + // real file system name like "/tmp/webdav-test012345", which does + // not end with "/". We skip such cases. + } else if statName := stat.Name(); path.Base(fileName) != statName { + t.Fatalf("test case #%d %q: file name %q inconsistent with stat name %q", + i, tc, fileName, statName) + } + } + } + if got == "" { + got = errStr(opErr) + } + + if parts[len(parts)-2] != "want" { + t.Fatalf("test case #%d %q: invalid %s", i, tc, op) + } + if want := parts[len(parts)-1]; got != want { + t.Fatalf("test case #%d %q: got %q (%v), want %q", i, tc, got, opErr, want) + } + } + } +} + +func TestDir(t *testing.T) { + switch runtime.GOOS { + case "nacl": + t.Skip("see golang.org/issue/12004") + case "plan9": + t.Skip("see golang.org/issue/11453") + } + + td, err := ioutil.TempDir("", "webdav-test") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(td) + testFS(t, Dir(td)) +} + +func TestMemFS(t *testing.T) { + testFS(t, NewMemFS()) +} + +func TestMemFSRoot(t *testing.T) { + ctx := context.Background() + fs := NewMemFS() + for i := 0; i < 5; i++ { + stat, err := fs.Stat(ctx, "/") + if err != nil { + t.Fatalf("i=%d: Stat: %v", i, err) + } + if !stat.IsDir() { + t.Fatalf("i=%d: Stat.IsDir is false, want true", i) + } + + f, err := fs.OpenFile(ctx, "/", os.O_RDONLY, 0) + if err != nil { + t.Fatalf("i=%d: OpenFile: %v", i, err) + } + defer f.Close() + children, err := f.Readdir(-1) + if err != nil { + t.Fatalf("i=%d: Readdir: %v", i, err) + } + if len(children) != i { + t.Fatalf("i=%d: got %d children, want %d", i, len(children), i) + } + + if _, err := f.Write(make([]byte, 1)); err == nil { + t.Fatalf("i=%d: Write: got nil error, want non-nil", i) + } + + if err := fs.Mkdir(ctx, fmt.Sprintf("/dir%d", i), 0777); err != nil { + t.Fatalf("i=%d: Mkdir: %v", i, err) + } + } +} + +func TestMemFileReaddir(t *testing.T) { + ctx := context.Background() + fs := NewMemFS() + if err := fs.Mkdir(ctx, "/foo", 0777); err != nil { + t.Fatalf("Mkdir: %v", err) + } + readdir := func(count int) ([]os.FileInfo, error) { + f, err := fs.OpenFile(ctx, "/foo", os.O_RDONLY, 0) + if err != nil { + t.Fatalf("OpenFile: %v", err) + } + defer f.Close() + return f.Readdir(count) + } + if got, err := readdir(-1); len(got) != 0 || err != nil { + t.Fatalf("readdir(-1): got %d fileInfos with err=%v, want 0, ", len(got), err) + } + if got, err := readdir(+1); len(got) != 0 || err != io.EOF { + t.Fatalf("readdir(+1): got %d fileInfos with err=%v, want 0, EOF", len(got), err) + } +} + +func TestMemFile(t *testing.T) { + testCases := []string{ + "wantData ", + "wantSize 0", + "write abc", + "wantData abc", + "write de", + "wantData abcde", + "wantSize 5", + "write 5*x", + "write 4*y+2*z", + "write 3*st", + "wantData abcdexxxxxyyyyzzststst", + "wantSize 22", + "seek set 4 want 4", + "write EFG", + "wantData abcdEFGxxxyyyyzzststst", + "wantSize 22", + "seek set 2 want 2", + "read cdEF", + "read Gx", + "seek cur 0 want 8", + "seek cur 2 want 10", + "seek cur -1 want 9", + "write J", + "wantData abcdEFGxxJyyyyzzststst", + "wantSize 22", + "seek cur -4 want 6", + "write ghijk", + "wantData abcdEFghijkyyyzzststst", + "wantSize 22", + "read yyyz", + "seek cur 0 want 15", + "write ", + "seek cur 0 want 15", + "read ", + "seek cur 0 want 15", + "seek end -3 want 19", + "write ZZ", + "wantData abcdEFghijkyyyzzstsZZt", + "wantSize 22", + "write 4*A", + "wantData abcdEFghijkyyyzzstsZZAAAA", + "wantSize 25", + "seek end 0 want 25", + "seek end -5 want 20", + "read Z+4*A", + "write 5*B", + "wantData abcdEFghijkyyyzzstsZZAAAABBBBB", + "wantSize 30", + "seek end 10 want 40", + "write C", + "wantData abcdEFghijkyyyzzstsZZAAAABBBBB..........C", + "wantSize 41", + "write D", + "wantData abcdEFghijkyyyzzstsZZAAAABBBBB..........CD", + "wantSize 42", + "seek set 43 want 43", + "write E", + "wantData abcdEFghijkyyyzzstsZZAAAABBBBB..........CD.E", + "wantSize 44", + "seek set 0 want 0", + "write 5*123456789_", + "wantData 123456789_123456789_123456789_123456789_123456789_", + "wantSize 50", + "seek cur 0 want 50", + "seek cur -99 want err", + } + + ctx := context.Background() + + const filename = "/foo" + fs := NewMemFS() + f, err := fs.OpenFile(ctx, filename, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) + if err != nil { + t.Fatalf("OpenFile: %v", err) + } + defer f.Close() + + for i, tc := range testCases { + j := strings.IndexByte(tc, ' ') + if j < 0 { + t.Fatalf("test case #%d %q: invalid command", i, tc) + } + op, arg := tc[:j], tc[j+1:] + + // Expand an arg like "3*a+2*b" to "aaabb". + parts := strings.Split(arg, "+") + for j, part := range parts { + if k := strings.IndexByte(part, '*'); k >= 0 { + repeatCount, repeatStr := part[:k], part[k+1:] + n, err := strconv.Atoi(repeatCount) + if err != nil { + t.Fatalf("test case #%d %q: invalid repeat count %q", i, tc, repeatCount) + } + parts[j] = strings.Repeat(repeatStr, n) + } + } + arg = strings.Join(parts, "") + + switch op { + default: + t.Fatalf("test case #%d %q: invalid operation %q", i, tc, op) + + case "read": + buf := make([]byte, len(arg)) + if _, err := io.ReadFull(f, buf); err != nil { + t.Fatalf("test case #%d %q: ReadFull: %v", i, tc, err) + } + if got := string(buf); got != arg { + t.Fatalf("test case #%d %q:\ngot %q\nwant %q", i, tc, got, arg) + } + + case "seek": + parts := strings.Split(arg, " ") + if len(parts) != 4 { + t.Fatalf("test case #%d %q: invalid seek", i, tc) + } + + whence := 0 + switch parts[0] { + default: + t.Fatalf("test case #%d %q: invalid seek whence", i, tc) + case "set": + whence = os.SEEK_SET + case "cur": + whence = os.SEEK_CUR + case "end": + whence = os.SEEK_END + } + offset, err := strconv.Atoi(parts[1]) + if err != nil { + t.Fatalf("test case #%d %q: invalid offset %q", i, tc, parts[1]) + } + + if parts[2] != "want" { + t.Fatalf("test case #%d %q: invalid seek", i, tc) + } + if parts[3] == "err" { + _, err := f.Seek(int64(offset), whence) + if err == nil { + t.Fatalf("test case #%d %q: Seek returned nil error, want non-nil", i, tc) + } + } else { + got, err := f.Seek(int64(offset), whence) + if err != nil { + t.Fatalf("test case #%d %q: Seek: %v", i, tc, err) + } + want, err := strconv.Atoi(parts[3]) + if err != nil { + t.Fatalf("test case #%d %q: invalid want %q", i, tc, parts[3]) + } + if got != int64(want) { + t.Fatalf("test case #%d %q: got %d, want %d", i, tc, got, want) + } + } + + case "write": + n, err := f.Write([]byte(arg)) + if err != nil { + t.Fatalf("test case #%d %q: write: %v", i, tc, err) + } + if n != len(arg) { + t.Fatalf("test case #%d %q: write returned %d bytes, want %d", i, tc, n, len(arg)) + } + + case "wantData": + g, err := fs.OpenFile(ctx, filename, os.O_RDONLY, 0666) + if err != nil { + t.Fatalf("test case #%d %q: OpenFile: %v", i, tc, err) + } + gotBytes, err := ioutil.ReadAll(g) + if err != nil { + t.Fatalf("test case #%d %q: ReadAll: %v", i, tc, err) + } + for i, c := range gotBytes { + if c == '\x00' { + gotBytes[i] = '.' + } + } + got := string(gotBytes) + if got != arg { + t.Fatalf("test case #%d %q:\ngot %q\nwant %q", i, tc, got, arg) + } + if err := g.Close(); err != nil { + t.Fatalf("test case #%d %q: Close: %v", i, tc, err) + } + + case "wantSize": + n, err := strconv.Atoi(arg) + if err != nil { + t.Fatalf("test case #%d %q: invalid size %q", i, tc, arg) + } + fi, err := fs.Stat(ctx, filename) + if err != nil { + t.Fatalf("test case #%d %q: Stat: %v", i, tc, err) + } + if got, want := fi.Size(), int64(n); got != want { + t.Fatalf("test case #%d %q: got %d, want %d", i, tc, got, want) + } + } + } +} + +// TestMemFileWriteAllocs tests that writing N consecutive 1KiB chunks to a +// memFile doesn't allocate a new buffer for each of those N times. Otherwise, +// calling io.Copy(aMemFile, src) is likely to have quadratic complexity. +func TestMemFileWriteAllocs(t *testing.T) { + if runtime.Compiler == "gccgo" { + t.Skip("gccgo allocates here") + } + ctx := context.Background() + fs := NewMemFS() + f, err := fs.OpenFile(ctx, "/xxx", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) + if err != nil { + t.Fatalf("OpenFile: %v", err) + } + defer f.Close() + + xxx := make([]byte, 1024) + for i := range xxx { + xxx[i] = 'x' + } + + a := testing.AllocsPerRun(100, func() { + f.Write(xxx) + }) + // AllocsPerRun returns an integral value, so we compare the rounded-down + // number to zero. + if a > 0 { + t.Fatalf("%v allocs per run, want 0", a) + } +} + +func BenchmarkMemFileWrite(b *testing.B) { + ctx := context.Background() + fs := NewMemFS() + xxx := make([]byte, 1024) + for i := range xxx { + xxx[i] = 'x' + } + + b.ResetTimer() + for i := 0; i < b.N; i++ { + f, err := fs.OpenFile(ctx, "/xxx", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) + if err != nil { + b.Fatalf("OpenFile: %v", err) + } + for j := 0; j < 100; j++ { + f.Write(xxx) + } + if err := f.Close(); err != nil { + b.Fatalf("Close: %v", err) + } + if err := fs.RemoveAll(ctx, "/xxx"); err != nil { + b.Fatalf("RemoveAll: %v", err) + } + } +} + +func TestCopyMoveProps(t *testing.T) { + ctx := context.Background() + fs := NewMemFS() + create := func(name string) error { + f, err := fs.OpenFile(ctx, name, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) + if err != nil { + return err + } + _, wErr := f.Write([]byte("contents")) + cErr := f.Close() + if wErr != nil { + return wErr + } + return cErr + } + patch := func(name string, patches ...Proppatch) error { + f, err := fs.OpenFile(ctx, name, os.O_RDWR, 0666) + if err != nil { + return err + } + _, pErr := f.(DeadPropsHolder).Patch(patches) + cErr := f.Close() + if pErr != nil { + return pErr + } + return cErr + } + props := func(name string) (map[xml.Name]Property, error) { + f, err := fs.OpenFile(ctx, name, os.O_RDWR, 0666) + if err != nil { + return nil, err + } + m, pErr := f.(DeadPropsHolder).DeadProps() + cErr := f.Close() + if pErr != nil { + return nil, pErr + } + if cErr != nil { + return nil, cErr + } + return m, nil + } + + p0 := Property{ + XMLName: xml.Name{Space: "x:", Local: "boat"}, + InnerXML: []byte("pea-green"), + } + p1 := Property{ + XMLName: xml.Name{Space: "x:", Local: "ring"}, + InnerXML: []byte("1 shilling"), + } + p2 := Property{ + XMLName: xml.Name{Space: "x:", Local: "spoon"}, + InnerXML: []byte("runcible"), + } + p3 := Property{ + XMLName: xml.Name{Space: "x:", Local: "moon"}, + InnerXML: []byte("light"), + } + + if err := create("/src"); err != nil { + t.Fatalf("create /src: %v", err) + } + if err := patch("/src", Proppatch{Props: []Property{p0, p1}}); err != nil { + t.Fatalf("patch /src +p0 +p1: %v", err) + } + if _, err := copyFiles(ctx, fs, "/src", "/tmp", true, infiniteDepth, 0); err != nil { + t.Fatalf("copyFiles /src /tmp: %v", err) + } + if _, err := moveFiles(ctx, fs, "/tmp", "/dst", true); err != nil { + t.Fatalf("moveFiles /tmp /dst: %v", err) + } + if err := patch("/src", Proppatch{Props: []Property{p0}, Remove: true}); err != nil { + t.Fatalf("patch /src -p0: %v", err) + } + if err := patch("/src", Proppatch{Props: []Property{p2}}); err != nil { + t.Fatalf("patch /src +p2: %v", err) + } + if err := patch("/dst", Proppatch{Props: []Property{p1}, Remove: true}); err != nil { + t.Fatalf("patch /dst -p1: %v", err) + } + if err := patch("/dst", Proppatch{Props: []Property{p3}}); err != nil { + t.Fatalf("patch /dst +p3: %v", err) + } + + gotSrc, err := props("/src") + if err != nil { + t.Fatalf("props /src: %v", err) + } + wantSrc := map[xml.Name]Property{ + p1.XMLName: p1, + p2.XMLName: p2, + } + if !reflect.DeepEqual(gotSrc, wantSrc) { + t.Fatalf("props /src:\ngot %v\nwant %v", gotSrc, wantSrc) + } + + gotDst, err := props("/dst") + if err != nil { + t.Fatalf("props /dst: %v", err) + } + wantDst := map[xml.Name]Property{ + p0.XMLName: p0, + p3.XMLName: p3, + } + if !reflect.DeepEqual(gotDst, wantDst) { + t.Fatalf("props /dst:\ngot %v\nwant %v", gotDst, wantDst) + } +} + +func TestWalkFS(t *testing.T) { + testCases := []struct { + desc string + buildfs []string + startAt string + depth int + walkFn filepath.WalkFunc + want []string + }{{ + "just root", + []string{}, + "/", + infiniteDepth, + nil, + []string{ + "/", + }, + }, { + "infinite walk from root", + []string{ + "mkdir /a", + "mkdir /a/b", + "touch /a/b/c", + "mkdir /a/d", + "mkdir /e", + "touch /f", + }, + "/", + infiniteDepth, + nil, + []string{ + "/", + "/a", + "/a/b", + "/a/b/c", + "/a/d", + "/e", + "/f", + }, + }, { + "infinite walk from subdir", + []string{ + "mkdir /a", + "mkdir /a/b", + "touch /a/b/c", + "mkdir /a/d", + "mkdir /e", + "touch /f", + }, + "/a", + infiniteDepth, + nil, + []string{ + "/a", + "/a/b", + "/a/b/c", + "/a/d", + }, + }, { + "depth 1 walk from root", + []string{ + "mkdir /a", + "mkdir /a/b", + "touch /a/b/c", + "mkdir /a/d", + "mkdir /e", + "touch /f", + }, + "/", + 1, + nil, + []string{ + "/", + "/a", + "/e", + "/f", + }, + }, { + "depth 1 walk from subdir", + []string{ + "mkdir /a", + "mkdir /a/b", + "touch /a/b/c", + "mkdir /a/b/g", + "mkdir /a/b/g/h", + "touch /a/b/g/i", + "touch /a/b/g/h/j", + }, + "/a/b", + 1, + nil, + []string{ + "/a/b", + "/a/b/c", + "/a/b/g", + }, + }, { + "depth 0 walk from subdir", + []string{ + "mkdir /a", + "mkdir /a/b", + "touch /a/b/c", + "mkdir /a/b/g", + "mkdir /a/b/g/h", + "touch /a/b/g/i", + "touch /a/b/g/h/j", + }, + "/a/b", + 0, + nil, + []string{ + "/a/b", + }, + }, { + "infinite walk from file", + []string{ + "mkdir /a", + "touch /a/b", + "touch /a/c", + }, + "/a/b", + 0, + nil, + []string{ + "/a/b", + }, + }, { + "infinite walk with skipped subdir", + []string{ + "mkdir /a", + "mkdir /a/b", + "touch /a/b/c", + "mkdir /a/b/g", + "mkdir /a/b/g/h", + "touch /a/b/g/i", + "touch /a/b/g/h/j", + "touch /a/b/z", + }, + "/", + infiniteDepth, + func(path string, info os.FileInfo, err error) error { + if path == "/a/b/g" { + return filepath.SkipDir + } + return nil + }, + []string{ + "/", + "/a", + "/a/b", + "/a/b/c", + "/a/b/z", + }, + }} + ctx := context.Background() + for _, tc := range testCases { + fs, err := buildTestFS(tc.buildfs) + if err != nil { + t.Fatalf("%s: cannot create test filesystem: %v", tc.desc, err) + } + var got []string + traceFn := func(path string, info os.FileInfo, err error) error { + if tc.walkFn != nil { + err = tc.walkFn(path, info, err) + if err != nil { + return err + } + } + got = append(got, path) + return nil + } + fi, err := fs.Stat(ctx, tc.startAt) + if err != nil { + t.Fatalf("%s: cannot stat: %v", tc.desc, err) + } + err = walkFS(ctx, fs, tc.depth, tc.startAt, fi, traceFn) + if err != nil { + t.Errorf("%s:\ngot error %v, want nil", tc.desc, err) + continue + } + sort.Strings(got) + sort.Strings(tc.want) + if !reflect.DeepEqual(got, tc.want) { + t.Errorf("%s:\ngot %q\nwant %q", tc.desc, got, tc.want) + continue + } + } +} + +func buildTestFS(buildfs []string) (FileSystem, error) { + // TODO: Could this be merged with the build logic in TestFS? + + ctx := context.Background() + fs := NewMemFS() + for _, b := range buildfs { + op := strings.Split(b, " ") + switch op[0] { + case "mkdir": + err := fs.Mkdir(ctx, op[1], os.ModeDir|0777) + if err != nil { + return nil, err + } + case "touch": + f, err := fs.OpenFile(ctx, op[1], os.O_RDWR|os.O_CREATE, 0666) + if err != nil { + return nil, err + } + f.Close() + case "write": + f, err := fs.OpenFile(ctx, op[1], os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) + if err != nil { + return nil, err + } + _, err = f.Write([]byte(op[2])) + f.Close() + if err != nil { + return nil, err + } + default: + return nil, fmt.Errorf("unknown file operation %q", op[0]) + } + } + return fs, nil +} diff --git a/api/vendor/golang.org/x/net/webdav/if.go b/api/vendor/golang.org/x/net/webdav/if.go new file mode 100644 index 0000000..416e81c --- /dev/null +++ b/api/vendor/golang.org/x/net/webdav/if.go @@ -0,0 +1,173 @@ +// 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 webdav + +// The If header is covered by Section 10.4. +// http://www.webdav.org/specs/rfc4918.html#HEADER_If + +import ( + "strings" +) + +// ifHeader is a disjunction (OR) of ifLists. +type ifHeader struct { + lists []ifList +} + +// ifList is a conjunction (AND) of Conditions, and an optional resource tag. +type ifList struct { + resourceTag string + conditions []Condition +} + +// parseIfHeader parses the "If: foo bar" HTTP header. The httpHeader string +// should omit the "If:" prefix and have any "\r\n"s collapsed to a " ", as is +// returned by req.Header.Get("If") for a http.Request req. +func parseIfHeader(httpHeader string) (h ifHeader, ok bool) { + s := strings.TrimSpace(httpHeader) + switch tokenType, _, _ := lex(s); tokenType { + case '(': + return parseNoTagLists(s) + case angleTokenType: + return parseTaggedLists(s) + default: + return ifHeader{}, false + } +} + +func parseNoTagLists(s string) (h ifHeader, ok bool) { + for { + l, remaining, ok := parseList(s) + if !ok { + return ifHeader{}, false + } + h.lists = append(h.lists, l) + if remaining == "" { + return h, true + } + s = remaining + } +} + +func parseTaggedLists(s string) (h ifHeader, ok bool) { + resourceTag, n := "", 0 + for first := true; ; first = false { + tokenType, tokenStr, remaining := lex(s) + switch tokenType { + case angleTokenType: + if !first && n == 0 { + return ifHeader{}, false + } + resourceTag, n = tokenStr, 0 + s = remaining + case '(': + n++ + l, remaining, ok := parseList(s) + if !ok { + return ifHeader{}, false + } + l.resourceTag = resourceTag + h.lists = append(h.lists, l) + if remaining == "" { + return h, true + } + s = remaining + default: + return ifHeader{}, false + } + } +} + +func parseList(s string) (l ifList, remaining string, ok bool) { + tokenType, _, s := lex(s) + if tokenType != '(' { + return ifList{}, "", false + } + for { + tokenType, _, remaining = lex(s) + if tokenType == ')' { + if len(l.conditions) == 0 { + return ifList{}, "", false + } + return l, remaining, true + } + c, remaining, ok := parseCondition(s) + if !ok { + return ifList{}, "", false + } + l.conditions = append(l.conditions, c) + s = remaining + } +} + +func parseCondition(s string) (c Condition, remaining string, ok bool) { + tokenType, tokenStr, s := lex(s) + if tokenType == notTokenType { + c.Not = true + tokenType, tokenStr, s = lex(s) + } + switch tokenType { + case strTokenType, angleTokenType: + c.Token = tokenStr + case squareTokenType: + c.ETag = tokenStr + default: + return Condition{}, "", false + } + return c, s, true +} + +// Single-rune tokens like '(' or ')' have a token type equal to their rune. +// All other tokens have a negative token type. +const ( + errTokenType = rune(-1) + eofTokenType = rune(-2) + strTokenType = rune(-3) + notTokenType = rune(-4) + angleTokenType = rune(-5) + squareTokenType = rune(-6) +) + +func lex(s string) (tokenType rune, tokenStr string, remaining string) { + // The net/textproto Reader that parses the HTTP header will collapse + // Linear White Space that spans multiple "\r\n" lines to a single " ", + // so we don't need to look for '\r' or '\n'. + for len(s) > 0 && (s[0] == '\t' || s[0] == ' ') { + s = s[1:] + } + if len(s) == 0 { + return eofTokenType, "", "" + } + i := 0 +loop: + for ; i < len(s); i++ { + switch s[i] { + case '\t', ' ', '(', ')', '<', '>', '[', ']': + break loop + } + } + + if i != 0 { + tokenStr, remaining = s[:i], s[i:] + if tokenStr == "Not" { + return notTokenType, "", remaining + } + return strTokenType, tokenStr, remaining + } + + j := 0 + switch s[0] { + case '<': + j, tokenType = strings.IndexByte(s, '>'), angleTokenType + case '[': + j, tokenType = strings.IndexByte(s, ']'), squareTokenType + default: + return rune(s[0]), "", s[1:] + } + if j < 0 { + return errTokenType, "", "" + } + return tokenType, s[1:j], s[j+1:] +} diff --git a/api/vendor/golang.org/x/net/webdav/if_test.go b/api/vendor/golang.org/x/net/webdav/if_test.go new file mode 100644 index 0000000..aad61a4 --- /dev/null +++ b/api/vendor/golang.org/x/net/webdav/if_test.go @@ -0,0 +1,322 @@ +// 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 webdav + +import ( + "reflect" + "strings" + "testing" +) + +func TestParseIfHeader(t *testing.T) { + // The "section x.y.z" test cases come from section x.y.z of the spec at + // http://www.webdav.org/specs/rfc4918.html + testCases := []struct { + desc string + input string + want ifHeader + }{{ + "bad: empty", + ``, + ifHeader{}, + }, { + "bad: no parens", + `foobar`, + ifHeader{}, + }, { + "bad: empty list #1", + `()`, + ifHeader{}, + }, { + "bad: empty list #2", + `(a) (b c) () (d)`, + ifHeader{}, + }, { + "bad: no list after resource #1", + ``, + ifHeader{}, + }, { + "bad: no list after resource #2", + ` (a)`, + ifHeader{}, + }, { + "bad: no list after resource #3", + ` (a) (b) `, + ifHeader{}, + }, { + "bad: no-tag-list followed by tagged-list", + `(a) (b) (c)`, + ifHeader{}, + }, { + "bad: unfinished list", + `(a`, + ifHeader{}, + }, { + "bad: unfinished ETag", + `([b`, + ifHeader{}, + }, { + "bad: unfinished Notted list", + `(Not a`, + ifHeader{}, + }, { + "bad: double Not", + `(Not Not a)`, + ifHeader{}, + }, { + "good: one list with a Token", + `(a)`, + ifHeader{ + lists: []ifList{{ + conditions: []Condition{{ + Token: `a`, + }}, + }}, + }, + }, { + "good: one list with an ETag", + `([a])`, + ifHeader{ + lists: []ifList{{ + conditions: []Condition{{ + ETag: `a`, + }}, + }}, + }, + }, { + "good: one list with three Nots", + `(Not a Not b Not [d])`, + ifHeader{ + lists: []ifList{{ + conditions: []Condition{{ + Not: true, + Token: `a`, + }, { + Not: true, + Token: `b`, + }, { + Not: true, + ETag: `d`, + }}, + }}, + }, + }, { + "good: two lists", + `(a) (b)`, + ifHeader{ + lists: []ifList{{ + conditions: []Condition{{ + Token: `a`, + }}, + }, { + conditions: []Condition{{ + Token: `b`, + }}, + }}, + }, + }, { + "good: two Notted lists", + `(Not a) (Not b)`, + ifHeader{ + lists: []ifList{{ + conditions: []Condition{{ + Not: true, + Token: `a`, + }}, + }, { + conditions: []Condition{{ + Not: true, + Token: `b`, + }}, + }}, + }, + }, { + "section 7.5.1", + ` + ()`, + ifHeader{ + lists: []ifList{{ + resourceTag: `http://www.example.com/users/f/fielding/index.html`, + conditions: []Condition{{ + Token: `urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6`, + }}, + }}, + }, + }, { + "section 7.5.2 #1", + `()`, + ifHeader{ + lists: []ifList{{ + conditions: []Condition{{ + Token: `urn:uuid:150852e2-3847-42d5-8cbe-0f4f296f26cf`, + }}, + }}, + }, + }, { + "section 7.5.2 #2", + ` + ()`, + ifHeader{ + lists: []ifList{{ + resourceTag: `http://example.com/locked/`, + conditions: []Condition{{ + Token: `urn:uuid:150852e2-3847-42d5-8cbe-0f4f296f26cf`, + }}, + }}, + }, + }, { + "section 7.5.2 #3", + ` + ()`, + ifHeader{ + lists: []ifList{{ + resourceTag: `http://example.com/locked/member`, + conditions: []Condition{{ + Token: `urn:uuid:150852e2-3847-42d5-8cbe-0f4f296f26cf`, + }}, + }}, + }, + }, { + "section 9.9.6", + `() + ()`, + ifHeader{ + lists: []ifList{{ + conditions: []Condition{{ + Token: `urn:uuid:fe184f2e-6eec-41d0-c765-01adc56e6bb4`, + }}, + }, { + conditions: []Condition{{ + Token: `urn:uuid:e454f3f3-acdc-452a-56c7-00a5c91e4b77`, + }}, + }}, + }, + }, { + "section 9.10.8", + `()`, + ifHeader{ + lists: []ifList{{ + conditions: []Condition{{ + Token: `urn:uuid:e71d4fae-5dec-22d6-fea5-00a0c91e6be4`, + }}, + }}, + }, + }, { + "section 10.4.6", + `( + ["I am an ETag"]) + (["I am another ETag"])`, + ifHeader{ + lists: []ifList{{ + conditions: []Condition{{ + Token: `urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2`, + }, { + ETag: `"I am an ETag"`, + }}, + }, { + conditions: []Condition{{ + ETag: `"I am another ETag"`, + }}, + }}, + }, + }, { + "section 10.4.7", + `(Not + )`, + ifHeader{ + lists: []ifList{{ + conditions: []Condition{{ + Not: true, + Token: `urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2`, + }, { + Token: `urn:uuid:58f202ac-22cf-11d1-b12d-002035b29092`, + }}, + }}, + }, + }, { + "section 10.4.8", + `() + (Not )`, + ifHeader{ + lists: []ifList{{ + conditions: []Condition{{ + Token: `urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2`, + }}, + }, { + conditions: []Condition{{ + Not: true, + Token: `DAV:no-lock`, + }}, + }}, + }, + }, { + "section 10.4.9", + ` + ( + [W/"A weak ETag"]) (["strong ETag"])`, + ifHeader{ + lists: []ifList{{ + resourceTag: `/resource1`, + conditions: []Condition{{ + Token: `urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2`, + }, { + ETag: `W/"A weak ETag"`, + }}, + }, { + resourceTag: `/resource1`, + conditions: []Condition{{ + ETag: `"strong ETag"`, + }}, + }}, + }, + }, { + "section 10.4.10", + ` + ()`, + ifHeader{ + lists: []ifList{{ + resourceTag: `http://www.example.com/specs/`, + conditions: []Condition{{ + Token: `urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2`, + }}, + }}, + }, + }, { + "section 10.4.11 #1", + ` (["4217"])`, + ifHeader{ + lists: []ifList{{ + resourceTag: `/specs/rfc2518.doc`, + conditions: []Condition{{ + ETag: `"4217"`, + }}, + }}, + }, + }, { + "section 10.4.11 #2", + ` (Not ["4217"])`, + ifHeader{ + lists: []ifList{{ + resourceTag: `/specs/rfc2518.doc`, + conditions: []Condition{{ + Not: true, + ETag: `"4217"`, + }}, + }}, + }, + }} + + for _, tc := range testCases { + got, ok := parseIfHeader(strings.Replace(tc.input, "\n", "", -1)) + if gotEmpty := reflect.DeepEqual(got, ifHeader{}); gotEmpty == ok { + t.Errorf("%s: should be different: empty header == %t, ok == %t", tc.desc, gotEmpty, ok) + continue + } + if !reflect.DeepEqual(got, tc.want) { + t.Errorf("%s:\ngot %v\nwant %v", tc.desc, got, tc.want) + continue + } + } +} diff --git a/api/vendor/golang.org/x/net/webdav/internal/xml/README b/api/vendor/golang.org/x/net/webdav/internal/xml/README new file mode 100644 index 0000000..89656f4 --- /dev/null +++ b/api/vendor/golang.org/x/net/webdav/internal/xml/README @@ -0,0 +1,11 @@ +This is a fork of the encoding/xml package at ca1d6c4, the last commit before +https://go.googlesource.com/go/+/c0d6d33 "encoding/xml: restore Go 1.4 name +space behavior" made late in the lead-up to the Go 1.5 release. + +The list of encoding/xml changes is at +https://go.googlesource.com/go/+log/master/src/encoding/xml + +This fork is temporary, and I (nigeltao) expect to revert it after Go 1.6 is +released. + +See http://golang.org/issue/11841 diff --git a/api/vendor/golang.org/x/net/webdav/internal/xml/atom_test.go b/api/vendor/golang.org/x/net/webdav/internal/xml/atom_test.go new file mode 100644 index 0000000..a712843 --- /dev/null +++ b/api/vendor/golang.org/x/net/webdav/internal/xml/atom_test.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 xml + +import "time" + +var atomValue = &Feed{ + XMLName: Name{"http://www.w3.org/2005/Atom", "feed"}, + Title: "Example Feed", + Link: []Link{{Href: "http://example.org/"}}, + Updated: ParseTime("2003-12-13T18:30:02Z"), + Author: Person{Name: "John Doe"}, + Id: "urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6", + + Entry: []Entry{ + { + Title: "Atom-Powered Robots Run Amok", + Link: []Link{{Href: "http://example.org/2003/12/13/atom03"}}, + Id: "urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a", + Updated: ParseTime("2003-12-13T18:30:02Z"), + Summary: NewText("Some text."), + }, + }, +} + +var atomXml = `` + + `` + + `Example Feed` + + `urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6` + + `` + + `John Doe` + + `` + + `Atom-Powered Robots Run Amok` + + `urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a` + + `` + + `2003-12-13T18:30:02Z` + + `` + + `Some text.` + + `` + + `` + +func ParseTime(str string) time.Time { + t, err := time.Parse(time.RFC3339, str) + if err != nil { + panic(err) + } + return t +} + +func NewText(text string) Text { + return Text{ + Body: text, + } +} diff --git a/api/vendor/golang.org/x/net/webdav/internal/xml/example_test.go b/api/vendor/golang.org/x/net/webdav/internal/xml/example_test.go new file mode 100644 index 0000000..21b48de --- /dev/null +++ b/api/vendor/golang.org/x/net/webdav/internal/xml/example_test.go @@ -0,0 +1,151 @@ +// 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 xml_test + +import ( + "encoding/xml" + "fmt" + "os" +) + +func ExampleMarshalIndent() { + type Address struct { + City, State string + } + type Person struct { + XMLName xml.Name `xml:"person"` + Id int `xml:"id,attr"` + FirstName string `xml:"name>first"` + LastName string `xml:"name>last"` + Age int `xml:"age"` + Height float32 `xml:"height,omitempty"` + Married bool + Address + Comment string `xml:",comment"` + } + + v := &Person{Id: 13, FirstName: "John", LastName: "Doe", Age: 42} + v.Comment = " Need more details. " + v.Address = Address{"Hanga Roa", "Easter Island"} + + output, err := xml.MarshalIndent(v, " ", " ") + if err != nil { + fmt.Printf("error: %v\n", err) + } + + os.Stdout.Write(output) + // Output: + // + // + // John + // Doe + // + // 42 + // false + // Hanga Roa + // Easter Island + // + // +} + +func ExampleEncoder() { + type Address struct { + City, State string + } + type Person struct { + XMLName xml.Name `xml:"person"` + Id int `xml:"id,attr"` + FirstName string `xml:"name>first"` + LastName string `xml:"name>last"` + Age int `xml:"age"` + Height float32 `xml:"height,omitempty"` + Married bool + Address + Comment string `xml:",comment"` + } + + v := &Person{Id: 13, FirstName: "John", LastName: "Doe", Age: 42} + v.Comment = " Need more details. " + v.Address = Address{"Hanga Roa", "Easter Island"} + + enc := xml.NewEncoder(os.Stdout) + enc.Indent(" ", " ") + if err := enc.Encode(v); err != nil { + fmt.Printf("error: %v\n", err) + } + + // Output: + // + // + // John + // Doe + // + // 42 + // false + // Hanga Roa + // Easter Island + // + // +} + +// This example demonstrates unmarshaling an XML excerpt into a value with +// some preset fields. Note that the Phone field isn't modified and that +// the XML element is ignored. Also, the Groups field is assigned +// considering the element path provided in its tag. +func ExampleUnmarshal() { + type Email struct { + Where string `xml:"where,attr"` + Addr string + } + type Address struct { + City, State string + } + type Result struct { + XMLName xml.Name `xml:"Person"` + Name string `xml:"FullName"` + Phone string + Email []Email + Groups []string `xml:"Group>Value"` + Address + } + v := Result{Name: "none", Phone: "none"} + + data := ` + + Grace R. Emlin + Example Inc. + + gre@example.com + + + gre@work.com + + + Friends + Squash + + Hanga Roa + Easter Island + + ` + err := xml.Unmarshal([]byte(data), &v) + if err != nil { + fmt.Printf("error: %v", err) + return + } + fmt.Printf("XMLName: %#v\n", v.XMLName) + fmt.Printf("Name: %q\n", v.Name) + fmt.Printf("Phone: %q\n", v.Phone) + fmt.Printf("Email: %v\n", v.Email) + fmt.Printf("Groups: %v\n", v.Groups) + fmt.Printf("Address: %v\n", v.Address) + // Output: + // XMLName: xml.Name{Space:"", Local:"Person"} + // Name: "Grace R. Emlin" + // Phone: "none" + // Email: [{home gre@example.com} {work gre@work.com}] + // Groups: [Friends Squash] + // Address: {Hanga Roa Easter Island} +} diff --git a/api/vendor/golang.org/x/net/webdav/internal/xml/marshal.go b/api/vendor/golang.org/x/net/webdav/internal/xml/marshal.go new file mode 100644 index 0000000..cb82ec2 --- /dev/null +++ b/api/vendor/golang.org/x/net/webdav/internal/xml/marshal.go @@ -0,0 +1,1223 @@ +// 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 xml + +import ( + "bufio" + "bytes" + "encoding" + "fmt" + "io" + "reflect" + "strconv" + "strings" +) + +const ( + // A generic XML header suitable for use with the output of Marshal. + // This is not automatically added to any output of this package, + // it is provided as a convenience. + Header = `` + "\n" +) + +// Marshal returns the XML encoding of v. +// +// Marshal handles an array or slice by marshalling each of the elements. +// Marshal handles a pointer by marshalling the value it points at or, if the +// pointer is nil, by writing nothing. Marshal handles an interface value by +// marshalling the value it contains or, if the interface value is nil, by +// writing nothing. Marshal handles all other data by writing one or more XML +// elements containing the data. +// +// The name for the XML elements is taken from, in order of preference: +// - the tag on the XMLName field, if the data is a struct +// - the value of the XMLName field of type xml.Name +// - the tag of the struct field used to obtain the data +// - the name of the struct field used to obtain the data +// - the name of the marshalled type +// +// The XML element for a struct contains marshalled elements for each of the +// exported fields of the struct, with these exceptions: +// - the XMLName field, described above, is omitted. +// - a field with tag "-" is omitted. +// - a field with tag "name,attr" becomes an attribute with +// the given name in the XML element. +// - a field with tag ",attr" becomes an attribute with the +// field name in the XML element. +// - a field with tag ",chardata" is written as character data, +// not as an XML element. +// - a field with tag ",innerxml" is written verbatim, not subject +// to the usual marshalling procedure. +// - a field with tag ",comment" is written as an XML comment, not +// subject to the usual marshalling procedure. It must not contain +// the "--" string within it. +// - a field with a tag including the "omitempty" option is omitted +// if the field value is empty. The empty values are false, 0, any +// nil pointer or interface value, and any array, slice, map, or +// string of length zero. +// - an anonymous struct field is handled as if the fields of its +// value were part of the outer struct. +// +// If a field uses a tag "a>b>c", then the element c will be nested inside +// parent elements a and b. Fields that appear next to each other that name +// the same parent will be enclosed in one XML element. +// +// See MarshalIndent for an example. +// +// Marshal will return an error if asked to marshal a channel, function, or map. +func Marshal(v interface{}) ([]byte, error) { + var b bytes.Buffer + if err := NewEncoder(&b).Encode(v); err != nil { + return nil, err + } + return b.Bytes(), nil +} + +// Marshaler is the interface implemented by objects that can marshal +// themselves into valid XML elements. +// +// MarshalXML encodes the receiver as zero or more XML elements. +// By convention, arrays or slices are typically encoded as a sequence +// of elements, one per entry. +// Using start as the element tag is not required, but doing so +// will enable Unmarshal to match the XML elements to the correct +// struct field. +// One common implementation strategy is to construct a separate +// value with a layout corresponding to the desired XML and then +// to encode it using e.EncodeElement. +// Another common strategy is to use repeated calls to e.EncodeToken +// to generate the XML output one token at a time. +// The sequence of encoded tokens must make up zero or more valid +// XML elements. +type Marshaler interface { + MarshalXML(e *Encoder, start StartElement) error +} + +// MarshalerAttr is the interface implemented by objects that can marshal +// themselves into valid XML attributes. +// +// MarshalXMLAttr returns an XML attribute with the encoded value of the receiver. +// Using name as the attribute name is not required, but doing so +// will enable Unmarshal to match the attribute to the correct +// struct field. +// If MarshalXMLAttr returns the zero attribute Attr{}, no attribute +// will be generated in the output. +// MarshalXMLAttr is used only for struct fields with the +// "attr" option in the field tag. +type MarshalerAttr interface { + MarshalXMLAttr(name Name) (Attr, error) +} + +// MarshalIndent works like Marshal, but each XML element begins on a new +// indented line that starts with prefix and is followed by one or more +// copies of indent according to the nesting depth. +func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) { + var b bytes.Buffer + enc := NewEncoder(&b) + enc.Indent(prefix, indent) + if err := enc.Encode(v); err != nil { + return nil, err + } + return b.Bytes(), nil +} + +// An Encoder writes XML data to an output stream. +type Encoder struct { + p printer +} + +// NewEncoder returns a new encoder that writes to w. +func NewEncoder(w io.Writer) *Encoder { + e := &Encoder{printer{Writer: bufio.NewWriter(w)}} + e.p.encoder = e + return e +} + +// Indent sets the encoder to generate XML in which each element +// begins on a new indented line that starts with prefix and is followed by +// one or more copies of indent according to the nesting depth. +func (enc *Encoder) Indent(prefix, indent string) { + enc.p.prefix = prefix + enc.p.indent = indent +} + +// Encode writes the XML encoding of v to the stream. +// +// See the documentation for Marshal for details about the conversion +// of Go values to XML. +// +// Encode calls Flush before returning. +func (enc *Encoder) Encode(v interface{}) error { + err := enc.p.marshalValue(reflect.ValueOf(v), nil, nil) + if err != nil { + return err + } + return enc.p.Flush() +} + +// EncodeElement writes the XML encoding of v to the stream, +// using start as the outermost tag in the encoding. +// +// See the documentation for Marshal for details about the conversion +// of Go values to XML. +// +// EncodeElement calls Flush before returning. +func (enc *Encoder) EncodeElement(v interface{}, start StartElement) error { + err := enc.p.marshalValue(reflect.ValueOf(v), nil, &start) + if err != nil { + return err + } + return enc.p.Flush() +} + +var ( + begComment = []byte("") + endProcInst = []byte("?>") + endDirective = []byte(">") +) + +// EncodeToken writes the given XML token to the stream. +// It returns an error if StartElement and EndElement tokens are not +// properly matched. +// +// EncodeToken does not call Flush, because usually it is part of a +// larger operation such as Encode or EncodeElement (or a custom +// Marshaler's MarshalXML invoked during those), and those will call +// Flush when finished. Callers that create an Encoder and then invoke +// EncodeToken directly, without using Encode or EncodeElement, need to +// call Flush when finished to ensure that the XML is written to the +// underlying writer. +// +// EncodeToken allows writing a ProcInst with Target set to "xml" only +// as the first token in the stream. +// +// When encoding a StartElement holding an XML namespace prefix +// declaration for a prefix that is not already declared, contained +// elements (including the StartElement itself) will use the declared +// prefix when encoding names with matching namespace URIs. +func (enc *Encoder) EncodeToken(t Token) error { + + p := &enc.p + switch t := t.(type) { + case StartElement: + if err := p.writeStart(&t); err != nil { + return err + } + case EndElement: + if err := p.writeEnd(t.Name); err != nil { + return err + } + case CharData: + escapeText(p, t, false) + case Comment: + if bytes.Contains(t, endComment) { + return fmt.Errorf("xml: EncodeToken of Comment containing --> marker") + } + p.WriteString("") + return p.cachedWriteError() + case ProcInst: + // First token to be encoded which is also a ProcInst with target of xml + // is the xml declaration. The only ProcInst where target of xml is allowed. + if t.Target == "xml" && p.Buffered() != 0 { + return fmt.Errorf("xml: EncodeToken of ProcInst xml target only valid for xml declaration, first token encoded") + } + if !isNameString(t.Target) { + return fmt.Errorf("xml: EncodeToken of ProcInst with invalid Target") + } + if bytes.Contains(t.Inst, endProcInst) { + return fmt.Errorf("xml: EncodeToken of ProcInst containing ?> marker") + } + p.WriteString(" 0 { + p.WriteByte(' ') + p.Write(t.Inst) + } + p.WriteString("?>") + case Directive: + if !isValidDirective(t) { + return fmt.Errorf("xml: EncodeToken of Directive containing wrong < or > markers") + } + p.WriteString("") + default: + return fmt.Errorf("xml: EncodeToken of invalid token type") + + } + return p.cachedWriteError() +} + +// isValidDirective reports whether dir is a valid directive text, +// meaning angle brackets are matched, ignoring comments and strings. +func isValidDirective(dir Directive) bool { + var ( + depth int + inquote uint8 + incomment bool + ) + for i, c := range dir { + switch { + case incomment: + if c == '>' { + if n := 1 + i - len(endComment); n >= 0 && bytes.Equal(dir[n:i+1], endComment) { + incomment = false + } + } + // Just ignore anything in comment + case inquote != 0: + if c == inquote { + inquote = 0 + } + // Just ignore anything within quotes + case c == '\'' || c == '"': + inquote = c + case c == '<': + if i+len(begComment) < len(dir) && bytes.Equal(dir[i:i+len(begComment)], begComment) { + incomment = true + } else { + depth++ + } + case c == '>': + if depth == 0 { + return false + } + depth-- + } + } + return depth == 0 && inquote == 0 && !incomment +} + +// Flush flushes any buffered XML to the underlying writer. +// See the EncodeToken documentation for details about when it is necessary. +func (enc *Encoder) Flush() error { + return enc.p.Flush() +} + +type printer struct { + *bufio.Writer + encoder *Encoder + seq int + indent string + prefix string + depth int + indentedIn bool + putNewline bool + defaultNS string + attrNS map[string]string // map prefix -> name space + attrPrefix map[string]string // map name space -> prefix + prefixes []printerPrefix + tags []Name +} + +// printerPrefix holds a namespace undo record. +// When an element is popped, the prefix record +// is set back to the recorded URL. The empty +// prefix records the URL for the default name space. +// +// The start of an element is recorded with an element +// that has mark=true. +type printerPrefix struct { + prefix string + url string + mark bool +} + +func (p *printer) prefixForNS(url string, isAttr bool) string { + // The "http://www.w3.org/XML/1998/namespace" name space is predefined as "xml" + // and must be referred to that way. + // (The "http://www.w3.org/2000/xmlns/" name space is also predefined as "xmlns", + // but users should not be trying to use that one directly - that's our job.) + if url == xmlURL { + return "xml" + } + if !isAttr && url == p.defaultNS { + // We can use the default name space. + return "" + } + return p.attrPrefix[url] +} + +// defineNS pushes any namespace definition found in the given attribute. +// If ignoreNonEmptyDefault is true, an xmlns="nonempty" +// attribute will be ignored. +func (p *printer) defineNS(attr Attr, ignoreNonEmptyDefault bool) error { + var prefix string + if attr.Name.Local == "xmlns" { + if attr.Name.Space != "" && attr.Name.Space != "xml" && attr.Name.Space != xmlURL { + return fmt.Errorf("xml: cannot redefine xmlns attribute prefix") + } + } else if attr.Name.Space == "xmlns" && attr.Name.Local != "" { + prefix = attr.Name.Local + if attr.Value == "" { + // Technically, an empty XML namespace is allowed for an attribute. + // From http://www.w3.org/TR/xml-names11/#scoping-defaulting: + // + // The attribute value in a namespace declaration for a prefix may be + // empty. This has the effect, within the scope of the declaration, of removing + // any association of the prefix with a namespace name. + // + // However our namespace prefixes here are used only as hints. There's + // no need to respect the removal of a namespace prefix, so we ignore it. + return nil + } + } else { + // Ignore: it's not a namespace definition + return nil + } + if prefix == "" { + if attr.Value == p.defaultNS { + // No need for redefinition. + return nil + } + if attr.Value != "" && ignoreNonEmptyDefault { + // We have an xmlns="..." value but + // it can't define a name space in this context, + // probably because the element has an empty + // name space. In this case, we just ignore + // the name space declaration. + return nil + } + } else if _, ok := p.attrPrefix[attr.Value]; ok { + // There's already a prefix for the given name space, + // so use that. This prevents us from + // having two prefixes for the same name space + // so attrNS and attrPrefix can remain bijective. + return nil + } + p.pushPrefix(prefix, attr.Value) + return nil +} + +// createNSPrefix creates a name space prefix attribute +// to use for the given name space, defining a new prefix +// if necessary. +// If isAttr is true, the prefix is to be created for an attribute +// prefix, which means that the default name space cannot +// be used. +func (p *printer) createNSPrefix(url string, isAttr bool) { + if _, ok := p.attrPrefix[url]; ok { + // We already have a prefix for the given URL. + return + } + switch { + case !isAttr && url == p.defaultNS: + // We can use the default name space. + return + case url == "": + // The only way we can encode names in the empty + // name space is by using the default name space, + // so we must use that. + if p.defaultNS != "" { + // The default namespace is non-empty, so we + // need to set it to empty. + p.pushPrefix("", "") + } + return + case url == xmlURL: + return + } + // TODO If the URL is an existing prefix, we could + // use it as is. That would enable the + // marshaling of elements that had been unmarshaled + // and with a name space prefix that was not found. + // although technically it would be incorrect. + + // Pick a name. We try to use the final element of the path + // but fall back to _. + prefix := strings.TrimRight(url, "/") + if i := strings.LastIndex(prefix, "/"); i >= 0 { + prefix = prefix[i+1:] + } + if prefix == "" || !isName([]byte(prefix)) || strings.Contains(prefix, ":") { + prefix = "_" + } + if strings.HasPrefix(prefix, "xml") { + // xmlanything is reserved. + prefix = "_" + prefix + } + if p.attrNS[prefix] != "" { + // Name is taken. Find a better one. + for p.seq++; ; p.seq++ { + if id := prefix + "_" + strconv.Itoa(p.seq); p.attrNS[id] == "" { + prefix = id + break + } + } + } + + p.pushPrefix(prefix, url) +} + +// writeNamespaces writes xmlns attributes for all the +// namespace prefixes that have been defined in +// the current element. +func (p *printer) writeNamespaces() { + for i := len(p.prefixes) - 1; i >= 0; i-- { + prefix := p.prefixes[i] + if prefix.mark { + return + } + p.WriteString(" ") + if prefix.prefix == "" { + // Default name space. + p.WriteString(`xmlns="`) + } else { + p.WriteString("xmlns:") + p.WriteString(prefix.prefix) + p.WriteString(`="`) + } + EscapeText(p, []byte(p.nsForPrefix(prefix.prefix))) + p.WriteString(`"`) + } +} + +// pushPrefix pushes a new prefix on the prefix stack +// without checking to see if it is already defined. +func (p *printer) pushPrefix(prefix, url string) { + p.prefixes = append(p.prefixes, printerPrefix{ + prefix: prefix, + url: p.nsForPrefix(prefix), + }) + p.setAttrPrefix(prefix, url) +} + +// nsForPrefix returns the name space for the given +// prefix. Note that this is not valid for the +// empty attribute prefix, which always has an empty +// name space. +func (p *printer) nsForPrefix(prefix string) string { + if prefix == "" { + return p.defaultNS + } + return p.attrNS[prefix] +} + +// markPrefix marks the start of an element on the prefix +// stack. +func (p *printer) markPrefix() { + p.prefixes = append(p.prefixes, printerPrefix{ + mark: true, + }) +} + +// popPrefix pops all defined prefixes for the current +// element. +func (p *printer) popPrefix() { + for len(p.prefixes) > 0 { + prefix := p.prefixes[len(p.prefixes)-1] + p.prefixes = p.prefixes[:len(p.prefixes)-1] + if prefix.mark { + break + } + p.setAttrPrefix(prefix.prefix, prefix.url) + } +} + +// setAttrPrefix sets an attribute name space prefix. +// If url is empty, the attribute is removed. +// If prefix is empty, the default name space is set. +func (p *printer) setAttrPrefix(prefix, url string) { + if prefix == "" { + p.defaultNS = url + return + } + if url == "" { + delete(p.attrPrefix, p.attrNS[prefix]) + delete(p.attrNS, prefix) + return + } + if p.attrPrefix == nil { + // Need to define a new name space. + p.attrPrefix = make(map[string]string) + p.attrNS = make(map[string]string) + } + // Remove any old prefix value. This is OK because we maintain a + // strict one-to-one mapping between prefix and URL (see + // defineNS) + delete(p.attrPrefix, p.attrNS[prefix]) + p.attrPrefix[url] = prefix + p.attrNS[prefix] = url +} + +var ( + marshalerType = reflect.TypeOf((*Marshaler)(nil)).Elem() + marshalerAttrType = reflect.TypeOf((*MarshalerAttr)(nil)).Elem() + textMarshalerType = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem() +) + +// marshalValue writes one or more XML elements representing val. +// If val was obtained from a struct field, finfo must have its details. +func (p *printer) marshalValue(val reflect.Value, finfo *fieldInfo, startTemplate *StartElement) error { + if startTemplate != nil && startTemplate.Name.Local == "" { + return fmt.Errorf("xml: EncodeElement of StartElement with missing name") + } + + if !val.IsValid() { + return nil + } + if finfo != nil && finfo.flags&fOmitEmpty != 0 && isEmptyValue(val) { + return nil + } + + // Drill into interfaces and pointers. + // This can turn into an infinite loop given a cyclic chain, + // but it matches the Go 1 behavior. + for val.Kind() == reflect.Interface || val.Kind() == reflect.Ptr { + if val.IsNil() { + return nil + } + val = val.Elem() + } + + kind := val.Kind() + typ := val.Type() + + // Check for marshaler. + if val.CanInterface() && typ.Implements(marshalerType) { + return p.marshalInterface(val.Interface().(Marshaler), p.defaultStart(typ, finfo, startTemplate)) + } + if val.CanAddr() { + pv := val.Addr() + if pv.CanInterface() && pv.Type().Implements(marshalerType) { + return p.marshalInterface(pv.Interface().(Marshaler), p.defaultStart(pv.Type(), finfo, startTemplate)) + } + } + + // Check for text marshaler. + if val.CanInterface() && typ.Implements(textMarshalerType) { + return p.marshalTextInterface(val.Interface().(encoding.TextMarshaler), p.defaultStart(typ, finfo, startTemplate)) + } + if val.CanAddr() { + pv := val.Addr() + if pv.CanInterface() && pv.Type().Implements(textMarshalerType) { + return p.marshalTextInterface(pv.Interface().(encoding.TextMarshaler), p.defaultStart(pv.Type(), finfo, startTemplate)) + } + } + + // Slices and arrays iterate over the elements. They do not have an enclosing tag. + if (kind == reflect.Slice || kind == reflect.Array) && typ.Elem().Kind() != reflect.Uint8 { + for i, n := 0, val.Len(); i < n; i++ { + if err := p.marshalValue(val.Index(i), finfo, startTemplate); err != nil { + return err + } + } + return nil + } + + tinfo, err := getTypeInfo(typ) + if err != nil { + return err + } + + // Create start element. + // Precedence for the XML element name is: + // 0. startTemplate + // 1. XMLName field in underlying struct; + // 2. field name/tag in the struct field; and + // 3. type name + var start StartElement + + // explicitNS records whether the element's name space has been + // explicitly set (for example an XMLName field). + explicitNS := false + + if startTemplate != nil { + start.Name = startTemplate.Name + explicitNS = true + start.Attr = append(start.Attr, startTemplate.Attr...) + } else if tinfo.xmlname != nil { + xmlname := tinfo.xmlname + if xmlname.name != "" { + start.Name.Space, start.Name.Local = xmlname.xmlns, xmlname.name + } else if v, ok := xmlname.value(val).Interface().(Name); ok && v.Local != "" { + start.Name = v + } + explicitNS = true + } + if start.Name.Local == "" && finfo != nil { + start.Name.Local = finfo.name + if finfo.xmlns != "" { + start.Name.Space = finfo.xmlns + explicitNS = true + } + } + if start.Name.Local == "" { + name := typ.Name() + if name == "" { + return &UnsupportedTypeError{typ} + } + start.Name.Local = name + } + + // defaultNS records the default name space as set by a xmlns="..." + // attribute. We don't set p.defaultNS because we want to let + // the attribute writing code (in p.defineNS) be solely responsible + // for maintaining that. + defaultNS := p.defaultNS + + // Attributes + for i := range tinfo.fields { + finfo := &tinfo.fields[i] + if finfo.flags&fAttr == 0 { + continue + } + attr, err := p.fieldAttr(finfo, val) + if err != nil { + return err + } + if attr.Name.Local == "" { + continue + } + start.Attr = append(start.Attr, attr) + if attr.Name.Space == "" && attr.Name.Local == "xmlns" { + defaultNS = attr.Value + } + } + if !explicitNS { + // Historic behavior: elements use the default name space + // they are contained in by default. + start.Name.Space = defaultNS + } + // Historic behaviour: an element that's in a namespace sets + // the default namespace for all elements contained within it. + start.setDefaultNamespace() + + if err := p.writeStart(&start); err != nil { + return err + } + + if val.Kind() == reflect.Struct { + err = p.marshalStruct(tinfo, val) + } else { + s, b, err1 := p.marshalSimple(typ, val) + if err1 != nil { + err = err1 + } else if b != nil { + EscapeText(p, b) + } else { + p.EscapeString(s) + } + } + if err != nil { + return err + } + + if err := p.writeEnd(start.Name); err != nil { + return err + } + + return p.cachedWriteError() +} + +// fieldAttr returns the attribute of the given field. +// If the returned attribute has an empty Name.Local, +// it should not be used. +// The given value holds the value containing the field. +func (p *printer) fieldAttr(finfo *fieldInfo, val reflect.Value) (Attr, error) { + fv := finfo.value(val) + name := Name{Space: finfo.xmlns, Local: finfo.name} + if finfo.flags&fOmitEmpty != 0 && isEmptyValue(fv) { + return Attr{}, nil + } + if fv.Kind() == reflect.Interface && fv.IsNil() { + return Attr{}, nil + } + if fv.CanInterface() && fv.Type().Implements(marshalerAttrType) { + attr, err := fv.Interface().(MarshalerAttr).MarshalXMLAttr(name) + return attr, err + } + if fv.CanAddr() { + pv := fv.Addr() + if pv.CanInterface() && pv.Type().Implements(marshalerAttrType) { + attr, err := pv.Interface().(MarshalerAttr).MarshalXMLAttr(name) + return attr, err + } + } + if fv.CanInterface() && fv.Type().Implements(textMarshalerType) { + text, err := fv.Interface().(encoding.TextMarshaler).MarshalText() + if err != nil { + return Attr{}, err + } + return Attr{name, string(text)}, nil + } + if fv.CanAddr() { + pv := fv.Addr() + if pv.CanInterface() && pv.Type().Implements(textMarshalerType) { + text, err := pv.Interface().(encoding.TextMarshaler).MarshalText() + if err != nil { + return Attr{}, err + } + return Attr{name, string(text)}, nil + } + } + // Dereference or skip nil pointer, interface values. + switch fv.Kind() { + case reflect.Ptr, reflect.Interface: + if fv.IsNil() { + return Attr{}, nil + } + fv = fv.Elem() + } + s, b, err := p.marshalSimple(fv.Type(), fv) + if err != nil { + return Attr{}, err + } + if b != nil { + s = string(b) + } + return Attr{name, s}, nil +} + +// defaultStart returns the default start element to use, +// given the reflect type, field info, and start template. +func (p *printer) defaultStart(typ reflect.Type, finfo *fieldInfo, startTemplate *StartElement) StartElement { + var start StartElement + // Precedence for the XML element name is as above, + // except that we do not look inside structs for the first field. + if startTemplate != nil { + start.Name = startTemplate.Name + start.Attr = append(start.Attr, startTemplate.Attr...) + } else if finfo != nil && finfo.name != "" { + start.Name.Local = finfo.name + start.Name.Space = finfo.xmlns + } else if typ.Name() != "" { + start.Name.Local = typ.Name() + } else { + // Must be a pointer to a named type, + // since it has the Marshaler methods. + start.Name.Local = typ.Elem().Name() + } + // Historic behaviour: elements use the name space of + // the element they are contained in by default. + if start.Name.Space == "" { + start.Name.Space = p.defaultNS + } + start.setDefaultNamespace() + return start +} + +// marshalInterface marshals a Marshaler interface value. +func (p *printer) marshalInterface(val Marshaler, start StartElement) error { + // Push a marker onto the tag stack so that MarshalXML + // cannot close the XML tags that it did not open. + p.tags = append(p.tags, Name{}) + n := len(p.tags) + + err := val.MarshalXML(p.encoder, start) + if err != nil { + return err + } + + // Make sure MarshalXML closed all its tags. p.tags[n-1] is the mark. + if len(p.tags) > n { + return fmt.Errorf("xml: %s.MarshalXML wrote invalid XML: <%s> not closed", receiverType(val), p.tags[len(p.tags)-1].Local) + } + p.tags = p.tags[:n-1] + return nil +} + +// marshalTextInterface marshals a TextMarshaler interface value. +func (p *printer) marshalTextInterface(val encoding.TextMarshaler, start StartElement) error { + if err := p.writeStart(&start); err != nil { + return err + } + text, err := val.MarshalText() + if err != nil { + return err + } + EscapeText(p, text) + return p.writeEnd(start.Name) +} + +// writeStart writes the given start element. +func (p *printer) writeStart(start *StartElement) error { + if start.Name.Local == "" { + return fmt.Errorf("xml: start tag with no name") + } + + p.tags = append(p.tags, start.Name) + p.markPrefix() + // Define any name spaces explicitly declared in the attributes. + // We do this as a separate pass so that explicitly declared prefixes + // will take precedence over implicitly declared prefixes + // regardless of the order of the attributes. + ignoreNonEmptyDefault := start.Name.Space == "" + for _, attr := range start.Attr { + if err := p.defineNS(attr, ignoreNonEmptyDefault); err != nil { + return err + } + } + // Define any new name spaces implied by the attributes. + for _, attr := range start.Attr { + name := attr.Name + // From http://www.w3.org/TR/xml-names11/#defaulting + // "Default namespace declarations do not apply directly + // to attribute names; the interpretation of unprefixed + // attributes is determined by the element on which they + // appear." + // This means we don't need to create a new namespace + // when an attribute name space is empty. + if name.Space != "" && !name.isNamespace() { + p.createNSPrefix(name.Space, true) + } + } + p.createNSPrefix(start.Name.Space, false) + + p.writeIndent(1) + p.WriteByte('<') + p.writeName(start.Name, false) + p.writeNamespaces() + for _, attr := range start.Attr { + name := attr.Name + if name.Local == "" || name.isNamespace() { + // Namespaces have already been written by writeNamespaces above. + continue + } + p.WriteByte(' ') + p.writeName(name, true) + p.WriteString(`="`) + p.EscapeString(attr.Value) + p.WriteByte('"') + } + p.WriteByte('>') + return nil +} + +// writeName writes the given name. It assumes +// that p.createNSPrefix(name) has already been called. +func (p *printer) writeName(name Name, isAttr bool) { + if prefix := p.prefixForNS(name.Space, isAttr); prefix != "" { + p.WriteString(prefix) + p.WriteByte(':') + } + p.WriteString(name.Local) +} + +func (p *printer) writeEnd(name Name) error { + if name.Local == "" { + return fmt.Errorf("xml: end tag with no name") + } + if len(p.tags) == 0 || p.tags[len(p.tags)-1].Local == "" { + return fmt.Errorf("xml: end tag without start tag", name.Local) + } + if top := p.tags[len(p.tags)-1]; top != name { + if top.Local != name.Local { + return fmt.Errorf("xml: end tag does not match start tag <%s>", name.Local, top.Local) + } + return fmt.Errorf("xml: end tag in namespace %s does not match start tag <%s> in namespace %s", name.Local, name.Space, top.Local, top.Space) + } + p.tags = p.tags[:len(p.tags)-1] + + p.writeIndent(-1) + p.WriteByte('<') + p.WriteByte('/') + p.writeName(name, false) + p.WriteByte('>') + p.popPrefix() + return nil +} + +func (p *printer) marshalSimple(typ reflect.Type, val reflect.Value) (string, []byte, error) { + switch val.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return strconv.FormatInt(val.Int(), 10), nil, nil + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return strconv.FormatUint(val.Uint(), 10), nil, nil + case reflect.Float32, reflect.Float64: + return strconv.FormatFloat(val.Float(), 'g', -1, val.Type().Bits()), nil, nil + case reflect.String: + return val.String(), nil, nil + case reflect.Bool: + return strconv.FormatBool(val.Bool()), nil, nil + case reflect.Array: + if typ.Elem().Kind() != reflect.Uint8 { + break + } + // [...]byte + var bytes []byte + if val.CanAddr() { + bytes = val.Slice(0, val.Len()).Bytes() + } else { + bytes = make([]byte, val.Len()) + reflect.Copy(reflect.ValueOf(bytes), val) + } + return "", bytes, nil + case reflect.Slice: + if typ.Elem().Kind() != reflect.Uint8 { + break + } + // []byte + return "", val.Bytes(), nil + } + return "", nil, &UnsupportedTypeError{typ} +} + +var ddBytes = []byte("--") + +func (p *printer) marshalStruct(tinfo *typeInfo, val reflect.Value) error { + s := parentStack{p: p} + for i := range tinfo.fields { + finfo := &tinfo.fields[i] + if finfo.flags&fAttr != 0 { + continue + } + vf := finfo.value(val) + + // Dereference or skip nil pointer, interface values. + switch vf.Kind() { + case reflect.Ptr, reflect.Interface: + if !vf.IsNil() { + vf = vf.Elem() + } + } + + switch finfo.flags & fMode { + case fCharData: + if err := s.setParents(&noField, reflect.Value{}); err != nil { + return err + } + if vf.CanInterface() && vf.Type().Implements(textMarshalerType) { + data, err := vf.Interface().(encoding.TextMarshaler).MarshalText() + if err != nil { + return err + } + Escape(p, data) + continue + } + if vf.CanAddr() { + pv := vf.Addr() + if pv.CanInterface() && pv.Type().Implements(textMarshalerType) { + data, err := pv.Interface().(encoding.TextMarshaler).MarshalText() + if err != nil { + return err + } + Escape(p, data) + continue + } + } + var scratch [64]byte + switch vf.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + Escape(p, strconv.AppendInt(scratch[:0], vf.Int(), 10)) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + Escape(p, strconv.AppendUint(scratch[:0], vf.Uint(), 10)) + case reflect.Float32, reflect.Float64: + Escape(p, strconv.AppendFloat(scratch[:0], vf.Float(), 'g', -1, vf.Type().Bits())) + case reflect.Bool: + Escape(p, strconv.AppendBool(scratch[:0], vf.Bool())) + case reflect.String: + if err := EscapeText(p, []byte(vf.String())); err != nil { + return err + } + case reflect.Slice: + if elem, ok := vf.Interface().([]byte); ok { + if err := EscapeText(p, elem); err != nil { + return err + } + } + } + continue + + case fComment: + if err := s.setParents(&noField, reflect.Value{}); err != nil { + return err + } + k := vf.Kind() + if !(k == reflect.String || k == reflect.Slice && vf.Type().Elem().Kind() == reflect.Uint8) { + return fmt.Errorf("xml: bad type for comment field of %s", val.Type()) + } + if vf.Len() == 0 { + continue + } + p.writeIndent(0) + p.WriteString("" is invalid grammar. Make it "- -->" + p.WriteByte(' ') + } + p.WriteString("-->") + continue + + case fInnerXml: + iface := vf.Interface() + switch raw := iface.(type) { + case []byte: + p.Write(raw) + continue + case string: + p.WriteString(raw) + continue + } + + case fElement, fElement | fAny: + if err := s.setParents(finfo, vf); err != nil { + return err + } + } + if err := p.marshalValue(vf, finfo, nil); err != nil { + return err + } + } + if err := s.setParents(&noField, reflect.Value{}); err != nil { + return err + } + return p.cachedWriteError() +} + +var noField fieldInfo + +// return the bufio Writer's cached write error +func (p *printer) cachedWriteError() error { + _, err := p.Write(nil) + return err +} + +func (p *printer) writeIndent(depthDelta int) { + if len(p.prefix) == 0 && len(p.indent) == 0 { + return + } + if depthDelta < 0 { + p.depth-- + if p.indentedIn { + p.indentedIn = false + return + } + p.indentedIn = false + } + if p.putNewline { + p.WriteByte('\n') + } else { + p.putNewline = true + } + if len(p.prefix) > 0 { + p.WriteString(p.prefix) + } + if len(p.indent) > 0 { + for i := 0; i < p.depth; i++ { + p.WriteString(p.indent) + } + } + if depthDelta > 0 { + p.depth++ + p.indentedIn = true + } +} + +type parentStack struct { + p *printer + xmlns string + parents []string +} + +// setParents sets the stack of current parents to those found in finfo. +// It only writes the start elements if vf holds a non-nil value. +// If finfo is &noField, it pops all elements. +func (s *parentStack) setParents(finfo *fieldInfo, vf reflect.Value) error { + xmlns := s.p.defaultNS + if finfo.xmlns != "" { + xmlns = finfo.xmlns + } + commonParents := 0 + if xmlns == s.xmlns { + for ; commonParents < len(finfo.parents) && commonParents < len(s.parents); commonParents++ { + if finfo.parents[commonParents] != s.parents[commonParents] { + break + } + } + } + // Pop off any parents that aren't in common with the previous field. + for i := len(s.parents) - 1; i >= commonParents; i-- { + if err := s.p.writeEnd(Name{ + Space: s.xmlns, + Local: s.parents[i], + }); err != nil { + return err + } + } + s.parents = finfo.parents + s.xmlns = xmlns + if commonParents >= len(s.parents) { + // No new elements to push. + return nil + } + if (vf.Kind() == reflect.Ptr || vf.Kind() == reflect.Interface) && vf.IsNil() { + // The element is nil, so no need for the start elements. + s.parents = s.parents[:commonParents] + return nil + } + // Push any new parents required. + for _, name := range s.parents[commonParents:] { + start := &StartElement{ + Name: Name{ + Space: s.xmlns, + Local: name, + }, + } + // Set the default name space for parent elements + // to match what we do with other elements. + if s.xmlns != s.p.defaultNS { + start.setDefaultNamespace() + } + if err := s.p.writeStart(start); err != nil { + return err + } + } + return nil +} + +// A MarshalXMLError is returned when Marshal encounters a type +// that cannot be converted into XML. +type UnsupportedTypeError struct { + Type reflect.Type +} + +func (e *UnsupportedTypeError) Error() string { + return "xml: unsupported type: " + e.Type.String() +} + +func isEmptyValue(v reflect.Value) bool { + switch v.Kind() { + case reflect.Array, reflect.Map, reflect.Slice, reflect.String: + return v.Len() == 0 + case reflect.Bool: + return !v.Bool() + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return v.Int() == 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return v.Uint() == 0 + case reflect.Float32, reflect.Float64: + return v.Float() == 0 + case reflect.Interface, reflect.Ptr: + return v.IsNil() + } + return false +} diff --git a/api/vendor/golang.org/x/net/webdav/internal/xml/marshal_test.go b/api/vendor/golang.org/x/net/webdav/internal/xml/marshal_test.go new file mode 100644 index 0000000..226cfd0 --- /dev/null +++ b/api/vendor/golang.org/x/net/webdav/internal/xml/marshal_test.go @@ -0,0 +1,1939 @@ +// 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 xml + +import ( + "bytes" + "errors" + "fmt" + "io" + "reflect" + "strconv" + "strings" + "sync" + "testing" + "time" +) + +type DriveType int + +const ( + HyperDrive DriveType = iota + ImprobabilityDrive +) + +type Passenger struct { + Name []string `xml:"name"` + Weight float32 `xml:"weight"` +} + +type Ship struct { + XMLName struct{} `xml:"spaceship"` + + Name string `xml:"name,attr"` + Pilot string `xml:"pilot,attr"` + Drive DriveType `xml:"drive"` + Age uint `xml:"age"` + Passenger []*Passenger `xml:"passenger"` + secret string +} + +type NamedType string + +type Port struct { + XMLName struct{} `xml:"port"` + Type string `xml:"type,attr,omitempty"` + Comment string `xml:",comment"` + Number string `xml:",chardata"` +} + +type Domain struct { + XMLName struct{} `xml:"domain"` + Country string `xml:",attr,omitempty"` + Name []byte `xml:",chardata"` + Comment []byte `xml:",comment"` +} + +type Book struct { + XMLName struct{} `xml:"book"` + Title string `xml:",chardata"` +} + +type Event struct { + XMLName struct{} `xml:"event"` + Year int `xml:",chardata"` +} + +type Movie struct { + XMLName struct{} `xml:"movie"` + Length uint `xml:",chardata"` +} + +type Pi struct { + XMLName struct{} `xml:"pi"` + Approximation float32 `xml:",chardata"` +} + +type Universe struct { + XMLName struct{} `xml:"universe"` + Visible float64 `xml:",chardata"` +} + +type Particle struct { + XMLName struct{} `xml:"particle"` + HasMass bool `xml:",chardata"` +} + +type Departure struct { + XMLName struct{} `xml:"departure"` + When time.Time `xml:",chardata"` +} + +type SecretAgent struct { + XMLName struct{} `xml:"agent"` + Handle string `xml:"handle,attr"` + Identity string + Obfuscate string `xml:",innerxml"` +} + +type NestedItems struct { + XMLName struct{} `xml:"result"` + Items []string `xml:">item"` + Item1 []string `xml:"Items>item1"` +} + +type NestedOrder struct { + XMLName struct{} `xml:"result"` + Field1 string `xml:"parent>c"` + Field2 string `xml:"parent>b"` + Field3 string `xml:"parent>a"` +} + +type MixedNested struct { + XMLName struct{} `xml:"result"` + A string `xml:"parent1>a"` + B string `xml:"b"` + C string `xml:"parent1>parent2>c"` + D string `xml:"parent1>d"` +} + +type NilTest struct { + A interface{} `xml:"parent1>parent2>a"` + B interface{} `xml:"parent1>b"` + C interface{} `xml:"parent1>parent2>c"` +} + +type Service struct { + XMLName struct{} `xml:"service"` + Domain *Domain `xml:"host>domain"` + Port *Port `xml:"host>port"` + Extra1 interface{} + Extra2 interface{} `xml:"host>extra2"` +} + +var nilStruct *Ship + +type EmbedA struct { + EmbedC + EmbedB EmbedB + FieldA string +} + +type EmbedB struct { + FieldB string + *EmbedC +} + +type EmbedC struct { + FieldA1 string `xml:"FieldA>A1"` + FieldA2 string `xml:"FieldA>A2"` + FieldB string + FieldC string +} + +type NameCasing struct { + XMLName struct{} `xml:"casing"` + Xy string + XY string + XyA string `xml:"Xy,attr"` + XYA string `xml:"XY,attr"` +} + +type NamePrecedence struct { + XMLName Name `xml:"Parent"` + FromTag XMLNameWithoutTag `xml:"InTag"` + FromNameVal XMLNameWithoutTag + FromNameTag XMLNameWithTag + InFieldName string +} + +type XMLNameWithTag struct { + XMLName Name `xml:"InXMLNameTag"` + Value string `xml:",chardata"` +} + +type XMLNameWithNSTag struct { + XMLName Name `xml:"ns InXMLNameWithNSTag"` + Value string `xml:",chardata"` +} + +type XMLNameWithoutTag struct { + XMLName Name + Value string `xml:",chardata"` +} + +type NameInField struct { + Foo Name `xml:"ns foo"` +} + +type AttrTest struct { + Int int `xml:",attr"` + Named int `xml:"int,attr"` + Float float64 `xml:",attr"` + Uint8 uint8 `xml:",attr"` + Bool bool `xml:",attr"` + Str string `xml:",attr"` + Bytes []byte `xml:",attr"` +} + +type OmitAttrTest struct { + Int int `xml:",attr,omitempty"` + Named int `xml:"int,attr,omitempty"` + Float float64 `xml:",attr,omitempty"` + Uint8 uint8 `xml:",attr,omitempty"` + Bool bool `xml:",attr,omitempty"` + Str string `xml:",attr,omitempty"` + Bytes []byte `xml:",attr,omitempty"` +} + +type OmitFieldTest struct { + Int int `xml:",omitempty"` + Named int `xml:"int,omitempty"` + Float float64 `xml:",omitempty"` + Uint8 uint8 `xml:",omitempty"` + Bool bool `xml:",omitempty"` + Str string `xml:",omitempty"` + Bytes []byte `xml:",omitempty"` + Ptr *PresenceTest `xml:",omitempty"` +} + +type AnyTest struct { + XMLName struct{} `xml:"a"` + Nested string `xml:"nested>value"` + AnyField AnyHolder `xml:",any"` +} + +type AnyOmitTest struct { + XMLName struct{} `xml:"a"` + Nested string `xml:"nested>value"` + AnyField *AnyHolder `xml:",any,omitempty"` +} + +type AnySliceTest struct { + XMLName struct{} `xml:"a"` + Nested string `xml:"nested>value"` + AnyField []AnyHolder `xml:",any"` +} + +type AnyHolder struct { + XMLName Name + XML string `xml:",innerxml"` +} + +type RecurseA struct { + A string + B *RecurseB +} + +type RecurseB struct { + A *RecurseA + B string +} + +type PresenceTest struct { + Exists *struct{} +} + +type IgnoreTest struct { + PublicSecret string `xml:"-"` +} + +type MyBytes []byte + +type Data struct { + Bytes []byte + Attr []byte `xml:",attr"` + Custom MyBytes +} + +type Plain struct { + V interface{} +} + +type MyInt int + +type EmbedInt struct { + MyInt +} + +type Strings struct { + X []string `xml:"A>B,omitempty"` +} + +type PointerFieldsTest struct { + XMLName Name `xml:"dummy"` + Name *string `xml:"name,attr"` + Age *uint `xml:"age,attr"` + Empty *string `xml:"empty,attr"` + Contents *string `xml:",chardata"` +} + +type ChardataEmptyTest struct { + XMLName Name `xml:"test"` + Contents *string `xml:",chardata"` +} + +type MyMarshalerTest struct { +} + +var _ Marshaler = (*MyMarshalerTest)(nil) + +func (m *MyMarshalerTest) MarshalXML(e *Encoder, start StartElement) error { + e.EncodeToken(start) + e.EncodeToken(CharData([]byte("hello world"))) + e.EncodeToken(EndElement{start.Name}) + return nil +} + +type MyMarshalerAttrTest struct{} + +var _ MarshalerAttr = (*MyMarshalerAttrTest)(nil) + +func (m *MyMarshalerAttrTest) MarshalXMLAttr(name Name) (Attr, error) { + return Attr{name, "hello world"}, nil +} + +type MyMarshalerValueAttrTest struct{} + +var _ MarshalerAttr = MyMarshalerValueAttrTest{} + +func (m MyMarshalerValueAttrTest) MarshalXMLAttr(name Name) (Attr, error) { + return Attr{name, "hello world"}, nil +} + +type MarshalerStruct struct { + Foo MyMarshalerAttrTest `xml:",attr"` +} + +type MarshalerValueStruct struct { + Foo MyMarshalerValueAttrTest `xml:",attr"` +} + +type InnerStruct struct { + XMLName Name `xml:"testns outer"` +} + +type OuterStruct struct { + InnerStruct + IntAttr int `xml:"int,attr"` +} + +type OuterNamedStruct struct { + InnerStruct + XMLName Name `xml:"outerns test"` + IntAttr int `xml:"int,attr"` +} + +type OuterNamedOrderedStruct struct { + XMLName Name `xml:"outerns test"` + InnerStruct + IntAttr int `xml:"int,attr"` +} + +type OuterOuterStruct struct { + OuterStruct +} + +type NestedAndChardata struct { + AB []string `xml:"A>B"` + Chardata string `xml:",chardata"` +} + +type NestedAndComment struct { + AB []string `xml:"A>B"` + Comment string `xml:",comment"` +} + +type XMLNSFieldStruct struct { + Ns string `xml:"xmlns,attr"` + Body string +} + +type NamedXMLNSFieldStruct struct { + XMLName struct{} `xml:"testns test"` + Ns string `xml:"xmlns,attr"` + Body string +} + +type XMLNSFieldStructWithOmitEmpty struct { + Ns string `xml:"xmlns,attr,omitempty"` + Body string +} + +type NamedXMLNSFieldStructWithEmptyNamespace struct { + XMLName struct{} `xml:"test"` + Ns string `xml:"xmlns,attr"` + Body string +} + +type RecursiveXMLNSFieldStruct struct { + Ns string `xml:"xmlns,attr"` + Body *RecursiveXMLNSFieldStruct `xml:",omitempty"` + Text string `xml:",omitempty"` +} + +func ifaceptr(x interface{}) interface{} { + return &x +} + +var ( + nameAttr = "Sarah" + ageAttr = uint(12) + contentsAttr = "lorem ipsum" +) + +// Unless explicitly stated as such (or *Plain), all of the +// tests below are two-way tests. When introducing new tests, +// please try to make them two-way as well to ensure that +// marshalling and unmarshalling are as symmetrical as feasible. +var marshalTests = []struct { + Value interface{} + ExpectXML string + MarshalOnly bool + UnmarshalOnly bool +}{ + // Test nil marshals to nothing + {Value: nil, ExpectXML: ``, MarshalOnly: true}, + {Value: nilStruct, ExpectXML: ``, MarshalOnly: true}, + + // Test value types + {Value: &Plain{true}, ExpectXML: `true`}, + {Value: &Plain{false}, ExpectXML: `false`}, + {Value: &Plain{int(42)}, ExpectXML: `42`}, + {Value: &Plain{int8(42)}, ExpectXML: `42`}, + {Value: &Plain{int16(42)}, ExpectXML: `42`}, + {Value: &Plain{int32(42)}, ExpectXML: `42`}, + {Value: &Plain{uint(42)}, ExpectXML: `42`}, + {Value: &Plain{uint8(42)}, ExpectXML: `42`}, + {Value: &Plain{uint16(42)}, ExpectXML: `42`}, + {Value: &Plain{uint32(42)}, ExpectXML: `42`}, + {Value: &Plain{float32(1.25)}, ExpectXML: `1.25`}, + {Value: &Plain{float64(1.25)}, ExpectXML: `1.25`}, + {Value: &Plain{uintptr(0xFFDD)}, ExpectXML: `65501`}, + {Value: &Plain{"gopher"}, ExpectXML: `gopher`}, + {Value: &Plain{[]byte("gopher")}, ExpectXML: `gopher`}, + {Value: &Plain{""}, ExpectXML: `</>`}, + {Value: &Plain{[]byte("")}, ExpectXML: `</>`}, + {Value: &Plain{[3]byte{'<', '/', '>'}}, ExpectXML: `</>`}, + {Value: &Plain{NamedType("potato")}, ExpectXML: `potato`}, + {Value: &Plain{[]int{1, 2, 3}}, ExpectXML: `123`}, + {Value: &Plain{[3]int{1, 2, 3}}, ExpectXML: `123`}, + {Value: ifaceptr(true), MarshalOnly: true, ExpectXML: `true`}, + + // Test time. + { + Value: &Plain{time.Unix(1e9, 123456789).UTC()}, + ExpectXML: `2001-09-09T01:46:40.123456789Z`, + }, + + // A pointer to struct{} may be used to test for an element's presence. + { + Value: &PresenceTest{new(struct{})}, + ExpectXML: ``, + }, + { + Value: &PresenceTest{}, + ExpectXML: ``, + }, + + // A pointer to struct{} may be used to test for an element's presence. + { + Value: &PresenceTest{new(struct{})}, + ExpectXML: ``, + }, + { + Value: &PresenceTest{}, + ExpectXML: ``, + }, + + // A []byte field is only nil if the element was not found. + { + Value: &Data{}, + ExpectXML: ``, + UnmarshalOnly: true, + }, + { + Value: &Data{Bytes: []byte{}, Custom: MyBytes{}, Attr: []byte{}}, + ExpectXML: ``, + UnmarshalOnly: true, + }, + + // Check that []byte works, including named []byte types. + { + Value: &Data{Bytes: []byte("ab"), Custom: MyBytes("cd"), Attr: []byte{'v'}}, + ExpectXML: `abcd`, + }, + + // Test innerxml + { + Value: &SecretAgent{ + Handle: "007", + Identity: "James Bond", + Obfuscate: "", + }, + ExpectXML: `James Bond`, + MarshalOnly: true, + }, + { + Value: &SecretAgent{ + Handle: "007", + Identity: "James Bond", + Obfuscate: "James Bond", + }, + ExpectXML: `James Bond`, + UnmarshalOnly: true, + }, + + // Test structs + {Value: &Port{Type: "ssl", Number: "443"}, ExpectXML: `443`}, + {Value: &Port{Number: "443"}, ExpectXML: `443`}, + {Value: &Port{Type: ""}, ExpectXML: ``}, + {Value: &Port{Number: "443", Comment: "https"}, ExpectXML: `443`}, + {Value: &Port{Number: "443", Comment: "add space-"}, ExpectXML: `443`, MarshalOnly: true}, + {Value: &Domain{Name: []byte("google.com&friends")}, ExpectXML: `google.com&friends`}, + {Value: &Domain{Name: []byte("google.com"), Comment: []byte(" &friends ")}, ExpectXML: `google.com`}, + {Value: &Book{Title: "Pride & Prejudice"}, ExpectXML: `Pride & Prejudice`}, + {Value: &Event{Year: -3114}, ExpectXML: `-3114`}, + {Value: &Movie{Length: 13440}, ExpectXML: `13440`}, + {Value: &Pi{Approximation: 3.14159265}, ExpectXML: `3.1415927`}, + {Value: &Universe{Visible: 9.3e13}, ExpectXML: `9.3e+13`}, + {Value: &Particle{HasMass: true}, ExpectXML: `true`}, + {Value: &Departure{When: ParseTime("2013-01-09T00:15:00-09:00")}, ExpectXML: `2013-01-09T00:15:00-09:00`}, + {Value: atomValue, ExpectXML: atomXml}, + { + Value: &Ship{ + Name: "Heart of Gold", + Pilot: "Computer", + Age: 1, + Drive: ImprobabilityDrive, + Passenger: []*Passenger{ + { + Name: []string{"Zaphod", "Beeblebrox"}, + Weight: 7.25, + }, + { + Name: []string{"Trisha", "McMillen"}, + Weight: 5.5, + }, + { + Name: []string{"Ford", "Prefect"}, + Weight: 7, + }, + { + Name: []string{"Arthur", "Dent"}, + Weight: 6.75, + }, + }, + }, + ExpectXML: `` + + `` + strconv.Itoa(int(ImprobabilityDrive)) + `` + + `1` + + `` + + `Zaphod` + + `Beeblebrox` + + `7.25` + + `` + + `` + + `Trisha` + + `McMillen` + + `5.5` + + `` + + `` + + `Ford` + + `Prefect` + + `7` + + `` + + `` + + `Arthur` + + `Dent` + + `6.75` + + `` + + ``, + }, + + // Test a>b + { + Value: &NestedItems{Items: nil, Item1: nil}, + ExpectXML: `` + + `` + + `` + + ``, + }, + { + Value: &NestedItems{Items: []string{}, Item1: []string{}}, + ExpectXML: `` + + `` + + `` + + ``, + MarshalOnly: true, + }, + { + Value: &NestedItems{Items: nil, Item1: []string{"A"}}, + ExpectXML: `` + + `` + + `A` + + `` + + ``, + }, + { + Value: &NestedItems{Items: []string{"A", "B"}, Item1: nil}, + ExpectXML: `` + + `` + + `A` + + `B` + + `` + + ``, + }, + { + Value: &NestedItems{Items: []string{"A", "B"}, Item1: []string{"C"}}, + ExpectXML: `` + + `` + + `A` + + `B` + + `C` + + `` + + ``, + }, + { + Value: &NestedOrder{Field1: "C", Field2: "B", Field3: "A"}, + ExpectXML: `` + + `` + + `C` + + `B` + + `A` + + `` + + ``, + }, + { + Value: &NilTest{A: "A", B: nil, C: "C"}, + ExpectXML: `` + + `` + + `A` + + `C` + + `` + + ``, + MarshalOnly: true, // Uses interface{} + }, + { + Value: &MixedNested{A: "A", B: "B", C: "C", D: "D"}, + ExpectXML: `` + + `A` + + `B` + + `` + + `C` + + `D` + + `` + + ``, + }, + { + Value: &Service{Port: &Port{Number: "80"}}, + ExpectXML: `80`, + }, + { + Value: &Service{}, + ExpectXML: ``, + }, + { + Value: &Service{Port: &Port{Number: "80"}, Extra1: "A", Extra2: "B"}, + ExpectXML: `` + + `80` + + `A` + + `B` + + ``, + MarshalOnly: true, + }, + { + Value: &Service{Port: &Port{Number: "80"}, Extra2: "example"}, + ExpectXML: `` + + `80` + + `example` + + ``, + MarshalOnly: true, + }, + { + Value: &struct { + XMLName struct{} `xml:"space top"` + A string `xml:"x>a"` + B string `xml:"x>b"` + C string `xml:"space x>c"` + C1 string `xml:"space1 x>c"` + D1 string `xml:"space1 x>d"` + E1 string `xml:"x>e"` + }{ + A: "a", + B: "b", + C: "c", + C1: "c1", + D1: "d1", + E1: "e1", + }, + ExpectXML: `` + + `abc` + + `` + + `c1` + + `d1` + + `` + + `` + + `e1` + + `` + + ``, + }, + { + Value: &struct { + XMLName Name + A string `xml:"x>a"` + B string `xml:"x>b"` + C string `xml:"space x>c"` + C1 string `xml:"space1 x>c"` + D1 string `xml:"space1 x>d"` + }{ + XMLName: Name{ + Space: "space0", + Local: "top", + }, + A: "a", + B: "b", + C: "c", + C1: "c1", + D1: "d1", + }, + ExpectXML: `` + + `ab` + + `c` + + `` + + `c1` + + `d1` + + `` + + ``, + }, + { + Value: &struct { + XMLName struct{} `xml:"top"` + B string `xml:"space x>b"` + B1 string `xml:"space1 x>b"` + }{ + B: "b", + B1: "b1", + }, + ExpectXML: `` + + `b` + + `b1` + + ``, + }, + + // Test struct embedding + { + Value: &EmbedA{ + EmbedC: EmbedC{ + FieldA1: "", // Shadowed by A.A + FieldA2: "", // Shadowed by A.A + FieldB: "A.C.B", + FieldC: "A.C.C", + }, + EmbedB: EmbedB{ + FieldB: "A.B.B", + EmbedC: &EmbedC{ + FieldA1: "A.B.C.A1", + FieldA2: "A.B.C.A2", + FieldB: "", // Shadowed by A.B.B + FieldC: "A.B.C.C", + }, + }, + FieldA: "A.A", + }, + ExpectXML: `` + + `A.C.B` + + `A.C.C` + + `` + + `A.B.B` + + `` + + `A.B.C.A1` + + `A.B.C.A2` + + `` + + `A.B.C.C` + + `` + + `A.A` + + ``, + }, + + // Test that name casing matters + { + Value: &NameCasing{Xy: "mixed", XY: "upper", XyA: "mixedA", XYA: "upperA"}, + ExpectXML: `mixedupper`, + }, + + // Test the order in which the XML element name is chosen + { + Value: &NamePrecedence{ + FromTag: XMLNameWithoutTag{Value: "A"}, + FromNameVal: XMLNameWithoutTag{XMLName: Name{Local: "InXMLName"}, Value: "B"}, + FromNameTag: XMLNameWithTag{Value: "C"}, + InFieldName: "D", + }, + ExpectXML: `` + + `A` + + `B` + + `C` + + `D` + + ``, + MarshalOnly: true, + }, + { + Value: &NamePrecedence{ + XMLName: Name{Local: "Parent"}, + FromTag: XMLNameWithoutTag{XMLName: Name{Local: "InTag"}, Value: "A"}, + FromNameVal: XMLNameWithoutTag{XMLName: Name{Local: "FromNameVal"}, Value: "B"}, + FromNameTag: XMLNameWithTag{XMLName: Name{Local: "InXMLNameTag"}, Value: "C"}, + InFieldName: "D", + }, + ExpectXML: `` + + `A` + + `B` + + `C` + + `D` + + ``, + UnmarshalOnly: true, + }, + + // xml.Name works in a plain field as well. + { + Value: &NameInField{Name{Space: "ns", Local: "foo"}}, + ExpectXML: ``, + }, + { + Value: &NameInField{Name{Space: "ns", Local: "foo"}}, + ExpectXML: ``, + UnmarshalOnly: true, + }, + + // Marshaling zero xml.Name uses the tag or field name. + { + Value: &NameInField{}, + ExpectXML: ``, + MarshalOnly: true, + }, + + // Test attributes + { + Value: &AttrTest{ + Int: 8, + Named: 9, + Float: 23.5, + Uint8: 255, + Bool: true, + Str: "str", + Bytes: []byte("byt"), + }, + ExpectXML: ``, + }, + { + Value: &AttrTest{Bytes: []byte{}}, + ExpectXML: ``, + }, + { + Value: &OmitAttrTest{ + Int: 8, + Named: 9, + Float: 23.5, + Uint8: 255, + Bool: true, + Str: "str", + Bytes: []byte("byt"), + }, + ExpectXML: ``, + }, + { + Value: &OmitAttrTest{}, + ExpectXML: ``, + }, + + // pointer fields + { + Value: &PointerFieldsTest{Name: &nameAttr, Age: &ageAttr, Contents: &contentsAttr}, + ExpectXML: `lorem ipsum`, + MarshalOnly: true, + }, + + // empty chardata pointer field + { + Value: &ChardataEmptyTest{}, + ExpectXML: ``, + MarshalOnly: true, + }, + + // omitempty on fields + { + Value: &OmitFieldTest{ + Int: 8, + Named: 9, + Float: 23.5, + Uint8: 255, + Bool: true, + Str: "str", + Bytes: []byte("byt"), + Ptr: &PresenceTest{}, + }, + ExpectXML: `` + + `8` + + `9` + + `23.5` + + `255` + + `true` + + `str` + + `byt` + + `` + + ``, + }, + { + Value: &OmitFieldTest{}, + ExpectXML: ``, + }, + + // Test ",any" + { + ExpectXML: `knownunknown`, + Value: &AnyTest{ + Nested: "known", + AnyField: AnyHolder{ + XMLName: Name{Local: "other"}, + XML: "unknown", + }, + }, + }, + { + Value: &AnyTest{Nested: "known", + AnyField: AnyHolder{ + XML: "", + XMLName: Name{Local: "AnyField"}, + }, + }, + ExpectXML: `known`, + }, + { + ExpectXML: `b`, + Value: &AnyOmitTest{ + Nested: "b", + }, + }, + { + ExpectXML: `bei`, + Value: &AnySliceTest{ + Nested: "b", + AnyField: []AnyHolder{ + { + XMLName: Name{Local: "c"}, + XML: "e", + }, + { + XMLName: Name{Space: "f", Local: "g"}, + XML: "i", + }, + }, + }, + }, + { + ExpectXML: `b`, + Value: &AnySliceTest{ + Nested: "b", + }, + }, + + // Test recursive types. + { + Value: &RecurseA{ + A: "a1", + B: &RecurseB{ + A: &RecurseA{"a2", nil}, + B: "b1", + }, + }, + ExpectXML: `a1a2b1`, + }, + + // Test ignoring fields via "-" tag + { + ExpectXML: ``, + Value: &IgnoreTest{}, + }, + { + ExpectXML: ``, + Value: &IgnoreTest{PublicSecret: "can't tell"}, + MarshalOnly: true, + }, + { + ExpectXML: `ignore me`, + Value: &IgnoreTest{}, + UnmarshalOnly: true, + }, + + // Test escaping. + { + ExpectXML: `dquote: "; squote: '; ampersand: &; less: <; greater: >;`, + Value: &AnyTest{ + Nested: `dquote: "; squote: '; ampersand: &; less: <; greater: >;`, + AnyField: AnyHolder{XMLName: Name{Local: "empty"}}, + }, + }, + { + ExpectXML: `newline: ; cr: ; tab: ;`, + Value: &AnyTest{ + Nested: "newline: \n; cr: \r; tab: \t;", + AnyField: AnyHolder{XMLName: Name{Local: "AnyField"}}, + }, + }, + { + ExpectXML: "1\r2\r\n3\n\r4\n5", + Value: &AnyTest{ + Nested: "1\n2\n3\n\n4\n5", + }, + UnmarshalOnly: true, + }, + { + ExpectXML: `42`, + Value: &EmbedInt{ + MyInt: 42, + }, + }, + // Test omitempty with parent chain; see golang.org/issue/4168. + { + ExpectXML: ``, + Value: &Strings{}, + }, + // Custom marshalers. + { + ExpectXML: `hello world`, + Value: &MyMarshalerTest{}, + }, + { + ExpectXML: ``, + Value: &MarshalerStruct{}, + }, + { + ExpectXML: ``, + Value: &MarshalerValueStruct{}, + }, + { + ExpectXML: ``, + Value: &OuterStruct{IntAttr: 10}, + }, + { + ExpectXML: ``, + Value: &OuterNamedStruct{XMLName: Name{Space: "outerns", Local: "test"}, IntAttr: 10}, + }, + { + ExpectXML: ``, + Value: &OuterNamedOrderedStruct{XMLName: Name{Space: "outerns", Local: "test"}, IntAttr: 10}, + }, + { + ExpectXML: ``, + Value: &OuterOuterStruct{OuterStruct{IntAttr: 10}}, + }, + { + ExpectXML: `test`, + Value: &NestedAndChardata{AB: make([]string, 2), Chardata: "test"}, + }, + { + ExpectXML: ``, + Value: &NestedAndComment{AB: make([]string, 2), Comment: "test"}, + }, + { + ExpectXML: `hello world`, + Value: &XMLNSFieldStruct{Ns: "http://example.com/ns", Body: "hello world"}, + }, + { + ExpectXML: `hello world`, + Value: &NamedXMLNSFieldStruct{Ns: "http://example.com/ns", Body: "hello world"}, + }, + { + ExpectXML: `hello world`, + Value: &NamedXMLNSFieldStruct{Ns: "", Body: "hello world"}, + }, + { + ExpectXML: `hello world`, + Value: &XMLNSFieldStructWithOmitEmpty{Body: "hello world"}, + }, + { + // The xmlns attribute must be ignored because the + // element is in the empty namespace, so it's not possible + // to set the default namespace to something non-empty. + ExpectXML: `hello world`, + Value: &NamedXMLNSFieldStructWithEmptyNamespace{Ns: "foo", Body: "hello world"}, + MarshalOnly: true, + }, + { + ExpectXML: `hello world`, + Value: &RecursiveXMLNSFieldStruct{ + Ns: "foo", + Body: &RecursiveXMLNSFieldStruct{ + Text: "hello world", + }, + }, + }, +} + +func TestMarshal(t *testing.T) { + for idx, test := range marshalTests { + if test.UnmarshalOnly { + continue + } + data, err := Marshal(test.Value) + if err != nil { + t.Errorf("#%d: marshal(%#v): %s", idx, test.Value, err) + continue + } + if got, want := string(data), test.ExpectXML; got != want { + if strings.Contains(want, "\n") { + t.Errorf("#%d: marshal(%#v):\nHAVE:\n%s\nWANT:\n%s", idx, test.Value, got, want) + } else { + t.Errorf("#%d: marshal(%#v):\nhave %#q\nwant %#q", idx, test.Value, got, want) + } + } + } +} + +type AttrParent struct { + X string `xml:"X>Y,attr"` +} + +type BadAttr struct { + Name []string `xml:"name,attr"` +} + +var marshalErrorTests = []struct { + Value interface{} + Err string + Kind reflect.Kind +}{ + { + Value: make(chan bool), + Err: "xml: unsupported type: chan bool", + Kind: reflect.Chan, + }, + { + Value: map[string]string{ + "question": "What do you get when you multiply six by nine?", + "answer": "42", + }, + Err: "xml: unsupported type: map[string]string", + Kind: reflect.Map, + }, + { + Value: map[*Ship]bool{nil: false}, + Err: "xml: unsupported type: map[*xml.Ship]bool", + Kind: reflect.Map, + }, + { + Value: &Domain{Comment: []byte("f--bar")}, + Err: `xml: comments must not contain "--"`, + }, + // Reject parent chain with attr, never worked; see golang.org/issue/5033. + { + Value: &AttrParent{}, + Err: `xml: X>Y chain not valid with attr flag`, + }, + { + Value: BadAttr{[]string{"X", "Y"}}, + Err: `xml: unsupported type: []string`, + }, +} + +var marshalIndentTests = []struct { + Value interface{} + Prefix string + Indent string + ExpectXML string +}{ + { + Value: &SecretAgent{ + Handle: "007", + Identity: "James Bond", + Obfuscate: "", + }, + Prefix: "", + Indent: "\t", + ExpectXML: fmt.Sprintf("\n\tJames Bond\n"), + }, +} + +func TestMarshalErrors(t *testing.T) { + for idx, test := range marshalErrorTests { + data, err := Marshal(test.Value) + if err == nil { + t.Errorf("#%d: marshal(%#v) = [success] %q, want error %v", idx, test.Value, data, test.Err) + continue + } + if err.Error() != test.Err { + t.Errorf("#%d: marshal(%#v) = [error] %v, want %v", idx, test.Value, err, test.Err) + } + if test.Kind != reflect.Invalid { + if kind := err.(*UnsupportedTypeError).Type.Kind(); kind != test.Kind { + t.Errorf("#%d: marshal(%#v) = [error kind] %s, want %s", idx, test.Value, kind, test.Kind) + } + } + } +} + +// Do invertibility testing on the various structures that we test +func TestUnmarshal(t *testing.T) { + for i, test := range marshalTests { + if test.MarshalOnly { + continue + } + if _, ok := test.Value.(*Plain); ok { + continue + } + vt := reflect.TypeOf(test.Value) + dest := reflect.New(vt.Elem()).Interface() + err := Unmarshal([]byte(test.ExpectXML), dest) + + switch fix := dest.(type) { + case *Feed: + fix.Author.InnerXML = "" + for i := range fix.Entry { + fix.Entry[i].Author.InnerXML = "" + } + } + + if err != nil { + t.Errorf("#%d: unexpected error: %#v", i, err) + } else if got, want := dest, test.Value; !reflect.DeepEqual(got, want) { + t.Errorf("#%d: unmarshal(%q):\nhave %#v\nwant %#v", i, test.ExpectXML, got, want) + } + } +} + +func TestMarshalIndent(t *testing.T) { + for i, test := range marshalIndentTests { + data, err := MarshalIndent(test.Value, test.Prefix, test.Indent) + if err != nil { + t.Errorf("#%d: Error: %s", i, err) + continue + } + if got, want := string(data), test.ExpectXML; got != want { + t.Errorf("#%d: MarshalIndent:\nGot:%s\nWant:\n%s", i, got, want) + } + } +} + +type limitedBytesWriter struct { + w io.Writer + remain int // until writes fail +} + +func (lw *limitedBytesWriter) Write(p []byte) (n int, err error) { + if lw.remain <= 0 { + println("error") + return 0, errors.New("write limit hit") + } + if len(p) > lw.remain { + p = p[:lw.remain] + n, _ = lw.w.Write(p) + lw.remain = 0 + return n, errors.New("write limit hit") + } + n, err = lw.w.Write(p) + lw.remain -= n + return n, err +} + +func TestMarshalWriteErrors(t *testing.T) { + var buf bytes.Buffer + const writeCap = 1024 + w := &limitedBytesWriter{&buf, writeCap} + enc := NewEncoder(w) + var err error + var i int + const n = 4000 + for i = 1; i <= n; i++ { + err = enc.Encode(&Passenger{ + Name: []string{"Alice", "Bob"}, + Weight: 5, + }) + if err != nil { + break + } + } + if err == nil { + t.Error("expected an error") + } + if i == n { + t.Errorf("expected to fail before the end") + } + if buf.Len() != writeCap { + t.Errorf("buf.Len() = %d; want %d", buf.Len(), writeCap) + } +} + +func TestMarshalWriteIOErrors(t *testing.T) { + enc := NewEncoder(errWriter{}) + + expectErr := "unwritable" + err := enc.Encode(&Passenger{}) + if err == nil || err.Error() != expectErr { + t.Errorf("EscapeTest = [error] %v, want %v", err, expectErr) + } +} + +func TestMarshalFlush(t *testing.T) { + var buf bytes.Buffer + enc := NewEncoder(&buf) + if err := enc.EncodeToken(CharData("hello world")); err != nil { + t.Fatalf("enc.EncodeToken: %v", err) + } + if buf.Len() > 0 { + t.Fatalf("enc.EncodeToken caused actual write: %q", buf.Bytes()) + } + if err := enc.Flush(); err != nil { + t.Fatalf("enc.Flush: %v", err) + } + if buf.String() != "hello world" { + t.Fatalf("after enc.Flush, buf.String() = %q, want %q", buf.String(), "hello world") + } +} + +var encodeElementTests = []struct { + desc string + value interface{} + start StartElement + expectXML string +}{{ + desc: "simple string", + value: "hello", + start: StartElement{ + Name: Name{Local: "a"}, + }, + expectXML: `hello`, +}, { + desc: "string with added attributes", + value: "hello", + start: StartElement{ + Name: Name{Local: "a"}, + Attr: []Attr{{ + Name: Name{Local: "x"}, + Value: "y", + }, { + Name: Name{Local: "foo"}, + Value: "bar", + }}, + }, + expectXML: `hello`, +}, { + desc: "start element with default name space", + value: struct { + Foo XMLNameWithNSTag + }{ + Foo: XMLNameWithNSTag{ + Value: "hello", + }, + }, + start: StartElement{ + Name: Name{Space: "ns", Local: "a"}, + Attr: []Attr{{ + Name: Name{Local: "xmlns"}, + // "ns" is the name space defined in XMLNameWithNSTag + Value: "ns", + }}, + }, + expectXML: `hello`, +}, { + desc: "start element in name space with different default name space", + value: struct { + Foo XMLNameWithNSTag + }{ + Foo: XMLNameWithNSTag{ + Value: "hello", + }, + }, + start: StartElement{ + Name: Name{Space: "ns2", Local: "a"}, + Attr: []Attr{{ + Name: Name{Local: "xmlns"}, + // "ns" is the name space defined in XMLNameWithNSTag + Value: "ns", + }}, + }, + expectXML: `hello`, +}, { + desc: "XMLMarshaler with start element with default name space", + value: &MyMarshalerTest{}, + start: StartElement{ + Name: Name{Space: "ns2", Local: "a"}, + Attr: []Attr{{ + Name: Name{Local: "xmlns"}, + // "ns" is the name space defined in XMLNameWithNSTag + Value: "ns", + }}, + }, + expectXML: `hello world`, +}} + +func TestEncodeElement(t *testing.T) { + for idx, test := range encodeElementTests { + var buf bytes.Buffer + enc := NewEncoder(&buf) + err := enc.EncodeElement(test.value, test.start) + if err != nil { + t.Fatalf("enc.EncodeElement: %v", err) + } + err = enc.Flush() + if err != nil { + t.Fatalf("enc.Flush: %v", err) + } + if got, want := buf.String(), test.expectXML; got != want { + t.Errorf("#%d(%s): EncodeElement(%#v, %#v):\nhave %#q\nwant %#q", idx, test.desc, test.value, test.start, got, want) + } + } +} + +func BenchmarkMarshal(b *testing.B) { + b.ReportAllocs() + for i := 0; i < b.N; i++ { + Marshal(atomValue) + } +} + +func BenchmarkUnmarshal(b *testing.B) { + b.ReportAllocs() + xml := []byte(atomXml) + for i := 0; i < b.N; i++ { + Unmarshal(xml, &Feed{}) + } +} + +// golang.org/issue/6556 +func TestStructPointerMarshal(t *testing.T) { + type A struct { + XMLName string `xml:"a"` + B []interface{} + } + type C struct { + XMLName Name + Value string `xml:"value"` + } + + a := new(A) + a.B = append(a.B, &C{ + XMLName: Name{Local: "c"}, + Value: "x", + }) + + b, err := Marshal(a) + if err != nil { + t.Fatal(err) + } + if x := string(b); x != "x" { + t.Fatal(x) + } + var v A + err = Unmarshal(b, &v) + if err != nil { + t.Fatal(err) + } +} + +var encodeTokenTests = []struct { + desc string + toks []Token + want string + err string +}{{ + desc: "start element with name space", + toks: []Token{ + StartElement{Name{"space", "local"}, nil}, + }, + want: ``, +}, { + desc: "start element with no name", + toks: []Token{ + StartElement{Name{"space", ""}, nil}, + }, + err: "xml: start tag with no name", +}, { + desc: "end element with no name", + toks: []Token{ + EndElement{Name{"space", ""}}, + }, + err: "xml: end tag with no name", +}, { + desc: "char data", + toks: []Token{ + CharData("foo"), + }, + want: `foo`, +}, { + desc: "char data with escaped chars", + toks: []Token{ + CharData(" \t\n"), + }, + want: " \n", +}, { + desc: "comment", + toks: []Token{ + Comment("foo"), + }, + want: ``, +}, { + desc: "comment with invalid content", + toks: []Token{ + Comment("foo-->"), + }, + err: "xml: EncodeToken of Comment containing --> marker", +}, { + desc: "proc instruction", + toks: []Token{ + ProcInst{"Target", []byte("Instruction")}, + }, + want: ``, +}, { + desc: "proc instruction with empty target", + toks: []Token{ + ProcInst{"", []byte("Instruction")}, + }, + err: "xml: EncodeToken of ProcInst with invalid Target", +}, { + desc: "proc instruction with bad content", + toks: []Token{ + ProcInst{"", []byte("Instruction?>")}, + }, + err: "xml: EncodeToken of ProcInst with invalid Target", +}, { + desc: "directive", + toks: []Token{ + Directive("foo"), + }, + want: ``, +}, { + desc: "more complex directive", + toks: []Token{ + Directive("DOCTYPE doc [ '> ]"), + }, + want: `'> ]>`, +}, { + desc: "directive instruction with bad name", + toks: []Token{ + Directive("foo>"), + }, + err: "xml: EncodeToken of Directive containing wrong < or > markers", +}, { + desc: "end tag without start tag", + toks: []Token{ + EndElement{Name{"foo", "bar"}}, + }, + err: "xml: end tag without start tag", +}, { + desc: "mismatching end tag local name", + toks: []Token{ + StartElement{Name{"", "foo"}, nil}, + EndElement{Name{"", "bar"}}, + }, + err: "xml: end tag does not match start tag ", + want: ``, +}, { + desc: "mismatching end tag namespace", + toks: []Token{ + StartElement{Name{"space", "foo"}, nil}, + EndElement{Name{"another", "foo"}}, + }, + err: "xml: end tag in namespace another does not match start tag in namespace space", + want: ``, +}, { + desc: "start element with explicit namespace", + toks: []Token{ + StartElement{Name{"space", "local"}, []Attr{ + {Name{"xmlns", "x"}, "space"}, + {Name{"space", "foo"}, "value"}, + }}, + }, + want: ``, +}, { + desc: "start element with explicit namespace and colliding prefix", + toks: []Token{ + StartElement{Name{"space", "local"}, []Attr{ + {Name{"xmlns", "x"}, "space"}, + {Name{"space", "foo"}, "value"}, + {Name{"x", "bar"}, "other"}, + }}, + }, + want: ``, +}, { + desc: "start element using previously defined namespace", + toks: []Token{ + StartElement{Name{"", "local"}, []Attr{ + {Name{"xmlns", "x"}, "space"}, + }}, + StartElement{Name{"space", "foo"}, []Attr{ + {Name{"space", "x"}, "y"}, + }}, + }, + want: ``, +}, { + desc: "nested name space with same prefix", + toks: []Token{ + StartElement{Name{"", "foo"}, []Attr{ + {Name{"xmlns", "x"}, "space1"}, + }}, + StartElement{Name{"", "foo"}, []Attr{ + {Name{"xmlns", "x"}, "space2"}, + }}, + StartElement{Name{"", "foo"}, []Attr{ + {Name{"space1", "a"}, "space1 value"}, + {Name{"space2", "b"}, "space2 value"}, + }}, + EndElement{Name{"", "foo"}}, + EndElement{Name{"", "foo"}}, + StartElement{Name{"", "foo"}, []Attr{ + {Name{"space1", "a"}, "space1 value"}, + {Name{"space2", "b"}, "space2 value"}, + }}, + }, + want: ``, +}, { + desc: "start element defining several prefixes for the same name space", + toks: []Token{ + StartElement{Name{"space", "foo"}, []Attr{ + {Name{"xmlns", "a"}, "space"}, + {Name{"xmlns", "b"}, "space"}, + {Name{"space", "x"}, "value"}, + }}, + }, + want: ``, +}, { + desc: "nested element redefines name space", + toks: []Token{ + StartElement{Name{"", "foo"}, []Attr{ + {Name{"xmlns", "x"}, "space"}, + }}, + StartElement{Name{"space", "foo"}, []Attr{ + {Name{"xmlns", "y"}, "space"}, + {Name{"space", "a"}, "value"}, + }}, + }, + want: ``, +}, { + desc: "nested element creates alias for default name space", + toks: []Token{ + StartElement{Name{"space", "foo"}, []Attr{ + {Name{"", "xmlns"}, "space"}, + }}, + StartElement{Name{"space", "foo"}, []Attr{ + {Name{"xmlns", "y"}, "space"}, + {Name{"space", "a"}, "value"}, + }}, + }, + want: ``, +}, { + desc: "nested element defines default name space with existing prefix", + toks: []Token{ + StartElement{Name{"", "foo"}, []Attr{ + {Name{"xmlns", "x"}, "space"}, + }}, + StartElement{Name{"space", "foo"}, []Attr{ + {Name{"", "xmlns"}, "space"}, + {Name{"space", "a"}, "value"}, + }}, + }, + want: ``, +}, { + desc: "nested element uses empty attribute name space when default ns defined", + toks: []Token{ + StartElement{Name{"space", "foo"}, []Attr{ + {Name{"", "xmlns"}, "space"}, + }}, + StartElement{Name{"space", "foo"}, []Attr{ + {Name{"", "attr"}, "value"}, + }}, + }, + want: ``, +}, { + desc: "redefine xmlns", + toks: []Token{ + StartElement{Name{"", "foo"}, []Attr{ + {Name{"foo", "xmlns"}, "space"}, + }}, + }, + err: `xml: cannot redefine xmlns attribute prefix`, +}, { + desc: "xmlns with explicit name space #1", + toks: []Token{ + StartElement{Name{"space", "foo"}, []Attr{ + {Name{"xml", "xmlns"}, "space"}, + }}, + }, + want: ``, +}, { + desc: "xmlns with explicit name space #2", + toks: []Token{ + StartElement{Name{"space", "foo"}, []Attr{ + {Name{xmlURL, "xmlns"}, "space"}, + }}, + }, + want: ``, +}, { + desc: "empty name space declaration is ignored", + toks: []Token{ + StartElement{Name{"", "foo"}, []Attr{ + {Name{"xmlns", "foo"}, ""}, + }}, + }, + want: ``, +}, { + desc: "attribute with no name is ignored", + toks: []Token{ + StartElement{Name{"", "foo"}, []Attr{ + {Name{"", ""}, "value"}, + }}, + }, + want: ``, +}, { + desc: "namespace URL with non-valid name", + toks: []Token{ + StartElement{Name{"/34", "foo"}, []Attr{ + {Name{"/34", "x"}, "value"}, + }}, + }, + want: `<_:foo xmlns:_="/34" _:x="value">`, +}, { + desc: "nested element resets default namespace to empty", + toks: []Token{ + StartElement{Name{"space", "foo"}, []Attr{ + {Name{"", "xmlns"}, "space"}, + }}, + StartElement{Name{"", "foo"}, []Attr{ + {Name{"", "xmlns"}, ""}, + {Name{"", "x"}, "value"}, + {Name{"space", "x"}, "value"}, + }}, + }, + want: ``, +}, { + desc: "nested element requires empty default name space", + toks: []Token{ + StartElement{Name{"space", "foo"}, []Attr{ + {Name{"", "xmlns"}, "space"}, + }}, + StartElement{Name{"", "foo"}, nil}, + }, + want: ``, +}, { + desc: "attribute uses name space from xmlns", + toks: []Token{ + StartElement{Name{"some/space", "foo"}, []Attr{ + {Name{"", "attr"}, "value"}, + {Name{"some/space", "other"}, "other value"}, + }}, + }, + want: ``, +}, { + desc: "default name space should not be used by attributes", + toks: []Token{ + StartElement{Name{"space", "foo"}, []Attr{ + {Name{"", "xmlns"}, "space"}, + {Name{"xmlns", "bar"}, "space"}, + {Name{"space", "baz"}, "foo"}, + }}, + StartElement{Name{"space", "baz"}, nil}, + EndElement{Name{"space", "baz"}}, + EndElement{Name{"space", "foo"}}, + }, + want: ``, +}, { + desc: "default name space not used by attributes, not explicitly defined", + toks: []Token{ + StartElement{Name{"space", "foo"}, []Attr{ + {Name{"", "xmlns"}, "space"}, + {Name{"space", "baz"}, "foo"}, + }}, + StartElement{Name{"space", "baz"}, nil}, + EndElement{Name{"space", "baz"}}, + EndElement{Name{"space", "foo"}}, + }, + want: ``, +}, { + desc: "impossible xmlns declaration", + toks: []Token{ + StartElement{Name{"", "foo"}, []Attr{ + {Name{"", "xmlns"}, "space"}, + }}, + StartElement{Name{"space", "bar"}, []Attr{ + {Name{"space", "attr"}, "value"}, + }}, + }, + want: ``, +}} + +func TestEncodeToken(t *testing.T) { +loop: + for i, tt := range encodeTokenTests { + var buf bytes.Buffer + enc := NewEncoder(&buf) + var err error + for j, tok := range tt.toks { + err = enc.EncodeToken(tok) + if err != nil && j < len(tt.toks)-1 { + t.Errorf("#%d %s token #%d: %v", i, tt.desc, j, err) + continue loop + } + } + errorf := func(f string, a ...interface{}) { + t.Errorf("#%d %s token #%d:%s", i, tt.desc, len(tt.toks)-1, fmt.Sprintf(f, a...)) + } + switch { + case tt.err != "" && err == nil: + errorf(" expected error; got none") + continue + case tt.err == "" && err != nil: + errorf(" got error: %v", err) + continue + case tt.err != "" && err != nil && tt.err != err.Error(): + errorf(" error mismatch; got %v, want %v", err, tt.err) + continue + } + if err := enc.Flush(); err != nil { + errorf(" %v", err) + continue + } + if got := buf.String(); got != tt.want { + errorf("\ngot %v\nwant %v", got, tt.want) + continue + } + } +} + +func TestProcInstEncodeToken(t *testing.T) { + var buf bytes.Buffer + enc := NewEncoder(&buf) + + if err := enc.EncodeToken(ProcInst{"xml", []byte("Instruction")}); err != nil { + t.Fatalf("enc.EncodeToken: expected to be able to encode xml target ProcInst as first token, %s", err) + } + + if err := enc.EncodeToken(ProcInst{"Target", []byte("Instruction")}); err != nil { + t.Fatalf("enc.EncodeToken: expected to be able to add non-xml target ProcInst") + } + + if err := enc.EncodeToken(ProcInst{"xml", []byte("Instruction")}); err == nil { + t.Fatalf("enc.EncodeToken: expected to not be allowed to encode xml target ProcInst when not first token") + } +} + +func TestDecodeEncode(t *testing.T) { + var in, out bytes.Buffer + in.WriteString(` + + + +`) + dec := NewDecoder(&in) + enc := NewEncoder(&out) + for tok, err := dec.Token(); err == nil; tok, err = dec.Token() { + err = enc.EncodeToken(tok) + if err != nil { + t.Fatalf("enc.EncodeToken: Unable to encode token (%#v), %v", tok, err) + } + } +} + +// Issue 9796. Used to fail with GORACE="halt_on_error=1" -race. +func TestRace9796(t *testing.T) { + type A struct{} + type B struct { + C []A `xml:"X>Y"` + } + var wg sync.WaitGroup + for i := 0; i < 2; i++ { + wg.Add(1) + go func() { + Marshal(B{[]A{{}}}) + wg.Done() + }() + } + wg.Wait() +} + +func TestIsValidDirective(t *testing.T) { + testOK := []string{ + "<>", + "< < > >", + "' '>' >", + " ]>", + " '<' ' doc ANY> ]>", + ">>> a < comment --> [ ] >", + } + testKO := []string{ + "<", + ">", + "", + "< > > < < >", + " -->", + "", + "'", + "", + } + for _, s := range testOK { + if !isValidDirective(Directive(s)) { + t.Errorf("Directive %q is expected to be valid", s) + } + } + for _, s := range testKO { + if isValidDirective(Directive(s)) { + t.Errorf("Directive %q is expected to be invalid", s) + } + } +} + +// Issue 11719. EncodeToken used to silently eat tokens with an invalid type. +func TestSimpleUseOfEncodeToken(t *testing.T) { + var buf bytes.Buffer + enc := NewEncoder(&buf) + if err := enc.EncodeToken(&StartElement{Name: Name{"", "object1"}}); err == nil { + t.Errorf("enc.EncodeToken: pointer type should be rejected") + } + if err := enc.EncodeToken(&EndElement{Name: Name{"", "object1"}}); err == nil { + t.Errorf("enc.EncodeToken: pointer type should be rejected") + } + if err := enc.EncodeToken(StartElement{Name: Name{"", "object2"}}); err != nil { + t.Errorf("enc.EncodeToken: StartElement %s", err) + } + if err := enc.EncodeToken(EndElement{Name: Name{"", "object2"}}); err != nil { + t.Errorf("enc.EncodeToken: EndElement %s", err) + } + if err := enc.EncodeToken(Universe{}); err == nil { + t.Errorf("enc.EncodeToken: invalid type not caught") + } + if err := enc.Flush(); err != nil { + t.Errorf("enc.Flush: %s", err) + } + if buf.Len() == 0 { + t.Errorf("enc.EncodeToken: empty buffer") + } + want := "" + if buf.String() != want { + t.Errorf("enc.EncodeToken: expected %q; got %q", want, buf.String()) + } +} diff --git a/api/vendor/golang.org/x/net/webdav/internal/xml/read.go b/api/vendor/golang.org/x/net/webdav/internal/xml/read.go new file mode 100644 index 0000000..4089056 --- /dev/null +++ b/api/vendor/golang.org/x/net/webdav/internal/xml/read.go @@ -0,0 +1,692 @@ +// 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 xml + +import ( + "bytes" + "encoding" + "errors" + "fmt" + "reflect" + "strconv" + "strings" +) + +// BUG(rsc): Mapping between XML elements and data structures is inherently flawed: +// an XML element is an order-dependent collection of anonymous +// values, while a data structure is an order-independent collection +// of named values. +// See package json for a textual representation more suitable +// to data structures. + +// Unmarshal parses the XML-encoded data and stores the result in +// the value pointed to by v, which must be an arbitrary struct, +// slice, or string. Well-formed data that does not fit into v is +// discarded. +// +// Because Unmarshal uses the reflect package, it can only assign +// to exported (upper case) fields. Unmarshal uses a case-sensitive +// comparison to match XML element names to tag values and struct +// field names. +// +// Unmarshal maps an XML element to a struct using the following rules. +// In the rules, the tag of a field refers to the value associated with the +// key 'xml' in the struct field's tag (see the example above). +// +// * If the struct has a field of type []byte or string with tag +// ",innerxml", Unmarshal accumulates the raw XML nested inside the +// element in that field. The rest of the rules still apply. +// +// * If the struct has a field named XMLName of type xml.Name, +// Unmarshal records the element name in that field. +// +// * If the XMLName field has an associated tag of the form +// "name" or "namespace-URL name", the XML element must have +// the given name (and, optionally, name space) or else Unmarshal +// returns an error. +// +// * If the XML element has an attribute whose name matches a +// struct field name with an associated tag containing ",attr" or +// the explicit name in a struct field tag of the form "name,attr", +// Unmarshal records the attribute value in that field. +// +// * If the XML element contains character data, that data is +// accumulated in the first struct field that has tag ",chardata". +// The struct field may have type []byte or string. +// If there is no such field, the character data is discarded. +// +// * If the XML element contains comments, they are accumulated in +// the first struct field that has tag ",comment". The struct +// field may have type []byte or string. If there is no such +// field, the comments are discarded. +// +// * If the XML element contains a sub-element whose name matches +// the prefix of a tag formatted as "a" or "a>b>c", unmarshal +// will descend into the XML structure looking for elements with the +// given names, and will map the innermost elements to that struct +// field. A tag starting with ">" is equivalent to one starting +// with the field name followed by ">". +// +// * If the XML element contains a sub-element whose name matches +// a struct field's XMLName tag and the struct field has no +// explicit name tag as per the previous rule, unmarshal maps +// the sub-element to that struct field. +// +// * If the XML element contains a sub-element whose name matches a +// field without any mode flags (",attr", ",chardata", etc), Unmarshal +// maps the sub-element to that struct field. +// +// * If the XML element contains a sub-element that hasn't matched any +// of the above rules and the struct has a field with tag ",any", +// unmarshal maps the sub-element to that struct field. +// +// * An anonymous struct field is handled as if the fields of its +// value were part of the outer struct. +// +// * A struct field with tag "-" is never unmarshalled into. +// +// Unmarshal maps an XML element to a string or []byte by saving the +// concatenation of that element's character data in the string or +// []byte. The saved []byte is never nil. +// +// Unmarshal maps an attribute value to a string or []byte by saving +// the value in the string or slice. +// +// Unmarshal maps an XML element to a slice by extending the length of +// the slice and mapping the element to the newly created value. +// +// Unmarshal maps an XML element or attribute value to a bool by +// setting it to the boolean value represented by the string. +// +// Unmarshal maps an XML element or attribute value to an integer or +// floating-point field by setting the field to the result of +// interpreting the string value in decimal. There is no check for +// overflow. +// +// Unmarshal maps an XML element to an xml.Name by recording the +// element name. +// +// Unmarshal maps an XML element to a pointer by setting the pointer +// to a freshly allocated value and then mapping the element to that value. +// +func Unmarshal(data []byte, v interface{}) error { + return NewDecoder(bytes.NewReader(data)).Decode(v) +} + +// Decode works like xml.Unmarshal, except it reads the decoder +// stream to find the start element. +func (d *Decoder) Decode(v interface{}) error { + return d.DecodeElement(v, nil) +} + +// DecodeElement works like xml.Unmarshal except that it takes +// a pointer to the start XML element to decode into v. +// It is useful when a client reads some raw XML tokens itself +// but also wants to defer to Unmarshal for some elements. +func (d *Decoder) DecodeElement(v interface{}, start *StartElement) error { + val := reflect.ValueOf(v) + if val.Kind() != reflect.Ptr { + return errors.New("non-pointer passed to Unmarshal") + } + return d.unmarshal(val.Elem(), start) +} + +// An UnmarshalError represents an error in the unmarshalling process. +type UnmarshalError string + +func (e UnmarshalError) Error() string { return string(e) } + +// Unmarshaler is the interface implemented by objects that can unmarshal +// an XML element description of themselves. +// +// UnmarshalXML decodes a single XML element +// beginning with the given start element. +// If it returns an error, the outer call to Unmarshal stops and +// returns that error. +// UnmarshalXML must consume exactly one XML element. +// One common implementation strategy is to unmarshal into +// a separate value with a layout matching the expected XML +// using d.DecodeElement, and then to copy the data from +// that value into the receiver. +// Another common strategy is to use d.Token to process the +// XML object one token at a time. +// UnmarshalXML may not use d.RawToken. +type Unmarshaler interface { + UnmarshalXML(d *Decoder, start StartElement) error +} + +// UnmarshalerAttr is the interface implemented by objects that can unmarshal +// an XML attribute description of themselves. +// +// UnmarshalXMLAttr decodes a single XML attribute. +// If it returns an error, the outer call to Unmarshal stops and +// returns that error. +// UnmarshalXMLAttr is used only for struct fields with the +// "attr" option in the field tag. +type UnmarshalerAttr interface { + UnmarshalXMLAttr(attr Attr) error +} + +// receiverType returns the receiver type to use in an expression like "%s.MethodName". +func receiverType(val interface{}) string { + t := reflect.TypeOf(val) + if t.Name() != "" { + return t.String() + } + return "(" + t.String() + ")" +} + +// unmarshalInterface unmarshals a single XML element into val. +// start is the opening tag of the element. +func (p *Decoder) unmarshalInterface(val Unmarshaler, start *StartElement) error { + // Record that decoder must stop at end tag corresponding to start. + p.pushEOF() + + p.unmarshalDepth++ + err := val.UnmarshalXML(p, *start) + p.unmarshalDepth-- + if err != nil { + p.popEOF() + return err + } + + if !p.popEOF() { + return fmt.Errorf("xml: %s.UnmarshalXML did not consume entire <%s> element", receiverType(val), start.Name.Local) + } + + return nil +} + +// unmarshalTextInterface unmarshals a single XML element into val. +// The chardata contained in the element (but not its children) +// is passed to the text unmarshaler. +func (p *Decoder) unmarshalTextInterface(val encoding.TextUnmarshaler, start *StartElement) error { + var buf []byte + depth := 1 + for depth > 0 { + t, err := p.Token() + if err != nil { + return err + } + switch t := t.(type) { + case CharData: + if depth == 1 { + buf = append(buf, t...) + } + case StartElement: + depth++ + case EndElement: + depth-- + } + } + return val.UnmarshalText(buf) +} + +// unmarshalAttr unmarshals a single XML attribute into val. +func (p *Decoder) unmarshalAttr(val reflect.Value, attr Attr) error { + if val.Kind() == reflect.Ptr { + if val.IsNil() { + val.Set(reflect.New(val.Type().Elem())) + } + val = val.Elem() + } + + if val.CanInterface() && val.Type().Implements(unmarshalerAttrType) { + // This is an unmarshaler with a non-pointer receiver, + // so it's likely to be incorrect, but we do what we're told. + return val.Interface().(UnmarshalerAttr).UnmarshalXMLAttr(attr) + } + if val.CanAddr() { + pv := val.Addr() + if pv.CanInterface() && pv.Type().Implements(unmarshalerAttrType) { + return pv.Interface().(UnmarshalerAttr).UnmarshalXMLAttr(attr) + } + } + + // Not an UnmarshalerAttr; try encoding.TextUnmarshaler. + if val.CanInterface() && val.Type().Implements(textUnmarshalerType) { + // This is an unmarshaler with a non-pointer receiver, + // so it's likely to be incorrect, but we do what we're told. + return val.Interface().(encoding.TextUnmarshaler).UnmarshalText([]byte(attr.Value)) + } + if val.CanAddr() { + pv := val.Addr() + if pv.CanInterface() && pv.Type().Implements(textUnmarshalerType) { + return pv.Interface().(encoding.TextUnmarshaler).UnmarshalText([]byte(attr.Value)) + } + } + + copyValue(val, []byte(attr.Value)) + return nil +} + +var ( + unmarshalerType = reflect.TypeOf((*Unmarshaler)(nil)).Elem() + unmarshalerAttrType = reflect.TypeOf((*UnmarshalerAttr)(nil)).Elem() + textUnmarshalerType = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem() +) + +// Unmarshal a single XML element into val. +func (p *Decoder) unmarshal(val reflect.Value, start *StartElement) error { + // Find start element if we need it. + if start == nil { + for { + tok, err := p.Token() + if err != nil { + return err + } + if t, ok := tok.(StartElement); ok { + start = &t + break + } + } + } + + // Load value from interface, but only if the result will be + // usefully addressable. + if val.Kind() == reflect.Interface && !val.IsNil() { + e := val.Elem() + if e.Kind() == reflect.Ptr && !e.IsNil() { + val = e + } + } + + if val.Kind() == reflect.Ptr { + if val.IsNil() { + val.Set(reflect.New(val.Type().Elem())) + } + val = val.Elem() + } + + if val.CanInterface() && val.Type().Implements(unmarshalerType) { + // This is an unmarshaler with a non-pointer receiver, + // so it's likely to be incorrect, but we do what we're told. + return p.unmarshalInterface(val.Interface().(Unmarshaler), start) + } + + if val.CanAddr() { + pv := val.Addr() + if pv.CanInterface() && pv.Type().Implements(unmarshalerType) { + return p.unmarshalInterface(pv.Interface().(Unmarshaler), start) + } + } + + if val.CanInterface() && val.Type().Implements(textUnmarshalerType) { + return p.unmarshalTextInterface(val.Interface().(encoding.TextUnmarshaler), start) + } + + if val.CanAddr() { + pv := val.Addr() + if pv.CanInterface() && pv.Type().Implements(textUnmarshalerType) { + return p.unmarshalTextInterface(pv.Interface().(encoding.TextUnmarshaler), start) + } + } + + var ( + data []byte + saveData reflect.Value + comment []byte + saveComment reflect.Value + saveXML reflect.Value + saveXMLIndex int + saveXMLData []byte + saveAny reflect.Value + sv reflect.Value + tinfo *typeInfo + err error + ) + + switch v := val; v.Kind() { + default: + return errors.New("unknown type " + v.Type().String()) + + case reflect.Interface: + // TODO: For now, simply ignore the field. In the near + // future we may choose to unmarshal the start + // element on it, if not nil. + return p.Skip() + + case reflect.Slice: + typ := v.Type() + if typ.Elem().Kind() == reflect.Uint8 { + // []byte + saveData = v + break + } + + // Slice of element values. + // Grow slice. + n := v.Len() + if n >= v.Cap() { + ncap := 2 * n + if ncap < 4 { + ncap = 4 + } + new := reflect.MakeSlice(typ, n, ncap) + reflect.Copy(new, v) + v.Set(new) + } + v.SetLen(n + 1) + + // Recur to read element into slice. + if err := p.unmarshal(v.Index(n), start); err != nil { + v.SetLen(n) + return err + } + return nil + + case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr, reflect.String: + saveData = v + + case reflect.Struct: + typ := v.Type() + if typ == nameType { + v.Set(reflect.ValueOf(start.Name)) + break + } + + sv = v + tinfo, err = getTypeInfo(typ) + if err != nil { + return err + } + + // Validate and assign element name. + if tinfo.xmlname != nil { + finfo := tinfo.xmlname + if finfo.name != "" && finfo.name != start.Name.Local { + return UnmarshalError("expected element type <" + finfo.name + "> but have <" + start.Name.Local + ">") + } + if finfo.xmlns != "" && finfo.xmlns != start.Name.Space { + e := "expected element <" + finfo.name + "> in name space " + finfo.xmlns + " but have " + if start.Name.Space == "" { + e += "no name space" + } else { + e += start.Name.Space + } + return UnmarshalError(e) + } + fv := finfo.value(sv) + if _, ok := fv.Interface().(Name); ok { + fv.Set(reflect.ValueOf(start.Name)) + } + } + + // Assign attributes. + // Also, determine whether we need to save character data or comments. + for i := range tinfo.fields { + finfo := &tinfo.fields[i] + switch finfo.flags & fMode { + case fAttr: + strv := finfo.value(sv) + // Look for attribute. + for _, a := range start.Attr { + if a.Name.Local == finfo.name && (finfo.xmlns == "" || finfo.xmlns == a.Name.Space) { + if err := p.unmarshalAttr(strv, a); err != nil { + return err + } + break + } + } + + case fCharData: + if !saveData.IsValid() { + saveData = finfo.value(sv) + } + + case fComment: + if !saveComment.IsValid() { + saveComment = finfo.value(sv) + } + + case fAny, fAny | fElement: + if !saveAny.IsValid() { + saveAny = finfo.value(sv) + } + + case fInnerXml: + if !saveXML.IsValid() { + saveXML = finfo.value(sv) + if p.saved == nil { + saveXMLIndex = 0 + p.saved = new(bytes.Buffer) + } else { + saveXMLIndex = p.savedOffset() + } + } + } + } + } + + // Find end element. + // Process sub-elements along the way. +Loop: + for { + var savedOffset int + if saveXML.IsValid() { + savedOffset = p.savedOffset() + } + tok, err := p.Token() + if err != nil { + return err + } + switch t := tok.(type) { + case StartElement: + consumed := false + if sv.IsValid() { + consumed, err = p.unmarshalPath(tinfo, sv, nil, &t) + if err != nil { + return err + } + if !consumed && saveAny.IsValid() { + consumed = true + if err := p.unmarshal(saveAny, &t); err != nil { + return err + } + } + } + if !consumed { + if err := p.Skip(); err != nil { + return err + } + } + + case EndElement: + if saveXML.IsValid() { + saveXMLData = p.saved.Bytes()[saveXMLIndex:savedOffset] + if saveXMLIndex == 0 { + p.saved = nil + } + } + break Loop + + case CharData: + if saveData.IsValid() { + data = append(data, t...) + } + + case Comment: + if saveComment.IsValid() { + comment = append(comment, t...) + } + } + } + + if saveData.IsValid() && saveData.CanInterface() && saveData.Type().Implements(textUnmarshalerType) { + if err := saveData.Interface().(encoding.TextUnmarshaler).UnmarshalText(data); err != nil { + return err + } + saveData = reflect.Value{} + } + + if saveData.IsValid() && saveData.CanAddr() { + pv := saveData.Addr() + if pv.CanInterface() && pv.Type().Implements(textUnmarshalerType) { + if err := pv.Interface().(encoding.TextUnmarshaler).UnmarshalText(data); err != nil { + return err + } + saveData = reflect.Value{} + } + } + + if err := copyValue(saveData, data); err != nil { + return err + } + + switch t := saveComment; t.Kind() { + case reflect.String: + t.SetString(string(comment)) + case reflect.Slice: + t.Set(reflect.ValueOf(comment)) + } + + switch t := saveXML; t.Kind() { + case reflect.String: + t.SetString(string(saveXMLData)) + case reflect.Slice: + t.Set(reflect.ValueOf(saveXMLData)) + } + + return nil +} + +func copyValue(dst reflect.Value, src []byte) (err error) { + dst0 := dst + + if dst.Kind() == reflect.Ptr { + if dst.IsNil() { + dst.Set(reflect.New(dst.Type().Elem())) + } + dst = dst.Elem() + } + + // Save accumulated data. + switch dst.Kind() { + case reflect.Invalid: + // Probably a comment. + default: + return errors.New("cannot unmarshal into " + dst0.Type().String()) + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + itmp, err := strconv.ParseInt(string(src), 10, dst.Type().Bits()) + if err != nil { + return err + } + dst.SetInt(itmp) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + utmp, err := strconv.ParseUint(string(src), 10, dst.Type().Bits()) + if err != nil { + return err + } + dst.SetUint(utmp) + case reflect.Float32, reflect.Float64: + ftmp, err := strconv.ParseFloat(string(src), dst.Type().Bits()) + if err != nil { + return err + } + dst.SetFloat(ftmp) + case reflect.Bool: + value, err := strconv.ParseBool(strings.TrimSpace(string(src))) + if err != nil { + return err + } + dst.SetBool(value) + case reflect.String: + dst.SetString(string(src)) + case reflect.Slice: + if len(src) == 0 { + // non-nil to flag presence + src = []byte{} + } + dst.SetBytes(src) + } + return nil +} + +// unmarshalPath walks down an XML structure looking for wanted +// paths, and calls unmarshal on them. +// The consumed result tells whether XML elements have been consumed +// from the Decoder until start's matching end element, or if it's +// still untouched because start is uninteresting for sv's fields. +func (p *Decoder) unmarshalPath(tinfo *typeInfo, sv reflect.Value, parents []string, start *StartElement) (consumed bool, err error) { + recurse := false +Loop: + for i := range tinfo.fields { + finfo := &tinfo.fields[i] + if finfo.flags&fElement == 0 || len(finfo.parents) < len(parents) || finfo.xmlns != "" && finfo.xmlns != start.Name.Space { + continue + } + for j := range parents { + if parents[j] != finfo.parents[j] { + continue Loop + } + } + if len(finfo.parents) == len(parents) && finfo.name == start.Name.Local { + // It's a perfect match, unmarshal the field. + return true, p.unmarshal(finfo.value(sv), start) + } + if len(finfo.parents) > len(parents) && finfo.parents[len(parents)] == start.Name.Local { + // It's a prefix for the field. Break and recurse + // since it's not ok for one field path to be itself + // the prefix for another field path. + recurse = true + + // We can reuse the same slice as long as we + // don't try to append to it. + parents = finfo.parents[:len(parents)+1] + break + } + } + if !recurse { + // We have no business with this element. + return false, nil + } + // The element is not a perfect match for any field, but one + // or more fields have the path to this element as a parent + // prefix. Recurse and attempt to match these. + for { + var tok Token + tok, err = p.Token() + if err != nil { + return true, err + } + switch t := tok.(type) { + case StartElement: + consumed2, err := p.unmarshalPath(tinfo, sv, parents, &t) + if err != nil { + return true, err + } + if !consumed2 { + if err := p.Skip(); err != nil { + return true, err + } + } + case EndElement: + return true, nil + } + } +} + +// Skip reads tokens until it has consumed the end element +// matching the most recent start element already consumed. +// It recurs if it encounters a start element, so it can be used to +// skip nested structures. +// It returns nil if it finds an end element matching the start +// element; otherwise it returns an error describing the problem. +func (d *Decoder) Skip() error { + for { + tok, err := d.Token() + if err != nil { + return err + } + switch tok.(type) { + case StartElement: + if err := d.Skip(); err != nil { + return err + } + case EndElement: + return nil + } + } +} diff --git a/api/vendor/golang.org/x/net/webdav/internal/xml/read_test.go b/api/vendor/golang.org/x/net/webdav/internal/xml/read_test.go new file mode 100644 index 0000000..02f1e10 --- /dev/null +++ b/api/vendor/golang.org/x/net/webdav/internal/xml/read_test.go @@ -0,0 +1,744 @@ +// 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 xml + +import ( + "bytes" + "fmt" + "io" + "reflect" + "strings" + "testing" + "time" +) + +// Stripped down Atom feed data structures. + +func TestUnmarshalFeed(t *testing.T) { + var f Feed + if err := Unmarshal([]byte(atomFeedString), &f); err != nil { + t.Fatalf("Unmarshal: %s", err) + } + if !reflect.DeepEqual(f, atomFeed) { + t.Fatalf("have %#v\nwant %#v", f, atomFeed) + } +} + +// hget http://codereview.appspot.com/rss/mine/rsc +const atomFeedString = ` + +Code Review - My issueshttp://codereview.appspot.com/rietveld<>rietveld: an attempt at pubsubhubbub +2009-10-04T01:35:58+00:00email-address-removedurn:md5:134d9179c41f806be79b3a5f7877d19a + An attempt at adding pubsubhubbub support to Rietveld. +http://code.google.com/p/pubsubhubbub +http://code.google.com/p/rietveld/issues/detail?id=155 + +The server side of the protocol is trivial: + 1. add a &lt;link rel=&quot;hub&quot; href=&quot;hub-server&quot;&gt; tag to all + feeds that will be pubsubhubbubbed. + 2. every time one of those feeds changes, tell the hub + with a simple POST request. + +I have tested this by adding debug prints to a local hub +server and checking that the server got the right publish +requests. + +I can&#39;t quite get the server to work, but I think the bug +is not in my code. I think that the server expects to be +able to grab the feed and see the feed&#39;s actual URL in +the link rel=&quot;self&quot;, but the default value for that drops +the :port from the URL, and I cannot for the life of me +figure out how to get the Atom generator deep inside +django not to do that, or even where it is doing that, +or even what code is running to generate the Atom feed. +(I thought I knew but I added some assert False statements +and it kept running!) + +Ignoring that particular problem, I would appreciate +feedback on the right way to get the two values at +the top of feeds.py marked NOTE(rsc). + + +rietveld: correct tab handling +2009-10-03T23:02:17+00:00email-address-removedurn:md5:0a2a4f19bb815101f0ba2904aed7c35a + This fixes the buggy tab rendering that can be seen at +http://codereview.appspot.com/116075/diff/1/2 + +The fundamental problem was that the tab code was +not being told what column the text began in, so it +didn&#39;t know where to put the tab stops. Another problem +was that some of the code assumed that string byte +offsets were the same as column offsets, which is only +true if there are no tabs. + +In the process of fixing this, I cleaned up the arguments +to Fold and ExpandTabs and renamed them Break and +_ExpandTabs so that I could be sure that I found all the +call sites. I also wanted to verify that ExpandTabs was +not being used from outside intra_region_diff.py. + + + ` + +type Feed struct { + XMLName Name `xml:"http://www.w3.org/2005/Atom feed"` + Title string `xml:"title"` + Id string `xml:"id"` + Link []Link `xml:"link"` + Updated time.Time `xml:"updated,attr"` + Author Person `xml:"author"` + Entry []Entry `xml:"entry"` +} + +type Entry struct { + Title string `xml:"title"` + Id string `xml:"id"` + Link []Link `xml:"link"` + Updated time.Time `xml:"updated"` + Author Person `xml:"author"` + Summary Text `xml:"summary"` +} + +type Link struct { + Rel string `xml:"rel,attr,omitempty"` + Href string `xml:"href,attr"` +} + +type Person struct { + Name string `xml:"name"` + URI string `xml:"uri"` + Email string `xml:"email"` + InnerXML string `xml:",innerxml"` +} + +type Text struct { + Type string `xml:"type,attr,omitempty"` + Body string `xml:",chardata"` +} + +var atomFeed = Feed{ + XMLName: Name{"http://www.w3.org/2005/Atom", "feed"}, + Title: "Code Review - My issues", + Link: []Link{ + {Rel: "alternate", Href: "http://codereview.appspot.com/"}, + {Rel: "self", Href: "http://codereview.appspot.com/rss/mine/rsc"}, + }, + Id: "http://codereview.appspot.com/", + Updated: ParseTime("2009-10-04T01:35:58+00:00"), + Author: Person{ + Name: "rietveld<>", + InnerXML: "rietveld<>", + }, + Entry: []Entry{ + { + Title: "rietveld: an attempt at pubsubhubbub\n", + Link: []Link{ + {Rel: "alternate", Href: "http://codereview.appspot.com/126085"}, + }, + Updated: ParseTime("2009-10-04T01:35:58+00:00"), + Author: Person{ + Name: "email-address-removed", + InnerXML: "email-address-removed", + }, + Id: "urn:md5:134d9179c41f806be79b3a5f7877d19a", + Summary: Text{ + Type: "html", + Body: ` + An attempt at adding pubsubhubbub support to Rietveld. +http://code.google.com/p/pubsubhubbub +http://code.google.com/p/rietveld/issues/detail?id=155 + +The server side of the protocol is trivial: + 1. add a <link rel="hub" href="hub-server"> tag to all + feeds that will be pubsubhubbubbed. + 2. every time one of those feeds changes, tell the hub + with a simple POST request. + +I have tested this by adding debug prints to a local hub +server and checking that the server got the right publish +requests. + +I can't quite get the server to work, but I think the bug +is not in my code. I think that the server expects to be +able to grab the feed and see the feed's actual URL in +the link rel="self", but the default value for that drops +the :port from the URL, and I cannot for the life of me +figure out how to get the Atom generator deep inside +django not to do that, or even where it is doing that, +or even what code is running to generate the Atom feed. +(I thought I knew but I added some assert False statements +and it kept running!) + +Ignoring that particular problem, I would appreciate +feedback on the right way to get the two values at +the top of feeds.py marked NOTE(rsc). + + +`, + }, + }, + { + Title: "rietveld: correct tab handling\n", + Link: []Link{ + {Rel: "alternate", Href: "http://codereview.appspot.com/124106"}, + }, + Updated: ParseTime("2009-10-03T23:02:17+00:00"), + Author: Person{ + Name: "email-address-removed", + InnerXML: "email-address-removed", + }, + Id: "urn:md5:0a2a4f19bb815101f0ba2904aed7c35a", + Summary: Text{ + Type: "html", + Body: ` + This fixes the buggy tab rendering that can be seen at +http://codereview.appspot.com/116075/diff/1/2 + +The fundamental problem was that the tab code was +not being told what column the text began in, so it +didn't know where to put the tab stops. Another problem +was that some of the code assumed that string byte +offsets were the same as column offsets, which is only +true if there are no tabs. + +In the process of fixing this, I cleaned up the arguments +to Fold and ExpandTabs and renamed them Break and +_ExpandTabs so that I could be sure that I found all the +call sites. I also wanted to verify that ExpandTabs was +not being used from outside intra_region_diff.py. + + +`, + }, + }, + }, +} + +const pathTestString = ` + + 1 + + + A + + + B + + + C + D + + <_> + E + + + 2 + +` + +type PathTestItem struct { + Value string +} + +type PathTestA struct { + Items []PathTestItem `xml:">Item1"` + Before, After string +} + +type PathTestB struct { + Other []PathTestItem `xml:"Items>Item1"` + Before, After string +} + +type PathTestC struct { + Values1 []string `xml:"Items>Item1>Value"` + Values2 []string `xml:"Items>Item2>Value"` + Before, After string +} + +type PathTestSet struct { + Item1 []PathTestItem +} + +type PathTestD struct { + Other PathTestSet `xml:"Items"` + Before, After string +} + +type PathTestE struct { + Underline string `xml:"Items>_>Value"` + Before, After string +} + +var pathTests = []interface{}{ + &PathTestA{Items: []PathTestItem{{"A"}, {"D"}}, Before: "1", After: "2"}, + &PathTestB{Other: []PathTestItem{{"A"}, {"D"}}, Before: "1", After: "2"}, + &PathTestC{Values1: []string{"A", "C", "D"}, Values2: []string{"B"}, Before: "1", After: "2"}, + &PathTestD{Other: PathTestSet{Item1: []PathTestItem{{"A"}, {"D"}}}, Before: "1", After: "2"}, + &PathTestE{Underline: "E", Before: "1", After: "2"}, +} + +func TestUnmarshalPaths(t *testing.T) { + for _, pt := range pathTests { + v := reflect.New(reflect.TypeOf(pt).Elem()).Interface() + if err := Unmarshal([]byte(pathTestString), v); err != nil { + t.Fatalf("Unmarshal: %s", err) + } + if !reflect.DeepEqual(v, pt) { + t.Fatalf("have %#v\nwant %#v", v, pt) + } + } +} + +type BadPathTestA struct { + First string `xml:"items>item1"` + Other string `xml:"items>item2"` + Second string `xml:"items"` +} + +type BadPathTestB struct { + Other string `xml:"items>item2>value"` + First string `xml:"items>item1"` + Second string `xml:"items>item1>value"` +} + +type BadPathTestC struct { + First string + Second string `xml:"First"` +} + +type BadPathTestD struct { + BadPathEmbeddedA + BadPathEmbeddedB +} + +type BadPathEmbeddedA struct { + First string +} + +type BadPathEmbeddedB struct { + Second string `xml:"First"` +} + +var badPathTests = []struct { + v, e interface{} +}{ + {&BadPathTestA{}, &TagPathError{reflect.TypeOf(BadPathTestA{}), "First", "items>item1", "Second", "items"}}, + {&BadPathTestB{}, &TagPathError{reflect.TypeOf(BadPathTestB{}), "First", "items>item1", "Second", "items>item1>value"}}, + {&BadPathTestC{}, &TagPathError{reflect.TypeOf(BadPathTestC{}), "First", "", "Second", "First"}}, + {&BadPathTestD{}, &TagPathError{reflect.TypeOf(BadPathTestD{}), "First", "", "Second", "First"}}, +} + +func TestUnmarshalBadPaths(t *testing.T) { + for _, tt := range badPathTests { + err := Unmarshal([]byte(pathTestString), tt.v) + if !reflect.DeepEqual(err, tt.e) { + t.Fatalf("Unmarshal with %#v didn't fail properly:\nhave %#v,\nwant %#v", tt.v, err, tt.e) + } + } +} + +const OK = "OK" +const withoutNameTypeData = ` + +` + +type TestThree struct { + XMLName Name `xml:"Test3"` + Attr string `xml:",attr"` +} + +func TestUnmarshalWithoutNameType(t *testing.T) { + var x TestThree + if err := Unmarshal([]byte(withoutNameTypeData), &x); err != nil { + t.Fatalf("Unmarshal: %s", err) + } + if x.Attr != OK { + t.Fatalf("have %v\nwant %v", x.Attr, OK) + } +} + +func TestUnmarshalAttr(t *testing.T) { + type ParamVal struct { + Int int `xml:"int,attr"` + } + + type ParamPtr struct { + Int *int `xml:"int,attr"` + } + + type ParamStringPtr struct { + Int *string `xml:"int,attr"` + } + + x := []byte(``) + + p1 := &ParamPtr{} + if err := Unmarshal(x, p1); err != nil { + t.Fatalf("Unmarshal: %s", err) + } + if p1.Int == nil { + t.Fatalf("Unmarshal failed in to *int field") + } else if *p1.Int != 1 { + t.Fatalf("Unmarshal with %s failed:\nhave %#v,\n want %#v", x, p1.Int, 1) + } + + p2 := &ParamVal{} + if err := Unmarshal(x, p2); err != nil { + t.Fatalf("Unmarshal: %s", err) + } + if p2.Int != 1 { + t.Fatalf("Unmarshal with %s failed:\nhave %#v,\n want %#v", x, p2.Int, 1) + } + + p3 := &ParamStringPtr{} + if err := Unmarshal(x, p3); err != nil { + t.Fatalf("Unmarshal: %s", err) + } + if p3.Int == nil { + t.Fatalf("Unmarshal failed in to *string field") + } else if *p3.Int != "1" { + t.Fatalf("Unmarshal with %s failed:\nhave %#v,\n want %#v", x, p3.Int, 1) + } +} + +type Tables struct { + HTable string `xml:"http://www.w3.org/TR/html4/ table"` + FTable string `xml:"http://www.w3schools.com/furniture table"` +} + +var tables = []struct { + xml string + tab Tables + ns string +}{ + { + xml: `` + + `hello
    ` + + `world
    ` + + `
    `, + tab: Tables{"hello", "world"}, + }, + { + xml: `` + + `world
    ` + + `hello
    ` + + `
    `, + tab: Tables{"hello", "world"}, + }, + { + xml: `` + + `world` + + `hello` + + ``, + tab: Tables{"hello", "world"}, + }, + { + xml: `` + + `bogus
    ` + + `
    `, + tab: Tables{}, + }, + { + xml: `` + + `only
    ` + + `
    `, + tab: Tables{HTable: "only"}, + ns: "http://www.w3.org/TR/html4/", + }, + { + xml: `` + + `only
    ` + + `
    `, + tab: Tables{FTable: "only"}, + ns: "http://www.w3schools.com/furniture", + }, + { + xml: `` + + `only
    ` + + `
    `, + tab: Tables{}, + ns: "something else entirely", + }, +} + +func TestUnmarshalNS(t *testing.T) { + for i, tt := range tables { + var dst Tables + var err error + if tt.ns != "" { + d := NewDecoder(strings.NewReader(tt.xml)) + d.DefaultSpace = tt.ns + err = d.Decode(&dst) + } else { + err = Unmarshal([]byte(tt.xml), &dst) + } + if err != nil { + t.Errorf("#%d: Unmarshal: %v", i, err) + continue + } + want := tt.tab + if dst != want { + t.Errorf("#%d: dst=%+v, want %+v", i, dst, want) + } + } +} + +func TestRoundTrip(t *testing.T) { + // From issue 7535 + const s = `` + in := bytes.NewBufferString(s) + for i := 0; i < 10; i++ { + out := &bytes.Buffer{} + d := NewDecoder(in) + e := NewEncoder(out) + + for { + t, err := d.Token() + if err == io.EOF { + break + } + if err != nil { + fmt.Println("failed:", err) + return + } + e.EncodeToken(t) + } + e.Flush() + in = out + } + if got := in.String(); got != s { + t.Errorf("have: %q\nwant: %q\n", got, s) + } +} + +func TestMarshalNS(t *testing.T) { + dst := Tables{"hello", "world"} + data, err := Marshal(&dst) + if err != nil { + t.Fatalf("Marshal: %v", err) + } + want := `hello
    world
    ` + str := string(data) + if str != want { + t.Errorf("have: %q\nwant: %q\n", str, want) + } +} + +type TableAttrs struct { + TAttr TAttr +} + +type TAttr struct { + HTable string `xml:"http://www.w3.org/TR/html4/ table,attr"` + FTable string `xml:"http://www.w3schools.com/furniture table,attr"` + Lang string `xml:"http://www.w3.org/XML/1998/namespace lang,attr,omitempty"` + Other1 string `xml:"http://golang.org/xml/ other,attr,omitempty"` + Other2 string `xml:"http://golang.org/xmlfoo/ other,attr,omitempty"` + Other3 string `xml:"http://golang.org/json/ other,attr,omitempty"` + Other4 string `xml:"http://golang.org/2/json/ other,attr,omitempty"` +} + +var tableAttrs = []struct { + xml string + tab TableAttrs + ns string +}{ + { + xml: ``, + tab: TableAttrs{TAttr{HTable: "hello", FTable: "world"}}, + }, + { + xml: ``, + tab: TableAttrs{TAttr{HTable: "hello", FTable: "world"}}, + }, + { + xml: ``, + tab: TableAttrs{TAttr{HTable: "hello", FTable: "world"}}, + }, + { + // Default space does not apply to attribute names. + xml: ``, + tab: TableAttrs{TAttr{HTable: "hello", FTable: ""}}, + }, + { + // Default space does not apply to attribute names. + xml: ``, + tab: TableAttrs{TAttr{HTable: "", FTable: "world"}}, + }, + { + xml: ``, + tab: TableAttrs{}, + }, + { + // Default space does not apply to attribute names. + xml: ``, + tab: TableAttrs{TAttr{HTable: "hello", FTable: ""}}, + ns: "http://www.w3schools.com/furniture", + }, + { + // Default space does not apply to attribute names. + xml: ``, + tab: TableAttrs{TAttr{HTable: "", FTable: "world"}}, + ns: "http://www.w3.org/TR/html4/", + }, + { + xml: ``, + tab: TableAttrs{}, + ns: "something else entirely", + }, +} + +func TestUnmarshalNSAttr(t *testing.T) { + for i, tt := range tableAttrs { + var dst TableAttrs + var err error + if tt.ns != "" { + d := NewDecoder(strings.NewReader(tt.xml)) + d.DefaultSpace = tt.ns + err = d.Decode(&dst) + } else { + err = Unmarshal([]byte(tt.xml), &dst) + } + if err != nil { + t.Errorf("#%d: Unmarshal: %v", i, err) + continue + } + want := tt.tab + if dst != want { + t.Errorf("#%d: dst=%+v, want %+v", i, dst, want) + } + } +} + +func TestMarshalNSAttr(t *testing.T) { + src := TableAttrs{TAttr{"hello", "world", "en_US", "other1", "other2", "other3", "other4"}} + data, err := Marshal(&src) + if err != nil { + t.Fatalf("Marshal: %v", err) + } + want := `` + str := string(data) + if str != want { + t.Errorf("Marshal:\nhave: %#q\nwant: %#q\n", str, want) + } + + var dst TableAttrs + if err := Unmarshal(data, &dst); err != nil { + t.Errorf("Unmarshal: %v", err) + } + + if dst != src { + t.Errorf("Unmarshal = %q, want %q", dst, src) + } +} + +type MyCharData struct { + body string +} + +func (m *MyCharData) UnmarshalXML(d *Decoder, start StartElement) error { + for { + t, err := d.Token() + if err == io.EOF { // found end of element + break + } + if err != nil { + return err + } + if char, ok := t.(CharData); ok { + m.body += string(char) + } + } + return nil +} + +var _ Unmarshaler = (*MyCharData)(nil) + +func (m *MyCharData) UnmarshalXMLAttr(attr Attr) error { + panic("must not call") +} + +type MyAttr struct { + attr string +} + +func (m *MyAttr) UnmarshalXMLAttr(attr Attr) error { + m.attr = attr.Value + return nil +} + +var _ UnmarshalerAttr = (*MyAttr)(nil) + +type MyStruct struct { + Data *MyCharData + Attr *MyAttr `xml:",attr"` + + Data2 MyCharData + Attr2 MyAttr `xml:",attr"` +} + +func TestUnmarshaler(t *testing.T) { + xml := ` + + hello world + howdy world + + ` + + var m MyStruct + if err := Unmarshal([]byte(xml), &m); err != nil { + t.Fatal(err) + } + + if m.Data == nil || m.Attr == nil || m.Data.body != "hello world" || m.Attr.attr != "attr1" || m.Data2.body != "howdy world" || m.Attr2.attr != "attr2" { + t.Errorf("m=%#+v\n", m) + } +} + +type Pea struct { + Cotelydon string +} + +type Pod struct { + Pea interface{} `xml:"Pea"` +} + +// https://golang.org/issue/6836 +func TestUnmarshalIntoInterface(t *testing.T) { + pod := new(Pod) + pod.Pea = new(Pea) + xml := `Green stuff` + err := Unmarshal([]byte(xml), pod) + if err != nil { + t.Fatalf("failed to unmarshal %q: %v", xml, err) + } + pea, ok := pod.Pea.(*Pea) + if !ok { + t.Fatalf("unmarshalled into wrong type: have %T want *Pea", pod.Pea) + } + have, want := pea.Cotelydon, "Green stuff" + if have != want { + t.Errorf("failed to unmarshal into interface, have %q want %q", have, want) + } +} diff --git a/api/vendor/golang.org/x/net/webdav/internal/xml/typeinfo.go b/api/vendor/golang.org/x/net/webdav/internal/xml/typeinfo.go new file mode 100644 index 0000000..fdde288 --- /dev/null +++ b/api/vendor/golang.org/x/net/webdav/internal/xml/typeinfo.go @@ -0,0 +1,371 @@ +// 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 xml + +import ( + "fmt" + "reflect" + "strings" + "sync" +) + +// typeInfo holds details for the xml representation of a type. +type typeInfo struct { + xmlname *fieldInfo + fields []fieldInfo +} + +// fieldInfo holds details for the xml representation of a single field. +type fieldInfo struct { + idx []int + name string + xmlns string + flags fieldFlags + parents []string +} + +type fieldFlags int + +const ( + fElement fieldFlags = 1 << iota + fAttr + fCharData + fInnerXml + fComment + fAny + + fOmitEmpty + + fMode = fElement | fAttr | fCharData | fInnerXml | fComment | fAny +) + +var tinfoMap = make(map[reflect.Type]*typeInfo) +var tinfoLock sync.RWMutex + +var nameType = reflect.TypeOf(Name{}) + +// getTypeInfo returns the typeInfo structure with details necessary +// for marshalling and unmarshalling typ. +func getTypeInfo(typ reflect.Type) (*typeInfo, error) { + tinfoLock.RLock() + tinfo, ok := tinfoMap[typ] + tinfoLock.RUnlock() + if ok { + return tinfo, nil + } + tinfo = &typeInfo{} + if typ.Kind() == reflect.Struct && typ != nameType { + n := typ.NumField() + for i := 0; i < n; i++ { + f := typ.Field(i) + if f.PkgPath != "" || f.Tag.Get("xml") == "-" { + continue // Private field + } + + // For embedded structs, embed its fields. + if f.Anonymous { + t := f.Type + if t.Kind() == reflect.Ptr { + t = t.Elem() + } + if t.Kind() == reflect.Struct { + inner, err := getTypeInfo(t) + if err != nil { + return nil, err + } + if tinfo.xmlname == nil { + tinfo.xmlname = inner.xmlname + } + for _, finfo := range inner.fields { + finfo.idx = append([]int{i}, finfo.idx...) + if err := addFieldInfo(typ, tinfo, &finfo); err != nil { + return nil, err + } + } + continue + } + } + + finfo, err := structFieldInfo(typ, &f) + if err != nil { + return nil, err + } + + if f.Name == "XMLName" { + tinfo.xmlname = finfo + continue + } + + // Add the field if it doesn't conflict with other fields. + if err := addFieldInfo(typ, tinfo, finfo); err != nil { + return nil, err + } + } + } + tinfoLock.Lock() + tinfoMap[typ] = tinfo + tinfoLock.Unlock() + return tinfo, nil +} + +// structFieldInfo builds and returns a fieldInfo for f. +func structFieldInfo(typ reflect.Type, f *reflect.StructField) (*fieldInfo, error) { + finfo := &fieldInfo{idx: f.Index} + + // Split the tag from the xml namespace if necessary. + tag := f.Tag.Get("xml") + if i := strings.Index(tag, " "); i >= 0 { + finfo.xmlns, tag = tag[:i], tag[i+1:] + } + + // Parse flags. + tokens := strings.Split(tag, ",") + if len(tokens) == 1 { + finfo.flags = fElement + } else { + tag = tokens[0] + for _, flag := range tokens[1:] { + switch flag { + case "attr": + finfo.flags |= fAttr + case "chardata": + finfo.flags |= fCharData + case "innerxml": + finfo.flags |= fInnerXml + case "comment": + finfo.flags |= fComment + case "any": + finfo.flags |= fAny + case "omitempty": + finfo.flags |= fOmitEmpty + } + } + + // Validate the flags used. + valid := true + switch mode := finfo.flags & fMode; mode { + case 0: + finfo.flags |= fElement + case fAttr, fCharData, fInnerXml, fComment, fAny: + if f.Name == "XMLName" || tag != "" && mode != fAttr { + valid = false + } + default: + // This will also catch multiple modes in a single field. + valid = false + } + if finfo.flags&fMode == fAny { + finfo.flags |= fElement + } + if finfo.flags&fOmitEmpty != 0 && finfo.flags&(fElement|fAttr) == 0 { + valid = false + } + if !valid { + return nil, fmt.Errorf("xml: invalid tag in field %s of type %s: %q", + f.Name, typ, f.Tag.Get("xml")) + } + } + + // Use of xmlns without a name is not allowed. + if finfo.xmlns != "" && tag == "" { + return nil, fmt.Errorf("xml: namespace without name in field %s of type %s: %q", + f.Name, typ, f.Tag.Get("xml")) + } + + if f.Name == "XMLName" { + // The XMLName field records the XML element name. Don't + // process it as usual because its name should default to + // empty rather than to the field name. + finfo.name = tag + return finfo, nil + } + + if tag == "" { + // If the name part of the tag is completely empty, get + // default from XMLName of underlying struct if feasible, + // or field name otherwise. + if xmlname := lookupXMLName(f.Type); xmlname != nil { + finfo.xmlns, finfo.name = xmlname.xmlns, xmlname.name + } else { + finfo.name = f.Name + } + return finfo, nil + } + + if finfo.xmlns == "" && finfo.flags&fAttr == 0 { + // If it's an element no namespace specified, get the default + // from the XMLName of enclosing struct if possible. + if xmlname := lookupXMLName(typ); xmlname != nil { + finfo.xmlns = xmlname.xmlns + } + } + + // Prepare field name and parents. + parents := strings.Split(tag, ">") + if parents[0] == "" { + parents[0] = f.Name + } + if parents[len(parents)-1] == "" { + return nil, fmt.Errorf("xml: trailing '>' in field %s of type %s", f.Name, typ) + } + finfo.name = parents[len(parents)-1] + if len(parents) > 1 { + if (finfo.flags & fElement) == 0 { + return nil, fmt.Errorf("xml: %s chain not valid with %s flag", tag, strings.Join(tokens[1:], ",")) + } + finfo.parents = parents[:len(parents)-1] + } + + // If the field type has an XMLName field, the names must match + // so that the behavior of both marshalling and unmarshalling + // is straightforward and unambiguous. + if finfo.flags&fElement != 0 { + ftyp := f.Type + xmlname := lookupXMLName(ftyp) + if xmlname != nil && xmlname.name != finfo.name { + return nil, fmt.Errorf("xml: name %q in tag of %s.%s conflicts with name %q in %s.XMLName", + finfo.name, typ, f.Name, xmlname.name, ftyp) + } + } + return finfo, nil +} + +// lookupXMLName returns the fieldInfo for typ's XMLName field +// in case it exists and has a valid xml field tag, otherwise +// it returns nil. +func lookupXMLName(typ reflect.Type) (xmlname *fieldInfo) { + for typ.Kind() == reflect.Ptr { + typ = typ.Elem() + } + if typ.Kind() != reflect.Struct { + return nil + } + for i, n := 0, typ.NumField(); i < n; i++ { + f := typ.Field(i) + if f.Name != "XMLName" { + continue + } + finfo, err := structFieldInfo(typ, &f) + if finfo.name != "" && err == nil { + return finfo + } + // Also consider errors as a non-existent field tag + // and let getTypeInfo itself report the error. + break + } + return nil +} + +func min(a, b int) int { + if a <= b { + return a + } + return b +} + +// addFieldInfo adds finfo to tinfo.fields if there are no +// conflicts, or if conflicts arise from previous fields that were +// obtained from deeper embedded structures than finfo. In the latter +// case, the conflicting entries are dropped. +// A conflict occurs when the path (parent + name) to a field is +// itself a prefix of another path, or when two paths match exactly. +// It is okay for field paths to share a common, shorter prefix. +func addFieldInfo(typ reflect.Type, tinfo *typeInfo, newf *fieldInfo) error { + var conflicts []int +Loop: + // First, figure all conflicts. Most working code will have none. + for i := range tinfo.fields { + oldf := &tinfo.fields[i] + if oldf.flags&fMode != newf.flags&fMode { + continue + } + if oldf.xmlns != "" && newf.xmlns != "" && oldf.xmlns != newf.xmlns { + continue + } + minl := min(len(newf.parents), len(oldf.parents)) + for p := 0; p < minl; p++ { + if oldf.parents[p] != newf.parents[p] { + continue Loop + } + } + if len(oldf.parents) > len(newf.parents) { + if oldf.parents[len(newf.parents)] == newf.name { + conflicts = append(conflicts, i) + } + } else if len(oldf.parents) < len(newf.parents) { + if newf.parents[len(oldf.parents)] == oldf.name { + conflicts = append(conflicts, i) + } + } else { + if newf.name == oldf.name { + conflicts = append(conflicts, i) + } + } + } + // Without conflicts, add the new field and return. + if conflicts == nil { + tinfo.fields = append(tinfo.fields, *newf) + return nil + } + + // If any conflict is shallower, ignore the new field. + // This matches the Go field resolution on embedding. + for _, i := range conflicts { + if len(tinfo.fields[i].idx) < len(newf.idx) { + return nil + } + } + + // Otherwise, if any of them is at the same depth level, it's an error. + for _, i := range conflicts { + oldf := &tinfo.fields[i] + if len(oldf.idx) == len(newf.idx) { + f1 := typ.FieldByIndex(oldf.idx) + f2 := typ.FieldByIndex(newf.idx) + return &TagPathError{typ, f1.Name, f1.Tag.Get("xml"), f2.Name, f2.Tag.Get("xml")} + } + } + + // Otherwise, the new field is shallower, and thus takes precedence, + // so drop the conflicting fields from tinfo and append the new one. + for c := len(conflicts) - 1; c >= 0; c-- { + i := conflicts[c] + copy(tinfo.fields[i:], tinfo.fields[i+1:]) + tinfo.fields = tinfo.fields[:len(tinfo.fields)-1] + } + tinfo.fields = append(tinfo.fields, *newf) + return nil +} + +// A TagPathError represents an error in the unmarshalling process +// caused by the use of field tags with conflicting paths. +type TagPathError struct { + Struct reflect.Type + Field1, Tag1 string + Field2, Tag2 string +} + +func (e *TagPathError) Error() string { + return fmt.Sprintf("%s field %q with tag %q conflicts with field %q with tag %q", e.Struct, e.Field1, e.Tag1, e.Field2, e.Tag2) +} + +// value returns v's field value corresponding to finfo. +// It's equivalent to v.FieldByIndex(finfo.idx), but initializes +// and dereferences pointers as necessary. +func (finfo *fieldInfo) value(v reflect.Value) reflect.Value { + for i, x := range finfo.idx { + if i > 0 { + t := v.Type() + if t.Kind() == reflect.Ptr && t.Elem().Kind() == reflect.Struct { + if v.IsNil() { + v.Set(reflect.New(v.Type().Elem())) + } + v = v.Elem() + } + } + v = v.Field(x) + } + return v +} diff --git a/api/vendor/golang.org/x/net/webdav/internal/xml/xml.go b/api/vendor/golang.org/x/net/webdav/internal/xml/xml.go new file mode 100644 index 0000000..5b79cbe --- /dev/null +++ b/api/vendor/golang.org/x/net/webdav/internal/xml/xml.go @@ -0,0 +1,1998 @@ +// 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 xml implements a simple XML 1.0 parser that +// understands XML name spaces. +package xml + +// References: +// Annotated XML spec: http://www.xml.com/axml/testaxml.htm +// XML name spaces: http://www.w3.org/TR/REC-xml-names/ + +// TODO(rsc): +// Test error handling. + +import ( + "bufio" + "bytes" + "errors" + "fmt" + "io" + "strconv" + "strings" + "unicode" + "unicode/utf8" +) + +// A SyntaxError represents a syntax error in the XML input stream. +type SyntaxError struct { + Msg string + Line int +} + +func (e *SyntaxError) Error() string { + return "XML syntax error on line " + strconv.Itoa(e.Line) + ": " + e.Msg +} + +// A Name represents an XML name (Local) annotated with a name space +// identifier (Space). In tokens returned by Decoder.Token, the Space +// identifier is given as a canonical URL, not the short prefix used in +// the document being parsed. +// +// As a special case, XML namespace declarations will use the literal +// string "xmlns" for the Space field instead of the fully resolved URL. +// See Encoder.EncodeToken for more information on namespace encoding +// behaviour. +type Name struct { + Space, Local string +} + +// isNamespace reports whether the name is a namespace-defining name. +func (name Name) isNamespace() bool { + return name.Local == "xmlns" || name.Space == "xmlns" +} + +// An Attr represents an attribute in an XML element (Name=Value). +type Attr struct { + Name Name + Value string +} + +// A Token is an interface holding one of the token types: +// StartElement, EndElement, CharData, Comment, ProcInst, or Directive. +type Token interface{} + +// A StartElement represents an XML start element. +type StartElement struct { + Name Name + Attr []Attr +} + +func (e StartElement) Copy() StartElement { + attrs := make([]Attr, len(e.Attr)) + copy(attrs, e.Attr) + e.Attr = attrs + return e +} + +// End returns the corresponding XML end element. +func (e StartElement) End() EndElement { + return EndElement{e.Name} +} + +// setDefaultNamespace sets the namespace of the element +// as the default for all elements contained within it. +func (e *StartElement) setDefaultNamespace() { + if e.Name.Space == "" { + // If there's no namespace on the element, don't + // set the default. Strictly speaking this might be wrong, as + // we can't tell if the element had no namespace set + // or was just using the default namespace. + return + } + // Don't add a default name space if there's already one set. + for _, attr := range e.Attr { + if attr.Name.Space == "" && attr.Name.Local == "xmlns" { + return + } + } + e.Attr = append(e.Attr, Attr{ + Name: Name{ + Local: "xmlns", + }, + Value: e.Name.Space, + }) +} + +// An EndElement represents an XML end element. +type EndElement struct { + Name Name +} + +// A CharData represents XML character data (raw text), +// in which XML escape sequences have been replaced by +// the characters they represent. +type CharData []byte + +func makeCopy(b []byte) []byte { + b1 := make([]byte, len(b)) + copy(b1, b) + return b1 +} + +func (c CharData) Copy() CharData { return CharData(makeCopy(c)) } + +// A Comment represents an XML comment of the form . +// The bytes do not include the comment markers. +type Comment []byte + +func (c Comment) Copy() Comment { return Comment(makeCopy(c)) } + +// A ProcInst represents an XML processing instruction of the form +type ProcInst struct { + Target string + Inst []byte +} + +func (p ProcInst) Copy() ProcInst { + p.Inst = makeCopy(p.Inst) + return p +} + +// A Directive represents an XML directive of the form . +// The bytes do not include the markers. +type Directive []byte + +func (d Directive) Copy() Directive { return Directive(makeCopy(d)) } + +// CopyToken returns a copy of a Token. +func CopyToken(t Token) Token { + switch v := t.(type) { + case CharData: + return v.Copy() + case Comment: + return v.Copy() + case Directive: + return v.Copy() + case ProcInst: + return v.Copy() + case StartElement: + return v.Copy() + } + return t +} + +// A Decoder represents an XML parser reading a particular input stream. +// The parser assumes that its input is encoded in UTF-8. +type Decoder struct { + // Strict defaults to true, enforcing the requirements + // of the XML specification. + // If set to false, the parser allows input containing common + // mistakes: + // * If an element is missing an end tag, the parser invents + // end tags as necessary to keep the return values from Token + // properly balanced. + // * In attribute values and character data, unknown or malformed + // character entities (sequences beginning with &) are left alone. + // + // Setting: + // + // d.Strict = false; + // d.AutoClose = HTMLAutoClose; + // d.Entity = HTMLEntity + // + // creates a parser that can handle typical HTML. + // + // Strict mode does not enforce the requirements of the XML name spaces TR. + // In particular it does not reject name space tags using undefined prefixes. + // Such tags are recorded with the unknown prefix as the name space URL. + Strict bool + + // When Strict == false, AutoClose indicates a set of elements to + // consider closed immediately after they are opened, regardless + // of whether an end element is present. + AutoClose []string + + // Entity can be used to map non-standard entity names to string replacements. + // The parser behaves as if these standard mappings are present in the map, + // regardless of the actual map content: + // + // "lt": "<", + // "gt": ">", + // "amp": "&", + // "apos": "'", + // "quot": `"`, + Entity map[string]string + + // CharsetReader, if non-nil, defines a function to generate + // charset-conversion readers, converting from the provided + // non-UTF-8 charset into UTF-8. If CharsetReader is nil or + // returns an error, parsing stops with an error. One of the + // the CharsetReader's result values must be non-nil. + CharsetReader func(charset string, input io.Reader) (io.Reader, error) + + // DefaultSpace sets the default name space used for unadorned tags, + // as if the entire XML stream were wrapped in an element containing + // the attribute xmlns="DefaultSpace". + DefaultSpace string + + r io.ByteReader + buf bytes.Buffer + saved *bytes.Buffer + stk *stack + free *stack + needClose bool + toClose Name + nextToken Token + nextByte int + ns map[string]string + err error + line int + offset int64 + unmarshalDepth int +} + +// NewDecoder creates a new XML parser reading from r. +// If r does not implement io.ByteReader, NewDecoder will +// do its own buffering. +func NewDecoder(r io.Reader) *Decoder { + d := &Decoder{ + ns: make(map[string]string), + nextByte: -1, + line: 1, + Strict: true, + } + d.switchToReader(r) + return d +} + +// Token returns the next XML token in the input stream. +// At the end of the input stream, Token returns nil, io.EOF. +// +// Slices of bytes in the returned token data refer to the +// parser's internal buffer and remain valid only until the next +// call to Token. To acquire a copy of the bytes, call CopyToken +// or the token's Copy method. +// +// Token expands self-closing elements such as
    +// into separate start and end elements returned by successive calls. +// +// Token guarantees that the StartElement and EndElement +// tokens it returns are properly nested and matched: +// if Token encounters an unexpected end element, +// it will return an error. +// +// Token implements XML name spaces as described by +// http://www.w3.org/TR/REC-xml-names/. Each of the +// Name structures contained in the Token has the Space +// set to the URL identifying its name space when known. +// If Token encounters an unrecognized name space prefix, +// it uses the prefix as the Space rather than report an error. +func (d *Decoder) Token() (t Token, err error) { + if d.stk != nil && d.stk.kind == stkEOF { + err = io.EOF + return + } + if d.nextToken != nil { + t = d.nextToken + d.nextToken = nil + } else if t, err = d.rawToken(); err != nil { + return + } + + if !d.Strict { + if t1, ok := d.autoClose(t); ok { + d.nextToken = t + t = t1 + } + } + switch t1 := t.(type) { + case StartElement: + // In XML name spaces, the translations listed in the + // attributes apply to the element name and + // to the other attribute names, so process + // the translations first. + for _, a := range t1.Attr { + if a.Name.Space == "xmlns" { + v, ok := d.ns[a.Name.Local] + d.pushNs(a.Name.Local, v, ok) + d.ns[a.Name.Local] = a.Value + } + if a.Name.Space == "" && a.Name.Local == "xmlns" { + // Default space for untagged names + v, ok := d.ns[""] + d.pushNs("", v, ok) + d.ns[""] = a.Value + } + } + + d.translate(&t1.Name, true) + for i := range t1.Attr { + d.translate(&t1.Attr[i].Name, false) + } + d.pushElement(t1.Name) + t = t1 + + case EndElement: + d.translate(&t1.Name, true) + if !d.popElement(&t1) { + return nil, d.err + } + t = t1 + } + return +} + +const xmlURL = "http://www.w3.org/XML/1998/namespace" + +// Apply name space translation to name n. +// The default name space (for Space=="") +// applies only to element names, not to attribute names. +func (d *Decoder) translate(n *Name, isElementName bool) { + switch { + case n.Space == "xmlns": + return + case n.Space == "" && !isElementName: + return + case n.Space == "xml": + n.Space = xmlURL + case n.Space == "" && n.Local == "xmlns": + return + } + if v, ok := d.ns[n.Space]; ok { + n.Space = v + } else if n.Space == "" { + n.Space = d.DefaultSpace + } +} + +func (d *Decoder) switchToReader(r io.Reader) { + // Get efficient byte at a time reader. + // Assume that if reader has its own + // ReadByte, it's efficient enough. + // Otherwise, use bufio. + if rb, ok := r.(io.ByteReader); ok { + d.r = rb + } else { + d.r = bufio.NewReader(r) + } +} + +// Parsing state - stack holds old name space translations +// and the current set of open elements. The translations to pop when +// ending a given tag are *below* it on the stack, which is +// more work but forced on us by XML. +type stack struct { + next *stack + kind int + name Name + ok bool +} + +const ( + stkStart = iota + stkNs + stkEOF +) + +func (d *Decoder) push(kind int) *stack { + s := d.free + if s != nil { + d.free = s.next + } else { + s = new(stack) + } + s.next = d.stk + s.kind = kind + d.stk = s + return s +} + +func (d *Decoder) pop() *stack { + s := d.stk + if s != nil { + d.stk = s.next + s.next = d.free + d.free = s + } + return s +} + +// Record that after the current element is finished +// (that element is already pushed on the stack) +// Token should return EOF until popEOF is called. +func (d *Decoder) pushEOF() { + // Walk down stack to find Start. + // It might not be the top, because there might be stkNs + // entries above it. + start := d.stk + for start.kind != stkStart { + start = start.next + } + // The stkNs entries below a start are associated with that + // element too; skip over them. + for start.next != nil && start.next.kind == stkNs { + start = start.next + } + s := d.free + if s != nil { + d.free = s.next + } else { + s = new(stack) + } + s.kind = stkEOF + s.next = start.next + start.next = s +} + +// Undo a pushEOF. +// The element must have been finished, so the EOF should be at the top of the stack. +func (d *Decoder) popEOF() bool { + if d.stk == nil || d.stk.kind != stkEOF { + return false + } + d.pop() + return true +} + +// Record that we are starting an element with the given name. +func (d *Decoder) pushElement(name Name) { + s := d.push(stkStart) + s.name = name +} + +// Record that we are changing the value of ns[local]. +// The old value is url, ok. +func (d *Decoder) pushNs(local string, url string, ok bool) { + s := d.push(stkNs) + s.name.Local = local + s.name.Space = url + s.ok = ok +} + +// Creates a SyntaxError with the current line number. +func (d *Decoder) syntaxError(msg string) error { + return &SyntaxError{Msg: msg, Line: d.line} +} + +// Record that we are ending an element with the given name. +// The name must match the record at the top of the stack, +// which must be a pushElement record. +// After popping the element, apply any undo records from +// the stack to restore the name translations that existed +// before we saw this element. +func (d *Decoder) popElement(t *EndElement) bool { + s := d.pop() + name := t.Name + switch { + case s == nil || s.kind != stkStart: + d.err = d.syntaxError("unexpected end element ") + return false + case s.name.Local != name.Local: + if !d.Strict { + d.needClose = true + d.toClose = t.Name + t.Name = s.name + return true + } + d.err = d.syntaxError("element <" + s.name.Local + "> closed by ") + return false + case s.name.Space != name.Space: + d.err = d.syntaxError("element <" + s.name.Local + "> in space " + s.name.Space + + "closed by in space " + name.Space) + return false + } + + // Pop stack until a Start or EOF is on the top, undoing the + // translations that were associated with the element we just closed. + for d.stk != nil && d.stk.kind != stkStart && d.stk.kind != stkEOF { + s := d.pop() + if s.ok { + d.ns[s.name.Local] = s.name.Space + } else { + delete(d.ns, s.name.Local) + } + } + + return true +} + +// If the top element on the stack is autoclosing and +// t is not the end tag, invent the end tag. +func (d *Decoder) autoClose(t Token) (Token, bool) { + if d.stk == nil || d.stk.kind != stkStart { + return nil, false + } + name := strings.ToLower(d.stk.name.Local) + for _, s := range d.AutoClose { + if strings.ToLower(s) == name { + // This one should be auto closed if t doesn't close it. + et, ok := t.(EndElement) + if !ok || et.Name.Local != name { + return EndElement{d.stk.name}, true + } + break + } + } + return nil, false +} + +var errRawToken = errors.New("xml: cannot use RawToken from UnmarshalXML method") + +// RawToken is like Token but does not verify that +// start and end elements match and does not translate +// name space prefixes to their corresponding URLs. +func (d *Decoder) RawToken() (Token, error) { + if d.unmarshalDepth > 0 { + return nil, errRawToken + } + return d.rawToken() +} + +func (d *Decoder) rawToken() (Token, error) { + if d.err != nil { + return nil, d.err + } + if d.needClose { + // The last element we read was self-closing and + // we returned just the StartElement half. + // Return the EndElement half now. + d.needClose = false + return EndElement{d.toClose}, nil + } + + b, ok := d.getc() + if !ok { + return nil, d.err + } + + if b != '<' { + // Text section. + d.ungetc(b) + data := d.text(-1, false) + if data == nil { + return nil, d.err + } + return CharData(data), nil + } + + if b, ok = d.mustgetc(); !ok { + return nil, d.err + } + switch b { + case '/': + // ' { + d.err = d.syntaxError("invalid characters between ") + return nil, d.err + } + return EndElement{name}, nil + + case '?': + // ' { + break + } + b0 = b + } + data := d.buf.Bytes() + data = data[0 : len(data)-2] // chop ?> + + if target == "xml" { + content := string(data) + ver := procInst("version", content) + if ver != "" && ver != "1.0" { + d.err = fmt.Errorf("xml: unsupported version %q; only version 1.0 is supported", ver) + return nil, d.err + } + enc := procInst("encoding", content) + if enc != "" && enc != "utf-8" && enc != "UTF-8" { + if d.CharsetReader == nil { + d.err = fmt.Errorf("xml: encoding %q declared but Decoder.CharsetReader is nil", enc) + return nil, d.err + } + newr, err := d.CharsetReader(enc, d.r.(io.Reader)) + if err != nil { + d.err = fmt.Errorf("xml: opening charset %q: %v", enc, err) + return nil, d.err + } + if newr == nil { + panic("CharsetReader returned a nil Reader for charset " + enc) + } + d.switchToReader(newr) + } + } + return ProcInst{target, data}, nil + + case '!': + // ' { + break + } + b0, b1 = b1, b + } + data := d.buf.Bytes() + data = data[0 : len(data)-3] // chop --> + return Comment(data), nil + + case '[': // . + data := d.text(-1, true) + if data == nil { + return nil, d.err + } + return CharData(data), nil + } + + // Probably a directive: , , etc. + // We don't care, but accumulate for caller. Quoted angle + // brackets do not count for nesting. + d.buf.Reset() + d.buf.WriteByte(b) + inquote := uint8(0) + depth := 0 + for { + if b, ok = d.mustgetc(); !ok { + return nil, d.err + } + if inquote == 0 && b == '>' && depth == 0 { + break + } + HandleB: + d.buf.WriteByte(b) + switch { + case b == inquote: + inquote = 0 + + case inquote != 0: + // in quotes, no special action + + case b == '\'' || b == '"': + inquote = b + + case b == '>' && inquote == 0: + depth-- + + case b == '<' && inquote == 0: + // Look for ` + +var testEntity = map[string]string{"何": "What", "is-it": "is it?"} + +var rawTokens = []Token{ + CharData("\n"), + ProcInst{"xml", []byte(`version="1.0" encoding="UTF-8"`)}, + CharData("\n"), + Directive(`DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"`), + CharData("\n"), + StartElement{Name{"", "body"}, []Attr{{Name{"xmlns", "foo"}, "ns1"}, {Name{"", "xmlns"}, "ns2"}, {Name{"xmlns", "tag"}, "ns3"}}}, + CharData("\n "), + StartElement{Name{"", "hello"}, []Attr{{Name{"", "lang"}, "en"}}}, + CharData("World <>'\" 白鵬翔"), + EndElement{Name{"", "hello"}}, + CharData("\n "), + StartElement{Name{"", "query"}, []Attr{}}, + CharData("What is it?"), + EndElement{Name{"", "query"}}, + CharData("\n "), + StartElement{Name{"", "goodbye"}, []Attr{}}, + EndElement{Name{"", "goodbye"}}, + CharData("\n "), + StartElement{Name{"", "outer"}, []Attr{{Name{"foo", "attr"}, "value"}, {Name{"xmlns", "tag"}, "ns4"}}}, + CharData("\n "), + StartElement{Name{"", "inner"}, []Attr{}}, + EndElement{Name{"", "inner"}}, + CharData("\n "), + EndElement{Name{"", "outer"}}, + CharData("\n "), + StartElement{Name{"tag", "name"}, []Attr{}}, + CharData("\n "), + CharData("Some text here."), + CharData("\n "), + EndElement{Name{"tag", "name"}}, + CharData("\n"), + EndElement{Name{"", "body"}}, + Comment(" missing final newline "), +} + +var cookedTokens = []Token{ + CharData("\n"), + ProcInst{"xml", []byte(`version="1.0" encoding="UTF-8"`)}, + CharData("\n"), + Directive(`DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"`), + CharData("\n"), + StartElement{Name{"ns2", "body"}, []Attr{{Name{"xmlns", "foo"}, "ns1"}, {Name{"", "xmlns"}, "ns2"}, {Name{"xmlns", "tag"}, "ns3"}}}, + CharData("\n "), + StartElement{Name{"ns2", "hello"}, []Attr{{Name{"", "lang"}, "en"}}}, + CharData("World <>'\" 白鵬翔"), + EndElement{Name{"ns2", "hello"}}, + CharData("\n "), + StartElement{Name{"ns2", "query"}, []Attr{}}, + CharData("What is it?"), + EndElement{Name{"ns2", "query"}}, + CharData("\n "), + StartElement{Name{"ns2", "goodbye"}, []Attr{}}, + EndElement{Name{"ns2", "goodbye"}}, + CharData("\n "), + StartElement{Name{"ns2", "outer"}, []Attr{{Name{"ns1", "attr"}, "value"}, {Name{"xmlns", "tag"}, "ns4"}}}, + CharData("\n "), + StartElement{Name{"ns2", "inner"}, []Attr{}}, + EndElement{Name{"ns2", "inner"}}, + CharData("\n "), + EndElement{Name{"ns2", "outer"}}, + CharData("\n "), + StartElement{Name{"ns3", "name"}, []Attr{}}, + CharData("\n "), + CharData("Some text here."), + CharData("\n "), + EndElement{Name{"ns3", "name"}}, + CharData("\n"), + EndElement{Name{"ns2", "body"}}, + Comment(" missing final newline "), +} + +const testInputAltEncoding = ` + +VALUE` + +var rawTokensAltEncoding = []Token{ + CharData("\n"), + ProcInst{"xml", []byte(`version="1.0" encoding="x-testing-uppercase"`)}, + CharData("\n"), + StartElement{Name{"", "tag"}, []Attr{}}, + CharData("value"), + EndElement{Name{"", "tag"}}, +} + +var xmlInput = []string{ + // unexpected EOF cases + "<", + "", + "", + "", + // "", // let the Token() caller handle + "", + "", + "", + "", + " c;", + "", + "", + "", + // "", // let the Token() caller handle + "", + "", + "cdata]]>", +} + +func TestRawToken(t *testing.T) { + d := NewDecoder(strings.NewReader(testInput)) + d.Entity = testEntity + testRawToken(t, d, testInput, rawTokens) +} + +const nonStrictInput = ` +non&entity +&unknown;entity +{ +&#zzz; +&なまえ3; +<-gt; +&; +&0a; +` + +var nonStringEntity = map[string]string{"": "oops!", "0a": "oops!"} + +var nonStrictTokens = []Token{ + CharData("\n"), + StartElement{Name{"", "tag"}, []Attr{}}, + CharData("non&entity"), + EndElement{Name{"", "tag"}}, + CharData("\n"), + StartElement{Name{"", "tag"}, []Attr{}}, + CharData("&unknown;entity"), + EndElement{Name{"", "tag"}}, + CharData("\n"), + StartElement{Name{"", "tag"}, []Attr{}}, + CharData("{"), + EndElement{Name{"", "tag"}}, + CharData("\n"), + StartElement{Name{"", "tag"}, []Attr{}}, + CharData("&#zzz;"), + EndElement{Name{"", "tag"}}, + CharData("\n"), + StartElement{Name{"", "tag"}, []Attr{}}, + CharData("&なまえ3;"), + EndElement{Name{"", "tag"}}, + CharData("\n"), + StartElement{Name{"", "tag"}, []Attr{}}, + CharData("<-gt;"), + EndElement{Name{"", "tag"}}, + CharData("\n"), + StartElement{Name{"", "tag"}, []Attr{}}, + CharData("&;"), + EndElement{Name{"", "tag"}}, + CharData("\n"), + StartElement{Name{"", "tag"}, []Attr{}}, + CharData("&0a;"), + EndElement{Name{"", "tag"}}, + CharData("\n"), +} + +func TestNonStrictRawToken(t *testing.T) { + d := NewDecoder(strings.NewReader(nonStrictInput)) + d.Strict = false + testRawToken(t, d, nonStrictInput, nonStrictTokens) +} + +type downCaser struct { + t *testing.T + r io.ByteReader +} + +func (d *downCaser) ReadByte() (c byte, err error) { + c, err = d.r.ReadByte() + if c >= 'A' && c <= 'Z' { + c += 'a' - 'A' + } + return +} + +func (d *downCaser) Read(p []byte) (int, error) { + d.t.Fatalf("unexpected Read call on downCaser reader") + panic("unreachable") +} + +func TestRawTokenAltEncoding(t *testing.T) { + d := NewDecoder(strings.NewReader(testInputAltEncoding)) + d.CharsetReader = func(charset string, input io.Reader) (io.Reader, error) { + if charset != "x-testing-uppercase" { + t.Fatalf("unexpected charset %q", charset) + } + return &downCaser{t, input.(io.ByteReader)}, nil + } + testRawToken(t, d, testInputAltEncoding, rawTokensAltEncoding) +} + +func TestRawTokenAltEncodingNoConverter(t *testing.T) { + d := NewDecoder(strings.NewReader(testInputAltEncoding)) + token, err := d.RawToken() + if token == nil { + t.Fatalf("expected a token on first RawToken call") + } + if err != nil { + t.Fatal(err) + } + token, err = d.RawToken() + if token != nil { + t.Errorf("expected a nil token; got %#v", token) + } + if err == nil { + t.Fatalf("expected an error on second RawToken call") + } + const encoding = "x-testing-uppercase" + if !strings.Contains(err.Error(), encoding) { + t.Errorf("expected error to contain %q; got error: %v", + encoding, err) + } +} + +func testRawToken(t *testing.T, d *Decoder, raw string, rawTokens []Token) { + lastEnd := int64(0) + for i, want := range rawTokens { + start := d.InputOffset() + have, err := d.RawToken() + end := d.InputOffset() + if err != nil { + t.Fatalf("token %d: unexpected error: %s", i, err) + } + if !reflect.DeepEqual(have, want) { + var shave, swant string + if _, ok := have.(CharData); ok { + shave = fmt.Sprintf("CharData(%q)", have) + } else { + shave = fmt.Sprintf("%#v", have) + } + if _, ok := want.(CharData); ok { + swant = fmt.Sprintf("CharData(%q)", want) + } else { + swant = fmt.Sprintf("%#v", want) + } + t.Errorf("token %d = %s, want %s", i, shave, swant) + } + + // Check that InputOffset returned actual token. + switch { + case start < lastEnd: + t.Errorf("token %d: position [%d,%d) for %T is before previous token", i, start, end, have) + case start >= end: + // Special case: EndElement can be synthesized. + if start == end && end == lastEnd { + break + } + t.Errorf("token %d: position [%d,%d) for %T is empty", i, start, end, have) + case end > int64(len(raw)): + t.Errorf("token %d: position [%d,%d) for %T extends beyond input", i, start, end, have) + default: + text := raw[start:end] + if strings.ContainsAny(text, "<>") && (!strings.HasPrefix(text, "<") || !strings.HasSuffix(text, ">")) { + t.Errorf("token %d: misaligned raw token %#q for %T", i, text, have) + } + } + lastEnd = end + } +} + +// Ensure that directives (specifically !DOCTYPE) include the complete +// text of any nested directives, noting that < and > do not change +// nesting depth if they are in single or double quotes. + +var nestedDirectivesInput = ` +]> +">]> +]> +'>]> +]> +'>]> +]> +` + +var nestedDirectivesTokens = []Token{ + CharData("\n"), + Directive(`DOCTYPE []`), + CharData("\n"), + Directive(`DOCTYPE [">]`), + CharData("\n"), + Directive(`DOCTYPE []`), + CharData("\n"), + Directive(`DOCTYPE ['>]`), + CharData("\n"), + Directive(`DOCTYPE []`), + CharData("\n"), + Directive(`DOCTYPE ['>]`), + CharData("\n"), + Directive(`DOCTYPE []`), + CharData("\n"), +} + +func TestNestedDirectives(t *testing.T) { + d := NewDecoder(strings.NewReader(nestedDirectivesInput)) + + for i, want := range nestedDirectivesTokens { + have, err := d.Token() + if err != nil { + t.Fatalf("token %d: unexpected error: %s", i, err) + } + if !reflect.DeepEqual(have, want) { + t.Errorf("token %d = %#v want %#v", i, have, want) + } + } +} + +func TestToken(t *testing.T) { + d := NewDecoder(strings.NewReader(testInput)) + d.Entity = testEntity + + for i, want := range cookedTokens { + have, err := d.Token() + if err != nil { + t.Fatalf("token %d: unexpected error: %s", i, err) + } + if !reflect.DeepEqual(have, want) { + t.Errorf("token %d = %#v want %#v", i, have, want) + } + } +} + +func TestSyntax(t *testing.T) { + for i := range xmlInput { + d := NewDecoder(strings.NewReader(xmlInput[i])) + var err error + for _, err = d.Token(); err == nil; _, err = d.Token() { + } + if _, ok := err.(*SyntaxError); !ok { + t.Fatalf(`xmlInput "%s": expected SyntaxError not received`, xmlInput[i]) + } + } +} + +type allScalars struct { + True1 bool + True2 bool + False1 bool + False2 bool + Int int + Int8 int8 + Int16 int16 + Int32 int32 + Int64 int64 + Uint int + Uint8 uint8 + Uint16 uint16 + Uint32 uint32 + Uint64 uint64 + Uintptr uintptr + Float32 float32 + Float64 float64 + String string + PtrString *string +} + +var all = allScalars{ + True1: true, + True2: true, + False1: false, + False2: false, + Int: 1, + Int8: -2, + Int16: 3, + Int32: -4, + Int64: 5, + Uint: 6, + Uint8: 7, + Uint16: 8, + Uint32: 9, + Uint64: 10, + Uintptr: 11, + Float32: 13.0, + Float64: 14.0, + String: "15", + PtrString: &sixteen, +} + +var sixteen = "16" + +const testScalarsInput = ` + true + 1 + false + 0 + 1 + -2 + 3 + -4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12.0 + 13.0 + 14.0 + 15 + 16 +` + +func TestAllScalars(t *testing.T) { + var a allScalars + err := Unmarshal([]byte(testScalarsInput), &a) + + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(a, all) { + t.Errorf("have %+v want %+v", a, all) + } +} + +type item struct { + Field_a string +} + +func TestIssue569(t *testing.T) { + data := `abcd` + var i item + err := Unmarshal([]byte(data), &i) + + if err != nil || i.Field_a != "abcd" { + t.Fatal("Expecting abcd") + } +} + +func TestUnquotedAttrs(t *testing.T) { + data := "" + d := NewDecoder(strings.NewReader(data)) + d.Strict = false + token, err := d.Token() + if _, ok := err.(*SyntaxError); ok { + t.Errorf("Unexpected error: %v", err) + } + if token.(StartElement).Name.Local != "tag" { + t.Errorf("Unexpected tag name: %v", token.(StartElement).Name.Local) + } + attr := token.(StartElement).Attr[0] + if attr.Value != "azAZ09:-_" { + t.Errorf("Unexpected attribute value: %v", attr.Value) + } + if attr.Name.Local != "attr" { + t.Errorf("Unexpected attribute name: %v", attr.Name.Local) + } +} + +func TestValuelessAttrs(t *testing.T) { + tests := [][3]string{ + {"

    ", "p", "nowrap"}, + {"

    ", "p", "nowrap"}, + {"", "input", "checked"}, + {"", "input", "checked"}, + } + for _, test := range tests { + d := NewDecoder(strings.NewReader(test[0])) + d.Strict = false + token, err := d.Token() + if _, ok := err.(*SyntaxError); ok { + t.Errorf("Unexpected error: %v", err) + } + if token.(StartElement).Name.Local != test[1] { + t.Errorf("Unexpected tag name: %v", token.(StartElement).Name.Local) + } + attr := token.(StartElement).Attr[0] + if attr.Value != test[2] { + t.Errorf("Unexpected attribute value: %v", attr.Value) + } + if attr.Name.Local != test[2] { + t.Errorf("Unexpected attribute name: %v", attr.Name.Local) + } + } +} + +func TestCopyTokenCharData(t *testing.T) { + data := []byte("same data") + var tok1 Token = CharData(data) + tok2 := CopyToken(tok1) + if !reflect.DeepEqual(tok1, tok2) { + t.Error("CopyToken(CharData) != CharData") + } + data[1] = 'o' + if reflect.DeepEqual(tok1, tok2) { + t.Error("CopyToken(CharData) uses same buffer.") + } +} + +func TestCopyTokenStartElement(t *testing.T) { + elt := StartElement{Name{"", "hello"}, []Attr{{Name{"", "lang"}, "en"}}} + var tok1 Token = elt + tok2 := CopyToken(tok1) + if tok1.(StartElement).Attr[0].Value != "en" { + t.Error("CopyToken overwrote Attr[0]") + } + if !reflect.DeepEqual(tok1, tok2) { + t.Error("CopyToken(StartElement) != StartElement") + } + tok1.(StartElement).Attr[0] = Attr{Name{"", "lang"}, "de"} + if reflect.DeepEqual(tok1, tok2) { + t.Error("CopyToken(CharData) uses same buffer.") + } +} + +func TestSyntaxErrorLineNum(t *testing.T) { + testInput := "

    Foo

    \n\n

    Bar\n" + d := NewDecoder(strings.NewReader(testInput)) + var err error + for _, err = d.Token(); err == nil; _, err = d.Token() { + } + synerr, ok := err.(*SyntaxError) + if !ok { + t.Error("Expected SyntaxError.") + } + if synerr.Line != 3 { + t.Error("SyntaxError didn't have correct line number.") + } +} + +func TestTrailingRawToken(t *testing.T) { + input := ` ` + d := NewDecoder(strings.NewReader(input)) + var err error + for _, err = d.RawToken(); err == nil; _, err = d.RawToken() { + } + if err != io.EOF { + t.Fatalf("d.RawToken() = _, %v, want _, io.EOF", err) + } +} + +func TestTrailingToken(t *testing.T) { + input := ` ` + d := NewDecoder(strings.NewReader(input)) + var err error + for _, err = d.Token(); err == nil; _, err = d.Token() { + } + if err != io.EOF { + t.Fatalf("d.Token() = _, %v, want _, io.EOF", err) + } +} + +func TestEntityInsideCDATA(t *testing.T) { + input := `` + d := NewDecoder(strings.NewReader(input)) + var err error + for _, err = d.Token(); err == nil; _, err = d.Token() { + } + if err != io.EOF { + t.Fatalf("d.Token() = _, %v, want _, io.EOF", err) + } +} + +var characterTests = []struct { + in string + err string +}{ + {"\x12", "illegal character code U+0012"}, + {"\x0b", "illegal character code U+000B"}, + {"\xef\xbf\xbe", "illegal character code U+FFFE"}, + {"\r\n\x07", "illegal character code U+0007"}, + {"what's up", "expected attribute name in element"}, + {"&abc\x01;", "invalid character entity &abc (no semicolon)"}, + {"&\x01;", "invalid character entity & (no semicolon)"}, + {"&\xef\xbf\xbe;", "invalid character entity &\uFFFE;"}, + {"&hello;", "invalid character entity &hello;"}, +} + +func TestDisallowedCharacters(t *testing.T) { + + for i, tt := range characterTests { + d := NewDecoder(strings.NewReader(tt.in)) + var err error + + for err == nil { + _, err = d.Token() + } + synerr, ok := err.(*SyntaxError) + if !ok { + t.Fatalf("input %d d.Token() = _, %v, want _, *SyntaxError", i, err) + } + if synerr.Msg != tt.err { + t.Fatalf("input %d synerr.Msg wrong: want %q, got %q", i, tt.err, synerr.Msg) + } + } +} + +type procInstEncodingTest struct { + expect, got string +} + +var procInstTests = []struct { + input string + expect [2]string +}{ + {`version="1.0" encoding="utf-8"`, [2]string{"1.0", "utf-8"}}, + {`version="1.0" encoding='utf-8'`, [2]string{"1.0", "utf-8"}}, + {`version="1.0" encoding='utf-8' `, [2]string{"1.0", "utf-8"}}, + {`version="1.0" encoding=utf-8`, [2]string{"1.0", ""}}, + {`encoding="FOO" `, [2]string{"", "FOO"}}, +} + +func TestProcInstEncoding(t *testing.T) { + for _, test := range procInstTests { + if got := procInst("version", test.input); got != test.expect[0] { + t.Errorf("procInst(version, %q) = %q; want %q", test.input, got, test.expect[0]) + } + if got := procInst("encoding", test.input); got != test.expect[1] { + t.Errorf("procInst(encoding, %q) = %q; want %q", test.input, got, test.expect[1]) + } + } +} + +// Ensure that directives with comments include the complete +// text of any nested directives. + +var directivesWithCommentsInput = ` +]> +]> + --> --> []> +` + +var directivesWithCommentsTokens = []Token{ + CharData("\n"), + Directive(`DOCTYPE []`), + CharData("\n"), + Directive(`DOCTYPE []`), + CharData("\n"), + Directive(`DOCTYPE []`), + CharData("\n"), +} + +func TestDirectivesWithComments(t *testing.T) { + d := NewDecoder(strings.NewReader(directivesWithCommentsInput)) + + for i, want := range directivesWithCommentsTokens { + have, err := d.Token() + if err != nil { + t.Fatalf("token %d: unexpected error: %s", i, err) + } + if !reflect.DeepEqual(have, want) { + t.Errorf("token %d = %#v want %#v", i, have, want) + } + } +} + +// Writer whose Write method always returns an error. +type errWriter struct{} + +func (errWriter) Write(p []byte) (n int, err error) { return 0, fmt.Errorf("unwritable") } + +func TestEscapeTextIOErrors(t *testing.T) { + expectErr := "unwritable" + err := EscapeText(errWriter{}, []byte{'A'}) + + if err == nil || err.Error() != expectErr { + t.Errorf("have %v, want %v", err, expectErr) + } +} + +func TestEscapeTextInvalidChar(t *testing.T) { + input := []byte("A \x00 terminated string.") + expected := "A \uFFFD terminated string." + + buff := new(bytes.Buffer) + if err := EscapeText(buff, input); err != nil { + t.Fatalf("have %v, want nil", err) + } + text := buff.String() + + if text != expected { + t.Errorf("have %v, want %v", text, expected) + } +} + +func TestIssue5880(t *testing.T) { + type T []byte + data, err := Marshal(T{192, 168, 0, 1}) + if err != nil { + t.Errorf("Marshal error: %v", err) + } + if !utf8.Valid(data) { + t.Errorf("Marshal generated invalid UTF-8: %x", data) + } +} diff --git a/api/vendor/golang.org/x/net/webdav/litmus_test_server.go b/api/vendor/golang.org/x/net/webdav/litmus_test_server.go new file mode 100644 index 0000000..514db5d --- /dev/null +++ b/api/vendor/golang.org/x/net/webdav/litmus_test_server.go @@ -0,0 +1,94 @@ +// Copyright 2015 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 ignore + +/* +This program is a server for the WebDAV 'litmus' compliance test at +http://www.webdav.org/neon/litmus/ +To run the test: + +go run litmus_test_server.go + +and separately, from the downloaded litmus-xxx directory: + +make URL=http://localhost:9999/ check +*/ +package main + +import ( + "flag" + "fmt" + "log" + "net/http" + "net/url" + + "golang.org/x/net/webdav" +) + +var port = flag.Int("port", 9999, "server port") + +func main() { + flag.Parse() + log.SetFlags(0) + h := &webdav.Handler{ + FileSystem: webdav.NewMemFS(), + LockSystem: webdav.NewMemLS(), + Logger: func(r *http.Request, err error) { + litmus := r.Header.Get("X-Litmus") + if len(litmus) > 19 { + litmus = litmus[:16] + "..." + } + + switch r.Method { + case "COPY", "MOVE": + dst := "" + if u, err := url.Parse(r.Header.Get("Destination")); err == nil { + dst = u.Path + } + o := r.Header.Get("Overwrite") + log.Printf("%-20s%-10s%-30s%-30so=%-2s%v", litmus, r.Method, r.URL.Path, dst, o, err) + default: + log.Printf("%-20s%-10s%-30s%v", litmus, r.Method, r.URL.Path, err) + } + }, + } + + // The next line would normally be: + // http.Handle("/", h) + // but we wrap that HTTP handler h to cater for a special case. + // + // The propfind_invalid2 litmus test case expects an empty namespace prefix + // declaration to be an error. The FAQ in the webdav litmus test says: + // + // "What does the "propfind_invalid2" test check for?... + // + // If a request was sent with an XML body which included an empty namespace + // prefix declaration (xmlns:ns1=""), then the server must reject that with + // a "400 Bad Request" response, as it is invalid according to the XML + // Namespace specification." + // + // On the other hand, the Go standard library's encoding/xml package + // accepts an empty xmlns namespace, as per the discussion at + // https://github.com/golang/go/issues/8068 + // + // Empty namespaces seem disallowed in the second (2006) edition of the XML + // standard, but allowed in a later edition. The grammar differs between + // http://www.w3.org/TR/2006/REC-xml-names-20060816/#ns-decl and + // http://www.w3.org/TR/REC-xml-names/#dt-prefix + // + // Thus, we assume that the propfind_invalid2 test is obsolete, and + // hard-code the 400 Bad Request response that the test expects. + http.Handle("/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Header.Get("X-Litmus") == "props: 3 (propfind_invalid2)" { + http.Error(w, "400 Bad Request", http.StatusBadRequest) + return + } + h.ServeHTTP(w, r) + })) + + addr := fmt.Sprintf(":%d", *port) + log.Printf("Serving %v", addr) + log.Fatal(http.ListenAndServe(addr, nil)) +} diff --git a/api/vendor/golang.org/x/net/webdav/lock.go b/api/vendor/golang.org/x/net/webdav/lock.go new file mode 100644 index 0000000..344ac5c --- /dev/null +++ b/api/vendor/golang.org/x/net/webdav/lock.go @@ -0,0 +1,445 @@ +// 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 webdav + +import ( + "container/heap" + "errors" + "strconv" + "strings" + "sync" + "time" +) + +var ( + // ErrConfirmationFailed is returned by a LockSystem's Confirm method. + ErrConfirmationFailed = errors.New("webdav: confirmation failed") + // ErrForbidden is returned by a LockSystem's Unlock method. + ErrForbidden = errors.New("webdav: forbidden") + // ErrLocked is returned by a LockSystem's Create, Refresh and Unlock methods. + ErrLocked = errors.New("webdav: locked") + // ErrNoSuchLock is returned by a LockSystem's Refresh and Unlock methods. + ErrNoSuchLock = errors.New("webdav: no such lock") +) + +// Condition can match a WebDAV resource, based on a token or ETag. +// Exactly one of Token and ETag should be non-empty. +type Condition struct { + Not bool + Token string + ETag string +} + +// LockSystem manages access to a collection of named resources. The elements +// in a lock name are separated by slash ('/', U+002F) characters, regardless +// of host operating system convention. +type LockSystem interface { + // Confirm confirms that the caller can claim all of the locks specified by + // the given conditions, and that holding the union of all of those locks + // gives exclusive access to all of the named resources. Up to two resources + // can be named. Empty names are ignored. + // + // Exactly one of release and err will be non-nil. If release is non-nil, + // all of the requested locks are held until release is called. Calling + // release does not unlock the lock, in the WebDAV UNLOCK sense, but once + // Confirm has confirmed that a lock claim is valid, that lock cannot be + // Confirmed again until it has been released. + // + // If Confirm returns ErrConfirmationFailed then the Handler will continue + // to try any other set of locks presented (a WebDAV HTTP request can + // present more than one set of locks). If it returns any other non-nil + // error, the Handler will write a "500 Internal Server Error" HTTP status. + Confirm(now time.Time, name0, name1 string, conditions ...Condition) (release func(), err error) + + // Create creates a lock with the given depth, duration, owner and root + // (name). The depth will either be negative (meaning infinite) or zero. + // + // If Create returns ErrLocked then the Handler will write a "423 Locked" + // HTTP status. If it returns any other non-nil error, the Handler will + // write a "500 Internal Server Error" HTTP status. + // + // See http://www.webdav.org/specs/rfc4918.html#rfc.section.9.10.6 for + // when to use each error. + // + // The token returned identifies the created lock. It should be an absolute + // URI as defined by RFC 3986, Section 4.3. In particular, it should not + // contain whitespace. + Create(now time.Time, details LockDetails) (token string, err error) + + // Refresh refreshes the lock with the given token. + // + // If Refresh returns ErrLocked then the Handler will write a "423 Locked" + // HTTP Status. If Refresh returns ErrNoSuchLock then the Handler will write + // a "412 Precondition Failed" HTTP Status. If it returns any other non-nil + // error, the Handler will write a "500 Internal Server Error" HTTP status. + // + // See http://www.webdav.org/specs/rfc4918.html#rfc.section.9.10.6 for + // when to use each error. + Refresh(now time.Time, token string, duration time.Duration) (LockDetails, error) + + // Unlock unlocks the lock with the given token. + // + // If Unlock returns ErrForbidden then the Handler will write a "403 + // Forbidden" HTTP Status. If Unlock returns ErrLocked then the Handler + // will write a "423 Locked" HTTP status. If Unlock returns ErrNoSuchLock + // then the Handler will write a "409 Conflict" HTTP Status. If it returns + // any other non-nil error, the Handler will write a "500 Internal Server + // Error" HTTP status. + // + // See http://www.webdav.org/specs/rfc4918.html#rfc.section.9.11.1 for + // when to use each error. + Unlock(now time.Time, token string) error +} + +// LockDetails are a lock's metadata. +type LockDetails struct { + // Root is the root resource name being locked. For a zero-depth lock, the + // root is the only resource being locked. + Root string + // Duration is the lock timeout. A negative duration means infinite. + Duration time.Duration + // OwnerXML is the verbatim XML given in a LOCK HTTP request. + // + // TODO: does the "verbatim" nature play well with XML namespaces? + // Does the OwnerXML field need to have more structure? See + // https://codereview.appspot.com/175140043/#msg2 + OwnerXML string + // ZeroDepth is whether the lock has zero depth. If it does not have zero + // depth, it has infinite depth. + ZeroDepth bool +} + +// NewMemLS returns a new in-memory LockSystem. +func NewMemLS() LockSystem { + return &memLS{ + byName: make(map[string]*memLSNode), + byToken: make(map[string]*memLSNode), + gen: uint64(time.Now().Unix()), + } +} + +type memLS struct { + mu sync.Mutex + byName map[string]*memLSNode + byToken map[string]*memLSNode + gen uint64 + // byExpiry only contains those nodes whose LockDetails have a finite + // Duration and are yet to expire. + byExpiry byExpiry +} + +func (m *memLS) nextToken() string { + m.gen++ + return strconv.FormatUint(m.gen, 10) +} + +func (m *memLS) collectExpiredNodes(now time.Time) { + for len(m.byExpiry) > 0 { + if now.Before(m.byExpiry[0].expiry) { + break + } + m.remove(m.byExpiry[0]) + } +} + +func (m *memLS) Confirm(now time.Time, name0, name1 string, conditions ...Condition) (func(), error) { + m.mu.Lock() + defer m.mu.Unlock() + m.collectExpiredNodes(now) + + var n0, n1 *memLSNode + if name0 != "" { + if n0 = m.lookup(slashClean(name0), conditions...); n0 == nil { + return nil, ErrConfirmationFailed + } + } + if name1 != "" { + if n1 = m.lookup(slashClean(name1), conditions...); n1 == nil { + return nil, ErrConfirmationFailed + } + } + + // Don't hold the same node twice. + if n1 == n0 { + n1 = nil + } + + if n0 != nil { + m.hold(n0) + } + if n1 != nil { + m.hold(n1) + } + return func() { + m.mu.Lock() + defer m.mu.Unlock() + if n1 != nil { + m.unhold(n1) + } + if n0 != nil { + m.unhold(n0) + } + }, nil +} + +// lookup returns the node n that locks the named resource, provided that n +// matches at least one of the given conditions and that lock isn't held by +// another party. Otherwise, it returns nil. +// +// n may be a parent of the named resource, if n is an infinite depth lock. +func (m *memLS) lookup(name string, conditions ...Condition) (n *memLSNode) { + // TODO: support Condition.Not and Condition.ETag. + for _, c := range conditions { + n = m.byToken[c.Token] + if n == nil || n.held { + continue + } + if name == n.details.Root { + return n + } + if n.details.ZeroDepth { + continue + } + if n.details.Root == "/" || strings.HasPrefix(name, n.details.Root+"/") { + return n + } + } + return nil +} + +func (m *memLS) hold(n *memLSNode) { + if n.held { + panic("webdav: memLS inconsistent held state") + } + n.held = true + if n.details.Duration >= 0 && n.byExpiryIndex >= 0 { + heap.Remove(&m.byExpiry, n.byExpiryIndex) + } +} + +func (m *memLS) unhold(n *memLSNode) { + if !n.held { + panic("webdav: memLS inconsistent held state") + } + n.held = false + if n.details.Duration >= 0 { + heap.Push(&m.byExpiry, n) + } +} + +func (m *memLS) Create(now time.Time, details LockDetails) (string, error) { + m.mu.Lock() + defer m.mu.Unlock() + m.collectExpiredNodes(now) + details.Root = slashClean(details.Root) + + if !m.canCreate(details.Root, details.ZeroDepth) { + return "", ErrLocked + } + n := m.create(details.Root) + n.token = m.nextToken() + m.byToken[n.token] = n + n.details = details + if n.details.Duration >= 0 { + n.expiry = now.Add(n.details.Duration) + heap.Push(&m.byExpiry, n) + } + return n.token, nil +} + +func (m *memLS) Refresh(now time.Time, token string, duration time.Duration) (LockDetails, error) { + m.mu.Lock() + defer m.mu.Unlock() + m.collectExpiredNodes(now) + + n := m.byToken[token] + if n == nil { + return LockDetails{}, ErrNoSuchLock + } + if n.held { + return LockDetails{}, ErrLocked + } + if n.byExpiryIndex >= 0 { + heap.Remove(&m.byExpiry, n.byExpiryIndex) + } + n.details.Duration = duration + if n.details.Duration >= 0 { + n.expiry = now.Add(n.details.Duration) + heap.Push(&m.byExpiry, n) + } + return n.details, nil +} + +func (m *memLS) Unlock(now time.Time, token string) error { + m.mu.Lock() + defer m.mu.Unlock() + m.collectExpiredNodes(now) + + n := m.byToken[token] + if n == nil { + return ErrNoSuchLock + } + if n.held { + return ErrLocked + } + m.remove(n) + return nil +} + +func (m *memLS) canCreate(name string, zeroDepth bool) bool { + return walkToRoot(name, func(name0 string, first bool) bool { + n := m.byName[name0] + if n == nil { + return true + } + if first { + if n.token != "" { + // The target node is already locked. + return false + } + if !zeroDepth { + // The requested lock depth is infinite, and the fact that n exists + // (n != nil) means that a descendent of the target node is locked. + return false + } + } else if n.token != "" && !n.details.ZeroDepth { + // An ancestor of the target node is locked with infinite depth. + return false + } + return true + }) +} + +func (m *memLS) create(name string) (ret *memLSNode) { + walkToRoot(name, func(name0 string, first bool) bool { + n := m.byName[name0] + if n == nil { + n = &memLSNode{ + details: LockDetails{ + Root: name0, + }, + byExpiryIndex: -1, + } + m.byName[name0] = n + } + n.refCount++ + if first { + ret = n + } + return true + }) + return ret +} + +func (m *memLS) remove(n *memLSNode) { + delete(m.byToken, n.token) + n.token = "" + walkToRoot(n.details.Root, func(name0 string, first bool) bool { + x := m.byName[name0] + x.refCount-- + if x.refCount == 0 { + delete(m.byName, name0) + } + return true + }) + if n.byExpiryIndex >= 0 { + heap.Remove(&m.byExpiry, n.byExpiryIndex) + } +} + +func walkToRoot(name string, f func(name0 string, first bool) bool) bool { + for first := true; ; first = false { + if !f(name, first) { + return false + } + if name == "/" { + break + } + name = name[:strings.LastIndex(name, "/")] + if name == "" { + name = "/" + } + } + return true +} + +type memLSNode struct { + // details are the lock metadata. Even if this node's name is not explicitly locked, + // details.Root will still equal the node's name. + details LockDetails + // token is the unique identifier for this node's lock. An empty token means that + // this node is not explicitly locked. + token string + // refCount is the number of self-or-descendent nodes that are explicitly locked. + refCount int + // expiry is when this node's lock expires. + expiry time.Time + // byExpiryIndex is the index of this node in memLS.byExpiry. It is -1 + // if this node does not expire, or has expired. + byExpiryIndex int + // held is whether this node's lock is actively held by a Confirm call. + held bool +} + +type byExpiry []*memLSNode + +func (b *byExpiry) Len() int { + return len(*b) +} + +func (b *byExpiry) Less(i, j int) bool { + return (*b)[i].expiry.Before((*b)[j].expiry) +} + +func (b *byExpiry) Swap(i, j int) { + (*b)[i], (*b)[j] = (*b)[j], (*b)[i] + (*b)[i].byExpiryIndex = i + (*b)[j].byExpiryIndex = j +} + +func (b *byExpiry) Push(x interface{}) { + n := x.(*memLSNode) + n.byExpiryIndex = len(*b) + *b = append(*b, n) +} + +func (b *byExpiry) Pop() interface{} { + i := len(*b) - 1 + n := (*b)[i] + (*b)[i] = nil + n.byExpiryIndex = -1 + *b = (*b)[:i] + return n +} + +const infiniteTimeout = -1 + +// parseTimeout parses the Timeout HTTP header, as per section 10.7. If s is +// empty, an infiniteTimeout is returned. +func parseTimeout(s string) (time.Duration, error) { + if s == "" { + return infiniteTimeout, nil + } + if i := strings.IndexByte(s, ','); i >= 0 { + s = s[:i] + } + s = strings.TrimSpace(s) + if s == "Infinite" { + return infiniteTimeout, nil + } + const pre = "Second-" + if !strings.HasPrefix(s, pre) { + return 0, errInvalidTimeout + } + s = s[len(pre):] + if s == "" || s[0] < '0' || '9' < s[0] { + return 0, errInvalidTimeout + } + n, err := strconv.ParseInt(s, 10, 64) + if err != nil || 1<<32-1 < n { + return 0, errInvalidTimeout + } + return time.Duration(n) * time.Second, nil +} diff --git a/api/vendor/golang.org/x/net/webdav/lock_test.go b/api/vendor/golang.org/x/net/webdav/lock_test.go new file mode 100644 index 0000000..5cf14cd --- /dev/null +++ b/api/vendor/golang.org/x/net/webdav/lock_test.go @@ -0,0 +1,731 @@ +// 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 webdav + +import ( + "fmt" + "math/rand" + "path" + "reflect" + "sort" + "strconv" + "strings" + "testing" + "time" +) + +func TestWalkToRoot(t *testing.T) { + testCases := []struct { + name string + want []string + }{{ + "/a/b/c/d", + []string{ + "/a/b/c/d", + "/a/b/c", + "/a/b", + "/a", + "/", + }, + }, { + "/a", + []string{ + "/a", + "/", + }, + }, { + "/", + []string{ + "/", + }, + }} + + for _, tc := range testCases { + var got []string + if !walkToRoot(tc.name, func(name0 string, first bool) bool { + if first != (len(got) == 0) { + t.Errorf("name=%q: first=%t but len(got)==%d", tc.name, first, len(got)) + return false + } + got = append(got, name0) + return true + }) { + continue + } + if !reflect.DeepEqual(got, tc.want) { + t.Errorf("name=%q:\ngot %q\nwant %q", tc.name, got, tc.want) + } + } +} + +var lockTestDurations = []time.Duration{ + infiniteTimeout, // infiniteTimeout means to never expire. + 0, // A zero duration means to expire immediately. + 100 * time.Hour, // A very large duration will not expire in these tests. +} + +// lockTestNames are the names of a set of mutually compatible locks. For each +// name fragment: +// - _ means no explicit lock. +// - i means an infinite-depth lock, +// - z means a zero-depth lock, +var lockTestNames = []string{ + "/_/_/_/_/z", + "/_/_/i", + "/_/z", + "/_/z/i", + "/_/z/z", + "/_/z/_/i", + "/_/z/_/z", + "/i", + "/z", + "/z/_/i", + "/z/_/z", +} + +func lockTestZeroDepth(name string) bool { + switch name[len(name)-1] { + case 'i': + return false + case 'z': + return true + } + panic(fmt.Sprintf("lock name %q did not end with 'i' or 'z'", name)) +} + +func TestMemLSCanCreate(t *testing.T) { + now := time.Unix(0, 0) + m := NewMemLS().(*memLS) + + for _, name := range lockTestNames { + _, err := m.Create(now, LockDetails{ + Root: name, + Duration: infiniteTimeout, + ZeroDepth: lockTestZeroDepth(name), + }) + if err != nil { + t.Fatalf("creating lock for %q: %v", name, err) + } + } + + wantCanCreate := func(name string, zeroDepth bool) bool { + for _, n := range lockTestNames { + switch { + case n == name: + // An existing lock has the same name as the proposed lock. + return false + case strings.HasPrefix(n, name): + // An existing lock would be a child of the proposed lock, + // which conflicts if the proposed lock has infinite depth. + if !zeroDepth { + return false + } + case strings.HasPrefix(name, n): + // An existing lock would be an ancestor of the proposed lock, + // which conflicts if the ancestor has infinite depth. + if n[len(n)-1] == 'i' { + return false + } + } + } + return true + } + + var check func(int, string) + check = func(recursion int, name string) { + for _, zeroDepth := range []bool{false, true} { + got := m.canCreate(name, zeroDepth) + want := wantCanCreate(name, zeroDepth) + if got != want { + t.Errorf("canCreate name=%q zeroDepth=%t: got %t, want %t", name, zeroDepth, got, want) + } + } + if recursion == 6 { + return + } + if name != "/" { + name += "/" + } + for _, c := range "_iz" { + check(recursion+1, name+string(c)) + } + } + check(0, "/") +} + +func TestMemLSLookup(t *testing.T) { + now := time.Unix(0, 0) + m := NewMemLS().(*memLS) + + badToken := m.nextToken() + t.Logf("badToken=%q", badToken) + + for _, name := range lockTestNames { + token, err := m.Create(now, LockDetails{ + Root: name, + Duration: infiniteTimeout, + ZeroDepth: lockTestZeroDepth(name), + }) + if err != nil { + t.Fatalf("creating lock for %q: %v", name, err) + } + t.Logf("%-15q -> node=%p token=%q", name, m.byName[name], token) + } + + baseNames := append([]string{"/a", "/b/c"}, lockTestNames...) + for _, baseName := range baseNames { + for _, suffix := range []string{"", "/0", "/1/2/3"} { + name := baseName + suffix + + goodToken := "" + base := m.byName[baseName] + if base != nil && (suffix == "" || !lockTestZeroDepth(baseName)) { + goodToken = base.token + } + + for _, token := range []string{badToken, goodToken} { + if token == "" { + continue + } + + got := m.lookup(name, Condition{Token: token}) + want := base + if token == badToken { + want = nil + } + if got != want { + t.Errorf("name=%-20qtoken=%q (bad=%t): got %p, want %p", + name, token, token == badToken, got, want) + } + } + } + } +} + +func TestMemLSConfirm(t *testing.T) { + now := time.Unix(0, 0) + m := NewMemLS().(*memLS) + alice, err := m.Create(now, LockDetails{ + Root: "/alice", + Duration: infiniteTimeout, + ZeroDepth: false, + }) + tweedle, err := m.Create(now, LockDetails{ + Root: "/tweedle", + Duration: infiniteTimeout, + ZeroDepth: false, + }) + if err != nil { + t.Fatalf("Create: %v", err) + } + if err := m.consistent(); err != nil { + t.Fatalf("Create: inconsistent state: %v", err) + } + + // Test a mismatch between name and condition. + _, err = m.Confirm(now, "/tweedle/dee", "", Condition{Token: alice}) + if err != ErrConfirmationFailed { + t.Fatalf("Confirm (mismatch): got %v, want ErrConfirmationFailed", err) + } + if err := m.consistent(); err != nil { + t.Fatalf("Confirm (mismatch): inconsistent state: %v", err) + } + + // Test two names (that fall under the same lock) in the one Confirm call. + release, err := m.Confirm(now, "/tweedle/dee", "/tweedle/dum", Condition{Token: tweedle}) + if err != nil { + t.Fatalf("Confirm (twins): %v", err) + } + if err := m.consistent(); err != nil { + t.Fatalf("Confirm (twins): inconsistent state: %v", err) + } + release() + if err := m.consistent(); err != nil { + t.Fatalf("release (twins): inconsistent state: %v", err) + } + + // Test the same two names in overlapping Confirm / release calls. + releaseDee, err := m.Confirm(now, "/tweedle/dee", "", Condition{Token: tweedle}) + if err != nil { + t.Fatalf("Confirm (sequence #0): %v", err) + } + if err := m.consistent(); err != nil { + t.Fatalf("Confirm (sequence #0): inconsistent state: %v", err) + } + + _, err = m.Confirm(now, "/tweedle/dum", "", Condition{Token: tweedle}) + if err != ErrConfirmationFailed { + t.Fatalf("Confirm (sequence #1): got %v, want ErrConfirmationFailed", err) + } + if err := m.consistent(); err != nil { + t.Fatalf("Confirm (sequence #1): inconsistent state: %v", err) + } + + releaseDee() + if err := m.consistent(); err != nil { + t.Fatalf("release (sequence #2): inconsistent state: %v", err) + } + + releaseDum, err := m.Confirm(now, "/tweedle/dum", "", Condition{Token: tweedle}) + if err != nil { + t.Fatalf("Confirm (sequence #3): %v", err) + } + if err := m.consistent(); err != nil { + t.Fatalf("Confirm (sequence #3): inconsistent state: %v", err) + } + + // Test that you can't unlock a held lock. + err = m.Unlock(now, tweedle) + if err != ErrLocked { + t.Fatalf("Unlock (sequence #4): got %v, want ErrLocked", err) + } + + releaseDum() + if err := m.consistent(); err != nil { + t.Fatalf("release (sequence #5): inconsistent state: %v", err) + } + + err = m.Unlock(now, tweedle) + if err != nil { + t.Fatalf("Unlock (sequence #6): %v", err) + } + if err := m.consistent(); err != nil { + t.Fatalf("Unlock (sequence #6): inconsistent state: %v", err) + } +} + +func TestMemLSNonCanonicalRoot(t *testing.T) { + now := time.Unix(0, 0) + m := NewMemLS().(*memLS) + token, err := m.Create(now, LockDetails{ + Root: "/foo/./bar//", + Duration: 1 * time.Second, + }) + if err != nil { + t.Fatalf("Create: %v", err) + } + if err := m.consistent(); err != nil { + t.Fatalf("Create: inconsistent state: %v", err) + } + if err := m.Unlock(now, token); err != nil { + t.Fatalf("Unlock: %v", err) + } + if err := m.consistent(); err != nil { + t.Fatalf("Unlock: inconsistent state: %v", err) + } +} + +func TestMemLSExpiry(t *testing.T) { + m := NewMemLS().(*memLS) + testCases := []string{ + "setNow 0", + "create /a.5", + "want /a.5", + "create /c.6", + "want /a.5 /c.6", + "create /a/b.7", + "want /a.5 /a/b.7 /c.6", + "setNow 4", + "want /a.5 /a/b.7 /c.6", + "setNow 5", + "want /a/b.7 /c.6", + "setNow 6", + "want /a/b.7", + "setNow 7", + "want ", + "setNow 8", + "want ", + "create /a.12", + "create /b.13", + "create /c.15", + "create /a/d.16", + "want /a.12 /a/d.16 /b.13 /c.15", + "refresh /a.14", + "want /a.14 /a/d.16 /b.13 /c.15", + "setNow 12", + "want /a.14 /a/d.16 /b.13 /c.15", + "setNow 13", + "want /a.14 /a/d.16 /c.15", + "setNow 14", + "want /a/d.16 /c.15", + "refresh /a/d.20", + "refresh /c.20", + "want /a/d.20 /c.20", + "setNow 20", + "want ", + } + + tokens := map[string]string{} + zTime := time.Unix(0, 0) + now := zTime + for i, tc := range testCases { + j := strings.IndexByte(tc, ' ') + if j < 0 { + t.Fatalf("test case #%d %q: invalid command", i, tc) + } + op, arg := tc[:j], tc[j+1:] + switch op { + default: + t.Fatalf("test case #%d %q: invalid operation %q", i, tc, op) + + case "create", "refresh": + parts := strings.Split(arg, ".") + if len(parts) != 2 { + t.Fatalf("test case #%d %q: invalid create", i, tc) + } + root := parts[0] + d, err := strconv.Atoi(parts[1]) + if err != nil { + t.Fatalf("test case #%d %q: invalid duration", i, tc) + } + dur := time.Unix(0, 0).Add(time.Duration(d) * time.Second).Sub(now) + + switch op { + case "create": + token, err := m.Create(now, LockDetails{ + Root: root, + Duration: dur, + ZeroDepth: true, + }) + if err != nil { + t.Fatalf("test case #%d %q: Create: %v", i, tc, err) + } + tokens[root] = token + + case "refresh": + token := tokens[root] + if token == "" { + t.Fatalf("test case #%d %q: no token for %q", i, tc, root) + } + got, err := m.Refresh(now, token, dur) + if err != nil { + t.Fatalf("test case #%d %q: Refresh: %v", i, tc, err) + } + want := LockDetails{ + Root: root, + Duration: dur, + ZeroDepth: true, + } + if got != want { + t.Fatalf("test case #%d %q:\ngot %v\nwant %v", i, tc, got, want) + } + } + + case "setNow": + d, err := strconv.Atoi(arg) + if err != nil { + t.Fatalf("test case #%d %q: invalid duration", i, tc) + } + now = time.Unix(0, 0).Add(time.Duration(d) * time.Second) + + case "want": + m.mu.Lock() + m.collectExpiredNodes(now) + got := make([]string, 0, len(m.byToken)) + for _, n := range m.byToken { + got = append(got, fmt.Sprintf("%s.%d", + n.details.Root, n.expiry.Sub(zTime)/time.Second)) + } + m.mu.Unlock() + sort.Strings(got) + want := []string{} + if arg != "" { + want = strings.Split(arg, " ") + } + if !reflect.DeepEqual(got, want) { + t.Fatalf("test case #%d %q:\ngot %q\nwant %q", i, tc, got, want) + } + } + + if err := m.consistent(); err != nil { + t.Fatalf("test case #%d %q: inconsistent state: %v", i, tc, err) + } + } +} + +func TestMemLS(t *testing.T) { + now := time.Unix(0, 0) + m := NewMemLS().(*memLS) + rng := rand.New(rand.NewSource(0)) + tokens := map[string]string{} + nConfirm, nCreate, nRefresh, nUnlock := 0, 0, 0, 0 + const N = 2000 + + for i := 0; i < N; i++ { + name := lockTestNames[rng.Intn(len(lockTestNames))] + duration := lockTestDurations[rng.Intn(len(lockTestDurations))] + confirmed, unlocked := false, false + + // If the name was already locked, we randomly confirm/release, refresh + // or unlock it. Otherwise, we create a lock. + token := tokens[name] + if token != "" { + switch rng.Intn(3) { + case 0: + confirmed = true + nConfirm++ + release, err := m.Confirm(now, name, "", Condition{Token: token}) + if err != nil { + t.Fatalf("iteration #%d: Confirm %q: %v", i, name, err) + } + if err := m.consistent(); err != nil { + t.Fatalf("iteration #%d: inconsistent state: %v", i, err) + } + release() + + case 1: + nRefresh++ + if _, err := m.Refresh(now, token, duration); err != nil { + t.Fatalf("iteration #%d: Refresh %q: %v", i, name, err) + } + + case 2: + unlocked = true + nUnlock++ + if err := m.Unlock(now, token); err != nil { + t.Fatalf("iteration #%d: Unlock %q: %v", i, name, err) + } + } + + } else { + nCreate++ + var err error + token, err = m.Create(now, LockDetails{ + Root: name, + Duration: duration, + ZeroDepth: lockTestZeroDepth(name), + }) + if err != nil { + t.Fatalf("iteration #%d: Create %q: %v", i, name, err) + } + } + + if !confirmed { + if duration == 0 || unlocked { + // A zero-duration lock should expire immediately and is + // effectively equivalent to being unlocked. + tokens[name] = "" + } else { + tokens[name] = token + } + } + + if err := m.consistent(); err != nil { + t.Fatalf("iteration #%d: inconsistent state: %v", i, err) + } + } + + if nConfirm < N/10 { + t.Fatalf("too few Confirm calls: got %d, want >= %d", nConfirm, N/10) + } + if nCreate < N/10 { + t.Fatalf("too few Create calls: got %d, want >= %d", nCreate, N/10) + } + if nRefresh < N/10 { + t.Fatalf("too few Refresh calls: got %d, want >= %d", nRefresh, N/10) + } + if nUnlock < N/10 { + t.Fatalf("too few Unlock calls: got %d, want >= %d", nUnlock, N/10) + } +} + +func (m *memLS) consistent() error { + m.mu.Lock() + defer m.mu.Unlock() + + // If m.byName is non-empty, then it must contain an entry for the root "/", + // and its refCount should equal the number of locked nodes. + if len(m.byName) > 0 { + n := m.byName["/"] + if n == nil { + return fmt.Errorf(`non-empty m.byName does not contain the root "/"`) + } + if n.refCount != len(m.byToken) { + return fmt.Errorf("root node refCount=%d, differs from len(m.byToken)=%d", n.refCount, len(m.byToken)) + } + } + + for name, n := range m.byName { + // The map keys should be consistent with the node's copy of the key. + if n.details.Root != name { + return fmt.Errorf("node name %q != byName map key %q", n.details.Root, name) + } + + // A name must be clean, and start with a "/". + if len(name) == 0 || name[0] != '/' { + return fmt.Errorf(`node name %q does not start with "/"`, name) + } + if name != path.Clean(name) { + return fmt.Errorf(`node name %q is not clean`, name) + } + + // A node's refCount should be positive. + if n.refCount <= 0 { + return fmt.Errorf("non-positive refCount for node at name %q", name) + } + + // A node's refCount should be the number of self-or-descendents that + // are locked (i.e. have a non-empty token). + var list []string + for name0, n0 := range m.byName { + // All of lockTestNames' name fragments are one byte long: '_', 'i' or 'z', + // so strings.HasPrefix is equivalent to self-or-descendent name match. + // We don't have to worry about "/foo/bar" being a false positive match + // for "/foo/b". + if strings.HasPrefix(name0, name) && n0.token != "" { + list = append(list, name0) + } + } + if n.refCount != len(list) { + sort.Strings(list) + return fmt.Errorf("node at name %q has refCount %d but locked self-or-descendents are %q (len=%d)", + name, n.refCount, list, len(list)) + } + + // A node n is in m.byToken if it has a non-empty token. + if n.token != "" { + if _, ok := m.byToken[n.token]; !ok { + return fmt.Errorf("node at name %q has token %q but not in m.byToken", name, n.token) + } + } + + // A node n is in m.byExpiry if it has a non-negative byExpiryIndex. + if n.byExpiryIndex >= 0 { + if n.byExpiryIndex >= len(m.byExpiry) { + return fmt.Errorf("node at name %q has byExpiryIndex %d but m.byExpiry has length %d", name, n.byExpiryIndex, len(m.byExpiry)) + } + if n != m.byExpiry[n.byExpiryIndex] { + return fmt.Errorf("node at name %q has byExpiryIndex %d but that indexes a different node", name, n.byExpiryIndex) + } + } + } + + for token, n := range m.byToken { + // The map keys should be consistent with the node's copy of the key. + if n.token != token { + return fmt.Errorf("node token %q != byToken map key %q", n.token, token) + } + + // Every node in m.byToken is in m.byName. + if _, ok := m.byName[n.details.Root]; !ok { + return fmt.Errorf("node at name %q in m.byToken but not in m.byName", n.details.Root) + } + } + + for i, n := range m.byExpiry { + // The slice indices should be consistent with the node's copy of the index. + if n.byExpiryIndex != i { + return fmt.Errorf("node byExpiryIndex %d != byExpiry slice index %d", n.byExpiryIndex, i) + } + + // Every node in m.byExpiry is in m.byName. + if _, ok := m.byName[n.details.Root]; !ok { + return fmt.Errorf("node at name %q in m.byExpiry but not in m.byName", n.details.Root) + } + + // No node in m.byExpiry should be held. + if n.held { + return fmt.Errorf("node at name %q in m.byExpiry is held", n.details.Root) + } + } + return nil +} + +func TestParseTimeout(t *testing.T) { + testCases := []struct { + s string + want time.Duration + wantErr error + }{{ + "", + infiniteTimeout, + nil, + }, { + "Infinite", + infiniteTimeout, + nil, + }, { + "Infinitesimal", + 0, + errInvalidTimeout, + }, { + "infinite", + 0, + errInvalidTimeout, + }, { + "Second-0", + 0 * time.Second, + nil, + }, { + "Second-123", + 123 * time.Second, + nil, + }, { + " Second-456 ", + 456 * time.Second, + nil, + }, { + "Second-4100000000", + 4100000000 * time.Second, + nil, + }, { + "junk", + 0, + errInvalidTimeout, + }, { + "Second-", + 0, + errInvalidTimeout, + }, { + "Second--1", + 0, + errInvalidTimeout, + }, { + "Second--123", + 0, + errInvalidTimeout, + }, { + "Second-+123", + 0, + errInvalidTimeout, + }, { + "Second-0x123", + 0, + errInvalidTimeout, + }, { + "second-123", + 0, + errInvalidTimeout, + }, { + "Second-4294967295", + 4294967295 * time.Second, + nil, + }, { + // Section 10.7 says that "The timeout value for TimeType "Second" + // must not be greater than 2^32-1." + "Second-4294967296", + 0, + errInvalidTimeout, + }, { + // This test case comes from section 9.10.9 of the spec. It says, + // + // "In this request, the client has specified that it desires an + // infinite-length lock, if available, otherwise a timeout of 4.1 + // billion seconds, if available." + // + // The Go WebDAV package always supports infinite length locks, + // and ignores the fallback after the comma. + "Infinite, Second-4100000000", + infiniteTimeout, + nil, + }} + + for _, tc := range testCases { + got, gotErr := parseTimeout(tc.s) + if got != tc.want || gotErr != tc.wantErr { + t.Errorf("parsing %q:\ngot %v, %v\nwant %v, %v", tc.s, got, gotErr, tc.want, tc.wantErr) + } + } +} diff --git a/api/vendor/golang.org/x/net/webdav/prop.go b/api/vendor/golang.org/x/net/webdav/prop.go new file mode 100644 index 0000000..4d7be34 --- /dev/null +++ b/api/vendor/golang.org/x/net/webdav/prop.go @@ -0,0 +1,470 @@ +// Copyright 2015 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 webdav + +import ( + "bytes" + "encoding/xml" + "errors" + "fmt" + "io" + "mime" + "net/http" + "os" + "path/filepath" + "strconv" + + "golang.org/x/net/context" +) + +// Proppatch describes a property update instruction as defined in RFC 4918. +// See http://www.webdav.org/specs/rfc4918.html#METHOD_PROPPATCH +type Proppatch struct { + // Remove specifies whether this patch removes properties. If it does not + // remove them, it sets them. + Remove bool + // Props contains the properties to be set or removed. + Props []Property +} + +// Propstat describes a XML propstat element as defined in RFC 4918. +// See http://www.webdav.org/specs/rfc4918.html#ELEMENT_propstat +type Propstat struct { + // Props contains the properties for which Status applies. + Props []Property + + // Status defines the HTTP status code of the properties in Prop. + // Allowed values include, but are not limited to the WebDAV status + // code extensions for HTTP/1.1. + // http://www.webdav.org/specs/rfc4918.html#status.code.extensions.to.http11 + Status int + + // XMLError contains the XML representation of the optional error element. + // XML content within this field must not rely on any predefined + // namespace declarations or prefixes. If empty, the XML error element + // is omitted. + XMLError string + + // ResponseDescription contains the contents of the optional + // responsedescription field. If empty, the XML element is omitted. + ResponseDescription string +} + +// makePropstats returns a slice containing those of x and y whose Props slice +// is non-empty. If both are empty, it returns a slice containing an otherwise +// zero Propstat whose HTTP status code is 200 OK. +func makePropstats(x, y Propstat) []Propstat { + pstats := make([]Propstat, 0, 2) + if len(x.Props) != 0 { + pstats = append(pstats, x) + } + if len(y.Props) != 0 { + pstats = append(pstats, y) + } + if len(pstats) == 0 { + pstats = append(pstats, Propstat{ + Status: http.StatusOK, + }) + } + return pstats +} + +// DeadPropsHolder holds the dead properties of a resource. +// +// Dead properties are those properties that are explicitly defined. In +// comparison, live properties, such as DAV:getcontentlength, are implicitly +// defined by the underlying resource, and cannot be explicitly overridden or +// removed. See the Terminology section of +// http://www.webdav.org/specs/rfc4918.html#rfc.section.3 +// +// There is a whitelist of the names of live properties. This package handles +// all live properties, and will only pass non-whitelisted names to the Patch +// method of DeadPropsHolder implementations. +type DeadPropsHolder interface { + // DeadProps returns a copy of the dead properties held. + DeadProps() (map[xml.Name]Property, error) + + // Patch patches the dead properties held. + // + // Patching is atomic; either all or no patches succeed. It returns (nil, + // non-nil) if an internal server error occurred, otherwise the Propstats + // collectively contain one Property for each proposed patch Property. If + // all patches succeed, Patch returns a slice of length one and a Propstat + // element with a 200 OK HTTP status code. If none succeed, for reasons + // other than an internal server error, no Propstat has status 200 OK. + // + // For more details on when various HTTP status codes apply, see + // http://www.webdav.org/specs/rfc4918.html#PROPPATCH-status + Patch([]Proppatch) ([]Propstat, error) +} + +// liveProps contains all supported, protected DAV: properties. +var liveProps = map[xml.Name]struct { + // findFn implements the propfind function of this property. If nil, + // it indicates a hidden property. + findFn func(context.Context, FileSystem, LockSystem, string, os.FileInfo) (string, error) + // dir is true if the property applies to directories. + dir bool +}{ + {Space: "DAV:", Local: "resourcetype"}: { + findFn: findResourceType, + dir: true, + }, + {Space: "DAV:", Local: "displayname"}: { + findFn: findDisplayName, + dir: true, + }, + {Space: "DAV:", Local: "getcontentlength"}: { + findFn: findContentLength, + dir: false, + }, + {Space: "DAV:", Local: "getlastmodified"}: { + findFn: findLastModified, + // http://webdav.org/specs/rfc4918.html#PROPERTY_getlastmodified + // suggests that getlastmodified should only apply to GETable + // resources, and this package does not support GET on directories. + // + // Nonetheless, some WebDAV clients expect child directories to be + // sortable by getlastmodified date, so this value is true, not false. + // See golang.org/issue/15334. + dir: true, + }, + {Space: "DAV:", Local: "creationdate"}: { + findFn: nil, + dir: false, + }, + {Space: "DAV:", Local: "getcontentlanguage"}: { + findFn: nil, + dir: false, + }, + {Space: "DAV:", Local: "getcontenttype"}: { + findFn: findContentType, + dir: false, + }, + {Space: "DAV:", Local: "getetag"}: { + findFn: findETag, + // findETag implements ETag as the concatenated hex values of a file's + // modification time and size. This is not a reliable synchronization + // mechanism for directories, so we do not advertise getetag for DAV + // collections. + dir: false, + }, + + // TODO: The lockdiscovery property requires LockSystem to list the + // active locks on a resource. + {Space: "DAV:", Local: "lockdiscovery"}: {}, + {Space: "DAV:", Local: "supportedlock"}: { + findFn: findSupportedLock, + dir: true, + }, +} + +// TODO(nigeltao) merge props and allprop? + +// Props returns the status of the properties named pnames for resource name. +// +// Each Propstat has a unique status and each property name will only be part +// of one Propstat element. +func props(ctx context.Context, fs FileSystem, ls LockSystem, name string, pnames []xml.Name) ([]Propstat, error) { + f, err := fs.OpenFile(ctx, name, os.O_RDONLY, 0) + if err != nil { + return nil, err + } + defer f.Close() + fi, err := f.Stat() + if err != nil { + return nil, err + } + isDir := fi.IsDir() + + var deadProps map[xml.Name]Property + if dph, ok := f.(DeadPropsHolder); ok { + deadProps, err = dph.DeadProps() + if err != nil { + return nil, err + } + } + + pstatOK := Propstat{Status: http.StatusOK} + pstatNotFound := Propstat{Status: http.StatusNotFound} + for _, pn := range pnames { + // If this file has dead properties, check if they contain pn. + if dp, ok := deadProps[pn]; ok { + pstatOK.Props = append(pstatOK.Props, dp) + continue + } + // Otherwise, it must either be a live property or we don't know it. + if prop := liveProps[pn]; prop.findFn != nil && (prop.dir || !isDir) { + innerXML, err := prop.findFn(ctx, fs, ls, name, fi) + if err != nil { + return nil, err + } + pstatOK.Props = append(pstatOK.Props, Property{ + XMLName: pn, + InnerXML: []byte(innerXML), + }) + } else { + pstatNotFound.Props = append(pstatNotFound.Props, Property{ + XMLName: pn, + }) + } + } + return makePropstats(pstatOK, pstatNotFound), nil +} + +// Propnames returns the property names defined for resource name. +func propnames(ctx context.Context, fs FileSystem, ls LockSystem, name string) ([]xml.Name, error) { + f, err := fs.OpenFile(ctx, name, os.O_RDONLY, 0) + if err != nil { + return nil, err + } + defer f.Close() + fi, err := f.Stat() + if err != nil { + return nil, err + } + isDir := fi.IsDir() + + var deadProps map[xml.Name]Property + if dph, ok := f.(DeadPropsHolder); ok { + deadProps, err = dph.DeadProps() + if err != nil { + return nil, err + } + } + + pnames := make([]xml.Name, 0, len(liveProps)+len(deadProps)) + for pn, prop := range liveProps { + if prop.findFn != nil && (prop.dir || !isDir) { + pnames = append(pnames, pn) + } + } + for pn := range deadProps { + pnames = append(pnames, pn) + } + return pnames, nil +} + +// Allprop returns the properties defined for resource name and the properties +// named in include. +// +// Note that RFC 4918 defines 'allprop' to return the DAV: properties defined +// within the RFC plus dead properties. Other live properties should only be +// returned if they are named in 'include'. +// +// See http://www.webdav.org/specs/rfc4918.html#METHOD_PROPFIND +func allprop(ctx context.Context, fs FileSystem, ls LockSystem, name string, include []xml.Name) ([]Propstat, error) { + pnames, err := propnames(ctx, fs, ls, name) + if err != nil { + return nil, err + } + // Add names from include if they are not already covered in pnames. + nameset := make(map[xml.Name]bool) + for _, pn := range pnames { + nameset[pn] = true + } + for _, pn := range include { + if !nameset[pn] { + pnames = append(pnames, pn) + } + } + return props(ctx, fs, ls, name, pnames) +} + +// Patch patches the properties of resource name. The return values are +// constrained in the same manner as DeadPropsHolder.Patch. +func patch(ctx context.Context, fs FileSystem, ls LockSystem, name string, patches []Proppatch) ([]Propstat, error) { + conflict := false +loop: + for _, patch := range patches { + for _, p := range patch.Props { + if _, ok := liveProps[p.XMLName]; ok { + conflict = true + break loop + } + } + } + if conflict { + pstatForbidden := Propstat{ + Status: http.StatusForbidden, + XMLError: ``, + } + pstatFailedDep := Propstat{ + Status: StatusFailedDependency, + } + for _, patch := range patches { + for _, p := range patch.Props { + if _, ok := liveProps[p.XMLName]; ok { + pstatForbidden.Props = append(pstatForbidden.Props, Property{XMLName: p.XMLName}) + } else { + pstatFailedDep.Props = append(pstatFailedDep.Props, Property{XMLName: p.XMLName}) + } + } + } + return makePropstats(pstatForbidden, pstatFailedDep), nil + } + + f, err := fs.OpenFile(ctx, name, os.O_RDWR, 0) + if err != nil { + return nil, err + } + defer f.Close() + if dph, ok := f.(DeadPropsHolder); ok { + ret, err := dph.Patch(patches) + if err != nil { + return nil, err + } + // http://www.webdav.org/specs/rfc4918.html#ELEMENT_propstat says that + // "The contents of the prop XML element must only list the names of + // properties to which the result in the status element applies." + for _, pstat := range ret { + for i, p := range pstat.Props { + pstat.Props[i] = Property{XMLName: p.XMLName} + } + } + return ret, nil + } + // The file doesn't implement the optional DeadPropsHolder interface, so + // all patches are forbidden. + pstat := Propstat{Status: http.StatusForbidden} + for _, patch := range patches { + for _, p := range patch.Props { + pstat.Props = append(pstat.Props, Property{XMLName: p.XMLName}) + } + } + return []Propstat{pstat}, nil +} + +func escapeXML(s string) string { + for i := 0; i < len(s); i++ { + // As an optimization, if s contains only ASCII letters, digits or a + // few special characters, the escaped value is s itself and we don't + // need to allocate a buffer and convert between string and []byte. + switch c := s[i]; { + case c == ' ' || c == '_' || + ('+' <= c && c <= '9') || // Digits as well as + , - . and / + ('A' <= c && c <= 'Z') || + ('a' <= c && c <= 'z'): + continue + } + // Otherwise, go through the full escaping process. + var buf bytes.Buffer + xml.EscapeText(&buf, []byte(s)) + return buf.String() + } + return s +} + +func findResourceType(ctx context.Context, fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { + if fi.IsDir() { + return ``, nil + } + return "", nil +} + +func findDisplayName(ctx context.Context, fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { + if slashClean(name) == "/" { + // Hide the real name of a possibly prefixed root directory. + return "", nil + } + return escapeXML(fi.Name()), nil +} + +func findContentLength(ctx context.Context, fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { + return strconv.FormatInt(fi.Size(), 10), nil +} + +func findLastModified(ctx context.Context, fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { + return fi.ModTime().UTC().Format(http.TimeFormat), nil +} + +// ErrNotImplemented should be returned by optional interfaces if they +// want the original implementation to be used. +var ErrNotImplemented = errors.New("not implemented") + +// ContentTyper is an optional interface for the os.FileInfo +// objects returned by the FileSystem. +// +// If this interface is defined then it will be used to read the +// content type from the object. +// +// If this interface is not defined the file will be opened and the +// content type will be guessed from the initial contents of the file. +type ContentTyper interface { + // ContentType returns the content type for the file. + // + // If this returns error ErrNotImplemented then the error will + // be ignored and the base implementation will be used + // instead. + ContentType(ctx context.Context) (string, error) +} + +func findContentType(ctx context.Context, fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { + if do, ok := fi.(ContentTyper); ok { + ctype, err := do.ContentType(ctx) + if err != ErrNotImplemented { + return ctype, err + } + } + f, err := fs.OpenFile(ctx, name, os.O_RDONLY, 0) + if err != nil { + return "", err + } + defer f.Close() + // This implementation is based on serveContent's code in the standard net/http package. + ctype := mime.TypeByExtension(filepath.Ext(name)) + if ctype != "" { + return ctype, nil + } + // Read a chunk to decide between utf-8 text and binary. + var buf [512]byte + n, err := io.ReadFull(f, buf[:]) + if err != nil && err != io.EOF && err != io.ErrUnexpectedEOF { + return "", err + } + ctype = http.DetectContentType(buf[:n]) + // Rewind file. + _, err = f.Seek(0, os.SEEK_SET) + return ctype, err +} + +// ETager is an optional interface for the os.FileInfo objects +// returned by the FileSystem. +// +// If this interface is defined then it will be used to read the ETag +// for the object. +// +// If this interface is not defined an ETag will be computed using the +// ModTime() and the Size() methods of the os.FileInfo object. +type ETager interface { + // ETag returns an ETag for the file. This should be of the + // form "value" or W/"value" + // + // If this returns error ErrNotImplemented then the error will + // be ignored and the base implementation will be used + // instead. + ETag(ctx context.Context) (string, error) +} + +func findETag(ctx context.Context, fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { + if do, ok := fi.(ETager); ok { + etag, err := do.ETag(ctx) + if err != ErrNotImplemented { + return etag, err + } + } + // The Apache http 2.4 web server by default concatenates the + // modification time and size of a file. We replicate the heuristic + // with nanosecond granularity. + return fmt.Sprintf(`"%x%x"`, fi.ModTime().UnixNano(), fi.Size()), nil +} + +func findSupportedLock(ctx context.Context, fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { + return `` + + `` + + `` + + `` + + ``, nil +} diff --git a/api/vendor/golang.org/x/net/webdav/prop_test.go b/api/vendor/golang.org/x/net/webdav/prop_test.go new file mode 100644 index 0000000..bc42b91 --- /dev/null +++ b/api/vendor/golang.org/x/net/webdav/prop_test.go @@ -0,0 +1,717 @@ +// Copyright 2015 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 webdav + +import ( + "encoding/xml" + "fmt" + "net/http" + "os" + "reflect" + "regexp" + "sort" + "testing" + + "golang.org/x/net/context" +) + +func TestMemPS(t *testing.T) { + ctx := context.Background() + // calcProps calculates the getlastmodified and getetag DAV: property + // values in pstats for resource name in file-system fs. + calcProps := func(name string, fs FileSystem, ls LockSystem, pstats []Propstat) error { + fi, err := fs.Stat(ctx, name) + if err != nil { + return err + } + for _, pst := range pstats { + for i, p := range pst.Props { + switch p.XMLName { + case xml.Name{Space: "DAV:", Local: "getlastmodified"}: + p.InnerXML = []byte(fi.ModTime().UTC().Format(http.TimeFormat)) + pst.Props[i] = p + case xml.Name{Space: "DAV:", Local: "getetag"}: + if fi.IsDir() { + continue + } + etag, err := findETag(ctx, fs, ls, name, fi) + if err != nil { + return err + } + p.InnerXML = []byte(etag) + pst.Props[i] = p + } + } + } + return nil + } + + const ( + lockEntry = `` + + `` + + `` + + `` + + `` + statForbiddenError = `` + ) + + type propOp struct { + op string + name string + pnames []xml.Name + patches []Proppatch + wantPnames []xml.Name + wantPropstats []Propstat + } + + testCases := []struct { + desc string + noDeadProps bool + buildfs []string + propOp []propOp + }{{ + desc: "propname", + buildfs: []string{"mkdir /dir", "touch /file"}, + propOp: []propOp{{ + op: "propname", + name: "/dir", + wantPnames: []xml.Name{ + {Space: "DAV:", Local: "resourcetype"}, + {Space: "DAV:", Local: "displayname"}, + {Space: "DAV:", Local: "supportedlock"}, + {Space: "DAV:", Local: "getlastmodified"}, + }, + }, { + op: "propname", + name: "/file", + wantPnames: []xml.Name{ + {Space: "DAV:", Local: "resourcetype"}, + {Space: "DAV:", Local: "displayname"}, + {Space: "DAV:", Local: "getcontentlength"}, + {Space: "DAV:", Local: "getlastmodified"}, + {Space: "DAV:", Local: "getcontenttype"}, + {Space: "DAV:", Local: "getetag"}, + {Space: "DAV:", Local: "supportedlock"}, + }, + }}, + }, { + desc: "allprop dir and file", + buildfs: []string{"mkdir /dir", "write /file foobarbaz"}, + propOp: []propOp{{ + op: "allprop", + name: "/dir", + wantPropstats: []Propstat{{ + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "DAV:", Local: "resourcetype"}, + InnerXML: []byte(``), + }, { + XMLName: xml.Name{Space: "DAV:", Local: "displayname"}, + InnerXML: []byte("dir"), + }, { + XMLName: xml.Name{Space: "DAV:", Local: "getlastmodified"}, + InnerXML: nil, // Calculated during test. + }, { + XMLName: xml.Name{Space: "DAV:", Local: "supportedlock"}, + InnerXML: []byte(lockEntry), + }}, + }}, + }, { + op: "allprop", + name: "/file", + wantPropstats: []Propstat{{ + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "DAV:", Local: "resourcetype"}, + InnerXML: []byte(""), + }, { + XMLName: xml.Name{Space: "DAV:", Local: "displayname"}, + InnerXML: []byte("file"), + }, { + XMLName: xml.Name{Space: "DAV:", Local: "getcontentlength"}, + InnerXML: []byte("9"), + }, { + XMLName: xml.Name{Space: "DAV:", Local: "getlastmodified"}, + InnerXML: nil, // Calculated during test. + }, { + XMLName: xml.Name{Space: "DAV:", Local: "getcontenttype"}, + InnerXML: []byte("text/plain; charset=utf-8"), + }, { + XMLName: xml.Name{Space: "DAV:", Local: "getetag"}, + InnerXML: nil, // Calculated during test. + }, { + XMLName: xml.Name{Space: "DAV:", Local: "supportedlock"}, + InnerXML: []byte(lockEntry), + }}, + }}, + }, { + op: "allprop", + name: "/file", + pnames: []xml.Name{ + {"DAV:", "resourcetype"}, + {"foo", "bar"}, + }, + wantPropstats: []Propstat{{ + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "DAV:", Local: "resourcetype"}, + InnerXML: []byte(""), + }, { + XMLName: xml.Name{Space: "DAV:", Local: "displayname"}, + InnerXML: []byte("file"), + }, { + XMLName: xml.Name{Space: "DAV:", Local: "getcontentlength"}, + InnerXML: []byte("9"), + }, { + XMLName: xml.Name{Space: "DAV:", Local: "getlastmodified"}, + InnerXML: nil, // Calculated during test. + }, { + XMLName: xml.Name{Space: "DAV:", Local: "getcontenttype"}, + InnerXML: []byte("text/plain; charset=utf-8"), + }, { + XMLName: xml.Name{Space: "DAV:", Local: "getetag"}, + InnerXML: nil, // Calculated during test. + }, { + XMLName: xml.Name{Space: "DAV:", Local: "supportedlock"}, + InnerXML: []byte(lockEntry), + }}}, { + Status: http.StatusNotFound, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + }}}, + }, + }}, + }, { + desc: "propfind DAV:resourcetype", + buildfs: []string{"mkdir /dir", "touch /file"}, + propOp: []propOp{{ + op: "propfind", + name: "/dir", + pnames: []xml.Name{{"DAV:", "resourcetype"}}, + wantPropstats: []Propstat{{ + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "DAV:", Local: "resourcetype"}, + InnerXML: []byte(``), + }}, + }}, + }, { + op: "propfind", + name: "/file", + pnames: []xml.Name{{"DAV:", "resourcetype"}}, + wantPropstats: []Propstat{{ + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "DAV:", Local: "resourcetype"}, + InnerXML: []byte(""), + }}, + }}, + }}, + }, { + desc: "propfind unsupported DAV properties", + buildfs: []string{"mkdir /dir"}, + propOp: []propOp{{ + op: "propfind", + name: "/dir", + pnames: []xml.Name{{"DAV:", "getcontentlanguage"}}, + wantPropstats: []Propstat{{ + Status: http.StatusNotFound, + Props: []Property{{ + XMLName: xml.Name{Space: "DAV:", Local: "getcontentlanguage"}, + }}, + }}, + }, { + op: "propfind", + name: "/dir", + pnames: []xml.Name{{"DAV:", "creationdate"}}, + wantPropstats: []Propstat{{ + Status: http.StatusNotFound, + Props: []Property{{ + XMLName: xml.Name{Space: "DAV:", Local: "creationdate"}, + }}, + }}, + }}, + }, { + desc: "propfind getetag for files but not for directories", + buildfs: []string{"mkdir /dir", "touch /file"}, + propOp: []propOp{{ + op: "propfind", + name: "/dir", + pnames: []xml.Name{{"DAV:", "getetag"}}, + wantPropstats: []Propstat{{ + Status: http.StatusNotFound, + Props: []Property{{ + XMLName: xml.Name{Space: "DAV:", Local: "getetag"}, + }}, + }}, + }, { + op: "propfind", + name: "/file", + pnames: []xml.Name{{"DAV:", "getetag"}}, + wantPropstats: []Propstat{{ + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "DAV:", Local: "getetag"}, + InnerXML: nil, // Calculated during test. + }}, + }}, + }}, + }, { + desc: "proppatch property on no-dead-properties file system", + buildfs: []string{"mkdir /dir"}, + noDeadProps: true, + propOp: []propOp{{ + op: "proppatch", + name: "/dir", + patches: []Proppatch{{ + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + }}, + }}, + wantPropstats: []Propstat{{ + Status: http.StatusForbidden, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + }}, + }}, + }, { + op: "proppatch", + name: "/dir", + patches: []Proppatch{{ + Props: []Property{{ + XMLName: xml.Name{Space: "DAV:", Local: "getetag"}, + }}, + }}, + wantPropstats: []Propstat{{ + Status: http.StatusForbidden, + XMLError: statForbiddenError, + Props: []Property{{ + XMLName: xml.Name{Space: "DAV:", Local: "getetag"}, + }}, + }}, + }}, + }, { + desc: "proppatch dead property", + buildfs: []string{"mkdir /dir"}, + propOp: []propOp{{ + op: "proppatch", + name: "/dir", + patches: []Proppatch{{ + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + InnerXML: []byte("baz"), + }}, + }}, + wantPropstats: []Propstat{{ + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + }}, + }}, + }, { + op: "propfind", + name: "/dir", + pnames: []xml.Name{{Space: "foo", Local: "bar"}}, + wantPropstats: []Propstat{{ + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + InnerXML: []byte("baz"), + }}, + }}, + }}, + }, { + desc: "proppatch dead property with failed dependency", + buildfs: []string{"mkdir /dir"}, + propOp: []propOp{{ + op: "proppatch", + name: "/dir", + patches: []Proppatch{{ + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + InnerXML: []byte("baz"), + }}, + }, { + Props: []Property{{ + XMLName: xml.Name{Space: "DAV:", Local: "displayname"}, + InnerXML: []byte("xxx"), + }}, + }}, + wantPropstats: []Propstat{{ + Status: http.StatusForbidden, + XMLError: statForbiddenError, + Props: []Property{{ + XMLName: xml.Name{Space: "DAV:", Local: "displayname"}, + }}, + }, { + Status: StatusFailedDependency, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + }}, + }}, + }, { + op: "propfind", + name: "/dir", + pnames: []xml.Name{{Space: "foo", Local: "bar"}}, + wantPropstats: []Propstat{{ + Status: http.StatusNotFound, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + }}, + }}, + }}, + }, { + desc: "proppatch remove dead property", + buildfs: []string{"mkdir /dir"}, + propOp: []propOp{{ + op: "proppatch", + name: "/dir", + patches: []Proppatch{{ + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + InnerXML: []byte("baz"), + }, { + XMLName: xml.Name{Space: "spam", Local: "ham"}, + InnerXML: []byte("eggs"), + }}, + }}, + wantPropstats: []Propstat{{ + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + }, { + XMLName: xml.Name{Space: "spam", Local: "ham"}, + }}, + }}, + }, { + op: "propfind", + name: "/dir", + pnames: []xml.Name{ + {Space: "foo", Local: "bar"}, + {Space: "spam", Local: "ham"}, + }, + wantPropstats: []Propstat{{ + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + InnerXML: []byte("baz"), + }, { + XMLName: xml.Name{Space: "spam", Local: "ham"}, + InnerXML: []byte("eggs"), + }}, + }}, + }, { + op: "proppatch", + name: "/dir", + patches: []Proppatch{{ + Remove: true, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + }}, + }}, + wantPropstats: []Propstat{{ + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + }}, + }}, + }, { + op: "propfind", + name: "/dir", + pnames: []xml.Name{ + {Space: "foo", Local: "bar"}, + {Space: "spam", Local: "ham"}, + }, + wantPropstats: []Propstat{{ + Status: http.StatusNotFound, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + }}, + }, { + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "spam", Local: "ham"}, + InnerXML: []byte("eggs"), + }}, + }}, + }}, + }, { + desc: "propname with dead property", + buildfs: []string{"touch /file"}, + propOp: []propOp{{ + op: "proppatch", + name: "/file", + patches: []Proppatch{{ + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + InnerXML: []byte("baz"), + }}, + }}, + wantPropstats: []Propstat{{ + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + }}, + }}, + }, { + op: "propname", + name: "/file", + wantPnames: []xml.Name{ + {Space: "DAV:", Local: "resourcetype"}, + {Space: "DAV:", Local: "displayname"}, + {Space: "DAV:", Local: "getcontentlength"}, + {Space: "DAV:", Local: "getlastmodified"}, + {Space: "DAV:", Local: "getcontenttype"}, + {Space: "DAV:", Local: "getetag"}, + {Space: "DAV:", Local: "supportedlock"}, + {Space: "foo", Local: "bar"}, + }, + }}, + }, { + desc: "proppatch remove unknown dead property", + buildfs: []string{"mkdir /dir"}, + propOp: []propOp{{ + op: "proppatch", + name: "/dir", + patches: []Proppatch{{ + Remove: true, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + }}, + }}, + wantPropstats: []Propstat{{ + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + }}, + }}, + }}, + }, { + desc: "bad: propfind unknown property", + buildfs: []string{"mkdir /dir"}, + propOp: []propOp{{ + op: "propfind", + name: "/dir", + pnames: []xml.Name{{"foo:", "bar"}}, + wantPropstats: []Propstat{{ + Status: http.StatusNotFound, + Props: []Property{{ + XMLName: xml.Name{Space: "foo:", Local: "bar"}, + }}, + }}, + }}, + }} + + for _, tc := range testCases { + fs, err := buildTestFS(tc.buildfs) + if err != nil { + t.Fatalf("%s: cannot create test filesystem: %v", tc.desc, err) + } + if tc.noDeadProps { + fs = noDeadPropsFS{fs} + } + ls := NewMemLS() + for _, op := range tc.propOp { + desc := fmt.Sprintf("%s: %s %s", tc.desc, op.op, op.name) + if err = calcProps(op.name, fs, ls, op.wantPropstats); err != nil { + t.Fatalf("%s: calcProps: %v", desc, err) + } + + // Call property system. + var propstats []Propstat + switch op.op { + case "propname": + pnames, err := propnames(ctx, fs, ls, op.name) + if err != nil { + t.Errorf("%s: got error %v, want nil", desc, err) + continue + } + sort.Sort(byXMLName(pnames)) + sort.Sort(byXMLName(op.wantPnames)) + if !reflect.DeepEqual(pnames, op.wantPnames) { + t.Errorf("%s: pnames\ngot %q\nwant %q", desc, pnames, op.wantPnames) + } + continue + case "allprop": + propstats, err = allprop(ctx, fs, ls, op.name, op.pnames) + case "propfind": + propstats, err = props(ctx, fs, ls, op.name, op.pnames) + case "proppatch": + propstats, err = patch(ctx, fs, ls, op.name, op.patches) + default: + t.Fatalf("%s: %s not implemented", desc, op.op) + } + if err != nil { + t.Errorf("%s: got error %v, want nil", desc, err) + continue + } + // Compare return values from allprop, propfind or proppatch. + for _, pst := range propstats { + sort.Sort(byPropname(pst.Props)) + } + for _, pst := range op.wantPropstats { + sort.Sort(byPropname(pst.Props)) + } + sort.Sort(byStatus(propstats)) + sort.Sort(byStatus(op.wantPropstats)) + if !reflect.DeepEqual(propstats, op.wantPropstats) { + t.Errorf("%s: propstat\ngot %q\nwant %q", desc, propstats, op.wantPropstats) + } + } + } +} + +func cmpXMLName(a, b xml.Name) bool { + if a.Space != b.Space { + return a.Space < b.Space + } + return a.Local < b.Local +} + +type byXMLName []xml.Name + +func (b byXMLName) Len() int { return len(b) } +func (b byXMLName) Swap(i, j int) { b[i], b[j] = b[j], b[i] } +func (b byXMLName) Less(i, j int) bool { return cmpXMLName(b[i], b[j]) } + +type byPropname []Property + +func (b byPropname) Len() int { return len(b) } +func (b byPropname) Swap(i, j int) { b[i], b[j] = b[j], b[i] } +func (b byPropname) Less(i, j int) bool { return cmpXMLName(b[i].XMLName, b[j].XMLName) } + +type byStatus []Propstat + +func (b byStatus) Len() int { return len(b) } +func (b byStatus) Swap(i, j int) { b[i], b[j] = b[j], b[i] } +func (b byStatus) Less(i, j int) bool { return b[i].Status < b[j].Status } + +type noDeadPropsFS struct { + FileSystem +} + +func (fs noDeadPropsFS) OpenFile(ctx context.Context, name string, flag int, perm os.FileMode) (File, error) { + f, err := fs.FileSystem.OpenFile(ctx, name, flag, perm) + if err != nil { + return nil, err + } + return noDeadPropsFile{f}, nil +} + +// noDeadPropsFile wraps a File but strips any optional DeadPropsHolder methods +// provided by the underlying File implementation. +type noDeadPropsFile struct { + f File +} + +func (f noDeadPropsFile) Close() error { return f.f.Close() } +func (f noDeadPropsFile) Read(p []byte) (int, error) { return f.f.Read(p) } +func (f noDeadPropsFile) Readdir(count int) ([]os.FileInfo, error) { return f.f.Readdir(count) } +func (f noDeadPropsFile) Seek(off int64, whence int) (int64, error) { return f.f.Seek(off, whence) } +func (f noDeadPropsFile) Stat() (os.FileInfo, error) { return f.f.Stat() } +func (f noDeadPropsFile) Write(p []byte) (int, error) { return f.f.Write(p) } + +type overrideContentType struct { + os.FileInfo + contentType string + err error +} + +func (o *overrideContentType) ContentType(ctx context.Context) (string, error) { + return o.contentType, o.err +} + +func TestFindContentTypeOverride(t *testing.T) { + fs, err := buildTestFS([]string{"touch /file"}) + if err != nil { + t.Fatalf("cannot create test filesystem: %v", err) + } + ctx := context.Background() + fi, err := fs.Stat(ctx, "/file") + if err != nil { + t.Fatalf("cannot Stat /file: %v", err) + } + + // Check non overridden case + originalContentType, err := findContentType(ctx, fs, nil, "/file", fi) + if err != nil { + t.Fatalf("findContentType /file failed: %v", err) + } + if originalContentType != "text/plain; charset=utf-8" { + t.Fatalf("ContentType wrong want %q got %q", "text/plain; charset=utf-8", originalContentType) + } + + // Now try overriding the ContentType + o := &overrideContentType{fi, "OverriddenContentType", nil} + ContentType, err := findContentType(ctx, fs, nil, "/file", o) + if err != nil { + t.Fatalf("findContentType /file failed: %v", err) + } + if ContentType != o.contentType { + t.Fatalf("ContentType wrong want %q got %q", o.contentType, ContentType) + } + + // Now return ErrNotImplemented and check we get the original content type + o = &overrideContentType{fi, "OverriddenContentType", ErrNotImplemented} + ContentType, err = findContentType(ctx, fs, nil, "/file", o) + if err != nil { + t.Fatalf("findContentType /file failed: %v", err) + } + if ContentType != originalContentType { + t.Fatalf("ContentType wrong want %q got %q", originalContentType, ContentType) + } +} + +type overrideETag struct { + os.FileInfo + eTag string + err error +} + +func (o *overrideETag) ETag(ctx context.Context) (string, error) { + return o.eTag, o.err +} + +func TestFindETagOverride(t *testing.T) { + fs, err := buildTestFS([]string{"touch /file"}) + if err != nil { + t.Fatalf("cannot create test filesystem: %v", err) + } + ctx := context.Background() + fi, err := fs.Stat(ctx, "/file") + if err != nil { + t.Fatalf("cannot Stat /file: %v", err) + } + + // Check non overridden case + originalETag, err := findETag(ctx, fs, nil, "/file", fi) + if err != nil { + t.Fatalf("findETag /file failed: %v", err) + } + matchETag := regexp.MustCompile(`^"-?[0-9a-f]{6,}"$`) + if !matchETag.MatchString(originalETag) { + t.Fatalf("ETag wrong, wanted something matching %v got %q", matchETag, originalETag) + } + + // Now try overriding the ETag + o := &overrideETag{fi, `"OverriddenETag"`, nil} + ETag, err := findETag(ctx, fs, nil, "/file", o) + if err != nil { + t.Fatalf("findETag /file failed: %v", err) + } + if ETag != o.eTag { + t.Fatalf("ETag wrong want %q got %q", o.eTag, ETag) + } + + // Now return ErrNotImplemented and check we get the original Etag + o = &overrideETag{fi, `"OverriddenETag"`, ErrNotImplemented} + ETag, err = findETag(ctx, fs, nil, "/file", o) + if err != nil { + t.Fatalf("findETag /file failed: %v", err) + } + if ETag != originalETag { + t.Fatalf("ETag wrong want %q got %q", originalETag, ETag) + } +} diff --git a/api/vendor/golang.org/x/net/webdav/webdav.go b/api/vendor/golang.org/x/net/webdav/webdav.go new file mode 100644 index 0000000..7b56687 --- /dev/null +++ b/api/vendor/golang.org/x/net/webdav/webdav.go @@ -0,0 +1,702 @@ +// 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 webdav provides a WebDAV server implementation. +package webdav // import "golang.org/x/net/webdav" + +import ( + "errors" + "fmt" + "io" + "net/http" + "net/url" + "os" + "path" + "strings" + "time" +) + +type Handler struct { + // Prefix is the URL path prefix to strip from WebDAV resource paths. + Prefix string + // FileSystem is the virtual file system. + FileSystem FileSystem + // LockSystem is the lock management system. + LockSystem LockSystem + // Logger is an optional error logger. If non-nil, it will be called + // for all HTTP requests. + Logger func(*http.Request, error) +} + +func (h *Handler) stripPrefix(p string) (string, int, error) { + if h.Prefix == "" { + return p, http.StatusOK, nil + } + if r := strings.TrimPrefix(p, h.Prefix); len(r) < len(p) { + return r, http.StatusOK, nil + } + return p, http.StatusNotFound, errPrefixMismatch +} + +func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + status, err := http.StatusBadRequest, errUnsupportedMethod + if h.FileSystem == nil { + status, err = http.StatusInternalServerError, errNoFileSystem + } else if h.LockSystem == nil { + status, err = http.StatusInternalServerError, errNoLockSystem + } else { + switch r.Method { + case "OPTIONS": + status, err = h.handleOptions(w, r) + case "GET", "HEAD", "POST": + status, err = h.handleGetHeadPost(w, r) + case "DELETE": + status, err = h.handleDelete(w, r) + case "PUT": + status, err = h.handlePut(w, r) + case "MKCOL": + status, err = h.handleMkcol(w, r) + case "COPY", "MOVE": + status, err = h.handleCopyMove(w, r) + case "LOCK": + status, err = h.handleLock(w, r) + case "UNLOCK": + status, err = h.handleUnlock(w, r) + case "PROPFIND": + status, err = h.handlePropfind(w, r) + case "PROPPATCH": + status, err = h.handleProppatch(w, r) + } + } + + if status != 0 { + w.WriteHeader(status) + if status != http.StatusNoContent { + w.Write([]byte(StatusText(status))) + } + } + if h.Logger != nil { + h.Logger(r, err) + } +} + +func (h *Handler) lock(now time.Time, root string) (token string, status int, err error) { + token, err = h.LockSystem.Create(now, LockDetails{ + Root: root, + Duration: infiniteTimeout, + ZeroDepth: true, + }) + if err != nil { + if err == ErrLocked { + return "", StatusLocked, err + } + return "", http.StatusInternalServerError, err + } + return token, 0, nil +} + +func (h *Handler) confirmLocks(r *http.Request, src, dst string) (release func(), status int, err error) { + hdr := r.Header.Get("If") + if hdr == "" { + // An empty If header means that the client hasn't previously created locks. + // Even if this client doesn't care about locks, we still need to check that + // the resources aren't locked by another client, so we create temporary + // locks that would conflict with another client's locks. These temporary + // locks are unlocked at the end of the HTTP request. + now, srcToken, dstToken := time.Now(), "", "" + if src != "" { + srcToken, status, err = h.lock(now, src) + if err != nil { + return nil, status, err + } + } + if dst != "" { + dstToken, status, err = h.lock(now, dst) + if err != nil { + if srcToken != "" { + h.LockSystem.Unlock(now, srcToken) + } + return nil, status, err + } + } + + return func() { + if dstToken != "" { + h.LockSystem.Unlock(now, dstToken) + } + if srcToken != "" { + h.LockSystem.Unlock(now, srcToken) + } + }, 0, nil + } + + ih, ok := parseIfHeader(hdr) + if !ok { + return nil, http.StatusBadRequest, errInvalidIfHeader + } + // ih is a disjunction (OR) of ifLists, so any ifList will do. + for _, l := range ih.lists { + lsrc := l.resourceTag + if lsrc == "" { + lsrc = src + } else { + u, err := url.Parse(lsrc) + if err != nil { + continue + } + if u.Host != r.Host { + continue + } + lsrc, status, err = h.stripPrefix(u.Path) + if err != nil { + return nil, status, err + } + } + release, err = h.LockSystem.Confirm(time.Now(), lsrc, dst, l.conditions...) + if err == ErrConfirmationFailed { + continue + } + if err != nil { + return nil, http.StatusInternalServerError, err + } + return release, 0, nil + } + // Section 10.4.1 says that "If this header is evaluated and all state lists + // fail, then the request must fail with a 412 (Precondition Failed) status." + // We follow the spec even though the cond_put_corrupt_token test case from + // the litmus test warns on seeing a 412 instead of a 423 (Locked). + return nil, http.StatusPreconditionFailed, ErrLocked +} + +func (h *Handler) handleOptions(w http.ResponseWriter, r *http.Request) (status int, err error) { + reqPath, status, err := h.stripPrefix(r.URL.Path) + if err != nil { + return status, err + } + ctx := getContext(r) + allow := "OPTIONS, LOCK, PUT, MKCOL" + if fi, err := h.FileSystem.Stat(ctx, reqPath); err == nil { + if fi.IsDir() { + allow = "OPTIONS, LOCK, DELETE, PROPPATCH, COPY, MOVE, UNLOCK, PROPFIND" + } else { + allow = "OPTIONS, LOCK, GET, HEAD, POST, DELETE, PROPPATCH, COPY, MOVE, UNLOCK, PROPFIND, PUT" + } + } + w.Header().Set("Allow", allow) + // http://www.webdav.org/specs/rfc4918.html#dav.compliance.classes + w.Header().Set("DAV", "1, 2") + // http://msdn.microsoft.com/en-au/library/cc250217.aspx + w.Header().Set("MS-Author-Via", "DAV") + return 0, nil +} + +func (h *Handler) handleGetHeadPost(w http.ResponseWriter, r *http.Request) (status int, err error) { + reqPath, status, err := h.stripPrefix(r.URL.Path) + if err != nil { + return status, err + } + // TODO: check locks for read-only access?? + ctx := getContext(r) + f, err := h.FileSystem.OpenFile(ctx, reqPath, os.O_RDONLY, 0) + if err != nil { + return http.StatusNotFound, err + } + defer f.Close() + fi, err := f.Stat() + if err != nil { + return http.StatusNotFound, err + } + if fi.IsDir() { + return http.StatusMethodNotAllowed, nil + } + etag, err := findETag(ctx, h.FileSystem, h.LockSystem, reqPath, fi) + if err != nil { + return http.StatusInternalServerError, err + } + w.Header().Set("ETag", etag) + // Let ServeContent determine the Content-Type header. + http.ServeContent(w, r, reqPath, fi.ModTime(), f) + return 0, nil +} + +func (h *Handler) handleDelete(w http.ResponseWriter, r *http.Request) (status int, err error) { + reqPath, status, err := h.stripPrefix(r.URL.Path) + if err != nil { + return status, err + } + release, status, err := h.confirmLocks(r, reqPath, "") + if err != nil { + return status, err + } + defer release() + + ctx := getContext(r) + + // TODO: return MultiStatus where appropriate. + + // "godoc os RemoveAll" says that "If the path does not exist, RemoveAll + // returns nil (no error)." WebDAV semantics are that it should return a + // "404 Not Found". We therefore have to Stat before we RemoveAll. + if _, err := h.FileSystem.Stat(ctx, reqPath); err != nil { + if os.IsNotExist(err) { + return http.StatusNotFound, err + } + return http.StatusMethodNotAllowed, err + } + if err := h.FileSystem.RemoveAll(ctx, reqPath); err != nil { + return http.StatusMethodNotAllowed, err + } + return http.StatusNoContent, nil +} + +func (h *Handler) handlePut(w http.ResponseWriter, r *http.Request) (status int, err error) { + reqPath, status, err := h.stripPrefix(r.URL.Path) + if err != nil { + return status, err + } + release, status, err := h.confirmLocks(r, reqPath, "") + if err != nil { + return status, err + } + defer release() + // TODO(rost): Support the If-Match, If-None-Match headers? See bradfitz' + // comments in http.checkEtag. + ctx := getContext(r) + + f, err := h.FileSystem.OpenFile(ctx, reqPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) + if err != nil { + return http.StatusNotFound, err + } + _, copyErr := io.Copy(f, r.Body) + fi, statErr := f.Stat() + closeErr := f.Close() + // TODO(rost): Returning 405 Method Not Allowed might not be appropriate. + if copyErr != nil { + return http.StatusMethodNotAllowed, copyErr + } + if statErr != nil { + return http.StatusMethodNotAllowed, statErr + } + if closeErr != nil { + return http.StatusMethodNotAllowed, closeErr + } + etag, err := findETag(ctx, h.FileSystem, h.LockSystem, reqPath, fi) + if err != nil { + return http.StatusInternalServerError, err + } + w.Header().Set("ETag", etag) + return http.StatusCreated, nil +} + +func (h *Handler) handleMkcol(w http.ResponseWriter, r *http.Request) (status int, err error) { + reqPath, status, err := h.stripPrefix(r.URL.Path) + if err != nil { + return status, err + } + release, status, err := h.confirmLocks(r, reqPath, "") + if err != nil { + return status, err + } + defer release() + + ctx := getContext(r) + + if r.ContentLength > 0 { + return http.StatusUnsupportedMediaType, nil + } + if err := h.FileSystem.Mkdir(ctx, reqPath, 0777); err != nil { + if os.IsNotExist(err) { + return http.StatusConflict, err + } + return http.StatusMethodNotAllowed, err + } + return http.StatusCreated, nil +} + +func (h *Handler) handleCopyMove(w http.ResponseWriter, r *http.Request) (status int, err error) { + hdr := r.Header.Get("Destination") + if hdr == "" { + return http.StatusBadRequest, errInvalidDestination + } + u, err := url.Parse(hdr) + if err != nil { + return http.StatusBadRequest, errInvalidDestination + } + if u.Host != r.Host { + return http.StatusBadGateway, errInvalidDestination + } + + src, status, err := h.stripPrefix(r.URL.Path) + if err != nil { + return status, err + } + + dst, status, err := h.stripPrefix(u.Path) + if err != nil { + return status, err + } + + if dst == "" { + return http.StatusBadGateway, errInvalidDestination + } + if dst == src { + return http.StatusForbidden, errDestinationEqualsSource + } + + ctx := getContext(r) + + if r.Method == "COPY" { + // Section 7.5.1 says that a COPY only needs to lock the destination, + // not both destination and source. Strictly speaking, this is racy, + // even though a COPY doesn't modify the source, if a concurrent + // operation modifies the source. However, the litmus test explicitly + // checks that COPYing a locked-by-another source is OK. + release, status, err := h.confirmLocks(r, "", dst) + if err != nil { + return status, err + } + defer release() + + // Section 9.8.3 says that "The COPY method on a collection without a Depth + // header must act as if a Depth header with value "infinity" was included". + depth := infiniteDepth + if hdr := r.Header.Get("Depth"); hdr != "" { + depth = parseDepth(hdr) + if depth != 0 && depth != infiniteDepth { + // Section 9.8.3 says that "A client may submit a Depth header on a + // COPY on a collection with a value of "0" or "infinity"." + return http.StatusBadRequest, errInvalidDepth + } + } + return copyFiles(ctx, h.FileSystem, src, dst, r.Header.Get("Overwrite") != "F", depth, 0) + } + + release, status, err := h.confirmLocks(r, src, dst) + if err != nil { + return status, err + } + defer release() + + // Section 9.9.2 says that "The MOVE method on a collection must act as if + // a "Depth: infinity" header was used on it. A client must not submit a + // Depth header on a MOVE on a collection with any value but "infinity"." + if hdr := r.Header.Get("Depth"); hdr != "" { + if parseDepth(hdr) != infiniteDepth { + return http.StatusBadRequest, errInvalidDepth + } + } + return moveFiles(ctx, h.FileSystem, src, dst, r.Header.Get("Overwrite") == "T") +} + +func (h *Handler) handleLock(w http.ResponseWriter, r *http.Request) (retStatus int, retErr error) { + duration, err := parseTimeout(r.Header.Get("Timeout")) + if err != nil { + return http.StatusBadRequest, err + } + li, status, err := readLockInfo(r.Body) + if err != nil { + return status, err + } + + ctx := getContext(r) + token, ld, now, created := "", LockDetails{}, time.Now(), false + if li == (lockInfo{}) { + // An empty lockInfo means to refresh the lock. + ih, ok := parseIfHeader(r.Header.Get("If")) + if !ok { + return http.StatusBadRequest, errInvalidIfHeader + } + if len(ih.lists) == 1 && len(ih.lists[0].conditions) == 1 { + token = ih.lists[0].conditions[0].Token + } + if token == "" { + return http.StatusBadRequest, errInvalidLockToken + } + ld, err = h.LockSystem.Refresh(now, token, duration) + if err != nil { + if err == ErrNoSuchLock { + return http.StatusPreconditionFailed, err + } + return http.StatusInternalServerError, err + } + + } else { + // Section 9.10.3 says that "If no Depth header is submitted on a LOCK request, + // then the request MUST act as if a "Depth:infinity" had been submitted." + depth := infiniteDepth + if hdr := r.Header.Get("Depth"); hdr != "" { + depth = parseDepth(hdr) + if depth != 0 && depth != infiniteDepth { + // Section 9.10.3 says that "Values other than 0 or infinity must not be + // used with the Depth header on a LOCK method". + return http.StatusBadRequest, errInvalidDepth + } + } + reqPath, status, err := h.stripPrefix(r.URL.Path) + if err != nil { + return status, err + } + ld = LockDetails{ + Root: reqPath, + Duration: duration, + OwnerXML: li.Owner.InnerXML, + ZeroDepth: depth == 0, + } + token, err = h.LockSystem.Create(now, ld) + if err != nil { + if err == ErrLocked { + return StatusLocked, err + } + return http.StatusInternalServerError, err + } + defer func() { + if retErr != nil { + h.LockSystem.Unlock(now, token) + } + }() + + // Create the resource if it didn't previously exist. + if _, err := h.FileSystem.Stat(ctx, reqPath); err != nil { + f, err := h.FileSystem.OpenFile(ctx, reqPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) + if err != nil { + // TODO: detect missing intermediate dirs and return http.StatusConflict? + return http.StatusInternalServerError, err + } + f.Close() + created = true + } + + // http://www.webdav.org/specs/rfc4918.html#HEADER_Lock-Token says that the + // Lock-Token value is a Coded-URL. We add angle brackets. + w.Header().Set("Lock-Token", "<"+token+">") + } + + w.Header().Set("Content-Type", "application/xml; charset=utf-8") + if created { + // This is "w.WriteHeader(http.StatusCreated)" and not "return + // http.StatusCreated, nil" because we write our own (XML) response to w + // and Handler.ServeHTTP would otherwise write "Created". + w.WriteHeader(http.StatusCreated) + } + writeLockInfo(w, token, ld) + return 0, nil +} + +func (h *Handler) handleUnlock(w http.ResponseWriter, r *http.Request) (status int, err error) { + // http://www.webdav.org/specs/rfc4918.html#HEADER_Lock-Token says that the + // Lock-Token value is a Coded-URL. We strip its angle brackets. + t := r.Header.Get("Lock-Token") + if len(t) < 2 || t[0] != '<' || t[len(t)-1] != '>' { + return http.StatusBadRequest, errInvalidLockToken + } + t = t[1 : len(t)-1] + + switch err = h.LockSystem.Unlock(time.Now(), t); err { + case nil: + return http.StatusNoContent, err + case ErrForbidden: + return http.StatusForbidden, err + case ErrLocked: + return StatusLocked, err + case ErrNoSuchLock: + return http.StatusConflict, err + default: + return http.StatusInternalServerError, err + } +} + +func (h *Handler) handlePropfind(w http.ResponseWriter, r *http.Request) (status int, err error) { + reqPath, status, err := h.stripPrefix(r.URL.Path) + if err != nil { + return status, err + } + ctx := getContext(r) + fi, err := h.FileSystem.Stat(ctx, reqPath) + if err != nil { + if os.IsNotExist(err) { + return http.StatusNotFound, err + } + return http.StatusMethodNotAllowed, err + } + depth := infiniteDepth + if hdr := r.Header.Get("Depth"); hdr != "" { + depth = parseDepth(hdr) + if depth == invalidDepth { + return http.StatusBadRequest, errInvalidDepth + } + } + pf, status, err := readPropfind(r.Body) + if err != nil { + return status, err + } + + mw := multistatusWriter{w: w} + + walkFn := func(reqPath string, info os.FileInfo, err error) error { + if err != nil { + return err + } + var pstats []Propstat + if pf.Propname != nil { + pnames, err := propnames(ctx, h.FileSystem, h.LockSystem, reqPath) + if err != nil { + return err + } + pstat := Propstat{Status: http.StatusOK} + for _, xmlname := range pnames { + pstat.Props = append(pstat.Props, Property{XMLName: xmlname}) + } + pstats = append(pstats, pstat) + } else if pf.Allprop != nil { + pstats, err = allprop(ctx, h.FileSystem, h.LockSystem, reqPath, pf.Prop) + } else { + pstats, err = props(ctx, h.FileSystem, h.LockSystem, reqPath, pf.Prop) + } + if err != nil { + return err + } + return mw.write(makePropstatResponse(path.Join(h.Prefix, reqPath), pstats)) + } + + walkErr := walkFS(ctx, h.FileSystem, depth, reqPath, fi, walkFn) + closeErr := mw.close() + if walkErr != nil { + return http.StatusInternalServerError, walkErr + } + if closeErr != nil { + return http.StatusInternalServerError, closeErr + } + return 0, nil +} + +func (h *Handler) handleProppatch(w http.ResponseWriter, r *http.Request) (status int, err error) { + reqPath, status, err := h.stripPrefix(r.URL.Path) + if err != nil { + return status, err + } + release, status, err := h.confirmLocks(r, reqPath, "") + if err != nil { + return status, err + } + defer release() + + ctx := getContext(r) + + if _, err := h.FileSystem.Stat(ctx, reqPath); err != nil { + if os.IsNotExist(err) { + return http.StatusNotFound, err + } + return http.StatusMethodNotAllowed, err + } + patches, status, err := readProppatch(r.Body) + if err != nil { + return status, err + } + pstats, err := patch(ctx, h.FileSystem, h.LockSystem, reqPath, patches) + if err != nil { + return http.StatusInternalServerError, err + } + mw := multistatusWriter{w: w} + writeErr := mw.write(makePropstatResponse(r.URL.Path, pstats)) + closeErr := mw.close() + if writeErr != nil { + return http.StatusInternalServerError, writeErr + } + if closeErr != nil { + return http.StatusInternalServerError, closeErr + } + return 0, nil +} + +func makePropstatResponse(href string, pstats []Propstat) *response { + resp := response{ + Href: []string{(&url.URL{Path: href}).EscapedPath()}, + Propstat: make([]propstat, 0, len(pstats)), + } + for _, p := range pstats { + var xmlErr *xmlError + if p.XMLError != "" { + xmlErr = &xmlError{InnerXML: []byte(p.XMLError)} + } + resp.Propstat = append(resp.Propstat, propstat{ + Status: fmt.Sprintf("HTTP/1.1 %d %s", p.Status, StatusText(p.Status)), + Prop: p.Props, + ResponseDescription: p.ResponseDescription, + Error: xmlErr, + }) + } + return &resp +} + +const ( + infiniteDepth = -1 + invalidDepth = -2 +) + +// parseDepth maps the strings "0", "1" and "infinity" to 0, 1 and +// infiniteDepth. Parsing any other string returns invalidDepth. +// +// Different WebDAV methods have further constraints on valid depths: +// - PROPFIND has no further restrictions, as per section 9.1. +// - COPY accepts only "0" or "infinity", as per section 9.8.3. +// - MOVE accepts only "infinity", as per section 9.9.2. +// - LOCK accepts only "0" or "infinity", as per section 9.10.3. +// These constraints are enforced by the handleXxx methods. +func parseDepth(s string) int { + switch s { + case "0": + return 0 + case "1": + return 1 + case "infinity": + return infiniteDepth + } + return invalidDepth +} + +// http://www.webdav.org/specs/rfc4918.html#status.code.extensions.to.http11 +const ( + StatusMulti = 207 + StatusUnprocessableEntity = 422 + StatusLocked = 423 + StatusFailedDependency = 424 + StatusInsufficientStorage = 507 +) + +func StatusText(code int) string { + switch code { + case StatusMulti: + return "Multi-Status" + case StatusUnprocessableEntity: + return "Unprocessable Entity" + case StatusLocked: + return "Locked" + case StatusFailedDependency: + return "Failed Dependency" + case StatusInsufficientStorage: + return "Insufficient Storage" + } + return http.StatusText(code) +} + +var ( + errDestinationEqualsSource = errors.New("webdav: destination equals source") + errDirectoryNotEmpty = errors.New("webdav: directory not empty") + errInvalidDepth = errors.New("webdav: invalid depth") + errInvalidDestination = errors.New("webdav: invalid destination") + errInvalidIfHeader = errors.New("webdav: invalid If header") + errInvalidLockInfo = errors.New("webdav: invalid lock info") + errInvalidLockToken = errors.New("webdav: invalid lock token") + errInvalidPropfind = errors.New("webdav: invalid propfind") + errInvalidProppatch = errors.New("webdav: invalid proppatch") + errInvalidResponse = errors.New("webdav: invalid response") + errInvalidTimeout = errors.New("webdav: invalid timeout") + errNoFileSystem = errors.New("webdav: no file system") + errNoLockSystem = errors.New("webdav: no lock system") + errNotADirectory = errors.New("webdav: not a directory") + errPrefixMismatch = errors.New("webdav: prefix mismatch") + errRecursionTooDeep = errors.New("webdav: recursion too deep") + errUnsupportedLockInfo = errors.New("webdav: unsupported lock info") + errUnsupportedMethod = errors.New("webdav: unsupported method") +) diff --git a/api/vendor/golang.org/x/net/webdav/webdav_test.go b/api/vendor/golang.org/x/net/webdav/webdav_test.go new file mode 100644 index 0000000..25e0d54 --- /dev/null +++ b/api/vendor/golang.org/x/net/webdav/webdav_test.go @@ -0,0 +1,344 @@ +// Copyright 2015 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 webdav + +import ( + "errors" + "fmt" + "io" + "io/ioutil" + "net/http" + "net/http/httptest" + "net/url" + "os" + "reflect" + "regexp" + "sort" + "strings" + "testing" + + "golang.org/x/net/context" +) + +// TODO: add tests to check XML responses with the expected prefix path +func TestPrefix(t *testing.T) { + const dst, blah = "Destination", "blah blah blah" + + // createLockBody comes from the example in Section 9.10.7. + const createLockBody = ` + + + + + http://example.org/~ejw/contact.html + + + ` + + do := func(method, urlStr string, body string, wantStatusCode int, headers ...string) (http.Header, error) { + var bodyReader io.Reader + if body != "" { + bodyReader = strings.NewReader(body) + } + req, err := http.NewRequest(method, urlStr, bodyReader) + if err != nil { + return nil, err + } + for len(headers) >= 2 { + req.Header.Add(headers[0], headers[1]) + headers = headers[2:] + } + res, err := http.DefaultTransport.RoundTrip(req) + if err != nil { + return nil, err + } + defer res.Body.Close() + if res.StatusCode != wantStatusCode { + return nil, fmt.Errorf("got status code %d, want %d", res.StatusCode, wantStatusCode) + } + return res.Header, nil + } + + prefixes := []string{ + "/", + "/a/", + "/a/b/", + "/a/b/c/", + } + ctx := context.Background() + for _, prefix := range prefixes { + fs := NewMemFS() + h := &Handler{ + FileSystem: fs, + LockSystem: NewMemLS(), + } + mux := http.NewServeMux() + if prefix != "/" { + h.Prefix = prefix + } + mux.Handle(prefix, h) + srv := httptest.NewServer(mux) + defer srv.Close() + + // The script is: + // MKCOL /a + // MKCOL /a/b + // PUT /a/b/c + // COPY /a/b/c /a/b/d + // MKCOL /a/b/e + // MOVE /a/b/d /a/b/e/f + // LOCK /a/b/e/g + // PUT /a/b/e/g + // which should yield the (possibly stripped) filenames /a/b/c, + // /a/b/e/f and /a/b/e/g, plus their parent directories. + + wantA := map[string]int{ + "/": http.StatusCreated, + "/a/": http.StatusMovedPermanently, + "/a/b/": http.StatusNotFound, + "/a/b/c/": http.StatusNotFound, + }[prefix] + if _, err := do("MKCOL", srv.URL+"/a", "", wantA); err != nil { + t.Errorf("prefix=%-9q MKCOL /a: %v", prefix, err) + continue + } + + wantB := map[string]int{ + "/": http.StatusCreated, + "/a/": http.StatusCreated, + "/a/b/": http.StatusMovedPermanently, + "/a/b/c/": http.StatusNotFound, + }[prefix] + if _, err := do("MKCOL", srv.URL+"/a/b", "", wantB); err != nil { + t.Errorf("prefix=%-9q MKCOL /a/b: %v", prefix, err) + continue + } + + wantC := map[string]int{ + "/": http.StatusCreated, + "/a/": http.StatusCreated, + "/a/b/": http.StatusCreated, + "/a/b/c/": http.StatusMovedPermanently, + }[prefix] + if _, err := do("PUT", srv.URL+"/a/b/c", blah, wantC); err != nil { + t.Errorf("prefix=%-9q PUT /a/b/c: %v", prefix, err) + continue + } + + wantD := map[string]int{ + "/": http.StatusCreated, + "/a/": http.StatusCreated, + "/a/b/": http.StatusCreated, + "/a/b/c/": http.StatusMovedPermanently, + }[prefix] + if _, err := do("COPY", srv.URL+"/a/b/c", "", wantD, dst, srv.URL+"/a/b/d"); err != nil { + t.Errorf("prefix=%-9q COPY /a/b/c /a/b/d: %v", prefix, err) + continue + } + + wantE := map[string]int{ + "/": http.StatusCreated, + "/a/": http.StatusCreated, + "/a/b/": http.StatusCreated, + "/a/b/c/": http.StatusNotFound, + }[prefix] + if _, err := do("MKCOL", srv.URL+"/a/b/e", "", wantE); err != nil { + t.Errorf("prefix=%-9q MKCOL /a/b/e: %v", prefix, err) + continue + } + + wantF := map[string]int{ + "/": http.StatusCreated, + "/a/": http.StatusCreated, + "/a/b/": http.StatusCreated, + "/a/b/c/": http.StatusNotFound, + }[prefix] + if _, err := do("MOVE", srv.URL+"/a/b/d", "", wantF, dst, srv.URL+"/a/b/e/f"); err != nil { + t.Errorf("prefix=%-9q MOVE /a/b/d /a/b/e/f: %v", prefix, err) + continue + } + + var lockToken string + wantG := map[string]int{ + "/": http.StatusCreated, + "/a/": http.StatusCreated, + "/a/b/": http.StatusCreated, + "/a/b/c/": http.StatusNotFound, + }[prefix] + if h, err := do("LOCK", srv.URL+"/a/b/e/g", createLockBody, wantG); err != nil { + t.Errorf("prefix=%-9q LOCK /a/b/e/g: %v", prefix, err) + continue + } else { + lockToken = h.Get("Lock-Token") + } + + ifHeader := fmt.Sprintf("<%s/a/b/e/g> (%s)", srv.URL, lockToken) + wantH := map[string]int{ + "/": http.StatusCreated, + "/a/": http.StatusCreated, + "/a/b/": http.StatusCreated, + "/a/b/c/": http.StatusNotFound, + }[prefix] + if _, err := do("PUT", srv.URL+"/a/b/e/g", blah, wantH, "If", ifHeader); err != nil { + t.Errorf("prefix=%-9q PUT /a/b/e/g: %v", prefix, err) + continue + } + + got, err := find(ctx, nil, fs, "/") + if err != nil { + t.Errorf("prefix=%-9q find: %v", prefix, err) + continue + } + sort.Strings(got) + want := map[string][]string{ + "/": {"/", "/a", "/a/b", "/a/b/c", "/a/b/e", "/a/b/e/f", "/a/b/e/g"}, + "/a/": {"/", "/b", "/b/c", "/b/e", "/b/e/f", "/b/e/g"}, + "/a/b/": {"/", "/c", "/e", "/e/f", "/e/g"}, + "/a/b/c/": {"/"}, + }[prefix] + if !reflect.DeepEqual(got, want) { + t.Errorf("prefix=%-9q find:\ngot %v\nwant %v", prefix, got, want) + continue + } + } +} + +func TestEscapeXML(t *testing.T) { + // These test cases aren't exhaustive, and there is more than one way to + // escape e.g. a quot (as """ or """) or an apos. We presume that + // the encoding/xml package tests xml.EscapeText more thoroughly. This test + // here is just a sanity check for this package's escapeXML function, and + // its attempt to provide a fast path (and avoid a bytes.Buffer allocation) + // when escaping filenames is obviously a no-op. + testCases := map[string]string{ + "": "", + " ": " ", + "&": "&", + "*": "*", + "+": "+", + ",": ",", + "-": "-", + ".": ".", + "/": "/", + "0": "0", + "9": "9", + ":": ":", + "<": "<", + ">": ">", + "A": "A", + "_": "_", + "a": "a", + "~": "~", + "\u0201": "\u0201", + "&": "&amp;", + "foo&baz": "foo&<b/ar>baz", + } + + for in, want := range testCases { + if got := escapeXML(in); got != want { + t.Errorf("in=%q: got %q, want %q", in, got, want) + } + } +} + +func TestFilenameEscape(t *testing.T) { + hrefRe := regexp.MustCompile(`([^<]*)`) + displayNameRe := regexp.MustCompile(`([^<]*)`) + do := func(method, urlStr string) (string, string, error) { + req, err := http.NewRequest(method, urlStr, nil) + if err != nil { + return "", "", err + } + res, err := http.DefaultClient.Do(req) + if err != nil { + return "", "", err + } + defer res.Body.Close() + + b, err := ioutil.ReadAll(res.Body) + if err != nil { + return "", "", err + } + hrefMatch := hrefRe.FindStringSubmatch(string(b)) + if len(hrefMatch) != 2 { + return "", "", errors.New("D:href not found") + } + displayNameMatch := displayNameRe.FindStringSubmatch(string(b)) + if len(displayNameMatch) != 2 { + return "", "", errors.New("D:displayname not found") + } + + return hrefMatch[1], displayNameMatch[1], nil + } + + testCases := []struct { + name, wantHref, wantDisplayName string + }{{ + name: `/foo%bar`, + wantHref: `/foo%25bar`, + wantDisplayName: `foo%bar`, + }, { + name: `/こんにちわ世界`, + wantHref: `/%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%82%8F%E4%B8%96%E7%95%8C`, + wantDisplayName: `こんにちわ世界`, + }, { + name: `/Program Files/`, + wantHref: `/Program%20Files`, + wantDisplayName: `Program Files`, + }, { + name: `/go+lang`, + wantHref: `/go+lang`, + wantDisplayName: `go+lang`, + }, { + name: `/go&lang`, + wantHref: `/go&lang`, + wantDisplayName: `go&lang`, + }, { + name: `/goexclusive"` + Shared *struct{} `xml:"lockscope>shared"` + Write *struct{} `xml:"locktype>write"` + Owner owner `xml:"owner"` +} + +// http://www.webdav.org/specs/rfc4918.html#ELEMENT_owner +type owner struct { + InnerXML string `xml:",innerxml"` +} + +func readLockInfo(r io.Reader) (li lockInfo, status int, err error) { + c := &countingReader{r: r} + if err = ixml.NewDecoder(c).Decode(&li); err != nil { + if err == io.EOF { + if c.n == 0 { + // An empty body means to refresh the lock. + // http://www.webdav.org/specs/rfc4918.html#refreshing-locks + return lockInfo{}, 0, nil + } + err = errInvalidLockInfo + } + return lockInfo{}, http.StatusBadRequest, err + } + // We only support exclusive (non-shared) write locks. In practice, these are + // the only types of locks that seem to matter. + if li.Exclusive == nil || li.Shared != nil || li.Write == nil { + return lockInfo{}, http.StatusNotImplemented, errUnsupportedLockInfo + } + return li, 0, nil +} + +type countingReader struct { + n int + r io.Reader +} + +func (c *countingReader) Read(p []byte) (int, error) { + n, err := c.r.Read(p) + c.n += n + return n, err +} + +func writeLockInfo(w io.Writer, token string, ld LockDetails) (int, error) { + depth := "infinity" + if ld.ZeroDepth { + depth = "0" + } + timeout := ld.Duration / time.Second + return fmt.Fprintf(w, "\n"+ + "\n"+ + " \n"+ + " \n"+ + " %s\n"+ + " %s\n"+ + " Second-%d\n"+ + " %s\n"+ + " %s\n"+ + "", + depth, ld.OwnerXML, timeout, escape(token), escape(ld.Root), + ) +} + +func escape(s string) string { + for i := 0; i < len(s); i++ { + switch s[i] { + case '"', '&', '\'', '<', '>': + b := bytes.NewBuffer(nil) + ixml.EscapeText(b, []byte(s)) + return b.String() + } + } + return s +} + +// Next returns the next token, if any, in the XML stream of d. +// RFC 4918 requires to ignore comments, processing instructions +// and directives. +// http://www.webdav.org/specs/rfc4918.html#property_values +// http://www.webdav.org/specs/rfc4918.html#xml-extensibility +func next(d *ixml.Decoder) (ixml.Token, error) { + for { + t, err := d.Token() + if err != nil { + return t, err + } + switch t.(type) { + case ixml.Comment, ixml.Directive, ixml.ProcInst: + continue + default: + return t, nil + } + } +} + +// http://www.webdav.org/specs/rfc4918.html#ELEMENT_prop (for propfind) +type propfindProps []xml.Name + +// UnmarshalXML appends the property names enclosed within start to pn. +// +// It returns an error if start does not contain any properties or if +// properties contain values. Character data between properties is ignored. +func (pn *propfindProps) UnmarshalXML(d *ixml.Decoder, start ixml.StartElement) error { + for { + t, err := next(d) + if err != nil { + return err + } + switch t.(type) { + case ixml.EndElement: + if len(*pn) == 0 { + return fmt.Errorf("%s must not be empty", start.Name.Local) + } + return nil + case ixml.StartElement: + name := t.(ixml.StartElement).Name + t, err = next(d) + if err != nil { + return err + } + if _, ok := t.(ixml.EndElement); !ok { + return fmt.Errorf("unexpected token %T", t) + } + *pn = append(*pn, xml.Name(name)) + } + } +} + +// http://www.webdav.org/specs/rfc4918.html#ELEMENT_propfind +type propfind struct { + XMLName ixml.Name `xml:"DAV: propfind"` + Allprop *struct{} `xml:"DAV: allprop"` + Propname *struct{} `xml:"DAV: propname"` + Prop propfindProps `xml:"DAV: prop"` + Include propfindProps `xml:"DAV: include"` +} + +func readPropfind(r io.Reader) (pf propfind, status int, err error) { + c := countingReader{r: r} + if err = ixml.NewDecoder(&c).Decode(&pf); err != nil { + if err == io.EOF { + if c.n == 0 { + // An empty body means to propfind allprop. + // http://www.webdav.org/specs/rfc4918.html#METHOD_PROPFIND + return propfind{Allprop: new(struct{})}, 0, nil + } + err = errInvalidPropfind + } + return propfind{}, http.StatusBadRequest, err + } + + if pf.Allprop == nil && pf.Include != nil { + return propfind{}, http.StatusBadRequest, errInvalidPropfind + } + if pf.Allprop != nil && (pf.Prop != nil || pf.Propname != nil) { + return propfind{}, http.StatusBadRequest, errInvalidPropfind + } + if pf.Prop != nil && pf.Propname != nil { + return propfind{}, http.StatusBadRequest, errInvalidPropfind + } + if pf.Propname == nil && pf.Allprop == nil && pf.Prop == nil { + return propfind{}, http.StatusBadRequest, errInvalidPropfind + } + return pf, 0, nil +} + +// Property represents a single DAV resource property as defined in RFC 4918. +// See http://www.webdav.org/specs/rfc4918.html#data.model.for.resource.properties +type Property struct { + // XMLName is the fully qualified name that identifies this property. + XMLName xml.Name + + // Lang is an optional xml:lang attribute. + Lang string `xml:"xml:lang,attr,omitempty"` + + // InnerXML contains the XML representation of the property value. + // See http://www.webdav.org/specs/rfc4918.html#property_values + // + // Property values of complex type or mixed-content must have fully + // expanded XML namespaces or be self-contained with according + // XML namespace declarations. They must not rely on any XML + // namespace declarations within the scope of the XML document, + // even including the DAV: namespace. + InnerXML []byte `xml:",innerxml"` +} + +// ixmlProperty is the same as the Property type except it holds an ixml.Name +// instead of an xml.Name. +type ixmlProperty struct { + XMLName ixml.Name + Lang string `xml:"xml:lang,attr,omitempty"` + InnerXML []byte `xml:",innerxml"` +} + +// http://www.webdav.org/specs/rfc4918.html#ELEMENT_error +// See multistatusWriter for the "D:" namespace prefix. +type xmlError struct { + XMLName ixml.Name `xml:"D:error"` + InnerXML []byte `xml:",innerxml"` +} + +// http://www.webdav.org/specs/rfc4918.html#ELEMENT_propstat +// See multistatusWriter for the "D:" namespace prefix. +type propstat struct { + Prop []Property `xml:"D:prop>_ignored_"` + Status string `xml:"D:status"` + Error *xmlError `xml:"D:error"` + ResponseDescription string `xml:"D:responsedescription,omitempty"` +} + +// ixmlPropstat is the same as the propstat type except it holds an ixml.Name +// instead of an xml.Name. +type ixmlPropstat struct { + Prop []ixmlProperty `xml:"D:prop>_ignored_"` + Status string `xml:"D:status"` + Error *xmlError `xml:"D:error"` + ResponseDescription string `xml:"D:responsedescription,omitempty"` +} + +// MarshalXML prepends the "D:" namespace prefix on properties in the DAV: namespace +// before encoding. See multistatusWriter. +func (ps propstat) MarshalXML(e *ixml.Encoder, start ixml.StartElement) error { + // Convert from a propstat to an ixmlPropstat. + ixmlPs := ixmlPropstat{ + Prop: make([]ixmlProperty, len(ps.Prop)), + Status: ps.Status, + Error: ps.Error, + ResponseDescription: ps.ResponseDescription, + } + for k, prop := range ps.Prop { + ixmlPs.Prop[k] = ixmlProperty{ + XMLName: ixml.Name(prop.XMLName), + Lang: prop.Lang, + InnerXML: prop.InnerXML, + } + } + + for k, prop := range ixmlPs.Prop { + if prop.XMLName.Space == "DAV:" { + prop.XMLName = ixml.Name{Space: "", Local: "D:" + prop.XMLName.Local} + ixmlPs.Prop[k] = prop + } + } + // Distinct type to avoid infinite recursion of MarshalXML. + type newpropstat ixmlPropstat + return e.EncodeElement(newpropstat(ixmlPs), start) +} + +// http://www.webdav.org/specs/rfc4918.html#ELEMENT_response +// See multistatusWriter for the "D:" namespace prefix. +type response struct { + XMLName ixml.Name `xml:"D:response"` + Href []string `xml:"D:href"` + Propstat []propstat `xml:"D:propstat"` + Status string `xml:"D:status,omitempty"` + Error *xmlError `xml:"D:error"` + ResponseDescription string `xml:"D:responsedescription,omitempty"` +} + +// MultistatusWriter marshals one or more Responses into a XML +// multistatus response. +// See http://www.webdav.org/specs/rfc4918.html#ELEMENT_multistatus +// TODO(rsto, mpl): As a workaround, the "D:" namespace prefix, defined as +// "DAV:" on this element, is prepended on the nested response, as well as on all +// its nested elements. All property names in the DAV: namespace are prefixed as +// well. This is because some versions of Mini-Redirector (on windows 7) ignore +// elements with a default namespace (no prefixed namespace). A less intrusive fix +// should be possible after golang.org/cl/11074. See https://golang.org/issue/11177 +type multistatusWriter struct { + // ResponseDescription contains the optional responsedescription + // of the multistatus XML element. Only the latest content before + // close will be emitted. Empty response descriptions are not + // written. + responseDescription string + + w http.ResponseWriter + enc *ixml.Encoder +} + +// Write validates and emits a DAV response as part of a multistatus response +// element. +// +// It sets the HTTP status code of its underlying http.ResponseWriter to 207 +// (Multi-Status) and populates the Content-Type header. If r is the +// first, valid response to be written, Write prepends the XML representation +// of r with a multistatus tag. Callers must call close after the last response +// has been written. +func (w *multistatusWriter) write(r *response) error { + switch len(r.Href) { + case 0: + return errInvalidResponse + case 1: + if len(r.Propstat) > 0 != (r.Status == "") { + return errInvalidResponse + } + default: + if len(r.Propstat) > 0 || r.Status == "" { + return errInvalidResponse + } + } + err := w.writeHeader() + if err != nil { + return err + } + return w.enc.Encode(r) +} + +// writeHeader writes a XML multistatus start element on w's underlying +// http.ResponseWriter and returns the result of the write operation. +// After the first write attempt, writeHeader becomes a no-op. +func (w *multistatusWriter) writeHeader() error { + if w.enc != nil { + return nil + } + w.w.Header().Add("Content-Type", "text/xml; charset=utf-8") + w.w.WriteHeader(StatusMulti) + _, err := fmt.Fprintf(w.w, ``) + if err != nil { + return err + } + w.enc = ixml.NewEncoder(w.w) + return w.enc.EncodeToken(ixml.StartElement{ + Name: ixml.Name{ + Space: "DAV:", + Local: "multistatus", + }, + Attr: []ixml.Attr{{ + Name: ixml.Name{Space: "xmlns", Local: "D"}, + Value: "DAV:", + }}, + }) +} + +// Close completes the marshalling of the multistatus response. It returns +// an error if the multistatus response could not be completed. If both the +// return value and field enc of w are nil, then no multistatus response has +// been written. +func (w *multistatusWriter) close() error { + if w.enc == nil { + return nil + } + var end []ixml.Token + if w.responseDescription != "" { + name := ixml.Name{Space: "DAV:", Local: "responsedescription"} + end = append(end, + ixml.StartElement{Name: name}, + ixml.CharData(w.responseDescription), + ixml.EndElement{Name: name}, + ) + } + end = append(end, ixml.EndElement{ + Name: ixml.Name{Space: "DAV:", Local: "multistatus"}, + }) + for _, t := range end { + err := w.enc.EncodeToken(t) + if err != nil { + return err + } + } + return w.enc.Flush() +} + +var xmlLangName = ixml.Name{Space: "http://www.w3.org/XML/1998/namespace", Local: "lang"} + +func xmlLang(s ixml.StartElement, d string) string { + for _, attr := range s.Attr { + if attr.Name == xmlLangName { + return attr.Value + } + } + return d +} + +type xmlValue []byte + +func (v *xmlValue) UnmarshalXML(d *ixml.Decoder, start ixml.StartElement) error { + // The XML value of a property can be arbitrary, mixed-content XML. + // To make sure that the unmarshalled value contains all required + // namespaces, we encode all the property value XML tokens into a + // buffer. This forces the encoder to redeclare any used namespaces. + var b bytes.Buffer + e := ixml.NewEncoder(&b) + for { + t, err := next(d) + if err != nil { + return err + } + if e, ok := t.(ixml.EndElement); ok && e.Name == start.Name { + break + } + if err = e.EncodeToken(t); err != nil { + return err + } + } + err := e.Flush() + if err != nil { + return err + } + *v = b.Bytes() + return nil +} + +// http://www.webdav.org/specs/rfc4918.html#ELEMENT_prop (for proppatch) +type proppatchProps []Property + +// UnmarshalXML appends the property names and values enclosed within start +// to ps. +// +// An xml:lang attribute that is defined either on the DAV:prop or property +// name XML element is propagated to the property's Lang field. +// +// UnmarshalXML returns an error if start does not contain any properties or if +// property values contain syntactically incorrect XML. +func (ps *proppatchProps) UnmarshalXML(d *ixml.Decoder, start ixml.StartElement) error { + lang := xmlLang(start, "") + for { + t, err := next(d) + if err != nil { + return err + } + switch elem := t.(type) { + case ixml.EndElement: + if len(*ps) == 0 { + return fmt.Errorf("%s must not be empty", start.Name.Local) + } + return nil + case ixml.StartElement: + p := Property{ + XMLName: xml.Name(t.(ixml.StartElement).Name), + Lang: xmlLang(t.(ixml.StartElement), lang), + } + err = d.DecodeElement(((*xmlValue)(&p.InnerXML)), &elem) + if err != nil { + return err + } + *ps = append(*ps, p) + } + } +} + +// http://www.webdav.org/specs/rfc4918.html#ELEMENT_set +// http://www.webdav.org/specs/rfc4918.html#ELEMENT_remove +type setRemove struct { + XMLName ixml.Name + Lang string `xml:"xml:lang,attr,omitempty"` + Prop proppatchProps `xml:"DAV: prop"` +} + +// http://www.webdav.org/specs/rfc4918.html#ELEMENT_propertyupdate +type propertyupdate struct { + XMLName ixml.Name `xml:"DAV: propertyupdate"` + Lang string `xml:"xml:lang,attr,omitempty"` + SetRemove []setRemove `xml:",any"` +} + +func readProppatch(r io.Reader) (patches []Proppatch, status int, err error) { + var pu propertyupdate + if err = ixml.NewDecoder(r).Decode(&pu); err != nil { + return nil, http.StatusBadRequest, err + } + for _, op := range pu.SetRemove { + remove := false + switch op.XMLName { + case ixml.Name{Space: "DAV:", Local: "set"}: + // No-op. + case ixml.Name{Space: "DAV:", Local: "remove"}: + for _, p := range op.Prop { + if len(p.InnerXML) > 0 { + return nil, http.StatusBadRequest, errInvalidProppatch + } + } + remove = true + default: + return nil, http.StatusBadRequest, errInvalidProppatch + } + patches = append(patches, Proppatch{Remove: remove, Props: op.Prop}) + } + return patches, 0, nil +} diff --git a/api/vendor/golang.org/x/net/webdav/xml_test.go b/api/vendor/golang.org/x/net/webdav/xml_test.go new file mode 100644 index 0000000..a3d9e1e --- /dev/null +++ b/api/vendor/golang.org/x/net/webdav/xml_test.go @@ -0,0 +1,906 @@ +// 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 webdav + +import ( + "bytes" + "encoding/xml" + "fmt" + "io" + "net/http" + "net/http/httptest" + "reflect" + "sort" + "strings" + "testing" + + ixml "golang.org/x/net/webdav/internal/xml" +) + +func TestReadLockInfo(t *testing.T) { + // The "section x.y.z" test cases come from section x.y.z of the spec at + // http://www.webdav.org/specs/rfc4918.html + testCases := []struct { + desc string + input string + wantLI lockInfo + wantStatus int + }{{ + "bad: junk", + "xxx", + lockInfo{}, + http.StatusBadRequest, + }, { + "bad: invalid owner XML", + "" + + "\n" + + " \n" + + " \n" + + " \n" + + " no end tag \n" + + " \n" + + "", + lockInfo{}, + http.StatusBadRequest, + }, { + "bad: invalid UTF-8", + "" + + "\n" + + " \n" + + " \n" + + " \n" + + " \xff \n" + + " \n" + + "", + lockInfo{}, + http.StatusBadRequest, + }, { + "bad: unfinished XML #1", + "" + + "\n" + + " \n" + + " \n", + lockInfo{}, + http.StatusBadRequest, + }, { + "bad: unfinished XML #2", + "" + + "\n" + + " \n" + + " \n" + + " \n", + lockInfo{}, + http.StatusBadRequest, + }, { + "good: empty", + "", + lockInfo{}, + 0, + }, { + "good: plain-text owner", + "" + + "\n" + + " \n" + + " \n" + + " gopher\n" + + "", + lockInfo{ + XMLName: ixml.Name{Space: "DAV:", Local: "lockinfo"}, + Exclusive: new(struct{}), + Write: new(struct{}), + Owner: owner{ + InnerXML: "gopher", + }, + }, + 0, + }, { + "section 9.10.7", + "" + + "\n" + + " \n" + + " \n" + + " \n" + + " http://example.org/~ejw/contact.html\n" + + " \n" + + "", + lockInfo{ + XMLName: ixml.Name{Space: "DAV:", Local: "lockinfo"}, + Exclusive: new(struct{}), + Write: new(struct{}), + Owner: owner{ + InnerXML: "\n http://example.org/~ejw/contact.html\n ", + }, + }, + 0, + }} + + for _, tc := range testCases { + li, status, err := readLockInfo(strings.NewReader(tc.input)) + if tc.wantStatus != 0 { + if err == nil { + t.Errorf("%s: got nil error, want non-nil", tc.desc) + continue + } + } else if err != nil { + t.Errorf("%s: %v", tc.desc, err) + continue + } + if !reflect.DeepEqual(li, tc.wantLI) || status != tc.wantStatus { + t.Errorf("%s:\ngot lockInfo=%v, status=%v\nwant lockInfo=%v, status=%v", + tc.desc, li, status, tc.wantLI, tc.wantStatus) + continue + } + } +} + +func TestReadPropfind(t *testing.T) { + testCases := []struct { + desc string + input string + wantPF propfind + wantStatus int + }{{ + desc: "propfind: propname", + input: "" + + "\n" + + " \n" + + "", + wantPF: propfind{ + XMLName: ixml.Name{Space: "DAV:", Local: "propfind"}, + Propname: new(struct{}), + }, + }, { + desc: "propfind: empty body means allprop", + input: "", + wantPF: propfind{ + Allprop: new(struct{}), + }, + }, { + desc: "propfind: allprop", + input: "" + + "\n" + + " \n" + + "", + wantPF: propfind{ + XMLName: ixml.Name{Space: "DAV:", Local: "propfind"}, + Allprop: new(struct{}), + }, + }, { + desc: "propfind: allprop followed by include", + input: "" + + "\n" + + " \n" + + " \n" + + "", + wantPF: propfind{ + XMLName: ixml.Name{Space: "DAV:", Local: "propfind"}, + Allprop: new(struct{}), + Include: propfindProps{xml.Name{Space: "DAV:", Local: "displayname"}}, + }, + }, { + desc: "propfind: include followed by allprop", + input: "" + + "\n" + + " \n" + + " \n" + + "", + wantPF: propfind{ + XMLName: ixml.Name{Space: "DAV:", Local: "propfind"}, + Allprop: new(struct{}), + Include: propfindProps{xml.Name{Space: "DAV:", Local: "displayname"}}, + }, + }, { + desc: "propfind: propfind", + input: "" + + "\n" + + " \n" + + "", + wantPF: propfind{ + XMLName: ixml.Name{Space: "DAV:", Local: "propfind"}, + Prop: propfindProps{xml.Name{Space: "DAV:", Local: "displayname"}}, + }, + }, { + desc: "propfind: prop with ignored comments", + input: "" + + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + "", + wantPF: propfind{ + XMLName: ixml.Name{Space: "DAV:", Local: "propfind"}, + Prop: propfindProps{xml.Name{Space: "DAV:", Local: "displayname"}}, + }, + }, { + desc: "propfind: propfind with ignored whitespace", + input: "" + + "\n" + + " \n" + + "", + wantPF: propfind{ + XMLName: ixml.Name{Space: "DAV:", Local: "propfind"}, + Prop: propfindProps{xml.Name{Space: "DAV:", Local: "displayname"}}, + }, + }, { + desc: "propfind: propfind with ignored mixed-content", + input: "" + + "\n" + + " foobar\n" + + "", + wantPF: propfind{ + XMLName: ixml.Name{Space: "DAV:", Local: "propfind"}, + Prop: propfindProps{xml.Name{Space: "DAV:", Local: "displayname"}}, + }, + }, { + desc: "propfind: propname with ignored element (section A.4)", + input: "" + + "\n" + + " \n" + + " *boss*\n" + + "", + wantPF: propfind{ + XMLName: ixml.Name{Space: "DAV:", Local: "propfind"}, + Propname: new(struct{}), + }, + }, { + desc: "propfind: bad: junk", + input: "xxx", + wantStatus: http.StatusBadRequest, + }, { + desc: "propfind: bad: propname and allprop (section A.3)", + input: "" + + "\n" + + " " + + " " + + "", + wantStatus: http.StatusBadRequest, + }, { + desc: "propfind: bad: propname and prop", + input: "" + + "\n" + + " \n" + + " \n" + + "", + wantStatus: http.StatusBadRequest, + }, { + desc: "propfind: bad: allprop and prop", + input: "" + + "\n" + + " \n" + + " \n" + + "", + wantStatus: http.StatusBadRequest, + }, { + desc: "propfind: bad: empty propfind with ignored element (section A.4)", + input: "" + + "\n" + + " \n" + + "", + wantStatus: http.StatusBadRequest, + }, { + desc: "propfind: bad: empty prop", + input: "" + + "\n" + + " \n" + + "", + wantStatus: http.StatusBadRequest, + }, { + desc: "propfind: bad: prop with just chardata", + input: "" + + "\n" + + " foo\n" + + "", + wantStatus: http.StatusBadRequest, + }, { + desc: "bad: interrupted prop", + input: "" + + "\n" + + " \n", + wantStatus: http.StatusBadRequest, + }, { + desc: "bad: malformed end element prop", + input: "" + + "\n" + + " \n", + wantStatus: http.StatusBadRequest, + }, { + desc: "propfind: bad: property with chardata value", + input: "" + + "\n" + + " bar\n" + + "", + wantStatus: http.StatusBadRequest, + }, { + desc: "propfind: bad: property with whitespace value", + input: "" + + "\n" + + " \n" + + "", + wantStatus: http.StatusBadRequest, + }, { + desc: "propfind: bad: include without allprop", + input: "" + + "\n" + + " \n" + + "", + wantStatus: http.StatusBadRequest, + }} + + for _, tc := range testCases { + pf, status, err := readPropfind(strings.NewReader(tc.input)) + if tc.wantStatus != 0 { + if err == nil { + t.Errorf("%s: got nil error, want non-nil", tc.desc) + continue + } + } else if err != nil { + t.Errorf("%s: %v", tc.desc, err) + continue + } + if !reflect.DeepEqual(pf, tc.wantPF) || status != tc.wantStatus { + t.Errorf("%s:\ngot propfind=%v, status=%v\nwant propfind=%v, status=%v", + tc.desc, pf, status, tc.wantPF, tc.wantStatus) + continue + } + } +} + +func TestMultistatusWriter(t *testing.T) { + ///The "section x.y.z" test cases come from section x.y.z of the spec at + // http://www.webdav.org/specs/rfc4918.html + testCases := []struct { + desc string + responses []response + respdesc string + writeHeader bool + wantXML string + wantCode int + wantErr error + }{{ + desc: "section 9.2.2 (failed dependency)", + responses: []response{{ + Href: []string{"http://example.com/foo"}, + Propstat: []propstat{{ + Prop: []Property{{ + XMLName: xml.Name{ + Space: "http://ns.example.com/", + Local: "Authors", + }, + }}, + Status: "HTTP/1.1 424 Failed Dependency", + }, { + Prop: []Property{{ + XMLName: xml.Name{ + Space: "http://ns.example.com/", + Local: "Copyright-Owner", + }, + }}, + Status: "HTTP/1.1 409 Conflict", + }}, + ResponseDescription: "Copyright Owner cannot be deleted or altered.", + }}, + wantXML: `` + + `` + + `` + + ` ` + + ` http://example.com/foo` + + ` ` + + ` ` + + ` ` + + ` ` + + ` HTTP/1.1 424 Failed Dependency` + + ` ` + + ` ` + + ` ` + + ` ` + + ` ` + + ` HTTP/1.1 409 Conflict` + + ` ` + + ` Copyright Owner cannot be deleted or altered.` + + `` + + ``, + wantCode: StatusMulti, + }, { + desc: "section 9.6.2 (lock-token-submitted)", + responses: []response{{ + Href: []string{"http://example.com/foo"}, + Status: "HTTP/1.1 423 Locked", + Error: &xmlError{ + InnerXML: []byte(``), + }, + }}, + wantXML: `` + + `` + + `` + + ` ` + + ` http://example.com/foo` + + ` HTTP/1.1 423 Locked` + + ` ` + + ` ` + + ``, + wantCode: StatusMulti, + }, { + desc: "section 9.1.3", + responses: []response{{ + Href: []string{"http://example.com/foo"}, + Propstat: []propstat{{ + Prop: []Property{{ + XMLName: xml.Name{Space: "http://ns.example.com/boxschema/", Local: "bigbox"}, + InnerXML: []byte(`` + + `` + + `Box type A` + + ``), + }, { + XMLName: xml.Name{Space: "http://ns.example.com/boxschema/", Local: "author"}, + InnerXML: []byte(`` + + `` + + `J.J. Johnson` + + ``), + }}, + Status: "HTTP/1.1 200 OK", + }, { + Prop: []Property{{ + XMLName: xml.Name{Space: "http://ns.example.com/boxschema/", Local: "DingALing"}, + }, { + XMLName: xml.Name{Space: "http://ns.example.com/boxschema/", Local: "Random"}, + }}, + Status: "HTTP/1.1 403 Forbidden", + ResponseDescription: "The user does not have access to the DingALing property.", + }}, + }}, + respdesc: "There has been an access violation error.", + wantXML: `` + + `` + + `` + + ` ` + + ` http://example.com/foo` + + ` ` + + ` ` + + ` Box type A` + + ` J.J. Johnson` + + ` ` + + ` HTTP/1.1 200 OK` + + ` ` + + ` ` + + ` ` + + ` ` + + ` ` + + ` ` + + ` HTTP/1.1 403 Forbidden` + + ` The user does not have access to the DingALing property.` + + ` ` + + ` ` + + ` There has been an access violation error.` + + ``, + wantCode: StatusMulti, + }, { + desc: "no response written", + // default of http.responseWriter + wantCode: http.StatusOK, + }, { + desc: "no response written (with description)", + respdesc: "too bad", + // default of http.responseWriter + wantCode: http.StatusOK, + }, { + desc: "empty multistatus with header", + writeHeader: true, + wantXML: ``, + wantCode: StatusMulti, + }, { + desc: "bad: no href", + responses: []response{{ + Propstat: []propstat{{ + Prop: []Property{{ + XMLName: xml.Name{ + Space: "http://example.com/", + Local: "foo", + }, + }}, + Status: "HTTP/1.1 200 OK", + }}, + }}, + wantErr: errInvalidResponse, + // default of http.responseWriter + wantCode: http.StatusOK, + }, { + desc: "bad: multiple hrefs and no status", + responses: []response{{ + Href: []string{"http://example.com/foo", "http://example.com/bar"}, + }}, + wantErr: errInvalidResponse, + // default of http.responseWriter + wantCode: http.StatusOK, + }, { + desc: "bad: one href and no propstat", + responses: []response{{ + Href: []string{"http://example.com/foo"}, + }}, + wantErr: errInvalidResponse, + // default of http.responseWriter + wantCode: http.StatusOK, + }, { + desc: "bad: status with one href and propstat", + responses: []response{{ + Href: []string{"http://example.com/foo"}, + Propstat: []propstat{{ + Prop: []Property{{ + XMLName: xml.Name{ + Space: "http://example.com/", + Local: "foo", + }, + }}, + Status: "HTTP/1.1 200 OK", + }}, + Status: "HTTP/1.1 200 OK", + }}, + wantErr: errInvalidResponse, + // default of http.responseWriter + wantCode: http.StatusOK, + }, { + desc: "bad: multiple hrefs and propstat", + responses: []response{{ + Href: []string{ + "http://example.com/foo", + "http://example.com/bar", + }, + Propstat: []propstat{{ + Prop: []Property{{ + XMLName: xml.Name{ + Space: "http://example.com/", + Local: "foo", + }, + }}, + Status: "HTTP/1.1 200 OK", + }}, + }}, + wantErr: errInvalidResponse, + // default of http.responseWriter + wantCode: http.StatusOK, + }} + + n := xmlNormalizer{omitWhitespace: true} +loop: + for _, tc := range testCases { + rec := httptest.NewRecorder() + w := multistatusWriter{w: rec, responseDescription: tc.respdesc} + if tc.writeHeader { + if err := w.writeHeader(); err != nil { + t.Errorf("%s: got writeHeader error %v, want nil", tc.desc, err) + continue + } + } + for _, r := range tc.responses { + if err := w.write(&r); err != nil { + if err != tc.wantErr { + t.Errorf("%s: got write error %v, want %v", + tc.desc, err, tc.wantErr) + } + continue loop + } + } + if err := w.close(); err != tc.wantErr { + t.Errorf("%s: got close error %v, want %v", + tc.desc, err, tc.wantErr) + continue + } + if rec.Code != tc.wantCode { + t.Errorf("%s: got HTTP status code %d, want %d\n", + tc.desc, rec.Code, tc.wantCode) + continue + } + gotXML := rec.Body.String() + eq, err := n.equalXML(strings.NewReader(gotXML), strings.NewReader(tc.wantXML)) + if err != nil { + t.Errorf("%s: equalXML: %v", tc.desc, err) + continue + } + if !eq { + t.Errorf("%s: XML body\ngot %s\nwant %s", tc.desc, gotXML, tc.wantXML) + } + } +} + +func TestReadProppatch(t *testing.T) { + ppStr := func(pps []Proppatch) string { + var outer []string + for _, pp := range pps { + var inner []string + for _, p := range pp.Props { + inner = append(inner, fmt.Sprintf("{XMLName: %q, Lang: %q, InnerXML: %q}", + p.XMLName, p.Lang, p.InnerXML)) + } + outer = append(outer, fmt.Sprintf("{Remove: %t, Props: [%s]}", + pp.Remove, strings.Join(inner, ", "))) + } + return "[" + strings.Join(outer, ", ") + "]" + } + + testCases := []struct { + desc string + input string + wantPP []Proppatch + wantStatus int + }{{ + desc: "proppatch: section 9.2 (with simple property value)", + input: `` + + `` + + `` + + ` ` + + ` somevalue` + + ` ` + + ` ` + + ` ` + + ` ` + + ``, + wantPP: []Proppatch{{ + Props: []Property{{ + xml.Name{Space: "http://ns.example.com/z/", Local: "Authors"}, + "", + []byte(`somevalue`), + }}, + }, { + Remove: true, + Props: []Property{{ + xml.Name{Space: "http://ns.example.com/z/", Local: "Copyright-Owner"}, + "", + nil, + }}, + }}, + }, { + desc: "proppatch: lang attribute on prop", + input: `` + + `` + + `` + + ` ` + + ` ` + + ` ` + + ` ` + + ` ` + + ``, + wantPP: []Proppatch{{ + Props: []Property{{ + xml.Name{Space: "http://example.com/ns", Local: "foo"}, + "en", + nil, + }}, + }}, + }, { + desc: "bad: remove with value", + input: `` + + `` + + `` + + ` ` + + ` ` + + ` ` + + ` Jim Whitehead` + + ` ` + + ` ` + + ` ` + + ``, + wantStatus: http.StatusBadRequest, + }, { + desc: "bad: empty propertyupdate", + input: `` + + `` + + ``, + wantStatus: http.StatusBadRequest, + }, { + desc: "bad: empty prop", + input: `` + + `` + + `` + + ` ` + + ` ` + + ` ` + + ``, + wantStatus: http.StatusBadRequest, + }} + + for _, tc := range testCases { + pp, status, err := readProppatch(strings.NewReader(tc.input)) + if tc.wantStatus != 0 { + if err == nil { + t.Errorf("%s: got nil error, want non-nil", tc.desc) + continue + } + } else if err != nil { + t.Errorf("%s: %v", tc.desc, err) + continue + } + if status != tc.wantStatus { + t.Errorf("%s: got status %d, want %d", tc.desc, status, tc.wantStatus) + continue + } + if !reflect.DeepEqual(pp, tc.wantPP) || status != tc.wantStatus { + t.Errorf("%s: proppatch\ngot %v\nwant %v", tc.desc, ppStr(pp), ppStr(tc.wantPP)) + } + } +} + +func TestUnmarshalXMLValue(t *testing.T) { + testCases := []struct { + desc string + input string + wantVal string + }{{ + desc: "simple char data", + input: "foo", + wantVal: "foo", + }, { + desc: "empty element", + input: "", + wantVal: "", + }, { + desc: "preserve namespace", + input: ``, + wantVal: ``, + }, { + desc: "preserve root element namespace", + input: ``, + wantVal: ``, + }, { + desc: "preserve whitespace", + input: " \t ", + wantVal: " \t ", + }, { + desc: "preserve mixed content", + input: ` a `, + wantVal: ` a `, + }, { + desc: "section 9.2", + input: `` + + `` + + ` Jim Whitehead` + + ` Roy Fielding` + + ``, + wantVal: `` + + ` Jim Whitehead` + + ` Roy Fielding`, + }, { + desc: "section 4.3.1 (mixed content)", + input: `` + + `` + + ` Jane Doe` + + ` ` + + ` mailto:jane.doe@example.com` + + ` http://www.example.com` + + ` ` + + ` Jane has been working way too long on the` + + ` long-awaited revision of ]]>.` + + ` ` + + ``, + wantVal: `` + + ` Jane Doe` + + ` ` + + ` mailto:jane.doe@example.com` + + ` http://www.example.com` + + ` ` + + ` Jane has been working way too long on the` + + ` long-awaited revision of <RFC2518>.` + + ` `, + }} + + var n xmlNormalizer + for _, tc := range testCases { + d := ixml.NewDecoder(strings.NewReader(tc.input)) + var v xmlValue + if err := d.Decode(&v); err != nil { + t.Errorf("%s: got error %v, want nil", tc.desc, err) + continue + } + eq, err := n.equalXML(bytes.NewReader(v), strings.NewReader(tc.wantVal)) + if err != nil { + t.Errorf("%s: equalXML: %v", tc.desc, err) + continue + } + if !eq { + t.Errorf("%s:\ngot %s\nwant %s", tc.desc, string(v), tc.wantVal) + } + } +} + +// xmlNormalizer normalizes XML. +type xmlNormalizer struct { + // omitWhitespace instructs to ignore whitespace between element tags. + omitWhitespace bool + // omitComments instructs to ignore XML comments. + omitComments bool +} + +// normalize writes the normalized XML content of r to w. It applies the +// following rules +// +// * Rename namespace prefixes according to an internal heuristic. +// * Remove unnecessary namespace declarations. +// * Sort attributes in XML start elements in lexical order of their +// fully qualified name. +// * Remove XML directives and processing instructions. +// * Remove CDATA between XML tags that only contains whitespace, if +// instructed to do so. +// * Remove comments, if instructed to do so. +// +func (n *xmlNormalizer) normalize(w io.Writer, r io.Reader) error { + d := ixml.NewDecoder(r) + e := ixml.NewEncoder(w) + for { + t, err := d.Token() + if err != nil { + if t == nil && err == io.EOF { + break + } + return err + } + switch val := t.(type) { + case ixml.Directive, ixml.ProcInst: + continue + case ixml.Comment: + if n.omitComments { + continue + } + case ixml.CharData: + if n.omitWhitespace && len(bytes.TrimSpace(val)) == 0 { + continue + } + case ixml.StartElement: + start, _ := ixml.CopyToken(val).(ixml.StartElement) + attr := start.Attr[:0] + for _, a := range start.Attr { + if a.Name.Space == "xmlns" || a.Name.Local == "xmlns" { + continue + } + attr = append(attr, a) + } + sort.Sort(byName(attr)) + start.Attr = attr + t = start + } + err = e.EncodeToken(t) + if err != nil { + return err + } + } + return e.Flush() +} + +// equalXML tests for equality of the normalized XML contents of a and b. +func (n *xmlNormalizer) equalXML(a, b io.Reader) (bool, error) { + var buf bytes.Buffer + if err := n.normalize(&buf, a); err != nil { + return false, err + } + normA := buf.String() + buf.Reset() + if err := n.normalize(&buf, b); err != nil { + return false, err + } + normB := buf.String() + return normA == normB, nil +} + +type byName []ixml.Attr + +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 { + if a[i].Name.Space != a[j].Name.Space { + return a[i].Name.Space < a[j].Name.Space + } + return a[i].Name.Local < a[j].Name.Local +} diff --git a/api/vendor/golang.org/x/net/websocket/client.go b/api/vendor/golang.org/x/net/websocket/client.go new file mode 100644 index 0000000..69a4ac7 --- /dev/null +++ b/api/vendor/golang.org/x/net/websocket/client.go @@ -0,0 +1,106 @@ +// 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 websocket + +import ( + "bufio" + "io" + "net" + "net/http" + "net/url" +) + +// DialError is an error that occurs while dialling a websocket server. +type DialError struct { + *Config + Err error +} + +func (e *DialError) Error() string { + return "websocket.Dial " + e.Config.Location.String() + ": " + e.Err.Error() +} + +// NewConfig creates a new WebSocket config for client connection. +func NewConfig(server, origin string) (config *Config, err error) { + config = new(Config) + config.Version = ProtocolVersionHybi13 + config.Location, err = url.ParseRequestURI(server) + if err != nil { + return + } + config.Origin, err = url.ParseRequestURI(origin) + if err != nil { + return + } + config.Header = http.Header(make(map[string][]string)) + return +} + +// NewClient creates a new WebSocket client connection over rwc. +func NewClient(config *Config, rwc io.ReadWriteCloser) (ws *Conn, err error) { + br := bufio.NewReader(rwc) + bw := bufio.NewWriter(rwc) + err = hybiClientHandshake(config, br, bw) + if err != nil { + return + } + buf := bufio.NewReadWriter(br, bw) + ws = newHybiClientConn(config, buf, rwc) + return +} + +// Dial opens a new client connection to a WebSocket. +func Dial(url_, protocol, origin string) (ws *Conn, err error) { + config, err := NewConfig(url_, origin) + if err != nil { + return nil, err + } + if protocol != "" { + config.Protocol = []string{protocol} + } + return DialConfig(config) +} + +var portMap = map[string]string{ + "ws": "80", + "wss": "443", +} + +func parseAuthority(location *url.URL) string { + if _, ok := portMap[location.Scheme]; ok { + if _, _, err := net.SplitHostPort(location.Host); err != nil { + return net.JoinHostPort(location.Host, portMap[location.Scheme]) + } + } + return location.Host +} + +// DialConfig opens a new client connection to a WebSocket with a config. +func DialConfig(config *Config) (ws *Conn, err error) { + var client net.Conn + if config.Location == nil { + return nil, &DialError{config, ErrBadWebSocketLocation} + } + if config.Origin == nil { + return nil, &DialError{config, ErrBadWebSocketOrigin} + } + dialer := config.Dialer + if dialer == nil { + dialer = &net.Dialer{} + } + client, err = dialWithDialer(dialer, config) + if err != nil { + goto Error + } + ws, err = NewClient(config, client) + if err != nil { + client.Close() + goto Error + } + return + +Error: + return nil, &DialError{config, err} +} diff --git a/api/vendor/golang.org/x/net/websocket/dial.go b/api/vendor/golang.org/x/net/websocket/dial.go new file mode 100644 index 0000000..2dab943 --- /dev/null +++ b/api/vendor/golang.org/x/net/websocket/dial.go @@ -0,0 +1,24 @@ +// Copyright 2015 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 websocket + +import ( + "crypto/tls" + "net" +) + +func dialWithDialer(dialer *net.Dialer, config *Config) (conn net.Conn, err error) { + switch config.Location.Scheme { + case "ws": + conn, err = dialer.Dial("tcp", parseAuthority(config.Location)) + + case "wss": + conn, err = tls.DialWithDialer(dialer, "tcp", parseAuthority(config.Location), config.TlsConfig) + + default: + err = ErrBadScheme + } + return +} diff --git a/api/vendor/golang.org/x/net/websocket/dial_test.go b/api/vendor/golang.org/x/net/websocket/dial_test.go new file mode 100644 index 0000000..aa03e30 --- /dev/null +++ b/api/vendor/golang.org/x/net/websocket/dial_test.go @@ -0,0 +1,43 @@ +// Copyright 2015 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 websocket + +import ( + "crypto/tls" + "fmt" + "log" + "net" + "net/http/httptest" + "testing" + "time" +) + +// This test depend on Go 1.3+ because in earlier versions the Dialer won't be +// used in TLS connections and a timeout won't be triggered. +func TestDialConfigTLSWithDialer(t *testing.T) { + tlsServer := httptest.NewTLSServer(nil) + tlsServerAddr := tlsServer.Listener.Addr().String() + log.Print("Test TLS WebSocket server listening on ", tlsServerAddr) + defer tlsServer.Close() + config, _ := NewConfig(fmt.Sprintf("wss://%s/echo", tlsServerAddr), "http://localhost") + config.Dialer = &net.Dialer{ + Deadline: time.Now().Add(-time.Minute), + } + config.TlsConfig = &tls.Config{ + InsecureSkipVerify: true, + } + _, err := DialConfig(config) + dialerr, ok := err.(*DialError) + if !ok { + t.Fatalf("DialError expected, got %#v", err) + } + neterr, ok := dialerr.Err.(*net.OpError) + if !ok { + t.Fatalf("net.OpError error expected, got %#v", dialerr.Err) + } + if !neterr.Timeout() { + t.Fatalf("expected timeout error, got %#v", neterr) + } +} diff --git a/api/vendor/golang.org/x/net/websocket/exampledial_test.go b/api/vendor/golang.org/x/net/websocket/exampledial_test.go new file mode 100644 index 0000000..72bb9d4 --- /dev/null +++ b/api/vendor/golang.org/x/net/websocket/exampledial_test.go @@ -0,0 +1,31 @@ +// 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 websocket_test + +import ( + "fmt" + "log" + + "golang.org/x/net/websocket" +) + +// This example demonstrates a trivial client. +func ExampleDial() { + origin := "http://localhost/" + url := "ws://localhost:12345/ws" + ws, err := websocket.Dial(url, "", origin) + if err != nil { + log.Fatal(err) + } + if _, err := ws.Write([]byte("hello, world!\n")); err != nil { + log.Fatal(err) + } + var msg = make([]byte, 512) + var n int + if n, err = ws.Read(msg); err != nil { + log.Fatal(err) + } + fmt.Printf("Received: %s.\n", msg[:n]) +} diff --git a/api/vendor/golang.org/x/net/websocket/examplehandler_test.go b/api/vendor/golang.org/x/net/websocket/examplehandler_test.go new file mode 100644 index 0000000..f22a98f --- /dev/null +++ b/api/vendor/golang.org/x/net/websocket/examplehandler_test.go @@ -0,0 +1,26 @@ +// 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 websocket_test + +import ( + "io" + "net/http" + + "golang.org/x/net/websocket" +) + +// Echo the data received on the WebSocket. +func EchoServer(ws *websocket.Conn) { + io.Copy(ws, ws) +} + +// This example demonstrates a trivial echo server. +func ExampleHandler() { + http.Handle("/echo", websocket.Handler(EchoServer)) + err := http.ListenAndServe(":12345", nil) + if err != nil { + panic("ListenAndServe: " + err.Error()) + } +} diff --git a/api/vendor/golang.org/x/net/websocket/hybi.go b/api/vendor/golang.org/x/net/websocket/hybi.go new file mode 100644 index 0000000..8cffdd1 --- /dev/null +++ b/api/vendor/golang.org/x/net/websocket/hybi.go @@ -0,0 +1,583 @@ +// 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 websocket + +// This file implements a protocol of hybi draft. +// http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17 + +import ( + "bufio" + "bytes" + "crypto/rand" + "crypto/sha1" + "encoding/base64" + "encoding/binary" + "fmt" + "io" + "io/ioutil" + "net/http" + "net/url" + "strings" +) + +const ( + websocketGUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" + + closeStatusNormal = 1000 + closeStatusGoingAway = 1001 + closeStatusProtocolError = 1002 + closeStatusUnsupportedData = 1003 + closeStatusFrameTooLarge = 1004 + closeStatusNoStatusRcvd = 1005 + closeStatusAbnormalClosure = 1006 + closeStatusBadMessageData = 1007 + closeStatusPolicyViolation = 1008 + closeStatusTooBigData = 1009 + closeStatusExtensionMismatch = 1010 + + maxControlFramePayloadLength = 125 +) + +var ( + ErrBadMaskingKey = &ProtocolError{"bad masking key"} + ErrBadPongMessage = &ProtocolError{"bad pong message"} + ErrBadClosingStatus = &ProtocolError{"bad closing status"} + ErrUnsupportedExtensions = &ProtocolError{"unsupported extensions"} + ErrNotImplemented = &ProtocolError{"not implemented"} + + handshakeHeader = map[string]bool{ + "Host": true, + "Upgrade": true, + "Connection": true, + "Sec-Websocket-Key": true, + "Sec-Websocket-Origin": true, + "Sec-Websocket-Version": true, + "Sec-Websocket-Protocol": true, + "Sec-Websocket-Accept": true, + } +) + +// A hybiFrameHeader is a frame header as defined in hybi draft. +type hybiFrameHeader struct { + Fin bool + Rsv [3]bool + OpCode byte + Length int64 + MaskingKey []byte + + data *bytes.Buffer +} + +// A hybiFrameReader is a reader for hybi frame. +type hybiFrameReader struct { + reader io.Reader + + header hybiFrameHeader + pos int64 + length int +} + +func (frame *hybiFrameReader) Read(msg []byte) (n int, err error) { + n, err = frame.reader.Read(msg) + if frame.header.MaskingKey != nil { + for i := 0; i < n; i++ { + msg[i] = msg[i] ^ frame.header.MaskingKey[frame.pos%4] + frame.pos++ + } + } + return n, err +} + +func (frame *hybiFrameReader) PayloadType() byte { return frame.header.OpCode } + +func (frame *hybiFrameReader) HeaderReader() io.Reader { + if frame.header.data == nil { + return nil + } + if frame.header.data.Len() == 0 { + return nil + } + return frame.header.data +} + +func (frame *hybiFrameReader) TrailerReader() io.Reader { return nil } + +func (frame *hybiFrameReader) Len() (n int) { return frame.length } + +// A hybiFrameReaderFactory creates new frame reader based on its frame type. +type hybiFrameReaderFactory struct { + *bufio.Reader +} + +// NewFrameReader reads a frame header from the connection, and creates new reader for the frame. +// See Section 5.2 Base Framing protocol for detail. +// http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17#section-5.2 +func (buf hybiFrameReaderFactory) NewFrameReader() (frame frameReader, err error) { + hybiFrame := new(hybiFrameReader) + frame = hybiFrame + var header []byte + var b byte + // First byte. FIN/RSV1/RSV2/RSV3/OpCode(4bits) + b, err = buf.ReadByte() + if err != nil { + return + } + header = append(header, b) + hybiFrame.header.Fin = ((header[0] >> 7) & 1) != 0 + for i := 0; i < 3; i++ { + j := uint(6 - i) + hybiFrame.header.Rsv[i] = ((header[0] >> j) & 1) != 0 + } + hybiFrame.header.OpCode = header[0] & 0x0f + + // Second byte. Mask/Payload len(7bits) + b, err = buf.ReadByte() + if err != nil { + return + } + header = append(header, b) + mask := (b & 0x80) != 0 + b &= 0x7f + lengthFields := 0 + switch { + case b <= 125: // Payload length 7bits. + hybiFrame.header.Length = int64(b) + case b == 126: // Payload length 7+16bits + lengthFields = 2 + case b == 127: // Payload length 7+64bits + lengthFields = 8 + } + for i := 0; i < lengthFields; i++ { + b, err = buf.ReadByte() + if err != nil { + return + } + if lengthFields == 8 && i == 0 { // MSB must be zero when 7+64 bits + b &= 0x7f + } + header = append(header, b) + hybiFrame.header.Length = hybiFrame.header.Length*256 + int64(b) + } + if mask { + // Masking key. 4 bytes. + for i := 0; i < 4; i++ { + b, err = buf.ReadByte() + if err != nil { + return + } + header = append(header, b) + hybiFrame.header.MaskingKey = append(hybiFrame.header.MaskingKey, b) + } + } + hybiFrame.reader = io.LimitReader(buf.Reader, hybiFrame.header.Length) + hybiFrame.header.data = bytes.NewBuffer(header) + hybiFrame.length = len(header) + int(hybiFrame.header.Length) + return +} + +// A HybiFrameWriter is a writer for hybi frame. +type hybiFrameWriter struct { + writer *bufio.Writer + + header *hybiFrameHeader +} + +func (frame *hybiFrameWriter) Write(msg []byte) (n int, err error) { + var header []byte + var b byte + if frame.header.Fin { + b |= 0x80 + } + for i := 0; i < 3; i++ { + if frame.header.Rsv[i] { + j := uint(6 - i) + b |= 1 << j + } + } + b |= frame.header.OpCode + header = append(header, b) + if frame.header.MaskingKey != nil { + b = 0x80 + } else { + b = 0 + } + lengthFields := 0 + length := len(msg) + switch { + case length <= 125: + b |= byte(length) + case length < 65536: + b |= 126 + lengthFields = 2 + default: + b |= 127 + lengthFields = 8 + } + header = append(header, b) + for i := 0; i < lengthFields; i++ { + j := uint((lengthFields - i - 1) * 8) + b = byte((length >> j) & 0xff) + header = append(header, b) + } + if frame.header.MaskingKey != nil { + if len(frame.header.MaskingKey) != 4 { + return 0, ErrBadMaskingKey + } + header = append(header, frame.header.MaskingKey...) + frame.writer.Write(header) + data := make([]byte, length) + for i := range data { + data[i] = msg[i] ^ frame.header.MaskingKey[i%4] + } + frame.writer.Write(data) + err = frame.writer.Flush() + return length, err + } + frame.writer.Write(header) + frame.writer.Write(msg) + err = frame.writer.Flush() + return length, err +} + +func (frame *hybiFrameWriter) Close() error { return nil } + +type hybiFrameWriterFactory struct { + *bufio.Writer + needMaskingKey bool +} + +func (buf hybiFrameWriterFactory) NewFrameWriter(payloadType byte) (frame frameWriter, err error) { + frameHeader := &hybiFrameHeader{Fin: true, OpCode: payloadType} + if buf.needMaskingKey { + frameHeader.MaskingKey, err = generateMaskingKey() + if err != nil { + return nil, err + } + } + return &hybiFrameWriter{writer: buf.Writer, header: frameHeader}, nil +} + +type hybiFrameHandler struct { + conn *Conn + payloadType byte +} + +func (handler *hybiFrameHandler) HandleFrame(frame frameReader) (frameReader, error) { + if handler.conn.IsServerConn() { + // The client MUST mask all frames sent to the server. + if frame.(*hybiFrameReader).header.MaskingKey == nil { + handler.WriteClose(closeStatusProtocolError) + return nil, io.EOF + } + } else { + // The server MUST NOT mask all frames. + if frame.(*hybiFrameReader).header.MaskingKey != nil { + handler.WriteClose(closeStatusProtocolError) + return nil, io.EOF + } + } + if header := frame.HeaderReader(); header != nil { + io.Copy(ioutil.Discard, header) + } + switch frame.PayloadType() { + case ContinuationFrame: + frame.(*hybiFrameReader).header.OpCode = handler.payloadType + case TextFrame, BinaryFrame: + handler.payloadType = frame.PayloadType() + case CloseFrame: + return nil, io.EOF + case PingFrame, PongFrame: + b := make([]byte, maxControlFramePayloadLength) + n, err := io.ReadFull(frame, b) + if err != nil && err != io.EOF && err != io.ErrUnexpectedEOF { + return nil, err + } + io.Copy(ioutil.Discard, frame) + if frame.PayloadType() == PingFrame { + if _, err := handler.WritePong(b[:n]); err != nil { + return nil, err + } + } + return nil, nil + } + return frame, nil +} + +func (handler *hybiFrameHandler) WriteClose(status int) (err error) { + handler.conn.wio.Lock() + defer handler.conn.wio.Unlock() + w, err := handler.conn.frameWriterFactory.NewFrameWriter(CloseFrame) + if err != nil { + return err + } + msg := make([]byte, 2) + binary.BigEndian.PutUint16(msg, uint16(status)) + _, err = w.Write(msg) + w.Close() + return err +} + +func (handler *hybiFrameHandler) WritePong(msg []byte) (n int, err error) { + handler.conn.wio.Lock() + defer handler.conn.wio.Unlock() + w, err := handler.conn.frameWriterFactory.NewFrameWriter(PongFrame) + if err != nil { + return 0, err + } + n, err = w.Write(msg) + w.Close() + return n, err +} + +// newHybiConn creates a new WebSocket connection speaking hybi draft protocol. +func newHybiConn(config *Config, buf *bufio.ReadWriter, rwc io.ReadWriteCloser, request *http.Request) *Conn { + if buf == nil { + br := bufio.NewReader(rwc) + bw := bufio.NewWriter(rwc) + buf = bufio.NewReadWriter(br, bw) + } + ws := &Conn{config: config, request: request, buf: buf, rwc: rwc, + frameReaderFactory: hybiFrameReaderFactory{buf.Reader}, + frameWriterFactory: hybiFrameWriterFactory{ + buf.Writer, request == nil}, + PayloadType: TextFrame, + defaultCloseStatus: closeStatusNormal} + ws.frameHandler = &hybiFrameHandler{conn: ws} + return ws +} + +// generateMaskingKey generates a masking key for a frame. +func generateMaskingKey() (maskingKey []byte, err error) { + maskingKey = make([]byte, 4) + if _, err = io.ReadFull(rand.Reader, maskingKey); err != nil { + return + } + return +} + +// generateNonce generates a nonce consisting of a randomly selected 16-byte +// value that has been base64-encoded. +func generateNonce() (nonce []byte) { + key := make([]byte, 16) + if _, err := io.ReadFull(rand.Reader, key); err != nil { + panic(err) + } + nonce = make([]byte, 24) + base64.StdEncoding.Encode(nonce, key) + return +} + +// removeZone removes IPv6 zone identifer from host. +// E.g., "[fe80::1%en0]:8080" to "[fe80::1]:8080" +func removeZone(host string) string { + if !strings.HasPrefix(host, "[") { + return host + } + i := strings.LastIndex(host, "]") + if i < 0 { + return host + } + j := strings.LastIndex(host[:i], "%") + if j < 0 { + return host + } + return host[:j] + host[i:] +} + +// getNonceAccept computes the base64-encoded SHA-1 of the concatenation of +// the nonce ("Sec-WebSocket-Key" value) with the websocket GUID string. +func getNonceAccept(nonce []byte) (expected []byte, err error) { + h := sha1.New() + if _, err = h.Write(nonce); err != nil { + return + } + if _, err = h.Write([]byte(websocketGUID)); err != nil { + return + } + expected = make([]byte, 28) + base64.StdEncoding.Encode(expected, h.Sum(nil)) + return +} + +// Client handshake described in draft-ietf-hybi-thewebsocket-protocol-17 +func hybiClientHandshake(config *Config, br *bufio.Reader, bw *bufio.Writer) (err error) { + bw.WriteString("GET " + config.Location.RequestURI() + " HTTP/1.1\r\n") + + // According to RFC 6874, an HTTP client, proxy, or other + // intermediary must remove any IPv6 zone identifier attached + // to an outgoing URI. + bw.WriteString("Host: " + removeZone(config.Location.Host) + "\r\n") + bw.WriteString("Upgrade: websocket\r\n") + bw.WriteString("Connection: Upgrade\r\n") + nonce := generateNonce() + if config.handshakeData != nil { + nonce = []byte(config.handshakeData["key"]) + } + bw.WriteString("Sec-WebSocket-Key: " + string(nonce) + "\r\n") + bw.WriteString("Origin: " + strings.ToLower(config.Origin.String()) + "\r\n") + + if config.Version != ProtocolVersionHybi13 { + return ErrBadProtocolVersion + } + + bw.WriteString("Sec-WebSocket-Version: " + fmt.Sprintf("%d", config.Version) + "\r\n") + if len(config.Protocol) > 0 { + bw.WriteString("Sec-WebSocket-Protocol: " + strings.Join(config.Protocol, ", ") + "\r\n") + } + // TODO(ukai): send Sec-WebSocket-Extensions. + err = config.Header.WriteSubset(bw, handshakeHeader) + if err != nil { + return err + } + + bw.WriteString("\r\n") + if err = bw.Flush(); err != nil { + return err + } + + resp, err := http.ReadResponse(br, &http.Request{Method: "GET"}) + if err != nil { + return err + } + if resp.StatusCode != 101 { + return ErrBadStatus + } + if strings.ToLower(resp.Header.Get("Upgrade")) != "websocket" || + strings.ToLower(resp.Header.Get("Connection")) != "upgrade" { + return ErrBadUpgrade + } + expectedAccept, err := getNonceAccept(nonce) + if err != nil { + return err + } + if resp.Header.Get("Sec-WebSocket-Accept") != string(expectedAccept) { + return ErrChallengeResponse + } + if resp.Header.Get("Sec-WebSocket-Extensions") != "" { + return ErrUnsupportedExtensions + } + offeredProtocol := resp.Header.Get("Sec-WebSocket-Protocol") + if offeredProtocol != "" { + protocolMatched := false + for i := 0; i < len(config.Protocol); i++ { + if config.Protocol[i] == offeredProtocol { + protocolMatched = true + break + } + } + if !protocolMatched { + return ErrBadWebSocketProtocol + } + config.Protocol = []string{offeredProtocol} + } + + return nil +} + +// newHybiClientConn creates a client WebSocket connection after handshake. +func newHybiClientConn(config *Config, buf *bufio.ReadWriter, rwc io.ReadWriteCloser) *Conn { + return newHybiConn(config, buf, rwc, nil) +} + +// A HybiServerHandshaker performs a server handshake using hybi draft protocol. +type hybiServerHandshaker struct { + *Config + accept []byte +} + +func (c *hybiServerHandshaker) ReadHandshake(buf *bufio.Reader, req *http.Request) (code int, err error) { + c.Version = ProtocolVersionHybi13 + if req.Method != "GET" { + return http.StatusMethodNotAllowed, ErrBadRequestMethod + } + // HTTP version can be safely ignored. + + if strings.ToLower(req.Header.Get("Upgrade")) != "websocket" || + !strings.Contains(strings.ToLower(req.Header.Get("Connection")), "upgrade") { + return http.StatusBadRequest, ErrNotWebSocket + } + + key := req.Header.Get("Sec-Websocket-Key") + if key == "" { + return http.StatusBadRequest, ErrChallengeResponse + } + version := req.Header.Get("Sec-Websocket-Version") + switch version { + case "13": + c.Version = ProtocolVersionHybi13 + default: + return http.StatusBadRequest, ErrBadWebSocketVersion + } + var scheme string + if req.TLS != nil { + scheme = "wss" + } else { + scheme = "ws" + } + c.Location, err = url.ParseRequestURI(scheme + "://" + req.Host + req.URL.RequestURI()) + if err != nil { + return http.StatusBadRequest, err + } + protocol := strings.TrimSpace(req.Header.Get("Sec-Websocket-Protocol")) + if protocol != "" { + protocols := strings.Split(protocol, ",") + for i := 0; i < len(protocols); i++ { + c.Protocol = append(c.Protocol, strings.TrimSpace(protocols[i])) + } + } + c.accept, err = getNonceAccept([]byte(key)) + if err != nil { + return http.StatusInternalServerError, err + } + return http.StatusSwitchingProtocols, nil +} + +// Origin parses the Origin header in req. +// If the Origin header is not set, it returns nil and nil. +func Origin(config *Config, req *http.Request) (*url.URL, error) { + var origin string + switch config.Version { + case ProtocolVersionHybi13: + origin = req.Header.Get("Origin") + } + if origin == "" { + return nil, nil + } + return url.ParseRequestURI(origin) +} + +func (c *hybiServerHandshaker) AcceptHandshake(buf *bufio.Writer) (err error) { + if len(c.Protocol) > 0 { + if len(c.Protocol) != 1 { + // You need choose a Protocol in Handshake func in Server. + return ErrBadWebSocketProtocol + } + } + buf.WriteString("HTTP/1.1 101 Switching Protocols\r\n") + buf.WriteString("Upgrade: websocket\r\n") + buf.WriteString("Connection: Upgrade\r\n") + buf.WriteString("Sec-WebSocket-Accept: " + string(c.accept) + "\r\n") + if len(c.Protocol) > 0 { + buf.WriteString("Sec-WebSocket-Protocol: " + c.Protocol[0] + "\r\n") + } + // TODO(ukai): send Sec-WebSocket-Extensions. + if c.Header != nil { + err := c.Header.WriteSubset(buf, handshakeHeader) + if err != nil { + return err + } + } + buf.WriteString("\r\n") + return buf.Flush() +} + +func (c *hybiServerHandshaker) NewServerConn(buf *bufio.ReadWriter, rwc io.ReadWriteCloser, request *http.Request) *Conn { + return newHybiServerConn(c.Config, buf, rwc, request) +} + +// newHybiServerConn returns a new WebSocket connection speaking hybi draft protocol. +func newHybiServerConn(config *Config, buf *bufio.ReadWriter, rwc io.ReadWriteCloser, request *http.Request) *Conn { + return newHybiConn(config, buf, rwc, request) +} diff --git a/api/vendor/golang.org/x/net/websocket/hybi_test.go b/api/vendor/golang.org/x/net/websocket/hybi_test.go new file mode 100644 index 0000000..9504aa2 --- /dev/null +++ b/api/vendor/golang.org/x/net/websocket/hybi_test.go @@ -0,0 +1,608 @@ +// 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 websocket + +import ( + "bufio" + "bytes" + "fmt" + "io" + "net/http" + "net/url" + "strings" + "testing" +) + +// Test the getNonceAccept function with values in +// http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17 +func TestSecWebSocketAccept(t *testing.T) { + nonce := []byte("dGhlIHNhbXBsZSBub25jZQ==") + expected := []byte("s3pPLMBiTxaQ9kYGzzhZRbK+xOo=") + accept, err := getNonceAccept(nonce) + if err != nil { + t.Errorf("getNonceAccept: returned error %v", err) + return + } + if !bytes.Equal(expected, accept) { + t.Errorf("getNonceAccept: expected %q got %q", expected, accept) + } +} + +func TestHybiClientHandshake(t *testing.T) { + type test struct { + url, host string + } + tests := []test{ + {"ws://server.example.com/chat", "server.example.com"}, + {"ws://127.0.0.1/chat", "127.0.0.1"}, + } + if _, err := url.ParseRequestURI("http://[fe80::1%25lo0]"); err == nil { + tests = append(tests, test{"ws://[fe80::1%25lo0]/chat", "[fe80::1]"}) + } + + for _, tt := range tests { + var b bytes.Buffer + bw := bufio.NewWriter(&b) + br := bufio.NewReader(strings.NewReader(`HTTP/1.1 101 Switching Protocols +Upgrade: websocket +Connection: Upgrade +Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= +Sec-WebSocket-Protocol: chat + +`)) + var err error + var config Config + config.Location, err = url.ParseRequestURI(tt.url) + if err != nil { + t.Fatal("location url", err) + } + config.Origin, err = url.ParseRequestURI("http://example.com") + if err != nil { + t.Fatal("origin url", err) + } + config.Protocol = append(config.Protocol, "chat") + config.Protocol = append(config.Protocol, "superchat") + config.Version = ProtocolVersionHybi13 + config.handshakeData = map[string]string{ + "key": "dGhlIHNhbXBsZSBub25jZQ==", + } + if err := hybiClientHandshake(&config, br, bw); err != nil { + t.Fatal("handshake", err) + } + req, err := http.ReadRequest(bufio.NewReader(&b)) + if err != nil { + t.Fatal("read request", err) + } + if req.Method != "GET" { + t.Errorf("request method expected GET, but got %s", req.Method) + } + if req.URL.Path != "/chat" { + t.Errorf("request path expected /chat, but got %s", req.URL.Path) + } + if req.Proto != "HTTP/1.1" { + t.Errorf("request proto expected HTTP/1.1, but got %s", req.Proto) + } + if req.Host != tt.host { + t.Errorf("request host expected %s, but got %s", tt.host, req.Host) + } + var expectedHeader = map[string]string{ + "Connection": "Upgrade", + "Upgrade": "websocket", + "Sec-Websocket-Key": config.handshakeData["key"], + "Origin": config.Origin.String(), + "Sec-Websocket-Protocol": "chat, superchat", + "Sec-Websocket-Version": fmt.Sprintf("%d", ProtocolVersionHybi13), + } + for k, v := range expectedHeader { + if req.Header.Get(k) != v { + t.Errorf("%s expected %s, but got %v", k, v, req.Header.Get(k)) + } + } + } +} + +func TestHybiClientHandshakeWithHeader(t *testing.T) { + b := bytes.NewBuffer([]byte{}) + bw := bufio.NewWriter(b) + br := bufio.NewReader(strings.NewReader(`HTTP/1.1 101 Switching Protocols +Upgrade: websocket +Connection: Upgrade +Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= +Sec-WebSocket-Protocol: chat + +`)) + var err error + config := new(Config) + config.Location, err = url.ParseRequestURI("ws://server.example.com/chat") + if err != nil { + t.Fatal("location url", err) + } + config.Origin, err = url.ParseRequestURI("http://example.com") + if err != nil { + t.Fatal("origin url", err) + } + config.Protocol = append(config.Protocol, "chat") + config.Protocol = append(config.Protocol, "superchat") + config.Version = ProtocolVersionHybi13 + config.Header = http.Header(make(map[string][]string)) + config.Header.Add("User-Agent", "test") + + config.handshakeData = map[string]string{ + "key": "dGhlIHNhbXBsZSBub25jZQ==", + } + err = hybiClientHandshake(config, br, bw) + if err != nil { + t.Errorf("handshake failed: %v", err) + } + req, err := http.ReadRequest(bufio.NewReader(b)) + if err != nil { + t.Fatalf("read request: %v", err) + } + if req.Method != "GET" { + t.Errorf("request method expected GET, but got %q", req.Method) + } + if req.URL.Path != "/chat" { + t.Errorf("request path expected /chat, but got %q", req.URL.Path) + } + if req.Proto != "HTTP/1.1" { + t.Errorf("request proto expected HTTP/1.1, but got %q", req.Proto) + } + if req.Host != "server.example.com" { + t.Errorf("request Host expected server.example.com, but got %v", req.Host) + } + var expectedHeader = map[string]string{ + "Connection": "Upgrade", + "Upgrade": "websocket", + "Sec-Websocket-Key": config.handshakeData["key"], + "Origin": config.Origin.String(), + "Sec-Websocket-Protocol": "chat, superchat", + "Sec-Websocket-Version": fmt.Sprintf("%d", ProtocolVersionHybi13), + "User-Agent": "test", + } + for k, v := range expectedHeader { + if req.Header.Get(k) != v { + t.Errorf(fmt.Sprintf("%s expected %q but got %q", k, v, req.Header.Get(k))) + } + } +} + +func TestHybiServerHandshake(t *testing.T) { + config := new(Config) + handshaker := &hybiServerHandshaker{Config: config} + br := bufio.NewReader(strings.NewReader(`GET /chat HTTP/1.1 +Host: server.example.com +Upgrade: websocket +Connection: Upgrade +Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== +Origin: http://example.com +Sec-WebSocket-Protocol: chat, superchat +Sec-WebSocket-Version: 13 + +`)) + req, err := http.ReadRequest(br) + if err != nil { + t.Fatal("request", err) + } + code, err := handshaker.ReadHandshake(br, req) + if err != nil { + t.Errorf("handshake failed: %v", err) + } + if code != http.StatusSwitchingProtocols { + t.Errorf("status expected %q but got %q", http.StatusSwitchingProtocols, code) + } + expectedProtocols := []string{"chat", "superchat"} + if fmt.Sprintf("%v", config.Protocol) != fmt.Sprintf("%v", expectedProtocols) { + t.Errorf("protocol expected %q but got %q", expectedProtocols, config.Protocol) + } + b := bytes.NewBuffer([]byte{}) + bw := bufio.NewWriter(b) + + config.Protocol = config.Protocol[:1] + + err = handshaker.AcceptHandshake(bw) + if err != nil { + t.Errorf("handshake response failed: %v", err) + } + expectedResponse := strings.Join([]string{ + "HTTP/1.1 101 Switching Protocols", + "Upgrade: websocket", + "Connection: Upgrade", + "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=", + "Sec-WebSocket-Protocol: chat", + "", ""}, "\r\n") + + if b.String() != expectedResponse { + t.Errorf("handshake expected %q but got %q", expectedResponse, b.String()) + } +} + +func TestHybiServerHandshakeNoSubProtocol(t *testing.T) { + config := new(Config) + handshaker := &hybiServerHandshaker{Config: config} + br := bufio.NewReader(strings.NewReader(`GET /chat HTTP/1.1 +Host: server.example.com +Upgrade: websocket +Connection: Upgrade +Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== +Origin: http://example.com +Sec-WebSocket-Version: 13 + +`)) + req, err := http.ReadRequest(br) + if err != nil { + t.Fatal("request", err) + } + code, err := handshaker.ReadHandshake(br, req) + if err != nil { + t.Errorf("handshake failed: %v", err) + } + if code != http.StatusSwitchingProtocols { + t.Errorf("status expected %q but got %q", http.StatusSwitchingProtocols, code) + } + if len(config.Protocol) != 0 { + t.Errorf("len(config.Protocol) expected 0, but got %q", len(config.Protocol)) + } + b := bytes.NewBuffer([]byte{}) + bw := bufio.NewWriter(b) + + err = handshaker.AcceptHandshake(bw) + if err != nil { + t.Errorf("handshake response failed: %v", err) + } + expectedResponse := strings.Join([]string{ + "HTTP/1.1 101 Switching Protocols", + "Upgrade: websocket", + "Connection: Upgrade", + "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=", + "", ""}, "\r\n") + + if b.String() != expectedResponse { + t.Errorf("handshake expected %q but got %q", expectedResponse, b.String()) + } +} + +func TestHybiServerHandshakeHybiBadVersion(t *testing.T) { + config := new(Config) + handshaker := &hybiServerHandshaker{Config: config} + br := bufio.NewReader(strings.NewReader(`GET /chat HTTP/1.1 +Host: server.example.com +Upgrade: websocket +Connection: Upgrade +Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== +Sec-WebSocket-Origin: http://example.com +Sec-WebSocket-Protocol: chat, superchat +Sec-WebSocket-Version: 9 + +`)) + req, err := http.ReadRequest(br) + if err != nil { + t.Fatal("request", err) + } + code, err := handshaker.ReadHandshake(br, req) + if err != ErrBadWebSocketVersion { + t.Errorf("handshake expected err %q but got %q", ErrBadWebSocketVersion, err) + } + if code != http.StatusBadRequest { + t.Errorf("status expected %q but got %q", http.StatusBadRequest, code) + } +} + +func testHybiFrame(t *testing.T, testHeader, testPayload, testMaskedPayload []byte, frameHeader *hybiFrameHeader) { + b := bytes.NewBuffer([]byte{}) + frameWriterFactory := &hybiFrameWriterFactory{bufio.NewWriter(b), false} + w, _ := frameWriterFactory.NewFrameWriter(TextFrame) + w.(*hybiFrameWriter).header = frameHeader + _, err := w.Write(testPayload) + w.Close() + if err != nil { + t.Errorf("Write error %q", err) + } + var expectedFrame []byte + expectedFrame = append(expectedFrame, testHeader...) + expectedFrame = append(expectedFrame, testMaskedPayload...) + if !bytes.Equal(expectedFrame, b.Bytes()) { + t.Errorf("frame expected %q got %q", expectedFrame, b.Bytes()) + } + frameReaderFactory := &hybiFrameReaderFactory{bufio.NewReader(b)} + r, err := frameReaderFactory.NewFrameReader() + if err != nil { + t.Errorf("Read error %q", err) + } + if header := r.HeaderReader(); header == nil { + t.Errorf("no header") + } else { + actualHeader := make([]byte, r.Len()) + n, err := header.Read(actualHeader) + if err != nil { + t.Errorf("Read header error %q", err) + } else { + if n < len(testHeader) { + t.Errorf("header too short %q got %q", testHeader, actualHeader[:n]) + } + if !bytes.Equal(testHeader, actualHeader[:n]) { + t.Errorf("header expected %q got %q", testHeader, actualHeader[:n]) + } + } + } + if trailer := r.TrailerReader(); trailer != nil { + t.Errorf("unexpected trailer %q", trailer) + } + frame := r.(*hybiFrameReader) + if frameHeader.Fin != frame.header.Fin || + frameHeader.OpCode != frame.header.OpCode || + len(testPayload) != int(frame.header.Length) { + t.Errorf("mismatch %v (%d) vs %v", frameHeader, len(testPayload), frame) + } + payload := make([]byte, len(testPayload)) + _, err = r.Read(payload) + if err != nil && err != io.EOF { + t.Errorf("read %v", err) + } + if !bytes.Equal(testPayload, payload) { + t.Errorf("payload %q vs %q", testPayload, payload) + } +} + +func TestHybiShortTextFrame(t *testing.T) { + frameHeader := &hybiFrameHeader{Fin: true, OpCode: TextFrame} + payload := []byte("hello") + testHybiFrame(t, []byte{0x81, 0x05}, payload, payload, frameHeader) + + payload = make([]byte, 125) + testHybiFrame(t, []byte{0x81, 125}, payload, payload, frameHeader) +} + +func TestHybiShortMaskedTextFrame(t *testing.T) { + frameHeader := &hybiFrameHeader{Fin: true, OpCode: TextFrame, + MaskingKey: []byte{0xcc, 0x55, 0x80, 0x20}} + payload := []byte("hello") + maskedPayload := []byte{0xa4, 0x30, 0xec, 0x4c, 0xa3} + header := []byte{0x81, 0x85} + header = append(header, frameHeader.MaskingKey...) + testHybiFrame(t, header, payload, maskedPayload, frameHeader) +} + +func TestHybiShortBinaryFrame(t *testing.T) { + frameHeader := &hybiFrameHeader{Fin: true, OpCode: BinaryFrame} + payload := []byte("hello") + testHybiFrame(t, []byte{0x82, 0x05}, payload, payload, frameHeader) + + payload = make([]byte, 125) + testHybiFrame(t, []byte{0x82, 125}, payload, payload, frameHeader) +} + +func TestHybiControlFrame(t *testing.T) { + payload := []byte("hello") + + frameHeader := &hybiFrameHeader{Fin: true, OpCode: PingFrame} + testHybiFrame(t, []byte{0x89, 0x05}, payload, payload, frameHeader) + + frameHeader = &hybiFrameHeader{Fin: true, OpCode: PingFrame} + testHybiFrame(t, []byte{0x89, 0x00}, nil, nil, frameHeader) + + frameHeader = &hybiFrameHeader{Fin: true, OpCode: PongFrame} + testHybiFrame(t, []byte{0x8A, 0x05}, payload, payload, frameHeader) + + frameHeader = &hybiFrameHeader{Fin: true, OpCode: PongFrame} + testHybiFrame(t, []byte{0x8A, 0x00}, nil, nil, frameHeader) + + frameHeader = &hybiFrameHeader{Fin: true, OpCode: CloseFrame} + payload = []byte{0x03, 0xe8} // 1000 + testHybiFrame(t, []byte{0x88, 0x02}, payload, payload, frameHeader) +} + +func TestHybiLongFrame(t *testing.T) { + frameHeader := &hybiFrameHeader{Fin: true, OpCode: TextFrame} + payload := make([]byte, 126) + testHybiFrame(t, []byte{0x81, 126, 0x00, 126}, payload, payload, frameHeader) + + payload = make([]byte, 65535) + testHybiFrame(t, []byte{0x81, 126, 0xff, 0xff}, payload, payload, frameHeader) + + payload = make([]byte, 65536) + testHybiFrame(t, []byte{0x81, 127, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00}, payload, payload, frameHeader) +} + +func TestHybiClientRead(t *testing.T) { + wireData := []byte{0x81, 0x05, 'h', 'e', 'l', 'l', 'o', + 0x89, 0x05, 'h', 'e', 'l', 'l', 'o', // ping + 0x81, 0x05, 'w', 'o', 'r', 'l', 'd'} + br := bufio.NewReader(bytes.NewBuffer(wireData)) + bw := bufio.NewWriter(bytes.NewBuffer([]byte{})) + conn := newHybiConn(newConfig(t, "/"), bufio.NewReadWriter(br, bw), nil, nil) + + msg := make([]byte, 512) + n, err := conn.Read(msg) + if err != nil { + t.Errorf("read 1st frame, error %q", err) + } + if n != 5 { + t.Errorf("read 1st frame, expect 5, got %d", n) + } + if !bytes.Equal(wireData[2:7], msg[:n]) { + t.Errorf("read 1st frame %v, got %v", wireData[2:7], msg[:n]) + } + n, err = conn.Read(msg) + if err != nil { + t.Errorf("read 2nd frame, error %q", err) + } + if n != 5 { + t.Errorf("read 2nd frame, expect 5, got %d", n) + } + if !bytes.Equal(wireData[16:21], msg[:n]) { + t.Errorf("read 2nd frame %v, got %v", wireData[16:21], msg[:n]) + } + n, err = conn.Read(msg) + if err == nil { + t.Errorf("read not EOF") + } + if n != 0 { + t.Errorf("expect read 0, got %d", n) + } +} + +func TestHybiShortRead(t *testing.T) { + wireData := []byte{0x81, 0x05, 'h', 'e', 'l', 'l', 'o', + 0x89, 0x05, 'h', 'e', 'l', 'l', 'o', // ping + 0x81, 0x05, 'w', 'o', 'r', 'l', 'd'} + br := bufio.NewReader(bytes.NewBuffer(wireData)) + bw := bufio.NewWriter(bytes.NewBuffer([]byte{})) + conn := newHybiConn(newConfig(t, "/"), bufio.NewReadWriter(br, bw), nil, nil) + + step := 0 + pos := 0 + expectedPos := []int{2, 5, 16, 19} + expectedLen := []int{3, 2, 3, 2} + for { + msg := make([]byte, 3) + n, err := conn.Read(msg) + if step >= len(expectedPos) { + if err == nil { + t.Errorf("read not EOF") + } + if n != 0 { + t.Errorf("expect read 0, got %d", n) + } + return + } + pos = expectedPos[step] + endPos := pos + expectedLen[step] + if err != nil { + t.Errorf("read from %d, got error %q", pos, err) + return + } + if n != endPos-pos { + t.Errorf("read from %d, expect %d, got %d", pos, endPos-pos, n) + } + if !bytes.Equal(wireData[pos:endPos], msg[:n]) { + t.Errorf("read from %d, frame %v, got %v", pos, wireData[pos:endPos], msg[:n]) + } + step++ + } +} + +func TestHybiServerRead(t *testing.T) { + wireData := []byte{0x81, 0x85, 0xcc, 0x55, 0x80, 0x20, + 0xa4, 0x30, 0xec, 0x4c, 0xa3, // hello + 0x89, 0x85, 0xcc, 0x55, 0x80, 0x20, + 0xa4, 0x30, 0xec, 0x4c, 0xa3, // ping: hello + 0x81, 0x85, 0xed, 0x83, 0xb4, 0x24, + 0x9a, 0xec, 0xc6, 0x48, 0x89, // world + } + br := bufio.NewReader(bytes.NewBuffer(wireData)) + bw := bufio.NewWriter(bytes.NewBuffer([]byte{})) + conn := newHybiConn(newConfig(t, "/"), bufio.NewReadWriter(br, bw), nil, new(http.Request)) + + expected := [][]byte{[]byte("hello"), []byte("world")} + + msg := make([]byte, 512) + n, err := conn.Read(msg) + if err != nil { + t.Errorf("read 1st frame, error %q", err) + } + if n != 5 { + t.Errorf("read 1st frame, expect 5, got %d", n) + } + if !bytes.Equal(expected[0], msg[:n]) { + t.Errorf("read 1st frame %q, got %q", expected[0], msg[:n]) + } + + n, err = conn.Read(msg) + if err != nil { + t.Errorf("read 2nd frame, error %q", err) + } + if n != 5 { + t.Errorf("read 2nd frame, expect 5, got %d", n) + } + if !bytes.Equal(expected[1], msg[:n]) { + t.Errorf("read 2nd frame %q, got %q", expected[1], msg[:n]) + } + + n, err = conn.Read(msg) + if err == nil { + t.Errorf("read not EOF") + } + if n != 0 { + t.Errorf("expect read 0, got %d", n) + } +} + +func TestHybiServerReadWithoutMasking(t *testing.T) { + wireData := []byte{0x81, 0x05, 'h', 'e', 'l', 'l', 'o'} + br := bufio.NewReader(bytes.NewBuffer(wireData)) + bw := bufio.NewWriter(bytes.NewBuffer([]byte{})) + conn := newHybiConn(newConfig(t, "/"), bufio.NewReadWriter(br, bw), nil, new(http.Request)) + // server MUST close the connection upon receiving a non-masked frame. + msg := make([]byte, 512) + _, err := conn.Read(msg) + if err != io.EOF { + t.Errorf("read 1st frame, expect %q, but got %q", io.EOF, err) + } +} + +func TestHybiClientReadWithMasking(t *testing.T) { + wireData := []byte{0x81, 0x85, 0xcc, 0x55, 0x80, 0x20, + 0xa4, 0x30, 0xec, 0x4c, 0xa3, // hello + } + br := bufio.NewReader(bytes.NewBuffer(wireData)) + bw := bufio.NewWriter(bytes.NewBuffer([]byte{})) + conn := newHybiConn(newConfig(t, "/"), bufio.NewReadWriter(br, bw), nil, nil) + + // client MUST close the connection upon receiving a masked frame. + msg := make([]byte, 512) + _, err := conn.Read(msg) + if err != io.EOF { + t.Errorf("read 1st frame, expect %q, but got %q", io.EOF, err) + } +} + +// Test the hybiServerHandshaker supports firefox implementation and +// checks Connection request header include (but it's not necessary +// equal to) "upgrade" +func TestHybiServerFirefoxHandshake(t *testing.T) { + config := new(Config) + handshaker := &hybiServerHandshaker{Config: config} + br := bufio.NewReader(strings.NewReader(`GET /chat HTTP/1.1 +Host: server.example.com +Upgrade: websocket +Connection: keep-alive, upgrade +Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== +Origin: http://example.com +Sec-WebSocket-Protocol: chat, superchat +Sec-WebSocket-Version: 13 + +`)) + req, err := http.ReadRequest(br) + if err != nil { + t.Fatal("request", err) + } + code, err := handshaker.ReadHandshake(br, req) + if err != nil { + t.Errorf("handshake failed: %v", err) + } + if code != http.StatusSwitchingProtocols { + t.Errorf("status expected %q but got %q", http.StatusSwitchingProtocols, code) + } + b := bytes.NewBuffer([]byte{}) + bw := bufio.NewWriter(b) + + config.Protocol = []string{"chat"} + + err = handshaker.AcceptHandshake(bw) + if err != nil { + t.Errorf("handshake response failed: %v", err) + } + expectedResponse := strings.Join([]string{ + "HTTP/1.1 101 Switching Protocols", + "Upgrade: websocket", + "Connection: Upgrade", + "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=", + "Sec-WebSocket-Protocol: chat", + "", ""}, "\r\n") + + if b.String() != expectedResponse { + t.Errorf("handshake expected %q but got %q", expectedResponse, b.String()) + } +} diff --git a/api/vendor/golang.org/x/net/websocket/server.go b/api/vendor/golang.org/x/net/websocket/server.go new file mode 100644 index 0000000..0895dea --- /dev/null +++ b/api/vendor/golang.org/x/net/websocket/server.go @@ -0,0 +1,113 @@ +// 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 websocket + +import ( + "bufio" + "fmt" + "io" + "net/http" +) + +func newServerConn(rwc io.ReadWriteCloser, buf *bufio.ReadWriter, req *http.Request, config *Config, handshake func(*Config, *http.Request) error) (conn *Conn, err error) { + var hs serverHandshaker = &hybiServerHandshaker{Config: config} + code, err := hs.ReadHandshake(buf.Reader, req) + if err == ErrBadWebSocketVersion { + fmt.Fprintf(buf, "HTTP/1.1 %03d %s\r\n", code, http.StatusText(code)) + fmt.Fprintf(buf, "Sec-WebSocket-Version: %s\r\n", SupportedProtocolVersion) + buf.WriteString("\r\n") + buf.WriteString(err.Error()) + buf.Flush() + return + } + if err != nil { + fmt.Fprintf(buf, "HTTP/1.1 %03d %s\r\n", code, http.StatusText(code)) + buf.WriteString("\r\n") + buf.WriteString(err.Error()) + buf.Flush() + return + } + if handshake != nil { + err = handshake(config, req) + if err != nil { + code = http.StatusForbidden + fmt.Fprintf(buf, "HTTP/1.1 %03d %s\r\n", code, http.StatusText(code)) + buf.WriteString("\r\n") + buf.Flush() + return + } + } + err = hs.AcceptHandshake(buf.Writer) + if err != nil { + code = http.StatusBadRequest + fmt.Fprintf(buf, "HTTP/1.1 %03d %s\r\n", code, http.StatusText(code)) + buf.WriteString("\r\n") + buf.Flush() + return + } + conn = hs.NewServerConn(buf, rwc, req) + return +} + +// Server represents a server of a WebSocket. +type Server struct { + // Config is a WebSocket configuration for new WebSocket connection. + Config + + // Handshake is an optional function in WebSocket handshake. + // For example, you can check, or don't check Origin header. + // Another example, you can select config.Protocol. + Handshake func(*Config, *http.Request) error + + // Handler handles a WebSocket connection. + Handler +} + +// ServeHTTP implements the http.Handler interface for a WebSocket +func (s Server) ServeHTTP(w http.ResponseWriter, req *http.Request) { + s.serveWebSocket(w, req) +} + +func (s Server) serveWebSocket(w http.ResponseWriter, req *http.Request) { + rwc, buf, err := w.(http.Hijacker).Hijack() + if err != nil { + panic("Hijack failed: " + err.Error()) + } + // The server should abort the WebSocket connection if it finds + // the client did not send a handshake that matches with protocol + // specification. + defer rwc.Close() + conn, err := newServerConn(rwc, buf, req, &s.Config, s.Handshake) + if err != nil { + return + } + if conn == nil { + panic("unexpected nil conn") + } + s.Handler(conn) +} + +// Handler is a simple interface to a WebSocket browser client. +// It checks if Origin header is valid URL by default. +// You might want to verify websocket.Conn.Config().Origin in the func. +// If you use Server instead of Handler, you could call websocket.Origin and +// check the origin in your Handshake func. So, if you want to accept +// non-browser clients, which do not send an Origin header, set a +// Server.Handshake that does not check the origin. +type Handler func(*Conn) + +func checkOrigin(config *Config, req *http.Request) (err error) { + config.Origin, err = Origin(config, req) + if err == nil && config.Origin == nil { + return fmt.Errorf("null origin") + } + return err +} + +// ServeHTTP implements the http.Handler interface for a WebSocket +func (h Handler) ServeHTTP(w http.ResponseWriter, req *http.Request) { + s := Server{Handler: h, Handshake: checkOrigin} + s.serveWebSocket(w, req) +} diff --git a/api/vendor/golang.org/x/net/websocket/websocket.go b/api/vendor/golang.org/x/net/websocket/websocket.go new file mode 100644 index 0000000..e242c89 --- /dev/null +++ b/api/vendor/golang.org/x/net/websocket/websocket.go @@ -0,0 +1,448 @@ +// 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 websocket implements a client and server for the WebSocket protocol +// as specified in RFC 6455. +// +// This package currently lacks some features found in an alternative +// and more actively maintained WebSocket package: +// +// https://godoc.org/github.com/gorilla/websocket +// +package websocket // import "golang.org/x/net/websocket" + +import ( + "bufio" + "crypto/tls" + "encoding/json" + "errors" + "io" + "io/ioutil" + "net" + "net/http" + "net/url" + "sync" + "time" +) + +const ( + ProtocolVersionHybi13 = 13 + ProtocolVersionHybi = ProtocolVersionHybi13 + SupportedProtocolVersion = "13" + + ContinuationFrame = 0 + TextFrame = 1 + BinaryFrame = 2 + CloseFrame = 8 + PingFrame = 9 + PongFrame = 10 + UnknownFrame = 255 + + DefaultMaxPayloadBytes = 32 << 20 // 32MB +) + +// ProtocolError represents WebSocket protocol errors. +type ProtocolError struct { + ErrorString string +} + +func (err *ProtocolError) Error() string { return err.ErrorString } + +var ( + ErrBadProtocolVersion = &ProtocolError{"bad protocol version"} + ErrBadScheme = &ProtocolError{"bad scheme"} + ErrBadStatus = &ProtocolError{"bad status"} + ErrBadUpgrade = &ProtocolError{"missing or bad upgrade"} + ErrBadWebSocketOrigin = &ProtocolError{"missing or bad WebSocket-Origin"} + ErrBadWebSocketLocation = &ProtocolError{"missing or bad WebSocket-Location"} + ErrBadWebSocketProtocol = &ProtocolError{"missing or bad WebSocket-Protocol"} + ErrBadWebSocketVersion = &ProtocolError{"missing or bad WebSocket Version"} + ErrChallengeResponse = &ProtocolError{"mismatch challenge/response"} + ErrBadFrame = &ProtocolError{"bad frame"} + ErrBadFrameBoundary = &ProtocolError{"not on frame boundary"} + ErrNotWebSocket = &ProtocolError{"not websocket protocol"} + ErrBadRequestMethod = &ProtocolError{"bad method"} + ErrNotSupported = &ProtocolError{"not supported"} +) + +// ErrFrameTooLarge is returned by Codec's Receive method if payload size +// exceeds limit set by Conn.MaxPayloadBytes +var ErrFrameTooLarge = errors.New("websocket: frame payload size exceeds limit") + +// Addr is an implementation of net.Addr for WebSocket. +type Addr struct { + *url.URL +} + +// Network returns the network type for a WebSocket, "websocket". +func (addr *Addr) Network() string { return "websocket" } + +// Config is a WebSocket configuration +type Config struct { + // A WebSocket server address. + Location *url.URL + + // A Websocket client origin. + Origin *url.URL + + // WebSocket subprotocols. + Protocol []string + + // WebSocket protocol version. + Version int + + // TLS config for secure WebSocket (wss). + TlsConfig *tls.Config + + // Additional header fields to be sent in WebSocket opening handshake. + Header http.Header + + // Dialer used when opening websocket connections. + Dialer *net.Dialer + + handshakeData map[string]string +} + +// serverHandshaker is an interface to handle WebSocket server side handshake. +type serverHandshaker interface { + // ReadHandshake reads handshake request message from client. + // Returns http response code and error if any. + ReadHandshake(buf *bufio.Reader, req *http.Request) (code int, err error) + + // AcceptHandshake accepts the client handshake request and sends + // handshake response back to client. + AcceptHandshake(buf *bufio.Writer) (err error) + + // NewServerConn creates a new WebSocket connection. + NewServerConn(buf *bufio.ReadWriter, rwc io.ReadWriteCloser, request *http.Request) (conn *Conn) +} + +// frameReader is an interface to read a WebSocket frame. +type frameReader interface { + // Reader is to read payload of the frame. + io.Reader + + // PayloadType returns payload type. + PayloadType() byte + + // HeaderReader returns a reader to read header of the frame. + HeaderReader() io.Reader + + // TrailerReader returns a reader to read trailer of the frame. + // If it returns nil, there is no trailer in the frame. + TrailerReader() io.Reader + + // Len returns total length of the frame, including header and trailer. + Len() int +} + +// frameReaderFactory is an interface to creates new frame reader. +type frameReaderFactory interface { + NewFrameReader() (r frameReader, err error) +} + +// frameWriter is an interface to write a WebSocket frame. +type frameWriter interface { + // Writer is to write payload of the frame. + io.WriteCloser +} + +// frameWriterFactory is an interface to create new frame writer. +type frameWriterFactory interface { + NewFrameWriter(payloadType byte) (w frameWriter, err error) +} + +type frameHandler interface { + HandleFrame(frame frameReader) (r frameReader, err error) + WriteClose(status int) (err error) +} + +// Conn represents a WebSocket connection. +// +// Multiple goroutines may invoke methods on a Conn simultaneously. +type Conn struct { + config *Config + request *http.Request + + buf *bufio.ReadWriter + rwc io.ReadWriteCloser + + rio sync.Mutex + frameReaderFactory + frameReader + + wio sync.Mutex + frameWriterFactory + + frameHandler + PayloadType byte + defaultCloseStatus int + + // MaxPayloadBytes limits the size of frame payload received over Conn + // by Codec's Receive method. If zero, DefaultMaxPayloadBytes is used. + MaxPayloadBytes int +} + +// Read implements the io.Reader interface: +// it reads data of a frame from the WebSocket connection. +// if msg is not large enough for the frame data, it fills the msg and next Read +// will read the rest of the frame data. +// it reads Text frame or Binary frame. +func (ws *Conn) Read(msg []byte) (n int, err error) { + ws.rio.Lock() + defer ws.rio.Unlock() +again: + if ws.frameReader == nil { + frame, err := ws.frameReaderFactory.NewFrameReader() + if err != nil { + return 0, err + } + ws.frameReader, err = ws.frameHandler.HandleFrame(frame) + if err != nil { + return 0, err + } + if ws.frameReader == nil { + goto again + } + } + n, err = ws.frameReader.Read(msg) + if err == io.EOF { + if trailer := ws.frameReader.TrailerReader(); trailer != nil { + io.Copy(ioutil.Discard, trailer) + } + ws.frameReader = nil + goto again + } + return n, err +} + +// Write implements the io.Writer interface: +// it writes data as a frame to the WebSocket connection. +func (ws *Conn) Write(msg []byte) (n int, err error) { + ws.wio.Lock() + defer ws.wio.Unlock() + w, err := ws.frameWriterFactory.NewFrameWriter(ws.PayloadType) + if err != nil { + return 0, err + } + n, err = w.Write(msg) + w.Close() + return n, err +} + +// Close implements the io.Closer interface. +func (ws *Conn) Close() error { + err := ws.frameHandler.WriteClose(ws.defaultCloseStatus) + err1 := ws.rwc.Close() + if err != nil { + return err + } + return err1 +} + +func (ws *Conn) IsClientConn() bool { return ws.request == nil } +func (ws *Conn) IsServerConn() bool { return ws.request != nil } + +// LocalAddr returns the WebSocket Origin for the connection for client, or +// the WebSocket location for server. +func (ws *Conn) LocalAddr() net.Addr { + if ws.IsClientConn() { + return &Addr{ws.config.Origin} + } + return &Addr{ws.config.Location} +} + +// RemoteAddr returns the WebSocket location for the connection for client, or +// the Websocket Origin for server. +func (ws *Conn) RemoteAddr() net.Addr { + if ws.IsClientConn() { + return &Addr{ws.config.Location} + } + return &Addr{ws.config.Origin} +} + +var errSetDeadline = errors.New("websocket: cannot set deadline: not using a net.Conn") + +// SetDeadline sets the connection's network read & write deadlines. +func (ws *Conn) SetDeadline(t time.Time) error { + if conn, ok := ws.rwc.(net.Conn); ok { + return conn.SetDeadline(t) + } + return errSetDeadline +} + +// SetReadDeadline sets the connection's network read deadline. +func (ws *Conn) SetReadDeadline(t time.Time) error { + if conn, ok := ws.rwc.(net.Conn); ok { + return conn.SetReadDeadline(t) + } + return errSetDeadline +} + +// SetWriteDeadline sets the connection's network write deadline. +func (ws *Conn) SetWriteDeadline(t time.Time) error { + if conn, ok := ws.rwc.(net.Conn); ok { + return conn.SetWriteDeadline(t) + } + return errSetDeadline +} + +// Config returns the WebSocket config. +func (ws *Conn) Config() *Config { return ws.config } + +// Request returns the http request upgraded to the WebSocket. +// It is nil for client side. +func (ws *Conn) Request() *http.Request { return ws.request } + +// Codec represents a symmetric pair of functions that implement a codec. +type Codec struct { + Marshal func(v interface{}) (data []byte, payloadType byte, err error) + Unmarshal func(data []byte, payloadType byte, v interface{}) (err error) +} + +// Send sends v marshaled by cd.Marshal as single frame to ws. +func (cd Codec) Send(ws *Conn, v interface{}) (err error) { + data, payloadType, err := cd.Marshal(v) + if err != nil { + return err + } + ws.wio.Lock() + defer ws.wio.Unlock() + w, err := ws.frameWriterFactory.NewFrameWriter(payloadType) + if err != nil { + return err + } + _, err = w.Write(data) + w.Close() + return err +} + +// Receive receives single frame from ws, unmarshaled by cd.Unmarshal and stores +// in v. The whole frame payload is read to an in-memory buffer; max size of +// payload is defined by ws.MaxPayloadBytes. If frame payload size exceeds +// limit, ErrFrameTooLarge is returned; in this case frame is not read off wire +// completely. The next call to Receive would read and discard leftover data of +// previous oversized frame before processing next frame. +func (cd Codec) Receive(ws *Conn, v interface{}) (err error) { + ws.rio.Lock() + defer ws.rio.Unlock() + if ws.frameReader != nil { + _, err = io.Copy(ioutil.Discard, ws.frameReader) + if err != nil { + return err + } + ws.frameReader = nil + } +again: + frame, err := ws.frameReaderFactory.NewFrameReader() + if err != nil { + return err + } + frame, err = ws.frameHandler.HandleFrame(frame) + if err != nil { + return err + } + if frame == nil { + goto again + } + maxPayloadBytes := ws.MaxPayloadBytes + if maxPayloadBytes == 0 { + maxPayloadBytes = DefaultMaxPayloadBytes + } + if hf, ok := frame.(*hybiFrameReader); ok && hf.header.Length > int64(maxPayloadBytes) { + // payload size exceeds limit, no need to call Unmarshal + // + // set frameReader to current oversized frame so that + // the next call to this function can drain leftover + // data before processing the next frame + ws.frameReader = frame + return ErrFrameTooLarge + } + payloadType := frame.PayloadType() + data, err := ioutil.ReadAll(frame) + if err != nil { + return err + } + return cd.Unmarshal(data, payloadType, v) +} + +func marshal(v interface{}) (msg []byte, payloadType byte, err error) { + switch data := v.(type) { + case string: + return []byte(data), TextFrame, nil + case []byte: + return data, BinaryFrame, nil + } + return nil, UnknownFrame, ErrNotSupported +} + +func unmarshal(msg []byte, payloadType byte, v interface{}) (err error) { + switch data := v.(type) { + case *string: + *data = string(msg) + return nil + case *[]byte: + *data = msg + return nil + } + return ErrNotSupported +} + +/* +Message is a codec to send/receive text/binary data in a frame on WebSocket connection. +To send/receive text frame, use string type. +To send/receive binary frame, use []byte type. + +Trivial usage: + + import "websocket" + + // receive text frame + var message string + websocket.Message.Receive(ws, &message) + + // send text frame + message = "hello" + websocket.Message.Send(ws, message) + + // receive binary frame + var data []byte + websocket.Message.Receive(ws, &data) + + // send binary frame + data = []byte{0, 1, 2} + websocket.Message.Send(ws, data) + +*/ +var Message = Codec{marshal, unmarshal} + +func jsonMarshal(v interface{}) (msg []byte, payloadType byte, err error) { + msg, err = json.Marshal(v) + return msg, TextFrame, err +} + +func jsonUnmarshal(msg []byte, payloadType byte, v interface{}) (err error) { + return json.Unmarshal(msg, v) +} + +/* +JSON is a codec to send/receive JSON data in a frame from a WebSocket connection. + +Trivial usage: + + import "websocket" + + type T struct { + Msg string + Count int + } + + // receive JSON type T + var data T + websocket.JSON.Receive(ws, &data) + + // send JSON type T + websocket.JSON.Send(ws, data) +*/ +var JSON = Codec{jsonMarshal, jsonUnmarshal} diff --git a/api/vendor/golang.org/x/net/websocket/websocket_test.go b/api/vendor/golang.org/x/net/websocket/websocket_test.go new file mode 100644 index 0000000..2054ce8 --- /dev/null +++ b/api/vendor/golang.org/x/net/websocket/websocket_test.go @@ -0,0 +1,665 @@ +// 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 websocket + +import ( + "bytes" + "crypto/rand" + "fmt" + "io" + "log" + "net" + "net/http" + "net/http/httptest" + "net/url" + "reflect" + "runtime" + "strings" + "sync" + "testing" + "time" +) + +var serverAddr string +var once sync.Once + +func echoServer(ws *Conn) { + defer ws.Close() + io.Copy(ws, ws) +} + +type Count struct { + S string + N int +} + +func countServer(ws *Conn) { + defer ws.Close() + for { + var count Count + err := JSON.Receive(ws, &count) + if err != nil { + return + } + count.N++ + count.S = strings.Repeat(count.S, count.N) + err = JSON.Send(ws, count) + if err != nil { + return + } + } +} + +type testCtrlAndDataHandler struct { + hybiFrameHandler +} + +func (h *testCtrlAndDataHandler) WritePing(b []byte) (int, error) { + h.hybiFrameHandler.conn.wio.Lock() + defer h.hybiFrameHandler.conn.wio.Unlock() + w, err := h.hybiFrameHandler.conn.frameWriterFactory.NewFrameWriter(PingFrame) + if err != nil { + return 0, err + } + n, err := w.Write(b) + w.Close() + return n, err +} + +func ctrlAndDataServer(ws *Conn) { + defer ws.Close() + h := &testCtrlAndDataHandler{hybiFrameHandler: hybiFrameHandler{conn: ws}} + ws.frameHandler = h + + go func() { + for i := 0; ; i++ { + var b []byte + if i%2 != 0 { // with or without payload + b = []byte(fmt.Sprintf("#%d-CONTROL-FRAME-FROM-SERVER", i)) + } + if _, err := h.WritePing(b); err != nil { + break + } + if _, err := h.WritePong(b); err != nil { // unsolicited pong + break + } + time.Sleep(10 * time.Millisecond) + } + }() + + b := make([]byte, 128) + for { + n, err := ws.Read(b) + if err != nil { + break + } + if _, err := ws.Write(b[:n]); err != nil { + break + } + } +} + +func subProtocolHandshake(config *Config, req *http.Request) error { + for _, proto := range config.Protocol { + if proto == "chat" { + config.Protocol = []string{proto} + return nil + } + } + return ErrBadWebSocketProtocol +} + +func subProtoServer(ws *Conn) { + for _, proto := range ws.Config().Protocol { + io.WriteString(ws, proto) + } +} + +func startServer() { + http.Handle("/echo", Handler(echoServer)) + http.Handle("/count", Handler(countServer)) + http.Handle("/ctrldata", Handler(ctrlAndDataServer)) + subproto := Server{ + Handshake: subProtocolHandshake, + Handler: Handler(subProtoServer), + } + http.Handle("/subproto", subproto) + server := httptest.NewServer(nil) + serverAddr = server.Listener.Addr().String() + log.Print("Test WebSocket server listening on ", serverAddr) +} + +func newConfig(t *testing.T, path string) *Config { + config, _ := NewConfig(fmt.Sprintf("ws://%s%s", serverAddr, path), "http://localhost") + return config +} + +func TestEcho(t *testing.T) { + once.Do(startServer) + + // websocket.Dial() + client, err := net.Dial("tcp", serverAddr) + if err != nil { + t.Fatal("dialing", err) + } + conn, err := NewClient(newConfig(t, "/echo"), client) + if err != nil { + t.Errorf("WebSocket handshake error: %v", err) + return + } + + msg := []byte("hello, world\n") + if _, err := conn.Write(msg); err != nil { + t.Errorf("Write: %v", err) + } + var actual_msg = make([]byte, 512) + n, err := conn.Read(actual_msg) + if err != nil { + t.Errorf("Read: %v", err) + } + actual_msg = actual_msg[0:n] + if !bytes.Equal(msg, actual_msg) { + t.Errorf("Echo: expected %q got %q", msg, actual_msg) + } + conn.Close() +} + +func TestAddr(t *testing.T) { + once.Do(startServer) + + // websocket.Dial() + client, err := net.Dial("tcp", serverAddr) + if err != nil { + t.Fatal("dialing", err) + } + conn, err := NewClient(newConfig(t, "/echo"), client) + if err != nil { + t.Errorf("WebSocket handshake error: %v", err) + return + } + + ra := conn.RemoteAddr().String() + if !strings.HasPrefix(ra, "ws://") || !strings.HasSuffix(ra, "/echo") { + t.Errorf("Bad remote addr: %v", ra) + } + la := conn.LocalAddr().String() + if !strings.HasPrefix(la, "http://") { + t.Errorf("Bad local addr: %v", la) + } + conn.Close() +} + +func TestCount(t *testing.T) { + once.Do(startServer) + + // websocket.Dial() + client, err := net.Dial("tcp", serverAddr) + if err != nil { + t.Fatal("dialing", err) + } + conn, err := NewClient(newConfig(t, "/count"), client) + if err != nil { + t.Errorf("WebSocket handshake error: %v", err) + return + } + + var count Count + count.S = "hello" + if err := JSON.Send(conn, count); err != nil { + t.Errorf("Write: %v", err) + } + if err := JSON.Receive(conn, &count); err != nil { + t.Errorf("Read: %v", err) + } + if count.N != 1 { + t.Errorf("count: expected %d got %d", 1, count.N) + } + if count.S != "hello" { + t.Errorf("count: expected %q got %q", "hello", count.S) + } + if err := JSON.Send(conn, count); err != nil { + t.Errorf("Write: %v", err) + } + if err := JSON.Receive(conn, &count); err != nil { + t.Errorf("Read: %v", err) + } + if count.N != 2 { + t.Errorf("count: expected %d got %d", 2, count.N) + } + if count.S != "hellohello" { + t.Errorf("count: expected %q got %q", "hellohello", count.S) + } + conn.Close() +} + +func TestWithQuery(t *testing.T) { + once.Do(startServer) + + client, err := net.Dial("tcp", serverAddr) + if err != nil { + t.Fatal("dialing", err) + } + + config := newConfig(t, "/echo") + config.Location, err = url.ParseRequestURI(fmt.Sprintf("ws://%s/echo?q=v", serverAddr)) + if err != nil { + t.Fatal("location url", err) + } + + ws, err := NewClient(config, client) + if err != nil { + t.Errorf("WebSocket handshake: %v", err) + return + } + ws.Close() +} + +func testWithProtocol(t *testing.T, subproto []string) (string, error) { + once.Do(startServer) + + client, err := net.Dial("tcp", serverAddr) + if err != nil { + t.Fatal("dialing", err) + } + + config := newConfig(t, "/subproto") + config.Protocol = subproto + + ws, err := NewClient(config, client) + if err != nil { + return "", err + } + msg := make([]byte, 16) + n, err := ws.Read(msg) + if err != nil { + return "", err + } + ws.Close() + return string(msg[:n]), nil +} + +func TestWithProtocol(t *testing.T) { + proto, err := testWithProtocol(t, []string{"chat"}) + if err != nil { + t.Errorf("SubProto: unexpected error: %v", err) + } + if proto != "chat" { + t.Errorf("SubProto: expected %q, got %q", "chat", proto) + } +} + +func TestWithTwoProtocol(t *testing.T) { + proto, err := testWithProtocol(t, []string{"test", "chat"}) + if err != nil { + t.Errorf("SubProto: unexpected error: %v", err) + } + if proto != "chat" { + t.Errorf("SubProto: expected %q, got %q", "chat", proto) + } +} + +func TestWithBadProtocol(t *testing.T) { + _, err := testWithProtocol(t, []string{"test"}) + if err != ErrBadStatus { + t.Errorf("SubProto: expected %v, got %v", ErrBadStatus, err) + } +} + +func TestHTTP(t *testing.T) { + once.Do(startServer) + + // If the client did not send a handshake that matches the protocol + // specification, the server MUST return an HTTP response with an + // appropriate error code (such as 400 Bad Request) + resp, err := http.Get(fmt.Sprintf("http://%s/echo", serverAddr)) + if err != nil { + t.Errorf("Get: error %#v", err) + return + } + if resp == nil { + t.Error("Get: resp is null") + return + } + if resp.StatusCode != http.StatusBadRequest { + t.Errorf("Get: expected %q got %q", http.StatusBadRequest, resp.StatusCode) + } +} + +func TestTrailingSpaces(t *testing.T) { + // http://code.google.com/p/go/issues/detail?id=955 + // The last runs of this create keys with trailing spaces that should not be + // generated by the client. + once.Do(startServer) + config := newConfig(t, "/echo") + for i := 0; i < 30; i++ { + // body + ws, err := DialConfig(config) + if err != nil { + t.Errorf("Dial #%d failed: %v", i, err) + break + } + ws.Close() + } +} + +func TestDialConfigBadVersion(t *testing.T) { + once.Do(startServer) + config := newConfig(t, "/echo") + config.Version = 1234 + + _, err := DialConfig(config) + + if dialerr, ok := err.(*DialError); ok { + if dialerr.Err != ErrBadProtocolVersion { + t.Errorf("dial expected err %q but got %q", ErrBadProtocolVersion, dialerr.Err) + } + } +} + +func TestDialConfigWithDialer(t *testing.T) { + once.Do(startServer) + config := newConfig(t, "/echo") + config.Dialer = &net.Dialer{ + Deadline: time.Now().Add(-time.Minute), + } + _, err := DialConfig(config) + dialerr, ok := err.(*DialError) + if !ok { + t.Fatalf("DialError expected, got %#v", err) + } + neterr, ok := dialerr.Err.(*net.OpError) + if !ok { + t.Fatalf("net.OpError error expected, got %#v", dialerr.Err) + } + if !neterr.Timeout() { + t.Fatalf("expected timeout error, got %#v", neterr) + } +} + +func TestSmallBuffer(t *testing.T) { + // http://code.google.com/p/go/issues/detail?id=1145 + // Read should be able to handle reading a fragment of a frame. + once.Do(startServer) + + // websocket.Dial() + client, err := net.Dial("tcp", serverAddr) + if err != nil { + t.Fatal("dialing", err) + } + conn, err := NewClient(newConfig(t, "/echo"), client) + if err != nil { + t.Errorf("WebSocket handshake error: %v", err) + return + } + + msg := []byte("hello, world\n") + if _, err := conn.Write(msg); err != nil { + t.Errorf("Write: %v", err) + } + var small_msg = make([]byte, 8) + n, err := conn.Read(small_msg) + if err != nil { + t.Errorf("Read: %v", err) + } + if !bytes.Equal(msg[:len(small_msg)], small_msg) { + t.Errorf("Echo: expected %q got %q", msg[:len(small_msg)], small_msg) + } + var second_msg = make([]byte, len(msg)) + n, err = conn.Read(second_msg) + if err != nil { + t.Errorf("Read: %v", err) + } + second_msg = second_msg[0:n] + if !bytes.Equal(msg[len(small_msg):], second_msg) { + t.Errorf("Echo: expected %q got %q", msg[len(small_msg):], second_msg) + } + conn.Close() +} + +var parseAuthorityTests = []struct { + in *url.URL + out string +}{ + { + &url.URL{ + Scheme: "ws", + Host: "www.google.com", + }, + "www.google.com:80", + }, + { + &url.URL{ + Scheme: "wss", + Host: "www.google.com", + }, + "www.google.com:443", + }, + { + &url.URL{ + Scheme: "ws", + Host: "www.google.com:80", + }, + "www.google.com:80", + }, + { + &url.URL{ + Scheme: "wss", + Host: "www.google.com:443", + }, + "www.google.com:443", + }, + // some invalid ones for parseAuthority. parseAuthority doesn't + // concern itself with the scheme unless it actually knows about it + { + &url.URL{ + Scheme: "http", + Host: "www.google.com", + }, + "www.google.com", + }, + { + &url.URL{ + Scheme: "http", + Host: "www.google.com:80", + }, + "www.google.com:80", + }, + { + &url.URL{ + Scheme: "asdf", + Host: "127.0.0.1", + }, + "127.0.0.1", + }, + { + &url.URL{ + Scheme: "asdf", + Host: "www.google.com", + }, + "www.google.com", + }, +} + +func TestParseAuthority(t *testing.T) { + for _, tt := range parseAuthorityTests { + out := parseAuthority(tt.in) + if out != tt.out { + t.Errorf("got %v; want %v", out, tt.out) + } + } +} + +type closerConn struct { + net.Conn + closed int // count of the number of times Close was called +} + +func (c *closerConn) Close() error { + c.closed++ + return c.Conn.Close() +} + +func TestClose(t *testing.T) { + if runtime.GOOS == "plan9" { + t.Skip("see golang.org/issue/11454") + } + + once.Do(startServer) + + conn, err := net.Dial("tcp", serverAddr) + if err != nil { + t.Fatal("dialing", err) + } + + cc := closerConn{Conn: conn} + + client, err := NewClient(newConfig(t, "/echo"), &cc) + if err != nil { + t.Fatalf("WebSocket handshake: %v", err) + } + + // set the deadline to ten minutes ago, which will have expired by the time + // client.Close sends the close status frame. + conn.SetDeadline(time.Now().Add(-10 * time.Minute)) + + if err := client.Close(); err == nil { + t.Errorf("ws.Close(): expected error, got %v", err) + } + if cc.closed < 1 { + t.Fatalf("ws.Close(): expected underlying ws.rwc.Close to be called > 0 times, got: %v", cc.closed) + } +} + +var originTests = []struct { + req *http.Request + origin *url.URL +}{ + { + req: &http.Request{ + Header: http.Header{ + "Origin": []string{"http://www.example.com"}, + }, + }, + origin: &url.URL{ + Scheme: "http", + Host: "www.example.com", + }, + }, + { + req: &http.Request{}, + }, +} + +func TestOrigin(t *testing.T) { + conf := newConfig(t, "/echo") + conf.Version = ProtocolVersionHybi13 + for i, tt := range originTests { + origin, err := Origin(conf, tt.req) + if err != nil { + t.Error(err) + continue + } + if !reflect.DeepEqual(origin, tt.origin) { + t.Errorf("#%d: got origin %v; want %v", i, origin, tt.origin) + continue + } + } +} + +func TestCtrlAndData(t *testing.T) { + once.Do(startServer) + + c, err := net.Dial("tcp", serverAddr) + if err != nil { + t.Fatal(err) + } + ws, err := NewClient(newConfig(t, "/ctrldata"), c) + if err != nil { + t.Fatal(err) + } + defer ws.Close() + + h := &testCtrlAndDataHandler{hybiFrameHandler: hybiFrameHandler{conn: ws}} + ws.frameHandler = h + + b := make([]byte, 128) + for i := 0; i < 2; i++ { + data := []byte(fmt.Sprintf("#%d-DATA-FRAME-FROM-CLIENT", i)) + if _, err := ws.Write(data); err != nil { + t.Fatalf("#%d: %v", i, err) + } + var ctrl []byte + if i%2 != 0 { // with or without payload + ctrl = []byte(fmt.Sprintf("#%d-CONTROL-FRAME-FROM-CLIENT", i)) + } + if _, err := h.WritePing(ctrl); err != nil { + t.Fatalf("#%d: %v", i, err) + } + n, err := ws.Read(b) + if err != nil { + t.Fatalf("#%d: %v", i, err) + } + if !bytes.Equal(b[:n], data) { + t.Fatalf("#%d: got %v; want %v", i, b[:n], data) + } + } +} + +func TestCodec_ReceiveLimited(t *testing.T) { + const limit = 2048 + var payloads [][]byte + for _, size := range []int{ + 1024, + 2048, + 4096, // receive of this message would be interrupted due to limit + 2048, // this one is to make sure next receive recovers discarding leftovers + } { + b := make([]byte, size) + rand.Read(b) + payloads = append(payloads, b) + } + handlerDone := make(chan struct{}) + limitedHandler := func(ws *Conn) { + defer close(handlerDone) + ws.MaxPayloadBytes = limit + defer ws.Close() + for i, p := range payloads { + t.Logf("payload #%d (size %d, exceeds limit: %v)", i, len(p), len(p) > limit) + var recv []byte + err := Message.Receive(ws, &recv) + switch err { + case nil: + case ErrFrameTooLarge: + if len(p) <= limit { + t.Fatalf("unexpected frame size limit: expected %d bytes of payload having limit at %d", len(p), limit) + } + continue + default: + t.Fatalf("unexpected error: %v (want either nil or ErrFrameTooLarge)", err) + } + if len(recv) > limit { + t.Fatalf("received %d bytes of payload having limit at %d", len(recv), limit) + } + if !bytes.Equal(p, recv) { + t.Fatalf("received payload differs:\ngot:\t%v\nwant:\t%v", recv, p) + } + } + } + server := httptest.NewServer(Handler(limitedHandler)) + defer server.CloseClientConnections() + defer server.Close() + addr := server.Listener.Addr().String() + ws, err := Dial("ws://"+addr+"/", "", "http://localhost/") + if err != nil { + t.Fatal(err) + } + defer ws.Close() + for i, p := range payloads { + if err := Message.Send(ws, p); err != nil { + t.Fatalf("payload #%d (size %d): %v", i, len(p), err) + } + } + <-handlerDone +} diff --git a/api/vendor/golang.org/x/net/xsrftoken/xsrf.go b/api/vendor/golang.org/x/net/xsrftoken/xsrf.go new file mode 100644 index 0000000..bc861e1 --- /dev/null +++ b/api/vendor/golang.org/x/net/xsrftoken/xsrf.go @@ -0,0 +1,94 @@ +// 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 xsrftoken provides methods for generating and validating secure XSRF tokens. +package xsrftoken // import "golang.org/x/net/xsrftoken" + +import ( + "crypto/hmac" + "crypto/sha1" + "crypto/subtle" + "encoding/base64" + "fmt" + "strconv" + "strings" + "time" +) + +// Timeout is the duration for which XSRF tokens are valid. +// It is exported so clients may set cookie timeouts that match generated tokens. +const Timeout = 24 * time.Hour + +// clean sanitizes a string for inclusion in a token by replacing all ":"s. +func clean(s string) string { + return strings.Replace(s, ":", "_", -1) +} + +// Generate returns a URL-safe secure XSRF token that expires in 24 hours. +// +// key is a secret key for your application; it must be non-empty. +// userID is an optional unique identifier for the user. +// actionID is an optional action the user is taking (e.g. POSTing to a particular path). +func Generate(key, userID, actionID string) string { + return generateTokenAtTime(key, userID, actionID, time.Now()) +} + +// generateTokenAtTime is like Generate, but returns a token that expires 24 hours from now. +func generateTokenAtTime(key, userID, actionID string, now time.Time) string { + if len(key) == 0 { + panic("zero length xsrf secret key") + } + // Round time up and convert to milliseconds. + milliTime := (now.UnixNano() + 1e6 - 1) / 1e6 + + h := hmac.New(sha1.New, []byte(key)) + fmt.Fprintf(h, "%s:%s:%d", clean(userID), clean(actionID), milliTime) + + // Get the padded base64 string then removing the padding. + tok := string(h.Sum(nil)) + tok = base64.URLEncoding.EncodeToString([]byte(tok)) + tok = strings.TrimRight(tok, "=") + + return fmt.Sprintf("%s:%d", tok, milliTime) +} + +// Valid reports whether a token is a valid, unexpired token returned by Generate. +func Valid(token, key, userID, actionID string) bool { + return validTokenAtTime(token, key, userID, actionID, time.Now()) +} + +// validTokenAtTime reports whether a token is valid at the given time. +func validTokenAtTime(token, key, userID, actionID string, now time.Time) bool { + if len(key) == 0 { + panic("zero length xsrf secret key") + } + // Extract the issue time of the token. + sep := strings.LastIndex(token, ":") + if sep < 0 { + return false + } + millis, err := strconv.ParseInt(token[sep+1:], 10, 64) + if err != nil { + return false + } + issueTime := time.Unix(0, millis*1e6) + + // Check that the token is not expired. + if now.Sub(issueTime) >= Timeout { + return false + } + + // Check that the token is not from the future. + // Allow 1 minute grace period in case the token is being verified on a + // machine whose clock is behind the machine that issued the token. + if issueTime.After(now.Add(1 * time.Minute)) { + return false + } + + expected := generateTokenAtTime(key, userID, actionID, issueTime) + + // Check that the token matches the expected value. + // Use constant time comparison to avoid timing attacks. + return subtle.ConstantTimeCompare([]byte(token), []byte(expected)) == 1 +} diff --git a/api/vendor/golang.org/x/net/xsrftoken/xsrf_test.go b/api/vendor/golang.org/x/net/xsrftoken/xsrf_test.go new file mode 100644 index 0000000..6c8e7d9 --- /dev/null +++ b/api/vendor/golang.org/x/net/xsrftoken/xsrf_test.go @@ -0,0 +1,83 @@ +// 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 xsrftoken + +import ( + "encoding/base64" + "testing" + "time" +) + +const ( + key = "quay" + userID = "12345678" + actionID = "POST /form" +) + +var ( + now = time.Now() + oneMinuteFromNow = now.Add(1 * time.Minute) +) + +func TestValidToken(t *testing.T) { + tok := generateTokenAtTime(key, userID, actionID, now) + if !validTokenAtTime(tok, key, userID, actionID, oneMinuteFromNow) { + t.Error("One second later: Expected token to be valid") + } + if !validTokenAtTime(tok, key, userID, actionID, now.Add(Timeout-1*time.Nanosecond)) { + t.Error("Just before timeout: Expected token to be valid") + } + if !validTokenAtTime(tok, key, userID, actionID, now.Add(-1*time.Minute+1*time.Millisecond)) { + t.Error("One minute in the past: Expected token to be valid") + } +} + +// TestSeparatorReplacement tests that separators are being correctly substituted +func TestSeparatorReplacement(t *testing.T) { + tok := generateTokenAtTime("foo:bar", "baz", "wah", now) + tok2 := generateTokenAtTime("foo", "bar:baz", "wah", now) + if tok == tok2 { + t.Errorf("Expected generated tokens to be different") + } +} + +func TestInvalidToken(t *testing.T) { + invalidTokenTests := []struct { + name, key, userID, actionID string + t time.Time + }{ + {"Bad key", "foobar", userID, actionID, oneMinuteFromNow}, + {"Bad userID", key, "foobar", actionID, oneMinuteFromNow}, + {"Bad actionID", key, userID, "foobar", oneMinuteFromNow}, + {"Expired", key, userID, actionID, now.Add(Timeout + 1*time.Millisecond)}, + {"More than 1 minute from the future", key, userID, actionID, now.Add(-1*time.Nanosecond - 1*time.Minute)}, + } + + tok := generateTokenAtTime(key, userID, actionID, now) + for _, itt := range invalidTokenTests { + if validTokenAtTime(tok, itt.key, itt.userID, itt.actionID, itt.t) { + t.Errorf("%v: Expected token to be invalid", itt.name) + } + } +} + +// TestValidateBadData primarily tests that no unexpected panics are triggered +// during parsing +func TestValidateBadData(t *testing.T) { + badDataTests := []struct { + name, tok string + }{ + {"Invalid Base64", "ASDab24(@)$*=="}, + {"No delimiter", base64.URLEncoding.EncodeToString([]byte("foobar12345678"))}, + {"Invalid time", base64.URLEncoding.EncodeToString([]byte("foobar:foobar"))}, + {"Wrong length", "1234" + generateTokenAtTime(key, userID, actionID, now)}, + } + + for _, bdt := range badDataTests { + if validTokenAtTime(bdt.tok, key, userID, actionID, oneMinuteFromNow) { + t.Errorf("%v: Expected token to be invalid", bdt.name) + } + } +} diff --git a/api/vendor/golang.org/x/sync/AUTHORS b/api/vendor/golang.org/x/sync/AUTHORS new file mode 100644 index 0000000..15167cd --- /dev/null +++ b/api/vendor/golang.org/x/sync/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 http://tip.golang.org/AUTHORS. diff --git a/api/vendor/golang.org/x/sync/CONTRIBUTING.md b/api/vendor/golang.org/x/sync/CONTRIBUTING.md new file mode 100644 index 0000000..d0485e8 --- /dev/null +++ b/api/vendor/golang.org/x/sync/CONTRIBUTING.md @@ -0,0 +1,26 @@ +# Contributing to Go + +Go is an open source project. + +It is the work of hundreds of contributors. We appreciate your help! + +## Filing issues + +When [filing an issue](https://golang.org/issue/new), make sure to answer these five questions: + +1. What version of Go are you using (`go version`)? +2. What operating system and processor architecture are you using? +3. What did you do? +4. What did you expect to see? +5. What did you see instead? + +General questions should go to the [golang-nuts mailing list](https://groups.google.com/group/golang-nuts) instead of the issue tracker. +The gophers there will answer or ask you to file an issue if you've tripped over a bug. + +## Contributing code + +Please read the [Contribution Guidelines](https://golang.org/doc/contribute.html) +before sending patches. + +Unless otherwise noted, the Go source files are distributed under +the BSD-style license found in the LICENSE file. diff --git a/api/vendor/golang.org/x/sync/CONTRIBUTORS b/api/vendor/golang.org/x/sync/CONTRIBUTORS new file mode 100644 index 0000000..1c4577e --- /dev/null +++ b/api/vendor/golang.org/x/sync/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 http://tip.golang.org/CONTRIBUTORS. diff --git a/api/vendor/golang.org/x/sync/LICENSE b/api/vendor/golang.org/x/sync/LICENSE new file mode 100644 index 0000000..6a66aea --- /dev/null +++ b/api/vendor/golang.org/x/sync/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/api/vendor/golang.org/x/sync/PATENTS b/api/vendor/golang.org/x/sync/PATENTS new file mode 100644 index 0000000..7330990 --- /dev/null +++ b/api/vendor/golang.org/x/sync/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/api/vendor/golang.org/x/sync/README.md b/api/vendor/golang.org/x/sync/README.md new file mode 100644 index 0000000..1f8436c --- /dev/null +++ b/api/vendor/golang.org/x/sync/README.md @@ -0,0 +1,18 @@ +# Go Sync + +This repository provides Go concurrency primitives in addition to the +ones provided by the language and "sync" and "sync/atomic" packages. + +## Download/Install + +The easiest way to install is to run `go get -u golang.org/x/sync`. You can +also manually git clone the repository to `$GOPATH/src/golang.org/x/sync`. + +## Report Issues / Send Patches + +This repository uses Gerrit for code changes. To learn how to submit changes to +this repository, see https://golang.org/doc/contribute.html. + +The main issue tracker for the sync repository is located at +https://github.com/golang/go/issues. Prefix your issue with "x/sync:" in the +subject line, so it is easy to find. diff --git a/api/vendor/golang.org/x/sync/codereview.cfg b/api/vendor/golang.org/x/sync/codereview.cfg new file mode 100644 index 0000000..3f8b14b --- /dev/null +++ b/api/vendor/golang.org/x/sync/codereview.cfg @@ -0,0 +1 @@ +issuerepo: golang/go diff --git a/api/vendor/golang.org/x/sync/errgroup/errgroup.go b/api/vendor/golang.org/x/sync/errgroup/errgroup.go new file mode 100644 index 0000000..533438d --- /dev/null +++ b/api/vendor/golang.org/x/sync/errgroup/errgroup.go @@ -0,0 +1,67 @@ +// 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 errgroup provides synchronization, error propagation, and Context +// cancelation for groups of goroutines working on subtasks of a common task. +package errgroup + +import ( + "sync" + + "golang.org/x/net/context" +) + +// A Group is a collection of goroutines working on subtasks that are part of +// the same overall task. +// +// A zero Group is valid and does not cancel on error. +type Group struct { + cancel func() + + wg sync.WaitGroup + + errOnce sync.Once + err error +} + +// WithContext returns a new Group and an associated Context derived from ctx. +// +// The derived Context is canceled the first time a function passed to Go +// returns a non-nil error or the first time Wait returns, whichever occurs +// first. +func WithContext(ctx context.Context) (*Group, context.Context) { + ctx, cancel := context.WithCancel(ctx) + return &Group{cancel: cancel}, ctx +} + +// Wait blocks until all function calls from the Go method have returned, then +// returns the first non-nil error (if any) from them. +func (g *Group) Wait() error { + g.wg.Wait() + if g.cancel != nil { + g.cancel() + } + return g.err +} + +// Go calls the given function in a new goroutine. +// +// The first call to return a non-nil error cancels the group; its error will be +// returned by Wait. +func (g *Group) Go(f func() error) { + g.wg.Add(1) + + go func() { + defer g.wg.Done() + + if err := f(); err != nil { + g.errOnce.Do(func() { + g.err = err + if g.cancel != nil { + g.cancel() + } + }) + } + }() +} diff --git a/api/vendor/golang.org/x/sync/errgroup/errgroup_example_md5all_test.go b/api/vendor/golang.org/x/sync/errgroup/errgroup_example_md5all_test.go new file mode 100644 index 0000000..714b5ae --- /dev/null +++ b/api/vendor/golang.org/x/sync/errgroup/errgroup_example_md5all_test.go @@ -0,0 +1,101 @@ +// 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 errgroup_test + +import ( + "crypto/md5" + "fmt" + "io/ioutil" + "log" + "os" + "path/filepath" + + "golang.org/x/net/context" + "golang.org/x/sync/errgroup" +) + +// Pipeline demonstrates the use of a Group to implement a multi-stage +// pipeline: a version of the MD5All function with bounded parallelism from +// https://blog.golang.org/pipelines. +func ExampleGroup_pipeline() { + m, err := MD5All(context.Background(), ".") + if err != nil { + log.Fatal(err) + } + + for k, sum := range m { + fmt.Printf("%s:\t%x\n", k, sum) + } +} + +type result struct { + path string + sum [md5.Size]byte +} + +// MD5All reads all the files in the file tree rooted at root and returns a map +// from file path to the MD5 sum of the file's contents. If the directory walk +// fails or any read operation fails, MD5All returns an error. +func MD5All(ctx context.Context, root string) (map[string][md5.Size]byte, error) { + // ctx is canceled when g.Wait() returns. When this version of MD5All returns + // - even in case of error! - we know that all of the goroutines have finished + // and the memory they were using can be garbage-collected. + g, ctx := errgroup.WithContext(ctx) + paths := make(chan string) + + g.Go(func() error { + defer close(paths) + return filepath.Walk(root, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + if !info.Mode().IsRegular() { + return nil + } + select { + case paths <- path: + case <-ctx.Done(): + return ctx.Err() + } + return nil + }) + }) + + // Start a fixed number of goroutines to read and digest files. + c := make(chan result) + const numDigesters = 20 + for i := 0; i < numDigesters; i++ { + g.Go(func() error { + for path := range paths { + data, err := ioutil.ReadFile(path) + if err != nil { + return err + } + select { + case c <- result{path, md5.Sum(data)}: + case <-ctx.Done(): + return ctx.Err() + } + } + return nil + }) + } + go func() { + g.Wait() + close(c) + }() + + m := make(map[string][md5.Size]byte) + for r := range c { + m[r.path] = r.sum + } + // Check whether any of the goroutines failed. Since g is accumulating the + // errors, we don't need to send them (or check for them) in the individual + // results sent on the channel. + if err := g.Wait(); err != nil { + return nil, err + } + return m, nil +} diff --git a/api/vendor/golang.org/x/sync/errgroup/errgroup_test.go b/api/vendor/golang.org/x/sync/errgroup/errgroup_test.go new file mode 100644 index 0000000..6a9696e --- /dev/null +++ b/api/vendor/golang.org/x/sync/errgroup/errgroup_test.go @@ -0,0 +1,176 @@ +// 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 errgroup_test + +import ( + "errors" + "fmt" + "net/http" + "os" + "testing" + + "golang.org/x/net/context" + "golang.org/x/sync/errgroup" +) + +var ( + Web = fakeSearch("web") + Image = fakeSearch("image") + Video = fakeSearch("video") +) + +type Result string +type Search func(ctx context.Context, query string) (Result, error) + +func fakeSearch(kind string) Search { + return func(_ context.Context, query string) (Result, error) { + return Result(fmt.Sprintf("%s result for %q", kind, query)), nil + } +} + +// JustErrors illustrates the use of a Group in place of a sync.WaitGroup to +// simplify goroutine counting and error handling. This example is derived from +// the sync.WaitGroup example at https://golang.org/pkg/sync/#example_WaitGroup. +func ExampleGroup_justErrors() { + var g errgroup.Group + var urls = []string{ + "http://www.golang.org/", + "http://www.google.com/", + "http://www.somestupidname.com/", + } + for _, url := range urls { + // Launch a goroutine to fetch the URL. + url := url // https://golang.org/doc/faq#closures_and_goroutines + g.Go(func() error { + // Fetch the URL. + resp, err := http.Get(url) + if err == nil { + resp.Body.Close() + } + return err + }) + } + // Wait for all HTTP fetches to complete. + if err := g.Wait(); err == nil { + fmt.Println("Successfully fetched all URLs.") + } +} + +// Parallel illustrates the use of a Group for synchronizing a simple parallel +// task: the "Google Search 2.0" function from +// https://talks.golang.org/2012/concurrency.slide#46, augmented with a Context +// and error-handling. +func ExampleGroup_parallel() { + Google := func(ctx context.Context, query string) ([]Result, error) { + g, ctx := errgroup.WithContext(ctx) + + searches := []Search{Web, Image, Video} + results := make([]Result, len(searches)) + for i, search := range searches { + i, search := i, search // https://golang.org/doc/faq#closures_and_goroutines + g.Go(func() error { + result, err := search(ctx, query) + if err == nil { + results[i] = result + } + return err + }) + } + if err := g.Wait(); err != nil { + return nil, err + } + return results, nil + } + + results, err := Google(context.Background(), "golang") + if err != nil { + fmt.Fprintln(os.Stderr, err) + return + } + for _, result := range results { + fmt.Println(result) + } + + // Output: + // web result for "golang" + // image result for "golang" + // video result for "golang" +} + +func TestZeroGroup(t *testing.T) { + err1 := errors.New("errgroup_test: 1") + err2 := errors.New("errgroup_test: 2") + + cases := []struct { + errs []error + }{ + {errs: []error{}}, + {errs: []error{nil}}, + {errs: []error{err1}}, + {errs: []error{err1, nil}}, + {errs: []error{err1, nil, err2}}, + } + + for _, tc := range cases { + var g errgroup.Group + + var firstErr error + for i, err := range tc.errs { + err := err + g.Go(func() error { return err }) + + if firstErr == nil && err != nil { + firstErr = err + } + + if gErr := g.Wait(); gErr != firstErr { + t.Errorf("after %T.Go(func() error { return err }) for err in %v\n"+ + "g.Wait() = %v; want %v", + g, tc.errs[:i+1], err, firstErr) + } + } + } +} + +func TestWithContext(t *testing.T) { + errDoom := errors.New("group_test: doomed") + + cases := []struct { + errs []error + want error + }{ + {want: nil}, + {errs: []error{nil}, want: nil}, + {errs: []error{errDoom}, want: errDoom}, + {errs: []error{errDoom, nil}, want: errDoom}, + } + + for _, tc := range cases { + g, ctx := errgroup.WithContext(context.Background()) + + for _, err := range tc.errs { + err := err + g.Go(func() error { return err }) + } + + if err := g.Wait(); err != tc.want { + t.Errorf("after %T.Go(func() error { return err }) for err in %v\n"+ + "g.Wait() = %v; want %v", + g, tc.errs, err, tc.want) + } + + canceled := false + select { + case <-ctx.Done(): + canceled = true + default: + } + if !canceled { + t.Errorf("after %T.Go(func() error { return err }) for err in %v\n"+ + "ctx.Done() was not closed", + g, tc.errs) + } + } +} diff --git a/api/vendor/golang.org/x/sync/semaphore/semaphore.go b/api/vendor/golang.org/x/sync/semaphore/semaphore.go new file mode 100644 index 0000000..e9d2d79 --- /dev/null +++ b/api/vendor/golang.org/x/sync/semaphore/semaphore.go @@ -0,0 +1,131 @@ +// 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 semaphore provides a weighted semaphore implementation. +package semaphore // import "golang.org/x/sync/semaphore" + +import ( + "container/list" + "sync" + + // Use the old context because packages that depend on this one + // (e.g. cloud.google.com/go/...) must run on Go 1.6. + // TODO(jba): update to "context" when possible. + "golang.org/x/net/context" +) + +type waiter struct { + n int64 + ready chan<- struct{} // Closed when semaphore acquired. +} + +// NewWeighted creates a new weighted semaphore with the given +// maximum combined weight for concurrent access. +func NewWeighted(n int64) *Weighted { + w := &Weighted{size: n} + return w +} + +// Weighted provides a way to bound concurrent access to a resource. +// The callers can request access with a given weight. +type Weighted struct { + size int64 + cur int64 + mu sync.Mutex + waiters list.List +} + +// Acquire acquires the semaphore with a weight of n, blocking only until ctx +// is done. On success, returns nil. On failure, returns ctx.Err() and leaves +// the semaphore unchanged. +// +// If ctx is already done, Acquire may still succeed without blocking. +func (s *Weighted) Acquire(ctx context.Context, n int64) error { + s.mu.Lock() + if s.size-s.cur >= n && s.waiters.Len() == 0 { + s.cur += n + s.mu.Unlock() + return nil + } + + if n > s.size { + // Don't make other Acquire calls block on one that's doomed to fail. + s.mu.Unlock() + <-ctx.Done() + return ctx.Err() + } + + ready := make(chan struct{}) + w := waiter{n: n, ready: ready} + elem := s.waiters.PushBack(w) + s.mu.Unlock() + + select { + case <-ctx.Done(): + err := ctx.Err() + s.mu.Lock() + select { + case <-ready: + // Acquired the semaphore after we were canceled. Rather than trying to + // fix up the queue, just pretend we didn't notice the cancelation. + err = nil + default: + s.waiters.Remove(elem) + } + s.mu.Unlock() + return err + + case <-ready: + return nil + } +} + +// TryAcquire acquires the semaphore with a weight of n without blocking. +// On success, returns true. On failure, returns false and leaves the semaphore unchanged. +func (s *Weighted) TryAcquire(n int64) bool { + s.mu.Lock() + success := s.size-s.cur >= n && s.waiters.Len() == 0 + if success { + s.cur += n + } + s.mu.Unlock() + return success +} + +// Release releases the semaphore with a weight of n. +func (s *Weighted) Release(n int64) { + s.mu.Lock() + s.cur -= n + if s.cur < 0 { + s.mu.Unlock() + panic("semaphore: bad release") + } + for { + next := s.waiters.Front() + if next == nil { + break // No more waiters blocked. + } + + w := next.Value.(waiter) + if s.size-s.cur < w.n { + // Not enough tokens for the next waiter. We could keep going (to try to + // find a waiter with a smaller request), but under load that could cause + // starvation for large requests; instead, we leave all remaining waiters + // blocked. + // + // Consider a semaphore used as a read-write lock, with N tokens, N + // readers, and one writer. Each reader can Acquire(1) to obtain a read + // lock. The writer can Acquire(N) to obtain a write lock, excluding all + // of the readers. If we allow the readers to jump ahead in the queue, + // the writer will starve — there is always one token available for every + // reader. + break + } + + s.cur += w.n + s.waiters.Remove(next) + close(w.ready) + } + s.mu.Unlock() +} diff --git a/api/vendor/golang.org/x/sync/semaphore/semaphore_bench_test.go b/api/vendor/golang.org/x/sync/semaphore/semaphore_bench_test.go new file mode 100644 index 0000000..1e3ab75 --- /dev/null +++ b/api/vendor/golang.org/x/sync/semaphore/semaphore_bench_test.go @@ -0,0 +1,131 @@ +// 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. + +// +build go1.7 + +package semaphore_test + +import ( + "fmt" + "testing" + + "golang.org/x/net/context" + "golang.org/x/sync/semaphore" +) + +// weighted is an interface matching a subset of *Weighted. It allows +// alternate implementations for testing and benchmarking. +type weighted interface { + Acquire(context.Context, int64) error + TryAcquire(int64) bool + Release(int64) +} + +// semChan implements Weighted using a channel for +// comparing against the condition variable-based implementation. +type semChan chan struct{} + +func newSemChan(n int64) semChan { + return semChan(make(chan struct{}, n)) +} + +func (s semChan) Acquire(_ context.Context, n int64) error { + for i := int64(0); i < n; i++ { + s <- struct{}{} + } + return nil +} + +func (s semChan) TryAcquire(n int64) bool { + if int64(len(s))+n > int64(cap(s)) { + return false + } + + for i := int64(0); i < n; i++ { + s <- struct{}{} + } + return true +} + +func (s semChan) Release(n int64) { + for i := int64(0); i < n; i++ { + <-s + } +} + +// acquireN calls Acquire(size) on sem N times and then calls Release(size) N times. +func acquireN(b *testing.B, sem weighted, size int64, N int) { + b.ResetTimer() + for i := 0; i < b.N; i++ { + for j := 0; j < N; j++ { + sem.Acquire(context.Background(), size) + } + for j := 0; j < N; j++ { + sem.Release(size) + } + } +} + +// tryAcquireN calls TryAcquire(size) on sem N times and then calls Release(size) N times. +func tryAcquireN(b *testing.B, sem weighted, size int64, N int) { + b.ResetTimer() + for i := 0; i < b.N; i++ { + for j := 0; j < N; j++ { + if !sem.TryAcquire(size) { + b.Fatalf("TryAcquire(%v) = false, want true", size) + } + } + for j := 0; j < N; j++ { + sem.Release(size) + } + } +} + +func BenchmarkNewSeq(b *testing.B) { + for _, cap := range []int64{1, 128} { + b.Run(fmt.Sprintf("Weighted-%d", cap), func(b *testing.B) { + for i := 0; i < b.N; i++ { + _ = semaphore.NewWeighted(cap) + } + }) + b.Run(fmt.Sprintf("semChan-%d", cap), func(b *testing.B) { + for i := 0; i < b.N; i++ { + _ = newSemChan(cap) + } + }) + } +} + +func BenchmarkAcquireSeq(b *testing.B) { + for _, c := range []struct { + cap, size int64 + N int + }{ + {1, 1, 1}, + {2, 1, 1}, + {16, 1, 1}, + {128, 1, 1}, + {2, 2, 1}, + {16, 2, 8}, + {128, 2, 64}, + {2, 1, 2}, + {16, 8, 2}, + {128, 64, 2}, + } { + for _, w := range []struct { + name string + w weighted + }{ + {"Weighted", semaphore.NewWeighted(c.cap)}, + {"semChan", newSemChan(c.cap)}, + } { + b.Run(fmt.Sprintf("%s-acquire-%d-%d-%d", w.name, c.cap, c.size, c.N), func(b *testing.B) { + acquireN(b, w.w, c.size, c.N) + }) + b.Run(fmt.Sprintf("%s-tryAcquire-%d-%d-%d", w.name, c.cap, c.size, c.N), func(b *testing.B) { + tryAcquireN(b, w.w, c.size, c.N) + }) + } + } +} diff --git a/api/vendor/golang.org/x/sync/semaphore/semaphore_example_test.go b/api/vendor/golang.org/x/sync/semaphore/semaphore_example_test.go new file mode 100644 index 0000000..e75cd79 --- /dev/null +++ b/api/vendor/golang.org/x/sync/semaphore/semaphore_example_test.go @@ -0,0 +1,84 @@ +// 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 semaphore_test + +import ( + "context" + "fmt" + "log" + "runtime" + + "golang.org/x/sync/semaphore" +) + +// Example_workerPool demonstrates how to use a semaphore to limit the number of +// goroutines working on parallel tasks. +// +// This use of a semaphore mimics a typical “worker pool” pattern, but without +// the need to explicitly shut down idle workers when the work is done. +func Example_workerPool() { + ctx := context.TODO() + + var ( + maxWorkers = runtime.GOMAXPROCS(0) + sem = semaphore.NewWeighted(int64(maxWorkers)) + out = make([]int, 32) + ) + + // Compute the output using up to maxWorkers goroutines at a time. + for i := range out { + // When maxWorkers goroutines are in flight, Acquire blocks until one of the + // workers finishes. + if err := sem.Acquire(ctx, 1); err != nil { + log.Printf("Failed to acquire semaphore: %v", err) + break + } + + go func(i int) { + defer sem.Release(1) + out[i] = collatzSteps(i + 1) + }(i) + } + + // Acquire all of the tokens to wait for any remaining workers to finish. + // + // If you are already waiting for the workers by some other means (such as an + // errgroup.Group), you can omit this final Acquire call. + if err := sem.Acquire(ctx, int64(maxWorkers)); err != nil { + log.Printf("Failed to acquire semaphore: %v", err) + } + + fmt.Println(out) + + // Output: + // [0 1 7 2 5 8 16 3 19 6 14 9 9 17 17 4 12 20 20 7 7 15 15 10 23 10 111 18 18 18 106 5] +} + +// collatzSteps computes the number of steps to reach 1 under the Collatz +// conjecture. (See https://en.wikipedia.org/wiki/Collatz_conjecture.) +func collatzSteps(n int) (steps int) { + if n <= 0 { + panic("nonpositive input") + } + + for ; n > 1; steps++ { + if steps < 0 { + panic("too many steps") + } + + if n%2 == 0 { + n /= 2 + continue + } + + const maxInt = int(^uint(0) >> 1) + if n > (maxInt-1)/3 { + panic("overflow") + } + n = 3*n + 1 + } + + return steps +} diff --git a/api/vendor/golang.org/x/sync/semaphore/semaphore_test.go b/api/vendor/golang.org/x/sync/semaphore/semaphore_test.go new file mode 100644 index 0000000..2541b90 --- /dev/null +++ b/api/vendor/golang.org/x/sync/semaphore/semaphore_test.go @@ -0,0 +1,171 @@ +// 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 semaphore_test + +import ( + "math/rand" + "runtime" + "sync" + "testing" + "time" + + "golang.org/x/net/context" + "golang.org/x/sync/errgroup" + "golang.org/x/sync/semaphore" +) + +const maxSleep = 1 * time.Millisecond + +func HammerWeighted(sem *semaphore.Weighted, n int64, loops int) { + for i := 0; i < loops; i++ { + sem.Acquire(context.Background(), n) + time.Sleep(time.Duration(rand.Int63n(int64(maxSleep/time.Nanosecond))) * time.Nanosecond) + sem.Release(n) + } +} + +func TestWeighted(t *testing.T) { + t.Parallel() + + n := runtime.GOMAXPROCS(0) + loops := 10000 / n + sem := semaphore.NewWeighted(int64(n)) + var wg sync.WaitGroup + wg.Add(n) + for i := 0; i < n; i++ { + i := i + go func() { + defer wg.Done() + HammerWeighted(sem, int64(i), loops) + }() + } + wg.Wait() +} + +func TestWeightedPanic(t *testing.T) { + t.Parallel() + + defer func() { + if recover() == nil { + t.Fatal("release of an unacquired weighted semaphore did not panic") + } + }() + w := semaphore.NewWeighted(1) + w.Release(1) +} + +func TestWeightedTryAcquire(t *testing.T) { + t.Parallel() + + ctx := context.Background() + sem := semaphore.NewWeighted(2) + tries := []bool{} + sem.Acquire(ctx, 1) + tries = append(tries, sem.TryAcquire(1)) + tries = append(tries, sem.TryAcquire(1)) + + sem.Release(2) + + tries = append(tries, sem.TryAcquire(1)) + sem.Acquire(ctx, 1) + tries = append(tries, sem.TryAcquire(1)) + + want := []bool{true, false, true, false} + for i := range tries { + if tries[i] != want[i] { + t.Errorf("tries[%d]: got %t, want %t", i, tries[i], want[i]) + } + } +} + +func TestWeightedAcquire(t *testing.T) { + t.Parallel() + + ctx := context.Background() + sem := semaphore.NewWeighted(2) + tryAcquire := func(n int64) bool { + ctx, cancel := context.WithTimeout(ctx, 10*time.Millisecond) + defer cancel() + return sem.Acquire(ctx, n) == nil + } + + tries := []bool{} + sem.Acquire(ctx, 1) + tries = append(tries, tryAcquire(1)) + tries = append(tries, tryAcquire(1)) + + sem.Release(2) + + tries = append(tries, tryAcquire(1)) + sem.Acquire(ctx, 1) + tries = append(tries, tryAcquire(1)) + + want := []bool{true, false, true, false} + for i := range tries { + if tries[i] != want[i] { + t.Errorf("tries[%d]: got %t, want %t", i, tries[i], want[i]) + } + } +} + +func TestWeightedDoesntBlockIfTooBig(t *testing.T) { + t.Parallel() + + const n = 2 + sem := semaphore.NewWeighted(n) + { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + go sem.Acquire(ctx, n+1) + } + + g, ctx := errgroup.WithContext(context.Background()) + for i := n * 3; i > 0; i-- { + g.Go(func() error { + err := sem.Acquire(ctx, 1) + if err == nil { + time.Sleep(1 * time.Millisecond) + sem.Release(1) + } + return err + }) + } + if err := g.Wait(); err != nil { + t.Errorf("semaphore.NewWeighted(%v) failed to AcquireCtx(_, 1) with AcquireCtx(_, %v) pending", n, n+1) + } +} + +// TestLargeAcquireDoesntStarve times out if a large call to Acquire starves. +// Merely returning from the test function indicates success. +func TestLargeAcquireDoesntStarve(t *testing.T) { + t.Parallel() + + ctx := context.Background() + n := int64(runtime.GOMAXPROCS(0)) + sem := semaphore.NewWeighted(n) + running := true + + var wg sync.WaitGroup + wg.Add(int(n)) + for i := n; i > 0; i-- { + sem.Acquire(ctx, 1) + go func() { + defer func() { + sem.Release(1) + wg.Done() + }() + for running { + time.Sleep(1 * time.Millisecond) + sem.Release(1) + sem.Acquire(ctx, 1) + } + }() + } + + sem.Acquire(ctx, n) + running = false + sem.Release(n) + wg.Wait() +} diff --git a/api/vendor/golang.org/x/sync/singleflight/singleflight.go b/api/vendor/golang.org/x/sync/singleflight/singleflight.go new file mode 100644 index 0000000..9a4f8d5 --- /dev/null +++ b/api/vendor/golang.org/x/sync/singleflight/singleflight.go @@ -0,0 +1,111 @@ +// 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 singleflight provides a duplicate function call suppression +// mechanism. +package singleflight // import "golang.org/x/sync/singleflight" + +import "sync" + +// call is an in-flight or completed singleflight.Do call +type call struct { + wg sync.WaitGroup + + // These fields are written once before the WaitGroup is done + // and are only read after the WaitGroup is done. + val interface{} + err error + + // These fields are read and written with the singleflight + // mutex held before the WaitGroup is done, and are read but + // not written after the WaitGroup is done. + dups int + chans []chan<- Result +} + +// Group represents a class of work and forms a namespace in +// which units of work can be executed with duplicate suppression. +type Group struct { + mu sync.Mutex // protects m + m map[string]*call // lazily initialized +} + +// Result holds the results of Do, so they can be passed +// on a channel. +type Result struct { + Val interface{} + Err error + Shared bool +} + +// Do executes and returns the results of the given function, making +// sure that only one execution is in-flight for a given key at a +// time. If a duplicate comes in, the duplicate caller waits for the +// original to complete and receives the same results. +// The return value shared indicates whether v was given to multiple callers. +func (g *Group) Do(key string, fn func() (interface{}, error)) (v interface{}, err error, shared bool) { + g.mu.Lock() + if g.m == nil { + g.m = make(map[string]*call) + } + if c, ok := g.m[key]; ok { + c.dups++ + g.mu.Unlock() + c.wg.Wait() + return c.val, c.err, true + } + c := new(call) + c.wg.Add(1) + g.m[key] = c + g.mu.Unlock() + + g.doCall(c, key, fn) + return c.val, c.err, c.dups > 0 +} + +// DoChan is like Do but returns a channel that will receive the +// results when they are ready. +func (g *Group) DoChan(key string, fn func() (interface{}, error)) <-chan Result { + ch := make(chan Result, 1) + g.mu.Lock() + if g.m == nil { + g.m = make(map[string]*call) + } + if c, ok := g.m[key]; ok { + c.dups++ + c.chans = append(c.chans, ch) + g.mu.Unlock() + return ch + } + c := &call{chans: []chan<- Result{ch}} + c.wg.Add(1) + g.m[key] = c + g.mu.Unlock() + + go g.doCall(c, key, fn) + + return ch +} + +// doCall handles the single call for a key. +func (g *Group) doCall(c *call, key string, fn func() (interface{}, error)) { + c.val, c.err = fn() + c.wg.Done() + + g.mu.Lock() + delete(g.m, key) + for _, ch := range c.chans { + ch <- Result{c.val, c.err, c.dups > 0} + } + g.mu.Unlock() +} + +// Forget tells the singleflight to forget about a key. Future calls +// to Do for this key will call the function rather than waiting for +// an earlier call to complete. +func (g *Group) Forget(key string) { + g.mu.Lock() + delete(g.m, key) + g.mu.Unlock() +} diff --git a/api/vendor/golang.org/x/sync/singleflight/singleflight_test.go b/api/vendor/golang.org/x/sync/singleflight/singleflight_test.go new file mode 100644 index 0000000..5e6f1b3 --- /dev/null +++ b/api/vendor/golang.org/x/sync/singleflight/singleflight_test.go @@ -0,0 +1,87 @@ +// 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 singleflight + +import ( + "errors" + "fmt" + "sync" + "sync/atomic" + "testing" + "time" +) + +func TestDo(t *testing.T) { + var g Group + v, err, _ := g.Do("key", func() (interface{}, error) { + return "bar", nil + }) + if got, want := fmt.Sprintf("%v (%T)", v, v), "bar (string)"; got != want { + t.Errorf("Do = %v; want %v", got, want) + } + if err != nil { + t.Errorf("Do error = %v", err) + } +} + +func TestDoErr(t *testing.T) { + var g Group + someErr := errors.New("Some error") + v, err, _ := g.Do("key", func() (interface{}, error) { + return nil, someErr + }) + if err != someErr { + t.Errorf("Do error = %v; want someErr %v", err, someErr) + } + if v != nil { + t.Errorf("unexpected non-nil value %#v", v) + } +} + +func TestDoDupSuppress(t *testing.T) { + var g Group + var wg1, wg2 sync.WaitGroup + c := make(chan string, 1) + var calls int32 + fn := func() (interface{}, error) { + if atomic.AddInt32(&calls, 1) == 1 { + // First invocation. + wg1.Done() + } + v := <-c + c <- v // pump; make available for any future calls + + time.Sleep(10 * time.Millisecond) // let more goroutines enter Do + + return v, nil + } + + const n = 10 + wg1.Add(1) + for i := 0; i < n; i++ { + wg1.Add(1) + wg2.Add(1) + go func() { + defer wg2.Done() + wg1.Done() + v, err, _ := g.Do("key", fn) + if err != nil { + t.Errorf("Do error: %v", err) + return + } + if s, _ := v.(string); s != "bar" { + t.Errorf("Do = %T %v; want %q", v, v, "bar") + } + }() + } + wg1.Wait() + // At least one goroutine is in fn now and all of them have at + // least reached the line before the Do. + c <- "bar" + wg2.Wait() + if got := atomic.LoadInt32(&calls); got <= 0 || got >= n { + t.Errorf("number of calls = %d; want over 0 and less than %d", got, n) + } +} diff --git a/api/vendor/golang.org/x/sync/syncmap/map.go b/api/vendor/golang.org/x/sync/syncmap/map.go new file mode 100644 index 0000000..80e1584 --- /dev/null +++ b/api/vendor/golang.org/x/sync/syncmap/map.go @@ -0,0 +1,372 @@ +// 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 syncmap provides a concurrent map implementation. +// It is a prototype for a proposed addition to the sync package +// in the standard library. +// (https://golang.org/issue/18177) +package syncmap + +import ( + "sync" + "sync/atomic" + "unsafe" +) + +// Map is a concurrent map with amortized-constant-time loads, stores, and deletes. +// It is safe for multiple goroutines to call a Map's methods concurrently. +// +// The zero Map is valid and empty. +// +// A Map must not be copied after first use. +type Map struct { + mu sync.Mutex + + // read contains the portion of the map's contents that are safe for + // concurrent access (with or without mu held). + // + // The read field itself is always safe to load, but must only be stored with + // mu held. + // + // Entries stored in read may be updated concurrently without mu, but updating + // a previously-expunged entry requires that the entry be copied to the dirty + // map and unexpunged with mu held. + read atomic.Value // readOnly + + // dirty contains the portion of the map's contents that require mu to be + // held. To ensure that the dirty map can be promoted to the read map quickly, + // it also includes all of the non-expunged entries in the read map. + // + // Expunged entries are not stored in the dirty map. An expunged entry in the + // clean map must be unexpunged and added to the dirty map before a new value + // can be stored to it. + // + // If the dirty map is nil, the next write to the map will initialize it by + // making a shallow copy of the clean map, omitting stale entries. + dirty map[interface{}]*entry + + // misses counts the number of loads since the read map was last updated that + // needed to lock mu to determine whether the key was present. + // + // Once enough misses have occurred to cover the cost of copying the dirty + // map, the dirty map will be promoted to the read map (in the unamended + // state) and the next store to the map will make a new dirty copy. + misses int +} + +// readOnly is an immutable struct stored atomically in the Map.read field. +type readOnly struct { + m map[interface{}]*entry + amended bool // true if the dirty map contains some key not in m. +} + +// expunged is an arbitrary pointer that marks entries which have been deleted +// from the dirty map. +var expunged = unsafe.Pointer(new(interface{})) + +// An entry is a slot in the map corresponding to a particular key. +type entry struct { + // p points to the interface{} value stored for the entry. + // + // If p == nil, the entry has been deleted and m.dirty == nil. + // + // If p == expunged, the entry has been deleted, m.dirty != nil, and the entry + // is missing from m.dirty. + // + // Otherwise, the entry is valid and recorded in m.read.m[key] and, if m.dirty + // != nil, in m.dirty[key]. + // + // An entry can be deleted by atomic replacement with nil: when m.dirty is + // next created, it will atomically replace nil with expunged and leave + // m.dirty[key] unset. + // + // An entry's associated value can be updated by atomic replacement, provided + // p != expunged. If p == expunged, an entry's associated value can be updated + // only after first setting m.dirty[key] = e so that lookups using the dirty + // map find the entry. + p unsafe.Pointer // *interface{} +} + +func newEntry(i interface{}) *entry { + return &entry{p: unsafe.Pointer(&i)} +} + +// Load returns the value stored in the map for a key, or nil if no +// value is present. +// The ok result indicates whether value was found in the map. +func (m *Map) Load(key interface{}) (value interface{}, ok bool) { + read, _ := m.read.Load().(readOnly) + e, ok := read.m[key] + if !ok && read.amended { + m.mu.Lock() + // Avoid reporting a spurious miss if m.dirty got promoted while we were + // blocked on m.mu. (If further loads of the same key will not miss, it's + // not worth copying the dirty map for this key.) + read, _ = m.read.Load().(readOnly) + e, ok = read.m[key] + if !ok && read.amended { + e, ok = m.dirty[key] + // Regardless of whether the entry was present, record a miss: this key + // will take the slow path until the dirty map is promoted to the read + // map. + m.missLocked() + } + m.mu.Unlock() + } + if !ok { + return nil, false + } + return e.load() +} + +func (e *entry) load() (value interface{}, ok bool) { + p := atomic.LoadPointer(&e.p) + if p == nil || p == expunged { + return nil, false + } + return *(*interface{})(p), true +} + +// Store sets the value for a key. +func (m *Map) Store(key, value interface{}) { + read, _ := m.read.Load().(readOnly) + if e, ok := read.m[key]; ok && e.tryStore(&value) { + return + } + + m.mu.Lock() + read, _ = m.read.Load().(readOnly) + if e, ok := read.m[key]; ok { + if e.unexpungeLocked() { + // The entry was previously expunged, which implies that there is a + // non-nil dirty map and this entry is not in it. + m.dirty[key] = e + } + e.storeLocked(&value) + } else if e, ok := m.dirty[key]; ok { + e.storeLocked(&value) + } else { + if !read.amended { + // We're adding the first new key to the dirty map. + // Make sure it is allocated and mark the read-only map as incomplete. + m.dirtyLocked() + m.read.Store(readOnly{m: read.m, amended: true}) + } + m.dirty[key] = newEntry(value) + } + m.mu.Unlock() +} + +// tryStore stores a value if the entry has not been expunged. +// +// If the entry is expunged, tryStore returns false and leaves the entry +// unchanged. +func (e *entry) tryStore(i *interface{}) bool { + p := atomic.LoadPointer(&e.p) + if p == expunged { + return false + } + for { + if atomic.CompareAndSwapPointer(&e.p, p, unsafe.Pointer(i)) { + return true + } + p = atomic.LoadPointer(&e.p) + if p == expunged { + return false + } + } +} + +// unexpungeLocked ensures that the entry is not marked as expunged. +// +// If the entry was previously expunged, it must be added to the dirty map +// before m.mu is unlocked. +func (e *entry) unexpungeLocked() (wasExpunged bool) { + return atomic.CompareAndSwapPointer(&e.p, expunged, nil) +} + +// storeLocked unconditionally stores a value to the entry. +// +// The entry must be known not to be expunged. +func (e *entry) storeLocked(i *interface{}) { + atomic.StorePointer(&e.p, unsafe.Pointer(i)) +} + +// LoadOrStore returns the existing value for the key if present. +// Otherwise, it stores and returns the given value. +// The loaded result is true if the value was loaded, false if stored. +func (m *Map) LoadOrStore(key, value interface{}) (actual interface{}, loaded bool) { + // Avoid locking if it's a clean hit. + read, _ := m.read.Load().(readOnly) + if e, ok := read.m[key]; ok { + actual, loaded, ok := e.tryLoadOrStore(value) + if ok { + return actual, loaded + } + } + + m.mu.Lock() + read, _ = m.read.Load().(readOnly) + if e, ok := read.m[key]; ok { + if e.unexpungeLocked() { + m.dirty[key] = e + } + actual, loaded, _ = e.tryLoadOrStore(value) + } else if e, ok := m.dirty[key]; ok { + actual, loaded, _ = e.tryLoadOrStore(value) + m.missLocked() + } else { + if !read.amended { + // We're adding the first new key to the dirty map. + // Make sure it is allocated and mark the read-only map as incomplete. + m.dirtyLocked() + m.read.Store(readOnly{m: read.m, amended: true}) + } + m.dirty[key] = newEntry(value) + actual, loaded = value, false + } + m.mu.Unlock() + + return actual, loaded +} + +// tryLoadOrStore atomically loads or stores a value if the entry is not +// expunged. +// +// If the entry is expunged, tryLoadOrStore leaves the entry unchanged and +// returns with ok==false. +func (e *entry) tryLoadOrStore(i interface{}) (actual interface{}, loaded, ok bool) { + p := atomic.LoadPointer(&e.p) + if p == expunged { + return nil, false, false + } + if p != nil { + return *(*interface{})(p), true, true + } + + // Copy the interface after the first load to make this method more amenable + // to escape analysis: if we hit the "load" path or the entry is expunged, we + // shouldn't bother heap-allocating. + ic := i + for { + if atomic.CompareAndSwapPointer(&e.p, nil, unsafe.Pointer(&ic)) { + return i, false, true + } + p = atomic.LoadPointer(&e.p) + if p == expunged { + return nil, false, false + } + if p != nil { + return *(*interface{})(p), true, true + } + } +} + +// Delete deletes the value for a key. +func (m *Map) Delete(key interface{}) { + read, _ := m.read.Load().(readOnly) + e, ok := read.m[key] + if !ok && read.amended { + m.mu.Lock() + read, _ = m.read.Load().(readOnly) + e, ok = read.m[key] + if !ok && read.amended { + delete(m.dirty, key) + } + m.mu.Unlock() + } + if ok { + e.delete() + } +} + +func (e *entry) delete() (hadValue bool) { + for { + p := atomic.LoadPointer(&e.p) + if p == nil || p == expunged { + return false + } + if atomic.CompareAndSwapPointer(&e.p, p, nil) { + return true + } + } +} + +// Range calls f sequentially for each key and value present in the map. +// If f returns false, range stops the iteration. +// +// Range does not necessarily correspond to any consistent snapshot of the Map's +// contents: no key will be visited more than once, but if the value for any key +// is stored or deleted concurrently, Range may reflect any mapping for that key +// from any point during the Range call. +// +// Range may be O(N) with the number of elements in the map even if f returns +// false after a constant number of calls. +func (m *Map) Range(f func(key, value interface{}) bool) { + // We need to be able to iterate over all of the keys that were already + // present at the start of the call to Range. + // If read.amended is false, then read.m satisfies that property without + // requiring us to hold m.mu for a long time. + read, _ := m.read.Load().(readOnly) + if read.amended { + // m.dirty contains keys not in read.m. Fortunately, Range is already O(N) + // (assuming the caller does not break out early), so a call to Range + // amortizes an entire copy of the map: we can promote the dirty copy + // immediately! + m.mu.Lock() + read, _ = m.read.Load().(readOnly) + if read.amended { + read = readOnly{m: m.dirty} + m.read.Store(read) + m.dirty = nil + m.misses = 0 + } + m.mu.Unlock() + } + + for k, e := range read.m { + v, ok := e.load() + if !ok { + continue + } + if !f(k, v) { + break + } + } +} + +func (m *Map) missLocked() { + m.misses++ + if m.misses < len(m.dirty) { + return + } + m.read.Store(readOnly{m: m.dirty}) + m.dirty = nil + m.misses = 0 +} + +func (m *Map) dirtyLocked() { + if m.dirty != nil { + return + } + + read, _ := m.read.Load().(readOnly) + m.dirty = make(map[interface{}]*entry, len(read.m)) + for k, e := range read.m { + if !e.tryExpungeLocked() { + m.dirty[k] = e + } + } +} + +func (e *entry) tryExpungeLocked() (isExpunged bool) { + p := atomic.LoadPointer(&e.p) + for p == nil { + if atomic.CompareAndSwapPointer(&e.p, nil, expunged) { + return true + } + p = atomic.LoadPointer(&e.p) + } + return p == expunged +} diff --git a/api/vendor/golang.org/x/sync/syncmap/map_bench_test.go b/api/vendor/golang.org/x/sync/syncmap/map_bench_test.go new file mode 100644 index 0000000..b279b4f --- /dev/null +++ b/api/vendor/golang.org/x/sync/syncmap/map_bench_test.go @@ -0,0 +1,216 @@ +// 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 syncmap_test + +import ( + "fmt" + "reflect" + "sync/atomic" + "testing" + + "golang.org/x/sync/syncmap" +) + +type bench struct { + setup func(*testing.B, mapInterface) + perG func(b *testing.B, pb *testing.PB, i int, m mapInterface) +} + +func benchMap(b *testing.B, bench bench) { + for _, m := range [...]mapInterface{&DeepCopyMap{}, &RWMutexMap{}, &syncmap.Map{}} { + b.Run(fmt.Sprintf("%T", m), func(b *testing.B) { + m = reflect.New(reflect.TypeOf(m).Elem()).Interface().(mapInterface) + if bench.setup != nil { + bench.setup(b, m) + } + + b.ResetTimer() + + var i int64 + b.RunParallel(func(pb *testing.PB) { + id := int(atomic.AddInt64(&i, 1) - 1) + bench.perG(b, pb, id*b.N, m) + }) + }) + } +} + +func BenchmarkLoadMostlyHits(b *testing.B) { + const hits, misses = 1023, 1 + + benchMap(b, bench{ + setup: func(_ *testing.B, m mapInterface) { + for i := 0; i < hits; i++ { + m.LoadOrStore(i, i) + } + // Prime the map to get it into a steady state. + for i := 0; i < hits*2; i++ { + m.Load(i % hits) + } + }, + + perG: func(b *testing.B, pb *testing.PB, i int, m mapInterface) { + for ; pb.Next(); i++ { + m.Load(i % (hits + misses)) + } + }, + }) +} + +func BenchmarkLoadMostlyMisses(b *testing.B) { + const hits, misses = 1, 1023 + + benchMap(b, bench{ + setup: func(_ *testing.B, m mapInterface) { + for i := 0; i < hits; i++ { + m.LoadOrStore(i, i) + } + // Prime the map to get it into a steady state. + for i := 0; i < hits*2; i++ { + m.Load(i % hits) + } + }, + + perG: func(b *testing.B, pb *testing.PB, i int, m mapInterface) { + for ; pb.Next(); i++ { + m.Load(i % (hits + misses)) + } + }, + }) +} + +func BenchmarkLoadOrStoreBalanced(b *testing.B) { + const hits, misses = 128, 128 + + benchMap(b, bench{ + setup: func(b *testing.B, m mapInterface) { + if _, ok := m.(*DeepCopyMap); ok { + b.Skip("DeepCopyMap has quadratic running time.") + } + for i := 0; i < hits; i++ { + m.LoadOrStore(i, i) + } + // Prime the map to get it into a steady state. + for i := 0; i < hits*2; i++ { + m.Load(i % hits) + } + }, + + perG: func(b *testing.B, pb *testing.PB, i int, m mapInterface) { + for ; pb.Next(); i++ { + j := i % (hits + misses) + if j < hits { + if _, ok := m.LoadOrStore(j, i); !ok { + b.Fatalf("unexpected miss for %v", j) + } + } else { + if v, loaded := m.LoadOrStore(i, i); loaded { + b.Fatalf("failed to store %v: existing value %v", i, v) + } + } + } + }, + }) +} + +func BenchmarkLoadOrStoreUnique(b *testing.B) { + benchMap(b, bench{ + setup: func(b *testing.B, m mapInterface) { + if _, ok := m.(*DeepCopyMap); ok { + b.Skip("DeepCopyMap has quadratic running time.") + } + }, + + perG: func(b *testing.B, pb *testing.PB, i int, m mapInterface) { + for ; pb.Next(); i++ { + m.LoadOrStore(i, i) + } + }, + }) +} + +func BenchmarkLoadOrStoreCollision(b *testing.B) { + benchMap(b, bench{ + setup: func(_ *testing.B, m mapInterface) { + m.LoadOrStore(0, 0) + }, + + perG: func(b *testing.B, pb *testing.PB, i int, m mapInterface) { + for ; pb.Next(); i++ { + m.LoadOrStore(0, 0) + } + }, + }) +} + +func BenchmarkRange(b *testing.B) { + const mapSize = 1 << 10 + + benchMap(b, bench{ + setup: func(_ *testing.B, m mapInterface) { + for i := 0; i < mapSize; i++ { + m.Store(i, i) + } + }, + + perG: func(b *testing.B, pb *testing.PB, i int, m mapInterface) { + for ; pb.Next(); i++ { + m.Range(func(_, _ interface{}) bool { return true }) + } + }, + }) +} + +// BenchmarkAdversarialAlloc tests performance when we store a new value +// immediately whenever the map is promoted to clean and otherwise load a +// unique, missing key. +// +// This forces the Load calls to always acquire the map's mutex. +func BenchmarkAdversarialAlloc(b *testing.B) { + benchMap(b, bench{ + perG: func(b *testing.B, pb *testing.PB, i int, m mapInterface) { + var stores, loadsSinceStore int64 + for ; pb.Next(); i++ { + m.Load(i) + if loadsSinceStore++; loadsSinceStore > stores { + m.LoadOrStore(i, stores) + loadsSinceStore = 0 + stores++ + } + } + }, + }) +} + +// BenchmarkAdversarialDelete tests performance when we periodically delete +// one key and add a different one in a large map. +// +// This forces the Load calls to always acquire the map's mutex and periodically +// makes a full copy of the map despite changing only one entry. +func BenchmarkAdversarialDelete(b *testing.B) { + const mapSize = 1 << 10 + + benchMap(b, bench{ + setup: func(_ *testing.B, m mapInterface) { + for i := 0; i < mapSize; i++ { + m.Store(i, i) + } + }, + + perG: func(b *testing.B, pb *testing.PB, i int, m mapInterface) { + for ; pb.Next(); i++ { + m.Load(i) + + if i%mapSize == 0 { + m.Range(func(k, _ interface{}) bool { + m.Delete(k) + return false + }) + m.Store(i, i) + } + } + }, + }) +} diff --git a/api/vendor/golang.org/x/sync/syncmap/map_reference_test.go b/api/vendor/golang.org/x/sync/syncmap/map_reference_test.go new file mode 100644 index 0000000..923c51b --- /dev/null +++ b/api/vendor/golang.org/x/sync/syncmap/map_reference_test.go @@ -0,0 +1,151 @@ +// 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 syncmap_test + +import ( + "sync" + "sync/atomic" +) + +// This file contains reference map implementations for unit-tests. + +// mapInterface is the interface Map implements. +type mapInterface interface { + Load(interface{}) (interface{}, bool) + Store(key, value interface{}) + LoadOrStore(key, value interface{}) (actual interface{}, loaded bool) + Delete(interface{}) + Range(func(key, value interface{}) (shouldContinue bool)) +} + +// RWMutexMap is an implementation of mapInterface using a sync.RWMutex. +type RWMutexMap struct { + mu sync.RWMutex + dirty map[interface{}]interface{} +} + +func (m *RWMutexMap) Load(key interface{}) (value interface{}, ok bool) { + m.mu.RLock() + value, ok = m.dirty[key] + m.mu.RUnlock() + return +} + +func (m *RWMutexMap) Store(key, value interface{}) { + m.mu.Lock() + if m.dirty == nil { + m.dirty = make(map[interface{}]interface{}) + } + m.dirty[key] = value + m.mu.Unlock() +} + +func (m *RWMutexMap) LoadOrStore(key, value interface{}) (actual interface{}, loaded bool) { + m.mu.Lock() + actual, loaded = m.dirty[key] + if !loaded { + actual = value + if m.dirty == nil { + m.dirty = make(map[interface{}]interface{}) + } + m.dirty[key] = value + } + m.mu.Unlock() + return actual, loaded +} + +func (m *RWMutexMap) Delete(key interface{}) { + m.mu.Lock() + delete(m.dirty, key) + m.mu.Unlock() +} + +func (m *RWMutexMap) Range(f func(key, value interface{}) (shouldContinue bool)) { + m.mu.RLock() + keys := make([]interface{}, 0, len(m.dirty)) + for k := range m.dirty { + keys = append(keys, k) + } + m.mu.RUnlock() + + for _, k := range keys { + v, ok := m.Load(k) + if !ok { + continue + } + if !f(k, v) { + break + } + } +} + +// DeepCopyMap is an implementation of mapInterface using a Mutex and +// atomic.Value. It makes deep copies of the map on every write to avoid +// acquiring the Mutex in Load. +type DeepCopyMap struct { + mu sync.Mutex + clean atomic.Value +} + +func (m *DeepCopyMap) Load(key interface{}) (value interface{}, ok bool) { + clean, _ := m.clean.Load().(map[interface{}]interface{}) + value, ok = clean[key] + return value, ok +} + +func (m *DeepCopyMap) Store(key, value interface{}) { + m.mu.Lock() + dirty := m.dirty() + dirty[key] = value + m.clean.Store(dirty) + m.mu.Unlock() +} + +func (m *DeepCopyMap) LoadOrStore(key, value interface{}) (actual interface{}, loaded bool) { + clean, _ := m.clean.Load().(map[interface{}]interface{}) + actual, loaded = clean[key] + if loaded { + return actual, loaded + } + + m.mu.Lock() + // Reload clean in case it changed while we were waiting on m.mu. + clean, _ = m.clean.Load().(map[interface{}]interface{}) + actual, loaded = clean[key] + if !loaded { + dirty := m.dirty() + dirty[key] = value + actual = value + m.clean.Store(dirty) + } + m.mu.Unlock() + return actual, loaded +} + +func (m *DeepCopyMap) Delete(key interface{}) { + m.mu.Lock() + dirty := m.dirty() + delete(dirty, key) + m.clean.Store(dirty) + m.mu.Unlock() +} + +func (m *DeepCopyMap) Range(f func(key, value interface{}) (shouldContinue bool)) { + clean, _ := m.clean.Load().(map[interface{}]interface{}) + for k, v := range clean { + if !f(k, v) { + break + } + } +} + +func (m *DeepCopyMap) dirty() map[interface{}]interface{} { + clean, _ := m.clean.Load().(map[interface{}]interface{}) + dirty := make(map[interface{}]interface{}, len(clean)+1) + for k, v := range clean { + dirty[k] = v + } + return dirty +} diff --git a/api/vendor/golang.org/x/sync/syncmap/map_test.go b/api/vendor/golang.org/x/sync/syncmap/map_test.go new file mode 100644 index 0000000..c883f17 --- /dev/null +++ b/api/vendor/golang.org/x/sync/syncmap/map_test.go @@ -0,0 +1,172 @@ +// 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 syncmap_test + +import ( + "math/rand" + "reflect" + "runtime" + "sync" + "testing" + "testing/quick" + + "golang.org/x/sync/syncmap" +) + +type mapOp string + +const ( + opLoad = mapOp("Load") + opStore = mapOp("Store") + opLoadOrStore = mapOp("LoadOrStore") + opDelete = mapOp("Delete") +) + +var mapOps = [...]mapOp{opLoad, opStore, opLoadOrStore, opDelete} + +// mapCall is a quick.Generator for calls on mapInterface. +type mapCall struct { + op mapOp + k, v interface{} +} + +func (c mapCall) apply(m mapInterface) (interface{}, bool) { + switch c.op { + case opLoad: + return m.Load(c.k) + case opStore: + m.Store(c.k, c.v) + return nil, false + case opLoadOrStore: + return m.LoadOrStore(c.k, c.v) + case opDelete: + m.Delete(c.k) + return nil, false + default: + panic("invalid mapOp") + } +} + +type mapResult struct { + value interface{} + ok bool +} + +func randValue(r *rand.Rand) interface{} { + b := make([]byte, r.Intn(4)) + for i := range b { + b[i] = 'a' + byte(rand.Intn(26)) + } + return string(b) +} + +func (mapCall) Generate(r *rand.Rand, size int) reflect.Value { + c := mapCall{op: mapOps[rand.Intn(len(mapOps))], k: randValue(r)} + switch c.op { + case opStore, opLoadOrStore: + c.v = randValue(r) + } + return reflect.ValueOf(c) +} + +func applyCalls(m mapInterface, calls []mapCall) (results []mapResult, final map[interface{}]interface{}) { + for _, c := range calls { + v, ok := c.apply(m) + results = append(results, mapResult{v, ok}) + } + + final = make(map[interface{}]interface{}) + m.Range(func(k, v interface{}) bool { + final[k] = v + return true + }) + + return results, final +} + +func applyMap(calls []mapCall) ([]mapResult, map[interface{}]interface{}) { + return applyCalls(new(syncmap.Map), calls) +} + +func applyRWMutexMap(calls []mapCall) ([]mapResult, map[interface{}]interface{}) { + return applyCalls(new(RWMutexMap), calls) +} + +func applyDeepCopyMap(calls []mapCall) ([]mapResult, map[interface{}]interface{}) { + return applyCalls(new(DeepCopyMap), calls) +} + +func TestMapMatchesRWMutex(t *testing.T) { + if err := quick.CheckEqual(applyMap, applyRWMutexMap, nil); err != nil { + t.Error(err) + } +} + +func TestMapMatchesDeepCopy(t *testing.T) { + if err := quick.CheckEqual(applyMap, applyDeepCopyMap, nil); err != nil { + t.Error(err) + } +} + +func TestConcurrentRange(t *testing.T) { + const mapSize = 1 << 10 + + m := new(syncmap.Map) + for n := int64(1); n <= mapSize; n++ { + m.Store(n, int64(n)) + } + + done := make(chan struct{}) + var wg sync.WaitGroup + defer func() { + close(done) + wg.Wait() + }() + for g := int64(runtime.GOMAXPROCS(0)); g > 0; g-- { + r := rand.New(rand.NewSource(g)) + wg.Add(1) + go func(g int64) { + defer wg.Done() + for i := int64(0); ; i++ { + select { + case <-done: + return + default: + } + for n := int64(1); n < mapSize; n++ { + if r.Int63n(mapSize) == 0 { + m.Store(n, n*i*g) + } else { + m.Load(n) + } + } + } + }(g) + } + + iters := 1 << 10 + if testing.Short() { + iters = 16 + } + for n := iters; n > 0; n-- { + seen := make(map[int64]bool, mapSize) + + m.Range(func(ki, vi interface{}) bool { + k, v := ki.(int64), vi.(int64) + if v%k != 0 { + t.Fatalf("while Storing multiples of %v, Range saw value %v", k, v) + } + if seen[k] { + t.Fatalf("Range visited key %v twice", k) + } + seen[k] = true + return true + }) + + if len(seen) != mapSize { + t.Fatalf("Range visited %v elements of %v-element Map", len(seen), mapSize) + } + } +} diff --git a/api/vendor/golang.org/x/sys/.gitattributes b/api/vendor/golang.org/x/sys/.gitattributes new file mode 100644 index 0000000..d2f212e --- /dev/null +++ b/api/vendor/golang.org/x/sys/.gitattributes @@ -0,0 +1,10 @@ +# Treat all files in this repo as binary, with no git magic updating +# line endings. Windows users contributing to Go will need to use a +# modern version of git and editors capable of LF line endings. +# +# We'll prevent accidental CRLF line endings from entering the repo +# via the git-review gofmt checks. +# +# See golang.org/issue/9281 + +* -text diff --git a/api/vendor/golang.org/x/sys/.gitignore b/api/vendor/golang.org/x/sys/.gitignore new file mode 100644 index 0000000..8339fd6 --- /dev/null +++ b/api/vendor/golang.org/x/sys/.gitignore @@ -0,0 +1,2 @@ +# Add no patterns to .hgignore except for files generated by the build. +last-change diff --git a/api/vendor/golang.org/x/sys/AUTHORS b/api/vendor/golang.org/x/sys/AUTHORS new file mode 100644 index 0000000..15167cd --- /dev/null +++ b/api/vendor/golang.org/x/sys/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 http://tip.golang.org/AUTHORS. diff --git a/api/vendor/golang.org/x/sys/CONTRIBUTING.md b/api/vendor/golang.org/x/sys/CONTRIBUTING.md new file mode 100644 index 0000000..d0485e8 --- /dev/null +++ b/api/vendor/golang.org/x/sys/CONTRIBUTING.md @@ -0,0 +1,26 @@ +# Contributing to Go + +Go is an open source project. + +It is the work of hundreds of contributors. We appreciate your help! + +## Filing issues + +When [filing an issue](https://golang.org/issue/new), make sure to answer these five questions: + +1. What version of Go are you using (`go version`)? +2. What operating system and processor architecture are you using? +3. What did you do? +4. What did you expect to see? +5. What did you see instead? + +General questions should go to the [golang-nuts mailing list](https://groups.google.com/group/golang-nuts) instead of the issue tracker. +The gophers there will answer or ask you to file an issue if you've tripped over a bug. + +## Contributing code + +Please read the [Contribution Guidelines](https://golang.org/doc/contribute.html) +before sending patches. + +Unless otherwise noted, the Go source files are distributed under +the BSD-style license found in the LICENSE file. diff --git a/api/vendor/golang.org/x/sys/CONTRIBUTORS b/api/vendor/golang.org/x/sys/CONTRIBUTORS new file mode 100644 index 0000000..1c4577e --- /dev/null +++ b/api/vendor/golang.org/x/sys/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 http://tip.golang.org/CONTRIBUTORS. diff --git a/api/vendor/golang.org/x/sys/LICENSE b/api/vendor/golang.org/x/sys/LICENSE new file mode 100644 index 0000000..6a66aea --- /dev/null +++ b/api/vendor/golang.org/x/sys/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/api/vendor/golang.org/x/sys/PATENTS b/api/vendor/golang.org/x/sys/PATENTS new file mode 100644 index 0000000..7330990 --- /dev/null +++ b/api/vendor/golang.org/x/sys/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/api/vendor/golang.org/x/sys/README.md b/api/vendor/golang.org/x/sys/README.md new file mode 100644 index 0000000..ef6c9e5 --- /dev/null +++ b/api/vendor/golang.org/x/sys/README.md @@ -0,0 +1,18 @@ +# sys + +This repository holds supplemental Go packages for low-level interactions with +the operating system. + +## Download/Install + +The easiest way to install is to run `go get -u golang.org/x/sys`. You can +also manually git clone the repository to `$GOPATH/src/golang.org/x/sys`. + +## Report Issues / Send Patches + +This repository uses Gerrit for code changes. To learn how to submit changes to +this repository, see https://golang.org/doc/contribute.html. + +The main issue tracker for the sys repository is located at +https://github.com/golang/go/issues. Prefix your issue with "x/sys:" in the +subject line, so it is easy to find. diff --git a/api/vendor/golang.org/x/sys/codereview.cfg b/api/vendor/golang.org/x/sys/codereview.cfg new file mode 100644 index 0000000..3f8b14b --- /dev/null +++ b/api/vendor/golang.org/x/sys/codereview.cfg @@ -0,0 +1 @@ +issuerepo: golang/go diff --git a/api/vendor/golang.org/x/sys/cpu/cpu.go b/api/vendor/golang.org/x/sys/cpu/cpu.go new file mode 100644 index 0000000..2d1fc12 --- /dev/null +++ b/api/vendor/golang.org/x/sys/cpu/cpu.go @@ -0,0 +1,35 @@ +// 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 + +// 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 { + _ [cacheLineSize]byte + 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 + HasBMI1 bool // Bit manipulation instruction set 1 + HasBMI2 bool // Bit manipulation instruction set 2 + 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. + 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 + _ [cacheLineSize]byte +} diff --git a/api/vendor/golang.org/x/sys/cpu/cpu_arm.go b/api/vendor/golang.org/x/sys/cpu/cpu_arm.go new file mode 100644 index 0000000..d93036f --- /dev/null +++ b/api/vendor/golang.org/x/sys/cpu/cpu_arm.go @@ -0,0 +1,7 @@ +// 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 diff --git a/api/vendor/golang.org/x/sys/cpu/cpu_arm64.go b/api/vendor/golang.org/x/sys/cpu/cpu_arm64.go new file mode 100644 index 0000000..1d2ab29 --- /dev/null +++ b/api/vendor/golang.org/x/sys/cpu/cpu_arm64.go @@ -0,0 +1,7 @@ +// 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 = 64 diff --git a/api/vendor/golang.org/x/sys/cpu/cpu_mips64x.go b/api/vendor/golang.org/x/sys/cpu/cpu_mips64x.go new file mode 100644 index 0000000..6165f12 --- /dev/null +++ b/api/vendor/golang.org/x/sys/cpu/cpu_mips64x.go @@ -0,0 +1,9 @@ +// 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 mips64 mips64le + +package cpu + +const cacheLineSize = 32 diff --git a/api/vendor/golang.org/x/sys/cpu/cpu_mipsx.go b/api/vendor/golang.org/x/sys/cpu/cpu_mipsx.go new file mode 100644 index 0000000..1269eee --- /dev/null +++ b/api/vendor/golang.org/x/sys/cpu/cpu_mipsx.go @@ -0,0 +1,9 @@ +// 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 mips mipsle + +package cpu + +const cacheLineSize = 32 diff --git a/api/vendor/golang.org/x/sys/cpu/cpu_ppc64x.go b/api/vendor/golang.org/x/sys/cpu/cpu_ppc64x.go new file mode 100644 index 0000000..d10759a --- /dev/null +++ b/api/vendor/golang.org/x/sys/cpu/cpu_ppc64x.go @@ -0,0 +1,9 @@ +// 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 ppc64 ppc64le + +package cpu + +const cacheLineSize = 128 diff --git a/api/vendor/golang.org/x/sys/cpu/cpu_s390x.go b/api/vendor/golang.org/x/sys/cpu/cpu_s390x.go new file mode 100644 index 0000000..684c4f0 --- /dev/null +++ b/api/vendor/golang.org/x/sys/cpu/cpu_s390x.go @@ -0,0 +1,7 @@ +// 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 = 256 diff --git a/api/vendor/golang.org/x/sys/cpu/cpu_test.go b/api/vendor/golang.org/x/sys/cpu/cpu_test.go new file mode 100644 index 0000000..baf4b87 --- /dev/null +++ b/api/vendor/golang.org/x/sys/cpu/cpu_test.go @@ -0,0 +1,28 @@ +// 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_test + +import ( + "runtime" + "testing" + + "golang.org/x/sys/cpu" +) + +func TestAMD64minimalFeatures(t *testing.T) { + if runtime.GOARCH == "amd64" { + if !cpu.X86.HasSSE2 { + t.Fatal("HasSSE2 expected true, got false") + } + } +} + +func TestAVX2hasAVX(t *testing.T) { + if runtime.GOARCH == "amd64" { + if cpu.X86.HasAVX2 && !cpu.X86.HasAVX { + t.Fatal("HasAVX expected true, got false") + } + } +} diff --git a/api/vendor/golang.org/x/sys/cpu/cpu_x86.go b/api/vendor/golang.org/x/sys/cpu/cpu_x86.go new file mode 100644 index 0000000..8842b7c --- /dev/null +++ b/api/vendor/golang.org/x/sys/cpu/cpu_x86.go @@ -0,0 +1,61 @@ +// 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 + +package cpu + +const cacheLineSize = 64 + +// cpuid is implemented in cpu_x86.s. +func cpuid(eaxArg, ecxArg uint32) (eax, ebx, ecx, edx uint32) + +// xgetbv with ecx = 0 is implemented in cpu_x86.s. +func xgetbv() (eax, edx uint32) + +func init() { + 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.HasSSE41 = isSet(19, ecx1) + X86.HasSSE42 = isSet(20, ecx1) + X86.HasPOPCNT = isSet(23, ecx1) + X86.HasAES = isSet(25, ecx1) + X86.HasOSXSAVE = isSet(27, ecx1) + + osSupportsAVX := false + // 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) + } + + X86.HasAVX = isSet(28, ecx1) && osSupportsAVX + + if maxID < 7 { + return + } + + _, ebx7, _, _ := 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.HasADX = isSet(19, ebx7) +} + +func isSet(bitpos uint, value uint32) bool { + return value&(1< len(b) { + return n, ErrShortStat + } + + for _, c := range d.Name { + if c == '/' { + return n, ErrBadName + } + } + + b = pbit16(b, uint16(n)-2) + b = pbit16(b, d.Type) + b = pbit32(b, d.Dev) + b = pbit8(b, d.Qid.Type) + b = pbit32(b, d.Qid.Vers) + b = pbit64(b, d.Qid.Path) + b = pbit32(b, d.Mode) + b = pbit32(b, d.Atime) + b = pbit32(b, d.Mtime) + b = pbit64(b, uint64(d.Length)) + b = pstring(b, d.Name) + b = pstring(b, d.Uid) + b = pstring(b, d.Gid) + b = pstring(b, d.Muid) + + return n, nil +} + +// UnmarshalDir decodes a single 9P stat message from b and returns the resulting Dir. +// +// If b is too small to hold a valid stat message, ErrShortStat is returned. +// +// If the stat message itself is invalid, ErrBadStat is returned. +func UnmarshalDir(b []byte) (*Dir, error) { + if len(b) < STATFIXLEN { + return nil, ErrShortStat + } + size, buf := gbit16(b) + if len(b) != int(size)+2 { + return nil, ErrBadStat + } + b = buf + + var d Dir + d.Type, b = gbit16(b) + d.Dev, b = gbit32(b) + d.Qid.Type, b = gbit8(b) + d.Qid.Vers, b = gbit32(b) + d.Qid.Path, b = gbit64(b) + d.Mode, b = gbit32(b) + d.Atime, b = gbit32(b) + d.Mtime, b = gbit32(b) + + n, b := gbit64(b) + d.Length = int64(n) + + var ok bool + if d.Name, b, ok = gstring(b); !ok { + return nil, ErrBadStat + } + if d.Uid, b, ok = gstring(b); !ok { + return nil, ErrBadStat + } + if d.Gid, b, ok = gstring(b); !ok { + return nil, ErrBadStat + } + if d.Muid, b, ok = gstring(b); !ok { + return nil, ErrBadStat + } + + return &d, nil +} + +// pbit8 copies the 8-bit number v to b and returns the remaining slice of b. +func pbit8(b []byte, v uint8) []byte { + b[0] = byte(v) + return b[1:] +} + +// pbit16 copies the 16-bit number v to b in little-endian order and returns the remaining slice of b. +func pbit16(b []byte, v uint16) []byte { + b[0] = byte(v) + b[1] = byte(v >> 8) + return b[2:] +} + +// pbit32 copies the 32-bit number v to b in little-endian order and returns the remaining slice of b. +func pbit32(b []byte, v uint32) []byte { + b[0] = byte(v) + b[1] = byte(v >> 8) + b[2] = byte(v >> 16) + b[3] = byte(v >> 24) + return b[4:] +} + +// pbit64 copies the 64-bit number v to b in little-endian order and returns the remaining slice of b. +func pbit64(b []byte, v uint64) []byte { + b[0] = byte(v) + b[1] = byte(v >> 8) + b[2] = byte(v >> 16) + b[3] = byte(v >> 24) + b[4] = byte(v >> 32) + b[5] = byte(v >> 40) + b[6] = byte(v >> 48) + b[7] = byte(v >> 56) + return b[8:] +} + +// pstring copies the string s to b, prepending it with a 16-bit length in little-endian order, and +// returning the remaining slice of b.. +func pstring(b []byte, s string) []byte { + b = pbit16(b, uint16(len(s))) + n := copy(b, s) + return b[n:] +} + +// gbit8 reads an 8-bit number from b and returns it with the remaining slice of b. +func gbit8(b []byte) (uint8, []byte) { + return uint8(b[0]), b[1:] +} + +// gbit16 reads a 16-bit number in little-endian order from b and returns it with the remaining slice of b. +func gbit16(b []byte) (uint16, []byte) { + return uint16(b[0]) | uint16(b[1])<<8, b[2:] +} + +// gbit32 reads a 32-bit number in little-endian order from b and returns it with the remaining slice of b. +func gbit32(b []byte) (uint32, []byte) { + return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24, b[4:] +} + +// gbit64 reads a 64-bit number in little-endian order from b and returns it with the remaining slice of b. +func gbit64(b []byte) (uint64, []byte) { + lo := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + hi := uint32(b[4]) | uint32(b[5])<<8 | uint32(b[6])<<16 | uint32(b[7])<<24 + return uint64(lo) | uint64(hi)<<32, b[8:] +} + +// gstring reads a string from b, prefixed with a 16-bit length in little-endian order. +// It returns the string with the remaining slice of b and a boolean. If the length is +// greater than the number of bytes in b, the boolean will be false. +func gstring(b []byte) (string, []byte, bool) { + n, b := gbit16(b) + if int(n) > len(b) { + return "", b, false + } + return string(b[:n]), b[n:], true +} diff --git a/api/vendor/golang.org/x/sys/plan9/env_plan9.go b/api/vendor/golang.org/x/sys/plan9/env_plan9.go new file mode 100644 index 0000000..8f19180 --- /dev/null +++ b/api/vendor/golang.org/x/sys/plan9/env_plan9.go @@ -0,0 +1,31 @@ +// 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. + +// Plan 9 environment variables. + +package plan9 + +import ( + "syscall" +) + +func Getenv(key string) (value string, found bool) { + return syscall.Getenv(key) +} + +func Setenv(key, value string) error { + return syscall.Setenv(key, value) +} + +func Clearenv() { + syscall.Clearenv() +} + +func Environ() []string { + return syscall.Environ() +} + +func Unsetenv(key string) error { + return syscall.Unsetenv(key) +} diff --git a/api/vendor/golang.org/x/sys/plan9/errors_plan9.go b/api/vendor/golang.org/x/sys/plan9/errors_plan9.go new file mode 100644 index 0000000..65fe74d --- /dev/null +++ b/api/vendor/golang.org/x/sys/plan9/errors_plan9.go @@ -0,0 +1,50 @@ +// 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 plan9 + +import "syscall" + +// Constants +const ( + // Invented values to support what package os expects. + O_CREAT = 0x02000 + O_APPEND = 0x00400 + O_NOCTTY = 0x00000 + O_NONBLOCK = 0x00000 + O_SYNC = 0x00000 + O_ASYNC = 0x00000 + + S_IFMT = 0x1f000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 +) + +// Errors +var ( + EINVAL = syscall.NewError("bad arg in system call") + ENOTDIR = syscall.NewError("not a directory") + EISDIR = syscall.NewError("file is a directory") + ENOENT = syscall.NewError("file does not exist") + EEXIST = syscall.NewError("file already exists") + EMFILE = syscall.NewError("no free file descriptors") + EIO = syscall.NewError("i/o error") + ENAMETOOLONG = syscall.NewError("file name too long") + EINTR = syscall.NewError("interrupted") + EPERM = syscall.NewError("permission denied") + EBUSY = syscall.NewError("no free devices") + ETIMEDOUT = syscall.NewError("connection timed out") + EPLAN9 = syscall.NewError("not supported by plan 9") + + // The following errors do not correspond to any + // Plan 9 system messages. Invented to support + // what package os and others expect. + EACCES = syscall.NewError("access permission denied") + EAFNOSUPPORT = syscall.NewError("address family not supported by protocol") +) diff --git a/api/vendor/golang.org/x/sys/plan9/mkall.sh b/api/vendor/golang.org/x/sys/plan9/mkall.sh new file mode 100755 index 0000000..9f73c60 --- /dev/null +++ b/api/vendor/golang.org/x/sys/plan9/mkall.sh @@ -0,0 +1,138 @@ +#!/usr/bin/env bash +# 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. + +# The plan9 package provides access to the raw system call +# interface of the underlying operating system. Porting Go to +# a new architecture/operating system combination requires +# some manual effort, though there are tools that automate +# much of the process. The auto-generated files have names +# beginning with z. +# +# This script runs or (given -n) prints suggested commands to generate z files +# for the current system. Running those commands is not automatic. +# This script is documentation more than anything else. +# +# * asm_${GOOS}_${GOARCH}.s +# +# This hand-written assembly file implements system call dispatch. +# There are three entry points: +# +# func Syscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr); +# func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr); +# func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr); +# +# The first and second are the standard ones; they differ only in +# how many arguments can be passed to the kernel. +# The third is for low-level use by the ForkExec wrapper; +# unlike the first two, it does not call into the scheduler to +# let it know that a system call is running. +# +# * syscall_${GOOS}.go +# +# This hand-written Go file implements system calls that need +# special handling and lists "//sys" comments giving prototypes +# for ones that can be auto-generated. Mksyscall reads those +# comments to generate the stubs. +# +# * syscall_${GOOS}_${GOARCH}.go +# +# Same as syscall_${GOOS}.go except that it contains code specific +# to ${GOOS} on one particular architecture. +# +# * types_${GOOS}.c +# +# This hand-written C file includes standard C headers and then +# creates typedef or enum names beginning with a dollar sign +# (use of $ in variable names is a gcc extension). The hardest +# part about preparing this file is figuring out which headers to +# include and which symbols need to be #defined to get the +# actual data structures that pass through to the kernel system calls. +# Some C libraries present alternate versions for binary compatibility +# and translate them on the way in and out of system calls, but +# there is almost always a #define that can get the real ones. +# See types_darwin.c and types_linux.c for examples. +# +# * zerror_${GOOS}_${GOARCH}.go +# +# This machine-generated file defines the system's error numbers, +# error strings, and signal numbers. The generator is "mkerrors.sh". +# Usually no arguments are needed, but mkerrors.sh will pass its +# arguments on to godefs. +# +# * zsyscall_${GOOS}_${GOARCH}.go +# +# Generated by mksyscall.pl; see syscall_${GOOS}.go above. +# +# * zsysnum_${GOOS}_${GOARCH}.go +# +# Generated by mksysnum_${GOOS}. +# +# * ztypes_${GOOS}_${GOARCH}.go +# +# Generated by godefs; see types_${GOOS}.c above. + +GOOSARCH="${GOOS}_${GOARCH}" + +# defaults +mksyscall="./mksyscall.pl" +mkerrors="./mkerrors.sh" +zerrors="zerrors_$GOOSARCH.go" +mksysctl="" +zsysctl="zsysctl_$GOOSARCH.go" +mksysnum= +mktypes= +run="sh" + +case "$1" in +-syscalls) + for i in zsyscall*go + do + sed 1q $i | sed 's;^// ;;' | sh > _$i && gofmt < _$i > $i + rm _$i + done + exit 0 + ;; +-n) + run="cat" + shift +esac + +case "$#" in +0) + ;; +*) + echo 'usage: mkall.sh [-n]' 1>&2 + exit 2 +esac + +case "$GOOSARCH" in +_* | *_ | _) + echo 'undefined $GOOS_$GOARCH:' "$GOOSARCH" 1>&2 + exit 1 + ;; +plan9_386) + mkerrors= + mksyscall="./mksyscall.pl -l32 -plan9" + mksysnum="./mksysnum_plan9.sh /n/sources/plan9/sys/src/libc/9syscall/sys.h" + mktypes="XXX" + ;; +*) + echo 'unrecognized $GOOS_$GOARCH: ' "$GOOSARCH" 1>&2 + exit 1 + ;; +esac + +( + if [ -n "$mkerrors" ]; then echo "$mkerrors |gofmt >$zerrors"; fi + case "$GOOS" in + plan9) + syscall_goos="syscall_$GOOS.go" + if [ -n "$mksyscall" ]; then echo "$mksyscall $syscall_goos syscall_$GOOSARCH.go |gofmt >zsyscall_$GOOSARCH.go"; fi + ;; + esac + if [ -n "$mksysctl" ]; then echo "$mksysctl |gofmt >$zsysctl"; fi + if [ -n "$mksysnum" ]; then echo "$mksysnum |gofmt >zsysnum_$GOOSARCH.go"; fi + if [ -n "$mktypes" ]; then echo "$mktypes types_$GOOS.go |gofmt >ztypes_$GOOSARCH.go"; fi +) | $run diff --git a/api/vendor/golang.org/x/sys/plan9/mkerrors.sh b/api/vendor/golang.org/x/sys/plan9/mkerrors.sh new file mode 100755 index 0000000..052c86d --- /dev/null +++ b/api/vendor/golang.org/x/sys/plan9/mkerrors.sh @@ -0,0 +1,246 @@ +#!/usr/bin/env bash +# 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. + +# Generate Go code listing errors and other #defined constant +# values (ENAMETOOLONG etc.), by asking the preprocessor +# about the definitions. + +unset LANG +export LC_ALL=C +export LC_CTYPE=C + +CC=${CC:-gcc} + +uname=$(uname) + +includes=' +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +' + +ccflags="$@" + +# Write go tool cgo -godefs input. +( + echo package plan9 + echo + echo '/*' + indirect="includes_$(uname)" + echo "${!indirect} $includes" + echo '*/' + echo 'import "C"' + echo + echo 'const (' + + # The gcc command line prints all the #defines + # it encounters while processing the input + echo "${!indirect} $includes" | $CC -x c - -E -dM $ccflags | + awk ' + $1 != "#define" || $2 ~ /\(/ || $3 == "" {next} + + $2 ~ /^E([ABCD]X|[BIS]P|[SD]I|S|FL)$/ {next} # 386 registers + $2 ~ /^(SIGEV_|SIGSTKSZ|SIGRT(MIN|MAX))/ {next} + $2 ~ /^(SCM_SRCRT)$/ {next} + $2 ~ /^(MAP_FAILED)$/ {next} + + $2 !~ /^ETH_/ && + $2 !~ /^EPROC_/ && + $2 !~ /^EQUIV_/ && + $2 !~ /^EXPR_/ && + $2 ~ /^E[A-Z0-9_]+$/ || + $2 ~ /^B[0-9_]+$/ || + $2 ~ /^V[A-Z0-9]+$/ || + $2 ~ /^CS[A-Z0-9]/ || + $2 ~ /^I(SIG|CANON|CRNL|EXTEN|MAXBEL|STRIP|UTF8)$/ || + $2 ~ /^IGN/ || + $2 ~ /^IX(ON|ANY|OFF)$/ || + $2 ~ /^IN(LCR|PCK)$/ || + $2 ~ /(^FLU?SH)|(FLU?SH$)/ || + $2 ~ /^C(LOCAL|READ)$/ || + $2 == "BRKINT" || + $2 == "HUPCL" || + $2 == "PENDIN" || + $2 == "TOSTOP" || + $2 ~ /^PAR/ || + $2 ~ /^SIG[^_]/ || + $2 ~ /^O[CNPFP][A-Z]+[^_][A-Z]+$/ || + $2 ~ /^IN_/ || + $2 ~ /^LOCK_(SH|EX|NB|UN)$/ || + $2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|ICMP6|TCP|EVFILT|NOTE|EV|SHUT|PROT|MAP|PACKET|MSG|SCM|MCL|DT|MADV|PR)_/ || + $2 == "ICMPV6_FILTER" || + $2 == "SOMAXCONN" || + $2 == "NAME_MAX" || + $2 == "IFNAMSIZ" || + $2 ~ /^CTL_(MAXNAME|NET|QUERY)$/ || + $2 ~ /^SYSCTL_VERS/ || + $2 ~ /^(MS|MNT)_/ || + $2 ~ /^TUN(SET|GET|ATTACH|DETACH)/ || + $2 ~ /^(O|F|FD|NAME|S|PTRACE|PT)_/ || + $2 ~ /^LINUX_REBOOT_CMD_/ || + $2 ~ /^LINUX_REBOOT_MAGIC[12]$/ || + $2 !~ "NLA_TYPE_MASK" && + $2 ~ /^(NETLINK|NLM|NLMSG|NLA|IFA|IFAN|RT|RTCF|RTN|RTPROT|RTNH|ARPHRD|ETH_P)_/ || + $2 ~ /^SIOC/ || + $2 ~ /^TIOC/ || + $2 !~ "RTF_BITS" && + $2 ~ /^(IFF|IFT|NET_RT|RTM|RTF|RTV|RTA|RTAX)_/ || + $2 ~ /^BIOC/ || + $2 ~ /^RUSAGE_(SELF|CHILDREN|THREAD)/ || + $2 ~ /^RLIMIT_(AS|CORE|CPU|DATA|FSIZE|NOFILE|STACK)|RLIM_INFINITY/ || + $2 ~ /^PRIO_(PROCESS|PGRP|USER)/ || + $2 ~ /^CLONE_[A-Z_]+/ || + $2 !~ /^(BPF_TIMEVAL)$/ && + $2 ~ /^(BPF|DLT)_/ || + $2 !~ "WMESGLEN" && + $2 ~ /^W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", $2, $2)} + $2 ~ /^__WCOREFLAG$/ {next} + $2 ~ /^__W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", substr($2,3), $2)} + + {next} + ' | sort + + echo ')' +) >_const.go + +# Pull out the error names for later. +errors=$( + echo '#include ' | $CC -x c - -E -dM $ccflags | + awk '$1=="#define" && $2 ~ /^E[A-Z0-9_]+$/ { print $2 }' | + sort +) + +# Pull out the signal names for later. +signals=$( + echo '#include ' | $CC -x c - -E -dM $ccflags | + awk '$1=="#define" && $2 ~ /^SIG[A-Z0-9]+$/ { print $2 }' | + egrep -v '(SIGSTKSIZE|SIGSTKSZ|SIGRT)' | + sort +) + +# Again, writing regexps to a file. +echo '#include ' | $CC -x c - -E -dM $ccflags | + awk '$1=="#define" && $2 ~ /^E[A-Z0-9_]+$/ { print "^\t" $2 "[ \t]*=" }' | + sort >_error.grep +echo '#include ' | $CC -x c - -E -dM $ccflags | + awk '$1=="#define" && $2 ~ /^SIG[A-Z0-9]+$/ { print "^\t" $2 "[ \t]*=" }' | + egrep -v '(SIGSTKSIZE|SIGSTKSZ|SIGRT)' | + sort >_signal.grep + +echo '// mkerrors.sh' "$@" +echo '// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT' +echo +go tool cgo -godefs -- "$@" _const.go >_error.out +cat _error.out | grep -vf _error.grep | grep -vf _signal.grep +echo +echo '// Errors' +echo 'const (' +cat _error.out | grep -f _error.grep | sed 's/=\(.*\)/= Errno(\1)/' +echo ')' + +echo +echo '// Signals' +echo 'const (' +cat _error.out | grep -f _signal.grep | sed 's/=\(.*\)/= Signal(\1)/' +echo ')' + +# Run C program to print error and syscall strings. +( + echo -E " +#include +#include +#include +#include +#include +#include + +#define nelem(x) (sizeof(x)/sizeof((x)[0])) + +enum { A = 'A', Z = 'Z', a = 'a', z = 'z' }; // avoid need for single quotes below + +int errors[] = { +" + for i in $errors + do + echo -E ' '$i, + done + + echo -E " +}; + +int signals[] = { +" + for i in $signals + do + echo -E ' '$i, + done + + # Use -E because on some systems bash builtin interprets \n itself. + echo -E ' +}; + +static int +intcmp(const void *a, const void *b) +{ + return *(int*)a - *(int*)b; +} + +int +main(void) +{ + int i, j, e; + char buf[1024], *p; + + printf("\n\n// Error table\n"); + printf("var errors = [...]string {\n"); + qsort(errors, nelem(errors), sizeof errors[0], intcmp); + for(i=0; i 0 && errors[i-1] == e) + continue; + strcpy(buf, strerror(e)); + // lowercase first letter: Bad -> bad, but STREAM -> STREAM. + if(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z) + buf[0] += a - A; + printf("\t%d: \"%s\",\n", e, buf); + } + printf("}\n\n"); + + printf("\n\n// Signal table\n"); + printf("var signals = [...]string {\n"); + qsort(signals, nelem(signals), sizeof signals[0], intcmp); + for(i=0; i 0 && signals[i-1] == e) + continue; + strcpy(buf, strsignal(e)); + // lowercase first letter: Bad -> bad, but STREAM -> STREAM. + if(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z) + buf[0] += a - A; + // cut trailing : number. + p = strrchr(buf, ":"[0]); + if(p) + *p = '\0'; + printf("\t%d: \"%s\",\n", e, buf); + } + printf("}\n\n"); + + return 0; +} + +' +) >_errors.c + +$CC $ccflags -o _errors _errors.c && $GORUN ./_errors && rm -f _errors.c _errors _const.go _error.grep _signal.grep _error.out diff --git a/api/vendor/golang.org/x/sys/plan9/mksyscall.pl b/api/vendor/golang.org/x/sys/plan9/mksyscall.pl new file mode 100755 index 0000000..ce8e1e4 --- /dev/null +++ b/api/vendor/golang.org/x/sys/plan9/mksyscall.pl @@ -0,0 +1,319 @@ +#!/usr/bin/env perl +# 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. + +# This program reads a file containing function prototypes +# (like syscall_plan9.go) and generates system call bodies. +# The prototypes are marked by lines beginning with "//sys" +# and read like func declarations if //sys is replaced by func, but: +# * The parameter lists must give a name for each argument. +# This includes return parameters. +# * The parameter lists must give a type for each argument: +# the (x, y, z int) shorthand is not allowed. +# * If the return parameter is an error number, it must be named errno. + +# A line beginning with //sysnb is like //sys, except that the +# goroutine will not be suspended during the execution of the system +# call. This must only be used for system calls which can never +# block, as otherwise the system call could cause all goroutines to +# hang. + +use strict; + +my $cmdline = "mksyscall.pl " . join(' ', @ARGV); +my $errors = 0; +my $_32bit = ""; +my $plan9 = 0; +my $openbsd = 0; +my $netbsd = 0; +my $dragonfly = 0; +my $nacl = 0; +my $arm = 0; # 64-bit value should use (even, odd)-pair + +if($ARGV[0] eq "-b32") { + $_32bit = "big-endian"; + shift; +} elsif($ARGV[0] eq "-l32") { + $_32bit = "little-endian"; + shift; +} +if($ARGV[0] eq "-plan9") { + $plan9 = 1; + shift; +} +if($ARGV[0] eq "-openbsd") { + $openbsd = 1; + shift; +} +if($ARGV[0] eq "-netbsd") { + $netbsd = 1; + shift; +} +if($ARGV[0] eq "-dragonfly") { + $dragonfly = 1; + shift; +} +if($ARGV[0] eq "-nacl") { + $nacl = 1; + shift; +} +if($ARGV[0] eq "-arm") { + $arm = 1; + shift; +} + +if($ARGV[0] =~ /^-/) { + print STDERR "usage: mksyscall.pl [-b32 | -l32] [file ...]\n"; + exit 1; +} + +sub parseparamlist($) { + my ($list) = @_; + $list =~ s/^\s*//; + $list =~ s/\s*$//; + if($list eq "") { + return (); + } + return split(/\s*,\s*/, $list); +} + +sub parseparam($) { + my ($p) = @_; + if($p !~ /^(\S*) (\S*)$/) { + print STDERR "$ARGV:$.: malformed parameter: $p\n"; + $errors = 1; + return ("xx", "int"); + } + return ($1, $2); +} + +my $text = ""; +while(<>) { + chomp; + s/\s+/ /g; + s/^\s+//; + s/\s+$//; + my $nonblock = /^\/\/sysnb /; + next if !/^\/\/sys / && !$nonblock; + + # Line must be of the form + # func Open(path string, mode int, perm int) (fd int, errno error) + # Split into name, in params, out params. + if(!/^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*((?i)SYS_[A-Z0-9_]+))?$/) { + print STDERR "$ARGV:$.: malformed //sys declaration\n"; + $errors = 1; + next; + } + my ($func, $in, $out, $sysname) = ($2, $3, $4, $5); + + # Split argument lists on comma. + my @in = parseparamlist($in); + my @out = parseparamlist($out); + + # Try in vain to keep people from editing this file. + # The theory is that they jump into the middle of the file + # without reading the header. + $text .= "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n"; + + # Go function header. + my $out_decl = @out ? sprintf(" (%s)", join(', ', @out)) : ""; + $text .= sprintf "func %s(%s)%s {\n", $func, join(', ', @in), $out_decl; + + # Check if err return available + my $errvar = ""; + foreach my $p (@out) { + my ($name, $type) = parseparam($p); + if($type eq "error") { + $errvar = $name; + last; + } + } + + # Prepare arguments to Syscall. + my @args = (); + my @uses = (); + my $n = 0; + foreach my $p (@in) { + my ($name, $type) = parseparam($p); + if($type =~ /^\*/) { + push @args, "uintptr(unsafe.Pointer($name))"; + } elsif($type eq "string" && $errvar ne "") { + $text .= "\tvar _p$n *byte\n"; + $text .= "\t_p$n, $errvar = BytePtrFromString($name)\n"; + $text .= "\tif $errvar != nil {\n\t\treturn\n\t}\n"; + push @args, "uintptr(unsafe.Pointer(_p$n))"; + push @uses, "use(unsafe.Pointer(_p$n))"; + $n++; + } elsif($type eq "string") { + print STDERR "$ARGV:$.: $func uses string arguments, but has no error return\n"; + $text .= "\tvar _p$n *byte\n"; + $text .= "\t_p$n, _ = BytePtrFromString($name)\n"; + push @args, "uintptr(unsafe.Pointer(_p$n))"; + push @uses, "use(unsafe.Pointer(_p$n))"; + $n++; + } elsif($type =~ /^\[\](.*)/) { + # Convert slice into pointer, length. + # Have to be careful not to take address of &a[0] if len == 0: + # pass dummy pointer in that case. + # Used to pass nil, but some OSes or simulators reject write(fd, nil, 0). + $text .= "\tvar _p$n unsafe.Pointer\n"; + $text .= "\tif len($name) > 0 {\n\t\t_p$n = unsafe.Pointer(\&${name}[0])\n\t}"; + $text .= " else {\n\t\t_p$n = unsafe.Pointer(&_zero)\n\t}"; + $text .= "\n"; + push @args, "uintptr(_p$n)", "uintptr(len($name))"; + $n++; + } elsif($type eq "int64" && ($openbsd || $netbsd)) { + push @args, "0"; + if($_32bit eq "big-endian") { + push @args, "uintptr($name>>32)", "uintptr($name)"; + } elsif($_32bit eq "little-endian") { + push @args, "uintptr($name)", "uintptr($name>>32)"; + } else { + push @args, "uintptr($name)"; + } + } elsif($type eq "int64" && $dragonfly) { + if ($func !~ /^extp(read|write)/i) { + push @args, "0"; + } + if($_32bit eq "big-endian") { + push @args, "uintptr($name>>32)", "uintptr($name)"; + } elsif($_32bit eq "little-endian") { + push @args, "uintptr($name)", "uintptr($name>>32)"; + } else { + push @args, "uintptr($name)"; + } + } elsif($type eq "int64" && $_32bit ne "") { + if(@args % 2 && $arm) { + # arm abi specifies 64-bit argument uses + # (even, odd) pair + push @args, "0" + } + if($_32bit eq "big-endian") { + push @args, "uintptr($name>>32)", "uintptr($name)"; + } else { + push @args, "uintptr($name)", "uintptr($name>>32)"; + } + } else { + push @args, "uintptr($name)"; + } + } + + # Determine which form to use; pad args with zeros. + my $asm = "Syscall"; + if ($nonblock) { + $asm = "RawSyscall"; + } + if(@args <= 3) { + while(@args < 3) { + push @args, "0"; + } + } elsif(@args <= 6) { + $asm .= "6"; + while(@args < 6) { + push @args, "0"; + } + } elsif(@args <= 9) { + $asm .= "9"; + while(@args < 9) { + push @args, "0"; + } + } else { + print STDERR "$ARGV:$.: too many arguments to system call\n"; + } + + # System call number. + if($sysname eq "") { + $sysname = "SYS_$func"; + $sysname =~ s/([a-z])([A-Z])/${1}_$2/g; # turn FooBar into Foo_Bar + $sysname =~ y/a-z/A-Z/; + if($nacl) { + $sysname =~ y/A-Z/a-z/; + } + } + + # Actual call. + my $args = join(', ', @args); + my $call = "$asm($sysname, $args)"; + + # Assign return values. + my $body = ""; + my @ret = ("_", "_", "_"); + my $do_errno = 0; + for(my $i=0; $i<@out; $i++) { + my $p = $out[$i]; + my ($name, $type) = parseparam($p); + my $reg = ""; + if($name eq "err" && !$plan9) { + $reg = "e1"; + $ret[2] = $reg; + $do_errno = 1; + } elsif($name eq "err" && $plan9) { + $ret[0] = "r0"; + $ret[2] = "e1"; + next; + } else { + $reg = sprintf("r%d", $i); + $ret[$i] = $reg; + } + if($type eq "bool") { + $reg = "$reg != 0"; + } + if($type eq "int64" && $_32bit ne "") { + # 64-bit number in r1:r0 or r0:r1. + if($i+2 > @out) { + print STDERR "$ARGV:$.: not enough registers for int64 return\n"; + } + if($_32bit eq "big-endian") { + $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i, $i+1); + } else { + $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i+1, $i); + } + $ret[$i] = sprintf("r%d", $i); + $ret[$i+1] = sprintf("r%d", $i+1); + } + if($reg ne "e1" || $plan9) { + $body .= "\t$name = $type($reg)\n"; + } + } + if ($ret[0] eq "_" && $ret[1] eq "_" && $ret[2] eq "_") { + $text .= "\t$call\n"; + } else { + $text .= "\t$ret[0], $ret[1], $ret[2] := $call\n"; + } + foreach my $use (@uses) { + $text .= "\t$use\n"; + } + $text .= $body; + + if ($plan9 && $ret[2] eq "e1") { + $text .= "\tif int32(r0) == -1 {\n"; + $text .= "\t\terr = e1\n"; + $text .= "\t}\n"; + } elsif ($do_errno) { + $text .= "\tif e1 != 0 {\n"; + $text .= "\t\terr = e1\n"; + $text .= "\t}\n"; + } + $text .= "\treturn\n"; + $text .= "}\n\n"; +} + +chomp $text; +chomp $text; + +if($errors) { + exit 1; +} + +print <= 10 { + buf[i] = byte(val%10 + '0') + i-- + val /= 10 + } + buf[i] = byte(val + '0') + return string(buf[i:]) +} diff --git a/api/vendor/golang.org/x/sys/plan9/syscall.go b/api/vendor/golang.org/x/sys/plan9/syscall.go new file mode 100644 index 0000000..163254c --- /dev/null +++ b/api/vendor/golang.org/x/sys/plan9/syscall.go @@ -0,0 +1,77 @@ +// 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. + +// +build plan9 + +// Package plan9 contains an interface to the low-level operating system +// primitives. OS details vary depending on the underlying system, and +// by default, godoc will display the OS-specific documentation for the current +// system. If you want godoc to display documentation for another +// system, set $GOOS and $GOARCH to the desired system. For example, if +// you want to view documentation for freebsd/arm on linux/amd64, set $GOOS +// to freebsd and $GOARCH to arm. +// +// The primary use of this package is inside other packages that provide a more +// portable interface to the system, such as "os", "time" and "net". Use +// those packages rather than this one if you can. +// +// For details of the functions and data types in this package consult +// the manuals for the appropriate operating system. +// +// These calls return err == nil to indicate success; otherwise +// err represents an operating system error describing the failure and +// holds a value of type syscall.ErrorString. +package plan9 // import "golang.org/x/sys/plan9" + +import "unsafe" + +// ByteSliceFromString returns a NUL-terminated slice of bytes +// containing the text of s. If s contains a NUL byte at any +// location, it returns (nil, EINVAL). +func ByteSliceFromString(s string) ([]byte, error) { + for i := 0; i < len(s); i++ { + if s[i] == 0 { + return nil, EINVAL + } + } + a := make([]byte, len(s)+1) + copy(a, s) + return a, nil +} + +// BytePtrFromString returns a pointer to a NUL-terminated array of +// bytes containing the text of s. If s contains a NUL byte at any +// location, it returns (nil, EINVAL). +func BytePtrFromString(s string) (*byte, error) { + a, err := ByteSliceFromString(s) + if err != nil { + return nil, err + } + return &a[0], nil +} + +// Single-word zero for use when we need a valid pointer to 0 bytes. +// See mksyscall.pl. +var _zero uintptr + +func (ts *Timespec) Unix() (sec int64, nsec int64) { + return int64(ts.Sec), int64(ts.Nsec) +} + +func (tv *Timeval) Unix() (sec int64, nsec int64) { + return int64(tv.Sec), int64(tv.Usec) * 1000 +} + +func (ts *Timespec) Nano() int64 { + return int64(ts.Sec)*1e9 + int64(ts.Nsec) +} + +func (tv *Timeval) Nano() int64 { + return int64(tv.Sec)*1e9 + int64(tv.Usec)*1000 +} + +// use is a no-op, but the compiler cannot see that it is. +// Calling use(p) ensures that p is kept live until that point. +//go:noescape +func use(p unsafe.Pointer) diff --git a/api/vendor/golang.org/x/sys/plan9/syscall_plan9.go b/api/vendor/golang.org/x/sys/plan9/syscall_plan9.go new file mode 100644 index 0000000..84e1471 --- /dev/null +++ b/api/vendor/golang.org/x/sys/plan9/syscall_plan9.go @@ -0,0 +1,349 @@ +// 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. + +// Plan 9 system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and +// wrap it in our own nicer implementation. + +package plan9 + +import ( + "bytes" + "syscall" + "unsafe" +) + +// A Note is a string describing a process note. +// It implements the os.Signal interface. +type Note string + +func (n Note) Signal() {} + +func (n Note) String() string { + return string(n) +} + +var ( + Stdin = 0 + Stdout = 1 + Stderr = 2 +) + +// For testing: clients can set this flag to force +// creation of IPv6 sockets to return EAFNOSUPPORT. +var SocketDisableIPv6 bool + +func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.ErrorString) +func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.ErrorString) +func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr) +func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) + +func atoi(b []byte) (n uint) { + n = 0 + for i := 0; i < len(b); i++ { + n = n*10 + uint(b[i]-'0') + } + return +} + +func cstring(s []byte) string { + i := bytes.IndexByte(s, 0) + if i == -1 { + i = len(s) + } + return string(s[:i]) +} + +func errstr() string { + var buf [ERRMAX]byte + + RawSyscall(SYS_ERRSTR, uintptr(unsafe.Pointer(&buf[0])), uintptr(len(buf)), 0) + + buf[len(buf)-1] = 0 + return cstring(buf[:]) +} + +// Implemented in assembly to import from runtime. +func exit(code int) + +func Exit(code int) { exit(code) } + +func readnum(path string) (uint, error) { + var b [12]byte + + fd, e := Open(path, O_RDONLY) + if e != nil { + return 0, e + } + defer Close(fd) + + n, e := Pread(fd, b[:], 0) + + if e != nil { + return 0, e + } + + m := 0 + for ; m < n && b[m] == ' '; m++ { + } + + return atoi(b[m : n-1]), nil +} + +func Getpid() (pid int) { + n, _ := readnum("#c/pid") + return int(n) +} + +func Getppid() (ppid int) { + n, _ := readnum("#c/ppid") + return int(n) +} + +func Read(fd int, p []byte) (n int, err error) { + return Pread(fd, p, -1) +} + +func Write(fd int, p []byte) (n int, err error) { + return Pwrite(fd, p, -1) +} + +var ioSync int64 + +//sys fd2path(fd int, buf []byte) (err error) +func Fd2path(fd int) (path string, err error) { + var buf [512]byte + + e := fd2path(fd, buf[:]) + if e != nil { + return "", e + } + return cstring(buf[:]), nil +} + +//sys pipe(p *[2]int32) (err error) +func Pipe(p []int) (err error) { + if len(p) != 2 { + return syscall.ErrorString("bad arg in system call") + } + var pp [2]int32 + err = pipe(&pp) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +// Underlying system call writes to newoffset via pointer. +// Implemented in assembly to avoid allocation. +func seek(placeholder uintptr, fd int, offset int64, whence int) (newoffset int64, err string) + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + newoffset, e := seek(0, fd, offset, whence) + + if newoffset == -1 { + err = syscall.ErrorString(e) + } + return +} + +func Mkdir(path string, mode uint32) (err error) { + fd, err := Create(path, O_RDONLY, DMDIR|mode) + + if fd != -1 { + Close(fd) + } + + return +} + +type Waitmsg struct { + Pid int + Time [3]uint32 + Msg string +} + +func (w Waitmsg) Exited() bool { return true } +func (w Waitmsg) Signaled() bool { return false } + +func (w Waitmsg) ExitStatus() int { + if len(w.Msg) == 0 { + // a normal exit returns no message + return 0 + } + return 1 +} + +//sys await(s []byte) (n int, err error) +func Await(w *Waitmsg) (err error) { + var buf [512]byte + var f [5][]byte + + n, err := await(buf[:]) + + if err != nil || w == nil { + return + } + + nf := 0 + p := 0 + for i := 0; i < n && nf < len(f)-1; i++ { + if buf[i] == ' ' { + f[nf] = buf[p:i] + p = i + 1 + nf++ + } + } + f[nf] = buf[p:] + nf++ + + if nf != len(f) { + return syscall.ErrorString("invalid wait message") + } + w.Pid = int(atoi(f[0])) + w.Time[0] = uint32(atoi(f[1])) + w.Time[1] = uint32(atoi(f[2])) + w.Time[2] = uint32(atoi(f[3])) + w.Msg = cstring(f[4]) + if w.Msg == "''" { + // await() returns '' for no error + w.Msg = "" + } + return +} + +func Unmount(name, old string) (err error) { + fixwd() + oldp, err := BytePtrFromString(old) + if err != nil { + return err + } + oldptr := uintptr(unsafe.Pointer(oldp)) + + var r0 uintptr + var e syscall.ErrorString + + // bind(2) man page: If name is zero, everything bound or mounted upon old is unbound or unmounted. + if name == "" { + r0, _, e = Syscall(SYS_UNMOUNT, _zero, oldptr, 0) + } else { + namep, err := BytePtrFromString(name) + if err != nil { + return err + } + r0, _, e = Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(namep)), oldptr, 0) + } + + if int32(r0) == -1 { + err = e + } + return +} + +func Fchdir(fd int) (err error) { + path, err := Fd2path(fd) + + if err != nil { + return + } + + return Chdir(path) +} + +type Timespec struct { + Sec int32 + Nsec int32 +} + +type Timeval struct { + Sec int32 + Usec int32 +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Usec = int32(nsec % 1e9 / 1e3) + tv.Sec = int32(nsec / 1e9) + return +} + +func nsec() int64 { + var scratch int64 + + r0, _, _ := Syscall(SYS_NSEC, uintptr(unsafe.Pointer(&scratch)), 0, 0) + // TODO(aram): remove hack after I fix _nsec in the pc64 kernel. + if r0 == 0 { + return scratch + } + return int64(r0) +} + +func Gettimeofday(tv *Timeval) error { + nsec := nsec() + *tv = NsecToTimeval(nsec) + return nil +} + +func Getpagesize() int { return 0x1000 } + +func Getegid() (egid int) { return -1 } +func Geteuid() (euid int) { return -1 } +func Getgid() (gid int) { return -1 } +func Getuid() (uid int) { return -1 } + +func Getgroups() (gids []int, err error) { + return make([]int, 0), nil +} + +//sys open(path string, mode int) (fd int, err error) +func Open(path string, mode int) (fd int, err error) { + fixwd() + return open(path, mode) +} + +//sys create(path string, mode int, perm uint32) (fd int, err error) +func Create(path string, mode int, perm uint32) (fd int, err error) { + fixwd() + return create(path, mode, perm) +} + +//sys remove(path string) (err error) +func Remove(path string) error { + fixwd() + return remove(path) +} + +//sys stat(path string, edir []byte) (n int, err error) +func Stat(path string, edir []byte) (n int, err error) { + fixwd() + return stat(path, edir) +} + +//sys bind(name string, old string, flag int) (err error) +func Bind(name string, old string, flag int) (err error) { + fixwd() + return bind(name, old, flag) +} + +//sys mount(fd int, afd int, old string, flag int, aname string) (err error) +func Mount(fd int, afd int, old string, flag int, aname string) (err error) { + fixwd() + return mount(fd, afd, old, flag, aname) +} + +//sys wstat(path string, edir []byte) (err error) +func Wstat(path string, edir []byte) (err error) { + fixwd() + return wstat(path, edir) +} + +//sys chdir(path string) (err error) +//sys Dup(oldfd int, newfd int) (fd int, err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys Close(fd int) (err error) +//sys Fstat(fd int, edir []byte) (n int, err error) +//sys Fwstat(fd int, edir []byte) (err error) diff --git a/api/vendor/golang.org/x/sys/plan9/syscall_test.go b/api/vendor/golang.org/x/sys/plan9/syscall_test.go new file mode 100644 index 0000000..8f829ba --- /dev/null +++ b/api/vendor/golang.org/x/sys/plan9/syscall_test.go @@ -0,0 +1,33 @@ +// 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. + +// +build plan9 + +package plan9_test + +import ( + "testing" + + "golang.org/x/sys/plan9" +) + +func testSetGetenv(t *testing.T, key, value string) { + err := plan9.Setenv(key, value) + if err != nil { + t.Fatalf("Setenv failed to set %q: %v", value, err) + } + newvalue, found := plan9.Getenv(key) + if !found { + t.Fatalf("Getenv failed to find %v variable (want value %q)", key, value) + } + if newvalue != value { + t.Fatalf("Getenv(%v) = %q; want %q", key, newvalue, value) + } +} + +func TestEnv(t *testing.T) { + testSetGetenv(t, "TESTENV", "AVALUE") + // make sure TESTENV gets set to "", not deleted + testSetGetenv(t, "TESTENV", "") +} diff --git a/api/vendor/golang.org/x/sys/plan9/zsyscall_plan9_386.go b/api/vendor/golang.org/x/sys/plan9/zsyscall_plan9_386.go new file mode 100644 index 0000000..b35598a --- /dev/null +++ b/api/vendor/golang.org/x/sys/plan9/zsyscall_plan9_386.go @@ -0,0 +1,292 @@ +// mksyscall.pl -l32 -plan9 syscall_plan9.go +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +package plan9 + +import "unsafe" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fd2path(fd int, buf []byte) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FD2PATH, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]int32) (err error) { + r0, _, e1 := Syscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func await(s []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(s) > 0 { + _p0 = unsafe.Pointer(&s[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_AWAIT, uintptr(_p0), uintptr(len(s)), 0) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func open(path string, mode int) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + fd = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func create(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_CREATE, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + use(unsafe.Pointer(_p0)) + fd = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func remove(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_REMOVE, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func stat(path string, edir []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(edir) > 0 { + _p1 = unsafe.Pointer(&edir[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(edir))) + use(unsafe.Pointer(_p0)) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(name string, old string, flag int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(old) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_BIND, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(flag)) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(fd int, afd int, old string, flag int, aname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(old) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(aname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_MOUNT, uintptr(fd), uintptr(afd), uintptr(unsafe.Pointer(_p0)), uintptr(flag), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wstat(path string, edir []byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(edir) > 0 { + _p1 = unsafe.Pointer(&edir[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(edir))) + use(unsafe.Pointer(_p0)) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int, newfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), uintptr(newfd), 0) + fd = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + r0, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, edir []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(edir) > 0 { + _p0 = unsafe.Pointer(&edir[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(_p0), uintptr(len(edir))) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fwstat(fd int, edir []byte) (err error) { + var _p0 unsafe.Pointer + if len(edir) > 0 { + _p0 = unsafe.Pointer(&edir[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FWSTAT, uintptr(fd), uintptr(_p0), uintptr(len(edir))) + if int32(r0) == -1 { + err = e1 + } + return +} diff --git a/api/vendor/golang.org/x/sys/plan9/zsyscall_plan9_amd64.go b/api/vendor/golang.org/x/sys/plan9/zsyscall_plan9_amd64.go new file mode 100644 index 0000000..b35598a --- /dev/null +++ b/api/vendor/golang.org/x/sys/plan9/zsyscall_plan9_amd64.go @@ -0,0 +1,292 @@ +// mksyscall.pl -l32 -plan9 syscall_plan9.go +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +package plan9 + +import "unsafe" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fd2path(fd int, buf []byte) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FD2PATH, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]int32) (err error) { + r0, _, e1 := Syscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func await(s []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(s) > 0 { + _p0 = unsafe.Pointer(&s[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_AWAIT, uintptr(_p0), uintptr(len(s)), 0) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func open(path string, mode int) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + fd = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func create(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_CREATE, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + use(unsafe.Pointer(_p0)) + fd = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func remove(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_REMOVE, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func stat(path string, edir []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(edir) > 0 { + _p1 = unsafe.Pointer(&edir[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(edir))) + use(unsafe.Pointer(_p0)) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(name string, old string, flag int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(old) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_BIND, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(flag)) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(fd int, afd int, old string, flag int, aname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(old) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(aname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_MOUNT, uintptr(fd), uintptr(afd), uintptr(unsafe.Pointer(_p0)), uintptr(flag), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wstat(path string, edir []byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(edir) > 0 { + _p1 = unsafe.Pointer(&edir[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(edir))) + use(unsafe.Pointer(_p0)) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int, newfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), uintptr(newfd), 0) + fd = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + r0, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, edir []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(edir) > 0 { + _p0 = unsafe.Pointer(&edir[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(_p0), uintptr(len(edir))) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fwstat(fd int, edir []byte) (err error) { + var _p0 unsafe.Pointer + if len(edir) > 0 { + _p0 = unsafe.Pointer(&edir[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FWSTAT, uintptr(fd), uintptr(_p0), uintptr(len(edir))) + if int32(r0) == -1 { + err = e1 + } + return +} diff --git a/api/vendor/golang.org/x/sys/plan9/zsyscall_plan9_arm.go b/api/vendor/golang.org/x/sys/plan9/zsyscall_plan9_arm.go new file mode 100644 index 0000000..8dd8723 --- /dev/null +++ b/api/vendor/golang.org/x/sys/plan9/zsyscall_plan9_arm.go @@ -0,0 +1,284 @@ +// mksyscall.pl -l32 -plan9 -tags plan9,arm syscall_plan9.go +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build plan9,arm + +package plan9 + +import "unsafe" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fd2path(fd int, buf []byte) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FD2PATH, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]int32) (err error) { + r0, _, e1 := Syscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func await(s []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(s) > 0 { + _p0 = unsafe.Pointer(&s[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_AWAIT, uintptr(_p0), uintptr(len(s)), 0) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func open(path string, mode int) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + fd = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func create(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_CREATE, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func remove(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_REMOVE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func stat(path string, edir []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(edir) > 0 { + _p1 = unsafe.Pointer(&edir[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(edir))) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(name string, old string, flag int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(old) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_BIND, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(flag)) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(fd int, afd int, old string, flag int, aname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(old) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(aname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_MOUNT, uintptr(fd), uintptr(afd), uintptr(unsafe.Pointer(_p0)), uintptr(flag), uintptr(unsafe.Pointer(_p1)), 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wstat(path string, edir []byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(edir) > 0 { + _p1 = unsafe.Pointer(&edir[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(edir))) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int, newfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), uintptr(newfd), 0) + fd = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + r0, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, edir []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(edir) > 0 { + _p0 = unsafe.Pointer(&edir[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(_p0), uintptr(len(edir))) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fwstat(fd int, edir []byte) (err error) { + var _p0 unsafe.Pointer + if len(edir) > 0 { + _p0 = unsafe.Pointer(&edir[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FWSTAT, uintptr(fd), uintptr(_p0), uintptr(len(edir))) + if int32(r0) == -1 { + err = e1 + } + return +} diff --git a/api/vendor/golang.org/x/sys/plan9/zsysnum_plan9.go b/api/vendor/golang.org/x/sys/plan9/zsysnum_plan9.go new file mode 100644 index 0000000..22e8abd --- /dev/null +++ b/api/vendor/golang.org/x/sys/plan9/zsysnum_plan9.go @@ -0,0 +1,49 @@ +// mksysnum_plan9.sh /opt/plan9/sys/src/libc/9syscall/sys.h +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +package plan9 + +const ( + SYS_SYSR1 = 0 + SYS_BIND = 2 + SYS_CHDIR = 3 + SYS_CLOSE = 4 + SYS_DUP = 5 + SYS_ALARM = 6 + SYS_EXEC = 7 + SYS_EXITS = 8 + SYS_FAUTH = 10 + SYS_SEGBRK = 12 + SYS_OPEN = 14 + SYS_OSEEK = 16 + SYS_SLEEP = 17 + SYS_RFORK = 19 + SYS_PIPE = 21 + SYS_CREATE = 22 + SYS_FD2PATH = 23 + SYS_BRK_ = 24 + SYS_REMOVE = 25 + SYS_NOTIFY = 28 + SYS_NOTED = 29 + SYS_SEGATTACH = 30 + SYS_SEGDETACH = 31 + SYS_SEGFREE = 32 + SYS_SEGFLUSH = 33 + SYS_RENDEZVOUS = 34 + SYS_UNMOUNT = 35 + SYS_SEMACQUIRE = 37 + SYS_SEMRELEASE = 38 + SYS_SEEK = 39 + SYS_FVERSION = 40 + SYS_ERRSTR = 41 + SYS_STAT = 42 + SYS_FSTAT = 43 + SYS_WSTAT = 44 + SYS_FWSTAT = 45 + SYS_MOUNT = 46 + SYS_AWAIT = 47 + SYS_PREAD = 50 + SYS_PWRITE = 51 + SYS_TSEMACQUIRE = 52 + SYS_NSEC = 53 +) diff --git a/api/vendor/golang.org/x/sys/unix/.gitignore b/api/vendor/golang.org/x/sys/unix/.gitignore new file mode 100644 index 0000000..e3e0fc6 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/.gitignore @@ -0,0 +1,2 @@ +_obj/ +unix.test diff --git a/api/vendor/golang.org/x/sys/unix/README.md b/api/vendor/golang.org/x/sys/unix/README.md new file mode 100644 index 0000000..bc6f603 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/README.md @@ -0,0 +1,173 @@ +# Building `sys/unix` + +The sys/unix package provides access to the raw system call interface of the +underlying operating system. See: https://godoc.org/golang.org/x/sys/unix + +Porting Go to a new architecture/OS combination or adding syscalls, types, or +constants to an existing architecture/OS pair requires some manual effort; +however, there are tools that automate much of the process. + +## Build Systems + +There are currently two ways we generate the necessary files. We are currently +migrating the build system to use containers so the builds are reproducible. +This is being done on an OS-by-OS basis. Please update this documentation as +components of the build system change. + +### Old Build System (currently for `GOOS != "Linux" || GOARCH == "sparc64"`) + +The old build system generates the Go files based on the C header files +present on your system. This means that files +for a given GOOS/GOARCH pair must be generated on a system with that OS and +architecture. This also means that the generated code can differ from system +to system, based on differences in the header files. + +To avoid this, if you are using the old build system, only generate the Go +files on an installation with unmodified header files. It is also important to +keep track of which version of the OS the files were generated from (ex. +Darwin 14 vs Darwin 15). This makes it easier to track the progress of changes +and have each OS upgrade correspond to a single change. + +To build the files for your current OS and architecture, make sure GOOS and +GOARCH are set correctly and run `mkall.sh`. This will generate the files for +your specific system. Running `mkall.sh -n` shows the commands that will be run. + +Requirements: bash, perl, go + +### New Build System (currently for `GOOS == "Linux" && GOARCH != "sparc64"`) + +The new build system uses a Docker container to generate the go files directly +from source checkouts of the kernel and various system libraries. This means +that on any platform that supports Docker, all the files using the new build +system can be generated at once, and generated files will not change based on +what the person running the scripts has installed on their computer. + +The OS specific files for the new build system are located in the `${GOOS}` +directory, and the build is coordinated by the `${GOOS}/mkall.go` program. When +the kernel or system library updates, modify the Dockerfile at +`${GOOS}/Dockerfile` to checkout the new release of the source. + +To build all the files under the new build system, you must be on an amd64/Linux +system and have your GOOS and GOARCH set accordingly. Running `mkall.sh` will +then generate all of the files for all of the GOOS/GOARCH pairs in the new build +system. Running `mkall.sh -n` shows the commands that will be run. + +Requirements: bash, perl, go, docker + +## Component files + +This section describes the various files used in the code generation process. +It also contains instructions on how to modify these files to add a new +architecture/OS or to add additional syscalls, types, or constants. Note that +if you are using the new build system, the scripts cannot be called normally. +They must be called from within the docker container. + +### asm files + +The hand-written assembly file at `asm_${GOOS}_${GOARCH}.s` implements system +call dispatch. There are three entry points: +``` + func Syscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr) + func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) + func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr) +``` +The first and second are the standard ones; they differ only in how many +arguments can be passed to the kernel. The third is for low-level use by the +ForkExec wrapper. Unlike the first two, it does not call into the scheduler to +let it know that a system call is running. + +When porting Go to an new architecture/OS, this file must be implemented for +each GOOS/GOARCH pair. + +### mksysnum + +Mksysnum is a script located at `${GOOS}/mksysnum.pl` (or `mksysnum_${GOOS}.pl` +for the old system). This script takes in a list of header files containing the +syscall number declarations and parses them to produce the corresponding list of +Go numeric constants. See `zsysnum_${GOOS}_${GOARCH}.go` for the generated +constants. + +Adding new syscall numbers is mostly done by running the build on a sufficiently +new installation of the target OS (or updating the source checkouts for the +new build system). However, depending on the OS, you make need to update the +parsing in mksysnum. + +### mksyscall.pl + +The `syscall.go`, `syscall_${GOOS}.go`, `syscall_${GOOS}_${GOARCH}.go` are +hand-written Go files which implement system calls (for unix, the specific OS, +or the specific OS/Architecture pair respectively) that need special handling +and list `//sys` comments giving prototypes for ones that can be generated. + +The mksyscall.pl script takes the `//sys` and `//sysnb` comments and converts +them into syscalls. This requires the name of the prototype in the comment to +match a syscall number in the `zsysnum_${GOOS}_${GOARCH}.go` file. The function +prototype can be exported (capitalized) or not. + +Adding a new syscall often just requires adding a new `//sys` function prototype +with the desired arguments and a capitalized name so it is exported. However, if +you want the interface to the syscall to be different, often one will make an +unexported `//sys` prototype, an then write a custom wrapper in +`syscall_${GOOS}.go`. + +### types files + +For each OS, there is a hand-written Go file at `${GOOS}/types.go` (or +`types_${GOOS}.go` on the old system). This file includes standard C headers and +creates Go type aliases to the corresponding C types. The file is then fed +through godef to get the Go compatible definitions. Finally, the generated code +is fed though mkpost.go to format the code correctly and remove any hidden or +private identifiers. This cleaned-up code is written to +`ztypes_${GOOS}_${GOARCH}.go`. + +The hardest part about preparing this file is figuring out which headers to +include and which symbols need to be `#define`d to get the actual data +structures that pass through to the kernel system calls. Some C libraries +preset alternate versions for binary compatibility and translate them on the +way in and out of system calls, but there is almost always a `#define` that can +get the real ones. +See `types_darwin.go` and `linux/types.go` for examples. + +To add a new type, add in the necessary include statement at the top of the +file (if it is not already there) and add in a type alias line. Note that if +your type is significantly different on different architectures, you may need +some `#if/#elif` macros in your include statements. + +### mkerrors.sh + +This script is used to generate the system's various constants. This doesn't +just include the error numbers and error strings, but also the signal numbers +an a wide variety of miscellaneous constants. The constants come from the list +of include files in the `includes_${uname}` variable. A regex then picks out +the desired `#define` statements, and generates the corresponding Go constants. +The error numbers and strings are generated from `#include `, and the +signal numbers and strings are generated from `#include `. All of +these constants are written to `zerrors_${GOOS}_${GOARCH}.go` via a C program, +`_errors.c`, which prints out all the constants. + +To add a constant, add the header that includes it to the appropriate variable. +Then, edit the regex (if necessary) to match the desired constant. Avoid making +the regex too broad to avoid matching unintended constants. + + +## Generated files + +### `zerror_${GOOS}_${GOARCH}.go` + +A file containing all of the system's generated error numbers, error strings, +signal numbers, and constants. Generated by `mkerrors.sh` (see above). + +### `zsyscall_${GOOS}_${GOARCH}.go` + +A file containing all the generated syscalls for a specific GOOS and GOARCH. +Generated by `mksyscall.pl` (see above). + +### `zsysnum_${GOOS}_${GOARCH}.go` + +A list of numeric constants for all the syscall number of the specific GOOS +and GOARCH. Generated by mksysnum (see above). + +### `ztypes_${GOOS}_${GOARCH}.go` + +A file containing Go types for passing into (or returning from) syscalls. +Generated by godefs and the types file (see above). diff --git a/api/vendor/golang.org/x/sys/unix/affinity_linux.go b/api/vendor/golang.org/x/sys/unix/affinity_linux.go new file mode 100644 index 0000000..72afe33 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/affinity_linux.go @@ -0,0 +1,124 @@ +// 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. + +// CPU affinity functions + +package unix + +import ( + "unsafe" +) + +const cpuSetSize = _CPU_SETSIZE / _NCPUBITS + +// CPUSet represents a CPU affinity mask. +type CPUSet [cpuSetSize]cpuMask + +func schedAffinity(trap uintptr, pid int, set *CPUSet) error { + _, _, e := RawSyscall(trap, uintptr(pid), uintptr(unsafe.Sizeof(*set)), uintptr(unsafe.Pointer(set))) + if e != 0 { + return errnoErr(e) + } + return nil +} + +// SchedGetaffinity gets the CPU affinity mask of the thread specified by pid. +// If pid is 0 the calling thread is used. +func SchedGetaffinity(pid int, set *CPUSet) error { + return schedAffinity(SYS_SCHED_GETAFFINITY, pid, set) +} + +// SchedSetaffinity sets the CPU affinity mask of the thread specified by pid. +// If pid is 0 the calling thread is used. +func SchedSetaffinity(pid int, set *CPUSet) error { + return schedAffinity(SYS_SCHED_SETAFFINITY, pid, set) +} + +// Zero clears the set s, so that it contains no CPUs. +func (s *CPUSet) Zero() { + for i := range s { + s[i] = 0 + } +} + +func cpuBitsIndex(cpu int) int { + return cpu / _NCPUBITS +} + +func cpuBitsMask(cpu int) cpuMask { + return cpuMask(1 << (uint(cpu) % _NCPUBITS)) +} + +// Set adds cpu to the set s. +func (s *CPUSet) Set(cpu int) { + i := cpuBitsIndex(cpu) + if i < len(s) { + s[i] |= cpuBitsMask(cpu) + } +} + +// Clear removes cpu from the set s. +func (s *CPUSet) Clear(cpu int) { + i := cpuBitsIndex(cpu) + if i < len(s) { + s[i] &^= cpuBitsMask(cpu) + } +} + +// IsSet reports whether cpu is in the set s. +func (s *CPUSet) IsSet(cpu int) bool { + i := cpuBitsIndex(cpu) + if i < len(s) { + return s[i]&cpuBitsMask(cpu) != 0 + } + return false +} + +// Count returns the number of CPUs in the set s. +func (s *CPUSet) Count() int { + c := 0 + for _, b := range s { + c += onesCount64(uint64(b)) + } + return c +} + +// onesCount64 is a copy of Go 1.9's math/bits.OnesCount64. +// Once this package can require Go 1.9, we can delete this +// and update the caller to use bits.OnesCount64. +func onesCount64(x uint64) int { + const m0 = 0x5555555555555555 // 01010101 ... + const m1 = 0x3333333333333333 // 00110011 ... + const m2 = 0x0f0f0f0f0f0f0f0f // 00001111 ... + const m3 = 0x00ff00ff00ff00ff // etc. + const m4 = 0x0000ffff0000ffff + + // Implementation: Parallel summing of adjacent bits. + // See "Hacker's Delight", Chap. 5: Counting Bits. + // The following pattern shows the general approach: + // + // x = x>>1&(m0&m) + x&(m0&m) + // x = x>>2&(m1&m) + x&(m1&m) + // x = x>>4&(m2&m) + x&(m2&m) + // x = x>>8&(m3&m) + x&(m3&m) + // x = x>>16&(m4&m) + x&(m4&m) + // x = x>>32&(m5&m) + x&(m5&m) + // return int(x) + // + // Masking (& operations) can be left away when there's no + // danger that a field's sum will carry over into the next + // field: Since the result cannot be > 64, 8 bits is enough + // and we can ignore the masks for the shifts by 8 and up. + // Per "Hacker's Delight", the first line can be simplified + // more, but it saves at best one instruction, so we leave + // it alone for clarity. + const m = 1<<64 - 1 + x = x>>1&(m0&m) + x&(m0&m) + x = x>>2&(m1&m) + x&(m1&m) + x = (x>>4 + x) & (m2 & m) + x += x >> 8 + x += x >> 16 + x += x >> 32 + return int(x) & (1<<7 - 1) +} diff --git a/api/vendor/golang.org/x/sys/unix/asm_darwin_386.s b/api/vendor/golang.org/x/sys/unix/asm_darwin_386.s new file mode 100644 index 0000000..8a72783 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/asm_darwin_386.s @@ -0,0 +1,29 @@ +// 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. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for 386, Darwin +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + JMP syscall·RawSyscall6(SB) diff --git a/api/vendor/golang.org/x/sys/unix/asm_darwin_amd64.s b/api/vendor/golang.org/x/sys/unix/asm_darwin_amd64.s new file mode 100644 index 0000000..6321421 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/asm_darwin_amd64.s @@ -0,0 +1,29 @@ +// 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. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for AMD64, Darwin +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-104 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + JMP syscall·RawSyscall6(SB) diff --git a/api/vendor/golang.org/x/sys/unix/asm_darwin_arm.s b/api/vendor/golang.org/x/sys/unix/asm_darwin_arm.s new file mode 100644 index 0000000..333242d --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/asm_darwin_arm.s @@ -0,0 +1,30 @@ +// Copyright 2015 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 !gccgo +// +build arm,darwin + +#include "textflag.h" + +// +// System call support for ARM, Darwin +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + B syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + B syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + B syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + B syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + B syscall·RawSyscall6(SB) diff --git a/api/vendor/golang.org/x/sys/unix/asm_darwin_arm64.s b/api/vendor/golang.org/x/sys/unix/asm_darwin_arm64.s new file mode 100644 index 0000000..97e0174 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/asm_darwin_arm64.s @@ -0,0 +1,30 @@ +// Copyright 2015 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 !gccgo +// +build arm64,darwin + +#include "textflag.h" + +// +// System call support for AMD64, Darwin +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + B syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + B syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-104 + B syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + B syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + B syscall·RawSyscall6(SB) diff --git a/api/vendor/golang.org/x/sys/unix/asm_dragonfly_amd64.s b/api/vendor/golang.org/x/sys/unix/asm_dragonfly_amd64.s new file mode 100644 index 0000000..603dd57 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/asm_dragonfly_amd64.s @@ -0,0 +1,29 @@ +// 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. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for AMD64, DragonFly +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-104 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + JMP syscall·RawSyscall6(SB) diff --git a/api/vendor/golang.org/x/sys/unix/asm_freebsd_386.s b/api/vendor/golang.org/x/sys/unix/asm_freebsd_386.s new file mode 100644 index 0000000..c9a0a26 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/asm_freebsd_386.s @@ -0,0 +1,29 @@ +// 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. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for 386, FreeBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + JMP syscall·RawSyscall6(SB) diff --git a/api/vendor/golang.org/x/sys/unix/asm_freebsd_amd64.s b/api/vendor/golang.org/x/sys/unix/asm_freebsd_amd64.s new file mode 100644 index 0000000..3517247 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/asm_freebsd_amd64.s @@ -0,0 +1,29 @@ +// 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. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for AMD64, FreeBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-104 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + JMP syscall·RawSyscall6(SB) diff --git a/api/vendor/golang.org/x/sys/unix/asm_freebsd_arm.s b/api/vendor/golang.org/x/sys/unix/asm_freebsd_arm.s new file mode 100644 index 0000000..9227c87 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/asm_freebsd_arm.s @@ -0,0 +1,29 @@ +// 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. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for ARM, FreeBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + B syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + B syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + B syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + B syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + B syscall·RawSyscall6(SB) diff --git a/api/vendor/golang.org/x/sys/unix/asm_linux_386.s b/api/vendor/golang.org/x/sys/unix/asm_linux_386.s new file mode 100644 index 0000000..448bebb --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/asm_linux_386.s @@ -0,0 +1,65 @@ +// 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. + +// +build !gccgo + +#include "textflag.h" + +// +// System calls for 386, Linux +// + +// See ../runtime/sys_linux_386.s for the reason why we always use int 0x80 +// instead of the glibc-specific "CALL 0x10(GS)". +#define INVOKE_SYSCALL INT $0x80 + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + JMP syscall·Syscall6(SB) + +TEXT ·SyscallNoError(SB),NOSPLIT,$0-24 + CALL runtime·entersyscall(SB) + MOVL trap+0(FP), AX // syscall entry + MOVL a1+4(FP), BX + MOVL a2+8(FP), CX + MOVL a3+12(FP), DX + MOVL $0, SI + MOVL $0, DI + INVOKE_SYSCALL + MOVL AX, r1+16(FP) + MOVL DX, r2+20(FP) + CALL runtime·exitsyscall(SB) + RET + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + JMP syscall·RawSyscall6(SB) + +TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-24 + MOVL trap+0(FP), AX // syscall entry + MOVL a1+4(FP), BX + MOVL a2+8(FP), CX + MOVL a3+12(FP), DX + MOVL $0, SI + MOVL $0, DI + INVOKE_SYSCALL + MOVL AX, r1+16(FP) + MOVL DX, r2+20(FP) + RET + +TEXT ·socketcall(SB),NOSPLIT,$0-36 + JMP syscall·socketcall(SB) + +TEXT ·rawsocketcall(SB),NOSPLIT,$0-36 + JMP syscall·rawsocketcall(SB) + +TEXT ·seek(SB),NOSPLIT,$0-28 + JMP syscall·seek(SB) diff --git a/api/vendor/golang.org/x/sys/unix/asm_linux_amd64.s b/api/vendor/golang.org/x/sys/unix/asm_linux_amd64.s new file mode 100644 index 0000000..c6468a9 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/asm_linux_amd64.s @@ -0,0 +1,57 @@ +// 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. + +// +build !gccgo + +#include "textflag.h" + +// +// System calls for AMD64, Linux +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + JMP syscall·Syscall6(SB) + +TEXT ·SyscallNoError(SB),NOSPLIT,$0-48 + CALL runtime·entersyscall(SB) + MOVQ a1+8(FP), DI + MOVQ a2+16(FP), SI + MOVQ a3+24(FP), DX + MOVQ $0, R10 + MOVQ $0, R8 + MOVQ $0, R9 + MOVQ trap+0(FP), AX // syscall entry + SYSCALL + MOVQ AX, r1+32(FP) + MOVQ DX, r2+40(FP) + CALL runtime·exitsyscall(SB) + RET + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + JMP syscall·RawSyscall6(SB) + +TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-48 + MOVQ a1+8(FP), DI + MOVQ a2+16(FP), SI + MOVQ a3+24(FP), DX + MOVQ $0, R10 + MOVQ $0, R8 + MOVQ $0, R9 + MOVQ trap+0(FP), AX // syscall entry + SYSCALL + MOVQ AX, r1+32(FP) + MOVQ DX, r2+40(FP) + RET + +TEXT ·gettimeofday(SB),NOSPLIT,$0-16 + JMP syscall·gettimeofday(SB) diff --git a/api/vendor/golang.org/x/sys/unix/asm_linux_arm.s b/api/vendor/golang.org/x/sys/unix/asm_linux_arm.s new file mode 100644 index 0000000..cf0f357 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/asm_linux_arm.s @@ -0,0 +1,56 @@ +// 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. + +// +build !gccgo + +#include "textflag.h" + +// +// System calls for arm, Linux +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + B syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + B syscall·Syscall6(SB) + +TEXT ·SyscallNoError(SB),NOSPLIT,$0-24 + BL runtime·entersyscall(SB) + MOVW trap+0(FP), R7 + MOVW a1+4(FP), R0 + MOVW a2+8(FP), R1 + MOVW a3+12(FP), R2 + MOVW $0, R3 + MOVW $0, R4 + MOVW $0, R5 + SWI $0 + MOVW R0, r1+16(FP) + MOVW $0, R0 + MOVW R0, r2+20(FP) + BL runtime·exitsyscall(SB) + RET + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + B syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + B syscall·RawSyscall6(SB) + +TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-24 + MOVW trap+0(FP), R7 // syscall entry + MOVW a1+4(FP), R0 + MOVW a2+8(FP), R1 + MOVW a3+12(FP), R2 + SWI $0 + MOVW R0, r1+16(FP) + MOVW $0, R0 + MOVW R0, r2+20(FP) + RET + +TEXT ·seek(SB),NOSPLIT,$0-28 + B syscall·seek(SB) diff --git a/api/vendor/golang.org/x/sys/unix/asm_linux_arm64.s b/api/vendor/golang.org/x/sys/unix/asm_linux_arm64.s new file mode 100644 index 0000000..afe6fdf --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/asm_linux_arm64.s @@ -0,0 +1,52 @@ +// Copyright 2015 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 linux +// +build arm64 +// +build !gccgo + +#include "textflag.h" + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + B syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + B syscall·Syscall6(SB) + +TEXT ·SyscallNoError(SB),NOSPLIT,$0-48 + BL runtime·entersyscall(SB) + MOVD a1+8(FP), R0 + MOVD a2+16(FP), R1 + MOVD a3+24(FP), R2 + MOVD $0, R3 + MOVD $0, R4 + MOVD $0, R5 + MOVD trap+0(FP), R8 // syscall entry + SVC + MOVD R0, r1+32(FP) // r1 + MOVD R1, r2+40(FP) // r2 + BL runtime·exitsyscall(SB) + RET + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + B syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + B syscall·RawSyscall6(SB) + +TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-48 + MOVD a1+8(FP), R0 + MOVD a2+16(FP), R1 + MOVD a3+24(FP), R2 + MOVD $0, R3 + MOVD $0, R4 + MOVD $0, R5 + MOVD trap+0(FP), R8 // syscall entry + SVC + MOVD R0, r1+32(FP) + MOVD R1, r2+40(FP) + RET diff --git a/api/vendor/golang.org/x/sys/unix/asm_linux_mips64x.s b/api/vendor/golang.org/x/sys/unix/asm_linux_mips64x.s new file mode 100644 index 0000000..ab9d638 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/asm_linux_mips64x.s @@ -0,0 +1,56 @@ +// Copyright 2015 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 linux +// +build mips64 mips64le +// +build !gccgo + +#include "textflag.h" + +// +// System calls for mips64, Linux +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + JMP syscall·Syscall6(SB) + +TEXT ·SyscallNoError(SB),NOSPLIT,$0-48 + JAL runtime·entersyscall(SB) + MOVV a1+8(FP), R4 + MOVV a2+16(FP), R5 + MOVV a3+24(FP), R6 + MOVV R0, R7 + MOVV R0, R8 + MOVV R0, R9 + MOVV trap+0(FP), R2 // syscall entry + SYSCALL + MOVV R2, r1+32(FP) + MOVV R3, r2+40(FP) + JAL runtime·exitsyscall(SB) + RET + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + JMP syscall·RawSyscall6(SB) + +TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-48 + MOVV a1+8(FP), R4 + MOVV a2+16(FP), R5 + MOVV a3+24(FP), R6 + MOVV R0, R7 + MOVV R0, R8 + MOVV R0, R9 + MOVV trap+0(FP), R2 // syscall entry + SYSCALL + MOVV R2, r1+32(FP) + MOVV R3, r2+40(FP) + RET diff --git a/api/vendor/golang.org/x/sys/unix/asm_linux_mipsx.s b/api/vendor/golang.org/x/sys/unix/asm_linux_mipsx.s new file mode 100644 index 0000000..99e5399 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/asm_linux_mipsx.s @@ -0,0 +1,54 @@ +// 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. + +// +build linux +// +build mips mipsle +// +build !gccgo + +#include "textflag.h" + +// +// System calls for mips, Linux +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + JMP syscall·Syscall9(SB) + +TEXT ·SyscallNoError(SB),NOSPLIT,$0-24 + JAL runtime·entersyscall(SB) + MOVW a1+4(FP), R4 + MOVW a2+8(FP), R5 + MOVW a3+12(FP), R6 + MOVW R0, R7 + MOVW trap+0(FP), R2 // syscall entry + SYSCALL + MOVW R2, r1+16(FP) // r1 + MOVW R3, r2+20(FP) // r2 + JAL runtime·exitsyscall(SB) + RET + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + JMP syscall·RawSyscall6(SB) + +TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-24 + MOVW a1+4(FP), R4 + MOVW a2+8(FP), R5 + MOVW a3+12(FP), R6 + MOVW trap+0(FP), R2 // syscall entry + SYSCALL + MOVW R2, r1+16(FP) + MOVW R3, r2+20(FP) + RET diff --git a/api/vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s b/api/vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s new file mode 100644 index 0000000..649e587 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s @@ -0,0 +1,56 @@ +// 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. + +// +build linux +// +build ppc64 ppc64le +// +build !gccgo + +#include "textflag.h" + +// +// System calls for ppc64, Linux +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + BR syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + BR syscall·Syscall6(SB) + +TEXT ·SyscallNoError(SB),NOSPLIT,$0-48 + BL runtime·entersyscall(SB) + MOVD a1+8(FP), R3 + MOVD a2+16(FP), R4 + MOVD a3+24(FP), R5 + MOVD R0, R6 + MOVD R0, R7 + MOVD R0, R8 + MOVD trap+0(FP), R9 // syscall entry + SYSCALL R9 + MOVD R3, r1+32(FP) + MOVD R4, r2+40(FP) + BL runtime·exitsyscall(SB) + RET + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + BR syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + BR syscall·RawSyscall6(SB) + +TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-48 + MOVD a1+8(FP), R3 + MOVD a2+16(FP), R4 + MOVD a3+24(FP), R5 + MOVD R0, R6 + MOVD R0, R7 + MOVD R0, R8 + MOVD trap+0(FP), R9 // syscall entry + SYSCALL R9 + MOVD R3, r1+32(FP) + MOVD R4, r2+40(FP) + RET diff --git a/api/vendor/golang.org/x/sys/unix/asm_linux_s390x.s b/api/vendor/golang.org/x/sys/unix/asm_linux_s390x.s new file mode 100644 index 0000000..a5a863c --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/asm_linux_s390x.s @@ -0,0 +1,56 @@ +// 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. + +// +build s390x +// +build linux +// +build !gccgo + +#include "textflag.h" + +// +// System calls for s390x, Linux +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + BR syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + BR syscall·Syscall6(SB) + +TEXT ·SyscallNoError(SB),NOSPLIT,$0-48 + BL runtime·entersyscall(SB) + MOVD a1+8(FP), R2 + MOVD a2+16(FP), R3 + MOVD a3+24(FP), R4 + MOVD $0, R5 + MOVD $0, R6 + MOVD $0, R7 + MOVD trap+0(FP), R1 // syscall entry + SYSCALL + MOVD R2, r1+32(FP) + MOVD R3, r2+40(FP) + BL runtime·exitsyscall(SB) + RET + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + BR syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + BR syscall·RawSyscall6(SB) + +TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-48 + MOVD a1+8(FP), R2 + MOVD a2+16(FP), R3 + MOVD a3+24(FP), R4 + MOVD $0, R5 + MOVD $0, R6 + MOVD $0, R7 + MOVD trap+0(FP), R1 // syscall entry + SYSCALL + MOVD R2, r1+32(FP) + MOVD R3, r2+40(FP) + RET diff --git a/api/vendor/golang.org/x/sys/unix/asm_netbsd_386.s b/api/vendor/golang.org/x/sys/unix/asm_netbsd_386.s new file mode 100644 index 0000000..48bdcd7 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/asm_netbsd_386.s @@ -0,0 +1,29 @@ +// 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. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for 386, NetBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + JMP syscall·RawSyscall6(SB) diff --git a/api/vendor/golang.org/x/sys/unix/asm_netbsd_amd64.s b/api/vendor/golang.org/x/sys/unix/asm_netbsd_amd64.s new file mode 100644 index 0000000..2ede05c --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/asm_netbsd_amd64.s @@ -0,0 +1,29 @@ +// 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. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for AMD64, NetBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-104 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + JMP syscall·RawSyscall6(SB) diff --git a/api/vendor/golang.org/x/sys/unix/asm_netbsd_arm.s b/api/vendor/golang.org/x/sys/unix/asm_netbsd_arm.s new file mode 100644 index 0000000..e892857 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/asm_netbsd_arm.s @@ -0,0 +1,29 @@ +// 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. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for ARM, NetBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + B syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + B syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + B syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + B syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + B syscall·RawSyscall6(SB) diff --git a/api/vendor/golang.org/x/sys/unix/asm_openbsd_386.s b/api/vendor/golang.org/x/sys/unix/asm_openbsd_386.s new file mode 100644 index 0000000..00576f3 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/asm_openbsd_386.s @@ -0,0 +1,29 @@ +// 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. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for 386, OpenBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + JMP syscall·RawSyscall6(SB) diff --git a/api/vendor/golang.org/x/sys/unix/asm_openbsd_amd64.s b/api/vendor/golang.org/x/sys/unix/asm_openbsd_amd64.s new file mode 100644 index 0000000..790ef77 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/asm_openbsd_amd64.s @@ -0,0 +1,29 @@ +// 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. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for AMD64, OpenBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-104 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + JMP syscall·RawSyscall6(SB) diff --git a/api/vendor/golang.org/x/sys/unix/asm_openbsd_arm.s b/api/vendor/golang.org/x/sys/unix/asm_openbsd_arm.s new file mode 100644 index 0000000..469bfa1 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/asm_openbsd_arm.s @@ -0,0 +1,29 @@ +// 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. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for ARM, OpenBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + B syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + B syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + B syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + B syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + B syscall·RawSyscall6(SB) diff --git a/api/vendor/golang.org/x/sys/unix/asm_solaris_amd64.s b/api/vendor/golang.org/x/sys/unix/asm_solaris_amd64.s new file mode 100644 index 0000000..ded8260 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/asm_solaris_amd64.s @@ -0,0 +1,17 @@ +// 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. + +// +build !gccgo + +#include "textflag.h" + +// +// System calls for amd64, Solaris are implemented in runtime/syscall_solaris.go +// + +TEXT ·sysvicall6(SB),NOSPLIT,$0-88 + JMP syscall·sysvicall6(SB) + +TEXT ·rawSysvicall6(SB),NOSPLIT,$0-88 + JMP syscall·rawSysvicall6(SB) diff --git a/api/vendor/golang.org/x/sys/unix/bluetooth_linux.go b/api/vendor/golang.org/x/sys/unix/bluetooth_linux.go new file mode 100644 index 0000000..6e32296 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/bluetooth_linux.go @@ -0,0 +1,35 @@ +// 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. + +// Bluetooth sockets and messages + +package unix + +// Bluetooth Protocols +const ( + BTPROTO_L2CAP = 0 + BTPROTO_HCI = 1 + BTPROTO_SCO = 2 + BTPROTO_RFCOMM = 3 + BTPROTO_BNEP = 4 + BTPROTO_CMTP = 5 + BTPROTO_HIDP = 6 + BTPROTO_AVDTP = 7 +) + +const ( + HCI_CHANNEL_RAW = 0 + HCI_CHANNEL_USER = 1 + HCI_CHANNEL_MONITOR = 2 + HCI_CHANNEL_CONTROL = 3 +) + +// Socketoption Level +const ( + SOL_BLUETOOTH = 0x112 + SOL_HCI = 0x0 + SOL_L2CAP = 0x6 + SOL_RFCOMM = 0x12 + SOL_SCO = 0x11 +) diff --git a/api/vendor/golang.org/x/sys/unix/cap_freebsd.go b/api/vendor/golang.org/x/sys/unix/cap_freebsd.go new file mode 100644 index 0000000..df52048 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/cap_freebsd.go @@ -0,0 +1,195 @@ +// 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. + +// +build freebsd + +package unix + +import ( + "errors" + "fmt" +) + +// Go implementation of C mostly found in /usr/src/sys/kern/subr_capability.c + +const ( + // This is the version of CapRights this package understands. See C implementation for parallels. + capRightsGoVersion = CAP_RIGHTS_VERSION_00 + capArSizeMin = CAP_RIGHTS_VERSION_00 + 2 + capArSizeMax = capRightsGoVersion + 2 +) + +var ( + bit2idx = []int{ + -1, 0, 1, -1, 2, -1, -1, -1, 3, -1, -1, -1, -1, -1, -1, -1, + 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + } +) + +func capidxbit(right uint64) int { + return int((right >> 57) & 0x1f) +} + +func rightToIndex(right uint64) (int, error) { + idx := capidxbit(right) + if idx < 0 || idx >= len(bit2idx) { + return -2, fmt.Errorf("index for right 0x%x out of range", right) + } + return bit2idx[idx], nil +} + +func caprver(right uint64) int { + return int(right >> 62) +} + +func capver(rights *CapRights) int { + return caprver(rights.Rights[0]) +} + +func caparsize(rights *CapRights) int { + return capver(rights) + 2 +} + +// CapRightsSet sets the permissions in setrights in rights. +func CapRightsSet(rights *CapRights, setrights []uint64) error { + // This is essentially a copy of cap_rights_vset() + if capver(rights) != CAP_RIGHTS_VERSION_00 { + return fmt.Errorf("bad rights version %d", capver(rights)) + } + + n := caparsize(rights) + if n < capArSizeMin || n > capArSizeMax { + return errors.New("bad rights size") + } + + for _, right := range setrights { + if caprver(right) != CAP_RIGHTS_VERSION_00 { + return errors.New("bad right version") + } + i, err := rightToIndex(right) + if err != nil { + return err + } + if i >= n { + return errors.New("index overflow") + } + if capidxbit(rights.Rights[i]) != capidxbit(right) { + return errors.New("index mismatch") + } + rights.Rights[i] |= right + if capidxbit(rights.Rights[i]) != capidxbit(right) { + return errors.New("index mismatch (after assign)") + } + } + + return nil +} + +// CapRightsClear clears the permissions in clearrights from rights. +func CapRightsClear(rights *CapRights, clearrights []uint64) error { + // This is essentially a copy of cap_rights_vclear() + if capver(rights) != CAP_RIGHTS_VERSION_00 { + return fmt.Errorf("bad rights version %d", capver(rights)) + } + + n := caparsize(rights) + if n < capArSizeMin || n > capArSizeMax { + return errors.New("bad rights size") + } + + for _, right := range clearrights { + if caprver(right) != CAP_RIGHTS_VERSION_00 { + return errors.New("bad right version") + } + i, err := rightToIndex(right) + if err != nil { + return err + } + if i >= n { + return errors.New("index overflow") + } + if capidxbit(rights.Rights[i]) != capidxbit(right) { + return errors.New("index mismatch") + } + rights.Rights[i] &= ^(right & 0x01FFFFFFFFFFFFFF) + if capidxbit(rights.Rights[i]) != capidxbit(right) { + return errors.New("index mismatch (after assign)") + } + } + + return nil +} + +// CapRightsIsSet checks whether all the permissions in setrights are present in rights. +func CapRightsIsSet(rights *CapRights, setrights []uint64) (bool, error) { + // This is essentially a copy of cap_rights_is_vset() + if capver(rights) != CAP_RIGHTS_VERSION_00 { + return false, fmt.Errorf("bad rights version %d", capver(rights)) + } + + n := caparsize(rights) + if n < capArSizeMin || n > capArSizeMax { + return false, errors.New("bad rights size") + } + + for _, right := range setrights { + if caprver(right) != CAP_RIGHTS_VERSION_00 { + return false, errors.New("bad right version") + } + i, err := rightToIndex(right) + if err != nil { + return false, err + } + if i >= n { + return false, errors.New("index overflow") + } + if capidxbit(rights.Rights[i]) != capidxbit(right) { + return false, errors.New("index mismatch") + } + if (rights.Rights[i] & right) != right { + return false, nil + } + } + + return true, nil +} + +func capright(idx uint64, bit uint64) uint64 { + return ((1 << (57 + idx)) | bit) +} + +// CapRightsInit returns a pointer to an initialised CapRights structure filled with rights. +// See man cap_rights_init(3) and rights(4). +func CapRightsInit(rights []uint64) (*CapRights, error) { + var r CapRights + r.Rights[0] = (capRightsGoVersion << 62) | capright(0, 0) + r.Rights[1] = capright(1, 0) + + err := CapRightsSet(&r, rights) + if err != nil { + return nil, err + } + return &r, nil +} + +// CapRightsLimit reduces the operations permitted on fd to at most those contained in rights. +// The capability rights on fd can never be increased by CapRightsLimit. +// See man cap_rights_limit(2) and rights(4). +func CapRightsLimit(fd uintptr, rights *CapRights) error { + return capRightsLimit(int(fd), rights) +} + +// CapRightsGet returns a CapRights structure containing the operations permitted on fd. +// See man cap_rights_get(3) and rights(4). +func CapRightsGet(fd uintptr) (*CapRights, error) { + r, err := CapRightsInit(nil) + if err != nil { + return nil, err + } + err = capRightsGet(capRightsGoVersion, int(fd), r) + if err != nil { + return nil, err + } + return r, nil +} diff --git a/api/vendor/golang.org/x/sys/unix/constants.go b/api/vendor/golang.org/x/sys/unix/constants.go new file mode 100644 index 0000000..a96f0eb --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/constants.go @@ -0,0 +1,13 @@ +// Copyright 2015 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 darwin dragonfly freebsd linux netbsd openbsd solaris + +package unix + +const ( + R_OK = 0x4 + W_OK = 0x2 + X_OK = 0x1 +) diff --git a/api/vendor/golang.org/x/sys/unix/creds_test.go b/api/vendor/golang.org/x/sys/unix/creds_test.go new file mode 100644 index 0000000..1b50831 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/creds_test.go @@ -0,0 +1,134 @@ +// 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. + +// +build linux + +package unix_test + +import ( + "bytes" + "go/build" + "net" + "os" + "testing" + + "golang.org/x/sys/unix" +) + +// TestSCMCredentials tests the sending and receiving of credentials +// (PID, UID, GID) in an ancillary message between two UNIX +// sockets. The SO_PASSCRED socket option is enabled on the sending +// socket for this to work. +func TestSCMCredentials(t *testing.T) { + socketTypeTests := []struct { + socketType int + dataLen int + }{ + { + unix.SOCK_STREAM, + 1, + }, { + unix.SOCK_DGRAM, + 0, + }, + } + + for _, tt := range socketTypeTests { + if tt.socketType == unix.SOCK_DGRAM && !atLeast1p10() { + t.Log("skipping DGRAM test on pre-1.10") + continue + } + + fds, err := unix.Socketpair(unix.AF_LOCAL, tt.socketType, 0) + if err != nil { + t.Fatalf("Socketpair: %v", err) + } + defer unix.Close(fds[0]) + defer unix.Close(fds[1]) + + err = unix.SetsockoptInt(fds[0], unix.SOL_SOCKET, unix.SO_PASSCRED, 1) + if err != nil { + t.Fatalf("SetsockoptInt: %v", err) + } + + srvFile := os.NewFile(uintptr(fds[0]), "server") + defer srvFile.Close() + srv, err := net.FileConn(srvFile) + if err != nil { + t.Errorf("FileConn: %v", err) + return + } + defer srv.Close() + + cliFile := os.NewFile(uintptr(fds[1]), "client") + defer cliFile.Close() + cli, err := net.FileConn(cliFile) + if err != nil { + t.Errorf("FileConn: %v", err) + return + } + defer cli.Close() + + var ucred unix.Ucred + ucred.Pid = int32(os.Getpid()) + ucred.Uid = uint32(os.Getuid()) + ucred.Gid = uint32(os.Getgid()) + oob := unix.UnixCredentials(&ucred) + + // On SOCK_STREAM, this is internally going to send a dummy byte + n, oobn, err := cli.(*net.UnixConn).WriteMsgUnix(nil, oob, nil) + if err != nil { + t.Fatalf("WriteMsgUnix: %v", err) + } + if n != 0 { + t.Fatalf("WriteMsgUnix n = %d, want 0", n) + } + if oobn != len(oob) { + t.Fatalf("WriteMsgUnix oobn = %d, want %d", oobn, len(oob)) + } + + oob2 := make([]byte, 10*len(oob)) + n, oobn2, flags, _, err := srv.(*net.UnixConn).ReadMsgUnix(nil, oob2) + if err != nil { + t.Fatalf("ReadMsgUnix: %v", err) + } + if flags != 0 { + t.Fatalf("ReadMsgUnix flags = 0x%x, want 0", flags) + } + if n != tt.dataLen { + t.Fatalf("ReadMsgUnix n = %d, want %d", n, tt.dataLen) + } + if oobn2 != oobn { + // without SO_PASSCRED set on the socket, ReadMsgUnix will + // return zero oob bytes + t.Fatalf("ReadMsgUnix oobn = %d, want %d", oobn2, oobn) + } + oob2 = oob2[:oobn2] + if !bytes.Equal(oob, oob2) { + t.Fatal("ReadMsgUnix oob bytes don't match") + } + + scm, err := unix.ParseSocketControlMessage(oob2) + if err != nil { + t.Fatalf("ParseSocketControlMessage: %v", err) + } + newUcred, err := unix.ParseUnixCredentials(&scm[0]) + if err != nil { + t.Fatalf("ParseUnixCredentials: %v", err) + } + if *newUcred != ucred { + t.Fatalf("ParseUnixCredentials = %+v, want %+v", newUcred, ucred) + } + } +} + +// atLeast1p10 reports whether we are running on Go 1.10 or later. +func atLeast1p10() bool { + for _, ver := range build.Default.ReleaseTags { + if ver == "go1.10" { + return true + } + } + return false +} diff --git a/api/vendor/golang.org/x/sys/unix/dev_darwin.go b/api/vendor/golang.org/x/sys/unix/dev_darwin.go new file mode 100644 index 0000000..8d1dc0f --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/dev_darwin.go @@ -0,0 +1,24 @@ +// 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. + +// Functions to access/create device major and minor numbers matching the +// encoding used in Darwin's sys/types.h header. + +package unix + +// Major returns the major component of a Darwin device number. +func Major(dev uint64) uint32 { + return uint32((dev >> 24) & 0xff) +} + +// Minor returns the minor component of a Darwin device number. +func Minor(dev uint64) uint32 { + return uint32(dev & 0xffffff) +} + +// Mkdev returns a Darwin device number generated from the given major and minor +// components. +func Mkdev(major, minor uint32) uint64 { + return (uint64(major) << 24) | uint64(minor) +} diff --git a/api/vendor/golang.org/x/sys/unix/dev_dragonfly.go b/api/vendor/golang.org/x/sys/unix/dev_dragonfly.go new file mode 100644 index 0000000..8502f20 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/dev_dragonfly.go @@ -0,0 +1,30 @@ +// 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. + +// Functions to access/create device major and minor numbers matching the +// encoding used in Dragonfly's sys/types.h header. +// +// The information below is extracted and adapted from sys/types.h: +// +// Minor gives a cookie instead of an index since in order to avoid changing the +// meanings of bits 0-15 or wasting time and space shifting bits 16-31 for +// devices that don't use them. + +package unix + +// Major returns the major component of a DragonFlyBSD device number. +func Major(dev uint64) uint32 { + return uint32((dev >> 8) & 0xff) +} + +// Minor returns the minor component of a DragonFlyBSD device number. +func Minor(dev uint64) uint32 { + return uint32(dev & 0xffff00ff) +} + +// Mkdev returns a DragonFlyBSD device number generated from the given major and +// minor components. +func Mkdev(major, minor uint32) uint64 { + return (uint64(major) << 8) | uint64(minor) +} diff --git a/api/vendor/golang.org/x/sys/unix/dev_freebsd.go b/api/vendor/golang.org/x/sys/unix/dev_freebsd.go new file mode 100644 index 0000000..eba3b4b --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/dev_freebsd.go @@ -0,0 +1,30 @@ +// 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. + +// Functions to access/create device major and minor numbers matching the +// encoding used in FreeBSD's sys/types.h header. +// +// The information below is extracted and adapted from sys/types.h: +// +// Minor gives a cookie instead of an index since in order to avoid changing the +// meanings of bits 0-15 or wasting time and space shifting bits 16-31 for +// devices that don't use them. + +package unix + +// Major returns the major component of a FreeBSD device number. +func Major(dev uint64) uint32 { + return uint32((dev >> 8) & 0xff) +} + +// Minor returns the minor component of a FreeBSD device number. +func Minor(dev uint64) uint32 { + return uint32(dev & 0xffff00ff) +} + +// Mkdev returns a FreeBSD device number generated from the given major and +// minor components. +func Mkdev(major, minor uint32) uint64 { + return (uint64(major) << 8) | uint64(minor) +} diff --git a/api/vendor/golang.org/x/sys/unix/dev_linux.go b/api/vendor/golang.org/x/sys/unix/dev_linux.go new file mode 100644 index 0000000..d165d6f --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/dev_linux.go @@ -0,0 +1,42 @@ +// 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. + +// Functions to access/create device major and minor numbers matching the +// encoding used by the Linux kernel and glibc. +// +// The information below is extracted and adapted from bits/sysmacros.h in the +// glibc sources: +// +// dev_t in glibc is 64-bit, with 32-bit major and minor numbers. glibc's +// default encoding is MMMM Mmmm mmmM MMmm, where M is a hex digit of the major +// number and m is a hex digit of the minor number. This is backward compatible +// with legacy systems where dev_t is 16 bits wide, encoded as MMmm. It is also +// backward compatible with the Linux kernel, which for some architectures uses +// 32-bit dev_t, encoded as mmmM MMmm. + +package unix + +// Major returns the major component of a Linux device number. +func Major(dev uint64) uint32 { + major := uint32((dev & 0x00000000000fff00) >> 8) + major |= uint32((dev & 0xfffff00000000000) >> 32) + return major +} + +// Minor returns the minor component of a Linux device number. +func Minor(dev uint64) uint32 { + minor := uint32((dev & 0x00000000000000ff) >> 0) + minor |= uint32((dev & 0x00000ffffff00000) >> 12) + return minor +} + +// Mkdev returns a Linux device number generated from the given major and minor +// components. +func Mkdev(major, minor uint32) uint64 { + dev := (uint64(major) & 0x00000fff) << 8 + dev |= (uint64(major) & 0xfffff000) << 32 + dev |= (uint64(minor) & 0x000000ff) << 0 + dev |= (uint64(minor) & 0xffffff00) << 12 + return dev +} diff --git a/api/vendor/golang.org/x/sys/unix/dev_linux_test.go b/api/vendor/golang.org/x/sys/unix/dev_linux_test.go new file mode 100644 index 0000000..5164528 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/dev_linux_test.go @@ -0,0 +1,56 @@ +// 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. + +// +build go1.7 + +package unix_test + +import ( + "fmt" + "testing" + + "golang.org/x/sys/unix" +) + +func TestDevices(t *testing.T) { + testCases := []struct { + path string + major uint32 + minor uint32 + }{ + // well known major/minor numbers according to + // https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/admin-guide/devices.txt + {"/dev/null", 1, 3}, + {"/dev/zero", 1, 5}, + {"/dev/random", 1, 8}, + {"/dev/full", 1, 7}, + {"/dev/urandom", 1, 9}, + {"/dev/tty", 5, 0}, + } + for _, tc := range testCases { + t.Run(fmt.Sprintf("%s %v:%v", tc.path, tc.major, tc.minor), func(t *testing.T) { + var stat unix.Stat_t + err := unix.Stat(tc.path, &stat) + if err != nil { + if err == unix.EACCES { + t.Skip("no permission to stat device, skipping test") + } + t.Errorf("failed to stat device: %v", err) + return + } + + dev := uint64(stat.Rdev) + if unix.Major(dev) != tc.major { + t.Errorf("for %s Major(%#x) == %d, want %d", tc.path, dev, unix.Major(dev), tc.major) + } + if unix.Minor(dev) != tc.minor { + t.Errorf("for %s Minor(%#x) == %d, want %d", tc.path, dev, unix.Minor(dev), tc.minor) + } + if unix.Mkdev(tc.major, tc.minor) != dev { + t.Errorf("for %s Mkdev(%d, %d) == %#x, want %#x", tc.path, tc.major, tc.minor, unix.Mkdev(tc.major, tc.minor), dev) + } + }) + + } +} diff --git a/api/vendor/golang.org/x/sys/unix/dev_netbsd.go b/api/vendor/golang.org/x/sys/unix/dev_netbsd.go new file mode 100644 index 0000000..b4a203d --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/dev_netbsd.go @@ -0,0 +1,29 @@ +// 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. + +// Functions to access/create device major and minor numbers matching the +// encoding used in NetBSD's sys/types.h header. + +package unix + +// Major returns the major component of a NetBSD device number. +func Major(dev uint64) uint32 { + return uint32((dev & 0x000fff00) >> 8) +} + +// Minor returns the minor component of a NetBSD device number. +func Minor(dev uint64) uint32 { + minor := uint32((dev & 0x000000ff) >> 0) + minor |= uint32((dev & 0xfff00000) >> 12) + return minor +} + +// Mkdev returns a NetBSD device number generated from the given major and minor +// components. +func Mkdev(major, minor uint32) uint64 { + dev := (uint64(major) << 8) & 0x000fff00 + dev |= (uint64(minor) << 12) & 0xfff00000 + dev |= (uint64(minor) << 0) & 0x000000ff + return dev +} diff --git a/api/vendor/golang.org/x/sys/unix/dev_openbsd.go b/api/vendor/golang.org/x/sys/unix/dev_openbsd.go new file mode 100644 index 0000000..f3430c4 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/dev_openbsd.go @@ -0,0 +1,29 @@ +// 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. + +// Functions to access/create device major and minor numbers matching the +// encoding used in OpenBSD's sys/types.h header. + +package unix + +// Major returns the major component of an OpenBSD device number. +func Major(dev uint64) uint32 { + return uint32((dev & 0x0000ff00) >> 8) +} + +// Minor returns the minor component of an OpenBSD device number. +func Minor(dev uint64) uint32 { + minor := uint32((dev & 0x000000ff) >> 0) + minor |= uint32((dev & 0xffff0000) >> 8) + return minor +} + +// Mkdev returns an OpenBSD device number generated from the given major and minor +// components. +func Mkdev(major, minor uint32) uint64 { + dev := (uint64(major) << 8) & 0x0000ff00 + dev |= (uint64(minor) << 8) & 0xffff0000 + dev |= (uint64(minor) << 0) & 0x000000ff + return dev +} diff --git a/api/vendor/golang.org/x/sys/unix/dirent.go b/api/vendor/golang.org/x/sys/unix/dirent.go new file mode 100644 index 0000000..95fd353 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/dirent.go @@ -0,0 +1,17 @@ +// 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. + +// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris + +package unix + +import "syscall" + +// ParseDirent parses up to max directory entries in buf, +// appending the names to names. It returns the number of +// bytes consumed from buf, the number of entries added +// to names, and the new names slice. +func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, newnames []string) { + return syscall.ParseDirent(buf, max, names) +} diff --git a/api/vendor/golang.org/x/sys/unix/endian_big.go b/api/vendor/golang.org/x/sys/unix/endian_big.go new file mode 100644 index 0000000..5e92690 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/endian_big.go @@ -0,0 +1,9 @@ +// 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. +// +// +build ppc64 s390x mips mips64 + +package unix + +const isBigEndian = true diff --git a/api/vendor/golang.org/x/sys/unix/endian_little.go b/api/vendor/golang.org/x/sys/unix/endian_little.go new file mode 100644 index 0000000..085df2d --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/endian_little.go @@ -0,0 +1,9 @@ +// 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. +// +// +build 386 amd64 amd64p32 arm arm64 ppc64le mipsle mips64le + +package unix + +const isBigEndian = false diff --git a/api/vendor/golang.org/x/sys/unix/env_unix.go b/api/vendor/golang.org/x/sys/unix/env_unix.go new file mode 100644 index 0000000..706b3cd --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/env_unix.go @@ -0,0 +1,31 @@ +// 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +// Unix environment variables. + +package unix + +import "syscall" + +func Getenv(key string) (value string, found bool) { + return syscall.Getenv(key) +} + +func Setenv(key, value string) error { + return syscall.Setenv(key, value) +} + +func Clearenv() { + syscall.Clearenv() +} + +func Environ() []string { + return syscall.Environ() +} + +func Unsetenv(key string) error { + return syscall.Unsetenv(key) +} diff --git a/api/vendor/golang.org/x/sys/unix/errors_freebsd_386.go b/api/vendor/golang.org/x/sys/unix/errors_freebsd_386.go new file mode 100644 index 0000000..c56bc8b --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/errors_freebsd_386.go @@ -0,0 +1,227 @@ +// 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. + +// Constants that were deprecated or moved to enums in the FreeBSD headers. Keep +// them here for backwards compatibility. + +package unix + +const ( + IFF_SMART = 0x20 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BSC = 0x53 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf2 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_IPXIP = 0xf9 + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf6 + IFT_PFSYNC = 0xf7 + IFT_PLC = 0xae + IFT_POS = 0xab + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf1 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_STF = 0xd7 + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VOICEEM = 0x64 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IPPROTO_MAXID = 0x34 + IPV6_FAITH = 0x1d + IP_FAITH = 0x16 + MAP_NORESERVE = 0x40 + MAP_RENAME = 0x20 + NET_RT_MAXID = 0x6 + RTF_PRCLONING = 0x10000 + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + SIOCADDRT = 0x8030720a + SIOCALIFADDR = 0x8118691b + SIOCDELRT = 0x8030720b + SIOCDLIFADDR = 0x8118691d + SIOCGLIFADDR = 0xc118691c + SIOCGLIFPHYADDR = 0xc118694b + SIOCSLIFPHYADDR = 0x8118694a +) diff --git a/api/vendor/golang.org/x/sys/unix/errors_freebsd_amd64.go b/api/vendor/golang.org/x/sys/unix/errors_freebsd_amd64.go new file mode 100644 index 0000000..3e97711 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/errors_freebsd_amd64.go @@ -0,0 +1,227 @@ +// 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. + +// Constants that were deprecated or moved to enums in the FreeBSD headers. Keep +// them here for backwards compatibility. + +package unix + +const ( + IFF_SMART = 0x20 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BSC = 0x53 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf2 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_IPXIP = 0xf9 + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf6 + IFT_PFSYNC = 0xf7 + IFT_PLC = 0xae + IFT_POS = 0xab + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf1 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_STF = 0xd7 + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VOICEEM = 0x64 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IPPROTO_MAXID = 0x34 + IPV6_FAITH = 0x1d + IP_FAITH = 0x16 + MAP_NORESERVE = 0x40 + MAP_RENAME = 0x20 + NET_RT_MAXID = 0x6 + RTF_PRCLONING = 0x10000 + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + SIOCADDRT = 0x8040720a + SIOCALIFADDR = 0x8118691b + SIOCDELRT = 0x8040720b + SIOCDLIFADDR = 0x8118691d + SIOCGLIFADDR = 0xc118691c + SIOCGLIFPHYADDR = 0xc118694b + SIOCSLIFPHYADDR = 0x8118694a +) diff --git a/api/vendor/golang.org/x/sys/unix/errors_freebsd_arm.go b/api/vendor/golang.org/x/sys/unix/errors_freebsd_arm.go new file mode 100644 index 0000000..856dca3 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/errors_freebsd_arm.go @@ -0,0 +1,226 @@ +// 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 unix + +const ( + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BSC = 0x53 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf6 + IFT_PFSYNC = 0xf7 + IFT_PLC = 0xae + IFT_POS = 0xab + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf1 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_STF = 0xd7 + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VOICEEM = 0x64 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + + // missing constants on FreeBSD-11.1-RELEASE, copied from old values in ztypes_freebsd_arm.go + IFF_SMART = 0x20 + IFT_FAITH = 0xf2 + IFT_IPXIP = 0xf9 + IPPROTO_MAXID = 0x34 + IPV6_FAITH = 0x1d + IP_FAITH = 0x16 + MAP_NORESERVE = 0x40 + MAP_RENAME = 0x20 + NET_RT_MAXID = 0x6 + RTF_PRCLONING = 0x10000 + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + SIOCADDRT = 0x8030720a + SIOCALIFADDR = 0x8118691b + SIOCDELRT = 0x8030720b + SIOCDLIFADDR = 0x8118691d + SIOCGLIFADDR = 0xc118691c + SIOCGLIFPHYADDR = 0xc118694b + SIOCSLIFPHYADDR = 0x8118694a +) diff --git a/api/vendor/golang.org/x/sys/unix/example_test.go b/api/vendor/golang.org/x/sys/unix/example_test.go new file mode 100644 index 0000000..10619af --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/example_test.go @@ -0,0 +1,19 @@ +// 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 darwin dragonfly freebsd linux netbsd openbsd solaris + +package unix_test + +import ( + "log" + "os" + + "golang.org/x/sys/unix" +) + +func ExampleExec() { + err := unix.Exec("/bin/ls", []string{"ls", "-al"}, os.Environ()) + log.Fatal(err) +} diff --git a/api/vendor/golang.org/x/sys/unix/export_test.go b/api/vendor/golang.org/x/sys/unix/export_test.go new file mode 100644 index 0000000..e802469 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/export_test.go @@ -0,0 +1,9 @@ +// Copyright 2015 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 darwin dragonfly freebsd linux netbsd openbsd solaris + +package unix + +var Itoa = itoa diff --git a/api/vendor/golang.org/x/sys/unix/fcntl.go b/api/vendor/golang.org/x/sys/unix/fcntl.go new file mode 100644 index 0000000..0c58c7e --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/fcntl.go @@ -0,0 +1,28 @@ +// 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd + +package unix + +import "unsafe" + +// fcntl64Syscall is usually SYS_FCNTL, but is overridden on 32-bit Linux +// systems by flock_linux_32bit.go to be SYS_FCNTL64. +var fcntl64Syscall uintptr = SYS_FCNTL + +// FcntlInt performs a fcntl syscall on fd with the provided command and argument. +func FcntlInt(fd uintptr, cmd, arg int) (int, error) { + valptr, _, err := Syscall(fcntl64Syscall, fd, uintptr(cmd), uintptr(arg)) + return int(valptr), err +} + +// FcntlFlock performs a fcntl syscall for the F_GETLK, F_SETLK or F_SETLKW command. +func FcntlFlock(fd uintptr, cmd int, lk *Flock_t) error { + _, _, errno := Syscall(fcntl64Syscall, fd, uintptr(cmd), uintptr(unsafe.Pointer(lk))) + if errno == 0 { + return nil + } + return errno +} diff --git a/api/vendor/golang.org/x/sys/unix/fcntl_linux_32bit.go b/api/vendor/golang.org/x/sys/unix/fcntl_linux_32bit.go new file mode 100644 index 0000000..fc0e50e --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/fcntl_linux_32bit.go @@ -0,0 +1,13 @@ +// +build linux,386 linux,arm linux,mips linux,mipsle + +// 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 unix + +func init() { + // On 32-bit Linux systems, the fcntl syscall that matches Go's + // Flock_t type is SYS_FCNTL64, not SYS_FCNTL. + fcntl64Syscall = SYS_FCNTL64 +} diff --git a/api/vendor/golang.org/x/sys/unix/gccgo.go b/api/vendor/golang.org/x/sys/unix/gccgo.go new file mode 100644 index 0000000..50062e3 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/gccgo.go @@ -0,0 +1,61 @@ +// Copyright 2015 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 gccgo + +package unix + +import "syscall" + +// We can't use the gc-syntax .s files for gccgo. On the plus side +// much of the functionality can be written directly in Go. + +//extern gccgoRealSyscallNoError +func realSyscallNoError(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r uintptr) + +//extern gccgoRealSyscall +func realSyscall(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r, errno uintptr) + +func SyscallNoError(trap, a1, a2, a3 uintptr) (r1, r2 uintptr) { + syscall.Entersyscall() + r := realSyscallNoError(trap, a1, a2, a3, 0, 0, 0, 0, 0, 0) + syscall.Exitsyscall() + return r, 0 +} + +func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) { + syscall.Entersyscall() + r, errno := realSyscall(trap, a1, a2, a3, 0, 0, 0, 0, 0, 0) + syscall.Exitsyscall() + return r, 0, syscall.Errno(errno) +} + +func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) { + syscall.Entersyscall() + r, errno := realSyscall(trap, a1, a2, a3, a4, a5, a6, 0, 0, 0) + syscall.Exitsyscall() + return r, 0, syscall.Errno(errno) +} + +func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) { + syscall.Entersyscall() + r, errno := realSyscall(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9) + syscall.Exitsyscall() + return r, 0, syscall.Errno(errno) +} + +func RawSyscallNoError(trap, a1, a2, a3 uintptr) (r1, r2 uintptr) { + r := realSyscallNoError(trap, a1, a2, a3, 0, 0, 0, 0, 0, 0) + return r, 0 +} + +func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) { + r, errno := realSyscall(trap, a1, a2, a3, 0, 0, 0, 0, 0, 0) + return r, 0, syscall.Errno(errno) +} + +func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) { + r, errno := realSyscall(trap, a1, a2, a3, a4, a5, a6, 0, 0, 0) + return r, 0, syscall.Errno(errno) +} diff --git a/api/vendor/golang.org/x/sys/unix/gccgo_c.c b/api/vendor/golang.org/x/sys/unix/gccgo_c.c new file mode 100644 index 0000000..24e96b1 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/gccgo_c.c @@ -0,0 +1,47 @@ +// Copyright 2015 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 gccgo + +#include +#include +#include + +#define _STRINGIFY2_(x) #x +#define _STRINGIFY_(x) _STRINGIFY2_(x) +#define GOSYM_PREFIX _STRINGIFY_(__USER_LABEL_PREFIX__) + +// Call syscall from C code because the gccgo support for calling from +// Go to C does not support varargs functions. + +struct ret { + uintptr_t r; + uintptr_t err; +}; + +struct ret +gccgoRealSyscall(uintptr_t trap, uintptr_t a1, uintptr_t a2, uintptr_t a3, uintptr_t a4, uintptr_t a5, uintptr_t a6, uintptr_t a7, uintptr_t a8, uintptr_t a9) +{ + struct ret r; + + errno = 0; + r.r = syscall(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9); + r.err = errno; + return r; +} + +uintptr_t +gccgoRealSyscallNoError(uintptr_t trap, uintptr_t a1, uintptr_t a2, uintptr_t a3, uintptr_t a4, uintptr_t a5, uintptr_t a6, uintptr_t a7, uintptr_t a8, uintptr_t a9) +{ + return syscall(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9); +} + +// Define the use function in C so that it is not inlined. + +extern void use(void *) __asm__ (GOSYM_PREFIX GOPKGPATH ".use") __attribute__((noinline)); + +void +use(void *p __attribute__ ((unused))) +{ +} diff --git a/api/vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go b/api/vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go new file mode 100644 index 0000000..251a977 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go @@ -0,0 +1,20 @@ +// Copyright 2015 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 gccgo,linux,amd64 + +package unix + +import "syscall" + +//extern gettimeofday +func realGettimeofday(*Timeval, *byte) int32 + +func gettimeofday(tv *Timeval) (err syscall.Errno) { + r := realGettimeofday(tv, nil) + if r < 0 { + return syscall.GetErrno() + } + return 0 +} diff --git a/api/vendor/golang.org/x/sys/unix/linux/Dockerfile b/api/vendor/golang.org/x/sys/unix/linux/Dockerfile new file mode 100644 index 0000000..5381034 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/linux/Dockerfile @@ -0,0 +1,52 @@ +FROM ubuntu:17.10 + +# Dependencies to get the git sources and go binaries +RUN apt-get update && apt-get install -y --no-install-recommends \ + ca-certificates \ + curl \ + git \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# Get the git sources. If not cached, this takes O(5 minutes). +WORKDIR /git +RUN git config --global advice.detachedHead false +# Linux Kernel: Released 01 Apr 2018 +RUN git clone --branch v4.16 --depth 1 https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux +# GNU C library: Released 01 Feb 2018 (we should try to get a secure way to clone this) +RUN git clone --branch glibc-2.27 --depth 1 git://sourceware.org/git/glibc.git + +# Get Go +ENV GOLANG_VERSION 1.10.1 +ENV GOLANG_DOWNLOAD_URL https://golang.org/dl/go$GOLANG_VERSION.linux-amd64.tar.gz +ENV GOLANG_DOWNLOAD_SHA256 72d820dec546752e5a8303b33b009079c15c2390ce76d67cf514991646c6127b + +RUN curl -fsSL "$GOLANG_DOWNLOAD_URL" -o golang.tar.gz \ + && echo "$GOLANG_DOWNLOAD_SHA256 golang.tar.gz" | sha256sum -c - \ + && tar -C /usr/local -xzf golang.tar.gz \ + && rm golang.tar.gz + +ENV PATH /usr/local/go/bin:$PATH + +# Linux and Glibc build dependencies and emulator +RUN apt-get update && apt-get install -y --no-install-recommends \ + bison gawk make python \ + gcc gcc-multilib \ + gettext texinfo \ + qemu \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* +# Cross compilers (install recommended packages to get cross libc-dev) +RUN apt-get update && apt-get install -y \ + gcc-aarch64-linux-gnu gcc-arm-linux-gnueabi \ + gcc-mips-linux-gnu gcc-mips64-linux-gnuabi64 \ + gcc-mips64el-linux-gnuabi64 gcc-mipsel-linux-gnu \ + gcc-powerpc64-linux-gnu gcc-powerpc64le-linux-gnu \ + gcc-s390x-linux-gnu gcc-sparc64-linux-gnu \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# Let the scripts know they are in the docker environment +ENV GOLANG_SYS_BUILD docker +WORKDIR /build +ENTRYPOINT ["go", "run", "linux/mkall.go", "/git/linux", "/git/glibc"] diff --git a/api/vendor/golang.org/x/sys/unix/linux/mkall.go b/api/vendor/golang.org/x/sys/unix/linux/mkall.go new file mode 100644 index 0000000..40b5cf4 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/linux/mkall.go @@ -0,0 +1,750 @@ +// 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. + +// linux/mkall.go - Generates all Linux zsysnum, zsyscall, zerror, and ztype +// files for all 11 linux architectures supported by the go compiler. See +// README.md for more information about the build system. + +// To run it you must have a git checkout of the Linux kernel and glibc. Once +// the appropriate sources are ready, the program is run as: +// go run linux/mkall.go + +// +build ignore + +package main + +import ( + "bufio" + "bytes" + "debug/elf" + "encoding/binary" + "errors" + "fmt" + "io" + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "runtime" + "strings" + "unicode" +) + +// These will be paths to the appropriate source directories. +var LinuxDir string +var GlibcDir string + +const TempDir = "/tmp" +const IncludeDir = TempDir + "/include" // To hold our C headers +const BuildDir = TempDir + "/build" // To hold intermediate build files + +const GOOS = "linux" // Only for Linux targets +const BuildArch = "amd64" // Must be built on this architecture +const MinKernel = "2.6.23" // https://golang.org/doc/install#requirements + +type target struct { + GoArch string // Architecture name according to Go + LinuxArch string // Architecture name according to the Linux Kernel + GNUArch string // Architecture name according to GNU tools (https://wiki.debian.org/Multiarch/Tuples) + BigEndian bool // Default Little Endian + SignedChar bool // Is -fsigned-char needed (default no) + Bits int +} + +// List of the 11 Linux targets supported by the go compiler. sparc64 is not +// currently supported, though a port is in progress. +var targets = []target{ + { + GoArch: "386", + LinuxArch: "x86", + GNUArch: "i686-linux-gnu", // Note "i686" not "i386" + Bits: 32, + }, + { + GoArch: "amd64", + LinuxArch: "x86", + GNUArch: "x86_64-linux-gnu", + Bits: 64, + }, + { + GoArch: "arm64", + LinuxArch: "arm64", + GNUArch: "aarch64-linux-gnu", + SignedChar: true, + Bits: 64, + }, + { + GoArch: "arm", + LinuxArch: "arm", + GNUArch: "arm-linux-gnueabi", + Bits: 32, + }, + { + GoArch: "mips", + LinuxArch: "mips", + GNUArch: "mips-linux-gnu", + BigEndian: true, + Bits: 32, + }, + { + GoArch: "mipsle", + LinuxArch: "mips", + GNUArch: "mipsel-linux-gnu", + Bits: 32, + }, + { + GoArch: "mips64", + LinuxArch: "mips", + GNUArch: "mips64-linux-gnuabi64", + BigEndian: true, + Bits: 64, + }, + { + GoArch: "mips64le", + LinuxArch: "mips", + GNUArch: "mips64el-linux-gnuabi64", + Bits: 64, + }, + { + GoArch: "ppc64", + LinuxArch: "powerpc", + GNUArch: "powerpc64-linux-gnu", + BigEndian: true, + Bits: 64, + }, + { + GoArch: "ppc64le", + LinuxArch: "powerpc", + GNUArch: "powerpc64le-linux-gnu", + Bits: 64, + }, + { + GoArch: "s390x", + LinuxArch: "s390", + GNUArch: "s390x-linux-gnu", + BigEndian: true, + SignedChar: true, + Bits: 64, + }, + // { + // GoArch: "sparc64", + // LinuxArch: "sparc", + // GNUArch: "sparc64-linux-gnu", + // BigEndian: true, + // Bits: 64, + // }, +} + +// ptracePairs is a list of pairs of targets that can, in some cases, +// run each other's binaries. +var ptracePairs = []struct{ a1, a2 string }{ + {"386", "amd64"}, + {"arm", "arm64"}, + {"mips", "mips64"}, + {"mipsle", "mips64le"}, +} + +func main() { + if runtime.GOOS != GOOS || runtime.GOARCH != BuildArch { + fmt.Printf("Build system has GOOS_GOARCH = %s_%s, need %s_%s\n", + runtime.GOOS, runtime.GOARCH, GOOS, BuildArch) + return + } + + // Check that we are using the new build system if we should + if os.Getenv("GOLANG_SYS_BUILD") != "docker" { + fmt.Println("In the new build system, mkall.go should not be called directly.") + fmt.Println("See README.md") + return + } + + // Parse the command line options + if len(os.Args) != 3 { + fmt.Println("USAGE: go run linux/mkall.go ") + return + } + LinuxDir = os.Args[1] + GlibcDir = os.Args[2] + + for _, t := range targets { + fmt.Printf("----- GENERATING: %s -----\n", t.GoArch) + if err := t.generateFiles(); err != nil { + fmt.Printf("%v\n***** FAILURE: %s *****\n\n", err, t.GoArch) + } else { + fmt.Printf("----- SUCCESS: %s -----\n\n", t.GoArch) + } + } + + fmt.Printf("----- GENERATING ptrace pairs -----\n") + ok := true + for _, p := range ptracePairs { + if err := generatePtracePair(p.a1, p.a2); err != nil { + fmt.Printf("%v\n***** FAILURE: %s/%s *****\n\n", err, p.a1, p.a2) + ok = false + } + } + if ok { + fmt.Printf("----- SUCCESS ptrace pairs -----\n\n") + } +} + +// Makes an exec.Cmd with Stderr attached to os.Stderr +func makeCommand(name string, args ...string) *exec.Cmd { + cmd := exec.Command(name, args...) + cmd.Stderr = os.Stderr + return cmd +} + +// Runs the command, pipes output to a formatter, pipes that to an output file. +func (t *target) commandFormatOutput(formatter string, outputFile string, + name string, args ...string) (err error) { + mainCmd := makeCommand(name, args...) + + fmtCmd := makeCommand(formatter) + if formatter == "mkpost" { + fmtCmd = makeCommand("go", "run", "mkpost.go") + // Set GOARCH_TARGET so mkpost knows what GOARCH is.. + fmtCmd.Env = append(os.Environ(), "GOARCH_TARGET="+t.GoArch) + // Set GOARCH to host arch for mkpost, so it can run natively. + for i, s := range fmtCmd.Env { + if strings.HasPrefix(s, "GOARCH=") { + fmtCmd.Env[i] = "GOARCH=" + BuildArch + } + } + } + + // mainCmd | fmtCmd > outputFile + if fmtCmd.Stdin, err = mainCmd.StdoutPipe(); err != nil { + return + } + if fmtCmd.Stdout, err = os.Create(outputFile); err != nil { + return + } + + // Make sure the formatter eventually closes + if err = fmtCmd.Start(); err != nil { + return + } + defer func() { + fmtErr := fmtCmd.Wait() + if err == nil { + err = fmtErr + } + }() + + return mainCmd.Run() +} + +// Generates all the files for a Linux target +func (t *target) generateFiles() error { + // Setup environment variables + os.Setenv("GOOS", GOOS) + os.Setenv("GOARCH", t.GoArch) + + // Get appropriate compiler and emulator (unless on x86) + if t.LinuxArch != "x86" { + // Check/Setup cross compiler + compiler := t.GNUArch + "-gcc" + if _, err := exec.LookPath(compiler); err != nil { + return err + } + os.Setenv("CC", compiler) + + // Check/Setup emulator (usually first component of GNUArch) + qemuArchName := t.GNUArch[:strings.Index(t.GNUArch, "-")] + if t.LinuxArch == "powerpc" { + qemuArchName = t.GoArch + } + os.Setenv("GORUN", "qemu-"+qemuArchName) + } else { + os.Setenv("CC", "gcc") + } + + // Make the include directory and fill it with headers + if err := os.MkdirAll(IncludeDir, os.ModePerm); err != nil { + return err + } + defer os.RemoveAll(IncludeDir) + if err := t.makeHeaders(); err != nil { + return fmt.Errorf("could not make header files: %v", err) + } + fmt.Println("header files generated") + + // Make each of the four files + if err := t.makeZSysnumFile(); err != nil { + return fmt.Errorf("could not make zsysnum file: %v", err) + } + fmt.Println("zsysnum file generated") + + if err := t.makeZSyscallFile(); err != nil { + return fmt.Errorf("could not make zsyscall file: %v", err) + } + fmt.Println("zsyscall file generated") + + if err := t.makeZTypesFile(); err != nil { + return fmt.Errorf("could not make ztypes file: %v", err) + } + fmt.Println("ztypes file generated") + + if err := t.makeZErrorsFile(); err != nil { + return fmt.Errorf("could not make zerrors file: %v", err) + } + fmt.Println("zerrors file generated") + + return nil +} + +// Create the Linux, glibc and ABI (C compiler convention) headers in the include directory. +func (t *target) makeHeaders() error { + // Make the Linux headers we need for this architecture + linuxMake := makeCommand("make", "headers_install", "ARCH="+t.LinuxArch, "INSTALL_HDR_PATH="+TempDir) + linuxMake.Dir = LinuxDir + if err := linuxMake.Run(); err != nil { + return err + } + + // A Temporary build directory for glibc + if err := os.MkdirAll(BuildDir, os.ModePerm); err != nil { + return err + } + defer os.RemoveAll(BuildDir) + + // Make the glibc headers we need for this architecture + confScript := filepath.Join(GlibcDir, "configure") + glibcConf := makeCommand(confScript, "--prefix="+TempDir, "--host="+t.GNUArch, "--enable-kernel="+MinKernel) + glibcConf.Dir = BuildDir + if err := glibcConf.Run(); err != nil { + return err + } + glibcMake := makeCommand("make", "install-headers") + glibcMake.Dir = BuildDir + if err := glibcMake.Run(); err != nil { + return err + } + // We only need an empty stubs file + stubsFile := filepath.Join(IncludeDir, "gnu/stubs.h") + if file, err := os.Create(stubsFile); err != nil { + return err + } else { + file.Close() + } + + // ABI headers will specify C compiler behavior for the target platform. + return t.makeABIHeaders() +} + +// makeABIHeaders generates C header files based on the platform's calling convention. +// While many platforms have formal Application Binary Interfaces, in practice, whatever the +// dominant C compilers generate is the de-facto calling convention. +// +// We generate C headers instead of a Go file, so as to enable references to the ABI from Cgo. +func (t *target) makeABIHeaders() (err error) { + abiDir := filepath.Join(IncludeDir, "abi") + if err = os.Mkdir(abiDir, os.ModePerm); err != nil { + return err + } + + cc := os.Getenv("CC") + if cc == "" { + return errors.New("CC (compiler) env var not set") + } + + // Build a sacrificial ELF file, to mine for C compiler behavior. + binPath := filepath.Join(TempDir, "tmp_abi.o") + bin, err := t.buildELF(cc, cCode, binPath) + if err != nil { + return fmt.Errorf("cannot build ELF to analyze: %v", err) + } + defer bin.Close() + defer os.Remove(binPath) + + // Right now, we put everything in abi.h, but we may change this later. + abiFile, err := os.Create(filepath.Join(abiDir, "abi.h")) + if err != nil { + return err + } + defer func() { + if cerr := abiFile.Close(); cerr != nil && err == nil { + err = cerr + } + }() + + if err = t.writeBitFieldMasks(bin, abiFile); err != nil { + return fmt.Errorf("cannot write bitfield masks: %v", err) + } + + return nil +} + +func (t *target) buildELF(cc, src, path string) (*elf.File, error) { + // Compile the cCode source using the set compiler - we will need its .data section. + // Do not link the binary, so that we can find .data section offsets from the symbol values. + ccCmd := makeCommand(cc, "-o", path, "-gdwarf", "-x", "c", "-c", "-") + ccCmd.Stdin = strings.NewReader(src) + ccCmd.Stdout = os.Stdout + if err := ccCmd.Run(); err != nil { + return nil, fmt.Errorf("compiler error: %v", err) + } + + bin, err := elf.Open(path) + if err != nil { + return nil, fmt.Errorf("cannot read ELF file %s: %v", path, err) + } + + return bin, nil +} + +func (t *target) writeBitFieldMasks(bin *elf.File, out io.Writer) error { + symbols, err := bin.Symbols() + if err != nil { + return fmt.Errorf("getting ELF symbols: %v", err) + } + var masksSym *elf.Symbol + + for _, sym := range symbols { + if sym.Name == "masks" { + masksSym = &sym + } + } + + if masksSym == nil { + return errors.New("could not find the 'masks' symbol in ELF symtab") + } + + dataSection := bin.Section(".data") + if dataSection == nil { + return errors.New("ELF file has no .data section") + } + + data, err := dataSection.Data() + if err != nil { + return fmt.Errorf("could not read .data section: %v\n", err) + } + + var bo binary.ByteOrder + if t.BigEndian { + bo = binary.BigEndian + } else { + bo = binary.LittleEndian + } + + // 64 bit masks of type uint64 are stored in the data section starting at masks.Value. + // Here we are running on AMD64, but these values may be big endian or little endian, + // depending on target architecture. + for i := uint64(0); i < 64; i++ { + off := masksSym.Value + i*8 + // Define each mask in native by order, so as to match target endian. + fmt.Fprintf(out, "#define BITFIELD_MASK_%d %dULL\n", i, bo.Uint64(data[off:off+8])) + } + + return nil +} + +// makes the zsysnum_linux_$GOARCH.go file +func (t *target) makeZSysnumFile() error { + zsysnumFile := fmt.Sprintf("zsysnum_linux_%s.go", t.GoArch) + unistdFile := filepath.Join(IncludeDir, "asm/unistd.h") + + args := append(t.cFlags(), unistdFile) + return t.commandFormatOutput("gofmt", zsysnumFile, "linux/mksysnum.pl", args...) +} + +// makes the zsyscall_linux_$GOARCH.go file +func (t *target) makeZSyscallFile() error { + zsyscallFile := fmt.Sprintf("zsyscall_linux_%s.go", t.GoArch) + // Find the correct architecture syscall file (might end with x.go) + archSyscallFile := fmt.Sprintf("syscall_linux_%s.go", t.GoArch) + if _, err := os.Stat(archSyscallFile); os.IsNotExist(err) { + shortArch := strings.TrimSuffix(t.GoArch, "le") + archSyscallFile = fmt.Sprintf("syscall_linux_%sx.go", shortArch) + } + + args := append(t.mksyscallFlags(), "-tags", "linux,"+t.GoArch, + "syscall_linux.go", archSyscallFile) + return t.commandFormatOutput("gofmt", zsyscallFile, "./mksyscall.pl", args...) +} + +// makes the zerrors_linux_$GOARCH.go file +func (t *target) makeZErrorsFile() error { + zerrorsFile := fmt.Sprintf("zerrors_linux_%s.go", t.GoArch) + + return t.commandFormatOutput("gofmt", zerrorsFile, "./mkerrors.sh", t.cFlags()...) +} + +// makes the ztypes_linux_$GOARCH.go file +func (t *target) makeZTypesFile() error { + ztypesFile := fmt.Sprintf("ztypes_linux_%s.go", t.GoArch) + + args := []string{"tool", "cgo", "-godefs", "--"} + args = append(args, t.cFlags()...) + args = append(args, "linux/types.go") + return t.commandFormatOutput("mkpost", ztypesFile, "go", args...) +} + +// Flags that should be given to gcc and cgo for this target +func (t *target) cFlags() []string { + // Compile statically to avoid cross-architecture dynamic linking. + flags := []string{"-Wall", "-Werror", "-static", "-I" + IncludeDir} + + // Architecture-specific flags + if t.SignedChar { + flags = append(flags, "-fsigned-char") + } + if t.LinuxArch == "x86" { + flags = append(flags, fmt.Sprintf("-m%d", t.Bits)) + } + + return flags +} + +// Flags that should be given to mksyscall for this target +func (t *target) mksyscallFlags() (flags []string) { + if t.Bits == 32 { + if t.BigEndian { + flags = append(flags, "-b32") + } else { + flags = append(flags, "-l32") + } + } + + // This flag menas a 64-bit value should use (even, odd)-pair. + if t.GoArch == "arm" || (t.LinuxArch == "mips" && t.Bits == 32) { + flags = append(flags, "-arm") + } + return +} + +// generatePtracePair takes a pair of GOARCH values that can run each +// other's binaries, such as 386 and amd64. It extracts the PtraceRegs +// type for each one. It writes a new file defining the types +// PtraceRegsArch1 and PtraceRegsArch2 and the corresponding functions +// Ptrace{Get,Set}Regs{arch1,arch2}. This permits debugging the other +// binary on a native system. +func generatePtracePair(arch1, arch2 string) error { + def1, err := ptraceDef(arch1) + if err != nil { + return err + } + def2, err := ptraceDef(arch2) + if err != nil { + return err + } + f, err := os.Create(fmt.Sprintf("zptrace%s_linux.go", arch1)) + if err != nil { + return err + } + buf := bufio.NewWriter(f) + fmt.Fprintf(buf, "// Code generated by linux/mkall.go generatePtracePair(%s, %s). DO NOT EDIT.\n", arch1, arch2) + fmt.Fprintf(buf, "\n") + fmt.Fprintf(buf, "// +build linux\n") + fmt.Fprintf(buf, "// +build %s %s\n", arch1, arch2) + fmt.Fprintf(buf, "\n") + fmt.Fprintf(buf, "package unix\n") + fmt.Fprintf(buf, "\n") + fmt.Fprintf(buf, "%s\n", `import "unsafe"`) + fmt.Fprintf(buf, "\n") + writeOnePtrace(buf, arch1, def1) + fmt.Fprintf(buf, "\n") + writeOnePtrace(buf, arch2, def2) + if err := buf.Flush(); err != nil { + return err + } + if err := f.Close(); err != nil { + return err + } + return nil +} + +// ptraceDef returns the definition of PtraceRegs for arch. +func ptraceDef(arch string) (string, error) { + filename := fmt.Sprintf("ztypes_linux_%s.go", arch) + data, err := ioutil.ReadFile(filename) + if err != nil { + return "", fmt.Errorf("reading %s: %v", filename, err) + } + start := bytes.Index(data, []byte("type PtraceRegs struct")) + if start < 0 { + return "", fmt.Errorf("%s: no definition of PtraceRegs", filename) + } + data = data[start:] + end := bytes.Index(data, []byte("\n}\n")) + if end < 0 { + return "", fmt.Errorf("%s: can't find end of PtraceRegs definition", filename) + } + return string(data[:end+2]), nil +} + +// writeOnePtrace writes out the ptrace definitions for arch. +func writeOnePtrace(w io.Writer, arch, def string) { + uarch := string(unicode.ToUpper(rune(arch[0]))) + arch[1:] + fmt.Fprintf(w, "// PtraceRegs%s is the registers used by %s binaries.\n", uarch, arch) + fmt.Fprintf(w, "%s\n", strings.Replace(def, "PtraceRegs", "PtraceRegs"+uarch, 1)) + fmt.Fprintf(w, "\n") + fmt.Fprintf(w, "// PtraceGetRegs%s fetches the registers used by %s binaries.\n", uarch, arch) + fmt.Fprintf(w, "func PtraceGetRegs%s(pid int, regsout *PtraceRegs%s) error {\n", uarch, uarch) + fmt.Fprintf(w, "\treturn ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))\n") + fmt.Fprintf(w, "}\n") + fmt.Fprintf(w, "\n") + fmt.Fprintf(w, "// PtraceSetRegs%s sets the registers used by %s binaries.\n", uarch, arch) + fmt.Fprintf(w, "func PtraceSetRegs%s(pid int, regs *PtraceRegs%s) error {\n", uarch, uarch) + fmt.Fprintf(w, "\treturn ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))\n") + fmt.Fprintf(w, "}\n") +} + +// cCode is compiled for the target architecture, and the resulting data section is carved for +// the statically initialized bit masks. +const cCode = ` +// Bit fields are used in some system calls and other ABIs, but their memory layout is +// implementation-defined [1]. Even with formal ABIs, bit fields are a source of subtle bugs [2]. +// Here we generate the offsets for all 64 bits in an uint64. +// 1: http://en.cppreference.com/w/c/language/bit_field +// 2: https://lwn.net/Articles/478657/ + +#include + +struct bitfield { + union { + uint64_t val; + struct { + uint64_t u64_bit_0 : 1; + uint64_t u64_bit_1 : 1; + uint64_t u64_bit_2 : 1; + uint64_t u64_bit_3 : 1; + uint64_t u64_bit_4 : 1; + uint64_t u64_bit_5 : 1; + uint64_t u64_bit_6 : 1; + uint64_t u64_bit_7 : 1; + uint64_t u64_bit_8 : 1; + uint64_t u64_bit_9 : 1; + uint64_t u64_bit_10 : 1; + uint64_t u64_bit_11 : 1; + uint64_t u64_bit_12 : 1; + uint64_t u64_bit_13 : 1; + uint64_t u64_bit_14 : 1; + uint64_t u64_bit_15 : 1; + uint64_t u64_bit_16 : 1; + uint64_t u64_bit_17 : 1; + uint64_t u64_bit_18 : 1; + uint64_t u64_bit_19 : 1; + uint64_t u64_bit_20 : 1; + uint64_t u64_bit_21 : 1; + uint64_t u64_bit_22 : 1; + uint64_t u64_bit_23 : 1; + uint64_t u64_bit_24 : 1; + uint64_t u64_bit_25 : 1; + uint64_t u64_bit_26 : 1; + uint64_t u64_bit_27 : 1; + uint64_t u64_bit_28 : 1; + uint64_t u64_bit_29 : 1; + uint64_t u64_bit_30 : 1; + uint64_t u64_bit_31 : 1; + uint64_t u64_bit_32 : 1; + uint64_t u64_bit_33 : 1; + uint64_t u64_bit_34 : 1; + uint64_t u64_bit_35 : 1; + uint64_t u64_bit_36 : 1; + uint64_t u64_bit_37 : 1; + uint64_t u64_bit_38 : 1; + uint64_t u64_bit_39 : 1; + uint64_t u64_bit_40 : 1; + uint64_t u64_bit_41 : 1; + uint64_t u64_bit_42 : 1; + uint64_t u64_bit_43 : 1; + uint64_t u64_bit_44 : 1; + uint64_t u64_bit_45 : 1; + uint64_t u64_bit_46 : 1; + uint64_t u64_bit_47 : 1; + uint64_t u64_bit_48 : 1; + uint64_t u64_bit_49 : 1; + uint64_t u64_bit_50 : 1; + uint64_t u64_bit_51 : 1; + uint64_t u64_bit_52 : 1; + uint64_t u64_bit_53 : 1; + uint64_t u64_bit_54 : 1; + uint64_t u64_bit_55 : 1; + uint64_t u64_bit_56 : 1; + uint64_t u64_bit_57 : 1; + uint64_t u64_bit_58 : 1; + uint64_t u64_bit_59 : 1; + uint64_t u64_bit_60 : 1; + uint64_t u64_bit_61 : 1; + uint64_t u64_bit_62 : 1; + uint64_t u64_bit_63 : 1; + }; + }; +}; + +struct bitfield masks[] = { + {.u64_bit_0 = 1}, + {.u64_bit_1 = 1}, + {.u64_bit_2 = 1}, + {.u64_bit_3 = 1}, + {.u64_bit_4 = 1}, + {.u64_bit_5 = 1}, + {.u64_bit_6 = 1}, + {.u64_bit_7 = 1}, + {.u64_bit_8 = 1}, + {.u64_bit_9 = 1}, + {.u64_bit_10 = 1}, + {.u64_bit_11 = 1}, + {.u64_bit_12 = 1}, + {.u64_bit_13 = 1}, + {.u64_bit_14 = 1}, + {.u64_bit_15 = 1}, + {.u64_bit_16 = 1}, + {.u64_bit_17 = 1}, + {.u64_bit_18 = 1}, + {.u64_bit_19 = 1}, + {.u64_bit_20 = 1}, + {.u64_bit_21 = 1}, + {.u64_bit_22 = 1}, + {.u64_bit_23 = 1}, + {.u64_bit_24 = 1}, + {.u64_bit_25 = 1}, + {.u64_bit_26 = 1}, + {.u64_bit_27 = 1}, + {.u64_bit_28 = 1}, + {.u64_bit_29 = 1}, + {.u64_bit_30 = 1}, + {.u64_bit_31 = 1}, + {.u64_bit_32 = 1}, + {.u64_bit_33 = 1}, + {.u64_bit_34 = 1}, + {.u64_bit_35 = 1}, + {.u64_bit_36 = 1}, + {.u64_bit_37 = 1}, + {.u64_bit_38 = 1}, + {.u64_bit_39 = 1}, + {.u64_bit_40 = 1}, + {.u64_bit_41 = 1}, + {.u64_bit_42 = 1}, + {.u64_bit_43 = 1}, + {.u64_bit_44 = 1}, + {.u64_bit_45 = 1}, + {.u64_bit_46 = 1}, + {.u64_bit_47 = 1}, + {.u64_bit_48 = 1}, + {.u64_bit_49 = 1}, + {.u64_bit_50 = 1}, + {.u64_bit_51 = 1}, + {.u64_bit_52 = 1}, + {.u64_bit_53 = 1}, + {.u64_bit_54 = 1}, + {.u64_bit_55 = 1}, + {.u64_bit_56 = 1}, + {.u64_bit_57 = 1}, + {.u64_bit_58 = 1}, + {.u64_bit_59 = 1}, + {.u64_bit_60 = 1}, + {.u64_bit_61 = 1}, + {.u64_bit_62 = 1}, + {.u64_bit_63 = 1} +}; + +int main(int argc, char **argv) { + struct bitfield *mask_ptr = &masks[0]; + return mask_ptr->val; +} + +` diff --git a/api/vendor/golang.org/x/sys/unix/linux/mksysnum.pl b/api/vendor/golang.org/x/sys/unix/linux/mksysnum.pl new file mode 100755 index 0000000..63fd800 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/linux/mksysnum.pl @@ -0,0 +1,85 @@ +#!/usr/bin/env perl +# 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. + +use strict; + +if($ENV{'GOARCH'} eq "" || $ENV{'GOOS'} eq "") { + print STDERR "GOARCH or GOOS not defined in environment\n"; + exit 1; +} + +# Check that we are using the new build system if we should +if($ENV{'GOLANG_SYS_BUILD'} ne "docker") { + print STDERR "In the new build system, mksysnum should not be called directly.\n"; + print STDERR "See README.md\n"; + exit 1; +} + +my $command = "$0 ". join(' ', @ARGV); + +print < 999){ + # ignore deprecated syscalls that are no longer implemented + # https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/uapi/asm-generic/unistd.h?id=refs/heads/master#n716 + return; + } + $name =~ y/a-z/A-Z/; + $num = $num + $offset; + print " SYS_$name = $num;\n"; +} + +my $prev; +open(CC, "$ENV{'CC'} -E -dD @ARGV |") || die "can't run $ENV{'CC'}"; +while(){ + if(/^#define __NR_Linux\s+([0-9]+)/){ + # mips/mips64: extract offset + $offset = $1; + } + elsif(/^#define __NR(\w*)_SYSCALL_BASE\s+([0-9]+)/){ + # arm: extract offset + $offset = $1; + } + elsif(/^#define __NR_syscalls\s+/) { + # ignore redefinitions of __NR_syscalls + } + elsif(/^#define __NR_(\w*)Linux_syscalls\s+/) { + # mips/mips64: ignore definitions about the number of syscalls + } + elsif(/^#define __NR_(\w+)\s+([0-9]+)/){ + $prev = $2; + fmt($1, $2); + } + elsif(/^#define __NR3264_(\w+)\s+([0-9]+)/){ + $prev = $2; + fmt($1, $2); + } + elsif(/^#define __NR_(\w+)\s+\(\w+\+\s*([0-9]+)\)/){ + fmt($1, $prev+$2) + } + elsif(/^#define __NR_(\w+)\s+\(__NR_Linux \+ ([0-9]+)/){ + fmt($1, $2); + } + elsif(/^#define __NR_(\w+)\s+\(__NR_SYSCALL_BASE \+ ([0-9]+)/){ + fmt($1, $2); + } +} + +print < +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// abi/abi.h generated by mkall.go. +#include "abi/abi.h" + +// On mips64, the glibc stat and kernel stat do not agree +#if (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI64) + +// Use the stat defined by the kernel with a few modifications. These are: +// * The time fields (like st_atime and st_atimensec) use the timespec +// struct (like st_atim) for consistency with the glibc fields. +// * The padding fields get different names to not break compatibility. +// * st_blocks is signed, again for compatibility. +struct stat { + unsigned int st_dev; + unsigned int st_pad1[3]; // Reserved for st_dev expansion + + unsigned long st_ino; + + mode_t st_mode; + __u32 st_nlink; + + uid_t st_uid; + gid_t st_gid; + + unsigned int st_rdev; + unsigned int st_pad2[3]; // Reserved for st_rdev expansion + + off_t st_size; + + // These are declared as separate fields in the kernel. Here we use + // the timespec struct for consistency with the other stat structs. + struct timespec st_atim; + struct timespec st_mtim; + struct timespec st_ctim; + + unsigned int st_blksize; + unsigned int st_pad4; + + long st_blocks; +}; + +// These are needed because we do not include fcntl.h or sys/types.h +#include +#include + +#else + +// Use the stat defined by glibc +#include +#include + +#endif + +// These are defined in linux/fcntl.h, but including it globally causes +// conflicts with fcntl.h +#ifndef AT_STATX_SYNC_TYPE +# define AT_STATX_SYNC_TYPE 0x6000 // Type of synchronisation required from statx() +#endif +#ifndef AT_STATX_SYNC_AS_STAT +# define AT_STATX_SYNC_AS_STAT 0x0000 // - Do whatever stat() does +#endif +#ifndef AT_STATX_FORCE_SYNC +# define AT_STATX_FORCE_SYNC 0x2000 // - Force the attributes to be sync'd with the server +#endif +#ifndef AT_STATX_DONT_SYNC +# define AT_STATX_DONT_SYNC 0x4000 // - Don't sync attributes with the server +#endif + +#ifdef TCSETS2 +// On systems that have "struct termios2" use this as type Termios. +typedef struct termios2 termios_t; +#else +typedef struct termios termios_t; +#endif + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_ll s5; + struct sockaddr_nl s6; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +// copied from /usr/include/bluetooth/hci.h +struct sockaddr_hci { + sa_family_t hci_family; + unsigned short hci_dev; + unsigned short hci_channel; +}; + +// copied from /usr/include/bluetooth/bluetooth.h +#define BDADDR_BREDR 0x00 +#define BDADDR_LE_PUBLIC 0x01 +#define BDADDR_LE_RANDOM 0x02 + +// copied from /usr/include/bluetooth/l2cap.h +struct sockaddr_l2 { + sa_family_t l2_family; + unsigned short l2_psm; + uint8_t l2_bdaddr[6]; + unsigned short l2_cid; + uint8_t l2_bdaddr_type; +}; + +// copied from /usr/include/linux/un.h +struct my_sockaddr_un { + sa_family_t sun_family; +#if defined(__ARM_EABI__) || defined(__powerpc64__) + // on ARM char is by default unsigned + signed char sun_path[108]; +#else + char sun_path[108]; +#endif +}; + +#ifdef __ARM_EABI__ +typedef struct user_regs PtraceRegs; +#elif defined(__aarch64__) +typedef struct user_pt_regs PtraceRegs; +#elif defined(__mips__) || defined(__powerpc64__) +typedef struct pt_regs PtraceRegs; +#elif defined(__s390x__) +typedef struct _user_regs_struct PtraceRegs; +#elif defined(__sparc__) +#include +typedef struct pt_regs PtraceRegs; +#else +typedef struct user_regs_struct PtraceRegs; +#endif + +#if defined(__s390x__) +typedef struct _user_psw_struct ptracePsw; +typedef struct _user_fpregs_struct ptraceFpregs; +typedef struct _user_per_struct ptracePer; +#else +typedef struct {} ptracePsw; +typedef struct {} ptraceFpregs; +typedef struct {} ptracePer; +#endif + +// The real epoll_event is a union, and godefs doesn't handle it well. +struct my_epoll_event { + uint32_t events; +#if defined(__ARM_EABI__) || defined(__aarch64__) || (defined(__mips__) && _MIPS_SIM == _ABIO32) + // padding is not specified in linux/eventpoll.h but added to conform to the + // alignment requirements of EABI + int32_t padFd; +#elif defined(__powerpc64__) || defined(__s390x__) || defined(__sparc__) + int32_t _padFd; +#endif + int32_t fd; + int32_t pad; +}; + +// Copied from with the following modifications: +// 1) bit field after read_format redeclared as '__u64 bits' to make it +// accessible from Go +// 2) collapsed the unions, to avoid confusing godoc for the generated output +// (e.g. having to use BpAddr as an extension of Config) +struct perf_event_attr_go { + __u32 type; + + __u32 size; + __u64 config; + + // union { + // __u64 sample_period; + // __u64 sample_freq; + // }; + __u64 sample; + + __u64 sample_type; + __u64 read_format; + + // Replaces the bit field. Flags are defined as constants. + __u64 bits; + + // union { + // __u32 wakeup_events; + // __u32 wakeup_watermark; + // }; + __u32 wakeup; + + __u32 bp_type; + + // union { + // __u64 bp_addr; + // __u64 config1; + // }; + __u64 ext1; + + // union { + // __u64 bp_len; + // __u64 config2; + // }; + __u64 ext2; + + __u64 branch_sample_type; + + __u64 sample_regs_user; + + __u32 sample_stack_user; + + __s32 clockid; + __u64 sample_regs_intr; + __u32 aux_watermark; + __u32 __reserved_2; +}; + +*/ +import "C" + +// Machine characteristics; for internal use. + +const ( + sizeofPtr = C.sizeofPtr + sizeofShort = C.sizeof_short + sizeofInt = C.sizeof_int + sizeofLong = C.sizeof_long + sizeofLongLong = C.sizeof_longlong + PathMax = C.PATH_MAX +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +type Timex C.struct_timex + +type Time_t C.time_t + +type Tms C.struct_tms + +type Utimbuf C.struct_utimbuf + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +type Stat_t C.struct_stat + +type StatxTimestamp C.struct_statx_timestamp + +type Statx_t C.struct_statx + +type Dirent C.struct_dirent + +type Fsid C.fsid_t + +type Flock_t C.struct_flock + +// Filesystem Encryption + +type FscryptPolicy C.struct_fscrypt_policy + +type FscryptKey C.struct_fscrypt_key + +// Structure for Keyctl + +type KeyctlDHParams C.struct_keyctl_dh_params + +// Advice to Fadvise + +const ( + FADV_NORMAL = C.POSIX_FADV_NORMAL + FADV_RANDOM = C.POSIX_FADV_RANDOM + FADV_SEQUENTIAL = C.POSIX_FADV_SEQUENTIAL + FADV_WILLNEED = C.POSIX_FADV_WILLNEED + FADV_DONTNEED = C.POSIX_FADV_DONTNEED + FADV_NOREUSE = C.POSIX_FADV_NOREUSE +) + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_my_sockaddr_un + +type RawSockaddrLinklayer C.struct_sockaddr_ll + +type RawSockaddrNetlink C.struct_sockaddr_nl + +type RawSockaddrHCI C.struct_sockaddr_hci + +type RawSockaddrL2 C.struct_sockaddr_l2 + +type RawSockaddrCAN C.struct_sockaddr_can + +type RawSockaddrALG C.struct_sockaddr_alg + +type RawSockaddrVM C.struct_sockaddr_vm + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPMreqn C.struct_ip_mreqn + +type IPv6Mreq C.struct_ipv6_mreq + +type PacketMreq C.struct_packet_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet4Pktinfo C.struct_in_pktinfo + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +type Ucred C.struct_ucred + +type TCPInfo C.struct_tcp_info + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrLinklayer = C.sizeof_struct_sockaddr_ll + SizeofSockaddrNetlink = C.sizeof_struct_sockaddr_nl + SizeofSockaddrHCI = C.sizeof_struct_sockaddr_hci + SizeofSockaddrL2 = C.sizeof_struct_sockaddr_l2 + SizeofSockaddrCAN = C.sizeof_struct_sockaddr_can + SizeofSockaddrALG = C.sizeof_struct_sockaddr_alg + SizeofSockaddrVM = C.sizeof_struct_sockaddr_vm + SizeofLinger = C.sizeof_struct_linger + SizeofIovec = C.sizeof_struct_iovec + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPMreqn = C.sizeof_struct_ip_mreqn + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofPacketMreq = C.sizeof_struct_packet_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet4Pktinfo = C.sizeof_struct_in_pktinfo + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter + SizeofUcred = C.sizeof_struct_ucred + SizeofTCPInfo = C.sizeof_struct_tcp_info +) + +// Netlink routing and interface messages + +const ( + IFA_UNSPEC = C.IFA_UNSPEC + IFA_ADDRESS = C.IFA_ADDRESS + IFA_LOCAL = C.IFA_LOCAL + IFA_LABEL = C.IFA_LABEL + IFA_BROADCAST = C.IFA_BROADCAST + IFA_ANYCAST = C.IFA_ANYCAST + IFA_CACHEINFO = C.IFA_CACHEINFO + IFA_MULTICAST = C.IFA_MULTICAST + IFLA_UNSPEC = C.IFLA_UNSPEC + IFLA_ADDRESS = C.IFLA_ADDRESS + IFLA_BROADCAST = C.IFLA_BROADCAST + IFLA_IFNAME = C.IFLA_IFNAME + IFLA_MTU = C.IFLA_MTU + IFLA_LINK = C.IFLA_LINK + IFLA_QDISC = C.IFLA_QDISC + IFLA_STATS = C.IFLA_STATS + IFLA_COST = C.IFLA_COST + IFLA_PRIORITY = C.IFLA_PRIORITY + IFLA_MASTER = C.IFLA_MASTER + IFLA_WIRELESS = C.IFLA_WIRELESS + IFLA_PROTINFO = C.IFLA_PROTINFO + IFLA_TXQLEN = C.IFLA_TXQLEN + IFLA_MAP = C.IFLA_MAP + IFLA_WEIGHT = C.IFLA_WEIGHT + IFLA_OPERSTATE = C.IFLA_OPERSTATE + IFLA_LINKMODE = C.IFLA_LINKMODE + IFLA_LINKINFO = C.IFLA_LINKINFO + IFLA_NET_NS_PID = C.IFLA_NET_NS_PID + IFLA_IFALIAS = C.IFLA_IFALIAS + IFLA_NUM_VF = C.IFLA_NUM_VF + IFLA_VFINFO_LIST = C.IFLA_VFINFO_LIST + IFLA_STATS64 = C.IFLA_STATS64 + IFLA_VF_PORTS = C.IFLA_VF_PORTS + IFLA_PORT_SELF = C.IFLA_PORT_SELF + IFLA_AF_SPEC = C.IFLA_AF_SPEC + IFLA_GROUP = C.IFLA_GROUP + IFLA_NET_NS_FD = C.IFLA_NET_NS_FD + IFLA_EXT_MASK = C.IFLA_EXT_MASK + IFLA_PROMISCUITY = C.IFLA_PROMISCUITY + IFLA_NUM_TX_QUEUES = C.IFLA_NUM_TX_QUEUES + IFLA_NUM_RX_QUEUES = C.IFLA_NUM_RX_QUEUES + IFLA_CARRIER = C.IFLA_CARRIER + IFLA_PHYS_PORT_ID = C.IFLA_PHYS_PORT_ID + IFLA_CARRIER_CHANGES = C.IFLA_CARRIER_CHANGES + IFLA_PHYS_SWITCH_ID = C.IFLA_PHYS_SWITCH_ID + IFLA_LINK_NETNSID = C.IFLA_LINK_NETNSID + IFLA_PHYS_PORT_NAME = C.IFLA_PHYS_PORT_NAME + IFLA_PROTO_DOWN = C.IFLA_PROTO_DOWN + IFLA_GSO_MAX_SEGS = C.IFLA_GSO_MAX_SEGS + IFLA_GSO_MAX_SIZE = C.IFLA_GSO_MAX_SIZE + IFLA_PAD = C.IFLA_PAD + IFLA_XDP = C.IFLA_XDP + IFLA_EVENT = C.IFLA_EVENT + IFLA_NEW_NETNSID = C.IFLA_NEW_NETNSID + IFLA_IF_NETNSID = C.IFLA_IF_NETNSID + IFLA_MAX = C.IFLA_MAX + RT_SCOPE_UNIVERSE = C.RT_SCOPE_UNIVERSE + RT_SCOPE_SITE = C.RT_SCOPE_SITE + RT_SCOPE_LINK = C.RT_SCOPE_LINK + RT_SCOPE_HOST = C.RT_SCOPE_HOST + RT_SCOPE_NOWHERE = C.RT_SCOPE_NOWHERE + RT_TABLE_UNSPEC = C.RT_TABLE_UNSPEC + RT_TABLE_COMPAT = C.RT_TABLE_COMPAT + RT_TABLE_DEFAULT = C.RT_TABLE_DEFAULT + RT_TABLE_MAIN = C.RT_TABLE_MAIN + RT_TABLE_LOCAL = C.RT_TABLE_LOCAL + RT_TABLE_MAX = C.RT_TABLE_MAX + RTA_UNSPEC = C.RTA_UNSPEC + RTA_DST = C.RTA_DST + RTA_SRC = C.RTA_SRC + RTA_IIF = C.RTA_IIF + RTA_OIF = C.RTA_OIF + RTA_GATEWAY = C.RTA_GATEWAY + RTA_PRIORITY = C.RTA_PRIORITY + RTA_PREFSRC = C.RTA_PREFSRC + RTA_METRICS = C.RTA_METRICS + RTA_MULTIPATH = C.RTA_MULTIPATH + RTA_FLOW = C.RTA_FLOW + RTA_CACHEINFO = C.RTA_CACHEINFO + RTA_TABLE = C.RTA_TABLE + RTN_UNSPEC = C.RTN_UNSPEC + RTN_UNICAST = C.RTN_UNICAST + RTN_LOCAL = C.RTN_LOCAL + RTN_BROADCAST = C.RTN_BROADCAST + RTN_ANYCAST = C.RTN_ANYCAST + RTN_MULTICAST = C.RTN_MULTICAST + RTN_BLACKHOLE = C.RTN_BLACKHOLE + RTN_UNREACHABLE = C.RTN_UNREACHABLE + RTN_PROHIBIT = C.RTN_PROHIBIT + RTN_THROW = C.RTN_THROW + RTN_NAT = C.RTN_NAT + RTN_XRESOLVE = C.RTN_XRESOLVE + RTNLGRP_NONE = C.RTNLGRP_NONE + RTNLGRP_LINK = C.RTNLGRP_LINK + RTNLGRP_NOTIFY = C.RTNLGRP_NOTIFY + RTNLGRP_NEIGH = C.RTNLGRP_NEIGH + RTNLGRP_TC = C.RTNLGRP_TC + RTNLGRP_IPV4_IFADDR = C.RTNLGRP_IPV4_IFADDR + RTNLGRP_IPV4_MROUTE = C.RTNLGRP_IPV4_MROUTE + RTNLGRP_IPV4_ROUTE = C.RTNLGRP_IPV4_ROUTE + RTNLGRP_IPV4_RULE = C.RTNLGRP_IPV4_RULE + RTNLGRP_IPV6_IFADDR = C.RTNLGRP_IPV6_IFADDR + RTNLGRP_IPV6_MROUTE = C.RTNLGRP_IPV6_MROUTE + RTNLGRP_IPV6_ROUTE = C.RTNLGRP_IPV6_ROUTE + RTNLGRP_IPV6_IFINFO = C.RTNLGRP_IPV6_IFINFO + RTNLGRP_IPV6_PREFIX = C.RTNLGRP_IPV6_PREFIX + RTNLGRP_IPV6_RULE = C.RTNLGRP_IPV6_RULE + RTNLGRP_ND_USEROPT = C.RTNLGRP_ND_USEROPT + SizeofNlMsghdr = C.sizeof_struct_nlmsghdr + SizeofNlMsgerr = C.sizeof_struct_nlmsgerr + SizeofRtGenmsg = C.sizeof_struct_rtgenmsg + SizeofNlAttr = C.sizeof_struct_nlattr + SizeofRtAttr = C.sizeof_struct_rtattr + SizeofIfInfomsg = C.sizeof_struct_ifinfomsg + SizeofIfAddrmsg = C.sizeof_struct_ifaddrmsg + SizeofRtMsg = C.sizeof_struct_rtmsg + SizeofRtNexthop = C.sizeof_struct_rtnexthop +) + +type NlMsghdr C.struct_nlmsghdr + +type NlMsgerr C.struct_nlmsgerr + +type RtGenmsg C.struct_rtgenmsg + +type NlAttr C.struct_nlattr + +type RtAttr C.struct_rtattr + +type IfInfomsg C.struct_ifinfomsg + +type IfAddrmsg C.struct_ifaddrmsg + +type RtMsg C.struct_rtmsg + +type RtNexthop C.struct_rtnexthop + +// Linux socket filter + +const ( + SizeofSockFilter = C.sizeof_struct_sock_filter + SizeofSockFprog = C.sizeof_struct_sock_fprog +) + +type SockFilter C.struct_sock_filter + +type SockFprog C.struct_sock_fprog + +// Inotify + +type InotifyEvent C.struct_inotify_event + +const SizeofInotifyEvent = C.sizeof_struct_inotify_event + +// Ptrace + +// Register structures +type PtraceRegs C.PtraceRegs + +// Structures contained in PtraceRegs on s390x (exported by mkpost.go) +type PtracePsw C.ptracePsw + +type PtraceFpregs C.ptraceFpregs + +type PtracePer C.ptracePer + +// Misc + +type FdSet C.fd_set + +type Sysinfo_t C.struct_sysinfo + +type Utsname C.struct_utsname + +type Ustat_t C.struct_ustat + +type EpollEvent C.struct_my_epoll_event + +const ( + AT_EMPTY_PATH = C.AT_EMPTY_PATH + AT_FDCWD = C.AT_FDCWD + AT_NO_AUTOMOUNT = C.AT_NO_AUTOMOUNT + AT_REMOVEDIR = C.AT_REMOVEDIR + + AT_STATX_SYNC_AS_STAT = C.AT_STATX_SYNC_AS_STAT + AT_STATX_FORCE_SYNC = C.AT_STATX_FORCE_SYNC + AT_STATX_DONT_SYNC = C.AT_STATX_DONT_SYNC + + AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW +) + +type PollFd C.struct_pollfd + +const ( + POLLIN = C.POLLIN + POLLPRI = C.POLLPRI + POLLOUT = C.POLLOUT + POLLRDHUP = C.POLLRDHUP + POLLERR = C.POLLERR + POLLHUP = C.POLLHUP + POLLNVAL = C.POLLNVAL +) + +type Sigset_t C.sigset_t + +const RNDGETENTCNT = C.RNDGETENTCNT + +const PERF_IOC_FLAG_GROUP = C.PERF_IOC_FLAG_GROUP + +// Terminal handling + +type Termios C.termios_t + +type Winsize C.struct_winsize + +// Taskstats and cgroup stats. + +type Taskstats C.struct_taskstats + +const ( + TASKSTATS_CMD_UNSPEC = C.TASKSTATS_CMD_UNSPEC + TASKSTATS_CMD_GET = C.TASKSTATS_CMD_GET + TASKSTATS_CMD_NEW = C.TASKSTATS_CMD_NEW + TASKSTATS_TYPE_UNSPEC = C.TASKSTATS_TYPE_UNSPEC + TASKSTATS_TYPE_PID = C.TASKSTATS_TYPE_PID + TASKSTATS_TYPE_TGID = C.TASKSTATS_TYPE_TGID + TASKSTATS_TYPE_STATS = C.TASKSTATS_TYPE_STATS + TASKSTATS_TYPE_AGGR_PID = C.TASKSTATS_TYPE_AGGR_PID + TASKSTATS_TYPE_AGGR_TGID = C.TASKSTATS_TYPE_AGGR_TGID + TASKSTATS_TYPE_NULL = C.TASKSTATS_TYPE_NULL + TASKSTATS_CMD_ATTR_UNSPEC = C.TASKSTATS_CMD_ATTR_UNSPEC + TASKSTATS_CMD_ATTR_PID = C.TASKSTATS_CMD_ATTR_PID + TASKSTATS_CMD_ATTR_TGID = C.TASKSTATS_CMD_ATTR_TGID + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = C.TASKSTATS_CMD_ATTR_REGISTER_CPUMASK + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = C.TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK +) + +type CGroupStats C.struct_cgroupstats + +const ( + CGROUPSTATS_CMD_UNSPEC = C.__TASKSTATS_CMD_MAX + CGROUPSTATS_CMD_GET = C.CGROUPSTATS_CMD_GET + CGROUPSTATS_CMD_NEW = C.CGROUPSTATS_CMD_NEW + CGROUPSTATS_TYPE_UNSPEC = C.CGROUPSTATS_TYPE_UNSPEC + CGROUPSTATS_TYPE_CGROUP_STATS = C.CGROUPSTATS_TYPE_CGROUP_STATS + CGROUPSTATS_CMD_ATTR_UNSPEC = C.CGROUPSTATS_CMD_ATTR_UNSPEC + CGROUPSTATS_CMD_ATTR_FD = C.CGROUPSTATS_CMD_ATTR_FD +) + +// Generic netlink + +type Genlmsghdr C.struct_genlmsghdr + +const ( + CTRL_CMD_UNSPEC = C.CTRL_CMD_UNSPEC + CTRL_CMD_NEWFAMILY = C.CTRL_CMD_NEWFAMILY + CTRL_CMD_DELFAMILY = C.CTRL_CMD_DELFAMILY + CTRL_CMD_GETFAMILY = C.CTRL_CMD_GETFAMILY + CTRL_CMD_NEWOPS = C.CTRL_CMD_NEWOPS + CTRL_CMD_DELOPS = C.CTRL_CMD_DELOPS + CTRL_CMD_GETOPS = C.CTRL_CMD_GETOPS + CTRL_CMD_NEWMCAST_GRP = C.CTRL_CMD_NEWMCAST_GRP + CTRL_CMD_DELMCAST_GRP = C.CTRL_CMD_DELMCAST_GRP + CTRL_CMD_GETMCAST_GRP = C.CTRL_CMD_GETMCAST_GRP + CTRL_ATTR_UNSPEC = C.CTRL_ATTR_UNSPEC + CTRL_ATTR_FAMILY_ID = C.CTRL_ATTR_FAMILY_ID + CTRL_ATTR_FAMILY_NAME = C.CTRL_ATTR_FAMILY_NAME + CTRL_ATTR_VERSION = C.CTRL_ATTR_VERSION + CTRL_ATTR_HDRSIZE = C.CTRL_ATTR_HDRSIZE + CTRL_ATTR_MAXATTR = C.CTRL_ATTR_MAXATTR + CTRL_ATTR_OPS = C.CTRL_ATTR_OPS + CTRL_ATTR_MCAST_GROUPS = C.CTRL_ATTR_MCAST_GROUPS + CTRL_ATTR_OP_UNSPEC = C.CTRL_ATTR_OP_UNSPEC + CTRL_ATTR_OP_ID = C.CTRL_ATTR_OP_ID + CTRL_ATTR_OP_FLAGS = C.CTRL_ATTR_OP_FLAGS + CTRL_ATTR_MCAST_GRP_UNSPEC = C.CTRL_ATTR_MCAST_GRP_UNSPEC + CTRL_ATTR_MCAST_GRP_NAME = C.CTRL_ATTR_MCAST_GRP_NAME + CTRL_ATTR_MCAST_GRP_ID = C.CTRL_ATTR_MCAST_GRP_ID +) + +// CPU affinity + +type cpuMask C.__cpu_mask + +const ( + _CPU_SETSIZE = C.__CPU_SETSIZE + _NCPUBITS = C.__NCPUBITS +) + +// Bluetooth + +const ( + BDADDR_BREDR = C.BDADDR_BREDR + BDADDR_LE_PUBLIC = C.BDADDR_LE_PUBLIC + BDADDR_LE_RANDOM = C.BDADDR_LE_RANDOM +) + +// Perf subsystem + +type PerfEventAttr C.struct_perf_event_attr_go + +type PerfEventMmapPage C.struct_perf_event_mmap_page + +// Bit field in struct perf_event_attr expanded as flags. +// Set these on PerfEventAttr.Bits by ORing them together. +const ( + PerfBitDisabled uint64 = CBitFieldMaskBit0 + PerfBitInherit = CBitFieldMaskBit1 + PerfBitPinned = CBitFieldMaskBit2 + PerfBitExclusive = CBitFieldMaskBit3 + PerfBitExcludeUser = CBitFieldMaskBit4 + PerfBitExcludeKernel = CBitFieldMaskBit5 + PerfBitExcludeHv = CBitFieldMaskBit6 + PerfBitExcludeIdle = CBitFieldMaskBit7 + PerfBitMmap = CBitFieldMaskBit8 + PerfBitComm = CBitFieldMaskBit9 + PerfBitFreq = CBitFieldMaskBit10 + PerfBitInheritStat = CBitFieldMaskBit11 + PerfBitEnableOnExec = CBitFieldMaskBit12 + PerfBitTask = CBitFieldMaskBit13 + PerfBitWatermark = CBitFieldMaskBit14 + PerfBitPreciseIPBit1 = CBitFieldMaskBit15 + PerfBitPreciseIPBit2 = CBitFieldMaskBit16 + PerfBitMmapData = CBitFieldMaskBit17 + PerfBitSampleIDAll = CBitFieldMaskBit18 + PerfBitExcludeHost = CBitFieldMaskBit19 + PerfBitExcludeGuest = CBitFieldMaskBit20 + PerfBitExcludeCallchainKernel = CBitFieldMaskBit21 + PerfBitExcludeCallchainUser = CBitFieldMaskBit22 + PerfBitMmap2 = CBitFieldMaskBit23 + PerfBitCommExec = CBitFieldMaskBit24 + PerfBitUseClockID = CBitFieldMaskBit25 + PerfBitContextSwitch = CBitFieldMaskBit26 +) + +const ( + PERF_TYPE_HARDWARE = C.PERF_TYPE_HARDWARE + PERF_TYPE_SOFTWARE = C.PERF_TYPE_SOFTWARE + PERF_TYPE_TRACEPOINT = C.PERF_TYPE_TRACEPOINT + PERF_TYPE_HW_CACHE = C.PERF_TYPE_HW_CACHE + PERF_TYPE_RAW = C.PERF_TYPE_RAW + PERF_TYPE_BREAKPOINT = C.PERF_TYPE_BREAKPOINT + + PERF_COUNT_HW_CPU_CYCLES = C.PERF_COUNT_HW_CPU_CYCLES + PERF_COUNT_HW_INSTRUCTIONS = C.PERF_COUNT_HW_INSTRUCTIONS + PERF_COUNT_HW_CACHE_REFERENCES = C.PERF_COUNT_HW_CACHE_REFERENCES + PERF_COUNT_HW_CACHE_MISSES = C.PERF_COUNT_HW_CACHE_MISSES + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = C.PERF_COUNT_HW_BRANCH_INSTRUCTIONS + PERF_COUNT_HW_BRANCH_MISSES = C.PERF_COUNT_HW_BRANCH_MISSES + PERF_COUNT_HW_BUS_CYCLES = C.PERF_COUNT_HW_BUS_CYCLES + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = C.PERF_COUNT_HW_STALLED_CYCLES_FRONTEND + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = C.PERF_COUNT_HW_STALLED_CYCLES_BACKEND + PERF_COUNT_HW_REF_CPU_CYCLES = C.PERF_COUNT_HW_REF_CPU_CYCLES + + PERF_COUNT_HW_CACHE_L1D = C.PERF_COUNT_HW_CACHE_L1D + PERF_COUNT_HW_CACHE_L1I = C.PERF_COUNT_HW_CACHE_L1I + PERF_COUNT_HW_CACHE_LL = C.PERF_COUNT_HW_CACHE_LL + PERF_COUNT_HW_CACHE_DTLB = C.PERF_COUNT_HW_CACHE_DTLB + PERF_COUNT_HW_CACHE_ITLB = C.PERF_COUNT_HW_CACHE_ITLB + PERF_COUNT_HW_CACHE_BPU = C.PERF_COUNT_HW_CACHE_BPU + PERF_COUNT_HW_CACHE_NODE = C.PERF_COUNT_HW_CACHE_NODE + + PERF_COUNT_HW_CACHE_OP_READ = C.PERF_COUNT_HW_CACHE_OP_READ + PERF_COUNT_HW_CACHE_OP_WRITE = C.PERF_COUNT_HW_CACHE_OP_WRITE + PERF_COUNT_HW_CACHE_OP_PREFETCH = C.PERF_COUNT_HW_CACHE_OP_PREFETCH + + PERF_COUNT_HW_CACHE_RESULT_ACCESS = C.PERF_COUNT_HW_CACHE_RESULT_ACCESS + PERF_COUNT_HW_CACHE_RESULT_MISS = C.PERF_COUNT_HW_CACHE_RESULT_MISS + + PERF_COUNT_SW_CPU_CLOCK = C.PERF_COUNT_SW_CPU_CLOCK + PERF_COUNT_SW_TASK_CLOCK = C.PERF_COUNT_SW_TASK_CLOCK + PERF_COUNT_SW_PAGE_FAULTS = C.PERF_COUNT_SW_PAGE_FAULTS + PERF_COUNT_SW_CONTEXT_SWITCHES = C.PERF_COUNT_SW_CONTEXT_SWITCHES + PERF_COUNT_SW_CPU_MIGRATIONS = C.PERF_COUNT_SW_CPU_MIGRATIONS + PERF_COUNT_SW_PAGE_FAULTS_MIN = C.PERF_COUNT_SW_PAGE_FAULTS_MIN + PERF_COUNT_SW_PAGE_FAULTS_MAJ = C.PERF_COUNT_SW_PAGE_FAULTS_MAJ + PERF_COUNT_SW_ALIGNMENT_FAULTS = C.PERF_COUNT_SW_ALIGNMENT_FAULTS + PERF_COUNT_SW_EMULATION_FAULTS = C.PERF_COUNT_SW_EMULATION_FAULTS + PERF_COUNT_SW_DUMMY = C.PERF_COUNT_SW_DUMMY + + PERF_SAMPLE_IP = C.PERF_SAMPLE_IP + PERF_SAMPLE_TID = C.PERF_SAMPLE_TID + PERF_SAMPLE_TIME = C.PERF_SAMPLE_TIME + PERF_SAMPLE_ADDR = C.PERF_SAMPLE_ADDR + PERF_SAMPLE_READ = C.PERF_SAMPLE_READ + PERF_SAMPLE_CALLCHAIN = C.PERF_SAMPLE_CALLCHAIN + PERF_SAMPLE_ID = C.PERF_SAMPLE_ID + PERF_SAMPLE_CPU = C.PERF_SAMPLE_CPU + PERF_SAMPLE_PERIOD = C.PERF_SAMPLE_PERIOD + PERF_SAMPLE_STREAM_ID = C.PERF_SAMPLE_STREAM_ID + PERF_SAMPLE_RAW = C.PERF_SAMPLE_RAW + PERF_SAMPLE_BRANCH_STACK = C.PERF_SAMPLE_BRANCH_STACK + + PERF_SAMPLE_BRANCH_USER = C.PERF_SAMPLE_BRANCH_USER + PERF_SAMPLE_BRANCH_KERNEL = C.PERF_SAMPLE_BRANCH_KERNEL + PERF_SAMPLE_BRANCH_HV = C.PERF_SAMPLE_BRANCH_HV + PERF_SAMPLE_BRANCH_ANY = C.PERF_SAMPLE_BRANCH_ANY + PERF_SAMPLE_BRANCH_ANY_CALL = C.PERF_SAMPLE_BRANCH_ANY_CALL + PERF_SAMPLE_BRANCH_ANY_RETURN = C.PERF_SAMPLE_BRANCH_ANY_RETURN + PERF_SAMPLE_BRANCH_IND_CALL = C.PERF_SAMPLE_BRANCH_IND_CALL + + PERF_FORMAT_TOTAL_TIME_ENABLED = C.PERF_FORMAT_TOTAL_TIME_ENABLED + PERF_FORMAT_TOTAL_TIME_RUNNING = C.PERF_FORMAT_TOTAL_TIME_RUNNING + PERF_FORMAT_ID = C.PERF_FORMAT_ID + PERF_FORMAT_GROUP = C.PERF_FORMAT_GROUP + + PERF_RECORD_MMAP = C.PERF_RECORD_MMAP + PERF_RECORD_LOST = C.PERF_RECORD_LOST + PERF_RECORD_COMM = C.PERF_RECORD_COMM + PERF_RECORD_EXIT = C.PERF_RECORD_EXIT + PERF_RECORD_THROTTLE = C.PERF_RECORD_THROTTLE + PERF_RECORD_UNTHROTTLE = C.PERF_RECORD_UNTHROTTLE + PERF_RECORD_FORK = C.PERF_RECORD_FORK + PERF_RECORD_READ = C.PERF_RECORD_READ + PERF_RECORD_SAMPLE = C.PERF_RECORD_SAMPLE + + PERF_CONTEXT_HV = C.PERF_CONTEXT_HV + PERF_CONTEXT_KERNEL = C.PERF_CONTEXT_KERNEL + PERF_CONTEXT_USER = C.PERF_CONTEXT_USER + + PERF_CONTEXT_GUEST = C.PERF_CONTEXT_GUEST + PERF_CONTEXT_GUEST_KERNEL = C.PERF_CONTEXT_GUEST_KERNEL + PERF_CONTEXT_GUEST_USER = C.PERF_CONTEXT_GUEST_USER + + PERF_FLAG_FD_NO_GROUP = C.PERF_FLAG_FD_NO_GROUP + PERF_FLAG_FD_OUTPUT = C.PERF_FLAG_FD_OUTPUT + PERF_FLAG_PID_CGROUP = C.PERF_FLAG_PID_CGROUP +) + +// Platform ABI and calling convention + +// Bit field masks for interoperability with C code that uses bit fields. +// Each mask corresponds to a single bit set - bit field behavior can be replicated by combining +// the masks with bitwise OR. +const ( + CBitFieldMaskBit0 = C.BITFIELD_MASK_0 + CBitFieldMaskBit1 = C.BITFIELD_MASK_1 + CBitFieldMaskBit2 = C.BITFIELD_MASK_2 + CBitFieldMaskBit3 = C.BITFIELD_MASK_3 + CBitFieldMaskBit4 = C.BITFIELD_MASK_4 + CBitFieldMaskBit5 = C.BITFIELD_MASK_5 + CBitFieldMaskBit6 = C.BITFIELD_MASK_6 + CBitFieldMaskBit7 = C.BITFIELD_MASK_7 + CBitFieldMaskBit8 = C.BITFIELD_MASK_8 + CBitFieldMaskBit9 = C.BITFIELD_MASK_9 + CBitFieldMaskBit10 = C.BITFIELD_MASK_10 + CBitFieldMaskBit11 = C.BITFIELD_MASK_11 + CBitFieldMaskBit12 = C.BITFIELD_MASK_12 + CBitFieldMaskBit13 = C.BITFIELD_MASK_13 + CBitFieldMaskBit14 = C.BITFIELD_MASK_14 + CBitFieldMaskBit15 = C.BITFIELD_MASK_15 + CBitFieldMaskBit16 = C.BITFIELD_MASK_16 + CBitFieldMaskBit17 = C.BITFIELD_MASK_17 + CBitFieldMaskBit18 = C.BITFIELD_MASK_18 + CBitFieldMaskBit19 = C.BITFIELD_MASK_19 + CBitFieldMaskBit20 = C.BITFIELD_MASK_20 + CBitFieldMaskBit21 = C.BITFIELD_MASK_21 + CBitFieldMaskBit22 = C.BITFIELD_MASK_22 + CBitFieldMaskBit23 = C.BITFIELD_MASK_23 + CBitFieldMaskBit24 = C.BITFIELD_MASK_24 + CBitFieldMaskBit25 = C.BITFIELD_MASK_25 + CBitFieldMaskBit26 = C.BITFIELD_MASK_26 + CBitFieldMaskBit27 = C.BITFIELD_MASK_27 + CBitFieldMaskBit28 = C.BITFIELD_MASK_28 + CBitFieldMaskBit29 = C.BITFIELD_MASK_29 + CBitFieldMaskBit30 = C.BITFIELD_MASK_30 + CBitFieldMaskBit31 = C.BITFIELD_MASK_31 + CBitFieldMaskBit32 = C.BITFIELD_MASK_32 + CBitFieldMaskBit33 = C.BITFIELD_MASK_33 + CBitFieldMaskBit34 = C.BITFIELD_MASK_34 + CBitFieldMaskBit35 = C.BITFIELD_MASK_35 + CBitFieldMaskBit36 = C.BITFIELD_MASK_36 + CBitFieldMaskBit37 = C.BITFIELD_MASK_37 + CBitFieldMaskBit38 = C.BITFIELD_MASK_38 + CBitFieldMaskBit39 = C.BITFIELD_MASK_39 + CBitFieldMaskBit40 = C.BITFIELD_MASK_40 + CBitFieldMaskBit41 = C.BITFIELD_MASK_41 + CBitFieldMaskBit42 = C.BITFIELD_MASK_42 + CBitFieldMaskBit43 = C.BITFIELD_MASK_43 + CBitFieldMaskBit44 = C.BITFIELD_MASK_44 + CBitFieldMaskBit45 = C.BITFIELD_MASK_45 + CBitFieldMaskBit46 = C.BITFIELD_MASK_46 + CBitFieldMaskBit47 = C.BITFIELD_MASK_47 + CBitFieldMaskBit48 = C.BITFIELD_MASK_48 + CBitFieldMaskBit49 = C.BITFIELD_MASK_49 + CBitFieldMaskBit50 = C.BITFIELD_MASK_50 + CBitFieldMaskBit51 = C.BITFIELD_MASK_51 + CBitFieldMaskBit52 = C.BITFIELD_MASK_52 + CBitFieldMaskBit53 = C.BITFIELD_MASK_53 + CBitFieldMaskBit54 = C.BITFIELD_MASK_54 + CBitFieldMaskBit55 = C.BITFIELD_MASK_55 + CBitFieldMaskBit56 = C.BITFIELD_MASK_56 + CBitFieldMaskBit57 = C.BITFIELD_MASK_57 + CBitFieldMaskBit58 = C.BITFIELD_MASK_58 + CBitFieldMaskBit59 = C.BITFIELD_MASK_59 + CBitFieldMaskBit60 = C.BITFIELD_MASK_60 + CBitFieldMaskBit61 = C.BITFIELD_MASK_61 + CBitFieldMaskBit62 = C.BITFIELD_MASK_62 + CBitFieldMaskBit63 = C.BITFIELD_MASK_63 +) + +// TCP-MD5 signature. + +type SockaddrStorage C.struct_sockaddr_storage + +type TCPMD5Sig C.struct_tcp_md5sig + +// Disk drive operations. + +type HDDriveCmdHdr C.struct_hd_drive_cmd_hdr + +type HDGeometry C.struct_hd_geometry + +type HDDriveID C.struct_hd_driveid + +// Statfs + +type Statfs_t C.struct_statfs + +const ( + ST_MANDLOCK = C.ST_MANDLOCK + ST_NOATIME = C.ST_NOATIME + ST_NODEV = C.ST_NODEV + ST_NODIRATIME = C.ST_NODIRATIME + ST_NOEXEC = C.ST_NOEXEC + ST_NOSUID = C.ST_NOSUID + ST_RDONLY = C.ST_RDONLY + ST_RELATIME = C.ST_RELATIME + ST_SYNCHRONOUS = C.ST_SYNCHRONOUS +) + +// TPacket + +type TpacketHdr C.struct_tpacket_hdr + +type Tpacket2Hdr C.struct_tpacket2_hdr + +type Tpacket3Hdr C.struct_tpacket3_hdr + +type TpacketHdrVariant1 C.struct_tpacket_hdr_variant1 + +type TpacketBlockDesc C.struct_tpacket_block_desc + +type TpacketReq C.struct_tpacket_req + +type TpacketReq3 C.struct_tpacket_req3 + +type TpacketStats C.struct_tpacket_stats + +type TpacketStatsV3 C.struct_tpacket_stats_v3 + +type TpacketAuxdata C.struct_tpacket_auxdata + +const ( + TPACKET_V1 = C.TPACKET_V1 + TPACKET_V2 = C.TPACKET_V2 + TPACKET_V3 = C.TPACKET_V3 +) + +const ( + SizeofTpacketHdr = C.sizeof_struct_tpacket_hdr + SizeofTpacket2Hdr = C.sizeof_struct_tpacket2_hdr + SizeofTpacket3Hdr = C.sizeof_struct_tpacket3_hdr +) + +// netfilter +// generated using: +// perl -nlE '/^\s*(NF\w+)/ && say "$1 = C.$1"' /usr/include/linux/netfilter.h +const ( + NF_INET_PRE_ROUTING = C.NF_INET_PRE_ROUTING + NF_INET_LOCAL_IN = C.NF_INET_LOCAL_IN + NF_INET_FORWARD = C.NF_INET_FORWARD + NF_INET_LOCAL_OUT = C.NF_INET_LOCAL_OUT + NF_INET_POST_ROUTING = C.NF_INET_POST_ROUTING + NF_INET_NUMHOOKS = C.NF_INET_NUMHOOKS +) + +const ( + NF_NETDEV_INGRESS = C.NF_NETDEV_INGRESS + NF_NETDEV_NUMHOOKS = C.NF_NETDEV_NUMHOOKS +) + +const ( + NFPROTO_UNSPEC = C.NFPROTO_UNSPEC + NFPROTO_INET = C.NFPROTO_INET + NFPROTO_IPV4 = C.NFPROTO_IPV4 + NFPROTO_ARP = C.NFPROTO_ARP + NFPROTO_NETDEV = C.NFPROTO_NETDEV + NFPROTO_BRIDGE = C.NFPROTO_BRIDGE + NFPROTO_IPV6 = C.NFPROTO_IPV6 + NFPROTO_DECNET = C.NFPROTO_DECNET + NFPROTO_NUMPROTO = C.NFPROTO_NUMPROTO +) + +// netfilter nfnetlink +type Nfgenmsg C.struct_nfgenmsg + +const ( + NFNL_BATCH_UNSPEC = C.NFNL_BATCH_UNSPEC + NFNL_BATCH_GENID = C.NFNL_BATCH_GENID +) + +// netfilter nf_tables +// generated using: +// perl -nlE '/^\s*(NFT\w+)/ && say "$1 = C.$1"' /usr/include/linux/netfilter/nf_tables.h +const ( + NFT_REG_VERDICT = C.NFT_REG_VERDICT + NFT_REG_1 = C.NFT_REG_1 + NFT_REG_2 = C.NFT_REG_2 + NFT_REG_3 = C.NFT_REG_3 + NFT_REG_4 = C.NFT_REG_4 + NFT_REG32_00 = C.NFT_REG32_00 + NFT_REG32_01 = C.NFT_REG32_01 + NFT_REG32_02 = C.NFT_REG32_02 + NFT_REG32_03 = C.NFT_REG32_03 + NFT_REG32_04 = C.NFT_REG32_04 + NFT_REG32_05 = C.NFT_REG32_05 + NFT_REG32_06 = C.NFT_REG32_06 + NFT_REG32_07 = C.NFT_REG32_07 + NFT_REG32_08 = C.NFT_REG32_08 + NFT_REG32_09 = C.NFT_REG32_09 + NFT_REG32_10 = C.NFT_REG32_10 + NFT_REG32_11 = C.NFT_REG32_11 + NFT_REG32_12 = C.NFT_REG32_12 + NFT_REG32_13 = C.NFT_REG32_13 + NFT_REG32_14 = C.NFT_REG32_14 + NFT_REG32_15 = C.NFT_REG32_15 + NFT_CONTINUE = C.NFT_CONTINUE + NFT_BREAK = C.NFT_BREAK + NFT_JUMP = C.NFT_JUMP + NFT_GOTO = C.NFT_GOTO + NFT_RETURN = C.NFT_RETURN + NFT_MSG_NEWTABLE = C.NFT_MSG_NEWTABLE + NFT_MSG_GETTABLE = C.NFT_MSG_GETTABLE + NFT_MSG_DELTABLE = C.NFT_MSG_DELTABLE + NFT_MSG_NEWCHAIN = C.NFT_MSG_NEWCHAIN + NFT_MSG_GETCHAIN = C.NFT_MSG_GETCHAIN + NFT_MSG_DELCHAIN = C.NFT_MSG_DELCHAIN + NFT_MSG_NEWRULE = C.NFT_MSG_NEWRULE + NFT_MSG_GETRULE = C.NFT_MSG_GETRULE + NFT_MSG_DELRULE = C.NFT_MSG_DELRULE + NFT_MSG_NEWSET = C.NFT_MSG_NEWSET + NFT_MSG_GETSET = C.NFT_MSG_GETSET + NFT_MSG_DELSET = C.NFT_MSG_DELSET + NFT_MSG_NEWSETELEM = C.NFT_MSG_NEWSETELEM + NFT_MSG_GETSETELEM = C.NFT_MSG_GETSETELEM + NFT_MSG_DELSETELEM = C.NFT_MSG_DELSETELEM + NFT_MSG_NEWGEN = C.NFT_MSG_NEWGEN + NFT_MSG_GETGEN = C.NFT_MSG_GETGEN + NFT_MSG_TRACE = C.NFT_MSG_TRACE + NFT_MSG_NEWOBJ = C.NFT_MSG_NEWOBJ + NFT_MSG_GETOBJ = C.NFT_MSG_GETOBJ + NFT_MSG_DELOBJ = C.NFT_MSG_DELOBJ + NFT_MSG_GETOBJ_RESET = C.NFT_MSG_GETOBJ_RESET + NFT_MSG_MAX = C.NFT_MSG_MAX + NFTA_LIST_UNPEC = C.NFTA_LIST_UNPEC + NFTA_LIST_ELEM = C.NFTA_LIST_ELEM + NFTA_HOOK_UNSPEC = C.NFTA_HOOK_UNSPEC + NFTA_HOOK_HOOKNUM = C.NFTA_HOOK_HOOKNUM + NFTA_HOOK_PRIORITY = C.NFTA_HOOK_PRIORITY + NFTA_HOOK_DEV = C.NFTA_HOOK_DEV + NFT_TABLE_F_DORMANT = C.NFT_TABLE_F_DORMANT + NFTA_TABLE_UNSPEC = C.NFTA_TABLE_UNSPEC + NFTA_TABLE_NAME = C.NFTA_TABLE_NAME + NFTA_TABLE_FLAGS = C.NFTA_TABLE_FLAGS + NFTA_TABLE_USE = C.NFTA_TABLE_USE + NFTA_CHAIN_UNSPEC = C.NFTA_CHAIN_UNSPEC + NFTA_CHAIN_TABLE = C.NFTA_CHAIN_TABLE + NFTA_CHAIN_HANDLE = C.NFTA_CHAIN_HANDLE + NFTA_CHAIN_NAME = C.NFTA_CHAIN_NAME + NFTA_CHAIN_HOOK = C.NFTA_CHAIN_HOOK + NFTA_CHAIN_POLICY = C.NFTA_CHAIN_POLICY + NFTA_CHAIN_USE = C.NFTA_CHAIN_USE + NFTA_CHAIN_TYPE = C.NFTA_CHAIN_TYPE + NFTA_CHAIN_COUNTERS = C.NFTA_CHAIN_COUNTERS + NFTA_CHAIN_PAD = C.NFTA_CHAIN_PAD + NFTA_RULE_UNSPEC = C.NFTA_RULE_UNSPEC + NFTA_RULE_TABLE = C.NFTA_RULE_TABLE + NFTA_RULE_CHAIN = C.NFTA_RULE_CHAIN + NFTA_RULE_HANDLE = C.NFTA_RULE_HANDLE + NFTA_RULE_EXPRESSIONS = C.NFTA_RULE_EXPRESSIONS + NFTA_RULE_COMPAT = C.NFTA_RULE_COMPAT + NFTA_RULE_POSITION = C.NFTA_RULE_POSITION + NFTA_RULE_USERDATA = C.NFTA_RULE_USERDATA + NFTA_RULE_PAD = C.NFTA_RULE_PAD + NFTA_RULE_ID = C.NFTA_RULE_ID + NFT_RULE_COMPAT_F_INV = C.NFT_RULE_COMPAT_F_INV + NFT_RULE_COMPAT_F_MASK = C.NFT_RULE_COMPAT_F_MASK + NFTA_RULE_COMPAT_UNSPEC = C.NFTA_RULE_COMPAT_UNSPEC + NFTA_RULE_COMPAT_PROTO = C.NFTA_RULE_COMPAT_PROTO + NFTA_RULE_COMPAT_FLAGS = C.NFTA_RULE_COMPAT_FLAGS + NFT_SET_ANONYMOUS = C.NFT_SET_ANONYMOUS + NFT_SET_CONSTANT = C.NFT_SET_CONSTANT + NFT_SET_INTERVAL = C.NFT_SET_INTERVAL + NFT_SET_MAP = C.NFT_SET_MAP + NFT_SET_TIMEOUT = C.NFT_SET_TIMEOUT + NFT_SET_EVAL = C.NFT_SET_EVAL + NFT_SET_OBJECT = C.NFT_SET_OBJECT + NFT_SET_POL_PERFORMANCE = C.NFT_SET_POL_PERFORMANCE + NFT_SET_POL_MEMORY = C.NFT_SET_POL_MEMORY + NFTA_SET_DESC_UNSPEC = C.NFTA_SET_DESC_UNSPEC + NFTA_SET_DESC_SIZE = C.NFTA_SET_DESC_SIZE + NFTA_SET_UNSPEC = C.NFTA_SET_UNSPEC + NFTA_SET_TABLE = C.NFTA_SET_TABLE + NFTA_SET_NAME = C.NFTA_SET_NAME + NFTA_SET_FLAGS = C.NFTA_SET_FLAGS + NFTA_SET_KEY_TYPE = C.NFTA_SET_KEY_TYPE + NFTA_SET_KEY_LEN = C.NFTA_SET_KEY_LEN + NFTA_SET_DATA_TYPE = C.NFTA_SET_DATA_TYPE + NFTA_SET_DATA_LEN = C.NFTA_SET_DATA_LEN + NFTA_SET_POLICY = C.NFTA_SET_POLICY + NFTA_SET_DESC = C.NFTA_SET_DESC + NFTA_SET_ID = C.NFTA_SET_ID + NFTA_SET_TIMEOUT = C.NFTA_SET_TIMEOUT + NFTA_SET_GC_INTERVAL = C.NFTA_SET_GC_INTERVAL + NFTA_SET_USERDATA = C.NFTA_SET_USERDATA + NFTA_SET_PAD = C.NFTA_SET_PAD + NFTA_SET_OBJ_TYPE = C.NFTA_SET_OBJ_TYPE + NFT_SET_ELEM_INTERVAL_END = C.NFT_SET_ELEM_INTERVAL_END + NFTA_SET_ELEM_UNSPEC = C.NFTA_SET_ELEM_UNSPEC + NFTA_SET_ELEM_KEY = C.NFTA_SET_ELEM_KEY + NFTA_SET_ELEM_DATA = C.NFTA_SET_ELEM_DATA + NFTA_SET_ELEM_FLAGS = C.NFTA_SET_ELEM_FLAGS + NFTA_SET_ELEM_TIMEOUT = C.NFTA_SET_ELEM_TIMEOUT + NFTA_SET_ELEM_EXPIRATION = C.NFTA_SET_ELEM_EXPIRATION + NFTA_SET_ELEM_USERDATA = C.NFTA_SET_ELEM_USERDATA + NFTA_SET_ELEM_EXPR = C.NFTA_SET_ELEM_EXPR + NFTA_SET_ELEM_PAD = C.NFTA_SET_ELEM_PAD + NFTA_SET_ELEM_OBJREF = C.NFTA_SET_ELEM_OBJREF + NFTA_SET_ELEM_LIST_UNSPEC = C.NFTA_SET_ELEM_LIST_UNSPEC + NFTA_SET_ELEM_LIST_TABLE = C.NFTA_SET_ELEM_LIST_TABLE + NFTA_SET_ELEM_LIST_SET = C.NFTA_SET_ELEM_LIST_SET + NFTA_SET_ELEM_LIST_ELEMENTS = C.NFTA_SET_ELEM_LIST_ELEMENTS + NFTA_SET_ELEM_LIST_SET_ID = C.NFTA_SET_ELEM_LIST_SET_ID + NFT_DATA_VALUE = C.NFT_DATA_VALUE + NFT_DATA_VERDICT = C.NFT_DATA_VERDICT + NFTA_DATA_UNSPEC = C.NFTA_DATA_UNSPEC + NFTA_DATA_VALUE = C.NFTA_DATA_VALUE + NFTA_DATA_VERDICT = C.NFTA_DATA_VERDICT + NFTA_VERDICT_UNSPEC = C.NFTA_VERDICT_UNSPEC + NFTA_VERDICT_CODE = C.NFTA_VERDICT_CODE + NFTA_VERDICT_CHAIN = C.NFTA_VERDICT_CHAIN + NFTA_EXPR_UNSPEC = C.NFTA_EXPR_UNSPEC + NFTA_EXPR_NAME = C.NFTA_EXPR_NAME + NFTA_EXPR_DATA = C.NFTA_EXPR_DATA + NFTA_IMMEDIATE_UNSPEC = C.NFTA_IMMEDIATE_UNSPEC + NFTA_IMMEDIATE_DREG = C.NFTA_IMMEDIATE_DREG + NFTA_IMMEDIATE_DATA = C.NFTA_IMMEDIATE_DATA + NFTA_BITWISE_UNSPEC = C.NFTA_BITWISE_UNSPEC + NFTA_BITWISE_SREG = C.NFTA_BITWISE_SREG + NFTA_BITWISE_DREG = C.NFTA_BITWISE_DREG + NFTA_BITWISE_LEN = C.NFTA_BITWISE_LEN + NFTA_BITWISE_MASK = C.NFTA_BITWISE_MASK + NFTA_BITWISE_XOR = C.NFTA_BITWISE_XOR + NFT_BYTEORDER_NTOH = C.NFT_BYTEORDER_NTOH + NFT_BYTEORDER_HTON = C.NFT_BYTEORDER_HTON + NFTA_BYTEORDER_UNSPEC = C.NFTA_BYTEORDER_UNSPEC + NFTA_BYTEORDER_SREG = C.NFTA_BYTEORDER_SREG + NFTA_BYTEORDER_DREG = C.NFTA_BYTEORDER_DREG + NFTA_BYTEORDER_OP = C.NFTA_BYTEORDER_OP + NFTA_BYTEORDER_LEN = C.NFTA_BYTEORDER_LEN + NFTA_BYTEORDER_SIZE = C.NFTA_BYTEORDER_SIZE + NFT_CMP_EQ = C.NFT_CMP_EQ + NFT_CMP_NEQ = C.NFT_CMP_NEQ + NFT_CMP_LT = C.NFT_CMP_LT + NFT_CMP_LTE = C.NFT_CMP_LTE + NFT_CMP_GT = C.NFT_CMP_GT + NFT_CMP_GTE = C.NFT_CMP_GTE + NFTA_CMP_UNSPEC = C.NFTA_CMP_UNSPEC + NFTA_CMP_SREG = C.NFTA_CMP_SREG + NFTA_CMP_OP = C.NFTA_CMP_OP + NFTA_CMP_DATA = C.NFTA_CMP_DATA + NFT_RANGE_EQ = C.NFT_RANGE_EQ + NFT_RANGE_NEQ = C.NFT_RANGE_NEQ + NFTA_RANGE_UNSPEC = C.NFTA_RANGE_UNSPEC + NFTA_RANGE_SREG = C.NFTA_RANGE_SREG + NFTA_RANGE_OP = C.NFTA_RANGE_OP + NFTA_RANGE_FROM_DATA = C.NFTA_RANGE_FROM_DATA + NFTA_RANGE_TO_DATA = C.NFTA_RANGE_TO_DATA + NFT_LOOKUP_F_INV = C.NFT_LOOKUP_F_INV + NFTA_LOOKUP_UNSPEC = C.NFTA_LOOKUP_UNSPEC + NFTA_LOOKUP_SET = C.NFTA_LOOKUP_SET + NFTA_LOOKUP_SREG = C.NFTA_LOOKUP_SREG + NFTA_LOOKUP_DREG = C.NFTA_LOOKUP_DREG + NFTA_LOOKUP_SET_ID = C.NFTA_LOOKUP_SET_ID + NFTA_LOOKUP_FLAGS = C.NFTA_LOOKUP_FLAGS + NFT_DYNSET_OP_ADD = C.NFT_DYNSET_OP_ADD + NFT_DYNSET_OP_UPDATE = C.NFT_DYNSET_OP_UPDATE + NFT_DYNSET_F_INV = C.NFT_DYNSET_F_INV + NFTA_DYNSET_UNSPEC = C.NFTA_DYNSET_UNSPEC + NFTA_DYNSET_SET_NAME = C.NFTA_DYNSET_SET_NAME + NFTA_DYNSET_SET_ID = C.NFTA_DYNSET_SET_ID + NFTA_DYNSET_OP = C.NFTA_DYNSET_OP + NFTA_DYNSET_SREG_KEY = C.NFTA_DYNSET_SREG_KEY + NFTA_DYNSET_SREG_DATA = C.NFTA_DYNSET_SREG_DATA + NFTA_DYNSET_TIMEOUT = C.NFTA_DYNSET_TIMEOUT + NFTA_DYNSET_EXPR = C.NFTA_DYNSET_EXPR + NFTA_DYNSET_PAD = C.NFTA_DYNSET_PAD + NFTA_DYNSET_FLAGS = C.NFTA_DYNSET_FLAGS + NFT_PAYLOAD_LL_HEADER = C.NFT_PAYLOAD_LL_HEADER + NFT_PAYLOAD_NETWORK_HEADER = C.NFT_PAYLOAD_NETWORK_HEADER + NFT_PAYLOAD_TRANSPORT_HEADER = C.NFT_PAYLOAD_TRANSPORT_HEADER + NFT_PAYLOAD_CSUM_NONE = C.NFT_PAYLOAD_CSUM_NONE + NFT_PAYLOAD_CSUM_INET = C.NFT_PAYLOAD_CSUM_INET + NFT_PAYLOAD_L4CSUM_PSEUDOHDR = C.NFT_PAYLOAD_L4CSUM_PSEUDOHDR + NFTA_PAYLOAD_UNSPEC = C.NFTA_PAYLOAD_UNSPEC + NFTA_PAYLOAD_DREG = C.NFTA_PAYLOAD_DREG + NFTA_PAYLOAD_BASE = C.NFTA_PAYLOAD_BASE + NFTA_PAYLOAD_OFFSET = C.NFTA_PAYLOAD_OFFSET + NFTA_PAYLOAD_LEN = C.NFTA_PAYLOAD_LEN + NFTA_PAYLOAD_SREG = C.NFTA_PAYLOAD_SREG + NFTA_PAYLOAD_CSUM_TYPE = C.NFTA_PAYLOAD_CSUM_TYPE + NFTA_PAYLOAD_CSUM_OFFSET = C.NFTA_PAYLOAD_CSUM_OFFSET + NFTA_PAYLOAD_CSUM_FLAGS = C.NFTA_PAYLOAD_CSUM_FLAGS + NFT_EXTHDR_F_PRESENT = C.NFT_EXTHDR_F_PRESENT + NFT_EXTHDR_OP_IPV6 = C.NFT_EXTHDR_OP_IPV6 + NFT_EXTHDR_OP_TCPOPT = C.NFT_EXTHDR_OP_TCPOPT + NFTA_EXTHDR_UNSPEC = C.NFTA_EXTHDR_UNSPEC + NFTA_EXTHDR_DREG = C.NFTA_EXTHDR_DREG + NFTA_EXTHDR_TYPE = C.NFTA_EXTHDR_TYPE + NFTA_EXTHDR_OFFSET = C.NFTA_EXTHDR_OFFSET + NFTA_EXTHDR_LEN = C.NFTA_EXTHDR_LEN + NFTA_EXTHDR_FLAGS = C.NFTA_EXTHDR_FLAGS + NFTA_EXTHDR_OP = C.NFTA_EXTHDR_OP + NFTA_EXTHDR_SREG = C.NFTA_EXTHDR_SREG + NFT_META_LEN = C.NFT_META_LEN + NFT_META_PROTOCOL = C.NFT_META_PROTOCOL + NFT_META_PRIORITY = C.NFT_META_PRIORITY + NFT_META_MARK = C.NFT_META_MARK + NFT_META_IIF = C.NFT_META_IIF + NFT_META_OIF = C.NFT_META_OIF + NFT_META_IIFNAME = C.NFT_META_IIFNAME + NFT_META_OIFNAME = C.NFT_META_OIFNAME + NFT_META_IIFTYPE = C.NFT_META_IIFTYPE + NFT_META_OIFTYPE = C.NFT_META_OIFTYPE + NFT_META_SKUID = C.NFT_META_SKUID + NFT_META_SKGID = C.NFT_META_SKGID + NFT_META_NFTRACE = C.NFT_META_NFTRACE + NFT_META_RTCLASSID = C.NFT_META_RTCLASSID + NFT_META_SECMARK = C.NFT_META_SECMARK + NFT_META_NFPROTO = C.NFT_META_NFPROTO + NFT_META_L4PROTO = C.NFT_META_L4PROTO + NFT_META_BRI_IIFNAME = C.NFT_META_BRI_IIFNAME + NFT_META_BRI_OIFNAME = C.NFT_META_BRI_OIFNAME + NFT_META_PKTTYPE = C.NFT_META_PKTTYPE + NFT_META_CPU = C.NFT_META_CPU + NFT_META_IIFGROUP = C.NFT_META_IIFGROUP + NFT_META_OIFGROUP = C.NFT_META_OIFGROUP + NFT_META_CGROUP = C.NFT_META_CGROUP + NFT_META_PRANDOM = C.NFT_META_PRANDOM + NFT_RT_CLASSID = C.NFT_RT_CLASSID + NFT_RT_NEXTHOP4 = C.NFT_RT_NEXTHOP4 + NFT_RT_NEXTHOP6 = C.NFT_RT_NEXTHOP6 + NFT_RT_TCPMSS = C.NFT_RT_TCPMSS + NFT_HASH_JENKINS = C.NFT_HASH_JENKINS + NFT_HASH_SYM = C.NFT_HASH_SYM + NFTA_HASH_UNSPEC = C.NFTA_HASH_UNSPEC + NFTA_HASH_SREG = C.NFTA_HASH_SREG + NFTA_HASH_DREG = C.NFTA_HASH_DREG + NFTA_HASH_LEN = C.NFTA_HASH_LEN + NFTA_HASH_MODULUS = C.NFTA_HASH_MODULUS + NFTA_HASH_SEED = C.NFTA_HASH_SEED + NFTA_HASH_OFFSET = C.NFTA_HASH_OFFSET + NFTA_HASH_TYPE = C.NFTA_HASH_TYPE + NFTA_META_UNSPEC = C.NFTA_META_UNSPEC + NFTA_META_DREG = C.NFTA_META_DREG + NFTA_META_KEY = C.NFTA_META_KEY + NFTA_META_SREG = C.NFTA_META_SREG + NFTA_RT_UNSPEC = C.NFTA_RT_UNSPEC + NFTA_RT_DREG = C.NFTA_RT_DREG + NFTA_RT_KEY = C.NFTA_RT_KEY + NFT_CT_STATE = C.NFT_CT_STATE + NFT_CT_DIRECTION = C.NFT_CT_DIRECTION + NFT_CT_STATUS = C.NFT_CT_STATUS + NFT_CT_MARK = C.NFT_CT_MARK + NFT_CT_SECMARK = C.NFT_CT_SECMARK + NFT_CT_EXPIRATION = C.NFT_CT_EXPIRATION + NFT_CT_HELPER = C.NFT_CT_HELPER + NFT_CT_L3PROTOCOL = C.NFT_CT_L3PROTOCOL + NFT_CT_SRC = C.NFT_CT_SRC + NFT_CT_DST = C.NFT_CT_DST + NFT_CT_PROTOCOL = C.NFT_CT_PROTOCOL + NFT_CT_PROTO_SRC = C.NFT_CT_PROTO_SRC + NFT_CT_PROTO_DST = C.NFT_CT_PROTO_DST + NFT_CT_LABELS = C.NFT_CT_LABELS + NFT_CT_PKTS = C.NFT_CT_PKTS + NFT_CT_BYTES = C.NFT_CT_BYTES + NFT_CT_AVGPKT = C.NFT_CT_AVGPKT + NFT_CT_ZONE = C.NFT_CT_ZONE + NFT_CT_EVENTMASK = C.NFT_CT_EVENTMASK + NFTA_CT_UNSPEC = C.NFTA_CT_UNSPEC + NFTA_CT_DREG = C.NFTA_CT_DREG + NFTA_CT_KEY = C.NFTA_CT_KEY + NFTA_CT_DIRECTION = C.NFTA_CT_DIRECTION + NFTA_CT_SREG = C.NFTA_CT_SREG + NFT_LIMIT_PKTS = C.NFT_LIMIT_PKTS + NFT_LIMIT_PKT_BYTES = C.NFT_LIMIT_PKT_BYTES + NFT_LIMIT_F_INV = C.NFT_LIMIT_F_INV + NFTA_LIMIT_UNSPEC = C.NFTA_LIMIT_UNSPEC + NFTA_LIMIT_RATE = C.NFTA_LIMIT_RATE + NFTA_LIMIT_UNIT = C.NFTA_LIMIT_UNIT + NFTA_LIMIT_BURST = C.NFTA_LIMIT_BURST + NFTA_LIMIT_TYPE = C.NFTA_LIMIT_TYPE + NFTA_LIMIT_FLAGS = C.NFTA_LIMIT_FLAGS + NFTA_LIMIT_PAD = C.NFTA_LIMIT_PAD + NFTA_COUNTER_UNSPEC = C.NFTA_COUNTER_UNSPEC + NFTA_COUNTER_BYTES = C.NFTA_COUNTER_BYTES + NFTA_COUNTER_PACKETS = C.NFTA_COUNTER_PACKETS + NFTA_COUNTER_PAD = C.NFTA_COUNTER_PAD + NFTA_LOG_UNSPEC = C.NFTA_LOG_UNSPEC + NFTA_LOG_GROUP = C.NFTA_LOG_GROUP + NFTA_LOG_PREFIX = C.NFTA_LOG_PREFIX + NFTA_LOG_SNAPLEN = C.NFTA_LOG_SNAPLEN + NFTA_LOG_QTHRESHOLD = C.NFTA_LOG_QTHRESHOLD + NFTA_LOG_LEVEL = C.NFTA_LOG_LEVEL + NFTA_LOG_FLAGS = C.NFTA_LOG_FLAGS + NFTA_QUEUE_UNSPEC = C.NFTA_QUEUE_UNSPEC + NFTA_QUEUE_NUM = C.NFTA_QUEUE_NUM + NFTA_QUEUE_TOTAL = C.NFTA_QUEUE_TOTAL + NFTA_QUEUE_FLAGS = C.NFTA_QUEUE_FLAGS + NFTA_QUEUE_SREG_QNUM = C.NFTA_QUEUE_SREG_QNUM + NFT_QUOTA_F_INV = C.NFT_QUOTA_F_INV + NFT_QUOTA_F_DEPLETED = C.NFT_QUOTA_F_DEPLETED + NFTA_QUOTA_UNSPEC = C.NFTA_QUOTA_UNSPEC + NFTA_QUOTA_BYTES = C.NFTA_QUOTA_BYTES + NFTA_QUOTA_FLAGS = C.NFTA_QUOTA_FLAGS + NFTA_QUOTA_PAD = C.NFTA_QUOTA_PAD + NFTA_QUOTA_CONSUMED = C.NFTA_QUOTA_CONSUMED + NFT_REJECT_ICMP_UNREACH = C.NFT_REJECT_ICMP_UNREACH + NFT_REJECT_TCP_RST = C.NFT_REJECT_TCP_RST + NFT_REJECT_ICMPX_UNREACH = C.NFT_REJECT_ICMPX_UNREACH + NFT_REJECT_ICMPX_NO_ROUTE = C.NFT_REJECT_ICMPX_NO_ROUTE + NFT_REJECT_ICMPX_PORT_UNREACH = C.NFT_REJECT_ICMPX_PORT_UNREACH + NFT_REJECT_ICMPX_HOST_UNREACH = C.NFT_REJECT_ICMPX_HOST_UNREACH + NFT_REJECT_ICMPX_ADMIN_PROHIBITED = C.NFT_REJECT_ICMPX_ADMIN_PROHIBITED + NFTA_REJECT_UNSPEC = C.NFTA_REJECT_UNSPEC + NFTA_REJECT_TYPE = C.NFTA_REJECT_TYPE + NFTA_REJECT_ICMP_CODE = C.NFTA_REJECT_ICMP_CODE + NFT_NAT_SNAT = C.NFT_NAT_SNAT + NFT_NAT_DNAT = C.NFT_NAT_DNAT + NFTA_NAT_UNSPEC = C.NFTA_NAT_UNSPEC + NFTA_NAT_TYPE = C.NFTA_NAT_TYPE + NFTA_NAT_FAMILY = C.NFTA_NAT_FAMILY + NFTA_NAT_REG_ADDR_MIN = C.NFTA_NAT_REG_ADDR_MIN + NFTA_NAT_REG_ADDR_MAX = C.NFTA_NAT_REG_ADDR_MAX + NFTA_NAT_REG_PROTO_MIN = C.NFTA_NAT_REG_PROTO_MIN + NFTA_NAT_REG_PROTO_MAX = C.NFTA_NAT_REG_PROTO_MAX + NFTA_NAT_FLAGS = C.NFTA_NAT_FLAGS + NFTA_MASQ_UNSPEC = C.NFTA_MASQ_UNSPEC + NFTA_MASQ_FLAGS = C.NFTA_MASQ_FLAGS + NFTA_MASQ_REG_PROTO_MIN = C.NFTA_MASQ_REG_PROTO_MIN + NFTA_MASQ_REG_PROTO_MAX = C.NFTA_MASQ_REG_PROTO_MAX + NFTA_REDIR_UNSPEC = C.NFTA_REDIR_UNSPEC + NFTA_REDIR_REG_PROTO_MIN = C.NFTA_REDIR_REG_PROTO_MIN + NFTA_REDIR_REG_PROTO_MAX = C.NFTA_REDIR_REG_PROTO_MAX + NFTA_REDIR_FLAGS = C.NFTA_REDIR_FLAGS + NFTA_DUP_UNSPEC = C.NFTA_DUP_UNSPEC + NFTA_DUP_SREG_ADDR = C.NFTA_DUP_SREG_ADDR + NFTA_DUP_SREG_DEV = C.NFTA_DUP_SREG_DEV + NFTA_FWD_UNSPEC = C.NFTA_FWD_UNSPEC + NFTA_FWD_SREG_DEV = C.NFTA_FWD_SREG_DEV + NFTA_OBJREF_UNSPEC = C.NFTA_OBJREF_UNSPEC + NFTA_OBJREF_IMM_TYPE = C.NFTA_OBJREF_IMM_TYPE + NFTA_OBJREF_IMM_NAME = C.NFTA_OBJREF_IMM_NAME + NFTA_OBJREF_SET_SREG = C.NFTA_OBJREF_SET_SREG + NFTA_OBJREF_SET_NAME = C.NFTA_OBJREF_SET_NAME + NFTA_OBJREF_SET_ID = C.NFTA_OBJREF_SET_ID + NFTA_GEN_UNSPEC = C.NFTA_GEN_UNSPEC + NFTA_GEN_ID = C.NFTA_GEN_ID + NFTA_GEN_PROC_PID = C.NFTA_GEN_PROC_PID + NFTA_GEN_PROC_NAME = C.NFTA_GEN_PROC_NAME + NFTA_FIB_UNSPEC = C.NFTA_FIB_UNSPEC + NFTA_FIB_DREG = C.NFTA_FIB_DREG + NFTA_FIB_RESULT = C.NFTA_FIB_RESULT + NFTA_FIB_FLAGS = C.NFTA_FIB_FLAGS + NFT_FIB_RESULT_UNSPEC = C.NFT_FIB_RESULT_UNSPEC + NFT_FIB_RESULT_OIF = C.NFT_FIB_RESULT_OIF + NFT_FIB_RESULT_OIFNAME = C.NFT_FIB_RESULT_OIFNAME + NFT_FIB_RESULT_ADDRTYPE = C.NFT_FIB_RESULT_ADDRTYPE + NFTA_FIB_F_SADDR = C.NFTA_FIB_F_SADDR + NFTA_FIB_F_DADDR = C.NFTA_FIB_F_DADDR + NFTA_FIB_F_MARK = C.NFTA_FIB_F_MARK + NFTA_FIB_F_IIF = C.NFTA_FIB_F_IIF + NFTA_FIB_F_OIF = C.NFTA_FIB_F_OIF + NFTA_FIB_F_PRESENT = C.NFTA_FIB_F_PRESENT + NFTA_CT_HELPER_UNSPEC = C.NFTA_CT_HELPER_UNSPEC + NFTA_CT_HELPER_NAME = C.NFTA_CT_HELPER_NAME + NFTA_CT_HELPER_L3PROTO = C.NFTA_CT_HELPER_L3PROTO + NFTA_CT_HELPER_L4PROTO = C.NFTA_CT_HELPER_L4PROTO + NFTA_OBJ_UNSPEC = C.NFTA_OBJ_UNSPEC + NFTA_OBJ_TABLE = C.NFTA_OBJ_TABLE + NFTA_OBJ_NAME = C.NFTA_OBJ_NAME + NFTA_OBJ_TYPE = C.NFTA_OBJ_TYPE + NFTA_OBJ_DATA = C.NFTA_OBJ_DATA + NFTA_OBJ_USE = C.NFTA_OBJ_USE + NFTA_TRACE_UNSPEC = C.NFTA_TRACE_UNSPEC + NFTA_TRACE_TABLE = C.NFTA_TRACE_TABLE + NFTA_TRACE_CHAIN = C.NFTA_TRACE_CHAIN + NFTA_TRACE_RULE_HANDLE = C.NFTA_TRACE_RULE_HANDLE + NFTA_TRACE_TYPE = C.NFTA_TRACE_TYPE + NFTA_TRACE_VERDICT = C.NFTA_TRACE_VERDICT + NFTA_TRACE_ID = C.NFTA_TRACE_ID + NFTA_TRACE_LL_HEADER = C.NFTA_TRACE_LL_HEADER + NFTA_TRACE_NETWORK_HEADER = C.NFTA_TRACE_NETWORK_HEADER + NFTA_TRACE_TRANSPORT_HEADER = C.NFTA_TRACE_TRANSPORT_HEADER + NFTA_TRACE_IIF = C.NFTA_TRACE_IIF + NFTA_TRACE_IIFTYPE = C.NFTA_TRACE_IIFTYPE + NFTA_TRACE_OIF = C.NFTA_TRACE_OIF + NFTA_TRACE_OIFTYPE = C.NFTA_TRACE_OIFTYPE + NFTA_TRACE_MARK = C.NFTA_TRACE_MARK + NFTA_TRACE_NFPROTO = C.NFTA_TRACE_NFPROTO + NFTA_TRACE_POLICY = C.NFTA_TRACE_POLICY + NFTA_TRACE_PAD = C.NFTA_TRACE_PAD + NFT_TRACETYPE_UNSPEC = C.NFT_TRACETYPE_UNSPEC + NFT_TRACETYPE_POLICY = C.NFT_TRACETYPE_POLICY + NFT_TRACETYPE_RETURN = C.NFT_TRACETYPE_RETURN + NFT_TRACETYPE_RULE = C.NFT_TRACETYPE_RULE + NFTA_NG_UNSPEC = C.NFTA_NG_UNSPEC + NFTA_NG_DREG = C.NFTA_NG_DREG + NFTA_NG_MODULUS = C.NFTA_NG_MODULUS + NFTA_NG_TYPE = C.NFTA_NG_TYPE + NFTA_NG_OFFSET = C.NFTA_NG_OFFSET + NFT_NG_INCREMENTAL = C.NFT_NG_INCREMENTAL + NFT_NG_RANDOM = C.NFT_NG_RANDOM +) diff --git a/api/vendor/golang.org/x/sys/unix/mkall.sh b/api/vendor/golang.org/x/sys/unix/mkall.sh new file mode 100755 index 0000000..1715122 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/mkall.sh @@ -0,0 +1,188 @@ +#!/usr/bin/env bash +# 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. + +# This script runs or (given -n) prints suggested commands to generate files for +# the Architecture/OS specified by the GOARCH and GOOS environment variables. +# See README.md for more information about how the build system works. + +GOOSARCH="${GOOS}_${GOARCH}" + +# defaults +mksyscall="./mksyscall.pl" +mkerrors="./mkerrors.sh" +zerrors="zerrors_$GOOSARCH.go" +mksysctl="" +zsysctl="zsysctl_$GOOSARCH.go" +mksysnum= +mktypes= +run="sh" +cmd="" + +case "$1" in +-syscalls) + for i in zsyscall*go + do + # Run the command line that appears in the first line + # of the generated file to regenerate it. + sed 1q $i | sed 's;^// ;;' | sh > _$i && gofmt < _$i > $i + rm _$i + done + exit 0 + ;; +-n) + run="cat" + cmd="echo" + shift +esac + +case "$#" in +0) + ;; +*) + echo 'usage: mkall.sh [-n]' 1>&2 + exit 2 +esac + +if [[ "$GOOS" = "linux" ]] && [[ "$GOARCH" != "sparc64" ]]; then + # Use then new build system + # Files generated through docker (use $cmd so you can Ctl-C the build or run) + $cmd docker build --tag generate:$GOOS $GOOS + $cmd docker run --interactive --tty --volume $(dirname "$(readlink -f "$0")"):/build generate:$GOOS + exit +fi + +GOOSARCH_in=syscall_$GOOSARCH.go +case "$GOOSARCH" in +_* | *_ | _) + echo 'undefined $GOOS_$GOARCH:' "$GOOSARCH" 1>&2 + exit 1 + ;; +darwin_386) + mkerrors="$mkerrors -m32" + mksyscall="./mksyscall.pl -l32" + mksysnum="./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk macosx)/usr/include/sys/syscall.h" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +darwin_amd64) + mkerrors="$mkerrors -m64" + mksysnum="./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk macosx)/usr/include/sys/syscall.h" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +darwin_arm) + mkerrors="$mkerrors" + mksysnum="./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk iphoneos)/usr/include/sys/syscall.h" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +darwin_arm64) + mkerrors="$mkerrors -m64" + mksysnum="./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk iphoneos)/usr/include/sys/syscall.h" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +dragonfly_amd64) + mkerrors="$mkerrors -m64" + mksyscall="./mksyscall.pl -dragonfly" + mksysnum="curl -s 'http://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/sys/kern/syscalls.master' | ./mksysnum_dragonfly.pl" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +freebsd_386) + mkerrors="$mkerrors -m32" + mksyscall="./mksyscall.pl -l32" + mksysnum="curl -s 'http://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master' | ./mksysnum_freebsd.pl" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +freebsd_amd64) + mkerrors="$mkerrors -m64" + mksysnum="curl -s 'http://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master' | ./mksysnum_freebsd.pl" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +freebsd_arm) + mkerrors="$mkerrors" + mksyscall="./mksyscall.pl -l32 -arm" + mksysnum="curl -s 'http://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master' | ./mksysnum_freebsd.pl" + # Let the type of C char be signed for making the bare syscall + # API consistent across platforms. + mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" + ;; +linux_sparc64) + GOOSARCH_in=syscall_linux_sparc64.go + unistd_h=/usr/include/sparc64-linux-gnu/asm/unistd.h + mkerrors="$mkerrors -m64" + mksysnum="./mksysnum_linux.pl $unistd_h" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +netbsd_386) + mkerrors="$mkerrors -m32" + mksyscall="./mksyscall.pl -l32 -netbsd" + mksysnum="curl -s 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_netbsd.pl" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +netbsd_amd64) + mkerrors="$mkerrors -m64" + mksyscall="./mksyscall.pl -netbsd" + mksysnum="curl -s 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_netbsd.pl" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +netbsd_arm) + mkerrors="$mkerrors" + mksyscall="./mksyscall.pl -l32 -netbsd -arm" + mksysnum="curl -s 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_netbsd.pl" + # Let the type of C char be signed for making the bare syscall + # API consistent across platforms. + mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" + ;; +openbsd_386) + mkerrors="$mkerrors -m32" + mksyscall="./mksyscall.pl -l32 -openbsd" + mksysctl="./mksysctl_openbsd.pl" + mksysnum="curl -s 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_openbsd.pl" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +openbsd_amd64) + mkerrors="$mkerrors -m64" + mksyscall="./mksyscall.pl -openbsd" + mksysctl="./mksysctl_openbsd.pl" + mksysnum="curl -s 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_openbsd.pl" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +openbsd_arm) + mkerrors="$mkerrors" + mksyscall="./mksyscall.pl -l32 -openbsd -arm" + mksysctl="./mksysctl_openbsd.pl" + mksysnum="curl -s 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_openbsd.pl" + # Let the type of C char be signed for making the bare syscall + # API consistent across platforms. + mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" + ;; +solaris_amd64) + mksyscall="./mksyscall_solaris.pl" + mkerrors="$mkerrors -m64" + mksysnum= + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +*) + echo 'unrecognized $GOOS_$GOARCH: ' "$GOOSARCH" 1>&2 + exit 1 + ;; +esac + +( + if [ -n "$mkerrors" ]; then echo "$mkerrors |gofmt >$zerrors"; fi + case "$GOOS" in + *) + syscall_goos="syscall_$GOOS.go" + case "$GOOS" in + darwin | dragonfly | freebsd | netbsd | openbsd) + syscall_goos="syscall_bsd.go $syscall_goos" + ;; + esac + if [ -n "$mksyscall" ]; then echo "$mksyscall -tags $GOOS,$GOARCH $syscall_goos $GOOSARCH_in |gofmt >zsyscall_$GOOSARCH.go"; fi + ;; + esac + if [ -n "$mksysctl" ]; then echo "$mksysctl |gofmt >$zsysctl"; fi + if [ -n "$mksysnum" ]; then echo "$mksysnum |gofmt >zsysnum_$GOOSARCH.go"; fi + if [ -n "$mktypes" ]; then + echo "$mktypes types_$GOOS.go | go run mkpost.go > ztypes_$GOOSARCH.go"; + fi +) | $run diff --git a/api/vendor/golang.org/x/sys/unix/mkerrors.sh b/api/vendor/golang.org/x/sys/unix/mkerrors.sh new file mode 100755 index 0000000..ddc50a0 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/mkerrors.sh @@ -0,0 +1,603 @@ +#!/usr/bin/env bash +# 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. + +# Generate Go code listing errors and other #defined constant +# values (ENAMETOOLONG etc.), by asking the preprocessor +# about the definitions. + +unset LANG +export LC_ALL=C +export LC_CTYPE=C + +if test -z "$GOARCH" -o -z "$GOOS"; then + echo 1>&2 "GOARCH or GOOS not defined in environment" + exit 1 +fi + +# Check that we are using the new build system if we should +if [[ "$GOOS" = "linux" ]] && [[ "$GOARCH" != "sparc64" ]]; then + if [[ "$GOLANG_SYS_BUILD" != "docker" ]]; then + echo 1>&2 "In the new build system, mkerrors should not be called directly." + echo 1>&2 "See README.md" + exit 1 + fi +fi + +CC=${CC:-cc} + +if [[ "$GOOS" = "solaris" ]]; then + # Assumes GNU versions of utilities in PATH. + export PATH=/usr/gnu/bin:$PATH +fi + +uname=$(uname) + +includes_Darwin=' +#define _DARWIN_C_SOURCE +#define KERNEL +#define _DARWIN_USE_64_BIT_INODE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +' + +includes_DragonFly=' +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +' + +includes_FreeBSD=' +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if __FreeBSD__ >= 10 +#define IFT_CARP 0xf8 // IFT_CARP is deprecated in FreeBSD 10 +#undef SIOCAIFADDR +#define SIOCAIFADDR _IOW(105, 26, struct oifaliasreq) // ifaliasreq contains if_data +#undef SIOCSIFPHYADDR +#define SIOCSIFPHYADDR _IOW(105, 70, struct oifaliasreq) // ifaliasreq contains if_data +#endif +' + +includes_Linux=' +#define _LARGEFILE_SOURCE +#define _LARGEFILE64_SOURCE +#ifndef __LP64__ +#define _FILE_OFFSET_BITS 64 +#endif +#define _GNU_SOURCE + +// is broken on powerpc64, as it fails to include definitions of +// these structures. We just include them copied from . +#if defined(__powerpc__) +struct sgttyb { + char sg_ispeed; + char sg_ospeed; + char sg_erase; + char sg_kill; + short sg_flags; +}; + +struct tchars { + char t_intrc; + char t_quitc; + char t_startc; + char t_stopc; + char t_eofc; + char t_brkc; +}; + +struct ltchars { + char t_suspc; + char t_dsuspc; + char t_rprntc; + char t_flushc; + char t_werasc; + char t_lnextc; +}; +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef MSG_FASTOPEN +#define MSG_FASTOPEN 0x20000000 +#endif + +#ifndef PTRACE_GETREGS +#define PTRACE_GETREGS 0xc +#endif + +#ifndef PTRACE_SETREGS +#define PTRACE_SETREGS 0xd +#endif + +#ifndef SOL_NETLINK +#define SOL_NETLINK 270 +#endif + +#ifdef SOL_BLUETOOTH +// SPARC includes this in /usr/include/sparc64-linux-gnu/bits/socket.h +// but it is already in bluetooth_linux.go +#undef SOL_BLUETOOTH +#endif + +// Certain constants are missing from the fs/crypto UAPI +#define FS_KEY_DESC_PREFIX "fscrypt:" +#define FS_KEY_DESC_PREFIX_SIZE 8 +#define FS_MAX_KEY_SIZE 64 +' + +includes_NetBSD=' +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Needed since refers to it... +#define schedppq 1 +' + +includes_OpenBSD=' +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// We keep some constants not supported in OpenBSD 5.5 and beyond for +// the promise of compatibility. +#define EMUL_ENABLED 0x1 +#define EMUL_NATIVE 0x2 +#define IPV6_FAITH 0x1d +#define IPV6_OPTIONS 0x1 +#define IPV6_RTHDR_STRICT 0x1 +#define IPV6_SOCKOPT_RESERVED1 0x3 +#define SIOCGIFGENERIC 0xc020693a +#define SIOCSIFGENERIC 0x80206939 +#define WALTSIG 0x4 +' + +includes_SunOS=' +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +' + + +includes=' +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +' +ccflags="$@" + +# Write go tool cgo -godefs input. +( + echo package unix + echo + echo '/*' + indirect="includes_$(uname)" + echo "${!indirect} $includes" + echo '*/' + echo 'import "C"' + echo 'import "syscall"' + echo + echo 'const (' + + # The gcc command line prints all the #defines + # it encounters while processing the input + echo "${!indirect} $includes" | $CC -x c - -E -dM $ccflags | + awk ' + $1 != "#define" || $2 ~ /\(/ || $3 == "" {next} + + $2 ~ /^E([ABCD]X|[BIS]P|[SD]I|S|FL)$/ {next} # 386 registers + $2 ~ /^(SIGEV_|SIGSTKSZ|SIGRT(MIN|MAX))/ {next} + $2 ~ /^(SCM_SRCRT)$/ {next} + $2 ~ /^(MAP_FAILED)$/ {next} + $2 ~ /^ELF_.*$/ {next}# contains ELF_ARCH, etc. + + $2 ~ /^EXTATTR_NAMESPACE_NAMES/ || + $2 ~ /^EXTATTR_NAMESPACE_[A-Z]+_STRING/ {next} + + $2 !~ /^ETH_/ && + $2 !~ /^EPROC_/ && + $2 !~ /^EQUIV_/ && + $2 !~ /^EXPR_/ && + $2 ~ /^E[A-Z0-9_]+$/ || + $2 ~ /^B[0-9_]+$/ || + $2 ~ /^(OLD|NEW)DEV$/ || + $2 == "BOTHER" || + $2 ~ /^CI?BAUD(EX)?$/ || + $2 == "IBSHIFT" || + $2 ~ /^V[A-Z0-9]+$/ || + $2 ~ /^CS[A-Z0-9]/ || + $2 ~ /^I(SIG|CANON|CRNL|UCLC|EXTEN|MAXBEL|STRIP|UTF8)$/ || + $2 ~ /^IGN/ || + $2 ~ /^IX(ON|ANY|OFF)$/ || + $2 ~ /^IN(LCR|PCK)$/ || + $2 !~ "X86_CR3_PCID_NOFLUSH" && + $2 ~ /(^FLU?SH)|(FLU?SH$)/ || + $2 ~ /^C(LOCAL|READ|MSPAR|RTSCTS)$/ || + $2 == "BRKINT" || + $2 == "HUPCL" || + $2 == "PENDIN" || + $2 == "TOSTOP" || + $2 == "XCASE" || + $2 == "ALTWERASE" || + $2 == "NOKERNINFO" || + $2 ~ /^PAR/ || + $2 ~ /^SIG[^_]/ || + $2 ~ /^O[CNPFPL][A-Z]+[^_][A-Z]+$/ || + $2 ~ /^(NL|CR|TAB|BS|VT|FF)DLY$/ || + $2 ~ /^(NL|CR|TAB|BS|VT|FF)[0-9]$/ || + $2 ~ /^O?XTABS$/ || + $2 ~ /^TC[IO](ON|OFF)$/ || + $2 ~ /^IN_/ || + $2 ~ /^LOCK_(SH|EX|NB|UN)$/ || + $2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|ICMP6|TCP|EVFILT|NOTE|EV|SHUT|PROT|MAP|T?PACKET|MSG|SCM|MCL|DT|MADV|PR)_/ || + $2 ~ /^TP_STATUS_/ || + $2 ~ /^FALLOC_/ || + $2 == "ICMPV6_FILTER" || + $2 == "SOMAXCONN" || + $2 == "NAME_MAX" || + $2 == "IFNAMSIZ" || + $2 ~ /^CTL_(HW|KERN|MAXNAME|NET|QUERY)$/ || + $2 ~ /^KERN_(HOSTNAME|OS(RELEASE|TYPE)|VERSION)$/ || + $2 ~ /^HW_MACHINE$/ || + $2 ~ /^SYSCTL_VERS/ || + $2 ~ /^(MS|MNT|UMOUNT)_/ || + $2 ~ /^TUN(SET|GET|ATTACH|DETACH)/ || + $2 ~ /^(O|F|E?FD|NAME|S|PTRACE|PT)_/ || + $2 ~ /^LINUX_REBOOT_CMD_/ || + $2 ~ /^LINUX_REBOOT_MAGIC[12]$/ || + $2 !~ "NLA_TYPE_MASK" && + $2 ~ /^(NETLINK|NLM|NLMSG|NLA|IFA|IFAN|RT|RTCF|RTN|RTPROT|RTNH|ARPHRD|ETH_P)_/ || + $2 ~ /^SIOC/ || + $2 ~ /^TIOC/ || + $2 ~ /^TCGET/ || + $2 ~ /^TCSET/ || + $2 ~ /^TC(FLSH|SBRKP?|XONC)$/ || + $2 !~ "RTF_BITS" && + $2 ~ /^(IFF|IFT|NET_RT|RTM|RTF|RTV|RTA|RTAX)_/ || + $2 ~ /^BIOC/ || + $2 ~ /^RUSAGE_(SELF|CHILDREN|THREAD)/ || + $2 ~ /^RLIMIT_(AS|CORE|CPU|DATA|FSIZE|LOCKS|MEMLOCK|MSGQUEUE|NICE|NOFILE|NPROC|RSS|RTPRIO|RTTIME|SIGPENDING|STACK)|RLIM_INFINITY/ || + $2 ~ /^PRIO_(PROCESS|PGRP|USER)/ || + $2 ~ /^CLONE_[A-Z_]+/ || + $2 !~ /^(BPF_TIMEVAL)$/ && + $2 ~ /^(BPF|DLT)_/ || + $2 ~ /^CLOCK_/ || + $2 ~ /^CAN_/ || + $2 ~ /^CAP_/ || + $2 ~ /^ALG_/ || + $2 ~ /^FS_(POLICY_FLAGS|KEY_DESC|ENCRYPTION_MODE|[A-Z0-9_]+_KEY_SIZE|IOC_(GET|SET)_ENCRYPTION)/ || + $2 ~ /^GRND_/ || + $2 ~ /^KEY_(SPEC|REQKEY_DEFL)_/ || + $2 ~ /^KEYCTL_/ || + $2 ~ /^PERF_EVENT_IOC_/ || + $2 ~ /^SECCOMP_MODE_/ || + $2 ~ /^SPLICE_/ || + $2 !~ /^AUDIT_RECORD_MAGIC/ && + $2 ~ /^[A-Z0-9_]+_MAGIC2?$/ || + $2 ~ /^(VM|VMADDR)_/ || + $2 ~ /^IOCTL_VM_SOCKETS_/ || + $2 ~ /^(TASKSTATS|TS)_/ || + $2 ~ /^CGROUPSTATS_/ || + $2 ~ /^GENL_/ || + $2 ~ /^STATX_/ || + $2 ~ /^UTIME_/ || + $2 ~ /^XATTR_(CREATE|REPLACE|NO(DEFAULT|FOLLOW|SECURITY)|SHOWCOMPRESSION)/ || + $2 ~ /^ATTR_(BIT_MAP_COUNT|(CMN|VOL|FILE)_)/ || + $2 ~ /^FSOPT_/ || + $2 ~ /^WDIOC_/ || + $2 ~ /^NFN/ || + $2 ~ /^(HDIO|WIN|SMART)_/ || + $2 !~ "WMESGLEN" && + $2 ~ /^W[A-Z0-9]+$/ || + $2 ~ /^BLK[A-Z]*(GET$|SET$|BUF$|PART$|SIZE)/ {printf("\t%s = C.%s\n", $2, $2)} + $2 ~ /^__WCOREFLAG$/ {next} + $2 ~ /^__W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", substr($2,3), $2)} + + {next} + ' | sort + + echo ')' +) >_const.go + +# Pull out the error names for later. +errors=$( + echo '#include ' | $CC -x c - -E -dM $ccflags | + awk '$1=="#define" && $2 ~ /^E[A-Z0-9_]+$/ { print $2 }' | + sort +) + +# Pull out the signal names for later. +signals=$( + echo '#include ' | $CC -x c - -E -dM $ccflags | + awk '$1=="#define" && $2 ~ /^SIG[A-Z0-9]+$/ { print $2 }' | + egrep -v '(SIGSTKSIZE|SIGSTKSZ|SIGRT)' | + sort +) + +# Again, writing regexps to a file. +echo '#include ' | $CC -x c - -E -dM $ccflags | + awk '$1=="#define" && $2 ~ /^E[A-Z0-9_]+$/ { print "^\t" $2 "[ \t]*=" }' | + sort >_error.grep +echo '#include ' | $CC -x c - -E -dM $ccflags | + awk '$1=="#define" && $2 ~ /^SIG[A-Z0-9]+$/ { print "^\t" $2 "[ \t]*=" }' | + egrep -v '(SIGSTKSIZE|SIGSTKSZ|SIGRT)' | + sort >_signal.grep + +echo '// mkerrors.sh' "$@" +echo '// Code generated by the command above; see README.md. DO NOT EDIT.' +echo +echo "// +build ${GOARCH},${GOOS}" +echo +go tool cgo -godefs -- "$@" _const.go >_error.out +cat _error.out | grep -vf _error.grep | grep -vf _signal.grep +echo +echo '// Errors' +echo 'const (' +cat _error.out | grep -f _error.grep | sed 's/=\(.*\)/= syscall.Errno(\1)/' +echo ')' + +echo +echo '// Signals' +echo 'const (' +cat _error.out | grep -f _signal.grep | sed 's/=\(.*\)/= syscall.Signal(\1)/' +echo ')' + +# Run C program to print error and syscall strings. +( + echo -E " +#include +#include +#include +#include +#include +#include + +#define nelem(x) (sizeof(x)/sizeof((x)[0])) + +enum { A = 'A', Z = 'Z', a = 'a', z = 'z' }; // avoid need for single quotes below + +struct tuple { + int num; + const char *name; +}; + +struct tuple errors[] = { +" + for i in $errors + do + echo -E ' {'$i', "'$i'" },' + done + + echo -E " +}; + +struct tuple signals[] = { +" + for i in $signals + do + echo -E ' {'$i', "'$i'" },' + done + + # Use -E because on some systems bash builtin interprets \n itself. + echo -E ' +}; + +static int +tuplecmp(const void *a, const void *b) +{ + return ((struct tuple *)a)->num - ((struct tuple *)b)->num; +} + +int +main(void) +{ + int i, e; + char buf[1024], *p; + + printf("\n\n// Error table\n"); + printf("var errorList = [...]struct {\n"); + printf("\tnum syscall.Errno\n"); + printf("\tname string\n"); + printf("\tdesc string\n"); + printf("} {\n"); + qsort(errors, nelem(errors), sizeof errors[0], tuplecmp); + for(i=0; i 0 && errors[i-1].num == e) + continue; + strcpy(buf, strerror(e)); + // lowercase first letter: Bad -> bad, but STREAM -> STREAM. + if(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z) + buf[0] += a - A; + printf("\t{ %d, \"%s\", \"%s\" },\n", e, errors[i].name, buf); + } + printf("}\n\n"); + + printf("\n\n// Signal table\n"); + printf("var signalList = [...]struct {\n"); + printf("\tnum syscall.Signal\n"); + printf("\tname string\n"); + printf("\tdesc string\n"); + printf("} {\n"); + qsort(signals, nelem(signals), sizeof signals[0], tuplecmp); + for(i=0; i 0 && signals[i-1].num == e) + continue; + strcpy(buf, strsignal(e)); + // lowercase first letter: Bad -> bad, but STREAM -> STREAM. + if(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z) + buf[0] += a - A; + // cut trailing : number. + p = strrchr(buf, ":"[0]); + if(p) + *p = '\0'; + printf("\t{ %d, \"%s\", \"%s\" },\n", e, signals[i].name, buf); + } + printf("}\n\n"); + + return 0; +} + +' +) >_errors.c + +$CC $ccflags -o _errors _errors.c && $GORUN ./_errors && rm -f _errors.c _errors _const.go _error.grep _signal.grep _error.out diff --git a/api/vendor/golang.org/x/sys/unix/mkpost.go b/api/vendor/golang.org/x/sys/unix/mkpost.go new file mode 100644 index 0000000..7e5c22c --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/mkpost.go @@ -0,0 +1,98 @@ +// 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. + +// +build ignore + +// mkpost processes the output of cgo -godefs to +// modify the generated types. It is used to clean up +// the sys API in an architecture specific manner. +// +// mkpost is run after cgo -godefs; see README.md. +package main + +import ( + "bytes" + "fmt" + "go/format" + "io/ioutil" + "log" + "os" + "regexp" +) + +func main() { + // Get the OS and architecture (using GOARCH_TARGET if it exists) + goos := os.Getenv("GOOS") + goarch := os.Getenv("GOARCH_TARGET") + if goarch == "" { + goarch = os.Getenv("GOARCH") + } + // Check that we are using the new build system if we should be. + if goos == "linux" && goarch != "sparc64" { + if os.Getenv("GOLANG_SYS_BUILD") != "docker" { + os.Stderr.WriteString("In the new build system, mkpost should not be called directly.\n") + os.Stderr.WriteString("See README.md\n") + os.Exit(1) + } + } + + b, err := ioutil.ReadAll(os.Stdin) + if err != nil { + log.Fatal(err) + } + + // Intentionally export __val fields in Fsid and Sigset_t + valRegex := regexp.MustCompile(`type (Fsid|Sigset_t) struct {(\s+)X__val(\s+\S+\s+)}`) + b = valRegex.ReplaceAll(b, []byte("type $1 struct {${2}Val$3}")) + + // If we have empty Ptrace structs, we should delete them. Only s390x emits + // nonempty Ptrace structs. + ptraceRexexp := regexp.MustCompile(`type Ptrace((Psw|Fpregs|Per) struct {\s*})`) + b = ptraceRexexp.ReplaceAll(b, nil) + + // Replace the control_regs union with a blank identifier for now. + controlRegsRegex := regexp.MustCompile(`(Control_regs)\s+\[0\]uint64`) + b = controlRegsRegex.ReplaceAll(b, []byte("_ [0]uint64")) + + // Remove fields that are added by glibc + // Note that this is unstable as the identifers are private. + removeFieldsRegex := regexp.MustCompile(`X__glibc\S*`) + b = removeFieldsRegex.ReplaceAll(b, []byte("_")) + + // Convert [65]int8 to [65]byte in Utsname members to simplify + // conversion to string; see golang.org/issue/20753 + convertUtsnameRegex := regexp.MustCompile(`((Sys|Node|Domain)name|Release|Version|Machine)(\s+)\[(\d+)\]u?int8`) + b = convertUtsnameRegex.ReplaceAll(b, []byte("$1$3[$4]byte")) + + // Remove spare fields (e.g. in Statx_t) + spareFieldsRegex := regexp.MustCompile(`X__spare\S*`) + b = spareFieldsRegex.ReplaceAll(b, []byte("_")) + + // Remove cgo padding fields + removePaddingFieldsRegex := regexp.MustCompile(`Pad_cgo_\d+`) + b = removePaddingFieldsRegex.ReplaceAll(b, []byte("_")) + + // Remove padding, hidden, or unused fields + removeFieldsRegex = regexp.MustCompile(`\b(X_\S+|Padding)`) + b = removeFieldsRegex.ReplaceAll(b, []byte("_")) + + // Remove the first line of warning from cgo + b = b[bytes.IndexByte(b, '\n')+1:] + // Modify the command in the header to include: + // mkpost, our own warning, and a build tag. + replacement := fmt.Sprintf(`$1 | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build %s,%s`, goarch, goos) + cgoCommandRegex := regexp.MustCompile(`(cgo -godefs .*)`) + b = cgoCommandRegex.ReplaceAll(b, []byte(replacement)) + + // gofmt + b, err = format.Source(b) + if err != nil { + log.Fatal(err) + } + + os.Stdout.Write(b) +} diff --git a/api/vendor/golang.org/x/sys/unix/mksyscall.pl b/api/vendor/golang.org/x/sys/unix/mksyscall.pl new file mode 100755 index 0000000..1f6b926 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/mksyscall.pl @@ -0,0 +1,341 @@ +#!/usr/bin/env perl +# 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. + +# This program reads a file containing function prototypes +# (like syscall_darwin.go) and generates system call bodies. +# The prototypes are marked by lines beginning with "//sys" +# and read like func declarations if //sys is replaced by func, but: +# * The parameter lists must give a name for each argument. +# This includes return parameters. +# * The parameter lists must give a type for each argument: +# the (x, y, z int) shorthand is not allowed. +# * If the return parameter is an error number, it must be named errno. + +# A line beginning with //sysnb is like //sys, except that the +# goroutine will not be suspended during the execution of the system +# call. This must only be used for system calls which can never +# block, as otherwise the system call could cause all goroutines to +# hang. + +use strict; + +my $cmdline = "mksyscall.pl " . join(' ', @ARGV); +my $errors = 0; +my $_32bit = ""; +my $plan9 = 0; +my $openbsd = 0; +my $netbsd = 0; +my $dragonfly = 0; +my $arm = 0; # 64-bit value should use (even, odd)-pair +my $tags = ""; # build tags + +if($ARGV[0] eq "-b32") { + $_32bit = "big-endian"; + shift; +} elsif($ARGV[0] eq "-l32") { + $_32bit = "little-endian"; + shift; +} +if($ARGV[0] eq "-plan9") { + $plan9 = 1; + shift; +} +if($ARGV[0] eq "-openbsd") { + $openbsd = 1; + shift; +} +if($ARGV[0] eq "-netbsd") { + $netbsd = 1; + shift; +} +if($ARGV[0] eq "-dragonfly") { + $dragonfly = 1; + shift; +} +if($ARGV[0] eq "-arm") { + $arm = 1; + shift; +} +if($ARGV[0] eq "-tags") { + shift; + $tags = $ARGV[0]; + shift; +} + +if($ARGV[0] =~ /^-/) { + print STDERR "usage: mksyscall.pl [-b32 | -l32] [-tags x,y] [file ...]\n"; + exit 1; +} + +# Check that we are using the new build system if we should +if($ENV{'GOOS'} eq "linux" && $ENV{'GOARCH'} ne "sparc64") { + if($ENV{'GOLANG_SYS_BUILD'} ne "docker") { + print STDERR "In the new build system, mksyscall should not be called directly.\n"; + print STDERR "See README.md\n"; + exit 1; + } +} + + +sub parseparamlist($) { + my ($list) = @_; + $list =~ s/^\s*//; + $list =~ s/\s*$//; + if($list eq "") { + return (); + } + return split(/\s*,\s*/, $list); +} + +sub parseparam($) { + my ($p) = @_; + if($p !~ /^(\S*) (\S*)$/) { + print STDERR "$ARGV:$.: malformed parameter: $p\n"; + $errors = 1; + return ("xx", "int"); + } + return ($1, $2); +} + +my $text = ""; +while(<>) { + chomp; + s/\s+/ /g; + s/^\s+//; + s/\s+$//; + my $nonblock = /^\/\/sysnb /; + next if !/^\/\/sys / && !$nonblock; + + # Line must be of the form + # func Open(path string, mode int, perm int) (fd int, errno error) + # Split into name, in params, out params. + if(!/^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*((?i)SYS_[A-Z0-9_]+))?$/) { + print STDERR "$ARGV:$.: malformed //sys declaration\n"; + $errors = 1; + next; + } + my ($func, $in, $out, $sysname) = ($2, $3, $4, $5); + + # Split argument lists on comma. + my @in = parseparamlist($in); + my @out = parseparamlist($out); + + # Try in vain to keep people from editing this file. + # The theory is that they jump into the middle of the file + # without reading the header. + $text .= "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n"; + + # Go function header. + my $out_decl = @out ? sprintf(" (%s)", join(', ', @out)) : ""; + $text .= sprintf "func %s(%s)%s {\n", $func, join(', ', @in), $out_decl; + + # Check if err return available + my $errvar = ""; + foreach my $p (@out) { + my ($name, $type) = parseparam($p); + if($type eq "error") { + $errvar = $name; + last; + } + } + + # Prepare arguments to Syscall. + my @args = (); + my $n = 0; + foreach my $p (@in) { + my ($name, $type) = parseparam($p); + if($type =~ /^\*/) { + push @args, "uintptr(unsafe.Pointer($name))"; + } elsif($type eq "string" && $errvar ne "") { + $text .= "\tvar _p$n *byte\n"; + $text .= "\t_p$n, $errvar = BytePtrFromString($name)\n"; + $text .= "\tif $errvar != nil {\n\t\treturn\n\t}\n"; + push @args, "uintptr(unsafe.Pointer(_p$n))"; + $n++; + } elsif($type eq "string") { + print STDERR "$ARGV:$.: $func uses string arguments, but has no error return\n"; + $text .= "\tvar _p$n *byte\n"; + $text .= "\t_p$n, _ = BytePtrFromString($name)\n"; + push @args, "uintptr(unsafe.Pointer(_p$n))"; + $n++; + } elsif($type =~ /^\[\](.*)/) { + # Convert slice into pointer, length. + # Have to be careful not to take address of &a[0] if len == 0: + # pass dummy pointer in that case. + # Used to pass nil, but some OSes or simulators reject write(fd, nil, 0). + $text .= "\tvar _p$n unsafe.Pointer\n"; + $text .= "\tif len($name) > 0 {\n\t\t_p$n = unsafe.Pointer(\&${name}[0])\n\t}"; + $text .= " else {\n\t\t_p$n = unsafe.Pointer(&_zero)\n\t}"; + $text .= "\n"; + push @args, "uintptr(_p$n)", "uintptr(len($name))"; + $n++; + } elsif($type eq "int64" && ($openbsd || $netbsd)) { + push @args, "0"; + if($_32bit eq "big-endian") { + push @args, "uintptr($name>>32)", "uintptr($name)"; + } elsif($_32bit eq "little-endian") { + push @args, "uintptr($name)", "uintptr($name>>32)"; + } else { + push @args, "uintptr($name)"; + } + } elsif($type eq "int64" && $dragonfly) { + if ($func !~ /^extp(read|write)/i) { + push @args, "0"; + } + if($_32bit eq "big-endian") { + push @args, "uintptr($name>>32)", "uintptr($name)"; + } elsif($_32bit eq "little-endian") { + push @args, "uintptr($name)", "uintptr($name>>32)"; + } else { + push @args, "uintptr($name)"; + } + } elsif($type eq "int64" && $_32bit ne "") { + if(@args % 2 && $arm) { + # arm abi specifies 64-bit argument uses + # (even, odd) pair + push @args, "0" + } + if($_32bit eq "big-endian") { + push @args, "uintptr($name>>32)", "uintptr($name)"; + } else { + push @args, "uintptr($name)", "uintptr($name>>32)"; + } + } else { + push @args, "uintptr($name)"; + } + } + + # Determine which form to use; pad args with zeros. + my $asm = "Syscall"; + if ($nonblock) { + if ($errvar eq "" && $ENV{'GOOS'} eq "linux") { + $asm = "RawSyscallNoError"; + } else { + $asm = "RawSyscall"; + } + } else { + if ($errvar eq "" && $ENV{'GOOS'} eq "linux") { + $asm = "SyscallNoError"; + } + } + if(@args <= 3) { + while(@args < 3) { + push @args, "0"; + } + } elsif(@args <= 6) { + $asm .= "6"; + while(@args < 6) { + push @args, "0"; + } + } elsif(@args <= 9) { + $asm .= "9"; + while(@args < 9) { + push @args, "0"; + } + } else { + print STDERR "$ARGV:$.: too many arguments to system call\n"; + } + + # System call number. + if($sysname eq "") { + $sysname = "SYS_$func"; + $sysname =~ s/([a-z])([A-Z])/${1}_$2/g; # turn FooBar into Foo_Bar + $sysname =~ y/a-z/A-Z/; + } + + # Actual call. + my $args = join(', ', @args); + my $call = "$asm($sysname, $args)"; + + # Assign return values. + my $body = ""; + my @ret = ("_", "_", "_"); + my $do_errno = 0; + for(my $i=0; $i<@out; $i++) { + my $p = $out[$i]; + my ($name, $type) = parseparam($p); + my $reg = ""; + if($name eq "err" && !$plan9) { + $reg = "e1"; + $ret[2] = $reg; + $do_errno = 1; + } elsif($name eq "err" && $plan9) { + $ret[0] = "r0"; + $ret[2] = "e1"; + next; + } else { + $reg = sprintf("r%d", $i); + $ret[$i] = $reg; + } + if($type eq "bool") { + $reg = "$reg != 0"; + } + if($type eq "int64" && $_32bit ne "") { + # 64-bit number in r1:r0 or r0:r1. + if($i+2 > @out) { + print STDERR "$ARGV:$.: not enough registers for int64 return\n"; + } + if($_32bit eq "big-endian") { + $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i, $i+1); + } else { + $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i+1, $i); + } + $ret[$i] = sprintf("r%d", $i); + $ret[$i+1] = sprintf("r%d", $i+1); + } + if($reg ne "e1" || $plan9) { + $body .= "\t$name = $type($reg)\n"; + } + } + if ($ret[0] eq "_" && $ret[1] eq "_" && $ret[2] eq "_") { + $text .= "\t$call\n"; + } else { + if ($errvar eq "" && $ENV{'GOOS'} eq "linux") { + # raw syscall without error on Linux, see golang.org/issue/22924 + $text .= "\t$ret[0], $ret[1] := $call\n"; + } else { + $text .= "\t$ret[0], $ret[1], $ret[2] := $call\n"; + } + } + $text .= $body; + + if ($plan9 && $ret[2] eq "e1") { + $text .= "\tif int32(r0) == -1 {\n"; + $text .= "\t\terr = e1\n"; + $text .= "\t}\n"; + } elsif ($do_errno) { + $text .= "\tif e1 != 0 {\n"; + $text .= "\t\terr = errnoErr(e1)\n"; + $text .= "\t}\n"; + } + $text .= "\treturn\n"; + $text .= "}\n\n"; +} + +chomp $text; +chomp $text; + +if($errors) { + exit 1; +} + +print <) { + chomp; + s/\s+/ /g; + s/^\s+//; + s/\s+$//; + $package = $1 if !$package && /^package (\S+)$/; + my $nonblock = /^\/\/sysnb /; + next if !/^\/\/sys / && !$nonblock; + + # Line must be of the form + # func Open(path string, mode int, perm int) (fd int, err error) + # Split into name, in params, out params. + if(!/^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*(?:(\w*)\.)?(\w*))?$/) { + print STDERR "$ARGV:$.: malformed //sys declaration\n"; + $errors = 1; + next; + } + my ($nb, $func, $in, $out, $modname, $sysname) = ($1, $2, $3, $4, $5, $6); + + # Split argument lists on comma. + my @in = parseparamlist($in); + my @out = parseparamlist($out); + + # So file name. + if($modname eq "") { + $modname = "libc"; + } + + # System call name. + if($sysname eq "") { + $sysname = "$func"; + } + + # System call pointer variable name. + my $sysvarname = "proc$sysname"; + + my $strconvfunc = "BytePtrFromString"; + my $strconvtype = "*byte"; + + $sysname =~ y/A-Z/a-z/; # All libc functions are lowercase. + + # Runtime import of function to allow cross-platform builds. + $dynimports .= "//go:cgo_import_dynamic libc_${sysname} ${sysname} \"$modname.so\"\n"; + # Link symbol to proc address variable. + $linknames .= "//go:linkname ${sysvarname} libc_${sysname}\n"; + # Library proc address variable. + push @vars, $sysvarname; + + # Go function header. + $out = join(', ', @out); + if($out ne "") { + $out = " ($out)"; + } + if($text ne "") { + $text .= "\n" + } + $text .= sprintf "func %s(%s)%s {\n", $func, join(', ', @in), $out; + + # Check if err return available + my $errvar = ""; + foreach my $p (@out) { + my ($name, $type) = parseparam($p); + if($type eq "error") { + $errvar = $name; + last; + } + } + + # Prepare arguments to Syscall. + my @args = (); + my $n = 0; + foreach my $p (@in) { + my ($name, $type) = parseparam($p); + if($type =~ /^\*/) { + push @args, "uintptr(unsafe.Pointer($name))"; + } elsif($type eq "string" && $errvar ne "") { + $text .= "\tvar _p$n $strconvtype\n"; + $text .= "\t_p$n, $errvar = $strconvfunc($name)\n"; + $text .= "\tif $errvar != nil {\n\t\treturn\n\t}\n"; + push @args, "uintptr(unsafe.Pointer(_p$n))"; + $n++; + } elsif($type eq "string") { + print STDERR "$ARGV:$.: $func uses string arguments, but has no error return\n"; + $text .= "\tvar _p$n $strconvtype\n"; + $text .= "\t_p$n, _ = $strconvfunc($name)\n"; + push @args, "uintptr(unsafe.Pointer(_p$n))"; + $n++; + } elsif($type =~ /^\[\](.*)/) { + # Convert slice into pointer, length. + # Have to be careful not to take address of &a[0] if len == 0: + # pass nil in that case. + $text .= "\tvar _p$n *$1\n"; + $text .= "\tif len($name) > 0 {\n\t\t_p$n = \&$name\[0]\n\t}\n"; + push @args, "uintptr(unsafe.Pointer(_p$n))", "uintptr(len($name))"; + $n++; + } elsif($type eq "int64" && $_32bit ne "") { + if($_32bit eq "big-endian") { + push @args, "uintptr($name >> 32)", "uintptr($name)"; + } else { + push @args, "uintptr($name)", "uintptr($name >> 32)"; + } + } elsif($type eq "bool") { + $text .= "\tvar _p$n uint32\n"; + $text .= "\tif $name {\n\t\t_p$n = 1\n\t} else {\n\t\t_p$n = 0\n\t}\n"; + push @args, "uintptr(_p$n)"; + $n++; + } else { + push @args, "uintptr($name)"; + } + } + my $nargs = @args; + + # Determine which form to use; pad args with zeros. + my $asm = "sysvicall6"; + if ($nonblock) { + $asm = "rawSysvicall6"; + } + if(@args <= 6) { + while(@args < 6) { + push @args, "0"; + } + } else { + print STDERR "$ARGV:$.: too many arguments to system call\n"; + } + + # Actual call. + my $args = join(', ', @args); + my $call = "$asm(uintptr(unsafe.Pointer(&$sysvarname)), $nargs, $args)"; + + # Assign return values. + my $body = ""; + my $failexpr = ""; + my @ret = ("_", "_", "_"); + my @pout= (); + my $do_errno = 0; + for(my $i=0; $i<@out; $i++) { + my $p = $out[$i]; + my ($name, $type) = parseparam($p); + my $reg = ""; + if($name eq "err") { + $reg = "e1"; + $ret[2] = $reg; + $do_errno = 1; + } else { + $reg = sprintf("r%d", $i); + $ret[$i] = $reg; + } + if($type eq "bool") { + $reg = "$reg != 0"; + } + if($type eq "int64" && $_32bit ne "") { + # 64-bit number in r1:r0 or r0:r1. + if($i+2 > @out) { + print STDERR "$ARGV:$.: not enough registers for int64 return\n"; + } + if($_32bit eq "big-endian") { + $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i, $i+1); + } else { + $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i+1, $i); + } + $ret[$i] = sprintf("r%d", $i); + $ret[$i+1] = sprintf("r%d", $i+1); + } + if($reg ne "e1") { + $body .= "\t$name = $type($reg)\n"; + } + } + if ($ret[0] eq "_" && $ret[1] eq "_" && $ret[2] eq "_") { + $text .= "\t$call\n"; + } else { + $text .= "\t$ret[0], $ret[1], $ret[2] := $call\n"; + } + $text .= $body; + + if ($do_errno) { + $text .= "\tif e1 != 0 {\n"; + $text .= "\t\terr = e1\n"; + $text .= "\t}\n"; + } + $text .= "\treturn\n"; + $text .= "}\n"; +} + +if($errors) { + exit 1; +} + +print < "net.inet", + "net.inet.ipproto" => "net.inet", + "net.inet6.ipv6proto" => "net.inet6", + "net.inet6.ipv6" => "net.inet6.ip6", + "net.inet.icmpv6" => "net.inet6.icmp6", + "net.inet6.divert6" => "net.inet6.divert", + "net.inet6.tcp6" => "net.inet.tcp", + "net.inet6.udp6" => "net.inet.udp", + "mpls" => "net.mpls", + "swpenc" => "vm.swapencrypt" +); + +# Node mappings +my %node_map = ( + "net.inet.ip.ifq" => "net.ifq", + "net.inet.pfsync" => "net.pfsync", + "net.mpls.ifq" => "net.ifq" +); + +my $ctlname; +my %mib = (); +my %sysctl = (); +my $node; + +sub debug() { + print STDERR "$_[0]\n" if $debug; +} + +# Walk the MIB and build a sysctl name to OID mapping. +sub build_sysctl() { + my ($node, $name, $oid) = @_; + my %node = %{$node}; + my @oid = @{$oid}; + + foreach my $key (sort keys %node) { + my @node = @{$node{$key}}; + my $nodename = $name.($name ne '' ? '.' : '').$key; + my @nodeoid = (@oid, $node[0]); + if ($node[1] eq 'CTLTYPE_NODE') { + if (exists $node_map{$nodename}) { + $node = \%mib; + $ctlname = $node_map{$nodename}; + foreach my $part (split /\./, $ctlname) { + $node = \%{@{$$node{$part}}[2]}; + } + } else { + $node = $node[2]; + } + &build_sysctl($node, $nodename, \@nodeoid); + } elsif ($node[1] ne '') { + $sysctl{$nodename} = \@nodeoid; + } + } +} + +foreach my $ctl (@ctls) { + $ctls{$ctl} = $ctl; +} + +# Build MIB +foreach my $header (@headers) { + &debug("Processing $header..."); + open HEADER, "/usr/include/$header" || + print STDERR "Failed to open $header\n"; + while (

    ) { + if ($_ =~ /^#define\s+(CTL_NAMES)\s+{/ || + $_ =~ /^#define\s+(CTL_(.*)_NAMES)\s+{/ || + $_ =~ /^#define\s+((.*)CTL_NAMES)\s+{/) { + if ($1 eq 'CTL_NAMES') { + # Top level. + $node = \%mib; + } else { + # Node. + my $nodename = lc($2); + if ($header =~ /^netinet\//) { + $ctlname = "net.inet.$nodename"; + } elsif ($header =~ /^netinet6\//) { + $ctlname = "net.inet6.$nodename"; + } elsif ($header =~ /^net\//) { + $ctlname = "net.$nodename"; + } else { + $ctlname = "$nodename"; + $ctlname =~ s/^(fs|net|kern)_/$1\./; + } + if (exists $ctl_map{$ctlname}) { + $ctlname = $ctl_map{$ctlname}; + } + if (not exists $ctls{$ctlname}) { + &debug("Ignoring $ctlname..."); + next; + } + + # Walk down from the top of the MIB. + $node = \%mib; + foreach my $part (split /\./, $ctlname) { + if (not exists $$node{$part}) { + &debug("Missing node $part"); + $$node{$part} = [ 0, '', {} ]; + } + $node = \%{@{$$node{$part}}[2]}; + } + } + + # Populate current node with entries. + my $i = -1; + while (defined($_) && $_ !~ /^}/) { + $_ =
    ; + $i++ if $_ =~ /{.*}/; + next if $_ !~ /{\s+"(\w+)",\s+(CTLTYPE_[A-Z]+)\s+}/; + $$node{$1} = [ $i, $2, {} ]; + } + } + } + close HEADER; +} + +&build_sysctl(\%mib, "", []); + +print <){ + if(/^#define\s+SYS_(\w+)\s+([0-9]+)/){ + my $name = $1; + my $num = $2; + $name =~ y/a-z/A-Z/; + print " SYS_$name = $num;" + } +} + +print <){ + if(/^([0-9]+)\s+STD\s+({ \S+\s+(\w+).*)$/){ + my $num = $1; + my $proto = $2; + my $name = "SYS_$3"; + $name =~ y/a-z/A-Z/; + + # There are multiple entries for enosys and nosys, so comment them out. + if($name =~ /^SYS_E?NOSYS$/){ + $name = "// $name"; + } + if($name eq 'SYS_SYS_EXIT'){ + $name = 'SYS_EXIT'; + } + + print " $name = $num; // $proto\n"; + } +} + +print <){ + if(/^([0-9]+)\s+\S+\s+STD\s+({ \S+\s+(\w+).*)$/){ + my $num = $1; + my $proto = $2; + my $name = "SYS_$3"; + $name =~ y/a-z/A-Z/; + + # There are multiple entries for enosys and nosys, so comment them out. + if($name =~ /^SYS_E?NOSYS$/){ + $name = "// $name"; + } + if($name eq 'SYS_SYS_EXIT'){ + $name = 'SYS_EXIT'; + } + + print " $name = $num; // $proto\n"; + } +} + +print <){ + if($line =~ /^(.*)\\$/) { + # Handle continuation + $line = $1; + $_ =~ s/^\s+//; + $line .= $_; + } else { + # New line + $line = $_; + } + next if $line =~ /\\$/; + if($line =~ /^([0-9]+)\s+((STD)|(NOERR))\s+(RUMP\s+)?({\s+\S+\s*\*?\s*\|(\S+)\|(\S*)\|(\w+).*\s+})(\s+(\S+))?$/) { + my $num = $1; + my $proto = $6; + my $compat = $8; + my $name = "$7_$9"; + + $name = "$7_$11" if $11 ne ''; + $name =~ y/a-z/A-Z/; + + if($compat eq '' || $compat eq '13' || $compat eq '30' || $compat eq '50') { + print " $name = $num; // $proto\n"; + } + } +} + +print <){ + if(/^([0-9]+)\s+STD\s+(NOLOCK\s+)?({ \S+\s+\*?(\w+).*)$/){ + my $num = $1; + my $proto = $3; + my $name = $4; + $name =~ y/a-z/A-Z/; + + # There are multiple entries for enosys and nosys, so comment them out. + if($name =~ /^SYS_E?NOSYS$/){ + $name = "// $name"; + } + if($name eq 'SYS_SYS_EXIT'){ + $name = 'SYS_EXIT'; + } + + print " $name = $num; // $proto\n"; + } +} + +print < uint64(len(b)) { + return nil, nil, EINVAL + } + return h, b[cmsgAlignOf(SizeofCmsghdr):h.Len], nil +} + +// UnixRights encodes a set of open file descriptors into a socket +// control message for sending to another process. +func UnixRights(fds ...int) []byte { + datalen := len(fds) * 4 + b := make([]byte, CmsgSpace(datalen)) + h := (*Cmsghdr)(unsafe.Pointer(&b[0])) + h.Level = SOL_SOCKET + h.Type = SCM_RIGHTS + h.SetLen(CmsgLen(datalen)) + data := cmsgData(h) + for _, fd := range fds { + *(*int32)(data) = int32(fd) + data = unsafe.Pointer(uintptr(data) + 4) + } + return b +} + +// ParseUnixRights decodes a socket control message that contains an +// integer array of open file descriptors from another process. +func ParseUnixRights(m *SocketControlMessage) ([]int, error) { + if m.Header.Level != SOL_SOCKET { + return nil, EINVAL + } + if m.Header.Type != SCM_RIGHTS { + return nil, EINVAL + } + fds := make([]int, len(m.Data)>>2) + for i, j := 0, 0; i < len(m.Data); i += 4 { + fds[j] = int(*(*int32)(unsafe.Pointer(&m.Data[i]))) + j++ + } + return fds, nil +} diff --git a/api/vendor/golang.org/x/sys/unix/str.go b/api/vendor/golang.org/x/sys/unix/str.go new file mode 100644 index 0000000..35ed664 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/str.go @@ -0,0 +1,26 @@ +// 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +package unix + +func itoa(val int) string { // do it here rather than with fmt to avoid dependency + if val < 0 { + return "-" + uitoa(uint(-val)) + } + return uitoa(uint(val)) +} + +func uitoa(val uint) string { + var buf [32]byte // big enough for int64 + i := len(buf) - 1 + for val >= 10 { + buf[i] = byte(val%10 + '0') + i-- + val /= 10 + } + buf[i] = byte(val + '0') + return string(buf[i:]) +} diff --git a/api/vendor/golang.org/x/sys/unix/syscall.go b/api/vendor/golang.org/x/sys/unix/syscall.go new file mode 100644 index 0000000..ef35fce --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall.go @@ -0,0 +1,54 @@ +// 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +// Package unix contains an interface to the low-level operating system +// primitives. OS details vary depending on the underlying system, and +// by default, godoc will display OS-specific documentation for the current +// system. If you want godoc to display OS documentation for another +// system, set $GOOS and $GOARCH to the desired system. For example, if +// you want to view documentation for freebsd/arm on linux/amd64, set $GOOS +// to freebsd and $GOARCH to arm. +// +// The primary use of this package is inside other packages that provide a more +// portable interface to the system, such as "os", "time" and "net". Use +// those packages rather than this one if you can. +// +// For details of the functions and data types in this package consult +// the manuals for the appropriate operating system. +// +// These calls return err == nil to indicate success; otherwise +// err represents an operating system error describing the failure and +// holds a value of type syscall.Errno. +package unix // import "golang.org/x/sys/unix" + +import "strings" + +// ByteSliceFromString returns a NUL-terminated slice of bytes +// containing the text of s. If s contains a NUL byte at any +// location, it returns (nil, EINVAL). +func ByteSliceFromString(s string) ([]byte, error) { + if strings.IndexByte(s, 0) != -1 { + return nil, EINVAL + } + a := make([]byte, len(s)+1) + copy(a, s) + return a, nil +} + +// BytePtrFromString returns a pointer to a NUL-terminated array of +// bytes containing the text of s. If s contains a NUL byte at any +// location, it returns (nil, EINVAL). +func BytePtrFromString(s string) (*byte, error) { + a, err := ByteSliceFromString(s) + if err != nil { + return nil, err + } + return &a[0], nil +} + +// Single-word zero for use when we need a valid pointer to 0 bytes. +// See mkunix.pl. +var _zero uintptr diff --git a/api/vendor/golang.org/x/sys/unix/syscall_bsd.go b/api/vendor/golang.org/x/sys/unix/syscall_bsd.go new file mode 100644 index 0000000..53fb851 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_bsd.go @@ -0,0 +1,624 @@ +// 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. + +// +build darwin dragonfly freebsd netbsd openbsd + +// BSD system call wrappers shared by *BSD based systems +// including OS X (Darwin) and FreeBSD. Like the other +// syscall_*.go files it is compiled as Go code but also +// used as input to mksyscall which parses the //sys +// lines and generates system call stubs. + +package unix + +import ( + "runtime" + "syscall" + "unsafe" +) + +/* + * Wrapped + */ + +//sysnb getgroups(ngid int, gid *_Gid_t) (n int, err error) +//sysnb setgroups(ngid int, gid *_Gid_t) (err error) + +func Getgroups() (gids []int, err error) { + n, err := getgroups(0, nil) + if err != nil { + return nil, err + } + if n == 0 { + return nil, nil + } + + // Sanity check group count. Max is 16 on BSD. + if n < 0 || n > 1000 { + return nil, EINVAL + } + + a := make([]_Gid_t, n) + n, err = getgroups(n, &a[0]) + if err != nil { + return nil, err + } + gids = make([]int, n) + for i, v := range a[0:n] { + gids[i] = int(v) + } + return +} + +func Setgroups(gids []int) (err error) { + if len(gids) == 0 { + return setgroups(0, nil) + } + + a := make([]_Gid_t, len(gids)) + for i, v := range gids { + a[i] = _Gid_t(v) + } + return setgroups(len(a), &a[0]) +} + +func ReadDirent(fd int, buf []byte) (n int, err error) { + // Final argument is (basep *uintptr) and the syscall doesn't take nil. + // 64 bits should be enough. (32 bits isn't even on 386). Since the + // actual system call is getdirentries64, 64 is a good guess. + // TODO(rsc): Can we use a single global basep for all calls? + var base = (*uintptr)(unsafe.Pointer(new(uint64))) + return Getdirentries(fd, buf, base) +} + +// Wait status is 7 bits at bottom, either 0 (exited), +// 0x7F (stopped), or a signal number that caused an exit. +// The 0x80 bit is whether there was a core dump. +// An extra number (exit code, signal causing a stop) +// is in the high bits. + +type WaitStatus uint32 + +const ( + mask = 0x7F + core = 0x80 + shift = 8 + + exited = 0 + stopped = 0x7F +) + +func (w WaitStatus) Exited() bool { return w&mask == exited } + +func (w WaitStatus) ExitStatus() int { + if w&mask != exited { + return -1 + } + return int(w >> shift) +} + +func (w WaitStatus) Signaled() bool { return w&mask != stopped && w&mask != 0 } + +func (w WaitStatus) Signal() syscall.Signal { + sig := syscall.Signal(w & mask) + if sig == stopped || sig == 0 { + return -1 + } + return sig +} + +func (w WaitStatus) CoreDump() bool { return w.Signaled() && w&core != 0 } + +func (w WaitStatus) Stopped() bool { return w&mask == stopped && syscall.Signal(w>>shift) != SIGSTOP } + +func (w WaitStatus) Continued() bool { return w&mask == stopped && syscall.Signal(w>>shift) == SIGSTOP } + +func (w WaitStatus) StopSignal() syscall.Signal { + if !w.Stopped() { + return -1 + } + return syscall.Signal(w>>shift) & 0xFF +} + +func (w WaitStatus) TrapCause() int { return -1 } + +//sys wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) + +func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) { + var status _C_int + wpid, err = wait4(pid, &status, options, rusage) + if wstatus != nil { + *wstatus = WaitStatus(status) + } + return +} + +//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (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) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys Shutdown(s int, how int) (err error) + +func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, EINVAL + } + sa.raw.Len = SizeofSockaddrInet4 + sa.raw.Family = AF_INET + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil +} + +func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, EINVAL + } + sa.raw.Len = SizeofSockaddrInet6 + sa.raw.Family = AF_INET6 + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + sa.raw.Scope_id = sa.ZoneId + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil +} + +func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) { + name := sa.Name + n := len(name) + if n >= len(sa.raw.Path) || n == 0 { + return nil, 0, EINVAL + } + sa.raw.Len = byte(3 + n) // 2 for Family, Len; 1 for NUL + sa.raw.Family = AF_UNIX + for i := 0; i < n; i++ { + sa.raw.Path[i] = int8(name[i]) + } + return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil +} + +func (sa *SockaddrDatalink) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Index == 0 { + return nil, 0, EINVAL + } + sa.raw.Len = sa.Len + sa.raw.Family = AF_LINK + sa.raw.Index = sa.Index + sa.raw.Type = sa.Type + sa.raw.Nlen = sa.Nlen + sa.raw.Alen = sa.Alen + sa.raw.Slen = sa.Slen + for i := 0; i < len(sa.raw.Data); i++ { + sa.raw.Data[i] = sa.Data[i] + } + return unsafe.Pointer(&sa.raw), SizeofSockaddrDatalink, nil +} + +func anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) { + switch rsa.Addr.Family { + case AF_LINK: + pp := (*RawSockaddrDatalink)(unsafe.Pointer(rsa)) + sa := new(SockaddrDatalink) + sa.Len = pp.Len + sa.Family = pp.Family + sa.Index = pp.Index + sa.Type = pp.Type + sa.Nlen = pp.Nlen + sa.Alen = pp.Alen + sa.Slen = pp.Slen + for i := 0; i < len(sa.Data); i++ { + sa.Data[i] = pp.Data[i] + } + return sa, nil + + case AF_UNIX: + pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa)) + if pp.Len < 2 || pp.Len > SizeofSockaddrUnix { + return nil, EINVAL + } + sa := new(SockaddrUnix) + + // Some BSDs include the trailing NUL in the length, whereas + // others do not. Work around this by subtracting the leading + // family and len. The path is then scanned to see if a NUL + // terminator still exists within the length. + n := int(pp.Len) - 2 // subtract leading Family, Len + for i := 0; i < n; i++ { + if pp.Path[i] == 0 { + // found early NUL; assume Len included the NUL + // or was overestimating. + n = i + break + } + } + bytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n] + sa.Name = string(bytes) + return sa, nil + + case AF_INET: + pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet4) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + + case AF_INET6: + pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet6) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + sa.ZoneId = pp.Scope_id + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + } + return nil, EAFNOSUPPORT +} + +func Accept(fd int) (nfd int, sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + nfd, err = accept(fd, &rsa, &len) + if err != nil { + return + } + if runtime.GOOS == "darwin" && len == 0 { + // Accepted socket has no address. + // This is likely due to a bug in xnu kernels, + // where instead of ECONNABORTED error socket + // is accepted, but has no address. + Close(nfd) + return 0, nil, ECONNABORTED + } + sa, err = anyToSockaddr(&rsa) + if err != nil { + Close(nfd) + nfd = 0 + } + return +} + +func Getsockname(fd int) (sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + if err = getsockname(fd, &rsa, &len); err != nil { + return + } + // TODO(jsing): DragonFly has a "bug" (see issue 3349), which should be + // reported upstream. + if runtime.GOOS == "dragonfly" && rsa.Addr.Family == AF_UNSPEC && rsa.Addr.Len == 0 { + rsa.Addr.Family = AF_UNIX + rsa.Addr.Len = SizeofSockaddrUnix + } + return anyToSockaddr(&rsa) +} + +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) + +// GetsockoptString returns the string value of the socket option opt for the +// socket associated with fd at the given socket level. +func GetsockoptString(fd, level, opt int) (string, error) { + buf := make([]byte, 256) + vallen := _Socklen(len(buf)) + err := getsockopt(fd, level, opt, unsafe.Pointer(&buf[0]), &vallen) + if err != nil { + return "", err + } + return string(buf[:vallen-1]), nil +} + +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) + +func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { + var msg Msghdr + var rsa RawSockaddrAny + msg.Name = (*byte)(unsafe.Pointer(&rsa)) + msg.Namelen = uint32(SizeofSockaddrAny) + var iov Iovec + if len(p) > 0 { + iov.Base = (*byte)(unsafe.Pointer(&p[0])) + iov.SetLen(len(p)) + } + var dummy byte + if len(oob) > 0 { + // receive at least one normal byte + if len(p) == 0 { + iov.Base = &dummy + iov.SetLen(1) + } + msg.Control = (*byte)(unsafe.Pointer(&oob[0])) + msg.SetControllen(len(oob)) + } + msg.Iov = &iov + msg.Iovlen = 1 + if n, err = recvmsg(fd, &msg, flags); err != nil { + return + } + oobn = int(msg.Controllen) + recvflags = int(msg.Flags) + // source address is only specified if the socket is unconnected + if rsa.Addr.Family != AF_UNSPEC { + from, err = anyToSockaddr(&rsa) + } + return +} + +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) + +func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { + _, err = SendmsgN(fd, p, oob, to, flags) + return +} + +func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { + var ptr unsafe.Pointer + var salen _Socklen + if to != nil { + ptr, salen, err = to.sockaddr() + if err != nil { + return 0, err + } + } + var msg Msghdr + msg.Name = (*byte)(unsafe.Pointer(ptr)) + msg.Namelen = uint32(salen) + var iov Iovec + if len(p) > 0 { + iov.Base = (*byte)(unsafe.Pointer(&p[0])) + iov.SetLen(len(p)) + } + var dummy byte + if len(oob) > 0 { + // send at least one normal byte + if len(p) == 0 { + iov.Base = &dummy + iov.SetLen(1) + } + msg.Control = (*byte)(unsafe.Pointer(&oob[0])) + msg.SetControllen(len(oob)) + } + msg.Iov = &iov + msg.Iovlen = 1 + if n, err = sendmsg(fd, &msg, flags); err != nil { + return 0, err + } + if len(oob) > 0 && len(p) == 0 { + n = 0 + } + return n, nil +} + +//sys kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) + +func Kevent(kq int, changes, events []Kevent_t, timeout *Timespec) (n int, err error) { + var change, event unsafe.Pointer + if len(changes) > 0 { + change = unsafe.Pointer(&changes[0]) + } + if len(events) > 0 { + event = unsafe.Pointer(&events[0]) + } + return kevent(kq, change, len(changes), event, len(events), timeout) +} + +//sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL + +// sysctlmib translates name to mib number and appends any additional args. +func sysctlmib(name string, args ...int) ([]_C_int, error) { + // Translate name to mib number. + mib, err := nametomib(name) + if err != nil { + return nil, err + } + + for _, a := range args { + mib = append(mib, _C_int(a)) + } + + return mib, nil +} + +func Sysctl(name string) (string, error) { + return SysctlArgs(name) +} + +func SysctlArgs(name string, args ...int) (string, error) { + buf, err := SysctlRaw(name, args...) + if err != nil { + return "", err + } + n := len(buf) + + // Throw away terminating NUL. + if n > 0 && buf[n-1] == '\x00' { + n-- + } + return string(buf[0:n]), nil +} + +func SysctlUint32(name string) (uint32, error) { + return SysctlUint32Args(name) +} + +func SysctlUint32Args(name string, args ...int) (uint32, error) { + mib, err := sysctlmib(name, args...) + if err != nil { + return 0, err + } + + n := uintptr(4) + buf := make([]byte, 4) + if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil { + return 0, err + } + if n != 4 { + return 0, EIO + } + return *(*uint32)(unsafe.Pointer(&buf[0])), nil +} + +func SysctlUint64(name string, args ...int) (uint64, error) { + mib, err := sysctlmib(name, args...) + if err != nil { + return 0, err + } + + n := uintptr(8) + buf := make([]byte, 8) + if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil { + return 0, err + } + if n != 8 { + return 0, EIO + } + return *(*uint64)(unsafe.Pointer(&buf[0])), nil +} + +func SysctlRaw(name string, args ...int) ([]byte, error) { + mib, err := sysctlmib(name, args...) + if err != nil { + return nil, err + } + + // Find size. + n := uintptr(0) + if err := sysctl(mib, nil, &n, nil, 0); err != nil { + return nil, err + } + if n == 0 { + return nil, nil + } + + // Read into buffer of that size. + buf := make([]byte, n) + if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil { + return nil, err + } + + // The actual call may return less than the original reported required + // size so ensure we deal with that. + return buf[:n], nil +} + +//sys utimes(path string, timeval *[2]Timeval) (err error) + +func Utimes(path string, tv []Timeval) error { + if tv == nil { + return utimes(path, nil) + } + if len(tv) != 2 { + return EINVAL + } + return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +func UtimesNano(path string, ts []Timespec) error { + if ts == nil { + err := utimensat(AT_FDCWD, path, nil, 0) + if err != ENOSYS { + return err + } + return utimes(path, nil) + } + if len(ts) != 2 { + return EINVAL + } + // Darwin setattrlist can set nanosecond timestamps + err := setattrlistTimes(path, ts, 0) + if err != ENOSYS { + return err + } + err = utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) + if err != ENOSYS { + return err + } + // Not as efficient as it could be because Timespec and + // Timeval have different types in the different OSes + tv := [2]Timeval{ + NsecToTimeval(TimespecToNsec(ts[0])), + NsecToTimeval(TimespecToNsec(ts[1])), + } + return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +func UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) error { + if ts == nil { + return utimensat(dirfd, path, nil, flags) + } + if len(ts) != 2 { + return EINVAL + } + err := setattrlistTimes(path, ts, flags) + if err != ENOSYS { + return err + } + return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags) +} + +//sys futimes(fd int, timeval *[2]Timeval) (err error) + +func Futimes(fd int, tv []Timeval) error { + if tv == nil { + return futimes(fd, nil) + } + if len(tv) != 2 { + return EINVAL + } + return futimes(fd, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +//sys fcntl(fd int, cmd int, arg int) (val int, err error) + +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} + +// TODO: wrap +// Acct(name nil-string) (err error) +// Gethostuuid(uuid *byte, timeout *Timespec) (err error) +// Ptrace(req int, pid int, addr uintptr, data int) (ret uintptr, err error) + +var mapper = &mmapper{ + active: make(map[*byte][]byte), + mmap: mmap, + munmap: munmap, +} + +func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { + return mapper.Mmap(fd, offset, length, prot, flags) +} + +func Munmap(b []byte) (err error) { + return mapper.Munmap(b) +} + +//sys Madvise(b []byte, behav int) (err error) +//sys Mlock(b []byte) (err error) +//sys Mlockall(flags int) (err error) +//sys Mprotect(b []byte, prot int) (err error) +//sys Msync(b []byte, flags int) (err error) +//sys Munlock(b []byte) (err error) +//sys Munlockall() (err error) diff --git a/api/vendor/golang.org/x/sys/unix/syscall_bsd_test.go b/api/vendor/golang.org/x/sys/unix/syscall_bsd_test.go new file mode 100644 index 0000000..6c4e2ac --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_bsd_test.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. + +// +build darwin dragonfly freebsd openbsd + +package unix_test + +import ( + "os/exec" + "runtime" + "testing" + "time" + + "golang.org/x/sys/unix" +) + +const MNT_WAIT = 1 +const MNT_NOWAIT = 2 + +func TestGetfsstat(t *testing.T) { + const flags = MNT_NOWAIT // see golang.org/issue/16937 + n, err := unix.Getfsstat(nil, flags) + if err != nil { + t.Fatal(err) + } + + data := make([]unix.Statfs_t, n) + n2, err := unix.Getfsstat(data, flags) + if err != nil { + t.Fatal(err) + } + if n != n2 { + t.Errorf("Getfsstat(nil) = %d, but subsequent Getfsstat(slice) = %d", n, n2) + } + for i, stat := range data { + if stat == (unix.Statfs_t{}) { + t.Errorf("index %v is an empty Statfs_t struct", i) + } + } + if t.Failed() { + for i, stat := range data[:n2] { + t.Logf("data[%v] = %+v", i, stat) + } + mount, err := exec.Command("mount").CombinedOutput() + if err != nil { + t.Logf("mount: %v\n%s", err, mount) + } else { + t.Logf("mount: %s", mount) + } + } +} + +func TestSelect(t *testing.T) { + err := unix.Select(0, nil, nil, nil, &unix.Timeval{Sec: 0, Usec: 0}) + if err != nil { + t.Fatalf("Select: %v", err) + } + + dur := 250 * time.Millisecond + tv := unix.NsecToTimeval(int64(dur)) + start := time.Now() + err = unix.Select(0, nil, nil, nil, &tv) + took := time.Since(start) + if err != nil { + t.Fatalf("Select: %v", err) + } + + // On some BSDs the actual timeout might also be slightly less than the requested. + // Add an acceptable margin to avoid flaky tests. + if took < dur*2/3 { + t.Errorf("Select: timeout should have been at least %v, got %v", dur, took) + } +} + +func TestSysctlRaw(t *testing.T) { + if runtime.GOOS == "openbsd" { + t.Skip("kern.proc.pid does not exist on OpenBSD") + } + + _, err := unix.SysctlRaw("kern.proc.pid", unix.Getpid()) + if err != nil { + t.Fatal(err) + } +} + +func TestSysctlUint32(t *testing.T) { + maxproc, err := unix.SysctlUint32("kern.maxproc") + if err != nil { + t.Fatal(err) + } + t.Logf("kern.maxproc: %v", maxproc) +} diff --git a/api/vendor/golang.org/x/sys/unix/syscall_darwin.go b/api/vendor/golang.org/x/sys/unix/syscall_darwin.go new file mode 100644 index 0000000..79e9476 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_darwin.go @@ -0,0 +1,680 @@ +// Copyright 2009,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. + +// Darwin system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and wrap +// it in our own nicer implementation, either here or in +// syscall_bsd.go or syscall_unix.go. + +package unix + +import ( + "errors" + "syscall" + "unsafe" +) + +const ImplementsGetwd = true + +func Getwd() (string, error) { + buf := make([]byte, 2048) + attrs, err := getAttrList(".", attrList{CommonAttr: attrCmnFullpath}, buf, 0) + if err == nil && len(attrs) == 1 && len(attrs[0]) >= 2 { + wd := string(attrs[0]) + // Sanity check that it's an absolute path and ends + // in a null byte, which we then strip. + if wd[0] == '/' && wd[len(wd)-1] == 0 { + return wd[:len(wd)-1], nil + } + } + // If pkg/os/getwd.go gets ENOTSUP, it will fall back to the + // slow algorithm. + return "", ENOTSUP +} + +// SockaddrDatalink implements the Sockaddr interface for AF_LINK type sockets. +type SockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 + raw RawSockaddrDatalink +} + +// Translate "kern.hostname" to []_C_int{0,1,2,3}. +func nametomib(name string) (mib []_C_int, err error) { + const siz = unsafe.Sizeof(mib[0]) + + // NOTE(rsc): It seems strange to set the buffer to have + // size CTL_MAXNAME+2 but use only CTL_MAXNAME + // as the size. I don't know why the +2 is here, but the + // kernel uses +2 for its own implementation of this function. + // I am scared that if we don't include the +2 here, the kernel + // will silently write 2 words farther than we specify + // and we'll get memory corruption. + var buf [CTL_MAXNAME + 2]_C_int + n := uintptr(CTL_MAXNAME) * siz + + p := (*byte)(unsafe.Pointer(&buf[0])) + bytes, err := ByteSliceFromString(name) + if err != nil { + return nil, err + } + + // Magic sysctl: "setting" 0.3 to a string name + // lets you read back the array of integers form. + if err = sysctl([]_C_int{0, 3}, p, &n, &bytes[0], uintptr(len(name))); err != nil { + return nil, err + } + return buf[0 : n/siz], nil +} + +//sys ptrace(request int, pid int, addr uintptr, data uintptr) (err error) +func PtraceAttach(pid int) (err error) { return ptrace(PT_ATTACH, pid, 0, 0) } +func PtraceDetach(pid int) (err error) { return ptrace(PT_DETACH, pid, 0, 0) } + +const ( + attrBitMapCount = 5 + attrCmnFullpath = 0x08000000 +) + +type attrList struct { + bitmapCount uint16 + _ uint16 + CommonAttr uint32 + VolAttr uint32 + DirAttr uint32 + FileAttr uint32 + Forkattr uint32 +} + +func getAttrList(path string, attrList attrList, attrBuf []byte, options uint) (attrs [][]byte, err error) { + if len(attrBuf) < 4 { + return nil, errors.New("attrBuf too small") + } + attrList.bitmapCount = attrBitMapCount + + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return nil, err + } + + _, _, e1 := Syscall6( + SYS_GETATTRLIST, + uintptr(unsafe.Pointer(_p0)), + uintptr(unsafe.Pointer(&attrList)), + uintptr(unsafe.Pointer(&attrBuf[0])), + uintptr(len(attrBuf)), + uintptr(options), + 0, + ) + if e1 != 0 { + return nil, e1 + } + size := *(*uint32)(unsafe.Pointer(&attrBuf[0])) + + // dat is the section of attrBuf that contains valid data, + // without the 4 byte length header. All attribute offsets + // are relative to dat. + dat := attrBuf + if int(size) < len(attrBuf) { + dat = dat[:size] + } + dat = dat[4:] // remove length prefix + + for i := uint32(0); int(i) < len(dat); { + header := dat[i:] + if len(header) < 8 { + return attrs, errors.New("truncated attribute header") + } + datOff := *(*int32)(unsafe.Pointer(&header[0])) + attrLen := *(*uint32)(unsafe.Pointer(&header[4])) + if datOff < 0 || uint32(datOff)+attrLen > uint32(len(dat)) { + return attrs, errors.New("truncated results; attrBuf too small") + } + end := uint32(datOff) + attrLen + attrs = append(attrs, dat[datOff:end]) + i = end + if r := i % 4; r != 0 { + i += (4 - r) + } + } + return +} + +//sysnb pipe() (r int, w int, err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + p[0], p[1], err = pipe() + return +} + +func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { + var _p0 unsafe.Pointer + var bufsize uintptr + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf)) + } + r0, _, e1 := Syscall(SYS_GETFSSTAT64, uintptr(_p0), bufsize, uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func xattrPointer(dest []byte) *byte { + // It's only when dest is set to NULL that the OS X implementations of + // getxattr() and listxattr() return the current sizes of the named attributes. + // An empty byte array is not sufficient. To maintain the same behaviour as the + // linux implementation, we wrap around the system calls and pass in NULL when + // dest is empty. + var destp *byte + if len(dest) > 0 { + destp = &dest[0] + } + return destp +} + +//sys getxattr(path string, attr string, dest *byte, size int, position uint32, options int) (sz int, err error) + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + return getxattr(path, attr, xattrPointer(dest), len(dest), 0, 0) +} + +func Lgetxattr(link string, attr string, dest []byte) (sz int, err error) { + return getxattr(link, attr, xattrPointer(dest), len(dest), 0, XATTR_NOFOLLOW) +} + +//sys setxattr(path string, attr string, data *byte, size int, position uint32, options int) (err error) + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + // The parameters for the OS X implementation vary slightly compared to the + // linux system call, specifically the position parameter: + // + // linux: + // int setxattr( + // const char *path, + // const char *name, + // const void *value, + // size_t size, + // int flags + // ); + // + // darwin: + // int setxattr( + // const char *path, + // const char *name, + // void *value, + // size_t size, + // u_int32_t position, + // int options + // ); + // + // position specifies the offset within the extended attribute. In the + // current implementation, only the resource fork extended attribute makes + // use of this argument. For all others, position is reserved. We simply + // default to setting it to zero. + return setxattr(path, attr, xattrPointer(data), len(data), 0, flags) +} + +func Lsetxattr(link string, attr string, data []byte, flags int) (err error) { + return setxattr(link, attr, xattrPointer(data), len(data), 0, flags|XATTR_NOFOLLOW) +} + +//sys removexattr(path string, attr string, options int) (err error) + +func Removexattr(path string, attr string) (err error) { + // We wrap around and explicitly zero out the options provided to the OS X + // implementation of removexattr, we do so for interoperability with the + // linux variant. + return removexattr(path, attr, 0) +} + +func Lremovexattr(link string, attr string) (err error) { + return removexattr(link, attr, XATTR_NOFOLLOW) +} + +//sys listxattr(path string, dest *byte, size int, options int) (sz int, err error) + +func Listxattr(path string, dest []byte) (sz int, err error) { + return listxattr(path, xattrPointer(dest), len(dest), 0) +} + +func Llistxattr(link string, dest []byte) (sz int, err error) { + return listxattr(link, xattrPointer(dest), len(dest), XATTR_NOFOLLOW) +} + +func setattrlistTimes(path string, times []Timespec, flags int) error { + _p0, err := BytePtrFromString(path) + if err != nil { + return err + } + + var attrList attrList + attrList.bitmapCount = ATTR_BIT_MAP_COUNT + attrList.CommonAttr = ATTR_CMN_MODTIME | ATTR_CMN_ACCTIME + + // order is mtime, atime: the opposite of Chtimes + attributes := [2]Timespec{times[1], times[0]} + options := 0 + if flags&AT_SYMLINK_NOFOLLOW != 0 { + options |= FSOPT_NOFOLLOW + } + _, _, e1 := Syscall6( + SYS_SETATTRLIST, + uintptr(unsafe.Pointer(_p0)), + uintptr(unsafe.Pointer(&attrList)), + uintptr(unsafe.Pointer(&attributes)), + uintptr(unsafe.Sizeof(attributes)), + uintptr(options), + 0, + ) + if e1 != 0 { + return e1 + } + return nil +} + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) error { + // Darwin doesn't support SYS_UTIMENSAT + return ENOSYS +} + +/* + * Wrapped + */ + +//sys kill(pid int, signum int, posix int) (err error) + +func Kill(pid int, signum syscall.Signal) (err error) { return kill(pid, int(signum), 1) } + +//sys ioctl(fd int, req uint, arg uintptr) (err error) + +// ioctl itself should not be exposed directly, but additional get/set +// functions for specific types are permissible. + +// IoctlSetInt performs an ioctl operation which sets an integer value +// on fd, using the specified request number. +func IoctlSetInt(fd int, req uint, value int) error { + return ioctl(fd, req, uintptr(value)) +} + +func IoctlSetWinsize(fd int, req uint, value *Winsize) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlSetTermios(fd int, req uint, value *Termios) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +// IoctlGetInt performs an ioctl operation which gets an integer value +// from fd, using the specified request number. +func IoctlGetInt(fd int, req uint) (int, error) { + var value int + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return value, err +} + +func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { + var value Winsize + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermios(fd int, req uint) (*Termios, error) { + var value Termios + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func Uname(uname *Utsname) error { + mib := []_C_int{CTL_KERN, KERN_OSTYPE} + n := unsafe.Sizeof(uname.Sysname) + if err := sysctl(mib, &uname.Sysname[0], &n, nil, 0); err != nil { + return err + } + + mib = []_C_int{CTL_KERN, KERN_HOSTNAME} + n = unsafe.Sizeof(uname.Nodename) + if err := sysctl(mib, &uname.Nodename[0], &n, nil, 0); err != nil { + return err + } + + mib = []_C_int{CTL_KERN, KERN_OSRELEASE} + n = unsafe.Sizeof(uname.Release) + if err := sysctl(mib, &uname.Release[0], &n, nil, 0); err != nil { + return err + } + + mib = []_C_int{CTL_KERN, KERN_VERSION} + n = unsafe.Sizeof(uname.Version) + if err := sysctl(mib, &uname.Version[0], &n, nil, 0); err != nil { + return err + } + + // The version might have newlines or tabs in it, convert them to + // spaces. + for i, b := range uname.Version { + if b == '\n' || b == '\t' { + if i == len(uname.Version)-1 { + uname.Version[i] = 0 + } else { + uname.Version[i] = ' ' + } + } + } + + mib = []_C_int{CTL_HW, HW_MACHINE} + n = unsafe.Sizeof(uname.Machine) + if err := sysctl(mib, &uname.Machine[0], &n, nil, 0); err != nil { + return err + } + + return nil +} + +/* + * Exposed directly + */ +//sys Access(path string, mode uint32) (err error) +//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) +//sys Chdir(path string) (err error) +//sys Chflags(path string, flags int) (err error) +//sys Chmod(path string, mode uint32) (err error) +//sys Chown(path string, uid int, gid int) (err error) +//sys Chroot(path string) (err error) +//sys Close(fd int) (err error) +//sys Dup(fd int) (nfd int, err error) +//sys Dup2(from int, to int) (err error) +//sys Exchangedata(path1 string, path2 string, options int) (err error) +//sys Exit(code int) +//sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fchdir(fd int) (err error) +//sys Fchflags(fd int, flags int) (err error) +//sys Fchmod(fd int, mode uint32) (err error) +//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) +//sys Flock(fd int, how int) (err error) +//sys Fpathconf(fd int, name int) (val int, err error) +//sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64 +//sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64 +//sys Fstatfs(fd int, stat *Statfs_t) (err error) = SYS_FSTATFS64 +//sys Fsync(fd int) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sys Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) = SYS_GETDIRENTRIES64 +//sys Getdtablesize() (size int) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (uid int) +//sysnb Getgid() (gid int) +//sysnb Getpgid(pid int) (pgid int, err error) +//sysnb Getpgrp() (pgrp int) +//sysnb Getpid() (pid int) +//sysnb Getppid() (ppid int) +//sys Getpriority(which int, who int) (prio int, err error) +//sysnb Getrlimit(which int, lim *Rlimit) (err error) +//sysnb Getrusage(who int, rusage *Rusage) (err error) +//sysnb Getsid(pid int) (sid int, err error) +//sysnb Getuid() (uid int) +//sysnb Issetugid() (tainted bool) +//sys Kqueue() (fd int, err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Link(path string, link string) (err error) +//sys Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) +//sys Listen(s int, backlog int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 +//sys Mkdir(path string, mode uint32) (err error) +//sys Mkdirat(dirfd int, path string, mode uint32) (err error) +//sys Mkfifo(path string, mode uint32) (err error) +//sys Mknod(path string, mode uint32, dev int) (err error) +//sys Open(path string, mode int, perm uint32) (fd int, err error) +//sys Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) +//sys Pathconf(path string, name int) (val int, err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys read(fd int, p []byte) (n int, err error) +//sys Readlink(path string, buf []byte) (n int, err error) +//sys Readlinkat(dirfd int, path string, buf []byte) (n int, err error) +//sys Rename(from string, to string) (err error) +//sys Renameat(fromfd int, from string, tofd int, to string) (err error) +//sys Revoke(path string) (err error) +//sys Rmdir(path string) (err error) +//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK +//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) +//sys Setegid(egid int) (err error) +//sysnb Seteuid(euid int) (err error) +//sysnb Setgid(gid int) (err error) +//sys Setlogin(name string) (err error) +//sysnb Setpgid(pid int, pgid int) (err error) +//sys Setpriority(which int, who int, prio int) (err error) +//sys Setprivexec(flag int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sysnb Setrlimit(which int, lim *Rlimit) (err error) +//sysnb Setsid() (pid int, err error) +//sysnb Settimeofday(tp *Timeval) (err error) +//sysnb Setuid(uid int) (err error) +//sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64 +//sys Statfs(path string, stat *Statfs_t) (err error) = SYS_STATFS64 +//sys Symlink(path string, link string) (err error) +//sys Symlinkat(oldpath string, newdirfd int, newpath string) (err error) +//sys Sync() (err error) +//sys Truncate(path string, length int64) (err error) +//sys Umask(newmask int) (oldmask int) +//sys Undelete(path string) (err error) +//sys Unlink(path string) (err error) +//sys Unlinkat(dirfd int, path string, flags int) (err error) +//sys Unmount(path string, flags int) (err error) +//sys write(fd int, p []byte) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) +//sys munmap(addr uintptr, length uintptr) (err error) +//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ +//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE + +/* + * Unimplemented + */ +// Profil +// Sigaction +// Sigprocmask +// Getlogin +// Sigpending +// Sigaltstack +// Ioctl +// Reboot +// Execve +// Vfork +// Sbrk +// Sstk +// Ovadvise +// Mincore +// Setitimer +// Swapon +// Select +// Sigsuspend +// Readv +// Writev +// Nfssvc +// Getfh +// Quotactl +// Mount +// Csops +// Waitid +// Add_profil +// Kdebug_trace +// Sigreturn +// Atsocket +// Kqueue_from_portset_np +// Kqueue_portset +// Getattrlist +// Setattrlist +// Getdirentriesattr +// Searchfs +// Delete +// Copyfile +// Watchevent +// Waitevent +// Modwatch +// Fgetxattr +// Fsetxattr +// Fremovexattr +// Flistxattr +// Fsctl +// Initgroups +// Posix_spawn +// Nfsclnt +// Fhopen +// Minherit +// Semsys +// Msgsys +// Shmsys +// Semctl +// Semget +// Semop +// Msgctl +// Msgget +// Msgsnd +// Msgrcv +// Shmat +// Shmctl +// Shmdt +// Shmget +// Shm_open +// Shm_unlink +// Sem_open +// Sem_close +// Sem_unlink +// Sem_wait +// Sem_trywait +// Sem_post +// Sem_getvalue +// Sem_init +// Sem_destroy +// Open_extended +// Umask_extended +// Stat_extended +// Lstat_extended +// Fstat_extended +// Chmod_extended +// Fchmod_extended +// Access_extended +// Settid +// Gettid +// Setsgroups +// Getsgroups +// Setwgroups +// Getwgroups +// Mkfifo_extended +// Mkdir_extended +// Identitysvc +// Shared_region_check_np +// Shared_region_map_np +// __pthread_mutex_destroy +// __pthread_mutex_init +// __pthread_mutex_lock +// __pthread_mutex_trylock +// __pthread_mutex_unlock +// __pthread_cond_init +// __pthread_cond_destroy +// __pthread_cond_broadcast +// __pthread_cond_signal +// Setsid_with_pid +// __pthread_cond_timedwait +// Aio_fsync +// Aio_return +// Aio_suspend +// Aio_cancel +// Aio_error +// Aio_read +// Aio_write +// Lio_listio +// __pthread_cond_wait +// Iopolicysys +// __pthread_kill +// __pthread_sigmask +// __sigwait +// __disable_threadsignal +// __pthread_markcancel +// __pthread_canceled +// __semwait_signal +// Proc_info +// sendfile +// Stat64_extended +// Lstat64_extended +// Fstat64_extended +// __pthread_chdir +// __pthread_fchdir +// Audit +// Auditon +// Getauid +// Setauid +// Getaudit +// Setaudit +// Getaudit_addr +// Setaudit_addr +// Auditctl +// Bsdthread_create +// Bsdthread_terminate +// Stack_snapshot +// Bsdthread_register +// Workq_open +// Workq_ops +// __mac_execve +// __mac_syscall +// __mac_get_file +// __mac_set_file +// __mac_get_link +// __mac_set_link +// __mac_get_proc +// __mac_set_proc +// __mac_get_fd +// __mac_set_fd +// __mac_get_pid +// __mac_get_lcid +// __mac_get_lctx +// __mac_set_lctx +// Setlcid +// Read_nocancel +// Write_nocancel +// Open_nocancel +// Close_nocancel +// Wait4_nocancel +// Recvmsg_nocancel +// Sendmsg_nocancel +// Recvfrom_nocancel +// Accept_nocancel +// Fcntl_nocancel +// Select_nocancel +// Fsync_nocancel +// Connect_nocancel +// Sigsuspend_nocancel +// Readv_nocancel +// Writev_nocancel +// Sendto_nocancel +// Pread_nocancel +// Pwrite_nocancel +// Waitid_nocancel +// Poll_nocancel +// Msgsnd_nocancel +// Msgrcv_nocancel +// Sem_wait_nocancel +// Aio_suspend_nocancel +// __sigwait_nocancel +// __semwait_signal_nocancel +// __mac_mount +// __mac_get_mount +// __mac_getfsstat diff --git a/api/vendor/golang.org/x/sys/unix/syscall_darwin_386.go b/api/vendor/golang.org/x/sys/unix/syscall_darwin_386.go new file mode 100644 index 0000000..b3ac109 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_darwin_386.go @@ -0,0 +1,68 @@ +// 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. + +// +build 386,darwin + +package unix + +import ( + "syscall" + "unsafe" +) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: int32(sec), Nsec: int32(nsec)} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: int32(sec), Usec: int32(usec)} +} + +//sysnb gettimeofday(tp *Timeval) (sec int32, usec int32, err error) +func Gettimeofday(tv *Timeval) (err error) { + // The tv passed to gettimeofday must be non-nil + // but is otherwise unused. The answers come back + // in the two registers. + sec, usec, err := gettimeofday(tv) + tv.Sec = int32(sec) + tv.Usec = int32(usec) + return err +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var length = uint64(count) + + _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(*offset>>32), uintptr(unsafe.Pointer(&length)), 0, 0, 0, 0) + + written = int(length) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) + +// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions +// of darwin/386 the syscall is called sysctl instead of __sysctl. +const SYS___SYSCTL = SYS_SYSCTL diff --git a/api/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go b/api/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go new file mode 100644 index 0000000..7521944 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go @@ -0,0 +1,68 @@ +// 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. + +// +build amd64,darwin + +package unix + +import ( + "syscall" + "unsafe" +) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: int32(usec)} +} + +//sysnb gettimeofday(tp *Timeval) (sec int64, usec int32, err error) +func Gettimeofday(tv *Timeval) (err error) { + // The tv passed to gettimeofday must be non-nil + // but is otherwise unused. The answers come back + // in the two registers. + sec, usec, err := gettimeofday(tv) + tv.Sec = sec + tv.Usec = usec + return err +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint64(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var length = uint64(count) + + _, _, e1 := Syscall6(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(unsafe.Pointer(&length)), 0, 0) + + written = int(length) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) + +// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions +// of darwin/amd64 the syscall is called sysctl instead of __sysctl. +const SYS___SYSCTL = SYS_SYSCTL diff --git a/api/vendor/golang.org/x/sys/unix/syscall_darwin_arm.go b/api/vendor/golang.org/x/sys/unix/syscall_darwin_arm.go new file mode 100644 index 0000000..faae207 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_darwin_arm.go @@ -0,0 +1,66 @@ +// Copyright 2015 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 unix + +import ( + "syscall" + "unsafe" +) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: int32(sec), Nsec: int32(nsec)} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: int32(sec), Usec: int32(usec)} +} + +//sysnb gettimeofday(tp *Timeval) (sec int32, usec int32, err error) +func Gettimeofday(tv *Timeval) (err error) { + // The tv passed to gettimeofday must be non-nil + // but is otherwise unused. The answers come back + // in the two registers. + sec, usec, err := gettimeofday(tv) + tv.Sec = int32(sec) + tv.Usec = int32(usec) + return err +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var length = uint64(count) + + _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(*offset>>32), uintptr(unsafe.Pointer(&length)), 0, 0, 0, 0) + + written = int(length) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) // sic + +// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions +// of darwin/arm the syscall is called sysctl instead of __sysctl. +const SYS___SYSCTL = SYS_SYSCTL diff --git a/api/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go b/api/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go new file mode 100644 index 0000000..d6d9628 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go @@ -0,0 +1,68 @@ +// Copyright 2015 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 arm64,darwin + +package unix + +import ( + "syscall" + "unsafe" +) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: int32(usec)} +} + +//sysnb gettimeofday(tp *Timeval) (sec int64, usec int32, err error) +func Gettimeofday(tv *Timeval) (err error) { + // The tv passed to gettimeofday must be non-nil + // but is otherwise unused. The answers come back + // in the two registers. + sec, usec, err := gettimeofday(tv) + tv.Sec = sec + tv.Usec = usec + return err +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint64(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var length = uint64(count) + + _, _, e1 := Syscall6(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(unsafe.Pointer(&length)), 0, 0) + + written = int(length) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) // sic + +// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions +// of darwin/arm64 the syscall is called sysctl instead of __sysctl. +const SYS___SYSCTL = SYS_SYSCTL diff --git a/api/vendor/golang.org/x/sys/unix/syscall_darwin_test.go b/api/vendor/golang.org/x/sys/unix/syscall_darwin_test.go new file mode 100644 index 0000000..65691d5 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_darwin_test.go @@ -0,0 +1,19 @@ +// 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 unix_test + +// stringsFromByteSlice converts a sequence of attributes to a []string. +// On Darwin, each entry is a NULL-terminated string. +func stringsFromByteSlice(buf []byte) []string { + var result []string + off := 0 + for i, b := range buf { + if b == 0 { + result = append(result, string(buf[off:i])) + off = i + 1 + } + } + return result +} diff --git a/api/vendor/golang.org/x/sys/unix/syscall_dragonfly.go b/api/vendor/golang.org/x/sys/unix/syscall_dragonfly.go new file mode 100644 index 0000000..b5072de --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_dragonfly.go @@ -0,0 +1,523 @@ +// 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. + +// DragonFly BSD system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and wrap +// it in our own nicer implementation, either here or in +// syscall_bsd.go or syscall_unix.go. + +package unix + +import "unsafe" + +// SockaddrDatalink implements the Sockaddr interface for AF_LINK type sockets. +type SockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 + Rcf uint16 + Route [16]uint16 + raw RawSockaddrDatalink +} + +// Translate "kern.hostname" to []_C_int{0,1,2,3}. +func nametomib(name string) (mib []_C_int, err error) { + const siz = unsafe.Sizeof(mib[0]) + + // NOTE(rsc): It seems strange to set the buffer to have + // size CTL_MAXNAME+2 but use only CTL_MAXNAME + // as the size. I don't know why the +2 is here, but the + // kernel uses +2 for its own implementation of this function. + // I am scared that if we don't include the +2 here, the kernel + // will silently write 2 words farther than we specify + // and we'll get memory corruption. + var buf [CTL_MAXNAME + 2]_C_int + n := uintptr(CTL_MAXNAME) * siz + + p := (*byte)(unsafe.Pointer(&buf[0])) + bytes, err := ByteSliceFromString(name) + if err != nil { + return nil, err + } + + // Magic sysctl: "setting" 0.3 to a string name + // lets you read back the array of integers form. + if err = sysctl([]_C_int{0, 3}, p, &n, &bytes[0], uintptr(len(name))); err != nil { + return nil, err + } + return buf[0 : n/siz], nil +} + +//sysnb pipe() (r int, w int, err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + p[0], p[1], err = pipe() + return +} + +//sys extpread(fd int, p []byte, flags int, offset int64) (n int, err error) +func Pread(fd int, p []byte, offset int64) (n int, err error) { + return extpread(fd, p, 0, offset) +} + +//sys extpwrite(fd int, p []byte, flags int, offset int64) (n int, err error) +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + return extpwrite(fd, p, 0, offset) +} + +func Accept4(fd, flags int) (nfd int, sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + nfd, err = accept4(fd, &rsa, &len, flags) + if err != nil { + return + } + if len > SizeofSockaddrAny { + panic("RawSockaddrAny too small") + } + sa, err = anyToSockaddr(&rsa) + if err != nil { + Close(nfd) + nfd = 0 + } + return +} + +const ImplementsGetwd = true + +//sys Getcwd(buf []byte) (n int, err error) = SYS___GETCWD + +func Getwd() (string, error) { + var buf [PathMax]byte + _, err := Getcwd(buf[0:]) + if err != nil { + return "", err + } + n := clen(buf[:]) + if n < 1 { + return "", EINVAL + } + return string(buf[:n]), nil +} + +func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { + var _p0 unsafe.Pointer + var bufsize uintptr + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf)) + } + r0, _, e1 := Syscall(SYS_GETFSSTAT, uintptr(_p0), bufsize, uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func setattrlistTimes(path string, times []Timespec, flags int) error { + // used on Darwin for UtimesNano + return ENOSYS +} + +//sys ioctl(fd int, req uint, arg uintptr) (err error) + +// ioctl itself should not be exposed directly, but additional get/set +// functions for specific types are permissible. + +// IoctlSetInt performs an ioctl operation which sets an integer value +// on fd, using the specified request number. +func IoctlSetInt(fd int, req uint, value int) error { + return ioctl(fd, req, uintptr(value)) +} + +func IoctlSetWinsize(fd int, req uint, value *Winsize) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlSetTermios(fd int, req uint, value *Termios) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +// IoctlGetInt performs an ioctl operation which gets an integer value +// from fd, using the specified request number. +func IoctlGetInt(fd int, req uint) (int, error) { + var value int + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return value, err +} + +func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { + var value Winsize + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermios(fd int, req uint) (*Termios, error) { + var value Termios + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func sysctlUname(mib []_C_int, old *byte, oldlen *uintptr) error { + err := sysctl(mib, old, oldlen, nil, 0) + if err != nil { + // Utsname members on Dragonfly are only 32 bytes and + // the syscall returns ENOMEM in case the actual value + // is longer. + if err == ENOMEM { + err = nil + } + } + return err +} + +func Uname(uname *Utsname) error { + mib := []_C_int{CTL_KERN, KERN_OSTYPE} + n := unsafe.Sizeof(uname.Sysname) + if err := sysctlUname(mib, &uname.Sysname[0], &n); err != nil { + return err + } + uname.Sysname[unsafe.Sizeof(uname.Sysname)-1] = 0 + + mib = []_C_int{CTL_KERN, KERN_HOSTNAME} + n = unsafe.Sizeof(uname.Nodename) + if err := sysctlUname(mib, &uname.Nodename[0], &n); err != nil { + return err + } + uname.Nodename[unsafe.Sizeof(uname.Nodename)-1] = 0 + + mib = []_C_int{CTL_KERN, KERN_OSRELEASE} + n = unsafe.Sizeof(uname.Release) + if err := sysctlUname(mib, &uname.Release[0], &n); err != nil { + return err + } + uname.Release[unsafe.Sizeof(uname.Release)-1] = 0 + + mib = []_C_int{CTL_KERN, KERN_VERSION} + n = unsafe.Sizeof(uname.Version) + if err := sysctlUname(mib, &uname.Version[0], &n); err != nil { + return err + } + + // The version might have newlines or tabs in it, convert them to + // spaces. + for i, b := range uname.Version { + if b == '\n' || b == '\t' { + if i == len(uname.Version)-1 { + uname.Version[i] = 0 + } else { + uname.Version[i] = ' ' + } + } + } + + mib = []_C_int{CTL_HW, HW_MACHINE} + n = unsafe.Sizeof(uname.Machine) + if err := sysctlUname(mib, &uname.Machine[0], &n); err != nil { + return err + } + uname.Machine[unsafe.Sizeof(uname.Machine)-1] = 0 + + return nil +} + +/* + * Exposed directly + */ +//sys Access(path string, mode uint32) (err error) +//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) +//sys Chdir(path string) (err error) +//sys Chflags(path string, flags int) (err error) +//sys Chmod(path string, mode uint32) (err error) +//sys Chown(path string, uid int, gid int) (err error) +//sys Chroot(path string) (err error) +//sys Close(fd int) (err error) +//sys Dup(fd int) (nfd int, err error) +//sys Dup2(from int, to int) (err error) +//sys Exit(code int) +//sys Fchdir(fd int) (err error) +//sys Fchflags(fd int, flags int) (err error) +//sys Fchmod(fd int, mode uint32) (err error) +//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Flock(fd int, how int) (err error) +//sys Fpathconf(fd int, name int) (val int, err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) +//sys Fstatfs(fd int, stat *Statfs_t) (err error) +//sys Fsync(fd int) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sys Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) +//sys Getdtablesize() (size int) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (uid int) +//sysnb Getgid() (gid int) +//sysnb Getpgid(pid int) (pgid int, err error) +//sysnb Getpgrp() (pgrp int) +//sysnb Getpid() (pid int) +//sysnb Getppid() (ppid int) +//sys Getpriority(which int, who int) (prio int, err error) +//sysnb Getrlimit(which int, lim *Rlimit) (err error) +//sysnb Getrusage(who int, rusage *Rusage) (err error) +//sysnb Getsid(pid int) (sid int, err error) +//sysnb Gettimeofday(tv *Timeval) (err error) +//sysnb Getuid() (uid int) +//sys Issetugid() (tainted bool) +//sys Kill(pid int, signum syscall.Signal) (err error) +//sys Kqueue() (fd int, err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Link(path string, link string) (err error) +//sys Listen(s int, backlog int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Mkdir(path string, mode uint32) (err error) +//sys Mkfifo(path string, mode uint32) (err error) +//sys Mknod(path string, mode uint32, dev int) (err error) +//sys Nanosleep(time *Timespec, leftover *Timespec) (err error) +//sys Open(path string, mode int, perm uint32) (fd int, err error) +//sys Pathconf(path string, name int) (val int, err error) +//sys read(fd int, p []byte) (n int, err error) +//sys Readlink(path string, buf []byte) (n int, err error) +//sys Rename(from string, to string) (err error) +//sys Revoke(path string) (err error) +//sys Rmdir(path string) (err error) +//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK +//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) +//sysnb Setegid(egid int) (err error) +//sysnb Seteuid(euid int) (err error) +//sysnb Setgid(gid int) (err error) +//sys Setlogin(name string) (err error) +//sysnb Setpgid(pid int, pgid int) (err error) +//sys Setpriority(which int, who int, prio int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(which int, lim *Rlimit) (err error) +//sysnb Setsid() (pid int, err error) +//sysnb Settimeofday(tp *Timeval) (err error) +//sysnb Setuid(uid int) (err error) +//sys Stat(path string, stat *Stat_t) (err error) +//sys Statfs(path string, stat *Statfs_t) (err error) +//sys Symlink(path string, link string) (err error) +//sys Sync() (err error) +//sys Truncate(path string, length int64) (err error) +//sys Umask(newmask int) (oldmask int) +//sys Undelete(path string) (err error) +//sys Unlink(path string) (err error) +//sys Unmount(path string, flags int) (err error) +//sys write(fd int, p []byte) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) +//sys munmap(addr uintptr, length uintptr) (err error) +//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ +//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE +//sys accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) +//sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) + +/* + * Unimplemented + * TODO(jsing): Update this list for DragonFly. + */ +// Profil +// Sigaction +// Sigprocmask +// Getlogin +// Sigpending +// Sigaltstack +// Reboot +// Execve +// Vfork +// Sbrk +// Sstk +// Ovadvise +// Mincore +// Setitimer +// Swapon +// Select +// Sigsuspend +// Readv +// Writev +// Nfssvc +// Getfh +// Quotactl +// Mount +// Csops +// Waitid +// Add_profil +// Kdebug_trace +// Sigreturn +// Atsocket +// Kqueue_from_portset_np +// Kqueue_portset +// Getattrlist +// Setattrlist +// Getdirentriesattr +// Searchfs +// Delete +// Copyfile +// Watchevent +// Waitevent +// Modwatch +// Getxattr +// Fgetxattr +// Setxattr +// Fsetxattr +// Removexattr +// Fremovexattr +// Listxattr +// Flistxattr +// Fsctl +// Initgroups +// Posix_spawn +// Nfsclnt +// Fhopen +// Minherit +// Semsys +// Msgsys +// Shmsys +// Semctl +// Semget +// Semop +// Msgctl +// Msgget +// Msgsnd +// Msgrcv +// Shmat +// Shmctl +// Shmdt +// Shmget +// Shm_open +// Shm_unlink +// Sem_open +// Sem_close +// Sem_unlink +// Sem_wait +// Sem_trywait +// Sem_post +// Sem_getvalue +// Sem_init +// Sem_destroy +// Open_extended +// Umask_extended +// Stat_extended +// Lstat_extended +// Fstat_extended +// Chmod_extended +// Fchmod_extended +// Access_extended +// Settid +// Gettid +// Setsgroups +// Getsgroups +// Setwgroups +// Getwgroups +// Mkfifo_extended +// Mkdir_extended +// Identitysvc +// Shared_region_check_np +// Shared_region_map_np +// __pthread_mutex_destroy +// __pthread_mutex_init +// __pthread_mutex_lock +// __pthread_mutex_trylock +// __pthread_mutex_unlock +// __pthread_cond_init +// __pthread_cond_destroy +// __pthread_cond_broadcast +// __pthread_cond_signal +// Setsid_with_pid +// __pthread_cond_timedwait +// Aio_fsync +// Aio_return +// Aio_suspend +// Aio_cancel +// Aio_error +// Aio_read +// Aio_write +// Lio_listio +// __pthread_cond_wait +// Iopolicysys +// __pthread_kill +// __pthread_sigmask +// __sigwait +// __disable_threadsignal +// __pthread_markcancel +// __pthread_canceled +// __semwait_signal +// Proc_info +// Stat64_extended +// Lstat64_extended +// Fstat64_extended +// __pthread_chdir +// __pthread_fchdir +// Audit +// Auditon +// Getauid +// Setauid +// Getaudit +// Setaudit +// Getaudit_addr +// Setaudit_addr +// Auditctl +// Bsdthread_create +// Bsdthread_terminate +// Stack_snapshot +// Bsdthread_register +// Workq_open +// Workq_ops +// __mac_execve +// __mac_syscall +// __mac_get_file +// __mac_set_file +// __mac_get_link +// __mac_set_link +// __mac_get_proc +// __mac_set_proc +// __mac_get_fd +// __mac_set_fd +// __mac_get_pid +// __mac_get_lcid +// __mac_get_lctx +// __mac_set_lctx +// Setlcid +// Read_nocancel +// Write_nocancel +// Open_nocancel +// Close_nocancel +// Wait4_nocancel +// Recvmsg_nocancel +// Sendmsg_nocancel +// Recvfrom_nocancel +// Accept_nocancel +// Fcntl_nocancel +// Select_nocancel +// Fsync_nocancel +// Connect_nocancel +// Sigsuspend_nocancel +// Readv_nocancel +// Writev_nocancel +// Sendto_nocancel +// Pread_nocancel +// Pwrite_nocancel +// Waitid_nocancel +// Msgsnd_nocancel +// Msgrcv_nocancel +// Sem_wait_nocancel +// Aio_suspend_nocancel +// __sigwait_nocancel +// __semwait_signal_nocancel +// __mac_mount +// __mac_get_mount +// __mac_getfsstat diff --git a/api/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go b/api/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go new file mode 100644 index 0000000..9babb31 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go @@ -0,0 +1,52 @@ +// 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. + +// +build amd64,dragonfly + +package unix + +import ( + "syscall" + "unsafe" +) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: usec} +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint64(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var writtenOut uint64 = 0 + _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0, 0) + + written = int(writtenOut) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) diff --git a/api/vendor/golang.org/x/sys/unix/syscall_freebsd.go b/api/vendor/golang.org/x/sys/unix/syscall_freebsd.go new file mode 100644 index 0000000..ba9df4a --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_freebsd.go @@ -0,0 +1,756 @@ +// Copyright 2009,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. + +// FreeBSD system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and wrap +// it in our own nicer implementation, either here or in +// syscall_bsd.go or syscall_unix.go. + +package unix + +import ( + "strings" + "unsafe" +) + +// SockaddrDatalink implements the Sockaddr interface for AF_LINK type sockets. +type SockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [46]int8 + raw RawSockaddrDatalink +} + +// Translate "kern.hostname" to []_C_int{0,1,2,3}. +func nametomib(name string) (mib []_C_int, err error) { + const siz = unsafe.Sizeof(mib[0]) + + // NOTE(rsc): It seems strange to set the buffer to have + // size CTL_MAXNAME+2 but use only CTL_MAXNAME + // as the size. I don't know why the +2 is here, but the + // kernel uses +2 for its own implementation of this function. + // I am scared that if we don't include the +2 here, the kernel + // will silently write 2 words farther than we specify + // and we'll get memory corruption. + var buf [CTL_MAXNAME + 2]_C_int + n := uintptr(CTL_MAXNAME) * siz + + p := (*byte)(unsafe.Pointer(&buf[0])) + bytes, err := ByteSliceFromString(name) + if err != nil { + return nil, err + } + + // Magic sysctl: "setting" 0.3 to a string name + // lets you read back the array of integers form. + if err = sysctl([]_C_int{0, 3}, p, &n, &bytes[0], uintptr(len(name))); err != nil { + return nil, err + } + return buf[0 : n/siz], nil +} + +//sysnb pipe() (r int, w int, err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + p[0], p[1], err = pipe() + return +} + +func GetsockoptIPMreqn(fd, level, opt int) (*IPMreqn, error) { + var value IPMreqn + vallen := _Socklen(SizeofIPMreqn) + errno := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, errno +} + +func SetsockoptIPMreqn(fd, level, opt int, mreq *IPMreqn) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(mreq), unsafe.Sizeof(*mreq)) +} + +func Accept4(fd, flags int) (nfd int, sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + nfd, err = accept4(fd, &rsa, &len, flags) + if err != nil { + return + } + if len > SizeofSockaddrAny { + panic("RawSockaddrAny too small") + } + sa, err = anyToSockaddr(&rsa) + if err != nil { + Close(nfd) + nfd = 0 + } + return +} + +const ImplementsGetwd = true + +//sys Getcwd(buf []byte) (n int, err error) = SYS___GETCWD + +func Getwd() (string, error) { + var buf [PathMax]byte + _, err := Getcwd(buf[0:]) + if err != nil { + return "", err + } + n := clen(buf[:]) + if n < 1 { + return "", EINVAL + } + return string(buf[:n]), nil +} + +func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { + var _p0 unsafe.Pointer + var bufsize uintptr + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf)) + } + r0, _, e1 := Syscall(SYS_GETFSSTAT, uintptr(_p0), bufsize, uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func setattrlistTimes(path string, times []Timespec, flags int) error { + // used on Darwin for UtimesNano + return ENOSYS +} + +// Derive extattr namespace and attribute name + +func xattrnamespace(fullattr string) (ns int, attr string, err error) { + s := strings.IndexByte(fullattr, '.') + if s == -1 { + return -1, "", ENOATTR + } + + namespace := fullattr[0:s] + attr = fullattr[s+1:] + + switch namespace { + case "user": + return EXTATTR_NAMESPACE_USER, attr, nil + case "system": + return EXTATTR_NAMESPACE_SYSTEM, attr, nil + default: + return -1, "", ENOATTR + } +} + +func initxattrdest(dest []byte, idx int) (d unsafe.Pointer) { + if len(dest) > idx { + return unsafe.Pointer(&dest[idx]) + } else { + return unsafe.Pointer(_zero) + } +} + +// FreeBSD implements its own syscalls to handle extended attributes + +func Getxattr(file string, attr string, dest []byte) (sz int, err error) { + d := initxattrdest(dest, 0) + destsize := len(dest) + + nsid, a, err := xattrnamespace(attr) + if err != nil { + return -1, err + } + + return ExtattrGetFile(file, nsid, a, uintptr(d), destsize) +} + +func Fgetxattr(fd int, attr string, dest []byte) (sz int, err error) { + d := initxattrdest(dest, 0) + destsize := len(dest) + + nsid, a, err := xattrnamespace(attr) + if err != nil { + return -1, err + } + + return ExtattrGetFd(fd, nsid, a, uintptr(d), destsize) +} + +func Lgetxattr(link string, attr string, dest []byte) (sz int, err error) { + d := initxattrdest(dest, 0) + destsize := len(dest) + + nsid, a, err := xattrnamespace(attr) + if err != nil { + return -1, err + } + + return ExtattrGetLink(link, nsid, a, uintptr(d), destsize) +} + +// flags are unused on FreeBSD + +func Fsetxattr(fd int, attr string, data []byte, flags int) (err error) { + d := unsafe.Pointer(&data[0]) + datasiz := len(data) + + nsid, a, err := xattrnamespace(attr) + if err != nil { + return + } + + _, err = ExtattrSetFd(fd, nsid, a, uintptr(d), datasiz) + return +} + +func Setxattr(file string, attr string, data []byte, flags int) (err error) { + d := unsafe.Pointer(&data[0]) + datasiz := len(data) + + nsid, a, err := xattrnamespace(attr) + if err != nil { + return + } + + _, err = ExtattrSetFile(file, nsid, a, uintptr(d), datasiz) + return +} + +func Lsetxattr(link string, attr string, data []byte, flags int) (err error) { + d := unsafe.Pointer(&data[0]) + datasiz := len(data) + + nsid, a, err := xattrnamespace(attr) + if err != nil { + return + } + + _, err = ExtattrSetLink(link, nsid, a, uintptr(d), datasiz) + return +} + +func Removexattr(file string, attr string) (err error) { + nsid, a, err := xattrnamespace(attr) + if err != nil { + return + } + + err = ExtattrDeleteFile(file, nsid, a) + return +} + +func Fremovexattr(fd int, attr string) (err error) { + nsid, a, err := xattrnamespace(attr) + if err != nil { + return + } + + err = ExtattrDeleteFd(fd, nsid, a) + return +} + +func Lremovexattr(link string, attr string) (err error) { + nsid, a, err := xattrnamespace(attr) + if err != nil { + return + } + + err = ExtattrDeleteLink(link, nsid, a) + return +} + +func Listxattr(file string, dest []byte) (sz int, err error) { + d := initxattrdest(dest, 0) + destsiz := len(dest) + + // FreeBSD won't allow you to list xattrs from multiple namespaces + s := 0 + for _, nsid := range [...]int{EXTATTR_NAMESPACE_USER, EXTATTR_NAMESPACE_SYSTEM} { + stmp, e := ExtattrListFile(file, nsid, uintptr(d), destsiz) + + /* Errors accessing system attrs are ignored so that + * we can implement the Linux-like behavior of omitting errors that + * we don't have read permissions on + * + * Linux will still error if we ask for user attributes on a file that + * we don't have read permissions on, so don't ignore those errors + */ + if e != nil && e == EPERM && nsid != EXTATTR_NAMESPACE_USER { + continue + } else if e != nil { + return s, e + } + + s += stmp + destsiz -= s + if destsiz < 0 { + destsiz = 0 + } + d = initxattrdest(dest, s) + } + + return s, nil +} + +func Flistxattr(fd int, dest []byte) (sz int, err error) { + d := initxattrdest(dest, 0) + destsiz := len(dest) + + s := 0 + for _, nsid := range [...]int{EXTATTR_NAMESPACE_USER, EXTATTR_NAMESPACE_SYSTEM} { + stmp, e := ExtattrListFd(fd, nsid, uintptr(d), destsiz) + if e != nil && e == EPERM && nsid != EXTATTR_NAMESPACE_USER { + continue + } else if e != nil { + return s, e + } + + s += stmp + destsiz -= s + if destsiz < 0 { + destsiz = 0 + } + d = initxattrdest(dest, s) + } + + return s, nil +} + +func Llistxattr(link string, dest []byte) (sz int, err error) { + d := initxattrdest(dest, 0) + destsiz := len(dest) + + s := 0 + for _, nsid := range [...]int{EXTATTR_NAMESPACE_USER, EXTATTR_NAMESPACE_SYSTEM} { + stmp, e := ExtattrListLink(link, nsid, uintptr(d), destsiz) + if e != nil && e == EPERM && nsid != EXTATTR_NAMESPACE_USER { + continue + } else if e != nil { + return s, e + } + + s += stmp + destsiz -= s + if destsiz < 0 { + destsiz = 0 + } + d = initxattrdest(dest, s) + } + + return s, nil +} + +//sys ioctl(fd int, req uint, arg uintptr) (err error) + +// ioctl itself should not be exposed directly, but additional get/set +// functions for specific types are permissible. + +// IoctlSetInt performs an ioctl operation which sets an integer value +// on fd, using the specified request number. +func IoctlSetInt(fd int, req uint, value int) error { + return ioctl(fd, req, uintptr(value)) +} + +func IoctlSetWinsize(fd int, req uint, value *Winsize) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlSetTermios(fd int, req uint, value *Termios) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +// IoctlGetInt performs an ioctl operation which gets an integer value +// from fd, using the specified request number. +func IoctlGetInt(fd int, req uint) (int, error) { + var value int + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return value, err +} + +func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { + var value Winsize + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermios(fd int, req uint) (*Termios, error) { + var value Termios + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func Uname(uname *Utsname) error { + mib := []_C_int{CTL_KERN, KERN_OSTYPE} + n := unsafe.Sizeof(uname.Sysname) + if err := sysctl(mib, &uname.Sysname[0], &n, nil, 0); err != nil { + return err + } + + mib = []_C_int{CTL_KERN, KERN_HOSTNAME} + n = unsafe.Sizeof(uname.Nodename) + if err := sysctl(mib, &uname.Nodename[0], &n, nil, 0); err != nil { + return err + } + + mib = []_C_int{CTL_KERN, KERN_OSRELEASE} + n = unsafe.Sizeof(uname.Release) + if err := sysctl(mib, &uname.Release[0], &n, nil, 0); err != nil { + return err + } + + mib = []_C_int{CTL_KERN, KERN_VERSION} + n = unsafe.Sizeof(uname.Version) + if err := sysctl(mib, &uname.Version[0], &n, nil, 0); err != nil { + return err + } + + // The version might have newlines or tabs in it, convert them to + // spaces. + for i, b := range uname.Version { + if b == '\n' || b == '\t' { + if i == len(uname.Version)-1 { + uname.Version[i] = 0 + } else { + uname.Version[i] = ' ' + } + } + } + + mib = []_C_int{CTL_HW, HW_MACHINE} + n = unsafe.Sizeof(uname.Machine) + if err := sysctl(mib, &uname.Machine[0], &n, nil, 0); err != nil { + return err + } + + return nil +} + +/* + * Exposed directly + */ +//sys Access(path string, mode uint32) (err error) +//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) +//sys CapEnter() (err error) +//sys capRightsGet(version int, fd int, rightsp *CapRights) (err error) = SYS___CAP_RIGHTS_GET +//sys capRightsLimit(fd int, rightsp *CapRights) (err error) +//sys Chdir(path string) (err error) +//sys Chflags(path string, flags int) (err error) +//sys Chmod(path string, mode uint32) (err error) +//sys Chown(path string, uid int, gid int) (err error) +//sys Chroot(path string) (err error) +//sys Close(fd int) (err error) +//sys Dup(fd int) (nfd int, err error) +//sys Dup2(from int, to int) (err error) +//sys Exit(code int) +//sys ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error) +//sys ExtattrListFd(fd int, attrnamespace int, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrGetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrSetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err error) +//sys ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrGetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrSetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err error) +//sys ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_POSIX_FADVISE +//sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fchdir(fd int) (err error) +//sys Fchflags(fd int, flags int) (err error) +//sys Fchmod(fd int, mode uint32) (err error) +//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) +//sys Flock(fd int, how int) (err error) +//sys Fpathconf(fd int, name int) (val int, err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) +//sys Fstatfs(fd int, stat *Statfs_t) (err error) +//sys Fsync(fd int) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sys Getdents(fd int, buf []byte) (n int, err error) +//sys Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) +//sys Getdtablesize() (size int) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (uid int) +//sysnb Getgid() (gid int) +//sysnb Getpgid(pid int) (pgid int, err error) +//sysnb Getpgrp() (pgrp int) +//sysnb Getpid() (pid int) +//sysnb Getppid() (ppid int) +//sys Getpriority(which int, who int) (prio int, err error) +//sysnb Getrlimit(which int, lim *Rlimit) (err error) +//sysnb Getrusage(who int, rusage *Rusage) (err error) +//sysnb Getsid(pid int) (sid int, err error) +//sysnb Gettimeofday(tv *Timeval) (err error) +//sysnb Getuid() (uid int) +//sys Issetugid() (tainted bool) +//sys Kill(pid int, signum syscall.Signal) (err error) +//sys Kqueue() (fd int, err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Link(path string, link string) (err error) +//sys Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) +//sys Listen(s int, backlog int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Mkdir(path string, mode uint32) (err error) +//sys Mkdirat(dirfd int, path string, mode uint32) (err error) +//sys Mkfifo(path string, mode uint32) (err error) +//sys Mknod(path string, mode uint32, dev int) (err error) +//sys Nanosleep(time *Timespec, leftover *Timespec) (err error) +//sys Open(path string, mode int, perm uint32) (fd int, err error) +//sys Openat(fdat int, path string, mode int, perm uint32) (fd int, err error) +//sys Pathconf(path string, name int) (val int, err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys read(fd int, p []byte) (n int, err error) +//sys Readlink(path string, buf []byte) (n int, err error) +//sys Readlinkat(dirfd int, path string, buf []byte) (n int, err error) +//sys Rename(from string, to string) (err error) +//sys Renameat(fromfd int, from string, tofd int, to string) (err error) +//sys Revoke(path string) (err error) +//sys Rmdir(path string) (err error) +//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK +//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) +//sysnb Setegid(egid int) (err error) +//sysnb Seteuid(euid int) (err error) +//sysnb Setgid(gid int) (err error) +//sys Setlogin(name string) (err error) +//sysnb Setpgid(pid int, pgid int) (err error) +//sys Setpriority(which int, who int, prio int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(which int, lim *Rlimit) (err error) +//sysnb Setsid() (pid int, err error) +//sysnb Settimeofday(tp *Timeval) (err error) +//sysnb Setuid(uid int) (err error) +//sys Stat(path string, stat *Stat_t) (err error) +//sys Statfs(path string, stat *Statfs_t) (err error) +//sys Symlink(path string, link string) (err error) +//sys Symlinkat(oldpath string, newdirfd int, newpath string) (err error) +//sys Sync() (err error) +//sys Truncate(path string, length int64) (err error) +//sys Umask(newmask int) (oldmask int) +//sys Undelete(path string) (err error) +//sys Unlink(path string) (err error) +//sys Unlinkat(dirfd int, path string, flags int) (err error) +//sys Unmount(path string, flags int) (err error) +//sys write(fd int, p []byte) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) +//sys munmap(addr uintptr, length uintptr) (err error) +//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ +//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE +//sys accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) +//sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) + +/* + * Unimplemented + */ +// Profil +// Sigaction +// Sigprocmask +// Getlogin +// Sigpending +// Sigaltstack +// Ioctl +// Reboot +// Execve +// Vfork +// Sbrk +// Sstk +// Ovadvise +// Mincore +// Setitimer +// Swapon +// Select +// Sigsuspend +// Readv +// Writev +// Nfssvc +// Getfh +// Quotactl +// Mount +// Csops +// Waitid +// Add_profil +// Kdebug_trace +// Sigreturn +// Atsocket +// Kqueue_from_portset_np +// Kqueue_portset +// Getattrlist +// Setattrlist +// Getdirentriesattr +// Searchfs +// Delete +// Copyfile +// Watchevent +// Waitevent +// Modwatch +// Getxattr +// Fgetxattr +// Setxattr +// Fsetxattr +// Removexattr +// Fremovexattr +// Listxattr +// Flistxattr +// Fsctl +// Initgroups +// Posix_spawn +// Nfsclnt +// Fhopen +// Minherit +// Semsys +// Msgsys +// Shmsys +// Semctl +// Semget +// Semop +// Msgctl +// Msgget +// Msgsnd +// Msgrcv +// Shmat +// Shmctl +// Shmdt +// Shmget +// Shm_open +// Shm_unlink +// Sem_open +// Sem_close +// Sem_unlink +// Sem_wait +// Sem_trywait +// Sem_post +// Sem_getvalue +// Sem_init +// Sem_destroy +// Open_extended +// Umask_extended +// Stat_extended +// Lstat_extended +// Fstat_extended +// Chmod_extended +// Fchmod_extended +// Access_extended +// Settid +// Gettid +// Setsgroups +// Getsgroups +// Setwgroups +// Getwgroups +// Mkfifo_extended +// Mkdir_extended +// Identitysvc +// Shared_region_check_np +// Shared_region_map_np +// __pthread_mutex_destroy +// __pthread_mutex_init +// __pthread_mutex_lock +// __pthread_mutex_trylock +// __pthread_mutex_unlock +// __pthread_cond_init +// __pthread_cond_destroy +// __pthread_cond_broadcast +// __pthread_cond_signal +// Setsid_with_pid +// __pthread_cond_timedwait +// Aio_fsync +// Aio_return +// Aio_suspend +// Aio_cancel +// Aio_error +// Aio_read +// Aio_write +// Lio_listio +// __pthread_cond_wait +// Iopolicysys +// __pthread_kill +// __pthread_sigmask +// __sigwait +// __disable_threadsignal +// __pthread_markcancel +// __pthread_canceled +// __semwait_signal +// Proc_info +// Stat64_extended +// Lstat64_extended +// Fstat64_extended +// __pthread_chdir +// __pthread_fchdir +// Audit +// Auditon +// Getauid +// Setauid +// Getaudit +// Setaudit +// Getaudit_addr +// Setaudit_addr +// Auditctl +// Bsdthread_create +// Bsdthread_terminate +// Stack_snapshot +// Bsdthread_register +// Workq_open +// Workq_ops +// __mac_execve +// __mac_syscall +// __mac_get_file +// __mac_set_file +// __mac_get_link +// __mac_set_link +// __mac_get_proc +// __mac_set_proc +// __mac_get_fd +// __mac_set_fd +// __mac_get_pid +// __mac_get_lcid +// __mac_get_lctx +// __mac_set_lctx +// Setlcid +// Read_nocancel +// Write_nocancel +// Open_nocancel +// Close_nocancel +// Wait4_nocancel +// Recvmsg_nocancel +// Sendmsg_nocancel +// Recvfrom_nocancel +// Accept_nocancel +// Fcntl_nocancel +// Select_nocancel +// Fsync_nocancel +// Connect_nocancel +// Sigsuspend_nocancel +// Readv_nocancel +// Writev_nocancel +// Sendto_nocancel +// Pread_nocancel +// Pwrite_nocancel +// Waitid_nocancel +// Poll_nocancel +// Msgsnd_nocancel +// Msgrcv_nocancel +// Sem_wait_nocancel +// Aio_suspend_nocancel +// __sigwait_nocancel +// __semwait_signal_nocancel +// __mac_mount +// __mac_get_mount +// __mac_getfsstat diff --git a/api/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go b/api/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go new file mode 100644 index 0000000..21e0395 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go @@ -0,0 +1,52 @@ +// 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. + +// +build 386,freebsd + +package unix + +import ( + "syscall" + "unsafe" +) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: int32(sec), Nsec: int32(nsec)} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: int32(sec), Usec: int32(usec)} +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var writtenOut uint64 = 0 + _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr((*offset)>>32), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0) + + written = int(writtenOut) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) diff --git a/api/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go b/api/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go new file mode 100644 index 0000000..9c945a6 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go @@ -0,0 +1,52 @@ +// 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. + +// +build amd64,freebsd + +package unix + +import ( + "syscall" + "unsafe" +) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: usec} +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint64(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var writtenOut uint64 = 0 + _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0, 0) + + written = int(writtenOut) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) diff --git a/api/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go b/api/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go new file mode 100644 index 0000000..5cd6243 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go @@ -0,0 +1,52 @@ +// 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. + +// +build arm,freebsd + +package unix + +import ( + "syscall" + "unsafe" +) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: int32(nsec)} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: int32(usec)} +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var writtenOut uint64 = 0 + _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr((*offset)>>32), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0) + + written = int(writtenOut) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) diff --git a/api/vendor/golang.org/x/sys/unix/syscall_freebsd_test.go b/api/vendor/golang.org/x/sys/unix/syscall_freebsd_test.go new file mode 100644 index 0000000..0fec1a8 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_freebsd_test.go @@ -0,0 +1,312 @@ +// 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. + +// +build freebsd + +package unix_test + +import ( + "flag" + "fmt" + "io/ioutil" + "os" + "os/exec" + "path" + "path/filepath" + "runtime" + "testing" + + "golang.org/x/sys/unix" +) + +func TestSysctlUint64(t *testing.T) { + _, err := unix.SysctlUint64("vm.swap_total") + if err != nil { + t.Fatal(err) + } +} + +// FIXME: Infrastructure for launching tests in subprocesses stolen from openbsd_test.go - refactor? +// testCmd generates a proper command that, when executed, runs the test +// corresponding to the given key. + +type testProc struct { + fn func() // should always exit instead of returning + arg func(t *testing.T) string // generate argument for test + cleanup func(arg string) error // for instance, delete coredumps from testing pledge + success bool // whether zero-exit means success or failure +} + +var ( + testProcs = map[string]testProc{} + procName = "" + procArg = "" +) + +const ( + optName = "sys-unix-internal-procname" + optArg = "sys-unix-internal-arg" +) + +func init() { + flag.StringVar(&procName, optName, "", "internal use only") + flag.StringVar(&procArg, optArg, "", "internal use only") + +} + +func testCmd(procName string, procArg string) (*exec.Cmd, error) { + exe, err := filepath.Abs(os.Args[0]) + if err != nil { + return nil, err + } + cmd := exec.Command(exe, "-"+optName+"="+procName, "-"+optArg+"="+procArg) + cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr + return cmd, nil +} + +// ExitsCorrectly is a comprehensive, one-line-of-use wrapper for testing +// a testProc with a key. +func ExitsCorrectly(t *testing.T, procName string) { + s := testProcs[procName] + arg := "-" + if s.arg != nil { + arg = s.arg(t) + } + c, err := testCmd(procName, arg) + defer func(arg string) { + if err := s.cleanup(arg); err != nil { + t.Fatalf("Failed to run cleanup for %s %s %#v", procName, err, err) + } + }(arg) + if err != nil { + t.Fatalf("Failed to construct command for %s", procName) + } + if (c.Run() == nil) != s.success { + result := "succeed" + if !s.success { + result = "fail" + } + t.Fatalf("Process did not %s when it was supposed to", result) + } +} + +func TestMain(m *testing.M) { + flag.Parse() + if procName != "" { + t := testProcs[procName] + t.fn() + os.Stderr.WriteString("test function did not exit\n") + if t.success { + os.Exit(1) + } else { + os.Exit(0) + } + } + os.Exit(m.Run()) +} + +// end of infrastructure + +const testfile = "gocapmodetest" +const testfile2 = testfile + "2" + +func CapEnterTest() { + _, err := os.OpenFile(path.Join(procArg, testfile), os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666) + if err != nil { + panic(fmt.Sprintf("OpenFile: %s", err)) + } + + err = unix.CapEnter() + if err != nil { + panic(fmt.Sprintf("CapEnter: %s", err)) + } + + _, err = os.OpenFile(path.Join(procArg, testfile2), os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666) + if err == nil { + panic("OpenFile works!") + } + if err.(*os.PathError).Err != unix.ECAPMODE { + panic(fmt.Sprintf("OpenFile failed wrong: %s %#v", err, err)) + } + os.Exit(0) +} + +func makeTempDir(t *testing.T) string { + d, err := ioutil.TempDir("", "go_openat_test") + if err != nil { + t.Fatalf("TempDir failed: %s", err) + } + return d +} + +func removeTempDir(arg string) error { + err := os.RemoveAll(arg) + if err != nil && err.(*os.PathError).Err == unix.ENOENT { + return nil + } + return err +} + +func init() { + testProcs["cap_enter"] = testProc{ + CapEnterTest, + makeTempDir, + removeTempDir, + true, + } +} + +func TestCapEnter(t *testing.T) { + if runtime.GOARCH != "amd64" { + t.Skipf("skipping test on %s", runtime.GOARCH) + } + ExitsCorrectly(t, "cap_enter") +} + +func OpenatTest() { + f, err := os.Open(procArg) + if err != nil { + panic(err) + } + + err = unix.CapEnter() + if err != nil { + panic(fmt.Sprintf("CapEnter: %s", err)) + } + + fxx, err := unix.Openat(int(f.Fd()), "xx", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666) + if err != nil { + panic(err) + } + unix.Close(fxx) + + // The right to open BASE/xx is not ambient + _, err = os.OpenFile(procArg+"/xx", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666) + if err == nil { + panic("OpenFile succeeded") + } + if err.(*os.PathError).Err != unix.ECAPMODE { + panic(fmt.Sprintf("OpenFile failed wrong: %s %#v", err, err)) + } + + // Can't make a new directory either + err = os.Mkdir(procArg+"2", 0777) + if err == nil { + panic("MKdir succeeded") + } + if err.(*os.PathError).Err != unix.ECAPMODE { + panic(fmt.Sprintf("Mkdir failed wrong: %s %#v", err, err)) + } + + // Remove all caps except read and lookup. + r, err := unix.CapRightsInit([]uint64{unix.CAP_READ, unix.CAP_LOOKUP}) + if err != nil { + panic(fmt.Sprintf("CapRightsInit failed: %s %#v", err, err)) + } + err = unix.CapRightsLimit(f.Fd(), r) + if err != nil { + panic(fmt.Sprintf("CapRightsLimit failed: %s %#v", err, err)) + } + + // Check we can get the rights back again + r, err = unix.CapRightsGet(f.Fd()) + if err != nil { + panic(fmt.Sprintf("CapRightsGet failed: %s %#v", err, err)) + } + b, err := unix.CapRightsIsSet(r, []uint64{unix.CAP_READ, unix.CAP_LOOKUP}) + if err != nil { + panic(fmt.Sprintf("CapRightsIsSet failed: %s %#v", err, err)) + } + if !b { + panic(fmt.Sprintf("Unexpected rights")) + } + b, err = unix.CapRightsIsSet(r, []uint64{unix.CAP_READ, unix.CAP_LOOKUP, unix.CAP_WRITE}) + if err != nil { + panic(fmt.Sprintf("CapRightsIsSet failed: %s %#v", err, err)) + } + if b { + panic(fmt.Sprintf("Unexpected rights (2)")) + } + + // Can no longer create a file + _, err = unix.Openat(int(f.Fd()), "xx2", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666) + if err == nil { + panic("Openat succeeded") + } + if err != unix.ENOTCAPABLE { + panic(fmt.Sprintf("OpenFileAt failed wrong: %s %#v", err, err)) + } + + // But can read an existing one + _, err = unix.Openat(int(f.Fd()), "xx", os.O_RDONLY, 0666) + if err != nil { + panic(fmt.Sprintf("Openat failed: %s %#v", err, err)) + } + + os.Exit(0) +} + +func init() { + testProcs["openat"] = testProc{ + OpenatTest, + makeTempDir, + removeTempDir, + true, + } +} + +func TestOpenat(t *testing.T) { + if runtime.GOARCH != "amd64" { + t.Skipf("skipping test on %s", runtime.GOARCH) + } + ExitsCorrectly(t, "openat") +} + +func TestCapRightsSetAndClear(t *testing.T) { + r, err := unix.CapRightsInit([]uint64{unix.CAP_READ, unix.CAP_WRITE, unix.CAP_PDWAIT}) + if err != nil { + t.Fatalf("CapRightsInit failed: %s", err) + } + + err = unix.CapRightsSet(r, []uint64{unix.CAP_EVENT, unix.CAP_LISTEN}) + if err != nil { + t.Fatalf("CapRightsSet failed: %s", err) + } + + b, err := unix.CapRightsIsSet(r, []uint64{unix.CAP_READ, unix.CAP_WRITE, unix.CAP_PDWAIT, unix.CAP_EVENT, unix.CAP_LISTEN}) + if err != nil { + t.Fatalf("CapRightsIsSet failed: %s", err) + } + if !b { + t.Fatalf("Wrong rights set") + } + + err = unix.CapRightsClear(r, []uint64{unix.CAP_READ, unix.CAP_PDWAIT}) + if err != nil { + t.Fatalf("CapRightsClear failed: %s", err) + } + + b, err = unix.CapRightsIsSet(r, []uint64{unix.CAP_WRITE, unix.CAP_EVENT, unix.CAP_LISTEN}) + if err != nil { + t.Fatalf("CapRightsIsSet failed: %s", err) + } + if !b { + t.Fatalf("Wrong rights set") + } +} + +// stringsFromByteSlice converts a sequence of attributes to a []string. +// On FreeBSD, each entry consists of a single byte containing the length +// of the attribute name, followed by the attribute name. +// The name is _not_ NULL-terminated. +func stringsFromByteSlice(buf []byte) []string { + var result []string + i := 0 + for i < len(buf) { + next := i + 1 + int(buf[i]) + result = append(result, string(buf[i+1:next])) + i = next + } + return result +} diff --git a/api/vendor/golang.org/x/sys/unix/syscall_linux.go b/api/vendor/golang.org/x/sys/unix/syscall_linux.go new file mode 100644 index 0000000..04f38c5 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_linux.go @@ -0,0 +1,1474 @@ +// 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. + +// Linux system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and +// wrap it in our own nicer implementation. + +package unix + +import ( + "syscall" + "unsafe" +) + +/* + * Wrapped + */ + +func Access(path string, mode uint32) (err error) { + return Faccessat(AT_FDCWD, path, mode, 0) +} + +func Chmod(path string, mode uint32) (err error) { + return Fchmodat(AT_FDCWD, path, mode, 0) +} + +func Chown(path string, uid int, gid int) (err error) { + return Fchownat(AT_FDCWD, path, uid, gid, 0) +} + +func Creat(path string, mode uint32) (fd int, err error) { + return Open(path, O_CREAT|O_WRONLY|O_TRUNC, mode) +} + +//sys fchmodat(dirfd int, path string, mode uint32) (err error) + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + // Linux fchmodat doesn't support the flags parameter. Mimick glibc's behavior + // and check the flags. Otherwise the mode would be applied to the symlink + // destination which is not what the user expects. + if flags&^AT_SYMLINK_NOFOLLOW != 0 { + return EINVAL + } else if flags&AT_SYMLINK_NOFOLLOW != 0 { + return EOPNOTSUPP + } + return fchmodat(dirfd, path, mode) +} + +//sys ioctl(fd int, req uint, arg uintptr) (err error) + +// ioctl itself should not be exposed directly, but additional get/set +// functions for specific types are permissible. + +// IoctlSetInt performs an ioctl operation which sets an integer value +// on fd, using the specified request number. +func IoctlSetInt(fd int, req uint, value int) error { + return ioctl(fd, req, uintptr(value)) +} + +func IoctlSetWinsize(fd int, req uint, value *Winsize) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlSetTermios(fd int, req uint, value *Termios) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +// IoctlGetInt performs an ioctl operation which gets an integer value +// from fd, using the specified request number. +func IoctlGetInt(fd int, req uint) (int, error) { + var value int + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return value, err +} + +func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { + var value Winsize + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermios(fd int, req uint) (*Termios, error) { + var value Termios + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +//sys Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) + +func Link(oldpath string, newpath string) (err error) { + return Linkat(AT_FDCWD, oldpath, AT_FDCWD, newpath, 0) +} + +func Mkdir(path string, mode uint32) (err error) { + return Mkdirat(AT_FDCWD, path, mode) +} + +func Mknod(path string, mode uint32, dev int) (err error) { + return Mknodat(AT_FDCWD, path, mode, dev) +} + +func Open(path string, mode int, perm uint32) (fd int, err error) { + return openat(AT_FDCWD, path, mode|O_LARGEFILE, perm) +} + +//sys openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) + +func Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + return openat(dirfd, path, flags|O_LARGEFILE, mode) +} + +//sys ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) + +func Ppoll(fds []PollFd, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + if len(fds) == 0 { + return ppoll(nil, 0, timeout, sigmask) + } + return ppoll(&fds[0], len(fds), timeout, sigmask) +} + +//sys Readlinkat(dirfd int, path string, buf []byte) (n int, err error) + +func Readlink(path string, buf []byte) (n int, err error) { + return Readlinkat(AT_FDCWD, path, buf) +} + +func Rename(oldpath string, newpath string) (err error) { + return Renameat(AT_FDCWD, oldpath, AT_FDCWD, newpath) +} + +func Rmdir(path string) error { + return Unlinkat(AT_FDCWD, path, AT_REMOVEDIR) +} + +//sys Symlinkat(oldpath string, newdirfd int, newpath string) (err error) + +func Symlink(oldpath string, newpath string) (err error) { + return Symlinkat(oldpath, AT_FDCWD, newpath) +} + +func Unlink(path string) error { + return Unlinkat(AT_FDCWD, path, 0) +} + +//sys Unlinkat(dirfd int, path string, flags int) (err error) + +//sys utimes(path string, times *[2]Timeval) (err error) + +func Utimes(path string, tv []Timeval) error { + if tv == nil { + err := utimensat(AT_FDCWD, path, nil, 0) + if err != ENOSYS { + return err + } + return utimes(path, nil) + } + if len(tv) != 2 { + return EINVAL + } + var ts [2]Timespec + ts[0] = NsecToTimespec(TimevalToNsec(tv[0])) + ts[1] = NsecToTimespec(TimevalToNsec(tv[1])) + err := utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) + if err != ENOSYS { + return err + } + return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +//sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) + +func UtimesNano(path string, ts []Timespec) error { + if ts == nil { + err := utimensat(AT_FDCWD, path, nil, 0) + if err != ENOSYS { + return err + } + return utimes(path, nil) + } + if len(ts) != 2 { + return EINVAL + } + err := utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) + if err != ENOSYS { + return err + } + // If the utimensat syscall isn't available (utimensat was added to Linux + // in 2.6.22, Released, 8 July 2007) then fall back to utimes + var tv [2]Timeval + for i := 0; i < 2; i++ { + tv[i] = NsecToTimeval(TimespecToNsec(ts[i])) + } + return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +func UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) error { + if ts == nil { + return utimensat(dirfd, path, nil, flags) + } + if len(ts) != 2 { + return EINVAL + } + return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags) +} + +//sys futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) + +func Futimesat(dirfd int, path string, tv []Timeval) error { + pathp, err := BytePtrFromString(path) + if err != nil { + return err + } + if tv == nil { + return futimesat(dirfd, pathp, nil) + } + if len(tv) != 2 { + return EINVAL + } + return futimesat(dirfd, pathp, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +func Futimes(fd int, tv []Timeval) (err error) { + // Believe it or not, this is the best we can do on Linux + // (and is what glibc does). + return Utimes("/proc/self/fd/"+itoa(fd), tv) +} + +const ImplementsGetwd = true + +//sys Getcwd(buf []byte) (n int, err error) + +func Getwd() (wd string, err error) { + var buf [PathMax]byte + n, err := Getcwd(buf[0:]) + if err != nil { + return "", err + } + // Getcwd returns the number of bytes written to buf, including the NUL. + if n < 1 || n > len(buf) || buf[n-1] != 0 { + return "", EINVAL + } + return string(buf[0 : n-1]), nil +} + +func Getgroups() (gids []int, err error) { + n, err := getgroups(0, nil) + if err != nil { + return nil, err + } + if n == 0 { + return nil, nil + } + + // Sanity check group count. Max is 1<<16 on Linux. + if n < 0 || n > 1<<20 { + return nil, EINVAL + } + + a := make([]_Gid_t, n) + n, err = getgroups(n, &a[0]) + if err != nil { + return nil, err + } + gids = make([]int, n) + for i, v := range a[0:n] { + gids[i] = int(v) + } + return +} + +func Setgroups(gids []int) (err error) { + if len(gids) == 0 { + return setgroups(0, nil) + } + + a := make([]_Gid_t, len(gids)) + for i, v := range gids { + a[i] = _Gid_t(v) + } + return setgroups(len(a), &a[0]) +} + +type WaitStatus uint32 + +// Wait status is 7 bits at bottom, either 0 (exited), +// 0x7F (stopped), or a signal number that caused an exit. +// The 0x80 bit is whether there was a core dump. +// An extra number (exit code, signal causing a stop) +// is in the high bits. At least that's the idea. +// There are various irregularities. For example, the +// "continued" status is 0xFFFF, distinguishing itself +// from stopped via the core dump bit. + +const ( + mask = 0x7F + core = 0x80 + exited = 0x00 + stopped = 0x7F + shift = 8 +) + +func (w WaitStatus) Exited() bool { return w&mask == exited } + +func (w WaitStatus) Signaled() bool { return w&mask != stopped && w&mask != exited } + +func (w WaitStatus) Stopped() bool { return w&0xFF == stopped } + +func (w WaitStatus) Continued() bool { return w == 0xFFFF } + +func (w WaitStatus) CoreDump() bool { return w.Signaled() && w&core != 0 } + +func (w WaitStatus) ExitStatus() int { + if !w.Exited() { + return -1 + } + return int(w>>shift) & 0xFF +} + +func (w WaitStatus) Signal() syscall.Signal { + if !w.Signaled() { + return -1 + } + return syscall.Signal(w & mask) +} + +func (w WaitStatus) StopSignal() syscall.Signal { + if !w.Stopped() { + return -1 + } + return syscall.Signal(w>>shift) & 0xFF +} + +func (w WaitStatus) TrapCause() int { + if w.StopSignal() != SIGTRAP { + return -1 + } + return int(w>>shift) >> 8 +} + +//sys wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) + +func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) { + var status _C_int + wpid, err = wait4(pid, &status, options, rusage) + if wstatus != nil { + *wstatus = WaitStatus(status) + } + return +} + +func Mkfifo(path string, mode uint32) error { + return Mknod(path, mode|S_IFIFO, 0) +} + +func Mkfifoat(dirfd int, path string, mode uint32) error { + return Mknodat(dirfd, path, mode|S_IFIFO, 0) +} + +func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, EINVAL + } + sa.raw.Family = AF_INET + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), SizeofSockaddrInet4, nil +} + +func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, EINVAL + } + sa.raw.Family = AF_INET6 + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + sa.raw.Scope_id = sa.ZoneId + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), SizeofSockaddrInet6, nil +} + +func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) { + name := sa.Name + n := len(name) + if n >= len(sa.raw.Path) { + return nil, 0, EINVAL + } + sa.raw.Family = AF_UNIX + for i := 0; i < n; i++ { + sa.raw.Path[i] = int8(name[i]) + } + // length is family (uint16), name, NUL. + sl := _Socklen(2) + if n > 0 { + sl += _Socklen(n) + 1 + } + if sa.raw.Path[0] == '@' { + sa.raw.Path[0] = 0 + // Don't count trailing NUL for abstract address. + sl-- + } + + return unsafe.Pointer(&sa.raw), sl, nil +} + +// SockaddrLinklayer implements the Sockaddr interface for AF_PACKET type sockets. +type SockaddrLinklayer struct { + Protocol uint16 + Ifindex int + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]byte + raw RawSockaddrLinklayer +} + +func (sa *SockaddrLinklayer) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Ifindex < 0 || sa.Ifindex > 0x7fffffff { + return nil, 0, EINVAL + } + sa.raw.Family = AF_PACKET + sa.raw.Protocol = sa.Protocol + sa.raw.Ifindex = int32(sa.Ifindex) + sa.raw.Hatype = sa.Hatype + sa.raw.Pkttype = sa.Pkttype + sa.raw.Halen = sa.Halen + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), SizeofSockaddrLinklayer, nil +} + +// SockaddrNetlink implements the Sockaddr interface for AF_NETLINK type sockets. +type SockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 + raw RawSockaddrNetlink +} + +func (sa *SockaddrNetlink) sockaddr() (unsafe.Pointer, _Socklen, error) { + sa.raw.Family = AF_NETLINK + sa.raw.Pad = sa.Pad + sa.raw.Pid = sa.Pid + sa.raw.Groups = sa.Groups + return unsafe.Pointer(&sa.raw), SizeofSockaddrNetlink, nil +} + +// SockaddrHCI implements the Sockaddr interface for AF_BLUETOOTH type sockets +// using the HCI protocol. +type SockaddrHCI struct { + Dev uint16 + Channel uint16 + raw RawSockaddrHCI +} + +func (sa *SockaddrHCI) sockaddr() (unsafe.Pointer, _Socklen, error) { + sa.raw.Family = AF_BLUETOOTH + sa.raw.Dev = sa.Dev + sa.raw.Channel = sa.Channel + return unsafe.Pointer(&sa.raw), SizeofSockaddrHCI, nil +} + +// SockaddrL2 implements the Sockaddr interface for AF_BLUETOOTH type sockets +// using the L2CAP protocol. +type SockaddrL2 struct { + PSM uint16 + CID uint16 + Addr [6]uint8 + AddrType uint8 + raw RawSockaddrL2 +} + +func (sa *SockaddrL2) sockaddr() (unsafe.Pointer, _Socklen, error) { + sa.raw.Family = AF_BLUETOOTH + psm := (*[2]byte)(unsafe.Pointer(&sa.raw.Psm)) + psm[0] = byte(sa.PSM) + psm[1] = byte(sa.PSM >> 8) + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Bdaddr[i] = sa.Addr[len(sa.Addr)-1-i] + } + cid := (*[2]byte)(unsafe.Pointer(&sa.raw.Cid)) + cid[0] = byte(sa.CID) + cid[1] = byte(sa.CID >> 8) + sa.raw.Bdaddr_type = sa.AddrType + return unsafe.Pointer(&sa.raw), SizeofSockaddrL2, nil +} + +// SockaddrCAN implements the Sockaddr interface for AF_CAN type sockets. +// The RxID and TxID fields are used for transport protocol addressing in +// (CAN_TP16, CAN_TP20, CAN_MCNET, and CAN_ISOTP), they can be left with +// zero values for CAN_RAW and CAN_BCM sockets as they have no meaning. +// +// The SockaddrCAN struct must be bound to the socket file descriptor +// using Bind before the CAN socket can be used. +// +// // Read one raw CAN frame +// fd, _ := Socket(AF_CAN, SOCK_RAW, CAN_RAW) +// addr := &SockaddrCAN{Ifindex: index} +// Bind(fd, addr) +// frame := make([]byte, 16) +// Read(fd, frame) +// +// The full SocketCAN documentation can be found in the linux kernel +// archives at: https://www.kernel.org/doc/Documentation/networking/can.txt +type SockaddrCAN struct { + Ifindex int + RxID uint32 + TxID uint32 + raw RawSockaddrCAN +} + +func (sa *SockaddrCAN) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Ifindex < 0 || sa.Ifindex > 0x7fffffff { + return nil, 0, EINVAL + } + sa.raw.Family = AF_CAN + sa.raw.Ifindex = int32(sa.Ifindex) + rx := (*[4]byte)(unsafe.Pointer(&sa.RxID)) + for i := 0; i < 4; i++ { + sa.raw.Addr[i] = rx[i] + } + tx := (*[4]byte)(unsafe.Pointer(&sa.TxID)) + for i := 0; i < 4; i++ { + sa.raw.Addr[i+4] = tx[i] + } + return unsafe.Pointer(&sa.raw), SizeofSockaddrCAN, nil +} + +// SockaddrALG implements the Sockaddr interface for AF_ALG type sockets. +// SockaddrALG enables userspace access to the Linux kernel's cryptography +// subsystem. The Type and Name fields specify which type of hash or cipher +// should be used with a given socket. +// +// To create a file descriptor that provides access to a hash or cipher, both +// Bind and Accept must be used. Once the setup process is complete, input +// data can be written to the socket, processed by the kernel, and then read +// back as hash output or ciphertext. +// +// Here is an example of using an AF_ALG socket with SHA1 hashing. +// The initial socket setup process is as follows: +// +// // Open a socket to perform SHA1 hashing. +// fd, _ := unix.Socket(unix.AF_ALG, unix.SOCK_SEQPACKET, 0) +// addr := &unix.SockaddrALG{Type: "hash", Name: "sha1"} +// unix.Bind(fd, addr) +// // Note: unix.Accept does not work at this time; must invoke accept() +// // manually using unix.Syscall. +// hashfd, _, _ := unix.Syscall(unix.SYS_ACCEPT, uintptr(fd), 0, 0) +// +// Once a file descriptor has been returned from Accept, it may be used to +// perform SHA1 hashing. The descriptor is not safe for concurrent use, but +// may be re-used repeatedly with subsequent Write and Read operations. +// +// When hashing a small byte slice or string, a single Write and Read may +// be used: +// +// // Assume hashfd is already configured using the setup process. +// hash := os.NewFile(hashfd, "sha1") +// // Hash an input string and read the results. Each Write discards +// // previous hash state. Read always reads the current state. +// b := make([]byte, 20) +// for i := 0; i < 2; i++ { +// io.WriteString(hash, "Hello, world.") +// hash.Read(b) +// fmt.Println(hex.EncodeToString(b)) +// } +// // Output: +// // 2ae01472317d1935a84797ec1983ae243fc6aa28 +// // 2ae01472317d1935a84797ec1983ae243fc6aa28 +// +// For hashing larger byte slices, or byte streams such as those read from +// a file or socket, use Sendto with MSG_MORE to instruct the kernel to update +// the hash digest instead of creating a new one for a given chunk and finalizing it. +// +// // Assume hashfd and addr are already configured using the setup process. +// hash := os.NewFile(hashfd, "sha1") +// // Hash the contents of a file. +// f, _ := os.Open("/tmp/linux-4.10-rc7.tar.xz") +// b := make([]byte, 4096) +// for { +// n, err := f.Read(b) +// if err == io.EOF { +// break +// } +// unix.Sendto(hashfd, b[:n], unix.MSG_MORE, addr) +// } +// hash.Read(b) +// fmt.Println(hex.EncodeToString(b)) +// // Output: 85cdcad0c06eef66f805ecce353bec9accbeecc5 +// +// For more information, see: http://www.chronox.de/crypto-API/crypto/userspace-if.html. +type SockaddrALG struct { + Type string + Name string + Feature uint32 + Mask uint32 + raw RawSockaddrALG +} + +func (sa *SockaddrALG) sockaddr() (unsafe.Pointer, _Socklen, error) { + // Leave room for NUL byte terminator. + if len(sa.Type) > 13 { + return nil, 0, EINVAL + } + if len(sa.Name) > 63 { + return nil, 0, EINVAL + } + + sa.raw.Family = AF_ALG + sa.raw.Feat = sa.Feature + sa.raw.Mask = sa.Mask + + typ, err := ByteSliceFromString(sa.Type) + if err != nil { + return nil, 0, err + } + name, err := ByteSliceFromString(sa.Name) + if err != nil { + return nil, 0, err + } + + copy(sa.raw.Type[:], typ) + copy(sa.raw.Name[:], name) + + return unsafe.Pointer(&sa.raw), SizeofSockaddrALG, nil +} + +// SockaddrVM implements the Sockaddr interface for AF_VSOCK type sockets. +// SockaddrVM provides access to Linux VM sockets: a mechanism that enables +// bidirectional communication between a hypervisor and its guest virtual +// machines. +type SockaddrVM struct { + // CID and Port specify a context ID and port address for a VM socket. + // Guests have a unique CID, and hosts may have a well-known CID of: + // - VMADDR_CID_HYPERVISOR: refers to the hypervisor process. + // - VMADDR_CID_HOST: refers to other processes on the host. + CID uint32 + Port uint32 + raw RawSockaddrVM +} + +func (sa *SockaddrVM) sockaddr() (unsafe.Pointer, _Socklen, error) { + sa.raw.Family = AF_VSOCK + sa.raw.Port = sa.Port + sa.raw.Cid = sa.CID + + return unsafe.Pointer(&sa.raw), SizeofSockaddrVM, nil +} + +func anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) { + switch rsa.Addr.Family { + case AF_NETLINK: + pp := (*RawSockaddrNetlink)(unsafe.Pointer(rsa)) + sa := new(SockaddrNetlink) + sa.Family = pp.Family + sa.Pad = pp.Pad + sa.Pid = pp.Pid + sa.Groups = pp.Groups + return sa, nil + + case AF_PACKET: + pp := (*RawSockaddrLinklayer)(unsafe.Pointer(rsa)) + sa := new(SockaddrLinklayer) + sa.Protocol = pp.Protocol + sa.Ifindex = int(pp.Ifindex) + sa.Hatype = pp.Hatype + sa.Pkttype = pp.Pkttype + sa.Halen = pp.Halen + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + + case AF_UNIX: + pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa)) + sa := new(SockaddrUnix) + if pp.Path[0] == 0 { + // "Abstract" Unix domain socket. + // Rewrite leading NUL as @ for textual display. + // (This is the standard convention.) + // Not friendly to overwrite in place, + // but the callers below don't care. + pp.Path[0] = '@' + } + + // Assume path ends at NUL. + // This is not technically the Linux semantics for + // abstract Unix domain sockets--they are supposed + // to be uninterpreted fixed-size binary blobs--but + // everyone uses this convention. + n := 0 + for n < len(pp.Path) && pp.Path[n] != 0 { + n++ + } + bytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n] + sa.Name = string(bytes) + return sa, nil + + case AF_INET: + pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet4) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + + case AF_INET6: + pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet6) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + sa.ZoneId = pp.Scope_id + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + + case AF_VSOCK: + pp := (*RawSockaddrVM)(unsafe.Pointer(rsa)) + sa := &SockaddrVM{ + CID: pp.Cid, + Port: pp.Port, + } + return sa, nil + } + return nil, EAFNOSUPPORT +} + +func Accept(fd int) (nfd int, sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + nfd, err = accept(fd, &rsa, &len) + if err != nil { + return + } + sa, err = anyToSockaddr(&rsa) + if err != nil { + Close(nfd) + nfd = 0 + } + return +} + +func Accept4(fd int, flags int) (nfd int, sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + nfd, err = accept4(fd, &rsa, &len, flags) + if err != nil { + return + } + if len > SizeofSockaddrAny { + panic("RawSockaddrAny too small") + } + sa, err = anyToSockaddr(&rsa) + if err != nil { + Close(nfd) + nfd = 0 + } + return +} + +func Getsockname(fd int) (sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + if err = getsockname(fd, &rsa, &len); err != nil { + return + } + return anyToSockaddr(&rsa) +} + +func GetsockoptIPMreqn(fd, level, opt int) (*IPMreqn, error) { + var value IPMreqn + vallen := _Socklen(SizeofIPMreqn) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptUcred(fd, level, opt int) (*Ucred, error) { + var value Ucred + vallen := _Socklen(SizeofUcred) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptTCPInfo(fd, level, opt int) (*TCPInfo, error) { + var value TCPInfo + vallen := _Socklen(SizeofTCPInfo) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +// GetsockoptString returns the string value of the socket option opt for the +// socket associated with fd at the given socket level. +func GetsockoptString(fd, level, opt int) (string, error) { + buf := make([]byte, 256) + vallen := _Socklen(len(buf)) + err := getsockopt(fd, level, opt, unsafe.Pointer(&buf[0]), &vallen) + if err != nil { + if err == ERANGE { + buf = make([]byte, vallen) + err = getsockopt(fd, level, opt, unsafe.Pointer(&buf[0]), &vallen) + } + if err != nil { + return "", err + } + } + return string(buf[:vallen-1]), nil +} + +func SetsockoptIPMreqn(fd, level, opt int, mreq *IPMreqn) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(mreq), unsafe.Sizeof(*mreq)) +} + +// Keyctl Commands (http://man7.org/linux/man-pages/man2/keyctl.2.html) + +// KeyctlInt calls keyctl commands in which each argument is an int. +// These commands are KEYCTL_REVOKE, KEYCTL_CHOWN, KEYCTL_CLEAR, KEYCTL_LINK, +// KEYCTL_UNLINK, KEYCTL_NEGATE, KEYCTL_SET_REQKEY_KEYRING, KEYCTL_SET_TIMEOUT, +// KEYCTL_ASSUME_AUTHORITY, KEYCTL_SESSION_TO_PARENT, KEYCTL_REJECT, +// KEYCTL_INVALIDATE, and KEYCTL_GET_PERSISTENT. +//sys KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) = SYS_KEYCTL + +// KeyctlBuffer calls keyctl commands in which the third and fourth +// arguments are a buffer and its length, respectively. +// These commands are KEYCTL_UPDATE, KEYCTL_READ, and KEYCTL_INSTANTIATE. +//sys KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) = SYS_KEYCTL + +// KeyctlString calls keyctl commands which return a string. +// These commands are KEYCTL_DESCRIBE and KEYCTL_GET_SECURITY. +func KeyctlString(cmd int, id int) (string, error) { + // We must loop as the string data may change in between the syscalls. + // We could allocate a large buffer here to reduce the chance that the + // syscall needs to be called twice; however, this is unnecessary as + // the performance loss is negligible. + var buffer []byte + for { + // Try to fill the buffer with data + length, err := KeyctlBuffer(cmd, id, buffer, 0) + if err != nil { + return "", err + } + + // Check if the data was written + if length <= len(buffer) { + // Exclude the null terminator + return string(buffer[:length-1]), nil + } + + // Make a bigger buffer if needed + buffer = make([]byte, length) + } +} + +// Keyctl commands with special signatures. + +// KeyctlGetKeyringID implements the KEYCTL_GET_KEYRING_ID command. +// See the full documentation at: +// http://man7.org/linux/man-pages/man3/keyctl_get_keyring_ID.3.html +func KeyctlGetKeyringID(id int, create bool) (ringid int, err error) { + createInt := 0 + if create { + createInt = 1 + } + return KeyctlInt(KEYCTL_GET_KEYRING_ID, id, createInt, 0, 0) +} + +// KeyctlSetperm implements the KEYCTL_SETPERM command. The perm value is the +// key handle permission mask as described in the "keyctl setperm" section of +// http://man7.org/linux/man-pages/man1/keyctl.1.html. +// See the full documentation at: +// http://man7.org/linux/man-pages/man3/keyctl_setperm.3.html +func KeyctlSetperm(id int, perm uint32) error { + _, err := KeyctlInt(KEYCTL_SETPERM, id, int(perm), 0, 0) + return err +} + +//sys keyctlJoin(cmd int, arg2 string) (ret int, err error) = SYS_KEYCTL + +// KeyctlJoinSessionKeyring implements the KEYCTL_JOIN_SESSION_KEYRING command. +// See the full documentation at: +// http://man7.org/linux/man-pages/man3/keyctl_join_session_keyring.3.html +func KeyctlJoinSessionKeyring(name string) (ringid int, err error) { + return keyctlJoin(KEYCTL_JOIN_SESSION_KEYRING, name) +} + +//sys keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) = SYS_KEYCTL + +// KeyctlSearch implements the KEYCTL_SEARCH command. +// See the full documentation at: +// http://man7.org/linux/man-pages/man3/keyctl_search.3.html +func KeyctlSearch(ringid int, keyType, description string, destRingid int) (id int, err error) { + return keyctlSearch(KEYCTL_SEARCH, ringid, keyType, description, destRingid) +} + +//sys keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) = SYS_KEYCTL + +// KeyctlInstantiateIOV implements the KEYCTL_INSTANTIATE_IOV command. This +// command is similar to KEYCTL_INSTANTIATE, except that the payload is a slice +// of Iovec (each of which represents a buffer) instead of a single buffer. +// See the full documentation at: +// http://man7.org/linux/man-pages/man3/keyctl_instantiate_iov.3.html +func KeyctlInstantiateIOV(id int, payload []Iovec, ringid int) error { + return keyctlIOV(KEYCTL_INSTANTIATE_IOV, id, payload, ringid) +} + +//sys keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) = SYS_KEYCTL + +// KeyctlDHCompute implements the KEYCTL_DH_COMPUTE command. This command +// computes a Diffie-Hellman shared secret based on the provide params. The +// secret is written to the provided buffer and the returned size is the number +// of bytes written (returning an error if there is insufficient space in the +// buffer). If a nil buffer is passed in, this function returns the minimum +// buffer length needed to store the appropriate data. Note that this differs +// from KEYCTL_READ's behavior which always returns the requested payload size. +// See the full documentation at: +// http://man7.org/linux/man-pages/man3/keyctl_dh_compute.3.html +func KeyctlDHCompute(params *KeyctlDHParams, buffer []byte) (size int, err error) { + return keyctlDH(KEYCTL_DH_COMPUTE, params, buffer) +} + +func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { + var msg Msghdr + var rsa RawSockaddrAny + msg.Name = (*byte)(unsafe.Pointer(&rsa)) + msg.Namelen = uint32(SizeofSockaddrAny) + var iov Iovec + if len(p) > 0 { + iov.Base = &p[0] + iov.SetLen(len(p)) + } + var dummy byte + if len(oob) > 0 { + if len(p) == 0 { + var sockType int + sockType, err = GetsockoptInt(fd, SOL_SOCKET, SO_TYPE) + if err != nil { + return + } + // receive at least one normal byte + if sockType != SOCK_DGRAM { + iov.Base = &dummy + iov.SetLen(1) + } + } + msg.Control = &oob[0] + msg.SetControllen(len(oob)) + } + msg.Iov = &iov + msg.Iovlen = 1 + if n, err = recvmsg(fd, &msg, flags); err != nil { + return + } + oobn = int(msg.Controllen) + recvflags = int(msg.Flags) + // source address is only specified if the socket is unconnected + if rsa.Addr.Family != AF_UNSPEC { + from, err = anyToSockaddr(&rsa) + } + return +} + +func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { + _, err = SendmsgN(fd, p, oob, to, flags) + return +} + +func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { + var ptr unsafe.Pointer + var salen _Socklen + if to != nil { + var err error + ptr, salen, err = to.sockaddr() + if err != nil { + return 0, err + } + } + var msg Msghdr + msg.Name = (*byte)(ptr) + msg.Namelen = uint32(salen) + var iov Iovec + if len(p) > 0 { + iov.Base = &p[0] + iov.SetLen(len(p)) + } + var dummy byte + if len(oob) > 0 { + if len(p) == 0 { + var sockType int + sockType, err = GetsockoptInt(fd, SOL_SOCKET, SO_TYPE) + if err != nil { + return 0, err + } + // send at least one normal byte + if sockType != SOCK_DGRAM { + iov.Base = &dummy + iov.SetLen(1) + } + } + msg.Control = &oob[0] + msg.SetControllen(len(oob)) + } + msg.Iov = &iov + msg.Iovlen = 1 + if n, err = sendmsg(fd, &msg, flags); err != nil { + return 0, err + } + if len(oob) > 0 && len(p) == 0 { + n = 0 + } + return n, nil +} + +// BindToDevice binds the socket associated with fd to device. +func BindToDevice(fd int, device string) (err error) { + return SetsockoptString(fd, SOL_SOCKET, SO_BINDTODEVICE, device) +} + +//sys ptrace(request int, pid int, addr uintptr, data uintptr) (err error) + +func ptracePeek(req int, pid int, addr uintptr, out []byte) (count int, err error) { + // The peek requests are machine-size oriented, so we wrap it + // to retrieve arbitrary-length data. + + // The ptrace syscall differs from glibc's ptrace. + // Peeks returns the word in *data, not as the return value. + + var buf [sizeofPtr]byte + + // Leading edge. PEEKTEXT/PEEKDATA don't require aligned + // access (PEEKUSER warns that it might), but if we don't + // align our reads, we might straddle an unmapped page + // boundary and not get the bytes leading up to the page + // boundary. + n := 0 + if addr%sizeofPtr != 0 { + err = ptrace(req, pid, addr-addr%sizeofPtr, uintptr(unsafe.Pointer(&buf[0]))) + if err != nil { + return 0, err + } + n += copy(out, buf[addr%sizeofPtr:]) + out = out[n:] + } + + // Remainder. + for len(out) > 0 { + // We use an internal buffer to guarantee alignment. + // It's not documented if this is necessary, but we're paranoid. + err = ptrace(req, pid, addr+uintptr(n), uintptr(unsafe.Pointer(&buf[0]))) + if err != nil { + return n, err + } + copied := copy(out, buf[0:]) + n += copied + out = out[copied:] + } + + return n, nil +} + +func PtracePeekText(pid int, addr uintptr, out []byte) (count int, err error) { + return ptracePeek(PTRACE_PEEKTEXT, pid, addr, out) +} + +func PtracePeekData(pid int, addr uintptr, out []byte) (count int, err error) { + return ptracePeek(PTRACE_PEEKDATA, pid, addr, out) +} + +func PtracePeekUser(pid int, addr uintptr, out []byte) (count int, err error) { + return ptracePeek(PTRACE_PEEKUSR, pid, addr, out) +} + +func ptracePoke(pokeReq int, peekReq int, pid int, addr uintptr, data []byte) (count int, err error) { + // As for ptracePeek, we need to align our accesses to deal + // with the possibility of straddling an invalid page. + + // Leading edge. + n := 0 + if addr%sizeofPtr != 0 { + var buf [sizeofPtr]byte + err = ptrace(peekReq, pid, addr-addr%sizeofPtr, uintptr(unsafe.Pointer(&buf[0]))) + if err != nil { + return 0, err + } + n += copy(buf[addr%sizeofPtr:], data) + word := *((*uintptr)(unsafe.Pointer(&buf[0]))) + err = ptrace(pokeReq, pid, addr-addr%sizeofPtr, word) + if err != nil { + return 0, err + } + data = data[n:] + } + + // Interior. + for len(data) > sizeofPtr { + word := *((*uintptr)(unsafe.Pointer(&data[0]))) + err = ptrace(pokeReq, pid, addr+uintptr(n), word) + if err != nil { + return n, err + } + n += sizeofPtr + data = data[sizeofPtr:] + } + + // Trailing edge. + if len(data) > 0 { + var buf [sizeofPtr]byte + err = ptrace(peekReq, pid, addr+uintptr(n), uintptr(unsafe.Pointer(&buf[0]))) + if err != nil { + return n, err + } + copy(buf[0:], data) + word := *((*uintptr)(unsafe.Pointer(&buf[0]))) + err = ptrace(pokeReq, pid, addr+uintptr(n), word) + if err != nil { + return n, err + } + n += len(data) + } + + return n, nil +} + +func PtracePokeText(pid int, addr uintptr, data []byte) (count int, err error) { + return ptracePoke(PTRACE_POKETEXT, PTRACE_PEEKTEXT, pid, addr, data) +} + +func PtracePokeData(pid int, addr uintptr, data []byte) (count int, err error) { + return ptracePoke(PTRACE_POKEDATA, PTRACE_PEEKDATA, pid, addr, data) +} + +func PtracePokeUser(pid int, addr uintptr, data []byte) (count int, err error) { + return ptracePoke(PTRACE_POKEUSR, PTRACE_PEEKUSR, pid, addr, data) +} + +func PtraceGetRegs(pid int, regsout *PtraceRegs) (err error) { + return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) +} + +func PtraceSetRegs(pid int, regs *PtraceRegs) (err error) { + return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) +} + +func PtraceSetOptions(pid int, options int) (err error) { + return ptrace(PTRACE_SETOPTIONS, pid, 0, uintptr(options)) +} + +func PtraceGetEventMsg(pid int) (msg uint, err error) { + var data _C_long + err = ptrace(PTRACE_GETEVENTMSG, pid, 0, uintptr(unsafe.Pointer(&data))) + msg = uint(data) + return +} + +func PtraceCont(pid int, signal int) (err error) { + return ptrace(PTRACE_CONT, pid, 0, uintptr(signal)) +} + +func PtraceSyscall(pid int, signal int) (err error) { + return ptrace(PTRACE_SYSCALL, pid, 0, uintptr(signal)) +} + +func PtraceSingleStep(pid int) (err error) { return ptrace(PTRACE_SINGLESTEP, pid, 0, 0) } + +func PtraceAttach(pid int) (err error) { return ptrace(PTRACE_ATTACH, pid, 0, 0) } + +func PtraceDetach(pid int) (err error) { return ptrace(PTRACE_DETACH, pid, 0, 0) } + +//sys reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) + +func Reboot(cmd int) (err error) { + return reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, cmd, "") +} + +func ReadDirent(fd int, buf []byte) (n int, err error) { + return Getdents(fd, buf) +} + +//sys mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) + +func Mount(source string, target string, fstype string, flags uintptr, data string) (err error) { + // Certain file systems get rather angry and EINVAL if you give + // them an empty string of data, rather than NULL. + if data == "" { + return mount(source, target, fstype, flags, nil) + } + datap, err := BytePtrFromString(data) + if err != nil { + return err + } + return mount(source, target, fstype, flags, datap) +} + +// Sendto +// Recvfrom +// Socketpair + +/* + * Direct access + */ +//sys Acct(path string) (err error) +//sys AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) +//sys Adjtimex(buf *Timex) (state int, err error) +//sys Chdir(path string) (err error) +//sys Chroot(path string) (err error) +//sys ClockGettime(clockid int32, time *Timespec) (err error) +//sys Close(fd int) (err error) +//sys CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) +//sys Dup(oldfd int) (fd int, err error) +//sys Dup3(oldfd int, newfd int, flags int) (err error) +//sysnb EpollCreate(size int) (fd int, err error) +//sysnb EpollCreate1(flag int) (fd int, err error) +//sysnb EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) +//sys Eventfd(initval uint, flags int) (fd int, err error) = SYS_EVENTFD2 +//sys Exit(code int) = SYS_EXIT_GROUP +//sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fallocate(fd int, mode uint32, off int64, len int64) (err error) +//sys Fchdir(fd int) (err error) +//sys Fchmod(fd int, mode uint32) (err error) +//sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) +//sys fcntl(fd int, cmd int, arg int) (val int, err error) +//sys Fdatasync(fd int) (err error) +//sys Flock(fd int, how int) (err error) +//sys Fsync(fd int) (err error) +//sys Getdents(fd int, buf []byte) (n int, err error) = SYS_GETDENTS64 +//sysnb Getpgid(pid int) (pgid int, err error) + +func Getpgrp() (pid int) { + pid, _ = Getpgid(0) + return +} + +//sysnb Getpid() (pid int) +//sysnb Getppid() (ppid int) +//sys Getpriority(which int, who int) (prio int, err error) +//sys Getrandom(buf []byte, flags int) (n int, err error) +//sysnb Getrusage(who int, rusage *Rusage) (err error) +//sysnb Getsid(pid int) (sid int, err error) +//sysnb Gettid() (tid int) +//sys Getxattr(path string, attr string, dest []byte) (sz int, err error) +//sys InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) +//sysnb InotifyInit1(flags int) (fd int, err error) +//sysnb InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) +//sysnb Kill(pid int, sig syscall.Signal) (err error) +//sys Klogctl(typ int, buf []byte) (n int, err error) = SYS_SYSLOG +//sys Lgetxattr(path string, attr string, dest []byte) (sz int, err error) +//sys Listxattr(path string, dest []byte) (sz int, err error) +//sys Llistxattr(path string, dest []byte) (sz int, err error) +//sys Lremovexattr(path string, attr string) (err error) +//sys Lsetxattr(path string, attr string, data []byte, flags int) (err error) +//sys Mkdirat(dirfd int, path string, mode uint32) (err error) +//sys Mknodat(dirfd int, path string, mode uint32, dev int) (err error) +//sys Nanosleep(time *Timespec, leftover *Timespec) (err error) +//sys PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) +//sys PivotRoot(newroot string, putold string) (err error) = SYS_PIVOT_ROOT +//sysnb prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) = SYS_PRLIMIT64 +//sys Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) +//sys Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) = SYS_PSELECT6 +//sys read(fd int, p []byte) (n int, err error) +//sys Removexattr(path string, attr string) (err error) +//sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) +//sys RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) +//sys Setdomainname(p []byte) (err error) +//sys Sethostname(p []byte) (err error) +//sysnb Setpgid(pid int, pgid int) (err error) +//sysnb Setsid() (pid int, err error) +//sysnb Settimeofday(tv *Timeval) (err error) +//sys Setns(fd int, nstype int) (err error) + +// issue 1435. +// On linux Setuid and Setgid only affects the current thread, not the process. +// This does not match what most callers expect so we must return an error +// here rather than letting the caller think that the call succeeded. + +func Setuid(uid int) (err error) { + return EOPNOTSUPP +} + +func Setgid(uid int) (err error) { + return EOPNOTSUPP +} + +//sys Setpriority(which int, who int, prio int) (err error) +//sys Setxattr(path string, attr string, data []byte, flags int) (err error) +//sys Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) +//sys Sync() +//sys Syncfs(fd int) (err error) +//sysnb Sysinfo(info *Sysinfo_t) (err error) +//sys Tee(rfd int, wfd int, len int, flags int) (n int64, err error) +//sysnb Tgkill(tgid int, tid int, sig syscall.Signal) (err error) +//sysnb Times(tms *Tms) (ticks uintptr, err error) +//sysnb Umask(mask int) (oldmask int) +//sysnb Uname(buf *Utsname) (err error) +//sys Unmount(target string, flags int) (err error) = SYS_UMOUNT2 +//sys Unshare(flags int) (err error) +//sys Ustat(dev int, ubuf *Ustat_t) (err error) +//sys write(fd int, p []byte) (n int, err error) +//sys exitThread(code int) (err error) = SYS_EXIT +//sys readlen(fd int, p *byte, np int) (n int, err error) = SYS_READ +//sys writelen(fd int, p *byte, np int) (n int, err error) = SYS_WRITE + +// mmap varies by architecture; see syscall_linux_*.go. +//sys munmap(addr uintptr, length uintptr) (err error) + +var mapper = &mmapper{ + active: make(map[*byte][]byte), + mmap: mmap, + munmap: munmap, +} + +func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { + return mapper.Mmap(fd, offset, length, prot, flags) +} + +func Munmap(b []byte) (err error) { + return mapper.Munmap(b) +} + +//sys Madvise(b []byte, advice int) (err error) +//sys Mprotect(b []byte, prot int) (err error) +//sys Mlock(b []byte) (err error) +//sys Mlockall(flags int) (err error) +//sys Msync(b []byte, flags int) (err error) +//sys Munlock(b []byte) (err error) +//sys Munlockall() (err error) + +// Vmsplice splices user pages from a slice of Iovecs into a pipe specified by fd, +// using the specified flags. +func Vmsplice(fd int, iovs []Iovec, flags int) (int, error) { + n, _, errno := Syscall6( + SYS_VMSPLICE, + uintptr(fd), + uintptr(unsafe.Pointer(&iovs[0])), + uintptr(len(iovs)), + uintptr(flags), + 0, + 0, + ) + if errno != 0 { + return 0, syscall.Errno(errno) + } + + return int(n), nil +} + +/* + * Unimplemented + */ +// AfsSyscall +// Alarm +// ArchPrctl +// Brk +// Capget +// Capset +// ClockGetres +// ClockNanosleep +// ClockSettime +// Clone +// CreateModule +// DeleteModule +// EpollCtlOld +// EpollPwait +// EpollWaitOld +// Execve +// Fgetxattr +// Flistxattr +// Fork +// Fremovexattr +// Fsetxattr +// Futex +// GetKernelSyms +// GetMempolicy +// GetRobustList +// GetThreadArea +// Getitimer +// Getpmsg +// IoCancel +// IoDestroy +// IoGetevents +// IoSetup +// IoSubmit +// IoprioGet +// IoprioSet +// KexecLoad +// LookupDcookie +// Mbind +// MigratePages +// Mincore +// ModifyLdt +// Mount +// MovePages +// MqGetsetattr +// MqNotify +// MqOpen +// MqTimedreceive +// MqTimedsend +// MqUnlink +// Mremap +// Msgctl +// Msgget +// Msgrcv +// Msgsnd +// Nfsservctl +// Personality +// Pselect6 +// Ptrace +// Putpmsg +// QueryModule +// Quotactl +// Readahead +// Readv +// RemapFilePages +// RestartSyscall +// RtSigaction +// RtSigpending +// RtSigprocmask +// RtSigqueueinfo +// RtSigreturn +// RtSigsuspend +// RtSigtimedwait +// SchedGetPriorityMax +// SchedGetPriorityMin +// SchedGetparam +// SchedGetscheduler +// SchedRrGetInterval +// SchedSetparam +// SchedYield +// Security +// Semctl +// Semget +// Semop +// Semtimedop +// SetMempolicy +// SetRobustList +// SetThreadArea +// SetTidAddress +// Shmat +// Shmctl +// Shmdt +// Shmget +// Sigaltstack +// Signalfd +// Swapoff +// Swapon +// Sysfs +// TimerCreate +// TimerDelete +// TimerGetoverrun +// TimerGettime +// TimerSettime +// Timerfd +// Tkill (obsolete) +// Tuxcall +// Umount2 +// Uselib +// Utimensat +// Vfork +// Vhangup +// Vserver +// Waitid +// _Sysctl diff --git a/api/vendor/golang.org/x/sys/unix/syscall_linux_386.go b/api/vendor/golang.org/x/sys/unix/syscall_linux_386.go new file mode 100644 index 0000000..bb8e4fb --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_linux_386.go @@ -0,0 +1,391 @@ +// 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. + +// TODO(rsc): Rewrite all nn(SP) references into name+(nn-8)(FP) +// so that go vet can check that they are correct. + +// +build 386,linux + +package unix + +import ( + "syscall" + "unsafe" +) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: int32(sec), Nsec: int32(nsec)} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: int32(sec), Usec: int32(usec)} +} + +//sysnb pipe(p *[2]_C_int) (err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe(&pp) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +// 64-bit file system and 32-bit uid calls +// (386 default is 32-bit file system and 16-bit uid). +//sys Dup2(oldfd int, newfd int) (err error) +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64_64 +//sys Fchown(fd int, uid int, gid int) (err error) = SYS_FCHOWN32 +//sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64 +//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64 +//sys Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64 +//sysnb Getegid() (egid int) = SYS_GETEGID32 +//sysnb Geteuid() (euid int) = SYS_GETEUID32 +//sysnb Getgid() (gid int) = SYS_GETGID32 +//sysnb Getuid() (uid int) = SYS_GETUID32 +//sysnb InotifyInit() (fd int, err error) +//sys Ioperm(from int, num int, on int) (err error) +//sys Iopl(level int) (err error) +//sys Lchown(path string, uid int, gid int) (err error) = SYS_LCHOWN32 +//sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64 +//sys Setfsgid(gid int) (err error) = SYS_SETFSGID32 +//sys Setfsuid(uid int) (err error) = SYS_SETFSUID32 +//sysnb Setregid(rgid int, egid int) (err error) = SYS_SETREGID32 +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) = SYS_SETRESGID32 +//sysnb Setresuid(ruid int, euid int, suid int) (err error) = SYS_SETRESUID32 +//sysnb Setreuid(ruid int, euid int) (err error) = SYS_SETREUID32 +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) +//sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64 +//sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) +//sys Truncate(path string, length int64) (err error) = SYS_TRUNCATE64 +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) = SYS_GETGROUPS32 +//sysnb setgroups(n int, list *_Gid_t) (err error) = SYS_SETGROUPS32 +//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT + +//sys mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) +//sys Pause() (err error) + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + page := uintptr(offset / 4096) + if offset != int64(page)*4096 { + return 0, EINVAL + } + return mmap2(addr, length, prot, flags, fd, page) +} + +type rlimit32 struct { + Cur uint32 + Max uint32 +} + +//sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_GETRLIMIT + +const rlimInf32 = ^uint32(0) +const rlimInf64 = ^uint64(0) + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + err = prlimit(0, resource, nil, rlim) + if err != ENOSYS { + return err + } + + rl := rlimit32{} + err = getrlimit(resource, &rl) + if err != nil { + return + } + + if rl.Cur == rlimInf32 { + rlim.Cur = rlimInf64 + } else { + rlim.Cur = uint64(rl.Cur) + } + + if rl.Max == rlimInf32 { + rlim.Max = rlimInf64 + } else { + rlim.Max = uint64(rl.Max) + } + return +} + +//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + err = prlimit(0, resource, rlim, nil) + if err != ENOSYS { + return err + } + + rl := rlimit32{} + if rlim.Cur == rlimInf64 { + rl.Cur = rlimInf32 + } else if rlim.Cur < uint64(rlimInf32) { + rl.Cur = uint32(rlim.Cur) + } else { + return EINVAL + } + if rlim.Max == rlimInf64 { + rl.Max = rlimInf32 + } else if rlim.Max < uint64(rlimInf32) { + rl.Max = uint32(rlim.Max) + } else { + return EINVAL + } + + return setrlimit(resource, &rl) +} + +// Underlying system call writes to newoffset via pointer. +// Implemented in assembly to avoid allocation. +func seek(fd int, offset int64, whence int) (newoffset int64, err syscall.Errno) + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + newoffset, errno := seek(fd, offset, whence) + if errno != 0 { + return 0, errno + } + return newoffset, nil +} + +// Vsyscalls on amd64. +//sysnb Gettimeofday(tv *Timeval) (err error) +//sysnb Time(t *Time_t) (tt Time_t, err error) + +//sys Utime(path string, buf *Utimbuf) (err error) + +// On x86 Linux, all the socket calls go through an extra indirection, +// I think because the 5-register system call interface can't handle +// the 6-argument calls like sendto and recvfrom. Instead the +// arguments to the underlying system call are the number below +// and a pointer to an array of uintptr. We hide the pointer in the +// socketcall assembly to avoid allocation on every system call. + +const ( + // see linux/net.h + _SOCKET = 1 + _BIND = 2 + _CONNECT = 3 + _LISTEN = 4 + _ACCEPT = 5 + _GETSOCKNAME = 6 + _GETPEERNAME = 7 + _SOCKETPAIR = 8 + _SEND = 9 + _RECV = 10 + _SENDTO = 11 + _RECVFROM = 12 + _SHUTDOWN = 13 + _SETSOCKOPT = 14 + _GETSOCKOPT = 15 + _SENDMSG = 16 + _RECVMSG = 17 + _ACCEPT4 = 18 + _RECVMMSG = 19 + _SENDMMSG = 20 +) + +func socketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (n int, err syscall.Errno) +func rawsocketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (n int, err syscall.Errno) + +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 { + err = e + } + return +} + +func getsockname(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, e := rawsocketcall(_GETSOCKNAME, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func getpeername(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, e := rawsocketcall(_GETPEERNAME, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func socketpair(domain int, typ int, flags int, fd *[2]int32) (err error) { + _, e := rawsocketcall(_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(flags), uintptr(unsafe.Pointer(fd)), 0, 0) + if e != 0 { + err = e + } + return +} + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, e := socketcall(_BIND, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, e := socketcall(_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func socket(domain int, typ int, proto int) (fd int, err error) { + fd, e := rawsocketcall(_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto), 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, e := socketcall(_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e != 0 { + err = e + } + return +} + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, e := socketcall(_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), vallen, 0) + if e != 0 { + err = e + } + return +} + +func recvfrom(s int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var base uintptr + if len(p) > 0 { + base = uintptr(unsafe.Pointer(&p[0])) + } + n, e := socketcall(_RECVFROM, uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + if e != 0 { + err = e + } + return +} + +func sendto(s int, p []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var base uintptr + if len(p) > 0 { + base = uintptr(unsafe.Pointer(&p[0])) + } + _, e := socketcall(_SENDTO, uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e != 0 { + err = e + } + return +} + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + n, e := socketcall(_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + n, e := socketcall(_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func Listen(s int, n int) (err error) { + _, e := socketcall(_LISTEN, uintptr(s), uintptr(n), 0, 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func Shutdown(s, how int) (err error) { + _, e := socketcall(_SHUTDOWN, uintptr(s), uintptr(how), 0, 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e := Syscall(SYS_FSTATFS64, uintptr(fd), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) + if e != 0 { + err = e + } + return +} + +func Statfs(path string, buf *Statfs_t) (err error) { + pathp, err := BytePtrFromString(path) + if err != nil { + return err + } + _, _, e := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(pathp)), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) + if e != 0 { + err = e + } + return +} + +func (r *PtraceRegs) PC() uint64 { return uint64(uint32(r.Eip)) } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Eip = int32(pc) } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} diff --git a/api/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go b/api/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go new file mode 100644 index 0000000..d121106 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go @@ -0,0 +1,157 @@ +// 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. + +// +build amd64,linux + +package unix + +//sys Dup2(oldfd int, newfd int) (err error) +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_NEWFSTATAT +//sys Fstatfs(fd int, buf *Statfs_t) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (euid int) +//sysnb Getgid() (gid int) +//sysnb Getrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Getuid() (uid int) +//sysnb InotifyInit() (fd int, err error) +//sys Ioperm(from int, num int, on int) (err error) +//sys Iopl(level int) (err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Listen(s int, n int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Pause() (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + var ts *Timespec + if timeout != nil { + ts = &Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000} + } + return Pselect(nfd, r, w, e, ts, nil) +} + +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) +//sys Setfsgid(gid int) (err error) +//sys Setfsuid(uid int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sys Shutdown(fd int, how int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) + +func Stat(path string, stat *Stat_t) (err error) { + // Use fstatat, because Android's seccomp policy blocks stat. + return Fstatat(AT_FDCWD, path, stat, 0) +} + +//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) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) +//sysnb setgroups(n int, list *_Gid_t) (err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) + +func Gettimeofday(tv *Timeval) (err error) { + errno := gettimeofday(tv) + if errno != 0 { + return errno + } + return nil +} + +func Time(t *Time_t) (tt Time_t, err error) { + var tv Timeval + errno := gettimeofday(&tv) + if errno != 0 { + return 0, errno + } + if t != nil { + *t = Time_t(tv.Sec) + } + return Time_t(tv.Sec), nil +} + +//sys Utime(path string, buf *Utimbuf) (err error) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: usec} +} + +//sysnb pipe(p *[2]_C_int) (err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe(&pp) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +func (r *PtraceRegs) PC() uint64 { return r.Rip } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Rip = pc } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint64(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint64(length) +} + +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} diff --git a/api/vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go b/api/vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go new file mode 100644 index 0000000..21a4946 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go @@ -0,0 +1,13 @@ +// 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. + +// +build amd64,linux +// +build !gccgo + +package unix + +import "syscall" + +//go:noescape +func gettimeofday(tv *Timeval) (err syscall.Errno) diff --git a/api/vendor/golang.org/x/sys/unix/syscall_linux_arm.go b/api/vendor/golang.org/x/sys/unix/syscall_linux_arm.go new file mode 100644 index 0000000..c59f858 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_linux_arm.go @@ -0,0 +1,255 @@ +// 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. + +// +build arm,linux + +package unix + +import ( + "syscall" + "unsafe" +) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: int32(sec), Nsec: int32(nsec)} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: int32(sec), Usec: int32(usec)} +} + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, 0) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +// Underlying system call writes to newoffset via pointer. +// Implemented in assembly to avoid allocation. +func seek(fd int, offset int64, whence int) (newoffset int64, err syscall.Errno) + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + newoffset, errno := seek(fd, offset, whence) + if errno != 0 { + return 0, errno + } + 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) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) = SYS_GETGROUPS32 +//sysnb setgroups(n int, list *_Gid_t) (err error) = SYS_SETGROUPS32 +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sysnb socketpair(domain int, typ int, flags int, fd *[2]int32) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) + +// 64-bit file system and 32-bit uid calls +// (16-bit uid calls are not always supported in newer kernels) +//sys Dup2(oldfd int, newfd int) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) = SYS_FCHOWN32 +//sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64 +//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64 +//sysnb Getegid() (egid int) = SYS_GETEGID32 +//sysnb Geteuid() (euid int) = SYS_GETEUID32 +//sysnb Getgid() (gid int) = SYS_GETGID32 +//sysnb Getuid() (uid int) = SYS_GETUID32 +//sysnb InotifyInit() (fd int, err error) +//sys Lchown(path string, uid int, gid int) (err error) = SYS_LCHOWN32 +//sys Listen(s int, n int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64 +//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT +//sys Setfsgid(gid int) (err error) = SYS_SETFSGID32 +//sys Setfsuid(uid int) (err error) = SYS_SETFSUID32 +//sysnb Setregid(rgid int, egid int) (err error) = SYS_SETREGID32 +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) = SYS_SETRESGID32 +//sysnb Setresuid(ruid int, euid int, suid int) (err error) = SYS_SETRESUID32 +//sysnb Setreuid(ruid int, euid int) (err error) = SYS_SETREUID32 +//sys Shutdown(fd int, how int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) +//sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64 + +// Vsyscalls on amd64. +//sysnb Gettimeofday(tv *Timeval) (err error) +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) +//sys Pause() (err error) + +func Time(t *Time_t) (Time_t, error) { + var tv Timeval + err := Gettimeofday(&tv) + if err != nil { + return 0, err + } + if t != nil { + *t = Time_t(tv.Sec) + } + return Time_t(tv.Sec), nil +} + +func Utime(path string, buf *Utimbuf) error { + tv := []Timeval{ + {Sec: buf.Actime}, + {Sec: buf.Modtime}, + } + return Utimes(path, tv) +} + +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Truncate(path string, length int64) (err error) = SYS_TRUNCATE64 +//sys Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64 + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_ARM_FADVISE64_64, uintptr(fd), uintptr(advice), uintptr(offset), uintptr(offset>>32), uintptr(length), uintptr(length>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +//sys mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e := Syscall(SYS_FSTATFS64, uintptr(fd), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) + if e != 0 { + err = e + } + return +} + +func Statfs(path string, buf *Statfs_t) (err error) { + pathp, err := BytePtrFromString(path) + if err != nil { + return err + } + _, _, e := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(pathp)), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) + if e != 0 { + err = e + } + return +} + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + page := uintptr(offset / 4096) + if offset != int64(page)*4096 { + return 0, EINVAL + } + return mmap2(addr, length, prot, flags, fd, page) +} + +type rlimit32 struct { + Cur uint32 + Max uint32 +} + +//sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_UGETRLIMIT + +const rlimInf32 = ^uint32(0) +const rlimInf64 = ^uint64(0) + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + err = prlimit(0, resource, nil, rlim) + if err != ENOSYS { + return err + } + + rl := rlimit32{} + err = getrlimit(resource, &rl) + if err != nil { + return + } + + if rl.Cur == rlimInf32 { + rlim.Cur = rlimInf64 + } else { + rlim.Cur = uint64(rl.Cur) + } + + if rl.Max == rlimInf32 { + rlim.Max = rlimInf64 + } else { + rlim.Max = uint64(rl.Max) + } + return +} + +//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + err = prlimit(0, resource, rlim, nil) + if err != ENOSYS { + return err + } + + rl := rlimit32{} + if rlim.Cur == rlimInf64 { + rl.Cur = rlimInf32 + } else if rlim.Cur < uint64(rlimInf32) { + rl.Cur = uint32(rlim.Cur) + } else { + return EINVAL + } + if rlim.Max == rlimInf64 { + rl.Max = rlimInf32 + } else if rlim.Max < uint64(rlimInf32) { + rl.Max = uint32(rlim.Max) + } else { + return EINVAL + } + + return setrlimit(resource, &rl) +} + +func (r *PtraceRegs) PC() uint64 { return uint64(r.Uregs[15]) } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Uregs[15] = uint32(pc) } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} diff --git a/api/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go b/api/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go new file mode 100644 index 0000000..a1e8a60 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go @@ -0,0 +1,190 @@ +// Copyright 2015 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 arm64,linux + +package unix + +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) = SYS_EPOLL_PWAIT +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) +//sys Fstatfs(fd int, buf *Statfs_t) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (euid int) +//sysnb Getgid() (gid int) +//sysnb Getrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Getuid() (uid int) +//sys Listen(s int, n int) (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + var ts *Timespec + if timeout != nil { + ts = &Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000} + } + return Pselect(nfd, r, w, e, ts, nil) +} + +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) +//sys Setfsgid(gid int) (err error) +//sys Setfsuid(uid int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sys Shutdown(fd int, how int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) + +func Stat(path string, stat *Stat_t) (err error) { + return Fstatat(AT_FDCWD, path, stat, 0) +} + +func Lchown(path string, uid int, gid int) (err error) { + return Fchownat(AT_FDCWD, path, uid, gid, AT_SYMLINK_NOFOLLOW) +} + +func Lstat(path string, stat *Stat_t) (err error) { + return Fstatat(AT_FDCWD, path, stat, AT_SYMLINK_NOFOLLOW) +} + +//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) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) +//sysnb setgroups(n int, list *_Gid_t) (err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) + +//sysnb Gettimeofday(tv *Timeval) (err error) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: usec} +} + +func Time(t *Time_t) (Time_t, error) { + var tv Timeval + err := Gettimeofday(&tv) + if err != nil { + return 0, err + } + if t != nil { + *t = Time_t(tv.Sec) + } + return Time_t(tv.Sec), nil +} + +func Utime(path string, buf *Utimbuf) error { + tv := []Timeval{ + {Sec: buf.Actime}, + {Sec: buf.Modtime}, + } + return Utimes(path, tv) +} + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, 0) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +func (r *PtraceRegs) PC() uint64 { return r.Pc } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Pc = pc } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint64(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint64(length) +} + +func InotifyInit() (fd int, err error) { + return InotifyInit1(0) +} + +func Dup2(oldfd int, newfd int) (err error) { + return Dup3(oldfd, newfd, 0) +} + +func Pause() (err error) { + _, _, e1 := Syscall6(SYS_PPOLL, 0, 0, 0, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// TODO(dfc): constants that should be in zsysnum_linux_arm64.go, remove +// these when the deprecated syscalls that the syscall package relies on +// are removed. +const ( + SYS_GETPGRP = 1060 + SYS_UTIMES = 1037 + SYS_FUTIMESAT = 1066 + SYS_PAUSE = 1061 + SYS_USTAT = 1070 + SYS_UTIME = 1063 + SYS_LCHOWN = 1032 + SYS_TIME = 1062 + SYS_EPOLL_CREATE = 1042 + SYS_EPOLL_WAIT = 1069 +) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + var ts *Timespec + if timeout >= 0 { + ts = new(Timespec) + *ts = NsecToTimespec(int64(timeout) * 1e6) + } + if len(fds) == 0 { + return ppoll(nil, 0, ts, nil) + } + return ppoll(&fds[0], len(fds), ts, nil) +} diff --git a/api/vendor/golang.org/x/sys/unix/syscall_linux_gc.go b/api/vendor/golang.org/x/sys/unix/syscall_linux_gc.go new file mode 100644 index 0000000..c26e6ec --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_linux_gc.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. + +// +build linux,!gccgo + +package unix + +// SyscallNoError may be used instead of Syscall for syscalls that don't fail. +func SyscallNoError(trap, a1, a2, a3 uintptr) (r1, r2 uintptr) + +// RawSyscallNoError may be used instead of RawSyscall for syscalls that don't +// fail. +func RawSyscallNoError(trap, a1, a2, a3 uintptr) (r1, r2 uintptr) diff --git a/api/vendor/golang.org/x/sys/unix/syscall_linux_gccgo.go b/api/vendor/golang.org/x/sys/unix/syscall_linux_gccgo.go new file mode 100644 index 0000000..df9c123 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_linux_gccgo.go @@ -0,0 +1,21 @@ +// 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 linux +// +build gccgo +// +build 386 arm + +package unix + +import ( + "syscall" + "unsafe" +) + +func seek(fd int, offset int64, whence int) (newoffset int64, err syscall.Errno) { + offsetLow := uint32(offset & 0xffffffff) + offsetHigh := uint32((offset >> 32) & 0xffffffff) + _, _, err = Syscall6(SYS__LLSEEK, uintptr(fd), uintptr(offsetHigh), uintptr(offsetLow), uintptr(unsafe.Pointer(&newoffset)), uintptr(whence), 0) + return newoffset, err +} diff --git a/api/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go b/api/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go new file mode 100644 index 0000000..090ed40 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go @@ -0,0 +1,210 @@ +// Copyright 2015 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 linux +// +build mips64 mips64le + +package unix + +//sys Dup2(oldfd int, newfd int) (err error) +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_NEWFSTATAT +//sys Fstatfs(fd int, buf *Statfs_t) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (euid int) +//sysnb Getgid() (gid int) +//sysnb Getrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Getuid() (uid int) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Listen(s int, n int) (err error) +//sys Pause() (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + var ts *Timespec + if timeout != nil { + ts = &Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000} + } + return Pselect(nfd, r, w, e, ts, nil) +} + +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) +//sys Setfsgid(gid int) (err error) +//sys Setfsuid(uid int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sys Shutdown(fd int, how int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) +//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) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) +//sysnb setgroups(n int, list *_Gid_t) (err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) + +//sysnb Gettimeofday(tv *Timeval) (err error) + +func Time(t *Time_t) (tt Time_t, err error) { + var tv Timeval + err = Gettimeofday(&tv) + if err != nil { + return 0, err + } + if t != nil { + *t = Time_t(tv.Sec) + } + return Time_t(tv.Sec), nil +} + +//sys Utime(path string, buf *Utimbuf) (err error) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: usec} +} + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, 0) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +func Ioperm(from int, num int, on int) (err error) { + return ENOSYS +} + +func Iopl(level int) (err error) { + return ENOSYS +} + +type stat_t struct { + Dev uint32 + Pad0 [3]int32 + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint32 + Pad1 [3]uint32 + Size int64 + Atime uint32 + Atime_nsec uint32 + Mtime uint32 + Mtime_nsec uint32 + Ctime uint32 + Ctime_nsec uint32 + Blksize uint32 + Pad2 uint32 + Blocks int64 +} + +//sys fstat(fd int, st *stat_t) (err error) +//sys lstat(path string, st *stat_t) (err error) +//sys stat(path string, st *stat_t) (err error) + +func Fstat(fd int, s *Stat_t) (err error) { + st := &stat_t{} + err = fstat(fd, st) + fillStat_t(s, st) + return +} + +func Lstat(path string, s *Stat_t) (err error) { + st := &stat_t{} + err = lstat(path, st) + fillStat_t(s, st) + return +} + +func Stat(path string, s *Stat_t) (err error) { + st := &stat_t{} + err = stat(path, st) + fillStat_t(s, st) + return +} + +func fillStat_t(s *Stat_t, st *stat_t) { + s.Dev = st.Dev + s.Ino = st.Ino + s.Mode = st.Mode + s.Nlink = st.Nlink + s.Uid = st.Uid + s.Gid = st.Gid + s.Rdev = st.Rdev + s.Size = st.Size + s.Atim = Timespec{int64(st.Atime), int64(st.Atime_nsec)} + s.Mtim = Timespec{int64(st.Mtime), int64(st.Mtime_nsec)} + s.Ctim = Timespec{int64(st.Ctime), int64(st.Ctime_nsec)} + s.Blksize = st.Blksize + s.Blocks = st.Blocks +} + +func (r *PtraceRegs) PC() uint64 { return r.Epc } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Epc = pc } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint64(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint64(length) +} + +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} diff --git a/api/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go b/api/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go new file mode 100644 index 0000000..9e16cc9 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go @@ -0,0 +1,232 @@ +// 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. + +// +build linux +// +build mips mipsle + +package unix + +import ( + "syscall" + "unsafe" +) + +func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) + +//sys Dup2(oldfd int, newfd int) (err error) +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64 +//sysnb Getegid() (egid int) +//sysnb Geteuid() (euid int) +//sysnb Getgid() (gid int) +//sysnb Getuid() (uid int) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Listen(s int, n int) (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64 +//sys Setfsgid(gid int) (err error) +//sys Setfsuid(uid int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) + +//sysnb Setreuid(ruid int, euid int) (err error) +//sys Shutdown(fd int, how int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) + +//sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) +//sys Truncate(path string, length int64) (err error) = SYS_TRUNCATE64 +//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) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) +//sysnb setgroups(n int, list *_Gid_t) (err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) + +//sysnb InotifyInit() (fd int, err error) +//sys Ioperm(from int, num int, on int) (err error) +//sys Iopl(level int) (err error) + +//sysnb Gettimeofday(tv *Timeval) (err error) +//sysnb Time(t *Time_t) (tt Time_t, err error) + +//sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 +//sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64 +//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64 +//sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64 + +//sys Utime(path string, buf *Utimbuf) (err error) +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) +//sys Pause() (err error) + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e := Syscall(SYS_FSTATFS64, uintptr(fd), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) + if e != 0 { + err = errnoErr(e) + } + return +} + +func Statfs(path string, buf *Statfs_t) (err error) { + p, err := BytePtrFromString(path) + if err != nil { + return err + } + _, _, e := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(p)), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) + if e != 0 { + err = errnoErr(e) + } + return +} + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + _, _, e := Syscall6(SYS__LLSEEK, uintptr(fd), uintptr(offset>>32), uintptr(offset), uintptr(unsafe.Pointer(&off)), uintptr(whence), 0) + if e != 0 { + err = errnoErr(e) + } + return +} + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: int32(sec), Nsec: int32(nsec)} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: int32(sec), Usec: int32(usec)} +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, 0) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sys mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + page := uintptr(offset / 4096) + if offset != int64(page)*4096 { + return 0, EINVAL + } + return mmap2(addr, length, prot, flags, fd, page) +} + +const rlimInf32 = ^uint32(0) +const rlimInf64 = ^uint64(0) + +type rlimit32 struct { + Cur uint32 + Max uint32 +} + +//sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_GETRLIMIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + err = prlimit(0, resource, nil, rlim) + if err != ENOSYS { + return err + } + + rl := rlimit32{} + err = getrlimit(resource, &rl) + if err != nil { + return + } + + if rl.Cur == rlimInf32 { + rlim.Cur = rlimInf64 + } else { + rlim.Cur = uint64(rl.Cur) + } + + if rl.Max == rlimInf32 { + rlim.Max = rlimInf64 + } else { + rlim.Max = uint64(rl.Max) + } + return +} + +//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + err = prlimit(0, resource, rlim, nil) + if err != ENOSYS { + return err + } + + rl := rlimit32{} + if rlim.Cur == rlimInf64 { + rl.Cur = rlimInf32 + } else if rlim.Cur < uint64(rlimInf32) { + rl.Cur = uint32(rlim.Cur) + } else { + return EINVAL + } + if rlim.Max == rlimInf64 { + rl.Max = rlimInf32 + } else if rlim.Max < uint64(rlimInf32) { + rl.Max = uint32(rlim.Max) + } else { + return EINVAL + } + + return setrlimit(resource, &rl) +} + +func (r *PtraceRegs) PC() uint64 { return r.Epc } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Epc = pc } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} diff --git a/api/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go b/api/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go new file mode 100644 index 0000000..6fb8733 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go @@ -0,0 +1,128 @@ +// 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. + +// +build linux +// +build ppc64 ppc64le + +package unix + +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) +//sys Dup2(oldfd int, newfd int) (err error) +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_NEWFSTATAT +//sys Fstatfs(fd int, buf *Statfs_t) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (euid int) +//sysnb Getgid() (gid int) +//sysnb Getrlimit(resource int, rlim *Rlimit) (err error) = SYS_UGETRLIMIT +//sysnb Getuid() (uid int) +//sysnb InotifyInit() (fd int, err error) +//sys Ioperm(from int, num int, on int) (err error) +//sys Iopl(level int) (err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Listen(s int, n int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Pause() (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK +//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) +//sys Setfsgid(gid int) (err error) +//sys Setfsuid(uid int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sys Shutdown(fd int, how int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) +//sys Stat(path string, stat *Stat_t) (err error) +//sys Statfs(path string, buf *Statfs_t) (err error) +//sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) = SYS_SYNC_FILE_RANGE2 +//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) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) +//sysnb setgroups(n int, list *_Gid_t) (err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) + +//sysnb Gettimeofday(tv *Timeval) (err error) +//sysnb Time(t *Time_t) (tt Time_t, err error) + +//sys Utime(path string, buf *Utimbuf) (err error) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: usec} +} + +func (r *PtraceRegs) PC() uint64 { return r.Nip } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Nip = pc } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint64(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint64(length) +} + +//sysnb pipe(p *[2]_C_int) (err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe(&pp) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} diff --git a/api/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go b/api/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go new file mode 100644 index 0000000..c0d86e7 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go @@ -0,0 +1,320 @@ +// 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. + +// +build s390x,linux + +package unix + +import ( + "unsafe" +) + +//sys Dup2(oldfd int, newfd int) (err error) +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_NEWFSTATAT +//sys Fstatfs(fd int, buf *Statfs_t) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (euid int) +//sysnb Getgid() (gid int) +//sysnb Getrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Getuid() (uid int) +//sysnb InotifyInit() (fd int, err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Pause() (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK +//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) +//sys Setfsgid(gid int) (err error) +//sys Setfsuid(uid int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) +//sys Stat(path string, stat *Stat_t) (err error) +//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) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) +//sysnb setgroups(n int, list *_Gid_t) (err error) + +//sysnb Gettimeofday(tv *Timeval) (err error) + +func Time(t *Time_t) (tt Time_t, err error) { + var tv Timeval + err = Gettimeofday(&tv) + if err != nil { + return 0, err + } + if t != nil { + *t = Time_t(tv.Sec) + } + return Time_t(tv.Sec), nil +} + +//sys Utime(path string, buf *Utimbuf) (err error) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: usec} +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, 0) // pipe2 is the same as pipe when flags are set to 0. + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +func Ioperm(from int, num int, on int) (err error) { + return ENOSYS +} + +func Iopl(level int) (err error) { + return ENOSYS +} + +func (r *PtraceRegs) PC() uint64 { return r.Psw.Addr } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Psw.Addr = pc } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint64(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint64(length) +} + +// Linux on s390x uses the old mmap interface, which requires arguments to be passed in a struct. +// mmap2 also requires arguments to be passed in a struct; it is currently not exposed in . +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + mmap_args := [6]uintptr{addr, length, uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)} + r0, _, e1 := Syscall(SYS_MMAP, uintptr(unsafe.Pointer(&mmap_args[0])), 0, 0) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// On s390x Linux, all the socket calls go through an extra indirection. +// The arguments to the underlying system call (SYS_SOCKETCALL) are the +// number below and a pointer to an array of uintptr. +const ( + // see linux/net.h + netSocket = 1 + netBind = 2 + netConnect = 3 + netListen = 4 + netAccept = 5 + netGetSockName = 6 + netGetPeerName = 7 + netSocketPair = 8 + netSend = 9 + netRecv = 10 + netSendTo = 11 + netRecvFrom = 12 + netShutdown = 13 + netSetSockOpt = 14 + netGetSockOpt = 15 + netSendMsg = 16 + netRecvMsg = 17 + netAccept4 = 18 + netRecvMMsg = 19 + 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) + if err != 0 { + return 0, err + } + return int(fd), nil +} + +func getsockname(s int, rsa *RawSockaddrAny, addrlen *_Socklen) error { + args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))} + _, _, err := RawSyscall(SYS_SOCKETCALL, netGetSockName, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func getpeername(s int, rsa *RawSockaddrAny, addrlen *_Socklen) error { + args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))} + _, _, err := RawSyscall(SYS_SOCKETCALL, netGetPeerName, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func socketpair(domain int, typ int, flags int, fd *[2]int32) error { + args := [4]uintptr{uintptr(domain), uintptr(typ), uintptr(flags), uintptr(unsafe.Pointer(fd))} + _, _, err := RawSyscall(SYS_SOCKETCALL, netSocketPair, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) error { + args := [3]uintptr{uintptr(s), uintptr(addr), uintptr(addrlen)} + _, _, err := Syscall(SYS_SOCKETCALL, netBind, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) error { + args := [3]uintptr{uintptr(s), uintptr(addr), uintptr(addrlen)} + _, _, err := Syscall(SYS_SOCKETCALL, netConnect, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func socket(domain int, typ int, proto int) (int, error) { + args := [3]uintptr{uintptr(domain), uintptr(typ), uintptr(proto)} + fd, _, err := RawSyscall(SYS_SOCKETCALL, netSocket, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return 0, err + } + return int(fd), nil +} + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) error { + args := [5]uintptr{uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen))} + _, _, err := Syscall(SYS_SOCKETCALL, netGetSockOpt, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) error { + args := [4]uintptr{uintptr(s), uintptr(level), uintptr(name), uintptr(val)} + _, _, err := Syscall(SYS_SOCKETCALL, netSetSockOpt, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func recvfrom(s int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (int, error) { + var base uintptr + if len(p) > 0 { + base = uintptr(unsafe.Pointer(&p[0])) + } + args := [6]uintptr{uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))} + n, _, err := Syscall(SYS_SOCKETCALL, netRecvFrom, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return 0, err + } + return int(n), nil +} + +func sendto(s int, p []byte, flags int, to unsafe.Pointer, addrlen _Socklen) error { + var base uintptr + if len(p) > 0 { + base = uintptr(unsafe.Pointer(&p[0])) + } + args := [6]uintptr{uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(to), uintptr(addrlen)} + _, _, err := Syscall(SYS_SOCKETCALL, netSendTo, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func recvmsg(s int, msg *Msghdr, flags int) (int, error) { + args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)} + n, _, err := Syscall(SYS_SOCKETCALL, netRecvMsg, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return 0, err + } + return int(n), nil +} + +func sendmsg(s int, msg *Msghdr, flags int) (int, error) { + args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)} + n, _, err := Syscall(SYS_SOCKETCALL, netSendMsg, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return 0, err + } + return int(n), nil +} + +func Listen(s int, n int) error { + args := [2]uintptr{uintptr(s), uintptr(n)} + _, _, err := Syscall(SYS_SOCKETCALL, netListen, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func Shutdown(s, how int) error { + args := [2]uintptr{uintptr(s), uintptr(how)} + _, _, err := Syscall(SYS_SOCKETCALL, netShutdown, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} diff --git a/api/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go b/api/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go new file mode 100644 index 0000000..78c1e0d --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go @@ -0,0 +1,144 @@ +// 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. + +// +build sparc64,linux + +package unix + +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 +//sys Dup2(oldfd int, newfd int) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64 +//sys Fstatfs(fd int, buf *Statfs_t) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (euid int) +//sysnb Getgid() (gid int) +//sysnb Getrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Getuid() (uid int) +//sysnb InotifyInit() (fd int, err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Listen(s int, n int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Pause() (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK +//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) +//sys Setfsgid(gid int) (err error) +//sys Setfsuid(uid int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sys Shutdown(fd int, how int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) +//sys Stat(path string, stat *Stat_t) (err error) +//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) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) +//sysnb setgroups(n int, list *_Gid_t) (err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) + +func Ioperm(from int, num int, on int) (err error) { + return ENOSYS +} + +func Iopl(level int) (err error) { + return ENOSYS +} + +//sysnb Gettimeofday(tv *Timeval) (err error) + +func Time(t *Time_t) (tt Time_t, err error) { + var tv Timeval + err = Gettimeofday(&tv) + if err != nil { + return 0, err + } + if t != nil { + *t = Time_t(tv.Sec) + } + return Time_t(tv.Sec), nil +} + +//sys Utime(path string, buf *Utimbuf) (err error) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: int32(usec)} +} + +func (r *PtraceRegs) PC() uint64 { return r.Tpc } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Tpc = pc } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint64(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint64(length) +} + +//sysnb pipe(p *[2]_C_int) (err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe(&pp) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} diff --git a/api/vendor/golang.org/x/sys/unix/syscall_linux_test.go b/api/vendor/golang.org/x/sys/unix/syscall_linux_test.go new file mode 100644 index 0000000..7fd5e2a --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_linux_test.go @@ -0,0 +1,386 @@ +// 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. + +// +build linux + +package unix_test + +import ( + "os" + "runtime" + "runtime/debug" + "testing" + "time" + + "golang.org/x/sys/unix" +) + +func TestIoctlGetInt(t *testing.T) { + f, err := os.Open("/dev/random") + if err != nil { + t.Fatalf("failed to open device: %v", err) + } + defer f.Close() + + v, err := unix.IoctlGetInt(int(f.Fd()), unix.RNDGETENTCNT) + if err != nil { + t.Fatalf("failed to perform ioctl: %v", err) + } + + t.Logf("%d bits of entropy available", v) +} + +func TestPpoll(t *testing.T) { + if runtime.GOOS == "android" { + t.Skip("mkfifo syscall is not available on android, skipping test") + } + + f, cleanup := mktmpfifo(t) + defer cleanup() + + const timeout = 100 * time.Millisecond + + ok := make(chan bool, 1) + go func() { + select { + case <-time.After(10 * timeout): + t.Errorf("Ppoll: failed to timeout after %d", 10*timeout) + case <-ok: + } + }() + + fds := []unix.PollFd{{Fd: int32(f.Fd()), Events: unix.POLLIN}} + timeoutTs := unix.NsecToTimespec(int64(timeout)) + n, err := unix.Ppoll(fds, &timeoutTs, nil) + ok <- true + if err != nil { + t.Errorf("Ppoll: unexpected error: %v", err) + return + } + if n != 0 { + t.Errorf("Ppoll: wrong number of events: got %v, expected %v", n, 0) + return + } +} + +func TestTime(t *testing.T) { + var ut unix.Time_t + ut2, err := unix.Time(&ut) + if err != nil { + t.Fatalf("Time: %v", err) + } + if ut != ut2 { + t.Errorf("Time: return value %v should be equal to argument %v", ut2, ut) + } + + var now time.Time + + for i := 0; i < 10; i++ { + ut, err = unix.Time(nil) + if err != nil { + t.Fatalf("Time: %v", err) + } + + now = time.Now() + + if int64(ut) == now.Unix() { + return + } + } + + t.Errorf("Time: return value %v should be nearly equal to time.Now().Unix() %v", ut, now.Unix()) +} + +func TestUtime(t *testing.T) { + defer chtmpdir(t)() + + touch(t, "file1") + + buf := &unix.Utimbuf{ + Modtime: 12345, + } + + err := unix.Utime("file1", buf) + if err != nil { + t.Fatalf("Utime: %v", err) + } + + fi, err := os.Stat("file1") + if err != nil { + t.Fatal(err) + } + + if fi.ModTime().Unix() != 12345 { + t.Errorf("Utime: failed to change modtime: expected %v, got %v", 12345, fi.ModTime().Unix()) + } +} + +func TestUtimesNanoAt(t *testing.T) { + defer chtmpdir(t)() + + symlink := "symlink1" + os.Remove(symlink) + err := os.Symlink("nonexisting", symlink) + if err != nil { + t.Fatal(err) + } + + ts := []unix.Timespec{ + {Sec: 1111, Nsec: 2222}, + {Sec: 3333, Nsec: 4444}, + } + err = unix.UtimesNanoAt(unix.AT_FDCWD, symlink, ts, unix.AT_SYMLINK_NOFOLLOW) + if err != nil { + t.Fatalf("UtimesNanoAt: %v", err) + } + + var st unix.Stat_t + err = unix.Lstat(symlink, &st) + if err != nil { + t.Fatalf("Lstat: %v", err) + } + if st.Atim != ts[0] { + t.Errorf("UtimesNanoAt: wrong atime: %v", st.Atim) + } + if st.Mtim != ts[1] { + t.Errorf("UtimesNanoAt: wrong mtime: %v", st.Mtim) + } +} + +func TestRlimitAs(t *testing.T) { + // disable GC during to avoid flaky test + defer debug.SetGCPercent(debug.SetGCPercent(-1)) + + var rlim unix.Rlimit + err := unix.Getrlimit(unix.RLIMIT_AS, &rlim) + if err != nil { + t.Fatalf("Getrlimit: %v", err) + } + var zero unix.Rlimit + if zero == rlim { + t.Fatalf("Getrlimit: got zero value %#v", rlim) + } + set := rlim + set.Cur = uint64(unix.Getpagesize()) + err = unix.Setrlimit(unix.RLIMIT_AS, &set) + if err != nil { + t.Fatalf("Setrlimit: set failed: %#v %v", set, err) + } + + // RLIMIT_AS was set to the page size, so mmap()'ing twice the page size + // should fail. See 'man 2 getrlimit'. + _, err = unix.Mmap(-1, 0, 2*unix.Getpagesize(), unix.PROT_NONE, unix.MAP_ANON|unix.MAP_PRIVATE) + if err == nil { + t.Fatal("Mmap: unexpectedly suceeded after setting RLIMIT_AS") + } + + err = unix.Setrlimit(unix.RLIMIT_AS, &rlim) + if err != nil { + t.Fatalf("Setrlimit: restore failed: %#v %v", rlim, err) + } + + b, err := unix.Mmap(-1, 0, 2*unix.Getpagesize(), unix.PROT_NONE, unix.MAP_ANON|unix.MAP_PRIVATE) + if err != nil { + t.Fatalf("Mmap: %v", err) + } + err = unix.Munmap(b) + if err != nil { + t.Fatalf("Munmap: %v", err) + } +} + +func TestSelect(t *testing.T) { + _, err := unix.Select(0, nil, nil, nil, &unix.Timeval{Sec: 0, Usec: 0}) + if err != nil { + t.Fatalf("Select: %v", err) + } + + dur := 150 * time.Millisecond + tv := unix.NsecToTimeval(int64(dur)) + start := time.Now() + _, err = unix.Select(0, nil, nil, nil, &tv) + took := time.Since(start) + if err != nil { + t.Fatalf("Select: %v", err) + } + + if took < dur { + t.Errorf("Select: timeout should have been at least %v, got %v", dur, took) + } +} + +func TestPselect(t *testing.T) { + _, err := unix.Pselect(0, nil, nil, nil, &unix.Timespec{Sec: 0, Nsec: 0}, nil) + if err != nil { + t.Fatalf("Pselect: %v", err) + } + + dur := 2500 * time.Microsecond + ts := unix.NsecToTimespec(int64(dur)) + start := time.Now() + _, err = unix.Pselect(0, nil, nil, nil, &ts, nil) + took := time.Since(start) + if err != nil { + t.Fatalf("Pselect: %v", err) + } + + if took < dur { + t.Errorf("Pselect: timeout should have been at least %v, got %v", dur, took) + } +} + +func TestSchedSetaffinity(t *testing.T) { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + var oldMask unix.CPUSet + err := unix.SchedGetaffinity(0, &oldMask) + if err != nil { + t.Fatalf("SchedGetaffinity: %v", err) + } + + var newMask unix.CPUSet + newMask.Zero() + if newMask.Count() != 0 { + t.Errorf("CpuZero: didn't zero CPU set: %v", newMask) + } + cpu := 1 + newMask.Set(cpu) + if newMask.Count() != 1 || !newMask.IsSet(cpu) { + t.Errorf("CpuSet: didn't set CPU %d in set: %v", cpu, newMask) + } + cpu = 5 + newMask.Set(cpu) + if newMask.Count() != 2 || !newMask.IsSet(cpu) { + t.Errorf("CpuSet: didn't set CPU %d in set: %v", cpu, newMask) + } + newMask.Clear(cpu) + if newMask.Count() != 1 || newMask.IsSet(cpu) { + t.Errorf("CpuClr: didn't clear CPU %d in set: %v", cpu, newMask) + } + + if runtime.NumCPU() < 2 { + t.Skip("skipping setaffinity tests on single CPU system") + } + if runtime.GOOS == "android" { + t.Skip("skipping setaffinity tests on android") + } + + err = unix.SchedSetaffinity(0, &newMask) + if err != nil { + t.Fatalf("SchedSetaffinity: %v", err) + } + + var gotMask unix.CPUSet + err = unix.SchedGetaffinity(0, &gotMask) + if err != nil { + t.Fatalf("SchedGetaffinity: %v", err) + } + + if gotMask != newMask { + t.Errorf("SchedSetaffinity: returned affinity mask does not match set affinity mask") + } + + // Restore old mask so it doesn't affect successive tests + err = unix.SchedSetaffinity(0, &oldMask) + if err != nil { + t.Fatalf("SchedSetaffinity: %v", err) + } +} + +func TestStatx(t *testing.T) { + var stx unix.Statx_t + err := unix.Statx(unix.AT_FDCWD, ".", 0, 0, &stx) + if err == unix.ENOSYS || err == unix.EPERM { + t.Skip("statx syscall is not available, skipping test") + } else if err != nil { + t.Fatalf("Statx: %v", err) + } + + defer chtmpdir(t)() + touch(t, "file1") + + var st unix.Stat_t + err = unix.Stat("file1", &st) + if err != nil { + t.Fatalf("Stat: %v", err) + } + + flags := unix.AT_STATX_SYNC_AS_STAT + err = unix.Statx(unix.AT_FDCWD, "file1", flags, unix.STATX_ALL, &stx) + if err != nil { + t.Fatalf("Statx: %v", err) + } + + if uint32(stx.Mode) != st.Mode { + t.Errorf("Statx: returned stat mode does not match Stat") + } + + ctime := unix.StatxTimestamp{Sec: int64(st.Ctim.Sec), Nsec: uint32(st.Ctim.Nsec)} + mtime := unix.StatxTimestamp{Sec: int64(st.Mtim.Sec), Nsec: uint32(st.Mtim.Nsec)} + + if stx.Ctime != ctime { + t.Errorf("Statx: returned stat ctime does not match Stat") + } + if stx.Mtime != mtime { + t.Errorf("Statx: returned stat mtime does not match Stat") + } + + err = os.Symlink("file1", "symlink1") + if err != nil { + t.Fatal(err) + } + + err = unix.Lstat("symlink1", &st) + if err != nil { + t.Fatalf("Lstat: %v", err) + } + + err = unix.Statx(unix.AT_FDCWD, "symlink1", flags, unix.STATX_BASIC_STATS, &stx) + if err != nil { + t.Fatalf("Statx: %v", err) + } + + // follow symlink, expect a regulat file + if stx.Mode&unix.S_IFREG == 0 { + t.Errorf("Statx: didn't follow symlink") + } + + err = unix.Statx(unix.AT_FDCWD, "symlink1", flags|unix.AT_SYMLINK_NOFOLLOW, unix.STATX_ALL, &stx) + if err != nil { + t.Fatalf("Statx: %v", err) + } + + // follow symlink, expect a symlink + if stx.Mode&unix.S_IFLNK == 0 { + t.Errorf("Statx: unexpectedly followed symlink") + } + if uint32(stx.Mode) != st.Mode { + t.Errorf("Statx: returned stat mode does not match Lstat") + } + + ctime = unix.StatxTimestamp{Sec: int64(st.Ctim.Sec), Nsec: uint32(st.Ctim.Nsec)} + mtime = unix.StatxTimestamp{Sec: int64(st.Mtim.Sec), Nsec: uint32(st.Mtim.Nsec)} + + if stx.Ctime != ctime { + t.Errorf("Statx: returned stat ctime does not match Lstat") + } + if stx.Mtime != mtime { + t.Errorf("Statx: returned stat mtime does not match Lstat") + } +} + +// stringsFromByteSlice converts a sequence of attributes to a []string. +// On Linux, each entry is a NULL-terminated string. +func stringsFromByteSlice(buf []byte) []string { + var result []string + off := 0 + for i, b := range buf { + if b == 0 { + result = append(result, string(buf[off:i])) + off = i + 1 + } + } + return result +} diff --git a/api/vendor/golang.org/x/sys/unix/syscall_netbsd.go b/api/vendor/golang.org/x/sys/unix/syscall_netbsd.go new file mode 100644 index 0000000..e1a3baa --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_netbsd.go @@ -0,0 +1,567 @@ +// Copyright 2009,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. + +// NetBSD system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and wrap +// it in our own nicer implementation, either here or in +// syscall_bsd.go or syscall_unix.go. + +package unix + +import ( + "syscall" + "unsafe" +) + +// SockaddrDatalink implements the Sockaddr interface for AF_LINK type sockets. +type SockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 + raw RawSockaddrDatalink +} + +func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) + +func sysctlNodes(mib []_C_int) (nodes []Sysctlnode, err 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) (mib []_C_int, err 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:]) + + // 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, _C_int(node.Num)) + break + } + } + if len(mib) != partno+1 { + return nil, EINVAL + } + } + + return mib, nil +} + +//sysnb pipe() (fd1 int, fd2 int, err error) +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + p[0], p[1], err = pipe() + return +} + +//sys getdents(fd int, buf []byte) (n int, err error) +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + return getdents(fd, buf) +} + +const ImplementsGetwd = true + +//sys Getcwd(buf []byte) (n int, err error) = SYS___GETCWD + +func Getwd() (string, error) { + var buf [PathMax]byte + _, err := Getcwd(buf[0:]) + if err != nil { + return "", err + } + n := clen(buf[:]) + if n < 1 { + return "", EINVAL + } + return string(buf[:n]), nil +} + +// TODO +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + return -1, ENOSYS +} + +func setattrlistTimes(path string, times []Timespec, flags int) error { + // used on Darwin for UtimesNano + return ENOSYS +} + +//sys ioctl(fd int, req uint, arg uintptr) (err error) + +// ioctl itself should not be exposed directly, but additional get/set +// functions for specific types are permissible. + +// IoctlSetInt performs an ioctl operation which sets an integer value +// on fd, using the specified request number. +func IoctlSetInt(fd int, req uint, value int) error { + return ioctl(fd, req, uintptr(value)) +} + +func IoctlSetWinsize(fd int, req uint, value *Winsize) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlSetTermios(fd int, req uint, value *Termios) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +// IoctlGetInt performs an ioctl operation which gets an integer value +// from fd, using the specified request number. +func IoctlGetInt(fd int, req uint) (int, error) { + var value int + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return value, err +} + +func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { + var value Winsize + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermios(fd int, req uint) (*Termios, error) { + var value Termios + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func Uname(uname *Utsname) error { + mib := []_C_int{CTL_KERN, KERN_OSTYPE} + n := unsafe.Sizeof(uname.Sysname) + if err := sysctl(mib, &uname.Sysname[0], &n, nil, 0); err != nil { + return err + } + + mib = []_C_int{CTL_KERN, KERN_HOSTNAME} + n = unsafe.Sizeof(uname.Nodename) + if err := sysctl(mib, &uname.Nodename[0], &n, nil, 0); err != nil { + return err + } + + mib = []_C_int{CTL_KERN, KERN_OSRELEASE} + n = unsafe.Sizeof(uname.Release) + if err := sysctl(mib, &uname.Release[0], &n, nil, 0); err != nil { + return err + } + + mib = []_C_int{CTL_KERN, KERN_VERSION} + n = unsafe.Sizeof(uname.Version) + if err := sysctl(mib, &uname.Version[0], &n, nil, 0); err != nil { + return err + } + + // The version might have newlines or tabs in it, convert them to + // spaces. + for i, b := range uname.Version { + if b == '\n' || b == '\t' { + if i == len(uname.Version)-1 { + uname.Version[i] = 0 + } else { + uname.Version[i] = ' ' + } + } + } + + mib = []_C_int{CTL_HW, HW_MACHINE} + n = unsafe.Sizeof(uname.Machine) + if err := sysctl(mib, &uname.Machine[0], &n, nil, 0); err != nil { + return err + } + + return nil +} + +/* + * Exposed directly + */ +//sys Access(path string, mode uint32) (err error) +//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) +//sys Chdir(path string) (err error) +//sys Chflags(path string, flags int) (err error) +//sys Chmod(path string, mode uint32) (err error) +//sys Chown(path string, uid int, gid int) (err error) +//sys Chroot(path string) (err error) +//sys Close(fd int) (err error) +//sys Dup(fd int) (nfd int, err error) +//sys Dup2(from int, to int) (err error) +//sys Exit(code int) +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_POSIX_FADVISE +//sys Fchdir(fd int) (err error) +//sys Fchflags(fd int, flags int) (err error) +//sys Fchmod(fd int, mode uint32) (err error) +//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Flock(fd int, how int) (err error) +//sys Fpathconf(fd int, name int) (val int, err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) +//sys Fsync(fd int) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (uid int) +//sysnb Getgid() (gid int) +//sysnb Getpgid(pid int) (pgid int, err error) +//sysnb Getpgrp() (pgrp int) +//sysnb Getpid() (pid int) +//sysnb Getppid() (ppid int) +//sys Getpriority(which int, who int) (prio int, err error) +//sysnb Getrlimit(which int, lim *Rlimit) (err error) +//sysnb Getrusage(who int, rusage *Rusage) (err error) +//sysnb Getsid(pid int) (sid int, err error) +//sysnb Gettimeofday(tv *Timeval) (err error) +//sysnb Getuid() (uid int) +//sys Issetugid() (tainted bool) +//sys Kill(pid int, signum syscall.Signal) (err error) +//sys Kqueue() (fd int, err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Link(path string, link string) (err error) +//sys Listen(s int, backlog int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Mkdir(path string, mode uint32) (err error) +//sys Mkfifo(path string, mode uint32) (err error) +//sys Mknod(path string, mode uint32, dev int) (err error) +//sys Nanosleep(time *Timespec, leftover *Timespec) (err error) +//sys Open(path string, mode int, perm uint32) (fd int, err error) +//sys Pathconf(path string, name int) (val int, err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys read(fd int, p []byte) (n int, err error) +//sys Readlink(path string, buf []byte) (n int, err error) +//sys Rename(from string, to string) (err error) +//sys Revoke(path string) (err error) +//sys Rmdir(path string) (err error) +//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK +//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) +//sysnb Setegid(egid int) (err error) +//sysnb Seteuid(euid int) (err error) +//sysnb Setgid(gid int) (err error) +//sysnb Setpgid(pid int, pgid int) (err error) +//sys Setpriority(which int, who int, prio int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sysnb Setrlimit(which int, lim *Rlimit) (err error) +//sysnb Setsid() (pid int, err error) +//sysnb Settimeofday(tp *Timeval) (err error) +//sysnb Setuid(uid int) (err error) +//sys Stat(path string, stat *Stat_t) (err error) +//sys Symlink(path string, link string) (err error) +//sys Sync() (err error) +//sys Truncate(path string, length int64) (err error) +//sys Umask(newmask int) (oldmask int) +//sys Unlink(path string) (err error) +//sys Unmount(path string, flags int) (err error) +//sys write(fd int, p []byte) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) +//sys munmap(addr uintptr, length uintptr) (err error) +//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ +//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE +//sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) + +/* + * Unimplemented + */ +// ____semctl13 +// __clone +// __fhopen40 +// __fhstat40 +// __fhstatvfs140 +// __fstat30 +// __getcwd +// __getfh30 +// __getlogin +// __lstat30 +// __mount50 +// __msgctl13 +// __msync13 +// __ntp_gettime30 +// __posix_chown +// __posix_fchown +// __posix_lchown +// __posix_rename +// __setlogin +// __shmctl13 +// __sigaction_sigtramp +// __sigaltstack14 +// __sigpending14 +// __sigprocmask14 +// __sigsuspend14 +// __sigtimedwait +// __stat30 +// __syscall +// __vfork14 +// _ksem_close +// _ksem_destroy +// _ksem_getvalue +// _ksem_init +// _ksem_open +// _ksem_post +// _ksem_trywait +// _ksem_unlink +// _ksem_wait +// _lwp_continue +// _lwp_create +// _lwp_ctl +// _lwp_detach +// _lwp_exit +// _lwp_getname +// _lwp_getprivate +// _lwp_kill +// _lwp_park +// _lwp_self +// _lwp_setname +// _lwp_setprivate +// _lwp_suspend +// _lwp_unpark +// _lwp_unpark_all +// _lwp_wait +// _lwp_wakeup +// _pset_bind +// _sched_getaffinity +// _sched_getparam +// _sched_setaffinity +// _sched_setparam +// acct +// aio_cancel +// aio_error +// aio_fsync +// aio_read +// aio_return +// aio_suspend +// aio_write +// break +// clock_getres +// clock_gettime +// clock_settime +// compat_09_ogetdomainname +// compat_09_osetdomainname +// compat_09_ouname +// compat_10_omsgsys +// compat_10_osemsys +// compat_10_oshmsys +// compat_12_fstat12 +// compat_12_getdirentries +// compat_12_lstat12 +// compat_12_msync +// compat_12_oreboot +// compat_12_oswapon +// compat_12_stat12 +// compat_13_sigaction13 +// compat_13_sigaltstack13 +// compat_13_sigpending13 +// compat_13_sigprocmask13 +// compat_13_sigreturn13 +// compat_13_sigsuspend13 +// compat_14___semctl +// compat_14_msgctl +// compat_14_shmctl +// compat_16___sigaction14 +// compat_16___sigreturn14 +// compat_20_fhstatfs +// compat_20_fstatfs +// compat_20_getfsstat +// compat_20_statfs +// compat_30___fhstat30 +// compat_30___fstat13 +// compat_30___lstat13 +// compat_30___stat13 +// compat_30_fhopen +// compat_30_fhstat +// compat_30_fhstatvfs1 +// compat_30_getdents +// compat_30_getfh +// compat_30_ntp_gettime +// compat_30_socket +// compat_40_mount +// compat_43_fstat43 +// compat_43_lstat43 +// compat_43_oaccept +// compat_43_ocreat +// compat_43_oftruncate +// compat_43_ogetdirentries +// compat_43_ogetdtablesize +// compat_43_ogethostid +// compat_43_ogethostname +// compat_43_ogetkerninfo +// compat_43_ogetpagesize +// compat_43_ogetpeername +// compat_43_ogetrlimit +// compat_43_ogetsockname +// compat_43_okillpg +// compat_43_olseek +// compat_43_ommap +// compat_43_oquota +// compat_43_orecv +// compat_43_orecvfrom +// compat_43_orecvmsg +// compat_43_osend +// compat_43_osendmsg +// compat_43_osethostid +// compat_43_osethostname +// compat_43_osetrlimit +// compat_43_osigblock +// compat_43_osigsetmask +// compat_43_osigstack +// compat_43_osigvec +// compat_43_otruncate +// compat_43_owait +// compat_43_stat43 +// execve +// extattr_delete_fd +// extattr_delete_file +// extattr_delete_link +// extattr_get_fd +// extattr_get_file +// extattr_get_link +// extattr_list_fd +// extattr_list_file +// extattr_list_link +// extattr_set_fd +// extattr_set_file +// extattr_set_link +// extattrctl +// fchroot +// fdatasync +// fgetxattr +// fktrace +// flistxattr +// fork +// fremovexattr +// fsetxattr +// fstatvfs1 +// fsync_range +// getcontext +// getitimer +// getvfsstat +// getxattr +// ktrace +// lchflags +// lchmod +// lfs_bmapv +// lfs_markv +// lfs_segclean +// lfs_segwait +// lgetxattr +// lio_listio +// listxattr +// llistxattr +// lremovexattr +// lseek +// lsetxattr +// lutimes +// madvise +// mincore +// minherit +// modctl +// mq_close +// mq_getattr +// mq_notify +// mq_open +// mq_receive +// mq_send +// mq_setattr +// mq_timedreceive +// mq_timedsend +// mq_unlink +// mremap +// msgget +// msgrcv +// msgsnd +// nfssvc +// ntp_adjtime +// pmc_control +// pmc_get_info +// pollts +// preadv +// profil +// pselect +// pset_assign +// pset_create +// pset_destroy +// ptrace +// pwritev +// quotactl +// rasctl +// readv +// reboot +// removexattr +// sa_enable +// sa_preempt +// sa_register +// sa_setconcurrency +// sa_stacks +// sa_yield +// sbrk +// sched_yield +// semconfig +// semget +// semop +// setcontext +// setitimer +// setxattr +// shmat +// shmdt +// shmget +// sstk +// statvfs1 +// swapctl +// sysarch +// syscall +// timer_create +// timer_delete +// timer_getoverrun +// timer_gettime +// timer_settime +// undelete +// utrace +// uuidgen +// vadvise +// vfork +// writev diff --git a/api/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go b/api/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go new file mode 100644 index 0000000..24f74e5 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go @@ -0,0 +1,33 @@ +// 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. + +// +build 386,netbsd + +package unix + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: int32(nsec)} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: int32(usec)} +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = uint32(mode) + k.Flags = uint32(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} diff --git a/api/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go b/api/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go new file mode 100644 index 0000000..6878bf7 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go @@ -0,0 +1,33 @@ +// 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. + +// +build amd64,netbsd + +package unix + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: int32(usec)} +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint64(fd) + k.Filter = uint32(mode) + k.Flags = uint32(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} diff --git a/api/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go b/api/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go new file mode 100644 index 0000000..dbbfcf7 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go @@ -0,0 +1,33 @@ +// 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. + +// +build arm,netbsd + +package unix + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: int32(nsec)} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: int32(usec)} +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = uint32(mode) + k.Flags = uint32(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} diff --git a/api/vendor/golang.org/x/sys/unix/syscall_openbsd.go b/api/vendor/golang.org/x/sys/unix/syscall_openbsd.go new file mode 100644 index 0000000..614fcf0 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_openbsd.go @@ -0,0 +1,367 @@ +// Copyright 2009,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. + +// OpenBSD system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and wrap +// it in our own nicer implementation, either here or in +// syscall_bsd.go or syscall_unix.go. + +package unix + +import ( + "sort" + "syscall" + "unsafe" +) + +// SockaddrDatalink implements the Sockaddr interface for AF_LINK type sockets. +type SockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [24]int8 + raw RawSockaddrDatalink +} + +func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) + +func nametomib(name string) (mib []_C_int, err error) { + i := sort.Search(len(sysctlMib), func(i int) bool { + return sysctlMib[i].ctlname >= name + }) + if i < len(sysctlMib) && sysctlMib[i].ctlname == name { + return sysctlMib[i].ctloid, nil + } + return nil, EINVAL +} + +//sysnb pipe(p *[2]_C_int) (err error) +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe(&pp) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sys getdents(fd int, buf []byte) (n int, err error) +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + return getdents(fd, buf) +} + +const ImplementsGetwd = true + +//sys Getcwd(buf []byte) (n int, err error) = SYS___GETCWD + +func Getwd() (string, error) { + var buf [PathMax]byte + _, err := Getcwd(buf[0:]) + if err != nil { + return "", err + } + n := clen(buf[:]) + if n < 1 { + return "", EINVAL + } + return string(buf[:n]), nil +} + +// TODO +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + return -1, ENOSYS +} + +func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { + var _p0 unsafe.Pointer + var bufsize uintptr + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf)) + } + r0, _, e1 := Syscall(SYS_GETFSSTAT, uintptr(_p0), bufsize, uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func setattrlistTimes(path string, times []Timespec, flags int) error { + // used on Darwin for UtimesNano + return ENOSYS +} + +//sys ioctl(fd int, req uint, arg uintptr) (err error) + +// ioctl itself should not be exposed directly, but additional get/set +// functions for specific types are permissible. + +// IoctlSetInt performs an ioctl operation which sets an integer value +// on fd, using the specified request number. +func IoctlSetInt(fd int, req uint, value int) error { + return ioctl(fd, req, uintptr(value)) +} + +func IoctlSetWinsize(fd int, req uint, value *Winsize) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlSetTermios(fd int, req uint, value *Termios) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +// IoctlGetInt performs an ioctl operation which gets an integer value +// from fd, using the specified request number. +func IoctlGetInt(fd int, req uint) (int, error) { + var value int + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return value, err +} + +func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { + var value Winsize + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermios(fd int, req uint) (*Termios, error) { + var value Termios + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func Uname(uname *Utsname) error { + mib := []_C_int{CTL_KERN, KERN_OSTYPE} + n := unsafe.Sizeof(uname.Sysname) + if err := sysctl(mib, &uname.Sysname[0], &n, nil, 0); err != nil { + return err + } + + mib = []_C_int{CTL_KERN, KERN_HOSTNAME} + n = unsafe.Sizeof(uname.Nodename) + if err := sysctl(mib, &uname.Nodename[0], &n, nil, 0); err != nil { + return err + } + + mib = []_C_int{CTL_KERN, KERN_OSRELEASE} + n = unsafe.Sizeof(uname.Release) + if err := sysctl(mib, &uname.Release[0], &n, nil, 0); err != nil { + return err + } + + mib = []_C_int{CTL_KERN, KERN_VERSION} + n = unsafe.Sizeof(uname.Version) + if err := sysctl(mib, &uname.Version[0], &n, nil, 0); err != nil { + return err + } + + // The version might have newlines or tabs in it, convert them to + // spaces. + for i, b := range uname.Version { + if b == '\n' || b == '\t' { + if i == len(uname.Version)-1 { + uname.Version[i] = 0 + } else { + uname.Version[i] = ' ' + } + } + } + + mib = []_C_int{CTL_HW, HW_MACHINE} + n = unsafe.Sizeof(uname.Machine) + if err := sysctl(mib, &uname.Machine[0], &n, nil, 0); err != nil { + return err + } + + return nil +} + +/* + * Exposed directly + */ +//sys Access(path string, mode uint32) (err error) +//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) +//sys Chdir(path string) (err error) +//sys Chflags(path string, flags int) (err error) +//sys Chmod(path string, mode uint32) (err error) +//sys Chown(path string, uid int, gid int) (err error) +//sys Chroot(path string) (err error) +//sys Close(fd int) (err error) +//sys Dup(fd int) (nfd int, err error) +//sys Dup2(from int, to int) (err error) +//sys Exit(code int) +//sys Fchdir(fd int) (err error) +//sys Fchflags(fd int, flags int) (err error) +//sys Fchmod(fd int, mode uint32) (err error) +//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Flock(fd int, how int) (err error) +//sys Fpathconf(fd int, name int) (val int, err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) +//sys Fstatfs(fd int, stat *Statfs_t) (err error) +//sys Fsync(fd int) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (uid int) +//sysnb Getgid() (gid int) +//sysnb Getpgid(pid int) (pgid int, err error) +//sysnb Getpgrp() (pgrp int) +//sysnb Getpid() (pid int) +//sysnb Getppid() (ppid int) +//sys Getpriority(which int, who int) (prio int, err error) +//sysnb Getrlimit(which int, lim *Rlimit) (err error) +//sysnb Getrtable() (rtable int, err error) +//sysnb Getrusage(who int, rusage *Rusage) (err error) +//sysnb Getsid(pid int) (sid int, err error) +//sysnb Gettimeofday(tv *Timeval) (err error) +//sysnb Getuid() (uid int) +//sys Issetugid() (tainted bool) +//sys Kill(pid int, signum syscall.Signal) (err error) +//sys Kqueue() (fd int, err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Link(path string, link string) (err error) +//sys Listen(s int, backlog int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Mkdir(path string, mode uint32) (err error) +//sys Mkfifo(path string, mode uint32) (err error) +//sys Mknod(path string, mode uint32, dev int) (err error) +//sys Nanosleep(time *Timespec, leftover *Timespec) (err error) +//sys Open(path string, mode int, perm uint32) (fd int, err error) +//sys Pathconf(path string, name int) (val int, err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys read(fd int, p []byte) (n int, err error) +//sys Readlink(path string, buf []byte) (n int, err error) +//sys Rename(from string, to string) (err error) +//sys Revoke(path string) (err error) +//sys Rmdir(path string) (err error) +//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK +//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) +//sysnb Setegid(egid int) (err error) +//sysnb Seteuid(euid int) (err error) +//sysnb Setgid(gid int) (err error) +//sys Setlogin(name string) (err error) +//sysnb Setpgid(pid int, pgid int) (err error) +//sys Setpriority(which int, who int, prio int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(which int, lim *Rlimit) (err error) +//sysnb Setrtable(rtable int) (err error) +//sysnb Setsid() (pid int, err error) +//sysnb Settimeofday(tp *Timeval) (err error) +//sysnb Setuid(uid int) (err error) +//sys Stat(path string, stat *Stat_t) (err error) +//sys Statfs(path string, stat *Statfs_t) (err error) +//sys Symlink(path string, link string) (err error) +//sys Sync() (err error) +//sys Truncate(path string, length int64) (err error) +//sys Umask(newmask int) (oldmask int) +//sys Unlink(path string) (err error) +//sys Unmount(path string, flags int) (err error) +//sys write(fd int, p []byte) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) +//sys munmap(addr uintptr, length uintptr) (err error) +//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ +//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE +//sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) + +/* + * Unimplemented + */ +// __getcwd +// __semctl +// __syscall +// __sysctl +// adjfreq +// break +// clock_getres +// clock_gettime +// clock_settime +// closefrom +// execve +// faccessat +// fchmodat +// fchownat +// fcntl +// fhopen +// fhstat +// fhstatfs +// fork +// fstatat +// futimens +// getfh +// getgid +// getitimer +// getlogin +// getresgid +// getresuid +// getthrid +// ktrace +// lfs_bmapv +// lfs_markv +// lfs_segclean +// lfs_segwait +// linkat +// mincore +// minherit +// mkdirat +// mkfifoat +// mknodat +// mount +// mquery +// msgctl +// msgget +// msgrcv +// msgsnd +// nfssvc +// nnpfspioctl +// openat +// preadv +// profil +// pwritev +// quotactl +// readlinkat +// readv +// reboot +// renameat +// rfork +// sched_yield +// semget +// semop +// setgroups +// setitimer +// setsockopt +// shmat +// shmctl +// shmdt +// shmget +// sigaction +// sigaltstack +// sigpending +// sigprocmask +// sigreturn +// sigsuspend +// symlinkat +// sysarch +// syscall +// threxit +// thrsigdivert +// thrsleep +// thrwakeup +// unlinkat +// vfork +// writev diff --git a/api/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go b/api/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go new file mode 100644 index 0000000..994964a --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go @@ -0,0 +1,33 @@ +// 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. + +// +build 386,openbsd + +package unix + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: int32(nsec)} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: int32(usec)} +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} diff --git a/api/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go b/api/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go new file mode 100644 index 0000000..9a35334 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go @@ -0,0 +1,37 @@ +// 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. + +// +build amd64,openbsd + +package unix + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: usec} +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint64(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions +// of openbsd/amd64 the syscall is called sysctl instead of __sysctl. +const SYS___SYSCTL = SYS_SYSCTL diff --git a/api/vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go b/api/vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go new file mode 100644 index 0000000..59844f5 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go @@ -0,0 +1,33 @@ +// 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. + +// +build arm,openbsd + +package unix + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: int32(nsec)} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: int32(usec)} +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} diff --git a/api/vendor/golang.org/x/sys/unix/syscall_solaris.go b/api/vendor/golang.org/x/sys/unix/syscall_solaris.go new file mode 100644 index 0000000..b762952 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_solaris.go @@ -0,0 +1,725 @@ +// 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. + +// Solaris system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and wrap +// it in our own nicer implementation, either here or in +// syscall_solaris.go or syscall_unix.go. + +package unix + +import ( + "syscall" + "unsafe" +) + +// Implemented in runtime/syscall_solaris.go. +type syscallFunc uintptr + +func rawSysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) +func sysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) + +// SockaddrDatalink implements the Sockaddr interface for AF_LINK type sockets. +type SockaddrDatalink struct { + Family uint16 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [244]int8 + raw RawSockaddrDatalink +} + +//sysnb pipe(p *[2]_C_int) (n int, err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + n, err := pipe(&pp) + if n != 0 { + return err + } + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return nil +} + +func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, EINVAL + } + sa.raw.Family = AF_INET + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), SizeofSockaddrInet4, nil +} + +func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, EINVAL + } + sa.raw.Family = AF_INET6 + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + sa.raw.Scope_id = sa.ZoneId + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), SizeofSockaddrInet6, nil +} + +func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) { + name := sa.Name + n := len(name) + if n >= len(sa.raw.Path) { + return nil, 0, EINVAL + } + sa.raw.Family = AF_UNIX + for i := 0; i < n; i++ { + sa.raw.Path[i] = int8(name[i]) + } + // length is family (uint16), name, NUL. + sl := _Socklen(2) + if n > 0 { + sl += _Socklen(n) + 1 + } + if sa.raw.Path[0] == '@' { + sa.raw.Path[0] = 0 + // Don't count trailing NUL for abstract address. + sl-- + } + + return unsafe.Pointer(&sa.raw), sl, nil +} + +//sys getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) = libsocket.getsockname + +func Getsockname(fd int) (sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + if err = getsockname(fd, &rsa, &len); err != nil { + return + } + return anyToSockaddr(&rsa) +} + +// GetsockoptString returns the string value of the socket option opt for the +// socket associated with fd at the given socket level. +func GetsockoptString(fd, level, opt int) (string, error) { + buf := make([]byte, 256) + vallen := _Socklen(len(buf)) + err := getsockopt(fd, level, opt, unsafe.Pointer(&buf[0]), &vallen) + if err != nil { + return "", err + } + return string(buf[:vallen-1]), nil +} + +const ImplementsGetwd = true + +//sys Getcwd(buf []byte) (n int, err error) + +func Getwd() (wd string, err error) { + var buf [PathMax]byte + // Getcwd will return an error if it failed for any reason. + _, err = Getcwd(buf[0:]) + if err != nil { + return "", err + } + n := clen(buf[:]) + if n < 1 { + return "", EINVAL + } + return string(buf[:n]), nil +} + +/* + * Wrapped + */ + +//sysnb getgroups(ngid int, gid *_Gid_t) (n int, err error) +//sysnb setgroups(ngid int, gid *_Gid_t) (err error) + +func Getgroups() (gids []int, err error) { + n, err := getgroups(0, nil) + // Check for error and sanity check group count. Newer versions of + // Solaris allow up to 1024 (NGROUPS_MAX). + if n < 0 || n > 1024 { + if err != nil { + return nil, err + } + return nil, EINVAL + } else if n == 0 { + return nil, nil + } + + a := make([]_Gid_t, n) + n, err = getgroups(n, &a[0]) + if n == -1 { + return nil, err + } + gids = make([]int, n) + for i, v := range a[0:n] { + gids[i] = int(v) + } + return +} + +func Setgroups(gids []int) (err error) { + if len(gids) == 0 { + return setgroups(0, nil) + } + + a := make([]_Gid_t, len(gids)) + for i, v := range gids { + a[i] = _Gid_t(v) + } + return setgroups(len(a), &a[0]) +} + +func ReadDirent(fd int, buf []byte) (n int, err error) { + // Final argument is (basep *uintptr) and the syscall doesn't take nil. + // TODO(rsc): Can we use a single global basep for all calls? + return Getdents(fd, buf, new(uintptr)) +} + +// Wait status is 7 bits at bottom, either 0 (exited), +// 0x7F (stopped), or a signal number that caused an exit. +// The 0x80 bit is whether there was a core dump. +// An extra number (exit code, signal causing a stop) +// is in the high bits. + +type WaitStatus uint32 + +const ( + mask = 0x7F + core = 0x80 + shift = 8 + + exited = 0 + stopped = 0x7F +) + +func (w WaitStatus) Exited() bool { return w&mask == exited } + +func (w WaitStatus) ExitStatus() int { + if w&mask != exited { + return -1 + } + return int(w >> shift) +} + +func (w WaitStatus) Signaled() bool { return w&mask != stopped && w&mask != 0 } + +func (w WaitStatus) Signal() syscall.Signal { + sig := syscall.Signal(w & mask) + if sig == stopped || sig == 0 { + return -1 + } + return sig +} + +func (w WaitStatus) CoreDump() bool { return w.Signaled() && w&core != 0 } + +func (w WaitStatus) Stopped() bool { return w&mask == stopped && syscall.Signal(w>>shift) != SIGSTOP } + +func (w WaitStatus) Continued() bool { return w&mask == stopped && syscall.Signal(w>>shift) == SIGSTOP } + +func (w WaitStatus) StopSignal() syscall.Signal { + if !w.Stopped() { + return -1 + } + return syscall.Signal(w>>shift) & 0xFF +} + +func (w WaitStatus) TrapCause() int { return -1 } + +//sys wait4(pid int32, statusp *_C_int, options int, rusage *Rusage) (wpid int32, err error) + +func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (int, error) { + var status _C_int + rpid, err := wait4(int32(pid), &status, options, rusage) + wpid := int(rpid) + if wpid == -1 { + return wpid, err + } + if wstatus != nil { + *wstatus = WaitStatus(status) + } + return wpid, nil +} + +//sys gethostname(buf []byte) (n int, err error) + +func Gethostname() (name string, err error) { + var buf [MaxHostNameLen]byte + n, err := gethostname(buf[:]) + if n != 0 { + return "", err + } + n = clen(buf[:]) + if n < 1 { + return "", EFAULT + } + return string(buf[:n]), nil +} + +//sys utimes(path string, times *[2]Timeval) (err error) + +func Utimes(path string, tv []Timeval) (err error) { + if tv == nil { + return utimes(path, nil) + } + if len(tv) != 2 { + return EINVAL + } + return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +//sys utimensat(fd int, path string, times *[2]Timespec, flag int) (err error) + +func UtimesNano(path string, ts []Timespec) error { + if ts == nil { + return utimensat(AT_FDCWD, path, nil, 0) + } + if len(ts) != 2 { + return EINVAL + } + return utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) +} + +func UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) error { + if ts == nil { + return utimensat(dirfd, path, nil, flags) + } + if len(ts) != 2 { + return EINVAL + } + return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags) +} + +//sys fcntl(fd int, cmd int, arg int) (val int, err error) + +// FcntlInt performs a fcntl syscall on fd with the provided command and argument. +func FcntlInt(fd uintptr, cmd, arg int) (int, error) { + valptr, _, err := sysvicall6(uintptr(unsafe.Pointer(&procfcntl)), 3, uintptr(fd), uintptr(cmd), uintptr(arg), 0, 0, 0) + return int(valptr), err +} + +// FcntlFlock performs a fcntl syscall for the F_GETLK, F_SETLK or F_SETLKW command. +func FcntlFlock(fd uintptr, cmd int, lk *Flock_t) error { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procfcntl)), 3, uintptr(fd), uintptr(cmd), uintptr(unsafe.Pointer(lk)), 0, 0, 0) + if e1 != 0 { + return e1 + } + return nil +} + +//sys futimesat(fildes int, path *byte, times *[2]Timeval) (err error) + +func Futimesat(dirfd int, path string, tv []Timeval) error { + pathp, err := BytePtrFromString(path) + if err != nil { + return err + } + if tv == nil { + return futimesat(dirfd, pathp, nil) + } + if len(tv) != 2 { + return EINVAL + } + return futimesat(dirfd, pathp, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +// Solaris doesn't have an futimes function because it allows NULL to be +// specified as the path for futimesat. However, Go doesn't like +// NULL-style string interfaces, so this simple wrapper is provided. +func Futimes(fd int, tv []Timeval) error { + if tv == nil { + return futimesat(fd, nil, nil) + } + if len(tv) != 2 { + return EINVAL + } + return futimesat(fd, nil, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +func anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) { + switch rsa.Addr.Family { + case AF_UNIX: + pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa)) + sa := new(SockaddrUnix) + // Assume path ends at NUL. + // This is not technically the Solaris semantics for + // abstract Unix domain sockets -- they are supposed + // to be uninterpreted fixed-size binary blobs -- but + // everyone uses this convention. + n := 0 + for n < len(pp.Path) && pp.Path[n] != 0 { + n++ + } + bytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n] + sa.Name = string(bytes) + return sa, nil + + case AF_INET: + pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet4) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + + case AF_INET6: + pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet6) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + sa.ZoneId = pp.Scope_id + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + } + return nil, EAFNOSUPPORT +} + +//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) = libsocket.accept + +func Accept(fd int) (nfd int, sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + nfd, err = accept(fd, &rsa, &len) + if nfd == -1 { + return + } + sa, err = anyToSockaddr(&rsa) + if err != nil { + Close(nfd) + nfd = 0 + } + return +} + +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) = libsocket.__xnet_recvmsg + +func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { + var msg Msghdr + var rsa RawSockaddrAny + msg.Name = (*byte)(unsafe.Pointer(&rsa)) + msg.Namelen = uint32(SizeofSockaddrAny) + var iov Iovec + if len(p) > 0 { + iov.Base = (*int8)(unsafe.Pointer(&p[0])) + iov.SetLen(len(p)) + } + var dummy int8 + if len(oob) > 0 { + // receive at least one normal byte + if len(p) == 0 { + iov.Base = &dummy + iov.SetLen(1) + } + msg.Accrightslen = int32(len(oob)) + } + msg.Iov = &iov + msg.Iovlen = 1 + if n, err = recvmsg(fd, &msg, flags); n == -1 { + return + } + oobn = int(msg.Accrightslen) + // source address is only specified if the socket is unconnected + if rsa.Addr.Family != AF_UNSPEC { + from, err = anyToSockaddr(&rsa) + } + return +} + +func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { + _, err = SendmsgN(fd, p, oob, to, flags) + return +} + +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) = libsocket.__xnet_sendmsg + +func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { + var ptr unsafe.Pointer + var salen _Socklen + if to != nil { + ptr, salen, err = to.sockaddr() + if err != nil { + return 0, err + } + } + var msg Msghdr + msg.Name = (*byte)(unsafe.Pointer(ptr)) + msg.Namelen = uint32(salen) + var iov Iovec + if len(p) > 0 { + iov.Base = (*int8)(unsafe.Pointer(&p[0])) + iov.SetLen(len(p)) + } + var dummy int8 + if len(oob) > 0 { + // send at least one normal byte + if len(p) == 0 { + iov.Base = &dummy + iov.SetLen(1) + } + msg.Accrightslen = int32(len(oob)) + } + msg.Iov = &iov + msg.Iovlen = 1 + if n, err = sendmsg(fd, &msg, flags); err != nil { + return 0, err + } + if len(oob) > 0 && len(p) == 0 { + n = 0 + } + return n, nil +} + +//sys acct(path *byte) (err error) + +func Acct(path string) (err error) { + if len(path) == 0 { + // Assume caller wants to disable accounting. + return acct(nil) + } + + pathp, err := BytePtrFromString(path) + if err != nil { + return err + } + return acct(pathp) +} + +//sys __makedev(version int, major uint, minor uint) (val uint64) + +func Mkdev(major, minor uint32) uint64 { + return __makedev(NEWDEV, uint(major), uint(minor)) +} + +//sys __major(version int, dev uint64) (val uint) + +func Major(dev uint64) uint32 { + return uint32(__major(NEWDEV, dev)) +} + +//sys __minor(version int, dev uint64) (val uint) + +func Minor(dev uint64) uint32 { + return uint32(__minor(NEWDEV, dev)) +} + +/* + * Expose the ioctl function + */ + +//sys ioctl(fd int, req uint, arg uintptr) (err error) + +func IoctlSetInt(fd int, req uint, value int) (err error) { + return ioctl(fd, req, uintptr(value)) +} + +func IoctlSetWinsize(fd int, req uint, value *Winsize) (err error) { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlSetTermios(fd int, req uint, value *Termios) (err error) { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlSetTermio(fd int, req uint, value *Termio) (err error) { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlGetInt(fd int, req uint) (int, error) { + var value int + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return value, err +} + +func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { + var value Winsize + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermios(fd int, req uint) (*Termios, error) { + var value Termios + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermio(fd int, req uint) (*Termio, error) { + var value Termio + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} + +/* + * Exposed directly + */ +//sys Access(path string, mode uint32) (err error) +//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) +//sys Chdir(path string) (err error) +//sys Chmod(path string, mode uint32) (err error) +//sys Chown(path string, uid int, gid int) (err error) +//sys Chroot(path string) (err error) +//sys Close(fd int) (err error) +//sys Creat(path string, mode uint32) (fd int, err error) +//sys Dup(fd int) (nfd int, err error) +//sys Dup2(oldfd int, newfd int) (err error) +//sys Exit(code int) +//sys Fchdir(fd int) (err error) +//sys Fchmod(fd int, mode uint32) (err error) +//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) +//sys Fdatasync(fd int) (err error) +//sys Flock(fd int, how int) (err error) +//sys Fpathconf(fd int, name int) (val int, err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) +//sys Fstatvfs(fd int, vfsstat *Statvfs_t) (err error) +//sys Getdents(fd int, buf []byte, basep *uintptr) (n int, err error) +//sysnb Getgid() (gid int) +//sysnb Getpid() (pid int) +//sysnb Getpgid(pid int) (pgid int, err error) +//sysnb Getpgrp() (pgid int, err error) +//sys Geteuid() (euid int) +//sys Getegid() (egid int) +//sys Getppid() (ppid int) +//sys Getpriority(which int, who int) (n int, err error) +//sysnb Getrlimit(which int, lim *Rlimit) (err error) +//sysnb Getrusage(who int, rusage *Rusage) (err error) +//sysnb Gettimeofday(tv *Timeval) (err error) +//sysnb Getuid() (uid int) +//sys Kill(pid int, signum syscall.Signal) (err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Link(path string, link string) (err error) +//sys Listen(s int, backlog int) (err error) = libsocket.__xnet_llisten +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Madvise(b []byte, advice int) (err error) +//sys Mkdir(path string, mode uint32) (err error) +//sys Mkdirat(dirfd int, path string, mode uint32) (err error) +//sys Mkfifo(path string, mode uint32) (err error) +//sys Mkfifoat(dirfd int, path string, mode uint32) (err error) +//sys Mknod(path string, mode uint32, dev int) (err error) +//sys Mknodat(dirfd int, path string, mode uint32, dev int) (err error) +//sys Mlock(b []byte) (err error) +//sys Mlockall(flags int) (err error) +//sys Mprotect(b []byte, prot int) (err error) +//sys Msync(b []byte, flags int) (err error) +//sys Munlock(b []byte) (err error) +//sys Munlockall() (err error) +//sys Nanosleep(time *Timespec, leftover *Timespec) (err error) +//sys Open(path string, mode int, perm uint32) (fd int, err error) +//sys Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) +//sys Pathconf(path string, name int) (val int, err error) +//sys Pause() (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys read(fd int, p []byte) (n int, err error) +//sys Readlink(path string, buf []byte) (n int, err error) +//sys Rename(from string, to string) (err error) +//sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) +//sys Rmdir(path string) (err error) +//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = lseek +//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) +//sysnb Setegid(egid int) (err error) +//sysnb Seteuid(euid int) (err error) +//sysnb Setgid(gid int) (err error) +//sys Sethostname(p []byte) (err error) +//sysnb Setpgid(pid int, pgid int) (err error) +//sys Setpriority(which int, who int, prio int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sysnb Setrlimit(which int, lim *Rlimit) (err error) +//sysnb Setsid() (pid int, err error) +//sysnb Setuid(uid int) (err error) +//sys Shutdown(s int, how int) (err error) = libsocket.shutdown +//sys Stat(path string, stat *Stat_t) (err error) +//sys Statvfs(path string, vfsstat *Statvfs_t) (err error) +//sys Symlink(path string, link string) (err error) +//sys Sync() (err error) +//sysnb Times(tms *Tms) (ticks uintptr, err error) +//sys Truncate(path string, length int64) (err error) +//sys Fsync(fd int) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sys Umask(mask int) (oldmask int) +//sysnb Uname(buf *Utsname) (err error) +//sys Unmount(target string, flags int) (err error) = libc.umount +//sys Unlink(path string) (err error) +//sys Unlinkat(dirfd int, path string, flags int) (err error) +//sys Ustat(dev int, ubuf *Ustat_t) (err error) +//sys Utime(path string, buf *Utimbuf) (err error) +//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.__xnet_bind +//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.__xnet_connect +//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) +//sys munmap(addr uintptr, length uintptr) (err error) +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = libsendfile.sendfile +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.__xnet_sendto +//sys socket(domain int, typ int, proto int) (fd int, err error) = libsocket.__xnet_socket +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) = libsocket.__xnet_socketpair +//sys write(fd int, p []byte) (n int, err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) = libsocket.__xnet_getsockopt +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) = libsocket.getpeername +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) = libsocket.setsockopt +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) = libsocket.recvfrom + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procread)), 3, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procwrite)), 3, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +var mapper = &mmapper{ + active: make(map[*byte][]byte), + mmap: mmap, + munmap: munmap, +} + +func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { + return mapper.Mmap(fd, offset, length, prot, flags) +} + +func Munmap(b []byte) (err error) { + return mapper.Munmap(b) +} diff --git a/api/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go b/api/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go new file mode 100644 index 0000000..91c32dd --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go @@ -0,0 +1,23 @@ +// 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. + +// +build amd64,solaris + +package unix + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: usec} +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} diff --git a/api/vendor/golang.org/x/sys/unix/syscall_solaris_test.go b/api/vendor/golang.org/x/sys/unix/syscall_solaris_test.go new file mode 100644 index 0000000..57dba88 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_solaris_test.go @@ -0,0 +1,55 @@ +// 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. + +// +build solaris + +package unix_test + +import ( + "os/exec" + "testing" + "time" + + "golang.org/x/sys/unix" +) + +func TestSelect(t *testing.T) { + err := unix.Select(0, nil, nil, nil, &unix.Timeval{Sec: 0, Usec: 0}) + if err != nil { + t.Fatalf("Select: %v", err) + } + + dur := 150 * time.Millisecond + tv := unix.NsecToTimeval(int64(dur)) + start := time.Now() + err = unix.Select(0, nil, nil, nil, &tv) + took := time.Since(start) + if err != nil { + t.Fatalf("Select: %v", err) + } + + if took < dur { + t.Errorf("Select: timeout should have been at least %v, got %v", dur, took) + } +} + +func TestStatvfs(t *testing.T) { + if err := unix.Statvfs("", nil); err == nil { + t.Fatal(`Statvfs("") expected failure`) + } + + statvfs := unix.Statvfs_t{} + if err := unix.Statvfs("/", &statvfs); err != nil { + t.Errorf(`Statvfs("/") failed: %v`, err) + } + + if t.Failed() { + mount, err := exec.Command("mount").CombinedOutput() + if err != nil { + t.Logf("mount: %v\n%s", err, mount) + } else { + t.Logf("mount: %s", mount) + } + } +} diff --git a/api/vendor/golang.org/x/sys/unix/syscall_test.go b/api/vendor/golang.org/x/sys/unix/syscall_test.go new file mode 100644 index 0000000..a8eef7c --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_test.go @@ -0,0 +1,60 @@ +// 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +package unix_test + +import ( + "fmt" + "testing" + + "golang.org/x/sys/unix" +) + +func testSetGetenv(t *testing.T, key, value string) { + err := unix.Setenv(key, value) + if err != nil { + t.Fatalf("Setenv failed to set %q: %v", value, err) + } + newvalue, found := unix.Getenv(key) + if !found { + t.Fatalf("Getenv failed to find %v variable (want value %q)", key, value) + } + if newvalue != value { + t.Fatalf("Getenv(%v) = %q; want %q", key, newvalue, value) + } +} + +func TestEnv(t *testing.T) { + testSetGetenv(t, "TESTENV", "AVALUE") + // make sure TESTENV gets set to "", not deleted + testSetGetenv(t, "TESTENV", "") +} + +func TestItoa(t *testing.T) { + // Make most negative integer: 0x8000... + i := 1 + for i<<1 != 0 { + i <<= 1 + } + if i >= 0 { + t.Fatal("bad math") + } + s := unix.Itoa(i) + f := fmt.Sprint(i) + if s != f { + t.Fatalf("itoa(%d) = %s, want %s", i, s, f) + } +} + +func TestUname(t *testing.T) { + var utsname unix.Utsname + err := unix.Uname(&utsname) + if err != nil { + t.Fatalf("Uname: %v", err) + } + + t.Logf("OS: %s/%s %s", utsname.Sysname[:], utsname.Machine[:], utsname.Release[:]) +} diff --git a/api/vendor/golang.org/x/sys/unix/syscall_unix.go b/api/vendor/golang.org/x/sys/unix/syscall_unix.go new file mode 100644 index 0000000..b835bad --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_unix.go @@ -0,0 +1,394 @@ +// 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +package unix + +import ( + "bytes" + "runtime" + "sort" + "sync" + "syscall" + "unsafe" +) + +var ( + Stdin = 0 + Stdout = 1 + Stderr = 2 +) + +const ( + darwin64Bit = runtime.GOOS == "darwin" && sizeofPtr == 8 + dragonfly64Bit = runtime.GOOS == "dragonfly" && sizeofPtr == 8 + netbsd32Bit = runtime.GOOS == "netbsd" && sizeofPtr == 4 + solaris64Bit = runtime.GOOS == "solaris" && sizeofPtr == 8 +) + +// Do the interface allocations only once for common +// Errno values. +var ( + errEAGAIN error = syscall.EAGAIN + errEINVAL error = syscall.EINVAL + errENOENT error = syscall.ENOENT +) + +// errnoErr returns common boxed Errno values, to prevent +// allocations at runtime. +func errnoErr(e syscall.Errno) error { + switch e { + case 0: + return nil + case EAGAIN: + return errEAGAIN + case EINVAL: + return errEINVAL + case ENOENT: + return errENOENT + } + return e +} + +// ErrnoName returns the error name for error number e. +func ErrnoName(e syscall.Errno) string { + i := sort.Search(len(errorList), func(i int) bool { + return errorList[i].num >= e + }) + if i < len(errorList) && errorList[i].num == e { + return errorList[i].name + } + return "" +} + +// SignalName returns the signal name for signal number s. +func SignalName(s syscall.Signal) string { + i := sort.Search(len(signalList), func(i int) bool { + return signalList[i].num >= s + }) + if i < len(signalList) && signalList[i].num == s { + return signalList[i].name + } + return "" +} + +// clen returns the index of the first NULL byte in n or len(n) if n contains no NULL byte. +func clen(n []byte) int { + i := bytes.IndexByte(n, 0) + if i == -1 { + i = len(n) + } + return i +} + +// Mmap manager, for use by operating system-specific implementations. + +type mmapper struct { + sync.Mutex + active map[*byte][]byte // active mappings; key is last byte in mapping + mmap func(addr, length uintptr, prot, flags, fd int, offset int64) (uintptr, error) + munmap func(addr uintptr, length uintptr) error +} + +func (m *mmapper) Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { + if length <= 0 { + return nil, EINVAL + } + + // Map the requested memory. + addr, errno := m.mmap(0, uintptr(length), prot, flags, fd, offset) + if errno != nil { + return nil, errno + } + + // Slice memory layout + var sl = struct { + addr uintptr + len int + cap int + }{addr, length, length} + + // Use unsafe to turn sl into a []byte. + b := *(*[]byte)(unsafe.Pointer(&sl)) + + // Register mapping in m and return it. + p := &b[cap(b)-1] + m.Lock() + defer m.Unlock() + m.active[p] = b + return b, nil +} + +func (m *mmapper) Munmap(data []byte) (err error) { + if len(data) == 0 || len(data) != cap(data) { + return EINVAL + } + + // Find the base of the mapping. + p := &data[cap(data)-1] + m.Lock() + defer m.Unlock() + b := m.active[p] + if b == nil || &b[0] != &data[0] { + return EINVAL + } + + // Unmap the memory and update m. + if errno := m.munmap(uintptr(unsafe.Pointer(&b[0])), uintptr(len(b))); errno != nil { + return errno + } + delete(m.active, p) + return nil +} + +func Read(fd int, p []byte) (n int, err error) { + n, err = read(fd, p) + if raceenabled { + if n > 0 { + raceWriteRange(unsafe.Pointer(&p[0]), n) + } + if err == nil { + raceAcquire(unsafe.Pointer(&ioSync)) + } + } + return +} + +func Write(fd int, p []byte) (n int, err error) { + if raceenabled { + raceReleaseMerge(unsafe.Pointer(&ioSync)) + } + n, err = write(fd, p) + if raceenabled && n > 0 { + raceReadRange(unsafe.Pointer(&p[0]), n) + } + return +} + +// For testing: clients can set this flag to force +// creation of IPv6 sockets to return EAFNOSUPPORT. +var SocketDisableIPv6 bool + +// Sockaddr represents a socket address. +type Sockaddr interface { + sockaddr() (ptr unsafe.Pointer, len _Socklen, err error) // lowercase; only we can define Sockaddrs +} + +// SockaddrInet4 implements the Sockaddr interface for AF_INET type sockets. +type SockaddrInet4 struct { + Port int + Addr [4]byte + raw RawSockaddrInet4 +} + +// SockaddrInet6 implements the Sockaddr interface for AF_INET6 type sockets. +type SockaddrInet6 struct { + Port int + ZoneId uint32 + Addr [16]byte + raw RawSockaddrInet6 +} + +// SockaddrUnix implements the Sockaddr interface for AF_UNIX type sockets. +type SockaddrUnix struct { + Name string + raw RawSockaddrUnix +} + +func Bind(fd int, sa Sockaddr) (err error) { + ptr, n, err := sa.sockaddr() + if err != nil { + return err + } + return bind(fd, ptr, n) +} + +func Connect(fd int, sa Sockaddr) (err error) { + ptr, n, err := sa.sockaddr() + if err != nil { + return err + } + return connect(fd, ptr, n) +} + +func Getpeername(fd int) (sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + if err = getpeername(fd, &rsa, &len); err != nil { + return + } + return anyToSockaddr(&rsa) +} + +func GetsockoptByte(fd, level, opt int) (value byte, err error) { + var n byte + vallen := _Socklen(1) + err = getsockopt(fd, level, opt, unsafe.Pointer(&n), &vallen) + return n, err +} + +func GetsockoptInt(fd, level, opt int) (value int, err error) { + var n int32 + vallen := _Socklen(4) + err = getsockopt(fd, level, opt, unsafe.Pointer(&n), &vallen) + return int(n), err +} + +func GetsockoptInet4Addr(fd, level, opt int) (value [4]byte, err error) { + vallen := _Socklen(4) + err = getsockopt(fd, level, opt, unsafe.Pointer(&value[0]), &vallen) + return value, err +} + +func GetsockoptIPMreq(fd, level, opt int) (*IPMreq, error) { + var value IPMreq + vallen := _Socklen(SizeofIPMreq) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptIPv6Mreq(fd, level, opt int) (*IPv6Mreq, error) { + var value IPv6Mreq + vallen := _Socklen(SizeofIPv6Mreq) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptIPv6MTUInfo(fd, level, opt int) (*IPv6MTUInfo, error) { + var value IPv6MTUInfo + vallen := _Socklen(SizeofIPv6MTUInfo) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptICMPv6Filter(fd, level, opt int) (*ICMPv6Filter, error) { + var value ICMPv6Filter + vallen := _Socklen(SizeofICMPv6Filter) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptLinger(fd, level, opt int) (*Linger, error) { + var linger Linger + vallen := _Socklen(SizeofLinger) + err := getsockopt(fd, level, opt, unsafe.Pointer(&linger), &vallen) + return &linger, err +} + +func GetsockoptTimeval(fd, level, opt int) (*Timeval, error) { + var tv Timeval + vallen := _Socklen(unsafe.Sizeof(tv)) + err := getsockopt(fd, level, opt, unsafe.Pointer(&tv), &vallen) + return &tv, err +} + +func Recvfrom(fd int, p []byte, flags int) (n int, from Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + if n, err = recvfrom(fd, p, flags, &rsa, &len); err != nil { + return + } + if rsa.Addr.Family != AF_UNSPEC { + from, err = anyToSockaddr(&rsa) + } + return +} + +func Sendto(fd int, p []byte, flags int, to Sockaddr) (err error) { + ptr, n, err := to.sockaddr() + if err != nil { + return err + } + return sendto(fd, p, flags, ptr, n) +} + +func SetsockoptByte(fd, level, opt int, value byte) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(&value), 1) +} + +func SetsockoptInt(fd, level, opt int, value int) (err error) { + var n = int32(value) + return setsockopt(fd, level, opt, unsafe.Pointer(&n), 4) +} + +func SetsockoptInet4Addr(fd, level, opt int, value [4]byte) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(&value[0]), 4) +} + +func SetsockoptIPMreq(fd, level, opt int, mreq *IPMreq) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(mreq), SizeofIPMreq) +} + +func SetsockoptIPv6Mreq(fd, level, opt int, mreq *IPv6Mreq) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(mreq), SizeofIPv6Mreq) +} + +func SetsockoptICMPv6Filter(fd, level, opt int, filter *ICMPv6Filter) error { + return setsockopt(fd, level, opt, unsafe.Pointer(filter), SizeofICMPv6Filter) +} + +func SetsockoptLinger(fd, level, opt int, l *Linger) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(l), SizeofLinger) +} + +func SetsockoptString(fd, level, opt int, s string) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(&[]byte(s)[0]), uintptr(len(s))) +} + +func SetsockoptTimeval(fd, level, opt int, tv *Timeval) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(tv), unsafe.Sizeof(*tv)) +} + +func Socket(domain, typ, proto int) (fd int, err error) { + if domain == AF_INET6 && SocketDisableIPv6 { + return -1, EAFNOSUPPORT + } + fd, err = socket(domain, typ, proto) + return +} + +func Socketpair(domain, typ, proto int) (fd [2]int, err error) { + var fdx [2]int32 + err = socketpair(domain, typ, proto, &fdx) + if err == nil { + fd[0] = int(fdx[0]) + fd[1] = int(fdx[1]) + } + return +} + +func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + if raceenabled { + raceReleaseMerge(unsafe.Pointer(&ioSync)) + } + return sendfile(outfd, infd, offset, count) +} + +var ioSync int64 + +func CloseOnExec(fd int) { fcntl(fd, F_SETFD, FD_CLOEXEC) } + +func SetNonblock(fd int, nonblocking bool) (err error) { + flag, err := fcntl(fd, F_GETFL, 0) + if err != nil { + return err + } + if nonblocking { + flag |= O_NONBLOCK + } else { + flag &= ^O_NONBLOCK + } + _, err = fcntl(fd, F_SETFL, flag) + return err +} + +// Exec calls execve(2), which replaces the calling executable in the process +// tree. argv0 should be the full path to an executable ("/bin/ls") and the +// executable name should also be the first argument in argv (["ls", "-l"]). +// envv are the environment variables that should be passed to the new +// process (["USER=go", "PWD=/tmp"]). +func Exec(argv0 string, argv []string, envv []string) error { + return syscall.Exec(argv0, argv, envv) +} diff --git a/api/vendor/golang.org/x/sys/unix/syscall_unix_gc.go b/api/vendor/golang.org/x/sys/unix/syscall_unix_gc.go new file mode 100644 index 0000000..4cb8e8e --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_unix_gc.go @@ -0,0 +1,15 @@ +// 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris +// +build !gccgo + +package unix + +import "syscall" + +func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) +func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) +func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) +func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) diff --git a/api/vendor/golang.org/x/sys/unix/syscall_unix_test.go b/api/vendor/golang.org/x/sys/unix/syscall_unix_test.go new file mode 100644 index 0000000..ad09716 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/syscall_unix_test.go @@ -0,0 +1,639 @@ +// 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +package unix_test + +import ( + "flag" + "fmt" + "io/ioutil" + "net" + "os" + "os/exec" + "path/filepath" + "runtime" + "syscall" + "testing" + "time" + + "golang.org/x/sys/unix" +) + +// Tests that below functions, structures and constants are consistent +// on all Unix-like systems. +func _() { + // program scheduling priority functions and constants + var ( + _ func(int, int, int) error = unix.Setpriority + _ func(int, int) (int, error) = unix.Getpriority + ) + const ( + _ int = unix.PRIO_USER + _ int = unix.PRIO_PROCESS + _ int = unix.PRIO_PGRP + ) + + // termios constants + const ( + _ int = unix.TCIFLUSH + _ int = unix.TCIOFLUSH + _ int = unix.TCOFLUSH + ) + + // fcntl file locking structure and constants + var ( + _ = unix.Flock_t{ + Type: int16(0), + Whence: int16(0), + Start: int64(0), + Len: int64(0), + Pid: int32(0), + } + ) + const ( + _ = unix.F_GETLK + _ = unix.F_SETLK + _ = unix.F_SETLKW + ) +} + +func TestErrnoSignalName(t *testing.T) { + testErrors := []struct { + num syscall.Errno + name string + }{ + {syscall.EPERM, "EPERM"}, + {syscall.EINVAL, "EINVAL"}, + {syscall.ENOENT, "ENOENT"}, + } + + for _, te := range testErrors { + t.Run(fmt.Sprintf("%d/%s", te.num, te.name), func(t *testing.T) { + e := unix.ErrnoName(te.num) + if e != te.name { + t.Errorf("ErrnoName(%d) returned %s, want %s", te.num, e, te.name) + } + }) + } + + testSignals := []struct { + num syscall.Signal + name string + }{ + {syscall.SIGHUP, "SIGHUP"}, + {syscall.SIGPIPE, "SIGPIPE"}, + {syscall.SIGSEGV, "SIGSEGV"}, + } + + for _, ts := range testSignals { + t.Run(fmt.Sprintf("%d/%s", ts.num, ts.name), func(t *testing.T) { + s := unix.SignalName(ts.num) + if s != ts.name { + t.Errorf("SignalName(%d) returned %s, want %s", ts.num, s, ts.name) + } + }) + } +} + +// TestFcntlFlock tests whether the file locking structure matches +// the calling convention of each kernel. +func TestFcntlFlock(t *testing.T) { + name := filepath.Join(os.TempDir(), "TestFcntlFlock") + fd, err := unix.Open(name, unix.O_CREAT|unix.O_RDWR|unix.O_CLOEXEC, 0) + if err != nil { + t.Fatalf("Open failed: %v", err) + } + defer unix.Unlink(name) + defer unix.Close(fd) + flock := unix.Flock_t{ + Type: unix.F_RDLCK, + Start: 0, Len: 0, Whence: 1, + } + if err := unix.FcntlFlock(uintptr(fd), unix.F_GETLK, &flock); err != nil { + t.Fatalf("FcntlFlock failed: %v", err) + } +} + +// TestPassFD tests passing a file descriptor over a Unix socket. +// +// This test involved both a parent and child process. The parent +// process is invoked as a normal test, with "go test", which then +// runs the child process by running the current test binary with args +// "-test.run=^TestPassFD$" and an environment variable used to signal +// that the test should become the child process instead. +func TestPassFD(t *testing.T) { + if runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64") { + t.Skip("cannot exec subprocess on iOS, skipping test") + } + + if os.Getenv("GO_WANT_HELPER_PROCESS") == "1" { + passFDChild() + return + } + + tempDir, err := ioutil.TempDir("", "TestPassFD") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(tempDir) + + fds, err := unix.Socketpair(unix.AF_LOCAL, unix.SOCK_STREAM, 0) + if err != nil { + t.Fatalf("Socketpair: %v", err) + } + defer unix.Close(fds[0]) + defer unix.Close(fds[1]) + writeFile := os.NewFile(uintptr(fds[0]), "child-writes") + readFile := os.NewFile(uintptr(fds[1]), "parent-reads") + defer writeFile.Close() + defer readFile.Close() + + cmd := exec.Command(os.Args[0], "-test.run=^TestPassFD$", "--", tempDir) + cmd.Env = []string{"GO_WANT_HELPER_PROCESS=1"} + if lp := os.Getenv("LD_LIBRARY_PATH"); lp != "" { + cmd.Env = append(cmd.Env, "LD_LIBRARY_PATH="+lp) + } + cmd.ExtraFiles = []*os.File{writeFile} + + out, err := cmd.CombinedOutput() + if len(out) > 0 || err != nil { + t.Fatalf("child process: %q, %v", out, err) + } + + c, err := net.FileConn(readFile) + if err != nil { + t.Fatalf("FileConn: %v", err) + } + defer c.Close() + + uc, ok := c.(*net.UnixConn) + if !ok { + t.Fatalf("unexpected FileConn type; expected UnixConn, got %T", c) + } + + buf := make([]byte, 32) // expect 1 byte + oob := make([]byte, 32) // expect 24 bytes + closeUnix := time.AfterFunc(5*time.Second, func() { + t.Logf("timeout reading from unix socket") + uc.Close() + }) + _, oobn, _, _, err := uc.ReadMsgUnix(buf, oob) + if err != nil { + t.Fatalf("ReadMsgUnix: %v", err) + } + closeUnix.Stop() + + scms, err := unix.ParseSocketControlMessage(oob[:oobn]) + if err != nil { + t.Fatalf("ParseSocketControlMessage: %v", err) + } + if len(scms) != 1 { + t.Fatalf("expected 1 SocketControlMessage; got scms = %#v", scms) + } + scm := scms[0] + gotFds, err := unix.ParseUnixRights(&scm) + if err != nil { + t.Fatalf("unix.ParseUnixRights: %v", err) + } + if len(gotFds) != 1 { + t.Fatalf("wanted 1 fd; got %#v", gotFds) + } + + f := os.NewFile(uintptr(gotFds[0]), "fd-from-child") + defer f.Close() + + got, err := ioutil.ReadAll(f) + want := "Hello from child process!\n" + if string(got) != want { + t.Errorf("child process ReadAll: %q, %v; want %q", got, err, want) + } +} + +// passFDChild is the child process used by TestPassFD. +func passFDChild() { + defer os.Exit(0) + + // Look for our fd. It should be fd 3, but we work around an fd leak + // bug here (http://golang.org/issue/2603) to let it be elsewhere. + var uc *net.UnixConn + for fd := uintptr(3); fd <= 10; fd++ { + f := os.NewFile(fd, "unix-conn") + var ok bool + netc, _ := net.FileConn(f) + uc, ok = netc.(*net.UnixConn) + if ok { + break + } + } + if uc == nil { + fmt.Println("failed to find unix fd") + return + } + + // Make a file f to send to our parent process on uc. + // We make it in tempDir, which our parent will clean up. + flag.Parse() + tempDir := flag.Arg(0) + f, err := ioutil.TempFile(tempDir, "") + if err != nil { + fmt.Printf("TempFile: %v", err) + return + } + + f.Write([]byte("Hello from child process!\n")) + f.Seek(0, 0) + + rights := unix.UnixRights(int(f.Fd())) + dummyByte := []byte("x") + n, oobn, err := uc.WriteMsgUnix(dummyByte, rights, nil) + if err != nil { + fmt.Printf("WriteMsgUnix: %v", err) + return + } + if n != 1 || oobn != len(rights) { + fmt.Printf("WriteMsgUnix = %d, %d; want 1, %d", n, oobn, len(rights)) + return + } +} + +// TestUnixRightsRoundtrip tests that UnixRights, ParseSocketControlMessage, +// and ParseUnixRights are able to successfully round-trip lists of file descriptors. +func TestUnixRightsRoundtrip(t *testing.T) { + testCases := [...][][]int{ + {{42}}, + {{1, 2}}, + {{3, 4, 5}}, + {{}}, + {{1, 2}, {3, 4, 5}, {}, {7}}, + } + for _, testCase := range testCases { + b := []byte{} + var n int + for _, fds := range testCase { + // Last assignment to n wins + n = len(b) + unix.CmsgLen(4*len(fds)) + b = append(b, unix.UnixRights(fds...)...) + } + // Truncate b + b = b[:n] + + scms, err := unix.ParseSocketControlMessage(b) + if err != nil { + t.Fatalf("ParseSocketControlMessage: %v", err) + } + if len(scms) != len(testCase) { + t.Fatalf("expected %v SocketControlMessage; got scms = %#v", len(testCase), scms) + } + for i, scm := range scms { + gotFds, err := unix.ParseUnixRights(&scm) + if err != nil { + t.Fatalf("ParseUnixRights: %v", err) + } + wantFds := testCase[i] + if len(gotFds) != len(wantFds) { + t.Fatalf("expected %v fds, got %#v", len(wantFds), gotFds) + } + for j, fd := range gotFds { + if fd != wantFds[j] { + t.Fatalf("expected fd %v, got %v", wantFds[j], fd) + } + } + } + } +} + +func TestRlimit(t *testing.T) { + var rlimit, zero unix.Rlimit + err := unix.Getrlimit(unix.RLIMIT_NOFILE, &rlimit) + if err != nil { + t.Fatalf("Getrlimit: save failed: %v", err) + } + if zero == rlimit { + t.Fatalf("Getrlimit: save failed: got zero value %#v", rlimit) + } + set := rlimit + set.Cur = set.Max - 1 + err = unix.Setrlimit(unix.RLIMIT_NOFILE, &set) + if err != nil { + t.Fatalf("Setrlimit: set failed: %#v %v", set, err) + } + var get unix.Rlimit + err = unix.Getrlimit(unix.RLIMIT_NOFILE, &get) + if err != nil { + t.Fatalf("Getrlimit: get failed: %v", err) + } + set = rlimit + set.Cur = set.Max - 1 + if set != get { + // Seems like Darwin requires some privilege to + // increase the soft limit of rlimit sandbox, though + // Setrlimit never reports an error. + switch runtime.GOOS { + case "darwin": + default: + t.Fatalf("Rlimit: change failed: wanted %#v got %#v", set, get) + } + } + err = unix.Setrlimit(unix.RLIMIT_NOFILE, &rlimit) + if err != nil { + t.Fatalf("Setrlimit: restore failed: %#v %v", rlimit, err) + } +} + +func TestSeekFailure(t *testing.T) { + _, err := unix.Seek(-1, 0, 0) + if err == nil { + t.Fatalf("Seek(-1, 0, 0) did not fail") + } + str := err.Error() // used to crash on Linux + t.Logf("Seek: %v", str) + if str == "" { + t.Fatalf("Seek(-1, 0, 0) return error with empty message") + } +} + +func TestDup(t *testing.T) { + file, err := ioutil.TempFile("", "TestDup") + if err != nil { + t.Fatalf("Tempfile failed: %v", err) + } + defer os.Remove(file.Name()) + defer file.Close() + f := int(file.Fd()) + + newFd, err := unix.Dup(f) + if err != nil { + t.Fatalf("Dup: %v", err) + } + + err = unix.Dup2(newFd, newFd+1) + if err != nil { + t.Fatalf("Dup2: %v", err) + } + + b1 := []byte("Test123") + b2 := make([]byte, 7) + _, err = unix.Write(newFd+1, b1) + if err != nil { + t.Fatalf("Write to dup2 fd failed: %v", err) + } + _, err = unix.Seek(f, 0, 0) + if err != nil { + t.Fatalf("Seek failed: %v", err) + } + _, err = unix.Read(f, b2) + if err != nil { + t.Fatalf("Read back failed: %v", err) + } + if string(b1) != string(b2) { + t.Errorf("Dup: stdout write not in file, expected %v, got %v", string(b1), string(b2)) + } +} + +func TestPoll(t *testing.T) { + if runtime.GOOS == "android" || + (runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64")) { + t.Skip("mkfifo syscall is not available on android and iOS, skipping test") + } + + f, cleanup := mktmpfifo(t) + defer cleanup() + + const timeout = 100 + + ok := make(chan bool, 1) + go func() { + select { + case <-time.After(10 * timeout * time.Millisecond): + t.Errorf("Poll: failed to timeout after %d milliseconds", 10*timeout) + case <-ok: + } + }() + + fds := []unix.PollFd{{Fd: int32(f.Fd()), Events: unix.POLLIN}} + n, err := unix.Poll(fds, timeout) + ok <- true + if err != nil { + t.Errorf("Poll: unexpected error: %v", err) + return + } + if n != 0 { + t.Errorf("Poll: wrong number of events: got %v, expected %v", n, 0) + return + } +} + +func TestGetwd(t *testing.T) { + fd, err := os.Open(".") + if err != nil { + t.Fatalf("Open .: %s", err) + } + defer fd.Close() + // These are chosen carefully not to be symlinks on a Mac + // (unlike, say, /var, /etc) + dirs := []string{"/", "/usr/bin"} + switch runtime.GOOS { + case "android": + dirs = []string{"/", "/system/bin"} + case "darwin": + switch runtime.GOARCH { + case "arm", "arm64": + d1, err := ioutil.TempDir("", "d1") + if err != nil { + t.Fatalf("TempDir: %v", err) + } + d2, err := ioutil.TempDir("", "d2") + if err != nil { + t.Fatalf("TempDir: %v", err) + } + dirs = []string{d1, d2} + } + } + oldwd := os.Getenv("PWD") + for _, d := range dirs { + err = os.Chdir(d) + if err != nil { + t.Fatalf("Chdir: %v", err) + } + pwd, err := unix.Getwd() + if err != nil { + t.Fatalf("Getwd in %s: %s", d, err) + } + os.Setenv("PWD", oldwd) + err = fd.Chdir() + if err != nil { + // We changed the current directory and cannot go back. + // Don't let the tests continue; they'll scribble + // all over some other directory. + fmt.Fprintf(os.Stderr, "fchdir back to dot failed: %s\n", err) + os.Exit(1) + } + if pwd != d { + t.Fatalf("Getwd returned %q want %q", pwd, d) + } + } +} + +func TestFstatat(t *testing.T) { + defer chtmpdir(t)() + + touch(t, "file1") + + var st1 unix.Stat_t + err := unix.Stat("file1", &st1) + if err != nil { + t.Fatalf("Stat: %v", err) + } + + var st2 unix.Stat_t + err = unix.Fstatat(unix.AT_FDCWD, "file1", &st2, 0) + if err != nil { + t.Fatalf("Fstatat: %v", err) + } + + if st1 != st2 { + t.Errorf("Fstatat: returned stat does not match Stat") + } + + err = os.Symlink("file1", "symlink1") + if err != nil { + t.Fatal(err) + } + + err = unix.Lstat("symlink1", &st1) + if err != nil { + t.Fatalf("Lstat: %v", err) + } + + err = unix.Fstatat(unix.AT_FDCWD, "symlink1", &st2, unix.AT_SYMLINK_NOFOLLOW) + if err != nil { + t.Fatalf("Fstatat: %v", err) + } + + if st1 != st2 { + t.Errorf("Fstatat: returned stat does not match Lstat") + } +} + +func TestFchmodat(t *testing.T) { + defer chtmpdir(t)() + + touch(t, "file1") + err := os.Symlink("file1", "symlink1") + if err != nil { + t.Fatal(err) + } + + mode := os.FileMode(0444) + err = unix.Fchmodat(unix.AT_FDCWD, "symlink1", uint32(mode), 0) + if err != nil { + t.Fatalf("Fchmodat: unexpected error: %v", err) + } + + fi, err := os.Stat("file1") + if err != nil { + t.Fatal(err) + } + + if fi.Mode() != mode { + t.Errorf("Fchmodat: failed to change file mode: expected %v, got %v", mode, fi.Mode()) + } + + mode = os.FileMode(0644) + didChmodSymlink := true + err = unix.Fchmodat(unix.AT_FDCWD, "symlink1", uint32(mode), unix.AT_SYMLINK_NOFOLLOW) + if err != nil { + if (runtime.GOOS == "android" || runtime.GOOS == "linux" || runtime.GOOS == "solaris") && err == unix.EOPNOTSUPP { + // Linux and Illumos don't support flags != 0 + didChmodSymlink = false + } else { + t.Fatalf("Fchmodat: unexpected error: %v", err) + } + } + + if !didChmodSymlink { + // Didn't change mode of the symlink. On Linux, the permissions + // of a symbolic link are always 0777 according to symlink(7) + mode = os.FileMode(0777) + } + + var st unix.Stat_t + err = unix.Lstat("symlink1", &st) + if err != nil { + t.Fatal(err) + } + + got := os.FileMode(st.Mode & 0777) + if got != mode { + t.Errorf("Fchmodat: failed to change symlink mode: expected %v, got %v", mode, got) + } +} + +func TestMkdev(t *testing.T) { + major := uint32(42) + minor := uint32(7) + dev := unix.Mkdev(major, minor) + + if unix.Major(dev) != major { + t.Errorf("Major(%#x) == %d, want %d", dev, unix.Major(dev), major) + } + if unix.Minor(dev) != minor { + t.Errorf("Minor(%#x) == %d, want %d", dev, unix.Minor(dev), minor) + } +} + +// mktmpfifo creates a temporary FIFO and provides a cleanup function. +func mktmpfifo(t *testing.T) (*os.File, func()) { + err := unix.Mkfifo("fifo", 0666) + if err != nil { + t.Fatalf("mktmpfifo: failed to create FIFO: %v", err) + } + + f, err := os.OpenFile("fifo", os.O_RDWR, 0666) + if err != nil { + os.Remove("fifo") + t.Fatalf("mktmpfifo: failed to open FIFO: %v", err) + } + + return f, func() { + f.Close() + os.Remove("fifo") + } +} + +// utilities taken from os/os_test.go + +func touch(t *testing.T, name string) { + f, err := os.Create(name) + if err != nil { + t.Fatal(err) + } + if err := f.Close(); err != nil { + t.Fatal(err) + } +} + +// chtmpdir changes the working directory to a new temporary directory and +// provides a cleanup function. Used when PWD is read-only. +func chtmpdir(t *testing.T) func() { + oldwd, err := os.Getwd() + if err != nil { + t.Fatalf("chtmpdir: %v", err) + } + d, err := ioutil.TempDir("", "test") + if err != nil { + t.Fatalf("chtmpdir: %v", err) + } + if err := os.Chdir(d); err != nil { + t.Fatalf("chtmpdir: %v", err) + } + return func() { + if err := os.Chdir(oldwd); err != nil { + t.Fatalf("chtmpdir: %v", err) + } + os.RemoveAll(d) + } +} diff --git a/api/vendor/golang.org/x/sys/unix/timestruct.go b/api/vendor/golang.org/x/sys/unix/timestruct.go new file mode 100644 index 0000000..47b9011 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/timestruct.go @@ -0,0 +1,82 @@ +// 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +package unix + +import "time" + +// TimespecToNsec converts a Timespec value into a number of +// nanoseconds since the Unix epoch. +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +// NsecToTimespec takes a number of nanoseconds since the Unix epoch +// and returns the corresponding Timespec value. +func NsecToTimespec(nsec int64) Timespec { + sec := nsec / 1e9 + nsec = nsec % 1e9 + if nsec < 0 { + nsec += 1e9 + sec-- + } + return setTimespec(sec, nsec) +} + +// TimeToTimespec converts t into a Timespec. +// On some 32-bit systems the range of valid Timespec values are smaller +// than that of time.Time values. So if t is out of the valid range of +// Timespec, it returns a zero Timespec and ERANGE. +func TimeToTimespec(t time.Time) (Timespec, error) { + sec := t.Unix() + nsec := int64(t.Nanosecond()) + ts := setTimespec(sec, nsec) + + // Currently all targets have either int32 or int64 for Timespec.Sec. + // If there were a new target with floating point type for it, we have + // to consider the rounding error. + if int64(ts.Sec) != sec { + return Timespec{}, ERANGE + } + return ts, nil +} + +// TimevalToNsec converts a Timeval value into a number of nanoseconds +// since the Unix epoch. +func TimevalToNsec(tv Timeval) int64 { return int64(tv.Sec)*1e9 + int64(tv.Usec)*1e3 } + +// NsecToTimeval takes a number of nanoseconds since the Unix epoch +// and returns the corresponding Timeval value. +func NsecToTimeval(nsec int64) Timeval { + nsec += 999 // round up to microsecond + usec := nsec % 1e9 / 1e3 + sec := nsec / 1e9 + if usec < 0 { + usec += 1e6 + sec-- + } + return setTimeval(sec, usec) +} + +// Unix returns ts as the number of seconds and nanoseconds elapsed since the +// Unix epoch. +func (ts *Timespec) Unix() (sec int64, nsec int64) { + return int64(ts.Sec), int64(ts.Nsec) +} + +// Unix returns tv as the number of seconds and nanoseconds elapsed since the +// Unix epoch. +func (tv *Timeval) Unix() (sec int64, nsec int64) { + return int64(tv.Sec), int64(tv.Usec) * 1000 +} + +// Nano returns ts as the number of nanoseconds elapsed since the Unix epoch. +func (ts *Timespec) Nano() int64 { + return int64(ts.Sec)*1e9 + int64(ts.Nsec) +} + +// Nano returns tv as the number of nanoseconds elapsed since the Unix epoch. +func (tv *Timeval) Nano() int64 { + return int64(tv.Sec)*1e9 + int64(tv.Usec)*1000 +} diff --git a/api/vendor/golang.org/x/sys/unix/timestruct_test.go b/api/vendor/golang.org/x/sys/unix/timestruct_test.go new file mode 100644 index 0000000..4215f46 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/timestruct_test.go @@ -0,0 +1,54 @@ +// Copyright 2017 The Go Authors. All right reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +package unix_test + +import ( + "testing" + "time" + "unsafe" + + "golang.org/x/sys/unix" +) + +func TestTimeToTimespec(t *testing.T) { + timeTests := []struct { + time time.Time + valid bool + }{ + {time.Unix(0, 0), true}, + {time.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC), true}, + {time.Date(2262, time.December, 31, 23, 0, 0, 0, time.UTC), false}, + {time.Unix(0x7FFFFFFF, 0), true}, + {time.Unix(0x80000000, 0), false}, + {time.Unix(0x7FFFFFFF, 1000000000), false}, + {time.Unix(0x7FFFFFFF, 999999999), true}, + {time.Unix(-0x80000000, 0), true}, + {time.Unix(-0x80000001, 0), false}, + {time.Date(2038, time.January, 19, 3, 14, 7, 0, time.UTC), true}, + {time.Date(2038, time.January, 19, 3, 14, 8, 0, time.UTC), false}, + {time.Date(1901, time.December, 13, 20, 45, 52, 0, time.UTC), true}, + {time.Date(1901, time.December, 13, 20, 45, 51, 0, time.UTC), false}, + } + + // Currently all targets have either int32 or int64 for Timespec.Sec. + // If there were a new target with unsigned or floating point type for + // it, this test must be adjusted. + have64BitTime := (unsafe.Sizeof(unix.Timespec{}.Sec) == 8) + for _, tt := range timeTests { + ts, err := unix.TimeToTimespec(tt.time) + tt.valid = tt.valid || have64BitTime + if tt.valid && err != nil { + t.Errorf("TimeToTimespec(%v): %v", tt.time, err) + } + if err == nil { + tstime := time.Unix(int64(ts.Sec), int64(ts.Nsec)) + if !tstime.Equal(tt.time) { + t.Errorf("TimeToTimespec(%v) is the time %v", tt.time, tstime) + } + } + } +} diff --git a/api/vendor/golang.org/x/sys/unix/types_darwin.go b/api/vendor/golang.org/x/sys/unix/types_darwin.go new file mode 100644 index 0000000..46b9908 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/types_darwin.go @@ -0,0 +1,277 @@ +// 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. + +// +build ignore + +/* +Input to cgo -godefs. See README.md +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define __DARWIN_UNIX03 0 +#define KERNEL +#define _DARWIN_USE_64_BIT_INODE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +*/ +import "C" + +// Machine characteristics; for internal use. + +const ( + sizeofPtr = C.sizeofPtr + sizeofShort = C.sizeof_short + sizeofInt = C.sizeof_int + sizeofLong = C.sizeof_long + sizeofLongLong = C.sizeof_longlong +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +type Timeval32 C.struct_timeval32 + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +type Stat_t C.struct_stat64 + +type Statfs_t C.struct_statfs64 + +type Flock_t C.struct_flock + +type Fstore_t C.struct_fstore + +type Radvisory_t C.struct_radvisory + +type Fbootstraptransfer_t C.struct_fbootstraptransfer + +type Log2phys_t C.struct_log2phys + +type Fsid C.struct_fsid + +type Dirent C.struct_dirent + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet4Pktinfo C.struct_in_pktinfo + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet4Pktinfo = C.sizeof_struct_in_pktinfo + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Ptrace requests + +const ( + PTRACE_TRACEME = C.PT_TRACE_ME + PTRACE_CONT = C.PT_CONTINUE + PTRACE_KILL = C.PT_KILL +) + +// Events (kqueue, kevent) + +type Kevent_t C.struct_kevent + +// Select + +type FdSet C.fd_set + +// Routing and interface messages + +const ( + SizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfData = C.sizeof_struct_if_data + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofIfmaMsghdr = C.sizeof_struct_ifma_msghdr + SizeofIfmaMsghdr2 = C.sizeof_struct_ifma_msghdr2 + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type IfMsghdr C.struct_if_msghdr + +type IfData C.struct_if_data + +type IfaMsghdr C.struct_ifa_msghdr + +type IfmaMsghdr C.struct_ifma_msghdr + +type IfmaMsghdr2 C.struct_ifma_msghdr2 + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfHdr C.struct_bpf_hdr + +// Terminal handling + +type Termios C.struct_termios + +type Winsize C.struct_winsize + +// fchmodat-like syscalls. + +const ( + AT_FDCWD = C.AT_FDCWD + AT_REMOVEDIR = C.AT_REMOVEDIR + AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW +) + +// poll + +type PollFd C.struct_pollfd + +const ( + POLLERR = C.POLLERR + POLLHUP = C.POLLHUP + POLLIN = C.POLLIN + POLLNVAL = C.POLLNVAL + POLLOUT = C.POLLOUT + POLLPRI = C.POLLPRI + POLLRDBAND = C.POLLRDBAND + POLLRDNORM = C.POLLRDNORM + POLLWRBAND = C.POLLWRBAND + POLLWRNORM = C.POLLWRNORM +) + +// uname + +type Utsname C.struct_utsname diff --git a/api/vendor/golang.org/x/sys/unix/types_dragonfly.go b/api/vendor/golang.org/x/sys/unix/types_dragonfly.go new file mode 100644 index 0000000..0c63304 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/types_dragonfly.go @@ -0,0 +1,280 @@ +// 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. + +// +build ignore + +/* +Input to cgo -godefs. See README.md +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define KERNEL +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +*/ +import "C" + +// Machine characteristics; for internal use. + +const ( + sizeofPtr = C.sizeofPtr + sizeofShort = C.sizeof_short + sizeofInt = C.sizeof_int + sizeofLong = C.sizeof_long + sizeofLongLong = C.sizeof_longlong +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +const ( // Directory mode bits + S_IFMT = C.S_IFMT + S_IFIFO = C.S_IFIFO + S_IFCHR = C.S_IFCHR + S_IFDIR = C.S_IFDIR + S_IFBLK = C.S_IFBLK + S_IFREG = C.S_IFREG + S_IFLNK = C.S_IFLNK + S_IFSOCK = C.S_IFSOCK + S_ISUID = C.S_ISUID + S_ISGID = C.S_ISGID + S_ISVTX = C.S_ISVTX + S_IRUSR = C.S_IRUSR + S_IWUSR = C.S_IWUSR + S_IXUSR = C.S_IXUSR +) + +type Stat_t C.struct_stat + +type Statfs_t C.struct_statfs + +type Flock_t C.struct_flock + +type Dirent C.struct_dirent + +type Fsid C.struct_fsid + +// File system limits + +const ( + PathMax = C.PATH_MAX +) + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Ptrace requests + +const ( + PTRACE_TRACEME = C.PT_TRACE_ME + PTRACE_CONT = C.PT_CONTINUE + PTRACE_KILL = C.PT_KILL +) + +// Events (kqueue, kevent) + +type Kevent_t C.struct_kevent + +// Select + +type FdSet C.fd_set + +// Routing and interface messages + +const ( + SizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfData = C.sizeof_struct_if_data + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofIfmaMsghdr = C.sizeof_struct_ifma_msghdr + SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type IfMsghdr C.struct_if_msghdr + +type IfData C.struct_if_data + +type IfaMsghdr C.struct_ifa_msghdr + +type IfmaMsghdr C.struct_ifma_msghdr + +type IfAnnounceMsghdr C.struct_if_announcemsghdr + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfHdr C.struct_bpf_hdr + +// Terminal handling + +type Termios C.struct_termios + +type Winsize C.struct_winsize + +// fchmodat-like syscalls. + +const ( + AT_FDCWD = C.AT_FDCWD + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW +) + +// poll + +type PollFd C.struct_pollfd + +const ( + POLLERR = C.POLLERR + POLLHUP = C.POLLHUP + POLLIN = C.POLLIN + POLLNVAL = C.POLLNVAL + POLLOUT = C.POLLOUT + POLLPRI = C.POLLPRI + POLLRDBAND = C.POLLRDBAND + POLLRDNORM = C.POLLRDNORM + POLLWRBAND = C.POLLWRBAND + POLLWRNORM = C.POLLWRNORM +) + +// Uname + +type Utsname C.struct_utsname diff --git a/api/vendor/golang.org/x/sys/unix/types_freebsd.go b/api/vendor/golang.org/x/sys/unix/types_freebsd.go new file mode 100644 index 0000000..4eb02cd --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/types_freebsd.go @@ -0,0 +1,402 @@ +// 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. + +// +build ignore + +/* +Input to cgo -godefs. See README.md +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define KERNEL +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +// This structure is a duplicate of stat on FreeBSD 8-STABLE. +// See /usr/include/sys/stat.h. +struct stat8 { +#undef st_atimespec st_atim +#undef st_mtimespec st_mtim +#undef st_ctimespec st_ctim +#undef st_birthtimespec st_birthtim + __dev_t st_dev; + ino_t st_ino; + mode_t st_mode; + nlink_t st_nlink; + uid_t st_uid; + gid_t st_gid; + __dev_t st_rdev; +#if __BSD_VISIBLE + struct timespec st_atimespec; + struct timespec st_mtimespec; + struct timespec st_ctimespec; +#else + time_t st_atime; + long __st_atimensec; + time_t st_mtime; + long __st_mtimensec; + time_t st_ctime; + long __st_ctimensec; +#endif + off_t st_size; + blkcnt_t st_blocks; + blksize_t st_blksize; + fflags_t st_flags; + __uint32_t st_gen; + __int32_t st_lspare; +#if __BSD_VISIBLE + struct timespec st_birthtimespec; + unsigned int :(8 / 2) * (16 - (int)sizeof(struct timespec)); + unsigned int :(8 / 2) * (16 - (int)sizeof(struct timespec)); +#else + time_t st_birthtime; + long st_birthtimensec; + unsigned int :(8 / 2) * (16 - (int)sizeof(struct __timespec)); + unsigned int :(8 / 2) * (16 - (int)sizeof(struct __timespec)); +#endif +}; + +// This structure is a duplicate of if_data on FreeBSD 8-STABLE. +// See /usr/include/net/if.h. +struct if_data8 { + u_char ifi_type; + u_char ifi_physical; + u_char ifi_addrlen; + u_char ifi_hdrlen; + u_char ifi_link_state; + u_char ifi_spare_char1; + u_char ifi_spare_char2; + u_char ifi_datalen; + u_long ifi_mtu; + u_long ifi_metric; + u_long ifi_baudrate; + u_long ifi_ipackets; + u_long ifi_ierrors; + u_long ifi_opackets; + u_long ifi_oerrors; + u_long ifi_collisions; + u_long ifi_ibytes; + u_long ifi_obytes; + u_long ifi_imcasts; + u_long ifi_omcasts; + u_long ifi_iqdrops; + u_long ifi_noproto; + u_long ifi_hwassist; +// FIXME: these are now unions, so maybe need to change definitions? +#undef ifi_epoch + time_t ifi_epoch; +#undef ifi_lastchange + struct timeval ifi_lastchange; +}; + +// This structure is a duplicate of if_msghdr on FreeBSD 8-STABLE. +// See /usr/include/net/if.h. +struct if_msghdr8 { + u_short ifm_msglen; + u_char ifm_version; + u_char ifm_type; + int ifm_addrs; + int ifm_flags; + u_short ifm_index; + struct if_data8 ifm_data; +}; +*/ +import "C" + +// Machine characteristics; for internal use. + +const ( + sizeofPtr = C.sizeofPtr + sizeofShort = C.sizeof_short + sizeofInt = C.sizeof_int + sizeofLong = C.sizeof_long + sizeofLongLong = C.sizeof_longlong +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +const ( // Directory mode bits + S_IFMT = C.S_IFMT + S_IFIFO = C.S_IFIFO + S_IFCHR = C.S_IFCHR + S_IFDIR = C.S_IFDIR + S_IFBLK = C.S_IFBLK + S_IFREG = C.S_IFREG + S_IFLNK = C.S_IFLNK + S_IFSOCK = C.S_IFSOCK + S_ISUID = C.S_ISUID + S_ISGID = C.S_ISGID + S_ISVTX = C.S_ISVTX + S_IRUSR = C.S_IRUSR + S_IWUSR = C.S_IWUSR + S_IXUSR = C.S_IXUSR +) + +type Stat_t C.struct_stat8 + +type Statfs_t C.struct_statfs + +type Flock_t C.struct_flock + +type Dirent C.struct_dirent + +type Fsid C.struct_fsid + +// File system limits + +const ( + PathMax = C.PATH_MAX +) + +// Advice to Fadvise + +const ( + FADV_NORMAL = C.POSIX_FADV_NORMAL + FADV_RANDOM = C.POSIX_FADV_RANDOM + FADV_SEQUENTIAL = C.POSIX_FADV_SEQUENTIAL + FADV_WILLNEED = C.POSIX_FADV_WILLNEED + FADV_DONTNEED = C.POSIX_FADV_DONTNEED + FADV_NOREUSE = C.POSIX_FADV_NOREUSE +) + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPMreqn C.struct_ip_mreqn + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPMreqn = C.sizeof_struct_ip_mreqn + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Ptrace requests + +const ( + PTRACE_TRACEME = C.PT_TRACE_ME + PTRACE_CONT = C.PT_CONTINUE + PTRACE_KILL = C.PT_KILL +) + +// Events (kqueue, kevent) + +type Kevent_t C.struct_kevent + +// Select + +type FdSet C.fd_set + +// Routing and interface messages + +const ( + sizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfMsghdr = C.sizeof_struct_if_msghdr8 + sizeofIfData = C.sizeof_struct_if_data + SizeofIfData = C.sizeof_struct_if_data8 + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofIfmaMsghdr = C.sizeof_struct_ifma_msghdr + SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type ifMsghdr C.struct_if_msghdr + +type IfMsghdr C.struct_if_msghdr8 + +type ifData C.struct_if_data + +type IfData C.struct_if_data8 + +type IfaMsghdr C.struct_ifa_msghdr + +type IfmaMsghdr C.struct_ifma_msghdr + +type IfAnnounceMsghdr C.struct_if_announcemsghdr + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfZbuf = C.sizeof_struct_bpf_zbuf + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr + SizeofBpfZbufHeader = C.sizeof_struct_bpf_zbuf_header +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfZbuf C.struct_bpf_zbuf + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfHdr C.struct_bpf_hdr + +type BpfZbufHeader C.struct_bpf_zbuf_header + +// Terminal handling + +type Termios C.struct_termios + +type Winsize C.struct_winsize + +// fchmodat-like syscalls. + +const ( + AT_FDCWD = C.AT_FDCWD + AT_REMOVEDIR = C.AT_REMOVEDIR + AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW +) + +// poll + +type PollFd C.struct_pollfd + +const ( + POLLERR = C.POLLERR + POLLHUP = C.POLLHUP + POLLIN = C.POLLIN + POLLINIGNEOF = C.POLLINIGNEOF + POLLNVAL = C.POLLNVAL + POLLOUT = C.POLLOUT + POLLPRI = C.POLLPRI + POLLRDBAND = C.POLLRDBAND + POLLRDNORM = C.POLLRDNORM + POLLWRBAND = C.POLLWRBAND + POLLWRNORM = C.POLLWRNORM +) + +// Capabilities + +type CapRights C.struct_cap_rights + +// Uname + +type Utsname C.struct_utsname diff --git a/api/vendor/golang.org/x/sys/unix/types_netbsd.go b/api/vendor/golang.org/x/sys/unix/types_netbsd.go new file mode 100644 index 0000000..1494aaf --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/types_netbsd.go @@ -0,0 +1,281 @@ +// 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. + +// +build ignore + +/* +Input to cgo -godefs. See README.md +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define KERNEL +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +*/ +import "C" + +// Machine characteristics; for internal use. + +const ( + sizeofPtr = C.sizeofPtr + sizeofShort = C.sizeof_short + sizeofInt = C.sizeof_int + sizeofLong = C.sizeof_long + sizeofLongLong = C.sizeof_longlong +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +type Stat_t C.struct_stat + +type Statfs_t C.struct_statfs + +type Flock_t C.struct_flock + +type Dirent C.struct_dirent + +type Fsid C.fsid_t + +// File system limits + +const ( + PathMax = C.PATH_MAX +) + +// Advice to Fadvise + +const ( + FADV_NORMAL = C.POSIX_FADV_NORMAL + FADV_RANDOM = C.POSIX_FADV_RANDOM + FADV_SEQUENTIAL = C.POSIX_FADV_SEQUENTIAL + FADV_WILLNEED = C.POSIX_FADV_WILLNEED + FADV_DONTNEED = C.POSIX_FADV_DONTNEED + FADV_NOREUSE = C.POSIX_FADV_NOREUSE +) + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Ptrace requests + +const ( + PTRACE_TRACEME = C.PT_TRACE_ME + PTRACE_CONT = C.PT_CONTINUE + PTRACE_KILL = C.PT_KILL +) + +// Events (kqueue, kevent) + +type Kevent_t C.struct_kevent + +// Select + +type FdSet C.fd_set + +// Routing and interface messages + +const ( + SizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfData = C.sizeof_struct_if_data + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type IfMsghdr C.struct_if_msghdr + +type IfData C.struct_if_data + +type IfaMsghdr C.struct_ifa_msghdr + +type IfAnnounceMsghdr C.struct_if_announcemsghdr + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +type Mclpool C.struct_mclpool + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfHdr C.struct_bpf_hdr + +type BpfTimeval C.struct_bpf_timeval + +// Terminal handling + +type Termios C.struct_termios + +type Winsize C.struct_winsize + +// fchmodat-like syscalls. + +const ( + AT_FDCWD = C.AT_FDCWD + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW +) + +// poll + +type PollFd C.struct_pollfd + +const ( + POLLERR = C.POLLERR + POLLHUP = C.POLLHUP + POLLIN = C.POLLIN + POLLNVAL = C.POLLNVAL + POLLOUT = C.POLLOUT + POLLPRI = C.POLLPRI + POLLRDBAND = C.POLLRDBAND + POLLRDNORM = C.POLLRDNORM + POLLWRBAND = C.POLLWRBAND + POLLWRNORM = C.POLLWRNORM +) + +// Sysctl + +type Sysctlnode C.struct_sysctlnode + +// Uname + +type Utsname C.struct_utsname diff --git a/api/vendor/golang.org/x/sys/unix/types_openbsd.go b/api/vendor/golang.org/x/sys/unix/types_openbsd.go new file mode 100644 index 0000000..649e559 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/types_openbsd.go @@ -0,0 +1,282 @@ +// 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. + +// +build ignore + +/* +Input to cgo -godefs. See README.md +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define KERNEL +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +*/ +import "C" + +// Machine characteristics; for internal use. + +const ( + sizeofPtr = C.sizeofPtr + sizeofShort = C.sizeof_short + sizeofInt = C.sizeof_int + sizeofLong = C.sizeof_long + sizeofLongLong = C.sizeof_longlong +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +const ( // Directory mode bits + S_IFMT = C.S_IFMT + S_IFIFO = C.S_IFIFO + S_IFCHR = C.S_IFCHR + S_IFDIR = C.S_IFDIR + S_IFBLK = C.S_IFBLK + S_IFREG = C.S_IFREG + S_IFLNK = C.S_IFLNK + S_IFSOCK = C.S_IFSOCK + S_ISUID = C.S_ISUID + S_ISGID = C.S_ISGID + S_ISVTX = C.S_ISVTX + S_IRUSR = C.S_IRUSR + S_IWUSR = C.S_IWUSR + S_IXUSR = C.S_IXUSR +) + +type Stat_t C.struct_stat + +type Statfs_t C.struct_statfs + +type Flock_t C.struct_flock + +type Dirent C.struct_dirent + +type Fsid C.fsid_t + +// File system limits + +const ( + PathMax = C.PATH_MAX +) + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Ptrace requests + +const ( + PTRACE_TRACEME = C.PT_TRACE_ME + PTRACE_CONT = C.PT_CONTINUE + PTRACE_KILL = C.PT_KILL +) + +// Events (kqueue, kevent) + +type Kevent_t C.struct_kevent + +// Select + +type FdSet C.fd_set + +// Routing and interface messages + +const ( + SizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfData = C.sizeof_struct_if_data + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type IfMsghdr C.struct_if_msghdr + +type IfData C.struct_if_data + +type IfaMsghdr C.struct_ifa_msghdr + +type IfAnnounceMsghdr C.struct_if_announcemsghdr + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +type Mclpool C.struct_mclpool + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfHdr C.struct_bpf_hdr + +type BpfTimeval C.struct_bpf_timeval + +// Terminal handling + +type Termios C.struct_termios + +type Winsize C.struct_winsize + +// fchmodat-like syscalls. + +const ( + AT_FDCWD = C.AT_FDCWD + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW +) + +// poll + +type PollFd C.struct_pollfd + +const ( + POLLERR = C.POLLERR + POLLHUP = C.POLLHUP + POLLIN = C.POLLIN + POLLNVAL = C.POLLNVAL + POLLOUT = C.POLLOUT + POLLPRI = C.POLLPRI + POLLRDBAND = C.POLLRDBAND + POLLRDNORM = C.POLLRDNORM + POLLWRBAND = C.POLLWRBAND + POLLWRNORM = C.POLLWRNORM +) + +// Uname + +type Utsname C.struct_utsname diff --git a/api/vendor/golang.org/x/sys/unix/types_solaris.go b/api/vendor/golang.org/x/sys/unix/types_solaris.go new file mode 100644 index 0000000..f777155 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/types_solaris.go @@ -0,0 +1,283 @@ +// 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. + +// +build ignore + +/* +Input to cgo -godefs. See README.md +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define KERNEL +// These defines ensure that builds done on newer versions of Solaris are +// backwards-compatible with older versions of Solaris and +// OpenSolaris-based derivatives. +#define __USE_SUNOS_SOCKETS__ // msghdr +#define __USE_LEGACY_PROTOTYPES__ // iovec +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +*/ +import "C" + +// Machine characteristics; for internal use. + +const ( + sizeofPtr = C.sizeofPtr + sizeofShort = C.sizeof_short + sizeofInt = C.sizeof_int + sizeofLong = C.sizeof_long + sizeofLongLong = C.sizeof_longlong + PathMax = C.PATH_MAX + MaxHostNameLen = C.MAXHOSTNAMELEN +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +type Timeval32 C.struct_timeval32 + +type Tms C.struct_tms + +type Utimbuf C.struct_utimbuf + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +const ( // Directory mode bits + S_IFMT = C.S_IFMT + S_IFIFO = C.S_IFIFO + S_IFCHR = C.S_IFCHR + S_IFDIR = C.S_IFDIR + S_IFBLK = C.S_IFBLK + S_IFREG = C.S_IFREG + S_IFLNK = C.S_IFLNK + S_IFSOCK = C.S_IFSOCK + S_ISUID = C.S_ISUID + S_ISGID = C.S_ISGID + S_ISVTX = C.S_ISVTX + S_IRUSR = C.S_IRUSR + S_IWUSR = C.S_IWUSR + S_IXUSR = C.S_IXUSR +) + +type Stat_t C.struct_stat + +type Flock_t C.struct_flock + +type Dirent C.struct_dirent + +// Filesystems + +type _Fsblkcnt_t C.fsblkcnt_t + +type Statvfs_t C.struct_statvfs + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Select + +type FdSet C.fd_set + +// Misc + +type Utsname C.struct_utsname + +type Ustat_t C.struct_ustat + +const ( + AT_FDCWD = C.AT_FDCWD + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW + AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW + AT_REMOVEDIR = C.AT_REMOVEDIR + AT_EACCESS = C.AT_EACCESS +) + +// Routing and interface messages + +const ( + SizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfData = C.sizeof_struct_if_data + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type IfMsghdr C.struct_if_msghdr + +type IfData C.struct_if_data + +type IfaMsghdr C.struct_ifa_msghdr + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfTimeval C.struct_bpf_timeval + +type BpfHdr C.struct_bpf_hdr + +// Terminal handling + +type Termios C.struct_termios + +type Termio C.struct_termio + +type Winsize C.struct_winsize + +// poll + +type PollFd C.struct_pollfd + +const ( + POLLERR = C.POLLERR + POLLHUP = C.POLLHUP + POLLIN = C.POLLIN + POLLNVAL = C.POLLNVAL + POLLOUT = C.POLLOUT + POLLPRI = C.POLLPRI + POLLRDBAND = C.POLLRDBAND + POLLRDNORM = C.POLLRDNORM + POLLWRBAND = C.POLLWRBAND + POLLWRNORM = C.POLLWRNORM +) diff --git a/api/vendor/golang.org/x/sys/unix/xattr_test.go b/api/vendor/golang.org/x/sys/unix/xattr_test.go new file mode 100644 index 0000000..b8b28d0 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/xattr_test.go @@ -0,0 +1,119 @@ +// 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 darwin freebsd linux + +package unix_test + +import ( + "os" + "runtime" + "strings" + "testing" + + "golang.org/x/sys/unix" +) + +func TestXattr(t *testing.T) { + defer chtmpdir(t)() + + f := "xattr1" + touch(t, f) + + xattrName := "user.test" + xattrDataSet := "gopher" + err := unix.Setxattr(f, xattrName, []byte(xattrDataSet), 0) + if err == unix.ENOTSUP || err == unix.EOPNOTSUPP { + t.Skip("filesystem does not support extended attributes, skipping test") + } else if err != nil { + t.Fatalf("Setxattr: %v", err) + } + + // find size + size, err := unix.Listxattr(f, nil) + if err != nil { + t.Fatalf("Listxattr: %v", err) + } + + if size <= 0 { + t.Fatalf("Listxattr returned an empty list of attributes") + } + + buf := make([]byte, size) + read, err := unix.Listxattr(f, buf) + if err != nil { + t.Fatalf("Listxattr: %v", err) + } + + xattrs := stringsFromByteSlice(buf[:read]) + + xattrWant := xattrName + if runtime.GOOS == "freebsd" { + // On FreeBSD, the namespace is stored separately from the xattr + // name and Listxattr doesn't return the namespace prefix. + xattrWant = strings.TrimPrefix(xattrWant, "user.") + } + found := false + for _, name := range xattrs { + if name == xattrWant { + found = true + } + } + + if !found { + t.Errorf("Listxattr did not return previously set attribute '%s'", xattrName) + } + + // find size + size, err = unix.Getxattr(f, xattrName, nil) + if err != nil { + t.Fatalf("Getxattr: %v", err) + } + + if size <= 0 { + t.Fatalf("Getxattr returned an empty attribute") + } + + xattrDataGet := make([]byte, size) + _, err = unix.Getxattr(f, xattrName, xattrDataGet) + if err != nil { + t.Fatalf("Getxattr: %v", err) + } + + got := string(xattrDataGet) + if got != xattrDataSet { + t.Errorf("Getxattr: expected attribute value %s, got %s", xattrDataSet, got) + } + + err = unix.Removexattr(f, xattrName) + if err != nil { + t.Fatalf("Removexattr: %v", err) + } + + n := "nonexistent" + err = unix.Lsetxattr(n, xattrName, []byte(xattrDataSet), 0) + if err != unix.ENOENT { + t.Errorf("Lsetxattr: expected %v on non-existent file, got %v", unix.ENOENT, err) + } + + _, err = unix.Lgetxattr(n, xattrName, nil) + if err != unix.ENOENT { + t.Errorf("Lgetxattr: %v", err) + } + + s := "symlink1" + err = os.Symlink(n, s) + if err != nil { + t.Fatal(err) + } + + err = unix.Lsetxattr(s, xattrName, []byte(xattrDataSet), 0) + if err != nil { + // Linux and Android doen't support xattrs on symlinks according + // to xattr(7), so just test that we get the proper error. + if (runtime.GOOS != "linux" && runtime.GOOS != "android") || err != unix.EPERM { + t.Fatalf("Lsetxattr: %v", err) + } + } +} diff --git a/api/vendor/golang.org/x/sys/unix/zerrors_darwin_386.go b/api/vendor/golang.org/x/sys/unix/zerrors_darwin_386.go new file mode 100644 index 0000000..3b39d74 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zerrors_darwin_386.go @@ -0,0 +1,1783 @@ +// mkerrors.sh -m32 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,darwin + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m32 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1c + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1e + AF_IPX = 0x17 + AF_ISDN = 0x1c + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x28 + AF_NATM = 0x1f + AF_NDRV = 0x1b + AF_NETBIOS = 0x21 + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PPP = 0x22 + AF_PUP = 0x4 + AF_RESERVED_36 = 0x24 + AF_ROUTE = 0x11 + AF_SIP = 0x18 + AF_SNA = 0xb + AF_SYSTEM = 0x20 + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_UTUN = 0x26 + ALTWERASE = 0x200 + ATTR_BIT_MAP_COUNT = 0x5 + ATTR_CMN_ACCESSMASK = 0x20000 + ATTR_CMN_ACCTIME = 0x1000 + ATTR_CMN_ADDEDTIME = 0x10000000 + ATTR_CMN_BKUPTIME = 0x2000 + ATTR_CMN_CHGTIME = 0x800 + ATTR_CMN_CRTIME = 0x200 + ATTR_CMN_DATA_PROTECT_FLAGS = 0x40000000 + ATTR_CMN_DEVID = 0x2 + ATTR_CMN_DOCUMENT_ID = 0x100000 + ATTR_CMN_ERROR = 0x20000000 + ATTR_CMN_EXTENDED_SECURITY = 0x400000 + ATTR_CMN_FILEID = 0x2000000 + ATTR_CMN_FLAGS = 0x40000 + ATTR_CMN_FNDRINFO = 0x4000 + ATTR_CMN_FSID = 0x4 + ATTR_CMN_FULLPATH = 0x8000000 + ATTR_CMN_GEN_COUNT = 0x80000 + ATTR_CMN_GRPID = 0x10000 + ATTR_CMN_GRPUUID = 0x1000000 + ATTR_CMN_MODTIME = 0x400 + ATTR_CMN_NAME = 0x1 + ATTR_CMN_NAMEDATTRCOUNT = 0x80000 + ATTR_CMN_NAMEDATTRLIST = 0x100000 + ATTR_CMN_OBJID = 0x20 + ATTR_CMN_OBJPERMANENTID = 0x40 + ATTR_CMN_OBJTAG = 0x10 + ATTR_CMN_OBJTYPE = 0x8 + ATTR_CMN_OWNERID = 0x8000 + ATTR_CMN_PARENTID = 0x4000000 + ATTR_CMN_PAROBJID = 0x80 + ATTR_CMN_RETURNED_ATTRS = 0x80000000 + ATTR_CMN_SCRIPT = 0x100 + ATTR_CMN_SETMASK = 0x41c7ff00 + ATTR_CMN_USERACCESS = 0x200000 + ATTR_CMN_UUID = 0x800000 + ATTR_CMN_VALIDMASK = 0xffffffff + ATTR_CMN_VOLSETMASK = 0x6700 + ATTR_FILE_ALLOCSIZE = 0x4 + ATTR_FILE_CLUMPSIZE = 0x10 + ATTR_FILE_DATAALLOCSIZE = 0x400 + ATTR_FILE_DATAEXTENTS = 0x800 + ATTR_FILE_DATALENGTH = 0x200 + ATTR_FILE_DEVTYPE = 0x20 + ATTR_FILE_FILETYPE = 0x40 + ATTR_FILE_FORKCOUNT = 0x80 + ATTR_FILE_FORKLIST = 0x100 + ATTR_FILE_IOBLOCKSIZE = 0x8 + ATTR_FILE_LINKCOUNT = 0x1 + ATTR_FILE_RSRCALLOCSIZE = 0x2000 + ATTR_FILE_RSRCEXTENTS = 0x4000 + ATTR_FILE_RSRCLENGTH = 0x1000 + ATTR_FILE_SETMASK = 0x20 + ATTR_FILE_TOTALSIZE = 0x2 + ATTR_FILE_VALIDMASK = 0x37ff + ATTR_VOL_ALLOCATIONCLUMP = 0x40 + ATTR_VOL_ATTRIBUTES = 0x40000000 + ATTR_VOL_CAPABILITIES = 0x20000 + ATTR_VOL_DIRCOUNT = 0x400 + ATTR_VOL_ENCODINGSUSED = 0x10000 + ATTR_VOL_FILECOUNT = 0x200 + ATTR_VOL_FSTYPE = 0x1 + ATTR_VOL_INFO = 0x80000000 + ATTR_VOL_IOBLOCKSIZE = 0x80 + ATTR_VOL_MAXOBJCOUNT = 0x800 + ATTR_VOL_MINALLOCATION = 0x20 + ATTR_VOL_MOUNTEDDEVICE = 0x8000 + ATTR_VOL_MOUNTFLAGS = 0x4000 + ATTR_VOL_MOUNTPOINT = 0x1000 + ATTR_VOL_NAME = 0x2000 + ATTR_VOL_OBJCOUNT = 0x100 + ATTR_VOL_QUOTA_SIZE = 0x10000000 + ATTR_VOL_RESERVED_SIZE = 0x20000000 + ATTR_VOL_SETMASK = 0x80002000 + ATTR_VOL_SIGNATURE = 0x2 + ATTR_VOL_SIZE = 0x4 + ATTR_VOL_SPACEAVAIL = 0x10 + ATTR_VOL_SPACEFREE = 0x8 + ATTR_VOL_UUID = 0x40000 + ATTR_VOL_VALIDMASK = 0xf007ffff + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B9600 = 0x2580 + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc00c4279 + BIOCGETIF = 0x4020426b + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4008426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044278 + BIOCSETF = 0x80084267 + BIOCSETFNR = 0x8008427e + BIOCSETIF = 0x8020426c + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8008426d + BIOCSSEESENT = 0x80044277 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x8000 + BSDLY = 0x8000 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_MONOTONIC_RAW_APPROX = 0x5 + CLOCK_PROCESS_CPUTIME_ID = 0xc + CLOCK_REALTIME = 0x0 + CLOCK_THREAD_CPUTIME_ID = 0x10 + CLOCK_UPTIME_RAW = 0x8 + CLOCK_UPTIME_RAW_APPROX = 0x9 + CR0 = 0x0 + CR1 = 0x1000 + CR2 = 0x2000 + CR3 = 0x3000 + CRDLY = 0x3000 + CREAD = 0x800 + CRTSCTS = 0x30000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0xf5 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_EXCEPT = -0xf + EVFILT_FS = -0x9 + EVFILT_MACHPORT = -0x8 + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xf + EVFILT_THREADMARKER = 0xf + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xa + EVFILT_VM = -0xc + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_DISPATCH2 = 0x180 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG0 = 0x1000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_OOBAND = 0x2000 + EV_POLL = 0x1000 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EV_UDATA_SPECIFIC = 0x100 + EV_VANISHED = 0x200 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x4000 + FFDLY = 0x4000 + FLUSHO = 0x800000 + FSOPT_ATTR_CMN_EXTENDED = 0x20 + FSOPT_NOFOLLOW = 0x1 + FSOPT_NOINMEMUPDATE = 0x2 + FSOPT_PACK_INVAL_ATTRS = 0x8 + FSOPT_REPORT_FULLSIZE = 0x4 + F_ADDFILESIGS = 0x3d + F_ADDFILESIGS_FOR_DYLD_SIM = 0x53 + F_ADDFILESIGS_RETURN = 0x61 + F_ADDSIGS = 0x3b + F_ALLOCATEALL = 0x4 + F_ALLOCATECONTIG = 0x2 + F_BARRIERFSYNC = 0x55 + F_CHECK_LV = 0x62 + F_CHKCLEAN = 0x29 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x43 + F_FINDSIGS = 0x4e + F_FLUSH_DATA = 0x28 + F_FREEZE_FS = 0x35 + F_FULLFSYNC = 0x33 + F_GETCODEDIR = 0x48 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETLKPID = 0x42 + F_GETNOSIGPIPE = 0x4a + F_GETOWN = 0x5 + F_GETPATH = 0x32 + F_GETPATH_MTMINFO = 0x47 + F_GETPROTECTIONCLASS = 0x3f + F_GETPROTECTIONLEVEL = 0x4d + F_GLOBAL_NOCACHE = 0x37 + F_LOG2PHYS = 0x31 + F_LOG2PHYS_EXT = 0x41 + F_NOCACHE = 0x30 + F_NODIRECT = 0x3e + F_OK = 0x0 + F_PATHPKG_CHECK = 0x34 + F_PEOFPOSMODE = 0x3 + F_PREALLOCATE = 0x2a + F_PUNCHHOLE = 0x63 + F_RDADVISE = 0x2c + F_RDAHEAD = 0x2d + F_RDLCK = 0x1 + F_SETBACKINGSTORE = 0x46 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETLKWTIMEOUT = 0xa + F_SETNOSIGPIPE = 0x49 + F_SETOWN = 0x6 + F_SETPROTECTIONCLASS = 0x40 + F_SETSIZE = 0x2b + F_SINGLE_WRITER = 0x4c + F_THAW_FS = 0x36 + F_TRANSCODEKEY = 0x4b + F_TRIM_ACTIVE_FILE = 0x64 + F_UNLCK = 0x2 + F_VOLPOSMODE = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_AAL5 = 0x31 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ATM = 0x25 + IFT_BRIDGE = 0xd1 + IFT_CARP = 0xf8 + IFT_CELLULAR = 0xff + IFT_CEPT = 0x13 + IFT_DS3 = 0x1e + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_ETHER = 0x6 + IFT_FAITH = 0x38 + IFT_FDDI = 0xf + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_GIF = 0x37 + IFT_HDH1822 = 0x3 + IFT_HIPPI = 0x2f + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IEEE1394 = 0x90 + IFT_IEEE8023ADLAG = 0x88 + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88026 = 0xa + IFT_L2VLAN = 0x87 + IFT_LAPB = 0x10 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_NSIP = 0x1b + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PDP = 0xff + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PKTAP = 0xfe + IFT_PPP = 0x17 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PTPSERIAL = 0x16 + IFT_RS232 = 0x21 + IFT_SDLC = 0x11 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_STARLAN = 0xb + IFT_STF = 0x39 + IFT_T1 = 0x12 + IFT_ULTRA = 0x1d + IFT_V35 = 0x2d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LINKLOCALNETNUM = 0xa9fe0000 + IN_LOOPBACKNET = 0x7f + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0xfe + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MEAS = 0x13 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEP = 0x21 + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_2292DSTOPTS = 0x17 + IPV6_2292HOPLIMIT = 0x14 + IPV6_2292HOPOPTS = 0x16 + IPV6_2292NEXTHOP = 0x15 + IPV6_2292PKTINFO = 0x13 + IPV6_2292PKTOPTIONS = 0x19 + IPV6_2292RTHDR = 0x18 + IPV6_BINDV6ONLY = 0x1b + IPV6_BOUND_IF = 0x7d + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FLOW_ECN_MASK = 0x300 + IPV6_FRAGTTL = 0x3c + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVTCLASS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x24 + IPV6_UNICAST_HOPS = 0x4 + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BLOCK_SOURCE = 0x48 + IP_BOUND_IF = 0x19 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FAITH = 0x16 + IP_FW_ADD = 0x28 + IP_FW_DEL = 0x29 + IP_FW_FLUSH = 0x2a + IP_FW_GET = 0x2c + IP_FW_RESETLOG = 0x2d + IP_FW_ZERO = 0x2b + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MF = 0x2000 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_IFINDEX = 0x42 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_NAT__XXX = 0x37 + IP_OFFMASK = 0x1fff + IP_OLD_FW_ADD = 0x32 + IP_OLD_FW_DEL = 0x33 + IP_OLD_FW_FLUSH = 0x34 + IP_OLD_FW_GET = 0x36 + IP_OLD_FW_RESETLOG = 0x38 + IP_OLD_FW_ZERO = 0x35 + IP_OPTIONS = 0x1 + IP_PKTINFO = 0x1a + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVPKTINFO = 0x1a + IP_RECVRETOPTS = 0x6 + IP_RECVTOS = 0x1b + IP_RECVTTL = 0x18 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_STRIPHDR = 0x17 + IP_TOS = 0x3 + IP_TRAFFIC_MGT_BACKGROUND = 0x41 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_CAN_REUSE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_FREE_REUSABLE = 0x7 + MADV_FREE_REUSE = 0x8 + MADV_NORMAL = 0x0 + MADV_PAGEOUT = 0xa + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MADV_ZERO_WIRED_PAGES = 0x6 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_JIT = 0x800 + MAP_NOCACHE = 0x400 + MAP_NOEXTEND = 0x100 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_RESERVED0080 = 0x80 + MAP_RESILIENT_CODESIGN = 0x2000 + MAP_RESILIENT_MEDIA = 0x4000 + MAP_SHARED = 0x1 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x400000 + MNT_CMDFLAGS = 0xf0000 + MNT_CPROTECT = 0x80 + MNT_DEFWRITE = 0x2000000 + MNT_DONTBROWSE = 0x100000 + MNT_DOVOLFS = 0x8000 + MNT_DWAIT = 0x4 + MNT_EXPORTED = 0x100 + MNT_FORCE = 0x80000 + MNT_IGNORE_OWNERSHIP = 0x200000 + MNT_JOURNALED = 0x800000 + MNT_LOCAL = 0x1000 + MNT_MULTILABEL = 0x4000000 + MNT_NOATIME = 0x10000000 + MNT_NOBLOCK = 0x20000 + MNT_NODEV = 0x10 + MNT_NOEXEC = 0x4 + MNT_NOSUID = 0x8 + MNT_NOUSERXATTR = 0x1000000 + MNT_NOWAIT = 0x2 + MNT_QUARANTINE = 0x400 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UNKNOWNPERMISSIONS = 0x200000 + MNT_UPDATE = 0x10000 + MNT_VISFLAGMASK = 0x17f0f5ff + MNT_WAIT = 0x1 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_FLUSH = 0x400 + MSG_HAVEMORE = 0x2000 + MSG_HOLD = 0x800 + MSG_NEEDSA = 0x10000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_RCVMORE = 0x4000 + MSG_SEND = 0x1000 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITSTREAM = 0x200 + MS_ASYNC = 0x1 + MS_DEACTIVATE = 0x8 + MS_INVALIDATE = 0x2 + MS_KILLPAGES = 0x4 + MS_SYNC = 0x10 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_DUMP2 = 0x7 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLIST2 = 0x6 + NET_RT_MAXID = 0xa + NET_RT_STAT = 0x4 + NET_RT_TRASH = 0x5 + NL0 = 0x0 + NL1 = 0x100 + NL2 = 0x200 + NL3 = 0x300 + NLDLY = 0x300 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ABSOLUTE = 0x8 + NOTE_ATTRIB = 0x8 + NOTE_BACKGROUND = 0x40 + NOTE_CHILD = 0x4 + NOTE_CRITICAL = 0x20 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXITSTATUS = 0x4000000 + NOTE_EXIT_CSERROR = 0x40000 + NOTE_EXIT_DECRYPTFAIL = 0x10000 + NOTE_EXIT_DETAIL = 0x2000000 + NOTE_EXIT_DETAIL_MASK = 0x70000 + NOTE_EXIT_MEMORY = 0x20000 + NOTE_EXIT_REPARENTED = 0x80000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FORK = 0x40000000 + NOTE_FUNLOCK = 0x100 + NOTE_LEEWAY = 0x10 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_MACH_CONTINUOUS_TIME = 0x80 + NOTE_NONE = 0x80 + NOTE_NSECONDS = 0x4 + NOTE_OOB = 0x2 + NOTE_PCTRLMASK = -0x100000 + NOTE_PDATAMASK = 0xfffff + NOTE_REAP = 0x10000000 + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_SIGNAL = 0x8000000 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x2 + NOTE_VM_ERROR = 0x10000000 + NOTE_VM_PRESSURE = 0x80000000 + NOTE_VM_PRESSURE_SUDDEN_TERMINATE = 0x20000000 + NOTE_VM_PRESSURE_TERMINATE = 0x40000000 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OFDEL = 0x20000 + OFILL = 0x80 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_ALERT = 0x20000000 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x1000000 + O_CREAT = 0x200 + O_DIRECTORY = 0x100000 + O_DP_GETRAWENCRYPTED = 0x1 + O_DP_GETRAWUNENCRYPTED = 0x2 + O_DSYNC = 0x400000 + O_EVTONLY = 0x8000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x20000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_POPUP = 0x80000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYMLINK = 0x200000 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PT_ATTACH = 0xa + PT_ATTACHEXC = 0xe + PT_CONTINUE = 0x7 + PT_DENY_ATTACH = 0x1f + PT_DETACH = 0xb + PT_FIRSTMACH = 0x20 + PT_FORCEQUOTA = 0x1e + PT_KILL = 0x8 + PT_READ_D = 0x2 + PT_READ_I = 0x1 + PT_READ_U = 0x3 + PT_SIGEXC = 0xc + PT_STEP = 0x9 + PT_THUPDATE = 0xd + PT_TRACE_ME = 0x0 + PT_WRITE_D = 0x5 + PT_WRITE_I = 0x4 + PT_WRITE_U = 0x6 + RLIMIT_AS = 0x5 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_CPU_USAGE_MONITOR = 0x2 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_CLONING = 0x100 + RTF_CONDEMNED = 0x2000000 + RTF_DELCLONE = 0x80 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_IFREF = 0x4000000 + RTF_IFSCOPE = 0x1000000 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_NOIFREF = 0x2000 + RTF_PINNED = 0x100000 + RTF_PRCLONING = 0x10000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_PROXY = 0x8000000 + RTF_REJECT = 0x8 + RTF_ROUTER = 0x10000000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_WASCLONED = 0x20000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_GET2 = 0x14 + RTM_IFINFO = 0xe + RTM_IFINFO2 = 0x12 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_NEWMADDR2 = 0x13 + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SCM_TIMESTAMP_MONOTONIC = 0x4 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCARPIPLL = 0xc0206928 + SIOCATMARK = 0x40047307 + SIOCAUTOADDR = 0xc0206926 + SIOCAUTONETMASK = 0x80206927 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFPHYADDR = 0x80206941 + SIOCGDRVSPEC = 0xc01c697b + SIOCGETVLAN = 0xc020697f + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFALTMTU = 0xc0206948 + SIOCGIFASYNCMAP = 0xc020697c + SIOCGIFBOND = 0xc0206947 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020695b + SIOCGIFCONF = 0xc0086924 + SIOCGIFDEVMTU = 0xc0206944 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFKPI = 0xc0206987 + SIOCGIFMAC = 0xc0206982 + SIOCGIFMEDIA = 0xc0286938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206940 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc020693f + SIOCGIFSTATUS = 0xc331693d + SIOCGIFVLAN = 0xc020697f + SIOCGIFWAKEFLAGS = 0xc0206988 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCIFCREATE = 0xc0206978 + SIOCIFCREATE2 = 0xc020697a + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc00c6981 + SIOCRSLVMULTI = 0xc008693b + SIOCSDRVSPEC = 0x801c697b + SIOCSETVLAN = 0x8020697e + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFALTMTU = 0x80206945 + SIOCSIFASYNCMAP = 0x8020697d + SIOCSIFBOND = 0x80206946 + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020695a + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFKPI = 0x80206986 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206983 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x8040693e + SIOCSIFPHYS = 0x80206936 + SIOCSIFVLAN = 0x8020697e + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_DONTTRUNC = 0x2000 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1010 + SO_LINGER = 0x80 + SO_LINGER_SEC = 0x1080 + SO_NETSVC_MARKING_LEVEL = 0x1119 + SO_NET_SERVICE_TYPE = 0x1116 + SO_NKE = 0x1021 + SO_NOADDRERR = 0x1023 + SO_NOSIGPIPE = 0x1022 + SO_NOTIFYCONFLICT = 0x1026 + SO_NP_EXTENSIONS = 0x1083 + SO_NREAD = 0x1020 + SO_NUMRCVPKT = 0x1112 + SO_NWRITE = 0x1024 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1011 + SO_RANDOMPORT = 0x1082 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_REUSESHAREUID = 0x1025 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TIMESTAMP_MONOTONIC = 0x800 + SO_TYPE = 0x1008 + SO_UPCALLCLOSEWAIT = 0x1027 + SO_USELOOPBACK = 0x40 + SO_WANTMORE = 0x4000 + SO_WANTOOBFLAG = 0x8000 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFWHT = 0xe000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x400 + TAB2 = 0x800 + TAB3 = 0x4 + TABDLY = 0xc04 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCP_CONNECTIONTIMEOUT = 0x20 + TCP_CONNECTION_INFO = 0x106 + TCP_ENABLE_ECN = 0x104 + TCP_FASTOPEN = 0x105 + TCP_KEEPALIVE = 0x10 + TCP_KEEPCNT = 0x102 + TCP_KEEPINTVL = 0x101 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MINMSS = 0xd8 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_NOTSENT_LOWAT = 0x201 + TCP_RXT_CONNDROPTIME = 0x80 + TCP_RXT_FINDROP = 0x100 + TCP_SENDMOREACKS = 0x103 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x40087458 + TIOCDRAIN = 0x2000745e + TIOCDSIMICROCODE = 0x20007455 + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGWINSZ = 0x40087468 + TIOCIXOFF = 0x20007480 + TIOCIXON = 0x20007481 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMODG = 0x40047403 + TIOCMODS = 0x80047404 + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTYGNAME = 0x40807453 + TIOCPTYGRANT = 0x20007454 + TIOCPTYUNLK = 0x20007452 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCONS = 0x20007463 + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2000745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40087459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VM_LOADAVG = 0x2 + VM_MACHFACTOR = 0x4 + VM_MAXID = 0x6 + VM_METER = 0x1 + VM_SWAPUSAGE = 0x5 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VT0 = 0x0 + VT1 = 0x10000 + VTDLY = 0x10000 + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x10 + WCOREFLAG = 0x80 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOWAIT = 0x20 + WORDSIZE = 0x20 + WSTOPPED = 0x8 + WUNTRACED = 0x2 + XATTR_CREATE = 0x2 + XATTR_NODEFAULT = 0x10 + XATTR_NOFOLLOW = 0x1 + XATTR_NOSECURITY = 0x8 + XATTR_REPLACE = 0x4 + XATTR_SHOWCOMPRESSION = 0x20 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADARCH = syscall.Errno(0x56) + EBADEXEC = syscall.Errno(0x55) + EBADF = syscall.Errno(0x9) + EBADMACHO = syscall.Errno(0x58) + EBADMSG = syscall.Errno(0x5e) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x59) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDEVERR = syscall.Errno(0x53) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x5a) + EILSEQ = syscall.Errno(0x5c) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x6a) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5f) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x5d) + ENOBUFS = syscall.Errno(0x37) + ENODATA = syscall.Errno(0x60) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x61) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x5b) + ENOPOLICY = syscall.Errno(0x67) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x62) + ENOSTR = syscall.Errno(0x63) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x68) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x66) + EOVERFLOW = syscall.Errno(0x54) + EOWNERDEAD = syscall.Errno(0x69) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x64) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + EPWROFF = syscall.Errno(0x52) + EQFULL = syscall.Errno(0x6a) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHLIBVERS = syscall.Errno(0x57) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIME = syscall.Errno(0x65) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "device not configured"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EDEADLK", "resource deadlock avoided"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "cross-device link"}, + {19, "ENODEV", "operation not supported by device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "result too large"}, + {35, "EAGAIN", "resource temporarily unavailable"}, + {36, "EINPROGRESS", "operation now in progress"}, + {37, "EALREADY", "operation already in progress"}, + {38, "ENOTSOCK", "socket operation on non-socket"}, + {39, "EDESTADDRREQ", "destination address required"}, + {40, "EMSGSIZE", "message too long"}, + {41, "EPROTOTYPE", "protocol wrong type for socket"}, + {42, "ENOPROTOOPT", "protocol not available"}, + {43, "EPROTONOSUPPORT", "protocol not supported"}, + {44, "ESOCKTNOSUPPORT", "socket type not supported"}, + {45, "ENOTSUP", "operation not supported"}, + {46, "EPFNOSUPPORT", "protocol family not supported"}, + {47, "EAFNOSUPPORT", "address family not supported by protocol family"}, + {48, "EADDRINUSE", "address already in use"}, + {49, "EADDRNOTAVAIL", "can't assign requested address"}, + {50, "ENETDOWN", "network is down"}, + {51, "ENETUNREACH", "network is unreachable"}, + {52, "ENETRESET", "network dropped connection on reset"}, + {53, "ECONNABORTED", "software caused connection abort"}, + {54, "ECONNRESET", "connection reset by peer"}, + {55, "ENOBUFS", "no buffer space available"}, + {56, "EISCONN", "socket is already connected"}, + {57, "ENOTCONN", "socket is not connected"}, + {58, "ESHUTDOWN", "can't send after socket shutdown"}, + {59, "ETOOMANYREFS", "too many references: can't splice"}, + {60, "ETIMEDOUT", "operation timed out"}, + {61, "ECONNREFUSED", "connection refused"}, + {62, "ELOOP", "too many levels of symbolic links"}, + {63, "ENAMETOOLONG", "file name too long"}, + {64, "EHOSTDOWN", "host is down"}, + {65, "EHOSTUNREACH", "no route to host"}, + {66, "ENOTEMPTY", "directory not empty"}, + {67, "EPROCLIM", "too many processes"}, + {68, "EUSERS", "too many users"}, + {69, "EDQUOT", "disc quota exceeded"}, + {70, "ESTALE", "stale NFS file handle"}, + {71, "EREMOTE", "too many levels of remote in path"}, + {72, "EBADRPC", "RPC struct is bad"}, + {73, "ERPCMISMATCH", "RPC version wrong"}, + {74, "EPROGUNAVAIL", "RPC prog. not avail"}, + {75, "EPROGMISMATCH", "program version wrong"}, + {76, "EPROCUNAVAIL", "bad procedure for program"}, + {77, "ENOLCK", "no locks available"}, + {78, "ENOSYS", "function not implemented"}, + {79, "EFTYPE", "inappropriate file type or format"}, + {80, "EAUTH", "authentication error"}, + {81, "ENEEDAUTH", "need authenticator"}, + {82, "EPWROFF", "device power is off"}, + {83, "EDEVERR", "device error"}, + {84, "EOVERFLOW", "value too large to be stored in data type"}, + {85, "EBADEXEC", "bad executable (or shared library)"}, + {86, "EBADARCH", "bad CPU type in executable"}, + {87, "ESHLIBVERS", "shared library version mismatch"}, + {88, "EBADMACHO", "malformed Mach-o file"}, + {89, "ECANCELED", "operation canceled"}, + {90, "EIDRM", "identifier removed"}, + {91, "ENOMSG", "no message of desired type"}, + {92, "EILSEQ", "illegal byte sequence"}, + {93, "ENOATTR", "attribute not found"}, + {94, "EBADMSG", "bad message"}, + {95, "EMULTIHOP", "EMULTIHOP (Reserved)"}, + {96, "ENODATA", "no message available on STREAM"}, + {97, "ENOLINK", "ENOLINK (Reserved)"}, + {98, "ENOSR", "no STREAM resources"}, + {99, "ENOSTR", "not a STREAM"}, + {100, "EPROTO", "protocol error"}, + {101, "ETIME", "STREAM ioctl timeout"}, + {102, "EOPNOTSUPP", "operation not supported on socket"}, + {103, "ENOPOLICY", "policy not found"}, + {104, "ENOTRECOVERABLE", "state not recoverable"}, + {105, "EOWNERDEAD", "previous owner died"}, + {106, "EQFULL", "interface output queue is full"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/BPT trap"}, + {6, "SIGABRT", "abort trap"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGURG", "urgent I/O condition"}, + {17, "SIGSTOP", "suspended (signal)"}, + {18, "SIGTSTP", "suspended"}, + {19, "SIGCONT", "continued"}, + {20, "SIGCHLD", "child exited"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGIO", "I/O possible"}, + {24, "SIGXCPU", "cputime limit exceeded"}, + {25, "SIGXFSZ", "filesize limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window size changes"}, + {29, "SIGINFO", "information request"}, + {30, "SIGUSR1", "user defined signal 1"}, + {31, "SIGUSR2", "user defined signal 2"}, +} diff --git a/api/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go b/api/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go new file mode 100644 index 0000000..8fe5547 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go @@ -0,0 +1,1783 @@ +// mkerrors.sh -m64 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,darwin + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1c + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1e + AF_IPX = 0x17 + AF_ISDN = 0x1c + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x28 + AF_NATM = 0x1f + AF_NDRV = 0x1b + AF_NETBIOS = 0x21 + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PPP = 0x22 + AF_PUP = 0x4 + AF_RESERVED_36 = 0x24 + AF_ROUTE = 0x11 + AF_SIP = 0x18 + AF_SNA = 0xb + AF_SYSTEM = 0x20 + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_UTUN = 0x26 + ALTWERASE = 0x200 + ATTR_BIT_MAP_COUNT = 0x5 + ATTR_CMN_ACCESSMASK = 0x20000 + ATTR_CMN_ACCTIME = 0x1000 + ATTR_CMN_ADDEDTIME = 0x10000000 + ATTR_CMN_BKUPTIME = 0x2000 + ATTR_CMN_CHGTIME = 0x800 + ATTR_CMN_CRTIME = 0x200 + ATTR_CMN_DATA_PROTECT_FLAGS = 0x40000000 + ATTR_CMN_DEVID = 0x2 + ATTR_CMN_DOCUMENT_ID = 0x100000 + ATTR_CMN_ERROR = 0x20000000 + ATTR_CMN_EXTENDED_SECURITY = 0x400000 + ATTR_CMN_FILEID = 0x2000000 + ATTR_CMN_FLAGS = 0x40000 + ATTR_CMN_FNDRINFO = 0x4000 + ATTR_CMN_FSID = 0x4 + ATTR_CMN_FULLPATH = 0x8000000 + ATTR_CMN_GEN_COUNT = 0x80000 + ATTR_CMN_GRPID = 0x10000 + ATTR_CMN_GRPUUID = 0x1000000 + ATTR_CMN_MODTIME = 0x400 + ATTR_CMN_NAME = 0x1 + ATTR_CMN_NAMEDATTRCOUNT = 0x80000 + ATTR_CMN_NAMEDATTRLIST = 0x100000 + ATTR_CMN_OBJID = 0x20 + ATTR_CMN_OBJPERMANENTID = 0x40 + ATTR_CMN_OBJTAG = 0x10 + ATTR_CMN_OBJTYPE = 0x8 + ATTR_CMN_OWNERID = 0x8000 + ATTR_CMN_PARENTID = 0x4000000 + ATTR_CMN_PAROBJID = 0x80 + ATTR_CMN_RETURNED_ATTRS = 0x80000000 + ATTR_CMN_SCRIPT = 0x100 + ATTR_CMN_SETMASK = 0x41c7ff00 + ATTR_CMN_USERACCESS = 0x200000 + ATTR_CMN_UUID = 0x800000 + ATTR_CMN_VALIDMASK = 0xffffffff + ATTR_CMN_VOLSETMASK = 0x6700 + ATTR_FILE_ALLOCSIZE = 0x4 + ATTR_FILE_CLUMPSIZE = 0x10 + ATTR_FILE_DATAALLOCSIZE = 0x400 + ATTR_FILE_DATAEXTENTS = 0x800 + ATTR_FILE_DATALENGTH = 0x200 + ATTR_FILE_DEVTYPE = 0x20 + ATTR_FILE_FILETYPE = 0x40 + ATTR_FILE_FORKCOUNT = 0x80 + ATTR_FILE_FORKLIST = 0x100 + ATTR_FILE_IOBLOCKSIZE = 0x8 + ATTR_FILE_LINKCOUNT = 0x1 + ATTR_FILE_RSRCALLOCSIZE = 0x2000 + ATTR_FILE_RSRCEXTENTS = 0x4000 + ATTR_FILE_RSRCLENGTH = 0x1000 + ATTR_FILE_SETMASK = 0x20 + ATTR_FILE_TOTALSIZE = 0x2 + ATTR_FILE_VALIDMASK = 0x37ff + ATTR_VOL_ALLOCATIONCLUMP = 0x40 + ATTR_VOL_ATTRIBUTES = 0x40000000 + ATTR_VOL_CAPABILITIES = 0x20000 + ATTR_VOL_DIRCOUNT = 0x400 + ATTR_VOL_ENCODINGSUSED = 0x10000 + ATTR_VOL_FILECOUNT = 0x200 + ATTR_VOL_FSTYPE = 0x1 + ATTR_VOL_INFO = 0x80000000 + ATTR_VOL_IOBLOCKSIZE = 0x80 + ATTR_VOL_MAXOBJCOUNT = 0x800 + ATTR_VOL_MINALLOCATION = 0x20 + ATTR_VOL_MOUNTEDDEVICE = 0x8000 + ATTR_VOL_MOUNTFLAGS = 0x4000 + ATTR_VOL_MOUNTPOINT = 0x1000 + ATTR_VOL_NAME = 0x2000 + ATTR_VOL_OBJCOUNT = 0x100 + ATTR_VOL_QUOTA_SIZE = 0x10000000 + ATTR_VOL_RESERVED_SIZE = 0x20000000 + ATTR_VOL_SETMASK = 0x80002000 + ATTR_VOL_SIGNATURE = 0x2 + ATTR_VOL_SIZE = 0x4 + ATTR_VOL_SPACEAVAIL = 0x10 + ATTR_VOL_SPACEFREE = 0x8 + ATTR_VOL_UUID = 0x40000 + ATTR_VOL_VALIDMASK = 0xf007ffff + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B9600 = 0x2580 + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc00c4279 + BIOCGETIF = 0x4020426b + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044278 + BIOCSETF = 0x80104267 + BIOCSETFNR = 0x8010427e + BIOCSETIF = 0x8020426c + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8010426d + BIOCSSEESENT = 0x80044277 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x8000 + BSDLY = 0x8000 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_MONOTONIC_RAW_APPROX = 0x5 + CLOCK_PROCESS_CPUTIME_ID = 0xc + CLOCK_REALTIME = 0x0 + CLOCK_THREAD_CPUTIME_ID = 0x10 + CLOCK_UPTIME_RAW = 0x8 + CLOCK_UPTIME_RAW_APPROX = 0x9 + CR0 = 0x0 + CR1 = 0x1000 + CR2 = 0x2000 + CR3 = 0x3000 + CRDLY = 0x3000 + CREAD = 0x800 + CRTSCTS = 0x30000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0xf5 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_EXCEPT = -0xf + EVFILT_FS = -0x9 + EVFILT_MACHPORT = -0x8 + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xf + EVFILT_THREADMARKER = 0xf + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xa + EVFILT_VM = -0xc + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_DISPATCH2 = 0x180 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG0 = 0x1000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_OOBAND = 0x2000 + EV_POLL = 0x1000 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EV_UDATA_SPECIFIC = 0x100 + EV_VANISHED = 0x200 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x4000 + FFDLY = 0x4000 + FLUSHO = 0x800000 + FSOPT_ATTR_CMN_EXTENDED = 0x20 + FSOPT_NOFOLLOW = 0x1 + FSOPT_NOINMEMUPDATE = 0x2 + FSOPT_PACK_INVAL_ATTRS = 0x8 + FSOPT_REPORT_FULLSIZE = 0x4 + F_ADDFILESIGS = 0x3d + F_ADDFILESIGS_FOR_DYLD_SIM = 0x53 + F_ADDFILESIGS_RETURN = 0x61 + F_ADDSIGS = 0x3b + F_ALLOCATEALL = 0x4 + F_ALLOCATECONTIG = 0x2 + F_BARRIERFSYNC = 0x55 + F_CHECK_LV = 0x62 + F_CHKCLEAN = 0x29 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x43 + F_FINDSIGS = 0x4e + F_FLUSH_DATA = 0x28 + F_FREEZE_FS = 0x35 + F_FULLFSYNC = 0x33 + F_GETCODEDIR = 0x48 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETLKPID = 0x42 + F_GETNOSIGPIPE = 0x4a + F_GETOWN = 0x5 + F_GETPATH = 0x32 + F_GETPATH_MTMINFO = 0x47 + F_GETPROTECTIONCLASS = 0x3f + F_GETPROTECTIONLEVEL = 0x4d + F_GLOBAL_NOCACHE = 0x37 + F_LOG2PHYS = 0x31 + F_LOG2PHYS_EXT = 0x41 + F_NOCACHE = 0x30 + F_NODIRECT = 0x3e + F_OK = 0x0 + F_PATHPKG_CHECK = 0x34 + F_PEOFPOSMODE = 0x3 + F_PREALLOCATE = 0x2a + F_PUNCHHOLE = 0x63 + F_RDADVISE = 0x2c + F_RDAHEAD = 0x2d + F_RDLCK = 0x1 + F_SETBACKINGSTORE = 0x46 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETLKWTIMEOUT = 0xa + F_SETNOSIGPIPE = 0x49 + F_SETOWN = 0x6 + F_SETPROTECTIONCLASS = 0x40 + F_SETSIZE = 0x2b + F_SINGLE_WRITER = 0x4c + F_THAW_FS = 0x36 + F_TRANSCODEKEY = 0x4b + F_TRIM_ACTIVE_FILE = 0x64 + F_UNLCK = 0x2 + F_VOLPOSMODE = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_AAL5 = 0x31 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ATM = 0x25 + IFT_BRIDGE = 0xd1 + IFT_CARP = 0xf8 + IFT_CELLULAR = 0xff + IFT_CEPT = 0x13 + IFT_DS3 = 0x1e + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_ETHER = 0x6 + IFT_FAITH = 0x38 + IFT_FDDI = 0xf + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_GIF = 0x37 + IFT_HDH1822 = 0x3 + IFT_HIPPI = 0x2f + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IEEE1394 = 0x90 + IFT_IEEE8023ADLAG = 0x88 + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88026 = 0xa + IFT_L2VLAN = 0x87 + IFT_LAPB = 0x10 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_NSIP = 0x1b + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PDP = 0xff + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PKTAP = 0xfe + IFT_PPP = 0x17 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PTPSERIAL = 0x16 + IFT_RS232 = 0x21 + IFT_SDLC = 0x11 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_STARLAN = 0xb + IFT_STF = 0x39 + IFT_T1 = 0x12 + IFT_ULTRA = 0x1d + IFT_V35 = 0x2d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LINKLOCALNETNUM = 0xa9fe0000 + IN_LOOPBACKNET = 0x7f + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0xfe + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MEAS = 0x13 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEP = 0x21 + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_2292DSTOPTS = 0x17 + IPV6_2292HOPLIMIT = 0x14 + IPV6_2292HOPOPTS = 0x16 + IPV6_2292NEXTHOP = 0x15 + IPV6_2292PKTINFO = 0x13 + IPV6_2292PKTOPTIONS = 0x19 + IPV6_2292RTHDR = 0x18 + IPV6_BINDV6ONLY = 0x1b + IPV6_BOUND_IF = 0x7d + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FLOW_ECN_MASK = 0x300 + IPV6_FRAGTTL = 0x3c + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVTCLASS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x24 + IPV6_UNICAST_HOPS = 0x4 + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BLOCK_SOURCE = 0x48 + IP_BOUND_IF = 0x19 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FAITH = 0x16 + IP_FW_ADD = 0x28 + IP_FW_DEL = 0x29 + IP_FW_FLUSH = 0x2a + IP_FW_GET = 0x2c + IP_FW_RESETLOG = 0x2d + IP_FW_ZERO = 0x2b + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MF = 0x2000 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_IFINDEX = 0x42 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_NAT__XXX = 0x37 + IP_OFFMASK = 0x1fff + IP_OLD_FW_ADD = 0x32 + IP_OLD_FW_DEL = 0x33 + IP_OLD_FW_FLUSH = 0x34 + IP_OLD_FW_GET = 0x36 + IP_OLD_FW_RESETLOG = 0x38 + IP_OLD_FW_ZERO = 0x35 + IP_OPTIONS = 0x1 + IP_PKTINFO = 0x1a + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVPKTINFO = 0x1a + IP_RECVRETOPTS = 0x6 + IP_RECVTOS = 0x1b + IP_RECVTTL = 0x18 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_STRIPHDR = 0x17 + IP_TOS = 0x3 + IP_TRAFFIC_MGT_BACKGROUND = 0x41 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_CAN_REUSE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_FREE_REUSABLE = 0x7 + MADV_FREE_REUSE = 0x8 + MADV_NORMAL = 0x0 + MADV_PAGEOUT = 0xa + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MADV_ZERO_WIRED_PAGES = 0x6 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_JIT = 0x800 + MAP_NOCACHE = 0x400 + MAP_NOEXTEND = 0x100 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_RESERVED0080 = 0x80 + MAP_RESILIENT_CODESIGN = 0x2000 + MAP_RESILIENT_MEDIA = 0x4000 + MAP_SHARED = 0x1 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x400000 + MNT_CMDFLAGS = 0xf0000 + MNT_CPROTECT = 0x80 + MNT_DEFWRITE = 0x2000000 + MNT_DONTBROWSE = 0x100000 + MNT_DOVOLFS = 0x8000 + MNT_DWAIT = 0x4 + MNT_EXPORTED = 0x100 + MNT_FORCE = 0x80000 + MNT_IGNORE_OWNERSHIP = 0x200000 + MNT_JOURNALED = 0x800000 + MNT_LOCAL = 0x1000 + MNT_MULTILABEL = 0x4000000 + MNT_NOATIME = 0x10000000 + MNT_NOBLOCK = 0x20000 + MNT_NODEV = 0x10 + MNT_NOEXEC = 0x4 + MNT_NOSUID = 0x8 + MNT_NOUSERXATTR = 0x1000000 + MNT_NOWAIT = 0x2 + MNT_QUARANTINE = 0x400 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UNKNOWNPERMISSIONS = 0x200000 + MNT_UPDATE = 0x10000 + MNT_VISFLAGMASK = 0x17f0f5ff + MNT_WAIT = 0x1 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_FLUSH = 0x400 + MSG_HAVEMORE = 0x2000 + MSG_HOLD = 0x800 + MSG_NEEDSA = 0x10000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_RCVMORE = 0x4000 + MSG_SEND = 0x1000 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITSTREAM = 0x200 + MS_ASYNC = 0x1 + MS_DEACTIVATE = 0x8 + MS_INVALIDATE = 0x2 + MS_KILLPAGES = 0x4 + MS_SYNC = 0x10 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_DUMP2 = 0x7 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLIST2 = 0x6 + NET_RT_MAXID = 0xa + NET_RT_STAT = 0x4 + NET_RT_TRASH = 0x5 + NL0 = 0x0 + NL1 = 0x100 + NL2 = 0x200 + NL3 = 0x300 + NLDLY = 0x300 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ABSOLUTE = 0x8 + NOTE_ATTRIB = 0x8 + NOTE_BACKGROUND = 0x40 + NOTE_CHILD = 0x4 + NOTE_CRITICAL = 0x20 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXITSTATUS = 0x4000000 + NOTE_EXIT_CSERROR = 0x40000 + NOTE_EXIT_DECRYPTFAIL = 0x10000 + NOTE_EXIT_DETAIL = 0x2000000 + NOTE_EXIT_DETAIL_MASK = 0x70000 + NOTE_EXIT_MEMORY = 0x20000 + NOTE_EXIT_REPARENTED = 0x80000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FORK = 0x40000000 + NOTE_FUNLOCK = 0x100 + NOTE_LEEWAY = 0x10 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_MACH_CONTINUOUS_TIME = 0x80 + NOTE_NONE = 0x80 + NOTE_NSECONDS = 0x4 + NOTE_OOB = 0x2 + NOTE_PCTRLMASK = -0x100000 + NOTE_PDATAMASK = 0xfffff + NOTE_REAP = 0x10000000 + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_SIGNAL = 0x8000000 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x2 + NOTE_VM_ERROR = 0x10000000 + NOTE_VM_PRESSURE = 0x80000000 + NOTE_VM_PRESSURE_SUDDEN_TERMINATE = 0x20000000 + NOTE_VM_PRESSURE_TERMINATE = 0x40000000 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OFDEL = 0x20000 + OFILL = 0x80 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_ALERT = 0x20000000 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x1000000 + O_CREAT = 0x200 + O_DIRECTORY = 0x100000 + O_DP_GETRAWENCRYPTED = 0x1 + O_DP_GETRAWUNENCRYPTED = 0x2 + O_DSYNC = 0x400000 + O_EVTONLY = 0x8000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x20000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_POPUP = 0x80000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYMLINK = 0x200000 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PT_ATTACH = 0xa + PT_ATTACHEXC = 0xe + PT_CONTINUE = 0x7 + PT_DENY_ATTACH = 0x1f + PT_DETACH = 0xb + PT_FIRSTMACH = 0x20 + PT_FORCEQUOTA = 0x1e + PT_KILL = 0x8 + PT_READ_D = 0x2 + PT_READ_I = 0x1 + PT_READ_U = 0x3 + PT_SIGEXC = 0xc + PT_STEP = 0x9 + PT_THUPDATE = 0xd + PT_TRACE_ME = 0x0 + PT_WRITE_D = 0x5 + PT_WRITE_I = 0x4 + PT_WRITE_U = 0x6 + RLIMIT_AS = 0x5 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_CPU_USAGE_MONITOR = 0x2 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_CLONING = 0x100 + RTF_CONDEMNED = 0x2000000 + RTF_DELCLONE = 0x80 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_IFREF = 0x4000000 + RTF_IFSCOPE = 0x1000000 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_NOIFREF = 0x2000 + RTF_PINNED = 0x100000 + RTF_PRCLONING = 0x10000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_PROXY = 0x8000000 + RTF_REJECT = 0x8 + RTF_ROUTER = 0x10000000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_WASCLONED = 0x20000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_GET2 = 0x14 + RTM_IFINFO = 0xe + RTM_IFINFO2 = 0x12 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_NEWMADDR2 = 0x13 + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SCM_TIMESTAMP_MONOTONIC = 0x4 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCARPIPLL = 0xc0206928 + SIOCATMARK = 0x40047307 + SIOCAUTOADDR = 0xc0206926 + SIOCAUTONETMASK = 0x80206927 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFPHYADDR = 0x80206941 + SIOCGDRVSPEC = 0xc028697b + SIOCGETVLAN = 0xc020697f + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFALTMTU = 0xc0206948 + SIOCGIFASYNCMAP = 0xc020697c + SIOCGIFBOND = 0xc0206947 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020695b + SIOCGIFCONF = 0xc00c6924 + SIOCGIFDEVMTU = 0xc0206944 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFKPI = 0xc0206987 + SIOCGIFMAC = 0xc0206982 + SIOCGIFMEDIA = 0xc02c6938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206940 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc020693f + SIOCGIFSTATUS = 0xc331693d + SIOCGIFVLAN = 0xc020697f + SIOCGIFWAKEFLAGS = 0xc0206988 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCIFCREATE = 0xc0206978 + SIOCIFCREATE2 = 0xc020697a + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc0106981 + SIOCRSLVMULTI = 0xc010693b + SIOCSDRVSPEC = 0x8028697b + SIOCSETVLAN = 0x8020697e + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFALTMTU = 0x80206945 + SIOCSIFASYNCMAP = 0x8020697d + SIOCSIFBOND = 0x80206946 + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020695a + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFKPI = 0x80206986 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206983 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x8040693e + SIOCSIFPHYS = 0x80206936 + SIOCSIFVLAN = 0x8020697e + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_DONTTRUNC = 0x2000 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1010 + SO_LINGER = 0x80 + SO_LINGER_SEC = 0x1080 + SO_NETSVC_MARKING_LEVEL = 0x1119 + SO_NET_SERVICE_TYPE = 0x1116 + SO_NKE = 0x1021 + SO_NOADDRERR = 0x1023 + SO_NOSIGPIPE = 0x1022 + SO_NOTIFYCONFLICT = 0x1026 + SO_NP_EXTENSIONS = 0x1083 + SO_NREAD = 0x1020 + SO_NUMRCVPKT = 0x1112 + SO_NWRITE = 0x1024 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1011 + SO_RANDOMPORT = 0x1082 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_REUSESHAREUID = 0x1025 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TIMESTAMP_MONOTONIC = 0x800 + SO_TYPE = 0x1008 + SO_UPCALLCLOSEWAIT = 0x1027 + SO_USELOOPBACK = 0x40 + SO_WANTMORE = 0x4000 + SO_WANTOOBFLAG = 0x8000 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFWHT = 0xe000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x400 + TAB2 = 0x800 + TAB3 = 0x4 + TABDLY = 0xc04 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCP_CONNECTIONTIMEOUT = 0x20 + TCP_CONNECTION_INFO = 0x106 + TCP_ENABLE_ECN = 0x104 + TCP_FASTOPEN = 0x105 + TCP_KEEPALIVE = 0x10 + TCP_KEEPCNT = 0x102 + TCP_KEEPINTVL = 0x101 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MINMSS = 0xd8 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_NOTSENT_LOWAT = 0x201 + TCP_RXT_CONNDROPTIME = 0x80 + TCP_RXT_FINDROP = 0x100 + TCP_SENDMOREACKS = 0x103 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x40107458 + TIOCDRAIN = 0x2000745e + TIOCDSIMICROCODE = 0x20007455 + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x40487413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGWINSZ = 0x40087468 + TIOCIXOFF = 0x20007480 + TIOCIXON = 0x20007481 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMODG = 0x40047403 + TIOCMODS = 0x80047404 + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTYGNAME = 0x40807453 + TIOCPTYGRANT = 0x20007454 + TIOCPTYUNLK = 0x20007452 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCONS = 0x20007463 + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x80487414 + TIOCSETAF = 0x80487416 + TIOCSETAW = 0x80487415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2000745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40107459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VM_LOADAVG = 0x2 + VM_MACHFACTOR = 0x4 + VM_MAXID = 0x6 + VM_METER = 0x1 + VM_SWAPUSAGE = 0x5 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VT0 = 0x0 + VT1 = 0x10000 + VTDLY = 0x10000 + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x10 + WCOREFLAG = 0x80 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOWAIT = 0x20 + WORDSIZE = 0x40 + WSTOPPED = 0x8 + WUNTRACED = 0x2 + XATTR_CREATE = 0x2 + XATTR_NODEFAULT = 0x10 + XATTR_NOFOLLOW = 0x1 + XATTR_NOSECURITY = 0x8 + XATTR_REPLACE = 0x4 + XATTR_SHOWCOMPRESSION = 0x20 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADARCH = syscall.Errno(0x56) + EBADEXEC = syscall.Errno(0x55) + EBADF = syscall.Errno(0x9) + EBADMACHO = syscall.Errno(0x58) + EBADMSG = syscall.Errno(0x5e) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x59) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDEVERR = syscall.Errno(0x53) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x5a) + EILSEQ = syscall.Errno(0x5c) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x6a) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5f) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x5d) + ENOBUFS = syscall.Errno(0x37) + ENODATA = syscall.Errno(0x60) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x61) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x5b) + ENOPOLICY = syscall.Errno(0x67) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x62) + ENOSTR = syscall.Errno(0x63) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x68) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x66) + EOVERFLOW = syscall.Errno(0x54) + EOWNERDEAD = syscall.Errno(0x69) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x64) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + EPWROFF = syscall.Errno(0x52) + EQFULL = syscall.Errno(0x6a) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHLIBVERS = syscall.Errno(0x57) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIME = syscall.Errno(0x65) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "device not configured"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EDEADLK", "resource deadlock avoided"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "cross-device link"}, + {19, "ENODEV", "operation not supported by device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "result too large"}, + {35, "EAGAIN", "resource temporarily unavailable"}, + {36, "EINPROGRESS", "operation now in progress"}, + {37, "EALREADY", "operation already in progress"}, + {38, "ENOTSOCK", "socket operation on non-socket"}, + {39, "EDESTADDRREQ", "destination address required"}, + {40, "EMSGSIZE", "message too long"}, + {41, "EPROTOTYPE", "protocol wrong type for socket"}, + {42, "ENOPROTOOPT", "protocol not available"}, + {43, "EPROTONOSUPPORT", "protocol not supported"}, + {44, "ESOCKTNOSUPPORT", "socket type not supported"}, + {45, "ENOTSUP", "operation not supported"}, + {46, "EPFNOSUPPORT", "protocol family not supported"}, + {47, "EAFNOSUPPORT", "address family not supported by protocol family"}, + {48, "EADDRINUSE", "address already in use"}, + {49, "EADDRNOTAVAIL", "can't assign requested address"}, + {50, "ENETDOWN", "network is down"}, + {51, "ENETUNREACH", "network is unreachable"}, + {52, "ENETRESET", "network dropped connection on reset"}, + {53, "ECONNABORTED", "software caused connection abort"}, + {54, "ECONNRESET", "connection reset by peer"}, + {55, "ENOBUFS", "no buffer space available"}, + {56, "EISCONN", "socket is already connected"}, + {57, "ENOTCONN", "socket is not connected"}, + {58, "ESHUTDOWN", "can't send after socket shutdown"}, + {59, "ETOOMANYREFS", "too many references: can't splice"}, + {60, "ETIMEDOUT", "operation timed out"}, + {61, "ECONNREFUSED", "connection refused"}, + {62, "ELOOP", "too many levels of symbolic links"}, + {63, "ENAMETOOLONG", "file name too long"}, + {64, "EHOSTDOWN", "host is down"}, + {65, "EHOSTUNREACH", "no route to host"}, + {66, "ENOTEMPTY", "directory not empty"}, + {67, "EPROCLIM", "too many processes"}, + {68, "EUSERS", "too many users"}, + {69, "EDQUOT", "disc quota exceeded"}, + {70, "ESTALE", "stale NFS file handle"}, + {71, "EREMOTE", "too many levels of remote in path"}, + {72, "EBADRPC", "RPC struct is bad"}, + {73, "ERPCMISMATCH", "RPC version wrong"}, + {74, "EPROGUNAVAIL", "RPC prog. not avail"}, + {75, "EPROGMISMATCH", "program version wrong"}, + {76, "EPROCUNAVAIL", "bad procedure for program"}, + {77, "ENOLCK", "no locks available"}, + {78, "ENOSYS", "function not implemented"}, + {79, "EFTYPE", "inappropriate file type or format"}, + {80, "EAUTH", "authentication error"}, + {81, "ENEEDAUTH", "need authenticator"}, + {82, "EPWROFF", "device power is off"}, + {83, "EDEVERR", "device error"}, + {84, "EOVERFLOW", "value too large to be stored in data type"}, + {85, "EBADEXEC", "bad executable (or shared library)"}, + {86, "EBADARCH", "bad CPU type in executable"}, + {87, "ESHLIBVERS", "shared library version mismatch"}, + {88, "EBADMACHO", "malformed Mach-o file"}, + {89, "ECANCELED", "operation canceled"}, + {90, "EIDRM", "identifier removed"}, + {91, "ENOMSG", "no message of desired type"}, + {92, "EILSEQ", "illegal byte sequence"}, + {93, "ENOATTR", "attribute not found"}, + {94, "EBADMSG", "bad message"}, + {95, "EMULTIHOP", "EMULTIHOP (Reserved)"}, + {96, "ENODATA", "no message available on STREAM"}, + {97, "ENOLINK", "ENOLINK (Reserved)"}, + {98, "ENOSR", "no STREAM resources"}, + {99, "ENOSTR", "not a STREAM"}, + {100, "EPROTO", "protocol error"}, + {101, "ETIME", "STREAM ioctl timeout"}, + {102, "EOPNOTSUPP", "operation not supported on socket"}, + {103, "ENOPOLICY", "policy not found"}, + {104, "ENOTRECOVERABLE", "state not recoverable"}, + {105, "EOWNERDEAD", "previous owner died"}, + {106, "EQFULL", "interface output queue is full"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/BPT trap"}, + {6, "SIGABRT", "abort trap"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGURG", "urgent I/O condition"}, + {17, "SIGSTOP", "suspended (signal)"}, + {18, "SIGTSTP", "suspended"}, + {19, "SIGCONT", "continued"}, + {20, "SIGCHLD", "child exited"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGIO", "I/O possible"}, + {24, "SIGXCPU", "cputime limit exceeded"}, + {25, "SIGXFSZ", "filesize limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window size changes"}, + {29, "SIGINFO", "information request"}, + {30, "SIGUSR1", "user defined signal 1"}, + {31, "SIGUSR2", "user defined signal 2"}, +} diff --git a/api/vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go b/api/vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go new file mode 100644 index 0000000..7a97777 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go @@ -0,0 +1,1783 @@ +// mkerrors.sh +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,darwin + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1c + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1e + AF_IPX = 0x17 + AF_ISDN = 0x1c + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x28 + AF_NATM = 0x1f + AF_NDRV = 0x1b + AF_NETBIOS = 0x21 + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PPP = 0x22 + AF_PUP = 0x4 + AF_RESERVED_36 = 0x24 + AF_ROUTE = 0x11 + AF_SIP = 0x18 + AF_SNA = 0xb + AF_SYSTEM = 0x20 + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_UTUN = 0x26 + ALTWERASE = 0x200 + ATTR_BIT_MAP_COUNT = 0x5 + ATTR_CMN_ACCESSMASK = 0x20000 + ATTR_CMN_ACCTIME = 0x1000 + ATTR_CMN_ADDEDTIME = 0x10000000 + ATTR_CMN_BKUPTIME = 0x2000 + ATTR_CMN_CHGTIME = 0x800 + ATTR_CMN_CRTIME = 0x200 + ATTR_CMN_DATA_PROTECT_FLAGS = 0x40000000 + ATTR_CMN_DEVID = 0x2 + ATTR_CMN_DOCUMENT_ID = 0x100000 + ATTR_CMN_ERROR = 0x20000000 + ATTR_CMN_EXTENDED_SECURITY = 0x400000 + ATTR_CMN_FILEID = 0x2000000 + ATTR_CMN_FLAGS = 0x40000 + ATTR_CMN_FNDRINFO = 0x4000 + ATTR_CMN_FSID = 0x4 + ATTR_CMN_FULLPATH = 0x8000000 + ATTR_CMN_GEN_COUNT = 0x80000 + ATTR_CMN_GRPID = 0x10000 + ATTR_CMN_GRPUUID = 0x1000000 + ATTR_CMN_MODTIME = 0x400 + ATTR_CMN_NAME = 0x1 + ATTR_CMN_NAMEDATTRCOUNT = 0x80000 + ATTR_CMN_NAMEDATTRLIST = 0x100000 + ATTR_CMN_OBJID = 0x20 + ATTR_CMN_OBJPERMANENTID = 0x40 + ATTR_CMN_OBJTAG = 0x10 + ATTR_CMN_OBJTYPE = 0x8 + ATTR_CMN_OWNERID = 0x8000 + ATTR_CMN_PARENTID = 0x4000000 + ATTR_CMN_PAROBJID = 0x80 + ATTR_CMN_RETURNED_ATTRS = 0x80000000 + ATTR_CMN_SCRIPT = 0x100 + ATTR_CMN_SETMASK = 0x41c7ff00 + ATTR_CMN_USERACCESS = 0x200000 + ATTR_CMN_UUID = 0x800000 + ATTR_CMN_VALIDMASK = 0xffffffff + ATTR_CMN_VOLSETMASK = 0x6700 + ATTR_FILE_ALLOCSIZE = 0x4 + ATTR_FILE_CLUMPSIZE = 0x10 + ATTR_FILE_DATAALLOCSIZE = 0x400 + ATTR_FILE_DATAEXTENTS = 0x800 + ATTR_FILE_DATALENGTH = 0x200 + ATTR_FILE_DEVTYPE = 0x20 + ATTR_FILE_FILETYPE = 0x40 + ATTR_FILE_FORKCOUNT = 0x80 + ATTR_FILE_FORKLIST = 0x100 + ATTR_FILE_IOBLOCKSIZE = 0x8 + ATTR_FILE_LINKCOUNT = 0x1 + ATTR_FILE_RSRCALLOCSIZE = 0x2000 + ATTR_FILE_RSRCEXTENTS = 0x4000 + ATTR_FILE_RSRCLENGTH = 0x1000 + ATTR_FILE_SETMASK = 0x20 + ATTR_FILE_TOTALSIZE = 0x2 + ATTR_FILE_VALIDMASK = 0x37ff + ATTR_VOL_ALLOCATIONCLUMP = 0x40 + ATTR_VOL_ATTRIBUTES = 0x40000000 + ATTR_VOL_CAPABILITIES = 0x20000 + ATTR_VOL_DIRCOUNT = 0x400 + ATTR_VOL_ENCODINGSUSED = 0x10000 + ATTR_VOL_FILECOUNT = 0x200 + ATTR_VOL_FSTYPE = 0x1 + ATTR_VOL_INFO = 0x80000000 + ATTR_VOL_IOBLOCKSIZE = 0x80 + ATTR_VOL_MAXOBJCOUNT = 0x800 + ATTR_VOL_MINALLOCATION = 0x20 + ATTR_VOL_MOUNTEDDEVICE = 0x8000 + ATTR_VOL_MOUNTFLAGS = 0x4000 + ATTR_VOL_MOUNTPOINT = 0x1000 + ATTR_VOL_NAME = 0x2000 + ATTR_VOL_OBJCOUNT = 0x100 + ATTR_VOL_QUOTA_SIZE = 0x10000000 + ATTR_VOL_RESERVED_SIZE = 0x20000000 + ATTR_VOL_SETMASK = 0x80002000 + ATTR_VOL_SIGNATURE = 0x2 + ATTR_VOL_SIZE = 0x4 + ATTR_VOL_SPACEAVAIL = 0x10 + ATTR_VOL_SPACEFREE = 0x8 + ATTR_VOL_UUID = 0x40000 + ATTR_VOL_VALIDMASK = 0xf007ffff + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B9600 = 0x2580 + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc00c4279 + BIOCGETIF = 0x4020426b + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044278 + BIOCSETF = 0x80104267 + BIOCSETFNR = 0x8010427e + BIOCSETIF = 0x8020426c + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8010426d + BIOCSSEESENT = 0x80044277 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x8000 + BSDLY = 0x8000 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_MONOTONIC_RAW_APPROX = 0x5 + CLOCK_PROCESS_CPUTIME_ID = 0xc + CLOCK_REALTIME = 0x0 + CLOCK_THREAD_CPUTIME_ID = 0x10 + CLOCK_UPTIME_RAW = 0x8 + CLOCK_UPTIME_RAW_APPROX = 0x9 + CR0 = 0x0 + CR1 = 0x1000 + CR2 = 0x2000 + CR3 = 0x3000 + CRDLY = 0x3000 + CREAD = 0x800 + CRTSCTS = 0x30000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0xf5 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_EXCEPT = -0xf + EVFILT_FS = -0x9 + EVFILT_MACHPORT = -0x8 + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xf + EVFILT_THREADMARKER = 0xf + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xa + EVFILT_VM = -0xc + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_DISPATCH2 = 0x180 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG0 = 0x1000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_OOBAND = 0x2000 + EV_POLL = 0x1000 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EV_UDATA_SPECIFIC = 0x100 + EV_VANISHED = 0x200 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x4000 + FFDLY = 0x4000 + FLUSHO = 0x800000 + FSOPT_ATTR_CMN_EXTENDED = 0x20 + FSOPT_NOFOLLOW = 0x1 + FSOPT_NOINMEMUPDATE = 0x2 + FSOPT_PACK_INVAL_ATTRS = 0x8 + FSOPT_REPORT_FULLSIZE = 0x4 + F_ADDFILESIGS = 0x3d + F_ADDFILESIGS_FOR_DYLD_SIM = 0x53 + F_ADDFILESIGS_RETURN = 0x61 + F_ADDSIGS = 0x3b + F_ALLOCATEALL = 0x4 + F_ALLOCATECONTIG = 0x2 + F_BARRIERFSYNC = 0x55 + F_CHECK_LV = 0x62 + F_CHKCLEAN = 0x29 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x43 + F_FINDSIGS = 0x4e + F_FLUSH_DATA = 0x28 + F_FREEZE_FS = 0x35 + F_FULLFSYNC = 0x33 + F_GETCODEDIR = 0x48 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETLKPID = 0x42 + F_GETNOSIGPIPE = 0x4a + F_GETOWN = 0x5 + F_GETPATH = 0x32 + F_GETPATH_MTMINFO = 0x47 + F_GETPROTECTIONCLASS = 0x3f + F_GETPROTECTIONLEVEL = 0x4d + F_GLOBAL_NOCACHE = 0x37 + F_LOG2PHYS = 0x31 + F_LOG2PHYS_EXT = 0x41 + F_NOCACHE = 0x30 + F_NODIRECT = 0x3e + F_OK = 0x0 + F_PATHPKG_CHECK = 0x34 + F_PEOFPOSMODE = 0x3 + F_PREALLOCATE = 0x2a + F_PUNCHHOLE = 0x63 + F_RDADVISE = 0x2c + F_RDAHEAD = 0x2d + F_RDLCK = 0x1 + F_SETBACKINGSTORE = 0x46 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETLKWTIMEOUT = 0xa + F_SETNOSIGPIPE = 0x49 + F_SETOWN = 0x6 + F_SETPROTECTIONCLASS = 0x40 + F_SETSIZE = 0x2b + F_SINGLE_WRITER = 0x4c + F_THAW_FS = 0x36 + F_TRANSCODEKEY = 0x4b + F_TRIM_ACTIVE_FILE = 0x64 + F_UNLCK = 0x2 + F_VOLPOSMODE = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_AAL5 = 0x31 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ATM = 0x25 + IFT_BRIDGE = 0xd1 + IFT_CARP = 0xf8 + IFT_CELLULAR = 0xff + IFT_CEPT = 0x13 + IFT_DS3 = 0x1e + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_ETHER = 0x6 + IFT_FAITH = 0x38 + IFT_FDDI = 0xf + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_GIF = 0x37 + IFT_HDH1822 = 0x3 + IFT_HIPPI = 0x2f + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IEEE1394 = 0x90 + IFT_IEEE8023ADLAG = 0x88 + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88026 = 0xa + IFT_L2VLAN = 0x87 + IFT_LAPB = 0x10 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_NSIP = 0x1b + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PDP = 0xff + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PKTAP = 0xfe + IFT_PPP = 0x17 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PTPSERIAL = 0x16 + IFT_RS232 = 0x21 + IFT_SDLC = 0x11 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_STARLAN = 0xb + IFT_STF = 0x39 + IFT_T1 = 0x12 + IFT_ULTRA = 0x1d + IFT_V35 = 0x2d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LINKLOCALNETNUM = 0xa9fe0000 + IN_LOOPBACKNET = 0x7f + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0xfe + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MEAS = 0x13 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEP = 0x21 + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_2292DSTOPTS = 0x17 + IPV6_2292HOPLIMIT = 0x14 + IPV6_2292HOPOPTS = 0x16 + IPV6_2292NEXTHOP = 0x15 + IPV6_2292PKTINFO = 0x13 + IPV6_2292PKTOPTIONS = 0x19 + IPV6_2292RTHDR = 0x18 + IPV6_BINDV6ONLY = 0x1b + IPV6_BOUND_IF = 0x7d + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FLOW_ECN_MASK = 0x300 + IPV6_FRAGTTL = 0x3c + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVTCLASS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x24 + IPV6_UNICAST_HOPS = 0x4 + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BLOCK_SOURCE = 0x48 + IP_BOUND_IF = 0x19 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FAITH = 0x16 + IP_FW_ADD = 0x28 + IP_FW_DEL = 0x29 + IP_FW_FLUSH = 0x2a + IP_FW_GET = 0x2c + IP_FW_RESETLOG = 0x2d + IP_FW_ZERO = 0x2b + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MF = 0x2000 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_IFINDEX = 0x42 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_NAT__XXX = 0x37 + IP_OFFMASK = 0x1fff + IP_OLD_FW_ADD = 0x32 + IP_OLD_FW_DEL = 0x33 + IP_OLD_FW_FLUSH = 0x34 + IP_OLD_FW_GET = 0x36 + IP_OLD_FW_RESETLOG = 0x38 + IP_OLD_FW_ZERO = 0x35 + IP_OPTIONS = 0x1 + IP_PKTINFO = 0x1a + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVPKTINFO = 0x1a + IP_RECVRETOPTS = 0x6 + IP_RECVTOS = 0x1b + IP_RECVTTL = 0x18 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_STRIPHDR = 0x17 + IP_TOS = 0x3 + IP_TRAFFIC_MGT_BACKGROUND = 0x41 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_CAN_REUSE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_FREE_REUSABLE = 0x7 + MADV_FREE_REUSE = 0x8 + MADV_NORMAL = 0x0 + MADV_PAGEOUT = 0xa + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MADV_ZERO_WIRED_PAGES = 0x6 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_JIT = 0x800 + MAP_NOCACHE = 0x400 + MAP_NOEXTEND = 0x100 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_RESERVED0080 = 0x80 + MAP_RESILIENT_CODESIGN = 0x2000 + MAP_RESILIENT_MEDIA = 0x4000 + MAP_SHARED = 0x1 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x400000 + MNT_CMDFLAGS = 0xf0000 + MNT_CPROTECT = 0x80 + MNT_DEFWRITE = 0x2000000 + MNT_DONTBROWSE = 0x100000 + MNT_DOVOLFS = 0x8000 + MNT_DWAIT = 0x4 + MNT_EXPORTED = 0x100 + MNT_FORCE = 0x80000 + MNT_IGNORE_OWNERSHIP = 0x200000 + MNT_JOURNALED = 0x800000 + MNT_LOCAL = 0x1000 + MNT_MULTILABEL = 0x4000000 + MNT_NOATIME = 0x10000000 + MNT_NOBLOCK = 0x20000 + MNT_NODEV = 0x10 + MNT_NOEXEC = 0x4 + MNT_NOSUID = 0x8 + MNT_NOUSERXATTR = 0x1000000 + MNT_NOWAIT = 0x2 + MNT_QUARANTINE = 0x400 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UNKNOWNPERMISSIONS = 0x200000 + MNT_UPDATE = 0x10000 + MNT_VISFLAGMASK = 0x17f0f5ff + MNT_WAIT = 0x1 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_FLUSH = 0x400 + MSG_HAVEMORE = 0x2000 + MSG_HOLD = 0x800 + MSG_NEEDSA = 0x10000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_RCVMORE = 0x4000 + MSG_SEND = 0x1000 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITSTREAM = 0x200 + MS_ASYNC = 0x1 + MS_DEACTIVATE = 0x8 + MS_INVALIDATE = 0x2 + MS_KILLPAGES = 0x4 + MS_SYNC = 0x10 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_DUMP2 = 0x7 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLIST2 = 0x6 + NET_RT_MAXID = 0xa + NET_RT_STAT = 0x4 + NET_RT_TRASH = 0x5 + NL0 = 0x0 + NL1 = 0x100 + NL2 = 0x200 + NL3 = 0x300 + NLDLY = 0x300 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ABSOLUTE = 0x8 + NOTE_ATTRIB = 0x8 + NOTE_BACKGROUND = 0x40 + NOTE_CHILD = 0x4 + NOTE_CRITICAL = 0x20 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXITSTATUS = 0x4000000 + NOTE_EXIT_CSERROR = 0x40000 + NOTE_EXIT_DECRYPTFAIL = 0x10000 + NOTE_EXIT_DETAIL = 0x2000000 + NOTE_EXIT_DETAIL_MASK = 0x70000 + NOTE_EXIT_MEMORY = 0x20000 + NOTE_EXIT_REPARENTED = 0x80000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FORK = 0x40000000 + NOTE_FUNLOCK = 0x100 + NOTE_LEEWAY = 0x10 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_MACH_CONTINUOUS_TIME = 0x80 + NOTE_NONE = 0x80 + NOTE_NSECONDS = 0x4 + NOTE_OOB = 0x2 + NOTE_PCTRLMASK = -0x100000 + NOTE_PDATAMASK = 0xfffff + NOTE_REAP = 0x10000000 + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_SIGNAL = 0x8000000 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x2 + NOTE_VM_ERROR = 0x10000000 + NOTE_VM_PRESSURE = 0x80000000 + NOTE_VM_PRESSURE_SUDDEN_TERMINATE = 0x20000000 + NOTE_VM_PRESSURE_TERMINATE = 0x40000000 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OFDEL = 0x20000 + OFILL = 0x80 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_ALERT = 0x20000000 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x1000000 + O_CREAT = 0x200 + O_DIRECTORY = 0x100000 + O_DP_GETRAWENCRYPTED = 0x1 + O_DP_GETRAWUNENCRYPTED = 0x2 + O_DSYNC = 0x400000 + O_EVTONLY = 0x8000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x20000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_POPUP = 0x80000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYMLINK = 0x200000 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PT_ATTACH = 0xa + PT_ATTACHEXC = 0xe + PT_CONTINUE = 0x7 + PT_DENY_ATTACH = 0x1f + PT_DETACH = 0xb + PT_FIRSTMACH = 0x20 + PT_FORCEQUOTA = 0x1e + PT_KILL = 0x8 + PT_READ_D = 0x2 + PT_READ_I = 0x1 + PT_READ_U = 0x3 + PT_SIGEXC = 0xc + PT_STEP = 0x9 + PT_THUPDATE = 0xd + PT_TRACE_ME = 0x0 + PT_WRITE_D = 0x5 + PT_WRITE_I = 0x4 + PT_WRITE_U = 0x6 + RLIMIT_AS = 0x5 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_CPU_USAGE_MONITOR = 0x2 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_CLONING = 0x100 + RTF_CONDEMNED = 0x2000000 + RTF_DELCLONE = 0x80 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_IFREF = 0x4000000 + RTF_IFSCOPE = 0x1000000 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_NOIFREF = 0x2000 + RTF_PINNED = 0x100000 + RTF_PRCLONING = 0x10000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_PROXY = 0x8000000 + RTF_REJECT = 0x8 + RTF_ROUTER = 0x10000000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_WASCLONED = 0x20000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_GET2 = 0x14 + RTM_IFINFO = 0xe + RTM_IFINFO2 = 0x12 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_NEWMADDR2 = 0x13 + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SCM_TIMESTAMP_MONOTONIC = 0x4 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCARPIPLL = 0xc0206928 + SIOCATMARK = 0x40047307 + SIOCAUTOADDR = 0xc0206926 + SIOCAUTONETMASK = 0x80206927 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFPHYADDR = 0x80206941 + SIOCGDRVSPEC = 0xc028697b + SIOCGETVLAN = 0xc020697f + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFALTMTU = 0xc0206948 + SIOCGIFASYNCMAP = 0xc020697c + SIOCGIFBOND = 0xc0206947 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020695b + SIOCGIFCONF = 0xc00c6924 + SIOCGIFDEVMTU = 0xc0206944 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFKPI = 0xc0206987 + SIOCGIFMAC = 0xc0206982 + SIOCGIFMEDIA = 0xc02c6938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206940 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc020693f + SIOCGIFSTATUS = 0xc331693d + SIOCGIFVLAN = 0xc020697f + SIOCGIFWAKEFLAGS = 0xc0206988 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCIFCREATE = 0xc0206978 + SIOCIFCREATE2 = 0xc020697a + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc0106981 + SIOCRSLVMULTI = 0xc010693b + SIOCSDRVSPEC = 0x8028697b + SIOCSETVLAN = 0x8020697e + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFALTMTU = 0x80206945 + SIOCSIFASYNCMAP = 0x8020697d + SIOCSIFBOND = 0x80206946 + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020695a + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFKPI = 0x80206986 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206983 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x8040693e + SIOCSIFPHYS = 0x80206936 + SIOCSIFVLAN = 0x8020697e + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_DONTTRUNC = 0x2000 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1010 + SO_LINGER = 0x80 + SO_LINGER_SEC = 0x1080 + SO_NETSVC_MARKING_LEVEL = 0x1119 + SO_NET_SERVICE_TYPE = 0x1116 + SO_NKE = 0x1021 + SO_NOADDRERR = 0x1023 + SO_NOSIGPIPE = 0x1022 + SO_NOTIFYCONFLICT = 0x1026 + SO_NP_EXTENSIONS = 0x1083 + SO_NREAD = 0x1020 + SO_NUMRCVPKT = 0x1112 + SO_NWRITE = 0x1024 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1011 + SO_RANDOMPORT = 0x1082 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_REUSESHAREUID = 0x1025 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TIMESTAMP_MONOTONIC = 0x800 + SO_TYPE = 0x1008 + SO_UPCALLCLOSEWAIT = 0x1027 + SO_USELOOPBACK = 0x40 + SO_WANTMORE = 0x4000 + SO_WANTOOBFLAG = 0x8000 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFWHT = 0xe000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x400 + TAB2 = 0x800 + TAB3 = 0x4 + TABDLY = 0xc04 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCP_CONNECTIONTIMEOUT = 0x20 + TCP_CONNECTION_INFO = 0x106 + TCP_ENABLE_ECN = 0x104 + TCP_FASTOPEN = 0x105 + TCP_KEEPALIVE = 0x10 + TCP_KEEPCNT = 0x102 + TCP_KEEPINTVL = 0x101 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MINMSS = 0xd8 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_NOTSENT_LOWAT = 0x201 + TCP_RXT_CONNDROPTIME = 0x80 + TCP_RXT_FINDROP = 0x100 + TCP_SENDMOREACKS = 0x103 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x40107458 + TIOCDRAIN = 0x2000745e + TIOCDSIMICROCODE = 0x20007455 + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x40487413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGWINSZ = 0x40087468 + TIOCIXOFF = 0x20007480 + TIOCIXON = 0x20007481 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMODG = 0x40047403 + TIOCMODS = 0x80047404 + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTYGNAME = 0x40807453 + TIOCPTYGRANT = 0x20007454 + TIOCPTYUNLK = 0x20007452 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCONS = 0x20007463 + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x80487414 + TIOCSETAF = 0x80487416 + TIOCSETAW = 0x80487415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2000745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40107459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VM_LOADAVG = 0x2 + VM_MACHFACTOR = 0x4 + VM_MAXID = 0x6 + VM_METER = 0x1 + VM_SWAPUSAGE = 0x5 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VT0 = 0x0 + VT1 = 0x10000 + VTDLY = 0x10000 + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x10 + WCOREFLAG = 0x80 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOWAIT = 0x20 + WORDSIZE = 0x40 + WSTOPPED = 0x8 + WUNTRACED = 0x2 + XATTR_CREATE = 0x2 + XATTR_NODEFAULT = 0x10 + XATTR_NOFOLLOW = 0x1 + XATTR_NOSECURITY = 0x8 + XATTR_REPLACE = 0x4 + XATTR_SHOWCOMPRESSION = 0x20 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADARCH = syscall.Errno(0x56) + EBADEXEC = syscall.Errno(0x55) + EBADF = syscall.Errno(0x9) + EBADMACHO = syscall.Errno(0x58) + EBADMSG = syscall.Errno(0x5e) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x59) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDEVERR = syscall.Errno(0x53) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x5a) + EILSEQ = syscall.Errno(0x5c) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x6a) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5f) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x5d) + ENOBUFS = syscall.Errno(0x37) + ENODATA = syscall.Errno(0x60) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x61) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x5b) + ENOPOLICY = syscall.Errno(0x67) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x62) + ENOSTR = syscall.Errno(0x63) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x68) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x66) + EOVERFLOW = syscall.Errno(0x54) + EOWNERDEAD = syscall.Errno(0x69) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x64) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + EPWROFF = syscall.Errno(0x52) + EQFULL = syscall.Errno(0x6a) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHLIBVERS = syscall.Errno(0x57) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIME = syscall.Errno(0x65) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "device not configured"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EDEADLK", "resource deadlock avoided"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "cross-device link"}, + {19, "ENODEV", "operation not supported by device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "result too large"}, + {35, "EAGAIN", "resource temporarily unavailable"}, + {36, "EINPROGRESS", "operation now in progress"}, + {37, "EALREADY", "operation already in progress"}, + {38, "ENOTSOCK", "socket operation on non-socket"}, + {39, "EDESTADDRREQ", "destination address required"}, + {40, "EMSGSIZE", "message too long"}, + {41, "EPROTOTYPE", "protocol wrong type for socket"}, + {42, "ENOPROTOOPT", "protocol not available"}, + {43, "EPROTONOSUPPORT", "protocol not supported"}, + {44, "ESOCKTNOSUPPORT", "socket type not supported"}, + {45, "ENOTSUP", "operation not supported"}, + {46, "EPFNOSUPPORT", "protocol family not supported"}, + {47, "EAFNOSUPPORT", "address family not supported by protocol family"}, + {48, "EADDRINUSE", "address already in use"}, + {49, "EADDRNOTAVAIL", "can't assign requested address"}, + {50, "ENETDOWN", "network is down"}, + {51, "ENETUNREACH", "network is unreachable"}, + {52, "ENETRESET", "network dropped connection on reset"}, + {53, "ECONNABORTED", "software caused connection abort"}, + {54, "ECONNRESET", "connection reset by peer"}, + {55, "ENOBUFS", "no buffer space available"}, + {56, "EISCONN", "socket is already connected"}, + {57, "ENOTCONN", "socket is not connected"}, + {58, "ESHUTDOWN", "can't send after socket shutdown"}, + {59, "ETOOMANYREFS", "too many references: can't splice"}, + {60, "ETIMEDOUT", "operation timed out"}, + {61, "ECONNREFUSED", "connection refused"}, + {62, "ELOOP", "too many levels of symbolic links"}, + {63, "ENAMETOOLONG", "file name too long"}, + {64, "EHOSTDOWN", "host is down"}, + {65, "EHOSTUNREACH", "no route to host"}, + {66, "ENOTEMPTY", "directory not empty"}, + {67, "EPROCLIM", "too many processes"}, + {68, "EUSERS", "too many users"}, + {69, "EDQUOT", "disc quota exceeded"}, + {70, "ESTALE", "stale NFS file handle"}, + {71, "EREMOTE", "too many levels of remote in path"}, + {72, "EBADRPC", "RPC struct is bad"}, + {73, "ERPCMISMATCH", "RPC version wrong"}, + {74, "EPROGUNAVAIL", "RPC prog. not avail"}, + {75, "EPROGMISMATCH", "program version wrong"}, + {76, "EPROCUNAVAIL", "bad procedure for program"}, + {77, "ENOLCK", "no locks available"}, + {78, "ENOSYS", "function not implemented"}, + {79, "EFTYPE", "inappropriate file type or format"}, + {80, "EAUTH", "authentication error"}, + {81, "ENEEDAUTH", "need authenticator"}, + {82, "EPWROFF", "device power is off"}, + {83, "EDEVERR", "device error"}, + {84, "EOVERFLOW", "value too large to be stored in data type"}, + {85, "EBADEXEC", "bad executable (or shared library)"}, + {86, "EBADARCH", "bad CPU type in executable"}, + {87, "ESHLIBVERS", "shared library version mismatch"}, + {88, "EBADMACHO", "malformed Mach-o file"}, + {89, "ECANCELED", "operation canceled"}, + {90, "EIDRM", "identifier removed"}, + {91, "ENOMSG", "no message of desired type"}, + {92, "EILSEQ", "illegal byte sequence"}, + {93, "ENOATTR", "attribute not found"}, + {94, "EBADMSG", "bad message"}, + {95, "EMULTIHOP", "EMULTIHOP (Reserved)"}, + {96, "ENODATA", "no message available on STREAM"}, + {97, "ENOLINK", "ENOLINK (Reserved)"}, + {98, "ENOSR", "no STREAM resources"}, + {99, "ENOSTR", "not a STREAM"}, + {100, "EPROTO", "protocol error"}, + {101, "ETIME", "STREAM ioctl timeout"}, + {102, "EOPNOTSUPP", "operation not supported on socket"}, + {103, "ENOPOLICY", "policy not found"}, + {104, "ENOTRECOVERABLE", "state not recoverable"}, + {105, "EOWNERDEAD", "previous owner died"}, + {106, "EQFULL", "interface output queue is full"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/BPT trap"}, + {6, "SIGABRT", "abort trap"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGURG", "urgent I/O condition"}, + {17, "SIGSTOP", "suspended (signal)"}, + {18, "SIGTSTP", "suspended"}, + {19, "SIGCONT", "continued"}, + {20, "SIGCHLD", "child exited"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGIO", "I/O possible"}, + {24, "SIGXCPU", "cputime limit exceeded"}, + {25, "SIGXFSZ", "filesize limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window size changes"}, + {29, "SIGINFO", "information request"}, + {30, "SIGUSR1", "user defined signal 1"}, + {31, "SIGUSR2", "user defined signal 2"}, +} diff --git a/api/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go b/api/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go new file mode 100644 index 0000000..6d56d8a --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go @@ -0,0 +1,1783 @@ +// mkerrors.sh -m64 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm64,darwin + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1c + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1e + AF_IPX = 0x17 + AF_ISDN = 0x1c + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x28 + AF_NATM = 0x1f + AF_NDRV = 0x1b + AF_NETBIOS = 0x21 + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PPP = 0x22 + AF_PUP = 0x4 + AF_RESERVED_36 = 0x24 + AF_ROUTE = 0x11 + AF_SIP = 0x18 + AF_SNA = 0xb + AF_SYSTEM = 0x20 + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_UTUN = 0x26 + ALTWERASE = 0x200 + ATTR_BIT_MAP_COUNT = 0x5 + ATTR_CMN_ACCESSMASK = 0x20000 + ATTR_CMN_ACCTIME = 0x1000 + ATTR_CMN_ADDEDTIME = 0x10000000 + ATTR_CMN_BKUPTIME = 0x2000 + ATTR_CMN_CHGTIME = 0x800 + ATTR_CMN_CRTIME = 0x200 + ATTR_CMN_DATA_PROTECT_FLAGS = 0x40000000 + ATTR_CMN_DEVID = 0x2 + ATTR_CMN_DOCUMENT_ID = 0x100000 + ATTR_CMN_ERROR = 0x20000000 + ATTR_CMN_EXTENDED_SECURITY = 0x400000 + ATTR_CMN_FILEID = 0x2000000 + ATTR_CMN_FLAGS = 0x40000 + ATTR_CMN_FNDRINFO = 0x4000 + ATTR_CMN_FSID = 0x4 + ATTR_CMN_FULLPATH = 0x8000000 + ATTR_CMN_GEN_COUNT = 0x80000 + ATTR_CMN_GRPID = 0x10000 + ATTR_CMN_GRPUUID = 0x1000000 + ATTR_CMN_MODTIME = 0x400 + ATTR_CMN_NAME = 0x1 + ATTR_CMN_NAMEDATTRCOUNT = 0x80000 + ATTR_CMN_NAMEDATTRLIST = 0x100000 + ATTR_CMN_OBJID = 0x20 + ATTR_CMN_OBJPERMANENTID = 0x40 + ATTR_CMN_OBJTAG = 0x10 + ATTR_CMN_OBJTYPE = 0x8 + ATTR_CMN_OWNERID = 0x8000 + ATTR_CMN_PARENTID = 0x4000000 + ATTR_CMN_PAROBJID = 0x80 + ATTR_CMN_RETURNED_ATTRS = 0x80000000 + ATTR_CMN_SCRIPT = 0x100 + ATTR_CMN_SETMASK = 0x41c7ff00 + ATTR_CMN_USERACCESS = 0x200000 + ATTR_CMN_UUID = 0x800000 + ATTR_CMN_VALIDMASK = 0xffffffff + ATTR_CMN_VOLSETMASK = 0x6700 + ATTR_FILE_ALLOCSIZE = 0x4 + ATTR_FILE_CLUMPSIZE = 0x10 + ATTR_FILE_DATAALLOCSIZE = 0x400 + ATTR_FILE_DATAEXTENTS = 0x800 + ATTR_FILE_DATALENGTH = 0x200 + ATTR_FILE_DEVTYPE = 0x20 + ATTR_FILE_FILETYPE = 0x40 + ATTR_FILE_FORKCOUNT = 0x80 + ATTR_FILE_FORKLIST = 0x100 + ATTR_FILE_IOBLOCKSIZE = 0x8 + ATTR_FILE_LINKCOUNT = 0x1 + ATTR_FILE_RSRCALLOCSIZE = 0x2000 + ATTR_FILE_RSRCEXTENTS = 0x4000 + ATTR_FILE_RSRCLENGTH = 0x1000 + ATTR_FILE_SETMASK = 0x20 + ATTR_FILE_TOTALSIZE = 0x2 + ATTR_FILE_VALIDMASK = 0x37ff + ATTR_VOL_ALLOCATIONCLUMP = 0x40 + ATTR_VOL_ATTRIBUTES = 0x40000000 + ATTR_VOL_CAPABILITIES = 0x20000 + ATTR_VOL_DIRCOUNT = 0x400 + ATTR_VOL_ENCODINGSUSED = 0x10000 + ATTR_VOL_FILECOUNT = 0x200 + ATTR_VOL_FSTYPE = 0x1 + ATTR_VOL_INFO = 0x80000000 + ATTR_VOL_IOBLOCKSIZE = 0x80 + ATTR_VOL_MAXOBJCOUNT = 0x800 + ATTR_VOL_MINALLOCATION = 0x20 + ATTR_VOL_MOUNTEDDEVICE = 0x8000 + ATTR_VOL_MOUNTFLAGS = 0x4000 + ATTR_VOL_MOUNTPOINT = 0x1000 + ATTR_VOL_NAME = 0x2000 + ATTR_VOL_OBJCOUNT = 0x100 + ATTR_VOL_QUOTA_SIZE = 0x10000000 + ATTR_VOL_RESERVED_SIZE = 0x20000000 + ATTR_VOL_SETMASK = 0x80002000 + ATTR_VOL_SIGNATURE = 0x2 + ATTR_VOL_SIZE = 0x4 + ATTR_VOL_SPACEAVAIL = 0x10 + ATTR_VOL_SPACEFREE = 0x8 + ATTR_VOL_UUID = 0x40000 + ATTR_VOL_VALIDMASK = 0xf007ffff + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B9600 = 0x2580 + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc00c4279 + BIOCGETIF = 0x4020426b + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044278 + BIOCSETF = 0x80104267 + BIOCSETFNR = 0x8010427e + BIOCSETIF = 0x8020426c + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8010426d + BIOCSSEESENT = 0x80044277 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x8000 + BSDLY = 0x8000 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_MONOTONIC_RAW_APPROX = 0x5 + CLOCK_PROCESS_CPUTIME_ID = 0xc + CLOCK_REALTIME = 0x0 + CLOCK_THREAD_CPUTIME_ID = 0x10 + CLOCK_UPTIME_RAW = 0x8 + CLOCK_UPTIME_RAW_APPROX = 0x9 + CR0 = 0x0 + CR1 = 0x1000 + CR2 = 0x2000 + CR3 = 0x3000 + CRDLY = 0x3000 + CREAD = 0x800 + CRTSCTS = 0x30000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0xf5 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_EXCEPT = -0xf + EVFILT_FS = -0x9 + EVFILT_MACHPORT = -0x8 + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xf + EVFILT_THREADMARKER = 0xf + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xa + EVFILT_VM = -0xc + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_DISPATCH2 = 0x180 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG0 = 0x1000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_OOBAND = 0x2000 + EV_POLL = 0x1000 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EV_UDATA_SPECIFIC = 0x100 + EV_VANISHED = 0x200 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x4000 + FFDLY = 0x4000 + FLUSHO = 0x800000 + FSOPT_ATTR_CMN_EXTENDED = 0x20 + FSOPT_NOFOLLOW = 0x1 + FSOPT_NOINMEMUPDATE = 0x2 + FSOPT_PACK_INVAL_ATTRS = 0x8 + FSOPT_REPORT_FULLSIZE = 0x4 + F_ADDFILESIGS = 0x3d + F_ADDFILESIGS_FOR_DYLD_SIM = 0x53 + F_ADDFILESIGS_RETURN = 0x61 + F_ADDSIGS = 0x3b + F_ALLOCATEALL = 0x4 + F_ALLOCATECONTIG = 0x2 + F_BARRIERFSYNC = 0x55 + F_CHECK_LV = 0x62 + F_CHKCLEAN = 0x29 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x43 + F_FINDSIGS = 0x4e + F_FLUSH_DATA = 0x28 + F_FREEZE_FS = 0x35 + F_FULLFSYNC = 0x33 + F_GETCODEDIR = 0x48 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETLKPID = 0x42 + F_GETNOSIGPIPE = 0x4a + F_GETOWN = 0x5 + F_GETPATH = 0x32 + F_GETPATH_MTMINFO = 0x47 + F_GETPROTECTIONCLASS = 0x3f + F_GETPROTECTIONLEVEL = 0x4d + F_GLOBAL_NOCACHE = 0x37 + F_LOG2PHYS = 0x31 + F_LOG2PHYS_EXT = 0x41 + F_NOCACHE = 0x30 + F_NODIRECT = 0x3e + F_OK = 0x0 + F_PATHPKG_CHECK = 0x34 + F_PEOFPOSMODE = 0x3 + F_PREALLOCATE = 0x2a + F_PUNCHHOLE = 0x63 + F_RDADVISE = 0x2c + F_RDAHEAD = 0x2d + F_RDLCK = 0x1 + F_SETBACKINGSTORE = 0x46 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETLKWTIMEOUT = 0xa + F_SETNOSIGPIPE = 0x49 + F_SETOWN = 0x6 + F_SETPROTECTIONCLASS = 0x40 + F_SETSIZE = 0x2b + F_SINGLE_WRITER = 0x4c + F_THAW_FS = 0x36 + F_TRANSCODEKEY = 0x4b + F_TRIM_ACTIVE_FILE = 0x64 + F_UNLCK = 0x2 + F_VOLPOSMODE = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_AAL5 = 0x31 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ATM = 0x25 + IFT_BRIDGE = 0xd1 + IFT_CARP = 0xf8 + IFT_CELLULAR = 0xff + IFT_CEPT = 0x13 + IFT_DS3 = 0x1e + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_ETHER = 0x6 + IFT_FAITH = 0x38 + IFT_FDDI = 0xf + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_GIF = 0x37 + IFT_HDH1822 = 0x3 + IFT_HIPPI = 0x2f + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IEEE1394 = 0x90 + IFT_IEEE8023ADLAG = 0x88 + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88026 = 0xa + IFT_L2VLAN = 0x87 + IFT_LAPB = 0x10 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_NSIP = 0x1b + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PDP = 0xff + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PKTAP = 0xfe + IFT_PPP = 0x17 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PTPSERIAL = 0x16 + IFT_RS232 = 0x21 + IFT_SDLC = 0x11 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_STARLAN = 0xb + IFT_STF = 0x39 + IFT_T1 = 0x12 + IFT_ULTRA = 0x1d + IFT_V35 = 0x2d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LINKLOCALNETNUM = 0xa9fe0000 + IN_LOOPBACKNET = 0x7f + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0xfe + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MEAS = 0x13 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEP = 0x21 + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_2292DSTOPTS = 0x17 + IPV6_2292HOPLIMIT = 0x14 + IPV6_2292HOPOPTS = 0x16 + IPV6_2292NEXTHOP = 0x15 + IPV6_2292PKTINFO = 0x13 + IPV6_2292PKTOPTIONS = 0x19 + IPV6_2292RTHDR = 0x18 + IPV6_BINDV6ONLY = 0x1b + IPV6_BOUND_IF = 0x7d + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FLOW_ECN_MASK = 0x300 + IPV6_FRAGTTL = 0x3c + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVTCLASS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x24 + IPV6_UNICAST_HOPS = 0x4 + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BLOCK_SOURCE = 0x48 + IP_BOUND_IF = 0x19 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FAITH = 0x16 + IP_FW_ADD = 0x28 + IP_FW_DEL = 0x29 + IP_FW_FLUSH = 0x2a + IP_FW_GET = 0x2c + IP_FW_RESETLOG = 0x2d + IP_FW_ZERO = 0x2b + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MF = 0x2000 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_IFINDEX = 0x42 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_NAT__XXX = 0x37 + IP_OFFMASK = 0x1fff + IP_OLD_FW_ADD = 0x32 + IP_OLD_FW_DEL = 0x33 + IP_OLD_FW_FLUSH = 0x34 + IP_OLD_FW_GET = 0x36 + IP_OLD_FW_RESETLOG = 0x38 + IP_OLD_FW_ZERO = 0x35 + IP_OPTIONS = 0x1 + IP_PKTINFO = 0x1a + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVPKTINFO = 0x1a + IP_RECVRETOPTS = 0x6 + IP_RECVTOS = 0x1b + IP_RECVTTL = 0x18 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_STRIPHDR = 0x17 + IP_TOS = 0x3 + IP_TRAFFIC_MGT_BACKGROUND = 0x41 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_CAN_REUSE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_FREE_REUSABLE = 0x7 + MADV_FREE_REUSE = 0x8 + MADV_NORMAL = 0x0 + MADV_PAGEOUT = 0xa + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MADV_ZERO_WIRED_PAGES = 0x6 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_JIT = 0x800 + MAP_NOCACHE = 0x400 + MAP_NOEXTEND = 0x100 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_RESERVED0080 = 0x80 + MAP_RESILIENT_CODESIGN = 0x2000 + MAP_RESILIENT_MEDIA = 0x4000 + MAP_SHARED = 0x1 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x400000 + MNT_CMDFLAGS = 0xf0000 + MNT_CPROTECT = 0x80 + MNT_DEFWRITE = 0x2000000 + MNT_DONTBROWSE = 0x100000 + MNT_DOVOLFS = 0x8000 + MNT_DWAIT = 0x4 + MNT_EXPORTED = 0x100 + MNT_FORCE = 0x80000 + MNT_IGNORE_OWNERSHIP = 0x200000 + MNT_JOURNALED = 0x800000 + MNT_LOCAL = 0x1000 + MNT_MULTILABEL = 0x4000000 + MNT_NOATIME = 0x10000000 + MNT_NOBLOCK = 0x20000 + MNT_NODEV = 0x10 + MNT_NOEXEC = 0x4 + MNT_NOSUID = 0x8 + MNT_NOUSERXATTR = 0x1000000 + MNT_NOWAIT = 0x2 + MNT_QUARANTINE = 0x400 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UNKNOWNPERMISSIONS = 0x200000 + MNT_UPDATE = 0x10000 + MNT_VISFLAGMASK = 0x17f0f5ff + MNT_WAIT = 0x1 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_FLUSH = 0x400 + MSG_HAVEMORE = 0x2000 + MSG_HOLD = 0x800 + MSG_NEEDSA = 0x10000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_RCVMORE = 0x4000 + MSG_SEND = 0x1000 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITSTREAM = 0x200 + MS_ASYNC = 0x1 + MS_DEACTIVATE = 0x8 + MS_INVALIDATE = 0x2 + MS_KILLPAGES = 0x4 + MS_SYNC = 0x10 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_DUMP2 = 0x7 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLIST2 = 0x6 + NET_RT_MAXID = 0xa + NET_RT_STAT = 0x4 + NET_RT_TRASH = 0x5 + NL0 = 0x0 + NL1 = 0x100 + NL2 = 0x200 + NL3 = 0x300 + NLDLY = 0x300 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ABSOLUTE = 0x8 + NOTE_ATTRIB = 0x8 + NOTE_BACKGROUND = 0x40 + NOTE_CHILD = 0x4 + NOTE_CRITICAL = 0x20 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXITSTATUS = 0x4000000 + NOTE_EXIT_CSERROR = 0x40000 + NOTE_EXIT_DECRYPTFAIL = 0x10000 + NOTE_EXIT_DETAIL = 0x2000000 + NOTE_EXIT_DETAIL_MASK = 0x70000 + NOTE_EXIT_MEMORY = 0x20000 + NOTE_EXIT_REPARENTED = 0x80000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FORK = 0x40000000 + NOTE_FUNLOCK = 0x100 + NOTE_LEEWAY = 0x10 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_MACH_CONTINUOUS_TIME = 0x80 + NOTE_NONE = 0x80 + NOTE_NSECONDS = 0x4 + NOTE_OOB = 0x2 + NOTE_PCTRLMASK = -0x100000 + NOTE_PDATAMASK = 0xfffff + NOTE_REAP = 0x10000000 + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_SIGNAL = 0x8000000 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x2 + NOTE_VM_ERROR = 0x10000000 + NOTE_VM_PRESSURE = 0x80000000 + NOTE_VM_PRESSURE_SUDDEN_TERMINATE = 0x20000000 + NOTE_VM_PRESSURE_TERMINATE = 0x40000000 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OFDEL = 0x20000 + OFILL = 0x80 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_ALERT = 0x20000000 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x1000000 + O_CREAT = 0x200 + O_DIRECTORY = 0x100000 + O_DP_GETRAWENCRYPTED = 0x1 + O_DP_GETRAWUNENCRYPTED = 0x2 + O_DSYNC = 0x400000 + O_EVTONLY = 0x8000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x20000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_POPUP = 0x80000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYMLINK = 0x200000 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PT_ATTACH = 0xa + PT_ATTACHEXC = 0xe + PT_CONTINUE = 0x7 + PT_DENY_ATTACH = 0x1f + PT_DETACH = 0xb + PT_FIRSTMACH = 0x20 + PT_FORCEQUOTA = 0x1e + PT_KILL = 0x8 + PT_READ_D = 0x2 + PT_READ_I = 0x1 + PT_READ_U = 0x3 + PT_SIGEXC = 0xc + PT_STEP = 0x9 + PT_THUPDATE = 0xd + PT_TRACE_ME = 0x0 + PT_WRITE_D = 0x5 + PT_WRITE_I = 0x4 + PT_WRITE_U = 0x6 + RLIMIT_AS = 0x5 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_CPU_USAGE_MONITOR = 0x2 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_CLONING = 0x100 + RTF_CONDEMNED = 0x2000000 + RTF_DELCLONE = 0x80 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_IFREF = 0x4000000 + RTF_IFSCOPE = 0x1000000 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_NOIFREF = 0x2000 + RTF_PINNED = 0x100000 + RTF_PRCLONING = 0x10000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_PROXY = 0x8000000 + RTF_REJECT = 0x8 + RTF_ROUTER = 0x10000000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_WASCLONED = 0x20000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_GET2 = 0x14 + RTM_IFINFO = 0xe + RTM_IFINFO2 = 0x12 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_NEWMADDR2 = 0x13 + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SCM_TIMESTAMP_MONOTONIC = 0x4 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCARPIPLL = 0xc0206928 + SIOCATMARK = 0x40047307 + SIOCAUTOADDR = 0xc0206926 + SIOCAUTONETMASK = 0x80206927 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFPHYADDR = 0x80206941 + SIOCGDRVSPEC = 0xc028697b + SIOCGETVLAN = 0xc020697f + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFALTMTU = 0xc0206948 + SIOCGIFASYNCMAP = 0xc020697c + SIOCGIFBOND = 0xc0206947 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020695b + SIOCGIFCONF = 0xc00c6924 + SIOCGIFDEVMTU = 0xc0206944 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFKPI = 0xc0206987 + SIOCGIFMAC = 0xc0206982 + SIOCGIFMEDIA = 0xc02c6938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206940 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc020693f + SIOCGIFSTATUS = 0xc331693d + SIOCGIFVLAN = 0xc020697f + SIOCGIFWAKEFLAGS = 0xc0206988 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCIFCREATE = 0xc0206978 + SIOCIFCREATE2 = 0xc020697a + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc0106981 + SIOCRSLVMULTI = 0xc010693b + SIOCSDRVSPEC = 0x8028697b + SIOCSETVLAN = 0x8020697e + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFALTMTU = 0x80206945 + SIOCSIFASYNCMAP = 0x8020697d + SIOCSIFBOND = 0x80206946 + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020695a + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFKPI = 0x80206986 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206983 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x8040693e + SIOCSIFPHYS = 0x80206936 + SIOCSIFVLAN = 0x8020697e + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_DONTTRUNC = 0x2000 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1010 + SO_LINGER = 0x80 + SO_LINGER_SEC = 0x1080 + SO_NETSVC_MARKING_LEVEL = 0x1119 + SO_NET_SERVICE_TYPE = 0x1116 + SO_NKE = 0x1021 + SO_NOADDRERR = 0x1023 + SO_NOSIGPIPE = 0x1022 + SO_NOTIFYCONFLICT = 0x1026 + SO_NP_EXTENSIONS = 0x1083 + SO_NREAD = 0x1020 + SO_NUMRCVPKT = 0x1112 + SO_NWRITE = 0x1024 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1011 + SO_RANDOMPORT = 0x1082 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_REUSESHAREUID = 0x1025 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TIMESTAMP_MONOTONIC = 0x800 + SO_TYPE = 0x1008 + SO_UPCALLCLOSEWAIT = 0x1027 + SO_USELOOPBACK = 0x40 + SO_WANTMORE = 0x4000 + SO_WANTOOBFLAG = 0x8000 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFWHT = 0xe000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x400 + TAB2 = 0x800 + TAB3 = 0x4 + TABDLY = 0xc04 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCP_CONNECTIONTIMEOUT = 0x20 + TCP_CONNECTION_INFO = 0x106 + TCP_ENABLE_ECN = 0x104 + TCP_FASTOPEN = 0x105 + TCP_KEEPALIVE = 0x10 + TCP_KEEPCNT = 0x102 + TCP_KEEPINTVL = 0x101 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MINMSS = 0xd8 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_NOTSENT_LOWAT = 0x201 + TCP_RXT_CONNDROPTIME = 0x80 + TCP_RXT_FINDROP = 0x100 + TCP_SENDMOREACKS = 0x103 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x40107458 + TIOCDRAIN = 0x2000745e + TIOCDSIMICROCODE = 0x20007455 + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x40487413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGWINSZ = 0x40087468 + TIOCIXOFF = 0x20007480 + TIOCIXON = 0x20007481 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMODG = 0x40047403 + TIOCMODS = 0x80047404 + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTYGNAME = 0x40807453 + TIOCPTYGRANT = 0x20007454 + TIOCPTYUNLK = 0x20007452 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCONS = 0x20007463 + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x80487414 + TIOCSETAF = 0x80487416 + TIOCSETAW = 0x80487415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2000745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40107459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VM_LOADAVG = 0x2 + VM_MACHFACTOR = 0x4 + VM_MAXID = 0x6 + VM_METER = 0x1 + VM_SWAPUSAGE = 0x5 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VT0 = 0x0 + VT1 = 0x10000 + VTDLY = 0x10000 + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x10 + WCOREFLAG = 0x80 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOWAIT = 0x20 + WORDSIZE = 0x40 + WSTOPPED = 0x8 + WUNTRACED = 0x2 + XATTR_CREATE = 0x2 + XATTR_NODEFAULT = 0x10 + XATTR_NOFOLLOW = 0x1 + XATTR_NOSECURITY = 0x8 + XATTR_REPLACE = 0x4 + XATTR_SHOWCOMPRESSION = 0x20 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADARCH = syscall.Errno(0x56) + EBADEXEC = syscall.Errno(0x55) + EBADF = syscall.Errno(0x9) + EBADMACHO = syscall.Errno(0x58) + EBADMSG = syscall.Errno(0x5e) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x59) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDEVERR = syscall.Errno(0x53) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x5a) + EILSEQ = syscall.Errno(0x5c) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x6a) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5f) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x5d) + ENOBUFS = syscall.Errno(0x37) + ENODATA = syscall.Errno(0x60) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x61) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x5b) + ENOPOLICY = syscall.Errno(0x67) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x62) + ENOSTR = syscall.Errno(0x63) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x68) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x66) + EOVERFLOW = syscall.Errno(0x54) + EOWNERDEAD = syscall.Errno(0x69) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x64) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + EPWROFF = syscall.Errno(0x52) + EQFULL = syscall.Errno(0x6a) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHLIBVERS = syscall.Errno(0x57) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIME = syscall.Errno(0x65) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "device not configured"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EDEADLK", "resource deadlock avoided"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "cross-device link"}, + {19, "ENODEV", "operation not supported by device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "result too large"}, + {35, "EAGAIN", "resource temporarily unavailable"}, + {36, "EINPROGRESS", "operation now in progress"}, + {37, "EALREADY", "operation already in progress"}, + {38, "ENOTSOCK", "socket operation on non-socket"}, + {39, "EDESTADDRREQ", "destination address required"}, + {40, "EMSGSIZE", "message too long"}, + {41, "EPROTOTYPE", "protocol wrong type for socket"}, + {42, "ENOPROTOOPT", "protocol not available"}, + {43, "EPROTONOSUPPORT", "protocol not supported"}, + {44, "ESOCKTNOSUPPORT", "socket type not supported"}, + {45, "ENOTSUP", "operation not supported"}, + {46, "EPFNOSUPPORT", "protocol family not supported"}, + {47, "EAFNOSUPPORT", "address family not supported by protocol family"}, + {48, "EADDRINUSE", "address already in use"}, + {49, "EADDRNOTAVAIL", "can't assign requested address"}, + {50, "ENETDOWN", "network is down"}, + {51, "ENETUNREACH", "network is unreachable"}, + {52, "ENETRESET", "network dropped connection on reset"}, + {53, "ECONNABORTED", "software caused connection abort"}, + {54, "ECONNRESET", "connection reset by peer"}, + {55, "ENOBUFS", "no buffer space available"}, + {56, "EISCONN", "socket is already connected"}, + {57, "ENOTCONN", "socket is not connected"}, + {58, "ESHUTDOWN", "can't send after socket shutdown"}, + {59, "ETOOMANYREFS", "too many references: can't splice"}, + {60, "ETIMEDOUT", "operation timed out"}, + {61, "ECONNREFUSED", "connection refused"}, + {62, "ELOOP", "too many levels of symbolic links"}, + {63, "ENAMETOOLONG", "file name too long"}, + {64, "EHOSTDOWN", "host is down"}, + {65, "EHOSTUNREACH", "no route to host"}, + {66, "ENOTEMPTY", "directory not empty"}, + {67, "EPROCLIM", "too many processes"}, + {68, "EUSERS", "too many users"}, + {69, "EDQUOT", "disc quota exceeded"}, + {70, "ESTALE", "stale NFS file handle"}, + {71, "EREMOTE", "too many levels of remote in path"}, + {72, "EBADRPC", "RPC struct is bad"}, + {73, "ERPCMISMATCH", "RPC version wrong"}, + {74, "EPROGUNAVAIL", "RPC prog. not avail"}, + {75, "EPROGMISMATCH", "program version wrong"}, + {76, "EPROCUNAVAIL", "bad procedure for program"}, + {77, "ENOLCK", "no locks available"}, + {78, "ENOSYS", "function not implemented"}, + {79, "EFTYPE", "inappropriate file type or format"}, + {80, "EAUTH", "authentication error"}, + {81, "ENEEDAUTH", "need authenticator"}, + {82, "EPWROFF", "device power is off"}, + {83, "EDEVERR", "device error"}, + {84, "EOVERFLOW", "value too large to be stored in data type"}, + {85, "EBADEXEC", "bad executable (or shared library)"}, + {86, "EBADARCH", "bad CPU type in executable"}, + {87, "ESHLIBVERS", "shared library version mismatch"}, + {88, "EBADMACHO", "malformed Mach-o file"}, + {89, "ECANCELED", "operation canceled"}, + {90, "EIDRM", "identifier removed"}, + {91, "ENOMSG", "no message of desired type"}, + {92, "EILSEQ", "illegal byte sequence"}, + {93, "ENOATTR", "attribute not found"}, + {94, "EBADMSG", "bad message"}, + {95, "EMULTIHOP", "EMULTIHOP (Reserved)"}, + {96, "ENODATA", "no message available on STREAM"}, + {97, "ENOLINK", "ENOLINK (Reserved)"}, + {98, "ENOSR", "no STREAM resources"}, + {99, "ENOSTR", "not a STREAM"}, + {100, "EPROTO", "protocol error"}, + {101, "ETIME", "STREAM ioctl timeout"}, + {102, "EOPNOTSUPP", "operation not supported on socket"}, + {103, "ENOPOLICY", "policy not found"}, + {104, "ENOTRECOVERABLE", "state not recoverable"}, + {105, "EOWNERDEAD", "previous owner died"}, + {106, "EQFULL", "interface output queue is full"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/BPT trap"}, + {6, "SIGABRT", "abort trap"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGURG", "urgent I/O condition"}, + {17, "SIGSTOP", "suspended (signal)"}, + {18, "SIGTSTP", "suspended"}, + {19, "SIGCONT", "continued"}, + {20, "SIGCHLD", "child exited"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGIO", "I/O possible"}, + {24, "SIGXCPU", "cputime limit exceeded"}, + {25, "SIGXFSZ", "filesize limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window size changes"}, + {29, "SIGINFO", "information request"}, + {30, "SIGUSR1", "user defined signal 1"}, + {31, "SIGUSR2", "user defined signal 2"}, +} diff --git a/api/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go b/api/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go new file mode 100644 index 0000000..46a082b --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go @@ -0,0 +1,1586 @@ +// mkerrors.sh -m64 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,dragonfly + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_ATM = 0x1e + AF_BLUETOOTH = 0x21 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x23 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1c + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x24 + AF_MPLS = 0x22 + AF_NATM = 0x1d + AF_NETBIOS = 0x6 + AF_NETGRAPH = 0x20 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SIP = 0x18 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + ALTWERASE = 0x200 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B9600 = 0x2580 + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0104279 + BIOCGETIF = 0x4020426b + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x2000427a + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044278 + BIOCSETF = 0x80104267 + BIOCSETIF = 0x8020426c + BIOCSETWF = 0x8010427b + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8010426d + BIOCSSEESENT = 0x80044277 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x8 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DEFAULTBUFSIZE = 0x1000 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MAX_CLONES = 0x80 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x4 + CLOCK_MONOTONIC_FAST = 0xc + CLOCK_MONOTONIC_PRECISE = 0xb + CLOCK_PROCESS_CPUTIME_ID = 0xf + CLOCK_PROF = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_FAST = 0xa + CLOCK_REALTIME_PRECISE = 0x9 + CLOCK_SECOND = 0xd + CLOCK_THREAD_CPUTIME_ID = 0xe + CLOCK_UPTIME = 0x5 + CLOCK_UPTIME_FAST = 0x8 + CLOCK_UPTIME_PRECISE = 0x7 + CLOCK_VIRTUAL = 0x1 + CREAD = 0x800 + CRTSCTS = 0x30000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DOCSIS = 0x8f + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_REDBACK_SMARTEDGE = 0x20 + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DBF = 0xf + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_EXCEPT = -0x8 + EVFILT_FS = -0xa + EVFILT_MARKER = 0xf + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xa + EVFILT_TIMER = -0x7 + EVFILT_USER = -0x9 + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_NODATA = 0x1000 + EV_ONESHOT = 0x10 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTEXIT_LWP = 0x10000 + EXTEXIT_PROC = 0x0 + EXTEXIT_SETINT = 0x1 + EXTEXIT_SIMPLE = 0x0 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_DUP2FD = 0xa + F_DUP2FD_CLOEXEC = 0x12 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x11 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETOWN = 0x5 + F_OK = 0x0 + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x118e72 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MONITOR = 0x40000 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NPOLLING = 0x100000 + IFF_OACTIVE = 0x400 + IFF_OACTIVE_COMPAT = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_POLLING = 0x10000 + IFF_POLLING_COMPAT = 0x10000 + IFF_PPROMISC = 0x20000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_SMART = 0x20 + IFF_STATICARP = 0x80000 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf8 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf2 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PLC = 0xae + IFT_POS = 0xab + IFT_PPP = 0x17 + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf1 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_STF = 0xf3 + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VOICEEM = 0x64 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CARP = 0x70 + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0xfe + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MEAS = 0x13 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MOBILE = 0x37 + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SDRP = 0x2a + IPPROTO_SEP = 0x21 + IPPROTO_SKIP = 0x39 + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TLSP = 0x38 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_UNKNOWN = 0x102 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_BINDV6ONLY = 0x1b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXPACKET = 0xffff + IPV6_MINHLIM = 0x28 + IPV6_MMTU = 0x500 + IPV6_MSFILTER = 0x4a + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PKTOPTIONS = 0x34 + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_PREFER_TEMPADDR = 0x3f + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FAITH = 0x16 + IP_FW_ADD = 0x32 + IP_FW_DEL = 0x33 + IP_FW_FLUSH = 0x34 + IP_FW_GET = 0x36 + IP_FW_RESETLOG = 0x37 + IP_FW_X = 0x31 + IP_FW_ZERO = 0x35 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x42 + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVTTL = 0x41 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_TOS = 0x3 + IP_TTL = 0x4 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_AUTOSYNC = 0x7 + MADV_CONTROL_END = 0xb + MADV_CONTROL_START = 0xa + MADV_CORE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_INVAL = 0xa + MADV_NOCORE = 0x8 + MADV_NORMAL = 0x0 + MADV_NOSYNC = 0x6 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_SETMAP = 0xb + MADV_WILLNEED = 0x3 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_INHERIT = 0x80 + MAP_NOCORE = 0x20000 + MAP_NOEXTEND = 0x100 + MAP_NORESERVE = 0x40 + MAP_NOSYNC = 0x800 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_SIZEALIGN = 0x40000 + MAP_STACK = 0x400 + MAP_TRYFIXED = 0x10000 + MAP_VPAGETABLE = 0x2000 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MSG_CMSG_CLOEXEC = 0x1000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_FBLOCKING = 0x10000 + MSG_FMASK = 0xffff0000 + MSG_FNONBLOCKING = 0x20000 + MSG_NOSIGNAL = 0x400 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_SYNC = 0x800 + MSG_TRUNC = 0x10 + MSG_UNUSED09 = 0x200 + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x0 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_MAXID = 0x4 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_OOB = 0x2 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x20000 + O_CREAT = 0x200 + O_DIRECT = 0x10000 + O_DIRECTORY = 0x8000000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FAPPEND = 0x100000 + O_FASYNCWRITE = 0x800000 + O_FBLOCKING = 0x40000 + O_FMASK = 0xfc0000 + O_FNONBLOCKING = 0x80000 + O_FOFFSET = 0x200000 + O_FSYNC = 0x80 + O_FSYNCWRITE = 0x400000 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0xb + RTAX_MPLS1 = 0x8 + RTAX_MPLS2 = 0x9 + RTAX_MPLS3 = 0xa + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_MPLS1 = 0x100 + RTA_MPLS2 = 0x200 + RTA_MPLS3 = 0x400 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MPLSOPS = 0x1000000 + RTF_MULTICAST = 0x800000 + RTF_PINNED = 0x100000 + RTF_PRCLONING = 0x10000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_REJECT = 0x8 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_WASCLONED = 0x20000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x12 + RTM_IFANNOUNCE = 0x11 + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x6 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_IWCAPSEGS = 0x400 + RTV_IWMAXSEGS = 0x200 + RTV_MSL = 0x100 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCADDRT = 0x8040720a + SIOCAIFADDR = 0x8040691a + SIOCALIFADDR = 0x8118691b + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80206932 + SIOCDELRT = 0x8040720b + SIOCDIFADDR = 0x80206919 + SIOCDIFPHYADDR = 0x80206949 + SIOCDLIFADDR = 0x8118691d + SIOCGDRVSPEC = 0xc028697b + SIOCGETSGCNT = 0xc0207210 + SIOCGETVIFCNT = 0xc028720f + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020691f + SIOCGIFCONF = 0xc0106924 + SIOCGIFDATA = 0xc0206926 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc028698a + SIOCGIFINDEX = 0xc0206920 + SIOCGIFMEDIA = 0xc0306938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206948 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPOLLCPU = 0xc020697e + SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFSTATUS = 0xc331693b + SIOCGIFTSOLEN = 0xc0206980 + SIOCGLIFADDR = 0xc118691c + SIOCGLIFPHYADDR = 0xc118694b + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGPRIVATE_0 = 0xc0206950 + SIOCGPRIVATE_1 = 0xc0206951 + SIOCIFCREATE = 0xc020697a + SIOCIFCREATE2 = 0xc020697c + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc0106978 + SIOCSDRVSPEC = 0x8028697b + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020691e + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNAME = 0x80206928 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSIFPHYS = 0x80206936 + SIOCSIFPOLLCPU = 0x8020697d + SIOCSIFTSOLEN = 0x8020697f + SIOCSLIFPHYADDR = 0x8118694a + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_NONBLOCK = 0x20000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BROADCAST = 0x20 + SO_CPUHINT = 0x1030 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_NOSIGPIPE = 0x800 + SO_OOBINLINE = 0x100 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDSPACE = 0x100a + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCP_FASTKEEP = 0x80 + TCP_KEEPCNT = 0x400 + TCP_KEEPIDLE = 0x100 + TCP_KEEPINIT = 0x20 + TCP_KEEPINTVL = 0x200 + TCP_MAXBURST = 0x4 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MINMSS = 0x100 + TCP_MIN_WINSHIFT = 0x5 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_SIGNATURE_ENABLE = 0x10 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x40107458 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGSID = 0x40047463 + TIOCGSIZE = 0x40087468 + TIOCGWINSZ = 0x40087468 + TIOCISPTMASTER = 0x20007455 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMODG = 0x40047403 + TIOCMODS = 0x80047404 + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2000745f + TIOCSPGRP = 0x80047476 + TIOCSSIZE = 0x80087467 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40107459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VCHECKPT = 0x13 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VERASE2 = 0x7 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VM_BCACHE_SIZE_MAX = 0x0 + VM_SWZONE_SIZE_MAX = 0x4000000000 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x4 + WCOREFLAG = 0x80 + WLINUXCLONE = 0x80000000 + WNOHANG = 0x1 + WSTOPPED = 0x7f + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EASYNC = syscall.Errno(0x63) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x59) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x55) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDOOFUS = syscall.Errno(0x58) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x52) + EILSEQ = syscall.Errno(0x56) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x63) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5a) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x57) + ENOBUFS = syscall.Errno(0x37) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x5b) + ENOMEDIUM = syscall.Errno(0x5d) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x53) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x54) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x5c) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUNUSED94 = syscall.Errno(0x5e) + EUNUSED95 = syscall.Errno(0x5f) + EUNUSED96 = syscall.Errno(0x60) + EUNUSED97 = syscall.Errno(0x61) + EUNUSED98 = syscall.Errno(0x62) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCKPT = syscall.Signal(0x21) + SIGCKPTEXIT = syscall.Signal(0x22) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHR = syscall.Signal(0x20) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "device not configured"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EDEADLK", "resource deadlock avoided"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "cross-device link"}, + {19, "ENODEV", "operation not supported by device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "result too large"}, + {35, "EWOULDBLOCK", "resource temporarily unavailable"}, + {36, "EINPROGRESS", "operation now in progress"}, + {37, "EALREADY", "operation already in progress"}, + {38, "ENOTSOCK", "socket operation on non-socket"}, + {39, "EDESTADDRREQ", "destination address required"}, + {40, "EMSGSIZE", "message too long"}, + {41, "EPROTOTYPE", "protocol wrong type for socket"}, + {42, "ENOPROTOOPT", "protocol not available"}, + {43, "EPROTONOSUPPORT", "protocol not supported"}, + {44, "ESOCKTNOSUPPORT", "socket type not supported"}, + {45, "EOPNOTSUPP", "operation not supported"}, + {46, "EPFNOSUPPORT", "protocol family not supported"}, + {47, "EAFNOSUPPORT", "address family not supported by protocol family"}, + {48, "EADDRINUSE", "address already in use"}, + {49, "EADDRNOTAVAIL", "can't assign requested address"}, + {50, "ENETDOWN", "network is down"}, + {51, "ENETUNREACH", "network is unreachable"}, + {52, "ENETRESET", "network dropped connection on reset"}, + {53, "ECONNABORTED", "software caused connection abort"}, + {54, "ECONNRESET", "connection reset by peer"}, + {55, "ENOBUFS", "no buffer space available"}, + {56, "EISCONN", "socket is already connected"}, + {57, "ENOTCONN", "socket is not connected"}, + {58, "ESHUTDOWN", "can't send after socket shutdown"}, + {59, "ETOOMANYREFS", "too many references: can't splice"}, + {60, "ETIMEDOUT", "operation timed out"}, + {61, "ECONNREFUSED", "connection refused"}, + {62, "ELOOP", "too many levels of symbolic links"}, + {63, "ENAMETOOLONG", "file name too long"}, + {64, "EHOSTDOWN", "host is down"}, + {65, "EHOSTUNREACH", "no route to host"}, + {66, "ENOTEMPTY", "directory not empty"}, + {67, "EPROCLIM", "too many processes"}, + {68, "EUSERS", "too many users"}, + {69, "EDQUOT", "disc quota exceeded"}, + {70, "ESTALE", "stale NFS file handle"}, + {71, "EREMOTE", "too many levels of remote in path"}, + {72, "EBADRPC", "RPC struct is bad"}, + {73, "ERPCMISMATCH", "RPC version wrong"}, + {74, "EPROGUNAVAIL", "RPC prog. not avail"}, + {75, "EPROGMISMATCH", "program version wrong"}, + {76, "EPROCUNAVAIL", "bad procedure for program"}, + {77, "ENOLCK", "no locks available"}, + {78, "ENOSYS", "function not implemented"}, + {79, "EFTYPE", "inappropriate file type or format"}, + {80, "EAUTH", "authentication error"}, + {81, "ENEEDAUTH", "need authenticator"}, + {82, "EIDRM", "identifier removed"}, + {83, "ENOMSG", "no message of desired type"}, + {84, "EOVERFLOW", "value too large to be stored in data type"}, + {85, "ECANCELED", "operation canceled"}, + {86, "EILSEQ", "illegal byte sequence"}, + {87, "ENOATTR", "attribute not found"}, + {88, "EDOOFUS", "programming error"}, + {89, "EBADMSG", "bad message"}, + {90, "EMULTIHOP", "multihop attempted"}, + {91, "ENOLINK", "link has been severed"}, + {92, "EPROTO", "protocol error"}, + {93, "ENOMEDIUM", "no medium found"}, + {94, "EUNUSED94", "unknown error: 94"}, + {95, "EUNUSED95", "unknown error: 95"}, + {96, "EUNUSED96", "unknown error: 96"}, + {97, "EUNUSED97", "unknown error: 97"}, + {98, "EUNUSED98", "unknown error: 98"}, + {99, "ELAST", "unknown error: 99"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/BPT trap"}, + {6, "SIGIOT", "abort trap"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGURG", "urgent I/O condition"}, + {17, "SIGSTOP", "suspended (signal)"}, + {18, "SIGTSTP", "suspended"}, + {19, "SIGCONT", "continued"}, + {20, "SIGCHLD", "child exited"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGIO", "I/O possible"}, + {24, "SIGXCPU", "cputime limit exceeded"}, + {25, "SIGXFSZ", "filesize limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window size changes"}, + {29, "SIGINFO", "information request"}, + {30, "SIGUSR1", "user defined signal 1"}, + {31, "SIGUSR2", "user defined signal 2"}, + {32, "SIGTHR", "thread Scheduler"}, + {33, "SIGCKPT", "checkPoint"}, + {34, "SIGCKPTEXIT", "checkPointExit"}, +} diff --git a/api/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go b/api/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go new file mode 100644 index 0000000..2947dc0 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go @@ -0,0 +1,1764 @@ +// mkerrors.sh -m32 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,freebsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m32 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_ARP = 0x23 + AF_ATM = 0x1e + AF_BLUETOOTH = 0x24 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1c + AF_INET6_SDP = 0x2a + AF_INET_SDP = 0x28 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x2a + AF_NATM = 0x1d + AF_NETBIOS = 0x6 + AF_NETGRAPH = 0x20 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SCLUSTER = 0x22 + AF_SIP = 0x18 + AF_SLOW = 0x21 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VENDOR00 = 0x27 + AF_VENDOR01 = 0x29 + AF_VENDOR02 = 0x2b + AF_VENDOR03 = 0x2d + AF_VENDOR04 = 0x2f + AF_VENDOR05 = 0x31 + AF_VENDOR06 = 0x33 + AF_VENDOR07 = 0x35 + AF_VENDOR08 = 0x37 + AF_VENDOR09 = 0x39 + AF_VENDOR10 = 0x3b + AF_VENDOR11 = 0x3d + AF_VENDOR12 = 0x3f + AF_VENDOR13 = 0x41 + AF_VENDOR14 = 0x43 + AF_VENDOR15 = 0x45 + AF_VENDOR16 = 0x47 + AF_VENDOR17 = 0x49 + AF_VENDOR18 = 0x4b + AF_VENDOR19 = 0x4d + AF_VENDOR20 = 0x4f + AF_VENDOR21 = 0x51 + AF_VENDOR22 = 0x53 + AF_VENDOR23 = 0x55 + AF_VENDOR24 = 0x57 + AF_VENDOR25 = 0x59 + AF_VENDOR26 = 0x5b + AF_VENDOR27 = 0x5d + AF_VENDOR28 = 0x5f + AF_VENDOR29 = 0x61 + AF_VENDOR30 = 0x63 + AF_VENDOR31 = 0x65 + AF_VENDOR32 = 0x67 + AF_VENDOR33 = 0x69 + AF_VENDOR34 = 0x6b + AF_VENDOR35 = 0x6d + AF_VENDOR36 = 0x6f + AF_VENDOR37 = 0x71 + AF_VENDOR38 = 0x73 + AF_VENDOR39 = 0x75 + AF_VENDOR40 = 0x77 + AF_VENDOR41 = 0x79 + AF_VENDOR42 = 0x7b + AF_VENDOR43 = 0x7d + AF_VENDOR44 = 0x7f + AF_VENDOR45 = 0x81 + AF_VENDOR46 = 0x83 + AF_VENDOR47 = 0x85 + ALTWERASE = 0x200 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B460800 = 0x70800 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B921600 = 0xe1000 + B9600 = 0x2580 + BIOCFEEDBACK = 0x8004427c + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDIRECTION = 0x40044276 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0084279 + BIOCGETBUFMODE = 0x4004427d + BIOCGETIF = 0x4020426b + BIOCGETZMAX = 0x4004427f + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4008426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCGTSTAMP = 0x40044283 + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x2000427a + BIOCPROMISC = 0x20004269 + BIOCROTZBUF = 0x400c4280 + BIOCSBLEN = 0xc0044266 + BIOCSDIRECTION = 0x80044277 + BIOCSDLT = 0x80044278 + BIOCSETBUFMODE = 0x8004427e + BIOCSETF = 0x80084267 + BIOCSETFNR = 0x80084282 + BIOCSETIF = 0x8020426c + BIOCSETWF = 0x8008427b + BIOCSETZBUF = 0x800c4281 + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8008426d + BIOCSSEESENT = 0x80044277 + BIOCSTSTAMP = 0x80044284 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_BUFMODE_BUFFER = 0x1 + BPF_BUFMODE_ZBUF = 0x2 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_T_BINTIME = 0x2 + BPF_T_BINTIME_FAST = 0x102 + BPF_T_BINTIME_MONOTONIC = 0x202 + BPF_T_BINTIME_MONOTONIC_FAST = 0x302 + BPF_T_FAST = 0x100 + BPF_T_FLAG_MASK = 0x300 + BPF_T_FORMAT_MASK = 0x3 + BPF_T_MICROTIME = 0x0 + BPF_T_MICROTIME_FAST = 0x100 + BPF_T_MICROTIME_MONOTONIC = 0x200 + BPF_T_MICROTIME_MONOTONIC_FAST = 0x300 + BPF_T_MONOTONIC = 0x200 + BPF_T_MONOTONIC_FAST = 0x300 + BPF_T_NANOTIME = 0x1 + BPF_T_NANOTIME_FAST = 0x101 + BPF_T_NANOTIME_MONOTONIC = 0x201 + BPF_T_NANOTIME_MONOTONIC_FAST = 0x301 + BPF_T_NONE = 0x3 + BPF_T_NORMAL = 0x0 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + CAP_ACCEPT = 0x200000020000000 + CAP_ACL_CHECK = 0x400000000010000 + CAP_ACL_DELETE = 0x400000000020000 + CAP_ACL_GET = 0x400000000040000 + CAP_ACL_SET = 0x400000000080000 + CAP_ALL0 = 0x20007ffffffffff + CAP_ALL1 = 0x4000000001fffff + CAP_BIND = 0x200000040000000 + CAP_BINDAT = 0x200008000000400 + CAP_CHFLAGSAT = 0x200000000001400 + CAP_CONNECT = 0x200000080000000 + CAP_CONNECTAT = 0x200010000000400 + CAP_CREATE = 0x200000000000040 + CAP_EVENT = 0x400000000000020 + CAP_EXTATTR_DELETE = 0x400000000001000 + CAP_EXTATTR_GET = 0x400000000002000 + CAP_EXTATTR_LIST = 0x400000000004000 + CAP_EXTATTR_SET = 0x400000000008000 + CAP_FCHDIR = 0x200000000000800 + CAP_FCHFLAGS = 0x200000000001000 + CAP_FCHMOD = 0x200000000002000 + CAP_FCHMODAT = 0x200000000002400 + CAP_FCHOWN = 0x200000000004000 + CAP_FCHOWNAT = 0x200000000004400 + CAP_FCNTL = 0x200000000008000 + CAP_FCNTL_ALL = 0x78 + CAP_FCNTL_GETFL = 0x8 + CAP_FCNTL_GETOWN = 0x20 + CAP_FCNTL_SETFL = 0x10 + CAP_FCNTL_SETOWN = 0x40 + CAP_FEXECVE = 0x200000000000080 + CAP_FLOCK = 0x200000000010000 + CAP_FPATHCONF = 0x200000000020000 + CAP_FSCK = 0x200000000040000 + CAP_FSTAT = 0x200000000080000 + CAP_FSTATAT = 0x200000000080400 + CAP_FSTATFS = 0x200000000100000 + CAP_FSYNC = 0x200000000000100 + CAP_FTRUNCATE = 0x200000000000200 + CAP_FUTIMES = 0x200000000200000 + CAP_FUTIMESAT = 0x200000000200400 + CAP_GETPEERNAME = 0x200000100000000 + CAP_GETSOCKNAME = 0x200000200000000 + CAP_GETSOCKOPT = 0x200000400000000 + CAP_IOCTL = 0x400000000000080 + CAP_IOCTLS_ALL = 0x7fffffff + CAP_KQUEUE = 0x400000000100040 + CAP_KQUEUE_CHANGE = 0x400000000100000 + CAP_KQUEUE_EVENT = 0x400000000000040 + CAP_LINKAT_SOURCE = 0x200020000000400 + CAP_LINKAT_TARGET = 0x200000000400400 + CAP_LISTEN = 0x200000800000000 + CAP_LOOKUP = 0x200000000000400 + CAP_MAC_GET = 0x400000000000001 + CAP_MAC_SET = 0x400000000000002 + CAP_MKDIRAT = 0x200000000800400 + CAP_MKFIFOAT = 0x200000001000400 + CAP_MKNODAT = 0x200000002000400 + CAP_MMAP = 0x200000000000010 + CAP_MMAP_R = 0x20000000000001d + CAP_MMAP_RW = 0x20000000000001f + CAP_MMAP_RWX = 0x20000000000003f + CAP_MMAP_RX = 0x20000000000003d + CAP_MMAP_W = 0x20000000000001e + CAP_MMAP_WX = 0x20000000000003e + CAP_MMAP_X = 0x20000000000003c + CAP_PDGETPID = 0x400000000000200 + CAP_PDKILL = 0x400000000000800 + CAP_PDWAIT = 0x400000000000400 + CAP_PEELOFF = 0x200001000000000 + CAP_POLL_EVENT = 0x400000000000020 + CAP_PREAD = 0x20000000000000d + CAP_PWRITE = 0x20000000000000e + CAP_READ = 0x200000000000001 + CAP_RECV = 0x200000000000001 + CAP_RENAMEAT_SOURCE = 0x200000004000400 + CAP_RENAMEAT_TARGET = 0x200040000000400 + CAP_RIGHTS_VERSION = 0x0 + CAP_RIGHTS_VERSION_00 = 0x0 + CAP_SEEK = 0x20000000000000c + CAP_SEEK_TELL = 0x200000000000004 + CAP_SEM_GETVALUE = 0x400000000000004 + CAP_SEM_POST = 0x400000000000008 + CAP_SEM_WAIT = 0x400000000000010 + CAP_SEND = 0x200000000000002 + CAP_SETSOCKOPT = 0x200002000000000 + CAP_SHUTDOWN = 0x200004000000000 + CAP_SOCK_CLIENT = 0x200007780000003 + CAP_SOCK_SERVER = 0x200007f60000003 + CAP_SYMLINKAT = 0x200000008000400 + CAP_TTYHOOK = 0x400000000000100 + CAP_UNLINKAT = 0x200000010000400 + CAP_UNUSED0_44 = 0x200080000000000 + CAP_UNUSED0_57 = 0x300000000000000 + CAP_UNUSED1_22 = 0x400000000200000 + CAP_UNUSED1_57 = 0x500000000000000 + CAP_WRITE = 0x200000000000002 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x4 + CLOCK_MONOTONIC_FAST = 0xc + CLOCK_MONOTONIC_PRECISE = 0xb + CLOCK_PROCESS_CPUTIME_ID = 0xf + CLOCK_PROF = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_FAST = 0xa + CLOCK_REALTIME_PRECISE = 0x9 + CLOCK_SECOND = 0xd + CLOCK_THREAD_CPUTIME_ID = 0xe + CLOCK_UPTIME = 0x5 + CLOCK_UPTIME_FAST = 0x8 + CLOCK_UPTIME_PRECISE = 0x7 + CLOCK_VIRTUAL = 0x1 + CREAD = 0x800 + CRTSCTS = 0x30000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0x18 + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_BREDR_BB = 0xff + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_BLUETOOTH_LE_LL = 0xfb + DLT_BLUETOOTH_LE_LL_WITH_PHDR = 0x100 + DLT_BLUETOOTH_LINUX_MONITOR = 0xfe + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_EPON = 0x103 + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_INFINIBAND = 0xf7 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPMI_HPM_2 = 0x104 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0x104 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NETLINK = 0xfd + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x79 + DLT_PKTAP = 0x102 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PROFIBUS_DL = 0x101 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RIO = 0x7c + DLT_RTAC_SERIAL = 0xfa + DLT_SCCP = 0x8e + DLT_SCTP = 0xf8 + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USBPCAP = 0xf9 + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WIHART = 0xdf + DLT_WIRESHARK_UPPER_PDU = 0xfc + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_FS = -0x9 + EVFILT_LIO = -0xa + EVFILT_PROC = -0x5 + EVFILT_PROCDESC = -0x8 + EVFILT_READ = -0x1 + EVFILT_SENDFILE = -0xc + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xc + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xb + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_DROP = 0x1000 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_FLAG2 = 0x4000 + EV_FORCEONESHOT = 0x100 + EV_ONESHOT = 0x10 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTATTR_NAMESPACE_EMPTY = 0x0 + EXTATTR_NAMESPACE_SYSTEM = 0x2 + EXTATTR_NAMESPACE_USER = 0x1 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_CANCEL = 0x5 + F_DUP2FD = 0xa + F_DUP2FD_CLOEXEC = 0x12 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x11 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0xb + F_GETOWN = 0x5 + F_OGETLK = 0x7 + F_OK = 0x0 + F_OSETLK = 0x8 + F_OSETLKW = 0x9 + F_RDAHEAD = 0x10 + F_RDLCK = 0x1 + F_READAHEAD = 0xf + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0xc + F_SETLKW = 0xd + F_SETLK_REMOTE = 0xe + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_UNLCKSYS = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x218f52 + IFF_CANTCONFIG = 0x10000 + IFF_DEBUG = 0x4 + IFF_DRV_OACTIVE = 0x400 + IFF_DRV_RUNNING = 0x40 + IFF_DYING = 0x200000 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MONITOR = 0x40000 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PPROMISC = 0x20000 + IFF_PROMISC = 0x100 + IFF_RENAMING = 0x400000 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_STATICARP = 0x80000 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_BRIDGE = 0xd1 + IFT_CARP = 0xf8 + IFT_IEEE1394 = 0x90 + IFT_INFINIBAND = 0xc7 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_PPP = 0x17 + IFT_PROPVIRTUAL = 0x35 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IN_RFC3021_MASK = 0xfffffffe + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CARP = 0x70 + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0x102 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HIP = 0x8b + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MEAS = 0x13 + IPPROTO_MH = 0x87 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MOBILE = 0x37 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OLD_DIVERT = 0xfe + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_RESERVED_253 = 0xfd + IPPROTO_RESERVED_254 = 0xfe + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEND = 0x103 + IPPROTO_SEP = 0x21 + IPPROTO_SHIM6 = 0x8c + IPPROTO_SKIP = 0x39 + IPPROTO_SPACER = 0x7fff + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TLSP = 0x38 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_BINDANY = 0x40 + IPV6_BINDMULTI = 0x41 + IPV6_BINDV6ONLY = 0x1b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FLOWID = 0x43 + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FLOWTYPE = 0x44 + IPV6_FRAGTTL = 0x78 + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MSFILTER = 0x4a + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_PREFER_TEMPADDR = 0x3f + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVFLOWID = 0x46 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRSSBUCKETID = 0x47 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RSSBUCKETID = 0x45 + IPV6_RSS_LISTEN_BUCKET = 0x42 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BINDANY = 0x18 + IP_BINDMULTI = 0x19 + IP_BLOCK_SOURCE = 0x48 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DONTFRAG = 0x43 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET3 = 0x31 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FLOWID = 0x5a + IP_FLOWTYPE = 0x5b + IP_FW3 = 0x30 + IP_FW_ADD = 0x32 + IP_FW_DEL = 0x33 + IP_FW_FLUSH = 0x34 + IP_FW_GET = 0x36 + IP_FW_NAT_CFG = 0x38 + IP_FW_NAT_DEL = 0x39 + IP_FW_NAT_GET_CONFIG = 0x3a + IP_FW_NAT_GET_LOG = 0x3b + IP_FW_RESETLOG = 0x37 + IP_FW_TABLE_ADD = 0x28 + IP_FW_TABLE_DEL = 0x29 + IP_FW_TABLE_FLUSH = 0x2a + IP_FW_TABLE_GETSIZE = 0x2b + IP_FW_TABLE_LIST = 0x2c + IP_FW_ZERO = 0x35 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MAX_SOURCE_FILTER = 0x400 + IP_MF = 0x2000 + IP_MINTTL = 0x42 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_OFFMASK = 0x1fff + IP_ONESBCAST = 0x17 + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVFLOWID = 0x5d + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVRSSBUCKETID = 0x5e + IP_RECVTOS = 0x44 + IP_RECVTTL = 0x41 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSSBUCKETID = 0x5c + IP_RSS_LISTEN_BUCKET = 0x1a + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_SENDSRCADDR = 0x7 + IP_TOS = 0x3 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_AUTOSYNC = 0x7 + MADV_CORE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_NOCORE = 0x8 + MADV_NORMAL = 0x0 + MADV_NOSYNC = 0x6 + MADV_PROTECT = 0xa + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MAP_ALIGNED_SUPER = 0x1000000 + MAP_ALIGNMENT_MASK = -0x1000000 + MAP_ALIGNMENT_SHIFT = 0x18 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_EXCL = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_NOCORE = 0x20000 + MAP_NOSYNC = 0x800 + MAP_PREFAULT_READ = 0x40000 + MAP_PRIVATE = 0x2 + MAP_RESERVED0020 = 0x20 + MAP_RESERVED0040 = 0x40 + MAP_RESERVED0080 = 0x80 + MAP_RESERVED0100 = 0x100 + MAP_SHARED = 0x1 + MAP_STACK = 0x400 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ACLS = 0x8000000 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x200000000 + MNT_BYFSID = 0x8000000 + MNT_CMDFLAGS = 0xd0f0000 + MNT_DEFEXPORTED = 0x200 + MNT_DELEXPORT = 0x20000 + MNT_EXKERB = 0x800 + MNT_EXPORTANON = 0x400 + MNT_EXPORTED = 0x100 + MNT_EXPUBLIC = 0x20000000 + MNT_EXRDONLY = 0x80 + MNT_FORCE = 0x80000 + MNT_GJOURNAL = 0x2000000 + MNT_IGNORE = 0x800000 + MNT_LAZY = 0x3 + MNT_LOCAL = 0x1000 + MNT_MULTILABEL = 0x4000000 + MNT_NFS4ACLS = 0x10 + MNT_NOATIME = 0x10000000 + MNT_NOCLUSTERR = 0x40000000 + MNT_NOCLUSTERW = 0x80000000 + MNT_NOEXEC = 0x4 + MNT_NONBUSY = 0x4000000 + MNT_NOSUID = 0x8 + MNT_NOSYMFOLLOW = 0x400000 + MNT_NOWAIT = 0x2 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SNAPSHOT = 0x1000000 + MNT_SOFTDEP = 0x200000 + MNT_SUIDDIR = 0x100000 + MNT_SUJ = 0x100000000 + MNT_SUSPEND = 0x4 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UPDATE = 0x10000 + MNT_UPDATEMASK = 0x2d8d0807e + MNT_USER = 0x8000 + MNT_VISFLAGMASK = 0x3fef0ffff + MNT_WAIT = 0x1 + MSG_CMSG_CLOEXEC = 0x40000 + MSG_COMPAT = 0x8000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_NBIO = 0x4000 + MSG_NOSIGNAL = 0x20000 + MSG_NOTIFICATION = 0x2000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITFORONE = 0x80000 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x0 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLISTL = 0x5 + NET_RT_IFMALIST = 0x4 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_CLOSE = 0x100 + NOTE_CLOSE_WRITE = 0x200 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FILE_POLL = 0x2 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_MSECONDS = 0x2 + NOTE_NSECONDS = 0x8 + NOTE_OPEN = 0x80 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_READ = 0x400 + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x4 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x100000 + O_CREAT = 0x200 + O_DIRECT = 0x10000 + O_DIRECTORY = 0x20000 + O_EXCL = 0x800 + O_EXEC = 0x40000 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_TTY_INIT = 0x80000 + O_VERIFY = 0x200000 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_FIXEDMTU = 0x80000 + RTF_FMASK = 0x1004d808 + RTF_GATEWAY = 0x2 + RTF_GWFLAG_COMPAT = 0x80000000 + RTF_HOST = 0x4 + RTF_LLDATA = 0x400 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_PINNED = 0x100000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_REJECT = 0x8 + RTF_RNH_LOCKED = 0x40000000 + RTF_STATIC = 0x800 + RTF_STICKY = 0x10000000 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x12 + RTM_IFANNOUNCE = 0x11 + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RTV_WEIGHT = 0x100 + RT_ALL_FIBS = -0x1 + RT_BLACKHOLE = 0x40 + RT_CACHING_CONTEXT = 0x1 + RT_DEFAULT_FIB = 0x0 + RT_HAS_GW = 0x80 + RT_HAS_HEADER = 0x10 + RT_HAS_HEADER_BIT = 0x4 + RT_L2_ME = 0x4 + RT_L2_ME_BIT = 0x2 + RT_LLE_CACHE = 0x100 + RT_MAY_LOOP = 0x8 + RT_MAY_LOOP_BIT = 0x3 + RT_NORTREF = 0x2 + RT_REJECT = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_BINTIME = 0x4 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCAIFGROUP = 0x80246987 + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFGROUP = 0x80246989 + SIOCDIFPHYADDR = 0x80206949 + SIOCGDRVSPEC = 0xc01c697b + SIOCGETSGCNT = 0xc0147210 + SIOCGETVIFCNT = 0xc014720f + SIOCGHIWAT = 0x40047301 + SIOCGI2C = 0xc020693d + SIOCGIFADDR = 0xc0206921 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020691f + SIOCGIFCONF = 0xc0086924 + SIOCGIFDESCR = 0xc020692a + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFIB = 0xc020695c + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc024698a + SIOCGIFGROUP = 0xc0246988 + SIOCGIFINDEX = 0xc0206920 + SIOCGIFMAC = 0xc0206926 + SIOCGIFMEDIA = 0xc0286938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206948 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFSTATUS = 0xc331693b + SIOCGIFXMEDIA = 0xc028698b + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGPRIVATE_0 = 0xc0206950 + SIOCGPRIVATE_1 = 0xc0206951 + SIOCGTUNFIB = 0xc020695e + SIOCIFCREATE = 0xc020697a + SIOCIFCREATE2 = 0xc020697c + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc00c6978 + SIOCSDRVSPEC = 0x801c697b + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020691e + SIOCSIFDESCR = 0x80206929 + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFIB = 0x8020695d + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206927 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNAME = 0x80206928 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSIFPHYS = 0x80206936 + SIOCSIFRVNET = 0xc020695b + SIOCSIFVNET = 0xc020695a + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSTUNFIB = 0x8020695f + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_NONBLOCK = 0x20000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BINTIME = 0x2000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1009 + SO_LINGER = 0x80 + SO_LISTENINCQLEN = 0x1013 + SO_LISTENQLEN = 0x1012 + SO_LISTENQLIMIT = 0x1011 + SO_NOSIGPIPE = 0x800 + SO_NO_DDP = 0x8000 + SO_NO_OFFLOAD = 0x4000 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1010 + SO_PROTOCOL = 0x1016 + SO_PROTOTYPE = 0x1016 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SETFIB = 0x1014 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SO_USER_COOKIE = 0x1015 + SO_VENDOR = 0x80000000 + TAB0 = 0x0 + TAB3 = 0x4 + TABDLY = 0x4 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCP_CA_NAME_MAX = 0x10 + TCP_CCALGOOPT = 0x41 + TCP_CONGESTION = 0x40 + TCP_FASTOPEN = 0x401 + TCP_FUNCTION_BLK = 0x2000 + TCP_FUNCTION_NAME_LEN_MAX = 0x20 + TCP_INFO = 0x20 + TCP_KEEPCNT = 0x400 + TCP_KEEPIDLE = 0x100 + TCP_KEEPINIT = 0x80 + TCP_KEEPINTVL = 0x200 + TCP_MAXBURST = 0x4 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x10 + TCP_MINMSS = 0xd8 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_PCAP_IN = 0x1000 + TCP_PCAP_OUT = 0x800 + TCP_VENDOR = 0x80000000 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGPTN = 0x4004740f + TIOCGSID = 0x40047463 + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DCD = 0x40 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTMASTER = 0x2000741c + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2004745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40087459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VERASE2 = 0x7 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x4 + WCOREFLAG = 0x80 + WEXITED = 0x10 + WLINUXCLONE = 0x80000000 + WNOHANG = 0x1 + WNOWAIT = 0x8 + WSTOPPED = 0x2 + WTRAPPED = 0x20 + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x59) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x55) + ECAPMODE = syscall.Errno(0x5e) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDOOFUS = syscall.Errno(0x58) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x52) + EILSEQ = syscall.Errno(0x56) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x60) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5a) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x57) + ENOBUFS = syscall.Errno(0x37) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x5b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x53) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCAPABLE = syscall.Errno(0x5d) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x5f) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x54) + EOWNERDEAD = syscall.Errno(0x60) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x5c) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGLIBRT = syscall.Signal(0x21) + SIGLWP = syscall.Signal(0x20) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHR = syscall.Signal(0x20) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "device not configured"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EDEADLK", "resource deadlock avoided"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "cross-device link"}, + {19, "ENODEV", "operation not supported by device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "result too large"}, + {35, "EAGAIN", "resource temporarily unavailable"}, + {36, "EINPROGRESS", "operation now in progress"}, + {37, "EALREADY", "operation already in progress"}, + {38, "ENOTSOCK", "socket operation on non-socket"}, + {39, "EDESTADDRREQ", "destination address required"}, + {40, "EMSGSIZE", "message too long"}, + {41, "EPROTOTYPE", "protocol wrong type for socket"}, + {42, "ENOPROTOOPT", "protocol not available"}, + {43, "EPROTONOSUPPORT", "protocol not supported"}, + {44, "ESOCKTNOSUPPORT", "socket type not supported"}, + {45, "EOPNOTSUPP", "operation not supported"}, + {46, "EPFNOSUPPORT", "protocol family not supported"}, + {47, "EAFNOSUPPORT", "address family not supported by protocol family"}, + {48, "EADDRINUSE", "address already in use"}, + {49, "EADDRNOTAVAIL", "can't assign requested address"}, + {50, "ENETDOWN", "network is down"}, + {51, "ENETUNREACH", "network is unreachable"}, + {52, "ENETRESET", "network dropped connection on reset"}, + {53, "ECONNABORTED", "software caused connection abort"}, + {54, "ECONNRESET", "connection reset by peer"}, + {55, "ENOBUFS", "no buffer space available"}, + {56, "EISCONN", "socket is already connected"}, + {57, "ENOTCONN", "socket is not connected"}, + {58, "ESHUTDOWN", "can't send after socket shutdown"}, + {59, "ETOOMANYREFS", "too many references: can't splice"}, + {60, "ETIMEDOUT", "operation timed out"}, + {61, "ECONNREFUSED", "connection refused"}, + {62, "ELOOP", "too many levels of symbolic links"}, + {63, "ENAMETOOLONG", "file name too long"}, + {64, "EHOSTDOWN", "host is down"}, + {65, "EHOSTUNREACH", "no route to host"}, + {66, "ENOTEMPTY", "directory not empty"}, + {67, "EPROCLIM", "too many processes"}, + {68, "EUSERS", "too many users"}, + {69, "EDQUOT", "disc quota exceeded"}, + {70, "ESTALE", "stale NFS file handle"}, + {71, "EREMOTE", "too many levels of remote in path"}, + {72, "EBADRPC", "RPC struct is bad"}, + {73, "ERPCMISMATCH", "RPC version wrong"}, + {74, "EPROGUNAVAIL", "RPC prog. not avail"}, + {75, "EPROGMISMATCH", "program version wrong"}, + {76, "EPROCUNAVAIL", "bad procedure for program"}, + {77, "ENOLCK", "no locks available"}, + {78, "ENOSYS", "function not implemented"}, + {79, "EFTYPE", "inappropriate file type or format"}, + {80, "EAUTH", "authentication error"}, + {81, "ENEEDAUTH", "need authenticator"}, + {82, "EIDRM", "identifier removed"}, + {83, "ENOMSG", "no message of desired type"}, + {84, "EOVERFLOW", "value too large to be stored in data type"}, + {85, "ECANCELED", "operation canceled"}, + {86, "EILSEQ", "illegal byte sequence"}, + {87, "ENOATTR", "attribute not found"}, + {88, "EDOOFUS", "programming error"}, + {89, "EBADMSG", "bad message"}, + {90, "EMULTIHOP", "multihop attempted"}, + {91, "ENOLINK", "link has been severed"}, + {92, "EPROTO", "protocol error"}, + {93, "ENOTCAPABLE", "capabilities insufficient"}, + {94, "ECAPMODE", "not permitted in capability mode"}, + {95, "ENOTRECOVERABLE", "state not recoverable"}, + {96, "EOWNERDEAD", "previous owner died"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/BPT trap"}, + {6, "SIGIOT", "abort trap"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGURG", "urgent I/O condition"}, + {17, "SIGSTOP", "suspended (signal)"}, + {18, "SIGTSTP", "suspended"}, + {19, "SIGCONT", "continued"}, + {20, "SIGCHLD", "child exited"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGIO", "I/O possible"}, + {24, "SIGXCPU", "cputime limit exceeded"}, + {25, "SIGXFSZ", "filesize limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window size changes"}, + {29, "SIGINFO", "information request"}, + {30, "SIGUSR1", "user defined signal 1"}, + {31, "SIGUSR2", "user defined signal 2"}, + {32, "SIGTHR", "unknown signal"}, + {33, "SIGLIBRT", "unknown signal"}, +} diff --git a/api/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go b/api/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go new file mode 100644 index 0000000..c600d01 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go @@ -0,0 +1,1765 @@ +// mkerrors.sh -m64 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,freebsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_ARP = 0x23 + AF_ATM = 0x1e + AF_BLUETOOTH = 0x24 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1c + AF_INET6_SDP = 0x2a + AF_INET_SDP = 0x28 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x2a + AF_NATM = 0x1d + AF_NETBIOS = 0x6 + AF_NETGRAPH = 0x20 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SCLUSTER = 0x22 + AF_SIP = 0x18 + AF_SLOW = 0x21 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VENDOR00 = 0x27 + AF_VENDOR01 = 0x29 + AF_VENDOR02 = 0x2b + AF_VENDOR03 = 0x2d + AF_VENDOR04 = 0x2f + AF_VENDOR05 = 0x31 + AF_VENDOR06 = 0x33 + AF_VENDOR07 = 0x35 + AF_VENDOR08 = 0x37 + AF_VENDOR09 = 0x39 + AF_VENDOR10 = 0x3b + AF_VENDOR11 = 0x3d + AF_VENDOR12 = 0x3f + AF_VENDOR13 = 0x41 + AF_VENDOR14 = 0x43 + AF_VENDOR15 = 0x45 + AF_VENDOR16 = 0x47 + AF_VENDOR17 = 0x49 + AF_VENDOR18 = 0x4b + AF_VENDOR19 = 0x4d + AF_VENDOR20 = 0x4f + AF_VENDOR21 = 0x51 + AF_VENDOR22 = 0x53 + AF_VENDOR23 = 0x55 + AF_VENDOR24 = 0x57 + AF_VENDOR25 = 0x59 + AF_VENDOR26 = 0x5b + AF_VENDOR27 = 0x5d + AF_VENDOR28 = 0x5f + AF_VENDOR29 = 0x61 + AF_VENDOR30 = 0x63 + AF_VENDOR31 = 0x65 + AF_VENDOR32 = 0x67 + AF_VENDOR33 = 0x69 + AF_VENDOR34 = 0x6b + AF_VENDOR35 = 0x6d + AF_VENDOR36 = 0x6f + AF_VENDOR37 = 0x71 + AF_VENDOR38 = 0x73 + AF_VENDOR39 = 0x75 + AF_VENDOR40 = 0x77 + AF_VENDOR41 = 0x79 + AF_VENDOR42 = 0x7b + AF_VENDOR43 = 0x7d + AF_VENDOR44 = 0x7f + AF_VENDOR45 = 0x81 + AF_VENDOR46 = 0x83 + AF_VENDOR47 = 0x85 + ALTWERASE = 0x200 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B460800 = 0x70800 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B921600 = 0xe1000 + B9600 = 0x2580 + BIOCFEEDBACK = 0x8004427c + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDIRECTION = 0x40044276 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0104279 + BIOCGETBUFMODE = 0x4004427d + BIOCGETIF = 0x4020426b + BIOCGETZMAX = 0x4008427f + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCGTSTAMP = 0x40044283 + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x2000427a + BIOCPROMISC = 0x20004269 + BIOCROTZBUF = 0x40184280 + BIOCSBLEN = 0xc0044266 + BIOCSDIRECTION = 0x80044277 + BIOCSDLT = 0x80044278 + BIOCSETBUFMODE = 0x8004427e + BIOCSETF = 0x80104267 + BIOCSETFNR = 0x80104282 + BIOCSETIF = 0x8020426c + BIOCSETWF = 0x8010427b + BIOCSETZBUF = 0x80184281 + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8010426d + BIOCSSEESENT = 0x80044277 + BIOCSTSTAMP = 0x80044284 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x8 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_BUFMODE_BUFFER = 0x1 + BPF_BUFMODE_ZBUF = 0x2 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_T_BINTIME = 0x2 + BPF_T_BINTIME_FAST = 0x102 + BPF_T_BINTIME_MONOTONIC = 0x202 + BPF_T_BINTIME_MONOTONIC_FAST = 0x302 + BPF_T_FAST = 0x100 + BPF_T_FLAG_MASK = 0x300 + BPF_T_FORMAT_MASK = 0x3 + BPF_T_MICROTIME = 0x0 + BPF_T_MICROTIME_FAST = 0x100 + BPF_T_MICROTIME_MONOTONIC = 0x200 + BPF_T_MICROTIME_MONOTONIC_FAST = 0x300 + BPF_T_MONOTONIC = 0x200 + BPF_T_MONOTONIC_FAST = 0x300 + BPF_T_NANOTIME = 0x1 + BPF_T_NANOTIME_FAST = 0x101 + BPF_T_NANOTIME_MONOTONIC = 0x201 + BPF_T_NANOTIME_MONOTONIC_FAST = 0x301 + BPF_T_NONE = 0x3 + BPF_T_NORMAL = 0x0 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + CAP_ACCEPT = 0x200000020000000 + CAP_ACL_CHECK = 0x400000000010000 + CAP_ACL_DELETE = 0x400000000020000 + CAP_ACL_GET = 0x400000000040000 + CAP_ACL_SET = 0x400000000080000 + CAP_ALL0 = 0x20007ffffffffff + CAP_ALL1 = 0x4000000001fffff + CAP_BIND = 0x200000040000000 + CAP_BINDAT = 0x200008000000400 + CAP_CHFLAGSAT = 0x200000000001400 + CAP_CONNECT = 0x200000080000000 + CAP_CONNECTAT = 0x200010000000400 + CAP_CREATE = 0x200000000000040 + CAP_EVENT = 0x400000000000020 + CAP_EXTATTR_DELETE = 0x400000000001000 + CAP_EXTATTR_GET = 0x400000000002000 + CAP_EXTATTR_LIST = 0x400000000004000 + CAP_EXTATTR_SET = 0x400000000008000 + CAP_FCHDIR = 0x200000000000800 + CAP_FCHFLAGS = 0x200000000001000 + CAP_FCHMOD = 0x200000000002000 + CAP_FCHMODAT = 0x200000000002400 + CAP_FCHOWN = 0x200000000004000 + CAP_FCHOWNAT = 0x200000000004400 + CAP_FCNTL = 0x200000000008000 + CAP_FCNTL_ALL = 0x78 + CAP_FCNTL_GETFL = 0x8 + CAP_FCNTL_GETOWN = 0x20 + CAP_FCNTL_SETFL = 0x10 + CAP_FCNTL_SETOWN = 0x40 + CAP_FEXECVE = 0x200000000000080 + CAP_FLOCK = 0x200000000010000 + CAP_FPATHCONF = 0x200000000020000 + CAP_FSCK = 0x200000000040000 + CAP_FSTAT = 0x200000000080000 + CAP_FSTATAT = 0x200000000080400 + CAP_FSTATFS = 0x200000000100000 + CAP_FSYNC = 0x200000000000100 + CAP_FTRUNCATE = 0x200000000000200 + CAP_FUTIMES = 0x200000000200000 + CAP_FUTIMESAT = 0x200000000200400 + CAP_GETPEERNAME = 0x200000100000000 + CAP_GETSOCKNAME = 0x200000200000000 + CAP_GETSOCKOPT = 0x200000400000000 + CAP_IOCTL = 0x400000000000080 + CAP_IOCTLS_ALL = 0x7fffffffffffffff + CAP_KQUEUE = 0x400000000100040 + CAP_KQUEUE_CHANGE = 0x400000000100000 + CAP_KQUEUE_EVENT = 0x400000000000040 + CAP_LINKAT_SOURCE = 0x200020000000400 + CAP_LINKAT_TARGET = 0x200000000400400 + CAP_LISTEN = 0x200000800000000 + CAP_LOOKUP = 0x200000000000400 + CAP_MAC_GET = 0x400000000000001 + CAP_MAC_SET = 0x400000000000002 + CAP_MKDIRAT = 0x200000000800400 + CAP_MKFIFOAT = 0x200000001000400 + CAP_MKNODAT = 0x200000002000400 + CAP_MMAP = 0x200000000000010 + CAP_MMAP_R = 0x20000000000001d + CAP_MMAP_RW = 0x20000000000001f + CAP_MMAP_RWX = 0x20000000000003f + CAP_MMAP_RX = 0x20000000000003d + CAP_MMAP_W = 0x20000000000001e + CAP_MMAP_WX = 0x20000000000003e + CAP_MMAP_X = 0x20000000000003c + CAP_PDGETPID = 0x400000000000200 + CAP_PDKILL = 0x400000000000800 + CAP_PDWAIT = 0x400000000000400 + CAP_PEELOFF = 0x200001000000000 + CAP_POLL_EVENT = 0x400000000000020 + CAP_PREAD = 0x20000000000000d + CAP_PWRITE = 0x20000000000000e + CAP_READ = 0x200000000000001 + CAP_RECV = 0x200000000000001 + CAP_RENAMEAT_SOURCE = 0x200000004000400 + CAP_RENAMEAT_TARGET = 0x200040000000400 + CAP_RIGHTS_VERSION = 0x0 + CAP_RIGHTS_VERSION_00 = 0x0 + CAP_SEEK = 0x20000000000000c + CAP_SEEK_TELL = 0x200000000000004 + CAP_SEM_GETVALUE = 0x400000000000004 + CAP_SEM_POST = 0x400000000000008 + CAP_SEM_WAIT = 0x400000000000010 + CAP_SEND = 0x200000000000002 + CAP_SETSOCKOPT = 0x200002000000000 + CAP_SHUTDOWN = 0x200004000000000 + CAP_SOCK_CLIENT = 0x200007780000003 + CAP_SOCK_SERVER = 0x200007f60000003 + CAP_SYMLINKAT = 0x200000008000400 + CAP_TTYHOOK = 0x400000000000100 + CAP_UNLINKAT = 0x200000010000400 + CAP_UNUSED0_44 = 0x200080000000000 + CAP_UNUSED0_57 = 0x300000000000000 + CAP_UNUSED1_22 = 0x400000000200000 + CAP_UNUSED1_57 = 0x500000000000000 + CAP_WRITE = 0x200000000000002 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x4 + CLOCK_MONOTONIC_FAST = 0xc + CLOCK_MONOTONIC_PRECISE = 0xb + CLOCK_PROCESS_CPUTIME_ID = 0xf + CLOCK_PROF = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_FAST = 0xa + CLOCK_REALTIME_PRECISE = 0x9 + CLOCK_SECOND = 0xd + CLOCK_THREAD_CPUTIME_ID = 0xe + CLOCK_UPTIME = 0x5 + CLOCK_UPTIME_FAST = 0x8 + CLOCK_UPTIME_PRECISE = 0x7 + CLOCK_VIRTUAL = 0x1 + CREAD = 0x800 + CRTSCTS = 0x30000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0x18 + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_BREDR_BB = 0xff + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_BLUETOOTH_LE_LL = 0xfb + DLT_BLUETOOTH_LE_LL_WITH_PHDR = 0x100 + DLT_BLUETOOTH_LINUX_MONITOR = 0xfe + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_EPON = 0x103 + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_INFINIBAND = 0xf7 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPMI_HPM_2 = 0x104 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0x104 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NETLINK = 0xfd + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x79 + DLT_PKTAP = 0x102 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PROFIBUS_DL = 0x101 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RIO = 0x7c + DLT_RTAC_SERIAL = 0xfa + DLT_SCCP = 0x8e + DLT_SCTP = 0xf8 + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USBPCAP = 0xf9 + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WIHART = 0xdf + DLT_WIRESHARK_UPPER_PDU = 0xfc + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_FS = -0x9 + EVFILT_LIO = -0xa + EVFILT_PROC = -0x5 + EVFILT_PROCDESC = -0x8 + EVFILT_READ = -0x1 + EVFILT_SENDFILE = -0xc + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xc + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xb + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_DROP = 0x1000 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_FLAG2 = 0x4000 + EV_FORCEONESHOT = 0x100 + EV_ONESHOT = 0x10 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTATTR_NAMESPACE_EMPTY = 0x0 + EXTATTR_NAMESPACE_SYSTEM = 0x2 + EXTATTR_NAMESPACE_USER = 0x1 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_CANCEL = 0x5 + F_DUP2FD = 0xa + F_DUP2FD_CLOEXEC = 0x12 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x11 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0xb + F_GETOWN = 0x5 + F_OGETLK = 0x7 + F_OK = 0x0 + F_OSETLK = 0x8 + F_OSETLKW = 0x9 + F_RDAHEAD = 0x10 + F_RDLCK = 0x1 + F_READAHEAD = 0xf + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0xc + F_SETLKW = 0xd + F_SETLK_REMOTE = 0xe + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_UNLCKSYS = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x218f52 + IFF_CANTCONFIG = 0x10000 + IFF_DEBUG = 0x4 + IFF_DRV_OACTIVE = 0x400 + IFF_DRV_RUNNING = 0x40 + IFF_DYING = 0x200000 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MONITOR = 0x40000 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PPROMISC = 0x20000 + IFF_PROMISC = 0x100 + IFF_RENAMING = 0x400000 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_STATICARP = 0x80000 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_BRIDGE = 0xd1 + IFT_CARP = 0xf8 + IFT_IEEE1394 = 0x90 + IFT_INFINIBAND = 0xc7 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_PPP = 0x17 + IFT_PROPVIRTUAL = 0x35 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IN_RFC3021_MASK = 0xfffffffe + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CARP = 0x70 + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0x102 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HIP = 0x8b + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MEAS = 0x13 + IPPROTO_MH = 0x87 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MOBILE = 0x37 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OLD_DIVERT = 0xfe + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_RESERVED_253 = 0xfd + IPPROTO_RESERVED_254 = 0xfe + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEND = 0x103 + IPPROTO_SEP = 0x21 + IPPROTO_SHIM6 = 0x8c + IPPROTO_SKIP = 0x39 + IPPROTO_SPACER = 0x7fff + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TLSP = 0x38 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_BINDANY = 0x40 + IPV6_BINDMULTI = 0x41 + IPV6_BINDV6ONLY = 0x1b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FLOWID = 0x43 + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FLOWTYPE = 0x44 + IPV6_FRAGTTL = 0x78 + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MSFILTER = 0x4a + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_PREFER_TEMPADDR = 0x3f + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVFLOWID = 0x46 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRSSBUCKETID = 0x47 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RSSBUCKETID = 0x45 + IPV6_RSS_LISTEN_BUCKET = 0x42 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BINDANY = 0x18 + IP_BINDMULTI = 0x19 + IP_BLOCK_SOURCE = 0x48 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DONTFRAG = 0x43 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET3 = 0x31 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FLOWID = 0x5a + IP_FLOWTYPE = 0x5b + IP_FW3 = 0x30 + IP_FW_ADD = 0x32 + IP_FW_DEL = 0x33 + IP_FW_FLUSH = 0x34 + IP_FW_GET = 0x36 + IP_FW_NAT_CFG = 0x38 + IP_FW_NAT_DEL = 0x39 + IP_FW_NAT_GET_CONFIG = 0x3a + IP_FW_NAT_GET_LOG = 0x3b + IP_FW_RESETLOG = 0x37 + IP_FW_TABLE_ADD = 0x28 + IP_FW_TABLE_DEL = 0x29 + IP_FW_TABLE_FLUSH = 0x2a + IP_FW_TABLE_GETSIZE = 0x2b + IP_FW_TABLE_LIST = 0x2c + IP_FW_ZERO = 0x35 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MAX_SOURCE_FILTER = 0x400 + IP_MF = 0x2000 + IP_MINTTL = 0x42 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_OFFMASK = 0x1fff + IP_ONESBCAST = 0x17 + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVFLOWID = 0x5d + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVRSSBUCKETID = 0x5e + IP_RECVTOS = 0x44 + IP_RECVTTL = 0x41 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSSBUCKETID = 0x5c + IP_RSS_LISTEN_BUCKET = 0x1a + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_SENDSRCADDR = 0x7 + IP_TOS = 0x3 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_AUTOSYNC = 0x7 + MADV_CORE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_NOCORE = 0x8 + MADV_NORMAL = 0x0 + MADV_NOSYNC = 0x6 + MADV_PROTECT = 0xa + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MAP_32BIT = 0x80000 + MAP_ALIGNED_SUPER = 0x1000000 + MAP_ALIGNMENT_MASK = -0x1000000 + MAP_ALIGNMENT_SHIFT = 0x18 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_EXCL = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_NOCORE = 0x20000 + MAP_NOSYNC = 0x800 + MAP_PREFAULT_READ = 0x40000 + MAP_PRIVATE = 0x2 + MAP_RESERVED0020 = 0x20 + MAP_RESERVED0040 = 0x40 + MAP_RESERVED0080 = 0x80 + MAP_RESERVED0100 = 0x100 + MAP_SHARED = 0x1 + MAP_STACK = 0x400 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ACLS = 0x8000000 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x200000000 + MNT_BYFSID = 0x8000000 + MNT_CMDFLAGS = 0xd0f0000 + MNT_DEFEXPORTED = 0x200 + MNT_DELEXPORT = 0x20000 + MNT_EXKERB = 0x800 + MNT_EXPORTANON = 0x400 + MNT_EXPORTED = 0x100 + MNT_EXPUBLIC = 0x20000000 + MNT_EXRDONLY = 0x80 + MNT_FORCE = 0x80000 + MNT_GJOURNAL = 0x2000000 + MNT_IGNORE = 0x800000 + MNT_LAZY = 0x3 + MNT_LOCAL = 0x1000 + MNT_MULTILABEL = 0x4000000 + MNT_NFS4ACLS = 0x10 + MNT_NOATIME = 0x10000000 + MNT_NOCLUSTERR = 0x40000000 + MNT_NOCLUSTERW = 0x80000000 + MNT_NOEXEC = 0x4 + MNT_NONBUSY = 0x4000000 + MNT_NOSUID = 0x8 + MNT_NOSYMFOLLOW = 0x400000 + MNT_NOWAIT = 0x2 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SNAPSHOT = 0x1000000 + MNT_SOFTDEP = 0x200000 + MNT_SUIDDIR = 0x100000 + MNT_SUJ = 0x100000000 + MNT_SUSPEND = 0x4 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UPDATE = 0x10000 + MNT_UPDATEMASK = 0x2d8d0807e + MNT_USER = 0x8000 + MNT_VISFLAGMASK = 0x3fef0ffff + MNT_WAIT = 0x1 + MSG_CMSG_CLOEXEC = 0x40000 + MSG_COMPAT = 0x8000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_NBIO = 0x4000 + MSG_NOSIGNAL = 0x20000 + MSG_NOTIFICATION = 0x2000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITFORONE = 0x80000 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x0 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLISTL = 0x5 + NET_RT_IFMALIST = 0x4 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_CLOSE = 0x100 + NOTE_CLOSE_WRITE = 0x200 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FILE_POLL = 0x2 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_MSECONDS = 0x2 + NOTE_NSECONDS = 0x8 + NOTE_OPEN = 0x80 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_READ = 0x400 + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x4 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x100000 + O_CREAT = 0x200 + O_DIRECT = 0x10000 + O_DIRECTORY = 0x20000 + O_EXCL = 0x800 + O_EXEC = 0x40000 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_TTY_INIT = 0x80000 + O_VERIFY = 0x200000 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_FIXEDMTU = 0x80000 + RTF_FMASK = 0x1004d808 + RTF_GATEWAY = 0x2 + RTF_GWFLAG_COMPAT = 0x80000000 + RTF_HOST = 0x4 + RTF_LLDATA = 0x400 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_PINNED = 0x100000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_REJECT = 0x8 + RTF_RNH_LOCKED = 0x40000000 + RTF_STATIC = 0x800 + RTF_STICKY = 0x10000000 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x12 + RTM_IFANNOUNCE = 0x11 + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RTV_WEIGHT = 0x100 + RT_ALL_FIBS = -0x1 + RT_BLACKHOLE = 0x40 + RT_CACHING_CONTEXT = 0x1 + RT_DEFAULT_FIB = 0x0 + RT_HAS_GW = 0x80 + RT_HAS_HEADER = 0x10 + RT_HAS_HEADER_BIT = 0x4 + RT_L2_ME = 0x4 + RT_L2_ME_BIT = 0x2 + RT_LLE_CACHE = 0x100 + RT_MAY_LOOP = 0x8 + RT_MAY_LOOP_BIT = 0x3 + RT_NORTREF = 0x2 + RT_REJECT = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_BINTIME = 0x4 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCAIFGROUP = 0x80286987 + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFGROUP = 0x80286989 + SIOCDIFPHYADDR = 0x80206949 + SIOCGDRVSPEC = 0xc028697b + SIOCGETSGCNT = 0xc0207210 + SIOCGETVIFCNT = 0xc028720f + SIOCGHIWAT = 0x40047301 + SIOCGI2C = 0xc020693d + SIOCGIFADDR = 0xc0206921 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020691f + SIOCGIFCONF = 0xc0106924 + SIOCGIFDESCR = 0xc020692a + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFIB = 0xc020695c + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc028698a + SIOCGIFGROUP = 0xc0286988 + SIOCGIFINDEX = 0xc0206920 + SIOCGIFMAC = 0xc0206926 + SIOCGIFMEDIA = 0xc0306938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206948 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFSTATUS = 0xc331693b + SIOCGIFXMEDIA = 0xc030698b + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGPRIVATE_0 = 0xc0206950 + SIOCGPRIVATE_1 = 0xc0206951 + SIOCGTUNFIB = 0xc020695e + SIOCIFCREATE = 0xc020697a + SIOCIFCREATE2 = 0xc020697c + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc0106978 + SIOCSDRVSPEC = 0x8028697b + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020691e + SIOCSIFDESCR = 0x80206929 + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFIB = 0x8020695d + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206927 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNAME = 0x80206928 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSIFPHYS = 0x80206936 + SIOCSIFRVNET = 0xc020695b + SIOCSIFVNET = 0xc020695a + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSTUNFIB = 0x8020695f + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_NONBLOCK = 0x20000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BINTIME = 0x2000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1009 + SO_LINGER = 0x80 + SO_LISTENINCQLEN = 0x1013 + SO_LISTENQLEN = 0x1012 + SO_LISTENQLIMIT = 0x1011 + SO_NOSIGPIPE = 0x800 + SO_NO_DDP = 0x8000 + SO_NO_OFFLOAD = 0x4000 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1010 + SO_PROTOCOL = 0x1016 + SO_PROTOTYPE = 0x1016 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SETFIB = 0x1014 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SO_USER_COOKIE = 0x1015 + SO_VENDOR = 0x80000000 + TAB0 = 0x0 + TAB3 = 0x4 + TABDLY = 0x4 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCP_CA_NAME_MAX = 0x10 + TCP_CCALGOOPT = 0x41 + TCP_CONGESTION = 0x40 + TCP_FASTOPEN = 0x401 + TCP_FUNCTION_BLK = 0x2000 + TCP_FUNCTION_NAME_LEN_MAX = 0x20 + TCP_INFO = 0x20 + TCP_KEEPCNT = 0x400 + TCP_KEEPIDLE = 0x100 + TCP_KEEPINIT = 0x80 + TCP_KEEPINTVL = 0x200 + TCP_MAXBURST = 0x4 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x10 + TCP_MINMSS = 0xd8 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_PCAP_IN = 0x1000 + TCP_PCAP_OUT = 0x800 + TCP_VENDOR = 0x80000000 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGPTN = 0x4004740f + TIOCGSID = 0x40047463 + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DCD = 0x40 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTMASTER = 0x2000741c + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2004745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40107459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VERASE2 = 0x7 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x4 + WCOREFLAG = 0x80 + WEXITED = 0x10 + WLINUXCLONE = 0x80000000 + WNOHANG = 0x1 + WNOWAIT = 0x8 + WSTOPPED = 0x2 + WTRAPPED = 0x20 + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x59) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x55) + ECAPMODE = syscall.Errno(0x5e) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDOOFUS = syscall.Errno(0x58) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x52) + EILSEQ = syscall.Errno(0x56) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x60) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5a) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x57) + ENOBUFS = syscall.Errno(0x37) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x5b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x53) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCAPABLE = syscall.Errno(0x5d) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x5f) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x54) + EOWNERDEAD = syscall.Errno(0x60) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x5c) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGLIBRT = syscall.Signal(0x21) + SIGLWP = syscall.Signal(0x20) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHR = syscall.Signal(0x20) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "device not configured"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EDEADLK", "resource deadlock avoided"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "cross-device link"}, + {19, "ENODEV", "operation not supported by device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "result too large"}, + {35, "EAGAIN", "resource temporarily unavailable"}, + {36, "EINPROGRESS", "operation now in progress"}, + {37, "EALREADY", "operation already in progress"}, + {38, "ENOTSOCK", "socket operation on non-socket"}, + {39, "EDESTADDRREQ", "destination address required"}, + {40, "EMSGSIZE", "message too long"}, + {41, "EPROTOTYPE", "protocol wrong type for socket"}, + {42, "ENOPROTOOPT", "protocol not available"}, + {43, "EPROTONOSUPPORT", "protocol not supported"}, + {44, "ESOCKTNOSUPPORT", "socket type not supported"}, + {45, "EOPNOTSUPP", "operation not supported"}, + {46, "EPFNOSUPPORT", "protocol family not supported"}, + {47, "EAFNOSUPPORT", "address family not supported by protocol family"}, + {48, "EADDRINUSE", "address already in use"}, + {49, "EADDRNOTAVAIL", "can't assign requested address"}, + {50, "ENETDOWN", "network is down"}, + {51, "ENETUNREACH", "network is unreachable"}, + {52, "ENETRESET", "network dropped connection on reset"}, + {53, "ECONNABORTED", "software caused connection abort"}, + {54, "ECONNRESET", "connection reset by peer"}, + {55, "ENOBUFS", "no buffer space available"}, + {56, "EISCONN", "socket is already connected"}, + {57, "ENOTCONN", "socket is not connected"}, + {58, "ESHUTDOWN", "can't send after socket shutdown"}, + {59, "ETOOMANYREFS", "too many references: can't splice"}, + {60, "ETIMEDOUT", "operation timed out"}, + {61, "ECONNREFUSED", "connection refused"}, + {62, "ELOOP", "too many levels of symbolic links"}, + {63, "ENAMETOOLONG", "file name too long"}, + {64, "EHOSTDOWN", "host is down"}, + {65, "EHOSTUNREACH", "no route to host"}, + {66, "ENOTEMPTY", "directory not empty"}, + {67, "EPROCLIM", "too many processes"}, + {68, "EUSERS", "too many users"}, + {69, "EDQUOT", "disc quota exceeded"}, + {70, "ESTALE", "stale NFS file handle"}, + {71, "EREMOTE", "too many levels of remote in path"}, + {72, "EBADRPC", "RPC struct is bad"}, + {73, "ERPCMISMATCH", "RPC version wrong"}, + {74, "EPROGUNAVAIL", "RPC prog. not avail"}, + {75, "EPROGMISMATCH", "program version wrong"}, + {76, "EPROCUNAVAIL", "bad procedure for program"}, + {77, "ENOLCK", "no locks available"}, + {78, "ENOSYS", "function not implemented"}, + {79, "EFTYPE", "inappropriate file type or format"}, + {80, "EAUTH", "authentication error"}, + {81, "ENEEDAUTH", "need authenticator"}, + {82, "EIDRM", "identifier removed"}, + {83, "ENOMSG", "no message of desired type"}, + {84, "EOVERFLOW", "value too large to be stored in data type"}, + {85, "ECANCELED", "operation canceled"}, + {86, "EILSEQ", "illegal byte sequence"}, + {87, "ENOATTR", "attribute not found"}, + {88, "EDOOFUS", "programming error"}, + {89, "EBADMSG", "bad message"}, + {90, "EMULTIHOP", "multihop attempted"}, + {91, "ENOLINK", "link has been severed"}, + {92, "EPROTO", "protocol error"}, + {93, "ENOTCAPABLE", "capabilities insufficient"}, + {94, "ECAPMODE", "not permitted in capability mode"}, + {95, "ENOTRECOVERABLE", "state not recoverable"}, + {96, "EOWNERDEAD", "previous owner died"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/BPT trap"}, + {6, "SIGIOT", "abort trap"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGURG", "urgent I/O condition"}, + {17, "SIGSTOP", "suspended (signal)"}, + {18, "SIGTSTP", "suspended"}, + {19, "SIGCONT", "continued"}, + {20, "SIGCHLD", "child exited"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGIO", "I/O possible"}, + {24, "SIGXCPU", "cputime limit exceeded"}, + {25, "SIGXFSZ", "filesize limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window size changes"}, + {29, "SIGINFO", "information request"}, + {30, "SIGUSR1", "user defined signal 1"}, + {31, "SIGUSR2", "user defined signal 2"}, + {32, "SIGTHR", "unknown signal"}, + {33, "SIGLIBRT", "unknown signal"}, +} diff --git a/api/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go b/api/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go new file mode 100644 index 0000000..e8240d2 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go @@ -0,0 +1,1773 @@ +// mkerrors.sh +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,freebsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_ARP = 0x23 + AF_ATM = 0x1e + AF_BLUETOOTH = 0x24 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1c + AF_INET6_SDP = 0x2a + AF_INET_SDP = 0x28 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x2a + AF_NATM = 0x1d + AF_NETBIOS = 0x6 + AF_NETGRAPH = 0x20 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SCLUSTER = 0x22 + AF_SIP = 0x18 + AF_SLOW = 0x21 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VENDOR00 = 0x27 + AF_VENDOR01 = 0x29 + AF_VENDOR02 = 0x2b + AF_VENDOR03 = 0x2d + AF_VENDOR04 = 0x2f + AF_VENDOR05 = 0x31 + AF_VENDOR06 = 0x33 + AF_VENDOR07 = 0x35 + AF_VENDOR08 = 0x37 + AF_VENDOR09 = 0x39 + AF_VENDOR10 = 0x3b + AF_VENDOR11 = 0x3d + AF_VENDOR12 = 0x3f + AF_VENDOR13 = 0x41 + AF_VENDOR14 = 0x43 + AF_VENDOR15 = 0x45 + AF_VENDOR16 = 0x47 + AF_VENDOR17 = 0x49 + AF_VENDOR18 = 0x4b + AF_VENDOR19 = 0x4d + AF_VENDOR20 = 0x4f + AF_VENDOR21 = 0x51 + AF_VENDOR22 = 0x53 + AF_VENDOR23 = 0x55 + AF_VENDOR24 = 0x57 + AF_VENDOR25 = 0x59 + AF_VENDOR26 = 0x5b + AF_VENDOR27 = 0x5d + AF_VENDOR28 = 0x5f + AF_VENDOR29 = 0x61 + AF_VENDOR30 = 0x63 + AF_VENDOR31 = 0x65 + AF_VENDOR32 = 0x67 + AF_VENDOR33 = 0x69 + AF_VENDOR34 = 0x6b + AF_VENDOR35 = 0x6d + AF_VENDOR36 = 0x6f + AF_VENDOR37 = 0x71 + AF_VENDOR38 = 0x73 + AF_VENDOR39 = 0x75 + AF_VENDOR40 = 0x77 + AF_VENDOR41 = 0x79 + AF_VENDOR42 = 0x7b + AF_VENDOR43 = 0x7d + AF_VENDOR44 = 0x7f + AF_VENDOR45 = 0x81 + AF_VENDOR46 = 0x83 + AF_VENDOR47 = 0x85 + ALTWERASE = 0x200 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B460800 = 0x70800 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B921600 = 0xe1000 + B9600 = 0x2580 + BIOCFEEDBACK = 0x8004427c + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDIRECTION = 0x40044276 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0084279 + BIOCGETBUFMODE = 0x4004427d + BIOCGETIF = 0x4020426b + BIOCGETZMAX = 0x4004427f + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCGTSTAMP = 0x40044283 + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x2000427a + BIOCPROMISC = 0x20004269 + BIOCROTZBUF = 0x400c4280 + BIOCSBLEN = 0xc0044266 + BIOCSDIRECTION = 0x80044277 + BIOCSDLT = 0x80044278 + BIOCSETBUFMODE = 0x8004427e + BIOCSETF = 0x80084267 + BIOCSETFNR = 0x80084282 + BIOCSETIF = 0x8020426c + BIOCSETWF = 0x8008427b + BIOCSETZBUF = 0x800c4281 + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8010426d + BIOCSSEESENT = 0x80044277 + BIOCSTSTAMP = 0x80044284 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_BUFMODE_BUFFER = 0x1 + BPF_BUFMODE_ZBUF = 0x2 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_T_BINTIME = 0x2 + BPF_T_BINTIME_FAST = 0x102 + BPF_T_BINTIME_MONOTONIC = 0x202 + BPF_T_BINTIME_MONOTONIC_FAST = 0x302 + BPF_T_FAST = 0x100 + BPF_T_FLAG_MASK = 0x300 + BPF_T_FORMAT_MASK = 0x3 + BPF_T_MICROTIME = 0x0 + BPF_T_MICROTIME_FAST = 0x100 + BPF_T_MICROTIME_MONOTONIC = 0x200 + BPF_T_MICROTIME_MONOTONIC_FAST = 0x300 + BPF_T_MONOTONIC = 0x200 + BPF_T_MONOTONIC_FAST = 0x300 + BPF_T_NANOTIME = 0x1 + BPF_T_NANOTIME_FAST = 0x101 + BPF_T_NANOTIME_MONOTONIC = 0x201 + BPF_T_NANOTIME_MONOTONIC_FAST = 0x301 + BPF_T_NONE = 0x3 + BPF_T_NORMAL = 0x0 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + CAP_ACCEPT = 0x200000020000000 + CAP_ACL_CHECK = 0x400000000010000 + CAP_ACL_DELETE = 0x400000000020000 + CAP_ACL_GET = 0x400000000040000 + CAP_ACL_SET = 0x400000000080000 + CAP_ALL0 = 0x20007ffffffffff + CAP_ALL1 = 0x4000000001fffff + CAP_BIND = 0x200000040000000 + CAP_BINDAT = 0x200008000000400 + CAP_CHFLAGSAT = 0x200000000001400 + CAP_CONNECT = 0x200000080000000 + CAP_CONNECTAT = 0x200010000000400 + CAP_CREATE = 0x200000000000040 + CAP_EVENT = 0x400000000000020 + CAP_EXTATTR_DELETE = 0x400000000001000 + CAP_EXTATTR_GET = 0x400000000002000 + CAP_EXTATTR_LIST = 0x400000000004000 + CAP_EXTATTR_SET = 0x400000000008000 + CAP_FCHDIR = 0x200000000000800 + CAP_FCHFLAGS = 0x200000000001000 + CAP_FCHMOD = 0x200000000002000 + CAP_FCHMODAT = 0x200000000002400 + CAP_FCHOWN = 0x200000000004000 + CAP_FCHOWNAT = 0x200000000004400 + CAP_FCNTL = 0x200000000008000 + CAP_FCNTL_ALL = 0x78 + CAP_FCNTL_GETFL = 0x8 + CAP_FCNTL_GETOWN = 0x20 + CAP_FCNTL_SETFL = 0x10 + CAP_FCNTL_SETOWN = 0x40 + CAP_FEXECVE = 0x200000000000080 + CAP_FLOCK = 0x200000000010000 + CAP_FPATHCONF = 0x200000000020000 + CAP_FSCK = 0x200000000040000 + CAP_FSTAT = 0x200000000080000 + CAP_FSTATAT = 0x200000000080400 + CAP_FSTATFS = 0x200000000100000 + CAP_FSYNC = 0x200000000000100 + CAP_FTRUNCATE = 0x200000000000200 + CAP_FUTIMES = 0x200000000200000 + CAP_FUTIMESAT = 0x200000000200400 + CAP_GETPEERNAME = 0x200000100000000 + CAP_GETSOCKNAME = 0x200000200000000 + CAP_GETSOCKOPT = 0x200000400000000 + CAP_IOCTL = 0x400000000000080 + CAP_IOCTLS_ALL = 0x7fffffff + CAP_KQUEUE = 0x400000000100040 + CAP_KQUEUE_CHANGE = 0x400000000100000 + CAP_KQUEUE_EVENT = 0x400000000000040 + CAP_LINKAT_SOURCE = 0x200020000000400 + CAP_LINKAT_TARGET = 0x200000000400400 + CAP_LISTEN = 0x200000800000000 + CAP_LOOKUP = 0x200000000000400 + CAP_MAC_GET = 0x400000000000001 + CAP_MAC_SET = 0x400000000000002 + CAP_MKDIRAT = 0x200000000800400 + CAP_MKFIFOAT = 0x200000001000400 + CAP_MKNODAT = 0x200000002000400 + CAP_MMAP = 0x200000000000010 + CAP_MMAP_R = 0x20000000000001d + CAP_MMAP_RW = 0x20000000000001f + CAP_MMAP_RWX = 0x20000000000003f + CAP_MMAP_RX = 0x20000000000003d + CAP_MMAP_W = 0x20000000000001e + CAP_MMAP_WX = 0x20000000000003e + CAP_MMAP_X = 0x20000000000003c + CAP_PDGETPID = 0x400000000000200 + CAP_PDKILL = 0x400000000000800 + CAP_PDWAIT = 0x400000000000400 + CAP_PEELOFF = 0x200001000000000 + CAP_POLL_EVENT = 0x400000000000020 + CAP_PREAD = 0x20000000000000d + CAP_PWRITE = 0x20000000000000e + CAP_READ = 0x200000000000001 + CAP_RECV = 0x200000000000001 + CAP_RENAMEAT_SOURCE = 0x200000004000400 + CAP_RENAMEAT_TARGET = 0x200040000000400 + CAP_RIGHTS_VERSION = 0x0 + CAP_RIGHTS_VERSION_00 = 0x0 + CAP_SEEK = 0x20000000000000c + CAP_SEEK_TELL = 0x200000000000004 + CAP_SEM_GETVALUE = 0x400000000000004 + CAP_SEM_POST = 0x400000000000008 + CAP_SEM_WAIT = 0x400000000000010 + CAP_SEND = 0x200000000000002 + CAP_SETSOCKOPT = 0x200002000000000 + CAP_SHUTDOWN = 0x200004000000000 + CAP_SOCK_CLIENT = 0x200007780000003 + CAP_SOCK_SERVER = 0x200007f60000003 + CAP_SYMLINKAT = 0x200000008000400 + CAP_TTYHOOK = 0x400000000000100 + CAP_UNLINKAT = 0x200000010000400 + CAP_UNUSED0_44 = 0x200080000000000 + CAP_UNUSED0_57 = 0x300000000000000 + CAP_UNUSED1_22 = 0x400000000200000 + CAP_UNUSED1_57 = 0x500000000000000 + CAP_WRITE = 0x200000000000002 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x4 + CLOCK_MONOTONIC_FAST = 0xc + CLOCK_MONOTONIC_PRECISE = 0xb + CLOCK_PROCESS_CPUTIME_ID = 0xf + CLOCK_PROF = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_FAST = 0xa + CLOCK_REALTIME_PRECISE = 0x9 + CLOCK_SECOND = 0xd + CLOCK_THREAD_CPUTIME_ID = 0xe + CLOCK_UPTIME = 0x5 + CLOCK_UPTIME_FAST = 0x8 + CLOCK_UPTIME_PRECISE = 0x7 + CLOCK_VIRTUAL = 0x1 + CREAD = 0x800 + CRTSCTS = 0x30000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0x18 + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_BREDR_BB = 0xff + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_BLUETOOTH_LE_LL = 0xfb + DLT_BLUETOOTH_LE_LL_WITH_PHDR = 0x100 + DLT_BLUETOOTH_LINUX_MONITOR = 0xfe + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_CLASS_NETBSD_RAWAF = 0x2240000 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_EPON = 0x103 + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_INFINIBAND = 0xf7 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPMI_HPM_2 = 0x104 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_ISO_14443 = 0x108 + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0x109 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NETLINK = 0xfd + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x79 + DLT_PKTAP = 0x102 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0xe + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PROFIBUS_DL = 0x101 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RDS = 0x109 + DLT_REDBACK_SMARTEDGE = 0x20 + DLT_RIO = 0x7c + DLT_RTAC_SERIAL = 0xfa + DLT_SCCP = 0x8e + DLT_SCTP = 0xf8 + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xd + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USBPCAP = 0xf9 + DLT_USB_FREEBSD = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WATTSTOPPER_DLM = 0x107 + DLT_WIHART = 0xdf + DLT_WIRESHARK_UPPER_PDU = 0xfc + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DLT_ZWAVE_R1_R2 = 0x105 + DLT_ZWAVE_R3 = 0x106 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_FS = -0x9 + EVFILT_LIO = -0xa + EVFILT_PROC = -0x5 + EVFILT_PROCDESC = -0x8 + EVFILT_READ = -0x1 + EVFILT_SENDFILE = -0xc + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xc + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xb + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_DROP = 0x1000 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_FLAG2 = 0x4000 + EV_FORCEONESHOT = 0x100 + EV_ONESHOT = 0x10 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTATTR_NAMESPACE_EMPTY = 0x0 + EXTATTR_NAMESPACE_SYSTEM = 0x2 + EXTATTR_NAMESPACE_USER = 0x1 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_CANCEL = 0x5 + F_DUP2FD = 0xa + F_DUP2FD_CLOEXEC = 0x12 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x11 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0xb + F_GETOWN = 0x5 + F_OGETLK = 0x7 + F_OK = 0x0 + F_OSETLK = 0x8 + F_OSETLKW = 0x9 + F_RDAHEAD = 0x10 + F_RDLCK = 0x1 + F_READAHEAD = 0xf + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0xc + F_SETLKW = 0xd + F_SETLK_REMOTE = 0xe + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_UNLCKSYS = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x218f52 + IFF_CANTCONFIG = 0x10000 + IFF_DEBUG = 0x4 + IFF_DRV_OACTIVE = 0x400 + IFF_DRV_RUNNING = 0x40 + IFF_DYING = 0x200000 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MONITOR = 0x40000 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PPROMISC = 0x20000 + IFF_PROMISC = 0x100 + IFF_RENAMING = 0x400000 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_STATICARP = 0x80000 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_BRIDGE = 0xd1 + IFT_CARP = 0xf8 + IFT_IEEE1394 = 0x90 + IFT_INFINIBAND = 0xc7 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_PPP = 0x17 + IFT_PROPVIRTUAL = 0x35 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IN_RFC3021_MASK = 0xfffffffe + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CARP = 0x70 + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0x102 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HIP = 0x8b + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MEAS = 0x13 + IPPROTO_MH = 0x87 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MOBILE = 0x37 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OLD_DIVERT = 0xfe + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_RESERVED_253 = 0xfd + IPPROTO_RESERVED_254 = 0xfe + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEND = 0x103 + IPPROTO_SEP = 0x21 + IPPROTO_SHIM6 = 0x8c + IPPROTO_SKIP = 0x39 + IPPROTO_SPACER = 0x7fff + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TLSP = 0x38 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_BINDANY = 0x40 + IPV6_BINDMULTI = 0x41 + IPV6_BINDV6ONLY = 0x1b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FLOWID = 0x43 + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FLOWTYPE = 0x44 + IPV6_FRAGTTL = 0x78 + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MSFILTER = 0x4a + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_PREFER_TEMPADDR = 0x3f + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVFLOWID = 0x46 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRSSBUCKETID = 0x47 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RSSBUCKETID = 0x45 + IPV6_RSS_LISTEN_BUCKET = 0x42 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BINDANY = 0x18 + IP_BINDMULTI = 0x19 + IP_BLOCK_SOURCE = 0x48 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DONTFRAG = 0x43 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET3 = 0x31 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FLOWID = 0x5a + IP_FLOWTYPE = 0x5b + IP_FW3 = 0x30 + IP_FW_ADD = 0x32 + IP_FW_DEL = 0x33 + IP_FW_FLUSH = 0x34 + IP_FW_GET = 0x36 + IP_FW_NAT_CFG = 0x38 + IP_FW_NAT_DEL = 0x39 + IP_FW_NAT_GET_CONFIG = 0x3a + IP_FW_NAT_GET_LOG = 0x3b + IP_FW_RESETLOG = 0x37 + IP_FW_TABLE_ADD = 0x28 + IP_FW_TABLE_DEL = 0x29 + IP_FW_TABLE_FLUSH = 0x2a + IP_FW_TABLE_GETSIZE = 0x2b + IP_FW_TABLE_LIST = 0x2c + IP_FW_ZERO = 0x35 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MAX_SOURCE_FILTER = 0x400 + IP_MF = 0x2000 + IP_MINTTL = 0x42 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_OFFMASK = 0x1fff + IP_ONESBCAST = 0x17 + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVFLOWID = 0x5d + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVRSSBUCKETID = 0x5e + IP_RECVTOS = 0x44 + IP_RECVTTL = 0x41 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSSBUCKETID = 0x5c + IP_RSS_LISTEN_BUCKET = 0x1a + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_SENDSRCADDR = 0x7 + IP_TOS = 0x3 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_AUTOSYNC = 0x7 + MADV_CORE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_NOCORE = 0x8 + MADV_NORMAL = 0x0 + MADV_NOSYNC = 0x6 + MADV_PROTECT = 0xa + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MAP_ALIGNED_SUPER = 0x1000000 + MAP_ALIGNMENT_MASK = -0x1000000 + MAP_ALIGNMENT_SHIFT = 0x18 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_EXCL = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GUARD = 0x2000 + MAP_HASSEMAPHORE = 0x200 + MAP_NOCORE = 0x20000 + MAP_NOSYNC = 0x800 + MAP_PREFAULT_READ = 0x40000 + MAP_PRIVATE = 0x2 + MAP_RESERVED0020 = 0x20 + MAP_RESERVED0040 = 0x40 + MAP_RESERVED0080 = 0x80 + MAP_RESERVED0100 = 0x100 + MAP_SHARED = 0x1 + MAP_STACK = 0x400 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ACLS = 0x8000000 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x200000000 + MNT_BYFSID = 0x8000000 + MNT_CMDFLAGS = 0xd0f0000 + MNT_DEFEXPORTED = 0x200 + MNT_DELEXPORT = 0x20000 + MNT_EXKERB = 0x800 + MNT_EXPORTANON = 0x400 + MNT_EXPORTED = 0x100 + MNT_EXPUBLIC = 0x20000000 + MNT_EXRDONLY = 0x80 + MNT_FORCE = 0x80000 + MNT_GJOURNAL = 0x2000000 + MNT_IGNORE = 0x800000 + MNT_LAZY = 0x3 + MNT_LOCAL = 0x1000 + MNT_MULTILABEL = 0x4000000 + MNT_NFS4ACLS = 0x10 + MNT_NOATIME = 0x10000000 + MNT_NOCLUSTERR = 0x40000000 + MNT_NOCLUSTERW = 0x80000000 + MNT_NOEXEC = 0x4 + MNT_NONBUSY = 0x4000000 + MNT_NOSUID = 0x8 + MNT_NOSYMFOLLOW = 0x400000 + MNT_NOWAIT = 0x2 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SNAPSHOT = 0x1000000 + MNT_SOFTDEP = 0x200000 + MNT_SUIDDIR = 0x100000 + MNT_SUJ = 0x100000000 + MNT_SUSPEND = 0x4 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UPDATE = 0x10000 + MNT_UPDATEMASK = 0x2d8d0807e + MNT_USER = 0x8000 + MNT_VISFLAGMASK = 0x3fef0ffff + MNT_WAIT = 0x1 + MSG_CMSG_CLOEXEC = 0x40000 + MSG_COMPAT = 0x8000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_NBIO = 0x4000 + MSG_NOSIGNAL = 0x20000 + MSG_NOTIFICATION = 0x2000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITFORONE = 0x80000 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x0 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLISTL = 0x5 + NET_RT_IFMALIST = 0x4 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_CLOSE = 0x100 + NOTE_CLOSE_WRITE = 0x200 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FILE_POLL = 0x2 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_MSECONDS = 0x2 + NOTE_NSECONDS = 0x8 + NOTE_OPEN = 0x80 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_READ = 0x400 + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x4 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x100000 + O_CREAT = 0x200 + O_DIRECT = 0x10000 + O_DIRECTORY = 0x20000 + O_EXCL = 0x800 + O_EXEC = 0x40000 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_TTY_INIT = 0x80000 + O_VERIFY = 0x200000 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_FIXEDMTU = 0x80000 + RTF_FMASK = 0x1004d808 + RTF_GATEWAY = 0x2 + RTF_GWFLAG_COMPAT = 0x80000000 + RTF_HOST = 0x4 + RTF_LLDATA = 0x400 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_PINNED = 0x100000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_REJECT = 0x8 + RTF_RNH_LOCKED = 0x40000000 + RTF_STATIC = 0x800 + RTF_STICKY = 0x10000000 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x12 + RTM_IFANNOUNCE = 0x11 + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RTV_WEIGHT = 0x100 + RT_ALL_FIBS = -0x1 + RT_BLACKHOLE = 0x40 + RT_CACHING_CONTEXT = 0x1 + RT_DEFAULT_FIB = 0x0 + RT_HAS_GW = 0x80 + RT_HAS_HEADER = 0x10 + RT_HAS_HEADER_BIT = 0x4 + RT_L2_ME = 0x4 + RT_L2_ME_BIT = 0x2 + RT_LLE_CACHE = 0x100 + RT_MAY_LOOP = 0x8 + RT_MAY_LOOP_BIT = 0x3 + RT_NORTREF = 0x2 + RT_REJECT = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_BINTIME = 0x4 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCAIFGROUP = 0x80246987 + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFGROUP = 0x80246989 + SIOCDIFPHYADDR = 0x80206949 + SIOCGDRVSPEC = 0xc01c697b + SIOCGETSGCNT = 0xc0147210 + SIOCGETVIFCNT = 0xc014720f + SIOCGHIWAT = 0x40047301 + SIOCGHWADDR = 0xc020693e + SIOCGI2C = 0xc020693d + SIOCGIFADDR = 0xc0206921 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020691f + SIOCGIFCONF = 0xc0086924 + SIOCGIFDESCR = 0xc020692a + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFIB = 0xc020695c + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc024698a + SIOCGIFGROUP = 0xc0246988 + SIOCGIFINDEX = 0xc0206920 + SIOCGIFMAC = 0xc0206926 + SIOCGIFMEDIA = 0xc0286938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206948 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFSTATUS = 0xc331693b + SIOCGIFXMEDIA = 0xc028698b + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGPRIVATE_0 = 0xc0206950 + SIOCGPRIVATE_1 = 0xc0206951 + SIOCGTUNFIB = 0xc020695e + SIOCIFCREATE = 0xc020697a + SIOCIFCREATE2 = 0xc020697c + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc00c6978 + SIOCSDRVSPEC = 0x801c697b + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020691e + SIOCSIFDESCR = 0x80206929 + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFIB = 0x8020695d + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206927 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNAME = 0x80206928 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSIFPHYS = 0x80206936 + SIOCSIFRVNET = 0xc020695b + SIOCSIFVNET = 0xc020695a + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSTUNFIB = 0x8020695f + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_NONBLOCK = 0x20000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BINTIME = 0x2000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1009 + SO_LINGER = 0x80 + SO_LISTENINCQLEN = 0x1013 + SO_LISTENQLEN = 0x1012 + SO_LISTENQLIMIT = 0x1011 + SO_NOSIGPIPE = 0x800 + SO_NO_DDP = 0x8000 + SO_NO_OFFLOAD = 0x4000 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1010 + SO_PROTOCOL = 0x1016 + SO_PROTOTYPE = 0x1016 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SETFIB = 0x1014 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SO_USER_COOKIE = 0x1015 + SO_VENDOR = 0x80000000 + TAB0 = 0x0 + TAB3 = 0x4 + TABDLY = 0x4 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCP_CA_NAME_MAX = 0x10 + TCP_CCALGOOPT = 0x41 + TCP_CONGESTION = 0x40 + TCP_FASTOPEN = 0x401 + TCP_FUNCTION_BLK = 0x2000 + TCP_FUNCTION_NAME_LEN_MAX = 0x20 + TCP_INFO = 0x20 + TCP_KEEPCNT = 0x400 + TCP_KEEPIDLE = 0x100 + TCP_KEEPINIT = 0x80 + TCP_KEEPINTVL = 0x200 + TCP_MAXBURST = 0x4 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x10 + TCP_MINMSS = 0xd8 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_PCAP_IN = 0x1000 + TCP_PCAP_OUT = 0x800 + TCP_VENDOR = 0x80000000 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGPTN = 0x4004740f + TIOCGSID = 0x40047463 + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DCD = 0x40 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTMASTER = 0x2000741c + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2004745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40107459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VERASE2 = 0x7 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x4 + WCOREFLAG = 0x80 + WEXITED = 0x10 + WLINUXCLONE = 0x80000000 + WNOHANG = 0x1 + WNOWAIT = 0x8 + WSTOPPED = 0x2 + WTRAPPED = 0x20 + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x59) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x55) + ECAPMODE = syscall.Errno(0x5e) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDOOFUS = syscall.Errno(0x58) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x52) + EILSEQ = syscall.Errno(0x56) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x60) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5a) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x57) + ENOBUFS = syscall.Errno(0x37) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x5b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x53) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCAPABLE = syscall.Errno(0x5d) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x5f) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x54) + EOWNERDEAD = syscall.Errno(0x60) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x5c) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGLIBRT = syscall.Signal(0x21) + SIGLWP = syscall.Signal(0x20) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHR = syscall.Signal(0x20) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "device not configured"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EDEADLK", "resource deadlock avoided"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "cross-device link"}, + {19, "ENODEV", "operation not supported by device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "result too large"}, + {35, "EAGAIN", "resource temporarily unavailable"}, + {36, "EINPROGRESS", "operation now in progress"}, + {37, "EALREADY", "operation already in progress"}, + {38, "ENOTSOCK", "socket operation on non-socket"}, + {39, "EDESTADDRREQ", "destination address required"}, + {40, "EMSGSIZE", "message too long"}, + {41, "EPROTOTYPE", "protocol wrong type for socket"}, + {42, "ENOPROTOOPT", "protocol not available"}, + {43, "EPROTONOSUPPORT", "protocol not supported"}, + {44, "ESOCKTNOSUPPORT", "socket type not supported"}, + {45, "EOPNOTSUPP", "operation not supported"}, + {46, "EPFNOSUPPORT", "protocol family not supported"}, + {47, "EAFNOSUPPORT", "address family not supported by protocol family"}, + {48, "EADDRINUSE", "address already in use"}, + {49, "EADDRNOTAVAIL", "can't assign requested address"}, + {50, "ENETDOWN", "network is down"}, + {51, "ENETUNREACH", "network is unreachable"}, + {52, "ENETRESET", "network dropped connection on reset"}, + {53, "ECONNABORTED", "software caused connection abort"}, + {54, "ECONNRESET", "connection reset by peer"}, + {55, "ENOBUFS", "no buffer space available"}, + {56, "EISCONN", "socket is already connected"}, + {57, "ENOTCONN", "socket is not connected"}, + {58, "ESHUTDOWN", "can't send after socket shutdown"}, + {59, "ETOOMANYREFS", "too many references: can't splice"}, + {60, "ETIMEDOUT", "operation timed out"}, + {61, "ECONNREFUSED", "connection refused"}, + {62, "ELOOP", "too many levels of symbolic links"}, + {63, "ENAMETOOLONG", "file name too long"}, + {64, "EHOSTDOWN", "host is down"}, + {65, "EHOSTUNREACH", "no route to host"}, + {66, "ENOTEMPTY", "directory not empty"}, + {67, "EPROCLIM", "too many processes"}, + {68, "EUSERS", "too many users"}, + {69, "EDQUOT", "disc quota exceeded"}, + {70, "ESTALE", "stale NFS file handle"}, + {71, "EREMOTE", "too many levels of remote in path"}, + {72, "EBADRPC", "RPC struct is bad"}, + {73, "ERPCMISMATCH", "RPC version wrong"}, + {74, "EPROGUNAVAIL", "RPC prog. not avail"}, + {75, "EPROGMISMATCH", "program version wrong"}, + {76, "EPROCUNAVAIL", "bad procedure for program"}, + {77, "ENOLCK", "no locks available"}, + {78, "ENOSYS", "function not implemented"}, + {79, "EFTYPE", "inappropriate file type or format"}, + {80, "EAUTH", "authentication error"}, + {81, "ENEEDAUTH", "need authenticator"}, + {82, "EIDRM", "identifier removed"}, + {83, "ENOMSG", "no message of desired type"}, + {84, "EOVERFLOW", "value too large to be stored in data type"}, + {85, "ECANCELED", "operation canceled"}, + {86, "EILSEQ", "illegal byte sequence"}, + {87, "ENOATTR", "attribute not found"}, + {88, "EDOOFUS", "programming error"}, + {89, "EBADMSG", "bad message"}, + {90, "EMULTIHOP", "multihop attempted"}, + {91, "ENOLINK", "link has been severed"}, + {92, "EPROTO", "protocol error"}, + {93, "ENOTCAPABLE", "capabilities insufficient"}, + {94, "ECAPMODE", "not permitted in capability mode"}, + {95, "ENOTRECOVERABLE", "state not recoverable"}, + {96, "EOWNERDEAD", "previous owner died"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/BPT trap"}, + {6, "SIGIOT", "abort trap"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGURG", "urgent I/O condition"}, + {17, "SIGSTOP", "suspended (signal)"}, + {18, "SIGTSTP", "suspended"}, + {19, "SIGCONT", "continued"}, + {20, "SIGCHLD", "child exited"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGIO", "I/O possible"}, + {24, "SIGXCPU", "cputime limit exceeded"}, + {25, "SIGXFSZ", "filesize limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window size changes"}, + {29, "SIGINFO", "information request"}, + {30, "SIGUSR1", "user defined signal 1"}, + {31, "SIGUSR2", "user defined signal 2"}, + {32, "SIGTHR", "unknown signal"}, + {33, "SIGLIBRT", "unknown signal"}, +} diff --git a/api/vendor/golang.org/x/sys/unix/zerrors_linux_386.go b/api/vendor/golang.org/x/sys/unix/zerrors_linux_386.go new file mode 100644 index 0000000..ee17d4b --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zerrors_linux_386.go @@ -0,0 +1,2565 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include -m32 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m32 _const.go + +package unix + +import "syscall" + +const ( + AAFS_MAGIC = 0x5a3c69f0 + ADFS_SUPER_MAGIC = 0xadf5 + AFFS_SUPER_MAGIC = 0xadff + AFS_FS_MAGIC = 0x6b414653 + AFS_SUPER_MAGIC = 0x5346414f + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ANON_INODE_FS_MAGIC = 0x9041934 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + AUTOFS_SUPER_MAGIC = 0x187 + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BALLOON_KVM_MAGIC = 0x13661366 + BDEVFS_MAGIC = 0x62646576 + BINFMTFS_MAGIC = 0x42494e4d + BLKBSZGET = 0x80041270 + BLKBSZSET = 0x40041271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80041272 + BLKPBSZGET = 0x127b + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_FS_MAGIC = 0xcafe4a11 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + BTRFS_SUPER_MAGIC = 0x9123683e + BTRFS_TEST_MAGIC = 0x73727279 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CGROUP2_SUPER_MAGIC = 0x63677270 + CGROUP_SUPER_MAGIC = 0x27e0eb + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CODA_SUPER_MAGIC = 0x73757245 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRAMFS_MAGIC = 0x28cd3d45 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DAXFS_MAGIC = 0x64646178 + DEBUGFS_MAGIC = 0x64626720 + DEVPTS_SUPER_MAGIC = 0x1cd1 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + ECRYPTFS_SUPER_MAGIC = 0xf15f + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + EFIVARFS_MAGIC = 0xde5e81e4 + EFS_SUPER_MAGIC = 0x414a53 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXT2_SUPER_MAGIC = 0xef53 + EXT3_SUPER_MAGIC = 0xef53 + EXT4_SUPER_MAGIC = 0xef53 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + F2FS_SUPER_MAGIC = 0xf2f52010 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x1000 + FP_XSTATE_MAGIC2 = 0x46505845 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + FUTEXFS_SUPER_MAGIC = 0xbad1dea + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0xc + F_GETLK64 = 0xc + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0xd + F_SETLK64 = 0xd + F_SETLKW = 0xe + F_SETLKW64 = 0xe + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HOSTFS_SUPER_MAGIC = 0xc0ffee + HPFS_SUPER_MAGIC = 0xf995e849 + HUGETLBFS_MAGIC = 0x958458f6 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISOFS_SUPER_MAGIC = 0x9660 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + JFFS2_SUPER_MAGIC = 0x72b6 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_32BIT = 0x40 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x2000 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x4000 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MINIX2_SUPER_MAGIC = 0x2468 + MINIX2_SUPER_MAGIC2 = 0x2478 + MINIX3_SUPER_MAGIC = 0x4d5a + MINIX_SUPER_MAGIC = 0x137f + MINIX_SUPER_MAGIC2 = 0x138f + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSDOS_SUPER_MAGIC = 0x4d44 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + MTD_INODE_FS_MAGIC = 0x11307854 + NAME_MAX = 0xff + NCP_SUPER_MAGIC = 0x564c + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NFNETLINK_V0 = 0x0 + NFNLGRP_ACCT_QUOTA = 0x8 + NFNLGRP_CONNTRACK_DESTROY = 0x3 + NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 + NFNLGRP_CONNTRACK_EXP_NEW = 0x4 + NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 + NFNLGRP_CONNTRACK_NEW = 0x1 + NFNLGRP_CONNTRACK_UPDATE = 0x2 + NFNLGRP_MAX = 0x9 + NFNLGRP_NFTABLES = 0x7 + NFNLGRP_NFTRACE = 0x9 + NFNLGRP_NONE = 0x0 + NFNL_BATCH_MAX = 0x1 + NFNL_MSG_BATCH_BEGIN = 0x10 + NFNL_MSG_BATCH_END = 0x11 + NFNL_NFA_NEST = 0x8000 + NFNL_SUBSYS_ACCT = 0x7 + NFNL_SUBSYS_COUNT = 0xc + NFNL_SUBSYS_CTHELPER = 0x9 + NFNL_SUBSYS_CTNETLINK = 0x1 + NFNL_SUBSYS_CTNETLINK_EXP = 0x2 + NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 + NFNL_SUBSYS_IPSET = 0x6 + NFNL_SUBSYS_NFTABLES = 0xa + NFNL_SUBSYS_NFT_COMPAT = 0xb + NFNL_SUBSYS_NONE = 0x0 + NFNL_SUBSYS_OSF = 0x5 + NFNL_SUBSYS_QUEUE = 0x3 + NFNL_SUBSYS_ULOG = 0x4 + NFS_SUPER_MAGIC = 0x6969 + NILFS_SUPER_MAGIC = 0x3434 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + NSFS_MAGIC = 0x6e736673 + OCFS2_SUPER_MAGIC = 0x7461636f + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPENPROM_SUPER_MAGIC = 0x9fa1 + OPOST = 0x1 + OVERLAYFS_SUPER_MAGIC = 0x794c7630 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x4000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x8000 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x2401 + PERF_EVENT_IOC_ENABLE = 0x2400 + PERF_EVENT_IOC_ID = 0x80042407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 + PERF_EVENT_IOC_PERIOD = 0x40082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc004240a + PERF_EVENT_IOC_REFRESH = 0x2402 + PERF_EVENT_IOC_RESET = 0x2403 + PERF_EVENT_IOC_SET_BPF = 0x40042408 + PERF_EVENT_IOC_SET_FILTER = 0x40042406 + PERF_EVENT_IOC_SET_OUTPUT = 0x2405 + PIPEFS_MAGIC = 0x50495045 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROC_SUPER_MAGIC = 0x9fa0 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PSTOREFS_MAGIC = 0x6165676c + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETFPXREGS = 0x12 + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPREGS = 0xf + PTRACE_SETFPXREGS = 0x13 + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SINGLEBLOCK = 0x21 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_SYSEMU = 0x1f + PTRACE_SYSEMU_SINGLESTEP = 0x20 + PTRACE_TRACEME = 0x0 + QNX4_SUPER_MAGIC = 0x2f + QNX6_SUPER_MAGIC = 0x68191122 + RAMFS_MAGIC = 0x858458f6 + RDTGROUP_SUPER_MAGIC = 0x7655821 + REISERFS_SUPER_MAGIC = 0x52654973 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SECURITYFS_MAGIC = 0x73636673 + SELINUX_MAGIC = 0xf97cff8c + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x541b + SIOCOUTQ = 0x5411 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMACK_MAGIC = 0x43415d53 + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SMB_SUPER_MAGIC = 0x517b + SOCKFS_MAGIC = 0x534f434b + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x10 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x11 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x12 + SO_RCVTIMEO = 0x14 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x13 + SO_SNDTIMEO = 0x15 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + SQUASHFS_MAGIC = 0x73717368 + STACK_END_MAGIC = 0x57ac6e9d + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + SYSFS_MAGIC = 0x62656572 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x540b + TCGETA = 0x5405 + TCGETS = 0x5401 + TCGETS2 = 0x802c542a + TCGETX = 0x5432 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSBRKP = 0x5425 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETS2 = 0x402c542b + TCSETSF = 0x5404 + TCSETSF2 = 0x402c542d + TCSETSW = 0x5403 + TCSETSW2 = 0x402c542c + TCSETX = 0x5433 + TCSETXF = 0x5434 + TCSETXW = 0x5435 + TCXONC = 0x540a + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x80045432 + TIOCGETD = 0x5424 + TIOCGEXCL = 0x80045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x540f + TIOCGPKT = 0x80045438 + TIOCGPTLCK = 0x80045439 + TIOCGPTN = 0x80045430 + TIOCGPTPEER = 0x5441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x5413 + TIOCINQ = 0x541b + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x5411 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x5423 + TIOCSIG = 0x40045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x5410 + TIOCSPTLCK = 0x40045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTI = 0x5412 + TIOCSWINSZ = 0x5414 + TIOCVHANGUP = 0x5437 + TMPFS_MAGIC = 0x1021994 + TOSTOP = 0x100 + TPACKET_ALIGNMENT = 0x10 + TPACKET_HDRLEN = 0x34 + TP_STATUS_AVAILABLE = 0x0 + TP_STATUS_BLK_TMO = 0x20 + TP_STATUS_COPY = 0x2 + TP_STATUS_CSUMNOTREADY = 0x8 + TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_KERNEL = 0x0 + TP_STATUS_LOSING = 0x4 + TP_STATUS_SENDING = 0x2 + TP_STATUS_SEND_REQUEST = 0x1 + TP_STATUS_TS_RAW_HARDWARE = -0x80000000 + TP_STATUS_TS_SOFTWARE = 0x20000000 + TP_STATUS_TS_SYS_HARDWARE = 0x40000000 + TP_STATUS_USER = 0x1 + TP_STATUS_VLAN_TPID_VALID = 0x40 + TP_STATUS_VLAN_VALID = 0x10 + TP_STATUS_WRONG_FORMAT = 0x4 + TRACEFS_MAGIC = 0x74726163 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x400854d5 + TUNDETACHFILTER = 0x400854d6 + TUNGETFEATURES = 0x800454cf + TUNGETFILTER = 0x800854db + TUNGETIFF = 0x800454d2 + TUNGETSNDBUF = 0x800454d3 + TUNGETVNETBE = 0x800454df + TUNGETVNETHDRSZ = 0x800454d7 + TUNGETVNETLE = 0x800454dd + TUNSETDEBUG = 0x400454c9 + TUNSETFILTEREBPF = 0x800454e1 + TUNSETGROUP = 0x400454ce + TUNSETIFF = 0x400454ca + TUNSETIFINDEX = 0x400454da + TUNSETLINK = 0x400454cd + TUNSETNOCSUM = 0x400454c8 + TUNSETOFFLOAD = 0x400454d0 + TUNSETOWNER = 0x400454cc + TUNSETPERSIST = 0x400454cb + TUNSETQUEUE = 0x400454d9 + TUNSETSNDBUF = 0x400454d4 + TUNSETSTEERINGEBPF = 0x800454e0 + TUNSETTXFILTER = 0x400454d1 + TUNSETVNETBE = 0x400454de + TUNSETVNETHDRSZ = 0x400454d8 + TUNSETVNETLE = 0x400454dc + UDF_SUPER_MAGIC = 0x15013346 + UMOUNT_NOFOLLOW = 0x8 + USBDEVICE_SUPER_MAGIC = 0x9fa2 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + V9FS_MAGIC = 0x1021997 + VDISCARD = 0xd + VEOF = 0x4 + VEOL = 0xb + VEOL2 = 0x10 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x6 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x80045702 + WDIOC_GETPRETIMEOUT = 0x80045709 + WDIOC_GETSTATUS = 0x80045701 + WDIOC_GETSUPPORT = 0x80285700 + WDIOC_GETTEMP = 0x80045703 + WDIOC_GETTIMELEFT = 0x8004570a + WDIOC_GETTIMEOUT = 0x80045707 + WDIOC_KEEPALIVE = 0x80045705 + WDIOC_SETOPTIONS = 0x80045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x20 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + X86_FXSR_MAGIC = 0x0 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XENFS_SUPER_MAGIC = 0xabba1974 + XTABS = 0x1800 + ZSMALLOC_MAGIC = 0x58295829 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x62) + EADDRNOTAVAIL = syscall.Errno(0x63) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x61) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x72) + EBADE = syscall.Errno(0x34) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x4d) + EBADMSG = syscall.Errno(0x4a) + EBADR = syscall.Errno(0x35) + EBADRQC = syscall.Errno(0x38) + EBADSLT = syscall.Errno(0x39) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7d) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x2c) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x67) + ECONNREFUSED = syscall.Errno(0x6f) + ECONNRESET = syscall.Errno(0x68) + EDEADLK = syscall.Errno(0x23) + EDEADLOCK = syscall.Errno(0x23) + EDESTADDRREQ = syscall.Errno(0x59) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x7a) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x70) + EHOSTUNREACH = syscall.Errno(0x71) + EHWPOISON = syscall.Errno(0x85) + EIDRM = syscall.Errno(0x2b) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x73) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x6a) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x7f) + EKEYREJECTED = syscall.Errno(0x81) + EKEYREVOKED = syscall.Errno(0x80) + EL2HLT = syscall.Errno(0x33) + EL2NSYNC = syscall.Errno(0x2d) + EL3HLT = syscall.Errno(0x2e) + EL3RST = syscall.Errno(0x2f) + ELIBACC = syscall.Errno(0x4f) + ELIBBAD = syscall.Errno(0x50) + ELIBEXEC = syscall.Errno(0x53) + ELIBMAX = syscall.Errno(0x52) + ELIBSCN = syscall.Errno(0x51) + ELNRNG = syscall.Errno(0x30) + ELOOP = syscall.Errno(0x28) + EMEDIUMTYPE = syscall.Errno(0x7c) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x5a) + EMULTIHOP = syscall.Errno(0x48) + ENAMETOOLONG = syscall.Errno(0x24) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x64) + ENETRESET = syscall.Errno(0x66) + ENETUNREACH = syscall.Errno(0x65) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x37) + ENOBUFS = syscall.Errno(0x69) + ENOCSI = syscall.Errno(0x32) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x7e) + ENOLCK = syscall.Errno(0x25) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x7b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x2a) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x5c) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x26) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x6b) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x27) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x83) + ENOTSOCK = syscall.Errno(0x58) + ENOTSUP = syscall.Errno(0x5f) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x4c) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x5f) + EOVERFLOW = syscall.Errno(0x4b) + EOWNERDEAD = syscall.Errno(0x82) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x60) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x5d) + EPROTOTYPE = syscall.Errno(0x5b) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x4e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x55) + ERFKILL = syscall.Errno(0x84) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x6c) + ESOCKTNOSUPPORT = syscall.Errno(0x5e) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x74) + ESTRPIPE = syscall.Errno(0x56) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x6e) + ETOOMANYREFS = syscall.Errno(0x6d) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x31) + EUSERS = syscall.Errno(0x57) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x36) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0x7) + SIGCHLD = syscall.Signal(0x11) + SIGCLD = syscall.Signal(0x11) + SIGCONT = syscall.Signal(0x12) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x1d) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x1d) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1e) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTKFLT = syscall.Signal(0x10) + SIGSTOP = syscall.Signal(0x13) + SIGSYS = syscall.Signal(0x1f) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x14) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x17) + SIGUSR1 = syscall.Signal(0xa) + SIGUSR2 = syscall.Signal(0xc) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "no such device or address"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EAGAIN", "resource temporarily unavailable"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device or resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "invalid cross-device link"}, + {19, "ENODEV", "no such device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "numerical result out of range"}, + {35, "EDEADLK", "resource deadlock avoided"}, + {36, "ENAMETOOLONG", "file name too long"}, + {37, "ENOLCK", "no locks available"}, + {38, "ENOSYS", "function not implemented"}, + {39, "ENOTEMPTY", "directory not empty"}, + {40, "ELOOP", "too many levels of symbolic links"}, + {42, "ENOMSG", "no message of desired type"}, + {43, "EIDRM", "identifier removed"}, + {44, "ECHRNG", "channel number out of range"}, + {45, "EL2NSYNC", "level 2 not synchronized"}, + {46, "EL3HLT", "level 3 halted"}, + {47, "EL3RST", "level 3 reset"}, + {48, "ELNRNG", "link number out of range"}, + {49, "EUNATCH", "protocol driver not attached"}, + {50, "ENOCSI", "no CSI structure available"}, + {51, "EL2HLT", "level 2 halted"}, + {52, "EBADE", "invalid exchange"}, + {53, "EBADR", "invalid request descriptor"}, + {54, "EXFULL", "exchange full"}, + {55, "ENOANO", "no anode"}, + {56, "EBADRQC", "invalid request code"}, + {57, "EBADSLT", "invalid slot"}, + {59, "EBFONT", "bad font file format"}, + {60, "ENOSTR", "device not a stream"}, + {61, "ENODATA", "no data available"}, + {62, "ETIME", "timer expired"}, + {63, "ENOSR", "out of streams resources"}, + {64, "ENONET", "machine is not on the network"}, + {65, "ENOPKG", "package not installed"}, + {66, "EREMOTE", "object is remote"}, + {67, "ENOLINK", "link has been severed"}, + {68, "EADV", "advertise error"}, + {69, "ESRMNT", "srmount error"}, + {70, "ECOMM", "communication error on send"}, + {71, "EPROTO", "protocol error"}, + {72, "EMULTIHOP", "multihop attempted"}, + {73, "EDOTDOT", "RFS specific error"}, + {74, "EBADMSG", "bad message"}, + {75, "EOVERFLOW", "value too large for defined data type"}, + {76, "ENOTUNIQ", "name not unique on network"}, + {77, "EBADFD", "file descriptor in bad state"}, + {78, "EREMCHG", "remote address changed"}, + {79, "ELIBACC", "can not access a needed shared library"}, + {80, "ELIBBAD", "accessing a corrupted shared library"}, + {81, "ELIBSCN", ".lib section in a.out corrupted"}, + {82, "ELIBMAX", "attempting to link in too many shared libraries"}, + {83, "ELIBEXEC", "cannot exec a shared library directly"}, + {84, "EILSEQ", "invalid or incomplete multibyte or wide character"}, + {85, "ERESTART", "interrupted system call should be restarted"}, + {86, "ESTRPIPE", "streams pipe error"}, + {87, "EUSERS", "too many users"}, + {88, "ENOTSOCK", "socket operation on non-socket"}, + {89, "EDESTADDRREQ", "destination address required"}, + {90, "EMSGSIZE", "message too long"}, + {91, "EPROTOTYPE", "protocol wrong type for socket"}, + {92, "ENOPROTOOPT", "protocol not available"}, + {93, "EPROTONOSUPPORT", "protocol not supported"}, + {94, "ESOCKTNOSUPPORT", "socket type not supported"}, + {95, "ENOTSUP", "operation not supported"}, + {96, "EPFNOSUPPORT", "protocol family not supported"}, + {97, "EAFNOSUPPORT", "address family not supported by protocol"}, + {98, "EADDRINUSE", "address already in use"}, + {99, "EADDRNOTAVAIL", "cannot assign requested address"}, + {100, "ENETDOWN", "network is down"}, + {101, "ENETUNREACH", "network is unreachable"}, + {102, "ENETRESET", "network dropped connection on reset"}, + {103, "ECONNABORTED", "software caused connection abort"}, + {104, "ECONNRESET", "connection reset by peer"}, + {105, "ENOBUFS", "no buffer space available"}, + {106, "EISCONN", "transport endpoint is already connected"}, + {107, "ENOTCONN", "transport endpoint is not connected"}, + {108, "ESHUTDOWN", "cannot send after transport endpoint shutdown"}, + {109, "ETOOMANYREFS", "too many references: cannot splice"}, + {110, "ETIMEDOUT", "connection timed out"}, + {111, "ECONNREFUSED", "connection refused"}, + {112, "EHOSTDOWN", "host is down"}, + {113, "EHOSTUNREACH", "no route to host"}, + {114, "EALREADY", "operation already in progress"}, + {115, "EINPROGRESS", "operation now in progress"}, + {116, "ESTALE", "stale file handle"}, + {117, "EUCLEAN", "structure needs cleaning"}, + {118, "ENOTNAM", "not a XENIX named type file"}, + {119, "ENAVAIL", "no XENIX semaphores available"}, + {120, "EISNAM", "is a named type file"}, + {121, "EREMOTEIO", "remote I/O error"}, + {122, "EDQUOT", "disk quota exceeded"}, + {123, "ENOMEDIUM", "no medium found"}, + {124, "EMEDIUMTYPE", "wrong medium type"}, + {125, "ECANCELED", "operation canceled"}, + {126, "ENOKEY", "required key not available"}, + {127, "EKEYEXPIRED", "key has expired"}, + {128, "EKEYREVOKED", "key has been revoked"}, + {129, "EKEYREJECTED", "key was rejected by service"}, + {130, "EOWNERDEAD", "owner died"}, + {131, "ENOTRECOVERABLE", "state not recoverable"}, + {132, "ERFKILL", "operation not possible due to RF-kill"}, + {133, "EHWPOISON", "memory page has hardware error"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/breakpoint trap"}, + {6, "SIGABRT", "aborted"}, + {7, "SIGBUS", "bus error"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGUSR1", "user defined signal 1"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGUSR2", "user defined signal 2"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGSTKFLT", "stack fault"}, + {17, "SIGCHLD", "child exited"}, + {18, "SIGCONT", "continued"}, + {19, "SIGSTOP", "stopped (signal)"}, + {20, "SIGTSTP", "stopped"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGURG", "urgent I/O condition"}, + {24, "SIGXCPU", "CPU time limit exceeded"}, + {25, "SIGXFSZ", "file size limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window changed"}, + {29, "SIGIO", "I/O possible"}, + {30, "SIGPWR", "power failure"}, + {31, "SIGSYS", "bad system call"}, +} diff --git a/api/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go b/api/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go new file mode 100644 index 0000000..64ab9f4 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go @@ -0,0 +1,2565 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include -m64 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m64 _const.go + +package unix + +import "syscall" + +const ( + AAFS_MAGIC = 0x5a3c69f0 + ADFS_SUPER_MAGIC = 0xadf5 + AFFS_SUPER_MAGIC = 0xadff + AFS_FS_MAGIC = 0x6b414653 + AFS_SUPER_MAGIC = 0x5346414f + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ANON_INODE_FS_MAGIC = 0x9041934 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + AUTOFS_SUPER_MAGIC = 0x187 + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BALLOON_KVM_MAGIC = 0x13661366 + BDEVFS_MAGIC = 0x62646576 + BINFMTFS_MAGIC = 0x42494e4d + BLKBSZGET = 0x80081270 + BLKBSZSET = 0x40081271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80081272 + BLKPBSZGET = 0x127b + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_FS_MAGIC = 0xcafe4a11 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + BTRFS_SUPER_MAGIC = 0x9123683e + BTRFS_TEST_MAGIC = 0x73727279 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CGROUP2_SUPER_MAGIC = 0x63677270 + CGROUP_SUPER_MAGIC = 0x27e0eb + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CODA_SUPER_MAGIC = 0x73757245 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRAMFS_MAGIC = 0x28cd3d45 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DAXFS_MAGIC = 0x64646178 + DEBUGFS_MAGIC = 0x64626720 + DEVPTS_SUPER_MAGIC = 0x1cd1 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + ECRYPTFS_SUPER_MAGIC = 0xf15f + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + EFIVARFS_MAGIC = 0xde5e81e4 + EFS_SUPER_MAGIC = 0x414a53 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXT2_SUPER_MAGIC = 0xef53 + EXT3_SUPER_MAGIC = 0xef53 + EXT4_SUPER_MAGIC = 0xef53 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + F2FS_SUPER_MAGIC = 0xf2f52010 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x1000 + FP_XSTATE_MAGIC2 = 0x46505845 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + FUTEXFS_SUPER_MAGIC = 0xbad1dea + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x5 + F_GETLK64 = 0x5 + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HOSTFS_SUPER_MAGIC = 0xc0ffee + HPFS_SUPER_MAGIC = 0xf995e849 + HUGETLBFS_MAGIC = 0x958458f6 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISOFS_SUPER_MAGIC = 0x9660 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + JFFS2_SUPER_MAGIC = 0x72b6 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_32BIT = 0x40 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x2000 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x4000 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MINIX2_SUPER_MAGIC = 0x2468 + MINIX2_SUPER_MAGIC2 = 0x2478 + MINIX3_SUPER_MAGIC = 0x4d5a + MINIX_SUPER_MAGIC = 0x137f + MINIX_SUPER_MAGIC2 = 0x138f + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSDOS_SUPER_MAGIC = 0x4d44 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + MTD_INODE_FS_MAGIC = 0x11307854 + NAME_MAX = 0xff + NCP_SUPER_MAGIC = 0x564c + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NFNETLINK_V0 = 0x0 + NFNLGRP_ACCT_QUOTA = 0x8 + NFNLGRP_CONNTRACK_DESTROY = 0x3 + NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 + NFNLGRP_CONNTRACK_EXP_NEW = 0x4 + NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 + NFNLGRP_CONNTRACK_NEW = 0x1 + NFNLGRP_CONNTRACK_UPDATE = 0x2 + NFNLGRP_MAX = 0x9 + NFNLGRP_NFTABLES = 0x7 + NFNLGRP_NFTRACE = 0x9 + NFNLGRP_NONE = 0x0 + NFNL_BATCH_MAX = 0x1 + NFNL_MSG_BATCH_BEGIN = 0x10 + NFNL_MSG_BATCH_END = 0x11 + NFNL_NFA_NEST = 0x8000 + NFNL_SUBSYS_ACCT = 0x7 + NFNL_SUBSYS_COUNT = 0xc + NFNL_SUBSYS_CTHELPER = 0x9 + NFNL_SUBSYS_CTNETLINK = 0x1 + NFNL_SUBSYS_CTNETLINK_EXP = 0x2 + NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 + NFNL_SUBSYS_IPSET = 0x6 + NFNL_SUBSYS_NFTABLES = 0xa + NFNL_SUBSYS_NFT_COMPAT = 0xb + NFNL_SUBSYS_NONE = 0x0 + NFNL_SUBSYS_OSF = 0x5 + NFNL_SUBSYS_QUEUE = 0x3 + NFNL_SUBSYS_ULOG = 0x4 + NFS_SUPER_MAGIC = 0x6969 + NILFS_SUPER_MAGIC = 0x3434 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + NSFS_MAGIC = 0x6e736673 + OCFS2_SUPER_MAGIC = 0x7461636f + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPENPROM_SUPER_MAGIC = 0x9fa1 + OPOST = 0x1 + OVERLAYFS_SUPER_MAGIC = 0x794c7630 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x4000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x2401 + PERF_EVENT_IOC_ENABLE = 0x2400 + PERF_EVENT_IOC_ID = 0x80082407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 + PERF_EVENT_IOC_PERIOD = 0x40082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc008240a + PERF_EVENT_IOC_REFRESH = 0x2402 + PERF_EVENT_IOC_RESET = 0x2403 + PERF_EVENT_IOC_SET_BPF = 0x40042408 + PERF_EVENT_IOC_SET_FILTER = 0x40082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x2405 + PIPEFS_MAGIC = 0x50495045 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROC_SUPER_MAGIC = 0x9fa0 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffffffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PSTOREFS_MAGIC = 0x6165676c + PTRACE_ARCH_PRCTL = 0x1e + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETFPXREGS = 0x12 + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPREGS = 0xf + PTRACE_SETFPXREGS = 0x13 + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SINGLEBLOCK = 0x21 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_SYSEMU = 0x1f + PTRACE_SYSEMU_SINGLESTEP = 0x20 + PTRACE_TRACEME = 0x0 + QNX4_SUPER_MAGIC = 0x2f + QNX6_SUPER_MAGIC = 0x68191122 + RAMFS_MAGIC = 0x858458f6 + RDTGROUP_SUPER_MAGIC = 0x7655821 + REISERFS_SUPER_MAGIC = 0x52654973 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SECURITYFS_MAGIC = 0x73636673 + SELINUX_MAGIC = 0xf97cff8c + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x541b + SIOCOUTQ = 0x5411 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMACK_MAGIC = 0x43415d53 + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SMB_SUPER_MAGIC = 0x517b + SOCKFS_MAGIC = 0x534f434b + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x10 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x11 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x12 + SO_RCVTIMEO = 0x14 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x13 + SO_SNDTIMEO = 0x15 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + SQUASHFS_MAGIC = 0x73717368 + STACK_END_MAGIC = 0x57ac6e9d + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + SYSFS_MAGIC = 0x62656572 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x540b + TCGETA = 0x5405 + TCGETS = 0x5401 + TCGETS2 = 0x802c542a + TCGETX = 0x5432 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSBRKP = 0x5425 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETS2 = 0x402c542b + TCSETSF = 0x5404 + TCSETSF2 = 0x402c542d + TCSETSW = 0x5403 + TCSETSW2 = 0x402c542c + TCSETX = 0x5433 + TCSETXF = 0x5434 + TCSETXW = 0x5435 + TCXONC = 0x540a + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x80045432 + TIOCGETD = 0x5424 + TIOCGEXCL = 0x80045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x540f + TIOCGPKT = 0x80045438 + TIOCGPTLCK = 0x80045439 + TIOCGPTN = 0x80045430 + TIOCGPTPEER = 0x5441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x5413 + TIOCINQ = 0x541b + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x5411 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x5423 + TIOCSIG = 0x40045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x5410 + TIOCSPTLCK = 0x40045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTI = 0x5412 + TIOCSWINSZ = 0x5414 + TIOCVHANGUP = 0x5437 + TMPFS_MAGIC = 0x1021994 + TOSTOP = 0x100 + TPACKET_ALIGNMENT = 0x10 + TPACKET_HDRLEN = 0x34 + TP_STATUS_AVAILABLE = 0x0 + TP_STATUS_BLK_TMO = 0x20 + TP_STATUS_COPY = 0x2 + TP_STATUS_CSUMNOTREADY = 0x8 + TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_KERNEL = 0x0 + TP_STATUS_LOSING = 0x4 + TP_STATUS_SENDING = 0x2 + TP_STATUS_SEND_REQUEST = 0x1 + TP_STATUS_TS_RAW_HARDWARE = -0x80000000 + TP_STATUS_TS_SOFTWARE = 0x20000000 + TP_STATUS_TS_SYS_HARDWARE = 0x40000000 + TP_STATUS_USER = 0x1 + TP_STATUS_VLAN_TPID_VALID = 0x40 + TP_STATUS_VLAN_VALID = 0x10 + TP_STATUS_WRONG_FORMAT = 0x4 + TRACEFS_MAGIC = 0x74726163 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x401054d5 + TUNDETACHFILTER = 0x401054d6 + TUNGETFEATURES = 0x800454cf + TUNGETFILTER = 0x801054db + TUNGETIFF = 0x800454d2 + TUNGETSNDBUF = 0x800454d3 + TUNGETVNETBE = 0x800454df + TUNGETVNETHDRSZ = 0x800454d7 + TUNGETVNETLE = 0x800454dd + TUNSETDEBUG = 0x400454c9 + TUNSETFILTEREBPF = 0x800454e1 + TUNSETGROUP = 0x400454ce + TUNSETIFF = 0x400454ca + TUNSETIFINDEX = 0x400454da + TUNSETLINK = 0x400454cd + TUNSETNOCSUM = 0x400454c8 + TUNSETOFFLOAD = 0x400454d0 + TUNSETOWNER = 0x400454cc + TUNSETPERSIST = 0x400454cb + TUNSETQUEUE = 0x400454d9 + TUNSETSNDBUF = 0x400454d4 + TUNSETSTEERINGEBPF = 0x800454e0 + TUNSETTXFILTER = 0x400454d1 + TUNSETVNETBE = 0x400454de + TUNSETVNETHDRSZ = 0x400454d8 + TUNSETVNETLE = 0x400454dc + UDF_SUPER_MAGIC = 0x15013346 + UMOUNT_NOFOLLOW = 0x8 + USBDEVICE_SUPER_MAGIC = 0x9fa2 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + V9FS_MAGIC = 0x1021997 + VDISCARD = 0xd + VEOF = 0x4 + VEOL = 0xb + VEOL2 = 0x10 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x6 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x80045702 + WDIOC_GETPRETIMEOUT = 0x80045709 + WDIOC_GETSTATUS = 0x80045701 + WDIOC_GETSUPPORT = 0x80285700 + WDIOC_GETTEMP = 0x80045703 + WDIOC_GETTIMELEFT = 0x8004570a + WDIOC_GETTIMEOUT = 0x80045707 + WDIOC_KEEPALIVE = 0x80045705 + WDIOC_SETOPTIONS = 0x80045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XENFS_SUPER_MAGIC = 0xabba1974 + XTABS = 0x1800 + ZSMALLOC_MAGIC = 0x58295829 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x62) + EADDRNOTAVAIL = syscall.Errno(0x63) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x61) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x72) + EBADE = syscall.Errno(0x34) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x4d) + EBADMSG = syscall.Errno(0x4a) + EBADR = syscall.Errno(0x35) + EBADRQC = syscall.Errno(0x38) + EBADSLT = syscall.Errno(0x39) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7d) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x2c) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x67) + ECONNREFUSED = syscall.Errno(0x6f) + ECONNRESET = syscall.Errno(0x68) + EDEADLK = syscall.Errno(0x23) + EDEADLOCK = syscall.Errno(0x23) + EDESTADDRREQ = syscall.Errno(0x59) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x7a) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x70) + EHOSTUNREACH = syscall.Errno(0x71) + EHWPOISON = syscall.Errno(0x85) + EIDRM = syscall.Errno(0x2b) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x73) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x6a) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x7f) + EKEYREJECTED = syscall.Errno(0x81) + EKEYREVOKED = syscall.Errno(0x80) + EL2HLT = syscall.Errno(0x33) + EL2NSYNC = syscall.Errno(0x2d) + EL3HLT = syscall.Errno(0x2e) + EL3RST = syscall.Errno(0x2f) + ELIBACC = syscall.Errno(0x4f) + ELIBBAD = syscall.Errno(0x50) + ELIBEXEC = syscall.Errno(0x53) + ELIBMAX = syscall.Errno(0x52) + ELIBSCN = syscall.Errno(0x51) + ELNRNG = syscall.Errno(0x30) + ELOOP = syscall.Errno(0x28) + EMEDIUMTYPE = syscall.Errno(0x7c) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x5a) + EMULTIHOP = syscall.Errno(0x48) + ENAMETOOLONG = syscall.Errno(0x24) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x64) + ENETRESET = syscall.Errno(0x66) + ENETUNREACH = syscall.Errno(0x65) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x37) + ENOBUFS = syscall.Errno(0x69) + ENOCSI = syscall.Errno(0x32) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x7e) + ENOLCK = syscall.Errno(0x25) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x7b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x2a) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x5c) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x26) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x6b) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x27) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x83) + ENOTSOCK = syscall.Errno(0x58) + ENOTSUP = syscall.Errno(0x5f) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x4c) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x5f) + EOVERFLOW = syscall.Errno(0x4b) + EOWNERDEAD = syscall.Errno(0x82) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x60) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x5d) + EPROTOTYPE = syscall.Errno(0x5b) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x4e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x55) + ERFKILL = syscall.Errno(0x84) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x6c) + ESOCKTNOSUPPORT = syscall.Errno(0x5e) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x74) + ESTRPIPE = syscall.Errno(0x56) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x6e) + ETOOMANYREFS = syscall.Errno(0x6d) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x31) + EUSERS = syscall.Errno(0x57) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x36) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0x7) + SIGCHLD = syscall.Signal(0x11) + SIGCLD = syscall.Signal(0x11) + SIGCONT = syscall.Signal(0x12) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x1d) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x1d) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1e) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTKFLT = syscall.Signal(0x10) + SIGSTOP = syscall.Signal(0x13) + SIGSYS = syscall.Signal(0x1f) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x14) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x17) + SIGUSR1 = syscall.Signal(0xa) + SIGUSR2 = syscall.Signal(0xc) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "no such device or address"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EAGAIN", "resource temporarily unavailable"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device or resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "invalid cross-device link"}, + {19, "ENODEV", "no such device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "numerical result out of range"}, + {35, "EDEADLK", "resource deadlock avoided"}, + {36, "ENAMETOOLONG", "file name too long"}, + {37, "ENOLCK", "no locks available"}, + {38, "ENOSYS", "function not implemented"}, + {39, "ENOTEMPTY", "directory not empty"}, + {40, "ELOOP", "too many levels of symbolic links"}, + {42, "ENOMSG", "no message of desired type"}, + {43, "EIDRM", "identifier removed"}, + {44, "ECHRNG", "channel number out of range"}, + {45, "EL2NSYNC", "level 2 not synchronized"}, + {46, "EL3HLT", "level 3 halted"}, + {47, "EL3RST", "level 3 reset"}, + {48, "ELNRNG", "link number out of range"}, + {49, "EUNATCH", "protocol driver not attached"}, + {50, "ENOCSI", "no CSI structure available"}, + {51, "EL2HLT", "level 2 halted"}, + {52, "EBADE", "invalid exchange"}, + {53, "EBADR", "invalid request descriptor"}, + {54, "EXFULL", "exchange full"}, + {55, "ENOANO", "no anode"}, + {56, "EBADRQC", "invalid request code"}, + {57, "EBADSLT", "invalid slot"}, + {59, "EBFONT", "bad font file format"}, + {60, "ENOSTR", "device not a stream"}, + {61, "ENODATA", "no data available"}, + {62, "ETIME", "timer expired"}, + {63, "ENOSR", "out of streams resources"}, + {64, "ENONET", "machine is not on the network"}, + {65, "ENOPKG", "package not installed"}, + {66, "EREMOTE", "object is remote"}, + {67, "ENOLINK", "link has been severed"}, + {68, "EADV", "advertise error"}, + {69, "ESRMNT", "srmount error"}, + {70, "ECOMM", "communication error on send"}, + {71, "EPROTO", "protocol error"}, + {72, "EMULTIHOP", "multihop attempted"}, + {73, "EDOTDOT", "RFS specific error"}, + {74, "EBADMSG", "bad message"}, + {75, "EOVERFLOW", "value too large for defined data type"}, + {76, "ENOTUNIQ", "name not unique on network"}, + {77, "EBADFD", "file descriptor in bad state"}, + {78, "EREMCHG", "remote address changed"}, + {79, "ELIBACC", "can not access a needed shared library"}, + {80, "ELIBBAD", "accessing a corrupted shared library"}, + {81, "ELIBSCN", ".lib section in a.out corrupted"}, + {82, "ELIBMAX", "attempting to link in too many shared libraries"}, + {83, "ELIBEXEC", "cannot exec a shared library directly"}, + {84, "EILSEQ", "invalid or incomplete multibyte or wide character"}, + {85, "ERESTART", "interrupted system call should be restarted"}, + {86, "ESTRPIPE", "streams pipe error"}, + {87, "EUSERS", "too many users"}, + {88, "ENOTSOCK", "socket operation on non-socket"}, + {89, "EDESTADDRREQ", "destination address required"}, + {90, "EMSGSIZE", "message too long"}, + {91, "EPROTOTYPE", "protocol wrong type for socket"}, + {92, "ENOPROTOOPT", "protocol not available"}, + {93, "EPROTONOSUPPORT", "protocol not supported"}, + {94, "ESOCKTNOSUPPORT", "socket type not supported"}, + {95, "ENOTSUP", "operation not supported"}, + {96, "EPFNOSUPPORT", "protocol family not supported"}, + {97, "EAFNOSUPPORT", "address family not supported by protocol"}, + {98, "EADDRINUSE", "address already in use"}, + {99, "EADDRNOTAVAIL", "cannot assign requested address"}, + {100, "ENETDOWN", "network is down"}, + {101, "ENETUNREACH", "network is unreachable"}, + {102, "ENETRESET", "network dropped connection on reset"}, + {103, "ECONNABORTED", "software caused connection abort"}, + {104, "ECONNRESET", "connection reset by peer"}, + {105, "ENOBUFS", "no buffer space available"}, + {106, "EISCONN", "transport endpoint is already connected"}, + {107, "ENOTCONN", "transport endpoint is not connected"}, + {108, "ESHUTDOWN", "cannot send after transport endpoint shutdown"}, + {109, "ETOOMANYREFS", "too many references: cannot splice"}, + {110, "ETIMEDOUT", "connection timed out"}, + {111, "ECONNREFUSED", "connection refused"}, + {112, "EHOSTDOWN", "host is down"}, + {113, "EHOSTUNREACH", "no route to host"}, + {114, "EALREADY", "operation already in progress"}, + {115, "EINPROGRESS", "operation now in progress"}, + {116, "ESTALE", "stale file handle"}, + {117, "EUCLEAN", "structure needs cleaning"}, + {118, "ENOTNAM", "not a XENIX named type file"}, + {119, "ENAVAIL", "no XENIX semaphores available"}, + {120, "EISNAM", "is a named type file"}, + {121, "EREMOTEIO", "remote I/O error"}, + {122, "EDQUOT", "disk quota exceeded"}, + {123, "ENOMEDIUM", "no medium found"}, + {124, "EMEDIUMTYPE", "wrong medium type"}, + {125, "ECANCELED", "operation canceled"}, + {126, "ENOKEY", "required key not available"}, + {127, "EKEYEXPIRED", "key has expired"}, + {128, "EKEYREVOKED", "key has been revoked"}, + {129, "EKEYREJECTED", "key was rejected by service"}, + {130, "EOWNERDEAD", "owner died"}, + {131, "ENOTRECOVERABLE", "state not recoverable"}, + {132, "ERFKILL", "operation not possible due to RF-kill"}, + {133, "EHWPOISON", "memory page has hardware error"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/breakpoint trap"}, + {6, "SIGABRT", "aborted"}, + {7, "SIGBUS", "bus error"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGUSR1", "user defined signal 1"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGUSR2", "user defined signal 2"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGSTKFLT", "stack fault"}, + {17, "SIGCHLD", "child exited"}, + {18, "SIGCONT", "continued"}, + {19, "SIGSTOP", "stopped (signal)"}, + {20, "SIGTSTP", "stopped"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGURG", "urgent I/O condition"}, + {24, "SIGXCPU", "CPU time limit exceeded"}, + {25, "SIGXFSZ", "file size limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window changed"}, + {29, "SIGIO", "I/O possible"}, + {30, "SIGPWR", "power failure"}, + {31, "SIGSYS", "bad system call"}, +} diff --git a/api/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go b/api/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go new file mode 100644 index 0000000..6ae0ac6 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go @@ -0,0 +1,2571 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go + +package unix + +import "syscall" + +const ( + AAFS_MAGIC = 0x5a3c69f0 + ADFS_SUPER_MAGIC = 0xadf5 + AFFS_SUPER_MAGIC = 0xadff + AFS_FS_MAGIC = 0x6b414653 + AFS_SUPER_MAGIC = 0x5346414f + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ANON_INODE_FS_MAGIC = 0x9041934 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + AUTOFS_SUPER_MAGIC = 0x187 + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BALLOON_KVM_MAGIC = 0x13661366 + BDEVFS_MAGIC = 0x62646576 + BINFMTFS_MAGIC = 0x42494e4d + BLKBSZGET = 0x80041270 + BLKBSZSET = 0x40041271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80041272 + BLKPBSZGET = 0x127b + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_FS_MAGIC = 0xcafe4a11 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + BTRFS_SUPER_MAGIC = 0x9123683e + BTRFS_TEST_MAGIC = 0x73727279 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CGROUP2_SUPER_MAGIC = 0x63677270 + CGROUP_SUPER_MAGIC = 0x27e0eb + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CODA_SUPER_MAGIC = 0x73757245 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRAMFS_MAGIC = 0x28cd3d45 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DAXFS_MAGIC = 0x64646178 + DEBUGFS_MAGIC = 0x64626720 + DEVPTS_SUPER_MAGIC = 0x1cd1 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + ECRYPTFS_SUPER_MAGIC = 0xf15f + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + EFIVARFS_MAGIC = 0xde5e81e4 + EFS_SUPER_MAGIC = 0x414a53 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXT2_SUPER_MAGIC = 0xef53 + EXT3_SUPER_MAGIC = 0xef53 + EXT4_SUPER_MAGIC = 0xef53 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + F2FS_SUPER_MAGIC = 0xf2f52010 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x1000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + FUTEXFS_SUPER_MAGIC = 0xbad1dea + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0xc + F_GETLK64 = 0xc + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0xd + F_SETLK64 = 0xd + F_SETLKW = 0xe + F_SETLKW64 = 0xe + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HOSTFS_SUPER_MAGIC = 0xc0ffee + HPFS_SUPER_MAGIC = 0xf995e849 + HUGETLBFS_MAGIC = 0x958458f6 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISOFS_SUPER_MAGIC = 0x9660 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + JFFS2_SUPER_MAGIC = 0x72b6 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x2000 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x4000 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MINIX2_SUPER_MAGIC = 0x2468 + MINIX2_SUPER_MAGIC2 = 0x2478 + MINIX3_SUPER_MAGIC = 0x4d5a + MINIX_SUPER_MAGIC = 0x137f + MINIX_SUPER_MAGIC2 = 0x138f + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSDOS_SUPER_MAGIC = 0x4d44 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + MTD_INODE_FS_MAGIC = 0x11307854 + NAME_MAX = 0xff + NCP_SUPER_MAGIC = 0x564c + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NFNETLINK_V0 = 0x0 + NFNLGRP_ACCT_QUOTA = 0x8 + NFNLGRP_CONNTRACK_DESTROY = 0x3 + NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 + NFNLGRP_CONNTRACK_EXP_NEW = 0x4 + NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 + NFNLGRP_CONNTRACK_NEW = 0x1 + NFNLGRP_CONNTRACK_UPDATE = 0x2 + NFNLGRP_MAX = 0x9 + NFNLGRP_NFTABLES = 0x7 + NFNLGRP_NFTRACE = 0x9 + NFNLGRP_NONE = 0x0 + NFNL_BATCH_MAX = 0x1 + NFNL_MSG_BATCH_BEGIN = 0x10 + NFNL_MSG_BATCH_END = 0x11 + NFNL_NFA_NEST = 0x8000 + NFNL_SUBSYS_ACCT = 0x7 + NFNL_SUBSYS_COUNT = 0xc + NFNL_SUBSYS_CTHELPER = 0x9 + NFNL_SUBSYS_CTNETLINK = 0x1 + NFNL_SUBSYS_CTNETLINK_EXP = 0x2 + NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 + NFNL_SUBSYS_IPSET = 0x6 + NFNL_SUBSYS_NFTABLES = 0xa + NFNL_SUBSYS_NFT_COMPAT = 0xb + NFNL_SUBSYS_NONE = 0x0 + NFNL_SUBSYS_OSF = 0x5 + NFNL_SUBSYS_QUEUE = 0x3 + NFNL_SUBSYS_ULOG = 0x4 + NFS_SUPER_MAGIC = 0x6969 + NILFS_SUPER_MAGIC = 0x3434 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + NSFS_MAGIC = 0x6e736673 + OCFS2_SUPER_MAGIC = 0x7461636f + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPENPROM_SUPER_MAGIC = 0x9fa1 + OPOST = 0x1 + OVERLAYFS_SUPER_MAGIC = 0x794c7630 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x10000 + O_DIRECTORY = 0x4000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x20000 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x8000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x404000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x2401 + PERF_EVENT_IOC_ENABLE = 0x2400 + PERF_EVENT_IOC_ID = 0x80042407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 + PERF_EVENT_IOC_PERIOD = 0x40082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc004240a + PERF_EVENT_IOC_REFRESH = 0x2402 + PERF_EVENT_IOC_RESET = 0x2403 + PERF_EVENT_IOC_SET_BPF = 0x40042408 + PERF_EVENT_IOC_SET_FILTER = 0x40042406 + PERF_EVENT_IOC_SET_OUTPUT = 0x2405 + PIPEFS_MAGIC = 0x50495045 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROC_SUPER_MAGIC = 0x9fa0 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PSTOREFS_MAGIC = 0x6165676c + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETCRUNCHREGS = 0x19 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFDPIC = 0x1f + PTRACE_GETFDPIC_EXEC = 0x0 + PTRACE_GETFDPIC_INTERP = 0x1 + PTRACE_GETFPREGS = 0xe + PTRACE_GETHBPREGS = 0x1d + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GETVFPREGS = 0x1b + PTRACE_GETWMMXREGS = 0x12 + PTRACE_GET_THREAD_AREA = 0x16 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETCRUNCHREGS = 0x1a + PTRACE_SETFPREGS = 0xf + PTRACE_SETHBPREGS = 0x1e + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SETVFPREGS = 0x1c + PTRACE_SETWMMXREGS = 0x13 + PTRACE_SET_SYSCALL = 0x17 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + PT_DATA_ADDR = 0x10004 + PT_TEXT_ADDR = 0x10000 + PT_TEXT_END_ADDR = 0x10008 + QNX4_SUPER_MAGIC = 0x2f + QNX6_SUPER_MAGIC = 0x68191122 + RAMFS_MAGIC = 0x858458f6 + RDTGROUP_SUPER_MAGIC = 0x7655821 + REISERFS_SUPER_MAGIC = 0x52654973 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SECURITYFS_MAGIC = 0x73636673 + SELINUX_MAGIC = 0xf97cff8c + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x541b + SIOCOUTQ = 0x5411 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMACK_MAGIC = 0x43415d53 + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SMB_SUPER_MAGIC = 0x517b + SOCKFS_MAGIC = 0x534f434b + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x10 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x11 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x12 + SO_RCVTIMEO = 0x14 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x13 + SO_SNDTIMEO = 0x15 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + SQUASHFS_MAGIC = 0x73717368 + STACK_END_MAGIC = 0x57ac6e9d + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + SYSFS_MAGIC = 0x62656572 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x540b + TCGETA = 0x5405 + TCGETS = 0x5401 + TCGETS2 = 0x802c542a + TCGETX = 0x5432 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSBRKP = 0x5425 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETS2 = 0x402c542b + TCSETSF = 0x5404 + TCSETSF2 = 0x402c542d + TCSETSW = 0x5403 + TCSETSW2 = 0x402c542c + TCSETX = 0x5433 + TCSETXF = 0x5434 + TCSETXW = 0x5435 + TCXONC = 0x540a + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x80045432 + TIOCGETD = 0x5424 + TIOCGEXCL = 0x80045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x540f + TIOCGPKT = 0x80045438 + TIOCGPTLCK = 0x80045439 + TIOCGPTN = 0x80045430 + TIOCGPTPEER = 0x5441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x5413 + TIOCINQ = 0x541b + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x5411 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x5423 + TIOCSIG = 0x40045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x5410 + TIOCSPTLCK = 0x40045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTI = 0x5412 + TIOCSWINSZ = 0x5414 + TIOCVHANGUP = 0x5437 + TMPFS_MAGIC = 0x1021994 + TOSTOP = 0x100 + TPACKET_ALIGNMENT = 0x10 + TPACKET_HDRLEN = 0x34 + TP_STATUS_AVAILABLE = 0x0 + TP_STATUS_BLK_TMO = 0x20 + TP_STATUS_COPY = 0x2 + TP_STATUS_CSUMNOTREADY = 0x8 + TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_KERNEL = 0x0 + TP_STATUS_LOSING = 0x4 + TP_STATUS_SENDING = 0x2 + TP_STATUS_SEND_REQUEST = 0x1 + TP_STATUS_TS_RAW_HARDWARE = -0x80000000 + TP_STATUS_TS_SOFTWARE = 0x20000000 + TP_STATUS_TS_SYS_HARDWARE = 0x40000000 + TP_STATUS_USER = 0x1 + TP_STATUS_VLAN_TPID_VALID = 0x40 + TP_STATUS_VLAN_VALID = 0x10 + TP_STATUS_WRONG_FORMAT = 0x4 + TRACEFS_MAGIC = 0x74726163 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x400854d5 + TUNDETACHFILTER = 0x400854d6 + TUNGETFEATURES = 0x800454cf + TUNGETFILTER = 0x800854db + TUNGETIFF = 0x800454d2 + TUNGETSNDBUF = 0x800454d3 + TUNGETVNETBE = 0x800454df + TUNGETVNETHDRSZ = 0x800454d7 + TUNGETVNETLE = 0x800454dd + TUNSETDEBUG = 0x400454c9 + TUNSETFILTEREBPF = 0x800454e1 + TUNSETGROUP = 0x400454ce + TUNSETIFF = 0x400454ca + TUNSETIFINDEX = 0x400454da + TUNSETLINK = 0x400454cd + TUNSETNOCSUM = 0x400454c8 + TUNSETOFFLOAD = 0x400454d0 + TUNSETOWNER = 0x400454cc + TUNSETPERSIST = 0x400454cb + TUNSETQUEUE = 0x400454d9 + TUNSETSNDBUF = 0x400454d4 + TUNSETSTEERINGEBPF = 0x800454e0 + TUNSETTXFILTER = 0x400454d1 + TUNSETVNETBE = 0x400454de + TUNSETVNETHDRSZ = 0x400454d8 + TUNSETVNETLE = 0x400454dc + UDF_SUPER_MAGIC = 0x15013346 + UMOUNT_NOFOLLOW = 0x8 + USBDEVICE_SUPER_MAGIC = 0x9fa2 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + V9FS_MAGIC = 0x1021997 + VDISCARD = 0xd + VEOF = 0x4 + VEOL = 0xb + VEOL2 = 0x10 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x6 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x80045702 + WDIOC_GETPRETIMEOUT = 0x80045709 + WDIOC_GETSTATUS = 0x80045701 + WDIOC_GETSUPPORT = 0x80285700 + WDIOC_GETTEMP = 0x80045703 + WDIOC_GETTIMELEFT = 0x8004570a + WDIOC_GETTIMEOUT = 0x80045707 + WDIOC_KEEPALIVE = 0x80045705 + WDIOC_SETOPTIONS = 0x80045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x20 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XENFS_SUPER_MAGIC = 0xabba1974 + XTABS = 0x1800 + ZSMALLOC_MAGIC = 0x58295829 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x62) + EADDRNOTAVAIL = syscall.Errno(0x63) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x61) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x72) + EBADE = syscall.Errno(0x34) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x4d) + EBADMSG = syscall.Errno(0x4a) + EBADR = syscall.Errno(0x35) + EBADRQC = syscall.Errno(0x38) + EBADSLT = syscall.Errno(0x39) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7d) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x2c) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x67) + ECONNREFUSED = syscall.Errno(0x6f) + ECONNRESET = syscall.Errno(0x68) + EDEADLK = syscall.Errno(0x23) + EDEADLOCK = syscall.Errno(0x23) + EDESTADDRREQ = syscall.Errno(0x59) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x7a) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x70) + EHOSTUNREACH = syscall.Errno(0x71) + EHWPOISON = syscall.Errno(0x85) + EIDRM = syscall.Errno(0x2b) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x73) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x6a) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x7f) + EKEYREJECTED = syscall.Errno(0x81) + EKEYREVOKED = syscall.Errno(0x80) + EL2HLT = syscall.Errno(0x33) + EL2NSYNC = syscall.Errno(0x2d) + EL3HLT = syscall.Errno(0x2e) + EL3RST = syscall.Errno(0x2f) + ELIBACC = syscall.Errno(0x4f) + ELIBBAD = syscall.Errno(0x50) + ELIBEXEC = syscall.Errno(0x53) + ELIBMAX = syscall.Errno(0x52) + ELIBSCN = syscall.Errno(0x51) + ELNRNG = syscall.Errno(0x30) + ELOOP = syscall.Errno(0x28) + EMEDIUMTYPE = syscall.Errno(0x7c) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x5a) + EMULTIHOP = syscall.Errno(0x48) + ENAMETOOLONG = syscall.Errno(0x24) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x64) + ENETRESET = syscall.Errno(0x66) + ENETUNREACH = syscall.Errno(0x65) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x37) + ENOBUFS = syscall.Errno(0x69) + ENOCSI = syscall.Errno(0x32) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x7e) + ENOLCK = syscall.Errno(0x25) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x7b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x2a) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x5c) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x26) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x6b) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x27) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x83) + ENOTSOCK = syscall.Errno(0x58) + ENOTSUP = syscall.Errno(0x5f) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x4c) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x5f) + EOVERFLOW = syscall.Errno(0x4b) + EOWNERDEAD = syscall.Errno(0x82) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x60) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x5d) + EPROTOTYPE = syscall.Errno(0x5b) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x4e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x55) + ERFKILL = syscall.Errno(0x84) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x6c) + ESOCKTNOSUPPORT = syscall.Errno(0x5e) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x74) + ESTRPIPE = syscall.Errno(0x56) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x6e) + ETOOMANYREFS = syscall.Errno(0x6d) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x31) + EUSERS = syscall.Errno(0x57) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x36) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0x7) + SIGCHLD = syscall.Signal(0x11) + SIGCLD = syscall.Signal(0x11) + SIGCONT = syscall.Signal(0x12) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x1d) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x1d) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1e) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTKFLT = syscall.Signal(0x10) + SIGSTOP = syscall.Signal(0x13) + SIGSYS = syscall.Signal(0x1f) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x14) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x17) + SIGUSR1 = syscall.Signal(0xa) + SIGUSR2 = syscall.Signal(0xc) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "no such device or address"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EAGAIN", "resource temporarily unavailable"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device or resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "invalid cross-device link"}, + {19, "ENODEV", "no such device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "numerical result out of range"}, + {35, "EDEADLK", "resource deadlock avoided"}, + {36, "ENAMETOOLONG", "file name too long"}, + {37, "ENOLCK", "no locks available"}, + {38, "ENOSYS", "function not implemented"}, + {39, "ENOTEMPTY", "directory not empty"}, + {40, "ELOOP", "too many levels of symbolic links"}, + {42, "ENOMSG", "no message of desired type"}, + {43, "EIDRM", "identifier removed"}, + {44, "ECHRNG", "channel number out of range"}, + {45, "EL2NSYNC", "level 2 not synchronized"}, + {46, "EL3HLT", "level 3 halted"}, + {47, "EL3RST", "level 3 reset"}, + {48, "ELNRNG", "link number out of range"}, + {49, "EUNATCH", "protocol driver not attached"}, + {50, "ENOCSI", "no CSI structure available"}, + {51, "EL2HLT", "level 2 halted"}, + {52, "EBADE", "invalid exchange"}, + {53, "EBADR", "invalid request descriptor"}, + {54, "EXFULL", "exchange full"}, + {55, "ENOANO", "no anode"}, + {56, "EBADRQC", "invalid request code"}, + {57, "EBADSLT", "invalid slot"}, + {59, "EBFONT", "bad font file format"}, + {60, "ENOSTR", "device not a stream"}, + {61, "ENODATA", "no data available"}, + {62, "ETIME", "timer expired"}, + {63, "ENOSR", "out of streams resources"}, + {64, "ENONET", "machine is not on the network"}, + {65, "ENOPKG", "package not installed"}, + {66, "EREMOTE", "object is remote"}, + {67, "ENOLINK", "link has been severed"}, + {68, "EADV", "advertise error"}, + {69, "ESRMNT", "srmount error"}, + {70, "ECOMM", "communication error on send"}, + {71, "EPROTO", "protocol error"}, + {72, "EMULTIHOP", "multihop attempted"}, + {73, "EDOTDOT", "RFS specific error"}, + {74, "EBADMSG", "bad message"}, + {75, "EOVERFLOW", "value too large for defined data type"}, + {76, "ENOTUNIQ", "name not unique on network"}, + {77, "EBADFD", "file descriptor in bad state"}, + {78, "EREMCHG", "remote address changed"}, + {79, "ELIBACC", "can not access a needed shared library"}, + {80, "ELIBBAD", "accessing a corrupted shared library"}, + {81, "ELIBSCN", ".lib section in a.out corrupted"}, + {82, "ELIBMAX", "attempting to link in too many shared libraries"}, + {83, "ELIBEXEC", "cannot exec a shared library directly"}, + {84, "EILSEQ", "invalid or incomplete multibyte or wide character"}, + {85, "ERESTART", "interrupted system call should be restarted"}, + {86, "ESTRPIPE", "streams pipe error"}, + {87, "EUSERS", "too many users"}, + {88, "ENOTSOCK", "socket operation on non-socket"}, + {89, "EDESTADDRREQ", "destination address required"}, + {90, "EMSGSIZE", "message too long"}, + {91, "EPROTOTYPE", "protocol wrong type for socket"}, + {92, "ENOPROTOOPT", "protocol not available"}, + {93, "EPROTONOSUPPORT", "protocol not supported"}, + {94, "ESOCKTNOSUPPORT", "socket type not supported"}, + {95, "ENOTSUP", "operation not supported"}, + {96, "EPFNOSUPPORT", "protocol family not supported"}, + {97, "EAFNOSUPPORT", "address family not supported by protocol"}, + {98, "EADDRINUSE", "address already in use"}, + {99, "EADDRNOTAVAIL", "cannot assign requested address"}, + {100, "ENETDOWN", "network is down"}, + {101, "ENETUNREACH", "network is unreachable"}, + {102, "ENETRESET", "network dropped connection on reset"}, + {103, "ECONNABORTED", "software caused connection abort"}, + {104, "ECONNRESET", "connection reset by peer"}, + {105, "ENOBUFS", "no buffer space available"}, + {106, "EISCONN", "transport endpoint is already connected"}, + {107, "ENOTCONN", "transport endpoint is not connected"}, + {108, "ESHUTDOWN", "cannot send after transport endpoint shutdown"}, + {109, "ETOOMANYREFS", "too many references: cannot splice"}, + {110, "ETIMEDOUT", "connection timed out"}, + {111, "ECONNREFUSED", "connection refused"}, + {112, "EHOSTDOWN", "host is down"}, + {113, "EHOSTUNREACH", "no route to host"}, + {114, "EALREADY", "operation already in progress"}, + {115, "EINPROGRESS", "operation now in progress"}, + {116, "ESTALE", "stale file handle"}, + {117, "EUCLEAN", "structure needs cleaning"}, + {118, "ENOTNAM", "not a XENIX named type file"}, + {119, "ENAVAIL", "no XENIX semaphores available"}, + {120, "EISNAM", "is a named type file"}, + {121, "EREMOTEIO", "remote I/O error"}, + {122, "EDQUOT", "disk quota exceeded"}, + {123, "ENOMEDIUM", "no medium found"}, + {124, "EMEDIUMTYPE", "wrong medium type"}, + {125, "ECANCELED", "operation canceled"}, + {126, "ENOKEY", "required key not available"}, + {127, "EKEYEXPIRED", "key has expired"}, + {128, "EKEYREVOKED", "key has been revoked"}, + {129, "EKEYREJECTED", "key was rejected by service"}, + {130, "EOWNERDEAD", "owner died"}, + {131, "ENOTRECOVERABLE", "state not recoverable"}, + {132, "ERFKILL", "operation not possible due to RF-kill"}, + {133, "EHWPOISON", "memory page has hardware error"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/breakpoint trap"}, + {6, "SIGABRT", "aborted"}, + {7, "SIGBUS", "bus error"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGUSR1", "user defined signal 1"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGUSR2", "user defined signal 2"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGSTKFLT", "stack fault"}, + {17, "SIGCHLD", "child exited"}, + {18, "SIGCONT", "continued"}, + {19, "SIGSTOP", "stopped (signal)"}, + {20, "SIGTSTP", "stopped"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGURG", "urgent I/O condition"}, + {24, "SIGXCPU", "CPU time limit exceeded"}, + {25, "SIGXFSZ", "file size limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window changed"}, + {29, "SIGIO", "I/O possible"}, + {30, "SIGPWR", "power failure"}, + {31, "SIGSYS", "bad system call"}, +} diff --git a/api/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go b/api/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go new file mode 100644 index 0000000..f58450b --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go @@ -0,0 +1,2556 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include -fsigned-char +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm64,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char _const.go + +package unix + +import "syscall" + +const ( + AAFS_MAGIC = 0x5a3c69f0 + ADFS_SUPER_MAGIC = 0xadf5 + AFFS_SUPER_MAGIC = 0xadff + AFS_FS_MAGIC = 0x6b414653 + AFS_SUPER_MAGIC = 0x5346414f + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ANON_INODE_FS_MAGIC = 0x9041934 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + AUTOFS_SUPER_MAGIC = 0x187 + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BALLOON_KVM_MAGIC = 0x13661366 + BDEVFS_MAGIC = 0x62646576 + BINFMTFS_MAGIC = 0x42494e4d + BLKBSZGET = 0x80081270 + BLKBSZSET = 0x40081271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80081272 + BLKPBSZGET = 0x127b + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_FS_MAGIC = 0xcafe4a11 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + BTRFS_SUPER_MAGIC = 0x9123683e + BTRFS_TEST_MAGIC = 0x73727279 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CGROUP2_SUPER_MAGIC = 0x63677270 + CGROUP_SUPER_MAGIC = 0x27e0eb + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CODA_SUPER_MAGIC = 0x73757245 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRAMFS_MAGIC = 0x28cd3d45 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DAXFS_MAGIC = 0x64646178 + DEBUGFS_MAGIC = 0x64626720 + DEVPTS_SUPER_MAGIC = 0x1cd1 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + ECRYPTFS_SUPER_MAGIC = 0xf15f + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + EFIVARFS_MAGIC = 0xde5e81e4 + EFS_SUPER_MAGIC = 0x414a53 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ESR_MAGIC = 0x45535201 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXT2_SUPER_MAGIC = 0xef53 + EXT3_SUPER_MAGIC = 0xef53 + EXT4_SUPER_MAGIC = 0xef53 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + EXTRA_MAGIC = 0x45585401 + F2FS_SUPER_MAGIC = 0xf2f52010 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x1000 + FPSIMD_MAGIC = 0x46508001 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + FUTEXFS_SUPER_MAGIC = 0xbad1dea + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x5 + F_GETLK64 = 0x5 + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HOSTFS_SUPER_MAGIC = 0xc0ffee + HPFS_SUPER_MAGIC = 0xf995e849 + HUGETLBFS_MAGIC = 0x958458f6 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISOFS_SUPER_MAGIC = 0x9660 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + JFFS2_SUPER_MAGIC = 0x72b6 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x2000 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x4000 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MINIX2_SUPER_MAGIC = 0x2468 + MINIX2_SUPER_MAGIC2 = 0x2478 + MINIX3_SUPER_MAGIC = 0x4d5a + MINIX_SUPER_MAGIC = 0x137f + MINIX_SUPER_MAGIC2 = 0x138f + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSDOS_SUPER_MAGIC = 0x4d44 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + MTD_INODE_FS_MAGIC = 0x11307854 + NAME_MAX = 0xff + NCP_SUPER_MAGIC = 0x564c + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NFNETLINK_V0 = 0x0 + NFNLGRP_ACCT_QUOTA = 0x8 + NFNLGRP_CONNTRACK_DESTROY = 0x3 + NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 + NFNLGRP_CONNTRACK_EXP_NEW = 0x4 + NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 + NFNLGRP_CONNTRACK_NEW = 0x1 + NFNLGRP_CONNTRACK_UPDATE = 0x2 + NFNLGRP_MAX = 0x9 + NFNLGRP_NFTABLES = 0x7 + NFNLGRP_NFTRACE = 0x9 + NFNLGRP_NONE = 0x0 + NFNL_BATCH_MAX = 0x1 + NFNL_MSG_BATCH_BEGIN = 0x10 + NFNL_MSG_BATCH_END = 0x11 + NFNL_NFA_NEST = 0x8000 + NFNL_SUBSYS_ACCT = 0x7 + NFNL_SUBSYS_COUNT = 0xc + NFNL_SUBSYS_CTHELPER = 0x9 + NFNL_SUBSYS_CTNETLINK = 0x1 + NFNL_SUBSYS_CTNETLINK_EXP = 0x2 + NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 + NFNL_SUBSYS_IPSET = 0x6 + NFNL_SUBSYS_NFTABLES = 0xa + NFNL_SUBSYS_NFT_COMPAT = 0xb + NFNL_SUBSYS_NONE = 0x0 + NFNL_SUBSYS_OSF = 0x5 + NFNL_SUBSYS_QUEUE = 0x3 + NFNL_SUBSYS_ULOG = 0x4 + NFS_SUPER_MAGIC = 0x6969 + NILFS_SUPER_MAGIC = 0x3434 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + NSFS_MAGIC = 0x6e736673 + OCFS2_SUPER_MAGIC = 0x7461636f + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPENPROM_SUPER_MAGIC = 0x9fa1 + OPOST = 0x1 + OVERLAYFS_SUPER_MAGIC = 0x794c7630 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x10000 + O_DIRECTORY = 0x4000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x8000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x404000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x2401 + PERF_EVENT_IOC_ENABLE = 0x2400 + PERF_EVENT_IOC_ID = 0x80082407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 + PERF_EVENT_IOC_PERIOD = 0x40082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc008240a + PERF_EVENT_IOC_REFRESH = 0x2402 + PERF_EVENT_IOC_RESET = 0x2403 + PERF_EVENT_IOC_SET_BPF = 0x40042408 + PERF_EVENT_IOC_SET_FILTER = 0x40082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x2405 + PIPEFS_MAGIC = 0x50495045 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROC_SUPER_MAGIC = 0x9fa0 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffffffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PSTOREFS_MAGIC = 0x6165676c + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + QNX4_SUPER_MAGIC = 0x2f + QNX6_SUPER_MAGIC = 0x68191122 + RAMFS_MAGIC = 0x858458f6 + RDTGROUP_SUPER_MAGIC = 0x7655821 + REISERFS_SUPER_MAGIC = 0x52654973 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SECURITYFS_MAGIC = 0x73636673 + SELINUX_MAGIC = 0xf97cff8c + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x541b + SIOCOUTQ = 0x5411 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMACK_MAGIC = 0x43415d53 + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SMB_SUPER_MAGIC = 0x517b + SOCKFS_MAGIC = 0x534f434b + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x10 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x11 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x12 + SO_RCVTIMEO = 0x14 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x13 + SO_SNDTIMEO = 0x15 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + SQUASHFS_MAGIC = 0x73717368 + STACK_END_MAGIC = 0x57ac6e9d + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + SVE_MAGIC = 0x53564501 + SYSFS_MAGIC = 0x62656572 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x540b + TCGETA = 0x5405 + TCGETS = 0x5401 + TCGETS2 = 0x802c542a + TCGETX = 0x5432 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSBRKP = 0x5425 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETS2 = 0x402c542b + TCSETSF = 0x5404 + TCSETSF2 = 0x402c542d + TCSETSW = 0x5403 + TCSETSW2 = 0x402c542c + TCSETX = 0x5433 + TCSETXF = 0x5434 + TCSETXW = 0x5435 + TCXONC = 0x540a + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x80045432 + TIOCGETD = 0x5424 + TIOCGEXCL = 0x80045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x540f + TIOCGPKT = 0x80045438 + TIOCGPTLCK = 0x80045439 + TIOCGPTN = 0x80045430 + TIOCGPTPEER = 0x5441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x5413 + TIOCINQ = 0x541b + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x5411 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x5423 + TIOCSIG = 0x40045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x5410 + TIOCSPTLCK = 0x40045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTI = 0x5412 + TIOCSWINSZ = 0x5414 + TIOCVHANGUP = 0x5437 + TMPFS_MAGIC = 0x1021994 + TOSTOP = 0x100 + TPACKET_ALIGNMENT = 0x10 + TPACKET_HDRLEN = 0x34 + TP_STATUS_AVAILABLE = 0x0 + TP_STATUS_BLK_TMO = 0x20 + TP_STATUS_COPY = 0x2 + TP_STATUS_CSUMNOTREADY = 0x8 + TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_KERNEL = 0x0 + TP_STATUS_LOSING = 0x4 + TP_STATUS_SENDING = 0x2 + TP_STATUS_SEND_REQUEST = 0x1 + TP_STATUS_TS_RAW_HARDWARE = -0x80000000 + TP_STATUS_TS_SOFTWARE = 0x20000000 + TP_STATUS_TS_SYS_HARDWARE = 0x40000000 + TP_STATUS_USER = 0x1 + TP_STATUS_VLAN_TPID_VALID = 0x40 + TP_STATUS_VLAN_VALID = 0x10 + TP_STATUS_WRONG_FORMAT = 0x4 + TRACEFS_MAGIC = 0x74726163 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x401054d5 + TUNDETACHFILTER = 0x401054d6 + TUNGETFEATURES = 0x800454cf + TUNGETFILTER = 0x801054db + TUNGETIFF = 0x800454d2 + TUNGETSNDBUF = 0x800454d3 + TUNGETVNETBE = 0x800454df + TUNGETVNETHDRSZ = 0x800454d7 + TUNGETVNETLE = 0x800454dd + TUNSETDEBUG = 0x400454c9 + TUNSETFILTEREBPF = 0x800454e1 + TUNSETGROUP = 0x400454ce + TUNSETIFF = 0x400454ca + TUNSETIFINDEX = 0x400454da + TUNSETLINK = 0x400454cd + TUNSETNOCSUM = 0x400454c8 + TUNSETOFFLOAD = 0x400454d0 + TUNSETOWNER = 0x400454cc + TUNSETPERSIST = 0x400454cb + TUNSETQUEUE = 0x400454d9 + TUNSETSNDBUF = 0x400454d4 + TUNSETSTEERINGEBPF = 0x800454e0 + TUNSETTXFILTER = 0x400454d1 + TUNSETVNETBE = 0x400454de + TUNSETVNETHDRSZ = 0x400454d8 + TUNSETVNETLE = 0x400454dc + UDF_SUPER_MAGIC = 0x15013346 + UMOUNT_NOFOLLOW = 0x8 + USBDEVICE_SUPER_MAGIC = 0x9fa2 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + V9FS_MAGIC = 0x1021997 + VDISCARD = 0xd + VEOF = 0x4 + VEOL = 0xb + VEOL2 = 0x10 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x6 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x80045702 + WDIOC_GETPRETIMEOUT = 0x80045709 + WDIOC_GETSTATUS = 0x80045701 + WDIOC_GETSUPPORT = 0x80285700 + WDIOC_GETTEMP = 0x80045703 + WDIOC_GETTIMELEFT = 0x8004570a + WDIOC_GETTIMEOUT = 0x80045707 + WDIOC_KEEPALIVE = 0x80045705 + WDIOC_SETOPTIONS = 0x80045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XENFS_SUPER_MAGIC = 0xabba1974 + XTABS = 0x1800 + ZSMALLOC_MAGIC = 0x58295829 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x62) + EADDRNOTAVAIL = syscall.Errno(0x63) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x61) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x72) + EBADE = syscall.Errno(0x34) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x4d) + EBADMSG = syscall.Errno(0x4a) + EBADR = syscall.Errno(0x35) + EBADRQC = syscall.Errno(0x38) + EBADSLT = syscall.Errno(0x39) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7d) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x2c) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x67) + ECONNREFUSED = syscall.Errno(0x6f) + ECONNRESET = syscall.Errno(0x68) + EDEADLK = syscall.Errno(0x23) + EDEADLOCK = syscall.Errno(0x23) + EDESTADDRREQ = syscall.Errno(0x59) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x7a) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x70) + EHOSTUNREACH = syscall.Errno(0x71) + EHWPOISON = syscall.Errno(0x85) + EIDRM = syscall.Errno(0x2b) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x73) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x6a) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x7f) + EKEYREJECTED = syscall.Errno(0x81) + EKEYREVOKED = syscall.Errno(0x80) + EL2HLT = syscall.Errno(0x33) + EL2NSYNC = syscall.Errno(0x2d) + EL3HLT = syscall.Errno(0x2e) + EL3RST = syscall.Errno(0x2f) + ELIBACC = syscall.Errno(0x4f) + ELIBBAD = syscall.Errno(0x50) + ELIBEXEC = syscall.Errno(0x53) + ELIBMAX = syscall.Errno(0x52) + ELIBSCN = syscall.Errno(0x51) + ELNRNG = syscall.Errno(0x30) + ELOOP = syscall.Errno(0x28) + EMEDIUMTYPE = syscall.Errno(0x7c) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x5a) + EMULTIHOP = syscall.Errno(0x48) + ENAMETOOLONG = syscall.Errno(0x24) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x64) + ENETRESET = syscall.Errno(0x66) + ENETUNREACH = syscall.Errno(0x65) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x37) + ENOBUFS = syscall.Errno(0x69) + ENOCSI = syscall.Errno(0x32) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x7e) + ENOLCK = syscall.Errno(0x25) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x7b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x2a) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x5c) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x26) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x6b) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x27) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x83) + ENOTSOCK = syscall.Errno(0x58) + ENOTSUP = syscall.Errno(0x5f) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x4c) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x5f) + EOVERFLOW = syscall.Errno(0x4b) + EOWNERDEAD = syscall.Errno(0x82) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x60) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x5d) + EPROTOTYPE = syscall.Errno(0x5b) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x4e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x55) + ERFKILL = syscall.Errno(0x84) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x6c) + ESOCKTNOSUPPORT = syscall.Errno(0x5e) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x74) + ESTRPIPE = syscall.Errno(0x56) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x6e) + ETOOMANYREFS = syscall.Errno(0x6d) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x31) + EUSERS = syscall.Errno(0x57) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x36) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0x7) + SIGCHLD = syscall.Signal(0x11) + SIGCLD = syscall.Signal(0x11) + SIGCONT = syscall.Signal(0x12) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x1d) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x1d) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1e) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTKFLT = syscall.Signal(0x10) + SIGSTOP = syscall.Signal(0x13) + SIGSYS = syscall.Signal(0x1f) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x14) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x17) + SIGUSR1 = syscall.Signal(0xa) + SIGUSR2 = syscall.Signal(0xc) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "no such device or address"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EAGAIN", "resource temporarily unavailable"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device or resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "invalid cross-device link"}, + {19, "ENODEV", "no such device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "numerical result out of range"}, + {35, "EDEADLK", "resource deadlock avoided"}, + {36, "ENAMETOOLONG", "file name too long"}, + {37, "ENOLCK", "no locks available"}, + {38, "ENOSYS", "function not implemented"}, + {39, "ENOTEMPTY", "directory not empty"}, + {40, "ELOOP", "too many levels of symbolic links"}, + {42, "ENOMSG", "no message of desired type"}, + {43, "EIDRM", "identifier removed"}, + {44, "ECHRNG", "channel number out of range"}, + {45, "EL2NSYNC", "level 2 not synchronized"}, + {46, "EL3HLT", "level 3 halted"}, + {47, "EL3RST", "level 3 reset"}, + {48, "ELNRNG", "link number out of range"}, + {49, "EUNATCH", "protocol driver not attached"}, + {50, "ENOCSI", "no CSI structure available"}, + {51, "EL2HLT", "level 2 halted"}, + {52, "EBADE", "invalid exchange"}, + {53, "EBADR", "invalid request descriptor"}, + {54, "EXFULL", "exchange full"}, + {55, "ENOANO", "no anode"}, + {56, "EBADRQC", "invalid request code"}, + {57, "EBADSLT", "invalid slot"}, + {59, "EBFONT", "bad font file format"}, + {60, "ENOSTR", "device not a stream"}, + {61, "ENODATA", "no data available"}, + {62, "ETIME", "timer expired"}, + {63, "ENOSR", "out of streams resources"}, + {64, "ENONET", "machine is not on the network"}, + {65, "ENOPKG", "package not installed"}, + {66, "EREMOTE", "object is remote"}, + {67, "ENOLINK", "link has been severed"}, + {68, "EADV", "advertise error"}, + {69, "ESRMNT", "srmount error"}, + {70, "ECOMM", "communication error on send"}, + {71, "EPROTO", "protocol error"}, + {72, "EMULTIHOP", "multihop attempted"}, + {73, "EDOTDOT", "RFS specific error"}, + {74, "EBADMSG", "bad message"}, + {75, "EOVERFLOW", "value too large for defined data type"}, + {76, "ENOTUNIQ", "name not unique on network"}, + {77, "EBADFD", "file descriptor in bad state"}, + {78, "EREMCHG", "remote address changed"}, + {79, "ELIBACC", "can not access a needed shared library"}, + {80, "ELIBBAD", "accessing a corrupted shared library"}, + {81, "ELIBSCN", ".lib section in a.out corrupted"}, + {82, "ELIBMAX", "attempting to link in too many shared libraries"}, + {83, "ELIBEXEC", "cannot exec a shared library directly"}, + {84, "EILSEQ", "invalid or incomplete multibyte or wide character"}, + {85, "ERESTART", "interrupted system call should be restarted"}, + {86, "ESTRPIPE", "streams pipe error"}, + {87, "EUSERS", "too many users"}, + {88, "ENOTSOCK", "socket operation on non-socket"}, + {89, "EDESTADDRREQ", "destination address required"}, + {90, "EMSGSIZE", "message too long"}, + {91, "EPROTOTYPE", "protocol wrong type for socket"}, + {92, "ENOPROTOOPT", "protocol not available"}, + {93, "EPROTONOSUPPORT", "protocol not supported"}, + {94, "ESOCKTNOSUPPORT", "socket type not supported"}, + {95, "ENOTSUP", "operation not supported"}, + {96, "EPFNOSUPPORT", "protocol family not supported"}, + {97, "EAFNOSUPPORT", "address family not supported by protocol"}, + {98, "EADDRINUSE", "address already in use"}, + {99, "EADDRNOTAVAIL", "cannot assign requested address"}, + {100, "ENETDOWN", "network is down"}, + {101, "ENETUNREACH", "network is unreachable"}, + {102, "ENETRESET", "network dropped connection on reset"}, + {103, "ECONNABORTED", "software caused connection abort"}, + {104, "ECONNRESET", "connection reset by peer"}, + {105, "ENOBUFS", "no buffer space available"}, + {106, "EISCONN", "transport endpoint is already connected"}, + {107, "ENOTCONN", "transport endpoint is not connected"}, + {108, "ESHUTDOWN", "cannot send after transport endpoint shutdown"}, + {109, "ETOOMANYREFS", "too many references: cannot splice"}, + {110, "ETIMEDOUT", "connection timed out"}, + {111, "ECONNREFUSED", "connection refused"}, + {112, "EHOSTDOWN", "host is down"}, + {113, "EHOSTUNREACH", "no route to host"}, + {114, "EALREADY", "operation already in progress"}, + {115, "EINPROGRESS", "operation now in progress"}, + {116, "ESTALE", "stale file handle"}, + {117, "EUCLEAN", "structure needs cleaning"}, + {118, "ENOTNAM", "not a XENIX named type file"}, + {119, "ENAVAIL", "no XENIX semaphores available"}, + {120, "EISNAM", "is a named type file"}, + {121, "EREMOTEIO", "remote I/O error"}, + {122, "EDQUOT", "disk quota exceeded"}, + {123, "ENOMEDIUM", "no medium found"}, + {124, "EMEDIUMTYPE", "wrong medium type"}, + {125, "ECANCELED", "operation canceled"}, + {126, "ENOKEY", "required key not available"}, + {127, "EKEYEXPIRED", "key has expired"}, + {128, "EKEYREVOKED", "key has been revoked"}, + {129, "EKEYREJECTED", "key was rejected by service"}, + {130, "EOWNERDEAD", "owner died"}, + {131, "ENOTRECOVERABLE", "state not recoverable"}, + {132, "ERFKILL", "operation not possible due to RF-kill"}, + {133, "EHWPOISON", "memory page has hardware error"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/breakpoint trap"}, + {6, "SIGABRT", "aborted"}, + {7, "SIGBUS", "bus error"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGUSR1", "user defined signal 1"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGUSR2", "user defined signal 2"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGSTKFLT", "stack fault"}, + {17, "SIGCHLD", "child exited"}, + {18, "SIGCONT", "continued"}, + {19, "SIGSTOP", "stopped (signal)"}, + {20, "SIGTSTP", "stopped"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGURG", "urgent I/O condition"}, + {24, "SIGXCPU", "CPU time limit exceeded"}, + {25, "SIGXFSZ", "file size limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window changed"}, + {29, "SIGIO", "I/O possible"}, + {30, "SIGPWR", "power failure"}, + {31, "SIGSYS", "bad system call"}, +} diff --git a/api/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go b/api/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go new file mode 100644 index 0000000..465ff2f --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go @@ -0,0 +1,2573 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mips,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go + +package unix + +import "syscall" + +const ( + AAFS_MAGIC = 0x5a3c69f0 + ADFS_SUPER_MAGIC = 0xadf5 + AFFS_SUPER_MAGIC = 0xadff + AFS_FS_MAGIC = 0x6b414653 + AFS_SUPER_MAGIC = 0x5346414f + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ANON_INODE_FS_MAGIC = 0x9041934 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + AUTOFS_SUPER_MAGIC = 0x187 + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BALLOON_KVM_MAGIC = 0x13661366 + BDEVFS_MAGIC = 0x62646576 + BINFMTFS_MAGIC = 0x42494e4d + BLKBSZGET = 0x40041270 + BLKBSZSET = 0x80041271 + BLKFLSBUF = 0x20001261 + BLKFRAGET = 0x20001265 + BLKFRASET = 0x20001264 + BLKGETSIZE = 0x20001260 + BLKGETSIZE64 = 0x40041272 + BLKPBSZGET = 0x2000127b + BLKRAGET = 0x20001263 + BLKRASET = 0x20001262 + BLKROGET = 0x2000125e + BLKROSET = 0x2000125d + BLKRRPART = 0x2000125f + BLKSECTGET = 0x20001267 + BLKSECTSET = 0x20001266 + BLKSSZGET = 0x20001268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_FS_MAGIC = 0xcafe4a11 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + BTRFS_SUPER_MAGIC = 0x9123683e + BTRFS_TEST_MAGIC = 0x73727279 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CGROUP2_SUPER_MAGIC = 0x63677270 + CGROUP_SUPER_MAGIC = 0x27e0eb + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CODA_SUPER_MAGIC = 0x73757245 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRAMFS_MAGIC = 0x28cd3d45 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DAXFS_MAGIC = 0x64646178 + DEBUGFS_MAGIC = 0x64626720 + DEVPTS_SUPER_MAGIC = 0x1cd1 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + ECRYPTFS_SUPER_MAGIC = 0xf15f + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x80 + EFD_SEMAPHORE = 0x1 + EFIVARFS_MAGIC = 0xde5e81e4 + EFS_SUPER_MAGIC = 0x414a53 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXT2_SUPER_MAGIC = 0xef53 + EXT3_SUPER_MAGIC = 0xef53 + EXT4_SUPER_MAGIC = 0xef53 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + F2FS_SUPER_MAGIC = 0xf2f52010 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x2000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + FUTEXFS_SUPER_MAGIC = 0xbad1dea + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x21 + F_GETLK64 = 0x21 + F_GETOWN = 0x17 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x22 + F_SETLK64 = 0x22 + F_SETLKW = 0x23 + F_SETLKW64 = 0x23 + F_SETOWN = 0x18 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HOSTFS_SUPER_MAGIC = 0xc0ffee + HPFS_SUPER_MAGIC = 0xf995e849 + HUGETLBFS_MAGIC = 0x958458f6 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x100 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x80 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISOFS_SUPER_MAGIC = 0x9660 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + JFFS2_SUPER_MAGIC = 0x72b6 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_ANON = 0x800 + MAP_ANONYMOUS = 0x800 + MAP_DENYWRITE = 0x2000 + MAP_EXECUTABLE = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x1000 + MAP_HUGETLB = 0x80000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x8000 + MAP_NONBLOCK = 0x20000 + MAP_NORESERVE = 0x400 + MAP_POPULATE = 0x10000 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x800 + MAP_SHARED = 0x1 + MAP_STACK = 0x40000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MINIX2_SUPER_MAGIC = 0x2468 + MINIX2_SUPER_MAGIC2 = 0x2478 + MINIX3_SUPER_MAGIC = 0x4d5a + MINIX_SUPER_MAGIC = 0x137f + MINIX_SUPER_MAGIC2 = 0x138f + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSDOS_SUPER_MAGIC = 0x4d44 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + MTD_INODE_FS_MAGIC = 0x11307854 + NAME_MAX = 0xff + NCP_SUPER_MAGIC = 0x564c + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NFNETLINK_V0 = 0x0 + NFNLGRP_ACCT_QUOTA = 0x8 + NFNLGRP_CONNTRACK_DESTROY = 0x3 + NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 + NFNLGRP_CONNTRACK_EXP_NEW = 0x4 + NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 + NFNLGRP_CONNTRACK_NEW = 0x1 + NFNLGRP_CONNTRACK_UPDATE = 0x2 + NFNLGRP_MAX = 0x9 + NFNLGRP_NFTABLES = 0x7 + NFNLGRP_NFTRACE = 0x9 + NFNLGRP_NONE = 0x0 + NFNL_BATCH_MAX = 0x1 + NFNL_MSG_BATCH_BEGIN = 0x10 + NFNL_MSG_BATCH_END = 0x11 + NFNL_NFA_NEST = 0x8000 + NFNL_SUBSYS_ACCT = 0x7 + NFNL_SUBSYS_COUNT = 0xc + NFNL_SUBSYS_CTHELPER = 0x9 + NFNL_SUBSYS_CTNETLINK = 0x1 + NFNL_SUBSYS_CTNETLINK_EXP = 0x2 + NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 + NFNL_SUBSYS_IPSET = 0x6 + NFNL_SUBSYS_NFTABLES = 0xa + NFNL_SUBSYS_NFT_COMPAT = 0xb + NFNL_SUBSYS_NONE = 0x0 + NFNL_SUBSYS_OSF = 0x5 + NFNL_SUBSYS_QUEUE = 0x3 + NFNL_SUBSYS_ULOG = 0x4 + NFS_SUPER_MAGIC = 0x6969 + NILFS_SUPER_MAGIC = 0x3434 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + NSFS_MAGIC = 0x6e736673 + OCFS2_SUPER_MAGIC = 0x7461636f + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPENPROM_SUPER_MAGIC = 0x9fa1 + OPOST = 0x1 + OVERLAYFS_SUPER_MAGIC = 0x794c7630 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x1000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x100 + O_DIRECT = 0x8000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x10 + O_EXCL = 0x400 + O_FSYNC = 0x4010 + O_LARGEFILE = 0x2000 + O_NDELAY = 0x80 + O_NOATIME = 0x40000 + O_NOCTTY = 0x800 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x80 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x4010 + O_SYNC = 0x4010 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x20002401 + PERF_EVENT_IOC_ENABLE = 0x20002400 + PERF_EVENT_IOC_ID = 0x40042407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 + PERF_EVENT_IOC_PERIOD = 0x80082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc004240a + PERF_EVENT_IOC_REFRESH = 0x20002402 + PERF_EVENT_IOC_RESET = 0x20002403 + PERF_EVENT_IOC_SET_BPF = 0x80042408 + PERF_EVENT_IOC_SET_FILTER = 0x80042406 + PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 + PIPEFS_MAGIC = 0x50495045 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROC_SUPER_MAGIC = 0x9fa0 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PSTOREFS_MAGIC = 0x6165676c + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_GET_THREAD_AREA_3264 = 0xc4 + PTRACE_GET_WATCH_REGS = 0xd0 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKDATA_3264 = 0xc1 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKTEXT_3264 = 0xc0 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKEDATA_3264 = 0xc3 + PTRACE_POKETEXT = 0x4 + PTRACE_POKETEXT_3264 = 0xc2 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SET_WATCH_REGS = 0xd1 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + QNX4_SUPER_MAGIC = 0x2f + QNX6_SUPER_MAGIC = 0x68191122 + RAMFS_MAGIC = 0x858458f6 + RDTGROUP_SUPER_MAGIC = 0x7655821 + REISERFS_SUPER_MAGIC = 0x52654973 + RLIMIT_AS = 0x6 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x9 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x5 + RLIMIT_NPROC = 0x8 + RLIMIT_RSS = 0x7 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SECURITYFS_MAGIC = 0x73636673 + SELINUX_MAGIC = 0xf97cff8c + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x40047307 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x40047309 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x467f + SIOCOUTQ = 0x7472 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x80047308 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMACK_MAGIC = 0x43415d53 + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SMB_SUPER_MAGIC = 0x517b + SOCKFS_MAGIC = 0x534f434b + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x1 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x80 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x2 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0xffff + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1009 + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x20 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x1029 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0x100 + SO_PASSCRED = 0x11 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x12 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1e + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x1028 + SO_RCVBUF = 0x1002 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x1001 + SO_SNDBUFFORCE = 0x1f + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_STYLE = 0x1008 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x1008 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + SQUASHFS_MAGIC = 0x73717368 + STACK_END_MAGIC = 0x57ac6e9d + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + SYSFS_MAGIC = 0x62656572 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x5407 + TCGETA = 0x5401 + TCGETS = 0x540d + TCGETS2 = 0x4030542a + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x5410 + TCSBRK = 0x5405 + TCSBRKP = 0x5486 + TCSETA = 0x5402 + TCSETAF = 0x5404 + TCSETAW = 0x5403 + TCSETS = 0x540e + TCSETS2 = 0x8030542b + TCSETSF = 0x5410 + TCSETSF2 = 0x8030542d + TCSETSW = 0x540f + TCSETSW2 = 0x8030542c + TCXONC = 0x5406 + TIOCCBRK = 0x5428 + TIOCCONS = 0x80047478 + TIOCEXCL = 0x740d + TIOCGDEV = 0x40045432 + TIOCGETD = 0x7400 + TIOCGETP = 0x7408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x5492 + TIOCGLCKTRMIOS = 0x548b + TIOCGLTC = 0x7474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGPTPEER = 0x20005441 + TIOCGRS485 = 0x4020542e + TIOCGSERIAL = 0x5484 + TIOCGSID = 0x7416 + TIOCGSOFTCAR = 0x5481 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x467f + TIOCLINUX = 0x5483 + TIOCMBIC = 0x741c + TIOCMBIS = 0x741b + TIOCMGET = 0x741d + TIOCMIWAIT = 0x5491 + TIOCMSET = 0x741a + TIOCM_CAR = 0x100 + TIOCM_CD = 0x100 + TIOCM_CTS = 0x40 + TIOCM_DSR = 0x400 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x200 + TIOCM_RNG = 0x200 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x20 + TIOCM_ST = 0x10 + TIOCNOTTY = 0x5471 + TIOCNXCL = 0x740e + TIOCOUTQ = 0x7472 + TIOCPKT = 0x5470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x5480 + TIOCSERCONFIG = 0x5488 + TIOCSERGETLSR = 0x548e + TIOCSERGETMULTI = 0x548f + TIOCSERGSTRUCT = 0x548d + TIOCSERGWILD = 0x5489 + TIOCSERSETMULTI = 0x5490 + TIOCSERSWILD = 0x548a + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x7401 + TIOCSETN = 0x740a + TIOCSETP = 0x7409 + TIOCSIG = 0x80045436 + TIOCSLCKTRMIOS = 0x548c + TIOCSLTC = 0x7475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0xc020542f + TIOCSSERIAL = 0x5485 + TIOCSSOFTCAR = 0x5482 + TIOCSTI = 0x5472 + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TMPFS_MAGIC = 0x1021994 + TOSTOP = 0x8000 + TPACKET_ALIGNMENT = 0x10 + TPACKET_HDRLEN = 0x34 + TP_STATUS_AVAILABLE = 0x0 + TP_STATUS_BLK_TMO = 0x20 + TP_STATUS_COPY = 0x2 + TP_STATUS_CSUMNOTREADY = 0x8 + TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_KERNEL = 0x0 + TP_STATUS_LOSING = 0x4 + TP_STATUS_SENDING = 0x2 + TP_STATUS_SEND_REQUEST = 0x1 + TP_STATUS_TS_RAW_HARDWARE = -0x80000000 + TP_STATUS_TS_SOFTWARE = 0x20000000 + TP_STATUS_TS_SYS_HARDWARE = 0x40000000 + TP_STATUS_USER = 0x1 + TP_STATUS_VLAN_TPID_VALID = 0x40 + TP_STATUS_VLAN_VALID = 0x10 + TP_STATUS_WRONG_FORMAT = 0x4 + TRACEFS_MAGIC = 0x74726163 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x800854d5 + TUNDETACHFILTER = 0x800854d6 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x400854db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETDEBUG = 0x800454c9 + TUNSETFILTEREBPF = 0x400454e1 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETSTEERINGEBPF = 0x400454e0 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + UDF_SUPER_MAGIC = 0x15013346 + UMOUNT_NOFOLLOW = 0x8 + USBDEVICE_SUPER_MAGIC = 0x9fa2 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + V9FS_MAGIC = 0x1021997 + VDISCARD = 0xd + VEOF = 0x10 + VEOL = 0x11 + VEOL2 = 0x6 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x4 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VSWTCH = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x40045702 + WDIOC_GETPRETIMEOUT = 0x40045709 + WDIOC_GETSTATUS = 0x40045701 + WDIOC_GETSUPPORT = 0x40285700 + WDIOC_GETTEMP = 0x40045703 + WDIOC_GETTIMELEFT = 0x4004570a + WDIOC_GETTIMEOUT = 0x40045707 + WDIOC_KEEPALIVE = 0x40045705 + WDIOC_SETOPTIONS = 0x40045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x20 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XENFS_SUPER_MAGIC = 0xabba1974 + XTABS = 0x1800 + ZSMALLOC_MAGIC = 0x58295829 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x7d) + EADDRNOTAVAIL = syscall.Errno(0x7e) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x7c) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x95) + EBADE = syscall.Errno(0x32) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x51) + EBADMSG = syscall.Errno(0x4d) + EBADR = syscall.Errno(0x33) + EBADRQC = syscall.Errno(0x36) + EBADSLT = syscall.Errno(0x37) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x9e) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x25) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x82) + ECONNREFUSED = syscall.Errno(0x92) + ECONNRESET = syscall.Errno(0x83) + EDEADLK = syscall.Errno(0x2d) + EDEADLOCK = syscall.Errno(0x38) + EDESTADDRREQ = syscall.Errno(0x60) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x46d) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x93) + EHOSTUNREACH = syscall.Errno(0x94) + EHWPOISON = syscall.Errno(0xa8) + EIDRM = syscall.Errno(0x24) + EILSEQ = syscall.Errno(0x58) + EINIT = syscall.Errno(0x8d) + EINPROGRESS = syscall.Errno(0x96) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x85) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x8b) + EKEYEXPIRED = syscall.Errno(0xa2) + EKEYREJECTED = syscall.Errno(0xa4) + EKEYREVOKED = syscall.Errno(0xa3) + EL2HLT = syscall.Errno(0x2c) + EL2NSYNC = syscall.Errno(0x26) + EL3HLT = syscall.Errno(0x27) + EL3RST = syscall.Errno(0x28) + ELIBACC = syscall.Errno(0x53) + ELIBBAD = syscall.Errno(0x54) + ELIBEXEC = syscall.Errno(0x57) + ELIBMAX = syscall.Errno(0x56) + ELIBSCN = syscall.Errno(0x55) + ELNRNG = syscall.Errno(0x29) + ELOOP = syscall.Errno(0x5a) + EMEDIUMTYPE = syscall.Errno(0xa0) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x61) + EMULTIHOP = syscall.Errno(0x4a) + ENAMETOOLONG = syscall.Errno(0x4e) + ENAVAIL = syscall.Errno(0x8a) + ENETDOWN = syscall.Errno(0x7f) + ENETRESET = syscall.Errno(0x81) + ENETUNREACH = syscall.Errno(0x80) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x35) + ENOBUFS = syscall.Errno(0x84) + ENOCSI = syscall.Errno(0x2b) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0xa1) + ENOLCK = syscall.Errno(0x2e) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x9f) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x23) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x63) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x59) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x86) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x5d) + ENOTNAM = syscall.Errno(0x89) + ENOTRECOVERABLE = syscall.Errno(0xa6) + ENOTSOCK = syscall.Errno(0x5f) + ENOTSUP = syscall.Errno(0x7a) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x50) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x7a) + EOVERFLOW = syscall.Errno(0x4f) + EOWNERDEAD = syscall.Errno(0xa5) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x7b) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x78) + EPROTOTYPE = syscall.Errno(0x62) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x52) + EREMDEV = syscall.Errno(0x8e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x8c) + ERESTART = syscall.Errno(0x5b) + ERFKILL = syscall.Errno(0xa7) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x8f) + ESOCKTNOSUPPORT = syscall.Errno(0x79) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x97) + ESTRPIPE = syscall.Errno(0x5c) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x91) + ETOOMANYREFS = syscall.Errno(0x90) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x87) + EUNATCH = syscall.Errno(0x2a) + EUSERS = syscall.Errno(0x5e) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x34) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x12) + SIGCLD = syscall.Signal(0x12) + SIGCONT = syscall.Signal(0x19) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x16) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x16) + SIGPROF = syscall.Signal(0x1d) + SIGPWR = syscall.Signal(0x13) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x17) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x18) + SIGTTIN = syscall.Signal(0x1a) + SIGTTOU = syscall.Signal(0x1b) + SIGURG = syscall.Signal(0x15) + SIGUSR1 = syscall.Signal(0x10) + SIGUSR2 = syscall.Signal(0x11) + SIGVTALRM = syscall.Signal(0x1c) + SIGWINCH = syscall.Signal(0x14) + SIGXCPU = syscall.Signal(0x1e) + SIGXFSZ = syscall.Signal(0x1f) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "no such device or address"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EAGAIN", "resource temporarily unavailable"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device or resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "invalid cross-device link"}, + {19, "ENODEV", "no such device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "numerical result out of range"}, + {35, "ENOMSG", "no message of desired type"}, + {36, "EIDRM", "identifier removed"}, + {37, "ECHRNG", "channel number out of range"}, + {38, "EL2NSYNC", "level 2 not synchronized"}, + {39, "EL3HLT", "level 3 halted"}, + {40, "EL3RST", "level 3 reset"}, + {41, "ELNRNG", "link number out of range"}, + {42, "EUNATCH", "protocol driver not attached"}, + {43, "ENOCSI", "no CSI structure available"}, + {44, "EL2HLT", "level 2 halted"}, + {45, "EDEADLK", "resource deadlock avoided"}, + {46, "ENOLCK", "no locks available"}, + {50, "EBADE", "invalid exchange"}, + {51, "EBADR", "invalid request descriptor"}, + {52, "EXFULL", "exchange full"}, + {53, "ENOANO", "no anode"}, + {54, "EBADRQC", "invalid request code"}, + {55, "EBADSLT", "invalid slot"}, + {56, "EDEADLOCK", "file locking deadlock error"}, + {59, "EBFONT", "bad font file format"}, + {60, "ENOSTR", "device not a stream"}, + {61, "ENODATA", "no data available"}, + {62, "ETIME", "timer expired"}, + {63, "ENOSR", "out of streams resources"}, + {64, "ENONET", "machine is not on the network"}, + {65, "ENOPKG", "package not installed"}, + {66, "EREMOTE", "object is remote"}, + {67, "ENOLINK", "link has been severed"}, + {68, "EADV", "advertise error"}, + {69, "ESRMNT", "srmount error"}, + {70, "ECOMM", "communication error on send"}, + {71, "EPROTO", "protocol error"}, + {73, "EDOTDOT", "RFS specific error"}, + {74, "EMULTIHOP", "multihop attempted"}, + {77, "EBADMSG", "bad message"}, + {78, "ENAMETOOLONG", "file name too long"}, + {79, "EOVERFLOW", "value too large for defined data type"}, + {80, "ENOTUNIQ", "name not unique on network"}, + {81, "EBADFD", "file descriptor in bad state"}, + {82, "EREMCHG", "remote address changed"}, + {83, "ELIBACC", "can not access a needed shared library"}, + {84, "ELIBBAD", "accessing a corrupted shared library"}, + {85, "ELIBSCN", ".lib section in a.out corrupted"}, + {86, "ELIBMAX", "attempting to link in too many shared libraries"}, + {87, "ELIBEXEC", "cannot exec a shared library directly"}, + {88, "EILSEQ", "invalid or incomplete multibyte or wide character"}, + {89, "ENOSYS", "function not implemented"}, + {90, "ELOOP", "too many levels of symbolic links"}, + {91, "ERESTART", "interrupted system call should be restarted"}, + {92, "ESTRPIPE", "streams pipe error"}, + {93, "ENOTEMPTY", "directory not empty"}, + {94, "EUSERS", "too many users"}, + {95, "ENOTSOCK", "socket operation on non-socket"}, + {96, "EDESTADDRREQ", "destination address required"}, + {97, "EMSGSIZE", "message too long"}, + {98, "EPROTOTYPE", "protocol wrong type for socket"}, + {99, "ENOPROTOOPT", "protocol not available"}, + {120, "EPROTONOSUPPORT", "protocol not supported"}, + {121, "ESOCKTNOSUPPORT", "socket type not supported"}, + {122, "ENOTSUP", "operation not supported"}, + {123, "EPFNOSUPPORT", "protocol family not supported"}, + {124, "EAFNOSUPPORT", "address family not supported by protocol"}, + {125, "EADDRINUSE", "address already in use"}, + {126, "EADDRNOTAVAIL", "cannot assign requested address"}, + {127, "ENETDOWN", "network is down"}, + {128, "ENETUNREACH", "network is unreachable"}, + {129, "ENETRESET", "network dropped connection on reset"}, + {130, "ECONNABORTED", "software caused connection abort"}, + {131, "ECONNRESET", "connection reset by peer"}, + {132, "ENOBUFS", "no buffer space available"}, + {133, "EISCONN", "transport endpoint is already connected"}, + {134, "ENOTCONN", "transport endpoint is not connected"}, + {135, "EUCLEAN", "structure needs cleaning"}, + {137, "ENOTNAM", "not a XENIX named type file"}, + {138, "ENAVAIL", "no XENIX semaphores available"}, + {139, "EISNAM", "is a named type file"}, + {140, "EREMOTEIO", "remote I/O error"}, + {141, "EINIT", "unknown error 141"}, + {142, "EREMDEV", "unknown error 142"}, + {143, "ESHUTDOWN", "cannot send after transport endpoint shutdown"}, + {144, "ETOOMANYREFS", "too many references: cannot splice"}, + {145, "ETIMEDOUT", "connection timed out"}, + {146, "ECONNREFUSED", "connection refused"}, + {147, "EHOSTDOWN", "host is down"}, + {148, "EHOSTUNREACH", "no route to host"}, + {149, "EALREADY", "operation already in progress"}, + {150, "EINPROGRESS", "operation now in progress"}, + {151, "ESTALE", "stale file handle"}, + {158, "ECANCELED", "operation canceled"}, + {159, "ENOMEDIUM", "no medium found"}, + {160, "EMEDIUMTYPE", "wrong medium type"}, + {161, "ENOKEY", "required key not available"}, + {162, "EKEYEXPIRED", "key has expired"}, + {163, "EKEYREVOKED", "key has been revoked"}, + {164, "EKEYREJECTED", "key was rejected by service"}, + {165, "EOWNERDEAD", "owner died"}, + {166, "ENOTRECOVERABLE", "state not recoverable"}, + {167, "ERFKILL", "operation not possible due to RF-kill"}, + {168, "EHWPOISON", "memory page has hardware error"}, + {1133, "EDQUOT", "disk quota exceeded"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/breakpoint trap"}, + {6, "SIGABRT", "aborted"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGUSR1", "user defined signal 1"}, + {17, "SIGUSR2", "user defined signal 2"}, + {18, "SIGCHLD", "child exited"}, + {19, "SIGPWR", "power failure"}, + {20, "SIGWINCH", "window changed"}, + {21, "SIGURG", "urgent I/O condition"}, + {22, "SIGIO", "I/O possible"}, + {23, "SIGSTOP", "stopped (signal)"}, + {24, "SIGTSTP", "stopped"}, + {25, "SIGCONT", "continued"}, + {26, "SIGTTIN", "stopped (tty input)"}, + {27, "SIGTTOU", "stopped (tty output)"}, + {28, "SIGVTALRM", "virtual timer expired"}, + {29, "SIGPROF", "profiling timer expired"}, + {30, "SIGXCPU", "CPU time limit exceeded"}, + {31, "SIGXFSZ", "file size limit exceeded"}, +} diff --git a/api/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go b/api/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go new file mode 100644 index 0000000..37e851a --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go @@ -0,0 +1,2573 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mips64,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go + +package unix + +import "syscall" + +const ( + AAFS_MAGIC = 0x5a3c69f0 + ADFS_SUPER_MAGIC = 0xadf5 + AFFS_SUPER_MAGIC = 0xadff + AFS_FS_MAGIC = 0x6b414653 + AFS_SUPER_MAGIC = 0x5346414f + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ANON_INODE_FS_MAGIC = 0x9041934 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + AUTOFS_SUPER_MAGIC = 0x187 + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BALLOON_KVM_MAGIC = 0x13661366 + BDEVFS_MAGIC = 0x62646576 + BINFMTFS_MAGIC = 0x42494e4d + BLKBSZGET = 0x40081270 + BLKBSZSET = 0x80081271 + BLKFLSBUF = 0x20001261 + BLKFRAGET = 0x20001265 + BLKFRASET = 0x20001264 + BLKGETSIZE = 0x20001260 + BLKGETSIZE64 = 0x40081272 + BLKPBSZGET = 0x2000127b + BLKRAGET = 0x20001263 + BLKRASET = 0x20001262 + BLKROGET = 0x2000125e + BLKROSET = 0x2000125d + BLKRRPART = 0x2000125f + BLKSECTGET = 0x20001267 + BLKSECTSET = 0x20001266 + BLKSSZGET = 0x20001268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_FS_MAGIC = 0xcafe4a11 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + BTRFS_SUPER_MAGIC = 0x9123683e + BTRFS_TEST_MAGIC = 0x73727279 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CGROUP2_SUPER_MAGIC = 0x63677270 + CGROUP_SUPER_MAGIC = 0x27e0eb + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CODA_SUPER_MAGIC = 0x73757245 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRAMFS_MAGIC = 0x28cd3d45 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DAXFS_MAGIC = 0x64646178 + DEBUGFS_MAGIC = 0x64626720 + DEVPTS_SUPER_MAGIC = 0x1cd1 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + ECRYPTFS_SUPER_MAGIC = 0xf15f + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x80 + EFD_SEMAPHORE = 0x1 + EFIVARFS_MAGIC = 0xde5e81e4 + EFS_SUPER_MAGIC = 0x414a53 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXT2_SUPER_MAGIC = 0xef53 + EXT3_SUPER_MAGIC = 0xef53 + EXT4_SUPER_MAGIC = 0xef53 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + F2FS_SUPER_MAGIC = 0xf2f52010 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x2000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + FUTEXFS_SUPER_MAGIC = 0xbad1dea + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0xe + F_GETLK64 = 0xe + F_GETOWN = 0x17 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETOWN = 0x18 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HOSTFS_SUPER_MAGIC = 0xc0ffee + HPFS_SUPER_MAGIC = 0xf995e849 + HUGETLBFS_MAGIC = 0x958458f6 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x100 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x80 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISOFS_SUPER_MAGIC = 0x9660 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + JFFS2_SUPER_MAGIC = 0x72b6 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_ANON = 0x800 + MAP_ANONYMOUS = 0x800 + MAP_DENYWRITE = 0x2000 + MAP_EXECUTABLE = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x1000 + MAP_HUGETLB = 0x80000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x8000 + MAP_NONBLOCK = 0x20000 + MAP_NORESERVE = 0x400 + MAP_POPULATE = 0x10000 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x800 + MAP_SHARED = 0x1 + MAP_STACK = 0x40000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MINIX2_SUPER_MAGIC = 0x2468 + MINIX2_SUPER_MAGIC2 = 0x2478 + MINIX3_SUPER_MAGIC = 0x4d5a + MINIX_SUPER_MAGIC = 0x137f + MINIX_SUPER_MAGIC2 = 0x138f + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSDOS_SUPER_MAGIC = 0x4d44 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + MTD_INODE_FS_MAGIC = 0x11307854 + NAME_MAX = 0xff + NCP_SUPER_MAGIC = 0x564c + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NFNETLINK_V0 = 0x0 + NFNLGRP_ACCT_QUOTA = 0x8 + NFNLGRP_CONNTRACK_DESTROY = 0x3 + NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 + NFNLGRP_CONNTRACK_EXP_NEW = 0x4 + NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 + NFNLGRP_CONNTRACK_NEW = 0x1 + NFNLGRP_CONNTRACK_UPDATE = 0x2 + NFNLGRP_MAX = 0x9 + NFNLGRP_NFTABLES = 0x7 + NFNLGRP_NFTRACE = 0x9 + NFNLGRP_NONE = 0x0 + NFNL_BATCH_MAX = 0x1 + NFNL_MSG_BATCH_BEGIN = 0x10 + NFNL_MSG_BATCH_END = 0x11 + NFNL_NFA_NEST = 0x8000 + NFNL_SUBSYS_ACCT = 0x7 + NFNL_SUBSYS_COUNT = 0xc + NFNL_SUBSYS_CTHELPER = 0x9 + NFNL_SUBSYS_CTNETLINK = 0x1 + NFNL_SUBSYS_CTNETLINK_EXP = 0x2 + NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 + NFNL_SUBSYS_IPSET = 0x6 + NFNL_SUBSYS_NFTABLES = 0xa + NFNL_SUBSYS_NFT_COMPAT = 0xb + NFNL_SUBSYS_NONE = 0x0 + NFNL_SUBSYS_OSF = 0x5 + NFNL_SUBSYS_QUEUE = 0x3 + NFNL_SUBSYS_ULOG = 0x4 + NFS_SUPER_MAGIC = 0x6969 + NILFS_SUPER_MAGIC = 0x3434 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + NSFS_MAGIC = 0x6e736673 + OCFS2_SUPER_MAGIC = 0x7461636f + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPENPROM_SUPER_MAGIC = 0x9fa1 + OPOST = 0x1 + OVERLAYFS_SUPER_MAGIC = 0x794c7630 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x1000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x100 + O_DIRECT = 0x8000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x10 + O_EXCL = 0x400 + O_FSYNC = 0x4010 + O_LARGEFILE = 0x0 + O_NDELAY = 0x80 + O_NOATIME = 0x40000 + O_NOCTTY = 0x800 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x80 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x4010 + O_SYNC = 0x4010 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x20002401 + PERF_EVENT_IOC_ENABLE = 0x20002400 + PERF_EVENT_IOC_ID = 0x40082407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 + PERF_EVENT_IOC_PERIOD = 0x80082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc008240a + PERF_EVENT_IOC_REFRESH = 0x20002402 + PERF_EVENT_IOC_RESET = 0x20002403 + PERF_EVENT_IOC_SET_BPF = 0x80042408 + PERF_EVENT_IOC_SET_FILTER = 0x80082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 + PIPEFS_MAGIC = 0x50495045 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROC_SUPER_MAGIC = 0x9fa0 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffffffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PSTOREFS_MAGIC = 0x6165676c + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_GET_THREAD_AREA_3264 = 0xc4 + PTRACE_GET_WATCH_REGS = 0xd0 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKDATA_3264 = 0xc1 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKTEXT_3264 = 0xc0 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKEDATA_3264 = 0xc3 + PTRACE_POKETEXT = 0x4 + PTRACE_POKETEXT_3264 = 0xc2 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SET_WATCH_REGS = 0xd1 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + QNX4_SUPER_MAGIC = 0x2f + QNX6_SUPER_MAGIC = 0x68191122 + RAMFS_MAGIC = 0x858458f6 + RDTGROUP_SUPER_MAGIC = 0x7655821 + REISERFS_SUPER_MAGIC = 0x52654973 + RLIMIT_AS = 0x6 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x9 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x5 + RLIMIT_NPROC = 0x8 + RLIMIT_RSS = 0x7 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SECURITYFS_MAGIC = 0x73636673 + SELINUX_MAGIC = 0xf97cff8c + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x40047307 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x40047309 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x467f + SIOCOUTQ = 0x7472 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x80047308 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMACK_MAGIC = 0x43415d53 + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SMB_SUPER_MAGIC = 0x517b + SOCKFS_MAGIC = 0x534f434b + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x1 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x80 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x2 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0xffff + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1009 + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x20 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x1029 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0x100 + SO_PASSCRED = 0x11 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x12 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1e + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x1028 + SO_RCVBUF = 0x1002 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x1001 + SO_SNDBUFFORCE = 0x1f + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_STYLE = 0x1008 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x1008 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + SQUASHFS_MAGIC = 0x73717368 + STACK_END_MAGIC = 0x57ac6e9d + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + SYSFS_MAGIC = 0x62656572 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x5407 + TCGETA = 0x5401 + TCGETS = 0x540d + TCGETS2 = 0x4030542a + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x5410 + TCSBRK = 0x5405 + TCSBRKP = 0x5486 + TCSETA = 0x5402 + TCSETAF = 0x5404 + TCSETAW = 0x5403 + TCSETS = 0x540e + TCSETS2 = 0x8030542b + TCSETSF = 0x5410 + TCSETSF2 = 0x8030542d + TCSETSW = 0x540f + TCSETSW2 = 0x8030542c + TCXONC = 0x5406 + TIOCCBRK = 0x5428 + TIOCCONS = 0x80047478 + TIOCEXCL = 0x740d + TIOCGDEV = 0x40045432 + TIOCGETD = 0x7400 + TIOCGETP = 0x7408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x5492 + TIOCGLCKTRMIOS = 0x548b + TIOCGLTC = 0x7474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGPTPEER = 0x20005441 + TIOCGRS485 = 0x4020542e + TIOCGSERIAL = 0x5484 + TIOCGSID = 0x7416 + TIOCGSOFTCAR = 0x5481 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x467f + TIOCLINUX = 0x5483 + TIOCMBIC = 0x741c + TIOCMBIS = 0x741b + TIOCMGET = 0x741d + TIOCMIWAIT = 0x5491 + TIOCMSET = 0x741a + TIOCM_CAR = 0x100 + TIOCM_CD = 0x100 + TIOCM_CTS = 0x40 + TIOCM_DSR = 0x400 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x200 + TIOCM_RNG = 0x200 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x20 + TIOCM_ST = 0x10 + TIOCNOTTY = 0x5471 + TIOCNXCL = 0x740e + TIOCOUTQ = 0x7472 + TIOCPKT = 0x5470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x5480 + TIOCSERCONFIG = 0x5488 + TIOCSERGETLSR = 0x548e + TIOCSERGETMULTI = 0x548f + TIOCSERGSTRUCT = 0x548d + TIOCSERGWILD = 0x5489 + TIOCSERSETMULTI = 0x5490 + TIOCSERSWILD = 0x548a + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x7401 + TIOCSETN = 0x740a + TIOCSETP = 0x7409 + TIOCSIG = 0x80045436 + TIOCSLCKTRMIOS = 0x548c + TIOCSLTC = 0x7475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0xc020542f + TIOCSSERIAL = 0x5485 + TIOCSSOFTCAR = 0x5482 + TIOCSTI = 0x5472 + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TMPFS_MAGIC = 0x1021994 + TOSTOP = 0x8000 + TPACKET_ALIGNMENT = 0x10 + TPACKET_HDRLEN = 0x34 + TP_STATUS_AVAILABLE = 0x0 + TP_STATUS_BLK_TMO = 0x20 + TP_STATUS_COPY = 0x2 + TP_STATUS_CSUMNOTREADY = 0x8 + TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_KERNEL = 0x0 + TP_STATUS_LOSING = 0x4 + TP_STATUS_SENDING = 0x2 + TP_STATUS_SEND_REQUEST = 0x1 + TP_STATUS_TS_RAW_HARDWARE = -0x80000000 + TP_STATUS_TS_SOFTWARE = 0x20000000 + TP_STATUS_TS_SYS_HARDWARE = 0x40000000 + TP_STATUS_USER = 0x1 + TP_STATUS_VLAN_TPID_VALID = 0x40 + TP_STATUS_VLAN_VALID = 0x10 + TP_STATUS_WRONG_FORMAT = 0x4 + TRACEFS_MAGIC = 0x74726163 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x801054d5 + TUNDETACHFILTER = 0x801054d6 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x401054db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETDEBUG = 0x800454c9 + TUNSETFILTEREBPF = 0x400454e1 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETSTEERINGEBPF = 0x400454e0 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + UDF_SUPER_MAGIC = 0x15013346 + UMOUNT_NOFOLLOW = 0x8 + USBDEVICE_SUPER_MAGIC = 0x9fa2 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + V9FS_MAGIC = 0x1021997 + VDISCARD = 0xd + VEOF = 0x10 + VEOL = 0x11 + VEOL2 = 0x6 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x4 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VSWTCH = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x40045702 + WDIOC_GETPRETIMEOUT = 0x40045709 + WDIOC_GETSTATUS = 0x40045701 + WDIOC_GETSUPPORT = 0x40285700 + WDIOC_GETTEMP = 0x40045703 + WDIOC_GETTIMELEFT = 0x4004570a + WDIOC_GETTIMEOUT = 0x40045707 + WDIOC_KEEPALIVE = 0x40045705 + WDIOC_SETOPTIONS = 0x40045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XENFS_SUPER_MAGIC = 0xabba1974 + XTABS = 0x1800 + ZSMALLOC_MAGIC = 0x58295829 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x7d) + EADDRNOTAVAIL = syscall.Errno(0x7e) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x7c) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x95) + EBADE = syscall.Errno(0x32) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x51) + EBADMSG = syscall.Errno(0x4d) + EBADR = syscall.Errno(0x33) + EBADRQC = syscall.Errno(0x36) + EBADSLT = syscall.Errno(0x37) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x9e) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x25) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x82) + ECONNREFUSED = syscall.Errno(0x92) + ECONNRESET = syscall.Errno(0x83) + EDEADLK = syscall.Errno(0x2d) + EDEADLOCK = syscall.Errno(0x38) + EDESTADDRREQ = syscall.Errno(0x60) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x46d) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x93) + EHOSTUNREACH = syscall.Errno(0x94) + EHWPOISON = syscall.Errno(0xa8) + EIDRM = syscall.Errno(0x24) + EILSEQ = syscall.Errno(0x58) + EINIT = syscall.Errno(0x8d) + EINPROGRESS = syscall.Errno(0x96) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x85) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x8b) + EKEYEXPIRED = syscall.Errno(0xa2) + EKEYREJECTED = syscall.Errno(0xa4) + EKEYREVOKED = syscall.Errno(0xa3) + EL2HLT = syscall.Errno(0x2c) + EL2NSYNC = syscall.Errno(0x26) + EL3HLT = syscall.Errno(0x27) + EL3RST = syscall.Errno(0x28) + ELIBACC = syscall.Errno(0x53) + ELIBBAD = syscall.Errno(0x54) + ELIBEXEC = syscall.Errno(0x57) + ELIBMAX = syscall.Errno(0x56) + ELIBSCN = syscall.Errno(0x55) + ELNRNG = syscall.Errno(0x29) + ELOOP = syscall.Errno(0x5a) + EMEDIUMTYPE = syscall.Errno(0xa0) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x61) + EMULTIHOP = syscall.Errno(0x4a) + ENAMETOOLONG = syscall.Errno(0x4e) + ENAVAIL = syscall.Errno(0x8a) + ENETDOWN = syscall.Errno(0x7f) + ENETRESET = syscall.Errno(0x81) + ENETUNREACH = syscall.Errno(0x80) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x35) + ENOBUFS = syscall.Errno(0x84) + ENOCSI = syscall.Errno(0x2b) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0xa1) + ENOLCK = syscall.Errno(0x2e) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x9f) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x23) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x63) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x59) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x86) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x5d) + ENOTNAM = syscall.Errno(0x89) + ENOTRECOVERABLE = syscall.Errno(0xa6) + ENOTSOCK = syscall.Errno(0x5f) + ENOTSUP = syscall.Errno(0x7a) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x50) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x7a) + EOVERFLOW = syscall.Errno(0x4f) + EOWNERDEAD = syscall.Errno(0xa5) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x7b) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x78) + EPROTOTYPE = syscall.Errno(0x62) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x52) + EREMDEV = syscall.Errno(0x8e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x8c) + ERESTART = syscall.Errno(0x5b) + ERFKILL = syscall.Errno(0xa7) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x8f) + ESOCKTNOSUPPORT = syscall.Errno(0x79) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x97) + ESTRPIPE = syscall.Errno(0x5c) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x91) + ETOOMANYREFS = syscall.Errno(0x90) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x87) + EUNATCH = syscall.Errno(0x2a) + EUSERS = syscall.Errno(0x5e) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x34) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x12) + SIGCLD = syscall.Signal(0x12) + SIGCONT = syscall.Signal(0x19) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x16) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x16) + SIGPROF = syscall.Signal(0x1d) + SIGPWR = syscall.Signal(0x13) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x17) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x18) + SIGTTIN = syscall.Signal(0x1a) + SIGTTOU = syscall.Signal(0x1b) + SIGURG = syscall.Signal(0x15) + SIGUSR1 = syscall.Signal(0x10) + SIGUSR2 = syscall.Signal(0x11) + SIGVTALRM = syscall.Signal(0x1c) + SIGWINCH = syscall.Signal(0x14) + SIGXCPU = syscall.Signal(0x1e) + SIGXFSZ = syscall.Signal(0x1f) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "no such device or address"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EAGAIN", "resource temporarily unavailable"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device or resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "invalid cross-device link"}, + {19, "ENODEV", "no such device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "numerical result out of range"}, + {35, "ENOMSG", "no message of desired type"}, + {36, "EIDRM", "identifier removed"}, + {37, "ECHRNG", "channel number out of range"}, + {38, "EL2NSYNC", "level 2 not synchronized"}, + {39, "EL3HLT", "level 3 halted"}, + {40, "EL3RST", "level 3 reset"}, + {41, "ELNRNG", "link number out of range"}, + {42, "EUNATCH", "protocol driver not attached"}, + {43, "ENOCSI", "no CSI structure available"}, + {44, "EL2HLT", "level 2 halted"}, + {45, "EDEADLK", "resource deadlock avoided"}, + {46, "ENOLCK", "no locks available"}, + {50, "EBADE", "invalid exchange"}, + {51, "EBADR", "invalid request descriptor"}, + {52, "EXFULL", "exchange full"}, + {53, "ENOANO", "no anode"}, + {54, "EBADRQC", "invalid request code"}, + {55, "EBADSLT", "invalid slot"}, + {56, "EDEADLOCK", "file locking deadlock error"}, + {59, "EBFONT", "bad font file format"}, + {60, "ENOSTR", "device not a stream"}, + {61, "ENODATA", "no data available"}, + {62, "ETIME", "timer expired"}, + {63, "ENOSR", "out of streams resources"}, + {64, "ENONET", "machine is not on the network"}, + {65, "ENOPKG", "package not installed"}, + {66, "EREMOTE", "object is remote"}, + {67, "ENOLINK", "link has been severed"}, + {68, "EADV", "advertise error"}, + {69, "ESRMNT", "srmount error"}, + {70, "ECOMM", "communication error on send"}, + {71, "EPROTO", "protocol error"}, + {73, "EDOTDOT", "RFS specific error"}, + {74, "EMULTIHOP", "multihop attempted"}, + {77, "EBADMSG", "bad message"}, + {78, "ENAMETOOLONG", "file name too long"}, + {79, "EOVERFLOW", "value too large for defined data type"}, + {80, "ENOTUNIQ", "name not unique on network"}, + {81, "EBADFD", "file descriptor in bad state"}, + {82, "EREMCHG", "remote address changed"}, + {83, "ELIBACC", "can not access a needed shared library"}, + {84, "ELIBBAD", "accessing a corrupted shared library"}, + {85, "ELIBSCN", ".lib section in a.out corrupted"}, + {86, "ELIBMAX", "attempting to link in too many shared libraries"}, + {87, "ELIBEXEC", "cannot exec a shared library directly"}, + {88, "EILSEQ", "invalid or incomplete multibyte or wide character"}, + {89, "ENOSYS", "function not implemented"}, + {90, "ELOOP", "too many levels of symbolic links"}, + {91, "ERESTART", "interrupted system call should be restarted"}, + {92, "ESTRPIPE", "streams pipe error"}, + {93, "ENOTEMPTY", "directory not empty"}, + {94, "EUSERS", "too many users"}, + {95, "ENOTSOCK", "socket operation on non-socket"}, + {96, "EDESTADDRREQ", "destination address required"}, + {97, "EMSGSIZE", "message too long"}, + {98, "EPROTOTYPE", "protocol wrong type for socket"}, + {99, "ENOPROTOOPT", "protocol not available"}, + {120, "EPROTONOSUPPORT", "protocol not supported"}, + {121, "ESOCKTNOSUPPORT", "socket type not supported"}, + {122, "ENOTSUP", "operation not supported"}, + {123, "EPFNOSUPPORT", "protocol family not supported"}, + {124, "EAFNOSUPPORT", "address family not supported by protocol"}, + {125, "EADDRINUSE", "address already in use"}, + {126, "EADDRNOTAVAIL", "cannot assign requested address"}, + {127, "ENETDOWN", "network is down"}, + {128, "ENETUNREACH", "network is unreachable"}, + {129, "ENETRESET", "network dropped connection on reset"}, + {130, "ECONNABORTED", "software caused connection abort"}, + {131, "ECONNRESET", "connection reset by peer"}, + {132, "ENOBUFS", "no buffer space available"}, + {133, "EISCONN", "transport endpoint is already connected"}, + {134, "ENOTCONN", "transport endpoint is not connected"}, + {135, "EUCLEAN", "structure needs cleaning"}, + {137, "ENOTNAM", "not a XENIX named type file"}, + {138, "ENAVAIL", "no XENIX semaphores available"}, + {139, "EISNAM", "is a named type file"}, + {140, "EREMOTEIO", "remote I/O error"}, + {141, "EINIT", "unknown error 141"}, + {142, "EREMDEV", "unknown error 142"}, + {143, "ESHUTDOWN", "cannot send after transport endpoint shutdown"}, + {144, "ETOOMANYREFS", "too many references: cannot splice"}, + {145, "ETIMEDOUT", "connection timed out"}, + {146, "ECONNREFUSED", "connection refused"}, + {147, "EHOSTDOWN", "host is down"}, + {148, "EHOSTUNREACH", "no route to host"}, + {149, "EALREADY", "operation already in progress"}, + {150, "EINPROGRESS", "operation now in progress"}, + {151, "ESTALE", "stale file handle"}, + {158, "ECANCELED", "operation canceled"}, + {159, "ENOMEDIUM", "no medium found"}, + {160, "EMEDIUMTYPE", "wrong medium type"}, + {161, "ENOKEY", "required key not available"}, + {162, "EKEYEXPIRED", "key has expired"}, + {163, "EKEYREVOKED", "key has been revoked"}, + {164, "EKEYREJECTED", "key was rejected by service"}, + {165, "EOWNERDEAD", "owner died"}, + {166, "ENOTRECOVERABLE", "state not recoverable"}, + {167, "ERFKILL", "operation not possible due to RF-kill"}, + {168, "EHWPOISON", "memory page has hardware error"}, + {1133, "EDQUOT", "disk quota exceeded"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/breakpoint trap"}, + {6, "SIGABRT", "aborted"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGUSR1", "user defined signal 1"}, + {17, "SIGUSR2", "user defined signal 2"}, + {18, "SIGCHLD", "child exited"}, + {19, "SIGPWR", "power failure"}, + {20, "SIGWINCH", "window changed"}, + {21, "SIGURG", "urgent I/O condition"}, + {22, "SIGIO", "I/O possible"}, + {23, "SIGSTOP", "stopped (signal)"}, + {24, "SIGTSTP", "stopped"}, + {25, "SIGCONT", "continued"}, + {26, "SIGTTIN", "stopped (tty input)"}, + {27, "SIGTTOU", "stopped (tty output)"}, + {28, "SIGVTALRM", "virtual timer expired"}, + {29, "SIGPROF", "profiling timer expired"}, + {30, "SIGXCPU", "CPU time limit exceeded"}, + {31, "SIGXFSZ", "file size limit exceeded"}, +} diff --git a/api/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go b/api/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go new file mode 100644 index 0000000..1131d3c --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go @@ -0,0 +1,2573 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mips64le,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go + +package unix + +import "syscall" + +const ( + AAFS_MAGIC = 0x5a3c69f0 + ADFS_SUPER_MAGIC = 0xadf5 + AFFS_SUPER_MAGIC = 0xadff + AFS_FS_MAGIC = 0x6b414653 + AFS_SUPER_MAGIC = 0x5346414f + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ANON_INODE_FS_MAGIC = 0x9041934 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + AUTOFS_SUPER_MAGIC = 0x187 + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BALLOON_KVM_MAGIC = 0x13661366 + BDEVFS_MAGIC = 0x62646576 + BINFMTFS_MAGIC = 0x42494e4d + BLKBSZGET = 0x40081270 + BLKBSZSET = 0x80081271 + BLKFLSBUF = 0x20001261 + BLKFRAGET = 0x20001265 + BLKFRASET = 0x20001264 + BLKGETSIZE = 0x20001260 + BLKGETSIZE64 = 0x40081272 + BLKPBSZGET = 0x2000127b + BLKRAGET = 0x20001263 + BLKRASET = 0x20001262 + BLKROGET = 0x2000125e + BLKROSET = 0x2000125d + BLKRRPART = 0x2000125f + BLKSECTGET = 0x20001267 + BLKSECTSET = 0x20001266 + BLKSSZGET = 0x20001268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_FS_MAGIC = 0xcafe4a11 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + BTRFS_SUPER_MAGIC = 0x9123683e + BTRFS_TEST_MAGIC = 0x73727279 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CGROUP2_SUPER_MAGIC = 0x63677270 + CGROUP_SUPER_MAGIC = 0x27e0eb + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CODA_SUPER_MAGIC = 0x73757245 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRAMFS_MAGIC = 0x28cd3d45 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DAXFS_MAGIC = 0x64646178 + DEBUGFS_MAGIC = 0x64626720 + DEVPTS_SUPER_MAGIC = 0x1cd1 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + ECRYPTFS_SUPER_MAGIC = 0xf15f + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x80 + EFD_SEMAPHORE = 0x1 + EFIVARFS_MAGIC = 0xde5e81e4 + EFS_SUPER_MAGIC = 0x414a53 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXT2_SUPER_MAGIC = 0xef53 + EXT3_SUPER_MAGIC = 0xef53 + EXT4_SUPER_MAGIC = 0xef53 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + F2FS_SUPER_MAGIC = 0xf2f52010 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x2000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + FUTEXFS_SUPER_MAGIC = 0xbad1dea + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0xe + F_GETLK64 = 0xe + F_GETOWN = 0x17 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETOWN = 0x18 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HOSTFS_SUPER_MAGIC = 0xc0ffee + HPFS_SUPER_MAGIC = 0xf995e849 + HUGETLBFS_MAGIC = 0x958458f6 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x100 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x80 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISOFS_SUPER_MAGIC = 0x9660 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + JFFS2_SUPER_MAGIC = 0x72b6 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_ANON = 0x800 + MAP_ANONYMOUS = 0x800 + MAP_DENYWRITE = 0x2000 + MAP_EXECUTABLE = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x1000 + MAP_HUGETLB = 0x80000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x8000 + MAP_NONBLOCK = 0x20000 + MAP_NORESERVE = 0x400 + MAP_POPULATE = 0x10000 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x800 + MAP_SHARED = 0x1 + MAP_STACK = 0x40000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MINIX2_SUPER_MAGIC = 0x2468 + MINIX2_SUPER_MAGIC2 = 0x2478 + MINIX3_SUPER_MAGIC = 0x4d5a + MINIX_SUPER_MAGIC = 0x137f + MINIX_SUPER_MAGIC2 = 0x138f + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSDOS_SUPER_MAGIC = 0x4d44 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + MTD_INODE_FS_MAGIC = 0x11307854 + NAME_MAX = 0xff + NCP_SUPER_MAGIC = 0x564c + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NFNETLINK_V0 = 0x0 + NFNLGRP_ACCT_QUOTA = 0x8 + NFNLGRP_CONNTRACK_DESTROY = 0x3 + NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 + NFNLGRP_CONNTRACK_EXP_NEW = 0x4 + NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 + NFNLGRP_CONNTRACK_NEW = 0x1 + NFNLGRP_CONNTRACK_UPDATE = 0x2 + NFNLGRP_MAX = 0x9 + NFNLGRP_NFTABLES = 0x7 + NFNLGRP_NFTRACE = 0x9 + NFNLGRP_NONE = 0x0 + NFNL_BATCH_MAX = 0x1 + NFNL_MSG_BATCH_BEGIN = 0x10 + NFNL_MSG_BATCH_END = 0x11 + NFNL_NFA_NEST = 0x8000 + NFNL_SUBSYS_ACCT = 0x7 + NFNL_SUBSYS_COUNT = 0xc + NFNL_SUBSYS_CTHELPER = 0x9 + NFNL_SUBSYS_CTNETLINK = 0x1 + NFNL_SUBSYS_CTNETLINK_EXP = 0x2 + NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 + NFNL_SUBSYS_IPSET = 0x6 + NFNL_SUBSYS_NFTABLES = 0xa + NFNL_SUBSYS_NFT_COMPAT = 0xb + NFNL_SUBSYS_NONE = 0x0 + NFNL_SUBSYS_OSF = 0x5 + NFNL_SUBSYS_QUEUE = 0x3 + NFNL_SUBSYS_ULOG = 0x4 + NFS_SUPER_MAGIC = 0x6969 + NILFS_SUPER_MAGIC = 0x3434 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + NSFS_MAGIC = 0x6e736673 + OCFS2_SUPER_MAGIC = 0x7461636f + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPENPROM_SUPER_MAGIC = 0x9fa1 + OPOST = 0x1 + OVERLAYFS_SUPER_MAGIC = 0x794c7630 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x1000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x100 + O_DIRECT = 0x8000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x10 + O_EXCL = 0x400 + O_FSYNC = 0x4010 + O_LARGEFILE = 0x0 + O_NDELAY = 0x80 + O_NOATIME = 0x40000 + O_NOCTTY = 0x800 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x80 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x4010 + O_SYNC = 0x4010 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x20002401 + PERF_EVENT_IOC_ENABLE = 0x20002400 + PERF_EVENT_IOC_ID = 0x40082407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 + PERF_EVENT_IOC_PERIOD = 0x80082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc008240a + PERF_EVENT_IOC_REFRESH = 0x20002402 + PERF_EVENT_IOC_RESET = 0x20002403 + PERF_EVENT_IOC_SET_BPF = 0x80042408 + PERF_EVENT_IOC_SET_FILTER = 0x80082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 + PIPEFS_MAGIC = 0x50495045 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROC_SUPER_MAGIC = 0x9fa0 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffffffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PSTOREFS_MAGIC = 0x6165676c + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_GET_THREAD_AREA_3264 = 0xc4 + PTRACE_GET_WATCH_REGS = 0xd0 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKDATA_3264 = 0xc1 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKTEXT_3264 = 0xc0 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKEDATA_3264 = 0xc3 + PTRACE_POKETEXT = 0x4 + PTRACE_POKETEXT_3264 = 0xc2 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SET_WATCH_REGS = 0xd1 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + QNX4_SUPER_MAGIC = 0x2f + QNX6_SUPER_MAGIC = 0x68191122 + RAMFS_MAGIC = 0x858458f6 + RDTGROUP_SUPER_MAGIC = 0x7655821 + REISERFS_SUPER_MAGIC = 0x52654973 + RLIMIT_AS = 0x6 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x9 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x5 + RLIMIT_NPROC = 0x8 + RLIMIT_RSS = 0x7 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SECURITYFS_MAGIC = 0x73636673 + SELINUX_MAGIC = 0xf97cff8c + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x40047307 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x40047309 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x467f + SIOCOUTQ = 0x7472 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x80047308 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMACK_MAGIC = 0x43415d53 + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SMB_SUPER_MAGIC = 0x517b + SOCKFS_MAGIC = 0x534f434b + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x1 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x80 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x2 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0xffff + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1009 + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x20 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x1029 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0x100 + SO_PASSCRED = 0x11 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x12 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1e + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x1028 + SO_RCVBUF = 0x1002 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x1001 + SO_SNDBUFFORCE = 0x1f + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_STYLE = 0x1008 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x1008 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + SQUASHFS_MAGIC = 0x73717368 + STACK_END_MAGIC = 0x57ac6e9d + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + SYSFS_MAGIC = 0x62656572 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x5407 + TCGETA = 0x5401 + TCGETS = 0x540d + TCGETS2 = 0x4030542a + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x5410 + TCSBRK = 0x5405 + TCSBRKP = 0x5486 + TCSETA = 0x5402 + TCSETAF = 0x5404 + TCSETAW = 0x5403 + TCSETS = 0x540e + TCSETS2 = 0x8030542b + TCSETSF = 0x5410 + TCSETSF2 = 0x8030542d + TCSETSW = 0x540f + TCSETSW2 = 0x8030542c + TCXONC = 0x5406 + TIOCCBRK = 0x5428 + TIOCCONS = 0x80047478 + TIOCEXCL = 0x740d + TIOCGDEV = 0x40045432 + TIOCGETD = 0x7400 + TIOCGETP = 0x7408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x5492 + TIOCGLCKTRMIOS = 0x548b + TIOCGLTC = 0x7474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGPTPEER = 0x20005441 + TIOCGRS485 = 0x4020542e + TIOCGSERIAL = 0x5484 + TIOCGSID = 0x7416 + TIOCGSOFTCAR = 0x5481 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x467f + TIOCLINUX = 0x5483 + TIOCMBIC = 0x741c + TIOCMBIS = 0x741b + TIOCMGET = 0x741d + TIOCMIWAIT = 0x5491 + TIOCMSET = 0x741a + TIOCM_CAR = 0x100 + TIOCM_CD = 0x100 + TIOCM_CTS = 0x40 + TIOCM_DSR = 0x400 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x200 + TIOCM_RNG = 0x200 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x20 + TIOCM_ST = 0x10 + TIOCNOTTY = 0x5471 + TIOCNXCL = 0x740e + TIOCOUTQ = 0x7472 + TIOCPKT = 0x5470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x5480 + TIOCSERCONFIG = 0x5488 + TIOCSERGETLSR = 0x548e + TIOCSERGETMULTI = 0x548f + TIOCSERGSTRUCT = 0x548d + TIOCSERGWILD = 0x5489 + TIOCSERSETMULTI = 0x5490 + TIOCSERSWILD = 0x548a + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x7401 + TIOCSETN = 0x740a + TIOCSETP = 0x7409 + TIOCSIG = 0x80045436 + TIOCSLCKTRMIOS = 0x548c + TIOCSLTC = 0x7475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0xc020542f + TIOCSSERIAL = 0x5485 + TIOCSSOFTCAR = 0x5482 + TIOCSTI = 0x5472 + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TMPFS_MAGIC = 0x1021994 + TOSTOP = 0x8000 + TPACKET_ALIGNMENT = 0x10 + TPACKET_HDRLEN = 0x34 + TP_STATUS_AVAILABLE = 0x0 + TP_STATUS_BLK_TMO = 0x20 + TP_STATUS_COPY = 0x2 + TP_STATUS_CSUMNOTREADY = 0x8 + TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_KERNEL = 0x0 + TP_STATUS_LOSING = 0x4 + TP_STATUS_SENDING = 0x2 + TP_STATUS_SEND_REQUEST = 0x1 + TP_STATUS_TS_RAW_HARDWARE = -0x80000000 + TP_STATUS_TS_SOFTWARE = 0x20000000 + TP_STATUS_TS_SYS_HARDWARE = 0x40000000 + TP_STATUS_USER = 0x1 + TP_STATUS_VLAN_TPID_VALID = 0x40 + TP_STATUS_VLAN_VALID = 0x10 + TP_STATUS_WRONG_FORMAT = 0x4 + TRACEFS_MAGIC = 0x74726163 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x801054d5 + TUNDETACHFILTER = 0x801054d6 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x401054db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETDEBUG = 0x800454c9 + TUNSETFILTEREBPF = 0x400454e1 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETSTEERINGEBPF = 0x400454e0 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + UDF_SUPER_MAGIC = 0x15013346 + UMOUNT_NOFOLLOW = 0x8 + USBDEVICE_SUPER_MAGIC = 0x9fa2 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + V9FS_MAGIC = 0x1021997 + VDISCARD = 0xd + VEOF = 0x10 + VEOL = 0x11 + VEOL2 = 0x6 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x4 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VSWTCH = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x40045702 + WDIOC_GETPRETIMEOUT = 0x40045709 + WDIOC_GETSTATUS = 0x40045701 + WDIOC_GETSUPPORT = 0x40285700 + WDIOC_GETTEMP = 0x40045703 + WDIOC_GETTIMELEFT = 0x4004570a + WDIOC_GETTIMEOUT = 0x40045707 + WDIOC_KEEPALIVE = 0x40045705 + WDIOC_SETOPTIONS = 0x40045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XENFS_SUPER_MAGIC = 0xabba1974 + XTABS = 0x1800 + ZSMALLOC_MAGIC = 0x58295829 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x7d) + EADDRNOTAVAIL = syscall.Errno(0x7e) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x7c) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x95) + EBADE = syscall.Errno(0x32) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x51) + EBADMSG = syscall.Errno(0x4d) + EBADR = syscall.Errno(0x33) + EBADRQC = syscall.Errno(0x36) + EBADSLT = syscall.Errno(0x37) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x9e) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x25) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x82) + ECONNREFUSED = syscall.Errno(0x92) + ECONNRESET = syscall.Errno(0x83) + EDEADLK = syscall.Errno(0x2d) + EDEADLOCK = syscall.Errno(0x38) + EDESTADDRREQ = syscall.Errno(0x60) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x46d) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x93) + EHOSTUNREACH = syscall.Errno(0x94) + EHWPOISON = syscall.Errno(0xa8) + EIDRM = syscall.Errno(0x24) + EILSEQ = syscall.Errno(0x58) + EINIT = syscall.Errno(0x8d) + EINPROGRESS = syscall.Errno(0x96) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x85) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x8b) + EKEYEXPIRED = syscall.Errno(0xa2) + EKEYREJECTED = syscall.Errno(0xa4) + EKEYREVOKED = syscall.Errno(0xa3) + EL2HLT = syscall.Errno(0x2c) + EL2NSYNC = syscall.Errno(0x26) + EL3HLT = syscall.Errno(0x27) + EL3RST = syscall.Errno(0x28) + ELIBACC = syscall.Errno(0x53) + ELIBBAD = syscall.Errno(0x54) + ELIBEXEC = syscall.Errno(0x57) + ELIBMAX = syscall.Errno(0x56) + ELIBSCN = syscall.Errno(0x55) + ELNRNG = syscall.Errno(0x29) + ELOOP = syscall.Errno(0x5a) + EMEDIUMTYPE = syscall.Errno(0xa0) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x61) + EMULTIHOP = syscall.Errno(0x4a) + ENAMETOOLONG = syscall.Errno(0x4e) + ENAVAIL = syscall.Errno(0x8a) + ENETDOWN = syscall.Errno(0x7f) + ENETRESET = syscall.Errno(0x81) + ENETUNREACH = syscall.Errno(0x80) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x35) + ENOBUFS = syscall.Errno(0x84) + ENOCSI = syscall.Errno(0x2b) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0xa1) + ENOLCK = syscall.Errno(0x2e) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x9f) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x23) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x63) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x59) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x86) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x5d) + ENOTNAM = syscall.Errno(0x89) + ENOTRECOVERABLE = syscall.Errno(0xa6) + ENOTSOCK = syscall.Errno(0x5f) + ENOTSUP = syscall.Errno(0x7a) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x50) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x7a) + EOVERFLOW = syscall.Errno(0x4f) + EOWNERDEAD = syscall.Errno(0xa5) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x7b) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x78) + EPROTOTYPE = syscall.Errno(0x62) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x52) + EREMDEV = syscall.Errno(0x8e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x8c) + ERESTART = syscall.Errno(0x5b) + ERFKILL = syscall.Errno(0xa7) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x8f) + ESOCKTNOSUPPORT = syscall.Errno(0x79) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x97) + ESTRPIPE = syscall.Errno(0x5c) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x91) + ETOOMANYREFS = syscall.Errno(0x90) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x87) + EUNATCH = syscall.Errno(0x2a) + EUSERS = syscall.Errno(0x5e) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x34) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x12) + SIGCLD = syscall.Signal(0x12) + SIGCONT = syscall.Signal(0x19) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x16) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x16) + SIGPROF = syscall.Signal(0x1d) + SIGPWR = syscall.Signal(0x13) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x17) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x18) + SIGTTIN = syscall.Signal(0x1a) + SIGTTOU = syscall.Signal(0x1b) + SIGURG = syscall.Signal(0x15) + SIGUSR1 = syscall.Signal(0x10) + SIGUSR2 = syscall.Signal(0x11) + SIGVTALRM = syscall.Signal(0x1c) + SIGWINCH = syscall.Signal(0x14) + SIGXCPU = syscall.Signal(0x1e) + SIGXFSZ = syscall.Signal(0x1f) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "no such device or address"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EAGAIN", "resource temporarily unavailable"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device or resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "invalid cross-device link"}, + {19, "ENODEV", "no such device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "numerical result out of range"}, + {35, "ENOMSG", "no message of desired type"}, + {36, "EIDRM", "identifier removed"}, + {37, "ECHRNG", "channel number out of range"}, + {38, "EL2NSYNC", "level 2 not synchronized"}, + {39, "EL3HLT", "level 3 halted"}, + {40, "EL3RST", "level 3 reset"}, + {41, "ELNRNG", "link number out of range"}, + {42, "EUNATCH", "protocol driver not attached"}, + {43, "ENOCSI", "no CSI structure available"}, + {44, "EL2HLT", "level 2 halted"}, + {45, "EDEADLK", "resource deadlock avoided"}, + {46, "ENOLCK", "no locks available"}, + {50, "EBADE", "invalid exchange"}, + {51, "EBADR", "invalid request descriptor"}, + {52, "EXFULL", "exchange full"}, + {53, "ENOANO", "no anode"}, + {54, "EBADRQC", "invalid request code"}, + {55, "EBADSLT", "invalid slot"}, + {56, "EDEADLOCK", "file locking deadlock error"}, + {59, "EBFONT", "bad font file format"}, + {60, "ENOSTR", "device not a stream"}, + {61, "ENODATA", "no data available"}, + {62, "ETIME", "timer expired"}, + {63, "ENOSR", "out of streams resources"}, + {64, "ENONET", "machine is not on the network"}, + {65, "ENOPKG", "package not installed"}, + {66, "EREMOTE", "object is remote"}, + {67, "ENOLINK", "link has been severed"}, + {68, "EADV", "advertise error"}, + {69, "ESRMNT", "srmount error"}, + {70, "ECOMM", "communication error on send"}, + {71, "EPROTO", "protocol error"}, + {73, "EDOTDOT", "RFS specific error"}, + {74, "EMULTIHOP", "multihop attempted"}, + {77, "EBADMSG", "bad message"}, + {78, "ENAMETOOLONG", "file name too long"}, + {79, "EOVERFLOW", "value too large for defined data type"}, + {80, "ENOTUNIQ", "name not unique on network"}, + {81, "EBADFD", "file descriptor in bad state"}, + {82, "EREMCHG", "remote address changed"}, + {83, "ELIBACC", "can not access a needed shared library"}, + {84, "ELIBBAD", "accessing a corrupted shared library"}, + {85, "ELIBSCN", ".lib section in a.out corrupted"}, + {86, "ELIBMAX", "attempting to link in too many shared libraries"}, + {87, "ELIBEXEC", "cannot exec a shared library directly"}, + {88, "EILSEQ", "invalid or incomplete multibyte or wide character"}, + {89, "ENOSYS", "function not implemented"}, + {90, "ELOOP", "too many levels of symbolic links"}, + {91, "ERESTART", "interrupted system call should be restarted"}, + {92, "ESTRPIPE", "streams pipe error"}, + {93, "ENOTEMPTY", "directory not empty"}, + {94, "EUSERS", "too many users"}, + {95, "ENOTSOCK", "socket operation on non-socket"}, + {96, "EDESTADDRREQ", "destination address required"}, + {97, "EMSGSIZE", "message too long"}, + {98, "EPROTOTYPE", "protocol wrong type for socket"}, + {99, "ENOPROTOOPT", "protocol not available"}, + {120, "EPROTONOSUPPORT", "protocol not supported"}, + {121, "ESOCKTNOSUPPORT", "socket type not supported"}, + {122, "ENOTSUP", "operation not supported"}, + {123, "EPFNOSUPPORT", "protocol family not supported"}, + {124, "EAFNOSUPPORT", "address family not supported by protocol"}, + {125, "EADDRINUSE", "address already in use"}, + {126, "EADDRNOTAVAIL", "cannot assign requested address"}, + {127, "ENETDOWN", "network is down"}, + {128, "ENETUNREACH", "network is unreachable"}, + {129, "ENETRESET", "network dropped connection on reset"}, + {130, "ECONNABORTED", "software caused connection abort"}, + {131, "ECONNRESET", "connection reset by peer"}, + {132, "ENOBUFS", "no buffer space available"}, + {133, "EISCONN", "transport endpoint is already connected"}, + {134, "ENOTCONN", "transport endpoint is not connected"}, + {135, "EUCLEAN", "structure needs cleaning"}, + {137, "ENOTNAM", "not a XENIX named type file"}, + {138, "ENAVAIL", "no XENIX semaphores available"}, + {139, "EISNAM", "is a named type file"}, + {140, "EREMOTEIO", "remote I/O error"}, + {141, "EINIT", "unknown error 141"}, + {142, "EREMDEV", "unknown error 142"}, + {143, "ESHUTDOWN", "cannot send after transport endpoint shutdown"}, + {144, "ETOOMANYREFS", "too many references: cannot splice"}, + {145, "ETIMEDOUT", "connection timed out"}, + {146, "ECONNREFUSED", "connection refused"}, + {147, "EHOSTDOWN", "host is down"}, + {148, "EHOSTUNREACH", "no route to host"}, + {149, "EALREADY", "operation already in progress"}, + {150, "EINPROGRESS", "operation now in progress"}, + {151, "ESTALE", "stale file handle"}, + {158, "ECANCELED", "operation canceled"}, + {159, "ENOMEDIUM", "no medium found"}, + {160, "EMEDIUMTYPE", "wrong medium type"}, + {161, "ENOKEY", "required key not available"}, + {162, "EKEYEXPIRED", "key has expired"}, + {163, "EKEYREVOKED", "key has been revoked"}, + {164, "EKEYREJECTED", "key was rejected by service"}, + {165, "EOWNERDEAD", "owner died"}, + {166, "ENOTRECOVERABLE", "state not recoverable"}, + {167, "ERFKILL", "operation not possible due to RF-kill"}, + {168, "EHWPOISON", "memory page has hardware error"}, + {1133, "EDQUOT", "disk quota exceeded"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/breakpoint trap"}, + {6, "SIGABRT", "aborted"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGUSR1", "user defined signal 1"}, + {17, "SIGUSR2", "user defined signal 2"}, + {18, "SIGCHLD", "child exited"}, + {19, "SIGPWR", "power failure"}, + {20, "SIGWINCH", "window changed"}, + {21, "SIGURG", "urgent I/O condition"}, + {22, "SIGIO", "I/O possible"}, + {23, "SIGSTOP", "stopped (signal)"}, + {24, "SIGTSTP", "stopped"}, + {25, "SIGCONT", "continued"}, + {26, "SIGTTIN", "stopped (tty input)"}, + {27, "SIGTTOU", "stopped (tty output)"}, + {28, "SIGVTALRM", "virtual timer expired"}, + {29, "SIGPROF", "profiling timer expired"}, + {30, "SIGXCPU", "CPU time limit exceeded"}, + {31, "SIGXFSZ", "file size limit exceeded"}, +} diff --git a/api/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go b/api/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go new file mode 100644 index 0000000..d04a43b --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go @@ -0,0 +1,2573 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mipsle,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go + +package unix + +import "syscall" + +const ( + AAFS_MAGIC = 0x5a3c69f0 + ADFS_SUPER_MAGIC = 0xadf5 + AFFS_SUPER_MAGIC = 0xadff + AFS_FS_MAGIC = 0x6b414653 + AFS_SUPER_MAGIC = 0x5346414f + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ANON_INODE_FS_MAGIC = 0x9041934 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + AUTOFS_SUPER_MAGIC = 0x187 + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BALLOON_KVM_MAGIC = 0x13661366 + BDEVFS_MAGIC = 0x62646576 + BINFMTFS_MAGIC = 0x42494e4d + BLKBSZGET = 0x40041270 + BLKBSZSET = 0x80041271 + BLKFLSBUF = 0x20001261 + BLKFRAGET = 0x20001265 + BLKFRASET = 0x20001264 + BLKGETSIZE = 0x20001260 + BLKGETSIZE64 = 0x40041272 + BLKPBSZGET = 0x2000127b + BLKRAGET = 0x20001263 + BLKRASET = 0x20001262 + BLKROGET = 0x2000125e + BLKROSET = 0x2000125d + BLKRRPART = 0x2000125f + BLKSECTGET = 0x20001267 + BLKSECTSET = 0x20001266 + BLKSSZGET = 0x20001268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_FS_MAGIC = 0xcafe4a11 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + BTRFS_SUPER_MAGIC = 0x9123683e + BTRFS_TEST_MAGIC = 0x73727279 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CGROUP2_SUPER_MAGIC = 0x63677270 + CGROUP_SUPER_MAGIC = 0x27e0eb + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CODA_SUPER_MAGIC = 0x73757245 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRAMFS_MAGIC = 0x28cd3d45 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DAXFS_MAGIC = 0x64646178 + DEBUGFS_MAGIC = 0x64626720 + DEVPTS_SUPER_MAGIC = 0x1cd1 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + ECRYPTFS_SUPER_MAGIC = 0xf15f + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x80 + EFD_SEMAPHORE = 0x1 + EFIVARFS_MAGIC = 0xde5e81e4 + EFS_SUPER_MAGIC = 0x414a53 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXT2_SUPER_MAGIC = 0xef53 + EXT3_SUPER_MAGIC = 0xef53 + EXT4_SUPER_MAGIC = 0xef53 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + F2FS_SUPER_MAGIC = 0xf2f52010 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x2000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + FUTEXFS_SUPER_MAGIC = 0xbad1dea + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x21 + F_GETLK64 = 0x21 + F_GETOWN = 0x17 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x22 + F_SETLK64 = 0x22 + F_SETLKW = 0x23 + F_SETLKW64 = 0x23 + F_SETOWN = 0x18 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HOSTFS_SUPER_MAGIC = 0xc0ffee + HPFS_SUPER_MAGIC = 0xf995e849 + HUGETLBFS_MAGIC = 0x958458f6 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x100 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x80 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISOFS_SUPER_MAGIC = 0x9660 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + JFFS2_SUPER_MAGIC = 0x72b6 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_ANON = 0x800 + MAP_ANONYMOUS = 0x800 + MAP_DENYWRITE = 0x2000 + MAP_EXECUTABLE = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x1000 + MAP_HUGETLB = 0x80000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x8000 + MAP_NONBLOCK = 0x20000 + MAP_NORESERVE = 0x400 + MAP_POPULATE = 0x10000 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x800 + MAP_SHARED = 0x1 + MAP_STACK = 0x40000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MINIX2_SUPER_MAGIC = 0x2468 + MINIX2_SUPER_MAGIC2 = 0x2478 + MINIX3_SUPER_MAGIC = 0x4d5a + MINIX_SUPER_MAGIC = 0x137f + MINIX_SUPER_MAGIC2 = 0x138f + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSDOS_SUPER_MAGIC = 0x4d44 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + MTD_INODE_FS_MAGIC = 0x11307854 + NAME_MAX = 0xff + NCP_SUPER_MAGIC = 0x564c + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NFNETLINK_V0 = 0x0 + NFNLGRP_ACCT_QUOTA = 0x8 + NFNLGRP_CONNTRACK_DESTROY = 0x3 + NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 + NFNLGRP_CONNTRACK_EXP_NEW = 0x4 + NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 + NFNLGRP_CONNTRACK_NEW = 0x1 + NFNLGRP_CONNTRACK_UPDATE = 0x2 + NFNLGRP_MAX = 0x9 + NFNLGRP_NFTABLES = 0x7 + NFNLGRP_NFTRACE = 0x9 + NFNLGRP_NONE = 0x0 + NFNL_BATCH_MAX = 0x1 + NFNL_MSG_BATCH_BEGIN = 0x10 + NFNL_MSG_BATCH_END = 0x11 + NFNL_NFA_NEST = 0x8000 + NFNL_SUBSYS_ACCT = 0x7 + NFNL_SUBSYS_COUNT = 0xc + NFNL_SUBSYS_CTHELPER = 0x9 + NFNL_SUBSYS_CTNETLINK = 0x1 + NFNL_SUBSYS_CTNETLINK_EXP = 0x2 + NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 + NFNL_SUBSYS_IPSET = 0x6 + NFNL_SUBSYS_NFTABLES = 0xa + NFNL_SUBSYS_NFT_COMPAT = 0xb + NFNL_SUBSYS_NONE = 0x0 + NFNL_SUBSYS_OSF = 0x5 + NFNL_SUBSYS_QUEUE = 0x3 + NFNL_SUBSYS_ULOG = 0x4 + NFS_SUPER_MAGIC = 0x6969 + NILFS_SUPER_MAGIC = 0x3434 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + NSFS_MAGIC = 0x6e736673 + OCFS2_SUPER_MAGIC = 0x7461636f + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPENPROM_SUPER_MAGIC = 0x9fa1 + OPOST = 0x1 + OVERLAYFS_SUPER_MAGIC = 0x794c7630 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x1000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x100 + O_DIRECT = 0x8000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x10 + O_EXCL = 0x400 + O_FSYNC = 0x4010 + O_LARGEFILE = 0x2000 + O_NDELAY = 0x80 + O_NOATIME = 0x40000 + O_NOCTTY = 0x800 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x80 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x4010 + O_SYNC = 0x4010 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x20002401 + PERF_EVENT_IOC_ENABLE = 0x20002400 + PERF_EVENT_IOC_ID = 0x40042407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 + PERF_EVENT_IOC_PERIOD = 0x80082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc004240a + PERF_EVENT_IOC_REFRESH = 0x20002402 + PERF_EVENT_IOC_RESET = 0x20002403 + PERF_EVENT_IOC_SET_BPF = 0x80042408 + PERF_EVENT_IOC_SET_FILTER = 0x80042406 + PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 + PIPEFS_MAGIC = 0x50495045 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROC_SUPER_MAGIC = 0x9fa0 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PSTOREFS_MAGIC = 0x6165676c + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_GET_THREAD_AREA_3264 = 0xc4 + PTRACE_GET_WATCH_REGS = 0xd0 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKDATA_3264 = 0xc1 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKTEXT_3264 = 0xc0 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKEDATA_3264 = 0xc3 + PTRACE_POKETEXT = 0x4 + PTRACE_POKETEXT_3264 = 0xc2 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SET_WATCH_REGS = 0xd1 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + QNX4_SUPER_MAGIC = 0x2f + QNX6_SUPER_MAGIC = 0x68191122 + RAMFS_MAGIC = 0x858458f6 + RDTGROUP_SUPER_MAGIC = 0x7655821 + REISERFS_SUPER_MAGIC = 0x52654973 + RLIMIT_AS = 0x6 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x9 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x5 + RLIMIT_NPROC = 0x8 + RLIMIT_RSS = 0x7 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SECURITYFS_MAGIC = 0x73636673 + SELINUX_MAGIC = 0xf97cff8c + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x40047307 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x40047309 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x467f + SIOCOUTQ = 0x7472 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x80047308 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMACK_MAGIC = 0x43415d53 + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SMB_SUPER_MAGIC = 0x517b + SOCKFS_MAGIC = 0x534f434b + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x1 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x80 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x2 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0xffff + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1009 + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x20 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x1029 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0x100 + SO_PASSCRED = 0x11 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x12 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1e + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x1028 + SO_RCVBUF = 0x1002 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x1001 + SO_SNDBUFFORCE = 0x1f + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_STYLE = 0x1008 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x1008 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + SQUASHFS_MAGIC = 0x73717368 + STACK_END_MAGIC = 0x57ac6e9d + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + SYSFS_MAGIC = 0x62656572 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x5407 + TCGETA = 0x5401 + TCGETS = 0x540d + TCGETS2 = 0x4030542a + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x5410 + TCSBRK = 0x5405 + TCSBRKP = 0x5486 + TCSETA = 0x5402 + TCSETAF = 0x5404 + TCSETAW = 0x5403 + TCSETS = 0x540e + TCSETS2 = 0x8030542b + TCSETSF = 0x5410 + TCSETSF2 = 0x8030542d + TCSETSW = 0x540f + TCSETSW2 = 0x8030542c + TCXONC = 0x5406 + TIOCCBRK = 0x5428 + TIOCCONS = 0x80047478 + TIOCEXCL = 0x740d + TIOCGDEV = 0x40045432 + TIOCGETD = 0x7400 + TIOCGETP = 0x7408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x5492 + TIOCGLCKTRMIOS = 0x548b + TIOCGLTC = 0x7474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGPTPEER = 0x20005441 + TIOCGRS485 = 0x4020542e + TIOCGSERIAL = 0x5484 + TIOCGSID = 0x7416 + TIOCGSOFTCAR = 0x5481 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x467f + TIOCLINUX = 0x5483 + TIOCMBIC = 0x741c + TIOCMBIS = 0x741b + TIOCMGET = 0x741d + TIOCMIWAIT = 0x5491 + TIOCMSET = 0x741a + TIOCM_CAR = 0x100 + TIOCM_CD = 0x100 + TIOCM_CTS = 0x40 + TIOCM_DSR = 0x400 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x200 + TIOCM_RNG = 0x200 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x20 + TIOCM_ST = 0x10 + TIOCNOTTY = 0x5471 + TIOCNXCL = 0x740e + TIOCOUTQ = 0x7472 + TIOCPKT = 0x5470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x5480 + TIOCSERCONFIG = 0x5488 + TIOCSERGETLSR = 0x548e + TIOCSERGETMULTI = 0x548f + TIOCSERGSTRUCT = 0x548d + TIOCSERGWILD = 0x5489 + TIOCSERSETMULTI = 0x5490 + TIOCSERSWILD = 0x548a + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x7401 + TIOCSETN = 0x740a + TIOCSETP = 0x7409 + TIOCSIG = 0x80045436 + TIOCSLCKTRMIOS = 0x548c + TIOCSLTC = 0x7475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0xc020542f + TIOCSSERIAL = 0x5485 + TIOCSSOFTCAR = 0x5482 + TIOCSTI = 0x5472 + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TMPFS_MAGIC = 0x1021994 + TOSTOP = 0x8000 + TPACKET_ALIGNMENT = 0x10 + TPACKET_HDRLEN = 0x34 + TP_STATUS_AVAILABLE = 0x0 + TP_STATUS_BLK_TMO = 0x20 + TP_STATUS_COPY = 0x2 + TP_STATUS_CSUMNOTREADY = 0x8 + TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_KERNEL = 0x0 + TP_STATUS_LOSING = 0x4 + TP_STATUS_SENDING = 0x2 + TP_STATUS_SEND_REQUEST = 0x1 + TP_STATUS_TS_RAW_HARDWARE = -0x80000000 + TP_STATUS_TS_SOFTWARE = 0x20000000 + TP_STATUS_TS_SYS_HARDWARE = 0x40000000 + TP_STATUS_USER = 0x1 + TP_STATUS_VLAN_TPID_VALID = 0x40 + TP_STATUS_VLAN_VALID = 0x10 + TP_STATUS_WRONG_FORMAT = 0x4 + TRACEFS_MAGIC = 0x74726163 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x800854d5 + TUNDETACHFILTER = 0x800854d6 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x400854db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETDEBUG = 0x800454c9 + TUNSETFILTEREBPF = 0x400454e1 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETSTEERINGEBPF = 0x400454e0 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + UDF_SUPER_MAGIC = 0x15013346 + UMOUNT_NOFOLLOW = 0x8 + USBDEVICE_SUPER_MAGIC = 0x9fa2 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + V9FS_MAGIC = 0x1021997 + VDISCARD = 0xd + VEOF = 0x10 + VEOL = 0x11 + VEOL2 = 0x6 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x4 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VSWTCH = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x40045702 + WDIOC_GETPRETIMEOUT = 0x40045709 + WDIOC_GETSTATUS = 0x40045701 + WDIOC_GETSUPPORT = 0x40285700 + WDIOC_GETTEMP = 0x40045703 + WDIOC_GETTIMELEFT = 0x4004570a + WDIOC_GETTIMEOUT = 0x40045707 + WDIOC_KEEPALIVE = 0x40045705 + WDIOC_SETOPTIONS = 0x40045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x20 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XENFS_SUPER_MAGIC = 0xabba1974 + XTABS = 0x1800 + ZSMALLOC_MAGIC = 0x58295829 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x7d) + EADDRNOTAVAIL = syscall.Errno(0x7e) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x7c) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x95) + EBADE = syscall.Errno(0x32) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x51) + EBADMSG = syscall.Errno(0x4d) + EBADR = syscall.Errno(0x33) + EBADRQC = syscall.Errno(0x36) + EBADSLT = syscall.Errno(0x37) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x9e) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x25) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x82) + ECONNREFUSED = syscall.Errno(0x92) + ECONNRESET = syscall.Errno(0x83) + EDEADLK = syscall.Errno(0x2d) + EDEADLOCK = syscall.Errno(0x38) + EDESTADDRREQ = syscall.Errno(0x60) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x46d) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x93) + EHOSTUNREACH = syscall.Errno(0x94) + EHWPOISON = syscall.Errno(0xa8) + EIDRM = syscall.Errno(0x24) + EILSEQ = syscall.Errno(0x58) + EINIT = syscall.Errno(0x8d) + EINPROGRESS = syscall.Errno(0x96) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x85) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x8b) + EKEYEXPIRED = syscall.Errno(0xa2) + EKEYREJECTED = syscall.Errno(0xa4) + EKEYREVOKED = syscall.Errno(0xa3) + EL2HLT = syscall.Errno(0x2c) + EL2NSYNC = syscall.Errno(0x26) + EL3HLT = syscall.Errno(0x27) + EL3RST = syscall.Errno(0x28) + ELIBACC = syscall.Errno(0x53) + ELIBBAD = syscall.Errno(0x54) + ELIBEXEC = syscall.Errno(0x57) + ELIBMAX = syscall.Errno(0x56) + ELIBSCN = syscall.Errno(0x55) + ELNRNG = syscall.Errno(0x29) + ELOOP = syscall.Errno(0x5a) + EMEDIUMTYPE = syscall.Errno(0xa0) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x61) + EMULTIHOP = syscall.Errno(0x4a) + ENAMETOOLONG = syscall.Errno(0x4e) + ENAVAIL = syscall.Errno(0x8a) + ENETDOWN = syscall.Errno(0x7f) + ENETRESET = syscall.Errno(0x81) + ENETUNREACH = syscall.Errno(0x80) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x35) + ENOBUFS = syscall.Errno(0x84) + ENOCSI = syscall.Errno(0x2b) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0xa1) + ENOLCK = syscall.Errno(0x2e) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x9f) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x23) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x63) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x59) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x86) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x5d) + ENOTNAM = syscall.Errno(0x89) + ENOTRECOVERABLE = syscall.Errno(0xa6) + ENOTSOCK = syscall.Errno(0x5f) + ENOTSUP = syscall.Errno(0x7a) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x50) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x7a) + EOVERFLOW = syscall.Errno(0x4f) + EOWNERDEAD = syscall.Errno(0xa5) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x7b) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x78) + EPROTOTYPE = syscall.Errno(0x62) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x52) + EREMDEV = syscall.Errno(0x8e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x8c) + ERESTART = syscall.Errno(0x5b) + ERFKILL = syscall.Errno(0xa7) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x8f) + ESOCKTNOSUPPORT = syscall.Errno(0x79) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x97) + ESTRPIPE = syscall.Errno(0x5c) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x91) + ETOOMANYREFS = syscall.Errno(0x90) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x87) + EUNATCH = syscall.Errno(0x2a) + EUSERS = syscall.Errno(0x5e) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x34) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x12) + SIGCLD = syscall.Signal(0x12) + SIGCONT = syscall.Signal(0x19) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x16) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x16) + SIGPROF = syscall.Signal(0x1d) + SIGPWR = syscall.Signal(0x13) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x17) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x18) + SIGTTIN = syscall.Signal(0x1a) + SIGTTOU = syscall.Signal(0x1b) + SIGURG = syscall.Signal(0x15) + SIGUSR1 = syscall.Signal(0x10) + SIGUSR2 = syscall.Signal(0x11) + SIGVTALRM = syscall.Signal(0x1c) + SIGWINCH = syscall.Signal(0x14) + SIGXCPU = syscall.Signal(0x1e) + SIGXFSZ = syscall.Signal(0x1f) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "no such device or address"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EAGAIN", "resource temporarily unavailable"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device or resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "invalid cross-device link"}, + {19, "ENODEV", "no such device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "numerical result out of range"}, + {35, "ENOMSG", "no message of desired type"}, + {36, "EIDRM", "identifier removed"}, + {37, "ECHRNG", "channel number out of range"}, + {38, "EL2NSYNC", "level 2 not synchronized"}, + {39, "EL3HLT", "level 3 halted"}, + {40, "EL3RST", "level 3 reset"}, + {41, "ELNRNG", "link number out of range"}, + {42, "EUNATCH", "protocol driver not attached"}, + {43, "ENOCSI", "no CSI structure available"}, + {44, "EL2HLT", "level 2 halted"}, + {45, "EDEADLK", "resource deadlock avoided"}, + {46, "ENOLCK", "no locks available"}, + {50, "EBADE", "invalid exchange"}, + {51, "EBADR", "invalid request descriptor"}, + {52, "EXFULL", "exchange full"}, + {53, "ENOANO", "no anode"}, + {54, "EBADRQC", "invalid request code"}, + {55, "EBADSLT", "invalid slot"}, + {56, "EDEADLOCK", "file locking deadlock error"}, + {59, "EBFONT", "bad font file format"}, + {60, "ENOSTR", "device not a stream"}, + {61, "ENODATA", "no data available"}, + {62, "ETIME", "timer expired"}, + {63, "ENOSR", "out of streams resources"}, + {64, "ENONET", "machine is not on the network"}, + {65, "ENOPKG", "package not installed"}, + {66, "EREMOTE", "object is remote"}, + {67, "ENOLINK", "link has been severed"}, + {68, "EADV", "advertise error"}, + {69, "ESRMNT", "srmount error"}, + {70, "ECOMM", "communication error on send"}, + {71, "EPROTO", "protocol error"}, + {73, "EDOTDOT", "RFS specific error"}, + {74, "EMULTIHOP", "multihop attempted"}, + {77, "EBADMSG", "bad message"}, + {78, "ENAMETOOLONG", "file name too long"}, + {79, "EOVERFLOW", "value too large for defined data type"}, + {80, "ENOTUNIQ", "name not unique on network"}, + {81, "EBADFD", "file descriptor in bad state"}, + {82, "EREMCHG", "remote address changed"}, + {83, "ELIBACC", "can not access a needed shared library"}, + {84, "ELIBBAD", "accessing a corrupted shared library"}, + {85, "ELIBSCN", ".lib section in a.out corrupted"}, + {86, "ELIBMAX", "attempting to link in too many shared libraries"}, + {87, "ELIBEXEC", "cannot exec a shared library directly"}, + {88, "EILSEQ", "invalid or incomplete multibyte or wide character"}, + {89, "ENOSYS", "function not implemented"}, + {90, "ELOOP", "too many levels of symbolic links"}, + {91, "ERESTART", "interrupted system call should be restarted"}, + {92, "ESTRPIPE", "streams pipe error"}, + {93, "ENOTEMPTY", "directory not empty"}, + {94, "EUSERS", "too many users"}, + {95, "ENOTSOCK", "socket operation on non-socket"}, + {96, "EDESTADDRREQ", "destination address required"}, + {97, "EMSGSIZE", "message too long"}, + {98, "EPROTOTYPE", "protocol wrong type for socket"}, + {99, "ENOPROTOOPT", "protocol not available"}, + {120, "EPROTONOSUPPORT", "protocol not supported"}, + {121, "ESOCKTNOSUPPORT", "socket type not supported"}, + {122, "ENOTSUP", "operation not supported"}, + {123, "EPFNOSUPPORT", "protocol family not supported"}, + {124, "EAFNOSUPPORT", "address family not supported by protocol"}, + {125, "EADDRINUSE", "address already in use"}, + {126, "EADDRNOTAVAIL", "cannot assign requested address"}, + {127, "ENETDOWN", "network is down"}, + {128, "ENETUNREACH", "network is unreachable"}, + {129, "ENETRESET", "network dropped connection on reset"}, + {130, "ECONNABORTED", "software caused connection abort"}, + {131, "ECONNRESET", "connection reset by peer"}, + {132, "ENOBUFS", "no buffer space available"}, + {133, "EISCONN", "transport endpoint is already connected"}, + {134, "ENOTCONN", "transport endpoint is not connected"}, + {135, "EUCLEAN", "structure needs cleaning"}, + {137, "ENOTNAM", "not a XENIX named type file"}, + {138, "ENAVAIL", "no XENIX semaphores available"}, + {139, "EISNAM", "is a named type file"}, + {140, "EREMOTEIO", "remote I/O error"}, + {141, "EINIT", "unknown error 141"}, + {142, "EREMDEV", "unknown error 142"}, + {143, "ESHUTDOWN", "cannot send after transport endpoint shutdown"}, + {144, "ETOOMANYREFS", "too many references: cannot splice"}, + {145, "ETIMEDOUT", "connection timed out"}, + {146, "ECONNREFUSED", "connection refused"}, + {147, "EHOSTDOWN", "host is down"}, + {148, "EHOSTUNREACH", "no route to host"}, + {149, "EALREADY", "operation already in progress"}, + {150, "EINPROGRESS", "operation now in progress"}, + {151, "ESTALE", "stale file handle"}, + {158, "ECANCELED", "operation canceled"}, + {159, "ENOMEDIUM", "no medium found"}, + {160, "EMEDIUMTYPE", "wrong medium type"}, + {161, "ENOKEY", "required key not available"}, + {162, "EKEYEXPIRED", "key has expired"}, + {163, "EKEYREVOKED", "key has been revoked"}, + {164, "EKEYREJECTED", "key was rejected by service"}, + {165, "EOWNERDEAD", "owner died"}, + {166, "ENOTRECOVERABLE", "state not recoverable"}, + {167, "ERFKILL", "operation not possible due to RF-kill"}, + {168, "EHWPOISON", "memory page has hardware error"}, + {1133, "EDQUOT", "disk quota exceeded"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/breakpoint trap"}, + {6, "SIGABRT", "aborted"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGUSR1", "user defined signal 1"}, + {17, "SIGUSR2", "user defined signal 2"}, + {18, "SIGCHLD", "child exited"}, + {19, "SIGPWR", "power failure"}, + {20, "SIGWINCH", "window changed"}, + {21, "SIGURG", "urgent I/O condition"}, + {22, "SIGIO", "I/O possible"}, + {23, "SIGSTOP", "stopped (signal)"}, + {24, "SIGTSTP", "stopped"}, + {25, "SIGCONT", "continued"}, + {26, "SIGTTIN", "stopped (tty input)"}, + {27, "SIGTTOU", "stopped (tty output)"}, + {28, "SIGVTALRM", "virtual timer expired"}, + {29, "SIGPROF", "profiling timer expired"}, + {30, "SIGXCPU", "CPU time limit exceeded"}, + {31, "SIGXFSZ", "file size limit exceeded"}, +} diff --git a/api/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go b/api/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go new file mode 100644 index 0000000..710410e --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go @@ -0,0 +1,2626 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build ppc64,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go + +package unix + +import "syscall" + +const ( + AAFS_MAGIC = 0x5a3c69f0 + ADFS_SUPER_MAGIC = 0xadf5 + AFFS_SUPER_MAGIC = 0xadff + AFS_FS_MAGIC = 0x6b414653 + AFS_SUPER_MAGIC = 0x5346414f + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ANON_INODE_FS_MAGIC = 0x9041934 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + AUTOFS_SUPER_MAGIC = 0x187 + B0 = 0x0 + B1000000 = 0x17 + B110 = 0x3 + B115200 = 0x11 + B1152000 = 0x18 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x19 + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x1a + B230400 = 0x12 + B2400 = 0xb + B2500000 = 0x1b + B300 = 0x7 + B3000000 = 0x1c + B3500000 = 0x1d + B38400 = 0xf + B4000000 = 0x1e + B460800 = 0x13 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x14 + B57600 = 0x10 + B576000 = 0x15 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x16 + B9600 = 0xd + BALLOON_KVM_MAGIC = 0x13661366 + BDEVFS_MAGIC = 0x62646576 + BINFMTFS_MAGIC = 0x42494e4d + BLKBSZGET = 0x40081270 + BLKBSZSET = 0x80081271 + BLKFLSBUF = 0x20001261 + BLKFRAGET = 0x20001265 + BLKFRASET = 0x20001264 + BLKGETSIZE = 0x20001260 + BLKGETSIZE64 = 0x40081272 + BLKPBSZGET = 0x2000127b + BLKRAGET = 0x20001263 + BLKRASET = 0x20001262 + BLKROGET = 0x2000125e + BLKROSET = 0x2000125d + BLKRRPART = 0x2000125f + BLKSECTGET = 0x20001267 + BLKSECTSET = 0x20001266 + BLKSSZGET = 0x20001268 + BOTHER = 0x1f + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_FS_MAGIC = 0xcafe4a11 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x8000 + BSDLY = 0x8000 + BTRFS_SUPER_MAGIC = 0x9123683e + BTRFS_TEST_MAGIC = 0x73727279 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0xff + CBAUDEX = 0x0 + CFLUSH = 0xf + CGROUP2_SUPER_MAGIC = 0x63677270 + CGROUP_SUPER_MAGIC = 0x27e0eb + CIBAUD = 0xff0000 + CLOCAL = 0x8000 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CODA_SUPER_MAGIC = 0x73757245 + CR0 = 0x0 + CR1 = 0x1000 + CR2 = 0x2000 + CR3 = 0x3000 + CRAMFS_MAGIC = 0x28cd3d45 + CRDLY = 0x3000 + CREAD = 0x800 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIGNAL = 0xff + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + DAXFS_MAGIC = 0x64646178 + DEBUGFS_MAGIC = 0x64626720 + DEVPTS_SUPER_MAGIC = 0x1cd1 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + ECRYPTFS_SUPER_MAGIC = 0xf15f + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + EFIVARFS_MAGIC = 0xde5e81e4 + EFS_SUPER_MAGIC = 0x414a53 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXT2_SUPER_MAGIC = 0xef53 + EXT3_SUPER_MAGIC = 0xef53 + EXT4_SUPER_MAGIC = 0xef53 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000000 + F2FS_SUPER_MAGIC = 0xf2f52010 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x4000 + FFDLY = 0x4000 + FLUSHO = 0x800000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + FUTEXFS_SUPER_MAGIC = 0xbad1dea + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x5 + F_GETLK64 = 0xc + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0xd + F_SETLKW = 0x7 + F_SETLKW64 = 0xe + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HOSTFS_SUPER_MAGIC = 0xc0ffee + HPFS_SUPER_MAGIC = 0xf995e849 + HUGETLBFS_MAGIC = 0x958458f6 + HUPCL = 0x4000 + IBSHIFT = 0x10 + ICANON = 0x100 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x400 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x80 + ISOFS_SUPER_MAGIC = 0x9660 + ISTRIP = 0x20 + IUCLC = 0x1000 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + JFFS2_SUPER_MAGIC = 0x72b6 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x80 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x40 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x2000 + MCL_FUTURE = 0x4000 + MCL_ONFAULT = 0x8000 + MINIX2_SUPER_MAGIC = 0x2468 + MINIX2_SUPER_MAGIC2 = 0x2478 + MINIX3_SUPER_MAGIC = 0x4d5a + MINIX_SUPER_MAGIC = 0x137f + MINIX_SUPER_MAGIC2 = 0x138f + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSDOS_SUPER_MAGIC = 0x4d44 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + MTD_INODE_FS_MAGIC = 0x11307854 + NAME_MAX = 0xff + NCP_SUPER_MAGIC = 0x564c + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NFNETLINK_V0 = 0x0 + NFNLGRP_ACCT_QUOTA = 0x8 + NFNLGRP_CONNTRACK_DESTROY = 0x3 + NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 + NFNLGRP_CONNTRACK_EXP_NEW = 0x4 + NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 + NFNLGRP_CONNTRACK_NEW = 0x1 + NFNLGRP_CONNTRACK_UPDATE = 0x2 + NFNLGRP_MAX = 0x9 + NFNLGRP_NFTABLES = 0x7 + NFNLGRP_NFTRACE = 0x9 + NFNLGRP_NONE = 0x0 + NFNL_BATCH_MAX = 0x1 + NFNL_MSG_BATCH_BEGIN = 0x10 + NFNL_MSG_BATCH_END = 0x11 + NFNL_NFA_NEST = 0x8000 + NFNL_SUBSYS_ACCT = 0x7 + NFNL_SUBSYS_COUNT = 0xc + NFNL_SUBSYS_CTHELPER = 0x9 + NFNL_SUBSYS_CTNETLINK = 0x1 + NFNL_SUBSYS_CTNETLINK_EXP = 0x2 + NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 + NFNL_SUBSYS_IPSET = 0x6 + NFNL_SUBSYS_NFTABLES = 0xa + NFNL_SUBSYS_NFT_COMPAT = 0xb + NFNL_SUBSYS_NONE = 0x0 + NFNL_SUBSYS_OSF = 0x5 + NFNL_SUBSYS_QUEUE = 0x3 + NFNL_SUBSYS_ULOG = 0x4 + NFS_SUPER_MAGIC = 0x6969 + NILFS_SUPER_MAGIC = 0x3434 + NL0 = 0x0 + NL1 = 0x100 + NL2 = 0x200 + NL3 = 0x300 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x300 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80000000 + NSFS_MAGIC = 0x6e736673 + OCFS2_SUPER_MAGIC = 0x7461636f + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x4 + ONLCR = 0x2 + ONLRET = 0x20 + ONOCR = 0x10 + OPENPROM_SUPER_MAGIC = 0x9fa1 + OPOST = 0x1 + OVERLAYFS_SUPER_MAGIC = 0x794c7630 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x20000 + O_DIRECTORY = 0x4000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x8000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x404000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x1000 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PERF_EVENT_IOC_DISABLE = 0x20002401 + PERF_EVENT_IOC_ENABLE = 0x20002400 + PERF_EVENT_IOC_ID = 0x40082407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 + PERF_EVENT_IOC_PERIOD = 0x80082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc008240a + PERF_EVENT_IOC_REFRESH = 0x20002402 + PERF_EVENT_IOC_RESET = 0x20002403 + PERF_EVENT_IOC_SET_BPF = 0x80042408 + PERF_EVENT_IOC_SET_FILTER = 0x80082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 + PIPEFS_MAGIC = 0x50495045 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROC_SUPER_MAGIC = 0x9fa0 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_SAO = 0x10 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffffffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PSTOREFS_MAGIC = 0x6165676c + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETEVRREGS = 0x14 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGS64 = 0x16 + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GETVRREGS = 0x12 + PTRACE_GETVSRREGS = 0x1b + PTRACE_GET_DEBUGREG = 0x19 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETEVRREGS = 0x15 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGS64 = 0x17 + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SETVRREGS = 0x13 + PTRACE_SETVSRREGS = 0x1c + PTRACE_SET_DEBUGREG = 0x1a + PTRACE_SINGLEBLOCK = 0x100 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + PT_CCR = 0x26 + PT_CTR = 0x23 + PT_DAR = 0x29 + PT_DSCR = 0x2c + PT_DSISR = 0x2a + PT_FPR0 = 0x30 + PT_FPSCR = 0x50 + PT_LNK = 0x24 + PT_MSR = 0x21 + PT_NIP = 0x20 + PT_ORIG_R3 = 0x22 + PT_R0 = 0x0 + PT_R1 = 0x1 + PT_R10 = 0xa + PT_R11 = 0xb + PT_R12 = 0xc + PT_R13 = 0xd + PT_R14 = 0xe + PT_R15 = 0xf + PT_R16 = 0x10 + PT_R17 = 0x11 + PT_R18 = 0x12 + PT_R19 = 0x13 + PT_R2 = 0x2 + PT_R20 = 0x14 + PT_R21 = 0x15 + PT_R22 = 0x16 + PT_R23 = 0x17 + PT_R24 = 0x18 + PT_R25 = 0x19 + PT_R26 = 0x1a + PT_R27 = 0x1b + PT_R28 = 0x1c + PT_R29 = 0x1d + PT_R3 = 0x3 + PT_R30 = 0x1e + PT_R31 = 0x1f + PT_R4 = 0x4 + PT_R5 = 0x5 + PT_R6 = 0x6 + PT_R7 = 0x7 + PT_R8 = 0x8 + PT_R9 = 0x9 + PT_REGS_COUNT = 0x2c + PT_RESULT = 0x2b + PT_SOFTE = 0x27 + PT_TRAP = 0x28 + PT_VR0 = 0x52 + PT_VRSAVE = 0x94 + PT_VSCR = 0x93 + PT_VSR0 = 0x96 + PT_VSR31 = 0xd4 + PT_XER = 0x25 + QNX4_SUPER_MAGIC = 0x2f + QNX6_SUPER_MAGIC = 0x68191122 + RAMFS_MAGIC = 0x858458f6 + RDTGROUP_SUPER_MAGIC = 0x7655821 + REISERFS_SUPER_MAGIC = 0x52654973 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SECURITYFS_MAGIC = 0x73636673 + SELINUX_MAGIC = 0xf97cff8c + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x4004667f + SIOCOUTQ = 0x40047473 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMACK_MAGIC = 0x43415d53 + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SMB_SUPER_MAGIC = 0x517b + SOCKFS_MAGIC = 0x534f434b + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x14 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x15 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x10 + SO_RCVTIMEO = 0x12 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x11 + SO_SNDTIMEO = 0x13 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + SQUASHFS_MAGIC = 0x73717368 + STACK_END_MAGIC = 0x57ac6e9d + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + SYSFS_MAGIC = 0x62656572 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x400 + TAB2 = 0x800 + TAB3 = 0xc00 + TABDLY = 0xc00 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x2000741f + TCGETA = 0x40147417 + TCGETS = 0x402c7413 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x2000741d + TCSBRKP = 0x5425 + TCSETA = 0x80147418 + TCSETAF = 0x8014741c + TCSETAW = 0x80147419 + TCSETS = 0x802c7414 + TCSETSF = 0x802c7416 + TCSETSW = 0x802c7415 + TCXONC = 0x2000741e + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x40045432 + TIOCGETC = 0x40067412 + TIOCGETD = 0x5424 + TIOCGETP = 0x40067408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGLTC = 0x40067474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGPTPEER = 0x20005441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x4004667f + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_LOOP = 0x8000 + TIOCM_OUT1 = 0x2000 + TIOCM_OUT2 = 0x4000 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETC = 0x80067411 + TIOCSETD = 0x5423 + TIOCSETN = 0x8006740a + TIOCSETP = 0x80067409 + TIOCSIG = 0x80045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSLTC = 0x80067475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTART = 0x2000746e + TIOCSTI = 0x5412 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TMPFS_MAGIC = 0x1021994 + TOSTOP = 0x400000 + TPACKET_ALIGNMENT = 0x10 + TPACKET_HDRLEN = 0x34 + TP_STATUS_AVAILABLE = 0x0 + TP_STATUS_BLK_TMO = 0x20 + TP_STATUS_COPY = 0x2 + TP_STATUS_CSUMNOTREADY = 0x8 + TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_KERNEL = 0x0 + TP_STATUS_LOSING = 0x4 + TP_STATUS_SENDING = 0x2 + TP_STATUS_SEND_REQUEST = 0x1 + TP_STATUS_TS_RAW_HARDWARE = -0x80000000 + TP_STATUS_TS_SOFTWARE = 0x20000000 + TP_STATUS_TS_SYS_HARDWARE = 0x40000000 + TP_STATUS_USER = 0x1 + TP_STATUS_VLAN_TPID_VALID = 0x40 + TP_STATUS_VLAN_VALID = 0x10 + TP_STATUS_WRONG_FORMAT = 0x4 + TRACEFS_MAGIC = 0x74726163 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x801054d5 + TUNDETACHFILTER = 0x801054d6 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x401054db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETDEBUG = 0x800454c9 + TUNSETFILTEREBPF = 0x400454e1 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETSTEERINGEBPF = 0x400454e0 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + UDF_SUPER_MAGIC = 0x15013346 + UMOUNT_NOFOLLOW = 0x8 + USBDEVICE_SUPER_MAGIC = 0x9fa2 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + V9FS_MAGIC = 0x1021997 + VDISCARD = 0x10 + VEOF = 0x4 + VEOL = 0x6 + VEOL2 = 0x8 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x5 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xb + VSTART = 0xd + VSTOP = 0xe + VSUSP = 0xc + VSWTC = 0x9 + VT0 = 0x0 + VT1 = 0x10000 + VTDLY = 0x10000 + VTIME = 0x7 + VWERASE = 0xa + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x40045702 + WDIOC_GETPRETIMEOUT = 0x40045709 + WDIOC_GETSTATUS = 0x40045701 + WDIOC_GETSUPPORT = 0x40285700 + WDIOC_GETTEMP = 0x40045703 + WDIOC_GETTIMELEFT = 0x4004570a + WDIOC_GETTIMEOUT = 0x40045707 + WDIOC_KEEPALIVE = 0x40045705 + WDIOC_SETOPTIONS = 0x40045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4000 + XENFS_SUPER_MAGIC = 0xabba1974 + XTABS = 0xc00 + ZSMALLOC_MAGIC = 0x58295829 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x62) + EADDRNOTAVAIL = syscall.Errno(0x63) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x61) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x72) + EBADE = syscall.Errno(0x34) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x4d) + EBADMSG = syscall.Errno(0x4a) + EBADR = syscall.Errno(0x35) + EBADRQC = syscall.Errno(0x38) + EBADSLT = syscall.Errno(0x39) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7d) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x2c) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x67) + ECONNREFUSED = syscall.Errno(0x6f) + ECONNRESET = syscall.Errno(0x68) + EDEADLK = syscall.Errno(0x23) + EDEADLOCK = syscall.Errno(0x3a) + EDESTADDRREQ = syscall.Errno(0x59) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x7a) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x70) + EHOSTUNREACH = syscall.Errno(0x71) + EHWPOISON = syscall.Errno(0x85) + EIDRM = syscall.Errno(0x2b) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x73) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x6a) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x7f) + EKEYREJECTED = syscall.Errno(0x81) + EKEYREVOKED = syscall.Errno(0x80) + EL2HLT = syscall.Errno(0x33) + EL2NSYNC = syscall.Errno(0x2d) + EL3HLT = syscall.Errno(0x2e) + EL3RST = syscall.Errno(0x2f) + ELIBACC = syscall.Errno(0x4f) + ELIBBAD = syscall.Errno(0x50) + ELIBEXEC = syscall.Errno(0x53) + ELIBMAX = syscall.Errno(0x52) + ELIBSCN = syscall.Errno(0x51) + ELNRNG = syscall.Errno(0x30) + ELOOP = syscall.Errno(0x28) + EMEDIUMTYPE = syscall.Errno(0x7c) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x5a) + EMULTIHOP = syscall.Errno(0x48) + ENAMETOOLONG = syscall.Errno(0x24) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x64) + ENETRESET = syscall.Errno(0x66) + ENETUNREACH = syscall.Errno(0x65) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x37) + ENOBUFS = syscall.Errno(0x69) + ENOCSI = syscall.Errno(0x32) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x7e) + ENOLCK = syscall.Errno(0x25) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x7b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x2a) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x5c) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x26) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x6b) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x27) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x83) + ENOTSOCK = syscall.Errno(0x58) + ENOTSUP = syscall.Errno(0x5f) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x4c) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x5f) + EOVERFLOW = syscall.Errno(0x4b) + EOWNERDEAD = syscall.Errno(0x82) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x60) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x5d) + EPROTOTYPE = syscall.Errno(0x5b) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x4e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x55) + ERFKILL = syscall.Errno(0x84) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x6c) + ESOCKTNOSUPPORT = syscall.Errno(0x5e) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x74) + ESTRPIPE = syscall.Errno(0x56) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x6e) + ETOOMANYREFS = syscall.Errno(0x6d) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x31) + EUSERS = syscall.Errno(0x57) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x36) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0x7) + SIGCHLD = syscall.Signal(0x11) + SIGCLD = syscall.Signal(0x11) + SIGCONT = syscall.Signal(0x12) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x1d) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x1d) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1e) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTKFLT = syscall.Signal(0x10) + SIGSTOP = syscall.Signal(0x13) + SIGSYS = syscall.Signal(0x1f) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x14) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x17) + SIGUSR1 = syscall.Signal(0xa) + SIGUSR2 = syscall.Signal(0xc) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "no such device or address"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EAGAIN", "resource temporarily unavailable"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device or resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "invalid cross-device link"}, + {19, "ENODEV", "no such device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "numerical result out of range"}, + {35, "EDEADLK", "resource deadlock avoided"}, + {36, "ENAMETOOLONG", "file name too long"}, + {37, "ENOLCK", "no locks available"}, + {38, "ENOSYS", "function not implemented"}, + {39, "ENOTEMPTY", "directory not empty"}, + {40, "ELOOP", "too many levels of symbolic links"}, + {42, "ENOMSG", "no message of desired type"}, + {43, "EIDRM", "identifier removed"}, + {44, "ECHRNG", "channel number out of range"}, + {45, "EL2NSYNC", "level 2 not synchronized"}, + {46, "EL3HLT", "level 3 halted"}, + {47, "EL3RST", "level 3 reset"}, + {48, "ELNRNG", "link number out of range"}, + {49, "EUNATCH", "protocol driver not attached"}, + {50, "ENOCSI", "no CSI structure available"}, + {51, "EL2HLT", "level 2 halted"}, + {52, "EBADE", "invalid exchange"}, + {53, "EBADR", "invalid request descriptor"}, + {54, "EXFULL", "exchange full"}, + {55, "ENOANO", "no anode"}, + {56, "EBADRQC", "invalid request code"}, + {57, "EBADSLT", "invalid slot"}, + {58, "EDEADLOCK", "file locking deadlock error"}, + {59, "EBFONT", "bad font file format"}, + {60, "ENOSTR", "device not a stream"}, + {61, "ENODATA", "no data available"}, + {62, "ETIME", "timer expired"}, + {63, "ENOSR", "out of streams resources"}, + {64, "ENONET", "machine is not on the network"}, + {65, "ENOPKG", "package not installed"}, + {66, "EREMOTE", "object is remote"}, + {67, "ENOLINK", "link has been severed"}, + {68, "EADV", "advertise error"}, + {69, "ESRMNT", "srmount error"}, + {70, "ECOMM", "communication error on send"}, + {71, "EPROTO", "protocol error"}, + {72, "EMULTIHOP", "multihop attempted"}, + {73, "EDOTDOT", "RFS specific error"}, + {74, "EBADMSG", "bad message"}, + {75, "EOVERFLOW", "value too large for defined data type"}, + {76, "ENOTUNIQ", "name not unique on network"}, + {77, "EBADFD", "file descriptor in bad state"}, + {78, "EREMCHG", "remote address changed"}, + {79, "ELIBACC", "can not access a needed shared library"}, + {80, "ELIBBAD", "accessing a corrupted shared library"}, + {81, "ELIBSCN", ".lib section in a.out corrupted"}, + {82, "ELIBMAX", "attempting to link in too many shared libraries"}, + {83, "ELIBEXEC", "cannot exec a shared library directly"}, + {84, "EILSEQ", "invalid or incomplete multibyte or wide character"}, + {85, "ERESTART", "interrupted system call should be restarted"}, + {86, "ESTRPIPE", "streams pipe error"}, + {87, "EUSERS", "too many users"}, + {88, "ENOTSOCK", "socket operation on non-socket"}, + {89, "EDESTADDRREQ", "destination address required"}, + {90, "EMSGSIZE", "message too long"}, + {91, "EPROTOTYPE", "protocol wrong type for socket"}, + {92, "ENOPROTOOPT", "protocol not available"}, + {93, "EPROTONOSUPPORT", "protocol not supported"}, + {94, "ESOCKTNOSUPPORT", "socket type not supported"}, + {95, "ENOTSUP", "operation not supported"}, + {96, "EPFNOSUPPORT", "protocol family not supported"}, + {97, "EAFNOSUPPORT", "address family not supported by protocol"}, + {98, "EADDRINUSE", "address already in use"}, + {99, "EADDRNOTAVAIL", "cannot assign requested address"}, + {100, "ENETDOWN", "network is down"}, + {101, "ENETUNREACH", "network is unreachable"}, + {102, "ENETRESET", "network dropped connection on reset"}, + {103, "ECONNABORTED", "software caused connection abort"}, + {104, "ECONNRESET", "connection reset by peer"}, + {105, "ENOBUFS", "no buffer space available"}, + {106, "EISCONN", "transport endpoint is already connected"}, + {107, "ENOTCONN", "transport endpoint is not connected"}, + {108, "ESHUTDOWN", "cannot send after transport endpoint shutdown"}, + {109, "ETOOMANYREFS", "too many references: cannot splice"}, + {110, "ETIMEDOUT", "connection timed out"}, + {111, "ECONNREFUSED", "connection refused"}, + {112, "EHOSTDOWN", "host is down"}, + {113, "EHOSTUNREACH", "no route to host"}, + {114, "EALREADY", "operation already in progress"}, + {115, "EINPROGRESS", "operation now in progress"}, + {116, "ESTALE", "stale file handle"}, + {117, "EUCLEAN", "structure needs cleaning"}, + {118, "ENOTNAM", "not a XENIX named type file"}, + {119, "ENAVAIL", "no XENIX semaphores available"}, + {120, "EISNAM", "is a named type file"}, + {121, "EREMOTEIO", "remote I/O error"}, + {122, "EDQUOT", "disk quota exceeded"}, + {123, "ENOMEDIUM", "no medium found"}, + {124, "EMEDIUMTYPE", "wrong medium type"}, + {125, "ECANCELED", "operation canceled"}, + {126, "ENOKEY", "required key not available"}, + {127, "EKEYEXPIRED", "key has expired"}, + {128, "EKEYREVOKED", "key has been revoked"}, + {129, "EKEYREJECTED", "key was rejected by service"}, + {130, "EOWNERDEAD", "owner died"}, + {131, "ENOTRECOVERABLE", "state not recoverable"}, + {132, "ERFKILL", "operation not possible due to RF-kill"}, + {133, "EHWPOISON", "memory page has hardware error"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/breakpoint trap"}, + {6, "SIGABRT", "aborted"}, + {7, "SIGBUS", "bus error"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGUSR1", "user defined signal 1"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGUSR2", "user defined signal 2"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGSTKFLT", "stack fault"}, + {17, "SIGCHLD", "child exited"}, + {18, "SIGCONT", "continued"}, + {19, "SIGSTOP", "stopped (signal)"}, + {20, "SIGTSTP", "stopped"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGURG", "urgent I/O condition"}, + {24, "SIGXCPU", "CPU time limit exceeded"}, + {25, "SIGXFSZ", "file size limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window changed"}, + {29, "SIGIO", "I/O possible"}, + {30, "SIGPWR", "power failure"}, + {31, "SIGSYS", "bad system call"}, +} diff --git a/api/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go b/api/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go new file mode 100644 index 0000000..c1c1c01 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go @@ -0,0 +1,2626 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build ppc64le,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go + +package unix + +import "syscall" + +const ( + AAFS_MAGIC = 0x5a3c69f0 + ADFS_SUPER_MAGIC = 0xadf5 + AFFS_SUPER_MAGIC = 0xadff + AFS_FS_MAGIC = 0x6b414653 + AFS_SUPER_MAGIC = 0x5346414f + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ANON_INODE_FS_MAGIC = 0x9041934 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + AUTOFS_SUPER_MAGIC = 0x187 + B0 = 0x0 + B1000000 = 0x17 + B110 = 0x3 + B115200 = 0x11 + B1152000 = 0x18 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x19 + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x1a + B230400 = 0x12 + B2400 = 0xb + B2500000 = 0x1b + B300 = 0x7 + B3000000 = 0x1c + B3500000 = 0x1d + B38400 = 0xf + B4000000 = 0x1e + B460800 = 0x13 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x14 + B57600 = 0x10 + B576000 = 0x15 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x16 + B9600 = 0xd + BALLOON_KVM_MAGIC = 0x13661366 + BDEVFS_MAGIC = 0x62646576 + BINFMTFS_MAGIC = 0x42494e4d + BLKBSZGET = 0x40081270 + BLKBSZSET = 0x80081271 + BLKFLSBUF = 0x20001261 + BLKFRAGET = 0x20001265 + BLKFRASET = 0x20001264 + BLKGETSIZE = 0x20001260 + BLKGETSIZE64 = 0x40081272 + BLKPBSZGET = 0x2000127b + BLKRAGET = 0x20001263 + BLKRASET = 0x20001262 + BLKROGET = 0x2000125e + BLKROSET = 0x2000125d + BLKRRPART = 0x2000125f + BLKSECTGET = 0x20001267 + BLKSECTSET = 0x20001266 + BLKSSZGET = 0x20001268 + BOTHER = 0x1f + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_FS_MAGIC = 0xcafe4a11 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x8000 + BSDLY = 0x8000 + BTRFS_SUPER_MAGIC = 0x9123683e + BTRFS_TEST_MAGIC = 0x73727279 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0xff + CBAUDEX = 0x0 + CFLUSH = 0xf + CGROUP2_SUPER_MAGIC = 0x63677270 + CGROUP_SUPER_MAGIC = 0x27e0eb + CIBAUD = 0xff0000 + CLOCAL = 0x8000 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CODA_SUPER_MAGIC = 0x73757245 + CR0 = 0x0 + CR1 = 0x1000 + CR2 = 0x2000 + CR3 = 0x3000 + CRAMFS_MAGIC = 0x28cd3d45 + CRDLY = 0x3000 + CREAD = 0x800 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIGNAL = 0xff + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + DAXFS_MAGIC = 0x64646178 + DEBUGFS_MAGIC = 0x64626720 + DEVPTS_SUPER_MAGIC = 0x1cd1 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + ECRYPTFS_SUPER_MAGIC = 0xf15f + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + EFIVARFS_MAGIC = 0xde5e81e4 + EFS_SUPER_MAGIC = 0x414a53 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXT2_SUPER_MAGIC = 0xef53 + EXT3_SUPER_MAGIC = 0xef53 + EXT4_SUPER_MAGIC = 0xef53 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000000 + F2FS_SUPER_MAGIC = 0xf2f52010 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x4000 + FFDLY = 0x4000 + FLUSHO = 0x800000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + FUTEXFS_SUPER_MAGIC = 0xbad1dea + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x5 + F_GETLK64 = 0xc + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0xd + F_SETLKW = 0x7 + F_SETLKW64 = 0xe + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HOSTFS_SUPER_MAGIC = 0xc0ffee + HPFS_SUPER_MAGIC = 0xf995e849 + HUGETLBFS_MAGIC = 0x958458f6 + HUPCL = 0x4000 + IBSHIFT = 0x10 + ICANON = 0x100 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x400 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x80 + ISOFS_SUPER_MAGIC = 0x9660 + ISTRIP = 0x20 + IUCLC = 0x1000 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + JFFS2_SUPER_MAGIC = 0x72b6 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x80 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x40 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x2000 + MCL_FUTURE = 0x4000 + MCL_ONFAULT = 0x8000 + MINIX2_SUPER_MAGIC = 0x2468 + MINIX2_SUPER_MAGIC2 = 0x2478 + MINIX3_SUPER_MAGIC = 0x4d5a + MINIX_SUPER_MAGIC = 0x137f + MINIX_SUPER_MAGIC2 = 0x138f + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSDOS_SUPER_MAGIC = 0x4d44 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + MTD_INODE_FS_MAGIC = 0x11307854 + NAME_MAX = 0xff + NCP_SUPER_MAGIC = 0x564c + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NFNETLINK_V0 = 0x0 + NFNLGRP_ACCT_QUOTA = 0x8 + NFNLGRP_CONNTRACK_DESTROY = 0x3 + NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 + NFNLGRP_CONNTRACK_EXP_NEW = 0x4 + NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 + NFNLGRP_CONNTRACK_NEW = 0x1 + NFNLGRP_CONNTRACK_UPDATE = 0x2 + NFNLGRP_MAX = 0x9 + NFNLGRP_NFTABLES = 0x7 + NFNLGRP_NFTRACE = 0x9 + NFNLGRP_NONE = 0x0 + NFNL_BATCH_MAX = 0x1 + NFNL_MSG_BATCH_BEGIN = 0x10 + NFNL_MSG_BATCH_END = 0x11 + NFNL_NFA_NEST = 0x8000 + NFNL_SUBSYS_ACCT = 0x7 + NFNL_SUBSYS_COUNT = 0xc + NFNL_SUBSYS_CTHELPER = 0x9 + NFNL_SUBSYS_CTNETLINK = 0x1 + NFNL_SUBSYS_CTNETLINK_EXP = 0x2 + NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 + NFNL_SUBSYS_IPSET = 0x6 + NFNL_SUBSYS_NFTABLES = 0xa + NFNL_SUBSYS_NFT_COMPAT = 0xb + NFNL_SUBSYS_NONE = 0x0 + NFNL_SUBSYS_OSF = 0x5 + NFNL_SUBSYS_QUEUE = 0x3 + NFNL_SUBSYS_ULOG = 0x4 + NFS_SUPER_MAGIC = 0x6969 + NILFS_SUPER_MAGIC = 0x3434 + NL0 = 0x0 + NL1 = 0x100 + NL2 = 0x200 + NL3 = 0x300 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x300 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80000000 + NSFS_MAGIC = 0x6e736673 + OCFS2_SUPER_MAGIC = 0x7461636f + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x4 + ONLCR = 0x2 + ONLRET = 0x20 + ONOCR = 0x10 + OPENPROM_SUPER_MAGIC = 0x9fa1 + OPOST = 0x1 + OVERLAYFS_SUPER_MAGIC = 0x794c7630 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x20000 + O_DIRECTORY = 0x4000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x8000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x404000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x1000 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PERF_EVENT_IOC_DISABLE = 0x20002401 + PERF_EVENT_IOC_ENABLE = 0x20002400 + PERF_EVENT_IOC_ID = 0x40082407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 + PERF_EVENT_IOC_PERIOD = 0x80082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc008240a + PERF_EVENT_IOC_REFRESH = 0x20002402 + PERF_EVENT_IOC_RESET = 0x20002403 + PERF_EVENT_IOC_SET_BPF = 0x80042408 + PERF_EVENT_IOC_SET_FILTER = 0x80082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 + PIPEFS_MAGIC = 0x50495045 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROC_SUPER_MAGIC = 0x9fa0 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_SAO = 0x10 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffffffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PSTOREFS_MAGIC = 0x6165676c + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETEVRREGS = 0x14 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGS64 = 0x16 + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GETVRREGS = 0x12 + PTRACE_GETVSRREGS = 0x1b + PTRACE_GET_DEBUGREG = 0x19 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETEVRREGS = 0x15 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGS64 = 0x17 + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SETVRREGS = 0x13 + PTRACE_SETVSRREGS = 0x1c + PTRACE_SET_DEBUGREG = 0x1a + PTRACE_SINGLEBLOCK = 0x100 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + PT_CCR = 0x26 + PT_CTR = 0x23 + PT_DAR = 0x29 + PT_DSCR = 0x2c + PT_DSISR = 0x2a + PT_FPR0 = 0x30 + PT_FPSCR = 0x50 + PT_LNK = 0x24 + PT_MSR = 0x21 + PT_NIP = 0x20 + PT_ORIG_R3 = 0x22 + PT_R0 = 0x0 + PT_R1 = 0x1 + PT_R10 = 0xa + PT_R11 = 0xb + PT_R12 = 0xc + PT_R13 = 0xd + PT_R14 = 0xe + PT_R15 = 0xf + PT_R16 = 0x10 + PT_R17 = 0x11 + PT_R18 = 0x12 + PT_R19 = 0x13 + PT_R2 = 0x2 + PT_R20 = 0x14 + PT_R21 = 0x15 + PT_R22 = 0x16 + PT_R23 = 0x17 + PT_R24 = 0x18 + PT_R25 = 0x19 + PT_R26 = 0x1a + PT_R27 = 0x1b + PT_R28 = 0x1c + PT_R29 = 0x1d + PT_R3 = 0x3 + PT_R30 = 0x1e + PT_R31 = 0x1f + PT_R4 = 0x4 + PT_R5 = 0x5 + PT_R6 = 0x6 + PT_R7 = 0x7 + PT_R8 = 0x8 + PT_R9 = 0x9 + PT_REGS_COUNT = 0x2c + PT_RESULT = 0x2b + PT_SOFTE = 0x27 + PT_TRAP = 0x28 + PT_VR0 = 0x52 + PT_VRSAVE = 0x94 + PT_VSCR = 0x93 + PT_VSR0 = 0x96 + PT_VSR31 = 0xd4 + PT_XER = 0x25 + QNX4_SUPER_MAGIC = 0x2f + QNX6_SUPER_MAGIC = 0x68191122 + RAMFS_MAGIC = 0x858458f6 + RDTGROUP_SUPER_MAGIC = 0x7655821 + REISERFS_SUPER_MAGIC = 0x52654973 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SECURITYFS_MAGIC = 0x73636673 + SELINUX_MAGIC = 0xf97cff8c + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x4004667f + SIOCOUTQ = 0x40047473 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMACK_MAGIC = 0x43415d53 + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SMB_SUPER_MAGIC = 0x517b + SOCKFS_MAGIC = 0x534f434b + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x14 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x15 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x10 + SO_RCVTIMEO = 0x12 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x11 + SO_SNDTIMEO = 0x13 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + SQUASHFS_MAGIC = 0x73717368 + STACK_END_MAGIC = 0x57ac6e9d + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + SYSFS_MAGIC = 0x62656572 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x400 + TAB2 = 0x800 + TAB3 = 0xc00 + TABDLY = 0xc00 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x2000741f + TCGETA = 0x40147417 + TCGETS = 0x402c7413 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x2000741d + TCSBRKP = 0x5425 + TCSETA = 0x80147418 + TCSETAF = 0x8014741c + TCSETAW = 0x80147419 + TCSETS = 0x802c7414 + TCSETSF = 0x802c7416 + TCSETSW = 0x802c7415 + TCXONC = 0x2000741e + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x40045432 + TIOCGETC = 0x40067412 + TIOCGETD = 0x5424 + TIOCGETP = 0x40067408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGLTC = 0x40067474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGPTPEER = 0x20005441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x4004667f + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_LOOP = 0x8000 + TIOCM_OUT1 = 0x2000 + TIOCM_OUT2 = 0x4000 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETC = 0x80067411 + TIOCSETD = 0x5423 + TIOCSETN = 0x8006740a + TIOCSETP = 0x80067409 + TIOCSIG = 0x80045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSLTC = 0x80067475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTART = 0x2000746e + TIOCSTI = 0x5412 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TMPFS_MAGIC = 0x1021994 + TOSTOP = 0x400000 + TPACKET_ALIGNMENT = 0x10 + TPACKET_HDRLEN = 0x34 + TP_STATUS_AVAILABLE = 0x0 + TP_STATUS_BLK_TMO = 0x20 + TP_STATUS_COPY = 0x2 + TP_STATUS_CSUMNOTREADY = 0x8 + TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_KERNEL = 0x0 + TP_STATUS_LOSING = 0x4 + TP_STATUS_SENDING = 0x2 + TP_STATUS_SEND_REQUEST = 0x1 + TP_STATUS_TS_RAW_HARDWARE = -0x80000000 + TP_STATUS_TS_SOFTWARE = 0x20000000 + TP_STATUS_TS_SYS_HARDWARE = 0x40000000 + TP_STATUS_USER = 0x1 + TP_STATUS_VLAN_TPID_VALID = 0x40 + TP_STATUS_VLAN_VALID = 0x10 + TP_STATUS_WRONG_FORMAT = 0x4 + TRACEFS_MAGIC = 0x74726163 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x801054d5 + TUNDETACHFILTER = 0x801054d6 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x401054db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETDEBUG = 0x800454c9 + TUNSETFILTEREBPF = 0x400454e1 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETSTEERINGEBPF = 0x400454e0 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + UDF_SUPER_MAGIC = 0x15013346 + UMOUNT_NOFOLLOW = 0x8 + USBDEVICE_SUPER_MAGIC = 0x9fa2 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + V9FS_MAGIC = 0x1021997 + VDISCARD = 0x10 + VEOF = 0x4 + VEOL = 0x6 + VEOL2 = 0x8 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x5 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xb + VSTART = 0xd + VSTOP = 0xe + VSUSP = 0xc + VSWTC = 0x9 + VT0 = 0x0 + VT1 = 0x10000 + VTDLY = 0x10000 + VTIME = 0x7 + VWERASE = 0xa + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x40045702 + WDIOC_GETPRETIMEOUT = 0x40045709 + WDIOC_GETSTATUS = 0x40045701 + WDIOC_GETSUPPORT = 0x40285700 + WDIOC_GETTEMP = 0x40045703 + WDIOC_GETTIMELEFT = 0x4004570a + WDIOC_GETTIMEOUT = 0x40045707 + WDIOC_KEEPALIVE = 0x40045705 + WDIOC_SETOPTIONS = 0x40045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4000 + XENFS_SUPER_MAGIC = 0xabba1974 + XTABS = 0xc00 + ZSMALLOC_MAGIC = 0x58295829 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x62) + EADDRNOTAVAIL = syscall.Errno(0x63) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x61) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x72) + EBADE = syscall.Errno(0x34) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x4d) + EBADMSG = syscall.Errno(0x4a) + EBADR = syscall.Errno(0x35) + EBADRQC = syscall.Errno(0x38) + EBADSLT = syscall.Errno(0x39) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7d) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x2c) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x67) + ECONNREFUSED = syscall.Errno(0x6f) + ECONNRESET = syscall.Errno(0x68) + EDEADLK = syscall.Errno(0x23) + EDEADLOCK = syscall.Errno(0x3a) + EDESTADDRREQ = syscall.Errno(0x59) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x7a) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x70) + EHOSTUNREACH = syscall.Errno(0x71) + EHWPOISON = syscall.Errno(0x85) + EIDRM = syscall.Errno(0x2b) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x73) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x6a) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x7f) + EKEYREJECTED = syscall.Errno(0x81) + EKEYREVOKED = syscall.Errno(0x80) + EL2HLT = syscall.Errno(0x33) + EL2NSYNC = syscall.Errno(0x2d) + EL3HLT = syscall.Errno(0x2e) + EL3RST = syscall.Errno(0x2f) + ELIBACC = syscall.Errno(0x4f) + ELIBBAD = syscall.Errno(0x50) + ELIBEXEC = syscall.Errno(0x53) + ELIBMAX = syscall.Errno(0x52) + ELIBSCN = syscall.Errno(0x51) + ELNRNG = syscall.Errno(0x30) + ELOOP = syscall.Errno(0x28) + EMEDIUMTYPE = syscall.Errno(0x7c) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x5a) + EMULTIHOP = syscall.Errno(0x48) + ENAMETOOLONG = syscall.Errno(0x24) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x64) + ENETRESET = syscall.Errno(0x66) + ENETUNREACH = syscall.Errno(0x65) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x37) + ENOBUFS = syscall.Errno(0x69) + ENOCSI = syscall.Errno(0x32) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x7e) + ENOLCK = syscall.Errno(0x25) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x7b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x2a) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x5c) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x26) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x6b) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x27) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x83) + ENOTSOCK = syscall.Errno(0x58) + ENOTSUP = syscall.Errno(0x5f) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x4c) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x5f) + EOVERFLOW = syscall.Errno(0x4b) + EOWNERDEAD = syscall.Errno(0x82) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x60) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x5d) + EPROTOTYPE = syscall.Errno(0x5b) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x4e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x55) + ERFKILL = syscall.Errno(0x84) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x6c) + ESOCKTNOSUPPORT = syscall.Errno(0x5e) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x74) + ESTRPIPE = syscall.Errno(0x56) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x6e) + ETOOMANYREFS = syscall.Errno(0x6d) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x31) + EUSERS = syscall.Errno(0x57) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x36) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0x7) + SIGCHLD = syscall.Signal(0x11) + SIGCLD = syscall.Signal(0x11) + SIGCONT = syscall.Signal(0x12) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x1d) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x1d) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1e) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTKFLT = syscall.Signal(0x10) + SIGSTOP = syscall.Signal(0x13) + SIGSYS = syscall.Signal(0x1f) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x14) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x17) + SIGUSR1 = syscall.Signal(0xa) + SIGUSR2 = syscall.Signal(0xc) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "no such device or address"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EAGAIN", "resource temporarily unavailable"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device or resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "invalid cross-device link"}, + {19, "ENODEV", "no such device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "numerical result out of range"}, + {35, "EDEADLK", "resource deadlock avoided"}, + {36, "ENAMETOOLONG", "file name too long"}, + {37, "ENOLCK", "no locks available"}, + {38, "ENOSYS", "function not implemented"}, + {39, "ENOTEMPTY", "directory not empty"}, + {40, "ELOOP", "too many levels of symbolic links"}, + {42, "ENOMSG", "no message of desired type"}, + {43, "EIDRM", "identifier removed"}, + {44, "ECHRNG", "channel number out of range"}, + {45, "EL2NSYNC", "level 2 not synchronized"}, + {46, "EL3HLT", "level 3 halted"}, + {47, "EL3RST", "level 3 reset"}, + {48, "ELNRNG", "link number out of range"}, + {49, "EUNATCH", "protocol driver not attached"}, + {50, "ENOCSI", "no CSI structure available"}, + {51, "EL2HLT", "level 2 halted"}, + {52, "EBADE", "invalid exchange"}, + {53, "EBADR", "invalid request descriptor"}, + {54, "EXFULL", "exchange full"}, + {55, "ENOANO", "no anode"}, + {56, "EBADRQC", "invalid request code"}, + {57, "EBADSLT", "invalid slot"}, + {58, "EDEADLOCK", "file locking deadlock error"}, + {59, "EBFONT", "bad font file format"}, + {60, "ENOSTR", "device not a stream"}, + {61, "ENODATA", "no data available"}, + {62, "ETIME", "timer expired"}, + {63, "ENOSR", "out of streams resources"}, + {64, "ENONET", "machine is not on the network"}, + {65, "ENOPKG", "package not installed"}, + {66, "EREMOTE", "object is remote"}, + {67, "ENOLINK", "link has been severed"}, + {68, "EADV", "advertise error"}, + {69, "ESRMNT", "srmount error"}, + {70, "ECOMM", "communication error on send"}, + {71, "EPROTO", "protocol error"}, + {72, "EMULTIHOP", "multihop attempted"}, + {73, "EDOTDOT", "RFS specific error"}, + {74, "EBADMSG", "bad message"}, + {75, "EOVERFLOW", "value too large for defined data type"}, + {76, "ENOTUNIQ", "name not unique on network"}, + {77, "EBADFD", "file descriptor in bad state"}, + {78, "EREMCHG", "remote address changed"}, + {79, "ELIBACC", "can not access a needed shared library"}, + {80, "ELIBBAD", "accessing a corrupted shared library"}, + {81, "ELIBSCN", ".lib section in a.out corrupted"}, + {82, "ELIBMAX", "attempting to link in too many shared libraries"}, + {83, "ELIBEXEC", "cannot exec a shared library directly"}, + {84, "EILSEQ", "invalid or incomplete multibyte or wide character"}, + {85, "ERESTART", "interrupted system call should be restarted"}, + {86, "ESTRPIPE", "streams pipe error"}, + {87, "EUSERS", "too many users"}, + {88, "ENOTSOCK", "socket operation on non-socket"}, + {89, "EDESTADDRREQ", "destination address required"}, + {90, "EMSGSIZE", "message too long"}, + {91, "EPROTOTYPE", "protocol wrong type for socket"}, + {92, "ENOPROTOOPT", "protocol not available"}, + {93, "EPROTONOSUPPORT", "protocol not supported"}, + {94, "ESOCKTNOSUPPORT", "socket type not supported"}, + {95, "ENOTSUP", "operation not supported"}, + {96, "EPFNOSUPPORT", "protocol family not supported"}, + {97, "EAFNOSUPPORT", "address family not supported by protocol"}, + {98, "EADDRINUSE", "address already in use"}, + {99, "EADDRNOTAVAIL", "cannot assign requested address"}, + {100, "ENETDOWN", "network is down"}, + {101, "ENETUNREACH", "network is unreachable"}, + {102, "ENETRESET", "network dropped connection on reset"}, + {103, "ECONNABORTED", "software caused connection abort"}, + {104, "ECONNRESET", "connection reset by peer"}, + {105, "ENOBUFS", "no buffer space available"}, + {106, "EISCONN", "transport endpoint is already connected"}, + {107, "ENOTCONN", "transport endpoint is not connected"}, + {108, "ESHUTDOWN", "cannot send after transport endpoint shutdown"}, + {109, "ETOOMANYREFS", "too many references: cannot splice"}, + {110, "ETIMEDOUT", "connection timed out"}, + {111, "ECONNREFUSED", "connection refused"}, + {112, "EHOSTDOWN", "host is down"}, + {113, "EHOSTUNREACH", "no route to host"}, + {114, "EALREADY", "operation already in progress"}, + {115, "EINPROGRESS", "operation now in progress"}, + {116, "ESTALE", "stale file handle"}, + {117, "EUCLEAN", "structure needs cleaning"}, + {118, "ENOTNAM", "not a XENIX named type file"}, + {119, "ENAVAIL", "no XENIX semaphores available"}, + {120, "EISNAM", "is a named type file"}, + {121, "EREMOTEIO", "remote I/O error"}, + {122, "EDQUOT", "disk quota exceeded"}, + {123, "ENOMEDIUM", "no medium found"}, + {124, "EMEDIUMTYPE", "wrong medium type"}, + {125, "ECANCELED", "operation canceled"}, + {126, "ENOKEY", "required key not available"}, + {127, "EKEYEXPIRED", "key has expired"}, + {128, "EKEYREVOKED", "key has been revoked"}, + {129, "EKEYREJECTED", "key was rejected by service"}, + {130, "EOWNERDEAD", "owner died"}, + {131, "ENOTRECOVERABLE", "state not recoverable"}, + {132, "ERFKILL", "operation not possible due to RF-kill"}, + {133, "EHWPOISON", "memory page has hardware error"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/breakpoint trap"}, + {6, "SIGABRT", "aborted"}, + {7, "SIGBUS", "bus error"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGUSR1", "user defined signal 1"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGUSR2", "user defined signal 2"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGSTKFLT", "stack fault"}, + {17, "SIGCHLD", "child exited"}, + {18, "SIGCONT", "continued"}, + {19, "SIGSTOP", "stopped (signal)"}, + {20, "SIGTSTP", "stopped"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGURG", "urgent I/O condition"}, + {24, "SIGXCPU", "CPU time limit exceeded"}, + {25, "SIGXFSZ", "file size limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window changed"}, + {29, "SIGIO", "I/O possible"}, + {30, "SIGPWR", "power failure"}, + {31, "SIGSYS", "bad system call"}, +} diff --git a/api/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go b/api/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go new file mode 100644 index 0000000..c7583e1 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go @@ -0,0 +1,2625 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include -fsigned-char +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build s390x,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char _const.go + +package unix + +import "syscall" + +const ( + AAFS_MAGIC = 0x5a3c69f0 + ADFS_SUPER_MAGIC = 0xadf5 + AFFS_SUPER_MAGIC = 0xadff + AFS_FS_MAGIC = 0x6b414653 + AFS_SUPER_MAGIC = 0x5346414f + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ANON_INODE_FS_MAGIC = 0x9041934 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + AUTOFS_SUPER_MAGIC = 0x187 + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BALLOON_KVM_MAGIC = 0x13661366 + BDEVFS_MAGIC = 0x62646576 + BINFMTFS_MAGIC = 0x42494e4d + BLKBSZGET = 0x80081270 + BLKBSZSET = 0x40081271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80081272 + BLKPBSZGET = 0x127b + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_FS_MAGIC = 0xcafe4a11 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + BTRFS_SUPER_MAGIC = 0x9123683e + BTRFS_TEST_MAGIC = 0x73727279 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CGROUP2_SUPER_MAGIC = 0x63677270 + CGROUP_SUPER_MAGIC = 0x27e0eb + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CODA_SUPER_MAGIC = 0x73757245 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRAMFS_MAGIC = 0x28cd3d45 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DAXFS_MAGIC = 0x64646178 + DEBUGFS_MAGIC = 0x64626720 + DEVPTS_SUPER_MAGIC = 0x1cd1 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + ECRYPTFS_SUPER_MAGIC = 0xf15f + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + EFIVARFS_MAGIC = 0xde5e81e4 + EFS_SUPER_MAGIC = 0x414a53 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXT2_SUPER_MAGIC = 0xef53 + EXT3_SUPER_MAGIC = 0xef53 + EXT4_SUPER_MAGIC = 0xef53 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + F2FS_SUPER_MAGIC = 0xf2f52010 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x1000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + FUTEXFS_SUPER_MAGIC = 0xbad1dea + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x5 + F_GETLK64 = 0x5 + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HOSTFS_SUPER_MAGIC = 0xc0ffee + HPFS_SUPER_MAGIC = 0xf995e849 + HUGETLBFS_MAGIC = 0x958458f6 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISOFS_SUPER_MAGIC = 0x9660 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + JFFS2_SUPER_MAGIC = 0x72b6 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x2000 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x4000 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MINIX2_SUPER_MAGIC = 0x2468 + MINIX2_SUPER_MAGIC2 = 0x2478 + MINIX3_SUPER_MAGIC = 0x4d5a + MINIX_SUPER_MAGIC = 0x137f + MINIX_SUPER_MAGIC2 = 0x138f + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSDOS_SUPER_MAGIC = 0x4d44 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + MTD_INODE_FS_MAGIC = 0x11307854 + NAME_MAX = 0xff + NCP_SUPER_MAGIC = 0x564c + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NFNETLINK_V0 = 0x0 + NFNLGRP_ACCT_QUOTA = 0x8 + NFNLGRP_CONNTRACK_DESTROY = 0x3 + NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 + NFNLGRP_CONNTRACK_EXP_NEW = 0x4 + NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 + NFNLGRP_CONNTRACK_NEW = 0x1 + NFNLGRP_CONNTRACK_UPDATE = 0x2 + NFNLGRP_MAX = 0x9 + NFNLGRP_NFTABLES = 0x7 + NFNLGRP_NFTRACE = 0x9 + NFNLGRP_NONE = 0x0 + NFNL_BATCH_MAX = 0x1 + NFNL_MSG_BATCH_BEGIN = 0x10 + NFNL_MSG_BATCH_END = 0x11 + NFNL_NFA_NEST = 0x8000 + NFNL_SUBSYS_ACCT = 0x7 + NFNL_SUBSYS_COUNT = 0xc + NFNL_SUBSYS_CTHELPER = 0x9 + NFNL_SUBSYS_CTNETLINK = 0x1 + NFNL_SUBSYS_CTNETLINK_EXP = 0x2 + NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 + NFNL_SUBSYS_IPSET = 0x6 + NFNL_SUBSYS_NFTABLES = 0xa + NFNL_SUBSYS_NFT_COMPAT = 0xb + NFNL_SUBSYS_NONE = 0x0 + NFNL_SUBSYS_OSF = 0x5 + NFNL_SUBSYS_QUEUE = 0x3 + NFNL_SUBSYS_ULOG = 0x4 + NFS_SUPER_MAGIC = 0x6969 + NILFS_SUPER_MAGIC = 0x3434 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + NSFS_MAGIC = 0x6e736673 + OCFS2_SUPER_MAGIC = 0x7461636f + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPENPROM_SUPER_MAGIC = 0x9fa1 + OPOST = 0x1 + OVERLAYFS_SUPER_MAGIC = 0x794c7630 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x4000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x2401 + PERF_EVENT_IOC_ENABLE = 0x2400 + PERF_EVENT_IOC_ID = 0x80082407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 + PERF_EVENT_IOC_PERIOD = 0x40082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc008240a + PERF_EVENT_IOC_REFRESH = 0x2402 + PERF_EVENT_IOC_RESET = 0x2403 + PERF_EVENT_IOC_SET_BPF = 0x40042408 + PERF_EVENT_IOC_SET_FILTER = 0x40082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x2405 + PIPEFS_MAGIC = 0x50495045 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROC_SUPER_MAGIC = 0x9fa0 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffffffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PSTOREFS_MAGIC = 0x6165676c + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_DISABLE_TE = 0x5010 + PTRACE_ENABLE_TE = 0x5009 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_LAST_BREAK = 0x5006 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKDATA_AREA = 0x5003 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKTEXT_AREA = 0x5002 + PTRACE_PEEKUSR = 0x3 + PTRACE_PEEKUSR_AREA = 0x5000 + PTRACE_PEEK_SYSTEM_CALL = 0x5007 + PTRACE_POKEDATA = 0x5 + PTRACE_POKEDATA_AREA = 0x5005 + PTRACE_POKETEXT = 0x4 + PTRACE_POKETEXT_AREA = 0x5004 + PTRACE_POKEUSR = 0x6 + PTRACE_POKEUSR_AREA = 0x5001 + PTRACE_POKE_SYSTEM_CALL = 0x5008 + PTRACE_PROT = 0x15 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SINGLEBLOCK = 0xc + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TE_ABORT_RAND = 0x5011 + PTRACE_TRACEME = 0x0 + PT_ACR0 = 0x90 + PT_ACR1 = 0x94 + PT_ACR10 = 0xb8 + PT_ACR11 = 0xbc + PT_ACR12 = 0xc0 + PT_ACR13 = 0xc4 + PT_ACR14 = 0xc8 + PT_ACR15 = 0xcc + PT_ACR2 = 0x98 + PT_ACR3 = 0x9c + PT_ACR4 = 0xa0 + PT_ACR5 = 0xa4 + PT_ACR6 = 0xa8 + PT_ACR7 = 0xac + PT_ACR8 = 0xb0 + PT_ACR9 = 0xb4 + PT_CR_10 = 0x168 + PT_CR_11 = 0x170 + PT_CR_9 = 0x160 + PT_ENDREGS = 0x1af + PT_FPC = 0xd8 + PT_FPR0 = 0xe0 + PT_FPR1 = 0xe8 + PT_FPR10 = 0x130 + PT_FPR11 = 0x138 + PT_FPR12 = 0x140 + PT_FPR13 = 0x148 + PT_FPR14 = 0x150 + PT_FPR15 = 0x158 + PT_FPR2 = 0xf0 + PT_FPR3 = 0xf8 + PT_FPR4 = 0x100 + PT_FPR5 = 0x108 + PT_FPR6 = 0x110 + PT_FPR7 = 0x118 + PT_FPR8 = 0x120 + PT_FPR9 = 0x128 + PT_GPR0 = 0x10 + PT_GPR1 = 0x18 + PT_GPR10 = 0x60 + PT_GPR11 = 0x68 + PT_GPR12 = 0x70 + PT_GPR13 = 0x78 + PT_GPR14 = 0x80 + PT_GPR15 = 0x88 + PT_GPR2 = 0x20 + PT_GPR3 = 0x28 + PT_GPR4 = 0x30 + PT_GPR5 = 0x38 + PT_GPR6 = 0x40 + PT_GPR7 = 0x48 + PT_GPR8 = 0x50 + PT_GPR9 = 0x58 + PT_IEEE_IP = 0x1a8 + PT_LASTOFF = 0x1a8 + PT_ORIGGPR2 = 0xd0 + PT_PSWADDR = 0x8 + PT_PSWMASK = 0x0 + QNX4_SUPER_MAGIC = 0x2f + QNX6_SUPER_MAGIC = 0x68191122 + RAMFS_MAGIC = 0x858458f6 + RDTGROUP_SUPER_MAGIC = 0x7655821 + REISERFS_SUPER_MAGIC = 0x52654973 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SECURITYFS_MAGIC = 0x73636673 + SELINUX_MAGIC = 0xf97cff8c + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x541b + SIOCOUTQ = 0x5411 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMACK_MAGIC = 0x43415d53 + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SMB_SUPER_MAGIC = 0x517b + SOCKFS_MAGIC = 0x534f434b + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x10 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x11 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x12 + SO_RCVTIMEO = 0x14 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x13 + SO_SNDTIMEO = 0x15 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + SQUASHFS_MAGIC = 0x73717368 + STACK_END_MAGIC = 0x57ac6e9d + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + SYSFS_MAGIC = 0x62656572 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x540b + TCGETA = 0x5405 + TCGETS = 0x5401 + TCGETS2 = 0x802c542a + TCGETX = 0x5432 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSBRKP = 0x5425 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETS2 = 0x402c542b + TCSETSF = 0x5404 + TCSETSF2 = 0x402c542d + TCSETSW = 0x5403 + TCSETSW2 = 0x402c542c + TCSETX = 0x5433 + TCSETXF = 0x5434 + TCSETXW = 0x5435 + TCXONC = 0x540a + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x80045432 + TIOCGETD = 0x5424 + TIOCGEXCL = 0x80045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x540f + TIOCGPKT = 0x80045438 + TIOCGPTLCK = 0x80045439 + TIOCGPTN = 0x80045430 + TIOCGPTPEER = 0x5441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x5413 + TIOCINQ = 0x541b + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x5411 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x5423 + TIOCSIG = 0x40045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x5410 + TIOCSPTLCK = 0x40045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTI = 0x5412 + TIOCSWINSZ = 0x5414 + TIOCVHANGUP = 0x5437 + TMPFS_MAGIC = 0x1021994 + TOSTOP = 0x100 + TPACKET_ALIGNMENT = 0x10 + TPACKET_HDRLEN = 0x34 + TP_STATUS_AVAILABLE = 0x0 + TP_STATUS_BLK_TMO = 0x20 + TP_STATUS_COPY = 0x2 + TP_STATUS_CSUMNOTREADY = 0x8 + TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_KERNEL = 0x0 + TP_STATUS_LOSING = 0x4 + TP_STATUS_SENDING = 0x2 + TP_STATUS_SEND_REQUEST = 0x1 + TP_STATUS_TS_RAW_HARDWARE = -0x80000000 + TP_STATUS_TS_SOFTWARE = 0x20000000 + TP_STATUS_TS_SYS_HARDWARE = 0x40000000 + TP_STATUS_USER = 0x1 + TP_STATUS_VLAN_TPID_VALID = 0x40 + TP_STATUS_VLAN_VALID = 0x10 + TP_STATUS_WRONG_FORMAT = 0x4 + TRACEFS_MAGIC = 0x74726163 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x401054d5 + TUNDETACHFILTER = 0x401054d6 + TUNGETFEATURES = 0x800454cf + TUNGETFILTER = 0x801054db + TUNGETIFF = 0x800454d2 + TUNGETSNDBUF = 0x800454d3 + TUNGETVNETBE = 0x800454df + TUNGETVNETHDRSZ = 0x800454d7 + TUNGETVNETLE = 0x800454dd + TUNSETDEBUG = 0x400454c9 + TUNSETFILTEREBPF = 0x800454e1 + TUNSETGROUP = 0x400454ce + TUNSETIFF = 0x400454ca + TUNSETIFINDEX = 0x400454da + TUNSETLINK = 0x400454cd + TUNSETNOCSUM = 0x400454c8 + TUNSETOFFLOAD = 0x400454d0 + TUNSETOWNER = 0x400454cc + TUNSETPERSIST = 0x400454cb + TUNSETQUEUE = 0x400454d9 + TUNSETSNDBUF = 0x400454d4 + TUNSETSTEERINGEBPF = 0x800454e0 + TUNSETTXFILTER = 0x400454d1 + TUNSETVNETBE = 0x400454de + TUNSETVNETHDRSZ = 0x400454d8 + TUNSETVNETLE = 0x400454dc + UDF_SUPER_MAGIC = 0x15013346 + UMOUNT_NOFOLLOW = 0x8 + USBDEVICE_SUPER_MAGIC = 0x9fa2 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + V9FS_MAGIC = 0x1021997 + VDISCARD = 0xd + VEOF = 0x4 + VEOL = 0xb + VEOL2 = 0x10 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x6 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x80045702 + WDIOC_GETPRETIMEOUT = 0x80045709 + WDIOC_GETSTATUS = 0x80045701 + WDIOC_GETSUPPORT = 0x80285700 + WDIOC_GETTEMP = 0x80045703 + WDIOC_GETTIMELEFT = 0x8004570a + WDIOC_GETTIMEOUT = 0x80045707 + WDIOC_KEEPALIVE = 0x80045705 + WDIOC_SETOPTIONS = 0x80045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XENFS_SUPER_MAGIC = 0xabba1974 + XTABS = 0x1800 + ZSMALLOC_MAGIC = 0x58295829 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x62) + EADDRNOTAVAIL = syscall.Errno(0x63) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x61) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x72) + EBADE = syscall.Errno(0x34) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x4d) + EBADMSG = syscall.Errno(0x4a) + EBADR = syscall.Errno(0x35) + EBADRQC = syscall.Errno(0x38) + EBADSLT = syscall.Errno(0x39) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7d) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x2c) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x67) + ECONNREFUSED = syscall.Errno(0x6f) + ECONNRESET = syscall.Errno(0x68) + EDEADLK = syscall.Errno(0x23) + EDEADLOCK = syscall.Errno(0x23) + EDESTADDRREQ = syscall.Errno(0x59) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x7a) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x70) + EHOSTUNREACH = syscall.Errno(0x71) + EHWPOISON = syscall.Errno(0x85) + EIDRM = syscall.Errno(0x2b) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x73) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x6a) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x7f) + EKEYREJECTED = syscall.Errno(0x81) + EKEYREVOKED = syscall.Errno(0x80) + EL2HLT = syscall.Errno(0x33) + EL2NSYNC = syscall.Errno(0x2d) + EL3HLT = syscall.Errno(0x2e) + EL3RST = syscall.Errno(0x2f) + ELIBACC = syscall.Errno(0x4f) + ELIBBAD = syscall.Errno(0x50) + ELIBEXEC = syscall.Errno(0x53) + ELIBMAX = syscall.Errno(0x52) + ELIBSCN = syscall.Errno(0x51) + ELNRNG = syscall.Errno(0x30) + ELOOP = syscall.Errno(0x28) + EMEDIUMTYPE = syscall.Errno(0x7c) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x5a) + EMULTIHOP = syscall.Errno(0x48) + ENAMETOOLONG = syscall.Errno(0x24) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x64) + ENETRESET = syscall.Errno(0x66) + ENETUNREACH = syscall.Errno(0x65) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x37) + ENOBUFS = syscall.Errno(0x69) + ENOCSI = syscall.Errno(0x32) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x7e) + ENOLCK = syscall.Errno(0x25) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x7b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x2a) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x5c) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x26) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x6b) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x27) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x83) + ENOTSOCK = syscall.Errno(0x58) + ENOTSUP = syscall.Errno(0x5f) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x4c) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x5f) + EOVERFLOW = syscall.Errno(0x4b) + EOWNERDEAD = syscall.Errno(0x82) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x60) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x5d) + EPROTOTYPE = syscall.Errno(0x5b) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x4e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x55) + ERFKILL = syscall.Errno(0x84) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x6c) + ESOCKTNOSUPPORT = syscall.Errno(0x5e) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x74) + ESTRPIPE = syscall.Errno(0x56) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x6e) + ETOOMANYREFS = syscall.Errno(0x6d) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x31) + EUSERS = syscall.Errno(0x57) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x36) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0x7) + SIGCHLD = syscall.Signal(0x11) + SIGCLD = syscall.Signal(0x11) + SIGCONT = syscall.Signal(0x12) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x1d) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x1d) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1e) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTKFLT = syscall.Signal(0x10) + SIGSTOP = syscall.Signal(0x13) + SIGSYS = syscall.Signal(0x1f) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x14) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x17) + SIGUSR1 = syscall.Signal(0xa) + SIGUSR2 = syscall.Signal(0xc) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "no such device or address"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EAGAIN", "resource temporarily unavailable"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device or resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "invalid cross-device link"}, + {19, "ENODEV", "no such device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "numerical result out of range"}, + {35, "EDEADLK", "resource deadlock avoided"}, + {36, "ENAMETOOLONG", "file name too long"}, + {37, "ENOLCK", "no locks available"}, + {38, "ENOSYS", "function not implemented"}, + {39, "ENOTEMPTY", "directory not empty"}, + {40, "ELOOP", "too many levels of symbolic links"}, + {42, "ENOMSG", "no message of desired type"}, + {43, "EIDRM", "identifier removed"}, + {44, "ECHRNG", "channel number out of range"}, + {45, "EL2NSYNC", "level 2 not synchronized"}, + {46, "EL3HLT", "level 3 halted"}, + {47, "EL3RST", "level 3 reset"}, + {48, "ELNRNG", "link number out of range"}, + {49, "EUNATCH", "protocol driver not attached"}, + {50, "ENOCSI", "no CSI structure available"}, + {51, "EL2HLT", "level 2 halted"}, + {52, "EBADE", "invalid exchange"}, + {53, "EBADR", "invalid request descriptor"}, + {54, "EXFULL", "exchange full"}, + {55, "ENOANO", "no anode"}, + {56, "EBADRQC", "invalid request code"}, + {57, "EBADSLT", "invalid slot"}, + {59, "EBFONT", "bad font file format"}, + {60, "ENOSTR", "device not a stream"}, + {61, "ENODATA", "no data available"}, + {62, "ETIME", "timer expired"}, + {63, "ENOSR", "out of streams resources"}, + {64, "ENONET", "machine is not on the network"}, + {65, "ENOPKG", "package not installed"}, + {66, "EREMOTE", "object is remote"}, + {67, "ENOLINK", "link has been severed"}, + {68, "EADV", "advertise error"}, + {69, "ESRMNT", "srmount error"}, + {70, "ECOMM", "communication error on send"}, + {71, "EPROTO", "protocol error"}, + {72, "EMULTIHOP", "multihop attempted"}, + {73, "EDOTDOT", "RFS specific error"}, + {74, "EBADMSG", "bad message"}, + {75, "EOVERFLOW", "value too large for defined data type"}, + {76, "ENOTUNIQ", "name not unique on network"}, + {77, "EBADFD", "file descriptor in bad state"}, + {78, "EREMCHG", "remote address changed"}, + {79, "ELIBACC", "can not access a needed shared library"}, + {80, "ELIBBAD", "accessing a corrupted shared library"}, + {81, "ELIBSCN", ".lib section in a.out corrupted"}, + {82, "ELIBMAX", "attempting to link in too many shared libraries"}, + {83, "ELIBEXEC", "cannot exec a shared library directly"}, + {84, "EILSEQ", "invalid or incomplete multibyte or wide character"}, + {85, "ERESTART", "interrupted system call should be restarted"}, + {86, "ESTRPIPE", "streams pipe error"}, + {87, "EUSERS", "too many users"}, + {88, "ENOTSOCK", "socket operation on non-socket"}, + {89, "EDESTADDRREQ", "destination address required"}, + {90, "EMSGSIZE", "message too long"}, + {91, "EPROTOTYPE", "protocol wrong type for socket"}, + {92, "ENOPROTOOPT", "protocol not available"}, + {93, "EPROTONOSUPPORT", "protocol not supported"}, + {94, "ESOCKTNOSUPPORT", "socket type not supported"}, + {95, "ENOTSUP", "operation not supported"}, + {96, "EPFNOSUPPORT", "protocol family not supported"}, + {97, "EAFNOSUPPORT", "address family not supported by protocol"}, + {98, "EADDRINUSE", "address already in use"}, + {99, "EADDRNOTAVAIL", "cannot assign requested address"}, + {100, "ENETDOWN", "network is down"}, + {101, "ENETUNREACH", "network is unreachable"}, + {102, "ENETRESET", "network dropped connection on reset"}, + {103, "ECONNABORTED", "software caused connection abort"}, + {104, "ECONNRESET", "connection reset by peer"}, + {105, "ENOBUFS", "no buffer space available"}, + {106, "EISCONN", "transport endpoint is already connected"}, + {107, "ENOTCONN", "transport endpoint is not connected"}, + {108, "ESHUTDOWN", "cannot send after transport endpoint shutdown"}, + {109, "ETOOMANYREFS", "too many references: cannot splice"}, + {110, "ETIMEDOUT", "connection timed out"}, + {111, "ECONNREFUSED", "connection refused"}, + {112, "EHOSTDOWN", "host is down"}, + {113, "EHOSTUNREACH", "no route to host"}, + {114, "EALREADY", "operation already in progress"}, + {115, "EINPROGRESS", "operation now in progress"}, + {116, "ESTALE", "stale file handle"}, + {117, "EUCLEAN", "structure needs cleaning"}, + {118, "ENOTNAM", "not a XENIX named type file"}, + {119, "ENAVAIL", "no XENIX semaphores available"}, + {120, "EISNAM", "is a named type file"}, + {121, "EREMOTEIO", "remote I/O error"}, + {122, "EDQUOT", "disk quota exceeded"}, + {123, "ENOMEDIUM", "no medium found"}, + {124, "EMEDIUMTYPE", "wrong medium type"}, + {125, "ECANCELED", "operation canceled"}, + {126, "ENOKEY", "required key not available"}, + {127, "EKEYEXPIRED", "key has expired"}, + {128, "EKEYREVOKED", "key has been revoked"}, + {129, "EKEYREJECTED", "key was rejected by service"}, + {130, "EOWNERDEAD", "owner died"}, + {131, "ENOTRECOVERABLE", "state not recoverable"}, + {132, "ERFKILL", "operation not possible due to RF-kill"}, + {133, "EHWPOISON", "memory page has hardware error"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/breakpoint trap"}, + {6, "SIGABRT", "aborted"}, + {7, "SIGBUS", "bus error"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGUSR1", "user defined signal 1"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGUSR2", "user defined signal 2"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGSTKFLT", "stack fault"}, + {17, "SIGCHLD", "child exited"}, + {18, "SIGCONT", "continued"}, + {19, "SIGSTOP", "stopped (signal)"}, + {20, "SIGTSTP", "stopped"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGURG", "urgent I/O condition"}, + {24, "SIGXCPU", "CPU time limit exceeded"}, + {25, "SIGXFSZ", "file size limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window changed"}, + {29, "SIGIO", "I/O possible"}, + {30, "SIGPWR", "power failure"}, + {31, "SIGSYS", "bad system call"}, +} diff --git a/api/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go b/api/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go new file mode 100644 index 0000000..95de199 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go @@ -0,0 +1,2142 @@ +// mkerrors.sh -m64 +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build sparc64,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2a + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_X25 = 0x10f + ASI_LEON_DFLUSH = 0x11 + ASI_LEON_IFLUSH = 0x10 + ASI_LEON_MMUFLUSH = 0x18 + B0 = 0x0 + B1000000 = 0x100c + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x100d + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100e + B153600 = 0x1006 + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100f + B230400 = 0x1003 + B2400 = 0xb + B300 = 0x7 + B307200 = 0x1007 + B38400 = 0xf + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x100a + B57600 = 0x1001 + B576000 = 0x100b + B600 = 0x8 + B614400 = 0x1008 + B75 = 0x2 + B76800 = 0x1005 + B921600 = 0x1009 + B9600 = 0xd + BLKBSZGET = 0x80081270 + BLKBSZSET = 0x40081271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80081272 + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + EMT_TAGOVF = 0x1 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x400000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x2000 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x7 + F_GETLK64 = 0x7 + F_GETOWN = 0x5 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x8 + F_SETLK64 = 0x8 + F_SETLKW = 0x9 + F_SETLKW64 = 0x9 + F_SETOWN = 0x6 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x3 + F_WRLCK = 0x2 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x400000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x4000 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_UNICAST_HOPS = 0x10 + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x200 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x100 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x40 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x2000 + MCL_FUTURE = 0x4000 + MCL_ONFAULT = 0x8000 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x400000 + O_CREAT = 0x200 + O_DIRECT = 0x100000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x2000 + O_EXCL = 0x800 + O_FSYNC = 0x802000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x4004 + O_NOATIME = 0x200000 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x4000 + O_PATH = 0x1000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x802000 + O_SYNC = 0x802000 + O_TMPFILE = 0x2010000 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = -0x1 + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPAREGS = 0x14 + PTRACE_GETFPREGS = 0xe + PTRACE_GETFPREGS64 = 0x19 + PTRACE_GETREGS = 0xc + PTRACE_GETREGS64 = 0x16 + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_READDATA = 0x10 + PTRACE_READTEXT = 0x12 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPAREGS = 0x15 + PTRACE_SETFPREGS = 0xf + PTRACE_SETFPREGS64 = 0x1a + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGS64 = 0x17 + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SINGLESTEP = 0x9 + PTRACE_SPARC_DETACH = 0xb + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + PTRACE_WRITEDATA = 0x11 + PTRACE_WRITETEXT = 0x13 + PT_FP = 0x48 + PT_G0 = 0x10 + PT_G1 = 0x14 + PT_G2 = 0x18 + PT_G3 = 0x1c + PT_G4 = 0x20 + PT_G5 = 0x24 + PT_G6 = 0x28 + PT_G7 = 0x2c + PT_I0 = 0x30 + PT_I1 = 0x34 + PT_I2 = 0x38 + PT_I3 = 0x3c + PT_I4 = 0x40 + PT_I5 = 0x44 + PT_I6 = 0x48 + PT_I7 = 0x4c + PT_NPC = 0x8 + PT_PC = 0x4 + PT_PSR = 0x0 + PT_REGS_MAGIC = 0x57ac6c00 + PT_TNPC = 0x90 + PT_TPC = 0x88 + PT_TSTATE = 0x80 + PT_V9_FP = 0x70 + PT_V9_G0 = 0x0 + PT_V9_G1 = 0x8 + PT_V9_G2 = 0x10 + PT_V9_G3 = 0x18 + PT_V9_G4 = 0x20 + PT_V9_G5 = 0x28 + PT_V9_G6 = 0x30 + PT_V9_G7 = 0x38 + PT_V9_I0 = 0x40 + PT_V9_I1 = 0x48 + PT_V9_I2 = 0x50 + PT_V9_I3 = 0x58 + PT_V9_I4 = 0x60 + PT_V9_I5 = 0x68 + PT_V9_I6 = 0x70 + PT_V9_I7 = 0x78 + PT_V9_MAGIC = 0x9c + PT_V9_TNPC = 0x90 + PT_V9_TPC = 0x88 + PT_V9_TSTATE = 0x80 + PT_V9_Y = 0x98 + PT_WIM = 0x10 + PT_Y = 0xc + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x6 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = -0x1 + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x10 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x18 + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x5f + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x14 + RTM_NR_MSGTYPES = 0x50 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x11 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x23 + SCM_TIMESTAMPNS = 0x21 + SCM_WIFI_STATUS = 0x25 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x4004667f + SIOCOUTQ = 0x40047473 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SOCK_CLOEXEC = 0x400000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_NONBLOCK = 0x4000 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0xffff + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x8000 + SO_ATTACH_BPF = 0x34 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x35 + SO_ATTACH_REUSEPORT_EBPF = 0x36 + SO_BINDTODEVICE = 0xd + SO_BPF_EXTENSIONS = 0x32 + SO_BROADCAST = 0x20 + SO_BSDCOMPAT = 0x400 + SO_BUSY_POLL = 0x30 + SO_CNX_ADVICE = 0x37 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x1029 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x33 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_LOCK_FILTER = 0x28 + SO_MARK = 0x22 + SO_MAX_PACING_RATE = 0x31 + SO_NOFCS = 0x27 + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0x100 + SO_PASSCRED = 0x2 + SO_PASSSEC = 0x1f + SO_PEEK_OFF = 0x26 + SO_PEERCRED = 0x40 + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1e + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x1028 + SO_RCVBUF = 0x1002 + SO_RCVBUFFORCE = 0x100b + SO_RCVLOWAT = 0x800 + SO_RCVTIMEO = 0x2000 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RXQ_OVFL = 0x24 + SO_SECURITY_AUTHENTICATION = 0x5001 + SO_SECURITY_ENCRYPTION_NETWORK = 0x5004 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x5002 + SO_SELECT_ERR_QUEUE = 0x29 + SO_SNDBUF = 0x1001 + SO_SNDBUFFORCE = 0x100a + SO_SNDLOWAT = 0x1000 + SO_SNDTIMEO = 0x4000 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x23 + SO_TIMESTAMPNS = 0x21 + SO_TYPE = 0x1008 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x25 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TCFLSH = 0x20005407 + TCGETA = 0x40125401 + TCGETS = 0x40245408 + TCGETS2 = 0x402c540c + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x20005405 + TCSBRKP = 0x5425 + TCSETA = 0x80125402 + TCSETAF = 0x80125404 + TCSETAW = 0x80125403 + TCSETS = 0x80245409 + TCSETS2 = 0x802c540d + TCSETSF = 0x8024540b + TCSETSF2 = 0x802c540f + TCSETSW = 0x8024540a + TCSETSW2 = 0x802c540e + TCXONC = 0x20005406 + TIOCCBRK = 0x2000747a + TIOCCONS = 0x20007424 + TIOCEXCL = 0x2000740d + TIOCGDEV = 0x40045432 + TIOCGETD = 0x40047400 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x40047483 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40047486 + TIOCGRS485 = 0x40205441 + TIOCGSERIAL = 0x541e + TIOCGSID = 0x40047485 + TIOCGSOFTCAR = 0x40047464 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x4004667f + TIOCLINUX = 0x541c + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGET = 0x4004746a + TIOCMIWAIT = 0x545c + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_LOOP = 0x8000 + TIOCM_OUT1 = 0x2000 + TIOCM_OUT2 = 0x4000 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007484 + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x80047401 + TIOCSIG = 0x80047488 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x80047482 + TIOCSPTLCK = 0x80047487 + TIOCSRS485 = 0xc0205442 + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x80047465 + TIOCSTART = 0x2000746e + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x20005437 + TOSTOP = 0x100 + TUNATTACHFILTER = 0x801054d5 + TUNDETACHFILTER = 0x801054d6 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x401054db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETDEBUG = 0x800454c9 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + VDISCARD = 0xd + VDSUSP = 0xb + VEOF = 0x4 + VEOL = 0x5 + VEOL2 = 0x6 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x4 + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WRAP = 0x20000 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XCASE = 0x4 + XTABS = 0x1800 + __TIOCFLUSH = 0x80047410 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EADV = syscall.Errno(0x53) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x25) + EBADE = syscall.Errno(0x66) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x5d) + EBADMSG = syscall.Errno(0x4c) + EBADR = syscall.Errno(0x67) + EBADRQC = syscall.Errno(0x6a) + EBADSLT = syscall.Errno(0x6b) + EBFONT = syscall.Errno(0x6d) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7f) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x5e) + ECOMM = syscall.Errno(0x55) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0x4e) + EDEADLOCK = syscall.Errno(0x6c) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x58) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EHWPOISON = syscall.Errno(0x87) + EIDRM = syscall.Errno(0x4d) + EILSEQ = syscall.Errno(0x7a) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x81) + EKEYREJECTED = syscall.Errno(0x83) + EKEYREVOKED = syscall.Errno(0x82) + EL2HLT = syscall.Errno(0x65) + EL2NSYNC = syscall.Errno(0x5f) + EL3HLT = syscall.Errno(0x60) + EL3RST = syscall.Errno(0x61) + ELIBACC = syscall.Errno(0x72) + ELIBBAD = syscall.Errno(0x70) + ELIBEXEC = syscall.Errno(0x6e) + ELIBMAX = syscall.Errno(0x7b) + ELIBSCN = syscall.Errno(0x7c) + ELNRNG = syscall.Errno(0x62) + ELOOP = syscall.Errno(0x3e) + EMEDIUMTYPE = syscall.Errno(0x7e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x57) + ENAMETOOLONG = syscall.Errno(0x3f) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x69) + ENOBUFS = syscall.Errno(0x37) + ENOCSI = syscall.Errno(0x64) + ENODATA = syscall.Errno(0x6f) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x80) + ENOLCK = syscall.Errno(0x4f) + ENOLINK = syscall.Errno(0x52) + ENOMEDIUM = syscall.Errno(0x7d) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x4b) + ENONET = syscall.Errno(0x50) + ENOPKG = syscall.Errno(0x71) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x4a) + ENOSTR = syscall.Errno(0x48) + ENOSYS = syscall.Errno(0x5a) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x85) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x73) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x5c) + EOWNERDEAD = syscall.Errno(0x84) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROTO = syscall.Errno(0x56) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x59) + EREMOTE = syscall.Errno(0x47) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x74) + ERFKILL = syscall.Errno(0x86) + EROFS = syscall.Errno(0x1e) + ERREMOTE = syscall.Errno(0x51) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x54) + ESTALE = syscall.Errno(0x46) + ESTRPIPE = syscall.Errno(0x5b) + ETIME = syscall.Errno(0x49) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x63) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x68) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGLOST = syscall.Signal(0x1d) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x17) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1d) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "no such device or address", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource temporarily unavailable", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device or resource busy", + 17: "file exists", + 18: "invalid cross-device link", + 19: "no such device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "numerical result out of range", + 36: "operation now in progress", + 37: "operation already in progress", + 38: "socket operation on non-socket", + 39: "destination address required", + 40: "message too long", + 41: "protocol wrong type for socket", + 42: "protocol not available", + 43: "protocol not supported", + 44: "socket type not supported", + 45: "operation not supported", + 46: "protocol family not supported", + 47: "address family not supported by protocol", + 48: "address already in use", + 49: "cannot assign requested address", + 50: "network is down", + 51: "network is unreachable", + 52: "network dropped connection on reset", + 53: "software caused connection abort", + 54: "connection reset by peer", + 55: "no buffer space available", + 56: "transport endpoint is already connected", + 57: "transport endpoint is not connected", + 58: "cannot send after transport endpoint shutdown", + 59: "too many references: cannot splice", + 60: "connection timed out", + 61: "connection refused", + 62: "too many levels of symbolic links", + 63: "file name too long", + 64: "host is down", + 65: "no route to host", + 66: "directory not empty", + 67: "too many processes", + 68: "too many users", + 69: "disk quota exceeded", + 70: "stale file handle", + 71: "object is remote", + 72: "device not a stream", + 73: "timer expired", + 74: "out of streams resources", + 75: "no message of desired type", + 76: "bad message", + 77: "identifier removed", + 78: "resource deadlock avoided", + 79: "no locks available", + 80: "machine is not on the network", + 81: "unknown error 81", + 82: "link has been severed", + 83: "advertise error", + 84: "srmount error", + 85: "communication error on send", + 86: "protocol error", + 87: "multihop attempted", + 88: "RFS specific error", + 89: "remote address changed", + 90: "function not implemented", + 91: "streams pipe error", + 92: "value too large for defined data type", + 93: "file descriptor in bad state", + 94: "channel number out of range", + 95: "level 2 not synchronized", + 96: "level 3 halted", + 97: "level 3 reset", + 98: "link number out of range", + 99: "protocol driver not attached", + 100: "no CSI structure available", + 101: "level 2 halted", + 102: "invalid exchange", + 103: "invalid request descriptor", + 104: "exchange full", + 105: "no anode", + 106: "invalid request code", + 107: "invalid slot", + 108: "file locking deadlock error", + 109: "bad font file format", + 110: "cannot exec a shared library directly", + 111: "no data available", + 112: "accessing a corrupted shared library", + 113: "package not installed", + 114: "can not access a needed shared library", + 115: "name not unique on network", + 116: "interrupted system call should be restarted", + 117: "structure needs cleaning", + 118: "not a XENIX named type file", + 119: "no XENIX semaphores available", + 120: "is a named type file", + 121: "remote I/O error", + 122: "invalid or incomplete multibyte or wide character", + 123: "attempting to link in too many shared libraries", + 124: ".lib section in a.out corrupted", + 125: "no medium found", + 126: "wrong medium type", + 127: "operation canceled", + 128: "required key not available", + 129: "key has expired", + 130: "key has been revoked", + 131: "key was rejected by service", + 132: "owner died", + 133: "state not recoverable", + 134: "operation not possible due to RF-kill", + 135: "memory page has hardware error", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/breakpoint trap", + 6: "aborted", + 7: "EMT trap", + 8: "floating point exception", + 9: "killed", + 10: "bus error", + 11: "segmentation fault", + 12: "bad system call", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "urgent I/O condition", + 17: "stopped (signal)", + 18: "stopped", + 19: "continued", + 20: "child exited", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "I/O possible", + 24: "CPU time limit exceeded", + 25: "file size limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window changed", + 29: "resource lost", + 30: "user defined signal 1", + 31: "user defined signal 2", +} diff --git a/api/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go b/api/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go new file mode 100644 index 0000000..cd93ce0 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go @@ -0,0 +1,1728 @@ +// mkerrors.sh -m32 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,netbsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m32 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_ARP = 0x1c + AF_BLUETOOTH = 0x1f + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x20 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x18 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x23 + AF_MPLS = 0x21 + AF_NATM = 0x1b + AF_NS = 0x6 + AF_OROUTE = 0x11 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x22 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + ARPHRD_ARCNET = 0x7 + ARPHRD_ETHER = 0x1 + ARPHRD_FRELAY = 0xf + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_STRIP = 0x17 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B460800 = 0x70800 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B921600 = 0xe1000 + B9600 = 0x2580 + BIOCFEEDBACK = 0x8004427d + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0084277 + BIOCGETIF = 0x4090426b + BIOCGFEEDBACK = 0x4004427c + BIOCGHDRCMPLT = 0x40044274 + BIOCGRTIMEOUT = 0x400c427b + BIOCGSEESENT = 0x40044278 + BIOCGSTATS = 0x4080426f + BIOCGSTATSOLD = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044276 + BIOCSETF = 0x80084267 + BIOCSETIF = 0x8090426c + BIOCSFEEDBACK = 0x8004427d + BIOCSHDRCMPLT = 0x80044275 + BIOCSRTIMEOUT = 0x800c427a + BIOCSSEESENT = 0x80044279 + BIOCSTCPF = 0x80084272 + BIOCSUDPF = 0x80084273 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALIGNMENT32 = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DFLTBUFSIZE = 0x100000 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x1000000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLONE_CSIGNAL = 0xff + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_PID = 0x1000 + CLONE_PTRACE = 0x2000 + CLONE_SIGHAND = 0x800 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CREAD = 0x800 + CRTSCTS = 0x10000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + CTL_QUERY = -0x2 + DIOCBSFLUSH = 0x20006478 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HDLC = 0x10 + DLT_HHDLC = 0x79 + DLT_HIPPI = 0xf + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0xe + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RAWAF_MASK = 0x2240000 + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xd + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EMUL_LINUX = 0x1 + EMUL_LINUX32 = 0x5 + EMUL_MAXID = 0x6 + EN_SW_CTL_INF = 0x1000 + EN_SW_CTL_PREC = 0x300 + EN_SW_CTL_ROUND = 0xc00 + EN_SW_DATACHAIN = 0x80 + EN_SW_DENORM = 0x2 + EN_SW_INVOP = 0x1 + EN_SW_OVERFLOW = 0x8 + EN_SW_PRECLOSS = 0x20 + EN_SW_UNDERFLOW = 0x10 + EN_SW_ZERODIV = 0x4 + ETHERCAP_JUMBO_MTU = 0x4 + ETHERCAP_VLAN_HWTAGGING = 0x2 + ETHERCAP_VLAN_MTU = 0x1 + ETHERMIN = 0x2e + ETHERMTU = 0x5dc + ETHERMTU_JUMBO = 0x2328 + ETHERTYPE_8023 = 0x4 + ETHERTYPE_AARP = 0x80f3 + ETHERTYPE_ACCTON = 0x8390 + ETHERTYPE_AEONIC = 0x8036 + ETHERTYPE_ALPHA = 0x814a + ETHERTYPE_AMBER = 0x6008 + ETHERTYPE_AMOEBA = 0x8145 + ETHERTYPE_APOLLO = 0x80f7 + ETHERTYPE_APOLLODOMAIN = 0x8019 + ETHERTYPE_APPLETALK = 0x809b + ETHERTYPE_APPLITEK = 0x80c7 + ETHERTYPE_ARGONAUT = 0x803a + ETHERTYPE_ARP = 0x806 + ETHERTYPE_AT = 0x809b + ETHERTYPE_ATALK = 0x809b + ETHERTYPE_ATOMIC = 0x86df + ETHERTYPE_ATT = 0x8069 + ETHERTYPE_ATTSTANFORD = 0x8008 + ETHERTYPE_AUTOPHON = 0x806a + ETHERTYPE_AXIS = 0x8856 + ETHERTYPE_BCLOOP = 0x9003 + ETHERTYPE_BOFL = 0x8102 + ETHERTYPE_CABLETRON = 0x7034 + ETHERTYPE_CHAOS = 0x804 + ETHERTYPE_COMDESIGN = 0x806c + ETHERTYPE_COMPUGRAPHIC = 0x806d + ETHERTYPE_COUNTERPOINT = 0x8062 + ETHERTYPE_CRONUS = 0x8004 + ETHERTYPE_CRONUSVLN = 0x8003 + ETHERTYPE_DCA = 0x1234 + ETHERTYPE_DDE = 0x807b + ETHERTYPE_DEBNI = 0xaaaa + ETHERTYPE_DECAM = 0x8048 + ETHERTYPE_DECCUST = 0x6006 + ETHERTYPE_DECDIAG = 0x6005 + ETHERTYPE_DECDNS = 0x803c + ETHERTYPE_DECDTS = 0x803e + ETHERTYPE_DECEXPER = 0x6000 + ETHERTYPE_DECLAST = 0x8041 + ETHERTYPE_DECLTM = 0x803f + ETHERTYPE_DECMUMPS = 0x6009 + ETHERTYPE_DECNETBIOS = 0x8040 + ETHERTYPE_DELTACON = 0x86de + ETHERTYPE_DIDDLE = 0x4321 + ETHERTYPE_DLOG1 = 0x660 + ETHERTYPE_DLOG2 = 0x661 + ETHERTYPE_DN = 0x6003 + ETHERTYPE_DOGFIGHT = 0x1989 + ETHERTYPE_DSMD = 0x8039 + ETHERTYPE_ECMA = 0x803 + ETHERTYPE_ENCRYPT = 0x803d + ETHERTYPE_ES = 0x805d + ETHERTYPE_EXCELAN = 0x8010 + ETHERTYPE_EXPERDATA = 0x8049 + ETHERTYPE_FLIP = 0x8146 + ETHERTYPE_FLOWCONTROL = 0x8808 + ETHERTYPE_FRARP = 0x808 + ETHERTYPE_GENDYN = 0x8068 + ETHERTYPE_HAYES = 0x8130 + ETHERTYPE_HIPPI_FP = 0x8180 + ETHERTYPE_HITACHI = 0x8820 + ETHERTYPE_HP = 0x8005 + ETHERTYPE_IEEEPUP = 0xa00 + ETHERTYPE_IEEEPUPAT = 0xa01 + ETHERTYPE_IMLBL = 0x4c42 + ETHERTYPE_IMLBLDIAG = 0x424c + ETHERTYPE_IP = 0x800 + ETHERTYPE_IPAS = 0x876c + ETHERTYPE_IPV6 = 0x86dd + ETHERTYPE_IPX = 0x8137 + ETHERTYPE_IPXNEW = 0x8037 + ETHERTYPE_KALPANA = 0x8582 + ETHERTYPE_LANBRIDGE = 0x8038 + ETHERTYPE_LANPROBE = 0x8888 + ETHERTYPE_LAT = 0x6004 + ETHERTYPE_LBACK = 0x9000 + ETHERTYPE_LITTLE = 0x8060 + ETHERTYPE_LOGICRAFT = 0x8148 + ETHERTYPE_LOOPBACK = 0x9000 + ETHERTYPE_MATRA = 0x807a + ETHERTYPE_MAX = 0xffff + ETHERTYPE_MERIT = 0x807c + ETHERTYPE_MICP = 0x873a + ETHERTYPE_MOPDL = 0x6001 + ETHERTYPE_MOPRC = 0x6002 + ETHERTYPE_MOTOROLA = 0x818d + ETHERTYPE_MPLS = 0x8847 + ETHERTYPE_MPLS_MCAST = 0x8848 + ETHERTYPE_MUMPS = 0x813f + ETHERTYPE_NBPCC = 0x3c04 + ETHERTYPE_NBPCLAIM = 0x3c09 + ETHERTYPE_NBPCLREQ = 0x3c05 + ETHERTYPE_NBPCLRSP = 0x3c06 + ETHERTYPE_NBPCREQ = 0x3c02 + ETHERTYPE_NBPCRSP = 0x3c03 + ETHERTYPE_NBPDG = 0x3c07 + ETHERTYPE_NBPDGB = 0x3c08 + ETHERTYPE_NBPDLTE = 0x3c0a + ETHERTYPE_NBPRAR = 0x3c0c + ETHERTYPE_NBPRAS = 0x3c0b + ETHERTYPE_NBPRST = 0x3c0d + ETHERTYPE_NBPSCD = 0x3c01 + ETHERTYPE_NBPVCD = 0x3c00 + ETHERTYPE_NBS = 0x802 + ETHERTYPE_NCD = 0x8149 + ETHERTYPE_NESTAR = 0x8006 + ETHERTYPE_NETBEUI = 0x8191 + ETHERTYPE_NOVELL = 0x8138 + ETHERTYPE_NS = 0x600 + ETHERTYPE_NSAT = 0x601 + ETHERTYPE_NSCOMPAT = 0x807 + ETHERTYPE_NTRAILER = 0x10 + ETHERTYPE_OS9 = 0x7007 + ETHERTYPE_OS9NET = 0x7009 + ETHERTYPE_PACER = 0x80c6 + ETHERTYPE_PAE = 0x888e + ETHERTYPE_PCS = 0x4242 + ETHERTYPE_PLANNING = 0x8044 + ETHERTYPE_PPP = 0x880b + ETHERTYPE_PPPOE = 0x8864 + ETHERTYPE_PPPOEDISC = 0x8863 + ETHERTYPE_PRIMENTS = 0x7031 + ETHERTYPE_PUP = 0x200 + ETHERTYPE_PUPAT = 0x200 + ETHERTYPE_RACAL = 0x7030 + ETHERTYPE_RATIONAL = 0x8150 + ETHERTYPE_RAWFR = 0x6559 + ETHERTYPE_RCL = 0x1995 + ETHERTYPE_RDP = 0x8739 + ETHERTYPE_RETIX = 0x80f2 + ETHERTYPE_REVARP = 0x8035 + ETHERTYPE_SCA = 0x6007 + ETHERTYPE_SECTRA = 0x86db + ETHERTYPE_SECUREDATA = 0x876d + ETHERTYPE_SGITW = 0x817e + ETHERTYPE_SG_BOUNCE = 0x8016 + ETHERTYPE_SG_DIAG = 0x8013 + ETHERTYPE_SG_NETGAMES = 0x8014 + ETHERTYPE_SG_RESV = 0x8015 + ETHERTYPE_SIMNET = 0x5208 + ETHERTYPE_SLOWPROTOCOLS = 0x8809 + ETHERTYPE_SNA = 0x80d5 + ETHERTYPE_SNMP = 0x814c + ETHERTYPE_SONIX = 0xfaf5 + ETHERTYPE_SPIDER = 0x809f + ETHERTYPE_SPRITE = 0x500 + ETHERTYPE_STP = 0x8181 + ETHERTYPE_TALARIS = 0x812b + ETHERTYPE_TALARISMC = 0x852b + ETHERTYPE_TCPCOMP = 0x876b + ETHERTYPE_TCPSM = 0x9002 + ETHERTYPE_TEC = 0x814f + ETHERTYPE_TIGAN = 0x802f + ETHERTYPE_TRAIL = 0x1000 + ETHERTYPE_TRANSETHER = 0x6558 + ETHERTYPE_TYMSHARE = 0x802e + ETHERTYPE_UBBST = 0x7005 + ETHERTYPE_UBDEBUG = 0x900 + ETHERTYPE_UBDIAGLOOP = 0x7002 + ETHERTYPE_UBDL = 0x7000 + ETHERTYPE_UBNIU = 0x7001 + ETHERTYPE_UBNMC = 0x7003 + ETHERTYPE_VALID = 0x1600 + ETHERTYPE_VARIAN = 0x80dd + ETHERTYPE_VAXELN = 0x803b + ETHERTYPE_VEECO = 0x8067 + ETHERTYPE_VEXP = 0x805b + ETHERTYPE_VGLAB = 0x8131 + ETHERTYPE_VINES = 0xbad + ETHERTYPE_VINESECHO = 0xbaf + ETHERTYPE_VINESLOOP = 0xbae + ETHERTYPE_VITAL = 0xff00 + ETHERTYPE_VLAN = 0x8100 + ETHERTYPE_VLTLMAN = 0x8080 + ETHERTYPE_VPROD = 0x805c + ETHERTYPE_VURESERVED = 0x8147 + ETHERTYPE_WATERLOO = 0x8130 + ETHERTYPE_WELLFLEET = 0x8103 + ETHERTYPE_X25 = 0x805 + ETHERTYPE_X75 = 0x801 + ETHERTYPE_XNSSM = 0x9001 + ETHERTYPE_XTP = 0x817d + ETHER_ADDR_LEN = 0x6 + ETHER_CRC_LEN = 0x4 + ETHER_CRC_POLY_BE = 0x4c11db6 + ETHER_CRC_POLY_LE = 0xedb88320 + ETHER_HDR_LEN = 0xe + ETHER_MAX_LEN = 0x5ee + ETHER_MAX_LEN_JUMBO = 0x233a + ETHER_MIN_LEN = 0x40 + ETHER_PPPOE_ENCAP_LEN = 0x8 + ETHER_TYPE_LEN = 0x2 + ETHER_VLAN_ENCAP_LEN = 0x4 + EVFILT_AIO = 0x2 + EVFILT_PROC = 0x4 + EVFILT_READ = 0x0 + EVFILT_SIGNAL = 0x5 + EVFILT_SYSCOUNT = 0x7 + EVFILT_TIMER = 0x6 + EVFILT_VNODE = 0x3 + EVFILT_WRITE = 0x1 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x100 + FLUSHO = 0x800000 + F_CLOSEM = 0xa + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0xc + F_FSCTL = -0x80000000 + F_FSDIRMASK = 0x70000000 + F_FSIN = 0x10000000 + F_FSINOUT = 0x30000000 + F_FSOUT = 0x20000000 + F_FSPRIV = 0x8000 + F_FSVOID = 0x40000000 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETNOSIGPIPE = 0xd + F_GETOWN = 0x5 + F_MAXFD = 0xb + F_OK = 0x0 + F_PARAM_MASK = 0xfff + F_PARAM_MAX = 0xfff + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETNOSIGPIPE = 0xe + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFA_ROUTE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x8f52 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf8 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ECONET = 0xce + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf2 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INFINIBAND = 0xc7 + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LINEGROUP = 0xd2 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PLC = 0xae + IFT_PON155 = 0xcf + IFT_PON622 = 0xd0 + IFT_POS = 0xab + IFT_PPP = 0x17 + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPATM = 0xc5 + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf1 + IFT_Q2931 = 0xc9 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SIPSIG = 0xcc + IFT_SIPTG = 0xcb + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_STF = 0xd7 + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TELINK = 0xc8 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VIRTUALTG = 0xca + IFT_VOICEDID = 0xd5 + IFT_VOICEEM = 0x64 + IFT_VOICEEMFGD = 0xd3 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFGDEANA = 0xd4 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERCABLE = 0xc6 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IPPROTO_AH = 0x33 + IPPROTO_CARP = 0x70 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPIP = 0x4 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IPV6_ICMP = 0x3a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MOBILE = 0x37 + IPPROTO_NONE = 0x3b + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_VRRP = 0x70 + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXPACKET = 0xffff + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_EF = 0x8000 + IP_ERRORMTU = 0x15 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x16 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINFRAGSIZE = 0x45 + IP_MINTTL = 0x18 + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVTTL = 0x17 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_TOS = 0x3 + IP_TTL = 0x4 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x6 + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_SPACEAVAIL = 0x5 + MADV_WILLNEED = 0x3 + MAP_ALIGNMENT_16MB = 0x18000000 + MAP_ALIGNMENT_1TB = 0x28000000 + MAP_ALIGNMENT_256TB = 0x30000000 + MAP_ALIGNMENT_4GB = 0x20000000 + MAP_ALIGNMENT_64KB = 0x10000000 + MAP_ALIGNMENT_64PB = 0x38000000 + MAP_ALIGNMENT_MASK = -0x1000000 + MAP_ALIGNMENT_SHIFT = 0x18 + MAP_ANON = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_INHERIT = 0x80 + MAP_INHERIT_COPY = 0x1 + MAP_INHERIT_DEFAULT = 0x1 + MAP_INHERIT_DONATE_COPY = 0x3 + MAP_INHERIT_NONE = 0x2 + MAP_INHERIT_SHARE = 0x0 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_STACK = 0x2000 + MAP_TRYFIXED = 0x400 + MAP_WIRED = 0x800 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MSG_BCAST = 0x100 + MSG_CMSG_CLOEXEC = 0x800 + MSG_CONTROLMBUF = 0x2000000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOR = 0x8 + MSG_IOVUSRSPACE = 0x4000000 + MSG_LENUSRSPACE = 0x8000000 + MSG_MCAST = 0x200 + MSG_NAMEMBUF = 0x1000000 + MSG_NBIO = 0x1000 + MSG_NOSIGNAL = 0x400 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_USERFLAGS = 0xffffff + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x4 + NAME_MAX = 0x1ff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x5 + NET_RT_MAXID = 0x6 + NET_RT_OIFLIST = 0x4 + NET_RT_OOIFLIST = 0x3 + NOFLSH = 0x80000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OFIOGETBMAP = 0xc004667a + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_ALT_IO = 0x40000 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x400000 + O_CREAT = 0x200 + O_DIRECT = 0x80000 + O_DIRECTORY = 0x200000 + O_DSYNC = 0x10000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_NOSIGPIPE = 0x1000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x20000 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PRI_IOFLUSH = 0x7c + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x8 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x9 + RTAX_NETMASK = 0x2 + RTAX_TAG = 0x8 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTA_TAG = 0x100 + RTF_ANNOUNCE = 0x20000 + RTF_BLACKHOLE = 0x1000 + RTF_CLONED = 0x2000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_MASK = 0x80 + RTF_MODIFIED = 0x20 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_REJECT = 0x8 + RTF_SRC = 0x10000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_CHGADDR = 0x15 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x11 + RTM_IFANNOUNCE = 0x10 + RTM_IFINFO = 0x14 + RTM_LLINFO_UPD = 0x13 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_OIFINFO = 0xf + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_OOIFINFO = 0xe + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_SETGATE = 0x12 + RTM_VERSION = 0x4 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x4 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x8 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80906931 + SIOCADDRT = 0x8030720a + SIOCAIFADDR = 0x8040691a + SIOCALIFADDR = 0x8118691c + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80906932 + SIOCDELRT = 0x8030720b + SIOCDIFADDR = 0x80906919 + SIOCDIFPHYADDR = 0x80906949 + SIOCDLIFADDR = 0x8118691e + SIOCGDRVSPEC = 0xc01c697b + SIOCGETPFSYNC = 0xc09069f8 + SIOCGETSGCNT = 0xc0147534 + SIOCGETVIFCNT = 0xc0147533 + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0906921 + SIOCGIFADDRPREF = 0xc0946920 + SIOCGIFALIAS = 0xc040691b + SIOCGIFBRDADDR = 0xc0906923 + SIOCGIFCAP = 0xc0206976 + SIOCGIFCONF = 0xc0086926 + SIOCGIFDATA = 0xc0946985 + SIOCGIFDLT = 0xc0906977 + SIOCGIFDSTADDR = 0xc0906922 + SIOCGIFFLAGS = 0xc0906911 + SIOCGIFGENERIC = 0xc090693a + SIOCGIFMEDIA = 0xc0286936 + SIOCGIFMETRIC = 0xc0906917 + SIOCGIFMTU = 0xc090697e + SIOCGIFNETMASK = 0xc0906925 + SIOCGIFPDSTADDR = 0xc0906948 + SIOCGIFPSRCADDR = 0xc0906947 + SIOCGLIFADDR = 0xc118691d + SIOCGLIFPHYADDR = 0xc118694b + SIOCGLINKSTR = 0xc01c6987 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGVH = 0xc0906983 + SIOCIFCREATE = 0x8090697a + SIOCIFDESTROY = 0x80906979 + SIOCIFGCLONERS = 0xc00c6978 + SIOCINITIFADDR = 0xc0446984 + SIOCSDRVSPEC = 0x801c697b + SIOCSETPFSYNC = 0x809069f7 + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8090690c + SIOCSIFADDRPREF = 0x8094691f + SIOCSIFBRDADDR = 0x80906913 + SIOCSIFCAP = 0x80206975 + SIOCSIFDSTADDR = 0x8090690e + SIOCSIFFLAGS = 0x80906910 + SIOCSIFGENERIC = 0x80906939 + SIOCSIFMEDIA = 0xc0906935 + SIOCSIFMETRIC = 0x80906918 + SIOCSIFMTU = 0x8090697f + SIOCSIFNETMASK = 0x80906916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSLIFPHYADDR = 0x8118694a + SIOCSLINKSTR = 0x801c6988 + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSVH = 0xc0906982 + SIOCZIFDATA = 0xc0946986 + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_FLAGS_MASK = 0xf0000000 + SOCK_NONBLOCK = 0x20000000 + SOCK_NOSIGPIPE = 0x40000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_NOHEADER = 0x100a + SO_NOSIGPIPE = 0x800 + SO_OOBINLINE = 0x100 + SO_OVERFLOWED = 0x1009 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x100c + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x100b + SO_TIMESTAMP = 0x2000 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SYSCTL_VERSION = 0x1000000 + SYSCTL_VERS_0 = 0x0 + SYSCTL_VERS_1 = 0x1000000 + SYSCTL_VERS_MASK = 0xff000000 + S_ARCH1 = 0x10000 + S_ARCH2 = 0x20000 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFWHT = 0xe000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + S_LOGIN_SET = 0x1 + TCIFLUSH = 0x1 + TCIOFLUSH = 0x3 + TCOFLUSH = 0x2 + TCP_CONGCTL = 0x20 + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x3 + TCP_KEEPINIT = 0x7 + TCP_KEEPINTVL = 0x5 + TCP_MAXBURST = 0x4 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x10 + TCP_MINMSS = 0xd8 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x400c7458 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLAG_CDTRCTS = 0x10 + TIOCFLAG_CLOCAL = 0x2 + TIOCFLAG_CRTSCTS = 0x4 + TIOCFLAG_MDMBUF = 0x8 + TIOCFLAG_SOFTCAR = 0x1 + TIOCFLUSH = 0x80047410 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGFLAGS = 0x4004745d + TIOCGLINED = 0x40207442 + TIOCGPGRP = 0x40047477 + TIOCGQSIZE = 0x40047481 + TIOCGRANTPT = 0x20007447 + TIOCGSID = 0x40047463 + TIOCGSIZE = 0x40087468 + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGET = 0x4004746a + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTMGET = 0x40287446 + TIOCPTSNAME = 0x40287448 + TIOCRCVFRAME = 0x80047445 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSFLAGS = 0x8004745c + TIOCSIG = 0x2000745f + TIOCSLINED = 0x80207443 + TIOCSPGRP = 0x80047476 + TIOCSQSIZE = 0x80047480 + TIOCSSIZE = 0x80087467 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x80047465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCUCNTL = 0x80047466 + TIOCXMTFRAME = 0x80047444 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WALL = 0x8 + WALLSIG = 0x8 + WALTSIG = 0x4 + WCLONE = 0x4 + WCOREFLAG = 0x80 + WNOHANG = 0x1 + WNOWAIT = 0x10000 + WNOZOMBIE = 0x20000 + WOPTSCHECKED = 0x40000 + WSTOPPED = 0x7f + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x58) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x57) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x52) + EILSEQ = syscall.Errno(0x55) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x60) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5e) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x5d) + ENOBUFS = syscall.Errno(0x37) + ENODATA = syscall.Errno(0x59) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x5f) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x53) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x5a) + ENOSTR = syscall.Errno(0x5b) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x56) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x54) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x60) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIME = syscall.Errno(0x5c) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x20) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "device not configured"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EDEADLK", "resource deadlock avoided"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "cross-device link"}, + {19, "ENODEV", "operation not supported by device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "result too large or too small"}, + {35, "EAGAIN", "resource temporarily unavailable"}, + {36, "EINPROGRESS", "operation now in progress"}, + {37, "EALREADY", "operation already in progress"}, + {38, "ENOTSOCK", "socket operation on non-socket"}, + {39, "EDESTADDRREQ", "destination address required"}, + {40, "EMSGSIZE", "message too long"}, + {41, "EPROTOTYPE", "protocol wrong type for socket"}, + {42, "ENOPROTOOPT", "protocol option not available"}, + {43, "EPROTONOSUPPORT", "protocol not supported"}, + {44, "ESOCKTNOSUPPORT", "socket type not supported"}, + {45, "EOPNOTSUPP", "operation not supported"}, + {46, "EPFNOSUPPORT", "protocol family not supported"}, + {47, "EAFNOSUPPORT", "address family not supported by protocol family"}, + {48, "EADDRINUSE", "address already in use"}, + {49, "EADDRNOTAVAIL", "can't assign requested address"}, + {50, "ENETDOWN", "network is down"}, + {51, "ENETUNREACH", "network is unreachable"}, + {52, "ENETRESET", "network dropped connection on reset"}, + {53, "ECONNABORTED", "software caused connection abort"}, + {54, "ECONNRESET", "connection reset by peer"}, + {55, "ENOBUFS", "no buffer space available"}, + {56, "EISCONN", "socket is already connected"}, + {57, "ENOTCONN", "socket is not connected"}, + {58, "ESHUTDOWN", "can't send after socket shutdown"}, + {59, "ETOOMANYREFS", "too many references: can't splice"}, + {60, "ETIMEDOUT", "connection timed out"}, + {61, "ECONNREFUSED", "connection refused"}, + {62, "ELOOP", "too many levels of symbolic links"}, + {63, "ENAMETOOLONG", "file name too long"}, + {64, "EHOSTDOWN", "host is down"}, + {65, "EHOSTUNREACH", "no route to host"}, + {66, "ENOTEMPTY", "directory not empty"}, + {67, "EPROCLIM", "too many processes"}, + {68, "EUSERS", "too many users"}, + {69, "EDQUOT", "disc quota exceeded"}, + {70, "ESTALE", "stale NFS file handle"}, + {71, "EREMOTE", "too many levels of remote in path"}, + {72, "EBADRPC", "RPC struct is bad"}, + {73, "ERPCMISMATCH", "RPC version wrong"}, + {74, "EPROGUNAVAIL", "RPC prog. not avail"}, + {75, "EPROGMISMATCH", "program version wrong"}, + {76, "EPROCUNAVAIL", "bad procedure for program"}, + {77, "ENOLCK", "no locks available"}, + {78, "ENOSYS", "function not implemented"}, + {79, "EFTYPE", "inappropriate file type or format"}, + {80, "EAUTH", "authentication error"}, + {81, "ENEEDAUTH", "need authenticator"}, + {82, "EIDRM", "identifier removed"}, + {83, "ENOMSG", "no message of desired type"}, + {84, "EOVERFLOW", "value too large to be stored in data type"}, + {85, "EILSEQ", "illegal byte sequence"}, + {86, "ENOTSUP", "not supported"}, + {87, "ECANCELED", "operation Canceled"}, + {88, "EBADMSG", "bad or Corrupt message"}, + {89, "ENODATA", "no message available"}, + {90, "ENOSR", "no STREAM resources"}, + {91, "ENOSTR", "not a STREAM"}, + {92, "ETIME", "STREAM ioctl timeout"}, + {93, "ENOATTR", "attribute not found"}, + {94, "EMULTIHOP", "multihop attempted"}, + {95, "ENOLINK", "link has been severed"}, + {96, "ELAST", "protocol error"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/BPT trap"}, + {6, "SIGIOT", "abort trap"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGURG", "urgent I/O condition"}, + {17, "SIGSTOP", "stopped (signal)"}, + {18, "SIGTSTP", "stopped"}, + {19, "SIGCONT", "continued"}, + {20, "SIGCHLD", "child exited"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGIO", "I/O possible"}, + {24, "SIGXCPU", "cputime limit exceeded"}, + {25, "SIGXFSZ", "filesize limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window size changes"}, + {29, "SIGINFO", "information request"}, + {30, "SIGUSR1", "user defined signal 1"}, + {31, "SIGUSR2", "user defined signal 2"}, + {32, "SIGPWR", "power fail/restart"}, +} diff --git a/api/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go b/api/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go new file mode 100644 index 0000000..071701c --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go @@ -0,0 +1,1718 @@ +// mkerrors.sh -m64 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,netbsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_ARP = 0x1c + AF_BLUETOOTH = 0x1f + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x20 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x18 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x23 + AF_MPLS = 0x21 + AF_NATM = 0x1b + AF_NS = 0x6 + AF_OROUTE = 0x11 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x22 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + ARPHRD_ARCNET = 0x7 + ARPHRD_ETHER = 0x1 + ARPHRD_FRELAY = 0xf + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_STRIP = 0x17 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B460800 = 0x70800 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B921600 = 0xe1000 + B9600 = 0x2580 + BIOCFEEDBACK = 0x8004427d + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0104277 + BIOCGETIF = 0x4090426b + BIOCGFEEDBACK = 0x4004427c + BIOCGHDRCMPLT = 0x40044274 + BIOCGRTIMEOUT = 0x4010427b + BIOCGSEESENT = 0x40044278 + BIOCGSTATS = 0x4080426f + BIOCGSTATSOLD = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044276 + BIOCSETF = 0x80104267 + BIOCSETIF = 0x8090426c + BIOCSFEEDBACK = 0x8004427d + BIOCSHDRCMPLT = 0x80044275 + BIOCSRTIMEOUT = 0x8010427a + BIOCSSEESENT = 0x80044279 + BIOCSTCPF = 0x80104272 + BIOCSUDPF = 0x80104273 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x8 + BPF_ALIGNMENT32 = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DFLTBUFSIZE = 0x100000 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x1000000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLONE_CSIGNAL = 0xff + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_PID = 0x1000 + CLONE_PTRACE = 0x2000 + CLONE_SIGHAND = 0x800 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CREAD = 0x800 + CRTSCTS = 0x10000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + CTL_QUERY = -0x2 + DIOCBSFLUSH = 0x20006478 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HDLC = 0x10 + DLT_HHDLC = 0x79 + DLT_HIPPI = 0xf + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0xe + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RAWAF_MASK = 0x2240000 + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xd + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EMUL_LINUX = 0x1 + EMUL_LINUX32 = 0x5 + EMUL_MAXID = 0x6 + ETHERCAP_JUMBO_MTU = 0x4 + ETHERCAP_VLAN_HWTAGGING = 0x2 + ETHERCAP_VLAN_MTU = 0x1 + ETHERMIN = 0x2e + ETHERMTU = 0x5dc + ETHERMTU_JUMBO = 0x2328 + ETHERTYPE_8023 = 0x4 + ETHERTYPE_AARP = 0x80f3 + ETHERTYPE_ACCTON = 0x8390 + ETHERTYPE_AEONIC = 0x8036 + ETHERTYPE_ALPHA = 0x814a + ETHERTYPE_AMBER = 0x6008 + ETHERTYPE_AMOEBA = 0x8145 + ETHERTYPE_APOLLO = 0x80f7 + ETHERTYPE_APOLLODOMAIN = 0x8019 + ETHERTYPE_APPLETALK = 0x809b + ETHERTYPE_APPLITEK = 0x80c7 + ETHERTYPE_ARGONAUT = 0x803a + ETHERTYPE_ARP = 0x806 + ETHERTYPE_AT = 0x809b + ETHERTYPE_ATALK = 0x809b + ETHERTYPE_ATOMIC = 0x86df + ETHERTYPE_ATT = 0x8069 + ETHERTYPE_ATTSTANFORD = 0x8008 + ETHERTYPE_AUTOPHON = 0x806a + ETHERTYPE_AXIS = 0x8856 + ETHERTYPE_BCLOOP = 0x9003 + ETHERTYPE_BOFL = 0x8102 + ETHERTYPE_CABLETRON = 0x7034 + ETHERTYPE_CHAOS = 0x804 + ETHERTYPE_COMDESIGN = 0x806c + ETHERTYPE_COMPUGRAPHIC = 0x806d + ETHERTYPE_COUNTERPOINT = 0x8062 + ETHERTYPE_CRONUS = 0x8004 + ETHERTYPE_CRONUSVLN = 0x8003 + ETHERTYPE_DCA = 0x1234 + ETHERTYPE_DDE = 0x807b + ETHERTYPE_DEBNI = 0xaaaa + ETHERTYPE_DECAM = 0x8048 + ETHERTYPE_DECCUST = 0x6006 + ETHERTYPE_DECDIAG = 0x6005 + ETHERTYPE_DECDNS = 0x803c + ETHERTYPE_DECDTS = 0x803e + ETHERTYPE_DECEXPER = 0x6000 + ETHERTYPE_DECLAST = 0x8041 + ETHERTYPE_DECLTM = 0x803f + ETHERTYPE_DECMUMPS = 0x6009 + ETHERTYPE_DECNETBIOS = 0x8040 + ETHERTYPE_DELTACON = 0x86de + ETHERTYPE_DIDDLE = 0x4321 + ETHERTYPE_DLOG1 = 0x660 + ETHERTYPE_DLOG2 = 0x661 + ETHERTYPE_DN = 0x6003 + ETHERTYPE_DOGFIGHT = 0x1989 + ETHERTYPE_DSMD = 0x8039 + ETHERTYPE_ECMA = 0x803 + ETHERTYPE_ENCRYPT = 0x803d + ETHERTYPE_ES = 0x805d + ETHERTYPE_EXCELAN = 0x8010 + ETHERTYPE_EXPERDATA = 0x8049 + ETHERTYPE_FLIP = 0x8146 + ETHERTYPE_FLOWCONTROL = 0x8808 + ETHERTYPE_FRARP = 0x808 + ETHERTYPE_GENDYN = 0x8068 + ETHERTYPE_HAYES = 0x8130 + ETHERTYPE_HIPPI_FP = 0x8180 + ETHERTYPE_HITACHI = 0x8820 + ETHERTYPE_HP = 0x8005 + ETHERTYPE_IEEEPUP = 0xa00 + ETHERTYPE_IEEEPUPAT = 0xa01 + ETHERTYPE_IMLBL = 0x4c42 + ETHERTYPE_IMLBLDIAG = 0x424c + ETHERTYPE_IP = 0x800 + ETHERTYPE_IPAS = 0x876c + ETHERTYPE_IPV6 = 0x86dd + ETHERTYPE_IPX = 0x8137 + ETHERTYPE_IPXNEW = 0x8037 + ETHERTYPE_KALPANA = 0x8582 + ETHERTYPE_LANBRIDGE = 0x8038 + ETHERTYPE_LANPROBE = 0x8888 + ETHERTYPE_LAT = 0x6004 + ETHERTYPE_LBACK = 0x9000 + ETHERTYPE_LITTLE = 0x8060 + ETHERTYPE_LOGICRAFT = 0x8148 + ETHERTYPE_LOOPBACK = 0x9000 + ETHERTYPE_MATRA = 0x807a + ETHERTYPE_MAX = 0xffff + ETHERTYPE_MERIT = 0x807c + ETHERTYPE_MICP = 0x873a + ETHERTYPE_MOPDL = 0x6001 + ETHERTYPE_MOPRC = 0x6002 + ETHERTYPE_MOTOROLA = 0x818d + ETHERTYPE_MPLS = 0x8847 + ETHERTYPE_MPLS_MCAST = 0x8848 + ETHERTYPE_MUMPS = 0x813f + ETHERTYPE_NBPCC = 0x3c04 + ETHERTYPE_NBPCLAIM = 0x3c09 + ETHERTYPE_NBPCLREQ = 0x3c05 + ETHERTYPE_NBPCLRSP = 0x3c06 + ETHERTYPE_NBPCREQ = 0x3c02 + ETHERTYPE_NBPCRSP = 0x3c03 + ETHERTYPE_NBPDG = 0x3c07 + ETHERTYPE_NBPDGB = 0x3c08 + ETHERTYPE_NBPDLTE = 0x3c0a + ETHERTYPE_NBPRAR = 0x3c0c + ETHERTYPE_NBPRAS = 0x3c0b + ETHERTYPE_NBPRST = 0x3c0d + ETHERTYPE_NBPSCD = 0x3c01 + ETHERTYPE_NBPVCD = 0x3c00 + ETHERTYPE_NBS = 0x802 + ETHERTYPE_NCD = 0x8149 + ETHERTYPE_NESTAR = 0x8006 + ETHERTYPE_NETBEUI = 0x8191 + ETHERTYPE_NOVELL = 0x8138 + ETHERTYPE_NS = 0x600 + ETHERTYPE_NSAT = 0x601 + ETHERTYPE_NSCOMPAT = 0x807 + ETHERTYPE_NTRAILER = 0x10 + ETHERTYPE_OS9 = 0x7007 + ETHERTYPE_OS9NET = 0x7009 + ETHERTYPE_PACER = 0x80c6 + ETHERTYPE_PAE = 0x888e + ETHERTYPE_PCS = 0x4242 + ETHERTYPE_PLANNING = 0x8044 + ETHERTYPE_PPP = 0x880b + ETHERTYPE_PPPOE = 0x8864 + ETHERTYPE_PPPOEDISC = 0x8863 + ETHERTYPE_PRIMENTS = 0x7031 + ETHERTYPE_PUP = 0x200 + ETHERTYPE_PUPAT = 0x200 + ETHERTYPE_RACAL = 0x7030 + ETHERTYPE_RATIONAL = 0x8150 + ETHERTYPE_RAWFR = 0x6559 + ETHERTYPE_RCL = 0x1995 + ETHERTYPE_RDP = 0x8739 + ETHERTYPE_RETIX = 0x80f2 + ETHERTYPE_REVARP = 0x8035 + ETHERTYPE_SCA = 0x6007 + ETHERTYPE_SECTRA = 0x86db + ETHERTYPE_SECUREDATA = 0x876d + ETHERTYPE_SGITW = 0x817e + ETHERTYPE_SG_BOUNCE = 0x8016 + ETHERTYPE_SG_DIAG = 0x8013 + ETHERTYPE_SG_NETGAMES = 0x8014 + ETHERTYPE_SG_RESV = 0x8015 + ETHERTYPE_SIMNET = 0x5208 + ETHERTYPE_SLOWPROTOCOLS = 0x8809 + ETHERTYPE_SNA = 0x80d5 + ETHERTYPE_SNMP = 0x814c + ETHERTYPE_SONIX = 0xfaf5 + ETHERTYPE_SPIDER = 0x809f + ETHERTYPE_SPRITE = 0x500 + ETHERTYPE_STP = 0x8181 + ETHERTYPE_TALARIS = 0x812b + ETHERTYPE_TALARISMC = 0x852b + ETHERTYPE_TCPCOMP = 0x876b + ETHERTYPE_TCPSM = 0x9002 + ETHERTYPE_TEC = 0x814f + ETHERTYPE_TIGAN = 0x802f + ETHERTYPE_TRAIL = 0x1000 + ETHERTYPE_TRANSETHER = 0x6558 + ETHERTYPE_TYMSHARE = 0x802e + ETHERTYPE_UBBST = 0x7005 + ETHERTYPE_UBDEBUG = 0x900 + ETHERTYPE_UBDIAGLOOP = 0x7002 + ETHERTYPE_UBDL = 0x7000 + ETHERTYPE_UBNIU = 0x7001 + ETHERTYPE_UBNMC = 0x7003 + ETHERTYPE_VALID = 0x1600 + ETHERTYPE_VARIAN = 0x80dd + ETHERTYPE_VAXELN = 0x803b + ETHERTYPE_VEECO = 0x8067 + ETHERTYPE_VEXP = 0x805b + ETHERTYPE_VGLAB = 0x8131 + ETHERTYPE_VINES = 0xbad + ETHERTYPE_VINESECHO = 0xbaf + ETHERTYPE_VINESLOOP = 0xbae + ETHERTYPE_VITAL = 0xff00 + ETHERTYPE_VLAN = 0x8100 + ETHERTYPE_VLTLMAN = 0x8080 + ETHERTYPE_VPROD = 0x805c + ETHERTYPE_VURESERVED = 0x8147 + ETHERTYPE_WATERLOO = 0x8130 + ETHERTYPE_WELLFLEET = 0x8103 + ETHERTYPE_X25 = 0x805 + ETHERTYPE_X75 = 0x801 + ETHERTYPE_XNSSM = 0x9001 + ETHERTYPE_XTP = 0x817d + ETHER_ADDR_LEN = 0x6 + ETHER_CRC_LEN = 0x4 + ETHER_CRC_POLY_BE = 0x4c11db6 + ETHER_CRC_POLY_LE = 0xedb88320 + ETHER_HDR_LEN = 0xe + ETHER_MAX_LEN = 0x5ee + ETHER_MAX_LEN_JUMBO = 0x233a + ETHER_MIN_LEN = 0x40 + ETHER_PPPOE_ENCAP_LEN = 0x8 + ETHER_TYPE_LEN = 0x2 + ETHER_VLAN_ENCAP_LEN = 0x4 + EVFILT_AIO = 0x2 + EVFILT_PROC = 0x4 + EVFILT_READ = 0x0 + EVFILT_SIGNAL = 0x5 + EVFILT_SYSCOUNT = 0x7 + EVFILT_TIMER = 0x6 + EVFILT_VNODE = 0x3 + EVFILT_WRITE = 0x1 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x100 + FLUSHO = 0x800000 + F_CLOSEM = 0xa + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0xc + F_FSCTL = -0x80000000 + F_FSDIRMASK = 0x70000000 + F_FSIN = 0x10000000 + F_FSINOUT = 0x30000000 + F_FSOUT = 0x20000000 + F_FSPRIV = 0x8000 + F_FSVOID = 0x40000000 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETNOSIGPIPE = 0xd + F_GETOWN = 0x5 + F_MAXFD = 0xb + F_OK = 0x0 + F_PARAM_MASK = 0xfff + F_PARAM_MAX = 0xfff + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETNOSIGPIPE = 0xe + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFA_ROUTE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x8f52 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf8 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ECONET = 0xce + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf2 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INFINIBAND = 0xc7 + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LINEGROUP = 0xd2 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PLC = 0xae + IFT_PON155 = 0xcf + IFT_PON622 = 0xd0 + IFT_POS = 0xab + IFT_PPP = 0x17 + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPATM = 0xc5 + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf1 + IFT_Q2931 = 0xc9 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SIPSIG = 0xcc + IFT_SIPTG = 0xcb + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_STF = 0xd7 + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TELINK = 0xc8 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VIRTUALTG = 0xca + IFT_VOICEDID = 0xd5 + IFT_VOICEEM = 0x64 + IFT_VOICEEMFGD = 0xd3 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFGDEANA = 0xd4 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERCABLE = 0xc6 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IPPROTO_AH = 0x33 + IPPROTO_CARP = 0x70 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPIP = 0x4 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IPV6_ICMP = 0x3a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MOBILE = 0x37 + IPPROTO_NONE = 0x3b + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_VRRP = 0x70 + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXPACKET = 0xffff + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_EF = 0x8000 + IP_ERRORMTU = 0x15 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x16 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINFRAGSIZE = 0x45 + IP_MINTTL = 0x18 + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVTTL = 0x17 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_TOS = 0x3 + IP_TTL = 0x4 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x6 + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_SPACEAVAIL = 0x5 + MADV_WILLNEED = 0x3 + MAP_ALIGNMENT_16MB = 0x18000000 + MAP_ALIGNMENT_1TB = 0x28000000 + MAP_ALIGNMENT_256TB = 0x30000000 + MAP_ALIGNMENT_4GB = 0x20000000 + MAP_ALIGNMENT_64KB = 0x10000000 + MAP_ALIGNMENT_64PB = 0x38000000 + MAP_ALIGNMENT_MASK = -0x1000000 + MAP_ALIGNMENT_SHIFT = 0x18 + MAP_ANON = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_INHERIT = 0x80 + MAP_INHERIT_COPY = 0x1 + MAP_INHERIT_DEFAULT = 0x1 + MAP_INHERIT_DONATE_COPY = 0x3 + MAP_INHERIT_NONE = 0x2 + MAP_INHERIT_SHARE = 0x0 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_STACK = 0x2000 + MAP_TRYFIXED = 0x400 + MAP_WIRED = 0x800 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MSG_BCAST = 0x100 + MSG_CMSG_CLOEXEC = 0x800 + MSG_CONTROLMBUF = 0x2000000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOR = 0x8 + MSG_IOVUSRSPACE = 0x4000000 + MSG_LENUSRSPACE = 0x8000000 + MSG_MCAST = 0x200 + MSG_NAMEMBUF = 0x1000000 + MSG_NBIO = 0x1000 + MSG_NOSIGNAL = 0x400 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_USERFLAGS = 0xffffff + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x4 + NAME_MAX = 0x1ff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x5 + NET_RT_MAXID = 0x6 + NET_RT_OIFLIST = 0x4 + NET_RT_OOIFLIST = 0x3 + NOFLSH = 0x80000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OFIOGETBMAP = 0xc004667a + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_ALT_IO = 0x40000 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x400000 + O_CREAT = 0x200 + O_DIRECT = 0x80000 + O_DIRECTORY = 0x200000 + O_DSYNC = 0x10000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_NOSIGPIPE = 0x1000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x20000 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PRI_IOFLUSH = 0x7c + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x8 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x9 + RTAX_NETMASK = 0x2 + RTAX_TAG = 0x8 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTA_TAG = 0x100 + RTF_ANNOUNCE = 0x20000 + RTF_BLACKHOLE = 0x1000 + RTF_CLONED = 0x2000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_MASK = 0x80 + RTF_MODIFIED = 0x20 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_REJECT = 0x8 + RTF_SRC = 0x10000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_CHGADDR = 0x15 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x11 + RTM_IFANNOUNCE = 0x10 + RTM_IFINFO = 0x14 + RTM_LLINFO_UPD = 0x13 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_OIFINFO = 0xf + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_OOIFINFO = 0xe + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_SETGATE = 0x12 + RTM_VERSION = 0x4 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x4 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x8 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80906931 + SIOCADDRT = 0x8038720a + SIOCAIFADDR = 0x8040691a + SIOCALIFADDR = 0x8118691c + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80906932 + SIOCDELRT = 0x8038720b + SIOCDIFADDR = 0x80906919 + SIOCDIFPHYADDR = 0x80906949 + SIOCDLIFADDR = 0x8118691e + SIOCGDRVSPEC = 0xc028697b + SIOCGETPFSYNC = 0xc09069f8 + SIOCGETSGCNT = 0xc0207534 + SIOCGETVIFCNT = 0xc0287533 + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0906921 + SIOCGIFADDRPREF = 0xc0986920 + SIOCGIFALIAS = 0xc040691b + SIOCGIFBRDADDR = 0xc0906923 + SIOCGIFCAP = 0xc0206976 + SIOCGIFCONF = 0xc0106926 + SIOCGIFDATA = 0xc0986985 + SIOCGIFDLT = 0xc0906977 + SIOCGIFDSTADDR = 0xc0906922 + SIOCGIFFLAGS = 0xc0906911 + SIOCGIFGENERIC = 0xc090693a + SIOCGIFMEDIA = 0xc0306936 + SIOCGIFMETRIC = 0xc0906917 + SIOCGIFMTU = 0xc090697e + SIOCGIFNETMASK = 0xc0906925 + SIOCGIFPDSTADDR = 0xc0906948 + SIOCGIFPSRCADDR = 0xc0906947 + SIOCGLIFADDR = 0xc118691d + SIOCGLIFPHYADDR = 0xc118694b + SIOCGLINKSTR = 0xc0286987 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGVH = 0xc0906983 + SIOCIFCREATE = 0x8090697a + SIOCIFDESTROY = 0x80906979 + SIOCIFGCLONERS = 0xc0106978 + SIOCINITIFADDR = 0xc0706984 + SIOCSDRVSPEC = 0x8028697b + SIOCSETPFSYNC = 0x809069f7 + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8090690c + SIOCSIFADDRPREF = 0x8098691f + SIOCSIFBRDADDR = 0x80906913 + SIOCSIFCAP = 0x80206975 + SIOCSIFDSTADDR = 0x8090690e + SIOCSIFFLAGS = 0x80906910 + SIOCSIFGENERIC = 0x80906939 + SIOCSIFMEDIA = 0xc0906935 + SIOCSIFMETRIC = 0x80906918 + SIOCSIFMTU = 0x8090697f + SIOCSIFNETMASK = 0x80906916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSLIFPHYADDR = 0x8118694a + SIOCSLINKSTR = 0x80286988 + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSVH = 0xc0906982 + SIOCZIFDATA = 0xc0986986 + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_FLAGS_MASK = 0xf0000000 + SOCK_NONBLOCK = 0x20000000 + SOCK_NOSIGPIPE = 0x40000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_NOHEADER = 0x100a + SO_NOSIGPIPE = 0x800 + SO_OOBINLINE = 0x100 + SO_OVERFLOWED = 0x1009 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x100c + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x100b + SO_TIMESTAMP = 0x2000 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SYSCTL_VERSION = 0x1000000 + SYSCTL_VERS_0 = 0x0 + SYSCTL_VERS_1 = 0x1000000 + SYSCTL_VERS_MASK = 0xff000000 + S_ARCH1 = 0x10000 + S_ARCH2 = 0x20000 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFWHT = 0xe000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + S_LOGIN_SET = 0x1 + TCIFLUSH = 0x1 + TCIOFLUSH = 0x3 + TCOFLUSH = 0x2 + TCP_CONGCTL = 0x20 + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x3 + TCP_KEEPINIT = 0x7 + TCP_KEEPINTVL = 0x5 + TCP_MAXBURST = 0x4 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x10 + TCP_MINMSS = 0xd8 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x40107458 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLAG_CDTRCTS = 0x10 + TIOCFLAG_CLOCAL = 0x2 + TIOCFLAG_CRTSCTS = 0x4 + TIOCFLAG_MDMBUF = 0x8 + TIOCFLAG_SOFTCAR = 0x1 + TIOCFLUSH = 0x80047410 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGFLAGS = 0x4004745d + TIOCGLINED = 0x40207442 + TIOCGPGRP = 0x40047477 + TIOCGQSIZE = 0x40047481 + TIOCGRANTPT = 0x20007447 + TIOCGSID = 0x40047463 + TIOCGSIZE = 0x40087468 + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGET = 0x4004746a + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTMGET = 0x40287446 + TIOCPTSNAME = 0x40287448 + TIOCRCVFRAME = 0x80087445 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSFLAGS = 0x8004745c + TIOCSIG = 0x2000745f + TIOCSLINED = 0x80207443 + TIOCSPGRP = 0x80047476 + TIOCSQSIZE = 0x80047480 + TIOCSSIZE = 0x80087467 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x80047465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCUCNTL = 0x80047466 + TIOCXMTFRAME = 0x80087444 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WALL = 0x8 + WALLSIG = 0x8 + WALTSIG = 0x4 + WCLONE = 0x4 + WCOREFLAG = 0x80 + WNOHANG = 0x1 + WNOWAIT = 0x10000 + WNOZOMBIE = 0x20000 + WOPTSCHECKED = 0x40000 + WSTOPPED = 0x7f + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x58) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x57) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x52) + EILSEQ = syscall.Errno(0x55) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x60) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5e) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x5d) + ENOBUFS = syscall.Errno(0x37) + ENODATA = syscall.Errno(0x59) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x5f) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x53) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x5a) + ENOSTR = syscall.Errno(0x5b) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x56) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x54) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x60) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIME = syscall.Errno(0x5c) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x20) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "device not configured"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EDEADLK", "resource deadlock avoided"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "cross-device link"}, + {19, "ENODEV", "operation not supported by device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "result too large or too small"}, + {35, "EAGAIN", "resource temporarily unavailable"}, + {36, "EINPROGRESS", "operation now in progress"}, + {37, "EALREADY", "operation already in progress"}, + {38, "ENOTSOCK", "socket operation on non-socket"}, + {39, "EDESTADDRREQ", "destination address required"}, + {40, "EMSGSIZE", "message too long"}, + {41, "EPROTOTYPE", "protocol wrong type for socket"}, + {42, "ENOPROTOOPT", "protocol option not available"}, + {43, "EPROTONOSUPPORT", "protocol not supported"}, + {44, "ESOCKTNOSUPPORT", "socket type not supported"}, + {45, "EOPNOTSUPP", "operation not supported"}, + {46, "EPFNOSUPPORT", "protocol family not supported"}, + {47, "EAFNOSUPPORT", "address family not supported by protocol family"}, + {48, "EADDRINUSE", "address already in use"}, + {49, "EADDRNOTAVAIL", "can't assign requested address"}, + {50, "ENETDOWN", "network is down"}, + {51, "ENETUNREACH", "network is unreachable"}, + {52, "ENETRESET", "network dropped connection on reset"}, + {53, "ECONNABORTED", "software caused connection abort"}, + {54, "ECONNRESET", "connection reset by peer"}, + {55, "ENOBUFS", "no buffer space available"}, + {56, "EISCONN", "socket is already connected"}, + {57, "ENOTCONN", "socket is not connected"}, + {58, "ESHUTDOWN", "can't send after socket shutdown"}, + {59, "ETOOMANYREFS", "too many references: can't splice"}, + {60, "ETIMEDOUT", "connection timed out"}, + {61, "ECONNREFUSED", "connection refused"}, + {62, "ELOOP", "too many levels of symbolic links"}, + {63, "ENAMETOOLONG", "file name too long"}, + {64, "EHOSTDOWN", "host is down"}, + {65, "EHOSTUNREACH", "no route to host"}, + {66, "ENOTEMPTY", "directory not empty"}, + {67, "EPROCLIM", "too many processes"}, + {68, "EUSERS", "too many users"}, + {69, "EDQUOT", "disc quota exceeded"}, + {70, "ESTALE", "stale NFS file handle"}, + {71, "EREMOTE", "too many levels of remote in path"}, + {72, "EBADRPC", "RPC struct is bad"}, + {73, "ERPCMISMATCH", "RPC version wrong"}, + {74, "EPROGUNAVAIL", "RPC prog. not avail"}, + {75, "EPROGMISMATCH", "program version wrong"}, + {76, "EPROCUNAVAIL", "bad procedure for program"}, + {77, "ENOLCK", "no locks available"}, + {78, "ENOSYS", "function not implemented"}, + {79, "EFTYPE", "inappropriate file type or format"}, + {80, "EAUTH", "authentication error"}, + {81, "ENEEDAUTH", "need authenticator"}, + {82, "EIDRM", "identifier removed"}, + {83, "ENOMSG", "no message of desired type"}, + {84, "EOVERFLOW", "value too large to be stored in data type"}, + {85, "EILSEQ", "illegal byte sequence"}, + {86, "ENOTSUP", "not supported"}, + {87, "ECANCELED", "operation Canceled"}, + {88, "EBADMSG", "bad or Corrupt message"}, + {89, "ENODATA", "no message available"}, + {90, "ENOSR", "no STREAM resources"}, + {91, "ENOSTR", "not a STREAM"}, + {92, "ETIME", "STREAM ioctl timeout"}, + {93, "ENOATTR", "attribute not found"}, + {94, "EMULTIHOP", "multihop attempted"}, + {95, "ENOLINK", "link has been severed"}, + {96, "ELAST", "protocol error"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/BPT trap"}, + {6, "SIGIOT", "abort trap"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGURG", "urgent I/O condition"}, + {17, "SIGSTOP", "stopped (signal)"}, + {18, "SIGTSTP", "stopped"}, + {19, "SIGCONT", "continued"}, + {20, "SIGCHLD", "child exited"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGIO", "I/O possible"}, + {24, "SIGXCPU", "cputime limit exceeded"}, + {25, "SIGXFSZ", "filesize limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window size changes"}, + {29, "SIGINFO", "information request"}, + {30, "SIGUSR1", "user defined signal 1"}, + {31, "SIGUSR2", "user defined signal 2"}, + {32, "SIGPWR", "power fail/restart"}, +} diff --git a/api/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go b/api/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go new file mode 100644 index 0000000..5fe56ae --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go @@ -0,0 +1,1707 @@ +// mkerrors.sh -marm +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,netbsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -marm _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_ARP = 0x1c + AF_BLUETOOTH = 0x1f + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x20 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x18 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x23 + AF_MPLS = 0x21 + AF_NATM = 0x1b + AF_NS = 0x6 + AF_OROUTE = 0x11 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x22 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + ARPHRD_ARCNET = 0x7 + ARPHRD_ETHER = 0x1 + ARPHRD_FRELAY = 0xf + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_STRIP = 0x17 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B460800 = 0x70800 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B921600 = 0xe1000 + B9600 = 0x2580 + BIOCFEEDBACK = 0x8004427d + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0084277 + BIOCGETIF = 0x4090426b + BIOCGFEEDBACK = 0x4004427c + BIOCGHDRCMPLT = 0x40044274 + BIOCGRTIMEOUT = 0x400c427b + BIOCGSEESENT = 0x40044278 + BIOCGSTATS = 0x4080426f + BIOCGSTATSOLD = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044276 + BIOCSETF = 0x80084267 + BIOCSETIF = 0x8090426c + BIOCSFEEDBACK = 0x8004427d + BIOCSHDRCMPLT = 0x80044275 + BIOCSRTIMEOUT = 0x800c427a + BIOCSSEESENT = 0x80044279 + BIOCSTCPF = 0x80084272 + BIOCSUDPF = 0x80084273 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALIGNMENT32 = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DFLTBUFSIZE = 0x100000 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x1000000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CREAD = 0x800 + CRTSCTS = 0x10000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + CTL_QUERY = -0x2 + DIOCBSFLUSH = 0x20006478 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HDLC = 0x10 + DLT_HHDLC = 0x79 + DLT_HIPPI = 0xf + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0xe + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RAWAF_MASK = 0x2240000 + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xd + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EMUL_LINUX = 0x1 + EMUL_LINUX32 = 0x5 + EMUL_MAXID = 0x6 + ETHERCAP_JUMBO_MTU = 0x4 + ETHERCAP_VLAN_HWTAGGING = 0x2 + ETHERCAP_VLAN_MTU = 0x1 + ETHERMIN = 0x2e + ETHERMTU = 0x5dc + ETHERMTU_JUMBO = 0x2328 + ETHERTYPE_8023 = 0x4 + ETHERTYPE_AARP = 0x80f3 + ETHERTYPE_ACCTON = 0x8390 + ETHERTYPE_AEONIC = 0x8036 + ETHERTYPE_ALPHA = 0x814a + ETHERTYPE_AMBER = 0x6008 + ETHERTYPE_AMOEBA = 0x8145 + ETHERTYPE_APOLLO = 0x80f7 + ETHERTYPE_APOLLODOMAIN = 0x8019 + ETHERTYPE_APPLETALK = 0x809b + ETHERTYPE_APPLITEK = 0x80c7 + ETHERTYPE_ARGONAUT = 0x803a + ETHERTYPE_ARP = 0x806 + ETHERTYPE_AT = 0x809b + ETHERTYPE_ATALK = 0x809b + ETHERTYPE_ATOMIC = 0x86df + ETHERTYPE_ATT = 0x8069 + ETHERTYPE_ATTSTANFORD = 0x8008 + ETHERTYPE_AUTOPHON = 0x806a + ETHERTYPE_AXIS = 0x8856 + ETHERTYPE_BCLOOP = 0x9003 + ETHERTYPE_BOFL = 0x8102 + ETHERTYPE_CABLETRON = 0x7034 + ETHERTYPE_CHAOS = 0x804 + ETHERTYPE_COMDESIGN = 0x806c + ETHERTYPE_COMPUGRAPHIC = 0x806d + ETHERTYPE_COUNTERPOINT = 0x8062 + ETHERTYPE_CRONUS = 0x8004 + ETHERTYPE_CRONUSVLN = 0x8003 + ETHERTYPE_DCA = 0x1234 + ETHERTYPE_DDE = 0x807b + ETHERTYPE_DEBNI = 0xaaaa + ETHERTYPE_DECAM = 0x8048 + ETHERTYPE_DECCUST = 0x6006 + ETHERTYPE_DECDIAG = 0x6005 + ETHERTYPE_DECDNS = 0x803c + ETHERTYPE_DECDTS = 0x803e + ETHERTYPE_DECEXPER = 0x6000 + ETHERTYPE_DECLAST = 0x8041 + ETHERTYPE_DECLTM = 0x803f + ETHERTYPE_DECMUMPS = 0x6009 + ETHERTYPE_DECNETBIOS = 0x8040 + ETHERTYPE_DELTACON = 0x86de + ETHERTYPE_DIDDLE = 0x4321 + ETHERTYPE_DLOG1 = 0x660 + ETHERTYPE_DLOG2 = 0x661 + ETHERTYPE_DN = 0x6003 + ETHERTYPE_DOGFIGHT = 0x1989 + ETHERTYPE_DSMD = 0x8039 + ETHERTYPE_ECMA = 0x803 + ETHERTYPE_ENCRYPT = 0x803d + ETHERTYPE_ES = 0x805d + ETHERTYPE_EXCELAN = 0x8010 + ETHERTYPE_EXPERDATA = 0x8049 + ETHERTYPE_FLIP = 0x8146 + ETHERTYPE_FLOWCONTROL = 0x8808 + ETHERTYPE_FRARP = 0x808 + ETHERTYPE_GENDYN = 0x8068 + ETHERTYPE_HAYES = 0x8130 + ETHERTYPE_HIPPI_FP = 0x8180 + ETHERTYPE_HITACHI = 0x8820 + ETHERTYPE_HP = 0x8005 + ETHERTYPE_IEEEPUP = 0xa00 + ETHERTYPE_IEEEPUPAT = 0xa01 + ETHERTYPE_IMLBL = 0x4c42 + ETHERTYPE_IMLBLDIAG = 0x424c + ETHERTYPE_IP = 0x800 + ETHERTYPE_IPAS = 0x876c + ETHERTYPE_IPV6 = 0x86dd + ETHERTYPE_IPX = 0x8137 + ETHERTYPE_IPXNEW = 0x8037 + ETHERTYPE_KALPANA = 0x8582 + ETHERTYPE_LANBRIDGE = 0x8038 + ETHERTYPE_LANPROBE = 0x8888 + ETHERTYPE_LAT = 0x6004 + ETHERTYPE_LBACK = 0x9000 + ETHERTYPE_LITTLE = 0x8060 + ETHERTYPE_LOGICRAFT = 0x8148 + ETHERTYPE_LOOPBACK = 0x9000 + ETHERTYPE_MATRA = 0x807a + ETHERTYPE_MAX = 0xffff + ETHERTYPE_MERIT = 0x807c + ETHERTYPE_MICP = 0x873a + ETHERTYPE_MOPDL = 0x6001 + ETHERTYPE_MOPRC = 0x6002 + ETHERTYPE_MOTOROLA = 0x818d + ETHERTYPE_MPLS = 0x8847 + ETHERTYPE_MPLS_MCAST = 0x8848 + ETHERTYPE_MUMPS = 0x813f + ETHERTYPE_NBPCC = 0x3c04 + ETHERTYPE_NBPCLAIM = 0x3c09 + ETHERTYPE_NBPCLREQ = 0x3c05 + ETHERTYPE_NBPCLRSP = 0x3c06 + ETHERTYPE_NBPCREQ = 0x3c02 + ETHERTYPE_NBPCRSP = 0x3c03 + ETHERTYPE_NBPDG = 0x3c07 + ETHERTYPE_NBPDGB = 0x3c08 + ETHERTYPE_NBPDLTE = 0x3c0a + ETHERTYPE_NBPRAR = 0x3c0c + ETHERTYPE_NBPRAS = 0x3c0b + ETHERTYPE_NBPRST = 0x3c0d + ETHERTYPE_NBPSCD = 0x3c01 + ETHERTYPE_NBPVCD = 0x3c00 + ETHERTYPE_NBS = 0x802 + ETHERTYPE_NCD = 0x8149 + ETHERTYPE_NESTAR = 0x8006 + ETHERTYPE_NETBEUI = 0x8191 + ETHERTYPE_NOVELL = 0x8138 + ETHERTYPE_NS = 0x600 + ETHERTYPE_NSAT = 0x601 + ETHERTYPE_NSCOMPAT = 0x807 + ETHERTYPE_NTRAILER = 0x10 + ETHERTYPE_OS9 = 0x7007 + ETHERTYPE_OS9NET = 0x7009 + ETHERTYPE_PACER = 0x80c6 + ETHERTYPE_PAE = 0x888e + ETHERTYPE_PCS = 0x4242 + ETHERTYPE_PLANNING = 0x8044 + ETHERTYPE_PPP = 0x880b + ETHERTYPE_PPPOE = 0x8864 + ETHERTYPE_PPPOEDISC = 0x8863 + ETHERTYPE_PRIMENTS = 0x7031 + ETHERTYPE_PUP = 0x200 + ETHERTYPE_PUPAT = 0x200 + ETHERTYPE_RACAL = 0x7030 + ETHERTYPE_RATIONAL = 0x8150 + ETHERTYPE_RAWFR = 0x6559 + ETHERTYPE_RCL = 0x1995 + ETHERTYPE_RDP = 0x8739 + ETHERTYPE_RETIX = 0x80f2 + ETHERTYPE_REVARP = 0x8035 + ETHERTYPE_SCA = 0x6007 + ETHERTYPE_SECTRA = 0x86db + ETHERTYPE_SECUREDATA = 0x876d + ETHERTYPE_SGITW = 0x817e + ETHERTYPE_SG_BOUNCE = 0x8016 + ETHERTYPE_SG_DIAG = 0x8013 + ETHERTYPE_SG_NETGAMES = 0x8014 + ETHERTYPE_SG_RESV = 0x8015 + ETHERTYPE_SIMNET = 0x5208 + ETHERTYPE_SLOWPROTOCOLS = 0x8809 + ETHERTYPE_SNA = 0x80d5 + ETHERTYPE_SNMP = 0x814c + ETHERTYPE_SONIX = 0xfaf5 + ETHERTYPE_SPIDER = 0x809f + ETHERTYPE_SPRITE = 0x500 + ETHERTYPE_STP = 0x8181 + ETHERTYPE_TALARIS = 0x812b + ETHERTYPE_TALARISMC = 0x852b + ETHERTYPE_TCPCOMP = 0x876b + ETHERTYPE_TCPSM = 0x9002 + ETHERTYPE_TEC = 0x814f + ETHERTYPE_TIGAN = 0x802f + ETHERTYPE_TRAIL = 0x1000 + ETHERTYPE_TRANSETHER = 0x6558 + ETHERTYPE_TYMSHARE = 0x802e + ETHERTYPE_UBBST = 0x7005 + ETHERTYPE_UBDEBUG = 0x900 + ETHERTYPE_UBDIAGLOOP = 0x7002 + ETHERTYPE_UBDL = 0x7000 + ETHERTYPE_UBNIU = 0x7001 + ETHERTYPE_UBNMC = 0x7003 + ETHERTYPE_VALID = 0x1600 + ETHERTYPE_VARIAN = 0x80dd + ETHERTYPE_VAXELN = 0x803b + ETHERTYPE_VEECO = 0x8067 + ETHERTYPE_VEXP = 0x805b + ETHERTYPE_VGLAB = 0x8131 + ETHERTYPE_VINES = 0xbad + ETHERTYPE_VINESECHO = 0xbaf + ETHERTYPE_VINESLOOP = 0xbae + ETHERTYPE_VITAL = 0xff00 + ETHERTYPE_VLAN = 0x8100 + ETHERTYPE_VLTLMAN = 0x8080 + ETHERTYPE_VPROD = 0x805c + ETHERTYPE_VURESERVED = 0x8147 + ETHERTYPE_WATERLOO = 0x8130 + ETHERTYPE_WELLFLEET = 0x8103 + ETHERTYPE_X25 = 0x805 + ETHERTYPE_X75 = 0x801 + ETHERTYPE_XNSSM = 0x9001 + ETHERTYPE_XTP = 0x817d + ETHER_ADDR_LEN = 0x6 + ETHER_CRC_LEN = 0x4 + ETHER_CRC_POLY_BE = 0x4c11db6 + ETHER_CRC_POLY_LE = 0xedb88320 + ETHER_HDR_LEN = 0xe + ETHER_MAX_LEN = 0x5ee + ETHER_MAX_LEN_JUMBO = 0x233a + ETHER_MIN_LEN = 0x40 + ETHER_PPPOE_ENCAP_LEN = 0x8 + ETHER_TYPE_LEN = 0x2 + ETHER_VLAN_ENCAP_LEN = 0x4 + EVFILT_AIO = 0x2 + EVFILT_PROC = 0x4 + EVFILT_READ = 0x0 + EVFILT_SIGNAL = 0x5 + EVFILT_SYSCOUNT = 0x7 + EVFILT_TIMER = 0x6 + EVFILT_VNODE = 0x3 + EVFILT_WRITE = 0x1 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x100 + FLUSHO = 0x800000 + F_CLOSEM = 0xa + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0xc + F_FSCTL = -0x80000000 + F_FSDIRMASK = 0x70000000 + F_FSIN = 0x10000000 + F_FSINOUT = 0x30000000 + F_FSOUT = 0x20000000 + F_FSPRIV = 0x8000 + F_FSVOID = 0x40000000 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETNOSIGPIPE = 0xd + F_GETOWN = 0x5 + F_MAXFD = 0xb + F_OK = 0x0 + F_PARAM_MASK = 0xfff + F_PARAM_MAX = 0xfff + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETNOSIGPIPE = 0xe + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFA_ROUTE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x8f52 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf8 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ECONET = 0xce + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf2 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INFINIBAND = 0xc7 + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LINEGROUP = 0xd2 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PLC = 0xae + IFT_PON155 = 0xcf + IFT_PON622 = 0xd0 + IFT_POS = 0xab + IFT_PPP = 0x17 + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPATM = 0xc5 + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf1 + IFT_Q2931 = 0xc9 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SIPSIG = 0xcc + IFT_SIPTG = 0xcb + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_STF = 0xd7 + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TELINK = 0xc8 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VIRTUALTG = 0xca + IFT_VOICEDID = 0xd5 + IFT_VOICEEM = 0x64 + IFT_VOICEEMFGD = 0xd3 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFGDEANA = 0xd4 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERCABLE = 0xc6 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IPPROTO_AH = 0x33 + IPPROTO_CARP = 0x70 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPIP = 0x4 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IPV6_ICMP = 0x3a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MOBILE = 0x37 + IPPROTO_NONE = 0x3b + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_VRRP = 0x70 + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXPACKET = 0xffff + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_EF = 0x8000 + IP_ERRORMTU = 0x15 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x16 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINFRAGSIZE = 0x45 + IP_MINTTL = 0x18 + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVTTL = 0x17 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_TOS = 0x3 + IP_TTL = 0x4 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x6 + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_SPACEAVAIL = 0x5 + MADV_WILLNEED = 0x3 + MAP_ALIGNMENT_16MB = 0x18000000 + MAP_ALIGNMENT_1TB = 0x28000000 + MAP_ALIGNMENT_256TB = 0x30000000 + MAP_ALIGNMENT_4GB = 0x20000000 + MAP_ALIGNMENT_64KB = 0x10000000 + MAP_ALIGNMENT_64PB = 0x38000000 + MAP_ALIGNMENT_MASK = -0x1000000 + MAP_ALIGNMENT_SHIFT = 0x18 + MAP_ANON = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_INHERIT = 0x80 + MAP_INHERIT_COPY = 0x1 + MAP_INHERIT_DEFAULT = 0x1 + MAP_INHERIT_DONATE_COPY = 0x3 + MAP_INHERIT_NONE = 0x2 + MAP_INHERIT_SHARE = 0x0 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_STACK = 0x2000 + MAP_TRYFIXED = 0x400 + MAP_WIRED = 0x800 + MSG_BCAST = 0x100 + MSG_CMSG_CLOEXEC = 0x800 + MSG_CONTROLMBUF = 0x2000000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOR = 0x8 + MSG_IOVUSRSPACE = 0x4000000 + MSG_LENUSRSPACE = 0x8000000 + MSG_MCAST = 0x200 + MSG_NAMEMBUF = 0x1000000 + MSG_NBIO = 0x1000 + MSG_NOSIGNAL = 0x400 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_USERFLAGS = 0xffffff + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x4 + NAME_MAX = 0x1ff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x5 + NET_RT_MAXID = 0x6 + NET_RT_OIFLIST = 0x4 + NET_RT_OOIFLIST = 0x3 + NOFLSH = 0x80000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OFIOGETBMAP = 0xc004667a + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_ALT_IO = 0x40000 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x400000 + O_CREAT = 0x200 + O_DIRECT = 0x80000 + O_DIRECTORY = 0x200000 + O_DSYNC = 0x10000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_NOSIGPIPE = 0x1000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x20000 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PRI_IOFLUSH = 0x7c + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x8 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x9 + RTAX_NETMASK = 0x2 + RTAX_TAG = 0x8 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTA_TAG = 0x100 + RTF_ANNOUNCE = 0x20000 + RTF_BLACKHOLE = 0x1000 + RTF_CLONED = 0x2000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_MASK = 0x80 + RTF_MODIFIED = 0x20 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_REJECT = 0x8 + RTF_SRC = 0x10000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_CHGADDR = 0x15 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x11 + RTM_IFANNOUNCE = 0x10 + RTM_IFINFO = 0x14 + RTM_LLINFO_UPD = 0x13 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_OIFINFO = 0xf + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_OOIFINFO = 0xe + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_SETGATE = 0x12 + RTM_VERSION = 0x4 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x4 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x8 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80906931 + SIOCADDRT = 0x8030720a + SIOCAIFADDR = 0x8040691a + SIOCALIFADDR = 0x8118691c + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80906932 + SIOCDELRT = 0x8030720b + SIOCDIFADDR = 0x80906919 + SIOCDIFPHYADDR = 0x80906949 + SIOCDLIFADDR = 0x8118691e + SIOCGDRVSPEC = 0xc01c697b + SIOCGETPFSYNC = 0xc09069f8 + SIOCGETSGCNT = 0xc0147534 + SIOCGETVIFCNT = 0xc0147533 + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0906921 + SIOCGIFADDRPREF = 0xc0946920 + SIOCGIFALIAS = 0xc040691b + SIOCGIFBRDADDR = 0xc0906923 + SIOCGIFCAP = 0xc0206976 + SIOCGIFCONF = 0xc0086926 + SIOCGIFDATA = 0xc0946985 + SIOCGIFDLT = 0xc0906977 + SIOCGIFDSTADDR = 0xc0906922 + SIOCGIFFLAGS = 0xc0906911 + SIOCGIFGENERIC = 0xc090693a + SIOCGIFMEDIA = 0xc0286936 + SIOCGIFMETRIC = 0xc0906917 + SIOCGIFMTU = 0xc090697e + SIOCGIFNETMASK = 0xc0906925 + SIOCGIFPDSTADDR = 0xc0906948 + SIOCGIFPSRCADDR = 0xc0906947 + SIOCGLIFADDR = 0xc118691d + SIOCGLIFPHYADDR = 0xc118694b + SIOCGLINKSTR = 0xc01c6987 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGVH = 0xc0906983 + SIOCIFCREATE = 0x8090697a + SIOCIFDESTROY = 0x80906979 + SIOCIFGCLONERS = 0xc00c6978 + SIOCINITIFADDR = 0xc0446984 + SIOCSDRVSPEC = 0x801c697b + SIOCSETPFSYNC = 0x809069f7 + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8090690c + SIOCSIFADDRPREF = 0x8094691f + SIOCSIFBRDADDR = 0x80906913 + SIOCSIFCAP = 0x80206975 + SIOCSIFDSTADDR = 0x8090690e + SIOCSIFFLAGS = 0x80906910 + SIOCSIFGENERIC = 0x80906939 + SIOCSIFMEDIA = 0xc0906935 + SIOCSIFMETRIC = 0x80906918 + SIOCSIFMTU = 0x8090697f + SIOCSIFNETMASK = 0x80906916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSLIFPHYADDR = 0x8118694a + SIOCSLINKSTR = 0x801c6988 + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSVH = 0xc0906982 + SIOCZIFDATA = 0xc0946986 + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_FLAGS_MASK = 0xf0000000 + SOCK_NONBLOCK = 0x20000000 + SOCK_NOSIGPIPE = 0x40000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_NOHEADER = 0x100a + SO_NOSIGPIPE = 0x800 + SO_OOBINLINE = 0x100 + SO_OVERFLOWED = 0x1009 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x100c + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x100b + SO_TIMESTAMP = 0x2000 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SYSCTL_VERSION = 0x1000000 + SYSCTL_VERS_0 = 0x0 + SYSCTL_VERS_1 = 0x1000000 + SYSCTL_VERS_MASK = 0xff000000 + S_ARCH1 = 0x10000 + S_ARCH2 = 0x20000 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFWHT = 0xe000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TCIFLUSH = 0x1 + TCIOFLUSH = 0x3 + TCOFLUSH = 0x2 + TCP_CONGCTL = 0x20 + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x3 + TCP_KEEPINIT = 0x7 + TCP_KEEPINTVL = 0x5 + TCP_MAXBURST = 0x4 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x10 + TCP_MINMSS = 0xd8 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x400c7458 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLAG_CDTRCTS = 0x10 + TIOCFLAG_CLOCAL = 0x2 + TIOCFLAG_CRTSCTS = 0x4 + TIOCFLAG_MDMBUF = 0x8 + TIOCFLAG_SOFTCAR = 0x1 + TIOCFLUSH = 0x80047410 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGFLAGS = 0x4004745d + TIOCGLINED = 0x40207442 + TIOCGPGRP = 0x40047477 + TIOCGQSIZE = 0x40047481 + TIOCGRANTPT = 0x20007447 + TIOCGSID = 0x40047463 + TIOCGSIZE = 0x40087468 + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGET = 0x4004746a + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTMGET = 0x48087446 + TIOCPTSNAME = 0x48087448 + TIOCRCVFRAME = 0x80047445 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSFLAGS = 0x8004745c + TIOCSIG = 0x2000745f + TIOCSLINED = 0x80207443 + TIOCSPGRP = 0x80047476 + TIOCSQSIZE = 0x80047480 + TIOCSSIZE = 0x80087467 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x80047465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCUCNTL = 0x80047466 + TIOCXMTFRAME = 0x80047444 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WALL = 0x8 + WALLSIG = 0x8 + WALTSIG = 0x4 + WCLONE = 0x4 + WCOREFLAG = 0x80 + WNOHANG = 0x1 + WNOWAIT = 0x10000 + WNOZOMBIE = 0x20000 + WOPTSCHECKED = 0x40000 + WSTOPPED = 0x7f + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x58) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x57) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x52) + EILSEQ = syscall.Errno(0x55) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x60) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5e) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x5d) + ENOBUFS = syscall.Errno(0x37) + ENODATA = syscall.Errno(0x59) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x5f) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x53) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x5a) + ENOSTR = syscall.Errno(0x5b) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x56) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x54) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x60) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIME = syscall.Errno(0x5c) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x20) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "device not configured"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EDEADLK", "resource deadlock avoided"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "cross-device link"}, + {19, "ENODEV", "operation not supported by device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "result too large or too small"}, + {35, "EAGAIN", "resource temporarily unavailable"}, + {36, "EINPROGRESS", "operation now in progress"}, + {37, "EALREADY", "operation already in progress"}, + {38, "ENOTSOCK", "socket operation on non-socket"}, + {39, "EDESTADDRREQ", "destination address required"}, + {40, "EMSGSIZE", "message too long"}, + {41, "EPROTOTYPE", "protocol wrong type for socket"}, + {42, "ENOPROTOOPT", "protocol option not available"}, + {43, "EPROTONOSUPPORT", "protocol not supported"}, + {44, "ESOCKTNOSUPPORT", "socket type not supported"}, + {45, "EOPNOTSUPP", "operation not supported"}, + {46, "EPFNOSUPPORT", "protocol family not supported"}, + {47, "EAFNOSUPPORT", "address family not supported by protocol family"}, + {48, "EADDRINUSE", "address already in use"}, + {49, "EADDRNOTAVAIL", "can't assign requested address"}, + {50, "ENETDOWN", "network is down"}, + {51, "ENETUNREACH", "network is unreachable"}, + {52, "ENETRESET", "network dropped connection on reset"}, + {53, "ECONNABORTED", "software caused connection abort"}, + {54, "ECONNRESET", "connection reset by peer"}, + {55, "ENOBUFS", "no buffer space available"}, + {56, "EISCONN", "socket is already connected"}, + {57, "ENOTCONN", "socket is not connected"}, + {58, "ESHUTDOWN", "can't send after socket shutdown"}, + {59, "ETOOMANYREFS", "too many references: can't splice"}, + {60, "ETIMEDOUT", "connection timed out"}, + {61, "ECONNREFUSED", "connection refused"}, + {62, "ELOOP", "too many levels of symbolic links"}, + {63, "ENAMETOOLONG", "file name too long"}, + {64, "EHOSTDOWN", "host is down"}, + {65, "EHOSTUNREACH", "no route to host"}, + {66, "ENOTEMPTY", "directory not empty"}, + {67, "EPROCLIM", "too many processes"}, + {68, "EUSERS", "too many users"}, + {69, "EDQUOT", "disc quota exceeded"}, + {70, "ESTALE", "stale NFS file handle"}, + {71, "EREMOTE", "too many levels of remote in path"}, + {72, "EBADRPC", "RPC struct is bad"}, + {73, "ERPCMISMATCH", "RPC version wrong"}, + {74, "EPROGUNAVAIL", "RPC prog. not avail"}, + {75, "EPROGMISMATCH", "program version wrong"}, + {76, "EPROCUNAVAIL", "bad procedure for program"}, + {77, "ENOLCK", "no locks available"}, + {78, "ENOSYS", "function not implemented"}, + {79, "EFTYPE", "inappropriate file type or format"}, + {80, "EAUTH", "authentication error"}, + {81, "ENEEDAUTH", "need authenticator"}, + {82, "EIDRM", "identifier removed"}, + {83, "ENOMSG", "no message of desired type"}, + {84, "EOVERFLOW", "value too large to be stored in data type"}, + {85, "EILSEQ", "illegal byte sequence"}, + {86, "ENOTSUP", "not supported"}, + {87, "ECANCELED", "operation Canceled"}, + {88, "EBADMSG", "bad or Corrupt message"}, + {89, "ENODATA", "no message available"}, + {90, "ENOSR", "no STREAM resources"}, + {91, "ENOSTR", "not a STREAM"}, + {92, "ETIME", "STREAM ioctl timeout"}, + {93, "ENOATTR", "attribute not found"}, + {94, "EMULTIHOP", "multihop attempted"}, + {95, "ENOLINK", "link has been severed"}, + {96, "ELAST", "protocol error"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/BPT trap"}, + {6, "SIGIOT", "abort trap"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGURG", "urgent I/O condition"}, + {17, "SIGSTOP", "stopped (signal)"}, + {18, "SIGTSTP", "stopped"}, + {19, "SIGCONT", "continued"}, + {20, "SIGCHLD", "child exited"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGIO", "I/O possible"}, + {24, "SIGXCPU", "cputime limit exceeded"}, + {25, "SIGXFSZ", "filesize limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window size changes"}, + {29, "SIGINFO", "information request"}, + {30, "SIGUSR1", "user defined signal 1"}, + {31, "SIGUSR2", "user defined signal 2"}, + {32, "SIGPWR", "power fail/restart"}, +} diff --git a/api/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go b/api/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go new file mode 100644 index 0000000..0a1c3e7 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go @@ -0,0 +1,1600 @@ +// mkerrors.sh -m32 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,openbsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m32 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_BLUETOOTH = 0x20 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_ENCAP = 0x1c + AF_HYLINK = 0xf + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x18 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_KEY = 0x1e + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x24 + AF_MPLS = 0x21 + AF_NATM = 0x1b + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SIP = 0x1d + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + ARPHRD_ETHER = 0x1 + ARPHRD_FRELAY = 0xf + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B9600 = 0x2580 + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDIRFILT = 0x4004427c + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc008427b + BIOCGETIF = 0x4020426b + BIOCGFILDROP = 0x40044278 + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044273 + BIOCGRTIMEOUT = 0x400c426e + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x20004276 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDIRFILT = 0x8004427d + BIOCSDLT = 0x8004427a + BIOCSETF = 0x80084267 + BIOCSETIF = 0x8020426c + BIOCSETWF = 0x80084277 + BIOCSFILDROP = 0x80044279 + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044272 + BIOCSRTIMEOUT = 0x800c426d + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIRECTION_IN = 0x1 + BPF_DIRECTION_OUT = 0x2 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x200000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CREAD = 0x800 + CRTSCTS = 0x10000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0xff + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DIOCOSFPFLUSH = 0x2000444e + DLT_ARCNET = 0x7 + DLT_ATM_RFC1483 = 0xb + DLT_AX25 = 0x3 + DLT_CHAOS = 0x5 + DLT_C_HDLC = 0x68 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0xd + DLT_FDDI = 0xa + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_LOOP = 0xc + DLT_MPLS = 0xdb + DLT_NULL = 0x0 + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_SERIAL = 0x32 + DLT_PRONET = 0x4 + DLT_RAW = 0xe + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EMT_TAGOVF = 0x1 + EMUL_ENABLED = 0x1 + EMUL_NATIVE = 0x2 + ENDRUNDISC = 0x9 + ETHERMIN = 0x2e + ETHERMTU = 0x5dc + ETHERTYPE_8023 = 0x4 + ETHERTYPE_AARP = 0x80f3 + ETHERTYPE_ACCTON = 0x8390 + ETHERTYPE_AEONIC = 0x8036 + ETHERTYPE_ALPHA = 0x814a + ETHERTYPE_AMBER = 0x6008 + ETHERTYPE_AMOEBA = 0x8145 + ETHERTYPE_AOE = 0x88a2 + ETHERTYPE_APOLLO = 0x80f7 + ETHERTYPE_APOLLODOMAIN = 0x8019 + ETHERTYPE_APPLETALK = 0x809b + ETHERTYPE_APPLITEK = 0x80c7 + ETHERTYPE_ARGONAUT = 0x803a + ETHERTYPE_ARP = 0x806 + ETHERTYPE_AT = 0x809b + ETHERTYPE_ATALK = 0x809b + ETHERTYPE_ATOMIC = 0x86df + ETHERTYPE_ATT = 0x8069 + ETHERTYPE_ATTSTANFORD = 0x8008 + ETHERTYPE_AUTOPHON = 0x806a + ETHERTYPE_AXIS = 0x8856 + ETHERTYPE_BCLOOP = 0x9003 + ETHERTYPE_BOFL = 0x8102 + ETHERTYPE_CABLETRON = 0x7034 + ETHERTYPE_CHAOS = 0x804 + ETHERTYPE_COMDESIGN = 0x806c + ETHERTYPE_COMPUGRAPHIC = 0x806d + ETHERTYPE_COUNTERPOINT = 0x8062 + ETHERTYPE_CRONUS = 0x8004 + ETHERTYPE_CRONUSVLN = 0x8003 + ETHERTYPE_DCA = 0x1234 + ETHERTYPE_DDE = 0x807b + ETHERTYPE_DEBNI = 0xaaaa + ETHERTYPE_DECAM = 0x8048 + ETHERTYPE_DECCUST = 0x6006 + ETHERTYPE_DECDIAG = 0x6005 + ETHERTYPE_DECDNS = 0x803c + ETHERTYPE_DECDTS = 0x803e + ETHERTYPE_DECEXPER = 0x6000 + ETHERTYPE_DECLAST = 0x8041 + ETHERTYPE_DECLTM = 0x803f + ETHERTYPE_DECMUMPS = 0x6009 + ETHERTYPE_DECNETBIOS = 0x8040 + ETHERTYPE_DELTACON = 0x86de + ETHERTYPE_DIDDLE = 0x4321 + ETHERTYPE_DLOG1 = 0x660 + ETHERTYPE_DLOG2 = 0x661 + ETHERTYPE_DN = 0x6003 + ETHERTYPE_DOGFIGHT = 0x1989 + ETHERTYPE_DSMD = 0x8039 + ETHERTYPE_ECMA = 0x803 + ETHERTYPE_ENCRYPT = 0x803d + ETHERTYPE_ES = 0x805d + ETHERTYPE_EXCELAN = 0x8010 + ETHERTYPE_EXPERDATA = 0x8049 + ETHERTYPE_FLIP = 0x8146 + ETHERTYPE_FLOWCONTROL = 0x8808 + ETHERTYPE_FRARP = 0x808 + ETHERTYPE_GENDYN = 0x8068 + ETHERTYPE_HAYES = 0x8130 + ETHERTYPE_HIPPI_FP = 0x8180 + ETHERTYPE_HITACHI = 0x8820 + ETHERTYPE_HP = 0x8005 + ETHERTYPE_IEEEPUP = 0xa00 + ETHERTYPE_IEEEPUPAT = 0xa01 + ETHERTYPE_IMLBL = 0x4c42 + ETHERTYPE_IMLBLDIAG = 0x424c + ETHERTYPE_IP = 0x800 + ETHERTYPE_IPAS = 0x876c + ETHERTYPE_IPV6 = 0x86dd + ETHERTYPE_IPX = 0x8137 + ETHERTYPE_IPXNEW = 0x8037 + ETHERTYPE_KALPANA = 0x8582 + ETHERTYPE_LANBRIDGE = 0x8038 + ETHERTYPE_LANPROBE = 0x8888 + ETHERTYPE_LAT = 0x6004 + ETHERTYPE_LBACK = 0x9000 + ETHERTYPE_LITTLE = 0x8060 + ETHERTYPE_LLDP = 0x88cc + ETHERTYPE_LOGICRAFT = 0x8148 + ETHERTYPE_LOOPBACK = 0x9000 + ETHERTYPE_MATRA = 0x807a + ETHERTYPE_MAX = 0xffff + ETHERTYPE_MERIT = 0x807c + ETHERTYPE_MICP = 0x873a + ETHERTYPE_MOPDL = 0x6001 + ETHERTYPE_MOPRC = 0x6002 + ETHERTYPE_MOTOROLA = 0x818d + ETHERTYPE_MPLS = 0x8847 + ETHERTYPE_MPLS_MCAST = 0x8848 + ETHERTYPE_MUMPS = 0x813f + ETHERTYPE_NBPCC = 0x3c04 + ETHERTYPE_NBPCLAIM = 0x3c09 + ETHERTYPE_NBPCLREQ = 0x3c05 + ETHERTYPE_NBPCLRSP = 0x3c06 + ETHERTYPE_NBPCREQ = 0x3c02 + ETHERTYPE_NBPCRSP = 0x3c03 + ETHERTYPE_NBPDG = 0x3c07 + ETHERTYPE_NBPDGB = 0x3c08 + ETHERTYPE_NBPDLTE = 0x3c0a + ETHERTYPE_NBPRAR = 0x3c0c + ETHERTYPE_NBPRAS = 0x3c0b + ETHERTYPE_NBPRST = 0x3c0d + ETHERTYPE_NBPSCD = 0x3c01 + ETHERTYPE_NBPVCD = 0x3c00 + ETHERTYPE_NBS = 0x802 + ETHERTYPE_NCD = 0x8149 + ETHERTYPE_NESTAR = 0x8006 + ETHERTYPE_NETBEUI = 0x8191 + ETHERTYPE_NOVELL = 0x8138 + ETHERTYPE_NS = 0x600 + ETHERTYPE_NSAT = 0x601 + ETHERTYPE_NSCOMPAT = 0x807 + ETHERTYPE_NTRAILER = 0x10 + ETHERTYPE_OS9 = 0x7007 + ETHERTYPE_OS9NET = 0x7009 + ETHERTYPE_PACER = 0x80c6 + ETHERTYPE_PAE = 0x888e + ETHERTYPE_PCS = 0x4242 + ETHERTYPE_PLANNING = 0x8044 + ETHERTYPE_PPP = 0x880b + ETHERTYPE_PPPOE = 0x8864 + ETHERTYPE_PPPOEDISC = 0x8863 + ETHERTYPE_PRIMENTS = 0x7031 + ETHERTYPE_PUP = 0x200 + ETHERTYPE_PUPAT = 0x200 + ETHERTYPE_QINQ = 0x88a8 + ETHERTYPE_RACAL = 0x7030 + ETHERTYPE_RATIONAL = 0x8150 + ETHERTYPE_RAWFR = 0x6559 + ETHERTYPE_RCL = 0x1995 + ETHERTYPE_RDP = 0x8739 + ETHERTYPE_RETIX = 0x80f2 + ETHERTYPE_REVARP = 0x8035 + ETHERTYPE_SCA = 0x6007 + ETHERTYPE_SECTRA = 0x86db + ETHERTYPE_SECUREDATA = 0x876d + ETHERTYPE_SGITW = 0x817e + ETHERTYPE_SG_BOUNCE = 0x8016 + ETHERTYPE_SG_DIAG = 0x8013 + ETHERTYPE_SG_NETGAMES = 0x8014 + ETHERTYPE_SG_RESV = 0x8015 + ETHERTYPE_SIMNET = 0x5208 + ETHERTYPE_SLOW = 0x8809 + ETHERTYPE_SNA = 0x80d5 + ETHERTYPE_SNMP = 0x814c + ETHERTYPE_SONIX = 0xfaf5 + ETHERTYPE_SPIDER = 0x809f + ETHERTYPE_SPRITE = 0x500 + ETHERTYPE_STP = 0x8181 + ETHERTYPE_TALARIS = 0x812b + ETHERTYPE_TALARISMC = 0x852b + ETHERTYPE_TCPCOMP = 0x876b + ETHERTYPE_TCPSM = 0x9002 + ETHERTYPE_TEC = 0x814f + ETHERTYPE_TIGAN = 0x802f + ETHERTYPE_TRAIL = 0x1000 + ETHERTYPE_TRANSETHER = 0x6558 + ETHERTYPE_TYMSHARE = 0x802e + ETHERTYPE_UBBST = 0x7005 + ETHERTYPE_UBDEBUG = 0x900 + ETHERTYPE_UBDIAGLOOP = 0x7002 + ETHERTYPE_UBDL = 0x7000 + ETHERTYPE_UBNIU = 0x7001 + ETHERTYPE_UBNMC = 0x7003 + ETHERTYPE_VALID = 0x1600 + ETHERTYPE_VARIAN = 0x80dd + ETHERTYPE_VAXELN = 0x803b + ETHERTYPE_VEECO = 0x8067 + ETHERTYPE_VEXP = 0x805b + ETHERTYPE_VGLAB = 0x8131 + ETHERTYPE_VINES = 0xbad + ETHERTYPE_VINESECHO = 0xbaf + ETHERTYPE_VINESLOOP = 0xbae + ETHERTYPE_VITAL = 0xff00 + ETHERTYPE_VLAN = 0x8100 + ETHERTYPE_VLTLMAN = 0x8080 + ETHERTYPE_VPROD = 0x805c + ETHERTYPE_VURESERVED = 0x8147 + ETHERTYPE_WATERLOO = 0x8130 + ETHERTYPE_WELLFLEET = 0x8103 + ETHERTYPE_X25 = 0x805 + ETHERTYPE_X75 = 0x801 + ETHERTYPE_XNSSM = 0x9001 + ETHERTYPE_XTP = 0x817d + ETHER_ADDR_LEN = 0x6 + ETHER_ALIGN = 0x2 + ETHER_CRC_LEN = 0x4 + ETHER_CRC_POLY_BE = 0x4c11db6 + ETHER_CRC_POLY_LE = 0xedb88320 + ETHER_HDR_LEN = 0xe + ETHER_MAX_DIX_LEN = 0x600 + ETHER_MAX_LEN = 0x5ee + ETHER_MIN_LEN = 0x40 + ETHER_TYPE_LEN = 0x2 + ETHER_VLAN_ENCAP_LEN = 0x4 + EVFILT_AIO = -0x3 + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0x7 + EVFILT_TIMER = -0x7 + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0xa + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETOWN = 0x5 + F_OK = 0x0 + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFA_ROUTE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x8e52 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BLUETOOTH = 0xf8 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf7 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DUMMY = 0xf1 + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ECONET = 0xce + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf3 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INFINIBAND = 0xc7 + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LINEGROUP = 0xd2 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf5 + IFT_PFLOW = 0xf9 + IFT_PFSYNC = 0xf6 + IFT_PLC = 0xae + IFT_PON155 = 0xcf + IFT_PON622 = 0xd0 + IFT_POS = 0xab + IFT_PPP = 0x17 + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPATM = 0xc5 + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf2 + IFT_Q2931 = 0xc9 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SIPSIG = 0xcc + IFT_SIPTG = 0xcb + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TELINK = 0xc8 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VIRTUALTG = 0xca + IFT_VOICEDID = 0xd5 + IFT_VOICEEM = 0x64 + IFT_VOICEEMFGD = 0xd3 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFGDEANA = 0xd4 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERCABLE = 0xc6 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IN_RFC3021_HOST = 0x1 + IN_RFC3021_NET = 0xfffffffe + IN_RFC3021_NSHIFT = 0x1f + IPPROTO_AH = 0x33 + IPPROTO_CARP = 0x70 + IPPROTO_DIVERT = 0x102 + IPPROTO_DIVERT_INIT = 0x2 + IPPROTO_DIVERT_RESP = 0x1 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPIP = 0x4 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x103 + IPPROTO_MOBILE = 0x37 + IPPROTO_MPLS = 0x89 + IPPROTO_NONE = 0x3b + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPV6_AUTH_LEVEL = 0x35 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_ESP_NETWORK_LEVEL = 0x37 + IPV6_ESP_TRANS_LEVEL = 0x36 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPCOMP_LEVEL = 0x3c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXPACKET = 0xffff + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_OPTIONS = 0x1 + IPV6_PATHMTU = 0x2c + IPV6_PIPEX = 0x3f + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVDSTPORT = 0x40 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTABLE = 0x1021 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_AUTH_LEVEL = 0x14 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DIVERTFL = 0x1022 + IP_DROP_MEMBERSHIP = 0xd + IP_ESP_NETWORK_LEVEL = 0x16 + IP_ESP_TRANS_LEVEL = 0x15 + IP_HDRINCL = 0x2 + IP_IPCOMP_LEVEL = 0x1d + IP_IPSECFLOWINFO = 0x24 + IP_IPSEC_LOCAL_AUTH = 0x1b + IP_IPSEC_LOCAL_CRED = 0x19 + IP_IPSEC_LOCAL_ID = 0x17 + IP_IPSEC_REMOTE_AUTH = 0x1c + IP_IPSEC_REMOTE_CRED = 0x1a + IP_IPSEC_REMOTE_ID = 0x18 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0xfff + IP_MF = 0x2000 + IP_MINTTL = 0x20 + IP_MIN_MEMBERSHIPS = 0xf + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x1 + IP_PIPEX = 0x22 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVDSTPORT = 0x21 + IP_RECVIF = 0x1e + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVRTABLE = 0x23 + IP_RECVTTL = 0x1f + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RTABLE = 0x1021 + IP_TOS = 0x3 + IP_TTL = 0x4 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LCNT_OVERLOAD_FLUSH = 0x6 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x6 + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_SPACEAVAIL = 0x5 + MADV_WILLNEED = 0x3 + MAP_ANON = 0x1000 + MAP_COPY = 0x4 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FLAGMASK = 0x1ff7 + MAP_HASSEMAPHORE = 0x200 + MAP_INHERIT = 0x80 + MAP_INHERIT_COPY = 0x1 + MAP_INHERIT_DONATE_COPY = 0x3 + MAP_INHERIT_NONE = 0x2 + MAP_INHERIT_SHARE = 0x0 + MAP_NOEXTEND = 0x100 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_TRYFIXED = 0x400 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MSG_BCAST = 0x100 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOR = 0x8 + MSG_MCAST = 0x200 + MSG_NOSIGNAL = 0x400 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x4 + MS_SYNC = 0x2 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_MAXID = 0x6 + NET_RT_STATS = 0x4 + NET_RT_TABLE = 0x5 + NOFLSH = 0x80000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + NOTE_EOF = 0x2 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRUNCATE = 0x80 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + ONLCR = 0x2 + ONLRET = 0x80 + ONOCR = 0x40 + ONOEOT = 0x8 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x10000 + O_CREAT = 0x200 + O_DIRECTORY = 0x20000 + O_DSYNC = 0x80 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x80 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PF_FLUSH = 0x1 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PT_MASK = 0x3ff000 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x8 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_LABEL = 0xa + RTAX_MAX = 0xb + RTAX_NETMASK = 0x2 + RTAX_SRC = 0x8 + RTAX_SRCMASK = 0x9 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_LABEL = 0x400 + RTA_NETMASK = 0x4 + RTA_SRC = 0x100 + RTA_SRCMASK = 0x200 + RTF_ANNOUNCE = 0x4000 + RTF_BLACKHOLE = 0x1000 + RTF_CLONED = 0x10000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_FMASK = 0x10f808 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_MASK = 0x80 + RTF_MODIFIED = 0x20 + RTF_MPATH = 0x40000 + RTF_MPLS = 0x100000 + RTF_PERMANENT_ARP = 0x2000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x2000 + RTF_REJECT = 0x8 + RTF_SOURCE = 0x20000 + RTF_STATIC = 0x800 + RTF_TUNNEL = 0x100000 + RTF_UP = 0x1 + RTF_USETRAILERS = 0x8000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DESYNC = 0x10 + RTM_GET = 0x4 + RTM_IFANNOUNCE = 0xf + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MAXSIZE = 0x800 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RT_TABLEID_MAX = 0xff + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x4 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCAIFGROUP = 0x80246987 + SIOCALIFADDR = 0x8218691c + SIOCATMARK = 0x40047307 + SIOCBRDGADD = 0x8054693c + SIOCBRDGADDS = 0x80546941 + SIOCBRDGARL = 0x806e694d + SIOCBRDGDADDR = 0x81286947 + SIOCBRDGDEL = 0x8054693d + SIOCBRDGDELS = 0x80546942 + SIOCBRDGFLUSH = 0x80546948 + SIOCBRDGFRL = 0x806e694e + SIOCBRDGGCACHE = 0xc0146941 + SIOCBRDGGFD = 0xc0146952 + SIOCBRDGGHT = 0xc0146951 + SIOCBRDGGIFFLGS = 0xc054693e + SIOCBRDGGMA = 0xc0146953 + SIOCBRDGGPARAM = 0xc03c6958 + SIOCBRDGGPRI = 0xc0146950 + SIOCBRDGGRL = 0xc028694f + SIOCBRDGGSIFS = 0xc054693c + SIOCBRDGGTO = 0xc0146946 + SIOCBRDGIFS = 0xc0546942 + SIOCBRDGRTS = 0xc0186943 + SIOCBRDGSADDR = 0xc1286944 + SIOCBRDGSCACHE = 0x80146940 + SIOCBRDGSFD = 0x80146952 + SIOCBRDGSHT = 0x80146951 + SIOCBRDGSIFCOST = 0x80546955 + SIOCBRDGSIFFLGS = 0x8054693f + SIOCBRDGSIFPRIO = 0x80546954 + SIOCBRDGSMA = 0x80146953 + SIOCBRDGSPRI = 0x80146950 + SIOCBRDGSPROTO = 0x8014695a + SIOCBRDGSTO = 0x80146945 + SIOCBRDGSTXHC = 0x80146959 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFGROUP = 0x80246989 + SIOCDIFPHYADDR = 0x80206949 + SIOCDLIFADDR = 0x8218691e + SIOCGETKALIVE = 0xc01869a4 + SIOCGETLABEL = 0x8020699a + SIOCGETPFLOW = 0xc02069fe + SIOCGETPFSYNC = 0xc02069f8 + SIOCGETSGCNT = 0xc0147534 + SIOCGETVIFCNT = 0xc0147533 + SIOCGETVLAN = 0xc0206990 + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFASYNCMAP = 0xc020697c + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCONF = 0xc0086924 + SIOCGIFDATA = 0xc020691b + SIOCGIFDESCR = 0xc0206981 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGATTR = 0xc024698b + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc024698a + SIOCGIFGROUP = 0xc0246988 + SIOCGIFHARDMTU = 0xc02069a5 + SIOCGIFMEDIA = 0xc0286936 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc020697e + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206948 + SIOCGIFPRIORITY = 0xc020699c + SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFRDOMAIN = 0xc02069a0 + SIOCGIFRTLABEL = 0xc0206983 + SIOCGIFTIMESLOT = 0xc0206986 + SIOCGIFXFLAGS = 0xc020699e + SIOCGLIFADDR = 0xc218691d + SIOCGLIFPHYADDR = 0xc218694b + SIOCGLIFPHYRTABLE = 0xc02069a2 + SIOCGLIFPHYTTL = 0xc02069a9 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGSPPPPARAMS = 0xc0206994 + SIOCGVH = 0xc02069f6 + SIOCGVNETID = 0xc02069a7 + SIOCIFCREATE = 0x8020697a + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc00c6978 + SIOCSETKALIVE = 0x801869a3 + SIOCSETLABEL = 0x80206999 + SIOCSETPFLOW = 0x802069fd + SIOCSETPFSYNC = 0x802069f7 + SIOCSETVLAN = 0x8020698f + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFASYNCMAP = 0x8020697d + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFDESCR = 0x80206980 + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGATTR = 0x8024698c + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020691f + SIOCSIFMEDIA = 0xc0206935 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x8020697f + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSIFPRIORITY = 0x8020699b + SIOCSIFRDOMAIN = 0x8020699f + SIOCSIFRTLABEL = 0x80206982 + SIOCSIFTIMESLOT = 0x80206985 + SIOCSIFXFLAGS = 0x8020699d + SIOCSLIFPHYADDR = 0x8218694a + SIOCSLIFPHYRTABLE = 0x802069a1 + SIOCSLIFPHYTTL = 0x802069a8 + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSSPPPPARAMS = 0x80206993 + SIOCSVH = 0xc02069f5 + SIOCSVNETID = 0x802069a6 + SOCK_DGRAM = 0x2 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_BINDANY = 0x1000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_NETPROC = 0x1020 + SO_OOBINLINE = 0x100 + SO_PEERCRED = 0x1022 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RTABLE = 0x1021 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_SPLICE = 0x1023 + SO_TIMESTAMP = 0x800 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + TCIFLUSH = 0x1 + TCIOFLUSH = 0x3 + TCOFLUSH = 0x2 + TCP_MAXBURST = 0x4 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x3 + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x4 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOPUSH = 0x10 + TCP_NSTATES = 0xb + TCP_SACK_ENABLE = 0x8 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLAG_CLOCAL = 0x2 + TIOCFLAG_CRTSCTS = 0x4 + TIOCFLAG_MDMBUF = 0x8 + TIOCFLAG_PPS = 0x10 + TIOCFLAG_SOFTCAR = 0x1 + TIOCFLUSH = 0x80047410 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGFLAGS = 0x4004745d + TIOCGPGRP = 0x40047477 + TIOCGSID = 0x40047463 + TIOCGTSTAMP = 0x400c745b + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGET = 0x4004746a + TIOCMODG = 0x4004746a + TIOCMODS = 0x8004746d + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSFLAGS = 0x8004745c + TIOCSIG = 0x8004745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x80047465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSTSTAMP = 0x8008745a + TIOCSWINSZ = 0x80087467 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WALTSIG = 0x4 + WCONTINUED = 0x8 + WCOREFLAG = 0x80 + WNOHANG = 0x1 + WSTOPPED = 0x7f + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x58) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x59) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EIPSEC = syscall.Errno(0x52) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x5b) + ELOOP = syscall.Errno(0x3e) + EMEDIUMTYPE = syscall.Errno(0x56) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x53) + ENOBUFS = syscall.Errno(0x37) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOMEDIUM = syscall.Errno(0x55) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x5a) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x5b) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x57) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHR = syscall.Signal(0x20) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "device not configured"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EDEADLK", "resource deadlock avoided"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "cross-device link"}, + {19, "ENODEV", "operation not supported by device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "result too large"}, + {35, "EWOULDBLOCK", "resource temporarily unavailable"}, + {36, "EINPROGRESS", "operation now in progress"}, + {37, "EALREADY", "operation already in progress"}, + {38, "ENOTSOCK", "socket operation on non-socket"}, + {39, "EDESTADDRREQ", "destination address required"}, + {40, "EMSGSIZE", "message too long"}, + {41, "EPROTOTYPE", "protocol wrong type for socket"}, + {42, "ENOPROTOOPT", "protocol not available"}, + {43, "EPROTONOSUPPORT", "protocol not supported"}, + {44, "ESOCKTNOSUPPORT", "socket type not supported"}, + {45, "EOPNOTSUPP", "operation not supported"}, + {46, "EPFNOSUPPORT", "protocol family not supported"}, + {47, "EAFNOSUPPORT", "address family not supported by protocol family"}, + {48, "EADDRINUSE", "address already in use"}, + {49, "EADDRNOTAVAIL", "can't assign requested address"}, + {50, "ENETDOWN", "network is down"}, + {51, "ENETUNREACH", "network is unreachable"}, + {52, "ENETRESET", "network dropped connection on reset"}, + {53, "ECONNABORTED", "software caused connection abort"}, + {54, "ECONNRESET", "connection reset by peer"}, + {55, "ENOBUFS", "no buffer space available"}, + {56, "EISCONN", "socket is already connected"}, + {57, "ENOTCONN", "socket is not connected"}, + {58, "ESHUTDOWN", "can't send after socket shutdown"}, + {59, "ETOOMANYREFS", "too many references: can't splice"}, + {60, "ETIMEDOUT", "operation timed out"}, + {61, "ECONNREFUSED", "connection refused"}, + {62, "ELOOP", "too many levels of symbolic links"}, + {63, "ENAMETOOLONG", "file name too long"}, + {64, "EHOSTDOWN", "host is down"}, + {65, "EHOSTUNREACH", "no route to host"}, + {66, "ENOTEMPTY", "directory not empty"}, + {67, "EPROCLIM", "too many processes"}, + {68, "EUSERS", "too many users"}, + {69, "EDQUOT", "disk quota exceeded"}, + {70, "ESTALE", "stale NFS file handle"}, + {71, "EREMOTE", "too many levels of remote in path"}, + {72, "EBADRPC", "RPC struct is bad"}, + {73, "ERPCMISMATCH", "RPC version wrong"}, + {74, "EPROGUNAVAIL", "RPC program not available"}, + {75, "EPROGMISMATCH", "program version wrong"}, + {76, "EPROCUNAVAIL", "bad procedure for program"}, + {77, "ENOLCK", "no locks available"}, + {78, "ENOSYS", "function not implemented"}, + {79, "EFTYPE", "inappropriate file type or format"}, + {80, "EAUTH", "authentication error"}, + {81, "ENEEDAUTH", "need authenticator"}, + {82, "EIPSEC", "IPsec processing failure"}, + {83, "ENOATTR", "attribute not found"}, + {84, "EILSEQ", "illegal byte sequence"}, + {85, "ENOMEDIUM", "no medium found"}, + {86, "EMEDIUMTYPE", "wrong medium type"}, + {87, "EOVERFLOW", "value too large to be stored in data type"}, + {88, "ECANCELED", "operation canceled"}, + {89, "EIDRM", "identifier removed"}, + {90, "ENOMSG", "no message of desired type"}, + {91, "ELAST", "not supported"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/BPT trap"}, + {6, "SIGABRT", "abort trap"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGURG", "urgent I/O condition"}, + {17, "SIGSTOP", "suspended (signal)"}, + {18, "SIGTSTP", "suspended"}, + {19, "SIGCONT", "continued"}, + {20, "SIGCHLD", "child exited"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGIO", "I/O possible"}, + {24, "SIGXCPU", "cputime limit exceeded"}, + {25, "SIGXFSZ", "filesize limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window size changes"}, + {29, "SIGINFO", "information request"}, + {30, "SIGUSR1", "user defined signal 1"}, + {31, "SIGUSR2", "user defined signal 2"}, + {32, "SIGTHR", "thread AST"}, +} diff --git a/api/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go b/api/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go new file mode 100644 index 0000000..acfc664 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go @@ -0,0 +1,1706 @@ +// mkerrors.sh -m64 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,openbsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_BLUETOOTH = 0x20 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_ENCAP = 0x1c + AF_HYLINK = 0xf + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x18 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_KEY = 0x1e + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x24 + AF_MPLS = 0x21 + AF_NATM = 0x1b + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SIP = 0x1d + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + ALTWERASE = 0x200 + ARPHRD_ETHER = 0x1 + ARPHRD_FRELAY = 0xf + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B9600 = 0x2580 + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDIRFILT = 0x4004427c + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc010427b + BIOCGETIF = 0x4020426b + BIOCGFILDROP = 0x40044278 + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044273 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x20004276 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDIRFILT = 0x8004427d + BIOCSDLT = 0x8004427a + BIOCSETF = 0x80104267 + BIOCSETIF = 0x8020426c + BIOCSETWF = 0x80104277 + BIOCSFILDROP = 0x80044279 + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044272 + BIOCSRTIMEOUT = 0x8010426d + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIRECTION_IN = 0x1 + BPF_DIRECTION_OUT = 0x2 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x200000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_BOOTTIME = 0x6 + CLOCK_MONOTONIC = 0x3 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_THREAD_CPUTIME_ID = 0x4 + CLOCK_UPTIME = 0x5 + CREAD = 0x800 + CRTSCTS = 0x10000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0xff + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DIOCOSFPFLUSH = 0x2000444e + DLT_ARCNET = 0x7 + DLT_ATM_RFC1483 = 0xb + DLT_AX25 = 0x3 + DLT_CHAOS = 0x5 + DLT_C_HDLC = 0x68 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0xd + DLT_FDDI = 0xa + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_LOOP = 0xc + DLT_MPLS = 0xdb + DLT_NULL = 0x0 + DLT_OPENFLOW = 0x10b + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_SERIAL = 0x32 + DLT_PRONET = 0x4 + DLT_RAW = 0xe + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_USBPCAP = 0xf9 + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EMT_TAGOVF = 0x1 + EMUL_ENABLED = 0x1 + EMUL_NATIVE = 0x2 + ENDRUNDISC = 0x9 + ETHERMIN = 0x2e + ETHERMTU = 0x5dc + ETHERTYPE_8023 = 0x4 + ETHERTYPE_AARP = 0x80f3 + ETHERTYPE_ACCTON = 0x8390 + ETHERTYPE_AEONIC = 0x8036 + ETHERTYPE_ALPHA = 0x814a + ETHERTYPE_AMBER = 0x6008 + ETHERTYPE_AMOEBA = 0x8145 + ETHERTYPE_AOE = 0x88a2 + ETHERTYPE_APOLLO = 0x80f7 + ETHERTYPE_APOLLODOMAIN = 0x8019 + ETHERTYPE_APPLETALK = 0x809b + ETHERTYPE_APPLITEK = 0x80c7 + ETHERTYPE_ARGONAUT = 0x803a + ETHERTYPE_ARP = 0x806 + ETHERTYPE_AT = 0x809b + ETHERTYPE_ATALK = 0x809b + ETHERTYPE_ATOMIC = 0x86df + ETHERTYPE_ATT = 0x8069 + ETHERTYPE_ATTSTANFORD = 0x8008 + ETHERTYPE_AUTOPHON = 0x806a + ETHERTYPE_AXIS = 0x8856 + ETHERTYPE_BCLOOP = 0x9003 + ETHERTYPE_BOFL = 0x8102 + ETHERTYPE_CABLETRON = 0x7034 + ETHERTYPE_CHAOS = 0x804 + ETHERTYPE_COMDESIGN = 0x806c + ETHERTYPE_COMPUGRAPHIC = 0x806d + ETHERTYPE_COUNTERPOINT = 0x8062 + ETHERTYPE_CRONUS = 0x8004 + ETHERTYPE_CRONUSVLN = 0x8003 + ETHERTYPE_DCA = 0x1234 + ETHERTYPE_DDE = 0x807b + ETHERTYPE_DEBNI = 0xaaaa + ETHERTYPE_DECAM = 0x8048 + ETHERTYPE_DECCUST = 0x6006 + ETHERTYPE_DECDIAG = 0x6005 + ETHERTYPE_DECDNS = 0x803c + ETHERTYPE_DECDTS = 0x803e + ETHERTYPE_DECEXPER = 0x6000 + ETHERTYPE_DECLAST = 0x8041 + ETHERTYPE_DECLTM = 0x803f + ETHERTYPE_DECMUMPS = 0x6009 + ETHERTYPE_DECNETBIOS = 0x8040 + ETHERTYPE_DELTACON = 0x86de + ETHERTYPE_DIDDLE = 0x4321 + ETHERTYPE_DLOG1 = 0x660 + ETHERTYPE_DLOG2 = 0x661 + ETHERTYPE_DN = 0x6003 + ETHERTYPE_DOGFIGHT = 0x1989 + ETHERTYPE_DSMD = 0x8039 + ETHERTYPE_ECMA = 0x803 + ETHERTYPE_ENCRYPT = 0x803d + ETHERTYPE_ES = 0x805d + ETHERTYPE_EXCELAN = 0x8010 + ETHERTYPE_EXPERDATA = 0x8049 + ETHERTYPE_FLIP = 0x8146 + ETHERTYPE_FLOWCONTROL = 0x8808 + ETHERTYPE_FRARP = 0x808 + ETHERTYPE_GENDYN = 0x8068 + ETHERTYPE_HAYES = 0x8130 + ETHERTYPE_HIPPI_FP = 0x8180 + ETHERTYPE_HITACHI = 0x8820 + ETHERTYPE_HP = 0x8005 + ETHERTYPE_IEEEPUP = 0xa00 + ETHERTYPE_IEEEPUPAT = 0xa01 + ETHERTYPE_IMLBL = 0x4c42 + ETHERTYPE_IMLBLDIAG = 0x424c + ETHERTYPE_IP = 0x800 + ETHERTYPE_IPAS = 0x876c + ETHERTYPE_IPV6 = 0x86dd + ETHERTYPE_IPX = 0x8137 + ETHERTYPE_IPXNEW = 0x8037 + ETHERTYPE_KALPANA = 0x8582 + ETHERTYPE_LANBRIDGE = 0x8038 + ETHERTYPE_LANPROBE = 0x8888 + ETHERTYPE_LAT = 0x6004 + ETHERTYPE_LBACK = 0x9000 + ETHERTYPE_LITTLE = 0x8060 + ETHERTYPE_LLDP = 0x88cc + ETHERTYPE_LOGICRAFT = 0x8148 + ETHERTYPE_LOOPBACK = 0x9000 + ETHERTYPE_MATRA = 0x807a + ETHERTYPE_MAX = 0xffff + ETHERTYPE_MERIT = 0x807c + ETHERTYPE_MICP = 0x873a + ETHERTYPE_MOPDL = 0x6001 + ETHERTYPE_MOPRC = 0x6002 + ETHERTYPE_MOTOROLA = 0x818d + ETHERTYPE_MPLS = 0x8847 + ETHERTYPE_MPLS_MCAST = 0x8848 + ETHERTYPE_MUMPS = 0x813f + ETHERTYPE_NBPCC = 0x3c04 + ETHERTYPE_NBPCLAIM = 0x3c09 + ETHERTYPE_NBPCLREQ = 0x3c05 + ETHERTYPE_NBPCLRSP = 0x3c06 + ETHERTYPE_NBPCREQ = 0x3c02 + ETHERTYPE_NBPCRSP = 0x3c03 + ETHERTYPE_NBPDG = 0x3c07 + ETHERTYPE_NBPDGB = 0x3c08 + ETHERTYPE_NBPDLTE = 0x3c0a + ETHERTYPE_NBPRAR = 0x3c0c + ETHERTYPE_NBPRAS = 0x3c0b + ETHERTYPE_NBPRST = 0x3c0d + ETHERTYPE_NBPSCD = 0x3c01 + ETHERTYPE_NBPVCD = 0x3c00 + ETHERTYPE_NBS = 0x802 + ETHERTYPE_NCD = 0x8149 + ETHERTYPE_NESTAR = 0x8006 + ETHERTYPE_NETBEUI = 0x8191 + ETHERTYPE_NOVELL = 0x8138 + ETHERTYPE_NS = 0x600 + ETHERTYPE_NSAT = 0x601 + ETHERTYPE_NSCOMPAT = 0x807 + ETHERTYPE_NTRAILER = 0x10 + ETHERTYPE_OS9 = 0x7007 + ETHERTYPE_OS9NET = 0x7009 + ETHERTYPE_PACER = 0x80c6 + ETHERTYPE_PAE = 0x888e + ETHERTYPE_PCS = 0x4242 + ETHERTYPE_PLANNING = 0x8044 + ETHERTYPE_PPP = 0x880b + ETHERTYPE_PPPOE = 0x8864 + ETHERTYPE_PPPOEDISC = 0x8863 + ETHERTYPE_PRIMENTS = 0x7031 + ETHERTYPE_PUP = 0x200 + ETHERTYPE_PUPAT = 0x200 + ETHERTYPE_QINQ = 0x88a8 + ETHERTYPE_RACAL = 0x7030 + ETHERTYPE_RATIONAL = 0x8150 + ETHERTYPE_RAWFR = 0x6559 + ETHERTYPE_RCL = 0x1995 + ETHERTYPE_RDP = 0x8739 + ETHERTYPE_RETIX = 0x80f2 + ETHERTYPE_REVARP = 0x8035 + ETHERTYPE_SCA = 0x6007 + ETHERTYPE_SECTRA = 0x86db + ETHERTYPE_SECUREDATA = 0x876d + ETHERTYPE_SGITW = 0x817e + ETHERTYPE_SG_BOUNCE = 0x8016 + ETHERTYPE_SG_DIAG = 0x8013 + ETHERTYPE_SG_NETGAMES = 0x8014 + ETHERTYPE_SG_RESV = 0x8015 + ETHERTYPE_SIMNET = 0x5208 + ETHERTYPE_SLOW = 0x8809 + ETHERTYPE_SNA = 0x80d5 + ETHERTYPE_SNMP = 0x814c + ETHERTYPE_SONIX = 0xfaf5 + ETHERTYPE_SPIDER = 0x809f + ETHERTYPE_SPRITE = 0x500 + ETHERTYPE_STP = 0x8181 + ETHERTYPE_TALARIS = 0x812b + ETHERTYPE_TALARISMC = 0x852b + ETHERTYPE_TCPCOMP = 0x876b + ETHERTYPE_TCPSM = 0x9002 + ETHERTYPE_TEC = 0x814f + ETHERTYPE_TIGAN = 0x802f + ETHERTYPE_TRAIL = 0x1000 + ETHERTYPE_TRANSETHER = 0x6558 + ETHERTYPE_TYMSHARE = 0x802e + ETHERTYPE_UBBST = 0x7005 + ETHERTYPE_UBDEBUG = 0x900 + ETHERTYPE_UBDIAGLOOP = 0x7002 + ETHERTYPE_UBDL = 0x7000 + ETHERTYPE_UBNIU = 0x7001 + ETHERTYPE_UBNMC = 0x7003 + ETHERTYPE_VALID = 0x1600 + ETHERTYPE_VARIAN = 0x80dd + ETHERTYPE_VAXELN = 0x803b + ETHERTYPE_VEECO = 0x8067 + ETHERTYPE_VEXP = 0x805b + ETHERTYPE_VGLAB = 0x8131 + ETHERTYPE_VINES = 0xbad + ETHERTYPE_VINESECHO = 0xbaf + ETHERTYPE_VINESLOOP = 0xbae + ETHERTYPE_VITAL = 0xff00 + ETHERTYPE_VLAN = 0x8100 + ETHERTYPE_VLTLMAN = 0x8080 + ETHERTYPE_VPROD = 0x805c + ETHERTYPE_VURESERVED = 0x8147 + ETHERTYPE_WATERLOO = 0x8130 + ETHERTYPE_WELLFLEET = 0x8103 + ETHERTYPE_X25 = 0x805 + ETHERTYPE_X75 = 0x801 + ETHERTYPE_XNSSM = 0x9001 + ETHERTYPE_XTP = 0x817d + ETHER_ADDR_LEN = 0x6 + ETHER_ALIGN = 0x2 + ETHER_CRC_LEN = 0x4 + ETHER_CRC_POLY_BE = 0x4c11db6 + ETHER_CRC_POLY_LE = 0xedb88320 + ETHER_HDR_LEN = 0xe + ETHER_MAX_DIX_LEN = 0x600 + ETHER_MAX_HARDMTU_LEN = 0xff9b + ETHER_MAX_LEN = 0x5ee + ETHER_MIN_LEN = 0x40 + ETHER_TYPE_LEN = 0x2 + ETHER_VLAN_ENCAP_LEN = 0x4 + EVFILT_AIO = -0x3 + EVFILT_DEVICE = -0x8 + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0x8 + EVFILT_TIMER = -0x7 + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EVL_ENCAPLEN = 0x4 + EVL_PRIO_BITS = 0xd + EVL_PRIO_MAX = 0x7 + EVL_VLID_MASK = 0xfff + EVL_VLID_MAX = 0xffe + EVL_VLID_MIN = 0x1 + EVL_VLID_NULL = 0x0 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0xa + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETOWN = 0x5 + F_ISATTY = 0xb + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x8e52 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_STATICARP = 0x20 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BLUETOOTH = 0xf8 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf7 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DUMMY = 0xf1 + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ECONET = 0xce + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf3 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INFINIBAND = 0xc7 + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LINEGROUP = 0xd2 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MBIM = 0xfa + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf5 + IFT_PFLOW = 0xf9 + IFT_PFSYNC = 0xf6 + IFT_PLC = 0xae + IFT_PON155 = 0xcf + IFT_PON622 = 0xd0 + IFT_POS = 0xab + IFT_PPP = 0x17 + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPATM = 0xc5 + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf2 + IFT_Q2931 = 0xc9 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SIPSIG = 0xcc + IFT_SIPTG = 0xcb + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TELINK = 0xc8 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VIRTUALTG = 0xca + IFT_VOICEDID = 0xd5 + IFT_VOICEEM = 0x64 + IFT_VOICEEMFGD = 0xd3 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFGDEANA = 0xd4 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERCABLE = 0xc6 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IN_RFC3021_HOST = 0x1 + IN_RFC3021_NET = 0xfffffffe + IN_RFC3021_NSHIFT = 0x1f + IPPROTO_AH = 0x33 + IPPROTO_CARP = 0x70 + IPPROTO_DIVERT = 0x102 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPIP = 0x4 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x103 + IPPROTO_MOBILE = 0x37 + IPPROTO_MPLS = 0x89 + IPPROTO_NONE = 0x3b + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPV6_AUTH_LEVEL = 0x35 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_ESP_NETWORK_LEVEL = 0x37 + IPV6_ESP_TRANS_LEVEL = 0x36 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPCOMP_LEVEL = 0x3c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXPACKET = 0xffff + IPV6_MINHOPCOUNT = 0x41 + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_OPTIONS = 0x1 + IPV6_PATHMTU = 0x2c + IPV6_PIPEX = 0x3f + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVDSTPORT = 0x40 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTABLE = 0x1021 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_AUTH_LEVEL = 0x14 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_ESP_NETWORK_LEVEL = 0x16 + IP_ESP_TRANS_LEVEL = 0x15 + IP_HDRINCL = 0x2 + IP_IPCOMP_LEVEL = 0x1d + IP_IPDEFTTL = 0x25 + IP_IPSECFLOWINFO = 0x24 + IP_IPSEC_LOCAL_AUTH = 0x1b + IP_IPSEC_LOCAL_CRED = 0x19 + IP_IPSEC_LOCAL_ID = 0x17 + IP_IPSEC_REMOTE_AUTH = 0x1c + IP_IPSEC_REMOTE_CRED = 0x1a + IP_IPSEC_REMOTE_ID = 0x18 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0xfff + IP_MF = 0x2000 + IP_MINTTL = 0x20 + IP_MIN_MEMBERSHIPS = 0xf + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x1 + IP_PIPEX = 0x22 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVDSTPORT = 0x21 + IP_RECVIF = 0x1e + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVRTABLE = 0x23 + IP_RECVTTL = 0x1f + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RTABLE = 0x1021 + IP_SENDSRCADDR = 0x7 + IP_TOS = 0x3 + IP_TTL = 0x4 + ISIG = 0x80 + ISTRIP = 0x20 + IUCLC = 0x1000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LCNT_OVERLOAD_FLUSH = 0x6 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x6 + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_SPACEAVAIL = 0x5 + MADV_WILLNEED = 0x3 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FLAGMASK = 0x7ff7 + MAP_HASSEMAPHORE = 0x0 + MAP_INHERIT = 0x0 + MAP_INHERIT_COPY = 0x1 + MAP_INHERIT_NONE = 0x2 + MAP_INHERIT_SHARE = 0x0 + MAP_INHERIT_ZERO = 0x3 + MAP_NOEXTEND = 0x0 + MAP_NORESERVE = 0x0 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x0 + MAP_SHARED = 0x1 + MAP_STACK = 0x4000 + MAP_TRYFIXED = 0x0 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MSG_BCAST = 0x100 + MSG_CMSG_CLOEXEC = 0x800 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOR = 0x8 + MSG_MCAST = 0x200 + MSG_NOSIGNAL = 0x400 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x4 + MS_SYNC = 0x2 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFNAMES = 0x6 + NET_RT_MAXID = 0x7 + NET_RT_STATS = 0x4 + NET_RT_TABLE = 0x5 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ATTRIB = 0x8 + NOTE_CHANGE = 0x1 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + NOTE_EOF = 0x2 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRUNCATE = 0x80 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OLCUC = 0x20 + ONLCR = 0x2 + ONLRET = 0x80 + ONOCR = 0x40 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x10000 + O_CREAT = 0x200 + O_DIRECTORY = 0x20000 + O_DSYNC = 0x80 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x80 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PF_FLUSH = 0x1 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BFD = 0xb + RTAX_BRD = 0x7 + RTAX_DNS = 0xc + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_LABEL = 0xa + RTAX_MAX = 0xf + RTAX_NETMASK = 0x2 + RTAX_SEARCH = 0xe + RTAX_SRC = 0x8 + RTAX_SRCMASK = 0x9 + RTAX_STATIC = 0xd + RTA_AUTHOR = 0x40 + RTA_BFD = 0x800 + RTA_BRD = 0x80 + RTA_DNS = 0x1000 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_LABEL = 0x400 + RTA_NETMASK = 0x4 + RTA_SEARCH = 0x4000 + RTA_SRC = 0x100 + RTA_SRCMASK = 0x200 + RTA_STATIC = 0x2000 + RTF_ANNOUNCE = 0x4000 + RTF_BFD = 0x1000000 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_CACHED = 0x20000 + RTF_CLONED = 0x10000 + RTF_CLONING = 0x100 + RTF_CONNECTED = 0x800000 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_FMASK = 0x110fc08 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MPATH = 0x40000 + RTF_MPLS = 0x100000 + RTF_MULTICAST = 0x200 + RTF_PERMANENT_ARP = 0x2000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x2000 + RTF_REJECT = 0x8 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_USETRAILERS = 0x8000 + RTM_ADD = 0x1 + RTM_BFD = 0x12 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DESYNC = 0x10 + RTM_GET = 0x4 + RTM_IFANNOUNCE = 0xf + RTM_IFINFO = 0xe + RTM_INVALIDATE = 0x11 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MAXSIZE = 0x800 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_PROPOSAL = 0x13 + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RT_TABLEID_BITS = 0x8 + RT_TABLEID_MASK = 0xff + RT_TABLEID_MAX = 0xff + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x4 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCAIFGROUP = 0x80286987 + SIOCATMARK = 0x40047307 + SIOCBRDGADD = 0x8060693c + SIOCBRDGADDL = 0x80606949 + SIOCBRDGADDS = 0x80606941 + SIOCBRDGARL = 0x808c694d + SIOCBRDGDADDR = 0x81286947 + SIOCBRDGDEL = 0x8060693d + SIOCBRDGDELS = 0x80606942 + SIOCBRDGFLUSH = 0x80606948 + SIOCBRDGFRL = 0x808c694e + SIOCBRDGGCACHE = 0xc0186941 + SIOCBRDGGFD = 0xc0186952 + SIOCBRDGGHT = 0xc0186951 + SIOCBRDGGIFFLGS = 0xc060693e + SIOCBRDGGMA = 0xc0186953 + SIOCBRDGGPARAM = 0xc0406958 + SIOCBRDGGPRI = 0xc0186950 + SIOCBRDGGRL = 0xc030694f + SIOCBRDGGTO = 0xc0186946 + SIOCBRDGIFS = 0xc0606942 + SIOCBRDGRTS = 0xc0206943 + SIOCBRDGSADDR = 0xc1286944 + SIOCBRDGSCACHE = 0x80186940 + SIOCBRDGSFD = 0x80186952 + SIOCBRDGSHT = 0x80186951 + SIOCBRDGSIFCOST = 0x80606955 + SIOCBRDGSIFFLGS = 0x8060693f + SIOCBRDGSIFPRIO = 0x80606954 + SIOCBRDGSIFPROT = 0x8060694a + SIOCBRDGSMA = 0x80186953 + SIOCBRDGSPRI = 0x80186950 + SIOCBRDGSPROTO = 0x8018695a + SIOCBRDGSTO = 0x80186945 + SIOCBRDGSTXHC = 0x80186959 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFGROUP = 0x80286989 + SIOCDIFPARENT = 0x802069b4 + SIOCDIFPHYADDR = 0x80206949 + SIOCDVNETID = 0x802069af + SIOCGETKALIVE = 0xc01869a4 + SIOCGETLABEL = 0x8020699a + SIOCGETMPWCFG = 0xc02069ae + SIOCGETPFLOW = 0xc02069fe + SIOCGETPFSYNC = 0xc02069f8 + SIOCGETSGCNT = 0xc0207534 + SIOCGETVIFCNT = 0xc0287533 + SIOCGETVLAN = 0xc0206990 + SIOCGIFADDR = 0xc0206921 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCONF = 0xc0106924 + SIOCGIFDATA = 0xc020691b + SIOCGIFDESCR = 0xc0206981 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGATTR = 0xc028698b + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc028698a + SIOCGIFGROUP = 0xc0286988 + SIOCGIFHARDMTU = 0xc02069a5 + SIOCGIFLLPRIO = 0xc02069b6 + SIOCGIFMEDIA = 0xc0406938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc020697e + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPAIR = 0xc02069b1 + SIOCGIFPARENT = 0xc02069b3 + SIOCGIFPRIORITY = 0xc020699c + SIOCGIFRDOMAIN = 0xc02069a0 + SIOCGIFRTLABEL = 0xc0206983 + SIOCGIFRXR = 0x802069aa + SIOCGIFXFLAGS = 0xc020699e + SIOCGLIFPHYADDR = 0xc218694b + SIOCGLIFPHYDF = 0xc02069c2 + SIOCGLIFPHYRTABLE = 0xc02069a2 + SIOCGLIFPHYTTL = 0xc02069a9 + SIOCGPGRP = 0x40047309 + SIOCGSPPPPARAMS = 0xc0206994 + SIOCGUMBINFO = 0xc02069be + SIOCGUMBPARAM = 0xc02069c0 + SIOCGVH = 0xc02069f6 + SIOCGVNETFLOWID = 0xc02069c4 + SIOCGVNETID = 0xc02069a7 + SIOCIFAFATTACH = 0x801169ab + SIOCIFAFDETACH = 0x801169ac + SIOCIFCREATE = 0x8020697a + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc0106978 + SIOCSETKALIVE = 0x801869a3 + SIOCSETLABEL = 0x80206999 + SIOCSETMPWCFG = 0x802069ad + SIOCSETPFLOW = 0x802069fd + SIOCSETPFSYNC = 0x802069f7 + SIOCSETVLAN = 0x8020698f + SIOCSIFADDR = 0x8020690c + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFDESCR = 0x80206980 + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGATTR = 0x8028698c + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020691f + SIOCSIFLLPRIO = 0x802069b5 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x8020697f + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPAIR = 0x802069b0 + SIOCSIFPARENT = 0x802069b2 + SIOCSIFPRIORITY = 0x8020699b + SIOCSIFRDOMAIN = 0x8020699f + SIOCSIFRTLABEL = 0x80206982 + SIOCSIFXFLAGS = 0x8020699d + SIOCSLIFPHYADDR = 0x8218694a + SIOCSLIFPHYDF = 0x802069c1 + SIOCSLIFPHYRTABLE = 0x802069a1 + SIOCSLIFPHYTTL = 0x802069a8 + SIOCSPGRP = 0x80047308 + SIOCSSPPPPARAMS = 0x80206993 + SIOCSUMBPARAM = 0x802069bf + SIOCSVH = 0xc02069f5 + SIOCSVNETFLOWID = 0x802069c3 + SIOCSVNETID = 0x802069a6 + SIOCSWGDPID = 0xc018695b + SIOCSWGMAXFLOW = 0xc0186960 + SIOCSWGMAXGROUP = 0xc018695d + SIOCSWSDPID = 0x8018695c + SIOCSWSPORTNO = 0xc060695f + SOCK_CLOEXEC = 0x8000 + SOCK_DGRAM = 0x2 + SOCK_DNS = 0x1000 + SOCK_NONBLOCK = 0x4000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_BINDANY = 0x1000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_NETPROC = 0x1020 + SO_OOBINLINE = 0x100 + SO_PEERCRED = 0x1022 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RTABLE = 0x1021 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_SPLICE = 0x1023 + SO_TIMESTAMP = 0x800 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SO_ZEROIZE = 0x2000 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCP_MAXBURST = 0x4 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x3 + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x4 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOPUSH = 0x10 + TCP_SACK_ENABLE = 0x8 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCHKVERAUTH = 0x2000741e + TIOCCLRVERAUTH = 0x2000741d + TIOCCONS = 0x80047462 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLAG_CLOCAL = 0x2 + TIOCFLAG_CRTSCTS = 0x4 + TIOCFLAG_MDMBUF = 0x8 + TIOCFLAG_PPS = 0x10 + TIOCFLAG_SOFTCAR = 0x1 + TIOCFLUSH = 0x80047410 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGFLAGS = 0x4004745d + TIOCGPGRP = 0x40047477 + TIOCGSID = 0x40047463 + TIOCGTSTAMP = 0x4010745b + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGET = 0x4004746a + TIOCMODG = 0x4004746a + TIOCMODS = 0x8004746d + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSETVERAUTH = 0x8004741c + TIOCSFLAGS = 0x8004745c + TIOCSIG = 0x8004745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSTSTAMP = 0x8008745a + TIOCSWINSZ = 0x80087467 + TIOCUCNTL = 0x80047466 + TIOCUCNTL_CBRK = 0x7a + TIOCUCNTL_SBRK = 0x7b + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VM_ANONMIN = 0x7 + VM_LOADAVG = 0x2 + VM_MAXID = 0xc + VM_MAXSLP = 0xa + VM_METER = 0x1 + VM_NKMEMPAGES = 0x6 + VM_PSSTRINGS = 0x3 + VM_SWAPENCRYPT = 0x5 + VM_USPACE = 0xb + VM_UVMEXP = 0x4 + VM_VNODEMIN = 0x9 + VM_VTEXTMIN = 0x8 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WALTSIG = 0x4 + WCONTINUED = 0x8 + WCOREFLAG = 0x80 + WNOHANG = 0x1 + WUNTRACED = 0x2 + XCASE = 0x1000000 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x5c) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x58) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x59) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EIPSEC = syscall.Errno(0x52) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x5f) + ELOOP = syscall.Errno(0x3e) + EMEDIUMTYPE = syscall.Errno(0x56) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x53) + ENOBUFS = syscall.Errno(0x37) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOMEDIUM = syscall.Errno(0x55) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x5a) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x5d) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x5b) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x57) + EOWNERDEAD = syscall.Errno(0x5e) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x5f) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHR = syscall.Signal(0x20) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "device not configured"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EDEADLK", "resource deadlock avoided"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "cross-device link"}, + {19, "ENODEV", "operation not supported by device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "result too large"}, + {35, "EAGAIN", "resource temporarily unavailable"}, + {36, "EINPROGRESS", "operation now in progress"}, + {37, "EALREADY", "operation already in progress"}, + {38, "ENOTSOCK", "socket operation on non-socket"}, + {39, "EDESTADDRREQ", "destination address required"}, + {40, "EMSGSIZE", "message too long"}, + {41, "EPROTOTYPE", "protocol wrong type for socket"}, + {42, "ENOPROTOOPT", "protocol not available"}, + {43, "EPROTONOSUPPORT", "protocol not supported"}, + {44, "ESOCKTNOSUPPORT", "socket type not supported"}, + {45, "EOPNOTSUPP", "operation not supported"}, + {46, "EPFNOSUPPORT", "protocol family not supported"}, + {47, "EAFNOSUPPORT", "address family not supported by protocol family"}, + {48, "EADDRINUSE", "address already in use"}, + {49, "EADDRNOTAVAIL", "can't assign requested address"}, + {50, "ENETDOWN", "network is down"}, + {51, "ENETUNREACH", "network is unreachable"}, + {52, "ENETRESET", "network dropped connection on reset"}, + {53, "ECONNABORTED", "software caused connection abort"}, + {54, "ECONNRESET", "connection reset by peer"}, + {55, "ENOBUFS", "no buffer space available"}, + {56, "EISCONN", "socket is already connected"}, + {57, "ENOTCONN", "socket is not connected"}, + {58, "ESHUTDOWN", "can't send after socket shutdown"}, + {59, "ETOOMANYREFS", "too many references: can't splice"}, + {60, "ETIMEDOUT", "operation timed out"}, + {61, "ECONNREFUSED", "connection refused"}, + {62, "ELOOP", "too many levels of symbolic links"}, + {63, "ENAMETOOLONG", "file name too long"}, + {64, "EHOSTDOWN", "host is down"}, + {65, "EHOSTUNREACH", "no route to host"}, + {66, "ENOTEMPTY", "directory not empty"}, + {67, "EPROCLIM", "too many processes"}, + {68, "EUSERS", "too many users"}, + {69, "EDQUOT", "disk quota exceeded"}, + {70, "ESTALE", "stale NFS file handle"}, + {71, "EREMOTE", "too many levels of remote in path"}, + {72, "EBADRPC", "RPC struct is bad"}, + {73, "ERPCMISMATCH", "RPC version wrong"}, + {74, "EPROGUNAVAIL", "RPC program not available"}, + {75, "EPROGMISMATCH", "program version wrong"}, + {76, "EPROCUNAVAIL", "bad procedure for program"}, + {77, "ENOLCK", "no locks available"}, + {78, "ENOSYS", "function not implemented"}, + {79, "EFTYPE", "inappropriate file type or format"}, + {80, "EAUTH", "authentication error"}, + {81, "ENEEDAUTH", "need authenticator"}, + {82, "EIPSEC", "IPsec processing failure"}, + {83, "ENOATTR", "attribute not found"}, + {84, "EILSEQ", "illegal byte sequence"}, + {85, "ENOMEDIUM", "no medium found"}, + {86, "EMEDIUMTYPE", "wrong medium type"}, + {87, "EOVERFLOW", "value too large to be stored in data type"}, + {88, "ECANCELED", "operation canceled"}, + {89, "EIDRM", "identifier removed"}, + {90, "ENOMSG", "no message of desired type"}, + {91, "ENOTSUP", "not supported"}, + {92, "EBADMSG", "bad message"}, + {93, "ENOTRECOVERABLE", "state not recoverable"}, + {94, "EOWNERDEAD", "previous owner died"}, + {95, "ELAST", "protocol error"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/BPT trap"}, + {6, "SIGABRT", "abort trap"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGURG", "urgent I/O condition"}, + {17, "SIGSTOP", "suspended (signal)"}, + {18, "SIGTSTP", "suspended"}, + {19, "SIGCONT", "continued"}, + {20, "SIGCHLD", "child exited"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGIO", "I/O possible"}, + {24, "SIGXCPU", "cputime limit exceeded"}, + {25, "SIGXFSZ", "filesize limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window size changes"}, + {29, "SIGINFO", "information request"}, + {30, "SIGUSR1", "user defined signal 1"}, + {31, "SIGUSR2", "user defined signal 2"}, + {32, "SIGTHR", "thread AST"}, +} diff --git a/api/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go b/api/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go new file mode 100644 index 0000000..93e37c4 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go @@ -0,0 +1,1602 @@ +// mkerrors.sh +// Code generated by the command above; see README.md. DO NOT EDIT. + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- _const.go + +// +build arm,openbsd + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_BLUETOOTH = 0x20 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_ENCAP = 0x1c + AF_HYLINK = 0xf + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x18 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_KEY = 0x1e + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x24 + AF_MPLS = 0x21 + AF_NATM = 0x1b + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SIP = 0x1d + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + ARPHRD_ETHER = 0x1 + ARPHRD_FRELAY = 0xf + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B9600 = 0x2580 + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDIRFILT = 0x4004427c + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc008427b + BIOCGETIF = 0x4020426b + BIOCGFILDROP = 0x40044278 + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044273 + BIOCGRTIMEOUT = 0x400c426e + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x20004276 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDIRFILT = 0x8004427d + BIOCSDLT = 0x8004427a + BIOCSETF = 0x80084267 + BIOCSETIF = 0x8020426c + BIOCSETWF = 0x80084277 + BIOCSFILDROP = 0x80044279 + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044272 + BIOCSRTIMEOUT = 0x800c426d + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIRECTION_IN = 0x1 + BPF_DIRECTION_OUT = 0x2 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x200000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CREAD = 0x800 + CRTSCTS = 0x10000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0xff + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DIOCOSFPFLUSH = 0x2000444e + DLT_ARCNET = 0x7 + DLT_ATM_RFC1483 = 0xb + DLT_AX25 = 0x3 + DLT_CHAOS = 0x5 + DLT_C_HDLC = 0x68 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0xd + DLT_FDDI = 0xa + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_LOOP = 0xc + DLT_MPLS = 0xdb + DLT_NULL = 0x0 + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_SERIAL = 0x32 + DLT_PRONET = 0x4 + DLT_RAW = 0xe + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EMT_TAGOVF = 0x1 + EMUL_ENABLED = 0x1 + EMUL_NATIVE = 0x2 + ENDRUNDISC = 0x9 + ETHERMIN = 0x2e + ETHERMTU = 0x5dc + ETHERTYPE_8023 = 0x4 + ETHERTYPE_AARP = 0x80f3 + ETHERTYPE_ACCTON = 0x8390 + ETHERTYPE_AEONIC = 0x8036 + ETHERTYPE_ALPHA = 0x814a + ETHERTYPE_AMBER = 0x6008 + ETHERTYPE_AMOEBA = 0x8145 + ETHERTYPE_AOE = 0x88a2 + ETHERTYPE_APOLLO = 0x80f7 + ETHERTYPE_APOLLODOMAIN = 0x8019 + ETHERTYPE_APPLETALK = 0x809b + ETHERTYPE_APPLITEK = 0x80c7 + ETHERTYPE_ARGONAUT = 0x803a + ETHERTYPE_ARP = 0x806 + ETHERTYPE_AT = 0x809b + ETHERTYPE_ATALK = 0x809b + ETHERTYPE_ATOMIC = 0x86df + ETHERTYPE_ATT = 0x8069 + ETHERTYPE_ATTSTANFORD = 0x8008 + ETHERTYPE_AUTOPHON = 0x806a + ETHERTYPE_AXIS = 0x8856 + ETHERTYPE_BCLOOP = 0x9003 + ETHERTYPE_BOFL = 0x8102 + ETHERTYPE_CABLETRON = 0x7034 + ETHERTYPE_CHAOS = 0x804 + ETHERTYPE_COMDESIGN = 0x806c + ETHERTYPE_COMPUGRAPHIC = 0x806d + ETHERTYPE_COUNTERPOINT = 0x8062 + ETHERTYPE_CRONUS = 0x8004 + ETHERTYPE_CRONUSVLN = 0x8003 + ETHERTYPE_DCA = 0x1234 + ETHERTYPE_DDE = 0x807b + ETHERTYPE_DEBNI = 0xaaaa + ETHERTYPE_DECAM = 0x8048 + ETHERTYPE_DECCUST = 0x6006 + ETHERTYPE_DECDIAG = 0x6005 + ETHERTYPE_DECDNS = 0x803c + ETHERTYPE_DECDTS = 0x803e + ETHERTYPE_DECEXPER = 0x6000 + ETHERTYPE_DECLAST = 0x8041 + ETHERTYPE_DECLTM = 0x803f + ETHERTYPE_DECMUMPS = 0x6009 + ETHERTYPE_DECNETBIOS = 0x8040 + ETHERTYPE_DELTACON = 0x86de + ETHERTYPE_DIDDLE = 0x4321 + ETHERTYPE_DLOG1 = 0x660 + ETHERTYPE_DLOG2 = 0x661 + ETHERTYPE_DN = 0x6003 + ETHERTYPE_DOGFIGHT = 0x1989 + ETHERTYPE_DSMD = 0x8039 + ETHERTYPE_ECMA = 0x803 + ETHERTYPE_ENCRYPT = 0x803d + ETHERTYPE_ES = 0x805d + ETHERTYPE_EXCELAN = 0x8010 + ETHERTYPE_EXPERDATA = 0x8049 + ETHERTYPE_FLIP = 0x8146 + ETHERTYPE_FLOWCONTROL = 0x8808 + ETHERTYPE_FRARP = 0x808 + ETHERTYPE_GENDYN = 0x8068 + ETHERTYPE_HAYES = 0x8130 + ETHERTYPE_HIPPI_FP = 0x8180 + ETHERTYPE_HITACHI = 0x8820 + ETHERTYPE_HP = 0x8005 + ETHERTYPE_IEEEPUP = 0xa00 + ETHERTYPE_IEEEPUPAT = 0xa01 + ETHERTYPE_IMLBL = 0x4c42 + ETHERTYPE_IMLBLDIAG = 0x424c + ETHERTYPE_IP = 0x800 + ETHERTYPE_IPAS = 0x876c + ETHERTYPE_IPV6 = 0x86dd + ETHERTYPE_IPX = 0x8137 + ETHERTYPE_IPXNEW = 0x8037 + ETHERTYPE_KALPANA = 0x8582 + ETHERTYPE_LANBRIDGE = 0x8038 + ETHERTYPE_LANPROBE = 0x8888 + ETHERTYPE_LAT = 0x6004 + ETHERTYPE_LBACK = 0x9000 + ETHERTYPE_LITTLE = 0x8060 + ETHERTYPE_LLDP = 0x88cc + ETHERTYPE_LOGICRAFT = 0x8148 + ETHERTYPE_LOOPBACK = 0x9000 + ETHERTYPE_MATRA = 0x807a + ETHERTYPE_MAX = 0xffff + ETHERTYPE_MERIT = 0x807c + ETHERTYPE_MICP = 0x873a + ETHERTYPE_MOPDL = 0x6001 + ETHERTYPE_MOPRC = 0x6002 + ETHERTYPE_MOTOROLA = 0x818d + ETHERTYPE_MPLS = 0x8847 + ETHERTYPE_MPLS_MCAST = 0x8848 + ETHERTYPE_MUMPS = 0x813f + ETHERTYPE_NBPCC = 0x3c04 + ETHERTYPE_NBPCLAIM = 0x3c09 + ETHERTYPE_NBPCLREQ = 0x3c05 + ETHERTYPE_NBPCLRSP = 0x3c06 + ETHERTYPE_NBPCREQ = 0x3c02 + ETHERTYPE_NBPCRSP = 0x3c03 + ETHERTYPE_NBPDG = 0x3c07 + ETHERTYPE_NBPDGB = 0x3c08 + ETHERTYPE_NBPDLTE = 0x3c0a + ETHERTYPE_NBPRAR = 0x3c0c + ETHERTYPE_NBPRAS = 0x3c0b + ETHERTYPE_NBPRST = 0x3c0d + ETHERTYPE_NBPSCD = 0x3c01 + ETHERTYPE_NBPVCD = 0x3c00 + ETHERTYPE_NBS = 0x802 + ETHERTYPE_NCD = 0x8149 + ETHERTYPE_NESTAR = 0x8006 + ETHERTYPE_NETBEUI = 0x8191 + ETHERTYPE_NOVELL = 0x8138 + ETHERTYPE_NS = 0x600 + ETHERTYPE_NSAT = 0x601 + ETHERTYPE_NSCOMPAT = 0x807 + ETHERTYPE_NTRAILER = 0x10 + ETHERTYPE_OS9 = 0x7007 + ETHERTYPE_OS9NET = 0x7009 + ETHERTYPE_PACER = 0x80c6 + ETHERTYPE_PAE = 0x888e + ETHERTYPE_PCS = 0x4242 + ETHERTYPE_PLANNING = 0x8044 + ETHERTYPE_PPP = 0x880b + ETHERTYPE_PPPOE = 0x8864 + ETHERTYPE_PPPOEDISC = 0x8863 + ETHERTYPE_PRIMENTS = 0x7031 + ETHERTYPE_PUP = 0x200 + ETHERTYPE_PUPAT = 0x200 + ETHERTYPE_QINQ = 0x88a8 + ETHERTYPE_RACAL = 0x7030 + ETHERTYPE_RATIONAL = 0x8150 + ETHERTYPE_RAWFR = 0x6559 + ETHERTYPE_RCL = 0x1995 + ETHERTYPE_RDP = 0x8739 + ETHERTYPE_RETIX = 0x80f2 + ETHERTYPE_REVARP = 0x8035 + ETHERTYPE_SCA = 0x6007 + ETHERTYPE_SECTRA = 0x86db + ETHERTYPE_SECUREDATA = 0x876d + ETHERTYPE_SGITW = 0x817e + ETHERTYPE_SG_BOUNCE = 0x8016 + ETHERTYPE_SG_DIAG = 0x8013 + ETHERTYPE_SG_NETGAMES = 0x8014 + ETHERTYPE_SG_RESV = 0x8015 + ETHERTYPE_SIMNET = 0x5208 + ETHERTYPE_SLOW = 0x8809 + ETHERTYPE_SNA = 0x80d5 + ETHERTYPE_SNMP = 0x814c + ETHERTYPE_SONIX = 0xfaf5 + ETHERTYPE_SPIDER = 0x809f + ETHERTYPE_SPRITE = 0x500 + ETHERTYPE_STP = 0x8181 + ETHERTYPE_TALARIS = 0x812b + ETHERTYPE_TALARISMC = 0x852b + ETHERTYPE_TCPCOMP = 0x876b + ETHERTYPE_TCPSM = 0x9002 + ETHERTYPE_TEC = 0x814f + ETHERTYPE_TIGAN = 0x802f + ETHERTYPE_TRAIL = 0x1000 + ETHERTYPE_TRANSETHER = 0x6558 + ETHERTYPE_TYMSHARE = 0x802e + ETHERTYPE_UBBST = 0x7005 + ETHERTYPE_UBDEBUG = 0x900 + ETHERTYPE_UBDIAGLOOP = 0x7002 + ETHERTYPE_UBDL = 0x7000 + ETHERTYPE_UBNIU = 0x7001 + ETHERTYPE_UBNMC = 0x7003 + ETHERTYPE_VALID = 0x1600 + ETHERTYPE_VARIAN = 0x80dd + ETHERTYPE_VAXELN = 0x803b + ETHERTYPE_VEECO = 0x8067 + ETHERTYPE_VEXP = 0x805b + ETHERTYPE_VGLAB = 0x8131 + ETHERTYPE_VINES = 0xbad + ETHERTYPE_VINESECHO = 0xbaf + ETHERTYPE_VINESLOOP = 0xbae + ETHERTYPE_VITAL = 0xff00 + ETHERTYPE_VLAN = 0x8100 + ETHERTYPE_VLTLMAN = 0x8080 + ETHERTYPE_VPROD = 0x805c + ETHERTYPE_VURESERVED = 0x8147 + ETHERTYPE_WATERLOO = 0x8130 + ETHERTYPE_WELLFLEET = 0x8103 + ETHERTYPE_X25 = 0x805 + ETHERTYPE_X75 = 0x801 + ETHERTYPE_XNSSM = 0x9001 + ETHERTYPE_XTP = 0x817d + ETHER_ADDR_LEN = 0x6 + ETHER_ALIGN = 0x2 + ETHER_CRC_LEN = 0x4 + ETHER_CRC_POLY_BE = 0x4c11db6 + ETHER_CRC_POLY_LE = 0xedb88320 + ETHER_HDR_LEN = 0xe + ETHER_MAX_DIX_LEN = 0x600 + ETHER_MAX_LEN = 0x5ee + ETHER_MIN_LEN = 0x40 + ETHER_TYPE_LEN = 0x2 + ETHER_VLAN_ENCAP_LEN = 0x4 + EVFILT_AIO = -0x3 + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0x7 + EVFILT_TIMER = -0x7 + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0xa + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETOWN = 0x5 + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFA_ROUTE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x8e52 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BLUETOOTH = 0xf8 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf7 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DUMMY = 0xf1 + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ECONET = 0xce + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf3 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INFINIBAND = 0xc7 + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LINEGROUP = 0xd2 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf5 + IFT_PFLOW = 0xf9 + IFT_PFSYNC = 0xf6 + IFT_PLC = 0xae + IFT_PON155 = 0xcf + IFT_PON622 = 0xd0 + IFT_POS = 0xab + IFT_PPP = 0x17 + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPATM = 0xc5 + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf2 + IFT_Q2931 = 0xc9 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SIPSIG = 0xcc + IFT_SIPTG = 0xcb + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TELINK = 0xc8 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VIRTUALTG = 0xca + IFT_VOICEDID = 0xd5 + IFT_VOICEEM = 0x64 + IFT_VOICEEMFGD = 0xd3 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFGDEANA = 0xd4 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERCABLE = 0xc6 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IN_RFC3021_HOST = 0x1 + IN_RFC3021_NET = 0xfffffffe + IN_RFC3021_NSHIFT = 0x1f + IPPROTO_AH = 0x33 + IPPROTO_CARP = 0x70 + IPPROTO_DIVERT = 0x102 + IPPROTO_DIVERT_INIT = 0x2 + IPPROTO_DIVERT_RESP = 0x1 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPIP = 0x4 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x103 + IPPROTO_MOBILE = 0x37 + IPPROTO_MPLS = 0x89 + IPPROTO_NONE = 0x3b + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPV6_AUTH_LEVEL = 0x35 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_ESP_NETWORK_LEVEL = 0x37 + IPV6_ESP_TRANS_LEVEL = 0x36 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPCOMP_LEVEL = 0x3c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXPACKET = 0xffff + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_OPTIONS = 0x1 + IPV6_PATHMTU = 0x2c + IPV6_PIPEX = 0x3f + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVDSTPORT = 0x40 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTABLE = 0x1021 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_AUTH_LEVEL = 0x14 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DIVERTFL = 0x1022 + IP_DROP_MEMBERSHIP = 0xd + IP_ESP_NETWORK_LEVEL = 0x16 + IP_ESP_TRANS_LEVEL = 0x15 + IP_HDRINCL = 0x2 + IP_IPCOMP_LEVEL = 0x1d + IP_IPSECFLOWINFO = 0x24 + IP_IPSEC_LOCAL_AUTH = 0x1b + IP_IPSEC_LOCAL_CRED = 0x19 + IP_IPSEC_LOCAL_ID = 0x17 + IP_IPSEC_REMOTE_AUTH = 0x1c + IP_IPSEC_REMOTE_CRED = 0x1a + IP_IPSEC_REMOTE_ID = 0x18 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0xfff + IP_MF = 0x2000 + IP_MINTTL = 0x20 + IP_MIN_MEMBERSHIPS = 0xf + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x1 + IP_PIPEX = 0x22 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVDSTPORT = 0x21 + IP_RECVIF = 0x1e + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVRTABLE = 0x23 + IP_RECVTTL = 0x1f + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RTABLE = 0x1021 + IP_TOS = 0x3 + IP_TTL = 0x4 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LCNT_OVERLOAD_FLUSH = 0x6 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x6 + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_SPACEAVAIL = 0x5 + MADV_WILLNEED = 0x3 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FLAGMASK = 0x3ff7 + MAP_HASSEMAPHORE = 0x0 + MAP_INHERIT = 0x0 + MAP_INHERIT_COPY = 0x1 + MAP_INHERIT_NONE = 0x2 + MAP_INHERIT_SHARE = 0x0 + MAP_INHERIT_ZERO = 0x3 + MAP_NOEXTEND = 0x0 + MAP_NORESERVE = 0x0 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x0 + MAP_SHARED = 0x1 + MAP_TRYFIXED = 0x0 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MSG_BCAST = 0x100 + MSG_CMSG_CLOEXEC = 0x800 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOR = 0x8 + MSG_MCAST = 0x200 + MSG_NOSIGNAL = 0x400 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x4 + MS_SYNC = 0x2 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_MAXID = 0x6 + NET_RT_STATS = 0x4 + NET_RT_TABLE = 0x5 + NOFLSH = 0x80000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + NOTE_EOF = 0x2 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRUNCATE = 0x80 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + ONLCR = 0x2 + ONLRET = 0x80 + ONOCR = 0x40 + ONOEOT = 0x8 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x10000 + O_CREAT = 0x200 + O_DIRECTORY = 0x20000 + O_DSYNC = 0x80 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x80 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PF_FLUSH = 0x1 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x8 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_LABEL = 0xa + RTAX_MAX = 0xb + RTAX_NETMASK = 0x2 + RTAX_SRC = 0x8 + RTAX_SRCMASK = 0x9 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_LABEL = 0x400 + RTA_NETMASK = 0x4 + RTA_SRC = 0x100 + RTA_SRCMASK = 0x200 + RTF_ANNOUNCE = 0x4000 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_CLONED = 0x10000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_FMASK = 0x70f808 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MASK = 0x80 + RTF_MODIFIED = 0x20 + RTF_MPATH = 0x40000 + RTF_MPLS = 0x100000 + RTF_PERMANENT_ARP = 0x2000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x2000 + RTF_REJECT = 0x8 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_USETRAILERS = 0x8000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DESYNC = 0x10 + RTM_GET = 0x4 + RTM_IFANNOUNCE = 0xf + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MAXSIZE = 0x800 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RT_TABLEID_MAX = 0xff + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x4 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCAIFGROUP = 0x80246987 + SIOCALIFADDR = 0x8218691c + SIOCATMARK = 0x40047307 + SIOCBRDGADD = 0x8054693c + SIOCBRDGADDS = 0x80546941 + SIOCBRDGARL = 0x806e694d + SIOCBRDGDADDR = 0x81286947 + SIOCBRDGDEL = 0x8054693d + SIOCBRDGDELS = 0x80546942 + SIOCBRDGFLUSH = 0x80546948 + SIOCBRDGFRL = 0x806e694e + SIOCBRDGGCACHE = 0xc0146941 + SIOCBRDGGFD = 0xc0146952 + SIOCBRDGGHT = 0xc0146951 + SIOCBRDGGIFFLGS = 0xc054693e + SIOCBRDGGMA = 0xc0146953 + SIOCBRDGGPARAM = 0xc03c6958 + SIOCBRDGGPRI = 0xc0146950 + SIOCBRDGGRL = 0xc028694f + SIOCBRDGGSIFS = 0xc054693c + SIOCBRDGGTO = 0xc0146946 + SIOCBRDGIFS = 0xc0546942 + SIOCBRDGRTS = 0xc0186943 + SIOCBRDGSADDR = 0xc1286944 + SIOCBRDGSCACHE = 0x80146940 + SIOCBRDGSFD = 0x80146952 + SIOCBRDGSHT = 0x80146951 + SIOCBRDGSIFCOST = 0x80546955 + SIOCBRDGSIFFLGS = 0x8054693f + SIOCBRDGSIFPRIO = 0x80546954 + SIOCBRDGSMA = 0x80146953 + SIOCBRDGSPRI = 0x80146950 + SIOCBRDGSPROTO = 0x8014695a + SIOCBRDGSTO = 0x80146945 + SIOCBRDGSTXHC = 0x80146959 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFGROUP = 0x80246989 + SIOCDIFPHYADDR = 0x80206949 + SIOCDLIFADDR = 0x8218691e + SIOCGETKALIVE = 0xc01869a4 + SIOCGETLABEL = 0x8020699a + SIOCGETPFLOW = 0xc02069fe + SIOCGETPFSYNC = 0xc02069f8 + SIOCGETSGCNT = 0xc0147534 + SIOCGETVIFCNT = 0xc0147533 + SIOCGETVLAN = 0xc0206990 + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFASYNCMAP = 0xc020697c + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCONF = 0xc0086924 + SIOCGIFDATA = 0xc020691b + SIOCGIFDESCR = 0xc0206981 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGATTR = 0xc024698b + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc024698a + SIOCGIFGROUP = 0xc0246988 + SIOCGIFHARDMTU = 0xc02069a5 + SIOCGIFMEDIA = 0xc0286936 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc020697e + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206948 + SIOCGIFPRIORITY = 0xc020699c + SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFRDOMAIN = 0xc02069a0 + SIOCGIFRTLABEL = 0xc0206983 + SIOCGIFRXR = 0x802069aa + SIOCGIFTIMESLOT = 0xc0206986 + SIOCGIFXFLAGS = 0xc020699e + SIOCGLIFADDR = 0xc218691d + SIOCGLIFPHYADDR = 0xc218694b + SIOCGLIFPHYRTABLE = 0xc02069a2 + SIOCGLIFPHYTTL = 0xc02069a9 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGSPPPPARAMS = 0xc0206994 + SIOCGVH = 0xc02069f6 + SIOCGVNETID = 0xc02069a7 + SIOCIFCREATE = 0x8020697a + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc00c6978 + SIOCSETKALIVE = 0x801869a3 + SIOCSETLABEL = 0x80206999 + SIOCSETPFLOW = 0x802069fd + SIOCSETPFSYNC = 0x802069f7 + SIOCSETVLAN = 0x8020698f + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFASYNCMAP = 0x8020697d + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFDESCR = 0x80206980 + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGATTR = 0x8024698c + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020691f + SIOCSIFMEDIA = 0xc0206935 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x8020697f + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSIFPRIORITY = 0x8020699b + SIOCSIFRDOMAIN = 0x8020699f + SIOCSIFRTLABEL = 0x80206982 + SIOCSIFTIMESLOT = 0x80206985 + SIOCSIFXFLAGS = 0x8020699d + SIOCSLIFPHYADDR = 0x8218694a + SIOCSLIFPHYRTABLE = 0x802069a1 + SIOCSLIFPHYTTL = 0x802069a8 + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSSPPPPARAMS = 0x80206993 + SIOCSVH = 0xc02069f5 + SIOCSVNETID = 0x802069a6 + SOCK_CLOEXEC = 0x8000 + SOCK_DGRAM = 0x2 + SOCK_NONBLOCK = 0x4000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_BINDANY = 0x1000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_NETPROC = 0x1020 + SO_OOBINLINE = 0x100 + SO_PEERCRED = 0x1022 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RTABLE = 0x1021 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_SPLICE = 0x1023 + SO_TIMESTAMP = 0x800 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + TCIFLUSH = 0x1 + TCIOFLUSH = 0x3 + TCOFLUSH = 0x2 + TCP_MAXBURST = 0x4 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x3 + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x4 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOPUSH = 0x10 + TCP_NSTATES = 0xb + TCP_SACK_ENABLE = 0x8 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLAG_CLOCAL = 0x2 + TIOCFLAG_CRTSCTS = 0x4 + TIOCFLAG_MDMBUF = 0x8 + TIOCFLAG_PPS = 0x10 + TIOCFLAG_SOFTCAR = 0x1 + TIOCFLUSH = 0x80047410 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGFLAGS = 0x4004745d + TIOCGPGRP = 0x40047477 + TIOCGSID = 0x40047463 + TIOCGTSTAMP = 0x400c745b + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGET = 0x4004746a + TIOCMODG = 0x4004746a + TIOCMODS = 0x8004746d + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSFLAGS = 0x8004745c + TIOCSIG = 0x8004745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x80047465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSTSTAMP = 0x8008745a + TIOCSWINSZ = 0x80087467 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WALTSIG = 0x4 + WCONTINUED = 0x8 + WCOREFLAG = 0x80 + WNOHANG = 0x1 + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x58) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x59) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EIPSEC = syscall.Errno(0x52) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x5b) + ELOOP = syscall.Errno(0x3e) + EMEDIUMTYPE = syscall.Errno(0x56) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x53) + ENOBUFS = syscall.Errno(0x37) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOMEDIUM = syscall.Errno(0x55) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x5a) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x5b) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x57) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHR = syscall.Signal(0x20) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "device not configured"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EDEADLK", "resource deadlock avoided"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "cross-device link"}, + {19, "ENODEV", "operation not supported by device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "result too large"}, + {35, "EWOULDBLOCK", "resource temporarily unavailable"}, + {36, "EINPROGRESS", "operation now in progress"}, + {37, "EALREADY", "operation already in progress"}, + {38, "ENOTSOCK", "socket operation on non-socket"}, + {39, "EDESTADDRREQ", "destination address required"}, + {40, "EMSGSIZE", "message too long"}, + {41, "EPROTOTYPE", "protocol wrong type for socket"}, + {42, "ENOPROTOOPT", "protocol not available"}, + {43, "EPROTONOSUPPORT", "protocol not supported"}, + {44, "ESOCKTNOSUPPORT", "socket type not supported"}, + {45, "EOPNOTSUPP", "operation not supported"}, + {46, "EPFNOSUPPORT", "protocol family not supported"}, + {47, "EAFNOSUPPORT", "address family not supported by protocol family"}, + {48, "EADDRINUSE", "address already in use"}, + {49, "EADDRNOTAVAIL", "can't assign requested address"}, + {50, "ENETDOWN", "network is down"}, + {51, "ENETUNREACH", "network is unreachable"}, + {52, "ENETRESET", "network dropped connection on reset"}, + {53, "ECONNABORTED", "software caused connection abort"}, + {54, "ECONNRESET", "connection reset by peer"}, + {55, "ENOBUFS", "no buffer space available"}, + {56, "EISCONN", "socket is already connected"}, + {57, "ENOTCONN", "socket is not connected"}, + {58, "ESHUTDOWN", "can't send after socket shutdown"}, + {59, "ETOOMANYREFS", "too many references: can't splice"}, + {60, "ETIMEDOUT", "operation timed out"}, + {61, "ECONNREFUSED", "connection refused"}, + {62, "ELOOP", "too many levels of symbolic links"}, + {63, "ENAMETOOLONG", "file name too long"}, + {64, "EHOSTDOWN", "host is down"}, + {65, "EHOSTUNREACH", "no route to host"}, + {66, "ENOTEMPTY", "directory not empty"}, + {67, "EPROCLIM", "too many processes"}, + {68, "EUSERS", "too many users"}, + {69, "EDQUOT", "disk quota exceeded"}, + {70, "ESTALE", "stale NFS file handle"}, + {71, "EREMOTE", "too many levels of remote in path"}, + {72, "EBADRPC", "RPC struct is bad"}, + {73, "ERPCMISMATCH", "RPC version wrong"}, + {74, "EPROGUNAVAIL", "RPC program not available"}, + {75, "EPROGMISMATCH", "program version wrong"}, + {76, "EPROCUNAVAIL", "bad procedure for program"}, + {77, "ENOLCK", "no locks available"}, + {78, "ENOSYS", "function not implemented"}, + {79, "EFTYPE", "inappropriate file type or format"}, + {80, "EAUTH", "authentication error"}, + {81, "ENEEDAUTH", "need authenticator"}, + {82, "EIPSEC", "IPsec processing failure"}, + {83, "ENOATTR", "attribute not found"}, + {84, "EILSEQ", "illegal byte sequence"}, + {85, "ENOMEDIUM", "no medium found"}, + {86, "EMEDIUMTYPE", "wrong medium type"}, + {87, "EOVERFLOW", "value too large to be stored in data type"}, + {88, "ECANCELED", "operation canceled"}, + {89, "EIDRM", "identifier removed"}, + {90, "ENOMSG", "no message of desired type"}, + {91, "ELAST", "not supported"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/BPT trap"}, + {6, "SIGABRT", "abort trap"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGURG", "urgent I/O condition"}, + {17, "SIGSTOP", "suspended (signal)"}, + {18, "SIGTSTP", "suspended"}, + {19, "SIGCONT", "continued"}, + {20, "SIGCHLD", "child exited"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGIO", "I/O possible"}, + {24, "SIGXCPU", "cputime limit exceeded"}, + {25, "SIGXFSZ", "filesize limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window size changes"}, + {29, "SIGINFO", "information request"}, + {30, "SIGUSR1", "user defined signal 1"}, + {31, "SIGUSR2", "user defined signal 2"}, + {32, "SIGTHR", "thread AST"}, +} diff --git a/api/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go b/api/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go new file mode 100644 index 0000000..be42830 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go @@ -0,0 +1,1497 @@ +// mkerrors.sh -m64 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,solaris + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_802 = 0x12 + AF_APPLETALK = 0x10 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_ECMA = 0x8 + AF_FILE = 0x1 + AF_GOSIP = 0x16 + AF_HYLINK = 0xf + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1a + AF_INET_OFFLOAD = 0x1e + AF_IPX = 0x17 + AF_KEY = 0x1b + AF_LAT = 0xe + AF_LINK = 0x19 + AF_LOCAL = 0x1 + AF_MAX = 0x20 + AF_NBS = 0x7 + AF_NCA = 0x1c + AF_NIT = 0x11 + AF_NS = 0x6 + AF_OSI = 0x13 + AF_OSINET = 0x15 + AF_PACKET = 0x20 + AF_POLICY = 0x1d + AF_PUP = 0x4 + AF_ROUTE = 0x18 + AF_SNA = 0xb + AF_TRILL = 0x1f + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_X25 = 0x14 + ARPHRD_ARCNET = 0x7 + ARPHRD_ATM = 0x10 + ARPHRD_AX25 = 0x3 + ARPHRD_CHAOS = 0x5 + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_FC = 0x12 + ARPHRD_FRAME = 0xf + ARPHRD_HDLC = 0x11 + ARPHRD_IB = 0x20 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IPATM = 0x13 + ARPHRD_METRICOM = 0x17 + ARPHRD_TUNNEL = 0x1f + B0 = 0x0 + B110 = 0x3 + B115200 = 0x12 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B153600 = 0x13 + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B230400 = 0x14 + B2400 = 0xb + B300 = 0x7 + B307200 = 0x15 + B38400 = 0xf + B460800 = 0x16 + B4800 = 0xc + B50 = 0x1 + B57600 = 0x10 + B600 = 0x8 + B75 = 0x2 + B76800 = 0x11 + B921600 = 0x17 + B9600 = 0xd + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = -0x3fefbd89 + BIOCGDLTLIST32 = -0x3ff7bd89 + BIOCGETIF = 0x4020426b + BIOCGETLIF = 0x4078426b + BIOCGHDRCMPLT = 0x40044274 + BIOCGRTIMEOUT = 0x4010427b + BIOCGRTIMEOUT32 = 0x4008427b + BIOCGSEESENT = 0x40044278 + BIOCGSTATS = 0x4080426f + BIOCGSTATSOLD = 0x4008426f + BIOCIMMEDIATE = -0x7ffbbd90 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = -0x3ffbbd9a + BIOCSDLT = -0x7ffbbd8a + BIOCSETF = -0x7fefbd99 + BIOCSETF32 = -0x7ff7bd99 + BIOCSETIF = -0x7fdfbd94 + BIOCSETLIF = -0x7f87bd94 + BIOCSHDRCMPLT = -0x7ffbbd8b + BIOCSRTIMEOUT = -0x7fefbd86 + BIOCSRTIMEOUT32 = -0x7ff7bd86 + BIOCSSEESENT = -0x7ffbbd87 + BIOCSTCPF = -0x7fefbd8e + BIOCSUDPF = -0x7fefbd8d + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DFLTBUFSIZE = 0x100000 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x1000000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CBAUD = 0xf + CFLUSH = 0xf + CIBAUD = 0xf0000 + CLOCAL = 0x800 + CLOCK_HIGHRES = 0x4 + CLOCK_LEVEL = 0xa + CLOCK_MONOTONIC = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x5 + CLOCK_PROF = 0x2 + CLOCK_REALTIME = 0x3 + CLOCK_THREAD_CPUTIME_ID = 0x2 + CLOCK_VIRTUAL = 0x1 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + CSWTCH = 0x1a + DLT_AIRONET_HEADER = 0x78 + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_BACNET_MS_TP = 0xa5 + DLT_CHAOS = 0x5 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_DOCSIS = 0x8f + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FDDI = 0xa + DLT_FRELAY = 0x6b + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_HDLC = 0x10 + DLT_HHDLC = 0x79 + DLT_HIPPI = 0xf + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xa2 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0xe + DLT_PPP_PPPD = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAW = 0xc + DLT_RAWAF_MASK = 0x2240000 + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xd + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + EMPTY_SET = 0x0 + EMT_CPCOVF = 0x1 + EQUALITY_CHECK = 0x0 + EXTA = 0xe + EXTB = 0xf + FD_CLOEXEC = 0x1 + FD_NFDBITS = 0x40 + FD_SETSIZE = 0x10000 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHALL = 0x1 + FLUSHDATA = 0x0 + FLUSHO = 0x2000 + F_ALLOCSP = 0xa + F_ALLOCSP64 = 0xa + F_BADFD = 0x2e + F_BLKSIZE = 0x13 + F_BLOCKS = 0x12 + F_CHKFL = 0x8 + F_COMPAT = 0x8 + F_DUP2FD = 0x9 + F_DUP2FD_CLOEXEC = 0x24 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x25 + F_FLOCK = 0x35 + F_FLOCK64 = 0x35 + F_FLOCKW = 0x36 + F_FLOCKW64 = 0x36 + F_FREESP = 0xb + F_FREESP64 = 0xb + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0xe + F_GETLK64 = 0xe + F_GETOWN = 0x17 + F_GETXFL = 0x2d + F_HASREMOTELOCKS = 0x1a + F_ISSTREAM = 0xd + F_MANDDNY = 0x10 + F_MDACC = 0x20 + F_NODNY = 0x0 + F_NPRIV = 0x10 + F_OFD_GETLK = 0x2f + F_OFD_GETLK64 = 0x2f + F_OFD_SETLK = 0x30 + F_OFD_SETLK64 = 0x30 + F_OFD_SETLKW = 0x31 + F_OFD_SETLKW64 = 0x31 + F_PRIV = 0xf + F_QUOTACTL = 0x11 + F_RDACC = 0x1 + F_RDDNY = 0x1 + F_RDLCK = 0x1 + F_REVOKE = 0x19 + F_RMACC = 0x4 + F_RMDNY = 0x4 + F_RWACC = 0x3 + F_RWDNY = 0x3 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLK64_NBMAND = 0x2a + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETLK_NBMAND = 0x2a + F_SETOWN = 0x18 + F_SHARE = 0x28 + F_SHARE_NBMAND = 0x2b + F_UNLCK = 0x3 + F_UNLKSYS = 0x4 + F_UNSHARE = 0x29 + F_WRACC = 0x2 + F_WRDNY = 0x2 + F_WRLCK = 0x2 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFF_ADDRCONF = 0x80000 + IFF_ALLMULTI = 0x200 + IFF_ANYCAST = 0x400000 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x7f203003b5a + IFF_COS_ENABLED = 0x200000000 + IFF_DEBUG = 0x4 + IFF_DEPRECATED = 0x40000 + IFF_DHCPRUNNING = 0x4000 + IFF_DUPLICATE = 0x4000000000 + IFF_FAILED = 0x10000000 + IFF_FIXEDMTU = 0x1000000000 + IFF_INACTIVE = 0x40000000 + IFF_INTELLIGENT = 0x400 + IFF_IPMP = 0x8000000000 + IFF_IPMP_CANTCHANGE = 0x10000000 + IFF_IPMP_INVALID = 0x1ec200080 + IFF_IPV4 = 0x1000000 + IFF_IPV6 = 0x2000000 + IFF_L3PROTECT = 0x40000000000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x800 + IFF_MULTI_BCAST = 0x1000 + IFF_NOACCEPT = 0x4000000 + IFF_NOARP = 0x80 + IFF_NOFAILOVER = 0x8000000 + IFF_NOLINKLOCAL = 0x20000000000 + IFF_NOLOCAL = 0x20000 + IFF_NONUD = 0x200000 + IFF_NORTEXCH = 0x800000 + IFF_NOTRAILERS = 0x20 + IFF_NOXMIT = 0x10000 + IFF_OFFLINE = 0x80000000 + IFF_POINTOPOINT = 0x10 + IFF_PREFERRED = 0x400000000 + IFF_PRIVATE = 0x8000 + IFF_PROMISC = 0x100 + IFF_ROUTER = 0x100000 + IFF_RUNNING = 0x40 + IFF_STANDBY = 0x20000000 + IFF_TEMPORARY = 0x800000000 + IFF_UNNUMBERED = 0x2000 + IFF_UP = 0x1 + IFF_VIRTUAL = 0x2000000000 + IFF_VRRP = 0x10000000000 + IFF_XRESOLV = 0x100000000 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_6TO4 = 0xca + IFT_AAL5 = 0x31 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ATM = 0x25 + IFT_CEPT = 0x13 + IFT_DS3 = 0x1e + IFT_EON = 0x19 + IFT_ETHER = 0x6 + IFT_FDDI = 0xf + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_HDH1822 = 0x3 + IFT_HIPPI = 0x2f + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IB = 0xc7 + IFT_IPV4 = 0xc8 + IFT_IPV6 = 0xc9 + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88026 = 0xa + IFT_LAPB = 0x10 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_NSIP = 0x1b + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PPP = 0x17 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PTPSERIAL = 0x16 + IFT_RS232 = 0x21 + IFT_SDLC = 0x11 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_STARLAN = 0xb + IFT_T1 = 0x12 + IFT_ULTRA = 0x1d + IFT_V35 = 0x2d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_AUTOCONF_MASK = 0xffff0000 + IN_AUTOCONF_NET = 0xa9fe0000 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_CLASSE_NET = 0xffffffff + IN_LOOPBACKNET = 0x7f + IN_PRIVATE12_MASK = 0xfff00000 + IN_PRIVATE12_NET = 0xac100000 + IN_PRIVATE16_MASK = 0xffff0000 + IN_PRIVATE16_NET = 0xc0a80000 + IN_PRIVATE8_MASK = 0xff000000 + IN_PRIVATE8_NET = 0xa000000 + IPPROTO_AH = 0x33 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x4 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_HELLO = 0x3f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPV6 = 0x29 + IPPROTO_MAX = 0x100 + IPPROTO_ND = 0x4d + IPPROTO_NONE = 0x3b + IPPROTO_OSPF = 0x59 + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_UDP = 0x11 + IPV6_ADD_MEMBERSHIP = 0x9 + IPV6_BOUND_IF = 0x41 + IPV6_CHECKSUM = 0x18 + IPV6_DONTFRAG = 0x21 + IPV6_DROP_MEMBERSHIP = 0xa + IPV6_DSTOPTS = 0xf + IPV6_FLOWINFO_FLOWLABEL = 0xffff0f00 + IPV6_FLOWINFO_TCLASS = 0xf00f + IPV6_HOPLIMIT = 0xc + IPV6_HOPOPTS = 0xe + IPV6_JOIN_GROUP = 0x9 + IPV6_LEAVE_GROUP = 0xa + IPV6_MULTICAST_HOPS = 0x7 + IPV6_MULTICAST_IF = 0x6 + IPV6_MULTICAST_LOOP = 0x8 + IPV6_NEXTHOP = 0xd + IPV6_PAD1_OPT = 0x0 + IPV6_PATHMTU = 0x25 + IPV6_PKTINFO = 0xb + IPV6_PREFER_SRC_CGA = 0x20 + IPV6_PREFER_SRC_CGADEFAULT = 0x10 + IPV6_PREFER_SRC_CGAMASK = 0x30 + IPV6_PREFER_SRC_COA = 0x2 + IPV6_PREFER_SRC_DEFAULT = 0x15 + IPV6_PREFER_SRC_HOME = 0x1 + IPV6_PREFER_SRC_MASK = 0x3f + IPV6_PREFER_SRC_MIPDEFAULT = 0x1 + IPV6_PREFER_SRC_MIPMASK = 0x3 + IPV6_PREFER_SRC_NONCGA = 0x10 + IPV6_PREFER_SRC_PUBLIC = 0x4 + IPV6_PREFER_SRC_TMP = 0x8 + IPV6_PREFER_SRC_TMPDEFAULT = 0x4 + IPV6_PREFER_SRC_TMPMASK = 0xc + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVHOPLIMIT = 0x13 + IPV6_RECVHOPOPTS = 0x14 + IPV6_RECVPATHMTU = 0x24 + IPV6_RECVPKTINFO = 0x12 + IPV6_RECVRTHDR = 0x16 + IPV6_RECVRTHDRDSTOPTS = 0x17 + IPV6_RECVTCLASS = 0x19 + IPV6_RTHDR = 0x10 + IPV6_RTHDRDSTOPTS = 0x11 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SEC_OPT = 0x22 + IPV6_SRC_PREFERENCES = 0x23 + IPV6_TCLASS = 0x26 + IPV6_UNICAST_HOPS = 0x5 + IPV6_UNSPEC_SRC = 0x42 + IPV6_USE_MIN_MTU = 0x20 + IPV6_V6ONLY = 0x27 + IP_ADD_MEMBERSHIP = 0x13 + IP_ADD_SOURCE_MEMBERSHIP = 0x17 + IP_BLOCK_SOURCE = 0x15 + IP_BOUND_IF = 0x41 + IP_BROADCAST = 0x106 + IP_BROADCAST_TTL = 0x43 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DHCPINIT_IF = 0x45 + IP_DONTFRAG = 0x1b + IP_DONTROUTE = 0x105 + IP_DROP_MEMBERSHIP = 0x14 + IP_DROP_SOURCE_MEMBERSHIP = 0x18 + IP_HDRINCL = 0x2 + IP_MAXPACKET = 0xffff + IP_MF = 0x2000 + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x10 + IP_MULTICAST_LOOP = 0x12 + IP_MULTICAST_TTL = 0x11 + IP_NEXTHOP = 0x19 + IP_OPTIONS = 0x1 + IP_PKTINFO = 0x1a + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x9 + IP_RECVOPTS = 0x5 + IP_RECVPKTINFO = 0x1a + IP_RECVRETOPTS = 0x6 + IP_RECVSLLA = 0xa + IP_RECVTTL = 0xb + IP_RETOPTS = 0x8 + IP_REUSEADDR = 0x104 + IP_SEC_OPT = 0x22 + IP_TOS = 0x3 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x16 + IP_UNSPEC_SRC = 0x42 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_ACCESS_DEFAULT = 0x6 + MADV_ACCESS_LWP = 0x7 + MADV_ACCESS_MANY = 0x8 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_NORMAL = 0x0 + MADV_PURGE = 0x9 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MAP_32BIT = 0x80 + MAP_ALIGN = 0x200 + MAP_ANON = 0x100 + MAP_ANONYMOUS = 0x100 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_INITDATA = 0x800 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_TEXT = 0x400 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MSG_CTRUNC = 0x10 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_DUPCTRL = 0x800 + MSG_EOR = 0x8 + MSG_MAXIOVLEN = 0x10 + MSG_NOTIFICATION = 0x100 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x20 + MSG_WAITALL = 0x40 + MSG_XPG4_2 = 0x8000 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_OLDSYNC = 0x0 + MS_SYNC = 0x4 + M_FLUSH = 0x86 + NAME_MAX = 0xff + NEWDEV = 0x1 + NL0 = 0x0 + NL1 = 0x100 + NLDLY = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + OLDDEV = 0x0 + ONBITSMAJOR = 0x7 + ONBITSMINOR = 0x8 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPENFAIL = -0x1 + OPOST = 0x1 + O_ACCMODE = 0x600003 + O_APPEND = 0x8 + O_CLOEXEC = 0x800000 + O_CREAT = 0x100 + O_DSYNC = 0x40 + O_EXCL = 0x400 + O_EXEC = 0x400000 + O_LARGEFILE = 0x2000 + O_NDELAY = 0x4 + O_NOCTTY = 0x800 + O_NOFOLLOW = 0x20000 + O_NOLINKS = 0x40000 + O_NONBLOCK = 0x80 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x8000 + O_SEARCH = 0x200000 + O_SIOCGIFCONF = -0x3ff796ec + O_SIOCGLIFCONF = -0x3fef9688 + O_SYNC = 0x10 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + O_XATTR = 0x4000 + PARENB = 0x100 + PAREXT = 0x100000 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0x6 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = -0x3 + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x9 + RTAX_NETMASK = 0x2 + RTAX_SRC = 0x8 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTA_NUMBITS = 0x9 + RTA_SRC = 0x100 + RTF_BLACKHOLE = 0x1000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INDIRECT = 0x40000 + RTF_KERNEL = 0x80000 + RTF_LLINFO = 0x400 + RTF_MASK = 0x80 + RTF_MODIFIED = 0x20 + RTF_MULTIRT = 0x10000 + RTF_PRIVATE = 0x2000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_REJECT = 0x8 + RTF_SETSRC = 0x20000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTF_ZONE = 0x100000 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_CHGADDR = 0xf + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_FREEADDR = 0x10 + RTM_GET = 0x4 + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_VERSION = 0x3 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RT_AWARE = 0x1 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_RIGHTS = 0x1010 + SCM_TIMESTAMP = 0x1013 + SCM_UCRED = 0x1012 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIG2STR_MAX = 0x20 + SIOCADDMULTI = -0x7fdf96cf + SIOCADDRT = -0x7fcf8df6 + SIOCATMARK = 0x40047307 + SIOCDARP = -0x7fdb96e0 + SIOCDELMULTI = -0x7fdf96ce + SIOCDELRT = -0x7fcf8df5 + SIOCDXARP = -0x7fff9658 + SIOCGARP = -0x3fdb96e1 + SIOCGDSTINFO = -0x3fff965c + SIOCGENADDR = -0x3fdf96ab + SIOCGENPSTATS = -0x3fdf96c7 + SIOCGETLSGCNT = -0x3fef8deb + SIOCGETNAME = 0x40107334 + SIOCGETPEER = 0x40107335 + SIOCGETPROP = -0x3fff8f44 + SIOCGETSGCNT = -0x3feb8deb + SIOCGETSYNC = -0x3fdf96d3 + SIOCGETVIFCNT = -0x3feb8dec + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = -0x3fdf96f3 + SIOCGIFBRDADDR = -0x3fdf96e9 + SIOCGIFCONF = -0x3ff796a4 + SIOCGIFDSTADDR = -0x3fdf96f1 + SIOCGIFFLAGS = -0x3fdf96ef + SIOCGIFHWADDR = -0x3fdf9647 + SIOCGIFINDEX = -0x3fdf96a6 + SIOCGIFMEM = -0x3fdf96ed + SIOCGIFMETRIC = -0x3fdf96e5 + SIOCGIFMTU = -0x3fdf96ea + SIOCGIFMUXID = -0x3fdf96a8 + SIOCGIFNETMASK = -0x3fdf96e7 + SIOCGIFNUM = 0x40046957 + SIOCGIP6ADDRPOLICY = -0x3fff965e + SIOCGIPMSFILTER = -0x3ffb964c + SIOCGLIFADDR = -0x3f87968f + SIOCGLIFBINDING = -0x3f879666 + SIOCGLIFBRDADDR = -0x3f879685 + SIOCGLIFCONF = -0x3fef965b + SIOCGLIFDADSTATE = -0x3f879642 + SIOCGLIFDSTADDR = -0x3f87968d + SIOCGLIFFLAGS = -0x3f87968b + SIOCGLIFGROUPINFO = -0x3f4b9663 + SIOCGLIFGROUPNAME = -0x3f879664 + SIOCGLIFHWADDR = -0x3f879640 + SIOCGLIFINDEX = -0x3f87967b + SIOCGLIFLNKINFO = -0x3f879674 + SIOCGLIFMETRIC = -0x3f879681 + SIOCGLIFMTU = -0x3f879686 + SIOCGLIFMUXID = -0x3f87967d + SIOCGLIFNETMASK = -0x3f879683 + SIOCGLIFNUM = -0x3ff3967e + SIOCGLIFSRCOF = -0x3fef964f + SIOCGLIFSUBNET = -0x3f879676 + SIOCGLIFTOKEN = -0x3f879678 + SIOCGLIFUSESRC = -0x3f879651 + SIOCGLIFZONE = -0x3f879656 + SIOCGLOWAT = 0x40047303 + SIOCGMSFILTER = -0x3ffb964e + SIOCGPGRP = 0x40047309 + SIOCGSTAMP = -0x3fef9646 + SIOCGXARP = -0x3fff9659 + SIOCIFDETACH = -0x7fdf96c8 + SIOCILB = -0x3ffb9645 + SIOCLIFADDIF = -0x3f879691 + SIOCLIFDELND = -0x7f879673 + SIOCLIFGETND = -0x3f879672 + SIOCLIFREMOVEIF = -0x7f879692 + SIOCLIFSETND = -0x7f879671 + SIOCLOWER = -0x7fdf96d7 + SIOCSARP = -0x7fdb96e2 + SIOCSCTPGOPT = -0x3fef9653 + SIOCSCTPPEELOFF = -0x3ffb9652 + SIOCSCTPSOPT = -0x7fef9654 + SIOCSENABLESDP = -0x3ffb9649 + SIOCSETPROP = -0x7ffb8f43 + SIOCSETSYNC = -0x7fdf96d4 + SIOCSHIWAT = -0x7ffb8d00 + SIOCSIFADDR = -0x7fdf96f4 + SIOCSIFBRDADDR = -0x7fdf96e8 + SIOCSIFDSTADDR = -0x7fdf96f2 + SIOCSIFFLAGS = -0x7fdf96f0 + SIOCSIFINDEX = -0x7fdf96a5 + SIOCSIFMEM = -0x7fdf96ee + SIOCSIFMETRIC = -0x7fdf96e4 + SIOCSIFMTU = -0x7fdf96eb + SIOCSIFMUXID = -0x7fdf96a7 + SIOCSIFNAME = -0x7fdf96b7 + SIOCSIFNETMASK = -0x7fdf96e6 + SIOCSIP6ADDRPOLICY = -0x7fff965d + SIOCSIPMSFILTER = -0x7ffb964b + SIOCSLGETREQ = -0x3fdf96b9 + SIOCSLIFADDR = -0x7f879690 + SIOCSLIFBRDADDR = -0x7f879684 + SIOCSLIFDSTADDR = -0x7f87968e + SIOCSLIFFLAGS = -0x7f87968c + SIOCSLIFGROUPNAME = -0x7f879665 + SIOCSLIFINDEX = -0x7f87967a + SIOCSLIFLNKINFO = -0x7f879675 + SIOCSLIFMETRIC = -0x7f879680 + SIOCSLIFMTU = -0x7f879687 + SIOCSLIFMUXID = -0x7f87967c + SIOCSLIFNAME = -0x3f87967f + SIOCSLIFNETMASK = -0x7f879682 + SIOCSLIFPREFIX = -0x3f879641 + SIOCSLIFSUBNET = -0x7f879677 + SIOCSLIFTOKEN = -0x7f879679 + SIOCSLIFUSESRC = -0x7f879650 + SIOCSLIFZONE = -0x7f879655 + SIOCSLOWAT = -0x7ffb8cfe + SIOCSLSTAT = -0x7fdf96b8 + SIOCSMSFILTER = -0x7ffb964d + SIOCSPGRP = -0x7ffb8cf8 + SIOCSPROMISC = -0x7ffb96d0 + SIOCSQPTR = -0x3ffb9648 + SIOCSSDSTATS = -0x3fdf96d2 + SIOCSSESTATS = -0x3fdf96d1 + SIOCSXARP = -0x7fff965a + SIOCTMYADDR = -0x3ff79670 + SIOCTMYSITE = -0x3ff7966e + SIOCTONLINK = -0x3ff7966f + SIOCUPPER = -0x7fdf96d8 + SIOCX25RCV = -0x3fdf96c4 + SIOCX25TBL = -0x3fdf96c3 + SIOCX25XMT = -0x3fdf96c5 + SIOCXPROTO = 0x20007337 + SOCK_CLOEXEC = 0x80000 + SOCK_DGRAM = 0x1 + SOCK_NDELAY = 0x200000 + SOCK_NONBLOCK = 0x100000 + SOCK_RAW = 0x4 + SOCK_RDM = 0x5 + SOCK_SEQPACKET = 0x6 + SOCK_STREAM = 0x2 + SOCK_TYPE_MASK = 0xffff + SOL_FILTER = 0xfffc + SOL_PACKET = 0xfffd + SOL_ROUTE = 0xfffe + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ALL = 0x3f + SO_ALLZONES = 0x1014 + SO_ANON_MLP = 0x100a + SO_ATTACH_FILTER = 0x40000001 + SO_BAND = 0x4000 + SO_BROADCAST = 0x20 + SO_COPYOPT = 0x80000 + SO_DEBUG = 0x1 + SO_DELIM = 0x8000 + SO_DETACH_FILTER = 0x40000002 + SO_DGRAM_ERRIND = 0x200 + SO_DOMAIN = 0x100c + SO_DONTLINGER = -0x81 + SO_DONTROUTE = 0x10 + SO_ERROPT = 0x40000 + SO_ERROR = 0x1007 + SO_EXCLBIND = 0x1015 + SO_HIWAT = 0x10 + SO_ISNTTY = 0x800 + SO_ISTTY = 0x400 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_LOWAT = 0x20 + SO_MAC_EXEMPT = 0x100b + SO_MAC_IMPLICIT = 0x1016 + SO_MAXBLK = 0x100000 + SO_MAXPSZ = 0x8 + SO_MINPSZ = 0x4 + SO_MREADOFF = 0x80 + SO_MREADON = 0x40 + SO_NDELOFF = 0x200 + SO_NDELON = 0x100 + SO_NODELIM = 0x10000 + SO_OOBINLINE = 0x100 + SO_PROTOTYPE = 0x1009 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVPSH = 0x100d + SO_RCVTIMEO = 0x1006 + SO_READOPT = 0x1 + SO_RECVUCRED = 0x400 + SO_REUSEADDR = 0x4 + SO_SECATTR = 0x1011 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_STRHOLD = 0x20000 + SO_TAIL = 0x200000 + SO_TIMESTAMP = 0x1013 + SO_TONSTOP = 0x2000 + SO_TOSTOP = 0x1000 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SO_VRRP = 0x1017 + SO_WROFF = 0x2 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TCFLSH = 0x5407 + TCGETA = 0x5401 + TCGETS = 0x540d + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_ABORT_THRESHOLD = 0x11 + TCP_ANONPRIVBIND = 0x20 + TCP_CONN_ABORT_THRESHOLD = 0x13 + TCP_CONN_NOTIFY_THRESHOLD = 0x12 + TCP_CORK = 0x18 + TCP_EXCLBIND = 0x21 + TCP_INIT_CWND = 0x15 + TCP_KEEPALIVE = 0x8 + TCP_KEEPALIVE_ABORT_THRESHOLD = 0x17 + TCP_KEEPALIVE_THRESHOLD = 0x16 + TCP_KEEPCNT = 0x23 + TCP_KEEPIDLE = 0x22 + TCP_KEEPINTVL = 0x24 + TCP_LINGER2 = 0x1c + TCP_MAXSEG = 0x2 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCP_NOTIFY_THRESHOLD = 0x10 + TCP_RECVDSTADDR = 0x14 + TCP_RTO_INITIAL = 0x19 + TCP_RTO_MAX = 0x1b + TCP_RTO_MIN = 0x1a + TCSAFLUSH = 0x5410 + TCSBRK = 0x5405 + TCSETA = 0x5402 + TCSETAF = 0x5404 + TCSETAW = 0x5403 + TCSETS = 0x540e + TCSETSF = 0x5410 + TCSETSW = 0x540f + TCXONC = 0x5406 + TIOC = 0x5400 + TIOCCBRK = 0x747a + TIOCCDTR = 0x7478 + TIOCCILOOP = 0x746c + TIOCEXCL = 0x740d + TIOCFLUSH = 0x7410 + TIOCGETC = 0x7412 + TIOCGETD = 0x7400 + TIOCGETP = 0x7408 + TIOCGLTC = 0x7474 + TIOCGPGRP = 0x7414 + TIOCGPPS = 0x547d + TIOCGPPSEV = 0x547f + TIOCGSID = 0x7416 + TIOCGSOFTCAR = 0x5469 + TIOCGWINSZ = 0x5468 + TIOCHPCL = 0x7402 + TIOCKBOF = 0x5409 + TIOCKBON = 0x5408 + TIOCLBIC = 0x747e + TIOCLBIS = 0x747f + TIOCLGET = 0x747c + TIOCLSET = 0x747d + TIOCMBIC = 0x741c + TIOCMBIS = 0x741b + TIOCMGET = 0x741d + TIOCMSET = 0x741a + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x7471 + TIOCNXCL = 0x740e + TIOCOUTQ = 0x7473 + TIOCREMOTE = 0x741e + TIOCSBRK = 0x747b + TIOCSCTTY = 0x7484 + TIOCSDTR = 0x7479 + TIOCSETC = 0x7411 + TIOCSETD = 0x7401 + TIOCSETN = 0x740a + TIOCSETP = 0x7409 + TIOCSIGNAL = 0x741f + TIOCSILOOP = 0x746d + TIOCSLTC = 0x7475 + TIOCSPGRP = 0x7415 + TIOCSPPS = 0x547e + TIOCSSOFTCAR = 0x546a + TIOCSTART = 0x746e + TIOCSTI = 0x7417 + TIOCSTOP = 0x746f + TIOCSWINSZ = 0x5467 + TOSTOP = 0x100 + VCEOF = 0x8 + VCEOL = 0x9 + VDISCARD = 0xd + VDSUSP = 0xb + VEOF = 0x4 + VEOL = 0x5 + VEOL2 = 0x6 + VERASE = 0x2 + VERASE2 = 0x11 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMIN = 0x4 + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTATUS = 0x10 + VSTOP = 0x9 + VSUSP = 0xa + VSWTCH = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WCONTFLG = 0xffff + WCONTINUED = 0x8 + WCOREFLG = 0x80 + WEXITED = 0x1 + WNOHANG = 0x40 + WNOWAIT = 0x80 + WOPTMASK = 0xcf + WRAP = 0x20000 + WSIGMASK = 0x7f + WSTOPFLG = 0x7f + WSTOPPED = 0x4 + WTRAPPED = 0x2 + WUNTRACED = 0x4 + XCASE = 0x4 + XTABS = 0x1800 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x7d) + EADDRNOTAVAIL = syscall.Errno(0x7e) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x7c) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x95) + EBADE = syscall.Errno(0x32) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x51) + EBADMSG = syscall.Errno(0x4d) + EBADR = syscall.Errno(0x33) + EBADRQC = syscall.Errno(0x36) + EBADSLT = syscall.Errno(0x37) + EBFONT = syscall.Errno(0x39) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x2f) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x25) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x82) + ECONNREFUSED = syscall.Errno(0x92) + ECONNRESET = syscall.Errno(0x83) + EDEADLK = syscall.Errno(0x2d) + EDEADLOCK = syscall.Errno(0x38) + EDESTADDRREQ = syscall.Errno(0x60) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x31) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x93) + EHOSTUNREACH = syscall.Errno(0x94) + EIDRM = syscall.Errno(0x24) + EILSEQ = syscall.Errno(0x58) + EINPROGRESS = syscall.Errno(0x96) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x85) + EISDIR = syscall.Errno(0x15) + EL2HLT = syscall.Errno(0x2c) + EL2NSYNC = syscall.Errno(0x26) + EL3HLT = syscall.Errno(0x27) + EL3RST = syscall.Errno(0x28) + ELIBACC = syscall.Errno(0x53) + ELIBBAD = syscall.Errno(0x54) + ELIBEXEC = syscall.Errno(0x57) + ELIBMAX = syscall.Errno(0x56) + ELIBSCN = syscall.Errno(0x55) + ELNRNG = syscall.Errno(0x29) + ELOCKUNMAPPED = syscall.Errno(0x48) + ELOOP = syscall.Errno(0x5a) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x61) + EMULTIHOP = syscall.Errno(0x4a) + ENAMETOOLONG = syscall.Errno(0x4e) + ENETDOWN = syscall.Errno(0x7f) + ENETRESET = syscall.Errno(0x81) + ENETUNREACH = syscall.Errno(0x80) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x35) + ENOBUFS = syscall.Errno(0x84) + ENOCSI = syscall.Errno(0x2b) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x2e) + ENOLINK = syscall.Errno(0x43) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x23) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x63) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x59) + ENOTACTIVE = syscall.Errno(0x49) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x86) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x5d) + ENOTRECOVERABLE = syscall.Errno(0x3b) + ENOTSOCK = syscall.Errno(0x5f) + ENOTSUP = syscall.Errno(0x30) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x50) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x7a) + EOVERFLOW = syscall.Errno(0x4f) + EOWNERDEAD = syscall.Errno(0x3a) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x7b) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x78) + EPROTOTYPE = syscall.Errno(0x62) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x52) + EREMOTE = syscall.Errno(0x42) + ERESTART = syscall.Errno(0x5b) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x8f) + ESOCKTNOSUPPORT = syscall.Errno(0x79) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x97) + ESTRPIPE = syscall.Errno(0x5c) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x91) + ETOOMANYREFS = syscall.Errno(0x90) + ETXTBSY = syscall.Errno(0x1a) + EUNATCH = syscall.Errno(0x2a) + EUSERS = syscall.Errno(0x5e) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x34) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCANCEL = syscall.Signal(0x24) + SIGCHLD = syscall.Signal(0x12) + SIGCLD = syscall.Signal(0x12) + SIGCONT = syscall.Signal(0x19) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGFREEZE = syscall.Signal(0x22) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x29) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x16) + SIGIOT = syscall.Signal(0x6) + SIGJVM1 = syscall.Signal(0x27) + SIGJVM2 = syscall.Signal(0x28) + SIGKILL = syscall.Signal(0x9) + SIGLOST = syscall.Signal(0x25) + SIGLWP = syscall.Signal(0x21) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x16) + SIGPROF = syscall.Signal(0x1d) + SIGPWR = syscall.Signal(0x13) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x17) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHAW = syscall.Signal(0x23) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x18) + SIGTTIN = syscall.Signal(0x1a) + SIGTTOU = syscall.Signal(0x1b) + SIGURG = syscall.Signal(0x15) + SIGUSR1 = syscall.Signal(0x10) + SIGUSR2 = syscall.Signal(0x11) + SIGVTALRM = syscall.Signal(0x1c) + SIGWAITING = syscall.Signal(0x20) + SIGWINCH = syscall.Signal(0x14) + SIGXCPU = syscall.Signal(0x1e) + SIGXFSZ = syscall.Signal(0x1f) + SIGXRES = syscall.Signal(0x26) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "not owner"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "I/O error"}, + {6, "ENXIO", "no such device or address"}, + {7, "E2BIG", "arg list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file number"}, + {10, "ECHILD", "no child processes"}, + {11, "EAGAIN", "resource temporarily unavailable"}, + {12, "ENOMEM", "not enough space"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "cross-device link"}, + {19, "ENODEV", "no such device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "file table overflow"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "argument out of domain"}, + {34, "ERANGE", "result too large"}, + {35, "ENOMSG", "no message of desired type"}, + {36, "EIDRM", "identifier removed"}, + {37, "ECHRNG", "channel number out of range"}, + {38, "EL2NSYNC", "level 2 not synchronized"}, + {39, "EL3HLT", "level 3 halted"}, + {40, "EL3RST", "level 3 reset"}, + {41, "ELNRNG", "link number out of range"}, + {42, "EUNATCH", "protocol driver not attached"}, + {43, "ENOCSI", "no CSI structure available"}, + {44, "EL2HLT", "level 2 halted"}, + {45, "EDEADLK", "deadlock situation detected/avoided"}, + {46, "ENOLCK", "no record locks available"}, + {47, "ECANCELED", "operation canceled"}, + {48, "ENOTSUP", "operation not supported"}, + {49, "EDQUOT", "disc quota exceeded"}, + {50, "EBADE", "bad exchange descriptor"}, + {51, "EBADR", "bad request descriptor"}, + {52, "EXFULL", "message tables full"}, + {53, "ENOANO", "anode table overflow"}, + {54, "EBADRQC", "bad request code"}, + {55, "EBADSLT", "invalid slot"}, + {56, "EDEADLOCK", "file locking deadlock"}, + {57, "EBFONT", "bad font file format"}, + {58, "EOWNERDEAD", "owner of the lock died"}, + {59, "ENOTRECOVERABLE", "lock is not recoverable"}, + {60, "ENOSTR", "not a stream device"}, + {61, "ENODATA", "no data available"}, + {62, "ETIME", "timer expired"}, + {63, "ENOSR", "out of stream resources"}, + {64, "ENONET", "machine is not on the network"}, + {65, "ENOPKG", "package not installed"}, + {66, "EREMOTE", "object is remote"}, + {67, "ENOLINK", "link has been severed"}, + {68, "EADV", "advertise error"}, + {69, "ESRMNT", "srmount error"}, + {70, "ECOMM", "communication error on send"}, + {71, "EPROTO", "protocol error"}, + {72, "ELOCKUNMAPPED", "locked lock was unmapped "}, + {73, "ENOTACTIVE", "facility is not active"}, + {74, "EMULTIHOP", "multihop attempted"}, + {77, "EBADMSG", "not a data message"}, + {78, "ENAMETOOLONG", "file name too long"}, + {79, "EOVERFLOW", "value too large for defined data type"}, + {80, "ENOTUNIQ", "name not unique on network"}, + {81, "EBADFD", "file descriptor in bad state"}, + {82, "EREMCHG", "remote address changed"}, + {83, "ELIBACC", "can not access a needed shared library"}, + {84, "ELIBBAD", "accessing a corrupted shared library"}, + {85, "ELIBSCN", ".lib section in a.out corrupted"}, + {86, "ELIBMAX", "attempting to link in more shared libraries than system limit"}, + {87, "ELIBEXEC", "can not exec a shared library directly"}, + {88, "EILSEQ", "illegal byte sequence"}, + {89, "ENOSYS", "operation not applicable"}, + {90, "ELOOP", "number of symbolic links encountered during path name traversal exceeds MAXSYMLINKS"}, + {91, "ERESTART", "error 91"}, + {92, "ESTRPIPE", "error 92"}, + {93, "ENOTEMPTY", "directory not empty"}, + {94, "EUSERS", "too many users"}, + {95, "ENOTSOCK", "socket operation on non-socket"}, + {96, "EDESTADDRREQ", "destination address required"}, + {97, "EMSGSIZE", "message too long"}, + {98, "EPROTOTYPE", "protocol wrong type for socket"}, + {99, "ENOPROTOOPT", "option not supported by protocol"}, + {120, "EPROTONOSUPPORT", "protocol not supported"}, + {121, "ESOCKTNOSUPPORT", "socket type not supported"}, + {122, "EOPNOTSUPP", "operation not supported on transport endpoint"}, + {123, "EPFNOSUPPORT", "protocol family not supported"}, + {124, "EAFNOSUPPORT", "address family not supported by protocol family"}, + {125, "EADDRINUSE", "address already in use"}, + {126, "EADDRNOTAVAIL", "cannot assign requested address"}, + {127, "ENETDOWN", "network is down"}, + {128, "ENETUNREACH", "network is unreachable"}, + {129, "ENETRESET", "network dropped connection because of reset"}, + {130, "ECONNABORTED", "software caused connection abort"}, + {131, "ECONNRESET", "connection reset by peer"}, + {132, "ENOBUFS", "no buffer space available"}, + {133, "EISCONN", "transport endpoint is already connected"}, + {134, "ENOTCONN", "transport endpoint is not connected"}, + {143, "ESHUTDOWN", "cannot send after socket shutdown"}, + {144, "ETOOMANYREFS", "too many references: cannot splice"}, + {145, "ETIMEDOUT", "connection timed out"}, + {146, "ECONNREFUSED", "connection refused"}, + {147, "EHOSTDOWN", "host is down"}, + {148, "EHOSTUNREACH", "no route to host"}, + {149, "EALREADY", "operation already in progress"}, + {150, "EINPROGRESS", "operation now in progress"}, + {151, "ESTALE", "stale NFS file handle"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal Instruction"}, + {5, "SIGTRAP", "trace/Breakpoint Trap"}, + {6, "SIGABRT", "abort"}, + {7, "SIGEMT", "emulation Trap"}, + {8, "SIGFPE", "arithmetic Exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus Error"}, + {11, "SIGSEGV", "segmentation Fault"}, + {12, "SIGSYS", "bad System Call"}, + {13, "SIGPIPE", "broken Pipe"}, + {14, "SIGALRM", "alarm Clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGUSR1", "user Signal 1"}, + {17, "SIGUSR2", "user Signal 2"}, + {18, "SIGCHLD", "child Status Changed"}, + {19, "SIGPWR", "power-Fail/Restart"}, + {20, "SIGWINCH", "window Size Change"}, + {21, "SIGURG", "urgent Socket Condition"}, + {22, "SIGIO", "pollable Event"}, + {23, "SIGSTOP", "stopped (signal)"}, + {24, "SIGTSTP", "stopped (user)"}, + {25, "SIGCONT", "continued"}, + {26, "SIGTTIN", "stopped (tty input)"}, + {27, "SIGTTOU", "stopped (tty output)"}, + {28, "SIGVTALRM", "virtual Timer Expired"}, + {29, "SIGPROF", "profiling Timer Expired"}, + {30, "SIGXCPU", "cpu Limit Exceeded"}, + {31, "SIGXFSZ", "file Size Limit Exceeded"}, + {32, "SIGWAITING", "no runnable lwp"}, + {33, "SIGLWP", "inter-lwp signal"}, + {34, "SIGFREEZE", "checkpoint Freeze"}, + {35, "SIGTHAW", "checkpoint Thaw"}, + {36, "SIGCANCEL", "thread Cancellation"}, + {37, "SIGLOST", "resource Lost"}, + {38, "SIGXRES", "resource Control Exceeded"}, + {39, "SIGJVM1", "reserved for JVM 1"}, + {40, "SIGJVM2", "reserved for JVM 2"}, + {41, "SIGINFO", "information Request"}, +} diff --git a/api/vendor/golang.org/x/sys/unix/zptrace386_linux.go b/api/vendor/golang.org/x/sys/unix/zptrace386_linux.go new file mode 100644 index 0000000..2d21c49 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zptrace386_linux.go @@ -0,0 +1,80 @@ +// Code generated by linux/mkall.go generatePtracePair(386, amd64). DO NOT EDIT. + +// +build linux +// +build 386 amd64 + +package unix + +import "unsafe" + +// PtraceRegs386 is the registers used by 386 binaries. +type PtraceRegs386 struct { + Ebx int32 + Ecx int32 + Edx int32 + Esi int32 + Edi int32 + Ebp int32 + Eax int32 + Xds int32 + Xes int32 + Xfs int32 + Xgs int32 + Orig_eax int32 + Eip int32 + Xcs int32 + Eflags int32 + Esp int32 + Xss int32 +} + +// PtraceGetRegs386 fetches the registers used by 386 binaries. +func PtraceGetRegs386(pid int, regsout *PtraceRegs386) error { + return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) +} + +// PtraceSetRegs386 sets the registers used by 386 binaries. +func PtraceSetRegs386(pid int, regs *PtraceRegs386) error { + return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) +} + +// PtraceRegsAmd64 is the registers used by amd64 binaries. +type PtraceRegsAmd64 struct { + R15 uint64 + R14 uint64 + R13 uint64 + R12 uint64 + Rbp uint64 + Rbx uint64 + R11 uint64 + R10 uint64 + R9 uint64 + R8 uint64 + Rax uint64 + Rcx uint64 + Rdx uint64 + Rsi uint64 + Rdi uint64 + Orig_rax uint64 + Rip uint64 + Cs uint64 + Eflags uint64 + Rsp uint64 + Ss uint64 + Fs_base uint64 + Gs_base uint64 + Ds uint64 + Es uint64 + Fs uint64 + Gs uint64 +} + +// PtraceGetRegsAmd64 fetches the registers used by amd64 binaries. +func PtraceGetRegsAmd64(pid int, regsout *PtraceRegsAmd64) error { + return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) +} + +// PtraceSetRegsAmd64 sets the registers used by amd64 binaries. +func PtraceSetRegsAmd64(pid int, regs *PtraceRegsAmd64) error { + return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) +} diff --git a/api/vendor/golang.org/x/sys/unix/zptracearm_linux.go b/api/vendor/golang.org/x/sys/unix/zptracearm_linux.go new file mode 100644 index 0000000..faf23bb --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zptracearm_linux.go @@ -0,0 +1,41 @@ +// Code generated by linux/mkall.go generatePtracePair(arm, arm64). DO NOT EDIT. + +// +build linux +// +build arm arm64 + +package unix + +import "unsafe" + +// PtraceRegsArm is the registers used by arm binaries. +type PtraceRegsArm struct { + Uregs [18]uint32 +} + +// PtraceGetRegsArm fetches the registers used by arm binaries. +func PtraceGetRegsArm(pid int, regsout *PtraceRegsArm) error { + return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) +} + +// PtraceSetRegsArm sets the registers used by arm binaries. +func PtraceSetRegsArm(pid int, regs *PtraceRegsArm) error { + return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) +} + +// PtraceRegsArm64 is the registers used by arm64 binaries. +type PtraceRegsArm64 struct { + Regs [31]uint64 + Sp uint64 + Pc uint64 + Pstate uint64 +} + +// PtraceGetRegsArm64 fetches the registers used by arm64 binaries. +func PtraceGetRegsArm64(pid int, regsout *PtraceRegsArm64) error { + return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) +} + +// PtraceSetRegsArm64 sets the registers used by arm64 binaries. +func PtraceSetRegsArm64(pid int, regs *PtraceRegsArm64) error { + return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) +} diff --git a/api/vendor/golang.org/x/sys/unix/zptracemips_linux.go b/api/vendor/golang.org/x/sys/unix/zptracemips_linux.go new file mode 100644 index 0000000..c431131 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zptracemips_linux.go @@ -0,0 +1,50 @@ +// Code generated by linux/mkall.go generatePtracePair(mips, mips64). DO NOT EDIT. + +// +build linux +// +build mips mips64 + +package unix + +import "unsafe" + +// PtraceRegsMips is the registers used by mips binaries. +type PtraceRegsMips struct { + Regs [32]uint64 + Lo uint64 + Hi uint64 + Epc uint64 + Badvaddr uint64 + Status uint64 + Cause uint64 +} + +// PtraceGetRegsMips fetches the registers used by mips binaries. +func PtraceGetRegsMips(pid int, regsout *PtraceRegsMips) error { + return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) +} + +// PtraceSetRegsMips sets the registers used by mips binaries. +func PtraceSetRegsMips(pid int, regs *PtraceRegsMips) error { + return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) +} + +// PtraceRegsMips64 is the registers used by mips64 binaries. +type PtraceRegsMips64 struct { + Regs [32]uint64 + Lo uint64 + Hi uint64 + Epc uint64 + Badvaddr uint64 + Status uint64 + Cause uint64 +} + +// PtraceGetRegsMips64 fetches the registers used by mips64 binaries. +func PtraceGetRegsMips64(pid int, regsout *PtraceRegsMips64) error { + return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) +} + +// PtraceSetRegsMips64 sets the registers used by mips64 binaries. +func PtraceSetRegsMips64(pid int, regs *PtraceRegsMips64) error { + return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) +} diff --git a/api/vendor/golang.org/x/sys/unix/zptracemipsle_linux.go b/api/vendor/golang.org/x/sys/unix/zptracemipsle_linux.go new file mode 100644 index 0000000..dc3d6d3 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zptracemipsle_linux.go @@ -0,0 +1,50 @@ +// Code generated by linux/mkall.go generatePtracePair(mipsle, mips64le). DO NOT EDIT. + +// +build linux +// +build mipsle mips64le + +package unix + +import "unsafe" + +// PtraceRegsMipsle is the registers used by mipsle binaries. +type PtraceRegsMipsle struct { + Regs [32]uint64 + Lo uint64 + Hi uint64 + Epc uint64 + Badvaddr uint64 + Status uint64 + Cause uint64 +} + +// PtraceGetRegsMipsle fetches the registers used by mipsle binaries. +func PtraceGetRegsMipsle(pid int, regsout *PtraceRegsMipsle) error { + return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) +} + +// PtraceSetRegsMipsle sets the registers used by mipsle binaries. +func PtraceSetRegsMipsle(pid int, regs *PtraceRegsMipsle) error { + return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) +} + +// PtraceRegsMips64le is the registers used by mips64le binaries. +type PtraceRegsMips64le struct { + Regs [32]uint64 + Lo uint64 + Hi uint64 + Epc uint64 + Badvaddr uint64 + Status uint64 + Cause uint64 +} + +// PtraceGetRegsMips64le fetches the registers used by mips64le binaries. +func PtraceGetRegsMips64le(pid int, regsout *PtraceRegsMips64le) error { + return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) +} + +// PtraceSetRegsMips64le sets the registers used by mips64le binaries. +func PtraceSetRegsMips64le(pid int, regs *PtraceRegsMips64le) error { + return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) +} diff --git a/api/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go b/api/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go new file mode 100644 index 0000000..ac02d4d --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go @@ -0,0 +1,1712 @@ +// mksyscall.pl -l32 -tags darwin,386 syscall_bsd.go syscall_darwin.go syscall_darwin_386.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build darwin,386 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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 bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, 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) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (r int, w int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + r = int(r0) + w = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getxattr(path string, attr string, dest *byte, size int, position uint32, options int) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(dest)), uintptr(size), uintptr(position), uintptr(options)) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setxattr(path string, attr string, data *byte, size int, position uint32, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(data)), uintptr(size), uintptr(position), uintptr(options)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func removexattr(path string, attr string, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func listxattr(path string, dest *byte, size int, options int) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(dest)), uintptr(size), uintptr(options), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kill(pid int, signum int, posix int) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), uintptr(posix)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exchangedata(path1 string, path2 string, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path1) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(path2) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXCHANGEDATA, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT64, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), uintptr(length>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES64, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := RawSyscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(fromfd int, from string, tofd int, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(offset>>32), uintptr(whence), 0, 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := Syscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setprivexec(flag int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIVEXEC, uintptr(flag), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), uintptr(length>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos), uintptr(pos>>32), 0, 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func gettimeofday(tp *Timeval) (sec int32, usec int32, err error) { + r0, r1, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + sec = int32(r0) + usec = int32(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go b/api/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go new file mode 100644 index 0000000..1dd3cfa --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go @@ -0,0 +1,1712 @@ +// mksyscall.pl -tags darwin,amd64 syscall_bsd.go syscall_darwin.go syscall_darwin_amd64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build darwin,amd64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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 bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, 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) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (r int, w int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + r = int(r0) + w = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getxattr(path string, attr string, dest *byte, size int, position uint32, options int) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(dest)), uintptr(size), uintptr(position), uintptr(options)) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setxattr(path string, attr string, data *byte, size int, position uint32, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(data)), uintptr(size), uintptr(position), uintptr(options)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func removexattr(path string, attr string, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func listxattr(path string, dest *byte, size int, options int) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(dest)), uintptr(size), uintptr(options), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kill(pid int, signum int, posix int) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), uintptr(posix)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exchangedata(path1 string, path2 string, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path1) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(path2) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXCHANGEDATA, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT64, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES64, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := RawSyscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(fromfd int, from string, tofd int, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + newoffset = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := Syscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setprivexec(flag int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIVEXEC, uintptr(flag), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos)) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func gettimeofday(tp *Timeval) (sec int64, usec int32, err error) { + r0, r1, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + sec = int64(r0) + usec = int32(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go b/api/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go new file mode 100644 index 0000000..cab46e7 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go @@ -0,0 +1,1712 @@ +// mksyscall.pl -l32 -tags darwin,arm syscall_bsd.go syscall_darwin.go syscall_darwin_arm.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build darwin,arm + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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 bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, 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) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (r int, w int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + r = int(r0) + w = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getxattr(path string, attr string, dest *byte, size int, position uint32, options int) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(dest)), uintptr(size), uintptr(position), uintptr(options)) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setxattr(path string, attr string, data *byte, size int, position uint32, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(data)), uintptr(size), uintptr(position), uintptr(options)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func removexattr(path string, attr string, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func listxattr(path string, dest *byte, size int, options int) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(dest)), uintptr(size), uintptr(options), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kill(pid int, signum int, posix int) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), uintptr(posix)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exchangedata(path1 string, path2 string, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path1) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(path2) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXCHANGEDATA, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT64, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), uintptr(length>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES64, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := RawSyscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(fromfd int, from string, tofd int, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(offset>>32), uintptr(whence), 0, 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := Syscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setprivexec(flag int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIVEXEC, uintptr(flag), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), uintptr(length>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos), uintptr(pos>>32), 0, 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func gettimeofday(tp *Timeval) (sec int32, usec int32, err error) { + r0, r1, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + sec = int32(r0) + usec = int32(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go b/api/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go new file mode 100644 index 0000000..13478dd --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go @@ -0,0 +1,1712 @@ +// mksyscall.pl -tags darwin,arm64 syscall_bsd.go syscall_darwin.go syscall_darwin_arm64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build darwin,arm64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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 bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, 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) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (r int, w int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + r = int(r0) + w = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getxattr(path string, attr string, dest *byte, size int, position uint32, options int) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(dest)), uintptr(size), uintptr(position), uintptr(options)) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setxattr(path string, attr string, data *byte, size int, position uint32, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(data)), uintptr(size), uintptr(position), uintptr(options)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func removexattr(path string, attr string, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func listxattr(path string, dest *byte, size int, options int) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(dest)), uintptr(size), uintptr(options), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kill(pid int, signum int, posix int) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), uintptr(posix)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exchangedata(path1 string, path2 string, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path1) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(path2) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXCHANGEDATA, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT64, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES64, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := RawSyscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(fromfd int, from string, tofd int, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + newoffset = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := Syscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setprivexec(flag int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIVEXEC, uintptr(flag), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos)) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func gettimeofday(tp *Timeval) (sec int64, usec int32, err error) { + r0, r1, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + sec = int64(r0) + usec = int32(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go b/api/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go new file mode 100644 index 0000000..91f36e9 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go @@ -0,0 +1,1508 @@ +// mksyscall.pl -dragonfly -tags dragonfly,amd64 syscall_bsd.go syscall_dragonfly.go syscall_dragonfly_amd64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build dragonfly,amd64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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 bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, 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) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (r int, w int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + r = int(r0) + w = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func extpread(fd int, p []byte, flags int, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EXTPREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(offset), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func extpwrite(fd int, p []byte, flags int, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EXTPWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(offset), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(whence), 0, 0) + newoffset = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), 0, 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go b/api/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go new file mode 100644 index 0000000..a86434a --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go @@ -0,0 +1,1937 @@ +// mksyscall.pl -l32 -tags freebsd,386 syscall_bsd.go syscall_freebsd.go syscall_freebsd_386.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build freebsd,386 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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 bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, 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) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (r int, w int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + r = int(r0) + w = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CapEnter() (err error) { + _, _, e1 := Syscall(SYS_CAP_ENTER, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func capRightsGet(version int, fd int, rightsp *CapRights) (err error) { + _, _, e1 := Syscall(SYS___CAP_RIGHTS_GET, uintptr(version), uintptr(fd), uintptr(unsafe.Pointer(rightsp))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func capRightsLimit(fd int, rightsp *CapRights) (err error) { + _, _, e1 := Syscall(SYS_CAP_RIGHTS_LIMIT, uintptr(fd), uintptr(unsafe.Pointer(rightsp)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListFd(fd int, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FD, uintptr(fd), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_POSIX_FADVISE, uintptr(fd), uintptr(offset), uintptr(offset>>32), uintptr(length), uintptr(length>>32), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), uintptr(length>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Openat(fdat int, path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(fdat), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(fromfd int, from string, tofd int, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(offset>>32), uintptr(whence), 0, 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), uintptr(length>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos), uintptr(pos>>32), 0, 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go b/api/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go new file mode 100644 index 0000000..040e2f7 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go @@ -0,0 +1,1937 @@ +// mksyscall.pl -tags freebsd,amd64 syscall_bsd.go syscall_freebsd.go syscall_freebsd_amd64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build freebsd,amd64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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 bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, 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) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (r int, w int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + r = int(r0) + w = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CapEnter() (err error) { + _, _, e1 := Syscall(SYS_CAP_ENTER, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func capRightsGet(version int, fd int, rightsp *CapRights) (err error) { + _, _, e1 := Syscall(SYS___CAP_RIGHTS_GET, uintptr(version), uintptr(fd), uintptr(unsafe.Pointer(rightsp))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func capRightsLimit(fd int, rightsp *CapRights) (err error) { + _, _, e1 := Syscall(SYS_CAP_RIGHTS_LIMIT, uintptr(fd), uintptr(unsafe.Pointer(rightsp)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListFd(fd int, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FD, uintptr(fd), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_POSIX_FADVISE, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Openat(fdat int, path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(fdat), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(fromfd int, from string, tofd int, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + newoffset = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos)) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go b/api/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go new file mode 100644 index 0000000..cddc5e8 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go @@ -0,0 +1,1937 @@ +// mksyscall.pl -l32 -arm -tags freebsd,arm syscall_bsd.go syscall_freebsd.go syscall_freebsd_arm.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build freebsd,arm + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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 bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, 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) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (r int, w int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + r = int(r0) + w = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CapEnter() (err error) { + _, _, e1 := Syscall(SYS_CAP_ENTER, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func capRightsGet(version int, fd int, rightsp *CapRights) (err error) { + _, _, e1 := Syscall(SYS___CAP_RIGHTS_GET, uintptr(version), uintptr(fd), uintptr(unsafe.Pointer(rightsp))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func capRightsLimit(fd int, rightsp *CapRights) (err error) { + _, _, e1 := Syscall(SYS_CAP_RIGHTS_LIMIT, uintptr(fd), uintptr(unsafe.Pointer(rightsp)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListFd(fd int, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FD, uintptr(fd), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall9(SYS_POSIX_FADVISE, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(length), uintptr(length>>32), uintptr(advice), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall6(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Openat(fdat int, path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(fdat), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(fromfd int, from string, tofd int, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(whence), 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), uintptr(pos>>32), 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go b/api/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go new file mode 100644 index 0000000..433becf --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go @@ -0,0 +1,2005 @@ +// mksyscall.pl -l32 -tags linux,386 syscall_linux.go syscall_linux_386.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,386 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + SyscallNoError(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(off>>32), uintptr(len), uintptr(len>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _ := RawSyscallNoError(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _ := RawSyscallNoError(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_STATX, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mask), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + SyscallNoError(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, r1, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]_C_int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_FADVISE64_64, uintptr(fd), uintptr(offset), uintptr(offset>>32), uintptr(length), uintptr(length>>32), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN32, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT64, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE64, uintptr(fd), uintptr(length), uintptr(length>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _ := RawSyscallNoError(SYS_GETEGID32, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _ := RawSyscallNoError(SYS_GETEUID32, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _ := RawSyscallNoError(SYS_GETGID32, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _ := RawSyscallNoError(SYS_GETUID32, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ioperm(from int, num int, on int) (err error) { + _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Iopl(level int) (err error) { + _, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN32, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE64, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID32, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID32, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID32, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID32, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID32, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID32, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(off>>32), uintptr(n), uintptr(n>>32), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE64, uintptr(unsafe.Pointer(_p0)), uintptr(length), uintptr(length>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS32, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS32, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP2, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(pageOffset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getrlimit(resource int, rlim *rlimit32) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setrlimit(resource int, rlim *rlimit32) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Time(t *Time_t) (tt Time_t, err error) { + r0, _, e1 := RawSyscall(SYS_TIME, uintptr(unsafe.Pointer(t)), 0, 0) + tt = Time_t(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go b/api/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go new file mode 100644 index 0000000..33c02b2 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go @@ -0,0 +1,2172 @@ +// mksyscall.pl -tags linux,amd64 syscall_linux.go syscall_linux_amd64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,amd64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + SyscallNoError(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _ := RawSyscallNoError(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _ := RawSyscallNoError(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_STATX, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mask), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + SyscallNoError(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_NEWFSTATAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ioperm(from int, num int, on int) (err error) { + _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Iopl(level int) (err error) { + _, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, buf *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]_C_int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go b/api/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go new file mode 100644 index 0000000..f91b56c --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go @@ -0,0 +1,2107 @@ +// mksyscall.pl -l32 -arm -tags linux,arm syscall_linux.go syscall_linux_arm.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,arm + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + SyscallNoError(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(off>>32), uintptr(len), uintptr(len>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _ := RawSyscallNoError(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _ := RawSyscallNoError(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_STATX, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mask), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + SyscallNoError(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, r1, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS32, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS32, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, flags int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(flags), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN32, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT64, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _ := RawSyscallNoError(SYS_GETEGID32, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _ := RawSyscallNoError(SYS_GETEUID32, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _ := RawSyscallNoError(SYS_GETGID32, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _ := RawSyscallNoError(SYS_GETUID32, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN32, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE64, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID32, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID32, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID32, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID32, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID32, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID32, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_TRUNCATE64, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall6(SYS_FTRUNCATE64, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP2, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(pageOffset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getrlimit(resource int, rlim *rlimit32) (err error) { + _, _, e1 := RawSyscall(SYS_UGETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setrlimit(resource int, rlim *rlimit32) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go b/api/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go new file mode 100644 index 0000000..52d7595 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go @@ -0,0 +1,2065 @@ +// mksyscall.pl -tags linux,arm64 syscall_linux.go syscall_linux_arm64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,arm64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + SyscallNoError(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _ := RawSyscallNoError(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _ := RawSyscallNoError(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_STATX, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mask), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + SyscallNoError(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_PWAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, buf *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go b/api/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go new file mode 100644 index 0000000..970a5c1 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go @@ -0,0 +1,2173 @@ +// mksyscall.pl -b32 -arm -tags linux,mips syscall_linux.go syscall_linux_mipsx.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,mips + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + SyscallNoError(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off>>32), uintptr(off), uintptr(len>>32), uintptr(len)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _ := RawSyscallNoError(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _ := RawSyscallNoError(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_STATX, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mask), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + SyscallNoError(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, r1, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(int64(r0)<<32 | int64(r1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall9(SYS_FADVISE64, uintptr(fd), 0, uintptr(offset>>32), uintptr(offset), uintptr(length>>32), uintptr(length), uintptr(advice), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall6(SYS_FTRUNCATE64, uintptr(fd), 0, uintptr(length>>32), uintptr(length), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset>>32), uintptr(offset)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset>>32), uintptr(offset)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE64, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall9(SYS_SYNC_FILE_RANGE, uintptr(fd), 0, uintptr(off>>32), uintptr(off), uintptr(n>>32), uintptr(n), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_TRUNCATE64, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length>>32), uintptr(length), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ioperm(from int, num int, on int) (err error) { + _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Iopl(level int) (err error) { + _, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Time(t *Time_t) (tt Time_t, err error) { + r0, _, e1 := RawSyscall(SYS_TIME, uintptr(unsafe.Pointer(t)), 0, 0) + tt = Time_t(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT64, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP2, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(pageOffset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getrlimit(resource int, rlim *rlimit32) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setrlimit(resource int, rlim *rlimit32) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go b/api/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go new file mode 100644 index 0000000..b989d0f --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go @@ -0,0 +1,2156 @@ +// mksyscall.pl -tags linux,mips64 syscall_linux.go syscall_linux_mips64x.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,mips64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + SyscallNoError(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _ := RawSyscallNoError(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _ := RawSyscallNoError(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_STATX, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mask), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + SyscallNoError(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_NEWFSTATAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, buf *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fstat(fd int, st *stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(st)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func lstat(path string, st *stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(st)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func stat(path string, st *stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(st)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go b/api/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go new file mode 100644 index 0000000..1f8d14c --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go @@ -0,0 +1,2156 @@ +// mksyscall.pl -tags linux,mips64le syscall_linux.go syscall_linux_mips64x.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,mips64le + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + SyscallNoError(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _ := RawSyscallNoError(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _ := RawSyscallNoError(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_STATX, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mask), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + SyscallNoError(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_NEWFSTATAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, buf *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fstat(fd int, st *stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(st)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func lstat(path string, st *stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(st)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func stat(path string, st *stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(st)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go b/api/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go new file mode 100644 index 0000000..a9c7e52 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go @@ -0,0 +1,2173 @@ +// mksyscall.pl -l32 -arm -tags linux,mipsle syscall_linux.go syscall_linux_mipsx.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,mipsle + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + SyscallNoError(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(off>>32), uintptr(len), uintptr(len>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _ := RawSyscallNoError(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _ := RawSyscallNoError(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_STATX, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mask), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + SyscallNoError(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, r1, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall9(SYS_FADVISE64, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(length), uintptr(length>>32), uintptr(advice), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall6(SYS_FTRUNCATE64, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE64, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall9(SYS_SYNC_FILE_RANGE, uintptr(fd), 0, uintptr(off), uintptr(off>>32), uintptr(n), uintptr(n>>32), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_TRUNCATE64, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ioperm(from int, num int, on int) (err error) { + _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Iopl(level int) (err error) { + _, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Time(t *Time_t) (tt Time_t, err error) { + r0, _, e1 := RawSyscall(SYS_TIME, uintptr(unsafe.Pointer(t)), 0, 0) + tt = Time_t(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT64, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP2, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(pageOffset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getrlimit(resource int, rlim *rlimit32) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setrlimit(resource int, rlim *rlimit32) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go b/api/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go new file mode 100644 index 0000000..3bb9a20 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go @@ -0,0 +1,2219 @@ +// mksyscall.pl -tags linux,ppc64 syscall_linux.go syscall_linux_ppc64x.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,ppc64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + SyscallNoError(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _ := RawSyscallNoError(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _ := RawSyscallNoError(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_STATX, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mask), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + SyscallNoError(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_NEWFSTATAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_UGETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ioperm(from int, num int, on int) (err error) { + _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Iopl(level int) (err error) { + _, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, buf *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE2, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Time(t *Time_t) (tt Time_t, err error) { + r0, _, e1 := RawSyscall(SYS_TIME, uintptr(unsafe.Pointer(t)), 0, 0) + tt = Time_t(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]_C_int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go b/api/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go new file mode 100644 index 0000000..5611662 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go @@ -0,0 +1,2219 @@ +// mksyscall.pl -tags linux,ppc64le syscall_linux.go syscall_linux_ppc64x.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,ppc64le + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + SyscallNoError(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _ := RawSyscallNoError(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _ := RawSyscallNoError(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_STATX, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mask), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + SyscallNoError(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_NEWFSTATAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_UGETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ioperm(from int, num int, on int) (err error) { + _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Iopl(level int) (err error) { + _, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, buf *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE2, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Time(t *Time_t) (tt Time_t, err error) { + r0, _, e1 := RawSyscall(SYS_TIME, uintptr(unsafe.Pointer(t)), 0, 0) + tt = Time_t(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]_C_int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go b/api/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go new file mode 100644 index 0000000..9696a01 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go @@ -0,0 +1,1989 @@ +// mksyscall.pl -tags linux,s390x syscall_linux.go syscall_linux_s390x.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,s390x + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + SyscallNoError(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _ := RawSyscallNoError(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _ := RawSyscallNoError(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_STATX, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mask), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + SyscallNoError(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_NEWFSTATAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, buf *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go b/api/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go new file mode 100644 index 0000000..c01b3b6 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go @@ -0,0 +1,1843 @@ +// mksyscall.pl -tags linux,sparc64 syscall_linux.go syscall_linux_sparc64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,sparc64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + Syscall(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, buf *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]_C_int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go b/api/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go new file mode 100644 index 0000000..fb4b962 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go @@ -0,0 +1,1424 @@ +// mksyscall.pl -l32 -netbsd -tags netbsd,386 syscall_bsd.go syscall_netbsd.go syscall_netbsd_386.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build netbsd,386 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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 bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, 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) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (fd1 int, fd2 int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + fd1 = int(r0) + fd2 = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall9(SYS_POSIX_FADVISE, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), 0, uintptr(length), uintptr(length>>32), uintptr(advice), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall6(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(whence), 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), uintptr(pos>>32), 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go b/api/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go new file mode 100644 index 0000000..beac82e --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go @@ -0,0 +1,1424 @@ +// mksyscall.pl -netbsd -tags netbsd,amd64 syscall_bsd.go syscall_netbsd.go syscall_netbsd_amd64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build netbsd,amd64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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 bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, 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) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (fd1 int, fd2 int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + fd1 = int(r0) + fd2 = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_POSIX_FADVISE, uintptr(fd), 0, uintptr(offset), 0, uintptr(length), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(whence), 0, 0) + newoffset = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), 0, 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go b/api/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go new file mode 100644 index 0000000..7bd5f60 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go @@ -0,0 +1,1424 @@ +// mksyscall.pl -l32 -netbsd -arm -tags netbsd,arm syscall_bsd.go syscall_netbsd.go syscall_netbsd_arm.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build netbsd,arm + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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 bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, 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) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (fd1 int, fd2 int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + fd1 = int(r0) + fd2 = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall9(SYS_POSIX_FADVISE, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), 0, uintptr(length), uintptr(length>>32), uintptr(advice), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall6(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(whence), 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), uintptr(pos>>32), 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go b/api/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go new file mode 100644 index 0000000..49b3b5e --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go @@ -0,0 +1,1493 @@ +// mksyscall.pl -l32 -openbsd -tags openbsd,386 syscall_bsd.go syscall_openbsd.go syscall_openbsd_386.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build openbsd,386 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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 bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, 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) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]_C_int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall6(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrtable() (rtable int, err error) { + r0, _, e1 := RawSyscall(SYS_GETRTABLE, 0, 0, 0) + rtable = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(whence), 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrtable(rtable int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRTABLE, uintptr(rtable), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), uintptr(pos>>32), 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go b/api/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go new file mode 100644 index 0000000..c4c7d85 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go @@ -0,0 +1,1493 @@ +// mksyscall.pl -openbsd -tags openbsd,amd64 syscall_bsd.go syscall_openbsd.go syscall_openbsd_amd64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build openbsd,amd64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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 bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, 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) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]_C_int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrtable() (rtable int, err error) { + r0, _, e1 := RawSyscall(SYS_GETRTABLE, 0, 0, 0) + rtable = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(whence), 0, 0) + newoffset = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrtable(rtable int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRTABLE, uintptr(rtable), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), 0, 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go b/api/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go new file mode 100644 index 0000000..210285b --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go @@ -0,0 +1,1493 @@ +// mksyscall.pl -l32 -openbsd -arm -tags openbsd,arm syscall_bsd.go syscall_openbsd.go syscall_openbsd_arm.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build openbsd,arm + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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 bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, 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) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]_C_int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall6(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrtable() (rtable int, err error) { + r0, _, e1 := RawSyscall(SYS_GETRTABLE, 0, 0, 0) + rtable = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(whence), 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrtable(rtable int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRTABLE, uintptr(rtable), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), uintptr(pos>>32), 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/api/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go b/api/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go new file mode 100644 index 0000000..3978963 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go @@ -0,0 +1,1681 @@ +// mksyscall_solaris.pl -tags solaris,amd64 syscall_solaris.go syscall_solaris_amd64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build solaris,amd64 + +package unix + +import ( + "syscall" + "unsafe" +) + +//go:cgo_import_dynamic libc_pipe pipe "libc.so" +//go:cgo_import_dynamic libc_getsockname getsockname "libsocket.so" +//go:cgo_import_dynamic libc_getcwd getcwd "libc.so" +//go:cgo_import_dynamic libc_getgroups getgroups "libc.so" +//go:cgo_import_dynamic libc_setgroups setgroups "libc.so" +//go:cgo_import_dynamic libc_wait4 wait4 "libc.so" +//go:cgo_import_dynamic libc_gethostname gethostname "libc.so" +//go:cgo_import_dynamic libc_utimes utimes "libc.so" +//go:cgo_import_dynamic libc_utimensat utimensat "libc.so" +//go:cgo_import_dynamic libc_fcntl fcntl "libc.so" +//go:cgo_import_dynamic libc_futimesat futimesat "libc.so" +//go:cgo_import_dynamic libc_accept accept "libsocket.so" +//go:cgo_import_dynamic libc___xnet_recvmsg __xnet_recvmsg "libsocket.so" +//go:cgo_import_dynamic libc___xnet_sendmsg __xnet_sendmsg "libsocket.so" +//go:cgo_import_dynamic libc_acct acct "libc.so" +//go:cgo_import_dynamic libc___makedev __makedev "libc.so" +//go:cgo_import_dynamic libc___major __major "libc.so" +//go:cgo_import_dynamic libc___minor __minor "libc.so" +//go:cgo_import_dynamic libc_ioctl ioctl "libc.so" +//go:cgo_import_dynamic libc_poll poll "libc.so" +//go:cgo_import_dynamic libc_access access "libc.so" +//go:cgo_import_dynamic libc_adjtime adjtime "libc.so" +//go:cgo_import_dynamic libc_chdir chdir "libc.so" +//go:cgo_import_dynamic libc_chmod chmod "libc.so" +//go:cgo_import_dynamic libc_chown chown "libc.so" +//go:cgo_import_dynamic libc_chroot chroot "libc.so" +//go:cgo_import_dynamic libc_close close "libc.so" +//go:cgo_import_dynamic libc_creat creat "libc.so" +//go:cgo_import_dynamic libc_dup dup "libc.so" +//go:cgo_import_dynamic libc_dup2 dup2 "libc.so" +//go:cgo_import_dynamic libc_exit exit "libc.so" +//go:cgo_import_dynamic libc_fchdir fchdir "libc.so" +//go:cgo_import_dynamic libc_fchmod fchmod "libc.so" +//go:cgo_import_dynamic libc_fchmodat fchmodat "libc.so" +//go:cgo_import_dynamic libc_fchown fchown "libc.so" +//go:cgo_import_dynamic libc_fchownat fchownat "libc.so" +//go:cgo_import_dynamic libc_fdatasync fdatasync "libc.so" +//go:cgo_import_dynamic libc_flock flock "libc.so" +//go:cgo_import_dynamic libc_fpathconf fpathconf "libc.so" +//go:cgo_import_dynamic libc_fstat fstat "libc.so" +//go:cgo_import_dynamic libc_fstatat fstatat "libc.so" +//go:cgo_import_dynamic libc_fstatvfs fstatvfs "libc.so" +//go:cgo_import_dynamic libc_getdents getdents "libc.so" +//go:cgo_import_dynamic libc_getgid getgid "libc.so" +//go:cgo_import_dynamic libc_getpid getpid "libc.so" +//go:cgo_import_dynamic libc_getpgid getpgid "libc.so" +//go:cgo_import_dynamic libc_getpgrp getpgrp "libc.so" +//go:cgo_import_dynamic libc_geteuid geteuid "libc.so" +//go:cgo_import_dynamic libc_getegid getegid "libc.so" +//go:cgo_import_dynamic libc_getppid getppid "libc.so" +//go:cgo_import_dynamic libc_getpriority getpriority "libc.so" +//go:cgo_import_dynamic libc_getrlimit getrlimit "libc.so" +//go:cgo_import_dynamic libc_getrusage getrusage "libc.so" +//go:cgo_import_dynamic libc_gettimeofday gettimeofday "libc.so" +//go:cgo_import_dynamic libc_getuid getuid "libc.so" +//go:cgo_import_dynamic libc_kill kill "libc.so" +//go:cgo_import_dynamic libc_lchown lchown "libc.so" +//go:cgo_import_dynamic libc_link link "libc.so" +//go:cgo_import_dynamic libc___xnet_llisten __xnet_llisten "libsocket.so" +//go:cgo_import_dynamic libc_lstat lstat "libc.so" +//go:cgo_import_dynamic libc_madvise madvise "libc.so" +//go:cgo_import_dynamic libc_mkdir mkdir "libc.so" +//go:cgo_import_dynamic libc_mkdirat mkdirat "libc.so" +//go:cgo_import_dynamic libc_mkfifo mkfifo "libc.so" +//go:cgo_import_dynamic libc_mkfifoat mkfifoat "libc.so" +//go:cgo_import_dynamic libc_mknod mknod "libc.so" +//go:cgo_import_dynamic libc_mknodat mknodat "libc.so" +//go:cgo_import_dynamic libc_mlock mlock "libc.so" +//go:cgo_import_dynamic libc_mlockall mlockall "libc.so" +//go:cgo_import_dynamic libc_mprotect mprotect "libc.so" +//go:cgo_import_dynamic libc_msync msync "libc.so" +//go:cgo_import_dynamic libc_munlock munlock "libc.so" +//go:cgo_import_dynamic libc_munlockall munlockall "libc.so" +//go:cgo_import_dynamic libc_nanosleep nanosleep "libc.so" +//go:cgo_import_dynamic libc_open open "libc.so" +//go:cgo_import_dynamic libc_openat openat "libc.so" +//go:cgo_import_dynamic libc_pathconf pathconf "libc.so" +//go:cgo_import_dynamic libc_pause pause "libc.so" +//go:cgo_import_dynamic libc_pread pread "libc.so" +//go:cgo_import_dynamic libc_pwrite pwrite "libc.so" +//go:cgo_import_dynamic libc_read read "libc.so" +//go:cgo_import_dynamic libc_readlink readlink "libc.so" +//go:cgo_import_dynamic libc_rename rename "libc.so" +//go:cgo_import_dynamic libc_renameat renameat "libc.so" +//go:cgo_import_dynamic libc_rmdir rmdir "libc.so" +//go:cgo_import_dynamic libc_lseek lseek "libc.so" +//go:cgo_import_dynamic libc_select select "libc.so" +//go:cgo_import_dynamic libc_setegid setegid "libc.so" +//go:cgo_import_dynamic libc_seteuid seteuid "libc.so" +//go:cgo_import_dynamic libc_setgid setgid "libc.so" +//go:cgo_import_dynamic libc_sethostname sethostname "libc.so" +//go:cgo_import_dynamic libc_setpgid setpgid "libc.so" +//go:cgo_import_dynamic libc_setpriority setpriority "libc.so" +//go:cgo_import_dynamic libc_setregid setregid "libc.so" +//go:cgo_import_dynamic libc_setreuid setreuid "libc.so" +//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.so" +//go:cgo_import_dynamic libc_setsid setsid "libc.so" +//go:cgo_import_dynamic libc_setuid setuid "libc.so" +//go:cgo_import_dynamic libc_shutdown shutdown "libsocket.so" +//go:cgo_import_dynamic libc_stat stat "libc.so" +//go:cgo_import_dynamic libc_statvfs statvfs "libc.so" +//go:cgo_import_dynamic libc_symlink symlink "libc.so" +//go:cgo_import_dynamic libc_sync sync "libc.so" +//go:cgo_import_dynamic libc_times times "libc.so" +//go:cgo_import_dynamic libc_truncate truncate "libc.so" +//go:cgo_import_dynamic libc_fsync fsync "libc.so" +//go:cgo_import_dynamic libc_ftruncate ftruncate "libc.so" +//go:cgo_import_dynamic libc_umask umask "libc.so" +//go:cgo_import_dynamic libc_uname uname "libc.so" +//go:cgo_import_dynamic libc_umount umount "libc.so" +//go:cgo_import_dynamic libc_unlink unlink "libc.so" +//go:cgo_import_dynamic libc_unlinkat unlinkat "libc.so" +//go:cgo_import_dynamic libc_ustat ustat "libc.so" +//go:cgo_import_dynamic libc_utime utime "libc.so" +//go:cgo_import_dynamic libc___xnet_bind __xnet_bind "libsocket.so" +//go:cgo_import_dynamic libc___xnet_connect __xnet_connect "libsocket.so" +//go:cgo_import_dynamic libc_mmap mmap "libc.so" +//go:cgo_import_dynamic libc_munmap munmap "libc.so" +//go:cgo_import_dynamic libc_sendfile sendfile "libsendfile.so" +//go:cgo_import_dynamic libc___xnet_sendto __xnet_sendto "libsocket.so" +//go:cgo_import_dynamic libc___xnet_socket __xnet_socket "libsocket.so" +//go:cgo_import_dynamic libc___xnet_socketpair __xnet_socketpair "libsocket.so" +//go:cgo_import_dynamic libc_write write "libc.so" +//go:cgo_import_dynamic libc___xnet_getsockopt __xnet_getsockopt "libsocket.so" +//go:cgo_import_dynamic libc_getpeername getpeername "libsocket.so" +//go:cgo_import_dynamic libc_setsockopt setsockopt "libsocket.so" +//go:cgo_import_dynamic libc_recvfrom recvfrom "libsocket.so" + +//go:linkname procpipe libc_pipe +//go:linkname procgetsockname libc_getsockname +//go:linkname procGetcwd libc_getcwd +//go:linkname procgetgroups libc_getgroups +//go:linkname procsetgroups libc_setgroups +//go:linkname procwait4 libc_wait4 +//go:linkname procgethostname libc_gethostname +//go:linkname procutimes libc_utimes +//go:linkname procutimensat libc_utimensat +//go:linkname procfcntl libc_fcntl +//go:linkname procfutimesat libc_futimesat +//go:linkname procaccept libc_accept +//go:linkname proc__xnet_recvmsg libc___xnet_recvmsg +//go:linkname proc__xnet_sendmsg libc___xnet_sendmsg +//go:linkname procacct libc_acct +//go:linkname proc__makedev libc___makedev +//go:linkname proc__major libc___major +//go:linkname proc__minor libc___minor +//go:linkname procioctl libc_ioctl +//go:linkname procpoll libc_poll +//go:linkname procAccess libc_access +//go:linkname procAdjtime libc_adjtime +//go:linkname procChdir libc_chdir +//go:linkname procChmod libc_chmod +//go:linkname procChown libc_chown +//go:linkname procChroot libc_chroot +//go:linkname procClose libc_close +//go:linkname procCreat libc_creat +//go:linkname procDup libc_dup +//go:linkname procDup2 libc_dup2 +//go:linkname procExit libc_exit +//go:linkname procFchdir libc_fchdir +//go:linkname procFchmod libc_fchmod +//go:linkname procFchmodat libc_fchmodat +//go:linkname procFchown libc_fchown +//go:linkname procFchownat libc_fchownat +//go:linkname procFdatasync libc_fdatasync +//go:linkname procFlock libc_flock +//go:linkname procFpathconf libc_fpathconf +//go:linkname procFstat libc_fstat +//go:linkname procFstatat libc_fstatat +//go:linkname procFstatvfs libc_fstatvfs +//go:linkname procGetdents libc_getdents +//go:linkname procGetgid libc_getgid +//go:linkname procGetpid libc_getpid +//go:linkname procGetpgid libc_getpgid +//go:linkname procGetpgrp libc_getpgrp +//go:linkname procGeteuid libc_geteuid +//go:linkname procGetegid libc_getegid +//go:linkname procGetppid libc_getppid +//go:linkname procGetpriority libc_getpriority +//go:linkname procGetrlimit libc_getrlimit +//go:linkname procGetrusage libc_getrusage +//go:linkname procGettimeofday libc_gettimeofday +//go:linkname procGetuid libc_getuid +//go:linkname procKill libc_kill +//go:linkname procLchown libc_lchown +//go:linkname procLink libc_link +//go:linkname proc__xnet_llisten libc___xnet_llisten +//go:linkname procLstat libc_lstat +//go:linkname procMadvise libc_madvise +//go:linkname procMkdir libc_mkdir +//go:linkname procMkdirat libc_mkdirat +//go:linkname procMkfifo libc_mkfifo +//go:linkname procMkfifoat libc_mkfifoat +//go:linkname procMknod libc_mknod +//go:linkname procMknodat libc_mknodat +//go:linkname procMlock libc_mlock +//go:linkname procMlockall libc_mlockall +//go:linkname procMprotect libc_mprotect +//go:linkname procMsync libc_msync +//go:linkname procMunlock libc_munlock +//go:linkname procMunlockall libc_munlockall +//go:linkname procNanosleep libc_nanosleep +//go:linkname procOpen libc_open +//go:linkname procOpenat libc_openat +//go:linkname procPathconf libc_pathconf +//go:linkname procPause libc_pause +//go:linkname procPread libc_pread +//go:linkname procPwrite libc_pwrite +//go:linkname procread libc_read +//go:linkname procReadlink libc_readlink +//go:linkname procRename libc_rename +//go:linkname procRenameat libc_renameat +//go:linkname procRmdir libc_rmdir +//go:linkname proclseek libc_lseek +//go:linkname procSelect libc_select +//go:linkname procSetegid libc_setegid +//go:linkname procSeteuid libc_seteuid +//go:linkname procSetgid libc_setgid +//go:linkname procSethostname libc_sethostname +//go:linkname procSetpgid libc_setpgid +//go:linkname procSetpriority libc_setpriority +//go:linkname procSetregid libc_setregid +//go:linkname procSetreuid libc_setreuid +//go:linkname procSetrlimit libc_setrlimit +//go:linkname procSetsid libc_setsid +//go:linkname procSetuid libc_setuid +//go:linkname procshutdown libc_shutdown +//go:linkname procStat libc_stat +//go:linkname procStatvfs libc_statvfs +//go:linkname procSymlink libc_symlink +//go:linkname procSync libc_sync +//go:linkname procTimes libc_times +//go:linkname procTruncate libc_truncate +//go:linkname procFsync libc_fsync +//go:linkname procFtruncate libc_ftruncate +//go:linkname procUmask libc_umask +//go:linkname procUname libc_uname +//go:linkname procumount libc_umount +//go:linkname procUnlink libc_unlink +//go:linkname procUnlinkat libc_unlinkat +//go:linkname procUstat libc_ustat +//go:linkname procUtime libc_utime +//go:linkname proc__xnet_bind libc___xnet_bind +//go:linkname proc__xnet_connect libc___xnet_connect +//go:linkname procmmap libc_mmap +//go:linkname procmunmap libc_munmap +//go:linkname procsendfile libc_sendfile +//go:linkname proc__xnet_sendto libc___xnet_sendto +//go:linkname proc__xnet_socket libc___xnet_socket +//go:linkname proc__xnet_socketpair libc___xnet_socketpair +//go:linkname procwrite libc_write +//go:linkname proc__xnet_getsockopt libc___xnet_getsockopt +//go:linkname procgetpeername libc_getpeername +//go:linkname procsetsockopt libc_setsockopt +//go:linkname procrecvfrom libc_recvfrom + +var ( + procpipe, + procgetsockname, + procGetcwd, + procgetgroups, + procsetgroups, + procwait4, + procgethostname, + procutimes, + procutimensat, + procfcntl, + procfutimesat, + procaccept, + proc__xnet_recvmsg, + proc__xnet_sendmsg, + procacct, + proc__makedev, + proc__major, + proc__minor, + procioctl, + procpoll, + procAccess, + procAdjtime, + procChdir, + procChmod, + procChown, + procChroot, + procClose, + procCreat, + procDup, + procDup2, + procExit, + procFchdir, + procFchmod, + procFchmodat, + procFchown, + procFchownat, + procFdatasync, + procFlock, + procFpathconf, + procFstat, + procFstatat, + procFstatvfs, + procGetdents, + procGetgid, + procGetpid, + procGetpgid, + procGetpgrp, + procGeteuid, + procGetegid, + procGetppid, + procGetpriority, + procGetrlimit, + procGetrusage, + procGettimeofday, + procGetuid, + procKill, + procLchown, + procLink, + proc__xnet_llisten, + procLstat, + procMadvise, + procMkdir, + procMkdirat, + procMkfifo, + procMkfifoat, + procMknod, + procMknodat, + procMlock, + procMlockall, + procMprotect, + procMsync, + procMunlock, + procMunlockall, + procNanosleep, + procOpen, + procOpenat, + procPathconf, + procPause, + procPread, + procPwrite, + procread, + procReadlink, + procRename, + procRenameat, + procRmdir, + proclseek, + procSelect, + procSetegid, + procSeteuid, + procSetgid, + procSethostname, + procSetpgid, + procSetpriority, + procSetregid, + procSetreuid, + procSetrlimit, + procSetsid, + procSetuid, + procshutdown, + procStat, + procStatvfs, + procSymlink, + procSync, + procTimes, + procTruncate, + procFsync, + procFtruncate, + procUmask, + procUname, + procumount, + procUnlink, + procUnlinkat, + procUstat, + procUtime, + proc__xnet_bind, + proc__xnet_connect, + procmmap, + procmunmap, + procsendfile, + proc__xnet_sendto, + proc__xnet_socket, + proc__xnet_socketpair, + procwrite, + proc__xnet_getsockopt, + procgetpeername, + procsetsockopt, + procrecvfrom syscallFunc +) + +func pipe(p *[2]_C_int) (n int, err error) { + r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procpipe)), 1, uintptr(unsafe.Pointer(p)), 0, 0, 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procgetsockname)), 3, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Getcwd(buf []byte) (n int, err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procGetcwd)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), 0, 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procgetgroups)), 2, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0, 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procsetgroups)), 2, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func wait4(pid int32, statusp *_C_int, options int, rusage *Rusage) (wpid int32, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procwait4)), 4, uintptr(pid), uintptr(unsafe.Pointer(statusp)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int32(r0) + if e1 != 0 { + err = e1 + } + return +} + +func gethostname(buf []byte) (n int, err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procgethostname)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), 0, 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procutimes)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func utimensat(fd int, path string, times *[2]Timespec, flag int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procutimensat)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flag), 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procfcntl)), 3, uintptr(fd), uintptr(cmd), uintptr(arg), 0, 0, 0) + val = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func futimesat(fildes int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procfutimesat)), 3, uintptr(fildes), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times)), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procaccept)), 3, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_recvmsg)), 3, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_sendmsg)), 3, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func acct(path *byte) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procacct)), 1, uintptr(unsafe.Pointer(path)), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func __makedev(version int, major uint, minor uint) (val uint64) { + r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&proc__makedev)), 3, uintptr(version), uintptr(major), uintptr(minor), 0, 0, 0) + val = uint64(r0) + return +} + +func __major(version int, dev uint64) (val uint) { + r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&proc__major)), 2, uintptr(version), uintptr(dev), 0, 0, 0, 0) + val = uint(r0) + return +} + +func __minor(version int, dev uint64) (val uint) { + r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&proc__minor)), 2, uintptr(version), uintptr(dev), 0, 0, 0, 0) + val = uint(r0) + return +} + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procioctl)), 3, uintptr(fd), uintptr(req), uintptr(arg), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procpoll)), 3, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procAccess)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procAdjtime)), 2, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChdir)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChmod)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChown)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChroot)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Close(fd int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procClose)), 1, uintptr(fd), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Creat(path string, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procCreat)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procDup)), 1, uintptr(fd), 0, 0, 0, 0, 0) + nfd = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procDup2)), 2, uintptr(oldfd), uintptr(newfd), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Exit(code int) { + sysvicall6(uintptr(unsafe.Pointer(&procExit)), 1, uintptr(code), 0, 0, 0, 0, 0) + return +} + +func Fchdir(fd int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchdir)), 1, uintptr(fd), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchmod)), 2, uintptr(fd), uintptr(mode), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchmodat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchown)), 3, uintptr(fd), uintptr(uid), uintptr(gid), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchownat)), 5, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = e1 + } + return +} + +func Fdatasync(fd int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFdatasync)), 1, uintptr(fd), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Flock(fd int, how int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFlock)), 2, uintptr(fd), uintptr(how), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFpathconf)), 2, uintptr(fd), uintptr(name), 0, 0, 0, 0) + val = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFstat)), 2, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFstatat)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Fstatvfs(fd int, vfsstat *Statvfs_t) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFstatvfs)), 2, uintptr(fd), uintptr(unsafe.Pointer(vfsstat)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Getdents(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procGetdents)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Getgid() (gid int) { + r0, _, _ := rawSysvicall6(uintptr(unsafe.Pointer(&procGetgid)), 0, 0, 0, 0, 0, 0, 0) + gid = int(r0) + return +} + +func Getpid() (pid int) { + r0, _, _ := rawSysvicall6(uintptr(unsafe.Pointer(&procGetpid)), 0, 0, 0, 0, 0, 0, 0) + pid = int(r0) + return +} + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetpgid)), 1, uintptr(pid), 0, 0, 0, 0, 0) + pgid = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Getpgrp() (pgid int, err error) { + r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetpgrp)), 0, 0, 0, 0, 0, 0, 0) + pgid = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Geteuid() (euid int) { + r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procGeteuid)), 0, 0, 0, 0, 0, 0, 0) + euid = int(r0) + return +} + +func Getegid() (egid int) { + r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procGetegid)), 0, 0, 0, 0, 0, 0, 0) + egid = int(r0) + return +} + +func Getppid() (ppid int) { + r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procGetppid)), 0, 0, 0, 0, 0, 0, 0) + ppid = int(r0) + return +} + +func Getpriority(which int, who int) (n int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procGetpriority)), 2, uintptr(which), uintptr(who), 0, 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetrlimit)), 2, uintptr(which), uintptr(unsafe.Pointer(lim)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetrusage)), 2, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGettimeofday)), 1, uintptr(unsafe.Pointer(tv)), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Getuid() (uid int) { + r0, _, _ := rawSysvicall6(uintptr(unsafe.Pointer(&procGetuid)), 0, 0, 0, 0, 0, 0, 0) + uid = int(r0) + return +} + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procKill)), 2, uintptr(pid), uintptr(signum), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procLchown)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procLink)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Listen(s int, backlog int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_llisten)), 2, uintptr(s), uintptr(backlog), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procLstat)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Madvise(b []byte, advice int) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMadvise)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(advice), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkdir)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkdirat)), 3, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkfifo)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Mkfifoat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkfifoat)), 3, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMknod)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMknodat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Mlock(b []byte) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMlock)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Mlockall(flags int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMlockall)), 1, uintptr(flags), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Mprotect(b []byte, prot int) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMprotect)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(prot), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Msync(b []byte, flags int) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMsync)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(flags), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Munlock(b []byte) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMunlock)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Munlockall() (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMunlockall)), 0, 0, 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procNanosleep)), 2, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procOpen)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procOpenat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procPathconf)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0, 0, 0, 0) + val = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Pause() (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procPause)), 0, 0, 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procPread)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procPwrite)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func read(fd int, p []byte) (n int, err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procread)), 3, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + if len(buf) > 0 { + _p1 = &buf[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procReadlink)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(len(buf)), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procRename)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procRenameat)), 4, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procRmdir)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proclseek)), 3, uintptr(fd), uintptr(offset), uintptr(whence), 0, 0, 0) + newoffset = int64(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSelect)), 5, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = e1 + } + return +} + +func Setegid(egid int) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetegid)), 1, uintptr(egid), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Seteuid(euid int) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSeteuid)), 1, uintptr(euid), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Setgid(gid int) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetgid)), 1, uintptr(gid), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Sethostname(p []byte) (err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSethostname)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetpgid)), 2, uintptr(pid), uintptr(pgid), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSetpriority)), 3, uintptr(which), uintptr(who), uintptr(prio), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetregid)), 2, uintptr(rgid), uintptr(egid), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetreuid)), 2, uintptr(ruid), uintptr(euid), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetrlimit)), 2, uintptr(which), uintptr(unsafe.Pointer(lim)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Setsid() (pid int, err error) { + r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetsid)), 0, 0, 0, 0, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Setuid(uid int) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetuid)), 1, uintptr(uid), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Shutdown(s int, how int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procshutdown)), 2, uintptr(s), uintptr(how), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procStat)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Statvfs(path string, vfsstat *Statvfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procStatvfs)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(vfsstat)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSymlink)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Sync() (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSync)), 0, 0, 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procTimes)), 1, uintptr(unsafe.Pointer(tms)), 0, 0, 0, 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procTruncate)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Fsync(fd int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFsync)), 1, uintptr(fd), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFtruncate)), 2, uintptr(fd), uintptr(length), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Umask(mask int) (oldmask int) { + r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procUmask)), 1, uintptr(mask), 0, 0, 0, 0, 0) + oldmask = int(r0) + return +} + +func Uname(buf *Utsname) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procUname)), 1, uintptr(unsafe.Pointer(buf)), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procumount)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUnlink)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUnlinkat)), 3, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUstat)), 2, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUtime)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_bind)), 3, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_connect)), 3, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procmmap)), 6, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos)) + ret = uintptr(r0) + if e1 != 0 { + err = e1 + } + return +} + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procmunmap)), 2, uintptr(addr), uintptr(length), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procsendfile)), 4, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_sendto)), 6, uintptr(s), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = e1 + } + return +} + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_socket)), 3, uintptr(domain), uintptr(typ), uintptr(proto), 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&proc__xnet_socketpair)), 4, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func write(fd int, p []byte) (n int, err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procwrite)), 3, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_getsockopt)), 5, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = e1 + } + return +} + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procgetpeername)), 3, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procsetsockopt)), 5, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = e1 + } + return +} + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procrecvfrom)), 6, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} diff --git a/api/vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go b/api/vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go new file mode 100644 index 0000000..83bb935 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go @@ -0,0 +1,270 @@ +// mksysctl_openbsd.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +package unix + +type mibentry struct { + ctlname string + ctloid []_C_int +} + +var sysctlMib = []mibentry{ + {"ddb.console", []_C_int{9, 6}}, + {"ddb.log", []_C_int{9, 7}}, + {"ddb.max_line", []_C_int{9, 3}}, + {"ddb.max_width", []_C_int{9, 2}}, + {"ddb.panic", []_C_int{9, 5}}, + {"ddb.radix", []_C_int{9, 1}}, + {"ddb.tab_stop_width", []_C_int{9, 4}}, + {"ddb.trigger", []_C_int{9, 8}}, + {"fs.posix.setuid", []_C_int{3, 1, 1}}, + {"hw.allowpowerdown", []_C_int{6, 22}}, + {"hw.byteorder", []_C_int{6, 4}}, + {"hw.cpuspeed", []_C_int{6, 12}}, + {"hw.diskcount", []_C_int{6, 10}}, + {"hw.disknames", []_C_int{6, 8}}, + {"hw.diskstats", []_C_int{6, 9}}, + {"hw.machine", []_C_int{6, 1}}, + {"hw.model", []_C_int{6, 2}}, + {"hw.ncpu", []_C_int{6, 3}}, + {"hw.ncpufound", []_C_int{6, 21}}, + {"hw.pagesize", []_C_int{6, 7}}, + {"hw.physmem", []_C_int{6, 19}}, + {"hw.product", []_C_int{6, 15}}, + {"hw.serialno", []_C_int{6, 17}}, + {"hw.setperf", []_C_int{6, 13}}, + {"hw.usermem", []_C_int{6, 20}}, + {"hw.uuid", []_C_int{6, 18}}, + {"hw.vendor", []_C_int{6, 14}}, + {"hw.version", []_C_int{6, 16}}, + {"kern.arandom", []_C_int{1, 37}}, + {"kern.argmax", []_C_int{1, 8}}, + {"kern.boottime", []_C_int{1, 21}}, + {"kern.bufcachepercent", []_C_int{1, 72}}, + {"kern.ccpu", []_C_int{1, 45}}, + {"kern.clockrate", []_C_int{1, 12}}, + {"kern.consdev", []_C_int{1, 75}}, + {"kern.cp_time", []_C_int{1, 40}}, + {"kern.cp_time2", []_C_int{1, 71}}, + {"kern.cryptodevallowsoft", []_C_int{1, 53}}, + {"kern.domainname", []_C_int{1, 22}}, + {"kern.file", []_C_int{1, 73}}, + {"kern.forkstat", []_C_int{1, 42}}, + {"kern.fscale", []_C_int{1, 46}}, + {"kern.fsync", []_C_int{1, 33}}, + {"kern.hostid", []_C_int{1, 11}}, + {"kern.hostname", []_C_int{1, 10}}, + {"kern.intrcnt.nintrcnt", []_C_int{1, 63, 1}}, + {"kern.job_control", []_C_int{1, 19}}, + {"kern.malloc.buckets", []_C_int{1, 39, 1}}, + {"kern.malloc.kmemnames", []_C_int{1, 39, 3}}, + {"kern.maxclusters", []_C_int{1, 67}}, + {"kern.maxfiles", []_C_int{1, 7}}, + {"kern.maxlocksperuid", []_C_int{1, 70}}, + {"kern.maxpartitions", []_C_int{1, 23}}, + {"kern.maxproc", []_C_int{1, 6}}, + {"kern.maxthread", []_C_int{1, 25}}, + {"kern.maxvnodes", []_C_int{1, 5}}, + {"kern.mbstat", []_C_int{1, 59}}, + {"kern.msgbuf", []_C_int{1, 48}}, + {"kern.msgbufsize", []_C_int{1, 38}}, + {"kern.nchstats", []_C_int{1, 41}}, + {"kern.netlivelocks", []_C_int{1, 76}}, + {"kern.nfiles", []_C_int{1, 56}}, + {"kern.ngroups", []_C_int{1, 18}}, + {"kern.nosuidcoredump", []_C_int{1, 32}}, + {"kern.nprocs", []_C_int{1, 47}}, + {"kern.nselcoll", []_C_int{1, 43}}, + {"kern.nthreads", []_C_int{1, 26}}, + {"kern.numvnodes", []_C_int{1, 58}}, + {"kern.osrelease", []_C_int{1, 2}}, + {"kern.osrevision", []_C_int{1, 3}}, + {"kern.ostype", []_C_int{1, 1}}, + {"kern.osversion", []_C_int{1, 27}}, + {"kern.pool_debug", []_C_int{1, 77}}, + {"kern.posix1version", []_C_int{1, 17}}, + {"kern.proc", []_C_int{1, 66}}, + {"kern.random", []_C_int{1, 31}}, + {"kern.rawpartition", []_C_int{1, 24}}, + {"kern.saved_ids", []_C_int{1, 20}}, + {"kern.securelevel", []_C_int{1, 9}}, + {"kern.seminfo", []_C_int{1, 61}}, + {"kern.shminfo", []_C_int{1, 62}}, + {"kern.somaxconn", []_C_int{1, 28}}, + {"kern.sominconn", []_C_int{1, 29}}, + {"kern.splassert", []_C_int{1, 54}}, + {"kern.stackgap_random", []_C_int{1, 50}}, + {"kern.sysvipc_info", []_C_int{1, 51}}, + {"kern.sysvmsg", []_C_int{1, 34}}, + {"kern.sysvsem", []_C_int{1, 35}}, + {"kern.sysvshm", []_C_int{1, 36}}, + {"kern.timecounter.choice", []_C_int{1, 69, 4}}, + {"kern.timecounter.hardware", []_C_int{1, 69, 3}}, + {"kern.timecounter.tick", []_C_int{1, 69, 1}}, + {"kern.timecounter.timestepwarnings", []_C_int{1, 69, 2}}, + {"kern.tty.maxptys", []_C_int{1, 44, 6}}, + {"kern.tty.nptys", []_C_int{1, 44, 7}}, + {"kern.tty.tk_cancc", []_C_int{1, 44, 4}}, + {"kern.tty.tk_nin", []_C_int{1, 44, 1}}, + {"kern.tty.tk_nout", []_C_int{1, 44, 2}}, + {"kern.tty.tk_rawcc", []_C_int{1, 44, 3}}, + {"kern.tty.ttyinfo", []_C_int{1, 44, 5}}, + {"kern.ttycount", []_C_int{1, 57}}, + {"kern.userasymcrypto", []_C_int{1, 60}}, + {"kern.usercrypto", []_C_int{1, 52}}, + {"kern.usermount", []_C_int{1, 30}}, + {"kern.version", []_C_int{1, 4}}, + {"kern.vnode", []_C_int{1, 13}}, + {"kern.watchdog.auto", []_C_int{1, 64, 2}}, + {"kern.watchdog.period", []_C_int{1, 64, 1}}, + {"net.bpf.bufsize", []_C_int{4, 31, 1}}, + {"net.bpf.maxbufsize", []_C_int{4, 31, 2}}, + {"net.inet.ah.enable", []_C_int{4, 2, 51, 1}}, + {"net.inet.ah.stats", []_C_int{4, 2, 51, 2}}, + {"net.inet.carp.allow", []_C_int{4, 2, 112, 1}}, + {"net.inet.carp.log", []_C_int{4, 2, 112, 3}}, + {"net.inet.carp.preempt", []_C_int{4, 2, 112, 2}}, + {"net.inet.carp.stats", []_C_int{4, 2, 112, 4}}, + {"net.inet.divert.recvspace", []_C_int{4, 2, 258, 1}}, + {"net.inet.divert.sendspace", []_C_int{4, 2, 258, 2}}, + {"net.inet.divert.stats", []_C_int{4, 2, 258, 3}}, + {"net.inet.esp.enable", []_C_int{4, 2, 50, 1}}, + {"net.inet.esp.stats", []_C_int{4, 2, 50, 4}}, + {"net.inet.esp.udpencap", []_C_int{4, 2, 50, 2}}, + {"net.inet.esp.udpencap_port", []_C_int{4, 2, 50, 3}}, + {"net.inet.etherip.allow", []_C_int{4, 2, 97, 1}}, + {"net.inet.etherip.stats", []_C_int{4, 2, 97, 2}}, + {"net.inet.gre.allow", []_C_int{4, 2, 47, 1}}, + {"net.inet.gre.wccp", []_C_int{4, 2, 47, 2}}, + {"net.inet.icmp.bmcastecho", []_C_int{4, 2, 1, 2}}, + {"net.inet.icmp.errppslimit", []_C_int{4, 2, 1, 3}}, + {"net.inet.icmp.maskrepl", []_C_int{4, 2, 1, 1}}, + {"net.inet.icmp.rediraccept", []_C_int{4, 2, 1, 4}}, + {"net.inet.icmp.redirtimeout", []_C_int{4, 2, 1, 5}}, + {"net.inet.icmp.stats", []_C_int{4, 2, 1, 7}}, + {"net.inet.icmp.tstamprepl", []_C_int{4, 2, 1, 6}}, + {"net.inet.igmp.stats", []_C_int{4, 2, 2, 1}}, + {"net.inet.ip.arpqueued", []_C_int{4, 2, 0, 36}}, + {"net.inet.ip.encdebug", []_C_int{4, 2, 0, 12}}, + {"net.inet.ip.forwarding", []_C_int{4, 2, 0, 1}}, + {"net.inet.ip.ifq.congestion", []_C_int{4, 2, 0, 30, 4}}, + {"net.inet.ip.ifq.drops", []_C_int{4, 2, 0, 30, 3}}, + {"net.inet.ip.ifq.len", []_C_int{4, 2, 0, 30, 1}}, + {"net.inet.ip.ifq.maxlen", []_C_int{4, 2, 0, 30, 2}}, + {"net.inet.ip.maxqueue", []_C_int{4, 2, 0, 11}}, + {"net.inet.ip.mforwarding", []_C_int{4, 2, 0, 31}}, + {"net.inet.ip.mrtproto", []_C_int{4, 2, 0, 34}}, + {"net.inet.ip.mrtstats", []_C_int{4, 2, 0, 35}}, + {"net.inet.ip.mtu", []_C_int{4, 2, 0, 4}}, + {"net.inet.ip.mtudisc", []_C_int{4, 2, 0, 27}}, + {"net.inet.ip.mtudisctimeout", []_C_int{4, 2, 0, 28}}, + {"net.inet.ip.multipath", []_C_int{4, 2, 0, 32}}, + {"net.inet.ip.portfirst", []_C_int{4, 2, 0, 7}}, + {"net.inet.ip.porthifirst", []_C_int{4, 2, 0, 9}}, + {"net.inet.ip.porthilast", []_C_int{4, 2, 0, 10}}, + {"net.inet.ip.portlast", []_C_int{4, 2, 0, 8}}, + {"net.inet.ip.redirect", []_C_int{4, 2, 0, 2}}, + {"net.inet.ip.sourceroute", []_C_int{4, 2, 0, 5}}, + {"net.inet.ip.stats", []_C_int{4, 2, 0, 33}}, + {"net.inet.ip.ttl", []_C_int{4, 2, 0, 3}}, + {"net.inet.ipcomp.enable", []_C_int{4, 2, 108, 1}}, + {"net.inet.ipcomp.stats", []_C_int{4, 2, 108, 2}}, + {"net.inet.ipip.allow", []_C_int{4, 2, 4, 1}}, + {"net.inet.ipip.stats", []_C_int{4, 2, 4, 2}}, + {"net.inet.mobileip.allow", []_C_int{4, 2, 55, 1}}, + {"net.inet.pfsync.stats", []_C_int{4, 2, 240, 1}}, + {"net.inet.pim.stats", []_C_int{4, 2, 103, 1}}, + {"net.inet.tcp.ackonpush", []_C_int{4, 2, 6, 13}}, + {"net.inet.tcp.always_keepalive", []_C_int{4, 2, 6, 22}}, + {"net.inet.tcp.baddynamic", []_C_int{4, 2, 6, 6}}, + {"net.inet.tcp.drop", []_C_int{4, 2, 6, 19}}, + {"net.inet.tcp.ecn", []_C_int{4, 2, 6, 14}}, + {"net.inet.tcp.ident", []_C_int{4, 2, 6, 9}}, + {"net.inet.tcp.keepidle", []_C_int{4, 2, 6, 3}}, + {"net.inet.tcp.keepinittime", []_C_int{4, 2, 6, 2}}, + {"net.inet.tcp.keepintvl", []_C_int{4, 2, 6, 4}}, + {"net.inet.tcp.mssdflt", []_C_int{4, 2, 6, 11}}, + {"net.inet.tcp.reasslimit", []_C_int{4, 2, 6, 18}}, + {"net.inet.tcp.rfc1323", []_C_int{4, 2, 6, 1}}, + {"net.inet.tcp.rfc3390", []_C_int{4, 2, 6, 17}}, + {"net.inet.tcp.rstppslimit", []_C_int{4, 2, 6, 12}}, + {"net.inet.tcp.sack", []_C_int{4, 2, 6, 10}}, + {"net.inet.tcp.sackholelimit", []_C_int{4, 2, 6, 20}}, + {"net.inet.tcp.slowhz", []_C_int{4, 2, 6, 5}}, + {"net.inet.tcp.stats", []_C_int{4, 2, 6, 21}}, + {"net.inet.tcp.synbucketlimit", []_C_int{4, 2, 6, 16}}, + {"net.inet.tcp.syncachelimit", []_C_int{4, 2, 6, 15}}, + {"net.inet.udp.baddynamic", []_C_int{4, 2, 17, 2}}, + {"net.inet.udp.checksum", []_C_int{4, 2, 17, 1}}, + {"net.inet.udp.recvspace", []_C_int{4, 2, 17, 3}}, + {"net.inet.udp.sendspace", []_C_int{4, 2, 17, 4}}, + {"net.inet.udp.stats", []_C_int{4, 2, 17, 5}}, + {"net.inet6.divert.recvspace", []_C_int{4, 24, 86, 1}}, + {"net.inet6.divert.sendspace", []_C_int{4, 24, 86, 2}}, + {"net.inet6.divert.stats", []_C_int{4, 24, 86, 3}}, + {"net.inet6.icmp6.errppslimit", []_C_int{4, 24, 30, 14}}, + {"net.inet6.icmp6.mtudisc_hiwat", []_C_int{4, 24, 30, 16}}, + {"net.inet6.icmp6.mtudisc_lowat", []_C_int{4, 24, 30, 17}}, + {"net.inet6.icmp6.nd6_debug", []_C_int{4, 24, 30, 18}}, + {"net.inet6.icmp6.nd6_delay", []_C_int{4, 24, 30, 8}}, + {"net.inet6.icmp6.nd6_maxnudhint", []_C_int{4, 24, 30, 15}}, + {"net.inet6.icmp6.nd6_mmaxtries", []_C_int{4, 24, 30, 10}}, + {"net.inet6.icmp6.nd6_prune", []_C_int{4, 24, 30, 6}}, + {"net.inet6.icmp6.nd6_umaxtries", []_C_int{4, 24, 30, 9}}, + {"net.inet6.icmp6.nd6_useloopback", []_C_int{4, 24, 30, 11}}, + {"net.inet6.icmp6.nodeinfo", []_C_int{4, 24, 30, 13}}, + {"net.inet6.icmp6.rediraccept", []_C_int{4, 24, 30, 2}}, + {"net.inet6.icmp6.redirtimeout", []_C_int{4, 24, 30, 3}}, + {"net.inet6.ip6.accept_rtadv", []_C_int{4, 24, 17, 12}}, + {"net.inet6.ip6.auto_flowlabel", []_C_int{4, 24, 17, 17}}, + {"net.inet6.ip6.dad_count", []_C_int{4, 24, 17, 16}}, + {"net.inet6.ip6.dad_pending", []_C_int{4, 24, 17, 49}}, + {"net.inet6.ip6.defmcasthlim", []_C_int{4, 24, 17, 18}}, + {"net.inet6.ip6.forwarding", []_C_int{4, 24, 17, 1}}, + {"net.inet6.ip6.forwsrcrt", []_C_int{4, 24, 17, 5}}, + {"net.inet6.ip6.hdrnestlimit", []_C_int{4, 24, 17, 15}}, + {"net.inet6.ip6.hlim", []_C_int{4, 24, 17, 3}}, + {"net.inet6.ip6.log_interval", []_C_int{4, 24, 17, 14}}, + {"net.inet6.ip6.maxdynroutes", []_C_int{4, 24, 17, 48}}, + {"net.inet6.ip6.maxfragpackets", []_C_int{4, 24, 17, 9}}, + {"net.inet6.ip6.maxfrags", []_C_int{4, 24, 17, 41}}, + {"net.inet6.ip6.maxifdefrouters", []_C_int{4, 24, 17, 47}}, + {"net.inet6.ip6.maxifprefixes", []_C_int{4, 24, 17, 46}}, + {"net.inet6.ip6.mforwarding", []_C_int{4, 24, 17, 42}}, + {"net.inet6.ip6.mrtproto", []_C_int{4, 24, 17, 8}}, + {"net.inet6.ip6.mtudisctimeout", []_C_int{4, 24, 17, 50}}, + {"net.inet6.ip6.multicast_mtudisc", []_C_int{4, 24, 17, 44}}, + {"net.inet6.ip6.multipath", []_C_int{4, 24, 17, 43}}, + {"net.inet6.ip6.neighborgcthresh", []_C_int{4, 24, 17, 45}}, + {"net.inet6.ip6.redirect", []_C_int{4, 24, 17, 2}}, + {"net.inet6.ip6.rr_prune", []_C_int{4, 24, 17, 22}}, + {"net.inet6.ip6.sourcecheck", []_C_int{4, 24, 17, 10}}, + {"net.inet6.ip6.sourcecheck_logint", []_C_int{4, 24, 17, 11}}, + {"net.inet6.ip6.use_deprecated", []_C_int{4, 24, 17, 21}}, + {"net.inet6.ip6.v6only", []_C_int{4, 24, 17, 24}}, + {"net.key.sadb_dump", []_C_int{4, 30, 1}}, + {"net.key.spd_dump", []_C_int{4, 30, 2}}, + {"net.mpls.ifq.congestion", []_C_int{4, 33, 3, 4}}, + {"net.mpls.ifq.drops", []_C_int{4, 33, 3, 3}}, + {"net.mpls.ifq.len", []_C_int{4, 33, 3, 1}}, + {"net.mpls.ifq.maxlen", []_C_int{4, 33, 3, 2}}, + {"net.mpls.mapttl_ip", []_C_int{4, 33, 5}}, + {"net.mpls.mapttl_ip6", []_C_int{4, 33, 6}}, + {"net.mpls.maxloop_inkernel", []_C_int{4, 33, 4}}, + {"net.mpls.ttl", []_C_int{4, 33, 2}}, + {"net.pflow.stats", []_C_int{4, 34, 1}}, + {"net.pipex.enable", []_C_int{4, 35, 1}}, + {"vm.anonmin", []_C_int{2, 7}}, + {"vm.loadavg", []_C_int{2, 2}}, + {"vm.maxslp", []_C_int{2, 10}}, + {"vm.nkmempages", []_C_int{2, 6}}, + {"vm.psstrings", []_C_int{2, 3}}, + {"vm.swapencrypt.enable", []_C_int{2, 5, 0}}, + {"vm.swapencrypt.keyscreated", []_C_int{2, 5, 1}}, + {"vm.swapencrypt.keysdeleted", []_C_int{2, 5, 2}}, + {"vm.uspace", []_C_int{2, 11}}, + {"vm.uvmexp", []_C_int{2, 4}}, + {"vm.vmmeter", []_C_int{2, 1}}, + {"vm.vnodemin", []_C_int{2, 9}}, + {"vm.vtextmin", []_C_int{2, 8}}, +} diff --git a/api/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go b/api/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go new file mode 100644 index 0000000..207b279 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go @@ -0,0 +1,257 @@ +// mksysctl_openbsd.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build amd64,openbsd + +package unix + +type mibentry struct { + ctlname string + ctloid []_C_int +} + +var sysctlMib = []mibentry{ + {"ddb.console", []_C_int{9, 6}}, + {"ddb.log", []_C_int{9, 7}}, + {"ddb.max_line", []_C_int{9, 3}}, + {"ddb.max_width", []_C_int{9, 2}}, + {"ddb.panic", []_C_int{9, 5}}, + {"ddb.profile", []_C_int{9, 9}}, + {"ddb.radix", []_C_int{9, 1}}, + {"ddb.tab_stop_width", []_C_int{9, 4}}, + {"ddb.trigger", []_C_int{9, 8}}, + {"fs.posix.setuid", []_C_int{3, 1, 1}}, + {"hw.allowpowerdown", []_C_int{6, 22}}, + {"hw.byteorder", []_C_int{6, 4}}, + {"hw.cpuspeed", []_C_int{6, 12}}, + {"hw.diskcount", []_C_int{6, 10}}, + {"hw.disknames", []_C_int{6, 8}}, + {"hw.diskstats", []_C_int{6, 9}}, + {"hw.machine", []_C_int{6, 1}}, + {"hw.model", []_C_int{6, 2}}, + {"hw.ncpu", []_C_int{6, 3}}, + {"hw.ncpufound", []_C_int{6, 21}}, + {"hw.pagesize", []_C_int{6, 7}}, + {"hw.perfpolicy", []_C_int{6, 23}}, + {"hw.physmem", []_C_int{6, 19}}, + {"hw.product", []_C_int{6, 15}}, + {"hw.serialno", []_C_int{6, 17}}, + {"hw.setperf", []_C_int{6, 13}}, + {"hw.usermem", []_C_int{6, 20}}, + {"hw.uuid", []_C_int{6, 18}}, + {"hw.vendor", []_C_int{6, 14}}, + {"hw.version", []_C_int{6, 16}}, + {"kern.allowkmem", []_C_int{1, 52}}, + {"kern.argmax", []_C_int{1, 8}}, + {"kern.boottime", []_C_int{1, 21}}, + {"kern.bufcachepercent", []_C_int{1, 72}}, + {"kern.ccpu", []_C_int{1, 45}}, + {"kern.clockrate", []_C_int{1, 12}}, + {"kern.consdev", []_C_int{1, 75}}, + {"kern.cp_time", []_C_int{1, 40}}, + {"kern.cp_time2", []_C_int{1, 71}}, + {"kern.dnsjackport", []_C_int{1, 13}}, + {"kern.domainname", []_C_int{1, 22}}, + {"kern.file", []_C_int{1, 73}}, + {"kern.forkstat", []_C_int{1, 42}}, + {"kern.fscale", []_C_int{1, 46}}, + {"kern.fsync", []_C_int{1, 33}}, + {"kern.global_ptrace", []_C_int{1, 81}}, + {"kern.hostid", []_C_int{1, 11}}, + {"kern.hostname", []_C_int{1, 10}}, + {"kern.intrcnt.nintrcnt", []_C_int{1, 63, 1}}, + {"kern.job_control", []_C_int{1, 19}}, + {"kern.malloc.buckets", []_C_int{1, 39, 1}}, + {"kern.malloc.kmemnames", []_C_int{1, 39, 3}}, + {"kern.maxclusters", []_C_int{1, 67}}, + {"kern.maxfiles", []_C_int{1, 7}}, + {"kern.maxlocksperuid", []_C_int{1, 70}}, + {"kern.maxpartitions", []_C_int{1, 23}}, + {"kern.maxproc", []_C_int{1, 6}}, + {"kern.maxthread", []_C_int{1, 25}}, + {"kern.maxvnodes", []_C_int{1, 5}}, + {"kern.mbstat", []_C_int{1, 59}}, + {"kern.msgbuf", []_C_int{1, 48}}, + {"kern.msgbufsize", []_C_int{1, 38}}, + {"kern.nchstats", []_C_int{1, 41}}, + {"kern.netlivelocks", []_C_int{1, 76}}, + {"kern.nfiles", []_C_int{1, 56}}, + {"kern.ngroups", []_C_int{1, 18}}, + {"kern.nosuidcoredump", []_C_int{1, 32}}, + {"kern.nprocs", []_C_int{1, 47}}, + {"kern.nselcoll", []_C_int{1, 43}}, + {"kern.nthreads", []_C_int{1, 26}}, + {"kern.numvnodes", []_C_int{1, 58}}, + {"kern.osrelease", []_C_int{1, 2}}, + {"kern.osrevision", []_C_int{1, 3}}, + {"kern.ostype", []_C_int{1, 1}}, + {"kern.osversion", []_C_int{1, 27}}, + {"kern.pool_debug", []_C_int{1, 77}}, + {"kern.posix1version", []_C_int{1, 17}}, + {"kern.proc", []_C_int{1, 66}}, + {"kern.rawpartition", []_C_int{1, 24}}, + {"kern.saved_ids", []_C_int{1, 20}}, + {"kern.securelevel", []_C_int{1, 9}}, + {"kern.seminfo", []_C_int{1, 61}}, + {"kern.shminfo", []_C_int{1, 62}}, + {"kern.somaxconn", []_C_int{1, 28}}, + {"kern.sominconn", []_C_int{1, 29}}, + {"kern.splassert", []_C_int{1, 54}}, + {"kern.stackgap_random", []_C_int{1, 50}}, + {"kern.sysvipc_info", []_C_int{1, 51}}, + {"kern.sysvmsg", []_C_int{1, 34}}, + {"kern.sysvsem", []_C_int{1, 35}}, + {"kern.sysvshm", []_C_int{1, 36}}, + {"kern.timecounter.choice", []_C_int{1, 69, 4}}, + {"kern.timecounter.hardware", []_C_int{1, 69, 3}}, + {"kern.timecounter.tick", []_C_int{1, 69, 1}}, + {"kern.timecounter.timestepwarnings", []_C_int{1, 69, 2}}, + {"kern.tty.tk_cancc", []_C_int{1, 44, 4}}, + {"kern.tty.tk_nin", []_C_int{1, 44, 1}}, + {"kern.tty.tk_nout", []_C_int{1, 44, 2}}, + {"kern.tty.tk_rawcc", []_C_int{1, 44, 3}}, + {"kern.tty.ttyinfo", []_C_int{1, 44, 5}}, + {"kern.ttycount", []_C_int{1, 57}}, + {"kern.version", []_C_int{1, 4}}, + {"kern.watchdog.auto", []_C_int{1, 64, 2}}, + {"kern.watchdog.period", []_C_int{1, 64, 1}}, + {"kern.wxabort", []_C_int{1, 74}}, + {"net.bpf.bufsize", []_C_int{4, 31, 1}}, + {"net.bpf.maxbufsize", []_C_int{4, 31, 2}}, + {"net.inet.ah.enable", []_C_int{4, 2, 51, 1}}, + {"net.inet.ah.stats", []_C_int{4, 2, 51, 2}}, + {"net.inet.carp.allow", []_C_int{4, 2, 112, 1}}, + {"net.inet.carp.log", []_C_int{4, 2, 112, 3}}, + {"net.inet.carp.preempt", []_C_int{4, 2, 112, 2}}, + {"net.inet.carp.stats", []_C_int{4, 2, 112, 4}}, + {"net.inet.divert.recvspace", []_C_int{4, 2, 258, 1}}, + {"net.inet.divert.sendspace", []_C_int{4, 2, 258, 2}}, + {"net.inet.divert.stats", []_C_int{4, 2, 258, 3}}, + {"net.inet.esp.enable", []_C_int{4, 2, 50, 1}}, + {"net.inet.esp.stats", []_C_int{4, 2, 50, 4}}, + {"net.inet.esp.udpencap", []_C_int{4, 2, 50, 2}}, + {"net.inet.esp.udpencap_port", []_C_int{4, 2, 50, 3}}, + {"net.inet.etherip.allow", []_C_int{4, 2, 97, 1}}, + {"net.inet.etherip.stats", []_C_int{4, 2, 97, 2}}, + {"net.inet.gre.allow", []_C_int{4, 2, 47, 1}}, + {"net.inet.gre.wccp", []_C_int{4, 2, 47, 2}}, + {"net.inet.icmp.bmcastecho", []_C_int{4, 2, 1, 2}}, + {"net.inet.icmp.errppslimit", []_C_int{4, 2, 1, 3}}, + {"net.inet.icmp.maskrepl", []_C_int{4, 2, 1, 1}}, + {"net.inet.icmp.rediraccept", []_C_int{4, 2, 1, 4}}, + {"net.inet.icmp.redirtimeout", []_C_int{4, 2, 1, 5}}, + {"net.inet.icmp.stats", []_C_int{4, 2, 1, 7}}, + {"net.inet.icmp.tstamprepl", []_C_int{4, 2, 1, 6}}, + {"net.inet.igmp.stats", []_C_int{4, 2, 2, 1}}, + {"net.inet.ip.arpdown", []_C_int{4, 2, 0, 40}}, + {"net.inet.ip.arpqueued", []_C_int{4, 2, 0, 36}}, + {"net.inet.ip.arptimeout", []_C_int{4, 2, 0, 39}}, + {"net.inet.ip.encdebug", []_C_int{4, 2, 0, 12}}, + {"net.inet.ip.forwarding", []_C_int{4, 2, 0, 1}}, + {"net.inet.ip.ifq.congestion", []_C_int{4, 2, 0, 30, 4}}, + {"net.inet.ip.ifq.drops", []_C_int{4, 2, 0, 30, 3}}, + {"net.inet.ip.ifq.len", []_C_int{4, 2, 0, 30, 1}}, + {"net.inet.ip.ifq.maxlen", []_C_int{4, 2, 0, 30, 2}}, + {"net.inet.ip.maxqueue", []_C_int{4, 2, 0, 11}}, + {"net.inet.ip.mforwarding", []_C_int{4, 2, 0, 31}}, + {"net.inet.ip.mrtmfc", []_C_int{4, 2, 0, 37}}, + {"net.inet.ip.mrtproto", []_C_int{4, 2, 0, 34}}, + {"net.inet.ip.mrtstats", []_C_int{4, 2, 0, 35}}, + {"net.inet.ip.mrtvif", []_C_int{4, 2, 0, 38}}, + {"net.inet.ip.mtu", []_C_int{4, 2, 0, 4}}, + {"net.inet.ip.mtudisc", []_C_int{4, 2, 0, 27}}, + {"net.inet.ip.mtudisctimeout", []_C_int{4, 2, 0, 28}}, + {"net.inet.ip.multipath", []_C_int{4, 2, 0, 32}}, + {"net.inet.ip.portfirst", []_C_int{4, 2, 0, 7}}, + {"net.inet.ip.porthifirst", []_C_int{4, 2, 0, 9}}, + {"net.inet.ip.porthilast", []_C_int{4, 2, 0, 10}}, + {"net.inet.ip.portlast", []_C_int{4, 2, 0, 8}}, + {"net.inet.ip.redirect", []_C_int{4, 2, 0, 2}}, + {"net.inet.ip.sourceroute", []_C_int{4, 2, 0, 5}}, + {"net.inet.ip.stats", []_C_int{4, 2, 0, 33}}, + {"net.inet.ip.ttl", []_C_int{4, 2, 0, 3}}, + {"net.inet.ipcomp.enable", []_C_int{4, 2, 108, 1}}, + {"net.inet.ipcomp.stats", []_C_int{4, 2, 108, 2}}, + {"net.inet.ipip.allow", []_C_int{4, 2, 4, 1}}, + {"net.inet.ipip.stats", []_C_int{4, 2, 4, 2}}, + {"net.inet.mobileip.allow", []_C_int{4, 2, 55, 1}}, + {"net.inet.pfsync.stats", []_C_int{4, 2, 240, 1}}, + {"net.inet.tcp.ackonpush", []_C_int{4, 2, 6, 13}}, + {"net.inet.tcp.always_keepalive", []_C_int{4, 2, 6, 22}}, + {"net.inet.tcp.baddynamic", []_C_int{4, 2, 6, 6}}, + {"net.inet.tcp.drop", []_C_int{4, 2, 6, 19}}, + {"net.inet.tcp.ecn", []_C_int{4, 2, 6, 14}}, + {"net.inet.tcp.ident", []_C_int{4, 2, 6, 9}}, + {"net.inet.tcp.keepidle", []_C_int{4, 2, 6, 3}}, + {"net.inet.tcp.keepinittime", []_C_int{4, 2, 6, 2}}, + {"net.inet.tcp.keepintvl", []_C_int{4, 2, 6, 4}}, + {"net.inet.tcp.mssdflt", []_C_int{4, 2, 6, 11}}, + {"net.inet.tcp.reasslimit", []_C_int{4, 2, 6, 18}}, + {"net.inet.tcp.rfc1323", []_C_int{4, 2, 6, 1}}, + {"net.inet.tcp.rfc3390", []_C_int{4, 2, 6, 17}}, + {"net.inet.tcp.rootonly", []_C_int{4, 2, 6, 24}}, + {"net.inet.tcp.rstppslimit", []_C_int{4, 2, 6, 12}}, + {"net.inet.tcp.sack", []_C_int{4, 2, 6, 10}}, + {"net.inet.tcp.sackholelimit", []_C_int{4, 2, 6, 20}}, + {"net.inet.tcp.slowhz", []_C_int{4, 2, 6, 5}}, + {"net.inet.tcp.stats", []_C_int{4, 2, 6, 21}}, + {"net.inet.tcp.synbucketlimit", []_C_int{4, 2, 6, 16}}, + {"net.inet.tcp.syncachelimit", []_C_int{4, 2, 6, 15}}, + {"net.inet.tcp.synhashsize", []_C_int{4, 2, 6, 25}}, + {"net.inet.tcp.synuselimit", []_C_int{4, 2, 6, 23}}, + {"net.inet.udp.baddynamic", []_C_int{4, 2, 17, 2}}, + {"net.inet.udp.checksum", []_C_int{4, 2, 17, 1}}, + {"net.inet.udp.recvspace", []_C_int{4, 2, 17, 3}}, + {"net.inet.udp.rootonly", []_C_int{4, 2, 17, 6}}, + {"net.inet.udp.sendspace", []_C_int{4, 2, 17, 4}}, + {"net.inet.udp.stats", []_C_int{4, 2, 17, 5}}, + {"net.inet6.divert.recvspace", []_C_int{4, 24, 86, 1}}, + {"net.inet6.divert.sendspace", []_C_int{4, 24, 86, 2}}, + {"net.inet6.divert.stats", []_C_int{4, 24, 86, 3}}, + {"net.inet6.icmp6.errppslimit", []_C_int{4, 24, 30, 14}}, + {"net.inet6.icmp6.mtudisc_hiwat", []_C_int{4, 24, 30, 16}}, + {"net.inet6.icmp6.mtudisc_lowat", []_C_int{4, 24, 30, 17}}, + {"net.inet6.icmp6.nd6_debug", []_C_int{4, 24, 30, 18}}, + {"net.inet6.icmp6.nd6_delay", []_C_int{4, 24, 30, 8}}, + {"net.inet6.icmp6.nd6_maxnudhint", []_C_int{4, 24, 30, 15}}, + {"net.inet6.icmp6.nd6_mmaxtries", []_C_int{4, 24, 30, 10}}, + {"net.inet6.icmp6.nd6_umaxtries", []_C_int{4, 24, 30, 9}}, + {"net.inet6.icmp6.redirtimeout", []_C_int{4, 24, 30, 3}}, + {"net.inet6.ip6.auto_flowlabel", []_C_int{4, 24, 17, 17}}, + {"net.inet6.ip6.dad_count", []_C_int{4, 24, 17, 16}}, + {"net.inet6.ip6.dad_pending", []_C_int{4, 24, 17, 49}}, + {"net.inet6.ip6.defmcasthlim", []_C_int{4, 24, 17, 18}}, + {"net.inet6.ip6.forwarding", []_C_int{4, 24, 17, 1}}, + {"net.inet6.ip6.forwsrcrt", []_C_int{4, 24, 17, 5}}, + {"net.inet6.ip6.hdrnestlimit", []_C_int{4, 24, 17, 15}}, + {"net.inet6.ip6.hlim", []_C_int{4, 24, 17, 3}}, + {"net.inet6.ip6.log_interval", []_C_int{4, 24, 17, 14}}, + {"net.inet6.ip6.maxdynroutes", []_C_int{4, 24, 17, 48}}, + {"net.inet6.ip6.maxfragpackets", []_C_int{4, 24, 17, 9}}, + {"net.inet6.ip6.maxfrags", []_C_int{4, 24, 17, 41}}, + {"net.inet6.ip6.mforwarding", []_C_int{4, 24, 17, 42}}, + {"net.inet6.ip6.mrtmfc", []_C_int{4, 24, 17, 53}}, + {"net.inet6.ip6.mrtmif", []_C_int{4, 24, 17, 52}}, + {"net.inet6.ip6.mrtproto", []_C_int{4, 24, 17, 8}}, + {"net.inet6.ip6.mtudisctimeout", []_C_int{4, 24, 17, 50}}, + {"net.inet6.ip6.multicast_mtudisc", []_C_int{4, 24, 17, 44}}, + {"net.inet6.ip6.multipath", []_C_int{4, 24, 17, 43}}, + {"net.inet6.ip6.neighborgcthresh", []_C_int{4, 24, 17, 45}}, + {"net.inet6.ip6.redirect", []_C_int{4, 24, 17, 2}}, + {"net.inet6.ip6.soiikey", []_C_int{4, 24, 17, 54}}, + {"net.inet6.ip6.sourcecheck", []_C_int{4, 24, 17, 10}}, + {"net.inet6.ip6.sourcecheck_logint", []_C_int{4, 24, 17, 11}}, + {"net.inet6.ip6.use_deprecated", []_C_int{4, 24, 17, 21}}, + {"net.key.sadb_dump", []_C_int{4, 30, 1}}, + {"net.key.spd_dump", []_C_int{4, 30, 2}}, + {"net.mpls.ifq.congestion", []_C_int{4, 33, 3, 4}}, + {"net.mpls.ifq.drops", []_C_int{4, 33, 3, 3}}, + {"net.mpls.ifq.len", []_C_int{4, 33, 3, 1}}, + {"net.mpls.ifq.maxlen", []_C_int{4, 33, 3, 2}}, + {"net.mpls.mapttl_ip", []_C_int{4, 33, 5}}, + {"net.mpls.mapttl_ip6", []_C_int{4, 33, 6}}, + {"net.mpls.maxloop_inkernel", []_C_int{4, 33, 4}}, + {"net.mpls.ttl", []_C_int{4, 33, 2}}, + {"net.pflow.stats", []_C_int{4, 34, 1}}, + {"net.pipex.enable", []_C_int{4, 35, 1}}, +} diff --git a/api/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go b/api/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go new file mode 100644 index 0000000..83bb935 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go @@ -0,0 +1,270 @@ +// mksysctl_openbsd.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +package unix + +type mibentry struct { + ctlname string + ctloid []_C_int +} + +var sysctlMib = []mibentry{ + {"ddb.console", []_C_int{9, 6}}, + {"ddb.log", []_C_int{9, 7}}, + {"ddb.max_line", []_C_int{9, 3}}, + {"ddb.max_width", []_C_int{9, 2}}, + {"ddb.panic", []_C_int{9, 5}}, + {"ddb.radix", []_C_int{9, 1}}, + {"ddb.tab_stop_width", []_C_int{9, 4}}, + {"ddb.trigger", []_C_int{9, 8}}, + {"fs.posix.setuid", []_C_int{3, 1, 1}}, + {"hw.allowpowerdown", []_C_int{6, 22}}, + {"hw.byteorder", []_C_int{6, 4}}, + {"hw.cpuspeed", []_C_int{6, 12}}, + {"hw.diskcount", []_C_int{6, 10}}, + {"hw.disknames", []_C_int{6, 8}}, + {"hw.diskstats", []_C_int{6, 9}}, + {"hw.machine", []_C_int{6, 1}}, + {"hw.model", []_C_int{6, 2}}, + {"hw.ncpu", []_C_int{6, 3}}, + {"hw.ncpufound", []_C_int{6, 21}}, + {"hw.pagesize", []_C_int{6, 7}}, + {"hw.physmem", []_C_int{6, 19}}, + {"hw.product", []_C_int{6, 15}}, + {"hw.serialno", []_C_int{6, 17}}, + {"hw.setperf", []_C_int{6, 13}}, + {"hw.usermem", []_C_int{6, 20}}, + {"hw.uuid", []_C_int{6, 18}}, + {"hw.vendor", []_C_int{6, 14}}, + {"hw.version", []_C_int{6, 16}}, + {"kern.arandom", []_C_int{1, 37}}, + {"kern.argmax", []_C_int{1, 8}}, + {"kern.boottime", []_C_int{1, 21}}, + {"kern.bufcachepercent", []_C_int{1, 72}}, + {"kern.ccpu", []_C_int{1, 45}}, + {"kern.clockrate", []_C_int{1, 12}}, + {"kern.consdev", []_C_int{1, 75}}, + {"kern.cp_time", []_C_int{1, 40}}, + {"kern.cp_time2", []_C_int{1, 71}}, + {"kern.cryptodevallowsoft", []_C_int{1, 53}}, + {"kern.domainname", []_C_int{1, 22}}, + {"kern.file", []_C_int{1, 73}}, + {"kern.forkstat", []_C_int{1, 42}}, + {"kern.fscale", []_C_int{1, 46}}, + {"kern.fsync", []_C_int{1, 33}}, + {"kern.hostid", []_C_int{1, 11}}, + {"kern.hostname", []_C_int{1, 10}}, + {"kern.intrcnt.nintrcnt", []_C_int{1, 63, 1}}, + {"kern.job_control", []_C_int{1, 19}}, + {"kern.malloc.buckets", []_C_int{1, 39, 1}}, + {"kern.malloc.kmemnames", []_C_int{1, 39, 3}}, + {"kern.maxclusters", []_C_int{1, 67}}, + {"kern.maxfiles", []_C_int{1, 7}}, + {"kern.maxlocksperuid", []_C_int{1, 70}}, + {"kern.maxpartitions", []_C_int{1, 23}}, + {"kern.maxproc", []_C_int{1, 6}}, + {"kern.maxthread", []_C_int{1, 25}}, + {"kern.maxvnodes", []_C_int{1, 5}}, + {"kern.mbstat", []_C_int{1, 59}}, + {"kern.msgbuf", []_C_int{1, 48}}, + {"kern.msgbufsize", []_C_int{1, 38}}, + {"kern.nchstats", []_C_int{1, 41}}, + {"kern.netlivelocks", []_C_int{1, 76}}, + {"kern.nfiles", []_C_int{1, 56}}, + {"kern.ngroups", []_C_int{1, 18}}, + {"kern.nosuidcoredump", []_C_int{1, 32}}, + {"kern.nprocs", []_C_int{1, 47}}, + {"kern.nselcoll", []_C_int{1, 43}}, + {"kern.nthreads", []_C_int{1, 26}}, + {"kern.numvnodes", []_C_int{1, 58}}, + {"kern.osrelease", []_C_int{1, 2}}, + {"kern.osrevision", []_C_int{1, 3}}, + {"kern.ostype", []_C_int{1, 1}}, + {"kern.osversion", []_C_int{1, 27}}, + {"kern.pool_debug", []_C_int{1, 77}}, + {"kern.posix1version", []_C_int{1, 17}}, + {"kern.proc", []_C_int{1, 66}}, + {"kern.random", []_C_int{1, 31}}, + {"kern.rawpartition", []_C_int{1, 24}}, + {"kern.saved_ids", []_C_int{1, 20}}, + {"kern.securelevel", []_C_int{1, 9}}, + {"kern.seminfo", []_C_int{1, 61}}, + {"kern.shminfo", []_C_int{1, 62}}, + {"kern.somaxconn", []_C_int{1, 28}}, + {"kern.sominconn", []_C_int{1, 29}}, + {"kern.splassert", []_C_int{1, 54}}, + {"kern.stackgap_random", []_C_int{1, 50}}, + {"kern.sysvipc_info", []_C_int{1, 51}}, + {"kern.sysvmsg", []_C_int{1, 34}}, + {"kern.sysvsem", []_C_int{1, 35}}, + {"kern.sysvshm", []_C_int{1, 36}}, + {"kern.timecounter.choice", []_C_int{1, 69, 4}}, + {"kern.timecounter.hardware", []_C_int{1, 69, 3}}, + {"kern.timecounter.tick", []_C_int{1, 69, 1}}, + {"kern.timecounter.timestepwarnings", []_C_int{1, 69, 2}}, + {"kern.tty.maxptys", []_C_int{1, 44, 6}}, + {"kern.tty.nptys", []_C_int{1, 44, 7}}, + {"kern.tty.tk_cancc", []_C_int{1, 44, 4}}, + {"kern.tty.tk_nin", []_C_int{1, 44, 1}}, + {"kern.tty.tk_nout", []_C_int{1, 44, 2}}, + {"kern.tty.tk_rawcc", []_C_int{1, 44, 3}}, + {"kern.tty.ttyinfo", []_C_int{1, 44, 5}}, + {"kern.ttycount", []_C_int{1, 57}}, + {"kern.userasymcrypto", []_C_int{1, 60}}, + {"kern.usercrypto", []_C_int{1, 52}}, + {"kern.usermount", []_C_int{1, 30}}, + {"kern.version", []_C_int{1, 4}}, + {"kern.vnode", []_C_int{1, 13}}, + {"kern.watchdog.auto", []_C_int{1, 64, 2}}, + {"kern.watchdog.period", []_C_int{1, 64, 1}}, + {"net.bpf.bufsize", []_C_int{4, 31, 1}}, + {"net.bpf.maxbufsize", []_C_int{4, 31, 2}}, + {"net.inet.ah.enable", []_C_int{4, 2, 51, 1}}, + {"net.inet.ah.stats", []_C_int{4, 2, 51, 2}}, + {"net.inet.carp.allow", []_C_int{4, 2, 112, 1}}, + {"net.inet.carp.log", []_C_int{4, 2, 112, 3}}, + {"net.inet.carp.preempt", []_C_int{4, 2, 112, 2}}, + {"net.inet.carp.stats", []_C_int{4, 2, 112, 4}}, + {"net.inet.divert.recvspace", []_C_int{4, 2, 258, 1}}, + {"net.inet.divert.sendspace", []_C_int{4, 2, 258, 2}}, + {"net.inet.divert.stats", []_C_int{4, 2, 258, 3}}, + {"net.inet.esp.enable", []_C_int{4, 2, 50, 1}}, + {"net.inet.esp.stats", []_C_int{4, 2, 50, 4}}, + {"net.inet.esp.udpencap", []_C_int{4, 2, 50, 2}}, + {"net.inet.esp.udpencap_port", []_C_int{4, 2, 50, 3}}, + {"net.inet.etherip.allow", []_C_int{4, 2, 97, 1}}, + {"net.inet.etherip.stats", []_C_int{4, 2, 97, 2}}, + {"net.inet.gre.allow", []_C_int{4, 2, 47, 1}}, + {"net.inet.gre.wccp", []_C_int{4, 2, 47, 2}}, + {"net.inet.icmp.bmcastecho", []_C_int{4, 2, 1, 2}}, + {"net.inet.icmp.errppslimit", []_C_int{4, 2, 1, 3}}, + {"net.inet.icmp.maskrepl", []_C_int{4, 2, 1, 1}}, + {"net.inet.icmp.rediraccept", []_C_int{4, 2, 1, 4}}, + {"net.inet.icmp.redirtimeout", []_C_int{4, 2, 1, 5}}, + {"net.inet.icmp.stats", []_C_int{4, 2, 1, 7}}, + {"net.inet.icmp.tstamprepl", []_C_int{4, 2, 1, 6}}, + {"net.inet.igmp.stats", []_C_int{4, 2, 2, 1}}, + {"net.inet.ip.arpqueued", []_C_int{4, 2, 0, 36}}, + {"net.inet.ip.encdebug", []_C_int{4, 2, 0, 12}}, + {"net.inet.ip.forwarding", []_C_int{4, 2, 0, 1}}, + {"net.inet.ip.ifq.congestion", []_C_int{4, 2, 0, 30, 4}}, + {"net.inet.ip.ifq.drops", []_C_int{4, 2, 0, 30, 3}}, + {"net.inet.ip.ifq.len", []_C_int{4, 2, 0, 30, 1}}, + {"net.inet.ip.ifq.maxlen", []_C_int{4, 2, 0, 30, 2}}, + {"net.inet.ip.maxqueue", []_C_int{4, 2, 0, 11}}, + {"net.inet.ip.mforwarding", []_C_int{4, 2, 0, 31}}, + {"net.inet.ip.mrtproto", []_C_int{4, 2, 0, 34}}, + {"net.inet.ip.mrtstats", []_C_int{4, 2, 0, 35}}, + {"net.inet.ip.mtu", []_C_int{4, 2, 0, 4}}, + {"net.inet.ip.mtudisc", []_C_int{4, 2, 0, 27}}, + {"net.inet.ip.mtudisctimeout", []_C_int{4, 2, 0, 28}}, + {"net.inet.ip.multipath", []_C_int{4, 2, 0, 32}}, + {"net.inet.ip.portfirst", []_C_int{4, 2, 0, 7}}, + {"net.inet.ip.porthifirst", []_C_int{4, 2, 0, 9}}, + {"net.inet.ip.porthilast", []_C_int{4, 2, 0, 10}}, + {"net.inet.ip.portlast", []_C_int{4, 2, 0, 8}}, + {"net.inet.ip.redirect", []_C_int{4, 2, 0, 2}}, + {"net.inet.ip.sourceroute", []_C_int{4, 2, 0, 5}}, + {"net.inet.ip.stats", []_C_int{4, 2, 0, 33}}, + {"net.inet.ip.ttl", []_C_int{4, 2, 0, 3}}, + {"net.inet.ipcomp.enable", []_C_int{4, 2, 108, 1}}, + {"net.inet.ipcomp.stats", []_C_int{4, 2, 108, 2}}, + {"net.inet.ipip.allow", []_C_int{4, 2, 4, 1}}, + {"net.inet.ipip.stats", []_C_int{4, 2, 4, 2}}, + {"net.inet.mobileip.allow", []_C_int{4, 2, 55, 1}}, + {"net.inet.pfsync.stats", []_C_int{4, 2, 240, 1}}, + {"net.inet.pim.stats", []_C_int{4, 2, 103, 1}}, + {"net.inet.tcp.ackonpush", []_C_int{4, 2, 6, 13}}, + {"net.inet.tcp.always_keepalive", []_C_int{4, 2, 6, 22}}, + {"net.inet.tcp.baddynamic", []_C_int{4, 2, 6, 6}}, + {"net.inet.tcp.drop", []_C_int{4, 2, 6, 19}}, + {"net.inet.tcp.ecn", []_C_int{4, 2, 6, 14}}, + {"net.inet.tcp.ident", []_C_int{4, 2, 6, 9}}, + {"net.inet.tcp.keepidle", []_C_int{4, 2, 6, 3}}, + {"net.inet.tcp.keepinittime", []_C_int{4, 2, 6, 2}}, + {"net.inet.tcp.keepintvl", []_C_int{4, 2, 6, 4}}, + {"net.inet.tcp.mssdflt", []_C_int{4, 2, 6, 11}}, + {"net.inet.tcp.reasslimit", []_C_int{4, 2, 6, 18}}, + {"net.inet.tcp.rfc1323", []_C_int{4, 2, 6, 1}}, + {"net.inet.tcp.rfc3390", []_C_int{4, 2, 6, 17}}, + {"net.inet.tcp.rstppslimit", []_C_int{4, 2, 6, 12}}, + {"net.inet.tcp.sack", []_C_int{4, 2, 6, 10}}, + {"net.inet.tcp.sackholelimit", []_C_int{4, 2, 6, 20}}, + {"net.inet.tcp.slowhz", []_C_int{4, 2, 6, 5}}, + {"net.inet.tcp.stats", []_C_int{4, 2, 6, 21}}, + {"net.inet.tcp.synbucketlimit", []_C_int{4, 2, 6, 16}}, + {"net.inet.tcp.syncachelimit", []_C_int{4, 2, 6, 15}}, + {"net.inet.udp.baddynamic", []_C_int{4, 2, 17, 2}}, + {"net.inet.udp.checksum", []_C_int{4, 2, 17, 1}}, + {"net.inet.udp.recvspace", []_C_int{4, 2, 17, 3}}, + {"net.inet.udp.sendspace", []_C_int{4, 2, 17, 4}}, + {"net.inet.udp.stats", []_C_int{4, 2, 17, 5}}, + {"net.inet6.divert.recvspace", []_C_int{4, 24, 86, 1}}, + {"net.inet6.divert.sendspace", []_C_int{4, 24, 86, 2}}, + {"net.inet6.divert.stats", []_C_int{4, 24, 86, 3}}, + {"net.inet6.icmp6.errppslimit", []_C_int{4, 24, 30, 14}}, + {"net.inet6.icmp6.mtudisc_hiwat", []_C_int{4, 24, 30, 16}}, + {"net.inet6.icmp6.mtudisc_lowat", []_C_int{4, 24, 30, 17}}, + {"net.inet6.icmp6.nd6_debug", []_C_int{4, 24, 30, 18}}, + {"net.inet6.icmp6.nd6_delay", []_C_int{4, 24, 30, 8}}, + {"net.inet6.icmp6.nd6_maxnudhint", []_C_int{4, 24, 30, 15}}, + {"net.inet6.icmp6.nd6_mmaxtries", []_C_int{4, 24, 30, 10}}, + {"net.inet6.icmp6.nd6_prune", []_C_int{4, 24, 30, 6}}, + {"net.inet6.icmp6.nd6_umaxtries", []_C_int{4, 24, 30, 9}}, + {"net.inet6.icmp6.nd6_useloopback", []_C_int{4, 24, 30, 11}}, + {"net.inet6.icmp6.nodeinfo", []_C_int{4, 24, 30, 13}}, + {"net.inet6.icmp6.rediraccept", []_C_int{4, 24, 30, 2}}, + {"net.inet6.icmp6.redirtimeout", []_C_int{4, 24, 30, 3}}, + {"net.inet6.ip6.accept_rtadv", []_C_int{4, 24, 17, 12}}, + {"net.inet6.ip6.auto_flowlabel", []_C_int{4, 24, 17, 17}}, + {"net.inet6.ip6.dad_count", []_C_int{4, 24, 17, 16}}, + {"net.inet6.ip6.dad_pending", []_C_int{4, 24, 17, 49}}, + {"net.inet6.ip6.defmcasthlim", []_C_int{4, 24, 17, 18}}, + {"net.inet6.ip6.forwarding", []_C_int{4, 24, 17, 1}}, + {"net.inet6.ip6.forwsrcrt", []_C_int{4, 24, 17, 5}}, + {"net.inet6.ip6.hdrnestlimit", []_C_int{4, 24, 17, 15}}, + {"net.inet6.ip6.hlim", []_C_int{4, 24, 17, 3}}, + {"net.inet6.ip6.log_interval", []_C_int{4, 24, 17, 14}}, + {"net.inet6.ip6.maxdynroutes", []_C_int{4, 24, 17, 48}}, + {"net.inet6.ip6.maxfragpackets", []_C_int{4, 24, 17, 9}}, + {"net.inet6.ip6.maxfrags", []_C_int{4, 24, 17, 41}}, + {"net.inet6.ip6.maxifdefrouters", []_C_int{4, 24, 17, 47}}, + {"net.inet6.ip6.maxifprefixes", []_C_int{4, 24, 17, 46}}, + {"net.inet6.ip6.mforwarding", []_C_int{4, 24, 17, 42}}, + {"net.inet6.ip6.mrtproto", []_C_int{4, 24, 17, 8}}, + {"net.inet6.ip6.mtudisctimeout", []_C_int{4, 24, 17, 50}}, + {"net.inet6.ip6.multicast_mtudisc", []_C_int{4, 24, 17, 44}}, + {"net.inet6.ip6.multipath", []_C_int{4, 24, 17, 43}}, + {"net.inet6.ip6.neighborgcthresh", []_C_int{4, 24, 17, 45}}, + {"net.inet6.ip6.redirect", []_C_int{4, 24, 17, 2}}, + {"net.inet6.ip6.rr_prune", []_C_int{4, 24, 17, 22}}, + {"net.inet6.ip6.sourcecheck", []_C_int{4, 24, 17, 10}}, + {"net.inet6.ip6.sourcecheck_logint", []_C_int{4, 24, 17, 11}}, + {"net.inet6.ip6.use_deprecated", []_C_int{4, 24, 17, 21}}, + {"net.inet6.ip6.v6only", []_C_int{4, 24, 17, 24}}, + {"net.key.sadb_dump", []_C_int{4, 30, 1}}, + {"net.key.spd_dump", []_C_int{4, 30, 2}}, + {"net.mpls.ifq.congestion", []_C_int{4, 33, 3, 4}}, + {"net.mpls.ifq.drops", []_C_int{4, 33, 3, 3}}, + {"net.mpls.ifq.len", []_C_int{4, 33, 3, 1}}, + {"net.mpls.ifq.maxlen", []_C_int{4, 33, 3, 2}}, + {"net.mpls.mapttl_ip", []_C_int{4, 33, 5}}, + {"net.mpls.mapttl_ip6", []_C_int{4, 33, 6}}, + {"net.mpls.maxloop_inkernel", []_C_int{4, 33, 4}}, + {"net.mpls.ttl", []_C_int{4, 33, 2}}, + {"net.pflow.stats", []_C_int{4, 34, 1}}, + {"net.pipex.enable", []_C_int{4, 35, 1}}, + {"vm.anonmin", []_C_int{2, 7}}, + {"vm.loadavg", []_C_int{2, 2}}, + {"vm.maxslp", []_C_int{2, 10}}, + {"vm.nkmempages", []_C_int{2, 6}}, + {"vm.psstrings", []_C_int{2, 3}}, + {"vm.swapencrypt.enable", []_C_int{2, 5, 0}}, + {"vm.swapencrypt.keyscreated", []_C_int{2, 5, 1}}, + {"vm.swapencrypt.keysdeleted", []_C_int{2, 5, 2}}, + {"vm.uspace", []_C_int{2, 11}}, + {"vm.uvmexp", []_C_int{2, 4}}, + {"vm.vmmeter", []_C_int{2, 1}}, + {"vm.vnodemin", []_C_int{2, 9}}, + {"vm.vtextmin", []_C_int{2, 8}}, +} diff --git a/api/vendor/golang.org/x/sys/unix/zsysnum_darwin_386.go b/api/vendor/golang.org/x/sys/unix/zsysnum_darwin_386.go new file mode 100644 index 0000000..d1d36da --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsysnum_darwin_386.go @@ -0,0 +1,436 @@ +// mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/usr/include/sys/syscall.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,darwin + +package unix + +const ( + SYS_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_WAIT4 = 7 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_CHDIR = 12 + SYS_FCHDIR = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_CHOWN = 16 + SYS_GETFSSTAT = 18 + SYS_GETPID = 20 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_GETEUID = 25 + SYS_PTRACE = 26 + SYS_RECVMSG = 27 + SYS_SENDMSG = 28 + SYS_RECVFROM = 29 + SYS_ACCEPT = 30 + SYS_GETPEERNAME = 31 + SYS_GETSOCKNAME = 32 + SYS_ACCESS = 33 + SYS_CHFLAGS = 34 + SYS_FCHFLAGS = 35 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_GETPPID = 39 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_GETEGID = 43 + SYS_SIGACTION = 46 + SYS_GETGID = 47 + SYS_SIGPROCMASK = 48 + SYS_GETLOGIN = 49 + SYS_SETLOGIN = 50 + SYS_ACCT = 51 + SYS_SIGPENDING = 52 + SYS_SIGALTSTACK = 53 + SYS_IOCTL = 54 + SYS_REBOOT = 55 + SYS_REVOKE = 56 + SYS_SYMLINK = 57 + SYS_READLINK = 58 + SYS_EXECVE = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_MSYNC = 65 + SYS_VFORK = 66 + SYS_MUNMAP = 73 + SYS_MPROTECT = 74 + SYS_MADVISE = 75 + SYS_MINCORE = 78 + SYS_GETGROUPS = 79 + SYS_SETGROUPS = 80 + SYS_GETPGRP = 81 + SYS_SETPGID = 82 + SYS_SETITIMER = 83 + SYS_SWAPON = 85 + SYS_GETITIMER = 86 + SYS_GETDTABLESIZE = 89 + SYS_DUP2 = 90 + SYS_FCNTL = 92 + SYS_SELECT = 93 + SYS_FSYNC = 95 + SYS_SETPRIORITY = 96 + SYS_SOCKET = 97 + SYS_CONNECT = 98 + SYS_GETPRIORITY = 100 + SYS_BIND = 104 + SYS_SETSOCKOPT = 105 + SYS_LISTEN = 106 + SYS_SIGSUSPEND = 111 + SYS_GETTIMEOFDAY = 116 + SYS_GETRUSAGE = 117 + SYS_GETSOCKOPT = 118 + SYS_READV = 120 + SYS_WRITEV = 121 + SYS_SETTIMEOFDAY = 122 + SYS_FCHOWN = 123 + SYS_FCHMOD = 124 + SYS_SETREUID = 126 + SYS_SETREGID = 127 + SYS_RENAME = 128 + SYS_FLOCK = 131 + SYS_MKFIFO = 132 + SYS_SENDTO = 133 + SYS_SHUTDOWN = 134 + SYS_SOCKETPAIR = 135 + SYS_MKDIR = 136 + SYS_RMDIR = 137 + SYS_UTIMES = 138 + SYS_FUTIMES = 139 + SYS_ADJTIME = 140 + SYS_GETHOSTUUID = 142 + SYS_SETSID = 147 + SYS_GETPGID = 151 + SYS_SETPRIVEXEC = 152 + SYS_PREAD = 153 + SYS_PWRITE = 154 + SYS_NFSSVC = 155 + SYS_STATFS = 157 + SYS_FSTATFS = 158 + SYS_UNMOUNT = 159 + SYS_GETFH = 161 + SYS_QUOTACTL = 165 + SYS_MOUNT = 167 + SYS_CSOPS = 169 + SYS_CSOPS_AUDITTOKEN = 170 + SYS_WAITID = 173 + SYS_KDEBUG_TYPEFILTER = 177 + SYS_KDEBUG_TRACE_STRING = 178 + SYS_KDEBUG_TRACE64 = 179 + SYS_KDEBUG_TRACE = 180 + SYS_SETGID = 181 + SYS_SETEGID = 182 + SYS_SETEUID = 183 + SYS_SIGRETURN = 184 + SYS_THREAD_SELFCOUNTS = 186 + SYS_FDATASYNC = 187 + SYS_STAT = 188 + SYS_FSTAT = 189 + SYS_LSTAT = 190 + SYS_PATHCONF = 191 + SYS_FPATHCONF = 192 + SYS_GETRLIMIT = 194 + SYS_SETRLIMIT = 195 + SYS_GETDIRENTRIES = 196 + SYS_MMAP = 197 + SYS_LSEEK = 199 + SYS_TRUNCATE = 200 + SYS_FTRUNCATE = 201 + SYS_SYSCTL = 202 + SYS_MLOCK = 203 + SYS_MUNLOCK = 204 + SYS_UNDELETE = 205 + SYS_OPEN_DPROTECTED_NP = 216 + SYS_GETATTRLIST = 220 + SYS_SETATTRLIST = 221 + SYS_GETDIRENTRIESATTR = 222 + SYS_EXCHANGEDATA = 223 + SYS_SEARCHFS = 225 + SYS_DELETE = 226 + SYS_COPYFILE = 227 + SYS_FGETATTRLIST = 228 + SYS_FSETATTRLIST = 229 + SYS_POLL = 230 + SYS_WATCHEVENT = 231 + SYS_WAITEVENT = 232 + SYS_MODWATCH = 233 + SYS_GETXATTR = 234 + SYS_FGETXATTR = 235 + SYS_SETXATTR = 236 + SYS_FSETXATTR = 237 + SYS_REMOVEXATTR = 238 + SYS_FREMOVEXATTR = 239 + SYS_LISTXATTR = 240 + SYS_FLISTXATTR = 241 + SYS_FSCTL = 242 + SYS_INITGROUPS = 243 + SYS_POSIX_SPAWN = 244 + SYS_FFSCTL = 245 + SYS_NFSCLNT = 247 + SYS_FHOPEN = 248 + SYS_MINHERIT = 250 + SYS_SEMSYS = 251 + SYS_MSGSYS = 252 + SYS_SHMSYS = 253 + SYS_SEMCTL = 254 + SYS_SEMGET = 255 + SYS_SEMOP = 256 + SYS_MSGCTL = 258 + SYS_MSGGET = 259 + SYS_MSGSND = 260 + SYS_MSGRCV = 261 + SYS_SHMAT = 262 + SYS_SHMCTL = 263 + SYS_SHMDT = 264 + SYS_SHMGET = 265 + SYS_SHM_OPEN = 266 + SYS_SHM_UNLINK = 267 + SYS_SEM_OPEN = 268 + SYS_SEM_CLOSE = 269 + SYS_SEM_UNLINK = 270 + SYS_SEM_WAIT = 271 + SYS_SEM_TRYWAIT = 272 + SYS_SEM_POST = 273 + SYS_SYSCTLBYNAME = 274 + SYS_OPEN_EXTENDED = 277 + SYS_UMASK_EXTENDED = 278 + SYS_STAT_EXTENDED = 279 + SYS_LSTAT_EXTENDED = 280 + SYS_FSTAT_EXTENDED = 281 + SYS_CHMOD_EXTENDED = 282 + SYS_FCHMOD_EXTENDED = 283 + SYS_ACCESS_EXTENDED = 284 + SYS_SETTID = 285 + SYS_GETTID = 286 + SYS_SETSGROUPS = 287 + SYS_GETSGROUPS = 288 + SYS_SETWGROUPS = 289 + SYS_GETWGROUPS = 290 + SYS_MKFIFO_EXTENDED = 291 + SYS_MKDIR_EXTENDED = 292 + SYS_IDENTITYSVC = 293 + SYS_SHARED_REGION_CHECK_NP = 294 + SYS_VM_PRESSURE_MONITOR = 296 + SYS_PSYNCH_RW_LONGRDLOCK = 297 + SYS_PSYNCH_RW_YIELDWRLOCK = 298 + SYS_PSYNCH_RW_DOWNGRADE = 299 + SYS_PSYNCH_RW_UPGRADE = 300 + SYS_PSYNCH_MUTEXWAIT = 301 + SYS_PSYNCH_MUTEXDROP = 302 + SYS_PSYNCH_CVBROAD = 303 + SYS_PSYNCH_CVSIGNAL = 304 + SYS_PSYNCH_CVWAIT = 305 + SYS_PSYNCH_RW_RDLOCK = 306 + SYS_PSYNCH_RW_WRLOCK = 307 + SYS_PSYNCH_RW_UNLOCK = 308 + SYS_PSYNCH_RW_UNLOCK2 = 309 + SYS_GETSID = 310 + SYS_SETTID_WITH_PID = 311 + SYS_PSYNCH_CVCLRPREPOST = 312 + SYS_AIO_FSYNC = 313 + SYS_AIO_RETURN = 314 + SYS_AIO_SUSPEND = 315 + SYS_AIO_CANCEL = 316 + SYS_AIO_ERROR = 317 + SYS_AIO_READ = 318 + SYS_AIO_WRITE = 319 + SYS_LIO_LISTIO = 320 + SYS_IOPOLICYSYS = 322 + SYS_PROCESS_POLICY = 323 + SYS_MLOCKALL = 324 + SYS_MUNLOCKALL = 325 + SYS_ISSETUGID = 327 + SYS___PTHREAD_KILL = 328 + SYS___PTHREAD_SIGMASK = 329 + SYS___SIGWAIT = 330 + SYS___DISABLE_THREADSIGNAL = 331 + SYS___PTHREAD_MARKCANCEL = 332 + SYS___PTHREAD_CANCELED = 333 + SYS___SEMWAIT_SIGNAL = 334 + SYS_PROC_INFO = 336 + SYS_SENDFILE = 337 + SYS_STAT64 = 338 + SYS_FSTAT64 = 339 + SYS_LSTAT64 = 340 + SYS_STAT64_EXTENDED = 341 + SYS_LSTAT64_EXTENDED = 342 + SYS_FSTAT64_EXTENDED = 343 + SYS_GETDIRENTRIES64 = 344 + SYS_STATFS64 = 345 + SYS_FSTATFS64 = 346 + SYS_GETFSSTAT64 = 347 + SYS___PTHREAD_CHDIR = 348 + SYS___PTHREAD_FCHDIR = 349 + SYS_AUDIT = 350 + SYS_AUDITON = 351 + SYS_GETAUID = 353 + SYS_SETAUID = 354 + SYS_GETAUDIT_ADDR = 357 + SYS_SETAUDIT_ADDR = 358 + SYS_AUDITCTL = 359 + SYS_BSDTHREAD_CREATE = 360 + SYS_BSDTHREAD_TERMINATE = 361 + SYS_KQUEUE = 362 + SYS_KEVENT = 363 + SYS_LCHOWN = 364 + SYS_BSDTHREAD_REGISTER = 366 + SYS_WORKQ_OPEN = 367 + SYS_WORKQ_KERNRETURN = 368 + SYS_KEVENT64 = 369 + SYS___OLD_SEMWAIT_SIGNAL = 370 + SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL = 371 + SYS_THREAD_SELFID = 372 + SYS_LEDGER = 373 + SYS_KEVENT_QOS = 374 + SYS_KEVENT_ID = 375 + SYS___MAC_EXECVE = 380 + SYS___MAC_SYSCALL = 381 + SYS___MAC_GET_FILE = 382 + SYS___MAC_SET_FILE = 383 + SYS___MAC_GET_LINK = 384 + SYS___MAC_SET_LINK = 385 + SYS___MAC_GET_PROC = 386 + SYS___MAC_SET_PROC = 387 + SYS___MAC_GET_FD = 388 + SYS___MAC_SET_FD = 389 + SYS___MAC_GET_PID = 390 + SYS_PSELECT = 394 + SYS_PSELECT_NOCANCEL = 395 + SYS_READ_NOCANCEL = 396 + SYS_WRITE_NOCANCEL = 397 + SYS_OPEN_NOCANCEL = 398 + SYS_CLOSE_NOCANCEL = 399 + SYS_WAIT4_NOCANCEL = 400 + SYS_RECVMSG_NOCANCEL = 401 + SYS_SENDMSG_NOCANCEL = 402 + SYS_RECVFROM_NOCANCEL = 403 + SYS_ACCEPT_NOCANCEL = 404 + SYS_MSYNC_NOCANCEL = 405 + SYS_FCNTL_NOCANCEL = 406 + SYS_SELECT_NOCANCEL = 407 + SYS_FSYNC_NOCANCEL = 408 + SYS_CONNECT_NOCANCEL = 409 + SYS_SIGSUSPEND_NOCANCEL = 410 + SYS_READV_NOCANCEL = 411 + SYS_WRITEV_NOCANCEL = 412 + SYS_SENDTO_NOCANCEL = 413 + SYS_PREAD_NOCANCEL = 414 + SYS_PWRITE_NOCANCEL = 415 + SYS_WAITID_NOCANCEL = 416 + SYS_POLL_NOCANCEL = 417 + SYS_MSGSND_NOCANCEL = 418 + SYS_MSGRCV_NOCANCEL = 419 + SYS_SEM_WAIT_NOCANCEL = 420 + SYS_AIO_SUSPEND_NOCANCEL = 421 + SYS___SIGWAIT_NOCANCEL = 422 + SYS___SEMWAIT_SIGNAL_NOCANCEL = 423 + SYS___MAC_MOUNT = 424 + SYS___MAC_GET_MOUNT = 425 + SYS___MAC_GETFSSTAT = 426 + SYS_FSGETPATH = 427 + SYS_AUDIT_SESSION_SELF = 428 + SYS_AUDIT_SESSION_JOIN = 429 + SYS_FILEPORT_MAKEPORT = 430 + SYS_FILEPORT_MAKEFD = 431 + SYS_AUDIT_SESSION_PORT = 432 + SYS_PID_SUSPEND = 433 + SYS_PID_RESUME = 434 + SYS_PID_HIBERNATE = 435 + SYS_PID_SHUTDOWN_SOCKETS = 436 + SYS_SHARED_REGION_MAP_AND_SLIDE_NP = 438 + SYS_KAS_INFO = 439 + SYS_MEMORYSTATUS_CONTROL = 440 + SYS_GUARDED_OPEN_NP = 441 + SYS_GUARDED_CLOSE_NP = 442 + SYS_GUARDED_KQUEUE_NP = 443 + SYS_CHANGE_FDGUARD_NP = 444 + SYS_USRCTL = 445 + SYS_PROC_RLIMIT_CONTROL = 446 + SYS_CONNECTX = 447 + SYS_DISCONNECTX = 448 + SYS_PEELOFF = 449 + SYS_SOCKET_DELEGATE = 450 + SYS_TELEMETRY = 451 + SYS_PROC_UUID_POLICY = 452 + SYS_MEMORYSTATUS_GET_LEVEL = 453 + SYS_SYSTEM_OVERRIDE = 454 + SYS_VFS_PURGE = 455 + SYS_SFI_CTL = 456 + SYS_SFI_PIDCTL = 457 + SYS_COALITION = 458 + SYS_COALITION_INFO = 459 + SYS_NECP_MATCH_POLICY = 460 + SYS_GETATTRLISTBULK = 461 + SYS_CLONEFILEAT = 462 + SYS_OPENAT = 463 + SYS_OPENAT_NOCANCEL = 464 + SYS_RENAMEAT = 465 + SYS_FACCESSAT = 466 + SYS_FCHMODAT = 467 + SYS_FCHOWNAT = 468 + SYS_FSTATAT = 469 + SYS_FSTATAT64 = 470 + SYS_LINKAT = 471 + SYS_UNLINKAT = 472 + SYS_READLINKAT = 473 + SYS_SYMLINKAT = 474 + SYS_MKDIRAT = 475 + SYS_GETATTRLISTAT = 476 + SYS_PROC_TRACE_LOG = 477 + SYS_BSDTHREAD_CTL = 478 + SYS_OPENBYID_NP = 479 + SYS_RECVMSG_X = 480 + SYS_SENDMSG_X = 481 + SYS_THREAD_SELFUSAGE = 482 + SYS_CSRCTL = 483 + SYS_GUARDED_OPEN_DPROTECTED_NP = 484 + SYS_GUARDED_WRITE_NP = 485 + SYS_GUARDED_PWRITE_NP = 486 + SYS_GUARDED_WRITEV_NP = 487 + SYS_RENAMEATX_NP = 488 + SYS_MREMAP_ENCRYPTED = 489 + SYS_NETAGENT_TRIGGER = 490 + SYS_STACK_SNAPSHOT_WITH_CONFIG = 491 + SYS_MICROSTACKSHOT = 492 + SYS_GRAB_PGO_DATA = 493 + SYS_PERSONA = 494 + SYS_WORK_INTERVAL_CTL = 499 + SYS_GETENTROPY = 500 + SYS_NECP_OPEN = 501 + SYS_NECP_CLIENT_ACTION = 502 + SYS___NEXUS_OPEN = 503 + SYS___NEXUS_REGISTER = 504 + SYS___NEXUS_DEREGISTER = 505 + SYS___NEXUS_CREATE = 506 + SYS___NEXUS_DESTROY = 507 + SYS___NEXUS_GET_OPT = 508 + SYS___NEXUS_SET_OPT = 509 + SYS___CHANNEL_OPEN = 510 + SYS___CHANNEL_GET_INFO = 511 + SYS___CHANNEL_SYNC = 512 + SYS___CHANNEL_GET_OPT = 513 + SYS___CHANNEL_SET_OPT = 514 + SYS_ULOCK_WAIT = 515 + SYS_ULOCK_WAKE = 516 + SYS_FCLONEFILEAT = 517 + SYS_FS_SNAPSHOT = 518 + SYS_TERMINATE_WITH_PAYLOAD = 520 + SYS_ABORT_WITH_PAYLOAD = 521 + SYS_NECP_SESSION_OPEN = 522 + SYS_NECP_SESSION_ACTION = 523 + SYS_SETATTRLISTAT = 524 + SYS_NET_QOS_GUIDELINE = 525 + SYS_FMOUNT = 526 + SYS_NTP_ADJTIME = 527 + SYS_NTP_GETTIME = 528 + SYS_OS_FAULT_WITH_PAYLOAD = 529 + SYS_MAXSYSCALL = 530 + SYS_INVALID = 63 +) diff --git a/api/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go b/api/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go new file mode 100644 index 0000000..e35de41 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go @@ -0,0 +1,436 @@ +// mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/usr/include/sys/syscall.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,darwin + +package unix + +const ( + SYS_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_WAIT4 = 7 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_CHDIR = 12 + SYS_FCHDIR = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_CHOWN = 16 + SYS_GETFSSTAT = 18 + SYS_GETPID = 20 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_GETEUID = 25 + SYS_PTRACE = 26 + SYS_RECVMSG = 27 + SYS_SENDMSG = 28 + SYS_RECVFROM = 29 + SYS_ACCEPT = 30 + SYS_GETPEERNAME = 31 + SYS_GETSOCKNAME = 32 + SYS_ACCESS = 33 + SYS_CHFLAGS = 34 + SYS_FCHFLAGS = 35 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_GETPPID = 39 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_GETEGID = 43 + SYS_SIGACTION = 46 + SYS_GETGID = 47 + SYS_SIGPROCMASK = 48 + SYS_GETLOGIN = 49 + SYS_SETLOGIN = 50 + SYS_ACCT = 51 + SYS_SIGPENDING = 52 + SYS_SIGALTSTACK = 53 + SYS_IOCTL = 54 + SYS_REBOOT = 55 + SYS_REVOKE = 56 + SYS_SYMLINK = 57 + SYS_READLINK = 58 + SYS_EXECVE = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_MSYNC = 65 + SYS_VFORK = 66 + SYS_MUNMAP = 73 + SYS_MPROTECT = 74 + SYS_MADVISE = 75 + SYS_MINCORE = 78 + SYS_GETGROUPS = 79 + SYS_SETGROUPS = 80 + SYS_GETPGRP = 81 + SYS_SETPGID = 82 + SYS_SETITIMER = 83 + SYS_SWAPON = 85 + SYS_GETITIMER = 86 + SYS_GETDTABLESIZE = 89 + SYS_DUP2 = 90 + SYS_FCNTL = 92 + SYS_SELECT = 93 + SYS_FSYNC = 95 + SYS_SETPRIORITY = 96 + SYS_SOCKET = 97 + SYS_CONNECT = 98 + SYS_GETPRIORITY = 100 + SYS_BIND = 104 + SYS_SETSOCKOPT = 105 + SYS_LISTEN = 106 + SYS_SIGSUSPEND = 111 + SYS_GETTIMEOFDAY = 116 + SYS_GETRUSAGE = 117 + SYS_GETSOCKOPT = 118 + SYS_READV = 120 + SYS_WRITEV = 121 + SYS_SETTIMEOFDAY = 122 + SYS_FCHOWN = 123 + SYS_FCHMOD = 124 + SYS_SETREUID = 126 + SYS_SETREGID = 127 + SYS_RENAME = 128 + SYS_FLOCK = 131 + SYS_MKFIFO = 132 + SYS_SENDTO = 133 + SYS_SHUTDOWN = 134 + SYS_SOCKETPAIR = 135 + SYS_MKDIR = 136 + SYS_RMDIR = 137 + SYS_UTIMES = 138 + SYS_FUTIMES = 139 + SYS_ADJTIME = 140 + SYS_GETHOSTUUID = 142 + SYS_SETSID = 147 + SYS_GETPGID = 151 + SYS_SETPRIVEXEC = 152 + SYS_PREAD = 153 + SYS_PWRITE = 154 + SYS_NFSSVC = 155 + SYS_STATFS = 157 + SYS_FSTATFS = 158 + SYS_UNMOUNT = 159 + SYS_GETFH = 161 + SYS_QUOTACTL = 165 + SYS_MOUNT = 167 + SYS_CSOPS = 169 + SYS_CSOPS_AUDITTOKEN = 170 + SYS_WAITID = 173 + SYS_KDEBUG_TYPEFILTER = 177 + SYS_KDEBUG_TRACE_STRING = 178 + SYS_KDEBUG_TRACE64 = 179 + SYS_KDEBUG_TRACE = 180 + SYS_SETGID = 181 + SYS_SETEGID = 182 + SYS_SETEUID = 183 + SYS_SIGRETURN = 184 + SYS_THREAD_SELFCOUNTS = 186 + SYS_FDATASYNC = 187 + SYS_STAT = 188 + SYS_FSTAT = 189 + SYS_LSTAT = 190 + SYS_PATHCONF = 191 + SYS_FPATHCONF = 192 + SYS_GETRLIMIT = 194 + SYS_SETRLIMIT = 195 + SYS_GETDIRENTRIES = 196 + SYS_MMAP = 197 + SYS_LSEEK = 199 + SYS_TRUNCATE = 200 + SYS_FTRUNCATE = 201 + SYS_SYSCTL = 202 + SYS_MLOCK = 203 + SYS_MUNLOCK = 204 + SYS_UNDELETE = 205 + SYS_OPEN_DPROTECTED_NP = 216 + SYS_GETATTRLIST = 220 + SYS_SETATTRLIST = 221 + SYS_GETDIRENTRIESATTR = 222 + SYS_EXCHANGEDATA = 223 + SYS_SEARCHFS = 225 + SYS_DELETE = 226 + SYS_COPYFILE = 227 + SYS_FGETATTRLIST = 228 + SYS_FSETATTRLIST = 229 + SYS_POLL = 230 + SYS_WATCHEVENT = 231 + SYS_WAITEVENT = 232 + SYS_MODWATCH = 233 + SYS_GETXATTR = 234 + SYS_FGETXATTR = 235 + SYS_SETXATTR = 236 + SYS_FSETXATTR = 237 + SYS_REMOVEXATTR = 238 + SYS_FREMOVEXATTR = 239 + SYS_LISTXATTR = 240 + SYS_FLISTXATTR = 241 + SYS_FSCTL = 242 + SYS_INITGROUPS = 243 + SYS_POSIX_SPAWN = 244 + SYS_FFSCTL = 245 + SYS_NFSCLNT = 247 + SYS_FHOPEN = 248 + SYS_MINHERIT = 250 + SYS_SEMSYS = 251 + SYS_MSGSYS = 252 + SYS_SHMSYS = 253 + SYS_SEMCTL = 254 + SYS_SEMGET = 255 + SYS_SEMOP = 256 + SYS_MSGCTL = 258 + SYS_MSGGET = 259 + SYS_MSGSND = 260 + SYS_MSGRCV = 261 + SYS_SHMAT = 262 + SYS_SHMCTL = 263 + SYS_SHMDT = 264 + SYS_SHMGET = 265 + SYS_SHM_OPEN = 266 + SYS_SHM_UNLINK = 267 + SYS_SEM_OPEN = 268 + SYS_SEM_CLOSE = 269 + SYS_SEM_UNLINK = 270 + SYS_SEM_WAIT = 271 + SYS_SEM_TRYWAIT = 272 + SYS_SEM_POST = 273 + SYS_SYSCTLBYNAME = 274 + SYS_OPEN_EXTENDED = 277 + SYS_UMASK_EXTENDED = 278 + SYS_STAT_EXTENDED = 279 + SYS_LSTAT_EXTENDED = 280 + SYS_FSTAT_EXTENDED = 281 + SYS_CHMOD_EXTENDED = 282 + SYS_FCHMOD_EXTENDED = 283 + SYS_ACCESS_EXTENDED = 284 + SYS_SETTID = 285 + SYS_GETTID = 286 + SYS_SETSGROUPS = 287 + SYS_GETSGROUPS = 288 + SYS_SETWGROUPS = 289 + SYS_GETWGROUPS = 290 + SYS_MKFIFO_EXTENDED = 291 + SYS_MKDIR_EXTENDED = 292 + SYS_IDENTITYSVC = 293 + SYS_SHARED_REGION_CHECK_NP = 294 + SYS_VM_PRESSURE_MONITOR = 296 + SYS_PSYNCH_RW_LONGRDLOCK = 297 + SYS_PSYNCH_RW_YIELDWRLOCK = 298 + SYS_PSYNCH_RW_DOWNGRADE = 299 + SYS_PSYNCH_RW_UPGRADE = 300 + SYS_PSYNCH_MUTEXWAIT = 301 + SYS_PSYNCH_MUTEXDROP = 302 + SYS_PSYNCH_CVBROAD = 303 + SYS_PSYNCH_CVSIGNAL = 304 + SYS_PSYNCH_CVWAIT = 305 + SYS_PSYNCH_RW_RDLOCK = 306 + SYS_PSYNCH_RW_WRLOCK = 307 + SYS_PSYNCH_RW_UNLOCK = 308 + SYS_PSYNCH_RW_UNLOCK2 = 309 + SYS_GETSID = 310 + SYS_SETTID_WITH_PID = 311 + SYS_PSYNCH_CVCLRPREPOST = 312 + SYS_AIO_FSYNC = 313 + SYS_AIO_RETURN = 314 + SYS_AIO_SUSPEND = 315 + SYS_AIO_CANCEL = 316 + SYS_AIO_ERROR = 317 + SYS_AIO_READ = 318 + SYS_AIO_WRITE = 319 + SYS_LIO_LISTIO = 320 + SYS_IOPOLICYSYS = 322 + SYS_PROCESS_POLICY = 323 + SYS_MLOCKALL = 324 + SYS_MUNLOCKALL = 325 + SYS_ISSETUGID = 327 + SYS___PTHREAD_KILL = 328 + SYS___PTHREAD_SIGMASK = 329 + SYS___SIGWAIT = 330 + SYS___DISABLE_THREADSIGNAL = 331 + SYS___PTHREAD_MARKCANCEL = 332 + SYS___PTHREAD_CANCELED = 333 + SYS___SEMWAIT_SIGNAL = 334 + SYS_PROC_INFO = 336 + SYS_SENDFILE = 337 + SYS_STAT64 = 338 + SYS_FSTAT64 = 339 + SYS_LSTAT64 = 340 + SYS_STAT64_EXTENDED = 341 + SYS_LSTAT64_EXTENDED = 342 + SYS_FSTAT64_EXTENDED = 343 + SYS_GETDIRENTRIES64 = 344 + SYS_STATFS64 = 345 + SYS_FSTATFS64 = 346 + SYS_GETFSSTAT64 = 347 + SYS___PTHREAD_CHDIR = 348 + SYS___PTHREAD_FCHDIR = 349 + SYS_AUDIT = 350 + SYS_AUDITON = 351 + SYS_GETAUID = 353 + SYS_SETAUID = 354 + SYS_GETAUDIT_ADDR = 357 + SYS_SETAUDIT_ADDR = 358 + SYS_AUDITCTL = 359 + SYS_BSDTHREAD_CREATE = 360 + SYS_BSDTHREAD_TERMINATE = 361 + SYS_KQUEUE = 362 + SYS_KEVENT = 363 + SYS_LCHOWN = 364 + SYS_BSDTHREAD_REGISTER = 366 + SYS_WORKQ_OPEN = 367 + SYS_WORKQ_KERNRETURN = 368 + SYS_KEVENT64 = 369 + SYS___OLD_SEMWAIT_SIGNAL = 370 + SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL = 371 + SYS_THREAD_SELFID = 372 + SYS_LEDGER = 373 + SYS_KEVENT_QOS = 374 + SYS_KEVENT_ID = 375 + SYS___MAC_EXECVE = 380 + SYS___MAC_SYSCALL = 381 + SYS___MAC_GET_FILE = 382 + SYS___MAC_SET_FILE = 383 + SYS___MAC_GET_LINK = 384 + SYS___MAC_SET_LINK = 385 + SYS___MAC_GET_PROC = 386 + SYS___MAC_SET_PROC = 387 + SYS___MAC_GET_FD = 388 + SYS___MAC_SET_FD = 389 + SYS___MAC_GET_PID = 390 + SYS_PSELECT = 394 + SYS_PSELECT_NOCANCEL = 395 + SYS_READ_NOCANCEL = 396 + SYS_WRITE_NOCANCEL = 397 + SYS_OPEN_NOCANCEL = 398 + SYS_CLOSE_NOCANCEL = 399 + SYS_WAIT4_NOCANCEL = 400 + SYS_RECVMSG_NOCANCEL = 401 + SYS_SENDMSG_NOCANCEL = 402 + SYS_RECVFROM_NOCANCEL = 403 + SYS_ACCEPT_NOCANCEL = 404 + SYS_MSYNC_NOCANCEL = 405 + SYS_FCNTL_NOCANCEL = 406 + SYS_SELECT_NOCANCEL = 407 + SYS_FSYNC_NOCANCEL = 408 + SYS_CONNECT_NOCANCEL = 409 + SYS_SIGSUSPEND_NOCANCEL = 410 + SYS_READV_NOCANCEL = 411 + SYS_WRITEV_NOCANCEL = 412 + SYS_SENDTO_NOCANCEL = 413 + SYS_PREAD_NOCANCEL = 414 + SYS_PWRITE_NOCANCEL = 415 + SYS_WAITID_NOCANCEL = 416 + SYS_POLL_NOCANCEL = 417 + SYS_MSGSND_NOCANCEL = 418 + SYS_MSGRCV_NOCANCEL = 419 + SYS_SEM_WAIT_NOCANCEL = 420 + SYS_AIO_SUSPEND_NOCANCEL = 421 + SYS___SIGWAIT_NOCANCEL = 422 + SYS___SEMWAIT_SIGNAL_NOCANCEL = 423 + SYS___MAC_MOUNT = 424 + SYS___MAC_GET_MOUNT = 425 + SYS___MAC_GETFSSTAT = 426 + SYS_FSGETPATH = 427 + SYS_AUDIT_SESSION_SELF = 428 + SYS_AUDIT_SESSION_JOIN = 429 + SYS_FILEPORT_MAKEPORT = 430 + SYS_FILEPORT_MAKEFD = 431 + SYS_AUDIT_SESSION_PORT = 432 + SYS_PID_SUSPEND = 433 + SYS_PID_RESUME = 434 + SYS_PID_HIBERNATE = 435 + SYS_PID_SHUTDOWN_SOCKETS = 436 + SYS_SHARED_REGION_MAP_AND_SLIDE_NP = 438 + SYS_KAS_INFO = 439 + SYS_MEMORYSTATUS_CONTROL = 440 + SYS_GUARDED_OPEN_NP = 441 + SYS_GUARDED_CLOSE_NP = 442 + SYS_GUARDED_KQUEUE_NP = 443 + SYS_CHANGE_FDGUARD_NP = 444 + SYS_USRCTL = 445 + SYS_PROC_RLIMIT_CONTROL = 446 + SYS_CONNECTX = 447 + SYS_DISCONNECTX = 448 + SYS_PEELOFF = 449 + SYS_SOCKET_DELEGATE = 450 + SYS_TELEMETRY = 451 + SYS_PROC_UUID_POLICY = 452 + SYS_MEMORYSTATUS_GET_LEVEL = 453 + SYS_SYSTEM_OVERRIDE = 454 + SYS_VFS_PURGE = 455 + SYS_SFI_CTL = 456 + SYS_SFI_PIDCTL = 457 + SYS_COALITION = 458 + SYS_COALITION_INFO = 459 + SYS_NECP_MATCH_POLICY = 460 + SYS_GETATTRLISTBULK = 461 + SYS_CLONEFILEAT = 462 + SYS_OPENAT = 463 + SYS_OPENAT_NOCANCEL = 464 + SYS_RENAMEAT = 465 + SYS_FACCESSAT = 466 + SYS_FCHMODAT = 467 + SYS_FCHOWNAT = 468 + SYS_FSTATAT = 469 + SYS_FSTATAT64 = 470 + SYS_LINKAT = 471 + SYS_UNLINKAT = 472 + SYS_READLINKAT = 473 + SYS_SYMLINKAT = 474 + SYS_MKDIRAT = 475 + SYS_GETATTRLISTAT = 476 + SYS_PROC_TRACE_LOG = 477 + SYS_BSDTHREAD_CTL = 478 + SYS_OPENBYID_NP = 479 + SYS_RECVMSG_X = 480 + SYS_SENDMSG_X = 481 + SYS_THREAD_SELFUSAGE = 482 + SYS_CSRCTL = 483 + SYS_GUARDED_OPEN_DPROTECTED_NP = 484 + SYS_GUARDED_WRITE_NP = 485 + SYS_GUARDED_PWRITE_NP = 486 + SYS_GUARDED_WRITEV_NP = 487 + SYS_RENAMEATX_NP = 488 + SYS_MREMAP_ENCRYPTED = 489 + SYS_NETAGENT_TRIGGER = 490 + SYS_STACK_SNAPSHOT_WITH_CONFIG = 491 + SYS_MICROSTACKSHOT = 492 + SYS_GRAB_PGO_DATA = 493 + SYS_PERSONA = 494 + SYS_WORK_INTERVAL_CTL = 499 + SYS_GETENTROPY = 500 + SYS_NECP_OPEN = 501 + SYS_NECP_CLIENT_ACTION = 502 + SYS___NEXUS_OPEN = 503 + SYS___NEXUS_REGISTER = 504 + SYS___NEXUS_DEREGISTER = 505 + SYS___NEXUS_CREATE = 506 + SYS___NEXUS_DESTROY = 507 + SYS___NEXUS_GET_OPT = 508 + SYS___NEXUS_SET_OPT = 509 + SYS___CHANNEL_OPEN = 510 + SYS___CHANNEL_GET_INFO = 511 + SYS___CHANNEL_SYNC = 512 + SYS___CHANNEL_GET_OPT = 513 + SYS___CHANNEL_SET_OPT = 514 + SYS_ULOCK_WAIT = 515 + SYS_ULOCK_WAKE = 516 + SYS_FCLONEFILEAT = 517 + SYS_FS_SNAPSHOT = 518 + SYS_TERMINATE_WITH_PAYLOAD = 520 + SYS_ABORT_WITH_PAYLOAD = 521 + SYS_NECP_SESSION_OPEN = 522 + SYS_NECP_SESSION_ACTION = 523 + SYS_SETATTRLISTAT = 524 + SYS_NET_QOS_GUIDELINE = 525 + SYS_FMOUNT = 526 + SYS_NTP_ADJTIME = 527 + SYS_NTP_GETTIME = 528 + SYS_OS_FAULT_WITH_PAYLOAD = 529 + SYS_MAXSYSCALL = 530 + SYS_INVALID = 63 +) diff --git a/api/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm.go b/api/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm.go new file mode 100644 index 0000000..f2df27d --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm.go @@ -0,0 +1,436 @@ +// mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.1.sdk/usr/include/sys/syscall.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,darwin + +package unix + +const ( + SYS_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_WAIT4 = 7 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_CHDIR = 12 + SYS_FCHDIR = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_CHOWN = 16 + SYS_GETFSSTAT = 18 + SYS_GETPID = 20 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_GETEUID = 25 + SYS_PTRACE = 26 + SYS_RECVMSG = 27 + SYS_SENDMSG = 28 + SYS_RECVFROM = 29 + SYS_ACCEPT = 30 + SYS_GETPEERNAME = 31 + SYS_GETSOCKNAME = 32 + SYS_ACCESS = 33 + SYS_CHFLAGS = 34 + SYS_FCHFLAGS = 35 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_GETPPID = 39 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_GETEGID = 43 + SYS_SIGACTION = 46 + SYS_GETGID = 47 + SYS_SIGPROCMASK = 48 + SYS_GETLOGIN = 49 + SYS_SETLOGIN = 50 + SYS_ACCT = 51 + SYS_SIGPENDING = 52 + SYS_SIGALTSTACK = 53 + SYS_IOCTL = 54 + SYS_REBOOT = 55 + SYS_REVOKE = 56 + SYS_SYMLINK = 57 + SYS_READLINK = 58 + SYS_EXECVE = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_MSYNC = 65 + SYS_VFORK = 66 + SYS_MUNMAP = 73 + SYS_MPROTECT = 74 + SYS_MADVISE = 75 + SYS_MINCORE = 78 + SYS_GETGROUPS = 79 + SYS_SETGROUPS = 80 + SYS_GETPGRP = 81 + SYS_SETPGID = 82 + SYS_SETITIMER = 83 + SYS_SWAPON = 85 + SYS_GETITIMER = 86 + SYS_GETDTABLESIZE = 89 + SYS_DUP2 = 90 + SYS_FCNTL = 92 + SYS_SELECT = 93 + SYS_FSYNC = 95 + SYS_SETPRIORITY = 96 + SYS_SOCKET = 97 + SYS_CONNECT = 98 + SYS_GETPRIORITY = 100 + SYS_BIND = 104 + SYS_SETSOCKOPT = 105 + SYS_LISTEN = 106 + SYS_SIGSUSPEND = 111 + SYS_GETTIMEOFDAY = 116 + SYS_GETRUSAGE = 117 + SYS_GETSOCKOPT = 118 + SYS_READV = 120 + SYS_WRITEV = 121 + SYS_SETTIMEOFDAY = 122 + SYS_FCHOWN = 123 + SYS_FCHMOD = 124 + SYS_SETREUID = 126 + SYS_SETREGID = 127 + SYS_RENAME = 128 + SYS_FLOCK = 131 + SYS_MKFIFO = 132 + SYS_SENDTO = 133 + SYS_SHUTDOWN = 134 + SYS_SOCKETPAIR = 135 + SYS_MKDIR = 136 + SYS_RMDIR = 137 + SYS_UTIMES = 138 + SYS_FUTIMES = 139 + SYS_ADJTIME = 140 + SYS_GETHOSTUUID = 142 + SYS_SETSID = 147 + SYS_GETPGID = 151 + SYS_SETPRIVEXEC = 152 + SYS_PREAD = 153 + SYS_PWRITE = 154 + SYS_NFSSVC = 155 + SYS_STATFS = 157 + SYS_FSTATFS = 158 + SYS_UNMOUNT = 159 + SYS_GETFH = 161 + SYS_QUOTACTL = 165 + SYS_MOUNT = 167 + SYS_CSOPS = 169 + SYS_CSOPS_AUDITTOKEN = 170 + SYS_WAITID = 173 + SYS_KDEBUG_TYPEFILTER = 177 + SYS_KDEBUG_TRACE_STRING = 178 + SYS_KDEBUG_TRACE64 = 179 + SYS_KDEBUG_TRACE = 180 + SYS_SETGID = 181 + SYS_SETEGID = 182 + SYS_SETEUID = 183 + SYS_SIGRETURN = 184 + SYS_THREAD_SELFCOUNTS = 186 + SYS_FDATASYNC = 187 + SYS_STAT = 188 + SYS_FSTAT = 189 + SYS_LSTAT = 190 + SYS_PATHCONF = 191 + SYS_FPATHCONF = 192 + SYS_GETRLIMIT = 194 + SYS_SETRLIMIT = 195 + SYS_GETDIRENTRIES = 196 + SYS_MMAP = 197 + SYS_LSEEK = 199 + SYS_TRUNCATE = 200 + SYS_FTRUNCATE = 201 + SYS_SYSCTL = 202 + SYS_MLOCK = 203 + SYS_MUNLOCK = 204 + SYS_UNDELETE = 205 + SYS_OPEN_DPROTECTED_NP = 216 + SYS_GETATTRLIST = 220 + SYS_SETATTRLIST = 221 + SYS_GETDIRENTRIESATTR = 222 + SYS_EXCHANGEDATA = 223 + SYS_SEARCHFS = 225 + SYS_DELETE = 226 + SYS_COPYFILE = 227 + SYS_FGETATTRLIST = 228 + SYS_FSETATTRLIST = 229 + SYS_POLL = 230 + SYS_WATCHEVENT = 231 + SYS_WAITEVENT = 232 + SYS_MODWATCH = 233 + SYS_GETXATTR = 234 + SYS_FGETXATTR = 235 + SYS_SETXATTR = 236 + SYS_FSETXATTR = 237 + SYS_REMOVEXATTR = 238 + SYS_FREMOVEXATTR = 239 + SYS_LISTXATTR = 240 + SYS_FLISTXATTR = 241 + SYS_FSCTL = 242 + SYS_INITGROUPS = 243 + SYS_POSIX_SPAWN = 244 + SYS_FFSCTL = 245 + SYS_NFSCLNT = 247 + SYS_FHOPEN = 248 + SYS_MINHERIT = 250 + SYS_SEMSYS = 251 + SYS_MSGSYS = 252 + SYS_SHMSYS = 253 + SYS_SEMCTL = 254 + SYS_SEMGET = 255 + SYS_SEMOP = 256 + SYS_MSGCTL = 258 + SYS_MSGGET = 259 + SYS_MSGSND = 260 + SYS_MSGRCV = 261 + SYS_SHMAT = 262 + SYS_SHMCTL = 263 + SYS_SHMDT = 264 + SYS_SHMGET = 265 + SYS_SHM_OPEN = 266 + SYS_SHM_UNLINK = 267 + SYS_SEM_OPEN = 268 + SYS_SEM_CLOSE = 269 + SYS_SEM_UNLINK = 270 + SYS_SEM_WAIT = 271 + SYS_SEM_TRYWAIT = 272 + SYS_SEM_POST = 273 + SYS_SYSCTLBYNAME = 274 + SYS_OPEN_EXTENDED = 277 + SYS_UMASK_EXTENDED = 278 + SYS_STAT_EXTENDED = 279 + SYS_LSTAT_EXTENDED = 280 + SYS_FSTAT_EXTENDED = 281 + SYS_CHMOD_EXTENDED = 282 + SYS_FCHMOD_EXTENDED = 283 + SYS_ACCESS_EXTENDED = 284 + SYS_SETTID = 285 + SYS_GETTID = 286 + SYS_SETSGROUPS = 287 + SYS_GETSGROUPS = 288 + SYS_SETWGROUPS = 289 + SYS_GETWGROUPS = 290 + SYS_MKFIFO_EXTENDED = 291 + SYS_MKDIR_EXTENDED = 292 + SYS_IDENTITYSVC = 293 + SYS_SHARED_REGION_CHECK_NP = 294 + SYS_VM_PRESSURE_MONITOR = 296 + SYS_PSYNCH_RW_LONGRDLOCK = 297 + SYS_PSYNCH_RW_YIELDWRLOCK = 298 + SYS_PSYNCH_RW_DOWNGRADE = 299 + SYS_PSYNCH_RW_UPGRADE = 300 + SYS_PSYNCH_MUTEXWAIT = 301 + SYS_PSYNCH_MUTEXDROP = 302 + SYS_PSYNCH_CVBROAD = 303 + SYS_PSYNCH_CVSIGNAL = 304 + SYS_PSYNCH_CVWAIT = 305 + SYS_PSYNCH_RW_RDLOCK = 306 + SYS_PSYNCH_RW_WRLOCK = 307 + SYS_PSYNCH_RW_UNLOCK = 308 + SYS_PSYNCH_RW_UNLOCK2 = 309 + SYS_GETSID = 310 + SYS_SETTID_WITH_PID = 311 + SYS_PSYNCH_CVCLRPREPOST = 312 + SYS_AIO_FSYNC = 313 + SYS_AIO_RETURN = 314 + SYS_AIO_SUSPEND = 315 + SYS_AIO_CANCEL = 316 + SYS_AIO_ERROR = 317 + SYS_AIO_READ = 318 + SYS_AIO_WRITE = 319 + SYS_LIO_LISTIO = 320 + SYS_IOPOLICYSYS = 322 + SYS_PROCESS_POLICY = 323 + SYS_MLOCKALL = 324 + SYS_MUNLOCKALL = 325 + SYS_ISSETUGID = 327 + SYS___PTHREAD_KILL = 328 + SYS___PTHREAD_SIGMASK = 329 + SYS___SIGWAIT = 330 + SYS___DISABLE_THREADSIGNAL = 331 + SYS___PTHREAD_MARKCANCEL = 332 + SYS___PTHREAD_CANCELED = 333 + SYS___SEMWAIT_SIGNAL = 334 + SYS_PROC_INFO = 336 + SYS_SENDFILE = 337 + SYS_STAT64 = 338 + SYS_FSTAT64 = 339 + SYS_LSTAT64 = 340 + SYS_STAT64_EXTENDED = 341 + SYS_LSTAT64_EXTENDED = 342 + SYS_FSTAT64_EXTENDED = 343 + SYS_GETDIRENTRIES64 = 344 + SYS_STATFS64 = 345 + SYS_FSTATFS64 = 346 + SYS_GETFSSTAT64 = 347 + SYS___PTHREAD_CHDIR = 348 + SYS___PTHREAD_FCHDIR = 349 + SYS_AUDIT = 350 + SYS_AUDITON = 351 + SYS_GETAUID = 353 + SYS_SETAUID = 354 + SYS_GETAUDIT_ADDR = 357 + SYS_SETAUDIT_ADDR = 358 + SYS_AUDITCTL = 359 + SYS_BSDTHREAD_CREATE = 360 + SYS_BSDTHREAD_TERMINATE = 361 + SYS_KQUEUE = 362 + SYS_KEVENT = 363 + SYS_LCHOWN = 364 + SYS_BSDTHREAD_REGISTER = 366 + SYS_WORKQ_OPEN = 367 + SYS_WORKQ_KERNRETURN = 368 + SYS_KEVENT64 = 369 + SYS___OLD_SEMWAIT_SIGNAL = 370 + SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL = 371 + SYS_THREAD_SELFID = 372 + SYS_LEDGER = 373 + SYS_KEVENT_QOS = 374 + SYS_KEVENT_ID = 375 + SYS___MAC_EXECVE = 380 + SYS___MAC_SYSCALL = 381 + SYS___MAC_GET_FILE = 382 + SYS___MAC_SET_FILE = 383 + SYS___MAC_GET_LINK = 384 + SYS___MAC_SET_LINK = 385 + SYS___MAC_GET_PROC = 386 + SYS___MAC_SET_PROC = 387 + SYS___MAC_GET_FD = 388 + SYS___MAC_SET_FD = 389 + SYS___MAC_GET_PID = 390 + SYS_PSELECT = 394 + SYS_PSELECT_NOCANCEL = 395 + SYS_READ_NOCANCEL = 396 + SYS_WRITE_NOCANCEL = 397 + SYS_OPEN_NOCANCEL = 398 + SYS_CLOSE_NOCANCEL = 399 + SYS_WAIT4_NOCANCEL = 400 + SYS_RECVMSG_NOCANCEL = 401 + SYS_SENDMSG_NOCANCEL = 402 + SYS_RECVFROM_NOCANCEL = 403 + SYS_ACCEPT_NOCANCEL = 404 + SYS_MSYNC_NOCANCEL = 405 + SYS_FCNTL_NOCANCEL = 406 + SYS_SELECT_NOCANCEL = 407 + SYS_FSYNC_NOCANCEL = 408 + SYS_CONNECT_NOCANCEL = 409 + SYS_SIGSUSPEND_NOCANCEL = 410 + SYS_READV_NOCANCEL = 411 + SYS_WRITEV_NOCANCEL = 412 + SYS_SENDTO_NOCANCEL = 413 + SYS_PREAD_NOCANCEL = 414 + SYS_PWRITE_NOCANCEL = 415 + SYS_WAITID_NOCANCEL = 416 + SYS_POLL_NOCANCEL = 417 + SYS_MSGSND_NOCANCEL = 418 + SYS_MSGRCV_NOCANCEL = 419 + SYS_SEM_WAIT_NOCANCEL = 420 + SYS_AIO_SUSPEND_NOCANCEL = 421 + SYS___SIGWAIT_NOCANCEL = 422 + SYS___SEMWAIT_SIGNAL_NOCANCEL = 423 + SYS___MAC_MOUNT = 424 + SYS___MAC_GET_MOUNT = 425 + SYS___MAC_GETFSSTAT = 426 + SYS_FSGETPATH = 427 + SYS_AUDIT_SESSION_SELF = 428 + SYS_AUDIT_SESSION_JOIN = 429 + SYS_FILEPORT_MAKEPORT = 430 + SYS_FILEPORT_MAKEFD = 431 + SYS_AUDIT_SESSION_PORT = 432 + SYS_PID_SUSPEND = 433 + SYS_PID_RESUME = 434 + SYS_PID_HIBERNATE = 435 + SYS_PID_SHUTDOWN_SOCKETS = 436 + SYS_SHARED_REGION_MAP_AND_SLIDE_NP = 438 + SYS_KAS_INFO = 439 + SYS_MEMORYSTATUS_CONTROL = 440 + SYS_GUARDED_OPEN_NP = 441 + SYS_GUARDED_CLOSE_NP = 442 + SYS_GUARDED_KQUEUE_NP = 443 + SYS_CHANGE_FDGUARD_NP = 444 + SYS_USRCTL = 445 + SYS_PROC_RLIMIT_CONTROL = 446 + SYS_CONNECTX = 447 + SYS_DISCONNECTX = 448 + SYS_PEELOFF = 449 + SYS_SOCKET_DELEGATE = 450 + SYS_TELEMETRY = 451 + SYS_PROC_UUID_POLICY = 452 + SYS_MEMORYSTATUS_GET_LEVEL = 453 + SYS_SYSTEM_OVERRIDE = 454 + SYS_VFS_PURGE = 455 + SYS_SFI_CTL = 456 + SYS_SFI_PIDCTL = 457 + SYS_COALITION = 458 + SYS_COALITION_INFO = 459 + SYS_NECP_MATCH_POLICY = 460 + SYS_GETATTRLISTBULK = 461 + SYS_CLONEFILEAT = 462 + SYS_OPENAT = 463 + SYS_OPENAT_NOCANCEL = 464 + SYS_RENAMEAT = 465 + SYS_FACCESSAT = 466 + SYS_FCHMODAT = 467 + SYS_FCHOWNAT = 468 + SYS_FSTATAT = 469 + SYS_FSTATAT64 = 470 + SYS_LINKAT = 471 + SYS_UNLINKAT = 472 + SYS_READLINKAT = 473 + SYS_SYMLINKAT = 474 + SYS_MKDIRAT = 475 + SYS_GETATTRLISTAT = 476 + SYS_PROC_TRACE_LOG = 477 + SYS_BSDTHREAD_CTL = 478 + SYS_OPENBYID_NP = 479 + SYS_RECVMSG_X = 480 + SYS_SENDMSG_X = 481 + SYS_THREAD_SELFUSAGE = 482 + SYS_CSRCTL = 483 + SYS_GUARDED_OPEN_DPROTECTED_NP = 484 + SYS_GUARDED_WRITE_NP = 485 + SYS_GUARDED_PWRITE_NP = 486 + SYS_GUARDED_WRITEV_NP = 487 + SYS_RENAMEATX_NP = 488 + SYS_MREMAP_ENCRYPTED = 489 + SYS_NETAGENT_TRIGGER = 490 + SYS_STACK_SNAPSHOT_WITH_CONFIG = 491 + SYS_MICROSTACKSHOT = 492 + SYS_GRAB_PGO_DATA = 493 + SYS_PERSONA = 494 + SYS_WORK_INTERVAL_CTL = 499 + SYS_GETENTROPY = 500 + SYS_NECP_OPEN = 501 + SYS_NECP_CLIENT_ACTION = 502 + SYS___NEXUS_OPEN = 503 + SYS___NEXUS_REGISTER = 504 + SYS___NEXUS_DEREGISTER = 505 + SYS___NEXUS_CREATE = 506 + SYS___NEXUS_DESTROY = 507 + SYS___NEXUS_GET_OPT = 508 + SYS___NEXUS_SET_OPT = 509 + SYS___CHANNEL_OPEN = 510 + SYS___CHANNEL_GET_INFO = 511 + SYS___CHANNEL_SYNC = 512 + SYS___CHANNEL_GET_OPT = 513 + SYS___CHANNEL_SET_OPT = 514 + SYS_ULOCK_WAIT = 515 + SYS_ULOCK_WAKE = 516 + SYS_FCLONEFILEAT = 517 + SYS_FS_SNAPSHOT = 518 + SYS_TERMINATE_WITH_PAYLOAD = 520 + SYS_ABORT_WITH_PAYLOAD = 521 + SYS_NECP_SESSION_OPEN = 522 + SYS_NECP_SESSION_ACTION = 523 + SYS_SETATTRLISTAT = 524 + SYS_NET_QOS_GUIDELINE = 525 + SYS_FMOUNT = 526 + SYS_NTP_ADJTIME = 527 + SYS_NTP_GETTIME = 528 + SYS_OS_FAULT_WITH_PAYLOAD = 529 + SYS_MAXSYSCALL = 530 + SYS_INVALID = 63 +) diff --git a/api/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go b/api/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go new file mode 100644 index 0000000..9694630 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go @@ -0,0 +1,436 @@ +// mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.1.sdk/usr/include/sys/syscall.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm64,darwin + +package unix + +const ( + SYS_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_WAIT4 = 7 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_CHDIR = 12 + SYS_FCHDIR = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_CHOWN = 16 + SYS_GETFSSTAT = 18 + SYS_GETPID = 20 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_GETEUID = 25 + SYS_PTRACE = 26 + SYS_RECVMSG = 27 + SYS_SENDMSG = 28 + SYS_RECVFROM = 29 + SYS_ACCEPT = 30 + SYS_GETPEERNAME = 31 + SYS_GETSOCKNAME = 32 + SYS_ACCESS = 33 + SYS_CHFLAGS = 34 + SYS_FCHFLAGS = 35 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_GETPPID = 39 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_GETEGID = 43 + SYS_SIGACTION = 46 + SYS_GETGID = 47 + SYS_SIGPROCMASK = 48 + SYS_GETLOGIN = 49 + SYS_SETLOGIN = 50 + SYS_ACCT = 51 + SYS_SIGPENDING = 52 + SYS_SIGALTSTACK = 53 + SYS_IOCTL = 54 + SYS_REBOOT = 55 + SYS_REVOKE = 56 + SYS_SYMLINK = 57 + SYS_READLINK = 58 + SYS_EXECVE = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_MSYNC = 65 + SYS_VFORK = 66 + SYS_MUNMAP = 73 + SYS_MPROTECT = 74 + SYS_MADVISE = 75 + SYS_MINCORE = 78 + SYS_GETGROUPS = 79 + SYS_SETGROUPS = 80 + SYS_GETPGRP = 81 + SYS_SETPGID = 82 + SYS_SETITIMER = 83 + SYS_SWAPON = 85 + SYS_GETITIMER = 86 + SYS_GETDTABLESIZE = 89 + SYS_DUP2 = 90 + SYS_FCNTL = 92 + SYS_SELECT = 93 + SYS_FSYNC = 95 + SYS_SETPRIORITY = 96 + SYS_SOCKET = 97 + SYS_CONNECT = 98 + SYS_GETPRIORITY = 100 + SYS_BIND = 104 + SYS_SETSOCKOPT = 105 + SYS_LISTEN = 106 + SYS_SIGSUSPEND = 111 + SYS_GETTIMEOFDAY = 116 + SYS_GETRUSAGE = 117 + SYS_GETSOCKOPT = 118 + SYS_READV = 120 + SYS_WRITEV = 121 + SYS_SETTIMEOFDAY = 122 + SYS_FCHOWN = 123 + SYS_FCHMOD = 124 + SYS_SETREUID = 126 + SYS_SETREGID = 127 + SYS_RENAME = 128 + SYS_FLOCK = 131 + SYS_MKFIFO = 132 + SYS_SENDTO = 133 + SYS_SHUTDOWN = 134 + SYS_SOCKETPAIR = 135 + SYS_MKDIR = 136 + SYS_RMDIR = 137 + SYS_UTIMES = 138 + SYS_FUTIMES = 139 + SYS_ADJTIME = 140 + SYS_GETHOSTUUID = 142 + SYS_SETSID = 147 + SYS_GETPGID = 151 + SYS_SETPRIVEXEC = 152 + SYS_PREAD = 153 + SYS_PWRITE = 154 + SYS_NFSSVC = 155 + SYS_STATFS = 157 + SYS_FSTATFS = 158 + SYS_UNMOUNT = 159 + SYS_GETFH = 161 + SYS_QUOTACTL = 165 + SYS_MOUNT = 167 + SYS_CSOPS = 169 + SYS_CSOPS_AUDITTOKEN = 170 + SYS_WAITID = 173 + SYS_KDEBUG_TYPEFILTER = 177 + SYS_KDEBUG_TRACE_STRING = 178 + SYS_KDEBUG_TRACE64 = 179 + SYS_KDEBUG_TRACE = 180 + SYS_SETGID = 181 + SYS_SETEGID = 182 + SYS_SETEUID = 183 + SYS_SIGRETURN = 184 + SYS_THREAD_SELFCOUNTS = 186 + SYS_FDATASYNC = 187 + SYS_STAT = 188 + SYS_FSTAT = 189 + SYS_LSTAT = 190 + SYS_PATHCONF = 191 + SYS_FPATHCONF = 192 + SYS_GETRLIMIT = 194 + SYS_SETRLIMIT = 195 + SYS_GETDIRENTRIES = 196 + SYS_MMAP = 197 + SYS_LSEEK = 199 + SYS_TRUNCATE = 200 + SYS_FTRUNCATE = 201 + SYS_SYSCTL = 202 + SYS_MLOCK = 203 + SYS_MUNLOCK = 204 + SYS_UNDELETE = 205 + SYS_OPEN_DPROTECTED_NP = 216 + SYS_GETATTRLIST = 220 + SYS_SETATTRLIST = 221 + SYS_GETDIRENTRIESATTR = 222 + SYS_EXCHANGEDATA = 223 + SYS_SEARCHFS = 225 + SYS_DELETE = 226 + SYS_COPYFILE = 227 + SYS_FGETATTRLIST = 228 + SYS_FSETATTRLIST = 229 + SYS_POLL = 230 + SYS_WATCHEVENT = 231 + SYS_WAITEVENT = 232 + SYS_MODWATCH = 233 + SYS_GETXATTR = 234 + SYS_FGETXATTR = 235 + SYS_SETXATTR = 236 + SYS_FSETXATTR = 237 + SYS_REMOVEXATTR = 238 + SYS_FREMOVEXATTR = 239 + SYS_LISTXATTR = 240 + SYS_FLISTXATTR = 241 + SYS_FSCTL = 242 + SYS_INITGROUPS = 243 + SYS_POSIX_SPAWN = 244 + SYS_FFSCTL = 245 + SYS_NFSCLNT = 247 + SYS_FHOPEN = 248 + SYS_MINHERIT = 250 + SYS_SEMSYS = 251 + SYS_MSGSYS = 252 + SYS_SHMSYS = 253 + SYS_SEMCTL = 254 + SYS_SEMGET = 255 + SYS_SEMOP = 256 + SYS_MSGCTL = 258 + SYS_MSGGET = 259 + SYS_MSGSND = 260 + SYS_MSGRCV = 261 + SYS_SHMAT = 262 + SYS_SHMCTL = 263 + SYS_SHMDT = 264 + SYS_SHMGET = 265 + SYS_SHM_OPEN = 266 + SYS_SHM_UNLINK = 267 + SYS_SEM_OPEN = 268 + SYS_SEM_CLOSE = 269 + SYS_SEM_UNLINK = 270 + SYS_SEM_WAIT = 271 + SYS_SEM_TRYWAIT = 272 + SYS_SEM_POST = 273 + SYS_SYSCTLBYNAME = 274 + SYS_OPEN_EXTENDED = 277 + SYS_UMASK_EXTENDED = 278 + SYS_STAT_EXTENDED = 279 + SYS_LSTAT_EXTENDED = 280 + SYS_FSTAT_EXTENDED = 281 + SYS_CHMOD_EXTENDED = 282 + SYS_FCHMOD_EXTENDED = 283 + SYS_ACCESS_EXTENDED = 284 + SYS_SETTID = 285 + SYS_GETTID = 286 + SYS_SETSGROUPS = 287 + SYS_GETSGROUPS = 288 + SYS_SETWGROUPS = 289 + SYS_GETWGROUPS = 290 + SYS_MKFIFO_EXTENDED = 291 + SYS_MKDIR_EXTENDED = 292 + SYS_IDENTITYSVC = 293 + SYS_SHARED_REGION_CHECK_NP = 294 + SYS_VM_PRESSURE_MONITOR = 296 + SYS_PSYNCH_RW_LONGRDLOCK = 297 + SYS_PSYNCH_RW_YIELDWRLOCK = 298 + SYS_PSYNCH_RW_DOWNGRADE = 299 + SYS_PSYNCH_RW_UPGRADE = 300 + SYS_PSYNCH_MUTEXWAIT = 301 + SYS_PSYNCH_MUTEXDROP = 302 + SYS_PSYNCH_CVBROAD = 303 + SYS_PSYNCH_CVSIGNAL = 304 + SYS_PSYNCH_CVWAIT = 305 + SYS_PSYNCH_RW_RDLOCK = 306 + SYS_PSYNCH_RW_WRLOCK = 307 + SYS_PSYNCH_RW_UNLOCK = 308 + SYS_PSYNCH_RW_UNLOCK2 = 309 + SYS_GETSID = 310 + SYS_SETTID_WITH_PID = 311 + SYS_PSYNCH_CVCLRPREPOST = 312 + SYS_AIO_FSYNC = 313 + SYS_AIO_RETURN = 314 + SYS_AIO_SUSPEND = 315 + SYS_AIO_CANCEL = 316 + SYS_AIO_ERROR = 317 + SYS_AIO_READ = 318 + SYS_AIO_WRITE = 319 + SYS_LIO_LISTIO = 320 + SYS_IOPOLICYSYS = 322 + SYS_PROCESS_POLICY = 323 + SYS_MLOCKALL = 324 + SYS_MUNLOCKALL = 325 + SYS_ISSETUGID = 327 + SYS___PTHREAD_KILL = 328 + SYS___PTHREAD_SIGMASK = 329 + SYS___SIGWAIT = 330 + SYS___DISABLE_THREADSIGNAL = 331 + SYS___PTHREAD_MARKCANCEL = 332 + SYS___PTHREAD_CANCELED = 333 + SYS___SEMWAIT_SIGNAL = 334 + SYS_PROC_INFO = 336 + SYS_SENDFILE = 337 + SYS_STAT64 = 338 + SYS_FSTAT64 = 339 + SYS_LSTAT64 = 340 + SYS_STAT64_EXTENDED = 341 + SYS_LSTAT64_EXTENDED = 342 + SYS_FSTAT64_EXTENDED = 343 + SYS_GETDIRENTRIES64 = 344 + SYS_STATFS64 = 345 + SYS_FSTATFS64 = 346 + SYS_GETFSSTAT64 = 347 + SYS___PTHREAD_CHDIR = 348 + SYS___PTHREAD_FCHDIR = 349 + SYS_AUDIT = 350 + SYS_AUDITON = 351 + SYS_GETAUID = 353 + SYS_SETAUID = 354 + SYS_GETAUDIT_ADDR = 357 + SYS_SETAUDIT_ADDR = 358 + SYS_AUDITCTL = 359 + SYS_BSDTHREAD_CREATE = 360 + SYS_BSDTHREAD_TERMINATE = 361 + SYS_KQUEUE = 362 + SYS_KEVENT = 363 + SYS_LCHOWN = 364 + SYS_BSDTHREAD_REGISTER = 366 + SYS_WORKQ_OPEN = 367 + SYS_WORKQ_KERNRETURN = 368 + SYS_KEVENT64 = 369 + SYS___OLD_SEMWAIT_SIGNAL = 370 + SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL = 371 + SYS_THREAD_SELFID = 372 + SYS_LEDGER = 373 + SYS_KEVENT_QOS = 374 + SYS_KEVENT_ID = 375 + SYS___MAC_EXECVE = 380 + SYS___MAC_SYSCALL = 381 + SYS___MAC_GET_FILE = 382 + SYS___MAC_SET_FILE = 383 + SYS___MAC_GET_LINK = 384 + SYS___MAC_SET_LINK = 385 + SYS___MAC_GET_PROC = 386 + SYS___MAC_SET_PROC = 387 + SYS___MAC_GET_FD = 388 + SYS___MAC_SET_FD = 389 + SYS___MAC_GET_PID = 390 + SYS_PSELECT = 394 + SYS_PSELECT_NOCANCEL = 395 + SYS_READ_NOCANCEL = 396 + SYS_WRITE_NOCANCEL = 397 + SYS_OPEN_NOCANCEL = 398 + SYS_CLOSE_NOCANCEL = 399 + SYS_WAIT4_NOCANCEL = 400 + SYS_RECVMSG_NOCANCEL = 401 + SYS_SENDMSG_NOCANCEL = 402 + SYS_RECVFROM_NOCANCEL = 403 + SYS_ACCEPT_NOCANCEL = 404 + SYS_MSYNC_NOCANCEL = 405 + SYS_FCNTL_NOCANCEL = 406 + SYS_SELECT_NOCANCEL = 407 + SYS_FSYNC_NOCANCEL = 408 + SYS_CONNECT_NOCANCEL = 409 + SYS_SIGSUSPEND_NOCANCEL = 410 + SYS_READV_NOCANCEL = 411 + SYS_WRITEV_NOCANCEL = 412 + SYS_SENDTO_NOCANCEL = 413 + SYS_PREAD_NOCANCEL = 414 + SYS_PWRITE_NOCANCEL = 415 + SYS_WAITID_NOCANCEL = 416 + SYS_POLL_NOCANCEL = 417 + SYS_MSGSND_NOCANCEL = 418 + SYS_MSGRCV_NOCANCEL = 419 + SYS_SEM_WAIT_NOCANCEL = 420 + SYS_AIO_SUSPEND_NOCANCEL = 421 + SYS___SIGWAIT_NOCANCEL = 422 + SYS___SEMWAIT_SIGNAL_NOCANCEL = 423 + SYS___MAC_MOUNT = 424 + SYS___MAC_GET_MOUNT = 425 + SYS___MAC_GETFSSTAT = 426 + SYS_FSGETPATH = 427 + SYS_AUDIT_SESSION_SELF = 428 + SYS_AUDIT_SESSION_JOIN = 429 + SYS_FILEPORT_MAKEPORT = 430 + SYS_FILEPORT_MAKEFD = 431 + SYS_AUDIT_SESSION_PORT = 432 + SYS_PID_SUSPEND = 433 + SYS_PID_RESUME = 434 + SYS_PID_HIBERNATE = 435 + SYS_PID_SHUTDOWN_SOCKETS = 436 + SYS_SHARED_REGION_MAP_AND_SLIDE_NP = 438 + SYS_KAS_INFO = 439 + SYS_MEMORYSTATUS_CONTROL = 440 + SYS_GUARDED_OPEN_NP = 441 + SYS_GUARDED_CLOSE_NP = 442 + SYS_GUARDED_KQUEUE_NP = 443 + SYS_CHANGE_FDGUARD_NP = 444 + SYS_USRCTL = 445 + SYS_PROC_RLIMIT_CONTROL = 446 + SYS_CONNECTX = 447 + SYS_DISCONNECTX = 448 + SYS_PEELOFF = 449 + SYS_SOCKET_DELEGATE = 450 + SYS_TELEMETRY = 451 + SYS_PROC_UUID_POLICY = 452 + SYS_MEMORYSTATUS_GET_LEVEL = 453 + SYS_SYSTEM_OVERRIDE = 454 + SYS_VFS_PURGE = 455 + SYS_SFI_CTL = 456 + SYS_SFI_PIDCTL = 457 + SYS_COALITION = 458 + SYS_COALITION_INFO = 459 + SYS_NECP_MATCH_POLICY = 460 + SYS_GETATTRLISTBULK = 461 + SYS_CLONEFILEAT = 462 + SYS_OPENAT = 463 + SYS_OPENAT_NOCANCEL = 464 + SYS_RENAMEAT = 465 + SYS_FACCESSAT = 466 + SYS_FCHMODAT = 467 + SYS_FCHOWNAT = 468 + SYS_FSTATAT = 469 + SYS_FSTATAT64 = 470 + SYS_LINKAT = 471 + SYS_UNLINKAT = 472 + SYS_READLINKAT = 473 + SYS_SYMLINKAT = 474 + SYS_MKDIRAT = 475 + SYS_GETATTRLISTAT = 476 + SYS_PROC_TRACE_LOG = 477 + SYS_BSDTHREAD_CTL = 478 + SYS_OPENBYID_NP = 479 + SYS_RECVMSG_X = 480 + SYS_SENDMSG_X = 481 + SYS_THREAD_SELFUSAGE = 482 + SYS_CSRCTL = 483 + SYS_GUARDED_OPEN_DPROTECTED_NP = 484 + SYS_GUARDED_WRITE_NP = 485 + SYS_GUARDED_PWRITE_NP = 486 + SYS_GUARDED_WRITEV_NP = 487 + SYS_RENAMEATX_NP = 488 + SYS_MREMAP_ENCRYPTED = 489 + SYS_NETAGENT_TRIGGER = 490 + SYS_STACK_SNAPSHOT_WITH_CONFIG = 491 + SYS_MICROSTACKSHOT = 492 + SYS_GRAB_PGO_DATA = 493 + SYS_PERSONA = 494 + SYS_WORK_INTERVAL_CTL = 499 + SYS_GETENTROPY = 500 + SYS_NECP_OPEN = 501 + SYS_NECP_CLIENT_ACTION = 502 + SYS___NEXUS_OPEN = 503 + SYS___NEXUS_REGISTER = 504 + SYS___NEXUS_DEREGISTER = 505 + SYS___NEXUS_CREATE = 506 + SYS___NEXUS_DESTROY = 507 + SYS___NEXUS_GET_OPT = 508 + SYS___NEXUS_SET_OPT = 509 + SYS___CHANNEL_OPEN = 510 + SYS___CHANNEL_GET_INFO = 511 + SYS___CHANNEL_SYNC = 512 + SYS___CHANNEL_GET_OPT = 513 + SYS___CHANNEL_SET_OPT = 514 + SYS_ULOCK_WAIT = 515 + SYS_ULOCK_WAKE = 516 + SYS_FCLONEFILEAT = 517 + SYS_FS_SNAPSHOT = 518 + SYS_TERMINATE_WITH_PAYLOAD = 520 + SYS_ABORT_WITH_PAYLOAD = 521 + SYS_NECP_SESSION_OPEN = 522 + SYS_NECP_SESSION_ACTION = 523 + SYS_SETATTRLISTAT = 524 + SYS_NET_QOS_GUIDELINE = 525 + SYS_FMOUNT = 526 + SYS_NTP_ADJTIME = 527 + SYS_NTP_GETTIME = 528 + SYS_OS_FAULT_WITH_PAYLOAD = 529 + SYS_MAXSYSCALL = 530 + SYS_INVALID = 63 +) diff --git a/api/vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go b/api/vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go new file mode 100644 index 0000000..b2c9ef8 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go @@ -0,0 +1,315 @@ +// mksysnum_dragonfly.pl +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,dragonfly + +package unix + +const ( + // SYS_NOSYS = 0; // { int nosys(void); } syscall nosys_args int + SYS_EXIT = 1 // { void exit(int rval); } + SYS_FORK = 2 // { int fork(void); } + SYS_READ = 3 // { ssize_t read(int fd, void *buf, size_t nbyte); } + SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, size_t nbyte); } + SYS_OPEN = 5 // { int open(char *path, int flags, int mode); } + SYS_CLOSE = 6 // { int close(int fd); } + SYS_WAIT4 = 7 // { int wait4(int pid, int *status, int options, \ + SYS_LINK = 9 // { int link(char *path, char *link); } + SYS_UNLINK = 10 // { int unlink(char *path); } + SYS_CHDIR = 12 // { int chdir(char *path); } + SYS_FCHDIR = 13 // { int fchdir(int fd); } + SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } + SYS_CHMOD = 15 // { int chmod(char *path, int mode); } + SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } + SYS_OBREAK = 17 // { int obreak(char *nsize); } break obreak_args int + SYS_GETFSSTAT = 18 // { int getfsstat(struct statfs *buf, long bufsize, \ + SYS_GETPID = 20 // { pid_t getpid(void); } + SYS_MOUNT = 21 // { int mount(char *type, char *path, int flags, \ + SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } + SYS_SETUID = 23 // { int setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t getuid(void); } + SYS_GETEUID = 25 // { uid_t geteuid(void); } + SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, caddr_t addr, \ + SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, int flags); } + SYS_SENDMSG = 28 // { int sendmsg(int s, caddr_t msg, int flags); } + SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, size_t len, \ + SYS_ACCEPT = 30 // { int accept(int s, caddr_t name, int *anamelen); } + SYS_GETPEERNAME = 31 // { int getpeername(int fdes, caddr_t asa, int *alen); } + SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, caddr_t asa, int *alen); } + SYS_ACCESS = 33 // { int access(char *path, int flags); } + SYS_CHFLAGS = 34 // { int chflags(char *path, int flags); } + SYS_FCHFLAGS = 35 // { int fchflags(int fd, int flags); } + SYS_SYNC = 36 // { int sync(void); } + SYS_KILL = 37 // { int kill(int pid, int signum); } + SYS_GETPPID = 39 // { pid_t getppid(void); } + SYS_DUP = 41 // { int dup(int fd); } + SYS_PIPE = 42 // { int pipe(void); } + SYS_GETEGID = 43 // { gid_t getegid(void); } + SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, \ + SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, int facs, \ + SYS_GETGID = 47 // { gid_t getgid(void); } + SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int namelen); } + SYS_SETLOGIN = 50 // { int setlogin(char *namebuf); } + SYS_ACCT = 51 // { int acct(char *path); } + SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, stack_t *oss); } + SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, caddr_t data); } + SYS_REBOOT = 55 // { int reboot(int opt); } + SYS_REVOKE = 56 // { int revoke(char *path); } + SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } + SYS_READLINK = 58 // { int readlink(char *path, char *buf, int count); } + SYS_EXECVE = 59 // { int execve(char *fname, char **argv, char **envv); } + SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args int + SYS_CHROOT = 61 // { int chroot(char *path); } + SYS_MSYNC = 65 // { int msync(void *addr, size_t len, int flags); } + SYS_VFORK = 66 // { pid_t vfork(void); } + SYS_SBRK = 69 // { int sbrk(int incr); } + SYS_SSTK = 70 // { int sstk(int incr); } + SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int mprotect(void *addr, size_t len, int prot); } + SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, int behav); } + SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, \ + SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, gid_t *gidset); } + SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, gid_t *gidset); } + SYS_GETPGRP = 81 // { int getpgrp(void); } + SYS_SETPGID = 82 // { int setpgid(int pid, int pgid); } + SYS_SETITIMER = 83 // { int setitimer(u_int which, struct itimerval *itv, \ + SYS_SWAPON = 85 // { int swapon(char *name); } + SYS_GETITIMER = 86 // { int getitimer(u_int which, struct itimerval *itv); } + SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); } + SYS_DUP2 = 90 // { int dup2(int from, int to); } + SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); } + SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, \ + SYS_FSYNC = 95 // { int fsync(int fd); } + SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, int prio); } + SYS_SOCKET = 97 // { int socket(int domain, int type, int protocol); } + SYS_CONNECT = 98 // { int connect(int s, caddr_t name, int namelen); } + SYS_GETPRIORITY = 100 // { int getpriority(int which, int who); } + SYS_BIND = 104 // { int bind(int s, caddr_t name, int namelen); } + SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, \ + SYS_LISTEN = 106 // { int listen(int s, int backlog); } + SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, \ + SYS_GETRUSAGE = 117 // { int getrusage(int who, struct rusage *rusage); } + SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, \ + SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, u_int iovcnt); } + SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, \ + SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, \ + SYS_FCHOWN = 123 // { int fchown(int fd, int uid, int gid); } + SYS_FCHMOD = 124 // { int fchmod(int fd, int mode); } + SYS_SETREUID = 126 // { int setreuid(int ruid, int euid); } + SYS_SETREGID = 127 // { int setregid(int rgid, int egid); } + SYS_RENAME = 128 // { int rename(char *from, char *to); } + SYS_FLOCK = 131 // { int flock(int fd, int how); } + SYS_MKFIFO = 132 // { int mkfifo(char *path, int mode); } + SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, \ + SYS_SHUTDOWN = 134 // { int shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, int protocol, \ + SYS_MKDIR = 136 // { int mkdir(char *path, int mode); } + SYS_RMDIR = 137 // { int rmdir(char *path); } + SYS_UTIMES = 138 // { int utimes(char *path, struct timeval *tptr); } + SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, \ + SYS_SETSID = 147 // { int setsid(void); } + SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, \ + SYS_STATFS = 157 // { int statfs(char *path, struct statfs *buf); } + SYS_FSTATFS = 158 // { int fstatfs(int fd, struct statfs *buf); } + SYS_GETFH = 161 // { int getfh(char *fname, struct fhandle *fhp); } + SYS_GETDOMAINNAME = 162 // { int getdomainname(char *domainname, int len); } + SYS_SETDOMAINNAME = 163 // { int setdomainname(char *domainname, int len); } + SYS_UNAME = 164 // { int uname(struct utsname *name); } + SYS_SYSARCH = 165 // { int sysarch(int op, char *parms); } + SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, \ + SYS_EXTPREAD = 173 // { ssize_t extpread(int fd, void *buf, \ + SYS_EXTPWRITE = 174 // { ssize_t extpwrite(int fd, const void *buf, \ + SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } + SYS_SETGID = 181 // { int setgid(gid_t gid); } + SYS_SETEGID = 182 // { int setegid(gid_t egid); } + SYS_SETEUID = 183 // { int seteuid(uid_t euid); } + SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } + SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } + SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, \ + SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, \ + SYS_MMAP = 197 // { caddr_t mmap(caddr_t addr, size_t len, int prot, \ + // SYS_NOSYS = 198; // { int nosys(void); } __syscall __syscall_args int + SYS_LSEEK = 199 // { off_t lseek(int fd, int pad, off_t offset, \ + SYS_TRUNCATE = 200 // { int truncate(char *path, int pad, off_t length); } + SYS_FTRUNCATE = 201 // { int ftruncate(int fd, int pad, off_t length); } + SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, void *old, \ + SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } + SYS_UNDELETE = 205 // { int undelete(char *path); } + SYS_FUTIMES = 206 // { int futimes(int fd, struct timeval *tptr); } + SYS_GETPGID = 207 // { int getpgid(pid_t pid); } + SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, \ + SYS___SEMCTL = 220 // { int __semctl(int semid, int semnum, int cmd, \ + SYS_SEMGET = 221 // { int semget(key_t key, int nsems, int semflg); } + SYS_SEMOP = 222 // { int semop(int semid, struct sembuf *sops, \ + SYS_MSGCTL = 224 // { int msgctl(int msqid, int cmd, \ + SYS_MSGGET = 225 // { int msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int msgsnd(int msqid, const void *msgp, size_t msgsz, \ + SYS_MSGRCV = 227 // { int msgrcv(int msqid, void *msgp, size_t msgsz, \ + SYS_SHMAT = 228 // { caddr_t shmat(int shmid, const void *shmaddr, \ + SYS_SHMCTL = 229 // { int shmctl(int shmid, int cmd, \ + SYS_SHMDT = 230 // { int shmdt(const void *shmaddr); } + SYS_SHMGET = 231 // { int shmget(key_t key, size_t size, int shmflg); } + SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, \ + SYS_CLOCK_SETTIME = 233 // { int clock_settime(clockid_t clock_id, \ + SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, \ + SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, \ + SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, int inherit); } + SYS_RFORK = 251 // { int rfork(int flags); } + SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, u_int nfds, \ + SYS_ISSETUGID = 253 // { int issetugid(void); } + SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } + SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } + SYS_LUTIMES = 276 // { int lutimes(char *path, struct timeval *tptr); } + SYS_EXTPREADV = 289 // { ssize_t extpreadv(int fd, struct iovec *iovp, \ + SYS_EXTPWRITEV = 290 // { ssize_t extpwritev(int fd, struct iovec *iovp,\ + SYS_FHSTATFS = 297 // { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); } + SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, int flags); } + SYS_MODNEXT = 300 // { int modnext(int modid); } + SYS_MODSTAT = 301 // { int modstat(int modid, struct module_stat* stat); } + SYS_MODFNEXT = 302 // { int modfnext(int modid); } + SYS_MODFIND = 303 // { int modfind(const char *name); } + SYS_KLDLOAD = 304 // { int kldload(const char *file); } + SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } + SYS_KLDFIND = 306 // { int kldfind(const char *file); } + SYS_KLDNEXT = 307 // { int kldnext(int fileid); } + SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct kld_file_stat* stat); } + SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } + SYS_GETSID = 310 // { int getsid(pid_t pid); } + SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, uid_t suid); } + SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, gid_t sgid); } + SYS_AIO_RETURN = 314 // { int aio_return(struct aiocb *aiocbp); } + SYS_AIO_SUSPEND = 315 // { int aio_suspend(struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); } + SYS_AIO_CANCEL = 316 // { int aio_cancel(int fd, struct aiocb *aiocbp); } + SYS_AIO_ERROR = 317 // { int aio_error(struct aiocb *aiocbp); } + SYS_AIO_READ = 318 // { int aio_read(struct aiocb *aiocbp); } + SYS_AIO_WRITE = 319 // { int aio_write(struct aiocb *aiocbp); } + SYS_LIO_LISTIO = 320 // { int lio_listio(int mode, struct aiocb * const *acb_list, int nent, struct sigevent *sig); } + SYS_YIELD = 321 // { int yield(void); } + SYS_MLOCKALL = 324 // { int mlockall(int how); } + SYS_MUNLOCKALL = 325 // { int munlockall(void); } + SYS___GETCWD = 326 // { int __getcwd(u_char *buf, u_int buflen); } + SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, const struct sched_param *param); } + SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct sched_param *param); } + SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int policy, const struct sched_param *param); } + SYS_SCHED_GETSCHEDULER = 330 // { int sched_getscheduler (pid_t pid); } + SYS_SCHED_YIELD = 331 // { int sched_yield (void); } + SYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); } + SYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); } + SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, struct timespec *interval); } + SYS_UTRACE = 335 // { int utrace(const void *addr, size_t len); } + SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, void *data); } + SYS_JAIL = 338 // { int jail(struct jail *jail); } + SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, const sigset_t *set, \ + SYS_SIGSUSPEND = 341 // { int sigsuspend(const sigset_t *sigmask); } + SYS_SIGACTION = 342 // { int sigaction(int sig, const struct sigaction *act, \ + SYS_SIGPENDING = 343 // { int sigpending(sigset_t *set); } + SYS_SIGRETURN = 344 // { int sigreturn(ucontext_t *sigcntxp); } + SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set,\ + SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set,\ + SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, \ + SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, \ + SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, acl_type_t type, \ + SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, acl_type_t type, \ + SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, \ + SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, acl_type_t type); } + SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, \ + SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, acl_type_t type, \ + SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, \ + SYS_EXTATTR_SET_FILE = 356 // { int extattr_set_file(const char *path, \ + SYS_EXTATTR_GET_FILE = 357 // { int extattr_get_file(const char *path, \ + SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, \ + SYS_AIO_WAITCOMPLETE = 359 // { int aio_waitcomplete(struct aiocb **aiocbp, struct timespec *timeout); } + SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); } + SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); } + SYS_KQUEUE = 362 // { int kqueue(void); } + SYS_KEVENT = 363 // { int kevent(int fd, \ + SYS_KENV = 390 // { int kenv(int what, const char *name, char *value, int len); } + SYS_LCHFLAGS = 391 // { int lchflags(char *path, int flags); } + SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, int count); } + SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, size_t nbytes, \ + SYS_VARSYM_SET = 450 // { int varsym_set(int level, const char *name, const char *data); } + SYS_VARSYM_GET = 451 // { int varsym_get(int mask, const char *wild, char *buf, int bufsize); } + SYS_VARSYM_LIST = 452 // { int varsym_list(int level, char *buf, int maxsize, int *marker); } + SYS_EXEC_SYS_REGISTER = 465 // { int exec_sys_register(void *entry); } + SYS_EXEC_SYS_UNREGISTER = 466 // { int exec_sys_unregister(int id); } + SYS_SYS_CHECKPOINT = 467 // { int sys_checkpoint(int type, int fd, pid_t pid, int retval); } + SYS_MOUNTCTL = 468 // { int mountctl(const char *path, int op, int fd, const void *ctl, int ctllen, void *buf, int buflen); } + SYS_UMTX_SLEEP = 469 // { int umtx_sleep(volatile const int *ptr, int value, int timeout); } + SYS_UMTX_WAKEUP = 470 // { int umtx_wakeup(volatile const int *ptr, int count); } + SYS_JAIL_ATTACH = 471 // { int jail_attach(int jid); } + SYS_SET_TLS_AREA = 472 // { int set_tls_area(int which, struct tls_info *info, size_t infosize); } + SYS_GET_TLS_AREA = 473 // { int get_tls_area(int which, struct tls_info *info, size_t infosize); } + SYS_CLOSEFROM = 474 // { int closefrom(int fd); } + SYS_STAT = 475 // { int stat(const char *path, struct stat *ub); } + SYS_FSTAT = 476 // { int fstat(int fd, struct stat *sb); } + SYS_LSTAT = 477 // { int lstat(const char *path, struct stat *ub); } + SYS_FHSTAT = 478 // { int fhstat(const struct fhandle *u_fhp, struct stat *sb); } + SYS_GETDIRENTRIES = 479 // { int getdirentries(int fd, char *buf, u_int count, \ + SYS_GETDENTS = 480 // { int getdents(int fd, char *buf, size_t count); } + SYS_USCHED_SET = 481 // { int usched_set(pid_t pid, int cmd, void *data, \ + SYS_EXTACCEPT = 482 // { int extaccept(int s, int flags, caddr_t name, int *anamelen); } + SYS_EXTCONNECT = 483 // { int extconnect(int s, int flags, caddr_t name, int namelen); } + SYS_MCONTROL = 485 // { int mcontrol(void *addr, size_t len, int behav, off_t value); } + SYS_VMSPACE_CREATE = 486 // { int vmspace_create(void *id, int type, void *data); } + SYS_VMSPACE_DESTROY = 487 // { int vmspace_destroy(void *id); } + SYS_VMSPACE_CTL = 488 // { int vmspace_ctl(void *id, int cmd, \ + SYS_VMSPACE_MMAP = 489 // { int vmspace_mmap(void *id, void *addr, size_t len, \ + SYS_VMSPACE_MUNMAP = 490 // { int vmspace_munmap(void *id, void *addr, \ + SYS_VMSPACE_MCONTROL = 491 // { int vmspace_mcontrol(void *id, void *addr, \ + SYS_VMSPACE_PREAD = 492 // { ssize_t vmspace_pread(void *id, void *buf, \ + SYS_VMSPACE_PWRITE = 493 // { ssize_t vmspace_pwrite(void *id, const void *buf, \ + SYS_EXTEXIT = 494 // { void extexit(int how, int status, void *addr); } + SYS_LWP_CREATE = 495 // { int lwp_create(struct lwp_params *params); } + SYS_LWP_GETTID = 496 // { lwpid_t lwp_gettid(void); } + SYS_LWP_KILL = 497 // { int lwp_kill(pid_t pid, lwpid_t tid, int signum); } + SYS_LWP_RTPRIO = 498 // { int lwp_rtprio(int function, pid_t pid, lwpid_t tid, struct rtprio *rtp); } + SYS_PSELECT = 499 // { int pselect(int nd, fd_set *in, fd_set *ou, \ + SYS_STATVFS = 500 // { int statvfs(const char *path, struct statvfs *buf); } + SYS_FSTATVFS = 501 // { int fstatvfs(int fd, struct statvfs *buf); } + SYS_FHSTATVFS = 502 // { int fhstatvfs(const struct fhandle *u_fhp, struct statvfs *buf); } + SYS_GETVFSSTAT = 503 // { int getvfsstat(struct statfs *buf, \ + SYS_OPENAT = 504 // { int openat(int fd, char *path, int flags, int mode); } + SYS_FSTATAT = 505 // { int fstatat(int fd, char *path, \ + SYS_FCHMODAT = 506 // { int fchmodat(int fd, char *path, int mode, \ + SYS_FCHOWNAT = 507 // { int fchownat(int fd, char *path, int uid, int gid, \ + SYS_UNLINKAT = 508 // { int unlinkat(int fd, char *path, int flags); } + SYS_FACCESSAT = 509 // { int faccessat(int fd, char *path, int amode, \ + SYS_MQ_OPEN = 510 // { mqd_t mq_open(const char * name, int oflag, \ + SYS_MQ_CLOSE = 511 // { int mq_close(mqd_t mqdes); } + SYS_MQ_UNLINK = 512 // { int mq_unlink(const char *name); } + SYS_MQ_GETATTR = 513 // { int mq_getattr(mqd_t mqdes, \ + SYS_MQ_SETATTR = 514 // { int mq_setattr(mqd_t mqdes, \ + SYS_MQ_NOTIFY = 515 // { int mq_notify(mqd_t mqdes, \ + SYS_MQ_SEND = 516 // { int mq_send(mqd_t mqdes, const char *msg_ptr, \ + SYS_MQ_RECEIVE = 517 // { ssize_t mq_receive(mqd_t mqdes, char *msg_ptr, \ + SYS_MQ_TIMEDSEND = 518 // { int mq_timedsend(mqd_t mqdes, \ + SYS_MQ_TIMEDRECEIVE = 519 // { ssize_t mq_timedreceive(mqd_t mqdes, \ + SYS_IOPRIO_SET = 520 // { int ioprio_set(int which, int who, int prio); } + SYS_IOPRIO_GET = 521 // { int ioprio_get(int which, int who); } + SYS_CHROOT_KERNEL = 522 // { int chroot_kernel(char *path); } + SYS_RENAMEAT = 523 // { int renameat(int oldfd, char *old, int newfd, \ + SYS_MKDIRAT = 524 // { int mkdirat(int fd, char *path, mode_t mode); } + SYS_MKFIFOAT = 525 // { int mkfifoat(int fd, char *path, mode_t mode); } + SYS_MKNODAT = 526 // { int mknodat(int fd, char *path, mode_t mode, \ + SYS_READLINKAT = 527 // { int readlinkat(int fd, char *path, char *buf, \ + SYS_SYMLINKAT = 528 // { int symlinkat(char *path1, int fd, char *path2); } + SYS_SWAPOFF = 529 // { int swapoff(char *name); } + SYS_VQUOTACTL = 530 // { int vquotactl(const char *path, \ + SYS_LINKAT = 531 // { int linkat(int fd1, char *path1, int fd2, \ + SYS_EACCESS = 532 // { int eaccess(char *path, int flags); } + SYS_LPATHCONF = 533 // { int lpathconf(char *path, int name); } + SYS_VMM_GUEST_CTL = 534 // { int vmm_guest_ctl(int op, struct vmm_guest_options *options); } + SYS_VMM_GUEST_SYNC_ADDR = 535 // { int vmm_guest_sync_addr(long *dstaddr, long *srcaddr); } + SYS_PROCCTL = 536 // { int procctl(idtype_t idtype, id_t id, int cmd, void *data); } + SYS_CHFLAGSAT = 537 // { int chflagsat(int fd, const char *path, int flags, int atflags);} + SYS_PIPE2 = 538 // { int pipe2(int *fildes, int flags); } + SYS_UTIMENSAT = 539 // { int utimensat(int fd, const char *path, const struct timespec *ts, int flags); } + SYS_FUTIMENS = 540 // { int futimens(int fd, const struct timespec *ts); } + SYS_ACCEPT4 = 541 // { int accept4(int s, caddr_t name, int *anamelen, int flags); } + SYS_LWP_SETNAME = 542 // { int lwp_setname(lwpid_t tid, const char *name); } + SYS_PPOLL = 543 // { int ppoll(struct pollfd *fds, u_int nfds, \ + SYS_LWP_SETAFFINITY = 544 // { int lwp_setaffinity(pid_t pid, lwpid_t tid, const cpumask_t *mask); } + SYS_LWP_GETAFFINITY = 545 // { int lwp_getaffinity(pid_t pid, lwpid_t tid, cpumask_t *mask); } + SYS_LWP_CREATE2 = 546 // { int lwp_create2(struct lwp_params *params, const cpumask_t *mask); } +) diff --git a/api/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go b/api/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go new file mode 100644 index 0000000..b64a812 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go @@ -0,0 +1,353 @@ +// mksysnum_freebsd.pl +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,freebsd + +package unix + +const ( + // SYS_NOSYS = 0; // { int nosys(void); } syscall nosys_args int + SYS_EXIT = 1 // { void sys_exit(int rval); } exit \ + SYS_FORK = 2 // { int fork(void); } + SYS_READ = 3 // { ssize_t read(int fd, void *buf, \ + SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, \ + SYS_OPEN = 5 // { int open(char *path, int flags, int mode); } + SYS_CLOSE = 6 // { int close(int fd); } + SYS_WAIT4 = 7 // { int wait4(int pid, int *status, \ + SYS_LINK = 9 // { int link(char *path, char *link); } + SYS_UNLINK = 10 // { int unlink(char *path); } + SYS_CHDIR = 12 // { int chdir(char *path); } + SYS_FCHDIR = 13 // { int fchdir(int fd); } + SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } + SYS_CHMOD = 15 // { int chmod(char *path, int mode); } + SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } + SYS_OBREAK = 17 // { int obreak(char *nsize); } break \ + SYS_GETPID = 20 // { pid_t getpid(void); } + SYS_MOUNT = 21 // { int mount(char *type, char *path, \ + SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } + SYS_SETUID = 23 // { int setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t getuid(void); } + SYS_GETEUID = 25 // { uid_t geteuid(void); } + SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, \ + SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, \ + SYS_SENDMSG = 28 // { int sendmsg(int s, struct msghdr *msg, \ + SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, \ + SYS_ACCEPT = 30 // { int accept(int s, \ + SYS_GETPEERNAME = 31 // { int getpeername(int fdes, \ + SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, \ + SYS_ACCESS = 33 // { int access(char *path, int amode); } + SYS_CHFLAGS = 34 // { int chflags(const char *path, u_long flags); } + SYS_FCHFLAGS = 35 // { int fchflags(int fd, u_long flags); } + SYS_SYNC = 36 // { int sync(void); } + SYS_KILL = 37 // { int kill(int pid, int signum); } + SYS_GETPPID = 39 // { pid_t getppid(void); } + SYS_DUP = 41 // { int dup(u_int fd); } + SYS_PIPE = 42 // { int pipe(void); } + SYS_GETEGID = 43 // { gid_t getegid(void); } + SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, \ + SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, \ + SYS_GETGID = 47 // { gid_t getgid(void); } + SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int \ + SYS_SETLOGIN = 50 // { int setlogin(char *namebuf); } + SYS_ACCT = 51 // { int acct(char *path); } + SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, \ + SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, \ + SYS_REBOOT = 55 // { int reboot(int opt); } + SYS_REVOKE = 56 // { int revoke(char *path); } + SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } + SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, \ + SYS_EXECVE = 59 // { int execve(char *fname, char **argv, \ + SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args \ + SYS_CHROOT = 61 // { int chroot(char *path); } + SYS_MSYNC = 65 // { int msync(void *addr, size_t len, \ + SYS_VFORK = 66 // { int vfork(void); } + SYS_SBRK = 69 // { int sbrk(int incr); } + SYS_SSTK = 70 // { int sstk(int incr); } + SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise \ + SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, \ + SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, \ + SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, \ + SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, \ + SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, \ + SYS_GETPGRP = 81 // { int getpgrp(void); } + SYS_SETPGID = 82 // { int setpgid(int pid, int pgid); } + SYS_SETITIMER = 83 // { int setitimer(u_int which, struct \ + SYS_SWAPON = 85 // { int swapon(char *name); } + SYS_GETITIMER = 86 // { int getitimer(u_int which, \ + SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); } + SYS_DUP2 = 90 // { int dup2(u_int from, u_int to); } + SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); } + SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, \ + SYS_FSYNC = 95 // { int fsync(int fd); } + SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, \ + SYS_SOCKET = 97 // { int socket(int domain, int type, \ + SYS_CONNECT = 98 // { int connect(int s, caddr_t name, \ + SYS_GETPRIORITY = 100 // { int getpriority(int which, int who); } + SYS_BIND = 104 // { int bind(int s, caddr_t name, \ + SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, \ + SYS_LISTEN = 106 // { int listen(int s, int backlog); } + SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, \ + SYS_GETRUSAGE = 117 // { int getrusage(int who, \ + SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, \ + SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, \ + SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, \ + SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, \ + SYS_FCHOWN = 123 // { int fchown(int fd, int uid, int gid); } + SYS_FCHMOD = 124 // { int fchmod(int fd, int mode); } + SYS_SETREUID = 126 // { int setreuid(int ruid, int euid); } + SYS_SETREGID = 127 // { int setregid(int rgid, int egid); } + SYS_RENAME = 128 // { int rename(char *from, char *to); } + SYS_FLOCK = 131 // { int flock(int fd, int how); } + SYS_MKFIFO = 132 // { int mkfifo(char *path, int mode); } + SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, \ + SYS_SHUTDOWN = 134 // { int shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, \ + SYS_MKDIR = 136 // { int mkdir(char *path, int mode); } + SYS_RMDIR = 137 // { int rmdir(char *path); } + SYS_UTIMES = 138 // { int utimes(char *path, \ + SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, \ + SYS_SETSID = 147 // { int setsid(void); } + SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, \ + SYS_LGETFH = 160 // { int lgetfh(char *fname, \ + SYS_GETFH = 161 // { int getfh(char *fname, \ + SYS_SYSARCH = 165 // { int sysarch(int op, char *parms); } + SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, \ + SYS_FREEBSD6_PREAD = 173 // { ssize_t freebsd6_pread(int fd, void *buf, \ + SYS_FREEBSD6_PWRITE = 174 // { ssize_t freebsd6_pwrite(int fd, \ + SYS_SETFIB = 175 // { int setfib(int fibnum); } + SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } + SYS_SETGID = 181 // { int setgid(gid_t gid); } + SYS_SETEGID = 182 // { int setegid(gid_t egid); } + SYS_SETEUID = 183 // { int seteuid(uid_t euid); } + SYS_STAT = 188 // { int stat(char *path, struct stat *ub); } + SYS_FSTAT = 189 // { int fstat(int fd, struct stat *sb); } + SYS_LSTAT = 190 // { int lstat(char *path, struct stat *ub); } + SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } + SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } + SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, \ + SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, \ + SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, \ + SYS_FREEBSD6_MMAP = 197 // { caddr_t freebsd6_mmap(caddr_t addr, \ + SYS_FREEBSD6_LSEEK = 199 // { off_t freebsd6_lseek(int fd, int pad, \ + SYS_FREEBSD6_TRUNCATE = 200 // { int freebsd6_truncate(char *path, int pad, \ + SYS_FREEBSD6_FTRUNCATE = 201 // { int freebsd6_ftruncate(int fd, int pad, \ + SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, \ + SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } + SYS_UNDELETE = 205 // { int undelete(char *path); } + SYS_FUTIMES = 206 // { int futimes(int fd, struct timeval *tptr); } + SYS_GETPGID = 207 // { int getpgid(pid_t pid); } + SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, \ + SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, \ + SYS_CLOCK_SETTIME = 233 // { int clock_settime( \ + SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, \ + SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, \ + SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); } + SYS_KTIMER_SETTIME = 237 // { int ktimer_settime(int timerid, int flags, \ + SYS_KTIMER_GETTIME = 238 // { int ktimer_gettime(int timerid, struct \ + SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); } + SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, \ + SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } + SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( \ + SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( \ + SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,\ + SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } + SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, \ + SYS_RFORK = 251 // { int rfork(int flags); } + SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, \ + SYS_ISSETUGID = 253 // { int issetugid(void); } + SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } + SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, \ + SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } + SYS_LUTIMES = 276 // { int lutimes(char *path, \ + SYS_NSTAT = 278 // { int nstat(char *path, struct nstat *ub); } + SYS_NFSTAT = 279 // { int nfstat(int fd, struct nstat *sb); } + SYS_NLSTAT = 280 // { int nlstat(char *path, struct nstat *ub); } + SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, \ + SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, \ + SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, \ + SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, \ + SYS_MODNEXT = 300 // { int modnext(int modid); } + SYS_MODSTAT = 301 // { int modstat(int modid, \ + SYS_MODFNEXT = 302 // { int modfnext(int modid); } + SYS_MODFIND = 303 // { int modfind(const char *name); } + SYS_KLDLOAD = 304 // { int kldload(const char *file); } + SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } + SYS_KLDFIND = 306 // { int kldfind(const char *file); } + SYS_KLDNEXT = 307 // { int kldnext(int fileid); } + SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct \ + SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } + SYS_GETSID = 310 // { int getsid(pid_t pid); } + SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, \ + SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, \ + SYS_YIELD = 321 // { int yield(void); } + SYS_MLOCKALL = 324 // { int mlockall(int how); } + SYS_MUNLOCKALL = 325 // { int munlockall(void); } + SYS___GETCWD = 326 // { int __getcwd(char *buf, u_int buflen); } + SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, \ + SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct \ + SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int \ + SYS_SCHED_GETSCHEDULER = 330 // { int sched_getscheduler (pid_t pid); } + SYS_SCHED_YIELD = 331 // { int sched_yield (void); } + SYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); } + SYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); } + SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, \ + SYS_UTRACE = 335 // { int utrace(const void *addr, size_t len); } + SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, \ + SYS_JAIL = 338 // { int jail(struct jail *jail); } + SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, \ + SYS_SIGSUSPEND = 341 // { int sigsuspend(const sigset_t *sigmask); } + SYS_SIGPENDING = 343 // { int sigpending(sigset_t *set); } + SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set, \ + SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set, \ + SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, \ + SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, \ + SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, \ + SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, \ + SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, \ + SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, \ + SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, \ + SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, \ + SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, \ + SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( \ + SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( \ + SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, \ + SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, \ + SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, \ + SYS_KQUEUE = 362 // { int kqueue(void); } + SYS_KEVENT = 363 // { int kevent(int fd, \ + SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, \ + SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, \ + SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, \ + SYS___SETUGID = 374 // { int __setugid(int flag); } + SYS_EACCESS = 376 // { int eaccess(char *path, int amode); } + SYS_NMOUNT = 378 // { int nmount(struct iovec *iovp, \ + SYS___MAC_GET_PROC = 384 // { int __mac_get_proc(struct mac *mac_p); } + SYS___MAC_SET_PROC = 385 // { int __mac_set_proc(struct mac *mac_p); } + SYS___MAC_GET_FD = 386 // { int __mac_get_fd(int fd, \ + SYS___MAC_GET_FILE = 387 // { int __mac_get_file(const char *path_p, \ + SYS___MAC_SET_FD = 388 // { int __mac_set_fd(int fd, \ + SYS___MAC_SET_FILE = 389 // { int __mac_set_file(const char *path_p, \ + SYS_KENV = 390 // { int kenv(int what, const char *name, \ + SYS_LCHFLAGS = 391 // { int lchflags(const char *path, \ + SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, \ + SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, \ + SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, \ + SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, \ + SYS_STATFS = 396 // { int statfs(char *path, \ + SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } + SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, \ + SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, \ + SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, \ + SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, \ + SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( \ + SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( \ + SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( \ + SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, \ + SYS_SIGACTION = 416 // { int sigaction(int sig, \ + SYS_SIGRETURN = 417 // { int sigreturn( \ + SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); } + SYS_SETCONTEXT = 422 // { int setcontext( \ + SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, \ + SYS_SWAPOFF = 424 // { int swapoff(const char *name); } + SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, \ + SYS___ACL_SET_LINK = 426 // { int __acl_set_link(const char *path, \ + SYS___ACL_DELETE_LINK = 427 // { int __acl_delete_link(const char *path, \ + SYS___ACL_ACLCHECK_LINK = 428 // { int __acl_aclcheck_link(const char *path, \ + SYS_SIGWAIT = 429 // { int sigwait(const sigset_t *set, \ + SYS_THR_CREATE = 430 // { int thr_create(ucontext_t *ctx, long *id, \ + SYS_THR_EXIT = 431 // { void thr_exit(long *state); } + SYS_THR_SELF = 432 // { int thr_self(long *id); } + SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } + SYS__UMTX_LOCK = 434 // { int _umtx_lock(struct umtx *umtx); } + SYS__UMTX_UNLOCK = 435 // { int _umtx_unlock(struct umtx *umtx); } + SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } + SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, \ + SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( \ + SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( \ + SYS_THR_SUSPEND = 442 // { int thr_suspend( \ + SYS_THR_WAKE = 443 // { int thr_wake(long id); } + SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); } + SYS_AUDIT = 445 // { int audit(const void *record, \ + SYS_AUDITON = 446 // { int auditon(int cmd, void *data, \ + SYS_GETAUID = 447 // { int getauid(uid_t *auid); } + SYS_SETAUID = 448 // { int setauid(uid_t *auid); } + SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); } + SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); } + SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( \ + SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( \ + SYS_AUDITCTL = 453 // { int auditctl(char *path); } + SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, \ + SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, \ + SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); } + SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); } + SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); } + SYS_RTPRIO_THREAD = 466 // { int rtprio_thread(int function, \ + SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, \ + SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, \ + SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, \ + SYS_LSEEK = 478 // { off_t lseek(int fd, off_t offset, \ + SYS_TRUNCATE = 479 // { int truncate(char *path, off_t length); } + SYS_FTRUNCATE = 480 // { int ftruncate(int fd, off_t length); } + SYS_THR_KILL2 = 481 // { int thr_kill2(pid_t pid, long id, int sig); } + SYS_SHM_OPEN = 482 // { int shm_open(const char *path, int flags, \ + SYS_SHM_UNLINK = 483 // { int shm_unlink(const char *path); } + SYS_CPUSET = 484 // { int cpuset(cpusetid_t *setid); } + SYS_CPUSET_SETID = 485 // { int cpuset_setid(cpuwhich_t which, id_t id, \ + SYS_CPUSET_GETID = 486 // { int cpuset_getid(cpulevel_t level, \ + SYS_CPUSET_GETAFFINITY = 487 // { int cpuset_getaffinity(cpulevel_t level, \ + SYS_CPUSET_SETAFFINITY = 488 // { int cpuset_setaffinity(cpulevel_t level, \ + SYS_FACCESSAT = 489 // { int faccessat(int fd, char *path, int amode, \ + SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, \ + SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, \ + SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, \ + SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, \ + SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, \ + SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, \ + SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); } + SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); } + SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, \ + SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, \ + SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, \ + SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, \ + SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, \ + SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); } + SYS_POSIX_OPENPT = 504 // { int posix_openpt(int flags); } + SYS_JAIL_GET = 506 // { int jail_get(struct iovec *iovp, \ + SYS_JAIL_SET = 507 // { int jail_set(struct iovec *iovp, \ + SYS_JAIL_REMOVE = 508 // { int jail_remove(int jid); } + SYS_CLOSEFROM = 509 // { int closefrom(int lowfd); } + SYS_LPATHCONF = 513 // { int lpathconf(char *path, int name); } + SYS___CAP_RIGHTS_GET = 515 // { int __cap_rights_get(int version, \ + SYS_CAP_ENTER = 516 // { int cap_enter(void); } + SYS_CAP_GETMODE = 517 // { int cap_getmode(u_int *modep); } + SYS_PDFORK = 518 // { int pdfork(int *fdp, int flags); } + SYS_PDKILL = 519 // { int pdkill(int fd, int signum); } + SYS_PDGETPID = 520 // { int pdgetpid(int fd, pid_t *pidp); } + SYS_PSELECT = 522 // { int pselect(int nd, fd_set *in, \ + SYS_GETLOGINCLASS = 523 // { int getloginclass(char *namebuf, \ + SYS_SETLOGINCLASS = 524 // { int setloginclass(const char *namebuf); } + SYS_RCTL_GET_RACCT = 525 // { int rctl_get_racct(const void *inbufp, \ + SYS_RCTL_GET_RULES = 526 // { int rctl_get_rules(const void *inbufp, \ + SYS_RCTL_GET_LIMITS = 527 // { int rctl_get_limits(const void *inbufp, \ + SYS_RCTL_ADD_RULE = 528 // { int rctl_add_rule(const void *inbufp, \ + SYS_RCTL_REMOVE_RULE = 529 // { int rctl_remove_rule(const void *inbufp, \ + SYS_POSIX_FALLOCATE = 530 // { int posix_fallocate(int fd, \ + SYS_POSIX_FADVISE = 531 // { int posix_fadvise(int fd, off_t offset, \ + SYS_WAIT6 = 532 // { int wait6(idtype_t idtype, id_t id, \ + SYS_CAP_RIGHTS_LIMIT = 533 // { int cap_rights_limit(int fd, \ + SYS_CAP_IOCTLS_LIMIT = 534 // { int cap_ioctls_limit(int fd, \ + SYS_CAP_IOCTLS_GET = 535 // { ssize_t cap_ioctls_get(int fd, \ + SYS_CAP_FCNTLS_LIMIT = 536 // { int cap_fcntls_limit(int fd, \ + SYS_CAP_FCNTLS_GET = 537 // { int cap_fcntls_get(int fd, \ + SYS_BINDAT = 538 // { int bindat(int fd, int s, caddr_t name, \ + SYS_CONNECTAT = 539 // { int connectat(int fd, int s, caddr_t name, \ + SYS_CHFLAGSAT = 540 // { int chflagsat(int fd, const char *path, \ + SYS_ACCEPT4 = 541 // { int accept4(int s, \ + SYS_PIPE2 = 542 // { int pipe2(int *fildes, int flags); } + SYS_PROCCTL = 544 // { int procctl(idtype_t idtype, id_t id, \ + SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, \ + SYS_FUTIMENS = 546 // { int futimens(int fd, \ + SYS_UTIMENSAT = 547 // { int utimensat(int fd, \ +) diff --git a/api/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go b/api/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go new file mode 100644 index 0000000..81722ac --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go @@ -0,0 +1,353 @@ +// mksysnum_freebsd.pl +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,freebsd + +package unix + +const ( + // SYS_NOSYS = 0; // { int nosys(void); } syscall nosys_args int + SYS_EXIT = 1 // { void sys_exit(int rval); } exit \ + SYS_FORK = 2 // { int fork(void); } + SYS_READ = 3 // { ssize_t read(int fd, void *buf, \ + SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, \ + SYS_OPEN = 5 // { int open(char *path, int flags, int mode); } + SYS_CLOSE = 6 // { int close(int fd); } + SYS_WAIT4 = 7 // { int wait4(int pid, int *status, \ + SYS_LINK = 9 // { int link(char *path, char *link); } + SYS_UNLINK = 10 // { int unlink(char *path); } + SYS_CHDIR = 12 // { int chdir(char *path); } + SYS_FCHDIR = 13 // { int fchdir(int fd); } + SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } + SYS_CHMOD = 15 // { int chmod(char *path, int mode); } + SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } + SYS_OBREAK = 17 // { int obreak(char *nsize); } break \ + SYS_GETPID = 20 // { pid_t getpid(void); } + SYS_MOUNT = 21 // { int mount(char *type, char *path, \ + SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } + SYS_SETUID = 23 // { int setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t getuid(void); } + SYS_GETEUID = 25 // { uid_t geteuid(void); } + SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, \ + SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, \ + SYS_SENDMSG = 28 // { int sendmsg(int s, struct msghdr *msg, \ + SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, \ + SYS_ACCEPT = 30 // { int accept(int s, \ + SYS_GETPEERNAME = 31 // { int getpeername(int fdes, \ + SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, \ + SYS_ACCESS = 33 // { int access(char *path, int amode); } + SYS_CHFLAGS = 34 // { int chflags(const char *path, u_long flags); } + SYS_FCHFLAGS = 35 // { int fchflags(int fd, u_long flags); } + SYS_SYNC = 36 // { int sync(void); } + SYS_KILL = 37 // { int kill(int pid, int signum); } + SYS_GETPPID = 39 // { pid_t getppid(void); } + SYS_DUP = 41 // { int dup(u_int fd); } + SYS_PIPE = 42 // { int pipe(void); } + SYS_GETEGID = 43 // { gid_t getegid(void); } + SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, \ + SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, \ + SYS_GETGID = 47 // { gid_t getgid(void); } + SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int \ + SYS_SETLOGIN = 50 // { int setlogin(char *namebuf); } + SYS_ACCT = 51 // { int acct(char *path); } + SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, \ + SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, \ + SYS_REBOOT = 55 // { int reboot(int opt); } + SYS_REVOKE = 56 // { int revoke(char *path); } + SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } + SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, \ + SYS_EXECVE = 59 // { int execve(char *fname, char **argv, \ + SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args \ + SYS_CHROOT = 61 // { int chroot(char *path); } + SYS_MSYNC = 65 // { int msync(void *addr, size_t len, \ + SYS_VFORK = 66 // { int vfork(void); } + SYS_SBRK = 69 // { int sbrk(int incr); } + SYS_SSTK = 70 // { int sstk(int incr); } + SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise \ + SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, \ + SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, \ + SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, \ + SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, \ + SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, \ + SYS_GETPGRP = 81 // { int getpgrp(void); } + SYS_SETPGID = 82 // { int setpgid(int pid, int pgid); } + SYS_SETITIMER = 83 // { int setitimer(u_int which, struct \ + SYS_SWAPON = 85 // { int swapon(char *name); } + SYS_GETITIMER = 86 // { int getitimer(u_int which, \ + SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); } + SYS_DUP2 = 90 // { int dup2(u_int from, u_int to); } + SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); } + SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, \ + SYS_FSYNC = 95 // { int fsync(int fd); } + SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, \ + SYS_SOCKET = 97 // { int socket(int domain, int type, \ + SYS_CONNECT = 98 // { int connect(int s, caddr_t name, \ + SYS_GETPRIORITY = 100 // { int getpriority(int which, int who); } + SYS_BIND = 104 // { int bind(int s, caddr_t name, \ + SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, \ + SYS_LISTEN = 106 // { int listen(int s, int backlog); } + SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, \ + SYS_GETRUSAGE = 117 // { int getrusage(int who, \ + SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, \ + SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, \ + SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, \ + SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, \ + SYS_FCHOWN = 123 // { int fchown(int fd, int uid, int gid); } + SYS_FCHMOD = 124 // { int fchmod(int fd, int mode); } + SYS_SETREUID = 126 // { int setreuid(int ruid, int euid); } + SYS_SETREGID = 127 // { int setregid(int rgid, int egid); } + SYS_RENAME = 128 // { int rename(char *from, char *to); } + SYS_FLOCK = 131 // { int flock(int fd, int how); } + SYS_MKFIFO = 132 // { int mkfifo(char *path, int mode); } + SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, \ + SYS_SHUTDOWN = 134 // { int shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, \ + SYS_MKDIR = 136 // { int mkdir(char *path, int mode); } + SYS_RMDIR = 137 // { int rmdir(char *path); } + SYS_UTIMES = 138 // { int utimes(char *path, \ + SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, \ + SYS_SETSID = 147 // { int setsid(void); } + SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, \ + SYS_LGETFH = 160 // { int lgetfh(char *fname, \ + SYS_GETFH = 161 // { int getfh(char *fname, \ + SYS_SYSARCH = 165 // { int sysarch(int op, char *parms); } + SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, \ + SYS_FREEBSD6_PREAD = 173 // { ssize_t freebsd6_pread(int fd, void *buf, \ + SYS_FREEBSD6_PWRITE = 174 // { ssize_t freebsd6_pwrite(int fd, \ + SYS_SETFIB = 175 // { int setfib(int fibnum); } + SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } + SYS_SETGID = 181 // { int setgid(gid_t gid); } + SYS_SETEGID = 182 // { int setegid(gid_t egid); } + SYS_SETEUID = 183 // { int seteuid(uid_t euid); } + SYS_STAT = 188 // { int stat(char *path, struct stat *ub); } + SYS_FSTAT = 189 // { int fstat(int fd, struct stat *sb); } + SYS_LSTAT = 190 // { int lstat(char *path, struct stat *ub); } + SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } + SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } + SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, \ + SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, \ + SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, \ + SYS_FREEBSD6_MMAP = 197 // { caddr_t freebsd6_mmap(caddr_t addr, \ + SYS_FREEBSD6_LSEEK = 199 // { off_t freebsd6_lseek(int fd, int pad, \ + SYS_FREEBSD6_TRUNCATE = 200 // { int freebsd6_truncate(char *path, int pad, \ + SYS_FREEBSD6_FTRUNCATE = 201 // { int freebsd6_ftruncate(int fd, int pad, \ + SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, \ + SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } + SYS_UNDELETE = 205 // { int undelete(char *path); } + SYS_FUTIMES = 206 // { int futimes(int fd, struct timeval *tptr); } + SYS_GETPGID = 207 // { int getpgid(pid_t pid); } + SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, \ + SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, \ + SYS_CLOCK_SETTIME = 233 // { int clock_settime( \ + SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, \ + SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, \ + SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); } + SYS_KTIMER_SETTIME = 237 // { int ktimer_settime(int timerid, int flags, \ + SYS_KTIMER_GETTIME = 238 // { int ktimer_gettime(int timerid, struct \ + SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); } + SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, \ + SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } + SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( \ + SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( \ + SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,\ + SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } + SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, \ + SYS_RFORK = 251 // { int rfork(int flags); } + SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, \ + SYS_ISSETUGID = 253 // { int issetugid(void); } + SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } + SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, \ + SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } + SYS_LUTIMES = 276 // { int lutimes(char *path, \ + SYS_NSTAT = 278 // { int nstat(char *path, struct nstat *ub); } + SYS_NFSTAT = 279 // { int nfstat(int fd, struct nstat *sb); } + SYS_NLSTAT = 280 // { int nlstat(char *path, struct nstat *ub); } + SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, \ + SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, \ + SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, \ + SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, \ + SYS_MODNEXT = 300 // { int modnext(int modid); } + SYS_MODSTAT = 301 // { int modstat(int modid, \ + SYS_MODFNEXT = 302 // { int modfnext(int modid); } + SYS_MODFIND = 303 // { int modfind(const char *name); } + SYS_KLDLOAD = 304 // { int kldload(const char *file); } + SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } + SYS_KLDFIND = 306 // { int kldfind(const char *file); } + SYS_KLDNEXT = 307 // { int kldnext(int fileid); } + SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct \ + SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } + SYS_GETSID = 310 // { int getsid(pid_t pid); } + SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, \ + SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, \ + SYS_YIELD = 321 // { int yield(void); } + SYS_MLOCKALL = 324 // { int mlockall(int how); } + SYS_MUNLOCKALL = 325 // { int munlockall(void); } + SYS___GETCWD = 326 // { int __getcwd(char *buf, u_int buflen); } + SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, \ + SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct \ + SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int \ + SYS_SCHED_GETSCHEDULER = 330 // { int sched_getscheduler (pid_t pid); } + SYS_SCHED_YIELD = 331 // { int sched_yield (void); } + SYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); } + SYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); } + SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, \ + SYS_UTRACE = 335 // { int utrace(const void *addr, size_t len); } + SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, \ + SYS_JAIL = 338 // { int jail(struct jail *jail); } + SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, \ + SYS_SIGSUSPEND = 341 // { int sigsuspend(const sigset_t *sigmask); } + SYS_SIGPENDING = 343 // { int sigpending(sigset_t *set); } + SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set, \ + SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set, \ + SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, \ + SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, \ + SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, \ + SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, \ + SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, \ + SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, \ + SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, \ + SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, \ + SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, \ + SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( \ + SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( \ + SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, \ + SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, \ + SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, \ + SYS_KQUEUE = 362 // { int kqueue(void); } + SYS_KEVENT = 363 // { int kevent(int fd, \ + SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, \ + SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, \ + SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, \ + SYS___SETUGID = 374 // { int __setugid(int flag); } + SYS_EACCESS = 376 // { int eaccess(char *path, int amode); } + SYS_NMOUNT = 378 // { int nmount(struct iovec *iovp, \ + SYS___MAC_GET_PROC = 384 // { int __mac_get_proc(struct mac *mac_p); } + SYS___MAC_SET_PROC = 385 // { int __mac_set_proc(struct mac *mac_p); } + SYS___MAC_GET_FD = 386 // { int __mac_get_fd(int fd, \ + SYS___MAC_GET_FILE = 387 // { int __mac_get_file(const char *path_p, \ + SYS___MAC_SET_FD = 388 // { int __mac_set_fd(int fd, \ + SYS___MAC_SET_FILE = 389 // { int __mac_set_file(const char *path_p, \ + SYS_KENV = 390 // { int kenv(int what, const char *name, \ + SYS_LCHFLAGS = 391 // { int lchflags(const char *path, \ + SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, \ + SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, \ + SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, \ + SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, \ + SYS_STATFS = 396 // { int statfs(char *path, \ + SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } + SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, \ + SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, \ + SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, \ + SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, \ + SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( \ + SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( \ + SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( \ + SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, \ + SYS_SIGACTION = 416 // { int sigaction(int sig, \ + SYS_SIGRETURN = 417 // { int sigreturn( \ + SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); } + SYS_SETCONTEXT = 422 // { int setcontext( \ + SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, \ + SYS_SWAPOFF = 424 // { int swapoff(const char *name); } + SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, \ + SYS___ACL_SET_LINK = 426 // { int __acl_set_link(const char *path, \ + SYS___ACL_DELETE_LINK = 427 // { int __acl_delete_link(const char *path, \ + SYS___ACL_ACLCHECK_LINK = 428 // { int __acl_aclcheck_link(const char *path, \ + SYS_SIGWAIT = 429 // { int sigwait(const sigset_t *set, \ + SYS_THR_CREATE = 430 // { int thr_create(ucontext_t *ctx, long *id, \ + SYS_THR_EXIT = 431 // { void thr_exit(long *state); } + SYS_THR_SELF = 432 // { int thr_self(long *id); } + SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } + SYS__UMTX_LOCK = 434 // { int _umtx_lock(struct umtx *umtx); } + SYS__UMTX_UNLOCK = 435 // { int _umtx_unlock(struct umtx *umtx); } + SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } + SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, \ + SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( \ + SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( \ + SYS_THR_SUSPEND = 442 // { int thr_suspend( \ + SYS_THR_WAKE = 443 // { int thr_wake(long id); } + SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); } + SYS_AUDIT = 445 // { int audit(const void *record, \ + SYS_AUDITON = 446 // { int auditon(int cmd, void *data, \ + SYS_GETAUID = 447 // { int getauid(uid_t *auid); } + SYS_SETAUID = 448 // { int setauid(uid_t *auid); } + SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); } + SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); } + SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( \ + SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( \ + SYS_AUDITCTL = 453 // { int auditctl(char *path); } + SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, \ + SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, \ + SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); } + SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); } + SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); } + SYS_RTPRIO_THREAD = 466 // { int rtprio_thread(int function, \ + SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, \ + SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, \ + SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, \ + SYS_LSEEK = 478 // { off_t lseek(int fd, off_t offset, \ + SYS_TRUNCATE = 479 // { int truncate(char *path, off_t length); } + SYS_FTRUNCATE = 480 // { int ftruncate(int fd, off_t length); } + SYS_THR_KILL2 = 481 // { int thr_kill2(pid_t pid, long id, int sig); } + SYS_SHM_OPEN = 482 // { int shm_open(const char *path, int flags, \ + SYS_SHM_UNLINK = 483 // { int shm_unlink(const char *path); } + SYS_CPUSET = 484 // { int cpuset(cpusetid_t *setid); } + SYS_CPUSET_SETID = 485 // { int cpuset_setid(cpuwhich_t which, id_t id, \ + SYS_CPUSET_GETID = 486 // { int cpuset_getid(cpulevel_t level, \ + SYS_CPUSET_GETAFFINITY = 487 // { int cpuset_getaffinity(cpulevel_t level, \ + SYS_CPUSET_SETAFFINITY = 488 // { int cpuset_setaffinity(cpulevel_t level, \ + SYS_FACCESSAT = 489 // { int faccessat(int fd, char *path, int amode, \ + SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, \ + SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, \ + SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, \ + SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, \ + SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, \ + SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, \ + SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); } + SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); } + SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, \ + SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, \ + SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, \ + SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, \ + SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, \ + SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); } + SYS_POSIX_OPENPT = 504 // { int posix_openpt(int flags); } + SYS_JAIL_GET = 506 // { int jail_get(struct iovec *iovp, \ + SYS_JAIL_SET = 507 // { int jail_set(struct iovec *iovp, \ + SYS_JAIL_REMOVE = 508 // { int jail_remove(int jid); } + SYS_CLOSEFROM = 509 // { int closefrom(int lowfd); } + SYS_LPATHCONF = 513 // { int lpathconf(char *path, int name); } + SYS___CAP_RIGHTS_GET = 515 // { int __cap_rights_get(int version, \ + SYS_CAP_ENTER = 516 // { int cap_enter(void); } + SYS_CAP_GETMODE = 517 // { int cap_getmode(u_int *modep); } + SYS_PDFORK = 518 // { int pdfork(int *fdp, int flags); } + SYS_PDKILL = 519 // { int pdkill(int fd, int signum); } + SYS_PDGETPID = 520 // { int pdgetpid(int fd, pid_t *pidp); } + SYS_PSELECT = 522 // { int pselect(int nd, fd_set *in, \ + SYS_GETLOGINCLASS = 523 // { int getloginclass(char *namebuf, \ + SYS_SETLOGINCLASS = 524 // { int setloginclass(const char *namebuf); } + SYS_RCTL_GET_RACCT = 525 // { int rctl_get_racct(const void *inbufp, \ + SYS_RCTL_GET_RULES = 526 // { int rctl_get_rules(const void *inbufp, \ + SYS_RCTL_GET_LIMITS = 527 // { int rctl_get_limits(const void *inbufp, \ + SYS_RCTL_ADD_RULE = 528 // { int rctl_add_rule(const void *inbufp, \ + SYS_RCTL_REMOVE_RULE = 529 // { int rctl_remove_rule(const void *inbufp, \ + SYS_POSIX_FALLOCATE = 530 // { int posix_fallocate(int fd, \ + SYS_POSIX_FADVISE = 531 // { int posix_fadvise(int fd, off_t offset, \ + SYS_WAIT6 = 532 // { int wait6(idtype_t idtype, id_t id, \ + SYS_CAP_RIGHTS_LIMIT = 533 // { int cap_rights_limit(int fd, \ + SYS_CAP_IOCTLS_LIMIT = 534 // { int cap_ioctls_limit(int fd, \ + SYS_CAP_IOCTLS_GET = 535 // { ssize_t cap_ioctls_get(int fd, \ + SYS_CAP_FCNTLS_LIMIT = 536 // { int cap_fcntls_limit(int fd, \ + SYS_CAP_FCNTLS_GET = 537 // { int cap_fcntls_get(int fd, \ + SYS_BINDAT = 538 // { int bindat(int fd, int s, caddr_t name, \ + SYS_CONNECTAT = 539 // { int connectat(int fd, int s, caddr_t name, \ + SYS_CHFLAGSAT = 540 // { int chflagsat(int fd, const char *path, \ + SYS_ACCEPT4 = 541 // { int accept4(int s, \ + SYS_PIPE2 = 542 // { int pipe2(int *fildes, int flags); } + SYS_PROCCTL = 544 // { int procctl(idtype_t idtype, id_t id, \ + SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, \ + SYS_FUTIMENS = 546 // { int futimens(int fd, \ + SYS_UTIMENSAT = 547 // { int utimensat(int fd, \ +) diff --git a/api/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go b/api/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go new file mode 100644 index 0000000..4488314 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go @@ -0,0 +1,353 @@ +// mksysnum_freebsd.pl +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,freebsd + +package unix + +const ( + // SYS_NOSYS = 0; // { int nosys(void); } syscall nosys_args int + SYS_EXIT = 1 // { void sys_exit(int rval); } exit \ + SYS_FORK = 2 // { int fork(void); } + SYS_READ = 3 // { ssize_t read(int fd, void *buf, \ + SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, \ + SYS_OPEN = 5 // { int open(char *path, int flags, int mode); } + SYS_CLOSE = 6 // { int close(int fd); } + SYS_WAIT4 = 7 // { int wait4(int pid, int *status, \ + SYS_LINK = 9 // { int link(char *path, char *link); } + SYS_UNLINK = 10 // { int unlink(char *path); } + SYS_CHDIR = 12 // { int chdir(char *path); } + SYS_FCHDIR = 13 // { int fchdir(int fd); } + SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } + SYS_CHMOD = 15 // { int chmod(char *path, int mode); } + SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } + SYS_OBREAK = 17 // { int obreak(char *nsize); } break \ + SYS_GETPID = 20 // { pid_t getpid(void); } + SYS_MOUNT = 21 // { int mount(char *type, char *path, \ + SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } + SYS_SETUID = 23 // { int setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t getuid(void); } + SYS_GETEUID = 25 // { uid_t geteuid(void); } + SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, \ + SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, \ + SYS_SENDMSG = 28 // { int sendmsg(int s, struct msghdr *msg, \ + SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, \ + SYS_ACCEPT = 30 // { int accept(int s, \ + SYS_GETPEERNAME = 31 // { int getpeername(int fdes, \ + SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, \ + SYS_ACCESS = 33 // { int access(char *path, int amode); } + SYS_CHFLAGS = 34 // { int chflags(const char *path, u_long flags); } + SYS_FCHFLAGS = 35 // { int fchflags(int fd, u_long flags); } + SYS_SYNC = 36 // { int sync(void); } + SYS_KILL = 37 // { int kill(int pid, int signum); } + SYS_GETPPID = 39 // { pid_t getppid(void); } + SYS_DUP = 41 // { int dup(u_int fd); } + SYS_PIPE = 42 // { int pipe(void); } + SYS_GETEGID = 43 // { gid_t getegid(void); } + SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, \ + SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, \ + SYS_GETGID = 47 // { gid_t getgid(void); } + SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int \ + SYS_SETLOGIN = 50 // { int setlogin(char *namebuf); } + SYS_ACCT = 51 // { int acct(char *path); } + SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, \ + SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, \ + SYS_REBOOT = 55 // { int reboot(int opt); } + SYS_REVOKE = 56 // { int revoke(char *path); } + SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } + SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, \ + SYS_EXECVE = 59 // { int execve(char *fname, char **argv, \ + SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args \ + SYS_CHROOT = 61 // { int chroot(char *path); } + SYS_MSYNC = 65 // { int msync(void *addr, size_t len, \ + SYS_VFORK = 66 // { int vfork(void); } + SYS_SBRK = 69 // { int sbrk(int incr); } + SYS_SSTK = 70 // { int sstk(int incr); } + SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise \ + SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, \ + SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, \ + SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, \ + SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, \ + SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, \ + SYS_GETPGRP = 81 // { int getpgrp(void); } + SYS_SETPGID = 82 // { int setpgid(int pid, int pgid); } + SYS_SETITIMER = 83 // { int setitimer(u_int which, struct \ + SYS_SWAPON = 85 // { int swapon(char *name); } + SYS_GETITIMER = 86 // { int getitimer(u_int which, \ + SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); } + SYS_DUP2 = 90 // { int dup2(u_int from, u_int to); } + SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); } + SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, \ + SYS_FSYNC = 95 // { int fsync(int fd); } + SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, \ + SYS_SOCKET = 97 // { int socket(int domain, int type, \ + SYS_CONNECT = 98 // { int connect(int s, caddr_t name, \ + SYS_GETPRIORITY = 100 // { int getpriority(int which, int who); } + SYS_BIND = 104 // { int bind(int s, caddr_t name, \ + SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, \ + SYS_LISTEN = 106 // { int listen(int s, int backlog); } + SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, \ + SYS_GETRUSAGE = 117 // { int getrusage(int who, \ + SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, \ + SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, \ + SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, \ + SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, \ + SYS_FCHOWN = 123 // { int fchown(int fd, int uid, int gid); } + SYS_FCHMOD = 124 // { int fchmod(int fd, int mode); } + SYS_SETREUID = 126 // { int setreuid(int ruid, int euid); } + SYS_SETREGID = 127 // { int setregid(int rgid, int egid); } + SYS_RENAME = 128 // { int rename(char *from, char *to); } + SYS_FLOCK = 131 // { int flock(int fd, int how); } + SYS_MKFIFO = 132 // { int mkfifo(char *path, int mode); } + SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, \ + SYS_SHUTDOWN = 134 // { int shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, \ + SYS_MKDIR = 136 // { int mkdir(char *path, int mode); } + SYS_RMDIR = 137 // { int rmdir(char *path); } + SYS_UTIMES = 138 // { int utimes(char *path, \ + SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, \ + SYS_SETSID = 147 // { int setsid(void); } + SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, \ + SYS_LGETFH = 160 // { int lgetfh(char *fname, \ + SYS_GETFH = 161 // { int getfh(char *fname, \ + SYS_SYSARCH = 165 // { int sysarch(int op, char *parms); } + SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, \ + SYS_FREEBSD6_PREAD = 173 // { ssize_t freebsd6_pread(int fd, void *buf, \ + SYS_FREEBSD6_PWRITE = 174 // { ssize_t freebsd6_pwrite(int fd, \ + SYS_SETFIB = 175 // { int setfib(int fibnum); } + SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } + SYS_SETGID = 181 // { int setgid(gid_t gid); } + SYS_SETEGID = 182 // { int setegid(gid_t egid); } + SYS_SETEUID = 183 // { int seteuid(uid_t euid); } + SYS_STAT = 188 // { int stat(char *path, struct stat *ub); } + SYS_FSTAT = 189 // { int fstat(int fd, struct stat *sb); } + SYS_LSTAT = 190 // { int lstat(char *path, struct stat *ub); } + SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } + SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } + SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, \ + SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, \ + SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, \ + SYS_FREEBSD6_MMAP = 197 // { caddr_t freebsd6_mmap(caddr_t addr, \ + SYS_FREEBSD6_LSEEK = 199 // { off_t freebsd6_lseek(int fd, int pad, \ + SYS_FREEBSD6_TRUNCATE = 200 // { int freebsd6_truncate(char *path, int pad, \ + SYS_FREEBSD6_FTRUNCATE = 201 // { int freebsd6_ftruncate(int fd, int pad, \ + SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, \ + SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } + SYS_UNDELETE = 205 // { int undelete(char *path); } + SYS_FUTIMES = 206 // { int futimes(int fd, struct timeval *tptr); } + SYS_GETPGID = 207 // { int getpgid(pid_t pid); } + SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, \ + SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, \ + SYS_CLOCK_SETTIME = 233 // { int clock_settime( \ + SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, \ + SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, \ + SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); } + SYS_KTIMER_SETTIME = 237 // { int ktimer_settime(int timerid, int flags, \ + SYS_KTIMER_GETTIME = 238 // { int ktimer_gettime(int timerid, struct \ + SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); } + SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, \ + SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } + SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( \ + SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( \ + SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,\ + SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } + SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, \ + SYS_RFORK = 251 // { int rfork(int flags); } + SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, \ + SYS_ISSETUGID = 253 // { int issetugid(void); } + SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } + SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, \ + SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } + SYS_LUTIMES = 276 // { int lutimes(char *path, \ + SYS_NSTAT = 278 // { int nstat(char *path, struct nstat *ub); } + SYS_NFSTAT = 279 // { int nfstat(int fd, struct nstat *sb); } + SYS_NLSTAT = 280 // { int nlstat(char *path, struct nstat *ub); } + SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, \ + SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, \ + SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, \ + SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, \ + SYS_MODNEXT = 300 // { int modnext(int modid); } + SYS_MODSTAT = 301 // { int modstat(int modid, \ + SYS_MODFNEXT = 302 // { int modfnext(int modid); } + SYS_MODFIND = 303 // { int modfind(const char *name); } + SYS_KLDLOAD = 304 // { int kldload(const char *file); } + SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } + SYS_KLDFIND = 306 // { int kldfind(const char *file); } + SYS_KLDNEXT = 307 // { int kldnext(int fileid); } + SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct \ + SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } + SYS_GETSID = 310 // { int getsid(pid_t pid); } + SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, \ + SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, \ + SYS_YIELD = 321 // { int yield(void); } + SYS_MLOCKALL = 324 // { int mlockall(int how); } + SYS_MUNLOCKALL = 325 // { int munlockall(void); } + SYS___GETCWD = 326 // { int __getcwd(char *buf, u_int buflen); } + SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, \ + SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct \ + SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int \ + SYS_SCHED_GETSCHEDULER = 330 // { int sched_getscheduler (pid_t pid); } + SYS_SCHED_YIELD = 331 // { int sched_yield (void); } + SYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); } + SYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); } + SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, \ + SYS_UTRACE = 335 // { int utrace(const void *addr, size_t len); } + SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, \ + SYS_JAIL = 338 // { int jail(struct jail *jail); } + SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, \ + SYS_SIGSUSPEND = 341 // { int sigsuspend(const sigset_t *sigmask); } + SYS_SIGPENDING = 343 // { int sigpending(sigset_t *set); } + SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set, \ + SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set, \ + SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, \ + SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, \ + SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, \ + SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, \ + SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, \ + SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, \ + SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, \ + SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, \ + SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, \ + SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( \ + SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( \ + SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, \ + SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, \ + SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, \ + SYS_KQUEUE = 362 // { int kqueue(void); } + SYS_KEVENT = 363 // { int kevent(int fd, \ + SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, \ + SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, \ + SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, \ + SYS___SETUGID = 374 // { int __setugid(int flag); } + SYS_EACCESS = 376 // { int eaccess(char *path, int amode); } + SYS_NMOUNT = 378 // { int nmount(struct iovec *iovp, \ + SYS___MAC_GET_PROC = 384 // { int __mac_get_proc(struct mac *mac_p); } + SYS___MAC_SET_PROC = 385 // { int __mac_set_proc(struct mac *mac_p); } + SYS___MAC_GET_FD = 386 // { int __mac_get_fd(int fd, \ + SYS___MAC_GET_FILE = 387 // { int __mac_get_file(const char *path_p, \ + SYS___MAC_SET_FD = 388 // { int __mac_set_fd(int fd, \ + SYS___MAC_SET_FILE = 389 // { int __mac_set_file(const char *path_p, \ + SYS_KENV = 390 // { int kenv(int what, const char *name, \ + SYS_LCHFLAGS = 391 // { int lchflags(const char *path, \ + SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, \ + SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, \ + SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, \ + SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, \ + SYS_STATFS = 396 // { int statfs(char *path, \ + SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } + SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, \ + SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, \ + SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, \ + SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, \ + SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( \ + SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( \ + SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( \ + SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, \ + SYS_SIGACTION = 416 // { int sigaction(int sig, \ + SYS_SIGRETURN = 417 // { int sigreturn( \ + SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); } + SYS_SETCONTEXT = 422 // { int setcontext( \ + SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, \ + SYS_SWAPOFF = 424 // { int swapoff(const char *name); } + SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, \ + SYS___ACL_SET_LINK = 426 // { int __acl_set_link(const char *path, \ + SYS___ACL_DELETE_LINK = 427 // { int __acl_delete_link(const char *path, \ + SYS___ACL_ACLCHECK_LINK = 428 // { int __acl_aclcheck_link(const char *path, \ + SYS_SIGWAIT = 429 // { int sigwait(const sigset_t *set, \ + SYS_THR_CREATE = 430 // { int thr_create(ucontext_t *ctx, long *id, \ + SYS_THR_EXIT = 431 // { void thr_exit(long *state); } + SYS_THR_SELF = 432 // { int thr_self(long *id); } + SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } + SYS__UMTX_LOCK = 434 // { int _umtx_lock(struct umtx *umtx); } + SYS__UMTX_UNLOCK = 435 // { int _umtx_unlock(struct umtx *umtx); } + SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } + SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, \ + SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( \ + SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( \ + SYS_THR_SUSPEND = 442 // { int thr_suspend( \ + SYS_THR_WAKE = 443 // { int thr_wake(long id); } + SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); } + SYS_AUDIT = 445 // { int audit(const void *record, \ + SYS_AUDITON = 446 // { int auditon(int cmd, void *data, \ + SYS_GETAUID = 447 // { int getauid(uid_t *auid); } + SYS_SETAUID = 448 // { int setauid(uid_t *auid); } + SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); } + SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); } + SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( \ + SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( \ + SYS_AUDITCTL = 453 // { int auditctl(char *path); } + SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, \ + SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, \ + SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); } + SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); } + SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); } + SYS_RTPRIO_THREAD = 466 // { int rtprio_thread(int function, \ + SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, \ + SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, \ + SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, \ + SYS_LSEEK = 478 // { off_t lseek(int fd, off_t offset, \ + SYS_TRUNCATE = 479 // { int truncate(char *path, off_t length); } + SYS_FTRUNCATE = 480 // { int ftruncate(int fd, off_t length); } + SYS_THR_KILL2 = 481 // { int thr_kill2(pid_t pid, long id, int sig); } + SYS_SHM_OPEN = 482 // { int shm_open(const char *path, int flags, \ + SYS_SHM_UNLINK = 483 // { int shm_unlink(const char *path); } + SYS_CPUSET = 484 // { int cpuset(cpusetid_t *setid); } + SYS_CPUSET_SETID = 485 // { int cpuset_setid(cpuwhich_t which, id_t id, \ + SYS_CPUSET_GETID = 486 // { int cpuset_getid(cpulevel_t level, \ + SYS_CPUSET_GETAFFINITY = 487 // { int cpuset_getaffinity(cpulevel_t level, \ + SYS_CPUSET_SETAFFINITY = 488 // { int cpuset_setaffinity(cpulevel_t level, \ + SYS_FACCESSAT = 489 // { int faccessat(int fd, char *path, int amode, \ + SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, \ + SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, \ + SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, \ + SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, \ + SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, \ + SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, \ + SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); } + SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); } + SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, \ + SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, \ + SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, \ + SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, \ + SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, \ + SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); } + SYS_POSIX_OPENPT = 504 // { int posix_openpt(int flags); } + SYS_JAIL_GET = 506 // { int jail_get(struct iovec *iovp, \ + SYS_JAIL_SET = 507 // { int jail_set(struct iovec *iovp, \ + SYS_JAIL_REMOVE = 508 // { int jail_remove(int jid); } + SYS_CLOSEFROM = 509 // { int closefrom(int lowfd); } + SYS_LPATHCONF = 513 // { int lpathconf(char *path, int name); } + SYS___CAP_RIGHTS_GET = 515 // { int __cap_rights_get(int version, \ + SYS_CAP_ENTER = 516 // { int cap_enter(void); } + SYS_CAP_GETMODE = 517 // { int cap_getmode(u_int *modep); } + SYS_PDFORK = 518 // { int pdfork(int *fdp, int flags); } + SYS_PDKILL = 519 // { int pdkill(int fd, int signum); } + SYS_PDGETPID = 520 // { int pdgetpid(int fd, pid_t *pidp); } + SYS_PSELECT = 522 // { int pselect(int nd, fd_set *in, \ + SYS_GETLOGINCLASS = 523 // { int getloginclass(char *namebuf, \ + SYS_SETLOGINCLASS = 524 // { int setloginclass(const char *namebuf); } + SYS_RCTL_GET_RACCT = 525 // { int rctl_get_racct(const void *inbufp, \ + SYS_RCTL_GET_RULES = 526 // { int rctl_get_rules(const void *inbufp, \ + SYS_RCTL_GET_LIMITS = 527 // { int rctl_get_limits(const void *inbufp, \ + SYS_RCTL_ADD_RULE = 528 // { int rctl_add_rule(const void *inbufp, \ + SYS_RCTL_REMOVE_RULE = 529 // { int rctl_remove_rule(const void *inbufp, \ + SYS_POSIX_FALLOCATE = 530 // { int posix_fallocate(int fd, \ + SYS_POSIX_FADVISE = 531 // { int posix_fadvise(int fd, off_t offset, \ + SYS_WAIT6 = 532 // { int wait6(idtype_t idtype, id_t id, \ + SYS_CAP_RIGHTS_LIMIT = 533 // { int cap_rights_limit(int fd, \ + SYS_CAP_IOCTLS_LIMIT = 534 // { int cap_ioctls_limit(int fd, \ + SYS_CAP_IOCTLS_GET = 535 // { ssize_t cap_ioctls_get(int fd, \ + SYS_CAP_FCNTLS_LIMIT = 536 // { int cap_fcntls_limit(int fd, \ + SYS_CAP_FCNTLS_GET = 537 // { int cap_fcntls_get(int fd, \ + SYS_BINDAT = 538 // { int bindat(int fd, int s, caddr_t name, \ + SYS_CONNECTAT = 539 // { int connectat(int fd, int s, caddr_t name, \ + SYS_CHFLAGSAT = 540 // { int chflagsat(int fd, const char *path, \ + SYS_ACCEPT4 = 541 // { int accept4(int s, \ + SYS_PIPE2 = 542 // { int pipe2(int *fildes, int flags); } + SYS_PROCCTL = 544 // { int procctl(idtype_t idtype, id_t id, \ + SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, \ + SYS_FUTIMENS = 546 // { int futimens(int fd, \ + SYS_UTIMENSAT = 547 // { int utimensat(int fd, \ +) diff --git a/api/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go b/api/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go new file mode 100644 index 0000000..95ab129 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go @@ -0,0 +1,390 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include -m32 /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,linux + +package unix + +const ( + SYS_RESTART_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_WAITPID = 7 + SYS_CREAT = 8 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_EXECVE = 11 + SYS_CHDIR = 12 + SYS_TIME = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_LCHOWN = 16 + SYS_BREAK = 17 + SYS_OLDSTAT = 18 + SYS_LSEEK = 19 + SYS_GETPID = 20 + SYS_MOUNT = 21 + SYS_UMOUNT = 22 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_STIME = 25 + SYS_PTRACE = 26 + SYS_ALARM = 27 + SYS_OLDFSTAT = 28 + SYS_PAUSE = 29 + SYS_UTIME = 30 + SYS_STTY = 31 + SYS_GTTY = 32 + SYS_ACCESS = 33 + SYS_NICE = 34 + SYS_FTIME = 35 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_RENAME = 38 + SYS_MKDIR = 39 + SYS_RMDIR = 40 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_TIMES = 43 + SYS_PROF = 44 + SYS_BRK = 45 + SYS_SETGID = 46 + SYS_GETGID = 47 + SYS_SIGNAL = 48 + SYS_GETEUID = 49 + SYS_GETEGID = 50 + SYS_ACCT = 51 + SYS_UMOUNT2 = 52 + SYS_LOCK = 53 + SYS_IOCTL = 54 + SYS_FCNTL = 55 + SYS_MPX = 56 + SYS_SETPGID = 57 + SYS_ULIMIT = 58 + SYS_OLDOLDUNAME = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_USTAT = 62 + SYS_DUP2 = 63 + SYS_GETPPID = 64 + SYS_GETPGRP = 65 + SYS_SETSID = 66 + SYS_SIGACTION = 67 + SYS_SGETMASK = 68 + SYS_SSETMASK = 69 + SYS_SETREUID = 70 + SYS_SETREGID = 71 + SYS_SIGSUSPEND = 72 + SYS_SIGPENDING = 73 + SYS_SETHOSTNAME = 74 + SYS_SETRLIMIT = 75 + SYS_GETRLIMIT = 76 + SYS_GETRUSAGE = 77 + SYS_GETTIMEOFDAY = 78 + SYS_SETTIMEOFDAY = 79 + SYS_GETGROUPS = 80 + SYS_SETGROUPS = 81 + SYS_SELECT = 82 + SYS_SYMLINK = 83 + SYS_OLDLSTAT = 84 + SYS_READLINK = 85 + SYS_USELIB = 86 + SYS_SWAPON = 87 + SYS_REBOOT = 88 + SYS_READDIR = 89 + SYS_MMAP = 90 + SYS_MUNMAP = 91 + SYS_TRUNCATE = 92 + SYS_FTRUNCATE = 93 + SYS_FCHMOD = 94 + SYS_FCHOWN = 95 + SYS_GETPRIORITY = 96 + SYS_SETPRIORITY = 97 + SYS_PROFIL = 98 + SYS_STATFS = 99 + SYS_FSTATFS = 100 + SYS_IOPERM = 101 + SYS_SOCKETCALL = 102 + SYS_SYSLOG = 103 + SYS_SETITIMER = 104 + SYS_GETITIMER = 105 + SYS_STAT = 106 + SYS_LSTAT = 107 + SYS_FSTAT = 108 + SYS_OLDUNAME = 109 + SYS_IOPL = 110 + SYS_VHANGUP = 111 + SYS_IDLE = 112 + SYS_VM86OLD = 113 + SYS_WAIT4 = 114 + SYS_SWAPOFF = 115 + SYS_SYSINFO = 116 + SYS_IPC = 117 + SYS_FSYNC = 118 + SYS_SIGRETURN = 119 + SYS_CLONE = 120 + SYS_SETDOMAINNAME = 121 + SYS_UNAME = 122 + SYS_MODIFY_LDT = 123 + SYS_ADJTIMEX = 124 + SYS_MPROTECT = 125 + SYS_SIGPROCMASK = 126 + SYS_CREATE_MODULE = 127 + SYS_INIT_MODULE = 128 + SYS_DELETE_MODULE = 129 + SYS_GET_KERNEL_SYMS = 130 + SYS_QUOTACTL = 131 + SYS_GETPGID = 132 + SYS_FCHDIR = 133 + SYS_BDFLUSH = 134 + SYS_SYSFS = 135 + SYS_PERSONALITY = 136 + SYS_AFS_SYSCALL = 137 + SYS_SETFSUID = 138 + SYS_SETFSGID = 139 + SYS__LLSEEK = 140 + SYS_GETDENTS = 141 + SYS__NEWSELECT = 142 + SYS_FLOCK = 143 + SYS_MSYNC = 144 + SYS_READV = 145 + SYS_WRITEV = 146 + SYS_GETSID = 147 + SYS_FDATASYNC = 148 + SYS__SYSCTL = 149 + SYS_MLOCK = 150 + SYS_MUNLOCK = 151 + SYS_MLOCKALL = 152 + SYS_MUNLOCKALL = 153 + SYS_SCHED_SETPARAM = 154 + SYS_SCHED_GETPARAM = 155 + SYS_SCHED_SETSCHEDULER = 156 + SYS_SCHED_GETSCHEDULER = 157 + SYS_SCHED_YIELD = 158 + SYS_SCHED_GET_PRIORITY_MAX = 159 + SYS_SCHED_GET_PRIORITY_MIN = 160 + SYS_SCHED_RR_GET_INTERVAL = 161 + SYS_NANOSLEEP = 162 + SYS_MREMAP = 163 + SYS_SETRESUID = 164 + SYS_GETRESUID = 165 + SYS_VM86 = 166 + SYS_QUERY_MODULE = 167 + SYS_POLL = 168 + SYS_NFSSERVCTL = 169 + SYS_SETRESGID = 170 + SYS_GETRESGID = 171 + SYS_PRCTL = 172 + SYS_RT_SIGRETURN = 173 + SYS_RT_SIGACTION = 174 + SYS_RT_SIGPROCMASK = 175 + SYS_RT_SIGPENDING = 176 + SYS_RT_SIGTIMEDWAIT = 177 + SYS_RT_SIGQUEUEINFO = 178 + SYS_RT_SIGSUSPEND = 179 + SYS_PREAD64 = 180 + SYS_PWRITE64 = 181 + SYS_CHOWN = 182 + SYS_GETCWD = 183 + SYS_CAPGET = 184 + SYS_CAPSET = 185 + SYS_SIGALTSTACK = 186 + SYS_SENDFILE = 187 + SYS_GETPMSG = 188 + SYS_PUTPMSG = 189 + SYS_VFORK = 190 + SYS_UGETRLIMIT = 191 + SYS_MMAP2 = 192 + SYS_TRUNCATE64 = 193 + SYS_FTRUNCATE64 = 194 + SYS_STAT64 = 195 + SYS_LSTAT64 = 196 + SYS_FSTAT64 = 197 + SYS_LCHOWN32 = 198 + SYS_GETUID32 = 199 + SYS_GETGID32 = 200 + SYS_GETEUID32 = 201 + SYS_GETEGID32 = 202 + SYS_SETREUID32 = 203 + SYS_SETREGID32 = 204 + SYS_GETGROUPS32 = 205 + SYS_SETGROUPS32 = 206 + SYS_FCHOWN32 = 207 + SYS_SETRESUID32 = 208 + SYS_GETRESUID32 = 209 + SYS_SETRESGID32 = 210 + SYS_GETRESGID32 = 211 + SYS_CHOWN32 = 212 + SYS_SETUID32 = 213 + SYS_SETGID32 = 214 + SYS_SETFSUID32 = 215 + SYS_SETFSGID32 = 216 + SYS_PIVOT_ROOT = 217 + SYS_MINCORE = 218 + SYS_MADVISE = 219 + SYS_GETDENTS64 = 220 + SYS_FCNTL64 = 221 + SYS_GETTID = 224 + SYS_READAHEAD = 225 + SYS_SETXATTR = 226 + SYS_LSETXATTR = 227 + SYS_FSETXATTR = 228 + SYS_GETXATTR = 229 + SYS_LGETXATTR = 230 + SYS_FGETXATTR = 231 + SYS_LISTXATTR = 232 + SYS_LLISTXATTR = 233 + SYS_FLISTXATTR = 234 + SYS_REMOVEXATTR = 235 + SYS_LREMOVEXATTR = 236 + SYS_FREMOVEXATTR = 237 + SYS_TKILL = 238 + SYS_SENDFILE64 = 239 + SYS_FUTEX = 240 + SYS_SCHED_SETAFFINITY = 241 + SYS_SCHED_GETAFFINITY = 242 + SYS_SET_THREAD_AREA = 243 + SYS_GET_THREAD_AREA = 244 + SYS_IO_SETUP = 245 + SYS_IO_DESTROY = 246 + SYS_IO_GETEVENTS = 247 + SYS_IO_SUBMIT = 248 + SYS_IO_CANCEL = 249 + SYS_FADVISE64 = 250 + SYS_EXIT_GROUP = 252 + SYS_LOOKUP_DCOOKIE = 253 + SYS_EPOLL_CREATE = 254 + SYS_EPOLL_CTL = 255 + SYS_EPOLL_WAIT = 256 + SYS_REMAP_FILE_PAGES = 257 + SYS_SET_TID_ADDRESS = 258 + SYS_TIMER_CREATE = 259 + SYS_TIMER_SETTIME = 260 + SYS_TIMER_GETTIME = 261 + SYS_TIMER_GETOVERRUN = 262 + SYS_TIMER_DELETE = 263 + SYS_CLOCK_SETTIME = 264 + SYS_CLOCK_GETTIME = 265 + SYS_CLOCK_GETRES = 266 + SYS_CLOCK_NANOSLEEP = 267 + SYS_STATFS64 = 268 + SYS_FSTATFS64 = 269 + SYS_TGKILL = 270 + SYS_UTIMES = 271 + SYS_FADVISE64_64 = 272 + SYS_VSERVER = 273 + SYS_MBIND = 274 + SYS_GET_MEMPOLICY = 275 + SYS_SET_MEMPOLICY = 276 + SYS_MQ_OPEN = 277 + SYS_MQ_UNLINK = 278 + SYS_MQ_TIMEDSEND = 279 + SYS_MQ_TIMEDRECEIVE = 280 + SYS_MQ_NOTIFY = 281 + SYS_MQ_GETSETATTR = 282 + SYS_KEXEC_LOAD = 283 + SYS_WAITID = 284 + SYS_ADD_KEY = 286 + SYS_REQUEST_KEY = 287 + SYS_KEYCTL = 288 + SYS_IOPRIO_SET = 289 + SYS_IOPRIO_GET = 290 + SYS_INOTIFY_INIT = 291 + SYS_INOTIFY_ADD_WATCH = 292 + SYS_INOTIFY_RM_WATCH = 293 + SYS_MIGRATE_PAGES = 294 + SYS_OPENAT = 295 + SYS_MKDIRAT = 296 + SYS_MKNODAT = 297 + SYS_FCHOWNAT = 298 + SYS_FUTIMESAT = 299 + SYS_FSTATAT64 = 300 + SYS_UNLINKAT = 301 + SYS_RENAMEAT = 302 + SYS_LINKAT = 303 + SYS_SYMLINKAT = 304 + SYS_READLINKAT = 305 + SYS_FCHMODAT = 306 + SYS_FACCESSAT = 307 + SYS_PSELECT6 = 308 + SYS_PPOLL = 309 + SYS_UNSHARE = 310 + SYS_SET_ROBUST_LIST = 311 + SYS_GET_ROBUST_LIST = 312 + SYS_SPLICE = 313 + SYS_SYNC_FILE_RANGE = 314 + SYS_TEE = 315 + SYS_VMSPLICE = 316 + SYS_MOVE_PAGES = 317 + SYS_GETCPU = 318 + SYS_EPOLL_PWAIT = 319 + SYS_UTIMENSAT = 320 + SYS_SIGNALFD = 321 + SYS_TIMERFD_CREATE = 322 + SYS_EVENTFD = 323 + SYS_FALLOCATE = 324 + SYS_TIMERFD_SETTIME = 325 + SYS_TIMERFD_GETTIME = 326 + SYS_SIGNALFD4 = 327 + SYS_EVENTFD2 = 328 + SYS_EPOLL_CREATE1 = 329 + SYS_DUP3 = 330 + SYS_PIPE2 = 331 + SYS_INOTIFY_INIT1 = 332 + SYS_PREADV = 333 + SYS_PWRITEV = 334 + SYS_RT_TGSIGQUEUEINFO = 335 + SYS_PERF_EVENT_OPEN = 336 + SYS_RECVMMSG = 337 + SYS_FANOTIFY_INIT = 338 + SYS_FANOTIFY_MARK = 339 + SYS_PRLIMIT64 = 340 + SYS_NAME_TO_HANDLE_AT = 341 + SYS_OPEN_BY_HANDLE_AT = 342 + SYS_CLOCK_ADJTIME = 343 + SYS_SYNCFS = 344 + SYS_SENDMMSG = 345 + SYS_SETNS = 346 + SYS_PROCESS_VM_READV = 347 + SYS_PROCESS_VM_WRITEV = 348 + SYS_KCMP = 349 + SYS_FINIT_MODULE = 350 + SYS_SCHED_SETATTR = 351 + SYS_SCHED_GETATTR = 352 + SYS_RENAMEAT2 = 353 + SYS_SECCOMP = 354 + SYS_GETRANDOM = 355 + SYS_MEMFD_CREATE = 356 + SYS_BPF = 357 + SYS_EXECVEAT = 358 + SYS_SOCKET = 359 + SYS_SOCKETPAIR = 360 + SYS_BIND = 361 + SYS_CONNECT = 362 + SYS_LISTEN = 363 + SYS_ACCEPT4 = 364 + SYS_GETSOCKOPT = 365 + SYS_SETSOCKOPT = 366 + SYS_GETSOCKNAME = 367 + SYS_GETPEERNAME = 368 + SYS_SENDTO = 369 + SYS_SENDMSG = 370 + SYS_RECVFROM = 371 + SYS_RECVMSG = 372 + SYS_SHUTDOWN = 373 + SYS_USERFAULTFD = 374 + SYS_MEMBARRIER = 375 + SYS_MLOCK2 = 376 + SYS_COPY_FILE_RANGE = 377 + SYS_PREADV2 = 378 + SYS_PWRITEV2 = 379 + SYS_PKEY_MPROTECT = 380 + SYS_PKEY_ALLOC = 381 + SYS_PKEY_FREE = 382 + SYS_STATX = 383 + SYS_ARCH_PRCTL = 384 +) diff --git a/api/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go b/api/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go new file mode 100644 index 0000000..c5dabf2 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go @@ -0,0 +1,342 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include -m64 /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,linux + +package unix + +const ( + SYS_READ = 0 + SYS_WRITE = 1 + SYS_OPEN = 2 + SYS_CLOSE = 3 + SYS_STAT = 4 + SYS_FSTAT = 5 + SYS_LSTAT = 6 + SYS_POLL = 7 + SYS_LSEEK = 8 + SYS_MMAP = 9 + SYS_MPROTECT = 10 + SYS_MUNMAP = 11 + SYS_BRK = 12 + SYS_RT_SIGACTION = 13 + SYS_RT_SIGPROCMASK = 14 + SYS_RT_SIGRETURN = 15 + SYS_IOCTL = 16 + SYS_PREAD64 = 17 + SYS_PWRITE64 = 18 + SYS_READV = 19 + SYS_WRITEV = 20 + SYS_ACCESS = 21 + SYS_PIPE = 22 + SYS_SELECT = 23 + SYS_SCHED_YIELD = 24 + SYS_MREMAP = 25 + SYS_MSYNC = 26 + SYS_MINCORE = 27 + SYS_MADVISE = 28 + SYS_SHMGET = 29 + SYS_SHMAT = 30 + SYS_SHMCTL = 31 + SYS_DUP = 32 + SYS_DUP2 = 33 + SYS_PAUSE = 34 + SYS_NANOSLEEP = 35 + SYS_GETITIMER = 36 + SYS_ALARM = 37 + SYS_SETITIMER = 38 + SYS_GETPID = 39 + SYS_SENDFILE = 40 + SYS_SOCKET = 41 + SYS_CONNECT = 42 + SYS_ACCEPT = 43 + SYS_SENDTO = 44 + SYS_RECVFROM = 45 + SYS_SENDMSG = 46 + SYS_RECVMSG = 47 + SYS_SHUTDOWN = 48 + SYS_BIND = 49 + SYS_LISTEN = 50 + SYS_GETSOCKNAME = 51 + SYS_GETPEERNAME = 52 + SYS_SOCKETPAIR = 53 + SYS_SETSOCKOPT = 54 + SYS_GETSOCKOPT = 55 + SYS_CLONE = 56 + SYS_FORK = 57 + SYS_VFORK = 58 + SYS_EXECVE = 59 + SYS_EXIT = 60 + SYS_WAIT4 = 61 + SYS_KILL = 62 + SYS_UNAME = 63 + SYS_SEMGET = 64 + SYS_SEMOP = 65 + SYS_SEMCTL = 66 + SYS_SHMDT = 67 + SYS_MSGGET = 68 + SYS_MSGSND = 69 + SYS_MSGRCV = 70 + SYS_MSGCTL = 71 + SYS_FCNTL = 72 + SYS_FLOCK = 73 + SYS_FSYNC = 74 + SYS_FDATASYNC = 75 + SYS_TRUNCATE = 76 + SYS_FTRUNCATE = 77 + SYS_GETDENTS = 78 + SYS_GETCWD = 79 + SYS_CHDIR = 80 + SYS_FCHDIR = 81 + SYS_RENAME = 82 + SYS_MKDIR = 83 + SYS_RMDIR = 84 + SYS_CREAT = 85 + SYS_LINK = 86 + SYS_UNLINK = 87 + SYS_SYMLINK = 88 + SYS_READLINK = 89 + SYS_CHMOD = 90 + SYS_FCHMOD = 91 + SYS_CHOWN = 92 + SYS_FCHOWN = 93 + SYS_LCHOWN = 94 + SYS_UMASK = 95 + SYS_GETTIMEOFDAY = 96 + SYS_GETRLIMIT = 97 + SYS_GETRUSAGE = 98 + SYS_SYSINFO = 99 + SYS_TIMES = 100 + SYS_PTRACE = 101 + SYS_GETUID = 102 + SYS_SYSLOG = 103 + SYS_GETGID = 104 + SYS_SETUID = 105 + SYS_SETGID = 106 + SYS_GETEUID = 107 + SYS_GETEGID = 108 + SYS_SETPGID = 109 + SYS_GETPPID = 110 + SYS_GETPGRP = 111 + SYS_SETSID = 112 + SYS_SETREUID = 113 + SYS_SETREGID = 114 + SYS_GETGROUPS = 115 + SYS_SETGROUPS = 116 + SYS_SETRESUID = 117 + SYS_GETRESUID = 118 + SYS_SETRESGID = 119 + SYS_GETRESGID = 120 + SYS_GETPGID = 121 + SYS_SETFSUID = 122 + SYS_SETFSGID = 123 + SYS_GETSID = 124 + SYS_CAPGET = 125 + SYS_CAPSET = 126 + SYS_RT_SIGPENDING = 127 + SYS_RT_SIGTIMEDWAIT = 128 + SYS_RT_SIGQUEUEINFO = 129 + SYS_RT_SIGSUSPEND = 130 + SYS_SIGALTSTACK = 131 + SYS_UTIME = 132 + SYS_MKNOD = 133 + SYS_USELIB = 134 + SYS_PERSONALITY = 135 + SYS_USTAT = 136 + SYS_STATFS = 137 + SYS_FSTATFS = 138 + SYS_SYSFS = 139 + SYS_GETPRIORITY = 140 + SYS_SETPRIORITY = 141 + SYS_SCHED_SETPARAM = 142 + SYS_SCHED_GETPARAM = 143 + SYS_SCHED_SETSCHEDULER = 144 + SYS_SCHED_GETSCHEDULER = 145 + SYS_SCHED_GET_PRIORITY_MAX = 146 + SYS_SCHED_GET_PRIORITY_MIN = 147 + SYS_SCHED_RR_GET_INTERVAL = 148 + SYS_MLOCK = 149 + SYS_MUNLOCK = 150 + SYS_MLOCKALL = 151 + SYS_MUNLOCKALL = 152 + SYS_VHANGUP = 153 + SYS_MODIFY_LDT = 154 + SYS_PIVOT_ROOT = 155 + SYS__SYSCTL = 156 + SYS_PRCTL = 157 + SYS_ARCH_PRCTL = 158 + SYS_ADJTIMEX = 159 + SYS_SETRLIMIT = 160 + SYS_CHROOT = 161 + SYS_SYNC = 162 + SYS_ACCT = 163 + SYS_SETTIMEOFDAY = 164 + SYS_MOUNT = 165 + SYS_UMOUNT2 = 166 + SYS_SWAPON = 167 + SYS_SWAPOFF = 168 + SYS_REBOOT = 169 + SYS_SETHOSTNAME = 170 + SYS_SETDOMAINNAME = 171 + SYS_IOPL = 172 + SYS_IOPERM = 173 + SYS_CREATE_MODULE = 174 + SYS_INIT_MODULE = 175 + SYS_DELETE_MODULE = 176 + SYS_GET_KERNEL_SYMS = 177 + SYS_QUERY_MODULE = 178 + SYS_QUOTACTL = 179 + SYS_NFSSERVCTL = 180 + SYS_GETPMSG = 181 + SYS_PUTPMSG = 182 + SYS_AFS_SYSCALL = 183 + SYS_TUXCALL = 184 + SYS_SECURITY = 185 + SYS_GETTID = 186 + SYS_READAHEAD = 187 + SYS_SETXATTR = 188 + SYS_LSETXATTR = 189 + SYS_FSETXATTR = 190 + SYS_GETXATTR = 191 + SYS_LGETXATTR = 192 + SYS_FGETXATTR = 193 + SYS_LISTXATTR = 194 + SYS_LLISTXATTR = 195 + SYS_FLISTXATTR = 196 + SYS_REMOVEXATTR = 197 + SYS_LREMOVEXATTR = 198 + SYS_FREMOVEXATTR = 199 + SYS_TKILL = 200 + SYS_TIME = 201 + SYS_FUTEX = 202 + SYS_SCHED_SETAFFINITY = 203 + SYS_SCHED_GETAFFINITY = 204 + SYS_SET_THREAD_AREA = 205 + SYS_IO_SETUP = 206 + SYS_IO_DESTROY = 207 + SYS_IO_GETEVENTS = 208 + SYS_IO_SUBMIT = 209 + SYS_IO_CANCEL = 210 + SYS_GET_THREAD_AREA = 211 + SYS_LOOKUP_DCOOKIE = 212 + SYS_EPOLL_CREATE = 213 + SYS_EPOLL_CTL_OLD = 214 + SYS_EPOLL_WAIT_OLD = 215 + SYS_REMAP_FILE_PAGES = 216 + SYS_GETDENTS64 = 217 + SYS_SET_TID_ADDRESS = 218 + SYS_RESTART_SYSCALL = 219 + SYS_SEMTIMEDOP = 220 + SYS_FADVISE64 = 221 + SYS_TIMER_CREATE = 222 + SYS_TIMER_SETTIME = 223 + SYS_TIMER_GETTIME = 224 + SYS_TIMER_GETOVERRUN = 225 + SYS_TIMER_DELETE = 226 + SYS_CLOCK_SETTIME = 227 + SYS_CLOCK_GETTIME = 228 + SYS_CLOCK_GETRES = 229 + SYS_CLOCK_NANOSLEEP = 230 + SYS_EXIT_GROUP = 231 + SYS_EPOLL_WAIT = 232 + SYS_EPOLL_CTL = 233 + SYS_TGKILL = 234 + SYS_UTIMES = 235 + SYS_VSERVER = 236 + SYS_MBIND = 237 + SYS_SET_MEMPOLICY = 238 + SYS_GET_MEMPOLICY = 239 + SYS_MQ_OPEN = 240 + SYS_MQ_UNLINK = 241 + SYS_MQ_TIMEDSEND = 242 + SYS_MQ_TIMEDRECEIVE = 243 + SYS_MQ_NOTIFY = 244 + SYS_MQ_GETSETATTR = 245 + SYS_KEXEC_LOAD = 246 + SYS_WAITID = 247 + SYS_ADD_KEY = 248 + SYS_REQUEST_KEY = 249 + SYS_KEYCTL = 250 + SYS_IOPRIO_SET = 251 + SYS_IOPRIO_GET = 252 + SYS_INOTIFY_INIT = 253 + SYS_INOTIFY_ADD_WATCH = 254 + SYS_INOTIFY_RM_WATCH = 255 + SYS_MIGRATE_PAGES = 256 + SYS_OPENAT = 257 + SYS_MKDIRAT = 258 + SYS_MKNODAT = 259 + SYS_FCHOWNAT = 260 + SYS_FUTIMESAT = 261 + SYS_NEWFSTATAT = 262 + SYS_UNLINKAT = 263 + SYS_RENAMEAT = 264 + SYS_LINKAT = 265 + SYS_SYMLINKAT = 266 + SYS_READLINKAT = 267 + SYS_FCHMODAT = 268 + SYS_FACCESSAT = 269 + SYS_PSELECT6 = 270 + SYS_PPOLL = 271 + SYS_UNSHARE = 272 + SYS_SET_ROBUST_LIST = 273 + SYS_GET_ROBUST_LIST = 274 + SYS_SPLICE = 275 + SYS_TEE = 276 + SYS_SYNC_FILE_RANGE = 277 + SYS_VMSPLICE = 278 + SYS_MOVE_PAGES = 279 + SYS_UTIMENSAT = 280 + SYS_EPOLL_PWAIT = 281 + SYS_SIGNALFD = 282 + SYS_TIMERFD_CREATE = 283 + SYS_EVENTFD = 284 + SYS_FALLOCATE = 285 + SYS_TIMERFD_SETTIME = 286 + SYS_TIMERFD_GETTIME = 287 + SYS_ACCEPT4 = 288 + SYS_SIGNALFD4 = 289 + SYS_EVENTFD2 = 290 + SYS_EPOLL_CREATE1 = 291 + SYS_DUP3 = 292 + SYS_PIPE2 = 293 + SYS_INOTIFY_INIT1 = 294 + SYS_PREADV = 295 + SYS_PWRITEV = 296 + SYS_RT_TGSIGQUEUEINFO = 297 + SYS_PERF_EVENT_OPEN = 298 + SYS_RECVMMSG = 299 + SYS_FANOTIFY_INIT = 300 + SYS_FANOTIFY_MARK = 301 + SYS_PRLIMIT64 = 302 + SYS_NAME_TO_HANDLE_AT = 303 + SYS_OPEN_BY_HANDLE_AT = 304 + SYS_CLOCK_ADJTIME = 305 + SYS_SYNCFS = 306 + SYS_SENDMMSG = 307 + SYS_SETNS = 308 + SYS_GETCPU = 309 + SYS_PROCESS_VM_READV = 310 + SYS_PROCESS_VM_WRITEV = 311 + SYS_KCMP = 312 + SYS_FINIT_MODULE = 313 + SYS_SCHED_SETATTR = 314 + SYS_SCHED_GETATTR = 315 + SYS_RENAMEAT2 = 316 + SYS_SECCOMP = 317 + SYS_GETRANDOM = 318 + SYS_MEMFD_CREATE = 319 + SYS_KEXEC_FILE_LOAD = 320 + SYS_BPF = 321 + SYS_EXECVEAT = 322 + SYS_USERFAULTFD = 323 + SYS_MEMBARRIER = 324 + SYS_MLOCK2 = 325 + SYS_COPY_FILE_RANGE = 326 + SYS_PREADV2 = 327 + SYS_PWRITEV2 = 328 + SYS_PKEY_MPROTECT = 329 + SYS_PKEY_ALLOC = 330 + SYS_PKEY_FREE = 331 + SYS_STATX = 332 +) diff --git a/api/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go b/api/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go new file mode 100644 index 0000000..ab7fa5f --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go @@ -0,0 +1,362 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,linux + +package unix + +const ( + SYS_RESTART_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_CREAT = 8 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_EXECVE = 11 + SYS_CHDIR = 12 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_LCHOWN = 16 + SYS_LSEEK = 19 + SYS_GETPID = 20 + SYS_MOUNT = 21 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_PTRACE = 26 + SYS_PAUSE = 29 + SYS_ACCESS = 33 + SYS_NICE = 34 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_RENAME = 38 + SYS_MKDIR = 39 + SYS_RMDIR = 40 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_TIMES = 43 + SYS_BRK = 45 + SYS_SETGID = 46 + SYS_GETGID = 47 + SYS_GETEUID = 49 + SYS_GETEGID = 50 + SYS_ACCT = 51 + SYS_UMOUNT2 = 52 + SYS_IOCTL = 54 + SYS_FCNTL = 55 + SYS_SETPGID = 57 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_USTAT = 62 + SYS_DUP2 = 63 + SYS_GETPPID = 64 + SYS_GETPGRP = 65 + SYS_SETSID = 66 + SYS_SIGACTION = 67 + SYS_SETREUID = 70 + SYS_SETREGID = 71 + SYS_SIGSUSPEND = 72 + SYS_SIGPENDING = 73 + SYS_SETHOSTNAME = 74 + SYS_SETRLIMIT = 75 + SYS_GETRUSAGE = 77 + SYS_GETTIMEOFDAY = 78 + SYS_SETTIMEOFDAY = 79 + SYS_GETGROUPS = 80 + SYS_SETGROUPS = 81 + SYS_SYMLINK = 83 + SYS_READLINK = 85 + SYS_USELIB = 86 + SYS_SWAPON = 87 + SYS_REBOOT = 88 + SYS_MUNMAP = 91 + SYS_TRUNCATE = 92 + SYS_FTRUNCATE = 93 + SYS_FCHMOD = 94 + SYS_FCHOWN = 95 + SYS_GETPRIORITY = 96 + SYS_SETPRIORITY = 97 + SYS_STATFS = 99 + SYS_FSTATFS = 100 + SYS_SYSLOG = 103 + SYS_SETITIMER = 104 + SYS_GETITIMER = 105 + SYS_STAT = 106 + SYS_LSTAT = 107 + SYS_FSTAT = 108 + SYS_VHANGUP = 111 + SYS_WAIT4 = 114 + SYS_SWAPOFF = 115 + SYS_SYSINFO = 116 + SYS_FSYNC = 118 + SYS_SIGRETURN = 119 + SYS_CLONE = 120 + SYS_SETDOMAINNAME = 121 + SYS_UNAME = 122 + SYS_ADJTIMEX = 124 + SYS_MPROTECT = 125 + SYS_SIGPROCMASK = 126 + SYS_INIT_MODULE = 128 + SYS_DELETE_MODULE = 129 + SYS_QUOTACTL = 131 + SYS_GETPGID = 132 + SYS_FCHDIR = 133 + SYS_BDFLUSH = 134 + SYS_SYSFS = 135 + SYS_PERSONALITY = 136 + SYS_SETFSUID = 138 + SYS_SETFSGID = 139 + SYS__LLSEEK = 140 + SYS_GETDENTS = 141 + SYS__NEWSELECT = 142 + SYS_FLOCK = 143 + SYS_MSYNC = 144 + SYS_READV = 145 + SYS_WRITEV = 146 + SYS_GETSID = 147 + SYS_FDATASYNC = 148 + SYS__SYSCTL = 149 + SYS_MLOCK = 150 + SYS_MUNLOCK = 151 + SYS_MLOCKALL = 152 + SYS_MUNLOCKALL = 153 + SYS_SCHED_SETPARAM = 154 + SYS_SCHED_GETPARAM = 155 + SYS_SCHED_SETSCHEDULER = 156 + SYS_SCHED_GETSCHEDULER = 157 + SYS_SCHED_YIELD = 158 + SYS_SCHED_GET_PRIORITY_MAX = 159 + SYS_SCHED_GET_PRIORITY_MIN = 160 + SYS_SCHED_RR_GET_INTERVAL = 161 + SYS_NANOSLEEP = 162 + SYS_MREMAP = 163 + SYS_SETRESUID = 164 + SYS_GETRESUID = 165 + SYS_POLL = 168 + SYS_NFSSERVCTL = 169 + SYS_SETRESGID = 170 + SYS_GETRESGID = 171 + SYS_PRCTL = 172 + SYS_RT_SIGRETURN = 173 + SYS_RT_SIGACTION = 174 + SYS_RT_SIGPROCMASK = 175 + SYS_RT_SIGPENDING = 176 + SYS_RT_SIGTIMEDWAIT = 177 + SYS_RT_SIGQUEUEINFO = 178 + SYS_RT_SIGSUSPEND = 179 + SYS_PREAD64 = 180 + SYS_PWRITE64 = 181 + SYS_CHOWN = 182 + SYS_GETCWD = 183 + SYS_CAPGET = 184 + SYS_CAPSET = 185 + SYS_SIGALTSTACK = 186 + SYS_SENDFILE = 187 + SYS_VFORK = 190 + SYS_UGETRLIMIT = 191 + SYS_MMAP2 = 192 + SYS_TRUNCATE64 = 193 + SYS_FTRUNCATE64 = 194 + SYS_STAT64 = 195 + SYS_LSTAT64 = 196 + SYS_FSTAT64 = 197 + SYS_LCHOWN32 = 198 + SYS_GETUID32 = 199 + SYS_GETGID32 = 200 + SYS_GETEUID32 = 201 + SYS_GETEGID32 = 202 + SYS_SETREUID32 = 203 + SYS_SETREGID32 = 204 + SYS_GETGROUPS32 = 205 + SYS_SETGROUPS32 = 206 + SYS_FCHOWN32 = 207 + SYS_SETRESUID32 = 208 + SYS_GETRESUID32 = 209 + SYS_SETRESGID32 = 210 + SYS_GETRESGID32 = 211 + SYS_CHOWN32 = 212 + SYS_SETUID32 = 213 + SYS_SETGID32 = 214 + SYS_SETFSUID32 = 215 + SYS_SETFSGID32 = 216 + SYS_GETDENTS64 = 217 + SYS_PIVOT_ROOT = 218 + SYS_MINCORE = 219 + SYS_MADVISE = 220 + SYS_FCNTL64 = 221 + SYS_GETTID = 224 + SYS_READAHEAD = 225 + SYS_SETXATTR = 226 + SYS_LSETXATTR = 227 + SYS_FSETXATTR = 228 + SYS_GETXATTR = 229 + SYS_LGETXATTR = 230 + SYS_FGETXATTR = 231 + SYS_LISTXATTR = 232 + SYS_LLISTXATTR = 233 + SYS_FLISTXATTR = 234 + SYS_REMOVEXATTR = 235 + SYS_LREMOVEXATTR = 236 + SYS_FREMOVEXATTR = 237 + SYS_TKILL = 238 + SYS_SENDFILE64 = 239 + SYS_FUTEX = 240 + SYS_SCHED_SETAFFINITY = 241 + SYS_SCHED_GETAFFINITY = 242 + SYS_IO_SETUP = 243 + SYS_IO_DESTROY = 244 + SYS_IO_GETEVENTS = 245 + SYS_IO_SUBMIT = 246 + SYS_IO_CANCEL = 247 + SYS_EXIT_GROUP = 248 + SYS_LOOKUP_DCOOKIE = 249 + SYS_EPOLL_CREATE = 250 + SYS_EPOLL_CTL = 251 + SYS_EPOLL_WAIT = 252 + SYS_REMAP_FILE_PAGES = 253 + SYS_SET_TID_ADDRESS = 256 + SYS_TIMER_CREATE = 257 + SYS_TIMER_SETTIME = 258 + SYS_TIMER_GETTIME = 259 + SYS_TIMER_GETOVERRUN = 260 + SYS_TIMER_DELETE = 261 + SYS_CLOCK_SETTIME = 262 + SYS_CLOCK_GETTIME = 263 + SYS_CLOCK_GETRES = 264 + SYS_CLOCK_NANOSLEEP = 265 + SYS_STATFS64 = 266 + SYS_FSTATFS64 = 267 + SYS_TGKILL = 268 + SYS_UTIMES = 269 + SYS_ARM_FADVISE64_64 = 270 + SYS_PCICONFIG_IOBASE = 271 + SYS_PCICONFIG_READ = 272 + SYS_PCICONFIG_WRITE = 273 + SYS_MQ_OPEN = 274 + SYS_MQ_UNLINK = 275 + SYS_MQ_TIMEDSEND = 276 + SYS_MQ_TIMEDRECEIVE = 277 + SYS_MQ_NOTIFY = 278 + SYS_MQ_GETSETATTR = 279 + SYS_WAITID = 280 + SYS_SOCKET = 281 + SYS_BIND = 282 + SYS_CONNECT = 283 + SYS_LISTEN = 284 + SYS_ACCEPT = 285 + SYS_GETSOCKNAME = 286 + SYS_GETPEERNAME = 287 + SYS_SOCKETPAIR = 288 + SYS_SEND = 289 + SYS_SENDTO = 290 + SYS_RECV = 291 + SYS_RECVFROM = 292 + SYS_SHUTDOWN = 293 + SYS_SETSOCKOPT = 294 + SYS_GETSOCKOPT = 295 + SYS_SENDMSG = 296 + SYS_RECVMSG = 297 + SYS_SEMOP = 298 + SYS_SEMGET = 299 + SYS_SEMCTL = 300 + SYS_MSGSND = 301 + SYS_MSGRCV = 302 + SYS_MSGGET = 303 + SYS_MSGCTL = 304 + SYS_SHMAT = 305 + SYS_SHMDT = 306 + SYS_SHMGET = 307 + SYS_SHMCTL = 308 + SYS_ADD_KEY = 309 + SYS_REQUEST_KEY = 310 + SYS_KEYCTL = 311 + SYS_SEMTIMEDOP = 312 + SYS_VSERVER = 313 + SYS_IOPRIO_SET = 314 + SYS_IOPRIO_GET = 315 + SYS_INOTIFY_INIT = 316 + SYS_INOTIFY_ADD_WATCH = 317 + SYS_INOTIFY_RM_WATCH = 318 + SYS_MBIND = 319 + SYS_GET_MEMPOLICY = 320 + SYS_SET_MEMPOLICY = 321 + SYS_OPENAT = 322 + SYS_MKDIRAT = 323 + SYS_MKNODAT = 324 + SYS_FCHOWNAT = 325 + SYS_FUTIMESAT = 326 + SYS_FSTATAT64 = 327 + SYS_UNLINKAT = 328 + SYS_RENAMEAT = 329 + SYS_LINKAT = 330 + SYS_SYMLINKAT = 331 + SYS_READLINKAT = 332 + SYS_FCHMODAT = 333 + SYS_FACCESSAT = 334 + SYS_PSELECT6 = 335 + SYS_PPOLL = 336 + SYS_UNSHARE = 337 + SYS_SET_ROBUST_LIST = 338 + SYS_GET_ROBUST_LIST = 339 + SYS_SPLICE = 340 + SYS_ARM_SYNC_FILE_RANGE = 341 + SYS_TEE = 342 + SYS_VMSPLICE = 343 + SYS_MOVE_PAGES = 344 + SYS_GETCPU = 345 + SYS_EPOLL_PWAIT = 346 + SYS_KEXEC_LOAD = 347 + SYS_UTIMENSAT = 348 + SYS_SIGNALFD = 349 + SYS_TIMERFD_CREATE = 350 + SYS_EVENTFD = 351 + SYS_FALLOCATE = 352 + SYS_TIMERFD_SETTIME = 353 + SYS_TIMERFD_GETTIME = 354 + SYS_SIGNALFD4 = 355 + SYS_EVENTFD2 = 356 + SYS_EPOLL_CREATE1 = 357 + SYS_DUP3 = 358 + SYS_PIPE2 = 359 + SYS_INOTIFY_INIT1 = 360 + SYS_PREADV = 361 + SYS_PWRITEV = 362 + SYS_RT_TGSIGQUEUEINFO = 363 + SYS_PERF_EVENT_OPEN = 364 + SYS_RECVMMSG = 365 + SYS_ACCEPT4 = 366 + SYS_FANOTIFY_INIT = 367 + SYS_FANOTIFY_MARK = 368 + SYS_PRLIMIT64 = 369 + SYS_NAME_TO_HANDLE_AT = 370 + SYS_OPEN_BY_HANDLE_AT = 371 + SYS_CLOCK_ADJTIME = 372 + SYS_SYNCFS = 373 + SYS_SENDMMSG = 374 + SYS_SETNS = 375 + SYS_PROCESS_VM_READV = 376 + SYS_PROCESS_VM_WRITEV = 377 + SYS_KCMP = 378 + SYS_FINIT_MODULE = 379 + SYS_SCHED_SETATTR = 380 + SYS_SCHED_GETATTR = 381 + SYS_RENAMEAT2 = 382 + SYS_SECCOMP = 383 + SYS_GETRANDOM = 384 + SYS_MEMFD_CREATE = 385 + SYS_BPF = 386 + SYS_EXECVEAT = 387 + SYS_USERFAULTFD = 388 + SYS_MEMBARRIER = 389 + SYS_MLOCK2 = 390 + SYS_COPY_FILE_RANGE = 391 + SYS_PREADV2 = 392 + SYS_PWRITEV2 = 393 + SYS_PKEY_MPROTECT = 394 + SYS_PKEY_ALLOC = 395 + SYS_PKEY_FREE = 396 + SYS_STATX = 397 +) diff --git a/api/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go b/api/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go new file mode 100644 index 0000000..b1c6b4b --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go @@ -0,0 +1,286 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include -fsigned-char /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm64,linux + +package unix + +const ( + SYS_IO_SETUP = 0 + SYS_IO_DESTROY = 1 + SYS_IO_SUBMIT = 2 + SYS_IO_CANCEL = 3 + SYS_IO_GETEVENTS = 4 + SYS_SETXATTR = 5 + SYS_LSETXATTR = 6 + SYS_FSETXATTR = 7 + SYS_GETXATTR = 8 + SYS_LGETXATTR = 9 + SYS_FGETXATTR = 10 + SYS_LISTXATTR = 11 + SYS_LLISTXATTR = 12 + SYS_FLISTXATTR = 13 + SYS_REMOVEXATTR = 14 + SYS_LREMOVEXATTR = 15 + SYS_FREMOVEXATTR = 16 + SYS_GETCWD = 17 + SYS_LOOKUP_DCOOKIE = 18 + SYS_EVENTFD2 = 19 + SYS_EPOLL_CREATE1 = 20 + SYS_EPOLL_CTL = 21 + SYS_EPOLL_PWAIT = 22 + SYS_DUP = 23 + SYS_DUP3 = 24 + SYS_FCNTL = 25 + SYS_INOTIFY_INIT1 = 26 + SYS_INOTIFY_ADD_WATCH = 27 + SYS_INOTIFY_RM_WATCH = 28 + SYS_IOCTL = 29 + SYS_IOPRIO_SET = 30 + SYS_IOPRIO_GET = 31 + SYS_FLOCK = 32 + SYS_MKNODAT = 33 + SYS_MKDIRAT = 34 + SYS_UNLINKAT = 35 + SYS_SYMLINKAT = 36 + SYS_LINKAT = 37 + SYS_RENAMEAT = 38 + SYS_UMOUNT2 = 39 + SYS_MOUNT = 40 + SYS_PIVOT_ROOT = 41 + SYS_NFSSERVCTL = 42 + SYS_STATFS = 43 + SYS_FSTATFS = 44 + SYS_TRUNCATE = 45 + SYS_FTRUNCATE = 46 + SYS_FALLOCATE = 47 + SYS_FACCESSAT = 48 + SYS_CHDIR = 49 + SYS_FCHDIR = 50 + SYS_CHROOT = 51 + SYS_FCHMOD = 52 + SYS_FCHMODAT = 53 + SYS_FCHOWNAT = 54 + SYS_FCHOWN = 55 + SYS_OPENAT = 56 + SYS_CLOSE = 57 + SYS_VHANGUP = 58 + SYS_PIPE2 = 59 + SYS_QUOTACTL = 60 + SYS_GETDENTS64 = 61 + SYS_LSEEK = 62 + SYS_READ = 63 + SYS_WRITE = 64 + SYS_READV = 65 + SYS_WRITEV = 66 + SYS_PREAD64 = 67 + SYS_PWRITE64 = 68 + SYS_PREADV = 69 + SYS_PWRITEV = 70 + SYS_SENDFILE = 71 + SYS_PSELECT6 = 72 + SYS_PPOLL = 73 + SYS_SIGNALFD4 = 74 + SYS_VMSPLICE = 75 + SYS_SPLICE = 76 + SYS_TEE = 77 + SYS_READLINKAT = 78 + SYS_FSTATAT = 79 + SYS_FSTAT = 80 + SYS_SYNC = 81 + SYS_FSYNC = 82 + SYS_FDATASYNC = 83 + SYS_SYNC_FILE_RANGE = 84 + SYS_TIMERFD_CREATE = 85 + SYS_TIMERFD_SETTIME = 86 + SYS_TIMERFD_GETTIME = 87 + SYS_UTIMENSAT = 88 + SYS_ACCT = 89 + SYS_CAPGET = 90 + SYS_CAPSET = 91 + SYS_PERSONALITY = 92 + SYS_EXIT = 93 + SYS_EXIT_GROUP = 94 + SYS_WAITID = 95 + SYS_SET_TID_ADDRESS = 96 + SYS_UNSHARE = 97 + SYS_FUTEX = 98 + SYS_SET_ROBUST_LIST = 99 + SYS_GET_ROBUST_LIST = 100 + SYS_NANOSLEEP = 101 + SYS_GETITIMER = 102 + SYS_SETITIMER = 103 + SYS_KEXEC_LOAD = 104 + SYS_INIT_MODULE = 105 + SYS_DELETE_MODULE = 106 + SYS_TIMER_CREATE = 107 + SYS_TIMER_GETTIME = 108 + SYS_TIMER_GETOVERRUN = 109 + SYS_TIMER_SETTIME = 110 + SYS_TIMER_DELETE = 111 + SYS_CLOCK_SETTIME = 112 + SYS_CLOCK_GETTIME = 113 + SYS_CLOCK_GETRES = 114 + SYS_CLOCK_NANOSLEEP = 115 + SYS_SYSLOG = 116 + SYS_PTRACE = 117 + SYS_SCHED_SETPARAM = 118 + SYS_SCHED_SETSCHEDULER = 119 + SYS_SCHED_GETSCHEDULER = 120 + SYS_SCHED_GETPARAM = 121 + SYS_SCHED_SETAFFINITY = 122 + SYS_SCHED_GETAFFINITY = 123 + SYS_SCHED_YIELD = 124 + SYS_SCHED_GET_PRIORITY_MAX = 125 + SYS_SCHED_GET_PRIORITY_MIN = 126 + SYS_SCHED_RR_GET_INTERVAL = 127 + SYS_RESTART_SYSCALL = 128 + SYS_KILL = 129 + SYS_TKILL = 130 + SYS_TGKILL = 131 + SYS_SIGALTSTACK = 132 + SYS_RT_SIGSUSPEND = 133 + SYS_RT_SIGACTION = 134 + SYS_RT_SIGPROCMASK = 135 + SYS_RT_SIGPENDING = 136 + SYS_RT_SIGTIMEDWAIT = 137 + SYS_RT_SIGQUEUEINFO = 138 + SYS_RT_SIGRETURN = 139 + SYS_SETPRIORITY = 140 + SYS_GETPRIORITY = 141 + SYS_REBOOT = 142 + SYS_SETREGID = 143 + SYS_SETGID = 144 + SYS_SETREUID = 145 + SYS_SETUID = 146 + SYS_SETRESUID = 147 + SYS_GETRESUID = 148 + SYS_SETRESGID = 149 + SYS_GETRESGID = 150 + SYS_SETFSUID = 151 + SYS_SETFSGID = 152 + SYS_TIMES = 153 + SYS_SETPGID = 154 + SYS_GETPGID = 155 + SYS_GETSID = 156 + SYS_SETSID = 157 + SYS_GETGROUPS = 158 + SYS_SETGROUPS = 159 + SYS_UNAME = 160 + SYS_SETHOSTNAME = 161 + SYS_SETDOMAINNAME = 162 + SYS_GETRLIMIT = 163 + SYS_SETRLIMIT = 164 + SYS_GETRUSAGE = 165 + SYS_UMASK = 166 + SYS_PRCTL = 167 + SYS_GETCPU = 168 + SYS_GETTIMEOFDAY = 169 + SYS_SETTIMEOFDAY = 170 + SYS_ADJTIMEX = 171 + SYS_GETPID = 172 + SYS_GETPPID = 173 + SYS_GETUID = 174 + SYS_GETEUID = 175 + SYS_GETGID = 176 + SYS_GETEGID = 177 + SYS_GETTID = 178 + SYS_SYSINFO = 179 + SYS_MQ_OPEN = 180 + SYS_MQ_UNLINK = 181 + SYS_MQ_TIMEDSEND = 182 + SYS_MQ_TIMEDRECEIVE = 183 + SYS_MQ_NOTIFY = 184 + SYS_MQ_GETSETATTR = 185 + SYS_MSGGET = 186 + SYS_MSGCTL = 187 + SYS_MSGRCV = 188 + SYS_MSGSND = 189 + SYS_SEMGET = 190 + SYS_SEMCTL = 191 + SYS_SEMTIMEDOP = 192 + SYS_SEMOP = 193 + SYS_SHMGET = 194 + SYS_SHMCTL = 195 + SYS_SHMAT = 196 + SYS_SHMDT = 197 + SYS_SOCKET = 198 + SYS_SOCKETPAIR = 199 + SYS_BIND = 200 + SYS_LISTEN = 201 + SYS_ACCEPT = 202 + SYS_CONNECT = 203 + SYS_GETSOCKNAME = 204 + SYS_GETPEERNAME = 205 + SYS_SENDTO = 206 + SYS_RECVFROM = 207 + SYS_SETSOCKOPT = 208 + SYS_GETSOCKOPT = 209 + SYS_SHUTDOWN = 210 + SYS_SENDMSG = 211 + SYS_RECVMSG = 212 + SYS_READAHEAD = 213 + SYS_BRK = 214 + SYS_MUNMAP = 215 + SYS_MREMAP = 216 + SYS_ADD_KEY = 217 + SYS_REQUEST_KEY = 218 + SYS_KEYCTL = 219 + SYS_CLONE = 220 + SYS_EXECVE = 221 + SYS_MMAP = 222 + SYS_FADVISE64 = 223 + SYS_SWAPON = 224 + SYS_SWAPOFF = 225 + SYS_MPROTECT = 226 + SYS_MSYNC = 227 + SYS_MLOCK = 228 + SYS_MUNLOCK = 229 + SYS_MLOCKALL = 230 + SYS_MUNLOCKALL = 231 + SYS_MINCORE = 232 + SYS_MADVISE = 233 + SYS_REMAP_FILE_PAGES = 234 + SYS_MBIND = 235 + SYS_GET_MEMPOLICY = 236 + SYS_SET_MEMPOLICY = 237 + SYS_MIGRATE_PAGES = 238 + SYS_MOVE_PAGES = 239 + SYS_RT_TGSIGQUEUEINFO = 240 + SYS_PERF_EVENT_OPEN = 241 + SYS_ACCEPT4 = 242 + SYS_RECVMMSG = 243 + SYS_ARCH_SPECIFIC_SYSCALL = 244 + SYS_WAIT4 = 260 + SYS_PRLIMIT64 = 261 + SYS_FANOTIFY_INIT = 262 + SYS_FANOTIFY_MARK = 263 + SYS_NAME_TO_HANDLE_AT = 264 + SYS_OPEN_BY_HANDLE_AT = 265 + SYS_CLOCK_ADJTIME = 266 + SYS_SYNCFS = 267 + SYS_SETNS = 268 + SYS_SENDMMSG = 269 + SYS_PROCESS_VM_READV = 270 + SYS_PROCESS_VM_WRITEV = 271 + SYS_KCMP = 272 + SYS_FINIT_MODULE = 273 + SYS_SCHED_SETATTR = 274 + SYS_SCHED_GETATTR = 275 + SYS_RENAMEAT2 = 276 + SYS_SECCOMP = 277 + SYS_GETRANDOM = 278 + SYS_MEMFD_CREATE = 279 + SYS_BPF = 280 + SYS_EXECVEAT = 281 + SYS_USERFAULTFD = 282 + SYS_MEMBARRIER = 283 + SYS_MLOCK2 = 284 + SYS_COPY_FILE_RANGE = 285 + SYS_PREADV2 = 286 + SYS_PWRITEV2 = 287 + SYS_PKEY_MPROTECT = 288 + SYS_PKEY_ALLOC = 289 + SYS_PKEY_FREE = 290 + SYS_STATX = 291 +) diff --git a/api/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go b/api/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go new file mode 100644 index 0000000..2e9aa7a --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go @@ -0,0 +1,375 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mips,linux + +package unix + +const ( + SYS_SYSCALL = 4000 + SYS_EXIT = 4001 + SYS_FORK = 4002 + SYS_READ = 4003 + SYS_WRITE = 4004 + SYS_OPEN = 4005 + SYS_CLOSE = 4006 + SYS_WAITPID = 4007 + SYS_CREAT = 4008 + SYS_LINK = 4009 + SYS_UNLINK = 4010 + SYS_EXECVE = 4011 + SYS_CHDIR = 4012 + SYS_TIME = 4013 + SYS_MKNOD = 4014 + SYS_CHMOD = 4015 + SYS_LCHOWN = 4016 + SYS_BREAK = 4017 + SYS_UNUSED18 = 4018 + SYS_LSEEK = 4019 + SYS_GETPID = 4020 + SYS_MOUNT = 4021 + SYS_UMOUNT = 4022 + SYS_SETUID = 4023 + SYS_GETUID = 4024 + SYS_STIME = 4025 + SYS_PTRACE = 4026 + SYS_ALARM = 4027 + SYS_UNUSED28 = 4028 + SYS_PAUSE = 4029 + SYS_UTIME = 4030 + SYS_STTY = 4031 + SYS_GTTY = 4032 + SYS_ACCESS = 4033 + SYS_NICE = 4034 + SYS_FTIME = 4035 + SYS_SYNC = 4036 + SYS_KILL = 4037 + SYS_RENAME = 4038 + SYS_MKDIR = 4039 + SYS_RMDIR = 4040 + SYS_DUP = 4041 + SYS_PIPE = 4042 + SYS_TIMES = 4043 + SYS_PROF = 4044 + SYS_BRK = 4045 + SYS_SETGID = 4046 + SYS_GETGID = 4047 + SYS_SIGNAL = 4048 + SYS_GETEUID = 4049 + SYS_GETEGID = 4050 + SYS_ACCT = 4051 + SYS_UMOUNT2 = 4052 + SYS_LOCK = 4053 + SYS_IOCTL = 4054 + SYS_FCNTL = 4055 + SYS_MPX = 4056 + SYS_SETPGID = 4057 + SYS_ULIMIT = 4058 + SYS_UNUSED59 = 4059 + SYS_UMASK = 4060 + SYS_CHROOT = 4061 + SYS_USTAT = 4062 + SYS_DUP2 = 4063 + SYS_GETPPID = 4064 + SYS_GETPGRP = 4065 + SYS_SETSID = 4066 + SYS_SIGACTION = 4067 + SYS_SGETMASK = 4068 + SYS_SSETMASK = 4069 + SYS_SETREUID = 4070 + SYS_SETREGID = 4071 + SYS_SIGSUSPEND = 4072 + SYS_SIGPENDING = 4073 + SYS_SETHOSTNAME = 4074 + SYS_SETRLIMIT = 4075 + SYS_GETRLIMIT = 4076 + SYS_GETRUSAGE = 4077 + SYS_GETTIMEOFDAY = 4078 + SYS_SETTIMEOFDAY = 4079 + SYS_GETGROUPS = 4080 + SYS_SETGROUPS = 4081 + SYS_RESERVED82 = 4082 + SYS_SYMLINK = 4083 + SYS_UNUSED84 = 4084 + SYS_READLINK = 4085 + SYS_USELIB = 4086 + SYS_SWAPON = 4087 + SYS_REBOOT = 4088 + SYS_READDIR = 4089 + SYS_MMAP = 4090 + SYS_MUNMAP = 4091 + SYS_TRUNCATE = 4092 + SYS_FTRUNCATE = 4093 + SYS_FCHMOD = 4094 + SYS_FCHOWN = 4095 + SYS_GETPRIORITY = 4096 + SYS_SETPRIORITY = 4097 + SYS_PROFIL = 4098 + SYS_STATFS = 4099 + SYS_FSTATFS = 4100 + SYS_IOPERM = 4101 + SYS_SOCKETCALL = 4102 + SYS_SYSLOG = 4103 + SYS_SETITIMER = 4104 + SYS_GETITIMER = 4105 + SYS_STAT = 4106 + SYS_LSTAT = 4107 + SYS_FSTAT = 4108 + SYS_UNUSED109 = 4109 + SYS_IOPL = 4110 + SYS_VHANGUP = 4111 + SYS_IDLE = 4112 + SYS_VM86 = 4113 + SYS_WAIT4 = 4114 + SYS_SWAPOFF = 4115 + SYS_SYSINFO = 4116 + SYS_IPC = 4117 + SYS_FSYNC = 4118 + SYS_SIGRETURN = 4119 + SYS_CLONE = 4120 + SYS_SETDOMAINNAME = 4121 + SYS_UNAME = 4122 + SYS_MODIFY_LDT = 4123 + SYS_ADJTIMEX = 4124 + SYS_MPROTECT = 4125 + SYS_SIGPROCMASK = 4126 + SYS_CREATE_MODULE = 4127 + SYS_INIT_MODULE = 4128 + SYS_DELETE_MODULE = 4129 + SYS_GET_KERNEL_SYMS = 4130 + SYS_QUOTACTL = 4131 + SYS_GETPGID = 4132 + SYS_FCHDIR = 4133 + SYS_BDFLUSH = 4134 + SYS_SYSFS = 4135 + SYS_PERSONALITY = 4136 + SYS_AFS_SYSCALL = 4137 + SYS_SETFSUID = 4138 + SYS_SETFSGID = 4139 + SYS__LLSEEK = 4140 + SYS_GETDENTS = 4141 + SYS__NEWSELECT = 4142 + SYS_FLOCK = 4143 + SYS_MSYNC = 4144 + SYS_READV = 4145 + SYS_WRITEV = 4146 + SYS_CACHEFLUSH = 4147 + SYS_CACHECTL = 4148 + SYS_SYSMIPS = 4149 + SYS_UNUSED150 = 4150 + SYS_GETSID = 4151 + SYS_FDATASYNC = 4152 + SYS__SYSCTL = 4153 + SYS_MLOCK = 4154 + SYS_MUNLOCK = 4155 + SYS_MLOCKALL = 4156 + SYS_MUNLOCKALL = 4157 + SYS_SCHED_SETPARAM = 4158 + SYS_SCHED_GETPARAM = 4159 + SYS_SCHED_SETSCHEDULER = 4160 + SYS_SCHED_GETSCHEDULER = 4161 + SYS_SCHED_YIELD = 4162 + SYS_SCHED_GET_PRIORITY_MAX = 4163 + SYS_SCHED_GET_PRIORITY_MIN = 4164 + SYS_SCHED_RR_GET_INTERVAL = 4165 + SYS_NANOSLEEP = 4166 + SYS_MREMAP = 4167 + SYS_ACCEPT = 4168 + SYS_BIND = 4169 + SYS_CONNECT = 4170 + SYS_GETPEERNAME = 4171 + SYS_GETSOCKNAME = 4172 + SYS_GETSOCKOPT = 4173 + SYS_LISTEN = 4174 + SYS_RECV = 4175 + SYS_RECVFROM = 4176 + SYS_RECVMSG = 4177 + SYS_SEND = 4178 + SYS_SENDMSG = 4179 + SYS_SENDTO = 4180 + SYS_SETSOCKOPT = 4181 + SYS_SHUTDOWN = 4182 + SYS_SOCKET = 4183 + SYS_SOCKETPAIR = 4184 + SYS_SETRESUID = 4185 + SYS_GETRESUID = 4186 + SYS_QUERY_MODULE = 4187 + SYS_POLL = 4188 + SYS_NFSSERVCTL = 4189 + SYS_SETRESGID = 4190 + SYS_GETRESGID = 4191 + SYS_PRCTL = 4192 + SYS_RT_SIGRETURN = 4193 + SYS_RT_SIGACTION = 4194 + SYS_RT_SIGPROCMASK = 4195 + SYS_RT_SIGPENDING = 4196 + SYS_RT_SIGTIMEDWAIT = 4197 + SYS_RT_SIGQUEUEINFO = 4198 + SYS_RT_SIGSUSPEND = 4199 + SYS_PREAD64 = 4200 + SYS_PWRITE64 = 4201 + SYS_CHOWN = 4202 + SYS_GETCWD = 4203 + SYS_CAPGET = 4204 + SYS_CAPSET = 4205 + SYS_SIGALTSTACK = 4206 + SYS_SENDFILE = 4207 + SYS_GETPMSG = 4208 + SYS_PUTPMSG = 4209 + SYS_MMAP2 = 4210 + SYS_TRUNCATE64 = 4211 + SYS_FTRUNCATE64 = 4212 + SYS_STAT64 = 4213 + SYS_LSTAT64 = 4214 + SYS_FSTAT64 = 4215 + SYS_PIVOT_ROOT = 4216 + SYS_MINCORE = 4217 + SYS_MADVISE = 4218 + SYS_GETDENTS64 = 4219 + SYS_FCNTL64 = 4220 + SYS_RESERVED221 = 4221 + SYS_GETTID = 4222 + SYS_READAHEAD = 4223 + SYS_SETXATTR = 4224 + SYS_LSETXATTR = 4225 + SYS_FSETXATTR = 4226 + SYS_GETXATTR = 4227 + SYS_LGETXATTR = 4228 + SYS_FGETXATTR = 4229 + SYS_LISTXATTR = 4230 + SYS_LLISTXATTR = 4231 + SYS_FLISTXATTR = 4232 + SYS_REMOVEXATTR = 4233 + SYS_LREMOVEXATTR = 4234 + SYS_FREMOVEXATTR = 4235 + SYS_TKILL = 4236 + SYS_SENDFILE64 = 4237 + SYS_FUTEX = 4238 + SYS_SCHED_SETAFFINITY = 4239 + SYS_SCHED_GETAFFINITY = 4240 + SYS_IO_SETUP = 4241 + SYS_IO_DESTROY = 4242 + SYS_IO_GETEVENTS = 4243 + SYS_IO_SUBMIT = 4244 + SYS_IO_CANCEL = 4245 + SYS_EXIT_GROUP = 4246 + SYS_LOOKUP_DCOOKIE = 4247 + SYS_EPOLL_CREATE = 4248 + SYS_EPOLL_CTL = 4249 + SYS_EPOLL_WAIT = 4250 + SYS_REMAP_FILE_PAGES = 4251 + SYS_SET_TID_ADDRESS = 4252 + SYS_RESTART_SYSCALL = 4253 + SYS_FADVISE64 = 4254 + SYS_STATFS64 = 4255 + SYS_FSTATFS64 = 4256 + SYS_TIMER_CREATE = 4257 + SYS_TIMER_SETTIME = 4258 + SYS_TIMER_GETTIME = 4259 + SYS_TIMER_GETOVERRUN = 4260 + SYS_TIMER_DELETE = 4261 + SYS_CLOCK_SETTIME = 4262 + SYS_CLOCK_GETTIME = 4263 + SYS_CLOCK_GETRES = 4264 + SYS_CLOCK_NANOSLEEP = 4265 + SYS_TGKILL = 4266 + SYS_UTIMES = 4267 + SYS_MBIND = 4268 + SYS_GET_MEMPOLICY = 4269 + SYS_SET_MEMPOLICY = 4270 + SYS_MQ_OPEN = 4271 + SYS_MQ_UNLINK = 4272 + SYS_MQ_TIMEDSEND = 4273 + SYS_MQ_TIMEDRECEIVE = 4274 + SYS_MQ_NOTIFY = 4275 + SYS_MQ_GETSETATTR = 4276 + SYS_VSERVER = 4277 + SYS_WAITID = 4278 + SYS_ADD_KEY = 4280 + SYS_REQUEST_KEY = 4281 + SYS_KEYCTL = 4282 + SYS_SET_THREAD_AREA = 4283 + SYS_INOTIFY_INIT = 4284 + SYS_INOTIFY_ADD_WATCH = 4285 + SYS_INOTIFY_RM_WATCH = 4286 + SYS_MIGRATE_PAGES = 4287 + SYS_OPENAT = 4288 + SYS_MKDIRAT = 4289 + SYS_MKNODAT = 4290 + SYS_FCHOWNAT = 4291 + SYS_FUTIMESAT = 4292 + SYS_FSTATAT64 = 4293 + SYS_UNLINKAT = 4294 + SYS_RENAMEAT = 4295 + SYS_LINKAT = 4296 + SYS_SYMLINKAT = 4297 + SYS_READLINKAT = 4298 + SYS_FCHMODAT = 4299 + SYS_FACCESSAT = 4300 + SYS_PSELECT6 = 4301 + SYS_PPOLL = 4302 + SYS_UNSHARE = 4303 + SYS_SPLICE = 4304 + SYS_SYNC_FILE_RANGE = 4305 + SYS_TEE = 4306 + SYS_VMSPLICE = 4307 + SYS_MOVE_PAGES = 4308 + SYS_SET_ROBUST_LIST = 4309 + SYS_GET_ROBUST_LIST = 4310 + SYS_KEXEC_LOAD = 4311 + SYS_GETCPU = 4312 + SYS_EPOLL_PWAIT = 4313 + SYS_IOPRIO_SET = 4314 + SYS_IOPRIO_GET = 4315 + SYS_UTIMENSAT = 4316 + SYS_SIGNALFD = 4317 + SYS_TIMERFD = 4318 + SYS_EVENTFD = 4319 + SYS_FALLOCATE = 4320 + SYS_TIMERFD_CREATE = 4321 + SYS_TIMERFD_GETTIME = 4322 + SYS_TIMERFD_SETTIME = 4323 + SYS_SIGNALFD4 = 4324 + SYS_EVENTFD2 = 4325 + SYS_EPOLL_CREATE1 = 4326 + SYS_DUP3 = 4327 + SYS_PIPE2 = 4328 + SYS_INOTIFY_INIT1 = 4329 + SYS_PREADV = 4330 + SYS_PWRITEV = 4331 + SYS_RT_TGSIGQUEUEINFO = 4332 + SYS_PERF_EVENT_OPEN = 4333 + SYS_ACCEPT4 = 4334 + SYS_RECVMMSG = 4335 + SYS_FANOTIFY_INIT = 4336 + SYS_FANOTIFY_MARK = 4337 + SYS_PRLIMIT64 = 4338 + SYS_NAME_TO_HANDLE_AT = 4339 + SYS_OPEN_BY_HANDLE_AT = 4340 + SYS_CLOCK_ADJTIME = 4341 + SYS_SYNCFS = 4342 + SYS_SENDMMSG = 4343 + SYS_SETNS = 4344 + SYS_PROCESS_VM_READV = 4345 + SYS_PROCESS_VM_WRITEV = 4346 + SYS_KCMP = 4347 + SYS_FINIT_MODULE = 4348 + SYS_SCHED_SETATTR = 4349 + SYS_SCHED_GETATTR = 4350 + SYS_RENAMEAT2 = 4351 + SYS_SECCOMP = 4352 + SYS_GETRANDOM = 4353 + SYS_MEMFD_CREATE = 4354 + SYS_BPF = 4355 + SYS_EXECVEAT = 4356 + SYS_USERFAULTFD = 4357 + SYS_MEMBARRIER = 4358 + SYS_MLOCK2 = 4359 + SYS_COPY_FILE_RANGE = 4360 + SYS_PREADV2 = 4361 + SYS_PWRITEV2 = 4362 + SYS_PKEY_MPROTECT = 4363 + SYS_PKEY_ALLOC = 4364 + SYS_PKEY_FREE = 4365 + SYS_STATX = 4366 +) diff --git a/api/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go b/api/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go new file mode 100644 index 0000000..9282763 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go @@ -0,0 +1,335 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mips64,linux + +package unix + +const ( + SYS_READ = 5000 + SYS_WRITE = 5001 + SYS_OPEN = 5002 + SYS_CLOSE = 5003 + SYS_STAT = 5004 + SYS_FSTAT = 5005 + SYS_LSTAT = 5006 + SYS_POLL = 5007 + SYS_LSEEK = 5008 + SYS_MMAP = 5009 + SYS_MPROTECT = 5010 + SYS_MUNMAP = 5011 + SYS_BRK = 5012 + SYS_RT_SIGACTION = 5013 + SYS_RT_SIGPROCMASK = 5014 + SYS_IOCTL = 5015 + SYS_PREAD64 = 5016 + SYS_PWRITE64 = 5017 + SYS_READV = 5018 + SYS_WRITEV = 5019 + SYS_ACCESS = 5020 + SYS_PIPE = 5021 + SYS__NEWSELECT = 5022 + SYS_SCHED_YIELD = 5023 + SYS_MREMAP = 5024 + SYS_MSYNC = 5025 + SYS_MINCORE = 5026 + SYS_MADVISE = 5027 + SYS_SHMGET = 5028 + SYS_SHMAT = 5029 + SYS_SHMCTL = 5030 + SYS_DUP = 5031 + SYS_DUP2 = 5032 + SYS_PAUSE = 5033 + SYS_NANOSLEEP = 5034 + SYS_GETITIMER = 5035 + SYS_SETITIMER = 5036 + SYS_ALARM = 5037 + SYS_GETPID = 5038 + SYS_SENDFILE = 5039 + SYS_SOCKET = 5040 + SYS_CONNECT = 5041 + SYS_ACCEPT = 5042 + SYS_SENDTO = 5043 + SYS_RECVFROM = 5044 + SYS_SENDMSG = 5045 + SYS_RECVMSG = 5046 + SYS_SHUTDOWN = 5047 + SYS_BIND = 5048 + SYS_LISTEN = 5049 + SYS_GETSOCKNAME = 5050 + SYS_GETPEERNAME = 5051 + SYS_SOCKETPAIR = 5052 + SYS_SETSOCKOPT = 5053 + SYS_GETSOCKOPT = 5054 + SYS_CLONE = 5055 + SYS_FORK = 5056 + SYS_EXECVE = 5057 + SYS_EXIT = 5058 + SYS_WAIT4 = 5059 + SYS_KILL = 5060 + SYS_UNAME = 5061 + SYS_SEMGET = 5062 + SYS_SEMOP = 5063 + SYS_SEMCTL = 5064 + SYS_SHMDT = 5065 + SYS_MSGGET = 5066 + SYS_MSGSND = 5067 + SYS_MSGRCV = 5068 + SYS_MSGCTL = 5069 + SYS_FCNTL = 5070 + SYS_FLOCK = 5071 + SYS_FSYNC = 5072 + SYS_FDATASYNC = 5073 + SYS_TRUNCATE = 5074 + SYS_FTRUNCATE = 5075 + SYS_GETDENTS = 5076 + SYS_GETCWD = 5077 + SYS_CHDIR = 5078 + SYS_FCHDIR = 5079 + SYS_RENAME = 5080 + SYS_MKDIR = 5081 + SYS_RMDIR = 5082 + SYS_CREAT = 5083 + SYS_LINK = 5084 + SYS_UNLINK = 5085 + SYS_SYMLINK = 5086 + SYS_READLINK = 5087 + SYS_CHMOD = 5088 + SYS_FCHMOD = 5089 + SYS_CHOWN = 5090 + SYS_FCHOWN = 5091 + SYS_LCHOWN = 5092 + SYS_UMASK = 5093 + SYS_GETTIMEOFDAY = 5094 + SYS_GETRLIMIT = 5095 + SYS_GETRUSAGE = 5096 + SYS_SYSINFO = 5097 + SYS_TIMES = 5098 + SYS_PTRACE = 5099 + SYS_GETUID = 5100 + SYS_SYSLOG = 5101 + SYS_GETGID = 5102 + SYS_SETUID = 5103 + SYS_SETGID = 5104 + SYS_GETEUID = 5105 + SYS_GETEGID = 5106 + SYS_SETPGID = 5107 + SYS_GETPPID = 5108 + SYS_GETPGRP = 5109 + SYS_SETSID = 5110 + SYS_SETREUID = 5111 + SYS_SETREGID = 5112 + SYS_GETGROUPS = 5113 + SYS_SETGROUPS = 5114 + SYS_SETRESUID = 5115 + SYS_GETRESUID = 5116 + SYS_SETRESGID = 5117 + SYS_GETRESGID = 5118 + SYS_GETPGID = 5119 + SYS_SETFSUID = 5120 + SYS_SETFSGID = 5121 + SYS_GETSID = 5122 + SYS_CAPGET = 5123 + SYS_CAPSET = 5124 + SYS_RT_SIGPENDING = 5125 + SYS_RT_SIGTIMEDWAIT = 5126 + SYS_RT_SIGQUEUEINFO = 5127 + SYS_RT_SIGSUSPEND = 5128 + SYS_SIGALTSTACK = 5129 + SYS_UTIME = 5130 + SYS_MKNOD = 5131 + SYS_PERSONALITY = 5132 + SYS_USTAT = 5133 + SYS_STATFS = 5134 + SYS_FSTATFS = 5135 + SYS_SYSFS = 5136 + SYS_GETPRIORITY = 5137 + SYS_SETPRIORITY = 5138 + SYS_SCHED_SETPARAM = 5139 + SYS_SCHED_GETPARAM = 5140 + SYS_SCHED_SETSCHEDULER = 5141 + SYS_SCHED_GETSCHEDULER = 5142 + SYS_SCHED_GET_PRIORITY_MAX = 5143 + SYS_SCHED_GET_PRIORITY_MIN = 5144 + SYS_SCHED_RR_GET_INTERVAL = 5145 + SYS_MLOCK = 5146 + SYS_MUNLOCK = 5147 + SYS_MLOCKALL = 5148 + SYS_MUNLOCKALL = 5149 + SYS_VHANGUP = 5150 + SYS_PIVOT_ROOT = 5151 + SYS__SYSCTL = 5152 + SYS_PRCTL = 5153 + SYS_ADJTIMEX = 5154 + SYS_SETRLIMIT = 5155 + SYS_CHROOT = 5156 + SYS_SYNC = 5157 + SYS_ACCT = 5158 + SYS_SETTIMEOFDAY = 5159 + SYS_MOUNT = 5160 + SYS_UMOUNT2 = 5161 + SYS_SWAPON = 5162 + SYS_SWAPOFF = 5163 + SYS_REBOOT = 5164 + SYS_SETHOSTNAME = 5165 + SYS_SETDOMAINNAME = 5166 + SYS_CREATE_MODULE = 5167 + SYS_INIT_MODULE = 5168 + SYS_DELETE_MODULE = 5169 + SYS_GET_KERNEL_SYMS = 5170 + SYS_QUERY_MODULE = 5171 + SYS_QUOTACTL = 5172 + SYS_NFSSERVCTL = 5173 + SYS_GETPMSG = 5174 + SYS_PUTPMSG = 5175 + SYS_AFS_SYSCALL = 5176 + SYS_RESERVED177 = 5177 + SYS_GETTID = 5178 + SYS_READAHEAD = 5179 + SYS_SETXATTR = 5180 + SYS_LSETXATTR = 5181 + SYS_FSETXATTR = 5182 + SYS_GETXATTR = 5183 + SYS_LGETXATTR = 5184 + SYS_FGETXATTR = 5185 + SYS_LISTXATTR = 5186 + SYS_LLISTXATTR = 5187 + SYS_FLISTXATTR = 5188 + SYS_REMOVEXATTR = 5189 + SYS_LREMOVEXATTR = 5190 + SYS_FREMOVEXATTR = 5191 + SYS_TKILL = 5192 + SYS_RESERVED193 = 5193 + SYS_FUTEX = 5194 + SYS_SCHED_SETAFFINITY = 5195 + SYS_SCHED_GETAFFINITY = 5196 + SYS_CACHEFLUSH = 5197 + SYS_CACHECTL = 5198 + SYS_SYSMIPS = 5199 + SYS_IO_SETUP = 5200 + SYS_IO_DESTROY = 5201 + SYS_IO_GETEVENTS = 5202 + SYS_IO_SUBMIT = 5203 + SYS_IO_CANCEL = 5204 + SYS_EXIT_GROUP = 5205 + SYS_LOOKUP_DCOOKIE = 5206 + SYS_EPOLL_CREATE = 5207 + SYS_EPOLL_CTL = 5208 + SYS_EPOLL_WAIT = 5209 + SYS_REMAP_FILE_PAGES = 5210 + SYS_RT_SIGRETURN = 5211 + SYS_SET_TID_ADDRESS = 5212 + SYS_RESTART_SYSCALL = 5213 + SYS_SEMTIMEDOP = 5214 + SYS_FADVISE64 = 5215 + SYS_TIMER_CREATE = 5216 + SYS_TIMER_SETTIME = 5217 + SYS_TIMER_GETTIME = 5218 + SYS_TIMER_GETOVERRUN = 5219 + SYS_TIMER_DELETE = 5220 + SYS_CLOCK_SETTIME = 5221 + SYS_CLOCK_GETTIME = 5222 + SYS_CLOCK_GETRES = 5223 + SYS_CLOCK_NANOSLEEP = 5224 + SYS_TGKILL = 5225 + SYS_UTIMES = 5226 + SYS_MBIND = 5227 + SYS_GET_MEMPOLICY = 5228 + SYS_SET_MEMPOLICY = 5229 + SYS_MQ_OPEN = 5230 + SYS_MQ_UNLINK = 5231 + SYS_MQ_TIMEDSEND = 5232 + SYS_MQ_TIMEDRECEIVE = 5233 + SYS_MQ_NOTIFY = 5234 + SYS_MQ_GETSETATTR = 5235 + SYS_VSERVER = 5236 + SYS_WAITID = 5237 + SYS_ADD_KEY = 5239 + SYS_REQUEST_KEY = 5240 + SYS_KEYCTL = 5241 + SYS_SET_THREAD_AREA = 5242 + SYS_INOTIFY_INIT = 5243 + SYS_INOTIFY_ADD_WATCH = 5244 + SYS_INOTIFY_RM_WATCH = 5245 + SYS_MIGRATE_PAGES = 5246 + SYS_OPENAT = 5247 + SYS_MKDIRAT = 5248 + SYS_MKNODAT = 5249 + SYS_FCHOWNAT = 5250 + SYS_FUTIMESAT = 5251 + SYS_NEWFSTATAT = 5252 + SYS_UNLINKAT = 5253 + SYS_RENAMEAT = 5254 + SYS_LINKAT = 5255 + SYS_SYMLINKAT = 5256 + SYS_READLINKAT = 5257 + SYS_FCHMODAT = 5258 + SYS_FACCESSAT = 5259 + SYS_PSELECT6 = 5260 + SYS_PPOLL = 5261 + SYS_UNSHARE = 5262 + SYS_SPLICE = 5263 + SYS_SYNC_FILE_RANGE = 5264 + SYS_TEE = 5265 + SYS_VMSPLICE = 5266 + SYS_MOVE_PAGES = 5267 + SYS_SET_ROBUST_LIST = 5268 + SYS_GET_ROBUST_LIST = 5269 + SYS_KEXEC_LOAD = 5270 + SYS_GETCPU = 5271 + SYS_EPOLL_PWAIT = 5272 + SYS_IOPRIO_SET = 5273 + SYS_IOPRIO_GET = 5274 + SYS_UTIMENSAT = 5275 + SYS_SIGNALFD = 5276 + SYS_TIMERFD = 5277 + SYS_EVENTFD = 5278 + SYS_FALLOCATE = 5279 + SYS_TIMERFD_CREATE = 5280 + SYS_TIMERFD_GETTIME = 5281 + SYS_TIMERFD_SETTIME = 5282 + SYS_SIGNALFD4 = 5283 + SYS_EVENTFD2 = 5284 + SYS_EPOLL_CREATE1 = 5285 + SYS_DUP3 = 5286 + SYS_PIPE2 = 5287 + SYS_INOTIFY_INIT1 = 5288 + SYS_PREADV = 5289 + SYS_PWRITEV = 5290 + SYS_RT_TGSIGQUEUEINFO = 5291 + SYS_PERF_EVENT_OPEN = 5292 + SYS_ACCEPT4 = 5293 + SYS_RECVMMSG = 5294 + SYS_FANOTIFY_INIT = 5295 + SYS_FANOTIFY_MARK = 5296 + SYS_PRLIMIT64 = 5297 + SYS_NAME_TO_HANDLE_AT = 5298 + SYS_OPEN_BY_HANDLE_AT = 5299 + SYS_CLOCK_ADJTIME = 5300 + SYS_SYNCFS = 5301 + SYS_SENDMMSG = 5302 + SYS_SETNS = 5303 + SYS_PROCESS_VM_READV = 5304 + SYS_PROCESS_VM_WRITEV = 5305 + SYS_KCMP = 5306 + SYS_FINIT_MODULE = 5307 + SYS_GETDENTS64 = 5308 + SYS_SCHED_SETATTR = 5309 + SYS_SCHED_GETATTR = 5310 + SYS_RENAMEAT2 = 5311 + SYS_SECCOMP = 5312 + SYS_GETRANDOM = 5313 + SYS_MEMFD_CREATE = 5314 + SYS_BPF = 5315 + SYS_EXECVEAT = 5316 + SYS_USERFAULTFD = 5317 + SYS_MEMBARRIER = 5318 + SYS_MLOCK2 = 5319 + SYS_COPY_FILE_RANGE = 5320 + SYS_PREADV2 = 5321 + SYS_PWRITEV2 = 5322 + SYS_PKEY_MPROTECT = 5323 + SYS_PKEY_ALLOC = 5324 + SYS_PKEY_FREE = 5325 + SYS_STATX = 5326 +) diff --git a/api/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go b/api/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go new file mode 100644 index 0000000..45bd3fd --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go @@ -0,0 +1,335 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mips64le,linux + +package unix + +const ( + SYS_READ = 5000 + SYS_WRITE = 5001 + SYS_OPEN = 5002 + SYS_CLOSE = 5003 + SYS_STAT = 5004 + SYS_FSTAT = 5005 + SYS_LSTAT = 5006 + SYS_POLL = 5007 + SYS_LSEEK = 5008 + SYS_MMAP = 5009 + SYS_MPROTECT = 5010 + SYS_MUNMAP = 5011 + SYS_BRK = 5012 + SYS_RT_SIGACTION = 5013 + SYS_RT_SIGPROCMASK = 5014 + SYS_IOCTL = 5015 + SYS_PREAD64 = 5016 + SYS_PWRITE64 = 5017 + SYS_READV = 5018 + SYS_WRITEV = 5019 + SYS_ACCESS = 5020 + SYS_PIPE = 5021 + SYS__NEWSELECT = 5022 + SYS_SCHED_YIELD = 5023 + SYS_MREMAP = 5024 + SYS_MSYNC = 5025 + SYS_MINCORE = 5026 + SYS_MADVISE = 5027 + SYS_SHMGET = 5028 + SYS_SHMAT = 5029 + SYS_SHMCTL = 5030 + SYS_DUP = 5031 + SYS_DUP2 = 5032 + SYS_PAUSE = 5033 + SYS_NANOSLEEP = 5034 + SYS_GETITIMER = 5035 + SYS_SETITIMER = 5036 + SYS_ALARM = 5037 + SYS_GETPID = 5038 + SYS_SENDFILE = 5039 + SYS_SOCKET = 5040 + SYS_CONNECT = 5041 + SYS_ACCEPT = 5042 + SYS_SENDTO = 5043 + SYS_RECVFROM = 5044 + SYS_SENDMSG = 5045 + SYS_RECVMSG = 5046 + SYS_SHUTDOWN = 5047 + SYS_BIND = 5048 + SYS_LISTEN = 5049 + SYS_GETSOCKNAME = 5050 + SYS_GETPEERNAME = 5051 + SYS_SOCKETPAIR = 5052 + SYS_SETSOCKOPT = 5053 + SYS_GETSOCKOPT = 5054 + SYS_CLONE = 5055 + SYS_FORK = 5056 + SYS_EXECVE = 5057 + SYS_EXIT = 5058 + SYS_WAIT4 = 5059 + SYS_KILL = 5060 + SYS_UNAME = 5061 + SYS_SEMGET = 5062 + SYS_SEMOP = 5063 + SYS_SEMCTL = 5064 + SYS_SHMDT = 5065 + SYS_MSGGET = 5066 + SYS_MSGSND = 5067 + SYS_MSGRCV = 5068 + SYS_MSGCTL = 5069 + SYS_FCNTL = 5070 + SYS_FLOCK = 5071 + SYS_FSYNC = 5072 + SYS_FDATASYNC = 5073 + SYS_TRUNCATE = 5074 + SYS_FTRUNCATE = 5075 + SYS_GETDENTS = 5076 + SYS_GETCWD = 5077 + SYS_CHDIR = 5078 + SYS_FCHDIR = 5079 + SYS_RENAME = 5080 + SYS_MKDIR = 5081 + SYS_RMDIR = 5082 + SYS_CREAT = 5083 + SYS_LINK = 5084 + SYS_UNLINK = 5085 + SYS_SYMLINK = 5086 + SYS_READLINK = 5087 + SYS_CHMOD = 5088 + SYS_FCHMOD = 5089 + SYS_CHOWN = 5090 + SYS_FCHOWN = 5091 + SYS_LCHOWN = 5092 + SYS_UMASK = 5093 + SYS_GETTIMEOFDAY = 5094 + SYS_GETRLIMIT = 5095 + SYS_GETRUSAGE = 5096 + SYS_SYSINFO = 5097 + SYS_TIMES = 5098 + SYS_PTRACE = 5099 + SYS_GETUID = 5100 + SYS_SYSLOG = 5101 + SYS_GETGID = 5102 + SYS_SETUID = 5103 + SYS_SETGID = 5104 + SYS_GETEUID = 5105 + SYS_GETEGID = 5106 + SYS_SETPGID = 5107 + SYS_GETPPID = 5108 + SYS_GETPGRP = 5109 + SYS_SETSID = 5110 + SYS_SETREUID = 5111 + SYS_SETREGID = 5112 + SYS_GETGROUPS = 5113 + SYS_SETGROUPS = 5114 + SYS_SETRESUID = 5115 + SYS_GETRESUID = 5116 + SYS_SETRESGID = 5117 + SYS_GETRESGID = 5118 + SYS_GETPGID = 5119 + SYS_SETFSUID = 5120 + SYS_SETFSGID = 5121 + SYS_GETSID = 5122 + SYS_CAPGET = 5123 + SYS_CAPSET = 5124 + SYS_RT_SIGPENDING = 5125 + SYS_RT_SIGTIMEDWAIT = 5126 + SYS_RT_SIGQUEUEINFO = 5127 + SYS_RT_SIGSUSPEND = 5128 + SYS_SIGALTSTACK = 5129 + SYS_UTIME = 5130 + SYS_MKNOD = 5131 + SYS_PERSONALITY = 5132 + SYS_USTAT = 5133 + SYS_STATFS = 5134 + SYS_FSTATFS = 5135 + SYS_SYSFS = 5136 + SYS_GETPRIORITY = 5137 + SYS_SETPRIORITY = 5138 + SYS_SCHED_SETPARAM = 5139 + SYS_SCHED_GETPARAM = 5140 + SYS_SCHED_SETSCHEDULER = 5141 + SYS_SCHED_GETSCHEDULER = 5142 + SYS_SCHED_GET_PRIORITY_MAX = 5143 + SYS_SCHED_GET_PRIORITY_MIN = 5144 + SYS_SCHED_RR_GET_INTERVAL = 5145 + SYS_MLOCK = 5146 + SYS_MUNLOCK = 5147 + SYS_MLOCKALL = 5148 + SYS_MUNLOCKALL = 5149 + SYS_VHANGUP = 5150 + SYS_PIVOT_ROOT = 5151 + SYS__SYSCTL = 5152 + SYS_PRCTL = 5153 + SYS_ADJTIMEX = 5154 + SYS_SETRLIMIT = 5155 + SYS_CHROOT = 5156 + SYS_SYNC = 5157 + SYS_ACCT = 5158 + SYS_SETTIMEOFDAY = 5159 + SYS_MOUNT = 5160 + SYS_UMOUNT2 = 5161 + SYS_SWAPON = 5162 + SYS_SWAPOFF = 5163 + SYS_REBOOT = 5164 + SYS_SETHOSTNAME = 5165 + SYS_SETDOMAINNAME = 5166 + SYS_CREATE_MODULE = 5167 + SYS_INIT_MODULE = 5168 + SYS_DELETE_MODULE = 5169 + SYS_GET_KERNEL_SYMS = 5170 + SYS_QUERY_MODULE = 5171 + SYS_QUOTACTL = 5172 + SYS_NFSSERVCTL = 5173 + SYS_GETPMSG = 5174 + SYS_PUTPMSG = 5175 + SYS_AFS_SYSCALL = 5176 + SYS_RESERVED177 = 5177 + SYS_GETTID = 5178 + SYS_READAHEAD = 5179 + SYS_SETXATTR = 5180 + SYS_LSETXATTR = 5181 + SYS_FSETXATTR = 5182 + SYS_GETXATTR = 5183 + SYS_LGETXATTR = 5184 + SYS_FGETXATTR = 5185 + SYS_LISTXATTR = 5186 + SYS_LLISTXATTR = 5187 + SYS_FLISTXATTR = 5188 + SYS_REMOVEXATTR = 5189 + SYS_LREMOVEXATTR = 5190 + SYS_FREMOVEXATTR = 5191 + SYS_TKILL = 5192 + SYS_RESERVED193 = 5193 + SYS_FUTEX = 5194 + SYS_SCHED_SETAFFINITY = 5195 + SYS_SCHED_GETAFFINITY = 5196 + SYS_CACHEFLUSH = 5197 + SYS_CACHECTL = 5198 + SYS_SYSMIPS = 5199 + SYS_IO_SETUP = 5200 + SYS_IO_DESTROY = 5201 + SYS_IO_GETEVENTS = 5202 + SYS_IO_SUBMIT = 5203 + SYS_IO_CANCEL = 5204 + SYS_EXIT_GROUP = 5205 + SYS_LOOKUP_DCOOKIE = 5206 + SYS_EPOLL_CREATE = 5207 + SYS_EPOLL_CTL = 5208 + SYS_EPOLL_WAIT = 5209 + SYS_REMAP_FILE_PAGES = 5210 + SYS_RT_SIGRETURN = 5211 + SYS_SET_TID_ADDRESS = 5212 + SYS_RESTART_SYSCALL = 5213 + SYS_SEMTIMEDOP = 5214 + SYS_FADVISE64 = 5215 + SYS_TIMER_CREATE = 5216 + SYS_TIMER_SETTIME = 5217 + SYS_TIMER_GETTIME = 5218 + SYS_TIMER_GETOVERRUN = 5219 + SYS_TIMER_DELETE = 5220 + SYS_CLOCK_SETTIME = 5221 + SYS_CLOCK_GETTIME = 5222 + SYS_CLOCK_GETRES = 5223 + SYS_CLOCK_NANOSLEEP = 5224 + SYS_TGKILL = 5225 + SYS_UTIMES = 5226 + SYS_MBIND = 5227 + SYS_GET_MEMPOLICY = 5228 + SYS_SET_MEMPOLICY = 5229 + SYS_MQ_OPEN = 5230 + SYS_MQ_UNLINK = 5231 + SYS_MQ_TIMEDSEND = 5232 + SYS_MQ_TIMEDRECEIVE = 5233 + SYS_MQ_NOTIFY = 5234 + SYS_MQ_GETSETATTR = 5235 + SYS_VSERVER = 5236 + SYS_WAITID = 5237 + SYS_ADD_KEY = 5239 + SYS_REQUEST_KEY = 5240 + SYS_KEYCTL = 5241 + SYS_SET_THREAD_AREA = 5242 + SYS_INOTIFY_INIT = 5243 + SYS_INOTIFY_ADD_WATCH = 5244 + SYS_INOTIFY_RM_WATCH = 5245 + SYS_MIGRATE_PAGES = 5246 + SYS_OPENAT = 5247 + SYS_MKDIRAT = 5248 + SYS_MKNODAT = 5249 + SYS_FCHOWNAT = 5250 + SYS_FUTIMESAT = 5251 + SYS_NEWFSTATAT = 5252 + SYS_UNLINKAT = 5253 + SYS_RENAMEAT = 5254 + SYS_LINKAT = 5255 + SYS_SYMLINKAT = 5256 + SYS_READLINKAT = 5257 + SYS_FCHMODAT = 5258 + SYS_FACCESSAT = 5259 + SYS_PSELECT6 = 5260 + SYS_PPOLL = 5261 + SYS_UNSHARE = 5262 + SYS_SPLICE = 5263 + SYS_SYNC_FILE_RANGE = 5264 + SYS_TEE = 5265 + SYS_VMSPLICE = 5266 + SYS_MOVE_PAGES = 5267 + SYS_SET_ROBUST_LIST = 5268 + SYS_GET_ROBUST_LIST = 5269 + SYS_KEXEC_LOAD = 5270 + SYS_GETCPU = 5271 + SYS_EPOLL_PWAIT = 5272 + SYS_IOPRIO_SET = 5273 + SYS_IOPRIO_GET = 5274 + SYS_UTIMENSAT = 5275 + SYS_SIGNALFD = 5276 + SYS_TIMERFD = 5277 + SYS_EVENTFD = 5278 + SYS_FALLOCATE = 5279 + SYS_TIMERFD_CREATE = 5280 + SYS_TIMERFD_GETTIME = 5281 + SYS_TIMERFD_SETTIME = 5282 + SYS_SIGNALFD4 = 5283 + SYS_EVENTFD2 = 5284 + SYS_EPOLL_CREATE1 = 5285 + SYS_DUP3 = 5286 + SYS_PIPE2 = 5287 + SYS_INOTIFY_INIT1 = 5288 + SYS_PREADV = 5289 + SYS_PWRITEV = 5290 + SYS_RT_TGSIGQUEUEINFO = 5291 + SYS_PERF_EVENT_OPEN = 5292 + SYS_ACCEPT4 = 5293 + SYS_RECVMMSG = 5294 + SYS_FANOTIFY_INIT = 5295 + SYS_FANOTIFY_MARK = 5296 + SYS_PRLIMIT64 = 5297 + SYS_NAME_TO_HANDLE_AT = 5298 + SYS_OPEN_BY_HANDLE_AT = 5299 + SYS_CLOCK_ADJTIME = 5300 + SYS_SYNCFS = 5301 + SYS_SENDMMSG = 5302 + SYS_SETNS = 5303 + SYS_PROCESS_VM_READV = 5304 + SYS_PROCESS_VM_WRITEV = 5305 + SYS_KCMP = 5306 + SYS_FINIT_MODULE = 5307 + SYS_GETDENTS64 = 5308 + SYS_SCHED_SETATTR = 5309 + SYS_SCHED_GETATTR = 5310 + SYS_RENAMEAT2 = 5311 + SYS_SECCOMP = 5312 + SYS_GETRANDOM = 5313 + SYS_MEMFD_CREATE = 5314 + SYS_BPF = 5315 + SYS_EXECVEAT = 5316 + SYS_USERFAULTFD = 5317 + SYS_MEMBARRIER = 5318 + SYS_MLOCK2 = 5319 + SYS_COPY_FILE_RANGE = 5320 + SYS_PREADV2 = 5321 + SYS_PWRITEV2 = 5322 + SYS_PKEY_MPROTECT = 5323 + SYS_PKEY_ALLOC = 5324 + SYS_PKEY_FREE = 5325 + SYS_STATX = 5326 +) diff --git a/api/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go b/api/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go new file mode 100644 index 0000000..62ccac4 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go @@ -0,0 +1,375 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mipsle,linux + +package unix + +const ( + SYS_SYSCALL = 4000 + SYS_EXIT = 4001 + SYS_FORK = 4002 + SYS_READ = 4003 + SYS_WRITE = 4004 + SYS_OPEN = 4005 + SYS_CLOSE = 4006 + SYS_WAITPID = 4007 + SYS_CREAT = 4008 + SYS_LINK = 4009 + SYS_UNLINK = 4010 + SYS_EXECVE = 4011 + SYS_CHDIR = 4012 + SYS_TIME = 4013 + SYS_MKNOD = 4014 + SYS_CHMOD = 4015 + SYS_LCHOWN = 4016 + SYS_BREAK = 4017 + SYS_UNUSED18 = 4018 + SYS_LSEEK = 4019 + SYS_GETPID = 4020 + SYS_MOUNT = 4021 + SYS_UMOUNT = 4022 + SYS_SETUID = 4023 + SYS_GETUID = 4024 + SYS_STIME = 4025 + SYS_PTRACE = 4026 + SYS_ALARM = 4027 + SYS_UNUSED28 = 4028 + SYS_PAUSE = 4029 + SYS_UTIME = 4030 + SYS_STTY = 4031 + SYS_GTTY = 4032 + SYS_ACCESS = 4033 + SYS_NICE = 4034 + SYS_FTIME = 4035 + SYS_SYNC = 4036 + SYS_KILL = 4037 + SYS_RENAME = 4038 + SYS_MKDIR = 4039 + SYS_RMDIR = 4040 + SYS_DUP = 4041 + SYS_PIPE = 4042 + SYS_TIMES = 4043 + SYS_PROF = 4044 + SYS_BRK = 4045 + SYS_SETGID = 4046 + SYS_GETGID = 4047 + SYS_SIGNAL = 4048 + SYS_GETEUID = 4049 + SYS_GETEGID = 4050 + SYS_ACCT = 4051 + SYS_UMOUNT2 = 4052 + SYS_LOCK = 4053 + SYS_IOCTL = 4054 + SYS_FCNTL = 4055 + SYS_MPX = 4056 + SYS_SETPGID = 4057 + SYS_ULIMIT = 4058 + SYS_UNUSED59 = 4059 + SYS_UMASK = 4060 + SYS_CHROOT = 4061 + SYS_USTAT = 4062 + SYS_DUP2 = 4063 + SYS_GETPPID = 4064 + SYS_GETPGRP = 4065 + SYS_SETSID = 4066 + SYS_SIGACTION = 4067 + SYS_SGETMASK = 4068 + SYS_SSETMASK = 4069 + SYS_SETREUID = 4070 + SYS_SETREGID = 4071 + SYS_SIGSUSPEND = 4072 + SYS_SIGPENDING = 4073 + SYS_SETHOSTNAME = 4074 + SYS_SETRLIMIT = 4075 + SYS_GETRLIMIT = 4076 + SYS_GETRUSAGE = 4077 + SYS_GETTIMEOFDAY = 4078 + SYS_SETTIMEOFDAY = 4079 + SYS_GETGROUPS = 4080 + SYS_SETGROUPS = 4081 + SYS_RESERVED82 = 4082 + SYS_SYMLINK = 4083 + SYS_UNUSED84 = 4084 + SYS_READLINK = 4085 + SYS_USELIB = 4086 + SYS_SWAPON = 4087 + SYS_REBOOT = 4088 + SYS_READDIR = 4089 + SYS_MMAP = 4090 + SYS_MUNMAP = 4091 + SYS_TRUNCATE = 4092 + SYS_FTRUNCATE = 4093 + SYS_FCHMOD = 4094 + SYS_FCHOWN = 4095 + SYS_GETPRIORITY = 4096 + SYS_SETPRIORITY = 4097 + SYS_PROFIL = 4098 + SYS_STATFS = 4099 + SYS_FSTATFS = 4100 + SYS_IOPERM = 4101 + SYS_SOCKETCALL = 4102 + SYS_SYSLOG = 4103 + SYS_SETITIMER = 4104 + SYS_GETITIMER = 4105 + SYS_STAT = 4106 + SYS_LSTAT = 4107 + SYS_FSTAT = 4108 + SYS_UNUSED109 = 4109 + SYS_IOPL = 4110 + SYS_VHANGUP = 4111 + SYS_IDLE = 4112 + SYS_VM86 = 4113 + SYS_WAIT4 = 4114 + SYS_SWAPOFF = 4115 + SYS_SYSINFO = 4116 + SYS_IPC = 4117 + SYS_FSYNC = 4118 + SYS_SIGRETURN = 4119 + SYS_CLONE = 4120 + SYS_SETDOMAINNAME = 4121 + SYS_UNAME = 4122 + SYS_MODIFY_LDT = 4123 + SYS_ADJTIMEX = 4124 + SYS_MPROTECT = 4125 + SYS_SIGPROCMASK = 4126 + SYS_CREATE_MODULE = 4127 + SYS_INIT_MODULE = 4128 + SYS_DELETE_MODULE = 4129 + SYS_GET_KERNEL_SYMS = 4130 + SYS_QUOTACTL = 4131 + SYS_GETPGID = 4132 + SYS_FCHDIR = 4133 + SYS_BDFLUSH = 4134 + SYS_SYSFS = 4135 + SYS_PERSONALITY = 4136 + SYS_AFS_SYSCALL = 4137 + SYS_SETFSUID = 4138 + SYS_SETFSGID = 4139 + SYS__LLSEEK = 4140 + SYS_GETDENTS = 4141 + SYS__NEWSELECT = 4142 + SYS_FLOCK = 4143 + SYS_MSYNC = 4144 + SYS_READV = 4145 + SYS_WRITEV = 4146 + SYS_CACHEFLUSH = 4147 + SYS_CACHECTL = 4148 + SYS_SYSMIPS = 4149 + SYS_UNUSED150 = 4150 + SYS_GETSID = 4151 + SYS_FDATASYNC = 4152 + SYS__SYSCTL = 4153 + SYS_MLOCK = 4154 + SYS_MUNLOCK = 4155 + SYS_MLOCKALL = 4156 + SYS_MUNLOCKALL = 4157 + SYS_SCHED_SETPARAM = 4158 + SYS_SCHED_GETPARAM = 4159 + SYS_SCHED_SETSCHEDULER = 4160 + SYS_SCHED_GETSCHEDULER = 4161 + SYS_SCHED_YIELD = 4162 + SYS_SCHED_GET_PRIORITY_MAX = 4163 + SYS_SCHED_GET_PRIORITY_MIN = 4164 + SYS_SCHED_RR_GET_INTERVAL = 4165 + SYS_NANOSLEEP = 4166 + SYS_MREMAP = 4167 + SYS_ACCEPT = 4168 + SYS_BIND = 4169 + SYS_CONNECT = 4170 + SYS_GETPEERNAME = 4171 + SYS_GETSOCKNAME = 4172 + SYS_GETSOCKOPT = 4173 + SYS_LISTEN = 4174 + SYS_RECV = 4175 + SYS_RECVFROM = 4176 + SYS_RECVMSG = 4177 + SYS_SEND = 4178 + SYS_SENDMSG = 4179 + SYS_SENDTO = 4180 + SYS_SETSOCKOPT = 4181 + SYS_SHUTDOWN = 4182 + SYS_SOCKET = 4183 + SYS_SOCKETPAIR = 4184 + SYS_SETRESUID = 4185 + SYS_GETRESUID = 4186 + SYS_QUERY_MODULE = 4187 + SYS_POLL = 4188 + SYS_NFSSERVCTL = 4189 + SYS_SETRESGID = 4190 + SYS_GETRESGID = 4191 + SYS_PRCTL = 4192 + SYS_RT_SIGRETURN = 4193 + SYS_RT_SIGACTION = 4194 + SYS_RT_SIGPROCMASK = 4195 + SYS_RT_SIGPENDING = 4196 + SYS_RT_SIGTIMEDWAIT = 4197 + SYS_RT_SIGQUEUEINFO = 4198 + SYS_RT_SIGSUSPEND = 4199 + SYS_PREAD64 = 4200 + SYS_PWRITE64 = 4201 + SYS_CHOWN = 4202 + SYS_GETCWD = 4203 + SYS_CAPGET = 4204 + SYS_CAPSET = 4205 + SYS_SIGALTSTACK = 4206 + SYS_SENDFILE = 4207 + SYS_GETPMSG = 4208 + SYS_PUTPMSG = 4209 + SYS_MMAP2 = 4210 + SYS_TRUNCATE64 = 4211 + SYS_FTRUNCATE64 = 4212 + SYS_STAT64 = 4213 + SYS_LSTAT64 = 4214 + SYS_FSTAT64 = 4215 + SYS_PIVOT_ROOT = 4216 + SYS_MINCORE = 4217 + SYS_MADVISE = 4218 + SYS_GETDENTS64 = 4219 + SYS_FCNTL64 = 4220 + SYS_RESERVED221 = 4221 + SYS_GETTID = 4222 + SYS_READAHEAD = 4223 + SYS_SETXATTR = 4224 + SYS_LSETXATTR = 4225 + SYS_FSETXATTR = 4226 + SYS_GETXATTR = 4227 + SYS_LGETXATTR = 4228 + SYS_FGETXATTR = 4229 + SYS_LISTXATTR = 4230 + SYS_LLISTXATTR = 4231 + SYS_FLISTXATTR = 4232 + SYS_REMOVEXATTR = 4233 + SYS_LREMOVEXATTR = 4234 + SYS_FREMOVEXATTR = 4235 + SYS_TKILL = 4236 + SYS_SENDFILE64 = 4237 + SYS_FUTEX = 4238 + SYS_SCHED_SETAFFINITY = 4239 + SYS_SCHED_GETAFFINITY = 4240 + SYS_IO_SETUP = 4241 + SYS_IO_DESTROY = 4242 + SYS_IO_GETEVENTS = 4243 + SYS_IO_SUBMIT = 4244 + SYS_IO_CANCEL = 4245 + SYS_EXIT_GROUP = 4246 + SYS_LOOKUP_DCOOKIE = 4247 + SYS_EPOLL_CREATE = 4248 + SYS_EPOLL_CTL = 4249 + SYS_EPOLL_WAIT = 4250 + SYS_REMAP_FILE_PAGES = 4251 + SYS_SET_TID_ADDRESS = 4252 + SYS_RESTART_SYSCALL = 4253 + SYS_FADVISE64 = 4254 + SYS_STATFS64 = 4255 + SYS_FSTATFS64 = 4256 + SYS_TIMER_CREATE = 4257 + SYS_TIMER_SETTIME = 4258 + SYS_TIMER_GETTIME = 4259 + SYS_TIMER_GETOVERRUN = 4260 + SYS_TIMER_DELETE = 4261 + SYS_CLOCK_SETTIME = 4262 + SYS_CLOCK_GETTIME = 4263 + SYS_CLOCK_GETRES = 4264 + SYS_CLOCK_NANOSLEEP = 4265 + SYS_TGKILL = 4266 + SYS_UTIMES = 4267 + SYS_MBIND = 4268 + SYS_GET_MEMPOLICY = 4269 + SYS_SET_MEMPOLICY = 4270 + SYS_MQ_OPEN = 4271 + SYS_MQ_UNLINK = 4272 + SYS_MQ_TIMEDSEND = 4273 + SYS_MQ_TIMEDRECEIVE = 4274 + SYS_MQ_NOTIFY = 4275 + SYS_MQ_GETSETATTR = 4276 + SYS_VSERVER = 4277 + SYS_WAITID = 4278 + SYS_ADD_KEY = 4280 + SYS_REQUEST_KEY = 4281 + SYS_KEYCTL = 4282 + SYS_SET_THREAD_AREA = 4283 + SYS_INOTIFY_INIT = 4284 + SYS_INOTIFY_ADD_WATCH = 4285 + SYS_INOTIFY_RM_WATCH = 4286 + SYS_MIGRATE_PAGES = 4287 + SYS_OPENAT = 4288 + SYS_MKDIRAT = 4289 + SYS_MKNODAT = 4290 + SYS_FCHOWNAT = 4291 + SYS_FUTIMESAT = 4292 + SYS_FSTATAT64 = 4293 + SYS_UNLINKAT = 4294 + SYS_RENAMEAT = 4295 + SYS_LINKAT = 4296 + SYS_SYMLINKAT = 4297 + SYS_READLINKAT = 4298 + SYS_FCHMODAT = 4299 + SYS_FACCESSAT = 4300 + SYS_PSELECT6 = 4301 + SYS_PPOLL = 4302 + SYS_UNSHARE = 4303 + SYS_SPLICE = 4304 + SYS_SYNC_FILE_RANGE = 4305 + SYS_TEE = 4306 + SYS_VMSPLICE = 4307 + SYS_MOVE_PAGES = 4308 + SYS_SET_ROBUST_LIST = 4309 + SYS_GET_ROBUST_LIST = 4310 + SYS_KEXEC_LOAD = 4311 + SYS_GETCPU = 4312 + SYS_EPOLL_PWAIT = 4313 + SYS_IOPRIO_SET = 4314 + SYS_IOPRIO_GET = 4315 + SYS_UTIMENSAT = 4316 + SYS_SIGNALFD = 4317 + SYS_TIMERFD = 4318 + SYS_EVENTFD = 4319 + SYS_FALLOCATE = 4320 + SYS_TIMERFD_CREATE = 4321 + SYS_TIMERFD_GETTIME = 4322 + SYS_TIMERFD_SETTIME = 4323 + SYS_SIGNALFD4 = 4324 + SYS_EVENTFD2 = 4325 + SYS_EPOLL_CREATE1 = 4326 + SYS_DUP3 = 4327 + SYS_PIPE2 = 4328 + SYS_INOTIFY_INIT1 = 4329 + SYS_PREADV = 4330 + SYS_PWRITEV = 4331 + SYS_RT_TGSIGQUEUEINFO = 4332 + SYS_PERF_EVENT_OPEN = 4333 + SYS_ACCEPT4 = 4334 + SYS_RECVMMSG = 4335 + SYS_FANOTIFY_INIT = 4336 + SYS_FANOTIFY_MARK = 4337 + SYS_PRLIMIT64 = 4338 + SYS_NAME_TO_HANDLE_AT = 4339 + SYS_OPEN_BY_HANDLE_AT = 4340 + SYS_CLOCK_ADJTIME = 4341 + SYS_SYNCFS = 4342 + SYS_SENDMMSG = 4343 + SYS_SETNS = 4344 + SYS_PROCESS_VM_READV = 4345 + SYS_PROCESS_VM_WRITEV = 4346 + SYS_KCMP = 4347 + SYS_FINIT_MODULE = 4348 + SYS_SCHED_SETATTR = 4349 + SYS_SCHED_GETATTR = 4350 + SYS_RENAMEAT2 = 4351 + SYS_SECCOMP = 4352 + SYS_GETRANDOM = 4353 + SYS_MEMFD_CREATE = 4354 + SYS_BPF = 4355 + SYS_EXECVEAT = 4356 + SYS_USERFAULTFD = 4357 + SYS_MEMBARRIER = 4358 + SYS_MLOCK2 = 4359 + SYS_COPY_FILE_RANGE = 4360 + SYS_PREADV2 = 4361 + SYS_PWRITEV2 = 4362 + SYS_PKEY_MPROTECT = 4363 + SYS_PKEY_ALLOC = 4364 + SYS_PKEY_FREE = 4365 + SYS_STATX = 4366 +) diff --git a/api/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go b/api/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go new file mode 100644 index 0000000..384d49b --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go @@ -0,0 +1,373 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build ppc64,linux + +package unix + +const ( + SYS_RESTART_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_WAITPID = 7 + SYS_CREAT = 8 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_EXECVE = 11 + SYS_CHDIR = 12 + SYS_TIME = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_LCHOWN = 16 + SYS_BREAK = 17 + SYS_OLDSTAT = 18 + SYS_LSEEK = 19 + SYS_GETPID = 20 + SYS_MOUNT = 21 + SYS_UMOUNT = 22 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_STIME = 25 + SYS_PTRACE = 26 + SYS_ALARM = 27 + SYS_OLDFSTAT = 28 + SYS_PAUSE = 29 + SYS_UTIME = 30 + SYS_STTY = 31 + SYS_GTTY = 32 + SYS_ACCESS = 33 + SYS_NICE = 34 + SYS_FTIME = 35 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_RENAME = 38 + SYS_MKDIR = 39 + SYS_RMDIR = 40 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_TIMES = 43 + SYS_PROF = 44 + SYS_BRK = 45 + SYS_SETGID = 46 + SYS_GETGID = 47 + SYS_SIGNAL = 48 + SYS_GETEUID = 49 + SYS_GETEGID = 50 + SYS_ACCT = 51 + SYS_UMOUNT2 = 52 + SYS_LOCK = 53 + SYS_IOCTL = 54 + SYS_FCNTL = 55 + SYS_MPX = 56 + SYS_SETPGID = 57 + SYS_ULIMIT = 58 + SYS_OLDOLDUNAME = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_USTAT = 62 + SYS_DUP2 = 63 + SYS_GETPPID = 64 + SYS_GETPGRP = 65 + SYS_SETSID = 66 + SYS_SIGACTION = 67 + SYS_SGETMASK = 68 + SYS_SSETMASK = 69 + SYS_SETREUID = 70 + SYS_SETREGID = 71 + SYS_SIGSUSPEND = 72 + SYS_SIGPENDING = 73 + SYS_SETHOSTNAME = 74 + SYS_SETRLIMIT = 75 + SYS_GETRLIMIT = 76 + SYS_GETRUSAGE = 77 + SYS_GETTIMEOFDAY = 78 + SYS_SETTIMEOFDAY = 79 + SYS_GETGROUPS = 80 + SYS_SETGROUPS = 81 + SYS_SELECT = 82 + SYS_SYMLINK = 83 + SYS_OLDLSTAT = 84 + SYS_READLINK = 85 + SYS_USELIB = 86 + SYS_SWAPON = 87 + SYS_REBOOT = 88 + SYS_READDIR = 89 + SYS_MMAP = 90 + SYS_MUNMAP = 91 + SYS_TRUNCATE = 92 + SYS_FTRUNCATE = 93 + SYS_FCHMOD = 94 + SYS_FCHOWN = 95 + SYS_GETPRIORITY = 96 + SYS_SETPRIORITY = 97 + SYS_PROFIL = 98 + SYS_STATFS = 99 + SYS_FSTATFS = 100 + SYS_IOPERM = 101 + SYS_SOCKETCALL = 102 + SYS_SYSLOG = 103 + SYS_SETITIMER = 104 + SYS_GETITIMER = 105 + SYS_STAT = 106 + SYS_LSTAT = 107 + SYS_FSTAT = 108 + SYS_OLDUNAME = 109 + SYS_IOPL = 110 + SYS_VHANGUP = 111 + SYS_IDLE = 112 + SYS_VM86 = 113 + SYS_WAIT4 = 114 + SYS_SWAPOFF = 115 + SYS_SYSINFO = 116 + SYS_IPC = 117 + SYS_FSYNC = 118 + SYS_SIGRETURN = 119 + SYS_CLONE = 120 + SYS_SETDOMAINNAME = 121 + SYS_UNAME = 122 + SYS_MODIFY_LDT = 123 + SYS_ADJTIMEX = 124 + SYS_MPROTECT = 125 + SYS_SIGPROCMASK = 126 + SYS_CREATE_MODULE = 127 + SYS_INIT_MODULE = 128 + SYS_DELETE_MODULE = 129 + SYS_GET_KERNEL_SYMS = 130 + SYS_QUOTACTL = 131 + SYS_GETPGID = 132 + SYS_FCHDIR = 133 + SYS_BDFLUSH = 134 + SYS_SYSFS = 135 + SYS_PERSONALITY = 136 + SYS_AFS_SYSCALL = 137 + SYS_SETFSUID = 138 + SYS_SETFSGID = 139 + SYS__LLSEEK = 140 + SYS_GETDENTS = 141 + SYS__NEWSELECT = 142 + SYS_FLOCK = 143 + SYS_MSYNC = 144 + SYS_READV = 145 + SYS_WRITEV = 146 + SYS_GETSID = 147 + SYS_FDATASYNC = 148 + SYS__SYSCTL = 149 + SYS_MLOCK = 150 + SYS_MUNLOCK = 151 + SYS_MLOCKALL = 152 + SYS_MUNLOCKALL = 153 + SYS_SCHED_SETPARAM = 154 + SYS_SCHED_GETPARAM = 155 + SYS_SCHED_SETSCHEDULER = 156 + SYS_SCHED_GETSCHEDULER = 157 + SYS_SCHED_YIELD = 158 + SYS_SCHED_GET_PRIORITY_MAX = 159 + SYS_SCHED_GET_PRIORITY_MIN = 160 + SYS_SCHED_RR_GET_INTERVAL = 161 + SYS_NANOSLEEP = 162 + SYS_MREMAP = 163 + SYS_SETRESUID = 164 + SYS_GETRESUID = 165 + SYS_QUERY_MODULE = 166 + SYS_POLL = 167 + SYS_NFSSERVCTL = 168 + SYS_SETRESGID = 169 + SYS_GETRESGID = 170 + SYS_PRCTL = 171 + SYS_RT_SIGRETURN = 172 + SYS_RT_SIGACTION = 173 + SYS_RT_SIGPROCMASK = 174 + SYS_RT_SIGPENDING = 175 + SYS_RT_SIGTIMEDWAIT = 176 + SYS_RT_SIGQUEUEINFO = 177 + SYS_RT_SIGSUSPEND = 178 + SYS_PREAD64 = 179 + SYS_PWRITE64 = 180 + SYS_CHOWN = 181 + SYS_GETCWD = 182 + SYS_CAPGET = 183 + SYS_CAPSET = 184 + SYS_SIGALTSTACK = 185 + SYS_SENDFILE = 186 + SYS_GETPMSG = 187 + SYS_PUTPMSG = 188 + SYS_VFORK = 189 + SYS_UGETRLIMIT = 190 + SYS_READAHEAD = 191 + SYS_PCICONFIG_READ = 198 + SYS_PCICONFIG_WRITE = 199 + SYS_PCICONFIG_IOBASE = 200 + SYS_MULTIPLEXER = 201 + SYS_GETDENTS64 = 202 + SYS_PIVOT_ROOT = 203 + SYS_MADVISE = 205 + SYS_MINCORE = 206 + SYS_GETTID = 207 + SYS_TKILL = 208 + SYS_SETXATTR = 209 + SYS_LSETXATTR = 210 + SYS_FSETXATTR = 211 + SYS_GETXATTR = 212 + SYS_LGETXATTR = 213 + SYS_FGETXATTR = 214 + SYS_LISTXATTR = 215 + SYS_LLISTXATTR = 216 + SYS_FLISTXATTR = 217 + SYS_REMOVEXATTR = 218 + SYS_LREMOVEXATTR = 219 + SYS_FREMOVEXATTR = 220 + SYS_FUTEX = 221 + SYS_SCHED_SETAFFINITY = 222 + SYS_SCHED_GETAFFINITY = 223 + SYS_TUXCALL = 225 + SYS_IO_SETUP = 227 + SYS_IO_DESTROY = 228 + SYS_IO_GETEVENTS = 229 + SYS_IO_SUBMIT = 230 + SYS_IO_CANCEL = 231 + SYS_SET_TID_ADDRESS = 232 + SYS_FADVISE64 = 233 + SYS_EXIT_GROUP = 234 + SYS_LOOKUP_DCOOKIE = 235 + SYS_EPOLL_CREATE = 236 + SYS_EPOLL_CTL = 237 + SYS_EPOLL_WAIT = 238 + SYS_REMAP_FILE_PAGES = 239 + SYS_TIMER_CREATE = 240 + SYS_TIMER_SETTIME = 241 + SYS_TIMER_GETTIME = 242 + SYS_TIMER_GETOVERRUN = 243 + SYS_TIMER_DELETE = 244 + SYS_CLOCK_SETTIME = 245 + SYS_CLOCK_GETTIME = 246 + SYS_CLOCK_GETRES = 247 + SYS_CLOCK_NANOSLEEP = 248 + SYS_SWAPCONTEXT = 249 + SYS_TGKILL = 250 + SYS_UTIMES = 251 + SYS_STATFS64 = 252 + SYS_FSTATFS64 = 253 + SYS_RTAS = 255 + SYS_SYS_DEBUG_SETCONTEXT = 256 + SYS_MIGRATE_PAGES = 258 + SYS_MBIND = 259 + SYS_GET_MEMPOLICY = 260 + SYS_SET_MEMPOLICY = 261 + SYS_MQ_OPEN = 262 + SYS_MQ_UNLINK = 263 + SYS_MQ_TIMEDSEND = 264 + SYS_MQ_TIMEDRECEIVE = 265 + SYS_MQ_NOTIFY = 266 + SYS_MQ_GETSETATTR = 267 + SYS_KEXEC_LOAD = 268 + SYS_ADD_KEY = 269 + SYS_REQUEST_KEY = 270 + SYS_KEYCTL = 271 + SYS_WAITID = 272 + SYS_IOPRIO_SET = 273 + SYS_IOPRIO_GET = 274 + SYS_INOTIFY_INIT = 275 + SYS_INOTIFY_ADD_WATCH = 276 + SYS_INOTIFY_RM_WATCH = 277 + SYS_SPU_RUN = 278 + SYS_SPU_CREATE = 279 + SYS_PSELECT6 = 280 + SYS_PPOLL = 281 + SYS_UNSHARE = 282 + SYS_SPLICE = 283 + SYS_TEE = 284 + SYS_VMSPLICE = 285 + SYS_OPENAT = 286 + SYS_MKDIRAT = 287 + SYS_MKNODAT = 288 + SYS_FCHOWNAT = 289 + SYS_FUTIMESAT = 290 + SYS_NEWFSTATAT = 291 + SYS_UNLINKAT = 292 + SYS_RENAMEAT = 293 + SYS_LINKAT = 294 + SYS_SYMLINKAT = 295 + SYS_READLINKAT = 296 + SYS_FCHMODAT = 297 + SYS_FACCESSAT = 298 + SYS_GET_ROBUST_LIST = 299 + SYS_SET_ROBUST_LIST = 300 + SYS_MOVE_PAGES = 301 + SYS_GETCPU = 302 + SYS_EPOLL_PWAIT = 303 + SYS_UTIMENSAT = 304 + SYS_SIGNALFD = 305 + SYS_TIMERFD_CREATE = 306 + SYS_EVENTFD = 307 + SYS_SYNC_FILE_RANGE2 = 308 + SYS_FALLOCATE = 309 + SYS_SUBPAGE_PROT = 310 + SYS_TIMERFD_SETTIME = 311 + SYS_TIMERFD_GETTIME = 312 + SYS_SIGNALFD4 = 313 + SYS_EVENTFD2 = 314 + SYS_EPOLL_CREATE1 = 315 + SYS_DUP3 = 316 + SYS_PIPE2 = 317 + SYS_INOTIFY_INIT1 = 318 + SYS_PERF_EVENT_OPEN = 319 + SYS_PREADV = 320 + SYS_PWRITEV = 321 + SYS_RT_TGSIGQUEUEINFO = 322 + SYS_FANOTIFY_INIT = 323 + SYS_FANOTIFY_MARK = 324 + SYS_PRLIMIT64 = 325 + SYS_SOCKET = 326 + SYS_BIND = 327 + SYS_CONNECT = 328 + SYS_LISTEN = 329 + SYS_ACCEPT = 330 + SYS_GETSOCKNAME = 331 + SYS_GETPEERNAME = 332 + SYS_SOCKETPAIR = 333 + SYS_SEND = 334 + SYS_SENDTO = 335 + SYS_RECV = 336 + SYS_RECVFROM = 337 + SYS_SHUTDOWN = 338 + SYS_SETSOCKOPT = 339 + SYS_GETSOCKOPT = 340 + SYS_SENDMSG = 341 + SYS_RECVMSG = 342 + SYS_RECVMMSG = 343 + SYS_ACCEPT4 = 344 + SYS_NAME_TO_HANDLE_AT = 345 + SYS_OPEN_BY_HANDLE_AT = 346 + SYS_CLOCK_ADJTIME = 347 + SYS_SYNCFS = 348 + SYS_SENDMMSG = 349 + SYS_SETNS = 350 + SYS_PROCESS_VM_READV = 351 + SYS_PROCESS_VM_WRITEV = 352 + SYS_FINIT_MODULE = 353 + SYS_KCMP = 354 + SYS_SCHED_SETATTR = 355 + SYS_SCHED_GETATTR = 356 + SYS_RENAMEAT2 = 357 + SYS_SECCOMP = 358 + SYS_GETRANDOM = 359 + SYS_MEMFD_CREATE = 360 + SYS_BPF = 361 + SYS_EXECVEAT = 362 + SYS_SWITCH_ENDIAN = 363 + SYS_USERFAULTFD = 364 + SYS_MEMBARRIER = 365 + SYS_MLOCK2 = 378 + SYS_COPY_FILE_RANGE = 379 + SYS_PREADV2 = 380 + SYS_PWRITEV2 = 381 + SYS_KEXEC_FILE_LOAD = 382 + SYS_STATX = 383 + SYS_PKEY_ALLOC = 384 + SYS_PKEY_FREE = 385 + SYS_PKEY_MPROTECT = 386 +) diff --git a/api/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go b/api/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go new file mode 100644 index 0000000..9623248 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go @@ -0,0 +1,373 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build ppc64le,linux + +package unix + +const ( + SYS_RESTART_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_WAITPID = 7 + SYS_CREAT = 8 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_EXECVE = 11 + SYS_CHDIR = 12 + SYS_TIME = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_LCHOWN = 16 + SYS_BREAK = 17 + SYS_OLDSTAT = 18 + SYS_LSEEK = 19 + SYS_GETPID = 20 + SYS_MOUNT = 21 + SYS_UMOUNT = 22 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_STIME = 25 + SYS_PTRACE = 26 + SYS_ALARM = 27 + SYS_OLDFSTAT = 28 + SYS_PAUSE = 29 + SYS_UTIME = 30 + SYS_STTY = 31 + SYS_GTTY = 32 + SYS_ACCESS = 33 + SYS_NICE = 34 + SYS_FTIME = 35 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_RENAME = 38 + SYS_MKDIR = 39 + SYS_RMDIR = 40 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_TIMES = 43 + SYS_PROF = 44 + SYS_BRK = 45 + SYS_SETGID = 46 + SYS_GETGID = 47 + SYS_SIGNAL = 48 + SYS_GETEUID = 49 + SYS_GETEGID = 50 + SYS_ACCT = 51 + SYS_UMOUNT2 = 52 + SYS_LOCK = 53 + SYS_IOCTL = 54 + SYS_FCNTL = 55 + SYS_MPX = 56 + SYS_SETPGID = 57 + SYS_ULIMIT = 58 + SYS_OLDOLDUNAME = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_USTAT = 62 + SYS_DUP2 = 63 + SYS_GETPPID = 64 + SYS_GETPGRP = 65 + SYS_SETSID = 66 + SYS_SIGACTION = 67 + SYS_SGETMASK = 68 + SYS_SSETMASK = 69 + SYS_SETREUID = 70 + SYS_SETREGID = 71 + SYS_SIGSUSPEND = 72 + SYS_SIGPENDING = 73 + SYS_SETHOSTNAME = 74 + SYS_SETRLIMIT = 75 + SYS_GETRLIMIT = 76 + SYS_GETRUSAGE = 77 + SYS_GETTIMEOFDAY = 78 + SYS_SETTIMEOFDAY = 79 + SYS_GETGROUPS = 80 + SYS_SETGROUPS = 81 + SYS_SELECT = 82 + SYS_SYMLINK = 83 + SYS_OLDLSTAT = 84 + SYS_READLINK = 85 + SYS_USELIB = 86 + SYS_SWAPON = 87 + SYS_REBOOT = 88 + SYS_READDIR = 89 + SYS_MMAP = 90 + SYS_MUNMAP = 91 + SYS_TRUNCATE = 92 + SYS_FTRUNCATE = 93 + SYS_FCHMOD = 94 + SYS_FCHOWN = 95 + SYS_GETPRIORITY = 96 + SYS_SETPRIORITY = 97 + SYS_PROFIL = 98 + SYS_STATFS = 99 + SYS_FSTATFS = 100 + SYS_IOPERM = 101 + SYS_SOCKETCALL = 102 + SYS_SYSLOG = 103 + SYS_SETITIMER = 104 + SYS_GETITIMER = 105 + SYS_STAT = 106 + SYS_LSTAT = 107 + SYS_FSTAT = 108 + SYS_OLDUNAME = 109 + SYS_IOPL = 110 + SYS_VHANGUP = 111 + SYS_IDLE = 112 + SYS_VM86 = 113 + SYS_WAIT4 = 114 + SYS_SWAPOFF = 115 + SYS_SYSINFO = 116 + SYS_IPC = 117 + SYS_FSYNC = 118 + SYS_SIGRETURN = 119 + SYS_CLONE = 120 + SYS_SETDOMAINNAME = 121 + SYS_UNAME = 122 + SYS_MODIFY_LDT = 123 + SYS_ADJTIMEX = 124 + SYS_MPROTECT = 125 + SYS_SIGPROCMASK = 126 + SYS_CREATE_MODULE = 127 + SYS_INIT_MODULE = 128 + SYS_DELETE_MODULE = 129 + SYS_GET_KERNEL_SYMS = 130 + SYS_QUOTACTL = 131 + SYS_GETPGID = 132 + SYS_FCHDIR = 133 + SYS_BDFLUSH = 134 + SYS_SYSFS = 135 + SYS_PERSONALITY = 136 + SYS_AFS_SYSCALL = 137 + SYS_SETFSUID = 138 + SYS_SETFSGID = 139 + SYS__LLSEEK = 140 + SYS_GETDENTS = 141 + SYS__NEWSELECT = 142 + SYS_FLOCK = 143 + SYS_MSYNC = 144 + SYS_READV = 145 + SYS_WRITEV = 146 + SYS_GETSID = 147 + SYS_FDATASYNC = 148 + SYS__SYSCTL = 149 + SYS_MLOCK = 150 + SYS_MUNLOCK = 151 + SYS_MLOCKALL = 152 + SYS_MUNLOCKALL = 153 + SYS_SCHED_SETPARAM = 154 + SYS_SCHED_GETPARAM = 155 + SYS_SCHED_SETSCHEDULER = 156 + SYS_SCHED_GETSCHEDULER = 157 + SYS_SCHED_YIELD = 158 + SYS_SCHED_GET_PRIORITY_MAX = 159 + SYS_SCHED_GET_PRIORITY_MIN = 160 + SYS_SCHED_RR_GET_INTERVAL = 161 + SYS_NANOSLEEP = 162 + SYS_MREMAP = 163 + SYS_SETRESUID = 164 + SYS_GETRESUID = 165 + SYS_QUERY_MODULE = 166 + SYS_POLL = 167 + SYS_NFSSERVCTL = 168 + SYS_SETRESGID = 169 + SYS_GETRESGID = 170 + SYS_PRCTL = 171 + SYS_RT_SIGRETURN = 172 + SYS_RT_SIGACTION = 173 + SYS_RT_SIGPROCMASK = 174 + SYS_RT_SIGPENDING = 175 + SYS_RT_SIGTIMEDWAIT = 176 + SYS_RT_SIGQUEUEINFO = 177 + SYS_RT_SIGSUSPEND = 178 + SYS_PREAD64 = 179 + SYS_PWRITE64 = 180 + SYS_CHOWN = 181 + SYS_GETCWD = 182 + SYS_CAPGET = 183 + SYS_CAPSET = 184 + SYS_SIGALTSTACK = 185 + SYS_SENDFILE = 186 + SYS_GETPMSG = 187 + SYS_PUTPMSG = 188 + SYS_VFORK = 189 + SYS_UGETRLIMIT = 190 + SYS_READAHEAD = 191 + SYS_PCICONFIG_READ = 198 + SYS_PCICONFIG_WRITE = 199 + SYS_PCICONFIG_IOBASE = 200 + SYS_MULTIPLEXER = 201 + SYS_GETDENTS64 = 202 + SYS_PIVOT_ROOT = 203 + SYS_MADVISE = 205 + SYS_MINCORE = 206 + SYS_GETTID = 207 + SYS_TKILL = 208 + SYS_SETXATTR = 209 + SYS_LSETXATTR = 210 + SYS_FSETXATTR = 211 + SYS_GETXATTR = 212 + SYS_LGETXATTR = 213 + SYS_FGETXATTR = 214 + SYS_LISTXATTR = 215 + SYS_LLISTXATTR = 216 + SYS_FLISTXATTR = 217 + SYS_REMOVEXATTR = 218 + SYS_LREMOVEXATTR = 219 + SYS_FREMOVEXATTR = 220 + SYS_FUTEX = 221 + SYS_SCHED_SETAFFINITY = 222 + SYS_SCHED_GETAFFINITY = 223 + SYS_TUXCALL = 225 + SYS_IO_SETUP = 227 + SYS_IO_DESTROY = 228 + SYS_IO_GETEVENTS = 229 + SYS_IO_SUBMIT = 230 + SYS_IO_CANCEL = 231 + SYS_SET_TID_ADDRESS = 232 + SYS_FADVISE64 = 233 + SYS_EXIT_GROUP = 234 + SYS_LOOKUP_DCOOKIE = 235 + SYS_EPOLL_CREATE = 236 + SYS_EPOLL_CTL = 237 + SYS_EPOLL_WAIT = 238 + SYS_REMAP_FILE_PAGES = 239 + SYS_TIMER_CREATE = 240 + SYS_TIMER_SETTIME = 241 + SYS_TIMER_GETTIME = 242 + SYS_TIMER_GETOVERRUN = 243 + SYS_TIMER_DELETE = 244 + SYS_CLOCK_SETTIME = 245 + SYS_CLOCK_GETTIME = 246 + SYS_CLOCK_GETRES = 247 + SYS_CLOCK_NANOSLEEP = 248 + SYS_SWAPCONTEXT = 249 + SYS_TGKILL = 250 + SYS_UTIMES = 251 + SYS_STATFS64 = 252 + SYS_FSTATFS64 = 253 + SYS_RTAS = 255 + SYS_SYS_DEBUG_SETCONTEXT = 256 + SYS_MIGRATE_PAGES = 258 + SYS_MBIND = 259 + SYS_GET_MEMPOLICY = 260 + SYS_SET_MEMPOLICY = 261 + SYS_MQ_OPEN = 262 + SYS_MQ_UNLINK = 263 + SYS_MQ_TIMEDSEND = 264 + SYS_MQ_TIMEDRECEIVE = 265 + SYS_MQ_NOTIFY = 266 + SYS_MQ_GETSETATTR = 267 + SYS_KEXEC_LOAD = 268 + SYS_ADD_KEY = 269 + SYS_REQUEST_KEY = 270 + SYS_KEYCTL = 271 + SYS_WAITID = 272 + SYS_IOPRIO_SET = 273 + SYS_IOPRIO_GET = 274 + SYS_INOTIFY_INIT = 275 + SYS_INOTIFY_ADD_WATCH = 276 + SYS_INOTIFY_RM_WATCH = 277 + SYS_SPU_RUN = 278 + SYS_SPU_CREATE = 279 + SYS_PSELECT6 = 280 + SYS_PPOLL = 281 + SYS_UNSHARE = 282 + SYS_SPLICE = 283 + SYS_TEE = 284 + SYS_VMSPLICE = 285 + SYS_OPENAT = 286 + SYS_MKDIRAT = 287 + SYS_MKNODAT = 288 + SYS_FCHOWNAT = 289 + SYS_FUTIMESAT = 290 + SYS_NEWFSTATAT = 291 + SYS_UNLINKAT = 292 + SYS_RENAMEAT = 293 + SYS_LINKAT = 294 + SYS_SYMLINKAT = 295 + SYS_READLINKAT = 296 + SYS_FCHMODAT = 297 + SYS_FACCESSAT = 298 + SYS_GET_ROBUST_LIST = 299 + SYS_SET_ROBUST_LIST = 300 + SYS_MOVE_PAGES = 301 + SYS_GETCPU = 302 + SYS_EPOLL_PWAIT = 303 + SYS_UTIMENSAT = 304 + SYS_SIGNALFD = 305 + SYS_TIMERFD_CREATE = 306 + SYS_EVENTFD = 307 + SYS_SYNC_FILE_RANGE2 = 308 + SYS_FALLOCATE = 309 + SYS_SUBPAGE_PROT = 310 + SYS_TIMERFD_SETTIME = 311 + SYS_TIMERFD_GETTIME = 312 + SYS_SIGNALFD4 = 313 + SYS_EVENTFD2 = 314 + SYS_EPOLL_CREATE1 = 315 + SYS_DUP3 = 316 + SYS_PIPE2 = 317 + SYS_INOTIFY_INIT1 = 318 + SYS_PERF_EVENT_OPEN = 319 + SYS_PREADV = 320 + SYS_PWRITEV = 321 + SYS_RT_TGSIGQUEUEINFO = 322 + SYS_FANOTIFY_INIT = 323 + SYS_FANOTIFY_MARK = 324 + SYS_PRLIMIT64 = 325 + SYS_SOCKET = 326 + SYS_BIND = 327 + SYS_CONNECT = 328 + SYS_LISTEN = 329 + SYS_ACCEPT = 330 + SYS_GETSOCKNAME = 331 + SYS_GETPEERNAME = 332 + SYS_SOCKETPAIR = 333 + SYS_SEND = 334 + SYS_SENDTO = 335 + SYS_RECV = 336 + SYS_RECVFROM = 337 + SYS_SHUTDOWN = 338 + SYS_SETSOCKOPT = 339 + SYS_GETSOCKOPT = 340 + SYS_SENDMSG = 341 + SYS_RECVMSG = 342 + SYS_RECVMMSG = 343 + SYS_ACCEPT4 = 344 + SYS_NAME_TO_HANDLE_AT = 345 + SYS_OPEN_BY_HANDLE_AT = 346 + SYS_CLOCK_ADJTIME = 347 + SYS_SYNCFS = 348 + SYS_SENDMMSG = 349 + SYS_SETNS = 350 + SYS_PROCESS_VM_READV = 351 + SYS_PROCESS_VM_WRITEV = 352 + SYS_FINIT_MODULE = 353 + SYS_KCMP = 354 + SYS_SCHED_SETATTR = 355 + SYS_SCHED_GETATTR = 356 + SYS_RENAMEAT2 = 357 + SYS_SECCOMP = 358 + SYS_GETRANDOM = 359 + SYS_MEMFD_CREATE = 360 + SYS_BPF = 361 + SYS_EXECVEAT = 362 + SYS_SWITCH_ENDIAN = 363 + SYS_USERFAULTFD = 364 + SYS_MEMBARRIER = 365 + SYS_MLOCK2 = 378 + SYS_COPY_FILE_RANGE = 379 + SYS_PREADV2 = 380 + SYS_PWRITEV2 = 381 + SYS_KEXEC_FILE_LOAD = 382 + SYS_STATX = 383 + SYS_PKEY_ALLOC = 384 + SYS_PKEY_FREE = 385 + SYS_PKEY_MPROTECT = 386 +) diff --git a/api/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go b/api/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go new file mode 100644 index 0000000..ed92409 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go @@ -0,0 +1,334 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include -fsigned-char /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build s390x,linux + +package unix + +const ( + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_RESTART_SYSCALL = 7 + SYS_CREAT = 8 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_EXECVE = 11 + SYS_CHDIR = 12 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_LSEEK = 19 + SYS_GETPID = 20 + SYS_MOUNT = 21 + SYS_UMOUNT = 22 + SYS_PTRACE = 26 + SYS_ALARM = 27 + SYS_PAUSE = 29 + SYS_UTIME = 30 + SYS_ACCESS = 33 + SYS_NICE = 34 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_RENAME = 38 + SYS_MKDIR = 39 + SYS_RMDIR = 40 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_TIMES = 43 + SYS_BRK = 45 + SYS_SIGNAL = 48 + SYS_ACCT = 51 + SYS_UMOUNT2 = 52 + SYS_IOCTL = 54 + SYS_FCNTL = 55 + SYS_SETPGID = 57 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_USTAT = 62 + SYS_DUP2 = 63 + SYS_GETPPID = 64 + SYS_GETPGRP = 65 + SYS_SETSID = 66 + SYS_SIGACTION = 67 + SYS_SIGSUSPEND = 72 + SYS_SIGPENDING = 73 + SYS_SETHOSTNAME = 74 + SYS_SETRLIMIT = 75 + SYS_GETRUSAGE = 77 + SYS_GETTIMEOFDAY = 78 + SYS_SETTIMEOFDAY = 79 + SYS_SYMLINK = 83 + SYS_READLINK = 85 + SYS_USELIB = 86 + SYS_SWAPON = 87 + SYS_REBOOT = 88 + SYS_READDIR = 89 + SYS_MMAP = 90 + SYS_MUNMAP = 91 + SYS_TRUNCATE = 92 + SYS_FTRUNCATE = 93 + SYS_FCHMOD = 94 + SYS_GETPRIORITY = 96 + SYS_SETPRIORITY = 97 + SYS_STATFS = 99 + SYS_FSTATFS = 100 + SYS_SOCKETCALL = 102 + SYS_SYSLOG = 103 + SYS_SETITIMER = 104 + SYS_GETITIMER = 105 + SYS_STAT = 106 + SYS_LSTAT = 107 + SYS_FSTAT = 108 + SYS_LOOKUP_DCOOKIE = 110 + SYS_VHANGUP = 111 + SYS_IDLE = 112 + SYS_WAIT4 = 114 + SYS_SWAPOFF = 115 + SYS_SYSINFO = 116 + SYS_IPC = 117 + SYS_FSYNC = 118 + SYS_SIGRETURN = 119 + SYS_CLONE = 120 + SYS_SETDOMAINNAME = 121 + SYS_UNAME = 122 + SYS_ADJTIMEX = 124 + SYS_MPROTECT = 125 + SYS_SIGPROCMASK = 126 + SYS_CREATE_MODULE = 127 + SYS_INIT_MODULE = 128 + SYS_DELETE_MODULE = 129 + SYS_GET_KERNEL_SYMS = 130 + SYS_QUOTACTL = 131 + SYS_GETPGID = 132 + SYS_FCHDIR = 133 + SYS_BDFLUSH = 134 + SYS_SYSFS = 135 + SYS_PERSONALITY = 136 + SYS_AFS_SYSCALL = 137 + SYS_GETDENTS = 141 + SYS_SELECT = 142 + SYS_FLOCK = 143 + SYS_MSYNC = 144 + SYS_READV = 145 + SYS_WRITEV = 146 + SYS_GETSID = 147 + SYS_FDATASYNC = 148 + SYS__SYSCTL = 149 + SYS_MLOCK = 150 + SYS_MUNLOCK = 151 + SYS_MLOCKALL = 152 + SYS_MUNLOCKALL = 153 + SYS_SCHED_SETPARAM = 154 + SYS_SCHED_GETPARAM = 155 + SYS_SCHED_SETSCHEDULER = 156 + SYS_SCHED_GETSCHEDULER = 157 + SYS_SCHED_YIELD = 158 + SYS_SCHED_GET_PRIORITY_MAX = 159 + SYS_SCHED_GET_PRIORITY_MIN = 160 + SYS_SCHED_RR_GET_INTERVAL = 161 + SYS_NANOSLEEP = 162 + SYS_MREMAP = 163 + SYS_QUERY_MODULE = 167 + SYS_POLL = 168 + SYS_NFSSERVCTL = 169 + SYS_PRCTL = 172 + SYS_RT_SIGRETURN = 173 + SYS_RT_SIGACTION = 174 + SYS_RT_SIGPROCMASK = 175 + SYS_RT_SIGPENDING = 176 + SYS_RT_SIGTIMEDWAIT = 177 + SYS_RT_SIGQUEUEINFO = 178 + SYS_RT_SIGSUSPEND = 179 + SYS_PREAD64 = 180 + SYS_PWRITE64 = 181 + SYS_GETCWD = 183 + SYS_CAPGET = 184 + SYS_CAPSET = 185 + SYS_SIGALTSTACK = 186 + SYS_SENDFILE = 187 + SYS_GETPMSG = 188 + SYS_PUTPMSG = 189 + SYS_VFORK = 190 + SYS_GETRLIMIT = 191 + SYS_LCHOWN = 198 + SYS_GETUID = 199 + SYS_GETGID = 200 + SYS_GETEUID = 201 + SYS_GETEGID = 202 + SYS_SETREUID = 203 + SYS_SETREGID = 204 + SYS_GETGROUPS = 205 + SYS_SETGROUPS = 206 + SYS_FCHOWN = 207 + SYS_SETRESUID = 208 + SYS_GETRESUID = 209 + SYS_SETRESGID = 210 + SYS_GETRESGID = 211 + SYS_CHOWN = 212 + SYS_SETUID = 213 + SYS_SETGID = 214 + SYS_SETFSUID = 215 + SYS_SETFSGID = 216 + SYS_PIVOT_ROOT = 217 + SYS_MINCORE = 218 + SYS_MADVISE = 219 + SYS_GETDENTS64 = 220 + SYS_READAHEAD = 222 + SYS_SETXATTR = 224 + SYS_LSETXATTR = 225 + SYS_FSETXATTR = 226 + SYS_GETXATTR = 227 + SYS_LGETXATTR = 228 + SYS_FGETXATTR = 229 + SYS_LISTXATTR = 230 + SYS_LLISTXATTR = 231 + SYS_FLISTXATTR = 232 + SYS_REMOVEXATTR = 233 + SYS_LREMOVEXATTR = 234 + SYS_FREMOVEXATTR = 235 + SYS_GETTID = 236 + SYS_TKILL = 237 + SYS_FUTEX = 238 + SYS_SCHED_SETAFFINITY = 239 + SYS_SCHED_GETAFFINITY = 240 + SYS_TGKILL = 241 + SYS_IO_SETUP = 243 + SYS_IO_DESTROY = 244 + SYS_IO_GETEVENTS = 245 + SYS_IO_SUBMIT = 246 + SYS_IO_CANCEL = 247 + SYS_EXIT_GROUP = 248 + SYS_EPOLL_CREATE = 249 + SYS_EPOLL_CTL = 250 + SYS_EPOLL_WAIT = 251 + SYS_SET_TID_ADDRESS = 252 + SYS_FADVISE64 = 253 + SYS_TIMER_CREATE = 254 + SYS_TIMER_SETTIME = 255 + SYS_TIMER_GETTIME = 256 + SYS_TIMER_GETOVERRUN = 257 + SYS_TIMER_DELETE = 258 + SYS_CLOCK_SETTIME = 259 + SYS_CLOCK_GETTIME = 260 + SYS_CLOCK_GETRES = 261 + SYS_CLOCK_NANOSLEEP = 262 + SYS_STATFS64 = 265 + SYS_FSTATFS64 = 266 + SYS_REMAP_FILE_PAGES = 267 + SYS_MBIND = 268 + SYS_GET_MEMPOLICY = 269 + SYS_SET_MEMPOLICY = 270 + SYS_MQ_OPEN = 271 + SYS_MQ_UNLINK = 272 + SYS_MQ_TIMEDSEND = 273 + SYS_MQ_TIMEDRECEIVE = 274 + SYS_MQ_NOTIFY = 275 + SYS_MQ_GETSETATTR = 276 + SYS_KEXEC_LOAD = 277 + SYS_ADD_KEY = 278 + SYS_REQUEST_KEY = 279 + SYS_KEYCTL = 280 + SYS_WAITID = 281 + SYS_IOPRIO_SET = 282 + SYS_IOPRIO_GET = 283 + SYS_INOTIFY_INIT = 284 + SYS_INOTIFY_ADD_WATCH = 285 + SYS_INOTIFY_RM_WATCH = 286 + SYS_MIGRATE_PAGES = 287 + SYS_OPENAT = 288 + SYS_MKDIRAT = 289 + SYS_MKNODAT = 290 + SYS_FCHOWNAT = 291 + SYS_FUTIMESAT = 292 + SYS_NEWFSTATAT = 293 + SYS_UNLINKAT = 294 + SYS_RENAMEAT = 295 + SYS_LINKAT = 296 + SYS_SYMLINKAT = 297 + SYS_READLINKAT = 298 + SYS_FCHMODAT = 299 + SYS_FACCESSAT = 300 + SYS_PSELECT6 = 301 + SYS_PPOLL = 302 + SYS_UNSHARE = 303 + SYS_SET_ROBUST_LIST = 304 + SYS_GET_ROBUST_LIST = 305 + SYS_SPLICE = 306 + SYS_SYNC_FILE_RANGE = 307 + SYS_TEE = 308 + SYS_VMSPLICE = 309 + SYS_MOVE_PAGES = 310 + SYS_GETCPU = 311 + SYS_EPOLL_PWAIT = 312 + SYS_UTIMES = 313 + SYS_FALLOCATE = 314 + SYS_UTIMENSAT = 315 + SYS_SIGNALFD = 316 + SYS_TIMERFD = 317 + SYS_EVENTFD = 318 + SYS_TIMERFD_CREATE = 319 + SYS_TIMERFD_SETTIME = 320 + SYS_TIMERFD_GETTIME = 321 + SYS_SIGNALFD4 = 322 + SYS_EVENTFD2 = 323 + SYS_INOTIFY_INIT1 = 324 + SYS_PIPE2 = 325 + SYS_DUP3 = 326 + SYS_EPOLL_CREATE1 = 327 + SYS_PREADV = 328 + SYS_PWRITEV = 329 + SYS_RT_TGSIGQUEUEINFO = 330 + SYS_PERF_EVENT_OPEN = 331 + SYS_FANOTIFY_INIT = 332 + SYS_FANOTIFY_MARK = 333 + SYS_PRLIMIT64 = 334 + SYS_NAME_TO_HANDLE_AT = 335 + SYS_OPEN_BY_HANDLE_AT = 336 + SYS_CLOCK_ADJTIME = 337 + SYS_SYNCFS = 338 + SYS_SETNS = 339 + SYS_PROCESS_VM_READV = 340 + SYS_PROCESS_VM_WRITEV = 341 + SYS_S390_RUNTIME_INSTR = 342 + SYS_KCMP = 343 + SYS_FINIT_MODULE = 344 + SYS_SCHED_SETATTR = 345 + SYS_SCHED_GETATTR = 346 + SYS_RENAMEAT2 = 347 + SYS_SECCOMP = 348 + SYS_GETRANDOM = 349 + SYS_MEMFD_CREATE = 350 + SYS_BPF = 351 + SYS_S390_PCI_MMIO_WRITE = 352 + SYS_S390_PCI_MMIO_READ = 353 + SYS_EXECVEAT = 354 + SYS_USERFAULTFD = 355 + SYS_MEMBARRIER = 356 + SYS_RECVMMSG = 357 + SYS_SENDMMSG = 358 + SYS_SOCKET = 359 + SYS_SOCKETPAIR = 360 + SYS_BIND = 361 + SYS_CONNECT = 362 + SYS_LISTEN = 363 + SYS_ACCEPT4 = 364 + SYS_GETSOCKOPT = 365 + SYS_SETSOCKOPT = 366 + SYS_GETSOCKNAME = 367 + SYS_GETPEERNAME = 368 + SYS_SENDTO = 369 + SYS_SENDMSG = 370 + SYS_RECVFROM = 371 + SYS_RECVMSG = 372 + SYS_SHUTDOWN = 373 + SYS_MLOCK2 = 374 + SYS_COPY_FILE_RANGE = 375 + SYS_PREADV2 = 376 + SYS_PWRITEV2 = 377 + SYS_S390_GUARDED_STORAGE = 378 + SYS_STATX = 379 + SYS_S390_STHYI = 380 +) diff --git a/api/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go b/api/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go new file mode 100644 index 0000000..c9c129d --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go @@ -0,0 +1,348 @@ +// mksysnum_linux.pl -Ilinux/usr/include -m64 -D__arch64__ linux/usr/include/asm/unistd.h +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build sparc64,linux + +package unix + +const ( + SYS_RESTART_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_WAIT4 = 7 + SYS_CREAT = 8 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_EXECV = 11 + SYS_CHDIR = 12 + SYS_CHOWN = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_LCHOWN = 16 + SYS_BRK = 17 + SYS_PERFCTR = 18 + SYS_LSEEK = 19 + SYS_GETPID = 20 + SYS_CAPGET = 21 + SYS_CAPSET = 22 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_VMSPLICE = 25 + SYS_PTRACE = 26 + SYS_ALARM = 27 + SYS_SIGALTSTACK = 28 + SYS_PAUSE = 29 + SYS_UTIME = 30 + SYS_ACCESS = 33 + SYS_NICE = 34 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_STAT = 38 + SYS_SENDFILE = 39 + SYS_LSTAT = 40 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_TIMES = 43 + SYS_UMOUNT2 = 45 + SYS_SETGID = 46 + SYS_GETGID = 47 + SYS_SIGNAL = 48 + SYS_GETEUID = 49 + SYS_GETEGID = 50 + SYS_ACCT = 51 + SYS_MEMORY_ORDERING = 52 + SYS_IOCTL = 54 + SYS_REBOOT = 55 + SYS_SYMLINK = 57 + SYS_READLINK = 58 + SYS_EXECVE = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_FSTAT = 62 + SYS_FSTAT64 = 63 + SYS_GETPAGESIZE = 64 + SYS_MSYNC = 65 + SYS_VFORK = 66 + SYS_PREAD64 = 67 + SYS_PWRITE64 = 68 + SYS_MMAP = 71 + SYS_MUNMAP = 73 + SYS_MPROTECT = 74 + SYS_MADVISE = 75 + SYS_VHANGUP = 76 + SYS_MINCORE = 78 + SYS_GETGROUPS = 79 + SYS_SETGROUPS = 80 + SYS_GETPGRP = 81 + SYS_SETITIMER = 83 + SYS_SWAPON = 85 + SYS_GETITIMER = 86 + SYS_SETHOSTNAME = 88 + SYS_DUP2 = 90 + SYS_FCNTL = 92 + SYS_SELECT = 93 + SYS_FSYNC = 95 + SYS_SETPRIORITY = 96 + SYS_SOCKET = 97 + SYS_CONNECT = 98 + SYS_ACCEPT = 99 + SYS_GETPRIORITY = 100 + SYS_RT_SIGRETURN = 101 + SYS_RT_SIGACTION = 102 + SYS_RT_SIGPROCMASK = 103 + SYS_RT_SIGPENDING = 104 + SYS_RT_SIGTIMEDWAIT = 105 + SYS_RT_SIGQUEUEINFO = 106 + SYS_RT_SIGSUSPEND = 107 + SYS_SETRESUID = 108 + SYS_GETRESUID = 109 + SYS_SETRESGID = 110 + SYS_GETRESGID = 111 + SYS_RECVMSG = 113 + SYS_SENDMSG = 114 + SYS_GETTIMEOFDAY = 116 + SYS_GETRUSAGE = 117 + SYS_GETSOCKOPT = 118 + SYS_GETCWD = 119 + SYS_READV = 120 + SYS_WRITEV = 121 + SYS_SETTIMEOFDAY = 122 + SYS_FCHOWN = 123 + SYS_FCHMOD = 124 + SYS_RECVFROM = 125 + SYS_SETREUID = 126 + SYS_SETREGID = 127 + SYS_RENAME = 128 + SYS_TRUNCATE = 129 + SYS_FTRUNCATE = 130 + SYS_FLOCK = 131 + SYS_LSTAT64 = 132 + SYS_SENDTO = 133 + SYS_SHUTDOWN = 134 + SYS_SOCKETPAIR = 135 + SYS_MKDIR = 136 + SYS_RMDIR = 137 + SYS_UTIMES = 138 + SYS_STAT64 = 139 + SYS_SENDFILE64 = 140 + SYS_GETPEERNAME = 141 + SYS_FUTEX = 142 + SYS_GETTID = 143 + SYS_GETRLIMIT = 144 + SYS_SETRLIMIT = 145 + SYS_PIVOT_ROOT = 146 + SYS_PRCTL = 147 + SYS_PCICONFIG_READ = 148 + SYS_PCICONFIG_WRITE = 149 + SYS_GETSOCKNAME = 150 + SYS_INOTIFY_INIT = 151 + SYS_INOTIFY_ADD_WATCH = 152 + SYS_POLL = 153 + SYS_GETDENTS64 = 154 + SYS_INOTIFY_RM_WATCH = 156 + SYS_STATFS = 157 + SYS_FSTATFS = 158 + SYS_UMOUNT = 159 + SYS_SCHED_SET_AFFINITY = 160 + SYS_SCHED_GET_AFFINITY = 161 + SYS_GETDOMAINNAME = 162 + SYS_SETDOMAINNAME = 163 + SYS_UTRAP_INSTALL = 164 + SYS_QUOTACTL = 165 + SYS_SET_TID_ADDRESS = 166 + SYS_MOUNT = 167 + SYS_USTAT = 168 + SYS_SETXATTR = 169 + SYS_LSETXATTR = 170 + SYS_FSETXATTR = 171 + SYS_GETXATTR = 172 + SYS_LGETXATTR = 173 + SYS_GETDENTS = 174 + SYS_SETSID = 175 + SYS_FCHDIR = 176 + SYS_FGETXATTR = 177 + SYS_LISTXATTR = 178 + SYS_LLISTXATTR = 179 + SYS_FLISTXATTR = 180 + SYS_REMOVEXATTR = 181 + SYS_LREMOVEXATTR = 182 + SYS_SIGPENDING = 183 + SYS_QUERY_MODULE = 184 + SYS_SETPGID = 185 + SYS_FREMOVEXATTR = 186 + SYS_TKILL = 187 + SYS_EXIT_GROUP = 188 + SYS_UNAME = 189 + SYS_INIT_MODULE = 190 + SYS_PERSONALITY = 191 + SYS_REMAP_FILE_PAGES = 192 + SYS_EPOLL_CREATE = 193 + SYS_EPOLL_CTL = 194 + SYS_EPOLL_WAIT = 195 + SYS_IOPRIO_SET = 196 + SYS_GETPPID = 197 + SYS_SIGACTION = 198 + SYS_SGETMASK = 199 + SYS_SSETMASK = 200 + SYS_SIGSUSPEND = 201 + SYS_OLDLSTAT = 202 + SYS_USELIB = 203 + SYS_READDIR = 204 + SYS_READAHEAD = 205 + SYS_SOCKETCALL = 206 + SYS_SYSLOG = 207 + SYS_LOOKUP_DCOOKIE = 208 + SYS_FADVISE64 = 209 + SYS_FADVISE64_64 = 210 + SYS_TGKILL = 211 + SYS_WAITPID = 212 + SYS_SWAPOFF = 213 + SYS_SYSINFO = 214 + SYS_IPC = 215 + SYS_SIGRETURN = 216 + SYS_CLONE = 217 + SYS_IOPRIO_GET = 218 + SYS_ADJTIMEX = 219 + SYS_SIGPROCMASK = 220 + SYS_CREATE_MODULE = 221 + SYS_DELETE_MODULE = 222 + SYS_GET_KERNEL_SYMS = 223 + SYS_GETPGID = 224 + SYS_BDFLUSH = 225 + SYS_SYSFS = 226 + SYS_AFS_SYSCALL = 227 + SYS_SETFSUID = 228 + SYS_SETFSGID = 229 + SYS__NEWSELECT = 230 + SYS_SPLICE = 232 + SYS_STIME = 233 + SYS_STATFS64 = 234 + SYS_FSTATFS64 = 235 + SYS__LLSEEK = 236 + SYS_MLOCK = 237 + SYS_MUNLOCK = 238 + SYS_MLOCKALL = 239 + SYS_MUNLOCKALL = 240 + SYS_SCHED_SETPARAM = 241 + SYS_SCHED_GETPARAM = 242 + SYS_SCHED_SETSCHEDULER = 243 + SYS_SCHED_GETSCHEDULER = 244 + SYS_SCHED_YIELD = 245 + SYS_SCHED_GET_PRIORITY_MAX = 246 + SYS_SCHED_GET_PRIORITY_MIN = 247 + SYS_SCHED_RR_GET_INTERVAL = 248 + SYS_NANOSLEEP = 249 + SYS_MREMAP = 250 + SYS__SYSCTL = 251 + SYS_GETSID = 252 + SYS_FDATASYNC = 253 + SYS_NFSSERVCTL = 254 + SYS_SYNC_FILE_RANGE = 255 + SYS_CLOCK_SETTIME = 256 + SYS_CLOCK_GETTIME = 257 + SYS_CLOCK_GETRES = 258 + SYS_CLOCK_NANOSLEEP = 259 + SYS_SCHED_GETAFFINITY = 260 + SYS_SCHED_SETAFFINITY = 261 + SYS_TIMER_SETTIME = 262 + SYS_TIMER_GETTIME = 263 + SYS_TIMER_GETOVERRUN = 264 + SYS_TIMER_DELETE = 265 + SYS_TIMER_CREATE = 266 + SYS_IO_SETUP = 268 + SYS_IO_DESTROY = 269 + SYS_IO_SUBMIT = 270 + SYS_IO_CANCEL = 271 + SYS_IO_GETEVENTS = 272 + SYS_MQ_OPEN = 273 + SYS_MQ_UNLINK = 274 + SYS_MQ_TIMEDSEND = 275 + SYS_MQ_TIMEDRECEIVE = 276 + SYS_MQ_NOTIFY = 277 + SYS_MQ_GETSETATTR = 278 + SYS_WAITID = 279 + SYS_TEE = 280 + SYS_ADD_KEY = 281 + SYS_REQUEST_KEY = 282 + SYS_KEYCTL = 283 + SYS_OPENAT = 284 + SYS_MKDIRAT = 285 + SYS_MKNODAT = 286 + SYS_FCHOWNAT = 287 + SYS_FUTIMESAT = 288 + SYS_FSTATAT64 = 289 + SYS_UNLINKAT = 290 + SYS_RENAMEAT = 291 + SYS_LINKAT = 292 + SYS_SYMLINKAT = 293 + SYS_READLINKAT = 294 + SYS_FCHMODAT = 295 + SYS_FACCESSAT = 296 + SYS_PSELECT6 = 297 + SYS_PPOLL = 298 + SYS_UNSHARE = 299 + SYS_SET_ROBUST_LIST = 300 + SYS_GET_ROBUST_LIST = 301 + SYS_MIGRATE_PAGES = 302 + SYS_MBIND = 303 + SYS_GET_MEMPOLICY = 304 + SYS_SET_MEMPOLICY = 305 + SYS_KEXEC_LOAD = 306 + SYS_MOVE_PAGES = 307 + SYS_GETCPU = 308 + SYS_EPOLL_PWAIT = 309 + SYS_UTIMENSAT = 310 + SYS_SIGNALFD = 311 + SYS_TIMERFD_CREATE = 312 + SYS_EVENTFD = 313 + SYS_FALLOCATE = 314 + SYS_TIMERFD_SETTIME = 315 + SYS_TIMERFD_GETTIME = 316 + SYS_SIGNALFD4 = 317 + SYS_EVENTFD2 = 318 + SYS_EPOLL_CREATE1 = 319 + SYS_DUP3 = 320 + SYS_PIPE2 = 321 + SYS_INOTIFY_INIT1 = 322 + SYS_ACCEPT4 = 323 + SYS_PREADV = 324 + SYS_PWRITEV = 325 + SYS_RT_TGSIGQUEUEINFO = 326 + SYS_PERF_EVENT_OPEN = 327 + SYS_RECVMMSG = 328 + SYS_FANOTIFY_INIT = 329 + SYS_FANOTIFY_MARK = 330 + SYS_PRLIMIT64 = 331 + SYS_NAME_TO_HANDLE_AT = 332 + SYS_OPEN_BY_HANDLE_AT = 333 + SYS_CLOCK_ADJTIME = 334 + SYS_SYNCFS = 335 + SYS_SENDMMSG = 336 + SYS_SETNS = 337 + SYS_PROCESS_VM_READV = 338 + SYS_PROCESS_VM_WRITEV = 339 + SYS_KERN_FEATURES = 340 + SYS_KCMP = 341 + SYS_FINIT_MODULE = 342 + SYS_SCHED_SETATTR = 343 + SYS_SCHED_GETATTR = 344 + SYS_RENAMEAT2 = 345 + SYS_SECCOMP = 346 + SYS_GETRANDOM = 347 + SYS_MEMFD_CREATE = 348 + SYS_BPF = 349 + SYS_EXECVEAT = 350 + SYS_MEMBARRIER = 351 + SYS_USERFAULTFD = 352 + SYS_BIND = 353 + SYS_LISTEN = 354 + SYS_SETSOCKOPT = 355 + SYS_MLOCK2 = 356 + SYS_COPY_FILE_RANGE = 357 + SYS_PREADV2 = 358 + SYS_PWRITEV2 = 359 +) diff --git a/api/vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go b/api/vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go new file mode 100644 index 0000000..8afda9c --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go @@ -0,0 +1,274 @@ +// mksysnum_netbsd.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build 386,netbsd + +package unix + +const ( + SYS_EXIT = 1 // { void|sys||exit(int rval); } + SYS_FORK = 2 // { int|sys||fork(void); } + SYS_READ = 3 // { ssize_t|sys||read(int fd, void *buf, size_t nbyte); } + SYS_WRITE = 4 // { ssize_t|sys||write(int fd, const void *buf, size_t nbyte); } + SYS_OPEN = 5 // { int|sys||open(const char *path, int flags, ... mode_t mode); } + SYS_CLOSE = 6 // { int|sys||close(int fd); } + SYS_LINK = 9 // { int|sys||link(const char *path, const char *link); } + SYS_UNLINK = 10 // { int|sys||unlink(const char *path); } + SYS_CHDIR = 12 // { int|sys||chdir(const char *path); } + SYS_FCHDIR = 13 // { int|sys||fchdir(int fd); } + SYS_CHMOD = 15 // { int|sys||chmod(const char *path, mode_t mode); } + SYS_CHOWN = 16 // { int|sys||chown(const char *path, uid_t uid, gid_t gid); } + SYS_BREAK = 17 // { int|sys||obreak(char *nsize); } + SYS_GETPID = 20 // { pid_t|sys||getpid_with_ppid(void); } + SYS_UNMOUNT = 22 // { int|sys||unmount(const char *path, int flags); } + SYS_SETUID = 23 // { int|sys||setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t|sys||getuid_with_euid(void); } + SYS_GETEUID = 25 // { uid_t|sys||geteuid(void); } + SYS_PTRACE = 26 // { int|sys||ptrace(int req, pid_t pid, void *addr, int data); } + SYS_RECVMSG = 27 // { ssize_t|sys||recvmsg(int s, struct msghdr *msg, int flags); } + SYS_SENDMSG = 28 // { ssize_t|sys||sendmsg(int s, const struct msghdr *msg, int flags); } + SYS_RECVFROM = 29 // { ssize_t|sys||recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlenaddr); } + SYS_ACCEPT = 30 // { int|sys||accept(int s, struct sockaddr *name, socklen_t *anamelen); } + SYS_GETPEERNAME = 31 // { int|sys||getpeername(int fdes, struct sockaddr *asa, socklen_t *alen); } + SYS_GETSOCKNAME = 32 // { int|sys||getsockname(int fdes, struct sockaddr *asa, socklen_t *alen); } + SYS_ACCESS = 33 // { int|sys||access(const char *path, int flags); } + SYS_CHFLAGS = 34 // { int|sys||chflags(const char *path, u_long flags); } + SYS_FCHFLAGS = 35 // { int|sys||fchflags(int fd, u_long flags); } + SYS_SYNC = 36 // { void|sys||sync(void); } + SYS_KILL = 37 // { int|sys||kill(pid_t pid, int signum); } + SYS_GETPPID = 39 // { pid_t|sys||getppid(void); } + SYS_DUP = 41 // { int|sys||dup(int fd); } + SYS_PIPE = 42 // { int|sys||pipe(void); } + SYS_GETEGID = 43 // { gid_t|sys||getegid(void); } + SYS_PROFIL = 44 // { int|sys||profil(char *samples, size_t size, u_long offset, u_int scale); } + SYS_KTRACE = 45 // { int|sys||ktrace(const char *fname, int ops, int facs, pid_t pid); } + SYS_GETGID = 47 // { gid_t|sys||getgid_with_egid(void); } + SYS___GETLOGIN = 49 // { int|sys||__getlogin(char *namebuf, size_t namelen); } + SYS___SETLOGIN = 50 // { int|sys||__setlogin(const char *namebuf); } + SYS_ACCT = 51 // { int|sys||acct(const char *path); } + SYS_IOCTL = 54 // { int|sys||ioctl(int fd, u_long com, ... void *data); } + SYS_REVOKE = 56 // { int|sys||revoke(const char *path); } + SYS_SYMLINK = 57 // { int|sys||symlink(const char *path, const char *link); } + SYS_READLINK = 58 // { ssize_t|sys||readlink(const char *path, char *buf, size_t count); } + SYS_EXECVE = 59 // { int|sys||execve(const char *path, char * const *argp, char * const *envp); } + SYS_UMASK = 60 // { mode_t|sys||umask(mode_t newmask); } + SYS_CHROOT = 61 // { int|sys||chroot(const char *path); } + SYS_VFORK = 66 // { int|sys||vfork(void); } + SYS_SBRK = 69 // { int|sys||sbrk(intptr_t incr); } + SYS_SSTK = 70 // { int|sys||sstk(int incr); } + SYS_VADVISE = 72 // { int|sys||ovadvise(int anom); } + SYS_MUNMAP = 73 // { int|sys||munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int|sys||mprotect(void *addr, size_t len, int prot); } + SYS_MADVISE = 75 // { int|sys||madvise(void *addr, size_t len, int behav); } + SYS_MINCORE = 78 // { int|sys||mincore(void *addr, size_t len, char *vec); } + SYS_GETGROUPS = 79 // { int|sys||getgroups(int gidsetsize, gid_t *gidset); } + SYS_SETGROUPS = 80 // { int|sys||setgroups(int gidsetsize, const gid_t *gidset); } + SYS_GETPGRP = 81 // { int|sys||getpgrp(void); } + SYS_SETPGID = 82 // { int|sys||setpgid(pid_t pid, pid_t pgid); } + SYS_DUP2 = 90 // { int|sys||dup2(int from, int to); } + SYS_FCNTL = 92 // { int|sys||fcntl(int fd, int cmd, ... void *arg); } + SYS_FSYNC = 95 // { int|sys||fsync(int fd); } + SYS_SETPRIORITY = 96 // { int|sys||setpriority(int which, id_t who, int prio); } + SYS_CONNECT = 98 // { int|sys||connect(int s, const struct sockaddr *name, socklen_t namelen); } + SYS_GETPRIORITY = 100 // { int|sys||getpriority(int which, id_t who); } + SYS_BIND = 104 // { int|sys||bind(int s, const struct sockaddr *name, socklen_t namelen); } + SYS_SETSOCKOPT = 105 // { int|sys||setsockopt(int s, int level, int name, const void *val, socklen_t valsize); } + SYS_LISTEN = 106 // { int|sys||listen(int s, int backlog); } + SYS_GETSOCKOPT = 118 // { int|sys||getsockopt(int s, int level, int name, void *val, socklen_t *avalsize); } + SYS_READV = 120 // { ssize_t|sys||readv(int fd, const struct iovec *iovp, int iovcnt); } + SYS_WRITEV = 121 // { ssize_t|sys||writev(int fd, const struct iovec *iovp, int iovcnt); } + SYS_FCHOWN = 123 // { int|sys||fchown(int fd, uid_t uid, gid_t gid); } + SYS_FCHMOD = 124 // { int|sys||fchmod(int fd, mode_t mode); } + SYS_SETREUID = 126 // { int|sys||setreuid(uid_t ruid, uid_t euid); } + SYS_SETREGID = 127 // { int|sys||setregid(gid_t rgid, gid_t egid); } + SYS_RENAME = 128 // { int|sys||rename(const char *from, const char *to); } + SYS_FLOCK = 131 // { int|sys||flock(int fd, int how); } + SYS_MKFIFO = 132 // { int|sys||mkfifo(const char *path, mode_t mode); } + SYS_SENDTO = 133 // { ssize_t|sys||sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen); } + SYS_SHUTDOWN = 134 // { int|sys||shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int|sys||socketpair(int domain, int type, int protocol, int *rsv); } + SYS_MKDIR = 136 // { int|sys||mkdir(const char *path, mode_t mode); } + SYS_RMDIR = 137 // { int|sys||rmdir(const char *path); } + SYS_SETSID = 147 // { int|sys||setsid(void); } + SYS_SYSARCH = 165 // { int|sys||sysarch(int op, void *parms); } + SYS_PREAD = 173 // { ssize_t|sys||pread(int fd, void *buf, size_t nbyte, int PAD, off_t offset); } + SYS_PWRITE = 174 // { ssize_t|sys||pwrite(int fd, const void *buf, size_t nbyte, int PAD, off_t offset); } + SYS_NTP_ADJTIME = 176 // { int|sys||ntp_adjtime(struct timex *tp); } + SYS_SETGID = 181 // { int|sys||setgid(gid_t gid); } + SYS_SETEGID = 182 // { int|sys||setegid(gid_t egid); } + SYS_SETEUID = 183 // { int|sys||seteuid(uid_t euid); } + SYS_PATHCONF = 191 // { long|sys||pathconf(const char *path, int name); } + SYS_FPATHCONF = 192 // { long|sys||fpathconf(int fd, int name); } + SYS_GETRLIMIT = 194 // { int|sys||getrlimit(int which, struct rlimit *rlp); } + SYS_SETRLIMIT = 195 // { int|sys||setrlimit(int which, const struct rlimit *rlp); } + SYS_MMAP = 197 // { void *|sys||mmap(void *addr, size_t len, int prot, int flags, int fd, long PAD, off_t pos); } + SYS_LSEEK = 199 // { off_t|sys||lseek(int fd, int PAD, off_t offset, int whence); } + SYS_TRUNCATE = 200 // { int|sys||truncate(const char *path, int PAD, off_t length); } + SYS_FTRUNCATE = 201 // { int|sys||ftruncate(int fd, int PAD, off_t length); } + SYS___SYSCTL = 202 // { int|sys||__sysctl(const int *name, u_int namelen, void *old, size_t *oldlenp, const void *new, size_t newlen); } + SYS_MLOCK = 203 // { int|sys||mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int|sys||munlock(const void *addr, size_t len); } + SYS_UNDELETE = 205 // { int|sys||undelete(const char *path); } + SYS_GETPGID = 207 // { pid_t|sys||getpgid(pid_t pid); } + SYS_REBOOT = 208 // { int|sys||reboot(int opt, char *bootstr); } + SYS_POLL = 209 // { int|sys||poll(struct pollfd *fds, u_int nfds, int timeout); } + SYS_SEMGET = 221 // { int|sys||semget(key_t key, int nsems, int semflg); } + SYS_SEMOP = 222 // { int|sys||semop(int semid, struct sembuf *sops, size_t nsops); } + SYS_SEMCONFIG = 223 // { int|sys||semconfig(int flag); } + SYS_MSGGET = 225 // { int|sys||msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int|sys||msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); } + SYS_MSGRCV = 227 // { ssize_t|sys||msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } + SYS_SHMAT = 228 // { void *|sys||shmat(int shmid, const void *shmaddr, int shmflg); } + SYS_SHMDT = 230 // { int|sys||shmdt(const void *shmaddr); } + SYS_SHMGET = 231 // { int|sys||shmget(key_t key, size_t size, int shmflg); } + SYS_TIMER_CREATE = 235 // { int|sys||timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid); } + SYS_TIMER_DELETE = 236 // { int|sys||timer_delete(timer_t timerid); } + SYS_TIMER_GETOVERRUN = 239 // { int|sys||timer_getoverrun(timer_t timerid); } + SYS_FDATASYNC = 241 // { int|sys||fdatasync(int fd); } + SYS_MLOCKALL = 242 // { int|sys||mlockall(int flags); } + SYS_MUNLOCKALL = 243 // { int|sys||munlockall(void); } + SYS_SIGQUEUEINFO = 245 // { int|sys||sigqueueinfo(pid_t pid, const siginfo_t *info); } + SYS_MODCTL = 246 // { int|sys||modctl(int cmd, void *arg); } + SYS___POSIX_RENAME = 270 // { int|sys||__posix_rename(const char *from, const char *to); } + SYS_SWAPCTL = 271 // { int|sys||swapctl(int cmd, void *arg, int misc); } + SYS_MINHERIT = 273 // { int|sys||minherit(void *addr, size_t len, int inherit); } + SYS_LCHMOD = 274 // { int|sys||lchmod(const char *path, mode_t mode); } + SYS_LCHOWN = 275 // { int|sys||lchown(const char *path, uid_t uid, gid_t gid); } + SYS_MSYNC = 277 // { int|sys|13|msync(void *addr, size_t len, int flags); } + SYS___POSIX_CHOWN = 283 // { int|sys||__posix_chown(const char *path, uid_t uid, gid_t gid); } + SYS___POSIX_FCHOWN = 284 // { int|sys||__posix_fchown(int fd, uid_t uid, gid_t gid); } + SYS___POSIX_LCHOWN = 285 // { int|sys||__posix_lchown(const char *path, uid_t uid, gid_t gid); } + SYS_GETSID = 286 // { pid_t|sys||getsid(pid_t pid); } + SYS___CLONE = 287 // { pid_t|sys||__clone(int flags, void *stack); } + SYS_FKTRACE = 288 // { int|sys||fktrace(int fd, int ops, int facs, pid_t pid); } + SYS_PREADV = 289 // { ssize_t|sys||preadv(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } + SYS_PWRITEV = 290 // { ssize_t|sys||pwritev(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } + SYS___GETCWD = 296 // { int|sys||__getcwd(char *bufp, size_t length); } + SYS_FCHROOT = 297 // { int|sys||fchroot(int fd); } + SYS_LCHFLAGS = 304 // { int|sys||lchflags(const char *path, u_long flags); } + SYS_ISSETUGID = 305 // { int|sys||issetugid(void); } + SYS_UTRACE = 306 // { int|sys||utrace(const char *label, void *addr, size_t len); } + SYS_GETCONTEXT = 307 // { int|sys||getcontext(struct __ucontext *ucp); } + SYS_SETCONTEXT = 308 // { int|sys||setcontext(const struct __ucontext *ucp); } + SYS__LWP_CREATE = 309 // { int|sys||_lwp_create(const struct __ucontext *ucp, u_long flags, lwpid_t *new_lwp); } + SYS__LWP_EXIT = 310 // { int|sys||_lwp_exit(void); } + SYS__LWP_SELF = 311 // { lwpid_t|sys||_lwp_self(void); } + SYS__LWP_WAIT = 312 // { int|sys||_lwp_wait(lwpid_t wait_for, lwpid_t *departed); } + SYS__LWP_SUSPEND = 313 // { int|sys||_lwp_suspend(lwpid_t target); } + SYS__LWP_CONTINUE = 314 // { int|sys||_lwp_continue(lwpid_t target); } + SYS__LWP_WAKEUP = 315 // { int|sys||_lwp_wakeup(lwpid_t target); } + SYS__LWP_GETPRIVATE = 316 // { void *|sys||_lwp_getprivate(void); } + SYS__LWP_SETPRIVATE = 317 // { void|sys||_lwp_setprivate(void *ptr); } + SYS__LWP_KILL = 318 // { int|sys||_lwp_kill(lwpid_t target, int signo); } + SYS__LWP_DETACH = 319 // { int|sys||_lwp_detach(lwpid_t target); } + SYS__LWP_UNPARK = 321 // { int|sys||_lwp_unpark(lwpid_t target, const void *hint); } + SYS__LWP_UNPARK_ALL = 322 // { ssize_t|sys||_lwp_unpark_all(const lwpid_t *targets, size_t ntargets, const void *hint); } + SYS__LWP_SETNAME = 323 // { int|sys||_lwp_setname(lwpid_t target, const char *name); } + SYS__LWP_GETNAME = 324 // { int|sys||_lwp_getname(lwpid_t target, char *name, size_t len); } + SYS__LWP_CTL = 325 // { int|sys||_lwp_ctl(int features, struct lwpctl **address); } + SYS___SIGACTION_SIGTRAMP = 340 // { int|sys||__sigaction_sigtramp(int signum, const struct sigaction *nsa, struct sigaction *osa, const void *tramp, int vers); } + SYS_PMC_GET_INFO = 341 // { int|sys||pmc_get_info(int ctr, int op, void *args); } + SYS_PMC_CONTROL = 342 // { int|sys||pmc_control(int ctr, int op, void *args); } + SYS_RASCTL = 343 // { int|sys||rasctl(void *addr, size_t len, int op); } + SYS_KQUEUE = 344 // { int|sys||kqueue(void); } + SYS__SCHED_SETPARAM = 346 // { int|sys||_sched_setparam(pid_t pid, lwpid_t lid, int policy, const struct sched_param *params); } + SYS__SCHED_GETPARAM = 347 // { int|sys||_sched_getparam(pid_t pid, lwpid_t lid, int *policy, struct sched_param *params); } + SYS__SCHED_SETAFFINITY = 348 // { int|sys||_sched_setaffinity(pid_t pid, lwpid_t lid, size_t size, const cpuset_t *cpuset); } + SYS__SCHED_GETAFFINITY = 349 // { int|sys||_sched_getaffinity(pid_t pid, lwpid_t lid, size_t size, cpuset_t *cpuset); } + SYS_SCHED_YIELD = 350 // { int|sys||sched_yield(void); } + SYS_FSYNC_RANGE = 354 // { int|sys||fsync_range(int fd, int flags, off_t start, off_t length); } + SYS_UUIDGEN = 355 // { int|sys||uuidgen(struct uuid *store, int count); } + SYS_GETVFSSTAT = 356 // { int|sys||getvfsstat(struct statvfs *buf, size_t bufsize, int flags); } + SYS_STATVFS1 = 357 // { int|sys||statvfs1(const char *path, struct statvfs *buf, int flags); } + SYS_FSTATVFS1 = 358 // { int|sys||fstatvfs1(int fd, struct statvfs *buf, int flags); } + SYS_EXTATTRCTL = 360 // { int|sys||extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_FILE = 361 // { int|sys||extattr_set_file(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_FILE = 362 // { ssize_t|sys||extattr_get_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FILE = 363 // { int|sys||extattr_delete_file(const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_FD = 364 // { int|sys||extattr_set_fd(int fd, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_FD = 365 // { ssize_t|sys||extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FD = 366 // { int|sys||extattr_delete_fd(int fd, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_LINK = 367 // { int|sys||extattr_set_link(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_LINK = 368 // { ssize_t|sys||extattr_get_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_LINK = 369 // { int|sys||extattr_delete_link(const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_LIST_FD = 370 // { ssize_t|sys||extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_FILE = 371 // { ssize_t|sys||extattr_list_file(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_LINK = 372 // { ssize_t|sys||extattr_list_link(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_SETXATTR = 375 // { int|sys||setxattr(const char *path, const char *name, const void *value, size_t size, int flags); } + SYS_LSETXATTR = 376 // { int|sys||lsetxattr(const char *path, const char *name, const void *value, size_t size, int flags); } + SYS_FSETXATTR = 377 // { int|sys||fsetxattr(int fd, const char *name, const void *value, size_t size, int flags); } + SYS_GETXATTR = 378 // { int|sys||getxattr(const char *path, const char *name, void *value, size_t size); } + SYS_LGETXATTR = 379 // { int|sys||lgetxattr(const char *path, const char *name, void *value, size_t size); } + SYS_FGETXATTR = 380 // { int|sys||fgetxattr(int fd, const char *name, void *value, size_t size); } + SYS_LISTXATTR = 381 // { int|sys||listxattr(const char *path, char *list, size_t size); } + SYS_LLISTXATTR = 382 // { int|sys||llistxattr(const char *path, char *list, size_t size); } + SYS_FLISTXATTR = 383 // { int|sys||flistxattr(int fd, char *list, size_t size); } + SYS_REMOVEXATTR = 384 // { int|sys||removexattr(const char *path, const char *name); } + SYS_LREMOVEXATTR = 385 // { int|sys||lremovexattr(const char *path, const char *name); } + SYS_FREMOVEXATTR = 386 // { int|sys||fremovexattr(int fd, const char *name); } + SYS_GETDENTS = 390 // { int|sys|30|getdents(int fd, char *buf, size_t count); } + SYS_SOCKET = 394 // { int|sys|30|socket(int domain, int type, int protocol); } + SYS_GETFH = 395 // { int|sys|30|getfh(const char *fname, void *fhp, size_t *fh_size); } + SYS_MOUNT = 410 // { int|sys|50|mount(const char *type, const char *path, int flags, void *data, size_t data_len); } + SYS_MREMAP = 411 // { void *|sys||mremap(void *old_address, size_t old_size, void *new_address, size_t new_size, int flags); } + SYS_PSET_CREATE = 412 // { int|sys||pset_create(psetid_t *psid); } + SYS_PSET_DESTROY = 413 // { int|sys||pset_destroy(psetid_t psid); } + SYS_PSET_ASSIGN = 414 // { int|sys||pset_assign(psetid_t psid, cpuid_t cpuid, psetid_t *opsid); } + SYS__PSET_BIND = 415 // { int|sys||_pset_bind(idtype_t idtype, id_t first_id, id_t second_id, psetid_t psid, psetid_t *opsid); } + SYS_POSIX_FADVISE = 416 // { int|sys|50|posix_fadvise(int fd, int PAD, off_t offset, off_t len, int advice); } + SYS_SELECT = 417 // { int|sys|50|select(int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval *tv); } + SYS_GETTIMEOFDAY = 418 // { int|sys|50|gettimeofday(struct timeval *tp, void *tzp); } + SYS_SETTIMEOFDAY = 419 // { int|sys|50|settimeofday(const struct timeval *tv, const void *tzp); } + SYS_UTIMES = 420 // { int|sys|50|utimes(const char *path, const struct timeval *tptr); } + SYS_ADJTIME = 421 // { int|sys|50|adjtime(const struct timeval *delta, struct timeval *olddelta); } + SYS_FUTIMES = 423 // { int|sys|50|futimes(int fd, const struct timeval *tptr); } + SYS_LUTIMES = 424 // { int|sys|50|lutimes(const char *path, const struct timeval *tptr); } + SYS_SETITIMER = 425 // { int|sys|50|setitimer(int which, const struct itimerval *itv, struct itimerval *oitv); } + SYS_GETITIMER = 426 // { int|sys|50|getitimer(int which, struct itimerval *itv); } + SYS_CLOCK_GETTIME = 427 // { int|sys|50|clock_gettime(clockid_t clock_id, struct timespec *tp); } + SYS_CLOCK_SETTIME = 428 // { int|sys|50|clock_settime(clockid_t clock_id, const struct timespec *tp); } + SYS_CLOCK_GETRES = 429 // { int|sys|50|clock_getres(clockid_t clock_id, struct timespec *tp); } + SYS_NANOSLEEP = 430 // { int|sys|50|nanosleep(const struct timespec *rqtp, struct timespec *rmtp); } + SYS___SIGTIMEDWAIT = 431 // { int|sys|50|__sigtimedwait(const sigset_t *set, siginfo_t *info, struct timespec *timeout); } + SYS__LWP_PARK = 434 // { int|sys|50|_lwp_park(const struct timespec *ts, lwpid_t unpark, const void *hint, const void *unparkhint); } + SYS_KEVENT = 435 // { int|sys|50|kevent(int fd, const struct kevent *changelist, size_t nchanges, struct kevent *eventlist, size_t nevents, const struct timespec *timeout); } + SYS_PSELECT = 436 // { int|sys|50|pselect(int nd, fd_set *in, fd_set *ou, fd_set *ex, const struct timespec *ts, const sigset_t *mask); } + SYS_POLLTS = 437 // { int|sys|50|pollts(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *mask); } + SYS_STAT = 439 // { int|sys|50|stat(const char *path, struct stat *ub); } + SYS_FSTAT = 440 // { int|sys|50|fstat(int fd, struct stat *sb); } + SYS_LSTAT = 441 // { int|sys|50|lstat(const char *path, struct stat *ub); } + SYS___SEMCTL = 442 // { int|sys|50|__semctl(int semid, int semnum, int cmd, ... union __semun *arg); } + SYS_SHMCTL = 443 // { int|sys|50|shmctl(int shmid, int cmd, struct shmid_ds *buf); } + SYS_MSGCTL = 444 // { int|sys|50|msgctl(int msqid, int cmd, struct msqid_ds *buf); } + SYS_GETRUSAGE = 445 // { int|sys|50|getrusage(int who, struct rusage *rusage); } + SYS_TIMER_SETTIME = 446 // { int|sys|50|timer_settime(timer_t timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue); } + SYS_TIMER_GETTIME = 447 // { int|sys|50|timer_gettime(timer_t timerid, struct itimerspec *value); } + SYS_NTP_GETTIME = 448 // { int|sys|50|ntp_gettime(struct ntptimeval *ntvp); } + SYS_WAIT4 = 449 // { int|sys|50|wait4(pid_t pid, int *status, int options, struct rusage *rusage); } + SYS_MKNOD = 450 // { int|sys|50|mknod(const char *path, mode_t mode, dev_t dev); } + SYS_FHSTAT = 451 // { int|sys|50|fhstat(const void *fhp, size_t fh_size, struct stat *sb); } + SYS_PIPE2 = 453 // { int|sys||pipe2(int *fildes, int flags); } + SYS_DUP3 = 454 // { int|sys||dup3(int from, int to, int flags); } + SYS_KQUEUE1 = 455 // { int|sys||kqueue1(int flags); } + SYS_PACCEPT = 456 // { int|sys||paccept(int s, struct sockaddr *name, socklen_t *anamelen, const sigset_t *mask, int flags); } + SYS_LINKAT = 457 // { int|sys||linkat(int fd1, const char *name1, int fd2, const char *name2, int flags); } + SYS_RENAMEAT = 458 // { int|sys||renameat(int fromfd, const char *from, int tofd, const char *to); } + SYS_MKFIFOAT = 459 // { int|sys||mkfifoat(int fd, const char *path, mode_t mode); } + SYS_MKNODAT = 460 // { int|sys||mknodat(int fd, const char *path, mode_t mode, uint32_t dev); } + SYS_MKDIRAT = 461 // { int|sys||mkdirat(int fd, const char *path, mode_t mode); } + SYS_FACCESSAT = 462 // { int|sys||faccessat(int fd, const char *path, int amode, int flag); } + SYS_FCHMODAT = 463 // { int|sys||fchmodat(int fd, const char *path, mode_t mode, int flag); } + SYS_FCHOWNAT = 464 // { int|sys||fchownat(int fd, const char *path, uid_t owner, gid_t group, int flag); } + SYS_FEXECVE = 465 // { int|sys||fexecve(int fd, char * const *argp, char * const *envp); } + SYS_FSTATAT = 466 // { int|sys||fstatat(int fd, const char *path, struct stat *buf, int flag); } + SYS_UTIMENSAT = 467 // { int|sys||utimensat(int fd, const char *path, const struct timespec *tptr, int flag); } + SYS_OPENAT = 468 // { int|sys||openat(int fd, const char *path, int oflags, ... mode_t mode); } + SYS_READLINKAT = 469 // { int|sys||readlinkat(int fd, const char *path, char *buf, size_t bufsize); } + SYS_SYMLINKAT = 470 // { int|sys||symlinkat(const char *path1, int fd, const char *path2); } + SYS_UNLINKAT = 471 // { int|sys||unlinkat(int fd, const char *path, int flag); } + SYS_FUTIMENS = 472 // { int|sys||futimens(int fd, const struct timespec *tptr); } + SYS___QUOTACTL = 473 // { int|sys||__quotactl(const char *path, struct quotactl_args *args); } + SYS_POSIX_SPAWN = 474 // { int|sys||posix_spawn(pid_t *pid, const char *path, const struct posix_spawn_file_actions *file_actions, const struct posix_spawnattr *attrp, char *const *argv, char *const *envp); } + SYS_RECVMMSG = 475 // { int|sys||recvmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags, struct timespec *timeout); } + SYS_SENDMMSG = 476 // { int|sys||sendmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags); } +) diff --git a/api/vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go b/api/vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go new file mode 100644 index 0000000..aea8dbe --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go @@ -0,0 +1,274 @@ +// mksysnum_netbsd.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build amd64,netbsd + +package unix + +const ( + SYS_EXIT = 1 // { void|sys||exit(int rval); } + SYS_FORK = 2 // { int|sys||fork(void); } + SYS_READ = 3 // { ssize_t|sys||read(int fd, void *buf, size_t nbyte); } + SYS_WRITE = 4 // { ssize_t|sys||write(int fd, const void *buf, size_t nbyte); } + SYS_OPEN = 5 // { int|sys||open(const char *path, int flags, ... mode_t mode); } + SYS_CLOSE = 6 // { int|sys||close(int fd); } + SYS_LINK = 9 // { int|sys||link(const char *path, const char *link); } + SYS_UNLINK = 10 // { int|sys||unlink(const char *path); } + SYS_CHDIR = 12 // { int|sys||chdir(const char *path); } + SYS_FCHDIR = 13 // { int|sys||fchdir(int fd); } + SYS_CHMOD = 15 // { int|sys||chmod(const char *path, mode_t mode); } + SYS_CHOWN = 16 // { int|sys||chown(const char *path, uid_t uid, gid_t gid); } + SYS_BREAK = 17 // { int|sys||obreak(char *nsize); } + SYS_GETPID = 20 // { pid_t|sys||getpid_with_ppid(void); } + SYS_UNMOUNT = 22 // { int|sys||unmount(const char *path, int flags); } + SYS_SETUID = 23 // { int|sys||setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t|sys||getuid_with_euid(void); } + SYS_GETEUID = 25 // { uid_t|sys||geteuid(void); } + SYS_PTRACE = 26 // { int|sys||ptrace(int req, pid_t pid, void *addr, int data); } + SYS_RECVMSG = 27 // { ssize_t|sys||recvmsg(int s, struct msghdr *msg, int flags); } + SYS_SENDMSG = 28 // { ssize_t|sys||sendmsg(int s, const struct msghdr *msg, int flags); } + SYS_RECVFROM = 29 // { ssize_t|sys||recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlenaddr); } + SYS_ACCEPT = 30 // { int|sys||accept(int s, struct sockaddr *name, socklen_t *anamelen); } + SYS_GETPEERNAME = 31 // { int|sys||getpeername(int fdes, struct sockaddr *asa, socklen_t *alen); } + SYS_GETSOCKNAME = 32 // { int|sys||getsockname(int fdes, struct sockaddr *asa, socklen_t *alen); } + SYS_ACCESS = 33 // { int|sys||access(const char *path, int flags); } + SYS_CHFLAGS = 34 // { int|sys||chflags(const char *path, u_long flags); } + SYS_FCHFLAGS = 35 // { int|sys||fchflags(int fd, u_long flags); } + SYS_SYNC = 36 // { void|sys||sync(void); } + SYS_KILL = 37 // { int|sys||kill(pid_t pid, int signum); } + SYS_GETPPID = 39 // { pid_t|sys||getppid(void); } + SYS_DUP = 41 // { int|sys||dup(int fd); } + SYS_PIPE = 42 // { int|sys||pipe(void); } + SYS_GETEGID = 43 // { gid_t|sys||getegid(void); } + SYS_PROFIL = 44 // { int|sys||profil(char *samples, size_t size, u_long offset, u_int scale); } + SYS_KTRACE = 45 // { int|sys||ktrace(const char *fname, int ops, int facs, pid_t pid); } + SYS_GETGID = 47 // { gid_t|sys||getgid_with_egid(void); } + SYS___GETLOGIN = 49 // { int|sys||__getlogin(char *namebuf, size_t namelen); } + SYS___SETLOGIN = 50 // { int|sys||__setlogin(const char *namebuf); } + SYS_ACCT = 51 // { int|sys||acct(const char *path); } + SYS_IOCTL = 54 // { int|sys||ioctl(int fd, u_long com, ... void *data); } + SYS_REVOKE = 56 // { int|sys||revoke(const char *path); } + SYS_SYMLINK = 57 // { int|sys||symlink(const char *path, const char *link); } + SYS_READLINK = 58 // { ssize_t|sys||readlink(const char *path, char *buf, size_t count); } + SYS_EXECVE = 59 // { int|sys||execve(const char *path, char * const *argp, char * const *envp); } + SYS_UMASK = 60 // { mode_t|sys||umask(mode_t newmask); } + SYS_CHROOT = 61 // { int|sys||chroot(const char *path); } + SYS_VFORK = 66 // { int|sys||vfork(void); } + SYS_SBRK = 69 // { int|sys||sbrk(intptr_t incr); } + SYS_SSTK = 70 // { int|sys||sstk(int incr); } + SYS_VADVISE = 72 // { int|sys||ovadvise(int anom); } + SYS_MUNMAP = 73 // { int|sys||munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int|sys||mprotect(void *addr, size_t len, int prot); } + SYS_MADVISE = 75 // { int|sys||madvise(void *addr, size_t len, int behav); } + SYS_MINCORE = 78 // { int|sys||mincore(void *addr, size_t len, char *vec); } + SYS_GETGROUPS = 79 // { int|sys||getgroups(int gidsetsize, gid_t *gidset); } + SYS_SETGROUPS = 80 // { int|sys||setgroups(int gidsetsize, const gid_t *gidset); } + SYS_GETPGRP = 81 // { int|sys||getpgrp(void); } + SYS_SETPGID = 82 // { int|sys||setpgid(pid_t pid, pid_t pgid); } + SYS_DUP2 = 90 // { int|sys||dup2(int from, int to); } + SYS_FCNTL = 92 // { int|sys||fcntl(int fd, int cmd, ... void *arg); } + SYS_FSYNC = 95 // { int|sys||fsync(int fd); } + SYS_SETPRIORITY = 96 // { int|sys||setpriority(int which, id_t who, int prio); } + SYS_CONNECT = 98 // { int|sys||connect(int s, const struct sockaddr *name, socklen_t namelen); } + SYS_GETPRIORITY = 100 // { int|sys||getpriority(int which, id_t who); } + SYS_BIND = 104 // { int|sys||bind(int s, const struct sockaddr *name, socklen_t namelen); } + SYS_SETSOCKOPT = 105 // { int|sys||setsockopt(int s, int level, int name, const void *val, socklen_t valsize); } + SYS_LISTEN = 106 // { int|sys||listen(int s, int backlog); } + SYS_GETSOCKOPT = 118 // { int|sys||getsockopt(int s, int level, int name, void *val, socklen_t *avalsize); } + SYS_READV = 120 // { ssize_t|sys||readv(int fd, const struct iovec *iovp, int iovcnt); } + SYS_WRITEV = 121 // { ssize_t|sys||writev(int fd, const struct iovec *iovp, int iovcnt); } + SYS_FCHOWN = 123 // { int|sys||fchown(int fd, uid_t uid, gid_t gid); } + SYS_FCHMOD = 124 // { int|sys||fchmod(int fd, mode_t mode); } + SYS_SETREUID = 126 // { int|sys||setreuid(uid_t ruid, uid_t euid); } + SYS_SETREGID = 127 // { int|sys||setregid(gid_t rgid, gid_t egid); } + SYS_RENAME = 128 // { int|sys||rename(const char *from, const char *to); } + SYS_FLOCK = 131 // { int|sys||flock(int fd, int how); } + SYS_MKFIFO = 132 // { int|sys||mkfifo(const char *path, mode_t mode); } + SYS_SENDTO = 133 // { ssize_t|sys||sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen); } + SYS_SHUTDOWN = 134 // { int|sys||shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int|sys||socketpair(int domain, int type, int protocol, int *rsv); } + SYS_MKDIR = 136 // { int|sys||mkdir(const char *path, mode_t mode); } + SYS_RMDIR = 137 // { int|sys||rmdir(const char *path); } + SYS_SETSID = 147 // { int|sys||setsid(void); } + SYS_SYSARCH = 165 // { int|sys||sysarch(int op, void *parms); } + SYS_PREAD = 173 // { ssize_t|sys||pread(int fd, void *buf, size_t nbyte, int PAD, off_t offset); } + SYS_PWRITE = 174 // { ssize_t|sys||pwrite(int fd, const void *buf, size_t nbyte, int PAD, off_t offset); } + SYS_NTP_ADJTIME = 176 // { int|sys||ntp_adjtime(struct timex *tp); } + SYS_SETGID = 181 // { int|sys||setgid(gid_t gid); } + SYS_SETEGID = 182 // { int|sys||setegid(gid_t egid); } + SYS_SETEUID = 183 // { int|sys||seteuid(uid_t euid); } + SYS_PATHCONF = 191 // { long|sys||pathconf(const char *path, int name); } + SYS_FPATHCONF = 192 // { long|sys||fpathconf(int fd, int name); } + SYS_GETRLIMIT = 194 // { int|sys||getrlimit(int which, struct rlimit *rlp); } + SYS_SETRLIMIT = 195 // { int|sys||setrlimit(int which, const struct rlimit *rlp); } + SYS_MMAP = 197 // { void *|sys||mmap(void *addr, size_t len, int prot, int flags, int fd, long PAD, off_t pos); } + SYS_LSEEK = 199 // { off_t|sys||lseek(int fd, int PAD, off_t offset, int whence); } + SYS_TRUNCATE = 200 // { int|sys||truncate(const char *path, int PAD, off_t length); } + SYS_FTRUNCATE = 201 // { int|sys||ftruncate(int fd, int PAD, off_t length); } + SYS___SYSCTL = 202 // { int|sys||__sysctl(const int *name, u_int namelen, void *old, size_t *oldlenp, const void *new, size_t newlen); } + SYS_MLOCK = 203 // { int|sys||mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int|sys||munlock(const void *addr, size_t len); } + SYS_UNDELETE = 205 // { int|sys||undelete(const char *path); } + SYS_GETPGID = 207 // { pid_t|sys||getpgid(pid_t pid); } + SYS_REBOOT = 208 // { int|sys||reboot(int opt, char *bootstr); } + SYS_POLL = 209 // { int|sys||poll(struct pollfd *fds, u_int nfds, int timeout); } + SYS_SEMGET = 221 // { int|sys||semget(key_t key, int nsems, int semflg); } + SYS_SEMOP = 222 // { int|sys||semop(int semid, struct sembuf *sops, size_t nsops); } + SYS_SEMCONFIG = 223 // { int|sys||semconfig(int flag); } + SYS_MSGGET = 225 // { int|sys||msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int|sys||msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); } + SYS_MSGRCV = 227 // { ssize_t|sys||msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } + SYS_SHMAT = 228 // { void *|sys||shmat(int shmid, const void *shmaddr, int shmflg); } + SYS_SHMDT = 230 // { int|sys||shmdt(const void *shmaddr); } + SYS_SHMGET = 231 // { int|sys||shmget(key_t key, size_t size, int shmflg); } + SYS_TIMER_CREATE = 235 // { int|sys||timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid); } + SYS_TIMER_DELETE = 236 // { int|sys||timer_delete(timer_t timerid); } + SYS_TIMER_GETOVERRUN = 239 // { int|sys||timer_getoverrun(timer_t timerid); } + SYS_FDATASYNC = 241 // { int|sys||fdatasync(int fd); } + SYS_MLOCKALL = 242 // { int|sys||mlockall(int flags); } + SYS_MUNLOCKALL = 243 // { int|sys||munlockall(void); } + SYS_SIGQUEUEINFO = 245 // { int|sys||sigqueueinfo(pid_t pid, const siginfo_t *info); } + SYS_MODCTL = 246 // { int|sys||modctl(int cmd, void *arg); } + SYS___POSIX_RENAME = 270 // { int|sys||__posix_rename(const char *from, const char *to); } + SYS_SWAPCTL = 271 // { int|sys||swapctl(int cmd, void *arg, int misc); } + SYS_MINHERIT = 273 // { int|sys||minherit(void *addr, size_t len, int inherit); } + SYS_LCHMOD = 274 // { int|sys||lchmod(const char *path, mode_t mode); } + SYS_LCHOWN = 275 // { int|sys||lchown(const char *path, uid_t uid, gid_t gid); } + SYS_MSYNC = 277 // { int|sys|13|msync(void *addr, size_t len, int flags); } + SYS___POSIX_CHOWN = 283 // { int|sys||__posix_chown(const char *path, uid_t uid, gid_t gid); } + SYS___POSIX_FCHOWN = 284 // { int|sys||__posix_fchown(int fd, uid_t uid, gid_t gid); } + SYS___POSIX_LCHOWN = 285 // { int|sys||__posix_lchown(const char *path, uid_t uid, gid_t gid); } + SYS_GETSID = 286 // { pid_t|sys||getsid(pid_t pid); } + SYS___CLONE = 287 // { pid_t|sys||__clone(int flags, void *stack); } + SYS_FKTRACE = 288 // { int|sys||fktrace(int fd, int ops, int facs, pid_t pid); } + SYS_PREADV = 289 // { ssize_t|sys||preadv(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } + SYS_PWRITEV = 290 // { ssize_t|sys||pwritev(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } + SYS___GETCWD = 296 // { int|sys||__getcwd(char *bufp, size_t length); } + SYS_FCHROOT = 297 // { int|sys||fchroot(int fd); } + SYS_LCHFLAGS = 304 // { int|sys||lchflags(const char *path, u_long flags); } + SYS_ISSETUGID = 305 // { int|sys||issetugid(void); } + SYS_UTRACE = 306 // { int|sys||utrace(const char *label, void *addr, size_t len); } + SYS_GETCONTEXT = 307 // { int|sys||getcontext(struct __ucontext *ucp); } + SYS_SETCONTEXT = 308 // { int|sys||setcontext(const struct __ucontext *ucp); } + SYS__LWP_CREATE = 309 // { int|sys||_lwp_create(const struct __ucontext *ucp, u_long flags, lwpid_t *new_lwp); } + SYS__LWP_EXIT = 310 // { int|sys||_lwp_exit(void); } + SYS__LWP_SELF = 311 // { lwpid_t|sys||_lwp_self(void); } + SYS__LWP_WAIT = 312 // { int|sys||_lwp_wait(lwpid_t wait_for, lwpid_t *departed); } + SYS__LWP_SUSPEND = 313 // { int|sys||_lwp_suspend(lwpid_t target); } + SYS__LWP_CONTINUE = 314 // { int|sys||_lwp_continue(lwpid_t target); } + SYS__LWP_WAKEUP = 315 // { int|sys||_lwp_wakeup(lwpid_t target); } + SYS__LWP_GETPRIVATE = 316 // { void *|sys||_lwp_getprivate(void); } + SYS__LWP_SETPRIVATE = 317 // { void|sys||_lwp_setprivate(void *ptr); } + SYS__LWP_KILL = 318 // { int|sys||_lwp_kill(lwpid_t target, int signo); } + SYS__LWP_DETACH = 319 // { int|sys||_lwp_detach(lwpid_t target); } + SYS__LWP_UNPARK = 321 // { int|sys||_lwp_unpark(lwpid_t target, const void *hint); } + SYS__LWP_UNPARK_ALL = 322 // { ssize_t|sys||_lwp_unpark_all(const lwpid_t *targets, size_t ntargets, const void *hint); } + SYS__LWP_SETNAME = 323 // { int|sys||_lwp_setname(lwpid_t target, const char *name); } + SYS__LWP_GETNAME = 324 // { int|sys||_lwp_getname(lwpid_t target, char *name, size_t len); } + SYS__LWP_CTL = 325 // { int|sys||_lwp_ctl(int features, struct lwpctl **address); } + SYS___SIGACTION_SIGTRAMP = 340 // { int|sys||__sigaction_sigtramp(int signum, const struct sigaction *nsa, struct sigaction *osa, const void *tramp, int vers); } + SYS_PMC_GET_INFO = 341 // { int|sys||pmc_get_info(int ctr, int op, void *args); } + SYS_PMC_CONTROL = 342 // { int|sys||pmc_control(int ctr, int op, void *args); } + SYS_RASCTL = 343 // { int|sys||rasctl(void *addr, size_t len, int op); } + SYS_KQUEUE = 344 // { int|sys||kqueue(void); } + SYS__SCHED_SETPARAM = 346 // { int|sys||_sched_setparam(pid_t pid, lwpid_t lid, int policy, const struct sched_param *params); } + SYS__SCHED_GETPARAM = 347 // { int|sys||_sched_getparam(pid_t pid, lwpid_t lid, int *policy, struct sched_param *params); } + SYS__SCHED_SETAFFINITY = 348 // { int|sys||_sched_setaffinity(pid_t pid, lwpid_t lid, size_t size, const cpuset_t *cpuset); } + SYS__SCHED_GETAFFINITY = 349 // { int|sys||_sched_getaffinity(pid_t pid, lwpid_t lid, size_t size, cpuset_t *cpuset); } + SYS_SCHED_YIELD = 350 // { int|sys||sched_yield(void); } + SYS_FSYNC_RANGE = 354 // { int|sys||fsync_range(int fd, int flags, off_t start, off_t length); } + SYS_UUIDGEN = 355 // { int|sys||uuidgen(struct uuid *store, int count); } + SYS_GETVFSSTAT = 356 // { int|sys||getvfsstat(struct statvfs *buf, size_t bufsize, int flags); } + SYS_STATVFS1 = 357 // { int|sys||statvfs1(const char *path, struct statvfs *buf, int flags); } + SYS_FSTATVFS1 = 358 // { int|sys||fstatvfs1(int fd, struct statvfs *buf, int flags); } + SYS_EXTATTRCTL = 360 // { int|sys||extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_FILE = 361 // { int|sys||extattr_set_file(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_FILE = 362 // { ssize_t|sys||extattr_get_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FILE = 363 // { int|sys||extattr_delete_file(const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_FD = 364 // { int|sys||extattr_set_fd(int fd, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_FD = 365 // { ssize_t|sys||extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FD = 366 // { int|sys||extattr_delete_fd(int fd, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_LINK = 367 // { int|sys||extattr_set_link(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_LINK = 368 // { ssize_t|sys||extattr_get_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_LINK = 369 // { int|sys||extattr_delete_link(const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_LIST_FD = 370 // { ssize_t|sys||extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_FILE = 371 // { ssize_t|sys||extattr_list_file(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_LINK = 372 // { ssize_t|sys||extattr_list_link(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_SETXATTR = 375 // { int|sys||setxattr(const char *path, const char *name, const void *value, size_t size, int flags); } + SYS_LSETXATTR = 376 // { int|sys||lsetxattr(const char *path, const char *name, const void *value, size_t size, int flags); } + SYS_FSETXATTR = 377 // { int|sys||fsetxattr(int fd, const char *name, const void *value, size_t size, int flags); } + SYS_GETXATTR = 378 // { int|sys||getxattr(const char *path, const char *name, void *value, size_t size); } + SYS_LGETXATTR = 379 // { int|sys||lgetxattr(const char *path, const char *name, void *value, size_t size); } + SYS_FGETXATTR = 380 // { int|sys||fgetxattr(int fd, const char *name, void *value, size_t size); } + SYS_LISTXATTR = 381 // { int|sys||listxattr(const char *path, char *list, size_t size); } + SYS_LLISTXATTR = 382 // { int|sys||llistxattr(const char *path, char *list, size_t size); } + SYS_FLISTXATTR = 383 // { int|sys||flistxattr(int fd, char *list, size_t size); } + SYS_REMOVEXATTR = 384 // { int|sys||removexattr(const char *path, const char *name); } + SYS_LREMOVEXATTR = 385 // { int|sys||lremovexattr(const char *path, const char *name); } + SYS_FREMOVEXATTR = 386 // { int|sys||fremovexattr(int fd, const char *name); } + SYS_GETDENTS = 390 // { int|sys|30|getdents(int fd, char *buf, size_t count); } + SYS_SOCKET = 394 // { int|sys|30|socket(int domain, int type, int protocol); } + SYS_GETFH = 395 // { int|sys|30|getfh(const char *fname, void *fhp, size_t *fh_size); } + SYS_MOUNT = 410 // { int|sys|50|mount(const char *type, const char *path, int flags, void *data, size_t data_len); } + SYS_MREMAP = 411 // { void *|sys||mremap(void *old_address, size_t old_size, void *new_address, size_t new_size, int flags); } + SYS_PSET_CREATE = 412 // { int|sys||pset_create(psetid_t *psid); } + SYS_PSET_DESTROY = 413 // { int|sys||pset_destroy(psetid_t psid); } + SYS_PSET_ASSIGN = 414 // { int|sys||pset_assign(psetid_t psid, cpuid_t cpuid, psetid_t *opsid); } + SYS__PSET_BIND = 415 // { int|sys||_pset_bind(idtype_t idtype, id_t first_id, id_t second_id, psetid_t psid, psetid_t *opsid); } + SYS_POSIX_FADVISE = 416 // { int|sys|50|posix_fadvise(int fd, int PAD, off_t offset, off_t len, int advice); } + SYS_SELECT = 417 // { int|sys|50|select(int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval *tv); } + SYS_GETTIMEOFDAY = 418 // { int|sys|50|gettimeofday(struct timeval *tp, void *tzp); } + SYS_SETTIMEOFDAY = 419 // { int|sys|50|settimeofday(const struct timeval *tv, const void *tzp); } + SYS_UTIMES = 420 // { int|sys|50|utimes(const char *path, const struct timeval *tptr); } + SYS_ADJTIME = 421 // { int|sys|50|adjtime(const struct timeval *delta, struct timeval *olddelta); } + SYS_FUTIMES = 423 // { int|sys|50|futimes(int fd, const struct timeval *tptr); } + SYS_LUTIMES = 424 // { int|sys|50|lutimes(const char *path, const struct timeval *tptr); } + SYS_SETITIMER = 425 // { int|sys|50|setitimer(int which, const struct itimerval *itv, struct itimerval *oitv); } + SYS_GETITIMER = 426 // { int|sys|50|getitimer(int which, struct itimerval *itv); } + SYS_CLOCK_GETTIME = 427 // { int|sys|50|clock_gettime(clockid_t clock_id, struct timespec *tp); } + SYS_CLOCK_SETTIME = 428 // { int|sys|50|clock_settime(clockid_t clock_id, const struct timespec *tp); } + SYS_CLOCK_GETRES = 429 // { int|sys|50|clock_getres(clockid_t clock_id, struct timespec *tp); } + SYS_NANOSLEEP = 430 // { int|sys|50|nanosleep(const struct timespec *rqtp, struct timespec *rmtp); } + SYS___SIGTIMEDWAIT = 431 // { int|sys|50|__sigtimedwait(const sigset_t *set, siginfo_t *info, struct timespec *timeout); } + SYS__LWP_PARK = 434 // { int|sys|50|_lwp_park(const struct timespec *ts, lwpid_t unpark, const void *hint, const void *unparkhint); } + SYS_KEVENT = 435 // { int|sys|50|kevent(int fd, const struct kevent *changelist, size_t nchanges, struct kevent *eventlist, size_t nevents, const struct timespec *timeout); } + SYS_PSELECT = 436 // { int|sys|50|pselect(int nd, fd_set *in, fd_set *ou, fd_set *ex, const struct timespec *ts, const sigset_t *mask); } + SYS_POLLTS = 437 // { int|sys|50|pollts(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *mask); } + SYS_STAT = 439 // { int|sys|50|stat(const char *path, struct stat *ub); } + SYS_FSTAT = 440 // { int|sys|50|fstat(int fd, struct stat *sb); } + SYS_LSTAT = 441 // { int|sys|50|lstat(const char *path, struct stat *ub); } + SYS___SEMCTL = 442 // { int|sys|50|__semctl(int semid, int semnum, int cmd, ... union __semun *arg); } + SYS_SHMCTL = 443 // { int|sys|50|shmctl(int shmid, int cmd, struct shmid_ds *buf); } + SYS_MSGCTL = 444 // { int|sys|50|msgctl(int msqid, int cmd, struct msqid_ds *buf); } + SYS_GETRUSAGE = 445 // { int|sys|50|getrusage(int who, struct rusage *rusage); } + SYS_TIMER_SETTIME = 446 // { int|sys|50|timer_settime(timer_t timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue); } + SYS_TIMER_GETTIME = 447 // { int|sys|50|timer_gettime(timer_t timerid, struct itimerspec *value); } + SYS_NTP_GETTIME = 448 // { int|sys|50|ntp_gettime(struct ntptimeval *ntvp); } + SYS_WAIT4 = 449 // { int|sys|50|wait4(pid_t pid, int *status, int options, struct rusage *rusage); } + SYS_MKNOD = 450 // { int|sys|50|mknod(const char *path, mode_t mode, dev_t dev); } + SYS_FHSTAT = 451 // { int|sys|50|fhstat(const void *fhp, size_t fh_size, struct stat *sb); } + SYS_PIPE2 = 453 // { int|sys||pipe2(int *fildes, int flags); } + SYS_DUP3 = 454 // { int|sys||dup3(int from, int to, int flags); } + SYS_KQUEUE1 = 455 // { int|sys||kqueue1(int flags); } + SYS_PACCEPT = 456 // { int|sys||paccept(int s, struct sockaddr *name, socklen_t *anamelen, const sigset_t *mask, int flags); } + SYS_LINKAT = 457 // { int|sys||linkat(int fd1, const char *name1, int fd2, const char *name2, int flags); } + SYS_RENAMEAT = 458 // { int|sys||renameat(int fromfd, const char *from, int tofd, const char *to); } + SYS_MKFIFOAT = 459 // { int|sys||mkfifoat(int fd, const char *path, mode_t mode); } + SYS_MKNODAT = 460 // { int|sys||mknodat(int fd, const char *path, mode_t mode, uint32_t dev); } + SYS_MKDIRAT = 461 // { int|sys||mkdirat(int fd, const char *path, mode_t mode); } + SYS_FACCESSAT = 462 // { int|sys||faccessat(int fd, const char *path, int amode, int flag); } + SYS_FCHMODAT = 463 // { int|sys||fchmodat(int fd, const char *path, mode_t mode, int flag); } + SYS_FCHOWNAT = 464 // { int|sys||fchownat(int fd, const char *path, uid_t owner, gid_t group, int flag); } + SYS_FEXECVE = 465 // { int|sys||fexecve(int fd, char * const *argp, char * const *envp); } + SYS_FSTATAT = 466 // { int|sys||fstatat(int fd, const char *path, struct stat *buf, int flag); } + SYS_UTIMENSAT = 467 // { int|sys||utimensat(int fd, const char *path, const struct timespec *tptr, int flag); } + SYS_OPENAT = 468 // { int|sys||openat(int fd, const char *path, int oflags, ... mode_t mode); } + SYS_READLINKAT = 469 // { int|sys||readlinkat(int fd, const char *path, char *buf, size_t bufsize); } + SYS_SYMLINKAT = 470 // { int|sys||symlinkat(const char *path1, int fd, const char *path2); } + SYS_UNLINKAT = 471 // { int|sys||unlinkat(int fd, const char *path, int flag); } + SYS_FUTIMENS = 472 // { int|sys||futimens(int fd, const struct timespec *tptr); } + SYS___QUOTACTL = 473 // { int|sys||__quotactl(const char *path, struct quotactl_args *args); } + SYS_POSIX_SPAWN = 474 // { int|sys||posix_spawn(pid_t *pid, const char *path, const struct posix_spawn_file_actions *file_actions, const struct posix_spawnattr *attrp, char *const *argv, char *const *envp); } + SYS_RECVMMSG = 475 // { int|sys||recvmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags, struct timespec *timeout); } + SYS_SENDMMSG = 476 // { int|sys||sendmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags); } +) diff --git a/api/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go b/api/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go new file mode 100644 index 0000000..c6158a7 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go @@ -0,0 +1,274 @@ +// mksysnum_netbsd.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build arm,netbsd + +package unix + +const ( + SYS_EXIT = 1 // { void|sys||exit(int rval); } + SYS_FORK = 2 // { int|sys||fork(void); } + SYS_READ = 3 // { ssize_t|sys||read(int fd, void *buf, size_t nbyte); } + SYS_WRITE = 4 // { ssize_t|sys||write(int fd, const void *buf, size_t nbyte); } + SYS_OPEN = 5 // { int|sys||open(const char *path, int flags, ... mode_t mode); } + SYS_CLOSE = 6 // { int|sys||close(int fd); } + SYS_LINK = 9 // { int|sys||link(const char *path, const char *link); } + SYS_UNLINK = 10 // { int|sys||unlink(const char *path); } + SYS_CHDIR = 12 // { int|sys||chdir(const char *path); } + SYS_FCHDIR = 13 // { int|sys||fchdir(int fd); } + SYS_CHMOD = 15 // { int|sys||chmod(const char *path, mode_t mode); } + SYS_CHOWN = 16 // { int|sys||chown(const char *path, uid_t uid, gid_t gid); } + SYS_BREAK = 17 // { int|sys||obreak(char *nsize); } + SYS_GETPID = 20 // { pid_t|sys||getpid_with_ppid(void); } + SYS_UNMOUNT = 22 // { int|sys||unmount(const char *path, int flags); } + SYS_SETUID = 23 // { int|sys||setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t|sys||getuid_with_euid(void); } + SYS_GETEUID = 25 // { uid_t|sys||geteuid(void); } + SYS_PTRACE = 26 // { int|sys||ptrace(int req, pid_t pid, void *addr, int data); } + SYS_RECVMSG = 27 // { ssize_t|sys||recvmsg(int s, struct msghdr *msg, int flags); } + SYS_SENDMSG = 28 // { ssize_t|sys||sendmsg(int s, const struct msghdr *msg, int flags); } + SYS_RECVFROM = 29 // { ssize_t|sys||recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlenaddr); } + SYS_ACCEPT = 30 // { int|sys||accept(int s, struct sockaddr *name, socklen_t *anamelen); } + SYS_GETPEERNAME = 31 // { int|sys||getpeername(int fdes, struct sockaddr *asa, socklen_t *alen); } + SYS_GETSOCKNAME = 32 // { int|sys||getsockname(int fdes, struct sockaddr *asa, socklen_t *alen); } + SYS_ACCESS = 33 // { int|sys||access(const char *path, int flags); } + SYS_CHFLAGS = 34 // { int|sys||chflags(const char *path, u_long flags); } + SYS_FCHFLAGS = 35 // { int|sys||fchflags(int fd, u_long flags); } + SYS_SYNC = 36 // { void|sys||sync(void); } + SYS_KILL = 37 // { int|sys||kill(pid_t pid, int signum); } + SYS_GETPPID = 39 // { pid_t|sys||getppid(void); } + SYS_DUP = 41 // { int|sys||dup(int fd); } + SYS_PIPE = 42 // { int|sys||pipe(void); } + SYS_GETEGID = 43 // { gid_t|sys||getegid(void); } + SYS_PROFIL = 44 // { int|sys||profil(char *samples, size_t size, u_long offset, u_int scale); } + SYS_KTRACE = 45 // { int|sys||ktrace(const char *fname, int ops, int facs, pid_t pid); } + SYS_GETGID = 47 // { gid_t|sys||getgid_with_egid(void); } + SYS___GETLOGIN = 49 // { int|sys||__getlogin(char *namebuf, size_t namelen); } + SYS___SETLOGIN = 50 // { int|sys||__setlogin(const char *namebuf); } + SYS_ACCT = 51 // { int|sys||acct(const char *path); } + SYS_IOCTL = 54 // { int|sys||ioctl(int fd, u_long com, ... void *data); } + SYS_REVOKE = 56 // { int|sys||revoke(const char *path); } + SYS_SYMLINK = 57 // { int|sys||symlink(const char *path, const char *link); } + SYS_READLINK = 58 // { ssize_t|sys||readlink(const char *path, char *buf, size_t count); } + SYS_EXECVE = 59 // { int|sys||execve(const char *path, char * const *argp, char * const *envp); } + SYS_UMASK = 60 // { mode_t|sys||umask(mode_t newmask); } + SYS_CHROOT = 61 // { int|sys||chroot(const char *path); } + SYS_VFORK = 66 // { int|sys||vfork(void); } + SYS_SBRK = 69 // { int|sys||sbrk(intptr_t incr); } + SYS_SSTK = 70 // { int|sys||sstk(int incr); } + SYS_VADVISE = 72 // { int|sys||ovadvise(int anom); } + SYS_MUNMAP = 73 // { int|sys||munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int|sys||mprotect(void *addr, size_t len, int prot); } + SYS_MADVISE = 75 // { int|sys||madvise(void *addr, size_t len, int behav); } + SYS_MINCORE = 78 // { int|sys||mincore(void *addr, size_t len, char *vec); } + SYS_GETGROUPS = 79 // { int|sys||getgroups(int gidsetsize, gid_t *gidset); } + SYS_SETGROUPS = 80 // { int|sys||setgroups(int gidsetsize, const gid_t *gidset); } + SYS_GETPGRP = 81 // { int|sys||getpgrp(void); } + SYS_SETPGID = 82 // { int|sys||setpgid(pid_t pid, pid_t pgid); } + SYS_DUP2 = 90 // { int|sys||dup2(int from, int to); } + SYS_FCNTL = 92 // { int|sys||fcntl(int fd, int cmd, ... void *arg); } + SYS_FSYNC = 95 // { int|sys||fsync(int fd); } + SYS_SETPRIORITY = 96 // { int|sys||setpriority(int which, id_t who, int prio); } + SYS_CONNECT = 98 // { int|sys||connect(int s, const struct sockaddr *name, socklen_t namelen); } + SYS_GETPRIORITY = 100 // { int|sys||getpriority(int which, id_t who); } + SYS_BIND = 104 // { int|sys||bind(int s, const struct sockaddr *name, socklen_t namelen); } + SYS_SETSOCKOPT = 105 // { int|sys||setsockopt(int s, int level, int name, const void *val, socklen_t valsize); } + SYS_LISTEN = 106 // { int|sys||listen(int s, int backlog); } + SYS_GETSOCKOPT = 118 // { int|sys||getsockopt(int s, int level, int name, void *val, socklen_t *avalsize); } + SYS_READV = 120 // { ssize_t|sys||readv(int fd, const struct iovec *iovp, int iovcnt); } + SYS_WRITEV = 121 // { ssize_t|sys||writev(int fd, const struct iovec *iovp, int iovcnt); } + SYS_FCHOWN = 123 // { int|sys||fchown(int fd, uid_t uid, gid_t gid); } + SYS_FCHMOD = 124 // { int|sys||fchmod(int fd, mode_t mode); } + SYS_SETREUID = 126 // { int|sys||setreuid(uid_t ruid, uid_t euid); } + SYS_SETREGID = 127 // { int|sys||setregid(gid_t rgid, gid_t egid); } + SYS_RENAME = 128 // { int|sys||rename(const char *from, const char *to); } + SYS_FLOCK = 131 // { int|sys||flock(int fd, int how); } + SYS_MKFIFO = 132 // { int|sys||mkfifo(const char *path, mode_t mode); } + SYS_SENDTO = 133 // { ssize_t|sys||sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen); } + SYS_SHUTDOWN = 134 // { int|sys||shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int|sys||socketpair(int domain, int type, int protocol, int *rsv); } + SYS_MKDIR = 136 // { int|sys||mkdir(const char *path, mode_t mode); } + SYS_RMDIR = 137 // { int|sys||rmdir(const char *path); } + SYS_SETSID = 147 // { int|sys||setsid(void); } + SYS_SYSARCH = 165 // { int|sys||sysarch(int op, void *parms); } + SYS_PREAD = 173 // { ssize_t|sys||pread(int fd, void *buf, size_t nbyte, int PAD, off_t offset); } + SYS_PWRITE = 174 // { ssize_t|sys||pwrite(int fd, const void *buf, size_t nbyte, int PAD, off_t offset); } + SYS_NTP_ADJTIME = 176 // { int|sys||ntp_adjtime(struct timex *tp); } + SYS_SETGID = 181 // { int|sys||setgid(gid_t gid); } + SYS_SETEGID = 182 // { int|sys||setegid(gid_t egid); } + SYS_SETEUID = 183 // { int|sys||seteuid(uid_t euid); } + SYS_PATHCONF = 191 // { long|sys||pathconf(const char *path, int name); } + SYS_FPATHCONF = 192 // { long|sys||fpathconf(int fd, int name); } + SYS_GETRLIMIT = 194 // { int|sys||getrlimit(int which, struct rlimit *rlp); } + SYS_SETRLIMIT = 195 // { int|sys||setrlimit(int which, const struct rlimit *rlp); } + SYS_MMAP = 197 // { void *|sys||mmap(void *addr, size_t len, int prot, int flags, int fd, long PAD, off_t pos); } + SYS_LSEEK = 199 // { off_t|sys||lseek(int fd, int PAD, off_t offset, int whence); } + SYS_TRUNCATE = 200 // { int|sys||truncate(const char *path, int PAD, off_t length); } + SYS_FTRUNCATE = 201 // { int|sys||ftruncate(int fd, int PAD, off_t length); } + SYS___SYSCTL = 202 // { int|sys||__sysctl(const int *name, u_int namelen, void *old, size_t *oldlenp, const void *new, size_t newlen); } + SYS_MLOCK = 203 // { int|sys||mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int|sys||munlock(const void *addr, size_t len); } + SYS_UNDELETE = 205 // { int|sys||undelete(const char *path); } + SYS_GETPGID = 207 // { pid_t|sys||getpgid(pid_t pid); } + SYS_REBOOT = 208 // { int|sys||reboot(int opt, char *bootstr); } + SYS_POLL = 209 // { int|sys||poll(struct pollfd *fds, u_int nfds, int timeout); } + SYS_SEMGET = 221 // { int|sys||semget(key_t key, int nsems, int semflg); } + SYS_SEMOP = 222 // { int|sys||semop(int semid, struct sembuf *sops, size_t nsops); } + SYS_SEMCONFIG = 223 // { int|sys||semconfig(int flag); } + SYS_MSGGET = 225 // { int|sys||msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int|sys||msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); } + SYS_MSGRCV = 227 // { ssize_t|sys||msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } + SYS_SHMAT = 228 // { void *|sys||shmat(int shmid, const void *shmaddr, int shmflg); } + SYS_SHMDT = 230 // { int|sys||shmdt(const void *shmaddr); } + SYS_SHMGET = 231 // { int|sys||shmget(key_t key, size_t size, int shmflg); } + SYS_TIMER_CREATE = 235 // { int|sys||timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid); } + SYS_TIMER_DELETE = 236 // { int|sys||timer_delete(timer_t timerid); } + SYS_TIMER_GETOVERRUN = 239 // { int|sys||timer_getoverrun(timer_t timerid); } + SYS_FDATASYNC = 241 // { int|sys||fdatasync(int fd); } + SYS_MLOCKALL = 242 // { int|sys||mlockall(int flags); } + SYS_MUNLOCKALL = 243 // { int|sys||munlockall(void); } + SYS_SIGQUEUEINFO = 245 // { int|sys||sigqueueinfo(pid_t pid, const siginfo_t *info); } + SYS_MODCTL = 246 // { int|sys||modctl(int cmd, void *arg); } + SYS___POSIX_RENAME = 270 // { int|sys||__posix_rename(const char *from, const char *to); } + SYS_SWAPCTL = 271 // { int|sys||swapctl(int cmd, void *arg, int misc); } + SYS_MINHERIT = 273 // { int|sys||minherit(void *addr, size_t len, int inherit); } + SYS_LCHMOD = 274 // { int|sys||lchmod(const char *path, mode_t mode); } + SYS_LCHOWN = 275 // { int|sys||lchown(const char *path, uid_t uid, gid_t gid); } + SYS_MSYNC = 277 // { int|sys|13|msync(void *addr, size_t len, int flags); } + SYS___POSIX_CHOWN = 283 // { int|sys||__posix_chown(const char *path, uid_t uid, gid_t gid); } + SYS___POSIX_FCHOWN = 284 // { int|sys||__posix_fchown(int fd, uid_t uid, gid_t gid); } + SYS___POSIX_LCHOWN = 285 // { int|sys||__posix_lchown(const char *path, uid_t uid, gid_t gid); } + SYS_GETSID = 286 // { pid_t|sys||getsid(pid_t pid); } + SYS___CLONE = 287 // { pid_t|sys||__clone(int flags, void *stack); } + SYS_FKTRACE = 288 // { int|sys||fktrace(int fd, int ops, int facs, pid_t pid); } + SYS_PREADV = 289 // { ssize_t|sys||preadv(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } + SYS_PWRITEV = 290 // { ssize_t|sys||pwritev(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } + SYS___GETCWD = 296 // { int|sys||__getcwd(char *bufp, size_t length); } + SYS_FCHROOT = 297 // { int|sys||fchroot(int fd); } + SYS_LCHFLAGS = 304 // { int|sys||lchflags(const char *path, u_long flags); } + SYS_ISSETUGID = 305 // { int|sys||issetugid(void); } + SYS_UTRACE = 306 // { int|sys||utrace(const char *label, void *addr, size_t len); } + SYS_GETCONTEXT = 307 // { int|sys||getcontext(struct __ucontext *ucp); } + SYS_SETCONTEXT = 308 // { int|sys||setcontext(const struct __ucontext *ucp); } + SYS__LWP_CREATE = 309 // { int|sys||_lwp_create(const struct __ucontext *ucp, u_long flags, lwpid_t *new_lwp); } + SYS__LWP_EXIT = 310 // { int|sys||_lwp_exit(void); } + SYS__LWP_SELF = 311 // { lwpid_t|sys||_lwp_self(void); } + SYS__LWP_WAIT = 312 // { int|sys||_lwp_wait(lwpid_t wait_for, lwpid_t *departed); } + SYS__LWP_SUSPEND = 313 // { int|sys||_lwp_suspend(lwpid_t target); } + SYS__LWP_CONTINUE = 314 // { int|sys||_lwp_continue(lwpid_t target); } + SYS__LWP_WAKEUP = 315 // { int|sys||_lwp_wakeup(lwpid_t target); } + SYS__LWP_GETPRIVATE = 316 // { void *|sys||_lwp_getprivate(void); } + SYS__LWP_SETPRIVATE = 317 // { void|sys||_lwp_setprivate(void *ptr); } + SYS__LWP_KILL = 318 // { int|sys||_lwp_kill(lwpid_t target, int signo); } + SYS__LWP_DETACH = 319 // { int|sys||_lwp_detach(lwpid_t target); } + SYS__LWP_UNPARK = 321 // { int|sys||_lwp_unpark(lwpid_t target, const void *hint); } + SYS__LWP_UNPARK_ALL = 322 // { ssize_t|sys||_lwp_unpark_all(const lwpid_t *targets, size_t ntargets, const void *hint); } + SYS__LWP_SETNAME = 323 // { int|sys||_lwp_setname(lwpid_t target, const char *name); } + SYS__LWP_GETNAME = 324 // { int|sys||_lwp_getname(lwpid_t target, char *name, size_t len); } + SYS__LWP_CTL = 325 // { int|sys||_lwp_ctl(int features, struct lwpctl **address); } + SYS___SIGACTION_SIGTRAMP = 340 // { int|sys||__sigaction_sigtramp(int signum, const struct sigaction *nsa, struct sigaction *osa, const void *tramp, int vers); } + SYS_PMC_GET_INFO = 341 // { int|sys||pmc_get_info(int ctr, int op, void *args); } + SYS_PMC_CONTROL = 342 // { int|sys||pmc_control(int ctr, int op, void *args); } + SYS_RASCTL = 343 // { int|sys||rasctl(void *addr, size_t len, int op); } + SYS_KQUEUE = 344 // { int|sys||kqueue(void); } + SYS__SCHED_SETPARAM = 346 // { int|sys||_sched_setparam(pid_t pid, lwpid_t lid, int policy, const struct sched_param *params); } + SYS__SCHED_GETPARAM = 347 // { int|sys||_sched_getparam(pid_t pid, lwpid_t lid, int *policy, struct sched_param *params); } + SYS__SCHED_SETAFFINITY = 348 // { int|sys||_sched_setaffinity(pid_t pid, lwpid_t lid, size_t size, const cpuset_t *cpuset); } + SYS__SCHED_GETAFFINITY = 349 // { int|sys||_sched_getaffinity(pid_t pid, lwpid_t lid, size_t size, cpuset_t *cpuset); } + SYS_SCHED_YIELD = 350 // { int|sys||sched_yield(void); } + SYS_FSYNC_RANGE = 354 // { int|sys||fsync_range(int fd, int flags, off_t start, off_t length); } + SYS_UUIDGEN = 355 // { int|sys||uuidgen(struct uuid *store, int count); } + SYS_GETVFSSTAT = 356 // { int|sys||getvfsstat(struct statvfs *buf, size_t bufsize, int flags); } + SYS_STATVFS1 = 357 // { int|sys||statvfs1(const char *path, struct statvfs *buf, int flags); } + SYS_FSTATVFS1 = 358 // { int|sys||fstatvfs1(int fd, struct statvfs *buf, int flags); } + SYS_EXTATTRCTL = 360 // { int|sys||extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_FILE = 361 // { int|sys||extattr_set_file(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_FILE = 362 // { ssize_t|sys||extattr_get_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FILE = 363 // { int|sys||extattr_delete_file(const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_FD = 364 // { int|sys||extattr_set_fd(int fd, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_FD = 365 // { ssize_t|sys||extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FD = 366 // { int|sys||extattr_delete_fd(int fd, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_LINK = 367 // { int|sys||extattr_set_link(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_LINK = 368 // { ssize_t|sys||extattr_get_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_LINK = 369 // { int|sys||extattr_delete_link(const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_LIST_FD = 370 // { ssize_t|sys||extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_FILE = 371 // { ssize_t|sys||extattr_list_file(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_LINK = 372 // { ssize_t|sys||extattr_list_link(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_SETXATTR = 375 // { int|sys||setxattr(const char *path, const char *name, const void *value, size_t size, int flags); } + SYS_LSETXATTR = 376 // { int|sys||lsetxattr(const char *path, const char *name, const void *value, size_t size, int flags); } + SYS_FSETXATTR = 377 // { int|sys||fsetxattr(int fd, const char *name, const void *value, size_t size, int flags); } + SYS_GETXATTR = 378 // { int|sys||getxattr(const char *path, const char *name, void *value, size_t size); } + SYS_LGETXATTR = 379 // { int|sys||lgetxattr(const char *path, const char *name, void *value, size_t size); } + SYS_FGETXATTR = 380 // { int|sys||fgetxattr(int fd, const char *name, void *value, size_t size); } + SYS_LISTXATTR = 381 // { int|sys||listxattr(const char *path, char *list, size_t size); } + SYS_LLISTXATTR = 382 // { int|sys||llistxattr(const char *path, char *list, size_t size); } + SYS_FLISTXATTR = 383 // { int|sys||flistxattr(int fd, char *list, size_t size); } + SYS_REMOVEXATTR = 384 // { int|sys||removexattr(const char *path, const char *name); } + SYS_LREMOVEXATTR = 385 // { int|sys||lremovexattr(const char *path, const char *name); } + SYS_FREMOVEXATTR = 386 // { int|sys||fremovexattr(int fd, const char *name); } + SYS_GETDENTS = 390 // { int|sys|30|getdents(int fd, char *buf, size_t count); } + SYS_SOCKET = 394 // { int|sys|30|socket(int domain, int type, int protocol); } + SYS_GETFH = 395 // { int|sys|30|getfh(const char *fname, void *fhp, size_t *fh_size); } + SYS_MOUNT = 410 // { int|sys|50|mount(const char *type, const char *path, int flags, void *data, size_t data_len); } + SYS_MREMAP = 411 // { void *|sys||mremap(void *old_address, size_t old_size, void *new_address, size_t new_size, int flags); } + SYS_PSET_CREATE = 412 // { int|sys||pset_create(psetid_t *psid); } + SYS_PSET_DESTROY = 413 // { int|sys||pset_destroy(psetid_t psid); } + SYS_PSET_ASSIGN = 414 // { int|sys||pset_assign(psetid_t psid, cpuid_t cpuid, psetid_t *opsid); } + SYS__PSET_BIND = 415 // { int|sys||_pset_bind(idtype_t idtype, id_t first_id, id_t second_id, psetid_t psid, psetid_t *opsid); } + SYS_POSIX_FADVISE = 416 // { int|sys|50|posix_fadvise(int fd, int PAD, off_t offset, off_t len, int advice); } + SYS_SELECT = 417 // { int|sys|50|select(int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval *tv); } + SYS_GETTIMEOFDAY = 418 // { int|sys|50|gettimeofday(struct timeval *tp, void *tzp); } + SYS_SETTIMEOFDAY = 419 // { int|sys|50|settimeofday(const struct timeval *tv, const void *tzp); } + SYS_UTIMES = 420 // { int|sys|50|utimes(const char *path, const struct timeval *tptr); } + SYS_ADJTIME = 421 // { int|sys|50|adjtime(const struct timeval *delta, struct timeval *olddelta); } + SYS_FUTIMES = 423 // { int|sys|50|futimes(int fd, const struct timeval *tptr); } + SYS_LUTIMES = 424 // { int|sys|50|lutimes(const char *path, const struct timeval *tptr); } + SYS_SETITIMER = 425 // { int|sys|50|setitimer(int which, const struct itimerval *itv, struct itimerval *oitv); } + SYS_GETITIMER = 426 // { int|sys|50|getitimer(int which, struct itimerval *itv); } + SYS_CLOCK_GETTIME = 427 // { int|sys|50|clock_gettime(clockid_t clock_id, struct timespec *tp); } + SYS_CLOCK_SETTIME = 428 // { int|sys|50|clock_settime(clockid_t clock_id, const struct timespec *tp); } + SYS_CLOCK_GETRES = 429 // { int|sys|50|clock_getres(clockid_t clock_id, struct timespec *tp); } + SYS_NANOSLEEP = 430 // { int|sys|50|nanosleep(const struct timespec *rqtp, struct timespec *rmtp); } + SYS___SIGTIMEDWAIT = 431 // { int|sys|50|__sigtimedwait(const sigset_t *set, siginfo_t *info, struct timespec *timeout); } + SYS__LWP_PARK = 434 // { int|sys|50|_lwp_park(const struct timespec *ts, lwpid_t unpark, const void *hint, const void *unparkhint); } + SYS_KEVENT = 435 // { int|sys|50|kevent(int fd, const struct kevent *changelist, size_t nchanges, struct kevent *eventlist, size_t nevents, const struct timespec *timeout); } + SYS_PSELECT = 436 // { int|sys|50|pselect(int nd, fd_set *in, fd_set *ou, fd_set *ex, const struct timespec *ts, const sigset_t *mask); } + SYS_POLLTS = 437 // { int|sys|50|pollts(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *mask); } + SYS_STAT = 439 // { int|sys|50|stat(const char *path, struct stat *ub); } + SYS_FSTAT = 440 // { int|sys|50|fstat(int fd, struct stat *sb); } + SYS_LSTAT = 441 // { int|sys|50|lstat(const char *path, struct stat *ub); } + SYS___SEMCTL = 442 // { int|sys|50|__semctl(int semid, int semnum, int cmd, ... union __semun *arg); } + SYS_SHMCTL = 443 // { int|sys|50|shmctl(int shmid, int cmd, struct shmid_ds *buf); } + SYS_MSGCTL = 444 // { int|sys|50|msgctl(int msqid, int cmd, struct msqid_ds *buf); } + SYS_GETRUSAGE = 445 // { int|sys|50|getrusage(int who, struct rusage *rusage); } + SYS_TIMER_SETTIME = 446 // { int|sys|50|timer_settime(timer_t timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue); } + SYS_TIMER_GETTIME = 447 // { int|sys|50|timer_gettime(timer_t timerid, struct itimerspec *value); } + SYS_NTP_GETTIME = 448 // { int|sys|50|ntp_gettime(struct ntptimeval *ntvp); } + SYS_WAIT4 = 449 // { int|sys|50|wait4(pid_t pid, int *status, int options, struct rusage *rusage); } + SYS_MKNOD = 450 // { int|sys|50|mknod(const char *path, mode_t mode, dev_t dev); } + SYS_FHSTAT = 451 // { int|sys|50|fhstat(const void *fhp, size_t fh_size, struct stat *sb); } + SYS_PIPE2 = 453 // { int|sys||pipe2(int *fildes, int flags); } + SYS_DUP3 = 454 // { int|sys||dup3(int from, int to, int flags); } + SYS_KQUEUE1 = 455 // { int|sys||kqueue1(int flags); } + SYS_PACCEPT = 456 // { int|sys||paccept(int s, struct sockaddr *name, socklen_t *anamelen, const sigset_t *mask, int flags); } + SYS_LINKAT = 457 // { int|sys||linkat(int fd1, const char *name1, int fd2, const char *name2, int flags); } + SYS_RENAMEAT = 458 // { int|sys||renameat(int fromfd, const char *from, int tofd, const char *to); } + SYS_MKFIFOAT = 459 // { int|sys||mkfifoat(int fd, const char *path, mode_t mode); } + SYS_MKNODAT = 460 // { int|sys||mknodat(int fd, const char *path, mode_t mode, uint32_t dev); } + SYS_MKDIRAT = 461 // { int|sys||mkdirat(int fd, const char *path, mode_t mode); } + SYS_FACCESSAT = 462 // { int|sys||faccessat(int fd, const char *path, int amode, int flag); } + SYS_FCHMODAT = 463 // { int|sys||fchmodat(int fd, const char *path, mode_t mode, int flag); } + SYS_FCHOWNAT = 464 // { int|sys||fchownat(int fd, const char *path, uid_t owner, gid_t group, int flag); } + SYS_FEXECVE = 465 // { int|sys||fexecve(int fd, char * const *argp, char * const *envp); } + SYS_FSTATAT = 466 // { int|sys||fstatat(int fd, const char *path, struct stat *buf, int flag); } + SYS_UTIMENSAT = 467 // { int|sys||utimensat(int fd, const char *path, const struct timespec *tptr, int flag); } + SYS_OPENAT = 468 // { int|sys||openat(int fd, const char *path, int oflags, ... mode_t mode); } + SYS_READLINKAT = 469 // { int|sys||readlinkat(int fd, const char *path, char *buf, size_t bufsize); } + SYS_SYMLINKAT = 470 // { int|sys||symlinkat(const char *path1, int fd, const char *path2); } + SYS_UNLINKAT = 471 // { int|sys||unlinkat(int fd, const char *path, int flag); } + SYS_FUTIMENS = 472 // { int|sys||futimens(int fd, const struct timespec *tptr); } + SYS___QUOTACTL = 473 // { int|sys||__quotactl(const char *path, struct quotactl_args *args); } + SYS_POSIX_SPAWN = 474 // { int|sys||posix_spawn(pid_t *pid, const char *path, const struct posix_spawn_file_actions *file_actions, const struct posix_spawnattr *attrp, char *const *argv, char *const *envp); } + SYS_RECVMMSG = 475 // { int|sys||recvmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags, struct timespec *timeout); } + SYS_SENDMMSG = 476 // { int|sys||sendmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags); } +) diff --git a/api/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go b/api/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go new file mode 100644 index 0000000..3e8ce2a --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go @@ -0,0 +1,207 @@ +// mksysnum_openbsd.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build 386,openbsd + +package unix + +const ( + SYS_EXIT = 1 // { void sys_exit(int rval); } + SYS_FORK = 2 // { int sys_fork(void); } + SYS_READ = 3 // { ssize_t sys_read(int fd, void *buf, size_t nbyte); } + SYS_WRITE = 4 // { ssize_t sys_write(int fd, const void *buf, \ + SYS_OPEN = 5 // { int sys_open(const char *path, \ + SYS_CLOSE = 6 // { int sys_close(int fd); } + SYS___TFORK = 8 // { int sys___tfork(const struct __tfork *param, \ + SYS_LINK = 9 // { int sys_link(const char *path, const char *link); } + SYS_UNLINK = 10 // { int sys_unlink(const char *path); } + SYS_WAIT4 = 11 // { pid_t sys_wait4(pid_t pid, int *status, \ + SYS_CHDIR = 12 // { int sys_chdir(const char *path); } + SYS_FCHDIR = 13 // { int sys_fchdir(int fd); } + SYS_MKNOD = 14 // { int sys_mknod(const char *path, mode_t mode, \ + SYS_CHMOD = 15 // { int sys_chmod(const char *path, mode_t mode); } + SYS_CHOWN = 16 // { int sys_chown(const char *path, uid_t uid, \ + SYS_OBREAK = 17 // { int sys_obreak(char *nsize); } break + SYS_GETDTABLECOUNT = 18 // { int sys_getdtablecount(void); } + SYS_GETRUSAGE = 19 // { int sys_getrusage(int who, \ + SYS_GETPID = 20 // { pid_t sys_getpid(void); } + SYS_MOUNT = 21 // { int sys_mount(const char *type, const char *path, \ + SYS_UNMOUNT = 22 // { int sys_unmount(const char *path, int flags); } + SYS_SETUID = 23 // { int sys_setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t sys_getuid(void); } + SYS_GETEUID = 25 // { uid_t sys_geteuid(void); } + SYS_PTRACE = 26 // { int sys_ptrace(int req, pid_t pid, caddr_t addr, \ + SYS_RECVMSG = 27 // { ssize_t sys_recvmsg(int s, struct msghdr *msg, \ + SYS_SENDMSG = 28 // { ssize_t sys_sendmsg(int s, \ + SYS_RECVFROM = 29 // { ssize_t sys_recvfrom(int s, void *buf, size_t len, \ + SYS_ACCEPT = 30 // { int sys_accept(int s, struct sockaddr *name, \ + SYS_GETPEERNAME = 31 // { int sys_getpeername(int fdes, struct sockaddr *asa, \ + SYS_GETSOCKNAME = 32 // { int sys_getsockname(int fdes, struct sockaddr *asa, \ + SYS_ACCESS = 33 // { int sys_access(const char *path, int flags); } + SYS_CHFLAGS = 34 // { int sys_chflags(const char *path, u_int flags); } + SYS_FCHFLAGS = 35 // { int sys_fchflags(int fd, u_int flags); } + SYS_SYNC = 36 // { void sys_sync(void); } + SYS_KILL = 37 // { int sys_kill(int pid, int signum); } + SYS_STAT = 38 // { int sys_stat(const char *path, struct stat *ub); } + SYS_GETPPID = 39 // { pid_t sys_getppid(void); } + SYS_LSTAT = 40 // { int sys_lstat(const char *path, struct stat *ub); } + SYS_DUP = 41 // { int sys_dup(int fd); } + SYS_FSTATAT = 42 // { int sys_fstatat(int fd, const char *path, \ + SYS_GETEGID = 43 // { gid_t sys_getegid(void); } + SYS_PROFIL = 44 // { int sys_profil(caddr_t samples, size_t size, \ + SYS_KTRACE = 45 // { int sys_ktrace(const char *fname, int ops, \ + SYS_SIGACTION = 46 // { int sys_sigaction(int signum, \ + SYS_GETGID = 47 // { gid_t sys_getgid(void); } + SYS_SIGPROCMASK = 48 // { int sys_sigprocmask(int how, sigset_t mask); } + SYS_GETLOGIN = 49 // { int sys_getlogin(char *namebuf, u_int namelen); } + SYS_SETLOGIN = 50 // { int sys_setlogin(const char *namebuf); } + SYS_ACCT = 51 // { int sys_acct(const char *path); } + SYS_SIGPENDING = 52 // { int sys_sigpending(void); } + SYS_FSTAT = 53 // { int sys_fstat(int fd, struct stat *sb); } + SYS_IOCTL = 54 // { int sys_ioctl(int fd, \ + SYS_REBOOT = 55 // { int sys_reboot(int opt); } + SYS_REVOKE = 56 // { int sys_revoke(const char *path); } + SYS_SYMLINK = 57 // { int sys_symlink(const char *path, \ + SYS_READLINK = 58 // { int sys_readlink(const char *path, char *buf, \ + SYS_EXECVE = 59 // { int sys_execve(const char *path, \ + SYS_UMASK = 60 // { mode_t sys_umask(mode_t newmask); } + SYS_CHROOT = 61 // { int sys_chroot(const char *path); } + SYS_GETFSSTAT = 62 // { int sys_getfsstat(struct statfs *buf, size_t bufsize, \ + SYS_STATFS = 63 // { int sys_statfs(const char *path, \ + SYS_FSTATFS = 64 // { int sys_fstatfs(int fd, struct statfs *buf); } + SYS_FHSTATFS = 65 // { int sys_fhstatfs(const fhandle_t *fhp, \ + SYS_VFORK = 66 // { int sys_vfork(void); } + SYS_GETTIMEOFDAY = 67 // { int sys_gettimeofday(struct timeval *tp, \ + SYS_SETTIMEOFDAY = 68 // { int sys_settimeofday(const struct timeval *tv, \ + SYS_SETITIMER = 69 // { int sys_setitimer(int which, \ + SYS_GETITIMER = 70 // { int sys_getitimer(int which, \ + SYS_SELECT = 71 // { int sys_select(int nd, fd_set *in, fd_set *ou, \ + SYS_KEVENT = 72 // { int sys_kevent(int fd, \ + SYS_MUNMAP = 73 // { int sys_munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int sys_mprotect(void *addr, size_t len, \ + SYS_MADVISE = 75 // { int sys_madvise(void *addr, size_t len, \ + SYS_UTIMES = 76 // { int sys_utimes(const char *path, \ + SYS_FUTIMES = 77 // { int sys_futimes(int fd, \ + SYS_MINCORE = 78 // { int sys_mincore(void *addr, size_t len, \ + SYS_GETGROUPS = 79 // { int sys_getgroups(int gidsetsize, \ + SYS_SETGROUPS = 80 // { int sys_setgroups(int gidsetsize, \ + SYS_GETPGRP = 81 // { int sys_getpgrp(void); } + SYS_SETPGID = 82 // { int sys_setpgid(pid_t pid, int pgid); } + SYS_UTIMENSAT = 84 // { int sys_utimensat(int fd, const char *path, \ + SYS_FUTIMENS = 85 // { int sys_futimens(int fd, \ + SYS_CLOCK_GETTIME = 87 // { int sys_clock_gettime(clockid_t clock_id, \ + SYS_CLOCK_SETTIME = 88 // { int sys_clock_settime(clockid_t clock_id, \ + SYS_CLOCK_GETRES = 89 // { int sys_clock_getres(clockid_t clock_id, \ + SYS_DUP2 = 90 // { int sys_dup2(int from, int to); } + SYS_NANOSLEEP = 91 // { int sys_nanosleep(const struct timespec *rqtp, \ + SYS_FCNTL = 92 // { int sys_fcntl(int fd, int cmd, ... void *arg); } + SYS___THRSLEEP = 94 // { int sys___thrsleep(const volatile void *ident, \ + SYS_FSYNC = 95 // { int sys_fsync(int fd); } + SYS_SETPRIORITY = 96 // { int sys_setpriority(int which, id_t who, int prio); } + SYS_SOCKET = 97 // { int sys_socket(int domain, int type, int protocol); } + SYS_CONNECT = 98 // { int sys_connect(int s, const struct sockaddr *name, \ + SYS_GETDENTS = 99 // { int sys_getdents(int fd, void *buf, size_t buflen); } + SYS_GETPRIORITY = 100 // { int sys_getpriority(int which, id_t who); } + SYS_SIGRETURN = 103 // { int sys_sigreturn(struct sigcontext *sigcntxp); } + SYS_BIND = 104 // { int sys_bind(int s, const struct sockaddr *name, \ + SYS_SETSOCKOPT = 105 // { int sys_setsockopt(int s, int level, int name, \ + SYS_LISTEN = 106 // { int sys_listen(int s, int backlog); } + SYS_PPOLL = 109 // { int sys_ppoll(struct pollfd *fds, \ + SYS_PSELECT = 110 // { int sys_pselect(int nd, fd_set *in, fd_set *ou, \ + SYS_SIGSUSPEND = 111 // { int sys_sigsuspend(int mask); } + SYS_GETSOCKOPT = 118 // { int sys_getsockopt(int s, int level, int name, \ + SYS_READV = 120 // { ssize_t sys_readv(int fd, \ + SYS_WRITEV = 121 // { ssize_t sys_writev(int fd, \ + SYS_FCHOWN = 123 // { int sys_fchown(int fd, uid_t uid, gid_t gid); } + SYS_FCHMOD = 124 // { int sys_fchmod(int fd, mode_t mode); } + SYS_SETREUID = 126 // { int sys_setreuid(uid_t ruid, uid_t euid); } + SYS_SETREGID = 127 // { int sys_setregid(gid_t rgid, gid_t egid); } + SYS_RENAME = 128 // { int sys_rename(const char *from, const char *to); } + SYS_FLOCK = 131 // { int sys_flock(int fd, int how); } + SYS_MKFIFO = 132 // { int sys_mkfifo(const char *path, mode_t mode); } + SYS_SENDTO = 133 // { ssize_t sys_sendto(int s, const void *buf, \ + SYS_SHUTDOWN = 134 // { int sys_shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int sys_socketpair(int domain, int type, \ + SYS_MKDIR = 136 // { int sys_mkdir(const char *path, mode_t mode); } + SYS_RMDIR = 137 // { int sys_rmdir(const char *path); } + SYS_ADJTIME = 140 // { int sys_adjtime(const struct timeval *delta, \ + SYS_SETSID = 147 // { int sys_setsid(void); } + SYS_QUOTACTL = 148 // { int sys_quotactl(const char *path, int cmd, \ + SYS_NFSSVC = 155 // { int sys_nfssvc(int flag, void *argp); } + SYS_GETFH = 161 // { int sys_getfh(const char *fname, fhandle_t *fhp); } + SYS_SYSARCH = 165 // { int sys_sysarch(int op, void *parms); } + SYS_PREAD = 173 // { ssize_t sys_pread(int fd, void *buf, \ + SYS_PWRITE = 174 // { ssize_t sys_pwrite(int fd, const void *buf, \ + SYS_SETGID = 181 // { int sys_setgid(gid_t gid); } + SYS_SETEGID = 182 // { int sys_setegid(gid_t egid); } + SYS_SETEUID = 183 // { int sys_seteuid(uid_t euid); } + SYS_PATHCONF = 191 // { long sys_pathconf(const char *path, int name); } + SYS_FPATHCONF = 192 // { long sys_fpathconf(int fd, int name); } + SYS_SWAPCTL = 193 // { int sys_swapctl(int cmd, const void *arg, int misc); } + SYS_GETRLIMIT = 194 // { int sys_getrlimit(int which, \ + SYS_SETRLIMIT = 195 // { int sys_setrlimit(int which, \ + SYS_MMAP = 197 // { void *sys_mmap(void *addr, size_t len, int prot, \ + SYS_LSEEK = 199 // { off_t sys_lseek(int fd, int pad, off_t offset, \ + SYS_TRUNCATE = 200 // { int sys_truncate(const char *path, int pad, \ + SYS_FTRUNCATE = 201 // { int sys_ftruncate(int fd, int pad, off_t length); } + SYS___SYSCTL = 202 // { int sys___sysctl(const int *name, u_int namelen, \ + SYS_MLOCK = 203 // { int sys_mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int sys_munlock(const void *addr, size_t len); } + SYS_GETPGID = 207 // { pid_t sys_getpgid(pid_t pid); } + SYS_UTRACE = 209 // { int sys_utrace(const char *label, const void *addr, \ + SYS_SEMGET = 221 // { int sys_semget(key_t key, int nsems, int semflg); } + SYS_MSGGET = 225 // { int sys_msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int sys_msgsnd(int msqid, const void *msgp, size_t msgsz, \ + SYS_MSGRCV = 227 // { int sys_msgrcv(int msqid, void *msgp, size_t msgsz, \ + SYS_SHMAT = 228 // { void *sys_shmat(int shmid, const void *shmaddr, \ + SYS_SHMDT = 230 // { int sys_shmdt(const void *shmaddr); } + SYS_MINHERIT = 250 // { int sys_minherit(void *addr, size_t len, \ + SYS_POLL = 252 // { int sys_poll(struct pollfd *fds, \ + SYS_ISSETUGID = 253 // { int sys_issetugid(void); } + SYS_LCHOWN = 254 // { int sys_lchown(const char *path, uid_t uid, gid_t gid); } + SYS_GETSID = 255 // { pid_t sys_getsid(pid_t pid); } + SYS_MSYNC = 256 // { int sys_msync(void *addr, size_t len, int flags); } + SYS_PIPE = 263 // { int sys_pipe(int *fdp); } + SYS_FHOPEN = 264 // { int sys_fhopen(const fhandle_t *fhp, int flags); } + SYS_PREADV = 267 // { ssize_t sys_preadv(int fd, \ + SYS_PWRITEV = 268 // { ssize_t sys_pwritev(int fd, \ + SYS_KQUEUE = 269 // { int sys_kqueue(void); } + SYS_MLOCKALL = 271 // { int sys_mlockall(int flags); } + SYS_MUNLOCKALL = 272 // { int sys_munlockall(void); } + SYS_GETRESUID = 281 // { int sys_getresuid(uid_t *ruid, uid_t *euid, \ + SYS_SETRESUID = 282 // { int sys_setresuid(uid_t ruid, uid_t euid, \ + SYS_GETRESGID = 283 // { int sys_getresgid(gid_t *rgid, gid_t *egid, \ + SYS_SETRESGID = 284 // { int sys_setresgid(gid_t rgid, gid_t egid, \ + SYS_MQUERY = 286 // { void *sys_mquery(void *addr, size_t len, int prot, \ + SYS_CLOSEFROM = 287 // { int sys_closefrom(int fd); } + SYS_SIGALTSTACK = 288 // { int sys_sigaltstack(const struct sigaltstack *nss, \ + SYS_SHMGET = 289 // { int sys_shmget(key_t key, size_t size, int shmflg); } + SYS_SEMOP = 290 // { int sys_semop(int semid, struct sembuf *sops, \ + SYS_FHSTAT = 294 // { int sys_fhstat(const fhandle_t *fhp, \ + SYS___SEMCTL = 295 // { int sys___semctl(int semid, int semnum, int cmd, \ + SYS_SHMCTL = 296 // { int sys_shmctl(int shmid, int cmd, \ + SYS_MSGCTL = 297 // { int sys_msgctl(int msqid, int cmd, \ + SYS_SCHED_YIELD = 298 // { int sys_sched_yield(void); } + SYS_GETTHRID = 299 // { pid_t sys_getthrid(void); } + SYS___THRWAKEUP = 301 // { int sys___thrwakeup(const volatile void *ident, \ + SYS___THREXIT = 302 // { void sys___threxit(pid_t *notdead); } + SYS___THRSIGDIVERT = 303 // { int sys___thrsigdivert(sigset_t sigmask, \ + SYS___GETCWD = 304 // { int sys___getcwd(char *buf, size_t len); } + SYS_ADJFREQ = 305 // { int sys_adjfreq(const int64_t *freq, \ + SYS_SETRTABLE = 310 // { int sys_setrtable(int rtableid); } + SYS_GETRTABLE = 311 // { int sys_getrtable(void); } + SYS_FACCESSAT = 313 // { int sys_faccessat(int fd, const char *path, \ + SYS_FCHMODAT = 314 // { int sys_fchmodat(int fd, const char *path, \ + SYS_FCHOWNAT = 315 // { int sys_fchownat(int fd, const char *path, \ + SYS_LINKAT = 317 // { int sys_linkat(int fd1, const char *path1, int fd2, \ + SYS_MKDIRAT = 318 // { int sys_mkdirat(int fd, const char *path, \ + SYS_MKFIFOAT = 319 // { int sys_mkfifoat(int fd, const char *path, \ + SYS_MKNODAT = 320 // { int sys_mknodat(int fd, const char *path, \ + SYS_OPENAT = 321 // { int sys_openat(int fd, const char *path, int flags, \ + SYS_READLINKAT = 322 // { ssize_t sys_readlinkat(int fd, const char *path, \ + SYS_RENAMEAT = 323 // { int sys_renameat(int fromfd, const char *from, \ + SYS_SYMLINKAT = 324 // { int sys_symlinkat(const char *path, int fd, \ + SYS_UNLINKAT = 325 // { int sys_unlinkat(int fd, const char *path, \ + SYS___SET_TCB = 329 // { void sys___set_tcb(void *tcb); } + SYS___GET_TCB = 330 // { void *sys___get_tcb(void); } +) diff --git a/api/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go b/api/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go new file mode 100644 index 0000000..10edff0 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go @@ -0,0 +1,217 @@ +// mksysnum_openbsd.pl +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,openbsd + +package unix + +const ( + SYS_EXIT = 1 // { void sys_exit(int rval); } + SYS_FORK = 2 // { int sys_fork(void); } + SYS_READ = 3 // { ssize_t sys_read(int fd, void *buf, size_t nbyte); } + SYS_WRITE = 4 // { ssize_t sys_write(int fd, const void *buf, \ + SYS_OPEN = 5 // { int sys_open(const char *path, \ + SYS_CLOSE = 6 // { int sys_close(int fd); } + SYS_GETENTROPY = 7 // { int sys_getentropy(void *buf, size_t nbyte); } + SYS___TFORK = 8 // { int sys___tfork(const struct __tfork *param, \ + SYS_LINK = 9 // { int sys_link(const char *path, const char *link); } + SYS_UNLINK = 10 // { int sys_unlink(const char *path); } + SYS_WAIT4 = 11 // { pid_t sys_wait4(pid_t pid, int *status, \ + SYS_CHDIR = 12 // { int sys_chdir(const char *path); } + SYS_FCHDIR = 13 // { int sys_fchdir(int fd); } + SYS_MKNOD = 14 // { int sys_mknod(const char *path, mode_t mode, \ + SYS_CHMOD = 15 // { int sys_chmod(const char *path, mode_t mode); } + SYS_CHOWN = 16 // { int sys_chown(const char *path, uid_t uid, \ + SYS_OBREAK = 17 // { int sys_obreak(char *nsize); } break + SYS_GETDTABLECOUNT = 18 // { int sys_getdtablecount(void); } + SYS_GETRUSAGE = 19 // { int sys_getrusage(int who, \ + SYS_GETPID = 20 // { pid_t sys_getpid(void); } + SYS_MOUNT = 21 // { int sys_mount(const char *type, const char *path, \ + SYS_UNMOUNT = 22 // { int sys_unmount(const char *path, int flags); } + SYS_SETUID = 23 // { int sys_setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t sys_getuid(void); } + SYS_GETEUID = 25 // { uid_t sys_geteuid(void); } + SYS_PTRACE = 26 // { int sys_ptrace(int req, pid_t pid, caddr_t addr, \ + SYS_RECVMSG = 27 // { ssize_t sys_recvmsg(int s, struct msghdr *msg, \ + SYS_SENDMSG = 28 // { ssize_t sys_sendmsg(int s, \ + SYS_RECVFROM = 29 // { ssize_t sys_recvfrom(int s, void *buf, size_t len, \ + SYS_ACCEPT = 30 // { int sys_accept(int s, struct sockaddr *name, \ + SYS_GETPEERNAME = 31 // { int sys_getpeername(int fdes, struct sockaddr *asa, \ + SYS_GETSOCKNAME = 32 // { int sys_getsockname(int fdes, struct sockaddr *asa, \ + SYS_ACCESS = 33 // { int sys_access(const char *path, int amode); } + SYS_CHFLAGS = 34 // { int sys_chflags(const char *path, u_int flags); } + SYS_FCHFLAGS = 35 // { int sys_fchflags(int fd, u_int flags); } + SYS_SYNC = 36 // { void sys_sync(void); } + SYS_STAT = 38 // { int sys_stat(const char *path, struct stat *ub); } + SYS_GETPPID = 39 // { pid_t sys_getppid(void); } + SYS_LSTAT = 40 // { int sys_lstat(const char *path, struct stat *ub); } + SYS_DUP = 41 // { int sys_dup(int fd); } + SYS_FSTATAT = 42 // { int sys_fstatat(int fd, const char *path, \ + SYS_GETEGID = 43 // { gid_t sys_getegid(void); } + SYS_PROFIL = 44 // { int sys_profil(caddr_t samples, size_t size, \ + SYS_KTRACE = 45 // { int sys_ktrace(const char *fname, int ops, \ + SYS_SIGACTION = 46 // { int sys_sigaction(int signum, \ + SYS_GETGID = 47 // { gid_t sys_getgid(void); } + SYS_SIGPROCMASK = 48 // { int sys_sigprocmask(int how, sigset_t mask); } + SYS_SETLOGIN = 50 // { int sys_setlogin(const char *namebuf); } + SYS_ACCT = 51 // { int sys_acct(const char *path); } + SYS_SIGPENDING = 52 // { int sys_sigpending(void); } + SYS_FSTAT = 53 // { int sys_fstat(int fd, struct stat *sb); } + SYS_IOCTL = 54 // { int sys_ioctl(int fd, \ + SYS_REBOOT = 55 // { int sys_reboot(int opt); } + SYS_REVOKE = 56 // { int sys_revoke(const char *path); } + SYS_SYMLINK = 57 // { int sys_symlink(const char *path, \ + SYS_READLINK = 58 // { ssize_t sys_readlink(const char *path, \ + SYS_EXECVE = 59 // { int sys_execve(const char *path, \ + SYS_UMASK = 60 // { mode_t sys_umask(mode_t newmask); } + SYS_CHROOT = 61 // { int sys_chroot(const char *path); } + SYS_GETFSSTAT = 62 // { int sys_getfsstat(struct statfs *buf, size_t bufsize, \ + SYS_STATFS = 63 // { int sys_statfs(const char *path, \ + SYS_FSTATFS = 64 // { int sys_fstatfs(int fd, struct statfs *buf); } + SYS_FHSTATFS = 65 // { int sys_fhstatfs(const fhandle_t *fhp, \ + SYS_VFORK = 66 // { int sys_vfork(void); } + SYS_GETTIMEOFDAY = 67 // { int sys_gettimeofday(struct timeval *tp, \ + SYS_SETTIMEOFDAY = 68 // { int sys_settimeofday(const struct timeval *tv, \ + SYS_SETITIMER = 69 // { int sys_setitimer(int which, \ + SYS_GETITIMER = 70 // { int sys_getitimer(int which, \ + SYS_SELECT = 71 // { int sys_select(int nd, fd_set *in, fd_set *ou, \ + SYS_KEVENT = 72 // { int sys_kevent(int fd, \ + SYS_MUNMAP = 73 // { int sys_munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int sys_mprotect(void *addr, size_t len, \ + SYS_MADVISE = 75 // { int sys_madvise(void *addr, size_t len, \ + SYS_UTIMES = 76 // { int sys_utimes(const char *path, \ + SYS_FUTIMES = 77 // { int sys_futimes(int fd, \ + SYS_MINCORE = 78 // { int sys_mincore(void *addr, size_t len, \ + SYS_GETGROUPS = 79 // { int sys_getgroups(int gidsetsize, \ + SYS_SETGROUPS = 80 // { int sys_setgroups(int gidsetsize, \ + SYS_GETPGRP = 81 // { int sys_getpgrp(void); } + SYS_SETPGID = 82 // { int sys_setpgid(pid_t pid, pid_t pgid); } + SYS_FUTEX = 83 // { int sys_futex(uint32_t *f, int op, int val, \ + SYS_UTIMENSAT = 84 // { int sys_utimensat(int fd, const char *path, \ + SYS_FUTIMENS = 85 // { int sys_futimens(int fd, \ + SYS_KBIND = 86 // { int sys_kbind(const struct __kbind *param, \ + SYS_CLOCK_GETTIME = 87 // { int sys_clock_gettime(clockid_t clock_id, \ + SYS_CLOCK_SETTIME = 88 // { int sys_clock_settime(clockid_t clock_id, \ + SYS_CLOCK_GETRES = 89 // { int sys_clock_getres(clockid_t clock_id, \ + SYS_DUP2 = 90 // { int sys_dup2(int from, int to); } + SYS_NANOSLEEP = 91 // { int sys_nanosleep(const struct timespec *rqtp, \ + SYS_FCNTL = 92 // { int sys_fcntl(int fd, int cmd, ... void *arg); } + SYS_ACCEPT4 = 93 // { int sys_accept4(int s, struct sockaddr *name, \ + SYS___THRSLEEP = 94 // { int sys___thrsleep(const volatile void *ident, \ + SYS_FSYNC = 95 // { int sys_fsync(int fd); } + SYS_SETPRIORITY = 96 // { int sys_setpriority(int which, id_t who, int prio); } + SYS_SOCKET = 97 // { int sys_socket(int domain, int type, int protocol); } + SYS_CONNECT = 98 // { int sys_connect(int s, const struct sockaddr *name, \ + SYS_GETDENTS = 99 // { int sys_getdents(int fd, void *buf, size_t buflen); } + SYS_GETPRIORITY = 100 // { int sys_getpriority(int which, id_t who); } + SYS_PIPE2 = 101 // { int sys_pipe2(int *fdp, int flags); } + SYS_DUP3 = 102 // { int sys_dup3(int from, int to, int flags); } + SYS_SIGRETURN = 103 // { int sys_sigreturn(struct sigcontext *sigcntxp); } + SYS_BIND = 104 // { int sys_bind(int s, const struct sockaddr *name, \ + SYS_SETSOCKOPT = 105 // { int sys_setsockopt(int s, int level, int name, \ + SYS_LISTEN = 106 // { int sys_listen(int s, int backlog); } + SYS_CHFLAGSAT = 107 // { int sys_chflagsat(int fd, const char *path, \ + SYS_PLEDGE = 108 // { int sys_pledge(const char *promises, \ + SYS_PPOLL = 109 // { int sys_ppoll(struct pollfd *fds, \ + SYS_PSELECT = 110 // { int sys_pselect(int nd, fd_set *in, fd_set *ou, \ + SYS_SIGSUSPEND = 111 // { int sys_sigsuspend(int mask); } + SYS_SENDSYSLOG = 112 // { int sys_sendsyslog(const char *buf, size_t nbyte, \ + SYS_GETSOCKOPT = 118 // { int sys_getsockopt(int s, int level, int name, \ + SYS_THRKILL = 119 // { int sys_thrkill(pid_t tid, int signum, void *tcb); } + SYS_READV = 120 // { ssize_t sys_readv(int fd, \ + SYS_WRITEV = 121 // { ssize_t sys_writev(int fd, \ + SYS_KILL = 122 // { int sys_kill(int pid, int signum); } + SYS_FCHOWN = 123 // { int sys_fchown(int fd, uid_t uid, gid_t gid); } + SYS_FCHMOD = 124 // { int sys_fchmod(int fd, mode_t mode); } + SYS_SETREUID = 126 // { int sys_setreuid(uid_t ruid, uid_t euid); } + SYS_SETREGID = 127 // { int sys_setregid(gid_t rgid, gid_t egid); } + SYS_RENAME = 128 // { int sys_rename(const char *from, const char *to); } + SYS_FLOCK = 131 // { int sys_flock(int fd, int how); } + SYS_MKFIFO = 132 // { int sys_mkfifo(const char *path, mode_t mode); } + SYS_SENDTO = 133 // { ssize_t sys_sendto(int s, const void *buf, \ + SYS_SHUTDOWN = 134 // { int sys_shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int sys_socketpair(int domain, int type, \ + SYS_MKDIR = 136 // { int sys_mkdir(const char *path, mode_t mode); } + SYS_RMDIR = 137 // { int sys_rmdir(const char *path); } + SYS_ADJTIME = 140 // { int sys_adjtime(const struct timeval *delta, \ + SYS_GETLOGIN_R = 141 // { int sys_getlogin_r(char *namebuf, u_int namelen); } + SYS_SETSID = 147 // { int sys_setsid(void); } + SYS_QUOTACTL = 148 // { int sys_quotactl(const char *path, int cmd, \ + SYS_NFSSVC = 155 // { int sys_nfssvc(int flag, void *argp); } + SYS_GETFH = 161 // { int sys_getfh(const char *fname, fhandle_t *fhp); } + SYS_SYSARCH = 165 // { int sys_sysarch(int op, void *parms); } + SYS_PREAD = 173 // { ssize_t sys_pread(int fd, void *buf, \ + SYS_PWRITE = 174 // { ssize_t sys_pwrite(int fd, const void *buf, \ + SYS_SETGID = 181 // { int sys_setgid(gid_t gid); } + SYS_SETEGID = 182 // { int sys_setegid(gid_t egid); } + SYS_SETEUID = 183 // { int sys_seteuid(uid_t euid); } + SYS_PATHCONF = 191 // { long sys_pathconf(const char *path, int name); } + SYS_FPATHCONF = 192 // { long sys_fpathconf(int fd, int name); } + SYS_SWAPCTL = 193 // { int sys_swapctl(int cmd, const void *arg, int misc); } + SYS_GETRLIMIT = 194 // { int sys_getrlimit(int which, \ + SYS_SETRLIMIT = 195 // { int sys_setrlimit(int which, \ + SYS_MMAP = 197 // { void *sys_mmap(void *addr, size_t len, int prot, \ + SYS_LSEEK = 199 // { off_t sys_lseek(int fd, int pad, off_t offset, \ + SYS_TRUNCATE = 200 // { int sys_truncate(const char *path, int pad, \ + SYS_FTRUNCATE = 201 // { int sys_ftruncate(int fd, int pad, off_t length); } + SYS_SYSCTL = 202 // { int sys_sysctl(const int *name, u_int namelen, \ + SYS_MLOCK = 203 // { int sys_mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int sys_munlock(const void *addr, size_t len); } + SYS_GETPGID = 207 // { pid_t sys_getpgid(pid_t pid); } + SYS_UTRACE = 209 // { int sys_utrace(const char *label, const void *addr, \ + SYS_SEMGET = 221 // { int sys_semget(key_t key, int nsems, int semflg); } + SYS_MSGGET = 225 // { int sys_msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int sys_msgsnd(int msqid, const void *msgp, size_t msgsz, \ + SYS_MSGRCV = 227 // { int sys_msgrcv(int msqid, void *msgp, size_t msgsz, \ + SYS_SHMAT = 228 // { void *sys_shmat(int shmid, const void *shmaddr, \ + SYS_SHMDT = 230 // { int sys_shmdt(const void *shmaddr); } + SYS_MINHERIT = 250 // { int sys_minherit(void *addr, size_t len, \ + SYS_POLL = 252 // { int sys_poll(struct pollfd *fds, \ + SYS_ISSETUGID = 253 // { int sys_issetugid(void); } + SYS_LCHOWN = 254 // { int sys_lchown(const char *path, uid_t uid, gid_t gid); } + SYS_GETSID = 255 // { pid_t sys_getsid(pid_t pid); } + SYS_MSYNC = 256 // { int sys_msync(void *addr, size_t len, int flags); } + SYS_PIPE = 263 // { int sys_pipe(int *fdp); } + SYS_FHOPEN = 264 // { int sys_fhopen(const fhandle_t *fhp, int flags); } + SYS_PREADV = 267 // { ssize_t sys_preadv(int fd, \ + SYS_PWRITEV = 268 // { ssize_t sys_pwritev(int fd, \ + SYS_KQUEUE = 269 // { int sys_kqueue(void); } + SYS_MLOCKALL = 271 // { int sys_mlockall(int flags); } + SYS_MUNLOCKALL = 272 // { int sys_munlockall(void); } + SYS_GETRESUID = 281 // { int sys_getresuid(uid_t *ruid, uid_t *euid, \ + SYS_SETRESUID = 282 // { int sys_setresuid(uid_t ruid, uid_t euid, \ + SYS_GETRESGID = 283 // { int sys_getresgid(gid_t *rgid, gid_t *egid, \ + SYS_SETRESGID = 284 // { int sys_setresgid(gid_t rgid, gid_t egid, \ + SYS_MQUERY = 286 // { void *sys_mquery(void *addr, size_t len, int prot, \ + SYS_CLOSEFROM = 287 // { int sys_closefrom(int fd); } + SYS_SIGALTSTACK = 288 // { int sys_sigaltstack(const struct sigaltstack *nss, \ + SYS_SHMGET = 289 // { int sys_shmget(key_t key, size_t size, int shmflg); } + SYS_SEMOP = 290 // { int sys_semop(int semid, struct sembuf *sops, \ + SYS_FHSTAT = 294 // { int sys_fhstat(const fhandle_t *fhp, \ + SYS___SEMCTL = 295 // { int sys___semctl(int semid, int semnum, int cmd, \ + SYS_SHMCTL = 296 // { int sys_shmctl(int shmid, int cmd, \ + SYS_MSGCTL = 297 // { int sys_msgctl(int msqid, int cmd, \ + SYS_SCHED_YIELD = 298 // { int sys_sched_yield(void); } + SYS_GETTHRID = 299 // { pid_t sys_getthrid(void); } + SYS___THRWAKEUP = 301 // { int sys___thrwakeup(const volatile void *ident, \ + SYS___THREXIT = 302 // { void sys___threxit(pid_t *notdead); } + SYS___THRSIGDIVERT = 303 // { int sys___thrsigdivert(sigset_t sigmask, \ + SYS___GETCWD = 304 // { int sys___getcwd(char *buf, size_t len); } + SYS_ADJFREQ = 305 // { int sys_adjfreq(const int64_t *freq, \ + SYS_SETRTABLE = 310 // { int sys_setrtable(int rtableid); } + SYS_GETRTABLE = 311 // { int sys_getrtable(void); } + SYS_FACCESSAT = 313 // { int sys_faccessat(int fd, const char *path, \ + SYS_FCHMODAT = 314 // { int sys_fchmodat(int fd, const char *path, \ + SYS_FCHOWNAT = 315 // { int sys_fchownat(int fd, const char *path, \ + SYS_LINKAT = 317 // { int sys_linkat(int fd1, const char *path1, int fd2, \ + SYS_MKDIRAT = 318 // { int sys_mkdirat(int fd, const char *path, \ + SYS_MKFIFOAT = 319 // { int sys_mkfifoat(int fd, const char *path, \ + SYS_MKNODAT = 320 // { int sys_mknodat(int fd, const char *path, \ + SYS_OPENAT = 321 // { int sys_openat(int fd, const char *path, int flags, \ + SYS_READLINKAT = 322 // { ssize_t sys_readlinkat(int fd, const char *path, \ + SYS_RENAMEAT = 323 // { int sys_renameat(int fromfd, const char *from, \ + SYS_SYMLINKAT = 324 // { int sys_symlinkat(const char *path, int fd, \ + SYS_UNLINKAT = 325 // { int sys_unlinkat(int fd, const char *path, \ + SYS___SET_TCB = 329 // { void sys___set_tcb(void *tcb); } + SYS___GET_TCB = 330 // { void *sys___get_tcb(void); } +) diff --git a/api/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go b/api/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go new file mode 100644 index 0000000..32653e5 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go @@ -0,0 +1,213 @@ +// mksysnum_openbsd.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build arm,openbsd + +package unix + +const ( + SYS_EXIT = 1 // { void sys_exit(int rval); } + SYS_FORK = 2 // { int sys_fork(void); } + SYS_READ = 3 // { ssize_t sys_read(int fd, void *buf, size_t nbyte); } + SYS_WRITE = 4 // { ssize_t sys_write(int fd, const void *buf, \ + SYS_OPEN = 5 // { int sys_open(const char *path, \ + SYS_CLOSE = 6 // { int sys_close(int fd); } + SYS_GETENTROPY = 7 // { int sys_getentropy(void *buf, size_t nbyte); } + SYS___TFORK = 8 // { int sys___tfork(const struct __tfork *param, \ + SYS_LINK = 9 // { int sys_link(const char *path, const char *link); } + SYS_UNLINK = 10 // { int sys_unlink(const char *path); } + SYS_WAIT4 = 11 // { pid_t sys_wait4(pid_t pid, int *status, \ + SYS_CHDIR = 12 // { int sys_chdir(const char *path); } + SYS_FCHDIR = 13 // { int sys_fchdir(int fd); } + SYS_MKNOD = 14 // { int sys_mknod(const char *path, mode_t mode, \ + SYS_CHMOD = 15 // { int sys_chmod(const char *path, mode_t mode); } + SYS_CHOWN = 16 // { int sys_chown(const char *path, uid_t uid, \ + SYS_OBREAK = 17 // { int sys_obreak(char *nsize); } break + SYS_GETDTABLECOUNT = 18 // { int sys_getdtablecount(void); } + SYS_GETRUSAGE = 19 // { int sys_getrusage(int who, \ + SYS_GETPID = 20 // { pid_t sys_getpid(void); } + SYS_MOUNT = 21 // { int sys_mount(const char *type, const char *path, \ + SYS_UNMOUNT = 22 // { int sys_unmount(const char *path, int flags); } + SYS_SETUID = 23 // { int sys_setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t sys_getuid(void); } + SYS_GETEUID = 25 // { uid_t sys_geteuid(void); } + SYS_PTRACE = 26 // { int sys_ptrace(int req, pid_t pid, caddr_t addr, \ + SYS_RECVMSG = 27 // { ssize_t sys_recvmsg(int s, struct msghdr *msg, \ + SYS_SENDMSG = 28 // { ssize_t sys_sendmsg(int s, \ + SYS_RECVFROM = 29 // { ssize_t sys_recvfrom(int s, void *buf, size_t len, \ + SYS_ACCEPT = 30 // { int sys_accept(int s, struct sockaddr *name, \ + SYS_GETPEERNAME = 31 // { int sys_getpeername(int fdes, struct sockaddr *asa, \ + SYS_GETSOCKNAME = 32 // { int sys_getsockname(int fdes, struct sockaddr *asa, \ + SYS_ACCESS = 33 // { int sys_access(const char *path, int amode); } + SYS_CHFLAGS = 34 // { int sys_chflags(const char *path, u_int flags); } + SYS_FCHFLAGS = 35 // { int sys_fchflags(int fd, u_int flags); } + SYS_SYNC = 36 // { void sys_sync(void); } + SYS_STAT = 38 // { int sys_stat(const char *path, struct stat *ub); } + SYS_GETPPID = 39 // { pid_t sys_getppid(void); } + SYS_LSTAT = 40 // { int sys_lstat(const char *path, struct stat *ub); } + SYS_DUP = 41 // { int sys_dup(int fd); } + SYS_FSTATAT = 42 // { int sys_fstatat(int fd, const char *path, \ + SYS_GETEGID = 43 // { gid_t sys_getegid(void); } + SYS_PROFIL = 44 // { int sys_profil(caddr_t samples, size_t size, \ + SYS_KTRACE = 45 // { int sys_ktrace(const char *fname, int ops, \ + SYS_SIGACTION = 46 // { int sys_sigaction(int signum, \ + SYS_GETGID = 47 // { gid_t sys_getgid(void); } + SYS_SIGPROCMASK = 48 // { int sys_sigprocmask(int how, sigset_t mask); } + SYS_GETLOGIN = 49 // { int sys_getlogin(char *namebuf, u_int namelen); } + SYS_SETLOGIN = 50 // { int sys_setlogin(const char *namebuf); } + SYS_ACCT = 51 // { int sys_acct(const char *path); } + SYS_SIGPENDING = 52 // { int sys_sigpending(void); } + SYS_FSTAT = 53 // { int sys_fstat(int fd, struct stat *sb); } + SYS_IOCTL = 54 // { int sys_ioctl(int fd, \ + SYS_REBOOT = 55 // { int sys_reboot(int opt); } + SYS_REVOKE = 56 // { int sys_revoke(const char *path); } + SYS_SYMLINK = 57 // { int sys_symlink(const char *path, \ + SYS_READLINK = 58 // { ssize_t sys_readlink(const char *path, \ + SYS_EXECVE = 59 // { int sys_execve(const char *path, \ + SYS_UMASK = 60 // { mode_t sys_umask(mode_t newmask); } + SYS_CHROOT = 61 // { int sys_chroot(const char *path); } + SYS_GETFSSTAT = 62 // { int sys_getfsstat(struct statfs *buf, size_t bufsize, \ + SYS_STATFS = 63 // { int sys_statfs(const char *path, \ + SYS_FSTATFS = 64 // { int sys_fstatfs(int fd, struct statfs *buf); } + SYS_FHSTATFS = 65 // { int sys_fhstatfs(const fhandle_t *fhp, \ + SYS_VFORK = 66 // { int sys_vfork(void); } + SYS_GETTIMEOFDAY = 67 // { int sys_gettimeofday(struct timeval *tp, \ + SYS_SETTIMEOFDAY = 68 // { int sys_settimeofday(const struct timeval *tv, \ + SYS_SETITIMER = 69 // { int sys_setitimer(int which, \ + SYS_GETITIMER = 70 // { int sys_getitimer(int which, \ + SYS_SELECT = 71 // { int sys_select(int nd, fd_set *in, fd_set *ou, \ + SYS_KEVENT = 72 // { int sys_kevent(int fd, \ + SYS_MUNMAP = 73 // { int sys_munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int sys_mprotect(void *addr, size_t len, \ + SYS_MADVISE = 75 // { int sys_madvise(void *addr, size_t len, \ + SYS_UTIMES = 76 // { int sys_utimes(const char *path, \ + SYS_FUTIMES = 77 // { int sys_futimes(int fd, \ + SYS_MINCORE = 78 // { int sys_mincore(void *addr, size_t len, \ + SYS_GETGROUPS = 79 // { int sys_getgroups(int gidsetsize, \ + SYS_SETGROUPS = 80 // { int sys_setgroups(int gidsetsize, \ + SYS_GETPGRP = 81 // { int sys_getpgrp(void); } + SYS_SETPGID = 82 // { int sys_setpgid(pid_t pid, pid_t pgid); } + SYS_SENDSYSLOG = 83 // { int sys_sendsyslog(const void *buf, size_t nbyte); } + SYS_UTIMENSAT = 84 // { int sys_utimensat(int fd, const char *path, \ + SYS_FUTIMENS = 85 // { int sys_futimens(int fd, \ + SYS_CLOCK_GETTIME = 87 // { int sys_clock_gettime(clockid_t clock_id, \ + SYS_CLOCK_SETTIME = 88 // { int sys_clock_settime(clockid_t clock_id, \ + SYS_CLOCK_GETRES = 89 // { int sys_clock_getres(clockid_t clock_id, \ + SYS_DUP2 = 90 // { int sys_dup2(int from, int to); } + SYS_NANOSLEEP = 91 // { int sys_nanosleep(const struct timespec *rqtp, \ + SYS_FCNTL = 92 // { int sys_fcntl(int fd, int cmd, ... void *arg); } + SYS_ACCEPT4 = 93 // { int sys_accept4(int s, struct sockaddr *name, \ + SYS___THRSLEEP = 94 // { int sys___thrsleep(const volatile void *ident, \ + SYS_FSYNC = 95 // { int sys_fsync(int fd); } + SYS_SETPRIORITY = 96 // { int sys_setpriority(int which, id_t who, int prio); } + SYS_SOCKET = 97 // { int sys_socket(int domain, int type, int protocol); } + SYS_CONNECT = 98 // { int sys_connect(int s, const struct sockaddr *name, \ + SYS_GETDENTS = 99 // { int sys_getdents(int fd, void *buf, size_t buflen); } + SYS_GETPRIORITY = 100 // { int sys_getpriority(int which, id_t who); } + SYS_PIPE2 = 101 // { int sys_pipe2(int *fdp, int flags); } + SYS_DUP3 = 102 // { int sys_dup3(int from, int to, int flags); } + SYS_SIGRETURN = 103 // { int sys_sigreturn(struct sigcontext *sigcntxp); } + SYS_BIND = 104 // { int sys_bind(int s, const struct sockaddr *name, \ + SYS_SETSOCKOPT = 105 // { int sys_setsockopt(int s, int level, int name, \ + SYS_LISTEN = 106 // { int sys_listen(int s, int backlog); } + SYS_CHFLAGSAT = 107 // { int sys_chflagsat(int fd, const char *path, \ + SYS_PPOLL = 109 // { int sys_ppoll(struct pollfd *fds, \ + SYS_PSELECT = 110 // { int sys_pselect(int nd, fd_set *in, fd_set *ou, \ + SYS_SIGSUSPEND = 111 // { int sys_sigsuspend(int mask); } + SYS_GETSOCKOPT = 118 // { int sys_getsockopt(int s, int level, int name, \ + SYS_READV = 120 // { ssize_t sys_readv(int fd, \ + SYS_WRITEV = 121 // { ssize_t sys_writev(int fd, \ + SYS_KILL = 122 // { int sys_kill(int pid, int signum); } + SYS_FCHOWN = 123 // { int sys_fchown(int fd, uid_t uid, gid_t gid); } + SYS_FCHMOD = 124 // { int sys_fchmod(int fd, mode_t mode); } + SYS_SETREUID = 126 // { int sys_setreuid(uid_t ruid, uid_t euid); } + SYS_SETREGID = 127 // { int sys_setregid(gid_t rgid, gid_t egid); } + SYS_RENAME = 128 // { int sys_rename(const char *from, const char *to); } + SYS_FLOCK = 131 // { int sys_flock(int fd, int how); } + SYS_MKFIFO = 132 // { int sys_mkfifo(const char *path, mode_t mode); } + SYS_SENDTO = 133 // { ssize_t sys_sendto(int s, const void *buf, \ + SYS_SHUTDOWN = 134 // { int sys_shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int sys_socketpair(int domain, int type, \ + SYS_MKDIR = 136 // { int sys_mkdir(const char *path, mode_t mode); } + SYS_RMDIR = 137 // { int sys_rmdir(const char *path); } + SYS_ADJTIME = 140 // { int sys_adjtime(const struct timeval *delta, \ + SYS_SETSID = 147 // { int sys_setsid(void); } + SYS_QUOTACTL = 148 // { int sys_quotactl(const char *path, int cmd, \ + SYS_NFSSVC = 155 // { int sys_nfssvc(int flag, void *argp); } + SYS_GETFH = 161 // { int sys_getfh(const char *fname, fhandle_t *fhp); } + SYS_SYSARCH = 165 // { int sys_sysarch(int op, void *parms); } + SYS_PREAD = 173 // { ssize_t sys_pread(int fd, void *buf, \ + SYS_PWRITE = 174 // { ssize_t sys_pwrite(int fd, const void *buf, \ + SYS_SETGID = 181 // { int sys_setgid(gid_t gid); } + SYS_SETEGID = 182 // { int sys_setegid(gid_t egid); } + SYS_SETEUID = 183 // { int sys_seteuid(uid_t euid); } + SYS_PATHCONF = 191 // { long sys_pathconf(const char *path, int name); } + SYS_FPATHCONF = 192 // { long sys_fpathconf(int fd, int name); } + SYS_SWAPCTL = 193 // { int sys_swapctl(int cmd, const void *arg, int misc); } + SYS_GETRLIMIT = 194 // { int sys_getrlimit(int which, \ + SYS_SETRLIMIT = 195 // { int sys_setrlimit(int which, \ + SYS_MMAP = 197 // { void *sys_mmap(void *addr, size_t len, int prot, \ + SYS_LSEEK = 199 // { off_t sys_lseek(int fd, int pad, off_t offset, \ + SYS_TRUNCATE = 200 // { int sys_truncate(const char *path, int pad, \ + SYS_FTRUNCATE = 201 // { int sys_ftruncate(int fd, int pad, off_t length); } + SYS___SYSCTL = 202 // { int sys___sysctl(const int *name, u_int namelen, \ + SYS_MLOCK = 203 // { int sys_mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int sys_munlock(const void *addr, size_t len); } + SYS_GETPGID = 207 // { pid_t sys_getpgid(pid_t pid); } + SYS_UTRACE = 209 // { int sys_utrace(const char *label, const void *addr, \ + SYS_SEMGET = 221 // { int sys_semget(key_t key, int nsems, int semflg); } + SYS_MSGGET = 225 // { int sys_msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int sys_msgsnd(int msqid, const void *msgp, size_t msgsz, \ + SYS_MSGRCV = 227 // { int sys_msgrcv(int msqid, void *msgp, size_t msgsz, \ + SYS_SHMAT = 228 // { void *sys_shmat(int shmid, const void *shmaddr, \ + SYS_SHMDT = 230 // { int sys_shmdt(const void *shmaddr); } + SYS_MINHERIT = 250 // { int sys_minherit(void *addr, size_t len, \ + SYS_POLL = 252 // { int sys_poll(struct pollfd *fds, \ + SYS_ISSETUGID = 253 // { int sys_issetugid(void); } + SYS_LCHOWN = 254 // { int sys_lchown(const char *path, uid_t uid, gid_t gid); } + SYS_GETSID = 255 // { pid_t sys_getsid(pid_t pid); } + SYS_MSYNC = 256 // { int sys_msync(void *addr, size_t len, int flags); } + SYS_PIPE = 263 // { int sys_pipe(int *fdp); } + SYS_FHOPEN = 264 // { int sys_fhopen(const fhandle_t *fhp, int flags); } + SYS_PREADV = 267 // { ssize_t sys_preadv(int fd, \ + SYS_PWRITEV = 268 // { ssize_t sys_pwritev(int fd, \ + SYS_KQUEUE = 269 // { int sys_kqueue(void); } + SYS_MLOCKALL = 271 // { int sys_mlockall(int flags); } + SYS_MUNLOCKALL = 272 // { int sys_munlockall(void); } + SYS_GETRESUID = 281 // { int sys_getresuid(uid_t *ruid, uid_t *euid, \ + SYS_SETRESUID = 282 // { int sys_setresuid(uid_t ruid, uid_t euid, \ + SYS_GETRESGID = 283 // { int sys_getresgid(gid_t *rgid, gid_t *egid, \ + SYS_SETRESGID = 284 // { int sys_setresgid(gid_t rgid, gid_t egid, \ + SYS_MQUERY = 286 // { void *sys_mquery(void *addr, size_t len, int prot, \ + SYS_CLOSEFROM = 287 // { int sys_closefrom(int fd); } + SYS_SIGALTSTACK = 288 // { int sys_sigaltstack(const struct sigaltstack *nss, \ + SYS_SHMGET = 289 // { int sys_shmget(key_t key, size_t size, int shmflg); } + SYS_SEMOP = 290 // { int sys_semop(int semid, struct sembuf *sops, \ + SYS_FHSTAT = 294 // { int sys_fhstat(const fhandle_t *fhp, \ + SYS___SEMCTL = 295 // { int sys___semctl(int semid, int semnum, int cmd, \ + SYS_SHMCTL = 296 // { int sys_shmctl(int shmid, int cmd, \ + SYS_MSGCTL = 297 // { int sys_msgctl(int msqid, int cmd, \ + SYS_SCHED_YIELD = 298 // { int sys_sched_yield(void); } + SYS_GETTHRID = 299 // { pid_t sys_getthrid(void); } + SYS___THRWAKEUP = 301 // { int sys___thrwakeup(const volatile void *ident, \ + SYS___THREXIT = 302 // { void sys___threxit(pid_t *notdead); } + SYS___THRSIGDIVERT = 303 // { int sys___thrsigdivert(sigset_t sigmask, \ + SYS___GETCWD = 304 // { int sys___getcwd(char *buf, size_t len); } + SYS_ADJFREQ = 305 // { int sys_adjfreq(const int64_t *freq, \ + SYS_SETRTABLE = 310 // { int sys_setrtable(int rtableid); } + SYS_GETRTABLE = 311 // { int sys_getrtable(void); } + SYS_FACCESSAT = 313 // { int sys_faccessat(int fd, const char *path, \ + SYS_FCHMODAT = 314 // { int sys_fchmodat(int fd, const char *path, \ + SYS_FCHOWNAT = 315 // { int sys_fchownat(int fd, const char *path, \ + SYS_LINKAT = 317 // { int sys_linkat(int fd1, const char *path1, int fd2, \ + SYS_MKDIRAT = 318 // { int sys_mkdirat(int fd, const char *path, \ + SYS_MKFIFOAT = 319 // { int sys_mkfifoat(int fd, const char *path, \ + SYS_MKNODAT = 320 // { int sys_mknodat(int fd, const char *path, \ + SYS_OPENAT = 321 // { int sys_openat(int fd, const char *path, int flags, \ + SYS_READLINKAT = 322 // { ssize_t sys_readlinkat(int fd, const char *path, \ + SYS_RENAMEAT = 323 // { int sys_renameat(int fromfd, const char *from, \ + SYS_SYMLINKAT = 324 // { int sys_symlinkat(const char *path, int fd, \ + SYS_UNLINKAT = 325 // { int sys_unlinkat(int fd, const char *path, \ + SYS___SET_TCB = 329 // { void sys___set_tcb(void *tcb); } + SYS___GET_TCB = 330 // { void *sys___get_tcb(void); } +) diff --git a/api/vendor/golang.org/x/sys/unix/ztypes_darwin_386.go b/api/vendor/golang.org/x/sys/unix/ztypes_darwin_386.go new file mode 100644 index 0000000..327af5f --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/ztypes_darwin_386.go @@ -0,0 +1,489 @@ +// cgo -godefs types_darwin.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,darwin + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int32 + Nsec int32 +} + +type Timeval struct { + Sec int32 + Usec int32 +} + +type Timeval32 struct{} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev int32 + Mode uint16 + Nlink uint16 + Ino uint64 + Uid uint32 + Gid uint32 + Rdev int32 + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Birthtimespec Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + Lspare int32 + Qspare [2]int64 +} + +type Statfs_t struct { + Bsize uint32 + Iosize int32 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Owner uint32 + Type uint32 + Flags uint32 + Fssubtype uint32 + Fstypename [16]int8 + Mntonname [1024]int8 + Mntfromname [1024]int8 + Reserved [8]uint32 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Fstore_t struct { + Flags uint32 + Posmode int32 + Offset int64 + Length int64 + Bytesalloc int64 +} + +type Radvisory_t struct { + Offset int64 + Count int32 +} + +type Fbootstraptransfer_t struct { + Offset int64 + Length uint32 + Buffer *byte +} + +type Log2phys_t struct { + Flags uint32 + Contigbytes int64 + Devoffset int64 +} + +type Fsid struct { + Val [2]int32 +} + +type Dirent struct { + Ino uint64 + Seekoff uint64 + Reclen uint16 + Namlen uint16 + Type uint8 + Name [1024]int8 + _ [3]byte +} + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex uint32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x14 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter int16 + Flags uint16 + Fflags uint32 + Data int32 + Udata *byte +} + +type FdSet struct { + Bits [32]int32 +} + +const ( + SizeofIfMsghdr = 0x70 + SizeofIfData = 0x60 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfmaMsghdr2 = 0x14 + SizeofRtMsghdr = 0x5c + SizeofRtMetrics = 0x38 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Typelen uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Recvquota uint8 + Xmitquota uint8 + Unused1 uint8 + Mtu uint32 + Metric uint32 + Baudrate uint32 + Ipackets uint32 + Ierrors uint32 + Opackets uint32 + Oerrors uint32 + Collisions uint32 + Ibytes uint32 + Obytes uint32 + Imcasts uint32 + Omcasts uint32 + Iqdrops uint32 + Noproto uint32 + Recvtiming uint32 + Xmittiming uint32 + Lastchange Timeval + Unused2 uint32 + Hwassist uint32 + Reserved1 uint32 + Reserved2 uint32 +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte +} + +type IfmaMsghdr2 struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Refcount int32 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + _ [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint32 + Mtu uint32 + Hopcount uint32 + Expire int32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pksent uint32 + Filler [4]uint32 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + _ [2]byte +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x2 + AT_REMOVEDIR = 0x80 + AT_SYMLINK_FOLLOW = 0x40 + AT_SYMLINK_NOFOLLOW = 0x20 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} diff --git a/api/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go b/api/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go new file mode 100644 index 0000000..116e6e0 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go @@ -0,0 +1,499 @@ +// cgo -godefs types_darwin.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,darwin + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int32 + _ [4]byte +} + +type Timeval32 struct { + Sec int32 + Usec int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev int32 + Mode uint16 + Nlink uint16 + Ino uint64 + Uid uint32 + Gid uint32 + Rdev int32 + _ [4]byte + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Birthtimespec Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + Lspare int32 + Qspare [2]int64 +} + +type Statfs_t struct { + Bsize uint32 + Iosize int32 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Owner uint32 + Type uint32 + Flags uint32 + Fssubtype uint32 + Fstypename [16]int8 + Mntonname [1024]int8 + Mntfromname [1024]int8 + Reserved [8]uint32 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Fstore_t struct { + Flags uint32 + Posmode int32 + Offset int64 + Length int64 + Bytesalloc int64 +} + +type Radvisory_t struct { + Offset int64 + Count int32 + _ [4]byte +} + +type Fbootstraptransfer_t struct { + Offset int64 + Length uint64 + Buffer *byte +} + +type Log2phys_t struct { + Flags uint32 + _ [8]byte + _ [8]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Dirent struct { + Ino uint64 + Seekoff uint64 + Reclen uint16 + Namlen uint16 + Type uint8 + Name [1024]int8 + _ [3]byte +} + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + _ [4]byte + Iov *Iovec + Iovlen int32 + _ [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex uint32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x14 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint64 + Filter int16 + Flags uint16 + Fflags uint32 + Data int64 + Udata *byte +} + +type FdSet struct { + Bits [32]int32 +} + +const ( + SizeofIfMsghdr = 0x70 + SizeofIfData = 0x60 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfmaMsghdr2 = 0x14 + SizeofRtMsghdr = 0x5c + SizeofRtMetrics = 0x38 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Typelen uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Recvquota uint8 + Xmitquota uint8 + Unused1 uint8 + Mtu uint32 + Metric uint32 + Baudrate uint32 + Ipackets uint32 + Ierrors uint32 + Opackets uint32 + Oerrors uint32 + Collisions uint32 + Ibytes uint32 + Obytes uint32 + Imcasts uint32 + Omcasts uint32 + Iqdrops uint32 + Noproto uint32 + Recvtiming uint32 + Xmittiming uint32 + Lastchange Timeval32 + Unused2 uint32 + Hwassist uint32 + Reserved1 uint32 + Reserved2 uint32 +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte +} + +type IfmaMsghdr2 struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Refcount int32 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + _ [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint32 + Mtu uint32 + Hopcount uint32 + Expire int32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pksent uint32 + Filler [4]uint32 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfProgram = 0x10 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfProgram struct { + Len uint32 + _ [4]byte + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval32 + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + _ [2]byte +} + +type Termios struct { + Iflag uint64 + Oflag uint64 + Cflag uint64 + Lflag uint64 + Cc [20]uint8 + _ [4]byte + Ispeed uint64 + Ospeed uint64 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x2 + AT_REMOVEDIR = 0x80 + AT_SYMLINK_FOLLOW = 0x40 + AT_SYMLINK_NOFOLLOW = 0x20 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} diff --git a/api/vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go b/api/vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go new file mode 100644 index 0000000..2750ad7 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go @@ -0,0 +1,490 @@ +// NOTE: cgo can't generate struct Stat_t and struct Statfs_t yet +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_darwin.go + +// +build arm,darwin + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int32 + Nsec int32 +} + +type Timeval struct { + Sec int32 + Usec int32 +} + +type Timeval32 [0]byte + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev int32 + Mode uint16 + Nlink uint16 + Ino uint64 + Uid uint32 + Gid uint32 + Rdev int32 + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Birthtimespec Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + Lspare int32 + Qspare [2]int64 +} + +type Statfs_t struct { + Bsize uint32 + Iosize int32 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Owner uint32 + Type uint32 + Flags uint32 + Fssubtype uint32 + Fstypename [16]int8 + Mntonname [1024]int8 + Mntfromname [1024]int8 + Reserved [8]uint32 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Fstore_t struct { + Flags uint32 + Posmode int32 + Offset int64 + Length int64 + Bytesalloc int64 +} + +type Radvisory_t struct { + Offset int64 + Count int32 +} + +type Fbootstraptransfer_t struct { + Offset int64 + Length uint32 + Buffer *byte +} + +type Log2phys_t struct { + Flags uint32 + Contigbytes int64 + Devoffset int64 +} + +type Fsid struct { + Val [2]int32 +} + +type Dirent struct { + Ino uint64 + Seekoff uint64 + Reclen uint16 + Namlen uint16 + Type uint8 + Name [1024]int8 + _ [3]byte +} + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex uint32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x14 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter int16 + Flags uint16 + Fflags uint32 + Data int32 + Udata *byte +} + +type FdSet struct { + Bits [32]int32 +} + +const ( + SizeofIfMsghdr = 0x70 + SizeofIfData = 0x60 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfmaMsghdr2 = 0x14 + SizeofRtMsghdr = 0x5c + SizeofRtMetrics = 0x38 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Typelen uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Recvquota uint8 + Xmitquota uint8 + Unused1 uint8 + Mtu uint32 + Metric uint32 + Baudrate uint32 + Ipackets uint32 + Ierrors uint32 + Opackets uint32 + Oerrors uint32 + Collisions uint32 + Ibytes uint32 + Obytes uint32 + Imcasts uint32 + Omcasts uint32 + Iqdrops uint32 + Noproto uint32 + Recvtiming uint32 + Xmittiming uint32 + Lastchange Timeval + Unused2 uint32 + Hwassist uint32 + Reserved1 uint32 + Reserved2 uint32 +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte +} + +type IfmaMsghdr2 struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Refcount int32 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + _ [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint32 + Mtu uint32 + Hopcount uint32 + Expire int32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pksent uint32 + Filler [4]uint32 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + _ [2]byte +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x2 + AT_REMOVEDIR = 0x80 + AT_SYMLINK_FOLLOW = 0x40 + AT_SYMLINK_NOFOLLOW = 0x20 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} diff --git a/api/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go b/api/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go new file mode 100644 index 0000000..8cead09 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go @@ -0,0 +1,499 @@ +// cgo -godefs types_darwin.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm64,darwin + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int32 + _ [4]byte +} + +type Timeval32 struct { + Sec int32 + Usec int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev int32 + Mode uint16 + Nlink uint16 + Ino uint64 + Uid uint32 + Gid uint32 + Rdev int32 + _ [4]byte + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Birthtimespec Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + Lspare int32 + Qspare [2]int64 +} + +type Statfs_t struct { + Bsize uint32 + Iosize int32 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Owner uint32 + Type uint32 + Flags uint32 + Fssubtype uint32 + Fstypename [16]int8 + Mntonname [1024]int8 + Mntfromname [1024]int8 + Reserved [8]uint32 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Fstore_t struct { + Flags uint32 + Posmode int32 + Offset int64 + Length int64 + Bytesalloc int64 +} + +type Radvisory_t struct { + Offset int64 + Count int32 + _ [4]byte +} + +type Fbootstraptransfer_t struct { + Offset int64 + Length uint64 + Buffer *byte +} + +type Log2phys_t struct { + Flags uint32 + _ [8]byte + _ [8]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Dirent struct { + Ino uint64 + Seekoff uint64 + Reclen uint16 + Namlen uint16 + Type uint8 + Name [1024]int8 + _ [3]byte +} + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + _ [4]byte + Iov *Iovec + Iovlen int32 + _ [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex uint32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x14 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint64 + Filter int16 + Flags uint16 + Fflags uint32 + Data int64 + Udata *byte +} + +type FdSet struct { + Bits [32]int32 +} + +const ( + SizeofIfMsghdr = 0x70 + SizeofIfData = 0x60 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfmaMsghdr2 = 0x14 + SizeofRtMsghdr = 0x5c + SizeofRtMetrics = 0x38 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Typelen uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Recvquota uint8 + Xmitquota uint8 + Unused1 uint8 + Mtu uint32 + Metric uint32 + Baudrate uint32 + Ipackets uint32 + Ierrors uint32 + Opackets uint32 + Oerrors uint32 + Collisions uint32 + Ibytes uint32 + Obytes uint32 + Imcasts uint32 + Omcasts uint32 + Iqdrops uint32 + Noproto uint32 + Recvtiming uint32 + Xmittiming uint32 + Lastchange Timeval32 + Unused2 uint32 + Hwassist uint32 + Reserved1 uint32 + Reserved2 uint32 +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte +} + +type IfmaMsghdr2 struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Refcount int32 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + _ [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint32 + Mtu uint32 + Hopcount uint32 + Expire int32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pksent uint32 + Filler [4]uint32 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfProgram = 0x10 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfProgram struct { + Len uint32 + _ [4]byte + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval32 + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + _ [2]byte +} + +type Termios struct { + Iflag uint64 + Oflag uint64 + Cflag uint64 + Lflag uint64 + Cc [20]uint8 + _ [4]byte + Ispeed uint64 + Ospeed uint64 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x2 + AT_REMOVEDIR = 0x80 + AT_SYMLINK_FOLLOW = 0x40 + AT_SYMLINK_NOFOLLOW = 0x20 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} diff --git a/api/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go b/api/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go new file mode 100644 index 0000000..315a553 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go @@ -0,0 +1,486 @@ +// cgo -godefs types_dragonfly.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,dragonfly + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur int64 + Max int64 +} + +type _Gid_t uint32 + +const ( + S_IFMT = 0xf000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 + S_ISUID = 0x800 + S_ISGID = 0x400 + S_ISVTX = 0x200 + S_IRUSR = 0x100 + S_IWUSR = 0x80 + S_IXUSR = 0x40 +) + +type Stat_t struct { + Ino uint64 + Nlink uint32 + Dev uint32 + Mode uint16 + Padding1 uint16 + Uid uint32 + Gid uint32 + Rdev uint32 + Atim Timespec + Mtim Timespec + Ctim Timespec + Size int64 + Blocks int64 + Blksize uint32 + Flags uint32 + Gen uint32 + Lspare int32 + Qspare1 int64 + Qspare2 int64 +} + +type Statfs_t struct { + Spare2 int64 + Bsize int64 + Iosize int64 + Blocks int64 + Bfree int64 + Bavail int64 + Files int64 + Ffree int64 + Fsid Fsid + Owner uint32 + Type int32 + Flags int32 + _ [4]byte + Syncwrites int64 + Asyncwrites int64 + Fstypename [16]int8 + Mntonname [80]int8 + Syncreads int64 + Asyncreads int64 + Spares1 int16 + Mntfromname [80]int8 + Spares2 int16 + _ [4]byte + Spare [2]int64 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Dirent struct { + Fileno uint64 + Namlen uint16 + Type uint8 + Unused1 uint8 + Unused2 uint32 + Name [256]int8 +} + +type Fsid struct { + Val [2]int32 +} + +const ( + PathMax = 0x400 +) + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 + Rcf uint16 + Route [16]uint16 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + _ [4]byte + Iov *Iovec + Iovlen int32 + _ [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x36 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint64 + Filter int16 + Flags uint16 + Fflags uint32 + Data int64 + Udata *byte +} + +type FdSet struct { + Bits [16]uint64 +} + +const ( + SizeofIfMsghdr = 0xb0 + SizeofIfData = 0xa0 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfAnnounceMsghdr = 0x18 + SizeofRtMsghdr = 0x98 + SizeofRtMetrics = 0x70 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Recvquota uint8 + Xmitquota uint8 + _ [2]byte + Mtu uint64 + Metric uint64 + Link_state uint64 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Hwassist uint64 + Oqdrops uint64 + Lastchange Timeval +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Name [16]int8 + What uint16 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + _ [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits uint64 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint64 + Mtu uint64 + Pksent uint64 + Expire uint64 + Sendpipe uint64 + Ssthresh uint64 + Rtt uint64 + Rttvar uint64 + Recvpipe uint64 + Hopcount uint64 + Mssopt uint16 + Pad uint16 + _ [4]byte + Msl uint64 + Iwmaxsegs uint64 + Iwcapsegs uint64 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfProgram = 0x10 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x20 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfProgram struct { + Len uint32 + _ [4]byte + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + _ [6]byte +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = 0xfffafdcd + AT_SYMLINK_NOFOLLOW = 0x1 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type Utsname struct { + Sysname [32]byte + Nodename [32]byte + Release [32]byte + Version [32]byte + Machine [32]byte +} diff --git a/api/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go b/api/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go new file mode 100644 index 0000000..878a21a --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go @@ -0,0 +1,553 @@ +// cgo -godefs types_freebsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,freebsd + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int32 + Nsec int32 +} + +type Timeval struct { + Sec int32 + Usec int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur int64 + Max int64 +} + +type _Gid_t uint32 + +const ( + S_IFMT = 0xf000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 + S_ISUID = 0x800 + S_ISGID = 0x400 + S_ISVTX = 0x200 + S_IRUSR = 0x100 + S_IWUSR = 0x80 + S_IXUSR = 0x40 +) + +type Stat_t struct { + Dev uint32 + Ino uint32 + Mode uint16 + Nlink uint16 + Uid uint32 + Gid uint32 + Rdev uint32 + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + Lspare int32 + Birthtimespec Timespec + Pad_cgo_0 [8]byte +} + +type Statfs_t struct { + Version uint32 + Type uint32 + Flags uint64 + Bsize uint64 + Iosize uint64 + Blocks uint64 + Bfree uint64 + Bavail int64 + Files uint64 + Ffree int64 + Syncwrites uint64 + Asyncwrites uint64 + Syncreads uint64 + Asyncreads uint64 + Spare [10]uint64 + Namemax uint32 + Owner uint32 + Fsid Fsid + Charspare [80]int8 + Fstypename [16]int8 + Mntfromname [88]int8 + Mntonname [88]int8 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 + Sysid int32 +} + +type Dirent struct { + Fileno uint32 + Reclen uint16 + Type uint8 + Namlen uint8 + Name [256]int8 +} + +type Fsid struct { + Val [2]int32 +} + +const ( + PathMax = 0x400 +) + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [46]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x36 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter int16 + Flags uint16 + Fflags uint32 + Data int32 + Udata *byte +} + +type FdSet struct { + X__fds_bits [32]uint32 +} + +const ( + sizeofIfMsghdr = 0xa8 + SizeofIfMsghdr = 0x60 + sizeofIfData = 0x98 + SizeofIfData = 0x50 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfAnnounceMsghdr = 0x18 + SizeofRtMsghdr = 0x5c + SizeofRtMetrics = 0x38 +) + +type ifMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data ifData +} + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData +} + +type ifData struct { + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Vhid uint8 + Datalen uint16 + Mtu uint32 + Metric uint32 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Oqdrops uint64 + Noproto uint64 + Hwassist uint64 + X__ifi_epoch [8]byte + X__ifi_lastchange [16]byte +} + +type IfData struct { + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Spare_char1 uint8 + Spare_char2 uint8 + Datalen uint8 + Mtu uint32 + Metric uint32 + Baudrate uint32 + Ipackets uint32 + Ierrors uint32 + Opackets uint32 + Oerrors uint32 + Collisions uint32 + Ibytes uint32 + Obytes uint32 + Imcasts uint32 + Omcasts uint32 + Iqdrops uint32 + Noproto uint32 + Hwassist uint32 + Epoch int32 + Lastchange Timeval +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Name [16]int8 + What uint16 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Fmask int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint32 + Mtu uint32 + Hopcount uint32 + Expire uint32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pksent uint32 + Weight uint32 + Filler [3]uint32 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfZbuf = 0xc + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 + SizeofBpfZbufHeader = 0x20 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfZbuf struct { + Bufa *byte + Bufb *byte + Buflen uint32 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [2]byte +} + +type BpfZbufHeader struct { + Kernel_gen uint32 + Kernel_len uint32 + User_gen uint32 + X_bzh_pad [5]uint32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_REMOVEDIR = 0x800 + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x200 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLINIGNEOF = 0x2000 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type CapRights struct { + Rights [2]uint64 +} + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} diff --git a/api/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go b/api/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go new file mode 100644 index 0000000..8408af1 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go @@ -0,0 +1,556 @@ +// cgo -godefs types_freebsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,freebsd + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur int64 + Max int64 +} + +type _Gid_t uint32 + +const ( + S_IFMT = 0xf000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 + S_ISUID = 0x800 + S_ISGID = 0x400 + S_ISVTX = 0x200 + S_IRUSR = 0x100 + S_IWUSR = 0x80 + S_IXUSR = 0x40 +) + +type Stat_t struct { + Dev uint32 + Ino uint32 + Mode uint16 + Nlink uint16 + Uid uint32 + Gid uint32 + Rdev uint32 + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + Lspare int32 + Birthtimespec Timespec +} + +type Statfs_t struct { + Version uint32 + Type uint32 + Flags uint64 + Bsize uint64 + Iosize uint64 + Blocks uint64 + Bfree uint64 + Bavail int64 + Files uint64 + Ffree int64 + Syncwrites uint64 + Asyncwrites uint64 + Syncreads uint64 + Asyncreads uint64 + Spare [10]uint64 + Namemax uint32 + Owner uint32 + Fsid Fsid + Charspare [80]int8 + Fstypename [16]int8 + Mntfromname [88]int8 + Mntonname [88]int8 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 + Sysid int32 + Pad_cgo_0 [4]byte +} + +type Dirent struct { + Fileno uint32 + Reclen uint16 + Type uint8 + Namlen uint8 + Name [256]int8 +} + +type Fsid struct { + Val [2]int32 +} + +const ( + PathMax = 0x400 +) + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [46]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *Iovec + Iovlen int32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x36 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint64 + Filter int16 + Flags uint16 + Fflags uint32 + Data int64 + Udata *byte +} + +type FdSet struct { + X__fds_bits [16]uint64 +} + +const ( + sizeofIfMsghdr = 0xa8 + SizeofIfMsghdr = 0xa8 + sizeofIfData = 0x98 + SizeofIfData = 0x98 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfAnnounceMsghdr = 0x18 + SizeofRtMsghdr = 0x98 + SizeofRtMetrics = 0x70 +) + +type ifMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data ifData +} + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData +} + +type ifData struct { + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Vhid uint8 + Datalen uint16 + Mtu uint32 + Metric uint32 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Oqdrops uint64 + Noproto uint64 + Hwassist uint64 + X__ifi_epoch [8]byte + X__ifi_lastchange [16]byte +} + +type IfData struct { + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Spare_char1 uint8 + Spare_char2 uint8 + Datalen uint8 + Mtu uint64 + Metric uint64 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Hwassist uint64 + Epoch int64 + Lastchange Timeval +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Name [16]int8 + What uint16 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Fmask int32 + Inits uint64 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint64 + Mtu uint64 + Hopcount uint64 + Expire uint64 + Recvpipe uint64 + Sendpipe uint64 + Ssthresh uint64 + Rtt uint64 + Rttvar uint64 + Pksent uint64 + Weight uint64 + Filler [3]uint64 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfZbuf = 0x18 + SizeofBpfProgram = 0x10 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x20 + SizeofBpfZbufHeader = 0x20 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfZbuf struct { + Bufa *byte + Bufb *byte + Buflen uint64 +} + +type BpfProgram struct { + Len uint32 + Pad_cgo_0 [4]byte + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [6]byte +} + +type BpfZbufHeader struct { + Kernel_gen uint32 + Kernel_len uint32 + User_gen uint32 + X_bzh_pad [5]uint32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_REMOVEDIR = 0x800 + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x200 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLINIGNEOF = 0x2000 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type CapRights struct { + Rights [2]uint64 +} + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} diff --git a/api/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go b/api/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go new file mode 100644 index 0000000..4b2d9a4 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go @@ -0,0 +1,556 @@ +// cgo -godefs -- -fsigned-char types_freebsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,freebsd + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int32 + Pad_cgo_0 [4]byte +} + +type Timeval struct { + Sec int64 + Usec int32 + Pad_cgo_0 [4]byte +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur int64 + Max int64 +} + +type _Gid_t uint32 + +const ( + S_IFMT = 0xf000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 + S_ISUID = 0x800 + S_ISGID = 0x400 + S_ISVTX = 0x200 + S_IRUSR = 0x100 + S_IWUSR = 0x80 + S_IXUSR = 0x40 +) + +type Stat_t struct { + Dev uint32 + Ino uint32 + Mode uint16 + Nlink uint16 + Uid uint32 + Gid uint32 + Rdev uint32 + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + Lspare int32 + Birthtimespec Timespec +} + +type Statfs_t struct { + Version uint32 + Type uint32 + Flags uint64 + Bsize uint64 + Iosize uint64 + Blocks uint64 + Bfree uint64 + Bavail int64 + Files uint64 + Ffree int64 + Syncwrites uint64 + Asyncwrites uint64 + Syncreads uint64 + Asyncreads uint64 + Spare [10]uint64 + Namemax uint32 + Owner uint32 + Fsid Fsid + Charspare [80]int8 + Fstypename [16]int8 + Mntfromname [88]int8 + Mntonname [88]int8 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 + Sysid int32 + Pad_cgo_0 [4]byte +} + +type Dirent struct { + Fileno uint32 + Reclen uint16 + Type uint8 + Namlen uint8 + Name [256]int8 +} + +type Fsid struct { + Val [2]int32 +} + +const ( + PathMax = 0x400 +) + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [46]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x36 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter int16 + Flags uint16 + Fflags uint32 + Data int32 + Udata *byte +} + +type FdSet struct { + X__fds_bits [32]uint32 +} + +const ( + sizeofIfMsghdr = 0xa8 + SizeofIfMsghdr = 0x70 + sizeofIfData = 0x98 + SizeofIfData = 0x60 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfAnnounceMsghdr = 0x18 + SizeofRtMsghdr = 0x5c + SizeofRtMetrics = 0x38 +) + +type ifMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data ifData +} + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData +} + +type ifData struct { + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Vhid uint8 + Datalen uint16 + Mtu uint32 + Metric uint32 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Oqdrops uint64 + Noproto uint64 + Hwassist uint64 + X__ifi_epoch [8]byte + X__ifi_lastchange [16]byte +} + +type IfData struct { + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Spare_char1 uint8 + Spare_char2 uint8 + Datalen uint8 + Mtu uint32 + Metric uint32 + Baudrate uint32 + Ipackets uint32 + Ierrors uint32 + Opackets uint32 + Oerrors uint32 + Collisions uint32 + Ibytes uint32 + Obytes uint32 + Imcasts uint32 + Omcasts uint32 + Iqdrops uint32 + Noproto uint32 + Hwassist uint32 + Pad_cgo_0 [4]byte + Epoch int64 + Lastchange Timeval +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Name [16]int8 + What uint16 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Fmask int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint32 + Mtu uint32 + Hopcount uint32 + Expire uint32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pksent uint32 + Weight uint32 + Filler [3]uint32 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfZbuf = 0xc + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x20 + SizeofBpfZbufHeader = 0x20 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfZbuf struct { + Bufa *byte + Bufb *byte + Buflen uint32 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [6]byte +} + +type BpfZbufHeader struct { + Kernel_gen uint32 + Kernel_len uint32 + User_gen uint32 + X_bzh_pad [5]uint32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_REMOVEDIR = 0x800 + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x200 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLINIGNEOF = 0x2000 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type CapRights struct { + Rights [2]uint64 +} + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} diff --git a/api/vendor/golang.org/x/sys/unix/ztypes_linux_386.go b/api/vendor/golang.org/x/sys/unix/ztypes_linux_386.go new file mode 100644 index 0000000..4047462 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/ztypes_linux_386.go @@ -0,0 +1,1815 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m32 linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,linux + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int32 + Nsec int32 +} + +type Timeval struct { + Sec int32 + Usec int32 +} + +type Timex struct { + Modes uint32 + Offset int32 + Freq int32 + Maxerror int32 + Esterror int32 + Status int32 + Constant int32 + Precision int32 + Tolerance int32 + Time Timeval + Tick int32 + Ppsfreq int32 + Jitter int32 + Shift int32 + Stabil int32 + Jitcnt int32 + Calcnt int32 + Errcnt int32 + Stbcnt int32 + Tai int32 + _ [44]byte +} + +type Time_t int32 + +type Tms struct { + Utime int32 + Stime int32 + Cutime int32 + Cstime int32 +} + +type Utimbuf struct { + Actime int32 + Modtime int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + _ uint16 + _ [2]byte + _ uint32 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint64 + _ uint16 + _ [2]byte + Size int64 + Blksize int32 + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Ino uint64 +} + +type StatxTimestamp struct { + Sec int64 + Nsec uint32 + _ int32 +} + +type Statx_t struct { + Mask uint32 + Blksize uint32 + Attributes uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Mode uint16 + _ [1]uint16 + Ino uint64 + Size uint64 + Blocks uint64 + Attributes_mask uint64 + Atime StatxTimestamp + Btime StatxTimestamp + Ctime StatxTimestamp + Mtime StatxTimestamp + Rdev_major uint32 + Rdev_minor uint32 + Dev_major uint32 + Dev_minor uint32 + _ [14]uint64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + _ [1]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + Start int64 + Len int64 + Pid int32 +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrL2 struct { + Family uint16 + Psm uint16 + Bdaddr [6]uint8 + Cid uint16 + Bdaddr_type uint8 + _ [1]byte +} + +type RawSockaddrCAN struct { + Family uint16 + _ [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + _ [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrL2 = 0xe + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_NUM_VF = 0x15 + IFLA_VFINFO_LIST = 0x16 + IFLA_STATS64 = 0x17 + IFLA_VF_PORTS = 0x18 + IFLA_PORT_SELF = 0x19 + IFLA_AF_SPEC = 0x1a + IFLA_GROUP = 0x1b + IFLA_NET_NS_FD = 0x1c + IFLA_EXT_MASK = 0x1d + IFLA_PROMISCUITY = 0x1e + IFLA_NUM_TX_QUEUES = 0x1f + IFLA_NUM_RX_QUEUES = 0x20 + IFLA_CARRIER = 0x21 + IFLA_PHYS_PORT_ID = 0x22 + IFLA_CARRIER_CHANGES = 0x23 + IFLA_PHYS_SWITCH_ID = 0x24 + IFLA_LINK_NETNSID = 0x25 + IFLA_PHYS_PORT_NAME = 0x26 + IFLA_PROTO_DOWN = 0x27 + IFLA_GSO_MAX_SEGS = 0x28 + IFLA_GSO_MAX_SIZE = 0x29 + IFLA_PAD = 0x2a + IFLA_XDP = 0x2b + IFLA_EVENT = 0x2c + IFLA_NEW_NETNSID = 0x2d + IFLA_IF_NETNSID = 0x2e + IFLA_MAX = 0x31 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + _ uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x8 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + _ [2]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Ebx int32 + Ecx int32 + Edx int32 + Esi int32 + Edi int32 + Ebp int32 + Eax int32 + Xds int32 + Xes int32 + Xfs int32 + Xgs int32 + Orig_eax int32 + Eip int32 + Xcs int32 + Eflags int32 + Esp int32 + Xss int32 +} + +type FdSet struct { + Bits [32]int32 +} + +type Sysinfo_t struct { + Uptime int32 + Loads [3]uint32 + Totalram uint32 + Freeram uint32 + Sharedram uint32 + Bufferram uint32 + Totalswap uint32 + Freeswap uint32 + Procs uint16 + Pad uint16 + Totalhigh uint32 + Freehigh uint32 + Unit uint32 + _ [8]int8 +} + +type Utsname struct { + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte +} + +type Ustat_t struct { + Tfree int32 + Tinode uint32 + Fname [6]int8 + Fpack [6]int8 +} + +type EpollEvent struct { + Events uint32 + Fd int32 + Pad int32 +} + +const ( + AT_EMPTY_PATH = 0x1000 + AT_FDCWD = -0x64 + AT_NO_AUTOMOUNT = 0x800 + AT_REMOVEDIR = 0x200 + + AT_STATX_SYNC_AS_STAT = 0x0 + AT_STATX_FORCE_SYNC = 0x2000 + AT_STATX_DONT_SYNC = 0x4000 + + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + Val [32]uint32 +} + +const RNDGETENTCNT = 0x80045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [19]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + _ [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + _ [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + _ [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + _ [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type CGroupStats struct { + Sleeping uint64 + Running uint64 + Stopped uint64 + Uninterruptible uint64 + Io_wait uint64 +} + +const ( + CGROUPSTATS_CMD_UNSPEC = 0x3 + CGROUPSTATS_CMD_GET = 0x4 + CGROUPSTATS_CMD_NEW = 0x5 + CGROUPSTATS_TYPE_UNSPEC = 0x0 + CGROUPSTATS_TYPE_CGROUP_STATS = 0x1 + CGROUPSTATS_CMD_ATTR_UNSPEC = 0x0 + CGROUPSTATS_CMD_ATTR_FD = 0x1 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) + +type cpuMask uint32 + +const ( + _CPU_SETSIZE = 0x400 + _NCPUBITS = 0x20 +) + +const ( + BDADDR_BREDR = 0x0 + BDADDR_LE_PUBLIC = 0x1 + BDADDR_LE_RANDOM = 0x2 +) + +type PerfEventAttr struct { + Type uint32 + Size uint32 + Config uint64 + Sample uint64 + Sample_type uint64 + Read_format uint64 + Bits uint64 + Wakeup uint32 + Bp_type uint32 + Ext1 uint64 + Ext2 uint64 + Branch_sample_type uint64 + Sample_regs_user uint64 + Sample_stack_user uint32 + Clockid int32 + Sample_regs_intr uint64 + Aux_watermark uint32 + _ uint32 +} + +type PerfEventMmapPage struct { + Version uint32 + Compat_version uint32 + Lock uint32 + Index uint32 + Offset int64 + Time_enabled uint64 + Time_running uint64 + Capabilities uint64 + Pmc_width uint16 + Time_shift uint16 + Time_mult uint32 + Time_offset uint64 + Time_zero uint64 + Size uint32 + _ [948]uint8 + Data_head uint64 + Data_tail uint64 + Data_offset uint64 + Data_size uint64 + Aux_head uint64 + Aux_tail uint64 + Aux_offset uint64 + Aux_size uint64 +} + +const ( + PerfBitDisabled uint64 = CBitFieldMaskBit0 + PerfBitInherit = CBitFieldMaskBit1 + PerfBitPinned = CBitFieldMaskBit2 + PerfBitExclusive = CBitFieldMaskBit3 + PerfBitExcludeUser = CBitFieldMaskBit4 + PerfBitExcludeKernel = CBitFieldMaskBit5 + PerfBitExcludeHv = CBitFieldMaskBit6 + PerfBitExcludeIdle = CBitFieldMaskBit7 + PerfBitMmap = CBitFieldMaskBit8 + PerfBitComm = CBitFieldMaskBit9 + PerfBitFreq = CBitFieldMaskBit10 + PerfBitInheritStat = CBitFieldMaskBit11 + PerfBitEnableOnExec = CBitFieldMaskBit12 + PerfBitTask = CBitFieldMaskBit13 + PerfBitWatermark = CBitFieldMaskBit14 + PerfBitPreciseIPBit1 = CBitFieldMaskBit15 + PerfBitPreciseIPBit2 = CBitFieldMaskBit16 + PerfBitMmapData = CBitFieldMaskBit17 + PerfBitSampleIDAll = CBitFieldMaskBit18 + PerfBitExcludeHost = CBitFieldMaskBit19 + PerfBitExcludeGuest = CBitFieldMaskBit20 + PerfBitExcludeCallchainKernel = CBitFieldMaskBit21 + PerfBitExcludeCallchainUser = CBitFieldMaskBit22 + PerfBitMmap2 = CBitFieldMaskBit23 + PerfBitCommExec = CBitFieldMaskBit24 + PerfBitUseClockID = CBitFieldMaskBit25 + PerfBitContextSwitch = CBitFieldMaskBit26 +) + +const ( + PERF_TYPE_HARDWARE = 0x0 + PERF_TYPE_SOFTWARE = 0x1 + PERF_TYPE_TRACEPOINT = 0x2 + PERF_TYPE_HW_CACHE = 0x3 + PERF_TYPE_RAW = 0x4 + PERF_TYPE_BREAKPOINT = 0x5 + + PERF_COUNT_HW_CPU_CYCLES = 0x0 + PERF_COUNT_HW_INSTRUCTIONS = 0x1 + PERF_COUNT_HW_CACHE_REFERENCES = 0x2 + PERF_COUNT_HW_CACHE_MISSES = 0x3 + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 0x4 + PERF_COUNT_HW_BRANCH_MISSES = 0x5 + PERF_COUNT_HW_BUS_CYCLES = 0x6 + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7 + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 0x8 + PERF_COUNT_HW_REF_CPU_CYCLES = 0x9 + + PERF_COUNT_HW_CACHE_L1D = 0x0 + PERF_COUNT_HW_CACHE_L1I = 0x1 + PERF_COUNT_HW_CACHE_LL = 0x2 + PERF_COUNT_HW_CACHE_DTLB = 0x3 + PERF_COUNT_HW_CACHE_ITLB = 0x4 + PERF_COUNT_HW_CACHE_BPU = 0x5 + PERF_COUNT_HW_CACHE_NODE = 0x6 + + PERF_COUNT_HW_CACHE_OP_READ = 0x0 + PERF_COUNT_HW_CACHE_OP_WRITE = 0x1 + PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2 + + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0 + PERF_COUNT_HW_CACHE_RESULT_MISS = 0x1 + + PERF_COUNT_SW_CPU_CLOCK = 0x0 + PERF_COUNT_SW_TASK_CLOCK = 0x1 + PERF_COUNT_SW_PAGE_FAULTS = 0x2 + PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3 + PERF_COUNT_SW_CPU_MIGRATIONS = 0x4 + PERF_COUNT_SW_PAGE_FAULTS_MIN = 0x5 + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 0x6 + PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 + PERF_COUNT_SW_EMULATION_FAULTS = 0x8 + PERF_COUNT_SW_DUMMY = 0x9 + + PERF_SAMPLE_IP = 0x1 + PERF_SAMPLE_TID = 0x2 + PERF_SAMPLE_TIME = 0x4 + PERF_SAMPLE_ADDR = 0x8 + PERF_SAMPLE_READ = 0x10 + PERF_SAMPLE_CALLCHAIN = 0x20 + PERF_SAMPLE_ID = 0x40 + PERF_SAMPLE_CPU = 0x80 + PERF_SAMPLE_PERIOD = 0x100 + PERF_SAMPLE_STREAM_ID = 0x200 + PERF_SAMPLE_RAW = 0x400 + PERF_SAMPLE_BRANCH_STACK = 0x800 + + PERF_SAMPLE_BRANCH_USER = 0x1 + PERF_SAMPLE_BRANCH_KERNEL = 0x2 + PERF_SAMPLE_BRANCH_HV = 0x4 + PERF_SAMPLE_BRANCH_ANY = 0x8 + PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 + PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 + PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + + PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 + PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 + PERF_FORMAT_ID = 0x4 + PERF_FORMAT_GROUP = 0x8 + + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + + PERF_CONTEXT_HV = -0x20 + PERF_CONTEXT_KERNEL = -0x80 + PERF_CONTEXT_USER = -0x200 + + PERF_CONTEXT_GUEST = -0x800 + PERF_CONTEXT_GUEST_KERNEL = -0x880 + PERF_CONTEXT_GUEST_USER = -0xa00 + + PERF_FLAG_FD_NO_GROUP = 0x1 + PERF_FLAG_FD_OUTPUT = 0x2 + PERF_FLAG_PID_CGROUP = 0x4 +) + +const ( + CBitFieldMaskBit0 = 0x1 + CBitFieldMaskBit1 = 0x2 + CBitFieldMaskBit2 = 0x4 + CBitFieldMaskBit3 = 0x8 + CBitFieldMaskBit4 = 0x10 + CBitFieldMaskBit5 = 0x20 + CBitFieldMaskBit6 = 0x40 + CBitFieldMaskBit7 = 0x80 + CBitFieldMaskBit8 = 0x100 + CBitFieldMaskBit9 = 0x200 + CBitFieldMaskBit10 = 0x400 + CBitFieldMaskBit11 = 0x800 + CBitFieldMaskBit12 = 0x1000 + CBitFieldMaskBit13 = 0x2000 + CBitFieldMaskBit14 = 0x4000 + CBitFieldMaskBit15 = 0x8000 + CBitFieldMaskBit16 = 0x10000 + CBitFieldMaskBit17 = 0x20000 + CBitFieldMaskBit18 = 0x40000 + CBitFieldMaskBit19 = 0x80000 + CBitFieldMaskBit20 = 0x100000 + CBitFieldMaskBit21 = 0x200000 + CBitFieldMaskBit22 = 0x400000 + CBitFieldMaskBit23 = 0x800000 + CBitFieldMaskBit24 = 0x1000000 + CBitFieldMaskBit25 = 0x2000000 + CBitFieldMaskBit26 = 0x4000000 + CBitFieldMaskBit27 = 0x8000000 + CBitFieldMaskBit28 = 0x10000000 + CBitFieldMaskBit29 = 0x20000000 + CBitFieldMaskBit30 = 0x40000000 + CBitFieldMaskBit31 = 0x80000000 + CBitFieldMaskBit32 = 0x100000000 + CBitFieldMaskBit33 = 0x200000000 + CBitFieldMaskBit34 = 0x400000000 + CBitFieldMaskBit35 = 0x800000000 + CBitFieldMaskBit36 = 0x1000000000 + CBitFieldMaskBit37 = 0x2000000000 + CBitFieldMaskBit38 = 0x4000000000 + CBitFieldMaskBit39 = 0x8000000000 + CBitFieldMaskBit40 = 0x10000000000 + CBitFieldMaskBit41 = 0x20000000000 + CBitFieldMaskBit42 = 0x40000000000 + CBitFieldMaskBit43 = 0x80000000000 + CBitFieldMaskBit44 = 0x100000000000 + CBitFieldMaskBit45 = 0x200000000000 + CBitFieldMaskBit46 = 0x400000000000 + CBitFieldMaskBit47 = 0x800000000000 + CBitFieldMaskBit48 = 0x1000000000000 + CBitFieldMaskBit49 = 0x2000000000000 + CBitFieldMaskBit50 = 0x4000000000000 + CBitFieldMaskBit51 = 0x8000000000000 + CBitFieldMaskBit52 = 0x10000000000000 + CBitFieldMaskBit53 = 0x20000000000000 + CBitFieldMaskBit54 = 0x40000000000000 + CBitFieldMaskBit55 = 0x80000000000000 + CBitFieldMaskBit56 = 0x100000000000000 + CBitFieldMaskBit57 = 0x200000000000000 + CBitFieldMaskBit58 = 0x400000000000000 + CBitFieldMaskBit59 = 0x800000000000000 + CBitFieldMaskBit60 = 0x1000000000000000 + CBitFieldMaskBit61 = 0x2000000000000000 + CBitFieldMaskBit62 = 0x4000000000000000 + CBitFieldMaskBit63 = 0x8000000000000000 +) + +type SockaddrStorage struct { + Family uint16 + _ [122]int8 + _ uint32 +} + +type TCPMD5Sig struct { + Addr SockaddrStorage + Flags uint8 + Prefixlen uint8 + Keylen uint16 + _ uint32 + Key [80]uint8 +} + +type HDDriveCmdHdr struct { + Command uint8 + Number uint8 + Feature uint8 + Count uint8 +} + +type HDGeometry struct { + Heads uint8 + Sectors uint8 + Cylinders uint16 + Start uint32 +} + +type HDDriveID struct { + Config uint16 + Cyls uint16 + Reserved2 uint16 + Heads uint16 + Track_bytes uint16 + Sector_bytes uint16 + Sectors uint16 + Vendor0 uint16 + Vendor1 uint16 + Vendor2 uint16 + Serial_no [20]uint8 + Buf_type uint16 + Buf_size uint16 + Ecc_bytes uint16 + Fw_rev [8]uint8 + Model [40]uint8 + Max_multsect uint8 + Vendor3 uint8 + Dword_io uint16 + Vendor4 uint8 + Capability uint8 + Reserved50 uint16 + Vendor5 uint8 + TPIO uint8 + Vendor6 uint8 + TDMA uint8 + Field_valid uint16 + Cur_cyls uint16 + Cur_heads uint16 + Cur_sectors uint16 + Cur_capacity0 uint16 + Cur_capacity1 uint16 + Multsect uint8 + Multsect_valid uint8 + Lba_capacity uint32 + Dma_1word uint16 + Dma_mword uint16 + Eide_pio_modes uint16 + Eide_dma_min uint16 + Eide_dma_time uint16 + Eide_pio uint16 + Eide_pio_iordy uint16 + Words69_70 [2]uint16 + Words71_74 [4]uint16 + Queue_depth uint16 + Words76_79 [4]uint16 + Major_rev_num uint16 + Minor_rev_num uint16 + Command_set_1 uint16 + Command_set_2 uint16 + Cfsse uint16 + Cfs_enable_1 uint16 + Cfs_enable_2 uint16 + Csf_default uint16 + Dma_ultra uint16 + Trseuc uint16 + TrsEuc uint16 + CurAPMvalues uint16 + Mprc uint16 + Hw_config uint16 + Acoustic uint16 + Msrqs uint16 + Sxfert uint16 + Sal uint16 + Spg uint32 + Lba_capacity_2 uint64 + Words104_125 [22]uint16 + Last_lun uint16 + Word127 uint16 + Dlf uint16 + Csfo uint16 + Words130_155 [26]uint16 + Word156 uint16 + Words157_159 [3]uint16 + Cfa_power uint16 + Words161_175 [15]uint16 + Words176_205 [30]uint16 + Words206_254 [49]uint16 + Integrity_word uint16 +} + +type Statfs_t struct { + Type int32 + Bsize int32 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen int32 + Frsize int32 + Flags int32 + Spare [4]int32 +} + +const ( + ST_MANDLOCK = 0x40 + ST_NOATIME = 0x400 + ST_NODEV = 0x4 + ST_NODIRATIME = 0x800 + ST_NOEXEC = 0x8 + ST_NOSUID = 0x2 + ST_RDONLY = 0x1 + ST_RELATIME = 0x1000 + ST_SYNCHRONOUS = 0x10 +) + +type TpacketHdr struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Usec uint32 +} + +type Tpacket2Hdr struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Nsec uint32 + Vlan_tci uint16 + Vlan_tpid uint16 + _ [4]uint8 +} + +type Tpacket3Hdr struct { + Next_offset uint32 + Sec uint32 + Nsec uint32 + Snaplen uint32 + Len uint32 + Status uint32 + Mac uint16 + Net uint16 + Hv1 TpacketHdrVariant1 + _ [8]uint8 +} + +type TpacketHdrVariant1 struct { + Rxhash uint32 + Vlan_tci uint32 + Vlan_tpid uint16 + _ uint16 +} + +type TpacketBlockDesc struct { + Version uint32 + To_priv uint32 + Hdr [40]byte +} + +type TpacketReq struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 +} + +type TpacketReq3 struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 + Retire_blk_tov uint32 + Sizeof_priv uint32 + Feature_req_word uint32 +} + +type TpacketStats struct { + Packets uint32 + Drops uint32 +} + +type TpacketStatsV3 struct { + Packets uint32 + Drops uint32 + Freeze_q_cnt uint32 +} + +type TpacketAuxdata struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Vlan_tci uint16 + Vlan_tpid uint16 +} + +const ( + TPACKET_V1 = 0x0 + TPACKET_V2 = 0x1 + TPACKET_V3 = 0x2 +) + +const ( + SizeofTpacketHdr = 0x18 + SizeofTpacket2Hdr = 0x20 + SizeofTpacket3Hdr = 0x30 +) + +const ( + NF_INET_PRE_ROUTING = 0x0 + NF_INET_LOCAL_IN = 0x1 + NF_INET_FORWARD = 0x2 + NF_INET_LOCAL_OUT = 0x3 + NF_INET_POST_ROUTING = 0x4 + NF_INET_NUMHOOKS = 0x5 +) + +const ( + NF_NETDEV_INGRESS = 0x0 + NF_NETDEV_NUMHOOKS = 0x1 +) + +const ( + NFPROTO_UNSPEC = 0x0 + NFPROTO_INET = 0x1 + NFPROTO_IPV4 = 0x2 + NFPROTO_ARP = 0x3 + NFPROTO_NETDEV = 0x5 + NFPROTO_BRIDGE = 0x7 + NFPROTO_IPV6 = 0xa + NFPROTO_DECNET = 0xc + NFPROTO_NUMPROTO = 0xd +) + +type Nfgenmsg struct { + Nfgen_family uint8 + Version uint8 + Res_id uint16 +} + +const ( + NFNL_BATCH_UNSPEC = 0x0 + NFNL_BATCH_GENID = 0x1 +) + +const ( + NFT_REG_VERDICT = 0x0 + NFT_REG_1 = 0x1 + NFT_REG_2 = 0x2 + NFT_REG_3 = 0x3 + NFT_REG_4 = 0x4 + NFT_REG32_00 = 0x8 + NFT_REG32_01 = 0x9 + NFT_REG32_02 = 0xa + NFT_REG32_03 = 0xb + NFT_REG32_04 = 0xc + NFT_REG32_05 = 0xd + NFT_REG32_06 = 0xe + NFT_REG32_07 = 0xf + NFT_REG32_08 = 0x10 + NFT_REG32_09 = 0x11 + NFT_REG32_10 = 0x12 + NFT_REG32_11 = 0x13 + NFT_REG32_12 = 0x14 + NFT_REG32_13 = 0x15 + NFT_REG32_14 = 0x16 + NFT_REG32_15 = 0x17 + NFT_CONTINUE = -0x1 + NFT_BREAK = -0x2 + NFT_JUMP = -0x3 + NFT_GOTO = -0x4 + NFT_RETURN = -0x5 + NFT_MSG_NEWTABLE = 0x0 + NFT_MSG_GETTABLE = 0x1 + NFT_MSG_DELTABLE = 0x2 + NFT_MSG_NEWCHAIN = 0x3 + NFT_MSG_GETCHAIN = 0x4 + NFT_MSG_DELCHAIN = 0x5 + NFT_MSG_NEWRULE = 0x6 + NFT_MSG_GETRULE = 0x7 + NFT_MSG_DELRULE = 0x8 + NFT_MSG_NEWSET = 0x9 + NFT_MSG_GETSET = 0xa + NFT_MSG_DELSET = 0xb + NFT_MSG_NEWSETELEM = 0xc + NFT_MSG_GETSETELEM = 0xd + NFT_MSG_DELSETELEM = 0xe + NFT_MSG_NEWGEN = 0xf + NFT_MSG_GETGEN = 0x10 + NFT_MSG_TRACE = 0x11 + NFT_MSG_NEWOBJ = 0x12 + NFT_MSG_GETOBJ = 0x13 + NFT_MSG_DELOBJ = 0x14 + NFT_MSG_GETOBJ_RESET = 0x15 + NFT_MSG_MAX = 0x19 + NFTA_LIST_UNPEC = 0x0 + NFTA_LIST_ELEM = 0x1 + NFTA_HOOK_UNSPEC = 0x0 + NFTA_HOOK_HOOKNUM = 0x1 + NFTA_HOOK_PRIORITY = 0x2 + NFTA_HOOK_DEV = 0x3 + NFT_TABLE_F_DORMANT = 0x1 + NFTA_TABLE_UNSPEC = 0x0 + NFTA_TABLE_NAME = 0x1 + NFTA_TABLE_FLAGS = 0x2 + NFTA_TABLE_USE = 0x3 + NFTA_CHAIN_UNSPEC = 0x0 + NFTA_CHAIN_TABLE = 0x1 + NFTA_CHAIN_HANDLE = 0x2 + NFTA_CHAIN_NAME = 0x3 + NFTA_CHAIN_HOOK = 0x4 + NFTA_CHAIN_POLICY = 0x5 + NFTA_CHAIN_USE = 0x6 + NFTA_CHAIN_TYPE = 0x7 + NFTA_CHAIN_COUNTERS = 0x8 + NFTA_CHAIN_PAD = 0x9 + NFTA_RULE_UNSPEC = 0x0 + NFTA_RULE_TABLE = 0x1 + NFTA_RULE_CHAIN = 0x2 + NFTA_RULE_HANDLE = 0x3 + NFTA_RULE_EXPRESSIONS = 0x4 + NFTA_RULE_COMPAT = 0x5 + NFTA_RULE_POSITION = 0x6 + NFTA_RULE_USERDATA = 0x7 + NFTA_RULE_PAD = 0x8 + NFTA_RULE_ID = 0x9 + NFT_RULE_COMPAT_F_INV = 0x2 + NFT_RULE_COMPAT_F_MASK = 0x2 + NFTA_RULE_COMPAT_UNSPEC = 0x0 + NFTA_RULE_COMPAT_PROTO = 0x1 + NFTA_RULE_COMPAT_FLAGS = 0x2 + NFT_SET_ANONYMOUS = 0x1 + NFT_SET_CONSTANT = 0x2 + NFT_SET_INTERVAL = 0x4 + NFT_SET_MAP = 0x8 + NFT_SET_TIMEOUT = 0x10 + NFT_SET_EVAL = 0x20 + NFT_SET_OBJECT = 0x40 + NFT_SET_POL_PERFORMANCE = 0x0 + NFT_SET_POL_MEMORY = 0x1 + NFTA_SET_DESC_UNSPEC = 0x0 + NFTA_SET_DESC_SIZE = 0x1 + NFTA_SET_UNSPEC = 0x0 + NFTA_SET_TABLE = 0x1 + NFTA_SET_NAME = 0x2 + NFTA_SET_FLAGS = 0x3 + NFTA_SET_KEY_TYPE = 0x4 + NFTA_SET_KEY_LEN = 0x5 + NFTA_SET_DATA_TYPE = 0x6 + NFTA_SET_DATA_LEN = 0x7 + NFTA_SET_POLICY = 0x8 + NFTA_SET_DESC = 0x9 + NFTA_SET_ID = 0xa + NFTA_SET_TIMEOUT = 0xb + NFTA_SET_GC_INTERVAL = 0xc + NFTA_SET_USERDATA = 0xd + NFTA_SET_PAD = 0xe + NFTA_SET_OBJ_TYPE = 0xf + NFT_SET_ELEM_INTERVAL_END = 0x1 + NFTA_SET_ELEM_UNSPEC = 0x0 + NFTA_SET_ELEM_KEY = 0x1 + NFTA_SET_ELEM_DATA = 0x2 + NFTA_SET_ELEM_FLAGS = 0x3 + NFTA_SET_ELEM_TIMEOUT = 0x4 + NFTA_SET_ELEM_EXPIRATION = 0x5 + NFTA_SET_ELEM_USERDATA = 0x6 + NFTA_SET_ELEM_EXPR = 0x7 + NFTA_SET_ELEM_PAD = 0x8 + NFTA_SET_ELEM_OBJREF = 0x9 + NFTA_SET_ELEM_LIST_UNSPEC = 0x0 + NFTA_SET_ELEM_LIST_TABLE = 0x1 + NFTA_SET_ELEM_LIST_SET = 0x2 + NFTA_SET_ELEM_LIST_ELEMENTS = 0x3 + NFTA_SET_ELEM_LIST_SET_ID = 0x4 + NFT_DATA_VALUE = 0x0 + NFT_DATA_VERDICT = 0xffffff00 + NFTA_DATA_UNSPEC = 0x0 + NFTA_DATA_VALUE = 0x1 + NFTA_DATA_VERDICT = 0x2 + NFTA_VERDICT_UNSPEC = 0x0 + NFTA_VERDICT_CODE = 0x1 + NFTA_VERDICT_CHAIN = 0x2 + NFTA_EXPR_UNSPEC = 0x0 + NFTA_EXPR_NAME = 0x1 + NFTA_EXPR_DATA = 0x2 + NFTA_IMMEDIATE_UNSPEC = 0x0 + NFTA_IMMEDIATE_DREG = 0x1 + NFTA_IMMEDIATE_DATA = 0x2 + NFTA_BITWISE_UNSPEC = 0x0 + NFTA_BITWISE_SREG = 0x1 + NFTA_BITWISE_DREG = 0x2 + NFTA_BITWISE_LEN = 0x3 + NFTA_BITWISE_MASK = 0x4 + NFTA_BITWISE_XOR = 0x5 + NFT_BYTEORDER_NTOH = 0x0 + NFT_BYTEORDER_HTON = 0x1 + NFTA_BYTEORDER_UNSPEC = 0x0 + NFTA_BYTEORDER_SREG = 0x1 + NFTA_BYTEORDER_DREG = 0x2 + NFTA_BYTEORDER_OP = 0x3 + NFTA_BYTEORDER_LEN = 0x4 + NFTA_BYTEORDER_SIZE = 0x5 + NFT_CMP_EQ = 0x0 + NFT_CMP_NEQ = 0x1 + NFT_CMP_LT = 0x2 + NFT_CMP_LTE = 0x3 + NFT_CMP_GT = 0x4 + NFT_CMP_GTE = 0x5 + NFTA_CMP_UNSPEC = 0x0 + NFTA_CMP_SREG = 0x1 + NFTA_CMP_OP = 0x2 + NFTA_CMP_DATA = 0x3 + NFT_RANGE_EQ = 0x0 + NFT_RANGE_NEQ = 0x1 + NFTA_RANGE_UNSPEC = 0x0 + NFTA_RANGE_SREG = 0x1 + NFTA_RANGE_OP = 0x2 + NFTA_RANGE_FROM_DATA = 0x3 + NFTA_RANGE_TO_DATA = 0x4 + NFT_LOOKUP_F_INV = 0x1 + NFTA_LOOKUP_UNSPEC = 0x0 + NFTA_LOOKUP_SET = 0x1 + NFTA_LOOKUP_SREG = 0x2 + NFTA_LOOKUP_DREG = 0x3 + NFTA_LOOKUP_SET_ID = 0x4 + NFTA_LOOKUP_FLAGS = 0x5 + NFT_DYNSET_OP_ADD = 0x0 + NFT_DYNSET_OP_UPDATE = 0x1 + NFT_DYNSET_F_INV = 0x1 + NFTA_DYNSET_UNSPEC = 0x0 + NFTA_DYNSET_SET_NAME = 0x1 + NFTA_DYNSET_SET_ID = 0x2 + NFTA_DYNSET_OP = 0x3 + NFTA_DYNSET_SREG_KEY = 0x4 + NFTA_DYNSET_SREG_DATA = 0x5 + NFTA_DYNSET_TIMEOUT = 0x6 + NFTA_DYNSET_EXPR = 0x7 + NFTA_DYNSET_PAD = 0x8 + NFTA_DYNSET_FLAGS = 0x9 + NFT_PAYLOAD_LL_HEADER = 0x0 + NFT_PAYLOAD_NETWORK_HEADER = 0x1 + NFT_PAYLOAD_TRANSPORT_HEADER = 0x2 + NFT_PAYLOAD_CSUM_NONE = 0x0 + NFT_PAYLOAD_CSUM_INET = 0x1 + NFT_PAYLOAD_L4CSUM_PSEUDOHDR = 0x1 + NFTA_PAYLOAD_UNSPEC = 0x0 + NFTA_PAYLOAD_DREG = 0x1 + NFTA_PAYLOAD_BASE = 0x2 + NFTA_PAYLOAD_OFFSET = 0x3 + NFTA_PAYLOAD_LEN = 0x4 + NFTA_PAYLOAD_SREG = 0x5 + NFTA_PAYLOAD_CSUM_TYPE = 0x6 + NFTA_PAYLOAD_CSUM_OFFSET = 0x7 + NFTA_PAYLOAD_CSUM_FLAGS = 0x8 + NFT_EXTHDR_F_PRESENT = 0x1 + NFT_EXTHDR_OP_IPV6 = 0x0 + NFT_EXTHDR_OP_TCPOPT = 0x1 + NFTA_EXTHDR_UNSPEC = 0x0 + NFTA_EXTHDR_DREG = 0x1 + NFTA_EXTHDR_TYPE = 0x2 + NFTA_EXTHDR_OFFSET = 0x3 + NFTA_EXTHDR_LEN = 0x4 + NFTA_EXTHDR_FLAGS = 0x5 + NFTA_EXTHDR_OP = 0x6 + NFTA_EXTHDR_SREG = 0x7 + NFT_META_LEN = 0x0 + NFT_META_PROTOCOL = 0x1 + NFT_META_PRIORITY = 0x2 + NFT_META_MARK = 0x3 + NFT_META_IIF = 0x4 + NFT_META_OIF = 0x5 + NFT_META_IIFNAME = 0x6 + NFT_META_OIFNAME = 0x7 + NFT_META_IIFTYPE = 0x8 + NFT_META_OIFTYPE = 0x9 + NFT_META_SKUID = 0xa + NFT_META_SKGID = 0xb + NFT_META_NFTRACE = 0xc + NFT_META_RTCLASSID = 0xd + NFT_META_SECMARK = 0xe + NFT_META_NFPROTO = 0xf + NFT_META_L4PROTO = 0x10 + NFT_META_BRI_IIFNAME = 0x11 + NFT_META_BRI_OIFNAME = 0x12 + NFT_META_PKTTYPE = 0x13 + NFT_META_CPU = 0x14 + NFT_META_IIFGROUP = 0x15 + NFT_META_OIFGROUP = 0x16 + NFT_META_CGROUP = 0x17 + NFT_META_PRANDOM = 0x18 + NFT_RT_CLASSID = 0x0 + NFT_RT_NEXTHOP4 = 0x1 + NFT_RT_NEXTHOP6 = 0x2 + NFT_RT_TCPMSS = 0x3 + NFT_HASH_JENKINS = 0x0 + NFT_HASH_SYM = 0x1 + NFTA_HASH_UNSPEC = 0x0 + NFTA_HASH_SREG = 0x1 + NFTA_HASH_DREG = 0x2 + NFTA_HASH_LEN = 0x3 + NFTA_HASH_MODULUS = 0x4 + NFTA_HASH_SEED = 0x5 + NFTA_HASH_OFFSET = 0x6 + NFTA_HASH_TYPE = 0x7 + NFTA_META_UNSPEC = 0x0 + NFTA_META_DREG = 0x1 + NFTA_META_KEY = 0x2 + NFTA_META_SREG = 0x3 + NFTA_RT_UNSPEC = 0x0 + NFTA_RT_DREG = 0x1 + NFTA_RT_KEY = 0x2 + NFT_CT_STATE = 0x0 + NFT_CT_DIRECTION = 0x1 + NFT_CT_STATUS = 0x2 + NFT_CT_MARK = 0x3 + NFT_CT_SECMARK = 0x4 + NFT_CT_EXPIRATION = 0x5 + NFT_CT_HELPER = 0x6 + NFT_CT_L3PROTOCOL = 0x7 + NFT_CT_SRC = 0x8 + NFT_CT_DST = 0x9 + NFT_CT_PROTOCOL = 0xa + NFT_CT_PROTO_SRC = 0xb + NFT_CT_PROTO_DST = 0xc + NFT_CT_LABELS = 0xd + NFT_CT_PKTS = 0xe + NFT_CT_BYTES = 0xf + NFT_CT_AVGPKT = 0x10 + NFT_CT_ZONE = 0x11 + NFT_CT_EVENTMASK = 0x12 + NFTA_CT_UNSPEC = 0x0 + NFTA_CT_DREG = 0x1 + NFTA_CT_KEY = 0x2 + NFTA_CT_DIRECTION = 0x3 + NFTA_CT_SREG = 0x4 + NFT_LIMIT_PKTS = 0x0 + NFT_LIMIT_PKT_BYTES = 0x1 + NFT_LIMIT_F_INV = 0x1 + NFTA_LIMIT_UNSPEC = 0x0 + NFTA_LIMIT_RATE = 0x1 + NFTA_LIMIT_UNIT = 0x2 + NFTA_LIMIT_BURST = 0x3 + NFTA_LIMIT_TYPE = 0x4 + NFTA_LIMIT_FLAGS = 0x5 + NFTA_LIMIT_PAD = 0x6 + NFTA_COUNTER_UNSPEC = 0x0 + NFTA_COUNTER_BYTES = 0x1 + NFTA_COUNTER_PACKETS = 0x2 + NFTA_COUNTER_PAD = 0x3 + NFTA_LOG_UNSPEC = 0x0 + NFTA_LOG_GROUP = 0x1 + NFTA_LOG_PREFIX = 0x2 + NFTA_LOG_SNAPLEN = 0x3 + NFTA_LOG_QTHRESHOLD = 0x4 + NFTA_LOG_LEVEL = 0x5 + NFTA_LOG_FLAGS = 0x6 + NFTA_QUEUE_UNSPEC = 0x0 + NFTA_QUEUE_NUM = 0x1 + NFTA_QUEUE_TOTAL = 0x2 + NFTA_QUEUE_FLAGS = 0x3 + NFTA_QUEUE_SREG_QNUM = 0x4 + NFT_QUOTA_F_INV = 0x1 + NFT_QUOTA_F_DEPLETED = 0x2 + NFTA_QUOTA_UNSPEC = 0x0 + NFTA_QUOTA_BYTES = 0x1 + NFTA_QUOTA_FLAGS = 0x2 + NFTA_QUOTA_PAD = 0x3 + NFTA_QUOTA_CONSUMED = 0x4 + NFT_REJECT_ICMP_UNREACH = 0x0 + NFT_REJECT_TCP_RST = 0x1 + NFT_REJECT_ICMPX_UNREACH = 0x2 + NFT_REJECT_ICMPX_NO_ROUTE = 0x0 + NFT_REJECT_ICMPX_PORT_UNREACH = 0x1 + NFT_REJECT_ICMPX_HOST_UNREACH = 0x2 + NFT_REJECT_ICMPX_ADMIN_PROHIBITED = 0x3 + NFTA_REJECT_UNSPEC = 0x0 + NFTA_REJECT_TYPE = 0x1 + NFTA_REJECT_ICMP_CODE = 0x2 + NFT_NAT_SNAT = 0x0 + NFT_NAT_DNAT = 0x1 + NFTA_NAT_UNSPEC = 0x0 + NFTA_NAT_TYPE = 0x1 + NFTA_NAT_FAMILY = 0x2 + NFTA_NAT_REG_ADDR_MIN = 0x3 + NFTA_NAT_REG_ADDR_MAX = 0x4 + NFTA_NAT_REG_PROTO_MIN = 0x5 + NFTA_NAT_REG_PROTO_MAX = 0x6 + NFTA_NAT_FLAGS = 0x7 + NFTA_MASQ_UNSPEC = 0x0 + NFTA_MASQ_FLAGS = 0x1 + NFTA_MASQ_REG_PROTO_MIN = 0x2 + NFTA_MASQ_REG_PROTO_MAX = 0x3 + NFTA_REDIR_UNSPEC = 0x0 + NFTA_REDIR_REG_PROTO_MIN = 0x1 + NFTA_REDIR_REG_PROTO_MAX = 0x2 + NFTA_REDIR_FLAGS = 0x3 + NFTA_DUP_UNSPEC = 0x0 + NFTA_DUP_SREG_ADDR = 0x1 + NFTA_DUP_SREG_DEV = 0x2 + NFTA_FWD_UNSPEC = 0x0 + NFTA_FWD_SREG_DEV = 0x1 + NFTA_OBJREF_UNSPEC = 0x0 + NFTA_OBJREF_IMM_TYPE = 0x1 + NFTA_OBJREF_IMM_NAME = 0x2 + NFTA_OBJREF_SET_SREG = 0x3 + NFTA_OBJREF_SET_NAME = 0x4 + NFTA_OBJREF_SET_ID = 0x5 + NFTA_GEN_UNSPEC = 0x0 + NFTA_GEN_ID = 0x1 + NFTA_GEN_PROC_PID = 0x2 + NFTA_GEN_PROC_NAME = 0x3 + NFTA_FIB_UNSPEC = 0x0 + NFTA_FIB_DREG = 0x1 + NFTA_FIB_RESULT = 0x2 + NFTA_FIB_FLAGS = 0x3 + NFT_FIB_RESULT_UNSPEC = 0x0 + NFT_FIB_RESULT_OIF = 0x1 + NFT_FIB_RESULT_OIFNAME = 0x2 + NFT_FIB_RESULT_ADDRTYPE = 0x3 + NFTA_FIB_F_SADDR = 0x1 + NFTA_FIB_F_DADDR = 0x2 + NFTA_FIB_F_MARK = 0x4 + NFTA_FIB_F_IIF = 0x8 + NFTA_FIB_F_OIF = 0x10 + NFTA_FIB_F_PRESENT = 0x20 + NFTA_CT_HELPER_UNSPEC = 0x0 + NFTA_CT_HELPER_NAME = 0x1 + NFTA_CT_HELPER_L3PROTO = 0x2 + NFTA_CT_HELPER_L4PROTO = 0x3 + NFTA_OBJ_UNSPEC = 0x0 + NFTA_OBJ_TABLE = 0x1 + NFTA_OBJ_NAME = 0x2 + NFTA_OBJ_TYPE = 0x3 + NFTA_OBJ_DATA = 0x4 + NFTA_OBJ_USE = 0x5 + NFTA_TRACE_UNSPEC = 0x0 + NFTA_TRACE_TABLE = 0x1 + NFTA_TRACE_CHAIN = 0x2 + NFTA_TRACE_RULE_HANDLE = 0x3 + NFTA_TRACE_TYPE = 0x4 + NFTA_TRACE_VERDICT = 0x5 + NFTA_TRACE_ID = 0x6 + NFTA_TRACE_LL_HEADER = 0x7 + NFTA_TRACE_NETWORK_HEADER = 0x8 + NFTA_TRACE_TRANSPORT_HEADER = 0x9 + NFTA_TRACE_IIF = 0xa + NFTA_TRACE_IIFTYPE = 0xb + NFTA_TRACE_OIF = 0xc + NFTA_TRACE_OIFTYPE = 0xd + NFTA_TRACE_MARK = 0xe + NFTA_TRACE_NFPROTO = 0xf + NFTA_TRACE_POLICY = 0x10 + NFTA_TRACE_PAD = 0x11 + NFT_TRACETYPE_UNSPEC = 0x0 + NFT_TRACETYPE_POLICY = 0x1 + NFT_TRACETYPE_RETURN = 0x2 + NFT_TRACETYPE_RULE = 0x3 + NFTA_NG_UNSPEC = 0x0 + NFTA_NG_DREG = 0x1 + NFTA_NG_MODULUS = 0x2 + NFTA_NG_TYPE = 0x3 + NFTA_NG_OFFSET = 0x4 + NFT_NG_INCREMENTAL = 0x0 + NFT_NG_RANDOM = 0x1 +) diff --git a/api/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go b/api/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go new file mode 100644 index 0000000..2ab0cb9 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go @@ -0,0 +1,1835 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m64 linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,linux + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Timex struct { + Modes uint32 + _ [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + _ [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + _ [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + _ [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + Ino uint64 + Nlink uint64 + Mode uint32 + Uid uint32 + Gid uint32 + _ int32 + Rdev uint64 + Size int64 + Blksize int64 + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + _ [3]int64 +} + +type StatxTimestamp struct { + Sec int64 + Nsec uint32 + _ int32 +} + +type Statx_t struct { + Mask uint32 + Blksize uint32 + Attributes uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Mode uint16 + _ [1]uint16 + Ino uint64 + Size uint64 + Blocks uint64 + Attributes_mask uint64 + Atime StatxTimestamp + Btime StatxTimestamp + Ctime StatxTimestamp + Mtime StatxTimestamp + Rdev_major uint32 + Rdev_minor uint32 + Dev_major uint32 + Dev_minor uint32 + _ [14]uint64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + _ [5]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + _ [4]byte + Start int64 + Len int64 + Pid int32 + _ [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrL2 struct { + Family uint16 + Psm uint16 + Bdaddr [6]uint8 + Cid uint16 + Bdaddr_type uint8 + _ [1]byte +} + +type RawSockaddrCAN struct { + Family uint16 + _ [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + _ [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + _ [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + _ [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrL2 = 0xe + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x10 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_NUM_VF = 0x15 + IFLA_VFINFO_LIST = 0x16 + IFLA_STATS64 = 0x17 + IFLA_VF_PORTS = 0x18 + IFLA_PORT_SELF = 0x19 + IFLA_AF_SPEC = 0x1a + IFLA_GROUP = 0x1b + IFLA_NET_NS_FD = 0x1c + IFLA_EXT_MASK = 0x1d + IFLA_PROMISCUITY = 0x1e + IFLA_NUM_TX_QUEUES = 0x1f + IFLA_NUM_RX_QUEUES = 0x20 + IFLA_CARRIER = 0x21 + IFLA_PHYS_PORT_ID = 0x22 + IFLA_CARRIER_CHANGES = 0x23 + IFLA_PHYS_SWITCH_ID = 0x24 + IFLA_LINK_NETNSID = 0x25 + IFLA_PHYS_PORT_NAME = 0x26 + IFLA_PROTO_DOWN = 0x27 + IFLA_GSO_MAX_SEGS = 0x28 + IFLA_GSO_MAX_SIZE = 0x29 + IFLA_PAD = 0x2a + IFLA_XDP = 0x2b + IFLA_EVENT = 0x2c + IFLA_NEW_NETNSID = 0x2d + IFLA_IF_NETNSID = 0x2e + IFLA_MAX = 0x31 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + _ uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + _ [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + R15 uint64 + R14 uint64 + R13 uint64 + R12 uint64 + Rbp uint64 + Rbx uint64 + R11 uint64 + R10 uint64 + R9 uint64 + R8 uint64 + Rax uint64 + Rcx uint64 + Rdx uint64 + Rsi uint64 + Rdi uint64 + Orig_rax uint64 + Rip uint64 + Cs uint64 + Eflags uint64 + Rsp uint64 + Ss uint64 + Fs_base uint64 + Gs_base uint64 + Ds uint64 + Es uint64 + Fs uint64 + Gs uint64 +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + _ [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + _ [0]int8 + _ [4]byte +} + +type Utsname struct { + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte +} + +type Ustat_t struct { + Tfree int32 + _ [4]byte + Tinode uint64 + Fname [6]int8 + Fpack [6]int8 + _ [4]byte +} + +type EpollEvent struct { + Events uint32 + Fd int32 + Pad int32 +} + +const ( + AT_EMPTY_PATH = 0x1000 + AT_FDCWD = -0x64 + AT_NO_AUTOMOUNT = 0x800 + AT_REMOVEDIR = 0x200 + + AT_STATX_SYNC_AS_STAT = 0x0 + AT_STATX_FORCE_SYNC = 0x2000 + AT_STATX_DONT_SYNC = 0x4000 + + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + Val [16]uint64 +} + +const RNDGETENTCNT = 0x80045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [19]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + _ [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + _ [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + _ [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + _ [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type CGroupStats struct { + Sleeping uint64 + Running uint64 + Stopped uint64 + Uninterruptible uint64 + Io_wait uint64 +} + +const ( + CGROUPSTATS_CMD_UNSPEC = 0x3 + CGROUPSTATS_CMD_GET = 0x4 + CGROUPSTATS_CMD_NEW = 0x5 + CGROUPSTATS_TYPE_UNSPEC = 0x0 + CGROUPSTATS_TYPE_CGROUP_STATS = 0x1 + CGROUPSTATS_CMD_ATTR_UNSPEC = 0x0 + CGROUPSTATS_CMD_ATTR_FD = 0x1 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) + +type cpuMask uint64 + +const ( + _CPU_SETSIZE = 0x400 + _NCPUBITS = 0x40 +) + +const ( + BDADDR_BREDR = 0x0 + BDADDR_LE_PUBLIC = 0x1 + BDADDR_LE_RANDOM = 0x2 +) + +type PerfEventAttr struct { + Type uint32 + Size uint32 + Config uint64 + Sample uint64 + Sample_type uint64 + Read_format uint64 + Bits uint64 + Wakeup uint32 + Bp_type uint32 + Ext1 uint64 + Ext2 uint64 + Branch_sample_type uint64 + Sample_regs_user uint64 + Sample_stack_user uint32 + Clockid int32 + Sample_regs_intr uint64 + Aux_watermark uint32 + _ uint32 +} + +type PerfEventMmapPage struct { + Version uint32 + Compat_version uint32 + Lock uint32 + Index uint32 + Offset int64 + Time_enabled uint64 + Time_running uint64 + Capabilities uint64 + Pmc_width uint16 + Time_shift uint16 + Time_mult uint32 + Time_offset uint64 + Time_zero uint64 + Size uint32 + _ [948]uint8 + Data_head uint64 + Data_tail uint64 + Data_offset uint64 + Data_size uint64 + Aux_head uint64 + Aux_tail uint64 + Aux_offset uint64 + Aux_size uint64 +} + +const ( + PerfBitDisabled uint64 = CBitFieldMaskBit0 + PerfBitInherit = CBitFieldMaskBit1 + PerfBitPinned = CBitFieldMaskBit2 + PerfBitExclusive = CBitFieldMaskBit3 + PerfBitExcludeUser = CBitFieldMaskBit4 + PerfBitExcludeKernel = CBitFieldMaskBit5 + PerfBitExcludeHv = CBitFieldMaskBit6 + PerfBitExcludeIdle = CBitFieldMaskBit7 + PerfBitMmap = CBitFieldMaskBit8 + PerfBitComm = CBitFieldMaskBit9 + PerfBitFreq = CBitFieldMaskBit10 + PerfBitInheritStat = CBitFieldMaskBit11 + PerfBitEnableOnExec = CBitFieldMaskBit12 + PerfBitTask = CBitFieldMaskBit13 + PerfBitWatermark = CBitFieldMaskBit14 + PerfBitPreciseIPBit1 = CBitFieldMaskBit15 + PerfBitPreciseIPBit2 = CBitFieldMaskBit16 + PerfBitMmapData = CBitFieldMaskBit17 + PerfBitSampleIDAll = CBitFieldMaskBit18 + PerfBitExcludeHost = CBitFieldMaskBit19 + PerfBitExcludeGuest = CBitFieldMaskBit20 + PerfBitExcludeCallchainKernel = CBitFieldMaskBit21 + PerfBitExcludeCallchainUser = CBitFieldMaskBit22 + PerfBitMmap2 = CBitFieldMaskBit23 + PerfBitCommExec = CBitFieldMaskBit24 + PerfBitUseClockID = CBitFieldMaskBit25 + PerfBitContextSwitch = CBitFieldMaskBit26 +) + +const ( + PERF_TYPE_HARDWARE = 0x0 + PERF_TYPE_SOFTWARE = 0x1 + PERF_TYPE_TRACEPOINT = 0x2 + PERF_TYPE_HW_CACHE = 0x3 + PERF_TYPE_RAW = 0x4 + PERF_TYPE_BREAKPOINT = 0x5 + + PERF_COUNT_HW_CPU_CYCLES = 0x0 + PERF_COUNT_HW_INSTRUCTIONS = 0x1 + PERF_COUNT_HW_CACHE_REFERENCES = 0x2 + PERF_COUNT_HW_CACHE_MISSES = 0x3 + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 0x4 + PERF_COUNT_HW_BRANCH_MISSES = 0x5 + PERF_COUNT_HW_BUS_CYCLES = 0x6 + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7 + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 0x8 + PERF_COUNT_HW_REF_CPU_CYCLES = 0x9 + + PERF_COUNT_HW_CACHE_L1D = 0x0 + PERF_COUNT_HW_CACHE_L1I = 0x1 + PERF_COUNT_HW_CACHE_LL = 0x2 + PERF_COUNT_HW_CACHE_DTLB = 0x3 + PERF_COUNT_HW_CACHE_ITLB = 0x4 + PERF_COUNT_HW_CACHE_BPU = 0x5 + PERF_COUNT_HW_CACHE_NODE = 0x6 + + PERF_COUNT_HW_CACHE_OP_READ = 0x0 + PERF_COUNT_HW_CACHE_OP_WRITE = 0x1 + PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2 + + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0 + PERF_COUNT_HW_CACHE_RESULT_MISS = 0x1 + + PERF_COUNT_SW_CPU_CLOCK = 0x0 + PERF_COUNT_SW_TASK_CLOCK = 0x1 + PERF_COUNT_SW_PAGE_FAULTS = 0x2 + PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3 + PERF_COUNT_SW_CPU_MIGRATIONS = 0x4 + PERF_COUNT_SW_PAGE_FAULTS_MIN = 0x5 + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 0x6 + PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 + PERF_COUNT_SW_EMULATION_FAULTS = 0x8 + PERF_COUNT_SW_DUMMY = 0x9 + + PERF_SAMPLE_IP = 0x1 + PERF_SAMPLE_TID = 0x2 + PERF_SAMPLE_TIME = 0x4 + PERF_SAMPLE_ADDR = 0x8 + PERF_SAMPLE_READ = 0x10 + PERF_SAMPLE_CALLCHAIN = 0x20 + PERF_SAMPLE_ID = 0x40 + PERF_SAMPLE_CPU = 0x80 + PERF_SAMPLE_PERIOD = 0x100 + PERF_SAMPLE_STREAM_ID = 0x200 + PERF_SAMPLE_RAW = 0x400 + PERF_SAMPLE_BRANCH_STACK = 0x800 + + PERF_SAMPLE_BRANCH_USER = 0x1 + PERF_SAMPLE_BRANCH_KERNEL = 0x2 + PERF_SAMPLE_BRANCH_HV = 0x4 + PERF_SAMPLE_BRANCH_ANY = 0x8 + PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 + PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 + PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + + PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 + PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 + PERF_FORMAT_ID = 0x4 + PERF_FORMAT_GROUP = 0x8 + + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + + PERF_CONTEXT_HV = -0x20 + PERF_CONTEXT_KERNEL = -0x80 + PERF_CONTEXT_USER = -0x200 + + PERF_CONTEXT_GUEST = -0x800 + PERF_CONTEXT_GUEST_KERNEL = -0x880 + PERF_CONTEXT_GUEST_USER = -0xa00 + + PERF_FLAG_FD_NO_GROUP = 0x1 + PERF_FLAG_FD_OUTPUT = 0x2 + PERF_FLAG_PID_CGROUP = 0x4 +) + +const ( + CBitFieldMaskBit0 = 0x1 + CBitFieldMaskBit1 = 0x2 + CBitFieldMaskBit2 = 0x4 + CBitFieldMaskBit3 = 0x8 + CBitFieldMaskBit4 = 0x10 + CBitFieldMaskBit5 = 0x20 + CBitFieldMaskBit6 = 0x40 + CBitFieldMaskBit7 = 0x80 + CBitFieldMaskBit8 = 0x100 + CBitFieldMaskBit9 = 0x200 + CBitFieldMaskBit10 = 0x400 + CBitFieldMaskBit11 = 0x800 + CBitFieldMaskBit12 = 0x1000 + CBitFieldMaskBit13 = 0x2000 + CBitFieldMaskBit14 = 0x4000 + CBitFieldMaskBit15 = 0x8000 + CBitFieldMaskBit16 = 0x10000 + CBitFieldMaskBit17 = 0x20000 + CBitFieldMaskBit18 = 0x40000 + CBitFieldMaskBit19 = 0x80000 + CBitFieldMaskBit20 = 0x100000 + CBitFieldMaskBit21 = 0x200000 + CBitFieldMaskBit22 = 0x400000 + CBitFieldMaskBit23 = 0x800000 + CBitFieldMaskBit24 = 0x1000000 + CBitFieldMaskBit25 = 0x2000000 + CBitFieldMaskBit26 = 0x4000000 + CBitFieldMaskBit27 = 0x8000000 + CBitFieldMaskBit28 = 0x10000000 + CBitFieldMaskBit29 = 0x20000000 + CBitFieldMaskBit30 = 0x40000000 + CBitFieldMaskBit31 = 0x80000000 + CBitFieldMaskBit32 = 0x100000000 + CBitFieldMaskBit33 = 0x200000000 + CBitFieldMaskBit34 = 0x400000000 + CBitFieldMaskBit35 = 0x800000000 + CBitFieldMaskBit36 = 0x1000000000 + CBitFieldMaskBit37 = 0x2000000000 + CBitFieldMaskBit38 = 0x4000000000 + CBitFieldMaskBit39 = 0x8000000000 + CBitFieldMaskBit40 = 0x10000000000 + CBitFieldMaskBit41 = 0x20000000000 + CBitFieldMaskBit42 = 0x40000000000 + CBitFieldMaskBit43 = 0x80000000000 + CBitFieldMaskBit44 = 0x100000000000 + CBitFieldMaskBit45 = 0x200000000000 + CBitFieldMaskBit46 = 0x400000000000 + CBitFieldMaskBit47 = 0x800000000000 + CBitFieldMaskBit48 = 0x1000000000000 + CBitFieldMaskBit49 = 0x2000000000000 + CBitFieldMaskBit50 = 0x4000000000000 + CBitFieldMaskBit51 = 0x8000000000000 + CBitFieldMaskBit52 = 0x10000000000000 + CBitFieldMaskBit53 = 0x20000000000000 + CBitFieldMaskBit54 = 0x40000000000000 + CBitFieldMaskBit55 = 0x80000000000000 + CBitFieldMaskBit56 = 0x100000000000000 + CBitFieldMaskBit57 = 0x200000000000000 + CBitFieldMaskBit58 = 0x400000000000000 + CBitFieldMaskBit59 = 0x800000000000000 + CBitFieldMaskBit60 = 0x1000000000000000 + CBitFieldMaskBit61 = 0x2000000000000000 + CBitFieldMaskBit62 = 0x4000000000000000 + CBitFieldMaskBit63 = 0x8000000000000000 +) + +type SockaddrStorage struct { + Family uint16 + _ [118]int8 + _ uint64 +} + +type TCPMD5Sig struct { + Addr SockaddrStorage + Flags uint8 + Prefixlen uint8 + Keylen uint16 + _ uint32 + Key [80]uint8 +} + +type HDDriveCmdHdr struct { + Command uint8 + Number uint8 + Feature uint8 + Count uint8 +} + +type HDGeometry struct { + Heads uint8 + Sectors uint8 + Cylinders uint16 + _ [4]byte + Start uint64 +} + +type HDDriveID struct { + Config uint16 + Cyls uint16 + Reserved2 uint16 + Heads uint16 + Track_bytes uint16 + Sector_bytes uint16 + Sectors uint16 + Vendor0 uint16 + Vendor1 uint16 + Vendor2 uint16 + Serial_no [20]uint8 + Buf_type uint16 + Buf_size uint16 + Ecc_bytes uint16 + Fw_rev [8]uint8 + Model [40]uint8 + Max_multsect uint8 + Vendor3 uint8 + Dword_io uint16 + Vendor4 uint8 + Capability uint8 + Reserved50 uint16 + Vendor5 uint8 + TPIO uint8 + Vendor6 uint8 + TDMA uint8 + Field_valid uint16 + Cur_cyls uint16 + Cur_heads uint16 + Cur_sectors uint16 + Cur_capacity0 uint16 + Cur_capacity1 uint16 + Multsect uint8 + Multsect_valid uint8 + Lba_capacity uint32 + Dma_1word uint16 + Dma_mword uint16 + Eide_pio_modes uint16 + Eide_dma_min uint16 + Eide_dma_time uint16 + Eide_pio uint16 + Eide_pio_iordy uint16 + Words69_70 [2]uint16 + Words71_74 [4]uint16 + Queue_depth uint16 + Words76_79 [4]uint16 + Major_rev_num uint16 + Minor_rev_num uint16 + Command_set_1 uint16 + Command_set_2 uint16 + Cfsse uint16 + Cfs_enable_1 uint16 + Cfs_enable_2 uint16 + Csf_default uint16 + Dma_ultra uint16 + Trseuc uint16 + TrsEuc uint16 + CurAPMvalues uint16 + Mprc uint16 + Hw_config uint16 + Acoustic uint16 + Msrqs uint16 + Sxfert uint16 + Sal uint16 + Spg uint32 + Lba_capacity_2 uint64 + Words104_125 [22]uint16 + Last_lun uint16 + Word127 uint16 + Dlf uint16 + Csfo uint16 + Words130_155 [26]uint16 + Word156 uint16 + Words157_159 [3]uint16 + Cfa_power uint16 + Words161_175 [15]uint16 + Words176_205 [30]uint16 + Words206_254 [49]uint16 + Integrity_word uint16 +} + +type Statfs_t struct { + Type int64 + Bsize int64 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen int64 + Frsize int64 + Flags int64 + Spare [4]int64 +} + +const ( + ST_MANDLOCK = 0x40 + ST_NOATIME = 0x400 + ST_NODEV = 0x4 + ST_NODIRATIME = 0x800 + ST_NOEXEC = 0x8 + ST_NOSUID = 0x2 + ST_RDONLY = 0x1 + ST_RELATIME = 0x1000 + ST_SYNCHRONOUS = 0x10 +) + +type TpacketHdr struct { + Status uint64 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Usec uint32 + _ [4]byte +} + +type Tpacket2Hdr struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Nsec uint32 + Vlan_tci uint16 + Vlan_tpid uint16 + _ [4]uint8 +} + +type Tpacket3Hdr struct { + Next_offset uint32 + Sec uint32 + Nsec uint32 + Snaplen uint32 + Len uint32 + Status uint32 + Mac uint16 + Net uint16 + Hv1 TpacketHdrVariant1 + _ [8]uint8 +} + +type TpacketHdrVariant1 struct { + Rxhash uint32 + Vlan_tci uint32 + Vlan_tpid uint16 + _ uint16 +} + +type TpacketBlockDesc struct { + Version uint32 + To_priv uint32 + Hdr [40]byte +} + +type TpacketReq struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 +} + +type TpacketReq3 struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 + Retire_blk_tov uint32 + Sizeof_priv uint32 + Feature_req_word uint32 +} + +type TpacketStats struct { + Packets uint32 + Drops uint32 +} + +type TpacketStatsV3 struct { + Packets uint32 + Drops uint32 + Freeze_q_cnt uint32 +} + +type TpacketAuxdata struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Vlan_tci uint16 + Vlan_tpid uint16 +} + +const ( + TPACKET_V1 = 0x0 + TPACKET_V2 = 0x1 + TPACKET_V3 = 0x2 +) + +const ( + SizeofTpacketHdr = 0x20 + SizeofTpacket2Hdr = 0x20 + SizeofTpacket3Hdr = 0x30 +) + +const ( + NF_INET_PRE_ROUTING = 0x0 + NF_INET_LOCAL_IN = 0x1 + NF_INET_FORWARD = 0x2 + NF_INET_LOCAL_OUT = 0x3 + NF_INET_POST_ROUTING = 0x4 + NF_INET_NUMHOOKS = 0x5 +) + +const ( + NF_NETDEV_INGRESS = 0x0 + NF_NETDEV_NUMHOOKS = 0x1 +) + +const ( + NFPROTO_UNSPEC = 0x0 + NFPROTO_INET = 0x1 + NFPROTO_IPV4 = 0x2 + NFPROTO_ARP = 0x3 + NFPROTO_NETDEV = 0x5 + NFPROTO_BRIDGE = 0x7 + NFPROTO_IPV6 = 0xa + NFPROTO_DECNET = 0xc + NFPROTO_NUMPROTO = 0xd +) + +type Nfgenmsg struct { + Nfgen_family uint8 + Version uint8 + Res_id uint16 +} + +const ( + NFNL_BATCH_UNSPEC = 0x0 + NFNL_BATCH_GENID = 0x1 +) + +const ( + NFT_REG_VERDICT = 0x0 + NFT_REG_1 = 0x1 + NFT_REG_2 = 0x2 + NFT_REG_3 = 0x3 + NFT_REG_4 = 0x4 + NFT_REG32_00 = 0x8 + NFT_REG32_01 = 0x9 + NFT_REG32_02 = 0xa + NFT_REG32_03 = 0xb + NFT_REG32_04 = 0xc + NFT_REG32_05 = 0xd + NFT_REG32_06 = 0xe + NFT_REG32_07 = 0xf + NFT_REG32_08 = 0x10 + NFT_REG32_09 = 0x11 + NFT_REG32_10 = 0x12 + NFT_REG32_11 = 0x13 + NFT_REG32_12 = 0x14 + NFT_REG32_13 = 0x15 + NFT_REG32_14 = 0x16 + NFT_REG32_15 = 0x17 + NFT_CONTINUE = -0x1 + NFT_BREAK = -0x2 + NFT_JUMP = -0x3 + NFT_GOTO = -0x4 + NFT_RETURN = -0x5 + NFT_MSG_NEWTABLE = 0x0 + NFT_MSG_GETTABLE = 0x1 + NFT_MSG_DELTABLE = 0x2 + NFT_MSG_NEWCHAIN = 0x3 + NFT_MSG_GETCHAIN = 0x4 + NFT_MSG_DELCHAIN = 0x5 + NFT_MSG_NEWRULE = 0x6 + NFT_MSG_GETRULE = 0x7 + NFT_MSG_DELRULE = 0x8 + NFT_MSG_NEWSET = 0x9 + NFT_MSG_GETSET = 0xa + NFT_MSG_DELSET = 0xb + NFT_MSG_NEWSETELEM = 0xc + NFT_MSG_GETSETELEM = 0xd + NFT_MSG_DELSETELEM = 0xe + NFT_MSG_NEWGEN = 0xf + NFT_MSG_GETGEN = 0x10 + NFT_MSG_TRACE = 0x11 + NFT_MSG_NEWOBJ = 0x12 + NFT_MSG_GETOBJ = 0x13 + NFT_MSG_DELOBJ = 0x14 + NFT_MSG_GETOBJ_RESET = 0x15 + NFT_MSG_MAX = 0x19 + NFTA_LIST_UNPEC = 0x0 + NFTA_LIST_ELEM = 0x1 + NFTA_HOOK_UNSPEC = 0x0 + NFTA_HOOK_HOOKNUM = 0x1 + NFTA_HOOK_PRIORITY = 0x2 + NFTA_HOOK_DEV = 0x3 + NFT_TABLE_F_DORMANT = 0x1 + NFTA_TABLE_UNSPEC = 0x0 + NFTA_TABLE_NAME = 0x1 + NFTA_TABLE_FLAGS = 0x2 + NFTA_TABLE_USE = 0x3 + NFTA_CHAIN_UNSPEC = 0x0 + NFTA_CHAIN_TABLE = 0x1 + NFTA_CHAIN_HANDLE = 0x2 + NFTA_CHAIN_NAME = 0x3 + NFTA_CHAIN_HOOK = 0x4 + NFTA_CHAIN_POLICY = 0x5 + NFTA_CHAIN_USE = 0x6 + NFTA_CHAIN_TYPE = 0x7 + NFTA_CHAIN_COUNTERS = 0x8 + NFTA_CHAIN_PAD = 0x9 + NFTA_RULE_UNSPEC = 0x0 + NFTA_RULE_TABLE = 0x1 + NFTA_RULE_CHAIN = 0x2 + NFTA_RULE_HANDLE = 0x3 + NFTA_RULE_EXPRESSIONS = 0x4 + NFTA_RULE_COMPAT = 0x5 + NFTA_RULE_POSITION = 0x6 + NFTA_RULE_USERDATA = 0x7 + NFTA_RULE_PAD = 0x8 + NFTA_RULE_ID = 0x9 + NFT_RULE_COMPAT_F_INV = 0x2 + NFT_RULE_COMPAT_F_MASK = 0x2 + NFTA_RULE_COMPAT_UNSPEC = 0x0 + NFTA_RULE_COMPAT_PROTO = 0x1 + NFTA_RULE_COMPAT_FLAGS = 0x2 + NFT_SET_ANONYMOUS = 0x1 + NFT_SET_CONSTANT = 0x2 + NFT_SET_INTERVAL = 0x4 + NFT_SET_MAP = 0x8 + NFT_SET_TIMEOUT = 0x10 + NFT_SET_EVAL = 0x20 + NFT_SET_OBJECT = 0x40 + NFT_SET_POL_PERFORMANCE = 0x0 + NFT_SET_POL_MEMORY = 0x1 + NFTA_SET_DESC_UNSPEC = 0x0 + NFTA_SET_DESC_SIZE = 0x1 + NFTA_SET_UNSPEC = 0x0 + NFTA_SET_TABLE = 0x1 + NFTA_SET_NAME = 0x2 + NFTA_SET_FLAGS = 0x3 + NFTA_SET_KEY_TYPE = 0x4 + NFTA_SET_KEY_LEN = 0x5 + NFTA_SET_DATA_TYPE = 0x6 + NFTA_SET_DATA_LEN = 0x7 + NFTA_SET_POLICY = 0x8 + NFTA_SET_DESC = 0x9 + NFTA_SET_ID = 0xa + NFTA_SET_TIMEOUT = 0xb + NFTA_SET_GC_INTERVAL = 0xc + NFTA_SET_USERDATA = 0xd + NFTA_SET_PAD = 0xe + NFTA_SET_OBJ_TYPE = 0xf + NFT_SET_ELEM_INTERVAL_END = 0x1 + NFTA_SET_ELEM_UNSPEC = 0x0 + NFTA_SET_ELEM_KEY = 0x1 + NFTA_SET_ELEM_DATA = 0x2 + NFTA_SET_ELEM_FLAGS = 0x3 + NFTA_SET_ELEM_TIMEOUT = 0x4 + NFTA_SET_ELEM_EXPIRATION = 0x5 + NFTA_SET_ELEM_USERDATA = 0x6 + NFTA_SET_ELEM_EXPR = 0x7 + NFTA_SET_ELEM_PAD = 0x8 + NFTA_SET_ELEM_OBJREF = 0x9 + NFTA_SET_ELEM_LIST_UNSPEC = 0x0 + NFTA_SET_ELEM_LIST_TABLE = 0x1 + NFTA_SET_ELEM_LIST_SET = 0x2 + NFTA_SET_ELEM_LIST_ELEMENTS = 0x3 + NFTA_SET_ELEM_LIST_SET_ID = 0x4 + NFT_DATA_VALUE = 0x0 + NFT_DATA_VERDICT = 0xffffff00 + NFTA_DATA_UNSPEC = 0x0 + NFTA_DATA_VALUE = 0x1 + NFTA_DATA_VERDICT = 0x2 + NFTA_VERDICT_UNSPEC = 0x0 + NFTA_VERDICT_CODE = 0x1 + NFTA_VERDICT_CHAIN = 0x2 + NFTA_EXPR_UNSPEC = 0x0 + NFTA_EXPR_NAME = 0x1 + NFTA_EXPR_DATA = 0x2 + NFTA_IMMEDIATE_UNSPEC = 0x0 + NFTA_IMMEDIATE_DREG = 0x1 + NFTA_IMMEDIATE_DATA = 0x2 + NFTA_BITWISE_UNSPEC = 0x0 + NFTA_BITWISE_SREG = 0x1 + NFTA_BITWISE_DREG = 0x2 + NFTA_BITWISE_LEN = 0x3 + NFTA_BITWISE_MASK = 0x4 + NFTA_BITWISE_XOR = 0x5 + NFT_BYTEORDER_NTOH = 0x0 + NFT_BYTEORDER_HTON = 0x1 + NFTA_BYTEORDER_UNSPEC = 0x0 + NFTA_BYTEORDER_SREG = 0x1 + NFTA_BYTEORDER_DREG = 0x2 + NFTA_BYTEORDER_OP = 0x3 + NFTA_BYTEORDER_LEN = 0x4 + NFTA_BYTEORDER_SIZE = 0x5 + NFT_CMP_EQ = 0x0 + NFT_CMP_NEQ = 0x1 + NFT_CMP_LT = 0x2 + NFT_CMP_LTE = 0x3 + NFT_CMP_GT = 0x4 + NFT_CMP_GTE = 0x5 + NFTA_CMP_UNSPEC = 0x0 + NFTA_CMP_SREG = 0x1 + NFTA_CMP_OP = 0x2 + NFTA_CMP_DATA = 0x3 + NFT_RANGE_EQ = 0x0 + NFT_RANGE_NEQ = 0x1 + NFTA_RANGE_UNSPEC = 0x0 + NFTA_RANGE_SREG = 0x1 + NFTA_RANGE_OP = 0x2 + NFTA_RANGE_FROM_DATA = 0x3 + NFTA_RANGE_TO_DATA = 0x4 + NFT_LOOKUP_F_INV = 0x1 + NFTA_LOOKUP_UNSPEC = 0x0 + NFTA_LOOKUP_SET = 0x1 + NFTA_LOOKUP_SREG = 0x2 + NFTA_LOOKUP_DREG = 0x3 + NFTA_LOOKUP_SET_ID = 0x4 + NFTA_LOOKUP_FLAGS = 0x5 + NFT_DYNSET_OP_ADD = 0x0 + NFT_DYNSET_OP_UPDATE = 0x1 + NFT_DYNSET_F_INV = 0x1 + NFTA_DYNSET_UNSPEC = 0x0 + NFTA_DYNSET_SET_NAME = 0x1 + NFTA_DYNSET_SET_ID = 0x2 + NFTA_DYNSET_OP = 0x3 + NFTA_DYNSET_SREG_KEY = 0x4 + NFTA_DYNSET_SREG_DATA = 0x5 + NFTA_DYNSET_TIMEOUT = 0x6 + NFTA_DYNSET_EXPR = 0x7 + NFTA_DYNSET_PAD = 0x8 + NFTA_DYNSET_FLAGS = 0x9 + NFT_PAYLOAD_LL_HEADER = 0x0 + NFT_PAYLOAD_NETWORK_HEADER = 0x1 + NFT_PAYLOAD_TRANSPORT_HEADER = 0x2 + NFT_PAYLOAD_CSUM_NONE = 0x0 + NFT_PAYLOAD_CSUM_INET = 0x1 + NFT_PAYLOAD_L4CSUM_PSEUDOHDR = 0x1 + NFTA_PAYLOAD_UNSPEC = 0x0 + NFTA_PAYLOAD_DREG = 0x1 + NFTA_PAYLOAD_BASE = 0x2 + NFTA_PAYLOAD_OFFSET = 0x3 + NFTA_PAYLOAD_LEN = 0x4 + NFTA_PAYLOAD_SREG = 0x5 + NFTA_PAYLOAD_CSUM_TYPE = 0x6 + NFTA_PAYLOAD_CSUM_OFFSET = 0x7 + NFTA_PAYLOAD_CSUM_FLAGS = 0x8 + NFT_EXTHDR_F_PRESENT = 0x1 + NFT_EXTHDR_OP_IPV6 = 0x0 + NFT_EXTHDR_OP_TCPOPT = 0x1 + NFTA_EXTHDR_UNSPEC = 0x0 + NFTA_EXTHDR_DREG = 0x1 + NFTA_EXTHDR_TYPE = 0x2 + NFTA_EXTHDR_OFFSET = 0x3 + NFTA_EXTHDR_LEN = 0x4 + NFTA_EXTHDR_FLAGS = 0x5 + NFTA_EXTHDR_OP = 0x6 + NFTA_EXTHDR_SREG = 0x7 + NFT_META_LEN = 0x0 + NFT_META_PROTOCOL = 0x1 + NFT_META_PRIORITY = 0x2 + NFT_META_MARK = 0x3 + NFT_META_IIF = 0x4 + NFT_META_OIF = 0x5 + NFT_META_IIFNAME = 0x6 + NFT_META_OIFNAME = 0x7 + NFT_META_IIFTYPE = 0x8 + NFT_META_OIFTYPE = 0x9 + NFT_META_SKUID = 0xa + NFT_META_SKGID = 0xb + NFT_META_NFTRACE = 0xc + NFT_META_RTCLASSID = 0xd + NFT_META_SECMARK = 0xe + NFT_META_NFPROTO = 0xf + NFT_META_L4PROTO = 0x10 + NFT_META_BRI_IIFNAME = 0x11 + NFT_META_BRI_OIFNAME = 0x12 + NFT_META_PKTTYPE = 0x13 + NFT_META_CPU = 0x14 + NFT_META_IIFGROUP = 0x15 + NFT_META_OIFGROUP = 0x16 + NFT_META_CGROUP = 0x17 + NFT_META_PRANDOM = 0x18 + NFT_RT_CLASSID = 0x0 + NFT_RT_NEXTHOP4 = 0x1 + NFT_RT_NEXTHOP6 = 0x2 + NFT_RT_TCPMSS = 0x3 + NFT_HASH_JENKINS = 0x0 + NFT_HASH_SYM = 0x1 + NFTA_HASH_UNSPEC = 0x0 + NFTA_HASH_SREG = 0x1 + NFTA_HASH_DREG = 0x2 + NFTA_HASH_LEN = 0x3 + NFTA_HASH_MODULUS = 0x4 + NFTA_HASH_SEED = 0x5 + NFTA_HASH_OFFSET = 0x6 + NFTA_HASH_TYPE = 0x7 + NFTA_META_UNSPEC = 0x0 + NFTA_META_DREG = 0x1 + NFTA_META_KEY = 0x2 + NFTA_META_SREG = 0x3 + NFTA_RT_UNSPEC = 0x0 + NFTA_RT_DREG = 0x1 + NFTA_RT_KEY = 0x2 + NFT_CT_STATE = 0x0 + NFT_CT_DIRECTION = 0x1 + NFT_CT_STATUS = 0x2 + NFT_CT_MARK = 0x3 + NFT_CT_SECMARK = 0x4 + NFT_CT_EXPIRATION = 0x5 + NFT_CT_HELPER = 0x6 + NFT_CT_L3PROTOCOL = 0x7 + NFT_CT_SRC = 0x8 + NFT_CT_DST = 0x9 + NFT_CT_PROTOCOL = 0xa + NFT_CT_PROTO_SRC = 0xb + NFT_CT_PROTO_DST = 0xc + NFT_CT_LABELS = 0xd + NFT_CT_PKTS = 0xe + NFT_CT_BYTES = 0xf + NFT_CT_AVGPKT = 0x10 + NFT_CT_ZONE = 0x11 + NFT_CT_EVENTMASK = 0x12 + NFTA_CT_UNSPEC = 0x0 + NFTA_CT_DREG = 0x1 + NFTA_CT_KEY = 0x2 + NFTA_CT_DIRECTION = 0x3 + NFTA_CT_SREG = 0x4 + NFT_LIMIT_PKTS = 0x0 + NFT_LIMIT_PKT_BYTES = 0x1 + NFT_LIMIT_F_INV = 0x1 + NFTA_LIMIT_UNSPEC = 0x0 + NFTA_LIMIT_RATE = 0x1 + NFTA_LIMIT_UNIT = 0x2 + NFTA_LIMIT_BURST = 0x3 + NFTA_LIMIT_TYPE = 0x4 + NFTA_LIMIT_FLAGS = 0x5 + NFTA_LIMIT_PAD = 0x6 + NFTA_COUNTER_UNSPEC = 0x0 + NFTA_COUNTER_BYTES = 0x1 + NFTA_COUNTER_PACKETS = 0x2 + NFTA_COUNTER_PAD = 0x3 + NFTA_LOG_UNSPEC = 0x0 + NFTA_LOG_GROUP = 0x1 + NFTA_LOG_PREFIX = 0x2 + NFTA_LOG_SNAPLEN = 0x3 + NFTA_LOG_QTHRESHOLD = 0x4 + NFTA_LOG_LEVEL = 0x5 + NFTA_LOG_FLAGS = 0x6 + NFTA_QUEUE_UNSPEC = 0x0 + NFTA_QUEUE_NUM = 0x1 + NFTA_QUEUE_TOTAL = 0x2 + NFTA_QUEUE_FLAGS = 0x3 + NFTA_QUEUE_SREG_QNUM = 0x4 + NFT_QUOTA_F_INV = 0x1 + NFT_QUOTA_F_DEPLETED = 0x2 + NFTA_QUOTA_UNSPEC = 0x0 + NFTA_QUOTA_BYTES = 0x1 + NFTA_QUOTA_FLAGS = 0x2 + NFTA_QUOTA_PAD = 0x3 + NFTA_QUOTA_CONSUMED = 0x4 + NFT_REJECT_ICMP_UNREACH = 0x0 + NFT_REJECT_TCP_RST = 0x1 + NFT_REJECT_ICMPX_UNREACH = 0x2 + NFT_REJECT_ICMPX_NO_ROUTE = 0x0 + NFT_REJECT_ICMPX_PORT_UNREACH = 0x1 + NFT_REJECT_ICMPX_HOST_UNREACH = 0x2 + NFT_REJECT_ICMPX_ADMIN_PROHIBITED = 0x3 + NFTA_REJECT_UNSPEC = 0x0 + NFTA_REJECT_TYPE = 0x1 + NFTA_REJECT_ICMP_CODE = 0x2 + NFT_NAT_SNAT = 0x0 + NFT_NAT_DNAT = 0x1 + NFTA_NAT_UNSPEC = 0x0 + NFTA_NAT_TYPE = 0x1 + NFTA_NAT_FAMILY = 0x2 + NFTA_NAT_REG_ADDR_MIN = 0x3 + NFTA_NAT_REG_ADDR_MAX = 0x4 + NFTA_NAT_REG_PROTO_MIN = 0x5 + NFTA_NAT_REG_PROTO_MAX = 0x6 + NFTA_NAT_FLAGS = 0x7 + NFTA_MASQ_UNSPEC = 0x0 + NFTA_MASQ_FLAGS = 0x1 + NFTA_MASQ_REG_PROTO_MIN = 0x2 + NFTA_MASQ_REG_PROTO_MAX = 0x3 + NFTA_REDIR_UNSPEC = 0x0 + NFTA_REDIR_REG_PROTO_MIN = 0x1 + NFTA_REDIR_REG_PROTO_MAX = 0x2 + NFTA_REDIR_FLAGS = 0x3 + NFTA_DUP_UNSPEC = 0x0 + NFTA_DUP_SREG_ADDR = 0x1 + NFTA_DUP_SREG_DEV = 0x2 + NFTA_FWD_UNSPEC = 0x0 + NFTA_FWD_SREG_DEV = 0x1 + NFTA_OBJREF_UNSPEC = 0x0 + NFTA_OBJREF_IMM_TYPE = 0x1 + NFTA_OBJREF_IMM_NAME = 0x2 + NFTA_OBJREF_SET_SREG = 0x3 + NFTA_OBJREF_SET_NAME = 0x4 + NFTA_OBJREF_SET_ID = 0x5 + NFTA_GEN_UNSPEC = 0x0 + NFTA_GEN_ID = 0x1 + NFTA_GEN_PROC_PID = 0x2 + NFTA_GEN_PROC_NAME = 0x3 + NFTA_FIB_UNSPEC = 0x0 + NFTA_FIB_DREG = 0x1 + NFTA_FIB_RESULT = 0x2 + NFTA_FIB_FLAGS = 0x3 + NFT_FIB_RESULT_UNSPEC = 0x0 + NFT_FIB_RESULT_OIF = 0x1 + NFT_FIB_RESULT_OIFNAME = 0x2 + NFT_FIB_RESULT_ADDRTYPE = 0x3 + NFTA_FIB_F_SADDR = 0x1 + NFTA_FIB_F_DADDR = 0x2 + NFTA_FIB_F_MARK = 0x4 + NFTA_FIB_F_IIF = 0x8 + NFTA_FIB_F_OIF = 0x10 + NFTA_FIB_F_PRESENT = 0x20 + NFTA_CT_HELPER_UNSPEC = 0x0 + NFTA_CT_HELPER_NAME = 0x1 + NFTA_CT_HELPER_L3PROTO = 0x2 + NFTA_CT_HELPER_L4PROTO = 0x3 + NFTA_OBJ_UNSPEC = 0x0 + NFTA_OBJ_TABLE = 0x1 + NFTA_OBJ_NAME = 0x2 + NFTA_OBJ_TYPE = 0x3 + NFTA_OBJ_DATA = 0x4 + NFTA_OBJ_USE = 0x5 + NFTA_TRACE_UNSPEC = 0x0 + NFTA_TRACE_TABLE = 0x1 + NFTA_TRACE_CHAIN = 0x2 + NFTA_TRACE_RULE_HANDLE = 0x3 + NFTA_TRACE_TYPE = 0x4 + NFTA_TRACE_VERDICT = 0x5 + NFTA_TRACE_ID = 0x6 + NFTA_TRACE_LL_HEADER = 0x7 + NFTA_TRACE_NETWORK_HEADER = 0x8 + NFTA_TRACE_TRANSPORT_HEADER = 0x9 + NFTA_TRACE_IIF = 0xa + NFTA_TRACE_IIFTYPE = 0xb + NFTA_TRACE_OIF = 0xc + NFTA_TRACE_OIFTYPE = 0xd + NFTA_TRACE_MARK = 0xe + NFTA_TRACE_NFPROTO = 0xf + NFTA_TRACE_POLICY = 0x10 + NFTA_TRACE_PAD = 0x11 + NFT_TRACETYPE_UNSPEC = 0x0 + NFT_TRACETYPE_POLICY = 0x1 + NFT_TRACETYPE_RETURN = 0x2 + NFT_TRACETYPE_RULE = 0x3 + NFTA_NG_UNSPEC = 0x0 + NFTA_NG_DREG = 0x1 + NFTA_NG_MODULUS = 0x2 + NFTA_NG_TYPE = 0x3 + NFTA_NG_OFFSET = 0x4 + NFT_NG_INCREMENTAL = 0x0 + NFT_NG_RANDOM = 0x1 +) diff --git a/api/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go b/api/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go new file mode 100644 index 0000000..18d577b --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go @@ -0,0 +1,1804 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,linux + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int32 + Nsec int32 +} + +type Timeval struct { + Sec int32 + Usec int32 +} + +type Timex struct { + Modes uint32 + Offset int32 + Freq int32 + Maxerror int32 + Esterror int32 + Status int32 + Constant int32 + Precision int32 + Tolerance int32 + Time Timeval + Tick int32 + Ppsfreq int32 + Jitter int32 + Shift int32 + Stabil int32 + Jitcnt int32 + Calcnt int32 + Errcnt int32 + Stbcnt int32 + Tai int32 + _ [44]byte +} + +type Time_t int32 + +type Tms struct { + Utime int32 + Stime int32 + Cutime int32 + Cstime int32 +} + +type Utimbuf struct { + Actime int32 + Modtime int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + _ uint16 + _ [2]byte + _ uint32 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint64 + _ uint16 + _ [6]byte + Size int64 + Blksize int32 + _ [4]byte + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Ino uint64 +} + +type StatxTimestamp struct { + Sec int64 + Nsec uint32 + _ int32 +} + +type Statx_t struct { + Mask uint32 + Blksize uint32 + Attributes uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Mode uint16 + _ [1]uint16 + Ino uint64 + Size uint64 + Blocks uint64 + Attributes_mask uint64 + Atime StatxTimestamp + Btime StatxTimestamp + Ctime StatxTimestamp + Mtime StatxTimestamp + Rdev_major uint32 + Rdev_minor uint32 + Dev_major uint32 + Dev_minor uint32 + _ [14]uint64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]uint8 + _ [5]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + _ [4]byte + Start int64 + Len int64 + Pid int32 + _ [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrL2 struct { + Family uint16 + Psm uint16 + Bdaddr [6]uint8 + Cid uint16 + Bdaddr_type uint8 + _ [1]byte +} + +type RawSockaddrCAN struct { + Family uint16 + _ [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]uint8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]uint8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + _ [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrL2 = 0xe + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_NUM_VF = 0x15 + IFLA_VFINFO_LIST = 0x16 + IFLA_STATS64 = 0x17 + IFLA_VF_PORTS = 0x18 + IFLA_PORT_SELF = 0x19 + IFLA_AF_SPEC = 0x1a + IFLA_GROUP = 0x1b + IFLA_NET_NS_FD = 0x1c + IFLA_EXT_MASK = 0x1d + IFLA_PROMISCUITY = 0x1e + IFLA_NUM_TX_QUEUES = 0x1f + IFLA_NUM_RX_QUEUES = 0x20 + IFLA_CARRIER = 0x21 + IFLA_PHYS_PORT_ID = 0x22 + IFLA_CARRIER_CHANGES = 0x23 + IFLA_PHYS_SWITCH_ID = 0x24 + IFLA_LINK_NETNSID = 0x25 + IFLA_PHYS_PORT_NAME = 0x26 + IFLA_PROTO_DOWN = 0x27 + IFLA_GSO_MAX_SEGS = 0x28 + IFLA_GSO_MAX_SIZE = 0x29 + IFLA_PAD = 0x2a + IFLA_XDP = 0x2b + IFLA_EVENT = 0x2c + IFLA_NEW_NETNSID = 0x2d + IFLA_IF_NETNSID = 0x2e + IFLA_MAX = 0x31 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + _ uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x8 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + _ [2]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Uregs [18]uint32 +} + +type FdSet struct { + Bits [32]int32 +} + +type Sysinfo_t struct { + Uptime int32 + Loads [3]uint32 + Totalram uint32 + Freeram uint32 + Sharedram uint32 + Bufferram uint32 + Totalswap uint32 + Freeswap uint32 + Procs uint16 + Pad uint16 + Totalhigh uint32 + Freehigh uint32 + Unit uint32 + _ [8]uint8 +} + +type Utsname struct { + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte +} + +type Ustat_t struct { + Tfree int32 + Tinode uint32 + Fname [6]uint8 + Fpack [6]uint8 +} + +type EpollEvent struct { + Events uint32 + PadFd int32 + Fd int32 + Pad int32 +} + +const ( + AT_EMPTY_PATH = 0x1000 + AT_FDCWD = -0x64 + AT_NO_AUTOMOUNT = 0x800 + AT_REMOVEDIR = 0x200 + + AT_STATX_SYNC_AS_STAT = 0x0 + AT_STATX_FORCE_SYNC = 0x2000 + AT_STATX_DONT_SYNC = 0x4000 + + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + Val [32]uint32 +} + +const RNDGETENTCNT = 0x80045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [19]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + _ [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + _ [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]uint8 + Ac_sched uint8 + Ac_pad [3]uint8 + _ [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + _ [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type CGroupStats struct { + Sleeping uint64 + Running uint64 + Stopped uint64 + Uninterruptible uint64 + Io_wait uint64 +} + +const ( + CGROUPSTATS_CMD_UNSPEC = 0x3 + CGROUPSTATS_CMD_GET = 0x4 + CGROUPSTATS_CMD_NEW = 0x5 + CGROUPSTATS_TYPE_UNSPEC = 0x0 + CGROUPSTATS_TYPE_CGROUP_STATS = 0x1 + CGROUPSTATS_CMD_ATTR_UNSPEC = 0x0 + CGROUPSTATS_CMD_ATTR_FD = 0x1 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) + +type cpuMask uint32 + +const ( + _CPU_SETSIZE = 0x400 + _NCPUBITS = 0x20 +) + +const ( + BDADDR_BREDR = 0x0 + BDADDR_LE_PUBLIC = 0x1 + BDADDR_LE_RANDOM = 0x2 +) + +type PerfEventAttr struct { + Type uint32 + Size uint32 + Config uint64 + Sample uint64 + Sample_type uint64 + Read_format uint64 + Bits uint64 + Wakeup uint32 + Bp_type uint32 + Ext1 uint64 + Ext2 uint64 + Branch_sample_type uint64 + Sample_regs_user uint64 + Sample_stack_user uint32 + Clockid int32 + Sample_regs_intr uint64 + Aux_watermark uint32 + _ uint32 +} + +type PerfEventMmapPage struct { + Version uint32 + Compat_version uint32 + Lock uint32 + Index uint32 + Offset int64 + Time_enabled uint64 + Time_running uint64 + Capabilities uint64 + Pmc_width uint16 + Time_shift uint16 + Time_mult uint32 + Time_offset uint64 + Time_zero uint64 + Size uint32 + _ [948]uint8 + Data_head uint64 + Data_tail uint64 + Data_offset uint64 + Data_size uint64 + Aux_head uint64 + Aux_tail uint64 + Aux_offset uint64 + Aux_size uint64 +} + +const ( + PerfBitDisabled uint64 = CBitFieldMaskBit0 + PerfBitInherit = CBitFieldMaskBit1 + PerfBitPinned = CBitFieldMaskBit2 + PerfBitExclusive = CBitFieldMaskBit3 + PerfBitExcludeUser = CBitFieldMaskBit4 + PerfBitExcludeKernel = CBitFieldMaskBit5 + PerfBitExcludeHv = CBitFieldMaskBit6 + PerfBitExcludeIdle = CBitFieldMaskBit7 + PerfBitMmap = CBitFieldMaskBit8 + PerfBitComm = CBitFieldMaskBit9 + PerfBitFreq = CBitFieldMaskBit10 + PerfBitInheritStat = CBitFieldMaskBit11 + PerfBitEnableOnExec = CBitFieldMaskBit12 + PerfBitTask = CBitFieldMaskBit13 + PerfBitWatermark = CBitFieldMaskBit14 + PerfBitPreciseIPBit1 = CBitFieldMaskBit15 + PerfBitPreciseIPBit2 = CBitFieldMaskBit16 + PerfBitMmapData = CBitFieldMaskBit17 + PerfBitSampleIDAll = CBitFieldMaskBit18 + PerfBitExcludeHost = CBitFieldMaskBit19 + PerfBitExcludeGuest = CBitFieldMaskBit20 + PerfBitExcludeCallchainKernel = CBitFieldMaskBit21 + PerfBitExcludeCallchainUser = CBitFieldMaskBit22 + PerfBitMmap2 = CBitFieldMaskBit23 + PerfBitCommExec = CBitFieldMaskBit24 + PerfBitUseClockID = CBitFieldMaskBit25 + PerfBitContextSwitch = CBitFieldMaskBit26 +) + +const ( + PERF_TYPE_HARDWARE = 0x0 + PERF_TYPE_SOFTWARE = 0x1 + PERF_TYPE_TRACEPOINT = 0x2 + PERF_TYPE_HW_CACHE = 0x3 + PERF_TYPE_RAW = 0x4 + PERF_TYPE_BREAKPOINT = 0x5 + + PERF_COUNT_HW_CPU_CYCLES = 0x0 + PERF_COUNT_HW_INSTRUCTIONS = 0x1 + PERF_COUNT_HW_CACHE_REFERENCES = 0x2 + PERF_COUNT_HW_CACHE_MISSES = 0x3 + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 0x4 + PERF_COUNT_HW_BRANCH_MISSES = 0x5 + PERF_COUNT_HW_BUS_CYCLES = 0x6 + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7 + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 0x8 + PERF_COUNT_HW_REF_CPU_CYCLES = 0x9 + + PERF_COUNT_HW_CACHE_L1D = 0x0 + PERF_COUNT_HW_CACHE_L1I = 0x1 + PERF_COUNT_HW_CACHE_LL = 0x2 + PERF_COUNT_HW_CACHE_DTLB = 0x3 + PERF_COUNT_HW_CACHE_ITLB = 0x4 + PERF_COUNT_HW_CACHE_BPU = 0x5 + PERF_COUNT_HW_CACHE_NODE = 0x6 + + PERF_COUNT_HW_CACHE_OP_READ = 0x0 + PERF_COUNT_HW_CACHE_OP_WRITE = 0x1 + PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2 + + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0 + PERF_COUNT_HW_CACHE_RESULT_MISS = 0x1 + + PERF_COUNT_SW_CPU_CLOCK = 0x0 + PERF_COUNT_SW_TASK_CLOCK = 0x1 + PERF_COUNT_SW_PAGE_FAULTS = 0x2 + PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3 + PERF_COUNT_SW_CPU_MIGRATIONS = 0x4 + PERF_COUNT_SW_PAGE_FAULTS_MIN = 0x5 + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 0x6 + PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 + PERF_COUNT_SW_EMULATION_FAULTS = 0x8 + PERF_COUNT_SW_DUMMY = 0x9 + + PERF_SAMPLE_IP = 0x1 + PERF_SAMPLE_TID = 0x2 + PERF_SAMPLE_TIME = 0x4 + PERF_SAMPLE_ADDR = 0x8 + PERF_SAMPLE_READ = 0x10 + PERF_SAMPLE_CALLCHAIN = 0x20 + PERF_SAMPLE_ID = 0x40 + PERF_SAMPLE_CPU = 0x80 + PERF_SAMPLE_PERIOD = 0x100 + PERF_SAMPLE_STREAM_ID = 0x200 + PERF_SAMPLE_RAW = 0x400 + PERF_SAMPLE_BRANCH_STACK = 0x800 + + PERF_SAMPLE_BRANCH_USER = 0x1 + PERF_SAMPLE_BRANCH_KERNEL = 0x2 + PERF_SAMPLE_BRANCH_HV = 0x4 + PERF_SAMPLE_BRANCH_ANY = 0x8 + PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 + PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 + PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + + PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 + PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 + PERF_FORMAT_ID = 0x4 + PERF_FORMAT_GROUP = 0x8 + + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + + PERF_CONTEXT_HV = -0x20 + PERF_CONTEXT_KERNEL = -0x80 + PERF_CONTEXT_USER = -0x200 + + PERF_CONTEXT_GUEST = -0x800 + PERF_CONTEXT_GUEST_KERNEL = -0x880 + PERF_CONTEXT_GUEST_USER = -0xa00 + + PERF_FLAG_FD_NO_GROUP = 0x1 + PERF_FLAG_FD_OUTPUT = 0x2 + PERF_FLAG_PID_CGROUP = 0x4 +) + +const ( + CBitFieldMaskBit0 = 0x1 + CBitFieldMaskBit1 = 0x2 + CBitFieldMaskBit2 = 0x4 + CBitFieldMaskBit3 = 0x8 + CBitFieldMaskBit4 = 0x10 + CBitFieldMaskBit5 = 0x20 + CBitFieldMaskBit6 = 0x40 + CBitFieldMaskBit7 = 0x80 + CBitFieldMaskBit8 = 0x100 + CBitFieldMaskBit9 = 0x200 + CBitFieldMaskBit10 = 0x400 + CBitFieldMaskBit11 = 0x800 + CBitFieldMaskBit12 = 0x1000 + CBitFieldMaskBit13 = 0x2000 + CBitFieldMaskBit14 = 0x4000 + CBitFieldMaskBit15 = 0x8000 + CBitFieldMaskBit16 = 0x10000 + CBitFieldMaskBit17 = 0x20000 + CBitFieldMaskBit18 = 0x40000 + CBitFieldMaskBit19 = 0x80000 + CBitFieldMaskBit20 = 0x100000 + CBitFieldMaskBit21 = 0x200000 + CBitFieldMaskBit22 = 0x400000 + CBitFieldMaskBit23 = 0x800000 + CBitFieldMaskBit24 = 0x1000000 + CBitFieldMaskBit25 = 0x2000000 + CBitFieldMaskBit26 = 0x4000000 + CBitFieldMaskBit27 = 0x8000000 + CBitFieldMaskBit28 = 0x10000000 + CBitFieldMaskBit29 = 0x20000000 + CBitFieldMaskBit30 = 0x40000000 + CBitFieldMaskBit31 = 0x80000000 + CBitFieldMaskBit32 = 0x100000000 + CBitFieldMaskBit33 = 0x200000000 + CBitFieldMaskBit34 = 0x400000000 + CBitFieldMaskBit35 = 0x800000000 + CBitFieldMaskBit36 = 0x1000000000 + CBitFieldMaskBit37 = 0x2000000000 + CBitFieldMaskBit38 = 0x4000000000 + CBitFieldMaskBit39 = 0x8000000000 + CBitFieldMaskBit40 = 0x10000000000 + CBitFieldMaskBit41 = 0x20000000000 + CBitFieldMaskBit42 = 0x40000000000 + CBitFieldMaskBit43 = 0x80000000000 + CBitFieldMaskBit44 = 0x100000000000 + CBitFieldMaskBit45 = 0x200000000000 + CBitFieldMaskBit46 = 0x400000000000 + CBitFieldMaskBit47 = 0x800000000000 + CBitFieldMaskBit48 = 0x1000000000000 + CBitFieldMaskBit49 = 0x2000000000000 + CBitFieldMaskBit50 = 0x4000000000000 + CBitFieldMaskBit51 = 0x8000000000000 + CBitFieldMaskBit52 = 0x10000000000000 + CBitFieldMaskBit53 = 0x20000000000000 + CBitFieldMaskBit54 = 0x40000000000000 + CBitFieldMaskBit55 = 0x80000000000000 + CBitFieldMaskBit56 = 0x100000000000000 + CBitFieldMaskBit57 = 0x200000000000000 + CBitFieldMaskBit58 = 0x400000000000000 + CBitFieldMaskBit59 = 0x800000000000000 + CBitFieldMaskBit60 = 0x1000000000000000 + CBitFieldMaskBit61 = 0x2000000000000000 + CBitFieldMaskBit62 = 0x4000000000000000 + CBitFieldMaskBit63 = 0x8000000000000000 +) + +type SockaddrStorage struct { + Family uint16 + _ [122]uint8 + _ uint32 +} + +type TCPMD5Sig struct { + Addr SockaddrStorage + Flags uint8 + Prefixlen uint8 + Keylen uint16 + _ uint32 + Key [80]uint8 +} + +type HDDriveCmdHdr struct { + Command uint8 + Number uint8 + Feature uint8 + Count uint8 +} + +type HDGeometry struct { + Heads uint8 + Sectors uint8 + Cylinders uint16 + Start uint32 +} + +type HDDriveID struct { + Config uint16 + Cyls uint16 + Reserved2 uint16 + Heads uint16 + Track_bytes uint16 + Sector_bytes uint16 + Sectors uint16 + Vendor0 uint16 + Vendor1 uint16 + Vendor2 uint16 + Serial_no [20]uint8 + Buf_type uint16 + Buf_size uint16 + Ecc_bytes uint16 + Fw_rev [8]uint8 + Model [40]uint8 + Max_multsect uint8 + Vendor3 uint8 + Dword_io uint16 + Vendor4 uint8 + Capability uint8 + Reserved50 uint16 + Vendor5 uint8 + TPIO uint8 + Vendor6 uint8 + TDMA uint8 + Field_valid uint16 + Cur_cyls uint16 + Cur_heads uint16 + Cur_sectors uint16 + Cur_capacity0 uint16 + Cur_capacity1 uint16 + Multsect uint8 + Multsect_valid uint8 + Lba_capacity uint32 + Dma_1word uint16 + Dma_mword uint16 + Eide_pio_modes uint16 + Eide_dma_min uint16 + Eide_dma_time uint16 + Eide_pio uint16 + Eide_pio_iordy uint16 + Words69_70 [2]uint16 + Words71_74 [4]uint16 + Queue_depth uint16 + Words76_79 [4]uint16 + Major_rev_num uint16 + Minor_rev_num uint16 + Command_set_1 uint16 + Command_set_2 uint16 + Cfsse uint16 + Cfs_enable_1 uint16 + Cfs_enable_2 uint16 + Csf_default uint16 + Dma_ultra uint16 + Trseuc uint16 + TrsEuc uint16 + CurAPMvalues uint16 + Mprc uint16 + Hw_config uint16 + Acoustic uint16 + Msrqs uint16 + Sxfert uint16 + Sal uint16 + Spg uint32 + Lba_capacity_2 uint64 + Words104_125 [22]uint16 + Last_lun uint16 + Word127 uint16 + Dlf uint16 + Csfo uint16 + Words130_155 [26]uint16 + Word156 uint16 + Words157_159 [3]uint16 + Cfa_power uint16 + Words161_175 [15]uint16 + Words176_205 [30]uint16 + Words206_254 [49]uint16 + Integrity_word uint16 +} + +type Statfs_t struct { + Type int32 + Bsize int32 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen int32 + Frsize int32 + Flags int32 + Spare [4]int32 + _ [4]byte +} + +const ( + ST_MANDLOCK = 0x40 + ST_NOATIME = 0x400 + ST_NODEV = 0x4 + ST_NODIRATIME = 0x800 + ST_NOEXEC = 0x8 + ST_NOSUID = 0x2 + ST_RDONLY = 0x1 + ST_RELATIME = 0x1000 + ST_SYNCHRONOUS = 0x10 +) + +type TpacketHdr struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Usec uint32 +} + +type Tpacket2Hdr struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Nsec uint32 + Vlan_tci uint16 + Vlan_tpid uint16 + _ [4]uint8 +} + +type Tpacket3Hdr struct { + Next_offset uint32 + Sec uint32 + Nsec uint32 + Snaplen uint32 + Len uint32 + Status uint32 + Mac uint16 + Net uint16 + Hv1 TpacketHdrVariant1 + _ [8]uint8 +} + +type TpacketHdrVariant1 struct { + Rxhash uint32 + Vlan_tci uint32 + Vlan_tpid uint16 + _ uint16 +} + +type TpacketBlockDesc struct { + Version uint32 + To_priv uint32 + Hdr [40]byte +} + +type TpacketReq struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 +} + +type TpacketReq3 struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 + Retire_blk_tov uint32 + Sizeof_priv uint32 + Feature_req_word uint32 +} + +type TpacketStats struct { + Packets uint32 + Drops uint32 +} + +type TpacketStatsV3 struct { + Packets uint32 + Drops uint32 + Freeze_q_cnt uint32 +} + +type TpacketAuxdata struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Vlan_tci uint16 + Vlan_tpid uint16 +} + +const ( + TPACKET_V1 = 0x0 + TPACKET_V2 = 0x1 + TPACKET_V3 = 0x2 +) + +const ( + SizeofTpacketHdr = 0x18 + SizeofTpacket2Hdr = 0x20 + SizeofTpacket3Hdr = 0x30 +) + +const ( + NF_INET_PRE_ROUTING = 0x0 + NF_INET_LOCAL_IN = 0x1 + NF_INET_FORWARD = 0x2 + NF_INET_LOCAL_OUT = 0x3 + NF_INET_POST_ROUTING = 0x4 + NF_INET_NUMHOOKS = 0x5 +) + +const ( + NF_NETDEV_INGRESS = 0x0 + NF_NETDEV_NUMHOOKS = 0x1 +) + +const ( + NFPROTO_UNSPEC = 0x0 + NFPROTO_INET = 0x1 + NFPROTO_IPV4 = 0x2 + NFPROTO_ARP = 0x3 + NFPROTO_NETDEV = 0x5 + NFPROTO_BRIDGE = 0x7 + NFPROTO_IPV6 = 0xa + NFPROTO_DECNET = 0xc + NFPROTO_NUMPROTO = 0xd +) + +type Nfgenmsg struct { + Nfgen_family uint8 + Version uint8 + Res_id uint16 +} + +const ( + NFNL_BATCH_UNSPEC = 0x0 + NFNL_BATCH_GENID = 0x1 +) + +const ( + NFT_REG_VERDICT = 0x0 + NFT_REG_1 = 0x1 + NFT_REG_2 = 0x2 + NFT_REG_3 = 0x3 + NFT_REG_4 = 0x4 + NFT_REG32_00 = 0x8 + NFT_REG32_01 = 0x9 + NFT_REG32_02 = 0xa + NFT_REG32_03 = 0xb + NFT_REG32_04 = 0xc + NFT_REG32_05 = 0xd + NFT_REG32_06 = 0xe + NFT_REG32_07 = 0xf + NFT_REG32_08 = 0x10 + NFT_REG32_09 = 0x11 + NFT_REG32_10 = 0x12 + NFT_REG32_11 = 0x13 + NFT_REG32_12 = 0x14 + NFT_REG32_13 = 0x15 + NFT_REG32_14 = 0x16 + NFT_REG32_15 = 0x17 + NFT_CONTINUE = -0x1 + NFT_BREAK = -0x2 + NFT_JUMP = -0x3 + NFT_GOTO = -0x4 + NFT_RETURN = -0x5 + NFT_MSG_NEWTABLE = 0x0 + NFT_MSG_GETTABLE = 0x1 + NFT_MSG_DELTABLE = 0x2 + NFT_MSG_NEWCHAIN = 0x3 + NFT_MSG_GETCHAIN = 0x4 + NFT_MSG_DELCHAIN = 0x5 + NFT_MSG_NEWRULE = 0x6 + NFT_MSG_GETRULE = 0x7 + NFT_MSG_DELRULE = 0x8 + NFT_MSG_NEWSET = 0x9 + NFT_MSG_GETSET = 0xa + NFT_MSG_DELSET = 0xb + NFT_MSG_NEWSETELEM = 0xc + NFT_MSG_GETSETELEM = 0xd + NFT_MSG_DELSETELEM = 0xe + NFT_MSG_NEWGEN = 0xf + NFT_MSG_GETGEN = 0x10 + NFT_MSG_TRACE = 0x11 + NFT_MSG_NEWOBJ = 0x12 + NFT_MSG_GETOBJ = 0x13 + NFT_MSG_DELOBJ = 0x14 + NFT_MSG_GETOBJ_RESET = 0x15 + NFT_MSG_MAX = 0x19 + NFTA_LIST_UNPEC = 0x0 + NFTA_LIST_ELEM = 0x1 + NFTA_HOOK_UNSPEC = 0x0 + NFTA_HOOK_HOOKNUM = 0x1 + NFTA_HOOK_PRIORITY = 0x2 + NFTA_HOOK_DEV = 0x3 + NFT_TABLE_F_DORMANT = 0x1 + NFTA_TABLE_UNSPEC = 0x0 + NFTA_TABLE_NAME = 0x1 + NFTA_TABLE_FLAGS = 0x2 + NFTA_TABLE_USE = 0x3 + NFTA_CHAIN_UNSPEC = 0x0 + NFTA_CHAIN_TABLE = 0x1 + NFTA_CHAIN_HANDLE = 0x2 + NFTA_CHAIN_NAME = 0x3 + NFTA_CHAIN_HOOK = 0x4 + NFTA_CHAIN_POLICY = 0x5 + NFTA_CHAIN_USE = 0x6 + NFTA_CHAIN_TYPE = 0x7 + NFTA_CHAIN_COUNTERS = 0x8 + NFTA_CHAIN_PAD = 0x9 + NFTA_RULE_UNSPEC = 0x0 + NFTA_RULE_TABLE = 0x1 + NFTA_RULE_CHAIN = 0x2 + NFTA_RULE_HANDLE = 0x3 + NFTA_RULE_EXPRESSIONS = 0x4 + NFTA_RULE_COMPAT = 0x5 + NFTA_RULE_POSITION = 0x6 + NFTA_RULE_USERDATA = 0x7 + NFTA_RULE_PAD = 0x8 + NFTA_RULE_ID = 0x9 + NFT_RULE_COMPAT_F_INV = 0x2 + NFT_RULE_COMPAT_F_MASK = 0x2 + NFTA_RULE_COMPAT_UNSPEC = 0x0 + NFTA_RULE_COMPAT_PROTO = 0x1 + NFTA_RULE_COMPAT_FLAGS = 0x2 + NFT_SET_ANONYMOUS = 0x1 + NFT_SET_CONSTANT = 0x2 + NFT_SET_INTERVAL = 0x4 + NFT_SET_MAP = 0x8 + NFT_SET_TIMEOUT = 0x10 + NFT_SET_EVAL = 0x20 + NFT_SET_OBJECT = 0x40 + NFT_SET_POL_PERFORMANCE = 0x0 + NFT_SET_POL_MEMORY = 0x1 + NFTA_SET_DESC_UNSPEC = 0x0 + NFTA_SET_DESC_SIZE = 0x1 + NFTA_SET_UNSPEC = 0x0 + NFTA_SET_TABLE = 0x1 + NFTA_SET_NAME = 0x2 + NFTA_SET_FLAGS = 0x3 + NFTA_SET_KEY_TYPE = 0x4 + NFTA_SET_KEY_LEN = 0x5 + NFTA_SET_DATA_TYPE = 0x6 + NFTA_SET_DATA_LEN = 0x7 + NFTA_SET_POLICY = 0x8 + NFTA_SET_DESC = 0x9 + NFTA_SET_ID = 0xa + NFTA_SET_TIMEOUT = 0xb + NFTA_SET_GC_INTERVAL = 0xc + NFTA_SET_USERDATA = 0xd + NFTA_SET_PAD = 0xe + NFTA_SET_OBJ_TYPE = 0xf + NFT_SET_ELEM_INTERVAL_END = 0x1 + NFTA_SET_ELEM_UNSPEC = 0x0 + NFTA_SET_ELEM_KEY = 0x1 + NFTA_SET_ELEM_DATA = 0x2 + NFTA_SET_ELEM_FLAGS = 0x3 + NFTA_SET_ELEM_TIMEOUT = 0x4 + NFTA_SET_ELEM_EXPIRATION = 0x5 + NFTA_SET_ELEM_USERDATA = 0x6 + NFTA_SET_ELEM_EXPR = 0x7 + NFTA_SET_ELEM_PAD = 0x8 + NFTA_SET_ELEM_OBJREF = 0x9 + NFTA_SET_ELEM_LIST_UNSPEC = 0x0 + NFTA_SET_ELEM_LIST_TABLE = 0x1 + NFTA_SET_ELEM_LIST_SET = 0x2 + NFTA_SET_ELEM_LIST_ELEMENTS = 0x3 + NFTA_SET_ELEM_LIST_SET_ID = 0x4 + NFT_DATA_VALUE = 0x0 + NFT_DATA_VERDICT = 0xffffff00 + NFTA_DATA_UNSPEC = 0x0 + NFTA_DATA_VALUE = 0x1 + NFTA_DATA_VERDICT = 0x2 + NFTA_VERDICT_UNSPEC = 0x0 + NFTA_VERDICT_CODE = 0x1 + NFTA_VERDICT_CHAIN = 0x2 + NFTA_EXPR_UNSPEC = 0x0 + NFTA_EXPR_NAME = 0x1 + NFTA_EXPR_DATA = 0x2 + NFTA_IMMEDIATE_UNSPEC = 0x0 + NFTA_IMMEDIATE_DREG = 0x1 + NFTA_IMMEDIATE_DATA = 0x2 + NFTA_BITWISE_UNSPEC = 0x0 + NFTA_BITWISE_SREG = 0x1 + NFTA_BITWISE_DREG = 0x2 + NFTA_BITWISE_LEN = 0x3 + NFTA_BITWISE_MASK = 0x4 + NFTA_BITWISE_XOR = 0x5 + NFT_BYTEORDER_NTOH = 0x0 + NFT_BYTEORDER_HTON = 0x1 + NFTA_BYTEORDER_UNSPEC = 0x0 + NFTA_BYTEORDER_SREG = 0x1 + NFTA_BYTEORDER_DREG = 0x2 + NFTA_BYTEORDER_OP = 0x3 + NFTA_BYTEORDER_LEN = 0x4 + NFTA_BYTEORDER_SIZE = 0x5 + NFT_CMP_EQ = 0x0 + NFT_CMP_NEQ = 0x1 + NFT_CMP_LT = 0x2 + NFT_CMP_LTE = 0x3 + NFT_CMP_GT = 0x4 + NFT_CMP_GTE = 0x5 + NFTA_CMP_UNSPEC = 0x0 + NFTA_CMP_SREG = 0x1 + NFTA_CMP_OP = 0x2 + NFTA_CMP_DATA = 0x3 + NFT_RANGE_EQ = 0x0 + NFT_RANGE_NEQ = 0x1 + NFTA_RANGE_UNSPEC = 0x0 + NFTA_RANGE_SREG = 0x1 + NFTA_RANGE_OP = 0x2 + NFTA_RANGE_FROM_DATA = 0x3 + NFTA_RANGE_TO_DATA = 0x4 + NFT_LOOKUP_F_INV = 0x1 + NFTA_LOOKUP_UNSPEC = 0x0 + NFTA_LOOKUP_SET = 0x1 + NFTA_LOOKUP_SREG = 0x2 + NFTA_LOOKUP_DREG = 0x3 + NFTA_LOOKUP_SET_ID = 0x4 + NFTA_LOOKUP_FLAGS = 0x5 + NFT_DYNSET_OP_ADD = 0x0 + NFT_DYNSET_OP_UPDATE = 0x1 + NFT_DYNSET_F_INV = 0x1 + NFTA_DYNSET_UNSPEC = 0x0 + NFTA_DYNSET_SET_NAME = 0x1 + NFTA_DYNSET_SET_ID = 0x2 + NFTA_DYNSET_OP = 0x3 + NFTA_DYNSET_SREG_KEY = 0x4 + NFTA_DYNSET_SREG_DATA = 0x5 + NFTA_DYNSET_TIMEOUT = 0x6 + NFTA_DYNSET_EXPR = 0x7 + NFTA_DYNSET_PAD = 0x8 + NFTA_DYNSET_FLAGS = 0x9 + NFT_PAYLOAD_LL_HEADER = 0x0 + NFT_PAYLOAD_NETWORK_HEADER = 0x1 + NFT_PAYLOAD_TRANSPORT_HEADER = 0x2 + NFT_PAYLOAD_CSUM_NONE = 0x0 + NFT_PAYLOAD_CSUM_INET = 0x1 + NFT_PAYLOAD_L4CSUM_PSEUDOHDR = 0x1 + NFTA_PAYLOAD_UNSPEC = 0x0 + NFTA_PAYLOAD_DREG = 0x1 + NFTA_PAYLOAD_BASE = 0x2 + NFTA_PAYLOAD_OFFSET = 0x3 + NFTA_PAYLOAD_LEN = 0x4 + NFTA_PAYLOAD_SREG = 0x5 + NFTA_PAYLOAD_CSUM_TYPE = 0x6 + NFTA_PAYLOAD_CSUM_OFFSET = 0x7 + NFTA_PAYLOAD_CSUM_FLAGS = 0x8 + NFT_EXTHDR_F_PRESENT = 0x1 + NFT_EXTHDR_OP_IPV6 = 0x0 + NFT_EXTHDR_OP_TCPOPT = 0x1 + NFTA_EXTHDR_UNSPEC = 0x0 + NFTA_EXTHDR_DREG = 0x1 + NFTA_EXTHDR_TYPE = 0x2 + NFTA_EXTHDR_OFFSET = 0x3 + NFTA_EXTHDR_LEN = 0x4 + NFTA_EXTHDR_FLAGS = 0x5 + NFTA_EXTHDR_OP = 0x6 + NFTA_EXTHDR_SREG = 0x7 + NFT_META_LEN = 0x0 + NFT_META_PROTOCOL = 0x1 + NFT_META_PRIORITY = 0x2 + NFT_META_MARK = 0x3 + NFT_META_IIF = 0x4 + NFT_META_OIF = 0x5 + NFT_META_IIFNAME = 0x6 + NFT_META_OIFNAME = 0x7 + NFT_META_IIFTYPE = 0x8 + NFT_META_OIFTYPE = 0x9 + NFT_META_SKUID = 0xa + NFT_META_SKGID = 0xb + NFT_META_NFTRACE = 0xc + NFT_META_RTCLASSID = 0xd + NFT_META_SECMARK = 0xe + NFT_META_NFPROTO = 0xf + NFT_META_L4PROTO = 0x10 + NFT_META_BRI_IIFNAME = 0x11 + NFT_META_BRI_OIFNAME = 0x12 + NFT_META_PKTTYPE = 0x13 + NFT_META_CPU = 0x14 + NFT_META_IIFGROUP = 0x15 + NFT_META_OIFGROUP = 0x16 + NFT_META_CGROUP = 0x17 + NFT_META_PRANDOM = 0x18 + NFT_RT_CLASSID = 0x0 + NFT_RT_NEXTHOP4 = 0x1 + NFT_RT_NEXTHOP6 = 0x2 + NFT_RT_TCPMSS = 0x3 + NFT_HASH_JENKINS = 0x0 + NFT_HASH_SYM = 0x1 + NFTA_HASH_UNSPEC = 0x0 + NFTA_HASH_SREG = 0x1 + NFTA_HASH_DREG = 0x2 + NFTA_HASH_LEN = 0x3 + NFTA_HASH_MODULUS = 0x4 + NFTA_HASH_SEED = 0x5 + NFTA_HASH_OFFSET = 0x6 + NFTA_HASH_TYPE = 0x7 + NFTA_META_UNSPEC = 0x0 + NFTA_META_DREG = 0x1 + NFTA_META_KEY = 0x2 + NFTA_META_SREG = 0x3 + NFTA_RT_UNSPEC = 0x0 + NFTA_RT_DREG = 0x1 + NFTA_RT_KEY = 0x2 + NFT_CT_STATE = 0x0 + NFT_CT_DIRECTION = 0x1 + NFT_CT_STATUS = 0x2 + NFT_CT_MARK = 0x3 + NFT_CT_SECMARK = 0x4 + NFT_CT_EXPIRATION = 0x5 + NFT_CT_HELPER = 0x6 + NFT_CT_L3PROTOCOL = 0x7 + NFT_CT_SRC = 0x8 + NFT_CT_DST = 0x9 + NFT_CT_PROTOCOL = 0xa + NFT_CT_PROTO_SRC = 0xb + NFT_CT_PROTO_DST = 0xc + NFT_CT_LABELS = 0xd + NFT_CT_PKTS = 0xe + NFT_CT_BYTES = 0xf + NFT_CT_AVGPKT = 0x10 + NFT_CT_ZONE = 0x11 + NFT_CT_EVENTMASK = 0x12 + NFTA_CT_UNSPEC = 0x0 + NFTA_CT_DREG = 0x1 + NFTA_CT_KEY = 0x2 + NFTA_CT_DIRECTION = 0x3 + NFTA_CT_SREG = 0x4 + NFT_LIMIT_PKTS = 0x0 + NFT_LIMIT_PKT_BYTES = 0x1 + NFT_LIMIT_F_INV = 0x1 + NFTA_LIMIT_UNSPEC = 0x0 + NFTA_LIMIT_RATE = 0x1 + NFTA_LIMIT_UNIT = 0x2 + NFTA_LIMIT_BURST = 0x3 + NFTA_LIMIT_TYPE = 0x4 + NFTA_LIMIT_FLAGS = 0x5 + NFTA_LIMIT_PAD = 0x6 + NFTA_COUNTER_UNSPEC = 0x0 + NFTA_COUNTER_BYTES = 0x1 + NFTA_COUNTER_PACKETS = 0x2 + NFTA_COUNTER_PAD = 0x3 + NFTA_LOG_UNSPEC = 0x0 + NFTA_LOG_GROUP = 0x1 + NFTA_LOG_PREFIX = 0x2 + NFTA_LOG_SNAPLEN = 0x3 + NFTA_LOG_QTHRESHOLD = 0x4 + NFTA_LOG_LEVEL = 0x5 + NFTA_LOG_FLAGS = 0x6 + NFTA_QUEUE_UNSPEC = 0x0 + NFTA_QUEUE_NUM = 0x1 + NFTA_QUEUE_TOTAL = 0x2 + NFTA_QUEUE_FLAGS = 0x3 + NFTA_QUEUE_SREG_QNUM = 0x4 + NFT_QUOTA_F_INV = 0x1 + NFT_QUOTA_F_DEPLETED = 0x2 + NFTA_QUOTA_UNSPEC = 0x0 + NFTA_QUOTA_BYTES = 0x1 + NFTA_QUOTA_FLAGS = 0x2 + NFTA_QUOTA_PAD = 0x3 + NFTA_QUOTA_CONSUMED = 0x4 + NFT_REJECT_ICMP_UNREACH = 0x0 + NFT_REJECT_TCP_RST = 0x1 + NFT_REJECT_ICMPX_UNREACH = 0x2 + NFT_REJECT_ICMPX_NO_ROUTE = 0x0 + NFT_REJECT_ICMPX_PORT_UNREACH = 0x1 + NFT_REJECT_ICMPX_HOST_UNREACH = 0x2 + NFT_REJECT_ICMPX_ADMIN_PROHIBITED = 0x3 + NFTA_REJECT_UNSPEC = 0x0 + NFTA_REJECT_TYPE = 0x1 + NFTA_REJECT_ICMP_CODE = 0x2 + NFT_NAT_SNAT = 0x0 + NFT_NAT_DNAT = 0x1 + NFTA_NAT_UNSPEC = 0x0 + NFTA_NAT_TYPE = 0x1 + NFTA_NAT_FAMILY = 0x2 + NFTA_NAT_REG_ADDR_MIN = 0x3 + NFTA_NAT_REG_ADDR_MAX = 0x4 + NFTA_NAT_REG_PROTO_MIN = 0x5 + NFTA_NAT_REG_PROTO_MAX = 0x6 + NFTA_NAT_FLAGS = 0x7 + NFTA_MASQ_UNSPEC = 0x0 + NFTA_MASQ_FLAGS = 0x1 + NFTA_MASQ_REG_PROTO_MIN = 0x2 + NFTA_MASQ_REG_PROTO_MAX = 0x3 + NFTA_REDIR_UNSPEC = 0x0 + NFTA_REDIR_REG_PROTO_MIN = 0x1 + NFTA_REDIR_REG_PROTO_MAX = 0x2 + NFTA_REDIR_FLAGS = 0x3 + NFTA_DUP_UNSPEC = 0x0 + NFTA_DUP_SREG_ADDR = 0x1 + NFTA_DUP_SREG_DEV = 0x2 + NFTA_FWD_UNSPEC = 0x0 + NFTA_FWD_SREG_DEV = 0x1 + NFTA_OBJREF_UNSPEC = 0x0 + NFTA_OBJREF_IMM_TYPE = 0x1 + NFTA_OBJREF_IMM_NAME = 0x2 + NFTA_OBJREF_SET_SREG = 0x3 + NFTA_OBJREF_SET_NAME = 0x4 + NFTA_OBJREF_SET_ID = 0x5 + NFTA_GEN_UNSPEC = 0x0 + NFTA_GEN_ID = 0x1 + NFTA_GEN_PROC_PID = 0x2 + NFTA_GEN_PROC_NAME = 0x3 + NFTA_FIB_UNSPEC = 0x0 + NFTA_FIB_DREG = 0x1 + NFTA_FIB_RESULT = 0x2 + NFTA_FIB_FLAGS = 0x3 + NFT_FIB_RESULT_UNSPEC = 0x0 + NFT_FIB_RESULT_OIF = 0x1 + NFT_FIB_RESULT_OIFNAME = 0x2 + NFT_FIB_RESULT_ADDRTYPE = 0x3 + NFTA_FIB_F_SADDR = 0x1 + NFTA_FIB_F_DADDR = 0x2 + NFTA_FIB_F_MARK = 0x4 + NFTA_FIB_F_IIF = 0x8 + NFTA_FIB_F_OIF = 0x10 + NFTA_FIB_F_PRESENT = 0x20 + NFTA_CT_HELPER_UNSPEC = 0x0 + NFTA_CT_HELPER_NAME = 0x1 + NFTA_CT_HELPER_L3PROTO = 0x2 + NFTA_CT_HELPER_L4PROTO = 0x3 + NFTA_OBJ_UNSPEC = 0x0 + NFTA_OBJ_TABLE = 0x1 + NFTA_OBJ_NAME = 0x2 + NFTA_OBJ_TYPE = 0x3 + NFTA_OBJ_DATA = 0x4 + NFTA_OBJ_USE = 0x5 + NFTA_TRACE_UNSPEC = 0x0 + NFTA_TRACE_TABLE = 0x1 + NFTA_TRACE_CHAIN = 0x2 + NFTA_TRACE_RULE_HANDLE = 0x3 + NFTA_TRACE_TYPE = 0x4 + NFTA_TRACE_VERDICT = 0x5 + NFTA_TRACE_ID = 0x6 + NFTA_TRACE_LL_HEADER = 0x7 + NFTA_TRACE_NETWORK_HEADER = 0x8 + NFTA_TRACE_TRANSPORT_HEADER = 0x9 + NFTA_TRACE_IIF = 0xa + NFTA_TRACE_IIFTYPE = 0xb + NFTA_TRACE_OIF = 0xc + NFTA_TRACE_OIFTYPE = 0xd + NFTA_TRACE_MARK = 0xe + NFTA_TRACE_NFPROTO = 0xf + NFTA_TRACE_POLICY = 0x10 + NFTA_TRACE_PAD = 0x11 + NFT_TRACETYPE_UNSPEC = 0x0 + NFT_TRACETYPE_POLICY = 0x1 + NFT_TRACETYPE_RETURN = 0x2 + NFT_TRACETYPE_RULE = 0x3 + NFTA_NG_UNSPEC = 0x0 + NFTA_NG_DREG = 0x1 + NFTA_NG_MODULUS = 0x2 + NFTA_NG_TYPE = 0x3 + NFTA_NG_OFFSET = 0x4 + NFT_NG_INCREMENTAL = 0x0 + NFT_NG_RANDOM = 0x1 +) diff --git a/api/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go b/api/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go new file mode 100644 index 0000000..6ea8056 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go @@ -0,0 +1,1814 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm64,linux + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Timex struct { + Modes uint32 + _ [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + _ [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + _ [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + _ [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint64 + _ uint64 + Size int64 + Blksize int32 + _ int32 + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + _ [2]int32 +} + +type StatxTimestamp struct { + Sec int64 + Nsec uint32 + _ int32 +} + +type Statx_t struct { + Mask uint32 + Blksize uint32 + Attributes uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Mode uint16 + _ [1]uint16 + Ino uint64 + Size uint64 + Blocks uint64 + Attributes_mask uint64 + Atime StatxTimestamp + Btime StatxTimestamp + Ctime StatxTimestamp + Mtime StatxTimestamp + Rdev_major uint32 + Rdev_minor uint32 + Dev_major uint32 + Dev_minor uint32 + _ [14]uint64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + _ [5]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + _ [4]byte + Start int64 + Len int64 + Pid int32 + _ [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrL2 struct { + Family uint16 + Psm uint16 + Bdaddr [6]uint8 + Cid uint16 + Bdaddr_type uint8 + _ [1]byte +} + +type RawSockaddrCAN struct { + Family uint16 + _ [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + _ [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + _ [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + _ [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrL2 = 0xe + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x10 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_NUM_VF = 0x15 + IFLA_VFINFO_LIST = 0x16 + IFLA_STATS64 = 0x17 + IFLA_VF_PORTS = 0x18 + IFLA_PORT_SELF = 0x19 + IFLA_AF_SPEC = 0x1a + IFLA_GROUP = 0x1b + IFLA_NET_NS_FD = 0x1c + IFLA_EXT_MASK = 0x1d + IFLA_PROMISCUITY = 0x1e + IFLA_NUM_TX_QUEUES = 0x1f + IFLA_NUM_RX_QUEUES = 0x20 + IFLA_CARRIER = 0x21 + IFLA_PHYS_PORT_ID = 0x22 + IFLA_CARRIER_CHANGES = 0x23 + IFLA_PHYS_SWITCH_ID = 0x24 + IFLA_LINK_NETNSID = 0x25 + IFLA_PHYS_PORT_NAME = 0x26 + IFLA_PROTO_DOWN = 0x27 + IFLA_GSO_MAX_SEGS = 0x28 + IFLA_GSO_MAX_SIZE = 0x29 + IFLA_PAD = 0x2a + IFLA_XDP = 0x2b + IFLA_EVENT = 0x2c + IFLA_NEW_NETNSID = 0x2d + IFLA_IF_NETNSID = 0x2e + IFLA_MAX = 0x31 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + _ uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + _ [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Regs [31]uint64 + Sp uint64 + Pc uint64 + Pstate uint64 +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + _ [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + _ [0]int8 + _ [4]byte +} + +type Utsname struct { + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte +} + +type Ustat_t struct { + Tfree int32 + _ [4]byte + Tinode uint64 + Fname [6]int8 + Fpack [6]int8 + _ [4]byte +} + +type EpollEvent struct { + Events uint32 + PadFd int32 + Fd int32 + Pad int32 +} + +const ( + AT_EMPTY_PATH = 0x1000 + AT_FDCWD = -0x64 + AT_NO_AUTOMOUNT = 0x800 + AT_REMOVEDIR = 0x200 + + AT_STATX_SYNC_AS_STAT = 0x0 + AT_STATX_FORCE_SYNC = 0x2000 + AT_STATX_DONT_SYNC = 0x4000 + + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + Val [16]uint64 +} + +const RNDGETENTCNT = 0x80045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [19]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + _ [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + _ [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + _ [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + _ [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type CGroupStats struct { + Sleeping uint64 + Running uint64 + Stopped uint64 + Uninterruptible uint64 + Io_wait uint64 +} + +const ( + CGROUPSTATS_CMD_UNSPEC = 0x3 + CGROUPSTATS_CMD_GET = 0x4 + CGROUPSTATS_CMD_NEW = 0x5 + CGROUPSTATS_TYPE_UNSPEC = 0x0 + CGROUPSTATS_TYPE_CGROUP_STATS = 0x1 + CGROUPSTATS_CMD_ATTR_UNSPEC = 0x0 + CGROUPSTATS_CMD_ATTR_FD = 0x1 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) + +type cpuMask uint64 + +const ( + _CPU_SETSIZE = 0x400 + _NCPUBITS = 0x40 +) + +const ( + BDADDR_BREDR = 0x0 + BDADDR_LE_PUBLIC = 0x1 + BDADDR_LE_RANDOM = 0x2 +) + +type PerfEventAttr struct { + Type uint32 + Size uint32 + Config uint64 + Sample uint64 + Sample_type uint64 + Read_format uint64 + Bits uint64 + Wakeup uint32 + Bp_type uint32 + Ext1 uint64 + Ext2 uint64 + Branch_sample_type uint64 + Sample_regs_user uint64 + Sample_stack_user uint32 + Clockid int32 + Sample_regs_intr uint64 + Aux_watermark uint32 + _ uint32 +} + +type PerfEventMmapPage struct { + Version uint32 + Compat_version uint32 + Lock uint32 + Index uint32 + Offset int64 + Time_enabled uint64 + Time_running uint64 + Capabilities uint64 + Pmc_width uint16 + Time_shift uint16 + Time_mult uint32 + Time_offset uint64 + Time_zero uint64 + Size uint32 + _ [948]uint8 + Data_head uint64 + Data_tail uint64 + Data_offset uint64 + Data_size uint64 + Aux_head uint64 + Aux_tail uint64 + Aux_offset uint64 + Aux_size uint64 +} + +const ( + PerfBitDisabled uint64 = CBitFieldMaskBit0 + PerfBitInherit = CBitFieldMaskBit1 + PerfBitPinned = CBitFieldMaskBit2 + PerfBitExclusive = CBitFieldMaskBit3 + PerfBitExcludeUser = CBitFieldMaskBit4 + PerfBitExcludeKernel = CBitFieldMaskBit5 + PerfBitExcludeHv = CBitFieldMaskBit6 + PerfBitExcludeIdle = CBitFieldMaskBit7 + PerfBitMmap = CBitFieldMaskBit8 + PerfBitComm = CBitFieldMaskBit9 + PerfBitFreq = CBitFieldMaskBit10 + PerfBitInheritStat = CBitFieldMaskBit11 + PerfBitEnableOnExec = CBitFieldMaskBit12 + PerfBitTask = CBitFieldMaskBit13 + PerfBitWatermark = CBitFieldMaskBit14 + PerfBitPreciseIPBit1 = CBitFieldMaskBit15 + PerfBitPreciseIPBit2 = CBitFieldMaskBit16 + PerfBitMmapData = CBitFieldMaskBit17 + PerfBitSampleIDAll = CBitFieldMaskBit18 + PerfBitExcludeHost = CBitFieldMaskBit19 + PerfBitExcludeGuest = CBitFieldMaskBit20 + PerfBitExcludeCallchainKernel = CBitFieldMaskBit21 + PerfBitExcludeCallchainUser = CBitFieldMaskBit22 + PerfBitMmap2 = CBitFieldMaskBit23 + PerfBitCommExec = CBitFieldMaskBit24 + PerfBitUseClockID = CBitFieldMaskBit25 + PerfBitContextSwitch = CBitFieldMaskBit26 +) + +const ( + PERF_TYPE_HARDWARE = 0x0 + PERF_TYPE_SOFTWARE = 0x1 + PERF_TYPE_TRACEPOINT = 0x2 + PERF_TYPE_HW_CACHE = 0x3 + PERF_TYPE_RAW = 0x4 + PERF_TYPE_BREAKPOINT = 0x5 + + PERF_COUNT_HW_CPU_CYCLES = 0x0 + PERF_COUNT_HW_INSTRUCTIONS = 0x1 + PERF_COUNT_HW_CACHE_REFERENCES = 0x2 + PERF_COUNT_HW_CACHE_MISSES = 0x3 + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 0x4 + PERF_COUNT_HW_BRANCH_MISSES = 0x5 + PERF_COUNT_HW_BUS_CYCLES = 0x6 + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7 + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 0x8 + PERF_COUNT_HW_REF_CPU_CYCLES = 0x9 + + PERF_COUNT_HW_CACHE_L1D = 0x0 + PERF_COUNT_HW_CACHE_L1I = 0x1 + PERF_COUNT_HW_CACHE_LL = 0x2 + PERF_COUNT_HW_CACHE_DTLB = 0x3 + PERF_COUNT_HW_CACHE_ITLB = 0x4 + PERF_COUNT_HW_CACHE_BPU = 0x5 + PERF_COUNT_HW_CACHE_NODE = 0x6 + + PERF_COUNT_HW_CACHE_OP_READ = 0x0 + PERF_COUNT_HW_CACHE_OP_WRITE = 0x1 + PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2 + + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0 + PERF_COUNT_HW_CACHE_RESULT_MISS = 0x1 + + PERF_COUNT_SW_CPU_CLOCK = 0x0 + PERF_COUNT_SW_TASK_CLOCK = 0x1 + PERF_COUNT_SW_PAGE_FAULTS = 0x2 + PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3 + PERF_COUNT_SW_CPU_MIGRATIONS = 0x4 + PERF_COUNT_SW_PAGE_FAULTS_MIN = 0x5 + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 0x6 + PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 + PERF_COUNT_SW_EMULATION_FAULTS = 0x8 + PERF_COUNT_SW_DUMMY = 0x9 + + PERF_SAMPLE_IP = 0x1 + PERF_SAMPLE_TID = 0x2 + PERF_SAMPLE_TIME = 0x4 + PERF_SAMPLE_ADDR = 0x8 + PERF_SAMPLE_READ = 0x10 + PERF_SAMPLE_CALLCHAIN = 0x20 + PERF_SAMPLE_ID = 0x40 + PERF_SAMPLE_CPU = 0x80 + PERF_SAMPLE_PERIOD = 0x100 + PERF_SAMPLE_STREAM_ID = 0x200 + PERF_SAMPLE_RAW = 0x400 + PERF_SAMPLE_BRANCH_STACK = 0x800 + + PERF_SAMPLE_BRANCH_USER = 0x1 + PERF_SAMPLE_BRANCH_KERNEL = 0x2 + PERF_SAMPLE_BRANCH_HV = 0x4 + PERF_SAMPLE_BRANCH_ANY = 0x8 + PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 + PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 + PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + + PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 + PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 + PERF_FORMAT_ID = 0x4 + PERF_FORMAT_GROUP = 0x8 + + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + + PERF_CONTEXT_HV = -0x20 + PERF_CONTEXT_KERNEL = -0x80 + PERF_CONTEXT_USER = -0x200 + + PERF_CONTEXT_GUEST = -0x800 + PERF_CONTEXT_GUEST_KERNEL = -0x880 + PERF_CONTEXT_GUEST_USER = -0xa00 + + PERF_FLAG_FD_NO_GROUP = 0x1 + PERF_FLAG_FD_OUTPUT = 0x2 + PERF_FLAG_PID_CGROUP = 0x4 +) + +const ( + CBitFieldMaskBit0 = 0x1 + CBitFieldMaskBit1 = 0x2 + CBitFieldMaskBit2 = 0x4 + CBitFieldMaskBit3 = 0x8 + CBitFieldMaskBit4 = 0x10 + CBitFieldMaskBit5 = 0x20 + CBitFieldMaskBit6 = 0x40 + CBitFieldMaskBit7 = 0x80 + CBitFieldMaskBit8 = 0x100 + CBitFieldMaskBit9 = 0x200 + CBitFieldMaskBit10 = 0x400 + CBitFieldMaskBit11 = 0x800 + CBitFieldMaskBit12 = 0x1000 + CBitFieldMaskBit13 = 0x2000 + CBitFieldMaskBit14 = 0x4000 + CBitFieldMaskBit15 = 0x8000 + CBitFieldMaskBit16 = 0x10000 + CBitFieldMaskBit17 = 0x20000 + CBitFieldMaskBit18 = 0x40000 + CBitFieldMaskBit19 = 0x80000 + CBitFieldMaskBit20 = 0x100000 + CBitFieldMaskBit21 = 0x200000 + CBitFieldMaskBit22 = 0x400000 + CBitFieldMaskBit23 = 0x800000 + CBitFieldMaskBit24 = 0x1000000 + CBitFieldMaskBit25 = 0x2000000 + CBitFieldMaskBit26 = 0x4000000 + CBitFieldMaskBit27 = 0x8000000 + CBitFieldMaskBit28 = 0x10000000 + CBitFieldMaskBit29 = 0x20000000 + CBitFieldMaskBit30 = 0x40000000 + CBitFieldMaskBit31 = 0x80000000 + CBitFieldMaskBit32 = 0x100000000 + CBitFieldMaskBit33 = 0x200000000 + CBitFieldMaskBit34 = 0x400000000 + CBitFieldMaskBit35 = 0x800000000 + CBitFieldMaskBit36 = 0x1000000000 + CBitFieldMaskBit37 = 0x2000000000 + CBitFieldMaskBit38 = 0x4000000000 + CBitFieldMaskBit39 = 0x8000000000 + CBitFieldMaskBit40 = 0x10000000000 + CBitFieldMaskBit41 = 0x20000000000 + CBitFieldMaskBit42 = 0x40000000000 + CBitFieldMaskBit43 = 0x80000000000 + CBitFieldMaskBit44 = 0x100000000000 + CBitFieldMaskBit45 = 0x200000000000 + CBitFieldMaskBit46 = 0x400000000000 + CBitFieldMaskBit47 = 0x800000000000 + CBitFieldMaskBit48 = 0x1000000000000 + CBitFieldMaskBit49 = 0x2000000000000 + CBitFieldMaskBit50 = 0x4000000000000 + CBitFieldMaskBit51 = 0x8000000000000 + CBitFieldMaskBit52 = 0x10000000000000 + CBitFieldMaskBit53 = 0x20000000000000 + CBitFieldMaskBit54 = 0x40000000000000 + CBitFieldMaskBit55 = 0x80000000000000 + CBitFieldMaskBit56 = 0x100000000000000 + CBitFieldMaskBit57 = 0x200000000000000 + CBitFieldMaskBit58 = 0x400000000000000 + CBitFieldMaskBit59 = 0x800000000000000 + CBitFieldMaskBit60 = 0x1000000000000000 + CBitFieldMaskBit61 = 0x2000000000000000 + CBitFieldMaskBit62 = 0x4000000000000000 + CBitFieldMaskBit63 = 0x8000000000000000 +) + +type SockaddrStorage struct { + Family uint16 + _ [118]int8 + _ uint64 +} + +type TCPMD5Sig struct { + Addr SockaddrStorage + Flags uint8 + Prefixlen uint8 + Keylen uint16 + _ uint32 + Key [80]uint8 +} + +type HDDriveCmdHdr struct { + Command uint8 + Number uint8 + Feature uint8 + Count uint8 +} + +type HDGeometry struct { + Heads uint8 + Sectors uint8 + Cylinders uint16 + _ [4]byte + Start uint64 +} + +type HDDriveID struct { + Config uint16 + Cyls uint16 + Reserved2 uint16 + Heads uint16 + Track_bytes uint16 + Sector_bytes uint16 + Sectors uint16 + Vendor0 uint16 + Vendor1 uint16 + Vendor2 uint16 + Serial_no [20]uint8 + Buf_type uint16 + Buf_size uint16 + Ecc_bytes uint16 + Fw_rev [8]uint8 + Model [40]uint8 + Max_multsect uint8 + Vendor3 uint8 + Dword_io uint16 + Vendor4 uint8 + Capability uint8 + Reserved50 uint16 + Vendor5 uint8 + TPIO uint8 + Vendor6 uint8 + TDMA uint8 + Field_valid uint16 + Cur_cyls uint16 + Cur_heads uint16 + Cur_sectors uint16 + Cur_capacity0 uint16 + Cur_capacity1 uint16 + Multsect uint8 + Multsect_valid uint8 + Lba_capacity uint32 + Dma_1word uint16 + Dma_mword uint16 + Eide_pio_modes uint16 + Eide_dma_min uint16 + Eide_dma_time uint16 + Eide_pio uint16 + Eide_pio_iordy uint16 + Words69_70 [2]uint16 + Words71_74 [4]uint16 + Queue_depth uint16 + Words76_79 [4]uint16 + Major_rev_num uint16 + Minor_rev_num uint16 + Command_set_1 uint16 + Command_set_2 uint16 + Cfsse uint16 + Cfs_enable_1 uint16 + Cfs_enable_2 uint16 + Csf_default uint16 + Dma_ultra uint16 + Trseuc uint16 + TrsEuc uint16 + CurAPMvalues uint16 + Mprc uint16 + Hw_config uint16 + Acoustic uint16 + Msrqs uint16 + Sxfert uint16 + Sal uint16 + Spg uint32 + Lba_capacity_2 uint64 + Words104_125 [22]uint16 + Last_lun uint16 + Word127 uint16 + Dlf uint16 + Csfo uint16 + Words130_155 [26]uint16 + Word156 uint16 + Words157_159 [3]uint16 + Cfa_power uint16 + Words161_175 [15]uint16 + Words176_205 [30]uint16 + Words206_254 [49]uint16 + Integrity_word uint16 +} + +type Statfs_t struct { + Type int64 + Bsize int64 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen int64 + Frsize int64 + Flags int64 + Spare [4]int64 +} + +const ( + ST_MANDLOCK = 0x40 + ST_NOATIME = 0x400 + ST_NODEV = 0x4 + ST_NODIRATIME = 0x800 + ST_NOEXEC = 0x8 + ST_NOSUID = 0x2 + ST_RDONLY = 0x1 + ST_RELATIME = 0x1000 + ST_SYNCHRONOUS = 0x10 +) + +type TpacketHdr struct { + Status uint64 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Usec uint32 + _ [4]byte +} + +type Tpacket2Hdr struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Nsec uint32 + Vlan_tci uint16 + Vlan_tpid uint16 + _ [4]uint8 +} + +type Tpacket3Hdr struct { + Next_offset uint32 + Sec uint32 + Nsec uint32 + Snaplen uint32 + Len uint32 + Status uint32 + Mac uint16 + Net uint16 + Hv1 TpacketHdrVariant1 + _ [8]uint8 +} + +type TpacketHdrVariant1 struct { + Rxhash uint32 + Vlan_tci uint32 + Vlan_tpid uint16 + _ uint16 +} + +type TpacketBlockDesc struct { + Version uint32 + To_priv uint32 + Hdr [40]byte +} + +type TpacketReq struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 +} + +type TpacketReq3 struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 + Retire_blk_tov uint32 + Sizeof_priv uint32 + Feature_req_word uint32 +} + +type TpacketStats struct { + Packets uint32 + Drops uint32 +} + +type TpacketStatsV3 struct { + Packets uint32 + Drops uint32 + Freeze_q_cnt uint32 +} + +type TpacketAuxdata struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Vlan_tci uint16 + Vlan_tpid uint16 +} + +const ( + TPACKET_V1 = 0x0 + TPACKET_V2 = 0x1 + TPACKET_V3 = 0x2 +) + +const ( + SizeofTpacketHdr = 0x20 + SizeofTpacket2Hdr = 0x20 + SizeofTpacket3Hdr = 0x30 +) + +const ( + NF_INET_PRE_ROUTING = 0x0 + NF_INET_LOCAL_IN = 0x1 + NF_INET_FORWARD = 0x2 + NF_INET_LOCAL_OUT = 0x3 + NF_INET_POST_ROUTING = 0x4 + NF_INET_NUMHOOKS = 0x5 +) + +const ( + NF_NETDEV_INGRESS = 0x0 + NF_NETDEV_NUMHOOKS = 0x1 +) + +const ( + NFPROTO_UNSPEC = 0x0 + NFPROTO_INET = 0x1 + NFPROTO_IPV4 = 0x2 + NFPROTO_ARP = 0x3 + NFPROTO_NETDEV = 0x5 + NFPROTO_BRIDGE = 0x7 + NFPROTO_IPV6 = 0xa + NFPROTO_DECNET = 0xc + NFPROTO_NUMPROTO = 0xd +) + +type Nfgenmsg struct { + Nfgen_family uint8 + Version uint8 + Res_id uint16 +} + +const ( + NFNL_BATCH_UNSPEC = 0x0 + NFNL_BATCH_GENID = 0x1 +) + +const ( + NFT_REG_VERDICT = 0x0 + NFT_REG_1 = 0x1 + NFT_REG_2 = 0x2 + NFT_REG_3 = 0x3 + NFT_REG_4 = 0x4 + NFT_REG32_00 = 0x8 + NFT_REG32_01 = 0x9 + NFT_REG32_02 = 0xa + NFT_REG32_03 = 0xb + NFT_REG32_04 = 0xc + NFT_REG32_05 = 0xd + NFT_REG32_06 = 0xe + NFT_REG32_07 = 0xf + NFT_REG32_08 = 0x10 + NFT_REG32_09 = 0x11 + NFT_REG32_10 = 0x12 + NFT_REG32_11 = 0x13 + NFT_REG32_12 = 0x14 + NFT_REG32_13 = 0x15 + NFT_REG32_14 = 0x16 + NFT_REG32_15 = 0x17 + NFT_CONTINUE = -0x1 + NFT_BREAK = -0x2 + NFT_JUMP = -0x3 + NFT_GOTO = -0x4 + NFT_RETURN = -0x5 + NFT_MSG_NEWTABLE = 0x0 + NFT_MSG_GETTABLE = 0x1 + NFT_MSG_DELTABLE = 0x2 + NFT_MSG_NEWCHAIN = 0x3 + NFT_MSG_GETCHAIN = 0x4 + NFT_MSG_DELCHAIN = 0x5 + NFT_MSG_NEWRULE = 0x6 + NFT_MSG_GETRULE = 0x7 + NFT_MSG_DELRULE = 0x8 + NFT_MSG_NEWSET = 0x9 + NFT_MSG_GETSET = 0xa + NFT_MSG_DELSET = 0xb + NFT_MSG_NEWSETELEM = 0xc + NFT_MSG_GETSETELEM = 0xd + NFT_MSG_DELSETELEM = 0xe + NFT_MSG_NEWGEN = 0xf + NFT_MSG_GETGEN = 0x10 + NFT_MSG_TRACE = 0x11 + NFT_MSG_NEWOBJ = 0x12 + NFT_MSG_GETOBJ = 0x13 + NFT_MSG_DELOBJ = 0x14 + NFT_MSG_GETOBJ_RESET = 0x15 + NFT_MSG_MAX = 0x19 + NFTA_LIST_UNPEC = 0x0 + NFTA_LIST_ELEM = 0x1 + NFTA_HOOK_UNSPEC = 0x0 + NFTA_HOOK_HOOKNUM = 0x1 + NFTA_HOOK_PRIORITY = 0x2 + NFTA_HOOK_DEV = 0x3 + NFT_TABLE_F_DORMANT = 0x1 + NFTA_TABLE_UNSPEC = 0x0 + NFTA_TABLE_NAME = 0x1 + NFTA_TABLE_FLAGS = 0x2 + NFTA_TABLE_USE = 0x3 + NFTA_CHAIN_UNSPEC = 0x0 + NFTA_CHAIN_TABLE = 0x1 + NFTA_CHAIN_HANDLE = 0x2 + NFTA_CHAIN_NAME = 0x3 + NFTA_CHAIN_HOOK = 0x4 + NFTA_CHAIN_POLICY = 0x5 + NFTA_CHAIN_USE = 0x6 + NFTA_CHAIN_TYPE = 0x7 + NFTA_CHAIN_COUNTERS = 0x8 + NFTA_CHAIN_PAD = 0x9 + NFTA_RULE_UNSPEC = 0x0 + NFTA_RULE_TABLE = 0x1 + NFTA_RULE_CHAIN = 0x2 + NFTA_RULE_HANDLE = 0x3 + NFTA_RULE_EXPRESSIONS = 0x4 + NFTA_RULE_COMPAT = 0x5 + NFTA_RULE_POSITION = 0x6 + NFTA_RULE_USERDATA = 0x7 + NFTA_RULE_PAD = 0x8 + NFTA_RULE_ID = 0x9 + NFT_RULE_COMPAT_F_INV = 0x2 + NFT_RULE_COMPAT_F_MASK = 0x2 + NFTA_RULE_COMPAT_UNSPEC = 0x0 + NFTA_RULE_COMPAT_PROTO = 0x1 + NFTA_RULE_COMPAT_FLAGS = 0x2 + NFT_SET_ANONYMOUS = 0x1 + NFT_SET_CONSTANT = 0x2 + NFT_SET_INTERVAL = 0x4 + NFT_SET_MAP = 0x8 + NFT_SET_TIMEOUT = 0x10 + NFT_SET_EVAL = 0x20 + NFT_SET_OBJECT = 0x40 + NFT_SET_POL_PERFORMANCE = 0x0 + NFT_SET_POL_MEMORY = 0x1 + NFTA_SET_DESC_UNSPEC = 0x0 + NFTA_SET_DESC_SIZE = 0x1 + NFTA_SET_UNSPEC = 0x0 + NFTA_SET_TABLE = 0x1 + NFTA_SET_NAME = 0x2 + NFTA_SET_FLAGS = 0x3 + NFTA_SET_KEY_TYPE = 0x4 + NFTA_SET_KEY_LEN = 0x5 + NFTA_SET_DATA_TYPE = 0x6 + NFTA_SET_DATA_LEN = 0x7 + NFTA_SET_POLICY = 0x8 + NFTA_SET_DESC = 0x9 + NFTA_SET_ID = 0xa + NFTA_SET_TIMEOUT = 0xb + NFTA_SET_GC_INTERVAL = 0xc + NFTA_SET_USERDATA = 0xd + NFTA_SET_PAD = 0xe + NFTA_SET_OBJ_TYPE = 0xf + NFT_SET_ELEM_INTERVAL_END = 0x1 + NFTA_SET_ELEM_UNSPEC = 0x0 + NFTA_SET_ELEM_KEY = 0x1 + NFTA_SET_ELEM_DATA = 0x2 + NFTA_SET_ELEM_FLAGS = 0x3 + NFTA_SET_ELEM_TIMEOUT = 0x4 + NFTA_SET_ELEM_EXPIRATION = 0x5 + NFTA_SET_ELEM_USERDATA = 0x6 + NFTA_SET_ELEM_EXPR = 0x7 + NFTA_SET_ELEM_PAD = 0x8 + NFTA_SET_ELEM_OBJREF = 0x9 + NFTA_SET_ELEM_LIST_UNSPEC = 0x0 + NFTA_SET_ELEM_LIST_TABLE = 0x1 + NFTA_SET_ELEM_LIST_SET = 0x2 + NFTA_SET_ELEM_LIST_ELEMENTS = 0x3 + NFTA_SET_ELEM_LIST_SET_ID = 0x4 + NFT_DATA_VALUE = 0x0 + NFT_DATA_VERDICT = 0xffffff00 + NFTA_DATA_UNSPEC = 0x0 + NFTA_DATA_VALUE = 0x1 + NFTA_DATA_VERDICT = 0x2 + NFTA_VERDICT_UNSPEC = 0x0 + NFTA_VERDICT_CODE = 0x1 + NFTA_VERDICT_CHAIN = 0x2 + NFTA_EXPR_UNSPEC = 0x0 + NFTA_EXPR_NAME = 0x1 + NFTA_EXPR_DATA = 0x2 + NFTA_IMMEDIATE_UNSPEC = 0x0 + NFTA_IMMEDIATE_DREG = 0x1 + NFTA_IMMEDIATE_DATA = 0x2 + NFTA_BITWISE_UNSPEC = 0x0 + NFTA_BITWISE_SREG = 0x1 + NFTA_BITWISE_DREG = 0x2 + NFTA_BITWISE_LEN = 0x3 + NFTA_BITWISE_MASK = 0x4 + NFTA_BITWISE_XOR = 0x5 + NFT_BYTEORDER_NTOH = 0x0 + NFT_BYTEORDER_HTON = 0x1 + NFTA_BYTEORDER_UNSPEC = 0x0 + NFTA_BYTEORDER_SREG = 0x1 + NFTA_BYTEORDER_DREG = 0x2 + NFTA_BYTEORDER_OP = 0x3 + NFTA_BYTEORDER_LEN = 0x4 + NFTA_BYTEORDER_SIZE = 0x5 + NFT_CMP_EQ = 0x0 + NFT_CMP_NEQ = 0x1 + NFT_CMP_LT = 0x2 + NFT_CMP_LTE = 0x3 + NFT_CMP_GT = 0x4 + NFT_CMP_GTE = 0x5 + NFTA_CMP_UNSPEC = 0x0 + NFTA_CMP_SREG = 0x1 + NFTA_CMP_OP = 0x2 + NFTA_CMP_DATA = 0x3 + NFT_RANGE_EQ = 0x0 + NFT_RANGE_NEQ = 0x1 + NFTA_RANGE_UNSPEC = 0x0 + NFTA_RANGE_SREG = 0x1 + NFTA_RANGE_OP = 0x2 + NFTA_RANGE_FROM_DATA = 0x3 + NFTA_RANGE_TO_DATA = 0x4 + NFT_LOOKUP_F_INV = 0x1 + NFTA_LOOKUP_UNSPEC = 0x0 + NFTA_LOOKUP_SET = 0x1 + NFTA_LOOKUP_SREG = 0x2 + NFTA_LOOKUP_DREG = 0x3 + NFTA_LOOKUP_SET_ID = 0x4 + NFTA_LOOKUP_FLAGS = 0x5 + NFT_DYNSET_OP_ADD = 0x0 + NFT_DYNSET_OP_UPDATE = 0x1 + NFT_DYNSET_F_INV = 0x1 + NFTA_DYNSET_UNSPEC = 0x0 + NFTA_DYNSET_SET_NAME = 0x1 + NFTA_DYNSET_SET_ID = 0x2 + NFTA_DYNSET_OP = 0x3 + NFTA_DYNSET_SREG_KEY = 0x4 + NFTA_DYNSET_SREG_DATA = 0x5 + NFTA_DYNSET_TIMEOUT = 0x6 + NFTA_DYNSET_EXPR = 0x7 + NFTA_DYNSET_PAD = 0x8 + NFTA_DYNSET_FLAGS = 0x9 + NFT_PAYLOAD_LL_HEADER = 0x0 + NFT_PAYLOAD_NETWORK_HEADER = 0x1 + NFT_PAYLOAD_TRANSPORT_HEADER = 0x2 + NFT_PAYLOAD_CSUM_NONE = 0x0 + NFT_PAYLOAD_CSUM_INET = 0x1 + NFT_PAYLOAD_L4CSUM_PSEUDOHDR = 0x1 + NFTA_PAYLOAD_UNSPEC = 0x0 + NFTA_PAYLOAD_DREG = 0x1 + NFTA_PAYLOAD_BASE = 0x2 + NFTA_PAYLOAD_OFFSET = 0x3 + NFTA_PAYLOAD_LEN = 0x4 + NFTA_PAYLOAD_SREG = 0x5 + NFTA_PAYLOAD_CSUM_TYPE = 0x6 + NFTA_PAYLOAD_CSUM_OFFSET = 0x7 + NFTA_PAYLOAD_CSUM_FLAGS = 0x8 + NFT_EXTHDR_F_PRESENT = 0x1 + NFT_EXTHDR_OP_IPV6 = 0x0 + NFT_EXTHDR_OP_TCPOPT = 0x1 + NFTA_EXTHDR_UNSPEC = 0x0 + NFTA_EXTHDR_DREG = 0x1 + NFTA_EXTHDR_TYPE = 0x2 + NFTA_EXTHDR_OFFSET = 0x3 + NFTA_EXTHDR_LEN = 0x4 + NFTA_EXTHDR_FLAGS = 0x5 + NFTA_EXTHDR_OP = 0x6 + NFTA_EXTHDR_SREG = 0x7 + NFT_META_LEN = 0x0 + NFT_META_PROTOCOL = 0x1 + NFT_META_PRIORITY = 0x2 + NFT_META_MARK = 0x3 + NFT_META_IIF = 0x4 + NFT_META_OIF = 0x5 + NFT_META_IIFNAME = 0x6 + NFT_META_OIFNAME = 0x7 + NFT_META_IIFTYPE = 0x8 + NFT_META_OIFTYPE = 0x9 + NFT_META_SKUID = 0xa + NFT_META_SKGID = 0xb + NFT_META_NFTRACE = 0xc + NFT_META_RTCLASSID = 0xd + NFT_META_SECMARK = 0xe + NFT_META_NFPROTO = 0xf + NFT_META_L4PROTO = 0x10 + NFT_META_BRI_IIFNAME = 0x11 + NFT_META_BRI_OIFNAME = 0x12 + NFT_META_PKTTYPE = 0x13 + NFT_META_CPU = 0x14 + NFT_META_IIFGROUP = 0x15 + NFT_META_OIFGROUP = 0x16 + NFT_META_CGROUP = 0x17 + NFT_META_PRANDOM = 0x18 + NFT_RT_CLASSID = 0x0 + NFT_RT_NEXTHOP4 = 0x1 + NFT_RT_NEXTHOP6 = 0x2 + NFT_RT_TCPMSS = 0x3 + NFT_HASH_JENKINS = 0x0 + NFT_HASH_SYM = 0x1 + NFTA_HASH_UNSPEC = 0x0 + NFTA_HASH_SREG = 0x1 + NFTA_HASH_DREG = 0x2 + NFTA_HASH_LEN = 0x3 + NFTA_HASH_MODULUS = 0x4 + NFTA_HASH_SEED = 0x5 + NFTA_HASH_OFFSET = 0x6 + NFTA_HASH_TYPE = 0x7 + NFTA_META_UNSPEC = 0x0 + NFTA_META_DREG = 0x1 + NFTA_META_KEY = 0x2 + NFTA_META_SREG = 0x3 + NFTA_RT_UNSPEC = 0x0 + NFTA_RT_DREG = 0x1 + NFTA_RT_KEY = 0x2 + NFT_CT_STATE = 0x0 + NFT_CT_DIRECTION = 0x1 + NFT_CT_STATUS = 0x2 + NFT_CT_MARK = 0x3 + NFT_CT_SECMARK = 0x4 + NFT_CT_EXPIRATION = 0x5 + NFT_CT_HELPER = 0x6 + NFT_CT_L3PROTOCOL = 0x7 + NFT_CT_SRC = 0x8 + NFT_CT_DST = 0x9 + NFT_CT_PROTOCOL = 0xa + NFT_CT_PROTO_SRC = 0xb + NFT_CT_PROTO_DST = 0xc + NFT_CT_LABELS = 0xd + NFT_CT_PKTS = 0xe + NFT_CT_BYTES = 0xf + NFT_CT_AVGPKT = 0x10 + NFT_CT_ZONE = 0x11 + NFT_CT_EVENTMASK = 0x12 + NFTA_CT_UNSPEC = 0x0 + NFTA_CT_DREG = 0x1 + NFTA_CT_KEY = 0x2 + NFTA_CT_DIRECTION = 0x3 + NFTA_CT_SREG = 0x4 + NFT_LIMIT_PKTS = 0x0 + NFT_LIMIT_PKT_BYTES = 0x1 + NFT_LIMIT_F_INV = 0x1 + NFTA_LIMIT_UNSPEC = 0x0 + NFTA_LIMIT_RATE = 0x1 + NFTA_LIMIT_UNIT = 0x2 + NFTA_LIMIT_BURST = 0x3 + NFTA_LIMIT_TYPE = 0x4 + NFTA_LIMIT_FLAGS = 0x5 + NFTA_LIMIT_PAD = 0x6 + NFTA_COUNTER_UNSPEC = 0x0 + NFTA_COUNTER_BYTES = 0x1 + NFTA_COUNTER_PACKETS = 0x2 + NFTA_COUNTER_PAD = 0x3 + NFTA_LOG_UNSPEC = 0x0 + NFTA_LOG_GROUP = 0x1 + NFTA_LOG_PREFIX = 0x2 + NFTA_LOG_SNAPLEN = 0x3 + NFTA_LOG_QTHRESHOLD = 0x4 + NFTA_LOG_LEVEL = 0x5 + NFTA_LOG_FLAGS = 0x6 + NFTA_QUEUE_UNSPEC = 0x0 + NFTA_QUEUE_NUM = 0x1 + NFTA_QUEUE_TOTAL = 0x2 + NFTA_QUEUE_FLAGS = 0x3 + NFTA_QUEUE_SREG_QNUM = 0x4 + NFT_QUOTA_F_INV = 0x1 + NFT_QUOTA_F_DEPLETED = 0x2 + NFTA_QUOTA_UNSPEC = 0x0 + NFTA_QUOTA_BYTES = 0x1 + NFTA_QUOTA_FLAGS = 0x2 + NFTA_QUOTA_PAD = 0x3 + NFTA_QUOTA_CONSUMED = 0x4 + NFT_REJECT_ICMP_UNREACH = 0x0 + NFT_REJECT_TCP_RST = 0x1 + NFT_REJECT_ICMPX_UNREACH = 0x2 + NFT_REJECT_ICMPX_NO_ROUTE = 0x0 + NFT_REJECT_ICMPX_PORT_UNREACH = 0x1 + NFT_REJECT_ICMPX_HOST_UNREACH = 0x2 + NFT_REJECT_ICMPX_ADMIN_PROHIBITED = 0x3 + NFTA_REJECT_UNSPEC = 0x0 + NFTA_REJECT_TYPE = 0x1 + NFTA_REJECT_ICMP_CODE = 0x2 + NFT_NAT_SNAT = 0x0 + NFT_NAT_DNAT = 0x1 + NFTA_NAT_UNSPEC = 0x0 + NFTA_NAT_TYPE = 0x1 + NFTA_NAT_FAMILY = 0x2 + NFTA_NAT_REG_ADDR_MIN = 0x3 + NFTA_NAT_REG_ADDR_MAX = 0x4 + NFTA_NAT_REG_PROTO_MIN = 0x5 + NFTA_NAT_REG_PROTO_MAX = 0x6 + NFTA_NAT_FLAGS = 0x7 + NFTA_MASQ_UNSPEC = 0x0 + NFTA_MASQ_FLAGS = 0x1 + NFTA_MASQ_REG_PROTO_MIN = 0x2 + NFTA_MASQ_REG_PROTO_MAX = 0x3 + NFTA_REDIR_UNSPEC = 0x0 + NFTA_REDIR_REG_PROTO_MIN = 0x1 + NFTA_REDIR_REG_PROTO_MAX = 0x2 + NFTA_REDIR_FLAGS = 0x3 + NFTA_DUP_UNSPEC = 0x0 + NFTA_DUP_SREG_ADDR = 0x1 + NFTA_DUP_SREG_DEV = 0x2 + NFTA_FWD_UNSPEC = 0x0 + NFTA_FWD_SREG_DEV = 0x1 + NFTA_OBJREF_UNSPEC = 0x0 + NFTA_OBJREF_IMM_TYPE = 0x1 + NFTA_OBJREF_IMM_NAME = 0x2 + NFTA_OBJREF_SET_SREG = 0x3 + NFTA_OBJREF_SET_NAME = 0x4 + NFTA_OBJREF_SET_ID = 0x5 + NFTA_GEN_UNSPEC = 0x0 + NFTA_GEN_ID = 0x1 + NFTA_GEN_PROC_PID = 0x2 + NFTA_GEN_PROC_NAME = 0x3 + NFTA_FIB_UNSPEC = 0x0 + NFTA_FIB_DREG = 0x1 + NFTA_FIB_RESULT = 0x2 + NFTA_FIB_FLAGS = 0x3 + NFT_FIB_RESULT_UNSPEC = 0x0 + NFT_FIB_RESULT_OIF = 0x1 + NFT_FIB_RESULT_OIFNAME = 0x2 + NFT_FIB_RESULT_ADDRTYPE = 0x3 + NFTA_FIB_F_SADDR = 0x1 + NFTA_FIB_F_DADDR = 0x2 + NFTA_FIB_F_MARK = 0x4 + NFTA_FIB_F_IIF = 0x8 + NFTA_FIB_F_OIF = 0x10 + NFTA_FIB_F_PRESENT = 0x20 + NFTA_CT_HELPER_UNSPEC = 0x0 + NFTA_CT_HELPER_NAME = 0x1 + NFTA_CT_HELPER_L3PROTO = 0x2 + NFTA_CT_HELPER_L4PROTO = 0x3 + NFTA_OBJ_UNSPEC = 0x0 + NFTA_OBJ_TABLE = 0x1 + NFTA_OBJ_NAME = 0x2 + NFTA_OBJ_TYPE = 0x3 + NFTA_OBJ_DATA = 0x4 + NFTA_OBJ_USE = 0x5 + NFTA_TRACE_UNSPEC = 0x0 + NFTA_TRACE_TABLE = 0x1 + NFTA_TRACE_CHAIN = 0x2 + NFTA_TRACE_RULE_HANDLE = 0x3 + NFTA_TRACE_TYPE = 0x4 + NFTA_TRACE_VERDICT = 0x5 + NFTA_TRACE_ID = 0x6 + NFTA_TRACE_LL_HEADER = 0x7 + NFTA_TRACE_NETWORK_HEADER = 0x8 + NFTA_TRACE_TRANSPORT_HEADER = 0x9 + NFTA_TRACE_IIF = 0xa + NFTA_TRACE_IIFTYPE = 0xb + NFTA_TRACE_OIF = 0xc + NFTA_TRACE_OIFTYPE = 0xd + NFTA_TRACE_MARK = 0xe + NFTA_TRACE_NFPROTO = 0xf + NFTA_TRACE_POLICY = 0x10 + NFTA_TRACE_PAD = 0x11 + NFT_TRACETYPE_UNSPEC = 0x0 + NFT_TRACETYPE_POLICY = 0x1 + NFT_TRACETYPE_RETURN = 0x2 + NFT_TRACETYPE_RULE = 0x3 + NFTA_NG_UNSPEC = 0x0 + NFTA_NG_DREG = 0x1 + NFTA_NG_MODULUS = 0x2 + NFTA_NG_TYPE = 0x3 + NFTA_NG_OFFSET = 0x4 + NFT_NG_INCREMENTAL = 0x0 + NFT_NG_RANDOM = 0x1 +) diff --git a/api/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go b/api/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go new file mode 100644 index 0000000..e0a3932 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go @@ -0,0 +1,1809 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mips,linux + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int32 + Nsec int32 +} + +type Timeval struct { + Sec int32 + Usec int32 +} + +type Timex struct { + Modes uint32 + Offset int32 + Freq int32 + Maxerror int32 + Esterror int32 + Status int32 + Constant int32 + Precision int32 + Tolerance int32 + Time Timeval + Tick int32 + Ppsfreq int32 + Jitter int32 + Shift int32 + Stabil int32 + Jitcnt int32 + Calcnt int32 + Errcnt int32 + Stbcnt int32 + Tai int32 + _ [44]byte +} + +type Time_t int32 + +type Tms struct { + Utime int32 + Stime int32 + Cutime int32 + Cstime int32 +} + +type Utimbuf struct { + Actime int32 + Modtime int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint32 + Pad1 [3]int32 + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint32 + Pad2 [3]int32 + Size int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Blksize int32 + Pad4 int32 + Blocks int64 + Pad5 [14]int32 +} + +type StatxTimestamp struct { + Sec int64 + Nsec uint32 + _ int32 +} + +type Statx_t struct { + Mask uint32 + Blksize uint32 + Attributes uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Mode uint16 + _ [1]uint16 + Ino uint64 + Size uint64 + Blocks uint64 + Attributes_mask uint64 + Atime StatxTimestamp + Btime StatxTimestamp + Ctime StatxTimestamp + Mtime StatxTimestamp + Rdev_major uint32 + Rdev_minor uint32 + Dev_major uint32 + Dev_minor uint32 + _ [14]uint64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + _ [5]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + _ [4]byte + Start int64 + Len int64 + Pid int32 + _ [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrL2 struct { + Family uint16 + Psm uint16 + Bdaddr [6]uint8 + Cid uint16 + Bdaddr_type uint8 + _ [1]byte +} + +type RawSockaddrCAN struct { + Family uint16 + _ [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + _ [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrL2 = 0xe + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_NUM_VF = 0x15 + IFLA_VFINFO_LIST = 0x16 + IFLA_STATS64 = 0x17 + IFLA_VF_PORTS = 0x18 + IFLA_PORT_SELF = 0x19 + IFLA_AF_SPEC = 0x1a + IFLA_GROUP = 0x1b + IFLA_NET_NS_FD = 0x1c + IFLA_EXT_MASK = 0x1d + IFLA_PROMISCUITY = 0x1e + IFLA_NUM_TX_QUEUES = 0x1f + IFLA_NUM_RX_QUEUES = 0x20 + IFLA_CARRIER = 0x21 + IFLA_PHYS_PORT_ID = 0x22 + IFLA_CARRIER_CHANGES = 0x23 + IFLA_PHYS_SWITCH_ID = 0x24 + IFLA_LINK_NETNSID = 0x25 + IFLA_PHYS_PORT_NAME = 0x26 + IFLA_PROTO_DOWN = 0x27 + IFLA_GSO_MAX_SEGS = 0x28 + IFLA_GSO_MAX_SIZE = 0x29 + IFLA_PAD = 0x2a + IFLA_XDP = 0x2b + IFLA_EVENT = 0x2c + IFLA_NEW_NETNSID = 0x2d + IFLA_IF_NETNSID = 0x2e + IFLA_MAX = 0x31 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + _ uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x8 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + _ [2]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Regs [32]uint64 + Lo uint64 + Hi uint64 + Epc uint64 + Badvaddr uint64 + Status uint64 + Cause uint64 +} + +type FdSet struct { + Bits [32]int32 +} + +type Sysinfo_t struct { + Uptime int32 + Loads [3]uint32 + Totalram uint32 + Freeram uint32 + Sharedram uint32 + Bufferram uint32 + Totalswap uint32 + Freeswap uint32 + Procs uint16 + Pad uint16 + Totalhigh uint32 + Freehigh uint32 + Unit uint32 + _ [8]int8 +} + +type Utsname struct { + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte +} + +type Ustat_t struct { + Tfree int32 + Tinode uint32 + Fname [6]int8 + Fpack [6]int8 +} + +type EpollEvent struct { + Events uint32 + PadFd int32 + Fd int32 + Pad int32 +} + +const ( + AT_EMPTY_PATH = 0x1000 + AT_FDCWD = -0x64 + AT_NO_AUTOMOUNT = 0x800 + AT_REMOVEDIR = 0x200 + + AT_STATX_SYNC_AS_STAT = 0x0 + AT_STATX_FORCE_SYNC = 0x2000 + AT_STATX_DONT_SYNC = 0x4000 + + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + Val [32]uint32 +} + +const RNDGETENTCNT = 0x40045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [23]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + _ [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + _ [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + _ [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + _ [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type CGroupStats struct { + Sleeping uint64 + Running uint64 + Stopped uint64 + Uninterruptible uint64 + Io_wait uint64 +} + +const ( + CGROUPSTATS_CMD_UNSPEC = 0x3 + CGROUPSTATS_CMD_GET = 0x4 + CGROUPSTATS_CMD_NEW = 0x5 + CGROUPSTATS_TYPE_UNSPEC = 0x0 + CGROUPSTATS_TYPE_CGROUP_STATS = 0x1 + CGROUPSTATS_CMD_ATTR_UNSPEC = 0x0 + CGROUPSTATS_CMD_ATTR_FD = 0x1 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) + +type cpuMask uint32 + +const ( + _CPU_SETSIZE = 0x400 + _NCPUBITS = 0x20 +) + +const ( + BDADDR_BREDR = 0x0 + BDADDR_LE_PUBLIC = 0x1 + BDADDR_LE_RANDOM = 0x2 +) + +type PerfEventAttr struct { + Type uint32 + Size uint32 + Config uint64 + Sample uint64 + Sample_type uint64 + Read_format uint64 + Bits uint64 + Wakeup uint32 + Bp_type uint32 + Ext1 uint64 + Ext2 uint64 + Branch_sample_type uint64 + Sample_regs_user uint64 + Sample_stack_user uint32 + Clockid int32 + Sample_regs_intr uint64 + Aux_watermark uint32 + _ uint32 +} + +type PerfEventMmapPage struct { + Version uint32 + Compat_version uint32 + Lock uint32 + Index uint32 + Offset int64 + Time_enabled uint64 + Time_running uint64 + Capabilities uint64 + Pmc_width uint16 + Time_shift uint16 + Time_mult uint32 + Time_offset uint64 + Time_zero uint64 + Size uint32 + _ [948]uint8 + Data_head uint64 + Data_tail uint64 + Data_offset uint64 + Data_size uint64 + Aux_head uint64 + Aux_tail uint64 + Aux_offset uint64 + Aux_size uint64 +} + +const ( + PerfBitDisabled uint64 = CBitFieldMaskBit0 + PerfBitInherit = CBitFieldMaskBit1 + PerfBitPinned = CBitFieldMaskBit2 + PerfBitExclusive = CBitFieldMaskBit3 + PerfBitExcludeUser = CBitFieldMaskBit4 + PerfBitExcludeKernel = CBitFieldMaskBit5 + PerfBitExcludeHv = CBitFieldMaskBit6 + PerfBitExcludeIdle = CBitFieldMaskBit7 + PerfBitMmap = CBitFieldMaskBit8 + PerfBitComm = CBitFieldMaskBit9 + PerfBitFreq = CBitFieldMaskBit10 + PerfBitInheritStat = CBitFieldMaskBit11 + PerfBitEnableOnExec = CBitFieldMaskBit12 + PerfBitTask = CBitFieldMaskBit13 + PerfBitWatermark = CBitFieldMaskBit14 + PerfBitPreciseIPBit1 = CBitFieldMaskBit15 + PerfBitPreciseIPBit2 = CBitFieldMaskBit16 + PerfBitMmapData = CBitFieldMaskBit17 + PerfBitSampleIDAll = CBitFieldMaskBit18 + PerfBitExcludeHost = CBitFieldMaskBit19 + PerfBitExcludeGuest = CBitFieldMaskBit20 + PerfBitExcludeCallchainKernel = CBitFieldMaskBit21 + PerfBitExcludeCallchainUser = CBitFieldMaskBit22 + PerfBitMmap2 = CBitFieldMaskBit23 + PerfBitCommExec = CBitFieldMaskBit24 + PerfBitUseClockID = CBitFieldMaskBit25 + PerfBitContextSwitch = CBitFieldMaskBit26 +) + +const ( + PERF_TYPE_HARDWARE = 0x0 + PERF_TYPE_SOFTWARE = 0x1 + PERF_TYPE_TRACEPOINT = 0x2 + PERF_TYPE_HW_CACHE = 0x3 + PERF_TYPE_RAW = 0x4 + PERF_TYPE_BREAKPOINT = 0x5 + + PERF_COUNT_HW_CPU_CYCLES = 0x0 + PERF_COUNT_HW_INSTRUCTIONS = 0x1 + PERF_COUNT_HW_CACHE_REFERENCES = 0x2 + PERF_COUNT_HW_CACHE_MISSES = 0x3 + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 0x4 + PERF_COUNT_HW_BRANCH_MISSES = 0x5 + PERF_COUNT_HW_BUS_CYCLES = 0x6 + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7 + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 0x8 + PERF_COUNT_HW_REF_CPU_CYCLES = 0x9 + + PERF_COUNT_HW_CACHE_L1D = 0x0 + PERF_COUNT_HW_CACHE_L1I = 0x1 + PERF_COUNT_HW_CACHE_LL = 0x2 + PERF_COUNT_HW_CACHE_DTLB = 0x3 + PERF_COUNT_HW_CACHE_ITLB = 0x4 + PERF_COUNT_HW_CACHE_BPU = 0x5 + PERF_COUNT_HW_CACHE_NODE = 0x6 + + PERF_COUNT_HW_CACHE_OP_READ = 0x0 + PERF_COUNT_HW_CACHE_OP_WRITE = 0x1 + PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2 + + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0 + PERF_COUNT_HW_CACHE_RESULT_MISS = 0x1 + + PERF_COUNT_SW_CPU_CLOCK = 0x0 + PERF_COUNT_SW_TASK_CLOCK = 0x1 + PERF_COUNT_SW_PAGE_FAULTS = 0x2 + PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3 + PERF_COUNT_SW_CPU_MIGRATIONS = 0x4 + PERF_COUNT_SW_PAGE_FAULTS_MIN = 0x5 + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 0x6 + PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 + PERF_COUNT_SW_EMULATION_FAULTS = 0x8 + PERF_COUNT_SW_DUMMY = 0x9 + + PERF_SAMPLE_IP = 0x1 + PERF_SAMPLE_TID = 0x2 + PERF_SAMPLE_TIME = 0x4 + PERF_SAMPLE_ADDR = 0x8 + PERF_SAMPLE_READ = 0x10 + PERF_SAMPLE_CALLCHAIN = 0x20 + PERF_SAMPLE_ID = 0x40 + PERF_SAMPLE_CPU = 0x80 + PERF_SAMPLE_PERIOD = 0x100 + PERF_SAMPLE_STREAM_ID = 0x200 + PERF_SAMPLE_RAW = 0x400 + PERF_SAMPLE_BRANCH_STACK = 0x800 + + PERF_SAMPLE_BRANCH_USER = 0x1 + PERF_SAMPLE_BRANCH_KERNEL = 0x2 + PERF_SAMPLE_BRANCH_HV = 0x4 + PERF_SAMPLE_BRANCH_ANY = 0x8 + PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 + PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 + PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + + PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 + PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 + PERF_FORMAT_ID = 0x4 + PERF_FORMAT_GROUP = 0x8 + + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + + PERF_CONTEXT_HV = -0x20 + PERF_CONTEXT_KERNEL = -0x80 + PERF_CONTEXT_USER = -0x200 + + PERF_CONTEXT_GUEST = -0x800 + PERF_CONTEXT_GUEST_KERNEL = -0x880 + PERF_CONTEXT_GUEST_USER = -0xa00 + + PERF_FLAG_FD_NO_GROUP = 0x1 + PERF_FLAG_FD_OUTPUT = 0x2 + PERF_FLAG_PID_CGROUP = 0x4 +) + +const ( + CBitFieldMaskBit0 = 0x8000000000000000 + CBitFieldMaskBit1 = 0x4000000000000000 + CBitFieldMaskBit2 = 0x2000000000000000 + CBitFieldMaskBit3 = 0x1000000000000000 + CBitFieldMaskBit4 = 0x800000000000000 + CBitFieldMaskBit5 = 0x400000000000000 + CBitFieldMaskBit6 = 0x200000000000000 + CBitFieldMaskBit7 = 0x100000000000000 + CBitFieldMaskBit8 = 0x80000000000000 + CBitFieldMaskBit9 = 0x40000000000000 + CBitFieldMaskBit10 = 0x20000000000000 + CBitFieldMaskBit11 = 0x10000000000000 + CBitFieldMaskBit12 = 0x8000000000000 + CBitFieldMaskBit13 = 0x4000000000000 + CBitFieldMaskBit14 = 0x2000000000000 + CBitFieldMaskBit15 = 0x1000000000000 + CBitFieldMaskBit16 = 0x800000000000 + CBitFieldMaskBit17 = 0x400000000000 + CBitFieldMaskBit18 = 0x200000000000 + CBitFieldMaskBit19 = 0x100000000000 + CBitFieldMaskBit20 = 0x80000000000 + CBitFieldMaskBit21 = 0x40000000000 + CBitFieldMaskBit22 = 0x20000000000 + CBitFieldMaskBit23 = 0x10000000000 + CBitFieldMaskBit24 = 0x8000000000 + CBitFieldMaskBit25 = 0x4000000000 + CBitFieldMaskBit26 = 0x2000000000 + CBitFieldMaskBit27 = 0x1000000000 + CBitFieldMaskBit28 = 0x800000000 + CBitFieldMaskBit29 = 0x400000000 + CBitFieldMaskBit30 = 0x200000000 + CBitFieldMaskBit31 = 0x100000000 + CBitFieldMaskBit32 = 0x80000000 + CBitFieldMaskBit33 = 0x40000000 + CBitFieldMaskBit34 = 0x20000000 + CBitFieldMaskBit35 = 0x10000000 + CBitFieldMaskBit36 = 0x8000000 + CBitFieldMaskBit37 = 0x4000000 + CBitFieldMaskBit38 = 0x2000000 + CBitFieldMaskBit39 = 0x1000000 + CBitFieldMaskBit40 = 0x800000 + CBitFieldMaskBit41 = 0x400000 + CBitFieldMaskBit42 = 0x200000 + CBitFieldMaskBit43 = 0x100000 + CBitFieldMaskBit44 = 0x80000 + CBitFieldMaskBit45 = 0x40000 + CBitFieldMaskBit46 = 0x20000 + CBitFieldMaskBit47 = 0x10000 + CBitFieldMaskBit48 = 0x8000 + CBitFieldMaskBit49 = 0x4000 + CBitFieldMaskBit50 = 0x2000 + CBitFieldMaskBit51 = 0x1000 + CBitFieldMaskBit52 = 0x800 + CBitFieldMaskBit53 = 0x400 + CBitFieldMaskBit54 = 0x200 + CBitFieldMaskBit55 = 0x100 + CBitFieldMaskBit56 = 0x80 + CBitFieldMaskBit57 = 0x40 + CBitFieldMaskBit58 = 0x20 + CBitFieldMaskBit59 = 0x10 + CBitFieldMaskBit60 = 0x8 + CBitFieldMaskBit61 = 0x4 + CBitFieldMaskBit62 = 0x2 + CBitFieldMaskBit63 = 0x1 +) + +type SockaddrStorage struct { + Family uint16 + _ [122]int8 + _ uint32 +} + +type TCPMD5Sig struct { + Addr SockaddrStorage + Flags uint8 + Prefixlen uint8 + Keylen uint16 + _ uint32 + Key [80]uint8 +} + +type HDDriveCmdHdr struct { + Command uint8 + Number uint8 + Feature uint8 + Count uint8 +} + +type HDGeometry struct { + Heads uint8 + Sectors uint8 + Cylinders uint16 + Start uint32 +} + +type HDDriveID struct { + Config uint16 + Cyls uint16 + Reserved2 uint16 + Heads uint16 + Track_bytes uint16 + Sector_bytes uint16 + Sectors uint16 + Vendor0 uint16 + Vendor1 uint16 + Vendor2 uint16 + Serial_no [20]uint8 + Buf_type uint16 + Buf_size uint16 + Ecc_bytes uint16 + Fw_rev [8]uint8 + Model [40]uint8 + Max_multsect uint8 + Vendor3 uint8 + Dword_io uint16 + Vendor4 uint8 + Capability uint8 + Reserved50 uint16 + Vendor5 uint8 + TPIO uint8 + Vendor6 uint8 + TDMA uint8 + Field_valid uint16 + Cur_cyls uint16 + Cur_heads uint16 + Cur_sectors uint16 + Cur_capacity0 uint16 + Cur_capacity1 uint16 + Multsect uint8 + Multsect_valid uint8 + Lba_capacity uint32 + Dma_1word uint16 + Dma_mword uint16 + Eide_pio_modes uint16 + Eide_dma_min uint16 + Eide_dma_time uint16 + Eide_pio uint16 + Eide_pio_iordy uint16 + Words69_70 [2]uint16 + Words71_74 [4]uint16 + Queue_depth uint16 + Words76_79 [4]uint16 + Major_rev_num uint16 + Minor_rev_num uint16 + Command_set_1 uint16 + Command_set_2 uint16 + Cfsse uint16 + Cfs_enable_1 uint16 + Cfs_enable_2 uint16 + Csf_default uint16 + Dma_ultra uint16 + Trseuc uint16 + TrsEuc uint16 + CurAPMvalues uint16 + Mprc uint16 + Hw_config uint16 + Acoustic uint16 + Msrqs uint16 + Sxfert uint16 + Sal uint16 + Spg uint32 + Lba_capacity_2 uint64 + Words104_125 [22]uint16 + Last_lun uint16 + Word127 uint16 + Dlf uint16 + Csfo uint16 + Words130_155 [26]uint16 + Word156 uint16 + Words157_159 [3]uint16 + Cfa_power uint16 + Words161_175 [15]uint16 + Words176_205 [30]uint16 + Words206_254 [49]uint16 + Integrity_word uint16 +} + +type Statfs_t struct { + Type int32 + Bsize int32 + Frsize int32 + _ [4]byte + Blocks uint64 + Bfree uint64 + Files uint64 + Ffree uint64 + Bavail uint64 + Fsid Fsid + Namelen int32 + Flags int32 + Spare [5]int32 + _ [4]byte +} + +const ( + ST_MANDLOCK = 0x40 + ST_NOATIME = 0x400 + ST_NODEV = 0x4 + ST_NODIRATIME = 0x800 + ST_NOEXEC = 0x8 + ST_NOSUID = 0x2 + ST_RDONLY = 0x1 + ST_RELATIME = 0x1000 + ST_SYNCHRONOUS = 0x10 +) + +type TpacketHdr struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Usec uint32 +} + +type Tpacket2Hdr struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Nsec uint32 + Vlan_tci uint16 + Vlan_tpid uint16 + _ [4]uint8 +} + +type Tpacket3Hdr struct { + Next_offset uint32 + Sec uint32 + Nsec uint32 + Snaplen uint32 + Len uint32 + Status uint32 + Mac uint16 + Net uint16 + Hv1 TpacketHdrVariant1 + _ [8]uint8 +} + +type TpacketHdrVariant1 struct { + Rxhash uint32 + Vlan_tci uint32 + Vlan_tpid uint16 + _ uint16 +} + +type TpacketBlockDesc struct { + Version uint32 + To_priv uint32 + Hdr [40]byte +} + +type TpacketReq struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 +} + +type TpacketReq3 struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 + Retire_blk_tov uint32 + Sizeof_priv uint32 + Feature_req_word uint32 +} + +type TpacketStats struct { + Packets uint32 + Drops uint32 +} + +type TpacketStatsV3 struct { + Packets uint32 + Drops uint32 + Freeze_q_cnt uint32 +} + +type TpacketAuxdata struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Vlan_tci uint16 + Vlan_tpid uint16 +} + +const ( + TPACKET_V1 = 0x0 + TPACKET_V2 = 0x1 + TPACKET_V3 = 0x2 +) + +const ( + SizeofTpacketHdr = 0x18 + SizeofTpacket2Hdr = 0x20 + SizeofTpacket3Hdr = 0x30 +) + +const ( + NF_INET_PRE_ROUTING = 0x0 + NF_INET_LOCAL_IN = 0x1 + NF_INET_FORWARD = 0x2 + NF_INET_LOCAL_OUT = 0x3 + NF_INET_POST_ROUTING = 0x4 + NF_INET_NUMHOOKS = 0x5 +) + +const ( + NF_NETDEV_INGRESS = 0x0 + NF_NETDEV_NUMHOOKS = 0x1 +) + +const ( + NFPROTO_UNSPEC = 0x0 + NFPROTO_INET = 0x1 + NFPROTO_IPV4 = 0x2 + NFPROTO_ARP = 0x3 + NFPROTO_NETDEV = 0x5 + NFPROTO_BRIDGE = 0x7 + NFPROTO_IPV6 = 0xa + NFPROTO_DECNET = 0xc + NFPROTO_NUMPROTO = 0xd +) + +type Nfgenmsg struct { + Nfgen_family uint8 + Version uint8 + Res_id uint16 +} + +const ( + NFNL_BATCH_UNSPEC = 0x0 + NFNL_BATCH_GENID = 0x1 +) + +const ( + NFT_REG_VERDICT = 0x0 + NFT_REG_1 = 0x1 + NFT_REG_2 = 0x2 + NFT_REG_3 = 0x3 + NFT_REG_4 = 0x4 + NFT_REG32_00 = 0x8 + NFT_REG32_01 = 0x9 + NFT_REG32_02 = 0xa + NFT_REG32_03 = 0xb + NFT_REG32_04 = 0xc + NFT_REG32_05 = 0xd + NFT_REG32_06 = 0xe + NFT_REG32_07 = 0xf + NFT_REG32_08 = 0x10 + NFT_REG32_09 = 0x11 + NFT_REG32_10 = 0x12 + NFT_REG32_11 = 0x13 + NFT_REG32_12 = 0x14 + NFT_REG32_13 = 0x15 + NFT_REG32_14 = 0x16 + NFT_REG32_15 = 0x17 + NFT_CONTINUE = -0x1 + NFT_BREAK = -0x2 + NFT_JUMP = -0x3 + NFT_GOTO = -0x4 + NFT_RETURN = -0x5 + NFT_MSG_NEWTABLE = 0x0 + NFT_MSG_GETTABLE = 0x1 + NFT_MSG_DELTABLE = 0x2 + NFT_MSG_NEWCHAIN = 0x3 + NFT_MSG_GETCHAIN = 0x4 + NFT_MSG_DELCHAIN = 0x5 + NFT_MSG_NEWRULE = 0x6 + NFT_MSG_GETRULE = 0x7 + NFT_MSG_DELRULE = 0x8 + NFT_MSG_NEWSET = 0x9 + NFT_MSG_GETSET = 0xa + NFT_MSG_DELSET = 0xb + NFT_MSG_NEWSETELEM = 0xc + NFT_MSG_GETSETELEM = 0xd + NFT_MSG_DELSETELEM = 0xe + NFT_MSG_NEWGEN = 0xf + NFT_MSG_GETGEN = 0x10 + NFT_MSG_TRACE = 0x11 + NFT_MSG_NEWOBJ = 0x12 + NFT_MSG_GETOBJ = 0x13 + NFT_MSG_DELOBJ = 0x14 + NFT_MSG_GETOBJ_RESET = 0x15 + NFT_MSG_MAX = 0x19 + NFTA_LIST_UNPEC = 0x0 + NFTA_LIST_ELEM = 0x1 + NFTA_HOOK_UNSPEC = 0x0 + NFTA_HOOK_HOOKNUM = 0x1 + NFTA_HOOK_PRIORITY = 0x2 + NFTA_HOOK_DEV = 0x3 + NFT_TABLE_F_DORMANT = 0x1 + NFTA_TABLE_UNSPEC = 0x0 + NFTA_TABLE_NAME = 0x1 + NFTA_TABLE_FLAGS = 0x2 + NFTA_TABLE_USE = 0x3 + NFTA_CHAIN_UNSPEC = 0x0 + NFTA_CHAIN_TABLE = 0x1 + NFTA_CHAIN_HANDLE = 0x2 + NFTA_CHAIN_NAME = 0x3 + NFTA_CHAIN_HOOK = 0x4 + NFTA_CHAIN_POLICY = 0x5 + NFTA_CHAIN_USE = 0x6 + NFTA_CHAIN_TYPE = 0x7 + NFTA_CHAIN_COUNTERS = 0x8 + NFTA_CHAIN_PAD = 0x9 + NFTA_RULE_UNSPEC = 0x0 + NFTA_RULE_TABLE = 0x1 + NFTA_RULE_CHAIN = 0x2 + NFTA_RULE_HANDLE = 0x3 + NFTA_RULE_EXPRESSIONS = 0x4 + NFTA_RULE_COMPAT = 0x5 + NFTA_RULE_POSITION = 0x6 + NFTA_RULE_USERDATA = 0x7 + NFTA_RULE_PAD = 0x8 + NFTA_RULE_ID = 0x9 + NFT_RULE_COMPAT_F_INV = 0x2 + NFT_RULE_COMPAT_F_MASK = 0x2 + NFTA_RULE_COMPAT_UNSPEC = 0x0 + NFTA_RULE_COMPAT_PROTO = 0x1 + NFTA_RULE_COMPAT_FLAGS = 0x2 + NFT_SET_ANONYMOUS = 0x1 + NFT_SET_CONSTANT = 0x2 + NFT_SET_INTERVAL = 0x4 + NFT_SET_MAP = 0x8 + NFT_SET_TIMEOUT = 0x10 + NFT_SET_EVAL = 0x20 + NFT_SET_OBJECT = 0x40 + NFT_SET_POL_PERFORMANCE = 0x0 + NFT_SET_POL_MEMORY = 0x1 + NFTA_SET_DESC_UNSPEC = 0x0 + NFTA_SET_DESC_SIZE = 0x1 + NFTA_SET_UNSPEC = 0x0 + NFTA_SET_TABLE = 0x1 + NFTA_SET_NAME = 0x2 + NFTA_SET_FLAGS = 0x3 + NFTA_SET_KEY_TYPE = 0x4 + NFTA_SET_KEY_LEN = 0x5 + NFTA_SET_DATA_TYPE = 0x6 + NFTA_SET_DATA_LEN = 0x7 + NFTA_SET_POLICY = 0x8 + NFTA_SET_DESC = 0x9 + NFTA_SET_ID = 0xa + NFTA_SET_TIMEOUT = 0xb + NFTA_SET_GC_INTERVAL = 0xc + NFTA_SET_USERDATA = 0xd + NFTA_SET_PAD = 0xe + NFTA_SET_OBJ_TYPE = 0xf + NFT_SET_ELEM_INTERVAL_END = 0x1 + NFTA_SET_ELEM_UNSPEC = 0x0 + NFTA_SET_ELEM_KEY = 0x1 + NFTA_SET_ELEM_DATA = 0x2 + NFTA_SET_ELEM_FLAGS = 0x3 + NFTA_SET_ELEM_TIMEOUT = 0x4 + NFTA_SET_ELEM_EXPIRATION = 0x5 + NFTA_SET_ELEM_USERDATA = 0x6 + NFTA_SET_ELEM_EXPR = 0x7 + NFTA_SET_ELEM_PAD = 0x8 + NFTA_SET_ELEM_OBJREF = 0x9 + NFTA_SET_ELEM_LIST_UNSPEC = 0x0 + NFTA_SET_ELEM_LIST_TABLE = 0x1 + NFTA_SET_ELEM_LIST_SET = 0x2 + NFTA_SET_ELEM_LIST_ELEMENTS = 0x3 + NFTA_SET_ELEM_LIST_SET_ID = 0x4 + NFT_DATA_VALUE = 0x0 + NFT_DATA_VERDICT = 0xffffff00 + NFTA_DATA_UNSPEC = 0x0 + NFTA_DATA_VALUE = 0x1 + NFTA_DATA_VERDICT = 0x2 + NFTA_VERDICT_UNSPEC = 0x0 + NFTA_VERDICT_CODE = 0x1 + NFTA_VERDICT_CHAIN = 0x2 + NFTA_EXPR_UNSPEC = 0x0 + NFTA_EXPR_NAME = 0x1 + NFTA_EXPR_DATA = 0x2 + NFTA_IMMEDIATE_UNSPEC = 0x0 + NFTA_IMMEDIATE_DREG = 0x1 + NFTA_IMMEDIATE_DATA = 0x2 + NFTA_BITWISE_UNSPEC = 0x0 + NFTA_BITWISE_SREG = 0x1 + NFTA_BITWISE_DREG = 0x2 + NFTA_BITWISE_LEN = 0x3 + NFTA_BITWISE_MASK = 0x4 + NFTA_BITWISE_XOR = 0x5 + NFT_BYTEORDER_NTOH = 0x0 + NFT_BYTEORDER_HTON = 0x1 + NFTA_BYTEORDER_UNSPEC = 0x0 + NFTA_BYTEORDER_SREG = 0x1 + NFTA_BYTEORDER_DREG = 0x2 + NFTA_BYTEORDER_OP = 0x3 + NFTA_BYTEORDER_LEN = 0x4 + NFTA_BYTEORDER_SIZE = 0x5 + NFT_CMP_EQ = 0x0 + NFT_CMP_NEQ = 0x1 + NFT_CMP_LT = 0x2 + NFT_CMP_LTE = 0x3 + NFT_CMP_GT = 0x4 + NFT_CMP_GTE = 0x5 + NFTA_CMP_UNSPEC = 0x0 + NFTA_CMP_SREG = 0x1 + NFTA_CMP_OP = 0x2 + NFTA_CMP_DATA = 0x3 + NFT_RANGE_EQ = 0x0 + NFT_RANGE_NEQ = 0x1 + NFTA_RANGE_UNSPEC = 0x0 + NFTA_RANGE_SREG = 0x1 + NFTA_RANGE_OP = 0x2 + NFTA_RANGE_FROM_DATA = 0x3 + NFTA_RANGE_TO_DATA = 0x4 + NFT_LOOKUP_F_INV = 0x1 + NFTA_LOOKUP_UNSPEC = 0x0 + NFTA_LOOKUP_SET = 0x1 + NFTA_LOOKUP_SREG = 0x2 + NFTA_LOOKUP_DREG = 0x3 + NFTA_LOOKUP_SET_ID = 0x4 + NFTA_LOOKUP_FLAGS = 0x5 + NFT_DYNSET_OP_ADD = 0x0 + NFT_DYNSET_OP_UPDATE = 0x1 + NFT_DYNSET_F_INV = 0x1 + NFTA_DYNSET_UNSPEC = 0x0 + NFTA_DYNSET_SET_NAME = 0x1 + NFTA_DYNSET_SET_ID = 0x2 + NFTA_DYNSET_OP = 0x3 + NFTA_DYNSET_SREG_KEY = 0x4 + NFTA_DYNSET_SREG_DATA = 0x5 + NFTA_DYNSET_TIMEOUT = 0x6 + NFTA_DYNSET_EXPR = 0x7 + NFTA_DYNSET_PAD = 0x8 + NFTA_DYNSET_FLAGS = 0x9 + NFT_PAYLOAD_LL_HEADER = 0x0 + NFT_PAYLOAD_NETWORK_HEADER = 0x1 + NFT_PAYLOAD_TRANSPORT_HEADER = 0x2 + NFT_PAYLOAD_CSUM_NONE = 0x0 + NFT_PAYLOAD_CSUM_INET = 0x1 + NFT_PAYLOAD_L4CSUM_PSEUDOHDR = 0x1 + NFTA_PAYLOAD_UNSPEC = 0x0 + NFTA_PAYLOAD_DREG = 0x1 + NFTA_PAYLOAD_BASE = 0x2 + NFTA_PAYLOAD_OFFSET = 0x3 + NFTA_PAYLOAD_LEN = 0x4 + NFTA_PAYLOAD_SREG = 0x5 + NFTA_PAYLOAD_CSUM_TYPE = 0x6 + NFTA_PAYLOAD_CSUM_OFFSET = 0x7 + NFTA_PAYLOAD_CSUM_FLAGS = 0x8 + NFT_EXTHDR_F_PRESENT = 0x1 + NFT_EXTHDR_OP_IPV6 = 0x0 + NFT_EXTHDR_OP_TCPOPT = 0x1 + NFTA_EXTHDR_UNSPEC = 0x0 + NFTA_EXTHDR_DREG = 0x1 + NFTA_EXTHDR_TYPE = 0x2 + NFTA_EXTHDR_OFFSET = 0x3 + NFTA_EXTHDR_LEN = 0x4 + NFTA_EXTHDR_FLAGS = 0x5 + NFTA_EXTHDR_OP = 0x6 + NFTA_EXTHDR_SREG = 0x7 + NFT_META_LEN = 0x0 + NFT_META_PROTOCOL = 0x1 + NFT_META_PRIORITY = 0x2 + NFT_META_MARK = 0x3 + NFT_META_IIF = 0x4 + NFT_META_OIF = 0x5 + NFT_META_IIFNAME = 0x6 + NFT_META_OIFNAME = 0x7 + NFT_META_IIFTYPE = 0x8 + NFT_META_OIFTYPE = 0x9 + NFT_META_SKUID = 0xa + NFT_META_SKGID = 0xb + NFT_META_NFTRACE = 0xc + NFT_META_RTCLASSID = 0xd + NFT_META_SECMARK = 0xe + NFT_META_NFPROTO = 0xf + NFT_META_L4PROTO = 0x10 + NFT_META_BRI_IIFNAME = 0x11 + NFT_META_BRI_OIFNAME = 0x12 + NFT_META_PKTTYPE = 0x13 + NFT_META_CPU = 0x14 + NFT_META_IIFGROUP = 0x15 + NFT_META_OIFGROUP = 0x16 + NFT_META_CGROUP = 0x17 + NFT_META_PRANDOM = 0x18 + NFT_RT_CLASSID = 0x0 + NFT_RT_NEXTHOP4 = 0x1 + NFT_RT_NEXTHOP6 = 0x2 + NFT_RT_TCPMSS = 0x3 + NFT_HASH_JENKINS = 0x0 + NFT_HASH_SYM = 0x1 + NFTA_HASH_UNSPEC = 0x0 + NFTA_HASH_SREG = 0x1 + NFTA_HASH_DREG = 0x2 + NFTA_HASH_LEN = 0x3 + NFTA_HASH_MODULUS = 0x4 + NFTA_HASH_SEED = 0x5 + NFTA_HASH_OFFSET = 0x6 + NFTA_HASH_TYPE = 0x7 + NFTA_META_UNSPEC = 0x0 + NFTA_META_DREG = 0x1 + NFTA_META_KEY = 0x2 + NFTA_META_SREG = 0x3 + NFTA_RT_UNSPEC = 0x0 + NFTA_RT_DREG = 0x1 + NFTA_RT_KEY = 0x2 + NFT_CT_STATE = 0x0 + NFT_CT_DIRECTION = 0x1 + NFT_CT_STATUS = 0x2 + NFT_CT_MARK = 0x3 + NFT_CT_SECMARK = 0x4 + NFT_CT_EXPIRATION = 0x5 + NFT_CT_HELPER = 0x6 + NFT_CT_L3PROTOCOL = 0x7 + NFT_CT_SRC = 0x8 + NFT_CT_DST = 0x9 + NFT_CT_PROTOCOL = 0xa + NFT_CT_PROTO_SRC = 0xb + NFT_CT_PROTO_DST = 0xc + NFT_CT_LABELS = 0xd + NFT_CT_PKTS = 0xe + NFT_CT_BYTES = 0xf + NFT_CT_AVGPKT = 0x10 + NFT_CT_ZONE = 0x11 + NFT_CT_EVENTMASK = 0x12 + NFTA_CT_UNSPEC = 0x0 + NFTA_CT_DREG = 0x1 + NFTA_CT_KEY = 0x2 + NFTA_CT_DIRECTION = 0x3 + NFTA_CT_SREG = 0x4 + NFT_LIMIT_PKTS = 0x0 + NFT_LIMIT_PKT_BYTES = 0x1 + NFT_LIMIT_F_INV = 0x1 + NFTA_LIMIT_UNSPEC = 0x0 + NFTA_LIMIT_RATE = 0x1 + NFTA_LIMIT_UNIT = 0x2 + NFTA_LIMIT_BURST = 0x3 + NFTA_LIMIT_TYPE = 0x4 + NFTA_LIMIT_FLAGS = 0x5 + NFTA_LIMIT_PAD = 0x6 + NFTA_COUNTER_UNSPEC = 0x0 + NFTA_COUNTER_BYTES = 0x1 + NFTA_COUNTER_PACKETS = 0x2 + NFTA_COUNTER_PAD = 0x3 + NFTA_LOG_UNSPEC = 0x0 + NFTA_LOG_GROUP = 0x1 + NFTA_LOG_PREFIX = 0x2 + NFTA_LOG_SNAPLEN = 0x3 + NFTA_LOG_QTHRESHOLD = 0x4 + NFTA_LOG_LEVEL = 0x5 + NFTA_LOG_FLAGS = 0x6 + NFTA_QUEUE_UNSPEC = 0x0 + NFTA_QUEUE_NUM = 0x1 + NFTA_QUEUE_TOTAL = 0x2 + NFTA_QUEUE_FLAGS = 0x3 + NFTA_QUEUE_SREG_QNUM = 0x4 + NFT_QUOTA_F_INV = 0x1 + NFT_QUOTA_F_DEPLETED = 0x2 + NFTA_QUOTA_UNSPEC = 0x0 + NFTA_QUOTA_BYTES = 0x1 + NFTA_QUOTA_FLAGS = 0x2 + NFTA_QUOTA_PAD = 0x3 + NFTA_QUOTA_CONSUMED = 0x4 + NFT_REJECT_ICMP_UNREACH = 0x0 + NFT_REJECT_TCP_RST = 0x1 + NFT_REJECT_ICMPX_UNREACH = 0x2 + NFT_REJECT_ICMPX_NO_ROUTE = 0x0 + NFT_REJECT_ICMPX_PORT_UNREACH = 0x1 + NFT_REJECT_ICMPX_HOST_UNREACH = 0x2 + NFT_REJECT_ICMPX_ADMIN_PROHIBITED = 0x3 + NFTA_REJECT_UNSPEC = 0x0 + NFTA_REJECT_TYPE = 0x1 + NFTA_REJECT_ICMP_CODE = 0x2 + NFT_NAT_SNAT = 0x0 + NFT_NAT_DNAT = 0x1 + NFTA_NAT_UNSPEC = 0x0 + NFTA_NAT_TYPE = 0x1 + NFTA_NAT_FAMILY = 0x2 + NFTA_NAT_REG_ADDR_MIN = 0x3 + NFTA_NAT_REG_ADDR_MAX = 0x4 + NFTA_NAT_REG_PROTO_MIN = 0x5 + NFTA_NAT_REG_PROTO_MAX = 0x6 + NFTA_NAT_FLAGS = 0x7 + NFTA_MASQ_UNSPEC = 0x0 + NFTA_MASQ_FLAGS = 0x1 + NFTA_MASQ_REG_PROTO_MIN = 0x2 + NFTA_MASQ_REG_PROTO_MAX = 0x3 + NFTA_REDIR_UNSPEC = 0x0 + NFTA_REDIR_REG_PROTO_MIN = 0x1 + NFTA_REDIR_REG_PROTO_MAX = 0x2 + NFTA_REDIR_FLAGS = 0x3 + NFTA_DUP_UNSPEC = 0x0 + NFTA_DUP_SREG_ADDR = 0x1 + NFTA_DUP_SREG_DEV = 0x2 + NFTA_FWD_UNSPEC = 0x0 + NFTA_FWD_SREG_DEV = 0x1 + NFTA_OBJREF_UNSPEC = 0x0 + NFTA_OBJREF_IMM_TYPE = 0x1 + NFTA_OBJREF_IMM_NAME = 0x2 + NFTA_OBJREF_SET_SREG = 0x3 + NFTA_OBJREF_SET_NAME = 0x4 + NFTA_OBJREF_SET_ID = 0x5 + NFTA_GEN_UNSPEC = 0x0 + NFTA_GEN_ID = 0x1 + NFTA_GEN_PROC_PID = 0x2 + NFTA_GEN_PROC_NAME = 0x3 + NFTA_FIB_UNSPEC = 0x0 + NFTA_FIB_DREG = 0x1 + NFTA_FIB_RESULT = 0x2 + NFTA_FIB_FLAGS = 0x3 + NFT_FIB_RESULT_UNSPEC = 0x0 + NFT_FIB_RESULT_OIF = 0x1 + NFT_FIB_RESULT_OIFNAME = 0x2 + NFT_FIB_RESULT_ADDRTYPE = 0x3 + NFTA_FIB_F_SADDR = 0x1 + NFTA_FIB_F_DADDR = 0x2 + NFTA_FIB_F_MARK = 0x4 + NFTA_FIB_F_IIF = 0x8 + NFTA_FIB_F_OIF = 0x10 + NFTA_FIB_F_PRESENT = 0x20 + NFTA_CT_HELPER_UNSPEC = 0x0 + NFTA_CT_HELPER_NAME = 0x1 + NFTA_CT_HELPER_L3PROTO = 0x2 + NFTA_CT_HELPER_L4PROTO = 0x3 + NFTA_OBJ_UNSPEC = 0x0 + NFTA_OBJ_TABLE = 0x1 + NFTA_OBJ_NAME = 0x2 + NFTA_OBJ_TYPE = 0x3 + NFTA_OBJ_DATA = 0x4 + NFTA_OBJ_USE = 0x5 + NFTA_TRACE_UNSPEC = 0x0 + NFTA_TRACE_TABLE = 0x1 + NFTA_TRACE_CHAIN = 0x2 + NFTA_TRACE_RULE_HANDLE = 0x3 + NFTA_TRACE_TYPE = 0x4 + NFTA_TRACE_VERDICT = 0x5 + NFTA_TRACE_ID = 0x6 + NFTA_TRACE_LL_HEADER = 0x7 + NFTA_TRACE_NETWORK_HEADER = 0x8 + NFTA_TRACE_TRANSPORT_HEADER = 0x9 + NFTA_TRACE_IIF = 0xa + NFTA_TRACE_IIFTYPE = 0xb + NFTA_TRACE_OIF = 0xc + NFTA_TRACE_OIFTYPE = 0xd + NFTA_TRACE_MARK = 0xe + NFTA_TRACE_NFPROTO = 0xf + NFTA_TRACE_POLICY = 0x10 + NFTA_TRACE_PAD = 0x11 + NFT_TRACETYPE_UNSPEC = 0x0 + NFT_TRACETYPE_POLICY = 0x1 + NFT_TRACETYPE_RETURN = 0x2 + NFT_TRACETYPE_RULE = 0x3 + NFTA_NG_UNSPEC = 0x0 + NFTA_NG_DREG = 0x1 + NFTA_NG_MODULUS = 0x2 + NFTA_NG_TYPE = 0x3 + NFTA_NG_OFFSET = 0x4 + NFT_NG_INCREMENTAL = 0x0 + NFT_NG_RANDOM = 0x1 +) diff --git a/api/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go b/api/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go new file mode 100644 index 0000000..838135e --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go @@ -0,0 +1,1816 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mips64,linux + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Timex struct { + Modes uint32 + _ [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + _ [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + _ [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + _ [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint32 + Pad1 [3]uint32 + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint32 + Pad2 [3]uint32 + Size int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Blksize uint32 + Pad4 uint32 + Blocks int64 +} + +type StatxTimestamp struct { + Sec int64 + Nsec uint32 + _ int32 +} + +type Statx_t struct { + Mask uint32 + Blksize uint32 + Attributes uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Mode uint16 + _ [1]uint16 + Ino uint64 + Size uint64 + Blocks uint64 + Attributes_mask uint64 + Atime StatxTimestamp + Btime StatxTimestamp + Ctime StatxTimestamp + Mtime StatxTimestamp + Rdev_major uint32 + Rdev_minor uint32 + Dev_major uint32 + Dev_minor uint32 + _ [14]uint64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + _ [5]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + _ [4]byte + Start int64 + Len int64 + Pid int32 + _ [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrL2 struct { + Family uint16 + Psm uint16 + Bdaddr [6]uint8 + Cid uint16 + Bdaddr_type uint8 + _ [1]byte +} + +type RawSockaddrCAN struct { + Family uint16 + _ [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + _ [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + _ [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + _ [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrL2 = 0xe + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x10 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_NUM_VF = 0x15 + IFLA_VFINFO_LIST = 0x16 + IFLA_STATS64 = 0x17 + IFLA_VF_PORTS = 0x18 + IFLA_PORT_SELF = 0x19 + IFLA_AF_SPEC = 0x1a + IFLA_GROUP = 0x1b + IFLA_NET_NS_FD = 0x1c + IFLA_EXT_MASK = 0x1d + IFLA_PROMISCUITY = 0x1e + IFLA_NUM_TX_QUEUES = 0x1f + IFLA_NUM_RX_QUEUES = 0x20 + IFLA_CARRIER = 0x21 + IFLA_PHYS_PORT_ID = 0x22 + IFLA_CARRIER_CHANGES = 0x23 + IFLA_PHYS_SWITCH_ID = 0x24 + IFLA_LINK_NETNSID = 0x25 + IFLA_PHYS_PORT_NAME = 0x26 + IFLA_PROTO_DOWN = 0x27 + IFLA_GSO_MAX_SEGS = 0x28 + IFLA_GSO_MAX_SIZE = 0x29 + IFLA_PAD = 0x2a + IFLA_XDP = 0x2b + IFLA_EVENT = 0x2c + IFLA_NEW_NETNSID = 0x2d + IFLA_IF_NETNSID = 0x2e + IFLA_MAX = 0x31 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + _ uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + _ [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Regs [32]uint64 + Lo uint64 + Hi uint64 + Epc uint64 + Badvaddr uint64 + Status uint64 + Cause uint64 +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + _ [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + _ [0]int8 + _ [4]byte +} + +type Utsname struct { + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte +} + +type Ustat_t struct { + Tfree int32 + _ [4]byte + Tinode uint64 + Fname [6]int8 + Fpack [6]int8 + _ [4]byte +} + +type EpollEvent struct { + Events uint32 + Fd int32 + Pad int32 +} + +const ( + AT_EMPTY_PATH = 0x1000 + AT_FDCWD = -0x64 + AT_NO_AUTOMOUNT = 0x800 + AT_REMOVEDIR = 0x200 + + AT_STATX_SYNC_AS_STAT = 0x0 + AT_STATX_FORCE_SYNC = 0x2000 + AT_STATX_DONT_SYNC = 0x4000 + + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + Val [16]uint64 +} + +const RNDGETENTCNT = 0x40045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [23]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + _ [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + _ [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + _ [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + _ [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type CGroupStats struct { + Sleeping uint64 + Running uint64 + Stopped uint64 + Uninterruptible uint64 + Io_wait uint64 +} + +const ( + CGROUPSTATS_CMD_UNSPEC = 0x3 + CGROUPSTATS_CMD_GET = 0x4 + CGROUPSTATS_CMD_NEW = 0x5 + CGROUPSTATS_TYPE_UNSPEC = 0x0 + CGROUPSTATS_TYPE_CGROUP_STATS = 0x1 + CGROUPSTATS_CMD_ATTR_UNSPEC = 0x0 + CGROUPSTATS_CMD_ATTR_FD = 0x1 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) + +type cpuMask uint64 + +const ( + _CPU_SETSIZE = 0x400 + _NCPUBITS = 0x40 +) + +const ( + BDADDR_BREDR = 0x0 + BDADDR_LE_PUBLIC = 0x1 + BDADDR_LE_RANDOM = 0x2 +) + +type PerfEventAttr struct { + Type uint32 + Size uint32 + Config uint64 + Sample uint64 + Sample_type uint64 + Read_format uint64 + Bits uint64 + Wakeup uint32 + Bp_type uint32 + Ext1 uint64 + Ext2 uint64 + Branch_sample_type uint64 + Sample_regs_user uint64 + Sample_stack_user uint32 + Clockid int32 + Sample_regs_intr uint64 + Aux_watermark uint32 + _ uint32 +} + +type PerfEventMmapPage struct { + Version uint32 + Compat_version uint32 + Lock uint32 + Index uint32 + Offset int64 + Time_enabled uint64 + Time_running uint64 + Capabilities uint64 + Pmc_width uint16 + Time_shift uint16 + Time_mult uint32 + Time_offset uint64 + Time_zero uint64 + Size uint32 + _ [948]uint8 + Data_head uint64 + Data_tail uint64 + Data_offset uint64 + Data_size uint64 + Aux_head uint64 + Aux_tail uint64 + Aux_offset uint64 + Aux_size uint64 +} + +const ( + PerfBitDisabled uint64 = CBitFieldMaskBit0 + PerfBitInherit = CBitFieldMaskBit1 + PerfBitPinned = CBitFieldMaskBit2 + PerfBitExclusive = CBitFieldMaskBit3 + PerfBitExcludeUser = CBitFieldMaskBit4 + PerfBitExcludeKernel = CBitFieldMaskBit5 + PerfBitExcludeHv = CBitFieldMaskBit6 + PerfBitExcludeIdle = CBitFieldMaskBit7 + PerfBitMmap = CBitFieldMaskBit8 + PerfBitComm = CBitFieldMaskBit9 + PerfBitFreq = CBitFieldMaskBit10 + PerfBitInheritStat = CBitFieldMaskBit11 + PerfBitEnableOnExec = CBitFieldMaskBit12 + PerfBitTask = CBitFieldMaskBit13 + PerfBitWatermark = CBitFieldMaskBit14 + PerfBitPreciseIPBit1 = CBitFieldMaskBit15 + PerfBitPreciseIPBit2 = CBitFieldMaskBit16 + PerfBitMmapData = CBitFieldMaskBit17 + PerfBitSampleIDAll = CBitFieldMaskBit18 + PerfBitExcludeHost = CBitFieldMaskBit19 + PerfBitExcludeGuest = CBitFieldMaskBit20 + PerfBitExcludeCallchainKernel = CBitFieldMaskBit21 + PerfBitExcludeCallchainUser = CBitFieldMaskBit22 + PerfBitMmap2 = CBitFieldMaskBit23 + PerfBitCommExec = CBitFieldMaskBit24 + PerfBitUseClockID = CBitFieldMaskBit25 + PerfBitContextSwitch = CBitFieldMaskBit26 +) + +const ( + PERF_TYPE_HARDWARE = 0x0 + PERF_TYPE_SOFTWARE = 0x1 + PERF_TYPE_TRACEPOINT = 0x2 + PERF_TYPE_HW_CACHE = 0x3 + PERF_TYPE_RAW = 0x4 + PERF_TYPE_BREAKPOINT = 0x5 + + PERF_COUNT_HW_CPU_CYCLES = 0x0 + PERF_COUNT_HW_INSTRUCTIONS = 0x1 + PERF_COUNT_HW_CACHE_REFERENCES = 0x2 + PERF_COUNT_HW_CACHE_MISSES = 0x3 + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 0x4 + PERF_COUNT_HW_BRANCH_MISSES = 0x5 + PERF_COUNT_HW_BUS_CYCLES = 0x6 + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7 + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 0x8 + PERF_COUNT_HW_REF_CPU_CYCLES = 0x9 + + PERF_COUNT_HW_CACHE_L1D = 0x0 + PERF_COUNT_HW_CACHE_L1I = 0x1 + PERF_COUNT_HW_CACHE_LL = 0x2 + PERF_COUNT_HW_CACHE_DTLB = 0x3 + PERF_COUNT_HW_CACHE_ITLB = 0x4 + PERF_COUNT_HW_CACHE_BPU = 0x5 + PERF_COUNT_HW_CACHE_NODE = 0x6 + + PERF_COUNT_HW_CACHE_OP_READ = 0x0 + PERF_COUNT_HW_CACHE_OP_WRITE = 0x1 + PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2 + + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0 + PERF_COUNT_HW_CACHE_RESULT_MISS = 0x1 + + PERF_COUNT_SW_CPU_CLOCK = 0x0 + PERF_COUNT_SW_TASK_CLOCK = 0x1 + PERF_COUNT_SW_PAGE_FAULTS = 0x2 + PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3 + PERF_COUNT_SW_CPU_MIGRATIONS = 0x4 + PERF_COUNT_SW_PAGE_FAULTS_MIN = 0x5 + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 0x6 + PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 + PERF_COUNT_SW_EMULATION_FAULTS = 0x8 + PERF_COUNT_SW_DUMMY = 0x9 + + PERF_SAMPLE_IP = 0x1 + PERF_SAMPLE_TID = 0x2 + PERF_SAMPLE_TIME = 0x4 + PERF_SAMPLE_ADDR = 0x8 + PERF_SAMPLE_READ = 0x10 + PERF_SAMPLE_CALLCHAIN = 0x20 + PERF_SAMPLE_ID = 0x40 + PERF_SAMPLE_CPU = 0x80 + PERF_SAMPLE_PERIOD = 0x100 + PERF_SAMPLE_STREAM_ID = 0x200 + PERF_SAMPLE_RAW = 0x400 + PERF_SAMPLE_BRANCH_STACK = 0x800 + + PERF_SAMPLE_BRANCH_USER = 0x1 + PERF_SAMPLE_BRANCH_KERNEL = 0x2 + PERF_SAMPLE_BRANCH_HV = 0x4 + PERF_SAMPLE_BRANCH_ANY = 0x8 + PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 + PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 + PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + + PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 + PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 + PERF_FORMAT_ID = 0x4 + PERF_FORMAT_GROUP = 0x8 + + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + + PERF_CONTEXT_HV = -0x20 + PERF_CONTEXT_KERNEL = -0x80 + PERF_CONTEXT_USER = -0x200 + + PERF_CONTEXT_GUEST = -0x800 + PERF_CONTEXT_GUEST_KERNEL = -0x880 + PERF_CONTEXT_GUEST_USER = -0xa00 + + PERF_FLAG_FD_NO_GROUP = 0x1 + PERF_FLAG_FD_OUTPUT = 0x2 + PERF_FLAG_PID_CGROUP = 0x4 +) + +const ( + CBitFieldMaskBit0 = 0x8000000000000000 + CBitFieldMaskBit1 = 0x4000000000000000 + CBitFieldMaskBit2 = 0x2000000000000000 + CBitFieldMaskBit3 = 0x1000000000000000 + CBitFieldMaskBit4 = 0x800000000000000 + CBitFieldMaskBit5 = 0x400000000000000 + CBitFieldMaskBit6 = 0x200000000000000 + CBitFieldMaskBit7 = 0x100000000000000 + CBitFieldMaskBit8 = 0x80000000000000 + CBitFieldMaskBit9 = 0x40000000000000 + CBitFieldMaskBit10 = 0x20000000000000 + CBitFieldMaskBit11 = 0x10000000000000 + CBitFieldMaskBit12 = 0x8000000000000 + CBitFieldMaskBit13 = 0x4000000000000 + CBitFieldMaskBit14 = 0x2000000000000 + CBitFieldMaskBit15 = 0x1000000000000 + CBitFieldMaskBit16 = 0x800000000000 + CBitFieldMaskBit17 = 0x400000000000 + CBitFieldMaskBit18 = 0x200000000000 + CBitFieldMaskBit19 = 0x100000000000 + CBitFieldMaskBit20 = 0x80000000000 + CBitFieldMaskBit21 = 0x40000000000 + CBitFieldMaskBit22 = 0x20000000000 + CBitFieldMaskBit23 = 0x10000000000 + CBitFieldMaskBit24 = 0x8000000000 + CBitFieldMaskBit25 = 0x4000000000 + CBitFieldMaskBit26 = 0x2000000000 + CBitFieldMaskBit27 = 0x1000000000 + CBitFieldMaskBit28 = 0x800000000 + CBitFieldMaskBit29 = 0x400000000 + CBitFieldMaskBit30 = 0x200000000 + CBitFieldMaskBit31 = 0x100000000 + CBitFieldMaskBit32 = 0x80000000 + CBitFieldMaskBit33 = 0x40000000 + CBitFieldMaskBit34 = 0x20000000 + CBitFieldMaskBit35 = 0x10000000 + CBitFieldMaskBit36 = 0x8000000 + CBitFieldMaskBit37 = 0x4000000 + CBitFieldMaskBit38 = 0x2000000 + CBitFieldMaskBit39 = 0x1000000 + CBitFieldMaskBit40 = 0x800000 + CBitFieldMaskBit41 = 0x400000 + CBitFieldMaskBit42 = 0x200000 + CBitFieldMaskBit43 = 0x100000 + CBitFieldMaskBit44 = 0x80000 + CBitFieldMaskBit45 = 0x40000 + CBitFieldMaskBit46 = 0x20000 + CBitFieldMaskBit47 = 0x10000 + CBitFieldMaskBit48 = 0x8000 + CBitFieldMaskBit49 = 0x4000 + CBitFieldMaskBit50 = 0x2000 + CBitFieldMaskBit51 = 0x1000 + CBitFieldMaskBit52 = 0x800 + CBitFieldMaskBit53 = 0x400 + CBitFieldMaskBit54 = 0x200 + CBitFieldMaskBit55 = 0x100 + CBitFieldMaskBit56 = 0x80 + CBitFieldMaskBit57 = 0x40 + CBitFieldMaskBit58 = 0x20 + CBitFieldMaskBit59 = 0x10 + CBitFieldMaskBit60 = 0x8 + CBitFieldMaskBit61 = 0x4 + CBitFieldMaskBit62 = 0x2 + CBitFieldMaskBit63 = 0x1 +) + +type SockaddrStorage struct { + Family uint16 + _ [118]int8 + _ uint64 +} + +type TCPMD5Sig struct { + Addr SockaddrStorage + Flags uint8 + Prefixlen uint8 + Keylen uint16 + _ uint32 + Key [80]uint8 +} + +type HDDriveCmdHdr struct { + Command uint8 + Number uint8 + Feature uint8 + Count uint8 +} + +type HDGeometry struct { + Heads uint8 + Sectors uint8 + Cylinders uint16 + _ [4]byte + Start uint64 +} + +type HDDriveID struct { + Config uint16 + Cyls uint16 + Reserved2 uint16 + Heads uint16 + Track_bytes uint16 + Sector_bytes uint16 + Sectors uint16 + Vendor0 uint16 + Vendor1 uint16 + Vendor2 uint16 + Serial_no [20]uint8 + Buf_type uint16 + Buf_size uint16 + Ecc_bytes uint16 + Fw_rev [8]uint8 + Model [40]uint8 + Max_multsect uint8 + Vendor3 uint8 + Dword_io uint16 + Vendor4 uint8 + Capability uint8 + Reserved50 uint16 + Vendor5 uint8 + TPIO uint8 + Vendor6 uint8 + TDMA uint8 + Field_valid uint16 + Cur_cyls uint16 + Cur_heads uint16 + Cur_sectors uint16 + Cur_capacity0 uint16 + Cur_capacity1 uint16 + Multsect uint8 + Multsect_valid uint8 + Lba_capacity uint32 + Dma_1word uint16 + Dma_mword uint16 + Eide_pio_modes uint16 + Eide_dma_min uint16 + Eide_dma_time uint16 + Eide_pio uint16 + Eide_pio_iordy uint16 + Words69_70 [2]uint16 + Words71_74 [4]uint16 + Queue_depth uint16 + Words76_79 [4]uint16 + Major_rev_num uint16 + Minor_rev_num uint16 + Command_set_1 uint16 + Command_set_2 uint16 + Cfsse uint16 + Cfs_enable_1 uint16 + Cfs_enable_2 uint16 + Csf_default uint16 + Dma_ultra uint16 + Trseuc uint16 + TrsEuc uint16 + CurAPMvalues uint16 + Mprc uint16 + Hw_config uint16 + Acoustic uint16 + Msrqs uint16 + Sxfert uint16 + Sal uint16 + Spg uint32 + Lba_capacity_2 uint64 + Words104_125 [22]uint16 + Last_lun uint16 + Word127 uint16 + Dlf uint16 + Csfo uint16 + Words130_155 [26]uint16 + Word156 uint16 + Words157_159 [3]uint16 + Cfa_power uint16 + Words161_175 [15]uint16 + Words176_205 [30]uint16 + Words206_254 [49]uint16 + Integrity_word uint16 +} + +type Statfs_t struct { + Type int64 + Bsize int64 + Frsize int64 + Blocks uint64 + Bfree uint64 + Files uint64 + Ffree uint64 + Bavail uint64 + Fsid Fsid + Namelen int64 + Flags int64 + Spare [5]int64 +} + +const ( + ST_MANDLOCK = 0x40 + ST_NOATIME = 0x400 + ST_NODEV = 0x4 + ST_NODIRATIME = 0x800 + ST_NOEXEC = 0x8 + ST_NOSUID = 0x2 + ST_RDONLY = 0x1 + ST_RELATIME = 0x1000 + ST_SYNCHRONOUS = 0x10 +) + +type TpacketHdr struct { + Status uint64 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Usec uint32 + _ [4]byte +} + +type Tpacket2Hdr struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Nsec uint32 + Vlan_tci uint16 + Vlan_tpid uint16 + _ [4]uint8 +} + +type Tpacket3Hdr struct { + Next_offset uint32 + Sec uint32 + Nsec uint32 + Snaplen uint32 + Len uint32 + Status uint32 + Mac uint16 + Net uint16 + Hv1 TpacketHdrVariant1 + _ [8]uint8 +} + +type TpacketHdrVariant1 struct { + Rxhash uint32 + Vlan_tci uint32 + Vlan_tpid uint16 + _ uint16 +} + +type TpacketBlockDesc struct { + Version uint32 + To_priv uint32 + Hdr [40]byte +} + +type TpacketReq struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 +} + +type TpacketReq3 struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 + Retire_blk_tov uint32 + Sizeof_priv uint32 + Feature_req_word uint32 +} + +type TpacketStats struct { + Packets uint32 + Drops uint32 +} + +type TpacketStatsV3 struct { + Packets uint32 + Drops uint32 + Freeze_q_cnt uint32 +} + +type TpacketAuxdata struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Vlan_tci uint16 + Vlan_tpid uint16 +} + +const ( + TPACKET_V1 = 0x0 + TPACKET_V2 = 0x1 + TPACKET_V3 = 0x2 +) + +const ( + SizeofTpacketHdr = 0x20 + SizeofTpacket2Hdr = 0x20 + SizeofTpacket3Hdr = 0x30 +) + +const ( + NF_INET_PRE_ROUTING = 0x0 + NF_INET_LOCAL_IN = 0x1 + NF_INET_FORWARD = 0x2 + NF_INET_LOCAL_OUT = 0x3 + NF_INET_POST_ROUTING = 0x4 + NF_INET_NUMHOOKS = 0x5 +) + +const ( + NF_NETDEV_INGRESS = 0x0 + NF_NETDEV_NUMHOOKS = 0x1 +) + +const ( + NFPROTO_UNSPEC = 0x0 + NFPROTO_INET = 0x1 + NFPROTO_IPV4 = 0x2 + NFPROTO_ARP = 0x3 + NFPROTO_NETDEV = 0x5 + NFPROTO_BRIDGE = 0x7 + NFPROTO_IPV6 = 0xa + NFPROTO_DECNET = 0xc + NFPROTO_NUMPROTO = 0xd +) + +type Nfgenmsg struct { + Nfgen_family uint8 + Version uint8 + Res_id uint16 +} + +const ( + NFNL_BATCH_UNSPEC = 0x0 + NFNL_BATCH_GENID = 0x1 +) + +const ( + NFT_REG_VERDICT = 0x0 + NFT_REG_1 = 0x1 + NFT_REG_2 = 0x2 + NFT_REG_3 = 0x3 + NFT_REG_4 = 0x4 + NFT_REG32_00 = 0x8 + NFT_REG32_01 = 0x9 + NFT_REG32_02 = 0xa + NFT_REG32_03 = 0xb + NFT_REG32_04 = 0xc + NFT_REG32_05 = 0xd + NFT_REG32_06 = 0xe + NFT_REG32_07 = 0xf + NFT_REG32_08 = 0x10 + NFT_REG32_09 = 0x11 + NFT_REG32_10 = 0x12 + NFT_REG32_11 = 0x13 + NFT_REG32_12 = 0x14 + NFT_REG32_13 = 0x15 + NFT_REG32_14 = 0x16 + NFT_REG32_15 = 0x17 + NFT_CONTINUE = -0x1 + NFT_BREAK = -0x2 + NFT_JUMP = -0x3 + NFT_GOTO = -0x4 + NFT_RETURN = -0x5 + NFT_MSG_NEWTABLE = 0x0 + NFT_MSG_GETTABLE = 0x1 + NFT_MSG_DELTABLE = 0x2 + NFT_MSG_NEWCHAIN = 0x3 + NFT_MSG_GETCHAIN = 0x4 + NFT_MSG_DELCHAIN = 0x5 + NFT_MSG_NEWRULE = 0x6 + NFT_MSG_GETRULE = 0x7 + NFT_MSG_DELRULE = 0x8 + NFT_MSG_NEWSET = 0x9 + NFT_MSG_GETSET = 0xa + NFT_MSG_DELSET = 0xb + NFT_MSG_NEWSETELEM = 0xc + NFT_MSG_GETSETELEM = 0xd + NFT_MSG_DELSETELEM = 0xe + NFT_MSG_NEWGEN = 0xf + NFT_MSG_GETGEN = 0x10 + NFT_MSG_TRACE = 0x11 + NFT_MSG_NEWOBJ = 0x12 + NFT_MSG_GETOBJ = 0x13 + NFT_MSG_DELOBJ = 0x14 + NFT_MSG_GETOBJ_RESET = 0x15 + NFT_MSG_MAX = 0x19 + NFTA_LIST_UNPEC = 0x0 + NFTA_LIST_ELEM = 0x1 + NFTA_HOOK_UNSPEC = 0x0 + NFTA_HOOK_HOOKNUM = 0x1 + NFTA_HOOK_PRIORITY = 0x2 + NFTA_HOOK_DEV = 0x3 + NFT_TABLE_F_DORMANT = 0x1 + NFTA_TABLE_UNSPEC = 0x0 + NFTA_TABLE_NAME = 0x1 + NFTA_TABLE_FLAGS = 0x2 + NFTA_TABLE_USE = 0x3 + NFTA_CHAIN_UNSPEC = 0x0 + NFTA_CHAIN_TABLE = 0x1 + NFTA_CHAIN_HANDLE = 0x2 + NFTA_CHAIN_NAME = 0x3 + NFTA_CHAIN_HOOK = 0x4 + NFTA_CHAIN_POLICY = 0x5 + NFTA_CHAIN_USE = 0x6 + NFTA_CHAIN_TYPE = 0x7 + NFTA_CHAIN_COUNTERS = 0x8 + NFTA_CHAIN_PAD = 0x9 + NFTA_RULE_UNSPEC = 0x0 + NFTA_RULE_TABLE = 0x1 + NFTA_RULE_CHAIN = 0x2 + NFTA_RULE_HANDLE = 0x3 + NFTA_RULE_EXPRESSIONS = 0x4 + NFTA_RULE_COMPAT = 0x5 + NFTA_RULE_POSITION = 0x6 + NFTA_RULE_USERDATA = 0x7 + NFTA_RULE_PAD = 0x8 + NFTA_RULE_ID = 0x9 + NFT_RULE_COMPAT_F_INV = 0x2 + NFT_RULE_COMPAT_F_MASK = 0x2 + NFTA_RULE_COMPAT_UNSPEC = 0x0 + NFTA_RULE_COMPAT_PROTO = 0x1 + NFTA_RULE_COMPAT_FLAGS = 0x2 + NFT_SET_ANONYMOUS = 0x1 + NFT_SET_CONSTANT = 0x2 + NFT_SET_INTERVAL = 0x4 + NFT_SET_MAP = 0x8 + NFT_SET_TIMEOUT = 0x10 + NFT_SET_EVAL = 0x20 + NFT_SET_OBJECT = 0x40 + NFT_SET_POL_PERFORMANCE = 0x0 + NFT_SET_POL_MEMORY = 0x1 + NFTA_SET_DESC_UNSPEC = 0x0 + NFTA_SET_DESC_SIZE = 0x1 + NFTA_SET_UNSPEC = 0x0 + NFTA_SET_TABLE = 0x1 + NFTA_SET_NAME = 0x2 + NFTA_SET_FLAGS = 0x3 + NFTA_SET_KEY_TYPE = 0x4 + NFTA_SET_KEY_LEN = 0x5 + NFTA_SET_DATA_TYPE = 0x6 + NFTA_SET_DATA_LEN = 0x7 + NFTA_SET_POLICY = 0x8 + NFTA_SET_DESC = 0x9 + NFTA_SET_ID = 0xa + NFTA_SET_TIMEOUT = 0xb + NFTA_SET_GC_INTERVAL = 0xc + NFTA_SET_USERDATA = 0xd + NFTA_SET_PAD = 0xe + NFTA_SET_OBJ_TYPE = 0xf + NFT_SET_ELEM_INTERVAL_END = 0x1 + NFTA_SET_ELEM_UNSPEC = 0x0 + NFTA_SET_ELEM_KEY = 0x1 + NFTA_SET_ELEM_DATA = 0x2 + NFTA_SET_ELEM_FLAGS = 0x3 + NFTA_SET_ELEM_TIMEOUT = 0x4 + NFTA_SET_ELEM_EXPIRATION = 0x5 + NFTA_SET_ELEM_USERDATA = 0x6 + NFTA_SET_ELEM_EXPR = 0x7 + NFTA_SET_ELEM_PAD = 0x8 + NFTA_SET_ELEM_OBJREF = 0x9 + NFTA_SET_ELEM_LIST_UNSPEC = 0x0 + NFTA_SET_ELEM_LIST_TABLE = 0x1 + NFTA_SET_ELEM_LIST_SET = 0x2 + NFTA_SET_ELEM_LIST_ELEMENTS = 0x3 + NFTA_SET_ELEM_LIST_SET_ID = 0x4 + NFT_DATA_VALUE = 0x0 + NFT_DATA_VERDICT = 0xffffff00 + NFTA_DATA_UNSPEC = 0x0 + NFTA_DATA_VALUE = 0x1 + NFTA_DATA_VERDICT = 0x2 + NFTA_VERDICT_UNSPEC = 0x0 + NFTA_VERDICT_CODE = 0x1 + NFTA_VERDICT_CHAIN = 0x2 + NFTA_EXPR_UNSPEC = 0x0 + NFTA_EXPR_NAME = 0x1 + NFTA_EXPR_DATA = 0x2 + NFTA_IMMEDIATE_UNSPEC = 0x0 + NFTA_IMMEDIATE_DREG = 0x1 + NFTA_IMMEDIATE_DATA = 0x2 + NFTA_BITWISE_UNSPEC = 0x0 + NFTA_BITWISE_SREG = 0x1 + NFTA_BITWISE_DREG = 0x2 + NFTA_BITWISE_LEN = 0x3 + NFTA_BITWISE_MASK = 0x4 + NFTA_BITWISE_XOR = 0x5 + NFT_BYTEORDER_NTOH = 0x0 + NFT_BYTEORDER_HTON = 0x1 + NFTA_BYTEORDER_UNSPEC = 0x0 + NFTA_BYTEORDER_SREG = 0x1 + NFTA_BYTEORDER_DREG = 0x2 + NFTA_BYTEORDER_OP = 0x3 + NFTA_BYTEORDER_LEN = 0x4 + NFTA_BYTEORDER_SIZE = 0x5 + NFT_CMP_EQ = 0x0 + NFT_CMP_NEQ = 0x1 + NFT_CMP_LT = 0x2 + NFT_CMP_LTE = 0x3 + NFT_CMP_GT = 0x4 + NFT_CMP_GTE = 0x5 + NFTA_CMP_UNSPEC = 0x0 + NFTA_CMP_SREG = 0x1 + NFTA_CMP_OP = 0x2 + NFTA_CMP_DATA = 0x3 + NFT_RANGE_EQ = 0x0 + NFT_RANGE_NEQ = 0x1 + NFTA_RANGE_UNSPEC = 0x0 + NFTA_RANGE_SREG = 0x1 + NFTA_RANGE_OP = 0x2 + NFTA_RANGE_FROM_DATA = 0x3 + NFTA_RANGE_TO_DATA = 0x4 + NFT_LOOKUP_F_INV = 0x1 + NFTA_LOOKUP_UNSPEC = 0x0 + NFTA_LOOKUP_SET = 0x1 + NFTA_LOOKUP_SREG = 0x2 + NFTA_LOOKUP_DREG = 0x3 + NFTA_LOOKUP_SET_ID = 0x4 + NFTA_LOOKUP_FLAGS = 0x5 + NFT_DYNSET_OP_ADD = 0x0 + NFT_DYNSET_OP_UPDATE = 0x1 + NFT_DYNSET_F_INV = 0x1 + NFTA_DYNSET_UNSPEC = 0x0 + NFTA_DYNSET_SET_NAME = 0x1 + NFTA_DYNSET_SET_ID = 0x2 + NFTA_DYNSET_OP = 0x3 + NFTA_DYNSET_SREG_KEY = 0x4 + NFTA_DYNSET_SREG_DATA = 0x5 + NFTA_DYNSET_TIMEOUT = 0x6 + NFTA_DYNSET_EXPR = 0x7 + NFTA_DYNSET_PAD = 0x8 + NFTA_DYNSET_FLAGS = 0x9 + NFT_PAYLOAD_LL_HEADER = 0x0 + NFT_PAYLOAD_NETWORK_HEADER = 0x1 + NFT_PAYLOAD_TRANSPORT_HEADER = 0x2 + NFT_PAYLOAD_CSUM_NONE = 0x0 + NFT_PAYLOAD_CSUM_INET = 0x1 + NFT_PAYLOAD_L4CSUM_PSEUDOHDR = 0x1 + NFTA_PAYLOAD_UNSPEC = 0x0 + NFTA_PAYLOAD_DREG = 0x1 + NFTA_PAYLOAD_BASE = 0x2 + NFTA_PAYLOAD_OFFSET = 0x3 + NFTA_PAYLOAD_LEN = 0x4 + NFTA_PAYLOAD_SREG = 0x5 + NFTA_PAYLOAD_CSUM_TYPE = 0x6 + NFTA_PAYLOAD_CSUM_OFFSET = 0x7 + NFTA_PAYLOAD_CSUM_FLAGS = 0x8 + NFT_EXTHDR_F_PRESENT = 0x1 + NFT_EXTHDR_OP_IPV6 = 0x0 + NFT_EXTHDR_OP_TCPOPT = 0x1 + NFTA_EXTHDR_UNSPEC = 0x0 + NFTA_EXTHDR_DREG = 0x1 + NFTA_EXTHDR_TYPE = 0x2 + NFTA_EXTHDR_OFFSET = 0x3 + NFTA_EXTHDR_LEN = 0x4 + NFTA_EXTHDR_FLAGS = 0x5 + NFTA_EXTHDR_OP = 0x6 + NFTA_EXTHDR_SREG = 0x7 + NFT_META_LEN = 0x0 + NFT_META_PROTOCOL = 0x1 + NFT_META_PRIORITY = 0x2 + NFT_META_MARK = 0x3 + NFT_META_IIF = 0x4 + NFT_META_OIF = 0x5 + NFT_META_IIFNAME = 0x6 + NFT_META_OIFNAME = 0x7 + NFT_META_IIFTYPE = 0x8 + NFT_META_OIFTYPE = 0x9 + NFT_META_SKUID = 0xa + NFT_META_SKGID = 0xb + NFT_META_NFTRACE = 0xc + NFT_META_RTCLASSID = 0xd + NFT_META_SECMARK = 0xe + NFT_META_NFPROTO = 0xf + NFT_META_L4PROTO = 0x10 + NFT_META_BRI_IIFNAME = 0x11 + NFT_META_BRI_OIFNAME = 0x12 + NFT_META_PKTTYPE = 0x13 + NFT_META_CPU = 0x14 + NFT_META_IIFGROUP = 0x15 + NFT_META_OIFGROUP = 0x16 + NFT_META_CGROUP = 0x17 + NFT_META_PRANDOM = 0x18 + NFT_RT_CLASSID = 0x0 + NFT_RT_NEXTHOP4 = 0x1 + NFT_RT_NEXTHOP6 = 0x2 + NFT_RT_TCPMSS = 0x3 + NFT_HASH_JENKINS = 0x0 + NFT_HASH_SYM = 0x1 + NFTA_HASH_UNSPEC = 0x0 + NFTA_HASH_SREG = 0x1 + NFTA_HASH_DREG = 0x2 + NFTA_HASH_LEN = 0x3 + NFTA_HASH_MODULUS = 0x4 + NFTA_HASH_SEED = 0x5 + NFTA_HASH_OFFSET = 0x6 + NFTA_HASH_TYPE = 0x7 + NFTA_META_UNSPEC = 0x0 + NFTA_META_DREG = 0x1 + NFTA_META_KEY = 0x2 + NFTA_META_SREG = 0x3 + NFTA_RT_UNSPEC = 0x0 + NFTA_RT_DREG = 0x1 + NFTA_RT_KEY = 0x2 + NFT_CT_STATE = 0x0 + NFT_CT_DIRECTION = 0x1 + NFT_CT_STATUS = 0x2 + NFT_CT_MARK = 0x3 + NFT_CT_SECMARK = 0x4 + NFT_CT_EXPIRATION = 0x5 + NFT_CT_HELPER = 0x6 + NFT_CT_L3PROTOCOL = 0x7 + NFT_CT_SRC = 0x8 + NFT_CT_DST = 0x9 + NFT_CT_PROTOCOL = 0xa + NFT_CT_PROTO_SRC = 0xb + NFT_CT_PROTO_DST = 0xc + NFT_CT_LABELS = 0xd + NFT_CT_PKTS = 0xe + NFT_CT_BYTES = 0xf + NFT_CT_AVGPKT = 0x10 + NFT_CT_ZONE = 0x11 + NFT_CT_EVENTMASK = 0x12 + NFTA_CT_UNSPEC = 0x0 + NFTA_CT_DREG = 0x1 + NFTA_CT_KEY = 0x2 + NFTA_CT_DIRECTION = 0x3 + NFTA_CT_SREG = 0x4 + NFT_LIMIT_PKTS = 0x0 + NFT_LIMIT_PKT_BYTES = 0x1 + NFT_LIMIT_F_INV = 0x1 + NFTA_LIMIT_UNSPEC = 0x0 + NFTA_LIMIT_RATE = 0x1 + NFTA_LIMIT_UNIT = 0x2 + NFTA_LIMIT_BURST = 0x3 + NFTA_LIMIT_TYPE = 0x4 + NFTA_LIMIT_FLAGS = 0x5 + NFTA_LIMIT_PAD = 0x6 + NFTA_COUNTER_UNSPEC = 0x0 + NFTA_COUNTER_BYTES = 0x1 + NFTA_COUNTER_PACKETS = 0x2 + NFTA_COUNTER_PAD = 0x3 + NFTA_LOG_UNSPEC = 0x0 + NFTA_LOG_GROUP = 0x1 + NFTA_LOG_PREFIX = 0x2 + NFTA_LOG_SNAPLEN = 0x3 + NFTA_LOG_QTHRESHOLD = 0x4 + NFTA_LOG_LEVEL = 0x5 + NFTA_LOG_FLAGS = 0x6 + NFTA_QUEUE_UNSPEC = 0x0 + NFTA_QUEUE_NUM = 0x1 + NFTA_QUEUE_TOTAL = 0x2 + NFTA_QUEUE_FLAGS = 0x3 + NFTA_QUEUE_SREG_QNUM = 0x4 + NFT_QUOTA_F_INV = 0x1 + NFT_QUOTA_F_DEPLETED = 0x2 + NFTA_QUOTA_UNSPEC = 0x0 + NFTA_QUOTA_BYTES = 0x1 + NFTA_QUOTA_FLAGS = 0x2 + NFTA_QUOTA_PAD = 0x3 + NFTA_QUOTA_CONSUMED = 0x4 + NFT_REJECT_ICMP_UNREACH = 0x0 + NFT_REJECT_TCP_RST = 0x1 + NFT_REJECT_ICMPX_UNREACH = 0x2 + NFT_REJECT_ICMPX_NO_ROUTE = 0x0 + NFT_REJECT_ICMPX_PORT_UNREACH = 0x1 + NFT_REJECT_ICMPX_HOST_UNREACH = 0x2 + NFT_REJECT_ICMPX_ADMIN_PROHIBITED = 0x3 + NFTA_REJECT_UNSPEC = 0x0 + NFTA_REJECT_TYPE = 0x1 + NFTA_REJECT_ICMP_CODE = 0x2 + NFT_NAT_SNAT = 0x0 + NFT_NAT_DNAT = 0x1 + NFTA_NAT_UNSPEC = 0x0 + NFTA_NAT_TYPE = 0x1 + NFTA_NAT_FAMILY = 0x2 + NFTA_NAT_REG_ADDR_MIN = 0x3 + NFTA_NAT_REG_ADDR_MAX = 0x4 + NFTA_NAT_REG_PROTO_MIN = 0x5 + NFTA_NAT_REG_PROTO_MAX = 0x6 + NFTA_NAT_FLAGS = 0x7 + NFTA_MASQ_UNSPEC = 0x0 + NFTA_MASQ_FLAGS = 0x1 + NFTA_MASQ_REG_PROTO_MIN = 0x2 + NFTA_MASQ_REG_PROTO_MAX = 0x3 + NFTA_REDIR_UNSPEC = 0x0 + NFTA_REDIR_REG_PROTO_MIN = 0x1 + NFTA_REDIR_REG_PROTO_MAX = 0x2 + NFTA_REDIR_FLAGS = 0x3 + NFTA_DUP_UNSPEC = 0x0 + NFTA_DUP_SREG_ADDR = 0x1 + NFTA_DUP_SREG_DEV = 0x2 + NFTA_FWD_UNSPEC = 0x0 + NFTA_FWD_SREG_DEV = 0x1 + NFTA_OBJREF_UNSPEC = 0x0 + NFTA_OBJREF_IMM_TYPE = 0x1 + NFTA_OBJREF_IMM_NAME = 0x2 + NFTA_OBJREF_SET_SREG = 0x3 + NFTA_OBJREF_SET_NAME = 0x4 + NFTA_OBJREF_SET_ID = 0x5 + NFTA_GEN_UNSPEC = 0x0 + NFTA_GEN_ID = 0x1 + NFTA_GEN_PROC_PID = 0x2 + NFTA_GEN_PROC_NAME = 0x3 + NFTA_FIB_UNSPEC = 0x0 + NFTA_FIB_DREG = 0x1 + NFTA_FIB_RESULT = 0x2 + NFTA_FIB_FLAGS = 0x3 + NFT_FIB_RESULT_UNSPEC = 0x0 + NFT_FIB_RESULT_OIF = 0x1 + NFT_FIB_RESULT_OIFNAME = 0x2 + NFT_FIB_RESULT_ADDRTYPE = 0x3 + NFTA_FIB_F_SADDR = 0x1 + NFTA_FIB_F_DADDR = 0x2 + NFTA_FIB_F_MARK = 0x4 + NFTA_FIB_F_IIF = 0x8 + NFTA_FIB_F_OIF = 0x10 + NFTA_FIB_F_PRESENT = 0x20 + NFTA_CT_HELPER_UNSPEC = 0x0 + NFTA_CT_HELPER_NAME = 0x1 + NFTA_CT_HELPER_L3PROTO = 0x2 + NFTA_CT_HELPER_L4PROTO = 0x3 + NFTA_OBJ_UNSPEC = 0x0 + NFTA_OBJ_TABLE = 0x1 + NFTA_OBJ_NAME = 0x2 + NFTA_OBJ_TYPE = 0x3 + NFTA_OBJ_DATA = 0x4 + NFTA_OBJ_USE = 0x5 + NFTA_TRACE_UNSPEC = 0x0 + NFTA_TRACE_TABLE = 0x1 + NFTA_TRACE_CHAIN = 0x2 + NFTA_TRACE_RULE_HANDLE = 0x3 + NFTA_TRACE_TYPE = 0x4 + NFTA_TRACE_VERDICT = 0x5 + NFTA_TRACE_ID = 0x6 + NFTA_TRACE_LL_HEADER = 0x7 + NFTA_TRACE_NETWORK_HEADER = 0x8 + NFTA_TRACE_TRANSPORT_HEADER = 0x9 + NFTA_TRACE_IIF = 0xa + NFTA_TRACE_IIFTYPE = 0xb + NFTA_TRACE_OIF = 0xc + NFTA_TRACE_OIFTYPE = 0xd + NFTA_TRACE_MARK = 0xe + NFTA_TRACE_NFPROTO = 0xf + NFTA_TRACE_POLICY = 0x10 + NFTA_TRACE_PAD = 0x11 + NFT_TRACETYPE_UNSPEC = 0x0 + NFT_TRACETYPE_POLICY = 0x1 + NFT_TRACETYPE_RETURN = 0x2 + NFT_TRACETYPE_RULE = 0x3 + NFTA_NG_UNSPEC = 0x0 + NFTA_NG_DREG = 0x1 + NFTA_NG_MODULUS = 0x2 + NFTA_NG_TYPE = 0x3 + NFTA_NG_OFFSET = 0x4 + NFT_NG_INCREMENTAL = 0x0 + NFT_NG_RANDOM = 0x1 +) diff --git a/api/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go b/api/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go new file mode 100644 index 0000000..a9d0131 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go @@ -0,0 +1,1816 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mips64le,linux + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Timex struct { + Modes uint32 + _ [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + _ [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + _ [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + _ [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint32 + Pad1 [3]uint32 + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint32 + Pad2 [3]uint32 + Size int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Blksize uint32 + Pad4 uint32 + Blocks int64 +} + +type StatxTimestamp struct { + Sec int64 + Nsec uint32 + _ int32 +} + +type Statx_t struct { + Mask uint32 + Blksize uint32 + Attributes uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Mode uint16 + _ [1]uint16 + Ino uint64 + Size uint64 + Blocks uint64 + Attributes_mask uint64 + Atime StatxTimestamp + Btime StatxTimestamp + Ctime StatxTimestamp + Mtime StatxTimestamp + Rdev_major uint32 + Rdev_minor uint32 + Dev_major uint32 + Dev_minor uint32 + _ [14]uint64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + _ [5]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + _ [4]byte + Start int64 + Len int64 + Pid int32 + _ [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrL2 struct { + Family uint16 + Psm uint16 + Bdaddr [6]uint8 + Cid uint16 + Bdaddr_type uint8 + _ [1]byte +} + +type RawSockaddrCAN struct { + Family uint16 + _ [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + _ [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + _ [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + _ [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrL2 = 0xe + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x10 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_NUM_VF = 0x15 + IFLA_VFINFO_LIST = 0x16 + IFLA_STATS64 = 0x17 + IFLA_VF_PORTS = 0x18 + IFLA_PORT_SELF = 0x19 + IFLA_AF_SPEC = 0x1a + IFLA_GROUP = 0x1b + IFLA_NET_NS_FD = 0x1c + IFLA_EXT_MASK = 0x1d + IFLA_PROMISCUITY = 0x1e + IFLA_NUM_TX_QUEUES = 0x1f + IFLA_NUM_RX_QUEUES = 0x20 + IFLA_CARRIER = 0x21 + IFLA_PHYS_PORT_ID = 0x22 + IFLA_CARRIER_CHANGES = 0x23 + IFLA_PHYS_SWITCH_ID = 0x24 + IFLA_LINK_NETNSID = 0x25 + IFLA_PHYS_PORT_NAME = 0x26 + IFLA_PROTO_DOWN = 0x27 + IFLA_GSO_MAX_SEGS = 0x28 + IFLA_GSO_MAX_SIZE = 0x29 + IFLA_PAD = 0x2a + IFLA_XDP = 0x2b + IFLA_EVENT = 0x2c + IFLA_NEW_NETNSID = 0x2d + IFLA_IF_NETNSID = 0x2e + IFLA_MAX = 0x31 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + _ uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + _ [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Regs [32]uint64 + Lo uint64 + Hi uint64 + Epc uint64 + Badvaddr uint64 + Status uint64 + Cause uint64 +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + _ [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + _ [0]int8 + _ [4]byte +} + +type Utsname struct { + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte +} + +type Ustat_t struct { + Tfree int32 + _ [4]byte + Tinode uint64 + Fname [6]int8 + Fpack [6]int8 + _ [4]byte +} + +type EpollEvent struct { + Events uint32 + Fd int32 + Pad int32 +} + +const ( + AT_EMPTY_PATH = 0x1000 + AT_FDCWD = -0x64 + AT_NO_AUTOMOUNT = 0x800 + AT_REMOVEDIR = 0x200 + + AT_STATX_SYNC_AS_STAT = 0x0 + AT_STATX_FORCE_SYNC = 0x2000 + AT_STATX_DONT_SYNC = 0x4000 + + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + Val [16]uint64 +} + +const RNDGETENTCNT = 0x40045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [23]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + _ [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + _ [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + _ [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + _ [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type CGroupStats struct { + Sleeping uint64 + Running uint64 + Stopped uint64 + Uninterruptible uint64 + Io_wait uint64 +} + +const ( + CGROUPSTATS_CMD_UNSPEC = 0x3 + CGROUPSTATS_CMD_GET = 0x4 + CGROUPSTATS_CMD_NEW = 0x5 + CGROUPSTATS_TYPE_UNSPEC = 0x0 + CGROUPSTATS_TYPE_CGROUP_STATS = 0x1 + CGROUPSTATS_CMD_ATTR_UNSPEC = 0x0 + CGROUPSTATS_CMD_ATTR_FD = 0x1 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) + +type cpuMask uint64 + +const ( + _CPU_SETSIZE = 0x400 + _NCPUBITS = 0x40 +) + +const ( + BDADDR_BREDR = 0x0 + BDADDR_LE_PUBLIC = 0x1 + BDADDR_LE_RANDOM = 0x2 +) + +type PerfEventAttr struct { + Type uint32 + Size uint32 + Config uint64 + Sample uint64 + Sample_type uint64 + Read_format uint64 + Bits uint64 + Wakeup uint32 + Bp_type uint32 + Ext1 uint64 + Ext2 uint64 + Branch_sample_type uint64 + Sample_regs_user uint64 + Sample_stack_user uint32 + Clockid int32 + Sample_regs_intr uint64 + Aux_watermark uint32 + _ uint32 +} + +type PerfEventMmapPage struct { + Version uint32 + Compat_version uint32 + Lock uint32 + Index uint32 + Offset int64 + Time_enabled uint64 + Time_running uint64 + Capabilities uint64 + Pmc_width uint16 + Time_shift uint16 + Time_mult uint32 + Time_offset uint64 + Time_zero uint64 + Size uint32 + _ [948]uint8 + Data_head uint64 + Data_tail uint64 + Data_offset uint64 + Data_size uint64 + Aux_head uint64 + Aux_tail uint64 + Aux_offset uint64 + Aux_size uint64 +} + +const ( + PerfBitDisabled uint64 = CBitFieldMaskBit0 + PerfBitInherit = CBitFieldMaskBit1 + PerfBitPinned = CBitFieldMaskBit2 + PerfBitExclusive = CBitFieldMaskBit3 + PerfBitExcludeUser = CBitFieldMaskBit4 + PerfBitExcludeKernel = CBitFieldMaskBit5 + PerfBitExcludeHv = CBitFieldMaskBit6 + PerfBitExcludeIdle = CBitFieldMaskBit7 + PerfBitMmap = CBitFieldMaskBit8 + PerfBitComm = CBitFieldMaskBit9 + PerfBitFreq = CBitFieldMaskBit10 + PerfBitInheritStat = CBitFieldMaskBit11 + PerfBitEnableOnExec = CBitFieldMaskBit12 + PerfBitTask = CBitFieldMaskBit13 + PerfBitWatermark = CBitFieldMaskBit14 + PerfBitPreciseIPBit1 = CBitFieldMaskBit15 + PerfBitPreciseIPBit2 = CBitFieldMaskBit16 + PerfBitMmapData = CBitFieldMaskBit17 + PerfBitSampleIDAll = CBitFieldMaskBit18 + PerfBitExcludeHost = CBitFieldMaskBit19 + PerfBitExcludeGuest = CBitFieldMaskBit20 + PerfBitExcludeCallchainKernel = CBitFieldMaskBit21 + PerfBitExcludeCallchainUser = CBitFieldMaskBit22 + PerfBitMmap2 = CBitFieldMaskBit23 + PerfBitCommExec = CBitFieldMaskBit24 + PerfBitUseClockID = CBitFieldMaskBit25 + PerfBitContextSwitch = CBitFieldMaskBit26 +) + +const ( + PERF_TYPE_HARDWARE = 0x0 + PERF_TYPE_SOFTWARE = 0x1 + PERF_TYPE_TRACEPOINT = 0x2 + PERF_TYPE_HW_CACHE = 0x3 + PERF_TYPE_RAW = 0x4 + PERF_TYPE_BREAKPOINT = 0x5 + + PERF_COUNT_HW_CPU_CYCLES = 0x0 + PERF_COUNT_HW_INSTRUCTIONS = 0x1 + PERF_COUNT_HW_CACHE_REFERENCES = 0x2 + PERF_COUNT_HW_CACHE_MISSES = 0x3 + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 0x4 + PERF_COUNT_HW_BRANCH_MISSES = 0x5 + PERF_COUNT_HW_BUS_CYCLES = 0x6 + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7 + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 0x8 + PERF_COUNT_HW_REF_CPU_CYCLES = 0x9 + + PERF_COUNT_HW_CACHE_L1D = 0x0 + PERF_COUNT_HW_CACHE_L1I = 0x1 + PERF_COUNT_HW_CACHE_LL = 0x2 + PERF_COUNT_HW_CACHE_DTLB = 0x3 + PERF_COUNT_HW_CACHE_ITLB = 0x4 + PERF_COUNT_HW_CACHE_BPU = 0x5 + PERF_COUNT_HW_CACHE_NODE = 0x6 + + PERF_COUNT_HW_CACHE_OP_READ = 0x0 + PERF_COUNT_HW_CACHE_OP_WRITE = 0x1 + PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2 + + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0 + PERF_COUNT_HW_CACHE_RESULT_MISS = 0x1 + + PERF_COUNT_SW_CPU_CLOCK = 0x0 + PERF_COUNT_SW_TASK_CLOCK = 0x1 + PERF_COUNT_SW_PAGE_FAULTS = 0x2 + PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3 + PERF_COUNT_SW_CPU_MIGRATIONS = 0x4 + PERF_COUNT_SW_PAGE_FAULTS_MIN = 0x5 + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 0x6 + PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 + PERF_COUNT_SW_EMULATION_FAULTS = 0x8 + PERF_COUNT_SW_DUMMY = 0x9 + + PERF_SAMPLE_IP = 0x1 + PERF_SAMPLE_TID = 0x2 + PERF_SAMPLE_TIME = 0x4 + PERF_SAMPLE_ADDR = 0x8 + PERF_SAMPLE_READ = 0x10 + PERF_SAMPLE_CALLCHAIN = 0x20 + PERF_SAMPLE_ID = 0x40 + PERF_SAMPLE_CPU = 0x80 + PERF_SAMPLE_PERIOD = 0x100 + PERF_SAMPLE_STREAM_ID = 0x200 + PERF_SAMPLE_RAW = 0x400 + PERF_SAMPLE_BRANCH_STACK = 0x800 + + PERF_SAMPLE_BRANCH_USER = 0x1 + PERF_SAMPLE_BRANCH_KERNEL = 0x2 + PERF_SAMPLE_BRANCH_HV = 0x4 + PERF_SAMPLE_BRANCH_ANY = 0x8 + PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 + PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 + PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + + PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 + PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 + PERF_FORMAT_ID = 0x4 + PERF_FORMAT_GROUP = 0x8 + + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + + PERF_CONTEXT_HV = -0x20 + PERF_CONTEXT_KERNEL = -0x80 + PERF_CONTEXT_USER = -0x200 + + PERF_CONTEXT_GUEST = -0x800 + PERF_CONTEXT_GUEST_KERNEL = -0x880 + PERF_CONTEXT_GUEST_USER = -0xa00 + + PERF_FLAG_FD_NO_GROUP = 0x1 + PERF_FLAG_FD_OUTPUT = 0x2 + PERF_FLAG_PID_CGROUP = 0x4 +) + +const ( + CBitFieldMaskBit0 = 0x1 + CBitFieldMaskBit1 = 0x2 + CBitFieldMaskBit2 = 0x4 + CBitFieldMaskBit3 = 0x8 + CBitFieldMaskBit4 = 0x10 + CBitFieldMaskBit5 = 0x20 + CBitFieldMaskBit6 = 0x40 + CBitFieldMaskBit7 = 0x80 + CBitFieldMaskBit8 = 0x100 + CBitFieldMaskBit9 = 0x200 + CBitFieldMaskBit10 = 0x400 + CBitFieldMaskBit11 = 0x800 + CBitFieldMaskBit12 = 0x1000 + CBitFieldMaskBit13 = 0x2000 + CBitFieldMaskBit14 = 0x4000 + CBitFieldMaskBit15 = 0x8000 + CBitFieldMaskBit16 = 0x10000 + CBitFieldMaskBit17 = 0x20000 + CBitFieldMaskBit18 = 0x40000 + CBitFieldMaskBit19 = 0x80000 + CBitFieldMaskBit20 = 0x100000 + CBitFieldMaskBit21 = 0x200000 + CBitFieldMaskBit22 = 0x400000 + CBitFieldMaskBit23 = 0x800000 + CBitFieldMaskBit24 = 0x1000000 + CBitFieldMaskBit25 = 0x2000000 + CBitFieldMaskBit26 = 0x4000000 + CBitFieldMaskBit27 = 0x8000000 + CBitFieldMaskBit28 = 0x10000000 + CBitFieldMaskBit29 = 0x20000000 + CBitFieldMaskBit30 = 0x40000000 + CBitFieldMaskBit31 = 0x80000000 + CBitFieldMaskBit32 = 0x100000000 + CBitFieldMaskBit33 = 0x200000000 + CBitFieldMaskBit34 = 0x400000000 + CBitFieldMaskBit35 = 0x800000000 + CBitFieldMaskBit36 = 0x1000000000 + CBitFieldMaskBit37 = 0x2000000000 + CBitFieldMaskBit38 = 0x4000000000 + CBitFieldMaskBit39 = 0x8000000000 + CBitFieldMaskBit40 = 0x10000000000 + CBitFieldMaskBit41 = 0x20000000000 + CBitFieldMaskBit42 = 0x40000000000 + CBitFieldMaskBit43 = 0x80000000000 + CBitFieldMaskBit44 = 0x100000000000 + CBitFieldMaskBit45 = 0x200000000000 + CBitFieldMaskBit46 = 0x400000000000 + CBitFieldMaskBit47 = 0x800000000000 + CBitFieldMaskBit48 = 0x1000000000000 + CBitFieldMaskBit49 = 0x2000000000000 + CBitFieldMaskBit50 = 0x4000000000000 + CBitFieldMaskBit51 = 0x8000000000000 + CBitFieldMaskBit52 = 0x10000000000000 + CBitFieldMaskBit53 = 0x20000000000000 + CBitFieldMaskBit54 = 0x40000000000000 + CBitFieldMaskBit55 = 0x80000000000000 + CBitFieldMaskBit56 = 0x100000000000000 + CBitFieldMaskBit57 = 0x200000000000000 + CBitFieldMaskBit58 = 0x400000000000000 + CBitFieldMaskBit59 = 0x800000000000000 + CBitFieldMaskBit60 = 0x1000000000000000 + CBitFieldMaskBit61 = 0x2000000000000000 + CBitFieldMaskBit62 = 0x4000000000000000 + CBitFieldMaskBit63 = 0x8000000000000000 +) + +type SockaddrStorage struct { + Family uint16 + _ [118]int8 + _ uint64 +} + +type TCPMD5Sig struct { + Addr SockaddrStorage + Flags uint8 + Prefixlen uint8 + Keylen uint16 + _ uint32 + Key [80]uint8 +} + +type HDDriveCmdHdr struct { + Command uint8 + Number uint8 + Feature uint8 + Count uint8 +} + +type HDGeometry struct { + Heads uint8 + Sectors uint8 + Cylinders uint16 + _ [4]byte + Start uint64 +} + +type HDDriveID struct { + Config uint16 + Cyls uint16 + Reserved2 uint16 + Heads uint16 + Track_bytes uint16 + Sector_bytes uint16 + Sectors uint16 + Vendor0 uint16 + Vendor1 uint16 + Vendor2 uint16 + Serial_no [20]uint8 + Buf_type uint16 + Buf_size uint16 + Ecc_bytes uint16 + Fw_rev [8]uint8 + Model [40]uint8 + Max_multsect uint8 + Vendor3 uint8 + Dword_io uint16 + Vendor4 uint8 + Capability uint8 + Reserved50 uint16 + Vendor5 uint8 + TPIO uint8 + Vendor6 uint8 + TDMA uint8 + Field_valid uint16 + Cur_cyls uint16 + Cur_heads uint16 + Cur_sectors uint16 + Cur_capacity0 uint16 + Cur_capacity1 uint16 + Multsect uint8 + Multsect_valid uint8 + Lba_capacity uint32 + Dma_1word uint16 + Dma_mword uint16 + Eide_pio_modes uint16 + Eide_dma_min uint16 + Eide_dma_time uint16 + Eide_pio uint16 + Eide_pio_iordy uint16 + Words69_70 [2]uint16 + Words71_74 [4]uint16 + Queue_depth uint16 + Words76_79 [4]uint16 + Major_rev_num uint16 + Minor_rev_num uint16 + Command_set_1 uint16 + Command_set_2 uint16 + Cfsse uint16 + Cfs_enable_1 uint16 + Cfs_enable_2 uint16 + Csf_default uint16 + Dma_ultra uint16 + Trseuc uint16 + TrsEuc uint16 + CurAPMvalues uint16 + Mprc uint16 + Hw_config uint16 + Acoustic uint16 + Msrqs uint16 + Sxfert uint16 + Sal uint16 + Spg uint32 + Lba_capacity_2 uint64 + Words104_125 [22]uint16 + Last_lun uint16 + Word127 uint16 + Dlf uint16 + Csfo uint16 + Words130_155 [26]uint16 + Word156 uint16 + Words157_159 [3]uint16 + Cfa_power uint16 + Words161_175 [15]uint16 + Words176_205 [30]uint16 + Words206_254 [49]uint16 + Integrity_word uint16 +} + +type Statfs_t struct { + Type int64 + Bsize int64 + Frsize int64 + Blocks uint64 + Bfree uint64 + Files uint64 + Ffree uint64 + Bavail uint64 + Fsid Fsid + Namelen int64 + Flags int64 + Spare [5]int64 +} + +const ( + ST_MANDLOCK = 0x40 + ST_NOATIME = 0x400 + ST_NODEV = 0x4 + ST_NODIRATIME = 0x800 + ST_NOEXEC = 0x8 + ST_NOSUID = 0x2 + ST_RDONLY = 0x1 + ST_RELATIME = 0x1000 + ST_SYNCHRONOUS = 0x10 +) + +type TpacketHdr struct { + Status uint64 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Usec uint32 + _ [4]byte +} + +type Tpacket2Hdr struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Nsec uint32 + Vlan_tci uint16 + Vlan_tpid uint16 + _ [4]uint8 +} + +type Tpacket3Hdr struct { + Next_offset uint32 + Sec uint32 + Nsec uint32 + Snaplen uint32 + Len uint32 + Status uint32 + Mac uint16 + Net uint16 + Hv1 TpacketHdrVariant1 + _ [8]uint8 +} + +type TpacketHdrVariant1 struct { + Rxhash uint32 + Vlan_tci uint32 + Vlan_tpid uint16 + _ uint16 +} + +type TpacketBlockDesc struct { + Version uint32 + To_priv uint32 + Hdr [40]byte +} + +type TpacketReq struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 +} + +type TpacketReq3 struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 + Retire_blk_tov uint32 + Sizeof_priv uint32 + Feature_req_word uint32 +} + +type TpacketStats struct { + Packets uint32 + Drops uint32 +} + +type TpacketStatsV3 struct { + Packets uint32 + Drops uint32 + Freeze_q_cnt uint32 +} + +type TpacketAuxdata struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Vlan_tci uint16 + Vlan_tpid uint16 +} + +const ( + TPACKET_V1 = 0x0 + TPACKET_V2 = 0x1 + TPACKET_V3 = 0x2 +) + +const ( + SizeofTpacketHdr = 0x20 + SizeofTpacket2Hdr = 0x20 + SizeofTpacket3Hdr = 0x30 +) + +const ( + NF_INET_PRE_ROUTING = 0x0 + NF_INET_LOCAL_IN = 0x1 + NF_INET_FORWARD = 0x2 + NF_INET_LOCAL_OUT = 0x3 + NF_INET_POST_ROUTING = 0x4 + NF_INET_NUMHOOKS = 0x5 +) + +const ( + NF_NETDEV_INGRESS = 0x0 + NF_NETDEV_NUMHOOKS = 0x1 +) + +const ( + NFPROTO_UNSPEC = 0x0 + NFPROTO_INET = 0x1 + NFPROTO_IPV4 = 0x2 + NFPROTO_ARP = 0x3 + NFPROTO_NETDEV = 0x5 + NFPROTO_BRIDGE = 0x7 + NFPROTO_IPV6 = 0xa + NFPROTO_DECNET = 0xc + NFPROTO_NUMPROTO = 0xd +) + +type Nfgenmsg struct { + Nfgen_family uint8 + Version uint8 + Res_id uint16 +} + +const ( + NFNL_BATCH_UNSPEC = 0x0 + NFNL_BATCH_GENID = 0x1 +) + +const ( + NFT_REG_VERDICT = 0x0 + NFT_REG_1 = 0x1 + NFT_REG_2 = 0x2 + NFT_REG_3 = 0x3 + NFT_REG_4 = 0x4 + NFT_REG32_00 = 0x8 + NFT_REG32_01 = 0x9 + NFT_REG32_02 = 0xa + NFT_REG32_03 = 0xb + NFT_REG32_04 = 0xc + NFT_REG32_05 = 0xd + NFT_REG32_06 = 0xe + NFT_REG32_07 = 0xf + NFT_REG32_08 = 0x10 + NFT_REG32_09 = 0x11 + NFT_REG32_10 = 0x12 + NFT_REG32_11 = 0x13 + NFT_REG32_12 = 0x14 + NFT_REG32_13 = 0x15 + NFT_REG32_14 = 0x16 + NFT_REG32_15 = 0x17 + NFT_CONTINUE = -0x1 + NFT_BREAK = -0x2 + NFT_JUMP = -0x3 + NFT_GOTO = -0x4 + NFT_RETURN = -0x5 + NFT_MSG_NEWTABLE = 0x0 + NFT_MSG_GETTABLE = 0x1 + NFT_MSG_DELTABLE = 0x2 + NFT_MSG_NEWCHAIN = 0x3 + NFT_MSG_GETCHAIN = 0x4 + NFT_MSG_DELCHAIN = 0x5 + NFT_MSG_NEWRULE = 0x6 + NFT_MSG_GETRULE = 0x7 + NFT_MSG_DELRULE = 0x8 + NFT_MSG_NEWSET = 0x9 + NFT_MSG_GETSET = 0xa + NFT_MSG_DELSET = 0xb + NFT_MSG_NEWSETELEM = 0xc + NFT_MSG_GETSETELEM = 0xd + NFT_MSG_DELSETELEM = 0xe + NFT_MSG_NEWGEN = 0xf + NFT_MSG_GETGEN = 0x10 + NFT_MSG_TRACE = 0x11 + NFT_MSG_NEWOBJ = 0x12 + NFT_MSG_GETOBJ = 0x13 + NFT_MSG_DELOBJ = 0x14 + NFT_MSG_GETOBJ_RESET = 0x15 + NFT_MSG_MAX = 0x19 + NFTA_LIST_UNPEC = 0x0 + NFTA_LIST_ELEM = 0x1 + NFTA_HOOK_UNSPEC = 0x0 + NFTA_HOOK_HOOKNUM = 0x1 + NFTA_HOOK_PRIORITY = 0x2 + NFTA_HOOK_DEV = 0x3 + NFT_TABLE_F_DORMANT = 0x1 + NFTA_TABLE_UNSPEC = 0x0 + NFTA_TABLE_NAME = 0x1 + NFTA_TABLE_FLAGS = 0x2 + NFTA_TABLE_USE = 0x3 + NFTA_CHAIN_UNSPEC = 0x0 + NFTA_CHAIN_TABLE = 0x1 + NFTA_CHAIN_HANDLE = 0x2 + NFTA_CHAIN_NAME = 0x3 + NFTA_CHAIN_HOOK = 0x4 + NFTA_CHAIN_POLICY = 0x5 + NFTA_CHAIN_USE = 0x6 + NFTA_CHAIN_TYPE = 0x7 + NFTA_CHAIN_COUNTERS = 0x8 + NFTA_CHAIN_PAD = 0x9 + NFTA_RULE_UNSPEC = 0x0 + NFTA_RULE_TABLE = 0x1 + NFTA_RULE_CHAIN = 0x2 + NFTA_RULE_HANDLE = 0x3 + NFTA_RULE_EXPRESSIONS = 0x4 + NFTA_RULE_COMPAT = 0x5 + NFTA_RULE_POSITION = 0x6 + NFTA_RULE_USERDATA = 0x7 + NFTA_RULE_PAD = 0x8 + NFTA_RULE_ID = 0x9 + NFT_RULE_COMPAT_F_INV = 0x2 + NFT_RULE_COMPAT_F_MASK = 0x2 + NFTA_RULE_COMPAT_UNSPEC = 0x0 + NFTA_RULE_COMPAT_PROTO = 0x1 + NFTA_RULE_COMPAT_FLAGS = 0x2 + NFT_SET_ANONYMOUS = 0x1 + NFT_SET_CONSTANT = 0x2 + NFT_SET_INTERVAL = 0x4 + NFT_SET_MAP = 0x8 + NFT_SET_TIMEOUT = 0x10 + NFT_SET_EVAL = 0x20 + NFT_SET_OBJECT = 0x40 + NFT_SET_POL_PERFORMANCE = 0x0 + NFT_SET_POL_MEMORY = 0x1 + NFTA_SET_DESC_UNSPEC = 0x0 + NFTA_SET_DESC_SIZE = 0x1 + NFTA_SET_UNSPEC = 0x0 + NFTA_SET_TABLE = 0x1 + NFTA_SET_NAME = 0x2 + NFTA_SET_FLAGS = 0x3 + NFTA_SET_KEY_TYPE = 0x4 + NFTA_SET_KEY_LEN = 0x5 + NFTA_SET_DATA_TYPE = 0x6 + NFTA_SET_DATA_LEN = 0x7 + NFTA_SET_POLICY = 0x8 + NFTA_SET_DESC = 0x9 + NFTA_SET_ID = 0xa + NFTA_SET_TIMEOUT = 0xb + NFTA_SET_GC_INTERVAL = 0xc + NFTA_SET_USERDATA = 0xd + NFTA_SET_PAD = 0xe + NFTA_SET_OBJ_TYPE = 0xf + NFT_SET_ELEM_INTERVAL_END = 0x1 + NFTA_SET_ELEM_UNSPEC = 0x0 + NFTA_SET_ELEM_KEY = 0x1 + NFTA_SET_ELEM_DATA = 0x2 + NFTA_SET_ELEM_FLAGS = 0x3 + NFTA_SET_ELEM_TIMEOUT = 0x4 + NFTA_SET_ELEM_EXPIRATION = 0x5 + NFTA_SET_ELEM_USERDATA = 0x6 + NFTA_SET_ELEM_EXPR = 0x7 + NFTA_SET_ELEM_PAD = 0x8 + NFTA_SET_ELEM_OBJREF = 0x9 + NFTA_SET_ELEM_LIST_UNSPEC = 0x0 + NFTA_SET_ELEM_LIST_TABLE = 0x1 + NFTA_SET_ELEM_LIST_SET = 0x2 + NFTA_SET_ELEM_LIST_ELEMENTS = 0x3 + NFTA_SET_ELEM_LIST_SET_ID = 0x4 + NFT_DATA_VALUE = 0x0 + NFT_DATA_VERDICT = 0xffffff00 + NFTA_DATA_UNSPEC = 0x0 + NFTA_DATA_VALUE = 0x1 + NFTA_DATA_VERDICT = 0x2 + NFTA_VERDICT_UNSPEC = 0x0 + NFTA_VERDICT_CODE = 0x1 + NFTA_VERDICT_CHAIN = 0x2 + NFTA_EXPR_UNSPEC = 0x0 + NFTA_EXPR_NAME = 0x1 + NFTA_EXPR_DATA = 0x2 + NFTA_IMMEDIATE_UNSPEC = 0x0 + NFTA_IMMEDIATE_DREG = 0x1 + NFTA_IMMEDIATE_DATA = 0x2 + NFTA_BITWISE_UNSPEC = 0x0 + NFTA_BITWISE_SREG = 0x1 + NFTA_BITWISE_DREG = 0x2 + NFTA_BITWISE_LEN = 0x3 + NFTA_BITWISE_MASK = 0x4 + NFTA_BITWISE_XOR = 0x5 + NFT_BYTEORDER_NTOH = 0x0 + NFT_BYTEORDER_HTON = 0x1 + NFTA_BYTEORDER_UNSPEC = 0x0 + NFTA_BYTEORDER_SREG = 0x1 + NFTA_BYTEORDER_DREG = 0x2 + NFTA_BYTEORDER_OP = 0x3 + NFTA_BYTEORDER_LEN = 0x4 + NFTA_BYTEORDER_SIZE = 0x5 + NFT_CMP_EQ = 0x0 + NFT_CMP_NEQ = 0x1 + NFT_CMP_LT = 0x2 + NFT_CMP_LTE = 0x3 + NFT_CMP_GT = 0x4 + NFT_CMP_GTE = 0x5 + NFTA_CMP_UNSPEC = 0x0 + NFTA_CMP_SREG = 0x1 + NFTA_CMP_OP = 0x2 + NFTA_CMP_DATA = 0x3 + NFT_RANGE_EQ = 0x0 + NFT_RANGE_NEQ = 0x1 + NFTA_RANGE_UNSPEC = 0x0 + NFTA_RANGE_SREG = 0x1 + NFTA_RANGE_OP = 0x2 + NFTA_RANGE_FROM_DATA = 0x3 + NFTA_RANGE_TO_DATA = 0x4 + NFT_LOOKUP_F_INV = 0x1 + NFTA_LOOKUP_UNSPEC = 0x0 + NFTA_LOOKUP_SET = 0x1 + NFTA_LOOKUP_SREG = 0x2 + NFTA_LOOKUP_DREG = 0x3 + NFTA_LOOKUP_SET_ID = 0x4 + NFTA_LOOKUP_FLAGS = 0x5 + NFT_DYNSET_OP_ADD = 0x0 + NFT_DYNSET_OP_UPDATE = 0x1 + NFT_DYNSET_F_INV = 0x1 + NFTA_DYNSET_UNSPEC = 0x0 + NFTA_DYNSET_SET_NAME = 0x1 + NFTA_DYNSET_SET_ID = 0x2 + NFTA_DYNSET_OP = 0x3 + NFTA_DYNSET_SREG_KEY = 0x4 + NFTA_DYNSET_SREG_DATA = 0x5 + NFTA_DYNSET_TIMEOUT = 0x6 + NFTA_DYNSET_EXPR = 0x7 + NFTA_DYNSET_PAD = 0x8 + NFTA_DYNSET_FLAGS = 0x9 + NFT_PAYLOAD_LL_HEADER = 0x0 + NFT_PAYLOAD_NETWORK_HEADER = 0x1 + NFT_PAYLOAD_TRANSPORT_HEADER = 0x2 + NFT_PAYLOAD_CSUM_NONE = 0x0 + NFT_PAYLOAD_CSUM_INET = 0x1 + NFT_PAYLOAD_L4CSUM_PSEUDOHDR = 0x1 + NFTA_PAYLOAD_UNSPEC = 0x0 + NFTA_PAYLOAD_DREG = 0x1 + NFTA_PAYLOAD_BASE = 0x2 + NFTA_PAYLOAD_OFFSET = 0x3 + NFTA_PAYLOAD_LEN = 0x4 + NFTA_PAYLOAD_SREG = 0x5 + NFTA_PAYLOAD_CSUM_TYPE = 0x6 + NFTA_PAYLOAD_CSUM_OFFSET = 0x7 + NFTA_PAYLOAD_CSUM_FLAGS = 0x8 + NFT_EXTHDR_F_PRESENT = 0x1 + NFT_EXTHDR_OP_IPV6 = 0x0 + NFT_EXTHDR_OP_TCPOPT = 0x1 + NFTA_EXTHDR_UNSPEC = 0x0 + NFTA_EXTHDR_DREG = 0x1 + NFTA_EXTHDR_TYPE = 0x2 + NFTA_EXTHDR_OFFSET = 0x3 + NFTA_EXTHDR_LEN = 0x4 + NFTA_EXTHDR_FLAGS = 0x5 + NFTA_EXTHDR_OP = 0x6 + NFTA_EXTHDR_SREG = 0x7 + NFT_META_LEN = 0x0 + NFT_META_PROTOCOL = 0x1 + NFT_META_PRIORITY = 0x2 + NFT_META_MARK = 0x3 + NFT_META_IIF = 0x4 + NFT_META_OIF = 0x5 + NFT_META_IIFNAME = 0x6 + NFT_META_OIFNAME = 0x7 + NFT_META_IIFTYPE = 0x8 + NFT_META_OIFTYPE = 0x9 + NFT_META_SKUID = 0xa + NFT_META_SKGID = 0xb + NFT_META_NFTRACE = 0xc + NFT_META_RTCLASSID = 0xd + NFT_META_SECMARK = 0xe + NFT_META_NFPROTO = 0xf + NFT_META_L4PROTO = 0x10 + NFT_META_BRI_IIFNAME = 0x11 + NFT_META_BRI_OIFNAME = 0x12 + NFT_META_PKTTYPE = 0x13 + NFT_META_CPU = 0x14 + NFT_META_IIFGROUP = 0x15 + NFT_META_OIFGROUP = 0x16 + NFT_META_CGROUP = 0x17 + NFT_META_PRANDOM = 0x18 + NFT_RT_CLASSID = 0x0 + NFT_RT_NEXTHOP4 = 0x1 + NFT_RT_NEXTHOP6 = 0x2 + NFT_RT_TCPMSS = 0x3 + NFT_HASH_JENKINS = 0x0 + NFT_HASH_SYM = 0x1 + NFTA_HASH_UNSPEC = 0x0 + NFTA_HASH_SREG = 0x1 + NFTA_HASH_DREG = 0x2 + NFTA_HASH_LEN = 0x3 + NFTA_HASH_MODULUS = 0x4 + NFTA_HASH_SEED = 0x5 + NFTA_HASH_OFFSET = 0x6 + NFTA_HASH_TYPE = 0x7 + NFTA_META_UNSPEC = 0x0 + NFTA_META_DREG = 0x1 + NFTA_META_KEY = 0x2 + NFTA_META_SREG = 0x3 + NFTA_RT_UNSPEC = 0x0 + NFTA_RT_DREG = 0x1 + NFTA_RT_KEY = 0x2 + NFT_CT_STATE = 0x0 + NFT_CT_DIRECTION = 0x1 + NFT_CT_STATUS = 0x2 + NFT_CT_MARK = 0x3 + NFT_CT_SECMARK = 0x4 + NFT_CT_EXPIRATION = 0x5 + NFT_CT_HELPER = 0x6 + NFT_CT_L3PROTOCOL = 0x7 + NFT_CT_SRC = 0x8 + NFT_CT_DST = 0x9 + NFT_CT_PROTOCOL = 0xa + NFT_CT_PROTO_SRC = 0xb + NFT_CT_PROTO_DST = 0xc + NFT_CT_LABELS = 0xd + NFT_CT_PKTS = 0xe + NFT_CT_BYTES = 0xf + NFT_CT_AVGPKT = 0x10 + NFT_CT_ZONE = 0x11 + NFT_CT_EVENTMASK = 0x12 + NFTA_CT_UNSPEC = 0x0 + NFTA_CT_DREG = 0x1 + NFTA_CT_KEY = 0x2 + NFTA_CT_DIRECTION = 0x3 + NFTA_CT_SREG = 0x4 + NFT_LIMIT_PKTS = 0x0 + NFT_LIMIT_PKT_BYTES = 0x1 + NFT_LIMIT_F_INV = 0x1 + NFTA_LIMIT_UNSPEC = 0x0 + NFTA_LIMIT_RATE = 0x1 + NFTA_LIMIT_UNIT = 0x2 + NFTA_LIMIT_BURST = 0x3 + NFTA_LIMIT_TYPE = 0x4 + NFTA_LIMIT_FLAGS = 0x5 + NFTA_LIMIT_PAD = 0x6 + NFTA_COUNTER_UNSPEC = 0x0 + NFTA_COUNTER_BYTES = 0x1 + NFTA_COUNTER_PACKETS = 0x2 + NFTA_COUNTER_PAD = 0x3 + NFTA_LOG_UNSPEC = 0x0 + NFTA_LOG_GROUP = 0x1 + NFTA_LOG_PREFIX = 0x2 + NFTA_LOG_SNAPLEN = 0x3 + NFTA_LOG_QTHRESHOLD = 0x4 + NFTA_LOG_LEVEL = 0x5 + NFTA_LOG_FLAGS = 0x6 + NFTA_QUEUE_UNSPEC = 0x0 + NFTA_QUEUE_NUM = 0x1 + NFTA_QUEUE_TOTAL = 0x2 + NFTA_QUEUE_FLAGS = 0x3 + NFTA_QUEUE_SREG_QNUM = 0x4 + NFT_QUOTA_F_INV = 0x1 + NFT_QUOTA_F_DEPLETED = 0x2 + NFTA_QUOTA_UNSPEC = 0x0 + NFTA_QUOTA_BYTES = 0x1 + NFTA_QUOTA_FLAGS = 0x2 + NFTA_QUOTA_PAD = 0x3 + NFTA_QUOTA_CONSUMED = 0x4 + NFT_REJECT_ICMP_UNREACH = 0x0 + NFT_REJECT_TCP_RST = 0x1 + NFT_REJECT_ICMPX_UNREACH = 0x2 + NFT_REJECT_ICMPX_NO_ROUTE = 0x0 + NFT_REJECT_ICMPX_PORT_UNREACH = 0x1 + NFT_REJECT_ICMPX_HOST_UNREACH = 0x2 + NFT_REJECT_ICMPX_ADMIN_PROHIBITED = 0x3 + NFTA_REJECT_UNSPEC = 0x0 + NFTA_REJECT_TYPE = 0x1 + NFTA_REJECT_ICMP_CODE = 0x2 + NFT_NAT_SNAT = 0x0 + NFT_NAT_DNAT = 0x1 + NFTA_NAT_UNSPEC = 0x0 + NFTA_NAT_TYPE = 0x1 + NFTA_NAT_FAMILY = 0x2 + NFTA_NAT_REG_ADDR_MIN = 0x3 + NFTA_NAT_REG_ADDR_MAX = 0x4 + NFTA_NAT_REG_PROTO_MIN = 0x5 + NFTA_NAT_REG_PROTO_MAX = 0x6 + NFTA_NAT_FLAGS = 0x7 + NFTA_MASQ_UNSPEC = 0x0 + NFTA_MASQ_FLAGS = 0x1 + NFTA_MASQ_REG_PROTO_MIN = 0x2 + NFTA_MASQ_REG_PROTO_MAX = 0x3 + NFTA_REDIR_UNSPEC = 0x0 + NFTA_REDIR_REG_PROTO_MIN = 0x1 + NFTA_REDIR_REG_PROTO_MAX = 0x2 + NFTA_REDIR_FLAGS = 0x3 + NFTA_DUP_UNSPEC = 0x0 + NFTA_DUP_SREG_ADDR = 0x1 + NFTA_DUP_SREG_DEV = 0x2 + NFTA_FWD_UNSPEC = 0x0 + NFTA_FWD_SREG_DEV = 0x1 + NFTA_OBJREF_UNSPEC = 0x0 + NFTA_OBJREF_IMM_TYPE = 0x1 + NFTA_OBJREF_IMM_NAME = 0x2 + NFTA_OBJREF_SET_SREG = 0x3 + NFTA_OBJREF_SET_NAME = 0x4 + NFTA_OBJREF_SET_ID = 0x5 + NFTA_GEN_UNSPEC = 0x0 + NFTA_GEN_ID = 0x1 + NFTA_GEN_PROC_PID = 0x2 + NFTA_GEN_PROC_NAME = 0x3 + NFTA_FIB_UNSPEC = 0x0 + NFTA_FIB_DREG = 0x1 + NFTA_FIB_RESULT = 0x2 + NFTA_FIB_FLAGS = 0x3 + NFT_FIB_RESULT_UNSPEC = 0x0 + NFT_FIB_RESULT_OIF = 0x1 + NFT_FIB_RESULT_OIFNAME = 0x2 + NFT_FIB_RESULT_ADDRTYPE = 0x3 + NFTA_FIB_F_SADDR = 0x1 + NFTA_FIB_F_DADDR = 0x2 + NFTA_FIB_F_MARK = 0x4 + NFTA_FIB_F_IIF = 0x8 + NFTA_FIB_F_OIF = 0x10 + NFTA_FIB_F_PRESENT = 0x20 + NFTA_CT_HELPER_UNSPEC = 0x0 + NFTA_CT_HELPER_NAME = 0x1 + NFTA_CT_HELPER_L3PROTO = 0x2 + NFTA_CT_HELPER_L4PROTO = 0x3 + NFTA_OBJ_UNSPEC = 0x0 + NFTA_OBJ_TABLE = 0x1 + NFTA_OBJ_NAME = 0x2 + NFTA_OBJ_TYPE = 0x3 + NFTA_OBJ_DATA = 0x4 + NFTA_OBJ_USE = 0x5 + NFTA_TRACE_UNSPEC = 0x0 + NFTA_TRACE_TABLE = 0x1 + NFTA_TRACE_CHAIN = 0x2 + NFTA_TRACE_RULE_HANDLE = 0x3 + NFTA_TRACE_TYPE = 0x4 + NFTA_TRACE_VERDICT = 0x5 + NFTA_TRACE_ID = 0x6 + NFTA_TRACE_LL_HEADER = 0x7 + NFTA_TRACE_NETWORK_HEADER = 0x8 + NFTA_TRACE_TRANSPORT_HEADER = 0x9 + NFTA_TRACE_IIF = 0xa + NFTA_TRACE_IIFTYPE = 0xb + NFTA_TRACE_OIF = 0xc + NFTA_TRACE_OIFTYPE = 0xd + NFTA_TRACE_MARK = 0xe + NFTA_TRACE_NFPROTO = 0xf + NFTA_TRACE_POLICY = 0x10 + NFTA_TRACE_PAD = 0x11 + NFT_TRACETYPE_UNSPEC = 0x0 + NFT_TRACETYPE_POLICY = 0x1 + NFT_TRACETYPE_RETURN = 0x2 + NFT_TRACETYPE_RULE = 0x3 + NFTA_NG_UNSPEC = 0x0 + NFTA_NG_DREG = 0x1 + NFTA_NG_MODULUS = 0x2 + NFTA_NG_TYPE = 0x3 + NFTA_NG_OFFSET = 0x4 + NFT_NG_INCREMENTAL = 0x0 + NFT_NG_RANDOM = 0x1 +) diff --git a/api/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go b/api/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go new file mode 100644 index 0000000..4f6f145 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go @@ -0,0 +1,1809 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mipsle,linux + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int32 + Nsec int32 +} + +type Timeval struct { + Sec int32 + Usec int32 +} + +type Timex struct { + Modes uint32 + Offset int32 + Freq int32 + Maxerror int32 + Esterror int32 + Status int32 + Constant int32 + Precision int32 + Tolerance int32 + Time Timeval + Tick int32 + Ppsfreq int32 + Jitter int32 + Shift int32 + Stabil int32 + Jitcnt int32 + Calcnt int32 + Errcnt int32 + Stbcnt int32 + Tai int32 + _ [44]byte +} + +type Time_t int32 + +type Tms struct { + Utime int32 + Stime int32 + Cutime int32 + Cstime int32 +} + +type Utimbuf struct { + Actime int32 + Modtime int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint32 + Pad1 [3]int32 + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint32 + Pad2 [3]int32 + Size int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Blksize int32 + Pad4 int32 + Blocks int64 + Pad5 [14]int32 +} + +type StatxTimestamp struct { + Sec int64 + Nsec uint32 + _ int32 +} + +type Statx_t struct { + Mask uint32 + Blksize uint32 + Attributes uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Mode uint16 + _ [1]uint16 + Ino uint64 + Size uint64 + Blocks uint64 + Attributes_mask uint64 + Atime StatxTimestamp + Btime StatxTimestamp + Ctime StatxTimestamp + Mtime StatxTimestamp + Rdev_major uint32 + Rdev_minor uint32 + Dev_major uint32 + Dev_minor uint32 + _ [14]uint64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + _ [5]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + _ [4]byte + Start int64 + Len int64 + Pid int32 + _ [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrL2 struct { + Family uint16 + Psm uint16 + Bdaddr [6]uint8 + Cid uint16 + Bdaddr_type uint8 + _ [1]byte +} + +type RawSockaddrCAN struct { + Family uint16 + _ [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + _ [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrL2 = 0xe + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_NUM_VF = 0x15 + IFLA_VFINFO_LIST = 0x16 + IFLA_STATS64 = 0x17 + IFLA_VF_PORTS = 0x18 + IFLA_PORT_SELF = 0x19 + IFLA_AF_SPEC = 0x1a + IFLA_GROUP = 0x1b + IFLA_NET_NS_FD = 0x1c + IFLA_EXT_MASK = 0x1d + IFLA_PROMISCUITY = 0x1e + IFLA_NUM_TX_QUEUES = 0x1f + IFLA_NUM_RX_QUEUES = 0x20 + IFLA_CARRIER = 0x21 + IFLA_PHYS_PORT_ID = 0x22 + IFLA_CARRIER_CHANGES = 0x23 + IFLA_PHYS_SWITCH_ID = 0x24 + IFLA_LINK_NETNSID = 0x25 + IFLA_PHYS_PORT_NAME = 0x26 + IFLA_PROTO_DOWN = 0x27 + IFLA_GSO_MAX_SEGS = 0x28 + IFLA_GSO_MAX_SIZE = 0x29 + IFLA_PAD = 0x2a + IFLA_XDP = 0x2b + IFLA_EVENT = 0x2c + IFLA_NEW_NETNSID = 0x2d + IFLA_IF_NETNSID = 0x2e + IFLA_MAX = 0x31 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + _ uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x8 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + _ [2]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Regs [32]uint64 + Lo uint64 + Hi uint64 + Epc uint64 + Badvaddr uint64 + Status uint64 + Cause uint64 +} + +type FdSet struct { + Bits [32]int32 +} + +type Sysinfo_t struct { + Uptime int32 + Loads [3]uint32 + Totalram uint32 + Freeram uint32 + Sharedram uint32 + Bufferram uint32 + Totalswap uint32 + Freeswap uint32 + Procs uint16 + Pad uint16 + Totalhigh uint32 + Freehigh uint32 + Unit uint32 + _ [8]int8 +} + +type Utsname struct { + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte +} + +type Ustat_t struct { + Tfree int32 + Tinode uint32 + Fname [6]int8 + Fpack [6]int8 +} + +type EpollEvent struct { + Events uint32 + PadFd int32 + Fd int32 + Pad int32 +} + +const ( + AT_EMPTY_PATH = 0x1000 + AT_FDCWD = -0x64 + AT_NO_AUTOMOUNT = 0x800 + AT_REMOVEDIR = 0x200 + + AT_STATX_SYNC_AS_STAT = 0x0 + AT_STATX_FORCE_SYNC = 0x2000 + AT_STATX_DONT_SYNC = 0x4000 + + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + Val [32]uint32 +} + +const RNDGETENTCNT = 0x40045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [23]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + _ [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + _ [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + _ [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + _ [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type CGroupStats struct { + Sleeping uint64 + Running uint64 + Stopped uint64 + Uninterruptible uint64 + Io_wait uint64 +} + +const ( + CGROUPSTATS_CMD_UNSPEC = 0x3 + CGROUPSTATS_CMD_GET = 0x4 + CGROUPSTATS_CMD_NEW = 0x5 + CGROUPSTATS_TYPE_UNSPEC = 0x0 + CGROUPSTATS_TYPE_CGROUP_STATS = 0x1 + CGROUPSTATS_CMD_ATTR_UNSPEC = 0x0 + CGROUPSTATS_CMD_ATTR_FD = 0x1 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) + +type cpuMask uint32 + +const ( + _CPU_SETSIZE = 0x400 + _NCPUBITS = 0x20 +) + +const ( + BDADDR_BREDR = 0x0 + BDADDR_LE_PUBLIC = 0x1 + BDADDR_LE_RANDOM = 0x2 +) + +type PerfEventAttr struct { + Type uint32 + Size uint32 + Config uint64 + Sample uint64 + Sample_type uint64 + Read_format uint64 + Bits uint64 + Wakeup uint32 + Bp_type uint32 + Ext1 uint64 + Ext2 uint64 + Branch_sample_type uint64 + Sample_regs_user uint64 + Sample_stack_user uint32 + Clockid int32 + Sample_regs_intr uint64 + Aux_watermark uint32 + _ uint32 +} + +type PerfEventMmapPage struct { + Version uint32 + Compat_version uint32 + Lock uint32 + Index uint32 + Offset int64 + Time_enabled uint64 + Time_running uint64 + Capabilities uint64 + Pmc_width uint16 + Time_shift uint16 + Time_mult uint32 + Time_offset uint64 + Time_zero uint64 + Size uint32 + _ [948]uint8 + Data_head uint64 + Data_tail uint64 + Data_offset uint64 + Data_size uint64 + Aux_head uint64 + Aux_tail uint64 + Aux_offset uint64 + Aux_size uint64 +} + +const ( + PerfBitDisabled uint64 = CBitFieldMaskBit0 + PerfBitInherit = CBitFieldMaskBit1 + PerfBitPinned = CBitFieldMaskBit2 + PerfBitExclusive = CBitFieldMaskBit3 + PerfBitExcludeUser = CBitFieldMaskBit4 + PerfBitExcludeKernel = CBitFieldMaskBit5 + PerfBitExcludeHv = CBitFieldMaskBit6 + PerfBitExcludeIdle = CBitFieldMaskBit7 + PerfBitMmap = CBitFieldMaskBit8 + PerfBitComm = CBitFieldMaskBit9 + PerfBitFreq = CBitFieldMaskBit10 + PerfBitInheritStat = CBitFieldMaskBit11 + PerfBitEnableOnExec = CBitFieldMaskBit12 + PerfBitTask = CBitFieldMaskBit13 + PerfBitWatermark = CBitFieldMaskBit14 + PerfBitPreciseIPBit1 = CBitFieldMaskBit15 + PerfBitPreciseIPBit2 = CBitFieldMaskBit16 + PerfBitMmapData = CBitFieldMaskBit17 + PerfBitSampleIDAll = CBitFieldMaskBit18 + PerfBitExcludeHost = CBitFieldMaskBit19 + PerfBitExcludeGuest = CBitFieldMaskBit20 + PerfBitExcludeCallchainKernel = CBitFieldMaskBit21 + PerfBitExcludeCallchainUser = CBitFieldMaskBit22 + PerfBitMmap2 = CBitFieldMaskBit23 + PerfBitCommExec = CBitFieldMaskBit24 + PerfBitUseClockID = CBitFieldMaskBit25 + PerfBitContextSwitch = CBitFieldMaskBit26 +) + +const ( + PERF_TYPE_HARDWARE = 0x0 + PERF_TYPE_SOFTWARE = 0x1 + PERF_TYPE_TRACEPOINT = 0x2 + PERF_TYPE_HW_CACHE = 0x3 + PERF_TYPE_RAW = 0x4 + PERF_TYPE_BREAKPOINT = 0x5 + + PERF_COUNT_HW_CPU_CYCLES = 0x0 + PERF_COUNT_HW_INSTRUCTIONS = 0x1 + PERF_COUNT_HW_CACHE_REFERENCES = 0x2 + PERF_COUNT_HW_CACHE_MISSES = 0x3 + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 0x4 + PERF_COUNT_HW_BRANCH_MISSES = 0x5 + PERF_COUNT_HW_BUS_CYCLES = 0x6 + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7 + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 0x8 + PERF_COUNT_HW_REF_CPU_CYCLES = 0x9 + + PERF_COUNT_HW_CACHE_L1D = 0x0 + PERF_COUNT_HW_CACHE_L1I = 0x1 + PERF_COUNT_HW_CACHE_LL = 0x2 + PERF_COUNT_HW_CACHE_DTLB = 0x3 + PERF_COUNT_HW_CACHE_ITLB = 0x4 + PERF_COUNT_HW_CACHE_BPU = 0x5 + PERF_COUNT_HW_CACHE_NODE = 0x6 + + PERF_COUNT_HW_CACHE_OP_READ = 0x0 + PERF_COUNT_HW_CACHE_OP_WRITE = 0x1 + PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2 + + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0 + PERF_COUNT_HW_CACHE_RESULT_MISS = 0x1 + + PERF_COUNT_SW_CPU_CLOCK = 0x0 + PERF_COUNT_SW_TASK_CLOCK = 0x1 + PERF_COUNT_SW_PAGE_FAULTS = 0x2 + PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3 + PERF_COUNT_SW_CPU_MIGRATIONS = 0x4 + PERF_COUNT_SW_PAGE_FAULTS_MIN = 0x5 + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 0x6 + PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 + PERF_COUNT_SW_EMULATION_FAULTS = 0x8 + PERF_COUNT_SW_DUMMY = 0x9 + + PERF_SAMPLE_IP = 0x1 + PERF_SAMPLE_TID = 0x2 + PERF_SAMPLE_TIME = 0x4 + PERF_SAMPLE_ADDR = 0x8 + PERF_SAMPLE_READ = 0x10 + PERF_SAMPLE_CALLCHAIN = 0x20 + PERF_SAMPLE_ID = 0x40 + PERF_SAMPLE_CPU = 0x80 + PERF_SAMPLE_PERIOD = 0x100 + PERF_SAMPLE_STREAM_ID = 0x200 + PERF_SAMPLE_RAW = 0x400 + PERF_SAMPLE_BRANCH_STACK = 0x800 + + PERF_SAMPLE_BRANCH_USER = 0x1 + PERF_SAMPLE_BRANCH_KERNEL = 0x2 + PERF_SAMPLE_BRANCH_HV = 0x4 + PERF_SAMPLE_BRANCH_ANY = 0x8 + PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 + PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 + PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + + PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 + PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 + PERF_FORMAT_ID = 0x4 + PERF_FORMAT_GROUP = 0x8 + + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + + PERF_CONTEXT_HV = -0x20 + PERF_CONTEXT_KERNEL = -0x80 + PERF_CONTEXT_USER = -0x200 + + PERF_CONTEXT_GUEST = -0x800 + PERF_CONTEXT_GUEST_KERNEL = -0x880 + PERF_CONTEXT_GUEST_USER = -0xa00 + + PERF_FLAG_FD_NO_GROUP = 0x1 + PERF_FLAG_FD_OUTPUT = 0x2 + PERF_FLAG_PID_CGROUP = 0x4 +) + +const ( + CBitFieldMaskBit0 = 0x1 + CBitFieldMaskBit1 = 0x2 + CBitFieldMaskBit2 = 0x4 + CBitFieldMaskBit3 = 0x8 + CBitFieldMaskBit4 = 0x10 + CBitFieldMaskBit5 = 0x20 + CBitFieldMaskBit6 = 0x40 + CBitFieldMaskBit7 = 0x80 + CBitFieldMaskBit8 = 0x100 + CBitFieldMaskBit9 = 0x200 + CBitFieldMaskBit10 = 0x400 + CBitFieldMaskBit11 = 0x800 + CBitFieldMaskBit12 = 0x1000 + CBitFieldMaskBit13 = 0x2000 + CBitFieldMaskBit14 = 0x4000 + CBitFieldMaskBit15 = 0x8000 + CBitFieldMaskBit16 = 0x10000 + CBitFieldMaskBit17 = 0x20000 + CBitFieldMaskBit18 = 0x40000 + CBitFieldMaskBit19 = 0x80000 + CBitFieldMaskBit20 = 0x100000 + CBitFieldMaskBit21 = 0x200000 + CBitFieldMaskBit22 = 0x400000 + CBitFieldMaskBit23 = 0x800000 + CBitFieldMaskBit24 = 0x1000000 + CBitFieldMaskBit25 = 0x2000000 + CBitFieldMaskBit26 = 0x4000000 + CBitFieldMaskBit27 = 0x8000000 + CBitFieldMaskBit28 = 0x10000000 + CBitFieldMaskBit29 = 0x20000000 + CBitFieldMaskBit30 = 0x40000000 + CBitFieldMaskBit31 = 0x80000000 + CBitFieldMaskBit32 = 0x100000000 + CBitFieldMaskBit33 = 0x200000000 + CBitFieldMaskBit34 = 0x400000000 + CBitFieldMaskBit35 = 0x800000000 + CBitFieldMaskBit36 = 0x1000000000 + CBitFieldMaskBit37 = 0x2000000000 + CBitFieldMaskBit38 = 0x4000000000 + CBitFieldMaskBit39 = 0x8000000000 + CBitFieldMaskBit40 = 0x10000000000 + CBitFieldMaskBit41 = 0x20000000000 + CBitFieldMaskBit42 = 0x40000000000 + CBitFieldMaskBit43 = 0x80000000000 + CBitFieldMaskBit44 = 0x100000000000 + CBitFieldMaskBit45 = 0x200000000000 + CBitFieldMaskBit46 = 0x400000000000 + CBitFieldMaskBit47 = 0x800000000000 + CBitFieldMaskBit48 = 0x1000000000000 + CBitFieldMaskBit49 = 0x2000000000000 + CBitFieldMaskBit50 = 0x4000000000000 + CBitFieldMaskBit51 = 0x8000000000000 + CBitFieldMaskBit52 = 0x10000000000000 + CBitFieldMaskBit53 = 0x20000000000000 + CBitFieldMaskBit54 = 0x40000000000000 + CBitFieldMaskBit55 = 0x80000000000000 + CBitFieldMaskBit56 = 0x100000000000000 + CBitFieldMaskBit57 = 0x200000000000000 + CBitFieldMaskBit58 = 0x400000000000000 + CBitFieldMaskBit59 = 0x800000000000000 + CBitFieldMaskBit60 = 0x1000000000000000 + CBitFieldMaskBit61 = 0x2000000000000000 + CBitFieldMaskBit62 = 0x4000000000000000 + CBitFieldMaskBit63 = 0x8000000000000000 +) + +type SockaddrStorage struct { + Family uint16 + _ [122]int8 + _ uint32 +} + +type TCPMD5Sig struct { + Addr SockaddrStorage + Flags uint8 + Prefixlen uint8 + Keylen uint16 + _ uint32 + Key [80]uint8 +} + +type HDDriveCmdHdr struct { + Command uint8 + Number uint8 + Feature uint8 + Count uint8 +} + +type HDGeometry struct { + Heads uint8 + Sectors uint8 + Cylinders uint16 + Start uint32 +} + +type HDDriveID struct { + Config uint16 + Cyls uint16 + Reserved2 uint16 + Heads uint16 + Track_bytes uint16 + Sector_bytes uint16 + Sectors uint16 + Vendor0 uint16 + Vendor1 uint16 + Vendor2 uint16 + Serial_no [20]uint8 + Buf_type uint16 + Buf_size uint16 + Ecc_bytes uint16 + Fw_rev [8]uint8 + Model [40]uint8 + Max_multsect uint8 + Vendor3 uint8 + Dword_io uint16 + Vendor4 uint8 + Capability uint8 + Reserved50 uint16 + Vendor5 uint8 + TPIO uint8 + Vendor6 uint8 + TDMA uint8 + Field_valid uint16 + Cur_cyls uint16 + Cur_heads uint16 + Cur_sectors uint16 + Cur_capacity0 uint16 + Cur_capacity1 uint16 + Multsect uint8 + Multsect_valid uint8 + Lba_capacity uint32 + Dma_1word uint16 + Dma_mword uint16 + Eide_pio_modes uint16 + Eide_dma_min uint16 + Eide_dma_time uint16 + Eide_pio uint16 + Eide_pio_iordy uint16 + Words69_70 [2]uint16 + Words71_74 [4]uint16 + Queue_depth uint16 + Words76_79 [4]uint16 + Major_rev_num uint16 + Minor_rev_num uint16 + Command_set_1 uint16 + Command_set_2 uint16 + Cfsse uint16 + Cfs_enable_1 uint16 + Cfs_enable_2 uint16 + Csf_default uint16 + Dma_ultra uint16 + Trseuc uint16 + TrsEuc uint16 + CurAPMvalues uint16 + Mprc uint16 + Hw_config uint16 + Acoustic uint16 + Msrqs uint16 + Sxfert uint16 + Sal uint16 + Spg uint32 + Lba_capacity_2 uint64 + Words104_125 [22]uint16 + Last_lun uint16 + Word127 uint16 + Dlf uint16 + Csfo uint16 + Words130_155 [26]uint16 + Word156 uint16 + Words157_159 [3]uint16 + Cfa_power uint16 + Words161_175 [15]uint16 + Words176_205 [30]uint16 + Words206_254 [49]uint16 + Integrity_word uint16 +} + +type Statfs_t struct { + Type int32 + Bsize int32 + Frsize int32 + _ [4]byte + Blocks uint64 + Bfree uint64 + Files uint64 + Ffree uint64 + Bavail uint64 + Fsid Fsid + Namelen int32 + Flags int32 + Spare [5]int32 + _ [4]byte +} + +const ( + ST_MANDLOCK = 0x40 + ST_NOATIME = 0x400 + ST_NODEV = 0x4 + ST_NODIRATIME = 0x800 + ST_NOEXEC = 0x8 + ST_NOSUID = 0x2 + ST_RDONLY = 0x1 + ST_RELATIME = 0x1000 + ST_SYNCHRONOUS = 0x10 +) + +type TpacketHdr struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Usec uint32 +} + +type Tpacket2Hdr struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Nsec uint32 + Vlan_tci uint16 + Vlan_tpid uint16 + _ [4]uint8 +} + +type Tpacket3Hdr struct { + Next_offset uint32 + Sec uint32 + Nsec uint32 + Snaplen uint32 + Len uint32 + Status uint32 + Mac uint16 + Net uint16 + Hv1 TpacketHdrVariant1 + _ [8]uint8 +} + +type TpacketHdrVariant1 struct { + Rxhash uint32 + Vlan_tci uint32 + Vlan_tpid uint16 + _ uint16 +} + +type TpacketBlockDesc struct { + Version uint32 + To_priv uint32 + Hdr [40]byte +} + +type TpacketReq struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 +} + +type TpacketReq3 struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 + Retire_blk_tov uint32 + Sizeof_priv uint32 + Feature_req_word uint32 +} + +type TpacketStats struct { + Packets uint32 + Drops uint32 +} + +type TpacketStatsV3 struct { + Packets uint32 + Drops uint32 + Freeze_q_cnt uint32 +} + +type TpacketAuxdata struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Vlan_tci uint16 + Vlan_tpid uint16 +} + +const ( + TPACKET_V1 = 0x0 + TPACKET_V2 = 0x1 + TPACKET_V3 = 0x2 +) + +const ( + SizeofTpacketHdr = 0x18 + SizeofTpacket2Hdr = 0x20 + SizeofTpacket3Hdr = 0x30 +) + +const ( + NF_INET_PRE_ROUTING = 0x0 + NF_INET_LOCAL_IN = 0x1 + NF_INET_FORWARD = 0x2 + NF_INET_LOCAL_OUT = 0x3 + NF_INET_POST_ROUTING = 0x4 + NF_INET_NUMHOOKS = 0x5 +) + +const ( + NF_NETDEV_INGRESS = 0x0 + NF_NETDEV_NUMHOOKS = 0x1 +) + +const ( + NFPROTO_UNSPEC = 0x0 + NFPROTO_INET = 0x1 + NFPROTO_IPV4 = 0x2 + NFPROTO_ARP = 0x3 + NFPROTO_NETDEV = 0x5 + NFPROTO_BRIDGE = 0x7 + NFPROTO_IPV6 = 0xa + NFPROTO_DECNET = 0xc + NFPROTO_NUMPROTO = 0xd +) + +type Nfgenmsg struct { + Nfgen_family uint8 + Version uint8 + Res_id uint16 +} + +const ( + NFNL_BATCH_UNSPEC = 0x0 + NFNL_BATCH_GENID = 0x1 +) + +const ( + NFT_REG_VERDICT = 0x0 + NFT_REG_1 = 0x1 + NFT_REG_2 = 0x2 + NFT_REG_3 = 0x3 + NFT_REG_4 = 0x4 + NFT_REG32_00 = 0x8 + NFT_REG32_01 = 0x9 + NFT_REG32_02 = 0xa + NFT_REG32_03 = 0xb + NFT_REG32_04 = 0xc + NFT_REG32_05 = 0xd + NFT_REG32_06 = 0xe + NFT_REG32_07 = 0xf + NFT_REG32_08 = 0x10 + NFT_REG32_09 = 0x11 + NFT_REG32_10 = 0x12 + NFT_REG32_11 = 0x13 + NFT_REG32_12 = 0x14 + NFT_REG32_13 = 0x15 + NFT_REG32_14 = 0x16 + NFT_REG32_15 = 0x17 + NFT_CONTINUE = -0x1 + NFT_BREAK = -0x2 + NFT_JUMP = -0x3 + NFT_GOTO = -0x4 + NFT_RETURN = -0x5 + NFT_MSG_NEWTABLE = 0x0 + NFT_MSG_GETTABLE = 0x1 + NFT_MSG_DELTABLE = 0x2 + NFT_MSG_NEWCHAIN = 0x3 + NFT_MSG_GETCHAIN = 0x4 + NFT_MSG_DELCHAIN = 0x5 + NFT_MSG_NEWRULE = 0x6 + NFT_MSG_GETRULE = 0x7 + NFT_MSG_DELRULE = 0x8 + NFT_MSG_NEWSET = 0x9 + NFT_MSG_GETSET = 0xa + NFT_MSG_DELSET = 0xb + NFT_MSG_NEWSETELEM = 0xc + NFT_MSG_GETSETELEM = 0xd + NFT_MSG_DELSETELEM = 0xe + NFT_MSG_NEWGEN = 0xf + NFT_MSG_GETGEN = 0x10 + NFT_MSG_TRACE = 0x11 + NFT_MSG_NEWOBJ = 0x12 + NFT_MSG_GETOBJ = 0x13 + NFT_MSG_DELOBJ = 0x14 + NFT_MSG_GETOBJ_RESET = 0x15 + NFT_MSG_MAX = 0x19 + NFTA_LIST_UNPEC = 0x0 + NFTA_LIST_ELEM = 0x1 + NFTA_HOOK_UNSPEC = 0x0 + NFTA_HOOK_HOOKNUM = 0x1 + NFTA_HOOK_PRIORITY = 0x2 + NFTA_HOOK_DEV = 0x3 + NFT_TABLE_F_DORMANT = 0x1 + NFTA_TABLE_UNSPEC = 0x0 + NFTA_TABLE_NAME = 0x1 + NFTA_TABLE_FLAGS = 0x2 + NFTA_TABLE_USE = 0x3 + NFTA_CHAIN_UNSPEC = 0x0 + NFTA_CHAIN_TABLE = 0x1 + NFTA_CHAIN_HANDLE = 0x2 + NFTA_CHAIN_NAME = 0x3 + NFTA_CHAIN_HOOK = 0x4 + NFTA_CHAIN_POLICY = 0x5 + NFTA_CHAIN_USE = 0x6 + NFTA_CHAIN_TYPE = 0x7 + NFTA_CHAIN_COUNTERS = 0x8 + NFTA_CHAIN_PAD = 0x9 + NFTA_RULE_UNSPEC = 0x0 + NFTA_RULE_TABLE = 0x1 + NFTA_RULE_CHAIN = 0x2 + NFTA_RULE_HANDLE = 0x3 + NFTA_RULE_EXPRESSIONS = 0x4 + NFTA_RULE_COMPAT = 0x5 + NFTA_RULE_POSITION = 0x6 + NFTA_RULE_USERDATA = 0x7 + NFTA_RULE_PAD = 0x8 + NFTA_RULE_ID = 0x9 + NFT_RULE_COMPAT_F_INV = 0x2 + NFT_RULE_COMPAT_F_MASK = 0x2 + NFTA_RULE_COMPAT_UNSPEC = 0x0 + NFTA_RULE_COMPAT_PROTO = 0x1 + NFTA_RULE_COMPAT_FLAGS = 0x2 + NFT_SET_ANONYMOUS = 0x1 + NFT_SET_CONSTANT = 0x2 + NFT_SET_INTERVAL = 0x4 + NFT_SET_MAP = 0x8 + NFT_SET_TIMEOUT = 0x10 + NFT_SET_EVAL = 0x20 + NFT_SET_OBJECT = 0x40 + NFT_SET_POL_PERFORMANCE = 0x0 + NFT_SET_POL_MEMORY = 0x1 + NFTA_SET_DESC_UNSPEC = 0x0 + NFTA_SET_DESC_SIZE = 0x1 + NFTA_SET_UNSPEC = 0x0 + NFTA_SET_TABLE = 0x1 + NFTA_SET_NAME = 0x2 + NFTA_SET_FLAGS = 0x3 + NFTA_SET_KEY_TYPE = 0x4 + NFTA_SET_KEY_LEN = 0x5 + NFTA_SET_DATA_TYPE = 0x6 + NFTA_SET_DATA_LEN = 0x7 + NFTA_SET_POLICY = 0x8 + NFTA_SET_DESC = 0x9 + NFTA_SET_ID = 0xa + NFTA_SET_TIMEOUT = 0xb + NFTA_SET_GC_INTERVAL = 0xc + NFTA_SET_USERDATA = 0xd + NFTA_SET_PAD = 0xe + NFTA_SET_OBJ_TYPE = 0xf + NFT_SET_ELEM_INTERVAL_END = 0x1 + NFTA_SET_ELEM_UNSPEC = 0x0 + NFTA_SET_ELEM_KEY = 0x1 + NFTA_SET_ELEM_DATA = 0x2 + NFTA_SET_ELEM_FLAGS = 0x3 + NFTA_SET_ELEM_TIMEOUT = 0x4 + NFTA_SET_ELEM_EXPIRATION = 0x5 + NFTA_SET_ELEM_USERDATA = 0x6 + NFTA_SET_ELEM_EXPR = 0x7 + NFTA_SET_ELEM_PAD = 0x8 + NFTA_SET_ELEM_OBJREF = 0x9 + NFTA_SET_ELEM_LIST_UNSPEC = 0x0 + NFTA_SET_ELEM_LIST_TABLE = 0x1 + NFTA_SET_ELEM_LIST_SET = 0x2 + NFTA_SET_ELEM_LIST_ELEMENTS = 0x3 + NFTA_SET_ELEM_LIST_SET_ID = 0x4 + NFT_DATA_VALUE = 0x0 + NFT_DATA_VERDICT = 0xffffff00 + NFTA_DATA_UNSPEC = 0x0 + NFTA_DATA_VALUE = 0x1 + NFTA_DATA_VERDICT = 0x2 + NFTA_VERDICT_UNSPEC = 0x0 + NFTA_VERDICT_CODE = 0x1 + NFTA_VERDICT_CHAIN = 0x2 + NFTA_EXPR_UNSPEC = 0x0 + NFTA_EXPR_NAME = 0x1 + NFTA_EXPR_DATA = 0x2 + NFTA_IMMEDIATE_UNSPEC = 0x0 + NFTA_IMMEDIATE_DREG = 0x1 + NFTA_IMMEDIATE_DATA = 0x2 + NFTA_BITWISE_UNSPEC = 0x0 + NFTA_BITWISE_SREG = 0x1 + NFTA_BITWISE_DREG = 0x2 + NFTA_BITWISE_LEN = 0x3 + NFTA_BITWISE_MASK = 0x4 + NFTA_BITWISE_XOR = 0x5 + NFT_BYTEORDER_NTOH = 0x0 + NFT_BYTEORDER_HTON = 0x1 + NFTA_BYTEORDER_UNSPEC = 0x0 + NFTA_BYTEORDER_SREG = 0x1 + NFTA_BYTEORDER_DREG = 0x2 + NFTA_BYTEORDER_OP = 0x3 + NFTA_BYTEORDER_LEN = 0x4 + NFTA_BYTEORDER_SIZE = 0x5 + NFT_CMP_EQ = 0x0 + NFT_CMP_NEQ = 0x1 + NFT_CMP_LT = 0x2 + NFT_CMP_LTE = 0x3 + NFT_CMP_GT = 0x4 + NFT_CMP_GTE = 0x5 + NFTA_CMP_UNSPEC = 0x0 + NFTA_CMP_SREG = 0x1 + NFTA_CMP_OP = 0x2 + NFTA_CMP_DATA = 0x3 + NFT_RANGE_EQ = 0x0 + NFT_RANGE_NEQ = 0x1 + NFTA_RANGE_UNSPEC = 0x0 + NFTA_RANGE_SREG = 0x1 + NFTA_RANGE_OP = 0x2 + NFTA_RANGE_FROM_DATA = 0x3 + NFTA_RANGE_TO_DATA = 0x4 + NFT_LOOKUP_F_INV = 0x1 + NFTA_LOOKUP_UNSPEC = 0x0 + NFTA_LOOKUP_SET = 0x1 + NFTA_LOOKUP_SREG = 0x2 + NFTA_LOOKUP_DREG = 0x3 + NFTA_LOOKUP_SET_ID = 0x4 + NFTA_LOOKUP_FLAGS = 0x5 + NFT_DYNSET_OP_ADD = 0x0 + NFT_DYNSET_OP_UPDATE = 0x1 + NFT_DYNSET_F_INV = 0x1 + NFTA_DYNSET_UNSPEC = 0x0 + NFTA_DYNSET_SET_NAME = 0x1 + NFTA_DYNSET_SET_ID = 0x2 + NFTA_DYNSET_OP = 0x3 + NFTA_DYNSET_SREG_KEY = 0x4 + NFTA_DYNSET_SREG_DATA = 0x5 + NFTA_DYNSET_TIMEOUT = 0x6 + NFTA_DYNSET_EXPR = 0x7 + NFTA_DYNSET_PAD = 0x8 + NFTA_DYNSET_FLAGS = 0x9 + NFT_PAYLOAD_LL_HEADER = 0x0 + NFT_PAYLOAD_NETWORK_HEADER = 0x1 + NFT_PAYLOAD_TRANSPORT_HEADER = 0x2 + NFT_PAYLOAD_CSUM_NONE = 0x0 + NFT_PAYLOAD_CSUM_INET = 0x1 + NFT_PAYLOAD_L4CSUM_PSEUDOHDR = 0x1 + NFTA_PAYLOAD_UNSPEC = 0x0 + NFTA_PAYLOAD_DREG = 0x1 + NFTA_PAYLOAD_BASE = 0x2 + NFTA_PAYLOAD_OFFSET = 0x3 + NFTA_PAYLOAD_LEN = 0x4 + NFTA_PAYLOAD_SREG = 0x5 + NFTA_PAYLOAD_CSUM_TYPE = 0x6 + NFTA_PAYLOAD_CSUM_OFFSET = 0x7 + NFTA_PAYLOAD_CSUM_FLAGS = 0x8 + NFT_EXTHDR_F_PRESENT = 0x1 + NFT_EXTHDR_OP_IPV6 = 0x0 + NFT_EXTHDR_OP_TCPOPT = 0x1 + NFTA_EXTHDR_UNSPEC = 0x0 + NFTA_EXTHDR_DREG = 0x1 + NFTA_EXTHDR_TYPE = 0x2 + NFTA_EXTHDR_OFFSET = 0x3 + NFTA_EXTHDR_LEN = 0x4 + NFTA_EXTHDR_FLAGS = 0x5 + NFTA_EXTHDR_OP = 0x6 + NFTA_EXTHDR_SREG = 0x7 + NFT_META_LEN = 0x0 + NFT_META_PROTOCOL = 0x1 + NFT_META_PRIORITY = 0x2 + NFT_META_MARK = 0x3 + NFT_META_IIF = 0x4 + NFT_META_OIF = 0x5 + NFT_META_IIFNAME = 0x6 + NFT_META_OIFNAME = 0x7 + NFT_META_IIFTYPE = 0x8 + NFT_META_OIFTYPE = 0x9 + NFT_META_SKUID = 0xa + NFT_META_SKGID = 0xb + NFT_META_NFTRACE = 0xc + NFT_META_RTCLASSID = 0xd + NFT_META_SECMARK = 0xe + NFT_META_NFPROTO = 0xf + NFT_META_L4PROTO = 0x10 + NFT_META_BRI_IIFNAME = 0x11 + NFT_META_BRI_OIFNAME = 0x12 + NFT_META_PKTTYPE = 0x13 + NFT_META_CPU = 0x14 + NFT_META_IIFGROUP = 0x15 + NFT_META_OIFGROUP = 0x16 + NFT_META_CGROUP = 0x17 + NFT_META_PRANDOM = 0x18 + NFT_RT_CLASSID = 0x0 + NFT_RT_NEXTHOP4 = 0x1 + NFT_RT_NEXTHOP6 = 0x2 + NFT_RT_TCPMSS = 0x3 + NFT_HASH_JENKINS = 0x0 + NFT_HASH_SYM = 0x1 + NFTA_HASH_UNSPEC = 0x0 + NFTA_HASH_SREG = 0x1 + NFTA_HASH_DREG = 0x2 + NFTA_HASH_LEN = 0x3 + NFTA_HASH_MODULUS = 0x4 + NFTA_HASH_SEED = 0x5 + NFTA_HASH_OFFSET = 0x6 + NFTA_HASH_TYPE = 0x7 + NFTA_META_UNSPEC = 0x0 + NFTA_META_DREG = 0x1 + NFTA_META_KEY = 0x2 + NFTA_META_SREG = 0x3 + NFTA_RT_UNSPEC = 0x0 + NFTA_RT_DREG = 0x1 + NFTA_RT_KEY = 0x2 + NFT_CT_STATE = 0x0 + NFT_CT_DIRECTION = 0x1 + NFT_CT_STATUS = 0x2 + NFT_CT_MARK = 0x3 + NFT_CT_SECMARK = 0x4 + NFT_CT_EXPIRATION = 0x5 + NFT_CT_HELPER = 0x6 + NFT_CT_L3PROTOCOL = 0x7 + NFT_CT_SRC = 0x8 + NFT_CT_DST = 0x9 + NFT_CT_PROTOCOL = 0xa + NFT_CT_PROTO_SRC = 0xb + NFT_CT_PROTO_DST = 0xc + NFT_CT_LABELS = 0xd + NFT_CT_PKTS = 0xe + NFT_CT_BYTES = 0xf + NFT_CT_AVGPKT = 0x10 + NFT_CT_ZONE = 0x11 + NFT_CT_EVENTMASK = 0x12 + NFTA_CT_UNSPEC = 0x0 + NFTA_CT_DREG = 0x1 + NFTA_CT_KEY = 0x2 + NFTA_CT_DIRECTION = 0x3 + NFTA_CT_SREG = 0x4 + NFT_LIMIT_PKTS = 0x0 + NFT_LIMIT_PKT_BYTES = 0x1 + NFT_LIMIT_F_INV = 0x1 + NFTA_LIMIT_UNSPEC = 0x0 + NFTA_LIMIT_RATE = 0x1 + NFTA_LIMIT_UNIT = 0x2 + NFTA_LIMIT_BURST = 0x3 + NFTA_LIMIT_TYPE = 0x4 + NFTA_LIMIT_FLAGS = 0x5 + NFTA_LIMIT_PAD = 0x6 + NFTA_COUNTER_UNSPEC = 0x0 + NFTA_COUNTER_BYTES = 0x1 + NFTA_COUNTER_PACKETS = 0x2 + NFTA_COUNTER_PAD = 0x3 + NFTA_LOG_UNSPEC = 0x0 + NFTA_LOG_GROUP = 0x1 + NFTA_LOG_PREFIX = 0x2 + NFTA_LOG_SNAPLEN = 0x3 + NFTA_LOG_QTHRESHOLD = 0x4 + NFTA_LOG_LEVEL = 0x5 + NFTA_LOG_FLAGS = 0x6 + NFTA_QUEUE_UNSPEC = 0x0 + NFTA_QUEUE_NUM = 0x1 + NFTA_QUEUE_TOTAL = 0x2 + NFTA_QUEUE_FLAGS = 0x3 + NFTA_QUEUE_SREG_QNUM = 0x4 + NFT_QUOTA_F_INV = 0x1 + NFT_QUOTA_F_DEPLETED = 0x2 + NFTA_QUOTA_UNSPEC = 0x0 + NFTA_QUOTA_BYTES = 0x1 + NFTA_QUOTA_FLAGS = 0x2 + NFTA_QUOTA_PAD = 0x3 + NFTA_QUOTA_CONSUMED = 0x4 + NFT_REJECT_ICMP_UNREACH = 0x0 + NFT_REJECT_TCP_RST = 0x1 + NFT_REJECT_ICMPX_UNREACH = 0x2 + NFT_REJECT_ICMPX_NO_ROUTE = 0x0 + NFT_REJECT_ICMPX_PORT_UNREACH = 0x1 + NFT_REJECT_ICMPX_HOST_UNREACH = 0x2 + NFT_REJECT_ICMPX_ADMIN_PROHIBITED = 0x3 + NFTA_REJECT_UNSPEC = 0x0 + NFTA_REJECT_TYPE = 0x1 + NFTA_REJECT_ICMP_CODE = 0x2 + NFT_NAT_SNAT = 0x0 + NFT_NAT_DNAT = 0x1 + NFTA_NAT_UNSPEC = 0x0 + NFTA_NAT_TYPE = 0x1 + NFTA_NAT_FAMILY = 0x2 + NFTA_NAT_REG_ADDR_MIN = 0x3 + NFTA_NAT_REG_ADDR_MAX = 0x4 + NFTA_NAT_REG_PROTO_MIN = 0x5 + NFTA_NAT_REG_PROTO_MAX = 0x6 + NFTA_NAT_FLAGS = 0x7 + NFTA_MASQ_UNSPEC = 0x0 + NFTA_MASQ_FLAGS = 0x1 + NFTA_MASQ_REG_PROTO_MIN = 0x2 + NFTA_MASQ_REG_PROTO_MAX = 0x3 + NFTA_REDIR_UNSPEC = 0x0 + NFTA_REDIR_REG_PROTO_MIN = 0x1 + NFTA_REDIR_REG_PROTO_MAX = 0x2 + NFTA_REDIR_FLAGS = 0x3 + NFTA_DUP_UNSPEC = 0x0 + NFTA_DUP_SREG_ADDR = 0x1 + NFTA_DUP_SREG_DEV = 0x2 + NFTA_FWD_UNSPEC = 0x0 + NFTA_FWD_SREG_DEV = 0x1 + NFTA_OBJREF_UNSPEC = 0x0 + NFTA_OBJREF_IMM_TYPE = 0x1 + NFTA_OBJREF_IMM_NAME = 0x2 + NFTA_OBJREF_SET_SREG = 0x3 + NFTA_OBJREF_SET_NAME = 0x4 + NFTA_OBJREF_SET_ID = 0x5 + NFTA_GEN_UNSPEC = 0x0 + NFTA_GEN_ID = 0x1 + NFTA_GEN_PROC_PID = 0x2 + NFTA_GEN_PROC_NAME = 0x3 + NFTA_FIB_UNSPEC = 0x0 + NFTA_FIB_DREG = 0x1 + NFTA_FIB_RESULT = 0x2 + NFTA_FIB_FLAGS = 0x3 + NFT_FIB_RESULT_UNSPEC = 0x0 + NFT_FIB_RESULT_OIF = 0x1 + NFT_FIB_RESULT_OIFNAME = 0x2 + NFT_FIB_RESULT_ADDRTYPE = 0x3 + NFTA_FIB_F_SADDR = 0x1 + NFTA_FIB_F_DADDR = 0x2 + NFTA_FIB_F_MARK = 0x4 + NFTA_FIB_F_IIF = 0x8 + NFTA_FIB_F_OIF = 0x10 + NFTA_FIB_F_PRESENT = 0x20 + NFTA_CT_HELPER_UNSPEC = 0x0 + NFTA_CT_HELPER_NAME = 0x1 + NFTA_CT_HELPER_L3PROTO = 0x2 + NFTA_CT_HELPER_L4PROTO = 0x3 + NFTA_OBJ_UNSPEC = 0x0 + NFTA_OBJ_TABLE = 0x1 + NFTA_OBJ_NAME = 0x2 + NFTA_OBJ_TYPE = 0x3 + NFTA_OBJ_DATA = 0x4 + NFTA_OBJ_USE = 0x5 + NFTA_TRACE_UNSPEC = 0x0 + NFTA_TRACE_TABLE = 0x1 + NFTA_TRACE_CHAIN = 0x2 + NFTA_TRACE_RULE_HANDLE = 0x3 + NFTA_TRACE_TYPE = 0x4 + NFTA_TRACE_VERDICT = 0x5 + NFTA_TRACE_ID = 0x6 + NFTA_TRACE_LL_HEADER = 0x7 + NFTA_TRACE_NETWORK_HEADER = 0x8 + NFTA_TRACE_TRANSPORT_HEADER = 0x9 + NFTA_TRACE_IIF = 0xa + NFTA_TRACE_IIFTYPE = 0xb + NFTA_TRACE_OIF = 0xc + NFTA_TRACE_OIFTYPE = 0xd + NFTA_TRACE_MARK = 0xe + NFTA_TRACE_NFPROTO = 0xf + NFTA_TRACE_POLICY = 0x10 + NFTA_TRACE_PAD = 0x11 + NFT_TRACETYPE_UNSPEC = 0x0 + NFT_TRACETYPE_POLICY = 0x1 + NFT_TRACETYPE_RETURN = 0x2 + NFT_TRACETYPE_RULE = 0x3 + NFTA_NG_UNSPEC = 0x0 + NFTA_NG_DREG = 0x1 + NFTA_NG_MODULUS = 0x2 + NFTA_NG_TYPE = 0x3 + NFTA_NG_OFFSET = 0x4 + NFT_NG_INCREMENTAL = 0x0 + NFT_NG_RANDOM = 0x1 +) diff --git a/api/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go b/api/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go new file mode 100644 index 0000000..9ddd470 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go @@ -0,0 +1,1824 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build ppc64,linux + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Timex struct { + Modes uint32 + _ [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + _ [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + _ [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + _ [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + Ino uint64 + Nlink uint64 + Mode uint32 + Uid uint32 + Gid uint32 + _ int32 + Rdev uint64 + Size int64 + Blksize int64 + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + _ uint64 + _ uint64 + _ uint64 +} + +type StatxTimestamp struct { + Sec int64 + Nsec uint32 + _ int32 +} + +type Statx_t struct { + Mask uint32 + Blksize uint32 + Attributes uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Mode uint16 + _ [1]uint16 + Ino uint64 + Size uint64 + Blocks uint64 + Attributes_mask uint64 + Atime StatxTimestamp + Btime StatxTimestamp + Ctime StatxTimestamp + Mtime StatxTimestamp + Rdev_major uint32 + Rdev_minor uint32 + Dev_major uint32 + Dev_minor uint32 + _ [14]uint64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]uint8 + _ [5]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + _ [4]byte + Start int64 + Len int64 + Pid int32 + _ [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrL2 struct { + Family uint16 + Psm uint16 + Bdaddr [6]uint8 + Cid uint16 + Bdaddr_type uint8 + _ [1]byte +} + +type RawSockaddrCAN struct { + Family uint16 + _ [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]uint8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]uint8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + _ [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + _ [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + _ [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrL2 = 0xe + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x10 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_NUM_VF = 0x15 + IFLA_VFINFO_LIST = 0x16 + IFLA_STATS64 = 0x17 + IFLA_VF_PORTS = 0x18 + IFLA_PORT_SELF = 0x19 + IFLA_AF_SPEC = 0x1a + IFLA_GROUP = 0x1b + IFLA_NET_NS_FD = 0x1c + IFLA_EXT_MASK = 0x1d + IFLA_PROMISCUITY = 0x1e + IFLA_NUM_TX_QUEUES = 0x1f + IFLA_NUM_RX_QUEUES = 0x20 + IFLA_CARRIER = 0x21 + IFLA_PHYS_PORT_ID = 0x22 + IFLA_CARRIER_CHANGES = 0x23 + IFLA_PHYS_SWITCH_ID = 0x24 + IFLA_LINK_NETNSID = 0x25 + IFLA_PHYS_PORT_NAME = 0x26 + IFLA_PROTO_DOWN = 0x27 + IFLA_GSO_MAX_SEGS = 0x28 + IFLA_GSO_MAX_SIZE = 0x29 + IFLA_PAD = 0x2a + IFLA_XDP = 0x2b + IFLA_EVENT = 0x2c + IFLA_NEW_NETNSID = 0x2d + IFLA_IF_NETNSID = 0x2e + IFLA_MAX = 0x31 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + _ uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + _ [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Gpr [32]uint64 + Nip uint64 + Msr uint64 + Orig_gpr3 uint64 + Ctr uint64 + Link uint64 + Xer uint64 + Ccr uint64 + Softe uint64 + Trap uint64 + Dar uint64 + Dsisr uint64 + Result uint64 +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + _ [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + _ [0]uint8 + _ [4]byte +} + +type Utsname struct { + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte +} + +type Ustat_t struct { + Tfree int32 + _ [4]byte + Tinode uint64 + Fname [6]uint8 + Fpack [6]uint8 + _ [4]byte +} + +type EpollEvent struct { + Events uint32 + _ int32 + Fd int32 + Pad int32 +} + +const ( + AT_EMPTY_PATH = 0x1000 + AT_FDCWD = -0x64 + AT_NO_AUTOMOUNT = 0x800 + AT_REMOVEDIR = 0x200 + + AT_STATX_SYNC_AS_STAT = 0x0 + AT_STATX_FORCE_SYNC = 0x2000 + AT_STATX_DONT_SYNC = 0x4000 + + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + Val [16]uint64 +} + +const RNDGETENTCNT = 0x40045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [19]uint8 + Line uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + _ [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + _ [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]uint8 + Ac_sched uint8 + Ac_pad [3]uint8 + _ [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + _ [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type CGroupStats struct { + Sleeping uint64 + Running uint64 + Stopped uint64 + Uninterruptible uint64 + Io_wait uint64 +} + +const ( + CGROUPSTATS_CMD_UNSPEC = 0x3 + CGROUPSTATS_CMD_GET = 0x4 + CGROUPSTATS_CMD_NEW = 0x5 + CGROUPSTATS_TYPE_UNSPEC = 0x0 + CGROUPSTATS_TYPE_CGROUP_STATS = 0x1 + CGROUPSTATS_CMD_ATTR_UNSPEC = 0x0 + CGROUPSTATS_CMD_ATTR_FD = 0x1 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) + +type cpuMask uint64 + +const ( + _CPU_SETSIZE = 0x400 + _NCPUBITS = 0x40 +) + +const ( + BDADDR_BREDR = 0x0 + BDADDR_LE_PUBLIC = 0x1 + BDADDR_LE_RANDOM = 0x2 +) + +type PerfEventAttr struct { + Type uint32 + Size uint32 + Config uint64 + Sample uint64 + Sample_type uint64 + Read_format uint64 + Bits uint64 + Wakeup uint32 + Bp_type uint32 + Ext1 uint64 + Ext2 uint64 + Branch_sample_type uint64 + Sample_regs_user uint64 + Sample_stack_user uint32 + Clockid int32 + Sample_regs_intr uint64 + Aux_watermark uint32 + _ uint32 +} + +type PerfEventMmapPage struct { + Version uint32 + Compat_version uint32 + Lock uint32 + Index uint32 + Offset int64 + Time_enabled uint64 + Time_running uint64 + Capabilities uint64 + Pmc_width uint16 + Time_shift uint16 + Time_mult uint32 + Time_offset uint64 + Time_zero uint64 + Size uint32 + _ [948]uint8 + Data_head uint64 + Data_tail uint64 + Data_offset uint64 + Data_size uint64 + Aux_head uint64 + Aux_tail uint64 + Aux_offset uint64 + Aux_size uint64 +} + +const ( + PerfBitDisabled uint64 = CBitFieldMaskBit0 + PerfBitInherit = CBitFieldMaskBit1 + PerfBitPinned = CBitFieldMaskBit2 + PerfBitExclusive = CBitFieldMaskBit3 + PerfBitExcludeUser = CBitFieldMaskBit4 + PerfBitExcludeKernel = CBitFieldMaskBit5 + PerfBitExcludeHv = CBitFieldMaskBit6 + PerfBitExcludeIdle = CBitFieldMaskBit7 + PerfBitMmap = CBitFieldMaskBit8 + PerfBitComm = CBitFieldMaskBit9 + PerfBitFreq = CBitFieldMaskBit10 + PerfBitInheritStat = CBitFieldMaskBit11 + PerfBitEnableOnExec = CBitFieldMaskBit12 + PerfBitTask = CBitFieldMaskBit13 + PerfBitWatermark = CBitFieldMaskBit14 + PerfBitPreciseIPBit1 = CBitFieldMaskBit15 + PerfBitPreciseIPBit2 = CBitFieldMaskBit16 + PerfBitMmapData = CBitFieldMaskBit17 + PerfBitSampleIDAll = CBitFieldMaskBit18 + PerfBitExcludeHost = CBitFieldMaskBit19 + PerfBitExcludeGuest = CBitFieldMaskBit20 + PerfBitExcludeCallchainKernel = CBitFieldMaskBit21 + PerfBitExcludeCallchainUser = CBitFieldMaskBit22 + PerfBitMmap2 = CBitFieldMaskBit23 + PerfBitCommExec = CBitFieldMaskBit24 + PerfBitUseClockID = CBitFieldMaskBit25 + PerfBitContextSwitch = CBitFieldMaskBit26 +) + +const ( + PERF_TYPE_HARDWARE = 0x0 + PERF_TYPE_SOFTWARE = 0x1 + PERF_TYPE_TRACEPOINT = 0x2 + PERF_TYPE_HW_CACHE = 0x3 + PERF_TYPE_RAW = 0x4 + PERF_TYPE_BREAKPOINT = 0x5 + + PERF_COUNT_HW_CPU_CYCLES = 0x0 + PERF_COUNT_HW_INSTRUCTIONS = 0x1 + PERF_COUNT_HW_CACHE_REFERENCES = 0x2 + PERF_COUNT_HW_CACHE_MISSES = 0x3 + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 0x4 + PERF_COUNT_HW_BRANCH_MISSES = 0x5 + PERF_COUNT_HW_BUS_CYCLES = 0x6 + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7 + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 0x8 + PERF_COUNT_HW_REF_CPU_CYCLES = 0x9 + + PERF_COUNT_HW_CACHE_L1D = 0x0 + PERF_COUNT_HW_CACHE_L1I = 0x1 + PERF_COUNT_HW_CACHE_LL = 0x2 + PERF_COUNT_HW_CACHE_DTLB = 0x3 + PERF_COUNT_HW_CACHE_ITLB = 0x4 + PERF_COUNT_HW_CACHE_BPU = 0x5 + PERF_COUNT_HW_CACHE_NODE = 0x6 + + PERF_COUNT_HW_CACHE_OP_READ = 0x0 + PERF_COUNT_HW_CACHE_OP_WRITE = 0x1 + PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2 + + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0 + PERF_COUNT_HW_CACHE_RESULT_MISS = 0x1 + + PERF_COUNT_SW_CPU_CLOCK = 0x0 + PERF_COUNT_SW_TASK_CLOCK = 0x1 + PERF_COUNT_SW_PAGE_FAULTS = 0x2 + PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3 + PERF_COUNT_SW_CPU_MIGRATIONS = 0x4 + PERF_COUNT_SW_PAGE_FAULTS_MIN = 0x5 + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 0x6 + PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 + PERF_COUNT_SW_EMULATION_FAULTS = 0x8 + PERF_COUNT_SW_DUMMY = 0x9 + + PERF_SAMPLE_IP = 0x1 + PERF_SAMPLE_TID = 0x2 + PERF_SAMPLE_TIME = 0x4 + PERF_SAMPLE_ADDR = 0x8 + PERF_SAMPLE_READ = 0x10 + PERF_SAMPLE_CALLCHAIN = 0x20 + PERF_SAMPLE_ID = 0x40 + PERF_SAMPLE_CPU = 0x80 + PERF_SAMPLE_PERIOD = 0x100 + PERF_SAMPLE_STREAM_ID = 0x200 + PERF_SAMPLE_RAW = 0x400 + PERF_SAMPLE_BRANCH_STACK = 0x800 + + PERF_SAMPLE_BRANCH_USER = 0x1 + PERF_SAMPLE_BRANCH_KERNEL = 0x2 + PERF_SAMPLE_BRANCH_HV = 0x4 + PERF_SAMPLE_BRANCH_ANY = 0x8 + PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 + PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 + PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + + PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 + PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 + PERF_FORMAT_ID = 0x4 + PERF_FORMAT_GROUP = 0x8 + + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + + PERF_CONTEXT_HV = -0x20 + PERF_CONTEXT_KERNEL = -0x80 + PERF_CONTEXT_USER = -0x200 + + PERF_CONTEXT_GUEST = -0x800 + PERF_CONTEXT_GUEST_KERNEL = -0x880 + PERF_CONTEXT_GUEST_USER = -0xa00 + + PERF_FLAG_FD_NO_GROUP = 0x1 + PERF_FLAG_FD_OUTPUT = 0x2 + PERF_FLAG_PID_CGROUP = 0x4 +) + +const ( + CBitFieldMaskBit0 = 0x8000000000000000 + CBitFieldMaskBit1 = 0x4000000000000000 + CBitFieldMaskBit2 = 0x2000000000000000 + CBitFieldMaskBit3 = 0x1000000000000000 + CBitFieldMaskBit4 = 0x800000000000000 + CBitFieldMaskBit5 = 0x400000000000000 + CBitFieldMaskBit6 = 0x200000000000000 + CBitFieldMaskBit7 = 0x100000000000000 + CBitFieldMaskBit8 = 0x80000000000000 + CBitFieldMaskBit9 = 0x40000000000000 + CBitFieldMaskBit10 = 0x20000000000000 + CBitFieldMaskBit11 = 0x10000000000000 + CBitFieldMaskBit12 = 0x8000000000000 + CBitFieldMaskBit13 = 0x4000000000000 + CBitFieldMaskBit14 = 0x2000000000000 + CBitFieldMaskBit15 = 0x1000000000000 + CBitFieldMaskBit16 = 0x800000000000 + CBitFieldMaskBit17 = 0x400000000000 + CBitFieldMaskBit18 = 0x200000000000 + CBitFieldMaskBit19 = 0x100000000000 + CBitFieldMaskBit20 = 0x80000000000 + CBitFieldMaskBit21 = 0x40000000000 + CBitFieldMaskBit22 = 0x20000000000 + CBitFieldMaskBit23 = 0x10000000000 + CBitFieldMaskBit24 = 0x8000000000 + CBitFieldMaskBit25 = 0x4000000000 + CBitFieldMaskBit26 = 0x2000000000 + CBitFieldMaskBit27 = 0x1000000000 + CBitFieldMaskBit28 = 0x800000000 + CBitFieldMaskBit29 = 0x400000000 + CBitFieldMaskBit30 = 0x200000000 + CBitFieldMaskBit31 = 0x100000000 + CBitFieldMaskBit32 = 0x80000000 + CBitFieldMaskBit33 = 0x40000000 + CBitFieldMaskBit34 = 0x20000000 + CBitFieldMaskBit35 = 0x10000000 + CBitFieldMaskBit36 = 0x8000000 + CBitFieldMaskBit37 = 0x4000000 + CBitFieldMaskBit38 = 0x2000000 + CBitFieldMaskBit39 = 0x1000000 + CBitFieldMaskBit40 = 0x800000 + CBitFieldMaskBit41 = 0x400000 + CBitFieldMaskBit42 = 0x200000 + CBitFieldMaskBit43 = 0x100000 + CBitFieldMaskBit44 = 0x80000 + CBitFieldMaskBit45 = 0x40000 + CBitFieldMaskBit46 = 0x20000 + CBitFieldMaskBit47 = 0x10000 + CBitFieldMaskBit48 = 0x8000 + CBitFieldMaskBit49 = 0x4000 + CBitFieldMaskBit50 = 0x2000 + CBitFieldMaskBit51 = 0x1000 + CBitFieldMaskBit52 = 0x800 + CBitFieldMaskBit53 = 0x400 + CBitFieldMaskBit54 = 0x200 + CBitFieldMaskBit55 = 0x100 + CBitFieldMaskBit56 = 0x80 + CBitFieldMaskBit57 = 0x40 + CBitFieldMaskBit58 = 0x20 + CBitFieldMaskBit59 = 0x10 + CBitFieldMaskBit60 = 0x8 + CBitFieldMaskBit61 = 0x4 + CBitFieldMaskBit62 = 0x2 + CBitFieldMaskBit63 = 0x1 +) + +type SockaddrStorage struct { + Family uint16 + _ [118]uint8 + _ uint64 +} + +type TCPMD5Sig struct { + Addr SockaddrStorage + Flags uint8 + Prefixlen uint8 + Keylen uint16 + _ uint32 + Key [80]uint8 +} + +type HDDriveCmdHdr struct { + Command uint8 + Number uint8 + Feature uint8 + Count uint8 +} + +type HDGeometry struct { + Heads uint8 + Sectors uint8 + Cylinders uint16 + _ [4]byte + Start uint64 +} + +type HDDriveID struct { + Config uint16 + Cyls uint16 + Reserved2 uint16 + Heads uint16 + Track_bytes uint16 + Sector_bytes uint16 + Sectors uint16 + Vendor0 uint16 + Vendor1 uint16 + Vendor2 uint16 + Serial_no [20]uint8 + Buf_type uint16 + Buf_size uint16 + Ecc_bytes uint16 + Fw_rev [8]uint8 + Model [40]uint8 + Max_multsect uint8 + Vendor3 uint8 + Dword_io uint16 + Vendor4 uint8 + Capability uint8 + Reserved50 uint16 + Vendor5 uint8 + TPIO uint8 + Vendor6 uint8 + TDMA uint8 + Field_valid uint16 + Cur_cyls uint16 + Cur_heads uint16 + Cur_sectors uint16 + Cur_capacity0 uint16 + Cur_capacity1 uint16 + Multsect uint8 + Multsect_valid uint8 + Lba_capacity uint32 + Dma_1word uint16 + Dma_mword uint16 + Eide_pio_modes uint16 + Eide_dma_min uint16 + Eide_dma_time uint16 + Eide_pio uint16 + Eide_pio_iordy uint16 + Words69_70 [2]uint16 + Words71_74 [4]uint16 + Queue_depth uint16 + Words76_79 [4]uint16 + Major_rev_num uint16 + Minor_rev_num uint16 + Command_set_1 uint16 + Command_set_2 uint16 + Cfsse uint16 + Cfs_enable_1 uint16 + Cfs_enable_2 uint16 + Csf_default uint16 + Dma_ultra uint16 + Trseuc uint16 + TrsEuc uint16 + CurAPMvalues uint16 + Mprc uint16 + Hw_config uint16 + Acoustic uint16 + Msrqs uint16 + Sxfert uint16 + Sal uint16 + Spg uint32 + Lba_capacity_2 uint64 + Words104_125 [22]uint16 + Last_lun uint16 + Word127 uint16 + Dlf uint16 + Csfo uint16 + Words130_155 [26]uint16 + Word156 uint16 + Words157_159 [3]uint16 + Cfa_power uint16 + Words161_175 [15]uint16 + Words176_205 [30]uint16 + Words206_254 [49]uint16 + Integrity_word uint16 +} + +type Statfs_t struct { + Type int64 + Bsize int64 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen int64 + Frsize int64 + Flags int64 + Spare [4]int64 +} + +const ( + ST_MANDLOCK = 0x40 + ST_NOATIME = 0x400 + ST_NODEV = 0x4 + ST_NODIRATIME = 0x800 + ST_NOEXEC = 0x8 + ST_NOSUID = 0x2 + ST_RDONLY = 0x1 + ST_RELATIME = 0x1000 + ST_SYNCHRONOUS = 0x10 +) + +type TpacketHdr struct { + Status uint64 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Usec uint32 + _ [4]byte +} + +type Tpacket2Hdr struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Nsec uint32 + Vlan_tci uint16 + Vlan_tpid uint16 + _ [4]uint8 +} + +type Tpacket3Hdr struct { + Next_offset uint32 + Sec uint32 + Nsec uint32 + Snaplen uint32 + Len uint32 + Status uint32 + Mac uint16 + Net uint16 + Hv1 TpacketHdrVariant1 + _ [8]uint8 +} + +type TpacketHdrVariant1 struct { + Rxhash uint32 + Vlan_tci uint32 + Vlan_tpid uint16 + _ uint16 +} + +type TpacketBlockDesc struct { + Version uint32 + To_priv uint32 + Hdr [40]byte +} + +type TpacketReq struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 +} + +type TpacketReq3 struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 + Retire_blk_tov uint32 + Sizeof_priv uint32 + Feature_req_word uint32 +} + +type TpacketStats struct { + Packets uint32 + Drops uint32 +} + +type TpacketStatsV3 struct { + Packets uint32 + Drops uint32 + Freeze_q_cnt uint32 +} + +type TpacketAuxdata struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Vlan_tci uint16 + Vlan_tpid uint16 +} + +const ( + TPACKET_V1 = 0x0 + TPACKET_V2 = 0x1 + TPACKET_V3 = 0x2 +) + +const ( + SizeofTpacketHdr = 0x20 + SizeofTpacket2Hdr = 0x20 + SizeofTpacket3Hdr = 0x30 +) + +const ( + NF_INET_PRE_ROUTING = 0x0 + NF_INET_LOCAL_IN = 0x1 + NF_INET_FORWARD = 0x2 + NF_INET_LOCAL_OUT = 0x3 + NF_INET_POST_ROUTING = 0x4 + NF_INET_NUMHOOKS = 0x5 +) + +const ( + NF_NETDEV_INGRESS = 0x0 + NF_NETDEV_NUMHOOKS = 0x1 +) + +const ( + NFPROTO_UNSPEC = 0x0 + NFPROTO_INET = 0x1 + NFPROTO_IPV4 = 0x2 + NFPROTO_ARP = 0x3 + NFPROTO_NETDEV = 0x5 + NFPROTO_BRIDGE = 0x7 + NFPROTO_IPV6 = 0xa + NFPROTO_DECNET = 0xc + NFPROTO_NUMPROTO = 0xd +) + +type Nfgenmsg struct { + Nfgen_family uint8 + Version uint8 + Res_id uint16 +} + +const ( + NFNL_BATCH_UNSPEC = 0x0 + NFNL_BATCH_GENID = 0x1 +) + +const ( + NFT_REG_VERDICT = 0x0 + NFT_REG_1 = 0x1 + NFT_REG_2 = 0x2 + NFT_REG_3 = 0x3 + NFT_REG_4 = 0x4 + NFT_REG32_00 = 0x8 + NFT_REG32_01 = 0x9 + NFT_REG32_02 = 0xa + NFT_REG32_03 = 0xb + NFT_REG32_04 = 0xc + NFT_REG32_05 = 0xd + NFT_REG32_06 = 0xe + NFT_REG32_07 = 0xf + NFT_REG32_08 = 0x10 + NFT_REG32_09 = 0x11 + NFT_REG32_10 = 0x12 + NFT_REG32_11 = 0x13 + NFT_REG32_12 = 0x14 + NFT_REG32_13 = 0x15 + NFT_REG32_14 = 0x16 + NFT_REG32_15 = 0x17 + NFT_CONTINUE = -0x1 + NFT_BREAK = -0x2 + NFT_JUMP = -0x3 + NFT_GOTO = -0x4 + NFT_RETURN = -0x5 + NFT_MSG_NEWTABLE = 0x0 + NFT_MSG_GETTABLE = 0x1 + NFT_MSG_DELTABLE = 0x2 + NFT_MSG_NEWCHAIN = 0x3 + NFT_MSG_GETCHAIN = 0x4 + NFT_MSG_DELCHAIN = 0x5 + NFT_MSG_NEWRULE = 0x6 + NFT_MSG_GETRULE = 0x7 + NFT_MSG_DELRULE = 0x8 + NFT_MSG_NEWSET = 0x9 + NFT_MSG_GETSET = 0xa + NFT_MSG_DELSET = 0xb + NFT_MSG_NEWSETELEM = 0xc + NFT_MSG_GETSETELEM = 0xd + NFT_MSG_DELSETELEM = 0xe + NFT_MSG_NEWGEN = 0xf + NFT_MSG_GETGEN = 0x10 + NFT_MSG_TRACE = 0x11 + NFT_MSG_NEWOBJ = 0x12 + NFT_MSG_GETOBJ = 0x13 + NFT_MSG_DELOBJ = 0x14 + NFT_MSG_GETOBJ_RESET = 0x15 + NFT_MSG_MAX = 0x19 + NFTA_LIST_UNPEC = 0x0 + NFTA_LIST_ELEM = 0x1 + NFTA_HOOK_UNSPEC = 0x0 + NFTA_HOOK_HOOKNUM = 0x1 + NFTA_HOOK_PRIORITY = 0x2 + NFTA_HOOK_DEV = 0x3 + NFT_TABLE_F_DORMANT = 0x1 + NFTA_TABLE_UNSPEC = 0x0 + NFTA_TABLE_NAME = 0x1 + NFTA_TABLE_FLAGS = 0x2 + NFTA_TABLE_USE = 0x3 + NFTA_CHAIN_UNSPEC = 0x0 + NFTA_CHAIN_TABLE = 0x1 + NFTA_CHAIN_HANDLE = 0x2 + NFTA_CHAIN_NAME = 0x3 + NFTA_CHAIN_HOOK = 0x4 + NFTA_CHAIN_POLICY = 0x5 + NFTA_CHAIN_USE = 0x6 + NFTA_CHAIN_TYPE = 0x7 + NFTA_CHAIN_COUNTERS = 0x8 + NFTA_CHAIN_PAD = 0x9 + NFTA_RULE_UNSPEC = 0x0 + NFTA_RULE_TABLE = 0x1 + NFTA_RULE_CHAIN = 0x2 + NFTA_RULE_HANDLE = 0x3 + NFTA_RULE_EXPRESSIONS = 0x4 + NFTA_RULE_COMPAT = 0x5 + NFTA_RULE_POSITION = 0x6 + NFTA_RULE_USERDATA = 0x7 + NFTA_RULE_PAD = 0x8 + NFTA_RULE_ID = 0x9 + NFT_RULE_COMPAT_F_INV = 0x2 + NFT_RULE_COMPAT_F_MASK = 0x2 + NFTA_RULE_COMPAT_UNSPEC = 0x0 + NFTA_RULE_COMPAT_PROTO = 0x1 + NFTA_RULE_COMPAT_FLAGS = 0x2 + NFT_SET_ANONYMOUS = 0x1 + NFT_SET_CONSTANT = 0x2 + NFT_SET_INTERVAL = 0x4 + NFT_SET_MAP = 0x8 + NFT_SET_TIMEOUT = 0x10 + NFT_SET_EVAL = 0x20 + NFT_SET_OBJECT = 0x40 + NFT_SET_POL_PERFORMANCE = 0x0 + NFT_SET_POL_MEMORY = 0x1 + NFTA_SET_DESC_UNSPEC = 0x0 + NFTA_SET_DESC_SIZE = 0x1 + NFTA_SET_UNSPEC = 0x0 + NFTA_SET_TABLE = 0x1 + NFTA_SET_NAME = 0x2 + NFTA_SET_FLAGS = 0x3 + NFTA_SET_KEY_TYPE = 0x4 + NFTA_SET_KEY_LEN = 0x5 + NFTA_SET_DATA_TYPE = 0x6 + NFTA_SET_DATA_LEN = 0x7 + NFTA_SET_POLICY = 0x8 + NFTA_SET_DESC = 0x9 + NFTA_SET_ID = 0xa + NFTA_SET_TIMEOUT = 0xb + NFTA_SET_GC_INTERVAL = 0xc + NFTA_SET_USERDATA = 0xd + NFTA_SET_PAD = 0xe + NFTA_SET_OBJ_TYPE = 0xf + NFT_SET_ELEM_INTERVAL_END = 0x1 + NFTA_SET_ELEM_UNSPEC = 0x0 + NFTA_SET_ELEM_KEY = 0x1 + NFTA_SET_ELEM_DATA = 0x2 + NFTA_SET_ELEM_FLAGS = 0x3 + NFTA_SET_ELEM_TIMEOUT = 0x4 + NFTA_SET_ELEM_EXPIRATION = 0x5 + NFTA_SET_ELEM_USERDATA = 0x6 + NFTA_SET_ELEM_EXPR = 0x7 + NFTA_SET_ELEM_PAD = 0x8 + NFTA_SET_ELEM_OBJREF = 0x9 + NFTA_SET_ELEM_LIST_UNSPEC = 0x0 + NFTA_SET_ELEM_LIST_TABLE = 0x1 + NFTA_SET_ELEM_LIST_SET = 0x2 + NFTA_SET_ELEM_LIST_ELEMENTS = 0x3 + NFTA_SET_ELEM_LIST_SET_ID = 0x4 + NFT_DATA_VALUE = 0x0 + NFT_DATA_VERDICT = 0xffffff00 + NFTA_DATA_UNSPEC = 0x0 + NFTA_DATA_VALUE = 0x1 + NFTA_DATA_VERDICT = 0x2 + NFTA_VERDICT_UNSPEC = 0x0 + NFTA_VERDICT_CODE = 0x1 + NFTA_VERDICT_CHAIN = 0x2 + NFTA_EXPR_UNSPEC = 0x0 + NFTA_EXPR_NAME = 0x1 + NFTA_EXPR_DATA = 0x2 + NFTA_IMMEDIATE_UNSPEC = 0x0 + NFTA_IMMEDIATE_DREG = 0x1 + NFTA_IMMEDIATE_DATA = 0x2 + NFTA_BITWISE_UNSPEC = 0x0 + NFTA_BITWISE_SREG = 0x1 + NFTA_BITWISE_DREG = 0x2 + NFTA_BITWISE_LEN = 0x3 + NFTA_BITWISE_MASK = 0x4 + NFTA_BITWISE_XOR = 0x5 + NFT_BYTEORDER_NTOH = 0x0 + NFT_BYTEORDER_HTON = 0x1 + NFTA_BYTEORDER_UNSPEC = 0x0 + NFTA_BYTEORDER_SREG = 0x1 + NFTA_BYTEORDER_DREG = 0x2 + NFTA_BYTEORDER_OP = 0x3 + NFTA_BYTEORDER_LEN = 0x4 + NFTA_BYTEORDER_SIZE = 0x5 + NFT_CMP_EQ = 0x0 + NFT_CMP_NEQ = 0x1 + NFT_CMP_LT = 0x2 + NFT_CMP_LTE = 0x3 + NFT_CMP_GT = 0x4 + NFT_CMP_GTE = 0x5 + NFTA_CMP_UNSPEC = 0x0 + NFTA_CMP_SREG = 0x1 + NFTA_CMP_OP = 0x2 + NFTA_CMP_DATA = 0x3 + NFT_RANGE_EQ = 0x0 + NFT_RANGE_NEQ = 0x1 + NFTA_RANGE_UNSPEC = 0x0 + NFTA_RANGE_SREG = 0x1 + NFTA_RANGE_OP = 0x2 + NFTA_RANGE_FROM_DATA = 0x3 + NFTA_RANGE_TO_DATA = 0x4 + NFT_LOOKUP_F_INV = 0x1 + NFTA_LOOKUP_UNSPEC = 0x0 + NFTA_LOOKUP_SET = 0x1 + NFTA_LOOKUP_SREG = 0x2 + NFTA_LOOKUP_DREG = 0x3 + NFTA_LOOKUP_SET_ID = 0x4 + NFTA_LOOKUP_FLAGS = 0x5 + NFT_DYNSET_OP_ADD = 0x0 + NFT_DYNSET_OP_UPDATE = 0x1 + NFT_DYNSET_F_INV = 0x1 + NFTA_DYNSET_UNSPEC = 0x0 + NFTA_DYNSET_SET_NAME = 0x1 + NFTA_DYNSET_SET_ID = 0x2 + NFTA_DYNSET_OP = 0x3 + NFTA_DYNSET_SREG_KEY = 0x4 + NFTA_DYNSET_SREG_DATA = 0x5 + NFTA_DYNSET_TIMEOUT = 0x6 + NFTA_DYNSET_EXPR = 0x7 + NFTA_DYNSET_PAD = 0x8 + NFTA_DYNSET_FLAGS = 0x9 + NFT_PAYLOAD_LL_HEADER = 0x0 + NFT_PAYLOAD_NETWORK_HEADER = 0x1 + NFT_PAYLOAD_TRANSPORT_HEADER = 0x2 + NFT_PAYLOAD_CSUM_NONE = 0x0 + NFT_PAYLOAD_CSUM_INET = 0x1 + NFT_PAYLOAD_L4CSUM_PSEUDOHDR = 0x1 + NFTA_PAYLOAD_UNSPEC = 0x0 + NFTA_PAYLOAD_DREG = 0x1 + NFTA_PAYLOAD_BASE = 0x2 + NFTA_PAYLOAD_OFFSET = 0x3 + NFTA_PAYLOAD_LEN = 0x4 + NFTA_PAYLOAD_SREG = 0x5 + NFTA_PAYLOAD_CSUM_TYPE = 0x6 + NFTA_PAYLOAD_CSUM_OFFSET = 0x7 + NFTA_PAYLOAD_CSUM_FLAGS = 0x8 + NFT_EXTHDR_F_PRESENT = 0x1 + NFT_EXTHDR_OP_IPV6 = 0x0 + NFT_EXTHDR_OP_TCPOPT = 0x1 + NFTA_EXTHDR_UNSPEC = 0x0 + NFTA_EXTHDR_DREG = 0x1 + NFTA_EXTHDR_TYPE = 0x2 + NFTA_EXTHDR_OFFSET = 0x3 + NFTA_EXTHDR_LEN = 0x4 + NFTA_EXTHDR_FLAGS = 0x5 + NFTA_EXTHDR_OP = 0x6 + NFTA_EXTHDR_SREG = 0x7 + NFT_META_LEN = 0x0 + NFT_META_PROTOCOL = 0x1 + NFT_META_PRIORITY = 0x2 + NFT_META_MARK = 0x3 + NFT_META_IIF = 0x4 + NFT_META_OIF = 0x5 + NFT_META_IIFNAME = 0x6 + NFT_META_OIFNAME = 0x7 + NFT_META_IIFTYPE = 0x8 + NFT_META_OIFTYPE = 0x9 + NFT_META_SKUID = 0xa + NFT_META_SKGID = 0xb + NFT_META_NFTRACE = 0xc + NFT_META_RTCLASSID = 0xd + NFT_META_SECMARK = 0xe + NFT_META_NFPROTO = 0xf + NFT_META_L4PROTO = 0x10 + NFT_META_BRI_IIFNAME = 0x11 + NFT_META_BRI_OIFNAME = 0x12 + NFT_META_PKTTYPE = 0x13 + NFT_META_CPU = 0x14 + NFT_META_IIFGROUP = 0x15 + NFT_META_OIFGROUP = 0x16 + NFT_META_CGROUP = 0x17 + NFT_META_PRANDOM = 0x18 + NFT_RT_CLASSID = 0x0 + NFT_RT_NEXTHOP4 = 0x1 + NFT_RT_NEXTHOP6 = 0x2 + NFT_RT_TCPMSS = 0x3 + NFT_HASH_JENKINS = 0x0 + NFT_HASH_SYM = 0x1 + NFTA_HASH_UNSPEC = 0x0 + NFTA_HASH_SREG = 0x1 + NFTA_HASH_DREG = 0x2 + NFTA_HASH_LEN = 0x3 + NFTA_HASH_MODULUS = 0x4 + NFTA_HASH_SEED = 0x5 + NFTA_HASH_OFFSET = 0x6 + NFTA_HASH_TYPE = 0x7 + NFTA_META_UNSPEC = 0x0 + NFTA_META_DREG = 0x1 + NFTA_META_KEY = 0x2 + NFTA_META_SREG = 0x3 + NFTA_RT_UNSPEC = 0x0 + NFTA_RT_DREG = 0x1 + NFTA_RT_KEY = 0x2 + NFT_CT_STATE = 0x0 + NFT_CT_DIRECTION = 0x1 + NFT_CT_STATUS = 0x2 + NFT_CT_MARK = 0x3 + NFT_CT_SECMARK = 0x4 + NFT_CT_EXPIRATION = 0x5 + NFT_CT_HELPER = 0x6 + NFT_CT_L3PROTOCOL = 0x7 + NFT_CT_SRC = 0x8 + NFT_CT_DST = 0x9 + NFT_CT_PROTOCOL = 0xa + NFT_CT_PROTO_SRC = 0xb + NFT_CT_PROTO_DST = 0xc + NFT_CT_LABELS = 0xd + NFT_CT_PKTS = 0xe + NFT_CT_BYTES = 0xf + NFT_CT_AVGPKT = 0x10 + NFT_CT_ZONE = 0x11 + NFT_CT_EVENTMASK = 0x12 + NFTA_CT_UNSPEC = 0x0 + NFTA_CT_DREG = 0x1 + NFTA_CT_KEY = 0x2 + NFTA_CT_DIRECTION = 0x3 + NFTA_CT_SREG = 0x4 + NFT_LIMIT_PKTS = 0x0 + NFT_LIMIT_PKT_BYTES = 0x1 + NFT_LIMIT_F_INV = 0x1 + NFTA_LIMIT_UNSPEC = 0x0 + NFTA_LIMIT_RATE = 0x1 + NFTA_LIMIT_UNIT = 0x2 + NFTA_LIMIT_BURST = 0x3 + NFTA_LIMIT_TYPE = 0x4 + NFTA_LIMIT_FLAGS = 0x5 + NFTA_LIMIT_PAD = 0x6 + NFTA_COUNTER_UNSPEC = 0x0 + NFTA_COUNTER_BYTES = 0x1 + NFTA_COUNTER_PACKETS = 0x2 + NFTA_COUNTER_PAD = 0x3 + NFTA_LOG_UNSPEC = 0x0 + NFTA_LOG_GROUP = 0x1 + NFTA_LOG_PREFIX = 0x2 + NFTA_LOG_SNAPLEN = 0x3 + NFTA_LOG_QTHRESHOLD = 0x4 + NFTA_LOG_LEVEL = 0x5 + NFTA_LOG_FLAGS = 0x6 + NFTA_QUEUE_UNSPEC = 0x0 + NFTA_QUEUE_NUM = 0x1 + NFTA_QUEUE_TOTAL = 0x2 + NFTA_QUEUE_FLAGS = 0x3 + NFTA_QUEUE_SREG_QNUM = 0x4 + NFT_QUOTA_F_INV = 0x1 + NFT_QUOTA_F_DEPLETED = 0x2 + NFTA_QUOTA_UNSPEC = 0x0 + NFTA_QUOTA_BYTES = 0x1 + NFTA_QUOTA_FLAGS = 0x2 + NFTA_QUOTA_PAD = 0x3 + NFTA_QUOTA_CONSUMED = 0x4 + NFT_REJECT_ICMP_UNREACH = 0x0 + NFT_REJECT_TCP_RST = 0x1 + NFT_REJECT_ICMPX_UNREACH = 0x2 + NFT_REJECT_ICMPX_NO_ROUTE = 0x0 + NFT_REJECT_ICMPX_PORT_UNREACH = 0x1 + NFT_REJECT_ICMPX_HOST_UNREACH = 0x2 + NFT_REJECT_ICMPX_ADMIN_PROHIBITED = 0x3 + NFTA_REJECT_UNSPEC = 0x0 + NFTA_REJECT_TYPE = 0x1 + NFTA_REJECT_ICMP_CODE = 0x2 + NFT_NAT_SNAT = 0x0 + NFT_NAT_DNAT = 0x1 + NFTA_NAT_UNSPEC = 0x0 + NFTA_NAT_TYPE = 0x1 + NFTA_NAT_FAMILY = 0x2 + NFTA_NAT_REG_ADDR_MIN = 0x3 + NFTA_NAT_REG_ADDR_MAX = 0x4 + NFTA_NAT_REG_PROTO_MIN = 0x5 + NFTA_NAT_REG_PROTO_MAX = 0x6 + NFTA_NAT_FLAGS = 0x7 + NFTA_MASQ_UNSPEC = 0x0 + NFTA_MASQ_FLAGS = 0x1 + NFTA_MASQ_REG_PROTO_MIN = 0x2 + NFTA_MASQ_REG_PROTO_MAX = 0x3 + NFTA_REDIR_UNSPEC = 0x0 + NFTA_REDIR_REG_PROTO_MIN = 0x1 + NFTA_REDIR_REG_PROTO_MAX = 0x2 + NFTA_REDIR_FLAGS = 0x3 + NFTA_DUP_UNSPEC = 0x0 + NFTA_DUP_SREG_ADDR = 0x1 + NFTA_DUP_SREG_DEV = 0x2 + NFTA_FWD_UNSPEC = 0x0 + NFTA_FWD_SREG_DEV = 0x1 + NFTA_OBJREF_UNSPEC = 0x0 + NFTA_OBJREF_IMM_TYPE = 0x1 + NFTA_OBJREF_IMM_NAME = 0x2 + NFTA_OBJREF_SET_SREG = 0x3 + NFTA_OBJREF_SET_NAME = 0x4 + NFTA_OBJREF_SET_ID = 0x5 + NFTA_GEN_UNSPEC = 0x0 + NFTA_GEN_ID = 0x1 + NFTA_GEN_PROC_PID = 0x2 + NFTA_GEN_PROC_NAME = 0x3 + NFTA_FIB_UNSPEC = 0x0 + NFTA_FIB_DREG = 0x1 + NFTA_FIB_RESULT = 0x2 + NFTA_FIB_FLAGS = 0x3 + NFT_FIB_RESULT_UNSPEC = 0x0 + NFT_FIB_RESULT_OIF = 0x1 + NFT_FIB_RESULT_OIFNAME = 0x2 + NFT_FIB_RESULT_ADDRTYPE = 0x3 + NFTA_FIB_F_SADDR = 0x1 + NFTA_FIB_F_DADDR = 0x2 + NFTA_FIB_F_MARK = 0x4 + NFTA_FIB_F_IIF = 0x8 + NFTA_FIB_F_OIF = 0x10 + NFTA_FIB_F_PRESENT = 0x20 + NFTA_CT_HELPER_UNSPEC = 0x0 + NFTA_CT_HELPER_NAME = 0x1 + NFTA_CT_HELPER_L3PROTO = 0x2 + NFTA_CT_HELPER_L4PROTO = 0x3 + NFTA_OBJ_UNSPEC = 0x0 + NFTA_OBJ_TABLE = 0x1 + NFTA_OBJ_NAME = 0x2 + NFTA_OBJ_TYPE = 0x3 + NFTA_OBJ_DATA = 0x4 + NFTA_OBJ_USE = 0x5 + NFTA_TRACE_UNSPEC = 0x0 + NFTA_TRACE_TABLE = 0x1 + NFTA_TRACE_CHAIN = 0x2 + NFTA_TRACE_RULE_HANDLE = 0x3 + NFTA_TRACE_TYPE = 0x4 + NFTA_TRACE_VERDICT = 0x5 + NFTA_TRACE_ID = 0x6 + NFTA_TRACE_LL_HEADER = 0x7 + NFTA_TRACE_NETWORK_HEADER = 0x8 + NFTA_TRACE_TRANSPORT_HEADER = 0x9 + NFTA_TRACE_IIF = 0xa + NFTA_TRACE_IIFTYPE = 0xb + NFTA_TRACE_OIF = 0xc + NFTA_TRACE_OIFTYPE = 0xd + NFTA_TRACE_MARK = 0xe + NFTA_TRACE_NFPROTO = 0xf + NFTA_TRACE_POLICY = 0x10 + NFTA_TRACE_PAD = 0x11 + NFT_TRACETYPE_UNSPEC = 0x0 + NFT_TRACETYPE_POLICY = 0x1 + NFT_TRACETYPE_RETURN = 0x2 + NFT_TRACETYPE_RULE = 0x3 + NFTA_NG_UNSPEC = 0x0 + NFTA_NG_DREG = 0x1 + NFTA_NG_MODULUS = 0x2 + NFTA_NG_TYPE = 0x3 + NFTA_NG_OFFSET = 0x4 + NFT_NG_INCREMENTAL = 0x0 + NFT_NG_RANDOM = 0x1 +) diff --git a/api/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go b/api/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go new file mode 100644 index 0000000..3a5cc69 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go @@ -0,0 +1,1824 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build ppc64le,linux + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Timex struct { + Modes uint32 + _ [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + _ [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + _ [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + _ [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + Ino uint64 + Nlink uint64 + Mode uint32 + Uid uint32 + Gid uint32 + _ int32 + Rdev uint64 + Size int64 + Blksize int64 + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + _ uint64 + _ uint64 + _ uint64 +} + +type StatxTimestamp struct { + Sec int64 + Nsec uint32 + _ int32 +} + +type Statx_t struct { + Mask uint32 + Blksize uint32 + Attributes uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Mode uint16 + _ [1]uint16 + Ino uint64 + Size uint64 + Blocks uint64 + Attributes_mask uint64 + Atime StatxTimestamp + Btime StatxTimestamp + Ctime StatxTimestamp + Mtime StatxTimestamp + Rdev_major uint32 + Rdev_minor uint32 + Dev_major uint32 + Dev_minor uint32 + _ [14]uint64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]uint8 + _ [5]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + _ [4]byte + Start int64 + Len int64 + Pid int32 + _ [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrL2 struct { + Family uint16 + Psm uint16 + Bdaddr [6]uint8 + Cid uint16 + Bdaddr_type uint8 + _ [1]byte +} + +type RawSockaddrCAN struct { + Family uint16 + _ [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]uint8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]uint8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + _ [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + _ [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + _ [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrL2 = 0xe + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x10 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_NUM_VF = 0x15 + IFLA_VFINFO_LIST = 0x16 + IFLA_STATS64 = 0x17 + IFLA_VF_PORTS = 0x18 + IFLA_PORT_SELF = 0x19 + IFLA_AF_SPEC = 0x1a + IFLA_GROUP = 0x1b + IFLA_NET_NS_FD = 0x1c + IFLA_EXT_MASK = 0x1d + IFLA_PROMISCUITY = 0x1e + IFLA_NUM_TX_QUEUES = 0x1f + IFLA_NUM_RX_QUEUES = 0x20 + IFLA_CARRIER = 0x21 + IFLA_PHYS_PORT_ID = 0x22 + IFLA_CARRIER_CHANGES = 0x23 + IFLA_PHYS_SWITCH_ID = 0x24 + IFLA_LINK_NETNSID = 0x25 + IFLA_PHYS_PORT_NAME = 0x26 + IFLA_PROTO_DOWN = 0x27 + IFLA_GSO_MAX_SEGS = 0x28 + IFLA_GSO_MAX_SIZE = 0x29 + IFLA_PAD = 0x2a + IFLA_XDP = 0x2b + IFLA_EVENT = 0x2c + IFLA_NEW_NETNSID = 0x2d + IFLA_IF_NETNSID = 0x2e + IFLA_MAX = 0x31 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + _ uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + _ [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Gpr [32]uint64 + Nip uint64 + Msr uint64 + Orig_gpr3 uint64 + Ctr uint64 + Link uint64 + Xer uint64 + Ccr uint64 + Softe uint64 + Trap uint64 + Dar uint64 + Dsisr uint64 + Result uint64 +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + _ [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + _ [0]uint8 + _ [4]byte +} + +type Utsname struct { + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte +} + +type Ustat_t struct { + Tfree int32 + _ [4]byte + Tinode uint64 + Fname [6]uint8 + Fpack [6]uint8 + _ [4]byte +} + +type EpollEvent struct { + Events uint32 + _ int32 + Fd int32 + Pad int32 +} + +const ( + AT_EMPTY_PATH = 0x1000 + AT_FDCWD = -0x64 + AT_NO_AUTOMOUNT = 0x800 + AT_REMOVEDIR = 0x200 + + AT_STATX_SYNC_AS_STAT = 0x0 + AT_STATX_FORCE_SYNC = 0x2000 + AT_STATX_DONT_SYNC = 0x4000 + + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + Val [16]uint64 +} + +const RNDGETENTCNT = 0x40045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [19]uint8 + Line uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + _ [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + _ [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]uint8 + Ac_sched uint8 + Ac_pad [3]uint8 + _ [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + _ [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type CGroupStats struct { + Sleeping uint64 + Running uint64 + Stopped uint64 + Uninterruptible uint64 + Io_wait uint64 +} + +const ( + CGROUPSTATS_CMD_UNSPEC = 0x3 + CGROUPSTATS_CMD_GET = 0x4 + CGROUPSTATS_CMD_NEW = 0x5 + CGROUPSTATS_TYPE_UNSPEC = 0x0 + CGROUPSTATS_TYPE_CGROUP_STATS = 0x1 + CGROUPSTATS_CMD_ATTR_UNSPEC = 0x0 + CGROUPSTATS_CMD_ATTR_FD = 0x1 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) + +type cpuMask uint64 + +const ( + _CPU_SETSIZE = 0x400 + _NCPUBITS = 0x40 +) + +const ( + BDADDR_BREDR = 0x0 + BDADDR_LE_PUBLIC = 0x1 + BDADDR_LE_RANDOM = 0x2 +) + +type PerfEventAttr struct { + Type uint32 + Size uint32 + Config uint64 + Sample uint64 + Sample_type uint64 + Read_format uint64 + Bits uint64 + Wakeup uint32 + Bp_type uint32 + Ext1 uint64 + Ext2 uint64 + Branch_sample_type uint64 + Sample_regs_user uint64 + Sample_stack_user uint32 + Clockid int32 + Sample_regs_intr uint64 + Aux_watermark uint32 + _ uint32 +} + +type PerfEventMmapPage struct { + Version uint32 + Compat_version uint32 + Lock uint32 + Index uint32 + Offset int64 + Time_enabled uint64 + Time_running uint64 + Capabilities uint64 + Pmc_width uint16 + Time_shift uint16 + Time_mult uint32 + Time_offset uint64 + Time_zero uint64 + Size uint32 + _ [948]uint8 + Data_head uint64 + Data_tail uint64 + Data_offset uint64 + Data_size uint64 + Aux_head uint64 + Aux_tail uint64 + Aux_offset uint64 + Aux_size uint64 +} + +const ( + PerfBitDisabled uint64 = CBitFieldMaskBit0 + PerfBitInherit = CBitFieldMaskBit1 + PerfBitPinned = CBitFieldMaskBit2 + PerfBitExclusive = CBitFieldMaskBit3 + PerfBitExcludeUser = CBitFieldMaskBit4 + PerfBitExcludeKernel = CBitFieldMaskBit5 + PerfBitExcludeHv = CBitFieldMaskBit6 + PerfBitExcludeIdle = CBitFieldMaskBit7 + PerfBitMmap = CBitFieldMaskBit8 + PerfBitComm = CBitFieldMaskBit9 + PerfBitFreq = CBitFieldMaskBit10 + PerfBitInheritStat = CBitFieldMaskBit11 + PerfBitEnableOnExec = CBitFieldMaskBit12 + PerfBitTask = CBitFieldMaskBit13 + PerfBitWatermark = CBitFieldMaskBit14 + PerfBitPreciseIPBit1 = CBitFieldMaskBit15 + PerfBitPreciseIPBit2 = CBitFieldMaskBit16 + PerfBitMmapData = CBitFieldMaskBit17 + PerfBitSampleIDAll = CBitFieldMaskBit18 + PerfBitExcludeHost = CBitFieldMaskBit19 + PerfBitExcludeGuest = CBitFieldMaskBit20 + PerfBitExcludeCallchainKernel = CBitFieldMaskBit21 + PerfBitExcludeCallchainUser = CBitFieldMaskBit22 + PerfBitMmap2 = CBitFieldMaskBit23 + PerfBitCommExec = CBitFieldMaskBit24 + PerfBitUseClockID = CBitFieldMaskBit25 + PerfBitContextSwitch = CBitFieldMaskBit26 +) + +const ( + PERF_TYPE_HARDWARE = 0x0 + PERF_TYPE_SOFTWARE = 0x1 + PERF_TYPE_TRACEPOINT = 0x2 + PERF_TYPE_HW_CACHE = 0x3 + PERF_TYPE_RAW = 0x4 + PERF_TYPE_BREAKPOINT = 0x5 + + PERF_COUNT_HW_CPU_CYCLES = 0x0 + PERF_COUNT_HW_INSTRUCTIONS = 0x1 + PERF_COUNT_HW_CACHE_REFERENCES = 0x2 + PERF_COUNT_HW_CACHE_MISSES = 0x3 + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 0x4 + PERF_COUNT_HW_BRANCH_MISSES = 0x5 + PERF_COUNT_HW_BUS_CYCLES = 0x6 + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7 + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 0x8 + PERF_COUNT_HW_REF_CPU_CYCLES = 0x9 + + PERF_COUNT_HW_CACHE_L1D = 0x0 + PERF_COUNT_HW_CACHE_L1I = 0x1 + PERF_COUNT_HW_CACHE_LL = 0x2 + PERF_COUNT_HW_CACHE_DTLB = 0x3 + PERF_COUNT_HW_CACHE_ITLB = 0x4 + PERF_COUNT_HW_CACHE_BPU = 0x5 + PERF_COUNT_HW_CACHE_NODE = 0x6 + + PERF_COUNT_HW_CACHE_OP_READ = 0x0 + PERF_COUNT_HW_CACHE_OP_WRITE = 0x1 + PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2 + + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0 + PERF_COUNT_HW_CACHE_RESULT_MISS = 0x1 + + PERF_COUNT_SW_CPU_CLOCK = 0x0 + PERF_COUNT_SW_TASK_CLOCK = 0x1 + PERF_COUNT_SW_PAGE_FAULTS = 0x2 + PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3 + PERF_COUNT_SW_CPU_MIGRATIONS = 0x4 + PERF_COUNT_SW_PAGE_FAULTS_MIN = 0x5 + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 0x6 + PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 + PERF_COUNT_SW_EMULATION_FAULTS = 0x8 + PERF_COUNT_SW_DUMMY = 0x9 + + PERF_SAMPLE_IP = 0x1 + PERF_SAMPLE_TID = 0x2 + PERF_SAMPLE_TIME = 0x4 + PERF_SAMPLE_ADDR = 0x8 + PERF_SAMPLE_READ = 0x10 + PERF_SAMPLE_CALLCHAIN = 0x20 + PERF_SAMPLE_ID = 0x40 + PERF_SAMPLE_CPU = 0x80 + PERF_SAMPLE_PERIOD = 0x100 + PERF_SAMPLE_STREAM_ID = 0x200 + PERF_SAMPLE_RAW = 0x400 + PERF_SAMPLE_BRANCH_STACK = 0x800 + + PERF_SAMPLE_BRANCH_USER = 0x1 + PERF_SAMPLE_BRANCH_KERNEL = 0x2 + PERF_SAMPLE_BRANCH_HV = 0x4 + PERF_SAMPLE_BRANCH_ANY = 0x8 + PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 + PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 + PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + + PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 + PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 + PERF_FORMAT_ID = 0x4 + PERF_FORMAT_GROUP = 0x8 + + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + + PERF_CONTEXT_HV = -0x20 + PERF_CONTEXT_KERNEL = -0x80 + PERF_CONTEXT_USER = -0x200 + + PERF_CONTEXT_GUEST = -0x800 + PERF_CONTEXT_GUEST_KERNEL = -0x880 + PERF_CONTEXT_GUEST_USER = -0xa00 + + PERF_FLAG_FD_NO_GROUP = 0x1 + PERF_FLAG_FD_OUTPUT = 0x2 + PERF_FLAG_PID_CGROUP = 0x4 +) + +const ( + CBitFieldMaskBit0 = 0x1 + CBitFieldMaskBit1 = 0x2 + CBitFieldMaskBit2 = 0x4 + CBitFieldMaskBit3 = 0x8 + CBitFieldMaskBit4 = 0x10 + CBitFieldMaskBit5 = 0x20 + CBitFieldMaskBit6 = 0x40 + CBitFieldMaskBit7 = 0x80 + CBitFieldMaskBit8 = 0x100 + CBitFieldMaskBit9 = 0x200 + CBitFieldMaskBit10 = 0x400 + CBitFieldMaskBit11 = 0x800 + CBitFieldMaskBit12 = 0x1000 + CBitFieldMaskBit13 = 0x2000 + CBitFieldMaskBit14 = 0x4000 + CBitFieldMaskBit15 = 0x8000 + CBitFieldMaskBit16 = 0x10000 + CBitFieldMaskBit17 = 0x20000 + CBitFieldMaskBit18 = 0x40000 + CBitFieldMaskBit19 = 0x80000 + CBitFieldMaskBit20 = 0x100000 + CBitFieldMaskBit21 = 0x200000 + CBitFieldMaskBit22 = 0x400000 + CBitFieldMaskBit23 = 0x800000 + CBitFieldMaskBit24 = 0x1000000 + CBitFieldMaskBit25 = 0x2000000 + CBitFieldMaskBit26 = 0x4000000 + CBitFieldMaskBit27 = 0x8000000 + CBitFieldMaskBit28 = 0x10000000 + CBitFieldMaskBit29 = 0x20000000 + CBitFieldMaskBit30 = 0x40000000 + CBitFieldMaskBit31 = 0x80000000 + CBitFieldMaskBit32 = 0x100000000 + CBitFieldMaskBit33 = 0x200000000 + CBitFieldMaskBit34 = 0x400000000 + CBitFieldMaskBit35 = 0x800000000 + CBitFieldMaskBit36 = 0x1000000000 + CBitFieldMaskBit37 = 0x2000000000 + CBitFieldMaskBit38 = 0x4000000000 + CBitFieldMaskBit39 = 0x8000000000 + CBitFieldMaskBit40 = 0x10000000000 + CBitFieldMaskBit41 = 0x20000000000 + CBitFieldMaskBit42 = 0x40000000000 + CBitFieldMaskBit43 = 0x80000000000 + CBitFieldMaskBit44 = 0x100000000000 + CBitFieldMaskBit45 = 0x200000000000 + CBitFieldMaskBit46 = 0x400000000000 + CBitFieldMaskBit47 = 0x800000000000 + CBitFieldMaskBit48 = 0x1000000000000 + CBitFieldMaskBit49 = 0x2000000000000 + CBitFieldMaskBit50 = 0x4000000000000 + CBitFieldMaskBit51 = 0x8000000000000 + CBitFieldMaskBit52 = 0x10000000000000 + CBitFieldMaskBit53 = 0x20000000000000 + CBitFieldMaskBit54 = 0x40000000000000 + CBitFieldMaskBit55 = 0x80000000000000 + CBitFieldMaskBit56 = 0x100000000000000 + CBitFieldMaskBit57 = 0x200000000000000 + CBitFieldMaskBit58 = 0x400000000000000 + CBitFieldMaskBit59 = 0x800000000000000 + CBitFieldMaskBit60 = 0x1000000000000000 + CBitFieldMaskBit61 = 0x2000000000000000 + CBitFieldMaskBit62 = 0x4000000000000000 + CBitFieldMaskBit63 = 0x8000000000000000 +) + +type SockaddrStorage struct { + Family uint16 + _ [118]uint8 + _ uint64 +} + +type TCPMD5Sig struct { + Addr SockaddrStorage + Flags uint8 + Prefixlen uint8 + Keylen uint16 + _ uint32 + Key [80]uint8 +} + +type HDDriveCmdHdr struct { + Command uint8 + Number uint8 + Feature uint8 + Count uint8 +} + +type HDGeometry struct { + Heads uint8 + Sectors uint8 + Cylinders uint16 + _ [4]byte + Start uint64 +} + +type HDDriveID struct { + Config uint16 + Cyls uint16 + Reserved2 uint16 + Heads uint16 + Track_bytes uint16 + Sector_bytes uint16 + Sectors uint16 + Vendor0 uint16 + Vendor1 uint16 + Vendor2 uint16 + Serial_no [20]uint8 + Buf_type uint16 + Buf_size uint16 + Ecc_bytes uint16 + Fw_rev [8]uint8 + Model [40]uint8 + Max_multsect uint8 + Vendor3 uint8 + Dword_io uint16 + Vendor4 uint8 + Capability uint8 + Reserved50 uint16 + Vendor5 uint8 + TPIO uint8 + Vendor6 uint8 + TDMA uint8 + Field_valid uint16 + Cur_cyls uint16 + Cur_heads uint16 + Cur_sectors uint16 + Cur_capacity0 uint16 + Cur_capacity1 uint16 + Multsect uint8 + Multsect_valid uint8 + Lba_capacity uint32 + Dma_1word uint16 + Dma_mword uint16 + Eide_pio_modes uint16 + Eide_dma_min uint16 + Eide_dma_time uint16 + Eide_pio uint16 + Eide_pio_iordy uint16 + Words69_70 [2]uint16 + Words71_74 [4]uint16 + Queue_depth uint16 + Words76_79 [4]uint16 + Major_rev_num uint16 + Minor_rev_num uint16 + Command_set_1 uint16 + Command_set_2 uint16 + Cfsse uint16 + Cfs_enable_1 uint16 + Cfs_enable_2 uint16 + Csf_default uint16 + Dma_ultra uint16 + Trseuc uint16 + TrsEuc uint16 + CurAPMvalues uint16 + Mprc uint16 + Hw_config uint16 + Acoustic uint16 + Msrqs uint16 + Sxfert uint16 + Sal uint16 + Spg uint32 + Lba_capacity_2 uint64 + Words104_125 [22]uint16 + Last_lun uint16 + Word127 uint16 + Dlf uint16 + Csfo uint16 + Words130_155 [26]uint16 + Word156 uint16 + Words157_159 [3]uint16 + Cfa_power uint16 + Words161_175 [15]uint16 + Words176_205 [30]uint16 + Words206_254 [49]uint16 + Integrity_word uint16 +} + +type Statfs_t struct { + Type int64 + Bsize int64 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen int64 + Frsize int64 + Flags int64 + Spare [4]int64 +} + +const ( + ST_MANDLOCK = 0x40 + ST_NOATIME = 0x400 + ST_NODEV = 0x4 + ST_NODIRATIME = 0x800 + ST_NOEXEC = 0x8 + ST_NOSUID = 0x2 + ST_RDONLY = 0x1 + ST_RELATIME = 0x1000 + ST_SYNCHRONOUS = 0x10 +) + +type TpacketHdr struct { + Status uint64 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Usec uint32 + _ [4]byte +} + +type Tpacket2Hdr struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Nsec uint32 + Vlan_tci uint16 + Vlan_tpid uint16 + _ [4]uint8 +} + +type Tpacket3Hdr struct { + Next_offset uint32 + Sec uint32 + Nsec uint32 + Snaplen uint32 + Len uint32 + Status uint32 + Mac uint16 + Net uint16 + Hv1 TpacketHdrVariant1 + _ [8]uint8 +} + +type TpacketHdrVariant1 struct { + Rxhash uint32 + Vlan_tci uint32 + Vlan_tpid uint16 + _ uint16 +} + +type TpacketBlockDesc struct { + Version uint32 + To_priv uint32 + Hdr [40]byte +} + +type TpacketReq struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 +} + +type TpacketReq3 struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 + Retire_blk_tov uint32 + Sizeof_priv uint32 + Feature_req_word uint32 +} + +type TpacketStats struct { + Packets uint32 + Drops uint32 +} + +type TpacketStatsV3 struct { + Packets uint32 + Drops uint32 + Freeze_q_cnt uint32 +} + +type TpacketAuxdata struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Vlan_tci uint16 + Vlan_tpid uint16 +} + +const ( + TPACKET_V1 = 0x0 + TPACKET_V2 = 0x1 + TPACKET_V3 = 0x2 +) + +const ( + SizeofTpacketHdr = 0x20 + SizeofTpacket2Hdr = 0x20 + SizeofTpacket3Hdr = 0x30 +) + +const ( + NF_INET_PRE_ROUTING = 0x0 + NF_INET_LOCAL_IN = 0x1 + NF_INET_FORWARD = 0x2 + NF_INET_LOCAL_OUT = 0x3 + NF_INET_POST_ROUTING = 0x4 + NF_INET_NUMHOOKS = 0x5 +) + +const ( + NF_NETDEV_INGRESS = 0x0 + NF_NETDEV_NUMHOOKS = 0x1 +) + +const ( + NFPROTO_UNSPEC = 0x0 + NFPROTO_INET = 0x1 + NFPROTO_IPV4 = 0x2 + NFPROTO_ARP = 0x3 + NFPROTO_NETDEV = 0x5 + NFPROTO_BRIDGE = 0x7 + NFPROTO_IPV6 = 0xa + NFPROTO_DECNET = 0xc + NFPROTO_NUMPROTO = 0xd +) + +type Nfgenmsg struct { + Nfgen_family uint8 + Version uint8 + Res_id uint16 +} + +const ( + NFNL_BATCH_UNSPEC = 0x0 + NFNL_BATCH_GENID = 0x1 +) + +const ( + NFT_REG_VERDICT = 0x0 + NFT_REG_1 = 0x1 + NFT_REG_2 = 0x2 + NFT_REG_3 = 0x3 + NFT_REG_4 = 0x4 + NFT_REG32_00 = 0x8 + NFT_REG32_01 = 0x9 + NFT_REG32_02 = 0xa + NFT_REG32_03 = 0xb + NFT_REG32_04 = 0xc + NFT_REG32_05 = 0xd + NFT_REG32_06 = 0xe + NFT_REG32_07 = 0xf + NFT_REG32_08 = 0x10 + NFT_REG32_09 = 0x11 + NFT_REG32_10 = 0x12 + NFT_REG32_11 = 0x13 + NFT_REG32_12 = 0x14 + NFT_REG32_13 = 0x15 + NFT_REG32_14 = 0x16 + NFT_REG32_15 = 0x17 + NFT_CONTINUE = -0x1 + NFT_BREAK = -0x2 + NFT_JUMP = -0x3 + NFT_GOTO = -0x4 + NFT_RETURN = -0x5 + NFT_MSG_NEWTABLE = 0x0 + NFT_MSG_GETTABLE = 0x1 + NFT_MSG_DELTABLE = 0x2 + NFT_MSG_NEWCHAIN = 0x3 + NFT_MSG_GETCHAIN = 0x4 + NFT_MSG_DELCHAIN = 0x5 + NFT_MSG_NEWRULE = 0x6 + NFT_MSG_GETRULE = 0x7 + NFT_MSG_DELRULE = 0x8 + NFT_MSG_NEWSET = 0x9 + NFT_MSG_GETSET = 0xa + NFT_MSG_DELSET = 0xb + NFT_MSG_NEWSETELEM = 0xc + NFT_MSG_GETSETELEM = 0xd + NFT_MSG_DELSETELEM = 0xe + NFT_MSG_NEWGEN = 0xf + NFT_MSG_GETGEN = 0x10 + NFT_MSG_TRACE = 0x11 + NFT_MSG_NEWOBJ = 0x12 + NFT_MSG_GETOBJ = 0x13 + NFT_MSG_DELOBJ = 0x14 + NFT_MSG_GETOBJ_RESET = 0x15 + NFT_MSG_MAX = 0x19 + NFTA_LIST_UNPEC = 0x0 + NFTA_LIST_ELEM = 0x1 + NFTA_HOOK_UNSPEC = 0x0 + NFTA_HOOK_HOOKNUM = 0x1 + NFTA_HOOK_PRIORITY = 0x2 + NFTA_HOOK_DEV = 0x3 + NFT_TABLE_F_DORMANT = 0x1 + NFTA_TABLE_UNSPEC = 0x0 + NFTA_TABLE_NAME = 0x1 + NFTA_TABLE_FLAGS = 0x2 + NFTA_TABLE_USE = 0x3 + NFTA_CHAIN_UNSPEC = 0x0 + NFTA_CHAIN_TABLE = 0x1 + NFTA_CHAIN_HANDLE = 0x2 + NFTA_CHAIN_NAME = 0x3 + NFTA_CHAIN_HOOK = 0x4 + NFTA_CHAIN_POLICY = 0x5 + NFTA_CHAIN_USE = 0x6 + NFTA_CHAIN_TYPE = 0x7 + NFTA_CHAIN_COUNTERS = 0x8 + NFTA_CHAIN_PAD = 0x9 + NFTA_RULE_UNSPEC = 0x0 + NFTA_RULE_TABLE = 0x1 + NFTA_RULE_CHAIN = 0x2 + NFTA_RULE_HANDLE = 0x3 + NFTA_RULE_EXPRESSIONS = 0x4 + NFTA_RULE_COMPAT = 0x5 + NFTA_RULE_POSITION = 0x6 + NFTA_RULE_USERDATA = 0x7 + NFTA_RULE_PAD = 0x8 + NFTA_RULE_ID = 0x9 + NFT_RULE_COMPAT_F_INV = 0x2 + NFT_RULE_COMPAT_F_MASK = 0x2 + NFTA_RULE_COMPAT_UNSPEC = 0x0 + NFTA_RULE_COMPAT_PROTO = 0x1 + NFTA_RULE_COMPAT_FLAGS = 0x2 + NFT_SET_ANONYMOUS = 0x1 + NFT_SET_CONSTANT = 0x2 + NFT_SET_INTERVAL = 0x4 + NFT_SET_MAP = 0x8 + NFT_SET_TIMEOUT = 0x10 + NFT_SET_EVAL = 0x20 + NFT_SET_OBJECT = 0x40 + NFT_SET_POL_PERFORMANCE = 0x0 + NFT_SET_POL_MEMORY = 0x1 + NFTA_SET_DESC_UNSPEC = 0x0 + NFTA_SET_DESC_SIZE = 0x1 + NFTA_SET_UNSPEC = 0x0 + NFTA_SET_TABLE = 0x1 + NFTA_SET_NAME = 0x2 + NFTA_SET_FLAGS = 0x3 + NFTA_SET_KEY_TYPE = 0x4 + NFTA_SET_KEY_LEN = 0x5 + NFTA_SET_DATA_TYPE = 0x6 + NFTA_SET_DATA_LEN = 0x7 + NFTA_SET_POLICY = 0x8 + NFTA_SET_DESC = 0x9 + NFTA_SET_ID = 0xa + NFTA_SET_TIMEOUT = 0xb + NFTA_SET_GC_INTERVAL = 0xc + NFTA_SET_USERDATA = 0xd + NFTA_SET_PAD = 0xe + NFTA_SET_OBJ_TYPE = 0xf + NFT_SET_ELEM_INTERVAL_END = 0x1 + NFTA_SET_ELEM_UNSPEC = 0x0 + NFTA_SET_ELEM_KEY = 0x1 + NFTA_SET_ELEM_DATA = 0x2 + NFTA_SET_ELEM_FLAGS = 0x3 + NFTA_SET_ELEM_TIMEOUT = 0x4 + NFTA_SET_ELEM_EXPIRATION = 0x5 + NFTA_SET_ELEM_USERDATA = 0x6 + NFTA_SET_ELEM_EXPR = 0x7 + NFTA_SET_ELEM_PAD = 0x8 + NFTA_SET_ELEM_OBJREF = 0x9 + NFTA_SET_ELEM_LIST_UNSPEC = 0x0 + NFTA_SET_ELEM_LIST_TABLE = 0x1 + NFTA_SET_ELEM_LIST_SET = 0x2 + NFTA_SET_ELEM_LIST_ELEMENTS = 0x3 + NFTA_SET_ELEM_LIST_SET_ID = 0x4 + NFT_DATA_VALUE = 0x0 + NFT_DATA_VERDICT = 0xffffff00 + NFTA_DATA_UNSPEC = 0x0 + NFTA_DATA_VALUE = 0x1 + NFTA_DATA_VERDICT = 0x2 + NFTA_VERDICT_UNSPEC = 0x0 + NFTA_VERDICT_CODE = 0x1 + NFTA_VERDICT_CHAIN = 0x2 + NFTA_EXPR_UNSPEC = 0x0 + NFTA_EXPR_NAME = 0x1 + NFTA_EXPR_DATA = 0x2 + NFTA_IMMEDIATE_UNSPEC = 0x0 + NFTA_IMMEDIATE_DREG = 0x1 + NFTA_IMMEDIATE_DATA = 0x2 + NFTA_BITWISE_UNSPEC = 0x0 + NFTA_BITWISE_SREG = 0x1 + NFTA_BITWISE_DREG = 0x2 + NFTA_BITWISE_LEN = 0x3 + NFTA_BITWISE_MASK = 0x4 + NFTA_BITWISE_XOR = 0x5 + NFT_BYTEORDER_NTOH = 0x0 + NFT_BYTEORDER_HTON = 0x1 + NFTA_BYTEORDER_UNSPEC = 0x0 + NFTA_BYTEORDER_SREG = 0x1 + NFTA_BYTEORDER_DREG = 0x2 + NFTA_BYTEORDER_OP = 0x3 + NFTA_BYTEORDER_LEN = 0x4 + NFTA_BYTEORDER_SIZE = 0x5 + NFT_CMP_EQ = 0x0 + NFT_CMP_NEQ = 0x1 + NFT_CMP_LT = 0x2 + NFT_CMP_LTE = 0x3 + NFT_CMP_GT = 0x4 + NFT_CMP_GTE = 0x5 + NFTA_CMP_UNSPEC = 0x0 + NFTA_CMP_SREG = 0x1 + NFTA_CMP_OP = 0x2 + NFTA_CMP_DATA = 0x3 + NFT_RANGE_EQ = 0x0 + NFT_RANGE_NEQ = 0x1 + NFTA_RANGE_UNSPEC = 0x0 + NFTA_RANGE_SREG = 0x1 + NFTA_RANGE_OP = 0x2 + NFTA_RANGE_FROM_DATA = 0x3 + NFTA_RANGE_TO_DATA = 0x4 + NFT_LOOKUP_F_INV = 0x1 + NFTA_LOOKUP_UNSPEC = 0x0 + NFTA_LOOKUP_SET = 0x1 + NFTA_LOOKUP_SREG = 0x2 + NFTA_LOOKUP_DREG = 0x3 + NFTA_LOOKUP_SET_ID = 0x4 + NFTA_LOOKUP_FLAGS = 0x5 + NFT_DYNSET_OP_ADD = 0x0 + NFT_DYNSET_OP_UPDATE = 0x1 + NFT_DYNSET_F_INV = 0x1 + NFTA_DYNSET_UNSPEC = 0x0 + NFTA_DYNSET_SET_NAME = 0x1 + NFTA_DYNSET_SET_ID = 0x2 + NFTA_DYNSET_OP = 0x3 + NFTA_DYNSET_SREG_KEY = 0x4 + NFTA_DYNSET_SREG_DATA = 0x5 + NFTA_DYNSET_TIMEOUT = 0x6 + NFTA_DYNSET_EXPR = 0x7 + NFTA_DYNSET_PAD = 0x8 + NFTA_DYNSET_FLAGS = 0x9 + NFT_PAYLOAD_LL_HEADER = 0x0 + NFT_PAYLOAD_NETWORK_HEADER = 0x1 + NFT_PAYLOAD_TRANSPORT_HEADER = 0x2 + NFT_PAYLOAD_CSUM_NONE = 0x0 + NFT_PAYLOAD_CSUM_INET = 0x1 + NFT_PAYLOAD_L4CSUM_PSEUDOHDR = 0x1 + NFTA_PAYLOAD_UNSPEC = 0x0 + NFTA_PAYLOAD_DREG = 0x1 + NFTA_PAYLOAD_BASE = 0x2 + NFTA_PAYLOAD_OFFSET = 0x3 + NFTA_PAYLOAD_LEN = 0x4 + NFTA_PAYLOAD_SREG = 0x5 + NFTA_PAYLOAD_CSUM_TYPE = 0x6 + NFTA_PAYLOAD_CSUM_OFFSET = 0x7 + NFTA_PAYLOAD_CSUM_FLAGS = 0x8 + NFT_EXTHDR_F_PRESENT = 0x1 + NFT_EXTHDR_OP_IPV6 = 0x0 + NFT_EXTHDR_OP_TCPOPT = 0x1 + NFTA_EXTHDR_UNSPEC = 0x0 + NFTA_EXTHDR_DREG = 0x1 + NFTA_EXTHDR_TYPE = 0x2 + NFTA_EXTHDR_OFFSET = 0x3 + NFTA_EXTHDR_LEN = 0x4 + NFTA_EXTHDR_FLAGS = 0x5 + NFTA_EXTHDR_OP = 0x6 + NFTA_EXTHDR_SREG = 0x7 + NFT_META_LEN = 0x0 + NFT_META_PROTOCOL = 0x1 + NFT_META_PRIORITY = 0x2 + NFT_META_MARK = 0x3 + NFT_META_IIF = 0x4 + NFT_META_OIF = 0x5 + NFT_META_IIFNAME = 0x6 + NFT_META_OIFNAME = 0x7 + NFT_META_IIFTYPE = 0x8 + NFT_META_OIFTYPE = 0x9 + NFT_META_SKUID = 0xa + NFT_META_SKGID = 0xb + NFT_META_NFTRACE = 0xc + NFT_META_RTCLASSID = 0xd + NFT_META_SECMARK = 0xe + NFT_META_NFPROTO = 0xf + NFT_META_L4PROTO = 0x10 + NFT_META_BRI_IIFNAME = 0x11 + NFT_META_BRI_OIFNAME = 0x12 + NFT_META_PKTTYPE = 0x13 + NFT_META_CPU = 0x14 + NFT_META_IIFGROUP = 0x15 + NFT_META_OIFGROUP = 0x16 + NFT_META_CGROUP = 0x17 + NFT_META_PRANDOM = 0x18 + NFT_RT_CLASSID = 0x0 + NFT_RT_NEXTHOP4 = 0x1 + NFT_RT_NEXTHOP6 = 0x2 + NFT_RT_TCPMSS = 0x3 + NFT_HASH_JENKINS = 0x0 + NFT_HASH_SYM = 0x1 + NFTA_HASH_UNSPEC = 0x0 + NFTA_HASH_SREG = 0x1 + NFTA_HASH_DREG = 0x2 + NFTA_HASH_LEN = 0x3 + NFTA_HASH_MODULUS = 0x4 + NFTA_HASH_SEED = 0x5 + NFTA_HASH_OFFSET = 0x6 + NFTA_HASH_TYPE = 0x7 + NFTA_META_UNSPEC = 0x0 + NFTA_META_DREG = 0x1 + NFTA_META_KEY = 0x2 + NFTA_META_SREG = 0x3 + NFTA_RT_UNSPEC = 0x0 + NFTA_RT_DREG = 0x1 + NFTA_RT_KEY = 0x2 + NFT_CT_STATE = 0x0 + NFT_CT_DIRECTION = 0x1 + NFT_CT_STATUS = 0x2 + NFT_CT_MARK = 0x3 + NFT_CT_SECMARK = 0x4 + NFT_CT_EXPIRATION = 0x5 + NFT_CT_HELPER = 0x6 + NFT_CT_L3PROTOCOL = 0x7 + NFT_CT_SRC = 0x8 + NFT_CT_DST = 0x9 + NFT_CT_PROTOCOL = 0xa + NFT_CT_PROTO_SRC = 0xb + NFT_CT_PROTO_DST = 0xc + NFT_CT_LABELS = 0xd + NFT_CT_PKTS = 0xe + NFT_CT_BYTES = 0xf + NFT_CT_AVGPKT = 0x10 + NFT_CT_ZONE = 0x11 + NFT_CT_EVENTMASK = 0x12 + NFTA_CT_UNSPEC = 0x0 + NFTA_CT_DREG = 0x1 + NFTA_CT_KEY = 0x2 + NFTA_CT_DIRECTION = 0x3 + NFTA_CT_SREG = 0x4 + NFT_LIMIT_PKTS = 0x0 + NFT_LIMIT_PKT_BYTES = 0x1 + NFT_LIMIT_F_INV = 0x1 + NFTA_LIMIT_UNSPEC = 0x0 + NFTA_LIMIT_RATE = 0x1 + NFTA_LIMIT_UNIT = 0x2 + NFTA_LIMIT_BURST = 0x3 + NFTA_LIMIT_TYPE = 0x4 + NFTA_LIMIT_FLAGS = 0x5 + NFTA_LIMIT_PAD = 0x6 + NFTA_COUNTER_UNSPEC = 0x0 + NFTA_COUNTER_BYTES = 0x1 + NFTA_COUNTER_PACKETS = 0x2 + NFTA_COUNTER_PAD = 0x3 + NFTA_LOG_UNSPEC = 0x0 + NFTA_LOG_GROUP = 0x1 + NFTA_LOG_PREFIX = 0x2 + NFTA_LOG_SNAPLEN = 0x3 + NFTA_LOG_QTHRESHOLD = 0x4 + NFTA_LOG_LEVEL = 0x5 + NFTA_LOG_FLAGS = 0x6 + NFTA_QUEUE_UNSPEC = 0x0 + NFTA_QUEUE_NUM = 0x1 + NFTA_QUEUE_TOTAL = 0x2 + NFTA_QUEUE_FLAGS = 0x3 + NFTA_QUEUE_SREG_QNUM = 0x4 + NFT_QUOTA_F_INV = 0x1 + NFT_QUOTA_F_DEPLETED = 0x2 + NFTA_QUOTA_UNSPEC = 0x0 + NFTA_QUOTA_BYTES = 0x1 + NFTA_QUOTA_FLAGS = 0x2 + NFTA_QUOTA_PAD = 0x3 + NFTA_QUOTA_CONSUMED = 0x4 + NFT_REJECT_ICMP_UNREACH = 0x0 + NFT_REJECT_TCP_RST = 0x1 + NFT_REJECT_ICMPX_UNREACH = 0x2 + NFT_REJECT_ICMPX_NO_ROUTE = 0x0 + NFT_REJECT_ICMPX_PORT_UNREACH = 0x1 + NFT_REJECT_ICMPX_HOST_UNREACH = 0x2 + NFT_REJECT_ICMPX_ADMIN_PROHIBITED = 0x3 + NFTA_REJECT_UNSPEC = 0x0 + NFTA_REJECT_TYPE = 0x1 + NFTA_REJECT_ICMP_CODE = 0x2 + NFT_NAT_SNAT = 0x0 + NFT_NAT_DNAT = 0x1 + NFTA_NAT_UNSPEC = 0x0 + NFTA_NAT_TYPE = 0x1 + NFTA_NAT_FAMILY = 0x2 + NFTA_NAT_REG_ADDR_MIN = 0x3 + NFTA_NAT_REG_ADDR_MAX = 0x4 + NFTA_NAT_REG_PROTO_MIN = 0x5 + NFTA_NAT_REG_PROTO_MAX = 0x6 + NFTA_NAT_FLAGS = 0x7 + NFTA_MASQ_UNSPEC = 0x0 + NFTA_MASQ_FLAGS = 0x1 + NFTA_MASQ_REG_PROTO_MIN = 0x2 + NFTA_MASQ_REG_PROTO_MAX = 0x3 + NFTA_REDIR_UNSPEC = 0x0 + NFTA_REDIR_REG_PROTO_MIN = 0x1 + NFTA_REDIR_REG_PROTO_MAX = 0x2 + NFTA_REDIR_FLAGS = 0x3 + NFTA_DUP_UNSPEC = 0x0 + NFTA_DUP_SREG_ADDR = 0x1 + NFTA_DUP_SREG_DEV = 0x2 + NFTA_FWD_UNSPEC = 0x0 + NFTA_FWD_SREG_DEV = 0x1 + NFTA_OBJREF_UNSPEC = 0x0 + NFTA_OBJREF_IMM_TYPE = 0x1 + NFTA_OBJREF_IMM_NAME = 0x2 + NFTA_OBJREF_SET_SREG = 0x3 + NFTA_OBJREF_SET_NAME = 0x4 + NFTA_OBJREF_SET_ID = 0x5 + NFTA_GEN_UNSPEC = 0x0 + NFTA_GEN_ID = 0x1 + NFTA_GEN_PROC_PID = 0x2 + NFTA_GEN_PROC_NAME = 0x3 + NFTA_FIB_UNSPEC = 0x0 + NFTA_FIB_DREG = 0x1 + NFTA_FIB_RESULT = 0x2 + NFTA_FIB_FLAGS = 0x3 + NFT_FIB_RESULT_UNSPEC = 0x0 + NFT_FIB_RESULT_OIF = 0x1 + NFT_FIB_RESULT_OIFNAME = 0x2 + NFT_FIB_RESULT_ADDRTYPE = 0x3 + NFTA_FIB_F_SADDR = 0x1 + NFTA_FIB_F_DADDR = 0x2 + NFTA_FIB_F_MARK = 0x4 + NFTA_FIB_F_IIF = 0x8 + NFTA_FIB_F_OIF = 0x10 + NFTA_FIB_F_PRESENT = 0x20 + NFTA_CT_HELPER_UNSPEC = 0x0 + NFTA_CT_HELPER_NAME = 0x1 + NFTA_CT_HELPER_L3PROTO = 0x2 + NFTA_CT_HELPER_L4PROTO = 0x3 + NFTA_OBJ_UNSPEC = 0x0 + NFTA_OBJ_TABLE = 0x1 + NFTA_OBJ_NAME = 0x2 + NFTA_OBJ_TYPE = 0x3 + NFTA_OBJ_DATA = 0x4 + NFTA_OBJ_USE = 0x5 + NFTA_TRACE_UNSPEC = 0x0 + NFTA_TRACE_TABLE = 0x1 + NFTA_TRACE_CHAIN = 0x2 + NFTA_TRACE_RULE_HANDLE = 0x3 + NFTA_TRACE_TYPE = 0x4 + NFTA_TRACE_VERDICT = 0x5 + NFTA_TRACE_ID = 0x6 + NFTA_TRACE_LL_HEADER = 0x7 + NFTA_TRACE_NETWORK_HEADER = 0x8 + NFTA_TRACE_TRANSPORT_HEADER = 0x9 + NFTA_TRACE_IIF = 0xa + NFTA_TRACE_IIFTYPE = 0xb + NFTA_TRACE_OIF = 0xc + NFTA_TRACE_OIFTYPE = 0xd + NFTA_TRACE_MARK = 0xe + NFTA_TRACE_NFPROTO = 0xf + NFTA_TRACE_POLICY = 0x10 + NFTA_TRACE_PAD = 0x11 + NFT_TRACETYPE_UNSPEC = 0x0 + NFT_TRACETYPE_POLICY = 0x1 + NFT_TRACETYPE_RETURN = 0x2 + NFT_TRACETYPE_RULE = 0x3 + NFTA_NG_UNSPEC = 0x0 + NFTA_NG_DREG = 0x1 + NFTA_NG_MODULUS = 0x2 + NFTA_NG_TYPE = 0x3 + NFTA_NG_OFFSET = 0x4 + NFT_NG_INCREMENTAL = 0x0 + NFT_NG_RANDOM = 0x1 +) diff --git a/api/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go b/api/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go new file mode 100644 index 0000000..032a71b --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go @@ -0,0 +1,1841 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build s390x,linux + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Timex struct { + Modes uint32 + _ [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + _ [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + _ [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + _ [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + Ino uint64 + Nlink uint64 + Mode uint32 + Uid uint32 + Gid uint32 + _ int32 + Rdev uint64 + Size int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Blksize int64 + Blocks int64 + _ [3]int64 +} + +type StatxTimestamp struct { + Sec int64 + Nsec uint32 + _ int32 +} + +type Statx_t struct { + Mask uint32 + Blksize uint32 + Attributes uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Mode uint16 + _ [1]uint16 + Ino uint64 + Size uint64 + Blocks uint64 + Attributes_mask uint64 + Atime StatxTimestamp + Btime StatxTimestamp + Ctime StatxTimestamp + Mtime StatxTimestamp + Rdev_major uint32 + Rdev_minor uint32 + Dev_major uint32 + Dev_minor uint32 + _ [14]uint64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + _ [5]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + _ [4]byte + Start int64 + Len int64 + Pid int32 + _ [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x6 + FADV_NOREUSE = 0x7 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrL2 struct { + Family uint16 + Psm uint16 + Bdaddr [6]uint8 + Cid uint16 + Bdaddr_type uint8 + _ [1]byte +} + +type RawSockaddrCAN struct { + Family uint16 + _ [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + _ [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + _ [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + _ [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrL2 = 0xe + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x10 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_NUM_VF = 0x15 + IFLA_VFINFO_LIST = 0x16 + IFLA_STATS64 = 0x17 + IFLA_VF_PORTS = 0x18 + IFLA_PORT_SELF = 0x19 + IFLA_AF_SPEC = 0x1a + IFLA_GROUP = 0x1b + IFLA_NET_NS_FD = 0x1c + IFLA_EXT_MASK = 0x1d + IFLA_PROMISCUITY = 0x1e + IFLA_NUM_TX_QUEUES = 0x1f + IFLA_NUM_RX_QUEUES = 0x20 + IFLA_CARRIER = 0x21 + IFLA_PHYS_PORT_ID = 0x22 + IFLA_CARRIER_CHANGES = 0x23 + IFLA_PHYS_SWITCH_ID = 0x24 + IFLA_LINK_NETNSID = 0x25 + IFLA_PHYS_PORT_NAME = 0x26 + IFLA_PROTO_DOWN = 0x27 + IFLA_GSO_MAX_SEGS = 0x28 + IFLA_GSO_MAX_SIZE = 0x29 + IFLA_PAD = 0x2a + IFLA_XDP = 0x2b + IFLA_EVENT = 0x2c + IFLA_NEW_NETNSID = 0x2d + IFLA_IF_NETNSID = 0x2e + IFLA_MAX = 0x31 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + _ uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + _ [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Psw PtracePsw + Gprs [16]uint64 + Acrs [16]uint32 + Orig_gpr2 uint64 + Fp_regs PtraceFpregs + Per_info PtracePer + Ieee_instruction_pointer uint64 +} + +type PtracePsw struct { + Mask uint64 + Addr uint64 +} + +type PtraceFpregs struct { + Fpc uint32 + _ [4]byte + Fprs [16]float64 +} + +type PtracePer struct { + _ [0]uint64 + _ [24]byte + _ [8]byte + Starting_addr uint64 + Ending_addr uint64 + Perc_atmid uint16 + _ [6]byte + Address uint64 + Access_id uint8 + _ [7]byte +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + _ [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + _ [0]int8 + _ [4]byte +} + +type Utsname struct { + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte +} + +type Ustat_t struct { + Tfree int32 + _ [4]byte + Tinode uint64 + Fname [6]int8 + Fpack [6]int8 + _ [4]byte +} + +type EpollEvent struct { + Events uint32 + _ int32 + Fd int32 + Pad int32 +} + +const ( + AT_EMPTY_PATH = 0x1000 + AT_FDCWD = -0x64 + AT_NO_AUTOMOUNT = 0x800 + AT_REMOVEDIR = 0x200 + + AT_STATX_SYNC_AS_STAT = 0x0 + AT_STATX_FORCE_SYNC = 0x2000 + AT_STATX_DONT_SYNC = 0x4000 + + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + Val [16]uint64 +} + +const RNDGETENTCNT = 0x80045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [19]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + _ [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + _ [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + _ [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + _ [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type CGroupStats struct { + Sleeping uint64 + Running uint64 + Stopped uint64 + Uninterruptible uint64 + Io_wait uint64 +} + +const ( + CGROUPSTATS_CMD_UNSPEC = 0x3 + CGROUPSTATS_CMD_GET = 0x4 + CGROUPSTATS_CMD_NEW = 0x5 + CGROUPSTATS_TYPE_UNSPEC = 0x0 + CGROUPSTATS_TYPE_CGROUP_STATS = 0x1 + CGROUPSTATS_CMD_ATTR_UNSPEC = 0x0 + CGROUPSTATS_CMD_ATTR_FD = 0x1 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) + +type cpuMask uint64 + +const ( + _CPU_SETSIZE = 0x400 + _NCPUBITS = 0x40 +) + +const ( + BDADDR_BREDR = 0x0 + BDADDR_LE_PUBLIC = 0x1 + BDADDR_LE_RANDOM = 0x2 +) + +type PerfEventAttr struct { + Type uint32 + Size uint32 + Config uint64 + Sample uint64 + Sample_type uint64 + Read_format uint64 + Bits uint64 + Wakeup uint32 + Bp_type uint32 + Ext1 uint64 + Ext2 uint64 + Branch_sample_type uint64 + Sample_regs_user uint64 + Sample_stack_user uint32 + Clockid int32 + Sample_regs_intr uint64 + Aux_watermark uint32 + _ uint32 +} + +type PerfEventMmapPage struct { + Version uint32 + Compat_version uint32 + Lock uint32 + Index uint32 + Offset int64 + Time_enabled uint64 + Time_running uint64 + Capabilities uint64 + Pmc_width uint16 + Time_shift uint16 + Time_mult uint32 + Time_offset uint64 + Time_zero uint64 + Size uint32 + _ [948]uint8 + Data_head uint64 + Data_tail uint64 + Data_offset uint64 + Data_size uint64 + Aux_head uint64 + Aux_tail uint64 + Aux_offset uint64 + Aux_size uint64 +} + +const ( + PerfBitDisabled uint64 = CBitFieldMaskBit0 + PerfBitInherit = CBitFieldMaskBit1 + PerfBitPinned = CBitFieldMaskBit2 + PerfBitExclusive = CBitFieldMaskBit3 + PerfBitExcludeUser = CBitFieldMaskBit4 + PerfBitExcludeKernel = CBitFieldMaskBit5 + PerfBitExcludeHv = CBitFieldMaskBit6 + PerfBitExcludeIdle = CBitFieldMaskBit7 + PerfBitMmap = CBitFieldMaskBit8 + PerfBitComm = CBitFieldMaskBit9 + PerfBitFreq = CBitFieldMaskBit10 + PerfBitInheritStat = CBitFieldMaskBit11 + PerfBitEnableOnExec = CBitFieldMaskBit12 + PerfBitTask = CBitFieldMaskBit13 + PerfBitWatermark = CBitFieldMaskBit14 + PerfBitPreciseIPBit1 = CBitFieldMaskBit15 + PerfBitPreciseIPBit2 = CBitFieldMaskBit16 + PerfBitMmapData = CBitFieldMaskBit17 + PerfBitSampleIDAll = CBitFieldMaskBit18 + PerfBitExcludeHost = CBitFieldMaskBit19 + PerfBitExcludeGuest = CBitFieldMaskBit20 + PerfBitExcludeCallchainKernel = CBitFieldMaskBit21 + PerfBitExcludeCallchainUser = CBitFieldMaskBit22 + PerfBitMmap2 = CBitFieldMaskBit23 + PerfBitCommExec = CBitFieldMaskBit24 + PerfBitUseClockID = CBitFieldMaskBit25 + PerfBitContextSwitch = CBitFieldMaskBit26 +) + +const ( + PERF_TYPE_HARDWARE = 0x0 + PERF_TYPE_SOFTWARE = 0x1 + PERF_TYPE_TRACEPOINT = 0x2 + PERF_TYPE_HW_CACHE = 0x3 + PERF_TYPE_RAW = 0x4 + PERF_TYPE_BREAKPOINT = 0x5 + + PERF_COUNT_HW_CPU_CYCLES = 0x0 + PERF_COUNT_HW_INSTRUCTIONS = 0x1 + PERF_COUNT_HW_CACHE_REFERENCES = 0x2 + PERF_COUNT_HW_CACHE_MISSES = 0x3 + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 0x4 + PERF_COUNT_HW_BRANCH_MISSES = 0x5 + PERF_COUNT_HW_BUS_CYCLES = 0x6 + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7 + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 0x8 + PERF_COUNT_HW_REF_CPU_CYCLES = 0x9 + + PERF_COUNT_HW_CACHE_L1D = 0x0 + PERF_COUNT_HW_CACHE_L1I = 0x1 + PERF_COUNT_HW_CACHE_LL = 0x2 + PERF_COUNT_HW_CACHE_DTLB = 0x3 + PERF_COUNT_HW_CACHE_ITLB = 0x4 + PERF_COUNT_HW_CACHE_BPU = 0x5 + PERF_COUNT_HW_CACHE_NODE = 0x6 + + PERF_COUNT_HW_CACHE_OP_READ = 0x0 + PERF_COUNT_HW_CACHE_OP_WRITE = 0x1 + PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2 + + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0 + PERF_COUNT_HW_CACHE_RESULT_MISS = 0x1 + + PERF_COUNT_SW_CPU_CLOCK = 0x0 + PERF_COUNT_SW_TASK_CLOCK = 0x1 + PERF_COUNT_SW_PAGE_FAULTS = 0x2 + PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3 + PERF_COUNT_SW_CPU_MIGRATIONS = 0x4 + PERF_COUNT_SW_PAGE_FAULTS_MIN = 0x5 + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 0x6 + PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 + PERF_COUNT_SW_EMULATION_FAULTS = 0x8 + PERF_COUNT_SW_DUMMY = 0x9 + + PERF_SAMPLE_IP = 0x1 + PERF_SAMPLE_TID = 0x2 + PERF_SAMPLE_TIME = 0x4 + PERF_SAMPLE_ADDR = 0x8 + PERF_SAMPLE_READ = 0x10 + PERF_SAMPLE_CALLCHAIN = 0x20 + PERF_SAMPLE_ID = 0x40 + PERF_SAMPLE_CPU = 0x80 + PERF_SAMPLE_PERIOD = 0x100 + PERF_SAMPLE_STREAM_ID = 0x200 + PERF_SAMPLE_RAW = 0x400 + PERF_SAMPLE_BRANCH_STACK = 0x800 + + PERF_SAMPLE_BRANCH_USER = 0x1 + PERF_SAMPLE_BRANCH_KERNEL = 0x2 + PERF_SAMPLE_BRANCH_HV = 0x4 + PERF_SAMPLE_BRANCH_ANY = 0x8 + PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 + PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 + PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + + PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 + PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 + PERF_FORMAT_ID = 0x4 + PERF_FORMAT_GROUP = 0x8 + + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + + PERF_CONTEXT_HV = -0x20 + PERF_CONTEXT_KERNEL = -0x80 + PERF_CONTEXT_USER = -0x200 + + PERF_CONTEXT_GUEST = -0x800 + PERF_CONTEXT_GUEST_KERNEL = -0x880 + PERF_CONTEXT_GUEST_USER = -0xa00 + + PERF_FLAG_FD_NO_GROUP = 0x1 + PERF_FLAG_FD_OUTPUT = 0x2 + PERF_FLAG_PID_CGROUP = 0x4 +) + +const ( + CBitFieldMaskBit0 = 0x8000000000000000 + CBitFieldMaskBit1 = 0x4000000000000000 + CBitFieldMaskBit2 = 0x2000000000000000 + CBitFieldMaskBit3 = 0x1000000000000000 + CBitFieldMaskBit4 = 0x800000000000000 + CBitFieldMaskBit5 = 0x400000000000000 + CBitFieldMaskBit6 = 0x200000000000000 + CBitFieldMaskBit7 = 0x100000000000000 + CBitFieldMaskBit8 = 0x80000000000000 + CBitFieldMaskBit9 = 0x40000000000000 + CBitFieldMaskBit10 = 0x20000000000000 + CBitFieldMaskBit11 = 0x10000000000000 + CBitFieldMaskBit12 = 0x8000000000000 + CBitFieldMaskBit13 = 0x4000000000000 + CBitFieldMaskBit14 = 0x2000000000000 + CBitFieldMaskBit15 = 0x1000000000000 + CBitFieldMaskBit16 = 0x800000000000 + CBitFieldMaskBit17 = 0x400000000000 + CBitFieldMaskBit18 = 0x200000000000 + CBitFieldMaskBit19 = 0x100000000000 + CBitFieldMaskBit20 = 0x80000000000 + CBitFieldMaskBit21 = 0x40000000000 + CBitFieldMaskBit22 = 0x20000000000 + CBitFieldMaskBit23 = 0x10000000000 + CBitFieldMaskBit24 = 0x8000000000 + CBitFieldMaskBit25 = 0x4000000000 + CBitFieldMaskBit26 = 0x2000000000 + CBitFieldMaskBit27 = 0x1000000000 + CBitFieldMaskBit28 = 0x800000000 + CBitFieldMaskBit29 = 0x400000000 + CBitFieldMaskBit30 = 0x200000000 + CBitFieldMaskBit31 = 0x100000000 + CBitFieldMaskBit32 = 0x80000000 + CBitFieldMaskBit33 = 0x40000000 + CBitFieldMaskBit34 = 0x20000000 + CBitFieldMaskBit35 = 0x10000000 + CBitFieldMaskBit36 = 0x8000000 + CBitFieldMaskBit37 = 0x4000000 + CBitFieldMaskBit38 = 0x2000000 + CBitFieldMaskBit39 = 0x1000000 + CBitFieldMaskBit40 = 0x800000 + CBitFieldMaskBit41 = 0x400000 + CBitFieldMaskBit42 = 0x200000 + CBitFieldMaskBit43 = 0x100000 + CBitFieldMaskBit44 = 0x80000 + CBitFieldMaskBit45 = 0x40000 + CBitFieldMaskBit46 = 0x20000 + CBitFieldMaskBit47 = 0x10000 + CBitFieldMaskBit48 = 0x8000 + CBitFieldMaskBit49 = 0x4000 + CBitFieldMaskBit50 = 0x2000 + CBitFieldMaskBit51 = 0x1000 + CBitFieldMaskBit52 = 0x800 + CBitFieldMaskBit53 = 0x400 + CBitFieldMaskBit54 = 0x200 + CBitFieldMaskBit55 = 0x100 + CBitFieldMaskBit56 = 0x80 + CBitFieldMaskBit57 = 0x40 + CBitFieldMaskBit58 = 0x20 + CBitFieldMaskBit59 = 0x10 + CBitFieldMaskBit60 = 0x8 + CBitFieldMaskBit61 = 0x4 + CBitFieldMaskBit62 = 0x2 + CBitFieldMaskBit63 = 0x1 +) + +type SockaddrStorage struct { + Family uint16 + _ [118]int8 + _ uint64 +} + +type TCPMD5Sig struct { + Addr SockaddrStorage + Flags uint8 + Prefixlen uint8 + Keylen uint16 + _ uint32 + Key [80]uint8 +} + +type HDDriveCmdHdr struct { + Command uint8 + Number uint8 + Feature uint8 + Count uint8 +} + +type HDGeometry struct { + Heads uint8 + Sectors uint8 + Cylinders uint16 + _ [4]byte + Start uint64 +} + +type HDDriveID struct { + Config uint16 + Cyls uint16 + Reserved2 uint16 + Heads uint16 + Track_bytes uint16 + Sector_bytes uint16 + Sectors uint16 + Vendor0 uint16 + Vendor1 uint16 + Vendor2 uint16 + Serial_no [20]uint8 + Buf_type uint16 + Buf_size uint16 + Ecc_bytes uint16 + Fw_rev [8]uint8 + Model [40]uint8 + Max_multsect uint8 + Vendor3 uint8 + Dword_io uint16 + Vendor4 uint8 + Capability uint8 + Reserved50 uint16 + Vendor5 uint8 + TPIO uint8 + Vendor6 uint8 + TDMA uint8 + Field_valid uint16 + Cur_cyls uint16 + Cur_heads uint16 + Cur_sectors uint16 + Cur_capacity0 uint16 + Cur_capacity1 uint16 + Multsect uint8 + Multsect_valid uint8 + Lba_capacity uint32 + Dma_1word uint16 + Dma_mword uint16 + Eide_pio_modes uint16 + Eide_dma_min uint16 + Eide_dma_time uint16 + Eide_pio uint16 + Eide_pio_iordy uint16 + Words69_70 [2]uint16 + Words71_74 [4]uint16 + Queue_depth uint16 + Words76_79 [4]uint16 + Major_rev_num uint16 + Minor_rev_num uint16 + Command_set_1 uint16 + Command_set_2 uint16 + Cfsse uint16 + Cfs_enable_1 uint16 + Cfs_enable_2 uint16 + Csf_default uint16 + Dma_ultra uint16 + Trseuc uint16 + TrsEuc uint16 + CurAPMvalues uint16 + Mprc uint16 + Hw_config uint16 + Acoustic uint16 + Msrqs uint16 + Sxfert uint16 + Sal uint16 + Spg uint32 + Lba_capacity_2 uint64 + Words104_125 [22]uint16 + Last_lun uint16 + Word127 uint16 + Dlf uint16 + Csfo uint16 + Words130_155 [26]uint16 + Word156 uint16 + Words157_159 [3]uint16 + Cfa_power uint16 + Words161_175 [15]uint16 + Words176_205 [30]uint16 + Words206_254 [49]uint16 + Integrity_word uint16 +} + +type Statfs_t struct { + Type uint32 + Bsize uint32 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen uint32 + Frsize uint32 + Flags uint32 + Spare [4]uint32 + _ [4]byte +} + +const ( + ST_MANDLOCK = 0x40 + ST_NOATIME = 0x400 + ST_NODEV = 0x4 + ST_NODIRATIME = 0x800 + ST_NOEXEC = 0x8 + ST_NOSUID = 0x2 + ST_RDONLY = 0x1 + ST_RELATIME = 0x1000 + ST_SYNCHRONOUS = 0x10 +) + +type TpacketHdr struct { + Status uint64 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Usec uint32 + _ [4]byte +} + +type Tpacket2Hdr struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Nsec uint32 + Vlan_tci uint16 + Vlan_tpid uint16 + _ [4]uint8 +} + +type Tpacket3Hdr struct { + Next_offset uint32 + Sec uint32 + Nsec uint32 + Snaplen uint32 + Len uint32 + Status uint32 + Mac uint16 + Net uint16 + Hv1 TpacketHdrVariant1 + _ [8]uint8 +} + +type TpacketHdrVariant1 struct { + Rxhash uint32 + Vlan_tci uint32 + Vlan_tpid uint16 + _ uint16 +} + +type TpacketBlockDesc struct { + Version uint32 + To_priv uint32 + Hdr [40]byte +} + +type TpacketReq struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 +} + +type TpacketReq3 struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 + Retire_blk_tov uint32 + Sizeof_priv uint32 + Feature_req_word uint32 +} + +type TpacketStats struct { + Packets uint32 + Drops uint32 +} + +type TpacketStatsV3 struct { + Packets uint32 + Drops uint32 + Freeze_q_cnt uint32 +} + +type TpacketAuxdata struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Vlan_tci uint16 + Vlan_tpid uint16 +} + +const ( + TPACKET_V1 = 0x0 + TPACKET_V2 = 0x1 + TPACKET_V3 = 0x2 +) + +const ( + SizeofTpacketHdr = 0x20 + SizeofTpacket2Hdr = 0x20 + SizeofTpacket3Hdr = 0x30 +) + +const ( + NF_INET_PRE_ROUTING = 0x0 + NF_INET_LOCAL_IN = 0x1 + NF_INET_FORWARD = 0x2 + NF_INET_LOCAL_OUT = 0x3 + NF_INET_POST_ROUTING = 0x4 + NF_INET_NUMHOOKS = 0x5 +) + +const ( + NF_NETDEV_INGRESS = 0x0 + NF_NETDEV_NUMHOOKS = 0x1 +) + +const ( + NFPROTO_UNSPEC = 0x0 + NFPROTO_INET = 0x1 + NFPROTO_IPV4 = 0x2 + NFPROTO_ARP = 0x3 + NFPROTO_NETDEV = 0x5 + NFPROTO_BRIDGE = 0x7 + NFPROTO_IPV6 = 0xa + NFPROTO_DECNET = 0xc + NFPROTO_NUMPROTO = 0xd +) + +type Nfgenmsg struct { + Nfgen_family uint8 + Version uint8 + Res_id uint16 +} + +const ( + NFNL_BATCH_UNSPEC = 0x0 + NFNL_BATCH_GENID = 0x1 +) + +const ( + NFT_REG_VERDICT = 0x0 + NFT_REG_1 = 0x1 + NFT_REG_2 = 0x2 + NFT_REG_3 = 0x3 + NFT_REG_4 = 0x4 + NFT_REG32_00 = 0x8 + NFT_REG32_01 = 0x9 + NFT_REG32_02 = 0xa + NFT_REG32_03 = 0xb + NFT_REG32_04 = 0xc + NFT_REG32_05 = 0xd + NFT_REG32_06 = 0xe + NFT_REG32_07 = 0xf + NFT_REG32_08 = 0x10 + NFT_REG32_09 = 0x11 + NFT_REG32_10 = 0x12 + NFT_REG32_11 = 0x13 + NFT_REG32_12 = 0x14 + NFT_REG32_13 = 0x15 + NFT_REG32_14 = 0x16 + NFT_REG32_15 = 0x17 + NFT_CONTINUE = -0x1 + NFT_BREAK = -0x2 + NFT_JUMP = -0x3 + NFT_GOTO = -0x4 + NFT_RETURN = -0x5 + NFT_MSG_NEWTABLE = 0x0 + NFT_MSG_GETTABLE = 0x1 + NFT_MSG_DELTABLE = 0x2 + NFT_MSG_NEWCHAIN = 0x3 + NFT_MSG_GETCHAIN = 0x4 + NFT_MSG_DELCHAIN = 0x5 + NFT_MSG_NEWRULE = 0x6 + NFT_MSG_GETRULE = 0x7 + NFT_MSG_DELRULE = 0x8 + NFT_MSG_NEWSET = 0x9 + NFT_MSG_GETSET = 0xa + NFT_MSG_DELSET = 0xb + NFT_MSG_NEWSETELEM = 0xc + NFT_MSG_GETSETELEM = 0xd + NFT_MSG_DELSETELEM = 0xe + NFT_MSG_NEWGEN = 0xf + NFT_MSG_GETGEN = 0x10 + NFT_MSG_TRACE = 0x11 + NFT_MSG_NEWOBJ = 0x12 + NFT_MSG_GETOBJ = 0x13 + NFT_MSG_DELOBJ = 0x14 + NFT_MSG_GETOBJ_RESET = 0x15 + NFT_MSG_MAX = 0x19 + NFTA_LIST_UNPEC = 0x0 + NFTA_LIST_ELEM = 0x1 + NFTA_HOOK_UNSPEC = 0x0 + NFTA_HOOK_HOOKNUM = 0x1 + NFTA_HOOK_PRIORITY = 0x2 + NFTA_HOOK_DEV = 0x3 + NFT_TABLE_F_DORMANT = 0x1 + NFTA_TABLE_UNSPEC = 0x0 + NFTA_TABLE_NAME = 0x1 + NFTA_TABLE_FLAGS = 0x2 + NFTA_TABLE_USE = 0x3 + NFTA_CHAIN_UNSPEC = 0x0 + NFTA_CHAIN_TABLE = 0x1 + NFTA_CHAIN_HANDLE = 0x2 + NFTA_CHAIN_NAME = 0x3 + NFTA_CHAIN_HOOK = 0x4 + NFTA_CHAIN_POLICY = 0x5 + NFTA_CHAIN_USE = 0x6 + NFTA_CHAIN_TYPE = 0x7 + NFTA_CHAIN_COUNTERS = 0x8 + NFTA_CHAIN_PAD = 0x9 + NFTA_RULE_UNSPEC = 0x0 + NFTA_RULE_TABLE = 0x1 + NFTA_RULE_CHAIN = 0x2 + NFTA_RULE_HANDLE = 0x3 + NFTA_RULE_EXPRESSIONS = 0x4 + NFTA_RULE_COMPAT = 0x5 + NFTA_RULE_POSITION = 0x6 + NFTA_RULE_USERDATA = 0x7 + NFTA_RULE_PAD = 0x8 + NFTA_RULE_ID = 0x9 + NFT_RULE_COMPAT_F_INV = 0x2 + NFT_RULE_COMPAT_F_MASK = 0x2 + NFTA_RULE_COMPAT_UNSPEC = 0x0 + NFTA_RULE_COMPAT_PROTO = 0x1 + NFTA_RULE_COMPAT_FLAGS = 0x2 + NFT_SET_ANONYMOUS = 0x1 + NFT_SET_CONSTANT = 0x2 + NFT_SET_INTERVAL = 0x4 + NFT_SET_MAP = 0x8 + NFT_SET_TIMEOUT = 0x10 + NFT_SET_EVAL = 0x20 + NFT_SET_OBJECT = 0x40 + NFT_SET_POL_PERFORMANCE = 0x0 + NFT_SET_POL_MEMORY = 0x1 + NFTA_SET_DESC_UNSPEC = 0x0 + NFTA_SET_DESC_SIZE = 0x1 + NFTA_SET_UNSPEC = 0x0 + NFTA_SET_TABLE = 0x1 + NFTA_SET_NAME = 0x2 + NFTA_SET_FLAGS = 0x3 + NFTA_SET_KEY_TYPE = 0x4 + NFTA_SET_KEY_LEN = 0x5 + NFTA_SET_DATA_TYPE = 0x6 + NFTA_SET_DATA_LEN = 0x7 + NFTA_SET_POLICY = 0x8 + NFTA_SET_DESC = 0x9 + NFTA_SET_ID = 0xa + NFTA_SET_TIMEOUT = 0xb + NFTA_SET_GC_INTERVAL = 0xc + NFTA_SET_USERDATA = 0xd + NFTA_SET_PAD = 0xe + NFTA_SET_OBJ_TYPE = 0xf + NFT_SET_ELEM_INTERVAL_END = 0x1 + NFTA_SET_ELEM_UNSPEC = 0x0 + NFTA_SET_ELEM_KEY = 0x1 + NFTA_SET_ELEM_DATA = 0x2 + NFTA_SET_ELEM_FLAGS = 0x3 + NFTA_SET_ELEM_TIMEOUT = 0x4 + NFTA_SET_ELEM_EXPIRATION = 0x5 + NFTA_SET_ELEM_USERDATA = 0x6 + NFTA_SET_ELEM_EXPR = 0x7 + NFTA_SET_ELEM_PAD = 0x8 + NFTA_SET_ELEM_OBJREF = 0x9 + NFTA_SET_ELEM_LIST_UNSPEC = 0x0 + NFTA_SET_ELEM_LIST_TABLE = 0x1 + NFTA_SET_ELEM_LIST_SET = 0x2 + NFTA_SET_ELEM_LIST_ELEMENTS = 0x3 + NFTA_SET_ELEM_LIST_SET_ID = 0x4 + NFT_DATA_VALUE = 0x0 + NFT_DATA_VERDICT = 0xffffff00 + NFTA_DATA_UNSPEC = 0x0 + NFTA_DATA_VALUE = 0x1 + NFTA_DATA_VERDICT = 0x2 + NFTA_VERDICT_UNSPEC = 0x0 + NFTA_VERDICT_CODE = 0x1 + NFTA_VERDICT_CHAIN = 0x2 + NFTA_EXPR_UNSPEC = 0x0 + NFTA_EXPR_NAME = 0x1 + NFTA_EXPR_DATA = 0x2 + NFTA_IMMEDIATE_UNSPEC = 0x0 + NFTA_IMMEDIATE_DREG = 0x1 + NFTA_IMMEDIATE_DATA = 0x2 + NFTA_BITWISE_UNSPEC = 0x0 + NFTA_BITWISE_SREG = 0x1 + NFTA_BITWISE_DREG = 0x2 + NFTA_BITWISE_LEN = 0x3 + NFTA_BITWISE_MASK = 0x4 + NFTA_BITWISE_XOR = 0x5 + NFT_BYTEORDER_NTOH = 0x0 + NFT_BYTEORDER_HTON = 0x1 + NFTA_BYTEORDER_UNSPEC = 0x0 + NFTA_BYTEORDER_SREG = 0x1 + NFTA_BYTEORDER_DREG = 0x2 + NFTA_BYTEORDER_OP = 0x3 + NFTA_BYTEORDER_LEN = 0x4 + NFTA_BYTEORDER_SIZE = 0x5 + NFT_CMP_EQ = 0x0 + NFT_CMP_NEQ = 0x1 + NFT_CMP_LT = 0x2 + NFT_CMP_LTE = 0x3 + NFT_CMP_GT = 0x4 + NFT_CMP_GTE = 0x5 + NFTA_CMP_UNSPEC = 0x0 + NFTA_CMP_SREG = 0x1 + NFTA_CMP_OP = 0x2 + NFTA_CMP_DATA = 0x3 + NFT_RANGE_EQ = 0x0 + NFT_RANGE_NEQ = 0x1 + NFTA_RANGE_UNSPEC = 0x0 + NFTA_RANGE_SREG = 0x1 + NFTA_RANGE_OP = 0x2 + NFTA_RANGE_FROM_DATA = 0x3 + NFTA_RANGE_TO_DATA = 0x4 + NFT_LOOKUP_F_INV = 0x1 + NFTA_LOOKUP_UNSPEC = 0x0 + NFTA_LOOKUP_SET = 0x1 + NFTA_LOOKUP_SREG = 0x2 + NFTA_LOOKUP_DREG = 0x3 + NFTA_LOOKUP_SET_ID = 0x4 + NFTA_LOOKUP_FLAGS = 0x5 + NFT_DYNSET_OP_ADD = 0x0 + NFT_DYNSET_OP_UPDATE = 0x1 + NFT_DYNSET_F_INV = 0x1 + NFTA_DYNSET_UNSPEC = 0x0 + NFTA_DYNSET_SET_NAME = 0x1 + NFTA_DYNSET_SET_ID = 0x2 + NFTA_DYNSET_OP = 0x3 + NFTA_DYNSET_SREG_KEY = 0x4 + NFTA_DYNSET_SREG_DATA = 0x5 + NFTA_DYNSET_TIMEOUT = 0x6 + NFTA_DYNSET_EXPR = 0x7 + NFTA_DYNSET_PAD = 0x8 + NFTA_DYNSET_FLAGS = 0x9 + NFT_PAYLOAD_LL_HEADER = 0x0 + NFT_PAYLOAD_NETWORK_HEADER = 0x1 + NFT_PAYLOAD_TRANSPORT_HEADER = 0x2 + NFT_PAYLOAD_CSUM_NONE = 0x0 + NFT_PAYLOAD_CSUM_INET = 0x1 + NFT_PAYLOAD_L4CSUM_PSEUDOHDR = 0x1 + NFTA_PAYLOAD_UNSPEC = 0x0 + NFTA_PAYLOAD_DREG = 0x1 + NFTA_PAYLOAD_BASE = 0x2 + NFTA_PAYLOAD_OFFSET = 0x3 + NFTA_PAYLOAD_LEN = 0x4 + NFTA_PAYLOAD_SREG = 0x5 + NFTA_PAYLOAD_CSUM_TYPE = 0x6 + NFTA_PAYLOAD_CSUM_OFFSET = 0x7 + NFTA_PAYLOAD_CSUM_FLAGS = 0x8 + NFT_EXTHDR_F_PRESENT = 0x1 + NFT_EXTHDR_OP_IPV6 = 0x0 + NFT_EXTHDR_OP_TCPOPT = 0x1 + NFTA_EXTHDR_UNSPEC = 0x0 + NFTA_EXTHDR_DREG = 0x1 + NFTA_EXTHDR_TYPE = 0x2 + NFTA_EXTHDR_OFFSET = 0x3 + NFTA_EXTHDR_LEN = 0x4 + NFTA_EXTHDR_FLAGS = 0x5 + NFTA_EXTHDR_OP = 0x6 + NFTA_EXTHDR_SREG = 0x7 + NFT_META_LEN = 0x0 + NFT_META_PROTOCOL = 0x1 + NFT_META_PRIORITY = 0x2 + NFT_META_MARK = 0x3 + NFT_META_IIF = 0x4 + NFT_META_OIF = 0x5 + NFT_META_IIFNAME = 0x6 + NFT_META_OIFNAME = 0x7 + NFT_META_IIFTYPE = 0x8 + NFT_META_OIFTYPE = 0x9 + NFT_META_SKUID = 0xa + NFT_META_SKGID = 0xb + NFT_META_NFTRACE = 0xc + NFT_META_RTCLASSID = 0xd + NFT_META_SECMARK = 0xe + NFT_META_NFPROTO = 0xf + NFT_META_L4PROTO = 0x10 + NFT_META_BRI_IIFNAME = 0x11 + NFT_META_BRI_OIFNAME = 0x12 + NFT_META_PKTTYPE = 0x13 + NFT_META_CPU = 0x14 + NFT_META_IIFGROUP = 0x15 + NFT_META_OIFGROUP = 0x16 + NFT_META_CGROUP = 0x17 + NFT_META_PRANDOM = 0x18 + NFT_RT_CLASSID = 0x0 + NFT_RT_NEXTHOP4 = 0x1 + NFT_RT_NEXTHOP6 = 0x2 + NFT_RT_TCPMSS = 0x3 + NFT_HASH_JENKINS = 0x0 + NFT_HASH_SYM = 0x1 + NFTA_HASH_UNSPEC = 0x0 + NFTA_HASH_SREG = 0x1 + NFTA_HASH_DREG = 0x2 + NFTA_HASH_LEN = 0x3 + NFTA_HASH_MODULUS = 0x4 + NFTA_HASH_SEED = 0x5 + NFTA_HASH_OFFSET = 0x6 + NFTA_HASH_TYPE = 0x7 + NFTA_META_UNSPEC = 0x0 + NFTA_META_DREG = 0x1 + NFTA_META_KEY = 0x2 + NFTA_META_SREG = 0x3 + NFTA_RT_UNSPEC = 0x0 + NFTA_RT_DREG = 0x1 + NFTA_RT_KEY = 0x2 + NFT_CT_STATE = 0x0 + NFT_CT_DIRECTION = 0x1 + NFT_CT_STATUS = 0x2 + NFT_CT_MARK = 0x3 + NFT_CT_SECMARK = 0x4 + NFT_CT_EXPIRATION = 0x5 + NFT_CT_HELPER = 0x6 + NFT_CT_L3PROTOCOL = 0x7 + NFT_CT_SRC = 0x8 + NFT_CT_DST = 0x9 + NFT_CT_PROTOCOL = 0xa + NFT_CT_PROTO_SRC = 0xb + NFT_CT_PROTO_DST = 0xc + NFT_CT_LABELS = 0xd + NFT_CT_PKTS = 0xe + NFT_CT_BYTES = 0xf + NFT_CT_AVGPKT = 0x10 + NFT_CT_ZONE = 0x11 + NFT_CT_EVENTMASK = 0x12 + NFTA_CT_UNSPEC = 0x0 + NFTA_CT_DREG = 0x1 + NFTA_CT_KEY = 0x2 + NFTA_CT_DIRECTION = 0x3 + NFTA_CT_SREG = 0x4 + NFT_LIMIT_PKTS = 0x0 + NFT_LIMIT_PKT_BYTES = 0x1 + NFT_LIMIT_F_INV = 0x1 + NFTA_LIMIT_UNSPEC = 0x0 + NFTA_LIMIT_RATE = 0x1 + NFTA_LIMIT_UNIT = 0x2 + NFTA_LIMIT_BURST = 0x3 + NFTA_LIMIT_TYPE = 0x4 + NFTA_LIMIT_FLAGS = 0x5 + NFTA_LIMIT_PAD = 0x6 + NFTA_COUNTER_UNSPEC = 0x0 + NFTA_COUNTER_BYTES = 0x1 + NFTA_COUNTER_PACKETS = 0x2 + NFTA_COUNTER_PAD = 0x3 + NFTA_LOG_UNSPEC = 0x0 + NFTA_LOG_GROUP = 0x1 + NFTA_LOG_PREFIX = 0x2 + NFTA_LOG_SNAPLEN = 0x3 + NFTA_LOG_QTHRESHOLD = 0x4 + NFTA_LOG_LEVEL = 0x5 + NFTA_LOG_FLAGS = 0x6 + NFTA_QUEUE_UNSPEC = 0x0 + NFTA_QUEUE_NUM = 0x1 + NFTA_QUEUE_TOTAL = 0x2 + NFTA_QUEUE_FLAGS = 0x3 + NFTA_QUEUE_SREG_QNUM = 0x4 + NFT_QUOTA_F_INV = 0x1 + NFT_QUOTA_F_DEPLETED = 0x2 + NFTA_QUOTA_UNSPEC = 0x0 + NFTA_QUOTA_BYTES = 0x1 + NFTA_QUOTA_FLAGS = 0x2 + NFTA_QUOTA_PAD = 0x3 + NFTA_QUOTA_CONSUMED = 0x4 + NFT_REJECT_ICMP_UNREACH = 0x0 + NFT_REJECT_TCP_RST = 0x1 + NFT_REJECT_ICMPX_UNREACH = 0x2 + NFT_REJECT_ICMPX_NO_ROUTE = 0x0 + NFT_REJECT_ICMPX_PORT_UNREACH = 0x1 + NFT_REJECT_ICMPX_HOST_UNREACH = 0x2 + NFT_REJECT_ICMPX_ADMIN_PROHIBITED = 0x3 + NFTA_REJECT_UNSPEC = 0x0 + NFTA_REJECT_TYPE = 0x1 + NFTA_REJECT_ICMP_CODE = 0x2 + NFT_NAT_SNAT = 0x0 + NFT_NAT_DNAT = 0x1 + NFTA_NAT_UNSPEC = 0x0 + NFTA_NAT_TYPE = 0x1 + NFTA_NAT_FAMILY = 0x2 + NFTA_NAT_REG_ADDR_MIN = 0x3 + NFTA_NAT_REG_ADDR_MAX = 0x4 + NFTA_NAT_REG_PROTO_MIN = 0x5 + NFTA_NAT_REG_PROTO_MAX = 0x6 + NFTA_NAT_FLAGS = 0x7 + NFTA_MASQ_UNSPEC = 0x0 + NFTA_MASQ_FLAGS = 0x1 + NFTA_MASQ_REG_PROTO_MIN = 0x2 + NFTA_MASQ_REG_PROTO_MAX = 0x3 + NFTA_REDIR_UNSPEC = 0x0 + NFTA_REDIR_REG_PROTO_MIN = 0x1 + NFTA_REDIR_REG_PROTO_MAX = 0x2 + NFTA_REDIR_FLAGS = 0x3 + NFTA_DUP_UNSPEC = 0x0 + NFTA_DUP_SREG_ADDR = 0x1 + NFTA_DUP_SREG_DEV = 0x2 + NFTA_FWD_UNSPEC = 0x0 + NFTA_FWD_SREG_DEV = 0x1 + NFTA_OBJREF_UNSPEC = 0x0 + NFTA_OBJREF_IMM_TYPE = 0x1 + NFTA_OBJREF_IMM_NAME = 0x2 + NFTA_OBJREF_SET_SREG = 0x3 + NFTA_OBJREF_SET_NAME = 0x4 + NFTA_OBJREF_SET_ID = 0x5 + NFTA_GEN_UNSPEC = 0x0 + NFTA_GEN_ID = 0x1 + NFTA_GEN_PROC_PID = 0x2 + NFTA_GEN_PROC_NAME = 0x3 + NFTA_FIB_UNSPEC = 0x0 + NFTA_FIB_DREG = 0x1 + NFTA_FIB_RESULT = 0x2 + NFTA_FIB_FLAGS = 0x3 + NFT_FIB_RESULT_UNSPEC = 0x0 + NFT_FIB_RESULT_OIF = 0x1 + NFT_FIB_RESULT_OIFNAME = 0x2 + NFT_FIB_RESULT_ADDRTYPE = 0x3 + NFTA_FIB_F_SADDR = 0x1 + NFTA_FIB_F_DADDR = 0x2 + NFTA_FIB_F_MARK = 0x4 + NFTA_FIB_F_IIF = 0x8 + NFTA_FIB_F_OIF = 0x10 + NFTA_FIB_F_PRESENT = 0x20 + NFTA_CT_HELPER_UNSPEC = 0x0 + NFTA_CT_HELPER_NAME = 0x1 + NFTA_CT_HELPER_L3PROTO = 0x2 + NFTA_CT_HELPER_L4PROTO = 0x3 + NFTA_OBJ_UNSPEC = 0x0 + NFTA_OBJ_TABLE = 0x1 + NFTA_OBJ_NAME = 0x2 + NFTA_OBJ_TYPE = 0x3 + NFTA_OBJ_DATA = 0x4 + NFTA_OBJ_USE = 0x5 + NFTA_TRACE_UNSPEC = 0x0 + NFTA_TRACE_TABLE = 0x1 + NFTA_TRACE_CHAIN = 0x2 + NFTA_TRACE_RULE_HANDLE = 0x3 + NFTA_TRACE_TYPE = 0x4 + NFTA_TRACE_VERDICT = 0x5 + NFTA_TRACE_ID = 0x6 + NFTA_TRACE_LL_HEADER = 0x7 + NFTA_TRACE_NETWORK_HEADER = 0x8 + NFTA_TRACE_TRANSPORT_HEADER = 0x9 + NFTA_TRACE_IIF = 0xa + NFTA_TRACE_IIFTYPE = 0xb + NFTA_TRACE_OIF = 0xc + NFTA_TRACE_OIFTYPE = 0xd + NFTA_TRACE_MARK = 0xe + NFTA_TRACE_NFPROTO = 0xf + NFTA_TRACE_POLICY = 0x10 + NFTA_TRACE_PAD = 0x11 + NFT_TRACETYPE_UNSPEC = 0x0 + NFT_TRACETYPE_POLICY = 0x1 + NFT_TRACETYPE_RETURN = 0x2 + NFT_TRACETYPE_RULE = 0x3 + NFTA_NG_UNSPEC = 0x0 + NFTA_NG_DREG = 0x1 + NFTA_NG_MODULUS = 0x2 + NFTA_NG_TYPE = 0x3 + NFTA_NG_OFFSET = 0x4 + NFT_NG_INCREMENTAL = 0x0 + NFT_NG_RANDOM = 0x1 +) diff --git a/api/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go b/api/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go new file mode 100644 index 0000000..8e7384b --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go @@ -0,0 +1,690 @@ +// +build sparc64,linux +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_linux.go | go run mkpost.go + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int32 + Pad_cgo_0 [4]byte +} + +type Timex struct { + Modes uint32 + Pad_cgo_0 [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + Pad_cgo_1 [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + Pad_cgo_2 [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + Pad_cgo_3 [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + X__pad1 uint16 + Pad_cgo_0 [6]byte + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint64 + X__pad2 uint16 + Pad_cgo_1 [6]byte + Size int64 + Blksize int64 + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + X__glibc_reserved4 uint64 + X__glibc_reserved5 uint64 +} + +type Statfs_t struct { + Type int64 + Bsize int64 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen int64 + Frsize int64 + Flags int64 + Spare [4]int64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + Pad_cgo_0 [5]byte +} + +type Fsid struct { + X__val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + Pad_cgo_0 [4]byte + Start int64 + Len int64 + Pid int32 + X__glibc_reserved int16 + Pad_cgo_1 [2]byte +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrCAN struct { + Family uint16 + Pad_cgo_0 [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + Pad_cgo_1 [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + Pad_cgo_0 [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_NUM_VF = 0x15 + IFLA_VFINFO_LIST = 0x16 + IFLA_STATS64 = 0x17 + IFLA_VF_PORTS = 0x18 + IFLA_PORT_SELF = 0x19 + IFLA_AF_SPEC = 0x1a + IFLA_GROUP = 0x1b + IFLA_NET_NS_FD = 0x1c + IFLA_EXT_MASK = 0x1d + IFLA_PROMISCUITY = 0x1e + IFLA_NUM_TX_QUEUES = 0x1f + IFLA_NUM_RX_QUEUES = 0x20 + IFLA_CARRIER = 0x21 + IFLA_PHYS_PORT_ID = 0x22 + IFLA_CARRIER_CHANGES = 0x23 + IFLA_PHYS_SWITCH_ID = 0x24 + IFLA_LINK_NETNSID = 0x25 + IFLA_PHYS_PORT_NAME = 0x26 + IFLA_PROTO_DOWN = 0x27 + IFLA_GSO_MAX_SEGS = 0x28 + IFLA_GSO_MAX_SIZE = 0x29 + IFLA_PAD = 0x2a + IFLA_XDP = 0x2b + IFLA_EVENT = 0x2c + IFLA_NEW_NETNSID = 0x2d + IFLA_IF_NETNSID = 0x2e + IFLA_MAX = 0x2e + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + X__ifi_pad uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Regs [16]uint64 + Tstate uint64 + Tpc uint64 + Tnpc uint64 + Y uint32 + Magic uint32 +} + +type ptracePsw struct { +} + +type ptraceFpregs struct { +} + +type ptracePer struct { +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + Pad_cgo_0 [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + X_f [0]int8 + Pad_cgo_1 [4]byte +} + +type Utsname struct { + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte +} + +type Ustat_t struct { + Tfree int32 + Pad_cgo_0 [4]byte + Tinode uint64 + Fname [6]int8 + Fpack [6]int8 + Pad_cgo_1 [4]byte +} + +type EpollEvent struct { + Events uint32 + X_padFd int32 + Fd int32 + Pad int32 +} + +const ( + AT_FDCWD = -0x64 + AT_REMOVEDIR = 0x200 + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x800 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + X__val [16]uint64 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [19]uint8 + Ispeed uint32 + Ospeed uint32 +} diff --git a/api/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go b/api/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go new file mode 100644 index 0000000..4b86fb2 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go @@ -0,0 +1,448 @@ +// cgo -godefs types_netbsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,netbsd + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int32 +} + +type Timeval struct { + Sec int64 + Usec int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + Mode uint32 + Ino uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint64 + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Birthtimespec Timespec + Size int64 + Blocks int64 + Blksize uint32 + Flags uint32 + Gen uint32 + Spare [2]uint32 +} + +type Statfs_t [0]byte + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Dirent struct { + Fileno uint64 + Reclen uint16 + Namlen uint16 + Type uint8 + Name [512]int8 + Pad_cgo_0 [3]byte +} + +type Fsid struct { + X__fsid_val [2]int32 +} + +const ( + PathMax = 0x400 +) + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x14 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter uint32 + Flags uint32 + Fflags uint32 + Data int64 + Udata int32 +} + +type FdSet struct { + Bits [8]uint32 +} + +const ( + SizeofIfMsghdr = 0x98 + SizeofIfData = 0x84 + SizeofIfaMsghdr = 0x18 + SizeofIfAnnounceMsghdr = 0x18 + SizeofRtMsghdr = 0x78 + SizeofRtMetrics = 0x50 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData + Pad_cgo_1 [4]byte +} + +type IfData struct { + Type uint8 + Addrlen uint8 + Hdrlen uint8 + Pad_cgo_0 [1]byte + Link_state int32 + Mtu uint64 + Metric uint64 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Lastchange Timespec +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Metric int32 + Index uint16 + Pad_cgo_0 [6]byte +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Name [16]int8 + What uint16 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits int32 + Pad_cgo_1 [4]byte + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint64 + Mtu uint64 + Hopcount uint64 + Recvpipe uint64 + Sendpipe uint64 + Ssthresh uint64 + Rtt uint64 + Rttvar uint64 + Expire int64 + Pksent int64 +} + +type Mclpool [0]byte + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x80 + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint64 + Drop uint64 + Capt uint64 + Padding [13]uint64 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp BpfTimeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [2]byte +} + +type BpfTimeval struct { + Sec int32 + Usec int32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed int32 + Ospeed int32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_SYMLINK_NOFOLLOW = 0x200 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type Sysctlnode struct { + Flags uint32 + Num int32 + Name [32]int8 + Ver uint32 + X__rsvd uint32 + Un [16]byte + X_sysctl_size [8]byte + X_sysctl_func [8]byte + X_sysctl_parent [8]byte + X_sysctl_desc [8]byte +} + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} diff --git a/api/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go b/api/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go new file mode 100644 index 0000000..9048a50 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go @@ -0,0 +1,455 @@ +// cgo -godefs types_netbsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,netbsd + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int32 + Pad_cgo_0 [4]byte +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + Mode uint32 + Pad_cgo_0 [4]byte + Ino uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Pad_cgo_1 [4]byte + Rdev uint64 + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Birthtimespec Timespec + Size int64 + Blocks int64 + Blksize uint32 + Flags uint32 + Gen uint32 + Spare [2]uint32 + Pad_cgo_2 [4]byte +} + +type Statfs_t [0]byte + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Dirent struct { + Fileno uint64 + Reclen uint16 + Namlen uint16 + Type uint8 + Name [512]int8 + Pad_cgo_0 [3]byte +} + +type Fsid struct { + X__fsid_val [2]int32 +} + +const ( + PathMax = 0x400 +) + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *Iovec + Iovlen int32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x14 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint64 + Filter uint32 + Flags uint32 + Fflags uint32 + Pad_cgo_0 [4]byte + Data int64 + Udata int64 +} + +type FdSet struct { + Bits [8]uint32 +} + +const ( + SizeofIfMsghdr = 0x98 + SizeofIfData = 0x88 + SizeofIfaMsghdr = 0x18 + SizeofIfAnnounceMsghdr = 0x18 + SizeofRtMsghdr = 0x78 + SizeofRtMetrics = 0x50 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Addrlen uint8 + Hdrlen uint8 + Pad_cgo_0 [1]byte + Link_state int32 + Mtu uint64 + Metric uint64 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Lastchange Timespec +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Metric int32 + Index uint16 + Pad_cgo_0 [6]byte +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Name [16]int8 + What uint16 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits int32 + Pad_cgo_1 [4]byte + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint64 + Mtu uint64 + Hopcount uint64 + Recvpipe uint64 + Sendpipe uint64 + Ssthresh uint64 + Rtt uint64 + Rttvar uint64 + Expire int64 + Pksent int64 +} + +type Mclpool [0]byte + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x80 + SizeofBpfProgram = 0x10 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x20 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint64 + Drop uint64 + Capt uint64 + Padding [13]uint64 +} + +type BpfProgram struct { + Len uint32 + Pad_cgo_0 [4]byte + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp BpfTimeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [6]byte +} + +type BpfTimeval struct { + Sec int64 + Usec int64 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed int32 + Ospeed int32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_SYMLINK_NOFOLLOW = 0x200 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type Sysctlnode struct { + Flags uint32 + Num int32 + Name [32]int8 + Ver uint32 + X__rsvd uint32 + Un [16]byte + X_sysctl_size [8]byte + X_sysctl_func [8]byte + X_sysctl_parent [8]byte + X_sysctl_desc [8]byte +} + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} diff --git a/api/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go b/api/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go new file mode 100644 index 0000000..00525e7 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go @@ -0,0 +1,453 @@ +// cgo -godefs types_netbsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,netbsd + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int32 + Pad_cgo_0 [4]byte +} + +type Timeval struct { + Sec int64 + Usec int32 + Pad_cgo_0 [4]byte +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + Mode uint32 + Pad_cgo_0 [4]byte + Ino uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Pad_cgo_1 [4]byte + Rdev uint64 + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Birthtimespec Timespec + Size int64 + Blocks int64 + Blksize uint32 + Flags uint32 + Gen uint32 + Spare [2]uint32 + Pad_cgo_2 [4]byte +} + +type Statfs_t [0]byte + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Dirent struct { + Fileno uint64 + Reclen uint16 + Namlen uint16 + Type uint8 + Name [512]int8 + Pad_cgo_0 [3]byte +} + +type Fsid struct { + X__fsid_val [2]int32 +} + +const ( + PathMax = 0x400 +) + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x14 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter uint32 + Flags uint32 + Fflags uint32 + Data int64 + Udata int32 + Pad_cgo_0 [4]byte +} + +type FdSet struct { + Bits [8]uint32 +} + +const ( + SizeofIfMsghdr = 0x98 + SizeofIfData = 0x88 + SizeofIfaMsghdr = 0x18 + SizeofIfAnnounceMsghdr = 0x18 + SizeofRtMsghdr = 0x78 + SizeofRtMetrics = 0x50 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Addrlen uint8 + Hdrlen uint8 + Pad_cgo_0 [1]byte + Link_state int32 + Mtu uint64 + Metric uint64 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Lastchange Timespec +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Metric int32 + Index uint16 + Pad_cgo_0 [6]byte +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Name [16]int8 + What uint16 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits int32 + Pad_cgo_1 [4]byte + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint64 + Mtu uint64 + Hopcount uint64 + Recvpipe uint64 + Sendpipe uint64 + Ssthresh uint64 + Rtt uint64 + Rttvar uint64 + Expire int64 + Pksent int64 +} + +type Mclpool [0]byte + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x80 + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint64 + Drop uint64 + Capt uint64 + Padding [13]uint64 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp BpfTimeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [2]byte +} + +type BpfTimeval struct { + Sec int32 + Usec int32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed int32 + Ospeed int32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_SYMLINK_NOFOLLOW = 0x200 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type Sysctlnode struct { + Flags uint32 + Num int32 + Name [32]int8 + Ver uint32 + X__rsvd uint32 + Un [16]byte + X_sysctl_size [8]byte + X_sysctl_func [8]byte + X_sysctl_parent [8]byte + X_sysctl_desc [8]byte +} + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} diff --git a/api/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go b/api/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go new file mode 100644 index 0000000..d5a2d75 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go @@ -0,0 +1,484 @@ +// cgo -godefs types_openbsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,openbsd + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int32 +} + +type Timeval struct { + Sec int64 + Usec int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +const ( + S_IFMT = 0xf000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 + S_ISUID = 0x800 + S_ISGID = 0x400 + S_ISVTX = 0x200 + S_IRUSR = 0x100 + S_IWUSR = 0x80 + S_IXUSR = 0x40 +) + +type Stat_t struct { + Mode uint32 + Dev int32 + Ino uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev int32 + Atim Timespec + Mtim Timespec + Ctim Timespec + Size int64 + Blocks int64 + Blksize uint32 + Flags uint32 + Gen uint32 + X__st_birthtim Timespec +} + +type Statfs_t struct { + F_flags uint32 + F_bsize uint32 + F_iosize uint32 + F_blocks uint64 + F_bfree uint64 + F_bavail int64 + F_files uint64 + F_ffree uint64 + F_favail int64 + F_syncwrites uint64 + F_syncreads uint64 + F_asyncwrites uint64 + F_asyncreads uint64 + F_fsid Fsid + F_namemax uint32 + F_owner uint32 + F_ctime uint64 + F_fstypename [16]int8 + F_mntonname [90]int8 + F_mntfromname [90]int8 + F_mntfromspec [90]int8 + Pad_cgo_0 [2]byte + Mount_info [160]byte +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Dirent struct { + Fileno uint64 + Off int64 + Reclen uint16 + Type uint8 + Namlen uint8 + X__d_padding [4]uint8 + Name [256]int8 +} + +type Fsid struct { + Val [2]int32 +} + +const ( + PathMax = 0x400 +) + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [24]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x20 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter int16 + Flags uint16 + Fflags uint32 + Data int64 + Udata *byte +} + +type FdSet struct { + Bits [32]uint32 +} + +const ( + SizeofIfMsghdr = 0xec + SizeofIfData = 0xd4 + SizeofIfaMsghdr = 0x18 + SizeofIfAnnounceMsghdr = 0x1a + SizeofRtMsghdr = 0x60 + SizeofRtMetrics = 0x38 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Pad1 uint8 + Pad2 uint8 + Addrs int32 + Flags int32 + Xflags int32 + Data IfData +} + +type IfData struct { + Type uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Mtu uint32 + Metric uint32 + Pad uint32 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Capabilities uint32 + Lastchange Timeval + Mclpool [7]Mclpool +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Pad1 uint8 + Pad2 uint8 + Addrs int32 + Flags int32 + Metric int32 +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + What uint16 + Name [16]int8 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Priority uint8 + Mpls uint8 + Addrs int32 + Flags int32 + Fmask int32 + Pid int32 + Seq int32 + Errno int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Pksent uint64 + Expire int64 + Locks uint32 + Mtu uint32 + Refcnt uint32 + Hopcount uint32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pad uint32 +} + +type Mclpool struct { + Grown int32 + Alive uint16 + Hwm uint16 + Cwm uint16 + Lwm uint16 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp BpfTimeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [2]byte +} + +type BpfTimeval struct { + Sec uint32 + Usec uint32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed int32 + Ospeed int32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_SYMLINK_NOFOLLOW = 0x2 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} diff --git a/api/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go b/api/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go new file mode 100644 index 0000000..5a9c818 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go @@ -0,0 +1,484 @@ +// cgo -godefs types_openbsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,openbsd + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +const ( + S_IFMT = 0xf000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 + S_ISUID = 0x800 + S_ISGID = 0x400 + S_ISVTX = 0x200 + S_IRUSR = 0x100 + S_IWUSR = 0x80 + S_IXUSR = 0x40 +) + +type Stat_t struct { + Mode uint32 + Dev int32 + Ino uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev int32 + Atim Timespec + Mtim Timespec + Ctim Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + _ [4]byte + _ Timespec +} + +type Statfs_t struct { + F_flags uint32 + F_bsize uint32 + F_iosize uint32 + _ [4]byte + F_blocks uint64 + F_bfree uint64 + F_bavail int64 + F_files uint64 + F_ffree uint64 + F_favail int64 + F_syncwrites uint64 + F_syncreads uint64 + F_asyncwrites uint64 + F_asyncreads uint64 + F_fsid Fsid + F_namemax uint32 + F_owner uint32 + F_ctime uint64 + F_fstypename [16]int8 + F_mntonname [90]int8 + F_mntfromname [90]int8 + F_mntfromspec [90]int8 + _ [2]byte + Mount_info [160]byte +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Dirent struct { + Fileno uint64 + Off int64 + Reclen uint16 + Type uint8 + Namlen uint8 + _ [4]uint8 + Name [256]int8 +} + +type Fsid struct { + Val [2]int32 +} + +const ( + PathMax = 0x400 +) + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [24]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + _ [4]byte + Iov *Iovec + Iovlen uint32 + _ [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x20 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint64 + Filter int16 + Flags uint16 + Fflags uint32 + Data int64 + Udata *byte +} + +type FdSet struct { + Bits [32]uint32 +} + +const ( + SizeofIfMsghdr = 0xa8 + SizeofIfData = 0x90 + SizeofIfaMsghdr = 0x18 + SizeofIfAnnounceMsghdr = 0x1a + SizeofRtMsghdr = 0x60 + SizeofRtMetrics = 0x38 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Pad1 uint8 + Pad2 uint8 + Addrs int32 + Flags int32 + Xflags int32 + Data IfData +} + +type IfData struct { + Type uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Mtu uint32 + Metric uint32 + Rdomain uint32 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Oqdrops uint64 + Noproto uint64 + Capabilities uint32 + _ [4]byte + Lastchange Timeval +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Pad1 uint8 + Pad2 uint8 + Addrs int32 + Flags int32 + Metric int32 +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + What uint16 + Name [16]int8 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Priority uint8 + Mpls uint8 + Addrs int32 + Flags int32 + Fmask int32 + Pid int32 + Seq int32 + Errno int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Pksent uint64 + Expire int64 + Locks uint32 + Mtu uint32 + Refcnt uint32 + Hopcount uint32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pad uint32 +} + +type Mclpool struct{} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfProgram = 0x10 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfProgram struct { + Len uint32 + _ [4]byte + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp BpfTimeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + _ [2]byte +} + +type BpfTimeval struct { + Sec uint32 + Usec uint32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed int32 + Ospeed int32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_SYMLINK_NOFOLLOW = 0x2 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} diff --git a/api/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go b/api/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go new file mode 100644 index 0000000..e35b13b --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go @@ -0,0 +1,477 @@ +// cgo -godefs types_openbsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,openbsd + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int32 +} + +type Timeval struct { + Sec int64 + Usec int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +const ( + S_IFMT = 0xf000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 + S_ISUID = 0x800 + S_ISGID = 0x400 + S_ISVTX = 0x200 + S_IRUSR = 0x100 + S_IWUSR = 0x80 + S_IXUSR = 0x40 +) + +type Stat_t struct { + Mode uint32 + Dev int32 + Ino uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev int32 + Atim Timespec + Mtim Timespec + Ctim Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + X__st_birthtim Timespec +} + +type Statfs_t struct { + F_flags uint32 + F_bsize uint32 + F_iosize uint32 + F_blocks uint64 + F_bfree uint64 + F_bavail int64 + F_files uint64 + F_ffree uint64 + F_favail int64 + F_syncwrites uint64 + F_syncreads uint64 + F_asyncwrites uint64 + F_asyncreads uint64 + F_fsid Fsid + F_namemax uint32 + F_owner uint32 + F_ctime uint64 + F_fstypename [16]uint8 + F_mntonname [90]uint8 + F_mntfromname [90]uint8 + F_mntfromspec [90]uint8 + Pad_cgo_0 [2]byte + Mount_info [160]byte +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Dirent struct { + Fileno uint64 + Off int64 + Reclen uint16 + Type uint8 + Namlen uint8 + X__d_padding [4]uint8 + Name [256]uint8 +} + +type Fsid struct { + Val [2]int32 +} + +const ( + PathMax = 0x400 +) + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [24]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x20 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter int16 + Flags uint16 + Fflags uint32 + Data int64 + Udata *byte +} + +type FdSet struct { + Bits [32]uint32 +} + +const ( + SizeofIfMsghdr = 0x98 + SizeofIfData = 0x80 + SizeofIfaMsghdr = 0x18 + SizeofIfAnnounceMsghdr = 0x1a + SizeofRtMsghdr = 0x60 + SizeofRtMetrics = 0x38 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Pad1 uint8 + Pad2 uint8 + Addrs int32 + Flags int32 + Xflags int32 + Data IfData +} + +type IfData struct { + Type uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Mtu uint32 + Metric uint32 + Pad uint32 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Capabilities uint32 + Lastchange Timeval +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Pad1 uint8 + Pad2 uint8 + Addrs int32 + Flags int32 + Metric int32 +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + What uint16 + Name [16]uint8 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Priority uint8 + Mpls uint8 + Addrs int32 + Flags int32 + Fmask int32 + Pid int32 + Seq int32 + Errno int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Pksent uint64 + Expire int64 + Locks uint32 + Mtu uint32 + Refcnt uint32 + Hopcount uint32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pad uint32 +} + +type Mclpool struct{} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp BpfTimeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [2]byte +} + +type BpfTimeval struct { + Sec uint32 + Usec uint32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed int32 + Ospeed int32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_SYMLINK_NOFOLLOW = 0x2 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} diff --git a/api/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go b/api/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go new file mode 100644 index 0000000..2248598 --- /dev/null +++ b/api/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go @@ -0,0 +1,459 @@ +// cgo -godefs types_solaris.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,solaris + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 + PathMax = 0x400 + MaxHostNameLen = 0x100 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Timeval32 struct { + Sec int32 + Usec int32 +} + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +const ( + S_IFMT = 0xf000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 + S_ISUID = 0x800 + S_ISGID = 0x400 + S_ISVTX = 0x200 + S_IRUSR = 0x100 + S_IWUSR = 0x80 + S_IXUSR = 0x40 +) + +type Stat_t struct { + Dev uint64 + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint64 + Size int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Blksize int32 + _ [4]byte + Blocks int64 + Fstype [16]int8 +} + +type Flock_t struct { + Type int16 + Whence int16 + _ [4]byte + Start int64 + Len int64 + Sysid int32 + Pid int32 + Pad [4]int64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Name [1]int8 + _ [5]byte +} + +type _Fsblkcnt_t uint64 + +type Statvfs_t struct { + Bsize uint64 + Frsize uint64 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Favail uint64 + Fsid uint64 + Basetype [16]int8 + Flag uint64 + Namemax uint64 + Fstr [32]int8 +} + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 + X__sin6_src_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrDatalink struct { + Family uint16 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [244]int8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [236]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *int8 + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + _ [4]byte + Iov *Iovec + Iovlen int32 + _ [4]byte + Accrights *int8 + Accrightslen int32 + _ [4]byte +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + X__icmp6_filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x20 + SizeofSockaddrAny = 0xfc + SizeofSockaddrUnix = 0x6e + SizeofSockaddrDatalink = 0xfc + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x24 + SizeofICMPv6Filter = 0x20 +) + +type FdSet struct { + Bits [1024]int64 +} + +type Utsname struct { + Sysname [257]byte + Nodename [257]byte + Release [257]byte + Version [257]byte + Machine [257]byte +} + +type Ustat_t struct { + Tfree int64 + Tinode uint64 + Fname [6]int8 + Fpack [6]int8 + _ [4]byte +} + +const ( + AT_FDCWD = 0xffd19553 + AT_SYMLINK_NOFOLLOW = 0x1000 + AT_SYMLINK_FOLLOW = 0x2000 + AT_REMOVEDIR = 0x1 + AT_EACCESS = 0x4 +) + +const ( + SizeofIfMsghdr = 0x54 + SizeofIfData = 0x44 + SizeofIfaMsghdr = 0x14 + SizeofRtMsghdr = 0x4c + SizeofRtMetrics = 0x28 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Addrlen uint8 + Hdrlen uint8 + _ [1]byte + Mtu uint32 + Metric uint32 + Baudrate uint32 + Ipackets uint32 + Ierrors uint32 + Opackets uint32 + Oerrors uint32 + Collisions uint32 + Ibytes uint32 + Obytes uint32 + Imcasts uint32 + Omcasts uint32 + Iqdrops uint32 + Noproto uint32 + Lastchange Timeval32 +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Metric int32 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + _ [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint32 + Mtu uint32 + Hopcount uint32 + Expire uint32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pksent uint32 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x80 + SizeofBpfProgram = 0x10 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint64 + Drop uint64 + Capt uint64 + Padding [13]uint64 +} + +type BpfProgram struct { + Len uint32 + _ [4]byte + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfTimeval struct { + Sec int32 + Usec int32 +} + +type BpfHdr struct { + Tstamp BpfTimeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + _ [2]byte +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [19]uint8 + _ [1]byte +} + +type Termio struct { + Iflag uint16 + Oflag uint16 + Cflag uint16 + Lflag uint16 + Line int8 + Cc [8]uint8 + _ [1]byte +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) diff --git a/api/vendor/golang.org/x/sys/windows/asm_windows_386.s b/api/vendor/golang.org/x/sys/windows/asm_windows_386.s new file mode 100644 index 0000000..21d994d --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/asm_windows_386.s @@ -0,0 +1,13 @@ +// 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. + +// +// System calls for 386, Windows are implemented in runtime/syscall_windows.goc +// + +TEXT ·getprocaddress(SB), 7, $0-16 + JMP syscall·getprocaddress(SB) + +TEXT ·loadlibrary(SB), 7, $0-12 + JMP syscall·loadlibrary(SB) diff --git a/api/vendor/golang.org/x/sys/windows/asm_windows_amd64.s b/api/vendor/golang.org/x/sys/windows/asm_windows_amd64.s new file mode 100644 index 0000000..5bfdf79 --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/asm_windows_amd64.s @@ -0,0 +1,13 @@ +// 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. + +// +// System calls for amd64, Windows are implemented in runtime/syscall_windows.goc +// + +TEXT ·getprocaddress(SB), 7, $0-32 + JMP syscall·getprocaddress(SB) + +TEXT ·loadlibrary(SB), 7, $0-24 + JMP syscall·loadlibrary(SB) diff --git a/api/vendor/golang.org/x/sys/windows/dll_windows.go b/api/vendor/golang.org/x/sys/windows/dll_windows.go new file mode 100644 index 0000000..e92c05b --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/dll_windows.go @@ -0,0 +1,378 @@ +// 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 windows + +import ( + "sync" + "sync/atomic" + "syscall" + "unsafe" +) + +// DLLError describes reasons for DLL load failures. +type DLLError struct { + Err error + ObjName string + Msg string +} + +func (e *DLLError) Error() string { return e.Msg } + +// Implemented in runtime/syscall_windows.goc; we provide jumps to them in our assembly file. +func loadlibrary(filename *uint16) (handle uintptr, err syscall.Errno) +func getprocaddress(handle uintptr, procname *uint8) (proc uintptr, err syscall.Errno) + +// A DLL implements access to a single DLL. +type DLL struct { + Name string + Handle Handle +} + +// LoadDLL loads DLL file into memory. +// +// Warning: using LoadDLL without an absolute path name is subject to +// DLL preloading attacks. To safely load a system DLL, use LazyDLL +// with System set to true, or use LoadLibraryEx directly. +func LoadDLL(name string) (dll *DLL, err error) { + namep, err := UTF16PtrFromString(name) + if err != nil { + return nil, err + } + h, e := loadlibrary(namep) + if e != 0 { + return nil, &DLLError{ + Err: e, + ObjName: name, + Msg: "Failed to load " + name + ": " + e.Error(), + } + } + d := &DLL{ + Name: name, + Handle: Handle(h), + } + return d, nil +} + +// MustLoadDLL is like LoadDLL but panics if load operation failes. +func MustLoadDLL(name string) *DLL { + d, e := LoadDLL(name) + if e != nil { + panic(e) + } + return d +} + +// FindProc searches DLL d for procedure named name and returns *Proc +// if found. It returns an error if search fails. +func (d *DLL) FindProc(name string) (proc *Proc, err error) { + namep, err := BytePtrFromString(name) + if err != nil { + return nil, err + } + a, e := getprocaddress(uintptr(d.Handle), namep) + if e != 0 { + return nil, &DLLError{ + Err: e, + ObjName: name, + Msg: "Failed to find " + name + " procedure in " + d.Name + ": " + e.Error(), + } + } + p := &Proc{ + Dll: d, + Name: name, + addr: a, + } + return p, nil +} + +// MustFindProc is like FindProc but panics if search fails. +func (d *DLL) MustFindProc(name string) *Proc { + p, e := d.FindProc(name) + if e != nil { + panic(e) + } + return p +} + +// Release unloads DLL d from memory. +func (d *DLL) Release() (err error) { + return FreeLibrary(d.Handle) +} + +// A Proc implements access to a procedure inside a DLL. +type Proc struct { + Dll *DLL + Name string + addr uintptr +} + +// Addr returns the address of the procedure represented by p. +// The return value can be passed to Syscall to run the procedure. +func (p *Proc) Addr() uintptr { + return p.addr +} + +//go:uintptrescapes + +// Call executes procedure p with arguments a. It will panic, if more than 15 arguments +// are supplied. +// +// The returned error is always non-nil, constructed from the result of GetLastError. +// Callers must inspect the primary return value to decide whether an error occurred +// (according to the semantics of the specific function being called) before consulting +// the error. The error will be guaranteed to contain windows.Errno. +func (p *Proc) Call(a ...uintptr) (r1, r2 uintptr, lastErr error) { + switch len(a) { + case 0: + return syscall.Syscall(p.Addr(), uintptr(len(a)), 0, 0, 0) + case 1: + return syscall.Syscall(p.Addr(), uintptr(len(a)), a[0], 0, 0) + case 2: + return syscall.Syscall(p.Addr(), uintptr(len(a)), a[0], a[1], 0) + case 3: + return syscall.Syscall(p.Addr(), uintptr(len(a)), a[0], a[1], a[2]) + case 4: + return syscall.Syscall6(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], 0, 0) + case 5: + return syscall.Syscall6(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], 0) + case 6: + return syscall.Syscall6(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5]) + case 7: + return syscall.Syscall9(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], 0, 0) + case 8: + return syscall.Syscall9(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], 0) + case 9: + return syscall.Syscall9(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]) + case 10: + return syscall.Syscall12(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], 0, 0) + case 11: + return syscall.Syscall12(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], 0) + case 12: + return syscall.Syscall12(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11]) + case 13: + return syscall.Syscall15(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], 0, 0) + case 14: + return syscall.Syscall15(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], 0) + case 15: + return syscall.Syscall15(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14]) + default: + panic("Call " + p.Name + " with too many arguments " + itoa(len(a)) + ".") + } +} + +// A LazyDLL implements access to a single DLL. +// It will delay the load of the DLL until the first +// call to its Handle method or to one of its +// LazyProc's Addr method. +type LazyDLL struct { + Name string + + // System determines whether the DLL must be loaded from the + // Windows System directory, bypassing the normal DLL search + // path. + System bool + + mu sync.Mutex + dll *DLL // non nil once DLL is loaded +} + +// Load loads DLL file d.Name into memory. It returns an error if fails. +// Load will not try to load DLL, if it is already loaded into memory. +func (d *LazyDLL) Load() error { + // Non-racy version of: + // if d.dll != nil { + if atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(&d.dll))) != nil { + return nil + } + d.mu.Lock() + defer d.mu.Unlock() + if d.dll != nil { + return nil + } + + // kernel32.dll is special, since it's where LoadLibraryEx comes from. + // The kernel already special-cases its name, so it's always + // loaded from system32. + var dll *DLL + var err error + if d.Name == "kernel32.dll" { + dll, err = LoadDLL(d.Name) + } else { + dll, err = loadLibraryEx(d.Name, d.System) + } + if err != nil { + return err + } + + // Non-racy version of: + // d.dll = dll + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(&d.dll)), unsafe.Pointer(dll)) + return nil +} + +// mustLoad is like Load but panics if search fails. +func (d *LazyDLL) mustLoad() { + e := d.Load() + if e != nil { + panic(e) + } +} + +// Handle returns d's module handle. +func (d *LazyDLL) Handle() uintptr { + d.mustLoad() + return uintptr(d.dll.Handle) +} + +// NewProc returns a LazyProc for accessing the named procedure in the DLL d. +func (d *LazyDLL) NewProc(name string) *LazyProc { + return &LazyProc{l: d, Name: name} +} + +// NewLazyDLL creates new LazyDLL associated with DLL file. +func NewLazyDLL(name string) *LazyDLL { + return &LazyDLL{Name: name} +} + +// NewLazySystemDLL is like NewLazyDLL, but will only +// search Windows System directory for the DLL if name is +// a base name (like "advapi32.dll"). +func NewLazySystemDLL(name string) *LazyDLL { + return &LazyDLL{Name: name, System: true} +} + +// A LazyProc implements access to a procedure inside a LazyDLL. +// It delays the lookup until the Addr method is called. +type LazyProc struct { + Name string + + mu sync.Mutex + l *LazyDLL + proc *Proc +} + +// Find searches DLL for procedure named p.Name. It returns +// an error if search fails. Find will not search procedure, +// if it is already found and loaded into memory. +func (p *LazyProc) Find() error { + // Non-racy version of: + // if p.proc == nil { + if atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(&p.proc))) == nil { + p.mu.Lock() + defer p.mu.Unlock() + if p.proc == nil { + e := p.l.Load() + if e != nil { + return e + } + proc, e := p.l.dll.FindProc(p.Name) + if e != nil { + return e + } + // Non-racy version of: + // p.proc = proc + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(&p.proc)), unsafe.Pointer(proc)) + } + } + return nil +} + +// mustFind is like Find but panics if search fails. +func (p *LazyProc) mustFind() { + e := p.Find() + if e != nil { + panic(e) + } +} + +// Addr returns the address of the procedure represented by p. +// The return value can be passed to Syscall to run the procedure. +// It will panic if the procedure cannot be found. +func (p *LazyProc) Addr() uintptr { + p.mustFind() + return p.proc.Addr() +} + +//go:uintptrescapes + +// Call executes procedure p with arguments a. It will panic, if more than 15 arguments +// are supplied. It will also panic if the procedure cannot be found. +// +// The returned error is always non-nil, constructed from the result of GetLastError. +// Callers must inspect the primary return value to decide whether an error occurred +// (according to the semantics of the specific function being called) before consulting +// the error. The error will be guaranteed to contain windows.Errno. +func (p *LazyProc) Call(a ...uintptr) (r1, r2 uintptr, lastErr error) { + p.mustFind() + return p.proc.Call(a...) +} + +var canDoSearchSystem32Once struct { + sync.Once + v bool +} + +func initCanDoSearchSystem32() { + // https://msdn.microsoft.com/en-us/library/ms684179(v=vs.85).aspx says: + // "Windows 7, Windows Server 2008 R2, Windows Vista, and Windows + // Server 2008: The LOAD_LIBRARY_SEARCH_* flags are available on + // systems that have KB2533623 installed. To determine whether the + // flags are available, use GetProcAddress to get the address of the + // AddDllDirectory, RemoveDllDirectory, or SetDefaultDllDirectories + // function. If GetProcAddress succeeds, the LOAD_LIBRARY_SEARCH_* + // flags can be used with LoadLibraryEx." + canDoSearchSystem32Once.v = (modkernel32.NewProc("AddDllDirectory").Find() == nil) +} + +func canDoSearchSystem32() bool { + canDoSearchSystem32Once.Do(initCanDoSearchSystem32) + return canDoSearchSystem32Once.v +} + +func isBaseName(name string) bool { + for _, c := range name { + if c == ':' || c == '/' || c == '\\' { + return false + } + } + return true +} + +// loadLibraryEx wraps the Windows LoadLibraryEx function. +// +// See https://msdn.microsoft.com/en-us/library/windows/desktop/ms684179(v=vs.85).aspx +// +// If name is not an absolute path, LoadLibraryEx searches for the DLL +// in a variety of automatic locations unless constrained by flags. +// See: https://msdn.microsoft.com/en-us/library/ff919712%28VS.85%29.aspx +func loadLibraryEx(name string, system bool) (*DLL, error) { + loadDLL := name + var flags uintptr + if system { + if canDoSearchSystem32() { + const LOAD_LIBRARY_SEARCH_SYSTEM32 = 0x00000800 + flags = LOAD_LIBRARY_SEARCH_SYSTEM32 + } else if isBaseName(name) { + // WindowsXP or unpatched Windows machine + // trying to load "foo.dll" out of the system + // folder, but LoadLibraryEx doesn't support + // that yet on their system, so emulate it. + windir, _ := Getenv("WINDIR") // old var; apparently works on XP + if windir == "" { + return nil, errString("%WINDIR% not defined") + } + loadDLL = windir + "\\System32\\" + name + } + } + h, err := LoadLibraryEx(loadDLL, 0, flags) + if err != nil { + return nil, err + } + return &DLL{Name: name, Handle: h}, nil +} + +type errString string + +func (s errString) Error() string { return string(s) } diff --git a/api/vendor/golang.org/x/sys/windows/env_windows.go b/api/vendor/golang.org/x/sys/windows/env_windows.go new file mode 100644 index 0000000..bdc71e2 --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/env_windows.go @@ -0,0 +1,29 @@ +// 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. + +// Windows environment variables. + +package windows + +import "syscall" + +func Getenv(key string) (value string, found bool) { + return syscall.Getenv(key) +} + +func Setenv(key, value string) error { + return syscall.Setenv(key, value) +} + +func Clearenv() { + syscall.Clearenv() +} + +func Environ() []string { + return syscall.Environ() +} + +func Unsetenv(key string) error { + return syscall.Unsetenv(key) +} diff --git a/api/vendor/golang.org/x/sys/windows/eventlog.go b/api/vendor/golang.org/x/sys/windows/eventlog.go new file mode 100644 index 0000000..40af946 --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/eventlog.go @@ -0,0 +1,20 @@ +// 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. + +// +build windows + +package windows + +const ( + EVENTLOG_SUCCESS = 0 + EVENTLOG_ERROR_TYPE = 1 + EVENTLOG_WARNING_TYPE = 2 + EVENTLOG_INFORMATION_TYPE = 4 + EVENTLOG_AUDIT_SUCCESS = 8 + EVENTLOG_AUDIT_FAILURE = 16 +) + +//sys RegisterEventSource(uncServerName *uint16, sourceName *uint16) (handle Handle, err error) [failretval==0] = advapi32.RegisterEventSourceW +//sys DeregisterEventSource(handle Handle) (err error) = advapi32.DeregisterEventSource +//sys ReportEvent(log Handle, etype uint16, category uint16, eventId uint32, usrSId uintptr, numStrings uint16, dataSize uint32, strings **uint16, rawData *byte) (err error) = advapi32.ReportEventW diff --git a/api/vendor/golang.org/x/sys/windows/exec_windows.go b/api/vendor/golang.org/x/sys/windows/exec_windows.go new file mode 100644 index 0000000..3606c3a --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/exec_windows.go @@ -0,0 +1,97 @@ +// 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. + +// Fork, exec, wait, etc. + +package windows + +// EscapeArg rewrites command line argument s as prescribed +// in http://msdn.microsoft.com/en-us/library/ms880421. +// This function returns "" (2 double quotes) if s is empty. +// Alternatively, these transformations are done: +// - every back slash (\) is doubled, but only if immediately +// followed by double quote ("); +// - every double quote (") is escaped by back slash (\); +// - finally, s is wrapped with double quotes (arg -> "arg"), +// but only if there is space or tab inside s. +func EscapeArg(s string) string { + if len(s) == 0 { + return "\"\"" + } + n := len(s) + hasSpace := false + for i := 0; i < len(s); i++ { + switch s[i] { + case '"', '\\': + n++ + case ' ', '\t': + hasSpace = true + } + } + if hasSpace { + n += 2 + } + if n == len(s) { + return s + } + + qs := make([]byte, n) + j := 0 + if hasSpace { + qs[j] = '"' + j++ + } + slashes := 0 + for i := 0; i < len(s); i++ { + switch s[i] { + default: + slashes = 0 + qs[j] = s[i] + case '\\': + slashes++ + qs[j] = s[i] + case '"': + for ; slashes > 0; slashes-- { + qs[j] = '\\' + j++ + } + qs[j] = '\\' + j++ + qs[j] = s[i] + } + j++ + } + if hasSpace { + for ; slashes > 0; slashes-- { + qs[j] = '\\' + j++ + } + qs[j] = '"' + j++ + } + return string(qs[:j]) +} + +func CloseOnExec(fd Handle) { + SetHandleInformation(Handle(fd), HANDLE_FLAG_INHERIT, 0) +} + +// FullPath retrieves the full path of the specified file. +func FullPath(name string) (path string, err error) { + p, err := UTF16PtrFromString(name) + if err != nil { + return "", err + } + n := uint32(100) + for { + buf := make([]uint16, n) + n, err = GetFullPathName(p, uint32(len(buf)), &buf[0], nil) + if err != nil { + return "", err + } + if n <= uint32(len(buf)) { + return UTF16ToString(buf[:n]), nil + } + } +} diff --git a/api/vendor/golang.org/x/sys/windows/memory_windows.go b/api/vendor/golang.org/x/sys/windows/memory_windows.go new file mode 100644 index 0000000..f80a420 --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/memory_windows.go @@ -0,0 +1,26 @@ +// 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 windows + +const ( + MEM_COMMIT = 0x00001000 + MEM_RESERVE = 0x00002000 + MEM_DECOMMIT = 0x00004000 + MEM_RELEASE = 0x00008000 + MEM_RESET = 0x00080000 + MEM_TOP_DOWN = 0x00100000 + MEM_WRITE_WATCH = 0x00200000 + MEM_PHYSICAL = 0x00400000 + MEM_RESET_UNDO = 0x01000000 + MEM_LARGE_PAGES = 0x20000000 + + PAGE_NOACCESS = 0x01 + PAGE_READONLY = 0x02 + PAGE_READWRITE = 0x04 + PAGE_WRITECOPY = 0x08 + PAGE_EXECUTE_READ = 0x20 + PAGE_EXECUTE_READWRITE = 0x40 + PAGE_EXECUTE_WRITECOPY = 0x80 +) diff --git a/api/vendor/golang.org/x/sys/windows/mksyscall.go b/api/vendor/golang.org/x/sys/windows/mksyscall.go new file mode 100644 index 0000000..fb7db0e --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/mksyscall.go @@ -0,0 +1,7 @@ +// 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 windows + +//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go eventlog.go service.go syscall_windows.go security_windows.go diff --git a/api/vendor/golang.org/x/sys/windows/race.go b/api/vendor/golang.org/x/sys/windows/race.go new file mode 100644 index 0000000..a74e3e2 --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/race.go @@ -0,0 +1,30 @@ +// 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. + +// +build windows,race + +package windows + +import ( + "runtime" + "unsafe" +) + +const raceenabled = true + +func raceAcquire(addr unsafe.Pointer) { + runtime.RaceAcquire(addr) +} + +func raceReleaseMerge(addr unsafe.Pointer) { + runtime.RaceReleaseMerge(addr) +} + +func raceReadRange(addr unsafe.Pointer, len int) { + runtime.RaceReadRange(addr, len) +} + +func raceWriteRange(addr unsafe.Pointer, len int) { + runtime.RaceWriteRange(addr, len) +} diff --git a/api/vendor/golang.org/x/sys/windows/race0.go b/api/vendor/golang.org/x/sys/windows/race0.go new file mode 100644 index 0000000..e44a3cb --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/race0.go @@ -0,0 +1,25 @@ +// 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. + +// +build windows,!race + +package windows + +import ( + "unsafe" +) + +const raceenabled = false + +func raceAcquire(addr unsafe.Pointer) { +} + +func raceReleaseMerge(addr unsafe.Pointer) { +} + +func raceReadRange(addr unsafe.Pointer, len int) { +} + +func raceWriteRange(addr unsafe.Pointer, len int) { +} diff --git a/api/vendor/golang.org/x/sys/windows/registry/export_test.go b/api/vendor/golang.org/x/sys/windows/registry/export_test.go new file mode 100644 index 0000000..8badf6f --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/registry/export_test.go @@ -0,0 +1,11 @@ +// Copyright 2015 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 windows + +package registry + +func (k Key) SetValue(name string, valtype uint32, data []byte) error { + return k.setValue(name, valtype, data) +} diff --git a/api/vendor/golang.org/x/sys/windows/registry/key.go b/api/vendor/golang.org/x/sys/windows/registry/key.go new file mode 100644 index 0000000..c256483 --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/registry/key.go @@ -0,0 +1,198 @@ +// Copyright 2015 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 windows + +// Package registry provides access to the Windows registry. +// +// Here is a simple example, opening a registry key and reading a string value from it. +// +// k, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\Windows NT\CurrentVersion`, registry.QUERY_VALUE) +// if err != nil { +// log.Fatal(err) +// } +// defer k.Close() +// +// s, _, err := k.GetStringValue("SystemRoot") +// if err != nil { +// log.Fatal(err) +// } +// fmt.Printf("Windows system root is %q\n", s) +// +package registry + +import ( + "io" + "syscall" + "time" +) + +const ( + // Registry key security and access rights. + // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms724878.aspx + // for details. + ALL_ACCESS = 0xf003f + CREATE_LINK = 0x00020 + CREATE_SUB_KEY = 0x00004 + ENUMERATE_SUB_KEYS = 0x00008 + EXECUTE = 0x20019 + NOTIFY = 0x00010 + QUERY_VALUE = 0x00001 + READ = 0x20019 + SET_VALUE = 0x00002 + WOW64_32KEY = 0x00200 + WOW64_64KEY = 0x00100 + WRITE = 0x20006 +) + +// Key is a handle to an open Windows registry key. +// Keys can be obtained by calling OpenKey; there are +// also some predefined root keys such as CURRENT_USER. +// Keys can be used directly in the Windows API. +type Key syscall.Handle + +const ( + // Windows defines some predefined root keys that are always open. + // An application can use these keys as entry points to the registry. + // Normally these keys are used in OpenKey to open new keys, + // but they can also be used anywhere a Key is required. + CLASSES_ROOT = Key(syscall.HKEY_CLASSES_ROOT) + CURRENT_USER = Key(syscall.HKEY_CURRENT_USER) + LOCAL_MACHINE = Key(syscall.HKEY_LOCAL_MACHINE) + USERS = Key(syscall.HKEY_USERS) + CURRENT_CONFIG = Key(syscall.HKEY_CURRENT_CONFIG) + PERFORMANCE_DATA = Key(syscall.HKEY_PERFORMANCE_DATA) +) + +// Close closes open key k. +func (k Key) Close() error { + return syscall.RegCloseKey(syscall.Handle(k)) +} + +// OpenKey opens a new key with path name relative to key k. +// It accepts any open key, including CURRENT_USER and others, +// and returns the new key and an error. +// The access parameter specifies desired access rights to the +// key to be opened. +func OpenKey(k Key, path string, access uint32) (Key, error) { + p, err := syscall.UTF16PtrFromString(path) + if err != nil { + return 0, err + } + var subkey syscall.Handle + err = syscall.RegOpenKeyEx(syscall.Handle(k), p, 0, access, &subkey) + if err != nil { + return 0, err + } + return Key(subkey), nil +} + +// OpenRemoteKey opens a predefined registry key on another +// computer pcname. The key to be opened is specified by k, but +// can only be one of LOCAL_MACHINE, PERFORMANCE_DATA or USERS. +// If pcname is "", OpenRemoteKey returns local computer key. +func OpenRemoteKey(pcname string, k Key) (Key, error) { + var err error + var p *uint16 + if pcname != "" { + p, err = syscall.UTF16PtrFromString(`\\` + pcname) + if err != nil { + return 0, err + } + } + var remoteKey syscall.Handle + err = regConnectRegistry(p, syscall.Handle(k), &remoteKey) + if err != nil { + return 0, err + } + return Key(remoteKey), nil +} + +// ReadSubKeyNames returns the names of subkeys of key k. +// The parameter n controls the number of returned names, +// analogous to the way os.File.Readdirnames works. +func (k Key) ReadSubKeyNames(n int) ([]string, error) { + names := make([]string, 0) + // Registry key size limit is 255 bytes and described there: + // https://msdn.microsoft.com/library/windows/desktop/ms724872.aspx + buf := make([]uint16, 256) //plus extra room for terminating zero byte +loopItems: + for i := uint32(0); ; i++ { + if n > 0 { + if len(names) == n { + return names, nil + } + } + l := uint32(len(buf)) + for { + err := syscall.RegEnumKeyEx(syscall.Handle(k), i, &buf[0], &l, nil, nil, nil, nil) + if err == nil { + break + } + if err == syscall.ERROR_MORE_DATA { + // Double buffer size and try again. + l = uint32(2 * len(buf)) + buf = make([]uint16, l) + continue + } + if err == _ERROR_NO_MORE_ITEMS { + break loopItems + } + return names, err + } + names = append(names, syscall.UTF16ToString(buf[:l])) + } + if n > len(names) { + return names, io.EOF + } + return names, nil +} + +// CreateKey creates a key named path under open key k. +// CreateKey returns the new key and a boolean flag that reports +// whether the key already existed. +// The access parameter specifies the access rights for the key +// to be created. +func CreateKey(k Key, path string, access uint32) (newk Key, openedExisting bool, err error) { + var h syscall.Handle + var d uint32 + err = regCreateKeyEx(syscall.Handle(k), syscall.StringToUTF16Ptr(path), + 0, nil, _REG_OPTION_NON_VOLATILE, access, nil, &h, &d) + if err != nil { + return 0, false, err + } + return Key(h), d == _REG_OPENED_EXISTING_KEY, nil +} + +// DeleteKey deletes the subkey path of key k and its values. +func DeleteKey(k Key, path string) error { + return regDeleteKey(syscall.Handle(k), syscall.StringToUTF16Ptr(path)) +} + +// A KeyInfo describes the statistics of a key. It is returned by Stat. +type KeyInfo struct { + SubKeyCount uint32 + MaxSubKeyLen uint32 // size of the key's subkey with the longest name, in Unicode characters, not including the terminating zero byte + ValueCount uint32 + MaxValueNameLen uint32 // size of the key's longest value name, in Unicode characters, not including the terminating zero byte + MaxValueLen uint32 // longest data component among the key's values, in bytes + lastWriteTime syscall.Filetime +} + +// ModTime returns the key's last write time. +func (ki *KeyInfo) ModTime() time.Time { + return time.Unix(0, ki.lastWriteTime.Nanoseconds()) +} + +// Stat retrieves information about the open key k. +func (k Key) Stat() (*KeyInfo, error) { + var ki KeyInfo + err := syscall.RegQueryInfoKey(syscall.Handle(k), nil, nil, nil, + &ki.SubKeyCount, &ki.MaxSubKeyLen, nil, &ki.ValueCount, + &ki.MaxValueNameLen, &ki.MaxValueLen, nil, &ki.lastWriteTime) + if err != nil { + return nil, err + } + return &ki, nil +} diff --git a/api/vendor/golang.org/x/sys/windows/registry/mksyscall.go b/api/vendor/golang.org/x/sys/windows/registry/mksyscall.go new file mode 100644 index 0000000..0ac95ff --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/registry/mksyscall.go @@ -0,0 +1,7 @@ +// Copyright 2015 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 registry + +//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go syscall.go diff --git a/api/vendor/golang.org/x/sys/windows/registry/registry_test.go b/api/vendor/golang.org/x/sys/windows/registry/registry_test.go new file mode 100644 index 0000000..2f4dd69 --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/registry/registry_test.go @@ -0,0 +1,756 @@ +// Copyright 2015 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 windows + +package registry_test + +import ( + "bytes" + "crypto/rand" + "os" + "syscall" + "testing" + "time" + "unsafe" + + "golang.org/x/sys/windows/registry" +) + +func randKeyName(prefix string) string { + const numbers = "0123456789" + buf := make([]byte, 10) + rand.Read(buf) + for i, b := range buf { + buf[i] = numbers[b%byte(len(numbers))] + } + return prefix + string(buf) +} + +func TestReadSubKeyNames(t *testing.T) { + k, err := registry.OpenKey(registry.CLASSES_ROOT, "TypeLib", registry.ENUMERATE_SUB_KEYS) + if err != nil { + t.Fatal(err) + } + defer k.Close() + + names, err := k.ReadSubKeyNames(-1) + if err != nil { + t.Fatal(err) + } + var foundStdOle bool + for _, name := range names { + // Every PC has "stdole 2.0 OLE Automation" library installed. + if name == "{00020430-0000-0000-C000-000000000046}" { + foundStdOle = true + } + } + if !foundStdOle { + t.Fatal("could not find stdole 2.0 OLE Automation") + } +} + +func TestCreateOpenDeleteKey(t *testing.T) { + k, err := registry.OpenKey(registry.CURRENT_USER, "Software", registry.QUERY_VALUE) + if err != nil { + t.Fatal(err) + } + defer k.Close() + + testKName := randKeyName("TestCreateOpenDeleteKey_") + + testK, exist, err := registry.CreateKey(k, testKName, registry.CREATE_SUB_KEY) + if err != nil { + t.Fatal(err) + } + defer testK.Close() + + if exist { + t.Fatalf("key %q already exists", testKName) + } + + testKAgain, exist, err := registry.CreateKey(k, testKName, registry.CREATE_SUB_KEY) + if err != nil { + t.Fatal(err) + } + defer testKAgain.Close() + + if !exist { + t.Fatalf("key %q should already exist", testKName) + } + + testKOpened, err := registry.OpenKey(k, testKName, registry.ENUMERATE_SUB_KEYS) + if err != nil { + t.Fatal(err) + } + defer testKOpened.Close() + + err = registry.DeleteKey(k, testKName) + if err != nil { + t.Fatal(err) + } + + testKOpenedAgain, err := registry.OpenKey(k, testKName, registry.ENUMERATE_SUB_KEYS) + if err == nil { + defer testKOpenedAgain.Close() + t.Fatalf("key %q should already been deleted", testKName) + } + if err != registry.ErrNotExist { + t.Fatalf(`unexpected error ("not exist" expected): %v`, err) + } +} + +func equalStringSlice(a, b []string) bool { + if len(a) != len(b) { + return false + } + if a == nil { + return true + } + for i := range a { + if a[i] != b[i] { + return false + } + } + return true +} + +type ValueTest struct { + Type uint32 + Name string + Value interface{} + WillFail bool +} + +var ValueTests = []ValueTest{ + {Type: registry.SZ, Name: "String1", Value: ""}, + {Type: registry.SZ, Name: "String2", Value: "\000", WillFail: true}, + {Type: registry.SZ, Name: "String3", Value: "Hello World"}, + {Type: registry.SZ, Name: "String4", Value: "Hello World\000", WillFail: true}, + {Type: registry.EXPAND_SZ, Name: "ExpString1", Value: ""}, + {Type: registry.EXPAND_SZ, Name: "ExpString2", Value: "\000", WillFail: true}, + {Type: registry.EXPAND_SZ, Name: "ExpString3", Value: "Hello World"}, + {Type: registry.EXPAND_SZ, Name: "ExpString4", Value: "Hello\000World", WillFail: true}, + {Type: registry.EXPAND_SZ, Name: "ExpString5", Value: "%PATH%"}, + {Type: registry.EXPAND_SZ, Name: "ExpString6", Value: "%NO_SUCH_VARIABLE%"}, + {Type: registry.EXPAND_SZ, Name: "ExpString7", Value: "%PATH%;."}, + {Type: registry.BINARY, Name: "Binary1", Value: []byte{}}, + {Type: registry.BINARY, Name: "Binary2", Value: []byte{1, 2, 3}}, + {Type: registry.BINARY, Name: "Binary3", Value: []byte{3, 2, 1, 0, 1, 2, 3}}, + {Type: registry.DWORD, Name: "Dword1", Value: uint64(0)}, + {Type: registry.DWORD, Name: "Dword2", Value: uint64(1)}, + {Type: registry.DWORD, Name: "Dword3", Value: uint64(0xff)}, + {Type: registry.DWORD, Name: "Dword4", Value: uint64(0xffff)}, + {Type: registry.QWORD, Name: "Qword1", Value: uint64(0)}, + {Type: registry.QWORD, Name: "Qword2", Value: uint64(1)}, + {Type: registry.QWORD, Name: "Qword3", Value: uint64(0xff)}, + {Type: registry.QWORD, Name: "Qword4", Value: uint64(0xffff)}, + {Type: registry.QWORD, Name: "Qword5", Value: uint64(0xffffff)}, + {Type: registry.QWORD, Name: "Qword6", Value: uint64(0xffffffff)}, + {Type: registry.MULTI_SZ, Name: "MultiString1", Value: []string{"a", "b", "c"}}, + {Type: registry.MULTI_SZ, Name: "MultiString2", Value: []string{"abc", "", "cba"}}, + {Type: registry.MULTI_SZ, Name: "MultiString3", Value: []string{""}}, + {Type: registry.MULTI_SZ, Name: "MultiString4", Value: []string{"abcdef"}}, + {Type: registry.MULTI_SZ, Name: "MultiString5", Value: []string{"\000"}, WillFail: true}, + {Type: registry.MULTI_SZ, Name: "MultiString6", Value: []string{"a\000b"}, WillFail: true}, + {Type: registry.MULTI_SZ, Name: "MultiString7", Value: []string{"ab", "\000", "cd"}, WillFail: true}, + {Type: registry.MULTI_SZ, Name: "MultiString8", Value: []string{"\000", "cd"}, WillFail: true}, + {Type: registry.MULTI_SZ, Name: "MultiString9", Value: []string{"ab", "\000"}, WillFail: true}, +} + +func setValues(t *testing.T, k registry.Key) { + for _, test := range ValueTests { + var err error + switch test.Type { + case registry.SZ: + err = k.SetStringValue(test.Name, test.Value.(string)) + case registry.EXPAND_SZ: + err = k.SetExpandStringValue(test.Name, test.Value.(string)) + case registry.MULTI_SZ: + err = k.SetStringsValue(test.Name, test.Value.([]string)) + case registry.BINARY: + err = k.SetBinaryValue(test.Name, test.Value.([]byte)) + case registry.DWORD: + err = k.SetDWordValue(test.Name, uint32(test.Value.(uint64))) + case registry.QWORD: + err = k.SetQWordValue(test.Name, test.Value.(uint64)) + default: + t.Fatalf("unsupported type %d for %s value", test.Type, test.Name) + } + if test.WillFail { + if err == nil { + t.Fatalf("setting %s value %q should fail, but succeeded", test.Name, test.Value) + } + } else { + if err != nil { + t.Fatal(err) + } + } + } +} + +func enumerateValues(t *testing.T, k registry.Key) { + names, err := k.ReadValueNames(-1) + if err != nil { + t.Error(err) + return + } + haveNames := make(map[string]bool) + for _, n := range names { + haveNames[n] = false + } + for _, test := range ValueTests { + wantFound := !test.WillFail + _, haveFound := haveNames[test.Name] + if wantFound && !haveFound { + t.Errorf("value %s is not found while enumerating", test.Name) + } + if haveFound && !wantFound { + t.Errorf("value %s is found while enumerating, but expected to fail", test.Name) + } + if haveFound { + delete(haveNames, test.Name) + } + } + for n, v := range haveNames { + t.Errorf("value %s (%v) is found while enumerating, but has not been cretaed", n, v) + } +} + +func testErrNotExist(t *testing.T, name string, err error) { + if err == nil { + t.Errorf("%s value should not exist", name) + return + } + if err != registry.ErrNotExist { + t.Errorf("reading %s value should return 'not exist' error, but got: %s", name, err) + return + } +} + +func testErrUnexpectedType(t *testing.T, test ValueTest, gottype uint32, err error) { + if err == nil { + t.Errorf("GetXValue(%q) should not succeed", test.Name) + return + } + if err != registry.ErrUnexpectedType { + t.Errorf("reading %s value should return 'unexpected key value type' error, but got: %s", test.Name, err) + return + } + if gottype != test.Type { + t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype) + return + } +} + +func testGetStringValue(t *testing.T, k registry.Key, test ValueTest) { + got, gottype, err := k.GetStringValue(test.Name) + if err != nil { + t.Errorf("GetStringValue(%s) failed: %v", test.Name, err) + return + } + if got != test.Value { + t.Errorf("want %s value %q, got %q", test.Name, test.Value, got) + return + } + if gottype != test.Type { + t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype) + return + } + if gottype == registry.EXPAND_SZ { + _, err = registry.ExpandString(got) + if err != nil { + t.Errorf("ExpandString(%s) failed: %v", got, err) + return + } + } +} + +func testGetIntegerValue(t *testing.T, k registry.Key, test ValueTest) { + got, gottype, err := k.GetIntegerValue(test.Name) + if err != nil { + t.Errorf("GetIntegerValue(%s) failed: %v", test.Name, err) + return + } + if got != test.Value.(uint64) { + t.Errorf("want %s value %v, got %v", test.Name, test.Value, got) + return + } + if gottype != test.Type { + t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype) + return + } +} + +func testGetBinaryValue(t *testing.T, k registry.Key, test ValueTest) { + got, gottype, err := k.GetBinaryValue(test.Name) + if err != nil { + t.Errorf("GetBinaryValue(%s) failed: %v", test.Name, err) + return + } + if !bytes.Equal(got, test.Value.([]byte)) { + t.Errorf("want %s value %v, got %v", test.Name, test.Value, got) + return + } + if gottype != test.Type { + t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype) + return + } +} + +func testGetStringsValue(t *testing.T, k registry.Key, test ValueTest) { + got, gottype, err := k.GetStringsValue(test.Name) + if err != nil { + t.Errorf("GetStringsValue(%s) failed: %v", test.Name, err) + return + } + if !equalStringSlice(got, test.Value.([]string)) { + t.Errorf("want %s value %#v, got %#v", test.Name, test.Value, got) + return + } + if gottype != test.Type { + t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype) + return + } +} + +func testGetValue(t *testing.T, k registry.Key, test ValueTest, size int) { + if size <= 0 { + return + } + // read data with no buffer + gotsize, gottype, err := k.GetValue(test.Name, nil) + if err != nil { + t.Errorf("GetValue(%s, [%d]byte) failed: %v", test.Name, size, err) + return + } + if gotsize != size { + t.Errorf("want %s value size of %d, got %v", test.Name, size, gotsize) + return + } + if gottype != test.Type { + t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype) + return + } + // read data with short buffer + gotsize, gottype, err = k.GetValue(test.Name, make([]byte, size-1)) + if err == nil { + t.Errorf("GetValue(%s, [%d]byte) should fail, but succeeded", test.Name, size-1) + return + } + if err != registry.ErrShortBuffer { + t.Errorf("reading %s value should return 'short buffer' error, but got: %s", test.Name, err) + return + } + if gotsize != size { + t.Errorf("want %s value size of %d, got %v", test.Name, size, gotsize) + return + } + if gottype != test.Type { + t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype) + return + } + // read full data + gotsize, gottype, err = k.GetValue(test.Name, make([]byte, size)) + if err != nil { + t.Errorf("GetValue(%s, [%d]byte) failed: %v", test.Name, size, err) + return + } + if gotsize != size { + t.Errorf("want %s value size of %d, got %v", test.Name, size, gotsize) + return + } + if gottype != test.Type { + t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype) + return + } + // check GetValue returns ErrNotExist as required + _, _, err = k.GetValue(test.Name+"_not_there", make([]byte, size)) + if err == nil { + t.Errorf("GetValue(%q) should not succeed", test.Name) + return + } + if err != registry.ErrNotExist { + t.Errorf("GetValue(%q) should return 'not exist' error, but got: %s", test.Name, err) + return + } +} + +func testValues(t *testing.T, k registry.Key) { + for _, test := range ValueTests { + switch test.Type { + case registry.SZ, registry.EXPAND_SZ: + if test.WillFail { + _, _, err := k.GetStringValue(test.Name) + testErrNotExist(t, test.Name, err) + } else { + testGetStringValue(t, k, test) + _, gottype, err := k.GetIntegerValue(test.Name) + testErrUnexpectedType(t, test, gottype, err) + // Size of utf16 string in bytes is not perfect, + // but correct for current test values. + // Size also includes terminating 0. + testGetValue(t, k, test, (len(test.Value.(string))+1)*2) + } + _, _, err := k.GetStringValue(test.Name + "_string_not_created") + testErrNotExist(t, test.Name+"_string_not_created", err) + case registry.DWORD, registry.QWORD: + testGetIntegerValue(t, k, test) + _, gottype, err := k.GetBinaryValue(test.Name) + testErrUnexpectedType(t, test, gottype, err) + _, _, err = k.GetIntegerValue(test.Name + "_int_not_created") + testErrNotExist(t, test.Name+"_int_not_created", err) + size := 8 + if test.Type == registry.DWORD { + size = 4 + } + testGetValue(t, k, test, size) + case registry.BINARY: + testGetBinaryValue(t, k, test) + _, gottype, err := k.GetStringsValue(test.Name) + testErrUnexpectedType(t, test, gottype, err) + _, _, err = k.GetBinaryValue(test.Name + "_byte_not_created") + testErrNotExist(t, test.Name+"_byte_not_created", err) + testGetValue(t, k, test, len(test.Value.([]byte))) + case registry.MULTI_SZ: + if test.WillFail { + _, _, err := k.GetStringsValue(test.Name) + testErrNotExist(t, test.Name, err) + } else { + testGetStringsValue(t, k, test) + _, gottype, err := k.GetStringValue(test.Name) + testErrUnexpectedType(t, test, gottype, err) + size := 0 + for _, s := range test.Value.([]string) { + size += len(s) + 1 // nil terminated + } + size += 1 // extra nil at the end + size *= 2 // count bytes, not uint16 + testGetValue(t, k, test, size) + } + _, _, err := k.GetStringsValue(test.Name + "_strings_not_created") + testErrNotExist(t, test.Name+"_strings_not_created", err) + default: + t.Errorf("unsupported type %d for %s value", test.Type, test.Name) + continue + } + } +} + +func testStat(t *testing.T, k registry.Key) { + subk, _, err := registry.CreateKey(k, "subkey", registry.CREATE_SUB_KEY) + if err != nil { + t.Error(err) + return + } + defer subk.Close() + + defer registry.DeleteKey(k, "subkey") + + ki, err := k.Stat() + if err != nil { + t.Error(err) + return + } + if ki.SubKeyCount != 1 { + t.Error("key must have 1 subkey") + } + if ki.MaxSubKeyLen != 6 { + t.Error("key max subkey name length must be 6") + } + if ki.ValueCount != 24 { + t.Errorf("key must have 24 values, but is %d", ki.ValueCount) + } + if ki.MaxValueNameLen != 12 { + t.Errorf("key max value name length must be 10, but is %d", ki.MaxValueNameLen) + } + if ki.MaxValueLen != 38 { + t.Errorf("key max value length must be 38, but is %d", ki.MaxValueLen) + } + if mt, ct := ki.ModTime(), time.Now(); ct.Sub(mt) > 100*time.Millisecond { + t.Errorf("key mod time is not close to current time: mtime=%v current=%v delta=%v", mt, ct, ct.Sub(mt)) + } +} + +func deleteValues(t *testing.T, k registry.Key) { + for _, test := range ValueTests { + if test.WillFail { + continue + } + err := k.DeleteValue(test.Name) + if err != nil { + t.Error(err) + continue + } + } + names, err := k.ReadValueNames(-1) + if err != nil { + t.Error(err) + return + } + if len(names) != 0 { + t.Errorf("some values remain after deletion: %v", names) + } +} + +func TestValues(t *testing.T) { + softwareK, err := registry.OpenKey(registry.CURRENT_USER, "Software", registry.QUERY_VALUE) + if err != nil { + t.Fatal(err) + } + defer softwareK.Close() + + testKName := randKeyName("TestValues_") + + k, exist, err := registry.CreateKey(softwareK, testKName, registry.CREATE_SUB_KEY|registry.QUERY_VALUE|registry.SET_VALUE) + if err != nil { + t.Fatal(err) + } + defer k.Close() + + if exist { + t.Fatalf("key %q already exists", testKName) + } + + defer registry.DeleteKey(softwareK, testKName) + + setValues(t, k) + + enumerateValues(t, k) + + testValues(t, k) + + testStat(t, k) + + deleteValues(t, k) +} + +func walkKey(t *testing.T, k registry.Key, kname string) { + names, err := k.ReadValueNames(-1) + if err != nil { + t.Fatalf("reading value names of %s failed: %v", kname, err) + } + for _, name := range names { + _, valtype, err := k.GetValue(name, nil) + if err != nil { + t.Fatalf("reading value type of %s of %s failed: %v", name, kname, err) + } + switch valtype { + case registry.NONE: + case registry.SZ: + _, _, err := k.GetStringValue(name) + if err != nil { + t.Error(err) + } + case registry.EXPAND_SZ: + s, _, err := k.GetStringValue(name) + if err != nil { + t.Error(err) + } + _, err = registry.ExpandString(s) + if err != nil { + t.Error(err) + } + case registry.DWORD, registry.QWORD: + _, _, err := k.GetIntegerValue(name) + if err != nil { + t.Error(err) + } + case registry.BINARY: + _, _, err := k.GetBinaryValue(name) + if err != nil { + t.Error(err) + } + case registry.MULTI_SZ: + _, _, err := k.GetStringsValue(name) + if err != nil { + t.Error(err) + } + case registry.FULL_RESOURCE_DESCRIPTOR, registry.RESOURCE_LIST, registry.RESOURCE_REQUIREMENTS_LIST: + // TODO: not implemented + default: + t.Fatalf("value type %d of %s of %s failed: %v", valtype, name, kname, err) + } + } + + names, err = k.ReadSubKeyNames(-1) + if err != nil { + t.Fatalf("reading sub-keys of %s failed: %v", kname, err) + } + for _, name := range names { + func() { + subk, err := registry.OpenKey(k, name, registry.ENUMERATE_SUB_KEYS|registry.QUERY_VALUE) + if err != nil { + if err == syscall.ERROR_ACCESS_DENIED { + // ignore error, if we are not allowed to access this key + return + } + t.Fatalf("opening sub-keys %s of %s failed: %v", name, kname, err) + } + defer subk.Close() + + walkKey(t, subk, kname+`\`+name) + }() + } +} + +func TestWalkFullRegistry(t *testing.T) { + if testing.Short() { + t.Skip("skipping long running test in short mode") + } + walkKey(t, registry.CLASSES_ROOT, "CLASSES_ROOT") + walkKey(t, registry.CURRENT_USER, "CURRENT_USER") + walkKey(t, registry.LOCAL_MACHINE, "LOCAL_MACHINE") + walkKey(t, registry.USERS, "USERS") + walkKey(t, registry.CURRENT_CONFIG, "CURRENT_CONFIG") +} + +func TestExpandString(t *testing.T) { + got, err := registry.ExpandString("%PATH%") + if err != nil { + t.Fatal(err) + } + want := os.Getenv("PATH") + if got != want { + t.Errorf("want %q string expanded, got %q", want, got) + } +} + +func TestInvalidValues(t *testing.T) { + softwareK, err := registry.OpenKey(registry.CURRENT_USER, "Software", registry.QUERY_VALUE) + if err != nil { + t.Fatal(err) + } + defer softwareK.Close() + + testKName := randKeyName("TestInvalidValues_") + + k, exist, err := registry.CreateKey(softwareK, testKName, registry.CREATE_SUB_KEY|registry.QUERY_VALUE|registry.SET_VALUE) + if err != nil { + t.Fatal(err) + } + defer k.Close() + + if exist { + t.Fatalf("key %q already exists", testKName) + } + + defer registry.DeleteKey(softwareK, testKName) + + var tests = []struct { + Type uint32 + Name string + Data []byte + }{ + {registry.DWORD, "Dword1", nil}, + {registry.DWORD, "Dword2", []byte{1, 2, 3}}, + {registry.QWORD, "Qword1", nil}, + {registry.QWORD, "Qword2", []byte{1, 2, 3}}, + {registry.QWORD, "Qword3", []byte{1, 2, 3, 4, 5, 6, 7}}, + {registry.MULTI_SZ, "MultiString1", nil}, + {registry.MULTI_SZ, "MultiString2", []byte{0}}, + {registry.MULTI_SZ, "MultiString3", []byte{'a', 'b', 0}}, + {registry.MULTI_SZ, "MultiString4", []byte{'a', 0, 0, 'b', 0}}, + {registry.MULTI_SZ, "MultiString5", []byte{'a', 0, 0}}, + } + + for _, test := range tests { + err := k.SetValue(test.Name, test.Type, test.Data) + if err != nil { + t.Fatalf("SetValue for %q failed: %v", test.Name, err) + } + } + + for _, test := range tests { + switch test.Type { + case registry.DWORD, registry.QWORD: + value, valType, err := k.GetIntegerValue(test.Name) + if err == nil { + t.Errorf("GetIntegerValue(%q) succeeded. Returns type=%d value=%v", test.Name, valType, value) + } + case registry.MULTI_SZ: + value, valType, err := k.GetStringsValue(test.Name) + if err == nil { + if len(value) != 0 { + t.Errorf("GetStringsValue(%q) succeeded. Returns type=%d value=%v", test.Name, valType, value) + } + } + default: + t.Errorf("unsupported type %d for %s value", test.Type, test.Name) + } + } +} + +func TestGetMUIStringValue(t *testing.T) { + if err := registry.LoadRegLoadMUIString(); err != nil { + t.Skip("regLoadMUIString not supported; skipping") + } + if err := procGetDynamicTimeZoneInformation.Find(); err != nil { + t.Skipf("%s not supported; skipping", procGetDynamicTimeZoneInformation.Name) + } + var dtzi DynamicTimezoneinformation + if _, err := GetDynamicTimeZoneInformation(&dtzi); err != nil { + t.Fatal(err) + } + tzKeyName := syscall.UTF16ToString(dtzi.TimeZoneKeyName[:]) + timezoneK, err := registry.OpenKey(registry.LOCAL_MACHINE, + `SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\`+tzKeyName, registry.READ) + if err != nil { + t.Fatal(err) + } + defer timezoneK.Close() + + type testType struct { + name string + want string + } + var tests = []testType{ + {"MUI_Std", syscall.UTF16ToString(dtzi.StandardName[:])}, + } + if dtzi.DynamicDaylightTimeDisabled == 0 { + tests = append(tests, testType{"MUI_Dlt", syscall.UTF16ToString(dtzi.DaylightName[:])}) + } + + for _, test := range tests { + got, err := timezoneK.GetMUIStringValue(test.name) + if err != nil { + t.Error("GetMUIStringValue:", err) + } + + if got != test.want { + t.Errorf("GetMUIStringValue: %s: Got %q, want %q", test.name, got, test.want) + } + } +} + +type DynamicTimezoneinformation struct { + Bias int32 + StandardName [32]uint16 + StandardDate syscall.Systemtime + StandardBias int32 + DaylightName [32]uint16 + DaylightDate syscall.Systemtime + DaylightBias int32 + TimeZoneKeyName [128]uint16 + DynamicDaylightTimeDisabled uint8 +} + +var ( + kernel32DLL = syscall.NewLazyDLL("kernel32") + + procGetDynamicTimeZoneInformation = kernel32DLL.NewProc("GetDynamicTimeZoneInformation") +) + +func GetDynamicTimeZoneInformation(dtzi *DynamicTimezoneinformation) (rc uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetDynamicTimeZoneInformation.Addr(), 1, uintptr(unsafe.Pointer(dtzi)), 0, 0) + rc = uint32(r0) + if rc == 0xffffffff { + if e1 != 0 { + err = error(e1) + } else { + err = syscall.EINVAL + } + } + return +} diff --git a/api/vendor/golang.org/x/sys/windows/registry/syscall.go b/api/vendor/golang.org/x/sys/windows/registry/syscall.go new file mode 100644 index 0000000..e66643c --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/registry/syscall.go @@ -0,0 +1,32 @@ +// Copyright 2015 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 windows + +package registry + +import "syscall" + +const ( + _REG_OPTION_NON_VOLATILE = 0 + + _REG_CREATED_NEW_KEY = 1 + _REG_OPENED_EXISTING_KEY = 2 + + _ERROR_NO_MORE_ITEMS syscall.Errno = 259 +) + +func LoadRegLoadMUIString() error { + return procRegLoadMUIStringW.Find() +} + +//sys regCreateKeyEx(key syscall.Handle, subkey *uint16, reserved uint32, class *uint16, options uint32, desired uint32, sa *syscall.SecurityAttributes, result *syscall.Handle, disposition *uint32) (regerrno error) = advapi32.RegCreateKeyExW +//sys regDeleteKey(key syscall.Handle, subkey *uint16) (regerrno error) = advapi32.RegDeleteKeyW +//sys regSetValueEx(key syscall.Handle, valueName *uint16, reserved uint32, vtype uint32, buf *byte, bufsize uint32) (regerrno error) = advapi32.RegSetValueExW +//sys regEnumValue(key syscall.Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) = advapi32.RegEnumValueW +//sys regDeleteValue(key syscall.Handle, name *uint16) (regerrno error) = advapi32.RegDeleteValueW +//sys regLoadMUIString(key syscall.Handle, name *uint16, buf *uint16, buflen uint32, buflenCopied *uint32, flags uint32, dir *uint16) (regerrno error) = advapi32.RegLoadMUIStringW +//sys regConnectRegistry(machinename *uint16, key syscall.Handle, result *syscall.Handle) (regerrno error) = advapi32.RegConnectRegistryW + +//sys expandEnvironmentStrings(src *uint16, dst *uint16, size uint32) (n uint32, err error) = kernel32.ExpandEnvironmentStringsW diff --git a/api/vendor/golang.org/x/sys/windows/registry/value.go b/api/vendor/golang.org/x/sys/windows/registry/value.go new file mode 100644 index 0000000..71d4e15 --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/registry/value.go @@ -0,0 +1,384 @@ +// Copyright 2015 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 windows + +package registry + +import ( + "errors" + "io" + "syscall" + "unicode/utf16" + "unsafe" +) + +const ( + // Registry value types. + NONE = 0 + SZ = 1 + EXPAND_SZ = 2 + BINARY = 3 + DWORD = 4 + DWORD_BIG_ENDIAN = 5 + LINK = 6 + MULTI_SZ = 7 + RESOURCE_LIST = 8 + FULL_RESOURCE_DESCRIPTOR = 9 + RESOURCE_REQUIREMENTS_LIST = 10 + QWORD = 11 +) + +var ( + // ErrShortBuffer is returned when the buffer was too short for the operation. + ErrShortBuffer = syscall.ERROR_MORE_DATA + + // ErrNotExist is returned when a registry key or value does not exist. + ErrNotExist = syscall.ERROR_FILE_NOT_FOUND + + // ErrUnexpectedType is returned by Get*Value when the value's type was unexpected. + ErrUnexpectedType = errors.New("unexpected key value type") +) + +// GetValue retrieves the type and data for the specified value associated +// with an open key k. It fills up buffer buf and returns the retrieved +// byte count n. If buf is too small to fit the stored value it returns +// ErrShortBuffer error along with the required buffer size n. +// If no buffer is provided, it returns true and actual buffer size n. +// If no buffer is provided, GetValue returns the value's type only. +// If the value does not exist, the error returned is ErrNotExist. +// +// GetValue is a low level function. If value's type is known, use the appropriate +// Get*Value function instead. +func (k Key) GetValue(name string, buf []byte) (n int, valtype uint32, err error) { + pname, err := syscall.UTF16PtrFromString(name) + if err != nil { + return 0, 0, err + } + var pbuf *byte + if len(buf) > 0 { + pbuf = (*byte)(unsafe.Pointer(&buf[0])) + } + l := uint32(len(buf)) + err = syscall.RegQueryValueEx(syscall.Handle(k), pname, nil, &valtype, pbuf, &l) + if err != nil { + return int(l), valtype, err + } + return int(l), valtype, nil +} + +func (k Key) getValue(name string, buf []byte) (date []byte, valtype uint32, err error) { + p, err := syscall.UTF16PtrFromString(name) + if err != nil { + return nil, 0, err + } + var t uint32 + n := uint32(len(buf)) + for { + err = syscall.RegQueryValueEx(syscall.Handle(k), p, nil, &t, (*byte)(unsafe.Pointer(&buf[0])), &n) + if err == nil { + return buf[:n], t, nil + } + if err != syscall.ERROR_MORE_DATA { + return nil, 0, err + } + if n <= uint32(len(buf)) { + return nil, 0, err + } + buf = make([]byte, n) + } +} + +// GetStringValue retrieves the string value for the specified +// value name associated with an open key k. It also returns the value's type. +// If value does not exist, GetStringValue returns ErrNotExist. +// If value is not SZ or EXPAND_SZ, it will return the correct value +// type and ErrUnexpectedType. +func (k Key) GetStringValue(name string) (val string, valtype uint32, err error) { + data, typ, err2 := k.getValue(name, make([]byte, 64)) + if err2 != nil { + return "", typ, err2 + } + switch typ { + case SZ, EXPAND_SZ: + default: + return "", typ, ErrUnexpectedType + } + if len(data) == 0 { + return "", typ, nil + } + u := (*[1 << 29]uint16)(unsafe.Pointer(&data[0]))[:] + return syscall.UTF16ToString(u), typ, nil +} + +// GetMUIStringValue retrieves the localized string value for +// the specified value name associated with an open key k. +// If the value name doesn't exist or the localized string value +// can't be resolved, GetMUIStringValue returns ErrNotExist. +// GetMUIStringValue panics if the system doesn't support +// regLoadMUIString; use LoadRegLoadMUIString to check if +// regLoadMUIString is supported before calling this function. +func (k Key) GetMUIStringValue(name string) (string, error) { + pname, err := syscall.UTF16PtrFromString(name) + if err != nil { + return "", err + } + + buf := make([]uint16, 1024) + var buflen uint32 + var pdir *uint16 + + err = regLoadMUIString(syscall.Handle(k), pname, &buf[0], uint32(len(buf)), &buflen, 0, pdir) + if err == syscall.ERROR_FILE_NOT_FOUND { // Try fallback path + + // Try to resolve the string value using the system directory as + // a DLL search path; this assumes the string value is of the form + // @[path]\dllname,-strID but with no path given, e.g. @tzres.dll,-320. + + // This approach works with tzres.dll but may have to be revised + // in the future to allow callers to provide custom search paths. + + var s string + s, err = ExpandString("%SystemRoot%\\system32\\") + if err != nil { + return "", err + } + pdir, err = syscall.UTF16PtrFromString(s) + if err != nil { + return "", err + } + + err = regLoadMUIString(syscall.Handle(k), pname, &buf[0], uint32(len(buf)), &buflen, 0, pdir) + } + + for err == syscall.ERROR_MORE_DATA { // Grow buffer if needed + if buflen <= uint32(len(buf)) { + break // Buffer not growing, assume race; break + } + buf = make([]uint16, buflen) + err = regLoadMUIString(syscall.Handle(k), pname, &buf[0], uint32(len(buf)), &buflen, 0, pdir) + } + + if err != nil { + return "", err + } + + return syscall.UTF16ToString(buf), nil +} + +// ExpandString expands environment-variable strings and replaces +// them with the values defined for the current user. +// Use ExpandString to expand EXPAND_SZ strings. +func ExpandString(value string) (string, error) { + if value == "" { + return "", nil + } + p, err := syscall.UTF16PtrFromString(value) + if err != nil { + return "", err + } + r := make([]uint16, 100) + for { + n, err := expandEnvironmentStrings(p, &r[0], uint32(len(r))) + if err != nil { + return "", err + } + if n <= uint32(len(r)) { + u := (*[1 << 29]uint16)(unsafe.Pointer(&r[0]))[:] + return syscall.UTF16ToString(u), nil + } + r = make([]uint16, n) + } +} + +// GetStringsValue retrieves the []string value for the specified +// value name associated with an open key k. It also returns the value's type. +// If value does not exist, GetStringsValue returns ErrNotExist. +// If value is not MULTI_SZ, it will return the correct value +// type and ErrUnexpectedType. +func (k Key) GetStringsValue(name string) (val []string, valtype uint32, err error) { + data, typ, err2 := k.getValue(name, make([]byte, 64)) + if err2 != nil { + return nil, typ, err2 + } + if typ != MULTI_SZ { + return nil, typ, ErrUnexpectedType + } + if len(data) == 0 { + return nil, typ, nil + } + p := (*[1 << 29]uint16)(unsafe.Pointer(&data[0]))[:len(data)/2] + if len(p) == 0 { + return nil, typ, nil + } + if p[len(p)-1] == 0 { + p = p[:len(p)-1] // remove terminating null + } + val = make([]string, 0, 5) + from := 0 + for i, c := range p { + if c == 0 { + val = append(val, string(utf16.Decode(p[from:i]))) + from = i + 1 + } + } + return val, typ, nil +} + +// GetIntegerValue retrieves the integer value for the specified +// value name associated with an open key k. It also returns the value's type. +// If value does not exist, GetIntegerValue returns ErrNotExist. +// If value is not DWORD or QWORD, it will return the correct value +// type and ErrUnexpectedType. +func (k Key) GetIntegerValue(name string) (val uint64, valtype uint32, err error) { + data, typ, err2 := k.getValue(name, make([]byte, 8)) + if err2 != nil { + return 0, typ, err2 + } + switch typ { + case DWORD: + if len(data) != 4 { + return 0, typ, errors.New("DWORD value is not 4 bytes long") + } + return uint64(*(*uint32)(unsafe.Pointer(&data[0]))), DWORD, nil + case QWORD: + if len(data) != 8 { + return 0, typ, errors.New("QWORD value is not 8 bytes long") + } + return uint64(*(*uint64)(unsafe.Pointer(&data[0]))), QWORD, nil + default: + return 0, typ, ErrUnexpectedType + } +} + +// GetBinaryValue retrieves the binary value for the specified +// value name associated with an open key k. It also returns the value's type. +// If value does not exist, GetBinaryValue returns ErrNotExist. +// If value is not BINARY, it will return the correct value +// type and ErrUnexpectedType. +func (k Key) GetBinaryValue(name string) (val []byte, valtype uint32, err error) { + data, typ, err2 := k.getValue(name, make([]byte, 64)) + if err2 != nil { + return nil, typ, err2 + } + if typ != BINARY { + return nil, typ, ErrUnexpectedType + } + return data, typ, nil +} + +func (k Key) setValue(name string, valtype uint32, data []byte) error { + p, err := syscall.UTF16PtrFromString(name) + if err != nil { + return err + } + if len(data) == 0 { + return regSetValueEx(syscall.Handle(k), p, 0, valtype, nil, 0) + } + return regSetValueEx(syscall.Handle(k), p, 0, valtype, &data[0], uint32(len(data))) +} + +// SetDWordValue sets the data and type of a name value +// under key k to value and DWORD. +func (k Key) SetDWordValue(name string, value uint32) error { + return k.setValue(name, DWORD, (*[4]byte)(unsafe.Pointer(&value))[:]) +} + +// SetQWordValue sets the data and type of a name value +// under key k to value and QWORD. +func (k Key) SetQWordValue(name string, value uint64) error { + return k.setValue(name, QWORD, (*[8]byte)(unsafe.Pointer(&value))[:]) +} + +func (k Key) setStringValue(name string, valtype uint32, value string) error { + v, err := syscall.UTF16FromString(value) + if err != nil { + return err + } + buf := (*[1 << 29]byte)(unsafe.Pointer(&v[0]))[:len(v)*2] + return k.setValue(name, valtype, buf) +} + +// SetStringValue sets the data and type of a name value +// under key k to value and SZ. The value must not contain a zero byte. +func (k Key) SetStringValue(name, value string) error { + return k.setStringValue(name, SZ, value) +} + +// SetExpandStringValue sets the data and type of a name value +// under key k to value and EXPAND_SZ. The value must not contain a zero byte. +func (k Key) SetExpandStringValue(name, value string) error { + return k.setStringValue(name, EXPAND_SZ, value) +} + +// SetStringsValue sets the data and type of a name value +// under key k to value and MULTI_SZ. The value strings +// must not contain a zero byte. +func (k Key) SetStringsValue(name string, value []string) error { + ss := "" + for _, s := range value { + for i := 0; i < len(s); i++ { + if s[i] == 0 { + return errors.New("string cannot have 0 inside") + } + } + ss += s + "\x00" + } + v := utf16.Encode([]rune(ss + "\x00")) + buf := (*[1 << 29]byte)(unsafe.Pointer(&v[0]))[:len(v)*2] + return k.setValue(name, MULTI_SZ, buf) +} + +// SetBinaryValue sets the data and type of a name value +// under key k to value and BINARY. +func (k Key) SetBinaryValue(name string, value []byte) error { + return k.setValue(name, BINARY, value) +} + +// DeleteValue removes a named value from the key k. +func (k Key) DeleteValue(name string) error { + return regDeleteValue(syscall.Handle(k), syscall.StringToUTF16Ptr(name)) +} + +// ReadValueNames returns the value names of key k. +// The parameter n controls the number of returned names, +// analogous to the way os.File.Readdirnames works. +func (k Key) ReadValueNames(n int) ([]string, error) { + ki, err := k.Stat() + if err != nil { + return nil, err + } + names := make([]string, 0, ki.ValueCount) + buf := make([]uint16, ki.MaxValueNameLen+1) // extra room for terminating null character +loopItems: + for i := uint32(0); ; i++ { + if n > 0 { + if len(names) == n { + return names, nil + } + } + l := uint32(len(buf)) + for { + err := regEnumValue(syscall.Handle(k), i, &buf[0], &l, nil, nil, nil, nil) + if err == nil { + break + } + if err == syscall.ERROR_MORE_DATA { + // Double buffer size and try again. + l = uint32(2 * len(buf)) + buf = make([]uint16, l) + continue + } + if err == _ERROR_NO_MORE_ITEMS { + break loopItems + } + return names, err + } + names = append(names, syscall.UTF16ToString(buf[:l])) + } + if n > len(names) { + return names, io.EOF + } + return names, nil +} diff --git a/api/vendor/golang.org/x/sys/windows/registry/zsyscall_windows.go b/api/vendor/golang.org/x/sys/windows/registry/zsyscall_windows.go new file mode 100644 index 0000000..ceebdd7 --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/registry/zsyscall_windows.go @@ -0,0 +1,120 @@ +// MACHINE GENERATED BY 'go generate' COMMAND; DO NOT EDIT + +package registry + +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) +) + +// errnoErr returns common boxed Errno values, to prevent +// allocations at runtime. +func errnoErr(e syscall.Errno) error { + switch e { + case 0: + return nil + 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") + + procRegCreateKeyExW = modadvapi32.NewProc("RegCreateKeyExW") + procRegDeleteKeyW = modadvapi32.NewProc("RegDeleteKeyW") + procRegSetValueExW = modadvapi32.NewProc("RegSetValueExW") + procRegEnumValueW = modadvapi32.NewProc("RegEnumValueW") + procRegDeleteValueW = modadvapi32.NewProc("RegDeleteValueW") + procRegLoadMUIStringW = modadvapi32.NewProc("RegLoadMUIStringW") + procRegConnectRegistryW = modadvapi32.NewProc("RegConnectRegistryW") + procExpandEnvironmentStringsW = modkernel32.NewProc("ExpandEnvironmentStringsW") +) + +func regCreateKeyEx(key syscall.Handle, subkey *uint16, reserved uint32, class *uint16, options uint32, desired uint32, sa *syscall.SecurityAttributes, result *syscall.Handle, disposition *uint32) (regerrno error) { + r0, _, _ := syscall.Syscall9(procRegCreateKeyExW.Addr(), 9, uintptr(key), uintptr(unsafe.Pointer(subkey)), uintptr(reserved), uintptr(unsafe.Pointer(class)), uintptr(options), uintptr(desired), uintptr(unsafe.Pointer(sa)), uintptr(unsafe.Pointer(result)), uintptr(unsafe.Pointer(disposition))) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func regDeleteKey(key syscall.Handle, subkey *uint16) (regerrno error) { + r0, _, _ := syscall.Syscall(procRegDeleteKeyW.Addr(), 2, uintptr(key), uintptr(unsafe.Pointer(subkey)), 0) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func regSetValueEx(key syscall.Handle, valueName *uint16, reserved uint32, vtype uint32, buf *byte, bufsize uint32) (regerrno error) { + r0, _, _ := syscall.Syscall6(procRegSetValueExW.Addr(), 6, uintptr(key), uintptr(unsafe.Pointer(valueName)), uintptr(reserved), uintptr(vtype), uintptr(unsafe.Pointer(buf)), uintptr(bufsize)) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func regEnumValue(key syscall.Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) { + r0, _, _ := syscall.Syscall9(procRegEnumValueW.Addr(), 8, uintptr(key), uintptr(index), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(nameLen)), uintptr(unsafe.Pointer(reserved)), uintptr(unsafe.Pointer(valtype)), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(buflen)), 0) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func regDeleteValue(key syscall.Handle, name *uint16) (regerrno error) { + r0, _, _ := syscall.Syscall(procRegDeleteValueW.Addr(), 2, uintptr(key), uintptr(unsafe.Pointer(name)), 0) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func regLoadMUIString(key syscall.Handle, name *uint16, buf *uint16, buflen uint32, buflenCopied *uint32, flags uint32, dir *uint16) (regerrno error) { + r0, _, _ := syscall.Syscall9(procRegLoadMUIStringW.Addr(), 7, uintptr(key), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(buf)), uintptr(buflen), uintptr(unsafe.Pointer(buflenCopied)), uintptr(flags), uintptr(unsafe.Pointer(dir)), 0, 0) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func regConnectRegistry(machinename *uint16, key syscall.Handle, result *syscall.Handle) (regerrno error) { + r0, _, _ := syscall.Syscall(procRegConnectRegistryW.Addr(), 3, uintptr(unsafe.Pointer(machinename)), uintptr(key), uintptr(unsafe.Pointer(result))) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func expandEnvironmentStrings(src *uint16, dst *uint16, size uint32) (n uint32, err error) { + r0, _, e1 := syscall.Syscall(procExpandEnvironmentStringsW.Addr(), 3, uintptr(unsafe.Pointer(src)), uintptr(unsafe.Pointer(dst)), uintptr(size)) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} diff --git a/api/vendor/golang.org/x/sys/windows/security_windows.go b/api/vendor/golang.org/x/sys/windows/security_windows.go new file mode 100644 index 0000000..f1ec5dc --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/security_windows.go @@ -0,0 +1,476 @@ +// 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 windows + +import ( + "syscall" + "unsafe" +) + +const ( + STANDARD_RIGHTS_REQUIRED = 0xf0000 + STANDARD_RIGHTS_READ = 0x20000 + STANDARD_RIGHTS_WRITE = 0x20000 + STANDARD_RIGHTS_EXECUTE = 0x20000 + STANDARD_RIGHTS_ALL = 0x1F0000 +) + +const ( + NameUnknown = 0 + NameFullyQualifiedDN = 1 + NameSamCompatible = 2 + NameDisplay = 3 + NameUniqueId = 6 + NameCanonical = 7 + NameUserPrincipal = 8 + NameCanonicalEx = 9 + NameServicePrincipal = 10 + NameDnsDomain = 12 +) + +// This function returns 1 byte BOOLEAN rather than the 4 byte BOOL. +// http://blogs.msdn.com/b/drnick/archive/2007/12/19/windows-and-upn-format-credentials.aspx +//sys TranslateName(accName *uint16, accNameFormat uint32, desiredNameFormat uint32, translatedName *uint16, nSize *uint32) (err error) [failretval&0xff==0] = secur32.TranslateNameW +//sys GetUserNameEx(nameFormat uint32, nameBuffre *uint16, nSize *uint32) (err error) [failretval&0xff==0] = secur32.GetUserNameExW + +// TranslateAccountName converts a directory service +// object name from one format to another. +func TranslateAccountName(username string, from, to uint32, initSize int) (string, error) { + u, e := UTF16PtrFromString(username) + if e != nil { + return "", e + } + n := uint32(50) + for { + b := make([]uint16, n) + e = TranslateName(u, from, to, &b[0], &n) + if e == nil { + return UTF16ToString(b[:n]), nil + } + if e != ERROR_INSUFFICIENT_BUFFER { + return "", e + } + if n <= uint32(len(b)) { + return "", e + } + } +} + +const ( + // do not reorder + NetSetupUnknownStatus = iota + NetSetupUnjoined + NetSetupWorkgroupName + NetSetupDomainName +) + +type UserInfo10 struct { + Name *uint16 + Comment *uint16 + UsrComment *uint16 + FullName *uint16 +} + +//sys NetUserGetInfo(serverName *uint16, userName *uint16, level uint32, buf **byte) (neterr error) = netapi32.NetUserGetInfo +//sys NetGetJoinInformation(server *uint16, name **uint16, bufType *uint32) (neterr error) = netapi32.NetGetJoinInformation +//sys NetApiBufferFree(buf *byte) (neterr error) = netapi32.NetApiBufferFree + +const ( + // do not reorder + SidTypeUser = 1 + iota + SidTypeGroup + SidTypeDomain + SidTypeAlias + SidTypeWellKnownGroup + SidTypeDeletedAccount + SidTypeInvalid + SidTypeUnknown + SidTypeComputer + SidTypeLabel +) + +type SidIdentifierAuthority struct { + Value [6]byte +} + +var ( + SECURITY_NULL_SID_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 0}} + SECURITY_WORLD_SID_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 1}} + SECURITY_LOCAL_SID_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 2}} + SECURITY_CREATOR_SID_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 3}} + SECURITY_NON_UNIQUE_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 4}} + SECURITY_NT_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 5}} + SECURITY_MANDATORY_LABEL_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 16}} +) + +const ( + SECURITY_NULL_RID = 0 + SECURITY_WORLD_RID = 0 + SECURITY_LOCAL_RID = 0 + SECURITY_CREATOR_OWNER_RID = 0 + SECURITY_CREATOR_GROUP_RID = 1 + SECURITY_DIALUP_RID = 1 + SECURITY_NETWORK_RID = 2 + SECURITY_BATCH_RID = 3 + SECURITY_INTERACTIVE_RID = 4 + SECURITY_LOGON_IDS_RID = 5 + SECURITY_SERVICE_RID = 6 + SECURITY_LOCAL_SYSTEM_RID = 18 + SECURITY_BUILTIN_DOMAIN_RID = 32 + SECURITY_PRINCIPAL_SELF_RID = 10 + SECURITY_CREATOR_OWNER_SERVER_RID = 0x2 + SECURITY_CREATOR_GROUP_SERVER_RID = 0x3 + SECURITY_LOGON_IDS_RID_COUNT = 0x3 + SECURITY_ANONYMOUS_LOGON_RID = 0x7 + SECURITY_PROXY_RID = 0x8 + SECURITY_ENTERPRISE_CONTROLLERS_RID = 0x9 + SECURITY_SERVER_LOGON_RID = SECURITY_ENTERPRISE_CONTROLLERS_RID + SECURITY_AUTHENTICATED_USER_RID = 0xb + SECURITY_RESTRICTED_CODE_RID = 0xc + SECURITY_NT_NON_UNIQUE_RID = 0x15 +) + +// Predefined domain-relative RIDs for local groups. +// See https://msdn.microsoft.com/en-us/library/windows/desktop/aa379649(v=vs.85).aspx +const ( + DOMAIN_ALIAS_RID_ADMINS = 0x220 + DOMAIN_ALIAS_RID_USERS = 0x221 + DOMAIN_ALIAS_RID_GUESTS = 0x222 + DOMAIN_ALIAS_RID_POWER_USERS = 0x223 + DOMAIN_ALIAS_RID_ACCOUNT_OPS = 0x224 + DOMAIN_ALIAS_RID_SYSTEM_OPS = 0x225 + DOMAIN_ALIAS_RID_PRINT_OPS = 0x226 + DOMAIN_ALIAS_RID_BACKUP_OPS = 0x227 + DOMAIN_ALIAS_RID_REPLICATOR = 0x228 + DOMAIN_ALIAS_RID_RAS_SERVERS = 0x229 + DOMAIN_ALIAS_RID_PREW2KCOMPACCESS = 0x22a + DOMAIN_ALIAS_RID_REMOTE_DESKTOP_USERS = 0x22b + DOMAIN_ALIAS_RID_NETWORK_CONFIGURATION_OPS = 0x22c + DOMAIN_ALIAS_RID_INCOMING_FOREST_TRUST_BUILDERS = 0x22d + DOMAIN_ALIAS_RID_MONITORING_USERS = 0X22e + DOMAIN_ALIAS_RID_LOGGING_USERS = 0x22f + DOMAIN_ALIAS_RID_AUTHORIZATIONACCESS = 0x230 + DOMAIN_ALIAS_RID_TS_LICENSE_SERVERS = 0x231 + DOMAIN_ALIAS_RID_DCOM_USERS = 0x232 + DOMAIN_ALIAS_RID_IUSERS = 0x238 + DOMAIN_ALIAS_RID_CRYPTO_OPERATORS = 0x239 + DOMAIN_ALIAS_RID_CACHEABLE_PRINCIPALS_GROUP = 0x23b + DOMAIN_ALIAS_RID_NON_CACHEABLE_PRINCIPALS_GROUP = 0x23c + DOMAIN_ALIAS_RID_EVENT_LOG_READERS_GROUP = 0x23d + DOMAIN_ALIAS_RID_CERTSVC_DCOM_ACCESS_GROUP = 0x23e +) + +//sys LookupAccountSid(systemName *uint16, sid *SID, name *uint16, nameLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *uint32) (err error) = advapi32.LookupAccountSidW +//sys LookupAccountName(systemName *uint16, accountName *uint16, sid *SID, sidLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *uint32) (err error) = advapi32.LookupAccountNameW +//sys ConvertSidToStringSid(sid *SID, stringSid **uint16) (err error) = advapi32.ConvertSidToStringSidW +//sys ConvertStringSidToSid(stringSid *uint16, sid **SID) (err error) = advapi32.ConvertStringSidToSidW +//sys GetLengthSid(sid *SID) (len uint32) = advapi32.GetLengthSid +//sys CopySid(destSidLen uint32, destSid *SID, srcSid *SID) (err error) = advapi32.CopySid +//sys AllocateAndInitializeSid(identAuth *SidIdentifierAuthority, subAuth byte, subAuth0 uint32, subAuth1 uint32, subAuth2 uint32, subAuth3 uint32, subAuth4 uint32, subAuth5 uint32, subAuth6 uint32, subAuth7 uint32, sid **SID) (err error) = advapi32.AllocateAndInitializeSid +//sys FreeSid(sid *SID) (err error) [failretval!=0] = advapi32.FreeSid +//sys EqualSid(sid1 *SID, sid2 *SID) (isEqual bool) = advapi32.EqualSid + +// The security identifier (SID) structure is a variable-length +// structure used to uniquely identify users or groups. +type SID struct{} + +// StringToSid converts a string-format security identifier +// sid into a valid, functional sid. +func StringToSid(s string) (*SID, error) { + var sid *SID + p, e := UTF16PtrFromString(s) + if e != nil { + return nil, e + } + e = ConvertStringSidToSid(p, &sid) + if e != nil { + return nil, e + } + defer LocalFree((Handle)(unsafe.Pointer(sid))) + return sid.Copy() +} + +// LookupSID retrieves a security identifier sid for the account +// and the name of the domain on which the account was found. +// System specify target computer to search. +func LookupSID(system, account string) (sid *SID, domain string, accType uint32, err error) { + if len(account) == 0 { + return nil, "", 0, syscall.EINVAL + } + acc, e := UTF16PtrFromString(account) + if e != nil { + return nil, "", 0, e + } + var sys *uint16 + if len(system) > 0 { + sys, e = UTF16PtrFromString(system) + if e != nil { + return nil, "", 0, e + } + } + n := uint32(50) + dn := uint32(50) + for { + b := make([]byte, n) + db := make([]uint16, dn) + sid = (*SID)(unsafe.Pointer(&b[0])) + e = LookupAccountName(sys, acc, sid, &n, &db[0], &dn, &accType) + if e == nil { + return sid, UTF16ToString(db), accType, nil + } + if e != ERROR_INSUFFICIENT_BUFFER { + return nil, "", 0, e + } + if n <= uint32(len(b)) { + return nil, "", 0, e + } + } +} + +// String converts sid to a string format +// suitable for display, storage, or transmission. +func (sid *SID) String() (string, error) { + var s *uint16 + e := ConvertSidToStringSid(sid, &s) + if e != nil { + return "", e + } + defer LocalFree((Handle)(unsafe.Pointer(s))) + return UTF16ToString((*[256]uint16)(unsafe.Pointer(s))[:]), nil +} + +// Len returns the length, in bytes, of a valid security identifier sid. +func (sid *SID) Len() int { + return int(GetLengthSid(sid)) +} + +// Copy creates a duplicate of security identifier sid. +func (sid *SID) Copy() (*SID, error) { + b := make([]byte, sid.Len()) + sid2 := (*SID)(unsafe.Pointer(&b[0])) + e := CopySid(uint32(len(b)), sid2, sid) + if e != nil { + return nil, e + } + return sid2, nil +} + +// LookupAccount retrieves the name of the account for this sid +// and the name of the first domain on which this sid is found. +// System specify target computer to search for. +func (sid *SID) LookupAccount(system string) (account, domain string, accType uint32, err error) { + var sys *uint16 + if len(system) > 0 { + sys, err = UTF16PtrFromString(system) + if err != nil { + return "", "", 0, err + } + } + n := uint32(50) + dn := uint32(50) + for { + b := make([]uint16, n) + db := make([]uint16, dn) + e := LookupAccountSid(sys, sid, &b[0], &n, &db[0], &dn, &accType) + if e == nil { + return UTF16ToString(b), UTF16ToString(db), accType, nil + } + if e != ERROR_INSUFFICIENT_BUFFER { + return "", "", 0, e + } + if n <= uint32(len(b)) { + return "", "", 0, e + } + } +} + +const ( + // do not reorder + TOKEN_ASSIGN_PRIMARY = 1 << iota + TOKEN_DUPLICATE + TOKEN_IMPERSONATE + TOKEN_QUERY + TOKEN_QUERY_SOURCE + TOKEN_ADJUST_PRIVILEGES + TOKEN_ADJUST_GROUPS + TOKEN_ADJUST_DEFAULT + + TOKEN_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | + TOKEN_ASSIGN_PRIMARY | + TOKEN_DUPLICATE | + TOKEN_IMPERSONATE | + TOKEN_QUERY | + TOKEN_QUERY_SOURCE | + TOKEN_ADJUST_PRIVILEGES | + TOKEN_ADJUST_GROUPS | + TOKEN_ADJUST_DEFAULT + TOKEN_READ = STANDARD_RIGHTS_READ | TOKEN_QUERY + TOKEN_WRITE = STANDARD_RIGHTS_WRITE | + TOKEN_ADJUST_PRIVILEGES | + TOKEN_ADJUST_GROUPS | + TOKEN_ADJUST_DEFAULT + TOKEN_EXECUTE = STANDARD_RIGHTS_EXECUTE +) + +const ( + // do not reorder + TokenUser = 1 + iota + TokenGroups + TokenPrivileges + TokenOwner + TokenPrimaryGroup + TokenDefaultDacl + TokenSource + TokenType + TokenImpersonationLevel + TokenStatistics + TokenRestrictedSids + TokenSessionId + TokenGroupsAndPrivileges + TokenSessionReference + TokenSandBoxInert + TokenAuditPolicy + TokenOrigin + TokenElevationType + TokenLinkedToken + TokenElevation + TokenHasRestrictions + TokenAccessInformation + TokenVirtualizationAllowed + TokenVirtualizationEnabled + TokenIntegrityLevel + TokenUIAccess + TokenMandatoryPolicy + TokenLogonSid + MaxTokenInfoClass +) + +type SIDAndAttributes struct { + Sid *SID + Attributes uint32 +} + +type Tokenuser struct { + User SIDAndAttributes +} + +type Tokenprimarygroup struct { + PrimaryGroup *SID +} + +type Tokengroups struct { + GroupCount uint32 + Groups [1]SIDAndAttributes +} + +// Authorization Functions +//sys checkTokenMembership(tokenHandle Token, sidToCheck *SID, isMember *int32) (err error) = advapi32.CheckTokenMembership +//sys OpenProcessToken(h Handle, access uint32, token *Token) (err error) = advapi32.OpenProcessToken +//sys GetTokenInformation(t Token, infoClass uint32, info *byte, infoLen uint32, returnedLen *uint32) (err error) = advapi32.GetTokenInformation +//sys GetUserProfileDirectory(t Token, dir *uint16, dirLen *uint32) (err error) = userenv.GetUserProfileDirectoryW + +// An access token contains the security information for a logon session. +// The system creates an access token when a user logs on, and every +// process executed on behalf of the user has a copy of the token. +// The token identifies the user, the user's groups, and the user's +// privileges. The system uses the token to control access to securable +// objects and to control the ability of the user to perform various +// system-related operations on the local computer. +type Token Handle + +// OpenCurrentProcessToken opens the access token +// associated with current process. +func OpenCurrentProcessToken() (Token, error) { + p, e := GetCurrentProcess() + if e != nil { + return 0, e + } + var t Token + e = OpenProcessToken(p, TOKEN_QUERY, &t) + if e != nil { + return 0, e + } + return t, nil +} + +// Close releases access to access token. +func (t Token) Close() error { + return CloseHandle(Handle(t)) +} + +// getInfo retrieves a specified type of information about an access token. +func (t Token) getInfo(class uint32, initSize int) (unsafe.Pointer, error) { + n := uint32(initSize) + for { + b := make([]byte, n) + e := GetTokenInformation(t, class, &b[0], uint32(len(b)), &n) + if e == nil { + return unsafe.Pointer(&b[0]), nil + } + if e != ERROR_INSUFFICIENT_BUFFER { + return nil, e + } + if n <= uint32(len(b)) { + return nil, e + } + } +} + +// GetTokenUser retrieves access token t user account information. +func (t Token) GetTokenUser() (*Tokenuser, error) { + i, e := t.getInfo(TokenUser, 50) + if e != nil { + return nil, e + } + return (*Tokenuser)(i), nil +} + +// GetTokenGroups retrieves group accounts associated with access token t. +func (t Token) GetTokenGroups() (*Tokengroups, error) { + i, e := t.getInfo(TokenGroups, 50) + if e != nil { + return nil, e + } + return (*Tokengroups)(i), nil +} + +// GetTokenPrimaryGroup retrieves access token t primary group information. +// A pointer to a SID structure representing a group that will become +// the primary group of any objects created by a process using this access token. +func (t Token) GetTokenPrimaryGroup() (*Tokenprimarygroup, error) { + i, e := t.getInfo(TokenPrimaryGroup, 50) + if e != nil { + return nil, e + } + return (*Tokenprimarygroup)(i), nil +} + +// GetUserProfileDirectory retrieves path to the +// root directory of the access token t user's profile. +func (t Token) GetUserProfileDirectory() (string, error) { + n := uint32(100) + for { + b := make([]uint16, n) + e := GetUserProfileDirectory(t, &b[0], &n) + if e == nil { + return UTF16ToString(b), nil + } + if e != ERROR_INSUFFICIENT_BUFFER { + return "", e + } + if n <= uint32(len(b)) { + return "", e + } + } +} + +// IsMember reports whether the access token t is a member of the provided SID. +func (t Token) IsMember(sid *SID) (bool, error) { + var b int32 + if e := checkTokenMembership(t, sid, &b); e != nil { + return false, e + } + return b != 0, nil +} diff --git a/api/vendor/golang.org/x/sys/windows/service.go b/api/vendor/golang.org/x/sys/windows/service.go new file mode 100644 index 0000000..24aa90b --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/service.go @@ -0,0 +1,165 @@ +// 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. + +// +build windows + +package windows + +const ( + SC_MANAGER_CONNECT = 1 + SC_MANAGER_CREATE_SERVICE = 2 + SC_MANAGER_ENUMERATE_SERVICE = 4 + SC_MANAGER_LOCK = 8 + SC_MANAGER_QUERY_LOCK_STATUS = 16 + SC_MANAGER_MODIFY_BOOT_CONFIG = 32 + SC_MANAGER_ALL_ACCESS = 0xf003f +) + +//sys OpenSCManager(machineName *uint16, databaseName *uint16, access uint32) (handle Handle, err error) [failretval==0] = advapi32.OpenSCManagerW + +const ( + SERVICE_KERNEL_DRIVER = 1 + SERVICE_FILE_SYSTEM_DRIVER = 2 + SERVICE_ADAPTER = 4 + SERVICE_RECOGNIZER_DRIVER = 8 + SERVICE_WIN32_OWN_PROCESS = 16 + SERVICE_WIN32_SHARE_PROCESS = 32 + SERVICE_WIN32 = SERVICE_WIN32_OWN_PROCESS | SERVICE_WIN32_SHARE_PROCESS + SERVICE_INTERACTIVE_PROCESS = 256 + SERVICE_DRIVER = SERVICE_KERNEL_DRIVER | SERVICE_FILE_SYSTEM_DRIVER | SERVICE_RECOGNIZER_DRIVER + SERVICE_TYPE_ALL = SERVICE_WIN32 | SERVICE_ADAPTER | SERVICE_DRIVER | SERVICE_INTERACTIVE_PROCESS + + SERVICE_BOOT_START = 0 + SERVICE_SYSTEM_START = 1 + SERVICE_AUTO_START = 2 + SERVICE_DEMAND_START = 3 + SERVICE_DISABLED = 4 + + SERVICE_ERROR_IGNORE = 0 + SERVICE_ERROR_NORMAL = 1 + SERVICE_ERROR_SEVERE = 2 + SERVICE_ERROR_CRITICAL = 3 + + SC_STATUS_PROCESS_INFO = 0 + + SERVICE_STOPPED = 1 + SERVICE_START_PENDING = 2 + SERVICE_STOP_PENDING = 3 + SERVICE_RUNNING = 4 + SERVICE_CONTINUE_PENDING = 5 + SERVICE_PAUSE_PENDING = 6 + SERVICE_PAUSED = 7 + SERVICE_NO_CHANGE = 0xffffffff + + SERVICE_ACCEPT_STOP = 1 + SERVICE_ACCEPT_PAUSE_CONTINUE = 2 + SERVICE_ACCEPT_SHUTDOWN = 4 + SERVICE_ACCEPT_PARAMCHANGE = 8 + SERVICE_ACCEPT_NETBINDCHANGE = 16 + SERVICE_ACCEPT_HARDWAREPROFILECHANGE = 32 + SERVICE_ACCEPT_POWEREVENT = 64 + SERVICE_ACCEPT_SESSIONCHANGE = 128 + + SERVICE_CONTROL_STOP = 1 + SERVICE_CONTROL_PAUSE = 2 + SERVICE_CONTROL_CONTINUE = 3 + SERVICE_CONTROL_INTERROGATE = 4 + SERVICE_CONTROL_SHUTDOWN = 5 + SERVICE_CONTROL_PARAMCHANGE = 6 + SERVICE_CONTROL_NETBINDADD = 7 + SERVICE_CONTROL_NETBINDREMOVE = 8 + SERVICE_CONTROL_NETBINDENABLE = 9 + SERVICE_CONTROL_NETBINDDISABLE = 10 + SERVICE_CONTROL_DEVICEEVENT = 11 + SERVICE_CONTROL_HARDWAREPROFILECHANGE = 12 + SERVICE_CONTROL_POWEREVENT = 13 + SERVICE_CONTROL_SESSIONCHANGE = 14 + + SERVICE_ACTIVE = 1 + SERVICE_INACTIVE = 2 + SERVICE_STATE_ALL = 3 + + SERVICE_QUERY_CONFIG = 1 + SERVICE_CHANGE_CONFIG = 2 + SERVICE_QUERY_STATUS = 4 + SERVICE_ENUMERATE_DEPENDENTS = 8 + SERVICE_START = 16 + SERVICE_STOP = 32 + SERVICE_PAUSE_CONTINUE = 64 + SERVICE_INTERROGATE = 128 + SERVICE_USER_DEFINED_CONTROL = 256 + SERVICE_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SERVICE_QUERY_CONFIG | SERVICE_CHANGE_CONFIG | SERVICE_QUERY_STATUS | SERVICE_ENUMERATE_DEPENDENTS | SERVICE_START | SERVICE_STOP | SERVICE_PAUSE_CONTINUE | SERVICE_INTERROGATE | SERVICE_USER_DEFINED_CONTROL + SERVICE_RUNS_IN_SYSTEM_PROCESS = 1 + SERVICE_CONFIG_DESCRIPTION = 1 + SERVICE_CONFIG_FAILURE_ACTIONS = 2 + + NO_ERROR = 0 + + SC_ENUM_PROCESS_INFO = 0 +) + +type SERVICE_STATUS struct { + ServiceType uint32 + CurrentState uint32 + ControlsAccepted uint32 + Win32ExitCode uint32 + ServiceSpecificExitCode uint32 + CheckPoint uint32 + WaitHint uint32 +} + +type SERVICE_TABLE_ENTRY struct { + ServiceName *uint16 + ServiceProc uintptr +} + +type QUERY_SERVICE_CONFIG struct { + ServiceType uint32 + StartType uint32 + ErrorControl uint32 + BinaryPathName *uint16 + LoadOrderGroup *uint16 + TagId uint32 + Dependencies *uint16 + ServiceStartName *uint16 + DisplayName *uint16 +} + +type SERVICE_DESCRIPTION struct { + Description *uint16 +} + +type SERVICE_STATUS_PROCESS struct { + ServiceType uint32 + CurrentState uint32 + ControlsAccepted uint32 + Win32ExitCode uint32 + ServiceSpecificExitCode uint32 + CheckPoint uint32 + WaitHint uint32 + ProcessId uint32 + ServiceFlags uint32 +} + +type ENUM_SERVICE_STATUS_PROCESS struct { + ServiceName *uint16 + DisplayName *uint16 + ServiceStatusProcess SERVICE_STATUS_PROCESS +} + +//sys CloseServiceHandle(handle Handle) (err error) = advapi32.CloseServiceHandle +//sys CreateService(mgr Handle, serviceName *uint16, displayName *uint16, access uint32, srvType uint32, startType uint32, errCtl uint32, pathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16) (handle Handle, err error) [failretval==0] = advapi32.CreateServiceW +//sys OpenService(mgr Handle, serviceName *uint16, access uint32) (handle Handle, err error) [failretval==0] = advapi32.OpenServiceW +//sys DeleteService(service Handle) (err error) = advapi32.DeleteService +//sys StartService(service Handle, numArgs uint32, argVectors **uint16) (err error) = advapi32.StartServiceW +//sys QueryServiceStatus(service Handle, status *SERVICE_STATUS) (err error) = advapi32.QueryServiceStatus +//sys ControlService(service Handle, control uint32, status *SERVICE_STATUS) (err error) = advapi32.ControlService +//sys StartServiceCtrlDispatcher(serviceTable *SERVICE_TABLE_ENTRY) (err error) = advapi32.StartServiceCtrlDispatcherW +//sys SetServiceStatus(service Handle, serviceStatus *SERVICE_STATUS) (err error) = advapi32.SetServiceStatus +//sys ChangeServiceConfig(service Handle, serviceType uint32, startType uint32, errorControl uint32, binaryPathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16, displayName *uint16) (err error) = advapi32.ChangeServiceConfigW +//sys QueryServiceConfig(service Handle, serviceConfig *QUERY_SERVICE_CONFIG, bufSize uint32, bytesNeeded *uint32) (err error) = advapi32.QueryServiceConfigW +//sys ChangeServiceConfig2(service Handle, infoLevel uint32, info *byte) (err error) = advapi32.ChangeServiceConfig2W +//sys QueryServiceConfig2(service Handle, infoLevel uint32, buff *byte, buffSize uint32, bytesNeeded *uint32) (err error) = advapi32.QueryServiceConfig2W +//sys EnumServicesStatusEx(mgr Handle, infoLevel uint32, serviceType uint32, serviceState uint32, services *byte, bufSize uint32, bytesNeeded *uint32, servicesReturned *uint32, resumeHandle *uint32, groupName *uint16) (err error) = advapi32.EnumServicesStatusExW +//sys QueryServiceStatusEx(service Handle, infoLevel uint32, buff *byte, buffSize uint32, bytesNeeded *uint32) (err error) = advapi32.QueryServiceStatusEx diff --git a/api/vendor/golang.org/x/sys/windows/str.go b/api/vendor/golang.org/x/sys/windows/str.go new file mode 100644 index 0000000..917cc2a --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/str.go @@ -0,0 +1,22 @@ +// 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. + +// +build windows + +package windows + +func itoa(val int) string { // do it here rather than with fmt to avoid dependency + if val < 0 { + return "-" + itoa(-val) + } + var buf [32]byte // big enough for int64 + i := len(buf) - 1 + for val >= 10 { + buf[i] = byte(val%10 + '0') + i-- + val /= 10 + } + buf[i] = byte(val + '0') + return string(buf[i:]) +} diff --git a/api/vendor/golang.org/x/sys/windows/svc/debug/log.go b/api/vendor/golang.org/x/sys/windows/svc/debug/log.go new file mode 100644 index 0000000..e51ab42 --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/svc/debug/log.go @@ -0,0 +1,56 @@ +// 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. + +// +build windows + +package debug + +import ( + "os" + "strconv" +) + +// Log interface allows different log implementations to be used. +type Log interface { + Close() error + Info(eid uint32, msg string) error + Warning(eid uint32, msg string) error + Error(eid uint32, msg string) error +} + +// ConsoleLog provides access to the console. +type ConsoleLog struct { + Name string +} + +// New creates new ConsoleLog. +func New(source string) *ConsoleLog { + return &ConsoleLog{Name: source} +} + +// Close closes console log l. +func (l *ConsoleLog) Close() error { + return nil +} + +func (l *ConsoleLog) report(kind string, eid uint32, msg string) error { + s := l.Name + "." + kind + "(" + strconv.Itoa(int(eid)) + "): " + msg + "\n" + _, err := os.Stdout.Write([]byte(s)) + return err +} + +// Info writes an information event msg with event id eid to the console l. +func (l *ConsoleLog) Info(eid uint32, msg string) error { + return l.report("info", eid, msg) +} + +// Warning writes an warning event msg with event id eid to the console l. +func (l *ConsoleLog) Warning(eid uint32, msg string) error { + return l.report("warn", eid, msg) +} + +// Error writes an error event msg with event id eid to the console l. +func (l *ConsoleLog) Error(eid uint32, msg string) error { + return l.report("error", eid, msg) +} diff --git a/api/vendor/golang.org/x/sys/windows/svc/debug/service.go b/api/vendor/golang.org/x/sys/windows/svc/debug/service.go new file mode 100644 index 0000000..e621b87 --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/svc/debug/service.go @@ -0,0 +1,45 @@ +// 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. + +// +build windows + +// Package debug provides facilities to execute svc.Handler on console. +// +package debug + +import ( + "os" + "os/signal" + "syscall" + + "golang.org/x/sys/windows/svc" +) + +// Run executes service name by calling appropriate handler function. +// The process is running on console, unlike real service. Use Ctrl+C to +// send "Stop" command to your service. +func Run(name string, handler svc.Handler) error { + cmds := make(chan svc.ChangeRequest) + changes := make(chan svc.Status) + + sig := make(chan os.Signal) + signal.Notify(sig) + + go func() { + status := svc.Status{State: svc.Stopped} + for { + select { + case <-sig: + cmds <- svc.ChangeRequest{Cmd: svc.Stop, CurrentStatus: status} + case status = <-changes: + } + } + }() + + _, errno := handler.Execute([]string{name}, cmds, changes) + if errno != 0 { + return syscall.Errno(errno) + } + return nil +} diff --git a/api/vendor/golang.org/x/sys/windows/svc/event.go b/api/vendor/golang.org/x/sys/windows/svc/event.go new file mode 100644 index 0000000..0508e22 --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/svc/event.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. + +// +build windows + +package svc + +import ( + "errors" + + "golang.org/x/sys/windows" +) + +// event represents auto-reset, initially non-signaled Windows event. +// It is used to communicate between go and asm parts of this package. +type event struct { + h windows.Handle +} + +func newEvent() (*event, error) { + h, err := windows.CreateEvent(nil, 0, 0, nil) + if err != nil { + return nil, err + } + return &event{h: h}, nil +} + +func (e *event) Close() error { + return windows.CloseHandle(e.h) +} + +func (e *event) Set() error { + return windows.SetEvent(e.h) +} + +func (e *event) Wait() error { + s, err := windows.WaitForSingleObject(e.h, windows.INFINITE) + switch s { + case windows.WAIT_OBJECT_0: + break + case windows.WAIT_FAILED: + return err + default: + return errors.New("unexpected result from WaitForSingleObject") + } + return nil +} diff --git a/api/vendor/golang.org/x/sys/windows/svc/eventlog/install.go b/api/vendor/golang.org/x/sys/windows/svc/eventlog/install.go new file mode 100644 index 0000000..c76a376 --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/svc/eventlog/install.go @@ -0,0 +1,80 @@ +// 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. + +// +build windows + +package eventlog + +import ( + "errors" + + "golang.org/x/sys/windows" + "golang.org/x/sys/windows/registry" +) + +const ( + // Log levels. + Info = windows.EVENTLOG_INFORMATION_TYPE + Warning = windows.EVENTLOG_WARNING_TYPE + Error = windows.EVENTLOG_ERROR_TYPE +) + +const addKeyName = `SYSTEM\CurrentControlSet\Services\EventLog\Application` + +// Install modifies PC registry to allow logging with an event source src. +// It adds all required keys and values to the event log registry key. +// Install uses msgFile as the event message file. If useExpandKey is true, +// the event message file is installed as REG_EXPAND_SZ value, +// otherwise as REG_SZ. Use bitwise of log.Error, log.Warning and +// log.Info to specify events supported by the new event source. +func Install(src, msgFile string, useExpandKey bool, eventsSupported uint32) error { + appkey, err := registry.OpenKey(registry.LOCAL_MACHINE, addKeyName, registry.CREATE_SUB_KEY) + if err != nil { + return err + } + defer appkey.Close() + + sk, alreadyExist, err := registry.CreateKey(appkey, src, registry.SET_VALUE) + if err != nil { + return err + } + defer sk.Close() + if alreadyExist { + return errors.New(addKeyName + `\` + src + " registry key already exists") + } + + err = sk.SetDWordValue("CustomSource", 1) + if err != nil { + return err + } + if useExpandKey { + err = sk.SetExpandStringValue("EventMessageFile", msgFile) + } else { + err = sk.SetStringValue("EventMessageFile", msgFile) + } + if err != nil { + return err + } + err = sk.SetDWordValue("TypesSupported", eventsSupported) + if err != nil { + return err + } + return nil +} + +// InstallAsEventCreate is the same as Install, but uses +// %SystemRoot%\System32\EventCreate.exe as the event message file. +func InstallAsEventCreate(src string, eventsSupported uint32) error { + return Install(src, "%SystemRoot%\\System32\\EventCreate.exe", true, eventsSupported) +} + +// Remove deletes all registry elements installed by the correspondent Install. +func Remove(src string) error { + appkey, err := registry.OpenKey(registry.LOCAL_MACHINE, addKeyName, registry.SET_VALUE) + if err != nil { + return err + } + defer appkey.Close() + return registry.DeleteKey(appkey, src) +} diff --git a/api/vendor/golang.org/x/sys/windows/svc/eventlog/log.go b/api/vendor/golang.org/x/sys/windows/svc/eventlog/log.go new file mode 100644 index 0000000..46e5153 --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/svc/eventlog/log.go @@ -0,0 +1,70 @@ +// 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. + +// +build windows + +// Package eventlog implements access to Windows event log. +// +package eventlog + +import ( + "errors" + "syscall" + + "golang.org/x/sys/windows" +) + +// Log provides access to the system log. +type Log struct { + Handle windows.Handle +} + +// Open retrieves a handle to the specified event log. +func Open(source string) (*Log, error) { + return OpenRemote("", source) +} + +// OpenRemote does the same as Open, but on different computer host. +func OpenRemote(host, source string) (*Log, error) { + if source == "" { + return nil, errors.New("Specify event log source") + } + var s *uint16 + if host != "" { + s = syscall.StringToUTF16Ptr(host) + } + h, err := windows.RegisterEventSource(s, syscall.StringToUTF16Ptr(source)) + if err != nil { + return nil, err + } + return &Log{Handle: h}, nil +} + +// Close closes event log l. +func (l *Log) Close() error { + return windows.DeregisterEventSource(l.Handle) +} + +func (l *Log) report(etype uint16, eid uint32, msg string) error { + ss := []*uint16{syscall.StringToUTF16Ptr(msg)} + return windows.ReportEvent(l.Handle, etype, 0, eid, 0, 1, 0, &ss[0], nil) +} + +// Info writes an information event msg with event id eid to the end of event log l. +// When EventCreate.exe is used, eid must be between 1 and 1000. +func (l *Log) Info(eid uint32, msg string) error { + return l.report(windows.EVENTLOG_INFORMATION_TYPE, eid, msg) +} + +// Warning writes an warning event msg with event id eid to the end of event log l. +// When EventCreate.exe is used, eid must be between 1 and 1000. +func (l *Log) Warning(eid uint32, msg string) error { + return l.report(windows.EVENTLOG_WARNING_TYPE, eid, msg) +} + +// Error writes an error event msg with event id eid to the end of event log l. +// When EventCreate.exe is used, eid must be between 1 and 1000. +func (l *Log) Error(eid uint32, msg string) error { + return l.report(windows.EVENTLOG_ERROR_TYPE, eid, msg) +} diff --git a/api/vendor/golang.org/x/sys/windows/svc/eventlog/log_test.go b/api/vendor/golang.org/x/sys/windows/svc/eventlog/log_test.go new file mode 100644 index 0000000..6fbbd4a --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/svc/eventlog/log_test.go @@ -0,0 +1,51 @@ +// 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. + +// +build windows + +package eventlog_test + +import ( + "testing" + + "golang.org/x/sys/windows/svc/eventlog" +) + +func TestLog(t *testing.T) { + if testing.Short() { + t.Skip("skipping test in short mode - it modifies system logs") + } + + const name = "mylog" + const supports = eventlog.Error | eventlog.Warning | eventlog.Info + err := eventlog.InstallAsEventCreate(name, supports) + if err != nil { + t.Fatalf("Install failed: %s", err) + } + defer func() { + err = eventlog.Remove(name) + if err != nil { + t.Fatalf("Remove failed: %s", err) + } + }() + + l, err := eventlog.Open(name) + if err != nil { + t.Fatalf("Open failed: %s", err) + } + defer l.Close() + + err = l.Info(1, "info") + if err != nil { + t.Fatalf("Info failed: %s", err) + } + err = l.Warning(2, "warning") + if err != nil { + t.Fatalf("Warning failed: %s", err) + } + err = l.Error(3, "error") + if err != nil { + t.Fatalf("Error failed: %s", err) + } +} diff --git a/api/vendor/golang.org/x/sys/windows/svc/example/beep.go b/api/vendor/golang.org/x/sys/windows/svc/example/beep.go new file mode 100644 index 0000000..dcf2340 --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/svc/example/beep.go @@ -0,0 +1,22 @@ +// 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. + +// +build windows + +package main + +import ( + "syscall" +) + +// BUG(brainman): MessageBeep Windows api is broken on Windows 7, +// so this example does not beep when runs as service on Windows 7. + +var ( + beepFunc = syscall.MustLoadDLL("user32.dll").MustFindProc("MessageBeep") +) + +func beep() { + beepFunc.Call(0xffffffff) +} diff --git a/api/vendor/golang.org/x/sys/windows/svc/example/install.go b/api/vendor/golang.org/x/sys/windows/svc/example/install.go new file mode 100644 index 0000000..39cb00d --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/svc/example/install.go @@ -0,0 +1,92 @@ +// 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. + +// +build windows + +package main + +import ( + "fmt" + "os" + "path/filepath" + + "golang.org/x/sys/windows/svc/eventlog" + "golang.org/x/sys/windows/svc/mgr" +) + +func exePath() (string, error) { + prog := os.Args[0] + p, err := filepath.Abs(prog) + if err != nil { + return "", err + } + fi, err := os.Stat(p) + if err == nil { + if !fi.Mode().IsDir() { + return p, nil + } + err = fmt.Errorf("%s is directory", p) + } + if filepath.Ext(p) == "" { + p += ".exe" + fi, err := os.Stat(p) + if err == nil { + if !fi.Mode().IsDir() { + return p, nil + } + err = fmt.Errorf("%s is directory", p) + } + } + return "", err +} + +func installService(name, desc string) error { + exepath, err := exePath() + if err != nil { + return err + } + m, err := mgr.Connect() + if err != nil { + return err + } + defer m.Disconnect() + s, err := m.OpenService(name) + if err == nil { + s.Close() + return fmt.Errorf("service %s already exists", name) + } + s, err = m.CreateService(name, exepath, mgr.Config{DisplayName: desc}, "is", "auto-started") + if err != nil { + return err + } + defer s.Close() + err = eventlog.InstallAsEventCreate(name, eventlog.Error|eventlog.Warning|eventlog.Info) + if err != nil { + s.Delete() + return fmt.Errorf("SetupEventLogSource() failed: %s", err) + } + return nil +} + +func removeService(name string) error { + m, err := mgr.Connect() + if err != nil { + return err + } + defer m.Disconnect() + s, err := m.OpenService(name) + if err != nil { + return fmt.Errorf("service %s is not installed", name) + } + defer s.Close() + err = s.Delete() + if err != nil { + return err + } + err = eventlog.Remove(name) + if err != nil { + return fmt.Errorf("RemoveEventLogSource() failed: %s", err) + } + return nil +} diff --git a/api/vendor/golang.org/x/sys/windows/svc/example/main.go b/api/vendor/golang.org/x/sys/windows/svc/example/main.go new file mode 100644 index 0000000..dc96c08 --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/svc/example/main.go @@ -0,0 +1,76 @@ +// 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. + +// +build windows + +// Example service program that beeps. +// +// The program demonstrates how to create Windows service and +// install / remove it on a computer. It also shows how to +// stop / start / pause / continue any service, and how to +// write to event log. It also shows how to use debug +// facilities available in debug package. +// +package main + +import ( + "fmt" + "log" + "os" + "strings" + + "golang.org/x/sys/windows/svc" +) + +func usage(errmsg string) { + fmt.Fprintf(os.Stderr, + "%s\n\n"+ + "usage: %s \n"+ + " where is one of\n"+ + " install, remove, debug, start, stop, pause or continue.\n", + errmsg, os.Args[0]) + os.Exit(2) +} + +func main() { + const svcName = "myservice" + + isIntSess, err := svc.IsAnInteractiveSession() + if err != nil { + log.Fatalf("failed to determine if we are running in an interactive session: %v", err) + } + if !isIntSess { + runService(svcName, false) + return + } + + if len(os.Args) < 2 { + usage("no command specified") + } + + cmd := strings.ToLower(os.Args[1]) + switch cmd { + case "debug": + runService(svcName, true) + return + case "install": + err = installService(svcName, "my service") + case "remove": + err = removeService(svcName) + case "start": + err = startService(svcName) + case "stop": + err = controlService(svcName, svc.Stop, svc.Stopped) + case "pause": + err = controlService(svcName, svc.Pause, svc.Paused) + case "continue": + err = controlService(svcName, svc.Continue, svc.Running) + default: + usage(fmt.Sprintf("invalid command %s", cmd)) + } + if err != nil { + log.Fatalf("failed to %s %s: %v", cmd, svcName, err) + } + return +} diff --git a/api/vendor/golang.org/x/sys/windows/svc/example/manage.go b/api/vendor/golang.org/x/sys/windows/svc/example/manage.go new file mode 100644 index 0000000..782dbd9 --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/svc/example/manage.go @@ -0,0 +1,62 @@ +// 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. + +// +build windows + +package main + +import ( + "fmt" + "time" + + "golang.org/x/sys/windows/svc" + "golang.org/x/sys/windows/svc/mgr" +) + +func startService(name string) error { + m, err := mgr.Connect() + if err != nil { + return err + } + defer m.Disconnect() + s, err := m.OpenService(name) + if err != nil { + return fmt.Errorf("could not access service: %v", err) + } + defer s.Close() + err = s.Start("is", "manual-started") + if err != nil { + return fmt.Errorf("could not start service: %v", err) + } + return nil +} + +func controlService(name string, c svc.Cmd, to svc.State) error { + m, err := mgr.Connect() + if err != nil { + return err + } + defer m.Disconnect() + s, err := m.OpenService(name) + if err != nil { + return fmt.Errorf("could not access service: %v", err) + } + defer s.Close() + status, err := s.Control(c) + if err != nil { + return fmt.Errorf("could not send control=%d: %v", c, err) + } + timeout := time.Now().Add(10 * time.Second) + for status.State != to { + if timeout.Before(time.Now()) { + return fmt.Errorf("timeout waiting for service to go to state=%d", to) + } + time.Sleep(300 * time.Millisecond) + status, err = s.Query() + if err != nil { + return fmt.Errorf("could not retrieve service status: %v", err) + } + } + return nil +} diff --git a/api/vendor/golang.org/x/sys/windows/svc/example/service.go b/api/vendor/golang.org/x/sys/windows/svc/example/service.go new file mode 100644 index 0000000..74c9393 --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/svc/example/service.go @@ -0,0 +1,84 @@ +// 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. + +// +build windows + +package main + +import ( + "fmt" + "strings" + "time" + + "golang.org/x/sys/windows/svc" + "golang.org/x/sys/windows/svc/debug" + "golang.org/x/sys/windows/svc/eventlog" +) + +var elog debug.Log + +type myservice struct{} + +func (m *myservice) Execute(args []string, r <-chan svc.ChangeRequest, changes chan<- svc.Status) (ssec bool, errno uint32) { + const cmdsAccepted = svc.AcceptStop | svc.AcceptShutdown | svc.AcceptPauseAndContinue + changes <- svc.Status{State: svc.StartPending} + fasttick := time.Tick(500 * time.Millisecond) + slowtick := time.Tick(2 * time.Second) + tick := fasttick + changes <- svc.Status{State: svc.Running, Accepts: cmdsAccepted} + elog.Info(1, strings.Join(args, "-")) +loop: + for { + select { + case <-tick: + beep() + elog.Info(1, "beep") + case c := <-r: + switch c.Cmd { + case svc.Interrogate: + changes <- c.CurrentStatus + // Testing deadlock from https://code.google.com/p/winsvc/issues/detail?id=4 + time.Sleep(100 * time.Millisecond) + changes <- c.CurrentStatus + case svc.Stop, svc.Shutdown: + break loop + case svc.Pause: + changes <- svc.Status{State: svc.Paused, Accepts: cmdsAccepted} + tick = slowtick + case svc.Continue: + changes <- svc.Status{State: svc.Running, Accepts: cmdsAccepted} + tick = fasttick + default: + elog.Error(1, fmt.Sprintf("unexpected control request #%d", c)) + } + } + } + changes <- svc.Status{State: svc.StopPending} + return +} + +func runService(name string, isDebug bool) { + var err error + if isDebug { + elog = debug.New(name) + } else { + elog, err = eventlog.Open(name) + if err != nil { + return + } + } + defer elog.Close() + + elog.Info(1, fmt.Sprintf("starting %s service", name)) + run := svc.Run + if isDebug { + run = debug.Run + } + err = run(name, &myservice{}) + if err != nil { + elog.Error(1, fmt.Sprintf("%s service failed: %v", name, err)) + return + } + elog.Info(1, fmt.Sprintf("%s service stopped", name)) +} diff --git a/api/vendor/golang.org/x/sys/windows/svc/go12.c b/api/vendor/golang.org/x/sys/windows/svc/go12.c new file mode 100644 index 0000000..6f1be1f --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/svc/go12.c @@ -0,0 +1,24 @@ +// 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. + +// +build windows +// +build !go1.3 + +// copied from pkg/runtime +typedef unsigned int uint32; +typedef unsigned long long int uint64; +#ifdef _64BIT +typedef uint64 uintptr; +#else +typedef uint32 uintptr; +#endif + +// from sys_386.s or sys_amd64.s +void ·servicemain(void); + +void +·getServiceMain(uintptr *r) +{ + *r = (uintptr)·servicemain; +} diff --git a/api/vendor/golang.org/x/sys/windows/svc/go12.go b/api/vendor/golang.org/x/sys/windows/svc/go12.go new file mode 100644 index 0000000..cd8b913 --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/svc/go12.go @@ -0,0 +1,11 @@ +// 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. + +// +build windows +// +build !go1.3 + +package svc + +// from go12.c +func getServiceMain(r *uintptr) diff --git a/api/vendor/golang.org/x/sys/windows/svc/go13.go b/api/vendor/golang.org/x/sys/windows/svc/go13.go new file mode 100644 index 0000000..9d7f3ce --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/svc/go13.go @@ -0,0 +1,31 @@ +// 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. + +// +build windows +// +build go1.3 + +package svc + +import "unsafe" + +const ptrSize = 4 << (^uintptr(0) >> 63) // unsafe.Sizeof(uintptr(0)) but an ideal const + +// Should be a built-in for unsafe.Pointer? +func add(p unsafe.Pointer, x uintptr) unsafe.Pointer { + return unsafe.Pointer(uintptr(p) + x) +} + +// funcPC returns the entry PC of the function f. +// It assumes that f is a func value. Otherwise the behavior is undefined. +func funcPC(f interface{}) uintptr { + return **(**uintptr)(add(unsafe.Pointer(&f), ptrSize)) +} + +// from sys_386.s and sys_amd64.s +func servicectlhandler(ctl uint32) uintptr +func servicemain(argc uint32, argv **uint16) + +func getServiceMain(r *uintptr) { + *r = funcPC(servicemain) +} diff --git a/api/vendor/golang.org/x/sys/windows/svc/mgr/config.go b/api/vendor/golang.org/x/sys/windows/svc/mgr/config.go new file mode 100644 index 0000000..03bf41f --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/svc/mgr/config.go @@ -0,0 +1,139 @@ +// 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. + +// +build windows + +package mgr + +import ( + "syscall" + "unicode/utf16" + "unsafe" + + "golang.org/x/sys/windows" +) + +const ( + // Service start types. + StartManual = windows.SERVICE_DEMAND_START // the service must be started manually + StartAutomatic = windows.SERVICE_AUTO_START // the service will start by itself whenever the computer reboots + StartDisabled = windows.SERVICE_DISABLED // the service cannot be started + + // The severity of the error, and action taken, + // if this service fails to start. + ErrorCritical = windows.SERVICE_ERROR_CRITICAL + ErrorIgnore = windows.SERVICE_ERROR_IGNORE + ErrorNormal = windows.SERVICE_ERROR_NORMAL + ErrorSevere = windows.SERVICE_ERROR_SEVERE +) + +// TODO(brainman): Password is not returned by windows.QueryServiceConfig, not sure how to get it. + +type Config struct { + ServiceType uint32 + StartType uint32 + ErrorControl uint32 + BinaryPathName string // fully qualified path to the service binary file, can also include arguments for an auto-start service + LoadOrderGroup string + TagId uint32 + Dependencies []string + ServiceStartName string // name of the account under which the service should run + DisplayName string + Password string + Description string +} + +func toString(p *uint16) string { + if p == nil { + return "" + } + return syscall.UTF16ToString((*[4096]uint16)(unsafe.Pointer(p))[:]) +} + +func toStringSlice(ps *uint16) []string { + if ps == nil { + return nil + } + r := make([]string, 0) + for from, i, p := 0, 0, (*[1 << 24]uint16)(unsafe.Pointer(ps)); true; i++ { + if p[i] == 0 { + // empty string marks the end + if i <= from { + break + } + r = append(r, string(utf16.Decode(p[from:i]))) + from = i + 1 + } + } + return r +} + +// Config retrieves service s configuration paramteres. +func (s *Service) Config() (Config, error) { + var p *windows.QUERY_SERVICE_CONFIG + n := uint32(1024) + for { + b := make([]byte, n) + p = (*windows.QUERY_SERVICE_CONFIG)(unsafe.Pointer(&b[0])) + err := windows.QueryServiceConfig(s.Handle, p, n, &n) + if err == nil { + break + } + if err.(syscall.Errno) != syscall.ERROR_INSUFFICIENT_BUFFER { + return Config{}, err + } + if n <= uint32(len(b)) { + return Config{}, err + } + } + + var p2 *windows.SERVICE_DESCRIPTION + n = uint32(1024) + for { + b := make([]byte, n) + p2 = (*windows.SERVICE_DESCRIPTION)(unsafe.Pointer(&b[0])) + err := windows.QueryServiceConfig2(s.Handle, + windows.SERVICE_CONFIG_DESCRIPTION, &b[0], n, &n) + if err == nil { + break + } + if err.(syscall.Errno) != syscall.ERROR_INSUFFICIENT_BUFFER { + return Config{}, err + } + if n <= uint32(len(b)) { + return Config{}, err + } + } + + return Config{ + ServiceType: p.ServiceType, + StartType: p.StartType, + ErrorControl: p.ErrorControl, + BinaryPathName: toString(p.BinaryPathName), + LoadOrderGroup: toString(p.LoadOrderGroup), + TagId: p.TagId, + Dependencies: toStringSlice(p.Dependencies), + ServiceStartName: toString(p.ServiceStartName), + DisplayName: toString(p.DisplayName), + Description: toString(p2.Description), + }, nil +} + +func updateDescription(handle windows.Handle, desc string) error { + d := windows.SERVICE_DESCRIPTION{Description: toPtr(desc)} + return windows.ChangeServiceConfig2(handle, + windows.SERVICE_CONFIG_DESCRIPTION, (*byte)(unsafe.Pointer(&d))) +} + +// UpdateConfig updates service s configuration parameters. +func (s *Service) UpdateConfig(c Config) error { + err := windows.ChangeServiceConfig(s.Handle, c.ServiceType, c.StartType, + c.ErrorControl, toPtr(c.BinaryPathName), toPtr(c.LoadOrderGroup), + nil, toStringBlock(c.Dependencies), toPtr(c.ServiceStartName), + toPtr(c.Password), toPtr(c.DisplayName)) + if err != nil { + return err + } + return updateDescription(s.Handle, c.Description) +} diff --git a/api/vendor/golang.org/x/sys/windows/svc/mgr/mgr.go b/api/vendor/golang.org/x/sys/windows/svc/mgr/mgr.go new file mode 100644 index 0000000..76965b5 --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/svc/mgr/mgr.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. + +// +build windows + +// Package mgr can be used to manage Windows service programs. +// It can be used to install and remove them. It can also start, +// stop and pause them. The package can query / change current +// service state and config parameters. +// +package mgr + +import ( + "syscall" + "unicode/utf16" + "unsafe" + + "golang.org/x/sys/windows" +) + +// Mgr is used to manage Windows service. +type Mgr struct { + Handle windows.Handle +} + +// Connect establishes a connection to the service control manager. +func Connect() (*Mgr, error) { + return ConnectRemote("") +} + +// ConnectRemote establishes a connection to the +// service control manager on computer named host. +func ConnectRemote(host string) (*Mgr, error) { + var s *uint16 + if host != "" { + s = syscall.StringToUTF16Ptr(host) + } + h, err := windows.OpenSCManager(s, nil, windows.SC_MANAGER_ALL_ACCESS) + if err != nil { + return nil, err + } + return &Mgr{Handle: h}, nil +} + +// Disconnect closes connection to the service control manager m. +func (m *Mgr) Disconnect() error { + return windows.CloseServiceHandle(m.Handle) +} + +func toPtr(s string) *uint16 { + if len(s) == 0 { + return nil + } + return syscall.StringToUTF16Ptr(s) +} + +// toStringBlock terminates strings in ss with 0, and then +// concatenates them together. It also adds extra 0 at the end. +func toStringBlock(ss []string) *uint16 { + if len(ss) == 0 { + return nil + } + t := "" + for _, s := range ss { + if s != "" { + t += s + "\x00" + } + } + if t == "" { + return nil + } + t += "\x00" + return &utf16.Encode([]rune(t))[0] +} + +// CreateService installs new service name on the system. +// The service will be executed by running exepath binary. +// Use config c to specify service parameters. +// Any args will be passed as command-line arguments when +// the service is started; these arguments are distinct from +// the arguments passed to Service.Start or via the "Start +// parameters" field in the service's Properties dialog box. +func (m *Mgr) CreateService(name, exepath string, c Config, args ...string) (*Service, error) { + if c.StartType == 0 { + c.StartType = StartManual + } + if c.ErrorControl == 0 { + c.ErrorControl = ErrorNormal + } + if c.ServiceType == 0 { + c.ServiceType = windows.SERVICE_WIN32_OWN_PROCESS + } + s := syscall.EscapeArg(exepath) + for _, v := range args { + s += " " + syscall.EscapeArg(v) + } + h, err := windows.CreateService(m.Handle, toPtr(name), toPtr(c.DisplayName), + windows.SERVICE_ALL_ACCESS, c.ServiceType, + c.StartType, c.ErrorControl, toPtr(s), toPtr(c.LoadOrderGroup), + nil, toStringBlock(c.Dependencies), toPtr(c.ServiceStartName), toPtr(c.Password)) + if err != nil { + return nil, err + } + if c.Description != "" { + err = updateDescription(h, c.Description) + if err != nil { + return nil, err + } + } + return &Service{Name: name, Handle: h}, nil +} + +// OpenService retrieves access to service name, so it can +// be interrogated and controlled. +func (m *Mgr) OpenService(name string) (*Service, error) { + h, err := windows.OpenService(m.Handle, syscall.StringToUTF16Ptr(name), windows.SERVICE_ALL_ACCESS) + if err != nil { + return nil, err + } + return &Service{Name: name, Handle: h}, nil +} + +// ListServices enumerates services in the specified +// service control manager database m. +// If the caller does not have the SERVICE_QUERY_STATUS +// access right to a service, the service is silently +// omitted from the list of services returned. +func (m *Mgr) ListServices() ([]string, error) { + var err error + var bytesNeeded, servicesReturned uint32 + var buf []byte + for { + var p *byte + if len(buf) > 0 { + p = &buf[0] + } + err = windows.EnumServicesStatusEx(m.Handle, windows.SC_ENUM_PROCESS_INFO, + windows.SERVICE_WIN32, windows.SERVICE_STATE_ALL, + p, uint32(len(buf)), &bytesNeeded, &servicesReturned, nil, nil) + if err == nil { + break + } + if err != syscall.ERROR_MORE_DATA { + return nil, err + } + if bytesNeeded <= uint32(len(buf)) { + return nil, err + } + buf = make([]byte, bytesNeeded) + } + if servicesReturned == 0 { + return nil, nil + } + services := (*[1 << 20]windows.ENUM_SERVICE_STATUS_PROCESS)(unsafe.Pointer(&buf[0]))[:servicesReturned] + var names []string + for _, s := range services { + name := syscall.UTF16ToString((*[1 << 20]uint16)(unsafe.Pointer(s.ServiceName))[:]) + names = append(names, name) + } + return names, nil +} diff --git a/api/vendor/golang.org/x/sys/windows/svc/mgr/mgr_test.go b/api/vendor/golang.org/x/sys/windows/svc/mgr/mgr_test.go new file mode 100644 index 0000000..1569a22 --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/svc/mgr/mgr_test.go @@ -0,0 +1,169 @@ +// 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. + +// +build windows + +package mgr_test + +import ( + "os" + "path/filepath" + "sort" + "strings" + "syscall" + "testing" + "time" + + "golang.org/x/sys/windows/svc/mgr" +) + +func TestOpenLanManServer(t *testing.T) { + m, err := mgr.Connect() + if err != nil { + if errno, ok := err.(syscall.Errno); ok && errno == syscall.ERROR_ACCESS_DENIED { + t.Skip("Skipping test: we don't have rights to manage services.") + } + t.Fatalf("SCM connection failed: %s", err) + } + defer m.Disconnect() + + s, err := m.OpenService("LanmanServer") + if err != nil { + t.Fatalf("OpenService(lanmanserver) failed: %s", err) + } + defer s.Close() + + _, err = s.Config() + if err != nil { + t.Fatalf("Config failed: %s", err) + } +} + +func install(t *testing.T, m *mgr.Mgr, name, exepath string, c mgr.Config) { + // Sometimes it takes a while for the service to get + // removed after previous test run. + for i := 0; ; i++ { + s, err := m.OpenService(name) + if err != nil { + break + } + s.Close() + + if i > 10 { + t.Fatalf("service %s already exists", name) + } + time.Sleep(300 * time.Millisecond) + } + + s, err := m.CreateService(name, exepath, c) + if err != nil { + t.Fatalf("CreateService(%s) failed: %v", name, err) + } + defer s.Close() +} + +func depString(d []string) string { + if len(d) == 0 { + return "" + } + for i := range d { + d[i] = strings.ToLower(d[i]) + } + ss := sort.StringSlice(d) + ss.Sort() + return strings.Join([]string(ss), " ") +} + +func testConfig(t *testing.T, s *mgr.Service, should mgr.Config) mgr.Config { + is, err := s.Config() + if err != nil { + t.Fatalf("Config failed: %s", err) + } + if should.DisplayName != is.DisplayName { + t.Fatalf("config mismatch: DisplayName is %q, but should have %q", is.DisplayName, should.DisplayName) + } + if should.StartType != is.StartType { + t.Fatalf("config mismatch: StartType is %v, but should have %v", is.StartType, should.StartType) + } + if should.Description != is.Description { + t.Fatalf("config mismatch: Description is %q, but should have %q", is.Description, should.Description) + } + if depString(should.Dependencies) != depString(is.Dependencies) { + t.Fatalf("config mismatch: Dependencies is %v, but should have %v", is.Dependencies, should.Dependencies) + } + return is +} + +func remove(t *testing.T, s *mgr.Service) { + err := s.Delete() + if err != nil { + t.Fatalf("Delete failed: %s", err) + } +} + +func TestMyService(t *testing.T) { + if testing.Short() { + t.Skip("skipping test in short mode - it modifies system services") + } + + const name = "myservice" + + m, err := mgr.Connect() + if err != nil { + if errno, ok := err.(syscall.Errno); ok && errno == syscall.ERROR_ACCESS_DENIED { + t.Skip("Skipping test: we don't have rights to manage services.") + } + t.Fatalf("SCM connection failed: %s", err) + } + defer m.Disconnect() + + c := mgr.Config{ + StartType: mgr.StartDisabled, + DisplayName: "my service", + Description: "my service is just a test", + Dependencies: []string{"LanmanServer", "W32Time"}, + } + + exename := os.Args[0] + exepath, err := filepath.Abs(exename) + if err != nil { + t.Fatalf("filepath.Abs(%s) failed: %s", exename, err) + } + + install(t, m, name, exepath, c) + + s, err := m.OpenService(name) + if err != nil { + t.Fatalf("service %s is not installed", name) + } + defer s.Close() + + c.BinaryPathName = exepath + c = testConfig(t, s, c) + + c.StartType = mgr.StartManual + err = s.UpdateConfig(c) + if err != nil { + t.Fatalf("UpdateConfig failed: %v", err) + } + + testConfig(t, s, c) + + svcnames, err := m.ListServices() + if err != nil { + t.Fatalf("ListServices failed: %v", err) + } + var myserviceIsInstalled bool + for _, sn := range svcnames { + if sn == name { + myserviceIsInstalled = true + break + } + } + if !myserviceIsInstalled { + t.Errorf("ListServices failed to find %q service", name) + } + + remove(t, s) +} diff --git a/api/vendor/golang.org/x/sys/windows/svc/mgr/service.go b/api/vendor/golang.org/x/sys/windows/svc/mgr/service.go new file mode 100644 index 0000000..fdc46af --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/svc/mgr/service.go @@ -0,0 +1,72 @@ +// 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. + +// +build windows + +package mgr + +import ( + "syscall" + + "golang.org/x/sys/windows" + "golang.org/x/sys/windows/svc" +) + +// TODO(brainman): Use EnumDependentServices to enumerate dependent services. + +// Service is used to access Windows service. +type Service struct { + Name string + Handle windows.Handle +} + +// Delete marks service s for deletion from the service control manager database. +func (s *Service) Delete() error { + return windows.DeleteService(s.Handle) +} + +// Close relinquish access to the service s. +func (s *Service) Close() error { + return windows.CloseServiceHandle(s.Handle) +} + +// Start starts service s. +// args will be passed to svc.Handler.Execute. +func (s *Service) Start(args ...string) error { + var p **uint16 + if len(args) > 0 { + vs := make([]*uint16, len(args)) + for i := range vs { + vs[i] = syscall.StringToUTF16Ptr(args[i]) + } + p = &vs[0] + } + return windows.StartService(s.Handle, uint32(len(args)), p) +} + +// Control sends state change request c to the servce s. +func (s *Service) Control(c svc.Cmd) (svc.Status, error) { + var t windows.SERVICE_STATUS + err := windows.ControlService(s.Handle, uint32(c), &t) + if err != nil { + return svc.Status{}, err + } + return svc.Status{ + State: svc.State(t.CurrentState), + Accepts: svc.Accepted(t.ControlsAccepted), + }, nil +} + +// Query returns current status of service s. +func (s *Service) Query() (svc.Status, error) { + var t windows.SERVICE_STATUS + err := windows.QueryServiceStatus(s.Handle, &t) + if err != nil { + return svc.Status{}, err + } + return svc.Status{ + State: svc.State(t.CurrentState), + Accepts: svc.Accepted(t.ControlsAccepted), + }, nil +} diff --git a/api/vendor/golang.org/x/sys/windows/svc/security.go b/api/vendor/golang.org/x/sys/windows/svc/security.go new file mode 100644 index 0000000..6fbc923 --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/svc/security.go @@ -0,0 +1,62 @@ +// 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. + +// +build windows + +package svc + +import ( + "unsafe" + + "golang.org/x/sys/windows" +) + +func allocSid(subAuth0 uint32) (*windows.SID, error) { + var sid *windows.SID + err := windows.AllocateAndInitializeSid(&windows.SECURITY_NT_AUTHORITY, + 1, subAuth0, 0, 0, 0, 0, 0, 0, 0, &sid) + if err != nil { + return nil, err + } + return sid, nil +} + +// IsAnInteractiveSession determines if calling process is running interactively. +// It queries the process token for membership in the Interactive group. +// http://stackoverflow.com/questions/2668851/how-do-i-detect-that-my-application-is-running-as-service-or-in-an-interactive-s +func IsAnInteractiveSession() (bool, error) { + interSid, err := allocSid(windows.SECURITY_INTERACTIVE_RID) + if err != nil { + return false, err + } + defer windows.FreeSid(interSid) + + serviceSid, err := allocSid(windows.SECURITY_SERVICE_RID) + if err != nil { + return false, err + } + defer windows.FreeSid(serviceSid) + + t, err := windows.OpenCurrentProcessToken() + if err != nil { + return false, err + } + defer t.Close() + + gs, err := t.GetTokenGroups() + if err != nil { + return false, err + } + p := unsafe.Pointer(&gs.Groups[0]) + groups := (*[2 << 20]windows.SIDAndAttributes)(p)[:gs.GroupCount] + for _, g := range groups { + if windows.EqualSid(g.Sid, interSid) { + return true, nil + } + if windows.EqualSid(g.Sid, serviceSid) { + return false, nil + } + } + return false, nil +} diff --git a/api/vendor/golang.org/x/sys/windows/svc/service.go b/api/vendor/golang.org/x/sys/windows/svc/service.go new file mode 100644 index 0000000..cda26b5 --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/svc/service.go @@ -0,0 +1,363 @@ +// 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. + +// +build windows + +// Package svc provides everything required to build Windows service. +// +package svc + +import ( + "errors" + "runtime" + "syscall" + "unsafe" + + "golang.org/x/sys/windows" +) + +// State describes service execution state (Stopped, Running and so on). +type State uint32 + +const ( + Stopped = State(windows.SERVICE_STOPPED) + StartPending = State(windows.SERVICE_START_PENDING) + StopPending = State(windows.SERVICE_STOP_PENDING) + Running = State(windows.SERVICE_RUNNING) + ContinuePending = State(windows.SERVICE_CONTINUE_PENDING) + PausePending = State(windows.SERVICE_PAUSE_PENDING) + Paused = State(windows.SERVICE_PAUSED) +) + +// Cmd represents service state change request. It is sent to a service +// by the service manager, and should be actioned upon by the service. +type Cmd uint32 + +const ( + Stop = Cmd(windows.SERVICE_CONTROL_STOP) + Pause = Cmd(windows.SERVICE_CONTROL_PAUSE) + Continue = Cmd(windows.SERVICE_CONTROL_CONTINUE) + Interrogate = Cmd(windows.SERVICE_CONTROL_INTERROGATE) + Shutdown = Cmd(windows.SERVICE_CONTROL_SHUTDOWN) + ParamChange = Cmd(windows.SERVICE_CONTROL_PARAMCHANGE) + NetBindAdd = Cmd(windows.SERVICE_CONTROL_NETBINDADD) + NetBindRemove = Cmd(windows.SERVICE_CONTROL_NETBINDREMOVE) + NetBindEnable = Cmd(windows.SERVICE_CONTROL_NETBINDENABLE) + NetBindDisable = Cmd(windows.SERVICE_CONTROL_NETBINDDISABLE) + DeviceEvent = Cmd(windows.SERVICE_CONTROL_DEVICEEVENT) + HardwareProfileChange = Cmd(windows.SERVICE_CONTROL_HARDWAREPROFILECHANGE) + PowerEvent = Cmd(windows.SERVICE_CONTROL_POWEREVENT) + SessionChange = Cmd(windows.SERVICE_CONTROL_SESSIONCHANGE) +) + +// Accepted is used to describe commands accepted by the service. +// Note that Interrogate is always accepted. +type Accepted uint32 + +const ( + AcceptStop = Accepted(windows.SERVICE_ACCEPT_STOP) + AcceptShutdown = Accepted(windows.SERVICE_ACCEPT_SHUTDOWN) + AcceptPauseAndContinue = Accepted(windows.SERVICE_ACCEPT_PAUSE_CONTINUE) + AcceptParamChange = Accepted(windows.SERVICE_ACCEPT_PARAMCHANGE) + AcceptNetBindChange = Accepted(windows.SERVICE_ACCEPT_NETBINDCHANGE) + AcceptHardwareProfileChange = Accepted(windows.SERVICE_ACCEPT_HARDWAREPROFILECHANGE) + AcceptPowerEvent = Accepted(windows.SERVICE_ACCEPT_POWEREVENT) + AcceptSessionChange = Accepted(windows.SERVICE_ACCEPT_SESSIONCHANGE) +) + +// Status combines State and Accepted commands to fully describe running service. +type Status struct { + State State + Accepts Accepted + CheckPoint uint32 // used to report progress during a lengthy operation + WaitHint uint32 // estimated time required for a pending operation, in milliseconds +} + +// ChangeRequest is sent to the service Handler to request service status change. +type ChangeRequest struct { + Cmd Cmd + EventType uint32 + EventData uintptr + CurrentStatus Status +} + +// Handler is the interface that must be implemented to build Windows service. +type Handler interface { + + // Execute will be called by the package code at the start of + // the service, and the service will exit once Execute completes. + // Inside Execute you must read service change requests from r and + // act accordingly. You must keep service control manager up to date + // about state of your service by writing into s as required. + // args contains service name followed by argument strings passed + // to the service. + // You can provide service exit code in exitCode return parameter, + // with 0 being "no error". You can also indicate if exit code, + // if any, is service specific or not by using svcSpecificEC + // parameter. + Execute(args []string, r <-chan ChangeRequest, s chan<- Status) (svcSpecificEC bool, exitCode uint32) +} + +var ( + // These are used by asm code. + goWaitsH uintptr + cWaitsH uintptr + ssHandle uintptr + sName *uint16 + sArgc uintptr + sArgv **uint16 + ctlHandlerExProc uintptr + cSetEvent uintptr + cWaitForSingleObject uintptr + cRegisterServiceCtrlHandlerExW uintptr +) + +func init() { + k := syscall.MustLoadDLL("kernel32.dll") + cSetEvent = k.MustFindProc("SetEvent").Addr() + cWaitForSingleObject = k.MustFindProc("WaitForSingleObject").Addr() + a := syscall.MustLoadDLL("advapi32.dll") + cRegisterServiceCtrlHandlerExW = a.MustFindProc("RegisterServiceCtrlHandlerExW").Addr() +} + +// The HandlerEx prototype also has a context pointer but since we don't use +// it at start-up time we don't have to pass it over either. +type ctlEvent struct { + cmd Cmd + eventType uint32 + eventData uintptr + errno uint32 +} + +// service provides access to windows service api. +type service struct { + name string + h windows.Handle + cWaits *event + goWaits *event + c chan ctlEvent + handler Handler +} + +func newService(name string, handler Handler) (*service, error) { + var s service + var err error + s.name = name + s.c = make(chan ctlEvent) + s.handler = handler + s.cWaits, err = newEvent() + if err != nil { + return nil, err + } + s.goWaits, err = newEvent() + if err != nil { + s.cWaits.Close() + return nil, err + } + return &s, nil +} + +func (s *service) close() error { + s.cWaits.Close() + s.goWaits.Close() + return nil +} + +type exitCode struct { + isSvcSpecific bool + errno uint32 +} + +func (s *service) updateStatus(status *Status, ec *exitCode) error { + if s.h == 0 { + return errors.New("updateStatus with no service status handle") + } + var t windows.SERVICE_STATUS + t.ServiceType = windows.SERVICE_WIN32_OWN_PROCESS + t.CurrentState = uint32(status.State) + if status.Accepts&AcceptStop != 0 { + t.ControlsAccepted |= windows.SERVICE_ACCEPT_STOP + } + if status.Accepts&AcceptShutdown != 0 { + t.ControlsAccepted |= windows.SERVICE_ACCEPT_SHUTDOWN + } + if status.Accepts&AcceptPauseAndContinue != 0 { + t.ControlsAccepted |= windows.SERVICE_ACCEPT_PAUSE_CONTINUE + } + if status.Accepts&AcceptParamChange != 0 { + t.ControlsAccepted |= windows.SERVICE_ACCEPT_PARAMCHANGE + } + if status.Accepts&AcceptNetBindChange != 0 { + t.ControlsAccepted |= windows.SERVICE_ACCEPT_NETBINDCHANGE + } + if status.Accepts&AcceptHardwareProfileChange != 0 { + t.ControlsAccepted |= windows.SERVICE_ACCEPT_HARDWAREPROFILECHANGE + } + if status.Accepts&AcceptPowerEvent != 0 { + t.ControlsAccepted |= windows.SERVICE_ACCEPT_POWEREVENT + } + if status.Accepts&AcceptSessionChange != 0 { + t.ControlsAccepted |= windows.SERVICE_ACCEPT_SESSIONCHANGE + } + if ec.errno == 0 { + t.Win32ExitCode = windows.NO_ERROR + t.ServiceSpecificExitCode = windows.NO_ERROR + } else if ec.isSvcSpecific { + t.Win32ExitCode = uint32(windows.ERROR_SERVICE_SPECIFIC_ERROR) + t.ServiceSpecificExitCode = ec.errno + } else { + t.Win32ExitCode = ec.errno + t.ServiceSpecificExitCode = windows.NO_ERROR + } + t.CheckPoint = status.CheckPoint + t.WaitHint = status.WaitHint + return windows.SetServiceStatus(s.h, &t) +} + +const ( + sysErrSetServiceStatusFailed = uint32(syscall.APPLICATION_ERROR) + iota + sysErrNewThreadInCallback +) + +func (s *service) run() { + s.goWaits.Wait() + s.h = windows.Handle(ssHandle) + argv := (*[100]*int16)(unsafe.Pointer(sArgv))[:sArgc] + args := make([]string, len(argv)) + for i, a := range argv { + args[i] = syscall.UTF16ToString((*[1 << 20]uint16)(unsafe.Pointer(a))[:]) + } + + cmdsToHandler := make(chan ChangeRequest) + changesFromHandler := make(chan Status) + exitFromHandler := make(chan exitCode) + + go func() { + ss, errno := s.handler.Execute(args, cmdsToHandler, changesFromHandler) + exitFromHandler <- exitCode{ss, errno} + }() + + status := Status{State: Stopped} + ec := exitCode{isSvcSpecific: true, errno: 0} + var outch chan ChangeRequest + inch := s.c + var cmd Cmd + var evtype uint32 + var evdata uintptr +loop: + for { + select { + case r := <-inch: + if r.errno != 0 { + ec.errno = r.errno + break loop + } + inch = nil + outch = cmdsToHandler + cmd = r.cmd + evtype = r.eventType + evdata = r.eventData + case outch <- ChangeRequest{cmd, evtype, evdata, status}: + inch = s.c + outch = nil + case c := <-changesFromHandler: + err := s.updateStatus(&c, &ec) + if err != nil { + // best suitable error number + ec.errno = sysErrSetServiceStatusFailed + if err2, ok := err.(syscall.Errno); ok { + ec.errno = uint32(err2) + } + break loop + } + status = c + case ec = <-exitFromHandler: + break loop + } + } + + s.updateStatus(&Status{State: Stopped}, &ec) + s.cWaits.Set() +} + +func newCallback(fn interface{}) (cb uintptr, err error) { + defer func() { + r := recover() + if r == nil { + return + } + cb = 0 + switch v := r.(type) { + case string: + err = errors.New(v) + case error: + err = v + default: + err = errors.New("unexpected panic in syscall.NewCallback") + } + }() + return syscall.NewCallback(fn), nil +} + +// BUG(brainman): There is no mechanism to run multiple services +// inside one single executable. Perhaps, it can be overcome by +// using RegisterServiceCtrlHandlerEx Windows api. + +// Run executes service name by calling appropriate handler function. +func Run(name string, handler Handler) error { + runtime.LockOSThread() + + tid := windows.GetCurrentThreadId() + + s, err := newService(name, handler) + if err != nil { + return err + } + + ctlHandler := func(ctl uint32, evtype uint32, evdata uintptr, context uintptr) uintptr { + e := ctlEvent{cmd: Cmd(ctl), eventType: evtype, eventData: evdata} + // We assume that this callback function is running on + // the same thread as Run. Nowhere in MS documentation + // I could find statement to guarantee that. So putting + // check here to verify, otherwise things will go bad + // quickly, if ignored. + i := windows.GetCurrentThreadId() + if i != tid { + e.errno = sysErrNewThreadInCallback + } + s.c <- e + // Always return NO_ERROR (0) for now. + return 0 + } + + var svcmain uintptr + getServiceMain(&svcmain) + t := []windows.SERVICE_TABLE_ENTRY{ + {ServiceName: syscall.StringToUTF16Ptr(s.name), ServiceProc: svcmain}, + {ServiceName: nil, ServiceProc: 0}, + } + + goWaitsH = uintptr(s.goWaits.h) + cWaitsH = uintptr(s.cWaits.h) + sName = t[0].ServiceName + ctlHandlerExProc, err = newCallback(ctlHandler) + if err != nil { + return err + } + + go s.run() + + err = windows.StartServiceCtrlDispatcher(&t[0]) + if err != nil { + return err + } + return nil +} + +// StatusHandle returns service status handle. It is safe to call this function +// from inside the Handler.Execute because then it is guaranteed to be set. +// This code will have to change once multiple services are possible per process. +func StatusHandle() windows.Handle { + return windows.Handle(ssHandle) +} diff --git a/api/vendor/golang.org/x/sys/windows/svc/svc_test.go b/api/vendor/golang.org/x/sys/windows/svc/svc_test.go new file mode 100644 index 0000000..60eb447 --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/svc/svc_test.go @@ -0,0 +1,135 @@ +// 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. + +// +build windows + +package svc_test + +import ( + "fmt" + "io/ioutil" + "math/rand" + "os" + "os/exec" + "path/filepath" + "strings" + "testing" + "time" + + "golang.org/x/sys/windows/svc" + "golang.org/x/sys/windows/svc/mgr" +) + +func getState(t *testing.T, s *mgr.Service) svc.State { + status, err := s.Query() + if err != nil { + t.Fatalf("Query(%s) failed: %s", s.Name, err) + } + return status.State +} + +func testState(t *testing.T, s *mgr.Service, want svc.State) { + have := getState(t, s) + if have != want { + t.Fatalf("%s state is=%d want=%d", s.Name, have, want) + } +} + +func waitState(t *testing.T, s *mgr.Service, want svc.State) { + for i := 0; ; i++ { + have := getState(t, s) + if have == want { + return + } + if i > 10 { + t.Fatalf("%s state is=%d, waiting timeout", s.Name, have) + } + time.Sleep(300 * time.Millisecond) + } +} + +func TestExample(t *testing.T) { + if testing.Short() { + t.Skip("skipping test in short mode - it modifies system services") + } + + const name = "myservice" + + m, err := mgr.Connect() + if err != nil { + t.Fatalf("SCM connection failed: %s", err) + } + defer m.Disconnect() + + dir, err := ioutil.TempDir("", "svc") + if err != nil { + t.Fatalf("failed to create temp directory: %v", err) + } + defer os.RemoveAll(dir) + + exepath := filepath.Join(dir, "a.exe") + o, err := exec.Command("go", "build", "-o", exepath, "golang.org/x/sys/windows/svc/example").CombinedOutput() + if err != nil { + t.Fatalf("failed to build service program: %v\n%v", err, string(o)) + } + + s, err := m.OpenService(name) + if err == nil { + err = s.Delete() + if err != nil { + s.Close() + t.Fatalf("Delete failed: %s", err) + } + s.Close() + } + s, err = m.CreateService(name, exepath, mgr.Config{DisplayName: "my service"}, "is", "auto-started") + if err != nil { + t.Fatalf("CreateService(%s) failed: %v", name, err) + } + defer s.Close() + + args := []string{"is", "manual-started", fmt.Sprintf("%d", rand.Int())} + + testState(t, s, svc.Stopped) + err = s.Start(args...) + if err != nil { + t.Fatalf("Start(%s) failed: %s", s.Name, err) + } + waitState(t, s, svc.Running) + time.Sleep(1 * time.Second) + + // testing deadlock from issues 4. + _, err = s.Control(svc.Interrogate) + if err != nil { + t.Fatalf("Control(%s) failed: %s", s.Name, err) + } + _, err = s.Control(svc.Interrogate) + if err != nil { + t.Fatalf("Control(%s) failed: %s", s.Name, err) + } + time.Sleep(1 * time.Second) + + _, err = s.Control(svc.Stop) + if err != nil { + t.Fatalf("Control(%s) failed: %s", s.Name, err) + } + waitState(t, s, svc.Stopped) + + err = s.Delete() + if err != nil { + t.Fatalf("Delete failed: %s", err) + } + + cmd := `Get-Eventlog -LogName Application -Newest 100` + + ` | Where Source -eq "myservice"` + + ` | Select -first 10` + + ` | Format-table -HideTableHeaders -property ReplacementStrings` + out, err := exec.Command("powershell", "-Command", cmd).CombinedOutput() + if err != nil { + t.Fatalf("powershell failed: %v\n%v", err, string(out)) + } + if want := strings.Join(append([]string{name}, args...), "-"); !strings.Contains(string(out), want) { + t.Errorf("%q string does not contain %q", string(out), want) + } +} diff --git a/api/vendor/golang.org/x/sys/windows/svc/sys_386.s b/api/vendor/golang.org/x/sys/windows/svc/sys_386.s new file mode 100644 index 0000000..2c82a9d --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/svc/sys_386.s @@ -0,0 +1,68 @@ +// 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. + +// +build windows + +// func servicemain(argc uint32, argv **uint16) +TEXT ·servicemain(SB),7,$0 + MOVL argc+0(FP), AX + MOVL AX, ·sArgc(SB) + MOVL argv+4(FP), AX + MOVL AX, ·sArgv(SB) + + PUSHL BP + PUSHL BX + PUSHL SI + PUSHL DI + + SUBL $12, SP + + MOVL ·sName(SB), AX + MOVL AX, (SP) + MOVL $·servicectlhandler(SB), AX + MOVL AX, 4(SP) + MOVL $0, 8(SP) + MOVL ·cRegisterServiceCtrlHandlerExW(SB), AX + MOVL SP, BP + CALL AX + MOVL BP, SP + CMPL AX, $0 + JE exit + MOVL AX, ·ssHandle(SB) + + MOVL ·goWaitsH(SB), AX + MOVL AX, (SP) + MOVL ·cSetEvent(SB), AX + MOVL SP, BP + CALL AX + MOVL BP, SP + + MOVL ·cWaitsH(SB), AX + MOVL AX, (SP) + MOVL $-1, AX + MOVL AX, 4(SP) + MOVL ·cWaitForSingleObject(SB), AX + MOVL SP, BP + CALL AX + MOVL BP, SP + +exit: + ADDL $12, SP + + POPL DI + POPL SI + POPL BX + POPL BP + + MOVL 0(SP), CX + ADDL $12, SP + JMP CX + +// I do not know why, but this seems to be the only way to call +// ctlHandlerProc on Windows 7. + +// func servicectlhandler(ctl uint32, evtype uint32, evdata uintptr, context uintptr) uintptr { +TEXT ·servicectlhandler(SB),7,$0 + MOVL ·ctlHandlerExProc(SB), CX + JMP CX diff --git a/api/vendor/golang.org/x/sys/windows/svc/sys_amd64.s b/api/vendor/golang.org/x/sys/windows/svc/sys_amd64.s new file mode 100644 index 0000000..bde25e9 --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/svc/sys_amd64.s @@ -0,0 +1,42 @@ +// 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. + +// +build windows + +// func servicemain(argc uint32, argv **uint16) +TEXT ·servicemain(SB),7,$0 + MOVL CX, ·sArgc(SB) + MOVQ DX, ·sArgv(SB) + + SUBQ $32, SP // stack for the first 4 syscall params + + MOVQ ·sName(SB), CX + MOVQ $·servicectlhandler(SB), DX + // BUG(pastarmovj): Figure out a way to pass in context in R8. + MOVQ ·cRegisterServiceCtrlHandlerExW(SB), AX + CALL AX + CMPQ AX, $0 + JE exit + MOVQ AX, ·ssHandle(SB) + + MOVQ ·goWaitsH(SB), CX + MOVQ ·cSetEvent(SB), AX + CALL AX + + MOVQ ·cWaitsH(SB), CX + MOVQ $4294967295, DX + MOVQ ·cWaitForSingleObject(SB), AX + CALL AX + +exit: + ADDQ $32, SP + RET + +// I do not know why, but this seems to be the only way to call +// ctlHandlerProc on Windows 7. + +// func ·servicectlhandler(ctl uint32, evtype uint32, evdata uintptr, context uintptr) uintptr { +TEXT ·servicectlhandler(SB),7,$0 + MOVQ ·ctlHandlerExProc(SB), AX + JMP AX diff --git a/api/vendor/golang.org/x/sys/windows/syscall.go b/api/vendor/golang.org/x/sys/windows/syscall.go new file mode 100644 index 0000000..af828a9 --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/syscall.go @@ -0,0 +1,74 @@ +// 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. + +// +build windows + +// Package windows contains an interface to the low-level operating system +// primitives. OS details vary depending on the underlying system, and +// by default, godoc will display the OS-specific documentation for the current +// system. If you want godoc to display syscall documentation for another +// system, set $GOOS and $GOARCH to the desired system. For example, if +// you want to view documentation for freebsd/arm on linux/amd64, set $GOOS +// to freebsd and $GOARCH to arm. +// +// The primary use of this package is inside other packages that provide a more +// portable interface to the system, such as "os", "time" and "net". Use +// those packages rather than this one if you can. +// +// For details of the functions and data types in this package consult +// the manuals for the appropriate operating system. +// +// These calls return err == nil to indicate success; otherwise +// err represents an operating system error describing the failure and +// holds a value of type syscall.Errno. +package windows // import "golang.org/x/sys/windows" + +import ( + "syscall" +) + +// ByteSliceFromString returns a NUL-terminated slice of bytes +// containing the text of s. If s contains a NUL byte at any +// location, it returns (nil, syscall.EINVAL). +func ByteSliceFromString(s string) ([]byte, error) { + for i := 0; i < len(s); i++ { + if s[i] == 0 { + return nil, syscall.EINVAL + } + } + a := make([]byte, len(s)+1) + copy(a, s) + return a, nil +} + +// BytePtrFromString returns a pointer to a NUL-terminated array of +// bytes containing the text of s. If s contains a NUL byte at any +// location, it returns (nil, syscall.EINVAL). +func BytePtrFromString(s string) (*byte, error) { + a, err := ByteSliceFromString(s) + if err != nil { + return nil, err + } + return &a[0], nil +} + +// Single-word zero for use when we need a valid pointer to 0 bytes. +// See mksyscall.pl. +var _zero uintptr + +func (ts *Timespec) Unix() (sec int64, nsec int64) { + return int64(ts.Sec), int64(ts.Nsec) +} + +func (tv *Timeval) Unix() (sec int64, nsec int64) { + return int64(tv.Sec), int64(tv.Usec) * 1000 +} + +func (ts *Timespec) Nano() int64 { + return int64(ts.Sec)*1e9 + int64(ts.Nsec) +} + +func (tv *Timeval) Nano() int64 { + return int64(tv.Sec)*1e9 + int64(tv.Usec)*1000 +} diff --git a/api/vendor/golang.org/x/sys/windows/syscall_test.go b/api/vendor/golang.org/x/sys/windows/syscall_test.go new file mode 100644 index 0000000..d7009e4 --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/syscall_test.go @@ -0,0 +1,53 @@ +// 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. + +// +build windows + +package windows_test + +import ( + "syscall" + "testing" + + "golang.org/x/sys/windows" +) + +func testSetGetenv(t *testing.T, key, value string) { + err := windows.Setenv(key, value) + if err != nil { + t.Fatalf("Setenv failed to set %q: %v", value, err) + } + newvalue, found := windows.Getenv(key) + if !found { + t.Fatalf("Getenv failed to find %v variable (want value %q)", key, value) + } + if newvalue != value { + t.Fatalf("Getenv(%v) = %q; want %q", key, newvalue, value) + } +} + +func TestEnv(t *testing.T) { + testSetGetenv(t, "TESTENV", "AVALUE") + // make sure TESTENV gets set to "", not deleted + testSetGetenv(t, "TESTENV", "") +} + +func TestGetProcAddressByOrdinal(t *testing.T) { + // Attempt calling shlwapi.dll:IsOS, resolving it by ordinal, as + // suggested in + // https://msdn.microsoft.com/en-us/library/windows/desktop/bb773795.aspx + h, err := windows.LoadLibrary("shlwapi.dll") + if err != nil { + t.Fatalf("Failed to load shlwapi.dll: %s", err) + } + procIsOS, err := windows.GetProcAddressByOrdinal(h, 437) + if err != nil { + t.Fatalf("Could not find shlwapi.dll:IsOS by ordinal: %s", err) + } + const OS_NT = 1 + r, _, _ := syscall.Syscall(procIsOS, 1, OS_NT, 0, 0) + if r == 0 { + t.Error("shlwapi.dll:IsOS(OS_NT) returned 0, expected non-zero value") + } +} diff --git a/api/vendor/golang.org/x/sys/windows/syscall_windows.go b/api/vendor/golang.org/x/sys/windows/syscall_windows.go new file mode 100644 index 0000000..1e9f4bb --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/syscall_windows.go @@ -0,0 +1,1153 @@ +// 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. + +// Windows system calls. + +package windows + +import ( + errorspkg "errors" + "sync" + "syscall" + "unicode/utf16" + "unsafe" +) + +type Handle uintptr + +const ( + InvalidHandle = ^Handle(0) + + // Flags for DefineDosDevice. + DDD_EXACT_MATCH_ON_REMOVE = 0x00000004 + DDD_NO_BROADCAST_SYSTEM = 0x00000008 + DDD_RAW_TARGET_PATH = 0x00000001 + DDD_REMOVE_DEFINITION = 0x00000002 + + // Return values for GetDriveType. + DRIVE_UNKNOWN = 0 + DRIVE_NO_ROOT_DIR = 1 + DRIVE_REMOVABLE = 2 + DRIVE_FIXED = 3 + DRIVE_REMOTE = 4 + DRIVE_CDROM = 5 + DRIVE_RAMDISK = 6 + + // File system flags from GetVolumeInformation and GetVolumeInformationByHandle. + FILE_CASE_SENSITIVE_SEARCH = 0x00000001 + FILE_CASE_PRESERVED_NAMES = 0x00000002 + FILE_FILE_COMPRESSION = 0x00000010 + FILE_DAX_VOLUME = 0x20000000 + FILE_NAMED_STREAMS = 0x00040000 + FILE_PERSISTENT_ACLS = 0x00000008 + FILE_READ_ONLY_VOLUME = 0x00080000 + FILE_SEQUENTIAL_WRITE_ONCE = 0x00100000 + FILE_SUPPORTS_ENCRYPTION = 0x00020000 + FILE_SUPPORTS_EXTENDED_ATTRIBUTES = 0x00800000 + FILE_SUPPORTS_HARD_LINKS = 0x00400000 + FILE_SUPPORTS_OBJECT_IDS = 0x00010000 + FILE_SUPPORTS_OPEN_BY_FILE_ID = 0x01000000 + FILE_SUPPORTS_REPARSE_POINTS = 0x00000080 + FILE_SUPPORTS_SPARSE_FILES = 0x00000040 + FILE_SUPPORTS_TRANSACTIONS = 0x00200000 + FILE_SUPPORTS_USN_JOURNAL = 0x02000000 + FILE_UNICODE_ON_DISK = 0x00000004 + FILE_VOLUME_IS_COMPRESSED = 0x00008000 + FILE_VOLUME_QUOTAS = 0x00000020 +) + +// StringToUTF16 is deprecated. Use UTF16FromString instead. +// If s contains a NUL byte this function panics instead of +// returning an error. +func StringToUTF16(s string) []uint16 { + a, err := UTF16FromString(s) + if err != nil { + panic("windows: string with NUL passed to StringToUTF16") + } + return a +} + +// UTF16FromString returns the UTF-16 encoding of the UTF-8 string +// s, with a terminating NUL added. If s contains a NUL byte at any +// location, it returns (nil, syscall.EINVAL). +func UTF16FromString(s string) ([]uint16, error) { + for i := 0; i < len(s); i++ { + if s[i] == 0 { + return nil, syscall.EINVAL + } + } + return utf16.Encode([]rune(s + "\x00")), nil +} + +// UTF16ToString returns the UTF-8 encoding of the UTF-16 sequence s, +// with a terminating NUL removed. +func UTF16ToString(s []uint16) string { + for i, v := range s { + if v == 0 { + s = s[0:i] + break + } + } + return string(utf16.Decode(s)) +} + +// StringToUTF16Ptr is deprecated. Use UTF16PtrFromString instead. +// If s contains a NUL byte this function panics instead of +// returning an error. +func StringToUTF16Ptr(s string) *uint16 { return &StringToUTF16(s)[0] } + +// UTF16PtrFromString returns pointer to the UTF-16 encoding of +// the UTF-8 string s, with a terminating NUL added. If s +// contains a NUL byte at any location, it returns (nil, syscall.EINVAL). +func UTF16PtrFromString(s string) (*uint16, error) { + a, err := UTF16FromString(s) + if err != nil { + return nil, err + } + return &a[0], nil +} + +func Getpagesize() int { return 4096 } + +// NewCallback converts a Go function to a function pointer conforming to the stdcall calling convention. +// This is useful when interoperating with Windows code requiring callbacks. +func NewCallback(fn interface{}) uintptr { + return syscall.NewCallback(fn) +} + +// NewCallbackCDecl converts a Go function to a function pointer conforming to the cdecl calling convention. +// This is useful when interoperating with Windows code requiring callbacks. +func NewCallbackCDecl(fn interface{}) uintptr { + return syscall.NewCallbackCDecl(fn) +} + +// windows api calls + +//sys GetLastError() (lasterr error) +//sys LoadLibrary(libname string) (handle Handle, err error) = LoadLibraryW +//sys LoadLibraryEx(libname string, zero Handle, flags uintptr) (handle Handle, err error) = LoadLibraryExW +//sys FreeLibrary(handle Handle) (err error) +//sys GetProcAddress(module Handle, procname string) (proc uintptr, err error) +//sys GetVersion() (ver uint32, err error) +//sys FormatMessage(flags uint32, msgsrc uintptr, msgid uint32, langid uint32, buf []uint16, args *byte) (n uint32, err error) = FormatMessageW +//sys ExitProcess(exitcode uint32) +//sys CreateFile(name *uint16, access uint32, mode uint32, sa *SecurityAttributes, createmode uint32, attrs uint32, templatefile int32) (handle Handle, err error) [failretval==InvalidHandle] = CreateFileW +//sys ReadFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) +//sys WriteFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) +//sys SetFilePointer(handle Handle, lowoffset int32, highoffsetptr *int32, whence uint32) (newlowoffset uint32, err error) [failretval==0xffffffff] +//sys CloseHandle(handle Handle) (err error) +//sys GetStdHandle(stdhandle uint32) (handle Handle, err error) [failretval==InvalidHandle] +//sys SetStdHandle(stdhandle uint32, handle Handle) (err error) +//sys findFirstFile1(name *uint16, data *win32finddata1) (handle Handle, err error) [failretval==InvalidHandle] = FindFirstFileW +//sys findNextFile1(handle Handle, data *win32finddata1) (err error) = FindNextFileW +//sys FindClose(handle Handle) (err error) +//sys GetFileInformationByHandle(handle Handle, data *ByHandleFileInformation) (err error) +//sys GetCurrentDirectory(buflen uint32, buf *uint16) (n uint32, err error) = GetCurrentDirectoryW +//sys SetCurrentDirectory(path *uint16) (err error) = SetCurrentDirectoryW +//sys CreateDirectory(path *uint16, sa *SecurityAttributes) (err error) = CreateDirectoryW +//sys RemoveDirectory(path *uint16) (err error) = RemoveDirectoryW +//sys DeleteFile(path *uint16) (err error) = DeleteFileW +//sys MoveFile(from *uint16, to *uint16) (err error) = MoveFileW +//sys MoveFileEx(from *uint16, to *uint16, flags uint32) (err error) = MoveFileExW +//sys GetComputerName(buf *uint16, n *uint32) (err error) = GetComputerNameW +//sys GetComputerNameEx(nametype uint32, buf *uint16, n *uint32) (err error) = GetComputerNameExW +//sys SetEndOfFile(handle Handle) (err error) +//sys GetSystemTimeAsFileTime(time *Filetime) +//sys GetSystemTimePreciseAsFileTime(time *Filetime) +//sys GetTimeZoneInformation(tzi *Timezoneinformation) (rc uint32, err error) [failretval==0xffffffff] +//sys CreateIoCompletionPort(filehandle Handle, cphandle Handle, key uint32, threadcnt uint32) (handle Handle, err error) +//sys GetQueuedCompletionStatus(cphandle Handle, qty *uint32, key *uint32, overlapped **Overlapped, timeout uint32) (err error) +//sys PostQueuedCompletionStatus(cphandle Handle, qty uint32, key uint32, overlapped *Overlapped) (err error) +//sys CancelIo(s Handle) (err error) +//sys CancelIoEx(s Handle, o *Overlapped) (err error) +//sys CreateProcess(appName *uint16, commandLine *uint16, procSecurity *SecurityAttributes, threadSecurity *SecurityAttributes, inheritHandles bool, creationFlags uint32, env *uint16, currentDir *uint16, startupInfo *StartupInfo, outProcInfo *ProcessInformation) (err error) = CreateProcessW +//sys OpenProcess(da uint32, inheritHandle bool, pid uint32) (handle Handle, err error) +//sys TerminateProcess(handle Handle, exitcode uint32) (err error) +//sys GetExitCodeProcess(handle Handle, exitcode *uint32) (err error) +//sys GetStartupInfo(startupInfo *StartupInfo) (err error) = GetStartupInfoW +//sys GetCurrentProcess() (pseudoHandle Handle, err error) +//sys GetProcessTimes(handle Handle, creationTime *Filetime, exitTime *Filetime, kernelTime *Filetime, userTime *Filetime) (err error) +//sys DuplicateHandle(hSourceProcessHandle Handle, hSourceHandle Handle, hTargetProcessHandle Handle, lpTargetHandle *Handle, dwDesiredAccess uint32, bInheritHandle bool, dwOptions uint32) (err error) +//sys WaitForSingleObject(handle Handle, waitMilliseconds uint32) (event uint32, err error) [failretval==0xffffffff] +//sys GetTempPath(buflen uint32, buf *uint16) (n uint32, err error) = GetTempPathW +//sys CreatePipe(readhandle *Handle, writehandle *Handle, sa *SecurityAttributes, size uint32) (err error) +//sys GetFileType(filehandle Handle) (n uint32, err error) +//sys CryptAcquireContext(provhandle *Handle, container *uint16, provider *uint16, provtype uint32, flags uint32) (err error) = advapi32.CryptAcquireContextW +//sys CryptReleaseContext(provhandle Handle, flags uint32) (err error) = advapi32.CryptReleaseContext +//sys CryptGenRandom(provhandle Handle, buflen uint32, buf *byte) (err error) = advapi32.CryptGenRandom +//sys GetEnvironmentStrings() (envs *uint16, err error) [failretval==nil] = kernel32.GetEnvironmentStringsW +//sys FreeEnvironmentStrings(envs *uint16) (err error) = kernel32.FreeEnvironmentStringsW +//sys GetEnvironmentVariable(name *uint16, buffer *uint16, size uint32) (n uint32, err error) = kernel32.GetEnvironmentVariableW +//sys SetEnvironmentVariable(name *uint16, value *uint16) (err error) = kernel32.SetEnvironmentVariableW +//sys SetFileTime(handle Handle, ctime *Filetime, atime *Filetime, wtime *Filetime) (err error) +//sys GetFileAttributes(name *uint16) (attrs uint32, err error) [failretval==INVALID_FILE_ATTRIBUTES] = kernel32.GetFileAttributesW +//sys SetFileAttributes(name *uint16, attrs uint32) (err error) = kernel32.SetFileAttributesW +//sys GetFileAttributesEx(name *uint16, level uint32, info *byte) (err error) = kernel32.GetFileAttributesExW +//sys GetCommandLine() (cmd *uint16) = kernel32.GetCommandLineW +//sys CommandLineToArgv(cmd *uint16, argc *int32) (argv *[8192]*[8192]uint16, err error) [failretval==nil] = shell32.CommandLineToArgvW +//sys LocalFree(hmem Handle) (handle Handle, err error) [failretval!=0] +//sys SetHandleInformation(handle Handle, mask uint32, flags uint32) (err error) +//sys FlushFileBuffers(handle Handle) (err error) +//sys GetFullPathName(path *uint16, buflen uint32, buf *uint16, fname **uint16) (n uint32, err error) = kernel32.GetFullPathNameW +//sys GetLongPathName(path *uint16, buf *uint16, buflen uint32) (n uint32, err error) = kernel32.GetLongPathNameW +//sys GetShortPathName(longpath *uint16, shortpath *uint16, buflen uint32) (n uint32, err error) = kernel32.GetShortPathNameW +//sys CreateFileMapping(fhandle Handle, sa *SecurityAttributes, prot uint32, maxSizeHigh uint32, maxSizeLow uint32, name *uint16) (handle Handle, err error) = kernel32.CreateFileMappingW +//sys MapViewOfFile(handle Handle, access uint32, offsetHigh uint32, offsetLow uint32, length uintptr) (addr uintptr, err error) +//sys UnmapViewOfFile(addr uintptr) (err error) +//sys FlushViewOfFile(addr uintptr, length uintptr) (err error) +//sys VirtualLock(addr uintptr, length uintptr) (err error) +//sys VirtualUnlock(addr uintptr, length uintptr) (err error) +//sys VirtualAlloc(address uintptr, size uintptr, alloctype uint32, protect uint32) (value uintptr, err error) = kernel32.VirtualAlloc +//sys VirtualFree(address uintptr, size uintptr, freetype uint32) (err error) = kernel32.VirtualFree +//sys VirtualProtect(address uintptr, size uintptr, newprotect uint32, oldprotect *uint32) (err error) = kernel32.VirtualProtect +//sys TransmitFile(s Handle, handle Handle, bytesToWrite uint32, bytsPerSend uint32, overlapped *Overlapped, transmitFileBuf *TransmitFileBuffers, flags uint32) (err error) = mswsock.TransmitFile +//sys ReadDirectoryChanges(handle Handle, buf *byte, buflen uint32, watchSubTree bool, mask uint32, retlen *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) = kernel32.ReadDirectoryChangesW +//sys CertOpenSystemStore(hprov Handle, name *uint16) (store Handle, err error) = crypt32.CertOpenSystemStoreW +//sys CertOpenStore(storeProvider uintptr, msgAndCertEncodingType uint32, cryptProv uintptr, flags uint32, para uintptr) (handle Handle, err error) [failretval==InvalidHandle] = crypt32.CertOpenStore +//sys CertEnumCertificatesInStore(store Handle, prevContext *CertContext) (context *CertContext, err error) [failretval==nil] = crypt32.CertEnumCertificatesInStore +//sys CertAddCertificateContextToStore(store Handle, certContext *CertContext, addDisposition uint32, storeContext **CertContext) (err error) = crypt32.CertAddCertificateContextToStore +//sys CertCloseStore(store Handle, flags uint32) (err error) = crypt32.CertCloseStore +//sys CertGetCertificateChain(engine Handle, leaf *CertContext, time *Filetime, additionalStore Handle, para *CertChainPara, flags uint32, reserved uintptr, chainCtx **CertChainContext) (err error) = crypt32.CertGetCertificateChain +//sys CertFreeCertificateChain(ctx *CertChainContext) = crypt32.CertFreeCertificateChain +//sys CertCreateCertificateContext(certEncodingType uint32, certEncoded *byte, encodedLen uint32) (context *CertContext, err error) [failretval==nil] = crypt32.CertCreateCertificateContext +//sys CertFreeCertificateContext(ctx *CertContext) (err error) = crypt32.CertFreeCertificateContext +//sys CertVerifyCertificateChainPolicy(policyOID uintptr, chain *CertChainContext, para *CertChainPolicyPara, status *CertChainPolicyStatus) (err error) = crypt32.CertVerifyCertificateChainPolicy +//sys RegOpenKeyEx(key Handle, subkey *uint16, options uint32, desiredAccess uint32, result *Handle) (regerrno error) = advapi32.RegOpenKeyExW +//sys RegCloseKey(key Handle) (regerrno error) = advapi32.RegCloseKey +//sys RegQueryInfoKey(key Handle, class *uint16, classLen *uint32, reserved *uint32, subkeysLen *uint32, maxSubkeyLen *uint32, maxClassLen *uint32, valuesLen *uint32, maxValueNameLen *uint32, maxValueLen *uint32, saLen *uint32, lastWriteTime *Filetime) (regerrno error) = advapi32.RegQueryInfoKeyW +//sys RegEnumKeyEx(key Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, class *uint16, classLen *uint32, lastWriteTime *Filetime) (regerrno error) = advapi32.RegEnumKeyExW +//sys RegQueryValueEx(key Handle, name *uint16, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) = advapi32.RegQueryValueExW +//sys getCurrentProcessId() (pid uint32) = kernel32.GetCurrentProcessId +//sys GetConsoleMode(console Handle, mode *uint32) (err error) = kernel32.GetConsoleMode +//sys SetConsoleMode(console Handle, mode uint32) (err error) = kernel32.SetConsoleMode +//sys GetConsoleScreenBufferInfo(console Handle, info *ConsoleScreenBufferInfo) (err error) = kernel32.GetConsoleScreenBufferInfo +//sys WriteConsole(console Handle, buf *uint16, towrite uint32, written *uint32, reserved *byte) (err error) = kernel32.WriteConsoleW +//sys ReadConsole(console Handle, buf *uint16, toread uint32, read *uint32, inputControl *byte) (err error) = kernel32.ReadConsoleW +//sys CreateToolhelp32Snapshot(flags uint32, processId uint32) (handle Handle, err error) [failretval==InvalidHandle] = kernel32.CreateToolhelp32Snapshot +//sys Process32First(snapshot Handle, procEntry *ProcessEntry32) (err error) = kernel32.Process32FirstW +//sys Process32Next(snapshot Handle, procEntry *ProcessEntry32) (err error) = kernel32.Process32NextW +//sys DeviceIoControl(handle Handle, ioControlCode uint32, inBuffer *byte, inBufferSize uint32, outBuffer *byte, outBufferSize uint32, bytesReturned *uint32, overlapped *Overlapped) (err error) +// This function returns 1 byte BOOLEAN rather than the 4 byte BOOL. +//sys CreateSymbolicLink(symlinkfilename *uint16, targetfilename *uint16, flags uint32) (err error) [failretval&0xff==0] = CreateSymbolicLinkW +//sys CreateHardLink(filename *uint16, existingfilename *uint16, reserved uintptr) (err error) [failretval&0xff==0] = CreateHardLinkW +//sys GetCurrentThreadId() (id uint32) +//sys CreateEvent(eventAttrs *SecurityAttributes, manualReset uint32, initialState uint32, name *uint16) (handle Handle, err error) = kernel32.CreateEventW +//sys CreateEventEx(eventAttrs *SecurityAttributes, name *uint16, flags uint32, desiredAccess uint32) (handle Handle, err error) = kernel32.CreateEventExW +//sys OpenEvent(desiredAccess uint32, inheritHandle bool, name *uint16) (handle Handle, err error) = kernel32.OpenEventW +//sys SetEvent(event Handle) (err error) = kernel32.SetEvent +//sys ResetEvent(event Handle) (err error) = kernel32.ResetEvent +//sys PulseEvent(event Handle) (err error) = kernel32.PulseEvent + +// Volume Management Functions +//sys DefineDosDevice(flags uint32, deviceName *uint16, targetPath *uint16) (err error) = DefineDosDeviceW +//sys DeleteVolumeMountPoint(volumeMountPoint *uint16) (err error) = DeleteVolumeMountPointW +//sys FindFirstVolume(volumeName *uint16, bufferLength uint32) (handle Handle, err error) [failretval==InvalidHandle] = FindFirstVolumeW +//sys FindFirstVolumeMountPoint(rootPathName *uint16, volumeMountPoint *uint16, bufferLength uint32) (handle Handle, err error) [failretval==InvalidHandle] = FindFirstVolumeMountPointW +//sys FindNextVolume(findVolume Handle, volumeName *uint16, bufferLength uint32) (err error) = FindNextVolumeW +//sys FindNextVolumeMountPoint(findVolumeMountPoint Handle, volumeMountPoint *uint16, bufferLength uint32) (err error) = FindNextVolumeMountPointW +//sys FindVolumeClose(findVolume Handle) (err error) +//sys FindVolumeMountPointClose(findVolumeMountPoint Handle) (err error) +//sys GetDriveType(rootPathName *uint16) (driveType uint32) = GetDriveTypeW +//sys GetLogicalDrives() (drivesBitMask uint32, err error) [failretval==0] +//sys GetLogicalDriveStrings(bufferLength uint32, buffer *uint16) (n uint32, err error) [failretval==0] = GetLogicalDriveStringsW +//sys GetVolumeInformation(rootPathName *uint16, volumeNameBuffer *uint16, volumeNameSize uint32, volumeNameSerialNumber *uint32, maximumComponentLength *uint32, fileSystemFlags *uint32, fileSystemNameBuffer *uint16, fileSystemNameSize uint32) (err error) = GetVolumeInformationW +//sys GetVolumeInformationByHandle(file Handle, volumeNameBuffer *uint16, volumeNameSize uint32, volumeNameSerialNumber *uint32, maximumComponentLength *uint32, fileSystemFlags *uint32, fileSystemNameBuffer *uint16, fileSystemNameSize uint32) (err error) = GetVolumeInformationByHandleW +//sys GetVolumeNameForVolumeMountPoint(volumeMountPoint *uint16, volumeName *uint16, bufferlength uint32) (err error) = GetVolumeNameForVolumeMountPointW +//sys GetVolumePathName(fileName *uint16, volumePathName *uint16, bufferLength uint32) (err error) = GetVolumePathNameW +//sys GetVolumePathNamesForVolumeName(volumeName *uint16, volumePathNames *uint16, bufferLength uint32, returnLength *uint32) (err error) = GetVolumePathNamesForVolumeNameW +//sys QueryDosDevice(deviceName *uint16, targetPath *uint16, max uint32) (n uint32, err error) [failretval==0] = QueryDosDeviceW +//sys SetVolumeLabel(rootPathName *uint16, volumeName *uint16) (err error) = SetVolumeLabelW +//sys SetVolumeMountPoint(volumeMountPoint *uint16, volumeName *uint16) (err error) = SetVolumeMountPointW + +// syscall interface implementation for other packages + +// GetProcAddressByOrdinal retrieves the address of the exported +// function from module by ordinal. +func GetProcAddressByOrdinal(module Handle, ordinal uintptr) (proc uintptr, err error) { + r0, _, e1 := syscall.Syscall(procGetProcAddress.Addr(), 2, uintptr(module), ordinal, 0) + proc = uintptr(r0) + if proc == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func Exit(code int) { ExitProcess(uint32(code)) } + +func makeInheritSa() *SecurityAttributes { + var sa SecurityAttributes + sa.Length = uint32(unsafe.Sizeof(sa)) + sa.InheritHandle = 1 + return &sa +} + +func Open(path string, mode int, perm uint32) (fd Handle, err error) { + if len(path) == 0 { + return InvalidHandle, ERROR_FILE_NOT_FOUND + } + pathp, err := UTF16PtrFromString(path) + if err != nil { + return InvalidHandle, err + } + var access uint32 + switch mode & (O_RDONLY | O_WRONLY | O_RDWR) { + case O_RDONLY: + access = GENERIC_READ + case O_WRONLY: + access = GENERIC_WRITE + case O_RDWR: + access = GENERIC_READ | GENERIC_WRITE + } + if mode&O_CREAT != 0 { + access |= GENERIC_WRITE + } + if mode&O_APPEND != 0 { + access &^= GENERIC_WRITE + access |= FILE_APPEND_DATA + } + sharemode := uint32(FILE_SHARE_READ | FILE_SHARE_WRITE) + var sa *SecurityAttributes + if mode&O_CLOEXEC == 0 { + sa = makeInheritSa() + } + var createmode uint32 + switch { + case mode&(O_CREAT|O_EXCL) == (O_CREAT | O_EXCL): + createmode = CREATE_NEW + case mode&(O_CREAT|O_TRUNC) == (O_CREAT | O_TRUNC): + createmode = CREATE_ALWAYS + case mode&O_CREAT == O_CREAT: + createmode = OPEN_ALWAYS + case mode&O_TRUNC == O_TRUNC: + createmode = TRUNCATE_EXISTING + default: + createmode = OPEN_EXISTING + } + h, e := CreateFile(pathp, access, sharemode, sa, createmode, FILE_ATTRIBUTE_NORMAL, 0) + return h, e +} + +func Read(fd Handle, p []byte) (n int, err error) { + var done uint32 + e := ReadFile(fd, p, &done, nil) + if e != nil { + if e == ERROR_BROKEN_PIPE { + // NOTE(brainman): work around ERROR_BROKEN_PIPE is returned on reading EOF from stdin + return 0, nil + } + return 0, e + } + if raceenabled { + if done > 0 { + raceWriteRange(unsafe.Pointer(&p[0]), int(done)) + } + raceAcquire(unsafe.Pointer(&ioSync)) + } + return int(done), nil +} + +func Write(fd Handle, p []byte) (n int, err error) { + if raceenabled { + raceReleaseMerge(unsafe.Pointer(&ioSync)) + } + var done uint32 + e := WriteFile(fd, p, &done, nil) + if e != nil { + return 0, e + } + if raceenabled && done > 0 { + raceReadRange(unsafe.Pointer(&p[0]), int(done)) + } + return int(done), nil +} + +var ioSync int64 + +func Seek(fd Handle, offset int64, whence int) (newoffset int64, err error) { + var w uint32 + switch whence { + case 0: + w = FILE_BEGIN + case 1: + w = FILE_CURRENT + case 2: + w = FILE_END + } + hi := int32(offset >> 32) + lo := int32(offset) + // use GetFileType to check pipe, pipe can't do seek + ft, _ := GetFileType(fd) + if ft == FILE_TYPE_PIPE { + return 0, syscall.EPIPE + } + rlo, e := SetFilePointer(fd, lo, &hi, w) + if e != nil { + return 0, e + } + return int64(hi)<<32 + int64(rlo), nil +} + +func Close(fd Handle) (err error) { + return CloseHandle(fd) +} + +var ( + Stdin = getStdHandle(STD_INPUT_HANDLE) + Stdout = getStdHandle(STD_OUTPUT_HANDLE) + Stderr = getStdHandle(STD_ERROR_HANDLE) +) + +func getStdHandle(stdhandle uint32) (fd Handle) { + r, _ := GetStdHandle(stdhandle) + CloseOnExec(r) + return r +} + +const ImplementsGetwd = true + +func Getwd() (wd string, err error) { + b := make([]uint16, 300) + n, e := GetCurrentDirectory(uint32(len(b)), &b[0]) + if e != nil { + return "", e + } + return string(utf16.Decode(b[0:n])), nil +} + +func Chdir(path string) (err error) { + pathp, err := UTF16PtrFromString(path) + if err != nil { + return err + } + return SetCurrentDirectory(pathp) +} + +func Mkdir(path string, mode uint32) (err error) { + pathp, err := UTF16PtrFromString(path) + if err != nil { + return err + } + return CreateDirectory(pathp, nil) +} + +func Rmdir(path string) (err error) { + pathp, err := UTF16PtrFromString(path) + if err != nil { + return err + } + return RemoveDirectory(pathp) +} + +func Unlink(path string) (err error) { + pathp, err := UTF16PtrFromString(path) + if err != nil { + return err + } + return DeleteFile(pathp) +} + +func Rename(oldpath, newpath string) (err error) { + from, err := UTF16PtrFromString(oldpath) + if err != nil { + return err + } + to, err := UTF16PtrFromString(newpath) + if err != nil { + return err + } + return MoveFileEx(from, to, MOVEFILE_REPLACE_EXISTING) +} + +func ComputerName() (name string, err error) { + var n uint32 = MAX_COMPUTERNAME_LENGTH + 1 + b := make([]uint16, n) + e := GetComputerName(&b[0], &n) + if e != nil { + return "", e + } + return string(utf16.Decode(b[0:n])), nil +} + +func Ftruncate(fd Handle, length int64) (err error) { + curoffset, e := Seek(fd, 0, 1) + if e != nil { + return e + } + defer Seek(fd, curoffset, 0) + _, e = Seek(fd, length, 0) + if e != nil { + return e + } + e = SetEndOfFile(fd) + if e != nil { + return e + } + return nil +} + +func Gettimeofday(tv *Timeval) (err error) { + var ft Filetime + GetSystemTimeAsFileTime(&ft) + *tv = NsecToTimeval(ft.Nanoseconds()) + return nil +} + +func Pipe(p []Handle) (err error) { + if len(p) != 2 { + return syscall.EINVAL + } + var r, w Handle + e := CreatePipe(&r, &w, makeInheritSa(), 0) + if e != nil { + return e + } + p[0] = r + p[1] = w + return nil +} + +func Utimes(path string, tv []Timeval) (err error) { + if len(tv) != 2 { + return syscall.EINVAL + } + pathp, e := UTF16PtrFromString(path) + if e != nil { + return e + } + h, e := CreateFile(pathp, + FILE_WRITE_ATTRIBUTES, FILE_SHARE_WRITE, nil, + OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0) + if e != nil { + return e + } + defer Close(h) + a := NsecToFiletime(tv[0].Nanoseconds()) + w := NsecToFiletime(tv[1].Nanoseconds()) + return SetFileTime(h, nil, &a, &w) +} + +func UtimesNano(path string, ts []Timespec) (err error) { + if len(ts) != 2 { + return syscall.EINVAL + } + pathp, e := UTF16PtrFromString(path) + if e != nil { + return e + } + h, e := CreateFile(pathp, + FILE_WRITE_ATTRIBUTES, FILE_SHARE_WRITE, nil, + OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0) + if e != nil { + return e + } + defer Close(h) + a := NsecToFiletime(TimespecToNsec(ts[0])) + w := NsecToFiletime(TimespecToNsec(ts[1])) + return SetFileTime(h, nil, &a, &w) +} + +func Fsync(fd Handle) (err error) { + return FlushFileBuffers(fd) +} + +func Chmod(path string, mode uint32) (err error) { + if mode == 0 { + return syscall.EINVAL + } + p, e := UTF16PtrFromString(path) + if e != nil { + return e + } + attrs, e := GetFileAttributes(p) + if e != nil { + return e + } + if mode&S_IWRITE != 0 { + attrs &^= FILE_ATTRIBUTE_READONLY + } else { + attrs |= FILE_ATTRIBUTE_READONLY + } + return SetFileAttributes(p, attrs) +} + +func LoadGetSystemTimePreciseAsFileTime() error { + return procGetSystemTimePreciseAsFileTime.Find() +} + +func LoadCancelIoEx() error { + return procCancelIoEx.Find() +} + +func LoadSetFileCompletionNotificationModes() error { + return procSetFileCompletionNotificationModes.Find() +} + +// net api calls + +const socket_error = uintptr(^uint32(0)) + +//sys WSAStartup(verreq uint32, data *WSAData) (sockerr error) = ws2_32.WSAStartup +//sys WSACleanup() (err error) [failretval==socket_error] = ws2_32.WSACleanup +//sys WSAIoctl(s Handle, iocc uint32, inbuf *byte, cbif uint32, outbuf *byte, cbob uint32, cbbr *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) [failretval==socket_error] = ws2_32.WSAIoctl +//sys socket(af int32, typ int32, protocol int32) (handle Handle, err error) [failretval==InvalidHandle] = ws2_32.socket +//sys Setsockopt(s Handle, level int32, optname int32, optval *byte, optlen int32) (err error) [failretval==socket_error] = ws2_32.setsockopt +//sys Getsockopt(s Handle, level int32, optname int32, optval *byte, optlen *int32) (err error) [failretval==socket_error] = ws2_32.getsockopt +//sys bind(s Handle, name unsafe.Pointer, namelen int32) (err error) [failretval==socket_error] = ws2_32.bind +//sys connect(s Handle, name unsafe.Pointer, namelen int32) (err error) [failretval==socket_error] = ws2_32.connect +//sys getsockname(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) [failretval==socket_error] = ws2_32.getsockname +//sys getpeername(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) [failretval==socket_error] = ws2_32.getpeername +//sys listen(s Handle, backlog int32) (err error) [failretval==socket_error] = ws2_32.listen +//sys shutdown(s Handle, how int32) (err error) [failretval==socket_error] = ws2_32.shutdown +//sys Closesocket(s Handle) (err error) [failretval==socket_error] = ws2_32.closesocket +//sys AcceptEx(ls Handle, as Handle, buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, recvd *uint32, overlapped *Overlapped) (err error) = mswsock.AcceptEx +//sys GetAcceptExSockaddrs(buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, lrsa **RawSockaddrAny, lrsalen *int32, rrsa **RawSockaddrAny, rrsalen *int32) = mswsock.GetAcceptExSockaddrs +//sys WSARecv(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSARecv +//sys WSASend(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSASend +//sys WSARecvFrom(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, from *RawSockaddrAny, fromlen *int32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSARecvFrom +//sys WSASendTo(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, to *RawSockaddrAny, tolen int32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSASendTo +//sys GetHostByName(name string) (h *Hostent, err error) [failretval==nil] = ws2_32.gethostbyname +//sys GetServByName(name string, proto string) (s *Servent, err error) [failretval==nil] = ws2_32.getservbyname +//sys Ntohs(netshort uint16) (u uint16) = ws2_32.ntohs +//sys GetProtoByName(name string) (p *Protoent, err error) [failretval==nil] = ws2_32.getprotobyname +//sys DnsQuery(name string, qtype uint16, options uint32, extra *byte, qrs **DNSRecord, pr *byte) (status error) = dnsapi.DnsQuery_W +//sys DnsRecordListFree(rl *DNSRecord, freetype uint32) = dnsapi.DnsRecordListFree +//sys DnsNameCompare(name1 *uint16, name2 *uint16) (same bool) = dnsapi.DnsNameCompare_W +//sys GetAddrInfoW(nodename *uint16, servicename *uint16, hints *AddrinfoW, result **AddrinfoW) (sockerr error) = ws2_32.GetAddrInfoW +//sys FreeAddrInfoW(addrinfo *AddrinfoW) = ws2_32.FreeAddrInfoW +//sys GetIfEntry(pIfRow *MibIfRow) (errcode error) = iphlpapi.GetIfEntry +//sys GetAdaptersInfo(ai *IpAdapterInfo, ol *uint32) (errcode error) = iphlpapi.GetAdaptersInfo +//sys SetFileCompletionNotificationModes(handle Handle, flags uint8) (err error) = kernel32.SetFileCompletionNotificationModes +//sys WSAEnumProtocols(protocols *int32, protocolBuffer *WSAProtocolInfo, bufferLength *uint32) (n int32, err error) [failretval==-1] = ws2_32.WSAEnumProtocolsW +//sys GetAdaptersAddresses(family uint32, flags uint32, reserved uintptr, adapterAddresses *IpAdapterAddresses, sizePointer *uint32) (errcode error) = iphlpapi.GetAdaptersAddresses +//sys GetACP() (acp uint32) = kernel32.GetACP +//sys MultiByteToWideChar(codePage uint32, dwFlags uint32, str *byte, nstr int32, wchar *uint16, nwchar int32) (nwrite int32, err error) = kernel32.MultiByteToWideChar + +// For testing: clients can set this flag to force +// creation of IPv6 sockets to return EAFNOSUPPORT. +var SocketDisableIPv6 bool + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type Sockaddr interface { + sockaddr() (ptr unsafe.Pointer, len int32, err error) // lowercase; only we can define Sockaddrs +} + +type SockaddrInet4 struct { + Port int + Addr [4]byte + raw RawSockaddrInet4 +} + +func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, int32, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, syscall.EINVAL + } + sa.raw.Family = AF_INET + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), int32(unsafe.Sizeof(sa.raw)), nil +} + +type SockaddrInet6 struct { + Port int + ZoneId uint32 + Addr [16]byte + raw RawSockaddrInet6 +} + +func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, int32, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, syscall.EINVAL + } + sa.raw.Family = AF_INET6 + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + sa.raw.Scope_id = sa.ZoneId + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), int32(unsafe.Sizeof(sa.raw)), nil +} + +type SockaddrUnix struct { + Name string +} + +func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, int32, error) { + // TODO(brainman): implement SockaddrUnix.sockaddr() + return nil, 0, syscall.EWINDOWS +} + +func (rsa *RawSockaddrAny) Sockaddr() (Sockaddr, error) { + switch rsa.Addr.Family { + case AF_UNIX: + return nil, syscall.EWINDOWS + + case AF_INET: + pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet4) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + + case AF_INET6: + pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet6) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + sa.ZoneId = pp.Scope_id + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + } + return nil, syscall.EAFNOSUPPORT +} + +func Socket(domain, typ, proto int) (fd Handle, err error) { + if domain == AF_INET6 && SocketDisableIPv6 { + return InvalidHandle, syscall.EAFNOSUPPORT + } + return socket(int32(domain), int32(typ), int32(proto)) +} + +func SetsockoptInt(fd Handle, level, opt int, value int) (err error) { + v := int32(value) + return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(&v)), int32(unsafe.Sizeof(v))) +} + +func Bind(fd Handle, sa Sockaddr) (err error) { + ptr, n, err := sa.sockaddr() + if err != nil { + return err + } + return bind(fd, ptr, n) +} + +func Connect(fd Handle, sa Sockaddr) (err error) { + ptr, n, err := sa.sockaddr() + if err != nil { + return err + } + return connect(fd, ptr, n) +} + +func Getsockname(fd Handle) (sa Sockaddr, err error) { + var rsa RawSockaddrAny + l := int32(unsafe.Sizeof(rsa)) + if err = getsockname(fd, &rsa, &l); err != nil { + return + } + return rsa.Sockaddr() +} + +func Getpeername(fd Handle) (sa Sockaddr, err error) { + var rsa RawSockaddrAny + l := int32(unsafe.Sizeof(rsa)) + if err = getpeername(fd, &rsa, &l); err != nil { + return + } + return rsa.Sockaddr() +} + +func Listen(s Handle, n int) (err error) { + return listen(s, int32(n)) +} + +func Shutdown(fd Handle, how int) (err error) { + return shutdown(fd, int32(how)) +} + +func WSASendto(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, to Sockaddr, overlapped *Overlapped, croutine *byte) (err error) { + rsa, l, err := to.sockaddr() + if err != nil { + return err + } + return WSASendTo(s, bufs, bufcnt, sent, flags, (*RawSockaddrAny)(unsafe.Pointer(rsa)), l, overlapped, croutine) +} + +func LoadGetAddrInfo() error { + return procGetAddrInfoW.Find() +} + +var connectExFunc struct { + once sync.Once + addr uintptr + err error +} + +func LoadConnectEx() error { + connectExFunc.once.Do(func() { + var s Handle + s, connectExFunc.err = Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) + if connectExFunc.err != nil { + return + } + defer CloseHandle(s) + var n uint32 + connectExFunc.err = WSAIoctl(s, + SIO_GET_EXTENSION_FUNCTION_POINTER, + (*byte)(unsafe.Pointer(&WSAID_CONNECTEX)), + uint32(unsafe.Sizeof(WSAID_CONNECTEX)), + (*byte)(unsafe.Pointer(&connectExFunc.addr)), + uint32(unsafe.Sizeof(connectExFunc.addr)), + &n, nil, 0) + }) + return connectExFunc.err +} + +func connectEx(s Handle, name unsafe.Pointer, namelen int32, sendBuf *byte, sendDataLen uint32, bytesSent *uint32, overlapped *Overlapped) (err error) { + r1, _, e1 := syscall.Syscall9(connectExFunc.addr, 7, uintptr(s), uintptr(name), uintptr(namelen), uintptr(unsafe.Pointer(sendBuf)), uintptr(sendDataLen), uintptr(unsafe.Pointer(bytesSent)), uintptr(unsafe.Pointer(overlapped)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = error(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ConnectEx(fd Handle, sa Sockaddr, sendBuf *byte, sendDataLen uint32, bytesSent *uint32, overlapped *Overlapped) error { + err := LoadConnectEx() + if err != nil { + return errorspkg.New("failed to find ConnectEx: " + err.Error()) + } + ptr, n, err := sa.sockaddr() + if err != nil { + return err + } + return connectEx(fd, ptr, n, sendBuf, sendDataLen, bytesSent, overlapped) +} + +var sendRecvMsgFunc struct { + once sync.Once + sendAddr uintptr + recvAddr uintptr + err error +} + +func loadWSASendRecvMsg() error { + sendRecvMsgFunc.once.Do(func() { + var s Handle + s, sendRecvMsgFunc.err = Socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP) + if sendRecvMsgFunc.err != nil { + return + } + defer CloseHandle(s) + var n uint32 + sendRecvMsgFunc.err = WSAIoctl(s, + SIO_GET_EXTENSION_FUNCTION_POINTER, + (*byte)(unsafe.Pointer(&WSAID_WSARECVMSG)), + uint32(unsafe.Sizeof(WSAID_WSARECVMSG)), + (*byte)(unsafe.Pointer(&sendRecvMsgFunc.recvAddr)), + uint32(unsafe.Sizeof(sendRecvMsgFunc.recvAddr)), + &n, nil, 0) + if sendRecvMsgFunc.err != nil { + return + } + sendRecvMsgFunc.err = WSAIoctl(s, + SIO_GET_EXTENSION_FUNCTION_POINTER, + (*byte)(unsafe.Pointer(&WSAID_WSASENDMSG)), + uint32(unsafe.Sizeof(WSAID_WSASENDMSG)), + (*byte)(unsafe.Pointer(&sendRecvMsgFunc.sendAddr)), + uint32(unsafe.Sizeof(sendRecvMsgFunc.sendAddr)), + &n, nil, 0) + }) + return sendRecvMsgFunc.err +} + +func WSASendMsg(fd Handle, msg *WSAMsg, flags uint32, bytesSent *uint32, overlapped *Overlapped, croutine *byte) error { + err := loadWSASendRecvMsg() + if err != nil { + return err + } + r1, _, e1 := syscall.Syscall6(sendRecvMsgFunc.sendAddr, 6, uintptr(fd), uintptr(unsafe.Pointer(msg)), uintptr(flags), uintptr(unsafe.Pointer(bytesSent)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine))) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return err +} + +func WSARecvMsg(fd Handle, msg *WSAMsg, bytesReceived *uint32, overlapped *Overlapped, croutine *byte) error { + err := loadWSASendRecvMsg() + if err != nil { + return err + } + r1, _, e1 := syscall.Syscall6(sendRecvMsgFunc.recvAddr, 5, uintptr(fd), uintptr(unsafe.Pointer(msg)), uintptr(unsafe.Pointer(bytesReceived)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)), 0) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return err +} + +// Invented structures to support what package os expects. +type Rusage struct { + CreationTime Filetime + ExitTime Filetime + KernelTime Filetime + UserTime Filetime +} + +type WaitStatus struct { + ExitCode uint32 +} + +func (w WaitStatus) Exited() bool { return true } + +func (w WaitStatus) ExitStatus() int { return int(w.ExitCode) } + +func (w WaitStatus) Signal() Signal { return -1 } + +func (w WaitStatus) CoreDump() bool { return false } + +func (w WaitStatus) Stopped() bool { return false } + +func (w WaitStatus) Continued() bool { return false } + +func (w WaitStatus) StopSignal() Signal { return -1 } + +func (w WaitStatus) Signaled() bool { return false } + +func (w WaitStatus) TrapCause() int { return -1 } + +// Timespec is an invented structure on Windows, but here for +// consistency with the corresponding package for other operating systems. +type Timespec struct { + Sec int64 + Nsec int64 +} + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = nsec / 1e9 + ts.Nsec = nsec % 1e9 + return +} + +// TODO(brainman): fix all needed for net + +func Accept(fd Handle) (nfd Handle, sa Sockaddr, err error) { return 0, nil, syscall.EWINDOWS } +func Recvfrom(fd Handle, p []byte, flags int) (n int, from Sockaddr, err error) { + return 0, nil, syscall.EWINDOWS +} +func Sendto(fd Handle, p []byte, flags int, to Sockaddr) (err error) { return syscall.EWINDOWS } +func SetsockoptTimeval(fd Handle, level, opt int, tv *Timeval) (err error) { return syscall.EWINDOWS } + +// The Linger struct is wrong but we only noticed after Go 1. +// sysLinger is the real system call structure. + +// BUG(brainman): The definition of Linger is not appropriate for direct use +// with Setsockopt and Getsockopt. +// Use SetsockoptLinger instead. + +type Linger struct { + Onoff int32 + Linger int32 +} + +type sysLinger struct { + Onoff uint16 + Linger uint16 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +func GetsockoptInt(fd Handle, level, opt int) (int, error) { return -1, syscall.EWINDOWS } + +func SetsockoptLinger(fd Handle, level, opt int, l *Linger) (err error) { + sys := sysLinger{Onoff: uint16(l.Onoff), Linger: uint16(l.Linger)} + return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(&sys)), int32(unsafe.Sizeof(sys))) +} + +func SetsockoptInet4Addr(fd Handle, level, opt int, value [4]byte) (err error) { + return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(&value[0])), 4) +} +func SetsockoptIPMreq(fd Handle, level, opt int, mreq *IPMreq) (err error) { + return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(mreq)), int32(unsafe.Sizeof(*mreq))) +} +func SetsockoptIPv6Mreq(fd Handle, level, opt int, mreq *IPv6Mreq) (err error) { + return syscall.EWINDOWS +} + +func Getpid() (pid int) { return int(getCurrentProcessId()) } + +func FindFirstFile(name *uint16, data *Win32finddata) (handle Handle, err error) { + // NOTE(rsc): The Win32finddata struct is wrong for the system call: + // the two paths are each one uint16 short. Use the correct struct, + // a win32finddata1, and then copy the results out. + // There is no loss of expressivity here, because the final + // uint16, if it is used, is supposed to be a NUL, and Go doesn't need that. + // For Go 1.1, we might avoid the allocation of win32finddata1 here + // by adding a final Bug [2]uint16 field to the struct and then + // adjusting the fields in the result directly. + var data1 win32finddata1 + handle, err = findFirstFile1(name, &data1) + if err == nil { + copyFindData(data, &data1) + } + return +} + +func FindNextFile(handle Handle, data *Win32finddata) (err error) { + var data1 win32finddata1 + err = findNextFile1(handle, &data1) + if err == nil { + copyFindData(data, &data1) + } + return +} + +func getProcessEntry(pid int) (*ProcessEntry32, error) { + snapshot, err := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0) + if err != nil { + return nil, err + } + defer CloseHandle(snapshot) + var procEntry ProcessEntry32 + procEntry.Size = uint32(unsafe.Sizeof(procEntry)) + if err = Process32First(snapshot, &procEntry); err != nil { + return nil, err + } + for { + if procEntry.ProcessID == uint32(pid) { + return &procEntry, nil + } + err = Process32Next(snapshot, &procEntry) + if err != nil { + return nil, err + } + } +} + +func Getppid() (ppid int) { + pe, err := getProcessEntry(Getpid()) + if err != nil { + return -1 + } + return int(pe.ParentProcessID) +} + +// TODO(brainman): fix all needed for os +func Fchdir(fd Handle) (err error) { return syscall.EWINDOWS } +func Link(oldpath, newpath string) (err error) { return syscall.EWINDOWS } +func Symlink(path, link string) (err error) { return syscall.EWINDOWS } + +func Fchmod(fd Handle, mode uint32) (err error) { return syscall.EWINDOWS } +func Chown(path string, uid int, gid int) (err error) { return syscall.EWINDOWS } +func Lchown(path string, uid int, gid int) (err error) { return syscall.EWINDOWS } +func Fchown(fd Handle, uid int, gid int) (err error) { return syscall.EWINDOWS } + +func Getuid() (uid int) { return -1 } +func Geteuid() (euid int) { return -1 } +func Getgid() (gid int) { return -1 } +func Getegid() (egid int) { return -1 } +func Getgroups() (gids []int, err error) { return nil, syscall.EWINDOWS } + +type Signal int + +func (s Signal) Signal() {} + +func (s Signal) String() string { + if 0 <= s && int(s) < len(signals) { + str := signals[s] + if str != "" { + return str + } + } + return "signal " + itoa(int(s)) +} + +func LoadCreateSymbolicLink() error { + return procCreateSymbolicLinkW.Find() +} + +// Readlink returns the destination of the named symbolic link. +func Readlink(path string, buf []byte) (n int, err error) { + fd, err := CreateFile(StringToUTF16Ptr(path), GENERIC_READ, 0, nil, OPEN_EXISTING, + FILE_FLAG_OPEN_REPARSE_POINT|FILE_FLAG_BACKUP_SEMANTICS, 0) + if err != nil { + return -1, err + } + defer CloseHandle(fd) + + rdbbuf := make([]byte, MAXIMUM_REPARSE_DATA_BUFFER_SIZE) + var bytesReturned uint32 + err = DeviceIoControl(fd, FSCTL_GET_REPARSE_POINT, nil, 0, &rdbbuf[0], uint32(len(rdbbuf)), &bytesReturned, nil) + if err != nil { + return -1, err + } + + rdb := (*reparseDataBuffer)(unsafe.Pointer(&rdbbuf[0])) + var s string + switch rdb.ReparseTag { + case IO_REPARSE_TAG_SYMLINK: + data := (*symbolicLinkReparseBuffer)(unsafe.Pointer(&rdb.reparseBuffer)) + p := (*[0xffff]uint16)(unsafe.Pointer(&data.PathBuffer[0])) + s = UTF16ToString(p[data.PrintNameOffset/2 : (data.PrintNameLength-data.PrintNameOffset)/2]) + case IO_REPARSE_TAG_MOUNT_POINT: + data := (*mountPointReparseBuffer)(unsafe.Pointer(&rdb.reparseBuffer)) + p := (*[0xffff]uint16)(unsafe.Pointer(&data.PathBuffer[0])) + s = UTF16ToString(p[data.PrintNameOffset/2 : (data.PrintNameLength-data.PrintNameOffset)/2]) + default: + // the path is not a symlink or junction but another type of reparse + // point + return -1, syscall.ENOENT + } + n = copy(buf, []byte(s)) + + return n, nil +} diff --git a/api/vendor/golang.org/x/sys/windows/syscall_windows_test.go b/api/vendor/golang.org/x/sys/windows/syscall_windows_test.go new file mode 100644 index 0000000..9c7133c --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/syscall_windows_test.go @@ -0,0 +1,107 @@ +// 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 windows_test + +import ( + "io/ioutil" + "os" + "path/filepath" + "syscall" + "testing" + "unsafe" + + "golang.org/x/sys/windows" +) + +func TestWin32finddata(t *testing.T) { + dir, err := ioutil.TempDir("", "go-build") + if err != nil { + t.Fatalf("failed to create temp directory: %v", err) + } + defer os.RemoveAll(dir) + + path := filepath.Join(dir, "long_name.and_extension") + f, err := os.Create(path) + if err != nil { + t.Fatalf("failed to create %v: %v", path, err) + } + f.Close() + + type X struct { + fd windows.Win32finddata + got byte + pad [10]byte // to protect ourselves + + } + var want byte = 2 // it is unlikely to have this character in the filename + x := X{got: want} + + pathp, _ := windows.UTF16PtrFromString(path) + h, err := windows.FindFirstFile(pathp, &(x.fd)) + if err != nil { + t.Fatalf("FindFirstFile failed: %v", err) + } + err = windows.FindClose(h) + if err != nil { + t.Fatalf("FindClose failed: %v", err) + } + + if x.got != want { + t.Fatalf("memory corruption: want=%d got=%d", want, x.got) + } +} + +func TestFormatMessage(t *testing.T) { + dll := windows.MustLoadDLL("pdh.dll") + + pdhOpenQuery := func(datasrc *uint16, userdata uint32, query *windows.Handle) (errno uintptr) { + r0, _, _ := syscall.Syscall(dll.MustFindProc("PdhOpenQueryW").Addr(), 3, uintptr(unsafe.Pointer(datasrc)), uintptr(userdata), uintptr(unsafe.Pointer(query))) + return r0 + } + + pdhCloseQuery := func(query windows.Handle) (errno uintptr) { + r0, _, _ := syscall.Syscall(dll.MustFindProc("PdhCloseQuery").Addr(), 1, uintptr(query), 0, 0) + return r0 + } + + var q windows.Handle + name, err := windows.UTF16PtrFromString("no_such_source") + if err != nil { + t.Fatal(err) + } + errno := pdhOpenQuery(name, 0, &q) + if errno == 0 { + pdhCloseQuery(q) + t.Fatal("PdhOpenQuery succeeded, but expected to fail.") + } + + const flags uint32 = syscall.FORMAT_MESSAGE_FROM_HMODULE | syscall.FORMAT_MESSAGE_ARGUMENT_ARRAY | syscall.FORMAT_MESSAGE_IGNORE_INSERTS + buf := make([]uint16, 300) + _, err = windows.FormatMessage(flags, uintptr(dll.Handle), uint32(errno), 0, buf, nil) + if err != nil { + t.Fatalf("FormatMessage for handle=%x and errno=%x failed: %v", dll.Handle, errno, err) + } +} + +func abort(funcname string, err error) { + panic(funcname + " failed: " + err.Error()) +} + +func ExampleLoadLibrary() { + h, err := windows.LoadLibrary("kernel32.dll") + if err != nil { + abort("LoadLibrary", err) + } + defer windows.FreeLibrary(h) + proc, err := windows.GetProcAddress(h, "GetVersion") + if err != nil { + abort("GetProcAddress", err) + } + r, _, _ := syscall.Syscall(uintptr(proc), 0, 0, 0, 0) + major := byte(r) + minor := uint8(r >> 8) + build := uint16(r >> 16) + print("windows version ", major, ".", minor, " (Build ", build, ")\n") +} diff --git a/api/vendor/golang.org/x/sys/windows/types_windows.go b/api/vendor/golang.org/x/sys/windows/types_windows.go new file mode 100644 index 0000000..52c2037 --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/types_windows.go @@ -0,0 +1,1333 @@ +// 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 windows + +import "syscall" + +const ( + // Windows errors. + ERROR_FILE_NOT_FOUND syscall.Errno = 2 + ERROR_PATH_NOT_FOUND syscall.Errno = 3 + ERROR_ACCESS_DENIED syscall.Errno = 5 + ERROR_NO_MORE_FILES syscall.Errno = 18 + ERROR_HANDLE_EOF syscall.Errno = 38 + ERROR_NETNAME_DELETED syscall.Errno = 64 + ERROR_FILE_EXISTS syscall.Errno = 80 + ERROR_BROKEN_PIPE syscall.Errno = 109 + ERROR_BUFFER_OVERFLOW syscall.Errno = 111 + ERROR_INSUFFICIENT_BUFFER syscall.Errno = 122 + ERROR_MOD_NOT_FOUND syscall.Errno = 126 + ERROR_PROC_NOT_FOUND syscall.Errno = 127 + ERROR_ALREADY_EXISTS syscall.Errno = 183 + ERROR_ENVVAR_NOT_FOUND syscall.Errno = 203 + ERROR_MORE_DATA syscall.Errno = 234 + ERROR_OPERATION_ABORTED syscall.Errno = 995 + ERROR_IO_PENDING syscall.Errno = 997 + ERROR_SERVICE_SPECIFIC_ERROR syscall.Errno = 1066 + ERROR_NOT_FOUND syscall.Errno = 1168 + ERROR_PRIVILEGE_NOT_HELD syscall.Errno = 1314 + WSAEACCES syscall.Errno = 10013 + WSAEMSGSIZE syscall.Errno = 10040 + WSAECONNRESET syscall.Errno = 10054 +) + +const ( + // Invented values to support what package os expects. + O_RDONLY = 0x00000 + O_WRONLY = 0x00001 + O_RDWR = 0x00002 + O_CREAT = 0x00040 + O_EXCL = 0x00080 + O_NOCTTY = 0x00100 + O_TRUNC = 0x00200 + O_NONBLOCK = 0x00800 + O_APPEND = 0x00400 + O_SYNC = 0x01000 + O_ASYNC = 0x02000 + O_CLOEXEC = 0x80000 +) + +const ( + // More invented values for signals + SIGHUP = Signal(0x1) + SIGINT = Signal(0x2) + SIGQUIT = Signal(0x3) + SIGILL = Signal(0x4) + SIGTRAP = Signal(0x5) + SIGABRT = Signal(0x6) + SIGBUS = Signal(0x7) + SIGFPE = Signal(0x8) + SIGKILL = Signal(0x9) + SIGSEGV = Signal(0xb) + SIGPIPE = Signal(0xd) + SIGALRM = Signal(0xe) + SIGTERM = Signal(0xf) +) + +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/breakpoint trap", + 6: "aborted", + 7: "bus error", + 8: "floating point exception", + 9: "killed", + 10: "user defined signal 1", + 11: "segmentation fault", + 12: "user defined signal 2", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", +} + +const ( + GENERIC_READ = 0x80000000 + GENERIC_WRITE = 0x40000000 + GENERIC_EXECUTE = 0x20000000 + GENERIC_ALL = 0x10000000 + + FILE_LIST_DIRECTORY = 0x00000001 + FILE_APPEND_DATA = 0x00000004 + FILE_WRITE_ATTRIBUTES = 0x00000100 + + FILE_SHARE_READ = 0x00000001 + FILE_SHARE_WRITE = 0x00000002 + FILE_SHARE_DELETE = 0x00000004 + FILE_ATTRIBUTE_READONLY = 0x00000001 + FILE_ATTRIBUTE_HIDDEN = 0x00000002 + FILE_ATTRIBUTE_SYSTEM = 0x00000004 + FILE_ATTRIBUTE_DIRECTORY = 0x00000010 + FILE_ATTRIBUTE_ARCHIVE = 0x00000020 + FILE_ATTRIBUTE_NORMAL = 0x00000080 + FILE_ATTRIBUTE_REPARSE_POINT = 0x00000400 + + INVALID_FILE_ATTRIBUTES = 0xffffffff + + CREATE_NEW = 1 + CREATE_ALWAYS = 2 + OPEN_EXISTING = 3 + OPEN_ALWAYS = 4 + TRUNCATE_EXISTING = 5 + + FILE_FLAG_OPEN_REPARSE_POINT = 0x00200000 + FILE_FLAG_BACKUP_SEMANTICS = 0x02000000 + FILE_FLAG_OVERLAPPED = 0x40000000 + + HANDLE_FLAG_INHERIT = 0x00000001 + STARTF_USESTDHANDLES = 0x00000100 + STARTF_USESHOWWINDOW = 0x00000001 + DUPLICATE_CLOSE_SOURCE = 0x00000001 + DUPLICATE_SAME_ACCESS = 0x00000002 + + STD_INPUT_HANDLE = -10 & (1<<32 - 1) + STD_OUTPUT_HANDLE = -11 & (1<<32 - 1) + STD_ERROR_HANDLE = -12 & (1<<32 - 1) + + FILE_BEGIN = 0 + FILE_CURRENT = 1 + FILE_END = 2 + + LANG_ENGLISH = 0x09 + SUBLANG_ENGLISH_US = 0x01 + + FORMAT_MESSAGE_ALLOCATE_BUFFER = 256 + FORMAT_MESSAGE_IGNORE_INSERTS = 512 + FORMAT_MESSAGE_FROM_STRING = 1024 + FORMAT_MESSAGE_FROM_HMODULE = 2048 + FORMAT_MESSAGE_FROM_SYSTEM = 4096 + FORMAT_MESSAGE_ARGUMENT_ARRAY = 8192 + FORMAT_MESSAGE_MAX_WIDTH_MASK = 255 + + MAX_PATH = 260 + MAX_LONG_PATH = 32768 + + MAX_COMPUTERNAME_LENGTH = 15 + + TIME_ZONE_ID_UNKNOWN = 0 + TIME_ZONE_ID_STANDARD = 1 + + TIME_ZONE_ID_DAYLIGHT = 2 + IGNORE = 0 + INFINITE = 0xffffffff + + WAIT_TIMEOUT = 258 + WAIT_ABANDONED = 0x00000080 + WAIT_OBJECT_0 = 0x00000000 + WAIT_FAILED = 0xFFFFFFFF + + PROCESS_TERMINATE = 1 + PROCESS_QUERY_INFORMATION = 0x00000400 + SYNCHRONIZE = 0x00100000 + + FILE_MAP_COPY = 0x01 + FILE_MAP_WRITE = 0x02 + FILE_MAP_READ = 0x04 + FILE_MAP_EXECUTE = 0x20 + + CTRL_C_EVENT = 0 + CTRL_BREAK_EVENT = 1 + + // Windows reserves errors >= 1<<29 for application use. + APPLICATION_ERROR = 1 << 29 +) + +const ( + // Process creation flags. + CREATE_BREAKAWAY_FROM_JOB = 0x01000000 + CREATE_DEFAULT_ERROR_MODE = 0x04000000 + CREATE_NEW_CONSOLE = 0x00000010 + CREATE_NEW_PROCESS_GROUP = 0x00000200 + CREATE_NO_WINDOW = 0x08000000 + CREATE_PROTECTED_PROCESS = 0x00040000 + CREATE_PRESERVE_CODE_AUTHZ_LEVEL = 0x02000000 + CREATE_SEPARATE_WOW_VDM = 0x00000800 + CREATE_SHARED_WOW_VDM = 0x00001000 + CREATE_SUSPENDED = 0x00000004 + CREATE_UNICODE_ENVIRONMENT = 0x00000400 + DEBUG_ONLY_THIS_PROCESS = 0x00000002 + DEBUG_PROCESS = 0x00000001 + DETACHED_PROCESS = 0x00000008 + EXTENDED_STARTUPINFO_PRESENT = 0x00080000 + INHERIT_PARENT_AFFINITY = 0x00010000 +) + +const ( + // flags for CreateToolhelp32Snapshot + TH32CS_SNAPHEAPLIST = 0x01 + TH32CS_SNAPPROCESS = 0x02 + TH32CS_SNAPTHREAD = 0x04 + TH32CS_SNAPMODULE = 0x08 + TH32CS_SNAPMODULE32 = 0x10 + TH32CS_SNAPALL = TH32CS_SNAPHEAPLIST | TH32CS_SNAPMODULE | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD + TH32CS_INHERIT = 0x80000000 +) + +const ( + // filters for ReadDirectoryChangesW + FILE_NOTIFY_CHANGE_FILE_NAME = 0x001 + FILE_NOTIFY_CHANGE_DIR_NAME = 0x002 + FILE_NOTIFY_CHANGE_ATTRIBUTES = 0x004 + FILE_NOTIFY_CHANGE_SIZE = 0x008 + FILE_NOTIFY_CHANGE_LAST_WRITE = 0x010 + FILE_NOTIFY_CHANGE_LAST_ACCESS = 0x020 + FILE_NOTIFY_CHANGE_CREATION = 0x040 + FILE_NOTIFY_CHANGE_SECURITY = 0x100 +) + +const ( + // do not reorder + FILE_ACTION_ADDED = iota + 1 + FILE_ACTION_REMOVED + FILE_ACTION_MODIFIED + FILE_ACTION_RENAMED_OLD_NAME + FILE_ACTION_RENAMED_NEW_NAME +) + +const ( + // wincrypt.h + PROV_RSA_FULL = 1 + PROV_RSA_SIG = 2 + PROV_DSS = 3 + PROV_FORTEZZA = 4 + PROV_MS_EXCHANGE = 5 + PROV_SSL = 6 + PROV_RSA_SCHANNEL = 12 + PROV_DSS_DH = 13 + PROV_EC_ECDSA_SIG = 14 + PROV_EC_ECNRA_SIG = 15 + PROV_EC_ECDSA_FULL = 16 + PROV_EC_ECNRA_FULL = 17 + PROV_DH_SCHANNEL = 18 + PROV_SPYRUS_LYNKS = 20 + PROV_RNG = 21 + PROV_INTEL_SEC = 22 + PROV_REPLACE_OWF = 23 + PROV_RSA_AES = 24 + CRYPT_VERIFYCONTEXT = 0xF0000000 + CRYPT_NEWKEYSET = 0x00000008 + CRYPT_DELETEKEYSET = 0x00000010 + CRYPT_MACHINE_KEYSET = 0x00000020 + CRYPT_SILENT = 0x00000040 + CRYPT_DEFAULT_CONTAINER_OPTIONAL = 0x00000080 + + USAGE_MATCH_TYPE_AND = 0 + USAGE_MATCH_TYPE_OR = 1 + + X509_ASN_ENCODING = 0x00000001 + PKCS_7_ASN_ENCODING = 0x00010000 + + CERT_STORE_PROV_MEMORY = 2 + + CERT_STORE_ADD_ALWAYS = 4 + + CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG = 0x00000004 + + CERT_TRUST_NO_ERROR = 0x00000000 + CERT_TRUST_IS_NOT_TIME_VALID = 0x00000001 + CERT_TRUST_IS_REVOKED = 0x00000004 + CERT_TRUST_IS_NOT_SIGNATURE_VALID = 0x00000008 + CERT_TRUST_IS_NOT_VALID_FOR_USAGE = 0x00000010 + CERT_TRUST_IS_UNTRUSTED_ROOT = 0x00000020 + CERT_TRUST_REVOCATION_STATUS_UNKNOWN = 0x00000040 + CERT_TRUST_IS_CYCLIC = 0x00000080 + CERT_TRUST_INVALID_EXTENSION = 0x00000100 + CERT_TRUST_INVALID_POLICY_CONSTRAINTS = 0x00000200 + CERT_TRUST_INVALID_BASIC_CONSTRAINTS = 0x00000400 + CERT_TRUST_INVALID_NAME_CONSTRAINTS = 0x00000800 + CERT_TRUST_HAS_NOT_SUPPORTED_NAME_CONSTRAINT = 0x00001000 + CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT = 0x00002000 + CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT = 0x00004000 + CERT_TRUST_HAS_EXCLUDED_NAME_CONSTRAINT = 0x00008000 + CERT_TRUST_IS_OFFLINE_REVOCATION = 0x01000000 + CERT_TRUST_NO_ISSUANCE_CHAIN_POLICY = 0x02000000 + CERT_TRUST_IS_EXPLICIT_DISTRUST = 0x04000000 + CERT_TRUST_HAS_NOT_SUPPORTED_CRITICAL_EXT = 0x08000000 + + CERT_CHAIN_POLICY_BASE = 1 + CERT_CHAIN_POLICY_AUTHENTICODE = 2 + CERT_CHAIN_POLICY_AUTHENTICODE_TS = 3 + CERT_CHAIN_POLICY_SSL = 4 + CERT_CHAIN_POLICY_BASIC_CONSTRAINTS = 5 + CERT_CHAIN_POLICY_NT_AUTH = 6 + CERT_CHAIN_POLICY_MICROSOFT_ROOT = 7 + CERT_CHAIN_POLICY_EV = 8 + + CERT_E_EXPIRED = 0x800B0101 + CERT_E_ROLE = 0x800B0103 + CERT_E_PURPOSE = 0x800B0106 + CERT_E_UNTRUSTEDROOT = 0x800B0109 + CERT_E_CN_NO_MATCH = 0x800B010F + + AUTHTYPE_CLIENT = 1 + AUTHTYPE_SERVER = 2 +) + +var ( + OID_PKIX_KP_SERVER_AUTH = []byte("1.3.6.1.5.5.7.3.1\x00") + OID_SERVER_GATED_CRYPTO = []byte("1.3.6.1.4.1.311.10.3.3\x00") + OID_SGC_NETSCAPE = []byte("2.16.840.1.113730.4.1\x00") +) + +// Invented values to support what package os expects. +type Timeval struct { + Sec int32 + Usec int32 +} + +func (tv *Timeval) Nanoseconds() int64 { + return (int64(tv.Sec)*1e6 + int64(tv.Usec)) * 1e3 +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + tv.Sec = int32(nsec / 1e9) + tv.Usec = int32(nsec % 1e9 / 1e3) + return +} + +type SecurityAttributes struct { + Length uint32 + SecurityDescriptor uintptr + InheritHandle uint32 +} + +type Overlapped struct { + Internal uintptr + InternalHigh uintptr + Offset uint32 + OffsetHigh uint32 + HEvent Handle +} + +type FileNotifyInformation struct { + NextEntryOffset uint32 + Action uint32 + FileNameLength uint32 + FileName uint16 +} + +type Filetime struct { + LowDateTime uint32 + HighDateTime uint32 +} + +// Nanoseconds returns Filetime ft in nanoseconds +// since Epoch (00:00:00 UTC, January 1, 1970). +func (ft *Filetime) Nanoseconds() int64 { + // 100-nanosecond intervals since January 1, 1601 + nsec := int64(ft.HighDateTime)<<32 + int64(ft.LowDateTime) + // change starting time to the Epoch (00:00:00 UTC, January 1, 1970) + nsec -= 116444736000000000 + // convert into nanoseconds + nsec *= 100 + return nsec +} + +func NsecToFiletime(nsec int64) (ft Filetime) { + // convert into 100-nanosecond + nsec /= 100 + // change starting time to January 1, 1601 + nsec += 116444736000000000 + // split into high / low + ft.LowDateTime = uint32(nsec & 0xffffffff) + ft.HighDateTime = uint32(nsec >> 32 & 0xffffffff) + return ft +} + +type Win32finddata struct { + FileAttributes uint32 + CreationTime Filetime + LastAccessTime Filetime + LastWriteTime Filetime + FileSizeHigh uint32 + FileSizeLow uint32 + Reserved0 uint32 + Reserved1 uint32 + FileName [MAX_PATH - 1]uint16 + AlternateFileName [13]uint16 +} + +// This is the actual system call structure. +// Win32finddata is what we committed to in Go 1. +type win32finddata1 struct { + FileAttributes uint32 + CreationTime Filetime + LastAccessTime Filetime + LastWriteTime Filetime + FileSizeHigh uint32 + FileSizeLow uint32 + Reserved0 uint32 + Reserved1 uint32 + FileName [MAX_PATH]uint16 + AlternateFileName [14]uint16 +} + +func copyFindData(dst *Win32finddata, src *win32finddata1) { + dst.FileAttributes = src.FileAttributes + dst.CreationTime = src.CreationTime + dst.LastAccessTime = src.LastAccessTime + dst.LastWriteTime = src.LastWriteTime + dst.FileSizeHigh = src.FileSizeHigh + dst.FileSizeLow = src.FileSizeLow + dst.Reserved0 = src.Reserved0 + dst.Reserved1 = src.Reserved1 + + // The src is 1 element bigger than dst, but it must be NUL. + copy(dst.FileName[:], src.FileName[:]) + copy(dst.AlternateFileName[:], src.AlternateFileName[:]) +} + +type ByHandleFileInformation struct { + FileAttributes uint32 + CreationTime Filetime + LastAccessTime Filetime + LastWriteTime Filetime + VolumeSerialNumber uint32 + FileSizeHigh uint32 + FileSizeLow uint32 + NumberOfLinks uint32 + FileIndexHigh uint32 + FileIndexLow uint32 +} + +const ( + GetFileExInfoStandard = 0 + GetFileExMaxInfoLevel = 1 +) + +type Win32FileAttributeData struct { + FileAttributes uint32 + CreationTime Filetime + LastAccessTime Filetime + LastWriteTime Filetime + FileSizeHigh uint32 + FileSizeLow uint32 +} + +// ShowWindow constants +const ( + // winuser.h + SW_HIDE = 0 + SW_NORMAL = 1 + SW_SHOWNORMAL = 1 + SW_SHOWMINIMIZED = 2 + SW_SHOWMAXIMIZED = 3 + SW_MAXIMIZE = 3 + SW_SHOWNOACTIVATE = 4 + SW_SHOW = 5 + SW_MINIMIZE = 6 + SW_SHOWMINNOACTIVE = 7 + SW_SHOWNA = 8 + SW_RESTORE = 9 + SW_SHOWDEFAULT = 10 + SW_FORCEMINIMIZE = 11 +) + +type StartupInfo struct { + Cb uint32 + _ *uint16 + Desktop *uint16 + Title *uint16 + X uint32 + Y uint32 + XSize uint32 + YSize uint32 + XCountChars uint32 + YCountChars uint32 + FillAttribute uint32 + Flags uint32 + ShowWindow uint16 + _ uint16 + _ *byte + StdInput Handle + StdOutput Handle + StdErr Handle +} + +type ProcessInformation struct { + Process Handle + Thread Handle + ProcessId uint32 + ThreadId uint32 +} + +type ProcessEntry32 struct { + Size uint32 + Usage uint32 + ProcessID uint32 + DefaultHeapID uintptr + ModuleID uint32 + Threads uint32 + ParentProcessID uint32 + PriClassBase int32 + Flags uint32 + ExeFile [MAX_PATH]uint16 +} + +type Systemtime struct { + Year uint16 + Month uint16 + DayOfWeek uint16 + Day uint16 + Hour uint16 + Minute uint16 + Second uint16 + Milliseconds uint16 +} + +type Timezoneinformation struct { + Bias int32 + StandardName [32]uint16 + StandardDate Systemtime + StandardBias int32 + DaylightName [32]uint16 + DaylightDate Systemtime + DaylightBias int32 +} + +// Socket related. + +const ( + AF_UNSPEC = 0 + AF_UNIX = 1 + AF_INET = 2 + AF_INET6 = 23 + AF_NETBIOS = 17 + + SOCK_STREAM = 1 + SOCK_DGRAM = 2 + SOCK_RAW = 3 + SOCK_SEQPACKET = 5 + + IPPROTO_IP = 0 + IPPROTO_IPV6 = 0x29 + IPPROTO_TCP = 6 + IPPROTO_UDP = 17 + + SOL_SOCKET = 0xffff + SO_REUSEADDR = 4 + SO_KEEPALIVE = 8 + SO_DONTROUTE = 16 + SO_BROADCAST = 32 + SO_LINGER = 128 + SO_RCVBUF = 0x1002 + SO_SNDBUF = 0x1001 + SO_UPDATE_ACCEPT_CONTEXT = 0x700b + SO_UPDATE_CONNECT_CONTEXT = 0x7010 + + IOC_OUT = 0x40000000 + IOC_IN = 0x80000000 + IOC_VENDOR = 0x18000000 + IOC_INOUT = IOC_IN | IOC_OUT + IOC_WS2 = 0x08000000 + SIO_GET_EXTENSION_FUNCTION_POINTER = IOC_INOUT | IOC_WS2 | 6 + SIO_KEEPALIVE_VALS = IOC_IN | IOC_VENDOR | 4 + SIO_UDP_CONNRESET = IOC_IN | IOC_VENDOR | 12 + + // cf. http://support.microsoft.com/default.aspx?scid=kb;en-us;257460 + + IP_TOS = 0x3 + IP_TTL = 0x4 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_LOOP = 0xb + IP_ADD_MEMBERSHIP = 0xc + IP_DROP_MEMBERSHIP = 0xd + + IPV6_V6ONLY = 0x1b + IPV6_UNICAST_HOPS = 0x4 + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_LOOP = 0xb + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_DONTROUTE = 0x4 + MSG_WAITALL = 0x8 + + MSG_TRUNC = 0x0100 + MSG_CTRUNC = 0x0200 + MSG_BCAST = 0x0400 + MSG_MCAST = 0x0800 + + SOMAXCONN = 0x7fffffff + + TCP_NODELAY = 1 + + SHUT_RD = 0 + SHUT_WR = 1 + SHUT_RDWR = 2 + + WSADESCRIPTION_LEN = 256 + WSASYS_STATUS_LEN = 128 +) + +type WSABuf struct { + Len uint32 + Buf *byte +} + +type WSAMsg struct { + Name *syscall.RawSockaddrAny + Namelen int32 + Buffers *WSABuf + BufferCount uint32 + Control WSABuf + Flags uint32 +} + +// Invented values to support what package os expects. +const ( + S_IFMT = 0x1f000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 + S_ISUID = 0x800 + S_ISGID = 0x400 + S_ISVTX = 0x200 + S_IRUSR = 0x100 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXUSR = 0x40 +) + +const ( + FILE_TYPE_CHAR = 0x0002 + FILE_TYPE_DISK = 0x0001 + FILE_TYPE_PIPE = 0x0003 + FILE_TYPE_REMOTE = 0x8000 + FILE_TYPE_UNKNOWN = 0x0000 +) + +type Hostent struct { + Name *byte + Aliases **byte + AddrType uint16 + Length uint16 + AddrList **byte +} + +type Protoent struct { + Name *byte + Aliases **byte + Proto uint16 +} + +const ( + DNS_TYPE_A = 0x0001 + DNS_TYPE_NS = 0x0002 + DNS_TYPE_MD = 0x0003 + DNS_TYPE_MF = 0x0004 + DNS_TYPE_CNAME = 0x0005 + DNS_TYPE_SOA = 0x0006 + DNS_TYPE_MB = 0x0007 + DNS_TYPE_MG = 0x0008 + DNS_TYPE_MR = 0x0009 + DNS_TYPE_NULL = 0x000a + DNS_TYPE_WKS = 0x000b + DNS_TYPE_PTR = 0x000c + DNS_TYPE_HINFO = 0x000d + DNS_TYPE_MINFO = 0x000e + DNS_TYPE_MX = 0x000f + DNS_TYPE_TEXT = 0x0010 + DNS_TYPE_RP = 0x0011 + DNS_TYPE_AFSDB = 0x0012 + DNS_TYPE_X25 = 0x0013 + DNS_TYPE_ISDN = 0x0014 + DNS_TYPE_RT = 0x0015 + DNS_TYPE_NSAP = 0x0016 + DNS_TYPE_NSAPPTR = 0x0017 + DNS_TYPE_SIG = 0x0018 + DNS_TYPE_KEY = 0x0019 + DNS_TYPE_PX = 0x001a + DNS_TYPE_GPOS = 0x001b + DNS_TYPE_AAAA = 0x001c + DNS_TYPE_LOC = 0x001d + DNS_TYPE_NXT = 0x001e + DNS_TYPE_EID = 0x001f + DNS_TYPE_NIMLOC = 0x0020 + DNS_TYPE_SRV = 0x0021 + DNS_TYPE_ATMA = 0x0022 + DNS_TYPE_NAPTR = 0x0023 + DNS_TYPE_KX = 0x0024 + DNS_TYPE_CERT = 0x0025 + DNS_TYPE_A6 = 0x0026 + DNS_TYPE_DNAME = 0x0027 + DNS_TYPE_SINK = 0x0028 + DNS_TYPE_OPT = 0x0029 + DNS_TYPE_DS = 0x002B + DNS_TYPE_RRSIG = 0x002E + DNS_TYPE_NSEC = 0x002F + DNS_TYPE_DNSKEY = 0x0030 + DNS_TYPE_DHCID = 0x0031 + DNS_TYPE_UINFO = 0x0064 + DNS_TYPE_UID = 0x0065 + DNS_TYPE_GID = 0x0066 + DNS_TYPE_UNSPEC = 0x0067 + DNS_TYPE_ADDRS = 0x00f8 + DNS_TYPE_TKEY = 0x00f9 + DNS_TYPE_TSIG = 0x00fa + DNS_TYPE_IXFR = 0x00fb + DNS_TYPE_AXFR = 0x00fc + DNS_TYPE_MAILB = 0x00fd + DNS_TYPE_MAILA = 0x00fe + DNS_TYPE_ALL = 0x00ff + DNS_TYPE_ANY = 0x00ff + DNS_TYPE_WINS = 0xff01 + DNS_TYPE_WINSR = 0xff02 + DNS_TYPE_NBSTAT = 0xff01 +) + +const ( + DNS_INFO_NO_RECORDS = 0x251D +) + +const ( + // flags inside DNSRecord.Dw + DnsSectionQuestion = 0x0000 + DnsSectionAnswer = 0x0001 + DnsSectionAuthority = 0x0002 + DnsSectionAdditional = 0x0003 +) + +type DNSSRVData struct { + Target *uint16 + Priority uint16 + Weight uint16 + Port uint16 + Pad uint16 +} + +type DNSPTRData struct { + Host *uint16 +} + +type DNSMXData struct { + NameExchange *uint16 + Preference uint16 + Pad uint16 +} + +type DNSTXTData struct { + StringCount uint16 + StringArray [1]*uint16 +} + +type DNSRecord struct { + Next *DNSRecord + Name *uint16 + Type uint16 + Length uint16 + Dw uint32 + Ttl uint32 + Reserved uint32 + Data [40]byte +} + +const ( + TF_DISCONNECT = 1 + TF_REUSE_SOCKET = 2 + TF_WRITE_BEHIND = 4 + TF_USE_DEFAULT_WORKER = 0 + TF_USE_SYSTEM_THREAD = 16 + TF_USE_KERNEL_APC = 32 +) + +type TransmitFileBuffers struct { + Head uintptr + HeadLength uint32 + Tail uintptr + TailLength uint32 +} + +const ( + IFF_UP = 1 + IFF_BROADCAST = 2 + IFF_LOOPBACK = 4 + IFF_POINTTOPOINT = 8 + IFF_MULTICAST = 16 +) + +const SIO_GET_INTERFACE_LIST = 0x4004747F + +// TODO(mattn): SockaddrGen is union of sockaddr/sockaddr_in/sockaddr_in6_old. +// will be fixed to change variable type as suitable. + +type SockaddrGen [24]byte + +type InterfaceInfo struct { + Flags uint32 + Address SockaddrGen + BroadcastAddress SockaddrGen + Netmask SockaddrGen +} + +type IpAddressString struct { + String [16]byte +} + +type IpMaskString IpAddressString + +type IpAddrString struct { + Next *IpAddrString + IpAddress IpAddressString + IpMask IpMaskString + Context uint32 +} + +const MAX_ADAPTER_NAME_LENGTH = 256 +const MAX_ADAPTER_DESCRIPTION_LENGTH = 128 +const MAX_ADAPTER_ADDRESS_LENGTH = 8 + +type IpAdapterInfo struct { + Next *IpAdapterInfo + ComboIndex uint32 + AdapterName [MAX_ADAPTER_NAME_LENGTH + 4]byte + Description [MAX_ADAPTER_DESCRIPTION_LENGTH + 4]byte + AddressLength uint32 + Address [MAX_ADAPTER_ADDRESS_LENGTH]byte + Index uint32 + Type uint32 + DhcpEnabled uint32 + CurrentIpAddress *IpAddrString + IpAddressList IpAddrString + GatewayList IpAddrString + DhcpServer IpAddrString + HaveWins bool + PrimaryWinsServer IpAddrString + SecondaryWinsServer IpAddrString + LeaseObtained int64 + LeaseExpires int64 +} + +const MAXLEN_PHYSADDR = 8 +const MAX_INTERFACE_NAME_LEN = 256 +const MAXLEN_IFDESCR = 256 + +type MibIfRow struct { + Name [MAX_INTERFACE_NAME_LEN]uint16 + Index uint32 + Type uint32 + Mtu uint32 + Speed uint32 + PhysAddrLen uint32 + PhysAddr [MAXLEN_PHYSADDR]byte + AdminStatus uint32 + OperStatus uint32 + LastChange uint32 + InOctets uint32 + InUcastPkts uint32 + InNUcastPkts uint32 + InDiscards uint32 + InErrors uint32 + InUnknownProtos uint32 + OutOctets uint32 + OutUcastPkts uint32 + OutNUcastPkts uint32 + OutDiscards uint32 + OutErrors uint32 + OutQLen uint32 + DescrLen uint32 + Descr [MAXLEN_IFDESCR]byte +} + +type CertContext struct { + EncodingType uint32 + EncodedCert *byte + Length uint32 + CertInfo uintptr + Store Handle +} + +type CertChainContext struct { + Size uint32 + TrustStatus CertTrustStatus + ChainCount uint32 + Chains **CertSimpleChain + LowerQualityChainCount uint32 + LowerQualityChains **CertChainContext + HasRevocationFreshnessTime uint32 + RevocationFreshnessTime uint32 +} + +type CertSimpleChain struct { + Size uint32 + TrustStatus CertTrustStatus + NumElements uint32 + Elements **CertChainElement + TrustListInfo uintptr + HasRevocationFreshnessTime uint32 + RevocationFreshnessTime uint32 +} + +type CertChainElement struct { + Size uint32 + CertContext *CertContext + TrustStatus CertTrustStatus + RevocationInfo *CertRevocationInfo + IssuanceUsage *CertEnhKeyUsage + ApplicationUsage *CertEnhKeyUsage + ExtendedErrorInfo *uint16 +} + +type CertRevocationInfo struct { + Size uint32 + RevocationResult uint32 + RevocationOid *byte + OidSpecificInfo uintptr + HasFreshnessTime uint32 + FreshnessTime uint32 + CrlInfo uintptr // *CertRevocationCrlInfo +} + +type CertTrustStatus struct { + ErrorStatus uint32 + InfoStatus uint32 +} + +type CertUsageMatch struct { + Type uint32 + Usage CertEnhKeyUsage +} + +type CertEnhKeyUsage struct { + Length uint32 + UsageIdentifiers **byte +} + +type CertChainPara struct { + Size uint32 + RequestedUsage CertUsageMatch + RequstedIssuancePolicy CertUsageMatch + URLRetrievalTimeout uint32 + CheckRevocationFreshnessTime uint32 + RevocationFreshnessTime uint32 + CacheResync *Filetime +} + +type CertChainPolicyPara struct { + Size uint32 + Flags uint32 + ExtraPolicyPara uintptr +} + +type SSLExtraCertChainPolicyPara struct { + Size uint32 + AuthType uint32 + Checks uint32 + ServerName *uint16 +} + +type CertChainPolicyStatus struct { + Size uint32 + Error uint32 + ChainIndex uint32 + ElementIndex uint32 + ExtraPolicyStatus uintptr +} + +const ( + // do not reorder + HKEY_CLASSES_ROOT = 0x80000000 + iota + HKEY_CURRENT_USER + HKEY_LOCAL_MACHINE + HKEY_USERS + HKEY_PERFORMANCE_DATA + HKEY_CURRENT_CONFIG + HKEY_DYN_DATA + + KEY_QUERY_VALUE = 1 + KEY_SET_VALUE = 2 + KEY_CREATE_SUB_KEY = 4 + KEY_ENUMERATE_SUB_KEYS = 8 + KEY_NOTIFY = 16 + KEY_CREATE_LINK = 32 + KEY_WRITE = 0x20006 + KEY_EXECUTE = 0x20019 + KEY_READ = 0x20019 + KEY_WOW64_64KEY = 0x0100 + KEY_WOW64_32KEY = 0x0200 + KEY_ALL_ACCESS = 0xf003f +) + +const ( + // do not reorder + REG_NONE = iota + REG_SZ + REG_EXPAND_SZ + REG_BINARY + REG_DWORD_LITTLE_ENDIAN + REG_DWORD_BIG_ENDIAN + REG_LINK + REG_MULTI_SZ + REG_RESOURCE_LIST + REG_FULL_RESOURCE_DESCRIPTOR + REG_RESOURCE_REQUIREMENTS_LIST + REG_QWORD_LITTLE_ENDIAN + REG_DWORD = REG_DWORD_LITTLE_ENDIAN + REG_QWORD = REG_QWORD_LITTLE_ENDIAN +) + +type AddrinfoW struct { + Flags int32 + Family int32 + Socktype int32 + Protocol int32 + Addrlen uintptr + Canonname *uint16 + Addr uintptr + Next *AddrinfoW +} + +const ( + AI_PASSIVE = 1 + AI_CANONNAME = 2 + AI_NUMERICHOST = 4 +) + +type GUID struct { + Data1 uint32 + Data2 uint16 + Data3 uint16 + Data4 [8]byte +} + +var WSAID_CONNECTEX = GUID{ + 0x25a207b9, + 0xddf3, + 0x4660, + [8]byte{0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e}, +} + +var WSAID_WSASENDMSG = GUID{ + 0xa441e712, + 0x754f, + 0x43ca, + [8]byte{0x84, 0xa7, 0x0d, 0xee, 0x44, 0xcf, 0x60, 0x6d}, +} + +var WSAID_WSARECVMSG = GUID{ + 0xf689d7c8, + 0x6f1f, + 0x436b, + [8]byte{0x8a, 0x53, 0xe5, 0x4f, 0xe3, 0x51, 0xc3, 0x22}, +} + +const ( + FILE_SKIP_COMPLETION_PORT_ON_SUCCESS = 1 + FILE_SKIP_SET_EVENT_ON_HANDLE = 2 +) + +const ( + WSAPROTOCOL_LEN = 255 + MAX_PROTOCOL_CHAIN = 7 + BASE_PROTOCOL = 1 + LAYERED_PROTOCOL = 0 + + XP1_CONNECTIONLESS = 0x00000001 + XP1_GUARANTEED_DELIVERY = 0x00000002 + XP1_GUARANTEED_ORDER = 0x00000004 + XP1_MESSAGE_ORIENTED = 0x00000008 + XP1_PSEUDO_STREAM = 0x00000010 + XP1_GRACEFUL_CLOSE = 0x00000020 + XP1_EXPEDITED_DATA = 0x00000040 + XP1_CONNECT_DATA = 0x00000080 + XP1_DISCONNECT_DATA = 0x00000100 + XP1_SUPPORT_BROADCAST = 0x00000200 + XP1_SUPPORT_MULTIPOINT = 0x00000400 + XP1_MULTIPOINT_CONTROL_PLANE = 0x00000800 + XP1_MULTIPOINT_DATA_PLANE = 0x00001000 + XP1_QOS_SUPPORTED = 0x00002000 + XP1_UNI_SEND = 0x00008000 + XP1_UNI_RECV = 0x00010000 + XP1_IFS_HANDLES = 0x00020000 + XP1_PARTIAL_MESSAGE = 0x00040000 + XP1_SAN_SUPPORT_SDP = 0x00080000 + + PFL_MULTIPLE_PROTO_ENTRIES = 0x00000001 + PFL_RECOMMENDED_PROTO_ENTRY = 0x00000002 + PFL_HIDDEN = 0x00000004 + PFL_MATCHES_PROTOCOL_ZERO = 0x00000008 + PFL_NETWORKDIRECT_PROVIDER = 0x00000010 +) + +type WSAProtocolInfo struct { + ServiceFlags1 uint32 + ServiceFlags2 uint32 + ServiceFlags3 uint32 + ServiceFlags4 uint32 + ProviderFlags uint32 + ProviderId GUID + CatalogEntryId uint32 + ProtocolChain WSAProtocolChain + Version int32 + AddressFamily int32 + MaxSockAddr int32 + MinSockAddr int32 + SocketType int32 + Protocol int32 + ProtocolMaxOffset int32 + NetworkByteOrder int32 + SecurityScheme int32 + MessageSize uint32 + ProviderReserved uint32 + ProtocolName [WSAPROTOCOL_LEN + 1]uint16 +} + +type WSAProtocolChain struct { + ChainLen int32 + ChainEntries [MAX_PROTOCOL_CHAIN]uint32 +} + +type TCPKeepalive struct { + OnOff uint32 + Time uint32 + Interval uint32 +} + +type symbolicLinkReparseBuffer struct { + SubstituteNameOffset uint16 + SubstituteNameLength uint16 + PrintNameOffset uint16 + PrintNameLength uint16 + Flags uint32 + PathBuffer [1]uint16 +} + +type mountPointReparseBuffer struct { + SubstituteNameOffset uint16 + SubstituteNameLength uint16 + PrintNameOffset uint16 + PrintNameLength uint16 + PathBuffer [1]uint16 +} + +type reparseDataBuffer struct { + ReparseTag uint32 + ReparseDataLength uint16 + Reserved uint16 + + // GenericReparseBuffer + reparseBuffer byte +} + +const ( + FSCTL_GET_REPARSE_POINT = 0x900A8 + MAXIMUM_REPARSE_DATA_BUFFER_SIZE = 16 * 1024 + IO_REPARSE_TAG_MOUNT_POINT = 0xA0000003 + IO_REPARSE_TAG_SYMLINK = 0xA000000C + SYMBOLIC_LINK_FLAG_DIRECTORY = 0x1 +) + +const ( + ComputerNameNetBIOS = 0 + ComputerNameDnsHostname = 1 + ComputerNameDnsDomain = 2 + ComputerNameDnsFullyQualified = 3 + ComputerNamePhysicalNetBIOS = 4 + ComputerNamePhysicalDnsHostname = 5 + ComputerNamePhysicalDnsDomain = 6 + ComputerNamePhysicalDnsFullyQualified = 7 + ComputerNameMax = 8 +) + +const ( + MOVEFILE_REPLACE_EXISTING = 0x1 + MOVEFILE_COPY_ALLOWED = 0x2 + MOVEFILE_DELAY_UNTIL_REBOOT = 0x4 + MOVEFILE_WRITE_THROUGH = 0x8 + MOVEFILE_CREATE_HARDLINK = 0x10 + MOVEFILE_FAIL_IF_NOT_TRACKABLE = 0x20 +) + +const GAA_FLAG_INCLUDE_PREFIX = 0x00000010 + +const ( + IF_TYPE_OTHER = 1 + IF_TYPE_ETHERNET_CSMACD = 6 + IF_TYPE_ISO88025_TOKENRING = 9 + IF_TYPE_PPP = 23 + IF_TYPE_SOFTWARE_LOOPBACK = 24 + IF_TYPE_ATM = 37 + IF_TYPE_IEEE80211 = 71 + IF_TYPE_TUNNEL = 131 + IF_TYPE_IEEE1394 = 144 +) + +type SocketAddress struct { + Sockaddr *syscall.RawSockaddrAny + SockaddrLength int32 +} + +type IpAdapterUnicastAddress struct { + Length uint32 + Flags uint32 + Next *IpAdapterUnicastAddress + Address SocketAddress + PrefixOrigin int32 + SuffixOrigin int32 + DadState int32 + ValidLifetime uint32 + PreferredLifetime uint32 + LeaseLifetime uint32 + OnLinkPrefixLength uint8 +} + +type IpAdapterAnycastAddress struct { + Length uint32 + Flags uint32 + Next *IpAdapterAnycastAddress + Address SocketAddress +} + +type IpAdapterMulticastAddress struct { + Length uint32 + Flags uint32 + Next *IpAdapterMulticastAddress + Address SocketAddress +} + +type IpAdapterDnsServerAdapter struct { + Length uint32 + Reserved uint32 + Next *IpAdapterDnsServerAdapter + Address SocketAddress +} + +type IpAdapterPrefix struct { + Length uint32 + Flags uint32 + Next *IpAdapterPrefix + Address SocketAddress + PrefixLength uint32 +} + +type IpAdapterAddresses struct { + Length uint32 + IfIndex uint32 + Next *IpAdapterAddresses + AdapterName *byte + FirstUnicastAddress *IpAdapterUnicastAddress + FirstAnycastAddress *IpAdapterAnycastAddress + FirstMulticastAddress *IpAdapterMulticastAddress + FirstDnsServerAddress *IpAdapterDnsServerAdapter + DnsSuffix *uint16 + Description *uint16 + FriendlyName *uint16 + PhysicalAddress [syscall.MAX_ADAPTER_ADDRESS_LENGTH]byte + PhysicalAddressLength uint32 + Flags uint32 + Mtu uint32 + IfType uint32 + OperStatus uint32 + Ipv6IfIndex uint32 + ZoneIndices [16]uint32 + FirstPrefix *IpAdapterPrefix + /* more fields might be present here. */ +} + +const ( + IfOperStatusUp = 1 + IfOperStatusDown = 2 + IfOperStatusTesting = 3 + IfOperStatusUnknown = 4 + IfOperStatusDormant = 5 + IfOperStatusNotPresent = 6 + IfOperStatusLowerLayerDown = 7 +) + +// Console related constants used for the mode parameter to SetConsoleMode. See +// https://docs.microsoft.com/en-us/windows/console/setconsolemode for details. + +const ( + ENABLE_PROCESSED_INPUT = 0x1 + ENABLE_LINE_INPUT = 0x2 + ENABLE_ECHO_INPUT = 0x4 + ENABLE_WINDOW_INPUT = 0x8 + ENABLE_MOUSE_INPUT = 0x10 + ENABLE_INSERT_MODE = 0x20 + ENABLE_QUICK_EDIT_MODE = 0x40 + ENABLE_EXTENDED_FLAGS = 0x80 + ENABLE_AUTO_POSITION = 0x100 + ENABLE_VIRTUAL_TERMINAL_INPUT = 0x200 + + ENABLE_PROCESSED_OUTPUT = 0x1 + ENABLE_WRAP_AT_EOL_OUTPUT = 0x2 + ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x4 + DISABLE_NEWLINE_AUTO_RETURN = 0x8 + ENABLE_LVB_GRID_WORLDWIDE = 0x10 +) + +type Coord struct { + X int16 + Y int16 +} + +type SmallRect struct { + Left int16 + Top int16 + Right int16 + Bottom int16 +} + +// Used with GetConsoleScreenBuffer to retreive information about a console +// screen buffer. See +// https://docs.microsoft.com/en-us/windows/console/console-screen-buffer-info-str +// for details. + +type ConsoleScreenBufferInfo struct { + Size Coord + CursorPosition Coord + Attributes uint16 + Window SmallRect + MaximumWindowSize Coord +} diff --git a/api/vendor/golang.org/x/sys/windows/types_windows_386.go b/api/vendor/golang.org/x/sys/windows/types_windows_386.go new file mode 100644 index 0000000..fe0ddd0 --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/types_windows_386.go @@ -0,0 +1,22 @@ +// 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 windows + +type WSAData struct { + Version uint16 + HighVersion uint16 + Description [WSADESCRIPTION_LEN + 1]byte + SystemStatus [WSASYS_STATUS_LEN + 1]byte + MaxSockets uint16 + MaxUdpDg uint16 + VendorInfo *byte +} + +type Servent struct { + Name *byte + Aliases **byte + Port uint16 + Proto *byte +} diff --git a/api/vendor/golang.org/x/sys/windows/types_windows_amd64.go b/api/vendor/golang.org/x/sys/windows/types_windows_amd64.go new file mode 100644 index 0000000..7e154c2 --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/types_windows_amd64.go @@ -0,0 +1,22 @@ +// 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 windows + +type WSAData struct { + Version uint16 + HighVersion uint16 + MaxSockets uint16 + MaxUdpDg uint16 + VendorInfo *byte + Description [WSADESCRIPTION_LEN + 1]byte + SystemStatus [WSASYS_STATUS_LEN + 1]byte +} + +type Servent struct { + Name *byte + Aliases **byte + Proto *byte + Port uint16 +} diff --git a/api/vendor/golang.org/x/sys/windows/zsyscall_windows.go b/api/vendor/golang.org/x/sys/windows/zsyscall_windows.go new file mode 100644 index 0000000..318c616 --- /dev/null +++ b/api/vendor/golang.org/x/sys/windows/zsyscall_windows.go @@ -0,0 +1,2700 @@ +// MACHINE GENERATED BY 'go generate' COMMAND; DO NOT EDIT + +package windows + +import ( + "syscall" + "unsafe" +) + +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) +) + +// errnoErr returns common boxed Errno values, to prevent +// allocations at runtime. +func errnoErr(e syscall.Errno) error { + switch e { + case 0: + return nil + 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 = NewLazySystemDLL("advapi32.dll") + modkernel32 = NewLazySystemDLL("kernel32.dll") + modshell32 = NewLazySystemDLL("shell32.dll") + modmswsock = NewLazySystemDLL("mswsock.dll") + modcrypt32 = NewLazySystemDLL("crypt32.dll") + modws2_32 = NewLazySystemDLL("ws2_32.dll") + moddnsapi = NewLazySystemDLL("dnsapi.dll") + modiphlpapi = NewLazySystemDLL("iphlpapi.dll") + modsecur32 = NewLazySystemDLL("secur32.dll") + modnetapi32 = NewLazySystemDLL("netapi32.dll") + moduserenv = NewLazySystemDLL("userenv.dll") + + procRegisterEventSourceW = modadvapi32.NewProc("RegisterEventSourceW") + procDeregisterEventSource = modadvapi32.NewProc("DeregisterEventSource") + procReportEventW = modadvapi32.NewProc("ReportEventW") + procOpenSCManagerW = modadvapi32.NewProc("OpenSCManagerW") + procCloseServiceHandle = modadvapi32.NewProc("CloseServiceHandle") + procCreateServiceW = modadvapi32.NewProc("CreateServiceW") + procOpenServiceW = modadvapi32.NewProc("OpenServiceW") + procDeleteService = modadvapi32.NewProc("DeleteService") + procStartServiceW = modadvapi32.NewProc("StartServiceW") + procQueryServiceStatus = modadvapi32.NewProc("QueryServiceStatus") + procControlService = modadvapi32.NewProc("ControlService") + procStartServiceCtrlDispatcherW = modadvapi32.NewProc("StartServiceCtrlDispatcherW") + procSetServiceStatus = modadvapi32.NewProc("SetServiceStatus") + procChangeServiceConfigW = modadvapi32.NewProc("ChangeServiceConfigW") + procQueryServiceConfigW = modadvapi32.NewProc("QueryServiceConfigW") + procChangeServiceConfig2W = modadvapi32.NewProc("ChangeServiceConfig2W") + procQueryServiceConfig2W = modadvapi32.NewProc("QueryServiceConfig2W") + procEnumServicesStatusExW = modadvapi32.NewProc("EnumServicesStatusExW") + procQueryServiceStatusEx = modadvapi32.NewProc("QueryServiceStatusEx") + procGetLastError = modkernel32.NewProc("GetLastError") + procLoadLibraryW = modkernel32.NewProc("LoadLibraryW") + procLoadLibraryExW = modkernel32.NewProc("LoadLibraryExW") + procFreeLibrary = modkernel32.NewProc("FreeLibrary") + procGetProcAddress = modkernel32.NewProc("GetProcAddress") + procGetVersion = modkernel32.NewProc("GetVersion") + procFormatMessageW = modkernel32.NewProc("FormatMessageW") + procExitProcess = modkernel32.NewProc("ExitProcess") + procCreateFileW = modkernel32.NewProc("CreateFileW") + procReadFile = modkernel32.NewProc("ReadFile") + procWriteFile = modkernel32.NewProc("WriteFile") + procSetFilePointer = modkernel32.NewProc("SetFilePointer") + procCloseHandle = modkernel32.NewProc("CloseHandle") + procGetStdHandle = modkernel32.NewProc("GetStdHandle") + procSetStdHandle = modkernel32.NewProc("SetStdHandle") + procFindFirstFileW = modkernel32.NewProc("FindFirstFileW") + procFindNextFileW = modkernel32.NewProc("FindNextFileW") + procFindClose = modkernel32.NewProc("FindClose") + procGetFileInformationByHandle = modkernel32.NewProc("GetFileInformationByHandle") + procGetCurrentDirectoryW = modkernel32.NewProc("GetCurrentDirectoryW") + procSetCurrentDirectoryW = modkernel32.NewProc("SetCurrentDirectoryW") + procCreateDirectoryW = modkernel32.NewProc("CreateDirectoryW") + procRemoveDirectoryW = modkernel32.NewProc("RemoveDirectoryW") + procDeleteFileW = modkernel32.NewProc("DeleteFileW") + procMoveFileW = modkernel32.NewProc("MoveFileW") + procMoveFileExW = modkernel32.NewProc("MoveFileExW") + procGetComputerNameW = modkernel32.NewProc("GetComputerNameW") + procGetComputerNameExW = modkernel32.NewProc("GetComputerNameExW") + procSetEndOfFile = modkernel32.NewProc("SetEndOfFile") + procGetSystemTimeAsFileTime = modkernel32.NewProc("GetSystemTimeAsFileTime") + procGetSystemTimePreciseAsFileTime = modkernel32.NewProc("GetSystemTimePreciseAsFileTime") + procGetTimeZoneInformation = modkernel32.NewProc("GetTimeZoneInformation") + procCreateIoCompletionPort = modkernel32.NewProc("CreateIoCompletionPort") + procGetQueuedCompletionStatus = modkernel32.NewProc("GetQueuedCompletionStatus") + procPostQueuedCompletionStatus = modkernel32.NewProc("PostQueuedCompletionStatus") + procCancelIo = modkernel32.NewProc("CancelIo") + procCancelIoEx = modkernel32.NewProc("CancelIoEx") + procCreateProcessW = modkernel32.NewProc("CreateProcessW") + procOpenProcess = modkernel32.NewProc("OpenProcess") + procTerminateProcess = modkernel32.NewProc("TerminateProcess") + procGetExitCodeProcess = modkernel32.NewProc("GetExitCodeProcess") + procGetStartupInfoW = modkernel32.NewProc("GetStartupInfoW") + procGetCurrentProcess = modkernel32.NewProc("GetCurrentProcess") + procGetProcessTimes = modkernel32.NewProc("GetProcessTimes") + procDuplicateHandle = modkernel32.NewProc("DuplicateHandle") + procWaitForSingleObject = modkernel32.NewProc("WaitForSingleObject") + procGetTempPathW = modkernel32.NewProc("GetTempPathW") + procCreatePipe = modkernel32.NewProc("CreatePipe") + procGetFileType = modkernel32.NewProc("GetFileType") + procCryptAcquireContextW = modadvapi32.NewProc("CryptAcquireContextW") + procCryptReleaseContext = modadvapi32.NewProc("CryptReleaseContext") + procCryptGenRandom = modadvapi32.NewProc("CryptGenRandom") + procGetEnvironmentStringsW = modkernel32.NewProc("GetEnvironmentStringsW") + procFreeEnvironmentStringsW = modkernel32.NewProc("FreeEnvironmentStringsW") + procGetEnvironmentVariableW = modkernel32.NewProc("GetEnvironmentVariableW") + procSetEnvironmentVariableW = modkernel32.NewProc("SetEnvironmentVariableW") + procSetFileTime = modkernel32.NewProc("SetFileTime") + procGetFileAttributesW = modkernel32.NewProc("GetFileAttributesW") + procSetFileAttributesW = modkernel32.NewProc("SetFileAttributesW") + procGetFileAttributesExW = modkernel32.NewProc("GetFileAttributesExW") + procGetCommandLineW = modkernel32.NewProc("GetCommandLineW") + procCommandLineToArgvW = modshell32.NewProc("CommandLineToArgvW") + procLocalFree = modkernel32.NewProc("LocalFree") + procSetHandleInformation = modkernel32.NewProc("SetHandleInformation") + procFlushFileBuffers = modkernel32.NewProc("FlushFileBuffers") + procGetFullPathNameW = modkernel32.NewProc("GetFullPathNameW") + procGetLongPathNameW = modkernel32.NewProc("GetLongPathNameW") + procGetShortPathNameW = modkernel32.NewProc("GetShortPathNameW") + procCreateFileMappingW = modkernel32.NewProc("CreateFileMappingW") + procMapViewOfFile = modkernel32.NewProc("MapViewOfFile") + procUnmapViewOfFile = modkernel32.NewProc("UnmapViewOfFile") + procFlushViewOfFile = modkernel32.NewProc("FlushViewOfFile") + procVirtualLock = modkernel32.NewProc("VirtualLock") + procVirtualUnlock = modkernel32.NewProc("VirtualUnlock") + procVirtualAlloc = modkernel32.NewProc("VirtualAlloc") + procVirtualFree = modkernel32.NewProc("VirtualFree") + procVirtualProtect = modkernel32.NewProc("VirtualProtect") + procTransmitFile = modmswsock.NewProc("TransmitFile") + procReadDirectoryChangesW = modkernel32.NewProc("ReadDirectoryChangesW") + procCertOpenSystemStoreW = modcrypt32.NewProc("CertOpenSystemStoreW") + procCertOpenStore = modcrypt32.NewProc("CertOpenStore") + procCertEnumCertificatesInStore = modcrypt32.NewProc("CertEnumCertificatesInStore") + procCertAddCertificateContextToStore = modcrypt32.NewProc("CertAddCertificateContextToStore") + procCertCloseStore = modcrypt32.NewProc("CertCloseStore") + procCertGetCertificateChain = modcrypt32.NewProc("CertGetCertificateChain") + procCertFreeCertificateChain = modcrypt32.NewProc("CertFreeCertificateChain") + procCertCreateCertificateContext = modcrypt32.NewProc("CertCreateCertificateContext") + procCertFreeCertificateContext = modcrypt32.NewProc("CertFreeCertificateContext") + procCertVerifyCertificateChainPolicy = modcrypt32.NewProc("CertVerifyCertificateChainPolicy") + procRegOpenKeyExW = modadvapi32.NewProc("RegOpenKeyExW") + procRegCloseKey = modadvapi32.NewProc("RegCloseKey") + procRegQueryInfoKeyW = modadvapi32.NewProc("RegQueryInfoKeyW") + procRegEnumKeyExW = modadvapi32.NewProc("RegEnumKeyExW") + procRegQueryValueExW = modadvapi32.NewProc("RegQueryValueExW") + procGetCurrentProcessId = modkernel32.NewProc("GetCurrentProcessId") + procGetConsoleMode = modkernel32.NewProc("GetConsoleMode") + procSetConsoleMode = modkernel32.NewProc("SetConsoleMode") + procGetConsoleScreenBufferInfo = modkernel32.NewProc("GetConsoleScreenBufferInfo") + procWriteConsoleW = modkernel32.NewProc("WriteConsoleW") + procReadConsoleW = modkernel32.NewProc("ReadConsoleW") + procCreateToolhelp32Snapshot = modkernel32.NewProc("CreateToolhelp32Snapshot") + procProcess32FirstW = modkernel32.NewProc("Process32FirstW") + procProcess32NextW = modkernel32.NewProc("Process32NextW") + procDeviceIoControl = modkernel32.NewProc("DeviceIoControl") + procCreateSymbolicLinkW = modkernel32.NewProc("CreateSymbolicLinkW") + procCreateHardLinkW = modkernel32.NewProc("CreateHardLinkW") + procGetCurrentThreadId = modkernel32.NewProc("GetCurrentThreadId") + procCreateEventW = modkernel32.NewProc("CreateEventW") + procCreateEventExW = modkernel32.NewProc("CreateEventExW") + procOpenEventW = modkernel32.NewProc("OpenEventW") + procSetEvent = modkernel32.NewProc("SetEvent") + procResetEvent = modkernel32.NewProc("ResetEvent") + procPulseEvent = modkernel32.NewProc("PulseEvent") + procDefineDosDeviceW = modkernel32.NewProc("DefineDosDeviceW") + procDeleteVolumeMountPointW = modkernel32.NewProc("DeleteVolumeMountPointW") + procFindFirstVolumeW = modkernel32.NewProc("FindFirstVolumeW") + procFindFirstVolumeMountPointW = modkernel32.NewProc("FindFirstVolumeMountPointW") + procFindNextVolumeW = modkernel32.NewProc("FindNextVolumeW") + procFindNextVolumeMountPointW = modkernel32.NewProc("FindNextVolumeMountPointW") + procFindVolumeClose = modkernel32.NewProc("FindVolumeClose") + procFindVolumeMountPointClose = modkernel32.NewProc("FindVolumeMountPointClose") + procGetDriveTypeW = modkernel32.NewProc("GetDriveTypeW") + procGetLogicalDrives = modkernel32.NewProc("GetLogicalDrives") + procGetLogicalDriveStringsW = modkernel32.NewProc("GetLogicalDriveStringsW") + procGetVolumeInformationW = modkernel32.NewProc("GetVolumeInformationW") + procGetVolumeInformationByHandleW = modkernel32.NewProc("GetVolumeInformationByHandleW") + procGetVolumeNameForVolumeMountPointW = modkernel32.NewProc("GetVolumeNameForVolumeMountPointW") + procGetVolumePathNameW = modkernel32.NewProc("GetVolumePathNameW") + procGetVolumePathNamesForVolumeNameW = modkernel32.NewProc("GetVolumePathNamesForVolumeNameW") + procQueryDosDeviceW = modkernel32.NewProc("QueryDosDeviceW") + procSetVolumeLabelW = modkernel32.NewProc("SetVolumeLabelW") + procSetVolumeMountPointW = modkernel32.NewProc("SetVolumeMountPointW") + procWSAStartup = modws2_32.NewProc("WSAStartup") + procWSACleanup = modws2_32.NewProc("WSACleanup") + procWSAIoctl = modws2_32.NewProc("WSAIoctl") + procsocket = modws2_32.NewProc("socket") + procsetsockopt = modws2_32.NewProc("setsockopt") + procgetsockopt = modws2_32.NewProc("getsockopt") + procbind = modws2_32.NewProc("bind") + procconnect = modws2_32.NewProc("connect") + procgetsockname = modws2_32.NewProc("getsockname") + procgetpeername = modws2_32.NewProc("getpeername") + proclisten = modws2_32.NewProc("listen") + procshutdown = modws2_32.NewProc("shutdown") + procclosesocket = modws2_32.NewProc("closesocket") + procAcceptEx = modmswsock.NewProc("AcceptEx") + procGetAcceptExSockaddrs = modmswsock.NewProc("GetAcceptExSockaddrs") + procWSARecv = modws2_32.NewProc("WSARecv") + procWSASend = modws2_32.NewProc("WSASend") + procWSARecvFrom = modws2_32.NewProc("WSARecvFrom") + procWSASendTo = modws2_32.NewProc("WSASendTo") + procgethostbyname = modws2_32.NewProc("gethostbyname") + procgetservbyname = modws2_32.NewProc("getservbyname") + procntohs = modws2_32.NewProc("ntohs") + procgetprotobyname = modws2_32.NewProc("getprotobyname") + procDnsQuery_W = moddnsapi.NewProc("DnsQuery_W") + procDnsRecordListFree = moddnsapi.NewProc("DnsRecordListFree") + procDnsNameCompare_W = moddnsapi.NewProc("DnsNameCompare_W") + procGetAddrInfoW = modws2_32.NewProc("GetAddrInfoW") + procFreeAddrInfoW = modws2_32.NewProc("FreeAddrInfoW") + procGetIfEntry = modiphlpapi.NewProc("GetIfEntry") + procGetAdaptersInfo = modiphlpapi.NewProc("GetAdaptersInfo") + procSetFileCompletionNotificationModes = modkernel32.NewProc("SetFileCompletionNotificationModes") + procWSAEnumProtocolsW = modws2_32.NewProc("WSAEnumProtocolsW") + procGetAdaptersAddresses = modiphlpapi.NewProc("GetAdaptersAddresses") + procGetACP = modkernel32.NewProc("GetACP") + procMultiByteToWideChar = modkernel32.NewProc("MultiByteToWideChar") + procTranslateNameW = modsecur32.NewProc("TranslateNameW") + procGetUserNameExW = modsecur32.NewProc("GetUserNameExW") + procNetUserGetInfo = modnetapi32.NewProc("NetUserGetInfo") + procNetGetJoinInformation = modnetapi32.NewProc("NetGetJoinInformation") + procNetApiBufferFree = modnetapi32.NewProc("NetApiBufferFree") + procLookupAccountSidW = modadvapi32.NewProc("LookupAccountSidW") + procLookupAccountNameW = modadvapi32.NewProc("LookupAccountNameW") + procConvertSidToStringSidW = modadvapi32.NewProc("ConvertSidToStringSidW") + procConvertStringSidToSidW = modadvapi32.NewProc("ConvertStringSidToSidW") + procGetLengthSid = modadvapi32.NewProc("GetLengthSid") + procCopySid = modadvapi32.NewProc("CopySid") + procAllocateAndInitializeSid = modadvapi32.NewProc("AllocateAndInitializeSid") + procFreeSid = modadvapi32.NewProc("FreeSid") + procEqualSid = modadvapi32.NewProc("EqualSid") + procCheckTokenMembership = modadvapi32.NewProc("CheckTokenMembership") + procOpenProcessToken = modadvapi32.NewProc("OpenProcessToken") + procGetTokenInformation = modadvapi32.NewProc("GetTokenInformation") + procGetUserProfileDirectoryW = moduserenv.NewProc("GetUserProfileDirectoryW") +) + +func RegisterEventSource(uncServerName *uint16, sourceName *uint16) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procRegisterEventSourceW.Addr(), 2, uintptr(unsafe.Pointer(uncServerName)), uintptr(unsafe.Pointer(sourceName)), 0) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func DeregisterEventSource(handle Handle) (err error) { + r1, _, e1 := syscall.Syscall(procDeregisterEventSource.Addr(), 1, uintptr(handle), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ReportEvent(log Handle, etype uint16, category uint16, eventId uint32, usrSId uintptr, numStrings uint16, dataSize uint32, strings **uint16, rawData *byte) (err error) { + r1, _, e1 := syscall.Syscall9(procReportEventW.Addr(), 9, uintptr(log), uintptr(etype), uintptr(category), uintptr(eventId), uintptr(usrSId), uintptr(numStrings), uintptr(dataSize), uintptr(unsafe.Pointer(strings)), uintptr(unsafe.Pointer(rawData))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func OpenSCManager(machineName *uint16, databaseName *uint16, access uint32) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procOpenSCManagerW.Addr(), 3, uintptr(unsafe.Pointer(machineName)), uintptr(unsafe.Pointer(databaseName)), uintptr(access)) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CloseServiceHandle(handle Handle) (err error) { + r1, _, e1 := syscall.Syscall(procCloseServiceHandle.Addr(), 1, uintptr(handle), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreateService(mgr Handle, serviceName *uint16, displayName *uint16, access uint32, srvType uint32, startType uint32, errCtl uint32, pathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall15(procCreateServiceW.Addr(), 13, uintptr(mgr), uintptr(unsafe.Pointer(serviceName)), uintptr(unsafe.Pointer(displayName)), uintptr(access), uintptr(srvType), uintptr(startType), uintptr(errCtl), uintptr(unsafe.Pointer(pathName)), uintptr(unsafe.Pointer(loadOrderGroup)), uintptr(unsafe.Pointer(tagId)), uintptr(unsafe.Pointer(dependencies)), uintptr(unsafe.Pointer(serviceStartName)), uintptr(unsafe.Pointer(password)), 0, 0) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func OpenService(mgr Handle, serviceName *uint16, access uint32) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procOpenServiceW.Addr(), 3, uintptr(mgr), uintptr(unsafe.Pointer(serviceName)), uintptr(access)) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func DeleteService(service Handle) (err error) { + r1, _, e1 := syscall.Syscall(procDeleteService.Addr(), 1, uintptr(service), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func StartService(service Handle, numArgs uint32, argVectors **uint16) (err error) { + r1, _, e1 := syscall.Syscall(procStartServiceW.Addr(), 3, uintptr(service), uintptr(numArgs), uintptr(unsafe.Pointer(argVectors))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func QueryServiceStatus(service Handle, status *SERVICE_STATUS) (err error) { + r1, _, e1 := syscall.Syscall(procQueryServiceStatus.Addr(), 2, uintptr(service), uintptr(unsafe.Pointer(status)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ControlService(service Handle, control uint32, status *SERVICE_STATUS) (err error) { + r1, _, e1 := syscall.Syscall(procControlService.Addr(), 3, uintptr(service), uintptr(control), uintptr(unsafe.Pointer(status))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func StartServiceCtrlDispatcher(serviceTable *SERVICE_TABLE_ENTRY) (err error) { + r1, _, e1 := syscall.Syscall(procStartServiceCtrlDispatcherW.Addr(), 1, uintptr(unsafe.Pointer(serviceTable)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetServiceStatus(service Handle, serviceStatus *SERVICE_STATUS) (err error) { + r1, _, e1 := syscall.Syscall(procSetServiceStatus.Addr(), 2, uintptr(service), uintptr(unsafe.Pointer(serviceStatus)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ChangeServiceConfig(service Handle, serviceType uint32, startType uint32, errorControl uint32, binaryPathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16, displayName *uint16) (err error) { + r1, _, e1 := syscall.Syscall12(procChangeServiceConfigW.Addr(), 11, uintptr(service), uintptr(serviceType), uintptr(startType), uintptr(errorControl), uintptr(unsafe.Pointer(binaryPathName)), uintptr(unsafe.Pointer(loadOrderGroup)), uintptr(unsafe.Pointer(tagId)), uintptr(unsafe.Pointer(dependencies)), uintptr(unsafe.Pointer(serviceStartName)), uintptr(unsafe.Pointer(password)), uintptr(unsafe.Pointer(displayName)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func QueryServiceConfig(service Handle, serviceConfig *QUERY_SERVICE_CONFIG, bufSize uint32, bytesNeeded *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procQueryServiceConfigW.Addr(), 4, uintptr(service), uintptr(unsafe.Pointer(serviceConfig)), uintptr(bufSize), uintptr(unsafe.Pointer(bytesNeeded)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ChangeServiceConfig2(service Handle, infoLevel uint32, info *byte) (err error) { + r1, _, e1 := syscall.Syscall(procChangeServiceConfig2W.Addr(), 3, uintptr(service), uintptr(infoLevel), uintptr(unsafe.Pointer(info))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func QueryServiceConfig2(service Handle, infoLevel uint32, buff *byte, buffSize uint32, bytesNeeded *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procQueryServiceConfig2W.Addr(), 5, uintptr(service), uintptr(infoLevel), uintptr(unsafe.Pointer(buff)), uintptr(buffSize), uintptr(unsafe.Pointer(bytesNeeded)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func EnumServicesStatusEx(mgr Handle, infoLevel uint32, serviceType uint32, serviceState uint32, services *byte, bufSize uint32, bytesNeeded *uint32, servicesReturned *uint32, resumeHandle *uint32, groupName *uint16) (err error) { + r1, _, e1 := syscall.Syscall12(procEnumServicesStatusExW.Addr(), 10, uintptr(mgr), uintptr(infoLevel), uintptr(serviceType), uintptr(serviceState), uintptr(unsafe.Pointer(services)), uintptr(bufSize), uintptr(unsafe.Pointer(bytesNeeded)), uintptr(unsafe.Pointer(servicesReturned)), uintptr(unsafe.Pointer(resumeHandle)), uintptr(unsafe.Pointer(groupName)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func QueryServiceStatusEx(service Handle, infoLevel uint32, buff *byte, buffSize uint32, bytesNeeded *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procQueryServiceStatusEx.Addr(), 5, uintptr(service), uintptr(infoLevel), uintptr(unsafe.Pointer(buff)), uintptr(buffSize), uintptr(unsafe.Pointer(bytesNeeded)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetLastError() (lasterr error) { + r0, _, _ := syscall.Syscall(procGetLastError.Addr(), 0, 0, 0, 0) + if r0 != 0 { + lasterr = syscall.Errno(r0) + } + return +} + +func LoadLibrary(libname string) (handle Handle, err error) { + var _p0 *uint16 + _p0, err = syscall.UTF16PtrFromString(libname) + if err != nil { + return + } + return _LoadLibrary(_p0) +} + +func _LoadLibrary(libname *uint16) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procLoadLibraryW.Addr(), 1, uintptr(unsafe.Pointer(libname)), 0, 0) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func LoadLibraryEx(libname string, zero Handle, flags uintptr) (handle Handle, err error) { + var _p0 *uint16 + _p0, err = syscall.UTF16PtrFromString(libname) + if err != nil { + return + } + return _LoadLibraryEx(_p0, zero, flags) +} + +func _LoadLibraryEx(libname *uint16, zero Handle, flags uintptr) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procLoadLibraryExW.Addr(), 3, uintptr(unsafe.Pointer(libname)), uintptr(zero), uintptr(flags)) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FreeLibrary(handle Handle) (err error) { + r1, _, e1 := syscall.Syscall(procFreeLibrary.Addr(), 1, uintptr(handle), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetProcAddress(module Handle, procname string) (proc uintptr, err error) { + var _p0 *byte + _p0, err = syscall.BytePtrFromString(procname) + if err != nil { + return + } + return _GetProcAddress(module, _p0) +} + +func _GetProcAddress(module Handle, procname *byte) (proc uintptr, err error) { + r0, _, e1 := syscall.Syscall(procGetProcAddress.Addr(), 2, uintptr(module), uintptr(unsafe.Pointer(procname)), 0) + proc = uintptr(r0) + if proc == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetVersion() (ver uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetVersion.Addr(), 0, 0, 0, 0) + ver = uint32(r0) + if ver == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FormatMessage(flags uint32, msgsrc uintptr, msgid uint32, langid uint32, buf []uint16, args *byte) (n uint32, err error) { + var _p0 *uint16 + if len(buf) > 0 { + _p0 = &buf[0] + } + r0, _, e1 := syscall.Syscall9(procFormatMessageW.Addr(), 7, uintptr(flags), uintptr(msgsrc), uintptr(msgid), uintptr(langid), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(unsafe.Pointer(args)), 0, 0) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ExitProcess(exitcode uint32) { + syscall.Syscall(procExitProcess.Addr(), 1, uintptr(exitcode), 0, 0) + return +} + +func CreateFile(name *uint16, access uint32, mode uint32, sa *SecurityAttributes, createmode uint32, attrs uint32, templatefile int32) (handle 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 = Handle(r0) + if handle == InvalidHandle { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ReadFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + r1, _, e1 := syscall.Syscall6(procReadFile.Addr(), 5, uintptr(handle), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(unsafe.Pointer(done)), uintptr(unsafe.Pointer(overlapped)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func WriteFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + r1, _, e1 := syscall.Syscall6(procWriteFile.Addr(), 5, uintptr(handle), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(unsafe.Pointer(done)), uintptr(unsafe.Pointer(overlapped)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetFilePointer(handle Handle, lowoffset int32, highoffsetptr *int32, whence uint32) (newlowoffset uint32, err error) { + r0, _, e1 := syscall.Syscall6(procSetFilePointer.Addr(), 4, uintptr(handle), uintptr(lowoffset), uintptr(unsafe.Pointer(highoffsetptr)), uintptr(whence), 0, 0) + newlowoffset = uint32(r0) + if newlowoffset == 0xffffffff { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CloseHandle(handle Handle) (err error) { + r1, _, e1 := syscall.Syscall(procCloseHandle.Addr(), 1, uintptr(handle), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetStdHandle(stdhandle uint32) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procGetStdHandle.Addr(), 1, uintptr(stdhandle), 0, 0) + handle = Handle(r0) + if handle == InvalidHandle { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetStdHandle(stdhandle uint32, handle Handle) (err error) { + r1, _, e1 := syscall.Syscall(procSetStdHandle.Addr(), 2, uintptr(stdhandle), uintptr(handle), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func findFirstFile1(name *uint16, data *win32finddata1) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procFindFirstFileW.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(data)), 0) + handle = Handle(r0) + if handle == InvalidHandle { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func findNextFile1(handle Handle, data *win32finddata1) (err error) { + r1, _, e1 := syscall.Syscall(procFindNextFileW.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(data)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FindClose(handle Handle) (err error) { + r1, _, e1 := syscall.Syscall(procFindClose.Addr(), 1, uintptr(handle), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetFileInformationByHandle(handle Handle, data *ByHandleFileInformation) (err error) { + r1, _, e1 := syscall.Syscall(procGetFileInformationByHandle.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(data)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetCurrentDirectory(buflen uint32, buf *uint16) (n uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetCurrentDirectoryW.Addr(), 2, uintptr(buflen), uintptr(unsafe.Pointer(buf)), 0) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetCurrentDirectory(path *uint16) (err error) { + r1, _, e1 := syscall.Syscall(procSetCurrentDirectoryW.Addr(), 1, uintptr(unsafe.Pointer(path)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreateDirectory(path *uint16, sa *SecurityAttributes) (err error) { + r1, _, e1 := syscall.Syscall(procCreateDirectoryW.Addr(), 2, uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(sa)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func RemoveDirectory(path *uint16) (err error) { + r1, _, e1 := syscall.Syscall(procRemoveDirectoryW.Addr(), 1, uintptr(unsafe.Pointer(path)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func DeleteFile(path *uint16) (err error) { + r1, _, e1 := syscall.Syscall(procDeleteFileW.Addr(), 1, uintptr(unsafe.Pointer(path)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func MoveFile(from *uint16, to *uint16) (err error) { + r1, _, e1 := syscall.Syscall(procMoveFileW.Addr(), 2, uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(to)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func MoveFileEx(from *uint16, to *uint16, flags uint32) (err error) { + r1, _, e1 := syscall.Syscall(procMoveFileExW.Addr(), 3, uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(to)), uintptr(flags)) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetComputerName(buf *uint16, n *uint32) (err error) { + r1, _, e1 := syscall.Syscall(procGetComputerNameW.Addr(), 2, uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(n)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetComputerNameEx(nametype uint32, buf *uint16, n *uint32) (err error) { + r1, _, e1 := syscall.Syscall(procGetComputerNameExW.Addr(), 3, uintptr(nametype), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(n))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetEndOfFile(handle Handle) (err error) { + r1, _, e1 := syscall.Syscall(procSetEndOfFile.Addr(), 1, uintptr(handle), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetSystemTimeAsFileTime(time *Filetime) { + syscall.Syscall(procGetSystemTimeAsFileTime.Addr(), 1, uintptr(unsafe.Pointer(time)), 0, 0) + return +} + +func GetSystemTimePreciseAsFileTime(time *Filetime) { + syscall.Syscall(procGetSystemTimePreciseAsFileTime.Addr(), 1, uintptr(unsafe.Pointer(time)), 0, 0) + return +} + +func GetTimeZoneInformation(tzi *Timezoneinformation) (rc uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetTimeZoneInformation.Addr(), 1, uintptr(unsafe.Pointer(tzi)), 0, 0) + rc = uint32(r0) + if rc == 0xffffffff { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreateIoCompletionPort(filehandle Handle, cphandle Handle, key uint32, threadcnt uint32) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall6(procCreateIoCompletionPort.Addr(), 4, uintptr(filehandle), uintptr(cphandle), uintptr(key), uintptr(threadcnt), 0, 0) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetQueuedCompletionStatus(cphandle Handle, qty *uint32, key *uint32, overlapped **Overlapped, timeout uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procGetQueuedCompletionStatus.Addr(), 5, uintptr(cphandle), uintptr(unsafe.Pointer(qty)), uintptr(unsafe.Pointer(key)), uintptr(unsafe.Pointer(overlapped)), uintptr(timeout), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func PostQueuedCompletionStatus(cphandle Handle, qty uint32, key uint32, overlapped *Overlapped) (err error) { + r1, _, e1 := syscall.Syscall6(procPostQueuedCompletionStatus.Addr(), 4, uintptr(cphandle), uintptr(qty), uintptr(key), uintptr(unsafe.Pointer(overlapped)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CancelIo(s Handle) (err error) { + r1, _, e1 := syscall.Syscall(procCancelIo.Addr(), 1, uintptr(s), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CancelIoEx(s Handle, o *Overlapped) (err error) { + r1, _, e1 := syscall.Syscall(procCancelIoEx.Addr(), 2, uintptr(s), uintptr(unsafe.Pointer(o)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreateProcess(appName *uint16, commandLine *uint16, procSecurity *SecurityAttributes, threadSecurity *SecurityAttributes, inheritHandles bool, creationFlags uint32, env *uint16, currentDir *uint16, startupInfo *StartupInfo, outProcInfo *ProcessInformation) (err error) { + var _p0 uint32 + if inheritHandles { + _p0 = 1 + } else { + _p0 = 0 + } + r1, _, e1 := syscall.Syscall12(procCreateProcessW.Addr(), 10, uintptr(unsafe.Pointer(appName)), uintptr(unsafe.Pointer(commandLine)), uintptr(unsafe.Pointer(procSecurity)), uintptr(unsafe.Pointer(threadSecurity)), uintptr(_p0), uintptr(creationFlags), uintptr(unsafe.Pointer(env)), uintptr(unsafe.Pointer(currentDir)), uintptr(unsafe.Pointer(startupInfo)), uintptr(unsafe.Pointer(outProcInfo)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func OpenProcess(da uint32, inheritHandle bool, pid uint32) (handle Handle, err error) { + var _p0 uint32 + if inheritHandle { + _p0 = 1 + } else { + _p0 = 0 + } + r0, _, e1 := syscall.Syscall(procOpenProcess.Addr(), 3, uintptr(da), uintptr(_p0), uintptr(pid)) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func TerminateProcess(handle Handle, exitcode uint32) (err error) { + r1, _, e1 := syscall.Syscall(procTerminateProcess.Addr(), 2, uintptr(handle), uintptr(exitcode), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetExitCodeProcess(handle Handle, exitcode *uint32) (err error) { + r1, _, e1 := syscall.Syscall(procGetExitCodeProcess.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(exitcode)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetStartupInfo(startupInfo *StartupInfo) (err error) { + r1, _, e1 := syscall.Syscall(procGetStartupInfoW.Addr(), 1, uintptr(unsafe.Pointer(startupInfo)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetCurrentProcess() (pseudoHandle Handle, err error) { + r0, _, e1 := syscall.Syscall(procGetCurrentProcess.Addr(), 0, 0, 0, 0) + pseudoHandle = Handle(r0) + if pseudoHandle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetProcessTimes(handle Handle, creationTime *Filetime, exitTime *Filetime, kernelTime *Filetime, userTime *Filetime) (err error) { + r1, _, e1 := syscall.Syscall6(procGetProcessTimes.Addr(), 5, uintptr(handle), uintptr(unsafe.Pointer(creationTime)), uintptr(unsafe.Pointer(exitTime)), uintptr(unsafe.Pointer(kernelTime)), uintptr(unsafe.Pointer(userTime)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func DuplicateHandle(hSourceProcessHandle Handle, hSourceHandle Handle, hTargetProcessHandle Handle, lpTargetHandle *Handle, dwDesiredAccess uint32, bInheritHandle bool, dwOptions uint32) (err error) { + var _p0 uint32 + if bInheritHandle { + _p0 = 1 + } else { + _p0 = 0 + } + r1, _, e1 := syscall.Syscall9(procDuplicateHandle.Addr(), 7, uintptr(hSourceProcessHandle), uintptr(hSourceHandle), uintptr(hTargetProcessHandle), uintptr(unsafe.Pointer(lpTargetHandle)), uintptr(dwDesiredAccess), uintptr(_p0), uintptr(dwOptions), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func WaitForSingleObject(handle Handle, waitMilliseconds uint32) (event uint32, err error) { + r0, _, e1 := syscall.Syscall(procWaitForSingleObject.Addr(), 2, uintptr(handle), uintptr(waitMilliseconds), 0) + event = uint32(r0) + if event == 0xffffffff { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetTempPath(buflen uint32, buf *uint16) (n uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetTempPathW.Addr(), 2, uintptr(buflen), uintptr(unsafe.Pointer(buf)), 0) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreatePipe(readhandle *Handle, writehandle *Handle, sa *SecurityAttributes, size uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procCreatePipe.Addr(), 4, uintptr(unsafe.Pointer(readhandle)), uintptr(unsafe.Pointer(writehandle)), uintptr(unsafe.Pointer(sa)), uintptr(size), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetFileType(filehandle Handle) (n uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetFileType.Addr(), 1, uintptr(filehandle), 0, 0) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CryptAcquireContext(provhandle *Handle, container *uint16, provider *uint16, provtype uint32, flags uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procCryptAcquireContextW.Addr(), 5, uintptr(unsafe.Pointer(provhandle)), uintptr(unsafe.Pointer(container)), uintptr(unsafe.Pointer(provider)), uintptr(provtype), uintptr(flags), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CryptReleaseContext(provhandle Handle, flags uint32) (err error) { + r1, _, e1 := syscall.Syscall(procCryptReleaseContext.Addr(), 2, uintptr(provhandle), uintptr(flags), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CryptGenRandom(provhandle Handle, buflen uint32, buf *byte) (err error) { + r1, _, e1 := syscall.Syscall(procCryptGenRandom.Addr(), 3, uintptr(provhandle), uintptr(buflen), uintptr(unsafe.Pointer(buf))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetEnvironmentStrings() (envs *uint16, err error) { + r0, _, e1 := syscall.Syscall(procGetEnvironmentStringsW.Addr(), 0, 0, 0, 0) + envs = (*uint16)(unsafe.Pointer(r0)) + if envs == nil { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FreeEnvironmentStrings(envs *uint16) (err error) { + r1, _, e1 := syscall.Syscall(procFreeEnvironmentStringsW.Addr(), 1, uintptr(unsafe.Pointer(envs)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetEnvironmentVariable(name *uint16, buffer *uint16, size uint32) (n uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetEnvironmentVariableW.Addr(), 3, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(buffer)), uintptr(size)) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetEnvironmentVariable(name *uint16, value *uint16) (err error) { + r1, _, e1 := syscall.Syscall(procSetEnvironmentVariableW.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(value)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetFileTime(handle Handle, ctime *Filetime, atime *Filetime, wtime *Filetime) (err error) { + r1, _, e1 := syscall.Syscall6(procSetFileTime.Addr(), 4, uintptr(handle), uintptr(unsafe.Pointer(ctime)), uintptr(unsafe.Pointer(atime)), uintptr(unsafe.Pointer(wtime)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetFileAttributes(name *uint16) (attrs uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetFileAttributesW.Addr(), 1, uintptr(unsafe.Pointer(name)), 0, 0) + attrs = uint32(r0) + if attrs == INVALID_FILE_ATTRIBUTES { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetFileAttributes(name *uint16, attrs uint32) (err error) { + r1, _, e1 := syscall.Syscall(procSetFileAttributesW.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(attrs), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetFileAttributesEx(name *uint16, level uint32, info *byte) (err error) { + r1, _, e1 := syscall.Syscall(procGetFileAttributesExW.Addr(), 3, uintptr(unsafe.Pointer(name)), uintptr(level), uintptr(unsafe.Pointer(info))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetCommandLine() (cmd *uint16) { + r0, _, _ := syscall.Syscall(procGetCommandLineW.Addr(), 0, 0, 0, 0) + cmd = (*uint16)(unsafe.Pointer(r0)) + return +} + +func CommandLineToArgv(cmd *uint16, argc *int32) (argv *[8192]*[8192]uint16, err error) { + r0, _, e1 := syscall.Syscall(procCommandLineToArgvW.Addr(), 2, uintptr(unsafe.Pointer(cmd)), uintptr(unsafe.Pointer(argc)), 0) + argv = (*[8192]*[8192]uint16)(unsafe.Pointer(r0)) + if argv == nil { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func LocalFree(hmem Handle) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procLocalFree.Addr(), 1, uintptr(hmem), 0, 0) + handle = Handle(r0) + if handle != 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetHandleInformation(handle Handle, mask uint32, flags uint32) (err error) { + r1, _, e1 := syscall.Syscall(procSetHandleInformation.Addr(), 3, uintptr(handle), uintptr(mask), uintptr(flags)) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FlushFileBuffers(handle Handle) (err error) { + r1, _, e1 := syscall.Syscall(procFlushFileBuffers.Addr(), 1, uintptr(handle), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetFullPathName(path *uint16, buflen uint32, buf *uint16, fname **uint16) (n uint32, err error) { + r0, _, e1 := syscall.Syscall6(procGetFullPathNameW.Addr(), 4, uintptr(unsafe.Pointer(path)), uintptr(buflen), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(fname)), 0, 0) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetLongPathName(path *uint16, buf *uint16, buflen uint32) (n uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetLongPathNameW.Addr(), 3, uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(buf)), uintptr(buflen)) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetShortPathName(longpath *uint16, shortpath *uint16, buflen uint32) (n uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetShortPathNameW.Addr(), 3, uintptr(unsafe.Pointer(longpath)), uintptr(unsafe.Pointer(shortpath)), uintptr(buflen)) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreateFileMapping(fhandle Handle, sa *SecurityAttributes, prot uint32, maxSizeHigh uint32, maxSizeLow uint32, name *uint16) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall6(procCreateFileMappingW.Addr(), 6, uintptr(fhandle), uintptr(unsafe.Pointer(sa)), uintptr(prot), uintptr(maxSizeHigh), uintptr(maxSizeLow), uintptr(unsafe.Pointer(name))) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func MapViewOfFile(handle Handle, access uint32, offsetHigh uint32, offsetLow uint32, length uintptr) (addr uintptr, err error) { + r0, _, e1 := syscall.Syscall6(procMapViewOfFile.Addr(), 5, uintptr(handle), uintptr(access), uintptr(offsetHigh), uintptr(offsetLow), uintptr(length), 0) + addr = uintptr(r0) + if addr == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func UnmapViewOfFile(addr uintptr) (err error) { + r1, _, e1 := syscall.Syscall(procUnmapViewOfFile.Addr(), 1, uintptr(addr), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FlushViewOfFile(addr uintptr, length uintptr) (err error) { + r1, _, e1 := syscall.Syscall(procFlushViewOfFile.Addr(), 2, uintptr(addr), uintptr(length), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func VirtualLock(addr uintptr, length uintptr) (err error) { + r1, _, e1 := syscall.Syscall(procVirtualLock.Addr(), 2, uintptr(addr), uintptr(length), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func VirtualUnlock(addr uintptr, length uintptr) (err error) { + r1, _, e1 := syscall.Syscall(procVirtualUnlock.Addr(), 2, uintptr(addr), uintptr(length), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func VirtualAlloc(address uintptr, size uintptr, alloctype uint32, protect uint32) (value uintptr, err error) { + r0, _, e1 := syscall.Syscall6(procVirtualAlloc.Addr(), 4, uintptr(address), uintptr(size), uintptr(alloctype), uintptr(protect), 0, 0) + value = uintptr(r0) + if value == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func VirtualFree(address uintptr, size uintptr, freetype uint32) (err error) { + r1, _, e1 := syscall.Syscall(procVirtualFree.Addr(), 3, uintptr(address), uintptr(size), uintptr(freetype)) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func VirtualProtect(address uintptr, size uintptr, newprotect uint32, oldprotect *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procVirtualProtect.Addr(), 4, uintptr(address), uintptr(size), uintptr(newprotect), uintptr(unsafe.Pointer(oldprotect)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func TransmitFile(s Handle, handle Handle, bytesToWrite uint32, bytsPerSend uint32, overlapped *Overlapped, transmitFileBuf *TransmitFileBuffers, flags uint32) (err error) { + r1, _, e1 := syscall.Syscall9(procTransmitFile.Addr(), 7, uintptr(s), uintptr(handle), uintptr(bytesToWrite), uintptr(bytsPerSend), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(transmitFileBuf)), uintptr(flags), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ReadDirectoryChanges(handle Handle, buf *byte, buflen uint32, watchSubTree bool, mask uint32, retlen *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) { + var _p0 uint32 + if watchSubTree { + _p0 = 1 + } else { + _p0 = 0 + } + r1, _, e1 := syscall.Syscall9(procReadDirectoryChangesW.Addr(), 8, uintptr(handle), uintptr(unsafe.Pointer(buf)), uintptr(buflen), uintptr(_p0), uintptr(mask), uintptr(unsafe.Pointer(retlen)), uintptr(unsafe.Pointer(overlapped)), uintptr(completionRoutine), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CertOpenSystemStore(hprov Handle, name *uint16) (store Handle, err error) { + r0, _, e1 := syscall.Syscall(procCertOpenSystemStoreW.Addr(), 2, uintptr(hprov), uintptr(unsafe.Pointer(name)), 0) + store = Handle(r0) + if store == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CertOpenStore(storeProvider uintptr, msgAndCertEncodingType uint32, cryptProv uintptr, flags uint32, para uintptr) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall6(procCertOpenStore.Addr(), 5, uintptr(storeProvider), uintptr(msgAndCertEncodingType), uintptr(cryptProv), uintptr(flags), uintptr(para), 0) + handle = Handle(r0) + if handle == InvalidHandle { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CertEnumCertificatesInStore(store Handle, prevContext *CertContext) (context *CertContext, err error) { + r0, _, e1 := syscall.Syscall(procCertEnumCertificatesInStore.Addr(), 2, uintptr(store), uintptr(unsafe.Pointer(prevContext)), 0) + context = (*CertContext)(unsafe.Pointer(r0)) + if context == nil { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CertAddCertificateContextToStore(store Handle, certContext *CertContext, addDisposition uint32, storeContext **CertContext) (err error) { + r1, _, e1 := syscall.Syscall6(procCertAddCertificateContextToStore.Addr(), 4, uintptr(store), uintptr(unsafe.Pointer(certContext)), uintptr(addDisposition), uintptr(unsafe.Pointer(storeContext)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CertCloseStore(store Handle, flags uint32) (err error) { + r1, _, e1 := syscall.Syscall(procCertCloseStore.Addr(), 2, uintptr(store), uintptr(flags), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CertGetCertificateChain(engine Handle, leaf *CertContext, time *Filetime, additionalStore Handle, para *CertChainPara, flags uint32, reserved uintptr, chainCtx **CertChainContext) (err error) { + r1, _, e1 := syscall.Syscall9(procCertGetCertificateChain.Addr(), 8, uintptr(engine), uintptr(unsafe.Pointer(leaf)), uintptr(unsafe.Pointer(time)), uintptr(additionalStore), uintptr(unsafe.Pointer(para)), uintptr(flags), uintptr(reserved), uintptr(unsafe.Pointer(chainCtx)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CertFreeCertificateChain(ctx *CertChainContext) { + syscall.Syscall(procCertFreeCertificateChain.Addr(), 1, uintptr(unsafe.Pointer(ctx)), 0, 0) + return +} + +func CertCreateCertificateContext(certEncodingType uint32, certEncoded *byte, encodedLen uint32) (context *CertContext, err error) { + r0, _, e1 := syscall.Syscall(procCertCreateCertificateContext.Addr(), 3, uintptr(certEncodingType), uintptr(unsafe.Pointer(certEncoded)), uintptr(encodedLen)) + context = (*CertContext)(unsafe.Pointer(r0)) + if context == nil { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CertFreeCertificateContext(ctx *CertContext) (err error) { + r1, _, e1 := syscall.Syscall(procCertFreeCertificateContext.Addr(), 1, uintptr(unsafe.Pointer(ctx)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CertVerifyCertificateChainPolicy(policyOID uintptr, chain *CertChainContext, para *CertChainPolicyPara, status *CertChainPolicyStatus) (err error) { + r1, _, e1 := syscall.Syscall6(procCertVerifyCertificateChainPolicy.Addr(), 4, uintptr(policyOID), uintptr(unsafe.Pointer(chain)), uintptr(unsafe.Pointer(para)), uintptr(unsafe.Pointer(status)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func RegOpenKeyEx(key Handle, subkey *uint16, options uint32, desiredAccess uint32, result *Handle) (regerrno error) { + r0, _, _ := syscall.Syscall6(procRegOpenKeyExW.Addr(), 5, uintptr(key), uintptr(unsafe.Pointer(subkey)), uintptr(options), uintptr(desiredAccess), uintptr(unsafe.Pointer(result)), 0) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func RegCloseKey(key Handle) (regerrno error) { + r0, _, _ := syscall.Syscall(procRegCloseKey.Addr(), 1, uintptr(key), 0, 0) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func RegQueryInfoKey(key Handle, class *uint16, classLen *uint32, reserved *uint32, subkeysLen *uint32, maxSubkeyLen *uint32, maxClassLen *uint32, valuesLen *uint32, maxValueNameLen *uint32, maxValueLen *uint32, saLen *uint32, lastWriteTime *Filetime) (regerrno error) { + r0, _, _ := syscall.Syscall12(procRegQueryInfoKeyW.Addr(), 12, uintptr(key), uintptr(unsafe.Pointer(class)), uintptr(unsafe.Pointer(classLen)), uintptr(unsafe.Pointer(reserved)), uintptr(unsafe.Pointer(subkeysLen)), uintptr(unsafe.Pointer(maxSubkeyLen)), uintptr(unsafe.Pointer(maxClassLen)), uintptr(unsafe.Pointer(valuesLen)), uintptr(unsafe.Pointer(maxValueNameLen)), uintptr(unsafe.Pointer(maxValueLen)), uintptr(unsafe.Pointer(saLen)), uintptr(unsafe.Pointer(lastWriteTime))) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func RegEnumKeyEx(key Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, class *uint16, classLen *uint32, lastWriteTime *Filetime) (regerrno error) { + r0, _, _ := syscall.Syscall9(procRegEnumKeyExW.Addr(), 8, uintptr(key), uintptr(index), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(nameLen)), uintptr(unsafe.Pointer(reserved)), uintptr(unsafe.Pointer(class)), uintptr(unsafe.Pointer(classLen)), uintptr(unsafe.Pointer(lastWriteTime)), 0) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func RegQueryValueEx(key Handle, name *uint16, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) { + r0, _, _ := syscall.Syscall6(procRegQueryValueExW.Addr(), 6, uintptr(key), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(reserved)), uintptr(unsafe.Pointer(valtype)), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(buflen))) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func getCurrentProcessId() (pid uint32) { + r0, _, _ := syscall.Syscall(procGetCurrentProcessId.Addr(), 0, 0, 0, 0) + pid = uint32(r0) + return +} + +func GetConsoleMode(console Handle, mode *uint32) (err error) { + r1, _, e1 := syscall.Syscall(procGetConsoleMode.Addr(), 2, uintptr(console), uintptr(unsafe.Pointer(mode)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetConsoleMode(console Handle, mode uint32) (err error) { + r1, _, e1 := syscall.Syscall(procSetConsoleMode.Addr(), 2, uintptr(console), uintptr(mode), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetConsoleScreenBufferInfo(console Handle, info *ConsoleScreenBufferInfo) (err error) { + r1, _, e1 := syscall.Syscall(procGetConsoleScreenBufferInfo.Addr(), 2, uintptr(console), uintptr(unsafe.Pointer(info)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func WriteConsole(console Handle, buf *uint16, towrite uint32, written *uint32, reserved *byte) (err error) { + r1, _, e1 := syscall.Syscall6(procWriteConsoleW.Addr(), 5, uintptr(console), uintptr(unsafe.Pointer(buf)), uintptr(towrite), uintptr(unsafe.Pointer(written)), uintptr(unsafe.Pointer(reserved)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ReadConsole(console Handle, buf *uint16, toread uint32, read *uint32, inputControl *byte) (err error) { + r1, _, e1 := syscall.Syscall6(procReadConsoleW.Addr(), 5, uintptr(console), uintptr(unsafe.Pointer(buf)), uintptr(toread), uintptr(unsafe.Pointer(read)), uintptr(unsafe.Pointer(inputControl)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreateToolhelp32Snapshot(flags uint32, processId uint32) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procCreateToolhelp32Snapshot.Addr(), 2, uintptr(flags), uintptr(processId), 0) + handle = Handle(r0) + if handle == InvalidHandle { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func Process32First(snapshot Handle, procEntry *ProcessEntry32) (err error) { + r1, _, e1 := syscall.Syscall(procProcess32FirstW.Addr(), 2, uintptr(snapshot), uintptr(unsafe.Pointer(procEntry)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func Process32Next(snapshot Handle, procEntry *ProcessEntry32) (err error) { + r1, _, e1 := syscall.Syscall(procProcess32NextW.Addr(), 2, uintptr(snapshot), uintptr(unsafe.Pointer(procEntry)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func DeviceIoControl(handle Handle, ioControlCode uint32, inBuffer *byte, inBufferSize uint32, outBuffer *byte, outBufferSize uint32, bytesReturned *uint32, overlapped *Overlapped) (err error) { + r1, _, e1 := syscall.Syscall9(procDeviceIoControl.Addr(), 8, uintptr(handle), uintptr(ioControlCode), uintptr(unsafe.Pointer(inBuffer)), uintptr(inBufferSize), uintptr(unsafe.Pointer(outBuffer)), uintptr(outBufferSize), uintptr(unsafe.Pointer(bytesReturned)), uintptr(unsafe.Pointer(overlapped)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreateSymbolicLink(symlinkfilename *uint16, targetfilename *uint16, flags uint32) (err error) { + r1, _, e1 := syscall.Syscall(procCreateSymbolicLinkW.Addr(), 3, uintptr(unsafe.Pointer(symlinkfilename)), uintptr(unsafe.Pointer(targetfilename)), uintptr(flags)) + if r1&0xff == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreateHardLink(filename *uint16, existingfilename *uint16, reserved uintptr) (err error) { + r1, _, e1 := syscall.Syscall(procCreateHardLinkW.Addr(), 3, uintptr(unsafe.Pointer(filename)), uintptr(unsafe.Pointer(existingfilename)), uintptr(reserved)) + if r1&0xff == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetCurrentThreadId() (id uint32) { + r0, _, _ := syscall.Syscall(procGetCurrentThreadId.Addr(), 0, 0, 0, 0) + id = uint32(r0) + return +} + +func CreateEvent(eventAttrs *SecurityAttributes, manualReset uint32, initialState uint32, name *uint16) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall6(procCreateEventW.Addr(), 4, uintptr(unsafe.Pointer(eventAttrs)), uintptr(manualReset), uintptr(initialState), uintptr(unsafe.Pointer(name)), 0, 0) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreateEventEx(eventAttrs *SecurityAttributes, name *uint16, flags uint32, desiredAccess uint32) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall6(procCreateEventExW.Addr(), 4, uintptr(unsafe.Pointer(eventAttrs)), uintptr(unsafe.Pointer(name)), uintptr(flags), uintptr(desiredAccess), 0, 0) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func OpenEvent(desiredAccess uint32, inheritHandle bool, name *uint16) (handle Handle, err error) { + var _p0 uint32 + if inheritHandle { + _p0 = 1 + } else { + _p0 = 0 + } + r0, _, e1 := syscall.Syscall(procOpenEventW.Addr(), 3, uintptr(desiredAccess), uintptr(_p0), uintptr(unsafe.Pointer(name))) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetEvent(event Handle) (err error) { + r1, _, e1 := syscall.Syscall(procSetEvent.Addr(), 1, uintptr(event), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ResetEvent(event Handle) (err error) { + r1, _, e1 := syscall.Syscall(procResetEvent.Addr(), 1, uintptr(event), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func PulseEvent(event Handle) (err error) { + r1, _, e1 := syscall.Syscall(procPulseEvent.Addr(), 1, uintptr(event), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func DefineDosDevice(flags uint32, deviceName *uint16, targetPath *uint16) (err error) { + r1, _, e1 := syscall.Syscall(procDefineDosDeviceW.Addr(), 3, uintptr(flags), uintptr(unsafe.Pointer(deviceName)), uintptr(unsafe.Pointer(targetPath))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func DeleteVolumeMountPoint(volumeMountPoint *uint16) (err error) { + r1, _, e1 := syscall.Syscall(procDeleteVolumeMountPointW.Addr(), 1, uintptr(unsafe.Pointer(volumeMountPoint)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FindFirstVolume(volumeName *uint16, bufferLength uint32) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procFindFirstVolumeW.Addr(), 2, uintptr(unsafe.Pointer(volumeName)), uintptr(bufferLength), 0) + handle = Handle(r0) + if handle == InvalidHandle { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FindFirstVolumeMountPoint(rootPathName *uint16, volumeMountPoint *uint16, bufferLength uint32) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procFindFirstVolumeMountPointW.Addr(), 3, uintptr(unsafe.Pointer(rootPathName)), uintptr(unsafe.Pointer(volumeMountPoint)), uintptr(bufferLength)) + handle = Handle(r0) + if handle == InvalidHandle { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FindNextVolume(findVolume Handle, volumeName *uint16, bufferLength uint32) (err error) { + r1, _, e1 := syscall.Syscall(procFindNextVolumeW.Addr(), 3, uintptr(findVolume), uintptr(unsafe.Pointer(volumeName)), uintptr(bufferLength)) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FindNextVolumeMountPoint(findVolumeMountPoint Handle, volumeMountPoint *uint16, bufferLength uint32) (err error) { + r1, _, e1 := syscall.Syscall(procFindNextVolumeMountPointW.Addr(), 3, uintptr(findVolumeMountPoint), uintptr(unsafe.Pointer(volumeMountPoint)), uintptr(bufferLength)) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FindVolumeClose(findVolume Handle) (err error) { + r1, _, e1 := syscall.Syscall(procFindVolumeClose.Addr(), 1, uintptr(findVolume), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FindVolumeMountPointClose(findVolumeMountPoint Handle) (err error) { + r1, _, e1 := syscall.Syscall(procFindVolumeMountPointClose.Addr(), 1, uintptr(findVolumeMountPoint), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetDriveType(rootPathName *uint16) (driveType uint32) { + r0, _, _ := syscall.Syscall(procGetDriveTypeW.Addr(), 1, uintptr(unsafe.Pointer(rootPathName)), 0, 0) + driveType = uint32(r0) + return +} + +func GetLogicalDrives() (drivesBitMask uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetLogicalDrives.Addr(), 0, 0, 0, 0) + drivesBitMask = uint32(r0) + if drivesBitMask == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetLogicalDriveStrings(bufferLength uint32, buffer *uint16) (n uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetLogicalDriveStringsW.Addr(), 2, uintptr(bufferLength), uintptr(unsafe.Pointer(buffer)), 0) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetVolumeInformation(rootPathName *uint16, volumeNameBuffer *uint16, volumeNameSize uint32, volumeNameSerialNumber *uint32, maximumComponentLength *uint32, fileSystemFlags *uint32, fileSystemNameBuffer *uint16, fileSystemNameSize uint32) (err error) { + r1, _, e1 := syscall.Syscall9(procGetVolumeInformationW.Addr(), 8, uintptr(unsafe.Pointer(rootPathName)), uintptr(unsafe.Pointer(volumeNameBuffer)), uintptr(volumeNameSize), uintptr(unsafe.Pointer(volumeNameSerialNumber)), uintptr(unsafe.Pointer(maximumComponentLength)), uintptr(unsafe.Pointer(fileSystemFlags)), uintptr(unsafe.Pointer(fileSystemNameBuffer)), uintptr(fileSystemNameSize), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetVolumeInformationByHandle(file Handle, volumeNameBuffer *uint16, volumeNameSize uint32, volumeNameSerialNumber *uint32, maximumComponentLength *uint32, fileSystemFlags *uint32, fileSystemNameBuffer *uint16, fileSystemNameSize uint32) (err error) { + r1, _, e1 := syscall.Syscall9(procGetVolumeInformationByHandleW.Addr(), 8, uintptr(file), uintptr(unsafe.Pointer(volumeNameBuffer)), uintptr(volumeNameSize), uintptr(unsafe.Pointer(volumeNameSerialNumber)), uintptr(unsafe.Pointer(maximumComponentLength)), uintptr(unsafe.Pointer(fileSystemFlags)), uintptr(unsafe.Pointer(fileSystemNameBuffer)), uintptr(fileSystemNameSize), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetVolumeNameForVolumeMountPoint(volumeMountPoint *uint16, volumeName *uint16, bufferlength uint32) (err error) { + r1, _, e1 := syscall.Syscall(procGetVolumeNameForVolumeMountPointW.Addr(), 3, uintptr(unsafe.Pointer(volumeMountPoint)), uintptr(unsafe.Pointer(volumeName)), uintptr(bufferlength)) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetVolumePathName(fileName *uint16, volumePathName *uint16, bufferLength uint32) (err error) { + r1, _, e1 := syscall.Syscall(procGetVolumePathNameW.Addr(), 3, uintptr(unsafe.Pointer(fileName)), uintptr(unsafe.Pointer(volumePathName)), uintptr(bufferLength)) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetVolumePathNamesForVolumeName(volumeName *uint16, volumePathNames *uint16, bufferLength uint32, returnLength *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procGetVolumePathNamesForVolumeNameW.Addr(), 4, uintptr(unsafe.Pointer(volumeName)), uintptr(unsafe.Pointer(volumePathNames)), uintptr(bufferLength), uintptr(unsafe.Pointer(returnLength)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func QueryDosDevice(deviceName *uint16, targetPath *uint16, max uint32) (n uint32, err error) { + r0, _, e1 := syscall.Syscall(procQueryDosDeviceW.Addr(), 3, uintptr(unsafe.Pointer(deviceName)), uintptr(unsafe.Pointer(targetPath)), uintptr(max)) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetVolumeLabel(rootPathName *uint16, volumeName *uint16) (err error) { + r1, _, e1 := syscall.Syscall(procSetVolumeLabelW.Addr(), 2, uintptr(unsafe.Pointer(rootPathName)), uintptr(unsafe.Pointer(volumeName)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetVolumeMountPoint(volumeMountPoint *uint16, volumeName *uint16) (err error) { + r1, _, e1 := syscall.Syscall(procSetVolumeMountPointW.Addr(), 2, uintptr(unsafe.Pointer(volumeMountPoint)), uintptr(unsafe.Pointer(volumeName)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func WSAStartup(verreq uint32, data *WSAData) (sockerr error) { + r0, _, _ := syscall.Syscall(procWSAStartup.Addr(), 2, uintptr(verreq), uintptr(unsafe.Pointer(data)), 0) + if r0 != 0 { + sockerr = syscall.Errno(r0) + } + return +} + +func WSACleanup() (err error) { + r1, _, e1 := syscall.Syscall(procWSACleanup.Addr(), 0, 0, 0, 0) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func WSAIoctl(s Handle, iocc uint32, inbuf *byte, cbif uint32, outbuf *byte, cbob uint32, cbbr *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) { + r1, _, e1 := syscall.Syscall9(procWSAIoctl.Addr(), 9, uintptr(s), uintptr(iocc), uintptr(unsafe.Pointer(inbuf)), uintptr(cbif), uintptr(unsafe.Pointer(outbuf)), uintptr(cbob), uintptr(unsafe.Pointer(cbbr)), uintptr(unsafe.Pointer(overlapped)), uintptr(completionRoutine)) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func socket(af int32, typ int32, protocol int32) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procsocket.Addr(), 3, uintptr(af), uintptr(typ), uintptr(protocol)) + handle = Handle(r0) + if handle == InvalidHandle { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func Setsockopt(s Handle, level int32, optname int32, optval *byte, optlen int32) (err error) { + r1, _, e1 := syscall.Syscall6(procsetsockopt.Addr(), 5, uintptr(s), uintptr(level), uintptr(optname), uintptr(unsafe.Pointer(optval)), uintptr(optlen), 0) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func Getsockopt(s Handle, level int32, optname int32, optval *byte, optlen *int32) (err error) { + r1, _, e1 := syscall.Syscall6(procgetsockopt.Addr(), 5, uintptr(s), uintptr(level), uintptr(optname), uintptr(unsafe.Pointer(optval)), uintptr(unsafe.Pointer(optlen)), 0) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func bind(s Handle, name unsafe.Pointer, namelen int32) (err error) { + r1, _, e1 := syscall.Syscall(procbind.Addr(), 3, uintptr(s), uintptr(name), uintptr(namelen)) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func connect(s Handle, name unsafe.Pointer, namelen int32) (err error) { + r1, _, e1 := syscall.Syscall(procconnect.Addr(), 3, uintptr(s), uintptr(name), uintptr(namelen)) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func getsockname(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) { + r1, _, e1 := syscall.Syscall(procgetsockname.Addr(), 3, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func getpeername(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) { + r1, _, e1 := syscall.Syscall(procgetpeername.Addr(), 3, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func listen(s Handle, backlog int32) (err error) { + r1, _, e1 := syscall.Syscall(proclisten.Addr(), 2, uintptr(s), uintptr(backlog), 0) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func shutdown(s Handle, how int32) (err error) { + r1, _, e1 := syscall.Syscall(procshutdown.Addr(), 2, uintptr(s), uintptr(how), 0) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func Closesocket(s Handle) (err error) { + r1, _, e1 := syscall.Syscall(procclosesocket.Addr(), 1, uintptr(s), 0, 0) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func AcceptEx(ls Handle, as Handle, buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, recvd *uint32, overlapped *Overlapped) (err error) { + r1, _, e1 := syscall.Syscall9(procAcceptEx.Addr(), 8, uintptr(ls), uintptr(as), uintptr(unsafe.Pointer(buf)), uintptr(rxdatalen), uintptr(laddrlen), uintptr(raddrlen), uintptr(unsafe.Pointer(recvd)), uintptr(unsafe.Pointer(overlapped)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetAcceptExSockaddrs(buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, lrsa **RawSockaddrAny, lrsalen *int32, rrsa **RawSockaddrAny, rrsalen *int32) { + syscall.Syscall9(procGetAcceptExSockaddrs.Addr(), 8, uintptr(unsafe.Pointer(buf)), uintptr(rxdatalen), uintptr(laddrlen), uintptr(raddrlen), uintptr(unsafe.Pointer(lrsa)), uintptr(unsafe.Pointer(lrsalen)), uintptr(unsafe.Pointer(rrsa)), uintptr(unsafe.Pointer(rrsalen)), 0) + return +} + +func WSARecv(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, overlapped *Overlapped, croutine *byte) (err error) { + r1, _, e1 := syscall.Syscall9(procWSARecv.Addr(), 7, uintptr(s), uintptr(unsafe.Pointer(bufs)), uintptr(bufcnt), uintptr(unsafe.Pointer(recvd)), uintptr(unsafe.Pointer(flags)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)), 0, 0) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func WSASend(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, overlapped *Overlapped, croutine *byte) (err error) { + r1, _, e1 := syscall.Syscall9(procWSASend.Addr(), 7, uintptr(s), uintptr(unsafe.Pointer(bufs)), uintptr(bufcnt), uintptr(unsafe.Pointer(sent)), uintptr(flags), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)), 0, 0) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func WSARecvFrom(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, from *RawSockaddrAny, fromlen *int32, overlapped *Overlapped, croutine *byte) (err error) { + r1, _, e1 := syscall.Syscall9(procWSARecvFrom.Addr(), 9, uintptr(s), uintptr(unsafe.Pointer(bufs)), uintptr(bufcnt), uintptr(unsafe.Pointer(recvd)), uintptr(unsafe.Pointer(flags)), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine))) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func WSASendTo(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, to *RawSockaddrAny, tolen int32, overlapped *Overlapped, croutine *byte) (err error) { + r1, _, e1 := syscall.Syscall9(procWSASendTo.Addr(), 9, uintptr(s), uintptr(unsafe.Pointer(bufs)), uintptr(bufcnt), uintptr(unsafe.Pointer(sent)), uintptr(flags), uintptr(unsafe.Pointer(to)), uintptr(tolen), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine))) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetHostByName(name string) (h *Hostent, err error) { + var _p0 *byte + _p0, err = syscall.BytePtrFromString(name) + if err != nil { + return + } + return _GetHostByName(_p0) +} + +func _GetHostByName(name *byte) (h *Hostent, err error) { + r0, _, e1 := syscall.Syscall(procgethostbyname.Addr(), 1, uintptr(unsafe.Pointer(name)), 0, 0) + h = (*Hostent)(unsafe.Pointer(r0)) + if h == nil { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetServByName(name string, proto string) (s *Servent, err error) { + var _p0 *byte + _p0, err = syscall.BytePtrFromString(name) + if err != nil { + return + } + var _p1 *byte + _p1, err = syscall.BytePtrFromString(proto) + if err != nil { + return + } + return _GetServByName(_p0, _p1) +} + +func _GetServByName(name *byte, proto *byte) (s *Servent, err error) { + r0, _, e1 := syscall.Syscall(procgetservbyname.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(proto)), 0) + s = (*Servent)(unsafe.Pointer(r0)) + if s == nil { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func Ntohs(netshort uint16) (u uint16) { + r0, _, _ := syscall.Syscall(procntohs.Addr(), 1, uintptr(netshort), 0, 0) + u = uint16(r0) + return +} + +func GetProtoByName(name string) (p *Protoent, err error) { + var _p0 *byte + _p0, err = syscall.BytePtrFromString(name) + if err != nil { + return + } + return _GetProtoByName(_p0) +} + +func _GetProtoByName(name *byte) (p *Protoent, err error) { + r0, _, e1 := syscall.Syscall(procgetprotobyname.Addr(), 1, uintptr(unsafe.Pointer(name)), 0, 0) + p = (*Protoent)(unsafe.Pointer(r0)) + if p == nil { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func DnsQuery(name string, qtype uint16, options uint32, extra *byte, qrs **DNSRecord, pr *byte) (status error) { + var _p0 *uint16 + _p0, status = syscall.UTF16PtrFromString(name) + if status != nil { + return + } + return _DnsQuery(_p0, qtype, options, extra, qrs, pr) +} + +func _DnsQuery(name *uint16, qtype uint16, options uint32, extra *byte, qrs **DNSRecord, pr *byte) (status error) { + r0, _, _ := syscall.Syscall6(procDnsQuery_W.Addr(), 6, uintptr(unsafe.Pointer(name)), uintptr(qtype), uintptr(options), uintptr(unsafe.Pointer(extra)), uintptr(unsafe.Pointer(qrs)), uintptr(unsafe.Pointer(pr))) + if r0 != 0 { + status = syscall.Errno(r0) + } + return +} + +func DnsRecordListFree(rl *DNSRecord, freetype uint32) { + syscall.Syscall(procDnsRecordListFree.Addr(), 2, uintptr(unsafe.Pointer(rl)), uintptr(freetype), 0) + return +} + +func DnsNameCompare(name1 *uint16, name2 *uint16) (same bool) { + r0, _, _ := syscall.Syscall(procDnsNameCompare_W.Addr(), 2, uintptr(unsafe.Pointer(name1)), uintptr(unsafe.Pointer(name2)), 0) + same = r0 != 0 + return +} + +func GetAddrInfoW(nodename *uint16, servicename *uint16, hints *AddrinfoW, result **AddrinfoW) (sockerr error) { + r0, _, _ := syscall.Syscall6(procGetAddrInfoW.Addr(), 4, uintptr(unsafe.Pointer(nodename)), uintptr(unsafe.Pointer(servicename)), uintptr(unsafe.Pointer(hints)), uintptr(unsafe.Pointer(result)), 0, 0) + if r0 != 0 { + sockerr = syscall.Errno(r0) + } + return +} + +func FreeAddrInfoW(addrinfo *AddrinfoW) { + syscall.Syscall(procFreeAddrInfoW.Addr(), 1, uintptr(unsafe.Pointer(addrinfo)), 0, 0) + return +} + +func GetIfEntry(pIfRow *MibIfRow) (errcode error) { + r0, _, _ := syscall.Syscall(procGetIfEntry.Addr(), 1, uintptr(unsafe.Pointer(pIfRow)), 0, 0) + if r0 != 0 { + errcode = syscall.Errno(r0) + } + return +} + +func GetAdaptersInfo(ai *IpAdapterInfo, ol *uint32) (errcode error) { + r0, _, _ := syscall.Syscall(procGetAdaptersInfo.Addr(), 2, uintptr(unsafe.Pointer(ai)), uintptr(unsafe.Pointer(ol)), 0) + if r0 != 0 { + errcode = syscall.Errno(r0) + } + return +} + +func SetFileCompletionNotificationModes(handle Handle, flags uint8) (err error) { + r1, _, e1 := syscall.Syscall(procSetFileCompletionNotificationModes.Addr(), 2, uintptr(handle), uintptr(flags), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func WSAEnumProtocols(protocols *int32, protocolBuffer *WSAProtocolInfo, bufferLength *uint32) (n int32, err error) { + r0, _, e1 := syscall.Syscall(procWSAEnumProtocolsW.Addr(), 3, uintptr(unsafe.Pointer(protocols)), uintptr(unsafe.Pointer(protocolBuffer)), uintptr(unsafe.Pointer(bufferLength))) + n = int32(r0) + if n == -1 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetAdaptersAddresses(family uint32, flags uint32, reserved uintptr, adapterAddresses *IpAdapterAddresses, sizePointer *uint32) (errcode error) { + r0, _, _ := syscall.Syscall6(procGetAdaptersAddresses.Addr(), 5, uintptr(family), uintptr(flags), uintptr(reserved), uintptr(unsafe.Pointer(adapterAddresses)), uintptr(unsafe.Pointer(sizePointer)), 0) + if r0 != 0 { + errcode = syscall.Errno(r0) + } + return +} + +func GetACP() (acp uint32) { + r0, _, _ := syscall.Syscall(procGetACP.Addr(), 0, 0, 0, 0) + acp = uint32(r0) + return +} + +func MultiByteToWideChar(codePage uint32, dwFlags uint32, str *byte, nstr int32, wchar *uint16, nwchar int32) (nwrite int32, err error) { + r0, _, e1 := syscall.Syscall6(procMultiByteToWideChar.Addr(), 6, uintptr(codePage), uintptr(dwFlags), uintptr(unsafe.Pointer(str)), uintptr(nstr), uintptr(unsafe.Pointer(wchar)), uintptr(nwchar)) + nwrite = int32(r0) + if nwrite == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func TranslateName(accName *uint16, accNameFormat uint32, desiredNameFormat uint32, translatedName *uint16, nSize *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procTranslateNameW.Addr(), 5, uintptr(unsafe.Pointer(accName)), uintptr(accNameFormat), uintptr(desiredNameFormat), uintptr(unsafe.Pointer(translatedName)), uintptr(unsafe.Pointer(nSize)), 0) + if r1&0xff == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetUserNameEx(nameFormat uint32, nameBuffre *uint16, nSize *uint32) (err error) { + r1, _, e1 := syscall.Syscall(procGetUserNameExW.Addr(), 3, uintptr(nameFormat), uintptr(unsafe.Pointer(nameBuffre)), uintptr(unsafe.Pointer(nSize))) + if r1&0xff == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func NetUserGetInfo(serverName *uint16, userName *uint16, level uint32, buf **byte) (neterr error) { + r0, _, _ := syscall.Syscall6(procNetUserGetInfo.Addr(), 4, uintptr(unsafe.Pointer(serverName)), uintptr(unsafe.Pointer(userName)), uintptr(level), uintptr(unsafe.Pointer(buf)), 0, 0) + if r0 != 0 { + neterr = syscall.Errno(r0) + } + return +} + +func NetGetJoinInformation(server *uint16, name **uint16, bufType *uint32) (neterr error) { + r0, _, _ := syscall.Syscall(procNetGetJoinInformation.Addr(), 3, uintptr(unsafe.Pointer(server)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(bufType))) + if r0 != 0 { + neterr = syscall.Errno(r0) + } + return +} + +func NetApiBufferFree(buf *byte) (neterr error) { + r0, _, _ := syscall.Syscall(procNetApiBufferFree.Addr(), 1, uintptr(unsafe.Pointer(buf)), 0, 0) + if r0 != 0 { + neterr = syscall.Errno(r0) + } + return +} + +func LookupAccountSid(systemName *uint16, sid *SID, name *uint16, nameLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *uint32) (err error) { + r1, _, e1 := syscall.Syscall9(procLookupAccountSidW.Addr(), 7, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(nameLen)), uintptr(unsafe.Pointer(refdDomainName)), uintptr(unsafe.Pointer(refdDomainNameLen)), uintptr(unsafe.Pointer(use)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func LookupAccountName(systemName *uint16, accountName *uint16, sid *SID, sidLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *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(sidLen)), uintptr(unsafe.Pointer(refdDomainName)), uintptr(unsafe.Pointer(refdDomainNameLen)), uintptr(unsafe.Pointer(use)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ConvertSidToStringSid(sid *SID, stringSid **uint16) (err error) { + r1, _, e1 := syscall.Syscall(procConvertSidToStringSidW.Addr(), 2, uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(stringSid)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ConvertStringSidToSid(stringSid *uint16, sid **SID) (err error) { + r1, _, e1 := syscall.Syscall(procConvertStringSidToSidW.Addr(), 2, uintptr(unsafe.Pointer(stringSid)), uintptr(unsafe.Pointer(sid)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetLengthSid(sid *SID) (len uint32) { + r0, _, _ := syscall.Syscall(procGetLengthSid.Addr(), 1, uintptr(unsafe.Pointer(sid)), 0, 0) + len = uint32(r0) + return +} + +func CopySid(destSidLen uint32, destSid *SID, srcSid *SID) (err error) { + r1, _, e1 := syscall.Syscall(procCopySid.Addr(), 3, uintptr(destSidLen), uintptr(unsafe.Pointer(destSid)), uintptr(unsafe.Pointer(srcSid))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func AllocateAndInitializeSid(identAuth *SidIdentifierAuthority, subAuth byte, subAuth0 uint32, subAuth1 uint32, subAuth2 uint32, subAuth3 uint32, subAuth4 uint32, subAuth5 uint32, subAuth6 uint32, subAuth7 uint32, sid **SID) (err error) { + r1, _, e1 := syscall.Syscall12(procAllocateAndInitializeSid.Addr(), 11, uintptr(unsafe.Pointer(identAuth)), uintptr(subAuth), uintptr(subAuth0), uintptr(subAuth1), uintptr(subAuth2), uintptr(subAuth3), uintptr(subAuth4), uintptr(subAuth5), uintptr(subAuth6), uintptr(subAuth7), uintptr(unsafe.Pointer(sid)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FreeSid(sid *SID) (err error) { + r1, _, e1 := syscall.Syscall(procFreeSid.Addr(), 1, uintptr(unsafe.Pointer(sid)), 0, 0) + if r1 != 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func EqualSid(sid1 *SID, sid2 *SID) (isEqual bool) { + r0, _, _ := syscall.Syscall(procEqualSid.Addr(), 2, uintptr(unsafe.Pointer(sid1)), uintptr(unsafe.Pointer(sid2)), 0) + isEqual = r0 != 0 + return +} + +func checkTokenMembership(tokenHandle Token, sidToCheck *SID, isMember *int32) (err error) { + r1, _, e1 := syscall.Syscall(procCheckTokenMembership.Addr(), 3, uintptr(tokenHandle), uintptr(unsafe.Pointer(sidToCheck)), uintptr(unsafe.Pointer(isMember))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func OpenProcessToken(h Handle, access uint32, token *Token) (err error) { + r1, _, e1 := syscall.Syscall(procOpenProcessToken.Addr(), 3, uintptr(h), uintptr(access), uintptr(unsafe.Pointer(token))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetTokenInformation(t Token, infoClass uint32, info *byte, infoLen uint32, returnedLen *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procGetTokenInformation.Addr(), 5, uintptr(t), uintptr(infoClass), uintptr(unsafe.Pointer(info)), uintptr(infoLen), uintptr(unsafe.Pointer(returnedLen)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetUserProfileDirectory(t Token, dir *uint16, dirLen *uint32) (err error) { + r1, _, e1 := syscall.Syscall(procGetUserProfileDirectoryW.Addr(), 3, uintptr(t), uintptr(unsafe.Pointer(dir)), uintptr(unsafe.Pointer(dirLen))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} diff --git a/api/vendor/gopkg.in/alecthomas/kingpin.v2/.travis.yml b/api/vendor/gopkg.in/alecthomas/kingpin.v2/.travis.yml new file mode 100644 index 0000000..e564b74 --- /dev/null +++ b/api/vendor/gopkg.in/alecthomas/kingpin.v2/.travis.yml @@ -0,0 +1,4 @@ +sudo: false +language: go +install: go get -t -v ./... +go: 1.2 diff --git a/api/vendor/gopkg.in/alecthomas/kingpin.v2/COPYING b/api/vendor/gopkg.in/alecthomas/kingpin.v2/COPYING new file mode 100644 index 0000000..2993ec0 --- /dev/null +++ b/api/vendor/gopkg.in/alecthomas/kingpin.v2/COPYING @@ -0,0 +1,19 @@ +Copyright (C) 2014 Alec Thomas + +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/api/vendor/gopkg.in/alecthomas/kingpin.v2/README.md b/api/vendor/gopkg.in/alecthomas/kingpin.v2/README.md new file mode 100644 index 0000000..498704c --- /dev/null +++ b/api/vendor/gopkg.in/alecthomas/kingpin.v2/README.md @@ -0,0 +1,674 @@ +# Kingpin - A Go (golang) command line and flag parser +[![](https://godoc.org/github.com/alecthomas/kingpin?status.svg)](http://godoc.org/github.com/alecthomas/kingpin) [![Build Status](https://travis-ci.org/alecthomas/kingpin.svg?branch=master)](https://travis-ci.org/alecthomas/kingpin) [![Gitter chat](https://badges.gitter.im/alecthomas.png)](https://gitter.im/alecthomas/Lobby) + + + + + +- [Overview](#overview) +- [Features](#features) +- [User-visible changes between v1 and v2](#user-visible-changes-between-v1-and-v2) + - [Flags can be used at any point after their definition.](#flags-can-be-used-at-any-point-after-their-definition) + - [Short flags can be combined with their parameters](#short-flags-can-be-combined-with-their-parameters) +- [API changes between v1 and v2](#api-changes-between-v1-and-v2) +- [Versions](#versions) + - [V2 is the current stable version](#v2-is-the-current-stable-version) + - [V1 is the OLD stable version](#v1-is-the-old-stable-version) +- [Change History](#change-history) +- [Examples](#examples) + - [Simple Example](#simple-example) + - [Complex Example](#complex-example) +- [Reference Documentation](#reference-documentation) + - [Displaying errors and usage information](#displaying-errors-and-usage-information) + - [Sub-commands](#sub-commands) + - [Custom Parsers](#custom-parsers) + - [Repeatable flags](#repeatable-flags) + - [Boolean Values](#boolean-values) + - [Default Values](#default-values) + - [Place-holders in Help](#place-holders-in-help) + - [Consuming all remaining arguments](#consuming-all-remaining-arguments) + - [Bash/ZSH Shell Completion](#bashzsh-shell-completion) + - [Supporting -h for help](#supporting--h-for-help) + - [Custom help](#custom-help) + + + +## Overview + +Kingpin is a [fluent-style](http://en.wikipedia.org/wiki/Fluent_interface), +type-safe command-line parser. It supports flags, nested commands, and +positional arguments. + +Install it with: + + $ go get gopkg.in/alecthomas/kingpin.v2 + +It looks like this: + +```go +var ( + verbose = kingpin.Flag("verbose", "Verbose mode.").Short('v').Bool() + name = kingpin.Arg("name", "Name of user.").Required().String() +) + +func main() { + kingpin.Parse() + fmt.Printf("%v, %s\n", *verbose, *name) +} +``` + +More [examples](https://github.com/alecthomas/kingpin/tree/master/_examples) are available. + +Second to parsing, providing the user with useful help is probably the most +important thing a command-line parser does. Kingpin tries to provide detailed +contextual help if `--help` is encountered at any point in the command line +(excluding after `--`). + +## Features + +- Help output that isn't as ugly as sin. +- Fully [customisable help](#custom-help), via Go templates. +- Parsed, type-safe flags (`kingpin.Flag("f", "help").Int()`) +- Parsed, type-safe positional arguments (`kingpin.Arg("a", "help").Int()`). +- Parsed, type-safe, arbitrarily deep commands (`kingpin.Command("c", "help")`). +- Support for required flags and required positional arguments (`kingpin.Flag("f", "").Required().Int()`). +- Support for arbitrarily nested default commands (`command.Default()`). +- Callbacks per command, flag and argument (`kingpin.Command("c", "").Action(myAction)`). +- POSIX-style short flag combining (`-a -b` -> `-ab`). +- Short-flag+parameter combining (`-a parm` -> `-aparm`). +- Read command-line from files (`@`). +- Automatically generate man pages (`--help-man`). + +## User-visible changes between v1 and v2 + +### Flags can be used at any point after their definition. + +Flags can be specified at any point after their definition, not just +*immediately after their associated command*. From the chat example below, the +following used to be required: + +``` +$ chat --server=chat.server.com:8080 post --image=~/Downloads/owls.jpg pics +``` + +But the following will now work: + +``` +$ chat post --server=chat.server.com:8080 --image=~/Downloads/owls.jpg pics +``` + +### Short flags can be combined with their parameters + +Previously, if a short flag was used, any argument to that flag would have to +be separated by a space. That is no longer the case. + +## API changes between v1 and v2 + +- `ParseWithFileExpansion()` is gone. The new parser directly supports expanding `@`. +- Added `FatalUsage()` and `FatalUsageContext()` for displaying an error + usage and terminating. +- `Dispatch()` renamed to `Action()`. +- Added `ParseContext()` for parsing a command line into its intermediate context form without executing. +- Added `Terminate()` function to override the termination function. +- Added `UsageForContextWithTemplate()` for printing usage via a custom template. +- Added `UsageTemplate()` for overriding the default template to use. Two templates are included: + 1. `DefaultUsageTemplate` - default template. + 2. `CompactUsageTemplate` - compact command template for larger applications. + +## Versions + +Kingpin uses [gopkg.in](https://gopkg.in/alecthomas/kingpin) for versioning. + +The current stable version is [gopkg.in/alecthomas/kingpin.v2](https://gopkg.in/alecthomas/kingpin.v2). The previous version, [gopkg.in/alecthomas/kingpin.v1](https://gopkg.in/alecthomas/kingpin.v1), is deprecated and in maintenance mode. + +### [V2](https://gopkg.in/alecthomas/kingpin.v2) is the current stable version + +Installation: + +```sh +$ go get gopkg.in/alecthomas/kingpin.v2 +``` + +### [V1](https://gopkg.in/alecthomas/kingpin.v1) is the OLD stable version + +Installation: + +```sh +$ go get gopkg.in/alecthomas/kingpin.v1 +``` + +## Change History + +- *2015-09-19* -- Stable v2.1.0 release. + - Added `command.Default()` to specify a default command to use if no other + command matches. This allows for convenient user shortcuts. + - Exposed `HelpFlag` and `VersionFlag` for further customisation. + - `Action()` and `PreAction()` added and both now support an arbitrary + number of callbacks. + - `kingpin.SeparateOptionalFlagsUsageTemplate`. + - `--help-long` and `--help-man` (hidden by default) flags. + - Flags are "interspersed" by default, but can be disabled with `app.Interspersed(false)`. + - Added flags for all simple builtin types (int8, uint16, etc.) and slice variants. + - Use `app.Writer(os.Writer)` to specify the default writer for all output functions. + - Dropped `os.Writer` prefix from all printf-like functions. + +- *2015-05-22* -- Stable v2.0.0 release. + - Initial stable release of v2.0.0. + - Fully supports interspersed flags, commands and arguments. + - Flags can be present at any point after their logical definition. + - Application.Parse() terminates if commands are present and a command is not parsed. + - Dispatch() -> Action(). + - Actions are dispatched after all values are populated. + - Override termination function (defaults to os.Exit). + - Override output stream (defaults to os.Stderr). + - Templatised usage help, with default and compact templates. + - Make error/usage functions more consistent. + - Support argument expansion from files by default (with @). + - Fully public data model is available via .Model(). + - Parser has been completely refactored. + - Parsing and execution has been split into distinct stages. + - Use `go generate` to generate repeated flags. + - Support combined short-flag+argument: -fARG. + +- *2015-01-23* -- Stable v1.3.4 release. + - Support "--" for separating flags from positional arguments. + - Support loading flags from files (ParseWithFileExpansion()). Use @FILE as an argument. + - Add post-app and post-cmd validation hooks. This allows arbitrary validation to be added. + - A bunch of improvements to help usage and formatting. + - Support arbitrarily nested sub-commands. + +- *2014-07-08* -- Stable v1.2.0 release. + - Pass any value through to `Strings()` when final argument. + Allows for values that look like flags to be processed. + - Allow `--help` to be used with commands. + - Support `Hidden()` flags. + - Parser for [units.Base2Bytes](https://github.com/alecthomas/units) + type. Allows for flags like `--ram=512MB` or `--ram=1GB`. + - Add an `Enum()` value, allowing only one of a set of values + to be selected. eg. `Flag(...).Enum("debug", "info", "warning")`. + +- *2014-06-27* -- Stable v1.1.0 release. + - Bug fixes. + - Always return an error (rather than panicing) when misconfigured. + - `OpenFile(flag, perm)` value type added, for finer control over opening files. + - Significantly improved usage formatting. + +- *2014-06-19* -- Stable v1.0.0 release. + - Support [cumulative positional](#consuming-all-remaining-arguments) arguments. + - Return error rather than panic when there are fatal errors not caught by + the type system. eg. when a default value is invalid. + - Use gokpg.in. + +- *2014-06-10* -- Place-holder streamlining. + - Renamed `MetaVar` to `PlaceHolder`. + - Removed `MetaVarFromDefault`. Kingpin now uses [heuristics](#place-holders-in-help) + to determine what to display. + +## Examples + +### Simple Example + +Kingpin can be used for simple flag+arg applications like so: + +``` +$ ping --help +usage: ping [] [] + +Flags: + --debug Enable debug mode. + --help Show help. + -t, --timeout=5s Timeout waiting for ping. + +Args: + IP address to ping. + [] Number of packets to send +$ ping 1.2.3.4 5 +Would ping: 1.2.3.4 with timeout 5s and count 5 +``` + +From the following source: + +```go +package main + +import ( + "fmt" + + "gopkg.in/alecthomas/kingpin.v2" +) + +var ( + debug = kingpin.Flag("debug", "Enable debug mode.").Bool() + timeout = kingpin.Flag("timeout", "Timeout waiting for ping.").Default("5s").OverrideDefaultFromEnvar("PING_TIMEOUT").Short('t').Duration() + ip = kingpin.Arg("ip", "IP address to ping.").Required().IP() + count = kingpin.Arg("count", "Number of packets to send").Int() +) + +func main() { + kingpin.Version("0.0.1") + kingpin.Parse() + fmt.Printf("Would ping: %s with timeout %s and count %d\n", *ip, *timeout, *count) +} +``` + +### Complex Example + +Kingpin can also produce complex command-line applications with global flags, +subcommands, and per-subcommand flags, like this: + +``` +$ chat --help +usage: chat [] [] [ ...] + +A command-line chat application. + +Flags: + --help Show help. + --debug Enable debug mode. + --server=127.0.0.1 Server address. + +Commands: + help [] + Show help for a command. + + register + Register a new user. + + post [] [] + Post a message to a channel. + +$ chat help post +usage: chat [] post [] [] + +Post a message to a channel. + +Flags: + --image=IMAGE Image to post. + +Args: + Channel to post to. + [] Text to post. + +$ chat post --image=~/Downloads/owls.jpg pics +... +``` + +From this code: + +```go +package main + +import ( + "os" + "strings" + "gopkg.in/alecthomas/kingpin.v2" +) + +var ( + app = kingpin.New("chat", "A command-line chat application.") + debug = app.Flag("debug", "Enable debug mode.").Bool() + serverIP = app.Flag("server", "Server address.").Default("127.0.0.1").IP() + + register = app.Command("register", "Register a new user.") + registerNick = register.Arg("nick", "Nickname for user.").Required().String() + registerName = register.Arg("name", "Name of user.").Required().String() + + post = app.Command("post", "Post a message to a channel.") + postImage = post.Flag("image", "Image to post.").File() + postChannel = post.Arg("channel", "Channel to post to.").Required().String() + postText = post.Arg("text", "Text to post.").Strings() +) + +func main() { + switch kingpin.MustParse(app.Parse(os.Args[1:])) { + // Register user + case register.FullCommand(): + println(*registerNick) + + // Post message + case post.FullCommand(): + if *postImage != nil { + } + text := strings.Join(*postText, " ") + println("Post:", text) + } +} +``` + +## Reference Documentation + +### Displaying errors and usage information + +Kingpin exports a set of functions to provide consistent errors and usage +information to the user. + +Error messages look something like this: + + : error: + +The functions on `Application` are: + +Function | Purpose +---------|-------------- +`Errorf(format, args)` | Display a printf formatted error to the user. +`Fatalf(format, args)` | As with Errorf, but also call the termination handler. +`FatalUsage(format, args)` | As with Fatalf, but also print contextual usage information. +`FatalUsageContext(context, format, args)` | As with Fatalf, but also print contextual usage information from a `ParseContext`. +`FatalIfError(err, format, args)` | Conditionally print an error prefixed with format+args, then call the termination handler + +There are equivalent global functions in the kingpin namespace for the default +`kingpin.CommandLine` instance. + +### Sub-commands + +Kingpin supports nested sub-commands, with separate flag and positional +arguments per sub-command. Note that positional arguments may only occur after +sub-commands. + +For example: + +```go +var ( + deleteCommand = kingpin.Command("delete", "Delete an object.") + deleteUserCommand = deleteCommand.Command("user", "Delete a user.") + deleteUserUIDFlag = deleteUserCommand.Flag("uid", "Delete user by UID rather than username.") + deleteUserUsername = deleteUserCommand.Arg("username", "Username to delete.") + deletePostCommand = deleteCommand.Command("post", "Delete a post.") +) + +func main() { + switch kingpin.Parse() { + case "delete user": + case "delete post": + } +} +``` + +### Custom Parsers + +Kingpin supports both flag and positional argument parsers for converting to +Go types. For example, some included parsers are `Int()`, `Float()`, +`Duration()` and `ExistingFile()` (see [parsers.go](./parsers.go) for a complete list of included parsers). + +Parsers conform to Go's [`flag.Value`](http://godoc.org/flag#Value) +interface, so any existing implementations will work. + +For example, a parser for accumulating HTTP header values might look like this: + +```go +type HTTPHeaderValue http.Header + +func (h *HTTPHeaderValue) Set(value string) error { + parts := strings.SplitN(value, ":", 2) + if len(parts) != 2 { + return fmt.Errorf("expected HEADER:VALUE got '%s'", value) + } + (*http.Header)(h).Add(parts[0], parts[1]) + return nil +} + +func (h *HTTPHeaderValue) String() string { + return "" +} +``` + +As a convenience, I would recommend something like this: + +```go +func HTTPHeader(s Settings) (target *http.Header) { + target = &http.Header{} + s.SetValue((*HTTPHeaderValue)(target)) + return +} +``` + +You would use it like so: + +```go +headers = HTTPHeader(kingpin.Flag("header", "Add a HTTP header to the request.").Short('H')) +``` + +### Repeatable flags + +Depending on the `Value` they hold, some flags may be repeated. The +`IsCumulative() bool` function on `Value` tells if it's safe to call `Set()` +multiple times or if an error should be raised if several values are passed. + +The built-in `Value`s returning slices and maps, as well as `Counter` are +examples of `Value`s that make a flag repeatable. + +### Boolean values + +Boolean values are uniquely managed by Kingpin. Each boolean flag will have a negative complement: +`--` and `--no-`. + +### Default Values + +The default value is the zero value for a type. This can be overridden with +the `Default(value...)` function on flags and arguments. This function accepts +one or several strings, which are parsed by the value itself, so they *must* +be compliant with the format expected. + +### Place-holders in Help + +The place-holder value for a flag is the value used in the help to describe +the value of a non-boolean flag. + +The value provided to PlaceHolder() is used if provided, then the value +provided by Default() if provided, then finally the capitalised flag name is +used. + +Here are some examples of flags with various permutations: + + --name=NAME // Flag(...).String() + --name="Harry" // Flag(...).Default("Harry").String() + --name=FULL-NAME // Flag(...).PlaceHolder("FULL-NAME").Default("Harry").String() + +### Consuming all remaining arguments + +A common command-line idiom is to use all remaining arguments for some +purpose. eg. The following command accepts an arbitrary number of +IP addresses as positional arguments: + + ./cmd ping 10.1.1.1 192.168.1.1 + +Such arguments are similar to [repeatable flags](#repeatable-flags), but for +arguments. Therefore they use the same `IsCumulative() bool` function on the +underlying `Value`, so the built-in `Value`s for which the `Set()` function +can be called several times will consume multiple arguments. + +To implement the above example with a custom `Value`, we might do something +like this: + +```go +type ipList []net.IP + +func (i *ipList) Set(value string) error { + if ip := net.ParseIP(value); ip == nil { + return fmt.Errorf("'%s' is not an IP address", value) + } else { + *i = append(*i, ip) + return nil + } +} + +func (i *ipList) String() string { + return "" +} + +func (i *ipList) IsCumulative() bool { + return true +} + +func IPList(s Settings) (target *[]net.IP) { + target = new([]net.IP) + s.SetValue((*ipList)(target)) + return +} +``` + +And use it like so: + +```go +ips := IPList(kingpin.Arg("ips", "IP addresses to ping.")) +``` + +### Bash/ZSH Shell Completion + +By default, all flags and commands/subcommands generate completions +internally. + +Out of the box, CLI tools using kingpin should be able to take advantage +of completion hinting for flags and commands. By specifying +`--completion-bash` as the first argument, your CLI tool will show +possible subcommands. By ending your argv with `--`, hints for flags +will be shown. + +To allow your end users to take advantage you must package a +`/etc/bash_completion.d` script with your distribution (or the equivalent +for your target platform/shell). An alternative is to instruct your end +user to source a script from their `bash_profile` (or equivalent). + +Fortunately Kingpin makes it easy to generate or source a script for use +with end users shells. `./yourtool --completion-script-bash` and +`./yourtool --completion-script-zsh` will generate these scripts for you. + +**Installation by Package** + +For the best user experience, you should bundle your pre-created +completion script with your CLI tool and install it inside +`/etc/bash_completion.d` (or equivalent). A good suggestion is to add +this as an automated step to your build pipeline, in the implementation +is improved for bug fixed. + +**Installation by `bash_profile`** + +Alternatively, instruct your users to add an additional statement to +their `bash_profile` (or equivalent): + +``` +eval "$(your-cli-tool --completion-script-bash)" +``` + +Or for ZSH + +``` +eval "$(your-cli-tool --completion-script-zsh)" +``` + +#### Additional API +To provide more flexibility, a completion option API has been +exposed for flags to allow user defined completion options, to extend +completions further than just EnumVar/Enum. + + +**Provide Static Options** + +When using an `Enum` or `EnumVar`, users are limited to only the options +given. Maybe we wish to hint possible options to the user, but also +allow them to provide their own custom option. `HintOptions` gives +this functionality to flags. + +``` +app := kingpin.New("completion", "My application with bash completion.") +app.Flag("port", "Provide a port to connect to"). + Required(). + HintOptions("80", "443", "8080"). + IntVar(&c.port) +``` + +**Provide Dynamic Options** +Consider the case that you needed to read a local database or a file to +provide suggestions. You can dynamically generate the options + +``` +func listHosts() []string { + // Provide a dynamic list of hosts from a hosts file or otherwise + // for bash completion. In this example we simply return static slice. + + // You could use this functionality to reach into a hosts file to provide + // completion for a list of known hosts. + return []string{"sshhost.example", "webhost.example", "ftphost.example"} +} + +app := kingpin.New("completion", "My application with bash completion.") +app.Flag("flag-1", "").HintAction(listHosts).String() +``` + +**EnumVar/Enum** +When using `Enum` or `EnumVar`, any provided options will be automatically +used for bash autocompletion. However, if you wish to provide a subset or +different options, you can use `HintOptions` or `HintAction` which will override +the default completion options for `Enum`/`EnumVar`. + + +**Examples** +You can see an in depth example of the completion API within +`examples/completion/main.go` + + +### Supporting -h for help + +`kingpin.CommandLine.HelpFlag.Short('h')` + +### Custom help + +Kingpin v2 supports templatised help using the text/template library (actually, [a fork](https://github.com/alecthomas/template)). + +You can specify the template to use with the [Application.UsageTemplate()](http://godoc.org/gopkg.in/alecthomas/kingpin.v2#Application.UsageTemplate) function. + +There are four included templates: `kingpin.DefaultUsageTemplate` is the default, +`kingpin.CompactUsageTemplate` provides a more compact representation for more complex command-line structures, +`kingpin.SeparateOptionalFlagsUsageTemplate` looks like the default template, but splits required +and optional command flags into separate lists, and `kingpin.ManPageTemplate` is used to generate man pages. + +See the above templates for examples of usage, and the the function [UsageForContextWithTemplate()](https://github.com/alecthomas/kingpin/blob/master/usage.go#L198) method for details on the context. + +#### Default help template + +``` +$ go run ./examples/curl/curl.go --help +usage: curl [] [ ...] + +An example implementation of curl. + +Flags: + --help Show help. + -t, --timeout=5s Set connection timeout. + -H, --headers=HEADER=VALUE + Add HTTP headers to the request. + +Commands: + help [...] + Show help. + + get url + Retrieve a URL. + + get file + Retrieve a file. + + post [] + POST a resource. +``` + +#### Compact help template + +``` +$ go run ./examples/curl/curl.go --help +usage: curl [] [ ...] + +An example implementation of curl. + +Flags: + --help Show help. + -t, --timeout=5s Set connection timeout. + -H, --headers=HEADER=VALUE + Add HTTP headers to the request. + +Commands: + help [...] + get [] + url + file + post [] +``` diff --git a/api/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/chat1/main.go b/api/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/chat1/main.go new file mode 100644 index 0000000..2a233fc --- /dev/null +++ b/api/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/chat1/main.go @@ -0,0 +1,20 @@ +package main + +import ( + "fmt" + + "gopkg.in/alecthomas/kingpin.v2" +) + +var ( + debug = kingpin.Flag("debug", "Enable debug mode.").Bool() + timeout = kingpin.Flag("timeout", "Timeout waiting for ping.").Default("5s").OverrideDefaultFromEnvar("PING_TIMEOUT").Short('t').Duration() + ip = kingpin.Arg("ip", "IP address to ping.").Required().IP() + count = kingpin.Arg("count", "Number of packets to send").Int() +) + +func main() { + kingpin.Version("0.0.1") + kingpin.Parse() + fmt.Printf("Would ping: %s with timeout %s and count %d", *ip, *timeout, *count) +} diff --git a/api/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/chat2/main.go b/api/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/chat2/main.go new file mode 100644 index 0000000..83891a7 --- /dev/null +++ b/api/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/chat2/main.go @@ -0,0 +1,38 @@ +package main + +import ( + "os" + "strings" + + "gopkg.in/alecthomas/kingpin.v2" +) + +var ( + app = kingpin.New("chat", "A command-line chat application.") + debug = app.Flag("debug", "Enable debug mode.").Bool() + serverIP = app.Flag("server", "Server address.").Default("127.0.0.1").IP() + + register = app.Command("register", "Register a new user.") + registerNick = register.Arg("nick", "Nickname for user.").Required().String() + registerName = register.Arg("name", "Name of user.").Required().String() + + post = app.Command("post", "Post a message to a channel.") + postImage = post.Flag("image", "Image to post.").File() + postChannel = post.Arg("channel", "Channel to post to.").Required().String() + postText = post.Arg("text", "Text to post.").Strings() +) + +func main() { + switch kingpin.MustParse(app.Parse(os.Args[1:])) { + // Register user + case register.FullCommand(): + println(*registerNick) + + // Post message + case post.FullCommand(): + if *postImage != nil { + } + text := strings.Join(*postText, " ") + println("Post:", text) + } +} diff --git a/api/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/completion/main.go b/api/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/completion/main.go new file mode 100644 index 0000000..0bbabe3 --- /dev/null +++ b/api/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/completion/main.go @@ -0,0 +1,96 @@ +package main + +import ( + "fmt" + "os" + + "gopkg.in/alecthomas/kingpin.v2" +) + +func listHosts() []string { + // Provide a dynamic list of hosts from a hosts file or otherwise + // for bash completion. In this example we simply return static slice. + + // You could use this functionality to reach into a hosts file to provide + // completion for a list of known hosts. + return []string{"sshhost.example", "webhost.example", "ftphost.example"} +} + +type NetcatCommand struct { + hostName string + port int + format string +} + +func (n *NetcatCommand) run(c *kingpin.ParseContext) error { + fmt.Printf("Would have run netcat to hostname %v, port %d, and output format %v\n", n.hostName, n.port, n.format) + return nil +} + +func configureNetcatCommand(app *kingpin.Application) { + c := &NetcatCommand{} + nc := app.Command("nc", "Connect to a Host").Action(c.run) + nc.Flag("nop-flag", "Example of a flag with no options").Bool() + + // You can provide hint options using a function to generate them + nc.Flag("host", "Provide a hostname to nc"). + Required(). + HintAction(listHosts). + StringVar(&c.hostName) + + // You can provide hint options statically + nc.Flag("port", "Provide a port to connect to"). + Required(). + HintOptions("80", "443", "8080"). + IntVar(&c.port) + + // Enum/EnumVar options will be turned into completion options automatically + nc.Flag("format", "Define the output format"). + Default("raw"). + EnumVar(&c.format, "raw", "json") + + // You can combine HintOptions with HintAction too + nc.Flag("host-with-multi", "Define a hostname"). + HintAction(listHosts). + HintOptions("myhost.com"). + String() + + // And combine with themselves + nc.Flag("host-with-multi-options", "Define a hostname"). + HintOptions("myhost.com"). + HintOptions("myhost2.com"). + String() + + // If you specify HintOptions/HintActions for Enum/EnumVar, the options + // provided for Enum/EnumVar will be overridden. + nc.Flag("format-with-override-1", "Define a format"). + HintAction(listHosts). + Enum("option1", "option2") + + nc.Flag("format-with-override-2", "Define a format"). + HintOptions("myhost.com", "myhost2.com"). + Enum("option1", "option2") +} + +func addSubCommand(app *kingpin.Application, name string, description string) { + c := app.Command(name, description).Action(func(c *kingpin.ParseContext) error { + fmt.Printf("Would have run command %s.\n", name) + return nil + }) + c.Flag("nop-flag", "Example of a flag with no options").Bool() +} + +func main() { + app := kingpin.New("completion", "My application with bash completion.") + app.Flag("flag-1", "").String() + app.Flag("flag-2", "").HintOptions("opt1", "opt2").String() + + configureNetcatCommand(app) + + // Add some additional top level commands + addSubCommand(app, "ls", "Additional top level command to show command completion") + addSubCommand(app, "ping", "Additional top level command to show command completion") + addSubCommand(app, "nmap", "Additional top level command to show command completion") + + kingpin.MustParse(app.Parse(os.Args[1:])) +} diff --git a/api/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/curl/main.go b/api/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/curl/main.go new file mode 100644 index 0000000..a877e7b --- /dev/null +++ b/api/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/curl/main.go @@ -0,0 +1,105 @@ +// A curl-like HTTP command-line client. +package main + +import ( + "errors" + "fmt" + "io" + "net/http" + "os" + "strings" + + "gopkg.in/alecthomas/kingpin.v2" +) + +var ( + timeout = kingpin.Flag("timeout", "Set connection timeout.").Short('t').Default("5s").Duration() + headers = HTTPHeader(kingpin.Flag("headers", "Add HTTP headers to the request.").Short('H').PlaceHolder("HEADER=VALUE")) + + get = kingpin.Command("get", "GET a resource.").Default() + getFlag = get.Flag("test", "Test flag").Bool() + getURL = get.Command("url", "Retrieve a URL.").Default() + getURLURL = getURL.Arg("url", "URL to GET.").Required().URL() + getFile = get.Command("file", "Retrieve a file.") + getFileFile = getFile.Arg("file", "File to retrieve.").Required().ExistingFile() + + post = kingpin.Command("post", "POST a resource.") + postData = post.Flag("data", "Key-value data to POST").Short('d').PlaceHolder("KEY:VALUE").StringMap() + postBinaryFile = post.Flag("data-binary", "File with binary data to POST.").File() + postURL = post.Arg("url", "URL to POST to.").Required().URL() +) + +type HTTPHeaderValue http.Header + +func (h HTTPHeaderValue) Set(value string) error { + parts := strings.SplitN(value, "=", 2) + if len(parts) != 2 { + return fmt.Errorf("expected HEADER=VALUE got '%s'", value) + } + (http.Header)(h).Add(parts[0], parts[1]) + return nil +} + +func (h HTTPHeaderValue) String() string { + return "" +} + +func HTTPHeader(s kingpin.Settings) (target *http.Header) { + target = &http.Header{} + s.SetValue((*HTTPHeaderValue)(target)) + return +} + +func applyRequest(req *http.Request) error { + req.Header = *headers + resp, err := http.DefaultClient.Do(req) + if err != nil { + return err + } + defer resp.Body.Close() + if resp.StatusCode < 200 || resp.StatusCode > 299 { + return fmt.Errorf("HTTP request failed: %s", resp.Status) + } + _, err = io.Copy(os.Stdout, resp.Body) + return err +} + +func apply(method string, url string) error { + req, err := http.NewRequest(method, url, nil) + if err != nil { + return err + } + return applyRequest(req) +} + +func applyPOST() error { + req, err := http.NewRequest("POST", (*postURL).String(), nil) + if err != nil { + return err + } + if len(*postData) > 0 { + for key, value := range *postData { + req.Form.Set(key, value) + } + } else if postBinaryFile != nil { + if headers.Get("Content-Type") != "" { + headers.Set("Content-Type", "application/octet-stream") + } + req.Body = *postBinaryFile + } else { + return errors.New("--data or --data-binary must be provided to POST") + } + return applyRequest(req) +} + +func main() { + kingpin.UsageTemplate(kingpin.CompactUsageTemplate).Version("1.0").Author("Alec Thomas") + kingpin.CommandLine.Help = "An example implementation of curl." + switch kingpin.Parse() { + case "get url": + kingpin.FatalIfError(apply("GET", (*getURLURL).String()), "GET failed") + + case "post": + kingpin.FatalIfError(applyPOST(), "POST failed") + } +} diff --git a/api/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/modular/main.go b/api/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/modular/main.go new file mode 100644 index 0000000..34cfa0b --- /dev/null +++ b/api/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/modular/main.go @@ -0,0 +1,30 @@ +package main + +import ( + "fmt" + "os" + + "gopkg.in/alecthomas/kingpin.v2" +) + +// Context for "ls" command +type LsCommand struct { + All bool +} + +func (l *LsCommand) run(c *kingpin.ParseContext) error { + fmt.Printf("all=%v\n", l.All) + return nil +} + +func configureLsCommand(app *kingpin.Application) { + c := &LsCommand{} + ls := app.Command("ls", "List files.").Action(c.run) + ls.Flag("all", "List all files.").Short('a').BoolVar(&c.All) +} + +func main() { + app := kingpin.New("modular", "My modular application.") + configureLsCommand(app) + kingpin.MustParse(app.Parse(os.Args[1:])) +} diff --git a/api/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/ping/main.go b/api/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/ping/main.go new file mode 100644 index 0000000..41ea263 --- /dev/null +++ b/api/vendor/gopkg.in/alecthomas/kingpin.v2/_examples/ping/main.go @@ -0,0 +1,20 @@ +package main + +import ( + "fmt" + + "gopkg.in/alecthomas/kingpin.v2" +) + +var ( + debug = kingpin.Flag("debug", "Enable debug mode.").Bool() + timeout = kingpin.Flag("timeout", "Timeout waiting for ping.").OverrideDefaultFromEnvar("PING_TIMEOUT").Required().Short('t').Duration() + ip = kingpin.Arg("ip", "IP address to ping.").Required().IP() + count = kingpin.Arg("count", "Number of packets to send").Int() +) + +func main() { + kingpin.Version("0.0.1") + kingpin.Parse() + fmt.Printf("Would ping: %s with timeout %s and count %d", *ip, *timeout, *count) +} diff --git a/api/vendor/gopkg.in/alecthomas/kingpin.v2/actions.go b/api/vendor/gopkg.in/alecthomas/kingpin.v2/actions.go new file mode 100644 index 0000000..72d6cbd --- /dev/null +++ b/api/vendor/gopkg.in/alecthomas/kingpin.v2/actions.go @@ -0,0 +1,42 @@ +package kingpin + +// Action callback executed at various stages after all values are populated. +// The application, commands, arguments and flags all have corresponding +// actions. +type Action func(*ParseContext) error + +type actionMixin struct { + actions []Action + preActions []Action +} + +type actionApplier interface { + applyActions(*ParseContext) error + applyPreActions(*ParseContext) error +} + +func (a *actionMixin) addAction(action Action) { + a.actions = append(a.actions, action) +} + +func (a *actionMixin) addPreAction(action Action) { + a.preActions = append(a.preActions, action) +} + +func (a *actionMixin) applyActions(context *ParseContext) error { + for _, action := range a.actions { + if err := action(context); err != nil { + return err + } + } + return nil +} + +func (a *actionMixin) applyPreActions(context *ParseContext) error { + for _, preAction := range a.preActions { + if err := preAction(context); err != nil { + return err + } + } + return nil +} diff --git a/api/vendor/gopkg.in/alecthomas/kingpin.v2/app.go b/api/vendor/gopkg.in/alecthomas/kingpin.v2/app.go new file mode 100644 index 0000000..1a1a5ef --- /dev/null +++ b/api/vendor/gopkg.in/alecthomas/kingpin.v2/app.go @@ -0,0 +1,688 @@ +package kingpin + +import ( + "fmt" + "io" + "os" + "regexp" + "strings" +) + +var ( + ErrCommandNotSpecified = fmt.Errorf("command not specified") +) + +var ( + envarTransformRegexp = regexp.MustCompile(`[^a-zA-Z0-9_]+`) +) + +type ApplicationValidator func(*Application) error + +// An Application contains the definitions of flags, arguments and commands +// for an application. +type Application struct { + cmdMixin + initialized bool + + Name string + Help string + + author string + version string + errorWriter io.Writer // Destination for errors. + usageWriter io.Writer // Destination for usage + usageTemplate string + validator ApplicationValidator + terminate func(status int) // See Terminate() + noInterspersed bool // can flags be interspersed with args (or must they come first) + defaultEnvars bool + completion bool + + // Help flag. Exposed for user customisation. + HelpFlag *FlagClause + // Help command. Exposed for user customisation. May be nil. + HelpCommand *CmdClause + // Version flag. Exposed for user customisation. May be nil. + VersionFlag *FlagClause +} + +// New creates a new Kingpin application instance. +func New(name, help string) *Application { + a := &Application{ + Name: name, + Help: help, + errorWriter: os.Stderr, // Left for backwards compatibility purposes. + usageWriter: os.Stderr, + usageTemplate: DefaultUsageTemplate, + terminate: os.Exit, + } + a.flagGroup = newFlagGroup() + a.argGroup = newArgGroup() + a.cmdGroup = newCmdGroup(a) + a.HelpFlag = a.Flag("help", "Show context-sensitive help (also try --help-long and --help-man).") + a.HelpFlag.Bool() + a.Flag("help-long", "Generate long help.").Hidden().PreAction(a.generateLongHelp).Bool() + a.Flag("help-man", "Generate a man page.").Hidden().PreAction(a.generateManPage).Bool() + a.Flag("completion-bash", "Output possible completions for the given args.").Hidden().BoolVar(&a.completion) + a.Flag("completion-script-bash", "Generate completion script for bash.").Hidden().PreAction(a.generateBashCompletionScript).Bool() + a.Flag("completion-script-zsh", "Generate completion script for ZSH.").Hidden().PreAction(a.generateZSHCompletionScript).Bool() + + return a +} + +func (a *Application) generateLongHelp(c *ParseContext) error { + a.Writer(os.Stdout) + if err := a.UsageForContextWithTemplate(c, 2, LongHelpTemplate); err != nil { + return err + } + a.terminate(0) + return nil +} + +func (a *Application) generateManPage(c *ParseContext) error { + a.Writer(os.Stdout) + if err := a.UsageForContextWithTemplate(c, 2, ManPageTemplate); err != nil { + return err + } + a.terminate(0) + return nil +} + +func (a *Application) generateBashCompletionScript(c *ParseContext) error { + a.Writer(os.Stdout) + if err := a.UsageForContextWithTemplate(c, 2, BashCompletionTemplate); err != nil { + return err + } + a.terminate(0) + return nil +} + +func (a *Application) generateZSHCompletionScript(c *ParseContext) error { + a.Writer(os.Stdout) + if err := a.UsageForContextWithTemplate(c, 2, ZshCompletionTemplate); err != nil { + return err + } + a.terminate(0) + return nil +} + +// DefaultEnvars configures all flags (that do not already have an associated +// envar) to use a default environment variable in the form "_". +// +// For example, if the application is named "foo" and a flag is named "bar- +// waz" the environment variable: "FOO_BAR_WAZ". +func (a *Application) DefaultEnvars() *Application { + a.defaultEnvars = true + return a +} + +// Terminate specifies the termination handler. Defaults to os.Exit(status). +// If nil is passed, a no-op function will be used. +func (a *Application) Terminate(terminate func(int)) *Application { + if terminate == nil { + terminate = func(int) {} + } + a.terminate = terminate + return a +} + +// Writer specifies the writer to use for usage and errors. Defaults to os.Stderr. +// DEPRECATED: See ErrorWriter and UsageWriter. +func (a *Application) Writer(w io.Writer) *Application { + a.errorWriter = w + a.usageWriter = w + return a +} + +// ErrorWriter sets the io.Writer to use for errors. +func (a *Application) ErrorWriter(w io.Writer) *Application { + a.errorWriter = w + return a +} + +// UsageWriter sets the io.Writer to use for errors. +func (a *Application) UsageWriter(w io.Writer) *Application { + a.usageWriter = w + return a +} + +// UsageTemplate specifies the text template to use when displaying usage +// information. The default is UsageTemplate. +func (a *Application) UsageTemplate(template string) *Application { + a.usageTemplate = template + return a +} + +// Validate sets a validation function to run when parsing. +func (a *Application) Validate(validator ApplicationValidator) *Application { + a.validator = validator + return a +} + +// ParseContext parses the given command line and returns the fully populated +// ParseContext. +func (a *Application) ParseContext(args []string) (*ParseContext, error) { + return a.parseContext(false, args) +} + +func (a *Application) parseContext(ignoreDefault bool, args []string) (*ParseContext, error) { + if err := a.init(); err != nil { + return nil, err + } + context := tokenize(args, ignoreDefault) + err := parse(context, a) + return context, err +} + +// Parse parses command-line arguments. It returns the selected command and an +// error. The selected command will be a space separated subcommand, if +// subcommands have been configured. +// +// This will populate all flag and argument values, call all callbacks, and so +// on. +func (a *Application) Parse(args []string) (command string, err error) { + + context, parseErr := a.ParseContext(args) + selected := []string{} + var setValuesErr error + + if context == nil { + // Since we do not throw error immediately, there could be a case + // where a context returns nil. Protect against that. + return "", parseErr + } + + if err = a.setDefaults(context); err != nil { + return "", err + } + + selected, setValuesErr = a.setValues(context) + + if err = a.applyPreActions(context, !a.completion); err != nil { + return "", err + } + + if a.completion { + a.generateBashCompletion(context) + a.terminate(0) + } else { + if parseErr != nil { + return "", parseErr + } + + a.maybeHelp(context) + if !context.EOL() { + return "", fmt.Errorf("unexpected argument '%s'", context.Peek()) + } + + if setValuesErr != nil { + return "", setValuesErr + } + + command, err = a.execute(context, selected) + if err == ErrCommandNotSpecified { + a.writeUsage(context, nil) + } + } + return command, err +} + +func (a *Application) writeUsage(context *ParseContext, err error) { + if err != nil { + a.Errorf("%s", err) + } + if err := a.UsageForContext(context); err != nil { + panic(err) + } + if err != nil { + a.terminate(1) + } else { + a.terminate(0) + } +} + +func (a *Application) maybeHelp(context *ParseContext) { + for _, element := range context.Elements { + if flag, ok := element.Clause.(*FlagClause); ok && flag == a.HelpFlag { + // Re-parse the command-line ignoring defaults, so that help works correctly. + context, _ = a.parseContext(true, context.rawArgs) + a.writeUsage(context, nil) + } + } +} + +// Version adds a --version flag for displaying the application version. +func (a *Application) Version(version string) *Application { + a.version = version + a.VersionFlag = a.Flag("version", "Show application version.").PreAction(func(*ParseContext) error { + fmt.Fprintln(a.usageWriter, version) + a.terminate(0) + return nil + }) + a.VersionFlag.Bool() + return a +} + +// Author sets the author output by some help templates. +func (a *Application) Author(author string) *Application { + a.author = author + return a +} + +// Action callback to call when all values are populated and parsing is +// complete, but before any command, flag or argument actions. +// +// All Action() callbacks are called in the order they are encountered on the +// command line. +func (a *Application) Action(action Action) *Application { + a.addAction(action) + return a +} + +// Action called after parsing completes but before validation and execution. +func (a *Application) PreAction(action Action) *Application { + a.addPreAction(action) + return a +} + +// Command adds a new top-level command. +func (a *Application) Command(name, help string) *CmdClause { + return a.addCommand(name, help) +} + +// Interspersed control if flags can be interspersed with positional arguments +// +// true (the default) means that they can, false means that all the flags must appear before the first positional arguments. +func (a *Application) Interspersed(interspersed bool) *Application { + a.noInterspersed = !interspersed + return a +} + +func (a *Application) defaultEnvarPrefix() string { + if a.defaultEnvars { + return a.Name + } + return "" +} + +func (a *Application) init() error { + if a.initialized { + return nil + } + if a.cmdGroup.have() && a.argGroup.have() { + return fmt.Errorf("can't mix top-level Arg()s with Command()s") + } + + // If we have subcommands, add a help command at the top-level. + if a.cmdGroup.have() { + var command []string + a.HelpCommand = a.Command("help", "Show help.").PreAction(func(context *ParseContext) error { + a.Usage(command) + a.terminate(0) + return nil + }) + a.HelpCommand.Arg("command", "Show help on command.").StringsVar(&command) + // Make help first command. + l := len(a.commandOrder) + a.commandOrder = append(a.commandOrder[l-1:l], a.commandOrder[:l-1]...) + } + + if err := a.flagGroup.init(a.defaultEnvarPrefix()); err != nil { + return err + } + if err := a.cmdGroup.init(); err != nil { + return err + } + if err := a.argGroup.init(); err != nil { + return err + } + for _, cmd := range a.commands { + if err := cmd.init(); err != nil { + return err + } + } + flagGroups := []*flagGroup{a.flagGroup} + for _, cmd := range a.commandOrder { + if err := checkDuplicateFlags(cmd, flagGroups); err != nil { + return err + } + } + a.initialized = true + return nil +} + +// Recursively check commands for duplicate flags. +func checkDuplicateFlags(current *CmdClause, flagGroups []*flagGroup) error { + // Check for duplicates. + for _, flags := range flagGroups { + for _, flag := range current.flagOrder { + if flag.shorthand != 0 { + if _, ok := flags.short[string(flag.shorthand)]; ok { + return fmt.Errorf("duplicate short flag -%c", flag.shorthand) + } + } + if _, ok := flags.long[flag.name]; ok { + return fmt.Errorf("duplicate long flag --%s", flag.name) + } + } + } + flagGroups = append(flagGroups, current.flagGroup) + // Check subcommands. + for _, subcmd := range current.commandOrder { + if err := checkDuplicateFlags(subcmd, flagGroups); err != nil { + return err + } + } + return nil +} + +func (a *Application) execute(context *ParseContext, selected []string) (string, error) { + var err error + + if err = a.validateRequired(context); err != nil { + return "", err + } + + if err = a.applyValidators(context); err != nil { + return "", err + } + + if err = a.applyActions(context); err != nil { + return "", err + } + + command := strings.Join(selected, " ") + if command == "" && a.cmdGroup.have() { + return "", ErrCommandNotSpecified + } + return command, err +} + +func (a *Application) setDefaults(context *ParseContext) error { + flagElements := map[string]*ParseElement{} + for _, element := range context.Elements { + if flag, ok := element.Clause.(*FlagClause); ok { + if flag.name == "help" { + return nil + } + flagElements[flag.name] = element + } + } + + argElements := map[string]*ParseElement{} + for _, element := range context.Elements { + if arg, ok := element.Clause.(*ArgClause); ok { + argElements[arg.name] = element + } + } + + // Check required flags and set defaults. + for _, flag := range context.flags.long { + if flagElements[flag.name] == nil { + if err := flag.setDefault(); err != nil { + return err + } + } + } + + for _, arg := range context.arguments.args { + if argElements[arg.name] == nil { + if err := arg.setDefault(); err != nil { + return err + } + } + } + + return nil +} + +func (a *Application) validateRequired(context *ParseContext) error { + flagElements := map[string]*ParseElement{} + for _, element := range context.Elements { + if flag, ok := element.Clause.(*FlagClause); ok { + flagElements[flag.name] = element + } + } + + argElements := map[string]*ParseElement{} + for _, element := range context.Elements { + if arg, ok := element.Clause.(*ArgClause); ok { + argElements[arg.name] = element + } + } + + // Check required flags and set defaults. + for _, flag := range context.flags.long { + if flagElements[flag.name] == nil { + // Check required flags were provided. + if flag.needsValue() { + return fmt.Errorf("required flag --%s not provided", flag.name) + } + } + } + + for _, arg := range context.arguments.args { + if argElements[arg.name] == nil { + if arg.needsValue() { + return fmt.Errorf("required argument '%s' not provided", arg.name) + } + } + } + return nil +} + +func (a *Application) setValues(context *ParseContext) (selected []string, err error) { + // Set all arg and flag values. + var ( + lastCmd *CmdClause + flagSet = map[string]struct{}{} + ) + for _, element := range context.Elements { + switch clause := element.Clause.(type) { + case *FlagClause: + if _, ok := flagSet[clause.name]; ok { + if v, ok := clause.value.(repeatableFlag); !ok || !v.IsCumulative() { + return nil, fmt.Errorf("flag '%s' cannot be repeated", clause.name) + } + } + if err = clause.value.Set(*element.Value); err != nil { + return + } + flagSet[clause.name] = struct{}{} + + case *ArgClause: + if err = clause.value.Set(*element.Value); err != nil { + return + } + + case *CmdClause: + if clause.validator != nil { + if err = clause.validator(clause); err != nil { + return + } + } + selected = append(selected, clause.name) + lastCmd = clause + } + } + + if lastCmd != nil && len(lastCmd.commands) > 0 { + return nil, fmt.Errorf("must select a subcommand of '%s'", lastCmd.FullCommand()) + } + + return +} + +func (a *Application) applyValidators(context *ParseContext) (err error) { + // Call command validation functions. + for _, element := range context.Elements { + if cmd, ok := element.Clause.(*CmdClause); ok && cmd.validator != nil { + if err = cmd.validator(cmd); err != nil { + return err + } + } + } + + if a.validator != nil { + err = a.validator(a) + } + return err +} + +func (a *Application) applyPreActions(context *ParseContext, dispatch bool) error { + if err := a.actionMixin.applyPreActions(context); err != nil { + return err + } + // Dispatch to actions. + if dispatch { + for _, element := range context.Elements { + if applier, ok := element.Clause.(actionApplier); ok { + if err := applier.applyPreActions(context); err != nil { + return err + } + } + } + } + + return nil +} + +func (a *Application) applyActions(context *ParseContext) error { + if err := a.actionMixin.applyActions(context); err != nil { + return err + } + // Dispatch to actions. + for _, element := range context.Elements { + if applier, ok := element.Clause.(actionApplier); ok { + if err := applier.applyActions(context); err != nil { + return err + } + } + } + return nil +} + +// Errorf prints an error message to w in the format ": error: ". +func (a *Application) Errorf(format string, args ...interface{}) { + fmt.Fprintf(a.errorWriter, a.Name+": error: "+format+"\n", args...) +} + +// Fatalf writes a formatted error to w then terminates with exit status 1. +func (a *Application) Fatalf(format string, args ...interface{}) { + a.Errorf(format, args...) + a.terminate(1) +} + +// FatalUsage prints an error message followed by usage information, then +// exits with a non-zero status. +func (a *Application) FatalUsage(format string, args ...interface{}) { + a.Errorf(format, args...) + // Force usage to go to error output. + a.usageWriter = a.errorWriter + a.Usage([]string{}) + a.terminate(1) +} + +// FatalUsageContext writes a printf formatted error message to w, then usage +// information for the given ParseContext, before exiting. +func (a *Application) FatalUsageContext(context *ParseContext, format string, args ...interface{}) { + a.Errorf(format, args...) + if err := a.UsageForContext(context); err != nil { + panic(err) + } + a.terminate(1) +} + +// FatalIfError prints an error and exits if err is not nil. The error is printed +// with the given formatted string, if any. +func (a *Application) FatalIfError(err error, format string, args ...interface{}) { + if err != nil { + prefix := "" + if format != "" { + prefix = fmt.Sprintf(format, args...) + ": " + } + a.Errorf(prefix+"%s", err) + a.terminate(1) + } +} + +func (a *Application) completionOptions(context *ParseContext) []string { + args := context.rawArgs + + var ( + currArg string + prevArg string + target cmdMixin + ) + + numArgs := len(args) + if numArgs > 1 { + args = args[1:] + currArg = args[len(args)-1] + } + if numArgs > 2 { + prevArg = args[len(args)-2] + } + + target = a.cmdMixin + if context.SelectedCommand != nil { + // A subcommand was in use. We will use it as the target + target = context.SelectedCommand.cmdMixin + } + + if (currArg != "" && strings.HasPrefix(currArg, "--")) || strings.HasPrefix(prevArg, "--") { + // Perform completion for A flag. The last/current argument started with "-" + var ( + flagName string // The name of a flag if given (could be half complete) + flagValue string // The value assigned to a flag (if given) (could be half complete) + ) + + if strings.HasPrefix(prevArg, "--") && !strings.HasPrefix(currArg, "--") { + // Matches: ./myApp --flag value + // Wont Match: ./myApp --flag -- + flagName = prevArg[2:] // Strip the "--" + flagValue = currArg + } else if strings.HasPrefix(currArg, "--") { + // Matches: ./myApp --flag -- + // Matches: ./myApp --flag somevalue -- + // Matches: ./myApp -- + flagName = currArg[2:] // Strip the "--" + } + + options, flagMatched, valueMatched := target.FlagCompletion(flagName, flagValue) + if valueMatched { + // Value Matched. Show cmdCompletions + return target.CmdCompletion(context) + } + + // Add top level flags if we're not at the top level and no match was found. + if context.SelectedCommand != nil && !flagMatched { + topOptions, topFlagMatched, topValueMatched := a.FlagCompletion(flagName, flagValue) + if topValueMatched { + // Value Matched. Back to cmdCompletions + return target.CmdCompletion(context) + } + + if topFlagMatched { + // Top level had a flag which matched the input. Return it's options. + options = topOptions + } else { + // Add top level flags + options = append(options, topOptions...) + } + } + return options + } + + // Perform completion for sub commands and arguments. + return target.CmdCompletion(context) +} + +func (a *Application) generateBashCompletion(context *ParseContext) { + options := a.completionOptions(context) + fmt.Printf("%s", strings.Join(options, "\n")) +} + +func envarTransform(name string) string { + return strings.ToUpper(envarTransformRegexp.ReplaceAllString(name, "_")) +} diff --git a/api/vendor/gopkg.in/alecthomas/kingpin.v2/app_test.go b/api/vendor/gopkg.in/alecthomas/kingpin.v2/app_test.go new file mode 100644 index 0000000..b9083a6 --- /dev/null +++ b/api/vendor/gopkg.in/alecthomas/kingpin.v2/app_test.go @@ -0,0 +1,404 @@ +package kingpin + +import ( + "io/ioutil" + + "github.com/stretchr/testify/assert" + + "sort" + "strings" + "testing" + "time" +) + +func newTestApp() *Application { + return New("test", "").Terminate(nil) +} + +func TestCommander(t *testing.T) { + c := newTestApp() + ping := c.Command("ping", "Ping an IP address.") + pingTTL := ping.Flag("ttl", "TTL for ICMP packets").Short('t').Default("5s").Duration() + + selected, err := c.Parse([]string{"ping"}) + assert.NoError(t, err) + assert.Equal(t, "ping", selected) + assert.Equal(t, 5*time.Second, *pingTTL) + + selected, err = c.Parse([]string{"ping", "--ttl=10s"}) + assert.NoError(t, err) + assert.Equal(t, "ping", selected) + assert.Equal(t, 10*time.Second, *pingTTL) +} + +func TestRequiredFlags(t *testing.T) { + c := newTestApp() + c.Flag("a", "a").String() + c.Flag("b", "b").Required().String() + + _, err := c.Parse([]string{"--a=foo"}) + assert.Error(t, err) + _, err = c.Parse([]string{"--b=foo"}) + assert.NoError(t, err) +} + +func TestRepeatableFlags(t *testing.T) { + c := newTestApp() + c.Flag("a", "a").String() + c.Flag("b", "b").Strings() + _, err := c.Parse([]string{"--a=foo", "--a=bar"}) + assert.Error(t, err) + _, err = c.Parse([]string{"--b=foo", "--b=bar"}) + assert.NoError(t, err) +} + +func TestInvalidDefaultFlagValueErrors(t *testing.T) { + c := newTestApp() + c.Flag("foo", "foo").Default("a").Int() + _, err := c.Parse([]string{}) + assert.Error(t, err) +} + +func TestInvalidDefaultArgValueErrors(t *testing.T) { + c := newTestApp() + cmd := c.Command("cmd", "cmd") + cmd.Arg("arg", "arg").Default("one").Int() + _, err := c.Parse([]string{"cmd"}) + assert.Error(t, err) +} + +func TestArgsRequiredAfterNonRequiredErrors(t *testing.T) { + c := newTestApp() + cmd := c.Command("cmd", "") + cmd.Arg("a", "a").String() + cmd.Arg("b", "b").Required().String() + _, err := c.Parse([]string{"cmd"}) + assert.Error(t, err) +} + +func TestArgsMultipleRequiredThenNonRequired(t *testing.T) { + c := newTestApp().Writer(ioutil.Discard) + cmd := c.Command("cmd", "") + cmd.Arg("a", "a").Required().String() + cmd.Arg("b", "b").Required().String() + cmd.Arg("c", "c").String() + cmd.Arg("d", "d").String() + _, err := c.Parse([]string{"cmd", "a", "b"}) + assert.NoError(t, err) + _, err = c.Parse([]string{}) + assert.Error(t, err) +} + +func TestDispatchCallbackIsCalled(t *testing.T) { + dispatched := false + c := newTestApp() + c.Command("cmd", "").Action(func(*ParseContext) error { + dispatched = true + return nil + }) + + _, err := c.Parse([]string{"cmd"}) + assert.NoError(t, err) + assert.True(t, dispatched) +} + +func TestTopLevelArgWorks(t *testing.T) { + c := newTestApp() + s := c.Arg("arg", "help").String() + _, err := c.Parse([]string{"foo"}) + assert.NoError(t, err) + assert.Equal(t, "foo", *s) +} + +func TestTopLevelArgCantBeUsedWithCommands(t *testing.T) { + c := newTestApp() + c.Arg("arg", "help").String() + c.Command("cmd", "help") + _, err := c.Parse([]string{}) + assert.Error(t, err) +} + +func TestTooManyArgs(t *testing.T) { + a := newTestApp() + a.Arg("a", "").String() + _, err := a.Parse([]string{"a", "b"}) + assert.Error(t, err) +} + +func TestTooManyArgsAfterCommand(t *testing.T) { + a := newTestApp() + a.Command("a", "") + assert.NoError(t, a.init()) + _, err := a.Parse([]string{"a", "b"}) + assert.Error(t, err) +} + +func TestArgsLooksLikeFlagsWithConsumeRemainder(t *testing.T) { + a := newTestApp() + a.Arg("opts", "").Required().Strings() + _, err := a.Parse([]string{"hello", "-world"}) + assert.Error(t, err) +} + +func TestCommandParseDoesNotResetFlagsToDefault(t *testing.T) { + app := newTestApp() + flag := app.Flag("flag", "").Default("default").String() + app.Command("cmd", "") + + _, err := app.Parse([]string{"--flag=123", "cmd"}) + assert.NoError(t, err) + assert.Equal(t, "123", *flag) +} + +func TestCommandParseDoesNotFailRequired(t *testing.T) { + app := newTestApp() + flag := app.Flag("flag", "").Required().String() + app.Command("cmd", "") + + _, err := app.Parse([]string{"cmd", "--flag=123"}) + assert.NoError(t, err) + assert.Equal(t, "123", *flag) +} + +func TestSelectedCommand(t *testing.T) { + app := newTestApp() + c0 := app.Command("c0", "") + c0.Command("c1", "") + s, err := app.Parse([]string{"c0", "c1"}) + assert.NoError(t, err) + assert.Equal(t, "c0 c1", s) +} + +func TestSubCommandRequired(t *testing.T) { + app := newTestApp() + c0 := app.Command("c0", "") + c0.Command("c1", "") + _, err := app.Parse([]string{"c0"}) + assert.Error(t, err) +} + +func TestInterspersedFalse(t *testing.T) { + app := newTestApp().Interspersed(false) + a1 := app.Arg("a1", "").String() + a2 := app.Arg("a2", "").String() + f1 := app.Flag("flag", "").String() + + _, err := app.Parse([]string{"a1", "--flag=flag"}) + assert.NoError(t, err) + assert.Equal(t, "a1", *a1) + assert.Equal(t, "--flag=flag", *a2) + assert.Equal(t, "", *f1) +} + +func TestInterspersedTrue(t *testing.T) { + // test once with the default value and once with explicit true + for i := 0; i < 2; i++ { + app := newTestApp() + if i != 0 { + t.Log("Setting explicit") + app.Interspersed(true) + } else { + t.Log("Using default") + } + a1 := app.Arg("a1", "").String() + a2 := app.Arg("a2", "").String() + f1 := app.Flag("flag", "").String() + + _, err := app.Parse([]string{"a1", "--flag=flag"}) + assert.NoError(t, err) + assert.Equal(t, "a1", *a1) + assert.Equal(t, "", *a2) + assert.Equal(t, "flag", *f1) + } +} + +func TestDefaultEnvars(t *testing.T) { + a := New("some-app", "").Terminate(nil).DefaultEnvars() + f0 := a.Flag("some-flag", "") + f0.Bool() + f1 := a.Flag("some-other-flag", "").NoEnvar() + f1.Bool() + f2 := a.Flag("a-1-flag", "") + f2.Bool() + _, err := a.Parse([]string{}) + assert.NoError(t, err) + assert.Equal(t, "SOME_APP_SOME_FLAG", f0.envar) + assert.Equal(t, "", f1.envar) + assert.Equal(t, "SOME_APP_A_1_FLAG", f2.envar) +} + +func TestBashCompletionOptionsWithEmptyApp(t *testing.T) { + a := newTestApp() + context, err := a.ParseContext([]string{"--completion-bash"}) + if err != nil { + t.Errorf("Unexpected error whilst parsing context: [%v]", err) + } + args := a.completionOptions(context) + assert.Equal(t, []string(nil), args) +} + +func TestBashCompletionOptions(t *testing.T) { + a := newTestApp() + a.Command("one", "") + a.Flag("flag-0", "").String() + a.Flag("flag-1", "").HintOptions("opt1", "opt2", "opt3").String() + + two := a.Command("two", "") + two.Flag("flag-2", "").String() + two.Flag("flag-3", "").HintOptions("opt4", "opt5", "opt6").String() + + three := a.Command("three", "") + three.Flag("flag-4", "").String() + three.Arg("arg-1", "").String() + three.Arg("arg-2", "").HintOptions("arg-2-opt-1", "arg-2-opt-2").String() + three.Arg("arg-3", "").String() + three.Arg("arg-4", "").HintAction(func() []string { + return []string{"arg-4-opt-1", "arg-4-opt-2"} + }).String() + + cases := []struct { + Args string + ExpectedOptions []string + }{ + { + Args: "--completion-bash", + ExpectedOptions: []string{"help", "one", "three", "two"}, + }, + { + Args: "--completion-bash --", + ExpectedOptions: []string{"--flag-0", "--flag-1", "--help"}, + }, + { + Args: "--completion-bash --fla", + ExpectedOptions: []string{"--flag-0", "--flag-1", "--help"}, + }, + { + // No options available for flag-0, return to cmd completion + Args: "--completion-bash --flag-0", + ExpectedOptions: []string{"help", "one", "three", "two"}, + }, + { + Args: "--completion-bash --flag-0 --", + ExpectedOptions: []string{"--flag-0", "--flag-1", "--help"}, + }, + { + Args: "--completion-bash --flag-1", + ExpectedOptions: []string{"opt1", "opt2", "opt3"}, + }, + { + Args: "--completion-bash --flag-1 opt", + ExpectedOptions: []string{"opt1", "opt2", "opt3"}, + }, + { + Args: "--completion-bash --flag-1 opt1", + ExpectedOptions: []string{"help", "one", "three", "two"}, + }, + { + Args: "--completion-bash --flag-1 opt1 --", + ExpectedOptions: []string{"--flag-0", "--flag-1", "--help"}, + }, + + // Try Subcommand + { + Args: "--completion-bash two", + ExpectedOptions: []string(nil), + }, + { + Args: "--completion-bash two --", + ExpectedOptions: []string{"--help", "--flag-2", "--flag-3", "--flag-0", "--flag-1"}, + }, + { + Args: "--completion-bash two --flag", + ExpectedOptions: []string{"--help", "--flag-2", "--flag-3", "--flag-0", "--flag-1"}, + }, + { + Args: "--completion-bash two --flag-2", + ExpectedOptions: []string(nil), + }, + { + // Top level flags carry downwards + Args: "--completion-bash two --flag-1", + ExpectedOptions: []string{"opt1", "opt2", "opt3"}, + }, + { + // Top level flags carry downwards + Args: "--completion-bash two --flag-1 opt", + ExpectedOptions: []string{"opt1", "opt2", "opt3"}, + }, + { + // Top level flags carry downwards + Args: "--completion-bash two --flag-1 opt1", + ExpectedOptions: []string(nil), + }, + { + Args: "--completion-bash two --flag-3", + ExpectedOptions: []string{"opt4", "opt5", "opt6"}, + }, + { + Args: "--completion-bash two --flag-3 opt", + ExpectedOptions: []string{"opt4", "opt5", "opt6"}, + }, + { + Args: "--completion-bash two --flag-3 opt4", + ExpectedOptions: []string(nil), + }, + { + Args: "--completion-bash two --flag-3 opt4 --", + ExpectedOptions: []string{"--help", "--flag-2", "--flag-3", "--flag-0", "--flag-1"}, + }, + + // Args complete + { + // After a command with an arg with no options, nothing should be + // shown + Args: "--completion-bash three ", + ExpectedOptions: []string(nil), + }, + { + // After a command with an arg, explicitly starting a flag should + // complete flags + Args: "--completion-bash three --", + ExpectedOptions: []string{"--flag-0", "--flag-1", "--flag-4", "--help"}, + }, + { + // After a command with an arg that does have completions, they + // should be shown + Args: "--completion-bash three arg1 ", + ExpectedOptions: []string{"arg-2-opt-1", "arg-2-opt-2"}, + }, + { + // After a command with an arg that does have completions, but a + // flag is started, flag options should be completed + Args: "--completion-bash three arg1 --", + ExpectedOptions: []string{"--flag-0", "--flag-1", "--flag-4", "--help"}, + }, + { + // After a command with an arg that has no completions, and isn't first, + // nothing should be shown + Args: "--completion-bash three arg1 arg2 ", + ExpectedOptions: []string(nil), + }, + { + // After a command with a different arg that also has completions, + // those different options should be shown + Args: "--completion-bash three arg1 arg2 arg3 ", + ExpectedOptions: []string{"arg-4-opt-1", "arg-4-opt-2"}, + }, + { + // After a command with all args listed, nothing should complete + Args: "--completion-bash three arg1 arg2 arg3 arg4", + ExpectedOptions: []string(nil), + }, + } + + for _, c := range cases { + context, _ := a.ParseContext(strings.Split(c.Args, " ")) + args := a.completionOptions(context) + + sort.Strings(args) + sort.Strings(c.ExpectedOptions) + + assert.Equal(t, c.ExpectedOptions, args, "Expected != Actual: [%v] != [%v]. \nInput was: [%v]", c.ExpectedOptions, args, c.Args) + } + +} diff --git a/api/vendor/gopkg.in/alecthomas/kingpin.v2/args.go b/api/vendor/gopkg.in/alecthomas/kingpin.v2/args.go new file mode 100644 index 0000000..3400694 --- /dev/null +++ b/api/vendor/gopkg.in/alecthomas/kingpin.v2/args.go @@ -0,0 +1,184 @@ +package kingpin + +import ( + "fmt" +) + +type argGroup struct { + args []*ArgClause +} + +func newArgGroup() *argGroup { + return &argGroup{} +} + +func (a *argGroup) have() bool { + return len(a.args) > 0 +} + +// GetArg gets an argument definition. +// +// This allows existing arguments to be modified after definition but before parsing. Useful for +// modular applications. +func (a *argGroup) GetArg(name string) *ArgClause { + for _, arg := range a.args { + if arg.name == name { + return arg + } + } + return nil +} + +func (a *argGroup) Arg(name, help string) *ArgClause { + arg := newArg(name, help) + a.args = append(a.args, arg) + return arg +} + +func (a *argGroup) init() error { + required := 0 + seen := map[string]struct{}{} + previousArgMustBeLast := false + for i, arg := range a.args { + if previousArgMustBeLast { + return fmt.Errorf("Args() can't be followed by another argument '%s'", arg.name) + } + if arg.consumesRemainder() { + previousArgMustBeLast = true + } + if _, ok := seen[arg.name]; ok { + return fmt.Errorf("duplicate argument '%s'", arg.name) + } + seen[arg.name] = struct{}{} + if arg.required && required != i { + return fmt.Errorf("required arguments found after non-required") + } + if arg.required { + required++ + } + if err := arg.init(); err != nil { + return err + } + } + return nil +} + +type ArgClause struct { + actionMixin + parserMixin + completionsMixin + envarMixin + name string + help string + defaultValues []string + required bool +} + +func newArg(name, help string) *ArgClause { + a := &ArgClause{ + name: name, + help: help, + } + return a +} + +func (a *ArgClause) setDefault() error { + if a.HasEnvarValue() { + if v, ok := a.value.(remainderArg); !ok || !v.IsCumulative() { + // Use the value as-is + return a.value.Set(a.GetEnvarValue()) + } + for _, value := range a.GetSplitEnvarValue() { + if err := a.value.Set(value); err != nil { + return err + } + } + return nil + } + + if len(a.defaultValues) > 0 { + for _, defaultValue := range a.defaultValues { + if err := a.value.Set(defaultValue); err != nil { + return err + } + } + return nil + } + + return nil +} + +func (a *ArgClause) needsValue() bool { + haveDefault := len(a.defaultValues) > 0 + return a.required && !(haveDefault || a.HasEnvarValue()) +} + +func (a *ArgClause) consumesRemainder() bool { + if r, ok := a.value.(remainderArg); ok { + return r.IsCumulative() + } + return false +} + +// Required arguments must be input by the user. They can not have a Default() value provided. +func (a *ArgClause) Required() *ArgClause { + a.required = true + return a +} + +// Default values for this argument. They *must* be parseable by the value of the argument. +func (a *ArgClause) Default(values ...string) *ArgClause { + a.defaultValues = values + return a +} + +// Envar overrides the default value(s) for a flag from an environment variable, +// if it is set. Several default values can be provided by using new lines to +// separate them. +func (a *ArgClause) Envar(name string) *ArgClause { + a.envar = name + a.noEnvar = false + return a +} + +// NoEnvar forces environment variable defaults to be disabled for this flag. +// Most useful in conjunction with app.DefaultEnvars(). +func (a *ArgClause) NoEnvar() *ArgClause { + a.envar = "" + a.noEnvar = true + return a +} + +func (a *ArgClause) Action(action Action) *ArgClause { + a.addAction(action) + return a +} + +func (a *ArgClause) PreAction(action Action) *ArgClause { + a.addPreAction(action) + return a +} + +// HintAction registers a HintAction (function) for the arg to provide completions +func (a *ArgClause) HintAction(action HintAction) *ArgClause { + a.addHintAction(action) + return a +} + +// HintOptions registers any number of options for the flag to provide completions +func (a *ArgClause) HintOptions(options ...string) *ArgClause { + a.addHintAction(func() []string { + return options + }) + return a +} + +func (a *ArgClause) init() error { + if a.required && len(a.defaultValues) > 0 { + return fmt.Errorf("required argument '%s' with unusable default value", a.name) + } + if a.value == nil { + return fmt.Errorf("no parser defined for arg '%s'", a.name) + } + return nil +} diff --git a/api/vendor/gopkg.in/alecthomas/kingpin.v2/args_test.go b/api/vendor/gopkg.in/alecthomas/kingpin.v2/args_test.go new file mode 100644 index 0000000..c16a630 --- /dev/null +++ b/api/vendor/gopkg.in/alecthomas/kingpin.v2/args_test.go @@ -0,0 +1,84 @@ +package kingpin + +import ( + "io/ioutil" + "os" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestArgRemainder(t *testing.T) { + app := New("test", "") + v := app.Arg("test", "").Strings() + args := []string{"hello", "world"} + _, err := app.Parse(args) + assert.NoError(t, err) + assert.Equal(t, args, *v) +} + +func TestArgRemainderErrorsWhenNotLast(t *testing.T) { + a := newArgGroup() + a.Arg("test", "").Strings() + a.Arg("test2", "").String() + assert.Error(t, a.init()) +} + +func TestArgMultipleRequired(t *testing.T) { + terminated := false + app := New("test", "") + app.Version("0.0.0").Writer(ioutil.Discard) + app.Arg("a", "").Required().String() + app.Arg("b", "").Required().String() + app.Terminate(func(int) { terminated = true }) + + _, err := app.Parse([]string{}) + assert.Error(t, err) + _, err = app.Parse([]string{"A"}) + assert.Error(t, err) + _, err = app.Parse([]string{"A", "B"}) + assert.NoError(t, err) + _, err = app.Parse([]string{"--version"}) + assert.True(t, terminated) +} + +func TestInvalidArgsDefaultCanBeOverridden(t *testing.T) { + app := New("test", "") + app.Arg("a", "").Default("invalid").Bool() + _, err := app.Parse([]string{}) + assert.Error(t, err) +} + +func TestArgMultipleValuesDefault(t *testing.T) { + app := New("test", "") + a := app.Arg("a", "").Default("default1", "default2").Strings() + _, err := app.Parse([]string{}) + assert.NoError(t, err) + assert.Equal(t, []string{"default1", "default2"}, *a) +} + +func TestRequiredArgWithEnvarMissingErrors(t *testing.T) { + app := newTestApp() + app.Arg("t", "").Envar("TEST_ARG_ENVAR").Required().Int() + _, err := app.Parse([]string{}) + assert.Error(t, err) +} + +func TestArgRequiredWithEnvar(t *testing.T) { + os.Setenv("TEST_ARG_ENVAR", "123") + app := newTestApp() + flag := app.Arg("t", "").Envar("TEST_ARG_ENVAR").Required().Int() + _, err := app.Parse([]string{}) + assert.NoError(t, err) + assert.Equal(t, 123, *flag) +} + +func TestSubcommandArgRequiredWithEnvar(t *testing.T) { + os.Setenv("TEST_ARG_ENVAR", "123") + app := newTestApp() + cmd := app.Command("command", "") + flag := cmd.Arg("t", "").Envar("TEST_ARG_ENVAR").Required().Int() + _, err := app.Parse([]string{"command"}) + assert.NoError(t, err) + assert.Equal(t, 123, *flag) +} diff --git a/api/vendor/gopkg.in/alecthomas/kingpin.v2/cmd.go b/api/vendor/gopkg.in/alecthomas/kingpin.v2/cmd.go new file mode 100644 index 0000000..0473b87 --- /dev/null +++ b/api/vendor/gopkg.in/alecthomas/kingpin.v2/cmd.go @@ -0,0 +1,274 @@ +package kingpin + +import ( + "fmt" + "strings" +) + +type cmdMixin struct { + *flagGroup + *argGroup + *cmdGroup + actionMixin +} + +// CmdCompletion returns completion options for arguments, if that's where +// parsing left off, or commands if there aren't any unsatisfied args. +func (c *cmdMixin) CmdCompletion(context *ParseContext) []string { + var options []string + + // Count args already satisfied - we won't complete those, and add any + // default commands' alternatives, since they weren't listed explicitly + // and the user may want to explicitly list something else. + argsSatisfied := 0 + for _, el := range context.Elements { + switch clause := el.Clause.(type) { + case *ArgClause: + if el.Value != nil && *el.Value != "" { + argsSatisfied++ + } + case *CmdClause: + options = append(options, clause.completionAlts...) + default: + } + } + + if argsSatisfied < len(c.argGroup.args) { + // Since not all args have been satisfied, show options for the current one + options = append(options, c.argGroup.args[argsSatisfied].resolveCompletions()...) + } else { + // If all args are satisfied, then go back to completing commands + for _, cmd := range c.cmdGroup.commandOrder { + if !cmd.hidden { + options = append(options, cmd.name) + } + } + } + + return options +} + +func (c *cmdMixin) FlagCompletion(flagName string, flagValue string) (choices []string, flagMatch bool, optionMatch bool) { + // Check if flagName matches a known flag. + // If it does, show the options for the flag + // Otherwise, show all flags + + options := []string{} + + for _, flag := range c.flagGroup.flagOrder { + // Loop through each flag and determine if a match exists + if flag.name == flagName { + // User typed entire flag. Need to look for flag options. + options = flag.resolveCompletions() + if len(options) == 0 { + // No Options to Choose From, Assume Match. + return options, true, true + } + + // Loop options to find if the user specified value matches + isPrefix := false + matched := false + + for _, opt := range options { + if flagValue == opt { + matched = true + } else if strings.HasPrefix(opt, flagValue) { + isPrefix = true + } + } + + // Matched Flag Directly + // Flag Value Not Prefixed, and Matched Directly + return options, true, !isPrefix && matched + } + + if !flag.hidden { + options = append(options, "--"+flag.name) + } + } + // No Flag directly matched. + return options, false, false + +} + +type cmdGroup struct { + app *Application + parent *CmdClause + commands map[string]*CmdClause + commandOrder []*CmdClause +} + +func (c *cmdGroup) defaultSubcommand() *CmdClause { + for _, cmd := range c.commandOrder { + if cmd.isDefault { + return cmd + } + } + return nil +} + +func (c *cmdGroup) cmdNames() []string { + names := make([]string, 0, len(c.commandOrder)) + for _, cmd := range c.commandOrder { + names = append(names, cmd.name) + } + return names +} + +// GetArg gets a command definition. +// +// This allows existing commands to be modified after definition but before parsing. Useful for +// modular applications. +func (c *cmdGroup) GetCommand(name string) *CmdClause { + return c.commands[name] +} + +func newCmdGroup(app *Application) *cmdGroup { + return &cmdGroup{ + app: app, + commands: make(map[string]*CmdClause), + } +} + +func (c *cmdGroup) flattenedCommands() (out []*CmdClause) { + for _, cmd := range c.commandOrder { + if len(cmd.commands) == 0 { + out = append(out, cmd) + } + out = append(out, cmd.flattenedCommands()...) + } + return +} + +func (c *cmdGroup) addCommand(name, help string) *CmdClause { + cmd := newCommand(c.app, name, help) + c.commands[name] = cmd + c.commandOrder = append(c.commandOrder, cmd) + return cmd +} + +func (c *cmdGroup) init() error { + seen := map[string]bool{} + if c.defaultSubcommand() != nil && !c.have() { + return fmt.Errorf("default subcommand %q provided but no subcommands defined", c.defaultSubcommand().name) + } + defaults := []string{} + for _, cmd := range c.commandOrder { + if cmd.isDefault { + defaults = append(defaults, cmd.name) + } + if seen[cmd.name] { + return fmt.Errorf("duplicate command %q", cmd.name) + } + seen[cmd.name] = true + for _, alias := range cmd.aliases { + if seen[alias] { + return fmt.Errorf("alias duplicates existing command %q", alias) + } + c.commands[alias] = cmd + } + if err := cmd.init(); err != nil { + return err + } + } + if len(defaults) > 1 { + return fmt.Errorf("more than one default subcommand exists: %s", strings.Join(defaults, ", ")) + } + return nil +} + +func (c *cmdGroup) have() bool { + return len(c.commands) > 0 +} + +type CmdClauseValidator func(*CmdClause) error + +// A CmdClause is a single top-level command. It encapsulates a set of flags +// and either subcommands or positional arguments. +type CmdClause struct { + cmdMixin + app *Application + name string + aliases []string + help string + isDefault bool + validator CmdClauseValidator + hidden bool + completionAlts []string +} + +func newCommand(app *Application, name, help string) *CmdClause { + c := &CmdClause{ + app: app, + name: name, + help: help, + } + c.flagGroup = newFlagGroup() + c.argGroup = newArgGroup() + c.cmdGroup = newCmdGroup(app) + return c +} + +// Add an Alias for this command. +func (c *CmdClause) Alias(name string) *CmdClause { + c.aliases = append(c.aliases, name) + return c +} + +// Validate sets a validation function to run when parsing. +func (c *CmdClause) Validate(validator CmdClauseValidator) *CmdClause { + c.validator = validator + return c +} + +func (c *CmdClause) FullCommand() string { + out := []string{c.name} + for p := c.parent; p != nil; p = p.parent { + out = append([]string{p.name}, out...) + } + return strings.Join(out, " ") +} + +// Command adds a new sub-command. +func (c *CmdClause) Command(name, help string) *CmdClause { + cmd := c.addCommand(name, help) + cmd.parent = c + return cmd +} + +// Default makes this command the default if commands don't match. +func (c *CmdClause) Default() *CmdClause { + c.isDefault = true + return c +} + +func (c *CmdClause) Action(action Action) *CmdClause { + c.addAction(action) + return c +} + +func (c *CmdClause) PreAction(action Action) *CmdClause { + c.addPreAction(action) + return c +} + +func (c *CmdClause) init() error { + if err := c.flagGroup.init(c.app.defaultEnvarPrefix()); err != nil { + return err + } + if c.argGroup.have() && c.cmdGroup.have() { + return fmt.Errorf("can't mix Arg()s with Command()s") + } + if err := c.argGroup.init(); err != nil { + return err + } + if err := c.cmdGroup.init(); err != nil { + return err + } + return nil +} + +func (c *CmdClause) Hidden() *CmdClause { + c.hidden = true + return c +} diff --git a/api/vendor/gopkg.in/alecthomas/kingpin.v2/cmd/genvalues/main.go b/api/vendor/gopkg.in/alecthomas/kingpin.v2/cmd/genvalues/main.go new file mode 100644 index 0000000..5d22ad0 --- /dev/null +++ b/api/vendor/gopkg.in/alecthomas/kingpin.v2/cmd/genvalues/main.go @@ -0,0 +1,134 @@ +package main + +import ( + "encoding/json" + "os" + "os/exec" + "strings" + + "github.com/alecthomas/template" +) + +const ( + tmpl = `package kingpin + +// This file is autogenerated by "go generate .". Do not modify. + +{{range .}} +{{if not .NoValueParser}} +// -- {{.Type}} Value +type {{.|ValueName}} struct { v *{{.Type}} } + +func new{{.|Name}}Value(p *{{.Type}}) *{{.|ValueName}} { + return &{{.|ValueName}}{p} +} + +func (f *{{.|ValueName}}) Set(s string) error { + v, err := {{.Parser}} + if err == nil { + *f.v = ({{.Type}})(v) + } + return err +} + +func (f *{{.|ValueName}}) Get() interface{} { return ({{.Type}})(*f.v) } + +func (f *{{.|ValueName}}) String() string { return {{.|Format}} } + +{{if .Help}} +// {{.Help}} +{{else}}\ +// {{.|Name}} parses the next command-line value as {{.Type}}. +{{end}}\ +func (p *parserMixin) {{.|Name}}() (target *{{.Type}}) { + target = new({{.Type}}) + p.{{.|Name}}Var(target) + return +} + +func (p *parserMixin) {{.|Name}}Var(target *{{.Type}}) { + p.SetValue(new{{.|Name}}Value(target)) +} + +{{end}} +// {{.|Plural}} accumulates {{.Type}} values into a slice. +func (p *parserMixin) {{.|Plural}}() (target *[]{{.Type}}) { + target = new([]{{.Type}}) + p.{{.|Plural}}Var(target) + return +} + +func (p *parserMixin) {{.|Plural}}Var(target *[]{{.Type}}) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return new{{.|Name}}Value(v.(*{{.Type}})) + })) +} + +{{end}} +` +) + +type Value struct { + Name string `json:"name"` + NoValueParser bool `json:"no_value_parser"` + Type string `json:"type"` + Parser string `json:"parser"` + Format string `json:"format"` + Plural string `json:"plural"` + Help string `json:"help"` +} + +func fatalIfError(err error) { + if err != nil { + panic(err) + } +} + +func main() { + r, err := os.Open("values.json") + fatalIfError(err) + defer r.Close() + + v := []Value{} + err = json.NewDecoder(r).Decode(&v) + fatalIfError(err) + + valueName := func(v *Value) string { + if v.Name != "" { + return v.Name + } + return strings.Title(v.Type) + } + + t, err := template.New("genvalues").Funcs(template.FuncMap{ + "Lower": strings.ToLower, + "Format": func(v *Value) string { + if v.Format != "" { + return v.Format + } + return "fmt.Sprintf(\"%v\", *f.v)" + }, + "ValueName": func(v *Value) string { + name := valueName(v) + return strings.ToLower(name[0:1]) + name[1:] + "Value" + }, + "Name": valueName, + "Plural": func(v *Value) string { + if v.Plural != "" { + return v.Plural + } + return valueName(v) + "List" + }, + }).Parse(tmpl) + fatalIfError(err) + + w, err := os.Create("values_generated.go") + fatalIfError(err) + defer w.Close() + + err = t.Execute(w, v) + fatalIfError(err) + + err = exec.Command("goimports", "-w", "values_generated.go").Run() + fatalIfError(err) +} diff --git a/api/vendor/gopkg.in/alecthomas/kingpin.v2/cmd_test.go b/api/vendor/gopkg.in/alecthomas/kingpin.v2/cmd_test.go new file mode 100644 index 0000000..d531589 --- /dev/null +++ b/api/vendor/gopkg.in/alecthomas/kingpin.v2/cmd_test.go @@ -0,0 +1,374 @@ +package kingpin + +import ( + "sort" + "strings" + + "github.com/stretchr/testify/assert" + + "testing" +) + +func parseAndExecute(app *Application, context *ParseContext) (string, error) { + if err := parse(context, app); err != nil { + return "", err + } + + selected, err := app.setValues(context) + if err != nil { + return "", err + } + + return app.execute(context, selected) +} + +func complete(t *testing.T, app *Application, args ...string) []string { + context, err := app.ParseContext(args) + assert.NoError(t, err) + if err != nil { + return nil + } + + completions := app.completionOptions(context) + sort.Strings(completions) + + return completions +} + +func TestNestedCommands(t *testing.T) { + app := New("app", "") + sub1 := app.Command("sub1", "") + sub1.Flag("sub1", "") + subsub1 := sub1.Command("sub1sub1", "") + subsub1.Command("sub1sub1end", "") + + sub2 := app.Command("sub2", "") + sub2.Flag("sub2", "") + sub2.Command("sub2sub1", "") + + context := tokenize([]string{"sub1", "sub1sub1", "sub1sub1end"}, false) + selected, err := parseAndExecute(app, context) + assert.NoError(t, err) + assert.True(t, context.EOL()) + assert.Equal(t, "sub1 sub1sub1 sub1sub1end", selected) +} + +func TestNestedCommandsWithArgs(t *testing.T) { + app := New("app", "") + cmd := app.Command("a", "").Command("b", "") + a := cmd.Arg("a", "").String() + b := cmd.Arg("b", "").String() + context := tokenize([]string{"a", "b", "c", "d"}, false) + selected, err := parseAndExecute(app, context) + assert.NoError(t, err) + assert.True(t, context.EOL()) + assert.Equal(t, "a b", selected) + assert.Equal(t, "c", *a) + assert.Equal(t, "d", *b) +} + +func TestNestedCommandsWithFlags(t *testing.T) { + app := New("app", "") + cmd := app.Command("a", "").Command("b", "") + a := cmd.Flag("aaa", "").Short('a').String() + b := cmd.Flag("bbb", "").Short('b').String() + err := app.init() + assert.NoError(t, err) + context := tokenize(strings.Split("a b --aaa x -b x", " "), false) + selected, err := parseAndExecute(app, context) + assert.NoError(t, err) + assert.True(t, context.EOL()) + assert.Equal(t, "a b", selected) + assert.Equal(t, "x", *a) + assert.Equal(t, "x", *b) +} + +func TestNestedCommandWithMergedFlags(t *testing.T) { + app := New("app", "") + cmd0 := app.Command("a", "") + cmd0f0 := cmd0.Flag("aflag", "").Bool() + // cmd1 := app.Command("b", "") + // cmd1f0 := cmd0.Flag("bflag", "").Bool() + cmd00 := cmd0.Command("aa", "") + cmd00f0 := cmd00.Flag("aaflag", "").Bool() + err := app.init() + assert.NoError(t, err) + context := tokenize(strings.Split("a aa --aflag --aaflag", " "), false) + selected, err := parseAndExecute(app, context) + assert.NoError(t, err) + assert.True(t, *cmd0f0) + assert.True(t, *cmd00f0) + assert.Equal(t, "a aa", selected) +} + +func TestNestedCommandWithDuplicateFlagErrors(t *testing.T) { + app := New("app", "") + app.Flag("test", "").Bool() + app.Command("cmd0", "").Flag("test", "").Bool() + err := app.init() + assert.Error(t, err) +} + +func TestNestedCommandWithArgAndMergedFlags(t *testing.T) { + app := New("app", "") + cmd0 := app.Command("a", "") + cmd0f0 := cmd0.Flag("aflag", "").Bool() + // cmd1 := app.Command("b", "") + // cmd1f0 := cmd0.Flag("bflag", "").Bool() + cmd00 := cmd0.Command("aa", "") + cmd00a0 := cmd00.Arg("arg", "").String() + cmd00f0 := cmd00.Flag("aaflag", "").Bool() + err := app.init() + assert.NoError(t, err) + context := tokenize(strings.Split("a aa hello --aflag --aaflag", " "), false) + selected, err := parseAndExecute(app, context) + assert.NoError(t, err) + assert.True(t, *cmd0f0) + assert.True(t, *cmd00f0) + assert.Equal(t, "a aa", selected) + assert.Equal(t, "hello", *cmd00a0) +} + +func TestDefaultSubcommandEOL(t *testing.T) { + app := newTestApp() + c0 := app.Command("c0", "").Default() + c0.Command("c01", "").Default() + c0.Command("c02", "") + + cmd, err := app.Parse([]string{"c0"}) + assert.NoError(t, err) + assert.Equal(t, "c0 c01", cmd) +} + +func TestDefaultSubcommandWithArg(t *testing.T) { + app := newTestApp() + c0 := app.Command("c0", "").Default() + c01 := c0.Command("c01", "").Default() + c012 := c01.Command("c012", "").Default() + a0 := c012.Arg("a0", "").String() + c0.Command("c02", "") + + cmd, err := app.Parse([]string{"c0", "hello"}) + assert.NoError(t, err) + assert.Equal(t, "c0 c01 c012", cmd) + assert.Equal(t, "hello", *a0) +} + +func TestDefaultSubcommandWithFlags(t *testing.T) { + app := newTestApp() + c0 := app.Command("c0", "").Default() + _ = c0.Flag("f0", "").Int() + c0c1 := c0.Command("c1", "").Default() + c0c1f1 := c0c1.Flag("f1", "").Int() + selected, err := app.Parse([]string{"--f1=2"}) + assert.NoError(t, err) + assert.Equal(t, "c0 c1", selected) + assert.Equal(t, 2, *c0c1f1) + _, err = app.Parse([]string{"--f2"}) + assert.Error(t, err) +} + +func TestMultipleDefaultCommands(t *testing.T) { + app := newTestApp() + app.Command("c0", "").Default() + app.Command("c1", "").Default() + _, err := app.Parse([]string{}) + assert.Error(t, err) +} + +func TestAliasedCommand(t *testing.T) { + app := newTestApp() + app.Command("one", "").Alias("two") + selected, _ := app.Parse([]string{"one"}) + assert.Equal(t, "one", selected) + selected, _ = app.Parse([]string{"two"}) + assert.Equal(t, "one", selected) + // 2 due to "help" and "one" + assert.Equal(t, 2, len(app.Model().FlattenedCommands())) +} + +func TestDuplicateAlias(t *testing.T) { + app := newTestApp() + app.Command("one", "") + app.Command("two", "").Alias("one") + _, err := app.Parse([]string{"one"}) + assert.Error(t, err) +} + +func TestFlagCompletion(t *testing.T) { + app := newTestApp() + app.Command("one", "") + two := app.Command("two", "") + two.Flag("flag-1", "") + two.Flag("flag-2", "").HintOptions("opt1", "opt2", "opt3") + two.Flag("flag-3", "") + + cases := []struct { + target cmdMixin + flagName string + flagValue string + expectedFlagMatch bool + expectedOptionMatch bool + expectedFlags []string + }{ + { + // Test top level flags + target: app.cmdMixin, + flagName: "", + flagValue: "", + expectedFlagMatch: false, + expectedOptionMatch: false, + expectedFlags: []string{"--help"}, + }, + { + // Test no flag passed + target: two.cmdMixin, + flagName: "", + flagValue: "", + expectedFlagMatch: false, + expectedOptionMatch: false, + expectedFlags: []string{"--flag-1", "--flag-2", "--flag-3"}, + }, + { + // Test an incomplete flag. Should still give all options as if the flag wasn't given at all. + target: two.cmdMixin, + flagName: "flag-", + flagValue: "", + expectedFlagMatch: false, + expectedOptionMatch: false, + expectedFlags: []string{"--flag-1", "--flag-2", "--flag-3"}, + }, + { + // Test with a complete flag. Should show available choices for the flag + // This flag has no options. No options should be produced. + // Should also report an option was matched + target: two.cmdMixin, + flagName: "flag-1", + flagValue: "", + expectedFlagMatch: true, + expectedOptionMatch: true, + expectedFlags: []string(nil), + }, + { + // Test with a complete flag. Should show available choices for the flag + target: two.cmdMixin, + flagName: "flag-2", + flagValue: "", + expectedFlagMatch: true, + expectedOptionMatch: false, + expectedFlags: []string{"opt1", "opt2", "opt3"}, + }, + { + // Test with a complete flag and complete option for that flag. + target: two.cmdMixin, + flagName: "flag-2", + flagValue: "opt1", + expectedFlagMatch: true, + expectedOptionMatch: true, + expectedFlags: []string{"opt1", "opt2", "opt3"}, + }, + } + + for i, c := range cases { + choices, flagMatch, optionMatch := c.target.FlagCompletion(c.flagName, c.flagValue) + assert.Equal(t, c.expectedFlags, choices, "Test case %d: expectedFlags != actual flags", i+1) + assert.Equal(t, c.expectedFlagMatch, flagMatch, "Test case %d: expectedFlagMatch != flagMatch", i+1) + assert.Equal(t, c.expectedOptionMatch, optionMatch, "Test case %d: expectedOptionMatch != optionMatch", i+1) + } + +} + +func TestCmdCompletion(t *testing.T) { + app := newTestApp() + app.Command("one", "") + two := app.Command("two", "") + two.Command("sub1", "") + two.Command("sub2", "") + + assert.Equal(t, []string{"help", "one", "two"}, complete(t, app)) + assert.Equal(t, []string{"sub1", "sub2"}, complete(t, app, "two")) +} + +func TestHiddenCmdCompletion(t *testing.T) { + app := newTestApp() + + // top level visible & hidden cmds, with no sub-cmds + app.Command("visible1", "") + app.Command("hidden1", "").Hidden() + + // visible cmd with visible & hidden sub-cmds + visible2 := app.Command("visible2", "") + visible2.Command("visible2-visible", "") + visible2.Command("visible2-hidden", "").Hidden() + + // hidden cmd with visible & hidden sub-cmds + hidden2 := app.Command("hidden2", "").Hidden() + hidden2.Command("hidden2-visible", "") + hidden2.Command("hidden2-hidden", "").Hidden() + + // Only top level visible cmds should show + assert.Equal(t, []string{"help", "visible1", "visible2"}, complete(t, app)) + + // Only visible sub-cmds should show + assert.Equal(t, []string{"visible2-visible"}, complete(t, app, "visible2")) + + // Hidden commands should still complete visible sub-cmds + assert.Equal(t, []string{"hidden2-visible"}, complete(t, app, "hidden2")) +} + +func TestDefaultCmdCompletion(t *testing.T) { + app := newTestApp() + + cmd1 := app.Command("cmd1", "") + + cmd1Sub1 := cmd1.Command("cmd1-sub1", "") + cmd1Sub1.Arg("cmd1-sub1-arg1", "").HintOptions("cmd1-arg1").String() + + cmd2 := app.Command("cmd2", "").Default() + + cmd2.Command("cmd2-sub1", "") + + cmd2Sub2 := cmd2.Command("cmd2-sub2", "").Default() + + cmd2Sub2Sub1 := cmd2Sub2.Command("cmd2-sub2-sub1", "").Default() + cmd2Sub2Sub1.Arg("cmd2-sub2-sub1-arg1", "").HintOptions("cmd2-sub2-sub1-arg1").String() + cmd2Sub2Sub1.Arg("cmd2-sub2-sub1-arg2", "").HintOptions("cmd2-sub2-sub1-arg2").String() + + // Without args, should get: + // - root cmds (including implicit "help") + // - thread of default cmds + // - first arg hints for the final default cmd + assert.Equal(t, []string{"cmd1", "cmd2", "cmd2-sub1", "cmd2-sub2", "cmd2-sub2-sub1", "cmd2-sub2-sub1-arg1", "help"}, complete(t, app)) + + // With a non-default cmd already listed, should get: + // - sub cmds of that arg + assert.Equal(t, []string{"cmd1-sub1"}, complete(t, app, "cmd1")) + + // With an explicit default cmd listed, should get: + // - default child-cmds + // - first arg hints for the final default cmd + assert.Equal(t, []string{"cmd2-sub1", "cmd2-sub2", "cmd2-sub2-sub1", "cmd2-sub2-sub1-arg1"}, complete(t, app, "cmd2")) + + // Args should be completed when all preceding cmds are explicit, and when + // any of them are implicit (not listed). Check this by trying all possible + // combinations of choosing/excluding the three levels of cmds. This tests + // root-level default, middle default, and end default. + for i := 0; i < 8; i++ { + var cmdline []string + + if i&1 != 0 { + cmdline = append(cmdline, "cmd2") + } + if i&2 != 0 { + cmdline = append(cmdline, "cmd2-sub2") + } + if i&4 != 0 { + cmdline = append(cmdline, "cmd2-sub2-sub1") + } + + assert.Contains(t, complete(t, app, cmdline...), "cmd2-sub2-sub1-arg1", "with cmdline: %v", cmdline) + } + + // With both args of a default sub cmd, should get no completions + assert.Empty(t, complete(t, app, "arg1", "arg2")) +} diff --git a/api/vendor/gopkg.in/alecthomas/kingpin.v2/completions.go b/api/vendor/gopkg.in/alecthomas/kingpin.v2/completions.go new file mode 100644 index 0000000..6e7b409 --- /dev/null +++ b/api/vendor/gopkg.in/alecthomas/kingpin.v2/completions.go @@ -0,0 +1,33 @@ +package kingpin + +// HintAction is a function type who is expected to return a slice of possible +// command line arguments. +type HintAction func() []string +type completionsMixin struct { + hintActions []HintAction + builtinHintActions []HintAction +} + +func (a *completionsMixin) addHintAction(action HintAction) { + a.hintActions = append(a.hintActions, action) +} + +// Allow adding of HintActions which are added internally, ie, EnumVar +func (a *completionsMixin) addHintActionBuiltin(action HintAction) { + a.builtinHintActions = append(a.builtinHintActions, action) +} + +func (a *completionsMixin) resolveCompletions() []string { + var hints []string + + options := a.builtinHintActions + if len(a.hintActions) > 0 { + // User specified their own hintActions. Use those instead. + options = a.hintActions + } + + for _, hintAction := range options { + hints = append(hints, hintAction()...) + } + return hints +} diff --git a/api/vendor/gopkg.in/alecthomas/kingpin.v2/completions_test.go b/api/vendor/gopkg.in/alecthomas/kingpin.v2/completions_test.go new file mode 100644 index 0000000..7da9c06 --- /dev/null +++ b/api/vendor/gopkg.in/alecthomas/kingpin.v2/completions_test.go @@ -0,0 +1,78 @@ +package kingpin + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestResolveWithBuiltin(t *testing.T) { + a := completionsMixin{} + + hintAction1 := func() []string { + return []string{"opt1", "opt2"} + } + hintAction2 := func() []string { + return []string{"opt3", "opt4"} + } + + a.builtinHintActions = []HintAction{hintAction1, hintAction2} + + args := a.resolveCompletions() + assert.Equal(t, []string{"opt1", "opt2", "opt3", "opt4"}, args) +} + +func TestResolveWithUser(t *testing.T) { + a := completionsMixin{} + hintAction1 := func() []string { + return []string{"opt1", "opt2"} + } + hintAction2 := func() []string { + return []string{"opt3", "opt4"} + } + + a.hintActions = []HintAction{hintAction1, hintAction2} + + args := a.resolveCompletions() + assert.Equal(t, []string{"opt1", "opt2", "opt3", "opt4"}, args) +} + +func TestResolveWithCombination(t *testing.T) { + a := completionsMixin{} + builtin := func() []string { + return []string{"opt1", "opt2"} + } + user := func() []string { + return []string{"opt3", "opt4"} + } + + a.builtinHintActions = []HintAction{builtin} + a.hintActions = []HintAction{user} + + args := a.resolveCompletions() + // User provided args take preference over builtin (enum-defined) args. + assert.Equal(t, []string{"opt3", "opt4"}, args) +} + +func TestAddHintAction(t *testing.T) { + a := completionsMixin{} + hintFunc := func() []string { + return []string{"opt1", "opt2"} + } + a.addHintAction(hintFunc) + + args := a.resolveCompletions() + assert.Equal(t, []string{"opt1", "opt2"}, args) +} + +func TestAddHintActionBuiltin(t *testing.T) { + a := completionsMixin{} + hintFunc := func() []string { + return []string{"opt1", "opt2"} + } + + a.addHintActionBuiltin(hintFunc) + + args := a.resolveCompletions() + assert.Equal(t, []string{"opt1", "opt2"}, args) +} diff --git a/api/vendor/gopkg.in/alecthomas/kingpin.v2/doc.go b/api/vendor/gopkg.in/alecthomas/kingpin.v2/doc.go new file mode 100644 index 0000000..cb951a8 --- /dev/null +++ b/api/vendor/gopkg.in/alecthomas/kingpin.v2/doc.go @@ -0,0 +1,68 @@ +// Package kingpin provides command line interfaces like this: +// +// $ chat +// usage: chat [] [] [ ...] +// +// Flags: +// --debug enable debug mode +// --help Show help. +// --server=127.0.0.1 server address +// +// Commands: +// help +// Show help for a command. +// +// post [] +// Post a message to a channel. +// +// register +// Register a new user. +// +// $ chat help post +// usage: chat [] post [] [] +// +// Post a message to a channel. +// +// Flags: +// --image=IMAGE image to post +// +// Args: +// channel to post to +// [] text to post +// $ chat post --image=~/Downloads/owls.jpg pics +// +// From code like this: +// +// package main +// +// import "gopkg.in/alecthomas/kingpin.v2" +// +// var ( +// debug = kingpin.Flag("debug", "enable debug mode").Default("false").Bool() +// serverIP = kingpin.Flag("server", "server address").Default("127.0.0.1").IP() +// +// register = kingpin.Command("register", "Register a new user.") +// registerNick = register.Arg("nick", "nickname for user").Required().String() +// registerName = register.Arg("name", "name of user").Required().String() +// +// post = kingpin.Command("post", "Post a message to a channel.") +// postImage = post.Flag("image", "image to post").ExistingFile() +// postChannel = post.Arg("channel", "channel to post to").Required().String() +// postText = post.Arg("text", "text to post").String() +// ) +// +// func main() { +// switch kingpin.Parse() { +// // Register user +// case "register": +// println(*registerNick) +// +// // Post message +// case "post": +// if *postImage != nil { +// } +// if *postText != "" { +// } +// } +// } +package kingpin diff --git a/api/vendor/gopkg.in/alecthomas/kingpin.v2/envar.go b/api/vendor/gopkg.in/alecthomas/kingpin.v2/envar.go new file mode 100644 index 0000000..c01a27d --- /dev/null +++ b/api/vendor/gopkg.in/alecthomas/kingpin.v2/envar.go @@ -0,0 +1,45 @@ +package kingpin + +import ( + "os" + "regexp" +) + +var ( + envVarValuesSeparator = "\r?\n" + envVarValuesTrimmer = regexp.MustCompile(envVarValuesSeparator + "$") + envVarValuesSplitter = regexp.MustCompile(envVarValuesSeparator) +) + +type envarMixin struct { + envar string + noEnvar bool +} + +func (e *envarMixin) HasEnvarValue() bool { + return e.GetEnvarValue() != "" +} + +func (e *envarMixin) GetEnvarValue() string { + if e.noEnvar || e.envar == "" { + return "" + } + return os.Getenv(e.envar) +} + +func (e *envarMixin) GetSplitEnvarValue() []string { + values := make([]string, 0) + + envarValue := e.GetEnvarValue() + if envarValue == "" { + return values + } + + // Split by new line to extract multiple values, if any. + trimmed := envVarValuesTrimmer.ReplaceAllString(envarValue, "") + for _, value := range envVarValuesSplitter.Split(trimmed, -1) { + values = append(values, value) + } + + return values +} diff --git a/api/vendor/gopkg.in/alecthomas/kingpin.v2/examples_test.go b/api/vendor/gopkg.in/alecthomas/kingpin.v2/examples_test.go new file mode 100644 index 0000000..7c3e34f --- /dev/null +++ b/api/vendor/gopkg.in/alecthomas/kingpin.v2/examples_test.go @@ -0,0 +1,46 @@ +package kingpin + +import ( + "fmt" + "net/http" + "strings" +) + +type HTTPHeaderValue http.Header + +func (h *HTTPHeaderValue) Set(value string) error { + parts := strings.SplitN(value, ":", 2) + if len(parts) != 2 { + return fmt.Errorf("expected HEADER:VALUE got '%s'", value) + } + (*http.Header)(h).Add(parts[0], parts[1]) + return nil +} + +func (h *HTTPHeaderValue) Get() interface{} { + return (http.Header)(*h) +} + +func (h *HTTPHeaderValue) String() string { + return "" +} + +func HTTPHeader(s Settings) (target *http.Header) { + target = new(http.Header) + s.SetValue((*HTTPHeaderValue)(target)) + return +} + +// This example ilustrates how to define custom parsers. HTTPHeader +// cumulatively parses each encountered --header flag into a http.Header struct. +func ExampleValue() { + var ( + curl = New("curl", "transfer a URL") + headers = HTTPHeader(curl.Flag("headers", "Add HTTP headers to the request.").Short('H').PlaceHolder("HEADER:VALUE")) + ) + + curl.Parse([]string{"-H Content-Type:application/octet-stream"}) + for key, value := range *headers { + fmt.Printf("%s = %s\n", key, value) + } +} diff --git a/api/vendor/gopkg.in/alecthomas/kingpin.v2/flags.go b/api/vendor/gopkg.in/alecthomas/kingpin.v2/flags.go new file mode 100644 index 0000000..8f33721 --- /dev/null +++ b/api/vendor/gopkg.in/alecthomas/kingpin.v2/flags.go @@ -0,0 +1,308 @@ +package kingpin + +import ( + "fmt" + "strings" +) + +type flagGroup struct { + short map[string]*FlagClause + long map[string]*FlagClause + flagOrder []*FlagClause +} + +func newFlagGroup() *flagGroup { + return &flagGroup{ + short: map[string]*FlagClause{}, + long: map[string]*FlagClause{}, + } +} + +// GetFlag gets a flag definition. +// +// This allows existing flags to be modified after definition but before parsing. Useful for +// modular applications. +func (f *flagGroup) GetFlag(name string) *FlagClause { + return f.long[name] +} + +// Flag defines a new flag with the given long name and help. +func (f *flagGroup) Flag(name, help string) *FlagClause { + flag := newFlag(name, help) + f.long[name] = flag + f.flagOrder = append(f.flagOrder, flag) + return flag +} + +func (f *flagGroup) init(defaultEnvarPrefix string) error { + if err := f.checkDuplicates(); err != nil { + return err + } + for _, flag := range f.long { + if defaultEnvarPrefix != "" && !flag.noEnvar && flag.envar == "" { + flag.envar = envarTransform(defaultEnvarPrefix + "_" + flag.name) + } + if err := flag.init(); err != nil { + return err + } + if flag.shorthand != 0 { + f.short[string(flag.shorthand)] = flag + } + } + return nil +} + +func (f *flagGroup) checkDuplicates() error { + seenShort := map[rune]bool{} + seenLong := map[string]bool{} + for _, flag := range f.flagOrder { + if flag.shorthand != 0 { + if _, ok := seenShort[flag.shorthand]; ok { + return fmt.Errorf("duplicate short flag -%c", flag.shorthand) + } + seenShort[flag.shorthand] = true + } + if _, ok := seenLong[flag.name]; ok { + return fmt.Errorf("duplicate long flag --%s", flag.name) + } + seenLong[flag.name] = true + } + return nil +} + +func (f *flagGroup) parse(context *ParseContext) (*FlagClause, error) { + var token *Token + +loop: + for { + token = context.Peek() + switch token.Type { + case TokenEOL: + break loop + + case TokenLong, TokenShort: + flagToken := token + defaultValue := "" + var flag *FlagClause + var ok bool + invert := false + + name := token.Value + if token.Type == TokenLong { + flag, ok = f.long[name] + if !ok { + if strings.HasPrefix(name, "no-") { + name = name[3:] + invert = true + } + flag, ok = f.long[name] + } + if !ok { + return nil, fmt.Errorf("unknown long flag '%s'", flagToken) + } + } else { + flag, ok = f.short[name] + if !ok { + return nil, fmt.Errorf("unknown short flag '%s'", flagToken) + } + } + + context.Next() + + fb, ok := flag.value.(boolFlag) + if ok && fb.IsBoolFlag() { + if invert { + defaultValue = "false" + } else { + defaultValue = "true" + } + } else { + if invert { + context.Push(token) + return nil, fmt.Errorf("unknown long flag '%s'", flagToken) + } + token = context.Peek() + if token.Type != TokenArg { + context.Push(token) + return nil, fmt.Errorf("expected argument for flag '%s'", flagToken) + } + context.Next() + defaultValue = token.Value + } + + context.matchedFlag(flag, defaultValue) + return flag, nil + + default: + break loop + } + } + return nil, nil +} + +// FlagClause is a fluid interface used to build flags. +type FlagClause struct { + parserMixin + actionMixin + completionsMixin + envarMixin + name string + shorthand rune + help string + defaultValues []string + placeholder string + hidden bool +} + +func newFlag(name, help string) *FlagClause { + f := &FlagClause{ + name: name, + help: help, + } + return f +} + +func (f *FlagClause) setDefault() error { + if f.HasEnvarValue() { + if v, ok := f.value.(repeatableFlag); !ok || !v.IsCumulative() { + // Use the value as-is + return f.value.Set(f.GetEnvarValue()) + } else { + for _, value := range f.GetSplitEnvarValue() { + if err := f.value.Set(value); err != nil { + return err + } + } + return nil + } + } + + if len(f.defaultValues) > 0 { + for _, defaultValue := range f.defaultValues { + if err := f.value.Set(defaultValue); err != nil { + return err + } + } + return nil + } + + return nil +} + +func (f *FlagClause) needsValue() bool { + haveDefault := len(f.defaultValues) > 0 + return f.required && !(haveDefault || f.HasEnvarValue()) +} + +func (f *FlagClause) init() error { + if f.required && len(f.defaultValues) > 0 { + return fmt.Errorf("required flag '--%s' with default value that will never be used", f.name) + } + if f.value == nil { + return fmt.Errorf("no type defined for --%s (eg. .String())", f.name) + } + if v, ok := f.value.(repeatableFlag); (!ok || !v.IsCumulative()) && len(f.defaultValues) > 1 { + return fmt.Errorf("invalid default for '--%s', expecting single value", f.name) + } + return nil +} + +// Dispatch to the given function after the flag is parsed and validated. +func (f *FlagClause) Action(action Action) *FlagClause { + f.addAction(action) + return f +} + +func (f *FlagClause) PreAction(action Action) *FlagClause { + f.addPreAction(action) + return f +} + +// HintAction registers a HintAction (function) for the flag to provide completions +func (a *FlagClause) HintAction(action HintAction) *FlagClause { + a.addHintAction(action) + return a +} + +// HintOptions registers any number of options for the flag to provide completions +func (a *FlagClause) HintOptions(options ...string) *FlagClause { + a.addHintAction(func() []string { + return options + }) + return a +} + +func (a *FlagClause) EnumVar(target *string, options ...string) { + a.parserMixin.EnumVar(target, options...) + a.addHintActionBuiltin(func() []string { + return options + }) +} + +func (a *FlagClause) Enum(options ...string) (target *string) { + a.addHintActionBuiltin(func() []string { + return options + }) + return a.parserMixin.Enum(options...) +} + +// Default values for this flag. They *must* be parseable by the value of the flag. +func (f *FlagClause) Default(values ...string) *FlagClause { + f.defaultValues = values + return f +} + +// DEPRECATED: Use Envar(name) instead. +func (f *FlagClause) OverrideDefaultFromEnvar(envar string) *FlagClause { + return f.Envar(envar) +} + +// Envar overrides the default value(s) for a flag from an environment variable, +// if it is set. Several default values can be provided by using new lines to +// separate them. +func (f *FlagClause) Envar(name string) *FlagClause { + f.envar = name + f.noEnvar = false + return f +} + +// NoEnvar forces environment variable defaults to be disabled for this flag. +// Most useful in conjunction with app.DefaultEnvars(). +func (f *FlagClause) NoEnvar() *FlagClause { + f.envar = "" + f.noEnvar = true + return f +} + +// PlaceHolder sets the place-holder string used for flag values in the help. The +// default behaviour is to use the value provided by Default() if provided, +// then fall back on the capitalized flag name. +func (f *FlagClause) PlaceHolder(placeholder string) *FlagClause { + f.placeholder = placeholder + return f +} + +// Hidden hides a flag from usage but still allows it to be used. +func (f *FlagClause) Hidden() *FlagClause { + f.hidden = true + return f +} + +// Required makes the flag required. You can not provide a Default() value to a Required() flag. +func (f *FlagClause) Required() *FlagClause { + f.required = true + return f +} + +// Short sets the short flag name. +func (f *FlagClause) Short(name rune) *FlagClause { + f.shorthand = name + return f +} + +// Bool makes this flag a boolean flag. +func (f *FlagClause) Bool() (target *bool) { + target = new(bool) + f.SetValue(newBoolValue(target)) + return +} diff --git a/api/vendor/gopkg.in/alecthomas/kingpin.v2/flags_test.go b/api/vendor/gopkg.in/alecthomas/kingpin.v2/flags_test.go new file mode 100644 index 0000000..29327e6 --- /dev/null +++ b/api/vendor/gopkg.in/alecthomas/kingpin.v2/flags_test.go @@ -0,0 +1,368 @@ +package kingpin + +import ( + "io/ioutil" + "os" + + "github.com/stretchr/testify/assert" + + "testing" +) + +func TestBool(t *testing.T) { + app := newTestApp() + b := app.Flag("b", "").Bool() + _, err := app.Parse([]string{"--b"}) + assert.NoError(t, err) + assert.True(t, *b) +} + +func TestNoBool(t *testing.T) { + fg := newFlagGroup() + f := fg.Flag("b", "").Default("true") + b := f.Bool() + fg.init("") + tokens := tokenize([]string{"--no-b"}, false) + _, err := fg.parse(tokens) + assert.NoError(t, err) + assert.False(t, *b) +} + +func TestNegateNonBool(t *testing.T) { + fg := newFlagGroup() + f := fg.Flag("b", "") + f.Int() + fg.init("") + tokens := tokenize([]string{"--no-b"}, false) + _, err := fg.parse(tokens) + assert.Error(t, err) +} + +func TestNegativePrefixLongFlag(t *testing.T) { + fg := newFlagGroup() + f := fg.Flag("no-comment", "") + b := f.Bool() + fg.init("") + tokens := tokenize([]string{"--no-comment"}, false) + _, err := fg.parse(tokens) + assert.NoError(t, err) + assert.False(t, *b) +} + +func TestInvalidFlagDefaultCanBeOverridden(t *testing.T) { + app := newTestApp() + app.Flag("a", "").Default("invalid").Bool() + _, err := app.Parse([]string{}) + assert.Error(t, err) +} + +func TestRequiredFlag(t *testing.T) { + app := newTestApp() + app.Version("0.0.0").Writer(ioutil.Discard) + exits := 0 + app.Terminate(func(int) { exits++ }) + app.Flag("a", "").Required().Bool() + _, err := app.Parse([]string{"--a"}) + assert.NoError(t, err) + _, err = app.Parse([]string{}) + assert.Error(t, err) + _, err = app.Parse([]string{"--version"}) + assert.Equal(t, 1, exits) +} + +func TestShortFlag(t *testing.T) { + app := newTestApp() + f := app.Flag("long", "").Short('s').Bool() + _, err := app.Parse([]string{"-s"}) + assert.NoError(t, err) + assert.True(t, *f) +} + +func TestUnicodeShortFlag(t *testing.T) { + app := newTestApp() + f := app.Flag("aaa", "").Short('ä').Bool() + _, err := app.Parse([]string{"-ä"}) + assert.NoError(t, err) + assert.True(t, *f) +} + +func TestCombinedShortFlags(t *testing.T) { + app := newTestApp() + a := app.Flag("short0", "").Short('0').Bool() + b := app.Flag("short1", "").Short('1').Bool() + c := app.Flag("short2", "").Short('2').Bool() + _, err := app.Parse([]string{"-01"}) + assert.NoError(t, err) + assert.True(t, *a) + assert.True(t, *b) + assert.False(t, *c) +} + +func TestCombinedUnicodeShortFlags(t *testing.T) { + app := newTestApp() + a := app.Flag("short0", "").Short('0').Bool() + b := app.Flag("short1", "").Short('1').Bool() + c := app.Flag("short2", "").Short('ä').Bool() + d := app.Flag("short3", "").Short('2').Bool() + _, err := app.Parse([]string{"-0ä1"}) + assert.NoError(t, err) + assert.True(t, *a) + assert.True(t, *b) + assert.True(t, *c) + assert.False(t, *d) +} + +func TestCombinedShortFlagArg(t *testing.T) { + a := newTestApp() + n := a.Flag("short", "").Short('s').Int() + _, err := a.Parse([]string{"-s10"}) + assert.NoError(t, err) + assert.Equal(t, 10, *n) +} + +func TestCombinedUnicodeShortFlagArg(t *testing.T) { + app := newTestApp() + a := app.Flag("short", "").Short('ä').Int() + _, err := app.Parse([]string{"-ä10"}) + assert.NoError(t, err) + assert.Equal(t, 10, *a) +} + +func TestCombinedUnicodeShortFlagUnicodeArg(t *testing.T) { + app := newTestApp() + a := app.Flag("short", "").Short('ä').String() + _, err := app.Parse([]string{"-äöö"}) + assert.NoError(t, err) + assert.Equal(t, "öö", *a) +} + +func TestEmptyShortFlagIsAnError(t *testing.T) { + _, err := newTestApp().Parse([]string{"-"}) + assert.Error(t, err) +} + +func TestRequiredWithEnvarMissingErrors(t *testing.T) { + app := newTestApp() + app.Flag("t", "").OverrideDefaultFromEnvar("TEST_ENVAR").Required().Int() + _, err := app.Parse([]string{}) + assert.Error(t, err) +} + +func TestRequiredWithEnvar(t *testing.T) { + os.Setenv("TEST_ENVAR", "123") + app := newTestApp() + flag := app.Flag("t", "").Envar("TEST_ENVAR").Required().Int() + _, err := app.Parse([]string{}) + assert.NoError(t, err) + assert.Equal(t, 123, *flag) +} + +func TestSubcommandFlagRequiredWithEnvar(t *testing.T) { + os.Setenv("TEST_ENVAR", "123") + app := newTestApp() + cmd := app.Command("command", "") + flag := cmd.Flag("t", "").Envar("TEST_ENVAR").Required().Int() + _, err := app.Parse([]string{"command"}) + assert.NoError(t, err) + assert.Equal(t, 123, *flag) +} + +func TestRegexp(t *testing.T) { + app := newTestApp() + flag := app.Flag("reg", "").Regexp() + _, err := app.Parse([]string{"--reg", "^abc$"}) + assert.NoError(t, err) + assert.NotNil(t, *flag) + assert.Equal(t, "^abc$", (*flag).String()) + assert.Regexp(t, *flag, "abc") + assert.NotRegexp(t, *flag, "abcd") +} + +func TestDuplicateShortFlag(t *testing.T) { + app := newTestApp() + app.Flag("a", "").Short('a').String() + app.Flag("b", "").Short('a').String() + _, err := app.Parse([]string{}) + assert.Error(t, err) +} + +func TestDuplicateLongFlag(t *testing.T) { + app := newTestApp() + app.Flag("a", "").String() + app.Flag("a", "").String() + _, err := app.Parse([]string{}) + assert.Error(t, err) +} + +func TestGetFlagAndOverrideDefault(t *testing.T) { + app := newTestApp() + a := app.Flag("a", "").Default("default").String() + _, err := app.Parse([]string{}) + assert.NoError(t, err) + assert.Equal(t, "default", *a) + app.GetFlag("a").Default("new") + _, err = app.Parse([]string{}) + assert.NoError(t, err) + assert.Equal(t, "new", *a) +} + +func TestEnvarOverrideDefault(t *testing.T) { + os.Setenv("TEST_ENVAR", "123") + app := newTestApp() + flag := app.Flag("t", "").Default("default").Envar("TEST_ENVAR").String() + _, err := app.Parse([]string{}) + assert.NoError(t, err) + assert.Equal(t, "123", *flag) +} + +func TestFlagMultipleValuesDefault(t *testing.T) { + app := newTestApp() + a := app.Flag("a", "").Default("default1", "default2").Strings() + _, err := app.Parse([]string{}) + assert.NoError(t, err) + assert.Equal(t, []string{"default1", "default2"}, *a) +} + +func TestFlagMultipleValuesDefaultNonRepeatable(t *testing.T) { + c := newTestApp() + c.Flag("foo", "foo").Default("a", "b").String() + _, err := c.Parse([]string{}) + assert.Error(t, err) +} + +func TestFlagMultipleValuesDefaultEnvarUnix(t *testing.T) { + app := newTestApp() + a := app.Flag("a", "").Envar("TEST_MULTIPLE_VALUES").Strings() + os.Setenv("TEST_MULTIPLE_VALUES", "123\n456\n") + _, err := app.Parse([]string{}) + assert.NoError(t, err) + assert.Equal(t, []string{"123", "456"}, *a) +} + +func TestFlagMultipleValuesDefaultEnvarWindows(t *testing.T) { + app := newTestApp() + a := app.Flag("a", "").Envar("TEST_MULTIPLE_VALUES").Strings() + os.Setenv("TEST_MULTIPLE_VALUES", "123\r\n456\r\n") + _, err := app.Parse([]string{}) + assert.NoError(t, err) + assert.Equal(t, []string{"123", "456"}, *a) +} + +func TestFlagMultipleValuesDefaultEnvarNonRepeatable(t *testing.T) { + c := newTestApp() + a := c.Flag("foo", "foo").Envar("TEST_MULTIPLE_VALUES_NON_REPEATABLE").String() + os.Setenv("TEST_MULTIPLE_VALUES_NON_REPEATABLE", "123\n456") + _, err := c.Parse([]string{}) + assert.NoError(t, err) + assert.Equal(t, "123\n456", *a) +} + +func TestFlagHintAction(t *testing.T) { + c := newTestApp() + + action := func() []string { + return []string{"opt1", "opt2"} + } + + a := c.Flag("foo", "foo").HintAction(action) + args := a.resolveCompletions() + assert.Equal(t, []string{"opt1", "opt2"}, args) +} + +func TestFlagHintOptions(t *testing.T) { + c := newTestApp() + + a := c.Flag("foo", "foo").HintOptions("opt1", "opt2") + args := a.resolveCompletions() + assert.Equal(t, []string{"opt1", "opt2"}, args) +} + +func TestFlagEnumVar(t *testing.T) { + c := newTestApp() + var bar string + + a := c.Flag("foo", "foo") + a.Enum("opt1", "opt2") + b := c.Flag("bar", "bar") + b.EnumVar(&bar, "opt3", "opt4") + + args := a.resolveCompletions() + assert.Equal(t, []string{"opt1", "opt2"}, args) + + args = b.resolveCompletions() + assert.Equal(t, []string{"opt3", "opt4"}, args) +} + +func TestMultiHintOptions(t *testing.T) { + c := newTestApp() + + a := c.Flag("foo", "foo").HintOptions("opt1").HintOptions("opt2") + args := a.resolveCompletions() + assert.Equal(t, []string{"opt1", "opt2"}, args) +} +func TestMultiHintActions(t *testing.T) { + c := newTestApp() + + a := c.Flag("foo", "foo"). + HintAction(func() []string { + return []string{"opt1"} + }). + HintAction(func() []string { + return []string{"opt2"} + }) + args := a.resolveCompletions() + assert.Equal(t, []string{"opt1", "opt2"}, args) +} + +func TestCombinationHintActionsOptions(t *testing.T) { + c := newTestApp() + + a := c.Flag("foo", "foo").HintAction(func() []string { + return []string{"opt1"} + }).HintOptions("opt2") + args := a.resolveCompletions() + assert.Equal(t, []string{"opt1", "opt2"}, args) +} + +func TestCombinationEnumActions(t *testing.T) { + c := newTestApp() + var foo string + + a := c.Flag("foo", "foo"). + HintAction(func() []string { + return []string{"opt1", "opt2"} + }) + a.Enum("opt3", "opt4") + + b := c.Flag("bar", "bar"). + HintAction(func() []string { + return []string{"opt5", "opt6"} + }) + b.EnumVar(&foo, "opt3", "opt4") + + // Provided HintActions should override automatically generated Enum options. + args := a.resolveCompletions() + assert.Equal(t, []string{"opt1", "opt2"}, args) + + args = b.resolveCompletions() + assert.Equal(t, []string{"opt5", "opt6"}, args) +} + +func TestCombinationEnumOptions(t *testing.T) { + c := newTestApp() + var foo string + + a := c.Flag("foo", "foo").HintOptions("opt1", "opt2") + a.Enum("opt3", "opt4") + + b := c.Flag("bar", "bar").HintOptions("opt5", "opt6") + b.EnumVar(&foo, "opt3", "opt4") + + // Provided HintOptions should override automatically generated Enum options. + args := a.resolveCompletions() + assert.Equal(t, []string{"opt1", "opt2"}, args) + + args = b.resolveCompletions() + assert.Equal(t, []string{"opt5", "opt6"}, args) + +} diff --git a/api/vendor/gopkg.in/alecthomas/kingpin.v2/global.go b/api/vendor/gopkg.in/alecthomas/kingpin.v2/global.go new file mode 100644 index 0000000..10a2913 --- /dev/null +++ b/api/vendor/gopkg.in/alecthomas/kingpin.v2/global.go @@ -0,0 +1,94 @@ +package kingpin + +import ( + "os" + "path/filepath" +) + +var ( + // CommandLine is the default Kingpin parser. + CommandLine = New(filepath.Base(os.Args[0]), "") + // Global help flag. Exposed for user customisation. + HelpFlag = CommandLine.HelpFlag + // Top-level help command. Exposed for user customisation. May be nil. + HelpCommand = CommandLine.HelpCommand + // Global version flag. Exposed for user customisation. May be nil. + VersionFlag = CommandLine.VersionFlag +) + +// Command adds a new command to the default parser. +func Command(name, help string) *CmdClause { + return CommandLine.Command(name, help) +} + +// Flag adds a new flag to the default parser. +func Flag(name, help string) *FlagClause { + return CommandLine.Flag(name, help) +} + +// Arg adds a new argument to the top-level of the default parser. +func Arg(name, help string) *ArgClause { + return CommandLine.Arg(name, help) +} + +// Parse and return the selected command. Will call the termination handler if +// an error is encountered. +func Parse() string { + selected := MustParse(CommandLine.Parse(os.Args[1:])) + if selected == "" && CommandLine.cmdGroup.have() { + Usage() + CommandLine.terminate(0) + } + return selected +} + +// Errorf prints an error message to stderr. +func Errorf(format string, args ...interface{}) { + CommandLine.Errorf(format, args...) +} + +// Fatalf prints an error message to stderr and exits. +func Fatalf(format string, args ...interface{}) { + CommandLine.Fatalf(format, args...) +} + +// FatalIfError prints an error and exits if err is not nil. The error is printed +// with the given prefix. +func FatalIfError(err error, format string, args ...interface{}) { + CommandLine.FatalIfError(err, format, args...) +} + +// FatalUsage prints an error message followed by usage information, then +// exits with a non-zero status. +func FatalUsage(format string, args ...interface{}) { + CommandLine.FatalUsage(format, args...) +} + +// FatalUsageContext writes a printf formatted error message to stderr, then +// usage information for the given ParseContext, before exiting. +func FatalUsageContext(context *ParseContext, format string, args ...interface{}) { + CommandLine.FatalUsageContext(context, format, args...) +} + +// Usage prints usage to stderr. +func Usage() { + CommandLine.Usage(os.Args[1:]) +} + +// Set global usage template to use (defaults to DefaultUsageTemplate). +func UsageTemplate(template string) *Application { + return CommandLine.UsageTemplate(template) +} + +// MustParse can be used with app.Parse(args) to exit with an error if parsing fails. +func MustParse(command string, err error) string { + if err != nil { + Fatalf("%s, try --help", err) + } + return command +} + +// Version adds a flag for displaying the application version number. +func Version(version string) *Application { + return CommandLine.Version(version) +} diff --git a/api/vendor/gopkg.in/alecthomas/kingpin.v2/guesswidth.go b/api/vendor/gopkg.in/alecthomas/kingpin.v2/guesswidth.go new file mode 100644 index 0000000..a269531 --- /dev/null +++ b/api/vendor/gopkg.in/alecthomas/kingpin.v2/guesswidth.go @@ -0,0 +1,9 @@ +// +build appengine !linux,!freebsd,!darwin,!dragonfly,!netbsd,!openbsd + +package kingpin + +import "io" + +func guessWidth(w io.Writer) int { + return 80 +} diff --git a/api/vendor/gopkg.in/alecthomas/kingpin.v2/guesswidth_unix.go b/api/vendor/gopkg.in/alecthomas/kingpin.v2/guesswidth_unix.go new file mode 100644 index 0000000..ad8163f --- /dev/null +++ b/api/vendor/gopkg.in/alecthomas/kingpin.v2/guesswidth_unix.go @@ -0,0 +1,38 @@ +// +build !appengine,linux freebsd darwin dragonfly netbsd openbsd + +package kingpin + +import ( + "io" + "os" + "strconv" + "syscall" + "unsafe" +) + +func guessWidth(w io.Writer) int { + // check if COLUMNS env is set to comply with + // http://pubs.opengroup.org/onlinepubs/009604499/basedefs/xbd_chap08.html + colsStr := os.Getenv("COLUMNS") + if colsStr != "" { + if cols, err := strconv.Atoi(colsStr); err == nil { + return cols + } + } + + if t, ok := w.(*os.File); ok { + fd := t.Fd() + var dimensions [4]uint16 + + if _, _, err := syscall.Syscall6( + syscall.SYS_IOCTL, + uintptr(fd), + uintptr(syscall.TIOCGWINSZ), + uintptr(unsafe.Pointer(&dimensions)), + 0, 0, 0, + ); err == 0 { + return int(dimensions[1]) + } + } + return 80 +} diff --git a/api/vendor/gopkg.in/alecthomas/kingpin.v2/model.go b/api/vendor/gopkg.in/alecthomas/kingpin.v2/model.go new file mode 100644 index 0000000..a4ee83b --- /dev/null +++ b/api/vendor/gopkg.in/alecthomas/kingpin.v2/model.go @@ -0,0 +1,227 @@ +package kingpin + +import ( + "fmt" + "strconv" + "strings" +) + +// Data model for Kingpin command-line structure. + +type FlagGroupModel struct { + Flags []*FlagModel +} + +func (f *FlagGroupModel) FlagSummary() string { + out := []string{} + count := 0 + for _, flag := range f.Flags { + if flag.Name != "help" { + count++ + } + if flag.Required { + if flag.IsBoolFlag() { + out = append(out, fmt.Sprintf("--[no-]%s", flag.Name)) + } else { + out = append(out, fmt.Sprintf("--%s=%s", flag.Name, flag.FormatPlaceHolder())) + } + } + } + if count != len(out) { + out = append(out, "[]") + } + return strings.Join(out, " ") +} + +type FlagModel struct { + Name string + Help string + Short rune + Default []string + Envar string + PlaceHolder string + Required bool + Hidden bool + Value Value +} + +func (f *FlagModel) String() string { + return f.Value.String() +} + +func (f *FlagModel) IsBoolFlag() bool { + if fl, ok := f.Value.(boolFlag); ok { + return fl.IsBoolFlag() + } + return false +} + +func (f *FlagModel) FormatPlaceHolder() string { + if f.PlaceHolder != "" { + return f.PlaceHolder + } + if len(f.Default) > 0 { + ellipsis := "" + if len(f.Default) > 1 { + ellipsis = "..." + } + if _, ok := f.Value.(*stringValue); ok { + return strconv.Quote(f.Default[0]) + ellipsis + } + return f.Default[0] + ellipsis + } + return strings.ToUpper(f.Name) +} + +type ArgGroupModel struct { + Args []*ArgModel +} + +func (a *ArgGroupModel) ArgSummary() string { + depth := 0 + out := []string{} + for _, arg := range a.Args { + h := "<" + arg.Name + ">" + if !arg.Required { + h = "[" + h + depth++ + } + out = append(out, h) + } + out[len(out)-1] = out[len(out)-1] + strings.Repeat("]", depth) + return strings.Join(out, " ") +} + +type ArgModel struct { + Name string + Help string + Default []string + Envar string + Required bool + Value Value +} + +func (a *ArgModel) String() string { + return a.Value.String() +} + +type CmdGroupModel struct { + Commands []*CmdModel +} + +func (c *CmdGroupModel) FlattenedCommands() (out []*CmdModel) { + for _, cmd := range c.Commands { + if len(cmd.Commands) == 0 { + out = append(out, cmd) + } + out = append(out, cmd.FlattenedCommands()...) + } + return +} + +type CmdModel struct { + Name string + Aliases []string + Help string + FullCommand string + Depth int + Hidden bool + Default bool + *FlagGroupModel + *ArgGroupModel + *CmdGroupModel +} + +func (c *CmdModel) String() string { + return c.FullCommand +} + +type ApplicationModel struct { + Name string + Help string + Version string + Author string + *ArgGroupModel + *CmdGroupModel + *FlagGroupModel +} + +func (a *Application) Model() *ApplicationModel { + return &ApplicationModel{ + Name: a.Name, + Help: a.Help, + Version: a.version, + Author: a.author, + FlagGroupModel: a.flagGroup.Model(), + ArgGroupModel: a.argGroup.Model(), + CmdGroupModel: a.cmdGroup.Model(), + } +} + +func (a *argGroup) Model() *ArgGroupModel { + m := &ArgGroupModel{} + for _, arg := range a.args { + m.Args = append(m.Args, arg.Model()) + } + return m +} + +func (a *ArgClause) Model() *ArgModel { + return &ArgModel{ + Name: a.name, + Help: a.help, + Default: a.defaultValues, + Envar: a.envar, + Required: a.required, + Value: a.value, + } +} + +func (f *flagGroup) Model() *FlagGroupModel { + m := &FlagGroupModel{} + for _, fl := range f.flagOrder { + m.Flags = append(m.Flags, fl.Model()) + } + return m +} + +func (f *FlagClause) Model() *FlagModel { + return &FlagModel{ + Name: f.name, + Help: f.help, + Short: rune(f.shorthand), + Default: f.defaultValues, + Envar: f.envar, + PlaceHolder: f.placeholder, + Required: f.required, + Hidden: f.hidden, + Value: f.value, + } +} + +func (c *cmdGroup) Model() *CmdGroupModel { + m := &CmdGroupModel{} + for _, cm := range c.commandOrder { + m.Commands = append(m.Commands, cm.Model()) + } + return m +} + +func (c *CmdClause) Model() *CmdModel { + depth := 0 + for i := c; i != nil; i = i.parent { + depth++ + } + return &CmdModel{ + Name: c.name, + Aliases: c.aliases, + Help: c.help, + Depth: depth, + Hidden: c.hidden, + Default: c.isDefault, + FullCommand: c.FullCommand(), + FlagGroupModel: c.flagGroup.Model(), + ArgGroupModel: c.argGroup.Model(), + CmdGroupModel: c.cmdGroup.Model(), + } +} diff --git a/api/vendor/gopkg.in/alecthomas/kingpin.v2/parser.go b/api/vendor/gopkg.in/alecthomas/kingpin.v2/parser.go new file mode 100644 index 0000000..2a18351 --- /dev/null +++ b/api/vendor/gopkg.in/alecthomas/kingpin.v2/parser.go @@ -0,0 +1,396 @@ +package kingpin + +import ( + "bufio" + "fmt" + "os" + "strings" + "unicode/utf8" +) + +type TokenType int + +// Token types. +const ( + TokenShort TokenType = iota + TokenLong + TokenArg + TokenError + TokenEOL +) + +func (t TokenType) String() string { + switch t { + case TokenShort: + return "short flag" + case TokenLong: + return "long flag" + case TokenArg: + return "argument" + case TokenError: + return "error" + case TokenEOL: + return "" + } + return "?" +} + +var ( + TokenEOLMarker = Token{-1, TokenEOL, ""} +) + +type Token struct { + Index int + Type TokenType + Value string +} + +func (t *Token) Equal(o *Token) bool { + return t.Index == o.Index +} + +func (t *Token) IsFlag() bool { + return t.Type == TokenShort || t.Type == TokenLong +} + +func (t *Token) IsEOF() bool { + return t.Type == TokenEOL +} + +func (t *Token) String() string { + switch t.Type { + case TokenShort: + return "-" + t.Value + case TokenLong: + return "--" + t.Value + case TokenArg: + return t.Value + case TokenError: + return "error: " + t.Value + case TokenEOL: + return "" + default: + panic("unhandled type") + } +} + +// A union of possible elements in a parse stack. +type ParseElement struct { + // Clause is either *CmdClause, *ArgClause or *FlagClause. + Clause interface{} + // Value is corresponding value for an ArgClause or FlagClause (if any). + Value *string +} + +// ParseContext holds the current context of the parser. When passed to +// Action() callbacks Elements will be fully populated with *FlagClause, +// *ArgClause and *CmdClause values and their corresponding arguments (if +// any). +type ParseContext struct { + SelectedCommand *CmdClause + ignoreDefault bool + argsOnly bool + peek []*Token + argi int // Index of current command-line arg we're processing. + args []string + rawArgs []string + flags *flagGroup + arguments *argGroup + argumenti int // Cursor into arguments + // Flags, arguments and commands encountered and collected during parse. + Elements []*ParseElement +} + +func (p *ParseContext) nextArg() *ArgClause { + if p.argumenti >= len(p.arguments.args) { + return nil + } + arg := p.arguments.args[p.argumenti] + if !arg.consumesRemainder() { + p.argumenti++ + } + return arg +} + +func (p *ParseContext) next() { + p.argi++ + p.args = p.args[1:] +} + +// HasTrailingArgs returns true if there are unparsed command-line arguments. +// This can occur if the parser can not match remaining arguments. +func (p *ParseContext) HasTrailingArgs() bool { + return len(p.args) > 0 +} + +func tokenize(args []string, ignoreDefault bool) *ParseContext { + return &ParseContext{ + ignoreDefault: ignoreDefault, + args: args, + rawArgs: args, + flags: newFlagGroup(), + arguments: newArgGroup(), + } +} + +func (p *ParseContext) mergeFlags(flags *flagGroup) { + for _, flag := range flags.flagOrder { + if flag.shorthand != 0 { + p.flags.short[string(flag.shorthand)] = flag + } + p.flags.long[flag.name] = flag + p.flags.flagOrder = append(p.flags.flagOrder, flag) + } +} + +func (p *ParseContext) mergeArgs(args *argGroup) { + for _, arg := range args.args { + p.arguments.args = append(p.arguments.args, arg) + } +} + +func (p *ParseContext) EOL() bool { + return p.Peek().Type == TokenEOL +} + +func (p *ParseContext) Error() bool { + return p.Peek().Type == TokenError +} + +// Next token in the parse context. +func (p *ParseContext) Next() *Token { + if len(p.peek) > 0 { + return p.pop() + } + + // End of tokens. + if len(p.args) == 0 { + return &Token{Index: p.argi, Type: TokenEOL} + } + + arg := p.args[0] + p.next() + + if p.argsOnly { + return &Token{p.argi, TokenArg, arg} + } + + // All remaining args are passed directly. + if arg == "--" { + p.argsOnly = true + return p.Next() + } + + if strings.HasPrefix(arg, "--") { + parts := strings.SplitN(arg[2:], "=", 2) + token := &Token{p.argi, TokenLong, parts[0]} + if len(parts) == 2 { + p.Push(&Token{p.argi, TokenArg, parts[1]}) + } + return token + } + + if strings.HasPrefix(arg, "-") { + if len(arg) == 1 { + return &Token{Index: p.argi, Type: TokenShort} + } + shortRune, size := utf8.DecodeRuneInString(arg[1:]) + short := string(shortRune) + flag, ok := p.flags.short[short] + // Not a known short flag, we'll just return it anyway. + if !ok { + } else if fb, ok := flag.value.(boolFlag); ok && fb.IsBoolFlag() { + // Bool short flag. + } else { + // Short flag with combined argument: -fARG + token := &Token{p.argi, TokenShort, short} + if len(arg) > size+1 { + p.Push(&Token{p.argi, TokenArg, arg[size+1:]}) + } + return token + } + + if len(arg) > size+1 { + p.args = append([]string{"-" + arg[size+1:]}, p.args...) + } + return &Token{p.argi, TokenShort, short} + } else if strings.HasPrefix(arg, "@") { + expanded, err := ExpandArgsFromFile(arg[1:]) + if err != nil { + return &Token{p.argi, TokenError, err.Error()} + } + if len(p.args) == 0 { + p.args = expanded + } else { + p.args = append(expanded, p.args...) + } + return p.Next() + } + + return &Token{p.argi, TokenArg, arg} +} + +func (p *ParseContext) Peek() *Token { + if len(p.peek) == 0 { + return p.Push(p.Next()) + } + return p.peek[len(p.peek)-1] +} + +func (p *ParseContext) Push(token *Token) *Token { + p.peek = append(p.peek, token) + return token +} + +func (p *ParseContext) pop() *Token { + end := len(p.peek) - 1 + token := p.peek[end] + p.peek = p.peek[0:end] + return token +} + +func (p *ParseContext) String() string { + return p.SelectedCommand.FullCommand() +} + +func (p *ParseContext) matchedFlag(flag *FlagClause, value string) { + p.Elements = append(p.Elements, &ParseElement{Clause: flag, Value: &value}) +} + +func (p *ParseContext) matchedArg(arg *ArgClause, value string) { + p.Elements = append(p.Elements, &ParseElement{Clause: arg, Value: &value}) +} + +func (p *ParseContext) matchedCmd(cmd *CmdClause) { + p.Elements = append(p.Elements, &ParseElement{Clause: cmd}) + p.mergeFlags(cmd.flagGroup) + p.mergeArgs(cmd.argGroup) + p.SelectedCommand = cmd +} + +// Expand arguments from a file. Lines starting with # will be treated as comments. +func ExpandArgsFromFile(filename string) (out []string, err error) { + if filename == "" { + return nil, fmt.Errorf("expected @ file to expand arguments from") + } + r, err := os.Open(filename) + if err != nil { + return nil, fmt.Errorf("failed to open arguments file %q: %s", filename, err) + } + defer r.Close() + scanner := bufio.NewScanner(r) + for scanner.Scan() { + line := scanner.Text() + if strings.HasPrefix(line, "#") { + continue + } + out = append(out, line) + } + err = scanner.Err() + if err != nil { + return nil, fmt.Errorf("failed to read arguments from %q: %s", filename, err) + } + return +} + +func parse(context *ParseContext, app *Application) (err error) { + context.mergeFlags(app.flagGroup) + context.mergeArgs(app.argGroup) + + cmds := app.cmdGroup + ignoreDefault := context.ignoreDefault + +loop: + for !context.EOL() && !context.Error() { + token := context.Peek() + + switch token.Type { + case TokenLong, TokenShort: + if flag, err := context.flags.parse(context); err != nil { + if !ignoreDefault { + if cmd := cmds.defaultSubcommand(); cmd != nil { + cmd.completionAlts = cmds.cmdNames() + context.matchedCmd(cmd) + cmds = cmd.cmdGroup + break + } + } + return err + } else if flag == HelpFlag { + ignoreDefault = true + } + + case TokenArg: + if cmds.have() { + selectedDefault := false + cmd, ok := cmds.commands[token.String()] + if !ok { + if !ignoreDefault { + if cmd = cmds.defaultSubcommand(); cmd != nil { + cmd.completionAlts = cmds.cmdNames() + selectedDefault = true + } + } + if cmd == nil { + return fmt.Errorf("expected command but got %q", token) + } + } + if cmd == HelpCommand { + ignoreDefault = true + } + cmd.completionAlts = nil + context.matchedCmd(cmd) + cmds = cmd.cmdGroup + if !selectedDefault { + context.Next() + } + } else if context.arguments.have() { + if app.noInterspersed { + // no more flags + context.argsOnly = true + } + arg := context.nextArg() + if arg == nil { + break loop + } + context.matchedArg(arg, token.String()) + context.Next() + } else { + break loop + } + + case TokenEOL: + break loop + } + } + + // Move to innermost default command. + for !ignoreDefault { + if cmd := cmds.defaultSubcommand(); cmd != nil { + cmd.completionAlts = cmds.cmdNames() + context.matchedCmd(cmd) + cmds = cmd.cmdGroup + } else { + break + } + } + + if context.Error() { + return fmt.Errorf("%s", context.Peek().Value) + } + + if !context.EOL() { + return fmt.Errorf("unexpected %s", context.Peek()) + } + + // Set defaults for all remaining args. + for arg := context.nextArg(); arg != nil && !arg.consumesRemainder(); arg = context.nextArg() { + for _, defaultValue := range arg.defaultValues { + if err := arg.value.Set(defaultValue); err != nil { + return fmt.Errorf("invalid default value '%s' for argument '%s'", defaultValue, arg.name) + } + } + } + + return +} diff --git a/api/vendor/gopkg.in/alecthomas/kingpin.v2/parser_test.go b/api/vendor/gopkg.in/alecthomas/kingpin.v2/parser_test.go new file mode 100644 index 0000000..43dfde9 --- /dev/null +++ b/api/vendor/gopkg.in/alecthomas/kingpin.v2/parser_test.go @@ -0,0 +1,122 @@ +package kingpin + +import ( + "io/ioutil" + "os" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestParserExpandFromFile(t *testing.T) { + f, err := ioutil.TempFile("", "") + assert.NoError(t, err) + defer os.Remove(f.Name()) + f.WriteString("hello\nworld\n") + f.Close() + + app := New("test", "") + arg0 := app.Arg("arg0", "").String() + arg1 := app.Arg("arg1", "").String() + + _, err = app.Parse([]string{"@" + f.Name()}) + assert.NoError(t, err) + assert.Equal(t, "hello", *arg0) + assert.Equal(t, "world", *arg1) +} + +func TestParserExpandFromFileLeadingArg(t *testing.T) { + f, err := ioutil.TempFile("", "") + assert.NoError(t, err) + defer os.Remove(f.Name()) + f.WriteString("hello\nworld\n") + f.Close() + + app := New("test", "") + arg0 := app.Arg("arg0", "").String() + arg1 := app.Arg("arg1", "").String() + arg2 := app.Arg("arg2", "").String() + + _, err = app.Parse([]string{"prefix", "@" + f.Name()}) + assert.NoError(t, err) + assert.Equal(t, "prefix", *arg0) + assert.Equal(t, "hello", *arg1) + assert.Equal(t, "world", *arg2) +} + +func TestParserExpandFromFileTrailingArg(t *testing.T) { + f, err := ioutil.TempFile("", "") + assert.NoError(t, err) + defer os.Remove(f.Name()) + f.WriteString("hello\nworld\n") + f.Close() + + app := New("test", "") + arg0 := app.Arg("arg0", "").String() + arg1 := app.Arg("arg1", "").String() + arg2 := app.Arg("arg2", "").String() + + _, err = app.Parse([]string{"@" + f.Name(), "suffix"}) + assert.NoError(t, err) + assert.Equal(t, "hello", *arg0) + assert.Equal(t, "world", *arg1) + assert.Equal(t, "suffix", *arg2) +} + +func TestParserExpandFromFileMultipleSurroundingArgs(t *testing.T) { + f, err := ioutil.TempFile("", "") + assert.NoError(t, err) + defer os.Remove(f.Name()) + f.WriteString("hello\nworld\n") + f.Close() + + app := New("test", "") + arg0 := app.Arg("arg0", "").String() + arg1 := app.Arg("arg1", "").String() + arg2 := app.Arg("arg2", "").String() + arg3 := app.Arg("arg3", "").String() + + _, err = app.Parse([]string{"prefix", "@" + f.Name(), "suffix"}) + assert.NoError(t, err) + assert.Equal(t, "prefix", *arg0) + assert.Equal(t, "hello", *arg1) + assert.Equal(t, "world", *arg2) + assert.Equal(t, "suffix", *arg3) +} + +func TestParserExpandFromFileMultipleFlags(t *testing.T) { + f, err := ioutil.TempFile("", "") + assert.NoError(t, err) + defer os.Remove(f.Name()) + f.WriteString("--flag1=f1\n--flag2=f2\n") + f.Close() + + app := New("test", "") + flag0 := app.Flag("flag0", "").String() + flag1 := app.Flag("flag1", "").String() + flag2 := app.Flag("flag2", "").String() + flag3 := app.Flag("flag3", "").String() + + _, err = app.Parse([]string{"--flag0=f0", "@" + f.Name(), "--flag3=f3"}) + assert.NoError(t, err) + assert.Equal(t, "f0", *flag0) + assert.Equal(t, "f1", *flag1) + assert.Equal(t, "f2", *flag2) + assert.Equal(t, "f3", *flag3) +} + +func TestParseContextPush(t *testing.T) { + app := New("test", "") + app.Command("foo", "").Command("bar", "") + c := tokenize([]string{"foo", "bar"}, false) + a := c.Next() + assert.Equal(t, TokenArg, a.Type) + b := c.Next() + assert.Equal(t, TokenArg, b.Type) + c.Push(b) + c.Push(a) + a = c.Next() + assert.Equal(t, "foo", a.Value) + b = c.Next() + assert.Equal(t, "bar", b.Value) +} diff --git a/api/vendor/gopkg.in/alecthomas/kingpin.v2/parsers.go b/api/vendor/gopkg.in/alecthomas/kingpin.v2/parsers.go new file mode 100644 index 0000000..d9ad57e --- /dev/null +++ b/api/vendor/gopkg.in/alecthomas/kingpin.v2/parsers.go @@ -0,0 +1,212 @@ +package kingpin + +import ( + "net" + "net/url" + "os" + "time" + + "github.com/alecthomas/units" +) + +type Settings interface { + SetValue(value Value) +} + +type parserMixin struct { + value Value + required bool +} + +func (p *parserMixin) SetValue(value Value) { + p.value = value +} + +// StringMap provides key=value parsing into a map. +func (p *parserMixin) StringMap() (target *map[string]string) { + target = &(map[string]string{}) + p.StringMapVar(target) + return +} + +// Duration sets the parser to a time.Duration parser. +func (p *parserMixin) Duration() (target *time.Duration) { + target = new(time.Duration) + p.DurationVar(target) + return +} + +// Bytes parses numeric byte units. eg. 1.5KB +func (p *parserMixin) Bytes() (target *units.Base2Bytes) { + target = new(units.Base2Bytes) + p.BytesVar(target) + return +} + +// IP sets the parser to a net.IP parser. +func (p *parserMixin) IP() (target *net.IP) { + target = new(net.IP) + p.IPVar(target) + return +} + +// TCP (host:port) address. +func (p *parserMixin) TCP() (target **net.TCPAddr) { + target = new(*net.TCPAddr) + p.TCPVar(target) + return +} + +// TCPVar (host:port) address. +func (p *parserMixin) TCPVar(target **net.TCPAddr) { + p.SetValue(newTCPAddrValue(target)) +} + +// ExistingFile sets the parser to one that requires and returns an existing file. +func (p *parserMixin) ExistingFile() (target *string) { + target = new(string) + p.ExistingFileVar(target) + return +} + +// ExistingDir sets the parser to one that requires and returns an existing directory. +func (p *parserMixin) ExistingDir() (target *string) { + target = new(string) + p.ExistingDirVar(target) + return +} + +// ExistingFileOrDir sets the parser to one that requires and returns an existing file OR directory. +func (p *parserMixin) ExistingFileOrDir() (target *string) { + target = new(string) + p.ExistingFileOrDirVar(target) + return +} + +// File returns an os.File against an existing file. +func (p *parserMixin) File() (target **os.File) { + target = new(*os.File) + p.FileVar(target) + return +} + +// File attempts to open a File with os.OpenFile(flag, perm). +func (p *parserMixin) OpenFile(flag int, perm os.FileMode) (target **os.File) { + target = new(*os.File) + p.OpenFileVar(target, flag, perm) + return +} + +// URL provides a valid, parsed url.URL. +func (p *parserMixin) URL() (target **url.URL) { + target = new(*url.URL) + p.URLVar(target) + return +} + +// StringMap provides key=value parsing into a map. +func (p *parserMixin) StringMapVar(target *map[string]string) { + p.SetValue(newStringMapValue(target)) +} + +// Float sets the parser to a float64 parser. +func (p *parserMixin) Float() (target *float64) { + return p.Float64() +} + +// Float sets the parser to a float64 parser. +func (p *parserMixin) FloatVar(target *float64) { + p.Float64Var(target) +} + +// Duration sets the parser to a time.Duration parser. +func (p *parserMixin) DurationVar(target *time.Duration) { + p.SetValue(newDurationValue(target)) +} + +// BytesVar parses numeric byte units. eg. 1.5KB +func (p *parserMixin) BytesVar(target *units.Base2Bytes) { + p.SetValue(newBytesValue(target)) +} + +// IP sets the parser to a net.IP parser. +func (p *parserMixin) IPVar(target *net.IP) { + p.SetValue(newIPValue(target)) +} + +// ExistingFile sets the parser to one that requires and returns an existing file. +func (p *parserMixin) ExistingFileVar(target *string) { + p.SetValue(newExistingFileValue(target)) +} + +// ExistingDir sets the parser to one that requires and returns an existing directory. +func (p *parserMixin) ExistingDirVar(target *string) { + p.SetValue(newExistingDirValue(target)) +} + +// ExistingDir sets the parser to one that requires and returns an existing directory. +func (p *parserMixin) ExistingFileOrDirVar(target *string) { + p.SetValue(newExistingFileOrDirValue(target)) +} + +// FileVar opens an existing file. +func (p *parserMixin) FileVar(target **os.File) { + p.SetValue(newFileValue(target, os.O_RDONLY, 0)) +} + +// OpenFileVar calls os.OpenFile(flag, perm) +func (p *parserMixin) OpenFileVar(target **os.File, flag int, perm os.FileMode) { + p.SetValue(newFileValue(target, flag, perm)) +} + +// URL provides a valid, parsed url.URL. +func (p *parserMixin) URLVar(target **url.URL) { + p.SetValue(newURLValue(target)) +} + +// URLList provides a parsed list of url.URL values. +func (p *parserMixin) URLList() (target *[]*url.URL) { + target = new([]*url.URL) + p.URLListVar(target) + return +} + +// URLListVar provides a parsed list of url.URL values. +func (p *parserMixin) URLListVar(target *[]*url.URL) { + p.SetValue(newURLListValue(target)) +} + +// Enum allows a value from a set of options. +func (p *parserMixin) Enum(options ...string) (target *string) { + target = new(string) + p.EnumVar(target, options...) + return +} + +// EnumVar allows a value from a set of options. +func (p *parserMixin) EnumVar(target *string, options ...string) { + p.SetValue(newEnumFlag(target, options...)) +} + +// Enums allows a set of values from a set of options. +func (p *parserMixin) Enums(options ...string) (target *[]string) { + target = new([]string) + p.EnumsVar(target, options...) + return +} + +// EnumVar allows a value from a set of options. +func (p *parserMixin) EnumsVar(target *[]string, options ...string) { + p.SetValue(newEnumsFlag(target, options...)) +} + +// A Counter increments a number each time it is encountered. +func (p *parserMixin) Counter() (target *int) { + target = new(int) + p.CounterVar(target) + return +} + +func (p *parserMixin) CounterVar(target *int) { + p.SetValue(newCounterValue(target)) +} diff --git a/api/vendor/gopkg.in/alecthomas/kingpin.v2/parsers_test.go b/api/vendor/gopkg.in/alecthomas/kingpin.v2/parsers_test.go new file mode 100644 index 0000000..81708c7 --- /dev/null +++ b/api/vendor/gopkg.in/alecthomas/kingpin.v2/parsers_test.go @@ -0,0 +1,98 @@ +package kingpin + +import ( + "io/ioutil" + "net" + "net/url" + "os" + + "github.com/stretchr/testify/assert" + + "testing" +) + +func TestParseStrings(t *testing.T) { + p := parserMixin{} + v := p.Strings() + p.value.Set("a") + p.value.Set("b") + assert.Equal(t, []string{"a", "b"}, *v) +} + +func TestStringsStringer(t *testing.T) { + target := []string{} + v := newAccumulator(&target, func(v interface{}) Value { return newStringValue(v.(*string)) }) + v.Set("hello") + v.Set("world") + assert.Equal(t, "hello,world", v.String()) +} + +func TestParseStringMap(t *testing.T) { + p := parserMixin{} + v := p.StringMap() + p.value.Set("a:b") + p.value.Set("b:c") + assert.Equal(t, map[string]string{"a": "b", "b": "c"}, *v) +} + +func TestParseIP(t *testing.T) { + p := parserMixin{} + v := p.IP() + p.value.Set("10.1.1.2") + ip := net.ParseIP("10.1.1.2") + assert.Equal(t, ip, *v) +} + +func TestParseURL(t *testing.T) { + p := parserMixin{} + v := p.URL() + p.value.Set("http://w3.org") + u, err := url.Parse("http://w3.org") + assert.NoError(t, err) + assert.Equal(t, *u, **v) +} + +func TestParseExistingFile(t *testing.T) { + f, err := ioutil.TempFile("", "") + if err != nil { + t.Fatal(err) + } + defer f.Close() + defer os.Remove(f.Name()) + + p := parserMixin{} + v := p.ExistingFile() + err = p.value.Set(f.Name()) + assert.NoError(t, err) + assert.Equal(t, f.Name(), *v) + err = p.value.Set("/etc/hostsDEFINITELYMISSING") + assert.Error(t, err) +} + +func TestParseTCPAddr(t *testing.T) { + p := parserMixin{} + v := p.TCP() + err := p.value.Set("127.0.0.1:1234") + assert.NoError(t, err) + expected, err := net.ResolveTCPAddr("tcp", "127.0.0.1:1234") + assert.NoError(t, err) + assert.Equal(t, *expected, **v) +} + +func TestParseTCPAddrList(t *testing.T) { + p := parserMixin{} + _ = p.TCPList() + err := p.value.Set("127.0.0.1:1234") + assert.NoError(t, err) + err = p.value.Set("127.0.0.1:1235") + assert.NoError(t, err) + assert.Equal(t, "127.0.0.1:1234,127.0.0.1:1235", p.value.String()) +} + +func TestFloat32(t *testing.T) { + p := parserMixin{} + v := p.Float32() + err := p.value.Set("123.45") + assert.NoError(t, err) + assert.InEpsilon(t, 123.45, *v, 0.001) +} diff --git a/api/vendor/gopkg.in/alecthomas/kingpin.v2/templates.go b/api/vendor/gopkg.in/alecthomas/kingpin.v2/templates.go new file mode 100644 index 0000000..97b5c9f --- /dev/null +++ b/api/vendor/gopkg.in/alecthomas/kingpin.v2/templates.go @@ -0,0 +1,262 @@ +package kingpin + +// Default usage template. +var DefaultUsageTemplate = `{{define "FormatCommand"}}\ +{{if .FlagSummary}} {{.FlagSummary}}{{end}}\ +{{range .Args}} {{if not .Required}}[{{end}}<{{.Name}}>{{if .Value|IsCumulative}}...{{end}}{{if not .Required}}]{{end}}{{end}}\ +{{end}}\ + +{{define "FormatCommands"}}\ +{{range .FlattenedCommands}}\ +{{if not .Hidden}}\ + {{.FullCommand}}{{if .Default}}*{{end}}{{template "FormatCommand" .}} +{{.Help|Wrap 4}} +{{end}}\ +{{end}}\ +{{end}}\ + +{{define "FormatUsage"}}\ +{{template "FormatCommand" .}}{{if .Commands}} [ ...]{{end}} +{{if .Help}} +{{.Help|Wrap 0}}\ +{{end}}\ + +{{end}}\ + +{{if .Context.SelectedCommand}}\ +usage: {{.App.Name}} {{.Context.SelectedCommand}}{{template "FormatUsage" .Context.SelectedCommand}} +{{else}}\ +usage: {{.App.Name}}{{template "FormatUsage" .App}} +{{end}}\ +{{if .Context.Flags}}\ +Flags: +{{.Context.Flags|FlagsToTwoColumns|FormatTwoColumns}} +{{end}}\ +{{if .Context.Args}}\ +Args: +{{.Context.Args|ArgsToTwoColumns|FormatTwoColumns}} +{{end}}\ +{{if .Context.SelectedCommand}}\ +{{if len .Context.SelectedCommand.Commands}}\ +Subcommands: +{{template "FormatCommands" .Context.SelectedCommand}} +{{end}}\ +{{else if .App.Commands}}\ +Commands: +{{template "FormatCommands" .App}} +{{end}}\ +` + +// Usage template where command's optional flags are listed separately +var SeparateOptionalFlagsUsageTemplate = `{{define "FormatCommand"}}\ +{{if .FlagSummary}} {{.FlagSummary}}{{end}}\ +{{range .Args}} {{if not .Required}}[{{end}}<{{.Name}}>{{if .Value|IsCumulative}}...{{end}}{{if not .Required}}]{{end}}{{end}}\ +{{end}}\ + +{{define "FormatCommands"}}\ +{{range .FlattenedCommands}}\ +{{if not .Hidden}}\ + {{.FullCommand}}{{if .Default}}*{{end}}{{template "FormatCommand" .}} +{{.Help|Wrap 4}} +{{end}}\ +{{end}}\ +{{end}}\ + +{{define "FormatUsage"}}\ +{{template "FormatCommand" .}}{{if .Commands}} [ ...]{{end}} +{{if .Help}} +{{.Help|Wrap 0}}\ +{{end}}\ + +{{end}}\ +{{if .Context.SelectedCommand}}\ +usage: {{.App.Name}} {{.Context.SelectedCommand}}{{template "FormatUsage" .Context.SelectedCommand}} +{{else}}\ +usage: {{.App.Name}}{{template "FormatUsage" .App}} +{{end}}\ + +{{if .Context.Flags|RequiredFlags}}\ +Required flags: +{{.Context.Flags|RequiredFlags|FlagsToTwoColumns|FormatTwoColumns}} +{{end}}\ +{{if .Context.Flags|OptionalFlags}}\ +Optional flags: +{{.Context.Flags|OptionalFlags|FlagsToTwoColumns|FormatTwoColumns}} +{{end}}\ +{{if .Context.Args}}\ +Args: +{{.Context.Args|ArgsToTwoColumns|FormatTwoColumns}} +{{end}}\ +{{if .Context.SelectedCommand}}\ +Subcommands: +{{if .Context.SelectedCommand.Commands}}\ +{{template "FormatCommands" .Context.SelectedCommand}} +{{end}}\ +{{else if .App.Commands}}\ +Commands: +{{template "FormatCommands" .App}} +{{end}}\ +` + +// Usage template with compactly formatted commands. +var CompactUsageTemplate = `{{define "FormatCommand"}}\ +{{if .FlagSummary}} {{.FlagSummary}}{{end}}\ +{{range .Args}} {{if not .Required}}[{{end}}<{{.Name}}>{{if .Value|IsCumulative}}...{{end}}{{if not .Required}}]{{end}}{{end}}\ +{{end}}\ + +{{define "FormatCommandList"}}\ +{{range .}}\ +{{if not .Hidden}}\ +{{.Depth|Indent}}{{.Name}}{{if .Default}}*{{end}}{{template "FormatCommand" .}} +{{end}}\ +{{template "FormatCommandList" .Commands}}\ +{{end}}\ +{{end}}\ + +{{define "FormatUsage"}}\ +{{template "FormatCommand" .}}{{if .Commands}} [ ...]{{end}} +{{if .Help}} +{{.Help|Wrap 0}}\ +{{end}}\ + +{{end}}\ + +{{if .Context.SelectedCommand}}\ +usage: {{.App.Name}} {{.Context.SelectedCommand}}{{template "FormatUsage" .Context.SelectedCommand}} +{{else}}\ +usage: {{.App.Name}}{{template "FormatUsage" .App}} +{{end}}\ +{{if .Context.Flags}}\ +Flags: +{{.Context.Flags|FlagsToTwoColumns|FormatTwoColumns}} +{{end}}\ +{{if .Context.Args}}\ +Args: +{{.Context.Args|ArgsToTwoColumns|FormatTwoColumns}} +{{end}}\ +{{if .Context.SelectedCommand}}\ +{{if .Context.SelectedCommand.Commands}}\ +Commands: + {{.Context.SelectedCommand}} +{{template "FormatCommandList" .Context.SelectedCommand.Commands}} +{{end}}\ +{{else if .App.Commands}}\ +Commands: +{{template "FormatCommandList" .App.Commands}} +{{end}}\ +` + +var ManPageTemplate = `{{define "FormatFlags"}}\ +{{range .Flags}}\ +{{if not .Hidden}}\ +.TP +\fB{{if .Short}}-{{.Short|Char}}, {{end}}--{{.Name}}{{if not .IsBoolFlag}}={{.FormatPlaceHolder}}{{end}}\\fR +{{.Help}} +{{end}}\ +{{end}}\ +{{end}}\ + +{{define "FormatCommand"}}\ +{{if .FlagSummary}} {{.FlagSummary}}{{end}}\ +{{range .Args}} {{if not .Required}}[{{end}}<{{.Name}}{{if .Default}}*{{end}}>{{if .Value|IsCumulative}}...{{end}}{{if not .Required}}]{{end}}{{end}}\ +{{end}}\ + +{{define "FormatCommands"}}\ +{{range .FlattenedCommands}}\ +{{if not .Hidden}}\ +.SS +\fB{{.FullCommand}}{{template "FormatCommand" .}}\\fR +.PP +{{.Help}} +{{template "FormatFlags" .}}\ +{{end}}\ +{{end}}\ +{{end}}\ + +{{define "FormatUsage"}}\ +{{template "FormatCommand" .}}{{if .Commands}} [ ...]{{end}}\\fR +{{end}}\ + +.TH {{.App.Name}} 1 {{.App.Version}} "{{.App.Author}}" +.SH "NAME" +{{.App.Name}} +.SH "SYNOPSIS" +.TP +\fB{{.App.Name}}{{template "FormatUsage" .App}} +.SH "DESCRIPTION" +{{.App.Help}} +.SH "OPTIONS" +{{template "FormatFlags" .App}}\ +{{if .App.Commands}}\ +.SH "COMMANDS" +{{template "FormatCommands" .App}}\ +{{end}}\ +` + +// Default usage template. +var LongHelpTemplate = `{{define "FormatCommand"}}\ +{{if .FlagSummary}} {{.FlagSummary}}{{end}}\ +{{range .Args}} {{if not .Required}}[{{end}}<{{.Name}}>{{if .Value|IsCumulative}}...{{end}}{{if not .Required}}]{{end}}{{end}}\ +{{end}}\ + +{{define "FormatCommands"}}\ +{{range .FlattenedCommands}}\ +{{if not .Hidden}}\ + {{.FullCommand}}{{template "FormatCommand" .}} +{{.Help|Wrap 4}} +{{with .Flags|FlagsToTwoColumns}}{{FormatTwoColumnsWithIndent . 4 2}}{{end}} +{{end}}\ +{{end}}\ +{{end}}\ + +{{define "FormatUsage"}}\ +{{template "FormatCommand" .}}{{if .Commands}} [ ...]{{end}} +{{if .Help}} +{{.Help|Wrap 0}}\ +{{end}}\ + +{{end}}\ + +usage: {{.App.Name}}{{template "FormatUsage" .App}} +{{if .Context.Flags}}\ +Flags: +{{.Context.Flags|FlagsToTwoColumns|FormatTwoColumns}} +{{end}}\ +{{if .Context.Args}}\ +Args: +{{.Context.Args|ArgsToTwoColumns|FormatTwoColumns}} +{{end}}\ +{{if .App.Commands}}\ +Commands: +{{template "FormatCommands" .App}} +{{end}}\ +` + +var BashCompletionTemplate = ` +_{{.App.Name}}_bash_autocomplete() { + local cur prev opts base + COMPREPLY=() + cur="${COMP_WORDS[COMP_CWORD]}" + opts=$( ${COMP_WORDS[0]} --completion-bash ${COMP_WORDS[@]:1:$COMP_CWORD} ) + COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) + return 0 +} +complete -F _{{.App.Name}}_bash_autocomplete {{.App.Name}} + +` + +var ZshCompletionTemplate = ` +#compdef {{.App.Name}} +autoload -U compinit && compinit +autoload -U bashcompinit && bashcompinit + +_{{.App.Name}}_bash_autocomplete() { + local cur prev opts base + COMPREPLY=() + cur="${COMP_WORDS[COMP_CWORD]}" + opts=$( ${COMP_WORDS[0]} --completion-bash ${COMP_WORDS[@]:1:$COMP_CWORD} ) + COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) + return 0 +} +complete -F _{{.App.Name}}_bash_autocomplete {{.App.Name}} +` diff --git a/api/vendor/gopkg.in/alecthomas/kingpin.v2/usage.go b/api/vendor/gopkg.in/alecthomas/kingpin.v2/usage.go new file mode 100644 index 0000000..44af6f6 --- /dev/null +++ b/api/vendor/gopkg.in/alecthomas/kingpin.v2/usage.go @@ -0,0 +1,211 @@ +package kingpin + +import ( + "bytes" + "fmt" + "go/doc" + "io" + "strings" + + "github.com/alecthomas/template" +) + +var ( + preIndent = " " +) + +func formatTwoColumns(w io.Writer, indent, padding, width int, rows [][2]string) { + // Find size of first column. + s := 0 + for _, row := range rows { + if c := len(row[0]); c > s && c < 30 { + s = c + } + } + + indentStr := strings.Repeat(" ", indent) + offsetStr := strings.Repeat(" ", s+padding) + + for _, row := range rows { + buf := bytes.NewBuffer(nil) + doc.ToText(buf, row[1], "", preIndent, width-s-padding-indent) + lines := strings.Split(strings.TrimRight(buf.String(), "\n"), "\n") + fmt.Fprintf(w, "%s%-*s%*s", indentStr, s, row[0], padding, "") + if len(row[0]) >= 30 { + fmt.Fprintf(w, "\n%s%s", indentStr, offsetStr) + } + fmt.Fprintf(w, "%s\n", lines[0]) + for _, line := range lines[1:] { + fmt.Fprintf(w, "%s%s%s\n", indentStr, offsetStr, line) + } + } +} + +// Usage writes application usage to w. It parses args to determine +// appropriate help context, such as which command to show help for. +func (a *Application) Usage(args []string) { + context, err := a.parseContext(true, args) + a.FatalIfError(err, "") + if err := a.UsageForContextWithTemplate(context, 2, a.usageTemplate); err != nil { + panic(err) + } +} + +func formatAppUsage(app *ApplicationModel) string { + s := []string{app.Name} + if len(app.Flags) > 0 { + s = append(s, app.FlagSummary()) + } + if len(app.Args) > 0 { + s = append(s, app.ArgSummary()) + } + return strings.Join(s, " ") +} + +func formatCmdUsage(app *ApplicationModel, cmd *CmdModel) string { + s := []string{app.Name, cmd.String()} + if len(app.Flags) > 0 { + s = append(s, app.FlagSummary()) + } + if len(app.Args) > 0 { + s = append(s, app.ArgSummary()) + } + return strings.Join(s, " ") +} + +func formatFlag(haveShort bool, flag *FlagModel) string { + flagString := "" + if flag.Short != 0 { + flagString += fmt.Sprintf("-%c, --%s", flag.Short, flag.Name) + } else { + if haveShort { + flagString += fmt.Sprintf(" --%s", flag.Name) + } else { + flagString += fmt.Sprintf("--%s", flag.Name) + } + } + if !flag.IsBoolFlag() { + flagString += fmt.Sprintf("=%s", flag.FormatPlaceHolder()) + } + if v, ok := flag.Value.(repeatableFlag); ok && v.IsCumulative() { + flagString += " ..." + } + return flagString +} + +type templateParseContext struct { + SelectedCommand *CmdModel + *FlagGroupModel + *ArgGroupModel +} + +type templateContext struct { + App *ApplicationModel + Width int + Context *templateParseContext +} + +// UsageForContext displays usage information from a ParseContext (obtained from +// Application.ParseContext() or Action(f) callbacks). +func (a *Application) UsageForContext(context *ParseContext) error { + return a.UsageForContextWithTemplate(context, 2, a.usageTemplate) +} + +// UsageForContextWithTemplate is the base usage function. You generally don't need to use this. +func (a *Application) UsageForContextWithTemplate(context *ParseContext, indent int, tmpl string) error { + width := guessWidth(a.usageWriter) + funcs := template.FuncMap{ + "Indent": func(level int) string { + return strings.Repeat(" ", level*indent) + }, + "Wrap": func(indent int, s string) string { + buf := bytes.NewBuffer(nil) + indentText := strings.Repeat(" ", indent) + doc.ToText(buf, s, indentText, " "+indentText, width-indent) + return buf.String() + }, + "FormatFlag": formatFlag, + "FlagsToTwoColumns": func(f []*FlagModel) [][2]string { + rows := [][2]string{} + haveShort := false + for _, flag := range f { + if flag.Short != 0 { + haveShort = true + break + } + } + for _, flag := range f { + if !flag.Hidden { + rows = append(rows, [2]string{formatFlag(haveShort, flag), flag.Help}) + } + } + return rows + }, + "RequiredFlags": func(f []*FlagModel) []*FlagModel { + requiredFlags := []*FlagModel{} + for _, flag := range f { + if flag.Required { + requiredFlags = append(requiredFlags, flag) + } + } + return requiredFlags + }, + "OptionalFlags": func(f []*FlagModel) []*FlagModel { + optionalFlags := []*FlagModel{} + for _, flag := range f { + if !flag.Required { + optionalFlags = append(optionalFlags, flag) + } + } + return optionalFlags + }, + "ArgsToTwoColumns": func(a []*ArgModel) [][2]string { + rows := [][2]string{} + for _, arg := range a { + s := "<" + arg.Name + ">" + if !arg.Required { + s = "[" + s + "]" + } + rows = append(rows, [2]string{s, arg.Help}) + } + return rows + }, + "FormatTwoColumns": func(rows [][2]string) string { + buf := bytes.NewBuffer(nil) + formatTwoColumns(buf, indent, indent, width, rows) + return buf.String() + }, + "FormatTwoColumnsWithIndent": func(rows [][2]string, indent, padding int) string { + buf := bytes.NewBuffer(nil) + formatTwoColumns(buf, indent, padding, width, rows) + return buf.String() + }, + "FormatAppUsage": formatAppUsage, + "FormatCommandUsage": formatCmdUsage, + "IsCumulative": func(value Value) bool { + r, ok := value.(remainderArg) + return ok && r.IsCumulative() + }, + "Char": func(c rune) string { + return string(c) + }, + } + t, err := template.New("usage").Funcs(funcs).Parse(tmpl) + if err != nil { + return err + } + var selectedCommand *CmdModel + if context.SelectedCommand != nil { + selectedCommand = context.SelectedCommand.Model() + } + ctx := templateContext{ + App: a.Model(), + Width: width, + Context: &templateParseContext{ + SelectedCommand: selectedCommand, + FlagGroupModel: context.flags.Model(), + ArgGroupModel: context.arguments.Model(), + }, + } + return t.Execute(a.usageWriter, ctx) +} diff --git a/api/vendor/gopkg.in/alecthomas/kingpin.v2/usage_test.go b/api/vendor/gopkg.in/alecthomas/kingpin.v2/usage_test.go new file mode 100644 index 0000000..2b81857 --- /dev/null +++ b/api/vendor/gopkg.in/alecthomas/kingpin.v2/usage_test.go @@ -0,0 +1,65 @@ +package kingpin + +import ( + "bytes" + "strings" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestFormatTwoColumns(t *testing.T) { + buf := bytes.NewBuffer(nil) + formatTwoColumns(buf, 2, 2, 20, [][2]string{ + {"--hello", "Hello world help with something that is cool."}, + }) + expected := ` --hello Hello + world + help with + something + that is + cool. +` + assert.Equal(t, expected, buf.String()) +} + +func TestFormatTwoColumnsWide(t *testing.T) { + samples := [][2]string{ + {strings.Repeat("x", 29), "29 chars"}, + {strings.Repeat("x", 30), "30 chars"}} + buf := bytes.NewBuffer(nil) + formatTwoColumns(buf, 0, 0, 200, samples) + expected := `xxxxxxxxxxxxxxxxxxxxxxxxxxxxx29 chars +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + 30 chars +` + assert.Equal(t, expected, buf.String()) +} + +func TestHiddenCommand(t *testing.T) { + templates := []struct{ name, template string }{ + {"default", DefaultUsageTemplate}, + {"Compact", CompactUsageTemplate}, + {"Long", LongHelpTemplate}, + {"Man", ManPageTemplate}, + } + + var buf bytes.Buffer + t.Log("1") + + a := New("test", "Test").Writer(&buf).Terminate(nil) + a.Command("visible", "visible") + a.Command("hidden", "hidden").Hidden() + + for _, tp := range templates { + buf.Reset() + a.UsageTemplate(tp.template) + a.Parse(nil) + // a.Parse([]string{"--help"}) + usage := buf.String() + t.Logf("Usage for %s is:\n%s\n", tp.name, usage) + + assert.NotContains(t, usage, "hidden") + assert.Contains(t, usage, "visible") + } +} diff --git a/api/vendor/gopkg.in/alecthomas/kingpin.v2/values.go b/api/vendor/gopkg.in/alecthomas/kingpin.v2/values.go new file mode 100644 index 0000000..7ee9a3b --- /dev/null +++ b/api/vendor/gopkg.in/alecthomas/kingpin.v2/values.go @@ -0,0 +1,470 @@ +package kingpin + +//go:generate go run ./cmd/genvalues/main.go + +import ( + "fmt" + "net" + "net/url" + "os" + "reflect" + "regexp" + "strings" + "time" + + "github.com/alecthomas/units" +) + +// NOTE: Most of the base type values were lifted from: +// http://golang.org/src/pkg/flag/flag.go?s=20146:20222 + +// Value is the interface to the dynamic value stored in a flag. +// (The default value is represented as a string.) +// +// If a Value has an IsBoolFlag() bool method returning true, the command-line +// parser makes --name equivalent to -name=true rather than using the next +// command-line argument, and adds a --no-name counterpart for negating the +// flag. +type Value interface { + String() string + Set(string) error +} + +// Getter is an interface that allows the contents of a Value to be retrieved. +// It wraps the Value interface, rather than being part of it, because it +// appeared after Go 1 and its compatibility rules. All Value types provided +// by this package satisfy the Getter interface. +type Getter interface { + Value + Get() interface{} +} + +// Optional interface to indicate boolean flags that don't accept a value, and +// implicitly have a --no- negation counterpart. +type boolFlag interface { + Value + IsBoolFlag() bool +} + +// Optional interface for arguments that cumulatively consume all remaining +// input. +type remainderArg interface { + Value + IsCumulative() bool +} + +// Optional interface for flags that can be repeated. +type repeatableFlag interface { + Value + IsCumulative() bool +} + +type accumulator struct { + element func(value interface{}) Value + typ reflect.Type + slice reflect.Value +} + +// Use reflection to accumulate values into a slice. +// +// target := []string{} +// newAccumulator(&target, func (value interface{}) Value { +// return newStringValue(value.(*string)) +// }) +func newAccumulator(slice interface{}, element func(value interface{}) Value) *accumulator { + typ := reflect.TypeOf(slice) + if typ.Kind() != reflect.Ptr || typ.Elem().Kind() != reflect.Slice { + panic("expected a pointer to a slice") + } + return &accumulator{ + element: element, + typ: typ.Elem().Elem(), + slice: reflect.ValueOf(slice), + } +} + +func (a *accumulator) String() string { + out := []string{} + s := a.slice.Elem() + for i := 0; i < s.Len(); i++ { + out = append(out, a.element(s.Index(i).Addr().Interface()).String()) + } + return strings.Join(out, ",") +} + +func (a *accumulator) Set(value string) error { + e := reflect.New(a.typ) + if err := a.element(e.Interface()).Set(value); err != nil { + return err + } + slice := reflect.Append(a.slice.Elem(), e.Elem()) + a.slice.Elem().Set(slice) + return nil +} + +func (a *accumulator) Get() interface{} { + return a.slice.Interface() +} + +func (a *accumulator) IsCumulative() bool { + return true +} + +func (b *boolValue) IsBoolFlag() bool { return true } + +// -- time.Duration Value +type durationValue time.Duration + +func newDurationValue(p *time.Duration) *durationValue { + return (*durationValue)(p) +} + +func (d *durationValue) Set(s string) error { + v, err := time.ParseDuration(s) + *d = durationValue(v) + return err +} + +func (d *durationValue) Get() interface{} { return time.Duration(*d) } + +func (d *durationValue) String() string { return (*time.Duration)(d).String() } + +// -- map[string]string Value +type stringMapValue map[string]string + +func newStringMapValue(p *map[string]string) *stringMapValue { + return (*stringMapValue)(p) +} + +var stringMapRegex = regexp.MustCompile("[:=]") + +func (s *stringMapValue) Set(value string) error { + parts := stringMapRegex.Split(value, 2) + if len(parts) != 2 { + return fmt.Errorf("expected KEY=VALUE got '%s'", value) + } + (*s)[parts[0]] = parts[1] + return nil +} + +func (s *stringMapValue) Get() interface{} { + return (map[string]string)(*s) +} + +func (s *stringMapValue) String() string { + return fmt.Sprintf("%s", map[string]string(*s)) +} + +func (s *stringMapValue) IsCumulative() bool { + return true +} + +// -- net.IP Value +type ipValue net.IP + +func newIPValue(p *net.IP) *ipValue { + return (*ipValue)(p) +} + +func (i *ipValue) Set(value string) error { + if ip := net.ParseIP(value); ip == nil { + return fmt.Errorf("'%s' is not an IP address", value) + } else { + *i = *(*ipValue)(&ip) + return nil + } +} + +func (i *ipValue) Get() interface{} { + return (net.IP)(*i) +} + +func (i *ipValue) String() string { + return (*net.IP)(i).String() +} + +// -- *net.TCPAddr Value +type tcpAddrValue struct { + addr **net.TCPAddr +} + +func newTCPAddrValue(p **net.TCPAddr) *tcpAddrValue { + return &tcpAddrValue{p} +} + +func (i *tcpAddrValue) Set(value string) error { + if addr, err := net.ResolveTCPAddr("tcp", value); err != nil { + return fmt.Errorf("'%s' is not a valid TCP address: %s", value, err) + } else { + *i.addr = addr + return nil + } +} + +func (t *tcpAddrValue) Get() interface{} { + return (*net.TCPAddr)(*t.addr) +} + +func (i *tcpAddrValue) String() string { + return (*i.addr).String() +} + +// -- existingFile Value + +type fileStatValue struct { + path *string + predicate func(os.FileInfo) error +} + +func newFileStatValue(p *string, predicate func(os.FileInfo) error) *fileStatValue { + return &fileStatValue{ + path: p, + predicate: predicate, + } +} + +func (e *fileStatValue) Set(value string) error { + if s, err := os.Stat(value); os.IsNotExist(err) { + return fmt.Errorf("path '%s' does not exist", value) + } else if err != nil { + return err + } else if err := e.predicate(s); err != nil { + return err + } + *e.path = value + return nil +} + +func (f *fileStatValue) Get() interface{} { + return (string)(*f.path) +} + +func (e *fileStatValue) String() string { + return *e.path +} + +// -- os.File value + +type fileValue struct { + f **os.File + flag int + perm os.FileMode +} + +func newFileValue(p **os.File, flag int, perm os.FileMode) *fileValue { + return &fileValue{p, flag, perm} +} + +func (f *fileValue) Set(value string) error { + if fd, err := os.OpenFile(value, f.flag, f.perm); err != nil { + return err + } else { + *f.f = fd + return nil + } +} + +func (f *fileValue) Get() interface{} { + return (*os.File)(*f.f) +} + +func (f *fileValue) String() string { + if *f.f == nil { + return "" + } + return (*f.f).Name() +} + +// -- url.URL Value +type urlValue struct { + u **url.URL +} + +func newURLValue(p **url.URL) *urlValue { + return &urlValue{p} +} + +func (u *urlValue) Set(value string) error { + if url, err := url.Parse(value); err != nil { + return fmt.Errorf("invalid URL: %s", err) + } else { + *u.u = url + return nil + } +} + +func (u *urlValue) Get() interface{} { + return (*url.URL)(*u.u) +} + +func (u *urlValue) String() string { + if *u.u == nil { + return "" + } + return (*u.u).String() +} + +// -- []*url.URL Value +type urlListValue []*url.URL + +func newURLListValue(p *[]*url.URL) *urlListValue { + return (*urlListValue)(p) +} + +func (u *urlListValue) Set(value string) error { + if url, err := url.Parse(value); err != nil { + return fmt.Errorf("invalid URL: %s", err) + } else { + *u = append(*u, url) + return nil + } +} + +func (u *urlListValue) Get() interface{} { + return ([]*url.URL)(*u) +} + +func (u *urlListValue) String() string { + out := []string{} + for _, url := range *u { + out = append(out, url.String()) + } + return strings.Join(out, ",") +} + +func (u *urlListValue) IsCumulative() bool { + return true +} + +// A flag whose value must be in a set of options. +type enumValue struct { + value *string + options []string +} + +func newEnumFlag(target *string, options ...string) *enumValue { + return &enumValue{ + value: target, + options: options, + } +} + +func (a *enumValue) String() string { + return *a.value +} + +func (a *enumValue) Set(value string) error { + for _, v := range a.options { + if v == value { + *a.value = value + return nil + } + } + return fmt.Errorf("enum value must be one of %s, got '%s'", strings.Join(a.options, ","), value) +} + +func (e *enumValue) Get() interface{} { + return (string)(*e.value) +} + +// -- []string Enum Value +type enumsValue struct { + value *[]string + options []string +} + +func newEnumsFlag(target *[]string, options ...string) *enumsValue { + return &enumsValue{ + value: target, + options: options, + } +} + +func (s *enumsValue) Set(value string) error { + for _, v := range s.options { + if v == value { + *s.value = append(*s.value, value) + return nil + } + } + return fmt.Errorf("enum value must be one of %s, got '%s'", strings.Join(s.options, ","), value) +} + +func (e *enumsValue) Get() interface{} { + return ([]string)(*e.value) +} + +func (s *enumsValue) String() string { + return strings.Join(*s.value, ",") +} + +func (s *enumsValue) IsCumulative() bool { + return true +} + +// -- units.Base2Bytes Value +type bytesValue units.Base2Bytes + +func newBytesValue(p *units.Base2Bytes) *bytesValue { + return (*bytesValue)(p) +} + +func (d *bytesValue) Set(s string) error { + v, err := units.ParseBase2Bytes(s) + *d = bytesValue(v) + return err +} + +func (d *bytesValue) Get() interface{} { return units.Base2Bytes(*d) } + +func (d *bytesValue) String() string { return (*units.Base2Bytes)(d).String() } + +func newExistingFileValue(target *string) *fileStatValue { + return newFileStatValue(target, func(s os.FileInfo) error { + if s.IsDir() { + return fmt.Errorf("'%s' is a directory", s.Name()) + } + return nil + }) +} + +func newExistingDirValue(target *string) *fileStatValue { + return newFileStatValue(target, func(s os.FileInfo) error { + if !s.IsDir() { + return fmt.Errorf("'%s' is a file", s.Name()) + } + return nil + }) +} + +func newExistingFileOrDirValue(target *string) *fileStatValue { + return newFileStatValue(target, func(s os.FileInfo) error { return nil }) +} + +type counterValue int + +func newCounterValue(n *int) *counterValue { + return (*counterValue)(n) +} + +func (c *counterValue) Set(s string) error { + *c++ + return nil +} + +func (c *counterValue) Get() interface{} { return (int)(*c) } +func (c *counterValue) IsBoolFlag() bool { return true } +func (c *counterValue) String() string { return fmt.Sprintf("%d", *c) } +func (c *counterValue) IsCumulative() bool { return true } + +func resolveHost(value string) (net.IP, error) { + if ip := net.ParseIP(value); ip != nil { + return ip, nil + } else { + if addr, err := net.ResolveIPAddr("ip", value); err != nil { + return nil, err + } else { + return addr.IP, nil + } + } +} diff --git a/api/vendor/gopkg.in/alecthomas/kingpin.v2/values.json b/api/vendor/gopkg.in/alecthomas/kingpin.v2/values.json new file mode 100644 index 0000000..23c6744 --- /dev/null +++ b/api/vendor/gopkg.in/alecthomas/kingpin.v2/values.json @@ -0,0 +1,25 @@ +[ + {"type": "bool", "parser": "strconv.ParseBool(s)"}, + {"type": "string", "parser": "s, error(nil)", "format": "string(*f.v)", "plural": "Strings"}, + {"type": "uint", "parser": "strconv.ParseUint(s, 0, 64)", "plural": "Uints"}, + {"type": "uint8", "parser": "strconv.ParseUint(s, 0, 8)"}, + {"type": "uint16", "parser": "strconv.ParseUint(s, 0, 16)"}, + {"type": "uint32", "parser": "strconv.ParseUint(s, 0, 32)"}, + {"type": "uint64", "parser": "strconv.ParseUint(s, 0, 64)"}, + {"type": "int", "parser": "strconv.ParseFloat(s, 64)", "plural": "Ints"}, + {"type": "int8", "parser": "strconv.ParseInt(s, 0, 8)"}, + {"type": "int16", "parser": "strconv.ParseInt(s, 0, 16)"}, + {"type": "int32", "parser": "strconv.ParseInt(s, 0, 32)"}, + {"type": "int64", "parser": "strconv.ParseInt(s, 0, 64)"}, + {"type": "float64", "parser": "strconv.ParseFloat(s, 64)"}, + {"type": "float32", "parser": "strconv.ParseFloat(s, 32)"}, + {"name": "Duration", "type": "time.Duration", "no_value_parser": true}, + {"name": "IP", "type": "net.IP", "no_value_parser": true}, + {"name": "TCPAddr", "Type": "*net.TCPAddr", "plural": "TCPList", "no_value_parser": true}, + {"name": "ExistingFile", "Type": "string", "plural": "ExistingFiles", "no_value_parser": true}, + {"name": "ExistingDir", "Type": "string", "plural": "ExistingDirs", "no_value_parser": true}, + {"name": "ExistingFileOrDir", "Type": "string", "plural": "ExistingFilesOrDirs", "no_value_parser": true}, + {"name": "Regexp", "Type": "*regexp.Regexp", "parser": "regexp.Compile(s)"}, + {"name": "ResolvedIP", "Type": "net.IP", "parser": "resolveHost(s)", "help": "Resolve a hostname or IP to an IP."}, + {"name": "HexBytes", "Type": "[]byte", "parser": "hex.DecodeString(s)", "help": "Bytes as a hex string."} +] diff --git a/api/vendor/gopkg.in/alecthomas/kingpin.v2/values_generated.go b/api/vendor/gopkg.in/alecthomas/kingpin.v2/values_generated.go new file mode 100644 index 0000000..8d492bf --- /dev/null +++ b/api/vendor/gopkg.in/alecthomas/kingpin.v2/values_generated.go @@ -0,0 +1,821 @@ +package kingpin + +import ( + "encoding/hex" + "fmt" + "net" + "regexp" + "strconv" + "time" +) + +// This file is autogenerated by "go generate .". Do not modify. + +// -- bool Value +type boolValue struct{ v *bool } + +func newBoolValue(p *bool) *boolValue { + return &boolValue{p} +} + +func (f *boolValue) Set(s string) error { + v, err := strconv.ParseBool(s) + if err == nil { + *f.v = (bool)(v) + } + return err +} + +func (f *boolValue) Get() interface{} { return (bool)(*f.v) } + +func (f *boolValue) String() string { return fmt.Sprintf("%v", *f.v) } + +// Bool parses the next command-line value as bool. +func (p *parserMixin) Bool() (target *bool) { + target = new(bool) + p.BoolVar(target) + return +} + +func (p *parserMixin) BoolVar(target *bool) { + p.SetValue(newBoolValue(target)) +} + +// BoolList accumulates bool values into a slice. +func (p *parserMixin) BoolList() (target *[]bool) { + target = new([]bool) + p.BoolListVar(target) + return +} + +func (p *parserMixin) BoolListVar(target *[]bool) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newBoolValue(v.(*bool)) + })) +} + +// -- string Value +type stringValue struct{ v *string } + +func newStringValue(p *string) *stringValue { + return &stringValue{p} +} + +func (f *stringValue) Set(s string) error { + v, err := s, error(nil) + if err == nil { + *f.v = (string)(v) + } + return err +} + +func (f *stringValue) Get() interface{} { return (string)(*f.v) } + +func (f *stringValue) String() string { return string(*f.v) } + +// String parses the next command-line value as string. +func (p *parserMixin) String() (target *string) { + target = new(string) + p.StringVar(target) + return +} + +func (p *parserMixin) StringVar(target *string) { + p.SetValue(newStringValue(target)) +} + +// Strings accumulates string values into a slice. +func (p *parserMixin) Strings() (target *[]string) { + target = new([]string) + p.StringsVar(target) + return +} + +func (p *parserMixin) StringsVar(target *[]string) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newStringValue(v.(*string)) + })) +} + +// -- uint Value +type uintValue struct{ v *uint } + +func newUintValue(p *uint) *uintValue { + return &uintValue{p} +} + +func (f *uintValue) Set(s string) error { + v, err := strconv.ParseUint(s, 0, 64) + if err == nil { + *f.v = (uint)(v) + } + return err +} + +func (f *uintValue) Get() interface{} { return (uint)(*f.v) } + +func (f *uintValue) String() string { return fmt.Sprintf("%v", *f.v) } + +// Uint parses the next command-line value as uint. +func (p *parserMixin) Uint() (target *uint) { + target = new(uint) + p.UintVar(target) + return +} + +func (p *parserMixin) UintVar(target *uint) { + p.SetValue(newUintValue(target)) +} + +// Uints accumulates uint values into a slice. +func (p *parserMixin) Uints() (target *[]uint) { + target = new([]uint) + p.UintsVar(target) + return +} + +func (p *parserMixin) UintsVar(target *[]uint) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newUintValue(v.(*uint)) + })) +} + +// -- uint8 Value +type uint8Value struct{ v *uint8 } + +func newUint8Value(p *uint8) *uint8Value { + return &uint8Value{p} +} + +func (f *uint8Value) Set(s string) error { + v, err := strconv.ParseUint(s, 0, 8) + if err == nil { + *f.v = (uint8)(v) + } + return err +} + +func (f *uint8Value) Get() interface{} { return (uint8)(*f.v) } + +func (f *uint8Value) String() string { return fmt.Sprintf("%v", *f.v) } + +// Uint8 parses the next command-line value as uint8. +func (p *parserMixin) Uint8() (target *uint8) { + target = new(uint8) + p.Uint8Var(target) + return +} + +func (p *parserMixin) Uint8Var(target *uint8) { + p.SetValue(newUint8Value(target)) +} + +// Uint8List accumulates uint8 values into a slice. +func (p *parserMixin) Uint8List() (target *[]uint8) { + target = new([]uint8) + p.Uint8ListVar(target) + return +} + +func (p *parserMixin) Uint8ListVar(target *[]uint8) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newUint8Value(v.(*uint8)) + })) +} + +// -- uint16 Value +type uint16Value struct{ v *uint16 } + +func newUint16Value(p *uint16) *uint16Value { + return &uint16Value{p} +} + +func (f *uint16Value) Set(s string) error { + v, err := strconv.ParseUint(s, 0, 16) + if err == nil { + *f.v = (uint16)(v) + } + return err +} + +func (f *uint16Value) Get() interface{} { return (uint16)(*f.v) } + +func (f *uint16Value) String() string { return fmt.Sprintf("%v", *f.v) } + +// Uint16 parses the next command-line value as uint16. +func (p *parserMixin) Uint16() (target *uint16) { + target = new(uint16) + p.Uint16Var(target) + return +} + +func (p *parserMixin) Uint16Var(target *uint16) { + p.SetValue(newUint16Value(target)) +} + +// Uint16List accumulates uint16 values into a slice. +func (p *parserMixin) Uint16List() (target *[]uint16) { + target = new([]uint16) + p.Uint16ListVar(target) + return +} + +func (p *parserMixin) Uint16ListVar(target *[]uint16) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newUint16Value(v.(*uint16)) + })) +} + +// -- uint32 Value +type uint32Value struct{ v *uint32 } + +func newUint32Value(p *uint32) *uint32Value { + return &uint32Value{p} +} + +func (f *uint32Value) Set(s string) error { + v, err := strconv.ParseUint(s, 0, 32) + if err == nil { + *f.v = (uint32)(v) + } + return err +} + +func (f *uint32Value) Get() interface{} { return (uint32)(*f.v) } + +func (f *uint32Value) String() string { return fmt.Sprintf("%v", *f.v) } + +// Uint32 parses the next command-line value as uint32. +func (p *parserMixin) Uint32() (target *uint32) { + target = new(uint32) + p.Uint32Var(target) + return +} + +func (p *parserMixin) Uint32Var(target *uint32) { + p.SetValue(newUint32Value(target)) +} + +// Uint32List accumulates uint32 values into a slice. +func (p *parserMixin) Uint32List() (target *[]uint32) { + target = new([]uint32) + p.Uint32ListVar(target) + return +} + +func (p *parserMixin) Uint32ListVar(target *[]uint32) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newUint32Value(v.(*uint32)) + })) +} + +// -- uint64 Value +type uint64Value struct{ v *uint64 } + +func newUint64Value(p *uint64) *uint64Value { + return &uint64Value{p} +} + +func (f *uint64Value) Set(s string) error { + v, err := strconv.ParseUint(s, 0, 64) + if err == nil { + *f.v = (uint64)(v) + } + return err +} + +func (f *uint64Value) Get() interface{} { return (uint64)(*f.v) } + +func (f *uint64Value) String() string { return fmt.Sprintf("%v", *f.v) } + +// Uint64 parses the next command-line value as uint64. +func (p *parserMixin) Uint64() (target *uint64) { + target = new(uint64) + p.Uint64Var(target) + return +} + +func (p *parserMixin) Uint64Var(target *uint64) { + p.SetValue(newUint64Value(target)) +} + +// Uint64List accumulates uint64 values into a slice. +func (p *parserMixin) Uint64List() (target *[]uint64) { + target = new([]uint64) + p.Uint64ListVar(target) + return +} + +func (p *parserMixin) Uint64ListVar(target *[]uint64) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newUint64Value(v.(*uint64)) + })) +} + +// -- int Value +type intValue struct{ v *int } + +func newIntValue(p *int) *intValue { + return &intValue{p} +} + +func (f *intValue) Set(s string) error { + v, err := strconv.ParseFloat(s, 64) + if err == nil { + *f.v = (int)(v) + } + return err +} + +func (f *intValue) Get() interface{} { return (int)(*f.v) } + +func (f *intValue) String() string { return fmt.Sprintf("%v", *f.v) } + +// Int parses the next command-line value as int. +func (p *parserMixin) Int() (target *int) { + target = new(int) + p.IntVar(target) + return +} + +func (p *parserMixin) IntVar(target *int) { + p.SetValue(newIntValue(target)) +} + +// Ints accumulates int values into a slice. +func (p *parserMixin) Ints() (target *[]int) { + target = new([]int) + p.IntsVar(target) + return +} + +func (p *parserMixin) IntsVar(target *[]int) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newIntValue(v.(*int)) + })) +} + +// -- int8 Value +type int8Value struct{ v *int8 } + +func newInt8Value(p *int8) *int8Value { + return &int8Value{p} +} + +func (f *int8Value) Set(s string) error { + v, err := strconv.ParseInt(s, 0, 8) + if err == nil { + *f.v = (int8)(v) + } + return err +} + +func (f *int8Value) Get() interface{} { return (int8)(*f.v) } + +func (f *int8Value) String() string { return fmt.Sprintf("%v", *f.v) } + +// Int8 parses the next command-line value as int8. +func (p *parserMixin) Int8() (target *int8) { + target = new(int8) + p.Int8Var(target) + return +} + +func (p *parserMixin) Int8Var(target *int8) { + p.SetValue(newInt8Value(target)) +} + +// Int8List accumulates int8 values into a slice. +func (p *parserMixin) Int8List() (target *[]int8) { + target = new([]int8) + p.Int8ListVar(target) + return +} + +func (p *parserMixin) Int8ListVar(target *[]int8) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newInt8Value(v.(*int8)) + })) +} + +// -- int16 Value +type int16Value struct{ v *int16 } + +func newInt16Value(p *int16) *int16Value { + return &int16Value{p} +} + +func (f *int16Value) Set(s string) error { + v, err := strconv.ParseInt(s, 0, 16) + if err == nil { + *f.v = (int16)(v) + } + return err +} + +func (f *int16Value) Get() interface{} { return (int16)(*f.v) } + +func (f *int16Value) String() string { return fmt.Sprintf("%v", *f.v) } + +// Int16 parses the next command-line value as int16. +func (p *parserMixin) Int16() (target *int16) { + target = new(int16) + p.Int16Var(target) + return +} + +func (p *parserMixin) Int16Var(target *int16) { + p.SetValue(newInt16Value(target)) +} + +// Int16List accumulates int16 values into a slice. +func (p *parserMixin) Int16List() (target *[]int16) { + target = new([]int16) + p.Int16ListVar(target) + return +} + +func (p *parserMixin) Int16ListVar(target *[]int16) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newInt16Value(v.(*int16)) + })) +} + +// -- int32 Value +type int32Value struct{ v *int32 } + +func newInt32Value(p *int32) *int32Value { + return &int32Value{p} +} + +func (f *int32Value) Set(s string) error { + v, err := strconv.ParseInt(s, 0, 32) + if err == nil { + *f.v = (int32)(v) + } + return err +} + +func (f *int32Value) Get() interface{} { return (int32)(*f.v) } + +func (f *int32Value) String() string { return fmt.Sprintf("%v", *f.v) } + +// Int32 parses the next command-line value as int32. +func (p *parserMixin) Int32() (target *int32) { + target = new(int32) + p.Int32Var(target) + return +} + +func (p *parserMixin) Int32Var(target *int32) { + p.SetValue(newInt32Value(target)) +} + +// Int32List accumulates int32 values into a slice. +func (p *parserMixin) Int32List() (target *[]int32) { + target = new([]int32) + p.Int32ListVar(target) + return +} + +func (p *parserMixin) Int32ListVar(target *[]int32) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newInt32Value(v.(*int32)) + })) +} + +// -- int64 Value +type int64Value struct{ v *int64 } + +func newInt64Value(p *int64) *int64Value { + return &int64Value{p} +} + +func (f *int64Value) Set(s string) error { + v, err := strconv.ParseInt(s, 0, 64) + if err == nil { + *f.v = (int64)(v) + } + return err +} + +func (f *int64Value) Get() interface{} { return (int64)(*f.v) } + +func (f *int64Value) String() string { return fmt.Sprintf("%v", *f.v) } + +// Int64 parses the next command-line value as int64. +func (p *parserMixin) Int64() (target *int64) { + target = new(int64) + p.Int64Var(target) + return +} + +func (p *parserMixin) Int64Var(target *int64) { + p.SetValue(newInt64Value(target)) +} + +// Int64List accumulates int64 values into a slice. +func (p *parserMixin) Int64List() (target *[]int64) { + target = new([]int64) + p.Int64ListVar(target) + return +} + +func (p *parserMixin) Int64ListVar(target *[]int64) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newInt64Value(v.(*int64)) + })) +} + +// -- float64 Value +type float64Value struct{ v *float64 } + +func newFloat64Value(p *float64) *float64Value { + return &float64Value{p} +} + +func (f *float64Value) Set(s string) error { + v, err := strconv.ParseFloat(s, 64) + if err == nil { + *f.v = (float64)(v) + } + return err +} + +func (f *float64Value) Get() interface{} { return (float64)(*f.v) } + +func (f *float64Value) String() string { return fmt.Sprintf("%v", *f.v) } + +// Float64 parses the next command-line value as float64. +func (p *parserMixin) Float64() (target *float64) { + target = new(float64) + p.Float64Var(target) + return +} + +func (p *parserMixin) Float64Var(target *float64) { + p.SetValue(newFloat64Value(target)) +} + +// Float64List accumulates float64 values into a slice. +func (p *parserMixin) Float64List() (target *[]float64) { + target = new([]float64) + p.Float64ListVar(target) + return +} + +func (p *parserMixin) Float64ListVar(target *[]float64) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newFloat64Value(v.(*float64)) + })) +} + +// -- float32 Value +type float32Value struct{ v *float32 } + +func newFloat32Value(p *float32) *float32Value { + return &float32Value{p} +} + +func (f *float32Value) Set(s string) error { + v, err := strconv.ParseFloat(s, 32) + if err == nil { + *f.v = (float32)(v) + } + return err +} + +func (f *float32Value) Get() interface{} { return (float32)(*f.v) } + +func (f *float32Value) String() string { return fmt.Sprintf("%v", *f.v) } + +// Float32 parses the next command-line value as float32. +func (p *parserMixin) Float32() (target *float32) { + target = new(float32) + p.Float32Var(target) + return +} + +func (p *parserMixin) Float32Var(target *float32) { + p.SetValue(newFloat32Value(target)) +} + +// Float32List accumulates float32 values into a slice. +func (p *parserMixin) Float32List() (target *[]float32) { + target = new([]float32) + p.Float32ListVar(target) + return +} + +func (p *parserMixin) Float32ListVar(target *[]float32) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newFloat32Value(v.(*float32)) + })) +} + +// DurationList accumulates time.Duration values into a slice. +func (p *parserMixin) DurationList() (target *[]time.Duration) { + target = new([]time.Duration) + p.DurationListVar(target) + return +} + +func (p *parserMixin) DurationListVar(target *[]time.Duration) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newDurationValue(v.(*time.Duration)) + })) +} + +// IPList accumulates net.IP values into a slice. +func (p *parserMixin) IPList() (target *[]net.IP) { + target = new([]net.IP) + p.IPListVar(target) + return +} + +func (p *parserMixin) IPListVar(target *[]net.IP) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newIPValue(v.(*net.IP)) + })) +} + +// TCPList accumulates *net.TCPAddr values into a slice. +func (p *parserMixin) TCPList() (target *[]*net.TCPAddr) { + target = new([]*net.TCPAddr) + p.TCPListVar(target) + return +} + +func (p *parserMixin) TCPListVar(target *[]*net.TCPAddr) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newTCPAddrValue(v.(**net.TCPAddr)) + })) +} + +// ExistingFiles accumulates string values into a slice. +func (p *parserMixin) ExistingFiles() (target *[]string) { + target = new([]string) + p.ExistingFilesVar(target) + return +} + +func (p *parserMixin) ExistingFilesVar(target *[]string) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newExistingFileValue(v.(*string)) + })) +} + +// ExistingDirs accumulates string values into a slice. +func (p *parserMixin) ExistingDirs() (target *[]string) { + target = new([]string) + p.ExistingDirsVar(target) + return +} + +func (p *parserMixin) ExistingDirsVar(target *[]string) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newExistingDirValue(v.(*string)) + })) +} + +// ExistingFilesOrDirs accumulates string values into a slice. +func (p *parserMixin) ExistingFilesOrDirs() (target *[]string) { + target = new([]string) + p.ExistingFilesOrDirsVar(target) + return +} + +func (p *parserMixin) ExistingFilesOrDirsVar(target *[]string) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newExistingFileOrDirValue(v.(*string)) + })) +} + +// -- *regexp.Regexp Value +type regexpValue struct{ v **regexp.Regexp } + +func newRegexpValue(p **regexp.Regexp) *regexpValue { + return ®expValue{p} +} + +func (f *regexpValue) Set(s string) error { + v, err := regexp.Compile(s) + if err == nil { + *f.v = (*regexp.Regexp)(v) + } + return err +} + +func (f *regexpValue) Get() interface{} { return (*regexp.Regexp)(*f.v) } + +func (f *regexpValue) String() string { return fmt.Sprintf("%v", *f.v) } + +// Regexp parses the next command-line value as *regexp.Regexp. +func (p *parserMixin) Regexp() (target **regexp.Regexp) { + target = new(*regexp.Regexp) + p.RegexpVar(target) + return +} + +func (p *parserMixin) RegexpVar(target **regexp.Regexp) { + p.SetValue(newRegexpValue(target)) +} + +// RegexpList accumulates *regexp.Regexp values into a slice. +func (p *parserMixin) RegexpList() (target *[]*regexp.Regexp) { + target = new([]*regexp.Regexp) + p.RegexpListVar(target) + return +} + +func (p *parserMixin) RegexpListVar(target *[]*regexp.Regexp) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newRegexpValue(v.(**regexp.Regexp)) + })) +} + +// -- net.IP Value +type resolvedIPValue struct{ v *net.IP } + +func newResolvedIPValue(p *net.IP) *resolvedIPValue { + return &resolvedIPValue{p} +} + +func (f *resolvedIPValue) Set(s string) error { + v, err := resolveHost(s) + if err == nil { + *f.v = (net.IP)(v) + } + return err +} + +func (f *resolvedIPValue) Get() interface{} { return (net.IP)(*f.v) } + +func (f *resolvedIPValue) String() string { return fmt.Sprintf("%v", *f.v) } + +// Resolve a hostname or IP to an IP. +func (p *parserMixin) ResolvedIP() (target *net.IP) { + target = new(net.IP) + p.ResolvedIPVar(target) + return +} + +func (p *parserMixin) ResolvedIPVar(target *net.IP) { + p.SetValue(newResolvedIPValue(target)) +} + +// ResolvedIPList accumulates net.IP values into a slice. +func (p *parserMixin) ResolvedIPList() (target *[]net.IP) { + target = new([]net.IP) + p.ResolvedIPListVar(target) + return +} + +func (p *parserMixin) ResolvedIPListVar(target *[]net.IP) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newResolvedIPValue(v.(*net.IP)) + })) +} + +// -- []byte Value +type hexBytesValue struct{ v *[]byte } + +func newHexBytesValue(p *[]byte) *hexBytesValue { + return &hexBytesValue{p} +} + +func (f *hexBytesValue) Set(s string) error { + v, err := hex.DecodeString(s) + if err == nil { + *f.v = ([]byte)(v) + } + return err +} + +func (f *hexBytesValue) Get() interface{} { return ([]byte)(*f.v) } + +func (f *hexBytesValue) String() string { return fmt.Sprintf("%v", *f.v) } + +// Bytes as a hex string. +func (p *parserMixin) HexBytes() (target *[]byte) { + target = new([]byte) + p.HexBytesVar(target) + return +} + +func (p *parserMixin) HexBytesVar(target *[]byte) { + p.SetValue(newHexBytesValue(target)) +} + +// HexBytesList accumulates []byte values into a slice. +func (p *parserMixin) HexBytesList() (target *[][]byte) { + target = new([][]byte) + p.HexBytesListVar(target) + return +} + +func (p *parserMixin) HexBytesListVar(target *[][]byte) { + p.SetValue(newAccumulator(target, func(v interface{}) Value { + return newHexBytesValue(v.(*[]byte)) + })) +} diff --git a/api/vendor/gopkg.in/alecthomas/kingpin.v2/values_test.go b/api/vendor/gopkg.in/alecthomas/kingpin.v2/values_test.go new file mode 100644 index 0000000..e16ee2a --- /dev/null +++ b/api/vendor/gopkg.in/alecthomas/kingpin.v2/values_test.go @@ -0,0 +1,98 @@ +package kingpin + +import ( + "net" + + "github.com/stretchr/testify/assert" + + "testing" +) + +func TestAccumulatorStrings(t *testing.T) { + target := []string{} + acc := newAccumulator(&target, func(v interface{}) Value { return newStringValue(v.(*string)) }) + acc.Set("a") + assert.Equal(t, []string{"a"}, target) + acc.Set("b") + assert.Equal(t, []string{"a", "b"}, target) +} + +func TestStrings(t *testing.T) { + app := New("", "") + app.Arg("a", "").Required().String() + app.Arg("b", "").Required().String() + c := app.Arg("c", "").Required().Strings() + app.Parse([]string{"a", "b", "a", "b"}) + assert.Equal(t, []string{"a", "b"}, *c) +} + +func TestEnum(t *testing.T) { + app := New("", "") + a := app.Arg("a", "").Enum("one", "two", "three") + _, err := app.Parse([]string{"moo"}) + assert.Error(t, err) + _, err = app.Parse([]string{"one"}) + assert.NoError(t, err) + assert.Equal(t, "one", *a) +} + +func TestEnumVar(t *testing.T) { + app := New("", "") + var a string + app.Arg("a", "").EnumVar(&a, "one", "two", "three") + _, err := app.Parse([]string{"moo"}) + assert.Error(t, err) + _, err = app.Parse([]string{"one"}) + assert.NoError(t, err) + assert.Equal(t, "one", a) +} + +func TestCounter(t *testing.T) { + app := New("", "") + c := app.Flag("f", "").Counter() + _, err := app.Parse([]string{"--f", "--f", "--f"}) + assert.NoError(t, err) + assert.Equal(t, 3, *c) +} + +func TestIPv4Addr(t *testing.T) { + app := newTestApp() + flag := app.Flag("addr", "").ResolvedIP() + _, err := app.Parse([]string{"--addr", net.IPv4(1, 2, 3, 4).String()}) + assert.NoError(t, err) + assert.NotNil(t, *flag) + assert.Equal(t, net.IPv4(1, 2, 3, 4), *flag) +} + +func TestInvalidIPv4Addr(t *testing.T) { + app := newTestApp() + app.Flag("addr", "").ResolvedIP() + _, err := app.Parse([]string{"--addr", "1.2.3.256"}) + assert.Error(t, err) +} + +func TestIPv6Addr(t *testing.T) { + app := newTestApp() + flag := app.Flag("addr", "").ResolvedIP() + _, err := app.Parse([]string{"--addr", net.IPv6interfacelocalallnodes.String()}) + assert.NoError(t, err) + assert.NotNil(t, *flag) + assert.Equal(t, net.IPv6interfacelocalallnodes, *flag) +} + +func TestHexBytes(t *testing.T) { + app := newTestApp() + actual := app.Arg("bytes", "").HexBytes() + _, err := app.Parse([]string{"01020aff"}) + assert.NoError(t, err) + assert.Equal(t, []byte{0x01, 0x02, 0x0a, 0xff}, *actual) +} + +func TestSetValueDoesNotReset(t *testing.T) { + app := newTestApp() + mapping := map[string]string{ + "key": "value", + } + app.Flag("set", "").StringMapVar(&mapping) + assert.NotEmpty(t, mapping) +} diff --git a/api/vendor/gopkg.in/fsnotify.v1/.editorconfig b/api/vendor/gopkg.in/fsnotify.v1/.editorconfig new file mode 100644 index 0000000..ba49e3c --- /dev/null +++ b/api/vendor/gopkg.in/fsnotify.v1/.editorconfig @@ -0,0 +1,5 @@ +root = true + +[*] +indent_style = tab +indent_size = 4 diff --git a/api/vendor/gopkg.in/fsnotify.v1/.github/ISSUE_TEMPLATE.md b/api/vendor/gopkg.in/fsnotify.v1/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..4ad1aed --- /dev/null +++ b/api/vendor/gopkg.in/fsnotify.v1/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,11 @@ +Before reporting an issue, please ensure you are using the latest release of fsnotify. + +### Which operating system (GOOS) and version are you using? + +Linux: lsb_release -a +macOS: sw_vers +Windows: systeminfo | findstr /B /C:OS + +### Please describe the issue that occurred. + +### Are you able to reproduce the issue? Please provide steps to reproduce and a code sample if possible. diff --git a/api/vendor/gopkg.in/fsnotify.v1/.github/PULL_REQUEST_TEMPLATE.md b/api/vendor/gopkg.in/fsnotify.v1/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..64ddf7c --- /dev/null +++ b/api/vendor/gopkg.in/fsnotify.v1/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,8 @@ +#### What does this pull request do? + + +#### Where should the reviewer start? + + +#### How should this be manually tested? + diff --git a/api/vendor/gopkg.in/fsnotify.v1/.gitignore b/api/vendor/gopkg.in/fsnotify.v1/.gitignore new file mode 100644 index 0000000..4cd0cba --- /dev/null +++ b/api/vendor/gopkg.in/fsnotify.v1/.gitignore @@ -0,0 +1,6 @@ +# Setup a Global .gitignore for OS and editor generated files: +# https://help.github.com/articles/ignoring-files +# git config --global core.excludesfile ~/.gitignore_global + +.vagrant +*.sublime-project diff --git a/api/vendor/gopkg.in/fsnotify.v1/.travis.yml b/api/vendor/gopkg.in/fsnotify.v1/.travis.yml new file mode 100644 index 0000000..981d1bb --- /dev/null +++ b/api/vendor/gopkg.in/fsnotify.v1/.travis.yml @@ -0,0 +1,30 @@ +sudo: false +language: go + +go: + - 1.8.x + - 1.9.x + - tip + +matrix: + allow_failures: + - go: tip + fast_finish: true + +before_script: + - go get -u github.com/golang/lint/golint + +script: + - go test -v --race ./... + +after_script: + - test -z "$(gofmt -s -l -w . | tee /dev/stderr)" + - test -z "$(golint ./... | tee /dev/stderr)" + - go vet ./... + +os: + - linux + - osx + +notifications: + email: false diff --git a/api/vendor/gopkg.in/fsnotify.v1/AUTHORS b/api/vendor/gopkg.in/fsnotify.v1/AUTHORS new file mode 100644 index 0000000..5ab5d41 --- /dev/null +++ b/api/vendor/gopkg.in/fsnotify.v1/AUTHORS @@ -0,0 +1,52 @@ +# Names should be added to this file as +# Name or Organization +# The email address is not required for organizations. + +# You can update this list using the following command: +# +# $ git shortlog -se | awk '{print $2 " " $3 " " $4}' + +# Please keep the list sorted. + +Aaron L +Adrien Bustany +Amit Krishnan +Anmol Sethi +Bjørn Erik Pedersen +Bruno Bigras +Caleb Spare +Case Nelson +Chris Howey +Christoffer Buchholz +Daniel Wagner-Hall +Dave Cheney +Evan Phoenix +Francisco Souza +Hari haran +John C Barstow +Kelvin Fo +Ken-ichirou MATSUZAWA +Matt Layher +Nathan Youngman +Nickolai Zeldovich +Patrick +Paul Hammond +Pawel Knap +Pieter Droogendijk +Pursuit92 +Riku Voipio +Rob Figueiredo +Rodrigo Chiossi +Slawek Ligus +Soge Zhang +Tiffany Jernigan +Tilak Sharma +Tom Payne +Travis Cline +Tudor Golubenco +Vahe Khachikyan +Yukang +bronze1man +debrando +henrikedwards +铁哥 diff --git a/api/vendor/gopkg.in/fsnotify.v1/CHANGELOG.md b/api/vendor/gopkg.in/fsnotify.v1/CHANGELOG.md new file mode 100644 index 0000000..be4d7ea --- /dev/null +++ b/api/vendor/gopkg.in/fsnotify.v1/CHANGELOG.md @@ -0,0 +1,317 @@ +# Changelog + +## v1.4.7 / 2018-01-09 + +* BSD/macOS: Fix possible deadlock on closing the watcher on kqueue (thanks @nhooyr and @glycerine) +* Tests: Fix missing verb on format string (thanks @rchiossi) +* Linux: Fix deadlock in Remove (thanks @aarondl) +* Linux: Watch.Add improvements (avoid race, fix consistency, reduce garbage) (thanks @twpayne) +* Docs: Moved FAQ into the README (thanks @vahe) +* Linux: Properly handle inotify's IN_Q_OVERFLOW event (thanks @zeldovich) +* Docs: replace references to OS X with macOS + +## v1.4.2 / 2016-10-10 + +* Linux: use InotifyInit1 with IN_CLOEXEC to stop leaking a file descriptor to a child process when using fork/exec [#178](https://github.com/fsnotify/fsnotify/pull/178) (thanks @pattyshack) + +## v1.4.1 / 2016-10-04 + +* Fix flaky inotify stress test on Linux [#177](https://github.com/fsnotify/fsnotify/pull/177) (thanks @pattyshack) + +## v1.4.0 / 2016-10-01 + +* add a String() method to Event.Op [#165](https://github.com/fsnotify/fsnotify/pull/165) (thanks @oozie) + +## v1.3.1 / 2016-06-28 + +* Windows: fix for double backslash when watching the root of a drive [#151](https://github.com/fsnotify/fsnotify/issues/151) (thanks @brunoqc) + +## v1.3.0 / 2016-04-19 + +* Support linux/arm64 by [patching](https://go-review.googlesource.com/#/c/21971/) x/sys/unix and switching to to it from syscall (thanks @suihkulokki) [#135](https://github.com/fsnotify/fsnotify/pull/135) + +## v1.2.10 / 2016-03-02 + +* Fix golint errors in windows.go [#121](https://github.com/fsnotify/fsnotify/pull/121) (thanks @tiffanyfj) + +## v1.2.9 / 2016-01-13 + +kqueue: Fix logic for CREATE after REMOVE [#111](https://github.com/fsnotify/fsnotify/pull/111) (thanks @bep) + +## v1.2.8 / 2015-12-17 + +* kqueue: fix race condition in Close [#105](https://github.com/fsnotify/fsnotify/pull/105) (thanks @djui for reporting the issue and @ppknap for writing a failing test) +* inotify: fix race in test +* enable race detection for continuous integration (Linux, Mac, Windows) + +## v1.2.5 / 2015-10-17 + +* inotify: use epoll_create1 for arm64 support (requires Linux 2.6.27 or later) [#100](https://github.com/fsnotify/fsnotify/pull/100) (thanks @suihkulokki) +* inotify: fix path leaks [#73](https://github.com/fsnotify/fsnotify/pull/73) (thanks @chamaken) +* kqueue: watch for rename events on subdirectories [#83](https://github.com/fsnotify/fsnotify/pull/83) (thanks @guotie) +* kqueue: avoid infinite loops from symlinks cycles [#101](https://github.com/fsnotify/fsnotify/pull/101) (thanks @illicitonion) + +## v1.2.1 / 2015-10-14 + +* kqueue: don't watch named pipes [#98](https://github.com/fsnotify/fsnotify/pull/98) (thanks @evanphx) + +## v1.2.0 / 2015-02-08 + +* inotify: use epoll to wake up readEvents [#66](https://github.com/fsnotify/fsnotify/pull/66) (thanks @PieterD) +* inotify: closing watcher should now always shut down goroutine [#63](https://github.com/fsnotify/fsnotify/pull/63) (thanks @PieterD) +* kqueue: close kqueue after removing watches, fixes [#59](https://github.com/fsnotify/fsnotify/issues/59) + +## v1.1.1 / 2015-02-05 + +* inotify: Retry read on EINTR [#61](https://github.com/fsnotify/fsnotify/issues/61) (thanks @PieterD) + +## v1.1.0 / 2014-12-12 + +* kqueue: rework internals [#43](https://github.com/fsnotify/fsnotify/pull/43) + * add low-level functions + * only need to store flags on directories + * less mutexes [#13](https://github.com/fsnotify/fsnotify/issues/13) + * done can be an unbuffered channel + * remove calls to os.NewSyscallError +* More efficient string concatenation for Event.String() [#52](https://github.com/fsnotify/fsnotify/pull/52) (thanks @mdlayher) +* kqueue: fix regression in rework causing subdirectories to be watched [#48](https://github.com/fsnotify/fsnotify/issues/48) +* kqueue: cleanup internal watch before sending remove event [#51](https://github.com/fsnotify/fsnotify/issues/51) + +## v1.0.4 / 2014-09-07 + +* kqueue: add dragonfly to the build tags. +* Rename source code files, rearrange code so exported APIs are at the top. +* Add done channel to example code. [#37](https://github.com/fsnotify/fsnotify/pull/37) (thanks @chenyukang) + +## v1.0.3 / 2014-08-19 + +* [Fix] Windows MOVED_TO now translates to Create like on BSD and Linux. [#36](https://github.com/fsnotify/fsnotify/issues/36) + +## v1.0.2 / 2014-08-17 + +* [Fix] Missing create events on macOS. [#14](https://github.com/fsnotify/fsnotify/issues/14) (thanks @zhsso) +* [Fix] Make ./path and path equivalent. (thanks @zhsso) + +## v1.0.0 / 2014-08-15 + +* [API] Remove AddWatch on Windows, use Add. +* Improve documentation for exported identifiers. [#30](https://github.com/fsnotify/fsnotify/issues/30) +* Minor updates based on feedback from golint. + +## dev / 2014-07-09 + +* Moved to [github.com/fsnotify/fsnotify](https://github.com/fsnotify/fsnotify). +* Use os.NewSyscallError instead of returning errno (thanks @hariharan-uno) + +## dev / 2014-07-04 + +* kqueue: fix incorrect mutex used in Close() +* Update example to demonstrate usage of Op. + +## dev / 2014-06-28 + +* [API] Don't set the Write Op for attribute notifications [#4](https://github.com/fsnotify/fsnotify/issues/4) +* Fix for String() method on Event (thanks Alex Brainman) +* Don't build on Plan 9 or Solaris (thanks @4ad) + +## dev / 2014-06-21 + +* Events channel of type Event rather than *Event. +* [internal] use syscall constants directly for inotify and kqueue. +* [internal] kqueue: rename events to kevents and fileEvent to event. + +## dev / 2014-06-19 + +* Go 1.3+ required on Windows (uses syscall.ERROR_MORE_DATA internally). +* [internal] remove cookie from Event struct (unused). +* [internal] Event struct has the same definition across every OS. +* [internal] remove internal watch and removeWatch methods. + +## dev / 2014-06-12 + +* [API] Renamed Watch() to Add() and RemoveWatch() to Remove(). +* [API] Pluralized channel names: Events and Errors. +* [API] Renamed FileEvent struct to Event. +* [API] Op constants replace methods like IsCreate(). + +## dev / 2014-06-12 + +* Fix data race on kevent buffer (thanks @tilaks) [#98](https://github.com/howeyc/fsnotify/pull/98) + +## dev / 2014-05-23 + +* [API] Remove current implementation of WatchFlags. + * current implementation doesn't take advantage of OS for efficiency + * provides little benefit over filtering events as they are received, but has extra bookkeeping and mutexes + * no tests for the current implementation + * not fully implemented on Windows [#93](https://github.com/howeyc/fsnotify/issues/93#issuecomment-39285195) + +## v0.9.3 / 2014-12-31 + +* kqueue: cleanup internal watch before sending remove event [#51](https://github.com/fsnotify/fsnotify/issues/51) + +## v0.9.2 / 2014-08-17 + +* [Backport] Fix missing create events on macOS. [#14](https://github.com/fsnotify/fsnotify/issues/14) (thanks @zhsso) + +## v0.9.1 / 2014-06-12 + +* Fix data race on kevent buffer (thanks @tilaks) [#98](https://github.com/howeyc/fsnotify/pull/98) + +## v0.9.0 / 2014-01-17 + +* IsAttrib() for events that only concern a file's metadata [#79][] (thanks @abustany) +* [Fix] kqueue: fix deadlock [#77][] (thanks @cespare) +* [NOTICE] Development has moved to `code.google.com/p/go.exp/fsnotify` in preparation for inclusion in the Go standard library. + +## v0.8.12 / 2013-11-13 + +* [API] Remove FD_SET and friends from Linux adapter + +## v0.8.11 / 2013-11-02 + +* [Doc] Add Changelog [#72][] (thanks @nathany) +* [Doc] Spotlight and double modify events on macOS [#62][] (reported by @paulhammond) + +## v0.8.10 / 2013-10-19 + +* [Fix] kqueue: remove file watches when parent directory is removed [#71][] (reported by @mdwhatcott) +* [Fix] kqueue: race between Close and readEvents [#70][] (reported by @bernerdschaefer) +* [Doc] specify OS-specific limits in README (thanks @debrando) + +## v0.8.9 / 2013-09-08 + +* [Doc] Contributing (thanks @nathany) +* [Doc] update package path in example code [#63][] (thanks @paulhammond) +* [Doc] GoCI badge in README (Linux only) [#60][] +* [Doc] Cross-platform testing with Vagrant [#59][] (thanks @nathany) + +## v0.8.8 / 2013-06-17 + +* [Fix] Windows: handle `ERROR_MORE_DATA` on Windows [#49][] (thanks @jbowtie) + +## v0.8.7 / 2013-06-03 + +* [API] Make syscall flags internal +* [Fix] inotify: ignore event changes +* [Fix] race in symlink test [#45][] (reported by @srid) +* [Fix] tests on Windows +* lower case error messages + +## v0.8.6 / 2013-05-23 + +* kqueue: Use EVT_ONLY flag on Darwin +* [Doc] Update README with full example + +## v0.8.5 / 2013-05-09 + +* [Fix] inotify: allow monitoring of "broken" symlinks (thanks @tsg) + +## v0.8.4 / 2013-04-07 + +* [Fix] kqueue: watch all file events [#40][] (thanks @ChrisBuchholz) + +## v0.8.3 / 2013-03-13 + +* [Fix] inoitfy/kqueue memory leak [#36][] (reported by @nbkolchin) +* [Fix] kqueue: use fsnFlags for watching a directory [#33][] (reported by @nbkolchin) + +## v0.8.2 / 2013-02-07 + +* [Doc] add Authors +* [Fix] fix data races for map access [#29][] (thanks @fsouza) + +## v0.8.1 / 2013-01-09 + +* [Fix] Windows path separators +* [Doc] BSD License + +## v0.8.0 / 2012-11-09 + +* kqueue: directory watching improvements (thanks @vmirage) +* inotify: add `IN_MOVED_TO` [#25][] (requested by @cpisto) +* [Fix] kqueue: deleting watched directory [#24][] (reported by @jakerr) + +## v0.7.4 / 2012-10-09 + +* [Fix] inotify: fixes from https://codereview.appspot.com/5418045/ (ugorji) +* [Fix] kqueue: preserve watch flags when watching for delete [#21][] (reported by @robfig) +* [Fix] kqueue: watch the directory even if it isn't a new watch (thanks @robfig) +* [Fix] kqueue: modify after recreation of file + +## v0.7.3 / 2012-09-27 + +* [Fix] kqueue: watch with an existing folder inside the watched folder (thanks @vmirage) +* [Fix] kqueue: no longer get duplicate CREATE events + +## v0.7.2 / 2012-09-01 + +* kqueue: events for created directories + +## v0.7.1 / 2012-07-14 + +* [Fix] for renaming files + +## v0.7.0 / 2012-07-02 + +* [Feature] FSNotify flags +* [Fix] inotify: Added file name back to event path + +## v0.6.0 / 2012-06-06 + +* kqueue: watch files after directory created (thanks @tmc) + +## v0.5.1 / 2012-05-22 + +* [Fix] inotify: remove all watches before Close() + +## v0.5.0 / 2012-05-03 + +* [API] kqueue: return errors during watch instead of sending over channel +* kqueue: match symlink behavior on Linux +* inotify: add `DELETE_SELF` (requested by @taralx) +* [Fix] kqueue: handle EINTR (reported by @robfig) +* [Doc] Godoc example [#1][] (thanks @davecheney) + +## v0.4.0 / 2012-03-30 + +* Go 1 released: build with go tool +* [Feature] Windows support using winfsnotify +* Windows does not have attribute change notifications +* Roll attribute notifications into IsModify + +## v0.3.0 / 2012-02-19 + +* kqueue: add files when watch directory + +## v0.2.0 / 2011-12-30 + +* update to latest Go weekly code + +## v0.1.0 / 2011-10-19 + +* kqueue: add watch on file creation to match inotify +* kqueue: create file event +* inotify: ignore `IN_IGNORED` events +* event String() +* linux: common FileEvent functions +* initial commit + +[#79]: https://github.com/howeyc/fsnotify/pull/79 +[#77]: https://github.com/howeyc/fsnotify/pull/77 +[#72]: https://github.com/howeyc/fsnotify/issues/72 +[#71]: https://github.com/howeyc/fsnotify/issues/71 +[#70]: https://github.com/howeyc/fsnotify/issues/70 +[#63]: https://github.com/howeyc/fsnotify/issues/63 +[#62]: https://github.com/howeyc/fsnotify/issues/62 +[#60]: https://github.com/howeyc/fsnotify/issues/60 +[#59]: https://github.com/howeyc/fsnotify/issues/59 +[#49]: https://github.com/howeyc/fsnotify/issues/49 +[#45]: https://github.com/howeyc/fsnotify/issues/45 +[#40]: https://github.com/howeyc/fsnotify/issues/40 +[#36]: https://github.com/howeyc/fsnotify/issues/36 +[#33]: https://github.com/howeyc/fsnotify/issues/33 +[#29]: https://github.com/howeyc/fsnotify/issues/29 +[#25]: https://github.com/howeyc/fsnotify/issues/25 +[#24]: https://github.com/howeyc/fsnotify/issues/24 +[#21]: https://github.com/howeyc/fsnotify/issues/21 diff --git a/api/vendor/gopkg.in/fsnotify.v1/CONTRIBUTING.md b/api/vendor/gopkg.in/fsnotify.v1/CONTRIBUTING.md new file mode 100644 index 0000000..828a60b --- /dev/null +++ b/api/vendor/gopkg.in/fsnotify.v1/CONTRIBUTING.md @@ -0,0 +1,77 @@ +# Contributing + +## Issues + +* Request features and report bugs using the [GitHub Issue Tracker](https://github.com/fsnotify/fsnotify/issues). +* Please indicate the platform you are using fsnotify on. +* A code example to reproduce the problem is appreciated. + +## Pull Requests + +### Contributor License Agreement + +fsnotify is derived from code in the [golang.org/x/exp](https://godoc.org/golang.org/x/exp) package and it may be included [in the standard library](https://github.com/fsnotify/fsnotify/issues/1) in the future. Therefore fsnotify carries the same [LICENSE](https://github.com/fsnotify/fsnotify/blob/master/LICENSE) as Go. Contributors retain their copyright, so you need to fill out a short form before we can accept your contribution: [Google Individual Contributor License Agreement](https://developers.google.com/open-source/cla/individual). + +Please indicate that you have signed the CLA in your pull request. + +### How fsnotify is Developed + +* Development is done on feature branches. +* Tests are run on BSD, Linux, macOS and Windows. +* Pull requests are reviewed and [applied to master][am] using [hub][]. + * Maintainers may modify or squash commits rather than asking contributors to. +* To issue a new release, the maintainers will: + * Update the CHANGELOG + * Tag a version, which will become available through gopkg.in. + +### How to Fork + +For smooth sailing, always use the original import path. Installing with `go get` makes this easy. + +1. Install from GitHub (`go get -u github.com/fsnotify/fsnotify`) +2. Create your feature branch (`git checkout -b my-new-feature`) +3. Ensure everything works and the tests pass (see below) +4. Commit your changes (`git commit -am 'Add some feature'`) + +Contribute upstream: + +1. Fork fsnotify on GitHub +2. Add your remote (`git remote add fork git@github.com:mycompany/repo.git`) +3. Push to the branch (`git push fork my-new-feature`) +4. Create a new Pull Request on GitHub + +This workflow is [thoroughly explained by Katrina Owen](https://splice.com/blog/contributing-open-source-git-repositories-go/). + +### Testing + +fsnotify uses build tags to compile different code on Linux, BSD, macOS, and Windows. + +Before doing a pull request, please do your best to test your changes on multiple platforms, and list which platforms you were able/unable to test on. + +To aid in cross-platform testing there is a Vagrantfile for Linux and BSD. + +* Install [Vagrant](http://www.vagrantup.com/) and [VirtualBox](https://www.virtualbox.org/) +* Setup [Vagrant Gopher](https://github.com/nathany/vagrant-gopher) in your `src` folder. +* Run `vagrant up` from the project folder. You can also setup just one box with `vagrant up linux` or `vagrant up bsd` (note: the BSD box doesn't support Windows hosts at this time, and NFS may prompt for your host OS password) +* Once setup, you can run the test suite on a given OS with a single command `vagrant ssh linux -c 'cd fsnotify/fsnotify; go test'`. +* When you're done, you will want to halt or destroy the Vagrant boxes. + +Notice: fsnotify file system events won't trigger in shared folders. The tests get around this limitation by using the /tmp directory. + +Right now there is no equivalent solution for Windows and macOS, but there are Windows VMs [freely available from Microsoft](http://www.modern.ie/en-us/virtualization-tools#downloads). + +### Maintainers + +Help maintaining fsnotify is welcome. To be a maintainer: + +* Submit a pull request and sign the CLA as above. +* You must be able to run the test suite on Mac, Windows, Linux and BSD. + +To keep master clean, the fsnotify project uses the "apply mail" workflow outlined in Nathaniel Talbott's post ["Merge pull request" Considered Harmful][am]. This requires installing [hub][]. + +All code changes should be internal pull requests. + +Releases are tagged using [Semantic Versioning](http://semver.org/). + +[hub]: https://github.com/github/hub +[am]: http://blog.spreedly.com/2014/06/24/merge-pull-request-considered-harmful/#.VGa5yZPF_Zs diff --git a/api/vendor/gopkg.in/fsnotify.v1/LICENSE b/api/vendor/gopkg.in/fsnotify.v1/LICENSE new file mode 100644 index 0000000..f21e540 --- /dev/null +++ b/api/vendor/gopkg.in/fsnotify.v1/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2012 The Go Authors. All rights reserved. +Copyright (c) 2012 fsnotify 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/api/vendor/gopkg.in/fsnotify.v1/README.md b/api/vendor/gopkg.in/fsnotify.v1/README.md new file mode 100644 index 0000000..3993207 --- /dev/null +++ b/api/vendor/gopkg.in/fsnotify.v1/README.md @@ -0,0 +1,79 @@ +# File system notifications for Go + +[![GoDoc](https://godoc.org/github.com/fsnotify/fsnotify?status.svg)](https://godoc.org/github.com/fsnotify/fsnotify) [![Go Report Card](https://goreportcard.com/badge/github.com/fsnotify/fsnotify)](https://goreportcard.com/report/github.com/fsnotify/fsnotify) + +fsnotify utilizes [golang.org/x/sys](https://godoc.org/golang.org/x/sys) rather than `syscall` from the standard library. Ensure you have the latest version installed by running: + +```console +go get -u golang.org/x/sys/... +``` + +Cross platform: Windows, Linux, BSD and macOS. + +|Adapter |OS |Status | +|----------|----------|----------| +|inotify |Linux 2.6.27 or later, Android\*|Supported [![Build Status](https://travis-ci.org/fsnotify/fsnotify.svg?branch=master)](https://travis-ci.org/fsnotify/fsnotify)| +|kqueue |BSD, macOS, iOS\*|Supported [![Build Status](https://travis-ci.org/fsnotify/fsnotify.svg?branch=master)](https://travis-ci.org/fsnotify/fsnotify)| +|ReadDirectoryChangesW|Windows|Supported [![Build status](https://ci.appveyor.com/api/projects/status/ivwjubaih4r0udeh/branch/master?svg=true)](https://ci.appveyor.com/project/NathanYoungman/fsnotify/branch/master)| +|FSEvents |macOS |[Planned](https://github.com/fsnotify/fsnotify/issues/11)| +|FEN |Solaris 11 |[In Progress](https://github.com/fsnotify/fsnotify/issues/12)| +|fanotify |Linux 2.6.37+ | | +|USN Journals |Windows |[Maybe](https://github.com/fsnotify/fsnotify/issues/53)| +|Polling |*All* |[Maybe](https://github.com/fsnotify/fsnotify/issues/9)| + +\* Android and iOS are untested. + +Please see [the documentation](https://godoc.org/github.com/fsnotify/fsnotify) and consult the [FAQ](#faq) for usage information. + +## API stability + +fsnotify is a fork of [howeyc/fsnotify](https://godoc.org/github.com/howeyc/fsnotify) with a new API as of v1.0. The API is based on [this design document](http://goo.gl/MrYxyA). + +All [releases](https://github.com/fsnotify/fsnotify/releases) are tagged based on [Semantic Versioning](http://semver.org/). Further API changes are [planned](https://github.com/fsnotify/fsnotify/milestones), and will be tagged with a new major revision number. + +Go 1.6 supports dependencies located in the `vendor/` folder. Unless you are creating a library, it is recommended that you copy fsnotify into `vendor/github.com/fsnotify/fsnotify` within your project, and likewise for `golang.org/x/sys`. + +## Contributing + +Please refer to [CONTRIBUTING][] before opening an issue or pull request. + +## Example + +See [example_test.go](https://github.com/fsnotify/fsnotify/blob/master/example_test.go). + +## FAQ + +**When a file is moved to another directory is it still being watched?** + +No (it shouldn't be, unless you are watching where it was moved to). + +**When I watch a directory, are all subdirectories watched as well?** + +No, you must add watches for any directory you want to watch (a recursive watcher is on the roadmap [#18][]). + +**Do I have to watch the Error and Event channels in a separate goroutine?** + +As of now, yes. Looking into making this single-thread friendly (see [howeyc #7][#7]) + +**Why am I receiving multiple events for the same file on OS X?** + +Spotlight indexing on OS X can result in multiple events (see [howeyc #62][#62]). A temporary workaround is to add your folder(s) to the *Spotlight Privacy settings* until we have a native FSEvents implementation (see [#11][]). + +**How many files can be watched at once?** + +There are OS-specific limits as to how many watches can be created: +* Linux: /proc/sys/fs/inotify/max_user_watches contains the limit, reaching this limit results in a "no space left on device" error. +* BSD / OSX: sysctl variables "kern.maxfiles" and "kern.maxfilesperproc", reaching these limits results in a "too many open files" error. + +[#62]: https://github.com/howeyc/fsnotify/issues/62 +[#18]: https://github.com/fsnotify/fsnotify/issues/18 +[#11]: https://github.com/fsnotify/fsnotify/issues/11 +[#7]: https://github.com/howeyc/fsnotify/issues/7 + +[contributing]: https://github.com/fsnotify/fsnotify/blob/master/CONTRIBUTING.md + +## Related Projects + +* [notify](https://github.com/rjeczalik/notify) +* [fsevents](https://github.com/fsnotify/fsevents) + diff --git a/api/vendor/gopkg.in/fsnotify.v1/example_test.go b/api/vendor/gopkg.in/fsnotify.v1/example_test.go new file mode 100644 index 0000000..700502c --- /dev/null +++ b/api/vendor/gopkg.in/fsnotify.v1/example_test.go @@ -0,0 +1,42 @@ +// 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. + +// +build !plan9 + +package fsnotify_test + +import ( + "log" + + "github.com/fsnotify/fsnotify" +) + +func ExampleNewWatcher() { + watcher, err := fsnotify.NewWatcher() + if err != nil { + log.Fatal(err) + } + defer watcher.Close() + + done := make(chan bool) + go func() { + for { + select { + case event := <-watcher.Events: + log.Println("event:", event) + if event.Op&fsnotify.Write == fsnotify.Write { + log.Println("modified file:", event.Name) + } + case err := <-watcher.Errors: + log.Println("error:", err) + } + } + }() + + err = watcher.Add("/tmp/foo") + if err != nil { + log.Fatal(err) + } + <-done +} diff --git a/api/vendor/gopkg.in/fsnotify.v1/fen.go b/api/vendor/gopkg.in/fsnotify.v1/fen.go new file mode 100644 index 0000000..ced39cb --- /dev/null +++ b/api/vendor/gopkg.in/fsnotify.v1/fen.go @@ -0,0 +1,37 @@ +// 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. + +// +build solaris + +package fsnotify + +import ( + "errors" +) + +// Watcher watches a set of files, delivering events to a channel. +type Watcher struct { + Events chan Event + Errors chan error +} + +// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events. +func NewWatcher() (*Watcher, error) { + return nil, errors.New("FEN based watcher not yet supported for fsnotify\n") +} + +// Close removes all watches and closes the events channel. +func (w *Watcher) Close() error { + return nil +} + +// Add starts watching the named file or directory (non-recursively). +func (w *Watcher) Add(name string) error { + return nil +} + +// Remove stops watching the the named file or directory (non-recursively). +func (w *Watcher) Remove(name string) error { + return nil +} diff --git a/api/vendor/gopkg.in/fsnotify.v1/fsnotify.go b/api/vendor/gopkg.in/fsnotify.v1/fsnotify.go new file mode 100644 index 0000000..190bf0d --- /dev/null +++ b/api/vendor/gopkg.in/fsnotify.v1/fsnotify.go @@ -0,0 +1,66 @@ +// 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. + +// +build !plan9 + +// Package fsnotify provides a platform-independent interface for file system notifications. +package fsnotify + +import ( + "bytes" + "errors" + "fmt" +) + +// Event represents a single file system notification. +type Event struct { + Name string // Relative path to the file or directory. + Op Op // File operation that triggered the event. +} + +// Op describes a set of file operations. +type Op uint32 + +// These are the generalized file operations that can trigger a notification. +const ( + Create Op = 1 << iota + Write + Remove + Rename + Chmod +) + +func (op Op) String() string { + // Use a buffer for efficient string concatenation + var buffer bytes.Buffer + + if op&Create == Create { + buffer.WriteString("|CREATE") + } + if op&Remove == Remove { + buffer.WriteString("|REMOVE") + } + if op&Write == Write { + buffer.WriteString("|WRITE") + } + if op&Rename == Rename { + buffer.WriteString("|RENAME") + } + if op&Chmod == Chmod { + buffer.WriteString("|CHMOD") + } + if buffer.Len() == 0 { + return "" + } + return buffer.String()[1:] // Strip leading pipe +} + +// String returns a string representation of the event in the form +// "file: REMOVE|WRITE|..." +func (e Event) String() string { + return fmt.Sprintf("%q: %s", e.Name, e.Op.String()) +} + +// Common errors that can be reported by a watcher +var ErrEventOverflow = errors.New("fsnotify queue overflow") diff --git a/api/vendor/gopkg.in/fsnotify.v1/fsnotify_test.go b/api/vendor/gopkg.in/fsnotify.v1/fsnotify_test.go new file mode 100644 index 0000000..f9771d9 --- /dev/null +++ b/api/vendor/gopkg.in/fsnotify.v1/fsnotify_test.go @@ -0,0 +1,70 @@ +// 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. + +// +build !plan9 + +package fsnotify + +import ( + "os" + "testing" + "time" +) + +func TestEventStringWithValue(t *testing.T) { + for opMask, expectedString := range map[Op]string{ + Chmod | Create: `"/usr/someFile": CREATE|CHMOD`, + Rename: `"/usr/someFile": RENAME`, + Remove: `"/usr/someFile": REMOVE`, + Write | Chmod: `"/usr/someFile": WRITE|CHMOD`, + } { + event := Event{Name: "/usr/someFile", Op: opMask} + if event.String() != expectedString { + t.Fatalf("Expected %s, got: %v", expectedString, event.String()) + } + + } +} + +func TestEventOpStringWithValue(t *testing.T) { + expectedOpString := "WRITE|CHMOD" + event := Event{Name: "someFile", Op: Write | Chmod} + if event.Op.String() != expectedOpString { + t.Fatalf("Expected %s, got: %v", expectedOpString, event.Op.String()) + } +} + +func TestEventOpStringWithNoValue(t *testing.T) { + expectedOpString := "" + event := Event{Name: "testFile", Op: 0} + if event.Op.String() != expectedOpString { + t.Fatalf("Expected %s, got: %v", expectedOpString, event.Op.String()) + } +} + +// TestWatcherClose tests that the goroutine started by creating the watcher can be +// signalled to return at any time, even if there is no goroutine listening on the events +// or errors channels. +func TestWatcherClose(t *testing.T) { + t.Parallel() + + name := tempMkFile(t, "") + w := newWatcher(t) + err := w.Add(name) + if err != nil { + t.Fatal(err) + } + + err = os.Remove(name) + if err != nil { + t.Fatal(err) + } + // Allow the watcher to receive the event. + time.Sleep(time.Millisecond * 100) + + err = w.Close() + if err != nil { + t.Fatal(err) + } +} diff --git a/api/vendor/gopkg.in/fsnotify.v1/inotify.go b/api/vendor/gopkg.in/fsnotify.v1/inotify.go new file mode 100644 index 0000000..d9fd1b8 --- /dev/null +++ b/api/vendor/gopkg.in/fsnotify.v1/inotify.go @@ -0,0 +1,337 @@ +// 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. + +// +build linux + +package fsnotify + +import ( + "errors" + "fmt" + "io" + "os" + "path/filepath" + "strings" + "sync" + "unsafe" + + "golang.org/x/sys/unix" +) + +// Watcher watches a set of files, delivering events to a channel. +type Watcher struct { + Events chan Event + Errors chan error + mu sync.Mutex // Map access + fd int + poller *fdPoller + watches map[string]*watch // Map of inotify watches (key: path) + paths map[int]string // Map of watched paths (key: watch descriptor) + done chan struct{} // Channel for sending a "quit message" to the reader goroutine + doneResp chan struct{} // Channel to respond to Close +} + +// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events. +func NewWatcher() (*Watcher, error) { + // Create inotify fd + fd, errno := unix.InotifyInit1(unix.IN_CLOEXEC) + if fd == -1 { + return nil, errno + } + // Create epoll + poller, err := newFdPoller(fd) + if err != nil { + unix.Close(fd) + return nil, err + } + w := &Watcher{ + fd: fd, + poller: poller, + watches: make(map[string]*watch), + paths: make(map[int]string), + Events: make(chan Event), + Errors: make(chan error), + done: make(chan struct{}), + doneResp: make(chan struct{}), + } + + go w.readEvents() + return w, nil +} + +func (w *Watcher) isClosed() bool { + select { + case <-w.done: + return true + default: + return false + } +} + +// Close removes all watches and closes the events channel. +func (w *Watcher) Close() error { + if w.isClosed() { + return nil + } + + // Send 'close' signal to goroutine, and set the Watcher to closed. + close(w.done) + + // Wake up goroutine + w.poller.wake() + + // Wait for goroutine to close + <-w.doneResp + + return nil +} + +// Add starts watching the named file or directory (non-recursively). +func (w *Watcher) Add(name string) error { + name = filepath.Clean(name) + if w.isClosed() { + return errors.New("inotify instance already closed") + } + + const agnosticEvents = unix.IN_MOVED_TO | unix.IN_MOVED_FROM | + unix.IN_CREATE | unix.IN_ATTRIB | unix.IN_MODIFY | + unix.IN_MOVE_SELF | unix.IN_DELETE | unix.IN_DELETE_SELF + + var flags uint32 = agnosticEvents + + w.mu.Lock() + defer w.mu.Unlock() + watchEntry := w.watches[name] + if watchEntry != nil { + flags |= watchEntry.flags | unix.IN_MASK_ADD + } + wd, errno := unix.InotifyAddWatch(w.fd, name, flags) + if wd == -1 { + return errno + } + + if watchEntry == nil { + w.watches[name] = &watch{wd: uint32(wd), flags: flags} + w.paths[wd] = name + } else { + watchEntry.wd = uint32(wd) + watchEntry.flags = flags + } + + return nil +} + +// Remove stops watching the named file or directory (non-recursively). +func (w *Watcher) Remove(name string) error { + name = filepath.Clean(name) + + // Fetch the watch. + w.mu.Lock() + defer w.mu.Unlock() + watch, ok := w.watches[name] + + // Remove it from inotify. + if !ok { + return fmt.Errorf("can't remove non-existent inotify watch for: %s", name) + } + + // We successfully removed the watch if InotifyRmWatch doesn't return an + // error, we need to clean up our internal state to ensure it matches + // inotify's kernel state. + delete(w.paths, int(watch.wd)) + delete(w.watches, name) + + // inotify_rm_watch will return EINVAL if the file has been deleted; + // the inotify will already have been removed. + // watches and pathes are deleted in ignoreLinux() implicitly and asynchronously + // by calling inotify_rm_watch() below. e.g. readEvents() goroutine receives IN_IGNORE + // so that EINVAL means that the wd is being rm_watch()ed or its file removed + // by another thread and we have not received IN_IGNORE event. + success, errno := unix.InotifyRmWatch(w.fd, watch.wd) + if success == -1 { + // TODO: Perhaps it's not helpful to return an error here in every case. + // the only two possible errors are: + // EBADF, which happens when w.fd is not a valid file descriptor of any kind. + // EINVAL, which is when fd is not an inotify descriptor or wd is not a valid watch descriptor. + // Watch descriptors are invalidated when they are removed explicitly or implicitly; + // explicitly by inotify_rm_watch, implicitly when the file they are watching is deleted. + return errno + } + + return nil +} + +type watch struct { + wd uint32 // Watch descriptor (as returned by the inotify_add_watch() syscall) + flags uint32 // inotify flags of this watch (see inotify(7) for the list of valid flags) +} + +// readEvents reads from the inotify file descriptor, converts the +// received events into Event objects and sends them via the Events channel +func (w *Watcher) readEvents() { + var ( + buf [unix.SizeofInotifyEvent * 4096]byte // Buffer for a maximum of 4096 raw events + n int // Number of bytes read with read() + errno error // Syscall errno + ok bool // For poller.wait + ) + + defer close(w.doneResp) + defer close(w.Errors) + defer close(w.Events) + defer unix.Close(w.fd) + defer w.poller.close() + + for { + // See if we have been closed. + if w.isClosed() { + return + } + + ok, errno = w.poller.wait() + if errno != nil { + select { + case w.Errors <- errno: + case <-w.done: + return + } + continue + } + + if !ok { + continue + } + + n, errno = unix.Read(w.fd, buf[:]) + // If a signal interrupted execution, see if we've been asked to close, and try again. + // http://man7.org/linux/man-pages/man7/signal.7.html : + // "Before Linux 3.8, reads from an inotify(7) file descriptor were not restartable" + if errno == unix.EINTR { + continue + } + + // unix.Read might have been woken up by Close. If so, we're done. + if w.isClosed() { + return + } + + if n < unix.SizeofInotifyEvent { + var err error + if n == 0 { + // If EOF is received. This should really never happen. + err = io.EOF + } else if n < 0 { + // If an error occurred while reading. + err = errno + } else { + // Read was too short. + err = errors.New("notify: short read in readEvents()") + } + select { + case w.Errors <- err: + case <-w.done: + return + } + continue + } + + var offset uint32 + // We don't know how many events we just read into the buffer + // While the offset points to at least one whole event... + for offset <= uint32(n-unix.SizeofInotifyEvent) { + // Point "raw" to the event in the buffer + raw := (*unix.InotifyEvent)(unsafe.Pointer(&buf[offset])) + + mask := uint32(raw.Mask) + nameLen := uint32(raw.Len) + + if mask&unix.IN_Q_OVERFLOW != 0 { + select { + case w.Errors <- ErrEventOverflow: + case <-w.done: + return + } + } + + // If the event happened to the watched directory or the watched file, the kernel + // doesn't append the filename to the event, but we would like to always fill the + // the "Name" field with a valid filename. We retrieve the path of the watch from + // the "paths" map. + w.mu.Lock() + name, ok := w.paths[int(raw.Wd)] + // IN_DELETE_SELF occurs when the file/directory being watched is removed. + // This is a sign to clean up the maps, otherwise we are no longer in sync + // with the inotify kernel state which has already deleted the watch + // automatically. + if ok && mask&unix.IN_DELETE_SELF == unix.IN_DELETE_SELF { + delete(w.paths, int(raw.Wd)) + delete(w.watches, name) + } + w.mu.Unlock() + + if nameLen > 0 { + // Point "bytes" at the first byte of the filename + bytes := (*[unix.PathMax]byte)(unsafe.Pointer(&buf[offset+unix.SizeofInotifyEvent])) + // The filename is padded with NULL bytes. TrimRight() gets rid of those. + name += "/" + strings.TrimRight(string(bytes[0:nameLen]), "\000") + } + + event := newEvent(name, mask) + + // Send the events that are not ignored on the events channel + if !event.ignoreLinux(mask) { + select { + case w.Events <- event: + case <-w.done: + return + } + } + + // Move to the next event in the buffer + offset += unix.SizeofInotifyEvent + nameLen + } + } +} + +// Certain types of events can be "ignored" and not sent over the Events +// channel. Such as events marked ignore by the kernel, or MODIFY events +// against files that do not exist. +func (e *Event) ignoreLinux(mask uint32) bool { + // Ignore anything the inotify API says to ignore + if mask&unix.IN_IGNORED == unix.IN_IGNORED { + return true + } + + // If the event is not a DELETE or RENAME, the file must exist. + // Otherwise the event is ignored. + // *Note*: this was put in place because it was seen that a MODIFY + // event was sent after the DELETE. This ignores that MODIFY and + // assumes a DELETE will come or has come if the file doesn't exist. + if !(e.Op&Remove == Remove || e.Op&Rename == Rename) { + _, statErr := os.Lstat(e.Name) + return os.IsNotExist(statErr) + } + return false +} + +// newEvent returns an platform-independent Event based on an inotify mask. +func newEvent(name string, mask uint32) Event { + e := Event{Name: name} + if mask&unix.IN_CREATE == unix.IN_CREATE || mask&unix.IN_MOVED_TO == unix.IN_MOVED_TO { + e.Op |= Create + } + if mask&unix.IN_DELETE_SELF == unix.IN_DELETE_SELF || mask&unix.IN_DELETE == unix.IN_DELETE { + e.Op |= Remove + } + if mask&unix.IN_MODIFY == unix.IN_MODIFY { + e.Op |= Write + } + if mask&unix.IN_MOVE_SELF == unix.IN_MOVE_SELF || mask&unix.IN_MOVED_FROM == unix.IN_MOVED_FROM { + e.Op |= Rename + } + if mask&unix.IN_ATTRIB == unix.IN_ATTRIB { + e.Op |= Chmod + } + return e +} diff --git a/api/vendor/gopkg.in/fsnotify.v1/inotify_poller.go b/api/vendor/gopkg.in/fsnotify.v1/inotify_poller.go new file mode 100644 index 0000000..cc7db4b --- /dev/null +++ b/api/vendor/gopkg.in/fsnotify.v1/inotify_poller.go @@ -0,0 +1,187 @@ +// Copyright 2015 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 linux + +package fsnotify + +import ( + "errors" + + "golang.org/x/sys/unix" +) + +type fdPoller struct { + fd int // File descriptor (as returned by the inotify_init() syscall) + epfd int // Epoll file descriptor + pipe [2]int // Pipe for waking up +} + +func emptyPoller(fd int) *fdPoller { + poller := new(fdPoller) + poller.fd = fd + poller.epfd = -1 + poller.pipe[0] = -1 + poller.pipe[1] = -1 + return poller +} + +// Create a new inotify poller. +// This creates an inotify handler, and an epoll handler. +func newFdPoller(fd int) (*fdPoller, error) { + var errno error + poller := emptyPoller(fd) + defer func() { + if errno != nil { + poller.close() + } + }() + poller.fd = fd + + // Create epoll fd + poller.epfd, errno = unix.EpollCreate1(0) + if poller.epfd == -1 { + return nil, errno + } + // Create pipe; pipe[0] is the read end, pipe[1] the write end. + errno = unix.Pipe2(poller.pipe[:], unix.O_NONBLOCK) + if errno != nil { + return nil, errno + } + + // Register inotify fd with epoll + event := unix.EpollEvent{ + Fd: int32(poller.fd), + Events: unix.EPOLLIN, + } + errno = unix.EpollCtl(poller.epfd, unix.EPOLL_CTL_ADD, poller.fd, &event) + if errno != nil { + return nil, errno + } + + // Register pipe fd with epoll + event = unix.EpollEvent{ + Fd: int32(poller.pipe[0]), + Events: unix.EPOLLIN, + } + errno = unix.EpollCtl(poller.epfd, unix.EPOLL_CTL_ADD, poller.pipe[0], &event) + if errno != nil { + return nil, errno + } + + return poller, nil +} + +// Wait using epoll. +// Returns true if something is ready to be read, +// false if there is not. +func (poller *fdPoller) wait() (bool, error) { + // 3 possible events per fd, and 2 fds, makes a maximum of 6 events. + // I don't know whether epoll_wait returns the number of events returned, + // or the total number of events ready. + // I decided to catch both by making the buffer one larger than the maximum. + events := make([]unix.EpollEvent, 7) + for { + n, errno := unix.EpollWait(poller.epfd, events, -1) + if n == -1 { + if errno == unix.EINTR { + continue + } + return false, errno + } + if n == 0 { + // If there are no events, try again. + continue + } + if n > 6 { + // This should never happen. More events were returned than should be possible. + return false, errors.New("epoll_wait returned more events than I know what to do with") + } + ready := events[:n] + epollhup := false + epollerr := false + epollin := false + for _, event := range ready { + if event.Fd == int32(poller.fd) { + if event.Events&unix.EPOLLHUP != 0 { + // This should not happen, but if it does, treat it as a wakeup. + epollhup = true + } + if event.Events&unix.EPOLLERR != 0 { + // If an error is waiting on the file descriptor, we should pretend + // something is ready to read, and let unix.Read pick up the error. + epollerr = true + } + if event.Events&unix.EPOLLIN != 0 { + // There is data to read. + epollin = true + } + } + if event.Fd == int32(poller.pipe[0]) { + if event.Events&unix.EPOLLHUP != 0 { + // Write pipe descriptor was closed, by us. This means we're closing down the + // watcher, and we should wake up. + } + if event.Events&unix.EPOLLERR != 0 { + // If an error is waiting on the pipe file descriptor. + // This is an absolute mystery, and should never ever happen. + return false, errors.New("Error on the pipe descriptor.") + } + if event.Events&unix.EPOLLIN != 0 { + // This is a regular wakeup, so we have to clear the buffer. + err := poller.clearWake() + if err != nil { + return false, err + } + } + } + } + + if epollhup || epollerr || epollin { + return true, nil + } + return false, nil + } +} + +// Close the write end of the poller. +func (poller *fdPoller) wake() error { + buf := make([]byte, 1) + n, errno := unix.Write(poller.pipe[1], buf) + if n == -1 { + if errno == unix.EAGAIN { + // Buffer is full, poller will wake. + return nil + } + return errno + } + return nil +} + +func (poller *fdPoller) clearWake() error { + // You have to be woken up a LOT in order to get to 100! + buf := make([]byte, 100) + n, errno := unix.Read(poller.pipe[0], buf) + if n == -1 { + if errno == unix.EAGAIN { + // Buffer is empty, someone else cleared our wake. + return nil + } + return errno + } + return nil +} + +// Close all poller file descriptors, but not the one passed to it. +func (poller *fdPoller) close() { + if poller.pipe[1] != -1 { + unix.Close(poller.pipe[1]) + } + if poller.pipe[0] != -1 { + unix.Close(poller.pipe[0]) + } + if poller.epfd != -1 { + unix.Close(poller.epfd) + } +} diff --git a/api/vendor/gopkg.in/fsnotify.v1/inotify_poller_test.go b/api/vendor/gopkg.in/fsnotify.v1/inotify_poller_test.go new file mode 100644 index 0000000..26623ef --- /dev/null +++ b/api/vendor/gopkg.in/fsnotify.v1/inotify_poller_test.go @@ -0,0 +1,229 @@ +// Copyright 2015 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 linux + +package fsnotify + +import ( + "testing" + "time" + + "golang.org/x/sys/unix" +) + +type testFd [2]int + +func makeTestFd(t *testing.T) testFd { + var tfd testFd + errno := unix.Pipe(tfd[:]) + if errno != nil { + t.Fatalf("Failed to create pipe: %v", errno) + } + return tfd +} + +func (tfd testFd) fd() int { + return tfd[0] +} + +func (tfd testFd) closeWrite(t *testing.T) { + errno := unix.Close(tfd[1]) + if errno != nil { + t.Fatalf("Failed to close write end of pipe: %v", errno) + } +} + +func (tfd testFd) put(t *testing.T) { + buf := make([]byte, 10) + _, errno := unix.Write(tfd[1], buf) + if errno != nil { + t.Fatalf("Failed to write to pipe: %v", errno) + } +} + +func (tfd testFd) get(t *testing.T) { + buf := make([]byte, 10) + _, errno := unix.Read(tfd[0], buf) + if errno != nil { + t.Fatalf("Failed to read from pipe: %v", errno) + } +} + +func (tfd testFd) close() { + unix.Close(tfd[1]) + unix.Close(tfd[0]) +} + +func makePoller(t *testing.T) (testFd, *fdPoller) { + tfd := makeTestFd(t) + poller, err := newFdPoller(tfd.fd()) + if err != nil { + t.Fatalf("Failed to create poller: %v", err) + } + return tfd, poller +} + +func TestPollerWithBadFd(t *testing.T) { + _, err := newFdPoller(-1) + if err != unix.EBADF { + t.Fatalf("Expected EBADF, got: %v", err) + } +} + +func TestPollerWithData(t *testing.T) { + tfd, poller := makePoller(t) + defer tfd.close() + defer poller.close() + + tfd.put(t) + ok, err := poller.wait() + if err != nil { + t.Fatalf("poller failed: %v", err) + } + if !ok { + t.Fatalf("expected poller to return true") + } + tfd.get(t) +} + +func TestPollerWithWakeup(t *testing.T) { + tfd, poller := makePoller(t) + defer tfd.close() + defer poller.close() + + err := poller.wake() + if err != nil { + t.Fatalf("wake failed: %v", err) + } + ok, err := poller.wait() + if err != nil { + t.Fatalf("poller failed: %v", err) + } + if ok { + t.Fatalf("expected poller to return false") + } +} + +func TestPollerWithClose(t *testing.T) { + tfd, poller := makePoller(t) + defer tfd.close() + defer poller.close() + + tfd.closeWrite(t) + ok, err := poller.wait() + if err != nil { + t.Fatalf("poller failed: %v", err) + } + if !ok { + t.Fatalf("expected poller to return true") + } +} + +func TestPollerWithWakeupAndData(t *testing.T) { + tfd, poller := makePoller(t) + defer tfd.close() + defer poller.close() + + tfd.put(t) + err := poller.wake() + if err != nil { + t.Fatalf("wake failed: %v", err) + } + + // both data and wakeup + ok, err := poller.wait() + if err != nil { + t.Fatalf("poller failed: %v", err) + } + if !ok { + t.Fatalf("expected poller to return true") + } + + // data is still in the buffer, wakeup is cleared + ok, err = poller.wait() + if err != nil { + t.Fatalf("poller failed: %v", err) + } + if !ok { + t.Fatalf("expected poller to return true") + } + + tfd.get(t) + // data is gone, only wakeup now + err = poller.wake() + if err != nil { + t.Fatalf("wake failed: %v", err) + } + ok, err = poller.wait() + if err != nil { + t.Fatalf("poller failed: %v", err) + } + if ok { + t.Fatalf("expected poller to return false") + } +} + +func TestPollerConcurrent(t *testing.T) { + tfd, poller := makePoller(t) + defer tfd.close() + defer poller.close() + + oks := make(chan bool) + live := make(chan bool) + defer close(live) + go func() { + defer close(oks) + for { + ok, err := poller.wait() + if err != nil { + t.Fatalf("poller failed: %v", err) + } + oks <- ok + if !<-live { + return + } + } + }() + + // Try a write + select { + case <-time.After(50 * time.Millisecond): + case <-oks: + t.Fatalf("poller did not wait") + } + tfd.put(t) + if !<-oks { + t.Fatalf("expected true") + } + tfd.get(t) + live <- true + + // Try a wakeup + select { + case <-time.After(50 * time.Millisecond): + case <-oks: + t.Fatalf("poller did not wait") + } + err := poller.wake() + if err != nil { + t.Fatalf("wake failed: %v", err) + } + if <-oks { + t.Fatalf("expected false") + } + live <- true + + // Try a close + select { + case <-time.After(50 * time.Millisecond): + case <-oks: + t.Fatalf("poller did not wait") + } + tfd.closeWrite(t) + if !<-oks { + t.Fatalf("expected true") + } + tfd.get(t) +} diff --git a/api/vendor/gopkg.in/fsnotify.v1/inotify_test.go b/api/vendor/gopkg.in/fsnotify.v1/inotify_test.go new file mode 100644 index 0000000..54f3f00 --- /dev/null +++ b/api/vendor/gopkg.in/fsnotify.v1/inotify_test.go @@ -0,0 +1,449 @@ +// Copyright 2015 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 linux + +package fsnotify + +import ( + "fmt" + "os" + "path/filepath" + "strings" + "testing" + "time" +) + +func TestInotifyCloseRightAway(t *testing.T) { + w, err := NewWatcher() + if err != nil { + t.Fatalf("Failed to create watcher") + } + + // Close immediately; it won't even reach the first unix.Read. + w.Close() + + // Wait for the close to complete. + <-time.After(50 * time.Millisecond) + isWatcherReallyClosed(t, w) +} + +func TestInotifyCloseSlightlyLater(t *testing.T) { + w, err := NewWatcher() + if err != nil { + t.Fatalf("Failed to create watcher") + } + + // Wait until readEvents has reached unix.Read, and Close. + <-time.After(50 * time.Millisecond) + w.Close() + + // Wait for the close to complete. + <-time.After(50 * time.Millisecond) + isWatcherReallyClosed(t, w) +} + +func TestInotifyCloseSlightlyLaterWithWatch(t *testing.T) { + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + + w, err := NewWatcher() + if err != nil { + t.Fatalf("Failed to create watcher") + } + w.Add(testDir) + + // Wait until readEvents has reached unix.Read, and Close. + <-time.After(50 * time.Millisecond) + w.Close() + + // Wait for the close to complete. + <-time.After(50 * time.Millisecond) + isWatcherReallyClosed(t, w) +} + +func TestInotifyCloseAfterRead(t *testing.T) { + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + + w, err := NewWatcher() + if err != nil { + t.Fatalf("Failed to create watcher") + } + + err = w.Add(testDir) + if err != nil { + t.Fatalf("Failed to add .") + } + + // Generate an event. + os.Create(filepath.Join(testDir, "somethingSOMETHINGsomethingSOMETHING")) + + // Wait for readEvents to read the event, then close the watcher. + <-time.After(50 * time.Millisecond) + w.Close() + + // Wait for the close to complete. + <-time.After(50 * time.Millisecond) + isWatcherReallyClosed(t, w) +} + +func isWatcherReallyClosed(t *testing.T, w *Watcher) { + select { + case err, ok := <-w.Errors: + if ok { + t.Fatalf("w.Errors is not closed; readEvents is still alive after closing (error: %v)", err) + } + default: + t.Fatalf("w.Errors would have blocked; readEvents is still alive!") + } + + select { + case _, ok := <-w.Events: + if ok { + t.Fatalf("w.Events is not closed; readEvents is still alive after closing") + } + default: + t.Fatalf("w.Events would have blocked; readEvents is still alive!") + } +} + +func TestInotifyCloseCreate(t *testing.T) { + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + + w, err := NewWatcher() + if err != nil { + t.Fatalf("Failed to create watcher: %v", err) + } + defer w.Close() + + err = w.Add(testDir) + if err != nil { + t.Fatalf("Failed to add testDir: %v", err) + } + h, err := os.Create(filepath.Join(testDir, "testfile")) + if err != nil { + t.Fatalf("Failed to create file in testdir: %v", err) + } + h.Close() + select { + case _ = <-w.Events: + case err := <-w.Errors: + t.Fatalf("Error from watcher: %v", err) + case <-time.After(50 * time.Millisecond): + t.Fatalf("Took too long to wait for event") + } + + // At this point, we've received one event, so the goroutine is ready. + // It's also blocking on unix.Read. + // Now we try to swap the file descriptor under its nose. + w.Close() + w, err = NewWatcher() + defer w.Close() + if err != nil { + t.Fatalf("Failed to create second watcher: %v", err) + } + + <-time.After(50 * time.Millisecond) + err = w.Add(testDir) + if err != nil { + t.Fatalf("Error adding testDir again: %v", err) + } +} + +// This test verifies the watcher can keep up with file creations/deletions +// when under load. +func TestInotifyStress(t *testing.T) { + maxNumToCreate := 1000 + + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + testFilePrefix := filepath.Join(testDir, "testfile") + + w, err := NewWatcher() + if err != nil { + t.Fatalf("Failed to create watcher: %v", err) + } + defer w.Close() + + err = w.Add(testDir) + if err != nil { + t.Fatalf("Failed to add testDir: %v", err) + } + + doneChan := make(chan struct{}) + // The buffer ensures that the file generation goroutine is never blocked. + errChan := make(chan error, 2*maxNumToCreate) + + go func() { + for i := 0; i < maxNumToCreate; i++ { + testFile := fmt.Sprintf("%s%d", testFilePrefix, i) + + handle, err := os.Create(testFile) + if err != nil { + errChan <- fmt.Errorf("Create failed: %v", err) + continue + } + + err = handle.Close() + if err != nil { + errChan <- fmt.Errorf("Close failed: %v", err) + continue + } + } + + // If we delete a newly created file too quickly, inotify will skip the + // create event and only send the delete event. + time.Sleep(100 * time.Millisecond) + + for i := 0; i < maxNumToCreate; i++ { + testFile := fmt.Sprintf("%s%d", testFilePrefix, i) + err = os.Remove(testFile) + if err != nil { + errChan <- fmt.Errorf("Remove failed: %v", err) + } + } + + close(doneChan) + }() + + creates := 0 + removes := 0 + + finished := false + after := time.After(10 * time.Second) + for !finished { + select { + case <-after: + t.Fatalf("Not done") + case <-doneChan: + finished = true + case err := <-errChan: + t.Fatalf("Got an error from file creator goroutine: %v", err) + case err := <-w.Errors: + t.Fatalf("Got an error from watcher: %v", err) + case evt := <-w.Events: + if !strings.HasPrefix(evt.Name, testFilePrefix) { + t.Fatalf("Got an event for an unknown file: %s", evt.Name) + } + if evt.Op == Create { + creates++ + } + if evt.Op == Remove { + removes++ + } + } + } + + // Drain remaining events from channels + count := 0 + for count < 10 { + select { + case err := <-errChan: + t.Fatalf("Got an error from file creator goroutine: %v", err) + case err := <-w.Errors: + t.Fatalf("Got an error from watcher: %v", err) + case evt := <-w.Events: + if !strings.HasPrefix(evt.Name, testFilePrefix) { + t.Fatalf("Got an event for an unknown file: %s", evt.Name) + } + if evt.Op == Create { + creates++ + } + if evt.Op == Remove { + removes++ + } + count = 0 + default: + count++ + // Give the watcher chances to fill the channels. + time.Sleep(time.Millisecond) + } + } + + if creates-removes > 1 || creates-removes < -1 { + t.Fatalf("Creates and removes should not be off by more than one: %d creates, %d removes", creates, removes) + } + if creates < 50 { + t.Fatalf("Expected at least 50 creates, got %d", creates) + } +} + +func TestInotifyRemoveTwice(t *testing.T) { + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + testFile := filepath.Join(testDir, "testfile") + + handle, err := os.Create(testFile) + if err != nil { + t.Fatalf("Create failed: %v", err) + } + handle.Close() + + w, err := NewWatcher() + if err != nil { + t.Fatalf("Failed to create watcher: %v", err) + } + defer w.Close() + + err = w.Add(testFile) + if err != nil { + t.Fatalf("Failed to add testFile: %v", err) + } + + err = w.Remove(testFile) + if err != nil { + t.Fatalf("wanted successful remove but got: %v", err) + } + + err = w.Remove(testFile) + if err == nil { + t.Fatalf("no error on removing invalid file") + } + + w.mu.Lock() + defer w.mu.Unlock() + if len(w.watches) != 0 { + t.Fatalf("Expected watches len is 0, but got: %d, %v", len(w.watches), w.watches) + } + if len(w.paths) != 0 { + t.Fatalf("Expected paths len is 0, but got: %d, %v", len(w.paths), w.paths) + } +} + +func TestInotifyInnerMapLength(t *testing.T) { + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + testFile := filepath.Join(testDir, "testfile") + + handle, err := os.Create(testFile) + if err != nil { + t.Fatalf("Create failed: %v", err) + } + handle.Close() + + w, err := NewWatcher() + if err != nil { + t.Fatalf("Failed to create watcher: %v", err) + } + defer w.Close() + + err = w.Add(testFile) + if err != nil { + t.Fatalf("Failed to add testFile: %v", err) + } + go func() { + for err := range w.Errors { + t.Fatalf("error received: %s", err) + } + }() + + err = os.Remove(testFile) + if err != nil { + t.Fatalf("Failed to remove testFile: %v", err) + } + _ = <-w.Events // consume Remove event + <-time.After(50 * time.Millisecond) // wait IN_IGNORE propagated + + w.mu.Lock() + defer w.mu.Unlock() + if len(w.watches) != 0 { + t.Fatalf("Expected watches len is 0, but got: %d, %v", len(w.watches), w.watches) + } + if len(w.paths) != 0 { + t.Fatalf("Expected paths len is 0, but got: %d, %v", len(w.paths), w.paths) + } +} + +func TestInotifyOverflow(t *testing.T) { + // We need to generate many more events than the + // fs.inotify.max_queued_events sysctl setting. + // We use multiple goroutines (one per directory) + // to speed up file creation. + numDirs := 128 + numFiles := 1024 + + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + + w, err := NewWatcher() + if err != nil { + t.Fatalf("Failed to create watcher: %v", err) + } + defer w.Close() + + for dn := 0; dn < numDirs; dn++ { + testSubdir := fmt.Sprintf("%s/%d", testDir, dn) + + err := os.Mkdir(testSubdir, 0777) + if err != nil { + t.Fatalf("Cannot create subdir: %v", err) + } + + err = w.Add(testSubdir) + if err != nil { + t.Fatalf("Failed to add subdir: %v", err) + } + } + + errChan := make(chan error, numDirs*numFiles) + + for dn := 0; dn < numDirs; dn++ { + testSubdir := fmt.Sprintf("%s/%d", testDir, dn) + + go func() { + for fn := 0; fn < numFiles; fn++ { + testFile := fmt.Sprintf("%s/%d", testSubdir, fn) + + handle, err := os.Create(testFile) + if err != nil { + errChan <- fmt.Errorf("Create failed: %v", err) + continue + } + + err = handle.Close() + if err != nil { + errChan <- fmt.Errorf("Close failed: %v", err) + continue + } + } + }() + } + + creates := 0 + overflows := 0 + + after := time.After(10 * time.Second) + for overflows == 0 && creates < numDirs*numFiles { + select { + case <-after: + t.Fatalf("Not done") + case err := <-errChan: + t.Fatalf("Got an error from file creator goroutine: %v", err) + case err := <-w.Errors: + if err == ErrEventOverflow { + overflows++ + } else { + t.Fatalf("Got an error from watcher: %v", err) + } + case evt := <-w.Events: + if !strings.HasPrefix(evt.Name, testDir) { + t.Fatalf("Got an event for an unknown file: %s", evt.Name) + } + if evt.Op == Create { + creates++ + } + } + } + + if creates == numDirs*numFiles { + t.Fatalf("Could not trigger overflow") + } + + if overflows == 0 { + t.Fatalf("No overflow and not enough creates (expected %d, got %d)", + numDirs*numFiles, creates) + } +} diff --git a/api/vendor/gopkg.in/fsnotify.v1/integration_darwin_test.go b/api/vendor/gopkg.in/fsnotify.v1/integration_darwin_test.go new file mode 100644 index 0000000..cd6adc2 --- /dev/null +++ b/api/vendor/gopkg.in/fsnotify.v1/integration_darwin_test.go @@ -0,0 +1,147 @@ +// 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 fsnotify + +import ( + "os" + "path/filepath" + "testing" + "time" + + "golang.org/x/sys/unix" +) + +// testExchangedataForWatcher tests the watcher with the exchangedata operation on macOS. +// +// This is widely used for atomic saves on macOS, e.g. TextMate and in Apple's NSDocument. +// +// See https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man2/exchangedata.2.html +// Also see: https://github.com/textmate/textmate/blob/cd016be29489eba5f3c09b7b70b06da134dda550/Frameworks/io/src/swap_file_data.cc#L20 +func testExchangedataForWatcher(t *testing.T, watchDir bool) { + // Create directory to watch + testDir1 := tempMkdir(t) + + // For the intermediate file + testDir2 := tempMkdir(t) + + defer os.RemoveAll(testDir1) + defer os.RemoveAll(testDir2) + + resolvedFilename := "TestFsnotifyEvents.file" + + // TextMate does: + // + // 1. exchangedata (intermediate, resolved) + // 2. unlink intermediate + // + // Let's try to simulate that: + resolved := filepath.Join(testDir1, resolvedFilename) + intermediate := filepath.Join(testDir2, resolvedFilename+"~") + + // Make sure we create the file before we start watching + createAndSyncFile(t, resolved) + + watcher := newWatcher(t) + + // Test both variants in isolation + if watchDir { + addWatch(t, watcher, testDir1) + } else { + addWatch(t, watcher, resolved) + } + + // Receive errors on the error channel on a separate goroutine + go func() { + for err := range watcher.Errors { + t.Fatalf("error received: %s", err) + } + }() + + // Receive events on the event channel on a separate goroutine + eventstream := watcher.Events + var removeReceived counter + var createReceived counter + + done := make(chan bool) + + go func() { + for event := range eventstream { + // Only count relevant events + if event.Name == filepath.Clean(resolved) { + if event.Op&Remove == Remove { + removeReceived.increment() + } + if event.Op&Create == Create { + createReceived.increment() + } + } + t.Logf("event received: %s", event) + } + done <- true + }() + + // Repeat to make sure the watched file/directory "survives" the REMOVE/CREATE loop. + for i := 1; i <= 3; i++ { + // The intermediate file is created in a folder outside the watcher + createAndSyncFile(t, intermediate) + + // 1. Swap + if err := unix.Exchangedata(intermediate, resolved, 0); err != nil { + t.Fatalf("[%d] exchangedata failed: %s", i, err) + } + + time.Sleep(50 * time.Millisecond) + + // 2. Delete the intermediate file + err := os.Remove(intermediate) + + if err != nil { + t.Fatalf("[%d] remove %s failed: %s", i, intermediate, err) + } + + time.Sleep(50 * time.Millisecond) + + } + + // We expect this event to be received almost immediately, but let's wait 500 ms to be sure + time.Sleep(500 * time.Millisecond) + + // The events will be (CHMOD + REMOVE + CREATE) X 2. Let's focus on the last two: + if removeReceived.value() < 3 { + t.Fatal("fsnotify remove events have not been received after 500 ms") + } + + if createReceived.value() < 3 { + t.Fatal("fsnotify create events have not been received after 500 ms") + } + + watcher.Close() + t.Log("waiting for the event channel to become closed...") + select { + case <-done: + t.Log("event channel closed") + case <-time.After(2 * time.Second): + t.Fatal("event stream was not closed after 2 seconds") + } +} + +// TestExchangedataInWatchedDir test exchangedata operation on file in watched dir. +func TestExchangedataInWatchedDir(t *testing.T) { + testExchangedataForWatcher(t, true) +} + +// TestExchangedataInWatchedDir test exchangedata operation on watched file. +func TestExchangedataInWatchedFile(t *testing.T) { + testExchangedataForWatcher(t, false) +} + +func createAndSyncFile(t *testing.T, filepath string) { + f1, err := os.OpenFile(filepath, os.O_WRONLY|os.O_CREATE, 0666) + if err != nil { + t.Fatalf("creating %s failed: %s", filepath, err) + } + f1.Sync() + f1.Close() +} diff --git a/api/vendor/gopkg.in/fsnotify.v1/integration_test.go b/api/vendor/gopkg.in/fsnotify.v1/integration_test.go new file mode 100644 index 0000000..8b7e9d3 --- /dev/null +++ b/api/vendor/gopkg.in/fsnotify.v1/integration_test.go @@ -0,0 +1,1237 @@ +// 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. + +// +build !plan9,!solaris + +package fsnotify + +import ( + "io/ioutil" + "os" + "os/exec" + "path" + "path/filepath" + "runtime" + "sync/atomic" + "testing" + "time" +) + +// An atomic counter +type counter struct { + val int32 +} + +func (c *counter) increment() { + atomic.AddInt32(&c.val, 1) +} + +func (c *counter) value() int32 { + return atomic.LoadInt32(&c.val) +} + +func (c *counter) reset() { + atomic.StoreInt32(&c.val, 0) +} + +// tempMkdir makes a temporary directory +func tempMkdir(t *testing.T) string { + dir, err := ioutil.TempDir("", "fsnotify") + if err != nil { + t.Fatalf("failed to create test directory: %s", err) + } + return dir +} + +// tempMkFile makes a temporary file. +func tempMkFile(t *testing.T, dir string) string { + f, err := ioutil.TempFile(dir, "fsnotify") + if err != nil { + t.Fatalf("failed to create test file: %v", err) + } + defer f.Close() + return f.Name() +} + +// newWatcher initializes an fsnotify Watcher instance. +func newWatcher(t *testing.T) *Watcher { + watcher, err := NewWatcher() + if err != nil { + t.Fatalf("NewWatcher() failed: %s", err) + } + return watcher +} + +// addWatch adds a watch for a directory +func addWatch(t *testing.T, watcher *Watcher, dir string) { + if err := watcher.Add(dir); err != nil { + t.Fatalf("watcher.Add(%q) failed: %s", dir, err) + } +} + +func TestFsnotifyMultipleOperations(t *testing.T) { + watcher := newWatcher(t) + + // Receive errors on the error channel on a separate goroutine + go func() { + for err := range watcher.Errors { + t.Fatalf("error received: %s", err) + } + }() + + // Create directory to watch + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + + // Create directory that's not watched + testDirToMoveFiles := tempMkdir(t) + defer os.RemoveAll(testDirToMoveFiles) + + testFile := filepath.Join(testDir, "TestFsnotifySeq.testfile") + testFileRenamed := filepath.Join(testDirToMoveFiles, "TestFsnotifySeqRename.testfile") + + addWatch(t, watcher, testDir) + + // Receive events on the event channel on a separate goroutine + eventstream := watcher.Events + var createReceived, modifyReceived, deleteReceived, renameReceived counter + done := make(chan bool) + go func() { + for event := range eventstream { + // Only count relevant events + if event.Name == filepath.Clean(testDir) || event.Name == filepath.Clean(testFile) { + t.Logf("event received: %s", event) + if event.Op&Remove == Remove { + deleteReceived.increment() + } + if event.Op&Write == Write { + modifyReceived.increment() + } + if event.Op&Create == Create { + createReceived.increment() + } + if event.Op&Rename == Rename { + renameReceived.increment() + } + } else { + t.Logf("unexpected event received: %s", event) + } + } + done <- true + }() + + // Create a file + // This should add at least one event to the fsnotify event queue + var f *os.File + f, err := os.OpenFile(testFile, os.O_WRONLY|os.O_CREATE, 0666) + if err != nil { + t.Fatalf("creating test file failed: %s", err) + } + f.Sync() + + time.Sleep(time.Millisecond) + f.WriteString("data") + f.Sync() + f.Close() + + time.Sleep(50 * time.Millisecond) // give system time to sync write change before delete + + if err := testRename(testFile, testFileRenamed); err != nil { + t.Fatalf("rename failed: %s", err) + } + + // Modify the file outside of the watched dir + f, err = os.Open(testFileRenamed) + if err != nil { + t.Fatalf("open test renamed file failed: %s", err) + } + f.WriteString("data") + f.Sync() + f.Close() + + time.Sleep(50 * time.Millisecond) // give system time to sync write change before delete + + // Recreate the file that was moved + f, err = os.OpenFile(testFile, os.O_WRONLY|os.O_CREATE, 0666) + if err != nil { + t.Fatalf("creating test file failed: %s", err) + } + f.Close() + time.Sleep(50 * time.Millisecond) // give system time to sync write change before delete + + // We expect this event to be received almost immediately, but let's wait 500 ms to be sure + time.Sleep(500 * time.Millisecond) + cReceived := createReceived.value() + if cReceived != 2 { + t.Fatalf("incorrect number of create events received after 500 ms (%d vs %d)", cReceived, 2) + } + mReceived := modifyReceived.value() + if mReceived != 1 { + t.Fatalf("incorrect number of modify events received after 500 ms (%d vs %d)", mReceived, 1) + } + dReceived := deleteReceived.value() + rReceived := renameReceived.value() + if dReceived+rReceived != 1 { + t.Fatalf("incorrect number of rename+delete events received after 500 ms (%d vs %d)", rReceived+dReceived, 1) + } + + // Try closing the fsnotify instance + t.Log("calling Close()") + watcher.Close() + t.Log("waiting for the event channel to become closed...") + select { + case <-done: + t.Log("event channel closed") + case <-time.After(2 * time.Second): + t.Fatal("event stream was not closed after 2 seconds") + } +} + +func TestFsnotifyMultipleCreates(t *testing.T) { + watcher := newWatcher(t) + + // Receive errors on the error channel on a separate goroutine + go func() { + for err := range watcher.Errors { + t.Fatalf("error received: %s", err) + } + }() + + // Create directory to watch + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + + testFile := filepath.Join(testDir, "TestFsnotifySeq.testfile") + + addWatch(t, watcher, testDir) + + // Receive events on the event channel on a separate goroutine + eventstream := watcher.Events + var createReceived, modifyReceived, deleteReceived counter + done := make(chan bool) + go func() { + for event := range eventstream { + // Only count relevant events + if event.Name == filepath.Clean(testDir) || event.Name == filepath.Clean(testFile) { + t.Logf("event received: %s", event) + if event.Op&Remove == Remove { + deleteReceived.increment() + } + if event.Op&Create == Create { + createReceived.increment() + } + if event.Op&Write == Write { + modifyReceived.increment() + } + } else { + t.Logf("unexpected event received: %s", event) + } + } + done <- true + }() + + // Create a file + // This should add at least one event to the fsnotify event queue + var f *os.File + f, err := os.OpenFile(testFile, os.O_WRONLY|os.O_CREATE, 0666) + if err != nil { + t.Fatalf("creating test file failed: %s", err) + } + f.Sync() + + time.Sleep(time.Millisecond) + f.WriteString("data") + f.Sync() + f.Close() + + time.Sleep(50 * time.Millisecond) // give system time to sync write change before delete + + os.Remove(testFile) + + time.Sleep(50 * time.Millisecond) // give system time to sync write change before delete + + // Recreate the file + f, err = os.OpenFile(testFile, os.O_WRONLY|os.O_CREATE, 0666) + if err != nil { + t.Fatalf("creating test file failed: %s", err) + } + f.Close() + time.Sleep(50 * time.Millisecond) // give system time to sync write change before delete + + // Modify + f, err = os.OpenFile(testFile, os.O_WRONLY, 0666) + if err != nil { + t.Fatalf("creating test file failed: %s", err) + } + f.Sync() + + time.Sleep(time.Millisecond) + f.WriteString("data") + f.Sync() + f.Close() + + time.Sleep(50 * time.Millisecond) // give system time to sync write change before delete + + // Modify + f, err = os.OpenFile(testFile, os.O_WRONLY, 0666) + if err != nil { + t.Fatalf("creating test file failed: %s", err) + } + f.Sync() + + time.Sleep(time.Millisecond) + f.WriteString("data") + f.Sync() + f.Close() + + time.Sleep(50 * time.Millisecond) // give system time to sync write change before delete + + // We expect this event to be received almost immediately, but let's wait 500 ms to be sure + time.Sleep(500 * time.Millisecond) + cReceived := createReceived.value() + if cReceived != 2 { + t.Fatalf("incorrect number of create events received after 500 ms (%d vs %d)", cReceived, 2) + } + mReceived := modifyReceived.value() + if mReceived < 3 { + t.Fatalf("incorrect number of modify events received after 500 ms (%d vs atleast %d)", mReceived, 3) + } + dReceived := deleteReceived.value() + if dReceived != 1 { + t.Fatalf("incorrect number of rename+delete events received after 500 ms (%d vs %d)", dReceived, 1) + } + + // Try closing the fsnotify instance + t.Log("calling Close()") + watcher.Close() + t.Log("waiting for the event channel to become closed...") + select { + case <-done: + t.Log("event channel closed") + case <-time.After(2 * time.Second): + t.Fatal("event stream was not closed after 2 seconds") + } +} + +func TestFsnotifyDirOnly(t *testing.T) { + watcher := newWatcher(t) + + // Create directory to watch + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + + // Create a file before watching directory + // This should NOT add any events to the fsnotify event queue + testFileAlreadyExists := filepath.Join(testDir, "TestFsnotifyEventsExisting.testfile") + { + var f *os.File + f, err := os.OpenFile(testFileAlreadyExists, os.O_WRONLY|os.O_CREATE, 0666) + if err != nil { + t.Fatalf("creating test file failed: %s", err) + } + f.Sync() + f.Close() + } + + addWatch(t, watcher, testDir) + + // Receive errors on the error channel on a separate goroutine + go func() { + for err := range watcher.Errors { + t.Fatalf("error received: %s", err) + } + }() + + testFile := filepath.Join(testDir, "TestFsnotifyDirOnly.testfile") + + // Receive events on the event channel on a separate goroutine + eventstream := watcher.Events + var createReceived, modifyReceived, deleteReceived counter + done := make(chan bool) + go func() { + for event := range eventstream { + // Only count relevant events + if event.Name == filepath.Clean(testDir) || event.Name == filepath.Clean(testFile) || event.Name == filepath.Clean(testFileAlreadyExists) { + t.Logf("event received: %s", event) + if event.Op&Remove == Remove { + deleteReceived.increment() + } + if event.Op&Write == Write { + modifyReceived.increment() + } + if event.Op&Create == Create { + createReceived.increment() + } + } else { + t.Logf("unexpected event received: %s", event) + } + } + done <- true + }() + + // Create a file + // This should add at least one event to the fsnotify event queue + var f *os.File + f, err := os.OpenFile(testFile, os.O_WRONLY|os.O_CREATE, 0666) + if err != nil { + t.Fatalf("creating test file failed: %s", err) + } + f.Sync() + + time.Sleep(time.Millisecond) + f.WriteString("data") + f.Sync() + f.Close() + + time.Sleep(50 * time.Millisecond) // give system time to sync write change before delete + + os.Remove(testFile) + os.Remove(testFileAlreadyExists) + + // We expect this event to be received almost immediately, but let's wait 500 ms to be sure + time.Sleep(500 * time.Millisecond) + cReceived := createReceived.value() + if cReceived != 1 { + t.Fatalf("incorrect number of create events received after 500 ms (%d vs %d)", cReceived, 1) + } + mReceived := modifyReceived.value() + if mReceived != 1 { + t.Fatalf("incorrect number of modify events received after 500 ms (%d vs %d)", mReceived, 1) + } + dReceived := deleteReceived.value() + if dReceived != 2 { + t.Fatalf("incorrect number of delete events received after 500 ms (%d vs %d)", dReceived, 2) + } + + // Try closing the fsnotify instance + t.Log("calling Close()") + watcher.Close() + t.Log("waiting for the event channel to become closed...") + select { + case <-done: + t.Log("event channel closed") + case <-time.After(2 * time.Second): + t.Fatal("event stream was not closed after 2 seconds") + } +} + +func TestFsnotifyDeleteWatchedDir(t *testing.T) { + watcher := newWatcher(t) + defer watcher.Close() + + // Create directory to watch + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + + // Create a file before watching directory + testFileAlreadyExists := filepath.Join(testDir, "TestFsnotifyEventsExisting.testfile") + { + var f *os.File + f, err := os.OpenFile(testFileAlreadyExists, os.O_WRONLY|os.O_CREATE, 0666) + if err != nil { + t.Fatalf("creating test file failed: %s", err) + } + f.Sync() + f.Close() + } + + addWatch(t, watcher, testDir) + + // Add a watch for testFile + addWatch(t, watcher, testFileAlreadyExists) + + // Receive errors on the error channel on a separate goroutine + go func() { + for err := range watcher.Errors { + t.Fatalf("error received: %s", err) + } + }() + + // Receive events on the event channel on a separate goroutine + eventstream := watcher.Events + var deleteReceived counter + go func() { + for event := range eventstream { + // Only count relevant events + if event.Name == filepath.Clean(testDir) || event.Name == filepath.Clean(testFileAlreadyExists) { + t.Logf("event received: %s", event) + if event.Op&Remove == Remove { + deleteReceived.increment() + } + } else { + t.Logf("unexpected event received: %s", event) + } + } + }() + + os.RemoveAll(testDir) + + // We expect this event to be received almost immediately, but let's wait 500 ms to be sure + time.Sleep(500 * time.Millisecond) + dReceived := deleteReceived.value() + if dReceived < 2 { + t.Fatalf("did not receive at least %d delete events, received %d after 500 ms", 2, dReceived) + } +} + +func TestFsnotifySubDir(t *testing.T) { + watcher := newWatcher(t) + + // Create directory to watch + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + + testFile1 := filepath.Join(testDir, "TestFsnotifyFile1.testfile") + testSubDir := filepath.Join(testDir, "sub") + testSubDirFile := filepath.Join(testDir, "sub/TestFsnotifyFile1.testfile") + + // Receive errors on the error channel on a separate goroutine + go func() { + for err := range watcher.Errors { + t.Fatalf("error received: %s", err) + } + }() + + // Receive events on the event channel on a separate goroutine + eventstream := watcher.Events + var createReceived, deleteReceived counter + done := make(chan bool) + go func() { + for event := range eventstream { + // Only count relevant events + if event.Name == filepath.Clean(testDir) || event.Name == filepath.Clean(testSubDir) || event.Name == filepath.Clean(testFile1) { + t.Logf("event received: %s", event) + if event.Op&Create == Create { + createReceived.increment() + } + if event.Op&Remove == Remove { + deleteReceived.increment() + } + } else { + t.Logf("unexpected event received: %s", event) + } + } + done <- true + }() + + addWatch(t, watcher, testDir) + + // Create sub-directory + if err := os.Mkdir(testSubDir, 0777); err != nil { + t.Fatalf("failed to create test sub-directory: %s", err) + } + + // Create a file + var f *os.File + f, err := os.OpenFile(testFile1, os.O_WRONLY|os.O_CREATE, 0666) + if err != nil { + t.Fatalf("creating test file failed: %s", err) + } + f.Sync() + f.Close() + + // Create a file (Should not see this! we are not watching subdir) + var fs *os.File + fs, err = os.OpenFile(testSubDirFile, os.O_WRONLY|os.O_CREATE, 0666) + if err != nil { + t.Fatalf("creating test file failed: %s", err) + } + fs.Sync() + fs.Close() + + time.Sleep(200 * time.Millisecond) + + // Make sure receive deletes for both file and sub-directory + os.RemoveAll(testSubDir) + os.Remove(testFile1) + + // We expect this event to be received almost immediately, but let's wait 500 ms to be sure + time.Sleep(500 * time.Millisecond) + cReceived := createReceived.value() + if cReceived != 2 { + t.Fatalf("incorrect number of create events received after 500 ms (%d vs %d)", cReceived, 2) + } + dReceived := deleteReceived.value() + if dReceived != 2 { + t.Fatalf("incorrect number of delete events received after 500 ms (%d vs %d)", dReceived, 2) + } + + // Try closing the fsnotify instance + t.Log("calling Close()") + watcher.Close() + t.Log("waiting for the event channel to become closed...") + select { + case <-done: + t.Log("event channel closed") + case <-time.After(2 * time.Second): + t.Fatal("event stream was not closed after 2 seconds") + } +} + +func TestFsnotifyRename(t *testing.T) { + watcher := newWatcher(t) + + // Create directory to watch + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + + addWatch(t, watcher, testDir) + + // Receive errors on the error channel on a separate goroutine + go func() { + for err := range watcher.Errors { + t.Fatalf("error received: %s", err) + } + }() + + testFile := filepath.Join(testDir, "TestFsnotifyEvents.testfile") + testFileRenamed := filepath.Join(testDir, "TestFsnotifyEvents.testfileRenamed") + + // Receive events on the event channel on a separate goroutine + eventstream := watcher.Events + var renameReceived counter + done := make(chan bool) + go func() { + for event := range eventstream { + // Only count relevant events + if event.Name == filepath.Clean(testDir) || event.Name == filepath.Clean(testFile) || event.Name == filepath.Clean(testFileRenamed) { + if event.Op&Rename == Rename { + renameReceived.increment() + } + t.Logf("event received: %s", event) + } else { + t.Logf("unexpected event received: %s", event) + } + } + done <- true + }() + + // Create a file + // This should add at least one event to the fsnotify event queue + var f *os.File + f, err := os.OpenFile(testFile, os.O_WRONLY|os.O_CREATE, 0666) + if err != nil { + t.Fatalf("creating test file failed: %s", err) + } + f.Sync() + + f.WriteString("data") + f.Sync() + f.Close() + + // Add a watch for testFile + addWatch(t, watcher, testFile) + + if err := testRename(testFile, testFileRenamed); err != nil { + t.Fatalf("rename failed: %s", err) + } + + // We expect this event to be received almost immediately, but let's wait 500 ms to be sure + time.Sleep(500 * time.Millisecond) + if renameReceived.value() == 0 { + t.Fatal("fsnotify rename events have not been received after 500 ms") + } + + // Try closing the fsnotify instance + t.Log("calling Close()") + watcher.Close() + t.Log("waiting for the event channel to become closed...") + select { + case <-done: + t.Log("event channel closed") + case <-time.After(2 * time.Second): + t.Fatal("event stream was not closed after 2 seconds") + } + + os.Remove(testFileRenamed) +} + +func TestFsnotifyRenameToCreate(t *testing.T) { + watcher := newWatcher(t) + + // Create directory to watch + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + + // Create directory to get file + testDirFrom := tempMkdir(t) + defer os.RemoveAll(testDirFrom) + + addWatch(t, watcher, testDir) + + // Receive errors on the error channel on a separate goroutine + go func() { + for err := range watcher.Errors { + t.Fatalf("error received: %s", err) + } + }() + + testFile := filepath.Join(testDirFrom, "TestFsnotifyEvents.testfile") + testFileRenamed := filepath.Join(testDir, "TestFsnotifyEvents.testfileRenamed") + + // Receive events on the event channel on a separate goroutine + eventstream := watcher.Events + var createReceived counter + done := make(chan bool) + go func() { + for event := range eventstream { + // Only count relevant events + if event.Name == filepath.Clean(testDir) || event.Name == filepath.Clean(testFile) || event.Name == filepath.Clean(testFileRenamed) { + if event.Op&Create == Create { + createReceived.increment() + } + t.Logf("event received: %s", event) + } else { + t.Logf("unexpected event received: %s", event) + } + } + done <- true + }() + + // Create a file + // This should add at least one event to the fsnotify event queue + var f *os.File + f, err := os.OpenFile(testFile, os.O_WRONLY|os.O_CREATE, 0666) + if err != nil { + t.Fatalf("creating test file failed: %s", err) + } + f.Sync() + f.Close() + + if err := testRename(testFile, testFileRenamed); err != nil { + t.Fatalf("rename failed: %s", err) + } + + // We expect this event to be received almost immediately, but let's wait 500 ms to be sure + time.Sleep(500 * time.Millisecond) + if createReceived.value() == 0 { + t.Fatal("fsnotify create events have not been received after 500 ms") + } + + // Try closing the fsnotify instance + t.Log("calling Close()") + watcher.Close() + t.Log("waiting for the event channel to become closed...") + select { + case <-done: + t.Log("event channel closed") + case <-time.After(2 * time.Second): + t.Fatal("event stream was not closed after 2 seconds") + } + + os.Remove(testFileRenamed) +} + +func TestFsnotifyRenameToOverwrite(t *testing.T) { + switch runtime.GOOS { + case "plan9", "windows": + t.Skipf("skipping test on %q (os.Rename over existing file does not create event).", runtime.GOOS) + } + + watcher := newWatcher(t) + + // Create directory to watch + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + + // Create directory to get file + testDirFrom := tempMkdir(t) + defer os.RemoveAll(testDirFrom) + + testFile := filepath.Join(testDirFrom, "TestFsnotifyEvents.testfile") + testFileRenamed := filepath.Join(testDir, "TestFsnotifyEvents.testfileRenamed") + + // Create a file + var fr *os.File + fr, err := os.OpenFile(testFileRenamed, os.O_WRONLY|os.O_CREATE, 0666) + if err != nil { + t.Fatalf("creating test file failed: %s", err) + } + fr.Sync() + fr.Close() + + addWatch(t, watcher, testDir) + + // Receive errors on the error channel on a separate goroutine + go func() { + for err := range watcher.Errors { + t.Fatalf("error received: %s", err) + } + }() + + // Receive events on the event channel on a separate goroutine + eventstream := watcher.Events + var eventReceived counter + done := make(chan bool) + go func() { + for event := range eventstream { + // Only count relevant events + if event.Name == filepath.Clean(testFileRenamed) { + eventReceived.increment() + t.Logf("event received: %s", event) + } else { + t.Logf("unexpected event received: %s", event) + } + } + done <- true + }() + + // Create a file + // This should add at least one event to the fsnotify event queue + var f *os.File + f, err = os.OpenFile(testFile, os.O_WRONLY|os.O_CREATE, 0666) + if err != nil { + t.Fatalf("creating test file failed: %s", err) + } + f.Sync() + f.Close() + + if err := testRename(testFile, testFileRenamed); err != nil { + t.Fatalf("rename failed: %s", err) + } + + // We expect this event to be received almost immediately, but let's wait 500 ms to be sure + time.Sleep(500 * time.Millisecond) + if eventReceived.value() == 0 { + t.Fatal("fsnotify events have not been received after 500 ms") + } + + // Try closing the fsnotify instance + t.Log("calling Close()") + watcher.Close() + t.Log("waiting for the event channel to become closed...") + select { + case <-done: + t.Log("event channel closed") + case <-time.After(2 * time.Second): + t.Fatal("event stream was not closed after 2 seconds") + } + + os.Remove(testFileRenamed) +} + +func TestRemovalOfWatch(t *testing.T) { + // Create directory to watch + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + + // Create a file before watching directory + testFileAlreadyExists := filepath.Join(testDir, "TestFsnotifyEventsExisting.testfile") + { + var f *os.File + f, err := os.OpenFile(testFileAlreadyExists, os.O_WRONLY|os.O_CREATE, 0666) + if err != nil { + t.Fatalf("creating test file failed: %s", err) + } + f.Sync() + f.Close() + } + + watcher := newWatcher(t) + defer watcher.Close() + + addWatch(t, watcher, testDir) + if err := watcher.Remove(testDir); err != nil { + t.Fatalf("Could not remove the watch: %v\n", err) + } + + go func() { + select { + case ev := <-watcher.Events: + t.Fatalf("We received event: %v\n", ev) + case <-time.After(500 * time.Millisecond): + t.Log("No event received, as expected.") + } + }() + + time.Sleep(200 * time.Millisecond) + // Modify the file outside of the watched dir + f, err := os.Open(testFileAlreadyExists) + if err != nil { + t.Fatalf("Open test file failed: %s", err) + } + f.WriteString("data") + f.Sync() + f.Close() + if err := os.Chmod(testFileAlreadyExists, 0700); err != nil { + t.Fatalf("chmod failed: %s", err) + } + time.Sleep(400 * time.Millisecond) +} + +func TestFsnotifyAttrib(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("attributes don't work on Windows.") + } + + watcher := newWatcher(t) + + // Create directory to watch + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + + // Receive errors on the error channel on a separate goroutine + go func() { + for err := range watcher.Errors { + t.Fatalf("error received: %s", err) + } + }() + + testFile := filepath.Join(testDir, "TestFsnotifyAttrib.testfile") + + // Receive events on the event channel on a separate goroutine + eventstream := watcher.Events + // The modifyReceived counter counts IsModify events that are not IsAttrib, + // and the attribReceived counts IsAttrib events (which are also IsModify as + // a consequence). + var modifyReceived counter + var attribReceived counter + done := make(chan bool) + go func() { + for event := range eventstream { + // Only count relevant events + if event.Name == filepath.Clean(testDir) || event.Name == filepath.Clean(testFile) { + if event.Op&Write == Write { + modifyReceived.increment() + } + if event.Op&Chmod == Chmod { + attribReceived.increment() + } + t.Logf("event received: %s", event) + } else { + t.Logf("unexpected event received: %s", event) + } + } + done <- true + }() + + // Create a file + // This should add at least one event to the fsnotify event queue + var f *os.File + f, err := os.OpenFile(testFile, os.O_WRONLY|os.O_CREATE, 0666) + if err != nil { + t.Fatalf("creating test file failed: %s", err) + } + f.Sync() + + f.WriteString("data") + f.Sync() + f.Close() + + // Add a watch for testFile + addWatch(t, watcher, testFile) + + if err := os.Chmod(testFile, 0700); err != nil { + t.Fatalf("chmod failed: %s", err) + } + + // We expect this event to be received almost immediately, but let's wait 500 ms to be sure + // Creating/writing a file changes also the mtime, so IsAttrib should be set to true here + time.Sleep(500 * time.Millisecond) + if modifyReceived.value() != 0 { + t.Fatal("received an unexpected modify event when creating a test file") + } + if attribReceived.value() == 0 { + t.Fatal("fsnotify attribute events have not received after 500 ms") + } + + // Modifying the contents of the file does not set the attrib flag (although eg. the mtime + // might have been modified). + modifyReceived.reset() + attribReceived.reset() + + f, err = os.OpenFile(testFile, os.O_WRONLY, 0) + if err != nil { + t.Fatalf("reopening test file failed: %s", err) + } + + f.WriteString("more data") + f.Sync() + f.Close() + + time.Sleep(500 * time.Millisecond) + + if modifyReceived.value() != 1 { + t.Fatal("didn't receive a modify event after changing test file contents") + } + + if attribReceived.value() != 0 { + t.Fatal("did receive an unexpected attrib event after changing test file contents") + } + + modifyReceived.reset() + attribReceived.reset() + + // Doing a chmod on the file should trigger an event with the "attrib" flag set (the contents + // of the file are not changed though) + if err := os.Chmod(testFile, 0600); err != nil { + t.Fatalf("chmod failed: %s", err) + } + + time.Sleep(500 * time.Millisecond) + + if attribReceived.value() != 1 { + t.Fatal("didn't receive an attribute change after 500ms") + } + + // Try closing the fsnotify instance + t.Log("calling Close()") + watcher.Close() + t.Log("waiting for the event channel to become closed...") + select { + case <-done: + t.Log("event channel closed") + case <-time.After(1e9): + t.Fatal("event stream was not closed after 1 second") + } + + os.Remove(testFile) +} + +func TestFsnotifyClose(t *testing.T) { + watcher := newWatcher(t) + watcher.Close() + + var done int32 + go func() { + watcher.Close() + atomic.StoreInt32(&done, 1) + }() + + time.Sleep(50e6) // 50 ms + if atomic.LoadInt32(&done) == 0 { + t.Fatal("double Close() test failed: second Close() call didn't return") + } + + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + + if err := watcher.Add(testDir); err == nil { + t.Fatal("expected error on Watch() after Close(), got nil") + } +} + +func TestFsnotifyFakeSymlink(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("symlinks don't work on Windows.") + } + + watcher := newWatcher(t) + + // Create directory to watch + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + + var errorsReceived counter + // Receive errors on the error channel on a separate goroutine + go func() { + for errors := range watcher.Errors { + t.Logf("Received error: %s", errors) + errorsReceived.increment() + } + }() + + // Count the CREATE events received + var createEventsReceived, otherEventsReceived counter + go func() { + for ev := range watcher.Events { + t.Logf("event received: %s", ev) + if ev.Op&Create == Create { + createEventsReceived.increment() + } else { + otherEventsReceived.increment() + } + } + }() + + addWatch(t, watcher, testDir) + + if err := os.Symlink(filepath.Join(testDir, "zzz"), filepath.Join(testDir, "zzznew")); err != nil { + t.Fatalf("Failed to create bogus symlink: %s", err) + } + t.Logf("Created bogus symlink") + + // We expect this event to be received almost immediately, but let's wait 500 ms to be sure + time.Sleep(500 * time.Millisecond) + + // Should not be error, just no events for broken links (watching nothing) + if errorsReceived.value() > 0 { + t.Fatal("fsnotify errors have been received.") + } + if otherEventsReceived.value() > 0 { + t.Fatal("fsnotify other events received on the broken link") + } + + // Except for 1 create event (for the link itself) + if createEventsReceived.value() == 0 { + t.Fatal("fsnotify create events were not received after 500 ms") + } + if createEventsReceived.value() > 1 { + t.Fatal("fsnotify more create events received than expected") + } + + // Try closing the fsnotify instance + t.Log("calling Close()") + watcher.Close() +} + +func TestCyclicSymlink(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("symlinks don't work on Windows.") + } + + watcher := newWatcher(t) + + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + + link := path.Join(testDir, "link") + if err := os.Symlink(".", link); err != nil { + t.Fatalf("could not make symlink: %v", err) + } + addWatch(t, watcher, testDir) + + var createEventsReceived counter + go func() { + for ev := range watcher.Events { + if ev.Op&Create == Create { + createEventsReceived.increment() + } + } + }() + + if err := os.Remove(link); err != nil { + t.Fatalf("Error removing link: %v", err) + } + + // It would be nice to be able to expect a delete event here, but kqueue has + // no way for us to get events on symlinks themselves, because opening them + // opens an fd to the file to which they point. + + if err := ioutil.WriteFile(link, []byte("foo"), 0700); err != nil { + t.Fatalf("could not make symlink: %v", err) + } + + // We expect this event to be received almost immediately, but let's wait 500 ms to be sure + time.Sleep(500 * time.Millisecond) + + if got := createEventsReceived.value(); got == 0 { + t.Errorf("want at least 1 create event got %v", got) + } + + watcher.Close() +} + +// TestConcurrentRemovalOfWatch tests that concurrent calls to RemoveWatch do not race. +// See https://codereview.appspot.com/103300045/ +// go test -test.run=TestConcurrentRemovalOfWatch -test.cpu=1,1,1,1,1 -race +func TestConcurrentRemovalOfWatch(t *testing.T) { + if runtime.GOOS != "darwin" { + t.Skip("regression test for race only present on darwin") + } + + // Create directory to watch + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + + // Create a file before watching directory + testFileAlreadyExists := filepath.Join(testDir, "TestFsnotifyEventsExisting.testfile") + { + var f *os.File + f, err := os.OpenFile(testFileAlreadyExists, os.O_WRONLY|os.O_CREATE, 0666) + if err != nil { + t.Fatalf("creating test file failed: %s", err) + } + f.Sync() + f.Close() + } + + watcher := newWatcher(t) + defer watcher.Close() + + addWatch(t, watcher, testDir) + + // Test that RemoveWatch can be invoked concurrently, with no data races. + removed1 := make(chan struct{}) + go func() { + defer close(removed1) + watcher.Remove(testDir) + }() + removed2 := make(chan struct{}) + go func() { + close(removed2) + watcher.Remove(testDir) + }() + <-removed1 + <-removed2 +} + +func TestClose(t *testing.T) { + // Regression test for #59 bad file descriptor from Close + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + + watcher := newWatcher(t) + if err := watcher.Add(testDir); err != nil { + t.Fatalf("Expected no error on Add, got %v", err) + } + err := watcher.Close() + if err != nil { + t.Fatalf("Expected no error on Close, got %v.", err) + } +} + +// TestRemoveWithClose tests if one can handle Remove events and, at the same +// time, close Watcher object without any data races. +func TestRemoveWithClose(t *testing.T) { + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + + const fileN = 200 + tempFiles := make([]string, 0, fileN) + for i := 0; i < fileN; i++ { + tempFiles = append(tempFiles, tempMkFile(t, testDir)) + } + watcher := newWatcher(t) + if err := watcher.Add(testDir); err != nil { + t.Fatalf("Expected no error on Add, got %v", err) + } + startC, stopC := make(chan struct{}), make(chan struct{}) + errC := make(chan error) + go func() { + for { + select { + case <-watcher.Errors: + case <-watcher.Events: + case <-stopC: + return + } + } + }() + go func() { + <-startC + for _, fileName := range tempFiles { + os.Remove(fileName) + } + }() + go func() { + <-startC + errC <- watcher.Close() + }() + close(startC) + defer close(stopC) + if err := <-errC; err != nil { + t.Fatalf("Expected no error on Close, got %v.", err) + } +} + +func testRename(file1, file2 string) error { + switch runtime.GOOS { + case "windows", "plan9": + return os.Rename(file1, file2) + default: + cmd := exec.Command("mv", file1, file2) + return cmd.Run() + } +} diff --git a/api/vendor/gopkg.in/fsnotify.v1/kqueue.go b/api/vendor/gopkg.in/fsnotify.v1/kqueue.go new file mode 100644 index 0000000..86e76a3 --- /dev/null +++ b/api/vendor/gopkg.in/fsnotify.v1/kqueue.go @@ -0,0 +1,521 @@ +// 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. + +// +build freebsd openbsd netbsd dragonfly darwin + +package fsnotify + +import ( + "errors" + "fmt" + "io/ioutil" + "os" + "path/filepath" + "sync" + "time" + + "golang.org/x/sys/unix" +) + +// Watcher watches a set of files, delivering events to a channel. +type Watcher struct { + Events chan Event + Errors chan error + done chan struct{} // Channel for sending a "quit message" to the reader goroutine + + kq int // File descriptor (as returned by the kqueue() syscall). + + mu sync.Mutex // Protects access to watcher data + watches map[string]int // Map of watched file descriptors (key: path). + externalWatches map[string]bool // Map of watches added by user of the library. + dirFlags map[string]uint32 // Map of watched directories to fflags used in kqueue. + paths map[int]pathInfo // Map file descriptors to path names for processing kqueue events. + fileExists map[string]bool // Keep track of if we know this file exists (to stop duplicate create events). + isClosed bool // Set to true when Close() is first called +} + +type pathInfo struct { + name string + isDir bool +} + +// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events. +func NewWatcher() (*Watcher, error) { + kq, err := kqueue() + if err != nil { + return nil, err + } + + w := &Watcher{ + kq: kq, + watches: make(map[string]int), + dirFlags: make(map[string]uint32), + paths: make(map[int]pathInfo), + fileExists: make(map[string]bool), + externalWatches: make(map[string]bool), + Events: make(chan Event), + Errors: make(chan error), + done: make(chan struct{}), + } + + go w.readEvents() + return w, nil +} + +// Close removes all watches and closes the events channel. +func (w *Watcher) Close() error { + w.mu.Lock() + if w.isClosed { + w.mu.Unlock() + return nil + } + w.isClosed = true + + // copy paths to remove while locked + var pathsToRemove = make([]string, 0, len(w.watches)) + for name := range w.watches { + pathsToRemove = append(pathsToRemove, name) + } + w.mu.Unlock() + // unlock before calling Remove, which also locks + + for _, name := range pathsToRemove { + w.Remove(name) + } + + // send a "quit" message to the reader goroutine + close(w.done) + + return nil +} + +// Add starts watching the named file or directory (non-recursively). +func (w *Watcher) Add(name string) error { + w.mu.Lock() + w.externalWatches[name] = true + w.mu.Unlock() + _, err := w.addWatch(name, noteAllEvents) + return err +} + +// Remove stops watching the the named file or directory (non-recursively). +func (w *Watcher) Remove(name string) error { + name = filepath.Clean(name) + w.mu.Lock() + watchfd, ok := w.watches[name] + w.mu.Unlock() + if !ok { + return fmt.Errorf("can't remove non-existent kevent watch for: %s", name) + } + + const registerRemove = unix.EV_DELETE + if err := register(w.kq, []int{watchfd}, registerRemove, 0); err != nil { + return err + } + + unix.Close(watchfd) + + w.mu.Lock() + isDir := w.paths[watchfd].isDir + delete(w.watches, name) + delete(w.paths, watchfd) + delete(w.dirFlags, name) + w.mu.Unlock() + + // Find all watched paths that are in this directory that are not external. + if isDir { + var pathsToRemove []string + w.mu.Lock() + for _, path := range w.paths { + wdir, _ := filepath.Split(path.name) + if filepath.Clean(wdir) == name { + if !w.externalWatches[path.name] { + pathsToRemove = append(pathsToRemove, path.name) + } + } + } + w.mu.Unlock() + for _, name := range pathsToRemove { + // Since these are internal, not much sense in propagating error + // to the user, as that will just confuse them with an error about + // a path they did not explicitly watch themselves. + w.Remove(name) + } + } + + return nil +} + +// Watch all events (except NOTE_EXTEND, NOTE_LINK, NOTE_REVOKE) +const noteAllEvents = unix.NOTE_DELETE | unix.NOTE_WRITE | unix.NOTE_ATTRIB | unix.NOTE_RENAME + +// keventWaitTime to block on each read from kevent +var keventWaitTime = durationToTimespec(100 * time.Millisecond) + +// addWatch adds name to the watched file set. +// The flags are interpreted as described in kevent(2). +// Returns the real path to the file which was added, if any, which may be different from the one passed in the case of symlinks. +func (w *Watcher) addWatch(name string, flags uint32) (string, error) { + var isDir bool + // Make ./name and name equivalent + name = filepath.Clean(name) + + w.mu.Lock() + if w.isClosed { + w.mu.Unlock() + return "", errors.New("kevent instance already closed") + } + watchfd, alreadyWatching := w.watches[name] + // We already have a watch, but we can still override flags. + if alreadyWatching { + isDir = w.paths[watchfd].isDir + } + w.mu.Unlock() + + if !alreadyWatching { + fi, err := os.Lstat(name) + if err != nil { + return "", err + } + + // Don't watch sockets. + if fi.Mode()&os.ModeSocket == os.ModeSocket { + return "", nil + } + + // Don't watch named pipes. + if fi.Mode()&os.ModeNamedPipe == os.ModeNamedPipe { + return "", nil + } + + // Follow Symlinks + // Unfortunately, Linux can add bogus symlinks to watch list without + // issue, and Windows can't do symlinks period (AFAIK). To maintain + // consistency, we will act like everything is fine. There will simply + // be no file events for broken symlinks. + // Hence the returns of nil on errors. + if fi.Mode()&os.ModeSymlink == os.ModeSymlink { + name, err = filepath.EvalSymlinks(name) + if err != nil { + return "", nil + } + + w.mu.Lock() + _, alreadyWatching = w.watches[name] + w.mu.Unlock() + + if alreadyWatching { + return name, nil + } + + fi, err = os.Lstat(name) + if err != nil { + return "", nil + } + } + + watchfd, err = unix.Open(name, openMode, 0700) + if watchfd == -1 { + return "", err + } + + isDir = fi.IsDir() + } + + const registerAdd = unix.EV_ADD | unix.EV_CLEAR | unix.EV_ENABLE + if err := register(w.kq, []int{watchfd}, registerAdd, flags); err != nil { + unix.Close(watchfd) + return "", err + } + + if !alreadyWatching { + w.mu.Lock() + w.watches[name] = watchfd + w.paths[watchfd] = pathInfo{name: name, isDir: isDir} + w.mu.Unlock() + } + + if isDir { + // Watch the directory if it has not been watched before, + // or if it was watched before, but perhaps only a NOTE_DELETE (watchDirectoryFiles) + w.mu.Lock() + + watchDir := (flags&unix.NOTE_WRITE) == unix.NOTE_WRITE && + (!alreadyWatching || (w.dirFlags[name]&unix.NOTE_WRITE) != unix.NOTE_WRITE) + // Store flags so this watch can be updated later + w.dirFlags[name] = flags + w.mu.Unlock() + + if watchDir { + if err := w.watchDirectoryFiles(name); err != nil { + return "", err + } + } + } + return name, nil +} + +// readEvents reads from kqueue and converts the received kevents into +// Event values that it sends down the Events channel. +func (w *Watcher) readEvents() { + eventBuffer := make([]unix.Kevent_t, 10) + +loop: + for { + // See if there is a message on the "done" channel + select { + case <-w.done: + break loop + default: + } + + // Get new events + kevents, err := read(w.kq, eventBuffer, &keventWaitTime) + // EINTR is okay, the syscall was interrupted before timeout expired. + if err != nil && err != unix.EINTR { + select { + case w.Errors <- err: + case <-w.done: + break loop + } + continue + } + + // Flush the events we received to the Events channel + for len(kevents) > 0 { + kevent := &kevents[0] + watchfd := int(kevent.Ident) + mask := uint32(kevent.Fflags) + w.mu.Lock() + path := w.paths[watchfd] + w.mu.Unlock() + event := newEvent(path.name, mask) + + if path.isDir && !(event.Op&Remove == Remove) { + // Double check to make sure the directory exists. This can happen when + // we do a rm -fr on a recursively watched folders and we receive a + // modification event first but the folder has been deleted and later + // receive the delete event + if _, err := os.Lstat(event.Name); os.IsNotExist(err) { + // mark is as delete event + event.Op |= Remove + } + } + + if event.Op&Rename == Rename || event.Op&Remove == Remove { + w.Remove(event.Name) + w.mu.Lock() + delete(w.fileExists, event.Name) + w.mu.Unlock() + } + + if path.isDir && event.Op&Write == Write && !(event.Op&Remove == Remove) { + w.sendDirectoryChangeEvents(event.Name) + } else { + // Send the event on the Events channel. + select { + case w.Events <- event: + case <-w.done: + break loop + } + } + + if event.Op&Remove == Remove { + // Look for a file that may have overwritten this. + // For example, mv f1 f2 will delete f2, then create f2. + if path.isDir { + fileDir := filepath.Clean(event.Name) + w.mu.Lock() + _, found := w.watches[fileDir] + w.mu.Unlock() + if found { + // make sure the directory exists before we watch for changes. When we + // do a recursive watch and perform rm -fr, the parent directory might + // have gone missing, ignore the missing directory and let the + // upcoming delete event remove the watch from the parent directory. + if _, err := os.Lstat(fileDir); err == nil { + w.sendDirectoryChangeEvents(fileDir) + } + } + } else { + filePath := filepath.Clean(event.Name) + if fileInfo, err := os.Lstat(filePath); err == nil { + w.sendFileCreatedEventIfNew(filePath, fileInfo) + } + } + } + + // Move to next event + kevents = kevents[1:] + } + } + + // cleanup + err := unix.Close(w.kq) + if err != nil { + // only way the previous loop breaks is if w.done was closed so we need to async send to w.Errors. + select { + case w.Errors <- err: + default: + } + } + close(w.Events) + close(w.Errors) +} + +// newEvent returns an platform-independent Event based on kqueue Fflags. +func newEvent(name string, mask uint32) Event { + e := Event{Name: name} + if mask&unix.NOTE_DELETE == unix.NOTE_DELETE { + e.Op |= Remove + } + if mask&unix.NOTE_WRITE == unix.NOTE_WRITE { + e.Op |= Write + } + if mask&unix.NOTE_RENAME == unix.NOTE_RENAME { + e.Op |= Rename + } + if mask&unix.NOTE_ATTRIB == unix.NOTE_ATTRIB { + e.Op |= Chmod + } + return e +} + +func newCreateEvent(name string) Event { + return Event{Name: name, Op: Create} +} + +// watchDirectoryFiles to mimic inotify when adding a watch on a directory +func (w *Watcher) watchDirectoryFiles(dirPath string) error { + // Get all files + files, err := ioutil.ReadDir(dirPath) + if err != nil { + return err + } + + for _, fileInfo := range files { + filePath := filepath.Join(dirPath, fileInfo.Name()) + filePath, err = w.internalWatch(filePath, fileInfo) + if err != nil { + return err + } + + w.mu.Lock() + w.fileExists[filePath] = true + w.mu.Unlock() + } + + return nil +} + +// sendDirectoryEvents searches the directory for newly created files +// and sends them over the event channel. This functionality is to have +// the BSD version of fsnotify match Linux inotify which provides a +// create event for files created in a watched directory. +func (w *Watcher) sendDirectoryChangeEvents(dirPath string) { + // Get all files + files, err := ioutil.ReadDir(dirPath) + if err != nil { + select { + case w.Errors <- err: + case <-w.done: + return + } + } + + // Search for new files + for _, fileInfo := range files { + filePath := filepath.Join(dirPath, fileInfo.Name()) + err := w.sendFileCreatedEventIfNew(filePath, fileInfo) + + if err != nil { + return + } + } +} + +// sendFileCreatedEvent sends a create event if the file isn't already being tracked. +func (w *Watcher) sendFileCreatedEventIfNew(filePath string, fileInfo os.FileInfo) (err error) { + w.mu.Lock() + _, doesExist := w.fileExists[filePath] + w.mu.Unlock() + if !doesExist { + // Send create event + select { + case w.Events <- newCreateEvent(filePath): + case <-w.done: + return + } + } + + // like watchDirectoryFiles (but without doing another ReadDir) + filePath, err = w.internalWatch(filePath, fileInfo) + if err != nil { + return err + } + + w.mu.Lock() + w.fileExists[filePath] = true + w.mu.Unlock() + + return nil +} + +func (w *Watcher) internalWatch(name string, fileInfo os.FileInfo) (string, error) { + if fileInfo.IsDir() { + // mimic Linux providing delete events for subdirectories + // but preserve the flags used if currently watching subdirectory + w.mu.Lock() + flags := w.dirFlags[name] + w.mu.Unlock() + + flags |= unix.NOTE_DELETE | unix.NOTE_RENAME + return w.addWatch(name, flags) + } + + // watch file to mimic Linux inotify + return w.addWatch(name, noteAllEvents) +} + +// kqueue creates a new kernel event queue and returns a descriptor. +func kqueue() (kq int, err error) { + kq, err = unix.Kqueue() + if kq == -1 { + return kq, err + } + return kq, nil +} + +// register events with the queue +func register(kq int, fds []int, flags int, fflags uint32) error { + changes := make([]unix.Kevent_t, len(fds)) + + for i, fd := range fds { + // SetKevent converts int to the platform-specific types: + unix.SetKevent(&changes[i], fd, unix.EVFILT_VNODE, flags) + changes[i].Fflags = fflags + } + + // register the events + success, err := unix.Kevent(kq, changes, nil, nil) + if success == -1 { + return err + } + return nil +} + +// read retrieves pending events, or waits until an event occurs. +// A timeout of nil blocks indefinitely, while 0 polls the queue. +func read(kq int, events []unix.Kevent_t, timeout *unix.Timespec) ([]unix.Kevent_t, error) { + n, err := unix.Kevent(kq, nil, events, timeout) + if err != nil { + return nil, err + } + return events[0:n], nil +} + +// durationToTimespec prepares a timeout value +func durationToTimespec(d time.Duration) unix.Timespec { + return unix.NsecToTimespec(d.Nanoseconds()) +} diff --git a/api/vendor/gopkg.in/fsnotify.v1/open_mode_bsd.go b/api/vendor/gopkg.in/fsnotify.v1/open_mode_bsd.go new file mode 100644 index 0000000..7d8de14 --- /dev/null +++ b/api/vendor/gopkg.in/fsnotify.v1/open_mode_bsd.go @@ -0,0 +1,11 @@ +// 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. + +// +build freebsd openbsd netbsd dragonfly + +package fsnotify + +import "golang.org/x/sys/unix" + +const openMode = unix.O_NONBLOCK | unix.O_RDONLY diff --git a/api/vendor/gopkg.in/fsnotify.v1/open_mode_darwin.go b/api/vendor/gopkg.in/fsnotify.v1/open_mode_darwin.go new file mode 100644 index 0000000..9139e17 --- /dev/null +++ b/api/vendor/gopkg.in/fsnotify.v1/open_mode_darwin.go @@ -0,0 +1,12 @@ +// 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. + +// +build darwin + +package fsnotify + +import "golang.org/x/sys/unix" + +// note: this constant is not defined on BSD +const openMode = unix.O_EVTONLY diff --git a/api/vendor/gopkg.in/fsnotify.v1/windows.go b/api/vendor/gopkg.in/fsnotify.v1/windows.go new file mode 100644 index 0000000..09436f3 --- /dev/null +++ b/api/vendor/gopkg.in/fsnotify.v1/windows.go @@ -0,0 +1,561 @@ +// 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. + +// +build windows + +package fsnotify + +import ( + "errors" + "fmt" + "os" + "path/filepath" + "runtime" + "sync" + "syscall" + "unsafe" +) + +// Watcher watches a set of files, delivering events to a channel. +type Watcher struct { + Events chan Event + Errors chan error + isClosed bool // Set to true when Close() is first called + mu sync.Mutex // Map access + port syscall.Handle // Handle to completion port + watches watchMap // Map of watches (key: i-number) + input chan *input // Inputs to the reader are sent on this channel + quit chan chan<- error +} + +// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events. +func NewWatcher() (*Watcher, error) { + port, e := syscall.CreateIoCompletionPort(syscall.InvalidHandle, 0, 0, 0) + if e != nil { + return nil, os.NewSyscallError("CreateIoCompletionPort", e) + } + w := &Watcher{ + port: port, + watches: make(watchMap), + input: make(chan *input, 1), + Events: make(chan Event, 50), + Errors: make(chan error), + quit: make(chan chan<- error, 1), + } + go w.readEvents() + return w, nil +} + +// Close removes all watches and closes the events channel. +func (w *Watcher) Close() error { + if w.isClosed { + return nil + } + w.isClosed = true + + // Send "quit" message to the reader goroutine + ch := make(chan error) + w.quit <- ch + if err := w.wakeupReader(); err != nil { + return err + } + return <-ch +} + +// Add starts watching the named file or directory (non-recursively). +func (w *Watcher) Add(name string) error { + if w.isClosed { + return errors.New("watcher already closed") + } + in := &input{ + op: opAddWatch, + path: filepath.Clean(name), + flags: sysFSALLEVENTS, + reply: make(chan error), + } + w.input <- in + if err := w.wakeupReader(); err != nil { + return err + } + return <-in.reply +} + +// Remove stops watching the the named file or directory (non-recursively). +func (w *Watcher) Remove(name string) error { + in := &input{ + op: opRemoveWatch, + path: filepath.Clean(name), + reply: make(chan error), + } + w.input <- in + if err := w.wakeupReader(); err != nil { + return err + } + return <-in.reply +} + +const ( + // Options for AddWatch + sysFSONESHOT = 0x80000000 + sysFSONLYDIR = 0x1000000 + + // Events + sysFSACCESS = 0x1 + sysFSALLEVENTS = 0xfff + sysFSATTRIB = 0x4 + sysFSCLOSE = 0x18 + sysFSCREATE = 0x100 + sysFSDELETE = 0x200 + sysFSDELETESELF = 0x400 + sysFSMODIFY = 0x2 + sysFSMOVE = 0xc0 + sysFSMOVEDFROM = 0x40 + sysFSMOVEDTO = 0x80 + sysFSMOVESELF = 0x800 + + // Special events + sysFSIGNORED = 0x8000 + sysFSQOVERFLOW = 0x4000 +) + +func newEvent(name string, mask uint32) Event { + e := Event{Name: name} + if mask&sysFSCREATE == sysFSCREATE || mask&sysFSMOVEDTO == sysFSMOVEDTO { + e.Op |= Create + } + if mask&sysFSDELETE == sysFSDELETE || mask&sysFSDELETESELF == sysFSDELETESELF { + e.Op |= Remove + } + if mask&sysFSMODIFY == sysFSMODIFY { + e.Op |= Write + } + if mask&sysFSMOVE == sysFSMOVE || mask&sysFSMOVESELF == sysFSMOVESELF || mask&sysFSMOVEDFROM == sysFSMOVEDFROM { + e.Op |= Rename + } + if mask&sysFSATTRIB == sysFSATTRIB { + e.Op |= Chmod + } + return e +} + +const ( + opAddWatch = iota + opRemoveWatch +) + +const ( + provisional uint64 = 1 << (32 + iota) +) + +type input struct { + op int + path string + flags uint32 + reply chan error +} + +type inode struct { + handle syscall.Handle + volume uint32 + index uint64 +} + +type watch struct { + ov syscall.Overlapped + ino *inode // i-number + path string // Directory path + mask uint64 // Directory itself is being watched with these notify flags + names map[string]uint64 // Map of names being watched and their notify flags + rename string // Remembers the old name while renaming a file + buf [4096]byte +} + +type indexMap map[uint64]*watch +type watchMap map[uint32]indexMap + +func (w *Watcher) wakeupReader() error { + e := syscall.PostQueuedCompletionStatus(w.port, 0, 0, nil) + if e != nil { + return os.NewSyscallError("PostQueuedCompletionStatus", e) + } + return nil +} + +func getDir(pathname string) (dir string, err error) { + attr, e := syscall.GetFileAttributes(syscall.StringToUTF16Ptr(pathname)) + if e != nil { + return "", os.NewSyscallError("GetFileAttributes", e) + } + if attr&syscall.FILE_ATTRIBUTE_DIRECTORY != 0 { + dir = pathname + } else { + dir, _ = filepath.Split(pathname) + dir = filepath.Clean(dir) + } + return +} + +func getIno(path string) (ino *inode, err error) { + h, e := syscall.CreateFile(syscall.StringToUTF16Ptr(path), + syscall.FILE_LIST_DIRECTORY, + syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE, + nil, syscall.OPEN_EXISTING, + syscall.FILE_FLAG_BACKUP_SEMANTICS|syscall.FILE_FLAG_OVERLAPPED, 0) + if e != nil { + return nil, os.NewSyscallError("CreateFile", e) + } + var fi syscall.ByHandleFileInformation + if e = syscall.GetFileInformationByHandle(h, &fi); e != nil { + syscall.CloseHandle(h) + return nil, os.NewSyscallError("GetFileInformationByHandle", e) + } + ino = &inode{ + handle: h, + volume: fi.VolumeSerialNumber, + index: uint64(fi.FileIndexHigh)<<32 | uint64(fi.FileIndexLow), + } + return ino, nil +} + +// Must run within the I/O thread. +func (m watchMap) get(ino *inode) *watch { + if i := m[ino.volume]; i != nil { + return i[ino.index] + } + return nil +} + +// Must run within the I/O thread. +func (m watchMap) set(ino *inode, watch *watch) { + i := m[ino.volume] + if i == nil { + i = make(indexMap) + m[ino.volume] = i + } + i[ino.index] = watch +} + +// Must run within the I/O thread. +func (w *Watcher) addWatch(pathname string, flags uint64) error { + dir, err := getDir(pathname) + if err != nil { + return err + } + if flags&sysFSONLYDIR != 0 && pathname != dir { + return nil + } + ino, err := getIno(dir) + if err != nil { + return err + } + w.mu.Lock() + watchEntry := w.watches.get(ino) + w.mu.Unlock() + if watchEntry == nil { + if _, e := syscall.CreateIoCompletionPort(ino.handle, w.port, 0, 0); e != nil { + syscall.CloseHandle(ino.handle) + return os.NewSyscallError("CreateIoCompletionPort", e) + } + watchEntry = &watch{ + ino: ino, + path: dir, + names: make(map[string]uint64), + } + w.mu.Lock() + w.watches.set(ino, watchEntry) + w.mu.Unlock() + flags |= provisional + } else { + syscall.CloseHandle(ino.handle) + } + if pathname == dir { + watchEntry.mask |= flags + } else { + watchEntry.names[filepath.Base(pathname)] |= flags + } + if err = w.startRead(watchEntry); err != nil { + return err + } + if pathname == dir { + watchEntry.mask &= ^provisional + } else { + watchEntry.names[filepath.Base(pathname)] &= ^provisional + } + return nil +} + +// Must run within the I/O thread. +func (w *Watcher) remWatch(pathname string) error { + dir, err := getDir(pathname) + if err != nil { + return err + } + ino, err := getIno(dir) + if err != nil { + return err + } + w.mu.Lock() + watch := w.watches.get(ino) + w.mu.Unlock() + if watch == nil { + return fmt.Errorf("can't remove non-existent watch for: %s", pathname) + } + if pathname == dir { + w.sendEvent(watch.path, watch.mask&sysFSIGNORED) + watch.mask = 0 + } else { + name := filepath.Base(pathname) + w.sendEvent(filepath.Join(watch.path, name), watch.names[name]&sysFSIGNORED) + delete(watch.names, name) + } + return w.startRead(watch) +} + +// Must run within the I/O thread. +func (w *Watcher) deleteWatch(watch *watch) { + for name, mask := range watch.names { + if mask&provisional == 0 { + w.sendEvent(filepath.Join(watch.path, name), mask&sysFSIGNORED) + } + delete(watch.names, name) + } + if watch.mask != 0 { + if watch.mask&provisional == 0 { + w.sendEvent(watch.path, watch.mask&sysFSIGNORED) + } + watch.mask = 0 + } +} + +// Must run within the I/O thread. +func (w *Watcher) startRead(watch *watch) error { + if e := syscall.CancelIo(watch.ino.handle); e != nil { + w.Errors <- os.NewSyscallError("CancelIo", e) + w.deleteWatch(watch) + } + mask := toWindowsFlags(watch.mask) + for _, m := range watch.names { + mask |= toWindowsFlags(m) + } + if mask == 0 { + if e := syscall.CloseHandle(watch.ino.handle); e != nil { + w.Errors <- os.NewSyscallError("CloseHandle", e) + } + w.mu.Lock() + delete(w.watches[watch.ino.volume], watch.ino.index) + w.mu.Unlock() + return nil + } + e := syscall.ReadDirectoryChanges(watch.ino.handle, &watch.buf[0], + uint32(unsafe.Sizeof(watch.buf)), false, mask, nil, &watch.ov, 0) + if e != nil { + err := os.NewSyscallError("ReadDirectoryChanges", e) + if e == syscall.ERROR_ACCESS_DENIED && watch.mask&provisional == 0 { + // Watched directory was probably removed + if w.sendEvent(watch.path, watch.mask&sysFSDELETESELF) { + if watch.mask&sysFSONESHOT != 0 { + watch.mask = 0 + } + } + err = nil + } + w.deleteWatch(watch) + w.startRead(watch) + return err + } + return nil +} + +// readEvents reads from the I/O completion port, converts the +// received events into Event objects and sends them via the Events channel. +// Entry point to the I/O thread. +func (w *Watcher) readEvents() { + var ( + n, key uint32 + ov *syscall.Overlapped + ) + runtime.LockOSThread() + + for { + e := syscall.GetQueuedCompletionStatus(w.port, &n, &key, &ov, syscall.INFINITE) + watch := (*watch)(unsafe.Pointer(ov)) + + if watch == nil { + select { + case ch := <-w.quit: + w.mu.Lock() + var indexes []indexMap + for _, index := range w.watches { + indexes = append(indexes, index) + } + w.mu.Unlock() + for _, index := range indexes { + for _, watch := range index { + w.deleteWatch(watch) + w.startRead(watch) + } + } + var err error + if e := syscall.CloseHandle(w.port); e != nil { + err = os.NewSyscallError("CloseHandle", e) + } + close(w.Events) + close(w.Errors) + ch <- err + return + case in := <-w.input: + switch in.op { + case opAddWatch: + in.reply <- w.addWatch(in.path, uint64(in.flags)) + case opRemoveWatch: + in.reply <- w.remWatch(in.path) + } + default: + } + continue + } + + switch e { + case syscall.ERROR_MORE_DATA: + if watch == nil { + w.Errors <- errors.New("ERROR_MORE_DATA has unexpectedly null lpOverlapped buffer") + } else { + // The i/o succeeded but the buffer is full. + // In theory we should be building up a full packet. + // In practice we can get away with just carrying on. + n = uint32(unsafe.Sizeof(watch.buf)) + } + case syscall.ERROR_ACCESS_DENIED: + // Watched directory was probably removed + w.sendEvent(watch.path, watch.mask&sysFSDELETESELF) + w.deleteWatch(watch) + w.startRead(watch) + continue + case syscall.ERROR_OPERATION_ABORTED: + // CancelIo was called on this handle + continue + default: + w.Errors <- os.NewSyscallError("GetQueuedCompletionPort", e) + continue + case nil: + } + + var offset uint32 + for { + if n == 0 { + w.Events <- newEvent("", sysFSQOVERFLOW) + w.Errors <- errors.New("short read in readEvents()") + break + } + + // Point "raw" to the event in the buffer + raw := (*syscall.FileNotifyInformation)(unsafe.Pointer(&watch.buf[offset])) + buf := (*[syscall.MAX_PATH]uint16)(unsafe.Pointer(&raw.FileName)) + name := syscall.UTF16ToString(buf[:raw.FileNameLength/2]) + fullname := filepath.Join(watch.path, name) + + var mask uint64 + switch raw.Action { + case syscall.FILE_ACTION_REMOVED: + mask = sysFSDELETESELF + case syscall.FILE_ACTION_MODIFIED: + mask = sysFSMODIFY + case syscall.FILE_ACTION_RENAMED_OLD_NAME: + watch.rename = name + case syscall.FILE_ACTION_RENAMED_NEW_NAME: + if watch.names[watch.rename] != 0 { + watch.names[name] |= watch.names[watch.rename] + delete(watch.names, watch.rename) + mask = sysFSMOVESELF + } + } + + sendNameEvent := func() { + if w.sendEvent(fullname, watch.names[name]&mask) { + if watch.names[name]&sysFSONESHOT != 0 { + delete(watch.names, name) + } + } + } + if raw.Action != syscall.FILE_ACTION_RENAMED_NEW_NAME { + sendNameEvent() + } + if raw.Action == syscall.FILE_ACTION_REMOVED { + w.sendEvent(fullname, watch.names[name]&sysFSIGNORED) + delete(watch.names, name) + } + if w.sendEvent(fullname, watch.mask&toFSnotifyFlags(raw.Action)) { + if watch.mask&sysFSONESHOT != 0 { + watch.mask = 0 + } + } + if raw.Action == syscall.FILE_ACTION_RENAMED_NEW_NAME { + fullname = filepath.Join(watch.path, watch.rename) + sendNameEvent() + } + + // Move to the next event in the buffer + if raw.NextEntryOffset == 0 { + break + } + offset += raw.NextEntryOffset + + // Error! + if offset >= n { + w.Errors <- errors.New("Windows system assumed buffer larger than it is, events have likely been missed.") + break + } + } + + if err := w.startRead(watch); err != nil { + w.Errors <- err + } + } +} + +func (w *Watcher) sendEvent(name string, mask uint64) bool { + if mask == 0 { + return false + } + event := newEvent(name, uint32(mask)) + select { + case ch := <-w.quit: + w.quit <- ch + case w.Events <- event: + } + return true +} + +func toWindowsFlags(mask uint64) uint32 { + var m uint32 + if mask&sysFSACCESS != 0 { + m |= syscall.FILE_NOTIFY_CHANGE_LAST_ACCESS + } + if mask&sysFSMODIFY != 0 { + m |= syscall.FILE_NOTIFY_CHANGE_LAST_WRITE + } + if mask&sysFSATTRIB != 0 { + m |= syscall.FILE_NOTIFY_CHANGE_ATTRIBUTES + } + if mask&(sysFSMOVE|sysFSCREATE|sysFSDELETE) != 0 { + m |= syscall.FILE_NOTIFY_CHANGE_FILE_NAME | syscall.FILE_NOTIFY_CHANGE_DIR_NAME + } + return m +} + +func toFSnotifyFlags(action uint32) uint64 { + switch action { + case syscall.FILE_ACTION_ADDED: + return sysFSCREATE + case syscall.FILE_ACTION_REMOVED: + return sysFSDELETE + case syscall.FILE_ACTION_MODIFIED: + return sysFSMODIFY + case syscall.FILE_ACTION_RENAMED_OLD_NAME: + return sysFSMOVEDFROM + case syscall.FILE_ACTION_RENAMED_NEW_NAME: + return sysFSMOVEDTO + } + return 0 +} diff --git a/api/vendor/gopkg.in/yaml.v2/.travis.yml b/api/vendor/gopkg.in/yaml.v2/.travis.yml new file mode 100644 index 0000000..9f55693 --- /dev/null +++ b/api/vendor/gopkg.in/yaml.v2/.travis.yml @@ -0,0 +1,12 @@ +language: go + +go: + - 1.4 + - 1.5 + - 1.6 + - 1.7 + - 1.8 + - 1.9 + - tip + +go_import_path: gopkg.in/yaml.v2 diff --git a/api/vendor/gopkg.in/yaml.v2/LICENSE b/api/vendor/gopkg.in/yaml.v2/LICENSE new file mode 100644 index 0000000..8dada3e --- /dev/null +++ b/api/vendor/gopkg.in/yaml.v2/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 {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/api/vendor/gopkg.in/yaml.v2/LICENSE.libyaml b/api/vendor/gopkg.in/yaml.v2/LICENSE.libyaml new file mode 100644 index 0000000..8da58fb --- /dev/null +++ b/api/vendor/gopkg.in/yaml.v2/LICENSE.libyaml @@ -0,0 +1,31 @@ +The following files were ported to Go from C files of libyaml, and thus +are still covered by their original copyright and license: + + apic.go + emitterc.go + parserc.go + readerc.go + scannerc.go + writerc.go + yamlh.go + yamlprivateh.go + +Copyright (c) 2006 Kirill Simonov + +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/api/vendor/gopkg.in/yaml.v2/NOTICE b/api/vendor/gopkg.in/yaml.v2/NOTICE new file mode 100644 index 0000000..866d74a --- /dev/null +++ b/api/vendor/gopkg.in/yaml.v2/NOTICE @@ -0,0 +1,13 @@ +Copyright 2011-2016 Canonical Ltd. + +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/api/vendor/gopkg.in/yaml.v2/README.md b/api/vendor/gopkg.in/yaml.v2/README.md new file mode 100644 index 0000000..b50c6e8 --- /dev/null +++ b/api/vendor/gopkg.in/yaml.v2/README.md @@ -0,0 +1,133 @@ +# YAML support for the Go language + +Introduction +------------ + +The yaml package enables Go programs to comfortably encode and decode YAML +values. It was developed within [Canonical](https://www.canonical.com) as +part of the [juju](https://juju.ubuntu.com) project, and is based on a +pure Go port of the well-known [libyaml](http://pyyaml.org/wiki/LibYAML) +C library to parse and generate YAML data quickly and reliably. + +Compatibility +------------- + +The yaml package supports most of YAML 1.1 and 1.2, including support for +anchors, tags, map merging, etc. Multi-document unmarshalling is not yet +implemented, and base-60 floats from YAML 1.1 are purposefully not +supported since they're a poor design and are gone in YAML 1.2. + +Installation and usage +---------------------- + +The import path for the package is *gopkg.in/yaml.v2*. + +To install it, run: + + go get gopkg.in/yaml.v2 + +API documentation +----------------- + +If opened in a browser, the import path itself leads to the API documentation: + + * [https://gopkg.in/yaml.v2](https://gopkg.in/yaml.v2) + +API stability +------------- + +The package API for yaml v2 will remain stable as described in [gopkg.in](https://gopkg.in). + + +License +------- + +The yaml package is licensed under the Apache License 2.0. Please see the LICENSE file for details. + + +Example +------- + +```Go +package main + +import ( + "fmt" + "log" + + "gopkg.in/yaml.v2" +) + +var data = ` +a: Easy! +b: + c: 2 + d: [3, 4] +` + +// Note: struct fields must be public in order for unmarshal to +// correctly populate the data. +type T struct { + A string + B struct { + RenamedC int `yaml:"c"` + D []int `yaml:",flow"` + } +} + +func main() { + t := T{} + + err := yaml.Unmarshal([]byte(data), &t) + if err != nil { + log.Fatalf("error: %v", err) + } + fmt.Printf("--- t:\n%v\n\n", t) + + d, err := yaml.Marshal(&t) + if err != nil { + log.Fatalf("error: %v", err) + } + fmt.Printf("--- t dump:\n%s\n\n", string(d)) + + m := make(map[interface{}]interface{}) + + err = yaml.Unmarshal([]byte(data), &m) + if err != nil { + log.Fatalf("error: %v", err) + } + fmt.Printf("--- m:\n%v\n\n", m) + + d, err = yaml.Marshal(&m) + if err != nil { + log.Fatalf("error: %v", err) + } + fmt.Printf("--- m dump:\n%s\n\n", string(d)) +} +``` + +This example will generate the following output: + +``` +--- t: +{Easy! {2 [3 4]}} + +--- t dump: +a: Easy! +b: + c: 2 + d: [3, 4] + + +--- m: +map[a:Easy! b:map[c:2 d:[3 4]]] + +--- m dump: +a: Easy! +b: + c: 2 + d: + - 3 + - 4 +``` + diff --git a/api/vendor/gopkg.in/yaml.v2/apic.go b/api/vendor/gopkg.in/yaml.v2/apic.go new file mode 100644 index 0000000..1f7e87e --- /dev/null +++ b/api/vendor/gopkg.in/yaml.v2/apic.go @@ -0,0 +1,739 @@ +package yaml + +import ( + "io" +) + +func yaml_insert_token(parser *yaml_parser_t, pos int, token *yaml_token_t) { + //fmt.Println("yaml_insert_token", "pos:", pos, "typ:", token.typ, "head:", parser.tokens_head, "len:", len(parser.tokens)) + + // Check if we can move the queue at the beginning of the buffer. + if parser.tokens_head > 0 && len(parser.tokens) == cap(parser.tokens) { + if parser.tokens_head != len(parser.tokens) { + copy(parser.tokens, parser.tokens[parser.tokens_head:]) + } + parser.tokens = parser.tokens[:len(parser.tokens)-parser.tokens_head] + parser.tokens_head = 0 + } + parser.tokens = append(parser.tokens, *token) + if pos < 0 { + return + } + copy(parser.tokens[parser.tokens_head+pos+1:], parser.tokens[parser.tokens_head+pos:]) + parser.tokens[parser.tokens_head+pos] = *token +} + +// Create a new parser object. +func yaml_parser_initialize(parser *yaml_parser_t) bool { + *parser = yaml_parser_t{ + raw_buffer: make([]byte, 0, input_raw_buffer_size), + buffer: make([]byte, 0, input_buffer_size), + } + return true +} + +// Destroy a parser object. +func yaml_parser_delete(parser *yaml_parser_t) { + *parser = yaml_parser_t{} +} + +// String read handler. +func yaml_string_read_handler(parser *yaml_parser_t, buffer []byte) (n int, err error) { + if parser.input_pos == len(parser.input) { + return 0, io.EOF + } + n = copy(buffer, parser.input[parser.input_pos:]) + parser.input_pos += n + return n, nil +} + +// Reader read handler. +func yaml_reader_read_handler(parser *yaml_parser_t, buffer []byte) (n int, err error) { + return parser.input_reader.Read(buffer) +} + +// Set a string input. +func yaml_parser_set_input_string(parser *yaml_parser_t, input []byte) { + if parser.read_handler != nil { + panic("must set the input source only once") + } + parser.read_handler = yaml_string_read_handler + parser.input = input + parser.input_pos = 0 +} + +// Set a file input. +func yaml_parser_set_input_reader(parser *yaml_parser_t, r io.Reader) { + if parser.read_handler != nil { + panic("must set the input source only once") + } + parser.read_handler = yaml_reader_read_handler + parser.input_reader = r +} + +// Set the source encoding. +func yaml_parser_set_encoding(parser *yaml_parser_t, encoding yaml_encoding_t) { + if parser.encoding != yaml_ANY_ENCODING { + panic("must set the encoding only once") + } + parser.encoding = encoding +} + +// Create a new emitter object. +func yaml_emitter_initialize(emitter *yaml_emitter_t) { + *emitter = yaml_emitter_t{ + buffer: make([]byte, output_buffer_size), + raw_buffer: make([]byte, 0, output_raw_buffer_size), + states: make([]yaml_emitter_state_t, 0, initial_stack_size), + events: make([]yaml_event_t, 0, initial_queue_size), + } +} + +// Destroy an emitter object. +func yaml_emitter_delete(emitter *yaml_emitter_t) { + *emitter = yaml_emitter_t{} +} + +// String write handler. +func yaml_string_write_handler(emitter *yaml_emitter_t, buffer []byte) error { + *emitter.output_buffer = append(*emitter.output_buffer, buffer...) + return nil +} + +// yaml_writer_write_handler uses emitter.output_writer to write the +// emitted text. +func yaml_writer_write_handler(emitter *yaml_emitter_t, buffer []byte) error { + _, err := emitter.output_writer.Write(buffer) + return err +} + +// Set a string output. +func yaml_emitter_set_output_string(emitter *yaml_emitter_t, output_buffer *[]byte) { + if emitter.write_handler != nil { + panic("must set the output target only once") + } + emitter.write_handler = yaml_string_write_handler + emitter.output_buffer = output_buffer +} + +// Set a file output. +func yaml_emitter_set_output_writer(emitter *yaml_emitter_t, w io.Writer) { + if emitter.write_handler != nil { + panic("must set the output target only once") + } + emitter.write_handler = yaml_writer_write_handler + emitter.output_writer = w +} + +// Set the output encoding. +func yaml_emitter_set_encoding(emitter *yaml_emitter_t, encoding yaml_encoding_t) { + if emitter.encoding != yaml_ANY_ENCODING { + panic("must set the output encoding only once") + } + emitter.encoding = encoding +} + +// Set the canonical output style. +func yaml_emitter_set_canonical(emitter *yaml_emitter_t, canonical bool) { + emitter.canonical = canonical +} + +//// Set the indentation increment. +func yaml_emitter_set_indent(emitter *yaml_emitter_t, indent int) { + if indent < 2 || indent > 9 { + indent = 2 + } + emitter.best_indent = indent +} + +// Set the preferred line width. +func yaml_emitter_set_width(emitter *yaml_emitter_t, width int) { + if width < 0 { + width = -1 + } + emitter.best_width = width +} + +// Set if unescaped non-ASCII characters are allowed. +func yaml_emitter_set_unicode(emitter *yaml_emitter_t, unicode bool) { + emitter.unicode = unicode +} + +// Set the preferred line break character. +func yaml_emitter_set_break(emitter *yaml_emitter_t, line_break yaml_break_t) { + emitter.line_break = line_break +} + +///* +// * Destroy a token object. +// */ +// +//YAML_DECLARE(void) +//yaml_token_delete(yaml_token_t *token) +//{ +// assert(token); // Non-NULL token object expected. +// +// switch (token.type) +// { +// case YAML_TAG_DIRECTIVE_TOKEN: +// yaml_free(token.data.tag_directive.handle); +// yaml_free(token.data.tag_directive.prefix); +// break; +// +// case YAML_ALIAS_TOKEN: +// yaml_free(token.data.alias.value); +// break; +// +// case YAML_ANCHOR_TOKEN: +// yaml_free(token.data.anchor.value); +// break; +// +// case YAML_TAG_TOKEN: +// yaml_free(token.data.tag.handle); +// yaml_free(token.data.tag.suffix); +// break; +// +// case YAML_SCALAR_TOKEN: +// yaml_free(token.data.scalar.value); +// break; +// +// default: +// break; +// } +// +// memset(token, 0, sizeof(yaml_token_t)); +//} +// +///* +// * Check if a string is a valid UTF-8 sequence. +// * +// * Check 'reader.c' for more details on UTF-8 encoding. +// */ +// +//static int +//yaml_check_utf8(yaml_char_t *start, size_t length) +//{ +// yaml_char_t *end = start+length; +// yaml_char_t *pointer = start; +// +// while (pointer < end) { +// unsigned char octet; +// unsigned int width; +// unsigned int value; +// size_t k; +// +// octet = pointer[0]; +// width = (octet & 0x80) == 0x00 ? 1 : +// (octet & 0xE0) == 0xC0 ? 2 : +// (octet & 0xF0) == 0xE0 ? 3 : +// (octet & 0xF8) == 0xF0 ? 4 : 0; +// value = (octet & 0x80) == 0x00 ? octet & 0x7F : +// (octet & 0xE0) == 0xC0 ? octet & 0x1F : +// (octet & 0xF0) == 0xE0 ? octet & 0x0F : +// (octet & 0xF8) == 0xF0 ? octet & 0x07 : 0; +// if (!width) return 0; +// if (pointer+width > end) return 0; +// for (k = 1; k < width; k ++) { +// octet = pointer[k]; +// if ((octet & 0xC0) != 0x80) return 0; +// value = (value << 6) + (octet & 0x3F); +// } +// if (!((width == 1) || +// (width == 2 && value >= 0x80) || +// (width == 3 && value >= 0x800) || +// (width == 4 && value >= 0x10000))) return 0; +// +// pointer += width; +// } +// +// return 1; +//} +// + +// Create STREAM-START. +func yaml_stream_start_event_initialize(event *yaml_event_t, encoding yaml_encoding_t) { + *event = yaml_event_t{ + typ: yaml_STREAM_START_EVENT, + encoding: encoding, + } +} + +// Create STREAM-END. +func yaml_stream_end_event_initialize(event *yaml_event_t) { + *event = yaml_event_t{ + typ: yaml_STREAM_END_EVENT, + } +} + +// Create DOCUMENT-START. +func yaml_document_start_event_initialize( + event *yaml_event_t, + version_directive *yaml_version_directive_t, + tag_directives []yaml_tag_directive_t, + implicit bool, +) { + *event = yaml_event_t{ + typ: yaml_DOCUMENT_START_EVENT, + version_directive: version_directive, + tag_directives: tag_directives, + implicit: implicit, + } +} + +// Create DOCUMENT-END. +func yaml_document_end_event_initialize(event *yaml_event_t, implicit bool) { + *event = yaml_event_t{ + typ: yaml_DOCUMENT_END_EVENT, + implicit: implicit, + } +} + +///* +// * Create ALIAS. +// */ +// +//YAML_DECLARE(int) +//yaml_alias_event_initialize(event *yaml_event_t, anchor *yaml_char_t) +//{ +// mark yaml_mark_t = { 0, 0, 0 } +// anchor_copy *yaml_char_t = NULL +// +// assert(event) // Non-NULL event object is expected. +// assert(anchor) // Non-NULL anchor is expected. +// +// if (!yaml_check_utf8(anchor, strlen((char *)anchor))) return 0 +// +// anchor_copy = yaml_strdup(anchor) +// if (!anchor_copy) +// return 0 +// +// ALIAS_EVENT_INIT(*event, anchor_copy, mark, mark) +// +// return 1 +//} + +// Create SCALAR. +func yaml_scalar_event_initialize(event *yaml_event_t, anchor, tag, value []byte, plain_implicit, quoted_implicit bool, style yaml_scalar_style_t) bool { + *event = yaml_event_t{ + typ: yaml_SCALAR_EVENT, + anchor: anchor, + tag: tag, + value: value, + implicit: plain_implicit, + quoted_implicit: quoted_implicit, + style: yaml_style_t(style), + } + return true +} + +// Create SEQUENCE-START. +func yaml_sequence_start_event_initialize(event *yaml_event_t, anchor, tag []byte, implicit bool, style yaml_sequence_style_t) bool { + *event = yaml_event_t{ + typ: yaml_SEQUENCE_START_EVENT, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(style), + } + return true +} + +// Create SEQUENCE-END. +func yaml_sequence_end_event_initialize(event *yaml_event_t) bool { + *event = yaml_event_t{ + typ: yaml_SEQUENCE_END_EVENT, + } + return true +} + +// Create MAPPING-START. +func yaml_mapping_start_event_initialize(event *yaml_event_t, anchor, tag []byte, implicit bool, style yaml_mapping_style_t) { + *event = yaml_event_t{ + typ: yaml_MAPPING_START_EVENT, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(style), + } +} + +// Create MAPPING-END. +func yaml_mapping_end_event_initialize(event *yaml_event_t) { + *event = yaml_event_t{ + typ: yaml_MAPPING_END_EVENT, + } +} + +// Destroy an event object. +func yaml_event_delete(event *yaml_event_t) { + *event = yaml_event_t{} +} + +///* +// * Create a document object. +// */ +// +//YAML_DECLARE(int) +//yaml_document_initialize(document *yaml_document_t, +// version_directive *yaml_version_directive_t, +// tag_directives_start *yaml_tag_directive_t, +// tag_directives_end *yaml_tag_directive_t, +// start_implicit int, end_implicit int) +//{ +// struct { +// error yaml_error_type_t +// } context +// struct { +// start *yaml_node_t +// end *yaml_node_t +// top *yaml_node_t +// } nodes = { NULL, NULL, NULL } +// version_directive_copy *yaml_version_directive_t = NULL +// struct { +// start *yaml_tag_directive_t +// end *yaml_tag_directive_t +// top *yaml_tag_directive_t +// } tag_directives_copy = { NULL, NULL, NULL } +// value yaml_tag_directive_t = { NULL, NULL } +// mark yaml_mark_t = { 0, 0, 0 } +// +// assert(document) // Non-NULL document object is expected. +// assert((tag_directives_start && tag_directives_end) || +// (tag_directives_start == tag_directives_end)) +// // Valid tag directives are expected. +// +// if (!STACK_INIT(&context, nodes, INITIAL_STACK_SIZE)) goto error +// +// if (version_directive) { +// version_directive_copy = yaml_malloc(sizeof(yaml_version_directive_t)) +// if (!version_directive_copy) goto error +// version_directive_copy.major = version_directive.major +// version_directive_copy.minor = version_directive.minor +// } +// +// if (tag_directives_start != tag_directives_end) { +// tag_directive *yaml_tag_directive_t +// if (!STACK_INIT(&context, tag_directives_copy, INITIAL_STACK_SIZE)) +// goto error +// for (tag_directive = tag_directives_start +// tag_directive != tag_directives_end; tag_directive ++) { +// assert(tag_directive.handle) +// assert(tag_directive.prefix) +// if (!yaml_check_utf8(tag_directive.handle, +// strlen((char *)tag_directive.handle))) +// goto error +// if (!yaml_check_utf8(tag_directive.prefix, +// strlen((char *)tag_directive.prefix))) +// goto error +// value.handle = yaml_strdup(tag_directive.handle) +// value.prefix = yaml_strdup(tag_directive.prefix) +// if (!value.handle || !value.prefix) goto error +// if (!PUSH(&context, tag_directives_copy, value)) +// goto error +// value.handle = NULL +// value.prefix = NULL +// } +// } +// +// DOCUMENT_INIT(*document, nodes.start, nodes.end, version_directive_copy, +// tag_directives_copy.start, tag_directives_copy.top, +// start_implicit, end_implicit, mark, mark) +// +// return 1 +// +//error: +// STACK_DEL(&context, nodes) +// yaml_free(version_directive_copy) +// while (!STACK_EMPTY(&context, tag_directives_copy)) { +// value yaml_tag_directive_t = POP(&context, tag_directives_copy) +// yaml_free(value.handle) +// yaml_free(value.prefix) +// } +// STACK_DEL(&context, tag_directives_copy) +// yaml_free(value.handle) +// yaml_free(value.prefix) +// +// return 0 +//} +// +///* +// * Destroy a document object. +// */ +// +//YAML_DECLARE(void) +//yaml_document_delete(document *yaml_document_t) +//{ +// struct { +// error yaml_error_type_t +// } context +// tag_directive *yaml_tag_directive_t +// +// context.error = YAML_NO_ERROR // Eliminate a compiler warning. +// +// assert(document) // Non-NULL document object is expected. +// +// while (!STACK_EMPTY(&context, document.nodes)) { +// node yaml_node_t = POP(&context, document.nodes) +// yaml_free(node.tag) +// switch (node.type) { +// case YAML_SCALAR_NODE: +// yaml_free(node.data.scalar.value) +// break +// case YAML_SEQUENCE_NODE: +// STACK_DEL(&context, node.data.sequence.items) +// break +// case YAML_MAPPING_NODE: +// STACK_DEL(&context, node.data.mapping.pairs) +// break +// default: +// assert(0) // Should not happen. +// } +// } +// STACK_DEL(&context, document.nodes) +// +// yaml_free(document.version_directive) +// for (tag_directive = document.tag_directives.start +// tag_directive != document.tag_directives.end +// tag_directive++) { +// yaml_free(tag_directive.handle) +// yaml_free(tag_directive.prefix) +// } +// yaml_free(document.tag_directives.start) +// +// memset(document, 0, sizeof(yaml_document_t)) +//} +// +///** +// * Get a document node. +// */ +// +//YAML_DECLARE(yaml_node_t *) +//yaml_document_get_node(document *yaml_document_t, index int) +//{ +// assert(document) // Non-NULL document object is expected. +// +// if (index > 0 && document.nodes.start + index <= document.nodes.top) { +// return document.nodes.start + index - 1 +// } +// return NULL +//} +// +///** +// * Get the root object. +// */ +// +//YAML_DECLARE(yaml_node_t *) +//yaml_document_get_root_node(document *yaml_document_t) +//{ +// assert(document) // Non-NULL document object is expected. +// +// if (document.nodes.top != document.nodes.start) { +// return document.nodes.start +// } +// return NULL +//} +// +///* +// * Add a scalar node to a document. +// */ +// +//YAML_DECLARE(int) +//yaml_document_add_scalar(document *yaml_document_t, +// tag *yaml_char_t, value *yaml_char_t, length int, +// style yaml_scalar_style_t) +//{ +// struct { +// error yaml_error_type_t +// } context +// mark yaml_mark_t = { 0, 0, 0 } +// tag_copy *yaml_char_t = NULL +// value_copy *yaml_char_t = NULL +// node yaml_node_t +// +// assert(document) // Non-NULL document object is expected. +// assert(value) // Non-NULL value is expected. +// +// if (!tag) { +// tag = (yaml_char_t *)YAML_DEFAULT_SCALAR_TAG +// } +// +// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error +// tag_copy = yaml_strdup(tag) +// if (!tag_copy) goto error +// +// if (length < 0) { +// length = strlen((char *)value) +// } +// +// if (!yaml_check_utf8(value, length)) goto error +// value_copy = yaml_malloc(length+1) +// if (!value_copy) goto error +// memcpy(value_copy, value, length) +// value_copy[length] = '\0' +// +// SCALAR_NODE_INIT(node, tag_copy, value_copy, length, style, mark, mark) +// if (!PUSH(&context, document.nodes, node)) goto error +// +// return document.nodes.top - document.nodes.start +// +//error: +// yaml_free(tag_copy) +// yaml_free(value_copy) +// +// return 0 +//} +// +///* +// * Add a sequence node to a document. +// */ +// +//YAML_DECLARE(int) +//yaml_document_add_sequence(document *yaml_document_t, +// tag *yaml_char_t, style yaml_sequence_style_t) +//{ +// struct { +// error yaml_error_type_t +// } context +// mark yaml_mark_t = { 0, 0, 0 } +// tag_copy *yaml_char_t = NULL +// struct { +// start *yaml_node_item_t +// end *yaml_node_item_t +// top *yaml_node_item_t +// } items = { NULL, NULL, NULL } +// node yaml_node_t +// +// assert(document) // Non-NULL document object is expected. +// +// if (!tag) { +// tag = (yaml_char_t *)YAML_DEFAULT_SEQUENCE_TAG +// } +// +// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error +// tag_copy = yaml_strdup(tag) +// if (!tag_copy) goto error +// +// if (!STACK_INIT(&context, items, INITIAL_STACK_SIZE)) goto error +// +// SEQUENCE_NODE_INIT(node, tag_copy, items.start, items.end, +// style, mark, mark) +// if (!PUSH(&context, document.nodes, node)) goto error +// +// return document.nodes.top - document.nodes.start +// +//error: +// STACK_DEL(&context, items) +// yaml_free(tag_copy) +// +// return 0 +//} +// +///* +// * Add a mapping node to a document. +// */ +// +//YAML_DECLARE(int) +//yaml_document_add_mapping(document *yaml_document_t, +// tag *yaml_char_t, style yaml_mapping_style_t) +//{ +// struct { +// error yaml_error_type_t +// } context +// mark yaml_mark_t = { 0, 0, 0 } +// tag_copy *yaml_char_t = NULL +// struct { +// start *yaml_node_pair_t +// end *yaml_node_pair_t +// top *yaml_node_pair_t +// } pairs = { NULL, NULL, NULL } +// node yaml_node_t +// +// assert(document) // Non-NULL document object is expected. +// +// if (!tag) { +// tag = (yaml_char_t *)YAML_DEFAULT_MAPPING_TAG +// } +// +// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error +// tag_copy = yaml_strdup(tag) +// if (!tag_copy) goto error +// +// if (!STACK_INIT(&context, pairs, INITIAL_STACK_SIZE)) goto error +// +// MAPPING_NODE_INIT(node, tag_copy, pairs.start, pairs.end, +// style, mark, mark) +// if (!PUSH(&context, document.nodes, node)) goto error +// +// return document.nodes.top - document.nodes.start +// +//error: +// STACK_DEL(&context, pairs) +// yaml_free(tag_copy) +// +// return 0 +//} +// +///* +// * Append an item to a sequence node. +// */ +// +//YAML_DECLARE(int) +//yaml_document_append_sequence_item(document *yaml_document_t, +// sequence int, item int) +//{ +// struct { +// error yaml_error_type_t +// } context +// +// assert(document) // Non-NULL document is required. +// assert(sequence > 0 +// && document.nodes.start + sequence <= document.nodes.top) +// // Valid sequence id is required. +// assert(document.nodes.start[sequence-1].type == YAML_SEQUENCE_NODE) +// // A sequence node is required. +// assert(item > 0 && document.nodes.start + item <= document.nodes.top) +// // Valid item id is required. +// +// if (!PUSH(&context, +// document.nodes.start[sequence-1].data.sequence.items, item)) +// return 0 +// +// return 1 +//} +// +///* +// * Append a pair of a key and a value to a mapping node. +// */ +// +//YAML_DECLARE(int) +//yaml_document_append_mapping_pair(document *yaml_document_t, +// mapping int, key int, value int) +//{ +// struct { +// error yaml_error_type_t +// } context +// +// pair yaml_node_pair_t +// +// assert(document) // Non-NULL document is required. +// assert(mapping > 0 +// && document.nodes.start + mapping <= document.nodes.top) +// // Valid mapping id is required. +// assert(document.nodes.start[mapping-1].type == YAML_MAPPING_NODE) +// // A mapping node is required. +// assert(key > 0 && document.nodes.start + key <= document.nodes.top) +// // Valid key id is required. +// assert(value > 0 && document.nodes.start + value <= document.nodes.top) +// // Valid value id is required. +// +// pair.key = key +// pair.value = value +// +// if (!PUSH(&context, +// document.nodes.start[mapping-1].data.mapping.pairs, pair)) +// return 0 +// +// return 1 +//} +// +// diff --git a/api/vendor/gopkg.in/yaml.v2/decode.go b/api/vendor/gopkg.in/yaml.v2/decode.go new file mode 100644 index 0000000..e4e56e2 --- /dev/null +++ b/api/vendor/gopkg.in/yaml.v2/decode.go @@ -0,0 +1,775 @@ +package yaml + +import ( + "encoding" + "encoding/base64" + "fmt" + "io" + "math" + "reflect" + "strconv" + "time" +) + +const ( + documentNode = 1 << iota + mappingNode + sequenceNode + scalarNode + aliasNode +) + +type node struct { + kind int + line, column int + tag string + // For an alias node, alias holds the resolved alias. + alias *node + value string + implicit bool + children []*node + anchors map[string]*node +} + +// ---------------------------------------------------------------------------- +// Parser, produces a node tree out of a libyaml event stream. + +type parser struct { + parser yaml_parser_t + event yaml_event_t + doc *node + doneInit bool +} + +func newParser(b []byte) *parser { + p := parser{} + if !yaml_parser_initialize(&p.parser) { + panic("failed to initialize YAML emitter") + } + if len(b) == 0 { + b = []byte{'\n'} + } + yaml_parser_set_input_string(&p.parser, b) + return &p +} + +func newParserFromReader(r io.Reader) *parser { + p := parser{} + if !yaml_parser_initialize(&p.parser) { + panic("failed to initialize YAML emitter") + } + yaml_parser_set_input_reader(&p.parser, r) + return &p +} + +func (p *parser) init() { + if p.doneInit { + return + } + p.expect(yaml_STREAM_START_EVENT) + p.doneInit = true +} + +func (p *parser) destroy() { + if p.event.typ != yaml_NO_EVENT { + yaml_event_delete(&p.event) + } + yaml_parser_delete(&p.parser) +} + +// expect consumes an event from the event stream and +// checks that it's of the expected type. +func (p *parser) expect(e yaml_event_type_t) { + if p.event.typ == yaml_NO_EVENT { + if !yaml_parser_parse(&p.parser, &p.event) { + p.fail() + } + } + if p.event.typ == yaml_STREAM_END_EVENT { + failf("attempted to go past the end of stream; corrupted value?") + } + if p.event.typ != e { + p.parser.problem = fmt.Sprintf("expected %s event but got %s", e, p.event.typ) + p.fail() + } + yaml_event_delete(&p.event) + p.event.typ = yaml_NO_EVENT +} + +// peek peeks at the next event in the event stream, +// puts the results into p.event and returns the event type. +func (p *parser) peek() yaml_event_type_t { + if p.event.typ != yaml_NO_EVENT { + return p.event.typ + } + if !yaml_parser_parse(&p.parser, &p.event) { + p.fail() + } + return p.event.typ +} + +func (p *parser) fail() { + var where string + var line int + if p.parser.problem_mark.line != 0 { + line = p.parser.problem_mark.line + // Scanner errors don't iterate line before returning error + if p.parser.error == yaml_SCANNER_ERROR { + line++ + } + } else if p.parser.context_mark.line != 0 { + line = p.parser.context_mark.line + } + if line != 0 { + where = "line " + strconv.Itoa(line) + ": " + } + var msg string + if len(p.parser.problem) > 0 { + msg = p.parser.problem + } else { + msg = "unknown problem parsing YAML content" + } + failf("%s%s", where, msg) +} + +func (p *parser) anchor(n *node, anchor []byte) { + if anchor != nil { + p.doc.anchors[string(anchor)] = n + } +} + +func (p *parser) parse() *node { + p.init() + switch p.peek() { + case yaml_SCALAR_EVENT: + return p.scalar() + case yaml_ALIAS_EVENT: + return p.alias() + case yaml_MAPPING_START_EVENT: + return p.mapping() + case yaml_SEQUENCE_START_EVENT: + return p.sequence() + case yaml_DOCUMENT_START_EVENT: + return p.document() + case yaml_STREAM_END_EVENT: + // Happens when attempting to decode an empty buffer. + return nil + default: + panic("attempted to parse unknown event: " + p.event.typ.String()) + } +} + +func (p *parser) node(kind int) *node { + return &node{ + kind: kind, + line: p.event.start_mark.line, + column: p.event.start_mark.column, + } +} + +func (p *parser) document() *node { + n := p.node(documentNode) + n.anchors = make(map[string]*node) + p.doc = n + p.expect(yaml_DOCUMENT_START_EVENT) + n.children = append(n.children, p.parse()) + p.expect(yaml_DOCUMENT_END_EVENT) + return n +} + +func (p *parser) alias() *node { + n := p.node(aliasNode) + n.value = string(p.event.anchor) + n.alias = p.doc.anchors[n.value] + if n.alias == nil { + failf("unknown anchor '%s' referenced", n.value) + } + p.expect(yaml_ALIAS_EVENT) + return n +} + +func (p *parser) scalar() *node { + n := p.node(scalarNode) + n.value = string(p.event.value) + n.tag = string(p.event.tag) + n.implicit = p.event.implicit + p.anchor(n, p.event.anchor) + p.expect(yaml_SCALAR_EVENT) + return n +} + +func (p *parser) sequence() *node { + n := p.node(sequenceNode) + p.anchor(n, p.event.anchor) + p.expect(yaml_SEQUENCE_START_EVENT) + for p.peek() != yaml_SEQUENCE_END_EVENT { + n.children = append(n.children, p.parse()) + } + p.expect(yaml_SEQUENCE_END_EVENT) + return n +} + +func (p *parser) mapping() *node { + n := p.node(mappingNode) + p.anchor(n, p.event.anchor) + p.expect(yaml_MAPPING_START_EVENT) + for p.peek() != yaml_MAPPING_END_EVENT { + n.children = append(n.children, p.parse(), p.parse()) + } + p.expect(yaml_MAPPING_END_EVENT) + return n +} + +// ---------------------------------------------------------------------------- +// Decoder, unmarshals a node into a provided value. + +type decoder struct { + doc *node + aliases map[*node]bool + mapType reflect.Type + terrors []string + strict bool +} + +var ( + mapItemType = reflect.TypeOf(MapItem{}) + durationType = reflect.TypeOf(time.Duration(0)) + defaultMapType = reflect.TypeOf(map[interface{}]interface{}{}) + ifaceType = defaultMapType.Elem() + timeType = reflect.TypeOf(time.Time{}) + ptrTimeType = reflect.TypeOf(&time.Time{}) +) + +func newDecoder(strict bool) *decoder { + d := &decoder{mapType: defaultMapType, strict: strict} + d.aliases = make(map[*node]bool) + return d +} + +func (d *decoder) terror(n *node, tag string, out reflect.Value) { + if n.tag != "" { + tag = n.tag + } + value := n.value + if tag != yaml_SEQ_TAG && tag != yaml_MAP_TAG { + if len(value) > 10 { + value = " `" + value[:7] + "...`" + } else { + value = " `" + value + "`" + } + } + d.terrors = append(d.terrors, fmt.Sprintf("line %d: cannot unmarshal %s%s into %s", n.line+1, shortTag(tag), value, out.Type())) +} + +func (d *decoder) callUnmarshaler(n *node, u Unmarshaler) (good bool) { + terrlen := len(d.terrors) + err := u.UnmarshalYAML(func(v interface{}) (err error) { + defer handleErr(&err) + d.unmarshal(n, reflect.ValueOf(v)) + if len(d.terrors) > terrlen { + issues := d.terrors[terrlen:] + d.terrors = d.terrors[:terrlen] + return &TypeError{issues} + } + return nil + }) + if e, ok := err.(*TypeError); ok { + d.terrors = append(d.terrors, e.Errors...) + return false + } + if err != nil { + fail(err) + } + return true +} + +// d.prepare initializes and dereferences pointers and calls UnmarshalYAML +// if a value is found to implement it. +// It returns the initialized and dereferenced out value, whether +// unmarshalling was already done by UnmarshalYAML, and if so whether +// its types unmarshalled appropriately. +// +// If n holds a null value, prepare returns before doing anything. +func (d *decoder) prepare(n *node, out reflect.Value) (newout reflect.Value, unmarshaled, good bool) { + if n.tag == yaml_NULL_TAG || n.kind == scalarNode && n.tag == "" && (n.value == "null" || n.value == "~" || n.value == "" && n.implicit) { + return out, false, false + } + again := true + for again { + again = false + if out.Kind() == reflect.Ptr { + if out.IsNil() { + out.Set(reflect.New(out.Type().Elem())) + } + out = out.Elem() + again = true + } + if out.CanAddr() { + if u, ok := out.Addr().Interface().(Unmarshaler); ok { + good = d.callUnmarshaler(n, u) + return out, true, good + } + } + } + return out, false, false +} + +func (d *decoder) unmarshal(n *node, out reflect.Value) (good bool) { + switch n.kind { + case documentNode: + return d.document(n, out) + case aliasNode: + return d.alias(n, out) + } + out, unmarshaled, good := d.prepare(n, out) + if unmarshaled { + return good + } + switch n.kind { + case scalarNode: + good = d.scalar(n, out) + case mappingNode: + good = d.mapping(n, out) + case sequenceNode: + good = d.sequence(n, out) + default: + panic("internal error: unknown node kind: " + strconv.Itoa(n.kind)) + } + return good +} + +func (d *decoder) document(n *node, out reflect.Value) (good bool) { + if len(n.children) == 1 { + d.doc = n + d.unmarshal(n.children[0], out) + return true + } + return false +} + +func (d *decoder) alias(n *node, out reflect.Value) (good bool) { + if d.aliases[n] { + // TODO this could actually be allowed in some circumstances. + failf("anchor '%s' value contains itself", n.value) + } + d.aliases[n] = true + good = d.unmarshal(n.alias, out) + delete(d.aliases, n) + return good +} + +var zeroValue reflect.Value + +func resetMap(out reflect.Value) { + for _, k := range out.MapKeys() { + out.SetMapIndex(k, zeroValue) + } +} + +func (d *decoder) scalar(n *node, out reflect.Value) bool { + var tag string + var resolved interface{} + if n.tag == "" && !n.implicit { + tag = yaml_STR_TAG + resolved = n.value + } else { + tag, resolved = resolve(n.tag, n.value) + if tag == yaml_BINARY_TAG { + data, err := base64.StdEncoding.DecodeString(resolved.(string)) + if err != nil { + failf("!!binary value contains invalid base64 data") + } + resolved = string(data) + } + } + if resolved == nil { + if out.Kind() == reflect.Map && !out.CanAddr() { + resetMap(out) + } else { + out.Set(reflect.Zero(out.Type())) + } + return true + } + if resolvedv := reflect.ValueOf(resolved); out.Type() == resolvedv.Type() { + // We've resolved to exactly the type we want, so use that. + out.Set(resolvedv) + return true + } + // Perhaps we can use the value as a TextUnmarshaler to + // set its value. + if out.CanAddr() { + u, ok := out.Addr().Interface().(encoding.TextUnmarshaler) + if ok { + var text []byte + if tag == yaml_BINARY_TAG { + text = []byte(resolved.(string)) + } else { + // We let any value be unmarshaled into TextUnmarshaler. + // That might be more lax than we'd like, but the + // TextUnmarshaler itself should bowl out any dubious values. + text = []byte(n.value) + } + err := u.UnmarshalText(text) + if err != nil { + fail(err) + } + return true + } + } + switch out.Kind() { + case reflect.String: + if tag == yaml_BINARY_TAG { + out.SetString(resolved.(string)) + return true + } + if resolved != nil { + out.SetString(n.value) + return true + } + case reflect.Interface: + if resolved == nil { + out.Set(reflect.Zero(out.Type())) + } else if tag == yaml_TIMESTAMP_TAG { + // It looks like a timestamp but for backward compatibility + // reasons we set it as a string, so that code that unmarshals + // timestamp-like values into interface{} will continue to + // see a string and not a time.Time. + // TODO(v3) Drop this. + out.Set(reflect.ValueOf(n.value)) + } else { + out.Set(reflect.ValueOf(resolved)) + } + return true + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + switch resolved := resolved.(type) { + case int: + if !out.OverflowInt(int64(resolved)) { + out.SetInt(int64(resolved)) + return true + } + case int64: + if !out.OverflowInt(resolved) { + out.SetInt(resolved) + return true + } + case uint64: + if resolved <= math.MaxInt64 && !out.OverflowInt(int64(resolved)) { + out.SetInt(int64(resolved)) + return true + } + case float64: + if resolved <= math.MaxInt64 && !out.OverflowInt(int64(resolved)) { + out.SetInt(int64(resolved)) + return true + } + case string: + if out.Type() == durationType { + d, err := time.ParseDuration(resolved) + if err == nil { + out.SetInt(int64(d)) + return true + } + } + } + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + switch resolved := resolved.(type) { + case int: + if resolved >= 0 && !out.OverflowUint(uint64(resolved)) { + out.SetUint(uint64(resolved)) + return true + } + case int64: + if resolved >= 0 && !out.OverflowUint(uint64(resolved)) { + out.SetUint(uint64(resolved)) + return true + } + case uint64: + if !out.OverflowUint(uint64(resolved)) { + out.SetUint(uint64(resolved)) + return true + } + case float64: + if resolved <= math.MaxUint64 && !out.OverflowUint(uint64(resolved)) { + out.SetUint(uint64(resolved)) + return true + } + } + case reflect.Bool: + switch resolved := resolved.(type) { + case bool: + out.SetBool(resolved) + return true + } + case reflect.Float32, reflect.Float64: + switch resolved := resolved.(type) { + case int: + out.SetFloat(float64(resolved)) + return true + case int64: + out.SetFloat(float64(resolved)) + return true + case uint64: + out.SetFloat(float64(resolved)) + return true + case float64: + out.SetFloat(resolved) + return true + } + case reflect.Struct: + if resolvedv := reflect.ValueOf(resolved); out.Type() == resolvedv.Type() { + out.Set(resolvedv) + return true + } + case reflect.Ptr: + if out.Type().Elem() == reflect.TypeOf(resolved) { + // TODO DOes this make sense? When is out a Ptr except when decoding a nil value? + elem := reflect.New(out.Type().Elem()) + elem.Elem().Set(reflect.ValueOf(resolved)) + out.Set(elem) + return true + } + } + d.terror(n, tag, out) + return false +} + +func settableValueOf(i interface{}) reflect.Value { + v := reflect.ValueOf(i) + sv := reflect.New(v.Type()).Elem() + sv.Set(v) + return sv +} + +func (d *decoder) sequence(n *node, out reflect.Value) (good bool) { + l := len(n.children) + + var iface reflect.Value + switch out.Kind() { + case reflect.Slice: + out.Set(reflect.MakeSlice(out.Type(), l, l)) + case reflect.Array: + if l != out.Len() { + failf("invalid array: want %d elements but got %d", out.Len(), l) + } + case reflect.Interface: + // No type hints. Will have to use a generic sequence. + iface = out + out = settableValueOf(make([]interface{}, l)) + default: + d.terror(n, yaml_SEQ_TAG, out) + return false + } + et := out.Type().Elem() + + j := 0 + for i := 0; i < l; i++ { + e := reflect.New(et).Elem() + if ok := d.unmarshal(n.children[i], e); ok { + out.Index(j).Set(e) + j++ + } + } + if out.Kind() != reflect.Array { + out.Set(out.Slice(0, j)) + } + if iface.IsValid() { + iface.Set(out) + } + return true +} + +func (d *decoder) mapping(n *node, out reflect.Value) (good bool) { + switch out.Kind() { + case reflect.Struct: + return d.mappingStruct(n, out) + case reflect.Slice: + return d.mappingSlice(n, out) + case reflect.Map: + // okay + case reflect.Interface: + if d.mapType.Kind() == reflect.Map { + iface := out + out = reflect.MakeMap(d.mapType) + iface.Set(out) + } else { + slicev := reflect.New(d.mapType).Elem() + if !d.mappingSlice(n, slicev) { + return false + } + out.Set(slicev) + return true + } + default: + d.terror(n, yaml_MAP_TAG, out) + return false + } + outt := out.Type() + kt := outt.Key() + et := outt.Elem() + + mapType := d.mapType + if outt.Key() == ifaceType && outt.Elem() == ifaceType { + d.mapType = outt + } + + if out.IsNil() { + out.Set(reflect.MakeMap(outt)) + } + l := len(n.children) + for i := 0; i < l; i += 2 { + if isMerge(n.children[i]) { + d.merge(n.children[i+1], out) + continue + } + k := reflect.New(kt).Elem() + if d.unmarshal(n.children[i], k) { + kkind := k.Kind() + if kkind == reflect.Interface { + kkind = k.Elem().Kind() + } + if kkind == reflect.Map || kkind == reflect.Slice { + failf("invalid map key: %#v", k.Interface()) + } + e := reflect.New(et).Elem() + if d.unmarshal(n.children[i+1], e) { + d.setMapIndex(n.children[i+1], out, k, e) + } + } + } + d.mapType = mapType + return true +} + +func (d *decoder) setMapIndex(n *node, out, k, v reflect.Value) { + if d.strict && out.MapIndex(k) != zeroValue { + d.terrors = append(d.terrors, fmt.Sprintf("line %d: key %#v already set in map", n.line+1, k.Interface())) + return + } + out.SetMapIndex(k, v) +} + +func (d *decoder) mappingSlice(n *node, out reflect.Value) (good bool) { + outt := out.Type() + if outt.Elem() != mapItemType { + d.terror(n, yaml_MAP_TAG, out) + return false + } + + mapType := d.mapType + d.mapType = outt + + var slice []MapItem + var l = len(n.children) + for i := 0; i < l; i += 2 { + if isMerge(n.children[i]) { + d.merge(n.children[i+1], out) + continue + } + item := MapItem{} + k := reflect.ValueOf(&item.Key).Elem() + if d.unmarshal(n.children[i], k) { + v := reflect.ValueOf(&item.Value).Elem() + if d.unmarshal(n.children[i+1], v) { + slice = append(slice, item) + } + } + } + out.Set(reflect.ValueOf(slice)) + d.mapType = mapType + return true +} + +func (d *decoder) mappingStruct(n *node, out reflect.Value) (good bool) { + sinfo, err := getStructInfo(out.Type()) + if err != nil { + panic(err) + } + name := settableValueOf("") + l := len(n.children) + + var inlineMap reflect.Value + var elemType reflect.Type + if sinfo.InlineMap != -1 { + inlineMap = out.Field(sinfo.InlineMap) + inlineMap.Set(reflect.New(inlineMap.Type()).Elem()) + elemType = inlineMap.Type().Elem() + } + + var doneFields []bool + if d.strict { + doneFields = make([]bool, len(sinfo.FieldsList)) + } + for i := 0; i < l; i += 2 { + ni := n.children[i] + if isMerge(ni) { + d.merge(n.children[i+1], out) + continue + } + if !d.unmarshal(ni, name) { + continue + } + if info, ok := sinfo.FieldsMap[name.String()]; ok { + if d.strict { + if doneFields[info.Id] { + d.terrors = append(d.terrors, fmt.Sprintf("line %d: field %s already set in type %s", ni.line+1, name.String(), out.Type())) + continue + } + doneFields[info.Id] = true + } + var field reflect.Value + if info.Inline == nil { + field = out.Field(info.Num) + } else { + field = out.FieldByIndex(info.Inline) + } + d.unmarshal(n.children[i+1], field) + } else if sinfo.InlineMap != -1 { + if inlineMap.IsNil() { + inlineMap.Set(reflect.MakeMap(inlineMap.Type())) + } + value := reflect.New(elemType).Elem() + d.unmarshal(n.children[i+1], value) + d.setMapIndex(n.children[i+1], inlineMap, name, value) + } else if d.strict { + d.terrors = append(d.terrors, fmt.Sprintf("line %d: field %s not found in type %s", ni.line+1, name.String(), out.Type())) + } + } + return true +} + +func failWantMap() { + failf("map merge requires map or sequence of maps as the value") +} + +func (d *decoder) merge(n *node, out reflect.Value) { + switch n.kind { + case mappingNode: + d.unmarshal(n, out) + case aliasNode: + an, ok := d.doc.anchors[n.value] + if ok && an.kind != mappingNode { + failWantMap() + } + d.unmarshal(n, out) + case sequenceNode: + // Step backwards as earlier nodes take precedence. + for i := len(n.children) - 1; i >= 0; i-- { + ni := n.children[i] + if ni.kind == aliasNode { + an, ok := d.doc.anchors[ni.value] + if ok && an.kind != mappingNode { + failWantMap() + } + } else if ni.kind != mappingNode { + failWantMap() + } + d.unmarshal(ni, out) + } + default: + failWantMap() + } +} + +func isMerge(n *node) bool { + return n.kind == scalarNode && n.value == "<<" && (n.implicit == true || n.tag == yaml_MERGE_TAG) +} diff --git a/api/vendor/gopkg.in/yaml.v2/decode_test.go b/api/vendor/gopkg.in/yaml.v2/decode_test.go new file mode 100644 index 0000000..9269f12 --- /dev/null +++ b/api/vendor/gopkg.in/yaml.v2/decode_test.go @@ -0,0 +1,1326 @@ +package yaml_test + +import ( + "errors" + "io" + "math" + "reflect" + "strings" + "time" + + . "gopkg.in/check.v1" + "gopkg.in/yaml.v2" +) + +var unmarshalIntTest = 123 + +var unmarshalTests = []struct { + data string + value interface{} +}{ + { + "", + (*struct{})(nil), + }, + { + "{}", &struct{}{}, + }, { + "v: hi", + map[string]string{"v": "hi"}, + }, { + "v: hi", map[string]interface{}{"v": "hi"}, + }, { + "v: true", + map[string]string{"v": "true"}, + }, { + "v: true", + map[string]interface{}{"v": true}, + }, { + "v: 10", + map[string]interface{}{"v": 10}, + }, { + "v: 0b10", + map[string]interface{}{"v": 2}, + }, { + "v: 0xA", + map[string]interface{}{"v": 10}, + }, { + "v: 4294967296", + map[string]int64{"v": 4294967296}, + }, { + "v: 0.1", + map[string]interface{}{"v": 0.1}, + }, { + "v: .1", + map[string]interface{}{"v": 0.1}, + }, { + "v: .Inf", + map[string]interface{}{"v": math.Inf(+1)}, + }, { + "v: -.Inf", + map[string]interface{}{"v": math.Inf(-1)}, + }, { + "v: -10", + map[string]interface{}{"v": -10}, + }, { + "v: -.1", + map[string]interface{}{"v": -0.1}, + }, + + // Simple values. + { + "123", + &unmarshalIntTest, + }, + + // Floats from spec + { + "canonical: 6.8523e+5", + map[string]interface{}{"canonical": 6.8523e+5}, + }, { + "expo: 685.230_15e+03", + map[string]interface{}{"expo": 685.23015e+03}, + }, { + "fixed: 685_230.15", + map[string]interface{}{"fixed": 685230.15}, + }, { + "neginf: -.inf", + map[string]interface{}{"neginf": math.Inf(-1)}, + }, { + "fixed: 685_230.15", + map[string]float64{"fixed": 685230.15}, + }, + //{"sexa: 190:20:30.15", map[string]interface{}{"sexa": 0}}, // Unsupported + //{"notanum: .NaN", map[string]interface{}{"notanum": math.NaN()}}, // Equality of NaN fails. + + // Bools from spec + { + "canonical: y", + map[string]interface{}{"canonical": true}, + }, { + "answer: NO", + map[string]interface{}{"answer": false}, + }, { + "logical: True", + map[string]interface{}{"logical": true}, + }, { + "option: on", + map[string]interface{}{"option": true}, + }, { + "option: on", + map[string]bool{"option": true}, + }, + // Ints from spec + { + "canonical: 685230", + map[string]interface{}{"canonical": 685230}, + }, { + "decimal: +685_230", + map[string]interface{}{"decimal": 685230}, + }, { + "octal: 02472256", + map[string]interface{}{"octal": 685230}, + }, { + "hexa: 0x_0A_74_AE", + map[string]interface{}{"hexa": 685230}, + }, { + "bin: 0b1010_0111_0100_1010_1110", + map[string]interface{}{"bin": 685230}, + }, { + "bin: -0b101010", + map[string]interface{}{"bin": -42}, + }, { + "bin: -0b1000000000000000000000000000000000000000000000000000000000000000", + map[string]interface{}{"bin": -9223372036854775808}, + }, { + "decimal: +685_230", + map[string]int{"decimal": 685230}, + }, + + //{"sexa: 190:20:30", map[string]interface{}{"sexa": 0}}, // Unsupported + + // Nulls from spec + { + "empty:", + map[string]interface{}{"empty": nil}, + }, { + "canonical: ~", + map[string]interface{}{"canonical": nil}, + }, { + "english: null", + map[string]interface{}{"english": nil}, + }, { + "~: null key", + map[interface{}]string{nil: "null key"}, + }, { + "empty:", + map[string]*bool{"empty": nil}, + }, + + // Flow sequence + { + "seq: [A,B]", + map[string]interface{}{"seq": []interface{}{"A", "B"}}, + }, { + "seq: [A,B,C,]", + map[string][]string{"seq": []string{"A", "B", "C"}}, + }, { + "seq: [A,1,C]", + map[string][]string{"seq": []string{"A", "1", "C"}}, + }, { + "seq: [A,1,C]", + map[string][]int{"seq": []int{1}}, + }, { + "seq: [A,1,C]", + map[string]interface{}{"seq": []interface{}{"A", 1, "C"}}, + }, + // Block sequence + { + "seq:\n - A\n - B", + map[string]interface{}{"seq": []interface{}{"A", "B"}}, + }, { + "seq:\n - A\n - B\n - C", + map[string][]string{"seq": []string{"A", "B", "C"}}, + }, { + "seq:\n - A\n - 1\n - C", + map[string][]string{"seq": []string{"A", "1", "C"}}, + }, { + "seq:\n - A\n - 1\n - C", + map[string][]int{"seq": []int{1}}, + }, { + "seq:\n - A\n - 1\n - C", + map[string]interface{}{"seq": []interface{}{"A", 1, "C"}}, + }, + + // Literal block scalar + { + "scalar: | # Comment\n\n literal\n\n \ttext\n\n", + map[string]string{"scalar": "\nliteral\n\n\ttext\n"}, + }, + + // Folded block scalar + { + "scalar: > # Comment\n\n folded\n line\n \n next\n line\n * one\n * two\n\n last\n line\n\n", + map[string]string{"scalar": "\nfolded line\nnext line\n * one\n * two\n\nlast line\n"}, + }, + + // Map inside interface with no type hints. + { + "a: {b: c}", + map[interface{}]interface{}{"a": map[interface{}]interface{}{"b": "c"}}, + }, + + // Structs and type conversions. + { + "hello: world", + &struct{ Hello string }{"world"}, + }, { + "a: {b: c}", + &struct{ A struct{ B string } }{struct{ B string }{"c"}}, + }, { + "a: {b: c}", + &struct{ A *struct{ B string } }{&struct{ B string }{"c"}}, + }, { + "a: {b: c}", + &struct{ A map[string]string }{map[string]string{"b": "c"}}, + }, { + "a: {b: c}", + &struct{ A *map[string]string }{&map[string]string{"b": "c"}}, + }, { + "a:", + &struct{ A map[string]string }{}, + }, { + "a: 1", + &struct{ A int }{1}, + }, { + "a: 1", + &struct{ A float64 }{1}, + }, { + "a: 1.0", + &struct{ A int }{1}, + }, { + "a: 1.0", + &struct{ A uint }{1}, + }, { + "a: [1, 2]", + &struct{ A []int }{[]int{1, 2}}, + }, { + "a: [1, 2]", + &struct{ A [2]int }{[2]int{1, 2}}, + }, { + "a: 1", + &struct{ B int }{0}, + }, { + "a: 1", + &struct { + B int "a" + }{1}, + }, { + "a: y", + &struct{ A bool }{true}, + }, + + // Some cross type conversions + { + "v: 42", + map[string]uint{"v": 42}, + }, { + "v: -42", + map[string]uint{}, + }, { + "v: 4294967296", + map[string]uint64{"v": 4294967296}, + }, { + "v: -4294967296", + map[string]uint64{}, + }, + + // int + { + "int_max: 2147483647", + map[string]int{"int_max": math.MaxInt32}, + }, + { + "int_min: -2147483648", + map[string]int{"int_min": math.MinInt32}, + }, + { + "int_overflow: 9223372036854775808", // math.MaxInt64 + 1 + map[string]int{}, + }, + + // int64 + { + "int64_max: 9223372036854775807", + map[string]int64{"int64_max": math.MaxInt64}, + }, + { + "int64_max_base2: 0b111111111111111111111111111111111111111111111111111111111111111", + map[string]int64{"int64_max_base2": math.MaxInt64}, + }, + { + "int64_min: -9223372036854775808", + map[string]int64{"int64_min": math.MinInt64}, + }, + { + "int64_neg_base2: -0b111111111111111111111111111111111111111111111111111111111111111", + map[string]int64{"int64_neg_base2": -math.MaxInt64}, + }, + { + "int64_overflow: 9223372036854775808", // math.MaxInt64 + 1 + map[string]int64{}, + }, + + // uint + { + "uint_min: 0", + map[string]uint{"uint_min": 0}, + }, + { + "uint_max: 4294967295", + map[string]uint{"uint_max": math.MaxUint32}, + }, + { + "uint_underflow: -1", + map[string]uint{}, + }, + + // uint64 + { + "uint64_min: 0", + map[string]uint{"uint64_min": 0}, + }, + { + "uint64_max: 18446744073709551615", + map[string]uint64{"uint64_max": math.MaxUint64}, + }, + { + "uint64_max_base2: 0b1111111111111111111111111111111111111111111111111111111111111111", + map[string]uint64{"uint64_max_base2": math.MaxUint64}, + }, + { + "uint64_maxint64: 9223372036854775807", + map[string]uint64{"uint64_maxint64": math.MaxInt64}, + }, + { + "uint64_underflow: -1", + map[string]uint64{}, + }, + + // float32 + { + "float32_max: 3.40282346638528859811704183484516925440e+38", + map[string]float32{"float32_max": math.MaxFloat32}, + }, + { + "float32_nonzero: 1.401298464324817070923729583289916131280e-45", + map[string]float32{"float32_nonzero": math.SmallestNonzeroFloat32}, + }, + { + "float32_maxuint64: 18446744073709551615", + map[string]float32{"float32_maxuint64": float32(math.MaxUint64)}, + }, + { + "float32_maxuint64+1: 18446744073709551616", + map[string]float32{"float32_maxuint64+1": float32(math.MaxUint64 + 1)}, + }, + + // float64 + { + "float64_max: 1.797693134862315708145274237317043567981e+308", + map[string]float64{"float64_max": math.MaxFloat64}, + }, + { + "float64_nonzero: 4.940656458412465441765687928682213723651e-324", + map[string]float64{"float64_nonzero": math.SmallestNonzeroFloat64}, + }, + { + "float64_maxuint64: 18446744073709551615", + map[string]float64{"float64_maxuint64": float64(math.MaxUint64)}, + }, + { + "float64_maxuint64+1: 18446744073709551616", + map[string]float64{"float64_maxuint64+1": float64(math.MaxUint64 + 1)}, + }, + + // Overflow cases. + { + "v: 4294967297", + map[string]int32{}, + }, { + "v: 128", + map[string]int8{}, + }, + + // Quoted values. + { + "'1': '\"2\"'", + map[interface{}]interface{}{"1": "\"2\""}, + }, { + "v:\n- A\n- 'B\n\n C'\n", + map[string][]string{"v": []string{"A", "B\nC"}}, + }, + + // Explicit tags. + { + "v: !!float '1.1'", + map[string]interface{}{"v": 1.1}, + }, { + "v: !!float 0", + map[string]interface{}{"v": float64(0)}, + }, { + "v: !!float -1", + map[string]interface{}{"v": float64(-1)}, + }, { + "v: !!null ''", + map[string]interface{}{"v": nil}, + }, { + "%TAG !y! tag:yaml.org,2002:\n---\nv: !y!int '1'", + map[string]interface{}{"v": 1}, + }, + + // Non-specific tag (Issue #75) + { + "v: ! test", + map[string]interface{}{"v": "test"}, + }, + + // Anchors and aliases. + { + "a: &x 1\nb: &y 2\nc: *x\nd: *y\n", + &struct{ A, B, C, D int }{1, 2, 1, 2}, + }, { + "a: &a {c: 1}\nb: *a", + &struct { + A, B struct { + C int + } + }{struct{ C int }{1}, struct{ C int }{1}}, + }, { + "a: &a [1, 2]\nb: *a", + &struct{ B []int }{[]int{1, 2}}, + }, + + // Bug #1133337 + { + "foo: ''", + map[string]*string{"foo": new(string)}, + }, { + "foo: null", + map[string]*string{"foo": nil}, + }, { + "foo: null", + map[string]string{"foo": ""}, + }, { + "foo: null", + map[string]interface{}{"foo": nil}, + }, + + // Support for ~ + { + "foo: ~", + map[string]*string{"foo": nil}, + }, { + "foo: ~", + map[string]string{"foo": ""}, + }, { + "foo: ~", + map[string]interface{}{"foo": nil}, + }, + + // Ignored field + { + "a: 1\nb: 2\n", + &struct { + A int + B int "-" + }{1, 0}, + }, + + // Bug #1191981 + { + "" + + "%YAML 1.1\n" + + "--- !!str\n" + + `"Generic line break (no glyph)\n\` + "\n" + + ` Generic line break (glyphed)\n\` + "\n" + + ` Line separator\u2028\` + "\n" + + ` Paragraph separator\u2029"` + "\n", + "" + + "Generic line break (no glyph)\n" + + "Generic line break (glyphed)\n" + + "Line separator\u2028Paragraph separator\u2029", + }, + + // Struct inlining + { + "a: 1\nb: 2\nc: 3\n", + &struct { + A int + C inlineB `yaml:",inline"` + }{1, inlineB{2, inlineC{3}}}, + }, + + // Map inlining + { + "a: 1\nb: 2\nc: 3\n", + &struct { + A int + C map[string]int `yaml:",inline"` + }{1, map[string]int{"b": 2, "c": 3}}, + }, + + // bug 1243827 + { + "a: -b_c", + map[string]interface{}{"a": "-b_c"}, + }, + { + "a: +b_c", + map[string]interface{}{"a": "+b_c"}, + }, + { + "a: 50cent_of_dollar", + map[string]interface{}{"a": "50cent_of_dollar"}, + }, + + // issue #295 (allow scalars with colons in flow mappings and sequences) + { + "a: {b: https://github.com/go-yaml/yaml}", + map[string]interface{}{"a": map[interface{}]interface{}{ + "b": "https://github.com/go-yaml/yaml", + }}, + }, + { + "a: [https://github.com/go-yaml/yaml]", + map[string]interface{}{"a": []interface{}{"https://github.com/go-yaml/yaml"}}, + }, + + // Duration + { + "a: 3s", + map[string]time.Duration{"a": 3 * time.Second}, + }, + + // Issue #24. + { + "a: ", + map[string]string{"a": ""}, + }, + + // Base 60 floats are obsolete and unsupported. + { + "a: 1:1\n", + map[string]string{"a": "1:1"}, + }, + + // Binary data. + { + "a: !!binary gIGC\n", + map[string]string{"a": "\x80\x81\x82"}, + }, { + "a: !!binary |\n " + strings.Repeat("kJCQ", 17) + "kJ\n CQ\n", + map[string]string{"a": strings.Repeat("\x90", 54)}, + }, { + "a: !!binary |\n " + strings.Repeat("A", 70) + "\n ==\n", + map[string]string{"a": strings.Repeat("\x00", 52)}, + }, + + // Ordered maps. + { + "{b: 2, a: 1, d: 4, c: 3, sub: {e: 5}}", + &yaml.MapSlice{{"b", 2}, {"a", 1}, {"d", 4}, {"c", 3}, {"sub", yaml.MapSlice{{"e", 5}}}}, + }, + + // Issue #39. + { + "a:\n b:\n c: d\n", + map[string]struct{ B interface{} }{"a": {map[interface{}]interface{}{"c": "d"}}}, + }, + + // Custom map type. + { + "a: {b: c}", + M{"a": M{"b": "c"}}, + }, + + // Support encoding.TextUnmarshaler. + { + "a: 1.2.3.4\n", + map[string]textUnmarshaler{"a": textUnmarshaler{S: "1.2.3.4"}}, + }, + { + "a: 2015-02-24T18:19:39Z\n", + map[string]textUnmarshaler{"a": textUnmarshaler{"2015-02-24T18:19:39Z"}}, + }, + + // Timestamps + { + // Date only. + "a: 2015-01-01\n", + map[string]time.Time{"a": time.Date(2015, 1, 1, 0, 0, 0, 0, time.UTC)}, + }, + { + // RFC3339 + "a: 2015-02-24T18:19:39.12Z\n", + map[string]time.Time{"a": time.Date(2015, 2, 24, 18, 19, 39, .12e9, time.UTC)}, + }, + { + // RFC3339 with short dates. + "a: 2015-2-3T3:4:5Z", + map[string]time.Time{"a": time.Date(2015, 2, 3, 3, 4, 5, 0, time.UTC)}, + }, + { + // ISO8601 lower case t + "a: 2015-02-24t18:19:39Z\n", + map[string]time.Time{"a": time.Date(2015, 2, 24, 18, 19, 39, 0, time.UTC)}, + }, + { + // space separate, no time zone + "a: 2015-02-24 18:19:39\n", + map[string]time.Time{"a": time.Date(2015, 2, 24, 18, 19, 39, 0, time.UTC)}, + }, + // Some cases not currently handled. Uncomment these when + // the code is fixed. + // { + // // space separated with time zone + // "a: 2001-12-14 21:59:43.10 -5", + // map[string]interface{}{"a": time.Date(2001, 12, 14, 21, 59, 43, .1e9, time.UTC)}, + // }, + // { + // // arbitrary whitespace between fields + // "a: 2001-12-14 \t\t \t21:59:43.10 \t Z", + // map[string]interface{}{"a": time.Date(2001, 12, 14, 21, 59, 43, .1e9, time.UTC)}, + // }, + { + // explicit string tag + "a: !!str 2015-01-01", + map[string]interface{}{"a": "2015-01-01"}, + }, + { + // explicit timestamp tag on quoted string + "a: !!timestamp \"2015-01-01\"", + map[string]time.Time{"a": time.Date(2015, 1, 1, 0, 0, 0, 0, time.UTC)}, + }, + { + // explicit timestamp tag on unquoted string + "a: !!timestamp 2015-01-01", + map[string]time.Time{"a": time.Date(2015, 1, 1, 0, 0, 0, 0, time.UTC)}, + }, + { + // quoted string that's a valid timestamp + "a: \"2015-01-01\"", + map[string]interface{}{"a": "2015-01-01"}, + }, + { + // explicit timestamp tag into interface. + "a: !!timestamp \"2015-01-01\"", + map[string]interface{}{"a": "2015-01-01"}, + }, + { + // implicit timestamp tag into interface. + "a: 2015-01-01", + map[string]interface{}{"a": "2015-01-01"}, + }, + + // Encode empty lists as zero-length slices. + { + "a: []", + &struct{ A []int }{[]int{}}, + }, + + // UTF-16-LE + { + "\xff\xfe\xf1\x00o\x00\xf1\x00o\x00:\x00 \x00v\x00e\x00r\x00y\x00 \x00y\x00e\x00s\x00\n\x00", + M{"ñoño": "very yes"}, + }, + // UTF-16-LE with surrogate. + { + "\xff\xfe\xf1\x00o\x00\xf1\x00o\x00:\x00 \x00v\x00e\x00r\x00y\x00 \x00y\x00e\x00s\x00 \x00=\xd8\xd4\xdf\n\x00", + M{"ñoño": "very yes 🟔"}, + }, + + // UTF-16-BE + { + "\xfe\xff\x00\xf1\x00o\x00\xf1\x00o\x00:\x00 \x00v\x00e\x00r\x00y\x00 \x00y\x00e\x00s\x00\n", + M{"ñoño": "very yes"}, + }, + // UTF-16-BE with surrogate. + { + "\xfe\xff\x00\xf1\x00o\x00\xf1\x00o\x00:\x00 \x00v\x00e\x00r\x00y\x00 \x00y\x00e\x00s\x00 \xd8=\xdf\xd4\x00\n", + M{"ñoño": "very yes 🟔"}, + }, + + // YAML Float regex shouldn't match this + { + "a: 123456e1\n", + M{"a": "123456e1"}, + }, { + "a: 123456E1\n", + M{"a": "123456E1"}, + }, + // yaml-test-suite 3GZX: Spec Example 7.1. Alias Nodes + { + "First occurrence: &anchor Foo\nSecond occurrence: *anchor\nOverride anchor: &anchor Bar\nReuse anchor: *anchor\n", + map[interface{}]interface{}{ + "Reuse anchor": "Bar", + "First occurrence": "Foo", + "Second occurrence": "Foo", + "Override anchor": "Bar", + }, + }, + // Single document with garbage following it. + { + "---\nhello\n...\n}not yaml", + "hello", + }, +} + +type M map[interface{}]interface{} + +type inlineB struct { + B int + inlineC `yaml:",inline"` +} + +type inlineC struct { + C int +} + +func (s *S) TestUnmarshal(c *C) { + for i, item := range unmarshalTests { + c.Logf("test %d: %q", i, item.data) + t := reflect.ValueOf(item.value).Type() + value := reflect.New(t) + err := yaml.Unmarshal([]byte(item.data), value.Interface()) + if _, ok := err.(*yaml.TypeError); !ok { + c.Assert(err, IsNil) + } + c.Assert(value.Elem().Interface(), DeepEquals, item.value, Commentf("error: %v", err)) + } +} + +// TODO(v3): This test should also work when unmarshaling onto an interface{}. +func (s *S) TestUnmarshalFullTimestamp(c *C) { + // Full timestamp in same format as encoded. This is confirmed to be + // properly decoded by Python as a timestamp as well. + var str = "2015-02-24T18:19:39.123456789-03:00" + var t time.Time + err := yaml.Unmarshal([]byte(str), &t) + c.Assert(err, IsNil) + c.Assert(t, Equals, time.Date(2015, 2, 24, 18, 19, 39, 123456789, t.Location())) + c.Assert(t.In(time.UTC), Equals, time.Date(2015, 2, 24, 21, 19, 39, 123456789, time.UTC)) +} + +func (s *S) TestDecoderSingleDocument(c *C) { + // Test that Decoder.Decode works as expected on + // all the unmarshal tests. + for i, item := range unmarshalTests { + c.Logf("test %d: %q", i, item.data) + if item.data == "" { + // Behaviour differs when there's no YAML. + continue + } + t := reflect.ValueOf(item.value).Type() + value := reflect.New(t) + err := yaml.NewDecoder(strings.NewReader(item.data)).Decode(value.Interface()) + if _, ok := err.(*yaml.TypeError); !ok { + c.Assert(err, IsNil) + } + c.Assert(value.Elem().Interface(), DeepEquals, item.value) + } +} + +var decoderTests = []struct { + data string + values []interface{} +}{{ + "", + nil, +}, { + "a: b", + []interface{}{ + map[interface{}]interface{}{"a": "b"}, + }, +}, { + "---\na: b\n...\n", + []interface{}{ + map[interface{}]interface{}{"a": "b"}, + }, +}, { + "---\n'hello'\n...\n---\ngoodbye\n...\n", + []interface{}{ + "hello", + "goodbye", + }, +}} + +func (s *S) TestDecoder(c *C) { + for i, item := range decoderTests { + c.Logf("test %d: %q", i, item.data) + var values []interface{} + dec := yaml.NewDecoder(strings.NewReader(item.data)) + for { + var value interface{} + err := dec.Decode(&value) + if err == io.EOF { + break + } + c.Assert(err, IsNil) + values = append(values, value) + } + c.Assert(values, DeepEquals, item.values) + } +} + +type errReader struct{} + +func (errReader) Read([]byte) (int, error) { + return 0, errors.New("some read error") +} + +func (s *S) TestDecoderReadError(c *C) { + err := yaml.NewDecoder(errReader{}).Decode(&struct{}{}) + c.Assert(err, ErrorMatches, `yaml: input error: some read error`) +} + +func (s *S) TestUnmarshalNaN(c *C) { + value := map[string]interface{}{} + err := yaml.Unmarshal([]byte("notanum: .NaN"), &value) + c.Assert(err, IsNil) + c.Assert(math.IsNaN(value["notanum"].(float64)), Equals, true) +} + +var unmarshalErrorTests = []struct { + data, error string +}{ + {"v: !!float 'error'", "yaml: cannot decode !!str `error` as a !!float"}, + {"v: [A,", "yaml: line 1: did not find expected node content"}, + {"v:\n- [A,", "yaml: line 2: did not find expected node content"}, + {"a:\n- b: *,", "yaml: line 2: did not find expected alphabetic or numeric character"}, + {"a: *b\n", "yaml: unknown anchor 'b' referenced"}, + {"a: &a\n b: *a\n", "yaml: anchor 'a' value contains itself"}, + {"value: -", "yaml: block sequence entries are not allowed in this context"}, + {"a: !!binary ==", "yaml: !!binary value contains invalid base64 data"}, + {"{[.]}", `yaml: invalid map key: \[\]interface \{\}\{"\."\}`}, + {"{{.}}", `yaml: invalid map key: map\[interface\ \{\}\]interface \{\}\{".":interface \{\}\(nil\)\}`}, + {"b: *a\na: &a {c: 1}", `yaml: unknown anchor 'a' referenced`}, + {"%TAG !%79! tag:yaml.org,2002:\n---\nv: !%79!int '1'", "yaml: did not find expected whitespace"}, +} + +func (s *S) TestUnmarshalErrors(c *C) { + for i, item := range unmarshalErrorTests { + c.Logf("test %d: %q", i, item.data) + var value interface{} + err := yaml.Unmarshal([]byte(item.data), &value) + c.Assert(err, ErrorMatches, item.error, Commentf("Partial unmarshal: %#v", value)) + } +} + +func (s *S) TestDecoderErrors(c *C) { + for _, item := range unmarshalErrorTests { + var value interface{} + err := yaml.NewDecoder(strings.NewReader(item.data)).Decode(&value) + c.Assert(err, ErrorMatches, item.error, Commentf("Partial unmarshal: %#v", value)) + } +} + +var unmarshalerTests = []struct { + data, tag string + value interface{} +}{ + {"_: {hi: there}", "!!map", map[interface{}]interface{}{"hi": "there"}}, + {"_: [1,A]", "!!seq", []interface{}{1, "A"}}, + {"_: 10", "!!int", 10}, + {"_: null", "!!null", nil}, + {`_: BAR!`, "!!str", "BAR!"}, + {`_: "BAR!"`, "!!str", "BAR!"}, + {"_: !!foo 'BAR!'", "!!foo", "BAR!"}, + {`_: ""`, "!!str", ""}, +} + +var unmarshalerResult = map[int]error{} + +type unmarshalerType struct { + value interface{} +} + +func (o *unmarshalerType) UnmarshalYAML(unmarshal func(v interface{}) error) error { + if err := unmarshal(&o.value); err != nil { + return err + } + if i, ok := o.value.(int); ok { + if result, ok := unmarshalerResult[i]; ok { + return result + } + } + return nil +} + +type unmarshalerPointer struct { + Field *unmarshalerType "_" +} + +type unmarshalerValue struct { + Field unmarshalerType "_" +} + +func (s *S) TestUnmarshalerPointerField(c *C) { + for _, item := range unmarshalerTests { + obj := &unmarshalerPointer{} + err := yaml.Unmarshal([]byte(item.data), obj) + c.Assert(err, IsNil) + if item.value == nil { + c.Assert(obj.Field, IsNil) + } else { + c.Assert(obj.Field, NotNil, Commentf("Pointer not initialized (%#v)", item.value)) + c.Assert(obj.Field.value, DeepEquals, item.value) + } + } +} + +func (s *S) TestUnmarshalerValueField(c *C) { + for _, item := range unmarshalerTests { + obj := &unmarshalerValue{} + err := yaml.Unmarshal([]byte(item.data), obj) + c.Assert(err, IsNil) + c.Assert(obj.Field, NotNil, Commentf("Pointer not initialized (%#v)", item.value)) + c.Assert(obj.Field.value, DeepEquals, item.value) + } +} + +func (s *S) TestUnmarshalerWholeDocument(c *C) { + obj := &unmarshalerType{} + err := yaml.Unmarshal([]byte(unmarshalerTests[0].data), obj) + c.Assert(err, IsNil) + value, ok := obj.value.(map[interface{}]interface{}) + c.Assert(ok, Equals, true, Commentf("value: %#v", obj.value)) + c.Assert(value["_"], DeepEquals, unmarshalerTests[0].value) +} + +func (s *S) TestUnmarshalerTypeError(c *C) { + unmarshalerResult[2] = &yaml.TypeError{[]string{"foo"}} + unmarshalerResult[4] = &yaml.TypeError{[]string{"bar"}} + defer func() { + delete(unmarshalerResult, 2) + delete(unmarshalerResult, 4) + }() + + type T struct { + Before int + After int + M map[string]*unmarshalerType + } + var v T + data := `{before: A, m: {abc: 1, def: 2, ghi: 3, jkl: 4}, after: B}` + err := yaml.Unmarshal([]byte(data), &v) + c.Assert(err, ErrorMatches, ""+ + "yaml: unmarshal errors:\n"+ + " line 1: cannot unmarshal !!str `A` into int\n"+ + " foo\n"+ + " bar\n"+ + " line 1: cannot unmarshal !!str `B` into int") + c.Assert(v.M["abc"], NotNil) + c.Assert(v.M["def"], IsNil) + c.Assert(v.M["ghi"], NotNil) + c.Assert(v.M["jkl"], IsNil) + + c.Assert(v.M["abc"].value, Equals, 1) + c.Assert(v.M["ghi"].value, Equals, 3) +} + +type proxyTypeError struct{} + +func (v *proxyTypeError) UnmarshalYAML(unmarshal func(interface{}) error) error { + var s string + var a int32 + var b int64 + if err := unmarshal(&s); err != nil { + panic(err) + } + if s == "a" { + if err := unmarshal(&b); err == nil { + panic("should have failed") + } + return unmarshal(&a) + } + if err := unmarshal(&a); err == nil { + panic("should have failed") + } + return unmarshal(&b) +} + +func (s *S) TestUnmarshalerTypeErrorProxying(c *C) { + type T struct { + Before int + After int + M map[string]*proxyTypeError + } + var v T + data := `{before: A, m: {abc: a, def: b}, after: B}` + err := yaml.Unmarshal([]byte(data), &v) + c.Assert(err, ErrorMatches, ""+ + "yaml: unmarshal errors:\n"+ + " line 1: cannot unmarshal !!str `A` into int\n"+ + " line 1: cannot unmarshal !!str `a` into int32\n"+ + " line 1: cannot unmarshal !!str `b` into int64\n"+ + " line 1: cannot unmarshal !!str `B` into int") +} + +type failingUnmarshaler struct{} + +var failingErr = errors.New("failingErr") + +func (ft *failingUnmarshaler) UnmarshalYAML(unmarshal func(interface{}) error) error { + return failingErr +} + +func (s *S) TestUnmarshalerError(c *C) { + err := yaml.Unmarshal([]byte("a: b"), &failingUnmarshaler{}) + c.Assert(err, Equals, failingErr) +} + +type sliceUnmarshaler []int + +func (su *sliceUnmarshaler) UnmarshalYAML(unmarshal func(interface{}) error) error { + var slice []int + err := unmarshal(&slice) + if err == nil { + *su = slice + return nil + } + + var intVal int + err = unmarshal(&intVal) + if err == nil { + *su = []int{intVal} + return nil + } + + return err +} + +func (s *S) TestUnmarshalerRetry(c *C) { + var su sliceUnmarshaler + err := yaml.Unmarshal([]byte("[1, 2, 3]"), &su) + c.Assert(err, IsNil) + c.Assert(su, DeepEquals, sliceUnmarshaler([]int{1, 2, 3})) + + err = yaml.Unmarshal([]byte("1"), &su) + c.Assert(err, IsNil) + c.Assert(su, DeepEquals, sliceUnmarshaler([]int{1})) +} + +// From http://yaml.org/type/merge.html +var mergeTests = ` +anchors: + list: + - &CENTER { "x": 1, "y": 2 } + - &LEFT { "x": 0, "y": 2 } + - &BIG { "r": 10 } + - &SMALL { "r": 1 } + +# All the following maps are equal: + +plain: + # Explicit keys + "x": 1 + "y": 2 + "r": 10 + label: center/big + +mergeOne: + # Merge one map + << : *CENTER + "r": 10 + label: center/big + +mergeMultiple: + # Merge multiple maps + << : [ *CENTER, *BIG ] + label: center/big + +override: + # Override + << : [ *BIG, *LEFT, *SMALL ] + "x": 1 + label: center/big + +shortTag: + # Explicit short merge tag + !!merge "<<" : [ *CENTER, *BIG ] + label: center/big + +longTag: + # Explicit merge long tag + ! "<<" : [ *CENTER, *BIG ] + label: center/big + +inlineMap: + # Inlined map + << : {"x": 1, "y": 2, "r": 10} + label: center/big + +inlineSequenceMap: + # Inlined map in sequence + << : [ *CENTER, {"r": 10} ] + label: center/big +` + +func (s *S) TestMerge(c *C) { + var want = map[interface{}]interface{}{ + "x": 1, + "y": 2, + "r": 10, + "label": "center/big", + } + + var m map[interface{}]interface{} + err := yaml.Unmarshal([]byte(mergeTests), &m) + c.Assert(err, IsNil) + for name, test := range m { + if name == "anchors" { + continue + } + c.Assert(test, DeepEquals, want, Commentf("test %q failed", name)) + } +} + +func (s *S) TestMergeStruct(c *C) { + type Data struct { + X, Y, R int + Label string + } + want := Data{1, 2, 10, "center/big"} + + var m map[string]Data + err := yaml.Unmarshal([]byte(mergeTests), &m) + c.Assert(err, IsNil) + for name, test := range m { + if name == "anchors" { + continue + } + c.Assert(test, Equals, want, Commentf("test %q failed", name)) + } +} + +var unmarshalNullTests = []func() interface{}{ + func() interface{} { var v interface{}; v = "v"; return &v }, + func() interface{} { var s = "s"; return &s }, + func() interface{} { var s = "s"; sptr := &s; return &sptr }, + func() interface{} { var i = 1; return &i }, + func() interface{} { var i = 1; iptr := &i; return &iptr }, + func() interface{} { m := map[string]int{"s": 1}; return &m }, + func() interface{} { m := map[string]int{"s": 1}; return m }, +} + +func (s *S) TestUnmarshalNull(c *C) { + for _, test := range unmarshalNullTests { + item := test() + zero := reflect.Zero(reflect.TypeOf(item).Elem()).Interface() + err := yaml.Unmarshal([]byte("null"), item) + c.Assert(err, IsNil) + if reflect.TypeOf(item).Kind() == reflect.Map { + c.Assert(reflect.ValueOf(item).Interface(), DeepEquals, reflect.MakeMap(reflect.TypeOf(item)).Interface()) + } else { + c.Assert(reflect.ValueOf(item).Elem().Interface(), DeepEquals, zero) + } + } +} + +func (s *S) TestUnmarshalSliceOnPreset(c *C) { + // Issue #48. + v := struct{ A []int }{[]int{1}} + yaml.Unmarshal([]byte("a: [2]"), &v) + c.Assert(v.A, DeepEquals, []int{2}) +} + +var unmarshalStrictTests = []struct { + data string + value interface{} + error string +}{{ + data: "a: 1\nc: 2\n", + value: struct{ A, B int }{A: 1}, + error: `yaml: unmarshal errors:\n line 2: field c not found in type struct { A int; B int }`, +}, { + data: "a: 1\nb: 2\na: 3\n", + value: struct{ A, B int }{A: 3, B: 2}, + error: `yaml: unmarshal errors:\n line 3: field a already set in type struct { A int; B int }`, +}, { + data: "c: 3\na: 1\nb: 2\nc: 4\n", + value: struct { + A int + inlineB `yaml:",inline"` + }{ + A: 1, + inlineB: inlineB{ + B: 2, + inlineC: inlineC{ + C: 4, + }, + }, + }, + error: `yaml: unmarshal errors:\n line 4: field c already set in type struct { A int; yaml_test.inlineB "yaml:\\",inline\\"" }`, +}, { + data: "c: 0\na: 1\nb: 2\nc: 1\n", + value: struct { + A int + inlineB `yaml:",inline"` + }{ + A: 1, + inlineB: inlineB{ + B: 2, + inlineC: inlineC{ + C: 1, + }, + }, + }, + error: `yaml: unmarshal errors:\n line 4: field c already set in type struct { A int; yaml_test.inlineB "yaml:\\",inline\\"" }`, +}, { + data: "c: 1\na: 1\nb: 2\nc: 3\n", + value: struct { + A int + M map[string]interface{} `yaml:",inline"` + }{ + A: 1, + M: map[string]interface{}{ + "b": 2, + "c": 3, + }, + }, + error: `yaml: unmarshal errors:\n line 4: key "c" already set in map`, +}, { + data: "a: 1\n9: 2\nnull: 3\n9: 4", + value: map[interface{}]interface{}{ + "a": 1, + nil: 3, + 9: 4, + }, + error: `yaml: unmarshal errors:\n line 4: key 9 already set in map`, +}} + +func (s *S) TestUnmarshalStrict(c *C) { + for i, item := range unmarshalStrictTests { + c.Logf("test %d: %q", i, item.data) + // First test that normal Unmarshal unmarshals to the expected value. + t := reflect.ValueOf(item.value).Type() + value := reflect.New(t) + err := yaml.Unmarshal([]byte(item.data), value.Interface()) + c.Assert(err, Equals, nil) + c.Assert(value.Elem().Interface(), DeepEquals, item.value) + + // Then test that UnmarshalStrict fails on the same thing. + t = reflect.ValueOf(item.value).Type() + value = reflect.New(t) + err = yaml.UnmarshalStrict([]byte(item.data), value.Interface()) + c.Assert(err, ErrorMatches, item.error) + } +} + +type textUnmarshaler struct { + S string +} + +func (t *textUnmarshaler) UnmarshalText(s []byte) error { + t.S = string(s) + return nil +} + +func (s *S) TestFuzzCrashers(c *C) { + cases := []string{ + // runtime error: index out of range + "\"\\0\\\r\n", + + // should not happen + " 0: [\n] 0", + "? ? \"\n\" 0", + " - {\n000}0", + "0:\n 0: [0\n] 0", + " - \"\n000\"0", + " - \"\n000\"\"", + "0:\n - {\n000}0", + "0:\n - \"\n000\"0", + "0:\n - \"\n000\"\"", + + // runtime error: index out of range + " \ufeff\n", + "? \ufeff\n", + "? \ufeff:\n", + "0: \ufeff\n", + "? \ufeff: \ufeff\n", + } + for _, data := range cases { + var v interface{} + _ = yaml.Unmarshal([]byte(data), &v) + } +} + +//var data []byte +//func init() { +// var err error +// data, err = ioutil.ReadFile("/tmp/file.yaml") +// if err != nil { +// panic(err) +// } +//} +// +//func (s *S) BenchmarkUnmarshal(c *C) { +// var err error +// for i := 0; i < c.N; i++ { +// var v map[string]interface{} +// err = yaml.Unmarshal(data, &v) +// } +// if err != nil { +// panic(err) +// } +//} +// +//func (s *S) BenchmarkMarshal(c *C) { +// var v map[string]interface{} +// yaml.Unmarshal(data, &v) +// c.ResetTimer() +// for i := 0; i < c.N; i++ { +// yaml.Marshal(&v) +// } +//} diff --git a/api/vendor/gopkg.in/yaml.v2/emitterc.go b/api/vendor/gopkg.in/yaml.v2/emitterc.go new file mode 100644 index 0000000..a1c2cc5 --- /dev/null +++ b/api/vendor/gopkg.in/yaml.v2/emitterc.go @@ -0,0 +1,1685 @@ +package yaml + +import ( + "bytes" + "fmt" +) + +// Flush the buffer if needed. +func flush(emitter *yaml_emitter_t) bool { + if emitter.buffer_pos+5 >= len(emitter.buffer) { + return yaml_emitter_flush(emitter) + } + return true +} + +// Put a character to the output buffer. +func put(emitter *yaml_emitter_t, value byte) bool { + if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) { + return false + } + emitter.buffer[emitter.buffer_pos] = value + emitter.buffer_pos++ + emitter.column++ + return true +} + +// Put a line break to the output buffer. +func put_break(emitter *yaml_emitter_t) bool { + if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) { + return false + } + switch emitter.line_break { + case yaml_CR_BREAK: + emitter.buffer[emitter.buffer_pos] = '\r' + emitter.buffer_pos += 1 + case yaml_LN_BREAK: + emitter.buffer[emitter.buffer_pos] = '\n' + emitter.buffer_pos += 1 + case yaml_CRLN_BREAK: + emitter.buffer[emitter.buffer_pos+0] = '\r' + emitter.buffer[emitter.buffer_pos+1] = '\n' + emitter.buffer_pos += 2 + default: + panic("unknown line break setting") + } + emitter.column = 0 + emitter.line++ + return true +} + +// Copy a character from a string into buffer. +func write(emitter *yaml_emitter_t, s []byte, i *int) bool { + if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) { + return false + } + p := emitter.buffer_pos + w := width(s[*i]) + switch w { + case 4: + emitter.buffer[p+3] = s[*i+3] + fallthrough + case 3: + emitter.buffer[p+2] = s[*i+2] + fallthrough + case 2: + emitter.buffer[p+1] = s[*i+1] + fallthrough + case 1: + emitter.buffer[p+0] = s[*i+0] + default: + panic("unknown character width") + } + emitter.column++ + emitter.buffer_pos += w + *i += w + return true +} + +// Write a whole string into buffer. +func write_all(emitter *yaml_emitter_t, s []byte) bool { + for i := 0; i < len(s); { + if !write(emitter, s, &i) { + return false + } + } + return true +} + +// Copy a line break character from a string into buffer. +func write_break(emitter *yaml_emitter_t, s []byte, i *int) bool { + if s[*i] == '\n' { + if !put_break(emitter) { + return false + } + *i++ + } else { + if !write(emitter, s, i) { + return false + } + emitter.column = 0 + emitter.line++ + } + return true +} + +// Set an emitter error and return false. +func yaml_emitter_set_emitter_error(emitter *yaml_emitter_t, problem string) bool { + emitter.error = yaml_EMITTER_ERROR + emitter.problem = problem + return false +} + +// Emit an event. +func yaml_emitter_emit(emitter *yaml_emitter_t, event *yaml_event_t) bool { + emitter.events = append(emitter.events, *event) + for !yaml_emitter_need_more_events(emitter) { + event := &emitter.events[emitter.events_head] + if !yaml_emitter_analyze_event(emitter, event) { + return false + } + if !yaml_emitter_state_machine(emitter, event) { + return false + } + yaml_event_delete(event) + emitter.events_head++ + } + return true +} + +// Check if we need to accumulate more events before emitting. +// +// We accumulate extra +// - 1 event for DOCUMENT-START +// - 2 events for SEQUENCE-START +// - 3 events for MAPPING-START +// +func yaml_emitter_need_more_events(emitter *yaml_emitter_t) bool { + if emitter.events_head == len(emitter.events) { + return true + } + var accumulate int + switch emitter.events[emitter.events_head].typ { + case yaml_DOCUMENT_START_EVENT: + accumulate = 1 + break + case yaml_SEQUENCE_START_EVENT: + accumulate = 2 + break + case yaml_MAPPING_START_EVENT: + accumulate = 3 + break + default: + return false + } + if len(emitter.events)-emitter.events_head > accumulate { + return false + } + var level int + for i := emitter.events_head; i < len(emitter.events); i++ { + switch emitter.events[i].typ { + case yaml_STREAM_START_EVENT, yaml_DOCUMENT_START_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT: + level++ + case yaml_STREAM_END_EVENT, yaml_DOCUMENT_END_EVENT, yaml_SEQUENCE_END_EVENT, yaml_MAPPING_END_EVENT: + level-- + } + if level == 0 { + return false + } + } + return true +} + +// Append a directive to the directives stack. +func yaml_emitter_append_tag_directive(emitter *yaml_emitter_t, value *yaml_tag_directive_t, allow_duplicates bool) bool { + for i := 0; i < len(emitter.tag_directives); i++ { + if bytes.Equal(value.handle, emitter.tag_directives[i].handle) { + if allow_duplicates { + return true + } + return yaml_emitter_set_emitter_error(emitter, "duplicate %TAG directive") + } + } + + // [Go] Do we actually need to copy this given garbage collection + // and the lack of deallocating destructors? + tag_copy := yaml_tag_directive_t{ + handle: make([]byte, len(value.handle)), + prefix: make([]byte, len(value.prefix)), + } + copy(tag_copy.handle, value.handle) + copy(tag_copy.prefix, value.prefix) + emitter.tag_directives = append(emitter.tag_directives, tag_copy) + return true +} + +// Increase the indentation level. +func yaml_emitter_increase_indent(emitter *yaml_emitter_t, flow, indentless bool) bool { + emitter.indents = append(emitter.indents, emitter.indent) + if emitter.indent < 0 { + if flow { + emitter.indent = emitter.best_indent + } else { + emitter.indent = 0 + } + } else if !indentless { + emitter.indent += emitter.best_indent + } + return true +} + +// State dispatcher. +func yaml_emitter_state_machine(emitter *yaml_emitter_t, event *yaml_event_t) bool { + switch emitter.state { + default: + case yaml_EMIT_STREAM_START_STATE: + return yaml_emitter_emit_stream_start(emitter, event) + + case yaml_EMIT_FIRST_DOCUMENT_START_STATE: + return yaml_emitter_emit_document_start(emitter, event, true) + + case yaml_EMIT_DOCUMENT_START_STATE: + return yaml_emitter_emit_document_start(emitter, event, false) + + case yaml_EMIT_DOCUMENT_CONTENT_STATE: + return yaml_emitter_emit_document_content(emitter, event) + + case yaml_EMIT_DOCUMENT_END_STATE: + return yaml_emitter_emit_document_end(emitter, event) + + case yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE: + return yaml_emitter_emit_flow_sequence_item(emitter, event, true) + + case yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE: + return yaml_emitter_emit_flow_sequence_item(emitter, event, false) + + case yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE: + return yaml_emitter_emit_flow_mapping_key(emitter, event, true) + + case yaml_EMIT_FLOW_MAPPING_KEY_STATE: + return yaml_emitter_emit_flow_mapping_key(emitter, event, false) + + case yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE: + return yaml_emitter_emit_flow_mapping_value(emitter, event, true) + + case yaml_EMIT_FLOW_MAPPING_VALUE_STATE: + return yaml_emitter_emit_flow_mapping_value(emitter, event, false) + + case yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE: + return yaml_emitter_emit_block_sequence_item(emitter, event, true) + + case yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE: + return yaml_emitter_emit_block_sequence_item(emitter, event, false) + + case yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE: + return yaml_emitter_emit_block_mapping_key(emitter, event, true) + + case yaml_EMIT_BLOCK_MAPPING_KEY_STATE: + return yaml_emitter_emit_block_mapping_key(emitter, event, false) + + case yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE: + return yaml_emitter_emit_block_mapping_value(emitter, event, true) + + case yaml_EMIT_BLOCK_MAPPING_VALUE_STATE: + return yaml_emitter_emit_block_mapping_value(emitter, event, false) + + case yaml_EMIT_END_STATE: + return yaml_emitter_set_emitter_error(emitter, "expected nothing after STREAM-END") + } + panic("invalid emitter state") +} + +// Expect STREAM-START. +func yaml_emitter_emit_stream_start(emitter *yaml_emitter_t, event *yaml_event_t) bool { + if event.typ != yaml_STREAM_START_EVENT { + return yaml_emitter_set_emitter_error(emitter, "expected STREAM-START") + } + if emitter.encoding == yaml_ANY_ENCODING { + emitter.encoding = event.encoding + if emitter.encoding == yaml_ANY_ENCODING { + emitter.encoding = yaml_UTF8_ENCODING + } + } + if emitter.best_indent < 2 || emitter.best_indent > 9 { + emitter.best_indent = 2 + } + if emitter.best_width >= 0 && emitter.best_width <= emitter.best_indent*2 { + emitter.best_width = 80 + } + if emitter.best_width < 0 { + emitter.best_width = 1<<31 - 1 + } + if emitter.line_break == yaml_ANY_BREAK { + emitter.line_break = yaml_LN_BREAK + } + + emitter.indent = -1 + emitter.line = 0 + emitter.column = 0 + emitter.whitespace = true + emitter.indention = true + + if emitter.encoding != yaml_UTF8_ENCODING { + if !yaml_emitter_write_bom(emitter) { + return false + } + } + emitter.state = yaml_EMIT_FIRST_DOCUMENT_START_STATE + return true +} + +// Expect DOCUMENT-START or STREAM-END. +func yaml_emitter_emit_document_start(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { + + if event.typ == yaml_DOCUMENT_START_EVENT { + + if event.version_directive != nil { + if !yaml_emitter_analyze_version_directive(emitter, event.version_directive) { + return false + } + } + + for i := 0; i < len(event.tag_directives); i++ { + tag_directive := &event.tag_directives[i] + if !yaml_emitter_analyze_tag_directive(emitter, tag_directive) { + return false + } + if !yaml_emitter_append_tag_directive(emitter, tag_directive, false) { + return false + } + } + + for i := 0; i < len(default_tag_directives); i++ { + tag_directive := &default_tag_directives[i] + if !yaml_emitter_append_tag_directive(emitter, tag_directive, true) { + return false + } + } + + implicit := event.implicit + if !first || emitter.canonical { + implicit = false + } + + if emitter.open_ended && (event.version_directive != nil || len(event.tag_directives) > 0) { + if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + } + + if event.version_directive != nil { + implicit = false + if !yaml_emitter_write_indicator(emitter, []byte("%YAML"), true, false, false) { + return false + } + if !yaml_emitter_write_indicator(emitter, []byte("1.1"), true, false, false) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + } + + if len(event.tag_directives) > 0 { + implicit = false + for i := 0; i < len(event.tag_directives); i++ { + tag_directive := &event.tag_directives[i] + if !yaml_emitter_write_indicator(emitter, []byte("%TAG"), true, false, false) { + return false + } + if !yaml_emitter_write_tag_handle(emitter, tag_directive.handle) { + return false + } + if !yaml_emitter_write_tag_content(emitter, tag_directive.prefix, true) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + } + } + + if yaml_emitter_check_empty_document(emitter) { + implicit = false + } + if !implicit { + if !yaml_emitter_write_indent(emitter) { + return false + } + if !yaml_emitter_write_indicator(emitter, []byte("---"), true, false, false) { + return false + } + if emitter.canonical { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + } + + emitter.state = yaml_EMIT_DOCUMENT_CONTENT_STATE + return true + } + + if event.typ == yaml_STREAM_END_EVENT { + if emitter.open_ended { + if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !yaml_emitter_flush(emitter) { + return false + } + emitter.state = yaml_EMIT_END_STATE + return true + } + + return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-START or STREAM-END") +} + +// Expect the root node. +func yaml_emitter_emit_document_content(emitter *yaml_emitter_t, event *yaml_event_t) bool { + emitter.states = append(emitter.states, yaml_EMIT_DOCUMENT_END_STATE) + return yaml_emitter_emit_node(emitter, event, true, false, false, false) +} + +// Expect DOCUMENT-END. +func yaml_emitter_emit_document_end(emitter *yaml_emitter_t, event *yaml_event_t) bool { + if event.typ != yaml_DOCUMENT_END_EVENT { + return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-END") + } + if !yaml_emitter_write_indent(emitter) { + return false + } + if !event.implicit { + // [Go] Allocate the slice elsewhere. + if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !yaml_emitter_flush(emitter) { + return false + } + emitter.state = yaml_EMIT_DOCUMENT_START_STATE + emitter.tag_directives = emitter.tag_directives[:0] + return true +} + +// Expect a flow item node. +func yaml_emitter_emit_flow_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { + if first { + if !yaml_emitter_write_indicator(emitter, []byte{'['}, true, true, false) { + return false + } + if !yaml_emitter_increase_indent(emitter, true, false) { + return false + } + emitter.flow_level++ + } + + if event.typ == yaml_SEQUENCE_END_EVENT { + emitter.flow_level-- + emitter.indent = emitter.indents[len(emitter.indents)-1] + emitter.indents = emitter.indents[:len(emitter.indents)-1] + if emitter.canonical && !first { + if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !yaml_emitter_write_indicator(emitter, []byte{']'}, false, false, false) { + return false + } + emitter.state = emitter.states[len(emitter.states)-1] + emitter.states = emitter.states[:len(emitter.states)-1] + + return true + } + + if !first { + if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { + return false + } + } + + if emitter.canonical || emitter.column > emitter.best_width { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + emitter.states = append(emitter.states, yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE) + return yaml_emitter_emit_node(emitter, event, false, true, false, false) +} + +// Expect a flow key node. +func yaml_emitter_emit_flow_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { + if first { + if !yaml_emitter_write_indicator(emitter, []byte{'{'}, true, true, false) { + return false + } + if !yaml_emitter_increase_indent(emitter, true, false) { + return false + } + emitter.flow_level++ + } + + if event.typ == yaml_MAPPING_END_EVENT { + emitter.flow_level-- + emitter.indent = emitter.indents[len(emitter.indents)-1] + emitter.indents = emitter.indents[:len(emitter.indents)-1] + if emitter.canonical && !first { + if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !yaml_emitter_write_indicator(emitter, []byte{'}'}, false, false, false) { + return false + } + emitter.state = emitter.states[len(emitter.states)-1] + emitter.states = emitter.states[:len(emitter.states)-1] + return true + } + + if !first { + if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { + return false + } + } + if emitter.canonical || emitter.column > emitter.best_width { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + + if !emitter.canonical && yaml_emitter_check_simple_key(emitter) { + emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE) + return yaml_emitter_emit_node(emitter, event, false, false, true, true) + } + if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, false) { + return false + } + emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_VALUE_STATE) + return yaml_emitter_emit_node(emitter, event, false, false, true, false) +} + +// Expect a flow value node. +func yaml_emitter_emit_flow_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool { + if simple { + if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) { + return false + } + } else { + if emitter.canonical || emitter.column > emitter.best_width { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, false) { + return false + } + } + emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_KEY_STATE) + return yaml_emitter_emit_node(emitter, event, false, false, true, false) +} + +// Expect a block item node. +func yaml_emitter_emit_block_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { + if first { + if !yaml_emitter_increase_indent(emitter, false, emitter.mapping_context && !emitter.indention) { + return false + } + } + if event.typ == yaml_SEQUENCE_END_EVENT { + emitter.indent = emitter.indents[len(emitter.indents)-1] + emitter.indents = emitter.indents[:len(emitter.indents)-1] + emitter.state = emitter.states[len(emitter.states)-1] + emitter.states = emitter.states[:len(emitter.states)-1] + return true + } + if !yaml_emitter_write_indent(emitter) { + return false + } + if !yaml_emitter_write_indicator(emitter, []byte{'-'}, true, false, true) { + return false + } + emitter.states = append(emitter.states, yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE) + return yaml_emitter_emit_node(emitter, event, false, true, false, false) +} + +// Expect a block key node. +func yaml_emitter_emit_block_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { + if first { + if !yaml_emitter_increase_indent(emitter, false, false) { + return false + } + } + if event.typ == yaml_MAPPING_END_EVENT { + emitter.indent = emitter.indents[len(emitter.indents)-1] + emitter.indents = emitter.indents[:len(emitter.indents)-1] + emitter.state = emitter.states[len(emitter.states)-1] + emitter.states = emitter.states[:len(emitter.states)-1] + return true + } + if !yaml_emitter_write_indent(emitter) { + return false + } + if yaml_emitter_check_simple_key(emitter) { + emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE) + return yaml_emitter_emit_node(emitter, event, false, false, true, true) + } + if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, true) { + return false + } + emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_VALUE_STATE) + return yaml_emitter_emit_node(emitter, event, false, false, true, false) +} + +// Expect a block value node. +func yaml_emitter_emit_block_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool { + if simple { + if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) { + return false + } + } else { + if !yaml_emitter_write_indent(emitter) { + return false + } + if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, true) { + return false + } + } + emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_KEY_STATE) + return yaml_emitter_emit_node(emitter, event, false, false, true, false) +} + +// Expect a node. +func yaml_emitter_emit_node(emitter *yaml_emitter_t, event *yaml_event_t, + root bool, sequence bool, mapping bool, simple_key bool) bool { + + emitter.root_context = root + emitter.sequence_context = sequence + emitter.mapping_context = mapping + emitter.simple_key_context = simple_key + + switch event.typ { + case yaml_ALIAS_EVENT: + return yaml_emitter_emit_alias(emitter, event) + case yaml_SCALAR_EVENT: + return yaml_emitter_emit_scalar(emitter, event) + case yaml_SEQUENCE_START_EVENT: + return yaml_emitter_emit_sequence_start(emitter, event) + case yaml_MAPPING_START_EVENT: + return yaml_emitter_emit_mapping_start(emitter, event) + default: + return yaml_emitter_set_emitter_error(emitter, + fmt.Sprintf("expected SCALAR, SEQUENCE-START, MAPPING-START, or ALIAS, but got %v", event.typ)) + } +} + +// Expect ALIAS. +func yaml_emitter_emit_alias(emitter *yaml_emitter_t, event *yaml_event_t) bool { + if !yaml_emitter_process_anchor(emitter) { + return false + } + emitter.state = emitter.states[len(emitter.states)-1] + emitter.states = emitter.states[:len(emitter.states)-1] + return true +} + +// Expect SCALAR. +func yaml_emitter_emit_scalar(emitter *yaml_emitter_t, event *yaml_event_t) bool { + if !yaml_emitter_select_scalar_style(emitter, event) { + return false + } + if !yaml_emitter_process_anchor(emitter) { + return false + } + if !yaml_emitter_process_tag(emitter) { + return false + } + if !yaml_emitter_increase_indent(emitter, true, false) { + return false + } + if !yaml_emitter_process_scalar(emitter) { + return false + } + emitter.indent = emitter.indents[len(emitter.indents)-1] + emitter.indents = emitter.indents[:len(emitter.indents)-1] + emitter.state = emitter.states[len(emitter.states)-1] + emitter.states = emitter.states[:len(emitter.states)-1] + return true +} + +// Expect SEQUENCE-START. +func yaml_emitter_emit_sequence_start(emitter *yaml_emitter_t, event *yaml_event_t) bool { + if !yaml_emitter_process_anchor(emitter) { + return false + } + if !yaml_emitter_process_tag(emitter) { + return false + } + if emitter.flow_level > 0 || emitter.canonical || event.sequence_style() == yaml_FLOW_SEQUENCE_STYLE || + yaml_emitter_check_empty_sequence(emitter) { + emitter.state = yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE + } else { + emitter.state = yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE + } + return true +} + +// Expect MAPPING-START. +func yaml_emitter_emit_mapping_start(emitter *yaml_emitter_t, event *yaml_event_t) bool { + if !yaml_emitter_process_anchor(emitter) { + return false + } + if !yaml_emitter_process_tag(emitter) { + return false + } + if emitter.flow_level > 0 || emitter.canonical || event.mapping_style() == yaml_FLOW_MAPPING_STYLE || + yaml_emitter_check_empty_mapping(emitter) { + emitter.state = yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE + } else { + emitter.state = yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE + } + return true +} + +// Check if the document content is an empty scalar. +func yaml_emitter_check_empty_document(emitter *yaml_emitter_t) bool { + return false // [Go] Huh? +} + +// Check if the next events represent an empty sequence. +func yaml_emitter_check_empty_sequence(emitter *yaml_emitter_t) bool { + if len(emitter.events)-emitter.events_head < 2 { + return false + } + return emitter.events[emitter.events_head].typ == yaml_SEQUENCE_START_EVENT && + emitter.events[emitter.events_head+1].typ == yaml_SEQUENCE_END_EVENT +} + +// Check if the next events represent an empty mapping. +func yaml_emitter_check_empty_mapping(emitter *yaml_emitter_t) bool { + if len(emitter.events)-emitter.events_head < 2 { + return false + } + return emitter.events[emitter.events_head].typ == yaml_MAPPING_START_EVENT && + emitter.events[emitter.events_head+1].typ == yaml_MAPPING_END_EVENT +} + +// Check if the next node can be expressed as a simple key. +func yaml_emitter_check_simple_key(emitter *yaml_emitter_t) bool { + length := 0 + switch emitter.events[emitter.events_head].typ { + case yaml_ALIAS_EVENT: + length += len(emitter.anchor_data.anchor) + case yaml_SCALAR_EVENT: + if emitter.scalar_data.multiline { + return false + } + length += len(emitter.anchor_data.anchor) + + len(emitter.tag_data.handle) + + len(emitter.tag_data.suffix) + + len(emitter.scalar_data.value) + case yaml_SEQUENCE_START_EVENT: + if !yaml_emitter_check_empty_sequence(emitter) { + return false + } + length += len(emitter.anchor_data.anchor) + + len(emitter.tag_data.handle) + + len(emitter.tag_data.suffix) + case yaml_MAPPING_START_EVENT: + if !yaml_emitter_check_empty_mapping(emitter) { + return false + } + length += len(emitter.anchor_data.anchor) + + len(emitter.tag_data.handle) + + len(emitter.tag_data.suffix) + default: + return false + } + return length <= 128 +} + +// Determine an acceptable scalar style. +func yaml_emitter_select_scalar_style(emitter *yaml_emitter_t, event *yaml_event_t) bool { + + no_tag := len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0 + if no_tag && !event.implicit && !event.quoted_implicit { + return yaml_emitter_set_emitter_error(emitter, "neither tag nor implicit flags are specified") + } + + style := event.scalar_style() + if style == yaml_ANY_SCALAR_STYLE { + style = yaml_PLAIN_SCALAR_STYLE + } + if emitter.canonical { + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + if emitter.simple_key_context && emitter.scalar_data.multiline { + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + + if style == yaml_PLAIN_SCALAR_STYLE { + if emitter.flow_level > 0 && !emitter.scalar_data.flow_plain_allowed || + emitter.flow_level == 0 && !emitter.scalar_data.block_plain_allowed { + style = yaml_SINGLE_QUOTED_SCALAR_STYLE + } + if len(emitter.scalar_data.value) == 0 && (emitter.flow_level > 0 || emitter.simple_key_context) { + style = yaml_SINGLE_QUOTED_SCALAR_STYLE + } + if no_tag && !event.implicit { + style = yaml_SINGLE_QUOTED_SCALAR_STYLE + } + } + if style == yaml_SINGLE_QUOTED_SCALAR_STYLE { + if !emitter.scalar_data.single_quoted_allowed { + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + } + if style == yaml_LITERAL_SCALAR_STYLE || style == yaml_FOLDED_SCALAR_STYLE { + if !emitter.scalar_data.block_allowed || emitter.flow_level > 0 || emitter.simple_key_context { + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + } + + if no_tag && !event.quoted_implicit && style != yaml_PLAIN_SCALAR_STYLE { + emitter.tag_data.handle = []byte{'!'} + } + emitter.scalar_data.style = style + return true +} + +// Write an anchor. +func yaml_emitter_process_anchor(emitter *yaml_emitter_t) bool { + if emitter.anchor_data.anchor == nil { + return true + } + c := []byte{'&'} + if emitter.anchor_data.alias { + c[0] = '*' + } + if !yaml_emitter_write_indicator(emitter, c, true, false, false) { + return false + } + return yaml_emitter_write_anchor(emitter, emitter.anchor_data.anchor) +} + +// Write a tag. +func yaml_emitter_process_tag(emitter *yaml_emitter_t) bool { + if len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0 { + return true + } + if len(emitter.tag_data.handle) > 0 { + if !yaml_emitter_write_tag_handle(emitter, emitter.tag_data.handle) { + return false + } + if len(emitter.tag_data.suffix) > 0 { + if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) { + return false + } + } + } else { + // [Go] Allocate these slices elsewhere. + if !yaml_emitter_write_indicator(emitter, []byte("!<"), true, false, false) { + return false + } + if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) { + return false + } + if !yaml_emitter_write_indicator(emitter, []byte{'>'}, false, false, false) { + return false + } + } + return true +} + +// Write a scalar. +func yaml_emitter_process_scalar(emitter *yaml_emitter_t) bool { + switch emitter.scalar_data.style { + case yaml_PLAIN_SCALAR_STYLE: + return yaml_emitter_write_plain_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context) + + case yaml_SINGLE_QUOTED_SCALAR_STYLE: + return yaml_emitter_write_single_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context) + + case yaml_DOUBLE_QUOTED_SCALAR_STYLE: + return yaml_emitter_write_double_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context) + + case yaml_LITERAL_SCALAR_STYLE: + return yaml_emitter_write_literal_scalar(emitter, emitter.scalar_data.value) + + case yaml_FOLDED_SCALAR_STYLE: + return yaml_emitter_write_folded_scalar(emitter, emitter.scalar_data.value) + } + panic("unknown scalar style") +} + +// Check if a %YAML directive is valid. +func yaml_emitter_analyze_version_directive(emitter *yaml_emitter_t, version_directive *yaml_version_directive_t) bool { + if version_directive.major != 1 || version_directive.minor != 1 { + return yaml_emitter_set_emitter_error(emitter, "incompatible %YAML directive") + } + return true +} + +// Check if a %TAG directive is valid. +func yaml_emitter_analyze_tag_directive(emitter *yaml_emitter_t, tag_directive *yaml_tag_directive_t) bool { + handle := tag_directive.handle + prefix := tag_directive.prefix + if len(handle) == 0 { + return yaml_emitter_set_emitter_error(emitter, "tag handle must not be empty") + } + if handle[0] != '!' { + return yaml_emitter_set_emitter_error(emitter, "tag handle must start with '!'") + } + if handle[len(handle)-1] != '!' { + return yaml_emitter_set_emitter_error(emitter, "tag handle must end with '!'") + } + for i := 1; i < len(handle)-1; i += width(handle[i]) { + if !is_alpha(handle, i) { + return yaml_emitter_set_emitter_error(emitter, "tag handle must contain alphanumerical characters only") + } + } + if len(prefix) == 0 { + return yaml_emitter_set_emitter_error(emitter, "tag prefix must not be empty") + } + return true +} + +// Check if an anchor is valid. +func yaml_emitter_analyze_anchor(emitter *yaml_emitter_t, anchor []byte, alias bool) bool { + if len(anchor) == 0 { + problem := "anchor value must not be empty" + if alias { + problem = "alias value must not be empty" + } + return yaml_emitter_set_emitter_error(emitter, problem) + } + for i := 0; i < len(anchor); i += width(anchor[i]) { + if !is_alpha(anchor, i) { + problem := "anchor value must contain alphanumerical characters only" + if alias { + problem = "alias value must contain alphanumerical characters only" + } + return yaml_emitter_set_emitter_error(emitter, problem) + } + } + emitter.anchor_data.anchor = anchor + emitter.anchor_data.alias = alias + return true +} + +// Check if a tag is valid. +func yaml_emitter_analyze_tag(emitter *yaml_emitter_t, tag []byte) bool { + if len(tag) == 0 { + return yaml_emitter_set_emitter_error(emitter, "tag value must not be empty") + } + for i := 0; i < len(emitter.tag_directives); i++ { + tag_directive := &emitter.tag_directives[i] + if bytes.HasPrefix(tag, tag_directive.prefix) { + emitter.tag_data.handle = tag_directive.handle + emitter.tag_data.suffix = tag[len(tag_directive.prefix):] + return true + } + } + emitter.tag_data.suffix = tag + return true +} + +// Check if a scalar is valid. +func yaml_emitter_analyze_scalar(emitter *yaml_emitter_t, value []byte) bool { + var ( + block_indicators = false + flow_indicators = false + line_breaks = false + special_characters = false + + leading_space = false + leading_break = false + trailing_space = false + trailing_break = false + break_space = false + space_break = false + + preceded_by_whitespace = false + followed_by_whitespace = false + previous_space = false + previous_break = false + ) + + emitter.scalar_data.value = value + + if len(value) == 0 { + emitter.scalar_data.multiline = false + emitter.scalar_data.flow_plain_allowed = false + emitter.scalar_data.block_plain_allowed = true + emitter.scalar_data.single_quoted_allowed = true + emitter.scalar_data.block_allowed = false + return true + } + + if len(value) >= 3 && ((value[0] == '-' && value[1] == '-' && value[2] == '-') || (value[0] == '.' && value[1] == '.' && value[2] == '.')) { + block_indicators = true + flow_indicators = true + } + + preceded_by_whitespace = true + for i, w := 0, 0; i < len(value); i += w { + w = width(value[i]) + followed_by_whitespace = i+w >= len(value) || is_blank(value, i+w) + + if i == 0 { + switch value[i] { + case '#', ',', '[', ']', '{', '}', '&', '*', '!', '|', '>', '\'', '"', '%', '@', '`': + flow_indicators = true + block_indicators = true + case '?', ':': + flow_indicators = true + if followed_by_whitespace { + block_indicators = true + } + case '-': + if followed_by_whitespace { + flow_indicators = true + block_indicators = true + } + } + } else { + switch value[i] { + case ',', '?', '[', ']', '{', '}': + flow_indicators = true + case ':': + flow_indicators = true + if followed_by_whitespace { + block_indicators = true + } + case '#': + if preceded_by_whitespace { + flow_indicators = true + block_indicators = true + } + } + } + + if !is_printable(value, i) || !is_ascii(value, i) && !emitter.unicode { + special_characters = true + } + if is_space(value, i) { + if i == 0 { + leading_space = true + } + if i+width(value[i]) == len(value) { + trailing_space = true + } + if previous_break { + break_space = true + } + previous_space = true + previous_break = false + } else if is_break(value, i) { + line_breaks = true + if i == 0 { + leading_break = true + } + if i+width(value[i]) == len(value) { + trailing_break = true + } + if previous_space { + space_break = true + } + previous_space = false + previous_break = true + } else { + previous_space = false + previous_break = false + } + + // [Go]: Why 'z'? Couldn't be the end of the string as that's the loop condition. + preceded_by_whitespace = is_blankz(value, i) + } + + emitter.scalar_data.multiline = line_breaks + emitter.scalar_data.flow_plain_allowed = true + emitter.scalar_data.block_plain_allowed = true + emitter.scalar_data.single_quoted_allowed = true + emitter.scalar_data.block_allowed = true + + if leading_space || leading_break || trailing_space || trailing_break { + emitter.scalar_data.flow_plain_allowed = false + emitter.scalar_data.block_plain_allowed = false + } + if trailing_space { + emitter.scalar_data.block_allowed = false + } + if break_space { + emitter.scalar_data.flow_plain_allowed = false + emitter.scalar_data.block_plain_allowed = false + emitter.scalar_data.single_quoted_allowed = false + } + if space_break || special_characters { + emitter.scalar_data.flow_plain_allowed = false + emitter.scalar_data.block_plain_allowed = false + emitter.scalar_data.single_quoted_allowed = false + emitter.scalar_data.block_allowed = false + } + if line_breaks { + emitter.scalar_data.flow_plain_allowed = false + emitter.scalar_data.block_plain_allowed = false + } + if flow_indicators { + emitter.scalar_data.flow_plain_allowed = false + } + if block_indicators { + emitter.scalar_data.block_plain_allowed = false + } + return true +} + +// Check if the event data is valid. +func yaml_emitter_analyze_event(emitter *yaml_emitter_t, event *yaml_event_t) bool { + + emitter.anchor_data.anchor = nil + emitter.tag_data.handle = nil + emitter.tag_data.suffix = nil + emitter.scalar_data.value = nil + + switch event.typ { + case yaml_ALIAS_EVENT: + if !yaml_emitter_analyze_anchor(emitter, event.anchor, true) { + return false + } + + case yaml_SCALAR_EVENT: + if len(event.anchor) > 0 { + if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) { + return false + } + } + if len(event.tag) > 0 && (emitter.canonical || (!event.implicit && !event.quoted_implicit)) { + if !yaml_emitter_analyze_tag(emitter, event.tag) { + return false + } + } + if !yaml_emitter_analyze_scalar(emitter, event.value) { + return false + } + + case yaml_SEQUENCE_START_EVENT: + if len(event.anchor) > 0 { + if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) { + return false + } + } + if len(event.tag) > 0 && (emitter.canonical || !event.implicit) { + if !yaml_emitter_analyze_tag(emitter, event.tag) { + return false + } + } + + case yaml_MAPPING_START_EVENT: + if len(event.anchor) > 0 { + if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) { + return false + } + } + if len(event.tag) > 0 && (emitter.canonical || !event.implicit) { + if !yaml_emitter_analyze_tag(emitter, event.tag) { + return false + } + } + } + return true +} + +// Write the BOM character. +func yaml_emitter_write_bom(emitter *yaml_emitter_t) bool { + if !flush(emitter) { + return false + } + pos := emitter.buffer_pos + emitter.buffer[pos+0] = '\xEF' + emitter.buffer[pos+1] = '\xBB' + emitter.buffer[pos+2] = '\xBF' + emitter.buffer_pos += 3 + return true +} + +func yaml_emitter_write_indent(emitter *yaml_emitter_t) bool { + indent := emitter.indent + if indent < 0 { + indent = 0 + } + if !emitter.indention || emitter.column > indent || (emitter.column == indent && !emitter.whitespace) { + if !put_break(emitter) { + return false + } + } + for emitter.column < indent { + if !put(emitter, ' ') { + return false + } + } + emitter.whitespace = true + emitter.indention = true + return true +} + +func yaml_emitter_write_indicator(emitter *yaml_emitter_t, indicator []byte, need_whitespace, is_whitespace, is_indention bool) bool { + if need_whitespace && !emitter.whitespace { + if !put(emitter, ' ') { + return false + } + } + if !write_all(emitter, indicator) { + return false + } + emitter.whitespace = is_whitespace + emitter.indention = (emitter.indention && is_indention) + emitter.open_ended = false + return true +} + +func yaml_emitter_write_anchor(emitter *yaml_emitter_t, value []byte) bool { + if !write_all(emitter, value) { + return false + } + emitter.whitespace = false + emitter.indention = false + return true +} + +func yaml_emitter_write_tag_handle(emitter *yaml_emitter_t, value []byte) bool { + if !emitter.whitespace { + if !put(emitter, ' ') { + return false + } + } + if !write_all(emitter, value) { + return false + } + emitter.whitespace = false + emitter.indention = false + return true +} + +func yaml_emitter_write_tag_content(emitter *yaml_emitter_t, value []byte, need_whitespace bool) bool { + if need_whitespace && !emitter.whitespace { + if !put(emitter, ' ') { + return false + } + } + for i := 0; i < len(value); { + var must_write bool + switch value[i] { + case ';', '/', '?', ':', '@', '&', '=', '+', '$', ',', '_', '.', '~', '*', '\'', '(', ')', '[', ']': + must_write = true + default: + must_write = is_alpha(value, i) + } + if must_write { + if !write(emitter, value, &i) { + return false + } + } else { + w := width(value[i]) + for k := 0; k < w; k++ { + octet := value[i] + i++ + if !put(emitter, '%') { + return false + } + + c := octet >> 4 + if c < 10 { + c += '0' + } else { + c += 'A' - 10 + } + if !put(emitter, c) { + return false + } + + c = octet & 0x0f + if c < 10 { + c += '0' + } else { + c += 'A' - 10 + } + if !put(emitter, c) { + return false + } + } + } + } + emitter.whitespace = false + emitter.indention = false + return true +} + +func yaml_emitter_write_plain_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool { + if !emitter.whitespace { + if !put(emitter, ' ') { + return false + } + } + + spaces := false + breaks := false + for i := 0; i < len(value); { + if is_space(value, i) { + if allow_breaks && !spaces && emitter.column > emitter.best_width && !is_space(value, i+1) { + if !yaml_emitter_write_indent(emitter) { + return false + } + i += width(value[i]) + } else { + if !write(emitter, value, &i) { + return false + } + } + spaces = true + } else if is_break(value, i) { + if !breaks && value[i] == '\n' { + if !put_break(emitter) { + return false + } + } + if !write_break(emitter, value, &i) { + return false + } + emitter.indention = true + breaks = true + } else { + if breaks { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !write(emitter, value, &i) { + return false + } + emitter.indention = false + spaces = false + breaks = false + } + } + + emitter.whitespace = false + emitter.indention = false + if emitter.root_context { + emitter.open_ended = true + } + + return true +} + +func yaml_emitter_write_single_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool { + + if !yaml_emitter_write_indicator(emitter, []byte{'\''}, true, false, false) { + return false + } + + spaces := false + breaks := false + for i := 0; i < len(value); { + if is_space(value, i) { + if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 && !is_space(value, i+1) { + if !yaml_emitter_write_indent(emitter) { + return false + } + i += width(value[i]) + } else { + if !write(emitter, value, &i) { + return false + } + } + spaces = true + } else if is_break(value, i) { + if !breaks && value[i] == '\n' { + if !put_break(emitter) { + return false + } + } + if !write_break(emitter, value, &i) { + return false + } + emitter.indention = true + breaks = true + } else { + if breaks { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if value[i] == '\'' { + if !put(emitter, '\'') { + return false + } + } + if !write(emitter, value, &i) { + return false + } + emitter.indention = false + spaces = false + breaks = false + } + } + if !yaml_emitter_write_indicator(emitter, []byte{'\''}, false, false, false) { + return false + } + emitter.whitespace = false + emitter.indention = false + return true +} + +func yaml_emitter_write_double_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool { + spaces := false + if !yaml_emitter_write_indicator(emitter, []byte{'"'}, true, false, false) { + return false + } + + for i := 0; i < len(value); { + if !is_printable(value, i) || (!emitter.unicode && !is_ascii(value, i)) || + is_bom(value, i) || is_break(value, i) || + value[i] == '"' || value[i] == '\\' { + + octet := value[i] + + var w int + var v rune + switch { + case octet&0x80 == 0x00: + w, v = 1, rune(octet&0x7F) + case octet&0xE0 == 0xC0: + w, v = 2, rune(octet&0x1F) + case octet&0xF0 == 0xE0: + w, v = 3, rune(octet&0x0F) + case octet&0xF8 == 0xF0: + w, v = 4, rune(octet&0x07) + } + for k := 1; k < w; k++ { + octet = value[i+k] + v = (v << 6) + (rune(octet) & 0x3F) + } + i += w + + if !put(emitter, '\\') { + return false + } + + var ok bool + switch v { + case 0x00: + ok = put(emitter, '0') + case 0x07: + ok = put(emitter, 'a') + case 0x08: + ok = put(emitter, 'b') + case 0x09: + ok = put(emitter, 't') + case 0x0A: + ok = put(emitter, 'n') + case 0x0b: + ok = put(emitter, 'v') + case 0x0c: + ok = put(emitter, 'f') + case 0x0d: + ok = put(emitter, 'r') + case 0x1b: + ok = put(emitter, 'e') + case 0x22: + ok = put(emitter, '"') + case 0x5c: + ok = put(emitter, '\\') + case 0x85: + ok = put(emitter, 'N') + case 0xA0: + ok = put(emitter, '_') + case 0x2028: + ok = put(emitter, 'L') + case 0x2029: + ok = put(emitter, 'P') + default: + if v <= 0xFF { + ok = put(emitter, 'x') + w = 2 + } else if v <= 0xFFFF { + ok = put(emitter, 'u') + w = 4 + } else { + ok = put(emitter, 'U') + w = 8 + } + for k := (w - 1) * 4; ok && k >= 0; k -= 4 { + digit := byte((v >> uint(k)) & 0x0F) + if digit < 10 { + ok = put(emitter, digit+'0') + } else { + ok = put(emitter, digit+'A'-10) + } + } + } + if !ok { + return false + } + spaces = false + } else if is_space(value, i) { + if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 { + if !yaml_emitter_write_indent(emitter) { + return false + } + if is_space(value, i+1) { + if !put(emitter, '\\') { + return false + } + } + i += width(value[i]) + } else if !write(emitter, value, &i) { + return false + } + spaces = true + } else { + if !write(emitter, value, &i) { + return false + } + spaces = false + } + } + if !yaml_emitter_write_indicator(emitter, []byte{'"'}, false, false, false) { + return false + } + emitter.whitespace = false + emitter.indention = false + return true +} + +func yaml_emitter_write_block_scalar_hints(emitter *yaml_emitter_t, value []byte) bool { + if is_space(value, 0) || is_break(value, 0) { + indent_hint := []byte{'0' + byte(emitter.best_indent)} + if !yaml_emitter_write_indicator(emitter, indent_hint, false, false, false) { + return false + } + } + + emitter.open_ended = false + + var chomp_hint [1]byte + if len(value) == 0 { + chomp_hint[0] = '-' + } else { + i := len(value) - 1 + for value[i]&0xC0 == 0x80 { + i-- + } + if !is_break(value, i) { + chomp_hint[0] = '-' + } else if i == 0 { + chomp_hint[0] = '+' + emitter.open_ended = true + } else { + i-- + for value[i]&0xC0 == 0x80 { + i-- + } + if is_break(value, i) { + chomp_hint[0] = '+' + emitter.open_ended = true + } + } + } + if chomp_hint[0] != 0 { + if !yaml_emitter_write_indicator(emitter, chomp_hint[:], false, false, false) { + return false + } + } + return true +} + +func yaml_emitter_write_literal_scalar(emitter *yaml_emitter_t, value []byte) bool { + if !yaml_emitter_write_indicator(emitter, []byte{'|'}, true, false, false) { + return false + } + if !yaml_emitter_write_block_scalar_hints(emitter, value) { + return false + } + if !put_break(emitter) { + return false + } + emitter.indention = true + emitter.whitespace = true + breaks := true + for i := 0; i < len(value); { + if is_break(value, i) { + if !write_break(emitter, value, &i) { + return false + } + emitter.indention = true + breaks = true + } else { + if breaks { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !write(emitter, value, &i) { + return false + } + emitter.indention = false + breaks = false + } + } + + return true +} + +func yaml_emitter_write_folded_scalar(emitter *yaml_emitter_t, value []byte) bool { + if !yaml_emitter_write_indicator(emitter, []byte{'>'}, true, false, false) { + return false + } + if !yaml_emitter_write_block_scalar_hints(emitter, value) { + return false + } + + if !put_break(emitter) { + return false + } + emitter.indention = true + emitter.whitespace = true + + breaks := true + leading_spaces := true + for i := 0; i < len(value); { + if is_break(value, i) { + if !breaks && !leading_spaces && value[i] == '\n' { + k := 0 + for is_break(value, k) { + k += width(value[k]) + } + if !is_blankz(value, k) { + if !put_break(emitter) { + return false + } + } + } + if !write_break(emitter, value, &i) { + return false + } + emitter.indention = true + breaks = true + } else { + if breaks { + if !yaml_emitter_write_indent(emitter) { + return false + } + leading_spaces = is_blank(value, i) + } + if !breaks && is_space(value, i) && !is_space(value, i+1) && emitter.column > emitter.best_width { + if !yaml_emitter_write_indent(emitter) { + return false + } + i += width(value[i]) + } else { + if !write(emitter, value, &i) { + return false + } + } + emitter.indention = false + breaks = false + } + } + return true +} diff --git a/api/vendor/gopkg.in/yaml.v2/encode.go b/api/vendor/gopkg.in/yaml.v2/encode.go new file mode 100644 index 0000000..a14435e --- /dev/null +++ b/api/vendor/gopkg.in/yaml.v2/encode.go @@ -0,0 +1,362 @@ +package yaml + +import ( + "encoding" + "fmt" + "io" + "reflect" + "regexp" + "sort" + "strconv" + "strings" + "time" + "unicode/utf8" +) + +type encoder struct { + emitter yaml_emitter_t + event yaml_event_t + out []byte + flow bool + // doneInit holds whether the initial stream_start_event has been + // emitted. + doneInit bool +} + +func newEncoder() *encoder { + e := &encoder{} + yaml_emitter_initialize(&e.emitter) + yaml_emitter_set_output_string(&e.emitter, &e.out) + yaml_emitter_set_unicode(&e.emitter, true) + return e +} + +func newEncoderWithWriter(w io.Writer) *encoder { + e := &encoder{} + yaml_emitter_initialize(&e.emitter) + yaml_emitter_set_output_writer(&e.emitter, w) + yaml_emitter_set_unicode(&e.emitter, true) + return e +} + +func (e *encoder) init() { + if e.doneInit { + return + } + yaml_stream_start_event_initialize(&e.event, yaml_UTF8_ENCODING) + e.emit() + e.doneInit = true +} + +func (e *encoder) finish() { + e.emitter.open_ended = false + yaml_stream_end_event_initialize(&e.event) + e.emit() +} + +func (e *encoder) destroy() { + yaml_emitter_delete(&e.emitter) +} + +func (e *encoder) emit() { + // This will internally delete the e.event value. + e.must(yaml_emitter_emit(&e.emitter, &e.event)) +} + +func (e *encoder) must(ok bool) { + if !ok { + msg := e.emitter.problem + if msg == "" { + msg = "unknown problem generating YAML content" + } + failf("%s", msg) + } +} + +func (e *encoder) marshalDoc(tag string, in reflect.Value) { + e.init() + yaml_document_start_event_initialize(&e.event, nil, nil, true) + e.emit() + e.marshal(tag, in) + yaml_document_end_event_initialize(&e.event, true) + e.emit() +} + +func (e *encoder) marshal(tag string, in reflect.Value) { + if !in.IsValid() || in.Kind() == reflect.Ptr && in.IsNil() { + e.nilv() + return + } + iface := in.Interface() + switch m := iface.(type) { + case time.Time, *time.Time: + // Although time.Time implements TextMarshaler, + // we don't want to treat it as a string for YAML + // purposes because YAML has special support for + // timestamps. + case Marshaler: + v, err := m.MarshalYAML() + if err != nil { + fail(err) + } + if v == nil { + e.nilv() + return + } + in = reflect.ValueOf(v) + case encoding.TextMarshaler: + text, err := m.MarshalText() + if err != nil { + fail(err) + } + in = reflect.ValueOf(string(text)) + case nil: + e.nilv() + return + } + switch in.Kind() { + case reflect.Interface: + e.marshal(tag, in.Elem()) + case reflect.Map: + e.mapv(tag, in) + case reflect.Ptr: + if in.Type() == ptrTimeType { + e.timev(tag, in.Elem()) + } else { + e.marshal(tag, in.Elem()) + } + case reflect.Struct: + if in.Type() == timeType { + e.timev(tag, in) + } else { + e.structv(tag, in) + } + case reflect.Slice, reflect.Array: + if in.Type().Elem() == mapItemType { + e.itemsv(tag, in) + } else { + e.slicev(tag, in) + } + case reflect.String: + e.stringv(tag, in) + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + if in.Type() == durationType { + e.stringv(tag, reflect.ValueOf(iface.(time.Duration).String())) + } else { + e.intv(tag, in) + } + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + e.uintv(tag, in) + case reflect.Float32, reflect.Float64: + e.floatv(tag, in) + case reflect.Bool: + e.boolv(tag, in) + default: + panic("cannot marshal type: " + in.Type().String()) + } +} + +func (e *encoder) mapv(tag string, in reflect.Value) { + e.mappingv(tag, func() { + keys := keyList(in.MapKeys()) + sort.Sort(keys) + for _, k := range keys { + e.marshal("", k) + e.marshal("", in.MapIndex(k)) + } + }) +} + +func (e *encoder) itemsv(tag string, in reflect.Value) { + e.mappingv(tag, func() { + slice := in.Convert(reflect.TypeOf([]MapItem{})).Interface().([]MapItem) + for _, item := range slice { + e.marshal("", reflect.ValueOf(item.Key)) + e.marshal("", reflect.ValueOf(item.Value)) + } + }) +} + +func (e *encoder) structv(tag string, in reflect.Value) { + sinfo, err := getStructInfo(in.Type()) + if err != nil { + panic(err) + } + e.mappingv(tag, func() { + for _, info := range sinfo.FieldsList { + var value reflect.Value + if info.Inline == nil { + value = in.Field(info.Num) + } else { + value = in.FieldByIndex(info.Inline) + } + if info.OmitEmpty && isZero(value) { + continue + } + e.marshal("", reflect.ValueOf(info.Key)) + e.flow = info.Flow + e.marshal("", value) + } + if sinfo.InlineMap >= 0 { + m := in.Field(sinfo.InlineMap) + if m.Len() > 0 { + e.flow = false + keys := keyList(m.MapKeys()) + sort.Sort(keys) + for _, k := range keys { + if _, found := sinfo.FieldsMap[k.String()]; found { + panic(fmt.Sprintf("Can't have key %q in inlined map; conflicts with struct field", k.String())) + } + e.marshal("", k) + e.flow = false + e.marshal("", m.MapIndex(k)) + } + } + } + }) +} + +func (e *encoder) mappingv(tag string, f func()) { + implicit := tag == "" + style := yaml_BLOCK_MAPPING_STYLE + if e.flow { + e.flow = false + style = yaml_FLOW_MAPPING_STYLE + } + yaml_mapping_start_event_initialize(&e.event, nil, []byte(tag), implicit, style) + e.emit() + f() + yaml_mapping_end_event_initialize(&e.event) + e.emit() +} + +func (e *encoder) slicev(tag string, in reflect.Value) { + implicit := tag == "" + style := yaml_BLOCK_SEQUENCE_STYLE + if e.flow { + e.flow = false + style = yaml_FLOW_SEQUENCE_STYLE + } + e.must(yaml_sequence_start_event_initialize(&e.event, nil, []byte(tag), implicit, style)) + e.emit() + n := in.Len() + for i := 0; i < n; i++ { + e.marshal("", in.Index(i)) + } + e.must(yaml_sequence_end_event_initialize(&e.event)) + e.emit() +} + +// isBase60 returns whether s is in base 60 notation as defined in YAML 1.1. +// +// The base 60 float notation in YAML 1.1 is a terrible idea and is unsupported +// in YAML 1.2 and by this package, but these should be marshalled quoted for +// the time being for compatibility with other parsers. +func isBase60Float(s string) (result bool) { + // Fast path. + if s == "" { + return false + } + c := s[0] + if !(c == '+' || c == '-' || c >= '0' && c <= '9') || strings.IndexByte(s, ':') < 0 { + return false + } + // Do the full match. + return base60float.MatchString(s) +} + +// From http://yaml.org/type/float.html, except the regular expression there +// is bogus. In practice parsers do not enforce the "\.[0-9_]*" suffix. +var base60float = regexp.MustCompile(`^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+(?:\.[0-9_]*)?$`) + +func (e *encoder) stringv(tag string, in reflect.Value) { + var style yaml_scalar_style_t + s := in.String() + canUsePlain := true + switch { + case !utf8.ValidString(s): + if tag == yaml_BINARY_TAG { + failf("explicitly tagged !!binary data must be base64-encoded") + } + if tag != "" { + failf("cannot marshal invalid UTF-8 data as %s", shortTag(tag)) + } + // It can't be encoded directly as YAML so use a binary tag + // and encode it as base64. + tag = yaml_BINARY_TAG + s = encodeBase64(s) + case tag == "": + // Check to see if it would resolve to a specific + // tag when encoded unquoted. If it doesn't, + // there's no need to quote it. + rtag, _ := resolve("", s) + canUsePlain = rtag == yaml_STR_TAG && !isBase60Float(s) + } + // Note: it's possible for user code to emit invalid YAML + // if they explicitly specify a tag and a string containing + // text that's incompatible with that tag. + switch { + case strings.Contains(s, "\n"): + style = yaml_LITERAL_SCALAR_STYLE + case canUsePlain: + style = yaml_PLAIN_SCALAR_STYLE + default: + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + e.emitScalar(s, "", tag, style) +} + +func (e *encoder) boolv(tag string, in reflect.Value) { + var s string + if in.Bool() { + s = "true" + } else { + s = "false" + } + e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE) +} + +func (e *encoder) intv(tag string, in reflect.Value) { + s := strconv.FormatInt(in.Int(), 10) + e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE) +} + +func (e *encoder) uintv(tag string, in reflect.Value) { + s := strconv.FormatUint(in.Uint(), 10) + e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE) +} + +func (e *encoder) timev(tag string, in reflect.Value) { + t := in.Interface().(time.Time) + s := t.Format(time.RFC3339Nano) + e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE) +} + +func (e *encoder) floatv(tag string, in reflect.Value) { + // Issue #352: When formatting, use the precision of the underlying value + precision := 64 + if in.Kind() == reflect.Float32 { + precision = 32 + } + + s := strconv.FormatFloat(in.Float(), 'g', -1, precision) + switch s { + case "+Inf": + s = ".inf" + case "-Inf": + s = "-.inf" + case "NaN": + s = ".nan" + } + e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE) +} + +func (e *encoder) nilv() { + e.emitScalar("null", "", "", yaml_PLAIN_SCALAR_STYLE) +} + +func (e *encoder) emitScalar(value, anchor, tag string, style yaml_scalar_style_t) { + implicit := tag == "" + e.must(yaml_scalar_event_initialize(&e.event, []byte(anchor), []byte(tag), []byte(value), implicit, implicit, style)) + e.emit() +} diff --git a/api/vendor/gopkg.in/yaml.v2/encode_test.go b/api/vendor/gopkg.in/yaml.v2/encode_test.go new file mode 100644 index 0000000..f0911a7 --- /dev/null +++ b/api/vendor/gopkg.in/yaml.v2/encode_test.go @@ -0,0 +1,595 @@ +package yaml_test + +import ( + "bytes" + "fmt" + "math" + "strconv" + "strings" + "time" + + "net" + "os" + + . "gopkg.in/check.v1" + "gopkg.in/yaml.v2" +) + +var marshalIntTest = 123 + +var marshalTests = []struct { + value interface{} + data string +}{ + { + nil, + "null\n", + }, { + (*marshalerType)(nil), + "null\n", + }, { + &struct{}{}, + "{}\n", + }, { + map[string]string{"v": "hi"}, + "v: hi\n", + }, { + map[string]interface{}{"v": "hi"}, + "v: hi\n", + }, { + map[string]string{"v": "true"}, + "v: \"true\"\n", + }, { + map[string]string{"v": "false"}, + "v: \"false\"\n", + }, { + map[string]interface{}{"v": true}, + "v: true\n", + }, { + map[string]interface{}{"v": false}, + "v: false\n", + }, { + map[string]interface{}{"v": 10}, + "v: 10\n", + }, { + map[string]interface{}{"v": -10}, + "v: -10\n", + }, { + map[string]uint{"v": 42}, + "v: 42\n", + }, { + map[string]interface{}{"v": int64(4294967296)}, + "v: 4294967296\n", + }, { + map[string]int64{"v": int64(4294967296)}, + "v: 4294967296\n", + }, { + map[string]uint64{"v": 4294967296}, + "v: 4294967296\n", + }, { + map[string]interface{}{"v": "10"}, + "v: \"10\"\n", + }, { + map[string]interface{}{"v": 0.1}, + "v: 0.1\n", + }, { + map[string]interface{}{"v": float64(0.1)}, + "v: 0.1\n", + }, { + map[string]interface{}{"v": float32(0.99)}, + "v: 0.99\n", + }, { + map[string]interface{}{"v": -0.1}, + "v: -0.1\n", + }, { + map[string]interface{}{"v": math.Inf(+1)}, + "v: .inf\n", + }, { + map[string]interface{}{"v": math.Inf(-1)}, + "v: -.inf\n", + }, { + map[string]interface{}{"v": math.NaN()}, + "v: .nan\n", + }, { + map[string]interface{}{"v": nil}, + "v: null\n", + }, { + map[string]interface{}{"v": ""}, + "v: \"\"\n", + }, { + map[string][]string{"v": []string{"A", "B"}}, + "v:\n- A\n- B\n", + }, { + map[string][]string{"v": []string{"A", "B\nC"}}, + "v:\n- A\n- |-\n B\n C\n", + }, { + map[string][]interface{}{"v": []interface{}{"A", 1, map[string][]int{"B": []int{2, 3}}}}, + "v:\n- A\n- 1\n- B:\n - 2\n - 3\n", + }, { + map[string]interface{}{"a": map[interface{}]interface{}{"b": "c"}}, + "a:\n b: c\n", + }, { + map[string]interface{}{"a": "-"}, + "a: '-'\n", + }, + + // Simple values. + { + &marshalIntTest, + "123\n", + }, + + // Structures + { + &struct{ Hello string }{"world"}, + "hello: world\n", + }, { + &struct { + A struct { + B string + } + }{struct{ B string }{"c"}}, + "a:\n b: c\n", + }, { + &struct { + A *struct { + B string + } + }{&struct{ B string }{"c"}}, + "a:\n b: c\n", + }, { + &struct { + A *struct { + B string + } + }{}, + "a: null\n", + }, { + &struct{ A int }{1}, + "a: 1\n", + }, { + &struct{ A []int }{[]int{1, 2}}, + "a:\n- 1\n- 2\n", + }, { + &struct{ A [2]int }{[2]int{1, 2}}, + "a:\n- 1\n- 2\n", + }, { + &struct { + B int "a" + }{1}, + "a: 1\n", + }, { + &struct{ A bool }{true}, + "a: true\n", + }, + + // Conditional flag + { + &struct { + A int "a,omitempty" + B int "b,omitempty" + }{1, 0}, + "a: 1\n", + }, { + &struct { + A int "a,omitempty" + B int "b,omitempty" + }{0, 0}, + "{}\n", + }, { + &struct { + A *struct{ X, y int } "a,omitempty,flow" + }{&struct{ X, y int }{1, 2}}, + "a: {x: 1}\n", + }, { + &struct { + A *struct{ X, y int } "a,omitempty,flow" + }{nil}, + "{}\n", + }, { + &struct { + A *struct{ X, y int } "a,omitempty,flow" + }{&struct{ X, y int }{}}, + "a: {x: 0}\n", + }, { + &struct { + A struct{ X, y int } "a,omitempty,flow" + }{struct{ X, y int }{1, 2}}, + "a: {x: 1}\n", + }, { + &struct { + A struct{ X, y int } "a,omitempty,flow" + }{struct{ X, y int }{0, 1}}, + "{}\n", + }, { + &struct { + A float64 "a,omitempty" + B float64 "b,omitempty" + }{1, 0}, + "a: 1\n", + }, + { + &struct { + T1 time.Time "t1,omitempty" + T2 time.Time "t2,omitempty" + T3 *time.Time "t3,omitempty" + T4 *time.Time "t4,omitempty" + }{ + T2: time.Date(2018, 1, 9, 10, 40, 47, 0, time.UTC), + T4: newTime(time.Date(2098, 1, 9, 10, 40, 47, 0, time.UTC)), + }, + "t2: 2018-01-09T10:40:47Z\nt4: 2098-01-09T10:40:47Z\n", + }, + // Nil interface that implements Marshaler. + { + map[string]yaml.Marshaler{ + "a": nil, + }, + "a: null\n", + }, + + // Flow flag + { + &struct { + A []int "a,flow" + }{[]int{1, 2}}, + "a: [1, 2]\n", + }, { + &struct { + A map[string]string "a,flow" + }{map[string]string{"b": "c", "d": "e"}}, + "a: {b: c, d: e}\n", + }, { + &struct { + A struct { + B, D string + } "a,flow" + }{struct{ B, D string }{"c", "e"}}, + "a: {b: c, d: e}\n", + }, + + // Unexported field + { + &struct { + u int + A int + }{0, 1}, + "a: 1\n", + }, + + // Ignored field + { + &struct { + A int + B int "-" + }{1, 2}, + "a: 1\n", + }, + + // Struct inlining + { + &struct { + A int + C inlineB `yaml:",inline"` + }{1, inlineB{2, inlineC{3}}}, + "a: 1\nb: 2\nc: 3\n", + }, + + // Map inlining + { + &struct { + A int + C map[string]int `yaml:",inline"` + }{1, map[string]int{"b": 2, "c": 3}}, + "a: 1\nb: 2\nc: 3\n", + }, + + // Duration + { + map[string]time.Duration{"a": 3 * time.Second}, + "a: 3s\n", + }, + + // Issue #24: bug in map merging logic. + { + map[string]string{"a": ""}, + "a: \n", + }, + + // Issue #34: marshal unsupported base 60 floats quoted for compatibility + // with old YAML 1.1 parsers. + { + map[string]string{"a": "1:1"}, + "a: \"1:1\"\n", + }, + + // Binary data. + { + map[string]string{"a": "\x00"}, + "a: \"\\0\"\n", + }, { + map[string]string{"a": "\x80\x81\x82"}, + "a: !!binary gIGC\n", + }, { + map[string]string{"a": strings.Repeat("\x90", 54)}, + "a: !!binary |\n " + strings.Repeat("kJCQ", 17) + "kJ\n CQ\n", + }, + + // Ordered maps. + { + &yaml.MapSlice{{"b", 2}, {"a", 1}, {"d", 4}, {"c", 3}, {"sub", yaml.MapSlice{{"e", 5}}}}, + "b: 2\na: 1\nd: 4\nc: 3\nsub:\n e: 5\n", + }, + + // Encode unicode as utf-8 rather than in escaped form. + { + map[string]string{"a": "你好"}, + "a: 你好\n", + }, + + // Support encoding.TextMarshaler. + { + map[string]net.IP{"a": net.IPv4(1, 2, 3, 4)}, + "a: 1.2.3.4\n", + }, + // time.Time gets a timestamp tag. + { + map[string]time.Time{"a": time.Date(2015, 2, 24, 18, 19, 39, 0, time.UTC)}, + "a: 2015-02-24T18:19:39Z\n", + }, + { + map[string]*time.Time{"a": newTime(time.Date(2015, 2, 24, 18, 19, 39, 0, time.UTC))}, + "a: 2015-02-24T18:19:39Z\n", + }, + { + // This is confirmed to be properly decoded in Python (libyaml) without a timestamp tag. + map[string]time.Time{"a": time.Date(2015, 2, 24, 18, 19, 39, 123456789, time.FixedZone("FOO", -3*60*60))}, + "a: 2015-02-24T18:19:39.123456789-03:00\n", + }, + // Ensure timestamp-like strings are quoted. + { + map[string]string{"a": "2015-02-24T18:19:39Z"}, + "a: \"2015-02-24T18:19:39Z\"\n", + }, + + // Ensure strings containing ": " are quoted (reported as PR #43, but not reproducible). + { + map[string]string{"a": "b: c"}, + "a: 'b: c'\n", + }, + + // Containing hash mark ('#') in string should be quoted + { + map[string]string{"a": "Hello #comment"}, + "a: 'Hello #comment'\n", + }, + { + map[string]string{"a": "你好 #comment"}, + "a: '你好 #comment'\n", + }, +} + +func (s *S) TestMarshal(c *C) { + defer os.Setenv("TZ", os.Getenv("TZ")) + os.Setenv("TZ", "UTC") + for i, item := range marshalTests { + c.Logf("test %d: %q", i, item.data) + data, err := yaml.Marshal(item.value) + c.Assert(err, IsNil) + c.Assert(string(data), Equals, item.data) + } +} + +func (s *S) TestEncoderSingleDocument(c *C) { + for i, item := range marshalTests { + c.Logf("test %d. %q", i, item.data) + var buf bytes.Buffer + enc := yaml.NewEncoder(&buf) + err := enc.Encode(item.value) + c.Assert(err, Equals, nil) + err = enc.Close() + c.Assert(err, Equals, nil) + c.Assert(buf.String(), Equals, item.data) + } +} + +func (s *S) TestEncoderMultipleDocuments(c *C) { + var buf bytes.Buffer + enc := yaml.NewEncoder(&buf) + err := enc.Encode(map[string]string{"a": "b"}) + c.Assert(err, Equals, nil) + err = enc.Encode(map[string]string{"c": "d"}) + c.Assert(err, Equals, nil) + err = enc.Close() + c.Assert(err, Equals, nil) + c.Assert(buf.String(), Equals, "a: b\n---\nc: d\n") +} + +func (s *S) TestEncoderWriteError(c *C) { + enc := yaml.NewEncoder(errorWriter{}) + err := enc.Encode(map[string]string{"a": "b"}) + c.Assert(err, ErrorMatches, `yaml: write error: some write error`) // Data not flushed yet +} + +type errorWriter struct{} + +func (errorWriter) Write([]byte) (int, error) { + return 0, fmt.Errorf("some write error") +} + +var marshalErrorTests = []struct { + value interface{} + error string + panic string +}{{ + value: &struct { + B int + inlineB ",inline" + }{1, inlineB{2, inlineC{3}}}, + panic: `Duplicated key 'b' in struct struct \{ B int; .*`, +}, { + value: &struct { + A int + B map[string]int ",inline" + }{1, map[string]int{"a": 2}}, + panic: `Can't have key "a" in inlined map; conflicts with struct field`, +}} + +func (s *S) TestMarshalErrors(c *C) { + for _, item := range marshalErrorTests { + if item.panic != "" { + c.Assert(func() { yaml.Marshal(item.value) }, PanicMatches, item.panic) + } else { + _, err := yaml.Marshal(item.value) + c.Assert(err, ErrorMatches, item.error) + } + } +} + +func (s *S) TestMarshalTypeCache(c *C) { + var data []byte + var err error + func() { + type T struct{ A int } + data, err = yaml.Marshal(&T{}) + c.Assert(err, IsNil) + }() + func() { + type T struct{ B int } + data, err = yaml.Marshal(&T{}) + c.Assert(err, IsNil) + }() + c.Assert(string(data), Equals, "b: 0\n") +} + +var marshalerTests = []struct { + data string + value interface{} +}{ + {"_:\n hi: there\n", map[interface{}]interface{}{"hi": "there"}}, + {"_:\n- 1\n- A\n", []interface{}{1, "A"}}, + {"_: 10\n", 10}, + {"_: null\n", nil}, + {"_: BAR!\n", "BAR!"}, +} + +type marshalerType struct { + value interface{} +} + +func (o marshalerType) MarshalText() ([]byte, error) { + panic("MarshalText called on type with MarshalYAML") +} + +func (o marshalerType) MarshalYAML() (interface{}, error) { + return o.value, nil +} + +type marshalerValue struct { + Field marshalerType "_" +} + +func (s *S) TestMarshaler(c *C) { + for _, item := range marshalerTests { + obj := &marshalerValue{} + obj.Field.value = item.value + data, err := yaml.Marshal(obj) + c.Assert(err, IsNil) + c.Assert(string(data), Equals, string(item.data)) + } +} + +func (s *S) TestMarshalerWholeDocument(c *C) { + obj := &marshalerType{} + obj.value = map[string]string{"hello": "world!"} + data, err := yaml.Marshal(obj) + c.Assert(err, IsNil) + c.Assert(string(data), Equals, "hello: world!\n") +} + +type failingMarshaler struct{} + +func (ft *failingMarshaler) MarshalYAML() (interface{}, error) { + return nil, failingErr +} + +func (s *S) TestMarshalerError(c *C) { + _, err := yaml.Marshal(&failingMarshaler{}) + c.Assert(err, Equals, failingErr) +} + +func (s *S) TestSortedOutput(c *C) { + order := []interface{}{ + false, + true, + 1, + uint(1), + 1.0, + 1.1, + 1.2, + 2, + uint(2), + 2.0, + 2.1, + "", + ".1", + ".2", + ".a", + "1", + "2", + "a!10", + "a/0001", + "a/002", + "a/3", + "a/10", + "a/11", + "a/0012", + "a/100", + "a~10", + "ab/1", + "b/1", + "b/01", + "b/2", + "b/02", + "b/3", + "b/03", + "b1", + "b01", + "b3", + "c2.10", + "c10.2", + "d1", + "d7", + "d7abc", + "d12", + "d12a", + } + m := make(map[interface{}]int) + for _, k := range order { + m[k] = 1 + } + data, err := yaml.Marshal(m) + c.Assert(err, IsNil) + out := "\n" + string(data) + last := 0 + for i, k := range order { + repr := fmt.Sprint(k) + if s, ok := k.(string); ok { + if _, err = strconv.ParseFloat(repr, 32); s == "" || err == nil { + repr = `"` + repr + `"` + } + } + index := strings.Index(out, "\n"+repr+":") + if index == -1 { + c.Fatalf("%#v is not in the output: %#v", k, out) + } + if index < last { + c.Fatalf("%#v was generated before %#v: %q", k, order[i-1], out) + } + last = index + } +} + +func newTime(t time.Time) *time.Time { + return &t +} diff --git a/api/vendor/gopkg.in/yaml.v2/example_embedded_test.go b/api/vendor/gopkg.in/yaml.v2/example_embedded_test.go new file mode 100644 index 0000000..171c093 --- /dev/null +++ b/api/vendor/gopkg.in/yaml.v2/example_embedded_test.go @@ -0,0 +1,41 @@ +package yaml_test + +import ( + "fmt" + "log" + + "gopkg.in/yaml.v2" +) + +// An example showing how to unmarshal embedded +// structs from YAML. + +type StructA struct { + A string `yaml:"a"` +} + +type StructB struct { + // Embedded structs are not treated as embedded in YAML by default. To do that, + // add the ",inline" annotation below + StructA `yaml:",inline"` + B string `yaml:"b"` +} + +var data = ` +a: a string from struct A +b: a string from struct B +` + +func ExampleUnmarshal_embedded() { + var b StructB + + err := yaml.Unmarshal([]byte(data), &b) + if err != nil { + log.Fatalf("cannot unmarshal data: %v", err) + } + fmt.Println(b.A) + fmt.Println(b.B) + // Output: + // a string from struct A + // a string from struct B +} diff --git a/api/vendor/gopkg.in/yaml.v2/go.mod b/api/vendor/gopkg.in/yaml.v2/go.mod new file mode 100644 index 0000000..1934e87 --- /dev/null +++ b/api/vendor/gopkg.in/yaml.v2/go.mod @@ -0,0 +1,5 @@ +module "gopkg.in/yaml.v2" + +require ( + "gopkg.in/check.v1" v0.0.0-20161208181325-20d25e280405 +) diff --git a/api/vendor/gopkg.in/yaml.v2/parserc.go b/api/vendor/gopkg.in/yaml.v2/parserc.go new file mode 100644 index 0000000..81d05df --- /dev/null +++ b/api/vendor/gopkg.in/yaml.v2/parserc.go @@ -0,0 +1,1095 @@ +package yaml + +import ( + "bytes" +) + +// The parser implements the following grammar: +// +// stream ::= STREAM-START implicit_document? explicit_document* STREAM-END +// implicit_document ::= block_node DOCUMENT-END* +// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* +// block_node_or_indentless_sequence ::= +// ALIAS +// | properties (block_content | indentless_block_sequence)? +// | block_content +// | indentless_block_sequence +// block_node ::= ALIAS +// | properties block_content? +// | block_content +// flow_node ::= ALIAS +// | properties flow_content? +// | flow_content +// properties ::= TAG ANCHOR? | ANCHOR TAG? +// block_content ::= block_collection | flow_collection | SCALAR +// flow_content ::= flow_collection | SCALAR +// block_collection ::= block_sequence | block_mapping +// flow_collection ::= flow_sequence | flow_mapping +// block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END +// indentless_sequence ::= (BLOCK-ENTRY block_node?)+ +// block_mapping ::= BLOCK-MAPPING_START +// ((KEY block_node_or_indentless_sequence?)? +// (VALUE block_node_or_indentless_sequence?)?)* +// BLOCK-END +// flow_sequence ::= FLOW-SEQUENCE-START +// (flow_sequence_entry FLOW-ENTRY)* +// flow_sequence_entry? +// FLOW-SEQUENCE-END +// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// flow_mapping ::= FLOW-MAPPING-START +// (flow_mapping_entry FLOW-ENTRY)* +// flow_mapping_entry? +// FLOW-MAPPING-END +// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? + +// Peek the next token in the token queue. +func peek_token(parser *yaml_parser_t) *yaml_token_t { + if parser.token_available || yaml_parser_fetch_more_tokens(parser) { + return &parser.tokens[parser.tokens_head] + } + return nil +} + +// Remove the next token from the queue (must be called after peek_token). +func skip_token(parser *yaml_parser_t) { + parser.token_available = false + parser.tokens_parsed++ + parser.stream_end_produced = parser.tokens[parser.tokens_head].typ == yaml_STREAM_END_TOKEN + parser.tokens_head++ +} + +// Get the next event. +func yaml_parser_parse(parser *yaml_parser_t, event *yaml_event_t) bool { + // Erase the event object. + *event = yaml_event_t{} + + // No events after the end of the stream or error. + if parser.stream_end_produced || parser.error != yaml_NO_ERROR || parser.state == yaml_PARSE_END_STATE { + return true + } + + // Generate the next event. + return yaml_parser_state_machine(parser, event) +} + +// Set parser error. +func yaml_parser_set_parser_error(parser *yaml_parser_t, problem string, problem_mark yaml_mark_t) bool { + parser.error = yaml_PARSER_ERROR + parser.problem = problem + parser.problem_mark = problem_mark + return false +} + +func yaml_parser_set_parser_error_context(parser *yaml_parser_t, context string, context_mark yaml_mark_t, problem string, problem_mark yaml_mark_t) bool { + parser.error = yaml_PARSER_ERROR + parser.context = context + parser.context_mark = context_mark + parser.problem = problem + parser.problem_mark = problem_mark + return false +} + +// State dispatcher. +func yaml_parser_state_machine(parser *yaml_parser_t, event *yaml_event_t) bool { + //trace("yaml_parser_state_machine", "state:", parser.state.String()) + + switch parser.state { + case yaml_PARSE_STREAM_START_STATE: + return yaml_parser_parse_stream_start(parser, event) + + case yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE: + return yaml_parser_parse_document_start(parser, event, true) + + case yaml_PARSE_DOCUMENT_START_STATE: + return yaml_parser_parse_document_start(parser, event, false) + + case yaml_PARSE_DOCUMENT_CONTENT_STATE: + return yaml_parser_parse_document_content(parser, event) + + case yaml_PARSE_DOCUMENT_END_STATE: + return yaml_parser_parse_document_end(parser, event) + + case yaml_PARSE_BLOCK_NODE_STATE: + return yaml_parser_parse_node(parser, event, true, false) + + case yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE: + return yaml_parser_parse_node(parser, event, true, true) + + case yaml_PARSE_FLOW_NODE_STATE: + return yaml_parser_parse_node(parser, event, false, false) + + case yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE: + return yaml_parser_parse_block_sequence_entry(parser, event, true) + + case yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE: + return yaml_parser_parse_block_sequence_entry(parser, event, false) + + case yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE: + return yaml_parser_parse_indentless_sequence_entry(parser, event) + + case yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE: + return yaml_parser_parse_block_mapping_key(parser, event, true) + + case yaml_PARSE_BLOCK_MAPPING_KEY_STATE: + return yaml_parser_parse_block_mapping_key(parser, event, false) + + case yaml_PARSE_BLOCK_MAPPING_VALUE_STATE: + return yaml_parser_parse_block_mapping_value(parser, event) + + case yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE: + return yaml_parser_parse_flow_sequence_entry(parser, event, true) + + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE: + return yaml_parser_parse_flow_sequence_entry(parser, event, false) + + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE: + return yaml_parser_parse_flow_sequence_entry_mapping_key(parser, event) + + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE: + return yaml_parser_parse_flow_sequence_entry_mapping_value(parser, event) + + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE: + return yaml_parser_parse_flow_sequence_entry_mapping_end(parser, event) + + case yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE: + return yaml_parser_parse_flow_mapping_key(parser, event, true) + + case yaml_PARSE_FLOW_MAPPING_KEY_STATE: + return yaml_parser_parse_flow_mapping_key(parser, event, false) + + case yaml_PARSE_FLOW_MAPPING_VALUE_STATE: + return yaml_parser_parse_flow_mapping_value(parser, event, false) + + case yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE: + return yaml_parser_parse_flow_mapping_value(parser, event, true) + + default: + panic("invalid parser state") + } +} + +// Parse the production: +// stream ::= STREAM-START implicit_document? explicit_document* STREAM-END +// ************ +func yaml_parser_parse_stream_start(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_STREAM_START_TOKEN { + return yaml_parser_set_parser_error(parser, "did not find expected ", token.start_mark) + } + parser.state = yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE + *event = yaml_event_t{ + typ: yaml_STREAM_START_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + encoding: token.encoding, + } + skip_token(parser) + return true +} + +// Parse the productions: +// implicit_document ::= block_node DOCUMENT-END* +// * +// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* +// ************************* +func yaml_parser_parse_document_start(parser *yaml_parser_t, event *yaml_event_t, implicit bool) bool { + + token := peek_token(parser) + if token == nil { + return false + } + + // Parse extra document end indicators. + if !implicit { + for token.typ == yaml_DOCUMENT_END_TOKEN { + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + } + } + + if implicit && token.typ != yaml_VERSION_DIRECTIVE_TOKEN && + token.typ != yaml_TAG_DIRECTIVE_TOKEN && + token.typ != yaml_DOCUMENT_START_TOKEN && + token.typ != yaml_STREAM_END_TOKEN { + // Parse an implicit document. + if !yaml_parser_process_directives(parser, nil, nil) { + return false + } + parser.states = append(parser.states, yaml_PARSE_DOCUMENT_END_STATE) + parser.state = yaml_PARSE_BLOCK_NODE_STATE + + *event = yaml_event_t{ + typ: yaml_DOCUMENT_START_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + } + + } else if token.typ != yaml_STREAM_END_TOKEN { + // Parse an explicit document. + var version_directive *yaml_version_directive_t + var tag_directives []yaml_tag_directive_t + start_mark := token.start_mark + if !yaml_parser_process_directives(parser, &version_directive, &tag_directives) { + return false + } + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_DOCUMENT_START_TOKEN { + yaml_parser_set_parser_error(parser, + "did not find expected ", token.start_mark) + return false + } + parser.states = append(parser.states, yaml_PARSE_DOCUMENT_END_STATE) + parser.state = yaml_PARSE_DOCUMENT_CONTENT_STATE + end_mark := token.end_mark + + *event = yaml_event_t{ + typ: yaml_DOCUMENT_START_EVENT, + start_mark: start_mark, + end_mark: end_mark, + version_directive: version_directive, + tag_directives: tag_directives, + implicit: false, + } + skip_token(parser) + + } else { + // Parse the stream end. + parser.state = yaml_PARSE_END_STATE + *event = yaml_event_t{ + typ: yaml_STREAM_END_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + } + skip_token(parser) + } + + return true +} + +// Parse the productions: +// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* +// *********** +// +func yaml_parser_parse_document_content(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + if token.typ == yaml_VERSION_DIRECTIVE_TOKEN || + token.typ == yaml_TAG_DIRECTIVE_TOKEN || + token.typ == yaml_DOCUMENT_START_TOKEN || + token.typ == yaml_DOCUMENT_END_TOKEN || + token.typ == yaml_STREAM_END_TOKEN { + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + return yaml_parser_process_empty_scalar(parser, event, + token.start_mark) + } + return yaml_parser_parse_node(parser, event, true, false) +} + +// Parse the productions: +// implicit_document ::= block_node DOCUMENT-END* +// ************* +// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* +// +func yaml_parser_parse_document_end(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + + start_mark := token.start_mark + end_mark := token.start_mark + + implicit := true + if token.typ == yaml_DOCUMENT_END_TOKEN { + end_mark = token.end_mark + skip_token(parser) + implicit = false + } + + parser.tag_directives = parser.tag_directives[:0] + + parser.state = yaml_PARSE_DOCUMENT_START_STATE + *event = yaml_event_t{ + typ: yaml_DOCUMENT_END_EVENT, + start_mark: start_mark, + end_mark: end_mark, + implicit: implicit, + } + return true +} + +// Parse the productions: +// block_node_or_indentless_sequence ::= +// ALIAS +// ***** +// | properties (block_content | indentless_block_sequence)? +// ********** * +// | block_content | indentless_block_sequence +// * +// block_node ::= ALIAS +// ***** +// | properties block_content? +// ********** * +// | block_content +// * +// flow_node ::= ALIAS +// ***** +// | properties flow_content? +// ********** * +// | flow_content +// * +// properties ::= TAG ANCHOR? | ANCHOR TAG? +// ************************* +// block_content ::= block_collection | flow_collection | SCALAR +// ****** +// flow_content ::= flow_collection | SCALAR +// ****** +func yaml_parser_parse_node(parser *yaml_parser_t, event *yaml_event_t, block, indentless_sequence bool) bool { + //defer trace("yaml_parser_parse_node", "block:", block, "indentless_sequence:", indentless_sequence)() + + token := peek_token(parser) + if token == nil { + return false + } + + if token.typ == yaml_ALIAS_TOKEN { + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + *event = yaml_event_t{ + typ: yaml_ALIAS_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + anchor: token.value, + } + skip_token(parser) + return true + } + + start_mark := token.start_mark + end_mark := token.start_mark + + var tag_token bool + var tag_handle, tag_suffix, anchor []byte + var tag_mark yaml_mark_t + if token.typ == yaml_ANCHOR_TOKEN { + anchor = token.value + start_mark = token.start_mark + end_mark = token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ == yaml_TAG_TOKEN { + tag_token = true + tag_handle = token.value + tag_suffix = token.suffix + tag_mark = token.start_mark + end_mark = token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + } + } else if token.typ == yaml_TAG_TOKEN { + tag_token = true + tag_handle = token.value + tag_suffix = token.suffix + start_mark = token.start_mark + tag_mark = token.start_mark + end_mark = token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ == yaml_ANCHOR_TOKEN { + anchor = token.value + end_mark = token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + } + } + + var tag []byte + if tag_token { + if len(tag_handle) == 0 { + tag = tag_suffix + tag_suffix = nil + } else { + for i := range parser.tag_directives { + if bytes.Equal(parser.tag_directives[i].handle, tag_handle) { + tag = append([]byte(nil), parser.tag_directives[i].prefix...) + tag = append(tag, tag_suffix...) + break + } + } + if len(tag) == 0 { + yaml_parser_set_parser_error_context(parser, + "while parsing a node", start_mark, + "found undefined tag handle", tag_mark) + return false + } + } + } + + implicit := len(tag) == 0 + if indentless_sequence && token.typ == yaml_BLOCK_ENTRY_TOKEN { + end_mark = token.end_mark + parser.state = yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE + *event = yaml_event_t{ + typ: yaml_SEQUENCE_START_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(yaml_BLOCK_SEQUENCE_STYLE), + } + return true + } + if token.typ == yaml_SCALAR_TOKEN { + var plain_implicit, quoted_implicit bool + end_mark = token.end_mark + if (len(tag) == 0 && token.style == yaml_PLAIN_SCALAR_STYLE) || (len(tag) == 1 && tag[0] == '!') { + plain_implicit = true + } else if len(tag) == 0 { + quoted_implicit = true + } + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + + *event = yaml_event_t{ + typ: yaml_SCALAR_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + value: token.value, + implicit: plain_implicit, + quoted_implicit: quoted_implicit, + style: yaml_style_t(token.style), + } + skip_token(parser) + return true + } + if token.typ == yaml_FLOW_SEQUENCE_START_TOKEN { + // [Go] Some of the events below can be merged as they differ only on style. + end_mark = token.end_mark + parser.state = yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE + *event = yaml_event_t{ + typ: yaml_SEQUENCE_START_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(yaml_FLOW_SEQUENCE_STYLE), + } + return true + } + if token.typ == yaml_FLOW_MAPPING_START_TOKEN { + end_mark = token.end_mark + parser.state = yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE + *event = yaml_event_t{ + typ: yaml_MAPPING_START_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(yaml_FLOW_MAPPING_STYLE), + } + return true + } + if block && token.typ == yaml_BLOCK_SEQUENCE_START_TOKEN { + end_mark = token.end_mark + parser.state = yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE + *event = yaml_event_t{ + typ: yaml_SEQUENCE_START_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(yaml_BLOCK_SEQUENCE_STYLE), + } + return true + } + if block && token.typ == yaml_BLOCK_MAPPING_START_TOKEN { + end_mark = token.end_mark + parser.state = yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE + *event = yaml_event_t{ + typ: yaml_MAPPING_START_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(yaml_BLOCK_MAPPING_STYLE), + } + return true + } + if len(anchor) > 0 || len(tag) > 0 { + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + + *event = yaml_event_t{ + typ: yaml_SCALAR_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + implicit: implicit, + quoted_implicit: false, + style: yaml_style_t(yaml_PLAIN_SCALAR_STYLE), + } + return true + } + + context := "while parsing a flow node" + if block { + context = "while parsing a block node" + } + yaml_parser_set_parser_error_context(parser, context, start_mark, + "did not find expected node content", token.start_mark) + return false +} + +// Parse the productions: +// block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END +// ******************** *********** * ********* +// +func yaml_parser_parse_block_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { + if first { + token := peek_token(parser) + parser.marks = append(parser.marks, token.start_mark) + skip_token(parser) + } + + token := peek_token(parser) + if token == nil { + return false + } + + if token.typ == yaml_BLOCK_ENTRY_TOKEN { + mark := token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_BLOCK_ENTRY_TOKEN && token.typ != yaml_BLOCK_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE) + return yaml_parser_parse_node(parser, event, true, false) + } else { + parser.state = yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE + return yaml_parser_process_empty_scalar(parser, event, mark) + } + } + if token.typ == yaml_BLOCK_END_TOKEN { + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + + *event = yaml_event_t{ + typ: yaml_SEQUENCE_END_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + } + + skip_token(parser) + return true + } + + context_mark := parser.marks[len(parser.marks)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + return yaml_parser_set_parser_error_context(parser, + "while parsing a block collection", context_mark, + "did not find expected '-' indicator", token.start_mark) +} + +// Parse the productions: +// indentless_sequence ::= (BLOCK-ENTRY block_node?)+ +// *********** * +func yaml_parser_parse_indentless_sequence_entry(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + + if token.typ == yaml_BLOCK_ENTRY_TOKEN { + mark := token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_BLOCK_ENTRY_TOKEN && + token.typ != yaml_KEY_TOKEN && + token.typ != yaml_VALUE_TOKEN && + token.typ != yaml_BLOCK_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE) + return yaml_parser_parse_node(parser, event, true, false) + } + parser.state = yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE + return yaml_parser_process_empty_scalar(parser, event, mark) + } + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + + *event = yaml_event_t{ + typ: yaml_SEQUENCE_END_EVENT, + start_mark: token.start_mark, + end_mark: token.start_mark, // [Go] Shouldn't this be token.end_mark? + } + return true +} + +// Parse the productions: +// block_mapping ::= BLOCK-MAPPING_START +// ******************* +// ((KEY block_node_or_indentless_sequence?)? +// *** * +// (VALUE block_node_or_indentless_sequence?)?)* +// +// BLOCK-END +// ********* +// +func yaml_parser_parse_block_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { + if first { + token := peek_token(parser) + parser.marks = append(parser.marks, token.start_mark) + skip_token(parser) + } + + token := peek_token(parser) + if token == nil { + return false + } + + if token.typ == yaml_KEY_TOKEN { + mark := token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_KEY_TOKEN && + token.typ != yaml_VALUE_TOKEN && + token.typ != yaml_BLOCK_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_BLOCK_MAPPING_VALUE_STATE) + return yaml_parser_parse_node(parser, event, true, true) + } else { + parser.state = yaml_PARSE_BLOCK_MAPPING_VALUE_STATE + return yaml_parser_process_empty_scalar(parser, event, mark) + } + } else if token.typ == yaml_BLOCK_END_TOKEN { + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + *event = yaml_event_t{ + typ: yaml_MAPPING_END_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + } + skip_token(parser) + return true + } + + context_mark := parser.marks[len(parser.marks)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + return yaml_parser_set_parser_error_context(parser, + "while parsing a block mapping", context_mark, + "did not find expected key", token.start_mark) +} + +// Parse the productions: +// block_mapping ::= BLOCK-MAPPING_START +// +// ((KEY block_node_or_indentless_sequence?)? +// +// (VALUE block_node_or_indentless_sequence?)?)* +// ***** * +// BLOCK-END +// +// +func yaml_parser_parse_block_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + if token.typ == yaml_VALUE_TOKEN { + mark := token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_KEY_TOKEN && + token.typ != yaml_VALUE_TOKEN && + token.typ != yaml_BLOCK_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_BLOCK_MAPPING_KEY_STATE) + return yaml_parser_parse_node(parser, event, true, true) + } + parser.state = yaml_PARSE_BLOCK_MAPPING_KEY_STATE + return yaml_parser_process_empty_scalar(parser, event, mark) + } + parser.state = yaml_PARSE_BLOCK_MAPPING_KEY_STATE + return yaml_parser_process_empty_scalar(parser, event, token.start_mark) +} + +// Parse the productions: +// flow_sequence ::= FLOW-SEQUENCE-START +// ******************* +// (flow_sequence_entry FLOW-ENTRY)* +// * ********** +// flow_sequence_entry? +// * +// FLOW-SEQUENCE-END +// ***************** +// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// * +// +func yaml_parser_parse_flow_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { + if first { + token := peek_token(parser) + parser.marks = append(parser.marks, token.start_mark) + skip_token(parser) + } + token := peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { + if !first { + if token.typ == yaml_FLOW_ENTRY_TOKEN { + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + } else { + context_mark := parser.marks[len(parser.marks)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + return yaml_parser_set_parser_error_context(parser, + "while parsing a flow sequence", context_mark, + "did not find expected ',' or ']'", token.start_mark) + } + } + + if token.typ == yaml_KEY_TOKEN { + parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE + *event = yaml_event_t{ + typ: yaml_MAPPING_START_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + implicit: true, + style: yaml_style_t(yaml_FLOW_MAPPING_STYLE), + } + skip_token(parser) + return true + } else if token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE) + return yaml_parser_parse_node(parser, event, false, false) + } + } + + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + + *event = yaml_event_t{ + typ: yaml_SEQUENCE_END_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + } + + skip_token(parser) + return true +} + +// +// Parse the productions: +// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// *** * +// +func yaml_parser_parse_flow_sequence_entry_mapping_key(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_VALUE_TOKEN && + token.typ != yaml_FLOW_ENTRY_TOKEN && + token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE) + return yaml_parser_parse_node(parser, event, false, false) + } + mark := token.end_mark + skip_token(parser) + parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE + return yaml_parser_process_empty_scalar(parser, event, mark) +} + +// Parse the productions: +// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// ***** * +// +func yaml_parser_parse_flow_sequence_entry_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + if token.typ == yaml_VALUE_TOKEN { + skip_token(parser) + token := peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_FLOW_ENTRY_TOKEN && token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE) + return yaml_parser_parse_node(parser, event, false, false) + } + } + parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE + return yaml_parser_process_empty_scalar(parser, event, token.start_mark) +} + +// Parse the productions: +// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// * +// +func yaml_parser_parse_flow_sequence_entry_mapping_end(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE + *event = yaml_event_t{ + typ: yaml_MAPPING_END_EVENT, + start_mark: token.start_mark, + end_mark: token.start_mark, // [Go] Shouldn't this be end_mark? + } + return true +} + +// Parse the productions: +// flow_mapping ::= FLOW-MAPPING-START +// ****************** +// (flow_mapping_entry FLOW-ENTRY)* +// * ********** +// flow_mapping_entry? +// ****************** +// FLOW-MAPPING-END +// **************** +// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// * *** * +// +func yaml_parser_parse_flow_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { + if first { + token := peek_token(parser) + parser.marks = append(parser.marks, token.start_mark) + skip_token(parser) + } + + token := peek_token(parser) + if token == nil { + return false + } + + if token.typ != yaml_FLOW_MAPPING_END_TOKEN { + if !first { + if token.typ == yaml_FLOW_ENTRY_TOKEN { + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + } else { + context_mark := parser.marks[len(parser.marks)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + return yaml_parser_set_parser_error_context(parser, + "while parsing a flow mapping", context_mark, + "did not find expected ',' or '}'", token.start_mark) + } + } + + if token.typ == yaml_KEY_TOKEN { + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_VALUE_TOKEN && + token.typ != yaml_FLOW_ENTRY_TOKEN && + token.typ != yaml_FLOW_MAPPING_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_VALUE_STATE) + return yaml_parser_parse_node(parser, event, false, false) + } else { + parser.state = yaml_PARSE_FLOW_MAPPING_VALUE_STATE + return yaml_parser_process_empty_scalar(parser, event, token.start_mark) + } + } else if token.typ != yaml_FLOW_MAPPING_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE) + return yaml_parser_parse_node(parser, event, false, false) + } + } + + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + *event = yaml_event_t{ + typ: yaml_MAPPING_END_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + } + skip_token(parser) + return true +} + +// Parse the productions: +// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// * ***** * +// +func yaml_parser_parse_flow_mapping_value(parser *yaml_parser_t, event *yaml_event_t, empty bool) bool { + token := peek_token(parser) + if token == nil { + return false + } + if empty { + parser.state = yaml_PARSE_FLOW_MAPPING_KEY_STATE + return yaml_parser_process_empty_scalar(parser, event, token.start_mark) + } + if token.typ == yaml_VALUE_TOKEN { + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_FLOW_ENTRY_TOKEN && token.typ != yaml_FLOW_MAPPING_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_KEY_STATE) + return yaml_parser_parse_node(parser, event, false, false) + } + } + parser.state = yaml_PARSE_FLOW_MAPPING_KEY_STATE + return yaml_parser_process_empty_scalar(parser, event, token.start_mark) +} + +// Generate an empty scalar event. +func yaml_parser_process_empty_scalar(parser *yaml_parser_t, event *yaml_event_t, mark yaml_mark_t) bool { + *event = yaml_event_t{ + typ: yaml_SCALAR_EVENT, + start_mark: mark, + end_mark: mark, + value: nil, // Empty + implicit: true, + style: yaml_style_t(yaml_PLAIN_SCALAR_STYLE), + } + return true +} + +var default_tag_directives = []yaml_tag_directive_t{ + {[]byte("!"), []byte("!")}, + {[]byte("!!"), []byte("tag:yaml.org,2002:")}, +} + +// Parse directives. +func yaml_parser_process_directives(parser *yaml_parser_t, + version_directive_ref **yaml_version_directive_t, + tag_directives_ref *[]yaml_tag_directive_t) bool { + + var version_directive *yaml_version_directive_t + var tag_directives []yaml_tag_directive_t + + token := peek_token(parser) + if token == nil { + return false + } + + for token.typ == yaml_VERSION_DIRECTIVE_TOKEN || token.typ == yaml_TAG_DIRECTIVE_TOKEN { + if token.typ == yaml_VERSION_DIRECTIVE_TOKEN { + if version_directive != nil { + yaml_parser_set_parser_error(parser, + "found duplicate %YAML directive", token.start_mark) + return false + } + if token.major != 1 || token.minor != 1 { + yaml_parser_set_parser_error(parser, + "found incompatible YAML document", token.start_mark) + return false + } + version_directive = &yaml_version_directive_t{ + major: token.major, + minor: token.minor, + } + } else if token.typ == yaml_TAG_DIRECTIVE_TOKEN { + value := yaml_tag_directive_t{ + handle: token.value, + prefix: token.prefix, + } + if !yaml_parser_append_tag_directive(parser, value, false, token.start_mark) { + return false + } + tag_directives = append(tag_directives, value) + } + + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + } + + for i := range default_tag_directives { + if !yaml_parser_append_tag_directive(parser, default_tag_directives[i], true, token.start_mark) { + return false + } + } + + if version_directive_ref != nil { + *version_directive_ref = version_directive + } + if tag_directives_ref != nil { + *tag_directives_ref = tag_directives + } + return true +} + +// Append a tag directive to the directives stack. +func yaml_parser_append_tag_directive(parser *yaml_parser_t, value yaml_tag_directive_t, allow_duplicates bool, mark yaml_mark_t) bool { + for i := range parser.tag_directives { + if bytes.Equal(value.handle, parser.tag_directives[i].handle) { + if allow_duplicates { + return true + } + return yaml_parser_set_parser_error(parser, "found duplicate %TAG directive", mark) + } + } + + // [Go] I suspect the copy is unnecessary. This was likely done + // because there was no way to track ownership of the data. + value_copy := yaml_tag_directive_t{ + handle: make([]byte, len(value.handle)), + prefix: make([]byte, len(value.prefix)), + } + copy(value_copy.handle, value.handle) + copy(value_copy.prefix, value.prefix) + parser.tag_directives = append(parser.tag_directives, value_copy) + return true +} diff --git a/api/vendor/gopkg.in/yaml.v2/readerc.go b/api/vendor/gopkg.in/yaml.v2/readerc.go new file mode 100644 index 0000000..7c1f5fa --- /dev/null +++ b/api/vendor/gopkg.in/yaml.v2/readerc.go @@ -0,0 +1,412 @@ +package yaml + +import ( + "io" +) + +// Set the reader error and return 0. +func yaml_parser_set_reader_error(parser *yaml_parser_t, problem string, offset int, value int) bool { + parser.error = yaml_READER_ERROR + parser.problem = problem + parser.problem_offset = offset + parser.problem_value = value + return false +} + +// Byte order marks. +const ( + bom_UTF8 = "\xef\xbb\xbf" + bom_UTF16LE = "\xff\xfe" + bom_UTF16BE = "\xfe\xff" +) + +// Determine the input stream encoding by checking the BOM symbol. If no BOM is +// found, the UTF-8 encoding is assumed. Return 1 on success, 0 on failure. +func yaml_parser_determine_encoding(parser *yaml_parser_t) bool { + // Ensure that we had enough bytes in the raw buffer. + for !parser.eof && len(parser.raw_buffer)-parser.raw_buffer_pos < 3 { + if !yaml_parser_update_raw_buffer(parser) { + return false + } + } + + // Determine the encoding. + buf := parser.raw_buffer + pos := parser.raw_buffer_pos + avail := len(buf) - pos + if avail >= 2 && buf[pos] == bom_UTF16LE[0] && buf[pos+1] == bom_UTF16LE[1] { + parser.encoding = yaml_UTF16LE_ENCODING + parser.raw_buffer_pos += 2 + parser.offset += 2 + } else if avail >= 2 && buf[pos] == bom_UTF16BE[0] && buf[pos+1] == bom_UTF16BE[1] { + parser.encoding = yaml_UTF16BE_ENCODING + parser.raw_buffer_pos += 2 + parser.offset += 2 + } else if avail >= 3 && buf[pos] == bom_UTF8[0] && buf[pos+1] == bom_UTF8[1] && buf[pos+2] == bom_UTF8[2] { + parser.encoding = yaml_UTF8_ENCODING + parser.raw_buffer_pos += 3 + parser.offset += 3 + } else { + parser.encoding = yaml_UTF8_ENCODING + } + return true +} + +// Update the raw buffer. +func yaml_parser_update_raw_buffer(parser *yaml_parser_t) bool { + size_read := 0 + + // Return if the raw buffer is full. + if parser.raw_buffer_pos == 0 && len(parser.raw_buffer) == cap(parser.raw_buffer) { + return true + } + + // Return on EOF. + if parser.eof { + return true + } + + // Move the remaining bytes in the raw buffer to the beginning. + if parser.raw_buffer_pos > 0 && parser.raw_buffer_pos < len(parser.raw_buffer) { + copy(parser.raw_buffer, parser.raw_buffer[parser.raw_buffer_pos:]) + } + parser.raw_buffer = parser.raw_buffer[:len(parser.raw_buffer)-parser.raw_buffer_pos] + parser.raw_buffer_pos = 0 + + // Call the read handler to fill the buffer. + size_read, err := parser.read_handler(parser, parser.raw_buffer[len(parser.raw_buffer):cap(parser.raw_buffer)]) + parser.raw_buffer = parser.raw_buffer[:len(parser.raw_buffer)+size_read] + if err == io.EOF { + parser.eof = true + } else if err != nil { + return yaml_parser_set_reader_error(parser, "input error: "+err.Error(), parser.offset, -1) + } + return true +} + +// Ensure that the buffer contains at least `length` characters. +// Return true on success, false on failure. +// +// The length is supposed to be significantly less that the buffer size. +func yaml_parser_update_buffer(parser *yaml_parser_t, length int) bool { + if parser.read_handler == nil { + panic("read handler must be set") + } + + // [Go] This function was changed to guarantee the requested length size at EOF. + // The fact we need to do this is pretty awful, but the description above implies + // for that to be the case, and there are tests + + // If the EOF flag is set and the raw buffer is empty, do nothing. + if parser.eof && parser.raw_buffer_pos == len(parser.raw_buffer) { + // [Go] ACTUALLY! Read the documentation of this function above. + // This is just broken. To return true, we need to have the + // given length in the buffer. Not doing that means every single + // check that calls this function to make sure the buffer has a + // given length is Go) panicking; or C) accessing invalid memory. + //return true + } + + // Return if the buffer contains enough characters. + if parser.unread >= length { + return true + } + + // Determine the input encoding if it is not known yet. + if parser.encoding == yaml_ANY_ENCODING { + if !yaml_parser_determine_encoding(parser) { + return false + } + } + + // Move the unread characters to the beginning of the buffer. + buffer_len := len(parser.buffer) + if parser.buffer_pos > 0 && parser.buffer_pos < buffer_len { + copy(parser.buffer, parser.buffer[parser.buffer_pos:]) + buffer_len -= parser.buffer_pos + parser.buffer_pos = 0 + } else if parser.buffer_pos == buffer_len { + buffer_len = 0 + parser.buffer_pos = 0 + } + + // Open the whole buffer for writing, and cut it before returning. + parser.buffer = parser.buffer[:cap(parser.buffer)] + + // Fill the buffer until it has enough characters. + first := true + for parser.unread < length { + + // Fill the raw buffer if necessary. + if !first || parser.raw_buffer_pos == len(parser.raw_buffer) { + if !yaml_parser_update_raw_buffer(parser) { + parser.buffer = parser.buffer[:buffer_len] + return false + } + } + first = false + + // Decode the raw buffer. + inner: + for parser.raw_buffer_pos != len(parser.raw_buffer) { + var value rune + var width int + + raw_unread := len(parser.raw_buffer) - parser.raw_buffer_pos + + // Decode the next character. + switch parser.encoding { + case yaml_UTF8_ENCODING: + // Decode a UTF-8 character. Check RFC 3629 + // (http://www.ietf.org/rfc/rfc3629.txt) for more details. + // + // The following table (taken from the RFC) is used for + // decoding. + // + // Char. number range | UTF-8 octet sequence + // (hexadecimal) | (binary) + // --------------------+------------------------------------ + // 0000 0000-0000 007F | 0xxxxxxx + // 0000 0080-0000 07FF | 110xxxxx 10xxxxxx + // 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx + // 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + // + // Additionally, the characters in the range 0xD800-0xDFFF + // are prohibited as they are reserved for use with UTF-16 + // surrogate pairs. + + // Determine the length of the UTF-8 sequence. + octet := parser.raw_buffer[parser.raw_buffer_pos] + switch { + case octet&0x80 == 0x00: + width = 1 + case octet&0xE0 == 0xC0: + width = 2 + case octet&0xF0 == 0xE0: + width = 3 + case octet&0xF8 == 0xF0: + width = 4 + default: + // The leading octet is invalid. + return yaml_parser_set_reader_error(parser, + "invalid leading UTF-8 octet", + parser.offset, int(octet)) + } + + // Check if the raw buffer contains an incomplete character. + if width > raw_unread { + if parser.eof { + return yaml_parser_set_reader_error(parser, + "incomplete UTF-8 octet sequence", + parser.offset, -1) + } + break inner + } + + // Decode the leading octet. + switch { + case octet&0x80 == 0x00: + value = rune(octet & 0x7F) + case octet&0xE0 == 0xC0: + value = rune(octet & 0x1F) + case octet&0xF0 == 0xE0: + value = rune(octet & 0x0F) + case octet&0xF8 == 0xF0: + value = rune(octet & 0x07) + default: + value = 0 + } + + // Check and decode the trailing octets. + for k := 1; k < width; k++ { + octet = parser.raw_buffer[parser.raw_buffer_pos+k] + + // Check if the octet is valid. + if (octet & 0xC0) != 0x80 { + return yaml_parser_set_reader_error(parser, + "invalid trailing UTF-8 octet", + parser.offset+k, int(octet)) + } + + // Decode the octet. + value = (value << 6) + rune(octet&0x3F) + } + + // Check the length of the sequence against the value. + switch { + case width == 1: + case width == 2 && value >= 0x80: + case width == 3 && value >= 0x800: + case width == 4 && value >= 0x10000: + default: + return yaml_parser_set_reader_error(parser, + "invalid length of a UTF-8 sequence", + parser.offset, -1) + } + + // Check the range of the value. + if value >= 0xD800 && value <= 0xDFFF || value > 0x10FFFF { + return yaml_parser_set_reader_error(parser, + "invalid Unicode character", + parser.offset, int(value)) + } + + case yaml_UTF16LE_ENCODING, yaml_UTF16BE_ENCODING: + var low, high int + if parser.encoding == yaml_UTF16LE_ENCODING { + low, high = 0, 1 + } else { + low, high = 1, 0 + } + + // The UTF-16 encoding is not as simple as one might + // naively think. Check RFC 2781 + // (http://www.ietf.org/rfc/rfc2781.txt). + // + // Normally, two subsequent bytes describe a Unicode + // character. However a special technique (called a + // surrogate pair) is used for specifying character + // values larger than 0xFFFF. + // + // A surrogate pair consists of two pseudo-characters: + // high surrogate area (0xD800-0xDBFF) + // low surrogate area (0xDC00-0xDFFF) + // + // The following formulas are used for decoding + // and encoding characters using surrogate pairs: + // + // U = U' + 0x10000 (0x01 00 00 <= U <= 0x10 FF FF) + // U' = yyyyyyyyyyxxxxxxxxxx (0 <= U' <= 0x0F FF FF) + // W1 = 110110yyyyyyyyyy + // W2 = 110111xxxxxxxxxx + // + // where U is the character value, W1 is the high surrogate + // area, W2 is the low surrogate area. + + // Check for incomplete UTF-16 character. + if raw_unread < 2 { + if parser.eof { + return yaml_parser_set_reader_error(parser, + "incomplete UTF-16 character", + parser.offset, -1) + } + break inner + } + + // Get the character. + value = rune(parser.raw_buffer[parser.raw_buffer_pos+low]) + + (rune(parser.raw_buffer[parser.raw_buffer_pos+high]) << 8) + + // Check for unexpected low surrogate area. + if value&0xFC00 == 0xDC00 { + return yaml_parser_set_reader_error(parser, + "unexpected low surrogate area", + parser.offset, int(value)) + } + + // Check for a high surrogate area. + if value&0xFC00 == 0xD800 { + width = 4 + + // Check for incomplete surrogate pair. + if raw_unread < 4 { + if parser.eof { + return yaml_parser_set_reader_error(parser, + "incomplete UTF-16 surrogate pair", + parser.offset, -1) + } + break inner + } + + // Get the next character. + value2 := rune(parser.raw_buffer[parser.raw_buffer_pos+low+2]) + + (rune(parser.raw_buffer[parser.raw_buffer_pos+high+2]) << 8) + + // Check for a low surrogate area. + if value2&0xFC00 != 0xDC00 { + return yaml_parser_set_reader_error(parser, + "expected low surrogate area", + parser.offset+2, int(value2)) + } + + // Generate the value of the surrogate pair. + value = 0x10000 + ((value & 0x3FF) << 10) + (value2 & 0x3FF) + } else { + width = 2 + } + + default: + panic("impossible") + } + + // Check if the character is in the allowed range: + // #x9 | #xA | #xD | [#x20-#x7E] (8 bit) + // | #x85 | [#xA0-#xD7FF] | [#xE000-#xFFFD] (16 bit) + // | [#x10000-#x10FFFF] (32 bit) + switch { + case value == 0x09: + case value == 0x0A: + case value == 0x0D: + case value >= 0x20 && value <= 0x7E: + case value == 0x85: + case value >= 0xA0 && value <= 0xD7FF: + case value >= 0xE000 && value <= 0xFFFD: + case value >= 0x10000 && value <= 0x10FFFF: + default: + return yaml_parser_set_reader_error(parser, + "control characters are not allowed", + parser.offset, int(value)) + } + + // Move the raw pointers. + parser.raw_buffer_pos += width + parser.offset += width + + // Finally put the character into the buffer. + if value <= 0x7F { + // 0000 0000-0000 007F . 0xxxxxxx + parser.buffer[buffer_len+0] = byte(value) + buffer_len += 1 + } else if value <= 0x7FF { + // 0000 0080-0000 07FF . 110xxxxx 10xxxxxx + parser.buffer[buffer_len+0] = byte(0xC0 + (value >> 6)) + parser.buffer[buffer_len+1] = byte(0x80 + (value & 0x3F)) + buffer_len += 2 + } else if value <= 0xFFFF { + // 0000 0800-0000 FFFF . 1110xxxx 10xxxxxx 10xxxxxx + parser.buffer[buffer_len+0] = byte(0xE0 + (value >> 12)) + parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 6) & 0x3F)) + parser.buffer[buffer_len+2] = byte(0x80 + (value & 0x3F)) + buffer_len += 3 + } else { + // 0001 0000-0010 FFFF . 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + parser.buffer[buffer_len+0] = byte(0xF0 + (value >> 18)) + parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 12) & 0x3F)) + parser.buffer[buffer_len+2] = byte(0x80 + ((value >> 6) & 0x3F)) + parser.buffer[buffer_len+3] = byte(0x80 + (value & 0x3F)) + buffer_len += 4 + } + + parser.unread++ + } + + // On EOF, put NUL into the buffer and return. + if parser.eof { + parser.buffer[buffer_len] = 0 + buffer_len++ + parser.unread++ + break + } + } + // [Go] Read the documentation of this function above. To return true, + // we need to have the given length in the buffer. Not doing that means + // every single check that calls this function to make sure the buffer + // has a given length is Go) panicking; or C) accessing invalid memory. + // This happens here due to the EOF above breaking early. + for buffer_len < length { + parser.buffer[buffer_len] = 0 + buffer_len++ + } + parser.buffer = parser.buffer[:buffer_len] + return true +} diff --git a/api/vendor/gopkg.in/yaml.v2/resolve.go b/api/vendor/gopkg.in/yaml.v2/resolve.go new file mode 100644 index 0000000..6c151db --- /dev/null +++ b/api/vendor/gopkg.in/yaml.v2/resolve.go @@ -0,0 +1,258 @@ +package yaml + +import ( + "encoding/base64" + "math" + "regexp" + "strconv" + "strings" + "time" +) + +type resolveMapItem struct { + value interface{} + tag string +} + +var resolveTable = make([]byte, 256) +var resolveMap = make(map[string]resolveMapItem) + +func init() { + t := resolveTable + t[int('+')] = 'S' // Sign + t[int('-')] = 'S' + for _, c := range "0123456789" { + t[int(c)] = 'D' // Digit + } + for _, c := range "yYnNtTfFoO~" { + t[int(c)] = 'M' // In map + } + t[int('.')] = '.' // Float (potentially in map) + + var resolveMapList = []struct { + v interface{} + tag string + l []string + }{ + {true, yaml_BOOL_TAG, []string{"y", "Y", "yes", "Yes", "YES"}}, + {true, yaml_BOOL_TAG, []string{"true", "True", "TRUE"}}, + {true, yaml_BOOL_TAG, []string{"on", "On", "ON"}}, + {false, yaml_BOOL_TAG, []string{"n", "N", "no", "No", "NO"}}, + {false, yaml_BOOL_TAG, []string{"false", "False", "FALSE"}}, + {false, yaml_BOOL_TAG, []string{"off", "Off", "OFF"}}, + {nil, yaml_NULL_TAG, []string{"", "~", "null", "Null", "NULL"}}, + {math.NaN(), yaml_FLOAT_TAG, []string{".nan", ".NaN", ".NAN"}}, + {math.Inf(+1), yaml_FLOAT_TAG, []string{".inf", ".Inf", ".INF"}}, + {math.Inf(+1), yaml_FLOAT_TAG, []string{"+.inf", "+.Inf", "+.INF"}}, + {math.Inf(-1), yaml_FLOAT_TAG, []string{"-.inf", "-.Inf", "-.INF"}}, + {"<<", yaml_MERGE_TAG, []string{"<<"}}, + } + + m := resolveMap + for _, item := range resolveMapList { + for _, s := range item.l { + m[s] = resolveMapItem{item.v, item.tag} + } + } +} + +const longTagPrefix = "tag:yaml.org,2002:" + +func shortTag(tag string) string { + // TODO This can easily be made faster and produce less garbage. + if strings.HasPrefix(tag, longTagPrefix) { + return "!!" + tag[len(longTagPrefix):] + } + return tag +} + +func longTag(tag string) string { + if strings.HasPrefix(tag, "!!") { + return longTagPrefix + tag[2:] + } + return tag +} + +func resolvableTag(tag string) bool { + switch tag { + case "", yaml_STR_TAG, yaml_BOOL_TAG, yaml_INT_TAG, yaml_FLOAT_TAG, yaml_NULL_TAG, yaml_TIMESTAMP_TAG: + return true + } + return false +} + +var yamlStyleFloat = regexp.MustCompile(`^[-+]?[0-9]*\.?[0-9]+([eE][-+][0-9]+)?$`) + +func resolve(tag string, in string) (rtag string, out interface{}) { + if !resolvableTag(tag) { + return tag, in + } + + defer func() { + switch tag { + case "", rtag, yaml_STR_TAG, yaml_BINARY_TAG: + return + case yaml_FLOAT_TAG: + if rtag == yaml_INT_TAG { + switch v := out.(type) { + case int64: + rtag = yaml_FLOAT_TAG + out = float64(v) + return + case int: + rtag = yaml_FLOAT_TAG + out = float64(v) + return + } + } + } + failf("cannot decode %s `%s` as a %s", shortTag(rtag), in, shortTag(tag)) + }() + + // Any data is accepted as a !!str or !!binary. + // Otherwise, the prefix is enough of a hint about what it might be. + hint := byte('N') + if in != "" { + hint = resolveTable[in[0]] + } + if hint != 0 && tag != yaml_STR_TAG && tag != yaml_BINARY_TAG { + // Handle things we can lookup in a map. + if item, ok := resolveMap[in]; ok { + return item.tag, item.value + } + + // Base 60 floats are a bad idea, were dropped in YAML 1.2, and + // are purposefully unsupported here. They're still quoted on + // the way out for compatibility with other parser, though. + + switch hint { + case 'M': + // We've already checked the map above. + + case '.': + // Not in the map, so maybe a normal float. + floatv, err := strconv.ParseFloat(in, 64) + if err == nil { + return yaml_FLOAT_TAG, floatv + } + + case 'D', 'S': + // Int, float, or timestamp. + // Only try values as a timestamp if the value is unquoted or there's an explicit + // !!timestamp tag. + if tag == "" || tag == yaml_TIMESTAMP_TAG { + t, ok := parseTimestamp(in) + if ok { + return yaml_TIMESTAMP_TAG, t + } + } + + plain := strings.Replace(in, "_", "", -1) + intv, err := strconv.ParseInt(plain, 0, 64) + if err == nil { + if intv == int64(int(intv)) { + return yaml_INT_TAG, int(intv) + } else { + return yaml_INT_TAG, intv + } + } + uintv, err := strconv.ParseUint(plain, 0, 64) + if err == nil { + return yaml_INT_TAG, uintv + } + if yamlStyleFloat.MatchString(plain) { + floatv, err := strconv.ParseFloat(plain, 64) + if err == nil { + return yaml_FLOAT_TAG, floatv + } + } + if strings.HasPrefix(plain, "0b") { + intv, err := strconv.ParseInt(plain[2:], 2, 64) + if err == nil { + if intv == int64(int(intv)) { + return yaml_INT_TAG, int(intv) + } else { + return yaml_INT_TAG, intv + } + } + uintv, err := strconv.ParseUint(plain[2:], 2, 64) + if err == nil { + return yaml_INT_TAG, uintv + } + } else if strings.HasPrefix(plain, "-0b") { + intv, err := strconv.ParseInt("-" + plain[3:], 2, 64) + if err == nil { + if true || intv == int64(int(intv)) { + return yaml_INT_TAG, int(intv) + } else { + return yaml_INT_TAG, intv + } + } + } + default: + panic("resolveTable item not yet handled: " + string(rune(hint)) + " (with " + in + ")") + } + } + return yaml_STR_TAG, in +} + +// encodeBase64 encodes s as base64 that is broken up into multiple lines +// as appropriate for the resulting length. +func encodeBase64(s string) string { + const lineLen = 70 + encLen := base64.StdEncoding.EncodedLen(len(s)) + lines := encLen/lineLen + 1 + buf := make([]byte, encLen*2+lines) + in := buf[0:encLen] + out := buf[encLen:] + base64.StdEncoding.Encode(in, []byte(s)) + k := 0 + for i := 0; i < len(in); i += lineLen { + j := i + lineLen + if j > len(in) { + j = len(in) + } + k += copy(out[k:], in[i:j]) + if lines > 1 { + out[k] = '\n' + k++ + } + } + return string(out[:k]) +} + +// This is a subset of the formats allowed by the regular expression +// defined at http://yaml.org/type/timestamp.html. +var allowedTimestampFormats = []string{ + "2006-1-2T15:4:5.999999999Z07:00", // RCF3339Nano with short date fields. + "2006-1-2t15:4:5.999999999Z07:00", // RFC3339Nano with short date fields and lower-case "t". + "2006-1-2 15:4:5.999999999", // space separated with no time zone + "2006-1-2", // date only + // Notable exception: time.Parse cannot handle: "2001-12-14 21:59:43.10 -5" + // from the set of examples. +} + +// parseTimestamp parses s as a timestamp string and +// returns the timestamp and reports whether it succeeded. +// Timestamp formats are defined at http://yaml.org/type/timestamp.html +func parseTimestamp(s string) (time.Time, bool) { + // TODO write code to check all the formats supported by + // http://yaml.org/type/timestamp.html instead of using time.Parse. + + // Quick check: all date formats start with YYYY-. + i := 0 + for ; i < len(s); i++ { + if c := s[i]; c < '0' || c > '9' { + break + } + } + if i != 4 || i == len(s) || s[i] != '-' { + return time.Time{}, false + } + for _, format := range allowedTimestampFormats { + if t, err := time.Parse(format, s); err == nil { + return t, true + } + } + return time.Time{}, false +} diff --git a/api/vendor/gopkg.in/yaml.v2/scannerc.go b/api/vendor/gopkg.in/yaml.v2/scannerc.go new file mode 100644 index 0000000..077fd1d --- /dev/null +++ b/api/vendor/gopkg.in/yaml.v2/scannerc.go @@ -0,0 +1,2696 @@ +package yaml + +import ( + "bytes" + "fmt" +) + +// Introduction +// ************ +// +// The following notes assume that you are familiar with the YAML specification +// (http://yaml.org/spec/1.2/spec.html). We mostly follow it, although in +// some cases we are less restrictive that it requires. +// +// The process of transforming a YAML stream into a sequence of events is +// divided on two steps: Scanning and Parsing. +// +// The Scanner transforms the input stream into a sequence of tokens, while the +// parser transform the sequence of tokens produced by the Scanner into a +// sequence of parsing events. +// +// The Scanner is rather clever and complicated. The Parser, on the contrary, +// is a straightforward implementation of a recursive-descendant parser (or, +// LL(1) parser, as it is usually called). +// +// Actually there are two issues of Scanning that might be called "clever", the +// rest is quite straightforward. The issues are "block collection start" and +// "simple keys". Both issues are explained below in details. +// +// Here the Scanning step is explained and implemented. We start with the list +// of all the tokens produced by the Scanner together with short descriptions. +// +// Now, tokens: +// +// STREAM-START(encoding) # The stream start. +// STREAM-END # The stream end. +// VERSION-DIRECTIVE(major,minor) # The '%YAML' directive. +// TAG-DIRECTIVE(handle,prefix) # The '%TAG' directive. +// DOCUMENT-START # '---' +// DOCUMENT-END # '...' +// BLOCK-SEQUENCE-START # Indentation increase denoting a block +// BLOCK-MAPPING-START # sequence or a block mapping. +// BLOCK-END # Indentation decrease. +// FLOW-SEQUENCE-START # '[' +// FLOW-SEQUENCE-END # ']' +// BLOCK-SEQUENCE-START # '{' +// BLOCK-SEQUENCE-END # '}' +// BLOCK-ENTRY # '-' +// FLOW-ENTRY # ',' +// KEY # '?' or nothing (simple keys). +// VALUE # ':' +// ALIAS(anchor) # '*anchor' +// ANCHOR(anchor) # '&anchor' +// TAG(handle,suffix) # '!handle!suffix' +// SCALAR(value,style) # A scalar. +// +// The following two tokens are "virtual" tokens denoting the beginning and the +// end of the stream: +// +// STREAM-START(encoding) +// STREAM-END +// +// We pass the information about the input stream encoding with the +// STREAM-START token. +// +// The next two tokens are responsible for tags: +// +// VERSION-DIRECTIVE(major,minor) +// TAG-DIRECTIVE(handle,prefix) +// +// Example: +// +// %YAML 1.1 +// %TAG ! !foo +// %TAG !yaml! tag:yaml.org,2002: +// --- +// +// The correspoding sequence of tokens: +// +// STREAM-START(utf-8) +// VERSION-DIRECTIVE(1,1) +// TAG-DIRECTIVE("!","!foo") +// TAG-DIRECTIVE("!yaml","tag:yaml.org,2002:") +// DOCUMENT-START +// STREAM-END +// +// Note that the VERSION-DIRECTIVE and TAG-DIRECTIVE tokens occupy a whole +// line. +// +// The document start and end indicators are represented by: +// +// DOCUMENT-START +// DOCUMENT-END +// +// Note that if a YAML stream contains an implicit document (without '---' +// and '...' indicators), no DOCUMENT-START and DOCUMENT-END tokens will be +// produced. +// +// In the following examples, we present whole documents together with the +// produced tokens. +// +// 1. An implicit document: +// +// 'a scalar' +// +// Tokens: +// +// STREAM-START(utf-8) +// SCALAR("a scalar",single-quoted) +// STREAM-END +// +// 2. An explicit document: +// +// --- +// 'a scalar' +// ... +// +// Tokens: +// +// STREAM-START(utf-8) +// DOCUMENT-START +// SCALAR("a scalar",single-quoted) +// DOCUMENT-END +// STREAM-END +// +// 3. Several documents in a stream: +// +// 'a scalar' +// --- +// 'another scalar' +// --- +// 'yet another scalar' +// +// Tokens: +// +// STREAM-START(utf-8) +// SCALAR("a scalar",single-quoted) +// DOCUMENT-START +// SCALAR("another scalar",single-quoted) +// DOCUMENT-START +// SCALAR("yet another scalar",single-quoted) +// STREAM-END +// +// We have already introduced the SCALAR token above. The following tokens are +// used to describe aliases, anchors, tag, and scalars: +// +// ALIAS(anchor) +// ANCHOR(anchor) +// TAG(handle,suffix) +// SCALAR(value,style) +// +// The following series of examples illustrate the usage of these tokens: +// +// 1. A recursive sequence: +// +// &A [ *A ] +// +// Tokens: +// +// STREAM-START(utf-8) +// ANCHOR("A") +// FLOW-SEQUENCE-START +// ALIAS("A") +// FLOW-SEQUENCE-END +// STREAM-END +// +// 2. A tagged scalar: +// +// !!float "3.14" # A good approximation. +// +// Tokens: +// +// STREAM-START(utf-8) +// TAG("!!","float") +// SCALAR("3.14",double-quoted) +// STREAM-END +// +// 3. Various scalar styles: +// +// --- # Implicit empty plain scalars do not produce tokens. +// --- a plain scalar +// --- 'a single-quoted scalar' +// --- "a double-quoted scalar" +// --- |- +// a literal scalar +// --- >- +// a folded +// scalar +// +// Tokens: +// +// STREAM-START(utf-8) +// DOCUMENT-START +// DOCUMENT-START +// SCALAR("a plain scalar",plain) +// DOCUMENT-START +// SCALAR("a single-quoted scalar",single-quoted) +// DOCUMENT-START +// SCALAR("a double-quoted scalar",double-quoted) +// DOCUMENT-START +// SCALAR("a literal scalar",literal) +// DOCUMENT-START +// SCALAR("a folded scalar",folded) +// STREAM-END +// +// Now it's time to review collection-related tokens. We will start with +// flow collections: +// +// FLOW-SEQUENCE-START +// FLOW-SEQUENCE-END +// FLOW-MAPPING-START +// FLOW-MAPPING-END +// FLOW-ENTRY +// KEY +// VALUE +// +// The tokens FLOW-SEQUENCE-START, FLOW-SEQUENCE-END, FLOW-MAPPING-START, and +// FLOW-MAPPING-END represent the indicators '[', ']', '{', and '}' +// correspondingly. FLOW-ENTRY represent the ',' indicator. Finally the +// indicators '?' and ':', which are used for denoting mapping keys and values, +// are represented by the KEY and VALUE tokens. +// +// The following examples show flow collections: +// +// 1. A flow sequence: +// +// [item 1, item 2, item 3] +// +// Tokens: +// +// STREAM-START(utf-8) +// FLOW-SEQUENCE-START +// SCALAR("item 1",plain) +// FLOW-ENTRY +// SCALAR("item 2",plain) +// FLOW-ENTRY +// SCALAR("item 3",plain) +// FLOW-SEQUENCE-END +// STREAM-END +// +// 2. A flow mapping: +// +// { +// a simple key: a value, # Note that the KEY token is produced. +// ? a complex key: another value, +// } +// +// Tokens: +// +// STREAM-START(utf-8) +// FLOW-MAPPING-START +// KEY +// SCALAR("a simple key",plain) +// VALUE +// SCALAR("a value",plain) +// FLOW-ENTRY +// KEY +// SCALAR("a complex key",plain) +// VALUE +// SCALAR("another value",plain) +// FLOW-ENTRY +// FLOW-MAPPING-END +// STREAM-END +// +// A simple key is a key which is not denoted by the '?' indicator. Note that +// the Scanner still produce the KEY token whenever it encounters a simple key. +// +// For scanning block collections, the following tokens are used (note that we +// repeat KEY and VALUE here): +// +// BLOCK-SEQUENCE-START +// BLOCK-MAPPING-START +// BLOCK-END +// BLOCK-ENTRY +// KEY +// VALUE +// +// The tokens BLOCK-SEQUENCE-START and BLOCK-MAPPING-START denote indentation +// increase that precedes a block collection (cf. the INDENT token in Python). +// The token BLOCK-END denote indentation decrease that ends a block collection +// (cf. the DEDENT token in Python). However YAML has some syntax pecularities +// that makes detections of these tokens more complex. +// +// The tokens BLOCK-ENTRY, KEY, and VALUE are used to represent the indicators +// '-', '?', and ':' correspondingly. +// +// The following examples show how the tokens BLOCK-SEQUENCE-START, +// BLOCK-MAPPING-START, and BLOCK-END are emitted by the Scanner: +// +// 1. Block sequences: +// +// - item 1 +// - item 2 +// - +// - item 3.1 +// - item 3.2 +// - +// key 1: value 1 +// key 2: value 2 +// +// Tokens: +// +// STREAM-START(utf-8) +// BLOCK-SEQUENCE-START +// BLOCK-ENTRY +// SCALAR("item 1",plain) +// BLOCK-ENTRY +// SCALAR("item 2",plain) +// BLOCK-ENTRY +// BLOCK-SEQUENCE-START +// BLOCK-ENTRY +// SCALAR("item 3.1",plain) +// BLOCK-ENTRY +// SCALAR("item 3.2",plain) +// BLOCK-END +// BLOCK-ENTRY +// BLOCK-MAPPING-START +// KEY +// SCALAR("key 1",plain) +// VALUE +// SCALAR("value 1",plain) +// KEY +// SCALAR("key 2",plain) +// VALUE +// SCALAR("value 2",plain) +// BLOCK-END +// BLOCK-END +// STREAM-END +// +// 2. Block mappings: +// +// a simple key: a value # The KEY token is produced here. +// ? a complex key +// : another value +// a mapping: +// key 1: value 1 +// key 2: value 2 +// a sequence: +// - item 1 +// - item 2 +// +// Tokens: +// +// STREAM-START(utf-8) +// BLOCK-MAPPING-START +// KEY +// SCALAR("a simple key",plain) +// VALUE +// SCALAR("a value",plain) +// KEY +// SCALAR("a complex key",plain) +// VALUE +// SCALAR("another value",plain) +// KEY +// SCALAR("a mapping",plain) +// BLOCK-MAPPING-START +// KEY +// SCALAR("key 1",plain) +// VALUE +// SCALAR("value 1",plain) +// KEY +// SCALAR("key 2",plain) +// VALUE +// SCALAR("value 2",plain) +// BLOCK-END +// KEY +// SCALAR("a sequence",plain) +// VALUE +// BLOCK-SEQUENCE-START +// BLOCK-ENTRY +// SCALAR("item 1",plain) +// BLOCK-ENTRY +// SCALAR("item 2",plain) +// BLOCK-END +// BLOCK-END +// STREAM-END +// +// YAML does not always require to start a new block collection from a new +// line. If the current line contains only '-', '?', and ':' indicators, a new +// block collection may start at the current line. The following examples +// illustrate this case: +// +// 1. Collections in a sequence: +// +// - - item 1 +// - item 2 +// - key 1: value 1 +// key 2: value 2 +// - ? complex key +// : complex value +// +// Tokens: +// +// STREAM-START(utf-8) +// BLOCK-SEQUENCE-START +// BLOCK-ENTRY +// BLOCK-SEQUENCE-START +// BLOCK-ENTRY +// SCALAR("item 1",plain) +// BLOCK-ENTRY +// SCALAR("item 2",plain) +// BLOCK-END +// BLOCK-ENTRY +// BLOCK-MAPPING-START +// KEY +// SCALAR("key 1",plain) +// VALUE +// SCALAR("value 1",plain) +// KEY +// SCALAR("key 2",plain) +// VALUE +// SCALAR("value 2",plain) +// BLOCK-END +// BLOCK-ENTRY +// BLOCK-MAPPING-START +// KEY +// SCALAR("complex key") +// VALUE +// SCALAR("complex value") +// BLOCK-END +// BLOCK-END +// STREAM-END +// +// 2. Collections in a mapping: +// +// ? a sequence +// : - item 1 +// - item 2 +// ? a mapping +// : key 1: value 1 +// key 2: value 2 +// +// Tokens: +// +// STREAM-START(utf-8) +// BLOCK-MAPPING-START +// KEY +// SCALAR("a sequence",plain) +// VALUE +// BLOCK-SEQUENCE-START +// BLOCK-ENTRY +// SCALAR("item 1",plain) +// BLOCK-ENTRY +// SCALAR("item 2",plain) +// BLOCK-END +// KEY +// SCALAR("a mapping",plain) +// VALUE +// BLOCK-MAPPING-START +// KEY +// SCALAR("key 1",plain) +// VALUE +// SCALAR("value 1",plain) +// KEY +// SCALAR("key 2",plain) +// VALUE +// SCALAR("value 2",plain) +// BLOCK-END +// BLOCK-END +// STREAM-END +// +// YAML also permits non-indented sequences if they are included into a block +// mapping. In this case, the token BLOCK-SEQUENCE-START is not produced: +// +// key: +// - item 1 # BLOCK-SEQUENCE-START is NOT produced here. +// - item 2 +// +// Tokens: +// +// STREAM-START(utf-8) +// BLOCK-MAPPING-START +// KEY +// SCALAR("key",plain) +// VALUE +// BLOCK-ENTRY +// SCALAR("item 1",plain) +// BLOCK-ENTRY +// SCALAR("item 2",plain) +// BLOCK-END +// + +// Ensure that the buffer contains the required number of characters. +// Return true on success, false on failure (reader error or memory error). +func cache(parser *yaml_parser_t, length int) bool { + // [Go] This was inlined: !cache(A, B) -> unread < B && !update(A, B) + return parser.unread >= length || yaml_parser_update_buffer(parser, length) +} + +// Advance the buffer pointer. +func skip(parser *yaml_parser_t) { + parser.mark.index++ + parser.mark.column++ + parser.unread-- + parser.buffer_pos += width(parser.buffer[parser.buffer_pos]) +} + +func skip_line(parser *yaml_parser_t) { + if is_crlf(parser.buffer, parser.buffer_pos) { + parser.mark.index += 2 + parser.mark.column = 0 + parser.mark.line++ + parser.unread -= 2 + parser.buffer_pos += 2 + } else if is_break(parser.buffer, parser.buffer_pos) { + parser.mark.index++ + parser.mark.column = 0 + parser.mark.line++ + parser.unread-- + parser.buffer_pos += width(parser.buffer[parser.buffer_pos]) + } +} + +// Copy a character to a string buffer and advance pointers. +func read(parser *yaml_parser_t, s []byte) []byte { + w := width(parser.buffer[parser.buffer_pos]) + if w == 0 { + panic("invalid character sequence") + } + if len(s) == 0 { + s = make([]byte, 0, 32) + } + if w == 1 && len(s)+w <= cap(s) { + s = s[:len(s)+1] + s[len(s)-1] = parser.buffer[parser.buffer_pos] + parser.buffer_pos++ + } else { + s = append(s, parser.buffer[parser.buffer_pos:parser.buffer_pos+w]...) + parser.buffer_pos += w + } + parser.mark.index++ + parser.mark.column++ + parser.unread-- + return s +} + +// Copy a line break character to a string buffer and advance pointers. +func read_line(parser *yaml_parser_t, s []byte) []byte { + buf := parser.buffer + pos := parser.buffer_pos + switch { + case buf[pos] == '\r' && buf[pos+1] == '\n': + // CR LF . LF + s = append(s, '\n') + parser.buffer_pos += 2 + parser.mark.index++ + parser.unread-- + case buf[pos] == '\r' || buf[pos] == '\n': + // CR|LF . LF + s = append(s, '\n') + parser.buffer_pos += 1 + case buf[pos] == '\xC2' && buf[pos+1] == '\x85': + // NEL . LF + s = append(s, '\n') + parser.buffer_pos += 2 + case buf[pos] == '\xE2' && buf[pos+1] == '\x80' && (buf[pos+2] == '\xA8' || buf[pos+2] == '\xA9'): + // LS|PS . LS|PS + s = append(s, buf[parser.buffer_pos:pos+3]...) + parser.buffer_pos += 3 + default: + return s + } + parser.mark.index++ + parser.mark.column = 0 + parser.mark.line++ + parser.unread-- + return s +} + +// Get the next token. +func yaml_parser_scan(parser *yaml_parser_t, token *yaml_token_t) bool { + // Erase the token object. + *token = yaml_token_t{} // [Go] Is this necessary? + + // No tokens after STREAM-END or error. + if parser.stream_end_produced || parser.error != yaml_NO_ERROR { + return true + } + + // Ensure that the tokens queue contains enough tokens. + if !parser.token_available { + if !yaml_parser_fetch_more_tokens(parser) { + return false + } + } + + // Fetch the next token from the queue. + *token = parser.tokens[parser.tokens_head] + parser.tokens_head++ + parser.tokens_parsed++ + parser.token_available = false + + if token.typ == yaml_STREAM_END_TOKEN { + parser.stream_end_produced = true + } + return true +} + +// Set the scanner error and return false. +func yaml_parser_set_scanner_error(parser *yaml_parser_t, context string, context_mark yaml_mark_t, problem string) bool { + parser.error = yaml_SCANNER_ERROR + parser.context = context + parser.context_mark = context_mark + parser.problem = problem + parser.problem_mark = parser.mark + return false +} + +func yaml_parser_set_scanner_tag_error(parser *yaml_parser_t, directive bool, context_mark yaml_mark_t, problem string) bool { + context := "while parsing a tag" + if directive { + context = "while parsing a %TAG directive" + } + return yaml_parser_set_scanner_error(parser, context, context_mark, problem) +} + +func trace(args ...interface{}) func() { + pargs := append([]interface{}{"+++"}, args...) + fmt.Println(pargs...) + pargs = append([]interface{}{"---"}, args...) + return func() { fmt.Println(pargs...) } +} + +// Ensure that the tokens queue contains at least one token which can be +// returned to the Parser. +func yaml_parser_fetch_more_tokens(parser *yaml_parser_t) bool { + // While we need more tokens to fetch, do it. + for { + // Check if we really need to fetch more tokens. + need_more_tokens := false + + if parser.tokens_head == len(parser.tokens) { + // Queue is empty. + need_more_tokens = true + } else { + // Check if any potential simple key may occupy the head position. + if !yaml_parser_stale_simple_keys(parser) { + return false + } + + for i := range parser.simple_keys { + simple_key := &parser.simple_keys[i] + if simple_key.possible && simple_key.token_number == parser.tokens_parsed { + need_more_tokens = true + break + } + } + } + + // We are finished. + if !need_more_tokens { + break + } + // Fetch the next token. + if !yaml_parser_fetch_next_token(parser) { + return false + } + } + + parser.token_available = true + return true +} + +// The dispatcher for token fetchers. +func yaml_parser_fetch_next_token(parser *yaml_parser_t) bool { + // Ensure that the buffer is initialized. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + // Check if we just started scanning. Fetch STREAM-START then. + if !parser.stream_start_produced { + return yaml_parser_fetch_stream_start(parser) + } + + // Eat whitespaces and comments until we reach the next token. + if !yaml_parser_scan_to_next_token(parser) { + return false + } + + // Remove obsolete potential simple keys. + if !yaml_parser_stale_simple_keys(parser) { + return false + } + + // Check the indentation level against the current column. + if !yaml_parser_unroll_indent(parser, parser.mark.column) { + return false + } + + // Ensure that the buffer contains at least 4 characters. 4 is the length + // of the longest indicators ('--- ' and '... '). + if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) { + return false + } + + // Is it the end of the stream? + if is_z(parser.buffer, parser.buffer_pos) { + return yaml_parser_fetch_stream_end(parser) + } + + // Is it a directive? + if parser.mark.column == 0 && parser.buffer[parser.buffer_pos] == '%' { + return yaml_parser_fetch_directive(parser) + } + + buf := parser.buffer + pos := parser.buffer_pos + + // Is it the document start indicator? + if parser.mark.column == 0 && buf[pos] == '-' && buf[pos+1] == '-' && buf[pos+2] == '-' && is_blankz(buf, pos+3) { + return yaml_parser_fetch_document_indicator(parser, yaml_DOCUMENT_START_TOKEN) + } + + // Is it the document end indicator? + if parser.mark.column == 0 && buf[pos] == '.' && buf[pos+1] == '.' && buf[pos+2] == '.' && is_blankz(buf, pos+3) { + return yaml_parser_fetch_document_indicator(parser, yaml_DOCUMENT_END_TOKEN) + } + + // Is it the flow sequence start indicator? + if buf[pos] == '[' { + return yaml_parser_fetch_flow_collection_start(parser, yaml_FLOW_SEQUENCE_START_TOKEN) + } + + // Is it the flow mapping start indicator? + if parser.buffer[parser.buffer_pos] == '{' { + return yaml_parser_fetch_flow_collection_start(parser, yaml_FLOW_MAPPING_START_TOKEN) + } + + // Is it the flow sequence end indicator? + if parser.buffer[parser.buffer_pos] == ']' { + return yaml_parser_fetch_flow_collection_end(parser, + yaml_FLOW_SEQUENCE_END_TOKEN) + } + + // Is it the flow mapping end indicator? + if parser.buffer[parser.buffer_pos] == '}' { + return yaml_parser_fetch_flow_collection_end(parser, + yaml_FLOW_MAPPING_END_TOKEN) + } + + // Is it the flow entry indicator? + if parser.buffer[parser.buffer_pos] == ',' { + return yaml_parser_fetch_flow_entry(parser) + } + + // Is it the block entry indicator? + if parser.buffer[parser.buffer_pos] == '-' && is_blankz(parser.buffer, parser.buffer_pos+1) { + return yaml_parser_fetch_block_entry(parser) + } + + // Is it the key indicator? + if parser.buffer[parser.buffer_pos] == '?' && (parser.flow_level > 0 || is_blankz(parser.buffer, parser.buffer_pos+1)) { + return yaml_parser_fetch_key(parser) + } + + // Is it the value indicator? + if parser.buffer[parser.buffer_pos] == ':' && (parser.flow_level > 0 || is_blankz(parser.buffer, parser.buffer_pos+1)) { + return yaml_parser_fetch_value(parser) + } + + // Is it an alias? + if parser.buffer[parser.buffer_pos] == '*' { + return yaml_parser_fetch_anchor(parser, yaml_ALIAS_TOKEN) + } + + // Is it an anchor? + if parser.buffer[parser.buffer_pos] == '&' { + return yaml_parser_fetch_anchor(parser, yaml_ANCHOR_TOKEN) + } + + // Is it a tag? + if parser.buffer[parser.buffer_pos] == '!' { + return yaml_parser_fetch_tag(parser) + } + + // Is it a literal scalar? + if parser.buffer[parser.buffer_pos] == '|' && parser.flow_level == 0 { + return yaml_parser_fetch_block_scalar(parser, true) + } + + // Is it a folded scalar? + if parser.buffer[parser.buffer_pos] == '>' && parser.flow_level == 0 { + return yaml_parser_fetch_block_scalar(parser, false) + } + + // Is it a single-quoted scalar? + if parser.buffer[parser.buffer_pos] == '\'' { + return yaml_parser_fetch_flow_scalar(parser, true) + } + + // Is it a double-quoted scalar? + if parser.buffer[parser.buffer_pos] == '"' { + return yaml_parser_fetch_flow_scalar(parser, false) + } + + // Is it a plain scalar? + // + // A plain scalar may start with any non-blank characters except + // + // '-', '?', ':', ',', '[', ']', '{', '}', + // '#', '&', '*', '!', '|', '>', '\'', '\"', + // '%', '@', '`'. + // + // In the block context (and, for the '-' indicator, in the flow context + // too), it may also start with the characters + // + // '-', '?', ':' + // + // if it is followed by a non-space character. + // + // The last rule is more restrictive than the specification requires. + // [Go] Make this logic more reasonable. + //switch parser.buffer[parser.buffer_pos] { + //case '-', '?', ':', ',', '?', '-', ',', ':', ']', '[', '}', '{', '&', '#', '!', '*', '>', '|', '"', '\'', '@', '%', '-', '`': + //} + if !(is_blankz(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == '-' || + parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == ':' || + parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == '[' || + parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '{' || + parser.buffer[parser.buffer_pos] == '}' || parser.buffer[parser.buffer_pos] == '#' || + parser.buffer[parser.buffer_pos] == '&' || parser.buffer[parser.buffer_pos] == '*' || + parser.buffer[parser.buffer_pos] == '!' || parser.buffer[parser.buffer_pos] == '|' || + parser.buffer[parser.buffer_pos] == '>' || parser.buffer[parser.buffer_pos] == '\'' || + parser.buffer[parser.buffer_pos] == '"' || parser.buffer[parser.buffer_pos] == '%' || + parser.buffer[parser.buffer_pos] == '@' || parser.buffer[parser.buffer_pos] == '`') || + (parser.buffer[parser.buffer_pos] == '-' && !is_blank(parser.buffer, parser.buffer_pos+1)) || + (parser.flow_level == 0 && + (parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == ':') && + !is_blankz(parser.buffer, parser.buffer_pos+1)) { + return yaml_parser_fetch_plain_scalar(parser) + } + + // If we don't determine the token type so far, it is an error. + return yaml_parser_set_scanner_error(parser, + "while scanning for the next token", parser.mark, + "found character that cannot start any token") +} + +// Check the list of potential simple keys and remove the positions that +// cannot contain simple keys anymore. +func yaml_parser_stale_simple_keys(parser *yaml_parser_t) bool { + // Check for a potential simple key for each flow level. + for i := range parser.simple_keys { + simple_key := &parser.simple_keys[i] + + // The specification requires that a simple key + // + // - is limited to a single line, + // - is shorter than 1024 characters. + if simple_key.possible && (simple_key.mark.line < parser.mark.line || simple_key.mark.index+1024 < parser.mark.index) { + + // Check if the potential simple key to be removed is required. + if simple_key.required { + return yaml_parser_set_scanner_error(parser, + "while scanning a simple key", simple_key.mark, + "could not find expected ':'") + } + simple_key.possible = false + } + } + return true +} + +// Check if a simple key may start at the current position and add it if +// needed. +func yaml_parser_save_simple_key(parser *yaml_parser_t) bool { + // A simple key is required at the current position if the scanner is in + // the block context and the current column coincides with the indentation + // level. + + required := parser.flow_level == 0 && parser.indent == parser.mark.column + + // + // If the current position may start a simple key, save it. + // + if parser.simple_key_allowed { + simple_key := yaml_simple_key_t{ + possible: true, + required: required, + token_number: parser.tokens_parsed + (len(parser.tokens) - parser.tokens_head), + } + simple_key.mark = parser.mark + + if !yaml_parser_remove_simple_key(parser) { + return false + } + parser.simple_keys[len(parser.simple_keys)-1] = simple_key + } + return true +} + +// Remove a potential simple key at the current flow level. +func yaml_parser_remove_simple_key(parser *yaml_parser_t) bool { + i := len(parser.simple_keys) - 1 + if parser.simple_keys[i].possible { + // If the key is required, it is an error. + if parser.simple_keys[i].required { + return yaml_parser_set_scanner_error(parser, + "while scanning a simple key", parser.simple_keys[i].mark, + "could not find expected ':'") + } + } + // Remove the key from the stack. + parser.simple_keys[i].possible = false + return true +} + +// Increase the flow level and resize the simple key list if needed. +func yaml_parser_increase_flow_level(parser *yaml_parser_t) bool { + // Reset the simple key on the next level. + parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{}) + + // Increase the flow level. + parser.flow_level++ + return true +} + +// Decrease the flow level. +func yaml_parser_decrease_flow_level(parser *yaml_parser_t) bool { + if parser.flow_level > 0 { + parser.flow_level-- + parser.simple_keys = parser.simple_keys[:len(parser.simple_keys)-1] + } + return true +} + +// Push the current indentation level to the stack and set the new level +// the current column is greater than the indentation level. In this case, +// append or insert the specified token into the token queue. +func yaml_parser_roll_indent(parser *yaml_parser_t, column, number int, typ yaml_token_type_t, mark yaml_mark_t) bool { + // In the flow context, do nothing. + if parser.flow_level > 0 { + return true + } + + if parser.indent < column { + // Push the current indentation level to the stack and set the new + // indentation level. + parser.indents = append(parser.indents, parser.indent) + parser.indent = column + + // Create a token and insert it into the queue. + token := yaml_token_t{ + typ: typ, + start_mark: mark, + end_mark: mark, + } + if number > -1 { + number -= parser.tokens_parsed + } + yaml_insert_token(parser, number, &token) + } + return true +} + +// Pop indentation levels from the indents stack until the current level +// becomes less or equal to the column. For each indentation level, append +// the BLOCK-END token. +func yaml_parser_unroll_indent(parser *yaml_parser_t, column int) bool { + // In the flow context, do nothing. + if parser.flow_level > 0 { + return true + } + + // Loop through the indentation levels in the stack. + for parser.indent > column { + // Create a token and append it to the queue. + token := yaml_token_t{ + typ: yaml_BLOCK_END_TOKEN, + start_mark: parser.mark, + end_mark: parser.mark, + } + yaml_insert_token(parser, -1, &token) + + // Pop the indentation level. + parser.indent = parser.indents[len(parser.indents)-1] + parser.indents = parser.indents[:len(parser.indents)-1] + } + return true +} + +// Initialize the scanner and produce the STREAM-START token. +func yaml_parser_fetch_stream_start(parser *yaml_parser_t) bool { + + // Set the initial indentation. + parser.indent = -1 + + // Initialize the simple key stack. + parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{}) + + // A simple key is allowed at the beginning of the stream. + parser.simple_key_allowed = true + + // We have started. + parser.stream_start_produced = true + + // Create the STREAM-START token and append it to the queue. + token := yaml_token_t{ + typ: yaml_STREAM_START_TOKEN, + start_mark: parser.mark, + end_mark: parser.mark, + encoding: parser.encoding, + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the STREAM-END token and shut down the scanner. +func yaml_parser_fetch_stream_end(parser *yaml_parser_t) bool { + + // Force new line. + if parser.mark.column != 0 { + parser.mark.column = 0 + parser.mark.line++ + } + + // Reset the indentation level. + if !yaml_parser_unroll_indent(parser, -1) { + return false + } + + // Reset simple keys. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + parser.simple_key_allowed = false + + // Create the STREAM-END token and append it to the queue. + token := yaml_token_t{ + typ: yaml_STREAM_END_TOKEN, + start_mark: parser.mark, + end_mark: parser.mark, + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce a VERSION-DIRECTIVE or TAG-DIRECTIVE token. +func yaml_parser_fetch_directive(parser *yaml_parser_t) bool { + // Reset the indentation level. + if !yaml_parser_unroll_indent(parser, -1) { + return false + } + + // Reset simple keys. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + parser.simple_key_allowed = false + + // Create the YAML-DIRECTIVE or TAG-DIRECTIVE token. + token := yaml_token_t{} + if !yaml_parser_scan_directive(parser, &token) { + return false + } + // Append the token to the queue. + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the DOCUMENT-START or DOCUMENT-END token. +func yaml_parser_fetch_document_indicator(parser *yaml_parser_t, typ yaml_token_type_t) bool { + // Reset the indentation level. + if !yaml_parser_unroll_indent(parser, -1) { + return false + } + + // Reset simple keys. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + parser.simple_key_allowed = false + + // Consume the token. + start_mark := parser.mark + + skip(parser) + skip(parser) + skip(parser) + + end_mark := parser.mark + + // Create the DOCUMENT-START or DOCUMENT-END token. + token := yaml_token_t{ + typ: typ, + start_mark: start_mark, + end_mark: end_mark, + } + // Append the token to the queue. + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the FLOW-SEQUENCE-START or FLOW-MAPPING-START token. +func yaml_parser_fetch_flow_collection_start(parser *yaml_parser_t, typ yaml_token_type_t) bool { + // The indicators '[' and '{' may start a simple key. + if !yaml_parser_save_simple_key(parser) { + return false + } + + // Increase the flow level. + if !yaml_parser_increase_flow_level(parser) { + return false + } + + // A simple key may follow the indicators '[' and '{'. + parser.simple_key_allowed = true + + // Consume the token. + start_mark := parser.mark + skip(parser) + end_mark := parser.mark + + // Create the FLOW-SEQUENCE-START of FLOW-MAPPING-START token. + token := yaml_token_t{ + typ: typ, + start_mark: start_mark, + end_mark: end_mark, + } + // Append the token to the queue. + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the FLOW-SEQUENCE-END or FLOW-MAPPING-END token. +func yaml_parser_fetch_flow_collection_end(parser *yaml_parser_t, typ yaml_token_type_t) bool { + // Reset any potential simple key on the current flow level. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + // Decrease the flow level. + if !yaml_parser_decrease_flow_level(parser) { + return false + } + + // No simple keys after the indicators ']' and '}'. + parser.simple_key_allowed = false + + // Consume the token. + + start_mark := parser.mark + skip(parser) + end_mark := parser.mark + + // Create the FLOW-SEQUENCE-END of FLOW-MAPPING-END token. + token := yaml_token_t{ + typ: typ, + start_mark: start_mark, + end_mark: end_mark, + } + // Append the token to the queue. + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the FLOW-ENTRY token. +func yaml_parser_fetch_flow_entry(parser *yaml_parser_t) bool { + // Reset any potential simple keys on the current flow level. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + // Simple keys are allowed after ','. + parser.simple_key_allowed = true + + // Consume the token. + start_mark := parser.mark + skip(parser) + end_mark := parser.mark + + // Create the FLOW-ENTRY token and append it to the queue. + token := yaml_token_t{ + typ: yaml_FLOW_ENTRY_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the BLOCK-ENTRY token. +func yaml_parser_fetch_block_entry(parser *yaml_parser_t) bool { + // Check if the scanner is in the block context. + if parser.flow_level == 0 { + // Check if we are allowed to start a new entry. + if !parser.simple_key_allowed { + return yaml_parser_set_scanner_error(parser, "", parser.mark, + "block sequence entries are not allowed in this context") + } + // Add the BLOCK-SEQUENCE-START token if needed. + if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_SEQUENCE_START_TOKEN, parser.mark) { + return false + } + } else { + // It is an error for the '-' indicator to occur in the flow context, + // but we let the Parser detect and report about it because the Parser + // is able to point to the context. + } + + // Reset any potential simple keys on the current flow level. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + // Simple keys are allowed after '-'. + parser.simple_key_allowed = true + + // Consume the token. + start_mark := parser.mark + skip(parser) + end_mark := parser.mark + + // Create the BLOCK-ENTRY token and append it to the queue. + token := yaml_token_t{ + typ: yaml_BLOCK_ENTRY_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the KEY token. +func yaml_parser_fetch_key(parser *yaml_parser_t) bool { + + // In the block context, additional checks are required. + if parser.flow_level == 0 { + // Check if we are allowed to start a new key (not nessesary simple). + if !parser.simple_key_allowed { + return yaml_parser_set_scanner_error(parser, "", parser.mark, + "mapping keys are not allowed in this context") + } + // Add the BLOCK-MAPPING-START token if needed. + if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_MAPPING_START_TOKEN, parser.mark) { + return false + } + } + + // Reset any potential simple keys on the current flow level. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + // Simple keys are allowed after '?' in the block context. + parser.simple_key_allowed = parser.flow_level == 0 + + // Consume the token. + start_mark := parser.mark + skip(parser) + end_mark := parser.mark + + // Create the KEY token and append it to the queue. + token := yaml_token_t{ + typ: yaml_KEY_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the VALUE token. +func yaml_parser_fetch_value(parser *yaml_parser_t) bool { + + simple_key := &parser.simple_keys[len(parser.simple_keys)-1] + + // Have we found a simple key? + if simple_key.possible { + // Create the KEY token and insert it into the queue. + token := yaml_token_t{ + typ: yaml_KEY_TOKEN, + start_mark: simple_key.mark, + end_mark: simple_key.mark, + } + yaml_insert_token(parser, simple_key.token_number-parser.tokens_parsed, &token) + + // In the block context, we may need to add the BLOCK-MAPPING-START token. + if !yaml_parser_roll_indent(parser, simple_key.mark.column, + simple_key.token_number, + yaml_BLOCK_MAPPING_START_TOKEN, simple_key.mark) { + return false + } + + // Remove the simple key. + simple_key.possible = false + + // A simple key cannot follow another simple key. + parser.simple_key_allowed = false + + } else { + // The ':' indicator follows a complex key. + + // In the block context, extra checks are required. + if parser.flow_level == 0 { + + // Check if we are allowed to start a complex value. + if !parser.simple_key_allowed { + return yaml_parser_set_scanner_error(parser, "", parser.mark, + "mapping values are not allowed in this context") + } + + // Add the BLOCK-MAPPING-START token if needed. + if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_MAPPING_START_TOKEN, parser.mark) { + return false + } + } + + // Simple keys after ':' are allowed in the block context. + parser.simple_key_allowed = parser.flow_level == 0 + } + + // Consume the token. + start_mark := parser.mark + skip(parser) + end_mark := parser.mark + + // Create the VALUE token and append it to the queue. + token := yaml_token_t{ + typ: yaml_VALUE_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the ALIAS or ANCHOR token. +func yaml_parser_fetch_anchor(parser *yaml_parser_t, typ yaml_token_type_t) bool { + // An anchor or an alias could be a simple key. + if !yaml_parser_save_simple_key(parser) { + return false + } + + // A simple key cannot follow an anchor or an alias. + parser.simple_key_allowed = false + + // Create the ALIAS or ANCHOR token and append it to the queue. + var token yaml_token_t + if !yaml_parser_scan_anchor(parser, &token, typ) { + return false + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the TAG token. +func yaml_parser_fetch_tag(parser *yaml_parser_t) bool { + // A tag could be a simple key. + if !yaml_parser_save_simple_key(parser) { + return false + } + + // A simple key cannot follow a tag. + parser.simple_key_allowed = false + + // Create the TAG token and append it to the queue. + var token yaml_token_t + if !yaml_parser_scan_tag(parser, &token) { + return false + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the SCALAR(...,literal) or SCALAR(...,folded) tokens. +func yaml_parser_fetch_block_scalar(parser *yaml_parser_t, literal bool) bool { + // Remove any potential simple keys. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + // A simple key may follow a block scalar. + parser.simple_key_allowed = true + + // Create the SCALAR token and append it to the queue. + var token yaml_token_t + if !yaml_parser_scan_block_scalar(parser, &token, literal) { + return false + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the SCALAR(...,single-quoted) or SCALAR(...,double-quoted) tokens. +func yaml_parser_fetch_flow_scalar(parser *yaml_parser_t, single bool) bool { + // A plain scalar could be a simple key. + if !yaml_parser_save_simple_key(parser) { + return false + } + + // A simple key cannot follow a flow scalar. + parser.simple_key_allowed = false + + // Create the SCALAR token and append it to the queue. + var token yaml_token_t + if !yaml_parser_scan_flow_scalar(parser, &token, single) { + return false + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the SCALAR(...,plain) token. +func yaml_parser_fetch_plain_scalar(parser *yaml_parser_t) bool { + // A plain scalar could be a simple key. + if !yaml_parser_save_simple_key(parser) { + return false + } + + // A simple key cannot follow a flow scalar. + parser.simple_key_allowed = false + + // Create the SCALAR token and append it to the queue. + var token yaml_token_t + if !yaml_parser_scan_plain_scalar(parser, &token) { + return false + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Eat whitespaces and comments until the next token is found. +func yaml_parser_scan_to_next_token(parser *yaml_parser_t) bool { + + // Until the next token is not found. + for { + // Allow the BOM mark to start a line. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if parser.mark.column == 0 && is_bom(parser.buffer, parser.buffer_pos) { + skip(parser) + } + + // Eat whitespaces. + // Tabs are allowed: + // - in the flow context + // - in the block context, but not at the beginning of the line or + // after '-', '?', or ':' (complex value). + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + for parser.buffer[parser.buffer_pos] == ' ' || ((parser.flow_level > 0 || !parser.simple_key_allowed) && parser.buffer[parser.buffer_pos] == '\t') { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Eat a comment until a line break. + if parser.buffer[parser.buffer_pos] == '#' { + for !is_breakz(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + } + + // If it is a line break, eat it. + if is_break(parser.buffer, parser.buffer_pos) { + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + skip_line(parser) + + // In the block context, a new line may start a simple key. + if parser.flow_level == 0 { + parser.simple_key_allowed = true + } + } else { + break // We have found a token. + } + } + + return true +} + +// Scan a YAML-DIRECTIVE or TAG-DIRECTIVE token. +// +// Scope: +// %YAML 1.1 # a comment \n +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +// %TAG !yaml! tag:yaml.org,2002: \n +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +// +func yaml_parser_scan_directive(parser *yaml_parser_t, token *yaml_token_t) bool { + // Eat '%'. + start_mark := parser.mark + skip(parser) + + // Scan the directive name. + var name []byte + if !yaml_parser_scan_directive_name(parser, start_mark, &name) { + return false + } + + // Is it a YAML directive? + if bytes.Equal(name, []byte("YAML")) { + // Scan the VERSION directive value. + var major, minor int8 + if !yaml_parser_scan_version_directive_value(parser, start_mark, &major, &minor) { + return false + } + end_mark := parser.mark + + // Create a VERSION-DIRECTIVE token. + *token = yaml_token_t{ + typ: yaml_VERSION_DIRECTIVE_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + major: major, + minor: minor, + } + + // Is it a TAG directive? + } else if bytes.Equal(name, []byte("TAG")) { + // Scan the TAG directive value. + var handle, prefix []byte + if !yaml_parser_scan_tag_directive_value(parser, start_mark, &handle, &prefix) { + return false + } + end_mark := parser.mark + + // Create a TAG-DIRECTIVE token. + *token = yaml_token_t{ + typ: yaml_TAG_DIRECTIVE_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + value: handle, + prefix: prefix, + } + + // Unknown directive. + } else { + yaml_parser_set_scanner_error(parser, "while scanning a directive", + start_mark, "found unknown directive name") + return false + } + + // Eat the rest of the line including any comments. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + for is_blank(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + if parser.buffer[parser.buffer_pos] == '#' { + for !is_breakz(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + } + + // Check if we are at the end of the line. + if !is_breakz(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a directive", + start_mark, "did not find expected comment or line break") + return false + } + + // Eat a line break. + if is_break(parser.buffer, parser.buffer_pos) { + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + skip_line(parser) + } + + return true +} + +// Scan the directive name. +// +// Scope: +// %YAML 1.1 # a comment \n +// ^^^^ +// %TAG !yaml! tag:yaml.org,2002: \n +// ^^^ +// +func yaml_parser_scan_directive_name(parser *yaml_parser_t, start_mark yaml_mark_t, name *[]byte) bool { + // Consume the directive name. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + var s []byte + for is_alpha(parser.buffer, parser.buffer_pos) { + s = read(parser, s) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Check if the name is empty. + if len(s) == 0 { + yaml_parser_set_scanner_error(parser, "while scanning a directive", + start_mark, "could not find expected directive name") + return false + } + + // Check for an blank character after the name. + if !is_blankz(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a directive", + start_mark, "found unexpected non-alphabetical character") + return false + } + *name = s + return true +} + +// Scan the value of VERSION-DIRECTIVE. +// +// Scope: +// %YAML 1.1 # a comment \n +// ^^^^^^ +func yaml_parser_scan_version_directive_value(parser *yaml_parser_t, start_mark yaml_mark_t, major, minor *int8) bool { + // Eat whitespaces. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + for is_blank(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Consume the major version number. + if !yaml_parser_scan_version_directive_number(parser, start_mark, major) { + return false + } + + // Eat '.'. + if parser.buffer[parser.buffer_pos] != '.' { + return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive", + start_mark, "did not find expected digit or '.' character") + } + + skip(parser) + + // Consume the minor version number. + if !yaml_parser_scan_version_directive_number(parser, start_mark, minor) { + return false + } + return true +} + +const max_number_length = 2 + +// Scan the version number of VERSION-DIRECTIVE. +// +// Scope: +// %YAML 1.1 # a comment \n +// ^ +// %YAML 1.1 # a comment \n +// ^ +func yaml_parser_scan_version_directive_number(parser *yaml_parser_t, start_mark yaml_mark_t, number *int8) bool { + + // Repeat while the next character is digit. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + var value, length int8 + for is_digit(parser.buffer, parser.buffer_pos) { + // Check if the number is too long. + length++ + if length > max_number_length { + return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive", + start_mark, "found extremely long version number") + } + value = value*10 + int8(as_digit(parser.buffer, parser.buffer_pos)) + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Check if the number was present. + if length == 0 { + return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive", + start_mark, "did not find expected version number") + } + *number = value + return true +} + +// Scan the value of a TAG-DIRECTIVE token. +// +// Scope: +// %TAG !yaml! tag:yaml.org,2002: \n +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +// +func yaml_parser_scan_tag_directive_value(parser *yaml_parser_t, start_mark yaml_mark_t, handle, prefix *[]byte) bool { + var handle_value, prefix_value []byte + + // Eat whitespaces. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + for is_blank(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Scan a handle. + if !yaml_parser_scan_tag_handle(parser, true, start_mark, &handle_value) { + return false + } + + // Expect a whitespace. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if !is_blank(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a %TAG directive", + start_mark, "did not find expected whitespace") + return false + } + + // Eat whitespaces. + for is_blank(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Scan a prefix. + if !yaml_parser_scan_tag_uri(parser, true, nil, start_mark, &prefix_value) { + return false + } + + // Expect a whitespace or line break. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if !is_blankz(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a %TAG directive", + start_mark, "did not find expected whitespace or line break") + return false + } + + *handle = handle_value + *prefix = prefix_value + return true +} + +func yaml_parser_scan_anchor(parser *yaml_parser_t, token *yaml_token_t, typ yaml_token_type_t) bool { + var s []byte + + // Eat the indicator character. + start_mark := parser.mark + skip(parser) + + // Consume the value. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + for is_alpha(parser.buffer, parser.buffer_pos) { + s = read(parser, s) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + end_mark := parser.mark + + /* + * Check if length of the anchor is greater than 0 and it is followed by + * a whitespace character or one of the indicators: + * + * '?', ':', ',', ']', '}', '%', '@', '`'. + */ + + if len(s) == 0 || + !(is_blankz(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == '?' || + parser.buffer[parser.buffer_pos] == ':' || parser.buffer[parser.buffer_pos] == ',' || + parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '}' || + parser.buffer[parser.buffer_pos] == '%' || parser.buffer[parser.buffer_pos] == '@' || + parser.buffer[parser.buffer_pos] == '`') { + context := "while scanning an alias" + if typ == yaml_ANCHOR_TOKEN { + context = "while scanning an anchor" + } + yaml_parser_set_scanner_error(parser, context, start_mark, + "did not find expected alphabetic or numeric character") + return false + } + + // Create a token. + *token = yaml_token_t{ + typ: typ, + start_mark: start_mark, + end_mark: end_mark, + value: s, + } + + return true +} + +/* + * Scan a TAG token. + */ + +func yaml_parser_scan_tag(parser *yaml_parser_t, token *yaml_token_t) bool { + var handle, suffix []byte + + start_mark := parser.mark + + // Check if the tag is in the canonical form. + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + + if parser.buffer[parser.buffer_pos+1] == '<' { + // Keep the handle as '' + + // Eat '!<' + skip(parser) + skip(parser) + + // Consume the tag value. + if !yaml_parser_scan_tag_uri(parser, false, nil, start_mark, &suffix) { + return false + } + + // Check for '>' and eat it. + if parser.buffer[parser.buffer_pos] != '>' { + yaml_parser_set_scanner_error(parser, "while scanning a tag", + start_mark, "did not find the expected '>'") + return false + } + + skip(parser) + } else { + // The tag has either the '!suffix' or the '!handle!suffix' form. + + // First, try to scan a handle. + if !yaml_parser_scan_tag_handle(parser, false, start_mark, &handle) { + return false + } + + // Check if it is, indeed, handle. + if handle[0] == '!' && len(handle) > 1 && handle[len(handle)-1] == '!' { + // Scan the suffix now. + if !yaml_parser_scan_tag_uri(parser, false, nil, start_mark, &suffix) { + return false + } + } else { + // It wasn't a handle after all. Scan the rest of the tag. + if !yaml_parser_scan_tag_uri(parser, false, handle, start_mark, &suffix) { + return false + } + + // Set the handle to '!'. + handle = []byte{'!'} + + // A special case: the '!' tag. Set the handle to '' and the + // suffix to '!'. + if len(suffix) == 0 { + handle, suffix = suffix, handle + } + } + } + + // Check the character which ends the tag. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if !is_blankz(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a tag", + start_mark, "did not find expected whitespace or line break") + return false + } + + end_mark := parser.mark + + // Create a token. + *token = yaml_token_t{ + typ: yaml_TAG_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + value: handle, + suffix: suffix, + } + return true +} + +// Scan a tag handle. +func yaml_parser_scan_tag_handle(parser *yaml_parser_t, directive bool, start_mark yaml_mark_t, handle *[]byte) bool { + // Check the initial '!' character. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if parser.buffer[parser.buffer_pos] != '!' { + yaml_parser_set_scanner_tag_error(parser, directive, + start_mark, "did not find expected '!'") + return false + } + + var s []byte + + // Copy the '!' character. + s = read(parser, s) + + // Copy all subsequent alphabetical and numerical characters. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + for is_alpha(parser.buffer, parser.buffer_pos) { + s = read(parser, s) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Check if the trailing character is '!' and copy it. + if parser.buffer[parser.buffer_pos] == '!' { + s = read(parser, s) + } else { + // It's either the '!' tag or not really a tag handle. If it's a %TAG + // directive, it's an error. If it's a tag token, it must be a part of URI. + if directive && string(s) != "!" { + yaml_parser_set_scanner_tag_error(parser, directive, + start_mark, "did not find expected '!'") + return false + } + } + + *handle = s + return true +} + +// Scan a tag. +func yaml_parser_scan_tag_uri(parser *yaml_parser_t, directive bool, head []byte, start_mark yaml_mark_t, uri *[]byte) bool { + //size_t length = head ? strlen((char *)head) : 0 + var s []byte + hasTag := len(head) > 0 + + // Copy the head if needed. + // + // Note that we don't copy the leading '!' character. + if len(head) > 1 { + s = append(s, head[1:]...) + } + + // Scan the tag. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + // The set of characters that may appear in URI is as follows: + // + // '0'-'9', 'A'-'Z', 'a'-'z', '_', '-', ';', '/', '?', ':', '@', '&', + // '=', '+', '$', ',', '.', '!', '~', '*', '\'', '(', ')', '[', ']', + // '%'. + // [Go] Convert this into more reasonable logic. + for is_alpha(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == ';' || + parser.buffer[parser.buffer_pos] == '/' || parser.buffer[parser.buffer_pos] == '?' || + parser.buffer[parser.buffer_pos] == ':' || parser.buffer[parser.buffer_pos] == '@' || + parser.buffer[parser.buffer_pos] == '&' || parser.buffer[parser.buffer_pos] == '=' || + parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '$' || + parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == '.' || + parser.buffer[parser.buffer_pos] == '!' || parser.buffer[parser.buffer_pos] == '~' || + parser.buffer[parser.buffer_pos] == '*' || parser.buffer[parser.buffer_pos] == '\'' || + parser.buffer[parser.buffer_pos] == '(' || parser.buffer[parser.buffer_pos] == ')' || + parser.buffer[parser.buffer_pos] == '[' || parser.buffer[parser.buffer_pos] == ']' || + parser.buffer[parser.buffer_pos] == '%' { + // Check if it is a URI-escape sequence. + if parser.buffer[parser.buffer_pos] == '%' { + if !yaml_parser_scan_uri_escapes(parser, directive, start_mark, &s) { + return false + } + } else { + s = read(parser, s) + } + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + hasTag = true + } + + if !hasTag { + yaml_parser_set_scanner_tag_error(parser, directive, + start_mark, "did not find expected tag URI") + return false + } + *uri = s + return true +} + +// Decode an URI-escape sequence corresponding to a single UTF-8 character. +func yaml_parser_scan_uri_escapes(parser *yaml_parser_t, directive bool, start_mark yaml_mark_t, s *[]byte) bool { + + // Decode the required number of characters. + w := 1024 + for w > 0 { + // Check for a URI-escaped octet. + if parser.unread < 3 && !yaml_parser_update_buffer(parser, 3) { + return false + } + + if !(parser.buffer[parser.buffer_pos] == '%' && + is_hex(parser.buffer, parser.buffer_pos+1) && + is_hex(parser.buffer, parser.buffer_pos+2)) { + return yaml_parser_set_scanner_tag_error(parser, directive, + start_mark, "did not find URI escaped octet") + } + + // Get the octet. + octet := byte((as_hex(parser.buffer, parser.buffer_pos+1) << 4) + as_hex(parser.buffer, parser.buffer_pos+2)) + + // If it is the leading octet, determine the length of the UTF-8 sequence. + if w == 1024 { + w = width(octet) + if w == 0 { + return yaml_parser_set_scanner_tag_error(parser, directive, + start_mark, "found an incorrect leading UTF-8 octet") + } + } else { + // Check if the trailing octet is correct. + if octet&0xC0 != 0x80 { + return yaml_parser_set_scanner_tag_error(parser, directive, + start_mark, "found an incorrect trailing UTF-8 octet") + } + } + + // Copy the octet and move the pointers. + *s = append(*s, octet) + skip(parser) + skip(parser) + skip(parser) + w-- + } + return true +} + +// Scan a block scalar. +func yaml_parser_scan_block_scalar(parser *yaml_parser_t, token *yaml_token_t, literal bool) bool { + // Eat the indicator '|' or '>'. + start_mark := parser.mark + skip(parser) + + // Scan the additional block scalar indicators. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + // Check for a chomping indicator. + var chomping, increment int + if parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '-' { + // Set the chomping method and eat the indicator. + if parser.buffer[parser.buffer_pos] == '+' { + chomping = +1 + } else { + chomping = -1 + } + skip(parser) + + // Check for an indentation indicator. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if is_digit(parser.buffer, parser.buffer_pos) { + // Check that the indentation is greater than 0. + if parser.buffer[parser.buffer_pos] == '0' { + yaml_parser_set_scanner_error(parser, "while scanning a block scalar", + start_mark, "found an indentation indicator equal to 0") + return false + } + + // Get the indentation level and eat the indicator. + increment = as_digit(parser.buffer, parser.buffer_pos) + skip(parser) + } + + } else if is_digit(parser.buffer, parser.buffer_pos) { + // Do the same as above, but in the opposite order. + + if parser.buffer[parser.buffer_pos] == '0' { + yaml_parser_set_scanner_error(parser, "while scanning a block scalar", + start_mark, "found an indentation indicator equal to 0") + return false + } + increment = as_digit(parser.buffer, parser.buffer_pos) + skip(parser) + + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '-' { + if parser.buffer[parser.buffer_pos] == '+' { + chomping = +1 + } else { + chomping = -1 + } + skip(parser) + } + } + + // Eat whitespaces and comments to the end of the line. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + for is_blank(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + if parser.buffer[parser.buffer_pos] == '#' { + for !is_breakz(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + } + + // Check if we are at the end of the line. + if !is_breakz(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a block scalar", + start_mark, "did not find expected comment or line break") + return false + } + + // Eat a line break. + if is_break(parser.buffer, parser.buffer_pos) { + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + skip_line(parser) + } + + end_mark := parser.mark + + // Set the indentation level if it was specified. + var indent int + if increment > 0 { + if parser.indent >= 0 { + indent = parser.indent + increment + } else { + indent = increment + } + } + + // Scan the leading line breaks and determine the indentation level if needed. + var s, leading_break, trailing_breaks []byte + if !yaml_parser_scan_block_scalar_breaks(parser, &indent, &trailing_breaks, start_mark, &end_mark) { + return false + } + + // Scan the block scalar content. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + var leading_blank, trailing_blank bool + for parser.mark.column == indent && !is_z(parser.buffer, parser.buffer_pos) { + // We are at the beginning of a non-empty line. + + // Is it a trailing whitespace? + trailing_blank = is_blank(parser.buffer, parser.buffer_pos) + + // Check if we need to fold the leading line break. + if !literal && !leading_blank && !trailing_blank && len(leading_break) > 0 && leading_break[0] == '\n' { + // Do we need to join the lines by space? + if len(trailing_breaks) == 0 { + s = append(s, ' ') + } + } else { + s = append(s, leading_break...) + } + leading_break = leading_break[:0] + + // Append the remaining line breaks. + s = append(s, trailing_breaks...) + trailing_breaks = trailing_breaks[:0] + + // Is it a leading whitespace? + leading_blank = is_blank(parser.buffer, parser.buffer_pos) + + // Consume the current line. + for !is_breakz(parser.buffer, parser.buffer_pos) { + s = read(parser, s) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Consume the line break. + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + + leading_break = read_line(parser, leading_break) + + // Eat the following indentation spaces and line breaks. + if !yaml_parser_scan_block_scalar_breaks(parser, &indent, &trailing_breaks, start_mark, &end_mark) { + return false + } + } + + // Chomp the tail. + if chomping != -1 { + s = append(s, leading_break...) + } + if chomping == 1 { + s = append(s, trailing_breaks...) + } + + // Create a token. + *token = yaml_token_t{ + typ: yaml_SCALAR_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + value: s, + style: yaml_LITERAL_SCALAR_STYLE, + } + if !literal { + token.style = yaml_FOLDED_SCALAR_STYLE + } + return true +} + +// Scan indentation spaces and line breaks for a block scalar. Determine the +// indentation level if needed. +func yaml_parser_scan_block_scalar_breaks(parser *yaml_parser_t, indent *int, breaks *[]byte, start_mark yaml_mark_t, end_mark *yaml_mark_t) bool { + *end_mark = parser.mark + + // Eat the indentation spaces and line breaks. + max_indent := 0 + for { + // Eat the indentation spaces. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + for (*indent == 0 || parser.mark.column < *indent) && is_space(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + if parser.mark.column > max_indent { + max_indent = parser.mark.column + } + + // Check for a tab character messing the indentation. + if (*indent == 0 || parser.mark.column < *indent) && is_tab(parser.buffer, parser.buffer_pos) { + return yaml_parser_set_scanner_error(parser, "while scanning a block scalar", + start_mark, "found a tab character where an indentation space is expected") + } + + // Have we found a non-empty line? + if !is_break(parser.buffer, parser.buffer_pos) { + break + } + + // Consume the line break. + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + // [Go] Should really be returning breaks instead. + *breaks = read_line(parser, *breaks) + *end_mark = parser.mark + } + + // Determine the indentation level if needed. + if *indent == 0 { + *indent = max_indent + if *indent < parser.indent+1 { + *indent = parser.indent + 1 + } + if *indent < 1 { + *indent = 1 + } + } + return true +} + +// Scan a quoted scalar. +func yaml_parser_scan_flow_scalar(parser *yaml_parser_t, token *yaml_token_t, single bool) bool { + // Eat the left quote. + start_mark := parser.mark + skip(parser) + + // Consume the content of the quoted scalar. + var s, leading_break, trailing_breaks, whitespaces []byte + for { + // Check that there are no document indicators at the beginning of the line. + if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) { + return false + } + + if parser.mark.column == 0 && + ((parser.buffer[parser.buffer_pos+0] == '-' && + parser.buffer[parser.buffer_pos+1] == '-' && + parser.buffer[parser.buffer_pos+2] == '-') || + (parser.buffer[parser.buffer_pos+0] == '.' && + parser.buffer[parser.buffer_pos+1] == '.' && + parser.buffer[parser.buffer_pos+2] == '.')) && + is_blankz(parser.buffer, parser.buffer_pos+3) { + yaml_parser_set_scanner_error(parser, "while scanning a quoted scalar", + start_mark, "found unexpected document indicator") + return false + } + + // Check for EOF. + if is_z(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a quoted scalar", + start_mark, "found unexpected end of stream") + return false + } + + // Consume non-blank characters. + leading_blanks := false + for !is_blankz(parser.buffer, parser.buffer_pos) { + if single && parser.buffer[parser.buffer_pos] == '\'' && parser.buffer[parser.buffer_pos+1] == '\'' { + // Is is an escaped single quote. + s = append(s, '\'') + skip(parser) + skip(parser) + + } else if single && parser.buffer[parser.buffer_pos] == '\'' { + // It is a right single quote. + break + } else if !single && parser.buffer[parser.buffer_pos] == '"' { + // It is a right double quote. + break + + } else if !single && parser.buffer[parser.buffer_pos] == '\\' && is_break(parser.buffer, parser.buffer_pos+1) { + // It is an escaped line break. + if parser.unread < 3 && !yaml_parser_update_buffer(parser, 3) { + return false + } + skip(parser) + skip_line(parser) + leading_blanks = true + break + + } else if !single && parser.buffer[parser.buffer_pos] == '\\' { + // It is an escape sequence. + code_length := 0 + + // Check the escape character. + switch parser.buffer[parser.buffer_pos+1] { + case '0': + s = append(s, 0) + case 'a': + s = append(s, '\x07') + case 'b': + s = append(s, '\x08') + case 't', '\t': + s = append(s, '\x09') + case 'n': + s = append(s, '\x0A') + case 'v': + s = append(s, '\x0B') + case 'f': + s = append(s, '\x0C') + case 'r': + s = append(s, '\x0D') + case 'e': + s = append(s, '\x1B') + case ' ': + s = append(s, '\x20') + case '"': + s = append(s, '"') + case '\'': + s = append(s, '\'') + case '\\': + s = append(s, '\\') + case 'N': // NEL (#x85) + s = append(s, '\xC2') + s = append(s, '\x85') + case '_': // #xA0 + s = append(s, '\xC2') + s = append(s, '\xA0') + case 'L': // LS (#x2028) + s = append(s, '\xE2') + s = append(s, '\x80') + s = append(s, '\xA8') + case 'P': // PS (#x2029) + s = append(s, '\xE2') + s = append(s, '\x80') + s = append(s, '\xA9') + case 'x': + code_length = 2 + case 'u': + code_length = 4 + case 'U': + code_length = 8 + default: + yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar", + start_mark, "found unknown escape character") + return false + } + + skip(parser) + skip(parser) + + // Consume an arbitrary escape code. + if code_length > 0 { + var value int + + // Scan the character value. + if parser.unread < code_length && !yaml_parser_update_buffer(parser, code_length) { + return false + } + for k := 0; k < code_length; k++ { + if !is_hex(parser.buffer, parser.buffer_pos+k) { + yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar", + start_mark, "did not find expected hexdecimal number") + return false + } + value = (value << 4) + as_hex(parser.buffer, parser.buffer_pos+k) + } + + // Check the value and write the character. + if (value >= 0xD800 && value <= 0xDFFF) || value > 0x10FFFF { + yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar", + start_mark, "found invalid Unicode character escape code") + return false + } + if value <= 0x7F { + s = append(s, byte(value)) + } else if value <= 0x7FF { + s = append(s, byte(0xC0+(value>>6))) + s = append(s, byte(0x80+(value&0x3F))) + } else if value <= 0xFFFF { + s = append(s, byte(0xE0+(value>>12))) + s = append(s, byte(0x80+((value>>6)&0x3F))) + s = append(s, byte(0x80+(value&0x3F))) + } else { + s = append(s, byte(0xF0+(value>>18))) + s = append(s, byte(0x80+((value>>12)&0x3F))) + s = append(s, byte(0x80+((value>>6)&0x3F))) + s = append(s, byte(0x80+(value&0x3F))) + } + + // Advance the pointer. + for k := 0; k < code_length; k++ { + skip(parser) + } + } + } else { + // It is a non-escaped non-blank character. + s = read(parser, s) + } + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + } + + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + // Check if we are at the end of the scalar. + if single { + if parser.buffer[parser.buffer_pos] == '\'' { + break + } + } else { + if parser.buffer[parser.buffer_pos] == '"' { + break + } + } + + // Consume blank characters. + for is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos) { + if is_blank(parser.buffer, parser.buffer_pos) { + // Consume a space or a tab character. + if !leading_blanks { + whitespaces = read(parser, whitespaces) + } else { + skip(parser) + } + } else { + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + + // Check if it is a first line break. + if !leading_blanks { + whitespaces = whitespaces[:0] + leading_break = read_line(parser, leading_break) + leading_blanks = true + } else { + trailing_breaks = read_line(parser, trailing_breaks) + } + } + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Join the whitespaces or fold line breaks. + if leading_blanks { + // Do we need to fold line breaks? + if len(leading_break) > 0 && leading_break[0] == '\n' { + if len(trailing_breaks) == 0 { + s = append(s, ' ') + } else { + s = append(s, trailing_breaks...) + } + } else { + s = append(s, leading_break...) + s = append(s, trailing_breaks...) + } + trailing_breaks = trailing_breaks[:0] + leading_break = leading_break[:0] + } else { + s = append(s, whitespaces...) + whitespaces = whitespaces[:0] + } + } + + // Eat the right quote. + skip(parser) + end_mark := parser.mark + + // Create a token. + *token = yaml_token_t{ + typ: yaml_SCALAR_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + value: s, + style: yaml_SINGLE_QUOTED_SCALAR_STYLE, + } + if !single { + token.style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + return true +} + +// Scan a plain scalar. +func yaml_parser_scan_plain_scalar(parser *yaml_parser_t, token *yaml_token_t) bool { + + var s, leading_break, trailing_breaks, whitespaces []byte + var leading_blanks bool + var indent = parser.indent + 1 + + start_mark := parser.mark + end_mark := parser.mark + + // Consume the content of the plain scalar. + for { + // Check for a document indicator. + if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) { + return false + } + if parser.mark.column == 0 && + ((parser.buffer[parser.buffer_pos+0] == '-' && + parser.buffer[parser.buffer_pos+1] == '-' && + parser.buffer[parser.buffer_pos+2] == '-') || + (parser.buffer[parser.buffer_pos+0] == '.' && + parser.buffer[parser.buffer_pos+1] == '.' && + parser.buffer[parser.buffer_pos+2] == '.')) && + is_blankz(parser.buffer, parser.buffer_pos+3) { + break + } + + // Check for a comment. + if parser.buffer[parser.buffer_pos] == '#' { + break + } + + // Consume non-blank characters. + for !is_blankz(parser.buffer, parser.buffer_pos) { + + // Check for indicators that may end a plain scalar. + if (parser.buffer[parser.buffer_pos] == ':' && is_blankz(parser.buffer, parser.buffer_pos+1)) || + (parser.flow_level > 0 && + (parser.buffer[parser.buffer_pos] == ',' || + parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == '[' || + parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '{' || + parser.buffer[parser.buffer_pos] == '}')) { + break + } + + // Check if we need to join whitespaces and breaks. + if leading_blanks || len(whitespaces) > 0 { + if leading_blanks { + // Do we need to fold line breaks? + if leading_break[0] == '\n' { + if len(trailing_breaks) == 0 { + s = append(s, ' ') + } else { + s = append(s, trailing_breaks...) + } + } else { + s = append(s, leading_break...) + s = append(s, trailing_breaks...) + } + trailing_breaks = trailing_breaks[:0] + leading_break = leading_break[:0] + leading_blanks = false + } else { + s = append(s, whitespaces...) + whitespaces = whitespaces[:0] + } + } + + // Copy the character. + s = read(parser, s) + + end_mark = parser.mark + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + } + + // Is it the end? + if !(is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos)) { + break + } + + // Consume blank characters. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + for is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos) { + if is_blank(parser.buffer, parser.buffer_pos) { + + // Check for tab characters that abuse indentation. + if leading_blanks && parser.mark.column < indent && is_tab(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a plain scalar", + start_mark, "found a tab character that violates indentation") + return false + } + + // Consume a space or a tab character. + if !leading_blanks { + whitespaces = read(parser, whitespaces) + } else { + skip(parser) + } + } else { + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + + // Check if it is a first line break. + if !leading_blanks { + whitespaces = whitespaces[:0] + leading_break = read_line(parser, leading_break) + leading_blanks = true + } else { + trailing_breaks = read_line(parser, trailing_breaks) + } + } + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Check indentation level. + if parser.flow_level == 0 && parser.mark.column < indent { + break + } + } + + // Create a token. + *token = yaml_token_t{ + typ: yaml_SCALAR_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + value: s, + style: yaml_PLAIN_SCALAR_STYLE, + } + + // Note that we change the 'simple_key_allowed' flag. + if leading_blanks { + parser.simple_key_allowed = true + } + return true +} diff --git a/api/vendor/gopkg.in/yaml.v2/sorter.go b/api/vendor/gopkg.in/yaml.v2/sorter.go new file mode 100644 index 0000000..4c45e66 --- /dev/null +++ b/api/vendor/gopkg.in/yaml.v2/sorter.go @@ -0,0 +1,113 @@ +package yaml + +import ( + "reflect" + "unicode" +) + +type keyList []reflect.Value + +func (l keyList) Len() int { return len(l) } +func (l keyList) Swap(i, j int) { l[i], l[j] = l[j], l[i] } +func (l keyList) Less(i, j int) bool { + a := l[i] + b := l[j] + ak := a.Kind() + bk := b.Kind() + for (ak == reflect.Interface || ak == reflect.Ptr) && !a.IsNil() { + a = a.Elem() + ak = a.Kind() + } + for (bk == reflect.Interface || bk == reflect.Ptr) && !b.IsNil() { + b = b.Elem() + bk = b.Kind() + } + af, aok := keyFloat(a) + bf, bok := keyFloat(b) + if aok && bok { + if af != bf { + return af < bf + } + if ak != bk { + return ak < bk + } + return numLess(a, b) + } + if ak != reflect.String || bk != reflect.String { + return ak < bk + } + ar, br := []rune(a.String()), []rune(b.String()) + for i := 0; i < len(ar) && i < len(br); i++ { + if ar[i] == br[i] { + continue + } + al := unicode.IsLetter(ar[i]) + bl := unicode.IsLetter(br[i]) + if al && bl { + return ar[i] < br[i] + } + if al || bl { + return bl + } + var ai, bi int + var an, bn int64 + if ar[i] == '0' || br[i] == '0' { + for j := i-1; j >= 0 && unicode.IsDigit(ar[j]); j-- { + if ar[j] != '0' { + an = 1 + bn = 1 + break + } + } + } + for ai = i; ai < len(ar) && unicode.IsDigit(ar[ai]); ai++ { + an = an*10 + int64(ar[ai]-'0') + } + for bi = i; bi < len(br) && unicode.IsDigit(br[bi]); bi++ { + bn = bn*10 + int64(br[bi]-'0') + } + if an != bn { + return an < bn + } + if ai != bi { + return ai < bi + } + return ar[i] < br[i] + } + return len(ar) < len(br) +} + +// keyFloat returns a float value for v if it is a number/bool +// and whether it is a number/bool or not. +func keyFloat(v reflect.Value) (f float64, ok bool) { + switch v.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return float64(v.Int()), true + case reflect.Float32, reflect.Float64: + return v.Float(), true + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return float64(v.Uint()), true + case reflect.Bool: + if v.Bool() { + return 1, true + } + return 0, true + } + return 0, false +} + +// numLess returns whether a < b. +// a and b must necessarily have the same kind. +func numLess(a, b reflect.Value) bool { + switch a.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return a.Int() < b.Int() + case reflect.Float32, reflect.Float64: + return a.Float() < b.Float() + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return a.Uint() < b.Uint() + case reflect.Bool: + return !a.Bool() && b.Bool() + } + panic("not a number") +} diff --git a/api/vendor/gopkg.in/yaml.v2/suite_test.go b/api/vendor/gopkg.in/yaml.v2/suite_test.go new file mode 100644 index 0000000..c5cf1ed --- /dev/null +++ b/api/vendor/gopkg.in/yaml.v2/suite_test.go @@ -0,0 +1,12 @@ +package yaml_test + +import ( + . "gopkg.in/check.v1" + "testing" +) + +func Test(t *testing.T) { TestingT(t) } + +type S struct{} + +var _ = Suite(&S{}) diff --git a/api/vendor/gopkg.in/yaml.v2/writerc.go b/api/vendor/gopkg.in/yaml.v2/writerc.go new file mode 100644 index 0000000..a2dde60 --- /dev/null +++ b/api/vendor/gopkg.in/yaml.v2/writerc.go @@ -0,0 +1,26 @@ +package yaml + +// Set the writer error and return false. +func yaml_emitter_set_writer_error(emitter *yaml_emitter_t, problem string) bool { + emitter.error = yaml_WRITER_ERROR + emitter.problem = problem + return false +} + +// Flush the output buffer. +func yaml_emitter_flush(emitter *yaml_emitter_t) bool { + if emitter.write_handler == nil { + panic("write handler not set") + } + + // Check if the buffer is empty. + if emitter.buffer_pos == 0 { + return true + } + + if err := emitter.write_handler(emitter, emitter.buffer[:emitter.buffer_pos]); err != nil { + return yaml_emitter_set_writer_error(emitter, "write error: "+err.Error()) + } + emitter.buffer_pos = 0 + return true +} diff --git a/api/vendor/gopkg.in/yaml.v2/yaml.go b/api/vendor/gopkg.in/yaml.v2/yaml.go new file mode 100644 index 0000000..de85aa4 --- /dev/null +++ b/api/vendor/gopkg.in/yaml.v2/yaml.go @@ -0,0 +1,466 @@ +// Package yaml implements YAML support for the Go language. +// +// Source code and other details for the project are available at GitHub: +// +// https://github.com/go-yaml/yaml +// +package yaml + +import ( + "errors" + "fmt" + "io" + "reflect" + "strings" + "sync" +) + +// MapSlice encodes and decodes as a YAML map. +// The order of keys is preserved when encoding and decoding. +type MapSlice []MapItem + +// MapItem is an item in a MapSlice. +type MapItem struct { + Key, Value interface{} +} + +// The Unmarshaler interface may be implemented by types to customize their +// behavior when being unmarshaled from a YAML document. The UnmarshalYAML +// method receives a function that may be called to unmarshal the original +// YAML value into a field or variable. It is safe to call the unmarshal +// function parameter more than once if necessary. +type Unmarshaler interface { + UnmarshalYAML(unmarshal func(interface{}) error) error +} + +// The Marshaler interface may be implemented by types to customize their +// behavior when being marshaled into a YAML document. The returned value +// is marshaled in place of the original value implementing Marshaler. +// +// If an error is returned by MarshalYAML, the marshaling procedure stops +// and returns with the provided error. +type Marshaler interface { + MarshalYAML() (interface{}, error) +} + +// Unmarshal decodes the first document found within the in byte slice +// and assigns decoded values into the out value. +// +// Maps and pointers (to a struct, string, int, etc) are accepted as out +// values. If an internal pointer within a struct is not initialized, +// the yaml package will initialize it if necessary for unmarshalling +// the provided data. The out parameter must not be nil. +// +// The type of the decoded values should be compatible with the respective +// values in out. If one or more values cannot be decoded due to a type +// mismatches, decoding continues partially until the end of the YAML +// content, and a *yaml.TypeError is returned with details for all +// missed values. +// +// Struct fields are only unmarshalled if they are exported (have an +// upper case first letter), and are unmarshalled using the field name +// lowercased as the default key. Custom keys may be defined via the +// "yaml" name in the field tag: the content preceding the first comma +// is used as the key, and the following comma-separated options are +// used to tweak the marshalling process (see Marshal). +// Conflicting names result in a runtime error. +// +// For example: +// +// type T struct { +// F int `yaml:"a,omitempty"` +// B int +// } +// var t T +// yaml.Unmarshal([]byte("a: 1\nb: 2"), &t) +// +// See the documentation of Marshal for the format of tags and a list of +// supported tag options. +// +func Unmarshal(in []byte, out interface{}) (err error) { + return unmarshal(in, out, false) +} + +// UnmarshalStrict is like Unmarshal except that any fields that are found +// in the data that do not have corresponding struct members, or mapping +// keys that are duplicates, will result in +// an error. +func UnmarshalStrict(in []byte, out interface{}) (err error) { + return unmarshal(in, out, true) +} + +// A Decorder reads and decodes YAML values from an input stream. +type Decoder struct { + strict bool + parser *parser +} + +// NewDecoder returns a new decoder that reads from r. +// +// The decoder introduces its own buffering and may read +// data from r beyond the YAML values requested. +func NewDecoder(r io.Reader) *Decoder { + return &Decoder{ + parser: newParserFromReader(r), + } +} + +// SetStrict sets whether strict decoding behaviour is enabled when +// decoding items in the data (see UnmarshalStrict). By default, decoding is not strict. +func (dec *Decoder) SetStrict(strict bool) { + dec.strict = strict +} + +// Decode reads the next YAML-encoded value from its input +// and stores it in the value pointed to by v. +// +// See the documentation for Unmarshal for details about the +// conversion of YAML into a Go value. +func (dec *Decoder) Decode(v interface{}) (err error) { + d := newDecoder(dec.strict) + defer handleErr(&err) + node := dec.parser.parse() + if node == nil { + return io.EOF + } + out := reflect.ValueOf(v) + if out.Kind() == reflect.Ptr && !out.IsNil() { + out = out.Elem() + } + d.unmarshal(node, out) + if len(d.terrors) > 0 { + return &TypeError{d.terrors} + } + return nil +} + +func unmarshal(in []byte, out interface{}, strict bool) (err error) { + defer handleErr(&err) + d := newDecoder(strict) + p := newParser(in) + defer p.destroy() + node := p.parse() + if node != nil { + v := reflect.ValueOf(out) + if v.Kind() == reflect.Ptr && !v.IsNil() { + v = v.Elem() + } + d.unmarshal(node, v) + } + if len(d.terrors) > 0 { + return &TypeError{d.terrors} + } + return nil +} + +// Marshal serializes the value provided into a YAML document. The structure +// of the generated document will reflect the structure of the value itself. +// Maps and pointers (to struct, string, int, etc) are accepted as the in value. +// +// Struct fields are only marshalled if they are exported (have an upper case +// first letter), and are marshalled using the field name lowercased as the +// default key. Custom keys may be defined via the "yaml" name in the field +// tag: the content preceding the first comma is used as the key, and the +// following comma-separated options are used to tweak the marshalling process. +// Conflicting names result in a runtime error. +// +// The field tag format accepted is: +// +// `(...) yaml:"[][,[,]]" (...)` +// +// The following flags are currently supported: +// +// omitempty Only include the field if it's not set to the zero +// value for the type or to empty slices or maps. +// Zero valued structs will be omitted if all their public +// fields are zero, unless they implement an IsZero +// method (see the IsZeroer interface type), in which +// case the field will be included if that method returns true. +// +// flow Marshal using a flow style (useful for structs, +// sequences and maps). +// +// inline Inline the field, which must be a struct or a map, +// causing all of its fields or keys to be processed as if +// they were part of the outer struct. For maps, keys must +// not conflict with the yaml keys of other struct fields. +// +// In addition, if the key is "-", the field is ignored. +// +// For example: +// +// type T struct { +// F int `yaml:"a,omitempty"` +// B int +// } +// yaml.Marshal(&T{B: 2}) // Returns "b: 2\n" +// yaml.Marshal(&T{F: 1}} // Returns "a: 1\nb: 0\n" +// +func Marshal(in interface{}) (out []byte, err error) { + defer handleErr(&err) + e := newEncoder() + defer e.destroy() + e.marshalDoc("", reflect.ValueOf(in)) + e.finish() + out = e.out + return +} + +// An Encoder writes YAML values to an output stream. +type Encoder struct { + encoder *encoder +} + +// NewEncoder returns a new encoder that writes to w. +// The Encoder should be closed after use to flush all data +// to w. +func NewEncoder(w io.Writer) *Encoder { + return &Encoder{ + encoder: newEncoderWithWriter(w), + } +} + +// Encode writes the YAML encoding of v to the stream. +// If multiple items are encoded to the stream, the +// second and subsequent document will be preceded +// with a "---" document separator, but the first will not. +// +// See the documentation for Marshal for details about the conversion of Go +// values to YAML. +func (e *Encoder) Encode(v interface{}) (err error) { + defer handleErr(&err) + e.encoder.marshalDoc("", reflect.ValueOf(v)) + return nil +} + +// Close closes the encoder by writing any remaining data. +// It does not write a stream terminating string "...". +func (e *Encoder) Close() (err error) { + defer handleErr(&err) + e.encoder.finish() + return nil +} + +func handleErr(err *error) { + if v := recover(); v != nil { + if e, ok := v.(yamlError); ok { + *err = e.err + } else { + panic(v) + } + } +} + +type yamlError struct { + err error +} + +func fail(err error) { + panic(yamlError{err}) +} + +func failf(format string, args ...interface{}) { + panic(yamlError{fmt.Errorf("yaml: "+format, args...)}) +} + +// A TypeError is returned by Unmarshal when one or more fields in +// the YAML document cannot be properly decoded into the requested +// types. When this error is returned, the value is still +// unmarshaled partially. +type TypeError struct { + Errors []string +} + +func (e *TypeError) Error() string { + return fmt.Sprintf("yaml: unmarshal errors:\n %s", strings.Join(e.Errors, "\n ")) +} + +// -------------------------------------------------------------------------- +// Maintain a mapping of keys to structure field indexes + +// The code in this section was copied from mgo/bson. + +// structInfo holds details for the serialization of fields of +// a given struct. +type structInfo struct { + FieldsMap map[string]fieldInfo + FieldsList []fieldInfo + + // InlineMap is the number of the field in the struct that + // contains an ,inline map, or -1 if there's none. + InlineMap int +} + +type fieldInfo struct { + Key string + Num int + OmitEmpty bool + Flow bool + // Id holds the unique field identifier, so we can cheaply + // check for field duplicates without maintaining an extra map. + Id int + + // Inline holds the field index if the field is part of an inlined struct. + Inline []int +} + +var structMap = make(map[reflect.Type]*structInfo) +var fieldMapMutex sync.RWMutex + +func getStructInfo(st reflect.Type) (*structInfo, error) { + fieldMapMutex.RLock() + sinfo, found := structMap[st] + fieldMapMutex.RUnlock() + if found { + return sinfo, nil + } + + n := st.NumField() + fieldsMap := make(map[string]fieldInfo) + fieldsList := make([]fieldInfo, 0, n) + inlineMap := -1 + for i := 0; i != n; i++ { + field := st.Field(i) + if field.PkgPath != "" && !field.Anonymous { + continue // Private field + } + + info := fieldInfo{Num: i} + + tag := field.Tag.Get("yaml") + if tag == "" && strings.Index(string(field.Tag), ":") < 0 { + tag = string(field.Tag) + } + if tag == "-" { + continue + } + + inline := false + fields := strings.Split(tag, ",") + if len(fields) > 1 { + for _, flag := range fields[1:] { + switch flag { + case "omitempty": + info.OmitEmpty = true + case "flow": + info.Flow = true + case "inline": + inline = true + default: + return nil, errors.New(fmt.Sprintf("Unsupported flag %q in tag %q of type %s", flag, tag, st)) + } + } + tag = fields[0] + } + + if inline { + switch field.Type.Kind() { + case reflect.Map: + if inlineMap >= 0 { + return nil, errors.New("Multiple ,inline maps in struct " + st.String()) + } + if field.Type.Key() != reflect.TypeOf("") { + return nil, errors.New("Option ,inline needs a map with string keys in struct " + st.String()) + } + inlineMap = info.Num + case reflect.Struct: + sinfo, err := getStructInfo(field.Type) + if err != nil { + return nil, err + } + for _, finfo := range sinfo.FieldsList { + if _, found := fieldsMap[finfo.Key]; found { + msg := "Duplicated key '" + finfo.Key + "' in struct " + st.String() + return nil, errors.New(msg) + } + if finfo.Inline == nil { + finfo.Inline = []int{i, finfo.Num} + } else { + finfo.Inline = append([]int{i}, finfo.Inline...) + } + finfo.Id = len(fieldsList) + fieldsMap[finfo.Key] = finfo + fieldsList = append(fieldsList, finfo) + } + default: + //return nil, errors.New("Option ,inline needs a struct value or map field") + return nil, errors.New("Option ,inline needs a struct value field") + } + continue + } + + if tag != "" { + info.Key = tag + } else { + info.Key = strings.ToLower(field.Name) + } + + if _, found = fieldsMap[info.Key]; found { + msg := "Duplicated key '" + info.Key + "' in struct " + st.String() + return nil, errors.New(msg) + } + + info.Id = len(fieldsList) + fieldsList = append(fieldsList, info) + fieldsMap[info.Key] = info + } + + sinfo = &structInfo{ + FieldsMap: fieldsMap, + FieldsList: fieldsList, + InlineMap: inlineMap, + } + + fieldMapMutex.Lock() + structMap[st] = sinfo + fieldMapMutex.Unlock() + return sinfo, nil +} + +// IsZeroer is used to check whether an object is zero to +// determine whether it should be omitted when marshaling +// with the omitempty flag. One notable implementation +// is time.Time. +type IsZeroer interface { + IsZero() bool +} + +func isZero(v reflect.Value) bool { + kind := v.Kind() + if z, ok := v.Interface().(IsZeroer); ok { + if (kind == reflect.Ptr || kind == reflect.Interface) && v.IsNil() { + return true + } + return z.IsZero() + } + switch kind { + case reflect.String: + return len(v.String()) == 0 + case reflect.Interface, reflect.Ptr: + return v.IsNil() + case reflect.Slice: + return v.Len() == 0 + case reflect.Map: + return v.Len() == 0 + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return v.Int() == 0 + case reflect.Float32, reflect.Float64: + return v.Float() == 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return v.Uint() == 0 + case reflect.Bool: + return !v.Bool() + case reflect.Struct: + vt := v.Type() + for i := v.NumField() - 1; i >= 0; i-- { + if vt.Field(i).PkgPath != "" { + continue // Private field + } + if !isZero(v.Field(i)) { + return false + } + } + return true + } + return false +} diff --git a/api/vendor/gopkg.in/yaml.v2/yamlh.go b/api/vendor/gopkg.in/yaml.v2/yamlh.go new file mode 100644 index 0000000..e25cee5 --- /dev/null +++ b/api/vendor/gopkg.in/yaml.v2/yamlh.go @@ -0,0 +1,738 @@ +package yaml + +import ( + "fmt" + "io" +) + +// The version directive data. +type yaml_version_directive_t struct { + major int8 // The major version number. + minor int8 // The minor version number. +} + +// The tag directive data. +type yaml_tag_directive_t struct { + handle []byte // The tag handle. + prefix []byte // The tag prefix. +} + +type yaml_encoding_t int + +// The stream encoding. +const ( + // Let the parser choose the encoding. + yaml_ANY_ENCODING yaml_encoding_t = iota + + yaml_UTF8_ENCODING // The default UTF-8 encoding. + yaml_UTF16LE_ENCODING // The UTF-16-LE encoding with BOM. + yaml_UTF16BE_ENCODING // The UTF-16-BE encoding with BOM. +) + +type yaml_break_t int + +// Line break types. +const ( + // Let the parser choose the break type. + yaml_ANY_BREAK yaml_break_t = iota + + yaml_CR_BREAK // Use CR for line breaks (Mac style). + yaml_LN_BREAK // Use LN for line breaks (Unix style). + yaml_CRLN_BREAK // Use CR LN for line breaks (DOS style). +) + +type yaml_error_type_t int + +// Many bad things could happen with the parser and emitter. +const ( + // No error is produced. + yaml_NO_ERROR yaml_error_type_t = iota + + yaml_MEMORY_ERROR // Cannot allocate or reallocate a block of memory. + yaml_READER_ERROR // Cannot read or decode the input stream. + yaml_SCANNER_ERROR // Cannot scan the input stream. + yaml_PARSER_ERROR // Cannot parse the input stream. + yaml_COMPOSER_ERROR // Cannot compose a YAML document. + yaml_WRITER_ERROR // Cannot write to the output stream. + yaml_EMITTER_ERROR // Cannot emit a YAML stream. +) + +// The pointer position. +type yaml_mark_t struct { + index int // The position index. + line int // The position line. + column int // The position column. +} + +// Node Styles + +type yaml_style_t int8 + +type yaml_scalar_style_t yaml_style_t + +// Scalar styles. +const ( + // Let the emitter choose the style. + yaml_ANY_SCALAR_STYLE yaml_scalar_style_t = iota + + yaml_PLAIN_SCALAR_STYLE // The plain scalar style. + yaml_SINGLE_QUOTED_SCALAR_STYLE // The single-quoted scalar style. + yaml_DOUBLE_QUOTED_SCALAR_STYLE // The double-quoted scalar style. + yaml_LITERAL_SCALAR_STYLE // The literal scalar style. + yaml_FOLDED_SCALAR_STYLE // The folded scalar style. +) + +type yaml_sequence_style_t yaml_style_t + +// Sequence styles. +const ( + // Let the emitter choose the style. + yaml_ANY_SEQUENCE_STYLE yaml_sequence_style_t = iota + + yaml_BLOCK_SEQUENCE_STYLE // The block sequence style. + yaml_FLOW_SEQUENCE_STYLE // The flow sequence style. +) + +type yaml_mapping_style_t yaml_style_t + +// Mapping styles. +const ( + // Let the emitter choose the style. + yaml_ANY_MAPPING_STYLE yaml_mapping_style_t = iota + + yaml_BLOCK_MAPPING_STYLE // The block mapping style. + yaml_FLOW_MAPPING_STYLE // The flow mapping style. +) + +// Tokens + +type yaml_token_type_t int + +// Token types. +const ( + // An empty token. + yaml_NO_TOKEN yaml_token_type_t = iota + + yaml_STREAM_START_TOKEN // A STREAM-START token. + yaml_STREAM_END_TOKEN // A STREAM-END token. + + yaml_VERSION_DIRECTIVE_TOKEN // A VERSION-DIRECTIVE token. + yaml_TAG_DIRECTIVE_TOKEN // A TAG-DIRECTIVE token. + yaml_DOCUMENT_START_TOKEN // A DOCUMENT-START token. + yaml_DOCUMENT_END_TOKEN // A DOCUMENT-END token. + + yaml_BLOCK_SEQUENCE_START_TOKEN // A BLOCK-SEQUENCE-START token. + yaml_BLOCK_MAPPING_START_TOKEN // A BLOCK-SEQUENCE-END token. + yaml_BLOCK_END_TOKEN // A BLOCK-END token. + + yaml_FLOW_SEQUENCE_START_TOKEN // A FLOW-SEQUENCE-START token. + yaml_FLOW_SEQUENCE_END_TOKEN // A FLOW-SEQUENCE-END token. + yaml_FLOW_MAPPING_START_TOKEN // A FLOW-MAPPING-START token. + yaml_FLOW_MAPPING_END_TOKEN // A FLOW-MAPPING-END token. + + yaml_BLOCK_ENTRY_TOKEN // A BLOCK-ENTRY token. + yaml_FLOW_ENTRY_TOKEN // A FLOW-ENTRY token. + yaml_KEY_TOKEN // A KEY token. + yaml_VALUE_TOKEN // A VALUE token. + + yaml_ALIAS_TOKEN // An ALIAS token. + yaml_ANCHOR_TOKEN // An ANCHOR token. + yaml_TAG_TOKEN // A TAG token. + yaml_SCALAR_TOKEN // A SCALAR token. +) + +func (tt yaml_token_type_t) String() string { + switch tt { + case yaml_NO_TOKEN: + return "yaml_NO_TOKEN" + case yaml_STREAM_START_TOKEN: + return "yaml_STREAM_START_TOKEN" + case yaml_STREAM_END_TOKEN: + return "yaml_STREAM_END_TOKEN" + case yaml_VERSION_DIRECTIVE_TOKEN: + return "yaml_VERSION_DIRECTIVE_TOKEN" + case yaml_TAG_DIRECTIVE_TOKEN: + return "yaml_TAG_DIRECTIVE_TOKEN" + case yaml_DOCUMENT_START_TOKEN: + return "yaml_DOCUMENT_START_TOKEN" + case yaml_DOCUMENT_END_TOKEN: + return "yaml_DOCUMENT_END_TOKEN" + case yaml_BLOCK_SEQUENCE_START_TOKEN: + return "yaml_BLOCK_SEQUENCE_START_TOKEN" + case yaml_BLOCK_MAPPING_START_TOKEN: + return "yaml_BLOCK_MAPPING_START_TOKEN" + case yaml_BLOCK_END_TOKEN: + return "yaml_BLOCK_END_TOKEN" + case yaml_FLOW_SEQUENCE_START_TOKEN: + return "yaml_FLOW_SEQUENCE_START_TOKEN" + case yaml_FLOW_SEQUENCE_END_TOKEN: + return "yaml_FLOW_SEQUENCE_END_TOKEN" + case yaml_FLOW_MAPPING_START_TOKEN: + return "yaml_FLOW_MAPPING_START_TOKEN" + case yaml_FLOW_MAPPING_END_TOKEN: + return "yaml_FLOW_MAPPING_END_TOKEN" + case yaml_BLOCK_ENTRY_TOKEN: + return "yaml_BLOCK_ENTRY_TOKEN" + case yaml_FLOW_ENTRY_TOKEN: + return "yaml_FLOW_ENTRY_TOKEN" + case yaml_KEY_TOKEN: + return "yaml_KEY_TOKEN" + case yaml_VALUE_TOKEN: + return "yaml_VALUE_TOKEN" + case yaml_ALIAS_TOKEN: + return "yaml_ALIAS_TOKEN" + case yaml_ANCHOR_TOKEN: + return "yaml_ANCHOR_TOKEN" + case yaml_TAG_TOKEN: + return "yaml_TAG_TOKEN" + case yaml_SCALAR_TOKEN: + return "yaml_SCALAR_TOKEN" + } + return "" +} + +// The token structure. +type yaml_token_t struct { + // The token type. + typ yaml_token_type_t + + // The start/end of the token. + start_mark, end_mark yaml_mark_t + + // The stream encoding (for yaml_STREAM_START_TOKEN). + encoding yaml_encoding_t + + // The alias/anchor/scalar value or tag/tag directive handle + // (for yaml_ALIAS_TOKEN, yaml_ANCHOR_TOKEN, yaml_SCALAR_TOKEN, yaml_TAG_TOKEN, yaml_TAG_DIRECTIVE_TOKEN). + value []byte + + // The tag suffix (for yaml_TAG_TOKEN). + suffix []byte + + // The tag directive prefix (for yaml_TAG_DIRECTIVE_TOKEN). + prefix []byte + + // The scalar style (for yaml_SCALAR_TOKEN). + style yaml_scalar_style_t + + // The version directive major/minor (for yaml_VERSION_DIRECTIVE_TOKEN). + major, minor int8 +} + +// Events + +type yaml_event_type_t int8 + +// Event types. +const ( + // An empty event. + yaml_NO_EVENT yaml_event_type_t = iota + + yaml_STREAM_START_EVENT // A STREAM-START event. + yaml_STREAM_END_EVENT // A STREAM-END event. + yaml_DOCUMENT_START_EVENT // A DOCUMENT-START event. + yaml_DOCUMENT_END_EVENT // A DOCUMENT-END event. + yaml_ALIAS_EVENT // An ALIAS event. + yaml_SCALAR_EVENT // A SCALAR event. + yaml_SEQUENCE_START_EVENT // A SEQUENCE-START event. + yaml_SEQUENCE_END_EVENT // A SEQUENCE-END event. + yaml_MAPPING_START_EVENT // A MAPPING-START event. + yaml_MAPPING_END_EVENT // A MAPPING-END event. +) + +var eventStrings = []string{ + yaml_NO_EVENT: "none", + yaml_STREAM_START_EVENT: "stream start", + yaml_STREAM_END_EVENT: "stream end", + yaml_DOCUMENT_START_EVENT: "document start", + yaml_DOCUMENT_END_EVENT: "document end", + yaml_ALIAS_EVENT: "alias", + yaml_SCALAR_EVENT: "scalar", + yaml_SEQUENCE_START_EVENT: "sequence start", + yaml_SEQUENCE_END_EVENT: "sequence end", + yaml_MAPPING_START_EVENT: "mapping start", + yaml_MAPPING_END_EVENT: "mapping end", +} + +func (e yaml_event_type_t) String() string { + if e < 0 || int(e) >= len(eventStrings) { + return fmt.Sprintf("unknown event %d", e) + } + return eventStrings[e] +} + +// The event structure. +type yaml_event_t struct { + + // The event type. + typ yaml_event_type_t + + // The start and end of the event. + start_mark, end_mark yaml_mark_t + + // The document encoding (for yaml_STREAM_START_EVENT). + encoding yaml_encoding_t + + // The version directive (for yaml_DOCUMENT_START_EVENT). + version_directive *yaml_version_directive_t + + // The list of tag directives (for yaml_DOCUMENT_START_EVENT). + tag_directives []yaml_tag_directive_t + + // The anchor (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT, yaml_ALIAS_EVENT). + anchor []byte + + // The tag (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT). + tag []byte + + // The scalar value (for yaml_SCALAR_EVENT). + value []byte + + // Is the document start/end indicator implicit, or the tag optional? + // (for yaml_DOCUMENT_START_EVENT, yaml_DOCUMENT_END_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT, yaml_SCALAR_EVENT). + implicit bool + + // Is the tag optional for any non-plain style? (for yaml_SCALAR_EVENT). + quoted_implicit bool + + // The style (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT). + style yaml_style_t +} + +func (e *yaml_event_t) scalar_style() yaml_scalar_style_t { return yaml_scalar_style_t(e.style) } +func (e *yaml_event_t) sequence_style() yaml_sequence_style_t { return yaml_sequence_style_t(e.style) } +func (e *yaml_event_t) mapping_style() yaml_mapping_style_t { return yaml_mapping_style_t(e.style) } + +// Nodes + +const ( + yaml_NULL_TAG = "tag:yaml.org,2002:null" // The tag !!null with the only possible value: null. + yaml_BOOL_TAG = "tag:yaml.org,2002:bool" // The tag !!bool with the values: true and false. + yaml_STR_TAG = "tag:yaml.org,2002:str" // The tag !!str for string values. + yaml_INT_TAG = "tag:yaml.org,2002:int" // The tag !!int for integer values. + yaml_FLOAT_TAG = "tag:yaml.org,2002:float" // The tag !!float for float values. + yaml_TIMESTAMP_TAG = "tag:yaml.org,2002:timestamp" // The tag !!timestamp for date and time values. + + yaml_SEQ_TAG = "tag:yaml.org,2002:seq" // The tag !!seq is used to denote sequences. + yaml_MAP_TAG = "tag:yaml.org,2002:map" // The tag !!map is used to denote mapping. + + // Not in original libyaml. + yaml_BINARY_TAG = "tag:yaml.org,2002:binary" + yaml_MERGE_TAG = "tag:yaml.org,2002:merge" + + yaml_DEFAULT_SCALAR_TAG = yaml_STR_TAG // The default scalar tag is !!str. + yaml_DEFAULT_SEQUENCE_TAG = yaml_SEQ_TAG // The default sequence tag is !!seq. + yaml_DEFAULT_MAPPING_TAG = yaml_MAP_TAG // The default mapping tag is !!map. +) + +type yaml_node_type_t int + +// Node types. +const ( + // An empty node. + yaml_NO_NODE yaml_node_type_t = iota + + yaml_SCALAR_NODE // A scalar node. + yaml_SEQUENCE_NODE // A sequence node. + yaml_MAPPING_NODE // A mapping node. +) + +// An element of a sequence node. +type yaml_node_item_t int + +// An element of a mapping node. +type yaml_node_pair_t struct { + key int // The key of the element. + value int // The value of the element. +} + +// The node structure. +type yaml_node_t struct { + typ yaml_node_type_t // The node type. + tag []byte // The node tag. + + // The node data. + + // The scalar parameters (for yaml_SCALAR_NODE). + scalar struct { + value []byte // The scalar value. + length int // The length of the scalar value. + style yaml_scalar_style_t // The scalar style. + } + + // The sequence parameters (for YAML_SEQUENCE_NODE). + sequence struct { + items_data []yaml_node_item_t // The stack of sequence items. + style yaml_sequence_style_t // The sequence style. + } + + // The mapping parameters (for yaml_MAPPING_NODE). + mapping struct { + pairs_data []yaml_node_pair_t // The stack of mapping pairs (key, value). + pairs_start *yaml_node_pair_t // The beginning of the stack. + pairs_end *yaml_node_pair_t // The end of the stack. + pairs_top *yaml_node_pair_t // The top of the stack. + style yaml_mapping_style_t // The mapping style. + } + + start_mark yaml_mark_t // The beginning of the node. + end_mark yaml_mark_t // The end of the node. + +} + +// The document structure. +type yaml_document_t struct { + + // The document nodes. + nodes []yaml_node_t + + // The version directive. + version_directive *yaml_version_directive_t + + // The list of tag directives. + tag_directives_data []yaml_tag_directive_t + tag_directives_start int // The beginning of the tag directives list. + tag_directives_end int // The end of the tag directives list. + + start_implicit int // Is the document start indicator implicit? + end_implicit int // Is the document end indicator implicit? + + // The start/end of the document. + start_mark, end_mark yaml_mark_t +} + +// The prototype of a read handler. +// +// The read handler is called when the parser needs to read more bytes from the +// source. The handler should write not more than size bytes to the buffer. +// The number of written bytes should be set to the size_read variable. +// +// [in,out] data A pointer to an application data specified by +// yaml_parser_set_input(). +// [out] buffer The buffer to write the data from the source. +// [in] size The size of the buffer. +// [out] size_read The actual number of bytes read from the source. +// +// On success, the handler should return 1. If the handler failed, +// the returned value should be 0. On EOF, the handler should set the +// size_read to 0 and return 1. +type yaml_read_handler_t func(parser *yaml_parser_t, buffer []byte) (n int, err error) + +// This structure holds information about a potential simple key. +type yaml_simple_key_t struct { + possible bool // Is a simple key possible? + required bool // Is a simple key required? + token_number int // The number of the token. + mark yaml_mark_t // The position mark. +} + +// The states of the parser. +type yaml_parser_state_t int + +const ( + yaml_PARSE_STREAM_START_STATE yaml_parser_state_t = iota + + yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE // Expect the beginning of an implicit document. + yaml_PARSE_DOCUMENT_START_STATE // Expect DOCUMENT-START. + yaml_PARSE_DOCUMENT_CONTENT_STATE // Expect the content of a document. + yaml_PARSE_DOCUMENT_END_STATE // Expect DOCUMENT-END. + yaml_PARSE_BLOCK_NODE_STATE // Expect a block node. + yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE // Expect a block node or indentless sequence. + yaml_PARSE_FLOW_NODE_STATE // Expect a flow node. + yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE // Expect the first entry of a block sequence. + yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE // Expect an entry of a block sequence. + yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE // Expect an entry of an indentless sequence. + yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE // Expect the first key of a block mapping. + yaml_PARSE_BLOCK_MAPPING_KEY_STATE // Expect a block mapping key. + yaml_PARSE_BLOCK_MAPPING_VALUE_STATE // Expect a block mapping value. + yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE // Expect the first entry of a flow sequence. + yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE // Expect an entry of a flow sequence. + yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE // Expect a key of an ordered mapping. + yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE // Expect a value of an ordered mapping. + yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE // Expect the and of an ordered mapping entry. + yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE // Expect the first key of a flow mapping. + yaml_PARSE_FLOW_MAPPING_KEY_STATE // Expect a key of a flow mapping. + yaml_PARSE_FLOW_MAPPING_VALUE_STATE // Expect a value of a flow mapping. + yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE // Expect an empty value of a flow mapping. + yaml_PARSE_END_STATE // Expect nothing. +) + +func (ps yaml_parser_state_t) String() string { + switch ps { + case yaml_PARSE_STREAM_START_STATE: + return "yaml_PARSE_STREAM_START_STATE" + case yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE: + return "yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE" + case yaml_PARSE_DOCUMENT_START_STATE: + return "yaml_PARSE_DOCUMENT_START_STATE" + case yaml_PARSE_DOCUMENT_CONTENT_STATE: + return "yaml_PARSE_DOCUMENT_CONTENT_STATE" + case yaml_PARSE_DOCUMENT_END_STATE: + return "yaml_PARSE_DOCUMENT_END_STATE" + case yaml_PARSE_BLOCK_NODE_STATE: + return "yaml_PARSE_BLOCK_NODE_STATE" + case yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE: + return "yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE" + case yaml_PARSE_FLOW_NODE_STATE: + return "yaml_PARSE_FLOW_NODE_STATE" + case yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE: + return "yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE" + case yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE: + return "yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE" + case yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE: + return "yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE" + case yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE: + return "yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE" + case yaml_PARSE_BLOCK_MAPPING_KEY_STATE: + return "yaml_PARSE_BLOCK_MAPPING_KEY_STATE" + case yaml_PARSE_BLOCK_MAPPING_VALUE_STATE: + return "yaml_PARSE_BLOCK_MAPPING_VALUE_STATE" + case yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE: + return "yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE" + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE: + return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE" + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE: + return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE" + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE: + return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE" + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE: + return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE" + case yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE: + return "yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE" + case yaml_PARSE_FLOW_MAPPING_KEY_STATE: + return "yaml_PARSE_FLOW_MAPPING_KEY_STATE" + case yaml_PARSE_FLOW_MAPPING_VALUE_STATE: + return "yaml_PARSE_FLOW_MAPPING_VALUE_STATE" + case yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE: + return "yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE" + case yaml_PARSE_END_STATE: + return "yaml_PARSE_END_STATE" + } + return "" +} + +// This structure holds aliases data. +type yaml_alias_data_t struct { + anchor []byte // The anchor. + index int // The node id. + mark yaml_mark_t // The anchor mark. +} + +// The parser structure. +// +// All members are internal. Manage the structure using the +// yaml_parser_ family of functions. +type yaml_parser_t struct { + + // Error handling + + error yaml_error_type_t // Error type. + + problem string // Error description. + + // The byte about which the problem occurred. + problem_offset int + problem_value int + problem_mark yaml_mark_t + + // The error context. + context string + context_mark yaml_mark_t + + // Reader stuff + + read_handler yaml_read_handler_t // Read handler. + + input_reader io.Reader // File input data. + input []byte // String input data. + input_pos int + + eof bool // EOF flag + + buffer []byte // The working buffer. + buffer_pos int // The current position of the buffer. + + unread int // The number of unread characters in the buffer. + + raw_buffer []byte // The raw buffer. + raw_buffer_pos int // The current position of the buffer. + + encoding yaml_encoding_t // The input encoding. + + offset int // The offset of the current position (in bytes). + mark yaml_mark_t // The mark of the current position. + + // Scanner stuff + + stream_start_produced bool // Have we started to scan the input stream? + stream_end_produced bool // Have we reached the end of the input stream? + + flow_level int // The number of unclosed '[' and '{' indicators. + + tokens []yaml_token_t // The tokens queue. + tokens_head int // The head of the tokens queue. + tokens_parsed int // The number of tokens fetched from the queue. + token_available bool // Does the tokens queue contain a token ready for dequeueing. + + indent int // The current indentation level. + indents []int // The indentation levels stack. + + simple_key_allowed bool // May a simple key occur at the current position? + simple_keys []yaml_simple_key_t // The stack of simple keys. + + // Parser stuff + + state yaml_parser_state_t // The current parser state. + states []yaml_parser_state_t // The parser states stack. + marks []yaml_mark_t // The stack of marks. + tag_directives []yaml_tag_directive_t // The list of TAG directives. + + // Dumper stuff + + aliases []yaml_alias_data_t // The alias data. + + document *yaml_document_t // The currently parsed document. +} + +// Emitter Definitions + +// The prototype of a write handler. +// +// The write handler is called when the emitter needs to flush the accumulated +// characters to the output. The handler should write @a size bytes of the +// @a buffer to the output. +// +// @param[in,out] data A pointer to an application data specified by +// yaml_emitter_set_output(). +// @param[in] buffer The buffer with bytes to be written. +// @param[in] size The size of the buffer. +// +// @returns On success, the handler should return @c 1. If the handler failed, +// the returned value should be @c 0. +// +type yaml_write_handler_t func(emitter *yaml_emitter_t, buffer []byte) error + +type yaml_emitter_state_t int + +// The emitter states. +const ( + // Expect STREAM-START. + yaml_EMIT_STREAM_START_STATE yaml_emitter_state_t = iota + + yaml_EMIT_FIRST_DOCUMENT_START_STATE // Expect the first DOCUMENT-START or STREAM-END. + yaml_EMIT_DOCUMENT_START_STATE // Expect DOCUMENT-START or STREAM-END. + yaml_EMIT_DOCUMENT_CONTENT_STATE // Expect the content of a document. + yaml_EMIT_DOCUMENT_END_STATE // Expect DOCUMENT-END. + yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE // Expect the first item of a flow sequence. + yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE // Expect an item of a flow sequence. + yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE // Expect the first key of a flow mapping. + yaml_EMIT_FLOW_MAPPING_KEY_STATE // Expect a key of a flow mapping. + yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE // Expect a value for a simple key of a flow mapping. + yaml_EMIT_FLOW_MAPPING_VALUE_STATE // Expect a value of a flow mapping. + yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE // Expect the first item of a block sequence. + yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE // Expect an item of a block sequence. + yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE // Expect the first key of a block mapping. + yaml_EMIT_BLOCK_MAPPING_KEY_STATE // Expect the key of a block mapping. + yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE // Expect a value for a simple key of a block mapping. + yaml_EMIT_BLOCK_MAPPING_VALUE_STATE // Expect a value of a block mapping. + yaml_EMIT_END_STATE // Expect nothing. +) + +// The emitter structure. +// +// All members are internal. Manage the structure using the @c yaml_emitter_ +// family of functions. +type yaml_emitter_t struct { + + // Error handling + + error yaml_error_type_t // Error type. + problem string // Error description. + + // Writer stuff + + write_handler yaml_write_handler_t // Write handler. + + output_buffer *[]byte // String output data. + output_writer io.Writer // File output data. + + buffer []byte // The working buffer. + buffer_pos int // The current position of the buffer. + + raw_buffer []byte // The raw buffer. + raw_buffer_pos int // The current position of the buffer. + + encoding yaml_encoding_t // The stream encoding. + + // Emitter stuff + + canonical bool // If the output is in the canonical style? + best_indent int // The number of indentation spaces. + best_width int // The preferred width of the output lines. + unicode bool // Allow unescaped non-ASCII characters? + line_break yaml_break_t // The preferred line break. + + state yaml_emitter_state_t // The current emitter state. + states []yaml_emitter_state_t // The stack of states. + + events []yaml_event_t // The event queue. + events_head int // The head of the event queue. + + indents []int // The stack of indentation levels. + + tag_directives []yaml_tag_directive_t // The list of tag directives. + + indent int // The current indentation level. + + flow_level int // The current flow level. + + root_context bool // Is it the document root context? + sequence_context bool // Is it a sequence context? + mapping_context bool // Is it a mapping context? + simple_key_context bool // Is it a simple mapping key context? + + line int // The current line. + column int // The current column. + whitespace bool // If the last character was a whitespace? + indention bool // If the last character was an indentation character (' ', '-', '?', ':')? + open_ended bool // If an explicit document end is required? + + // Anchor analysis. + anchor_data struct { + anchor []byte // The anchor value. + alias bool // Is it an alias? + } + + // Tag analysis. + tag_data struct { + handle []byte // The tag handle. + suffix []byte // The tag suffix. + } + + // Scalar analysis. + scalar_data struct { + value []byte // The scalar value. + multiline bool // Does the scalar contain line breaks? + flow_plain_allowed bool // Can the scalar be expessed in the flow plain style? + block_plain_allowed bool // Can the scalar be expressed in the block plain style? + single_quoted_allowed bool // Can the scalar be expressed in the single quoted style? + block_allowed bool // Can the scalar be expressed in the literal or folded styles? + style yaml_scalar_style_t // The output style. + } + + // Dumper stuff + + opened bool // If the stream was already opened? + closed bool // If the stream was already closed? + + // The information associated with the document nodes. + anchors *struct { + references int // The number of references. + anchor int // The anchor id. + serialized bool // If the node has been emitted? + } + + last_anchor_id int // The last assigned anchor id. + + document *yaml_document_t // The currently emitted document. +} diff --git a/api/vendor/gopkg.in/yaml.v2/yamlprivateh.go b/api/vendor/gopkg.in/yaml.v2/yamlprivateh.go new file mode 100644 index 0000000..8110ce3 --- /dev/null +++ b/api/vendor/gopkg.in/yaml.v2/yamlprivateh.go @@ -0,0 +1,173 @@ +package yaml + +const ( + // The size of the input raw buffer. + input_raw_buffer_size = 512 + + // The size of the input buffer. + // It should be possible to decode the whole raw buffer. + input_buffer_size = input_raw_buffer_size * 3 + + // The size of the output buffer. + output_buffer_size = 128 + + // The size of the output raw buffer. + // It should be possible to encode the whole output buffer. + output_raw_buffer_size = (output_buffer_size*2 + 2) + + // The size of other stacks and queues. + initial_stack_size = 16 + initial_queue_size = 16 + initial_string_size = 16 +) + +// Check if the character at the specified position is an alphabetical +// character, a digit, '_', or '-'. +func is_alpha(b []byte, i int) bool { + return b[i] >= '0' && b[i] <= '9' || b[i] >= 'A' && b[i] <= 'Z' || b[i] >= 'a' && b[i] <= 'z' || b[i] == '_' || b[i] == '-' +} + +// Check if the character at the specified position is a digit. +func is_digit(b []byte, i int) bool { + return b[i] >= '0' && b[i] <= '9' +} + +// Get the value of a digit. +func as_digit(b []byte, i int) int { + return int(b[i]) - '0' +} + +// Check if the character at the specified position is a hex-digit. +func is_hex(b []byte, i int) bool { + return b[i] >= '0' && b[i] <= '9' || b[i] >= 'A' && b[i] <= 'F' || b[i] >= 'a' && b[i] <= 'f' +} + +// Get the value of a hex-digit. +func as_hex(b []byte, i int) int { + bi := b[i] + if bi >= 'A' && bi <= 'F' { + return int(bi) - 'A' + 10 + } + if bi >= 'a' && bi <= 'f' { + return int(bi) - 'a' + 10 + } + return int(bi) - '0' +} + +// Check if the character is ASCII. +func is_ascii(b []byte, i int) bool { + return b[i] <= 0x7F +} + +// Check if the character at the start of the buffer can be printed unescaped. +func is_printable(b []byte, i int) bool { + return ((b[i] == 0x0A) || // . == #x0A + (b[i] >= 0x20 && b[i] <= 0x7E) || // #x20 <= . <= #x7E + (b[i] == 0xC2 && b[i+1] >= 0xA0) || // #0xA0 <= . <= #xD7FF + (b[i] > 0xC2 && b[i] < 0xED) || + (b[i] == 0xED && b[i+1] < 0xA0) || + (b[i] == 0xEE) || + (b[i] == 0xEF && // #xE000 <= . <= #xFFFD + !(b[i+1] == 0xBB && b[i+2] == 0xBF) && // && . != #xFEFF + !(b[i+1] == 0xBF && (b[i+2] == 0xBE || b[i+2] == 0xBF)))) +} + +// Check if the character at the specified position is NUL. +func is_z(b []byte, i int) bool { + return b[i] == 0x00 +} + +// Check if the beginning of the buffer is a BOM. +func is_bom(b []byte, i int) bool { + return b[0] == 0xEF && b[1] == 0xBB && b[2] == 0xBF +} + +// Check if the character at the specified position is space. +func is_space(b []byte, i int) bool { + return b[i] == ' ' +} + +// Check if the character at the specified position is tab. +func is_tab(b []byte, i int) bool { + return b[i] == '\t' +} + +// Check if the character at the specified position is blank (space or tab). +func is_blank(b []byte, i int) bool { + //return is_space(b, i) || is_tab(b, i) + return b[i] == ' ' || b[i] == '\t' +} + +// Check if the character at the specified position is a line break. +func is_break(b []byte, i int) bool { + return (b[i] == '\r' || // CR (#xD) + b[i] == '\n' || // LF (#xA) + b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9) // PS (#x2029) +} + +func is_crlf(b []byte, i int) bool { + return b[i] == '\r' && b[i+1] == '\n' +} + +// Check if the character is a line break or NUL. +func is_breakz(b []byte, i int) bool { + //return is_break(b, i) || is_z(b, i) + return ( // is_break: + b[i] == '\r' || // CR (#xD) + b[i] == '\n' || // LF (#xA) + b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029) + // is_z: + b[i] == 0) +} + +// Check if the character is a line break, space, or NUL. +func is_spacez(b []byte, i int) bool { + //return is_space(b, i) || is_breakz(b, i) + return ( // is_space: + b[i] == ' ' || + // is_breakz: + b[i] == '\r' || // CR (#xD) + b[i] == '\n' || // LF (#xA) + b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029) + b[i] == 0) +} + +// Check if the character is a line break, space, tab, or NUL. +func is_blankz(b []byte, i int) bool { + //return is_blank(b, i) || is_breakz(b, i) + return ( // is_blank: + b[i] == ' ' || b[i] == '\t' || + // is_breakz: + b[i] == '\r' || // CR (#xD) + b[i] == '\n' || // LF (#xA) + b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029) + b[i] == 0) +} + +// Determine the width of the character. +func width(b byte) int { + // Don't replace these by a switch without first + // confirming that it is being inlined. + if b&0x80 == 0x00 { + return 1 + } + if b&0xE0 == 0xC0 { + return 2 + } + if b&0xF0 == 0xE0 { + return 3 + } + if b&0xF8 == 0xF0 { + return 4 + } + return 0 + +} diff --git a/api/version/version.go b/api/version/version.go new file mode 100644 index 0000000..0422de0 --- /dev/null +++ b/api/version/version.go @@ -0,0 +1,21 @@ +package version + +import ( + "fmt" + "runtime" +) + +var ( + Version = "" + Branch = "" + BuildTimestamp = "" + GoVersion = runtime.Version() +) + +func String() string { + return fmt.Sprintf("version: %s, branch: %s, build timestamp: %s, go version: %s", + Version, + Branch, + BuildTimestamp, + GoVersion) +} diff --git a/api/version/version_test.go b/api/version/version_test.go new file mode 100644 index 0000000..f37d99d --- /dev/null +++ b/api/version/version_test.go @@ -0,0 +1 @@ +package version diff --git a/documentation/architecture.png b/documentation/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..349ed246a1515b92b7bc3be11c66003b865d5960 GIT binary patch literal 93732 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 literal 0 HcmV?d00001 diff --git a/documentation/configuration.md b/documentation/configuration.md new file mode 100644 index 0000000..269f42c --- /dev/null +++ b/documentation/configuration.md @@ -0,0 +1,226 @@ +Vistio is configured via command-line flags and a configuration file. + +### Command-line flags + +- `--config.file` Vistio configuration file path. Default is `/etc/vistio/vistio.yaml`. +- `--log.level` The level of logging. Default is `info`. +- `--api.port` Port to listen on for API requests. Default is `9091`. +- `--retrieval.scrape-interval` How frequently to scrape metrics from prometheus servers. Default is `10s`. +- `--retrieval.scrape-timeout` How long until a scrape request times out. Default is `8s`. +- `--cache.size` The maximum number of snapshots can be cached. Default is `100`. +- `--storage.path` Base path of local storage for graph data. Default is `/vistio`. +- `--storage.retention` How long to retain graph data in the storage. Default is `168h`. + +### Configuration file + +This file contains configuration information for the traffic graph. Vistio reads this file to know where to send prometheus query and how to generate graph data from that query results. + +Some valid example files are placed in `example` directory ([simple.yaml](https://github.com/nmnellis/vistio/blob/master/example/simple.yaml), [full.yaml](https://github.com/nmnellis/vistio/blob/master/example/simple.yaml)). + +#### Graph data + +Basically, a graph contains a list of nodes and connections. And we have 2 graph levels: + - global level: contains `cluster` nodes and connections between those nodes + - cluster level: contains `service` nodes and connections between those nodes. + +Vistio will send the specified queries to Prometheus servers and generates nodes and connections. + +Let's see how it works. + +Suppose we have the following metrics on a prometheus server. + +``` +code:grpc_server_requests_total:rate2m{client="demo-s1",service="demo-s3",code="OK",foo="foovalue"} 10 +code:grpc_server_requests_total:rate2m{client="demo-s1",service="demo-s3",code="Internal",foo="anything"} 1 +code:grpc_server_requests_total:rate2m{client="demo-s1",service="demo-s3",code="NotFound",foo="bar"} 1 +code:grpc_server_requests_total:rate2m{client="demo-s1",service="demo-s3",code="InvalidArgument",foo="test"} 2 +code:grpc_server_requests_total:rate2m{client="demo-s2",service="demo-s3",code="OK",foo=""} 20 +code:grpc_server_requests_total:rate2m{client="demo-s2",service="demo-s3",code="Internal",foo=""} 5 +``` + +- example 1: Use the label value as the node name. + +``` +query: code:grpc_server_requests_total:rate2m +source: + label: client +target: + label: service +status: + label: code + warningRegex: ^InvalidArgument|FailedPrecondition$ + dangerRegex: Internal +``` + +3 nodes and 2 connections will be generated + +``` +nodes: +- "demo-s1" +- "demo-s2" +- "demo-s3" + +connections: +- "demo-s1" -> "demo-s3": normal RPS = 11, warning RPS = 2, danger RPS = 1 +- "demo-s2" -> "demo-s3": normal RPS = 20, warning RPS = 0, danger RPS = 5 +``` + +- example 2: Want to remove prefix "demo" from node name. + +``` +query: code:grpc_server_requests_total:rate2m +source: + label: client + regex: ^demo-(.+)$ + replacement: $1 +target: + label: service + regex: ^demo-(.+)$ + replacement: $1 +status: + label: code + warningRegex: ^InvalidArgument|FailedPrecondition$ + dangerRegex: Internal +``` + +3 nodes and 2 connections will be generated + +``` +nodes: +- "s1" +- "s2" +- "s3" + +connections: +- "s1" -> "s3": normal RPS = 11, warning RPS = 2, danger RPS = 1 +- "s2" -> "s3": normal RPS = 20, warning RPS = 0, danger RPS = 5 +``` + +- example 3: Want to add a connection notice with `severity=error` if the rate of `danger` RPS is greater than or equal to 0.1 + +``` +query: code:grpc_server_requests_total:rate2m +source: + label: client +target: + label: service +status: + label: code + warningRegex: ^InvalidArgument|FailedPrecondition$ + dangerRegex: Internal +notices: + - title: HighErrorRate + statusType: danger + severityThreshold: + error: 0.1 +``` + +3 nodes and 2 connections, 1 connection notice will be generated + +``` +nodes: +- "demo-s1" +- "demo-s2" +- "demo-s3" + +connections: +- "demo-s1" -> "demo-s3": normal RPS = 11, warning RPS = 2, danger RPS = 1 +- "demo-s2" -> "demo-s3": normal RPS = 20, warning RPS = 0, danger RPS = 5 + - notice: "HighErrorRate", severity = "error" +``` + +#### Full Template + +``` +# The name of graph. +graphName: + +# This block is used to generate global level of graph. +globalLevel: + # The maximum volume seen recently to relatively measure particle density. + maxVolume: + + # Used to generate cluster nodes and the connections between those nodes. + clusterConnections: + - prometheusURL: + # Query will be sent to prometheus. The result of this query should be a vector. + query: + + # How to generate source node name from result of query. + source: + label: + regex: + replacement: + # Set class name to the generated node. + class: + + # How to generate target node name from result of query. + target: + label: + regex: + replacement: + class: + + # Used to calculate warning RPS and danger RPS of this connection. + status: + label: + warningRegex: + dangerRegex: + +# This block is used to generate cluster level of graph. +clusterLevel: + - cluster: + # The maximum volume seen recently to relatively measure particle density. + maxVolume: + + # Used to generate service nodes and the connections between those nodes. + serviceConnections: + - prometheusURL: + query: + + # How to generate source node name from result of query. + source: + label: + regex: + replacement: + class: + + # How to generate target node name from result of query. + target: + label: + regex: + replacement: + class: + + # Used to calculate warning RPS and danger RPS on this connection. + status: + label: + warningRegex: + dangerRegex: + + # Used to generate connection notices of this connections. + notices: + - title: + statusType: + severityThreshold: + warning: + error: + + # Used to generate service node notices. + serviceNotices: + - title: + query: + prometheusURL: + severityThreshold: + warning: + error: + service: + label: + regex: + replacement: + +# Customize color for each class. +classes: + - name: + color: +``` diff --git a/documentation/sample.png b/documentation/sample.png new file mode 100644 index 0000000000000000000000000000000000000000..c3433f1f7b5b253bc2e0aa216191b24db7539858 GIT binary patch literal 740384 zcmb@t19YWJw=z&wz*>4wr!_l8y$9R+a23BJ4VM&UV5MZ?*F{;&b{}XH+Dv4 zeYNVVS(u))YK6^gV z-qFs~!rBA~NIX1Q4MI6_1U-4#4iu79Ur4@|I1;)F z3=KxrSw(n8g|cqBhC1?FCtVl?#c3WjoBU>hKc61=Wwz7DQ;XAO)}^dz2quv78E0#& zMhO+rN-vLsavVN0A!E422`I-85a?+LSa`L}Q*2C3@E=hPA2gSjK*Fn=4ao=3OYa|4 zmONc)FhIyq4$yMr6CsZrKrL+SYDo}4xnQd@riZ^I9r*jPh{O?ri0B3^94lxCC>?oZ z4^U7BLejv1zK`yN%>w<9@?gGcwO~Nd8J*D`Mu8;Ugsx?0&*}?&MC#wGt9K$$B?MT1 zzt+ia@EiTkl%Cipfjw}oX)JV)5$06S;q)emAUmbUM3?zG8F9N?n>YEYTyN@;__9W&s2oM-gj2}h6C!&=ElaUYFay)Uu zfRG=Hb{qzB{!hxhObQWS7QHkyyrSWHo-BN(Z_PIYz%#^rrQd!chV4iKVlfJa`o}!- z4sXC5b`a+Xy9g(v;8pthD8 zQ}Iw}Vh4~PcY|t>;CZ_I{4>7{?!g$LtuwT=z2>3T4zy~-L;G2C^HWnu@=YxxIr!d+ zTYKSY>tB2P%r>vAPT4o%9k46o&xB z!XLpJEhRq8T_YCJH(wC=5rv2kF?R52#Pf*&f3-VG^Ov4h9M$PWs)+HoLqxN^wifn_ z@X#K5m@?vvkoMSqMio&}QgFn#@Sc8wyafsbI^!%b6;RNRL3C&>z6#k<5e~(^X78ZG zAhuqmUK=5Z9lo$HQ^p#oy3Am~dH89}J;u|(^o|3;gKzfq!}yLvjrKbF zk#hdYkGp&|Y-Z+f*}29^Yt5~%4m^~nm!}HL$BWKpV3A2PdLg_gcSh*+b&8&#u)14AdwBB;VGxLi6swwt(Y5X4QhM(6vs+8v_jdJ|rK|E(Gxv2t^<2 z)B%+4CrXU~P#P$a0IWDD^LA8mp!Ki^TN*-&zo9(zqCcEI%rdZR;M+DL2lR;`3I`0` zH>+*%7C5|Kml-(S0N>wuutbnTLgtWPW&~l8nESyUgx3-6NPwUKd2zxdm=b`XFwpO@ zG$NAmOvW&EFr`AiBC-T#@zmnjj`+vIp7G7YW~hMD67aIv^!z;q_IV6A5u@p2b1W_x zT7k%El_RnSWZtmFT(cRgBb$aVKEd$%KuUuR48-H;PJPSjpeaFxhD6qcs^5~0lGWiB zA^i?B)FBo_eR{(=zL@Pc+1r5c)pB6u1k?Ac?P~pgbI0|?>kfC@eS1^`iT)v0L+Fku z1PK+y(rYcmn44LXDlgRn^dQ5&!y7L?Po#;cv(qI_Vv2Z(q=wv#gn%-IxE7|<4~!gM z0H`DMh$j-qQN$}vYxwRQ=bSz-dqUnLOLDV0x|WZ6NPwMxv1&;s-VN|~Dq z#QaxFcuOS96-(*`_!1q3Qw8$UjB<#QoB7CjxAGjNOGABF6!4556B?5<18se0D@0Zr z79kcU7D-lkiw4VEt1>Iu>8QEPe2rWW#d-kD9Mcl?%;>CUrHk@u%;F*Avyu1E@1csX zO3Xz*;}GYyt28!UuHp9v=WDAuE@@oAT;I8@Tuxl@PIucD+mxKmPHmSuf2^^q8dV&s zUo0ooiVg8i1MVvB@@@}~&ljy`u&3Fl5oV_rwkrH&yQc)k{7vEvYBsl%1gi=Arq|^4 zTQ+|;>_`=n&82=HSnubVI%A(@hGt9ndd_6YipA2z5W`Bx!e{-u9Avm_nqXPCS+G*D zH9zfKckDf9IR{}XX=-bFY>GWW_uYq~nIV>4&s5iL(!SvXObF6Om zIt6WJbb@NmGGhVGYJPQvYoo3Axed;8&ycug#dMA>hGEht(_Z^mOM8>Dmfo88n&p}- zH*GsZyHLAl`_i7w5P7s7_xtQ)_5I|%#=X}WK3561v?GPHxwHGJ`T4L*g?+~_VJB#3 z&Hef9Thnh7pzlHFC>NZ}ndIE`PPVS^ySpbuj-?LAF03vxt{W$wOEP`5vo?imCT`!_ zb6$uZ$R6bI=EF)FS9mr`9%3} zawKz#X;9E(8&mIkmqyw99)4U}@q6*d>s4++G(mU)zeMpL;P310ZejhvL&UBj-In;_ zps%U#qVE^yG~MxoxhH6Qdb_d54R8x+AygrJOVlQ(O>^c;!otFBBfYgqb4jD9aA4x{ znB8|t#1GC0hUq&c77!NiZwniWM~|;3^2-p)MCL3s9KE3kEqPK%&BL5w&PNdLj=hT1 zz`bEuWKu<5!zo5)r>&y80Cf0yYj}(GJ_dn7Eg`$0fQ7?J6cn@+bV__t`ch<@w#qx< zp?TH7Jx5zK_1)JbkiE7!+BW2e3FN(wvjHWD4f#$%U~~UD@01`(YjK*wwFZzbdIS zRjqZe8iUjv8|S+kI-Jc(-F_|P;QDUf-uy0`SE(%5QMJfSKr= zl2w;$O=;`Zy>Enk$F53}qu8pAuT!Y2HBwqG3YjR%ShB`jP3ZdN8mu?4Q|YOtX8l$Z z-CXIzZRIrq|At%0&3B1<*3nFDuBKDyVe(|Vd-1w4_0WIbdKC)ZMK zpBwwb8v(+ri0^(RgsruUP1znh$y&Yu`s zk6FNB=k97uQP5Hhou8;Yt(L34G#9rv=Vm+>cFH$1I=6G}KDT1BEaNEkaJ-`&EzMKv zD~6Fp$Q<$W4F4U9%p_*$4N49c_cMCfoSZkkfhWce7g=r?q4ox@Fsr;&r&W zVd2JoadmOGKGpVdAow2G6B>z+gqO^t>ZAQGd@1n@U)2xi!v2_J<#=o5n&tVpkIr_f z+-%njupu&KF*T<5wX5XB;mqO$?yU35@nq~mt+g8bCE`Q*#p%>)Y-#Aj@NHo>XL{>R z^w#w8e6-u;ee=P#xBVbsIDq`Jeha~u;;H1u;e)(cE|qV{&zF(ID~zS#IC3F%usT-{ zAI=N`;m}bSXGH}lFrugk`GywqtkE5|Em!h!fzra7g@e-LkJKJ;7 z)4RF3(YZ0x**TigGjeir(lap8GcnPA_Mmn0uyr-0GXA2Txx6VG1&|DRX?p7K9|YWy3Nk(K%X1^S;}{R@~yOc3#_U#>q5ojGXGhY!EB7KovQbbwcVBIa>xM`61pCECm@5B;^k(J{*0?=`vZm zT705hNQDvfo8LEAKJ122r9e-+&{&IaRSsN0z2~5nac3t{}2=U zfAY*O)<4C91Ockz{=K=X9HltO|CsE_bM&+RQ!FR|QW*yn45+kMW}Q{X86&q&=L)a@WH{r^yeKV`%SsHmW`xZOlw?$42skOJc3;xejY z&k+Bjt-u&ci|-p(S$Vm`)3u3qi#@PfwXV&R=nBZcN#8*9DFBUmBm46IVdK`2zhd*|Ach|H@(&^v$nfCmnSv(I@h>8EFnk7IhMj(gJXF3-E zVb(pB$r%`lLC=*hWsXGtFZ;3X3)&Foq>0)lo5hu@)od#ZgocL3;d-`w4iQL9_V;uF zqKKcm18G`4_d3vex>|XZ(Z)d={-y=I}rX5-Sgaw%^GTG#) zfXRiT^#td7W{O4R|9F|ch#;CQ;ROXGW^1AFxQ?QjOx!|OaT4Eh{?NhR3t2vY(&8cV z{q2QY5ET_w{Q{$z95*KY-_yLJw0Hyq0O;FysmzGFnb8=!>PLR46W%O)(a~vXhyiD6 zL;7!Brfi$A2W?ZH_&0cx!dFEi>K)cP%<8uWL)H{u1e!|7YLFBU*zb%hx%&v+fSY%aG_Xd{(Bw&S5CAg1u<>N zWj34Ko-b9JtWsidrk)^pk^Ey4XytyQB5pVg;T|nkV&}s*@;EmAt(vBx|Dr|^nEInA zcyC1A)odiYDhJC!WAyMDOog8dPo16U&NM6%yb0OvV~B|QweA>HC^&CBvRvVvz*AT3 z@6mE8E&W!x-ukh_T(_15XQ|k+Rjh~f90Blyu4W(!o5~c2H_Lp(9Z%1Mf0jw5dx*V-GT5-7l-aZfcwnzGJhW-I5&tV)G*-Ho~ z37+lg1`OUyc1kCk_q=IuulL_4IM0zVv5u zpS#IDPSTpar6)QVnT(k`v!=Ps%_;)s&0%g1CNCu_$J3pnapgoiW>2$pjv+IH>7ul8 z0SVFUj%^;xp$?5^-FjBf|77JX@jq(}`ZCd_cMwGYGN7X;e>i_y66$l+G8_dqTRsmu z)VP$PBL8+CCIFv49(D{We7Nn=FB)mgS>QswH@wJAO(Q@lXPsu^&jL>O26XI7b6umu z-6cET0CN*d%fDC$COLC46;^Ioz|oRQQ8f1Fk0A9m;7xcOYlund|F-1{Kqvn67b0^D z4gP?btNd{gRpv%|{>JM%(5HT05h$`ZXUf*Q!r8?|8}?*G(TcPtV3ks(MowdaiCr`- zK%21Y1)=dK{t`bruN+}-E=Y|I?~-%HcVI$BMcgFUudN;BbU4|Add*T5ylwUUoN-tF_nCU& z|B~hH`%lvrH_@?m(VKfTZt{2+A`>Bhi{Hu_f_&dNu{M&Rct-MDqmf5{YKAHS16im(U zXxJb$lf6O=3~L0 z2C0=zxc-qZ@-@^ozUeVsesMVsN|Yn%TY&=rk-CE4(`qQMl4=Ord{q4EY?NKr`%r@bhB&Wc7C&R z;==w_{G}hYAo_^d5610BRTX@)+Gx$ksSQQTQ8_vMEfT~Doq?tpwS)K41IKCk5geYB z6#LTEWbV-xDRNwQvmVDQE%an#CV(RtK+BuaAoqtg-=TtngLmFvF6|gb^TlsdBn}UAg29Jbzi2d6fL#oBQe17THB5oa3I`e~wDZwXp%%bpwr^&Yi zRRf(-1+h1m5a##u7^dzL)Xn25=%D0M7-JLr) z+rfLdil7)}kcKE7u{@ggI)tWVP%$SA%8H%frY9oE z*Ezw}A?VuHIw*3?8=Biy?6A#*oz7y~?0c7%cZOU`VaWSFtwx^%lr*gp!^V$M;+J*7 z?OPG8Qp|P=JSfd0bQVbiwETaTDC9Hf{{)hfV~v+}aA1_p4Fa!FCT$za~V3IgDI78^|e;`@fNUf5ue^Jl@SP0JANuVe9%V(o6<=mgWA;U|`gadS%fd2T4Acj7ywtF2bovy= z_Va|VPHdY0Z>T-QJeSrk#09IZS;ci*2apMR9IRHLo17_usCO^m(Fhoax_zEr?mL0Y zE~1VrFzL*2j7VmOS`VJDJJWG`J5Lz+A|1j&Gi);cO75>LlWNU^*535tRD0;vsMe3X zDP3k5q$1VjZ`ClNRfMMt>@z!N-MwE^A4P~NlQKn*SH_sKzxEG}xWn#9m^jesdhC$q zuunY>VHhpSDIyv{t5}vPcpk8fj_wa7QG{FXB9p2R+YJy^3}2uBTzBlv^-a6FXDV<8 zX`;^vRLQ`?^dWR*%YNICzGXY;lVPh#>J9_Ue2-+b6OFiZ*`E=9+Oh7qz7~qrwpr3z zSJcQ1&8!nf8tY$8dKji!3Bkx-3nAaq^*87(&#iPmbfkISXy=P`Np;}G?r&+p7Tb(S zHO>M>FB~=NbA@PddgSB`ooKXF8zi3M;e$R(xT7nwC0Z2L;Te@L_1jS zM50|KruTM^_i>_g)@ek>^rG24{#>4qTaPlsvZmRH>C_W(SnIOw&BHqDTZvxbizmfz z+tp}*fjMqF4(G7zkSqW_$is|H`NfMf|Jp*#a%{~0QGkw5t7-nQQ@EKyqQ8|nepc(C z`yH$I*HYkY{#xxxV=yq3V=t-Z8h|pLqYhS&uC|<5Xq~e@>p|IUp0aVx^|)+qSogjt zmcl?YSb}Ii^AOci_2NZZ*v4*EU80A#o{X5WiFXvf0?;H9Wv--Mw~PNln=OtX@HPCa zav4*>IU=+MJi*WHZqH&FkPM?mz8-`6|V{ikqH&##izlxJ|FkgG8 zHrtj$(w%3cfv5ul-*&h@-*u|y)hFX^h2C9) zv6D+8q>=m`IsI1^^Ed&}T?p}{giVK|ucaS+T53L+W>PVGFLp5YE5$hqMyIUHxmr~M z#915PcH}Md7uF=gJWAJ z#=yZ`@*Y>9T@xGOyFWmA9EM*#z`4?Cb!h<(!LM(nUZ9RkmqR7t`3*n0CMz$L=~Qjm z^r*4I8-|MWVqYyJU)o(Sip%8@mD}4Uw5~q*9^^zczg=7@Wwwhh8k{1+i@<%2)#F>< z;v^++_WQ=lEoD1!+}irQ&WE&zj~Dr_Gf+G4RNmpg(V7uge|d0-!%BkE?Je-)Ro8`P z`}C#meuIp>gVWr1GX=EGqF) zCvdsdshG5y)6JG_M_zqtrp3z`4^8hpr7-N-b$F`76UpoQ`>j@0|!dn*Pdl{glA30MMnjUE|V{0H$T*2V#qD4=E9=I zOE}Yt;Lx>NM9?DH>LY{{r;~BFCq8{Bd1$rWfY;mw?x`DoKDVk2I{6odL)T-?;}0*c zxQ+e84l0(!@8!IWFk9YkuZvlIHO@gY-k`aTL~AGamR9ziig_T(cmi)o;jpN2C?)`o zHbRy?J*0zINf(tMKzHj?Fu-6hXb!Zv1#JPWp~W0U{K#bZFo zX-z*I>GXJS?n>Inj{pvC12=`8? zf}AisjNbTkFbOgf{Yzh=`sJ~GCPBQmuDzHe<#LU9Kj74xg{GG}z`0?|Ts-sLZlooIC9l$QpT-M3hfQ_cWX|xh zWl6+35i4m~lsS=H2)#LMB)jswV>Qe$U5tYTbBfLnzB5n(ZiJ(uv95CsCG7|aYz#b^ zbWBNjuEJ^|CLR(2sp`XFU>4~x27f2nZO7k{0tXsW>F4J~FJIgbt$vD`13hdWD_zQd z?)sd5-zje!zhR#7kM2b6U2UoO^f~oAzha~IUtQ&?koZiP`Ij;xqcy1E?uWYEO^1b$ z)Hyn}K%G8!Q?n&qd+dgCtEcX78gFe0&ED{;6|BKzZ*jN3Nno+Fza{mAUxfJr3zJG_ zbZh3>tiT*fy7`g_O@t8Jn!NiG51J!w(jDv+7U#G{HX1U=F|nbIs#qGUT7aw~QW)sja=6Z`wFUmG;;}dm@gzw>Ipy_%=prNBh9>bsOs%t#YC- z-KrVMX^!{Ch38F)|1jfKp?V;wr7DJ5@ZVX9zr(-3E6w-;!`vZ;y=gn<)t!7BuH}ID zgN0#k6CX-7qtg|(8E7VAaro(rm7zZbM%X0w7!Pyb zs}^tSQw*GTXi*tQ7M#e$3G6}AfsS@U@kK-7ZSjF+SQ;GmM9q4z{m2{BO~@ydx}r-wXJR55^T+D43G#oUDG=^#efOvH|h^k)-fkruEHG~xCk7WfcY(| zi6SW70%@2T?~G;L4BqJHhjMqA?n&SN76e$5^NmU0$iO1;enCC*pT_Tws+nZkl|(W$ zfgtF&1m>8a!jbgigi&JI85{6%|8;EU?c0NWW0?Z!RG>Y;N0WXN%CEXX)hry^u#PiwwstxT`AK0Z^I5gC5#63ti0%6 zsP5hlHGI+I#gG0M-+bJ=z6R1U`&i*Vx``)VblTe3sCmWS+$4;81|wsLV)tGxb0cQ^ zj0&%yD;9F2jKE0>Db3qb^(E{N8_6d`_=!Otq(YbGQh7?linkYN1tQy81!XK2uJrA>!e9=yN?21=4wxou=VM##4)` zKlI5X;vLvocjKrQm18HKj+~P_!cld~J0tYu3DcYVJlza~+?;LW1wS{nos_%5(9AdA2TWMu%ch z<=F-Nt4^1y&uFGI@rAF57sJ*E(0|s>qqWcXf6NyO7(oiJ6Xr$LhEVh|*tee1P~o1> zH0DzdO~Vh5WxaPmKZW31emYG>vCXo$w7oGMU+Kt@lg(lY=)2V;>*uJNTH+Jq7{zs^ zs3+@lJ}9xx-eN`ra#4y5+|_Pk4X+i4l?DWg-TTufo9eP%M?JZYwyIZFB=@t9(>(3y z&Dz>1#6bCmXe!;LaUya%3+<8*f1k&AHtA$yHD>sayl@1%e zr>wW)eoCG&M?(cGROl+gV5Wvq7JN3lskMXqSq?rR6EgYs91Hs4Vz6fy1~M`R@R2)m zgo$g4*PjbFR#UreioVM+?KU4v>ZpiXm9oEQ=Mh|a@O+vMN+$j@@Mjz$fWfdIQqA^9 z9%21AGCWB+IkBm1-U*saem}g^rE0fxcC%emH24L*&M;=Pb9`|Y(WOaTQHRn;XbUZ4 z9%N7QFoZ#sOx`90G?jxyT|jScQ;QN2vdf(Ag>AUJ1LO^b%nu5<_8cR|9~(EU%2WCyf4(HA?uqu>NMl1#X-q@%su%xGrD z{6EMdZk$8VWeS9ZL7b8xzewWFNpv|cnW^6nW{e_jNhmQWDRszX>VHhQ^?=6&@xP{o z#gRNmRnE2OwweS15=j)NdBRbZqyJ=d-nziKEWOkhe}=AN{oWkCujW_IGopx z{+8LOUMn2Su<&*@;O=S}VHf(l4SK)A10%<`g1fZ1vjtg6)DuRICx6yFi*YG>mXVhd zsXb*9gD~?77r2&rAi%3>AYiRRsq2Bb<9b!msd*-cl0MAogTmqBVRawkrQ)MM0?n5E z^{4^N{rMQyd5Op+Y1wFCId zzsBmm(Q<58+&59DAAKRhHjJ=CfBhT z6=vg0YnWkv!;Vm|N93zXvRkY;7xaAWxj4$=5d~U2!b@t`BZWj-Jm7E z>oaxAXM}lRGRotAJ68S?p|jMfbeB21GXjUNhP*w2!YIffsd zWHl?4AQ^$aFZ(S!%9;B8gH(tKSYjLO8wENGL zT)OynZYZ8mDxHqDYLneoOy4dJ-uPmZjh6IxCa`pY!F9fuGv?2;@PT!krl|}S4rQf= zFYWhetPYuQ;gCstQ5^Hai-O8-6bhbY5j94q@Wet%2KhET7t#_U&F0M$*I%^a{W=KE z2;H8rQxu1UcI4~z)q(+CRbS3M3kf~!Gs`=Bs~5L#(ayc19c3dA4|6B{1i!O#RF}h} zOb7^|!9PX3B7cV;S{B=8ur<3ATl~THaZ1MG3j-ZWG)QRO3o7%0-ZEXd#!tA5_a?#= z#j)S2oy59rwc(*^5%6|^0{?yTTn&CNdBsUPX1eRynk#QD0;)k04my;CYt%73hA3th z3>)3>*lVRLz3yNrBL7-zx8zK0yWjzC*wcZh3H%w>EC!!Q;PH5VP|TkZ*KfeVvz9{^ zL(A)O-3n?){*fa*orPQ^Pb3_1-$ITsOorUL?hFiNSGntfx#K=P3uuh5EchWEF?R(T zDgC?bFVVHlU*obXkZEP`Ml%(h5yWksEnq|-qq>>lckR+z&&AcXJ#4co{0>Qa2hK^& z>WoCIEh20eVHhcnj_|Z8PQzXoq`iw?Q@PD5X%|tuwaR(!kC9C#wRY`BQ|eXs!zmQ7 z**wxHj?XKQ%4aL9lc}d2jI@?HG8phHB5IUtl)JTCv})Lv3^uyO^WWb4zxeZtt<`cz zgV(6qU>@^Q@pr&icXWuK>qZs?9!?W&n3IZbrwmupf) z;-Pbd!V_6<)$Y$)l^{P1Q=8{$4f&9553$nv@?hY?=Tj}Sk+kuFE-3NEMlcVW)>{LE z5Y2d`(=#~MtFdkJ4Kj2-jCoT?Cw%pxN%)+(p9ZWvXJ|I|e6P0ktNR9a1+i*=>J#_F zg6|V<@j}OWwk35MBU@9p4SAHbOv%mJGNd=xrNq9+dx!yacS9Z9Ou@KEHBTKp%mMp{ z3)OThlw3yWc+cV0G1KJ@t?#5H55Fu%#saFuZ9WFZb6=0q-$B=ZSrJ6EcRmRe+@QXC z6TD760(Fi_;)4G?cFF0B4+Lv5)*1-7&srU8UpujX+BJFF3U~x|BP0}cJUOwyIP%45 z2Xa39(OEN1W3;sw29KM|TAEyrs-@`!f9&@{F;Y=JSQsJs5|MztQi$<x?<4&)%@s z-eD3PN_iRKCTH~#YKZChv0x(Hq7|lE542j<6mHisZy%=mxWqOV>qJel9hessD3FTw9Oit&aUV1 zn|2z^Qabga!?AYlgtx~e8X{hne_GmPm^txjZWnm!{FCCUfPm2qRShWL6!;k~thV7P0xN9K)Qn7#ON!*Ric8BK35E@WlvHz#t0?TA0Q$|l@x#4I15 zM&W_0yC~A7P&T5o`KISKs(I!1DFvGe=VKxp@zfKmGI`3=^WBwtRfSB|8I!&aHuLXn z8Lpl2VZ7&g#{Nc8xDIfp2%L;*5dDnUsE zkEGFpmYV?UIZGD+hB^}_{Js3?mA&PHF||t4KmziZ5rj}7r2cV1sm0e8qDpO5tlnuM zP+01O=8kKK`t3>gxqeNjU#-lDOQ?NBz0sn))&JD2tN)IA1k%g6j+uHJl2Zl^K6rqb z#FRpaYn1&}{z>+tq~8VV$nh)a%nyH}|)6coMTwSce5a1H{ZD=VfHQY2K7M1RPYT_6$gW zk9#Sk^*4_Omi(}!%NN+{juTq*8Qh3~J7f=XFTEdU8wzOm)$Vwg#w*;^?ADd|*`9Wo z;GEuK+U8I@amT_w-g87W8ckI@ww}r2JyFdV?L-zW2sx=G2ueP}K9JJ-d7_T?D`-8F z)K1K_4%JLgl%euKNIrS_e5d|pczt+NSM^;u;KJYB2P@&s5t~u{a6NHQ2 zE2m$;UNBMfmtSt(B5l?>;JKyN7LDHsP27>=)nv^TRjFu+&gO%IB3R~Rq{F8Gl-Am_ zPQ@bS_m(spuvaW2M23I&3Yo2vUd-Q<5N${~WnUqlmmX&2IEj~)-(YswQ-H~Jwto$5 zSW+Bm@>#*DSanw4s(s>r$3!w+FV2cYQ@@iYYx0Va8|OOVdZ5HXHkd|60(V)UUfHmk zc*$24ihQlt@0y&l7X5IBiN%gsHmxP^O#tHyBDHMY{$AE;b@mloOU}xRDf{(}-zd$V zmf!0ub+#ATPcy31^m<`x<%78`Rwdlll*K%tw@W`+F*gqmIz9rV)+F)ZY!j7(o`&4j za9{1o=F;bY(;JW)I6^W0d|ZUU(gtJUuvM+a|QSTU*HP-n&! z=hPJ;fu-AJ<(j=hc$1U6xKuZdhZnbvWsj+;LOak<3_n~y@c?!CN7q-Y_XaRs$LJFG zf>Hsvq(a~_lw_~kA(^P%8bwWlmPZtKAm1?V> zP#&3N9p+OH{p&<1Q4ZJDw+$JhI-T?^7!Z%#V_t^TGfZRgcH8g;w0Sbg)hgCtVpY-j z6;M{IdYcj<;@>!csNdM_gi5x-{nIrwHR8JFV$7R5qjGOpb-Q9vanRJ;3{sBEYL$kz(i0r*j`1YIzK15fG7T)Jg&3c^M z0>>io{UJtV^>>$f@r$14d`rlN26dcL3B9t)&pn0d<;sE7%g*S|sz?d5^^avE@tFEn zig`VO$>JP+x9}|UAxmD%Fkw5-AJxqDO(Yn0e%H~B0zh6^bL2s#GII7i=J0&l&1-e8 zFR>qDQJ2+kSI<~%^dF!Ov6Dab--yZ{_KwhTPOgB!vAe#t^J_$8BFDmnsm{(|bf3RhJCp8$cE~ z0DK4_tS^f1a632*A?EqWplP6a4wUsA-Se}nc2Q_>^LwY3L&NgP_})dLFz-qm7_Mln z7{afWCRHLTA7Z3rF7f>&L1fN>i$!IxT1bc+*W6xN3jMW2EfS^2Sj6|qmn6BJIJOiH z*!V*m2NXA36EC*Wbu9Rg7|>cq&1OQRXIGnX1@E7$c`r4LM^2$TX(sdR{8SP5JJVfX zs;)0u%K$SMKIZJ^Ukzci0yM;4I$SOByWV8`VJ%GoMh^XXLqB)K#gB}+hf262U#pvQ z*Ae-I$29S*D}GUnIo3SXT)*`#RCVa@Y>tRCyza~WD<>{yclRd+nP$K*_`&Tgx9`+0 z!lCRb5>l0Yqh{|s1ni8(HtWhaHSEb{Sy4QlHuII2OHfSB7qnIHvUXtkV)9D-qPlw6 zYRIuh%d01p7+&I`K=AgGO$%;v|MKSy$^lQ=TX|xbxRo^#(a1AyLJS|&!Dw@OCB-W| z!~?$TF`MtSmH6lUVNj4c4Dgz-N_IQ)$U2&f=alyZyxi$PdO#s70^B)DDc6s zk7&IwYabyFozC=@t~6>|vvUStkht8LaKafUyFAfK=7p*3R$-EbLYU15S`rLK~*gSqtW0+B!Y_D2S>&b#=%wcXEDN+wd+rfh?zkN0e*qM`8-#i0r>g% z+p<<*huM%6b9w-EF`Gj!%a10+JB%pK86wFyaU#hTU0Z5}cBfXzDxPFYTtu#WlOPM1 z{TIQz)#l7f^>?LyQbq4 zG8sj26P^;+=b6=9AMMue9DQpsW6YL;<#pfFXlGJQJ;n4CLG^Y3rlSa=*?E}tT`%>{ zQ)bKEa&C{!=aD5FYP`$~&H3GHNn%uxO%YD5YhiX(0h0jt112P&o}nM<)=2<9{U<@-|c@V2O;s&k09B&miONij3@CK+xIO5amrAQ3(}ANN}#3&HQO zt6jS>taLCkZFJ*wTk+(M`L7_AM``@e)%n@2s2_KY?tMfw_oyDL@V#;wqu$`e0xC;2 z_d_a?Uq|v0Y!9y8F!=N6Vl7iP#C+0!ui(8pY&`IdaUzI2=UE_U z4YwN7;rEZSa?|z#S4tZvK)NYh86dY?P6TvH&>2?BIF$I9>f zwn2k^dW}h~O6RR}L{wU&u9-2((Hds)k~#b5XS;W$RT9PK6E$0`oL^8bBAnQ1DW_aC z)Y8dMskao#eD_Is7{oJ@LfD~0{j(qVOvAQNb(!c@r&g&S9iKk*tFZ{AA~<$02I=wV zh=C~^c@r9!JI-wO^{fJ4{1_odvf;CIZFCZwQaINluo5Ui@E*24cwon>!mLwhQPvWi zZ~OO)$?}U&$kmB4n9M*)>P=}K)#&=z4{bo%O_83g6FJbGm>}96>2RKrbF9~~?fdgu z6cVqNd3km28igw#kwYnc%6Y#N$49N(Nni3y1OePmHhr^A8lT0w9>2ifdBdVW90OJ3 ztcHE8xQlZeuPB>VnM>G!8%<``wi&toLVDfVxVyG>e?VX7k?b@zKED7{BANCE{rm+_ zTzvcvle)5U5PkRSY$LvOo?H%}xRjKW3a9rY!)HeDV%4rnxEv844rxbTNQ)e~*72 zcNaS`c-cO@yDZ{rVo^Iau9p^c7H&aGInA>bsqDtZwt3vHl&zZxTIoQtdgtZinfaxL z_|m`Kzq>Z5pU^`ny^~|rMi5U>Lk&afppKm#%J5wjC6B)+hX1gstE(2Ls5~!L^wzc zv4`A=9ite3o@$~NhuMqZC`PZ!bpJnmy;W3OVf*ddmf}|2y|@*MYk?qz;slrC?k<5+ z+=~}4P%ObAxO;JTcXx-7!}tBiK4YA5_TCp+BUiat>&<%J=b67bUkMn{yUxSmb?pL@ zxF6|pXqmCw)s)fy=A)+SX8;OIMqeD~I3#7hYW(RhGm=`CT`94_Y4UqX@ikKTYS90; zU$jk6H>%-Q_Z4UKW}x-YJhmCs+I;+{SiAsh^l#X51N;P=-5)e)RMlOS{}TXG2!BTnJsds5~&OZw55{X2ju`-X|1`eEgRkv6ng~({htO z)A3xa)bB9$TDa%{jS4&rI|o0=wU^3M@ENVNvITgbBIV6T#DBah8z088)&1dwlbcD7 zbd;^r9;}>%w3a8b+BxR%P>g0lH67pd+MRu!;!aQ;^e`$O&^*Xd&2Qn}R?nHgvp5=| zc=26u{`YsyAMd9dh1)tQ-YT{h-Zwe+MZMYfmU^@4=rHqetu@*_1p8RM%&leC7z*GI z&x(3*6n%R#hWk&Fzi70)9i=Ya>rK9z90NRSJ)(>pOLBo>*hI&a?Xi=i30(eRnY{d7 z<{~xYoiyv_)cQ96Rvs}D`>e01U2osLLVYek0WB;~c2s6}Ec;6&4e8|KrMvi@AW-Cg znHK)vQuP1%@_{EX9Lt$FJw3Fuoc~fYlF1ZGJ6OrT(BOmh_gi{-lzPwc0!(mV)qR** zAY%VRT+-8I{B#M%0u>1B^F2T|;%DMP^w0d8d{SiB`tO#3961qWnH=%jJ|q-LJ^}h+ zxTeYkSR^`3qidndXJdJ$am4y!I?+QEp(c-Xq2G(@h;^tO0>e_?NENhqo4S2f?%V|q zh|;s*y^1QyD1u5lYGo*4Vj3Y*6!8}|-+DsQ%ML-KiDGkti*(jzq-yjolM9aG{d>Mp zXYHZ6WD0=Cty1Pp51a0E-UarbRGgA6HGjV9%UT?yv5DiDF=bg1?jmvO*0=JP)qvog zuU+|tU4NRGkRff?ga#7tC8hu${=(enE1cxy-A*QPPJ9cf?VYq*b8Y*7!9q|_7d5u* z4(N60`wBLFr{vS{AA7?O*=rCFa#%&Qfe_P)a0Pc;o@ZQ0{5gb zbmtqubo1EgPepk?50-({Mz;R5{hp!zc(8n1T`b-C^)OE=-Sa|gMm&9dRir;CDS`hDVmnH%YA|Dpr7ZQS(LZaH?yP;Z^Qj(^EuI{33AgR}K^- z1HGVzmi$o`2TRbP?LTCr5!i|8-rLS_cGv3R>$?$IYCb+fJVqrq5)ryl2pPYF+X-^w zfBb$jF{C@-OW56-=@{h`6LGm@jNEeVEBQB2qd6O~Th`2tN3wg9 z%gIfg?ox#S3zQsXs|0i=C{H??z<=ecOaavwEp%Kqk)C^himzL0^iDR_xjqW6I`OoJ zx03N~L{1n(m1PJ=DF%8k@~*6=s_?*^nbJf!zVhGE_dG7fvB(9$as0LR)d9sXE z551cD6C$g6Q@bcUo4>3gnhQ;?x{ekY4R^J@C^ zJr2X#n7hYcE?*e}nmbq1t8~aC8a}9*tY|DVd0&!Ze5)M!7xA9QKKqLgX5`?}^`h8Q zE>$cEt*SF_m-Mw0VaU_n)^j8Gv|%daPQ!#8W%fEQbJDSP)RuYrudfC*U*c3XuziMyN6?+Nyt z*N-Zks^s;^HugV=V<05>ZXE{N4~RP~s_kjDG8~lkVB|!b#xDd5jbCbLq!bM%WR4ohP?V5N<>Sojf&QAH++%SgwzU_ivqOfK1i;^M!9zdfBJ z^rPvgeS`m3ykoat1CnEMW;9!&bQj{bvz*hR3>ky!d8qaoagPe42&ZpXE?y_phnyP4 z;?+pd2W~!$;H?d#re3uf^WuN7pjt+KS{c;De)`7*>rED$8tLbPfaLnRgQ&19Cpj`% z*+#11xG(c@GQ?Nf5$Wu#JK2BO!_iDzESlM$7W}$s=yAUU#SX~0U{H_(rWV%m^gX{%F&Hris{r5Sq9fbi?SCt|>xvNdbDgO&(sYUx3e{#Db&KpC zsh629rOL=Sp|}}l!O#+H*Sly&e2}vBxv{&qWhX=H(rdylUL1G7x4*0m07bMpJa!EF z-YI#NLcWuH6%M@ZhCdvfR%VI1!x|L0XFk3w_szHHC8f6?hLFWCC>ss6?JA1ifs!ZK zAXf(!nVPfJ1+B4jIf^r9Mg&jigPE2sQdO)3%kgs}v$bk{$r}IN7#Q?@V6r87-PPU^ zEOEP>1bDtp*q&P%q{GE=e4$PCZVn!tUQ5?XTU?m9w2{9&f5ppNj4VFoC}$G*NmFW^ z8twjfv}?KjYB1%Jf(PY`q}m&BQ|bsVzJ+J_a9&1p6uVqm7wqzA!qyJv%S8|vM!cz9 z`wy^>bbE>mYO;fG2|66qm(Kb5Emro2d%bQMVIN3V-^QoZ>uJzA-q4ob3oNk>D*xXh z3yY5*oMq7%qEG2LSMB5EEZ-ANH8A*ShqXwiB8Pf+JS@!nIMAKMzfAqxFL(+x-2;nn z{$coa(WoQMi_BlqGpZh{o~6p@;KsoHXzN0>KCcCdH@#kYT{?t^!~|JX@p4(*1YcEs z3}1*?m>1W{7*A=Wt&C=u^@M@Udv zK5hIay%;EBlH1s>iJr_47oIA>Zu&5+7yUQV?bVS=QU_a_LF4tvDgjL%PfHNJSXtlk z-FF_~jwpD}H@jJ(S9@q@aZ#+u8b1ahWD-mdXxWJBi-z*%?5r-OQ`rQ2K$X(@*Hm6Lm3i z(`}fC0OIY{#Xo12fXtWEU-X+XR}BK|FGHqu*LjqiDSQYFCZj>1tp0L}m2mST0CkZA zVb!RP89NLmWYGL89#$dDghNIEDy3EFyZ~SSwa7k`lIAc)6gQGxj6yns@a5s3-?m?J z5ZzvDOmSX1x^GS8=8&YP^jE>nv;Jk-oBCf6)gX}&De(HBJvExCB@8zR(|G%IEQPj6 zo1{3O)1S*TPt53sv1(I%ZeNm9yes$5UKPD|Gx7jFDi3;KaWT^?pwep&sjkL_XjOQ; z7Tj@wRJzx|^2^Iz`_@1_-L69oXtlJ9#{P#E$DovsRk3-gvCEM_J)9LM=r=BfZ4a^M zHcnZ303)b4UJo4k(PjioYnrrm0&8E~U&JJu!|LudFKQ5~j0Qd8r~C(U-}9*V>Re+=fC2>Xp{G_Jm@qX=eKEHm01&qqWExlbJ-aV7z7v^{y z9#mcTa2V#V5sXk3en1#mt)?zuLix)o$1}Fu046N>*+%K4tNgWVp0f9e=?w3zGJF`t z@Ge*Br42DE@3VfY_~~<@cODSsG$8YZc$VXB>ltYbN4Z=A*h*P+kNz-k#P4yNOz=bg z8P#U%EJkR2t9cvJ;gxyznDNS#(;W&dt@b4vfIK9;`oNLZOOstCW&Rj2P;j9{q{@kawhSaG2GqSqd~hDE znvw=&KV-){kPFA9x4#IN>j4sQq0BJeV8H+(l|!9ij_fWP$nS!e@&01bhN+0r8>3Vs z+D%!67=yS+8U!3#POC=4>LuXvx8Q4E)C~mpjTm~H1aoq3x6eYcI;v06>CxxTcZa4o z^hv5iw${=Drq*LMnS1_8wRnbq(7o9D0qfVMI07Ulul_26s$@?+Zfx-c@BKUyJmZN% zIGv>2R~Gj-%@24IYE39D*E#;*p^)%ozYCQ<#{|7*UVb95$uqF%qR_e*kVMp7SfwsTN^UIbej3(9H2$^~1L?y*TbB1g9&suqJU1 zEQq=~M!)`pq`q2sOV-l)PN=79xtLa((ioNzR=2~bgrJ{q^aRvah%5@>Y%*;MB(&c& z_$0sl?tcudFfrFRkz3F-`W&$|u+mBSWn0z;Fw8>BIqt?{&uX>u%2oVZVmQ^^{+)BG zHPo;JCoGaaeGVNxi|_bR?G>twg=auwI`AYaF%xW^x@cPagDlwlYMq(GXLGy<{T6_;X$ zsF3yOhV6cQLCe;!BksOF+d9WLDRx~y5-KqC^h=%)!U<<@9@Xtp$RITS#|^i&+$6)* z`6S^_-#|;7zwjb0lj6FxrF(D~<}v_L>H5&jJ=n_fp{n#h1xp#vcn)7`9!O`h z4nxMuFBKx}mceqCUYzLL5UeP#N{jd}7(MJ^`uP(R6nW4kwcD#P+PmlWvydx^zi57r z^RV7~N>~GVjtzN5$(O)$0dJgrK_{jJ4KB-Mz(R(3Of`|18F#|AuXSf3FQvGJb~En& z@^7f$3K?(bDJ$(fZ+m+B&dAtB+(_5^hq>P;SIVp1G7tSR|2Ngr!SY@FSM2XLHZ4Ry z5A(9LVLKAo8mHm{z zW5>KTv3uAv<^j0!aXLF$_p=&6OkFX4tVF+b(e7%ID@2{Tiw4dIj8}SHFmR6@#J(6q zOPib@|1)vEx!E%*h#a#~sNC(g%ebKod=)Np;}|xZb*Z0SRm%WBChaKjRhN{2(-u7I zhGZS~?Btgp5Kjyr;57Z4SNRA>4_hR^MV8MUT&0h!gPwLAP5*`d=vAUNUB|l5S3E{} zmMm9LGAImlVv>KgZ1IFhg=AE*v96iapEVeL-=tn~z1g0l`mUJG;h=_IvY9VM_VObJ zF}>bEN)JEbj4G~nJDUSp4cZ4yXuaP~cfu zCPUapM&-eK`x-fd8a~V}EKEjE?{oe6b4Bi$3eJ#~$6}p(`-FOw{$J@&Hm4^Rgjf%x zwxEBM$Mai+swG`<>%melbZfyLq!AM(tywF@$$agqi*7gUAK%h3M0>1Cl@r+DoJ3}Y zO^f9|qj>nW_Dgl(#@_qB`dXx(oyxX9wXI!cDYv6*`O4&3PEucgBRx)|7=QWq(=U@v zrS<6@c-AlEb(mVr&g`cOWZNv)H(1^ol93}1{U(>#fd8n;pqhK#3 z^Lwy6KSs|RRQy_IwbOs75Cw$f*=q;~lbHy+4p@3bbreqH&wHV`w%te7Q!C@7>NG?x zv;D`hW31m+Hj&*GPrYZ`a^;u2Z+Sl}j0L{~`_kg>G(*k=&IqtP>E(WDf0PFwS1zU%_c9~4ImafRs`zdmgi77E1^cUSa|Zv7p0v9Nzf z>Bh^k03Oc4zrHpbt+Z|#)G*S{sTGKY0x!f#?g&^YfEG7F9}Um-hBBIHHyPz3vjc>PkZCwhGR2hs+brUr?w+`pDuCJwsT|HIcj7FH-B{u0L< ztN0z`WsrHyau(qK4)6DG*Awo;Z<#W;p&*xczRQYbA3B_v1I-WTbl*Emx>e6=+u_Y7U1JP?Af-VH zPc`vSh_R&^P@}-5zBbS4Qb(rb&uG1;cQWvGOEv8gq-Xi^Xom64nA$BKe!}JD!>Ac` zY=6Hl=7SjV9lG0X-(aVc%2=s;d8}FKo>dX=eoB%k_jb8w`@aEF|4F{uvy_vQ!()Fe zU;Wk42Pu^Prp82@%0?C+HEomgDw3b_zZbP=WWs5GRwHT;Z`m2TOEGp-Azq?(9{7H( zcpQ~2+C(ih=~vM_G4vYh1Kuxu-gnp@ih7gv?xX8C@7#EK0LvrUXoSu7$C_~X7}GUX za^!SU=PIX9naEFqv+}#xV>-d+`Y5N*%aeGyGfKzTa~X-w{^v$VS<5qA_zn+20FO&& z8ar|AUDHxqG0lM%gHJ*McX-NlP{^pu9V2c`aZkgG?(QSX3$^{>Y*3CYG>5%=5&rF* z3H7~v$7eMaYinjc`^DhL$I#8}20dZ{6t$!x+OV0jCLJz|9cRTp(*eY z8%Ur9X+a_;C5=t5@pW3ST+#y)`12Gw4bXmP;_RzR)DnG1{jbK}jPoPI;R_oWrE{?e z%EWX-sgQB+7AiRw4l~I8&|UQzlAv4vMD=_0=@hxN;sJq+p86Gq;W19C0MW+6V%fZenB-!!L9MPu z$e#1#fN@ebi%gjU$hhvbIpA%X)Kv7vLegukDa8hU*qY#Xzk6(aH+^alag;jJh$b;m zxkfFbN>nvXbSeWgXUB-Io*5!K%BHpALKG{P6N}vMQ5V23o@Y2E0YuBY@ma7AqAEzr z#i^p4#D|ZM;tGCEGb&4Hj&&yof08HphfPNwnefujsPMkPE7${n;@7jsABWktK>?XT zzh&dd$QJ~6`cM@eV<0CjM7L;QaE!b-hMF=Kwf$%JKV<@M<{M^m7d!=TXI_iwXm`tL zV1D1jG1DgIRTwl-K}wxSJ+lW;h5n?AzX2b=KJ?bdBA!o=DDS`(4Y62~yYC z?q-3dQMEv=&CDxQ^2(i{X-54%FjXJkCY(+>fnij%&i)eElR*npJD+Zj;wm=abxDa1 z17tXK6$;q0YO-Jlgd%c2k=B4Hlx1)KS^}2ca>A*n6?ab&)0+Dn1ED9?6++Nv?hFR< zYKm0A(dE%EswdXx$1+(1nzE5{e1+|@-cFfSZq}h9kdc`mr@Tf6ZNc|1|ETAY{t;LN zvnh!CjRh6_ZcO|{l2&73GW=mj$ea>y@4^!>-mo^Wg-B?D6R`PKFILe2(#g#&ycnI+ z>0;Ga=!mZV^)+ zp9^LZukTKoHuB0wqERiG_5++V^tjG+j5Mad9v0coHnRoYaUU!Sa2^<(Btj6F)26tz zwRWkEXq&gK;|Vfnr^;jTrg*dwZLkj=4r%i1R^) zj=*-fa`&>V>^_1z?V4B2w36HAt6Samb8fRvs_9lWw$pyPmf})$1I?Z3Cc?iyvS<6K z0V)ZgbCeYYS-3zF-_6p;*aqKWum^f>rZFx_1nC2qpt>WF!Lgf z(o>+|@`Fdi-O1mx?IIKu6?T(fBQiW>2oBA{{WOj30t4?GX0jJU9NUCX*-o03HBDa= zhD-;(07d>%RS;ctUWhgdsGk~r!H>RzE4~W3p>uCMlU1zdG@>a>WDTL=BF~FfQIy^N zG+d)@7S4Jt9=if)ZEGQDI|i3;N0KXU{dStu-KY!KKyrsniYbUhQYseh)zK_Yo2YlG#ca{@dgeooW1O*-U8(F$FBzzVre z+!sfZS9V9|JqwE}+5}0>x0w7Pe=NO3B2OmzV3WX)xSbg3v=j8`_i6q|j+ zSEcIGdBo_v(9>jH=hLUxDc5?3-2rA{xQ!0#h?$8Pq7%lT02-zR4>yA>d}zG4!4 zW>MO*cxxRP21ttZE zh(v5yBj{oc%V5G0R1Nk>U-p`imHwK7ou4N{cL>KYnAqA=bJBo&?l|~(d0%6p>d3Hk z(Eqd!6t}YH-2>%rDLq;=84|H2K*(R!dtAvy&VGo6$C<@1)va$xDGy)5ek7gyFImPs zWsZ@0MBSy)EVtjsp-~x@lgTpR&f1)b)p@qwgJQE2E6&9Ejqs$}wIa)-30jqonNMxK zeGOJBB5vzwl!@za?h*i9Qo*4nRIY`zKi<4Uq5l70DBpUj^dUKyLTv~Rl>Q1@iARnKs!Bzd-xD|Vbbz&Rp(V!@}MO|UcK68;z zLdBwD=8j0B0g@u}ob5!8r;mlO@+4<^o?ZpzNyaIbyEHrTZ>RE~QYYeLxF}c#R=K4| znJOtOq(^Qoi&%zU%k=?1`)h6ma{;C1LxUQ7mq6D7LiijSM1}xlJLFB->akS#*Uf35 zZ3GsZ5!9J$@Hm1#gaEXny`7*CsyY;EfBi7>%JIXy?RM^E)@F5`_Qi40urM24$|D&Y zaK$iZ7NPD@9u8}Tup-$8mV;V$f$j2Ib>Hh^gP5(g$p-AZO#zp6IRWVmBHv^iy8 zJmpOF?qcpJOe^M`mkNVBq;5wnG+RY;DQ=6%kzx^@l6u@C(0QwGVXx3{%qJo^%p@d~ zl$6wOCiL(~uc^z6Z>ErunT)*p!)WNp6YgT_eP`T#&@~9N`Q7`fpHeHKN^=FK&&Gj$ ziM*O+g(0VIhh|0{&C<=ckK#dnXX?>>+)vi);TKI-PIcUVXO0`@SoXT*t;yxTB)v5E zRcV9Z>h$=VM{caAxfC_X4ziw~hA3Xb-H$W*gzkvJ5_Ga90ZJ9GduZkpAKw!2A=|SJ z{~cco0mQEc2Jbm?Z8>OzawqAXm#Gl+w=E{H)!d4H#K#okw&b&-=@p zca9wz=pl&Uy~p|tZKr`bJLGa23L)|3z~4gXJ*D@_6~apEAMF!>l_dBm6<)i7QQFiy zj%>eNa@W8QR>1GA0-lZ6{yfL+wjS%QYSg>j{%lM=Q?XKQ-Nc_K!>&OuUS*=mWv^vI^htW897TCK>1{(%tM zY|lD0#ksLt{j+rJ6o_}uNq6p@C@?$kr&N5o!ppy|FY42c_k;nyP+^VsL;gTaCACM) zdY0D2t7#V0hm@H8s59#p)17omcZc_j&L;sHMoU{H5MPSS6h7mw;Lj9xbd^5$8PBFb z1*LEO;-Q62*62`W|y5-?}6>_Pl@(YgYYKx-$` z!dlKa^;5_C8Yi`YTO;Oiwkbk0c8XXdWfp8AM{2w*uPplah>F(PHv+$U^MU0f>v3f(lbb{d z<-I$|`Fr;)xq*TD>?e`9CQT$g4vTx;QN1;Jfd?{{w@jkkTNynuhu;#sABF~{qoOO@%0yG6d8GprH>Qe;r{fO572`1 zU+U%qs94TYZ{EKD@a2DVu`-}OI}~JT7=S-5T(-C5L7(VkrF$LnTaO;}6tqUq6?hB2 zXL6il;yV{UvX)L`*Po9P1fGvlqMtqUUbMH>F{>D_9qQX9|MZg%dnfTH%5oLVyf8{- zlc90jPGp_o>sKH=y@86=81#{A_UbiSWz8YoV@R=Sp5G82y!v>uiS-N;Y}<04Bh06| ztrZ)-y`dpak2GZH!>92u9vzEryCSc1tv zcXfM<#FUN#smH@J0!mq3g_eSe`@0`+JUvQ%8&d8p^_Tp~S76UwrCI*2QhzAkSzBAD z3%V9^w46(hEdqhS#WqlL<_A^NeE88rmU-6BE9q8X+#Twj;+ZYbnce#<^nMH?y2_LDTH}q}&Y}XjCjOMnMZ% z5?Pfsn4y;EUc5k3N-1tC%w`gLu_7g$oB~1pj4pY$7RJXhvl;|_S%|3HV9T17Y7P6Q zvif^jrLgW{+@g&2DlSZMU)!Ccq(U)g->AJ!jZ8E7v0trjJWdHzWOF#(8Msn1v)W!d zox2#?;fl_u!&^|%3ogXh?lRcfolhxPRQ=os{(yNiQnp&9yL9V~lo7fZbF)6==3l#u zYYXq1+C+Ah9BPQwDP8~76f-f++7C%A8~3wH%wmM5e-C8etNG?SqX~JbrJL3mMowEG z6>v!i#lVVtEB^W-@bEi+{z2LvaC%i~Go^L{#>hP4;>UF~c`Bzl5fj%%b8^eJphG!8T5@1_Ot7@CGC)Iq6mIZhpwvCpN`QTPS%EyLY zw&VTjo^h~+ZH}KA|6SAgPl9%)0r>l>`QZf)C1qgT4GN_H&R6+65EZQ3h;GOfqs;=LP{Zh9g^ z&@27<0Rt;}S(q+2uvblht#S<9D{=xR#3P?yR59+%^=**|4=+c|UbRS$a+v$E3-eh9 zGm}SGsZ@>tkp23tx)^j+%yJQ>xex8%xaU2QG#89d3(S~iJ^-7w_UFWXd)mc=ERXuy z+YLhKx*b2|@*PW*!q7A$TsZf9mo@Sy*F+(6@-1&G-_AV)dVBe;>|$$sSiY3alQvqM z``swTLG9OY|5G@CCditZ3!SF;y3^htOg}x(HxnMnhIoj{tlG6}!spakyiG$Kl^iZi zA19W7eqok4>tY8oU2-g3)_8StT9yUrY3}#RBJ_{3NbkVc9o=EP4~H2W8dOziBI3Tw zGhTK}K}YO=Znq`pTt>U+hlE`Hmi$i5XLh2sHjdAVtt2rREhWf0D7~YRhYh|1C1oCW z52r0zKwIXmx4w=cDOH|r#Z;hfxIOm^;>lV#n$BtGORo8GXIr~SMN!VhnZoS7&Y|W* zAr?}(_g8VPC9l)Qr-j{qSfty7`>KF z^H?W)_!AY^;<@@aP_2IW)oR&`G9H@hLD|SUqOI-OndM_&07q6ia|yIegzLnu2rGJc zk6S<}Z%v{Pja82t$F7Ly2G=i7!SX;t9}o}ib-E)kbr%WDAsuQGm7{-(-3E9c`P06? z$8y094?OO~L z(+%e@-bT3@vP~oO<+)k#4f@S~;+St;>OdkOPH~l&4%jyNMAEtPl3An`_Re$3s7bG# zBf^us+qM@C8;2C_=^W+%P|utOGxeQ}`6=Kcnk%^N$}gquKf|<21POKEqz!X<(5YRE8LWBp{LNlib=S zLo~v2sYNZQQ?6yGXRB_&?`hSCM?N^6wBX9K7J^+AK&J|q5k9?+1IOu3^5@P8tULy6KSiz|KVQ+7iO=KvHWrtxf>v%H9f2Oht-nr| z?3U_(NMHNiRloF~zEOr1+1?C-*S~zS^jDzCO4(gVFMp#8duw}V@7e4Tifwh~J$vZ^ z^4-BI&_S`EI*Pi^?f=()rV6*fno@K{lM1L`uABA~kJFVWGV)F=#Jt7c1#35JJ0|xB zfMhFH>X=LPod@v5s#X>?FH1E~;>1#Ahwp_A#0TNXU46={v#wF~^OFW{J9oR*k|}F+ z+Bb#tS*Q7Bw4+eE=O}WHnfA7piDs`R#Hdr0_faB1=Z|+yMR(@(lp`iHM$I8Be2V!F+jAS2#CzmJ-wByT-8;I->OsPMSy+iYl5_S6$< zte`8hi|*@NGmK%l?$0fTxA+ug^`lJ$&q5#>t*ezRT+>OL3-?Wu}|l zIDy-!X6EJxk4F_+GNGR@=^iz;w2BG~8QjlS4YEpg6&31hNGNFq@KGu=!Q)SmxkZ9$ z_o1fYpQM3zal74*-ycXJs%i5h6z{_IdKnzlVLXS22Zu*w7KBAM^3m?5m@mqWxLAR z)%O%zQRc#Z5vkUO34l%A+R8PL#-;p}nk}l0zhgCxhDR~~rL*yZr4okTc+QHR4R?CZ zRE`RB2->7d;_2rm4y=zO*6WO$OMd@)b}I?d8!1-ny!a@j|GOF4i-Xojw5>Y0h%k=vxe7(i?+ju685))`?vwGvpd#Zmne7>r0QOza` zBO80aTknK{pzya5EGvC816u8cXm6kV)A3H}iInO*WUgwbX&-6D#-Kf2Rx6;?QYoTs8$i2R0$R$wRWOJ0^b8YNN-PNjbUUj5*e-gI%KzLh%GFtsK z-Z2Y6Vo`2WzJs}?APM9&zUp@rcAp&vdZ92c?9Y)o6Q-{H^~`Pr73_D{WN>pR8hhzf zyxuVkO{+3|;kJYn-62!O)JOT|WKLm4U%b8t%f1(@v}d)>enPZZbUJXqL*7aAoES0Z z>C}``{p^R!*yU*A`dR9`9J>77IoAjgexvs{3qV84@CkgR$&j+^Iz}Yti=G`}Pa|oovO4AR4z=t&Oaq0|+leD-^ zl=iOM=fi~%W~-8k`zTxH9bIa>Ceu`kbn!^!-{V=@h_Rxc2C~gu9RU zzoNCz{CsV4bHmtp@b5vD1Rd7&Jox906YsD>7G4;EWNda9Jy$e>cSlUOyqvYgXl0Kh zF@cBtI~A*CmH}(JDqWz~Xs_0g3`|k9kUd@0Pa&F4l-JG5aU!NPB70T9)29&NDa3

    !=wI_COg$rZzo3zydD_>rVX$0*wUl-u0kadyq5k`fecL+F>v|}?`3;%{*NBIT`k%p6`zO-i zl_S_~ioTYXc2EW*_`t^Y66jODmdkAHKK+|L99qHO*1| zun53vfW6!Ff8Stz`7&5_$SIwICe&tGw)$-Ay|0`tk#QZxCgSW){nxa8%IN65=dq*L zi2>)l!#3zPSTbfr;191kmF%#*R%c8-%NU7@`I6^PDPiR%)=TXVdmTQlkGG@YH^(KQ z9lOFZb*g9Ka>dsuZYEc`z+Jy?cudC)<6+Xml=x-QVUW3x>yYso-xgBX-|YN~$z$dh zM=}rp_;&jl2+I{>WtZYLxqn0`-^oQs#K7Fh@nM$@HjZ9G)Il2nt|YDwK9i2^nRrFVZdky>%MLxIR_5 z{tKx1SPoQlaY43dxJ}jqQWkP=L5Al8zNKTOT2F90s&u2$hp>u6cSIDZ16lqYW~v!0TzSM0r(jSt4CJQ{1Cxcma=5VXx?2Ak~gt@I$vtjcrY@$4fPGx=hEwa z2zu6w#lVW;taFDg*_5(DzpDWDi;IBDj}m`;5}=iqBMQ3Jf=&KvKFZD7*#aa!BZwZK zH#uZ`>(|)UQY&)iE9e9K)O}-{Ig;86rf#4adnFw?i?tW>WcC5i2#O+wjJNv*L@7PR z+ezi8eg2nj4J&m>VNKfxW!`f!S2w$E?qyA83sejz9`~){`#U$M`Br%Ud8~Dmvh*{H zbLKA+>!s+|`x8=#h=`;Dp9EHOVHs}k#9oiYn8_CPU0jok=51f>%%vptzi~f2^VJhC zFbMFM0&WcDBnfIHR%9Pj`Qng#yU=l;IX~bpZWrgwn?mNZ-kK$TvE~b3>>?ite0wnp zJ{^~9sg$UXDzf=rgm$u`h2v~C$=>j3iAvwfRIW$#UYuS^YBam4o39AVYUR+~#sl4L zWaj+&-3>M-TFpjyZX|mk;)=Z&Sh@fLzkgQ{Q1>+lIMbvDmAGh3HzSDl%MsHD1}*o4 zJ>W?83vFY~*}_g{t|A+>cY^phVn@O+dZfJb;?;~o0@FYQ&Wv0d!IuZFAgQ{twp1Om zKy%3~@M;$O5OmTqPI$`6IK8(|s1iz;|}{IRWE#u&Ee z4>}9#K9cX1;iW5_1 zl546h(9R#X+@z)lJkNtiRIYZd;5i`4_r*or{Idac8k zS%-e{a8Im_^j;`4>?IV^J6MU{rq76k-TyBwIFiHI8QJ9 ziMYSYc}Kit!JmqtsX$TfFDY9vch>E<}LZn=Plp$S5pQRGa;_vVYU ziuyrx>Bck`PVb&YZJdD4x>1sVoDe>X5agbEcaWZ#zgIttg9uJ>!$hA)KC4Ira#t8x zRJ%O{>oOQ36z-UO9~6y;jin={DOL`8GDjGv;+Q=w+j#N3S2ZI@0+2-$?*}x71n%~r zB6uT32%j{A6F)Wyp1G`Utz$`hrP`k8l#ZJ=q-#gn%D#_X4EScMLH9r#B;{&UE3epT zq*m9^&t=(HF@WoOaphtnvk~-o=GiDIRj2}me#_COU4B8@YF$7c13|K95;~sZ__x1b zu@zqqZmtYwxHdarAgbq$<+e1!kI_ST1jI`gkzsG~POt&3@5pM#)ed$^-Rq3-c_^2_ zbA&zqaZOu@kl$NR=06c#N+XvN8s;bT)X)d(#1FbPFeZ=J7uNM zyqX(!H>9og|HRPeo1|+>byHjCkQ`Tk89Ui*gPv|Dv`ARKpV@LrWDMLvKnheJ=FU2d9V5yn62N7GbHJevzE^;WY!r^6viKq?^|1*qE$uyv~o8=tl~}9lF~zXd<3n zQlrQqMu8s8|3icMg_`>NjKZ$=O~SZig0hzN(k?c1Z>sw?V=bGM?^bOm&IQvAzit7uhoDJDL)NvUs#P0^y`_d_QRkpp`OBJTq*lcmc1F5|cIYU%zsdoW@YEJKdyDx*M zv^hYB(N3cZ)H-PAy(D!rLIPG`P*PDEV<>~K5f*~0M(Vq{=9})s^m&U9{ye}0kM|5X zMn5a_QlPi`HGO4WU7*Ko0eo)f;&5vN+Si-|bpZD)GKnXz{~0T@-Lk>4+kh*}heZOG zr($mMk4K=0m)nfgkh**41wGyNvtSol49%5nY@l&}J!ntIq?5+I{!oHH6oOpx5L{QL zS8+m>@io<9kVHg2Rf*ibq6dxrWknBd7GscH&B~Z>t}&o`63Hvz&(=-aAfYr;B&9@<{{OJ|)?rb1YyYSs2#A14N*hRtbf<(UEiiNlsN~R{(t-j8T|>tVA)Pan zfYLqE&CuOL{JuW>-TOU{k3Q~qzvnvFIp^}fx#m0TJ8ON`z3%wj>t0J=*Gk2S9Qm5X zl}9*xWtWj^Z~p}qruogcbtUy-;`YXPJk%OXZK`X+I{?S zqW)#OUKPdS6?sT~rIhJe`Fkvl{H0Q#q+|`jC2Zfe$6b*N7GO^_7<`X^qhOrZ?2|O9 zLfli6cNn116U*HEhMVZy1=eT538$b54Dh2eoxMgMGu=%rqQnVF+ecv0@bZK&#RSd~ z9+(Iw-*>lVS;Qw1)I3UiH(kUDXhm|m#n1I-TO(YQ_eI61rc(=@Z67T|#C4l4fh@&F zD<5JL&^Tjx9-DW(Sz4w!6w&s0TH?GamQvt#nRRyeB8Wyfvujvwuk4GzRBKvQwd(vR z--=czGu5?mT`%mg!KWzE2{BE0-S9*(2EPjhgNAL6nhnfbjiV1kwrl?Qy*RyB7V7F^}G=6RXf2wi0d@fv}+*Z-5J2$4JTyaohc_}J+wZw5g zoCfO9BIdLVH8^!}G@9(mzGNs)#ZqC>ltnWkRx@gg73_{*_i$ErZ=X$9w@Mb(#+OvQflXg zd(`X#&zN;#?(=U3uS`PA?;#7Wpl_xpRj7-LtKJltJINDVuQpHK8V!p|*h6qfvpKe_ ztPj|j+fKc{1l_mNX!gAX6&+8xPkt5ovHdR8<>}RlA~39McJ_Api<3|(r4lbj9hKFz zP3*CLXM&iGv3#}V0x|!GOEW}*2#2i_C!0lyotzSTeDnUJUJKjL&TYgTxfOB(gqK;S zU0J6D(34i;j67?4x!g)PuvQ8uz)Nowf@6SuSrTPdqqCIM=$@DwJ}07rRe8UQC)D{U zPO)f@Wu2JW?P*ZZ!Ul898fL+t?^H+K^u6?AMolM)jmvWy^4!vmk2V! z4z_B+s$g*#$pG4*vlPjeg;dt#UThSUPo6K1Y+UBGc5j*}CScA-F~~ve13_w63$AOQ ze!*o5L@$rl;TMj2qz2l`>NsURm^PU!y*7^IBzuH55_ntg6GrKhrxqW$=jfi)MeP*$ z)=ysm@8B^$K`tcl*_k-{p^uAGWY$->wONj)VkZ%3t;DyjYijg!v)^FAy-Ky>uinGk zEsd4_f;$WF9N_}otIibQZ1K+e|ZA#25UQ@*@6!fQfQ_$ev!hM%u!7r#9P<+B6rZtJ7ztR^xCnN z|MKzO0h)=zK3+?Z6N_3Bdaqv#os!58RQh}@1zEf8MYP3l(S)s8G~9$4kjxwBW5WE@ zNBMc8@^sRRqillsqd%v6yDS1+vq=pNFj1oR6MC6}on$t;wG0ZjGJl%-}keaSD)#(20(|7Jn&bPhW0R zMnRe@*{MCXj6h!+%#tM5b$wd+I%fSG(Uy2H_iQq8)}?|*{9vWB89V^Xo15J2lYiYL zUv}+sC}=Hx^CC=$r{VqO{4s(8!yJ?|DJI5+hCsM~ds4%C|Hi2)sq%i^f}ebuvms*F zaCa52zzZkuEyyaWZDFCJ*!>MswYUr9Czb!zr|Jc{XptTgyKbJnM39*cF(suNcZBIZa^&J7vvJp=C$0pv!pYl~YT_sK-*z<{O3@qcxTm zGtbc)-Fuvei1h$n+6s$@MH9M7VV5TjMQL8`+@bhrhy7vp-ZI3hA+OcP({v2%F$8WE zJ07xWb$^GZb|;+u z`HQj*CLcW7J;$BYDyyIDz6bcko3E&>;yr%CNlb~5EDGK+Y$jVUJM9i@1s&^zh!t}L zI#_PFpOwMS4LH_WV2wl+BC|>JZW`JeX{4j!!CCW4$(gX0^8FZV*!$g3(Bmtf+&dhw zZB>dxv~rqnsF7ja<3OpJz;f8EhD`PyJsC!xrpv1xRYmo5Z_H1=Hqu&38WB!%@%fZ@ zy39Oa8y7onhiMFEbiJ3Tig(%pEmKkA5PRfjUCPwi-Iui}G*O2YTo`EGKtOpt^4Y<) z&k5p;r=xqfkkD<7TcLF+#1lo!@|t?9x*1g1E2%T}ggs4gujXV1^Sj9&>LR60^E8y3 z?NRxJa-u+QMH@Dq=TwcdyaS?bZFQ_VqC8X#8U83|>%WNc!{{|*|BEPn{?z$BN*2&| zBOOUcO8{Bz#i(fixq#(v)NxlCabEL~jcf&buRLp$|3DINwbo0p zL6OTx!@THyU99Z)5?I+!G)~PQrX2U5RoojZEfX4INj86Xk(OrM%&=0AQvb;peTL8b z=i=vHAueM&3E}BG4`W0uy9u^1ec2^aJPy_=`K)3u<5Omcc^&6Cn4a^d7Zvrk_zW$6 zEixGauBBt=nR9H#rPB94ntviH@9eq=BceWzZoy=!kq&Zn*By+R62UI{Bf+|hEu4sg zw@##RN@1jN;uD*F{)vj`B#olAzr@{tA92b^ zbHy_<{0f0vw3B%5V8Ng~xTDx3UKnQvf@o)n)esb)b)-ps+|Mq*C@N}g`Zln;n z?t^`>NMQEMspz5o`DpKyN~K&Z{I2G(CD-Q8i$~2)>z`Z>H1HjU@=HHl^wPuqTn7v*zc5jS2)c8f+TM@1 z|DKk^gO|->+(UIGOq-t;PCHMRJ&jn?=|qjF@RAftp#q5ONoOzO`9z)%hTh8|uFMQW z7~V+NIrI8-1AQwz$f=I7z*u}tCnsl-(vW~rgmeG4jqT^?r87k*#0wqC6{vUJa*QZ( zjnTots|%4H8gsMUkOK9lpyxz4^FL?ScBeN9G#ruPuoO$EESf?rc<;G=0u3@(CXTxx zB$trg*7GhJWMm$w7z;5=R!(>=q$6CK9r^$H_M3LH5)(H}hLbw6=8 z^S(}ZhgTrdsmXKPMHj)Ypk_*UC8}3uoJ-G+*RXYkt<+?4Xyc46mD_dK=j&8&{<>&F zeht}~y40mYn3u*4)DjuX?6YBsLAvt_bIP9E_8z``R2J&xyKXj>4RArEiDC2mX~>ct z)rC>Zbx$wUvitzQQq3TC+istU3#>Nkg6vrm`v`kc?ZvpBy9vu>HlvjA?HqB5d8#ST zBCxoU?PuN8W=Z0MuAVE%`cah{JK8y&o@Hx1oxwG2qrpVlkP>xlMqS>Js`FFlc~lF5 zKabWm%jOMl>!`%g-TIBhYifrYh+R88+W_pgU=$|ZJZy0SVslfjJ|(~p(r12xxcA8#}Z>;q(!M$`hi zIARq28q>wWo<(^)tI@99a2*-!aYI7G!f zQ@(-wA!^@Cy0>Dis(Z0uW~+BaGp|SVKpNuGW%;ZC{?K^h9=_r6a*2EXv%um7o%y#j z?+Tg$rQ)mYZ_^* zEzptq5S*75a=;Br^a@{hPsn;UZd}e^1s*M}hL+dn$pSVR^Ug%tPoQs74ZY!PzA7%F_vOi*TVe(u;jO>tdHvZlHy$l5W)w z*)aMw@d&Kf(uEAh)3VpAt;E@FIhmN_V~o($=Ga*G&?gP@v(%1CiaGlt8I^qSX%iJP z#Bx?T&pYK-Na+*o&0`bYvhYc$+&vTgaxt# zX|l5|g&)AOJIuMQu6Biu2=yR8u-KX~s5n&pq+}E%Ahz%ED9X#(eR`rMeL}cpqU@14 z%hdp}qzhm5@Lpo^A=gc~51qZvvrF=~)$&YC>aW4qFT|Z(EwtX{8;a(}HPE5MW1+I476&F>YiB^|9%*>p?csdbrV%yGRXUWCRhJ>(no{<;4=A#h9C&LZSw4Xk=n24MMGOiz_ z2R4eb<8&ty&2>iFpSEu6r{2)FzngPdE$I-B(4rokWXEc3Mq)yuRUY5^z z@@*cpFw#=x)9Z!Z36Rd_LU}zR!*VRDIiAl*rIO{r({Klu-4AT;sC<`F@nyd?9i~GL zc*GUcuAYqP;RfajG;wg*eiDOworrTiBYaYTbacg3MWZx#IozVX#bsA%_^hW&c&@FA zCAp`yA`C2_@At&5zM}@TQIaTmdbsd7)hkR_k=ZL?VZshRNLH+?KA$7;0W27f0KGS( zS;TO`NyNLDeXQc{Uage0opDV>KZKmto=m64IlryFX(J?=baeAhl%G_RyYkS0Un*jP zpZaSGzU~1-DI@%0SI;5Q+16D^KKjGHCT{?8g-`WEVIl>k2U4%<@k-(qr&L|d`GxMD zDG7%7o@cOoI|xv;`BjBQt|_iCN^!}epgKOS=9EjLe2YCrBR$J(`^=T8l9G1%4!S#$T02fP(X@Q002e(FF8qcwKq@3}%r{XSM}sZ&(ZzsmqY&N*C3a7Z&Hs z2R$$wuSu9AVY9cs0dF%I6u#R}a6&U#bj3+p{#`KgfUUYM<-s z%ko0Q>=BC7kgL8`P3B2?#yy!D+EDpVoq@cfPVYS1S^TFsr(iHMmfFE}OsQ-R(C=YR-#gl=E11F1-?dtgbd>1wvSJwu% z<&!<;0y#kGbYi>YyzxMlV#ij3_RsQbx{?vJd5j^_{y*lgiHAr{pxrSP-j_ID%&uW9_U` ziH!7}zskDq8qaygr!VOB{;~kw^;P2Vl5R8~+}t;LN@WU@(%k6X#lQ;l)z3GVM+*x# z!U}rBT|o2RYX&tfZK$MiFUwS2n&c>t&NWJ5&sW8XJ8b<*WHmUNtEVa}t0LAbReeQW zZ`2FmPXxV|5=al(B6s3PDs*+_W;8G2f%`F@$tb0CWAJxv6_&iuW_`E4gL?i=wnc~7q;GA1BJEK!fg2Gd^5k&5S> zaC&)(zvb1UavF5jEBDG_%gnC}s)M2|NUjqjD0~}AKmy=MeX4sr$!r$*a@}e)6l_&%xNNRfjvdC@Y9&w-5?F-pC&_VEEj^Ht{?W>bAp>oVgJ+#b(aM{#F)GDi7(M<&U|#q)^w-lbQJStic5 z#*IgM85zoIFWpdt!i4ggc-f@QI~YdwxM;}H3&`VHkdWu9v}cU7kPu5uM>QyBuMA%s zlro7J?k&QIYrFB@5*0~gcEyvjU{;Wu z$bQ>68o#ezOsOYlem?DhS>G$@DyV$JQzV~dw52z8^pU1Um&9|I$C@TVST4(}I@)gP z*|(K97V$sD_Q`lzS*aW1fp|ygWA5|4$f(}_P>CiRmT-@`htEU45>oXw^R_kQHc~{k zd(@WtR8%2rPjJMP@3jO523ugTM!rs_viK>Fuf`1fd%1?xL-^`c;;up4^2*glo1vxI z{To6proCO`_5&r^`u7sz2UT1Y%A9(ME@qP_Rqv}ste5LKRO36B+p+P2EX*vBGGeuA z<~Nr6U=S{_h(SD7TUVl3R{V0|)2B?et%e=xyR^%_?JV(MhZ4J&@EOCu+JzA;SNTf? z^PN2QAmrC73$t?C7#{TL8lYAk&yAK%a4w!Nv2x>0>I+E^9;CPuDo_(&a9?|0Ftfxf z+@(csh`QY2uAQGjdSU;e(V4Aw-ZChp;?sLD(I#fBSQ-87f)`uCM6M&EM_#FFEe z$RN|lWH|1lcphhj2)aG+`Qr)7&YR!L-V)g{3NF|+8=lGRK$f(g@@rci5k{J=W1_>Zz#AIl#IwJ_?W~VTpzY_NCSVEBh1yL8bu*qwZ`$!VAOAl`)G_ zr(yfS(&s9tnrDki`7{bh2^g)3jE`qUs0;aug!)oiNf~%VW=ijhf~xygKADe$wd}y= zF}qWcrBcVG_lZ+)qg>nvFVCNiT%Na%sLFLE-f?Q(*@;4?|5q*NEL-dDGn~0e zG;~2}-SlE1aB+gW*bT+L%l{|}Y^#3mOIvN8@p!;81P&>D6mqb0>vZu5n|BC7l4{+3 z1*n$1P0jqX;N_3hrZ2k+y~Cr_1y7S$aFKzfp@+;oV_kh%NiKWlg@#o2d871x02&EB z-_M&pxoX*^R>NF_19vvV&g^u{*!KzF;2;17)=M5dQCk(585dZusZ8(WFLi@5)(0N6 zTd_>zY$@`|r?O78Pf0(l zI=?tyvG`iMz>4Tzn}p8+``AHN_cHfZU2H67D}Zel`gj}tJ#Q%C&NfAIZa!w`y;e@0 zx5l>`{o7XL9>G8?WPeP%*$0W<4;pS9{QYvE^&xg|4&_0x4*DLO6-1e~1RB&8k@}DQ zYKG3ye9|R9wH1FnD8k$>fP=6ut$O$<$E-w67M2}e&Z}x^k9r3c~*~NzZoc?RAW#LG$f%m{OdR zs)kPup)*tmU!J!2#&w4WZ*$N9NSDQPWRsaxD}qkreMS#JL}hV@#P&X$Y3m5y& zVRwm{>Tz@XI&6-4O@I)Si<^6}r{@}!WT037uE4;P2Sew@c)PUcY+*N63zyZ(%yXSV zL&-Jza_zl`ae-v|c9ZeyMb5bd)Fm856(x7x7L2jJu(XY?I9k@XECbu$ADz#Z7Lk{*`fuO2Fc$ARv}KF_g||zmV70pb3w+)Q6B4rh(li2lBcv?~(P~@^D^lFdJ4k)0t~R zw=xS(PO?KMQ!B5A;Ad-)uI6H(kB2nr7Gk(=@}B-VVMVUl ziNxf#lZVD)12*lJ=mMmK@h#_>GpQn7PG_Cv^w&gqXFt~uYmR?3T05+}3b84rr96NF z7}ktxbnE!XjtSpK7a0ZSYGnm{)lgf}Y`V9|rv?A@(wFk|<_$NqJKHz(GXy`J8quTN zzPZSwCAy?hycR0t&*$gN7GJ$CWdE{~FAX>$Cqa{Yo^&sH&=3MixQ{XoNDl z#n5knmEe3btPiXs`X>NPJhoF3dmEF6vf#=h;Ihn6hq0(Y_TV`t)nAj1VCc-4UZ&nAGoc+iU+dn#|I<6#PrrUN zS{{VO6b?286RrR$3&e%qIBwJTwG8oplsg`B;bdfHe!;!Ew?3{rJUooJj~p0SOpg#d z=5mCH{j0tnrT22GM^GHo@n2H#FaP1E-o+S3Lz~pPxyZvm+SC&X*w4LUVPUEN@0O2L z0A1jxaxdtYQu43qGfb2?SRWtER;Jrq9af8ri?e4@vi)Nu0_T{Cp$-6^LUuC&;k2UA z55P3};H+}~6Rw_%7yYDY>Psiue|L)J8ept1ifG9Ea`1oCA9@fL4ngMfyHvyf ze(`_s$x#A;7kg8S^k+NE{+&Mhs*}xTY#9)B{5zx?>E9|k6H@LWm{!~e>p2(i2c4yM3lA#hTE_m61f zZ}jZn>c2;vfI(n(mRKbCUm1iifI*17Dl_ummij;VMBfaUxXiB?Q-%M6+rNwNx8L27 z0t^BdiTS1fl|djO21aCz9kBib^Y`y}@9k9p-Y+T{`2VZvR#gB-6iRcg+W&v$L2v=^ zGDyAS`%h)%k172vFh7=T-`@iBV;TP~Fuw)n#|ZpHKmQh(AH(%q!~7PQpCIsCV1A6i zPvH8kVSWtPZw>QXV19zYZ-MzS0zZN4w}$yKT)#EUZ-My<0>1_3#|Zocu3u}I`t$Ay zFRvx1q$A&nz&Daiw@_EF``*Fu$9aMEJ~XX*6-dKFCT{7evhH7DR zA1k*CjMfRc#qjPH?q!Y(cP?JLV^44Y@TO*`H@|DWWD%Db2?FZgr4#6YAa-`$Kf1!d zr^|j30~6;Oy~N84KlzXo2vAsTBxMhN`isA5OfQkrg^3xwZ1v!3@X!9>Z=1iAU<2A) zq~_rNqMJW^i_=|t0d-S6V}ZXP<;k4x*nn#<`ZmeX$``NcURP&7ULu zH_ho)@PPI@OcwtCA$m!;I0S>keiQ^hncctpZ=lD%IygXk$tP6*A$rRS61F*AWS?yR zR>XeZi2+HVJz40;&wuf^^P*yk;V0!(P9G%o9||uS(7sG%;PQWno)GahYG?@-C-r|Q zyk*yb_JL`9|0#NLz|u`(do}&HApKl0|8HOV;>yH<|2zxee>Nk()xd8x@LLW1XX|+2 z|7~jE_tO6#So7Z=z;6%W|34nU@1_5H>HoXV^#60t{}>Yocx2Un=JUHt{05sLKbRul z`&gL3;iGo%e(>zi<5^_)#lcZb5)y9q9w`+}a`u?}d}a@BkH&w_t}?(Jh4uf;HAw?iU?w=s0dv<_+!z{kn<$r#lP$@~?8%1Y7^wd(0px zuwPh3-)-ma&m)O{#BUXkQ_|~uTEYsWd#y%F5v}Q=n<@bzBiJG8^vj&7RJea}Z!T8> zuckMA+JF03uim@UBgRAGn>rB?D3l-{@Jgf5`!GmOnqSvzai;lok`qeAx0;wj)ZKAB z?90pV!YSX;Z}Z0JEysZt*O4gMaM*D0$f%*3?H zmZz!d-RF*T6L1M>#O&_?d+r5!d3fd^M$diVM%b9vFbPWwu;NiRLs@BQMhNlUjI6AX z3MXkH#_tBVtOf+VV#wy4Uw4PdjE)itic0NzIig7?WdF>^eJRt>(b*##bz5NIs{kjP zmaVBy>1F|sw~*)(okAh?sRaAKO(vnn$I2;d`qCzb!&WSy=Ft1JF8piwrse? zXsroGg(5xls(!7j*jjgLD!vUOGCn~Wmteenu!r-{|B_<^FdxSTbm_mG`%5}gA&iKm zEX4%11zQ*^z7uAd#bA^9-m+|4=0p(C5yx{cg)I($ccpHdRpc z01e49ktM_ddJy%$=z+$Rb8rw#B|?KXbgHLmC0WUGNJNkKxpK-nruQDqM*&z>MAXol zC{Fr6L##pv5Da@o1P_17u3e6*FEuaeCsy{%?pW$cg)dd1yghYM2TgQm<9la5+aJyy zPb*=U8d3`!^1faUsUF2NkHkNB?5aH=Uk?!VS+c*H;A6EEC?AQJ7DDk$apq6Zp^(uBYgW6lcfvS|ELXuKV z?mco~Yd{BtrEC0YsR0~oH=t(4N^GTn1t!i|z`t}r>9y2U9Kylb{cjoVt6cv z##BkoCu*B3irbY&$*7kjTd@ATk|a_h0QvL^*rE8d*!~IKe>}2Hub03j$k*Ak)qx+s z<2r<#%!!W+gz!P!iK#s_@hg>J8Krta3* zgSFA5vlG-L36eoRI{RoRCUP&9V>-NVD2|)4zc)R&ZLIPB&`rJc$s9Qn-8|hfa?()a z)go`s=vd{BwSnB(=VC_0NaHsEtlX~-ZgsVK*&vRL%~9`UljV>Y3Xptl#12Y2Tc-K?KwD79bgIoqA^ zu*s5n9UaB-ScLpREDoj@dh}cfJi70VyAS}zRCZoF&QV_pd8!-`HdNpxpgWn+0-U1A z^U|RTQ^|S#gabTY&3WK+M<3x?6re_Szm_#PgO(*Vo@J_U;y~x+y#2bV?(t@mB7-z> zx9qvg7-!}#vBRsk9sY!3Pg=^|c7z#rx2OD-7dSdf?QP`S2TxYJcK1gMqpR*2BC;^8 z?i(T^rTDS?>CO*fj_0QlSy*_{(H|89o*8&<@jq80$`G`llh{Y6VA|e_EU}*-IdL$g zMJI~PSx(0-ER+aZl`=-`z`2k(OVS^i^wtq*MCr3Hp>q=C1z zcmbfs7UHdn?{|akwPQ}vE?M|g21*|LR_r$+OZ}$V&97rJs~pHJ+*ckuo4fD5_mMBl=2Cezd~o{z|p6%vtz7ZS6)?B7)Z( zy|3BN_zucAAco1U{kH@L&an34{;cD#RWbugK4E5u<5#Pmq8fuJl;Q(xr9uL4#YsoJ z2zwZ%81&_UgRNQ18@Hu6Q*V`)qdxg_bqrRTd}C!+0-5ItF^1mv;d?`@nW3E~5u#DB zFB#XZLO31=7{BOiQ{p<)5Bk>s1f1yJ=(x1;kzUK}GBOuMFQoGp| zhC?oAD-&GYFe?63Ox^vBNf67l=T5>omu9neygx@6gX8WQnyOEp{gf|Qqab>-qa$ud zj)}ofx_3kLU<{JhrX;J2sRh`UMDMNF=Q_~k4oF=krgJ#;(H-!_i8JoDLOf4dDba&e zoQv?YV~E^5q|j>(o%voh;7!^_g!qK&0-y8h*WKOz$xa8|SSf`VIagGx_*wVT7sk4{ zOJbJt&mlN-C#$C7EIV)7goy$|<;0#0Gq#WnhOfg9e0MY1y;!k71jSqtCDL-=>5P$k zY1*4sBPWwg(H%~sE5EqFel`<4Kb9;?N8UPKBhCUb?KV)sP~H+`xgfgR6Vn&ZyRt2C zHxj7Ro+i)ada`@NHn(eLV+ks7iUqUXrxlGVFsO|6r~fa{ z%gKUCy7 zHQj;P4<<7UQgh$pU7#PLvN>UfpP%VwvM6IZrOkA0PB%Gh&btbpuh*>fhmu-4T$s;Q zt$NWO9hM1a)hx(hOg;o|g_X%n$61x8Q_JdLGD^>h?C*7+mUQ^$m&j$NRZfBdphS8gf0Rb<%5Fk9&1>cqw3%sG5j6}l|{nZNR>pNSkCbgGV49_3f2|KT<;NEL? zy@lh1)Q8F0viM0nDPtZ3R2g?+1F>KL&t2@2@cHuYn0mmFn6wGZAof-anbul7jXlZP z4el91CeQYL=2QCp98pOwsGXfQ$`&2?R?F*52na@dZ_v+}4KR9o9ck}X@+|Xg5`Fdt z$>pBjgGzc$;~93$(nj%t-MK-&X@H^3F7)23VTc60+c=Vo8I}8UA10aZ+bP-Rq*n|G ze(xI;e)A2YcBp@;CDJhPtExK|drkVcc?}=QZ&a~&c9B}Fe;%}QuB+ip5_Puvj1`;~ z+R0jYBBohe6_41CvOz6B*pXkH>q$Lj&?^RydMtTNqFpk%lmq0&PB!7YGq3Bu7$xH} zH?rFKV1`21_K@eXQrx3*Q>dcWW4d^+>y=glS{owRfZkLc#T> zQ4Q3tZpC>vV--eC?QXSH^1K<@kh6BKuAGH_C)-7c!={-%0jC!n)8W4Uao&uI`iyoJ z7Yl(R6X`qe?GHYmXOp5~*TxMc#W|C|PPmzR5j+NeegNHKh$J5LPBZQf!uRQ#g}+4{ zHrp()C^?AbOAowH3sqD1iWk@lw>mCUon{`I9jPtM0L(^aiK%i7RI%4NR&1xkMIJ)r zC+v0nEc9CcSQXxm);gDhreE6DfO80mwQoQEX3mDYecrA5K2`g$0bu*DAv z8B$0d6yZ3_Tv*nf4CUy3#kG(VNpdr1ZL}hb-RH<~ZVDL>xL;p@uRoI9mygc-{Gc%1 zPfF&i_;)U}ME!UIjgeH0G_VoV=P1Rp&+7eJ8@2S%EI&AA(S}ZD(u= z{S%#ZSF5Ia8vN1Uw02g2GOhPvdzEpg=)B@rIC@qOys)QdXXbOf?s5)}7jk-tyCQA7 z7^RuqeUPsJ1l*pYZ&cx8MARd7J}$W9A}5=gayUyPWkc6JLtb_;LRJ+gkGcru84_^_ zWH=b06M(ueO@xg=_p_BDpSxF?yPKCIpUs3Ut_L~ z2CQ_KtnH$yI67F>j>%8T$o_aYcXtPJo`VVd79;6}EKS?n@P5v@LmCy&XYG00>l}S9 zCSLPV-P9eurn&9%)CZUN`4ZQ{ZCL^`WDbv0wwfbw?1l35Wh_C&T+j znK(qb0_wP<#NWB{|L(Sf`fJxI;$XAVT4sAqh6?f<1_@aUZS3zRU-hV*eA)-t1H=8j z!|pdXcI?aI=ps|$yM5yGp`6%4)C<$MW%~e{ z#G`-(bg+G{oIA8rR_Ily-W@{!7&CaN(C4P+fm@1ta>z0dxWW>++aByE)l^^@PTxUg zQyV*a#(^DtrkI;Z+>pwq%a>Jm(q6|loq*F^I+@0zq|O@p@(Cu`m`b>ulTF{}E?*cls1BjbORd!}3gXX~S z`)`_lA3D=>awIQ@CK}2uhkLkWR7|*6soRCVRPJE*lOnPea$dD1z)|e-A~@gOPxNck z^$fQik|OlVePg;Z6vi+>JQz2_$U-8smzkqSVsbiEaR!Pze?`>fum@3FViZ4ONBT=~ zp6B2I^DeGCqF?etpWtLnbK%@P`v@+mz}k0&>%YC(=P3^E z8%l0IwoX#Db+^r}QqMhd)&9BM=ldSwu09f&z@cUC0{I4~k8bQJdv8O8^sACD2kST- zCF5X#fq1{b+Cikkg)NrYDC%2$(@KlB0HVOugy?7(gTU@GjD7B72jD>a#B-#YHlzYH z&vlC9eu#GxD=P6ZVB;n;fXg_dY&(YXH?nLzXAArNu%6hNjiDAuP7M&Ag8EhVRRI>p z9Yr#4?~YX3PJ142oS&Y5Aq^8l+@$6Ns#y8aP}PMt#~v;z=nl)V7+@LD_IQyL{GARLH=NT^wCVtu}g(R_7)Jiwr;n(lWB z`#WEsUg9YZj&yS>mP>(xCGDB2PCV@6Se5I8_%Q)4&9tLCr$@+cQeRXu+K%ASYQB6} z4j&09*w_P=G?@u7GBLA&%Ngypr>yKR^~8<|x+)EV;KVA#altVS9)?rL!LBNPz8Hhc zkVw3?&m&OkanQ=#csD})Y)}u&O!`LOmk+J>feHK$hjYpd^t<1j4Wkc=2@{Xl5r-?+ zmD~Ykdk>w1Aoh(1oZHAv1$BIY1FXFHj5w^N3h?0Oo^}Ho+WdG|+x%#IFmqc)FXEai zrlT<(_*1zhvRu_}@msVWRp`msnN-7JNR{j_(JJ>56{YD7>1LBNJln2g@=emg3I^iK zkC-+9MF!FX6!4P;GEm|zY|@>uDU|>x1Mj0M)r%}pAs}2OcB7$ekN+extD~+JD)B^J zZ#ieCCs7d3;c1Rw!U>nx$<~7EO|$W8_Du8s7o`63G551vCcW|l-WC|Z-=8fPo*i6I zX-mv(>;Z&A+@UN3$3mZZx(L1QkryjX3e_|`^}@wzMibr4+3-1^jB&X;BnYLDnPQfd zClo(XCm>;KJJrWaiwYM$L}}I?x1Q*~ZqpzZu3RSh&i~>V0O-%4W2&cTznb|Jatz=e z8)affzD)Cyg{->Mh;vyT?~OK|{kCSunUlfml1GK-2R_XC;ITssf~vd?nf6l`OH%4T zvJL1p@wt~>yM1mQ`Bw;KV$E8+l9r~Olw&wlG}B+dZN+0hNmC!JI+(zg-;0HAcLLtH zeC6|#!z}9U8*1?(7X0HN>XF)`Bml9knR&sn;#=4%1=00gvUG5WKc{KGnzC1RfWgBE zTD7jalkE)$*Jp-0m74{QNd1Fo`Zj=0>MsXxMD@t4->RMsXQok_-JX}v>{AJV+*OQ^ z*2vTP0HfE3Ef5<;=Opsn)r_O$FJQ(_c^DlkNQ4Nv&V? zNIc(;sRQ+gN||;gcBICOXXg~~*v-(mov}J_m_NXMo+Mz$6YRU6^}JnU-txnCHRAnb z9nvAzR3kT*L@AhXqkDE#M^aU@&_HqWc&KifOMt{7RPbyo;#{xsQ4yIDF&WY7mC>9N zfD+yQtR|SqgE)LBle&5IjhSF_p7e@{UQty1(7!b+`^_#*%FpNIRFgQkF6UYfez^6C zbh_kQ1VTI8Rcbx1xvewd03RnHXNQnbFDtaTedl}811?!DaP-Vyl4^hcMj{x4C?iCU zt*A3muw?bNR{z*o;=>4Y1;u_;mhc8#yfeN+fLAdt`e6iEVbst^G)dIER-GyoIL)YB zCNmX>pm`q%?IZmuv8^eLI|R#dh=J$}TaaYOwgNDmwmT;~;>x<^wF&+#+;V2w&@N(d z7zHO+u=U-Ao-fPP6LETttSiX#o8w*wUgq;{Wr7*~Bo+FT20o_|RoDBD^%_vF=B$k( zM8+W&JWq<4Sk|Of7#g{WRt3F|rE^0|02V;7)ImToS%eMyW!6HdAWH7qd;>P*9w=bO zQ&zW>Cd$m^@jiQy@Aq zH#h&{n-tNv&}oA@-RCNxP&<71l97d8^mwtK8H%OvaW*efC~Cen^PEAC^M!kU=o=?k9x>2t z2Ldx)?tfyNvqn!yC)k%BDwVC2!~`-=!%$S~&$up~I}*~yN2C#Qt%o16h0OHp2qA9m z!=|f^y2REl&vZvp5L|&n;I-K>%D}|!vfilo#Z(h_;SIH*P$#5LKqmH%-vdzW9SmWj z_@l*iLVMSxBx*guI4SmAb?kUf6Keu-(YN0yCVy5W3vJmNYdE`pbu8&bt7NT!#!I1P|;tnc7p8ka# zK_oyrvhD6R;+;pX*PR!MplbTQQgglTc@kjxqBCBzOEJzKI7q*geDFiLby%n<8^cwS zi;1x|m><67H5RHYk+PXi0p@MU=Ks@()r@K)kCg5l6I|I7c{`2`K(w=%s0lb_tQrDL=Qw%8lMcpiwFyIgmzKl z=X}^LcOyAvo~H%{88N&eiF#|Ce`}M(Hx0<{8xYdSpy_;09u!3HzTgbAQ0kQ}8v>(q z!?A){a6P_LCn>i9Ixt*4@t0JOzg9}c&D1WYG-%f%_1D<9H>1=yf8IKZuS4F(!?4|+KNBVrhI zO~X)m!z?M=+x^X69cF?vGrL-}Uhi&QEr`bkk|&y0x#3h-Rtz?zIRMk0JMy zC#ZvE0>X`J_$H^T#;4)tX|e|`o{hXLVlpzhS_cJue`IFAM-NcZm%dwge_3Qtui*`_ z+!?s>1XCtx-nQxUlXSWIo05chw`7E*S~%6?LulK?sN zne^EN`=B#Gq||*TxIME~oFwLzroM1AzTq8D>vICjJnoKUhJZ?P*DY%zrh0%>rGv*G zkzrRuqGgm15c`Ph+vI1;sRSt9;ush|CF1y&OFBO4_K8eW?Oq-voR<@Fi84)x#7=f4 z>Gtc|z*Sl3PWKGYgH@v#C57zRybJJi(TFs-j&<)rncG7c&B6JwC~~ZNXVKjgx!|#u zyttuLr!U@L0Ry*=kH=yKAHP^-{&v)PyG#B3 zZBc|-%xViUqbs?~J%m1oF3%N2bNNX4_wNXh9KcWaS=sX4K)VjJ+0Mi<~rej}DZV4*^e0rT6Uwbw32 zeaj3Rp3I!ff6MmPy1fQiZ*3sLQiqb!hjT9aPMNcmzZmMZ95vtao2dffkZ*oBgkpQTDH!cEM??YSmR<>M&-$m=uTfJfz|8OeVnJ{)VO8Vd^78W=5?Zf?s2-KQ3IW?Gv#wL207@{hRJ!sx_P)$v1Fq#PFR zG5ID01qE4W`)p240EE{P^~4Pbpt^n9ff)S%aP}5ZRdwC^xFRZ`ba!_M(tYI6d1$1S zJfyU=bV#Qlb$~-0O1eWN1f;u_4gqNaf#2r-?|VP-z2E!Y@gL(1*(}a*uRYg{XFhYT zwXayUIg-om7hB+gNr2~^Eq?Aa3MBqFj(KFIXS9L5k@VaMpuw;EkN>EmJ%|Ikmq5Dg zCiH(Q>+Oa2d-en}NDZs`X>dPysim&PaWw$in{c*T4oJOU({`fPHrps_HaIx@Q-&64 zxaZBndD9qX*&H9=W|P@V2yEY&jhTqVMSPmLfKpZsqxKmB(=d&{%9(WYC9d7{sbzTXcH6#hq3_-SgWvPFrkw1~rxH9d^b#E#Gw8-9OBMB0 z#Skx1I$UR0HtFJVJq_JPK9~BsHO{&@SI-T-h$`8H4i1#f2-aY;$#me!zP0F`QnL0i{UK@&R?QF9xs zjjg+rC`a*a<3-x)PKVP~_SdEQwi~ZVM6GhaLd2)HgKrD@F%J-*{c2uzDcoM>zacm% zP=ST66bwVZOm*?Fgb3>D>5T-fIc+YTtvLgYVZZ9D7ZV<+%NDTfsvv%j(KiBb z`i?FJr6ZWwC0ElF2%qG!CO?5EB_(;4Ubi$h zXGoBX5Ais>Bmp8fdGyfG9}nO+OAj>bHLe{0r|0y>AQmV2E;k^5k<4ppg; zUVBl%<(I6`2MbRj*9}mE^S595)PZ6y!<*oH)O0*vKSO!)9Q0F%c$g!}#ktlwbw{U1 z84m};a7wp0G{!Zt3Pcs>NcChAJ!gW0mol~v6POQgf=yT9_H6%yP$9I(Qp*4_Z2=UAR^Jc&uPL=Eac*joDZ@1;0Ci|b(?qEK`5xzzVy<- zo5#N4-i@4!CKldp=#N!7fqM&!D>6otGmjh0i0cJe0`I_`dVy82b2&e+7Ziy2Dt9pm z=(;kimPicHh&Ng@?YuFxpdYlMdp}!X*Q%&pg4;qm5$4W6*WiBm9=f+sLSI}39nB*x zt-i+ECR^U_X_^%m))Ai+Qsi+QEBK|%p~AZ7DbSzVDxj3Y#mF0#8FNOWc33~U`4i|< zVg#^S$zF?AJ2;uckf^w7P3ljj-*5xW!H02@`ai_dBdMEHbD_={?ZrBc9PIrcVSc{k;pJ0i+q0gVjB9Nq9LQw% zYu$OzpQlvT`c8S}boB3Cc@R=SSTh1vL4Q-6+hVmVZ~K8wJ2IByH0ljh?FrZnQV7@^ z8PO@lXn0pZsy6I`C{D05{h5}t`Kp~}bm+3Rue@qd!6kuTNLN>vqfk`Q9Z7r-OFO$3 zicrgIn`R%30EgxGBh5yyMcAL$3-#+&(C{jyrg{e_QybaVr(#e}#RG3TPO51-)SYSA zkK`$YzPy1r(X2ax>e`9!LJbR=mIWndZg;b5PF*q~gA4jCopp4} z#YoX@!P7VOskf`uPaZFbi|^S8{HP~mXY&&o==EXeV(!~@Wz2>c2=8Rg1vae=e6w;r z`Bhi;>M78(bwK)wSWv^|>;PV6J^OI8cX}Cmabcg^zh~P-v1>W2CDV=lc$39+Ox3bL zh%hl20nw7NtraJv&YsdLew}p*-_DFC6NE(7+DyN?)F&&}twtcjmg>+-HP$_aqO3|q zo5g2py%~m7-&qc{H;&|}__9V4i*qUUj)y24+FXA3^BRi_uw{%Qlh{GTrC4|5!fM#|}mP#mxA}J;k1U@EZ5t{K(jn+H%ospC@-_kS^k*A>^>@SnqHV zdkEK^3Zazxy4SDfU^&>WC$<>M{r6|}1|aPg?)#8GV%Q%-0A;n_2eRd+&c2aUnU*vP z_wV~vrdMe=WT_%{rl|?OQR`Ig!=r>FjNQ?B$r--XqSq?dwCMsK1+5|OdgqM0)JiuIY^$JEDtA-Yla97iRA-1_84WwF zF*f!o1asoj+@ge+a8h2~|=6 zUS7_HPRT{XuJ2`WKG1sZ2AxT}4_$hPy*k&kRHbT0rgUkO93Vrm{_TJCA6aOqQrZss_aD-*4RPA&GXxs; zc)SPNd7xWIJg#$rV;4M%O$@T>{e?I*SFCnK(k+T^^V%3bi75W71zi_>1hjf-cb_en@d4lbq>2CrgPu}^CU+pJrP8Bxxz7*mXR#zW;+$%RP*WA{je`?vAHg^6VI+8#P^%~6`8*$`)$Q_l3D}xDuAu&Zg{ub3JJw07JsxV{e;%9+eV(SZQ0|OE~ zR?<&l87=WW$>{o zWxi((=2cQ=ZmqRYCRYhL-IMEf+}KmYsO-F$nJ2Ku)~ik$--{B^F0t0$do^eACy|8m z7$49jSjEVi-0hhChwJg1Wy12ETHKC-FfK>-g0Tr2OnR$;9$GAtZWX4xFm=W#_;QFi z^RvJteQ1I0c${)730{5?l?t-1a=KVNgGy%N8b?FX_inzZCm8DkX}#m`PS(E;0UhvD z-<($u;M-2o)nR-zma0JFhvIrzM{^G)2b8c)}wA6`_Wp}O!*pip%T0=P!)(|@(5 zzJR?)r*xh$63r-+5ZPh<`WQerkx;VaE|n(QNOFGa5H4Lc5bHB!_P^{ z`}ubxt9J^rAsQ!z$wLs{6U2Y5yY|IMTD7r+|3zl0N2Ke^ZMpIEQvau_ zP^O7G#vNzg3|*t5HSOwIA1{OcLXW&6ZxL~)wJ!~i6kT}DCrd9g!i`OSm4=t>?6D<= zHBsNb*PAwDJV25WMOMmx{NYbY-UlRkQri$W#7=aQ1+73sQ~~VREb2*3dMOg01AEO0 zENvlbQ)`ZL&pP4>3$=@u%Z7P3rMKj(E%V70tuIFJMF|UhYCFYhriv8DoW$M!H1%V4 zVAsmxwu$q9m1iJ;=>f%yz z*<8Er#Jh;NjzUuA*W+UL%FgsCZqVqTZ8=3MFJ-|!Ug*dD<7S}Cn}bvqQ;D$u=6i0* z<6JZA{NC9HPtDj)&A7lQf63~x;X1&e47 z5JyWl+p>U9VBnT@Kkb{5*%%dV?gAuspu3@Z*UH+GC@DCaD3*Xt|6MRTWi0SYmIMxi zrkGOwhJ>41HNXq>3FAI{kAm(pX{haeJXy`cImRbB*0NVxTHRV(G&nwkj`zNFZAo_! z8L?Pc9u4Tx7>Yp`A65&aS=QB`=iNMj16VmrUn`#GZ&b?fI^R|;ZXCTuRNhHhS$i39 zB9I>kVHz9M3Q`90O&yk%x$mD}Hs|!CuuEDNG}_)|Zette(Eb2S`13;o_%h>QLe@}9 zeD?^j2#>sZe zId-TU$SnK(IVSBNQwJLW+cOJV@2>sh_RO{{tb!|uC?OTau3Wk zx==GcG!(oBu35HUU3Qn^ZJ+-j z3XpZ%b5`1aCLTf91y^@O#X1~j#X-?d5)v@TwVwSaQPFf&w{P#FX2N2I+bb8VXz%T1Rl_8;m_?blUB6_V;l{y-X0-WH(#*=X9fjR=m>B% zmoJ;1|H#<^`n(2;d}Tdr?a5zRt9vg3<)xFloUo2lE*n1EnX%zjvGlimIg3AbS*phJ zyF__bke9r17)TuZ?AmX8y)2cR_T!g_SpV#mJs2VP@t2~Tml^q}VGG0)eKfBQdB$d}* z)#K=+CiDoPqqkdd3(vl6I*0q^#E0#EnE$lb@?1JFIN^!cA2p5(=MW8@cUbL0b@``y+xO?=pv=YoM{ ze*Wn(KEnhmZG*f|I#5avVq&?TG3u?@@0wVXr?FXkre1%!4s>DKjL+*Ht5yH z$@zBrABgC8m~qF?hoC?LNkZcCu{cV@Tep01mdE!sn=*%u0)rZgf=BUfdDk+K4YRlU z`%fmvb+$Hjk3F;aKf-z)f#OH44NLiMIfm-|ck_wMBy`9pWMCsS!`7Y7KWf(y89-Pr zRYbuOf1360QvuoDN4$Cy1F%L=9IyQ)KCAA9giA&9q*`gvyN!uDtHj%n3JB)a|00;%t_Ikeju77<#6dK|i9g&! zEEHNH%?HUNF6_*Wj@>K0rG!<<3mIWB-D7v|!xr+vnsm3><=w6kqr{Z#%&C{?w#W|x zKo^{7jM=qQ_E{!&+Ya9ykJ<{mllEzFCIb3V<)Lo?W+Fohv#HbK`8s=R*pR zqw-PdoS2%@@v-P!-x4KcAW>wsyl9x;(9ts zP&D>*$2EMBgR{#Ji@HbJ_mwcv2@Ex-d6upf_(2-QuAu zifF9SX9P~xXqP;0k?6X;YwDgV04J$RQ@Q?$5hKb4P|orrRP>SirK3>IJpQ~3bUWcP@H2k%r1U#x*-+qh+-#shN9akN6d(cjF!O}I^R*{OSMYQsO9 zxsEy(|Atdlv?RFv)|0k@ZZf>kBJ(f*v_60_|Dt|nVq%gar!gAJj)YeZl-@DVIKh5D z2HEio{3$gVFNr^gwk!){c~8*PsaH?N4?({0v!J8G^!3iRL_@1BJ@uOj4R&aq$1=Ya z>C{enGz=I-&hsMOdk%y~s9FnvmRcucFgoUyaG| zUft@g##D8c*&+!>QFP*Yt9TEnc)NxsR{oPbuIP-?XY6bG%?g*#cM1rWCm#4+5dcoa z-r@2VECz|*G;l8?h;aWQMEKpMp`zmf5m<#{R-*Z9Jia9UQE*<|1?g+?oHd`LTzn3L zS!s&R*4ElwpH&JAi#3pIroCi0Nvke49N+(*M$cIXgr^6S9;xWJZsH7Vm>+A775=A% z!1@e0QNsW~21t-N!eR1hm3sB`yjT}xn*}^L zF(IqX?u8u9&JID0GB@p_0**aq5zodi#@?S6JQ*D8t?<~>NJJzSxT1L7-20GW;Fe*6 zE&&r5za}C6r|P9&Dk=)$FIZj~rxpYM^3a4Wc6 zAISXmT|O|{PWv^ZPj~mboGl1%$e{FE=p8>jYAQu%R*mZ0oMAQK77*~fntxjNu~;Bv zk+TQG=5YL2##DKIgadGDg+2@e?AOnZI+~7`+bN)9Wz9Xci$PH+oMP_cpykNaZkHOA zWdSU-sFNe%Emb>;258=Ef$e{)K(?{tW8pNwn@GyI{aC)Jq8FjLYh+${QZA?bciU5c zQB#MTumn}JZ6ifH>t!=W^;VfjE8-M!xt?(}nrz`QVrRcwxZw9rMuVyXo9dP4{lGB0 zvet#)qZVfZ5F&yPw%!Zhn%}MEX?p{JN0OL6^C4cWf_5TJbO zJ6peCEKZ@Zys^_b77ZT5zl&sxyd+Gj2ZVv}<)4KTS>^UX75A#X-vr}#>4DyW@&U|~ zK2mqvmTsF+mM;)s!OPK-CU4QO0j4KZ%a?8Dy|~U3%!`n=JA?)8B;!1Goo-pM7dlpC z;?(``8aewjTIql;bX^HaZ4M)4ps=p=(A8e$;pr~h-E3fo(9;AWZ7(Aek@3??5)<~5 zVONc!O@*Nx3dG!4dzLpT(3rrHA4MiObTz_$rr+#2EdU}Vn>JMmyk07e23Pfl6NVM&b9WMr*&xB#L4_N0g=<#Z;@rGT&r@tWiEbY5*iA! z=jVRWFlR|#FTrwuIw-hz;Hi=kANAVzIOYy&%$rBZOsMsD!a@Ss@3QLY+|gS2u-AMX zo(p?d_xgFGPi2DL3`>gOSzK&lP8isM!J(kG2rM+4x~hDMUq1_BE$14paNW_34y4e& zuz^#n-~_Po8|^!~JXR3I@Q0Y2mwx4CWwl>G2np+bX$cM{Iox^#`%GF0-q5G&e{}9| z{Y87^eaho2FcRHYLZpPSU;gfLksv&Os=!H+hfvEFdA*EYFfTf~M69Kl{I4`***Cv^ z+HjHZLPTI)PPayX|HkjvZRkh|fpc#G!E$$D&~>iX*u&+lqRROuQt!u`1X&4mL3tE5 zan|_Njo8KBbzd(dis;AFb{@wr%ugQq&uIl!cb~#@w{lD8(M*1GOG=f%NbPs+XcyxR$O;xdXCXYl1y7k$`$r4!M;G$5u zHTuVw{^wT}RO4^-1TV6UXE{2m-g4Dr9Wpbu#I%VZCn*qB%s-D!I23uLH zydT}(8mQBaG_?@N4nZJX2kn+k?dho@$h>JS`4kM;*=AE zDYh4@-ZocHHnw&MXg35|KO8IuZN;-*u5khLR-k=j@es`{8}3kLv2JdLnhO*0c45o6 zwq8{ePJC8nTo-F)p!R<#9P>deV!Cc3iZo|_GQ`}UC= zGMVok935GPia{uA_e0~; zY40VskD$p7eu;IN4pXaOQQZ|GiJd*4oV=9X;=FML*pLZuFr>Mw(a)vMRs`Z&} z3?u#2$jgcfN3-iIev6Qq;bFR+9VNrqU~|^-$ll(07Ob6=OO#D8qcT~F_g=4b0!0Fs zC_B5s{DI|52^vkT@Q4UCdlW%QHoC7Ae#D6bKlnvO;l864EUfWwtLDLm+os_^7Bjq_`#-_PZ0GmIL0mRr%O6Fy@RAA4MxwmCrP#(VFGC~~ zk0+bot&+RCilmbiR1{zWJWtqnQJj(b=y9dGJLH$bO`jV;*oqD&K8Gjp&@Q2$9Lvfa zdLKqmkQ2uh_Qds2BTtVbDo`V8q&_xGceUI{-& zi2%-gC@c)KC^Jm#y1=B9ShWlXzu?>_qd~n1(ZB~Zg_|XScanVP?tc&bf5ZRlzo4I3 zS#)?}PW`bD9^7TEomxOnUGYD9H}w;Fy5&O9eMd$-wxEt~bBlavaLG)9aPq{tMqx0A zuipDI?#dvkygSEGj{8S2PvAvLzMPb+*stR)d+28eeSlZQk(FdRJ|@hC!MYqyn`WUb z=(Z`Taq;t_IC}aV@A);YMcr|7HXqX{lBW`qxe3s7!Y4hk&W{p1P&F^IqK?e|uC z!0KNm1g8oKtti@-d>yAWb2Ec~FGM_5GAJlZP7QvL{60v4hl`KHUhMi;F%Mo3ooMn| zP_LhCTY$(I!tux=Us-N(2&)qYNzsoA_?J2o0M>4KS71)+{}3avngEz|e{ZgQ{i6!i zP!P3DyI_&F!t^;>n6hHh=4Tx_Wj*HMR7oCQUgiMr`H}MpnVKR=t-m zmm{cn#7e^qOO!?&_makpglJDm%6jU;TUuD^pFclXySl6#zdo3Ev#7nS{#Gc0>>!($ zx4PJTnM8-6BQKQWX8R_0=U`~+XW*|{#!T79JWMVJCXupxQK^5)jj9O+LWWj$wr2UC zjhKoK6@r7-16|GXj{$L_g4?VwW~Zm21XPUl`Ld2y!IIq_y&WBOkI|2MK3pk9M7z^B z8yAjX?YeY!b}~RMWv>^%1;E&9c}$7x--`rxzz{uhg5#sC?!rbfdyLZFE6rg2hYLzzp6idx# zVK&p3O$oN8Nr}@%7I5lE7V=VqCue1?6%(vX*F`>9hn_?z%4nc)8~2@Ku%C?56Bs9@&1te>X7 zJ&_78clmifelnfueJuT6mPDdAM*O0Atp1fEDR9b?5l3|ceWua#dOZZ<+WbGmN%`LvcH9i}HE zJq?Y7hYW)S_A|0A8|ygI>h;y$l;siU^{($?_O>es&ZE3=Fq0BFxqlUGm7`IUX+d4n ztl^vd7T`TrGs@enGnXJ=`%yh5|K&1TXn^}^n?8T?mmGdy=|8UD=-nh+L2n<%w^iVL zpo!R#Un9^UWZWQ0JP3=Lmj4w_!B^;cMo3VFrS(=tnY zgfN;)PtRGA#!Q@;3wnQ7sCPbB*t9vm;_l|MMH#_bp?2%DR#9OZy-LnrR9W=R&1MPr zzCJQZHpCzoVY)v(y*AaU7J{Tn=HciY#VPSlA;7Tx8Fw#tLJHHYr{^WtIZ5nAay9%PmQb- z22A(ETrC(k#Pz#CTL%o30@~@Gnlb^PW5WJEmz;_bb9uSLqh63sv8cclV}JiCJu~z3 zgTqOA4ZNrDUq(zAXPJU}kI|8sH&fJ(zuaZ!C`+g|dr!wquSBESBC8USlv2q2yz;4* z9p7p1{CVHOs!WL4hgN$&*dXcPB|H!P8Ii~QeO2V8Azv?+>N+8(-CT_OsRGFL=12P` zf)3yOP0dU{KTy)vk9}v^k->-WMj0I`rzYWFtXn_AnvFhVJ-+BaNlFSgKDJ{1(#L(= z*gKQB+{MVS;-m0(Y`%^fD2XS3IdTpQi%QyU5vzx_t_I6Un_5c+oz1;J!0MV99;dHH zN3S%w*Vl;#2m{4I{9l?GhynNn7c7VR9il*{yDKkoSCIWX9%`Lb+rDQ6Zh#b# zL@PD=i{THg7vIsLpHIZ6a$z7P(h9=n9FZ!>R!seb%Qr_}+z>XQ)@F&5l+;w7N1d6n zVtgqtq-S_FR~DM3Y3~821M98A6vM*8(rfM2S@1=?Uh64mUP-8TqpeI^7{%7r)wxHX zu406PTXOpvz$tfHmd`rP)XKf1P1o_|Jo3;!_H3qZJ!QWKgxT3?4)#-fg-iJ8)2BnM z>hZX1XP6AHlXTrbUlDxRGcc=3sG`<}Q+Kz3C>$BRHvlhYqHI5GF%gT)NLF+{;F=W% zt`k2+$LRGv+p&k&Wq~lh&(O1ujvycOmseWAi)yveoSe)~CrYGS&IXJ{UI(0P*)Jvy zDrfK<4AexD(u>k}2BfZuo4t0{;4o}tp!B`0{&lQpPb|p%EK^WvXXoJf>~KVwlgiiQ z>l=5{WrFakU@?C(&6h6v&QD{>1Gdsuj|tok9z!=uYP1_AmosODbecW=&143 z^3=1nnI0WRAq)QKx>yAT*C8)>pCb4i0ChDoLRb~iwurySg zdxqqvNF{+27iW5$`tpWI$~8BYv(azb{9)2ec!TifgLU1<&LLeqAEiy#gabbM#%F!4 zy&HaMk7qNx$oELpx84TwjKf4T=iwz-D5AkvN`Qwz;^IVQ9 z94vZyd0F|jV)FpA+&dgaGDF%VPk@w7UNm* zK7bc#FL4hFF3k&LofE44j&x~ zc2eiRPCEWXOc(n2s3+NoVtA2&Spe7ucpaELSLJEjC1s=p$>W77vkgPRnLdY+vB47ZWFzJC8V(!L z-BGG!j_cW9%YSqK(l?=E*wm@uUt|9+RD5N=%a)r%x56x%A%pZ$ifSqdwkl8D?u}Cs z&5sk+L{G`yotT`M$a-L3U@t>iZZFLMPk^0*J|#jxgFo*Vr)dVfOws1}g@+ z;DNOgseHWmg%1^RD#y#dsi^`qmwQizglJMy1aU}78DnE(T~AL9W7}U{`{XcSkdNY3 zATeNgM`MXo`F*9n<1R~uB_*|eNux*fcS=gAfQz zpw2~SulCAa8tUfII(X~0z$Nn_KmhsMqx;N`-l=VeM!>-&d!gVd;p{@NEK0cQ3npqY z!+h^ekrIKU>7MuslSA|AiWdR7a1rdGA@f|qnOF1<8=CmTXgm%m_t~0;Il6%GOSSr2 z_yr*yVr2>NU=sN#{tLkTJMn&#e-j6(8xZLx-$nL+PSidJyRP${Z}yzrQ{PmAerBMY zs=C*TXD;H`khe~{e>XlJ zmw}v-%OOa_M}$Uzfz`Si6!^?Txi!z+*y#B*1HQ?**~^y_**PXhb13*Dx)E#v_q$@C z2M1_MBr1{}we61y`e#or&ONFYx;=anV$HOygk-$Dmi+zEwd-@G%QBma{9Z1m&tp9gXQ?)Cg$7KZMT1W|? zK>4r>x9&_4Xnk3E9vYmRo zh>b08X32q zFzN4lt_ z?+Sq6=DeHl=0cB;$js~#RxWuc=yZ1;aKzivl73?WRV{&m_|lwyI#sr_hO{ZpF4cW- zg?xBH!B{9OCdFI^e%Qk6WeZ)EoR&S#w}G+6`#-+f;#)QFm|0APa_ZIYCLM3{lMbU4 zlIp~W@{Hv#%_-HpA0h+^(t*s|=OODTHa+h1ob29@2C7;)pO1SQN+3{hcn1p0GUAQ*O z^Plo=7WOxFXFJIPJLt9hW~$AE7Gz7-5#LZ4h_t1p^NI}(jH6iD=W|O2E&Yesp;iry zgQBMhI>!8z`%^J*AbXLd)gwa?>yGTIszeXN(&^wBWK>{NuXaS$y)#r3DdCb5Oy@5; zfnp}6>|Y+8BfF}oDe+uNz!4`W=A+`AU1?xl3DN?$`G&~KI3glJR=kij)o&JbSarw% zrdTZ@G>l1@vV?AJV9{aJt6gEQ6(olj6@nXCS{L&3CWI(@#jeLGSuBbw}I`7`IR6k3TnMU8mPR5?{Y1DwKo<`@Bp5a@8qtEO{DZS6FDv-s|q-a0fd#j$GtKONr;xQ z+ehD;d!%IN&RW0o`^EUX}-iPQXsZ*CW({^G#>Aao!(COnHo6Pmk&sK||+ zfw8k(RA!d4ghuC$uhmH;42UqhaK7Bo*gPexa!J?lu&G@54EFX; zMRwT9_B!mhFfZq#OKWPPNpw1okh~Z6kVetm{A7+g^)$wkiZxweKP)y%tE88g=CLH% zXGttmpb3Q5NyfwZ?844)N%BP>+K+?0GLiklO8lvYxfN%j zJU;&H7bMqE1p$hKq4)MJIZN8vC(pm=X9%ArqA9qcpZfb(n->>Qs$oZYKc$pYCSC@I z1E}U()E)Xa9prSGomS@rbkZnJ%PgDUbThQ}pNuI?Yn@1t)95>Hhh$lTgGxCU^8T(nHF{AW|W0~&q^DDTT=f&DmHG+_=)M1vhU6B=@ z+gfr8a+_ zggv!5tlq!2v(xT*;KDOkPbkK?8zFd7TNjbdgh~!0#kf%DkSP*6r{mK zQvQgTDsB4o%klBJ;?{l-;LwX-7mIypq6C@GAQf6~_t6cY3sR+N-){tMiFx<4CB);@$Rz-{}Gp9d5h>ul@ zdUf-ABCDhH_0>U$IFE^p6?P}JFt-=|ZwB&8`pr@dH_NYx|D31!rvbGLs!Wh;CbE}o zTQA?v`Sr||EFsqeYoM;hS25%m`B5Ic5R=sOeA00+A3sD$D0O9H_%x|e_^@Wr)}bIL z=lM;Jd_Nb1_KM2kVTFSAHn`rSy6dx8S?kq$YFd2Rh;~beA4Q=1F|`_VnVyQxmy?4GSn=7eyf7tAB8SM)z)WlUZp@ zkO>Z#ZI$E0!H#o%^(7piS$f0a!Tm=cW6hDz9-s=#4u_2fBC{dM7*UCr=-2mtmfsMU zqzVO3mKpI>sA!IJ$Hm2&&&c>=>QHU2Ph0qAA*sX8$e5)7mZjf87BxI7YJyK@WvnnK zc(f~WHevoQEd$j)3JyeGKKT2L3rJ0UG%^c0EWfNwZ?^e}+yP|?BQCh**FosY%F3f$ zxWE5PS|MY~b5v=1di z%93+aN!A$2C{#_B-T#%QMwPNup@ouA9Cz2xh#MmFr+XVVgzH|ML>$`NA`PoAW1bK) zHONuw-nI`Nc|T@uYpp`w5yjmUCJlub(4eNeYWbzSu1_jtYSg4*{4vH8mgfVNEGIS` ztla9NJWpvTz4n7*ePZIAAe|XH&G|VZHrCv7QneZ==WqEJV)PRoA>H3p#Cd53GFz`2 zutTUCA|j*v(nBy;y_FnivRbzR{%U!BpeG=Sphvxat#iKdKB~+0$*>I4U5lJ>o-(o1 zG|5d~G-8y~mkF=E?btOU1e~{%yb4eyu-;`XR`*4q7s_rZ1oY0z66(S)PKw&p5o*H{ zOGD#b(zF=ImMlXrmmrlusscCh-#9w=yBAEamdeRNhjO|03G=?bo7KSxYcFo*wQ`E+ z$QXSn_z9wo;7midatUh%)_Oi1ZCWBPE9;RhP&M@3iSl;}sgv69-tPeGf4|0BxuNvV zkSi|ezA_@gXdd5h7qFph0w|^PWIg|bHF_doNg_!tG;ucF!oLAWq_Avg6opm{Zu(qM zuf%d&wD27C_dU7({FxT(Rm_ySo~I#w)}w<7Jzra~5YBtp>wQnefhvP6b?=~&bs&u% zB^^H9elFbXbBlLbY9KWo8%V^j>7bL)m(zccwXDfD>KPKIWCj9Zz_7{)O34B=RSi}W>SWQvio0}G*b4+jgE3R7`u<;Zh)}-V*+@x$HpGxL$CDBGMxR8 z15aXnj^>=opd-pD6S(%s{tq#C-<8u_3Eex7Dt}ROI5t)l0aZh->F(}UB*%i48WgDl zN9AI}sE&(uVr`HMfrDEkVJf+|WO@c@O9r~(}`PTubI1rn8D;s)jhE(`?!%z5? z2E#Z_pf*kBBUv%+rk&IpKY#8QY*ymub8>t(B;wA^OE&aSM|-5;@{3=SOsEhQ+`Pt3 z_w)sYgQ2JATQc!0*nnB8T!O?1_FC`r@+F9&VNLN^&?XxlRw(kTO9>L)>IM+s-V|*o zDW9CxxqMhVZ&?(uD=npZu9a5%Nk-DcTKms|KAHOlD4i8PhkVoT;@LlWED9Rvv07|x z5s>HA;)d8k-(C;jZ@Hg};tVhYqpg_AX)#(#@Dx4ZbPqbU?ekOd%T50t5rMMnLV-X@ zs?ThLHq$TT96#)36R?uxUKQ>Q}V3>Hs|IT)c6p$DnX(@IApb|Ge*M z!=@R@JiHbFV3I>?FOO&Grn240T<|rL=i#!Xc0h3(ALI=}2?JwUQnA@GF~>$!@%a4= zIDhqci;S3@S0c8BHxtY$ud$EbJys-ew8_6HyBdsMVW1wXwRQHBEE^;4Z45`?&U~s+ zl?-k?XV)1{$Q*u1%kUW7E-}JzzSSuF;Go4@x#*4C&&omMigDf5AIp@#+P>!q1QMH4 z{}vp65CBZ;0!@#{?=b6sziz_>tm5qM)Av+&@-$MBoVRFo8g!7+2G`+zu$r&j_Dn@VJl*9n}iud4&xJtuX1_@c~GdaD(oM zIsvWd6kPX1kP~i38U_VhY!EhaVB|RVDtu~>mk3K0FtVspA_C@o3su(Z=z;s z70*X-d#vH|8f7F`ivxsFXEizwOws{@F&iBcNPe<+Mj+V?3AP$g%M$t5MU!|6;o)Ge zRKDPgjvt^_IWjA?`tsem$&tf?`P}gPOFC=YxL5Cc31p+3-p*%g>(B_xhp(3BvGPJ+ ze(_9=sMOi75jcuncq?XDtUBMSx0)fUsk!#qh+ORZ(PLm?PD(jw(QP%qbu%o07|tc= zGcHn5s&sLK)DrWtL#oERQ|Ip8wXl3WmHUmZtGmw~Kg5cZWW^#Cg#3cxnK=04Wxbm* z=xTe&@vhrjK;|&9fnT2_;k`n&8Vkc~eh2n)Gl$lxJdykWR{M&`gPn3$8h~7RW8r95`LA|9R zIsA~JR!YlkEVZ;2?~1o%!cNj0lar*eoB64|$byMWF)1WBJ$wJd$9<&-8atYh@ByFdgbdO*sWvnYAPTImtQ0g2QK*eTs6rtNS6Vs_D90@qyHA=8nkTpV z1~_5@9%3f6Pul)<7C_3ma@tQ&XQEcVi}*-K@D};tlT-m7AtAO!ufr7V*IKl26Q^qI z5DJmHlI%h6c(%a*$Jtj#Mb)-#3xW(H-92<8-8pn4-5}jaw{&-RN-K>Z9g2jMfOL14 zbbg!rd7t-I-zV1k)|wxiJ+pwh_F30)9_Mj6<*u!%j3J?gwB27D@!N(_?prg{2t*TJ zR&Y5fVhczN9Rz=IJeadjfCj|n1v#Ac+TTi5=x|#pMa7n(6X!5_w#;uGyd{r{QkNqp zX~|vs^wDba8|yG%rIY}nxB$e57AcFx=HasEVW?LwHeRuc>29GF-{E}EevD`)G%AYS=m{qi0Cy!96kv+yL*qvx zgo${bw~*s=+K$2G(*+N{lPITkH^E)*Qvptwp_dJr3p6g9n}gIU&fB-o7jYR&9kIv4 z3!(JCTDA)bcZ8+brKl`X84J!PZz|Cx8N=fpFOOdi_`2($oAAkYe4_VLcO`1%N^|4o|!0vn4;Tw>ycb?h_yMY}N=9xC_0-m}{aJ%r0ye8CPjnGk?@k7W}*| zq(oW1yewWRXkI}X4V*b^^txFVanBtc&Fz$ zK}r~Cu}H1w=~97Ok_0>q7tj>lSc}GTGD4F z0D)0e-H)SA1&(-^1@bxi=ey)e-qmBJ7sCs z&_sU{~LtALgZYXVO`PKFMsGKYDj?I26jEn6Z!Z`_< z_tkocxR?9c4?*Q+3e5_=a^{s0t4cx^QWSv^r#`i|o2^$L%i%~1qyPb`>s}Vumfd-?4V5yw^X}_x43%vjl7~`@ zlqyrvV&dZFy3D50`(}>%G)RLKT^D|mU@6$1_;7|Ai=J8~9X%Qg+U{vjyz7XY`K_Z^ zwt3swuU6QF8(+*=3c^gYF(mSO)K8GF*S8NtdL=D|nI43J9Wt`} zyW2ZuT(jyXBtn(%biCSHD!|EZD}iI5`K1UPD3M4kwzm2b#OK`I5A`(lbs`Z~J#D^j z-F=k1anyoMk(sRghX1mSIzw6}Dli~`F4la`%4O|iC#b5X4!C*b3#Gapr_b_u5lSk9a8pf37+aWz5NP*0ZI{Z|V6? z8~vD$-go;7Z%MaHOIgaKB-tk``ignreC{T+DPP0qtJG4e2^08-o|c7+1OdqJVqK1; z#WnC>uV*{Jh7h-%qV3Uf-)Dz>`@sTe6OZ=?e74)K2D2>e2pWU->1qY6^RF!~x4r zMgT{h|a2`%D!uZ~#To2Tf%|7_3t$3&B{UswWGKN*qap_pD?< z^W$VW}zQn}^^~sm)&NWu5&^NJXaE*WeZn)FYwwdjz3eaoW z=SlQ-bC|8xJ8@THjaU-*D_7}&1}EMek_vQR`ZG1P(mq;k7pd(cn;OXCFoO~86#IND zO~dX>na@FX1(n5P1Zbfr!*gxTH*Y65q^H%+MV~qV3=uhecirxoLae`Vq@)!Ed(g?Z zkaTNDi3A^)5?{wRivnRk%ra|HFRZ$d$Ws*BuT0g#`;^Tx_{Jx9&pwLLw=T;&*=_4I)DSzSgqFvn{G#o##-H={D=@tDY zk1{EcW6MrF6TPrUVP_L1Sy5fWwL#gwL@TJc?8Ko@G0vj8>&yQ)??UJa8qja>P3U5b z6ADEIvA+h5p-UQ_BmunDwS1wL%*D4in?>3mKNhP-^Pq?7V$dNuyVRE)IT|krGyz2r z8yi^P=dN1le7dD^rr=!Y+)ozzH5@c53~?xvhRlKV3JOeKPmDz5UX878kfvf}T^_)0 zWdUd~z`?L0G<35C&XlF8j_Pe!;tB9G8IhoXVRZl)g^UblIE$0h($cb$j?Q%&=CORC z3Y9>~0py>lFfp}NBg1|iv!w@;fmmZx`Orhc3(EKNif+6LNHyOV-Rv>b$O1U)rh%-k zF5%2Z@?n@rYwJAE*C@(7b4yDl7FI`NC#NY%A;~8^PFshkwbnmzVTu(5+=mH(!y7pI zzR|J33#TSLqC0_HB{a&-+2JCuw0gwI=qV^E)3`_ zHmU)*otOw2lwKWV;)P^H{4y2sZz+L+Um8Qr7L^Io#X6&&koi8CR#VuE)u;&G_*?s& zQ%oz?h*xft_euI+UKSJx&c9`%ceonBb$eYrmQQvup5cvcBIP+@%0)UG|jlHv5DBg``)~yZTRQHV~7Mz=j5+UJC z-2I@M=V-36BR{Lk2SMDDZJK%U!_G<0_ineJrW=G|NhEmzX0ZQSzExDz#!v6`4b~j4 z(-ulpL?mSVMpKQ-VgT5u8RN-?6V4aDOG{^S+WMg`*UXV*&iIrJ$zo-MSY_0Yx=wz~ zTl!-*Chfh@NM|ZjJ%E>rFG!6H$AM2XkOdQ)<>X8=Q3}CQB>S6w=RUGy{;>{g)PN|r z$B#&CBM;MWShek{2`SMz{B-JeWf+;sl=$q8)cVTtV6d=;M*$j2K>>EQyEs^lWEshS z%p^+zBtA<^D|<8P^x>lJC4WEeU8)?x=srH}>$~NMm*foG(*xPcM3TLYURQPD^f9vDlEZ#n0T+)A>|@i5 z18fR*_Rr%$H?Fel8)B07(6-ym=}#vcvn13Q@Vd|h&CA6yXa1|VgM>$ym#O1c4w7<% z@M)>3Ox}?Z5tCNV9RxFDV}&cqHQFmEqFDgcuhMA>xLPai&Ui_QBP2dSS+1Q#6>%5x zhCVd-NJXpZxRfigkaQ#zfQ|U`_@op^gT`jhcSyIm{K$bPM{-r%+NwE}d8K4hFgqh2 zE=3R?9v<)K_m=Dp;)_#wH!^$BwgMsHVEWu?qZE$+cv5n5-W~4fgz0IffOk}E7VkyI zmGHHa<4x%~rt?}mq-caxZ@T&6XExcUW49Br>- zR^Rs65bRRlekol_&A+JjhFeU`uQAljYE!x6j7bfi=!r9cjyiG-Tu3NBuy zCHl2c&sZhAtQrACkmTm}e(ROg_v(i}zo#{NJ~t$V@HE0Gfkzon3{hsf^3)80KeTg0XhsD(rs3Ihc^5v?o})dj6Db% zA>I}YU07(6E;d+CNDpfFzG;$X|40c7H;SedZ z^f-E`Bn_}P(3}4;UgY7v9K;z(9#l`Fa(3=wf#35nN}>ocGa*IYe2uPv#l&n=+GJh+ zGpco^e!KCG@M5fDwV_z}2Yvlgghk?v)4b8q=le#b+(fq|itKDU9Pr{xQT`aEnVHap zbYDJLlW`3CXVnVZnN_bO$4t009 z=s7s(pc|8+1P|AxSSRo>s-zTY4r2ieK_JHkiEveD`fTz~G}-Hf1D)Lhyo8N+J;~14RclDIl@sHLD@X#- z^`JM~W|my}1_2lTOjv723Dsg>nG&TIixwjUEB~|i-@A4ctw*legqH)`-}ipqssC~< zK+2?!24U5hi-t(`8Z14Ms{|-f%DPahrai5}z!aFEMvJ#PcCp8Mm>HZ__KK?=_nZBk z4Bf|yjftCe@%6WpD}cD)RR;`0;8&ZC32cVyM8ZuZjRlhVN5+#gn&p@hR@*gv`WL}`7^tY*r+i+au(y(u z9mH6;WO;Cv6&UoP9Plrc6Kr#KrSCNOkUHTiW4#TXJ1-!xJ^6xLg2wc>3~VmrX9ZEm z#WteNBVP-)6L>$2ygY(^Nv`BuO&7EhOP2^)#gTwA=U&SxR0`xvEGpI7rLC6~KK9Ve z>(Wc4%v!o(&yQbzHv#8xGh_0TC(lr-1Y5$scYd6t%8w5ihfP|MA4S=5l*Mn#9hH<5 z`P?!H*x#UbUnU`n#~a`?WBWAG1~Ht1#8p5=uwGp&M%VJdCngXUOAQ!$G2r#4O3 znYCwAlT!N)-a|`iY>Q)~bz#gaZI#}7C5K$5$#B`a^4B3Q_AkOq5qhTNxm#wA<+o~4 z_95obyk@YDP|SSh0*dAn3 zT}MK&8qO6c)(UV4C^+r(k|HDN-Pe-@StESy1^Sl^+UJ^_<)Vqa^#S&cJi46=F3DD( z-sS^@00NOWHLc&9_f*6d%`kwiW%4-g{>}<|J>u^}I;STab?oNBsHOYilXClNb&2b7 zwV=iPaZC4*{iX(QJ=Nw?mS-dllBR#>vE>8rlU7~H`_8vLM#l@x`#tvfH#&0noz>se zN!c*P5<=K;>1C9^shMs{Wfob<$;+h%<_%3y0%KS1q;`Cb%k=u{cjG7cHy1K`YRMLZ zS>q(L{GlS1f=R|3(xQ?$5PK?<-pt$w;7sn3UJIBO%0N13j_3{~;L14C8A?wck5WvB{F z4=l=ZVqllUHMcn$2oE}s@x?MxB(q`MM^4zRLV2b&BD;$|X%W}M1;lBwbp-p$3IVXy zL}G>rv@lWGhdBmSRZm$TM!j3e!D9PI#fw1!_3k`?a@A=6PR%4|mIYvK($H)-^$JJ> z)JJ0->}d&cajEDc7wd%<;OI2~USpg(2SC8lnQKLW=4b*?Ul^(O={0Cv8F_(XBwG$@ zop|`uG5sO>o5YX>UJn&uXs=~46rY`^2=Q*`XjyEyfUAx=zls-dz9~6wxc{Z0qI`Xf zz{hKjTfh0sOtml4vsg_LT+g*!*+&qu+QA|zFElL z-)TO)cW{|q#Qz`m(U`TFSp*xWKI?1*g0qoc8K3HBz9^F`d4K* zAf^73K?06^w1d^Y&5{3R2Pz<7vMwoYjY|^D2hSyq<(Js8x<6fYu_J{4u5yh?|HtmW z`?0CF#$FDEp;-DEJp`63%mgj=?XkimUAxY+&l`n9k)6OiaNY5MigeTaPu-nuaPQs9%(;`_73w-n6ZN$u_J<)cA+F$6(GH@dES)qmChtJJ4l zwzEG8VZmlM`}P3Me4TPBl_wAY+>o!D_bNUl0)4Qe>Et2#N1#+j*Ov<;Pigl7Xq?LE ze6S*YFN66rHoq=tlj#)R^e_0rSC+q90 z>lWP|>LN^vb(?R{NrH{{tb@E70Wcs&R1no`YAPx-VeZcq1_E5Y>JG>oSi>dFu7}sT zlYW}(kV!}9Gbqj4qB*CQ`tv$~rgc0E-be^0;5E33zDmF0g7O_WZD_+wH(7EtUcPRVPftU{j*#0&)^ts7Uy zot%_E&PuPWq65=(T^5A5u`nBCOw7!Tt*yEaH}U~Gtse66>g0@41YKvA2y8MnUxhl3XE;JU;K>}XoLbT^!v8x?^fflY+m0*&{R;j2FL_uWb-IPT!d5PGTgV&`|Ud5E-#m@QN z0-!Utks<$>$VQbEZKF;~YA!6Z9Jc;}ASF@@w;h}%;^{3!0Fax;-d3vlQ7f!~k+`!v zY|!5Lbp#e60{d?%?b)Z8p-mFNjP>wCz8#;|&f z_RStCW*T@MrosT2m=gIB@0^)Ngg)J?m-CktB`#S~uF;N0(Ig%@>O{w}gmtUX-5wLHm40 z-kzVjW643ackAoC1^M|N^)f)sTUc>0uy<2v3pSzV<$d5C9r+xB=&;3|=wS_4el=V=OzT*S1a3oI5Y- zcyto)i@XJNDuLM0P$}ysZ`~QIne5#@JFKIs%?!j4A7BDlHNDL7 z@(XWi26Tx140_G)-FJp)N0M^{R)`HfvDJ1vU( zF9GSCso!WRe?8fTNA^1cHuA62O#c#c(+Ks|C5V7cbwQ=1$O{U!2fzm*YP6~d>Ca*~ zT?EgrQ;%i+&6nPD!#i7mZa*ki$DUeM1~ej+WqA+R);PdIzfx0MaCLEYVk;FrCHDi( zA|zcIlVmFE`v~LVS(+;7_Y*LzUstzBW%fBC>}TwM3c+vtF#DO&{f;dX)p0elyj9QU z9oG<6kB!#`bs)Fx>}uMrk?TU^7*rLuRh9}Ohxe!ZgsM#%#Qfx6o` z?FjAxM@ja&qZ{F<+SiC>887om3??Xjlkv|)`;VvFK?o$3xx8+p|C&@xfwHSq!^;BO zKnX3q`!gco5KQC-*ooKD^6)AJ=k80^$8W)>(?bz-ED=<9Vs~yx9%NTv63)H7qt_dz zocC!$u3$)c8O=^m0`so=bzb)pg>d`x)g|tBM59hN)rzgwmp4`-P#`eW+1c_RwCRV_ zuiI)ba4pm_SIli6b+*&~a zB{}^R226gV|HvFV^^3>;=O5)%_M2YMn05mp+l6LWW^6ABhv}M6s=5K-7 zs)E|uGhTR+q38yqviI*D>t_pxnHHm0v*=2uq)AE1C@4APSJ2~)%b&}jp^~`TviDE* zhRVuEe*+|#xW}s*Ju4dYzN`0&$lz8sdsnxk@4Hv@3Z73j(r>oqDBM>&`md%qAkMr6 zOagFR0{AJj5W04Xz3S<79H)l~hDWiObjX^7i zbW6UF-;Lw{1OQ0t6D<81v24KbObZeNA#PpVY(UJ60kE~aicm}PZ=#M z!^=}w_9l6iRCisMDd`5QQqA{VaC?ei%Yh`$jrzj~6@aWx4Ft*!4zmRjw3&XxhdzFU~NI|jcS z?t(mC*8?vF+M&UI79j^#)-3-#>NN}m!M~HlUzyfVwePKyK zLVr{j!8fmKj2HQ0%IqSVkT+ zhO)24iRPLZ8!B{@JKJm%_|^vRxuUV}Ai{SpB+c`77lRiI_gG&5c)I1H@HXH&MQLNG zM`>rJ5is;+xhEIsx12Tahdn$WrdvH5ypB5I7MopzIpw1NunvPppdi;ez%{t}!$JQ1 z5#Y0GfTg8+6{@BIRVyJ$v?>Hi-8fnZs!&zr;`!JQz)uELODHllOe^$e4~P!ojr4)@ z>vP>ih`Q|P$FXs7DV~aaR#I$|lIFBYxcz7npPj_;>eY8NR8*2mwe{YIpEu~E*Gu)| z`g{xxyOq6bUp{U3c$JDo`^Vf7n#qs&5L_(RHXafN5z`w#p5Ui^&$}Gu&9>$ykRcv=VWB0rPqEA3+lI^5()nq4&IUjJ`qzjjq$JGuL=1;rvyTU53x8z%0 z_)w&D;w1JiNH7Xs*y&G}T5Q)mT%{Nf1~ae_W`To%QG2bzyhzMyQ|a(pG-Fc_Eyg*o z+?5e`Zs3S=7JhEi^VfOqN=l;_6}mm#_H$pQ4tfReFKtu(V0r~VA;XC9X!$M~K2Em~ zfZR?pYcDkBJl|BFuOFg>R5&F3>Eb#-Db#DC!WaAJ8-G|lbOJ!&@5sbH4+pgMF5#zw z-YwI=fJJ}WY(AM1;e7W!xV?=#d%%V|ia4`eXC)ja$jGMJp&qF5_F@zy6P+7}R8 z8llG6?}1tv&R3J-@z+p8HJh_#29fB1I>~W!D_yE9Dj5xZ>XzTP@lNb+pApJV2CTXf zHrPi^8Tu%YY{NOg2NL$&MbC2eJmN~T6CtNLQ-DnOLY3xocKfZyP5s#ZcpWn2`E7!v zg*Yk4t#6pPCogj*dZT83Ivh+%j80FGqoSe$B6Kv3?(UR%CFSLEMU+$~Kug$Eh3&)? zULx-6TUQcU?hIbL6BAwF`*g~52oTR>`t0#P8%8Wbggv~i-TduqqU=0^2-hzhy?(p> z$5$7E7M6K}5VM!BCJhnhjoRY^+!Y123PGIaML8OutA9{{ZdF7OpqJxDDe~!!D|2<_ z^{Pc{a#Az27`Trz8WMAtwbuLDzI~M=+CEX7pn(K=d5YC+Xh3cKlh65QF%CmRBMK^? za_i}z{)sBqadYed#l99Itw!;DEsr-w+<3oV!(w|Uo~->QOXqS29d~P=qwAHWcu|4b zdha(lAF#f+v(B|=Qvo2fDE{om#KXfQE?IXm%HB|5cV|aOkOn5Y?&8AW0V$+IH( zc)YITPMdsLqk!@R>J1YDT(;h-8q4vy>(jFtL!XDK3peMv!%tD(z~TTv zNFMmA2Ma&~+8Qej0-;O$$Iwbkh3S;W3U|_;rt_)L1exGda8t||!0%H_qedae%QU1@ zXwP1^-w!|N;xT3=ZKZ0^&@-g4@AjJn5jE$v%oV)Qeg8g5q8xesAc|-Ez&tMO7=Az5 zbu^@fSxo_#Vbi^>DLchc)*7hp47OqRSVt2!`G!6Y)3gLBjt!0BmH3+bH#ZJHIMIm0Q1tAJjyu-x z`WX5boUx-WbA@$@R$kSP`w$D@q?QW%y_{b$68BCikUBUZzs_6%Fv4E%?z{^qIO+9fkU*sLuU(7jVCwM|k@0|VA0JH}UY<5#XQ)XFI zqbN-VW5GxCpKFIENo!Mr2mj3NU9o`CFl9O+rTxBYf0RQVJ}^~oy^KYLA0fhmn3W|S5*8su z_pCgXSO%g8!G{O>lv|_Oi&IP^{hd}40sEj2j2gg@AZC1WwY1^NidYsYE+J8TwuB9f zz&M%DS*>8o!|md|lv;}QL|qB*V23iQK0hk30Wy9;LT?E*pnalz z1=cebH+FE)q5Rr&>O3k58oD;XZoTID*rPd{{dS|W4yCHImVadIDS))~3aVW<3AmJf&X*(35#4<;ylCfR%!h@4#R5p-Z1Jv&wzY10B)4zW5_mddUJ~ zaWPP}9{+KX{6@%qyM@mm(sHCAdE7k&m_XFoLaB-n5qX8vMK5L!kpcj9$_(SavN`tn z__k3=QIV(Kqx0X(d>B~HFRKRzWQXM~t5}Xx*aA2CaIUOSt8|^Lse13fRvrEY%C=*^ zm6n#4&51)%QCBxpaF)66Onv1qMV>)eg3Y;i@j32Y^A8bd$be$qTTYT^+t`Xl#l^;! z4*g!(2oV$g8#`u&<|0YATT23A(b37gS?@-9SuD~aJ0pqGKKfa$nJ>((#1n+)`_OvQko(o4F-gw*+(@G?;IF? z;jcYkjjP%v9!uj3JH4@eJxnaqNFC_;rLD2i`!x7IDwLcnfDD{uYdw<+<=|3m$A&|lMa@{Q%sa{-?x8jd=tDiy#<8wrd z*IV0ckAiYL{vRLJg4QsTq)p|s$qNgljYSh9qhCnbnKe7HEv95RV;fgB%Z)0<2e4>< zW*j(E3AaBh>pt`y%;5Z%#p^1o6mutMFzkx)_HiRsvB!FGXLu50^Epf1PG=Vf?lSoE zMK@tR7nav6FZ+2hi!Q~p?9H|5l*QQUG;vIr&Fj0WCd3K|b-TS4;#!CRjP zdc>6Ben8xCI)v@r))r2fj4aEF0ieQJ6du(-wN(`v6Vo?v+OTc75h!+FJ=vjzmW*XV zO6_9Q*69x|q$rEcD+O(fUNt;WC@pe6?Ryi{YBu1#(LB$c{eP+(fya`z$5)g8&)V=e zU{q)ct%H=f89c>!-RV!u`Sledj6orV^^!;jNTdbBd<4dy^%LX`LbvFCsMKd&4;sx zSkLmT`1X2PrBSu#f%(8zpvG1;o^KC7DYWPFN&8)hPpkw3vazAp+@6B0bX?{wsb-SC z`H-I^8w;BOT9_8m9Iz!MO3TD?MPRRh#c*vivt>sihx^HkN{-%b8}FL|bJWsvH-|sW zo52xy1H1FF9d~XI4f+3|q3w@giTa%Ne;)8PXapGu$LMlJ+T3zWLo`5quJ%U`XG!}2 zE(fgmCy5TmQzWX_y=eVfx?t^#HtJov_i`(WPO_0gq(W(FX>oOd)O~U>$wpLGYj+R# z`fIi#<^1eR`plK8s;ZQCW(TZz!}dKa7p<$uK&@>ia0R!Y2h+s$8k^QgM`rtdIh^x= ziLua8jwZAQ`9Z{uOklr=wkzMelSSLKk@395NLgS$K6X3Jg6yGyvRlgjo|gN5JLF_J z4q4VGevBoOT%!)qW->FCanNddyGdr^PBt_y9tNurxXj-Y?yG;V7vb-DuEj6yQ({)gaR z{G#_!oDTm()Z7Pt!RAF`d^gHj!<@lKqx0Ih6yW8ZEqE|sX1ve2-2_g3JwYDIY9`KU zRQ@1}-W%c5>fQ?X*=;^eP@g!$YD`-Sb8-8<^jl`;>XX}umoknL4aOU5G7!UfSvfg8 z_>$J`Y$xZs{)f{G!IaM-$TIp5zQ!9^X^GWy`OcKi)Rc@w$+@!f^3p!TWEO3+)W8Ii{p@qTcT#fLP|EMC7k(P01G zVSUws^*f=JSNqE)|7}oQvV+zD8DoyEl*oUcyBzyNJrCi z7w7Jg-qEvef;qPVJhy4*e&=uGV9VIn_IC--@)U!aaCGi_h5{}M(?Ob9&04VeT-*3K zv8hvB2^ee~JoKwZMl9^yB$}F<8_h|1@FLCnUUF!oYEnC8&|#_;)Jn<`il%IZ=9Ui9 ze`PED%D(lnp2GcQ!jv8}fzXzJWEaWYE=$QlfI@s^2RZ4S|A6QI2h_Y7NA0|&EuI|w1f=Era6Vt*2l6RyY2CF zrZ@NIY+3*)vr|Cf`OJ9(+gbuSuEMj!H3B>RpEz_I38S&-Q;c3~bYWi@#r4hgVjYf4 zTov#4UOvdbJxQ2cf7KH^cS!UgUs+sS%wD<`7w*sQuscJsJyDnc1+#BMkB4uB%9~%8 zGRRy!M!V$GXim@&@<;D;&n<>4@c88$zQ@Vmy+e4rw{~e97@@3#0)GhNe3Axgx%UNb z1izc+F96VEQt{P?H^@V#AZaHxGkRR{B~EC`FJTHgB-~eGe}!>%Q-He)9#d9k;hVBs zOD<~WG!epXRIr>0)~zEv=!$(eVw4kCZEvsisY0iI-(4?z@gfpqvm!COvnM`{z;2^f z`Jr`kim^xFN~l7Qi{`UPz#^*OUIFiOq3HbB`NJ4>-r)tEwPuZWl2M@vjSA-BNx^Sj z+LJB1Li^>{8@sMtUeS%hnvy5Sfu9Y}3?I^+@yVOt1n}M5Mw|>3p@ofm(vWuo7{wU* z7n0BvWZTJa26i!&SW(hCkobYE2l0@Q0tqqFy#PfvfpfP`TSGs-$`m`)W8PB+1lu^F zT=c3%b-VlQstfb+s2jnzf^LF-j3a$DK7SZrCr}qFG7S^m{KvsC63CMXyFF-g>s4d~ zw|!DQO8B5&QAeD|-<1mkMidk4kpyH2tV?ESG~XitlD|C#hO+W<(tv>T_WoXMNYkg* z;{7)A?j9*CtB6VL?U$3rOSonc-sjW*+@qg2Zhb<`-tC|GrY-0$aUCpP;NzsFSrL11 zK!oebNBgvO{$y#wxzY7!+3EXGcFt~iXIMz5|6FD!!SM#^V)s|f&~4u20L~yp?P9@c z#;*cX7dI<2)e)oEXz@sG=fy0T8Kfo|uBo2pYFhapzDcuj*}WGU=jSTA80L6X;0)`D zQN@!^Ossp6#KIm{vKiOdUN7*8Y!VnRKaeOFpUAXheDko}b$K`ng+73O(2X!S<~qE> z3+yF)(5fyN?F4^y)z&4Mx26=*7J7 zG(sS691s&LQ<@)Cn;$OEK;Vm-wroqdGbd$o0r~#&;zED|g=Cr(jL4%rf%>l8Pz3-kDn&=9k zz&G|T<>P~&K!XjQK_M$BJdX)4{GqP^73&>J3LVlH;kDhj zC?E@W-XlKol$gWiTr_U#hXP+*``VRQ?EDdcVD^ccPuEW$-Z+b zq;7R}=90rfO;DG5Kgg?KeqXpZl+Y+h++*f><&TT>?_NvBFyy)7a4O%LyufGZRIo(;qcU0#r6%i3( z<71Nqrn&am*m%ZPY~uAJOy~*McvV*k8MgFUs|pMxuPdKsEl0Ba_`!5z#PU*uN65R0 z8C`e@k#kYJ_1!{ZVpD9_yHyQp967y~#YMA3C1teU$=Lu}TKw&JyHqrkejTvX+*f0P z5?Y3W_*$y1f#ue59erK~-|ZPT8z{zf;l+mf%w`=7iY8cSEE0n#ZcR?v2%cq*f-nR4 z-bbVQKG^!ykzV*hzd}$Z z!m|P;X|Otr%i96k^LOQ7&@nF8OAYInsAIbwZ5>DTJ{ zyOmmE3kw2HHD$ZuhT_2?CDj$d;X?#Q%OkTYx_VCC$9)_{R%6DSjn{AabGUAF_I6eS z?;8c6ykBaG^iut7A-~csnY6iT?mm-1=KsSIt1toQwid%X`_<$By!J&vjqM;H%w^a; z@ssQgdWNG5^=Qv@Xh&y1iP4eD8^c`|-540Mh~;efMac8>LczqUwJ;5nA3u&ZDw}QX zeRnOXXoBpg9O4_XJbw!qUkq7bcr*t^p@RgZiRK5Q%p$}LHF3!j3=XpEg@oz&P5EZL9;k&#c9&L$RKH#u#iAyzwzyW5bh z6M3hcx8FlM*Ef{qQ=-9b^XPcf_}xsPq)!E8s0Zxj{!S(Lw#{1P*zG^l-CJ0|Dr+XIp=Fe zzp^6hEX2@*i1L8leFnVIyX50q@s8@mmt8DYunN4h&ZaTvS|@l3$BAq|KIZE(MS3H? zKq@S>;!yq?ubPOL@oiAAj;*Xm_T)`uPt>l1&hP_I<#s*RgKVOD4(qg11YR9_xDKyWXQn6(l8+$LD6kB1g zW?0h5x~fb)Wh;GTCQV*eBp-y(B~l4*B!AK$Y&50nCu0TJttETS6l75d5|4&C z7KjT93SJh;Gz14;5-BQ_RAB+jUP9aPsdGJNE$=`s`e|2n2KCQ6d5`;v*{?=G)vOd}hs?VbTDD-@N$xs2OjT3)r^H+TT z(>DLMYse_MS>tCjtX9?hvDm;9F8%Z8U*vxWsn-7Pf<{YB8Kp( zJaI77Mo>+{P_!|DKXY+9iSt;+K_qdid!%o`6(+&fl7-s=%l+0q4Lo?=% zGuY~P;OouE3K3-@hp@H#3a#t>82cgI%0JJ>HgZ^hpjv^IYFByR>rLU;Uhg6icP~Bf zaHyrs2KKIXAyi+eoni^`C3LNBM1ad%N55y&x=1km8f(MqR_n`h^3=ox}a2 z&Q2(b(L^hi9Ko^rl^NDeX)ybPgcUR4b6FvP7mYT(@GpGN`ATU95^lJxs9_vwX~Y@9 zKZCbBHJBUxT!FZ#f5i)r2+zS|Ib`5H&-Rs?9ezxoz?cm`_BZC$CTsj|L3F|t?|KFL zwc}&T2Vd}WqzJ{%jdx^ZKmjezKcB@mGReE|Cat)B>Q6FzF`#MbB=+_k4X5{x+F6_T z)70rqO*fA8VgXT_`Ue_WmVNyCK`QVnnMK7aYuvk73%Y?mBadi%&-%$don7|&&ZNnp z%DGwxhSYnkH|uZT*?|o#pzCk-QWlYm@=4}CClkF&{9~yMtbnR`I-P6h>3>KWewt{p zLb!x=e_0w?U&2Z z+u~JA%@&o3ZpdVv@|872^%&=D*Jm58r`qe*6Dr@5F=XhXb;g1|$B(kmuux{--cCb> z_NWGmAbwPJs;)_Fn$fm!bKCO99N;**^@eRcMv{R?B!JIr6&2~~m~fumA*xd4k9H#D zw$i4zSIAHf=5{YKqF(g=>LA;GNXfI9>XW}Z<(lSul*C=y*7kPDu;yE#AtKCNh;Lhn zHOaGypLyeju<;(-0$;u>|KY9b7r?`Vg9{6G8sXmHo1h zx)u67J=@;Tkx$rP)#*+1hi?+lmrf|eq7X-z$T499B$zL-k}!Nw!Xy|3ctc&dFL%tS zl8IdA;?{eQm{J5>vB7r4`qBoSKrLoPEx?@wA2 zu{yOEi-w*heZsmi8q2gY?+P~p6K*r7q9T^41!A6em{Rrj3sS&QdJ+CO@g~3 z6~Ew)jV4|U{^WXUHm}^I$?T6Wf}_Q0RLIVR5eDYR{bv{%iTQydPy$#TC5cwW&B@`6?h=S5b+n z4I{6hB6vQS=}S=|<_JA8*k>fayRMbID;uw4Hb#*(IWu|hwEre}HNE_n66&QH4s+f2 zSD@ZjGRM;LwwnURMv1dU{F4U%0q2c@u;{KA`~Qra|9nDzVIUzcHdM^L|6u2D=%7h) zfZVGlJc`=?n#7loKe*&wd6*U+qmrvc^Yhr`TsJFn_`vVNG&PLGp@AQS@l5ia3LU;+MA;gwK4*m707e}kn0&Y+{R;a;&!SCNQsza(;-rbbetPzL>20@tE*wt#IrNL!7yJ)#P z(v#&BU(igUGQkO^mJv_%OTVdgaciGjL4TNH2V&+T}2toe2*Qc`k6DAqa{Q>TXD`i*jh<@O7vTaFqiTq zP~?F3e2e?{isH8&0eY-~h5fNcl`+Mj%x1^!lA??5QPC@;w<#UB!85e9ysqi#J61{G zdUW!DlNykcff`MSoK3xqix|dQL@3kQIJ#FSS)?=~xq6Dpuj`%Rc;@%XS-E`%xp771 zQUXm&+6arpEG^RvpomZ*q~p*TghW$dWH9CMX{=G(prEc&H|K|Gl$4R@oG1|F0-NWg z+3(i7tQRekSn7H{J*{=dCP>}Yq0~HVOa01?Hl1xL)D54~ky`I)esOV6R$pJvQg+t4b*j9-H7X zK%V)uC(G-;8q0fJf8upHlmAwJhbvL+!@4Uc0g9nXg}bO_MP;2m&x?crO8jU3BI)Q7 z4T^Z}tq=PBjARh|PEJlW#^p_07G!gHD zg9f(5ev=J#*HF-4nsEjyyeM{)^bU4hUY&=M#0)X!|Jo?xe}IY{p)A7xy-=Q0AfyQy z9+|KDW$ME4s1>=5xu1w2f1lqL$l5CzTA1bMHybz0sEQawv<*?CQ`rXj6pToM_aUPq zn`$Ewp)fN%11Wa%Xz)Rogw>V!tc*6xR(s%(k1g|Q$9zT*8l)7t@-VBLC$nEhz6e2X z-c;L;5UaN8yv;M9Dp;?C-TGd)y0jvSB6zP5?GZhSxhk%4e5Gq1eJ@JFDShzYRgAx@ ztLb&gXy(BzHVTQ)tnHWBcnJoO^^>pv@SA0wUxXZ^-UVa zvyT}+^_nZ?lQB*PWN-5CS4h94rN8_lpe!t-9q~4!hug<}e0Xq90DJeV<3Tjs943^n zB}4Se1*FrP5p9C*v7ajDuQ4HGYcoNC+hEl-1d+goS~deK;P!E4=nL2Ks`3n+a4`bUWZit-jNc zm$f|9X&0WIdH^U*4*hWB^N$kt zk7aA*@akNb8C0&8gYGQQ*OwQtrF8o3feBIZK>hQSa|O#bD^~_uEQ9SgF#z33WswB< zs6CuAeQ-s9TmiO8WxHc)yS}J7ww$&H^sH`fCB5Vg ze^_6EZbF-U7Cgc3Zg~+yC?{tpIW1{s_<-a>K$;6)fG%okx1S9cr#D5d9*gpX?b=S( zth+}SQ>zUH@6lw2HsY!xVTkBUx+yG<^FOz(DDYmV@2)2u@v*y&N9@^k}{(U?1`IwWBvn@@*ahD;D^@{kT<$5ht{{b#53tSuG z7yJ1{&wv1u`@8#S4<4lZdl>Lii;RaBjfe9*#1ABM8dS`P!g&Ey1dWp2k5)?)U0H!V zXXmQj(4-xOp;B0j;sy~oGP-zPhHPKv^fS`MCFb&u^-!%TRciczIYp#g)IrVfR2KWY zus}eg!mOf_jHDANjqQ$DF#)B>tr^>dx~;W!fctBt4tQ5y-TM6>1vQ|6qy^rtO1aSg zut{Sj?Ieb+R;9*_)Wsf3?}@Jq-{@MA{a`W0ydZ^{N>(RpvX^#aX}=$7MuSu-yRuam z00N{LfcR>ll!TG4f5PMLf!W?78YkDioxQtm*ixHdldqc%G#Vw%1bwo9Khw zcA=UsH_{4PYA5xr<5qnHnb4S3fKic=+UxZSVsJK6VD*}|iS*FbUW&+?(subIrwyjg7*O;jk<)chVjv$A1ONu208nzFPgEqJfN(Mw6HGsF`BAVxDtk1Nv|r=#Zk`vEhtWa0VrpM0&FNf_X>`OUt6;5sxu9*taD0R zi6MzCaB$3}-`qn(k@HR=!HYgTx~P2Z_O6p%s_Pllu#4Dq;y^}5HW~^)A|odYYkmw^ z@S_O_F0VJV)$?6U!6=O5MiYZScuLBdo>_e_oBc(}A1b}KuP=sEknsnD&8*7tm-P~i zvbQHhopaFxnz{yMFUrv$2dh6ofNqC{Fn@%Tij)(G3h_qht3JQTUA5^Phfp1Pc!Z?7 zj0te0wFnz>!X^rLrgxC#nm66*VW)`j=xHKG{x2N|GXubB;oL%oc>kzm|B$UcQD8+Z zMf4OHMzkUYTez>_7AwEQh1uJDbwB&sVLiYP2cg;wQ&?8yMb7$_`?Z@F;0V3=p0u~n z6bx{J-kqVaftLKfg!tr18C8j0_&IS$k)QBKX-=p)!$^TANWvB@}d(OBFHbmA@+b$9aouMyp5U0@tfGL zmZ93vP2aPb#s#sLbblKcOZvJ48C-lUR})X#%i`u_U@E` z-N)4jHQ3r;%a~5Oib<&z`dZ_Eh?$<55DEhfFiAn$5P#MA6=OqU#YTP2k(tjDXJWXR zSss(`l7{@M@}f@@IJ-6F8VJ<_IVpSKcZSnF)my-s=?MwUIef!yQp2FnBZZq}bmCf} zC(&y%H7G)ovSCY@lN^2oyKfu5*f*ROrX!x5uTZR$fZ-3^@;#87uX(aA|0;A+(mIcGR))&Vb z4~CH4_G=m&mGWD@*j8FC|A2y=4giN{(} z&@p-S@UL=c*~*&8bJk7I$>FhAE1+iNM18l%PtMU6htk>HN5=m0YqRq6#r18$cl)aY zL$e=0WeBdXZ#q}{SVWYWQ#!jL;jE%B@;!N8%0GnY(du|M`?s(!6}9A~_0+W4wC9hQ zXU6=9brPK)eA+68SbJEkDj*eO5tpgRTf_xsaAE+q!ShSy%?_!X)s9K;;!|p!Yg5AZ zVoK1Rbxve7F46IO;m3DcP##E_i*PnDuni|#C;=*H## zYgOk{hPdsFY=9QVj(5jD$GAw7V1&0R9{U;V@;k;xZi--tw!LvT*1FG)`{=)qRFToQTl#}F38gNjOU&+ z>x_oe0R5H~mA3ZX-^c&1(3`HTrt@D5f9<1xzoq8UhJaZXSFLpPQ;kR2EzWx)@CFg~ z5oh|G5bg_bMHAl1MHh*PoG{!ALlJ4Na!~?TkTvEi1nYyMSe!#YAW{V2f!+j`^!1NN zf^`#9!zD>@*GIN6z}P>-<&rph$p&eKd_Vg0>b@?dRM-)>qmuM)m_xVRdihr^g`5-&*ADOH!j_4tBLEKGx08T#0W4n>I!W6>? z1F#o{S2uBteyL9;!plT9$MY$hl6sdxw5PKzsTMZ0_y`K{tGC*~P3(5P-D87+!0P|# z%JPdZokjY!h;+lCgxuCW;?3qeiRFQWEnI zHjl)VwPn{?ZITZ7yq7QxW;snwY+$t9Ec#5NU{aSXRL4!a%L*hDn-M)Eut>K}ZS6jJ zInL?PE<=sw&;m?8UcvtWU_fc=6#66Nf(#Yj{vX2GIt!Hj%DL4{;?e0tu1XlW{<+MT z7W=?VSU&ukNENCW1oxOsgnNYKq`UaAzD00&`?n14)ITmojqsJ-TfENh4`?)+IS7Huq{PHVn-Z-J zMMdARC@49y;zucolZ$XimpkokE+yYPg~Q}(Wjr4n9C*QCdtQ!XDi5|2UHTIV#Ml_V zlY)i_L5e(DSk1;e2(0COEuT25);eXp2V%~D*CQnYK+r4+BYpV4*5xanS5mMaF{Q6V zaG>GX+RGb=2|Z8BMlBeBF_|D&LKOi*y`N0kg$HnsPA>91GO#@)1>sH4mFyvbPR`AX zMNt~=ht#o`&M+SlKT2uMQ(6aprX;d~E1S1uB+C0C)Aa;Rh#(Lxq(V47H6yA>1Z|sD z>nT-3AuX&%uYq2d9%+QCAycsL!oy@+dFkD=Q2YJyqwV#~5!vvZ7F;#Qouk0G@++YQ zg~zJnwFX<|o?vk~sZ&N{-~JQ9J>CoGy$J3)I#lgf2yeWju!67g_X{&V;#heZ@rD5e z%V_cY0oUcmkMWe=Sw!Nqqs<_ELNF+b{(YbxbyTOFO^=>6mT0n+fPs0t3P1CffZLkr zH=9QTp(^tv!E%sj`AgeYyw4GF+N@1ln@5HiyPkQp%fO%S|6R+xB(;bw@;^$_awveV z%$e5rssC|e{2N_05u;qIlS15SByY~A%}&4}Qzg6pO7g8gj<6vM+Kw9JRuS@u!^*_D$M1gC|l3^wzqT|F{jEEdg1Y%at_**b1_$QtGtIcW&t_NXp;z{ zQ$d`)$b2~UEnCoxf?qB4d6cQQEzgBsF=T?A!HycbVOB@oQ*EEic z4~Cc^SbK?X>cPc9j^z0u3TD8^5k-O{`#^mgk>T+sk4jZa+?uI+Ntzf4p%7?s+xKn| zBJh_;h z6z%aflVp8YHLaTJU*OG*b8n}f{g<2`-rlYJqsfH(hC2ZoAEB>tydmzo;2eW8MJ&7H5kNV3^!X6!F zSmiL!7wU#SHyRp-^NVvlZubfQRuRHbtsh{NFQQIO1^o$F(SWOTuSqW7!HC;mvqm)m_q|L8R)}^0wsfr z20r$~#Vtod!<|vg!vnS%|?1f>6#8bI71=pt-0mR!c#s064>e)r)FK*t@fG zTRFt)_0-*J=Hik+kKnTSCXV3w{=@sM?OF*jtyaD!_WM?53xu27njHDJaexP7H-j=g z=BDS8r=sW+1DvFoDV_+}^}@LMx-nI*N6Vsjcyn>CFo(DvLsJYL0#r34ZhfzBT%;#))AQq*@%c-}1u4(;2?p474gDOzkl+*z2B~=s7k5P9 zx2lv$1OKQKT~7?}LqfCcj+kY5UsTAc*o41BtlHiTlNp_?1zsCat6W_c6PPMVF>c3 z62qY>joJfZi*|b?q&^AJ!DHzP-dQ^K3{|$x2fs41Qtor6jy#?@Pn>pX+Yao-;Z&mu zdGRiyprRtX*6Uvh^MA;U=BL$ubt$v%KEG(DoClHSP+}XKmC6H4E4(I)k7o1zz(nFg zdglol6(q>KdJa-;u!G6-3y)i!rO*8)AT+heDKdg(reNJ3i_r1>UNQcYjEmZlve1h| zKJVZb$)aJ;uc?^UHaC_xuA$|B;;HH(p0EM&rRvg3 zC(VA=Oq!BWw7M3~c4eB`%%c)KkSi&NCI?6`r#McJip6D==~b3Mw_e8Uu5=%*@}$0D zt4s`v0}A4Sr(B?~1U0OwCND0l8(!IRqYvukt+d1@2OSE6AB>}%g8|IWURqZ56LPG_ z#cz~744_il4d{Kk`aEX`v3TFtH>v?lxG71R}C7aB=H{&?#z$)#HPr~EY_ z#30MUwww^~d>Ot82qs;)FAAr{5MWTIuvb^MvNL{ks3fTc`S~HJAOunNuWQ3U7%ao< z;QAdhIk9eCUERpISi`=VE=!4$eTnUsYEz3Rlr!RIX0*GRO0KnZ-bvfC-JORxG%C-^ z_I5oyKCWd#jYa$$ecS)Re=FlTI{$&NR#HKL5Zt!gE5;v6DsmDV1uibyC$E3jm+_k6 zex>#LZr@W_Ql87K^#tGcyeUtQim=j`jd#MJ2R{*c+5^zptDQ6MV&;LF)BxKz`A}|# z=kHQ|djpnEl&%=@a3#__z`J?XOJi-dIxAwq@EGBYl$L-uD3GI9Y? zu428Yhr8OQ9-?8h9~q3w3!hMtHSH%(=Iz7z>warzhu;l=?6b=}VQ3|P6f}hq2-lpa zca|VJ{QpX$=71v4w(jm6cXs!v@ljpEz1T183FqEpL1}4fn$PO58*VX9-K5Njl8ot@ zOhkg_$~7Ef0s{$AK4BJgbs_iuk}nUj1cpBOmM^x72L*V0d#@oIOFN+>cz60jZ6^tv zm>{E|>`e^Bz)%unMh{+bkY4VZzS<{OPRzqW*5GPeOhhuMEIXnBYKZtZ3%M~!Ij{~H z0d=61f?ZL^y#rNP_F9K+VzVknVSB5m=Hp`x5E5nyS>62f_i|Vw{K+==v1G;lo523R z7heq^@iCiUT@Y)Q#+fdDE?MmjBSR}kbnDeq2Hy7}TW8G3ZsI&LYZOH!%NnnFs&nf9*DTe*@T zoJD{DIP%iSLoSP2zb0ISx8^LnPxHdRZk=rL<84I!QQH3G$A?cYe*ez>`NCyvVW#&} zhL*9)v9P0}uZuB<<%TiXl?txi|CN@ild8zD9e5k?!Ws5>J=kJ) zG`sQ%IVRU$b;)RdFuAWDsB)9RC@Isu65agxnCNZWf(>goqVHj0^(G?s1bTFFU=t;^ z1O4EL^7ahJ(hVrdF{9tHcq{)hMe5(L2Il6mg@#IIDyG;^0=ZysR%4V(_w$M*8h9*|CX|~`FMQ! z*X{<+=C8kp41i3%J-0xP&kH2`K>;4x^_GTnSU3fLnC)R8RhqxVz{=Ie*!aj(l!B_I zKlc4iflBdjzM7}fT0tQtZj zQ>6i5DW@a$PO!UIUfD4gd}8ZRPu7s(pG;29;g$%bJB$p+oh@#!fB(kie&u=p0ZxBI z#uxnc`t}+KI$&I1+n=ZS1vIr-qEG6E|DmeSa4gxlT`vlyOOW^OpH43{_NB5Bg~1;O zK8v^vTMb86ML&fzXoh!BHaiRri#0SDiZs|WjRH%7kEqqW_v_Y*7Q300l2=;_YH$$# z;LPJSrpJ%JSvE0*0glp4lE)*0-FuyroH`1~D)5I?&y8Q~43SdMN;G|hi!n(Mn8biC z+m?Q2=+bFld*0+F*F)Qca2En>puZk;xfq~#8%MANLeS=Yuc_%h7lA0zG68L5-&LxB6<1!=E z6w=b^3-5%v9wr|9Oq_O;gnQ>m)VwSW>FDOU(I9705k!~t%43@b(v~lG>4;ezPN6VQ zTE50=1SC`}i2?FMri=LkFACM$=~ZSvkk{&<)xM)33^3%c08Mj6_)*hMiWN`oQlHp{ zBozENzS1`T<6UBKr+)nV;R4TEivPdNv|{muUdWxEk8h1aJ0*PiZ>tPReR}w#v7a9H z3RzyKmGSJKZllm5!sgsx1In?r8fJo_U`3-dKi-RY$3%8%$9OQC|MaRvR>CUESU8~7H89AbvA+Nk+DN-)>VLH!Q1f+ydXT8S?HA4W*Q8Fj=?G;o zB^ekrTrjV(Cr;@4h>R9PCZOp*ulQqoJVCVFer0zd0GNkpT~6jY3kqs_Vznd^f@Ba3 zjDct;Y8Rdn`fh;=0+Lh;Erc-gM^PBp=O;3|4Y@`4EiBt#*J?$D`3bG9ZibS^q;ZTl zG8#4{WvXl$*bf6^``axpg?StJVd3G!jb|(ne`A|eKY(+L(#aVDZu!6H;lE!DNBwzP z1O&eZuYLl!kK^7)j}!7OAOJ2+Ndj@ePyLXHS{-jLE-tDy{iNioo4W9XZ7?PssSel( zz3Bi4$<7Q43c5x%gyiGL8+i{4nvWNBUvWKazY=kAX);3K<8gv*)X<@MlB=jE9Dz`0 zpJbZ5M8nC}Q;wQ>N1l3%=BnmX8@^2{jK-#C>i26mo1j|HN%u1Tkw2SAn;Vj?P^rCR zMY2(c`%ss$g~CPn!)aVqB*OwHZeQNYMT>DYhi;DXl80SOu4I14z3CFTuXJReiBO7v zlVuxrfD}7<)UJQUm;a*WX);gtCDIw&7cEtJFSstwQbhGE(5Bt4Fk8U|WI1gjk!~^+ zB7S;5y*Dt$?JLCDYBbShJ17-WFc+RqQX$U&3A`>W{j~d?oML##!0fFf)Ax!H*z3Pc z_IY36Ni+Qn75n=O{D&aCKn;Tttn>l{{Z}2&X(;u+%B;znR^mYVMi$=T+0l35 zPagI{=WShiBHi?E$Atutu-qOV(G8r7^aCk2m(ti-zg)C(W_N{}pK~(uVz2zRaX#yv z|G2I(EUYgMP50PT5@V@#U!opdu&pZ=4(ELBra4HPOD`C``6f1^F7bUsw)QdIBeV2) z1_^=l5sLHtHzFz1ZuPivHiYx~*yHpmkQO=kX|c>Ki`sHR|2{zT_2|rKj6Pzdkm@Jp zXE716{8AK?gZw4#eh7riyY}PU_*v>hjL+FQ0pW5he%5~^c{G~XDwm=C&_Rd%VZdmu z>*ntIrGU9D5jy_uzhS~2-g-YD>|PejV|+8c$Dh5$G?17W?2qY|isZ@t%(-6(2*x`? z=i>_H{HMg2#YIJ#$Rw+IQtlIj0OXWWSC1az%!oA5`t^(daA78KtL8*&SqE_=QvH#x zVXzfGfq@fQn-vW*{H~>|mixkOWqMkIASZ#8l_*S5pk)8){&M?lPyD4_({^+JyFEJk z_SF23k8ppNFZEPlQ&Dqu?qmOl@?{7)3q}y_6cpFRLa8y4+HAEAmQH4-?uycNqa-EY zW@Zj9kv0~Zy`x>BR-+LX7K&Bg>nU*OHye?>y03VR1X!K;&#dpL7GePXLfOVHSbN#- z80edeFmJuowSC6AEq3-@80&bp7^MBt^H5^gH{uXg5I~YgrOpSMs6w>}sX;Le-x~KO zqByu*dn!6y^wE07MA^%*ZZzk**rc7wKk(%Tn`S}No}Zr|rUHK{c&8z&e5E?%!9OTk zj$S2kFDE<*R~pJ-Mt`rUnkB<Y;o<7O#ckfC9ssw(=x+*}49|F3&NX3ZLMBWjWbaTY?e*$!cez15~Gn7w8k zh-a)*kq!z8VO|e|p}Nxnn(D#+VFmo`^i@sOPILY`#=7Yl=mI=>^ZCD$VU`+ykm~7t zw!uI4@_+AZOK1oaxB&l!to`{H=7WUSN6BXUTNtA~DhGK!>)>J+Umw~-6Pj_KwFfX! z0d-~z*S(;an2M!f%W;)eR%@bl1eW$sK|J;+*JOadkv9;EHwdn3FZGrS(QsX>y$=b@ zM>%4W-;G8g%#O%!Mt9zC(Za*AH*CH{*2>IdJ)+WRlTR=Rx7_DK{it8*C^G5RGRLat z5mwHB>#=V#I z!;HcwijDCi9}BWuye6Eoq}&s>1FrplMVU`C4w_B*p9nrh{&(S0kMl$rx7+R%Q_`<^ zBf%Il!Q$ma#A-!6 z5`qRcwh|fwfDK5Q^X4>N{5#OVq$CFPel?FZWigz7{F6$<2KCrhbH!sS zQdsT*?yogxb*U095xSoQVyS6cg@Ut9p43OpB=h%#MxCoF{5YnKa;Dl&2A7L*8zuKY9-sTdL{u&Jsq zVeMvD&nORSQBC7?_Z)mLHO1qRK|ADo1g6Z2A?o3l%a?tV`&f9?1^%D1v>fJ{6N0;} z&#~-=Y5R&bqQd9xv~!#Nggt9!t7nyFo|9u`JN?K)OdM5j-loVXEx?bDZQWgKGPm*x zjX45~)EF41jYeXc?ZS?5@@*3xg22PWxl+8krhs-shMn{A7>AV09or00hw$$NY3ikJ zP!SGZ(D!uO5XF%agFR~k{U!YP=D`8Uq2d~nP&plifW@RQQ2Z;oHu`$qZUDs%UIE`$NfKNRbb)gMa%2!K@AZB zI>1a;aLG#5biH5(+E@iC?pp=Lm1H>*SZO$8R_veVqY8t?Mt3GRQA~j5u=LTrv|RY( zY@N~a^ZFATDdue*>}B*t@zU7c6w(N`>Cp_Ps%J3B7;UQ9ly0uCZAR$06Seqw)^dTa4PLhx!3A`Nh%Mf}~m{t&nhH zd)n}j(xEd&D*R;8SJOD92HBQR^TnD5<$Wr?{0j>hMm@oj@2`O?pXu-}7GML|*i?ZQ z6#vB~HDyZzj|@M#H{9^Qudd`g=waTylee|S)VfW3x>Z6uyWQgr&>3mbGYB@(BD5Dpk4+6Zll`5R2=sjK_gF{1!fqp5CJXNt4HC6P+ zwK~GFuiHs}wX{t3rC|y5TAS4mg-uQA#>V9LJ>&%2dwUh#?C0kL%d^_Q=mW(MlYoH{ z$TPFwtUH|V79xQVmam+g9JwUv#a|h`z9>0Kc#~03q_7f~(EaMV>!Ew1G!D$j=>IJC2;}PG49R^nyod;gl}@I| zbhnk&)Zp(QA8puO?^^QXxvyKXfKf=|O{41+y}NX8@r425H05jG7vXnDQy@#!sw7!b zLN_|L4@uZ5_g2dBTG~wnCend@LcwCqzk7a)W=?K!tWIs(^HE?rC2p-20 zAV}fA2Mgz8oIQQ+AsWdkuEy`F{d((b{0IvJdvA>^i3#r(U#=>hqH;`tPj#T=b^`7E z+(e?ti9cFg(bTz@p`=qt^RgFVWUHreU6Xx>37>#!nO0C(`&IfpOfpgUs6nHow;4J+hQ#2;dWM=!Vn(;$RD`$z(xbpw8oXu zY~G!d>U&hk_K5DrEM7Zx@P)LML^O=kMM@B7lbaDG^M4K%gs|1f+{Nm!9}GoXVWMslvDOs0o8bEFVTmlhS4dM<|`*uPe$ z|H~;_Q#@f)$=z`1l35pJ2wKITU_r5N1oum)uM_6?f;>Ndd~eW%)c5byC}xXoT38++a$EUg0)Xd2m8|QDz ztEY~cag2oyPM?#y*W-`!TRoKuEt2CCgER*2P%29*V)1akFc(=IOkxtvf+6JTJG2Wb zf7d#HBRVNACRf}Eesd77b}H)@-7Xo6Dat~4GPRZxev?KEVn43IfiM7l960;XlwY?# zcc)?QJnYUOOaC|jnNKGr4?F+YEC7Hd)f zBEz*K?WJOzJv3TRCw)k7)nK}v=XE{-ROWHD3YpC(1|k_yA0~)1=@!XzlQULwbV_s1w@@41bTSna9|r(b*#l{f$Yvo%zeY0FPW> z{whq(Kc8ex8IOkQ@a~j*nr7Tyu9GqyE^l>H7R3e(Z%bP@T47`Jr#l>+Agki2SH-$5!tMULf)Fr3m_4e zT5BE&B$!TE605gh=E5oA8w$<2HTMWGB2~ZYD7DBh+lSxm>T|DTKNDfQnNAu->uv$) zB1aEHGcX^7BtD7UaaVQ7&jPct?0QQQ`&ArD*zL)GeI})T>fFMXgS3%-RTVl(m1l&d8w(AwdO0|cBTo& z(B8k7BCCo@r8pH~Wlg!~s!+@(J(z2@TZ&!p_0b}=zB#sHbGpd1#uO7*%XJi460jsZ zm{mK|XU_UWBnGCP%;L8ww2qFMQdsM$Q~4Z1Fljfp@>7QZq#Ol)I9_>--o(Yv3Jf%y zc?XgSA~pQwpLXa9LKEfsLSaumPK!XAn*PHhsy3pJ`r`L(XG50 zU2C-^h3ZyD41$51`xUU3ZL=q3g&{O^2d8V5(0o{Y6ss)Of?PEE<;99&Ba%UK*D&ce z^}9P$W_NKIEX$NbcC8{*$Ab#SvcIWqR3`dgmQMf)V2=Jm1fj$JQxy9zA|3x3B)xd~Fd?Lm|WIcKMT=)B)2fnsua{H{$u}vGzHi z-RP2$S>Ciu*)uXw5@>8Z@Or%+6BDqVD|iW7v6Jg%pI%rk_T}$*$gr4@bnpnZUwHu$ z#e)ozf$nNRH zuPXtuEnyiRp4Q(%Q4)F*t>9^OQkwb{OT&RdyF;pmuAQv2C-xAJ?1S{N)rv)qE{LxY zHS4=42`__>y8Bu$MV0bGc? z6MmHf)1K%1gV}Xm6ATdpMHGZFN*eMVaKjZdY%xewo1-oFht^ztQLSZ^jedS{-d@s5 zE^I+Qjd77G_vtBN8h;Ayp)3zkoU3G!ysjij2)s{b(JuWxEZf|ZwVCckZvLiAapC!da{+%=*i zFfu4irE^M4rw%~esLHVrc7d!iou02dWZAiokU)czc_lOSf!OX=0moi zX9Nf1qaw6rL6L4^*4iC?Jlr9(me72Ur-K4Q2tp2zCGtiGZGQOpu_|y67v9i1u4Dul zK&e8CoP%jCl{zo&_H^6QcpOL(v5i)MeeVb~hsqFttJ9@>+GMdko@YOPXDbC4E$~EW z&VJ!4yd1vjxTQi=3p$U41-Qh+{{0?~ydAZAV<@z&NgP4slN?6^#I zt+i81YGy1o)4!Vc8i6E7z_Ll}gxX(40C>wx{8b(hRydf>T1A^~93LI&SrOT6jy0UO z?z!a;?rXNX@MOeU@etUrLK#aOzj1reY2xaH~C5mtKea|J-J ztqHZ3`?uVW*lq_M*tt6X# z&gcjBlX`2I4F-=+*hFxP9jv-tW^VOHWna1i_=AoPa6&lo_!!z?bz z3TS^sdH*p&Z)3cJTvh=d<_qV=bA_zN3G`wwrp4>NL0qTMBBhkHUlYmx-0LG%&+eAi z6CyB6SJk*tnSbo*94&Z8BjX7lzQJ718+%097r3tTk#J^4Ve)zHzDbA7VhZIvfrbA0 zqVF}L{dX7+#f0o9_!2_cf)Jln_p7=`1rWP=YfLwpsIS!8{RN5Q_{0qJ3a^^ON^#?# z{8)}WblZ8CR;>6$huaw*YBv3XCceyOD@rPV#c_P?= z-u*yB3H1~?x&*p8r%#;_GU@5MbNmJ-FU8#x8g=wi4x zsuoux<>(m8CM_fa%)Q5Qj?u!!+dJK~L7P;wXe+!S`MtKiRKJodz;Myfz=8Y)D=tAI zw9PO(BjdK8OVnEZr5vp)no`i!=5QK<$UEA(=e|EBBTvNLXiA)h69DI`gTv~4YW36SD0R#4HcT|B9NVB|fDsHm%~5Ut$vMH3HsGtD~V81OgIFOyswRN^2oK+tWT zNfa^!v}?b=ZMm<8w-*+s08};I!Jnd-z5=F%MOj%wa7~AIPGPXY@suh>P$CzhVwmCG zRHEH7%*&Q&xAY-cS?K%w6K=~Dm&>~tDjc=yO&^N7^6&d(fo#A+_=8*aQb67bEK9SY z$S##udPla?s`$FWD0_KR_+FS;vy6&V7)J*5ql>)0)0ef|6R}T}+qm!RSFU}M|6=Eu zApl|zXT&!A_^;*v|CzJOVVx3w{0YiD)p0!(CgqE)tND{%9E*>G^tPMpt5zG4{oGPm zt7BbRIE7DYDjc5@SftbF0f**0uy05=#?vTGMa7&tEcX$Qzg^AXZ~^{%X%;T(qe!$( zkN)1?+6(gwPN%!=B@DM{NX=YjoB^VmaG+o z_6)_7z3H_jezX#b zfw8rW_NO)OoO^gwIocK^EWLnYn}Ucc#~~m5oGsF*F}3&_Ue?ckLIUV5H|=(?0n`Lh z=U02{`A7(0h5Rk`sbUBl+DURd>?MDF^zW;*jw*+;g4CS zvoX!%DFXE_paX*OiINYBLkK2=_XVS|mO(2ht{cVhd{c3-PGoU)Tt>Xh<=DxOL{TZh3IpAd zgDEo5S0IrvTxN{3z>l9jRxPGBr?^-lOjuIV&-zoaUVvemfGLq1sGWK3>HCa32my<` zJwp)I&US>cq3TjL`LKk`pg1oFJ|Oob5xD@J_m*XMzoSa;<^84$8<3L_8yn0I6%;2m z7_mlulb-Evk8yFMJ@?>c?z~&nSD2=FTj6FN#_tjf!6ld?8C%AjSewUKi&WL zIf`US3rUZH5LV4U7Jp< zp8yxJ#=KQ$F&A7VJvzhTnOn1>sjFkCsu|6g|FVbAzW)>{M~@a05pm|I(TgICg22eE zuE0lTrMCFI;UUw7tJ_jSA$CyF;Sy*afs+|gZD|PKLe9uMJz*owAx0JU(RNArB}$Mr zMWHjCYm5{V-0Su9&ddp;;48oOb6hsfbu>AdXETbVtn?ywnF*&F7eL;kbpe#hgC4QZCrIf36 zuyua(gFj*@JI}#o*iaH|fTr`|+!dV%CL`w`XSA07tX-_>DN65y-1t#jTiapcfz?8M zCWY15#f8o-4MJ$775WCV_>fx04i|9m#{Vo!B{l>W3qWbFKab_>g%0T(ck!iK3;f_;UZ@3Ye`Uv=&!}+i&smOryVt>-C2Fyo`8S9E%Ja@icGb$@9 zo1S79xOG)lcdGOJ!Lfuwv1v_E&JcjuF=Ea%Aa+dPjRvYo<<1ZrFH*0ioW=z{rb>a5An* zd#n2>-Dq1)E2dzbzLo2v28zC%7!pKMT4`I`RxtBvpSwg-DsW7Q zAWi2#GIFiH2SHT5*nI806KtClS8I8({Q-zEajMS~KW8|5BJ`(a80b-{bQELUj}fv@SlVi z268Rze^9tf`8vT}Sz@T(ftLHfSC!UiFrD{dY*FAUR|UeaN=={K)^%?uvUgag`=luF z<0A=wV&G>Y6{J*O-d}aabmRwbLO!e)ye2W3cBDfK|0LHI@I}eN#N9gR*@SnWI??OG zBNK{@SHkzcJ10#6{@;V=!7pWE>(1!Wc1hx(W&&w)c=XX z5BFO61=lsB>I9GIAPFq5yO}e2$lS*(2oT1#T=nuFHn)Vp{@^q`NUhXC-Z1CEvIf6! zy3=Y`o`F~!$+%F*6aPtI_|MCj*QOK56-|!DXXpR89PM48=@4-$7BsC2 zefuA(6pH>PaM;bCRFx$+#IO82NpG$+TJ*>m7QI>^KiYul4-&5=cLMi}S=G9{(9 zU)iVa$vHlbtkdhGm|HT=auwF9YT180t9$E}^HpCzU9BglyW0!%r{dHI1AhfHZ-1w= z$bBv3VoivPV?2e<4+Q%9>i6V~AoHjo1Y0%lX5HZj(<25S9nnv|Kw=4^R8!}T_p z>uCuYD#4gp@+ja@A9@S0Ex{P)GSSK+1$S;=(8jW2%m(=OdF-Mo<0aIuP(Y=@Cwf0EH|9I-xc_D z`YkVyOx)#qFMXoce-g?GQV4@QrUDi=`1CC!2${%Bf)mqn#R;96zPkh&1CBXK1=R+ye z?qj&RFss%(A}UsWROV}0L0r-pS063Qo(HL)jcZ^v%<*z14|3xC+IA`U;GI?Q%QiTn z_RuWsH~Umryp*{;+4F|;OXhecpZJP(n?K)uDubMZMNhu|%(9}4OfB9-nYVj}JX1|V zcobYpo9YvpURKsAJ;F}o)#Lr6yp$o;iT5+iAC!EZ&HwN&JQee^@3??B5$oKXJXs@W z=$**Lim6Cbo&sKDNo=&l`M2dBa#~dcSwT8G&CHQXF300INQyO5ZwviFQ|C0#wFgq{ z1hYCW__*f3@m;h?g^H8TzvDiVsMo95V_-qiT5$jTJ|<=%wb~xv}m`Cz4Wo1 z4u9EoWNmiBuY$xTc}BOWqb+;0N-LR9UofSFa*qIE+2p%3Ke zqSG%6+CLh#A8EqF-XEItzp%o<1piDiKSugR?Y~K+f`QC?+r|F*>|PMaP^2>lMLJaS zZXp7E-Gce?8(%xJZ|vm1Z%N-&^hr`EPV~1m%=^Y;%n`X55lAHhR-(<)h88=GCCIeN zj_^F=BO|qY0lW?)_~70X(OyO+CGv#WYQ<2cod@6KUQ)ZRKqbY{)sL zA_Vuse_M@2Lm$xgBJ)ILR2C6oywlILv%^KVkK~>Caw{^wCc=>quGn`KwQHQQ{55R{ zopI>S=-cN>!+!RIwnN8RClmN_?0FVaeyUsk4PNdPNd9qdR#QP7NlE1Tu9Mf4Q}**; z3b>3I2soAIF!{S04U*&=4f3fE1V%rdZ}d3C-YGoy zv7pZGS;=9Hj!2O-9U?gt?J zO8mGVaWz-QiNB@-FVXn!q?c>V*~esbIJD=o_Old)icm3!Rxfj8rb>}ChIC-o&eKiR zBCc1rJM(KPk*ONpnQwum8Gue59MZ8HX%_{PC$GP?5x2J;Ql)Ew<{i_slyqUuo>9>dg? z_v1&_S?wQvOXde@8vJ4;Ij9cREkc}p4>g}b+ppJ-yAjt+(Lfm$O6KLS;WhTf;Uaq0 zolhUQkuwdxFX%l+6Y-X=n^-tl;=+#6?7;>9DgAFbt&}O9IbCTVcWL=m?)~5%Jt@>t zNY49oBNGX$ATCe<=Uz8xT!}OfMM?z=mDfDo`|uCCITi2vjE(jlP{=W#_~TuYp(gDO z-f*=WNA3IpXb!bf!Bhg0v<*i%n)A#P0itQ17V8(R6tD0wKmKVD#(ml(V>mMQ{CeCD z@1VKhy8nO*7CHta10a(KiMwEaQ&{DGGONcNiQ8>Tysq1}%{a|Um6R@OjgKGAxHvSh zW6HW7av-IY*5j_xmtZ273n!OL`0NXo_W2~BM^X(S?&|3{OF8q-LF7#;^(hsitMWNJ z@;RF;yE}b8J?n5w?|21g>%Cnv6=l14e!#Xl~x-{;E<3c?*8 zqcgZz<=T~g_Z>Nl^LG}`sZi{bJUW~K{zv5Q8%qAp5G_wTB~P3Fl9J}$i^^Q2C#Yls zZshaJFHTS`B9zh|z2lrx$4T*`m6>p9}+sFK=N!ON@Kj@oa9IY2z~i79DoODZ8Dp}$f@!D0LB$4s6F#=r{+ zjmyjVGMC@-ka1pv7g{RS1x5R^G84Sy_ku)?mMai4Mw1-Z@6Er2EuE$_QB@qs-4*cF zx%?&!SvoE=ld>aV5a&l{Bcm)kH>h8mnRTNwa|ihw-haKipfj%ZwNg zz~9H4z_kzS?$?f?@CdsTdW1A!?N9Y3k<2YMg%A(RAQag*!kYXT5RxNdzV7dQN*T|- z@3qCQDFgtZgaqK=-jWbQ2l)K?po@bB*qmg-S3HdSYwgb$HJ~$4k=rl#UlY;AjZ7x; zWE40%o8^)VgYd4GV6CSP^@%34pKoNS$jKzgg9J?86=g%T2@DAtN#A1SrV={6$lA}( zUdSr;9vZ!0^h*tVCk1p+5N#0>6eifc@4O2lGFTnL`n~{=$v+j!@*sXEj>EwtAZY@3 zIU2v}PfSr@9(3^zYU_nZRh3=QE7jWUD>&7cG}~$Sp`kXXL8e14x_%DPej0xjBG+(| z^=9Z4nIE==+hCtno|$;rn`kv+f;C>BrYsG!%Qoe!KiD;e(Djkr?Hbf6Vm_Z(%=bD+^vc)z6y#6lx^^6G8b>xAYm^dbg!}ehHBKq*vkiD4yF}zb>Zb3VW zT)K~~$1j`c<^1umfB;ju8Cv z80{T>R7qkxtSN#RjB8doN%Ok!TIdIiBkko)*+LmgxVJBg86B#{C51p>2ABxndG5P?c462 zZS+Xg2+KG=!Fc`*s(STDL;TLoft(|ti;jji+>?4k z>qe!YBT2}hRnW_1gWuwI1Lf%G_;Zj)u`j6fO)covv^cbBW|l{y%Sr&3&f5rnq7vx8A=ECRqI8NUIIm~4OL zK#e^@&xljkz*8Cx4L!adozN#96^yVU^*e{%q6puuw398Z>a5IC`tgd2S_W?cxdDrF z^{UW5Ny*5})SF|e*4=PkNh#`4@%+NxHI@Ka2#P7m*C@dULn!XqOZ|a$g{{v#M1t-B zJ3)tl8|$@}oYjmjK+mU;#NXP`-P0|O1*P<}d4WJxWI<(h^`s;8*IE-(gS!Ifjb|7` zLnGRj$|dD4dzh8|U8Q4cf*<|#A5PVIZflP}^9@gMQ&4<;P+QJ-`yRFQNOm!b`UTv) zGS5MNVU7F;sz0B}dT+4YL{F6NCl6Z=GKus0Z#z`A2VPF2A2Pg7yb6tZ(8iMfhZFh# z9z}HsT9~6QPE_ZS{;xFv6it{9Sr5qz|9wU=V?{5+&u2A_y4aczQQT`u(xshVBAoX; z7m*ue)BO=Nmf#`$D?+EAv@0;OQy^qcn!AmE6$R6LJBO+k2Pv1m=>=?+JUxsHjDMb z0NIeu1MVt0D9Ymf;&Xpy>kZ7P`dy`#mZ z$)S?IHQjuEJ1*0BWX92LtUech@l^|t?M#-Gd`(9~0g@hDJPq!Al(c+VXYiIhyUI=# z|2~BI=+FNei*R_R$}&5+MWO-ojeTB-w7e)j$@3z~2^D(@mr9M|pUoeM^nnW+<6?9-*vhG~=1g zSOJTN33^Cwcyg=Kr8BvPg%TlM&~X{SzcnnBh=2I}ggfOjpD!vGH8&3HrHI9InO?;p25o|620_sLDa(qaoAz!l5w`a|qhO?<0QxE@5MH z;1L<0VZk^g&HMJrkhs$j%Q}I;fN{juiS&`G_33E{ zzc9tcy8iR;e_?*>zOTwW(1xZzvz=e%t4#V1#Fzf(IK-u;na#W%KGqMqw|PdGiorMo zxV$`^l?9cSO3OLkn4Ym5>C!NCJ_Vaeg%?By0?!uLhUErGc+N~rP4lx~pR7&6x6g{o z4O*efbz)FAib|Psq$xjs0NgJ6&d^ppB65lJ0be)&#J>$_2!bKd7k~hM!0zG-=FRWa zo_sr(R5_5KW^Ih_;9`R9Qu%_2$3b?x zpD~Yas4=1oj=0I^`F4I}k6;%@t#ZD)cYGmO6KX&Cvfg?=j2fQyaUCEYrR!Vq^SRru zXq=w)kgPFeB+I6yrF~8mF%6{sA+EnED=9?E|86UJ<~#-I`W7PV$6M==8)LvM&GH_K zt^^i#kn0ASBdWl6rFy>pidGQn$3=*i{t=MCQo0yZF~wc=ir6`M zl;E}wGSjHZ{0qkFasnU_*A83c(EqQsKPC$c=c3NBBLJtPX85B@6h7GNlKnOEyiBnq3z+3h#l;;pG99^ zcAd}Gp6AOefmBp#&;uk1fvZ91?Rh;p7Z-9))g^fg+F)3>`%UA7R-_Dj2j3sNqp31W z@CT%?%6bQZSRKE%vcLGtid1p3vmyj{+}3a8`uU;l4!`S0>ZQ{`&^+B3zlR4M`C+xG zB3fQMBT8jfY>(Vb-S*geHJ@riBi;;6IYxr$6p7R`G@R+BJzkC;Yuk`JQfYLawY|5W z9Gc;RC$DDfSi~nr3nQM;!oC}qjket!KcS5GX zd>ee#8X?+nepBBk&t1<&9cE{LWnyCyHgC0K$_g!Yj^ekMx5wGPU>-&gXU~ zt@VH1LQ1$4ISxp|S1M5y8G`&fI{}+9 z==#lQ%8rU0(3nOJ1WYYR&sVQkln&25-x9@4B~=}i1q|?=KN$-7_*1<&XjQ_+N8CKR z5qeIEKz~gOko@NfAmhZZA5<2|dfrO)*eiTe`GrdQ1{v8V{de#8CN{}h{odo_h_#>_ z)gkP)=)vUBc5HOdc2jH3b6&mj%E}IYn|O~)a{hSY^KaOT&SBv+pGinG>a8JWB)S#^ zXv*s$;doo$u%64leoq+|EtA{RgEl-msCsU$CX)0|Nbo;)P1Ol{^fNy0W+Sh5 zyF*Y^#}zK`-R0e9XG>HOVJ|9tRVRO90=pESvK|uVCS=}+inD2jr(nCo9XYpWQE!p> z`0XoCQN04`uH%CPn{e|O%+&+8NFh>|a{dX}&3)#U&V!&bsJz|&-ictv9xNzGSnCq- zW<0!KPv%-zQ*>_)NE{L$qB77cXCZ_pQXZu|l;;1geRjh#XS3T&2(7wWx4hSIP|Uze z8_~{Y>>&JkA=Y+^alOTH#9<+Wi%sVOd=yd{K|T+ToN^reu$41Coe6QY5=i}eRzTGu zxy{MZQI?y_5jlFz;{4lNOeJp@7ibvRV6@dBNb-V;mNuiNW`6SV#!y@{U%BQAB|yyi ztYLC0FZfSy!<>wadJIBBQ)5fDV{7Q7c$+^V9D>A%=|_#!8aqPs|ENdTSg2JV=1NmgKFRo;bQ|SnroS*Kz*)I|h00Xvhq4s5tzX zV;?^QS?5qShs@#)RfnFE)@8L`o-W>dAC#eYuv|KLd zB6H<^(_a%4&uDS|ASY1~`eO3@96(vKQ1eSR6AkU~{pBTs+LM9+71g1Kb)o|<)cUbk-)#sR7D;HB!Fl*qp zNQ!`oE08!%asJa=>Qz-~Shn3#06h!Jc(9*6A7uK^0{sl6#!>CGVceUNd7WH${;HuC zV-jV%o~$z6hHzSlbTsc^Uw3?-0fhMWf1bZ2GDt5Yx&gUFKKQ@ZAneXhK}fe){>PEd zqA~7Ud0pL@NLGVbz!%uJZIKUo5DujC5!{)(lm98$|53*KL0^1Vm=;4PH2CFrXM0a5 zlZMgsH;L%trb5y0KL|!(4wXCDM(n+t1z_Xw zYxq|D41~Z@ z=0v`!UXhJ1@IPf^pS%e#GI98sjE0UrcM}pZ_pBcPLeU8cI>!@QX{xj}kQ`0(i0~4) zH~5N`4;FQE^_XtMLTkp+f^-kiI2?>!XkT~DGl7dF;<^q4GMa2oLQ*EYPIYiLCU|P! z;AkavlVHBHAFSPZ396;y=%}%>(E6d>Kc&X1{20&MM2)4zPcxj7C0a8#&*7%+!Z`+! zv_%YjAWwm@Y<^<;A;nFU-{x45kdP%}9#8g}k0}Lr$+g(n#qX<{?82~Thn!

    9|Ls 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∾}s~3*E=p{#(}JB<1L$E-UCg`FT%> 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�rOnRlNl04vOl#Nf!=T%T zE9YgNmG1(9<+zW;Qhtf3oLS`i(7m@zDvR2cxBz`V_8=3?Vdziv>Vv%r!X6?=@byZ8 z8ivw&rKe36Tj0=pSp2N&Qk%QrMq+MOrvyRTrpMN<5qB?dze!_CJn!!vLTCe$KSVE~ zJ2OvoA?GE-^230f9`AOeh!;3lC)Y1GsO9^r(+`bwC|j~RAp`rWce!b;en;lfA4zhu zKTx38%y>oq4QeHkO){^3bUrun5_>LN36L86xu&A4LKO&DY&i1tQkLE$O$y254N_9M z#)sVUI$uK}O)35T>-$3u>$egqEYBZ5E@N==1h;QWzDj0<$0`=QzEacO7b$&WstDM1 z4n{hKP&bt-&(l_-fv1GUjg9g8es2V_)1O1K(;@L3<+s|8Z7@keqI4M}$5li`vn{86 z=!Bw-0oYie0MS=yWuy(5OW)jtguyeXF8=D9>EuBHOKEO15AcX&xNZ*Xo+w;D zSzIjM-*NpEEt2YdEc(fJIIlMhN@3H4wUd{SgIsdAC zG_g`d3!EfKt*pumZ*R*WdWO?GIj6FZ1~gJx!>#`)Q#4ujrWX<@?N?nQ)SHj^!az%- z6zR;t9bsUVFL#S`*RdC75ml5HA#6rw<`J=9mYng-LPL5mZr_G;K+D-L#oTIKo|O#Z zvh!`e<@a-)V;!`>lE?#x$Xh)k65Du7PI9yTuhsi!wJO}yd4H>;N`BfI+Y1|`V30^& zJ#I};Z0z6>4wvaFPqCi0WSmRlS{6G~4oD3f(tJ;D{p`9~&diPNF@`;QmF5kc&H#_WDIxnip3 z{)R*~0IC>Bvs~wY>39+1g~wJ@(k30R(bU&=wWXqEyKpzHNz?@nq;b&-WWtgf%hja~ab}uuo%2KG&JRK! zx#cXw^xFA|mc|_@a3pb=mmN6B;*{J}7)jCxY%tYEh{wFCEPDI)chXNU^YCgDd2y7* z8G)QP$k!l#q!FZuB(`BiZ&%a})bA9?ze{*ptI6_R3q3zb9~*oJ|Ws$iEO-_Ta5k7DbT^82=E z-rFTaJTXWfD#zB^!g}GDT59s|{Pag`>HpS{|4>5HQleqN!ZnzLuK%_J4g{1?+fzFR zuf}^+BJ{kw%%xY4<=d|B9t-_a%YHYZimI3WB&T@Ox+KrAo{*1NASwKK=2s7Ts>!k< z?NADd)YbBLX5f zx*!v_qdQ%M>!DiDEFREX)GW;MyMnYWvHl$W`P}NOf4UhRHC|qp1oYSjIKZJ_CGD73 z^^8ozn$vd^d;2pa<;=p>f?<#LIlTsi{H_VTDo?f=+r!%r8={0h@aSPCi_4LhAEv#s z_WiXFzmH|fMygk;NfA%_eZ+div!~@@;}YT)$pB?IxjtoHn-M5O>^!5aL*&SsAUMy` z<6a^&HKP-@0-qk90RaIs^ z9UaM8oc3Z%uWx^AV}TMOf0BYQ@vt;uuF%=BUsQB-&=q^uT^WREu$0V|F;SbqhMG=#bl$Deq zDxXf|Z$Ap>G<$y?-}K^(#tRjn(s$7*?-`qMK@LK;ppQOSi`%`l=y3?0qj+s1)^cq?UGabkGJCqleem-_kq=t>s< zx4OMhE>VTgn0EHy3!9IKQH7e|D%<%3w?6&n=X55i^Yaw>jmggnQJvW0zV9$}jbA`& z%S~rIatURw%|FRI$cw1rLNNu!NCU8JG&Dk~(eG{^qFCMN0^H5p7brLNNJa&D((*VU z+H;0LvnB&BxCr(Kx(uJ#t2~UeI@~8m09>Agn_GZjYg-#AtD)hG@8?Xh#Lp#6*wL+F zA0&i_#+4^WyCc9?eS~>+Z?#X7ujvCtKTF@?DqJ&kF7z2;J{E>HxQIzurvEs92I(2< zMqc}SC#7oS;U>*_k@&fa35g~xH(vmcO-ks9Dt`suidl$5F_Z_)yNUS*sHiARdN01n0gkLb_#wf`NgzX2cGeU+jaC4T3}=5$w+X z4d$4?ke{?C<~wH*P$CI9R&v(kNVfS}r}Kp)0w@Euix%g9=`EX))xY5#I>eG?ZD*k_ zf$hzMu!U$$1~W|kHTo;atyM1GLR1@?3f`Cpz(9!s2F%Vc6$8jUCW=gpubLl0lE~?- zj*m~AQ#^TLOiIu&e-I=H-=c!H(dMi!E8(=@4)SV2qv)BU)#(XBl2{5L@S{kaR0a!A zg%jB1_xto6+z*r)uq?(g3^ua3j73;0`5rWt6r$nu^gpr26Q^K1vj-#@OE!LZ*xw6ObKJbV!_4K;%s0u zt9MYu_XyS9PjmT@DewiEiJSU+Mvz*FQG4!Mr9YM10Ku z6{rC)?-3B`;I+}TNcX?=Qa7(SRDV7f#s@S+1I2hO#KNx&5h0B!WQvH-^@I(Pftu~K8##Na|V_iZQ3t0l{?2i2j-eF^u48+$V`O{`xGF6<&_H{a*2fZaF;o|94&~G6|mC(V3)Jl&$aRz_03_pEpwZ2s7Yh>oG z6wvq?_n+ZhkP*USoP6&i5bAA^ck-VP;H`fiN}N8aav#6uhhiN^dV88eLR!yK%UQ(nFWObp=~TJkUt4;7sbG6r=@Yw7gdPduma6- zNW9A1C$}X4>6vMi?_aHJarM7yA{1Mbs#T{bnFl??tq8|17S@KWl}BntV{+n8?)xf( zx2sEjr*#K&d&R}4w(tGI?g`hAjkzDM&1xCrI05fBj{myKX`Dvw&OefraKKHpze!MEfou>J_Gt1Wg) zFcpS8oo9YQ3I`0TG&18`jsaec9$v$C{YGd3P34UYJAUIHo}BcjCzsPhEcF9fC)wgD zO({J$^QM%Yr0V8$$G+co6T2r0x*8`o`}}c{QD+AVe0qQWVf`6N=G-Hm{1lgzA;H8` z4MKX!JjMh7DItd5cC`W-&g0PN4+vjnqkDdDBqOa3vNB8f*BL%YziHSaCdA`RM8JkNR zbx#^sk2*XH4owBI?3iZo&aE#i%pS;@OFM8#kJdPFhi5}5;Ey%8pReCznSNtEqt+@p z_;oM%e>1bwe0waw093a1nR`E_cjGp?Bkdm%m z3d(~DYKvm3FX%>BV=bB`V-{|aCsei=Kvvtu!-#xR;UDF}+8)Zg7;Q?fy#)to?_rU# zRoD;`WfLC;2La(wOy6H~7==}g=K{lC5IC1TbhNSQ^*g-zqtDOQ$f$jBD}5kPhpW}= z!CQ>f312VnM_&0u;e}5kyR+HU&ZKXk5Q%~-H&MxU->kj$C!EmEmn;aHr6V#z&qDeJC2snt!UbCz>xs^a*r$E zU5ZX6`1hk?Dqd(^?#QSX3AcAf2d|Vequ1bEen+T~`TDE!kUo1wg|+3y=M^o-(j?~j zf2$#xol;H4IMB9PzYhMj;vZ6+|6PekNBuu^y>(Ds>GB0i2nht&;2zxF-QC^YgS!(P z4({&m?(XjH?gV#uC-a-RbMJfg{-QX$sC|mvyLc zsLJ#%dA&1kJdeIz(oD+co=g=;O}Kas3ck_vNJ(#sq)&T?uD;rhaXGXIsDk_!*3rtVj z5^hG0d*Svz7{9OeZ%d27EL^uchIhuUd(bhYE|y!gHx_ngrk2On_Tg*UaSiBNM9TWz zG+hF0Z|jXSsGgU@ZO4*dzPq+C+~d=Xf!DDoFW;sWrw+`-YN!mViu7SgaB`{{Gnk>j z_yRkp!3T&VZbU>}e)K2w5|H;i_PqH(*{X3GODBjaQ=}lQ?^DANcu|_Hj=oOTtL1TF z2Q-I3t^F~ zDsCYjq_EbVJFor`o8<#p)W%{ywc!<$ARynzP((!dFD>{R9+V&J8a^r}{GZ+p4`N9e zSb;(AiE$F+BtwQ{)#RTO${Np0_riJbX!{19@!*(rDh!To6KG_Dol{u--Oz>wP^EFQ zowYrqdA4xwTu}JXo*6%mv&00R8@2m-{nA^%3cLA2n{m|gf`1;U3Wj*6P4AjH|8_P_ z>XSd?uC~z;&{A1fn@DbLT5JktNC6Sf1r|pK5_>w6#9J30mN}{XNwV2~Wv*LpywbJ> z(B@N@`62z=ldVsjfgi)pKgIs=Et=K;OYcC7x!e1Tx1d_{QwKh*t@nWa9k}-u%6(O1 zFi?&~$d6Ss9S_WmHqCO5MLJ(A|QR%Ci8TcPs|u(HU5Sm`3#_cVIyHGy0k=^8VIY*pp9EN=m?`5N?uz^beY0EK2tQj8$W(4t3yH#Z^mG$ zC;T7-bI6QwcLau-H-@$6QySx}dW*HYzP1rDkA-bajJ(gtPK@+eYPTd#4>yMW~`AQ&jG~ixgUEp zLxssuCMEu_LXJa4%nk=r=Ttz4NeUB-sQj*b8+8?Gy_y(PcI0!oG0|o%2@|6x3!xEZ~3LNa)$V z&MFK(=wj#MhZ5>Pk#&$M{dU0Xrb zj>O%ev`RQ9wWlbSf~ysvQ5}B`E5kR1_|PBh_v1FP!|3jO@hgP(*k-z8|5(>`1n#YE zH}bg3w}0zS+I$4|l%dvmKYx1Ob&}#6(Ni@$a}nj|xuIATsriJrKINmD&csQkFjOYZ z6dt%SO;)Eg0Z9@whQk?__k&GECAz^!;4&fRygBCZ*r0Q}h=$i)W(lV-A@Ue1t+x+8 zO#{RNbeL}3FWq8c!+|UjEteY}19sLuIKvzeVsqlWyy>zpqmSG}xqV^^Nt)P&LjrG- zWgRmsf-v={#o^x$jn*nYzj<=rZ_4{mJMw#0RUR5W0zBcvd5LH2fop{b9J|~Vv0Ip6 zQ{1Ku5}!HtB6eHK*Qj8gdCk=^n3x*nWmS>;ebWXEb4ovZ&Mi13XMJ4&&&L<&v}2jP z^57bvtxKo5z+4xJO6&+4ByT8!suJLuY9w-j{RE(rznyE^{(0=-n#oFDN)5Fm_F?az zaM+2;HX*0)g7IlLi59~X=K;&F6L9B7`MdvSRXG(yDd^Rgv+n15>}y3-MX3AU5Nt^a zd99Lz;~G#^J0aH6!hUo#&84WKA|wk92?MkHfaxULdkCMCqYqq3C*MCry=sI6kw?jpTMqJse^nWpVyK*{@$F6mQ@J{~OF!l*F2C0&N&9!8Wb^Fgy=IQSs|L zFV6F8BM*I}Uq97#C+C{DaOK6$)Xb1_(5&XyHArfe_j$)r()3sz_JrLqJqO+bYK^um-$4IA&#*j85M0E07WuN@rL7)&mV% zoZ`)pL~D21h7O?D`@u~YkfX2Pp0KVey@b94e`1zq(l&k)D9efkp!K}xe4fR9l{C_t z5GPLcdVNE1#J3VGf`Jde`LfFiYL6^|LZF2@rbj6z$a)yM4Lie+#$-f5Z2lEI=y!V} zA6soGshJ)7CMrUSr211$%Ne7R7ORvNb~*JpAiRnH_?sZ2mbD=mD2g9^I5IT%6P%SF zbCoa#{RZa6_pfI7G;5ehBwuBDWus24k&=N^+>l(fkIHJg0~mamWIy%B)Y^=8DWac5 zh|j@=n~PpW zIvF`QU~h3a22x1Qlc~UYGrot((UEDkx|5Hrj*ftes$PbUd)$evx;nFwp=7?lKQa@I z68h@XB|8UBvs=9mLaM&OE*W(Mz)*nyTob>r41Y@uxI>5gFn7rPz{c)+{o{PK@v@;A z`=I*%Iaa#Y&cZcwhh>0aj3S(G(w#CAbCar-Po>8+rwZ3kR%Qz%4`F1RB zGu~l*&x(1%6ftou!IpDy_Pp}c)T3e->w<@?(dDdp(1CH~_O&3|Q|GeG-42`279x9( zO4+H{npw&JN))Sy!NmtVnVE%A!2r87#`$6D&SG)dR}who?YnXw{NZ$gCXuaoP02Jb z#tHw;J{icaU|^vs?v)oUktWIuaojuH{Z@A?CGZIlqNPh+oyP@sDX-ZmdC>o<26$W0 zKx}3Al`4ed-_8Yib&DBP7EJZwu{N$(!vMq=f)DdaTX*t0;ZtB!v;9G7udpLN_9V2P z=wQFH_tC=~L8`O{&Biv%cLd!cdqX2sPVnX6yM&&--Blz+V}oS zUJ2&p6Vub{tMTBsr;9;KN)9bGD1T~}E+rwzjx2X9N#|4Nd%WNBlu)p`K{Hdk&V6<^ zAG@s$+}o^k2mi6cjHHRFA}bcmbyPH?KmQ-~rayTSr@xPD5c5vJwy$l6E+cu5tq8dw zIo~^+FipyBZshq=^)75Lf#<~7cQb+`hxT$w|7u-*UOc3u9aURWfc{QwoXF2Hz)F%T zjNKjY=DE0l@yWI&mVrA&_mJA{*dX}Ck--9xJMUKzmS0&KG~F}kh(nyk05!$biN>E2 zsiRA%uL-|1a7$x~cr$31ewX*!RprKbj8NX3H^|5^$>K76wXalRchhc8Y|%WI0P~=u zb~$~?DYTt2=r;wx3D0K_45wY03O+GHG825xCL zfA4XE@4ua>bc)k-zSgWi{pyejH$p$x-a329CF*Dxv1ZOFKV1h7E?ip`E~>q#Y#Lb- znKKqAr(eH3iMv8LT9;YnS#>TS*rP#)LKWGVWsf|JWivS3|5lqd0q45LRnze zySe0VD4w1o6I*jlN@xO96ARWH-fTx+{q_s!B);eWR-cXZ!c!1-C_^@nFXB4n`d7{$ zfCR;ZH9A0k^q*OL*kV8C9f|Mh-4=zWT83nAqBULPqU zekO4pMPxR#@Y*+{tBJXpHI*>HGhm+*9$sFbHCwMpcT71CFP`-?3m>U$Pnx}MQGv^A8#vf zPIqc=Ol415;i8{xI<-Xs`AZA(R|)ST`J>_^p_L&1H;Mi6+PH_e2@nJ`(Db)T^){k0 z10Ftu`Wnc!2`+2sK$$N&tiOE22>A`hV0WI++@g7GqqhWzUl~4d^m`)N1QyQL&~I;1 zKcXN}C-Woj`A%@!W`C(Tn{cF4aEY2koGGmOc4#Z?CyM@c%kVEi8V3>(o-g!JmOG#6 zu$E#Q10O29Wo0vJ)r2gV)V&;59p)bL| zaJ_7F@K|(b2AJ1X!$B6qSeIeX#&@wv2{UWwPHL?76b;4*`n%ji`6JuJY4VY&aS)OP;%IrGZU&9YmAAdc?q>K)1uxN`Y}>wt>653$aYl}Zcrax4eFh(Js+fDP&FsH7wLC43Dvebz8{|Ce zx&eFpkSwMSoFM?e9xX9Eh;7lw30{96iTubO88YH`?wmGeVsgBITXayoZw__!e=w_~ zmf0VA#7{jY2xt_+f7$j-pvCGqw|iIh1I8>L-^yQia!7HI4&(iV?Hi=|INp#8&R5a) z_Vz{ux-upB0VzC$V;_fX0uuDJAPdURMVw%54souj+z0J-V1k`gz zqYl82dg)VLxNsJ{{9af0wr(uG7+rF6OZzRfDfGcRH2^Tqc-t7b{VAdIfRFzK$V^zY zIyq_D3Ul8~H9fWMkEW|@9MSy&haYLR>b1-CCw(7{B@0OYU@H?vG!@af!2)WdJ5o}B zCv;Y1A04rZi>C<60ardlZKeIZ32Xo;mhNuZ{OU4VTIa|(-wzV_DmxC(#|dc@nL2t; zx&5gs7+zj8X!Qv43xIuqO;yVUd!<-cbkCVut?5J>+wBNNr3(`v>1BsW)K!yWY8rSU{vdo(AQro=Ynu%aQ^1+wfpmcs9GwFitLvqUl!YbE~rw+h-n( z15$o9zbNMLZ#Sbnuxlj*&1Gi2;U zUSB>w%Pv;n!q13<*IF_^B^JaSKQncC zv~Fj&{{5fquJ>3KI_ZN8*s5DhM(@G-4BY)RkXwctNtD8Ku#v>G8?r_00wH#^- zOpnCw@FjZS;b-&k0U6BHc7_nJgjiq}!omrIN`mijW*nvb{ua@R#1D8dXk8ae)x8DX zX%mz4<#arG_#=W9_#q85!qoQ=!YC+b``5-(!clHvy#t=ulc^e3HU{T75c&d5b!Eql zo)aE!7m*!OFR-{K2Jxbx*++?(fm$Z3DwGt)Ho#StvHPLEkXrOi8 zs+z*#TBq0kfa7xvT0u;=T zpWp22+WokjB-6Ks^$T!jz{`s#l|;*jPPWlxo6eQNBI~$p_D7ka#cC#v4iOj~%V1Yz zdQ2`P44kwK8s_N+m};ux8Ic6YukzxxKP+I@d7hps>S!3u=00mpLCXvMLjrUeK$QLM ztMOA}68j5*g@3l4vf$eNz=x`m@Z49*`|xmCR;%z|p1JtZ<-5U!zmi$mD{Md3yPe$V7}BJx6uXo99IheFw_#pY=yVFJsQKQ|$KIEYPE3g@@0XRcR?Y=Gu(QLB zzWX(EKnU2LA#f8>#p)x)xJvUxyS20wHD@c61^WSUrkFUs9zvO2pP^UA;lsn-6iBIy zudbn(?2PLMmBuZm4m#2ceP#8Omz$-qTKPIp3#^L_AUHx#1T_R10Y&P!==7{(zthF}2vR=Ea%Eb1s z%++#+D0g)W40OkcS_UY&#P>L?IN|V?dIW?2c|&yYb)`HZTzAzXeovIrl$-}Bh|DiM zZr(26kS3zYRRz$88dWKx*Kk&Pr!rmBV=$w^e6N#(o2fO5%G=c~1*oMbOJs!u>o>?} zg15p*SBtQ=JKXCjL1Li)Z%1kpu=@Us{}1Sk1$W&yfNO1;UsAm5c8(t zs5hobYn~|lz|kUZ?_Ya4;l=e$bG}&m#NJ_Dc-;iJX$Wtpy@Z8{%pzN!B{NZuCV&eN z5hTlPE&cp9w>&NEsAOb*f!%#`lQ(?q?+ii;??}H5DwtpJtS&^*q7i}`u_DtLNz!oS z?ACTI=(bA+!&RWsOTtK*hS+>*e6Xj$iL}S-BLMPLUj8kDdO~(|UqZauf>Un?&|;bv z-Qd-skM+&CkN^#nAa|FPmR43T#QB3;*%b{7Ymbg}_=5FNQti&gc%W)J*@39S8DYvG z|AJ*>TuT0d2y|iKOZtb4$ImB$bl{oJ!7(v2jAQ0dpws)Kl8**)KD@}OQT(;FF-1YxIBBi2LUMZDw=*>FT5ODAkzpo8 z+cv3}8VlEToPjNB?t$p5Dv7hnEouk5qniUY93zX#O}Ro_wgur4C+;li;6L58&rQc1 zh$|S-)Jx!wEtoS~eT z;d%8e>yqe+B;NX~OiW$aaCK!)XfH}CE3)nrMo${G;{@y$zW+WmBrN=|cjqf;1B4)R z&MKE>0Y7d8ClS}^Nl&DNO#$qAlJa`-f#bQ-}((5b4w?8J9f3VOui zLd-@_{!l3|VKzpPHTb1(@GazJVd1scGUXj(a${{o#VGJu*6ZDm143}%mFk-y8QJl` zY~y(Jz^;3h+HQ8A?(xH*&cGBESwv%&{w-2C1b@uQ`Ubcg)%WJDxH z&5Xv=tMi@yFv%#`0(fcxwBRGji~)5aO9x~a?ejweJ?h1A1*>gKc4IN_i8a)TKF5Z( zh@I5($Xthk7gtZ3_-%No*}($8&X{bnDkA~J;77pqvosJ5stss21UL<=v@O#sbsY+ge=r0u zd{qPpgdoHzj&}mUKJcM@uh#z8=`QzjsN&3}pU`ufFb5vVCehe_ScaB^x#)xzw z0zjAuq&7Z<4An>uc(m6?)*SKdWsiRT%p>J6rC}Yr!R|q)> z`WlGgS#2S%z#uOzI+2I^65wAXxC$el$)0Gz$@5ds`o<*UB6k*?M^9#z&k3e3n_02S zlxRGuHOZzjNJy}DdR;Jn4MrIS0|O&ZnfP2lij z$Vow}UyV7bwIq!Gq7jW`D!~}qc>T*~1N`gQmwC<@jM@%gzL7DCytHMZxMYs7ttfp^ zjyzso+)God91JH1+xI?v$4%Co4)YGiT?XQf#aNR3nHF%|++=%HIT2?Xtz2H_BA6U* zW&0CTGku{N^Uz3$9Os7DK=zevZjaNqb!c*7LZLoq!#Pu8sSt)|h@-=-aI@Ua?;E6_ zGE^{GekzJtZ+3XDZ8RPYKCkAo*f6FN10O(ysNllPXEliJv*q3eX%5bULw@5Sf?x}e z#@dH=WpB8^6Jm%imdDMlE|5tEa4bZRyPM7RtA5PA&)&xju$T+O5EZwdomWZNseR{F zGqXf8y;2JL{N;>JK^$+j6^JrZ(8O&yA6(p3iskjG)*ld%k|#?akX2s5S1R)JyZ`y9&59FWVII{ z*$d#r52E%V(|M!CEG?1KbR)vSLT`U+WjVt* z8z3r}>H%)Vw)q8cCQd5ZyP{c~fanW(>r@ha6RKG`667uvLtT7Y1IaAid%?*I+qH~y zW{IYr;x-O1XH2O0N#}$|6YhH-ZmA{Z&8Y)^_WgTho{;xZ???F*!ajzu2~gzk)Aji@jxQ$sz6ikbf;h~ z!y+XXYGD15Ic2T$%vQ?5L|&7SOMi5QaBebywl3#px50xjb;E?d`daI`MuxKT{gb`; z`oyyt55>{->AY-pNe+>ndq>T^ z^Vf<8Em9z2jDnhwF?~RQ2w4q0vVl6rX>o145W-4%v1SgI=%#v0#E6mWMywh7?AI%O zPOjBkPu<q*=EePb5fzu*)}ODH=_|TI0Rx+hIA#gU|!+lmz4g(~(3Cj$>zy&3uI* zXQU2=t@bb7@eNdzlzAg17$YO8;}f%xs@?PfJ%l-PZQz&Uveh0g>vqqHxbKAN+_vGK zl&m6g%3m=1KYYIV5&AVOyNF6W0FX$ew+dx`F@TX|ez!zs5Li9FG$akoZ4k!VWisB` z#jpm83U&~cl$vWbUzOj?X&Ap7Z^TZ-{r`kF9)!!Er0xnS2F&aKo!E6X@j!CDtilOGRXpp?|wg-8|1T0C$=#79euS2cSAHcTFYo(TEy^2}$a> z3EvoT5z+jUyZ^i_zrJvej$`;9AM(&v8z=1@wIN7gqiR^eAC^oLLg(xD<-q)mf}0B- zTNqWPmbu8)e1^Ld30#8gelrqdm!~MW$urar{~I|Yx$pHM3dNw=a4Z8UE2U&RCd{=a2@yB&>?4b! zFfrGUyG)+!j*Xw`^GVAoo`*Jpak~KbA?U2!_{!v(CwADXDl7}^`0jWMtbDS=|8!#i zL=bR+we-&dYgt2DoW}peX_o~=7m}f*2clG}lHf70A@TzRfP#W1<2e9&1b&eLhi@C} z*X;2)Y+V~^)~*5~zQmGAL&A}t$hkjcaR@85Fy*y_+qaY9!f;gc1kq#yAxrqLGyj1; zv=azZleQ)q+bgW!rc@bZ=`&bjD{8OKnZAXW!Dk8QDS5y83i{I@yFn&Hn7S}$;S#bM z_$0-~N~EuI#SK7a0tdRY$Qky%s<7s`NW`$QK@|*7*^Px^IlaX4BC|$r$EY9Dz;?~S z%G5Luv}JM|^_s7aq76Aya6|&rlyLJAz-0^}I zb7d@cNpK#w#1u?(k!#FK4mZjg<^q?N2~(2VfuxKH_qIIn$=~*gWjSp<0d+3Y)cbjY z@NLs7*SMg;0!NL964@#BvF0O_5s4-4?Ks~!VNs|wq-GB(Wq0L8RUbt&@EECwLX|sN zE;+?BEmy@~oH{0jTYER&Z9xrWU0fc4M*b0O49o-_{#U*}I4a{~{R1L^K@%zmjum(A z6EEG2YT$ipZB6o*z@n*Jx5r2_Qzmhti2@~sfnU`p;O2^C zsI{@58+IvJ24`KEx|%1%W)wo(@>e{uB&Aup)%y*~%4K>Nf{fa8z+*BpoHpzPNUpA!B!ry11ZJs48mO(1lE*x zF==Rstd5MI9R+e^NHE>@d5M0udMgT03EJc(KmJQw@D;4?>Q`-`>odECu+GE;jDv?| zyfq1V%*sT5AvDaj5?k%Ou!b?6S{Lmzuc<#qH6Zmg|r`Gh|z4M(&>T_U|ORsDhVPJ$Txi8ksKsMO2epgys*$f{AuN5)3at`XD`6%&(-_Bh4(@jxF;{!k>g+>)eq5QfxB{EV zNa%vJJR9@Y6`56@B`J5O4iO`gNLe1Fiyuh>c=W^x#^XA|49PA@!(TUKaThk;`6wx^ z&+-QXF^FN(^BP+0N?KifnK^%x{n1XvCnQ9O{Zh9d5~Xy8?_v$3UC4mDm~$=D2{Ykd z8Ak#2&ydiE^7~L#X0-tis@?#n9KD2;1No7SV!iAh8Ed)_Y2+yNwqQ=}}< zUkMb0wF`nJ76vff&$C9cV_C~; zSaWR4VzIka$8H9t9FJ9d&S`r`tDlf-VIV~xn1VCBtxIAVaHRpP z+ZNK_T7?`%cT217jLUlJ`O#*E{+iMKOLYC!p!stAF(*n-8bbINI{XD|yBI-LgM;;U zb1aZR$qb&c#78HT$c3scUsU-$s}YjRTUv{N(_ck+6qkLiggQYoZn}zzs8)7C2UDaImZ)!7kldB#K{j z>A9(ofuRaI2R$D}0v#YkMp3ZbtEjRj+Q3B=?+ab_(9#7V>PW;a1jwnNlX5hN3Afa6 zhIDmESttVb;PG14MTAp|jX^Lm^qu^1_qv0wObA&|`fLDNA!^qUX3_+ecK_x5Y;sb( zfNL>bNy9#XD-Io1R0)QPQLieJ`EBQ;Fk$p=Zc4T?18Sw~>ZdzS_-w`2mHGCv58YzC zYsMfH;kOkb-bR!RwTlUNI%+&F|7v#TBlaPNG+|K;<7x<4nB3#q!&$Be>pYRgO4(3q zlyT3wjZt|Tmd{wyzR>bcClJ`w%ffPceAMIBj&2i{fJrKo3VUSdvO9E@gWje}Ihk6| zZUp0J&N$v#Wtm!yt!vI@mmMGfMXn1=ts8(mtyyv7TPE5Da!8RG9(nm+dEV~I}*t*;lJ4;w+w?+;6Kg}&7Z zg~1T6^cZaC@q@Csi&)XluZuU7>DGH(F*mr-G!z4l>|C0smFvgM&`#ZBD$~ZhYDF;_ z@e)sGD9AVfyb~Q`IUeXYd@OQOs=|>LVn=Cx`IwO%NGPoW65-;9ZLRO`aMSEz31x0j z^HyL8A~{_UWzixWD`b7&;Z5hUxSz*f%v+TK5eI@r6IMcXm+wP!1Qr1p8EbE=@mN z5HcbtAkQHjkatfAa6%cDy_lY1o~1Fk)Pyu_rUWFr^}QA~9HU`-ZYz~obBi%4?Vq93 z3ZXn5fVk%c4QAJ)d@tiEsAx#7V|?;=W9OLDMBhc=+~5=SyZjy6T;D9V%CUOVs9jNYv9j+zilPcoi8Vw-ZGi_RXicF98pmfd1@YhOA%{qVxa1M~NR2W~I% zLO^`_^9%0}1o&;)AM=5GLVthq*JV8NZ@NO~EZ!d^w}syKI@2?^pm&p&qylWnUxfu% zS2-BzMrgco*S1lubf$D=3f;C*BYNCAc%cXI7_goa83X>l2NoEpGE7p}z?rJ`0Vf(& zw=7kBdoc3v(7tA&d__e~exv;Sx{ew_xQmUPAh;FN3@%MHn8IJhgmKse1O`nG$1zkp zUk%cvJw!GTs`@`xR@DEj0KMq?lzfz8%RT$rsi8C+GartsVhnJz4ldeK4Cz{aqY1uQdZRFob%OYj3fK*pUTL{fC?#5OV!{P}z@Y~Er zM8lVwGXnm>MBqLZnA-1^xv{_?BPN)(V17EIT5znYpy2)eMCoas_Z{4$Q=0dXFKSl! zKoYr`SIz*lWL9Yc*we$gs>3?jA4>a0jRCQ zbZD)&&oB;D`;n1*D5tx9d0CPKg%YPcRh+n45V|5#^Ec|&L`$S7PZ}C|Bu0!Shf&GHYtMq(GL(}*{ZMbl`Nx&0l zgupLbRw42Be`C=Hp7jV!kQF#$@QKs;pJ+4%Z4My1?K#~n6cCx5g45v;vZv6P<7lqI zqzMoCerP-w*6_m8nUfLpU}|OL`ryLafu@7^)qDsnSE5Z*Qh&E@4;d9xZ(wHS1Tt}0 z>a-0sNBfBuYd_{cfqI4t+KrKgHt6OpEH!Y$c?bp%wpZ1yu66T`yu6~YF5L3FUSDlu zww1c^uX@1#m+w-MGqD@e7#LW$7OW=u+Fc;svzXDH*Q#QJ!xj$cz*sd!LCQ|Y`!Fyt zNPvN|Z8yQ3J?qtb&GWZaolX@3rCVFTNAv@y3J&!M`Q+f$Tg|jl+6@^li`o?Vir$(+ zWgu?{IgiUGBr>6y7247pr=lueZ95j*dt3sYlBQ7*Nu!hRbw6Qucw)jhDje+OLe7xN z!*)sb$>8P65f_qzU>y|&6;(lr35rN%;mB5or+;8@`uT*MYGRU9@4NCV%Pv5&Nuu-` zh!bE+^)+>_M!ZhJXqf{`xEK>=Vx>VzO)nte`7LN)Nr= z{lqF7MDP{O!POtro)Mj$!)jES>5I!(9{MI;J?N+>a8`ploe@v<>cQDSw}G+XLoyer zz8r~*{x2ou6a`5zEbSj*nF@n%FL5c+#ciz0Ojy|-_m3&@sg)U>3yaG0n+YV3)+3(j z=X18F7I%%Rt>3LzBqR}_4{g?UI4ADZm}R;89Atvs3s@9?irXmpMW6Pd3WFj zkJBK(y09OrvRy3f0!3X_HE%!vOG*Zsp6^PW8}Zum(?YLO-NUEnOTrF+Zsie^eGHxR z*|T?>JTqqNj)_^fZjpTCzy^+V!(;C;b^&p>%|OSH#5Cc%LG8Tjl&|&t z%wTIqjrvz{1}`4kFRozlGbhRaHgd5zh#ZJ!dfAi`-l&)d%zUR?h;f zJr&RC4@5x$H~cT0Hb>rW_6<#d9;Iyg#)k^pPxvK!Y;JmL z^9qwmoFaoB=Jp2Z!kM=vophTWZXtnB*29=*PwNp`gTy-ep}Mn6VRBVhsqNfL9$RjO zmon?9N$Ekr(^?(Dv(-7Fe7EMwxw)e=FGXD?CB?<_+SahtH8t1LfB7U+OSrkQ$Hyhe z>*(-Y?%xlb+sC$7?KE$$@|#R=fS<*CQ*3yoA#Y|^w0)s?y8RwG`{MB7cL)nsx?4_% zQ)AFjy%qD~+9U{g@qHh(^=(dESAyqXAca`VS8TJ-w` zMAKn+%?`CDaTOk(vCL0K)ScD}6fK2UkTEV-4YVx1eyO$?XP$!Tluf=SIab<^^l5yZ zS$)c#j|1N+^p#oaWN(gdG$+*eUGb=WVS?FeHO^c?gbM^bBadtcxr~q@ti=)k13G-S zzIE|}?$)U7;_Hx|&}m0rc1-lX=fu#voq~Idn&`NOIl0v7L`ry)W4JjX9MDmm*}`uK zv|McFXy|zHOF-GT%AM449wN1poLzkZ&3DN#`9Yjtm92$Qh+Qg3^?L@w7cuHT#t!a>Doq13p9~AWXrLm4i(>meLaU;yA16oCyO5 zLvaV86sry0I9n^r16-|6H@qe|%y3pSJ1|FUI5?ERB8ga4t80yA;@dx}+uP1)`ni_JJOhrZ%kJq)P7rjsZ zpkZ;=Z)I=4UV3H3%6D`ngc%XYK$9)1@gU+BZ|Abun^g4cBGo1n?csFS=_lY}fp6QI zr1K3e@j~PCdEo-yI`b50+WAf~E$T2n(?mR$p3Y{yM~rC$&xdXxoC{OSZzNUy78FYeBN+qi4^AkoQ|4xfhU`4V$Js@KmN7TZ-${pX*I>f zx@P$`V&|g#l#zi;=*iXf#2QNU^J2Cp6%`fG=07v#yTj45gShFz@J7hy`^v9)cfMMO z7Ed%a)#1V`x57?BZ?_5TGuG0l=Tnn(>c~Et|4y!dHBbNliPt6MRD3k+WZ-*=8K*eg zQ~y~ANh;uAhm?sZI@C4)g3ODKg_Tv(wJpb8nlG9?5Ze0c#PjzA!`h}4+@#=-HJnSEAH;@P~3vMTe08;3I&2g(E`QYHSp!U=k~n!jQjn}*n{K;bFXKuDeDP1 z8;W^19Bwa%R6oXmE{wt&PHG0`O!yh{{hGypAb8K(Z?C<^NywP`1*850O($(#n*wqw zhsz}|glBuh(ZnoK3XymHsPEgtn`Ktmi+7mh;_i6oMr#pIeIaHh&g{y;GEp#z>Eq*y zfZU%tFg&B-7_k{hE^Xq{N@|xCm!AO3GWTP=@u+y1i2=9$0!-ua>Qc^(kYmGVy@R8+ zmmC%OT)f_hUAgZTONOteepFB+S#1dg+=8O4K)~Q#GRFL~i$T)KpIeHv+G#ZpZ*p>u zqqP`P#c4m~q|2_prgViIoLaf>SQ{2RzTWDxemddmLs~-?H#(!GuPYV%xTK&sY=XJW z36|y_j4`&y=*Hqxl3j>AnAK+4vKspje3N$et7ek+f(QK z!~Yb{EcR+*FsjQa?vX`pIM-^A(Dem+@1k4b8U?RXlYmNV#*9xi^VyTz=98rNeq8H* zuFLS;y1oM%qmb6`?GnlBqq#YMb*81?hxdo=F|cT(y#yl(ukUyl| zMgmCK#NMQ%VL5>KeE?-sT0s6yix~MRTP8ao?4;sno3h-eS&{Qy#Ik-&luYfzr7BFnV z5{N51BfNG9>q))Z&MJdDVokdm#9Gt(@fmGuilc5aA>d)SxvfnO#fFDJe9)Ef07!gr z{3!;d`J6-SXac8C8?!GPk+Rtk4v*#F8RnL0iF1iPxK&7=7-t` zc`9YqoOQ@@_^$R;ylhwcyG_2!D}iCErt}{(xNF4$_lD2-tA3M`yk3&Zxa~$5`^d`z zEQ)1@Pvh(K4L`}iKhAB-mg%+kIo){Upm{7U$HtmFxtR&b^8?F&z(41F&k!=lQ=?yY zNghnjaP^zu54QeGfLS3&I?^_SsJQ<3qaZ(pS3@RF$jB+*htfwzDr^Jsi(;i?e%LJT z-3WBuBA%*wiK1OMHq`iUpb+VS_#of*un#~U;>Z#8&H*37zl`#EUm^xb)Pc_FyHpJ2 znrvBZuLNFE{v2$_zuxSC45e2JBx$3KB>xW;7i2}9A6Emy&(@(!|A=F9SNvW+*3{KxO$009;#!GQ`D#&w z9*E1;f6~=Z9(>Q0@-1A2O)j*40?1z~8-+pAqW&1i&^;#`RQ_kK^F_#e}XZ_l8A>FN6LT zVQxc0uuyc@Go!@6Z`9HXmBGO4Lt)T#a}aojoojL|Z|(p#UcNzw(87uB5z>SsE>a$v zb_85j9?*Q8uZcR3WkNhUKiW4D-!cfI^5JxDVzmwnOUouC^!5G)OLZnmiWP-$Fm&Pb z82>T&X)A#2eqn*v4&#Uk417%VSe=jCD%$nB@OiT;`Tm+FU*SdAol;F%wK zb(Wodn7ljUBQ*`5NH%biauMiW${;cH6C5^HsI%b{l{WNEg_Z)^y80C7>Ezi>RJ?JY zp|tX%$A*hL@7qI`SzlNH@iE$W;b3(acSGMJX2i{=Dmx02vPToaXT&A$J`P7EQOsO3 z2MyeHh+icgQ{h?#*LK63w@MnNGXn+q4?9a-T%>FZbYc7w$cf z(V>G-$@1v$*%a@1<&FC@b!BM@8yg1jPSK$c^G!pxBVP9&yXRLA!^hjv!nwnn=!JEs zEsoZn%N(BYi^AN!^Y6(;shn|6OPG170^hm*d13xABtZ}bkx=o+cJ~t7e?7w#&5zeQ z6n@yWam_#-QR322HwZdxpQ9ir$|52(DHwO_7+^W2(12d5YbY^n=p8~34=jLkT%QtC zD@S3!C+NK88n22;5ZpHf%X;hq4tK9Uh{3C1PSJkA{_``zWUmI^cE)uW=fH?d*nJOA zjWJ+Euo7|uRubx!M@mZQ9I0aV18ZuSoCh6Lbw3j%JbLU4KR>Zp)%Qfe!|1`Jk6NX` znPT6L5@-+$)xJHm`MISM&0v6xfx-6nENKY)#+h^SI?z448pWl zMU{|1T8nK_v1hds@`{(!o`g#fx5n2w3Zo6zT#@JG=aPc97Dry^gaCL@?mRK;CQ5ba zx*(w)!p0{5dfBPp%i||K9jO`l!y`_*a0_6K3EI>oDqs#2;Fz*ox~{T(%`hq+{k}+| zXez}(%4eM^_2^t$gwVjtX6CsT&L=gUAAaiZQ6k9Zqqn*(HLj%xAPG9EhD2R_AJS{+f5m3H9Dl_(>6KOkfpg`@Pz@Kfy@u58cHVp= zc+ht36d6sL7XGe(dhh5*GG=xdUk7YvOSfiTMXGozM(25!mB z_zmFUsFifG%O>4RG>mR(XP2EOm_#p^eQCirC#UFSaG8o@#;i?gtJdHjuY z&blBGpLdr3=^%BB5k3y{j~(}r-Ol;pnJ4Z?z`^HE(RJT*LMRKPF({qIcSlcpFq&u7 zP*9Nc^(P0*AdR}QHPqAGY6R!GNJL7Y0zT9}dJUAJDfk8JL1${%LrKkp71Bb?Eg+tUi+ zrysC|>;O?=7LKrqPv*1^f`Zt}TEXEkjG7zWKZ3I>8aC>GyVOY}tE*LPEaHDQ3DH4{ zaK4C171jUfLsC92Uz*b_@%fmjZ2f6#eP(;TTltbB*+-IY_>cO66a?K$XO~zQSC~kJ z_qq2K9Dw6#50^1D(c(~uhU1pL;_x7I^Z^8${?=&TthIr128ObT83%a@tQl$x1+NU}8 zkYdUS;&V#~aNvv0E$AqPa_S^t7~dWE%}PNSt@?fKy?rI5OTI}uog*Ld(q(RLVlBQ5 zquEv0&|wbF&+nXg6+C+qSm}Gp26|Dfp?5Z(H}!FxR)LmyzC~mo z+BA=@RsJ#d16S*E&CNagPH4m{0n)!@ zKsUqfckfQ4!(GkJo;g0wO6S_vd*z~j4Ds3tF`7zE6TLoyRCg4FIrDZ^ufSg0A~eh& z&GHlkoP6#aiQyG6LvLlJM_akXxUm1dQ}xslTd+c5$eb>Z-&hzRT5n<$=_%%v2R9(K z0P}S^9YLJEqi)X6?!#)tloThy$*o8xw7px96k8Svpr>ecuu&!KGZhLtwOF*Ot8z~h{K^LYpj=miV->Au_diV~5>E`Lg*!u zS{l(~*R#W~P`J;-uum@_gm-^~a(K_@6cYLnK|>c4=HNLm5s16izK`6phY0-1COp{W z`vF04$UANQGvS~chF+LjihTW%IMs5(?U)m9}fDYr~BWJn&AS;EyZKd&g>l~BGl!F>R~7VX2vc)!A+T5W_{ z)Lfd(qH68d#r`2Yh(L21kd;@0?+??~^;KbJplfy@ylFsO9H!<9r1jve|Bu{s#|*~X-r~z}@_uFOZBX`~ORy=?6P(K|1>kJ$m95s3Q81`~8 zoh4E?b#KuUEclehVREE$BigV)f#W0FCYbp|_SxY#zo6vv0Ujv0x3{OfS{MJNe{woD3mRXzvg*4A$rAdwY&Z@T)>aq}@Y#UdHvcfQ6=j}fQq=f6SA&2Q zKR+2Y)phHEJ0&k&eAU2!-sc&_j(>?Bj$|d@hxb0n$yQ%LG$UzKPQ5>p2~b0@8Oe3? zt8u))N`^~>;{s{egXRGN>}>T~Oqr4&d|9~PYTx;tqx+D3le@dffi?Pru}nvMmpFdA zq_6OtnmNRH8`;W!+Y9}bwmC6EHpZp?Dva7DU z?O^>hTJ#hl;*!vkE$i0jt2Cjz9Db%?B%z3T)5sJd0;uAL9{4XnT8glJFc_c|dRNY#)P#o$M4j-#%`_7FY0We_+x#y@l9n z9hSF2!F5;px+<8+@SIn}pJqlpmk|EZirXFjx1JAb3kRU{g691HDpWU=Fqmk^!@8;L z$p1{u(AP%dT@cSlcSb1hL0JY?_m>UBS}`-*rQfP44CY+g2-|r%KlN8axAz+#Dx$P~ zbq`9?`S2crrHY)SlFv2NIYur8#!^9{T6aId-y#^HgY-gf3G$Bg@mO9N&$Z7qNaOXU z41Lc(egTmWSdODI5`<1y*Vi+n2bEY3-x?C}!uK&cdqcv@a516T^eK!H##RL!?L1KL znqz#I$hIw>VM@BF+dZ?}y(xgn%fcy_dKjT%w~x5v2Q0Ctodh7~O^3kCU;t!&s?(uI z$&@4JDipQQXtr!nL55HPXScKhI!3k__7ui8{&Ir9EbZ7yu4L3^6Nu6Z9ctGO^0M&F z@Fw|6_c|alPmC%s2oKSV*Y)?iuJbP8{GlC-j+gp~F7m-7AL}5pH|jvu#a^2$*}6(o zyfkvFI)#>&mSVvs&*-S$qm_1-PLk~E379@S2CH416bu1Ri(T9X9tzc(HX#mPDazLv zfVfFMA0JqCx>waqS5t8t_ro@q%y35s=>ncjW^U zqMbS1QC^=@&TB?EmIYX)bZCd(j?@KId<)Thkdb(M>hPEDJ3s^Y1UAQ@+4L7x5tG7U zk3+ke7FqD?n0bIlZCoJt^lPNtYb=@&H(x0m=CS)^wa`ShDe0B-5#eh{rzMfM@BFpn zUG>BQ ztg)R&PB7=B5WCC8{%?5)H4X75T`~$f-qbbg5%m~H{nP9%_@12X0f9p}b(?v}nPqcpa@r>lf!L$x!IQdTa zMaubX-aptnuK=eSVJ03l7sJeduyo>&;B?sDl?;h#bsiD=-&6d5-icmO8nXU^kTuxi zr+=L&x4>j7VG7+hsXs)X7JbS)+Q9a9C>3 z)z}3&VhsIrudVT$@E#n zZ9_-s*hIbLBvbrE{;YW$l}IOASUl&n%3?RS&@xhDpX#MceCgJwV$t~@?4 zfF_~gtVF4X2u+#%C{Jb_W?08oaAiT!j=Ode4-C)EeZ+Ret=@B%@yTP4wIzo~9J?td z<;GSCG2|OQ^Dt7K464HyjP1KOtkq&?@33=uoPzCF+CFO7Lzi_%4gX>36I0~*Q#zu4#mZi39u(@%!Kbh=gW)x1jyqk2qDw-&2xnQt-c z7)%vCujHIc)a|_sN0~vf?VH@z_TIs9{^{jChZ{4yA}5AjUaY~!Bp`zJRb?&n+an)x z8G-u?z0ubM4>(9zf&=|4Z*Qf!p-Nm`s@8IghL2#=zWYulH`rGjQZr0!rxNLzm}VfF z0KGu4$$gNt($keU5vcBlS=lJV7lhd>82tF!PCL}}`KK2L+-<<%Gf(BCbqe(?;wumE{fq0%?bwmS8CGh)TMMN=a(9Ld))&H?FxCU=JD zEH?$Xi@h#^Sv40^#y8oBTOZGS6?+>M}zO#_<(*FJN54?{kUxCHxtoKurQmejd6Ju44voxw| z*^Z%UXlY1}%e#S6B)sY?$r&O%;g6YG9!hjKvVLqc?co;i;CwEEceqdT`}0jVgfMu< zMj$TJ-`G|^TQK8(rZ&1g1;xLx_JWOz?n;w)p`)89as-)Xd|Zr1_{~{(Q+tO53U z(=8t=s!+k;pk!{2sh;N@&qIHeYx#BxR^tciPTB-Xm=;Eh=`{(>wAHJ_bwFXjUG_`5 z1+{cVee)NkuBWe9JtA;njiP~Z^<9I2h_s#5-o1@n8`qb44PAh~BjXDYv#6%H%yM$_ zjJ2e=RQ0oWDOQL$PxBZcVqR0z$|h#j1Oac&=TvZXWTfEk&eN?#7%cHzI3$2g60T&> zCQ~vOkuqFrrd6q1Lwq@|VIerXEF0oy;0pEAM00DJ2=9rmmnjh*EZJq?A77UO<2JDu zAC)+9wQM@+@OqtsnRr|C>mkP2 zV=a7sV5Uvi;1cY8Bj$t6-F7*g3z1%chMuytZv6D@@05#AZd*$l2i*aBUd3ZFP*1F9 z?bRypd@JweoPUqt)_!ZHxb)s#`$9$1ZclsI;MGKuuiGmW8xaxCuC}2Vo7i*xD*}`V zW_3f$PRntQW|o5T6+Eh!|qF784$O+IsC%a9HyBa;kEa^gj*wA9G^;IuzYj zJqz_I%K!Tr*=MA^bkO7Ko_IR8o`I$<)qlI9KI};;AtiiXojAjU7utdskn!MeiH`#G z1xo|Nv^{OHU)0r7RlH37a?=*^NEqIuHyC}eu*}w4oX{FNR07i(<)D$PUyh_N`lv8% zr+=a?a>KK(sjF3EubG^^Ln7wYm$$#6pPrkO^`lh(q!|$E9GzGD5bF|W9M^Rp`&PhW z>p9!?uu9oFtFD!x*^!*>zJg6qLhj6{xqs-2(59++F#MVoLwwTBsIEmakuh zb|J4GF$Dy%jn_-$)9df!7n!2MbXvxT_wiy{$U4M)0@LMF)RE^}Jrj6GyFW#DF8KLX}Hd-Z9?^OF~uoPwNMe}Bui`OPn`q2ntO z#kc77k(Q}32Zk$~abYLYFj;LM`c$ZuKA62`e9w3nN4>PvDgOdhRO4Uz*2ATR4cvlCgBO zQ60qVy6-=ZPq0jnjlI=K!BM{*aQB{_Qp$#^9zT*O&92I~7+QT=O!c)s0TgK_dStJm zDkL2^2>rb!EqWgYs@^J3hwJG&cQ&mCEF2Vz!VIZH|}&wL#V%rOBUqO81JwL-iiE##(i z-5Pm3lRh6AFS{ZvPI5!$n-3$*q1rsn3N9SUe|e_1MXl_;zYw5vPvyNRzo2jtR~DqU zxan#qkXM7MyMo9_2@h>JABxjEmK>(WS%gbRrbOj`hR7hTdH&i!8oJ7CzmHzvLkTC7 zBJi6YSXSMRqZEGGr=N6>7U~6n4OL%pAh`38_N8agGI3;2UyRNk%$;q*CddF`fcy=g z-DptiPM|$FsKXQJlIVZPSKnkWcwgWk>X%(%3bsM-ceujFz%K-k8Yk$~&bm^e2S@yb zN@&h3V+|fTOjQ0T;nHFzSQ=;17sCMGxY0#Q+>^()JBeUVs|a|G+C^08*s4NNa)RhV zM{bb~-8GS7g|T0V7Dp0WuPhuBmynRG5tMWiF&^nWnTFAvw87EilR==VE^~Qdz~x-!ct&_hlU|&qF-SPuK;TcJ-0UbHcE*hN6!HFdr0lFR_sFc>*A%#WHYa3v+WA&xXdM>@t=B zrMZiT>qQb&&?bDOgowgqW@e#cZq9XmeOuM8BIk^inw~m!%->o;)@#||&VwxCN+nnG-y%j8UU=C0)NFX`lU027I?nV42H1tS= zcdkr(LQKid;Wg(q?czkUGt>e3zVc0*|H9yZm&d<7H~vs$z6l_fLHmQ%zl&tA2htuc zLxHF4eeSn``T?u9z;s!Qx5NF3in40|^Ccp)7)Y~wqjG(&1VOcL;+kVkd+P4dV!xSc zzr)7GEfYZNF%koENTI$>|wf7gudc}#07ctW*U-|YP)B@;^j z(XworZ_6{RAo79&vys%qqJCX~1GN=v4ON^YBg^rGcH>fvY;@aq+>V=P8IkW$`&4is zRt5Zk-aH@oahsP>;>^g4IPfcK&VR@qXNzF?P| zfm4wm`>uL(Zg0Q3Un2ue-q0M3GfFqpt-2qNMeOWc`Sw+~_6|06Pt9YTt>EnGuNm?W z3RJfhre!Gs)z>1(aw0tU5}1h!d!F{PuqF~vZ&ZhmHFa|`^K*_EQ_;as6}gx<8#?ym z7+$SdIiKs+E;d=}9x}QoK6_nVcYl?Ue#z~v;PfqFdi;lghWTe2>lKDF75BT8(*J%Y zvIs>a<0E9S1Ctey)t~WJFVxC2$!e^}_fNgWkcDFf_KOTg*V80A8%+c^SH~{5DG}Cb zx33ur?aWsJZQ^+sDk78AY zMJ-gL*>dimgD+O#?j`lWNO29c2d$*f(IgEbCSKNk95INSt=-_)T(EE9;+3|@1k>UA zX^3{kKBV*k<9<1n2X@7kG^I1okv7n9c#0679ID+8A2cpkS(8;!9b(M_B!h#)>U6hGWdMIYFMsiNQ=N>GP+k3uVH;QZR zyEn{y4(`zV+P||by`4U%aduJ*-B9!_T5ibIE1N#ww%e&`T~oVkoS&Z$jM?a1GhMu_ zk@xDZv9{d^<9g$z8uPBQs%{saYsK|2Ta$}>Kn#cB$lyz!N*;CvKl#&}Hb;MEk#@{U z7K%HQDzuaH2CeM1t&2c(pB;^|1pil}>2$v$Z`*n^;?=E>lHhq6|2^*fr^fkUU~Ej1 z1pco7-{F=(3?v#De#4XSCL+ygw6KlfRNs+*gv`RIKoaHLkE2ujfpPCc28`-%wP=Rg z`pDk_QH{rd-`AoJvXmRO5@$v;=wrI}ii?YdI2`j-NkqSRXqH#AMofRfhAya1W;W<3 zjy9S9#lF_1uq2r|K`@R2IL=7yosUE zxe@R66h3HJ0`EU=VvNT6tjdxfcfZ;$!x(ZedbAWSL-hUb@{H#Qhv_TIddW6Eh`b|Z z*71V=X~it|^*Sax?8Twkq`tr-E6r}n1Id}f%!xB!YJ8n%Lr+PGq|CI zB&Dt0X~vu2%(SEm#}-b~(mMZJ__#((0Au|IFO4LynMRJm1#2vXyjWRIY3J(aYpR!J zZM`B?oT-7CGK0RwwP3r)J^-mqrmJon^*dmI>*J&wz6@Yn|DQ_r#|{Mr4->Rzg{8F? zQ~w)qu+;g655%*$EFDjapAi=2{!A=naAVl41fYx_`ZEq=R;*a#Xp-Bc#?>L0NdA<+ zKn3-gOKL=9RXj{$UJC-_vN7smFJ~9)*`eM_e6u>q!%yl4inuI*Ps7)Up%Tw;7k_~~g?XNol3CJLS;*}1MaX~~ z{5GV<9#c)AL#yI)hqsNBQjb_hK{cdn8B(7)qKX3_tD-zCcwpNpN+lUKn*3!4aS9fc zLzb|_GcoZ5uS-%kfj;O*9L<@tNqHWg7I;Ez0_=qepEDEXsa~<|s89PNC#1j>b zUw>R}f52CaN2_!xMrC-ren08QjkYMb=1;@+ z6Z0c%+k(o%V^_SY)XE{=;r6LyA2&D6BjPIc?F?uv-ii8?-C}J=OVOBxZl$G<6Q991 z(&*>u3RmC3s@p9cJW()sY&Phe2>h@pI0WvxLqtz%cp{2WQAq>`7bp@CheZ&+h~0=R zo4;itN*der5G>0U?5UNuq7?qe`nCYhJ>I*jI(=Z z<_{IpQWQbmGO@Ax^2~o4F$n}1ytmevwKKe8x=5O+bvY!LapyMT?lf-|jd@ZtQpBJ= zIW+E57%B*Dn>dB}2m8}ib+hu!Da)8}x&$0%i|<8|iX>UrBqZ92cAb!*?oc|g0Bim< zOkn~3$4ZA&V)f0eiB71WZbz&6Yh$%Cvgct9s&U?&_f0yCr?M<~^e?Z)kyE*nmqrj9 z!Q06dluJ&5vkaiXNj}t@WKO$-k9z^H+TZT7J4-%}>9vY(Qm7(8NQMf>_DUV^_W&YH zQ3ILM`2ygo-6Hle4&v(Wj@EVK6ChHilvf(OVjHa0m@``@rclhgwWi{?|1`~R06Cyv zeR}Y?Dn4yEc#WY9wV)^^{|XCCYQpwwPyb-96^XpZhc-vV`fX6XpEma1;vrRKmuYEc z#tw10p@FRj;zMSRI!HvF_yp%t+uGhRch}4N$xf%tyajN5?X6_jGGRjVG4WArA-AW!paFFcWRh3Mi;T1T{rhOiUl!eJhfT|Gj6mFr zoW#5`t$SV%Zxe~A@52a>R=Hj1#sT$x+GuB&soWg$)OJgtVfeuT(7iqI~Oq{dftdUDfy5Gd(wVn24Z1hLmOr?tR*8# zYES&&$nOe)L0_P;-UUS^@Kn;w?*3U6ZiN`Wl6j>DFx4s&b)QtZx?aRO!<%%q=;lx> z1#^zNjL_;8&F{XMHkE}0bp&_TxAJoC4S}@T?9LZ-NrSLZcNFJvl`IQ1E{2&>wl`|{ zQzcvm6MN863j4k%240QM$tfixM@&z@n~VAK&BD~u1HE0XgQL$+O}im&=CXE5CdkUh zr&R)|@LZG-XisVt1B3);PX7W(u=0Ntk;yPrQz|p`&mIhoV@$FAMDl&I$D(u7Lo0J# z8&F)+Le&xQNT8vSGQ)og5-0UNgL#jGGkte=cfvtA9j3(&2NmZpf=&_dGu3Vxei?lQ zIM#;lk>{T-Lo|E#lyCGhDH=2iAiW~`DBQuvEN(urJ6;G&z#U_)-2Lvw6HmWw!mu}gB&uLfLkP}Tqm%073uT-SJv8ZA}SauZ9l z9s`EoLpL>$E*?C*qJ%RADMin^u9iz|i~paYjSQ|Z99m8aODjJV{Tn&I=wKkh=q$Te zC-!r9V=GZ0cGSVuX8xofRSDde9Anaf# z(JO=(;6klSXRJ_mC=?j0G^43TP0YI@!ZN$92L8tG2907pRAvLO1PTj)N*&j8Wuu;N zNaA6UpAWz@7)*(t<3K`eYYk7H%~Uaao$+ai#0Q&75`=VgN}}e|q`wK21{%$HzIO-cjDmDZ6;T0rN)eCXr;N zL++B1+1B3Pf8uo%o8ZdjnOJ!Ku!Jve5N1V~oU6g928$6jc?Z(o^J?@j7A*N_HvPBh z;(8oI-JFX;{fi5sU*GkW?YORq|NI(Kp61dpRv$v7qY7Y*oYd8o7SrdA@UU@GBGfdk>%=nkutaaS;pKy_EbWfu z-RoZGaQ1<_?2l~HAfIxFJX2R-Gs{cj~kCI3aC-&4?dmFIRCWc5=zn>$P1vQr6palpLr$x zd>Ejpc-_)G^ihr@#{QwwFHuu7&Dz~0R1hsr&2ky_V85+OfEa$WK$;LCsHKcYZy`+m z`j^hU%CnT7o1DVC0V%V4{fq%dqDtc_6-*xjXS-7seKFWUv+YTo81i|q>!Zv~wS!!u zGPIALgoFo0bLOpL`EfM4?6YEB6sQhvB%^$Z%@iSlC+IDz6wc-z%QJo>0Pt4~%u;hR zH7Hq9S#6_c(%E+BX`T`FXzKeLSn!Ev9!t)>WCkO31 z@K1{nMRLD0&FywLI`Q#am3|&IN0e{64JM|*uV<($FCHo?E6;CCYK)<$t1A!vHJECE zxuNc5ZJ=jR3Z3BnpSxr|Y5|2%mdkA{9zBISWVbLI6ewvd3vV|}qwWqMHx_!6(9eNg z#K}G>-jqWPC-DsI^qb4f^xf1IGShrD*Z zPfoD%vSuSg7wqu6W4FDujKq<7F51>lSwLe;ia}Wc4fK=Ow$cM~`BLEl4Yt0euo4*N z8qMkk%7jN6<{kB+9Y0NHSL=H6r)UIIl9OwcI84cIIQx5rx9=$&EgsL`_`MX_K4gyW zJAV$52q@(8B$hX6FtAV(+Ww6T721}UvyY6evOE`$?S5|wKcO2c$^JdL6lVW*!gM}=xcyTh{_aZy$3Xe~eK_P_cHVzix3gn{YK-;PZsPbX zq6(i>HKka9yt0=~GtC_xV%S?-qpV}GszhxE&Xp`Aq&~#AJbvrXp$!K4CWT@*Jg!-T z=y6dapL$Jd7nwfJZu-&JOTU*>`0$xeijAqvdTR`xKs%%4>!Fs_g)FXJgHw9uL(?0g zZMHW=)kBmEk~A=WhKJp}`eL%p;&6r#+qZS}=%?ZhPEH5HCwWZW3GUi~h#_(*10#P=>>6FFhrLjX7y7#r2 zORN6AgEpo5?yDXaOIBnQ_=djZ-WAYL7?c5(a#N()Q*c4uE*5&CLAAac0h?p*7 zzoGsc*$bLc81AvEr>Is};sRhz{M`53`*g#Cq!Ar@BW2kNe4U(i#jI>#aYG*<%ftc7 zcYXnkZQ`@$3N!e17>rT<-yl#RMtvR>Cr6g_Z2yK(P$Kpui}Tq9CQH%>0cDXM39fE4 zY$Y(q7sJ2dq zOI`EZf|^^pN@Dk`GF|8iXY-(81bhJ#64(7{s=Dxm^5m}AFGhFU;9j~&3Q0)GuU%z@ zPvF9cqi2}U#dyx`xO7r6;jSYaZspBiOq4(}{JZPL`&Wzv`+g!ZTac@L2O&q>+5{h@ z;}LsPDFeozQq(ZB{J}UOzkEL6ZRzb>#zBmm1rMQ>pgh3}18<*AE8+drkX~O}!YF_R}E{MsKxpgo<3DHU_YN0)z!4%_6V}T5fl{QHEyYeo^~a4hgLPj7sH)hrcPK8;3G6pQ}?`vzHbQGqZn^! zEz*Oad_!NaHeFYJfyN!I@;gJIi(nL9C-7Uj-B+Z`8hX9Lg#-I5U-ozH9=9!7Z@vzG z%y}~LzFZ|$gA&hKIhpEf{2uOKN4nbb1>A3hKxG%8{%RF8(+VvzPpSDf+$`OaByB8p&2Qz}hP=QN;b1PQW?@V4aQP#{>abA2)xDuRezy>* zjTri*mR45s}v9KJP6*{RJSgXAHgH`G&sL(JzLzUF^T#Fb)(B|vT@*>`Wr~6f~4}Q)L5Y213sSjEHuw)T5xfGo} z6oFu6_KR(`=l=b;(pz;b(7H2H`mU<@&34tlY1scTWITU4d(nbYt^VD-`a{kwosxk)?1E z3NG{HFlm4S)TvbJgwt@xeh0lX?J(LxM zxyneGeT|BhIy-3#!Q^xL8YBcc_y}1wgy-!g_gBRg;23gn5)9eXK##CnR6!XTJNs!Ep~yW0tt|ue}~yrTDve)2U3Iz=5!9yim6@)YDJDn0ACW}HpN^! z?tQ2crxWuZ*Er!^|>e zio;hkt~_bv!S5#QZ6(jY*fi-J{Qm(+XdLv^=?@2B;lTd+-~XrjOknoLh{JUP{Q1&n z&W5WE%T21_wM_QjJ$ok+{ms0I+#zYREj2QJMiHu+_`t{W98Mgx+{l=sqFPRR1H&@7 zTM8EGZb{y;+-P~)&TXFUr{4**WnY1jxD4xNNViL!doRx(FNjd1pmkLr`4ZiUN9WSC ze|4P|OLDiRn=sySRRrN917xi9cHf_V>5wtyUYa!URk%A+>=j-l&oSNrWEC*JaJAnRuO8YGA5iqV{I{eY%>4 zAICOMno48LkFl3|O)XlBY(b{>U1%Ux*rYF|t6$fFf~aa+OyB+b{`mlI7^8c}eHP$C zdbXF6Gg@eVGo59qJK>Vy>YuYz`m@66CVxh`X=bZ=1gv9a7<9$&Qv&R_CJ}sm!_|nG zSJ`19_hYowBmVbP88HVvQ!zKUpr~KM(qaf$0|#TZ0J;h#Z|XBnTOKQV2+c2}Hc#r5 z-nH&Y>V&R4f|y*T%CGnCF14d|Lap>PLC(?B`?vv@Fwj@?*-&n=EMer2#qv)M4F-B7 z-O&8yg9dx2s{P9cjRa%<6q0W0-UTO!By;SW>51Vfi~o1^F?zw8lwx!zsD%^zal(eb zeQx~=M`j3?XW@jM%-R60Gu9H5^kRSf7hv}VdQZq_cr!fqaWHsBn$*v%%9H9<@#E$! z53?klo-$BDp>QeIc64Vw>VzuVm<@Bgf!x3!bMVug>b&0RWF{`!42|J>(MiN{3QmvW zm94oule>eB4a(3e-8ms5 z*nMw$62kKpgZ>VyCEN#yb#euni|pn;!t%b8|FOWfDvbAd!vh3cTKC7CX9C@*#Yy5v@6P9+#@={Y{dGA& z9v)Z{x*2sTCQ;srecx1|r|wNX_ZvqArw)*ta#X1OtO%03$0022f^2c`3xi(Z4SFtk z-M+5o{~Te1%8qLWT!cf9yA!$UJ*rA$8cubaJ@}?=G9Sa^X1!yseD{UKS`nLW-HX$I zXgyE1KA%Mhf3oXtX_;HFZWIoMyYh_qFeObabUeO4nHZ~Fdj0f7+K>#Hcl+r~lj;+Kg7H!9;O zkM9$FWw}iu5ss25G*83cGxJ6HW!bO`3`jdsUFPml-=t&M_XKSHg+(vG?x_daTgYHh z!hJM&!QU@8S#Q;%VeU2_n0%DV{7sHde?8*o76u$IFZ^Iiu9i%|g%rx_K5K*>_KCWxlyi@o$+b2MkZy33sZro4B3Y$e* z+jv;wY{Z+`^aqZi39n+cSaJHTIQ09X8WydZx2)^8%y?_k22Z?^X7SW^^;%!+qi>z2 zrKK6@|Fu}jhX3cdOp0%mWzqgsn>M{HxNvk+jh?o)xVR8&X-DH{LJqGY@$K?n6^l?o zQV@x*ZpQXp<$_^IBX+|`Eag;18zgSC^tn+M$D%3ZNihyg5U*+ zdUGsYl4D&U{tm_A(OyaU11oe7fw%*JM;@6`e=k?pFWS>G!u@U;8p{*3Fov(0P(9pM z-Ww6=v3#%nY*%{Xsy74XO2hVXHwLKU|Fy<|_%rWdf58A;1H!le$JbkiRk?2A!ipdz zE#2LXbazODl$1z!H%K>#(%qr-B&54zGU@K_?)YB!+U{?yefBxO`SV`$8a!j%G46p2 zr&Z?m16a4z*KLtsM6nqMR#M?}iVXtl*xcq#DG5U_545Xa?cV>u(7!L;nB9Aqf?LLQ z#rL!pvEEG#C@MuiT9U)*EokDgeYht^g|QXhjhFl0^XT3_82#RPir~*Uv`dv5y$-=G zb2*FIJbjlcFqhGEf~7vi1(`2z7LUr;;@DrxO5T+B;IHj6I;KE!63B|4FTGf~ny&8A zYoqw5`uMva2DUv>0bJpuZmSCKKM`An90|G}#jyz$LMx6w)tn&%Mi3mu;9pf|Ck)>< z3bUT2WrSDAg4_G4@l7)n>slq~V*|s?o_i3pk@WC#G#k0V5d1I>Bko{?rPriTH0j4C zw^$2H%i_Yq5E8O8=N8tbfCs{@z#C%lYh4*2Kw(2RABY&ID=i_x_HA{%r@~iZhHUi& zYnSpXeQ1cv_BkPLMGKFJFt@Y&D)?|BR-7xGE!lUwgMnJD3Ab$DN|?7&sy}g`cN}(* z@Wn%Pe$nzkjMhmg_?V0ZD(ED{;20FxMKNHEf)sCMm)@JBrC|}wR-v!2quw*fQbg=M zCME%M+h|Skke@&h`0dMS%k(49l_3)b!YS$;w`g_L&z0Q!Nu{YoQ*Gwv2fXIHW}&>i zNCw&WgN5fvFtS;rK*pr!-dG2Laemj>Hu0m>-64R*U9vm$80{Opelh93oU^7u&YpzSfK^C6FIKkHQwRvv zmYyHtb))}lHu_x{!hl6{Rq0|nJMRCtJ^Tx-B~ck{4^oeZ9f2@T&qg*Kk~v-GOuG}; z{%s_DNtqR;Cu&$xhy5u%QTUBr2imrt`QG}|oA`sYMspj#sqB$Vt#wMAQW5dMeS@}{ zxj9(?DPXNr4_md`w7+>sW6Ki5cYC~?p4^+(($Z@DL^gr3hy8rWk+)EOS*=mOB2UgF zsE4~}nD0%~W$+fITp8#ojXz_KF=Mvvy-{+H#X>oAO~7Zs^2afTt#|TKIR|mIHGHg0 z+eiaj4`yf^oTvtLr1G85oUJt#Cuc%bsw%Ajed^e3BZ^NsL!-H&OG-i_mS)=Cd}?}m zLauv2{MOd~$Mq*11wQK5&=iFhapTDln!>D50n)cBRv!uKvA4`k93l%OLugE_Gi-Dl zMaetG67J=U8qNfG;dfku7jjG6bBVU3m+pKTWzDvm=F9kD&{57}Q2V@br5{X2x&2%jjdoVu%;udClGOSp}JAbgx}{ zL!dk(#^+nIR-w`SY=~z7IsyEhx~Ez*jUq9RC>IJ7Dhw%Qs7qj5`x3|!e^=kiY zO#iA2vNQm|ku~{Kc>c4ewb?+q-3DU%q5?%%e$jH#f>1c|= zP;SQc&>z_XhLE)f4!{~u*LedlG~+!dcS{n@fw}q!)eqU+#D`AhoW=7sT)C@C8_HvV zs6UNaHuF<&xOeaIy^%JK(JCd1$g=5;Uf=85_4V~e@Kv8`H9{mH&c|~Fo~1|*Ff*w> zqTLnMOkx7$YgT)P!cpSuI9I+nfzdCXXzfz}No_^oVzBkMiJw3MGB95$6TxTBOiFEi;eYyX@yz~n7mlUf|<^8d3199jTkHxRS z*daZ3{FwCot#RxfSYTgrINtro<5fj(Hqlj+V*^{j5lZxE{<4>7U743G`GKL8rQ>)k zXS69Qxc+-Gk9byc|G;ozE_0J4;3iR)Ussl0aW}BCdXtE`6r5o0;1dL_fGX*m@&WcQ zM=Y}o*px2EZGiU}z1~})r5L*pnDto4e(&{*Q_UTPGn2P`#}{=d(((7;xxI&Sq1qm3 zu>ZEC#&xW?n6@TMs!u0CvrHxmrXYvgDPO`B15odoQW_#iQ&(v@dM6Jp(-5Ttp93zGp5jF*2vkt z1_rg`qhK>LBaQ(Cb>~kR1yMmmICQsziCnK3Ey9@(|6~F9ZsW(8x42YHzV11Zgf_Cq z`6MR(*6KF$Hfrm5C3ibkA&&g(jdOD@QqJQF7t|T`C$i-l3=E9i52s~7M5cO3w33Mn z5hWGnIP$ZOu2z9N=fttQnjPlu&v5^Ji&Lo@r9hu{$6k| zsg%^!6>Xa@6H;Ofkc&GvHbS2)%ztk4x(vB88nI1e7Av@=C8b#O2_`f+nLqTZ28Vr$Z#UhO%L+521R{?6uLZx?z!GNDQ z_uGIr-4+}6=Ry@-L%bRng$gsTH~T?_kPsRB~uRcv69NkrpkBtQ17a)Bd5n%hR@wt zTG6<~#T%^VUQE~+wHTb?{IIOCPgFHVsU`dpU=u+`b+$-nz^(0glca6lTGXUnx|7~P zf80s3)Lbn*Zq)f(6eg_GF|Vlm&N-{32zxR~glXUwYGA5gFdnvL&2k;q@*x9E)(W%J z@|q{=;*M?W-59haJcD+LC9lHom0=)Um5!nGGYZb>kCz7rR*sn*im!AD4`9{>J=<>l zu}lgX@Q?9%Zt#0o!VZI`TNIHFqVg(A!kdXHjyU@OBs}2KJ&x^qUmSq6&u62X-%IFf z9wm{8j?CoO8KU^JgX>-TEJnx1hHB?^2#T!=i6~jM{?PYPmsiO~$I00&nP2Rg36{1< zwFAu>fJjfkK6~K7=Xo9vQd3V7(_ius&-8t;Y&f07=3r<2RKLs`F|FBZu-5ep>g8ui zmohr$u60yvpXX~PrR{aYy<=h(q9w_@#$wPRm3$P^?c3;7+V4lUQQoC`Rvkl^ei^S! z;9S5m0_!#FT9l(zFdi)?{W*1zdbp>J$#{*UlJYRdJ?12QfFxfl1_tiI4`1d4&*-kDW3xwlCd{l zkw(mKj1M@TK%W9Z)WXcvH%55Uw-@#8Ln2ND*-7L%3#e$guL8xhrRS4OxLf#!ajmh< zx!YB?b-TnBbrcjtSkv7AkXT~-0g4PR?325*ZQx<4wYHX?8c_%!|0@5^>*D4*CyY@r ziF(K=aI+JHOpPi+gZ7$j%Ck(aaqR6Z$ebt_6)%k$BAESRsVoWVfTL{fhc3r>)~V_9 zdB$6#GDk6ZF(6msqwnZQk7!+yd<;auw$IPIJkQcZ^Q5RbuBmA!P6q4CkMQeJbzV6! z{P%O$n%qvo0uB>L2q7eR1BQ^%C?LfxGdXX>ldA~W-k#_sk^vY*hD`~ka6Kr$(4dES zbkUq3mVhhVxqfp@c z$Q*lmYdA;X6!B|gF*}E+Q1=$xatFVJ-XvE6A0RCsk;D7vb}sVo-A_DXVvP*Vs7pWY z8q{7*!Jp>4o^H%cDVgyeRpgl;2C1k2*EsA3B=*qoFHoxg6E&eKL!W$uW6tH*cj;d3 zHr3`e{=BIIgqmw(+M63H;MSL(AnN0!NuMab_;^VdI0x64iWXI_`DtbbmHw2fFi%CL zN)Gp?q^#s*pwZ^CLu;=Mn`idlOJmtUm=&%-OAwg=ySc%^AI;wF)=Z*8E^J} z-D@;DTVU2XbB7ZlIJ=1pSv!4JUC+pSmla(0i=37y4&&t`XO{#V&MP!0{W2fGr(JbI z#UkrqJUTlKgq}o;=BW<*s!FrzmEBQ9p&y1CJCk6S$I$pdY-Hy73~J{01>nIyx75+h~`r0$F?-Lb<1_epyim&T~~!UQkcaV%JCB z%{pIBPqP<~@8k>(aXn{g3OhO+nk`)sUqTY~eJbwfZ@Nb+yK!tOyn6-0>T7h3%t(wQ zq9Ss8dOEB7*LEQg<+-`JytD%=Sp@|Ze~S#lpaZQ=nhUtRH-2gNYAo@>!&1>>3lC6? zOiaIxS*2x6<6CzPcb+yRr|ua)?==KmPah85TXb75&yV%iFzI(mZJ_xb@mh7l27$Ey zCI05y9o|vnwwXe(MDoFoQRJyRJ$W=a@lubj?Y8H9h!?MN>(bb_|14Giu>u1R4(k79 zQA=1HwJn0G>BTtn_wTyJaT;o}m^D#x@ft;e^ek>VdfHjVm4H7R1PRMI-?KYLscwIX0-UDi z5~54~jG##muJ25HEFXh&GH%BY;U&#~xt`#^{LLa>KARplx2`vo@h?ZEInt25694={ z+8^z`EXAhF*NuYGE6u6%{i~sib8V2v6vOk_bD-}b(e(q1ZN|amqQg&}Dn>bzIGU~Z zU&JXKMtBPAT48xlB#IF*nSUV6gdjGlbESd6+Y6rHdgtrwgG)2Ko0fQZ$QKr6D1trK zqu^KjP*MxR6H%M_l!@}ROBynm)Oy(hAqquWSI*U>p94ej=;;UJjKlJMZ+F-hjaEm~ z@ilarjHrnWrkr!i(b(@o(`OV+rg0DR?|-E)nA|;udG4A(H43^Oy>S7%Ej zn2@gb4b6F5J9)$&yAbr7eM+-gx>*BvkTOeNL#{n?U*KZoklaC@atmqM>%I;QUPFpi z5Em_pvfEF!Fs+L~`F`X`lS)WZ1SuJ5Co_tZ^_$}R3P&^}9iMqTAI?QK+J~wH& zsT7nNMP2rqf-*^m&<(#7#(uwa)p5R_;x*!Pr&mmmVYLO#>{fl$?chvfzr%%ju%`5m zHpIUYnHLTXxV!_EuBYi1mg5@TRt#(RZCLqC-Q&);d8GblCkr4B{-`g0hf+ZQoG+Kp zm;5ixXAR|+9i(Lq3mZbiK^L9A^h2}ao1Ba}R=Aw>2llpTBovxk6k zwc2%vi+-?s*x{Oc*w=TIc|Cr~bl=C>ip-Wt2WS}p4#~+s2@xJy5Y@WoonT=?gGCAf zaV+QP%4gcYzDAHVE8SwqrOTnlp#j`&FDXT@ab8*1%0=L^@;{tV@W=JC+zOd-t$aLCxClH%eV(lSJf z6W)Y>u6&{chYAU@i39NhK*;_OSWu2Bs?xbDn=G39^J=J=-NbS_k$eyXo&`~oGV%%6 zk%p?#rI?4qJ>I2D?F^gz6fWG3W9N{gNTQ)6v0+iT*9Fp9Gzq4k%=&&WIJe5)Vb^Sv9Lwf#kvtz8@L`zmIgf=BTIj?e6WY65TAb1a! zZf^8P;=S&K*f(D^X}Q5Xkm>T0!CPpt$w^nv636Wb#+R|tf*VIOo<2THgsKl)NsEn$ zTA`DLW!9i5**Z-%v{#Rh%QOf%QV}p18t;Bu&u}H=E~FacpJi^HQXZN2fR|Z@qA=0W z@N?_4eMLKxI_CRnen8gE*n6d>uIACpHILViT!-a}ZC?we*Rjh9jEq8YncfR8GPyDJ z-Ub)dqY99_t5DAbG(nam=lT1`QvyyOs+Oph|IBNDo9_%fful#GR~CxJ|E2PrBnhMP zLDY!^B|YgBRqQ?!Y+@be|LXd@$sab9IO}H+~*L)pj)K*e5gkus=8M7n}uAT0Yj3j*0Tv!qD4y z(}MXuDIs(ny&E&3gOM&{FYmnUwo_cq`-N_jH$=`_GZIXyhHgm-hr=m&|*^) zBqR-XtBaSDs3?=u%g+1mS)iXf5;R@5j;me*FqM5D#}vpa2G;A1Q?@JD$Q0>N2f?K9 z@Td4Mk|-3sEahFs4k2$mL>Nh=qxY(k?_s>Cdh3zHx_k)3v!ieK%Y~IH`c#Fg2 z!j-S6E(LE?+}ry<`=xX9>P`Kats-7*Dk0$e$Rv$CBP`qs-6PxdB2rPIaPdAy$>&sX zuDMW@hy9a@6UC4lid0G>bH>TCk%!B*oK1j8jr}v)29q5?Vb2O-4p>XiztMN}8R$ zA4|mU;Hv8MKF#5?9`K@p##JXeKOIsLIRezLa|XrYm5DC-{O~T~Hu<-@E^)U4k-Y4+ z$9OdrdvSqliUMsKHacydamDDEA2R3-+zl4P0jV4l^Z8T?b`x7GMBNY(FvyI?UPDl# zyBi{FH=*59BHiI0*pJ;XuYb0I=<0?ZEQ#4apxnae+&DWOCQx>#=YKe|z<01ozF(K{ zrE;-$F4n`+a?i{B*R&y2(%NGPZMhrswS6NEDNnrbJbeCau?*g(^cboXCx2sk7cc$6 zn^r9-BZ`H6k~s+n34=gywB+^n09ZP0H7Qfav~=I ziZ3%gzkb%-x%}g$znKQE^_nlLu!s_rq1t;de{>4)@cVHN#F%YU)3iOg_Z;BzswFze z*UB+e6yP_?BS*ol<2%Rg$Oab0=oo1WA0E(Ku-4Le-e1j9K_?_&nMX=2gZ26IuCAz} z8R{EExbyDG*n3cVw%OSS?I+YsgiJ}EORsUo&iDN&@>&SLe&$B`7QmEYKweBw9qZo50hZM1x_($N;N?o_1viNlj`+rOkms87 z@Mn+9{T5uEP!AO0N3R=540|A%4GM;F$Ay-fuQM9Y|x=Q}1L1`$No zIL0s{rq$D=oFS%y#Tpf;YaBpB95ef};66G^;vC_Hp&$aauWjo|^kmb=R zG~HDGq=FX|7({2f$%4*BZeFNXN}X#tyUr$KPAu@`LIYhNkp6F>2c;pOa$bg}V|$_X%hCcxdv zy{*SBS4Xt|68O}oZBT6rCh|BR<}!D4OR`yP$iM1z7UbnE2;@8;Y>$ggmT-)aW1vgP zJB5(`D0lyn!zlJ8U}yR%MYMBD({u|9y$21|8V!babzIsPMJmE32kqz;)|Sa*4T6q| zhPF0Uy1@OFhr5Xco;GvaNp?<7I5Giu@zl^r^mu28#>a4eXdtm-l826IuGc@70>O|p zBQIU-#X6@r-X8Hzwx?@3q^oQ6_3BqGBd^7}-P2~RP44+`IKG`&rc`-$oQmr{sRB~? z*XI}P10qoR>^*6`zL8R2N$&i(;URZvjNp_Y=L|X{<|k8^Cp`}JD)fIpP=6aVU!nle zyziBpL(!kA`RnDJiH7c&wMQPY!R*z~7J!XW7O}x1WR%X@YS*G95lyeLgUgBcoPKHp znY!9ay%j7~g|vuW%+)=ATY6mLL0G3zVjNngS<=?iR`DU?CIfey6Z2M`3!mXf2}K!PK^krL==wfOx^NYrk1fMG%RWEZCFZiSch;W z7Gb0%{`~P{im($kN}6vuC@4ggDaIQ`y;-te!n3a9&zqylMJWB;abNwvq6%EVWy#5F7L9KklKdTADaXh%Yf>=PEyC!Gf$hqFgayr zOHs{3(73v>sPy<1RoB_6LeYBs*?j88W-$ZxJ_Mu*x0Y8ONw8TR!%y849RI>Pj<6RS z8|xRrb+_qU^kDQeBsTMjpy?E8;UQUnMl ztQ&8J-$#Lpf^t_*juCX?FKVLBoIZzeM~@`vtI2xO)757RW|N_IiwCO6%0kUc(#>7= zZ9p$Rt?|B_YF4^7h!n-)@;S%v2EIoGHx zj(bi_L-y=9I!Y~=K?C(}r`!8l`VAMPm)Ew3;^LC0qbGK-QISq%*PA`8rwy^eD5%KZ z+w(#>{{AZdEQ(_z6f9uy%f#{rSfmTr62uUvR-+#7g&Qvu6P}UU0wVlmWew|B1Khq( zO|%f_uXRTON*T%P^80XtDTGJwDnx{&W*V+>4msw`w$3TsH0L9ozx@a1{OgVU7v}kY z%#JTiWaYs_`C`<|S^iZH1GBo4#qhCeaai)?1kO9g&m4>=a${FL+XVJIXaaY8Z1T}D zZXe4&SHue27~=AAv?xg2)0^9B!DDKDqT!*6lq|&FrHlv-?lIM5n2?r#hcX*>nUWIZ zYJ_|y|7Uu%g*WS^Iz(LuPWU92r8}%Vd>%CKeTp5i6~To?CQxEO(QomZC5NT7o&7lv zTl0k-ovd&Nyw}P3pg4^S2}M9eoQwp!9xWD@bUao^qzj{Yn=q1fri4Pnk=!K_5N0O? zTSN;wYCOt2PLOI~%pq;2u6_>jS`|0h;yJMJel+ye`IM8fBsiy`C6W7`{cU`bWCSVe zG7Dx$#?lCu#i!NL0DNDSPu|tU-&{D-40}C2uMx#B;0!}fm9X*+p`y^3@BW5}@Y6n{3@^v{BT z0D0{MUORenBrP3_w|RY9`7W3eNq>!Audbh~A45 zhNGY;1T4eqShng)z=)nf%I!yp8bC|S8|P9eIff4Qc@EjX-rbrMYB+4$ zOOdFm`|~Z=aBY>{JAJ!)Oj|_8Kq;nDTEG(9wVAq-Be%!G_Ij#%~PymQRIp=m8#pcHjYuSWM zU8@$do+K=X#=%_JeZt`^a3ah1VLkIJC1dg!hEW^~F$0SXl=$6at}5Ny=-LF_V#5PG zOgTfbCDy%Fd@kw0oVkoX^<47U@?QCIe1#mJ>s@NprxFMJn~724 ztB{y+SDzCMZKRl-u8WUPy0meq^+@nJ_z!?TZw>z4=`yHMfApp=YnTjDD@}u_{5qBd zbqaZO#wMW+E;fx$F;jJo`oRaIU3uGykVG)ppc){2w6(Y|E=HX9j;-<~p32;YvmUh<4-dbb-~e&?Hef_NC@0}n;D?npX^1+gC-9Nb-x5puaHDZl3gWyqCS zUv0Wm8UL@n((B(LlK1Z^rT*%tf5I$KPoVt+#LP4l1mg+0M+Tu}-y3fux&(iDVWy!? zh8E$^^n8lZ;JVHhg@U52WQW?_L#?t`#vm(OqXZ|#sGXFW3uza`+uJWl-jzW^sdxJj z7$l{HEJfH6xwETPKjb{Ejc+h@Ux|jGt(C>1ofB+&z0-bJZsz4RbX2mpvu5Pj_|hzE5_s<(T*9itqA zZ~Fw(?6UUNL3>J>D3xbm9S%{ZfJ(BsrX_eUV<~q|%5}n3W6z|(NH^=FPT2{Y<1(s? ztm0r_L8mE`l8rL%CgyQrbs!A_0zytlHO<DWw@TmmyOqIqx;J(($8SURz<>B z>=V2kb?r&U87%qbps1k6&}y%EiF9TzE7wazD-nO)GPp=o2;BC-#l=O#7qv`2+Fe|y zgPLQdUBBG8_SQ^8Q9>giBhBk`=-zEzYRbL-sauY=gaRAj)DhHgx^Yw=etJ@9aM~5i z)R^VnQ_@}RbWXkSCZdmAH$+1&C7(Mbj_e?f)Q{W_<66Z5s_DuE_h@T#=jq6%rDxqK z^KcKu6D>Bk2PY;ue`#usID(d5GQI1O(<&?!;Q2MzK0FzmICW*-X#8I|;a{zCJ^(O) z)JpNmGX7WRoQ4mS5?6Le31T~sfR9Fvg|Gs2(!~b1L=X&QZ3tT6muG4L6?MEpk(oZF zmZnu;^4zLhUB?<3TyTR<>JB9snU9yBWQ{aYn>IA}O}EMipV)Bjx0!K2a(GB1Zf9}v zaQ6U4&~yR-81Sd|4=VQ7A9OYJK8TS7@2K?gQ3?9_-w@BaezHn3p`uosphZ<4Vwq`cQ?+vqeRc*kLBt&N+pWmYF7KuqVUU);v!C?~#_=qn1ZWqQSYFI7E3mywYX>-TL z#}^+V0$p>VI~OdpVf}Dm<6}Y);z{;R`R)3l1B>LubXKlIwZPnKsr&uMp^p}+CDtO% zqcOrXpXG4!=Lu?8H5orl*6uy^MLMDwYd#BR4aWZmLH_OSf))gXei$EoS)~7}L33z- zF;ReSNa?18e>+T;fH~yV+wl#+{|G3E*^9s~XkEqo;@Kd6oohWHm@ofV-dhADq}=Wx zm<)C2uR)B~6LU&p%tVU`ePT?tZ=p2}a1)c>%a}L*B3$EvjpptGWyT<1oLXHQRaaG& zKE(K(9urLXwPR5c0Xw0(`SH7}OOy{@Y$9xC>ff@Xy2DJeZ z)U{f~`?9ST-V80dWl5VjBm7g*f<2F1^sw_QYM%#_`;tPaGY@&#clo(MipLmza&W~M zTHGr3515#TtlxtuP}RuUhS8;Xlh%r&vm?Gcy)8P>LH7a5Y> zTT+v+O`PYD=UI9rIl$A;Ym9Tc9~62OGYYP*KH%Zu6kT z(90w!xX1i_Nre!@lB7vbcUpx76YK6DA-TawUjy=yhRtaNeC#=1i^gpRsFy3BKFMMp zHq4;Q1?@sEDy&7}Z4$7sxd)Um-l+-Y71otQgcU=0UND0?<@sK0olKa6SEK-F8^3T6F$aA#<{Pthxf z6YbDA;a+HnN2qhqSnrN5TPO$=L%&8i0l@``D20aS9^Q*Z2n4dPpkl)PYPTvqU0!qE z)YdEe9I?yTOp{xy>KrZ>#l?7A)k+i{24rWJ93+Nnb?w682t8bQP_du@T-qG)D{X4} z7*@+V)!?u>02pCX5>NTBvGCc?uM(o3Qcz}A=LSYbvcrna2l{BUf+h_pNA-2JvX!Iv z!opA_U*AuN!(H{vH~9SGA_2+^!`?dV>V?=x>Qs0J-9hL5>#1o9*;=2gISpfg&Whx;Z)rdH1p6;9zfw6)oh$&4R9GQej0! z#pSYl6obp1DI)=|;}!?7K;uama`c@=kj>}HLqxA{bPCjrUA6c%2&-}@{?4Z;vtHL- zVcOklQ)M2dF^ba?-^u&JRY%U7$RO-)WN4_U5(EOD)t)(3j|?>t#xu_U>0f`7HQM-r z*iW{Y(vANL$g352Dc;88bcW=yzj(c4ro|+1l=dNqRM$Q^a2)InzY(O1TkRs)? zy91EY(Q=QU(40FXq`8x`7Ox0+74k8q)Vs3t)DZbP(anzAH-svi|~6T`Z( zPoXM;|Mum81D7=wRmZL0#?fQDZtBA&x9hRUlQyxp;^=l#>m04iEOpjAs^`wO>AmM5 zmL*i#mGZCY?Y9YMc~sQ>9cU$J<~&qPB8xE~MrAK%`L(4cjwr0@jZo#bTkMdHJ?BRTPu zaKSeZPH`(UuxOA}+ZGvTXXlIZ=ezQO;$e)QDdX4v=UFwwBR*1j@)e2-;H+w0t+yDN zU9p@RaqE{Pe7Z46*N!?BZhc|3!pV1cexZZh>~)|kH%Fmrd~{$e2kFP}K7>T&{C0#G(Qa|SV&C1H1-kkqRtmu+)@c+}99=}(Ki#l(=)x|JZX zFG^ecu0q3)&Po%uWojChu*IXTC^R|ApB-Jxsn-}T?~{mHkNPQlA*VSm{3(LkQe?vn zPQN$!by048bS{?5=)zESZ|(Ymc!&4vH8P3|TIsu`+!n9L%u~UAL_bJ(gpfwU#kDIs z8S<@>$Md5;4G1_zKgAo$!ND>r58&6<-J8>CGh(TY$OyTM-h%UFc~s=mlA%$8BULI2 z#%~aBWs*oVL-qp>%Y}fjcV9_xI+_(@a^>5OCmAliXFpZW)XeI-+&#R&2SO&2HV*T^ z61Lm)xBo*&`*Qr76m~tx|NPH341m|1^|jrT-Shoe%PIz1Ck`RKun=ucVQ4gjKv72L zNwr?I5WFA6V-sCwZPR?C^h%clJa<>!*F|T-w3ks#keLNZDNSy(Xyi-P$M215-p|3| z{BL)hvHl%x+a?5`S9QLQ!d-7cnIGsbqH7gy-WO#_jJSK#CV=ZwRQm`J$vK%9%mjx({|!JShpnV zdQY?PjCRS$#OltthAPg*fC_jja$|v2{?v6WTMSVFvRotDjD560H0|G< zfQgApn7%0$buGU(`iL&Yf~_|t3-Av8b_9HI5$1qC{rWF5hcbdP^u8H z@!xmmS1MIe9?ylI6?vWa_z#zT1B1kp=0v_xWsxHX1(wKn0Kbb-@jYQ=teyVl_I*ZW zi%Hbs#SD>gx{z-MlYUD{($3`*??^~I0>xQU71kNAhtpm?>`hoG(~5+D zCr|w2jT!;AT)v){d{+EtnUFx2zyZ93U3IoBuicvZ0R5~KtvPNS0k(*QxiSY^v$Xu9 z>ck+#f>#@Fr@xebqC46L@!*EKzYf{~VQ|M_($ZQspb}6Y>N15gKRR z7dn(_)@GEwf>!K+;};SFgp3z!5XQYjvx4rRAf(|pf^)1W_z$yTb^)s&^zF*5Tv^eM z(25G9t3L-B%zM9E!qBbXsv``2QI0yt%FFBVD2P#XjRQ()hv4)m*Wc*AY^7eQgMqUl zA<))ZUB*gCP#5~Le%ahfGv^XlZsq#^#mCsu7!MtTw=^Bu;o)?=b}M;nClIOUqJ-Kf zM+xr0<;fm5Ao~5tWpCG9W0sOKpKV>!Ib%IdQAVaPFz~ZaaMDKQ8MK6i#7}D^q<0*w ztdhk9-9Pg3(zbXUCZQEO-Vzb@&x^UO`7>ehT%Ot54#xGgc5a>gqK)d6_d+X8jk0EE ze@L~mg*{#_6`$@~{?wmSQo_%K=(3_cpQLm&sze;oM3QqCdCi#R?~g9Xq&l0DmR1&> znx39*7!5tUxY$!0b>3i578AtA?x@~8Rc3^Y*Q3nW+bcEcV{YCE*DK}4_@?(A@;vG) zO-8rNO70Pi75V`&F|px2U-8eM>bUTy=m)*}CFnTl!^6WgBaaXGRKG|hKwp^I*+ZVs zFjY%B-5f%5ef^AhrE1eMGfh*q%|CxeO;w+Tfyt-SUkD+fgbVTT)J}#Ej9!xem6;PG zk{R$;`Z0oDgU2Bv7fcb3ugcCHxe!|h#?MIk>6r9q#*|@*d1su ze}s=0SsMhF>D`CVrS5S%3?~v;o4tpZtCiS%^$WfK;Tu6mc8+&QQC4*tK+_h{2&8=b z)G-CE-;8l_)30h#<|zq2`dH}W;#8sFmQ36=GH-t>6E}nm9oBFDW6`v*aH6CwR5NgP zRby65^xK~=^@L^vjLK%_VG5Mg<1!hvu5sykDV7#fu2Rfw{oV?Me6^Eyt>b2$?bhC= z#NJ;VvB`pgi(b8yq@kSC>Qb5qwoVKVy|~hRdG(GZwet{kmyT5=ISOw1WUUNx&!MHV zd9-M&=sox+RJ2u`g9t}c_SIw;=y3&y=soneZ-=6%A9|+|pFU`OXvK1229ekLMh}0R zNxo2;+~?<9RD|)QqakAp-mlnt(O5OKmc0v4X<}RCBMc^9+JJj&_wdp2>#N?w1L^2< zDzv_gwDM@5td6k;&^74sGiRRBEog~xt>ohrX~d6lXNw_39|`I@5MpZ zbF{Ys0_bz|T7Hn58+1e|vI%=2DO0ZIqW3wnBO9Mf&`?<+MxI?44Vm;4crdYMVs5S| zkP&rIxCmpQHF2$O!Y(7Uxaomra|_EMb2Rr#M@wt%aCMIxF6`_qd?#L`rL>C?32BmU z4=XyL0`^n->8T;58!cmLRC^!ce%)@gipR&;o{W@2{s$6n2^ zUqw0S#-`X6+`q)(qdPh~wPx6RIXNJQ^BQX25fRs*87i6h2%`-C`r*r64T7r!o;LR& zItVJXjJ0*tMEfWEP=68+C_cD+l7czVb{0CNAL|)0!9i|+KWjIf(IQ~1Ft(KG_c108 zl)k*2{GnG|+!(h4m%~&c6-XJHf=pDBv$p0P*QeYWNmgPjyoL#A2NyW;heBA5=*X?`})hb^fxNN!iVQG|f3P>uxHn42^ytu9DTbFqJp(KRS zOiVzqf@wUq6z6=NZ;F>$XF2NNvOe&U-y7NWa~-43=kz~C{HGTH{pyApn4xcN=R=ME z(Y!=SNZ?5Jlq8RA=oUP`{>I>Mz%Ouzm^~72y7$X2-lnWzxB1>J+7{PWeh?S)8Os6K zRW%honS59Ur4K%6`R9>YfKg?jA+X3`KsqdItM=vHqf~2l<1{nm4IhJ*^g$aT7S>4b zCe5ib0w0R_X=Fyyf>W6OgVFQI*6Y0uY1Q$EH6rF6jTu@3=3@=_1Vx!YpU2_%<_I6z zK}fkr4)HnNfVErN_qo9huDJ*Ln(vaqzsS(EQc~|um5mqD#sfPdSO$k<_h1sOoH{wF zYf9q1@PT(>k4>4FTg5fc;UK-zt0?NCaw<#&1GzyefMJboFR!;1XX3zDB_mwjczW;xs8lQc2H}Dz1U35tPCYp2s1?8HMOuv z>rK35Xqr_FK~7gg^HyA#Fdvi#6~80fW&4bC#~@gy|BZ01h~ zs~l6N_ZZl%h6GK7sv%MhjfQpx9vaH!T5^+Blvkh;vo8YF*R*%RAc&33y1rtj{l96J3= zi8&Vr=hls#x-Y|4FkES`jwCm$;{jU)UG3SsDP6%o($OC&iv+MY832w?C4-toP5QrZ z>7NpQh<=eXBJ6|?W@ppZfyR$lw;^6$D{9g7F7 z1SSuG%oEfIveOogNJ9MwwP<7bV@u5|&78W`w6xtLy0@}|I7c!UPf3Kd+ zkbLd)7KP!Pj;~&tkBl;-`FfCp{e zja$lnkN@Zg`&Sp~^Po;%tHo&L(1UcuJ#o8LA@3s+JY_>eQm~Rx!AOjv(BlNH-^(61 zobgSNn3;YZ)su|g z-mE{zNPy*>zEB^C1QJI=NOt_}U?BE-zK@=9-$6Q$8R31x0B!ohaih=N`HeV3C{fr0 zNmjkjBZ@46Wfpfi?Q{Nxh3)T(C+3)e?Mq?BeZBcwzf|)w;XU??^CQqyqo7;`rf#;PL6Y zRhf)*!*jLcn#We0Nn8C&ObOZ$LSOz66z(4gCvz1j7JBiDD6}9iNQ{*9VW{`=C5kw% zzfy6@!3z+avS@C8KFlQ#C#PQJ?(uPtVzO)!CRXsyho7y~RHEVe_H z2U3Ct*JDI1atYddh6Jm3wCH5qq-5x149!<_t~@CaQpz4t??YfBtcsA^3GqF5rMtU( z8&M)zuM6whShTw9ZLwJ-Kgi$#tElk}t7|8pzV~jtWke8v_c0Cg%`WfWdSs5e&i=)d z36pXe{S{x;IK)NDxze@ih`n;+v4Fl6c4lxoR-o$tyfZ`s{SX5Peh=mHU1WdjW4{+$ zzCxd%a|M#W43rR8g7fWplNy2OxF_NM-l=+!{REaG@C6%QY|ffn!B}LIs4Tdzz$}C3 zZS@i^;Z=k9bi9Ow zM6+-DqhJL^NS`o@yko}A(&C)>p**u$c(;t5&(}X#@WqjC&;s?rro9-|v(`*KUEDNg ze4;8F->R3-A)d1cch}>4B<8{u+$~sm%>f$0W94fGn zC$t4*3KpRx5Dg@N19DcX2;p?c+;WJ-ZzcVIy#{WHSfRRacZE%B-Mq?1E?%BYNwwUC zDg-0bZwdRaJRgSAH!pu@NK} z?LOZ8Xrrx9`$DvNspATwJ(9P8R$Vq~=C!ER|B|~|5 zdNZ#i_(bvoN)_%W$tWESjjE^zT!@7Qk%}@z59|M<>n(%gTCld!1Shz=hv328-Q7Jv zaM#A2;1Jv$feVUI>UoS_(ok!g31A^j}N z)P!=jYO&2?*|~>7(0@NAKwx*iQ|Hsze1^xYt(g*sy6*rP!d0(s*jTwc_ zMZSI%?d?-!X=mskNv~m^2C)5taL@j$S}S?W4CK54rgO9u(t5DswA2MKnULtYWFK2- z`}=!?M0b6CvF-*LNEZ;7eB0}+Vfm6+T4BQ6u$k4Y-2XrB?6rpXu96M+;lapDD= z)-kh6dcN*8fk+{U<<6N*<#Y<3@^NNQ@sFe#6H&9Xv&W>QAzdWDI6e2kcF_|{LWDPI z5Bgn^wwXB$Z$Wj6rjES4tyhqBY%`R89GBf3pE&|4-oYRh{tl7&u;l|sOBn2n9}_y4 z&f+|{M~hN-Jux_c*ad2rZ?2(JiA9kg4X9z^YL)1YgFAWV6sFI*;<$VuD{1r*4xJjU z`uemV=4ehshL+-%VU;vDb!Y9Swnj)-vW!-D(ZDy47wG&larYqopj1Hdw-&(ET}oRU z-$U!5K5o$ILd`x*I71YaN>9$%7%n+6V^kLF)L4bh-vF@IBRuJd6cf|J!)bZ`ukR-r z!c}gm-pfKnS2i^-b8d|~r)~^7>3Q97Q==+S@^1_5T&DN4hwOoGDmXcvJla|z_X%(~ z?T@L}y@jIL799vRZM3z?VdNC12F?0BB=M_ux+j){=$zl}*13A6#C- zO%Q-tb}cF*MG;hqOG)Xso_j&qL?)#qS*LHiR}sDNo1oz3b>y`S0cmOD9bS$5l+GD> zC@G~*caey&3lYA(p1)P%29qjHZ*~{XXt=Z@cSAp$gqjIvWYE#F9H~4b%fdVx@Eq&bl55t_Eu4cjO z8Jk6Mu+DQIwZT z&B1B+g_>2fN;-ph`zMpEj6tIQ<5&Ew44g`iH2TZ9zf<~u>eakT1N(~CWj4c<|DLKA z5&_!o;A8J*ec1t9g^Hj(&P!p|3p>}{X$?9Hr+j($6$@8QZBCyhSS~9giryaCql&3C znR6Y>L|)}*WukGVrY^ay{|5pMWc257sUO;UB~3_Td=4i38r2JL@8-sWiY5%g#WP<+ zQfNF53Ecipiy0nZA#W)uRVGX>BR9oLZA?x-OT)kWi!6 z{dEW1H`-RB>&VM#tpFWo{ zEP8v11=hzm8fQ76e+160K%q1J>K@g_mVer%t@_FL4G1BX%>X3t!v@x>e~(38o14?L zVu!|?lI@Q+Em%Ho+cd#lB=`_jw~=^RRoJ`5VU)GD>jq(4u%IT54qhgvjw{l98bN6x zq3SSK@J-}fUE|5gAULeqHrivgUA!RShlc`cuxLdX2)~gU)4Tig&$=!5^VCepfx^g; zs;aFyB24wU`x_kbaA^!`J+5&61=ZEy@mcyUpYeeq1~ABpzmioz*##aG6_FgLOa++S z^mz2}YP2_lt!#i!frUNkhw9THt}Gq<%DOIT<2Q8)|Ed z0)>A9)>Xgh0{p~HGTwHpWxAqu}=Id=z7$lN#!MA7S zAIqk@a#B*Ly!lG=fH4tG+`nm~*6twTYX4v*+PkfjMMS&O$0bXTr=_6hESY66rIz3c zZbqAbdZQ+aA@HfDA$Dw?OTGpW?@ixBh$+b{5}<_J4{9Dit6-SeCrT_zYc;j=Xlb3z zjE(;9p#N*?u|fcfiZy~M)&H{q`1^;z-@jZ+r*pz9fE^eqr3O(ix@AY`Z>X!pD{Gqg zSL=;_uq7w%f@+!QUqASgmAd-+5Ri5x+Qi`rrH~h1{MXbJ2irkFoBo#D*zRiw1KX8@ z^BQhiC5!v^up~K)v5%+vzT3yHtGJ{@$q-3C<2S-07l4@u%XuD7qNg#{Dnz{Al>523 zo`>w_z-RSMEjlj48Fl*fshj8}`SnQr{4(M=V1}(pLh?P`T{4oQ1AQKgvvj`%P^3H)#I6ie2-%<1Z}|L?T?-;L$H~h$7@27Rpb) zslL`g>=()huadX>ooWYj8}#j4F{7Hk{=9on&I`c)^7PCNg9<$0Q?GoDYV4uWc5sB7 zzxw714VFHf^cFxNJ)qPDRCE#il20(fW9e>jq7s%}Bnyn=F=K#7$3u0Zlr&BJ05sdn z8K`~pqVLzz-9QX8zQN%*O5EIu_{UMz&!uVvNQA*iS$j{)DNCT#{z%Zdo~mLXv6#b0 zfXbYy;+;Ghv{5Os=rY9gNY$9HB0OOXbE68s(77CJGktPc94C< z{P&)r0ruW~Wg~Pu#${=8tZQz)b#zG0dqZ7MuZ_>6iH?F;yZ@n^YoUT5zSgXB-ldap zVb{8!&nvU}Xakav@nk|%$vgRVtNDBauP~arUw%|Fdf3EG>?SJ7dFJ|=k+?2`3HdpEK05B#??ZT9`eCx1keDcGI^I?u=5~9+CLY{qdK3{ZV0^C)fan~4dD2HEJ?!cGG=b!E&rFW$|NWpdfL;{`kSjuK+y7cx ztoh2qBy`y3HqZUsErVPbLC3)s+(fO;W-oXO5qOYM2MCs~=y^-%`jZ z5U2&mjw^kluV4)<{bv~Ev(^eIUhULyna7-(&#$`m;`=OCg-@?iY&}%IGTv z#N3yTMD2#pRR>2g)y*YG&O>8*Xw$i4*wDF%o12?Dck~C4;hS(Dr0y4h`*P}+r&bSr zyO|u5LQ=#=8hmPgx5QVVts*p0yy}R+%_5~X;SR3{_^c(Q#-HtZ3CO+LyS)7zqF2l0 z9+w1Loq9fdvRU#J4KwSNF7e4{ZaNe8c`vKsxbv$gHLViZU*sdERoQ>7tVepn8JCv7 zbW-_Y^$(22pRDXx{>L1qe3Q1|KLA00^+;a=e7#}G$MD%U?k`G^GyR;@UHB4+xc>kJ z;$xb%M=gkOG5hEr0un-s22k@XvI$f#AZwP4zC8hqH`m+I%JfXP>1f3e^M7s3eg;7> z*!XTo)Gc(#pz+Y5MX?TaA6Vs`it2v1vYvi&wG6Fx;&gwmQ#JM|Mf{0Zqt?Bt6-`jb zoZ2vC_ld|$?ibnFBCSsbeR}^&vAU}Wx-k~I^6sHyyz;N$epASJR4mCs+9SCrMAfY` zzbf-4_bWcH+hBQD9+xE3vgoag6&&g%eMtb}0N^+i{TD;gVaIadcpP~kgsl-+|6uC@ z%;I9%2bTtOXlB#&UB<*fa0^QAz^-D9s4}}I9i4Rbs0xdq)!47yYG@O8XqJqMA|epn z9Q#xJ&)xhAmX@X3`?VC#oo?v3m{Pw!3keB@ZfBKTxrGum075A|gYLu8vk^C5w!;YD z!DLCY`=JMP?#6$h?-a=J+UwlL!rB<;aYBO`HBe)}g9bVkN8{z)&Q6;q z`)$y%%FR9GK2mHAFkWka)_nxE)q7}sj1wd$f12-QMTRHwmxG6^L+OQnNdO)Ypoh;x z{Xn7wtf1c~h#MIpgfkwg5+=}sRhID-%z>&F9tY#NX=j=$MYuxjAh>^U7?RyaM@0M} z6PK&eppLWbl_DtpijGL4HK|8PwzrRUg>043zsV_ut)l%DNCq{ktT;)i$`3=Lt#$Nk z-1e)7{{i6Rng^Uq$o0A&`JXrSReV}}-V87z&0;Aq-7mIK5D*ZGLd3^s^v1@!G=55+o=iUH%3JwGMP?YIMKO7XLc|a#lWktXsszx`9;y&|XJ>4B zMCK)SX6IFL*JtCe+!$K9371FqUeL~VJq5RYTJG+5T(VJ-Ow9d;Ag?STW)9RC4b}vG zFHzoW4We&{$52`2mE>htCM88h8&@xBiopusnqQKt`1+b$r)^As9hi!E+&F$6H?hJe z2tRel4;y!AqK44I;;;v|MX^0+Bl*=f;w3KZ=kKJHIk zb=3jgQ(L)2vr;lBV1GTJ0>s$_>b28hDQuP$1fU=(yCOk=nc#c)m`!NHS$D)#b~fueh`0d1lKVq2nEAS(i#!V_JqVW~{ojq(QEyM>!((L=+s<i^e717?FlBf5Xi-}1|<`$mu z$S=;`QDme7kracrF!$B`j+p+1FL5=y$#q#KfMbS90@=gTC%fAdZQ6qYB|QH7jih?e z<))Shu22t2K5)g%>FkUoHQ#p5(RScd(ND>Jow{4Z*XJX=G)M)r2tCF z!NEfvHTc%YBarH=EWRqVe_>UX0cOxwDnIr>5yq7_0m?etb(A{(M|=@X_xs;8_4}WD zd&wy$(I2Tr$o%a}+5yp^9AtYK((IrhP7M2l-tc}}%%j2{kr~c!{V3Z~@G2^`Nl`>T zL1N;;hqtFRGpnm($7CvNArcVWBr$2Fn6AD%Kg+8~N*0nsoGtFazBN(d zzj}S^@g~a1ucRr1P*={=)+T~5PFQ3n%z>0H>0VZA{&prK#v~7Sh%Xhc#{e^2RCZ5ES=nes^#44p0HnxG z1z(o<H&Gifi7uE%fh)+y>o$b{fYUS{7(g1@p)9~mmBG+i7BN$!h?zMH$p^X zg_1nOUbNh$-$W^HddOG=uH^Q!>x%UiZ{F(4M1r~>w zRiOz^DoxF9>wkgWER0AJIkPSuTMI_;imho>TK6k)L!_CvYwl+>Tn3RHRit}T?=7yN zprCf0F}UQ51SY_`oCMk(7@sO1d1{JtE^1ykyq)??gl>zQdmBie&NH!y=P~<4^;K85 z2yN#DP;*TJd@qNcfquj^+33TnJR7uN=t0EgFyHbkP5sijn9ys^EjmUN{O{WfoxkkH z-w*9l!Z6xjoJ`=A+zYV;SY}^5kl~&js*EiR<#Bf$1klIcc2s zWcQD`V$~My-NFbuJh-)s3r`DB9hm_Yl(+JZOe8nenrIOAv&U>Ob zw(K{BI{of{cf#4#6`5C3pY+*lfHX#~y@XRl7#WFV5f#y(^=$q>=ok^RY}3@@$$kqP zQw7l)fis07w8(2_lb>=?1ZS8S8HZ5(<)(6kRi(_9mzQ%cm)qY$P&*Gs>g*0mEBVy7 zQgnIj$AAC!MFj~{re){~^!7ff)Dn2XCpxa|-#BCi7YPHmmJ&}o4Xtp2T1#QhKBEhq z+_d_7F-+)LYHfR3(vN?J_CWr;JYlJcKo~Jg_Zd|w35h+kfac=wWcs8_(U^I{BjA|P zgsUnpBt9qFYHB$m?35IooRPp>qJfO@ZB%MxdTy@Ac!qi0TotPJH03$XNO6)6gANvq z0w#HBS$~Q{95{i6?9_UIaKfYaX1QurO-wSw?q}B4@B;9N*w&(WsEDYC5qIg$Rrq7?A}ofr1ip)m8Tz2oADGY202q$#=WRs9(~i27 z?MagdcSEcw(MvU=!?3vT?Ob%WeM`Sat)4njja`=)M-$kX=H};2BSwW5VVV3g=t+pB zRucxdYs_3;b#fImt6D2-g2Wc=9lbFT^J!=qD6@qN*Rs|1JOZNB(P@H*caj-!GxYM4 zfUPVOr#yHFhsukBD87ZIr$On0Gk~NaWbtsZNfR58YA4W3bSD`E@m@B+!l`yZ$p$0v7A)TZg*nKd9E{hxZ{s9 z4CT+Q+h$DE*?PrTMv;Xz#1j#!PUqb~V*j*5Q zN9x6iv*I%eJ}%B_p?@x_Dpp7wfYsE1R~3pxhpFQ| z6(yW+ZFW1|FSNw~tLNYr)zxyc$)3oojQ$ZyJ=qntZcx)NHfGo)%Yc1MH>2g|DQHYS z@xObfe~lW1Ktq+%ujcR%10SId1hB1vO(+(AP6)*iQqnxC+1SCc5=h{FJ~mcrP}@-h zLIh%2Up(AlLVG8Lf0MXKpXn&6-tTwpio8NN&c8nDH|u+KeCu?-AN?d}9JYr>yv`g# ze0}b2Q~XWa#5<#x83t#kUbQb8?v@cbS3PcXLNgm;ZiYEv(``kQSqUw20y1L*5#bHLy>HoirmHe_GZ;w5duX~eVyT@zc6dM zVEv7|u7RaoT|X;t$sQSR#12e{UV-nP_q`5<-N4F-!L%azb=_W6GG%f`==37&(?AMb zyt2j*Qba1~txAHD%`%>qb?H<5jE#rxG+?Z+YWj@7xHG=YTB(T%K1N?YWuObH@KLeC zhpdU?Kus@c)=n!5&tvClbKd!{#be2?ybV_ z!`zGQeDG%v%f6?oqB7|RPLaSH!p1Tjw{mb1S$9qFjXS`Khc|_z_!Q&U530ncJ$@ZF}q?_qY)U&qL?5eBRAJ zqkdF-eEoJP{^tLPu?OIm5lWG?Q6m zt!X!`f?VTzSN>p*DCsMca~~R*JtW~`&Q_oNgM$BS2whmt>c0rBg)FbE7{w} zP*2=ze;P|0%_Nv$->w7{OaM*wLt|w$fP6iT+Veu~K0Pb`37$Dq9EiT zF>^(@!R1uhIS1TDeC!qk6%V8%Z3>OC%wrx;s)G_NM7;#mxZhnBNL>h@fjJ-6CyP2?;5Ecp3G1;k-eBp9CNdX22*)ypV;D zw+Wl%I`V~eb4qPqjUNy1ct;lRJAW**5RUq=b9_Su-qOkK>GF?-jgrxY^#oH8sDHKT zY%Tp)7oqKT>-6k8eV%+$3H%WfEE)8laY}utc|b=la~U{!tp(>N2f=ChJs=Lyjp5%x(XPzZrh&g*$O8$ zEp7hZo(VbWhaE@ZdD+AYl!cO~Y_ihWSmlERxb=ebmMd`T0hxm9o;n!Byy@_x34oS` zc{wsYePm%#<|ZL;tDm>&rzgJ1wGw3sgQ9MJ-L_H#7Bs_ke_o4qc@ezC zac`5@#-9)KTzknpGB|2)0-aYS*6&W}cAdADSt4rcl7kMvxDt(HGvQmS&KsZ3?eBv}*nNXmA6T_4* zF2+gw5Lp(TbiRko@FCaOU@H@pqXi>aTFnT||}(pWCAoxACn zO1xs#Fj~&ac!?-Ke>K%lXOAk=MdJ%pFf>FJ^o&UXWF`m*0uN|;S9NJ!>`s1#xC@Hp zyUoqaDERoa&p&XMgj)gPjE`KGx6WH~bjZ6DWFU3|&ZketSn&#SiZ}&*;tuc1iK%76 zmChOl84Xxke+rEP0-`>z^ZbgA%6a|c*p%!EqM%-UPEzLf5J(Y8d^gJYM9!g!kr{{^ zP{Xuzl-i#loa1O}_|-f$6Fcwr zhgOM?d$b-;lPDVgtbo!Nw265li_OCtrpqp`mBc*fFUk&U?xV`lu<86tw@!(^j7Pv< z@)v}#CfMDYUj#>}mgHl|x2C4d%4l!`jH$(0S=;s-zTJJSnhlDD$+K#&G*pev5P__> z!}X%d23b*jCN<@C@t=ry#=KOhXXVI80Go5FZ7A+K@9kPW9vx5a4i756$kic&3=!e_ z4~4tc)it~y(VCV+4~-A+ihY|o)9w53=H@(88Qa9lVP`SQZHvY^x9#TE$A{sXl)BNV zqm!f8zUP(~ZNHlO1DA=HvWCF%zNSIb|JY0Z9W8b;0IVSjXYhacmiO<0Bd%(@&LwzU zPaxgL>}4WpFT?@3K02#+R8oIZ5V8QoggP+ledxzHIWFmLK8thmshu@*dZ3(7%wquP zldTP>fPh!SFf%j%aZ@&}=@^N+wZmPyV;#Qw-Mq^thi&@&7t<<@qLvmzygM8*#2p@7Wl2Uvu>gk5rS zeE%;+HI11i=iZWJ!d@-ji>uU2yoiV=lEsHAZjU^Gjb)XQ1CBUr$i9R`Cv9rj4^nCP z)gtS>(k%U)LQsXWx;C1)erioxmK6*w*qm2#>GnTJW(gX2ofgoku4|~7~5Rp{*)1>trze+MQu^_&D00>NmC)uElZyNs{{O_jO3WIL%e>hCu9N zo@_^%!5E>4kBNWAIo=!VdsUbhuAE+99a$>qc1q!(oXD_p)?IVkClKnv4}qy=&X88H zIypJxG$o^{ESo~qbH6=JNx`X{oi)og2{RM1TeGyW`4kcY_M*c$XJ6=j+rQ5QW2Qul zga1+(TMbH5@H7ld-SjaIB5!iq0vI5AI76j7o9tqu-U(eGh1b%2F@_e(4O;XdT-%3D}!CV%cjqb8bM3h@U7 zxV-e$0u`6v*agNrN=jN>qN4p%Q&Xgoh_}iPLhuMbLk_Rx`SRb_n}TQ1JifhWE)tzEIgF%LChBJp~-1m~fnI{TT`SdalQKBX?4=1N!BrRV>rOyzG-`+jXz>3qe6~1!5DVBnk z4eZN&R;#!@kGJarUvVE?cJKuZDZF#d&xWc!l5o#TMIZHMsxJm{i`zcx@E}#%ZL76k z!P_Zk^X;#7%3U9Q4&ZLCQp(rqPiB{Oz0cx}$DztV6#Srmy0k@-<^Skj|MVY!TG0+h zprUY^eDwG`ef&KjZJ0v*X8J&%R6j*EH;x>_DFb+cpvZZdaJGD~`d8M0(E+Q+_gx_n z-{9cTGmV+>^31bY4{_8jR^fx&3IV!(YHCKI6(;;?IgezJ2Q|l%!cY?$!{s-! z-+&lcU3*!d{*NECnjE$8Gg{752fMX}5&T8QFOGq$I-8S|d=YPxt(@aek}0h(g>Z_k6{-g0m>B-gF%aueNi_PA-Q*nY?;u))yoMXvxu)amMj zb6eRJwc<8&9{=jq%~fcF71NwDxD%VL&jFe)2ACVuCr};j==9uFoXgA$UE(j73B5<$ zYSqNDzvX-X{?Gr}y^Q}MLNj|i)c%e0`MaL*k!I^dY#Fz;$XqIt-Ah)vR)t_)Xpj!V ziSe6bGYbDnA{!JC5r_h3TywuXR@6uYh&1%{Dtf50JTF7#`^A3t9&n&bY_n*emK_Ha za7W2-Ans?=_m>qV(f117R)E`0=EAok<)SP)%*`$vA9{e*SD>wH*G+QZxkKWni%jwUnPAB)UT3UKJhXu%~Tm1QxDFrvAdnP|Pw-o4F z%e;i5ZFF)kCUb7A_1-#e5aAH=1`e>pWF>M#1}Ih6i$fVxGgGr6qg)^u<0_zsl8#4@ z%Qx6@aF-Y7n5*qQci6?Aa!8txZjAZQf;CzUW9wXD6oXrEyau!wAo6Ti?gN8}c+-|_ zD@UQBpxJppCkB-$Pb;r4Kp)3gSwCHk(R%KNIEQ@28oN7FXiI{Igf8{CWfG6l26W9H z9y9^JcBzlsO$|QxgfBN9{2zOs@Y3|Y(u9b$5z z@h1;nUp$=70RoWZhk0~jJ zW0K6r0YjU`UDo~!x9e9#N$`qij@(@ zg$%Akmx~^hu?$D3eY%rgeL!HM6BhO_vB~1b#uQ@G>fMtwL?q5WZiw_oxfW%mFFUBC zF%(gm-T`u%UXg1YUNWHxu|{3-7j|HTo9%0x_JFx$-ts(OAw@%FmGbXj>nd^$ro<~` z&rn+LaQ$88y!>sB1#p({;cP|~;6h${D^9RSG;mB zE@(@|wIrMZ5YwnB*vDTgt+x5byxEpY&vC{GkI%d*(ToI*+%ne+PY8&*{I`Aueg$;! zeh#q3bc0tHg+tco346t7#>(*WuKtke`rbqn{(9QbUa2xo5jPY2 z?QLyk4V%q0X5MNBF2ztXy{ ze>fa1{Yno1e5nH(u*UkRO%Lt$B?|qJ0w|vbo|0{g($4&h+9Ut2E^#m&p^%0U>OsP7 zF1QYu!Dn~1d89|BWFxNK_WhdNR;Pv5-E2NCkAm9VmRS{XdG>v3S^P_y(ha=naNy3* z;4a80=6#^Em7K#v^DMY6tBh@K^HsI1>DMtf7TRujnm7Ls`F=VkM_k6P`^MMT2~Zl^|@=@Rq(Yp4_EuMt+hXX zeERYPqhFVyL$epd|1a5;C53koA`(%#$eOgAJc0uCOY@YNN;LQFOH0ry>URo0&gO>} zX~!=&$tz6^yx)4bJv8dd;lqwzL6 zC%AK^a{8}rxz9xn>8wviA`ReeOTDC(rff@%iY4tvxpp;$;q}uAj<9OoEJKn%QIU}A zhSu1@_h<;xgtM?S%FKWEl5&*FHsY?1bH*9-=J($EsOx!NIK#^%&j0jkdBgw{p$%mU zpkTIQx<80BoE%#e0GlEUPxoMVE^TvrZ#hwfuJ>Q^<6f<-&}OjWjK8cz1MMgTjKnlWy@Y#X!XCv$BG5G%zq#Q+5A6(P8I6YnI1gy0RK$gGSy;LQuCzZNiO zB%~x%S{{@fxVLjrlQofXO%iGxHyGsmv0m83NKvmUG*%rvD_E=zKzOV~z63?Vpy z?-_5$Ep<)T+vD+k*3*_SS zn2KPtC*4`d-!V079N16#`SPSqoKNgYI4+*&g4Y$6L)f@}ejqL3_ey-N4tSS~RIc5y zjq^U{Mh6AW01rZVO^Mi_#Inu7r)H}0UU7UaNk+zS z*H`mTxCo?U@VCy>FU<`_w-y+yzwQe{MZocPQxR{tV-~`hguTW)ZXhqAdPKfqugftX1`idQyX%Z@Au9SP#}2o?8#| zCC!GR1pCh~BNPxS94uK{%E!6?c!kyuVh23dn@4Mdpi}r}*N7|8r3JmOudkYY3Vmpd z<}2zKlmcVg?dTy!79I|P4C~R8-8w(9Z%`xRCP<=3CZYl;3J~aioMIgWi~aLYV7J^P zq@(s22yRep9;EO?S4b}IT%XdNe=ecHo?A^3f%S?V1(81zR{C zaoi((tJsQ@KYeYySZnfviAF`rNta=0w0$rbM}><+m>Y~wmwmRUdgQ$z6@qIZ>#&Y& zfbUI~qd%UIEMetOu(T#%@cI!nUscyiwwZ!2YqsqcnEwm1efBrJ@Fh8^gE~`>ki@GP zwnI{(6~H8rOWW4?h<{A8i&2rQ9@QqfoW(C7Z-x>{FXg%yKN(|SQCwQkq^*9qg+(+i zU<+Ch5mqzmavr}gZGWVBd>Hq!f#WarI-4t?>-+S{e0vP5*lC+hOSdUTNrNSjlP~`| z5Sv;HQ~vFGtlz0&4|TQ0sSn0=Wp{tPJ}m45+RJU+Hienv?)#;dCvx|Ppp05J`i!Xc zqa1=#CE0pp!{E=Qq9T`>7mwa&5)Bgl+ zcM1zJb13ok3<7Uw*VgUqa7FG5g)b(2|e##fP-Ztx(J#-M zhirIMVp7D&NO(mbd8|5?l^hTD3I&ijo{!4hfN;I|WBr%dr1l6Bd!V~VnOZ{;I zFv~!|LCZWOAr;ax^M^+HV33lLVaxFQrm)8GTgV58I(Cv69SW|tOJB-pJVV!r@5$*x z!wzZ_)hj$&Bbg_Kg#16&DiDS52?!6^g-B^oW`%8P3?~{f(IlJ2hnTz3^qN))!5rGJ zoowS@2I!K<={)8{&lN9i3hw$R>T`Iu6~exkSJ`;E2x42lM84!m$el%Au6?r{(v|}J z9WG_L4<7>7^YiG>e*jylBLZ)$+==TbnN;O|4UQQdz`YAISBNA2C&wHQJ&*46+7Mh{ zo5C711bfvqmbXKC1No(nrji_I={)YH!deNd*ba?iMtzOl{#v(SlYLEMkZ{uB(&D(x z42iAV(kgTr0NR&2Z-3*HwPWd$ZPv?o#xMTq)Xi2xsVSEtY422Q{+-EHGd9C)4U4bY zDSRyBG5wT7Fyj;{lUnL`%!L5M?<&l99^|7z9TG?TTJ%fGGHe?*z-@nrE}pfudm)PE9UjX2A5EKqe5p(qgVHZGx$ zwCG&bzt*n>r+*kMdkC~7Fx1GuIR-6#M%`vb>H4;fW4g@1tMESon2Y-!15woZs`%nR zGvZ(QaRc$aCr6h!FF9wUuy}(e%1`gFJ>uph>z||ay9g!NCmv5dC~Z|?fx2d@qZV#?pq}NU^afBOA;u}p zMyk-|O%%zw{o2|pYHaN2^Yq@3S8dpSPIV&IRP~IjRyQeXev>%a%*>LY?43>OL*ZB= zmlg}}ZjF_rL&%%NTmO{YS6l8q4N;^^_{*T03{Ri?ejh=y+Q2#MMOmChntM%NG;5fB zLai*xehaSRC%}QX&Bd=|+)FMJWV0|hx6gP$LrzZa^n7n0rj0L8e$3`Llk-yBWCd>Q zs9iZIn>(`8E5;KD3huhb4wE0t_VGAAKfF7Cof7F3B$-Oe7qIn`ih|umwf;=C07h0! za}?r?1O1?Fx{=x2b;f@`nWd<>=#Gn<^@BWA^3&GL%+5yygzHIg7eq*VJ?B|TvX2fJ z9(e@aURe!#aQ<}}1sMF?{lko}nH2llNu49Zsg=#n*P_>g*J$Qsg+?}@2PjKzjy}uI zYSk;nf8;ZCzaT%~55bsX+?I40|CIyL{UAd-bUbIYzYB~9NNEou-v8owy@xH=Yfl)W zc9}@M(T*^q{5I$-G5t*9V_^|{w%#gvm-5U0W(3xKVTuDu0pJAxspky*$aa^{{VzoQ z6ciL_xe52uVyQGcU%0JYq#|PWGm$O#hP*8s4bkc!lqoFrT;?*a(YPNrv2ESB%Ciza z2Djvu+ji|W%9w?(tmptZWCnkMYiAL%4^S5>M?s)&QN}8CJgk02Dy+%4VydgC5Rj;P zbxt~3Spfx@mbf?^8c17%;l}r^fk#=##wKSmF-^N;r%9;KY_H*_L%DD*D{^V0TwZ&8 z^5!=g@g2IYVeXe35EWb>ZHrBs7b8!78a?^q4 z)XL*wEI&Rro2pQUR- zmSl)*jZj~b+vokb%Ra6PWSM*168unaenC;F4%0ar~q!c)&f7!1tH0f=B}+K?O^1JkbMO^;=Rz4NZtS9?;9>Bp|4Y2DD!dxtsylgWPiq9|-m zfZ2GKH~pje`-zO)(NF5h@?i&jTc|_w_?{K)fS%i>U4WjDQwr8xn(8xW_*U|Of$VRv zrTLc--k8k7RJg(en^EIq8(sB(g?KU<#52j2ikcd(U*}?tX`WO%Nq(}xn*Hxg2qw(S zWND?yx@L*ipQHLyIjsDk;~ZE1TGaTJ1ghnHZw)X3dC({Ed{u&$7o%oX>8y5sS z!XY7L3*2HdoOY$k!ZuQ)MiUT@S&5kt5NP&p9je?C z5Cdl%m68G{IlVn~N)1iGJYZu7m<c2do75%MLmRs}kT(xAA=7E~K7wq_Gni~F z-g-qSu4)jqXG>#7kj1Zm?xHUn*t+!>f3Z(V+{Io4g7 zbBiCeM##}H?_@eU!OOlf9m5tE<+YAfY5I|jiiR5D`{{erlaa@-@%M7EzRQ4Cr}^V} zFp;+z+pxD~d(urz3<~G$X)+s`2dDKWrMxBkX?9Z9x+te~oJ?ThVw`J1dqa5MkbZ%- zdPz~@TXb}!7HGV}qdCzO>BCl7p=FmG%4-Yw0>ShW6@RkZBGtIN4DlU_CEshA2W}|| zy-%OzS)awg@mzVhina%AY3hG>b$@+l7YL*~{LTVsn*SO$fK(;GLh6g88Y31KDTa>~ zJL*;{b+9|%CT{C_$4af2DAw8?UEJmv?=Joc0Uj9<;r1>WX^0g|Zkpg$qD1mv1^mky z@;gR|kAxJ4aPy8`vS1(3=@#(d!4`F5Em{nashdBpe~DcS8Zl!Ze|>$g?7R@09xKx= z+-(vXsey%>&h9zjN)&Bidx(GWi4C!0K(mm^nsiOZekbklkRoTQ+?ACE*99{PU0KpT zl(DYOk1W!eBYX*?J2_w@rHVEjIZFq+c4~5)+sq5y9zdF#^cv1$gft4bg5sQP9N2CiP6*Nbeu0$+Fhf z)#0M~jtc#HYr3@rd4c_ss>bW2G(Kc|k$5JzZ`sMV6nAR^K2$eDjluyP?^^2_O0V^7cYzCIIDTTV{-XjMQPGrzD< z)92{FQ=vdSaduY@r8y<5^8fURV8Q}?iICgf>R%EM7AJk*@x<5^^9bywfs_m+IgROM zf3Plw_FZ$m{#;?^kRvFUJ&C;hplc+be|NqX@y((*@~?b6A`S8E))&CD73GN`hpIpv zNdkdQ155Y)*{))T3Zh5g3U2Pf5bLr=nCn`t;u^yTHu&rklQcH2-gRbiuq#tE!VR~e zz<9z?ge~y5_;icN1|u9GL;9qF4Ar@SHZ(ZqqBE`#H&F)Fh&nZsR)>-CP!(lL5L=oI zbEhG)Q;nA*apvO($nHXyY!*Z2X3%XOpoI<=i~R~Yz#yYlf!M@}86##A_^|sF(IPzf zBt!}OYg3SwrC@+NcuX(|YF%PPbxm`3$<8#d!E#z8Zxhtj6R!f;Lgl++ev+>y=An;1K# zG(ATZ3LBr2DV0UYFGfH>F#eT({9MBN*c9I7r(h;s#hncIOP4NVhn|w&CiPO|9Rq>u zt~2$J)F+Pj10pc=a=a&$AI$ypJTjVG13vq>`Hy*B!187$qo}yL_qjDE%6=1k1lRdK zvG@AXXRM!d3iLuX?H z?Jeyi32lFO;06cwok%kSYEkRbQ8!!5l2Cwq2~ zfnE9yEC*XeQyfP@2EA+XNwjr~nzJp-`fJ!&)q^>pb_d_dfRa4duwX&iFc-oxk+MLSmbfsiUUqf1WxBvPWHT&6*O|={uZ$ znk5>D?f~7=Y3h(~v2!uVtnE0p#B0bKI(Suo*va6b_~@(*azP=e=n)dITgabjKxJY5 z_PMGGQ%P0TY*8aRo!3RHhW1GiCo0_4RR9Q@BHP_LaA1RC5@U=+)<%YxTCzpEE>I;U zC8^5LER@jkKo0Adx@9^W1UR3CppH8NxpFO_wN9b=_)9yx?Z?%Q`1XL!SWY196 zdvMcNI{4o@kN#|mw5{QDCN*es8IW-WHnRjlfD@4qLbn0+PoBCwW(Z64QYL-jKdH`@ z=v(!njkZ&+PUH=TqC)=50`eKDNk0~SEj1xeR@HoFLA!0z zG_Krl=(uT?pPQrFL?4i_-Q17sQW0kzoIdzIWSK*5bTrvg285{d(d{L&Rrj{uZ@!e_?h3oW=F6Ene2EyKn zx@qazHwY-NQ9ud{2=XkI#yT+}#^ z^G$?#*~JH^P%wJp8@L%QRv7=!OIuD2Veb#&=q{>f#7JOF^rv25Zf?+;JkNq?S2f(+ zC=V9BU5KFZW0G=M@<9T7-@}(P*moztTz#pow!N$`8}>&%j;>{8IK5gDebjuWhRuy* zFqptI$Wr%nFwwOo%S=Yb!w)v6VgDMvw#vb>xa8v;)k0DD!9geUj2y?@Wt&u2bAZ5j z(-HI>VF`aS9op;|DML8tf6UdxkUzG)W)*3n`JEt&z)N@@m;jdaN0XojbU-rHR6`G8 zx@7}{fi3E*B~<=0*KYfaHAVfkLyy@y#8HtWban?_;)d31Y)b9d>vCX|N0o$%;%#Mr zcd4av?3D#`T~5|vZ>E!az#oi(Os1!6&+LCQ*-#$-xavD}$U?adjLYQju2guK!iR*t z5E|SIqZq9YuoR;n^znMf@B3JAaXvI!rseOx^;&bId}49$Q-egb=uceZ5<1Yz`W3)i zspiW;aNqQW>h#U1C%R_8udaSp^T6~yyI=M111H{Dv24&5Xa^@(lIX4tt2-@<*_7s^ zbH$bU`>d(kOHc@%8nE;msbXL#3Ug9->`u@kr_7VATf%FhndQ3+7=$>UGD`0MQp(_2 zP_YA3)x7*St^aEZ22;bR!jMm9h-rTE%_D#S!z2Mbz~ca?->WBC)sQx=x(?vy7MDY5 zU7YmTdYUA>%M@044L7T+)VKmB7(de>9O#v8r5i*ls9-*V~o&ZYe>Nc@C;%zzo!&gN= zI%%XSqYtE_syb0?^U`JY_f~8O+`i@HQ+08O79U+`Q)D<`9V)6){)9zU#<@jxQba9b*C^}+q9^*-}Gfy zrdW2AJ0S}V3^)tLJLO*JccSN;yC30<>vGo4^CC}d3QG6lS5`WHNNP`XYxRg<`tw~P zci#Qz#bXDTs$+LfPN2BgFi6JV>P+t;!gt0Z=al2@-Fpo9}e=6)1JrSL-R2M zV*-ga7k_Uo$k?D7AM?4s#%t}QJcMqHK|HY(tf9gg{CZBeZ6Iou53Gfz!T%;ApP zC6*%7zOO#4#?-DjR5m8ixgP+T8wZ#Bg`3e0q)ZJ6IhDDRmim->KJ}*HSGsL5tX~>T zQy!0>c}s{3ByuKL+i(tWlq&;y&$myvM~?1=*!7ZaG73D!q}*AMji>|Mljr72&UYfN zv<359rT@J*nPeqH;hJ*})^-2KF#8#V8XMqK>>@3U)1o~>Z4EX)8adw2NKCV95h-$# zdE)T}3N$$%Z;Q@Mt0u)!je6yDqsv{7F`2{m!dHsF)RTSvD}P9a(5{T0%`0s>z7T6H z7om<599Z6|tUzbhI0aCE+}9!>&j(D7vQfkRdU%s_P(+bid>e*S;mjI`5l|9l>zk0} zZP(ts*kqeU>i6AcK$grW59?R8u8uol~aZ3=!*hw|&C@`jI*RTcl zS|vX096bbFp$S)e8v1!eB#rkCz8q|Bx~Bj+chL>?oXD2`mBUw8}6TYcJ#AQF^7mW#o+;|uT8=Cu^d#-p1kl!~jO%xt@A z*D!8h_>P}kjA1-Saw>h-6Z=0!*0Ih90;Kutx( z2*{M8Ic>(C@ZrZhQTF@JF{{>~H+4lV(v6D)wd-W0m*46igg+E|j?8DDq=CZy{sjB0 zlajtMJe$sp3}8jB1-h3i&Fo7Y`Uy$yzx|_R{eNM5>EHmL5Z9X%e!eNovIIm24H3AL zl}!eI_c2vWU5zyE!_S{Tt8=M=6ha?M7qQp=|NmjuLr$_^&P}$x)8mISrQ6W?d*2mr zXo{PCbo{i}n*n7)oOV;40m#Fj%AJ|X=OKfbPS zz@dWbaKsK++NTY@M;53c1_!@;qQZ(}Kx7Cdx~uWfi1=z>=stmorx7^z0YjW`qXhLUX;&e^(dMdxuemCO(d9GwDI=<8D z%~I^AHlQZu5xmj;4 zaubCgjt0VC$YZf>Al=r^yXc$(ZUzV-Y|E5lD_^vYL|fx=}Cp*(B>&zka8si2G%zb^3+w z<)r;LHOfsIo>H5|zeSnDc2)TFuR`I~4m*)lz~$4AJ9bX+uh2vT`pffcm=!bs3yJ=R zH+2Vv{9apH_$8+tOMtrXV;N1L_Y3F057ST}QA^Jf9`~Q9DOhB2fxDs?tHd_&`!5x! z=RriB9nZm{qM0_nmz$fLc%WT3F$wQMtvcl;=^8xKEUk$G%y884&{`K7XcgZ0=7e`` zZD>Z~cGUQ$@PkkeKy|x zXQng>ph`TOt;wV z7|M|;EEjw)MjeQD|ATD9yzJ()KoN*18GoX!#orrQri>AS>M4wK)?Rku%2IfoERf~M zwD#v@ZL`8S8oob;jW#GoyjOP7UFX1P)n~l;*m^h6W`WfUC`b6A#H8{RJZWuF#W`zJror)}T zGq3Nz&sJzaI(W&MfkCofRa%7?DH`$lrPm?`pRNiOVEK*J6t*t` z-MNJa{kz=c)mRQZOyiY-fo5_f-A2s>WOYvmz9`n&

    ;hp=_&oTFei%moJ;_uV?P#N8quzA3YT2Che%e-lfXxn%!m)8Ncp}*yTiXih25ho6V7Q zi=L$_)!54BXD{bx*(Ju-Q2p1nG%6CRs?SuD6MnBF_3HH5wB_P_ap>pEemKDgUh8X& zjI6?c&-;+STn@+z^c?;VZulR~g$4!b8oYNv>uj#`^_2`O@)T~&+-Pns;V(Pjg$FSr zpT4hCj(7BG`Pmc_30fb)`9K;m8m-`4*vVnc;M=S8!b!;`@c|Wr*B{aeL;C8_uV0p@{3SZ2eysik{wKvG?6%nvBeIH%D zUIBx|<0WYc&5d!eEZ;$~!UwHX$CbRw=#n`2FSVvuNTRTszU(Zq<6CX_7H|qFDcYmz z9L%Ebpa^z7UY=+8*Bn%~sSh+O*Zh(?xQLO&GwK6C_gHTxr-tJ-gK$lCG|`Eb7;Vyr zf${HNVN_beKu&GXZT3WFnz9R^HIY&7Uu8PR$4W}n$gyBt)b693ZmbJZ1;{KF8*m!nlM7$=4ZUI03a(~urX=JSLZM&;J`yQB5Dbe@i%R2PhyY0=U&1M9&d)qx z*?l6+%vROoO2IFM2yxJ`6#thIA+S*jz?06w&B_14zyD>AfkZzM4_HOfZ4mz|$3(bK}&Aheoh+^X&e&}cpq383S`S|A}Gwv@dU(`@njw{KDxbFJy?!Qkm01g=_^~!oybo9wW zXbOl%EhCD~jH%f)cV-xZ2q=;B-r}KAL(G}LO(Tm(bL+fYhUd#^kY0mx5iEOV~ zTY1tVK}h~g=dj)NQf!j9j^O4`-`WBJ5wQb!R%gwko&TwMT=T(0O?$IX#Rzj)+1orL zMZCZS*Yr}ozIBpE*qcm8ohxO(gcbru+zRf*Tx^VY;kfOJjg6t3MfJsS7ARi#=Co7V zGQO_fk(TR)=kDR*N+o`rH)bRgx1$^?N$K2I2PPc_Yw>??q+#s8E*J8JTJ3)!$$u;i zkZ-k~_ccC&WN?>=oNNIT1dXRZnITUglNrGhq&(R6u3Lpxu$35i`~_Ji+0ajTHSMxkVC_Eh3PW=T+}vu zc1|`P2*3s>lfj?fconx61oi~6^YQbjXldo(W9CYP(O_zF^$IwBGu~0#4?JL!zZ^Je z>rGzjCg90-VMHAB|*;-wYhflE;bHW^IbI-P=|(l4Uw>_lt z2SvoR+irY2T)HW)KhwXu4$hHyi=w62kln$IUiWKyI(?*y%2zkB^fuC%t}opAx|iJF zDl)2jyMk-DEDxO!C$xGxq?~QIbD`b;6YYv`?|6*f&RCB9S#?E5_J)yBcxQ!ND7;fr z^Xy-96rgYclI?;?IsN~_I{yu*1Tb(Uu8*dM?Q_RiK)!u(?XZW7VH`U=W%?fh2NFhB zQxIuz|Lw`1U-6lIjULYE<~7i}#^K3Iz7zM&0y|4Ftp8msD?n6S!NkN1uP#Vpn9!UC&wLz-UEX&%P!*|43rC?Q1c#uY zTfsjN9=anOCPx)XPjRZo936t*@Ij+M7GIQkw+p_PkH-$SYJ1;u^f>VGG#G z*12USnM8H2K7j^9n0|rO+9nrO#*+LSjo1_uJ};`9^Q*2b%Pk1z$~l zr{@CbfT->5ilA(Yzwj2XW^>ue`17Z<^u3+V;9EAjdD+?7A*++$e?Gs`4uwmFYVrQd zrNQ?9GHm~#m!)>X@!79Z(cz=zIN-Up!)^^4`dQza-o zK-B#pzRaOCzF{+{G(=aVa++BQMk>2^E8j5xbX0A{_5Q{+n@c%;6$)mjhDukN#`p^U zP?I=+^LYpfOJ0y~WZe1YZ#qY3S5ASP;D^-IgP`87Yb$v{I?B?Ll2Iq4vPcDoQp3_^ zfI5R%<&hD#g8Hjbt_-PzpS~b(`~+7y->r{L>o@$eL(0b^tX5fBsl6;@U3El}8Zi^N zO#xe*UTl&6)NZ~Cu(hxr^b39CV7}K!B2wR?SNvBV>z`xiTqj`#x;Z)vNX zux5(&i5k||If{N{`3;)$9O1?G3JM7gKt?IY*Jrrs8R;uP4rx>N^Qwd*mt))OH2Ah` z;(i!G(ZG;J;#w>5dFuA6_;Odsx$>NbeG@u&A^YhG1V zqLZ`pPV3cDwb}1dIMBvqQ_2j{k$%IeE|;gWKy~lQ;n6jy^`>lo!&7Yfim`L~SDU0? zIL)Z!+@OI$kQMEz)9DgnbQ9{S8toP3%5QCBK4IZ^H0=e2oNpW7v9U+K>6RXmBHKTz zCG1oUg&%t5*+uc8a`gd9LC?5$5fcYTEI`B0$TX0H3}38j99K+c{LAL2VEwi75*OQ~ z{@>4qE2tk`laXp7w=B`xL52pr-FJs5{XkamA96-V%>XOV?94vXb7*%{$~b!xJj-_V zr~!K2@{xSs7e+*lhEM*QJdkkkSh5;-qa&Jkf`N&O$MNTcTT`+ly{^mUoSPdx zm13oWt!xRIs1(+TKEs`&LI!4_FfJ|a@P)E6Eml#OO4i=AeZfao<*ZXVtcijC{`eCe z?`({(1_l%=;t>U1U8cQ00HKcV^I;>+0q1?^$#mIE(&hwrDJjT2PNxx44EI27Yb%iE zFK@ZnH1gg8bDqR(mv2~8!rG>sXMlJ4PF+QXf1aHDsKPgjIZ&~#c&I0;XeO(t#&wT! zaMY-0BU(#Ok9WE`dEPPpOwW99zQHlP6QfT_deO^UmHk{O}Dz( zeG!Zig4RK@ZQvUB%>Sw-koF+SqvU&Pnt!yOHz!nMC22fxdI#WN=yCw-R># z?GBwa8%tQs5!T5vd5HfGf2$>US}UFozovx5HlevJ!=d<-sid%caKodeWGOf9`f<^`<$APp2@N24}>S5%mGCRh=gi*8}R? z7819qq__=Ja6i4Hkxl|9g@?A};-Yfy_)O7!O1C+*zCjNbyevgiZ!TL5*(^)+nvd<$ zoYQX43S;`Qd+CosboCWaf4}kDs@^^a6h` zg;7C$bp7NObyRsW^+Yg$jl)p6pn!b%?rHC7qJuuC{LK6JEhBx?KLw*KKRKbczbsMu z0yH;r83kB;Z4MD4jJ~k3DX)xSy^goa3b*9mP*aIcM~DKyftk~uew3GPfuStFW`J^N*k01FdQ>C*V8=SoJ@$&M0C}lrsvy_XCJKb3qo85!61rFXVAvh(#)X*;I&^Nu;o*YH}#uvw{D7^MTjpW07PlAJj zeuX&s(gWkRw8GWDpydBc?EwL{?fxIN0zIH08C48g#0nabR%9T?veeAwl^oo=vz=RuSsx`wYBxL z#-Z;ye)etv(w#-g#|OJeK0``)>*Umhu#%2K=O z6=+iic zRDR$LbEeqKU@jnFGdWbJjh1;tes%1d9&u`b>rU$BGja{JX7?O)a zB(~h>m+-YjyoiV>YV>VaZG^iWTY~5!=XbHTKrw&;l&d&-xIH2#?-4gE-oTwhSCrw_ z>APO)O{XF1aui&iuk7a}z<7)D`U6EjG-ts~bkR%`XO3jxlO!9##d&g34aJQ?MdD8; zQMaKBKD%1)whO@>|0&ytGLfFKos+|TOgYNKQ`dUzAIv;e&R=}aI9OJ$BxJmmhjiZc z)>iEF}SnA$YOD)THUA#1GOYe)`5pA>0Q5V0ipEaYgl?9p- zhO|O-0QP>Ev}5)uG<7(-ojBDKBl@}$*BK9tWIJEiH%xDQh-^v@(t<BGCFiezM>6 z1}=HGMz7kz{iwHn6eQ_pWhl}_!&)Db%NPZpr$Vm5qrTB33Ai$xBztSnVb0;j6!@R@q~#PLlo@0TmK2l#Ui@|3aqPj64s;r({JJ`Ztf0?vyIN2^o&JS_jz*hS_ZyLGtVkDIpx`V^f3nml0E@Zucxg|850vc&xlf@0`Wg= zZVEdOtB9M4x^vqNhDl>hB8UQ7%M5CQ?ef-FI=A%?5^z@>*q@-ZzQ#+qCTeI5% zuPMXuk)-iU1K+^BZ+`Q`)1PC!yePS!9`UFR7|AYC^2KVy`h(6$XX+C&*^FaR`n;7{ zpr>K6hyM$@o&si6jrIBj-Qs^ZyZ@nGARz%h&xls#P*V#F*uQ{t9##wv?B?bxqLX?2qx zW>n-91rUaUXc9=jptq?-+`h_#q;yutP~^w=-~Eb!ts`P7MD=B@B*LTOd)hu`I1E@R zLd_=wt4VeTHawMv#=EVY5HFcRY|(!c#_N3jss`>Bgaw!CzU=ZKPD6--cU@e?%$){_ z1sa zaQ;zeJDRSb0LIJ|I>U%c;2;SajU+^qTR>6ofHekWIG=644JJg09&cl*_u?`C?L4*E zM`K3U$&h#yTJy*p5K+eVE9Tvo)6PpwbS+eg&r!?pSO$fz+!H4x!{9}f zE^3Cvt<($BE#30aOY)Qz1L-;Hl+i7Pz87U^GhcjZCiM2KZZiyr=%EpgKM#Ft?Dm{p zJQ$M}gm}_kilTNo6U*~8e9vDgv5+Ww$6zI|RCTGPpH0J)aIkvVd}DZv6V? z%a4I7OIK(TdnB@#z!c^<<;!Hov9+neIRjQeC7D#71MN-Sd@gJ2br7`R(BhKiD-N&q z4L0E1Njkjwm{b*Ho2S)`O!yjY-p_s}wK(bS;dPs<09M}+Q+S^%*dJz+u{erDqpL%r zH43q^=I~R5v$Z&=Hi*~RigeJ#-=Wb1JfEc)39bL#$^5$ooN!9;G@T>eD7gSfdLx>p z3YXtf+dW#F+v%_mYBw8V7o~{WK@fS1oOe9rEE>G^=j2L-oXsf9ev@rw1w}KNdZIJq zNk+Knc-fapzn#+iT zk0d_?pGa&{9xen12e@TPyn%aPwVCD~NuIl`b`39Jgvb7_JZ~Q*sK7k*)D(~VfW#}yh1+$1xt;jnxU3bU3?3P7UEZq`p>}L0YO#+v8ctm zn#+K3ds|7}yiTXy7cphn)7#7nF{Z^z-N)v1^YPIuLVp(BA3N8p?Uw~q#erJuCM0(RRz(PCZ+&37l6Z~csXroIgHr}7>~|*+ z#)KyIOPRCP8X;gB)x6z$K7f~wq(0|AF+r%kF55HfOu{2FDPcU!wD z1QGsXCP_#k&r^j*MRoMEP8)8JhXCK0Jgy#DN`Qa*)0s2=x<&?1h7h<4-P@gvU>nxq zJ0hQBR-I9cD|*?bSNd4RkJ2UX>$M?bQTeSI`a@`J>q|{rPrjKXtYI?Xf8tQjNz9<5 zrTps8C!NGrXlF6OO@m_~c1zk$yIgOfLJ}uURVzmwWXz~NE-Lm?`4Iore&xYRXRwNb ze-^OuS)tHAmtp7oSiiYtcV{&+-DD@mxv=+e&a2L^lqo}k*WWOuMcTO(dqeAKE$=^w zC7Wd$-t0$zyU!79OEpK~HcR*!E$_~F-2|O;nEU;g1@!{Lc?`(nZygXaH5y*8KiEv% zxCo40JH10D?`X483_qM$YAxp!Tm@&O0%j=A$J2Vb56F%hZ)W9!$?K>@F8Sq)B65fg z1-nc$em&(EylHUSc!u@j#%eU{)2vW$-5X8Z-hJ>AAm80Gbm3-v?x4oN%Y~V=#BqD* z>I%1>^k$zl_;F(yzuSBQdnKL!dtm_?pAeKwb=NmT!9Sc|zC{myj{XQqeFL;sop*3! zpi2DygQ6w{YYWUv+{&7_$fbpMxa>~$$q|Hjq9VMxaGxY-uwxCwSOzzlUIFKh^?NDb z(QFB;O>DRQ85?NZ%AdDhbG5%ew!fZ$W=z$f`^w;ffH7urV)=10;( z6tB#n;%F~mgs*694yUfYGc$kR-L(JvJ<$!|F&v-tW{ujODq9@hC`@sp=4o;+ znltwP!zC|buF?w3FrIMvE9QUp62RAg`Lxq{1@`}Q50xMgB>RM_{#a9WfDAGxiPg_` z4rir?->xHD`v9l}yaAe_9|lFxlPM@$;>|=|p@P#h6F;r%vv#r%rq6!6exbgPDhIwX zuX5M*c!i!L!poSQ%pFJ<8$kmrQHhRooXkP8HcK=Y^L}|?XOrv8xo=|H!yGJd6Sn^L z74#wDN?5(2d2Wx>YH?;}R&l;J5Yx~8fUPFKX z5t$4)^yFO;b)lpnDl%rvbQeCmi~#tlVvxi3;K%BHZjWf7WL6$3#5fMNs%US%O`yK& z;N_CxvY9F^nwq*jAD3_EU-C9#Z9&4KM$aeOTp@895v<1si73p(@<{OodK8tbhroB( z#BZK@L$jzaR(1SC;TIRRg?0dF98L7i-?zF%JmbNw*xTFVr$k7#AYB6h;v2A}hmb<3 zpwf&z+%NOV6c#9d8Zo7IwXy!1r~Ijn&&}_4UgDj4EB#a64`}5*9a})9pUrMFP~#aC z(65&k*OlX#_PH)xb+T9I!o|&DGMW1)dduqPTY^AINJleDV!Ih77_@dx`LS!fcS10d ze2Vd!lE33BT8c;{wweokh19H=g?rd70~>I6aS^N|^vuojU_d)${r2@*i`jJ9r{M-NMk&FN6aHLb3b7mccf%ZKAfUcwzE=u!lZ4-H!DJKLf$}tD z1r3;iD1e_Zb3U}lzMq<@u=>ft8;(bgl`s~4hSySMW{9krz#tgJw22Ix>2w=bgiSzX zOu;w+iz-2G!32cL;~EXV1{+tr9kSyc z4Q}Cne6kP52K_MPa)-QM1&0`covFVr~!fUvq?SD@LXl4#t%1*!$lIXkTnt z;V&x2o>?#-IlC#C04}q+7(vwEe`(2-ZpS6?D;%iDqDLYcFsgh2FeK2<++roehvx|D zySj9%+M0hIJtm8QbpUfK3`0tgZ!Oh5j0xEkM?siT&Br(wOUeb+WVny2edKq3F!YNB zF@9uKc3^$cRzgG*iW3$dNH`)wQH6o!ZRO90avGd_EO{tqmIEjuUP)=H+I?v&bsKqN zOhuYvg`I?s5-}1VfQ2wdaG`QfVsS$GmwfCO8s3YZNrM4OV#;GKb6{hy9kw0N0Q4Kk zEZ;6=lbXhyE5--FRFK7CT7k#a$*r%wmCrNa zA56R=6zDCqbg!#N1;|#}nVGh8FAqf?Y8;DqqrGTWvsToddK7n=Jj1G5?<%J+pf>5v zhi6;vpFM6^er8`I+hpZbj9O&{njY4O+T0(M`2$YTp01pin{z)DZoJA&n9JdUeg|^w z2ErrbwmR_d);)TDq4CNW>; zgP9YW(I^;=M~SRp%>nD`mcT?qO3DQQyq-{*dZhSwXCgU1LqW~GW9wk*&^b8Eu+bXm;BglEI{|*Vm zT7RVxb@Epw|D$;PYaU(&HoS5N8k>H2zE%h`ZkUWoK+Ud1?;-$`jKxlX!M?Y78Zb&L;x24IIte?LQTfZOQk z>B-|7;PBuNz2iKRV*|s({2_QUP{0ajS-kAg!_K5LGBpAUHZBqXVu{Z`mnJd#k3zx? zO;iRk@-s6QfuSyA2p~zT9`bOj-D$Q)!Z9odoNs69iHN;Wsii z(mtk2Eym65aO1b>rKMl{dXLGZ^qd@?_FOh9J%G4NJsL~mYFqW^oyvB1%Jltr4>_pz z>Lf$Cr&<=iiKKEmxcf2f!?P?cM9%sHO)2}Yokoy}5qJhk`=f6(CChz}`f6-Poweh+ zoVAaRqw_Ep#JmL)=f5v;G#U6teHDKcdwv2%IYdcB4Y!OCBv4reXK|8*XNz7_$JN_J z!x*yj_@(xLj*q|Fd=CqgA}|*`kOVG8v-=Mpv}4npUEGFaeMd3F>qaBrS5P6tK;iKM zGJ;@xX+b_w(QawlE1)=YW?;b2V=B%JFCh7l_%{&)w+ zZ)|Mv08GhVBcR-sVze`6V3n0LTJ(ep!>ypO@Fb&;p?W0A0dxlB@InP3A7Bm0ue7w1 z7Q!Yx(%;sYwz>nsA&+7cI7a-+`2vAdW>-7s`h`hDJ=8# z73*bw*8OJr`bTz3BY}(oAW<|QJ{^zuS4TDf`ayW-KtsSvINPFlH8ekqG@CV(O01N#lSf@GYjd6$+p)A+qp`JMwi(MEC^0+4i?( zA8GfmoD)E(fK^Bj>qDXB@-ndgIY*46O0Hgm5S(1RM}%^b7N)`C%+1Y7?c2eV9a!v% z6suz!Ll!CVJaXl&mvCBXX+tgO+q}HIj~x1fRy1c&QIE-Z?Y|a*nacW9CarfZNL$}U zc=65S3*V6Nz%x?cWUn*v@^(>I&x6^hk$3m@o&!nhANXjUf<7xGdeovtphJ8sIAg_{ zzoT%1c!3C)Wa_CI2u>i(<>78i?yd%aOAK?O7P)+m7tfHk{{lgV@%5B#MKC_le)=mu z+wDla137=|nIph*BjJ|9!L9&2OWI;B_c{8~FLT_oFy;^rFg!Ey2o_c&epA*j>CFY4 z|E+GxM+#f3#SpEIg?+lzw0^}e_TI`EvTWPrb;;Z0e2RJR=N5fo z!#E0t;8O@Wg+zpiu_3o^^YUosPcgsP$9r!wD(zX{C4xQSVgZbSd^eS?c(c9vOHa@h|EXg#;go$nK22X4qw#TR$ z%8j<%7jS~(>RYKE7dR>s3)j_7-4<#Yc{*T5Xr zyWZZgXtfgw-}VE#w3CNMa$vL~%D3`nOqjYpv0FA{;0))q5lPWEpk>5mFCz`@)Y;}0oL_mIIo!{Lhz|qQ*q-1|F7jHIRTEW&D;0o<|mU* z09VTEvuf6X0X5~hUvuZALc7Hl#22CjX0WyH~ zcltb`!H}{c1vTNF9gpbimn9^gV@!8aTWPDpuT^vZY3Zm!9D{sGRl?Q&s*LUHa0#P2_(d87I72d(Vp^V2KpbvN*oQZ*9I>EC*CbK&EoF1m zXlxGsH8%i?0LuVt8b~?au>$8B@kT*9gzZ&8Fb?d>vUwfa9*tN@I*n4AML8a-x!Qo& zI4@e`zX3_-WF;ul(gf{*u@7`I<+cu8e|{`^4P-vNY&xDjvI>x;eaM#tsg-Rg-kLOX z22~lXf)Sjr%QD`cjA83GR&|5*CDo9m&^3J}p$W^dG~hMu^gim4%s#nGPfaxo5eAq; zHj*ZjejeD@j_+)PHnz5=M{P&sqcyPYQoZ_L2uI0bQVI%wSon%XaH6Rpb78_(4_(8Q)vK@@zTazrU<+=c07IIutW)Iplbg zXxT3bJ2Ce4@o^y{_Mi_7U)dPKQYGx`4NDbuU083me#wmG7h93Cw`ZyJ3TnRi$pO>{ zFi%El-vJX5&q=Y8T1;^PfDN*ae3xgQIvFg+uxfiBv{27elLaxz8gqc-ExwiC9_!C+ zmZ*3#m_&zpAyPo2#B^X&8*A%#ipPhbsw75-T-mXxY;86&?&SnF%_~$c!`UP zTdk8f*ECcb^#@(z&bN&H_bnr83J_DEiDWcSy03wput3BfnPWmpe&yym26xlf9Fk6O zb3+`5P$)JizgpFx6Y&BS0yx1xI*QvZHcmZ%Vgj2X2)kPbT-R}ezR75Ah}>{Zg!3y+ zp$~j4DHviYGB#pNxpKav?m_vx4f4ZhPfvo+8U5u;#%Lx+aq%qKoaN1{bst`;AO$Ih zNM!P#*SewXhj^$GG|({zBDDT54z!*SX^0q8u2BnBWul|rbAr!XR z<4n3CeH`2fe(wy-;wdC+h!NMP!KbIHY;yDOXaqYiQHj`fPh>n1f~a}{*I8od7_kNp zk5bx&d()nGzH2=8tj}j)iHVru3m3?X|858b&=~(+B7DW?V(@=$2oMCqU@$7f6O)By zTwN(Hc(n#<3r&C@3zf}1wYkTLKCqq$90)5xPYwlONq=bQF)%Pj)kRPVKbg`z6fJl! zCTs&4;- ztINr{JR5Y^ap6)8p`pg}Nj%zFw6;iV6`Z>i@Bx^;E@zpf`l-4};`MlVlDQ)o1BYyQ z4Nb$tZg#G>aJ2w~uef!uGkdJP)t9YeQAVL4wb~Q&X6G%#OS|+R^W-}}GWS%PNG)=Q zso_gfS;4{gEv;eVxBK;B`N)YHZ{DC)@g#Ui;>^`peY&?_2vupD z2ZSkjjZ{8eyaQNurz=!TZnE0#fPuqe5EMzt<%rdt!mh_M5bFRk&34`rH_LhX@r%1` zj~cu*)bg)QA!9oKB<${Yl>D>tFU`$K5w?umfE|E{({LEII7Y>dbxRnRE6j+bd;pA9 zDPeN+XU!sUwyt_V$|)BA2qw&=5ap_07wAmU0uK8!+=x^?zc=x z2|*+$XTr&^4g?s0teElEv>^t}8CSc}lko%vJ_B1_7-*&uSDuWZt-tF9BOyN8loQYE z;H&ZLeHr-8kdJRRPAPH7;d}d|>l_wB+n8JQUZPXGJ-ZCZ*Hhn(y`w*JH(bdRajhfe zy5+Vl{c$EV_CoAq=TPtkIG= z#jxOH_MtrgKh4<_27X(%4Ze#qGanQfJHG}uUsfg6OI)~)5Faorc1xrS*z-@rP@Sgk zr(83F#lgjY7)e~gw~Oqn9<;u1_<>wHf(H}G`3MgHK(K*~p;eRlZ$z)<*M-v5{p3ns))>i~he7U~wM0mOvo``{6!tjwu&zOcpJ{J!Jve@sR2k%sg3Bv z)Gg-|C56ur1>gA%3?zpws;KN0`DYL?9zRO8>c_a;*E7>JOn^~<=B>jfEp zNlOAgz($9rgX28gc)^-lO-33Ysg;U`kLGU`B|goy@H` zDrNQRjFRy8C?j;Lm#$tl*(sXMJQ!Gy6VZHsaa_Muy8o%5o)?)kG? zRwyzA9TE<^BsDjAnv2xA)dNF^n|1#nO9}q2&83J(=`W=#)rRmuJsDFavNUM*N>-fu{vQ5y06&)slqy*!l@GhJ zN|Ti~O0onDjxmhJ@kW=2zM+cpXuavjsl3@~#d0%Q@$u$^oJ>qShW?No5Pv5x*Qv1g zr69fqB`M%&QHHTl2bQAzeg+Z&*d#J3!Vp#PWqx5{`kfTdTwJF$8@CL-$Eojm@uJKd>9%8*XNll$*<*!gxPAXWzTPq_u0`t- z#S)4TJdoh-7Tn!~OM*jicXxLvg1dWgcXxNU;O_2kr@Oy?_nz~{`$^T0s!^=HWUjg9 zYy$?QU$bF1>Q*nc)(XcTR9`!ZdR3xUME4bEUai{gIE{{s|L2STOlD8%lYr9 zpvpi49_*-aqd(M3$3Gl7Y9A@^p`$$r9xlFg;M@~7^5$glaJtru^X%E-66ZO<9Lcq* zyZ)wrWZcDl=7HIe(>B+r%(0eXJIz#W439RY?R5pKlvo{} z{6uE7&Qf0u?T3dKMnYql%?+E}=$;k&TL1Rowds^@BP)%@uuQm*9G+YL{%Vop1Y(5P zLGoLwBO%syCX11YtjpT;age!mEW98eEc1B06}dlEq({SO z!r}|X<-*0$hkx;FW)>?=tcP!|%Em*ys!T7X_Cz1|?8`o1eV=EBi@ z`LL{*WRc(Mt!?asGOXTlVh2&ec1>Pv7b5eyn}7e95Di&pDpX&4n?kNwa4mS=mk`I7 zI06oDnQ#-ihYlH)w5nt5kR2w8Xeu@?(_H%BzHEN;*{d5v-Te4mpA3EC2}XG9dh(9zFoQ>B`Ok6w;t2xf!$~$ znh>xf^FPyJ!MbvLYio3ROcj0Hk@dks?GK}Tc0ANl%qGIR@%C@8!0_;1g#e1>{36~I za0&zV>G@s0?p8quy#Ki!_`4MZG6l-gSJU`^B?@6asLM(${Amq7S07LqQuMh#C^G*3 z3qxP7GyrRFN5XdAs(g7dHboGO@V-{2$s2clM8+{yXZ8Xq}lx0zHS7o8$yW*aT_{j3II zqM+b+VO&nD#=|9y!&e*K(44^qY2Vg%f3oJC0h>$rUaOgDZapq8ljXV32aS7%*|h_e zWy4unkl?FfaK+y&vh4a>J*TX@IkZvAibAL=tfc0)}+6iv^) z)fHwXD@#te1RRRgqihk3Gn2^@X3L0*vWCUz?tBsog!X|=cdzW>q86tji01c(j;trB zb(YlBL`wQIr4PeL0l!D&iZZ|oK!;?Tli?JwJsHBcyJ=>^BBP@Y`D3c8!x8s;fLt^2 z2j2-e{VW`e1l0g}XlM_OH^VK51VTowu&B?$0t>KR$ktM_+NNVdo=Et0mmJb$Q^>d7 zyxRzq=-kh~9niW+AWmFdi#}?`0Yzjaz$B|O?Lms*8`GXkH^kF1D2Qk^>?U72PRe;n z?|0Kio`=-&P|juv43>74|5#cZfBW;(TO?lHict%||IB(q_o*NxIQt@)jHuqp`oS0Q zL-IDq4JR4LK}TB@QataPybP~%GQ7qib%EiGTmZd0Vh+Y=o))$9;i$-U89h z*F{r8yR4){Kl`TQK^wRx9;(pA5N{k#glN+{Ls1*feojbVmQpQ(`zxgj*s6m+R`3o$ z`8{8=4@t=8zHNEEX%|+uonm5_+zNMbR&W8=rb|M!hgnclgEaRA06 z;WRfgq6Y3oJM?Z&01HGv@Y^TN57-nQdkBeTh=M^<0f4anZAQcc%>9v4^g^+Po(Qp#%ZS@P^gFgn? zaF-$BM2d@9vqncpzs_(6-e`nh5ze@rwR#yo*{N77>f`u#aKIbs3CkjH{KV^^`r{*= z2;GSTJrw^0K|})yJA(NWw;vK(nBErxPLLo;(PtkHEd8|rLLPPZ3o_y3P#hD@x8E%7 zgiX=@j9<0=T7C{=TRn%^DEQhfEhS6ySkn;kX1R}uK=9Q-SBNeGhnt3{JDq;->x`2E>32616UBn)UAt z!U1(}96_Q_Ak{%$C3dwFAQBq}=SgO|nbW~9`^0^V|KeM99n0XEsU}!uYBMw0pmN*T;Lm`h&xVY38w9 zQ1`8K6MKC-jNLU$voK{n=0oM=qdAY$YYXiLGKgw#%)@ekN(|i6xeeaYc4-foU$;4B zE4>Cx5WnIXZ5TMcJX&bIqd`X0Y*p*slbJXwe+#|}WzljKAnJUg?D?9G`bY`lBv?KF zP5Ao{cQc$mmNQHr2L-Hwm&dD=K2faCiH!|1-QxJNX*V-`3Ryd9G$DQLjRVIVal2MO zhoWNPXJL8$3Tr3CW3iX03V_tUf@_3mebo;PDFq>)%}T`7W(WzhNol1EvQL&54>~Ds zs=k)Qgs4O=Ks&4xBgI zDLe)lnY}C%zgV=*jq@o%@kv?(7iZ@E3iEdwl@@eM8f8U4H+>(2w;)%>3Gf7~=IAGE znN*S6UwXTNgQ;;8qak=kiWm_g@td^gF(yWd7pZ+M#a}{imq>hoDkuE}Ma&g&SoFE{jsyF`&9i&;L+FgPWHERT^6?GCtm;!gmSJOKi_$SN|~O?+~P+Fc`~ zRf#o#1xL&E%TDv^!|a*3BbFqz|$?eRjn$#DEPN7w4%V2Av6EH0rM zUy8x`a_yfR-{5fBt?lRJgPK_rQ4m*m#k(@F#HfP*gjMqOEg=`*W9e;ak!{(A-w{q+ zu#nXQM7UAomq%Lepy=KQZdN<&i;IiYpw>p@892L-bK(=HhX*Fu)_x$kD|TeDPRNfq zo#MDZsfmR3*7AWZH435*9tb7=E52VNBF@usYG?tfP_<@&P*&%6yYK%YI7OiGm(-&n zZpQJiZoVQDr6Y*m9dxXZbafFzsZ?b{T}ng8wyhEzd_JiMNKrmE;mLQO9L+cv1O_fJ zrTjX@V0Kn};1GiF`0+>=ymrq{i(j!fLP4tnJki-ukSkorp@DLQT*B#vg$+W)HW@Er z?f3A1mHm0?8Gado4o%pmph4Jh$F&ZWZoZn8Rl%?4{a#Y_XET-kGnUC;@blVE#h9no zrI|Toh{-m`c$N!=3R&h!SbtvZ%aa4=8#kCXAQUG$MnVf`=U-Z$4-Q+npJC8j@VmAw z)v;sdJf9?mm=}Rj9V0u=trrTY->&?qz|IHHFCcUCMtBty5H|S`1l;2l7YlU#{_yR= z$51zd^;1lrhmlQch$TzUWU3nWnF5-dRG+h9@}SKAp13X2uOpdtVrYwZJbZF66Ks?8 zQ6>6U{8tXHZ5r5}B(q$V0@iX2lhcK8bPJpbFIy(XzIX69-OayNovQxCar4}-3_2JS_ zG?m6FDQO7|;&kecUh1P+>~Fq69^&ETRJI|8x?CoD-o8C&FthNQXZLl}Rlak1Uwm42 z%ke_%p|qr35&OEq%tziYshWjBwO9#PN6>hSKW|5fv!v0O0SLiW6NlNVRURJ%lVc8s zxo~re4o@lW_k?U+cb0oe8O-9eXr6lAd`qUJZrN-{rS0NglM@0->gL_(~ z58n|0g%m1%7VZCRR=fOw9axuNb^Jf=J^tQ{5>k{>YD!+1sKzQb1YZ6qCv>jXz-jM6 z<|kj!d(EjcG}WVjWP9+FoNiU$^~)7300~1u39@_BMhW@`!)VOB2R_Id1G1Tfuz)1d zNHX-5R!|qUDutd=k$FbtkOYRWU8F!tn39?{CuFdHW}2(xO!8PKE@zG)87}*TTPLz+ zad8nZ#J@~MM8V6gNAS`@UHh662hcWPOLrE)0#5yig8dW{CxU|oN=xq!c1MQ;OYF}7 z)SIj}(YDZ!)-K7uw0XVZxs~xqM&k4R*qBfp@ZSppp!AZEo{xFaSF@pJs5`=h+B8$#s0e%f9 zoiOz&@6gcEj`p1RRnMlrDCz9fmDTvR^?&F5P3A zZ=e8#fh!Xlya(F-4>PeCLwTPeV>>Qa=&9Ff{Kuee4aJAA&y^p7h&(Q_U$(lz8C`ynXCt0_Edi46V`Ar-hy}4n;qEAbfHPDtT zwZk5uqXpr=hL%sWrjJv7O*AyvNp8dquK9ER4ke55Hvk+MXx;G<*%cmUcV)>D7C-za zc!P`w@H;-?rPltJ?$iI-`hJ8m8)BQfd%LHnw0rpAiW6fFa$*4Pt?*kicy^J#-aL2i z0Gj5%dGFo<>Nk|Oq5Q&x$dvf6#2-Gfhyoej5CvkeTRE4oF>>Ucs?*#ANVU>++CdN$ zihN}>%AexvPpV6J42mt$Pe>$rkr=WUTdGQ#HxCeO(N$)L(M5z21b%{CSR^d=p^3y0 zWSFxy$#@b*273;4jQGSi6BEgZ1U0LCq2QSb>y*|7nJV%>t$o$yqQL2liuD}_3L;=C zIeOUoIFht3?<5OLyU8%ZjHXqfG7&@}D-qhp;SZl~@I8gL8K)OF27 z&U)K&v6|QO%G`Men}Rd|7Sl z8+dzXH&EE6dLPKQ;ASx4&ORx4VOlj|<2M|UJJX9Q-Ooye(reWx4b3S}*u|x&40!n| zL~ofq^*PuVKYn;Ac)Op!4i33a?2oI`2v9IFF{!bgH60q&7O7#6!szW)l#(hz!FD)r z1UTC!u{jb_7j7;UsOC`@iEPK*i#Rk~8dq?l>q2LYhd+g{`d? ztmSfL>`BxWV+=6MWY@SPRxgr6{+U0%dhnD7spSrQ4g=Zs z%Rk3Sx(Z==w6MS^zraY8p_IH`78{$M^+(oA{!1Ocm^L|U`i~DM;>EN3wKF`X(y}q5 ztom#MNL|Q*5FjMvHMjb`j8qu<(C-227zQ$o9qJC!yMx-hqh^QCSO4@|C4iAaq1eSw zFCK4^@_G&8%kP~I?!4D%)Bt&sMqX{0@Wr6!PjGE1TB`v z;GT!58w6N*o|0zv!$=lT>QSCrV=?aTjc1f{%yMi7Z^1hNbFun$Z3nL7fmwKKo4zWT z_x({szX^845l!UHty48XN(sR9EZ|6nH_S-`Y#d>G5q6YNu~Rz0K8>--$%EA|q841I z3&rp_o`yz7Dt{^m$0(j0(XkeXCF?k3I)HVC?H#%ippMC;r0MbF`$7qEvMMLL)y8v3 zp3E30_R*FBB}^(|W;uHLvDg0ID+yLrue`QZX-Ek20W^3qecO1LPPS~`p>Il++*o#L z&wQ;(>$D}vZVtnX15vNnGKS>-o911tRdJR}HGi)+bwZs8PXAb$n`QSjKL@ z>KAP&nQ6kaIRxcgf8e!VtU8$(>V%wi8W|gyMEwS&24@D4JzP$h4$qE+>ZnYf~bJ;K;82??Rhhv84O*Nqa1VPcB$*F$De4f~~GfwbIjRkUxFC=Ss0z`YzH&xoW; zx2Je(Q0dO)(CHN>j*iLXTh3%e(lRnzh0;k>oA&0%V>XlBh8(f2pdg$sQm+3nm+sj6 zYahFpEd24G9*_jT;QsXY|5p55lzq#LOG}?y(*SCke>(2Rm~rz95XyNb)_3dH{B5)` z0rB>WMgnxt32Btd;NB{un*oHeA;@3OSfvn^7Kegz2fu#0sJ8U`XixKyZjeKIz|20( zyFDZ?n;IrXH|5*Ot$daOPU|j5vtf=`R3+PhB1!l0>jWJN5JY#YD({y0gr>0D_6YXm?p?8Iy#0!R}SR{36Zkk_NMkb z6+Mr5DQ)C}Jg?tX(y~suO*m3yu-v367>7%YBY-qEu3kGNYREQ*B5oa8_R8*ZmU?~S z1be>lWP?^sOG9oltfm!A6Y&vuCrB>}hXe7WgDu%*Bu1K}lhYY8auWL6epQ-kmt#!~ z4_~=N zrY+YkBcr8R=V!}|QR^9(2Hh|ghRm^f<@ml3JWwU4am!eQ>zhL8Ne{W1EWRBVz-dwYJ-t6ZV4W^(0-v6+oMTX)P1w8I~=LmGc|1>W4 zktS$wNHraA`$igMHjDI&RMkc)6;txg)zHLNM;b2ZeLDBA0{2_{DcdQ*pXpY)9H%t^!0Ha|Fjz?+>jF$MbvCK zZ?$0B2!CI|Y(akJD;>!`6~v%_Kgr z8Q6!4Z0bfx{ZIP9`a9t!-bao#{KrH#i=Nhsb{X%?vn|@Q)z#HqPClls{M~~xkXAE~ zI_6Vo9TN$2EEyRY`-fgE5n+)c%{djEs=B7%Yoi$G=qK#;v>a;Sqk+#y1m8kJBr^}E z6AD`%{axR%(QymNR`>~>wPZp!3Po{_H!pI2JSMciz2h;lA{5SaB5CYGt~>NMA|nxo zoEmIcy~kXR&`Y~us^cJfoorc|g_Ubd(q9D6fqkq$o^eiqFG2=CVc?Cu=mzX^P=SQC z%xH+VFcoI9+z2fzkKN_~q9}*X$^GhF(njHxb$k@D!G6`PZezkG;nr1hP7F6cJ2MB1 zPy+p%cQ3vO6)MtW8wughNQgCykx}U@w+PoJk0(hK#6>^S|FlE@(+wlczTF)`oDT>2 z-{!~2&M?u_jD@=+)JjS}2ED{6IO(FM(1;H1Uxg2GR5Ks@UuIV4ge?%93TxZI7`ukh zNWL=^6rc{cj(g(rJRt!&{$Jld_&|_BWCTx%PiO%XQM3d`tz zXH?YCz^3k0Q9;%!AwR#nYgm|* zlZ1D*etlgi)J3Q?y&oQUwie8-Z!aj6w1$C@C8gJ;60CYsIb%ZKFKXdO1Dyi#h+Rfn z#>tXmbBkSlq_>{%UjEZ&cssaB@O_t9^hA%S}(m!`eT}uiStP-R{6H z9+otHo;Oe}&e*vx<0!WXm>QI{q6D~&0+py)`|cI~TQ}GDpa>-1tVv!eyc=&mE-tod7cK}f+|0}~F78#Ze*-F;u)^Eg z*j+a|G<0ZxA}c30MRCBlPeoQYx&_)Bh$?QEDbbTiY!iT;;4cI@k+1OX|HcmiJ6y0e z1^cq5DJ=}(p#6WmkN>{ifrkQ$49@NH3n~N( z@LEYE?Q#WP7vb&a+y<51kvpFaosFI$Lbsp+Rxi?yyOV~D4DG}n)rGyrqk zsGvW;0{4Z|#YM@Px7Vj^6Vx~qqRUCbrNv!GyoHKa^d7$*!Q|sMm2*swThm0d;fB7H zqF-NSw}*w;^Vqw&EiJCaoRplUv>Xha4L&wRI}ub?u;FFBostPx^vmCQncZD9Y4BkB zH1`XMrI*UV3eN=Z7%jGBD^T$&U>0vb!b^oHRWeI1)bv!yL0G2 z9*me9@X5i!!F3vu@R!y>;eG$*1Kc>-PxP@#M?s;Bk}h9zFiA^iR1_;9Z{TJ5Et$T` zZddK75R(GwM#P@NDfjb2Bk{E6<%C1UoqO@q5S?mc&7wJ`E6&7T$f95x&zSk^>B=|- zo?u&g@^R;->L}(U^0A+_vAwx3F+%Toa|Q_pLa*GHHA%po+Yv;-xz+_m1UYVluZFSl z3-?Er1nB=AG1{bndfB$ZshjejQTR6`A;ls1w(Hm zk2V2@Pzm)bps$ZzAcJuvN5;St=$FaJu`7SUD-9Bs_mtq^LJOemC&FoMY!tE4DgJhT zS^TzVbr9qALOMDwbCzy{e4N!UXeQ%O_q#mJm;0cl2-mg-kOCWRIXFKY}+r zL>gPO7O$R7S3x3A+u1>PYhG9hbnWT2BguPsS6&w-?dR_7S6&5NO4x^D^$1yu4-X8i z@~)*Jn#9W(Q|OlyBUmWUjKO+X>J^UJB+Md=Fww z_?_j_O{l6pA4OPpqN%A#m7KZgXg!EbjyPAhC8u3GDODSOQ_)huXy;CF?ANwu0oh*A zc*0620O7N3yxwaQ-@jjFpH{KDDsiVM_Gm1u{|Wv4>L_c8DK^c^TcO%^)=iB<50!|m z=yC#5Ejc;6{bl)0hOO)+o{YRNZlI^ivx#mgu%x8qB$$WqWf5Oa$`)fMHdetv2QlEh z2Ro67fRs)UU(^}3;no7p1M9*kai7Rwhr>fMcJG=fsZh z4mY2Xe?Sl*S4t)8TpPI=qo7mHmmCPXQnjJtw7fbN?BMKEnK?3j@{Co3INr;pSlW*a4Zjlw&2H zUcL_AyoN;a&=7DwLwW=+FKNusZ?L?h0K>R%lE5Sl&XWGd#PKzZbofVkz)IbrmbDNh zoLH$4jeHIZbuYho4_(LZ_$X8y5+Mj&lli`gC}}yQD%ghZ|B2G0a$UPB6^3QhElhlC zGdaqOe7jlSe~qAKezl)ykeu+Gllch-yESvX1&Om85jJ+)3}LEw^zNUZ zN#U{gg>OZ-y>HCnHafBIw<#>fa6S3n+?a!xJ|DE)#m5bwLT&Xjz_G!sBys#8c03->OB&( zU03}&sl_u)$O?KYs_f0p&66XZx=dVmc`5y4>Q`>WgSO*w2kTv&sXNti;ZIj%`Ww~# znU>;pr}(&~&8J7MQZxN-TMu1HM$}S&lspczLs{)JvqN=t(bzvcSHq>9YuyOTqrU9^ z;6k`_oKRWU3k8F|cLf9bJi<0Y9uX4j%7QBu6%`%wqFDRl1}v?&X-+0A-02Dm3Y1{t za3a&Qna!qTeLVvcpC)`ZMf$hd^=IGwJ~6FC5@Cnta$iPY^gIH(X`=)1>wTh!eUnM_FJD|2O3NbF-*MA=ExD8OmqSAf*DjW z8BlEnqU0x)Z1#~yM@JR)-KlUnU6Y5XWaV^Cm+C^)nC*-8eDP{)<;A8wnx1Zqm|2e- zn4TQ-Auk0YU6zW*CQT2vZk!MHFI>IY*9hoIl&_{-nyTy*h>;Ir_UNk-(<#`H4Ws67 z&ih7I%4(|Vaf-(Y7dB1Agk|UFlZCK`X1cNh133+RU&~GghlchRkFRFtJ)X`vw5^u3 z9*d2Qo1xmDGW$7rb`LHPB_#wqzC%4G>scJndWOH%|sfWjCsZ#u0G zJmuoyX|+F>Bb`lmNt&ZbovN~>AY_PJKM4F?c%i6Ad~IJ5w1j;+fd*!+scY&w^L6@Q zZLg&gSrye{^Ol?%Ets(G8niptWvuOql4oeB2qo(t5G-NGy)pYq)|rKSLb?>`5OkJ1 z|AXg>POZM2{3wEP!fO?sasZnM_q;-?32&~9p*ig+-i6}{*P;GLn}H_~bdIUbOM{G7 zvL5x}yt%`jS4rvDkVnTn<*K0p6<(R##aVPf3H^k$A@zghQ)Sz2Bq_1jHz59=}2^0Y{g-nDH6i%dIS#YPBr zB)~a$Q+6aA(bvI2YLj@I$$Zg{B+v+$o+vK&3c^Uh0HntJx>TfMHLbmEkz(b4$UvIu z2oY+?s#8a7n$U+q&g%IJI>#9YrH4Ogs5(q`2Lc&X|-}@FS>YdN9&@B zl)!c-y|PjO?8qq$tdwwgW~^@O=T5(_X)mu?b-*@cJ#yx!HQqQWmzzO?M{{Po8&8XM ziM-l>9KDu4HH%@}Ml#M@Z13~z;3XX?R2rsJI-1#~S{aR{%KKtDt@sh~r5%TORg5bmrVaBSCjWpJ`vft#9$pVf|2 zX+(Wnwlkt=?mPHLEvSbDPNa%)NN_moS9alk*|ePJXd&k6iV=A?m64wDks}(^PS0Ow?1Ki|ByoO;+9Se2f-@#Tb-dnE*t@7-%cz^AjTp-%1g z<-2}f9X-qDQa>y@7;{KYOSaBy(2V@f{qQi4`!cMi^Cv=I-@<~A>1ZV>A?Y&wX<>7l zHpTwoQG;R0@VVrvKIcwi?RU`R4=0a0;0FafE(81egJzgga{7l}{|gBDUw;roq99_L z3>f|2!Gr&Q3T`AazfzE2Tz}zZkK}a$pGSg`>&Gl|JxQ(-bxqa$&QnC!755B0ce}X0 z48+p~I&FV%KGd(ALMoi!?)5x+3<>{?!yp?_P&@I(;gsc_wchEeEiYt`m60ERtr2K= z-}ykvNfyXx2Y)c|Dn*LdRcq>3AIXCYFgaNr$(jVxA`eXr9+Gn6`L3*c9eL_F4hi&% zrK-W6>{?*~=Zm?LAQ0YZPp@;O{De9!lydQ3LV>m0Z4j7(voA2Xrx z2}$9kQMo8~y;0Zpqf{`Y!1zTM%;Bcd;zgqY7VhyD+}BeDr(tNdR6IAGXy{QG$0$ zX~dfzl1ylNrmd06i#fZUKK-jQGIcnX6dB^tsF+q2@OO05%M8luL1qmhJ_njHLk)$%+w?g8CPrZ?zF|z_5CRj#DfsiOvk~d9cK2NcVM_BRUZ4Sw`RzjLOYC!@@uhWbm0L0X~9)1#)w7R7`Ia3 ze-hIFu7NPDKrp>?eEN3suP{@DLWzn}az6k1miWSm{#{A_ha+U1{sq!aQl)*lQ9Rk6 zvWba}PYy?of_k?m(0`EvL+F!ggiEiEm( zTr!f8?-c(YsgrJvHwBik#t`DTXX1o=pt3SU3>{neeRL*M*VOtmvKi+*6*$BNLlV=H zTzyALYCb$HbB8KLY6z38*v?tTmplm$YvMXu!J%34ZB4iKp7n)Z4GMoDUwF8ee3^6< zWkB&q1qRDQPl(}wfOnDXen-5}GOzY$S!WFP>rP@^TtpaE%6R_5h9Us_DTrser5533 zDDhb2)#Yy0DQ;gr%$ug%WuO>P&L-Y2DS8?Lx^{nL1L+L>KHHXyMa)T`I(U>dLU2(b zk2FU>Z)|*=WH}xWzlGm4Gdp8Zx;BHvw44()tyF}9{!2T(YPMX&3zv8g{N$7RuE}jP9rjZ*XW;hd1OS#(orMGQYKW6QrQZ+>V~BRSL2w`OS+c*4jlRigTi5o@sB%qUh@U!Z*&1n$&Gcj8E01A{S$tKDuMQvCJ}GRiYX4VPM6dvC zl_(a}G!Ci%nQF9=K|7eZic{753ju6}6}i5bVbm04tmz6a7$ay;XhnMZ>4%5Qh2_N& z$)_57Nnf!|3|uDZ56MJ7KpMdr8-ZwQ_1?w*?a-|Gd^{RmuEo4A+U0c(@k$j)dPzwr zCx6i$@VnNaR(sl3$CbVA5(C=}`6U8&)X`C?shJ)MT6zMg$$VZC;{L60E47APC5RoHNc zs~%^|5pCWld`NX&6_2!N-YqW+)0!_Q*q=WaWS3@2^H7p8f;rk2tj^OvWQQd-zyN*^ zKcd9DgdWlGY72C<;h$;1(9DA3g<8>_fhHYt=SC$y!kIw0u9$e-t&B%8Ou`7CwdciKUA?RgLsxuXiFlIL+fubvn~yUE-AJyhNgbm@{db>4Kmqy_bbKBxPDKUyVjsrDMy1J8 zVm?u@f_sH*qGFTM1WQM8?SYGE0opsOspA>{T*;z(=``K)x?asDl_k~X{CGQ^gC{>z5InsnejL%914eKW#3C!c!EtH0gie45OIW4WKNLICRvBdw( zGsx#;f4iNSx>(YGy=CnU(IZrO5faOglQ$$#_O7<3mc5GZ;M)X51%W6Rr zwstWlKJI{;BRUkMP{%$A#2yCwmky@s@W z!9i_?58sj=&34Qh-)iwI27iJaEhd_Rg*KwEk6ei^IKR5jivdTKnw4&j4B9AkWMn9t z@BR;xv8}D|>*?9+m?4I|ygX|?N0UG#p^E9nfThbHP3AQ|{KCTQmuEZzQd&t7{IzV_ z-$k5KC$y3K@aa8=5@yiScCk7wIky41<0jRB^(WJ%K-F!F#nBh_qt=%Z(^144o-&C) z*)d#)`Bznf*(B5dqXkgUtmtLr%w-qO!)5R=(c^DW^{yyTs1^N61oa9z19BtQi5=`1nK=9L^Dk(KN|K)GD zx2Rm`jSEwK`JsrJD@uh&STiTArm{`6`(<@zeOB~_t^A@YZSF?~*YrEcGR@-s-$G%$ zT47uxpilPLoSQI>W+E#!e#D4#x1sjRythLYwbEA(vxK8RUfnA3UZn0AtT>`hM0j}Q z$rgaBM?UbVoxTt2Ix;sm+*(M6k|?>l1_q}zl>@Y!pHoq4KHipQAl%Tfu(&POxuZHK zVX54!E?fFjfoxq}4k!s0Tu#Ry(&p9lPJ96YVws#&mp3!_6nyYC3d)kuEbDLao7u$Q zUos;6;9IN`QL#_xc?1_9M5v+<=BBVL=y<&xtrLEVV;bC#EARv7m@`WCO?Lv=nLPGT z+5lh26OhqJPDy@RW)3>@)jcgs-K_+$xv}Ad4ainT{M#lgHq2O}ygur9G zyq`dCy`GzuhC5YPck8=-Wyy*lx&@8DpmBPDZ|^$}`=gZdeF^0PSMr}O$68+VUDC>@ z-77aO2gj|x&6v700I6}!S@};y?(iyYHZqJTSZmoDu+nnP0V@Rls}btJ|BGAVt4o_> z{Ii%9f_~PCjrfP)TM9YnE2ob|v9ivYnAs_Y1YbwCx9yYQC?Sx>-C#o9+brEfxAFvm zG8oi8qCmMxbzG|X9!V30{XoL!6AJ+R?a#!lrVqQYc<|EmB5ECybuJF~f70L7uuT&? zBKxCFl4&Q9@R0urX9~k>uK5Ms_|8|6@i3rrF+T=%{mB2KBT&ibsslGCL+Ew z6|%hJcaYbxBs?;SHWRDxTzOJ^aQk(&F49aL&*lZq6&w>-o0 zznj>2#^a%Prb?NDPt2kyV$LDc!sXP(>Y z**4|iOA8LQw+^o!lzO@0i6XxHZg}Z1XUHM*-;)!t(nH<{s0yF`2OI{18KX=8}PIs`ZMy&G52l{}9$nCClDWJmtC$_b8x z{-lNX5qmTjPS|xx*Xh7;<}ScBG zE>a%u8|SAuWK8$M)4S{>{~7w?t9Mai^6=X69pjXDEp87BCv5xh>Q`MSE)j|HL*{DR zUF+H8zyQeO^biDvXzPc@SXtyX21a6RB3_%Sk6r#P@O>s&Zg_!qzj74MxF z^OZg(Js_v14zsnpGWN7d`cW^avJh1&Txdqaou*qkaX(F{mY5-ra&B!Ab)D*sNsdv` zzu?bj*0sLZ$niFK+1Bxpn#zUhusm8sliEAF7|^Sv=8{@<6-JSS3+SbTs^`b0z;=At znX?ZPfA{8MqtauTo1HoKxID9gc+9JobFSu~8rQ|r8f>;~ZDUw=kTA)IDC~_#n;(6i zKBnU9=jDAf^A=9Qf#ED{x9}*)n1jd9AF~)>j!|&pzA`403vZ~811z{MkAufEBE~cB zF0b|jUL8@X+&d8qo>?zj6?XeiU0KO7v2ltGv^d{FJjhZz?f5koux8n6Cs(nR3m?{` z-{IHg8R}1tzwUcwE05vr6jBLYBfXtpICg6^UQ#>$JX?P~jX)B;kdqwNG_`0oYEl6O zf$^KgSy+se_?SI1k11dr3BBRanws&ay_i83_jQWvZO8&t6e$n$N z@#wpvh|b|&y`d@1fRlUGBComAe!J109`|~+OAwI<&-9Kwp)fst8NMbh6K&qE{&yjm z|62&=)y0qh`NZ>s*v0v|m;o&YMGaj>^mv@?>`P$fEnQH!|0Qnuaw^-l&tqzd-y^NG zW*~~V=U`c2qN-UNfOtiMtMj#4v%Z{&LM<)!CmRnmARwLvYXnhz&7u+SE!ixl9;PB1 z!SIT&iSg!v#b`x9NhcUM4@~4wX#5QR*36-lo2&C z9&gxhtZmBpvT5}yduVK-;G3P+nBnoqFkxPXwWmU|?X>Js~|tCHcEMblnUw>bLxa2Fx4C|iXA#2fb4`5s}1#)rSF9@*hZdT4%i)8f)g zspPI6FM53FU-eZpI$l5dqRDq`bn6M<-*B{aR!Cu3|JYE~3g9(A#{rPJ)v?{D%~${I zwQqzs{^pjnEWU2g>EB3xIV$qTukyO^h5wI<#0SFDTylIMw_%26h(k_*;~lJ0Zty<4 z;|HB_a9#k%&QGS9Wf36##X5t)tkM4b70BMu-t3p}CCwyxN>Mr-pmZVBvk6m)U;jYp zms+~Dj!n6UM6#*5Lp~jIj5v3B*3{Q8&xCKuD%sQQpeGcm9>aedGSSwGLPa3_4S|Z| zz0Mvj^LE$nC9&@Q3dhsr6%+sYGq=wGt&4AEw4Yho8rS0MjicN!p2m!R+k~hCU}bwLEi6tGDuF77Xe? zxWzNQr71 zW$K9D_D}jeD#zGa35euPO{oN=>^FPhZssQ^vtWd+QOk>qm)n$QA5Q8%A|T{2W59nu z|9|*;%c!c_cVAdSSb)F+1OXS_B_N=5!=k%GO1h=HyCg+Aq(K^#ZjkQo?q<<&rvG#H ze$V?ndz`NfKCCh3yytaazkJj>ehQFkN=(a;G-&cp3er~Ip!myFAT9&iIG!94V1XQM zr|2!DtQW>*dp|C({`0}2o}8~`>3g9FIpo~68qo<(i_`JY>*=TW%oZ7m#|$|y$*$KVvcL`IjI;HH%_}0@>e*ucuJo4oC;{G|pl>}Us97p#x`O#u zk0b)217X@$XWy>=|M1m+7`@X-Ur@*on*UGM^s@n==_X zm~F7;xm;Gsw!m9f#yEjA(lt1tm&zsz!-glO%pwvk4TCOjfj5LMytpkRi2zm>&=v$+ zkA;?ty&gNV9XT6N?E}V1hRD}<6l8Q_C?PBnd}&f-l;eAX;*oc=;~#|{b;}qXy(L^) z?h;HZNoE>v9>%dk*fYx`gZy@-{ph2s3X7qw`yQCD{XH=C-m>v(x&2vu4TxaIkX^sL znlbJ>CxDCG@c6SZ`{ZHX`w15EE0B`ga~+bXnvsQotLj<)waP&_VM}b^#`?!`@6ct% zu{5BqU1oC_`^5d5{Hb!gEBYWnZo2NkI!Ss~MN?Dq<;#~fRaI3)bFc2nGV}APah(k7 zpK!4Vx)n>W6@?^&ux-10Xo|0;2YAVbUPsj5HO`wI?zN%Cl94?W^SS$>o@3BYkP`a4 z_PvQy{SFlkZKC9}d4Mk-hHlg8IP9MGZDaA& zaua_t9oh(z1ithG)%T(|`~Hs*+-eP@tjtUZR=37LukJxjD6-Q1gW=?T*Xg;0wJ7nZGIa8v}yj%+|be2JS9CcObAJCVNl4vyZ$ zefviKJJ(Czx6Z78St(an&JpM4j%sFsyzJ$7gd_x;w0hEqGSvj0EO|ZrA}=s-cNda! z$c{i8Or}_waO>0}HAVv?-ass=`_+EkMP6!^i^qqGH~yGx9mJ-nAsbi_#Uak9?yer3 zWA$P=-K@tv=qwh;8#u)OmM>ht0#t&^wx(#c9~V_I+5!FMaB{6_FXtD&IW`JiT8(QO z0s$T0zL19g*kj;B1-mW$bgLQ7+TMlIlm7tqlyvc|0A=CMIJ4$2tw8R6GvN#w5c=*0p)Z z!&&?Ny|*e@s1vX)1yRx002MaMiKZ2Dmod5spyG=thT@X{_1*dJDdeY5L)ww8e*&lE z^Utdbe3BqP6jID}@jg+FxWLQpzKD_`T4{s4Frr%|9?fzAD`Z}^E8CKNa)O|O@rR*s zn*g8OT)N3E#ZDa82xk|bSGy}zQ8m?p0 zX5=1`br2)sg0%+$xEq^i(a11nDUR53$?I{sY_WMUqw$$^D#IhOzeK(`42X*JM=}y- z#}TEla#MiHy4Zrr={M3?s7<>C`Z~`&=Pl1-DnAW-Pd`e;ylsefm$4U>sYyjAAm9S} zrLHG!T3%aAEF4Kpl3`((Tkw3lxL~`yn#ml$xdAobZhIue#+K#yM@6A4v!UJ11G$Bd z*Uyo0aY{>sZXm1-`zIr-psdlActy^@hE?8fuD!mCJpK@S-i(izzoSl$WoVH%=$9!p zqA4gM0j$;wHVLl8t%HAlk6$ zSBn@53f=3T*buO}nYVLz228-f-ky)Saq9l1hnFBAV*2MxDqH=vZ(e55#QN)F zpf4Mu<4Ua~_xOR6k2Cd&K94wCfKk*~5mGesQ_tAauuw{ru|V|0{j2|yt7yCFu>3|FAB0Rl z5AGECEKJ#j5xRq-bX<=ydNtxLD|>CzvdU|*};P;7x(VfLFPDO>j4XDh&VI^Sh{0~FT9#) z0!20;OKxGkg8)Q*Y;<4xb_Z%%YqvW)rsc%n;pj!O+joH*J+Z@-l+hA0X`HRY7kx;L z+TPNVQaS})2)8awEy*E~Uo>kaQWIbfVmL@FH32OCG$!w8$zIeV< zcWkYUS_hJ#0o&&X&9BWYA4LKl`0Jh}-*PP9rR3A}x;_Tiu76Jd*G5fh_LpNeO95Kb z|8bQTtibYh7=Ie4P-$m7Zl9y(U`x$0+Mwg(2dJk0d}d<`xQ833sI?u=^yTtKedmVJ{0kJE~#C< zq4X-7F>1=)s4jC44h$?d6%$Xsev68-lm!>swy>;qvOVGch zCquV)Ps>V`p7~qE+{PWy{)+GJ31R}|l~VP(ZL*`;)i-;gYv?77Dfu&HLH@*d_2v9D zAn5&1A({FcuOypFq@O<X~5*2t@(<@Yh zir=ANg?O@hown=IR|B^jor6Q*d%ZnWGC4ETJ<|YbaNKL8KmY2$aT=8icnW!JTWdv< zb54rV-G+sSE^os}GCYqf7?I)Mnpy{!d8D(uNMl7c0@Z6NXD@;6TZkv;i1FYk3|7Io zpheIa7BNXl33+VZpA>UH7*eN;rQqQw&{JzQT_rY%@ae@TINa##X1c7vIQg6kC=LE- zDOUXta4q{^xRza(3HM)=^ejm566f1jnU_>sj#*9NaY}5o^weqwp%Gy@30xHy8Lg>Asy*+?xpOA+wuTn$(3Ob=y}_%RYJe z@ln8FOo5K+-OsUglP)x~Z8xOlVJIeWse4x|&?HiQNJ=XSat-ihg1!QnDueje1h^0a z&U%YAgu}Wm(O12M^4tb)0R;P5L<8w`BdSQho(nl0lRLN-;BY3a`C;L7Z(>-3sa2PxhJ7)@f%Woa8OwvY5ejw)aa&T8P>xtEj2HH zdJ8$lWxw}Q8z_9jof&*=R@OfmOaM@8vOU(9Wa&9++cY0S|Ea#57ze^VyE#lNLgTSc za%i;pW+m!z5U?8#iav#fMyf1gkO1abUNR|hIk@Xa*Q;YgW8*MtuJ>zyC2H(Troot# zd$*FQ++;HwoA1;#nau+JW}tO4J(=>>Cw^n&Ex?0K3LUma-N|p>HRbgns$VP)Y}5kvNg-b& zN02yMPn)*FM@2JpHTDmJwvrE{@7@lyyDF%w*KcsIM!#=L4Ec%H&lVj9uKq<|dY0$% zK4~2?`Sx*WiaW);V2Sgvj_(~=STX0kg4mGxywBH_k&JgaB~0-n5!)*)r*be!ZJgHl zX4$`ThO_{{7r+)T|Ic9x@@pdn?rm*m(4wG!eIwiG;Rd@R=B}04V2a|-{8W^Ar=FvS zO`XxdC`2A#6A=qzK{N}it3`$g)4SM6-q=khq;(ilv4=+okB0huPEA#OhNnitK1ZF20vcRux4Nt+KXWESNU z;ND<|(-sD6AMjbnv~HHC2OE?-7gm`zI#YkCkFRWg&sRG%*RpnK-{bzdN?DVZ2i!r1 z6H6f6*)iE19PZjTyyNG+0v9YH9>PwMDR>jaMaw{tTgv~N+QPL3g3-QD&2Dem%W1!u+qRBAD- zlM_b)O;onzlpprnaik<-H3jsC4a9suLh4&o9@5tGdo{JAx6C}!d8wX+o{pVGp{>B& zgvR?c$dkA7}+|b zPj(N?J^3M=3O`{S;r67vfmsEut*O-1;%4UNvE-V8>Kd+JPkPT?{R4qxBW!H8)ymZJ zoUw6@kAstIwZO8#k`L=&b&0sW6_Y9r2z8KXLL)6GfUezm?%TQNQ zkq)iy3rgl~pxRaYXEEA?y$Nqs7`Hs7ue-p)x9(zA*5Y>}j4IaFWd&<%-rcX$?Ed@# z3f}MoC}40CTU%m;tA#cj8}jwnQQ_fhcd{iL$jBbwPm1S*cg4Ol9?Pt|6jVqSnAQR5 z4cA8Re1zr_I!@#r9MI?z%OmvtK0q5^y>fKm3%R{-u=r->{ie~DWS_uNeep+-$gSIN zdPCCwp4$SPVQF5rS;CDgZ;{CFyfCHLk?Oycjp9i#E_{A_n z_5+2ps3>9(RJ_Qd{32%EZrfkPMqC_;in_A8qXQc^K~3pwjj(@^PKAxE6U)lMC_QNw z>lKi13~6wAWW&QmALHhE2lxlu2G-lj1ktLmH+}Cj~E$^+W@iU_TGK}Xk0{OTvG^Fy^`wW{?bw%Lhlt7 zYhp0%hH{^4`+ME&D4N$ZDwhqW!Tsa=QNVCQ?YG`t7{-qa6K1y@t0k9;N&jBKBLR;g z?$Lf|rqK9KUNdkmhiIK=-<9)=A;(OPw>%&uq$Rb-t8`UVf8a^3uD-b_!t(LB^>^hTtW@#Bt2JwjUymGU zq5Dy(E}qlY!HIQU0)K%lz)bCIcd`v)rda5G+xv3E^iV(YA>brwq0)vKhg?@oU-)%2 zV;m5xaK#r|4o)}!ToKcw!CTR>{-SB+>n1<^-JL%q{kM&}3Zy_JM2ks@N~0l(ojk3n0j@0U?16G=za+qkf*O~r z?e&cB{_Hr|29GQV@zcCilm4aVnh_LxApnc z@q_o1z{o?e1}%F@pqg##V+%GOP<;V@sz4VeuL#no%`CU2q6$eM1(BBnj5!sHg;i78 zJnlh<8$2~AV^q91rnO5aE`bGQkXy44l>G)9$RBl4tyrxqER^wDfm=B3riFA^SQ?^w z$?YH1uGtmv?>|&bx;1z_^m5cSG-&C@@TvwYC%UYYPKvd%jfSLp*-YQR{k9r?jq(%q zYor_Z{oMO~@c9_bO^df?!7F)td2vz3o>5DF+ku{yOEs**ercqi;m2d%1AkI)KH{h6 zyS195LJ_dWu&nH8JdE1HO`+hp7Ekjv-T&>n{omsjJoxtlI9SH)^alQ)1Nb3Y&;sa! zy&A@(R7HM}puR>QlZtb!^f1|Lpi+Ke-3x(Q@k_o1J)Nwbh!s5zQ~hgZ+Db_jTbb4hqwx zJI||{fF!oM-v{_h$9+Jt%x9N5tk7G~f}oY^$&} zBWn9L;tvv76_eaAcpI}1c+&itxL+uDd*sczVdI&udi2bZfx|tU0NxNQO-%dyGwP<>@^J4CcX4) zdx;fDYT`edS6UkP^;>P=1*&3<&2m$IG~mKh{6L1SV7f!$bWFsp0@O5LCSflChmX(G zRXWU*)J~W(6O!=*wDa!V?-w$Bx>4^igCe@9^7C!xb4P4Sk7iALQK017nt{$WPw_EW zBAwG-NY}$=@urNM*pMtVnl#W~1GOXj;lYrq=$6f^NpkBV|p;cG)DrxL}1_hAuYr(&_S{e43!5939$!y>r0mgIaj>KnDd~nh7H=5F%fANj5t6xjt_!=qMc98(71eC zlhDS|K@_3e`|g>kDrh_xMo)-E{iOqDz+ZpgIA8R%V999bQ%bEgaohjT zsR@W=BL5z`$g+1%|I|(if;7NwGG05M?%zFL#ylq*x*<(w{NcDVYO((~I9}gZodR>J z9gA9dz}(;d&aUn@t@xiKr=Nd-?+l_V=aNM3FS!ZXXOuGPO*svv(eUL7nnf`ON|K2EOhr#t6O*&ci5 z8E2=@t7_$V$lS&?7u4ojT9$Xe;uU(mvIa9=Ek-=$&lwiIBuyd@Xs(d%za)Wgz%-A@ zoxSBH;|qa(o3RU=*TPN56L#A&7((M^_*sGQ5%Qj-y7~dZc{t6`)Lc)lkmBdouuh0w zsa#U5PsQ@D<{u9%x}F!h#eCgk?+qoys8kPK1w?6sLiOzoBj*WIc46N#mF{zq(rX9& zZI`0mA+y68{2(|QlwA+=rGi6U?HW6?&p$GM>f9#AQ@KB}xS)lQ()t1ArS_lP_t5cD z5~_?m3d7Y9;DF5XH$eX^3Bwu&WSNIMWp95fMkDaORC&uCA8tAgU0AMph5yS1+m)wq zEiK{-FqPjs9oP7Au5-L|5uo){wdD~Oj*YC_aQOi`D4DmtjeNOR(3&F=&H1#QdQxOP zHde_yZB@7{6dH}wjn(wEwKnh!vYvf*RsbZv`WK6|)e|FnAz#w6+eiF3W9%a9}D1d!GgfsEkDf2fP0+O_kEPe7g7P zd8nRzIyfky4_6WvMumRX`kXzbYGG}im6F1yQ*a?w6ZC$X>yDVbEtkJ8xzkm84LrT( zDbjJ_Yg`38wEZ2!wsPf!(7XQNOi5VYd>-kBv~O!2gB`_%Jk%4Nxf zX@2A<@^3d}qk9dLsD_+YVB~!+k>7Zb*$It$J}Q4o=`qUC9p{>JcpAM&?8Jt&fqag?IFAh?XnuWZ1J=}ZD6HF>+>r1QCVtwd-In0f zom0PN+r;WC_0P-rdHGU38n@-=XuOfo3oqI@qTeeI%lDVlnBG!cl30^GwQ|Z42Rtvz zs&cPbc)A2^+y$?1-R!M?`Sd#L-T8B;b2*5Mq53Lc+5l(-uwzyRo>edR;y;>t8AV{I z5$A@_D<`O{ND)A;;IX7)Kg`{F#l2KZMrpkmLvZhsD@!izT$0qASaKrSw7I7gc&5Xz>D=9&iMv>+nNWiCq~HKW6pn&gY#=@IYzHrpY=G472ZKdP}E~XTb_XE z+P2T9zb@xt?n?{+A|WM)*S|{p)^y~Pnm?&kfGbi?E_2I`sMpi6i%&5*5K6bSWhSyR zTBQ6<1K+{_rPSU+2MGj$#P8Z|^8El?aRwT3TREV3Nhk0|uI?pqS^ntLk{9z|z`nZp)ByEe=l z69mSSm5a8U%(K-9#gVS9HQn1CtCsQ&kdS$N9I@i^d6HFyPQHXMvcan)569^j-OO5C z6jp`p?}r;AuqxXedq=}xR)q%!zOU!Zx$Eou8vYJ3dlZP2_r)OQ?O6Y=iF<}3gGtOg z*zq%$UO-e46&?LHeb+4UC3FU8Z7NTc0K$nQRN790Sd@+gR?e&x(8V^W_vSyQLKYn%#N0P z8?DBSHN@GY*9r}{rV4h`Nqhv6uXn~qc@^;^5Mw`lbmP@b&J~Jo38or88~v(4&%nIl zQHpL+=+k!cnWwO1iwxQWQQin>JWTZbZ*uLw*^wtHKnVCW|HZKWU+1hX3Q>uzdT;l3 zK*i$@+j#T!X!{|eR1|uFN3#QuRC|og1}}oy#L8ME zD(%DXz*s>SkyVxt0UTXU7i`M=Y>>~6U#5iMW209c5oqK%pRB6l2MBpAg%?9ERFqD^ zqrJR;aM2J=%{fGhPI89)2l0 z%|KA@8<#2Ri*6+}*)kO3Mb(T=91TSB+3!uia#8@c_Xpd~h~iPZr&Lr#7F~4mL^qDy z>bvW`u2<;JE(#tSe8tZ&2ddCB_LrBY=@6{vwy`%etVd}UM>;IwKBd+(TgP=>ULN#3 z58qVnyRs3CA=&Kl*zpr8HPpN`G7jufYb`XBu+tAw7*`&XMXGw8OKUG$w404R?7*Wl zc$3prda5cA)7WklJR?N)uI$Q61AnlYp`obQ1efOx?F7miYk@3^F<59PMBsr!N_J?| z^j3kY=XN`_L`6+a5~yXULmq@)vfo;AUW;Ixg!2KZQVR=t61I3PWiTFEW=q z_F>Q{Z7hw1+g(lOf?IO;2QG;HE|mTbE0Cj(9HTv{7qYj}EAZr?$}EZ~?CNhh%CpO$~@z#6!Xl5&^EC)D9@BZkB7K zwU(`FGGrN2Tf3AJ3=Gl`^!;LN9iRrbQhzUz$P-V)b#z>51S^a`KjO^_c@0sQ3If8C zik==cAfTE43l{KYe#C&#ZaLGfI=|WoRchYXsA20;M?sNnvgJ0e)~ErNwc4mUMFOL< zOrXfXxteBobfbY`!~`$D>2%69W5a#7znbGv>^=X)?n7ml2fF&XPrEB~=`YXQD*C*V zl7k@oQLD3-Q%|ch>quCxmp;v13d6Nn4=+q)Mq=@?wnGF5)o1l-hncd7m5GS%o3gaK$&|*_@=LMDPOlt(3%Qb;V zqNTh2@RZvnnW!-mr!S%p0Y;J0B|RhD0+#EU&341+rZne(k-LA()LIl0E-UewKq&Of z=X87`C4UA`D7f~|gygV~JPyY2L)jGr69hh1@9BJpAB~!UA@e_*+RFcqIQ^=s4ejmG zsOi8to=mH3&@I>b^hu>7dwM#AejS~BAGnHP4G#|f2&Z*CTVG(D4BNQUmeROjieO@3 zh*1_3i^5LZZK`Oh7U8_yuMkMs-Iv-z*8@3;% z`^C^TEd_JelH{ zOn72^oE+*Gu72Bw!Q%byVLXptdmabl2=)+o#EGoyCca=Eb!AJ7Fk{Xbo90Db=|VK^ zWKZQ|oc889V8|62?x~>+VvUv_g2(PL_CO>yhf`z#t!b|B7P(2!fh_{xJum+%PWM@D zRmfVA@t1{TS??Y0UL#A(Mqq!}4#T zm}9RJ?_?Z*0A~3W^1|D9Mh>YC!m?WPJtI+?3L32hSOcV1K~Mw8l3Bdzi=J006ubyF zrVf1Q7m=Nzu9S3kC}tt((qrH>&d3A!Z*3PTYfWRr(#v2OzsfR)%ipSgS16ugXu>O7YOkjQ zhm}-gX-z+A!E1&|7N#=aAY9zysuo5_aWS{Z)RbvrI-pubtF3`$YOaA1shj}oLT5<5 z%4UWgo+i1FFGB3#*#=;);lszVTc#i%sbBfDB_RM!WI>Acirm9M3jrvt#MRx!-=;YP zR(g6np|-kZQa=Jwq?f(#y`rOWh7_ZY?bvG@FZ&rEOt>k)+RIBGJo?nwAn#&EQA2JSpMRO8TnbjXuvijIg{pp(+8|i_yoAP}}vHF-A>6Xmb zvvmKx63#jR)>&Oxd;h^@77;Ffn50!5!gnvjSrgMcI&KwdE-KHtPKDjW5n7J*yYg(< zY2U1&e0rmGDNtd7ryu#BCn-=64CG)bfH~?^RR2LEz>(=kyzqVzvppw=NwQNY!rWRG zh+-cm$w-V^knjtL`nl|SK=tx?#&W9X7z?m1A5*X`0O44{C0+@)y@UtmQ!WJwL}q=? z{N;{0Kw&t~GUfy7e^em987WZYqWUs{DEzKrzVHk-69^JbJ*=UmI|Z3R(Q^eQcnZvR z!rMx&h6&9>@Q%K26y}Z(FAn-lY;mu@_{{IJvWznspigrdNT^C0sfq#q+8gRxHVT*w$$Fyt3nd zo;ocDUp&Q>cttL|A|_7^hQsCn5MVf|;}a5xjgx@jWN**PBhy<+;T(_sf#SKjAsFd` zL#Mu^)|f?CzH~}&+Aa7+Pkcv50Ay;bhCVBMjXHvMpI13K;y3v`I0u8w$qZ1vK8vg#>FKLT%dx(`w@C!plDvaZbNC19ZNp>cU%mzetB{6XzZd@*B^iW zC{i{3cG$7RTY+R>?5wPsv7AYEi87}QM8uREoR4Ot*a04c?~V3j@B(>o?#py_ z#V|XFsKC)tRG=qNl&jK3E&5tmOILTxOlWK|SaF|+Gsg;)GMwq7yM={|TP7+OS{f*! zq#wr3=c&<4o&!gfAtgPaa;QR$_k2VR={Oc=4eDOoFCiXjzLk5i(@?D#s*t&qVf?W7 zG^s&idL&Nl@z`Y5gETo3zfN{(oZ#0Id7Yt3!>nXJWl#UJFkb@CAd^ul=TEoOKA~oo z6P_G-zk)3kZEB?{e>r0RLge_79YquMU&AK@2fQ}wfOq~sp!So9EDR=|N~lEq?n(5~ z8QC?Zknpewb%B<0Kp34}1=&9#{_%W$^31%y`kmt&-u4vcfe^YZJu@ONkf<5g35U=D z;$)B=8dUn?{^75{4>f#%uCYQRJ=1+#n-d-gD^zA4FVwT`Qy?k=etouGOH;JFP`hm#gA-q>=_JRCts!y+db;%vdc90%zMc#jgdOJ?KtY9 zoUPC&8<4fVu8WB{Oc`r^xkm4&KUKm+f17izU>>iCHcX$JH~pk~co_fD;=JwcLE;)8F0aqc*|SI3c{v=my$yBzasFy* zI;|3opo1(_4VW7Vr1@D{ftd?f=rp1z7Nq==>n^seyl$A6A|~V*WT?aNQ2gNm2E#L% zGVCkIvp_OkT_&k4e>0K$YZ4W#5G16GiqU66A*+P%-#gdKEO5)roSmh@!u$K_i)t=I zv2Qfg5ZAw(!hB?!c{Ra-Yyhprm>j0BD2s#s$`L2$d~@?PAvwlSAxJD#{8GluFoXqgVC>zeF7i9&Ir&z`6u#15xsR*g3j*Ut2JJ$HLgNCp1LWMtPiy_s7uQGHgE6 zvfbuB2`%es^19*1(eV+YX~C19Z))bVXTa?V zG<>;+6@Cjro7h`zLA<+a=1*Cdj7MtZDcn%x`>WxKrzaRdnRek6M>^O1_h6wU?I5E- z{~ydMpfB(@a6BpLtzTTl$D88bORaqu?j-LpcQQ^iaf6Lkl&Pj{lRWdxYnwZpQ1_Wj z0vEt*&?@q6fHAI$(>jF8^rYZNq)vtto0mtvp$0rnCY3Yw{*jrn{R-eQ+HgoQ-656q z6A|ReXi&X9TbnOQFlT|nx3A=zUsmM?CAIcdfc;FdV}n?d;c<>q>Gzd(`MqpMSJ}_R;)P% zd9KPN>SDmpvY&;t*d{r;Io>_Hh_oZ|J5{v@vo=nzrjNc1BU=u5{9OJ^KIMGXQEg-P zxpf%9-TXWp${rXhA~93$GidmYtb}WA(bfIQZT-Kp0LGVO3*_~dRXJ;FY9vB$CI&|~ z!62bD!`BglzSu-W(onZ?VvxDJJ9ok;a!x{cxE7TfE1~_)usX1K7a)EFuaa7fa6=)% zVA{A|15nskbt@})G?k8ow!+qD6llZm?)5ZcDg~*{zU~rUIc6rN(J&my@7x+Cv3=I0 zT!HeR?;JMs@EV*B(3X8-GZC;=xk7Vr2ndEYuE5YZ=~+AsCZ?f@k1IL`ej|K%v|F_8 z=s6fd`hiZNzYxeU0@)=(r`h=U+Jy_=7Z-7rbt!~)A;yjZ?{EnAW7a3yH{>b_K@H^l zimdWkIYA=e`Nd|BfR}PagIuciexO1C52(C5ACL!fFIZ&d#9wEbq8O@+!dqBcs(9L= z2MB^6(IWUd_B&3_00q%kld4nsr@($`k4K2 zwxI6*ff9{NN2S`v=nr{EW72FLWQUg9T(2H+NAw!SF2;--Js_K|>IhftXRDF# z4-UAGjSjc0nMvfWtEc!i%4r1shG5u%?>wfQD+bhvO6LyE?llKGm$@%DfP^M39nD+> zPh#B4Q`Vr~p}-%Xi)opE1l_7OIFv*K?E-4?X;Cq+#*%_umtyZ`tHu5Ybu)Yru=2p? zQRNZ;lMe>LxnQl*$#-^k(uETdtk3->jq`ck8*_D0Jt39wH7>1d_=RS_-)u^?ri27- z(An8dJJCdeO@#;oq_57^ME-%4`R^p#0Z~>=jO|I=j$ZrRg*ZMbV8}9+D$dMe%QEph zvDbr!h&8!kW7*VSyYUN|(-cnYzsa%nEaOD7P0c$X zj$40z{hGjSZ^Um=-igS|xTqIJkIR&I=;b4hllVDDfsp*n(!#Cfw8mXde15%KG96}V z>a=PPVJ?@pIpQ;{z+TILI?=;z9>eVP(onyk|;`VCJei0_{*y=Cm zB$sZLC%_m3cZvKp)}b}lMMXz_$Hs`Vzl^YLxjlR~J>h$CSo+gr<@s{i<79ul@FOK$ z92lSF9sUBPjlH4aeUG{K@35oP#nh(M&ATlwxkh`)PLI7yWIKESKna2o zG>_<7VtU*-ZePCNN&8-FaCy}{^K|q$RsH0lh?wF|m28j=jIHPo zW{?`gDJv_hcoT_@{uaAFBD=!_ObyIjTtrkD&- zp(2`^xBI`|eHqM5PgfMi$DLsWt4B}t+ItVlrWlgPx_ zvSudIbN7XxF{3E=gkUhVTP-$LQL3wRfYHzpPC@by9)~aLj-I-@>wR-dhm;SiA5sa?#CN_sn%keVRs$XXxBs@-@i1w`fSwGd(4ky zcsVYsPEFDG8>8w{OjKWh-)08B;68yJ%|&HC-rVn6{m%8S*C%WIU4z%UmApZE@NcaA zZ{Ybj=D+_g+-3lO*DI$CB`1bU=oUZwQ^bC!mvg7+8JYGP$-R+Pm?C^QE*ZlNu#t~+Rh}x?ZIWVeM7?bQi1)EFGU|IDc3K`zLR52eT^Tft(P~7glH!fyugON zBo9n;BJXpfN)~4{+4=V8Ofmf3hwNcxtXrmn?IDi&SaBXhvz@RhYK&F)FXI$vDGv1K zYCL8OR#6y-O!vI1KbcI~wB=+i6H^Q3J2O15*a%N7%d5Zf-QJz^TUHJ)TgBA&q#l&S zhx)LijL14YuNR%^#_tfxrXjENLYzdMYtp8g1Xg;l9Okqt|O|39KfJ?;+;T)G2>o&%|=-SvFyI!F} zG+dL>)y0)d=a!81i7pJ~F*lFE`p$^!9Tq4;M8rgC*Pp-p;hKI74O(p=1axh523%`M zHIYO_-gspOi7|dK^o!yPYelh3Amv}4u55tt2U}~s?pxFyHvGicpsBFnCg4z4Q5bTe z9DuDzR2F89XXZ;@7em2P83l>@Gyjx-W%5pkcwwlQO_>7}w-;^2am2>MQ!^x4cuDyg3bo#<0$3?RkWkT}xT^*e&;5%b8{n zly05ue(*Y}xqL9FnTe~I(;$Hkxb!|nCzap-crw|-c`#0_WL@z-BH>O(>t5U4nKX>ryzcHC*Q%T?4|BV?h3a&PjWO>jE zD{?Bm|B{eJ#!7{-#{QnR5k*E`R%tSxpM4xuOvK)?`|HbHT%U+d8?$C9D?H=rpFyUs z;Z97_0y~7N^N7S<8diElAi9N|CXq+i%XM#SM#1|`c2aqgY+~#~VkhQfUq(Wb-(V9t zWu6J}Yk2A-U%_&7f5YjPMNtY8s>OCp;~Qp{zT@GnzzKFPUE7-4Z2RM6giNkWV}q#Y zxUCUEG1=l0b5iGSlMGXAuKr~Ehd}CtMtKBW(MvYOM&-e*Zj^q-G2t;?`V_}un_=M> zQcuLeq-grqsfzk(%`5W$ysA>J$8EU>UOio=e(&nNQ-<%cQ4i#hul`n}CC078Z^~>$ z>-)^LqsMJI?mH#gHHgQ`MMl z9gGGAYTwGbg!cC4IK3Z4Tu>B)Ly&3R6}V7BGP>6~F_k9Mm*}}is{GLz-o@G#CN7U@ z>N~Esv0|5+2}NfRIwxtiQmuyCg);o{ijU_z8HTmY6unYkCE0jP&&<5^CA<5yad@B0 zs%Hy)xXej5uDW%2-0$B8=5BeM&kYdDTP{Q{&5hmR$0Yvixd*mckOM-^smTbkv%Vx)$> zG?L2{Z8Pf5Eu+zFO@r{MQ>%z22R)8+ntf@xk=K1Iy6*vL*uvSaO$2Z2j|J#8pEgwr zO!f$9!b&jKzWw8TjWudrJx`vXNwFy{7chOOBfFsH&-E=kzMxAWtrg_UZoHDR51YBB zc|6qr+3c!^h5ozsQEi>qrFAMUw;X(0TPR{~&c$iJo{Jh|UPIP0Y&VYZcK15LCfvEw z=NZU*$4E@n?YcVHVg2wSe0^P(mR18AYc9OIsuovwvI!V8V)3YPD_$obrmQY8{k zc>-o}I%L&_MXUZy1b~AYoD5>k*;*Ywj~eIAGb&_;k!e@f`CztT{&~sJ^lG(;wxNkq zb$XwrnBTl!@)|`|&6>knW%bM~rm*cmqNYzYNBG6xq841!_o@_04byf2`LB=boFh+p zd`$z$?s;@XyrJA4-OZZ`)my#FiNoWa0}~%f8Rf>5MiT43g65oC!Z*EB3l2^8u5~gw z?)k50DIEv0L1@55!rh}$L0dblr$?(nAc~xwT_()SRUtYni?pG&o1B8;4G`ibBs17} zvZ0d|q@wDSXk`vHG^DSyUTC~|vN6!pJZeQu!@{t)E(@cRG2i7sj+n98Xb#%B^(-nZ zWGVCS9MCcK{x~&)%5WRG3$oSqu`c*o$mfsWTuze@Ja#AhZ4ZB@`?9l5>ol42g?u+| zWs(Wr&;MS8|6g`%PhY_=?s&&OH}2dSUYOFVq}6{sKTimw^T0a$7z+d>8pss24~`25d?40pJ&+* zPN5YuC>?Jse_GENlGTkRv4t>C88LB_@T_~9%&U2px$PGf*sXQEyfSUjO=^}FT)~kc z8gH^p+>xHS+K!u!v+Gy>{JlUff1Tu0dHu!Z&Dn;9y7R-~{(gh>sL}o}x^)s+)%<8| zmW&N#42Z%G*Gh=YeRA$?|I;)Ii;K71xd}V+0bakF9z|9zMx`!bh5p!NvRr44tf1wt zkT^0HY_sHUO4snU)(`y<7vroD5)klcW(&xlp=`ms=_xBi6y!Ny0#R4>x<-g9wZ4^C2w9dExcgYHeQh#Wp5b=<#2UbDM&Edi&^?pod65%`H&9D5R1 zn_&9%R$R##9=Xz-_L2R2<7@p3ptM?jVAc8;wz8^?SamL4v5}F>>A1prxS|v47skbY zDZ@zc$3HN(onJ+-(Kmd+cFlQiE6@7<-x$jcL{4`F1-ptb$*YPHw~*BD8A|Xux3^r? z1k}`28*7*XVa-rt(sl)Ken3vr(MJxh=xLtX!jh(7%N@CRaFO*Ke^o~{;%uy6I^!j6 z+u_%}7`Z1MOdnjdJ-q2*u?D8gyD46$+Sa{|@96@tg{j55o`$`PiKS?rp7);ipE4(` zQkyXXS~M_SX1f?2|NA~Lc00m3vcO63Qm{$aVW+6&T{4f&nc1y6h*RG8Lj2V%(k8ySz4%N8ur9lGrFA{Tsld+ zOARphnK}8jwY8}kYd;1$d=vg~5 z23c|-^l_saA3wGIg)En>tXx(UM9o5y)A4c9a(B;+^^X{yE?FB^hQElgdCi_g_-ouE zq-2xrcy@pGn55LWw9+b5WYE!P1IsQI^+WsX%6a<)>uZ`uCVTym*OtSgNzoTGR}GJ8 z_NeRJsl>K_vU~MzOFuN$;^5C%GF>_RJh3R^nGvA@^70+Ie#)t%d8l*sogLG(U6ab? z%l&8=Ih)*dWDq95uJhY2T@bu!_;vy`8Kyq-@2}9}Ihffm#hecdAKfMiU8I#ImLl zpX#@gl9?di{DuG@;?Kg*;@9;`>{!p4Td;+I+@=f-a5Z8~0a0r%&o{|04=O9n!LV4e z`Pd-j7RmXsH=#*#r%|`M>XE&EK9i}rjx<)x%-lEOQFP!tuAa^GIxbE-{x3PRst}3E z<$NM$>%Sj>fEX#K0DS(_nds1*_BGI)RxSHmI!;jUpx%sAG|h7KI)iF&%yDJAly6kP#jJ|HcKpDwK#J-@n&X>-TVC;gm@lQLgtu z6Ap_yrcN=e8WR%Po7n%73*-aI-XQa_5w6z#_W^;1fjA;#JFM9_Pk2H{SIG0g zSibYW^CYKrk#s!4pRKi8WnzOXw)bu#@JNXMXY#0OfIHs@hS44@INih8M{trCCTC=r z<{8Ro)(m*ILe>zz~85r~-Ay>GS;+%V;e)1vM~`FtT=ETfj9SpyG0WM)32HJ(x# zaukke`|wP__0r9ZhTr5{SI3@3{E$Q>xX`5?5!6IH&J%lH4N6`(FfZrAY&{$_JaTnD z-1O@8Tfp^r^x(APz2H7k2&uTUzdPYR&5{7KNfIsHyJpPA-Am3d&K8$GYcuKs?rh$V zuNhvul}6)2rFlF-UG19Co&=t(txz@23U$&DZ#|~-+^|K5g~*9R#1Bb!S9{nYEH$;h;!|Hk>KtO?7SYu3J&==DL5&b8?Ij%B${4+;Wn3t7ZLHuEw>KK zc)FjD%)-7goCCWSJ>k81*9qQO(4rBag%^8|tnwonBL`%xU2@hVOP$r9lH~38dWurW zXzcwgfF(qpvr{Hwgl+Xb;Iy~*^LMN)q2J7smzy1cy^rj(KY+*GpV;SA^b^UYmSq@z z+TChLEFTmXW_Az7Q=dI5bge&-0}T?IXj^TGT=kfV>wfutPykZwe^$~kl;?nuRy3@C zA{j9mtzCYY0<#d)%R9Jx7;ao-kD}ZbYNPFZQvUTFm3@ZXI~wxkv`*;n|8pX74SUDi zH_%I+8zZ5!8~QnH=pZyain=gdNGuT6&`Swjq1_du5_FFAxG%X9^x(#3 zF->Yu3b}W&2^!AC?cEbGFvMfxyN*X0xYgc&w>-<4w><9-K(#-UA1ykjys}Po>ASgCe`>ifhVD4zf>?;> z;169b+wEx~sA#CG@ z{q~oS117V7Io|aoYS=I0v1#L3-smQZZ^OGDF5Xi-d>04n{kLANEIfP>Q_b1NKLHRD zsNj;$TE_!+c7D7kQ`qI2e`?Xiz>ANdXM&oaG7lj~xHbGhbGoIxb=IXIuTJjf#Vk=w z1kw|Qw|_wCH!ZKC?UqJPg>2~UZLO|-tiEa4!MZm#p|LWtLQ7mjX<9R&BRha^mH6MN z5y*s_GrLgoo%&zMj0*?z0hWS1PQr3xR9wS36My#$DQS!Z7omuvB)tKJh*aog;9MdO zvl_KHWPRTWqsG@Ok`viRzH@1s2R{Ud0{?@e01$;VWtt~HT&!2rktF7$?-Hd(4~QSX zBLiI5y>!0NP=)|SK5$RpPec3ja!GWTpa494`C*cIHw~}vwweg=|M2D-`rA-k@ zTm#tq*)`mS6ytKPCUY=_Nk$T(-4};?hOaJGL*ocgCo{V?vE&QZ8Cqe_nAqY5iWu$D zQBkx|=(<;8&%mLIQI!a;rn-82ew|M>rG;3EYs!%?ikR`?Ho5Fi<0rQ4P`qQ3z@MGJ2`XncmaVrf}KsK)d`H{s9%s-4#=-6nx4$I)QuL zY&zi}cs4Teoo}~S*_)VE0F(Plp=iDK{!;`j$71~(8nM^2v|KDoUO5nvkUwbRMv3Q4 z_OkYTt5#6lc(L9%0CjQu{7lNrX}ZQMy-d6G8U*4q78nm@BXn!jEPgb>tr$RgOsw%9 z@FrXUp$sYMH~nF+QF(q|;rsa1O55_nYYNg1egzcdzaCoh*4+OZ=mK)NzS*sGSYRTD zV+THF!XvfOt8H};1c%tRKC@b{HiZtCf~A_S*My*C`%_Y;)>RicO)wf6JAihOs;2Jq zUZgo2K_T>zxzZw0ef?NR;tw%%)=&DLoVh%5i;gQ!L#j!iWq>pDkWMpa{q2`GtKaf-uB!7l^P8WJ7A|i^0jj7n3Lm3z(S)wHA)~oWG zmKUoLrQo)-8C-arU4;`!acaGho{KzuVdQl{ocC*o{0og#Sn%V}MV=qwH|JdmV09@8 zwc;y=@mZT6ZzKJRmA~kN87u-L&Q?H%lcime9?63G-CezHmVJH2I9H&7#{D239F16DEgNyDZvnV{Dx_9 zfUVaJg+gTu&n5;1PyPgN)2M_Kt5HQk!_>?X1{}SvZ#?3OgM*ABTI9&qLb?7aDP~AF zH`(pQ#E^`$WI__)9Zr~zWm?1AiQUei;dMLB5mS%4P;VFz&F;^LdDpq3h6c)?KQ*(d zfBpmnGe*>ojeWIyxFi^vtE|WNTxI9KBh>E%S3z3cP6o4n|BhnJ=Z#gbgLe?#WWWC= zU?BAc(%#E}M@YQibG<;C+w=bX#pVrKT*O)v19edo)#HxMcq0m|t4yG!J$J`ovSt=F zZ>D-;J8*Hp{b50xJkx3Uwg}30E`NZOh0aKcPi!msA;^tG4Libhc-_t6Kr_7F1Hjk{ ziQcL&rT1Q?X^BJ72K6RJfG6~R`VCY8V4s&?|5UF-fX`0o`MjlMy0+H1BjfG<9(?f|1U zGl1T;z!LH{W18nsJ6zqF%0`^k@k}8|t(p#)!#{6}8>8Er3_f{^kps@3GDgBi1b?Ji znmm10n{kTTwEq!+U*2%MMPS;beu^#j_*f=cwackvF{BR5=Ci$1QVRg#aBWBKnJ>Qf zFRh>K-frFQ8J#)lu2Va%W?)0oj|<+DO7;mZeN-(N|6-fZ$34dfrMk4)-i1t#rmz(# z?ooJ>x3jtW)z1*ICy}qvFSJA`8 z!zX+kziwnrr8+m*xar!MnDl~N)G;}EgX~HI{u9Qc(v}Ls?nUlpuE8!1gT|$!;i(W# z>y>snA)~TJCB9yNGK(-EQhnWuhC5)&YkY~N)G1BiEZxnyu|M#t{_|&69fF%D=*oz2 zfVhzeUBgK`uGD0U{0v{Vw( z{-j=#CXm^CuH z@qLM6`HR}~HyaH8Vs^?J4J;%4J3FH_Z4m-%R2PAXYVEz;T@8)OqcZi1J{#RsKL`i% z|B?)99*}FW?siGb{NFU$a~`M{=$vMfn>OooJW>dIB>#Tt!QZ8BK6d3-fzC>f>9jMJ z6$6Kb@XHu$eP)JIx;&r%<#@n=?Kuc|-R)1Dc&R2H*k9@Kp873^=};;pPi_k1>Qy5k<{S|0ec?Dv#dE){yb z{|TK4nET0S@`a0&Og*eXoqcA0wSqha>Dp1>{m@!c)@ELLSXaS!c`ZYsU_{o|GOC*S zGWPabazI9H)#J!y67=dV)=Q~3p9357Ti0JJ{1goX=Og}}FO0}la^8L)qf_I)R(a3w zMjdfM?x2bB@iJ>Ji#BHl(k&xdF(VYrh#;=jHn-i1F;7rUr?{kwwuQo$=ZRLa3GP^G z;d5aYwBSv#;^s=T1D0?J5?kK?I8=ws4larx`oHIR~0B=3dA*Uumfyx%;cAym{61HiU2(*MHvZ{ZVF&E8Ehq+7FA)ED{_|MUr%~(Zx&@1 z9P{n)pxM76Q#Ul;C?K2DSH@KxB8khG*Jf5nl~*iTjb<+QXiqrtR9;@T!fsB1tLklV zPccM49euv~PlN#nrTZBIS#_<6s{ik5=>Pd!RX8ND&vG%$*Qe??CFGlYL!Sh*DBd)e z5e0ZQb867^0#kA0O$Reo?ka5eXC~f6qvp&fSlqLU7F;6>gIkxq zwNfJcg^T`K2W?%!>-udb3ga#-nB-c8)6i#S6_q@~HXW~q6X%l;X~qRN`%q469M{F9k3Z=E|3AK z27^j1qGi7_{b&4Y1(%RVDugfGxg5QbR$Sh+d0=aN?j}E8@L|SaMMR5F2HfYd^GHG` zl1DR)GRF*7BFop$Lg+u7o3A!BlBPbTr3*)VP>hsIa%a}Dv39Z(MEv|`;y4ExN^5zpnU~0-@U@8k;^}xF38K{&+>g( zw;E;QxNB`$7qx_loemM4B__>*JC0&v60|w$*3O)d9IjdXUt6Ti#^ z!if=%{c+#&K0Nl|Xq2~=g6lTGsJ_bF9v(-+_(|0l2u%K1wAqWEg1_8CgRe|gQlU+1 zH!B{Af~x*?xc{drh$?wR<4(zh8}F*lC@ufyQB8CC#+&s&)7gaJ%5eUIWJX5XoByC~ zAs^~JEz~P|T6|+V-ZNHOG9!#9z}Fe1*VA^OW`H~zHXw*B*()-4>Arh#wl%}HUfVG8 zr{Vq{hR|ajC^f`XFl9flza4D3(zGbO4E=?N-S;&U#j$}i_wdloaniK;%As}#215o| z9uiL>gT|dPs_*VD!(Dvd#um0bz%|SX?mD3~i}gM2D1FiCRbbIlH90y6cZkmi?Tr97 z5-oKOZdQKrsAImJ3-o)rE$+jZq=T)-C0?h%h~UlAd5?y%X=yIk)T);Uf@S}wW}M#O zz+m!LJ^qH1R@@XfadzF@)5>%O1_ISj@fxL zH$R8j&$2Gh8wdIc0;|Cx>aGn4?s)DLU8rY*9inu`!_$nUoKuYb{%8g&u7|#999D9A zunIrCL?QOx7mkdI^6NXAi?dcWS$ARBEw4Q2cUN1QPnxS;O<%A!!MNHH=;gcNm%D*K zgk>0q*qLA$rsLxeo6S8f1IeM}(@roUE5HF;nCx$K%w*j1;xSrSey|2crfAZ3N=5DJ zetZ2AH>U7~X>rGL&ElN1$w}h%a&`D%e{AoCiGY5v`3t)sYo>({b{-<2jOZ4%~Gx)UM5L3SIVJa-{K*7 z$gXmG{6vO|IJIDRFjYMS_A#z9Mz>h5i9=RD`w|E+gANgHBs$R>C%g^p`8&VnI{ege(+m`qHTroL3957#`C=q9<_f52u=(C%J&u5> zR@LR7Gx}^`w1XArO0F)>osyB!1qXk>ly-EmrrvQ4C|R_BI%wEFB4Q@6f-4MV3Bp3Q zU0$OY)NM>5fB%c-0*xdK?NixnZmy`^%}?sJ``KD7vtu6rp~S~WccStfvzblR{My=KvBZ55DM;wuXDv``0?97XYtjklV29Y znc8sRR%T!`vpE_?3eL94ewP+%LP*XN1$4H3<)owAqs8Kb&TiKM}}V--`mP zte35^KhZ)|5Bk^0W&q1i`1|5oMqE6p=C*sgy1A8&%co~jbCJ${zhocqpOQ<@zVC?% zHCQ&(ug0y`===-sqyNJD=sl0m)30*DarLrhJ4D2-r+eqSfxxFWwbjrjbH zAyiX;@2OJ@{f_#?wYmo9-JX~z^Yad`YwT;fG{Z9sHu~(3_0Hm~H`qfnbGfAlKcWa% zZ+m+LAZEOI-bxW3F+7fW!XA|U1|HEK4eSoh@AU93dEOXtC3FZ$JG0;7X_b~8>%pse zN>eC}gElrcjvvutp~K6Mmra5|^QZYpNUu_?xC@w&Bk_+qg-6 zsE?L$_khDP3xSO`cvT73Wv2@%@>eA?cr!qR>O1sukk0jrV^vepWQ`(HDe5IBC=878&6IU@T&eN4>#@16| zVtBYM4CQa>_+h<8Xfv^{MLr4SXi6|4yd1xa$fv$p?K<6P9cSXiYI#Qa3V`di=^s2n z_-ES{d~a7@>#EM-u%=qgF7}Ab^$>CH&pUCZr{nj5p>!{+SlFR!eimk50L4Rgd3kvZ z@WGDDDYbqSjlER)G?1JpaT)0e+Uz1Gtg%oSvgcD?hsK7 zp(%6(6#@c+?d8spF}d7o@LZsHi%m1@E|1+MWRbXF>R!gp5_BLimzZLuq=f!4L=r7N zLHZ>ZOWI8Ra9ILQ96Gf?ijUB$un~w||6`s;Myq+50#&^>`UuPoBLVz?4xCC?Rxiv=f;&| z>U-tdWO^2k_&`xC?8rdT9;{ErwKpiAB|f4N5asuZ72H(!&n$7OKE*e;rSN8Hj@L}O z9l9t_Un#HaUe`;XRTgFz#gA(i{Fjj!q8}sEHAk)%|L0q;>W7TP@EH%)NffqXL1UZu zbGDwYx`YVRJzrQjqNjI(_nV7kb;y7A6a0j|#a&HJ7b=gj4TF5C-g{b0#sa$+_LFWqi9_p9nGhn^V-0kZ*Ha%RkB2{}^s|b1l*pC;sDX zMh&NpQ`xwKmJ=O&K<-z+LE4SNbzHO~msPdnx*hgfi(!0mBSo!zfm-?1`s?@=C$Kij zF0;{%?GiQV?4-Bs+G$W5#cZu2zIGQ8(PXIkt%)*x&1DOkWMFe!vYLfH>a-oJ+&2&o z8f#3fFt*Ekg|0QQq!g^AZ1+JKbK5;$u3fIvRsN!emY7y&9YS6yt{2LmF%#3Sgs>tP z&>)*}KP))yLt!_QMdW@BjGJ~aP@xI`PM#3DQ9pv+WcPqk0dhj%-$`JK?eZ*wS~Wt* zf(2a?*J_+@w-6VMU)^$k%1SF%Z(evfZB9{cA||86&&_e$xA6-kk2h^q4*2<4O5Y)c z9_ntoI-_ksEX!F%6DBTFoYG8J!YpYmo%0YnXj-4S?)N~jjs{PH^Xv1zrY;)j?!-q( zw#O=bAEP8tbVb(@hTLm)=dR@nJi&W2Zpe(=o^@JV5l-mnotb&)5mo!*cd}i?bH{&< z)^N=2e-NaH@v9ODC!~L<+0Q3#XLO+^yUKWoTi^6}Te^Q_U3hd8Sy)WViww zo$?R;Zcw`UEUap5oNpdc6)F`N7+hkisJv|`vojDdUS*XU%eKA}rRBP&Mlx+x!C*n4 z&0jgXSa`+6%>30Nx7l#?l!pF4sR^|A-U^W6#Cy%x0QB#0!hvBs(*>!5&mNc8>dX>| zjU@UIOPb|*)5Gz?8s6-tXYNew^Af?t=VKf^_Z00~)EXl8QJ73hPC?Y&nW?*nVm5lJ zw0bOGK|}~MnM^WrvrE9SzFsdT_gx+(RSCNC&248kseLHi4+(OuDMHdgQ^|id8rq+uRF(yjvZ^ZA+Q6A zilPw0X^G6#M`rNtne{GIaM}wMcLdeA5PfS}J6_qKS8z`C6O<>iL(zwA%-+!3jlmQ_ zDNp}ZP&kw2+<(#6;y~mi=r|*w3UI1pXz$=Rw)b+hFT4-AVn^_;!^~xpEoguk(-~a2 z@)nuK8t?RQ`Yj@_3xC^GCO3&$3c3n%TCRtz7(TnpOCJzjM0qSNXhw;};hGinR zD;Eyc<2_ToBiTE>kyBARe6{ypNn2OH-|jV+`CgE3ohXd-@n5WNTsOgj5~5xw+69`m ze(Sq#LQx5kmd9MKk-7Mc5;pMBkz_e%2EDcd^DcX0+xd+Zn}3!ofzMlMC2~x?u2~xm zTQ2?qu&DmxP>(#rPZt~sS!euqjI&<7u48+wQPM0FO7N2ETQ;9$w7NwA58PCzUrvt> z+_oKx*^D6>sru6Z==-tt2UZMV&m_-#7<->=!3x~B8zo00oRI`w9@z=i-DErxrvjQn zz~-%OqpK7_?lKP#Crb5@`k;Cv_J^ZJ$N>A&e&z4HC&0_YCj|{s*`AA%Et!Cl|Hq|GNJ~ zxspTCS&0s;yWy*B&$k=uZkD9a{4q5dM0Gb;13FH!h_T) z0K}^=q|JA>19$qa^z99h+O<#EA6*gqC4-f!^pC>Bf*pBnuX6IL31o={i!l?$WGh0Q4z@*nSoqjW_=g)ew_g{ zz;|?f94LTJ7ln<3;7)HWUCUD1pl}J%^v=pKdY&h(Ss{Te@KB@n2Z_a@rQr#lWP{x+ zPfEB?xarJJxn^T-ZtixI^&r1NOT7oogPV0 zb2xa-UHvQ@!{A~S*$lR#S#@EK3h&Sn=hRcO7QuQEhat;+J-r5O?t*>%=5<{01KL*| zi3)MyrFE$E&OEYJqpoc?`;UT|%sF%wxmj%;wfG=XyqFYKu`BrDA#cFPk9frUq8<+X z!5+Nm*yw=GO)@8&DJ`SJESP(~yB}RKv`StAmovI+?R8@fpu&{7*``r2*}C9-(y93C zBO{jZ{i#%E5EgnQ(EsId%c|{uRPmeh1w%$pA}OX8wC$_kkO$P^A^n~|0Q{gR7;rI@0ja`V*Kp1# zKuuuq-*FjO$isr{uD-GBw^U3C(Gtp=8CZ&iStaDqU!!)s@hnF-D;^7Yiin5tcpC}U z|GEOGVCAl~KT&^~B6| zdMy~w<4*rc3)}C2PwvUT-k~$zsiyI?ChMQapmX}~uy5A=UmD*b4T$ocThV91gaKb7 z6o~=7K5kqea>$_ei84jqrr8g9Ok&W8Lixq@2c;2y`sXIDee%3KTmHf|G!j9Pj9+uv ztd4_n!hK09a7mym0?7(qhs*Rt$-~=Gg;67AlX#!Kyn}Zg?Q;l$a}Nwr1uo57!v04qk8e$O1i1!Vr#zuVwZCZbmGPo%pN1Q`HxP^owG-6;=@6z{lu@(Xb$k7h6s5S(!|tuzhnrDkVsB5Z41DKWBca=HY7LPz%ej* zB58-?{Ue`U-{Pu8zekbYuWsoMf~)$OebeI{164jv?==J}SP$=yfG|ZBbcsURn(h5b zU-vmMP4shSC!w0H!O$J7zDY@BrSi-Y5qUfHixoA-}DDAQd;F7HhD5q}I?@qB}{ zxsTw7kv`69m8+Y+w=jQzV?9T)urNej(>Z0KN>`n+!r7pfQaeCHIGpdYJ?2Ks9;5uF zg1!CjxOd9wu#JY$ptV`imY@HEp=l^wWWwW;d&hucCD{lbS(B7R`F^i;k9V7&F{|J-9IFamg<(dSm#0q;Z($$KNg4$s#nC4u;r}U$1nZ1rE&;)IGi%$(7j)EVdnG+m9NA42c0k zg?#wp9Qe8As(W@uOvYntXQ&d|uRe1tp)ADL9~=7lwxf_8_YRNS6Sy1$mChq*A2mOc zlMjU@ow8sW0{72Og*=q`t(CBfc(KsKDNr9o3_`w~H2oSQ22C91^$9{UX;c6|kA;j@ ztkc1Uks@f@ZQ~QOgMyErgwg{zl-|Fu-AQNUy1@{o>!QEt>Ly6sRTFBDAV zdX9u+XtU-Njjuw%#PXqUhUC7rZ?|8cD*W)sTGhV@0V9rMg#k9gv@Q0U8$xO8nS0QP zM-AuOeCI_WR$edo<8T>^g$Xb?EPXyH@Ui^()m+0a1;*)z>UgmYOg!dx!6Jj^FAsIf z_{78lF)>27`KexTdhMBJY7%gs&11qr@+kLiUQ6qNxYNy+bL@7PFJ#-~SEE>7;{1gOWr7l=zlx#m*T(kDD-j4PQ|luCO+@=O|wvu*B)ivY>F_ z5V)N}V%+x~1`N;B?gnUNGN9S+52IUb+fz87TxZB|P>7y7D>vCXp6Y)<*8BWqRp~;C zk_4|ijRK)Nfm|^0wiT|^0II@#N(}2N(@;!Z#J#mB9;~doeY6e8O}*TM$fA1tf3g5# zLtZy3UxQ43JYEi*dAN)}QU)F-O9Ii)n!sENe2!RDpHy&LBrb~T8So+X%#w^m3(SPO%E8`0THXX8+gtIef)hOxGG`tzyW&Z=NKUY(F(n2) zh44H9R#&d9mFAF7T@OLhkb=!|XU`oMV6JDVX%(W?ufr_NGzp<{&YJ>$YlS=|p4!ru z%#BI43g0Rc7zbLCe7W4#$KszFrp(4%nbz718JcB$DNw~@pdA^+Ng%rb%EBGe-IdW; zbS`tUh)^6|VjS7H2D{%)+XF`y?eu^gK+@rxB;Hd=MHEn>9G`lCkTlg1Yl_hV*8=GaKm3;}l-L~=^)f$RY`SD8K59bt z`#rOby5csHr5Js-nf+h_3*&Q6(AT8XR#YmiX4Q6!schuuihLmQ4U%FESFuc(Qbm>r zaz=U7NX^Vda=%URh_k)khemp82Lp0OfvVdT987|UCjft_|5z(alpfU=c;pDzI|53t zj%>g0EvDHCzqV9w$3OK=5!;19|EOv%rLf9lLqtGPQp$EA=Bdb~F~+Tc!5}pTm27RhZ~Q!182>Vajgly zu7w!|ZD!R>^fCDK(ei0y&E#CG?w*pIKCvaTygt}X8^Me~`NbR=BijN4EZqk?=7K$u zYir1&c{4_lGXk$(1g6fGhM5|%^^PdpR8$fzB_=%7^$}>wEU`%v5pvBM?f5)a>7^f3 z#;!X`q3Deg{fDGbHS?88f&YsCiWh(Gm(eeBKzf0|V{suG9(u@Nk(AsYj&P!eg()LT zBRHZlf-^KXK1A!&ssQIHo!G5pE<*2K+=weZH-j;MhAMXQOk3PZUgdVr$ zkzd8W*vXqF?;OT`Av>Aj<}Weh*v_m*u|&Mv7Y^?cTPYuKpiXrqVA-ZYN1AgLksRGd z##~o7ejmh+7l!6-oywCl@?8SlZoKuz5mq_*X6H!`YWJj?LF3wh(+bV44sKh)-Mq71 zi{gnxhadBcKALt;Y84r6^Ktu{cf!`fHsK3(M5nHa;JYIP%R#Y?-06q4tp94}2o8g+i_U zk@?8vy)p|rDnj>Es`rtsPoTW`ry|pgZ|n5eUlEyHEFIy->c84WtdY?}qQ!Damnr zBxvrz!TDzV&5;48^&)|S*-mf|$}0GyyIE(_&+9r)J%b|LE@3|uLD55tqH3Q5H_h8t zAgIODqjD2)OQGrXrBQpicb?Nj9q)=|pl^l8E3)3ooh0R70pRm*i1FsRez({9-!}uF zs#9=HT!}qsC5){7AfwjHi2y!u{TJ03d1KZ1i6CNR2X@e6h7?;6u^e5)uB8?)-j z1{V!jw!Vp(eqnV$w7rfUxaf)&^cyX*T{%em8S9!j4Fh_Zoq&jTQ=8@KTgGXKYp|T8 zcqz`MR{jFu6f=P@D%_tSNx$D!0%2g{l@Sm_xX49RkBID(TXH1SGcz{#;o{QCHbN-~ zz*!yEi0~n&1Aj$h2@+Eka;F5IueVMvTXRt^lde}hhb1-)DaLf~{-Bt&1=wXKMWKB8 zYv3LtzCZ;J-8l5;1V`@*9H2<{h)1lxG0#UWnhsQogX`h&i}_N>MXP&$!bF+#mlHMw zOKE*&;XHIQ;kZ*)BjUE#omPT#^r!%&a_b^`q1dC0_O3W}KCJ9YslrP=HOWj~UKGqb zk9Z8@NW$$4j3{rnJ8wR&%xc`y;?WqeYr{Zmk#|II?n5gN+rA|Q%8tmzMz z=ls{m;xIdo4KZkO43PJ$6SlURagG0*X)BQ%4%lULf5G(-HE3{j+Xe?~C{}EdAr)RN z8L|wcQE0y>bZ_C&GB{E|8lRcgcvvxMX0|iha)eBE`NmA}As?UIXMC9nt<1u6?HOZ) zw6ieN3)|;ESh4v)PhQ;;A2E@kX35?zSk@^LZRGeg5rPJ|Jfgpv6kfRNn>Vy_rS8#> z{0ky%{&G)^nnJ_>`UK#hLf|Q>`?ekKg0_H9A_<+jEl&7v*Oy!SQoP37^$4i)@cBwl4~$`%0Txyx;ytLkx{ zO|_Bb)#bV#MMXts?oXddD_t=me9@p8qqmZ$F(I_NC-u-*_=TgG zy|g)xembv=t(6lewChN!xKi%-EncoAeRu`)?hXS(JXbL3?KUYB@^c#G*-zzmPv#)d zV0+)fpUjN;3FCf?Toc*r=#?n&icE$@i=4$7_w6JbsI=zf8GuiSA@e@nRIIO;eiJQ1 zOd{kXi*PrAx9V)bg6*s4E4PLTU;_i2C;;O6I&KETZJB-Z<&BCuOvwZ`LY$3;My5i) zjWu8$#$SSh#FI&<`mw|*m{*#j*095W`-X}$Ut#@DfWMT{-_s zS@r`?@ICfYSAoy%R$4h+XbEmk{6YFikrNoLEOneK5>~rEu$7t`Yn{wGey2}?zci+_ zOT(KK0hFey&8sk9gIRd_%a>@-t_H`3AZFizKQ1U9S2sJ});?<+HeV^_5aE#})x-jM zBwdAKrOoHf!t2--&$9Zj{ErGIlropDkcPZ8JF*C(>#^YnQ#k8;b&^Jw%QNQp#zke_ zT55E3v)FMZuUJ`k4V%4Jz7CI!BpL5207h7ou>U<2%ovbEfx9U?_3uw)8(e-L?BUj8 zs(o!BLnIiy{k5v26*^wQw(YgLrC04`-sx?-){Vi&4| zjHxeMN$%XD{hC6b7FY`^``lk zx8nSK%eLFvb<0N4j~38)TQmbgf=HFk8-EeVN!E)kB{My*h;jRxX>==ZcOFG{_X7+} zt|OQU%VsUCGn6auj}Rpxk%Ty5?%km<2I7rl-3E%6WNCp*P<5<+?E|ldPrD#u&ZP{e z0hk|^GzkP{wN#~}jToU!p7=3ypO{cm{^_0fE6|6UfGN9nmA9L$VNpdc=VBZ3C{uxO;Df z=)j`t;&G^tg`i&Rl@FsdXPIdA?>Fu8_YG(blldB`}uW+K7c=*J>@&` zPpRGOe1f3`nd-gbAGQ=}N+tuADbS^s_i%lu!rVNs(^mHh)5X=K-eoS31g(2eqIA`X zY7bDpUJqy&nWKIa-13;QrDk;z<5KZ{;L~~9otRu-4r2D+t&CNel3BRu)=14vB@el? zqxu$_H>DkA7A|3uk)ABX6_x%8UuKG9a8owU_&uNb$^8Nz=uPnrF{505p#e&GV2PQL4L8mCxC`KQXRw-h zl8C5Dp&8koBNg5YNm+vw!=g|WnnFj3r58#x7(?=mTOkst3kXo@D%^(z=7V+I@e4B_ zGJ62X0zb%@@p@1=c+4)MbvUir#;=@}VKH>}ycRCDpC7JlDKAlZlXr1!@~#{NS?v*G zlQWAYR`%>a)2w@A6gk$hXFopjnpU(Hi|MpkQDO47+P=tTgdbOTB@q@KS0~-U=O|6c zx||IdlDr}DJW0f8tK~{~%-!+hEING)tbpL&Cc8}}_|TFuz&C3fx0>}~v`GcMM8ZEm z`w`aZgC?wiqG<;=V|NTX9ykY_TeOYQRIrovlKu8kQC>@zIyJ^raLGp@|jGyI^g_?wxVX>bAchz6qDNc&Rr&pq$KGgb}D zU2CxW>O_Vc?goByDI_O~ncLl_N`<(i!x%eZ1oTOpjG_)-r>n0kJss?%6ehsiSBRlamGXK36_HI!q{n#F{=Wkd<>)(Z zn0M_I4)+URAtp`qCuAZiL=s7N$v zOz!SVadH31#4DPKj_1#?$T_PuKmt;DYHYd$aI-*-$ui241tFxnr)Ox2IswM+fo7>K z;L(MN+|U4>D9zV1T&VXTP4|TlLTNt`X4vriNH1OwPp|*zCd*>8{eWZ;f|F4e=Hp7T z4QjJ=Ol5(HJtTVt+d8NQSl50rUevR*@+78D%;mUlbM{gderKn_sQe?Wtc;0wc#?Bu z+>B8y7a3Jn#Ky2ZHrix;YM)x&->uqEEo#rAjVN$!k=2)zK`_bs1rfkkaOOd{sAuH* zPTn!29bz%XPFho;2zv^DF$i&b4>=BHB=wJt8V)F0FZFj>_%ghU*7VNZMhfFRP0LKe zx3-DC)o+J?#pnln-F+tnf}5adCK+#WCM`rxrJC?x0=U)(uHfUD%ROW02U>wa4l!7mfd}dv z_2KZIFU`V8QSmgP7_bWu`+hXfdsAw8eIIByCz+X|H{S|F#kQyO$aCLB{h_7Uv4T51 zS<#jBp^{V8J5_yV{N_vc_FdP*OSYvU18hJ=x(70~&wb_KIDNN?_gM#79AP#0n4IGF z%uv>bs^A+jK=77@&})YxR95Qy@(u|iOp(tx`ZQwY8v=jE$>1n`XGOrBGJ7GKV*|%_ ze_!K_)N;ND3Rz>3*iHT8@^9DOMUvuBF`rjd!8{rsZY&mxQ4uH$n|dWKESv_soA3;D z_5DPd?wr5`$CbPNf!_<^2cDbN?E>&acuxBxBpnmfR&@h3&bgCA%3CDky1WtxH7gvm zgQqr0Z7Q%jkU-S)`sp6+Is0vo)n(;1x*kKWF2~S zKIiR81X-uQn@c+F15!gE`!S4`8R5?@GOOvG`{ZzT6;&@H)iuwcz+aRsEc|JY}y&%9UiWr6#Q8- zBqk*`__l#_7It)Y*_Cncq^&HAnw`Gg^3+vwj{8Z+tQ1LddG4oog|$gAMEwp!U6E)t zaq*bW*-#IH)#TM78F<ghBkWH-$&VihzXFc@u2+e1Y0B$$=ra%pDwPL#Y}hs)gumU_#9_-8+Rh zY^pLFFZhhY>Tq?D!u-G3ddsM&-mq^}5v7y{1qP6kE~%lB4rvsSlJ4&A?rxAy>6T8Z zp*seK7<%X)IP-tj`<}JV@%g;J%v!VeeP7ovy_2&(^v>A;1fgS*6LD^PL$aLxI1UC| zcwg(|5VdqBrY5D}amHOHVn{zFGugM4WJ`eqtDhf(NAvq}LUlbi&D9WoZ{Md_VQLD| z$7$}yKH}#gHDIAVTh|5x2Z7wK=6aDLax9co?Fqn-%kM8)gt)lSL!a(geaNro5SdKm z{0V#8v53fyKmRSe#@D+;H=!c9)xkj_473_THZCSV!kL#|j*;Y3m}YAP3-!3PLOb8zu=G69yOP(E1McUyz@?^IU1s;eS|t(cT+)4!7L-&5M`EZ+Bzj zPX&MGsMpUz*-17d`fAk~YbDWBn|@fC3FW2-cddKQOS?8|$gjn^TR8ok$2_FKCr!#7 zZ6+6pScOD0Ouy-RIK9B@@&rwCs4_~JSRm4vJztmwJo$Wx@K8}s)gt|eNWEXmp5C4?mb#aX}jYLL-_sw^N*4jV#;C{CGqTq2} z=Ndc}|AkW}>3C%)m7Z^3^VAR9M$rk5kq@({pwLH+4pW20KYE9u0MpVl`T-qck`fZk z5+CYP$ro}Hh1A_O^&+qC%2P>yCsG}6NUwKZzumCB)-Wi0@IdHSZ@o+N^LwYO7DJ-Lh{JE5TP0Uel#XTfgO3Oj)3@n`Bm*0RLq1)i+>z0Qi?BV(L;$@^k>>te2 z>41XXJdQ4pH-=PwZqJFi5{__dHJvVTDt=e03}pIPfirV_+f~T|k)fXm*XIJL%l}@B zpvB|lEhXLbWRBQSvK@^eKUUu>INhH|?h%%bXoOG_;J(LRSZGR>3+R^RPGx|G)U)P_ zGf7ZHd}9kc8_p!F`wZ#0}`f#-Zj6= za?-L2x|-R-NAr_kI}ox;==8IILnHYn-tYws7530an+hz-XwJW6iZp{_UdG{N+sSyBg^T} zIo}9tZUNsVMYWmWe=&3sE=iFmF@)M4hg@otO$aIE0p3szY#nbyNdGI9SYT-dOJ90w zj)bpkNgYM%IqzlnL#@vtCV_GIjp;Ryt@hxO>O`3kfy5OHbqT4>j3{w%Rzb4{-hn1A zCXw~spdwf)^8aY+y|}y&@8m`r{x7SOIyMU;&k8TQ4PE%p&hDN$72b>B8wZDm-0PCQ zHnUov_7UxND^OhX8QjScWIMYUkR45Kl^RB~+HWHKVN;Sv?a(v_6@^hyiCK{Tq8KFa z{=|OPCEBp28bhAzTWOnzf&_P3;omn2kBNRlp-UbvM?d5dRkRIZr}iiV$-`pJ1d6TX z)kRNZ&eu1d6C;(mKKePzLA`2`MXBtFhW`WJN}H+vfwW!K3&^4ZcRQ-p`0tF#J5y zHs8OKR9=1^E@Z``r&u*}ymiD+eDhi%;~ndvP~nOet5!v*kS@8QwVqV7{km1EAbf7B zJ$nhfa8&ypW%n9k1lhdYpTQIqb08Hy3s>CO9!_M*E||C4vbG{m-3jX+{+<(K1+C+~ zk1v2?kq^n-xXu_`2Nqp<{Q1W{jE(dpj*#d+&HgZ`_=iXQ8I6mInKm$^2NJiDr88?c zP-`697!}?Vn>YpVeq4JOjD)K1s{G;UbPD)*egIU^CGK0CUE{Y`$}6pTLBn#tb~8Yc zhSVJ;KfX2N3l3;I>AnGEoq#+BQUN%a-?TgY)P2qjR~fqUgD8)J=H@kGb3oidQ-6y+ z5kH!W9R8L&<>Y%nOlt1k%kb~Iss?F`x8nGfD}@I-A_@f2jXcUy`T6lZFKJ?y8oaU4 zY$;`C9pc14k$(qt!mpk~dY*I%dd*ENB8vO%oRAARWi3S=7_Q0OUtkHJ(Fdt6@%6^= z`U%`$a+3Pq2j|kW%khW%7nhVIy(sHymJ9!mN$M+n!h6jYLieLzPSKZ~KpkXg;Ds*` z!GsaBh{nv(tTbm2_Qs-22vW*o$#O?ipXkav+QzBTyyXycPdyO~dUYclG&3O_9WyUE zrW!;;IAW)}M*3TJ(E$?J6~fGaQ-Pz;`+Nv%ml4ffP?i@>>+#n$Qg+w&Wr=*v4SV=o zBAq7YeNqCJ7|s5HpJ=w{k0n$V#O_V~-Q(I5OnEkensa-U8utbB#8l56vl@PG%CL+r zB1F;2Fg{mFvH}Q()ZH^>$ zr$>lUKJLN?3s>f{A6Gc0Jt-?CoHqCV6?KW}^xr>ut7;~R%$rIGHN!0=7oN>`{eKqE z^zoth-!srd7t2IxT_b#fiUlwJk_~;d9cI|$pwVrs$SJ@o4!c01+bkLge0*8r-u z=!S<<78u3@NMaHi%$%@dHfJ;6?+Iyyl0fyuuyj^5jp&EF5Q1yYs^DrM;2u|*id;R* z)w@igVkxC@R<~-k{<|Z&1~Wq3x&vLxdK6u~>BK^SsvVbA+>y1d8^+(ZU1yg^D)5;v z(QT%G;`9Z2k6xb*q95C}e=k`1eRc0yFrmpf6aNr+)|vxe2&6k;my&viwqrJpaiBHI z)R9R`L!)ez`In~0zwtbKX;+pLQ%6rK=Q!$$+qBw4UHWU!HT;Gm^iB8h2;+BftO|t6 z{ueb-^_p3C^r7+P+7`EsHc$-A)Hdh(&e8q%Hs5#vc&jn4C;6OLSmDQI_vk%|KS+<2 zWOVA`5J7rtXG7bUF!kKO&s_tjpS6uQj?UV2ZZl(ZnnMe!3Ro6$3@V8$Cz2M>witOZW)M?L_l8S{C^{tQc;=W z!ZsJMLbl{$si_1wUj!On+&<@!_mH+()Dk-Jm(-t$`}G7l{A3&)>Il&WI9U~$`9A?XLd6-MQJ~V3JyY7} za@-8HXp!GNWIj&IBT*7s0t%%0v#N5019|8zl$a$tWoY$>5lf<>i%W>4!T2X=IB~>x zCuIrfQjPV3%68Uj{<{XSH?sH3=fhaxYD&Udw-O^&dKa=5bu*p;T2vMi!IfD6<#A1^3CfP|*|_TMewR;T zkP;5{N$dMe*Q0^$e&lucE#rt0)!<&|%(L5)t}y05*A>^ETSa;s10`K0`RhjU-Nw%y zSSm?{$PsUnDgYqg+uvQvy`|2X&5UmX;eynA?z-XOLXTyv8{Vt+bnowO=!s`Z7M0o#*Y@P;8P2h# zA|Ngvr(#_phA>~z@P=Yq+Or$qC*uf0C*m*LUni`a5|$;P2jn1)uG~ zKYQ>nLW#|T);dox#fJtf!sN%g!tN)E>Z|kHj_NEP{s$k9Ppr;5S=!}b6%vcesPP%a zB(M$-R$twH9J+SwXN-w+%E%|PC#m^OB6l;1+KJbqs`VRLUD4;{CK(v@S~+Ff0v~hD z?T{vED%VANqm2a0g@N;IhFhiBc#$j&MB-J^(gHc8oY!q58=Cv->5>C*Mf0a9la$oj zE{~A*oRH zaS3mUPmA0xFs}ruKCz%ZJ}IdsMa~xDKR$Flai9@Z=LO~~UWm|jCJDGR8~9|kyj4K# z;QTGQ_7G!L_Tc4>V&9gpdLG=9Oiu7MHThU0!-j9U7;W#yb!Z!K?)m-7_ROrT#@aXR zOk_LMFGOTxJ~h=gG~i!dU71wt#Oy--o{DSA z8W5we{qlh7@um0>6ko&|~A2-E}1Vq#lv0HXW4dJEJgh)&5Uhj!j~&E3{G`Q^iu zK2QqNa`ff}z{xj~y9E5VI2|uc$>CB=T~<`M!$biE9Y;P7Ts6|W%PX)R=Vq{6Z@QIT zA-NDVSokR=i_T<2RqwtDH^VNOm*K5c>82UG`dSOYp^yueM4OBX=dA!jZ(>*ar{a}m zbthS-%~KFA`q@ik+L+BbQ=bxXCRd?T8f|;HHG?c>uBjC};cShgoVR>q-Db9Wjw)r+ zVbgjE@)xF6h{OHEeG+O|Fhi{ObA{}Y!(m5mpGm}SqO1aYmI6LmzuprRN-e_YKT3x? zf%x_QxRdQS_mQ%Gsygm(Tm^1vtX91+aLwm66_|?4==jS3(v&iboZ{J$RK%qDOD4Hb zu;aa6D-DIGNJ0s%1Ym>RV@^{g(BRKICne;!VA!k-OkJ(Pu>eF zBNa?M!-W~ou%xIA^ygOk_a!XqHSw+Y24lh1$Z7zI@L(~i>yFq~{9x!htB1-y9u zphy35GEfg*RhQRV`%>}gT+iMJ_JAL5R)K47FHRrBJ>Yz|;;1;?nSJ{iZ4ih)r^PBP z7vul>_Fni|6zwn20*B-9oEZ*q3Bl8zcF{q61*xN<*XXfzx+ z+>_N~%a{{MhewOp5PL5e1n$e-g-Vo|Ljpdx%Y*$v)5vcgv&SsVDRo072k+hENGl}# zEU69GCfXFwrx#7`Ju&&8E`nHQOj)}t+Xpx`Wzo+sQh%^YHz{Y2T+M$b$*!&e?s{_YMyw zo!mbBAhxKny?HpuP9*4JWFx6Uc>j*iPW!o8A`{8T-2|zqUU8U$`g5NyX&Wc9ufNgq z-6}4`uB^|v^V3c5o9MXKgKM)*4vMm`DZy-thNM>M=R#yRjUPf{p;xD2(&B^t1*RWS zYtb&(Q%~lsIo(wR<^B4>WhiEl{4XB4mY>Y|tt4cdxYLJc#%kNDOzu;fG@HAQ+gQM4 zo*jxQ|M0E;A_(Dro`^Ypt?EBmI~x%qH(?8A8$NVwiATSz#0KKI+B)<#>mFvf-<_(rHiXcTUzF)h0?O5AEz^b2~u zh&0r_8-*q98O`mG_my-$lJ+OyVMxsp0ru40Ph&yt(Nqw%lw8U$lM9pU^P)KMomD}y zObMHXq(Auhmy_alr1U&Rl3g!!atC{hDw4Z{V-4+bFkD!vC^}yu|s9EunLzaL~8s&!$|G8A#UU_og7yGL9 zXA5BAszqHXWq+IeI#rI4*K(31&Or=_dN4xGj;n)uI=*&tuK`NjK4h4X%n<*{+)BE%l>0z~ z!GC?UQ~-E(+~fCIpB|;_1%0*B=s=EioZj!y{xD5o!1n938B73ha~3M5}T zLryr-Dkwi%S1+C43cl-l1sQ&GOR6kwRvJ+_1}0FUBX%}23W|uxzi5Ue5ZRw!)xW4W z*~Gr#i2?K-uEH9a+h-3g3P_&!uNy{yByH!?jEM3VSlz0Nlk zJYH`r7Jf^4O3}*7%G!0dq5sB@??^%pg(~DCO9d>zOm(bHwi^Nn!B6>GS?2q~Gt|>i(JRaHoZmgOb1!-eRT|2(;(|w8koV=D4MyL?= z=H$!|;N@?eDQRE5YFzK5UtwZQZ;9oANnH+Ws0p3xx?F*rQWfd4I3I-`_OO&4qWXcb z4u4|YR69tMPMb+V1SY;@yyw#~KUM`%S+mc9eq|wf`9F`oDGkVrMA25CzyqX zySyNslh*-rLVOg*Hv$9mC&5w=j(73yHYEKS{uVZ_9XlKS6p4xeqsAs@E{$VVDRzbF5ZYFrh=M**Lz(R)F>6Oi=msl7D z8eRh+wpCq587rf&vcQI8dd_*>Zn*CaDM54?uhVqwGYUQW6gRG<^`aA=gocNR{e~ki z?rdV$BRwxVKIB@_`z1;BN`8yg!&-IN$^-R_jPicHazI-MuoqiO{D6YC(Drf0S0yOl z7$`?s>Z-d|jI4bYK8&AC@1M^+J``eUGdMj*GHcak6Yc4LXgKA&85A}pB zL(a{s;Up}Xq0`HlNeft!fwyZ?Jn|5Swp%&{QsJNiPWP{jI*~cDTX&sBFk6$HsUg*z z4!%S7zfte5&(E&8y-721zPOEi+Ja}TMB%OUg)dyS{2n6gsKT^66E-Ab$$>QXRT@Rs z%N}q~t{#(CRI{&_ycXv(z?1?*_WUkVf9DMsno#lzV$75j>OVD5JIxd-^52k3ZRWvc z?cAy!sc&_v(~T^11+~Vup`comYLce-6}>Lo+TVdqUpQtD>+t`{#6~7Y)Ox-C5gFd` z?^P}%`ca?|OSpv!ZGl-)+-?#(CToA701;m~OBQ)+hMODLVzw~M z;&m7sy>~?9;6_I7d2|2aK2pNqtpvBlQD2FVJtmiRUTTx0YS?mFWa-|HN6uiigh*+|IN5#j4esPMl&&((@4klFeH1gr*Pv>32L+uiyc3asu zGhdhL&n|7rRB>W$+77=kJS0+OshMy;N2>$XzSO&So-GI)Osx3!6+A!YGW>{*K`LAl zzV4G!yZq&>t`p0A z`E;JWd5OWHbdX6_`wU7NW-U*e7WiCc!TWDsU%vEkuGj}fcqH*U^GP@!sNoc$W1SS2 zDm2ou@+x@eDb((UNianqYM;rCE9?iN?DmpNd?VHOC(30oLf74{(X7DNo)sCqc}EW0 z+c4EXmBT0Rp|4+MO3eK9x9wKN5z>0P_U-rIkw29LF zHAJI(@H9UEXUp&8_m9IvMSeZc3V`CyD58@A8)w!dqSX0(Y5_xd;T(!Wc8^=taq{ME zaHvXBp3N0VLUFQZVd+Kq3yZz%$>Cl&u>HYWEtmdE+BnLkC6R)EFS8@3eY2*z+PcD5 zak4$VvD(^sF#8x%2!pp*4cRbTOdTGGpge2J)ELre0X9@Jvl}DN1lC;LhT}(WJC!uO zUq&uyhp)ENr1AQ)cVHBv9#ixs0%;^)8=A;c%T6?J7FqkM;juJwbA70H+OHRUXkgCr zUpfRAiCSY$--vdaXzz!%kso$i{sAqmteB`)R{p!}Gsz>^h!h(#c7=a$OHXsPEr|obKU4PuIi0IJBYKf6r3CaaRDUDfH$&9HWQk_?|EP&EgJ3 z7JB|g*=rZvV7GS#eGY4+R=8UnccqNaKeL;LB>TeW-^V57lu@oSXOJd2*id z*5NA`Es!=Xdf5rnxVWUR@qYKx8=pml#Y5k+hBH3Xc|Te4`rNUC^N31Gx(yN-tJVTq z`l+)?@Am}=-zNiv5%yuS7pVhCIW!eO1Nj!ds)FAH6T)}kMfkNPwMlx2?bB#=(u-aA zG3ycmW;T^nx~uL(MFh3e#QRSFMs>Z|$|C>`lc8yo@7+UaoS-8jV!%EqEA{Eo*Ddy- z{={&Bag!i2%E{oN)YPAf)}FZ9Zcp?|(~8!oI?-(pgwpl(t*w~FAb!mj7XRwEZ&`!Y zzV|v28Js~CHj5GC&1-_V_H>k=RT_uRoz=}RW~Wtq^XiRh&r+Z7c*{%2o7SIe4oGCT zjq%`-ROIgx9H(FCR8mmSLw<=e0r*_(u+}}dUIT<1-n)9A;LHiDaMVdIS!ff<0sDuZ zjwWE`s+CNDj6Y_)WOu{W$=O}^QwvJpoy5IUp4;WRa}pz5h#Ck$u8*k8({bX;w9r{9e0WXI@${(el;&7naxf&l^>_{MjJ&U&ap? zZ-bm3ra=&4Yc(vQCeDTqy4!Ndg!c2&Q681<0p z?>@(T2zPpiit(=ZeN}j$4!$!T6E!OM9?skD?xlpLbCkOS|J{j=3BPNOjjy47eIxWJ zZ={s;!Q~Rtbpv)oV-dh=8zUb`K)($+=>N$5QcJ$LsSSKyG5`R^8c0M>5&BiJ}yr&MSF8FEbk z;r91k@Mj;tmLPGO`K6kD6LCqbh335LfQUHGU>`Hnvq`sLv20Rn+1bn4>ZfRAG0m1- zN^W+nnC+QWrPv!?Uw?54Mg5+HWCqd6UW5we3yu`vyveS#qmjt>>DYIpyQ;a??aIUI zZW~IcqJ{u}LgG1o3b*K;MnMpnnr6RTc2HH7Ywe|F#(y2>nOWO>ddO9W6exP_R*P_{UY@LEIf3g$g-ty#8;5eog>uh$ za}+$@-X!BSl^mx&YSaFDAk)KW>!5-p&{LkyrTuZEIp5u;#3&rPuE%})BiE1APlhSg0wXBt~FZdN|m!waE*GPJD z?dvKob&_Rh*fjIaoAger0W$kHlAp_0@Kc)u$SszLmAolE5fr+xlosO}a(O0ZX50R2dEn@V!4!$a zr1BxKIaj|GK*rIkx9d-2Y9Yr3Tgg(eO3OKclF(tqE_+W>x&-k?PiYi z=Iw#JIU-4M@H#-@ajRZ_FTeDQA)<{c(4RAcI|-j8DyNe|jSKTvGdSL8kE-QJ!+v7G zOyW$r=k}Vsyk=|BE+{KD=KPpe4=t2f=CRJ9Z;tw0vl^Kl5r=2@Y$I@Y+m%<_NqFP+ zq)cE>$Km;AH!&=jK;!udORu+9jGO@_aiC(}@IUlsKXK@6lfRnLej=c#LT#Iz@Lg@# zkn#aVt<2TZ%CbzaDN3lX~aG>XUp0t>h^r9nC)9QsL&Boo@gm1un ziX;uBSd8hFi5{5T{ z^5ZDc0oMx=uO6)AN(M>9dhVlXr?D)R)3V1#XkoG=9DPzgYk1gE6+n7oDH-anp5@ok6MOt~$e})FHm5GQnxC0$Q=svpqvSl*t5WLcXbQ7M7T0wv zbw;V-{xT!GxJeavbD9hbX;z45E-leNgt9?dE>H-Zh*LG)R-Yhq4c znTo$o6v56M5rU=i^~krFn7;}dU%#g#zGyv9WZ>hJisddo3v;`KkBq^4vmK+Z+wOTM zJH_@rtE+SDqYcp2)A{&gR+1BUL5Bi4(B0i~V}1QRIZ7;3<0#WyGQ(IhLB1TTcAqMK znDD%AEn2E_&|O>__4YWZXt+6KCE#_aysRBi1a=4dRT%d=)OJQgDgPiZeb4h$<3?|- z33Q@(f4_?~7KLHbW3kfuR{hB2PlKSq?mpk4Lul*!X$|5aB@exkDMHQ0;jJAJVTqCw znWe0O3t7AglEsBP{Ogc4Dk#_PbDINPFoRX$TM$ZfR`?3*u9hmI0U3(NMUBU zV{gld)c;6JPb*G2hrB@{-9AVkHwhMlwKu)XKDNHSqyno>xd9!prTlpnG0748B)sKd z@HaJgtJLupIVOCAto|+bP$0^55jz>sVCCN}c1daatY~`I zoi}fiZ{FjQlNQubsR=R5M;lF`YkSX-;?M07JE=bXS@-xB?o&RI!bqF?g|90anb)#v zF{;A0{S}jj0SU0yZg1nn6T_=i7W*r)i7j=dZx4bYv_YJ+bEQNscYvyAT--0m z%V(c=FW7b{N~l46cInayFgwmK zZO<6sn#_Vv(?Z57=2JKVPX*PQP@23@xvy2WO zx8z6)nZUS{)}SH_6gKb=Y+wi1bf(#1IT zBpl=x(>2HhKia7{Z@j2i7BJZUm`nS~|MAgF+i{%B4bdMf8Q$MZMak~yBXpiprA+y2 z`;wjtCT`G&5}%b7#!+PKwmH#NGOTx99xiq3{lZr&H@P|OQ>#Y!?3lUqa9V!n%FPXe z+Bgv)rjIyHPcWn_Mjg|+WHAZL7d+gKQTmd57_;{`+tJD0B-Q`gJ7Gw4cPsKtB-VMo z9qi~0v|esNV`pbCuTD))F0)1uNykv)Z;J!ZUdpD1?k8R@B@>^NFHfbq9u$E(-&~dL zK7=PN>i6iYeEmSY>~Xpb3S4}6%A~tJ6^wYJ$1}pYCAhfMp-2vu&E51cW3RM1R1Ws| zDUsT99W@slrG4cti9=+&<=R53BPcDcP(XJzJkkrgCXD!?CzUA0mEczje)V0B@E_>t z<-~s`Q&V?Yn|~isY`jEbvPjQh^UGb$j49$Mm=b0S+Dh(Nbk1MdK^3jaz!Akki1EeZ zgsA|QCQ_4Qm3{FMotK#wfa*wz`KTr8sPsIa7lo}zQwo&H#2Lch!u2(d}4)^-;k{>IPu1pHe2nhMgC4qs+HJ~?F zjpMha7!FzX(~iFkkb6kb;MmylnfimwR?Wjd2P~ z>K#N{glQLnxu_!*WG%TmQ}cK&Ul$XWpsk!Gc-dzmC0sNN1K18>vvgIMkj07a6gb1 zlg}Q~Cn$u}Wm=o$sciZS%JvUDLhus5>D-1I+0=VD{MB^5dKX4b;x@0RAZUb_s_u2^ z7opaFW%Pxhd7}N%ShfZav4|W9i*O*3KW>mll;TTryq@^p%a%Mm@C>w2<6Ro3ta~k| z&bav=2Dz>-t5OsFXw#?dzzyNEGl-w44fLG)3VL}#H-Znt!X%3U%*{`Kb;(tVPXJC( zpua*?4TlsaIgR+zNJwQ=o$qqDU=2QCNZh2;Iu&y&;t@{MSje`ja+wtYG1?IB- z*xn@Mpf&Lf==woXQUR|Fw7fq`U|JilX6t&8PYS=)HpTQm*=B~`hWN2AD}i0NGtT8R zW$CXGsSMlwh629x6N-ksuU96!a5GrED;7 z|FjW3g7^L9ig!2SpAELPJII4wJ+9~F-M?*HA!g^C484HL;LpwmAr%+?%5Jp3naX}k!inKlanAsAU6l(gktv)2uMZFV32^)wwjsWqPcb|> ze8k7sJEl*%eZx#z_1yOf(I*cAyUs2yy140K)(h~-%q_u{9`A(}tMR7bGq?KVUYI41 zuH&ne%Jnc%Cj~-jScZBDD6Y)>B-1NGOKAoKO2dL&JMVZnxo1ftN$x7E&DS^f9s-C~ zw1;gA?RbRue0E0aE6%+AtpzE~kjgWgR{fWEF^Ls9q-$jG*r(bxJJ!}XPv-L>YB=)S z60oZD66$}2`N985TSTKNivLx;1a(UxYnYwxGZvgKS*qX=kQIuf{MHHF%OmG>p3RGm zae2nuiKuR0NLsE3QBwE;XR*{w#9L7ILobLuE+UZ;6>tt!p2Q(xW+3_@0`PZ`5}jK<<#-R9J|lZ$NYkV z4zl1cE39&d*la$wv-xOJ-VwC^Xt80G(C4p(Q{rUyXfluY=)cF`mHrlrEN;VKnC9pj z+VFCOjt$JFU&IL+vOp3_O2fn+JN>~Ab`aRDfH@|AXD;1h1!auWR1jU(AQi+O`jEj7 zj!eqidSu1!qGDr=S%e(J0y~Yi_A~>V9jD=e3+_=+;Z9wkyTjPRj#*v;L$|?mdMo$c zkJtj4=o9!QbZUt_>SfT!gZ$Irg5mnpqO4Ep7L{d%H#_N>?h{hk4T5OTOEGakgkHS`k6A=yU3w3gEnnjx<(UOk@qRzGYaYD5h5G&{PH&$ zAIq!S4BUFlBUG+z7IH`t+y4Lm)!o4Quh$sGnf_mS!$)LoN^F7IP$^r5?i8-@u(yV^ zZ&DQ;4?m_n#SOmP;qtznxG}_GH|B**7b_#Dwn`8GB__10K@FgsnAHQKAj%DldW34+ zq$N7-E7YL0ce23k)rcw2rK!TqATeS1Jd|EkF$Do^;*-jVB635u2{7$jzen+LGAvKl zEB<_F0>_FLl2W+skG(XUm8pZo`R(q%E5Qv7_Ap1`ueI|Yn;%HU)YdI;1J^kZr4QQ< z%Jz^^{Tg~F_{NiI3oRplcVNzOn-ln@LMX3%XV}FEDr3t}t4MdNLez!LcI|HM$2!Qy zlA1fd8jV?)D-R@ZRoqX>6p%Zft$M(^DXP6^#&{WE4k5_Frs4E*Q^AkH?Vn0?4p8p1LJ|M3;GRE7T)|6tNpVmEmI zgVVE$(V5)11w|d{>>+vgXxv^b*7nEO%`e+7_0v21hdn1>8scLO^JrLk&k}e~b7}j< zJ+yZ%ry_^SS(O9&yb_pU3p-h{3n3*^9aw{J2Hg;LPS` z?#;InKG3szJMe>Szxg0H@ArRS5`+#HaQ;bWSnHohACU(oelFJPV_$ss|Fb~5G4iMp zq!)$0E%Q!U82;vmM<>d}v3XBS!CKm9DlBr}Qw-@`A-q>T?5H$D7&$%3c+WpaK<`T; zF_O&o{^qz&X}J1mUpYC|5g@E~&o&v}=R@E}z-PoRk6_Ne1c}A`P-=<|^&{GhV?UTQ zd_H}h1mNe)$rp5}Vqc!D_PONZ(glua@T>2^4S9q2w~X#^Ui$JSc^eJf3ft>#v_t%sXs1IOo9p27ZD1RzH)T7|U#8dUxI&3UP(4^Jw zDa%Qi%d>N7%UN%7tEmEd;huw!ch|OFHLpr;Ixj>BFpBbY|I5F>O7qK9awklT z;!ENA=A;Oj>?76w3u7K&zY2AX1%42bBjL~e<%+Y`2`}7QPSwMnh^czIb1c6`=tN!+ zB_`?81tutk(DQG`)RKlWu;03eV_xWa)|cuNHyK7s)nKJNh7<{lrD*pnnUL|78mSF- zF}*i=v~OywgIVwB6uW7P?V?M@m_H~EVRgO>^E;s$^eMe*qiUIg^8JvMl%V40!5W>{ zi{7ulFjGk*l8%Y&K5C$ImNmCV0cBNu87SML<7+?}!aNc+vx~dWIRLq0uE3gOj_TG< zqT5zdHb*>ut>0u_F{&R3&a=`nR3|vEqUnvVVc|GG%>9L6&s3TePUv*8 z(N^0d=Mfz-p{_mAt5<<$=9Lm>n^?*%uC!=jkHW3-9c`okm=QnGBG`0!kW1>1e=Uqi zDSm`F?sZ5^grAGkFD`10#*@>!EZ9jGFoaSd-qzpgJ|M{>P6`u*Kr*nm;S0zTz{+o~^ zSeW?&hUk~$_=orKd!YOdy>_&)aF>{GfRVw`Inp7<z9kuR9qSmnlvY zK7!ZFj;qeBL*c$DCWBnbho5Rzw3=yHueg35itK|r7;4JGt`dX&PM!zvJv_d0q~ztU z-DcqS#KqrlKO9wJ?Fkh;M3(HG{>cg|RI6NcW3Dp=4K%E}TNtE$jA+OP;KgX;Vt;FN zhKw(`Y>cbt^xW0&q_GRG96z*cQoLH2(Qe9S`o!qJ@E0U zw7(?WZV~bP6BY>YyFp#Ax;;9Vl%JoU6=!oB3axn1(bP=eucZc3BkSvLqQ-`);UrAY zOe@(J1Co`kd(0!22N43< z=tii0-A`8Z>(0oT0jW8cyMOWQpRW<0cbzC>*t`E_xBW?vq{(5T+Mid!M(g{!&Scww z1^yx}lPvm`>5r+!sZjqXAvN`+O?(M%UIgU{%4NQYfHMKwAR+wr|H*H|{%)r0b*RJ{ zF(5NZ{`}QN{>@ZzD^%}^I-jZ+8wY1IA^3?9i%3Gu>a<##Q%w?*clPNxs7FpJrhSW< zN@-%jO5pe_)RIh+7GHgIx2?V}fdfjYevz;xiDx%pZ+1yk$32BAP0j|+_Ym0S5InZB zT_@%>Y)3w7q}6+$)#6Qq<{$pm??IS$4SH8kJH+MVqxHvy*))=r-{mh?k@VNj=gaz# zdOForb%CWDPU9Q_T27|7GbW(E)d9x%94=CXiWW6CYEVRvJmb)kZ5AAu)8rAs-9XaF z^&T4!Z|i#!mN#j7hpSt~NrwND@h{(->FX7k?H3D!k3O&uc)5OmOFwYwD|uRSwDB#g z&Du*P0_`6h);phsPHeh9&zxwpni^1&4Pl_8Gx3J}=^G;T&t+EBGHKdMCCo5?xO`w< z@w()TBodR^`=BT~6jjD6tuU%)sBR>Vhz|_0t7^wDqM@Cfo)#^6yFat~qfVY_+xgl@ zVr7lzLr}HvO)hqPT-4LX2SlFy#TSk}S^rfx z{(o`N(>I8(-aW8 z6=eCm5O6;F7<2sm!kRf66&<~pd|3<|7Z?49vTz;N+sle{EK+#45Fs@oCbM1_TC?wg z{@2m;cRBh~+MYqc`rBKUlt_y_~?_u=Gnj zzTmOtcz9a{qxY&($m&`(;ZqE?)C5OGt=PfyYil^!>yHO+?Uf!^C(XDNX18O%Bi~8_w#mMFb^eOUX6}MMZNt`^2OSIiUf?nlv>&}x?X1^ z^UTV&ye2+(;y+;j%AqebSgTlXR2$Rbs?~=yWJjE9q7UlbkuIoZ_{5^y;R}NuO7LF| z$L#Vo%&Bi7uqj!^Y=@A(BJVLox}wLdebC3wkb6YwX|og8Njr>#j*dY&zqtL#=-Xhp zqkL&~ndCQjG+DFW+C-_F_!qY4o%N1r?SOyYImQ2iZcAE<*#6zRu~Ctc^7J<^1MjSu zG&(WUmpI~+GW=U^sg3XJ+TY?Qt8I4h=t-UB30}VPXuUrZKm=VAT~e9I4yxV93nuvB zABhN#(`l&c_=B#w-^SMmFChZ{XUD86I}JFhI`G&2DD1DqyCRH5ci#q3R8-G;`@;BhPVK=e%H8~L}3tr^aMViK1r79gV6Iwa? z0M!k5NNGl`!85k8sd9+eaoM4^Mx-7jRL`M(7~*b9&K+7L%1Dh#a1q~yqA5s1Jq&#u zba*L&_Dv)Y0k!0d6?yz%oTHsBClWOJTT(oXFaz`6EW3z|9td^}=gitt9_6@QAw^SW zmm|?Jc?H<9)k~nH_MjZ|^J7Uh2BXh};Yy43BDd*6M;>3wL+MKV;pEa>a2dX{_X*^i z?63H=gpkrb4FdKegv9V2;wIVMX6Le3G4*8ZSZN@i8_)wQwz8~#(te*Yh*oQ)M;M+n ztqBzO?P>TO`9xe+t*&~RA$fmz_A}CM3E&{kxp*hej_!;6;@rZDSZ~uC8apOo z&9D$h#VCQWN!eu_hDem+fe$y(tnBIUC=G;JI+`Oz^l zbf3NYqvV^H0bslTIu{=-CdP?jg|w57@X-E0Y`tYv9qSS;8Z20l1q2K3l0a~GcL?sm z0t9z=TM*ox;O_3h-3jjQ?)p0W+5s)%AF&r{Zwz-xPl$$E_*_PfYmU%Dn9p%3z}BAKUDzkFxi2resbWxVF4{n+R+*URrovBha9o8-GT4kw*d`-W-f zBR^{}6Fa2a=hh(T!12}9h$5zZd5=7dKfrKsiZU*7Sm%QY#VASb9M>57Vgp~VqDPaN zS=9Wb?>-dN+8jMR8Qun1DD8@|KH!CJd{rW3YZQ`1Zjk-z`fH0$QqcL!ufwO3oQ#x) zl{RNb{YCb3hXctfRV>v}yKC&7GeCh;NF|dT5CwHQ%UWOSL}J&A_fex3f&(D6Iats; zrae>De)W>{6?^Lb;sHb$LJZt`$=|S z(sOde>;;YFO0O|lt)IcYYX0-Hi-(d?wxR$3!xUKG`OEl^Clk~3m&kv7iysae&4=hg zAjz05R7zZh39pxejOuc6Pi$}J0asYepO};hsx*x!vDqGf=c7hoYz;LS93qPP3di#q zymBI2!_2Z~*x~7ZcQa&?lf*eP%s4kS<#%E!HyVH={)wm#!AB1=DhiYrAe6k^h2dht zDnc|l5Hk^E4kM%$SWbep|1hUnl?_9AY@UfP96E}9Gm2Pav5?ulmx^xUfIWoMqvNr} z(Wk>(HNp)6GEXvQ1&xgxpv+pdAe*8`MO1Uba~a#0G)62ACmArGvT^ndvgnOCVidaz zd6&b=K9%%NP%<(y#v0Vj8!PjuTvRuEhTqB{HGmUohHMLhQ z*WJEx0?gi+-HuHh+cc`uw8XsNjJTEifIdLUy!Cs_mP_7uFhL~TblR@41;hXL8#K%2 zOe3Edz|p{*tO~0`(k{uT9JbkZYa&2#2KG{L&s-8lprp2(uk_BdlpxgJk1ZY-sM~0> zATFN!)zkOu1_GmR{7U+qS^MoG~0fLT}o-yL_ zRY!_>8pBZ>Kt0xl3vH{%@Ou~STw9kWjJ<{pBarDjQFb`?r_J)EPIV% zRm&*pgfeJ1b4WL4R!1!g9{q539eC0?ZB=fKMjYA+hCD5p7V{#u?UoCLh&;xoW(&El zuZ*}jX=u4gqA3J4d}zy8eHY7G@hn;e*tKU_4y-Ztt-CX$4Pb4~o{uqPTE9%kXJNlh=vZFCv z&pze&*>EYd_q^)^#?(#=-6eDV97$5QxR-3h7c<4Db-=upql{K?&P#OTN0V=egW^-p?uWkp5& zI}itQ2N6GfH)XE=P%Fy%3YVp*8@>FBwW&Q3CW=E{{kq_`Dc;I6>tIOu&tMYF>)YFb zVLyn46Me@u5HQ;=lyd6)Rq2Yj33CHcEh+e zBS8hsXjs!XVSF5#iLU@T53evwE{|W+5H{E0f9&+zCH8Pw*8bb5%`}$b;~gBBbo}m4 zrlz`6JCA&MVY^ai&Qjgv$hYi&6TZm`rK93bvoIbAB zu{g6X=XBb>!xp1`UC1TMCD1$5;!?8I3EA_7y2|*bG27`ugL^s08dlAddhMRi z)gvH$?v|OkNe}>5?N?UZhtF06G+M1>V#J0%qKd}t55t|Am&QYT%LBw{$gMuWD#qS! z^PA?AM4TpTeny##n&g)mN=gGL5rXeol?^2o)?3n;D7BNqa+DIxO8t-|8afYeowls& z`K-Ox3{Q2|zUTECQ@@m)(u*pD6}#+j4lfwpIBSO&OS#>DI2^gZidr!HwqiT1+k`vc zcv(qBiQl+CVREpiNRlP0!OAAjHRW~#472_UCVf=uCeB83mEN#8SrMC88SPtPv0O67 zYYxo_yXiOnC$f0|r@4esO2qnih8{=({QPKZ^C;zw&x%*1JGfen&YZpln6NYpbcI82 zg8dgXHO0A=!VjwRZJO@jXoh5eww8)?3nh$4BMJU;gT{jgFHti9I@p_oyfjMZflq;IeJvH zjD?FS>l^B#*5-+ByF(|~TazRnjM!I{>P$XNRl3iwD#q2?{;@aM_ZjH<!DL`ijG@|^8FkYF=zpJr+uM?`u0wlgM(U#@$|7>@z&Z-gS%&8 zC_fGFICzYGzH~QI8Q!pfNMv$r2 zlK$>GI(v&1eei#o<`cJCi_Zq7T!&LltqufBC$1^^58k7i{~RWR zkV6G@1e8>g1pmUde5Qs6_HJ(^m);i7qimu@{~it+n8-YUb>!iq^jj|w^7Dh*J30C} zk9s&RuNbi5+e(#5xNCQu9+>Z9!fP4;kgH*PNRq_4u|l3Umeb3?8#b##ooxi&PD(0L*Hb?fyB`@&zSg5c5F z)ZS!9cD{P-uifIK!18#(B2$-PPb^mZOX@C=lxbvcBcoj@Dn$bZA!$6 z#pPo(x}A;z^vxVvnBGaZ*=;i1WU*7#{3*s%Sq(b{ZY9a6pu5sTmm+$^Kp?SqXFO^R z%#9c{(7V}{?3n$C@obyCMP2FLUO=Z$wm`4$vzz}msdgXa@2{^h`ccba8M9=;`hA{E zu$YkpEiRYq#O&gavo#&zAhDld5~S9PB|-&FJI~>P#s=xOpvy-xw_A1No6E-G`ITm> z<(1xDDC5q8niA%mZ@CMf%G#QAEXs?^s+)CL|0y)>l>&sOo8(lx|0G!bf8~&)zDExV zn_cxWIxKrDMhFlo87?zjS`S>-dGAHfQHAs&6!^plzgr3lS-cNHKJGa8Yo1V2-LzKe zmOxacp@Vi8=SK`~=m$nUvL(|^1Tz)ls?`}d9na}hQ=84J&K|xKamARn-QdaK`Ai{G zwb?e<8U~ry%kguesGn<8T2-1~!$9m~ZDyDBNsfvDlA=mxw>tV0z%T1MPpEXhY3N+= z7Y@Wp{ZXogJ)EOsOY>vsY|v=e3Ol>{36qNp?fXC&L={s!ysC!>C85E=wLH2;Wrgv#f?Kfx3RISUGQefEPEa>1A< zXR*U|_RXO}LqWQ_CH=(lmKr|z?lR`}$FkKkl0~VE0RmI#k^8w;<`81`ZE5ws6(~3` zFUpxJj5la}bp8jXPc{-huj9KoGEAEM_Ux;Zc!M64FVC$>?&@A;u)0F2slma{gp{g} z1#FL3YA$xKTLo(S>QfAE>tD9E>H8+PX+d}xp@?K?MeN!kzEE!Rn(Bep-_6rwhgNtL zmFLbf2+Wvafi_89(pWuyzVnBAwg@ZNc8li=l^tqY%o2^S6}|U;O+}m-gj6c9!IAwO zwDYuoM|OvQPyi<_$CrQUviSd^0yq%8#A*{5))i~YJi{?TX?GG|Kfg#}g&>uk?&5x- z{KF>EwCpUD36%NcE5FCa3p6z3V}Xed6qD8fe-Shn6O51QAfOhZhn}18iE*^IW;Q4- z51YDaIM~`SdrXbX$CsGv=vMB-5R;`I9gOm5qg<0+d{~jBo|uJh(8ccis9Nr(yJ)(7 z;h$-x**B-_p}<&Qj;Viky&jUCPk$86=2zdFi-Pi*yI^ScHYS); zG#P}*u{kD4V)X-T|5|}H-<4z$ep5NssN5^)WMQ+-z0<2tyU2Sy*cd*iZrXf;<#Ul1 z*Mk!^QQ1E{DsWSB4`{VSutjXvrv*-_fsO4Gi!1(2`BL%@C#lra+_E;!1U#!;xB3@57aWEn)vRYotv#r|k ztxwmj-Bc6{!cmDj&g(Envuc|O^^4=`N(5yQX!QzPnREVRW5Pq$-C-UC?ZTk zR7FmD`1h=zNDkoq>h3M)f8qfkp<}_Hp(NS_Q_}!Vsi89dFOqLZhH>PW90Q98*;Ij5 z@Riksb$~NVnz5jHgM5G@P=b5~+IUo-M0KqqD*iHfQVV&*rD#Hl&MM8tZ<;Tni^~4-sBFZMrLVcS?JBGO{9y zFUH5e=2@9_7`GVSu0nco?mcrz%jGsh{~W$-Uf5oSL`v?Fb~ZUPFz<{6dvM+5ODq-@ zfPmmgivg^06hXwnncCAy2@4H1CuO{z{{Tq>bZ(Va$B)ep!JZNU?iC%{n#1Y&5xX=t z?b{Bt)2rylqH=ua5x3>?~ax%|u zb2^(;k=`0%wP!h9TSE=u#mE!3=pcK-C9+Yol4Hxt&We=uh~Ydca3kF{lly66{^41j z&}^rfJHxPzNkoN`zhm4$y!=d<@%?oDdlX@6H_%oyHXFX){eEf)4J((RP4FV%8 z)r4*IL` z>k@fpOO93S=@>P42b^2lc<1J6P#^aV&6#v(lJMVh+}kc)89lozU`FJUbY5_q?tC9R zpSUCsOUot@b1Cfm0vNX6%-i~-V)Oa%;}~Dn>X$I+()OD5HH;l(90v!gee4#@Oiq?m z+^Kdp8Hlb;09cBUn_@WOJjQB{xs+$W4D^zV(6zEpC+U69j>ikNAvftfZlcidSnr@L z;~o+7gRfe>7ef~3<4ov!-(HdjY=eCr0Ct9P2Tw? znyA0E8#Y#F(aCB%8Pj{#_y2q!Y5&9y zft*A1-_o-;Iwbd^9{WgtQYtG9)9$CvR1w<9corm6=0gi>aX4H0kf6bXrg32q*#6+; zK=?jbFqVK1nD1W^Hna0vA(#5=*X6>S^daa}T?W+SFGI2{M3Ne#8HWuy)J7{tF=-mD z=0eXU$?BpfoWy;KN%AIOOY*7j8x9^$>Qe@xy5t2cH;TFBZB^Pu9U7U7+WPOpL0>d< z&LU8H@E9Au6QhBHh7i@zz+|;-aZnPf`ntC_!INFrSgkL|-#roJc;Y^gc7(B-zM|t` zX)%%uB3T-|+K^x%GX!TkUfH*u%x(P%UA{#s3vGh1K9=}dT<{I@gXO+nZxfy_{nWne z(a+OCyk#S9Y7!EC?tHf=t(Ug0f#J&%<+icI^Of1vdY6)KmYeVUovRr7zN341=?RQB zIUN3)=!;+=(Xq^P$c1U8;iWDo3B=_k15_@_c;B%k=YXGqE_*}Lwx2V zwyoGl=4hXhpdK?UgMp@Xap9I9*(k^EruicZWu-S)S3jFmHf|D#mls=nO9GD6xORq93 zaj%&Q#>poGrG<*He7=$5dMnCxKO}ivu~#IN+123$t)6rv`s!YM;nUaig10c}+^bYS4yiPcp(Pbc zPTUCdsSe~(M2P;w`NJ7P-lQ_&aTqjc$XT&RHE7&8hcnROQV2g!HIe)dX&6|X- zl0(b|zAt;WRAFqki(Pgh++lqyGBq|{g5-(=P%H{6U5RyOHeJTCt9l|> zj3Dii!YWF1RR_t{^b@a`sGiulM{L*(Bthk{4c;iFKQyhA&vx7_oGWoek9Cv$#800W zNJPI)8Hm2q7#JH<1*9$2eC261H6P8FoDbn#tweBfsehg6op02tRT-u&Y)EtGWUOA@ zby8MXQ!z86scPAfiWK(?8XD#Z<1tpmMWmB{7ACO?XI9d5BRD;E#b4I8hQkb=;(|N;f}%m{JcW@h-MNSz&HaBTi7ouf{lJ5F5QJfr?5uDb$LxO*s{mF+Wypd zA8doMs_ z4`<32Xh9<}RvSlqQwfPw;F0Ag)#bU8vzK#wpiv_HNi%^YASCrdPS4t&_*~tv%CGB3 zc)0yp#F{w|>OS?0b~iOVIy01n5IE?(-|a>O`LZuKb%jLp?<>>C_y$LwC^aX>Z;r3`z6h?Vr&xTT6mk7ee zvDm2F%^8}yC0yynQ(MzeQ`=+GYd)!Na@YC3c*LW4!OIJPuZ%3>x`Y^j?x<;p>wygk zatb}?16Z$S&hzu26JfzG+`hi1c}&0&kOlofeXz+z-~MATdeFOpQUfD9k^H|Es1FFx z0O1M{6aH(Sb<km;Wr-)u~jINj+aZZGQfd;(#FP_gvg8tr)#FXx4TZWOZwKe?Y~WNcnYapx>R&w%3s8 z*QOYNk`}m{B4g??8m|)4xCn!(_iK36h_Ugo`DK)0il{c^Co-4WU9N~k@DI}8IRmZJ za;|Lbq3HqitFK<{y$=Yvo^5Nnjv6<4Z#q@4qivTci443A9Jw*AC&%U=9wv;>YNzJs z_ic8M!#-FEXe=lxhtiWG?Yr*hmO2+?t{)}dB4Q$o^pS0p$+_zolS&bc%hw7obIQ8M(mWvpi_F6|4A4E-y)v%~MUH2;V8kM6g27;e?31D+?JkmreLBAxuQf0HReX?+YBMCt_zrP=Hrd z>X!7(+hS&BFA&}XNI9UVPK4ajj&Cs%76XoKEIKf=s^T+y1iH#vQZ6SZ&+j@ok{c=A zMj;0VbfIgQs=;sjEFr{Z;jJRV!wGDXcT%}+@VB>1yM1AbWA$DzkW3kGmv0MRz+FMB z*dV-c^O}1g(R?7PIzWf?p~BPu%pHDa2ONL&JUW+m`f*z*DJ56#-zcI{2@gv=mMs*Y zJ^jaKk2{_vegxTjO&p%YZ|-q#woXtHZHzUU^Cmuz25xQFQ;zFUP_Kx+;lhW@X1GYZ((=?FK3KwT@=n0=9~{j z9b7w3An}&%rWI6p7cE&2BH@BsrkRCePtV*53E%TC2JU5~!);~bUktnh)E7yaK5=fr5ey6?URD@(^PDppxHk;Z@otvVAi_Hu+vMe;L_Yf?#zI!=3I?9kS6*dv5#@xL@OiPySY_eF_mzGTS|88`XHMnxG zvS+0mUd2OHui3ffa=TgGO5}`Tk!7SNILTmSZoTMd=ps0#&TsbGjr2KPq&$Us^+s*8 zHR5vf`aWTVFqrjfYb?Enr^o70^n6@RAqc2d@4w;V;&!h6A`%o76zvvr{Xp;HCSOrn z)PLzHJ&h;A&a9xRa`4|X;LZ=gXHNp!ga7o@`jcS1yTXC1m<{PHyqb(Q{J{n<9e6mK@|3z=+80)t-gu825+1IC zJk7}`wyXAOA+jzZ;ZOR}_(ZdSV*KZR8s@Mv@ZDZtXO@-W`uX{Zi;HKqrLEoW0YcEw zkhTBo1t7rQ-72!`cI`1c=jS}UZdhx~;E_>D>CCurS~xZgUZuV(;x=|n0i7heplp;# zZ?>IZ!SD1->~v=Pcr)Joq>Z8`@?5|L(TtbEAuDZl#nV99dmMUIcmT`LqX-Uw)Pb|#)Jx3 z4URMQjVL(2gZc2Au^1OFU8<0=8Ty8Sf%SpX02O2%GSQ~P19sd!yUK9*?83aTu+XMA zuaB&e7_FmLQE{=5q0&2TbdJPirVqh|IB+Nt^5H*@OGg^y)x!Zn(D=-fI7#z5mlc-^!2+4E9+f5Sy;&JYpwo;cmWdl$W4zXq51=c%B!c&kE(LUKRE#dGls|5xY5k z_@9v1jQ&H6C?D5StXqP?+f0W9ITy9XpE z0&9*__}YL8Fr4qd)&KKXrK>wSIc!c>Dmw2+(68S-T8WJ=;R*K$XJ*zxxUDSt&FrX@ zw7Pz>-Pr~j$}(HPA%>osO7TCD=lb(Bz=oLrYazB~1^E#4<=B4H$}PwJ56JlC3|}!N zA#8||H{9Qo8ZZl{Om80&* z+A|@pRCd~!pUjsP`=XJDhIXw8T?WXVY*{%X zLKH>VZ4Bvyj}|@)Gi6F8H$Xd=0NxVNbkyYeqS4W; zAG&Q?o|a+?sJL?RZYk(MtJCHr@Mtv#W%+n?9#fDnv?6?}XJ5Q-88`V4_=YIO1{Qo= zvc%x3_00~ zBlEt_!c7o9Xr}BLJDy%wY=WQkNk4+lJ_|mmLC4kob2x2FSUY7iZinjSdC!-{9a_B@ zPl9VU#OL(v%0irT45S3gI&es^@~V)gDdUfwKn?qGXe>O?>~A=cZwpeZkJ>I{`V_hz zAM0r;wUNsYjrp|mbY^$=wr7Isiy~O!Smpqr(mKy5WiXwYMt>p<&@0-DKqRq#EPiO_ zY>u_w+vaQKmSmq+TLh!5-ba#1)a#AJnSC}GeFs8rlu-8fZT<%;V#HXsLd z1dDKe+zS3e1|-o?{}a|VMgS}|hDsv;`$0|!`58P5E`>HC+U$B{bTtjduL&!oXk!VGR*xf3)=mHidNrO+!B@g?{JDUc zyg-RQ(<&8qGBTx+laYzQtbP{@6KnD7pqm*Adk6ahK>eGF-7kn$TxUUKyX}U)YIV1g zgO6W2IC}sTRW0=C)Fq>xvo|>9t)ru|`$KJ(Zz#8uJm{n1;{$-|PMM?11l%K}BAvqK zg$Jb00#bpK(KPyb76lUI`5wkhR^&fsHrd)dnj*r&)KSo4K3B%c{hh=+MH!lOS`9y; zIaFRpkE9;2oDUBk-^$%6p4>j+J9Pb?)gMTv9iN%^1NNK=?HiWws8IiIB;Uhh1RbeUS0 zTiG3+Fm&7xdMZhgiNRTmNJSE{6g>RsZ-BQN*oI2;-<<8k0H}jZ-tkxc+W@A&_j@=K zSQ;DX8bPzahIkr;h^SehhS$&LwHm-21|t$X*9R_%-5DH3C)8}_(X&R-2zm8f5imofNv~4}^^OPaCH7=2m z4&(KAT;VX*$2WS+Dh&rXVLSi`eB9|I#y&kR@5f{;o7vVD*mn5_o(wWPc)cK+7!DCp zNJ|S6-m7|IX~~-vEjTDJaN@=q1B*}vGTs#6dg54wL^4YXsCtw_mKK(m!w|7(B>a_2 zkA?@6!;g;C#bssjlOlbbD&X>JYjKp7-xn0H=aOLd_V&i`f2Y~zz&}3^c04R(tKvaI zsvR6XI};*8af{r>kG;}6kzMCLKP;gi4=kD~v!sT~2Jb0u$xiRJI z(9lp^j=J1jg?SZahqr*8T?pc0d=iI@jXvd(rR&Q!V{tL<_?%k#Xc{B=ho^+p)Id1b zz?s7A?DxB-lfl)-a#Jp8G+)MJsfU4*HTuhbg&w8Fw?0t7moJQ97bZ!mALEOQ*@?sH zt^D(&eHR?V;OyeF^SC%8Lj&$CQ<8UOi~CcQR5W|u8@v_^(!XVU_k;n10Gij35XPQx zQn$}Pj*hgfn{74i@cSguwb^qH$9(Z*pPm;G^g$L0t-0krLgs$utE6Yxae&0%=#Ve4 z`SkVU2C1NRUZJjxWyj6g-K3fwf$>m?e8VeLDh)UIt^u1Rs$(Ks>>f3O%&S#w-Ha)b z!U`w=f?SP73?L)WJ+A6c9)@C_!L)ZkC2}Rs(;79fQTwCPa2YM`x~{K&{!^!Pcjil* zXUJ#e@W^pgVG*&+>g*T_77m}@CeZ`h;KXWcWD(i)vhL610pwKl)cI76Y2qn@&nCx= zIp1=M>}rWWCKtBLM@(jYQOYRIgJ) zo>*B3H-L@E%&mlpnux+kbK-23QvW%ss*tju3P5M(-)!r5>zf4}s(zlykyLcV$ck0@ z@5G|BsoM6{_W^wRUVzzD%1w%^)r&ifDc5+~g*)9Y&30#pi2M_b9!PJ&zSi8#v}=B{ znu=Rqe8S5O@DTOgQmQH~#eZ}_TL{OF$HiX8c(*-Bl8Bcag z+GGz}*D$hw7FTF*!a&~{=FT$6R$lHT?NnY)nhKp~!pK-z(FxJ;u=HoSwX!Tu<>0`8 z;T1|V`}hM!-u!T&GX@w5N?#ecAz|T(qwpH+3FYW=!R26^Va;mziOr(Sa-g=u?bczg zEGq3Dx-k-yQGstHVl)`u`ygt)T%BiJSSKYZ@kJ}taqjVBC$XE7Vaoq43IM>j1lXMu z-!=@W|0^nRm*wYz)>yVVe>FZG$=c*BYhIPnPdC;ldV@v=fd&m>oyTsPXFgCRBT;um z<{15Gq|s=#IymLgM1RZcjxyS0)ku5awnQd*q*jNaSVs|p3m1F|=S{{RNyM*DwBth1 z-~0;me%c?GC$o71=?SserfE#R_E6Q~Aa$zswbl7s(m}A3#+|rI4&LBJZ{WKb8cVd9tALibcZl~1Q+_nStjiZ81f3LF?-hw| z9_*VSmPLL1WDdt3?u6&`v}m45_x)^VVM~{>n3B!SQ!f}SE7h8z#i-~OPrb#MWCox#` zE$m}%-Ay!t`bp8;H!T=e)W!m)hlN@SO)!|%Vu6P1Y6V3Dfw*#^JGio(|$rpu6 zxjM_z&&Y=v9yf09Q!$cmQE>$@pfi!7nNeFXuo7@=knw!i4VPCub(61FK)zUDtBuWd z|5APL>37Rc%{w0aX)by{?9LIo`RXkNelZ(DbCQyFX?$xB_vjKut+vq2U1*yH$Ls6s zhYFpIq^Q=kxQT8tG58dKBf_d#{bdSv^JErlhQ&wh)GSxa;sOITmg_a=yKz7=`uZVy zUsUSEhC&r6>h0Tc4fy;K3N)3JLe1wYL?k603nIT~>%oJ*C{9_7oCbnW$SEkO+a=x; z<(hitR#|8U6tXoasb(b1%urn7T)W&^%Z5fg-5ha{%$8>`9o3st$Ao>T$EI`!7Zero zPG8L8hHGmdC-?De^L@LRZ>rUDJW*m0P$@HA-QSm}z0a(~Kj!1&GFX6i80%M~G%{+I z(ae%r%Kc4(2MOzz5x~&%yI~_-{c|0x;yBuH)kiLOxfop~5-t>8O4x9`DAgOQm>4#< z-5yI(`FzOM88;-`=7;EDOrC;WTOxC$y2#;BCXLsc5_9$Z4I$xy-X;*f-T6D67Fu0K z+sWMOTt!qHDy5kA03p-}Elv*!&P6U3n!6I5skg4M%#sb^>oh9^qeC+VO8eiIf+C?e zKXtRH30m7;afy+W^YnnlDS9b#T6486wVH_WOYtcVkcG)mm%AyurCxg7pLKH79>2Dg z{InfS)C@O&LVmuN}=&0SEoIhd82UwQIjavcaEHiQc-eHDirl?79JT~ z`pHrgDH01(pqPqmyxto+A*cuZ@P+G#j8;owF;pP|Er<0>MBDn4GBS!okMbGN2I1#` zxwl6A+)7QwO3{ij+K$w4Ws$GfcC%r3a3ouMb0%FT1yi>q+1dn@Al~%*8&Ls7_f`(c|joEu*F#8 zgc4YfWTMd$gCyhsKUW**r*%J@C3gt4xcA?$_yBK8WX>UdY(#PhG$IH#=r6w&zK=~9 zaQ@ii9avS$;-eYk2qs=Y^+!uchRrQ67BU`fp<%(2Jq*pOx#_4^j_dz9;N>45@H znq}490Z!5)F48V2k79I8vttH`P-PAd4o*8yv2kPS+qwSF%M2LvUzjnTMh(l)sgfW` zPVW~Vsjc5Rz}lRe)i;G(vrzCpU!f>TSFXH)H(Hl>bo6PtnoQ}H^@0l`VlFIgrNW|D zN$O`oz2T>_zde!h_+99CS_5i7TJh+I`%2_`e^4BQi?df2+ya$}M1pRyqV>I-3iajb zVfK~E#s;2~SfDC6+^?S-?CxhGXbl|*-tCV{kY*+V$G1Hk7!=O#m7v>;USzLAD9pBgo7xeYD`Sj&SB?uJ% z3knqc3kUBE=l*o@wuUiGXDR|BQ!%GRsn?`dvm(WbR(7Vjv8P-#i;gD=+T<`r z3|geO_E}gds2=&*wdy_S3Ci*pQ3&E1!xUbK9=_^Mp}97kHyh1GpE!GSzI`jCBGuWB z!?iK7)q4Brwmp&T7%UZ{;m}De{F}q>A~g64YF$m%Gd#yAFUf=r73KQ&<^vGgQ~v&# zw2V)vKbU7&aH9qzUN`zgu^}_1#599aAFon_&#LL1(m+|wl66W*$gxbb$4h7&yB=}n{$v&gMMx-wU0>}?$Zwkaw1X@v`>E?J7N>00Q;4>=Yl5b zf8*+5keunJ}cKZ6@LAv6zMny|MR1ug6CrAKx7`%=B;6`l7d9O<;lQwImW>qJ^?r)-i zdd^=^b2v^{IH#&dLeH{l%6i@Gc3JjI798@G5?c1way7;$9m3`0acp4bqVyXN30&)A z`DyZ=$Q;%&90O{%7%CJo3Yl=c;D;$Hn1sqUj(?XNsD$`@=8RA5U7CAzY*2Fq1 zkWK#2br$|6KxpNBW99#4r2l?^iUz$#1jYy@EELM>WcGy?Cpv-$bSVX!0}#(qFBRs~ zNlA*6jP{NbZ~`@%&DsW&JnVT)dMmN8G?5LiJF%P@HMqMq{7QJTyou`sQe=nzo07s? zVRon&J?vo&3(Dy}1s^Wo(L*M-a42m%wXywvK9=-EcAJIoxj-;RJz|~Z^7iG&&t@S)(6*Z99 z>1IC^9l5P45?Wt1p5QFuu^?}F=M}__0Y~k$Pqr6Zi^Q7my%2(k;`a}}D^3iRGy9JF zbC*u25WD&aab~ThvY*EXCo8Jd4GE)nKDgZ;gpI>yrI%{bhW&a=g2OIOdVvc485Q|> z!9iSC4yOaYPKeoVy%S3`2eM-Xk^YHaM1Vt7-0uD&A&{;6BkFr%dboICRdDF1ldNU_ zZYUolf4aW#)^Axb0>l2?Uw2PEZ>=b7p}Xb4(|%X-0Z?E9XaVG`L!$LNASEzm5aaoJ zsFt~tv#BJnzNwo|kL8zM~^2iOzUo%X!{ZXPELmYKwdAn)bDRb*KL@ z{KzBR{b};lj3&cXCA;)!!uYp2Q=v$PXjkn!Pw&J`<>=>GEI z#EK!BVSJ#yzrf@@r+M7uGOW>a;7D|)V7K#oGky2O@$*bM5uY?|Eak76QTi(C-NbM~ zqn^G6Ye=Hv)u;O&qDQ`!SWzBj8SR!N19!-C!7yzft+o@BWj(&|W zd)SG=Q?Glsu)P}D^w*cmZytt9IiPy}NW1eZ5%eTjBmSR^*}lJHPSa!Sc37#YXd;E^ z@uIt@g{SCH8~FR7I)+ocp7RX98B0nT{LtdC6CqggAhLR@XA4Dz+rWZL9Zlyn>lT&s zx-~`L&wKW4cE3wOkzpn%pt(%Q?iabAq?*nkSa|z->0uycqh5*U zcAN+zU&rMdXCtaFTZtZfJ-d(TBz}*U_IQ-a9}5M6mPJZVw%&9*2j?lz24^R)x>f(} z7`GZ}(Zbgm>5#Zr5GUh#oyq0Ck3Pjj9QBpx`{eQmr?58&kU1C6+Y82&Tb)=~pzG|o=+!z7oE4dk_rv4@x zIS+>l{zsNPt;5D97ac9O9ULzGno0lXj%EuQQ3Z@x)5k?rWz)GW=N zIyN@8L@Ew2wEfu{B8Bg05Mf(s6c|@#I>R`_LxfWD*UJHIiERH22xqh<+f^=j6Hn3I zJvulUYJI%c%s98bT};RQoCRGOcu4V3&L>X2UZqGeXl4qM#&~XvL?J>L4heaZl?6s} zKrciWUy4P^8aWbv_W8noSZAP0=|=S3xWalfR~4d`t@4(mE!mq zMS31pdV2>mSzOvVFLlva^3p0gg7=|R^n75vfDcysie%2)oq*dURs6XNSdBNuXRI*=vpb5(Sg}@CpUaw3PuIS+cZaQsRMp=wThK4xns3ZnNt{4X` zdR>^nU(_rr4ei#~*C*{?Ajf;31~MT2jz%KhD2a+pjVU23c~OkorJR&mRoc>`C8F{E zVt_Kk-+tNezSX>wv?sB7^82bs}SODTRaAL&?_dEqu%4< zfU8}+^JE%E!^FPoFmCx0iv7OiahWXaZQyBRPULr1E5nWR)bG+-}_;=h#rI!w*g!WWi}RBR zX}pAN$_H2*51bDKOoHiAnIO^)foWpldx2>@umX{{!2JzwZ~@2f-C`O4543pSEfaqv zPfaWk^F1GCNQ%k^f?{uOuRcV9%zfcZ49-PKcYMI`zQkZxqLNCNY%O6D#*O4uX_srt z@*=e|?KbCEM4!(Gg}WJFe6%N?UchhdcYE<&PWe_IcwpT|zve91L?v**P` zQ|%8QKB0H)U-Nk_&vEjyTKcP@z9SY97RB~KBY{gYktFn>E`Odk%X_-(cJ6pVrSN!4 zi7?vjNTYBao7+o#T2JsA_v9iUYkf$KJ)vQ7A?2$GEJamAx<(oJ@VfY6N5lDmC+zLq zG9?$v5e8f&kqYBuF?M}*t0J%SBNPrH4i>m1r0#u^iA4LoZaYI%?BH!&3RptDQC*bT zpEJv|zHFHhZ-Q`~ugbRS9n+jQ@7*Y0J85G;qbR#St4$mgo~=mG;(v>^UtEwF$S!?9 z++zNbog(?gK^3xU*3jEWGsM4{nFE3R1Of46jfan(&xe3DuyfpOA2@k^u_N~?ZoK8G zYmB7~%j9s-R32_9b6v}MX?WXWu;^B!X`eY}}jCFzhr1 zk2Fq`(p9w*rrK{3vFWtd?szkoBvQuHrLC?4C)2YYLmf;7fmIb16kktqp7;B)X851X z-7D_j4h2t+C8~%x{#ceO2^pj>FsvB+0n>B2$q1_0<=4|IG&IB*{Emj)0jeu6mukD) z@F;ak3HAoykeCQVCB>I9F~ZhT$av_m@M>LB&@sbkHJIJMfLlU>nr4#2vioD*K3;%O zdHc(*DE1b1F3`qGl1<|z?&^ZFUHesyOP)UoX9cZk-xsiWIWY^ z=mprPv(S}e<5h~NjM_OB#zaH~mzUv#zOMQ}jhO-^;E|=durTQ~OjJCo4IC&-_Wz^o zE5o8}w{Rtt0VM`Ry1S*jhwhLrX#}LZdq5hbLrS_Eq#FdJOS-$e&g>_6w< z%;<%eyz{JeuRGS0`6Tqok_nGlMP9zO660Pp_hl*}Ujx71ACp zBxIU4Ee|8`pDFf)9@35!w`k;n_4Y3B(+Y3P5D6=$^fBHM3+4)4Kd1SV&Ux*)VWJ#P z9G7quYZ%GrLaUf5KPsp0(Y2|84Q%>fhtQ&^Np5CICovvBbn%)to@6q0W-XO1aj!;) zK}v330+=bIr6_xh=C&jAp&k0E!rIgEHz-8l?oh)1Ca+7mvb+=Oix#wFI3>pYl;3C4 zm4J+nMZ{^ABHrnDgAR6Wnr}9C*fr%oOD7ZeWMKk4zKhTZD_u0Povp8_${vl*0&9vk zX62!dfz+I6AYpU(tkHm8gtI)P&jxsbY;JgG8zaNKXHVrziK2ZdQUIHRA=bAQu{p)6 zE(f2nlVq;K38D5+qW;5PnGwfUB7(hfKXddSKd)cQ2Z@pekco5EWVv?n@dEJaH@k2y z1vEhKnYAU-+>r``B(gysr`j9y+Mk41q0v`}aT&JW|vR+f6bI8Gm@ z5^Zp{%o?Tx9jI^t9iKP+K$3Ve94Y-O(2~GI=#Nm z19lPWJ{GLjd|Pu8us7vjgBmf+GNK~a1}`t6)ZgsUzh^ZP;dY)a4XW$t_hI6HU=k1$ zvK8@z6R#RUYPoMGdHg7#o}RCDfv^qUJv5IabgD?j#$z3^l1D+^qvfq56!g|fZ~L_Q zyU}6qfPHN|*nqpXfz2PUE6$gv0y1=d-o>nR+%M#Fx5RXvj9_tyM&fn=f?*WShkRMP7(vhF0Vr^_*RUYhAvmrL}%Q`J;ijvd9QLHC+ zOf(yTwU4juh_mx2b-c9uW~o)9IMKw1xl2KX3!`ABoe%In(YgwUEU;vr-p_)|oH1d<7cdGE zt7zHm!a70yvgTis8nC&Y*5bXN***n|0+$&lZHIG0A@HkHkImOTkmzv%14vUBnfONF zVFgb4ZlQ%RJn8Hk-jOsuqd*h$=G!ahegY*Z+93^tgM8Xf#cpW*TNHl30HVLqhk+D4 zHNFg>SN;+gg`#)dL{A|kV^mPtIf$`xr2$CN*m#RS2U=AP{_1As+M2)&_NgRmr zV>;06xN;jm;p&IBD-k$@{l52;M?{t7!zR5I03;qjfnRJ3ve&+evvV82XgePfIR5 zjPZ3o;xq5&9~)!dx=|41{}?E&#s&Wo$Y>7#lpSjK6%Q$BWFu-sP>Mz4MsyarfX4$D z=GWHFK}2fw{u?o#Cg?=#?H-Sr|m(I7}-fuqF=gvE6nC^X62EN zIJIp}w})8MK9GQ6P9hhd!I^YIA<^TGHZH^!pO8X}_j+c?=jp!9Tr~-Sg_*~2grU#d za`|56z-U1r`ud#%I7BbHYqW)U-~No8mH8E1eQuwGw3bMG;dHtDlQ1rBdD6Ab;~InZ zRJ3+0Fqy>aMl&p0FDhT^eO0-Cz_jbfTSY752WJ2GU~`lf*M6wXc=h0P;xP`)gr6Czq<0KbFWVVvnIIah*X60Ycz0ZjfVQ6Zxd}%4 z_Lu9n_xJd&TfXA?w8=z$Bn^e-g;)>`kqu(VqMzjV@?wP%A8);!BGf^@Z4^l*sTeS9 z)*Hxm;a!FF5$96k1M= zW4LaVXYZ3|yls{WlF_x+g#}Od|AL09sWw$l9t7~2nwiS+s%Dm}#T@1SxXLe2HWKhU zRv{ywS8J5}B>*K3{9*RpjIC3n+4EtfkA2q7A+7{~u914!@OTm8hh_g53m_>8zjH)d6C5V{@heFm@580pdVse6NI)EfV%V!azR7?+X`L)I_a?WlS*0F zOE@+*c5`R!*!*@GVwRMV!O}@YC!qD_qork>PK&#my9e*)W};8YsK9=NC=)~!?ZoqD zb%C;J^k^|8JZX2WX9CwPU(5Meprl;%e3YGm;rb6zK|}`t0U|DhzV7aV^Y@SsQ7`w2 z--`eo=OqopB4B_a@mJK*@lUzcxSrTSO)O?h8T}wko{6P*lNIWCF~a+td8R|x>`cJM z1hP-dGXP{QbP?4Y%b5}BA7S*7M9(T1r_`i|Bdd6qt`{JGYA1x5#O4}BuE0n299Pf` z(24aAS`?}E1p~&!6GXp>sajs>1but2mSZGVSODI(Y!YwxFQ_c7?eXM@Sl`GrYUZ9h zxTN(#ic#b`>RVgi&h}pQ>gbiT-{?`#t7wo7J6AR~uu^+TXqo5ZsO2v4-9$R)+hWm^ zA|>T^_ISGIeQqepHW8FoTgBkJkZ{*mN{)3_%cK%*4wJxSma+Tkm}OIs z-{W$jGi!9@kJxj-QzOG+vtSh|ywSGBJ8XY7si{I(cgWu~vsnuhezep?cld_39l4mwMg9Qr-)xMSy0zpXsG%a{zm z^N!A}tRGO2PX!@W8C`sUbyJ#FA?YBM~4dh9yQ+WDdp#{l!l-w=j!d!^2joCDz0qh z4a_2jgBIPZ-(Bd}D6Ln>$1+!=;H%^bqHL~bjcy&0n07pyhf-#`_#jci=i6l*yyoU9 zsfIoNeC(D`F8I}7L9g{CMZ1t`XlcQq5HvARXCilpYza>ZRdEH?l;@Qy(1a4QX8f$r z$2?O~a8=nHRS1?bat!x_(XwOJ1lMhF?JCO zL)>7OK#cE?U67Tf7KH1jtgOt4gR?K|_zgHm7J7>Sr;rOa&g5_^EN=b`F9R4YtDG!@ zz(d5izYZ7JDOtdQ0%-6g%D=WVpF1EB5$~S8Z>S%C1t3HyYkSObIgm-CLO7`f<$I9u zINn-z=UCwo5q%JzPNZ}nOJK-5Tl>-%5qI%N#!XjIQK|BNd^J~TlxgRCbYR6A6E9$i_Vwz{qC9=*V^lK>aLTWiSbnXMm^oe6cptT@*d<&W?&IIL8{X6F zM70|B2+szOx{_o)&mMm!_D-5)CT}w@wpw*H9Q%r?XUN@W5r4j~wtN-R#hph7v?dRAg=Y{q3x z*F26CvUI!cVk|TF4xXm zPM2BqmdwBEt5a33Z9n4MGSa^%bfP~KIvE$C`2PaqvM&S!*Fto7?1Sv-#yHS5(&688 z1T{I7ks3}M%~Ivma4 zyN3mfWMRS?1(bV{y`OFv!CZ%@EL?H;ZYlqpM`C3+--lRJbALFbe(6rE|D$j&2?SrH zsE8-aKcP_){WbEXI2RiqAF+B_8ncqwdnqA%`y%iKu`&XB_NWk>N-oNtcAZt?_wNg| zQ0`KZY_^E(b2u`Vs!g&Ygt}+Is8KMACzYa}0-k7h!&)PNV9x_~sh3>57q}V4A*IZ~ zb$1WH8|=j9=TqbWo5LwjM@Kv#o-s)j#|vXN{Jy(uK}Ni{yUVr@7`Uu}X)+i-YwXuA zUoZhl%D{?2W+7*w65x#+FW`%kouq_*^F?-&s3C_?4h|1m<5_Mk0LkL9MQD671Yw z=d%2Wg-Kz}wwBM9e$YV)%2DLNuZbey{k+F5AYhu!GBvHITxruHRP)jfYu-wkEWy}h zb1xTz30pX!yptsUc=)`imh*SwYccAqC%(7g9I$ZYztvx{&UvV~fD<3BGpiBJ4PM7$ zf>x__x2aJ&1<*j6m1qLIlxb0?Jf<7PD-IJ^(h=FQkC!fNmTY@JlaTn_e_pdvcx)w= zi?1sBD71m^gmw)3$`g9uHM$=a2~C~_2##6K&cxXKaee_iZGeJ>#&sF4gm+*Jfcjo_u*9zyhs3gpPnEZolf%pZxhI?bRC z#3^ABQS6-=d#|U)r>0E;Weoh>KhHM}OqLep_D{kDWiiZa&m*_tCE6rCC~?-{oXtNU zc+)KDSv82vc*A9=*;3&Z6{1mT}}+iEAV6^$g%D{g;mE%LL5sXF<48B!5?szl<4v?}>ehq)*8X4N<<` zRK5W-tu**kq>&QtqS|Y)bc$iKy_X~RdrxlAm$#XOIisR84Ksj&m(C40$75*Gw;VJ= zgYDvg^kovfT2V5i*g|44iBnFdb?f*2>Om^uxTV+yDQn(Xt}*5fDU2CU>ai`7X77Y zM{X<2AaD+fvm?B|vrs9tmV(u_M2Za2kcIgI|G?vl0_zNs8G+hxcN5FVt|NNvI zQPwmQ&t0OV1kR%7;E?a(^7yKqQHYloXl9oG;f-o(cG|tTFWjoUh)6bA9C?QvG%*n; zZXBPgO^v2Tf{T6?WG(qAWdoSw4QWB&OwG)GIv*e~kEiYIRf1QAY=inm&_svx`b>!q z?pHc=9|bHU+2N)7Ezh@A9_xHy|L*daRg zR+ey1Yg+cpyCwsSj>78d59gt-*@w{xq^}oSb*=ZH&JwV^5Y55S<$}X>u47l5bL|El z`nBjqo7zPpE)V%WCyddJELu}1(`su$ABIDAp4l}Lg`rDFK^MMX)6lE%$+1Q-+ zkWxs~LQ~#eOOcoypiiS^pVlneu!7ykStiI?wO__N@PN~IOf`5Gcud6mtU=zSm(7e; z0V@dEIFL1AHe7rR3@oFAj-=VgiiHhCB}B#;>?qc06YLmy1mzHq2>X`?r6K{2(FsthRdNNvJ-_FPVou<7iX9&<&mhPEjX8h+V0+?%#<()Rl1&SmPb4&Ant^u#tj^wRCbB~2s~5bgqBeDQprxE-Ig%vFmc~u~qZKVVrc5RVCuNx5J~$36TNMJctYyJBrUPRnYlfF~Zem_ZeXU=K_!J_A@u= zn~lMiCw)x9K3{hWidDr7)>YT$4)Uu0)}O(n5aM*HSy;%8rHpxZJNi5_JF&R<9UQWx zJ;|XEB&wnkM;m4lt^c_9{Ix42sxabSulXzo#^?7Nw(%&K>;>~7eXH~3v4&v7YfgOxGZqO4GJj6j@aHVkr){Mi6J!Z zPq*q31_*|P!@cp`X2&yn>nO<`O8EC5c>{UN#&aa9^%pp{-yi+tunma2N;}!A+`?f! zCU1FfGYNJx)c+BZ!%AtXaTF*i<=QIBD`r6sQa`NyrRD-C_M^pz+y<3qwzfiAW&4|* zbq)_!<#`#NeJieMoX1$}YjT9G2m1qFv{nHpv$~F?@ixakB@8#=Sm;M$Rn^tQ_w)1f zw@zCTM9&{fbc&5AdMhLe9Ku23qw6?c!+Y3?$*D97&nFfth6Q2-{sy2dMjYtbo4#%3h_@t7D0*ll1YWlVt`f+!QmT z`iYj?Wm162+wE>Me>+IhVFs;M;@r2NTH1%IQpquG4z8JmC1szQ{$bMbTR%=3ejW@7ya1%mQ}q&+!ZtH;XlvAI6Z z!&xTHm)efOW9W|`b<@#H0s^1jMep5o7rZq{yhhehmrd|L}n-x4GF%X#wEKLG{_GsuN|5s*($%Daym~a1N9MGo z*FY%loJT3RI2_QpgHia1>zeH00G*+wt z@Dis8W5JB+t;T!dfLLT&6N?@sN>|9PiS<|g^xLEaDyn_`iy^B2D5d}M!uk<|+fi%X z+}y_JCa8jXHmmIRQ3igFu##r??_ejVU?)Ch$nSpgA->)#%6qyKOU5S3bETF%>@t)z z$iwg@`;sH-STHrCB7vunZlp6+Uf`Pg@L==Qd@!#*$vlQJAXQSXrgH zRJ^G!`t|z-n$R=I@hz!GnF(O{l0VUy+spE2sjWcK z1t)w-Bv+eH78daUP8oN<9vWh5qtVoCWITM+AY5GYLLpF8$S6}mROvki^n3NC6D48g zwK7_!MvOGE)d_`yM+CAlFGJt?w-y)O{)MG_U(6*UKw}0>ASS=Kkpj~~19VPxOZe3L zZah+RY^hbVQMkqNnw)kMCUwgkG!FrjjmTvB{7~&5{_oK%M<0*^zjn$6p(kSJFP9?^ zEo!?sRn>6N%&HPMqaJgB-DJCo5_3h&jP3)R8=bFG{&+5l!)ce4O4{~~QzWHJhfBw8 zb2=c8b57=o_-?yUNMA$b0~Qba`A>AD5We;9mcJFXc8ouM9+A-d|JQ98-Ht>Ooshw} z>~Tm{YI;bdxI`6)U9$m`q=MdcMAww9%8k<^;813x|C zi?7p)Uz{v8C0AyBlBE(rce9ho0&}7sHy}A-x!iBlX0r$BSlHAwM zd_=3B`=t|yor9WYrbxl>Vpq+4z_#H$s=8ikIbvz&>eB+7aARoQqLRQsA8Q)XbU^Dy zi|?Mh_6%_Jjes-wciS>G21ZVmvvpu7EgLT{85pcYIj;C|)zs_zEUlDOVObcvVNPV^ zyW6!ds2hOXYW#Rdib*~!wrlIQg3jr@>(HOh%W3TBsBv}ZF+KZ3Lp7J;T~C)T+KDPx zApOH-+FoZ`^!$cApJC>)=%D~D_FN@d>0lF78VA- zfQ1z9xvK%Vw-b#Xon)y)L-2tl^gqR^g->OWRWw@uNkMW3IR^XfErMOE!}z&m%`Q?F z9%bcmZY$od|2V0+1f-0nSD7_XLW?6B*4YtD2ndW;eFq@0k?%U&F9esmwt&Li_8P;h?+OWNH%p}V)qMI$3Uoqdg9<7=w+ zH<6sTpXN72G)tm`rL*6yPLMn2BIGt`qFxkagQ)G9+7!86ocv~PxaVT!*e} zs_P2O;t=E94eMD_-YbH!IU&xWrb|3kzIgM%G!=|>becGHfP5ORx6IqyAj;j<%i&q! z<5s)RdHQLziLPNC89-N0AzE)*7v)B#3R;{G3^qyF?cC36iR_dS`c1?a90IRfih4s0c7)uDAlXR+()Fiqf2|6FugI z64#&;*as|O)Bk$u*9SW`8;W5w&@Pmin@iq2dp#frm<{Pe~*2VR#QF;x(xVaZ$(=6?TfTB*yY7gcvHAwY<= zV=U2EAo_=5czd8~S0O@+`XR;8Mz@K=DRG~V1*S6#jM?~f!?YY7AO5zb&Wpb=NkYPb z3LV4<1NtuT{D?K~oskKxU83|{uM=fw&*neVyQa*1vrH~FdU1FASgL%EQo#s!2|A3dz+=>CfnTXWmzL*= zWLPc4?&rZ{aNKhKIh1;B%Ml)-5dV;kK9>z#nOkKqJ4sTKnU)kylD>N1vB=Y?u1{92 zvK|Wr@zb13jKB%9({oZ8-_K`TO09Zr*G&;u|)T{m> zJ^JYAifYgA{M9JJYcf9}uD1kn#N|I8Fq|~xSl4$k5YFHbZ(?3#t0C`Q+h=;7m2L4@ zr{%V|J)Li4bVhA4TB>DCJ5@S(XhzI*@;?f6V(}h2Ei3659V3?rfie$yB<#=zwPlGn z2Hz>{!8J!GxHGMld+JQ}#aR#05Zb>*cB*%hnezCMkz{q{XKQZm2#IXD%HDXl^{G2W zBa3?4$n!U|20R-%Z-%A^oB!mk0+VFam4i)pO$STd=HG2vr~$}QQvcQpzxumg|C?-U zM+ZUrdIzS%yp&s?3#{mA;%a_c4M>K^wBW_%Ra(j(IY$n5B~V&elq6c334TrRs5enI zBR2jAxvvjuM|_Dw@Pz*R#<0t<&vnn-|4|XuXXfK@N-a7j0Yf1V%Jv49w6uF&@+PLz za??DK#auRl&1kXZ^Tmn_XTd*drP7^6w!P9<`>}PE+`1h3D4mEmSwgX(2#p5$fcT)R8?4}rHqZ^W##1ig=`Wpt{wZkXA8nYCds~7hyh$3 zx9iEb_{7AaMu+X(y1MD#f+hWfRmvYl4YFJdn(oqwVU>vEsIp1=&JG{r2#iSZQ$C~v zQ^D6iVdvaDQ)yMznspL@ZSW>}&(B|)oh1O6`Nj8a)Mbcui8auJy;1?U?7yGxzhAV6QB-h{ zim+6l8*g`P=NU|>ML1V}FkD+BC*xL=wvWv%HB*%Le)!U($LyLuP~zPBO6^Xr{Ld#`?EsG0)v0iCDBccZ;=<9oTT>l7@HY}?7~|dw#yuyon(}i!;DRe z9GrCca!?v6`UyNqe5J^Goz9>c8S*%UgwZz*8tddOwmN-I%eqz9CRyaMc4pP(3oYQ~ zz_n_ymB?AHE(6&D6~3Sm0eWk5#j?J!8F2O0j`^={<&4RmI4`Rf9R|_edrFB@G^;WJ zZ3g!3PddrR6C4s9Xe=ijiG2|nP1%%> z`d13VqatK}$V2;}qFKLKYW)7)N`L=prAG{s_y4Pv%D^g(F)KIZsdCsX)9jxik#jSs zm=Q%y&h=55+)p#ux1H8K-043{k)bZeX+GKo|D!{Dk{F~PiVQ0uI(Kw*r$aj@9z8#< zj~bOYL_4+m1w^-*p?nTsz@Z+}$c9@YvePT}L$^s4}t&jJ3eGRVR6asaiJR3*6 zI4Txc&;GhhSl^T6fKv*5Ho7DFT1>Q_aWS@O$m!^(mLqTWE^~|!7Z@55aXZb+ZZ!3H47`JrE&B0_g5Gu7xU`*j-9@g$r&jZHPlB~hVb~KoJm^)+-CQ$6Q=D_ zu3wW(R}{CWm6Y(g-R%+yC{5%cLDLX}`65^@0!dyAtnhW+`kxQ|30+*P7E};7`+C-F z*XEoURQmszbE)LRpSizJ*-GME=A|-NK+`6;-|TETZ1JO-2@dKDo-otj+dcT97s->u zaEjmNc5X_;#FVI#FQ0tc8_DjxD~-P~@>&0;VaTEKumH6eUVS~M?EtaXj*E^-hM0Iz zE0aCSj0Tnz8WatHpONhlP8m#O{ums=|0;)UL=7rRg|umZDG*>JYqHyB+uZf; zs99X7vcj8P*Wr$v^J>t!g|})u+2GT-Wz*;~Kx=mm>t^1On)mxLvck8l^Wy_b%Sjly z@rIP4R-HJJG^Q+}!T5Tgf1BUZ=RaVlzAP;cAk$blIyL(;t@3_7!{=-JfG!SdVc54C zaqkXW(HV5Gy+D7+dqgE@^nuxV$ErTy88UBg8=SI^P=}ek8qweUZpPtYy0(n^V_bhH--ra&WXZwX$ zpnu#KRzISvE}J!gtH>tJ`6#PjK6|cK6TglUbXQKGx^JNSMda2%*OhqqItO)*kC=4N zd^Z|!FIOXFS`RYzbJ$d$ZzsI&5t)_jh|cSw_?x%<^Jsj_|44pc@uSH82mgdA|3c89 zD>*O*QO#Af+MOKj1?-a}?}?w=x$8<{u@14 zhQWijRHRKoRB56Uv?@~SX>G`}^UI47r3I|cA$u*nNcaP6V2pM!NA7dK{p9d|q%Aj| z&FwTq@awwG69j1jJ-5(B`L542FJI2&Z3M34r>Y5VlvA9~YMgn7mJ4 z$FYC~9<6(H%gDVls!QFgb%Duw-#XjN zbe7q6LiLzXE4{LWtancRV`>;)k~wJH;>7m9k9Iwfg83+V9{*-~{y`uA{qZTsvD#1~CF8 zp}Is*2__Y;)@)&WCy&?|jVnp|)MfI__0-f-mZJ7P{O+LN`?m*ga*;cl#3{-1`j5z% z2I~eNt1M?2Y3P2wpZat_n2CjkjCv)rUb?UBa`@wSSu1&0fR|qh&$%8c%z_In3AVjy zN{fDbT^^4T?@;ExWIHB|f*9oWxsW4CZd22cDNcd6)u_Zq)LW!&(9u3$ZC9$7+{?>M z`DS7%o;i^eMhsQ@3(3ST;FQZr#kgYT{dzad>f=f+!Bv2tR&h1*`BQx*e4%HGveZ z%8g4qn@=H7b|liN9%WsF7$Wt0=rWf9zi%?A&*N+^j)iZ4D(PNGGB7?l@fK3af5;CA zO^@9?|D-Ga^FjKc1BWV;Eg9?ou73YO=_LlRHze-_wRm~(OIG%(J^{D^aIlDlM6AW4 zhlYhFUi=`Xnbo09=5~usNoI%v$FML9&_43(?j@ZHRZXmI9{Sv8jxS7RhA3WP={eo=bhVjfc9{yOt+0y+KbK#_?yzz+p`n~l-Oha>T|8=< zAJMKCY7m_T0+Lh8X`3+!?j#(nk*3Mqjg>x&IUE^5p_g?bwRz>DoIULvuZd%2=c zolK9YCOQTlmHPxSs|p57E*MGsXi~~jB>;>L1Yu!Fb>goMpcF$Oc;&keW zuS1Vo_TOdCZ%W9wGi&PCUzLysTlrchhGX~X7#6A9qiypgy2$FyBA6m+~2 zretfmYwfJc8b5T+6h{(4n8+mjYE%t{g;F#>LleK~XC&4?UlQf+fBeFuFnYHTUokMs zBhBErWS6GIZAB|8%1`NgCBC4-x53PEv_l2EUZTE{{Jd&Pv*4hSnCh4vaTyz( zMrvtX3RrCVPlPhxAYVwESyuB+s_UCI%eRiv7?Fvh4}zhJf@x9g?Cjsm)bIm)J2-&z z*QwV9aNQNCNgwa+m-Dk3pX$0|V*J40eCn377~aXqloAaJX&pIhm3Zs?hdbb(fICYB zcwUMYi1WgK`v(3E#XpJ=$9r?3Vi>cNR6yM-A`i4yi`FQ<+AG^Ay?QB&fwm)?gi->&=>uROG7Y3+ssU z;6r=?>$+Hav+SqUg&!0hqoTl-p1A!Kj>I@ zT~16mjHY@inZ~!;tJ2q~1c_=phF-gdrFg`m&t0#5QP$U{V_#ex|CXIKbccI$$NjpG zHHZ;rK>`)9QD1A%n^4jUOAlTHVSMRO1zDx6Q!OLDj6}2V`NkSKC=tl0(l#@qI6H?4 zpVO^!09p9Lv1a$mV$tO`2Q^Fn4+%M1KolE+Yb>zS76ePu>|L4Hl6iiiqfMWgS9b0A z=IlE@P!yJno2m&G?1(m`bvDZMjsnwFM&Ny5Y}~7~!1v-GJ;S6V6Ba}C<72~Gs=SRVySsabXT0OWg2&g%Howfj zYt;2p+AGtI)}9#|_{R!DPgaR`p2Uw9W;}JQtZ`$5BrC2*6<+G{&A~Eq2V8I-i3`jV zL_bAVJ^dA(OU38DgheJa+(5jDKH_^)QS};Yy@XWn!I#l$sVsi&T_&=|-r+03u;v1k zq^inC1eql&`rNM3EZO!e-31%nxxK^lNT)zl<8D(0>#EC(t@~8-pi1F#j7?Tn<)Wdt zEqWSbicR8p^E!Hr+w$qLpD~M;rf0-jdRO>WZqS6lk+gkkdo$X zQOyg<5fi3N37qVV9i-hf|P8Ez?aH z56QAR57pbzR7OExtP*}8UivXCr41b+Awx1o2D@E1Kk?~&(q_1HHREs~`0u&~%$&fC zRP)Zn>%XAkpSQ$N_=Bh+x{gLx=&Z(D#1bypr4c;>^A{C;JQukpoBd^?qeB3v7z=Fg zt2{;g?n;N-THC^%#I)CZw>;Im5{A?+NRuvoS@DKkZ=KR;m@k1jq z@VU|b*+B{UnTrF|G#FBYbkWD%nyR-dSUkUasK^JV)9>@F00nzqjd7q5CpHF~!Gn`> zC=Vdz2{NLm0XEG(U%o8kR&_oF*Vxq5orbcc$jJKM2oZsiC%HU)OTwd*W@IY-7hTTx z60rh+sC#|zy56oQLvYpG27kmFt>|%Hfb*l(<>VZ<>i$}&ZXN2!0S|Zus9mNaaYYif zLE*^Gm8THFqm%Br>Ko&st1CAK5$j>q%3tyk90C2Jc$Yy=P@0Q$!CQ>mlf<@onniB~ zF;N#F93hvO^A?3B{Y0AkrPx_#v0!Z5?LwxE%Qn=QvNs8d%{ht}6O9CREEg$=kZmbp zfjx2KZf+D%2y84PyhDv&iriSua03lvRJlC4;fd77W)vp=ke-Ao&1cB1+-!fN{1pCD z=SDZIx{1jty_w~=wTt?ba+FJ=VEupZs1Rzv_(Pd%M_>K-p8!}*2!vK4m@?791&CJbNn;m8pHb#{jHq;56k#C0@dHKir-%|nu%XpDt z*1gMTso~oR7M4k-s7ad00S{OM8v-ZW8o~6WAN9c!Hvun3Z1xWhqaKnF5M5>3?Q{?m znN9N2Iag<2EnQU$9Y=f5)rjT%+}LH&oykJc9va%b$j_7x0e*u;20LnyK(_tZ2`2j55cubt+(}28 z<>wlF&n=4E>SLmqFW0Y(OY1hbO1O-|Sz*R5CUf~bZ541omG^HJMdjUp9Lf&PDW7)$ z9miC3v%ZSeW&D6|%;Io5Dv*D-&L_@%h2QO=Fd}-eeQex^;e(X)Fg&1{PSWjo`B>R} zIC56AZ`Dk%o~psy09f$;Wi|Qd3qQp_-~NKSH;4ZbA^7XB0OsC`q?`?0C(6)YIOaLo zhUB!SpRbg;a97xit7i;*l_>$)_=F5iS{|q3rO_{ue4KDW=E_s$3b#}%ngyC=pF;_j zb5|`~+@qn%jlegT*U}#6x&lp$~{=)9WxrdlD$v{h;cb=egN~w252){B>+ux5KL3+NuovPP#(!p02Dd z_I6_g7QOYw0LqaqdsO$q6rmJXkA{{<9ErpF>!Am*<>AQdY^&1CUYKeQ8#{AKvV~bW zE!}{2l9Pk%nhgnzo{_U~ygUUJP2Aj5&o?$SHqgTlJlt_{CHWX$zs}b!?40g~vEd^F z&ZRe{JyKFqR~YH*Inx+)kB>MtSiL5e8DRZ&U47Ns`u%%vVRAxY`TDy^36a$IG5;7+ z{&V=`lL8PHmD>r%e>aYQjHKv@^bdY6r93e}UzSP`f9R*7kKLGjqtXc=K*t(38TEU( zw#HSFy#20?_(cy|g&&fVtwnkCOFMf}vuJrEsj|2d8k$go(0VCS z(f1B3Hjo&Z;du4@<1l;anTIevxbDZptmiR5FsDtVa@r(}jVUF9Sv(7C%C~*_M=_GGpvjxm43qXfbJ(8$36|-t6AVdyVX=b^K~*y@`m-hlpAV%GQ80 zljwtZ#(Duv<+j&9VZUP@Esqo5d9*s#dws;? z^41%yjJ*9%_uoICObO&q&+b+;N&g=`+aMWnMMCSrc5!i$!ICt`WTFmfPNPaxd7PDk zkwj{eNx0W>daR@Mv&H8I8o5h$faDtL7ajWjnLY#l2cQ!e@!4sdQ|jwqU3N2*^YUsd zPmFH}%cSxMQh>T46Dle!d23mPyHc1;0^`}-5_L=u{QSLFIP|3|U(>zjC-@qc&%hNk zSBhNQiBYgJC@*21>HQe8#)YB;d2+v7MNw1L@J~__gQU*E?v)jz{y3x< ziCah2t%-|ZE7Lo-W_o0lR6J|Dr1q`fhi>TMk9 zf1(@FdQrE=H%r3|M=j1MO$r>stkDtgO0FN@AzIg@S~;<`!TpHx zNG)F(iv#2Ma*ui{U0WPbY^bT$7<+l$x9tB;kB>LXIhU0g`x!3#!+tvjYz%n}a44=+ z`OccITq4`%FTU~o(k)%ddn~0H*R(5%etii*Eu#&m2Ui!Hv2L|Z+=?Do^2hMUtq6(7 z@OMUspU>VSA6uSeV}!k^jd#%)tXw_aZTp{e?LQxoZJsridW_uGKUV-{1z8mIiXD9@ z%I8rvR=YyNgcOYo2$~<_r~sF8l#z*tB#y0ilBe^G!^1Loa&84hv^KYhtil7K!ygoh zmB~>88yiazNt=0uCXSm@?+IPUua6K!CTAk=nneSFe+QL*XGT+}^bMX_*A{;M45pt} zEUO0G?VyX)s*h3VozzSRty125F0vH#+0L5ruFJdiSWfMHm1tR$+3VPqyrt56`dZF+ zW^y;|K3#i`C!+<*Fn*-F<*d71V0#~~Iyn%aRpg$%9RSO|wrM;yKR=I_Rmlf{iMoUY zsfE$j$%z%)FG5jQo-I%jc&iJGv@1xO#s*f(7g5Y>Z`ZL*y)h1j7#q3TAM_bURq}Qk z#NM!hRX70zd(-s7x9rk;E$#ODW|D>ID_HWe0)ZnEztds7$KB5%Kt-n_BF|= z$?0)J!g7HZX;<#&j~$sOVVu>PxJSG(?YUtbLvxw0GqqfyH$IGksh1A2YlYh@Hi^`p zt3&_GKshWM_NZz2{*j83HonApVbbZzpU3A??R}q^4Crhj#oYb=_u2hKov(oiht?A> zZ$Fr3uN&8sfT5o`j{nf~uu{#4h;W?89=@-*7mF^RK#KDk0p{j^G}!;PR)0bU=-5y4 zhE>#mJBt<|w#4`%yFK@XI>+{-wMr2t)ZF|^Pc1-82rmMdwEX(RY=HiVKDa2zFKT-~ z{X@VLh}Rg%6^I{!qe#awT~4^suxs zt;u$fRaV#JDvSYOc=IP(FFk#^1-kvt-_N}SR^Z>Z>?QuyM+7vwS{lQ(nN8gBd3o8l zn^42>n{%&d@lYFo8tz)&eakl^6uj!vK=$|0^eEMc{N|63``jGuw-liFYv%&cQ)x3>i z6C0aOw$MVaL(h&Rv9?!3v?&izNG#J@iGV334)6yM8}Z5jT zZp3|-dbO@UmDQ4rghVmN5O}^I{v6ct zO-!akg1|u8-X#!*8etR%`<0KO_#Y&(t!?#34Xr&rtTkI9G?(*#fsTX?>|*|w%S&^` zyJ*X3k9=U2?GxwaV$|DV}OhXoN}Mmo!@M%Ea_k>A(&;U?Kd4T8N_kP1^ zQ^I}p+W)Pcmg5c!s(28FDVx3aDf~R2nbe!QtpvKHAs{%isYj~Uv{!yU5no>dEdM5T5uc<0jz zi(1a6j&bd=Gt((Gzu?1PHUE&ru6{QO$1}2)5Ii*J;LSU#l-5Z2=NbKi3*7&%(q1!$ zKUbdVUljksJuLP1N;OGWe)2}xG%{XpIed~>a%N6hwq5d}(muqS&A6z%UyJVMjjoy| z-wV15U04!8p9leqS&qBZL;^FydDSR~lhs9{)$e25B^;?kFJt`Uu5z{wTgE=PCBzL~ z+*v(x6u<6o5jZeG1NnLK4T$u;kMbO|kt-F(*)TN1LN_AhRryv)M&)Zn5=G`X-jtHx zudwyqzNvC)qylZ@iqB6!#-SkHH1jyvQCb1FKI(ULReW-r&GF_mE!VCi*)#I*1rHY znoyA4?x|g$_>u(CJNS+XP$XU$r#+}!l%uI*z?iY$)|aarl*>ok?F+Jc>Y2Qb$>$Qj z8Ecw}i)(gtx{B755sL7`C)Gp=ooS`7|`cY#Q7BX=KAXA(a~^hMAc~dBWe=e0+9(|m#nir%hVg7R5gC- zZ}*{o^t4UK*DA}!3$gleT-=4XOsOq#<3}Y-XOD{eM$OyfbxOp~$7(@eOi}K5P$fyQ z4VO`$7A(OAV>`d9>cODv*TPxOs%_QBoo!=6{2x;ukukW6qpF?jq{Ff6Y`K=k;+&<9 zVZstNsC8ABFouv0fzzy#x%{s({0&JU7TZ~KE&`s0|8c4O_XmAJy=Olk3U*OWw)B8n z5={t|xy20*HvU18s&P`OQ5)(t`!A@i>wL#7mCk<;&3fQh7^WgK0w zAF|G6PHUk54H}oT^7R)|F679C&FVRi7w<3G*%(#iCDrSP<7RUM8VdBw+D4tRoXoUk zS;x&cxJiuA$G=^oHWso^F){+b$|RlL69z>&JNWlM@q60h;LSPjxDy;ipstRP}sj<=;VWquQ>c1R{nkkwJxDK|yGN}#i>qz#E}2&nBXRYIU2vt-MoBh7o8 zyx2)6xZewTNbSuvHXNJK??Mtky{v>B{Zf}^Z5x(4vO}B?^7hD99e{4tp}io4m)CzJ zoB9-FkA1i(-j6Bot{*A;RU8p72Gu#rpYy;;sA9Vht0Dq&gY@u%z{8ePZcB@$jw07K z!^JV{&)DArh#|z~m!RYSgJ<~<+rskxMNs=uy4Cus7SG}T9D6PiyS>yB0}K_9o6sA1*a@vw|j%xR7e z>{PFb52YABJ1c}U<>6{hHk?A=A^8hX;=1vjft+~#O1YZu9K~f@j7uh@K&TsPWrirn zh^85NHvu~$nR7axBZ;n$_wMbZ*AotXrX|wq`~kVIzEnhEqVB!|d&SsH1mxi3HjI{z zt?M0Y*>bw~8|dcEaajjnE~=d$E|R4?o6}x#lsgxnEK~QJOL{L%!_^|6l0&skYuTW1h{DnCtU@aJTUvlJv9CNbK z#ECq3%0M3?qrLhitI{W@%bZq452q7GrRUjfQO0X2N?vWhJLWcZD~8=SmI(=wY4v;%)W&V$vnAYmM!E&$O?ew&8=DC`W_>O3iV|z3g;pTQ@|c zv#mVjt6_x?ybHaW_Q1UkO|mx6{~G7=UtuML3?TMM%&Y1Dwq^d&pyk_c=bxd;0NN&^ zg`VIt{-WZBl_EHTP=O@Nw!b}&@e;!%#NUt0*c@fRL2~ML%DosufnDIpP~fxVBzx*S zJ$*I=mNK|)C~OdB`?W|RqnVYsQ#?CRwP;~pLSL02Brttvr}Z*iey?xmLX_pQ76mCI zb|c$Ax-XlM3hPw}6)E#xYZP4%?z>k;+aHoGovQE#uhh3}OY;m_rXAt4lG5jzSx;^f zx#5PkxYscvIp9auy-#FKzupcLnA34x+h;ghiD}5z+-wnlL6}R_a};ba7LG-_BKCKz zL3jvcT(5JZRO1(BHf^4mHN!sR`g0dfUjd+^WfH9>;Li*E%;xAt`aNdz#0Ly7!!83* zHyGF743BA<>3zIm5LY1!JA1PV`Ov@z=!5vLrJ*k`llqw7h%BcTLyDFnjqI6|VNGeF zcpQm7bgBh*GxpKX<%HlOy5HO=&W)34LU&%q-xb#7nINce){I_!s8Ng9bKE zF+0iZZ{oZW5!C%h)eQCwSwigK&ob}*^H9XU8^RuZy^tURC%AEZCwt36a}9!W9`E{; zQIq5TxV^h01+=}UE&P#i9!fnhI0%Tea1QNvWjsf|L}+nwB+Sg2W{x@G>kp}vlO+_N zps|XZT~9E00(>40b@_MQ@GKWv_&A`36E38Nj92Pb6x&U5X|-yU2dRt6#)gZK;de|T zhVHur8=ZD>Z`QLOKQ?inq!c;bRth>Fe{*!L5`Gbd-OElTA}|O20cR`tb3pt-TVcdi zs6Zd*<0&>JUbA3GnAgx7%vc@Fy=t|Fot{)AmqHGBpH`>8BeGECxr-4Pf<~$em)^`c<>Ko&^G5Y(z8tCXuqXtSX zlZ>`EzS+BtNuMES?PL3Ty5soq`F@Z^+fP3*r$k_(r=U>9pe>0>kV!K>JAX+b$Dwher4! zkEzJvm^zC-!s{<|Bo&Iuk9y_Kv<8O{oP&01)FEDw7`OT`p#dN zE9{012m-Q&7i~Ldya+vl0$D;DUv%5j%+beDrU%axf75 z8lhHL{qQyY_ok3Jr=zkREgIU%n)K1tv{^Nm371H*S^yKY3CSIUR8>`ViC&?>1_@Pp zNn*>r7dEaZ*#o3`q*#g|0#S1U`S$fhHk-{dzO;!K5BKtMkw8XUXHQA@*Z*z;@t+rk z1b9($#H$JZjHS;=$3Gdqar1`Ova?(nFSbvgm9%$#1h5puDMJXrs z&%J5+K9?iyJGbS&SMvI%ONLUj_hZA$XS?Tpi6cwTM~~rOr|mT)etbwZWe&~Rg+uNP zhggoq1f~l%3E0-0733(NUD$8OtZn=Ul{C}R(z^R_3QH

    xurkW8(Ti&XsQmo^bke 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

    YS1fKehVT*LC`aI)Vke?< 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 literal 0 HcmV?d00001 diff --git a/documentation/sample_filter.png b/documentation/sample_filter.png new file mode 100644 index 0000000000000000000000000000000000000000..860d20f42b1711bb3ef9977a3e036dd0c7f74824 GIT binary patch literal 807915 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ⅅwhDEl@Q`4R{av@pgN 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⩔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%0AueD6mXk=c*Kl|iueYWy#+%Fk)EBjda*gL1F69V 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�C*(v=D0IGFNyZ;+PoN3GvRq1; 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

    B~=hD*MAZi1W>N4qs?WnGMC56k@CmOE+^8 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

    tImtv*5gvl1WU2O240%GtW-?`*Q@Q()v|4j|qmA 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 literal 0 HcmV?d00001 diff --git a/example/README.md b/example/README.md new file mode 100644 index 0000000..6f72224 --- /dev/null +++ b/example/README.md @@ -0,0 +1,11 @@ +- Istio configuration + +``` +docker-compose up --build +``` + +Now, you can reach each service at + +- vistio: [http://localhost:9091/graph](http://localhost:9091/graph) +- prometheus: [http://localhost:9090/graph](http://localhost:9090/graph) +- mock-metric: [http://localhost:30001/metrics](http://localhost:30001/metrics) \ No newline at end of file diff --git a/example/docker-compose.yaml b/example/docker-compose.yaml new file mode 100644 index 0000000..7f95a72 --- /dev/null +++ b/example/docker-compose.yaml @@ -0,0 +1,30 @@ +version: "3" +services: + target: + container_name: target + build: ./prometheus-mock + ports: + - 30001:30001 + prometheus: + container_name: prometheus + image: prom/prometheus + ports: + - 9090:9090 + volumes: + - ./prometheus.yml:/etc/prometheus/prometheus.yml + vistio-api: + container_name: vistio-api + image: nmnellis/vistio-api:latest + ports: + - 9091:9091 + volumes: + - ./vistio.yaml:/etc/vistio/vistio.yaml + vistio-web: + container_name: vistio-web + image: nmnellis/vistio-web:latest + ports: + - 8080:8080 + environment: + - UPDATE_URL=http://localhost:9091/graph + - INTERVAL=10000 + - MAX_REPLAY_OFFSET=43200 diff --git a/example/prometheus-mock/Dockerfile b/example/prometheus-mock/Dockerfile new file mode 100644 index 0000000..9f954d3 --- /dev/null +++ b/example/prometheus-mock/Dockerfile @@ -0,0 +1,18 @@ +FROM golang:1.8-alpine3.5 + +EXPOSE 30001 + +RUN mkdir -p /go/src \ + && mkdir -p /go/bin \ + && mkdir -p /go/pkg + +ENV GOPATH=/go +ENV PATH=$GOPATH/bin:$PATH + +RUN mkdir -p $GOPATH/src/app +ADD . $GOPATH/src/app + +WORKDIR $GOPATH/src/app +RUN go build -o demo . + +ENTRYPOINT ["/go/src/app/demo"] diff --git a/example/prometheus-mock/Gopkg.lock b/example/prometheus-mock/Gopkg.lock new file mode 100644 index 0000000..19e4b3c --- /dev/null +++ b/example/prometheus-mock/Gopkg.lock @@ -0,0 +1,51 @@ +# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. + + +[[projects]] + branch = "master" + name = "github.com/beorn7/perks" + packages = ["quantile"] + revision = "4c0e84591b9aa9e6dcfdf3e020114cd81f89d5f9" + +[[projects]] + branch = "master" + name = "github.com/golang/protobuf" + packages = ["proto"] + revision = "130e6b02ab059e7b717a096f397c5b60111cae74" + +[[projects]] + name = "github.com/matttproud/golang_protobuf_extensions" + packages = ["pbutil"] + revision = "3247c84500bff8d9fb6d579d800f20b3e091582c" + version = "v1.0.0" + +[[projects]] + name = "github.com/prometheus/client_golang" + packages = ["prometheus","prometheus/promhttp"] + revision = "c5b7fccd204277076155f10851dad72b76a49317" + version = "v0.8.0" + +[[projects]] + branch = "master" + name = "github.com/prometheus/client_model" + packages = ["go"] + revision = "6f3806018612930941127f2a7c6c453ba2c527d2" + +[[projects]] + branch = "master" + name = "github.com/prometheus/common" + packages = ["expfmt","internal/bitbucket.org/ww/goautoneg","model"] + revision = "1bab55dd05dbff384524a6a1c99006d9eb5f139b" + +[[projects]] + branch = "master" + name = "github.com/prometheus/procfs" + packages = [".","xfs"] + revision = "e645f4e5aaa8506fc71d6edbc5c4ff02c04c46f2" + +[solve-meta] + analyzer-name = "dep" + analyzer-version = 1 + inputs-digest = "d26fb00b85e79280581e3e21855792ca0d1c72beacfa66fa2801310b84d598f2" + solver-name = "gps-cdcl" + solver-version = 1 diff --git a/example/prometheus-mock/Gopkg.toml b/example/prometheus-mock/Gopkg.toml new file mode 100644 index 0000000..501bc0c --- /dev/null +++ b/example/prometheus-mock/Gopkg.toml @@ -0,0 +1,3 @@ +[[constraint]] + name = "github.com/prometheus/client_golang" + version = "0.8.0" diff --git a/example/prometheus-mock/debug b/example/prometheus-mock/debug new file mode 100755 index 0000000000000000000000000000000000000000..d6621ecb9658bca7785a35f6091bb3cddd0aa373 GIT binary patch literal 9544412 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%0D8rtn_T*|_zBsLOpuo1iA^t1+d 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≀oGGDaL|8*6M`Z_&c`LK5+TSD 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[}L!*hdobj&e8C>F6;`2t> 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℘xeIy%mb+my_LKPyPskn3Smm6oCmP1d24S?!A@x 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ࡋ^m|-=~a$uP7dZ$y4%LW()^BR$`BUrdsk|O?4lXXw{VZv}$@fSDjily-3w` zv*n?h%H}U(w1;5Ss_CcCXEi;3R5dMZ`^;qM6&1Kc)s*rx(R=TwYh;h=uf2iQry=~y zN#YOWwm>dxK_PzxsJ%P`CTW6KQ(vH6;1kZmZUCl+26<(9>K-NjVIAi%W9*nP*@Gva zAD!TyuN_p1l#L^$J#Z~b2pUl ziei457_MQ|@JQ0q&jc`J0AVoL28RiFBwC5XcypMdseQ=;jAQ|-D1S~~KWi+ot)-fQ zE#kE>b)S!bHtm<1UC9K>68|uUgDOE3B1u=6h^{y&$lv$)`}w@0$c0v-%CR)-^3Wq# zDogGMly$Ct&O4+CA5xe<-)9?;7LY#FIP2#HeJesn4!xyFZ4pT8kc}L%!8}5PEc+9$ zLBXEHYt^|EVQ{F~3_yh%*ZI+#h;SJM50QyE%OhOk-K-*rLAz0}z1v`>kh#Cdv>RQ0 z8}wMn+@@#rF>pjXU!xhvuOq7@yK<)BgXCB z-%Od!@kCV<{p7lGvtfSHH$P=Ihm(1}ptubnO!?Rx5v}EL$SU4UmnpvNI&8z0KPRu9 zuYqlZA_TSyVl7Nvw-e2VTc@^Cjd6F5u`7^56f_^@g}giT++Ek~?^|?5SjHF-3S?Rh_P?niNk6fx#6;ptp&tu6Q<4)l8`hE3>YTlcId|=2a#uSBcN!>} zAN_lHG~>k`F&}*dBqI} z-Mq8;lzBIk{rAyBt(2|Uh<(ySEuM@4Xlj&2)xA8$_*7v(`x}hsW~3Ew;kgH~=@c^at`9p7U!Q8b5$T&~ zR)tJ^oc0Gx!}lMrW$Opa!}okI4f~!J{FP%<`CjBKWWMujhMlbHh0F!7?yLKn=+G?< zIkra@G94+9rWj;L11V(wScuEG_RFD+y;MfD|DRM;A#-~IbYcutZ9t9RM=1OTTq}mf zO2)%9ORe#+Cpfe)XN^Ml-bFUDfbp;;sIT6{u1s#%LU8`J0&?|RIyb+~;x=Ef@qM1P ziE0N2)5*8=&bac&`}w%f@gC_40r(Cj@ux-?_c_03P>gm2`b1-l_o!(ZoOJRmmo^qM zzYLl{Dlt&&!U+FsF{xS}wn0#*=K6?`s>wzte2(FN=%8Ci0HJ~MgEHYmh(J8nhA1ma z@HaX%sh5NVXiz~u`>HlNX&M6MsT<(JgB^*ocaupy$4|oepYs7cMsX++u`6YT5{W}N zc?J9+IfK1LFI{g=KrINk@d=+n!Ta_O{mQ_zcY= z%WJkKi%5i$dtUR}dMnxhWS6D~B2+32`dGl51n$qlgy z7$Jxbogm^h;iSpH8=1hB>iRp`;GVgw@2tA{Vi&mHN#HjywU9ZmFA=yB!G{pQ&<)`zfeV)e{^F@Af!9;u4b;5lb37=Vc#Z!w z8A0G1aHK4d4fZKv+7q!<-#PVM2)_D`ZO_Eztlljq^vs%|;YOp?M_fU3D0948N8{zN zr|%;h#3v8vEucq_X4_@9N#H9p1{p?9Q0h46&4TO>=I6kB(*JCxh$ZZum{`a>)|&`h zi6A^rAP76hD_1Jex7oM`rLa&nk=A|jDJE>l*{!>gg;~DRu`Ls}vH}H53c|jQn{1KG zN_DF7+%NlZY=LWXgLVBIxL(+O|;{q9FvHD0n7;TieVUx^f>SE7{ zqE?dBwFwh(K4MRzF5!W?8kGO0cyVq}*Qi7M9yobSb(PX{z3>>bX)=Pk{=|*9pxR1x zs_{JE)n!z{B~SiZiIT17i1ta{lXaFTx$_HIe2UZVtAlPw;|sWeZ6zVZarOB#R@`BH7K zmVk}NFu+Gdu@9mk3aVr|g@e%cvU>y8^g_0Nfs!)&&P{AxxuMPqQFoI8v+L=uNw&^q z7-|Im)H0@_k3|Ayk|H2jd65ktsAhT9cV>1yf=#WDBY_MW%vrsYG1*o&I)pUwF^=h) z1|&K9kS9+oF)w6lb}6+;xZ{`);D#J7(lt3aRQXuzX4JKj;I&MbP^a<^=bLmTLKPBF zEF|#v0v;{YHWO;kXT}ujSd^GhV*-Lu3qGJ?<#opkYg#ErBW9G}FoDQ#_-c-t=zu|U z8X=3}b0Mr(@-lMs@VqUq!PI@RnVy7Sm?@qHcS2hFB~{<5(}nY?GsR(5k8u>DQ-yJ$ zC~6V6tB10+xH*JuV5(;uNYs@6^-B$ zJoCo}aUgX+n7Ut?x?dgcVHOK)ZUxOgJkr2dC|gOW z9C-&>$*go1yyASN&&P9f-@KiJU}UWj25K2XA9!i`Jd03+3WlR$dhP<2#TTrI1`v+p zvjB;J7oaD39&gT5cd~*cKpE{WXs5gbkAB-jQ3CM-=a(K6Q!cZw*asDT72>L9cFnM^ z5)2UwP8SCC_xLo+?C^zv*8AB)d|s#o2I5zeR)DV7_4e{CpGaj9D5dVyC<~rxM5Jzr zDDX@};&bHBEB$$`KhvPJ#*A02F~h}nxbhkK8%!m;F7m<1mv>K%eC8x9gl(`Im9m(* zWM=5KVhX9OpC*_)A~V} z5JCnu(NYOdlfA^ub%#hv)5A z-Z2DT$W%Sg5pUl+GYp?*ip@X`&053IeT(!Iwx_!YtBY@0f9Jhvg?I>B)IN>s! z9@Zf~K)k>xqLBINbOYBJiVZ*~aN&hytsE?YBX|zrdpmeuJ2Sv|MRep>Ew*c6-D#x@ z>BM_VyvHS8HgwR7X%-SF9m6l!)aLPrnLO%=p+gwJ`mIODQ=1o2)l_2l1Ws)hGT-<( zS}uxm!(C`vmotvI$9g_1W>$i0kU} z0CY>6fUTiKXJOE?y?wFij@iTp4I;{wWm8d{5N_=*Kr z2zxnXib6#r3^7vSq4S9$9X`WfXTc7C&Qg8CU86JJ??ov`Vd{Y-TkBIQSo8XDwy$B) z0%oX!C{jo3?s-R|0~SW`5#|JF1)p&uep!}^R2G3E%MzzXS@1mI&y|jH(4TAkd8I$s z`m@x>1^ImTU@3azHgq(u(C&u8=r4RY6c4)(L{H;B-}`&qt>oKh*(ZS17YZ4w+oh&32)coYWX?FzSS497uWBx_+ zJUL3RQ|dJTQv5FZ!O=%a==m6|?8Ygs2W^Q^4eOhOx9A$|>^W%5;;~3Zb-sKx8zgr@ z(XIPn)xiRE|H$Fuz+nr^3b7q{o1J^1Il*o2!Wi$2wyxg<69 zg&FQoDK)yR3%dAm*xvUrSJFY}K+84Jxh)r>Hse+G^%ZuAZqonMc~f7bZoAfWuoAVi z%iGSzxf5(+|G;MN{D#gOeU(|Nmmxu|cHxT?n)(g~$)Bohn)U$JcmmQ!jJ8JkH`R6G zxf@Zz7x5vNLu&i>e*6G74VP8UeY<+@U4qT`9tY=bE?LmX*9?R$PzqNrqJz&do>uC- zjoLGyzKW&MBqU;y_3_-WH49+ar8RN*Oq?@3i4%Sa3zmx2sjby_+@pB0ZzDvgkH50v z2r@V2r@fARJNHb+4yyz`aOY{xDsIBMfnG%76inChj%C9q;S=G#E29rDg47Sv$kHs# z*%mU#2hGa*KsMM`MY{;&FX9i3hKEBj;`jFR4U0R%kjYK$9C0!Id zjTO*M@`}AQg(X2>QG9ThiPS3 zCixc5#NjLQg~>Vm$A@rcpr-Yr(Ybgp^N*^A^~BkxQuJJ=LLYg=9?E(msEqPH$4Ej< zi@74EgmK6*j2cYw=&4NcK-&Ezyp9(9T6X{QD`5AVAa58e<5g}qaEie-v*4QeMDVio zpSA*4ReoA#&DK*Is?s3ma5-9fl(8MH}lkjKh*DvDWAgiZe!*%f{h7JzjXvn?_j*?_@JI z(M$e0IwjN_e*40EU47rwZ#Jq&h{*rqW00nA^$_NANO%Jw?yI^GFgUo7d3$jbB;UgK zG?7Jil^Mv0Itr$1dCRisvp>ep&DGIKy!>ML+Q0{uw>R@6sfC28 zu3{q7Xn>g2J(hT?Q|dM|9?r`|QJ zq>iK>xDA;s5^s7ZF%YwRSyrtqD__-#Qh8eoSp*;D_6B7ncJD-3Gp`h3Xf}nRsmwEa zvbG58(}dL*Mj#ld1vSSe%vqLQX1jR3D9;5v)g^U-bWLzfS zFHyeu&Ng#F#2plIhl^F{AxE}!a*j0+BwX8@)Euvjt+D(IsvK?*-$Wd>O)`mOb?D6Qo$=ZcvRRljUbVVXkx#B zjv%4&)w9Q-asIAp8ZpoUff6kWXeWY3qJnqHytIb_+UNxacPgTSGc%5o(#%9RcR)9@ zQ@UXtDAUi)EWPBsRJXP^a)AiDBD%EMqHCEmXmfuD4-D~a+i${EVvZGI;_&WDIo(sx z*fm*~7beNr3Cy+e4kDZlW9#DatA)&~Cm63N7fDoHk{mttC2(@EoOc=hFB<(oJ)0uq zAIK7gfVK(hC!s-QX{dsn4b_<iyRAnMO9MuRn7Wr z^lx^c(~Nh-jvei1;PLFOQat8kUk7>tPBstQBhBV6Wb?Rwu(=~)Rh|VB2a|25WX^ID zDCYBEenqYZk4W|i7Oid7*A}LE|M`G;KSCr=#=N2ID6W7>E&IU%=~`x;_H>1+rG~Rm z;@S%9jMmf08rT_)nl3E$4)lM3ZUywx*3h=-B_p#_*OU$vfhqu3MjtRzce@yBI;o__ zmFR1w=}Vp2IcpY^{oX~kiVpf(C~;u;gjeb7?C2;(zOkXYFNSaKCr}}C%Gcd2Z^vqG zA5^@Y?RIeXAqTZKzag!)9JTh{??G$(5L~57Yt?iA4dm3Ey+uG)`9;^HXq>a0q_0<# zzx{Dqlds$-O?GMx!1^@#M<1`Pq=IVJqse`*OZ(8RK~8j4`?#8X=hRV}y#Cd(H96f# zeUhUuNj>q7QD_qr)2knYV2|g~o1(#+^Kk>b;6G`yWq=P|P);`Ln020^-~CgR<2`Ng z>EhUwUv;m9e9MKf!K>q5Kw^IyuXutKm3(uMl5WM@5Cfncg1J-Y)m>~0X$PvJ@TjNF z4^lCYs(OLJ(Exe>Ev(+=S)wByPAC0AY7yx6m@>t!&l|ghy@bV zM%X6|A&iDof*Lc29v*_dKI`<~{spjIttKLbdb*bIf62k%9hA(bOUEDdX|Z_%l&CSI zBr4%bE23|C%Yp7o^&LFk7A*twbSOa>+LDq+ ztIGh@faPt;@;>V2p-MuU8)C%`fhxU$P~(7(0$U9G027*ru)hmJLazw@tKF>24OJ12 zjS9~jlKHi81gMpgZ6hBI;G>ak?$F7xJTv(q&rjYhGdiOk^4$JCU+AuDhrGxxJ^Pcy@hQ8njV!aZkJbPv~?V;-otnSQul4=|3V{erNN zg!9YwS)X&68bevngjQf5Vriuv@gUafuBQ-fmJZEWTFKXYZUIofVEd2h0f@O1S6~bc z58g1vXSQKy-rUf9|FNf0SVL%QT1N}n|3KwQ9MJ4aHd8!iP6`CZ(Cts~l0;yk= zrk<)HiLSUg%c)QG5=?ywk5R$iU#b2D>|@qrR_957;f5e`Y}fK^;h2?c_Hz8&u>qto|DsYT5=*)8mt zsO4y>b_OAGRy6v3` zHlt(OtnJOQ7QkowP9)GbNIexY_niPBiRbqGueh1^>ohkzkefMYmvggHB>U=BgukCoxUnQE?wS|I z=4KBOnv(bQ|Bk}X%uZ7%c|U(vIfX+`VZ>`8b99PAOCp8Q(AX5tzg?od@rN$&nmBjn z%!7iw&oiLw&w+nG22ovTxc!>=Z^cKGXf<7H5TndS6pi*f&kBkLRE;ny%){w{UADX& z?mm?E(@I0DXAIt+@4Xz~OT@q$TWu`J*z&`y6$f$nZF5!zbPrh_h`noh^Rj5m>tNdW z6b2e-juB!24Rtt_c<#$d6}1r~H1%;Y7{BYQy0eb>5y!!AZX6dd{N3n2tj-*MD+X>f znlOOfH?>Q7CV-?3LykwIYYG3(@XgVgZ4eiamrUeSfJ2SjxBtgBV$K??zKiTA8nkb! zbbTjgu^y#*?p(s4&eOfqPv=oznzLw?5aiACH6Yjf4tKA&Xb$P^_+!&ZtKg6KL%J)) z$T1rAnlrPuqp?l4mGQG5hZUQzK- z%QOUQvH>5L6NSXY(ukcII`vFgWKd($$~#!Cujm6zk6`@T3mabWMO%4*=BbIJBW2A} zVd~7|;V87o@;hu#fkW*haE>ifFa(JL6E}weO3)yqHu|pjUop-zFoI4kRw*4qlrfO2 ztdcYqG7~;!J|lHP>W5A-`D97PptI7+D_9{Oy+dJ@d}xeSjNrOfSRq6!9WdEwlg;1q z{aeJL@PdRgFJA2@D!OFAIUSo{Y*)t zjYKnI5%NN2*41f_)sg+!tQ5xsBnkx?4VF0{GH*XR^O}=WnU{FxPF%&RQHi3nf%w4i z06|3)3R6Bj7{h#B8$CW{l;C3cKwR{iMpFW{9{vGgkFb+^e^;pb^RaAX0O^y zE5gTQ&>S?-KSRge6>n76@PB^t8`UQ{8r&@nsAj{{bS=*G=I4YKuRgDNxOUaaeN$*?;8EDcOszoOgvd7851-P$v24BrNih ze+4_4;*lQpe;Lv=g6v^hlh~YUhHw>6~U&ikORffpNr4L7D6Oc`gfm8 z@lHRn73!c46kUy6vXMWeL9n(cleyHzGpiyc9@#y_vpMqhWe(a(;+X{ zow_b$3V4iiUu6)D7p4r=SD36>Z;ob)>WdSQwL@Y%D~O$KT@A!xs`>8)j2QpGxvsAsL}+}g^ejU3N$fXxmnWH*iEAWj|00= zPe{q?+f!1w^F*@JlSnr#fK?5%CxvuivkgF^=Ho19HueM1UO!U!bL}m}E%AU4_rNHi zlP~cc5>@LK3(}o2+@KOs>mmV%Ar~xQ6`Y$3wnpMnLpVKxgMAch60Uaz*IM|bs;$Uz zFeitCr3!DMUXeBw&j_w-5RBky_%9R!ZG&z}0||B(qs#?lFJMW9s-G9qmEds=07TE; z;GNgw4hx<0%<4Tt=k-$?(u)YCOU4^#)Ge|4@uNw=KWELL7+Pcv59-GNpCRE2 z=$t>7a3xIu1h2&_(vRSHg!|MN@j1MQ#Ym0{Xb&KME*@rx1BjJ^EcbVa?&3~Bw719o zSqh|{ZK8CxP-SBCny&V}ZerAXlxgq7@K{+V5uS5^`Q|Jqr#PLEIfwYB7iDuWeJeaf zPrpDdCGJyvz&>OLu#fr55n|NqWq{1xj`u<-b%ED5tBLJoq0JV9{lR4?9C(d1j+1&1 z4K~XP01Ij5U56;DD8>9X&CfAM8di9S~|E$f$`c6!_~w z5j4cHrV2Xf{h;d)q|pWM02vLDJW4asR&!8etQ$-#%{!~CqMhBzwvi6!tLtnFi zdg@)|XIJib~Yu97(uBjEuRG3k~O5K1yh4&|O4KELv?F0oq-F06hAwaEc z$UeYl^wC(Yxy8WZrkJubQy7>P7_P;I2zgaI6%NA`VYe_i_f)Xk#iSK`?w0ThlnZqY?@dFDs8y`p{QME(3}wD1N718xHu8!lS68T~&DG=evz^J%YKy?(z0Z2W zY7ZnFVrBF7{A_G1pvXbD??tuo7`pU%_9=44gVR=3cl{Crox}3=JUGh2r8JnWB@dxq zvlmW11KgstueYb8G_{}qhn2a6$r7d6VT$sHA5T%&wvm;|PIDbwUR~Koh-H|0KJpA0ii^ zo{0p-ON|nwq86mKk~~*OZYxuVR#9iU{w2D5Um}@dt!8i!u_5jMSW4iCMuLNaE_U1| zmDENr*3QU(&V!vQkV_1q0J=i{Tmdyqi?IYx8G@y5A4*r_+Z|7}5eLWDl^H&-O$EHC z0&1ZE3no}%P{06)Nh<)W7-;LbJ} z_|KIoF<}IuhX7DVBc-zz5B#}wMsS<&%T&~Ib6wV_rDb5Y(L4DmDM zg$VpbL|CYLw=?Z7KXjvaSiV0k4tLJ}NChmG>tR!{gICZH~qgRiD zBc2;(>JtB}_UlGUwQCLPf4trk%5MXqU_o&=EWh&iDV5gnJy>H6!d={)O~MAATbQkD zWFi`@4^bL`iR&q9OuSx`-=Us3yiEd9eV=S31!J*mpy299QxvdK`_(zFu}#*-8pGmy zs*5X^`!a7NmJKXknhfl`pZa**O~ zZ0R76cw>@}0juG_07=zLSEP;N1K&~`x?2-ecSK1WTBg6-CGj=&)F0%6KUiRsm*}~A z7-Vs9>Z@%ot><1#Neh!gGb=em(wBK)gOs#>aDho{XXN}A?xR60!yMk0ow z5NzS2O0yVouh-he8t8gOt_BEIzFS72YQqxNcK)VVJN`(pMyZsB2c_}VC1;k}rrZY1 zlcY3T6+;}^n(u`Ji+flQK<$KRFQ)=V+5{TaXv+)Xu8r0U=N{}aT5$vzoLe5B%n0j& zpR~@ye4_02)wc*v=-J$nEm3LSSV-(gLwGf3yV%eEYf9|c$Tm~U)cP{Vd_ZEi5wC}5 zN$ka~SXv=-FCL?#FM^b~t(L+0Vicm_{B^lPFU^;jZVsT(-&;t+?i$(<>vw)b&_d?Q z8sdhO*sHf?pxy?dz3&(CVZcXKI-btm|MmaKZY9PBM(vIC)C-seEt9e$G+>G5{&>fd zqQ`%isEJi)F{hB3xXN66En}Z#R%2D#K>WJyfL>V`vS;&;D5r{ejg0I=mN>oBEgjwe}}O+ z^an{bN*my{jEmy;;RA|0;14CjEsm*rCSTkN7jpBZX&18W8{Tppv1i<_Y@ZG7%8!&9 zJvtNiwPDh`NsouAeV9x8DQO>2z1l!v@XTulQ)>1q4_%`%c$g`d)5MggY&gg~t8ueYi@UH7nmGYJ zD+LbsB2R!oI+U3-5>dC8F89(Z)+bD+mu5c>v_KlcO@%Uodkxs4wZBbqP!Ai}{UF9{cMV% zhS3bUS?*{;qp*S(EN2~%wV>vGKwuM!hJQwAwr^m#cY* z`tp7Ss7XzG!s~?2*gWrtU2h#>Vt}uPQE)L%A#?aKtn+M_(3WODh;n(;Kmwxww;zk9 z@qqIjTgyD99{O>$qztWPmRAto$xQgMY`%kQ+yHI%t*k?MW#9&8DjE?mPI?uKI1p6` z(*#C~mYGe$41y8^!+--;)f>=X$%jrN!~@ogoMN`3d{%FKBty2npIP0R2+%XjTr(%`29e}pIgmB+&X3-E{Rcipe1^%Itd5SE*5-w z@HEc{O>lIyRMTxESZK~8!p~Vw8`e1G65R0T#Sh>%E}m)RfJA!(7~%rS%!Wlc8f1|E z)k?%;tO~TS_bPoQF!Sf7uf{D4u_e^_{8?PvIA@I+^dd8GgxE6l@vFEhQg6D7e?rYysB$nAc{KUH zP7!W3Esspmu>+;{7^(x3_Sq8P5qzVo3tA?U|iRp+PMO5d=QJ+w2=pq_T za(q&iI+0!tM%5u=Za+D;Wq?|BH^0GZD=3(9^vFpDhDggTypVbDd493Pz*I9)wSmLx z_4NO|qeiWsOl0YjK#@<Zq2WgTD`Ao^}e)O2sH+|(U&I+)dFTrrSe|yAXf01jP}+YzT)Br-XsFzrslWj;5(7R5X_dr>ho(IZhy8tWP}t&AkoYPz5!O%I1(QihJu;QD&2!CPY=+iF$eTg%S)1F zPyKp1i_G5c%o_G4NLe|iy}{OrV1;c?Mx*$2O<&c#cTT|L^r!QMi=M6otDBM4$xq|3 znWw>O5ep#JMLk^H+51jY??Chw+z#W&XKHS-3QS2Euc!S6LGw&@EhDDFQrGGl+OY9m zoLt46<@6xShWm^6!0$u{UZUV)@M2w-+U4o};Fc~9%VZLNr2fu}EUjw|9L8*fE{Ksa zPXe9bEl6giQg3l4@AKZ1**pb7_^#y*8V*4PM7`K%)08Jct)+qyPdgZ*z7srTJmgQT z+1}wma1q7`c7FQ=?tr${h4(jEhl7iTeu?|&6K6o4BCQslZbhypP>NcP@C4yj-|Tc} z;%D6w#UG|Y24(x7!T%+n0`K+7SQ0tQ2aK>z_!zvgWdX~U8e&LrkMNg+p3)4hl;p)maQl|A$ZTj9|_%q1)A>2ogeHMDdvZz#F_GWq{>&tFuf>u0; z^2_N1l%1+`KC%=)6~ci$IA`fz%1q9lG$eLY#K zU(-(eX`}tLC2ay~-=i{859nAOtJo~VhFc&t(Bfn>Wv3-6^Wrj*EnoxhI8-OEptXfu zhgj3Mg2TxAm5kaE8ySRn>IUhKf}O9pJeK?RY%GFdYRBe>-@Kbi62iKSORy=G%!5l^A8daK9nflN^;c18?nR!q@=x zudNNJhT=w5X@VDFePP?!YvP++w{8`&B9#@Bn}H9v+IBgN6%8&5)ql@_=D*?pZ{zZRO5lIHnE(4Wj`_dB_}_E={IdrF{X-42 z5wM}Yqou)EgIIgP6>U$)-ENFRFX-O}RdPGQzUI1GP48GtQG@D)zZemIz51jF->9B~ zZ2~6^;F_CEP!`gKZDp_o?kf0jDm$jPO0zTTlw9TTg9c=z4E{1j3fkn%J4d@`KKjX& zXKtitu7!d3W%hY3<(a4R6Dht@xB>T3<19$hoQ65nY;dTkZX8A{RNZh!+M(Wgxr95k zJA`{nsxpuEr`xSZzH{7=jHx$%kzy*AFBi4=P;H5PDOpNX!EZ{ST-&ns7y<=6U^TcN z)O%IBKuYoFN4XR$pD33ihh_RQYuBWt_>=t;DSij{(d$?Q`W{j|=Jd1_zi^qP`0WNr z@wY*WW%cv_Onwki9M8l)8s6uCyD7BbwDIC+KOakqoJ;++Je}rJ-Qqf^+(v5LM>cyA zVbeV0u!Xa#E=>VzgxP?5Dk)9Er%K-~T{=a2YLkofSC6GcnxkQEA(4J}SR%CtGBW^gCT*GIKCq04DOm-M-1`dq>I zwEVoS&}`D{sGZU1;xFzn-G)Xay7^9fv6$jv+cV!^FuWyM;)Cm57|KE~{d^DQF4Pr^ z?F3gARvdj~I;`LdBa+a7YelsEM~GllEYVM(xU=tg(?Jjm^1;XDG+@vo8bFvwJWGf| z!xqyWU{FZG)m`E{a3c>SZj=Sw3=j}OQpiveBz4NSv6%%u*-~zf{V+3*;zoGEjqsv_ zD7?tsigH9cUpP0N{%U|%aMNlPphvIg*$^Q}3o1)Ui_W;!?5UR7+9(laqQ*fI>bD{; zkKzzaCj9LCmKTDO5NTam;_OkM$Gsh}*p>y3L z6OUfl8OFZN`s3;6&3^&^nDO)#ZsS1~(O(xCnUy3cZUr`k|9Y8)ca3a-x~m2uxSiOA ziTU8dJV-^X1$a4x1m3+E;o-$r0qKUpAtXTVUI+yDGJH$$bup!fq$#DZyKtuax(6RA z_jR_f@8^F>`MPa)H(ysETZPP~c#IZfZRqfopl2h{lTG_pScCZ}(gPQTpo`vaW58*O zGNIcYo(rS67QP68n~Vl@rxyTM(CG;+OmAGLckQgS(_4IzoZcTl20NJSPOrq@U2@@g z@%&tmrck}z=hcF<=sqGid_PS#$sYfMo05o~8 zo)ca;rE?#|H{6a9?U1uLhX_H^!GE`KmpD3)yMc?Duo5O775Lb zc+T=#JT8l7HKR7{tzbrM2D$ZB?f4?uy_hE-l2sd8{RF^=-^5w{b>URM}t1>%w zGn%$aX>*Wf4$)Gz3Rs4GHggp+FCXd7c=}+`<{inx+T(-iiUq=Vyf^MiM&0YVb7*Lc zMoA;247FP62$%B2gK%km)<>`W43~>u2m>r$fIqOT-|@w_U|Ap!Or zz8!L|!;S}1I#g^09oq7lQ=TW+KAJsQhm6=3*pY3~pq_@JtQ6*=LYvUJ@l~`!1csN8 zu|m}^bv(f)7;}RYiJtsCn>G+JYtwje;p_kWBsga3ogwvrB=z(-^~R8zO;Y!cQ!i6$ z^urw?1q_VE12bx^M)emiqm;}03vM(0(ny$if&>@;ASJ;(N#$xZRNjw62v|)rks(Lo zlNKU>wQ!`POIw+tBNEKRQf%?sIF%Vf|8!JpVy5x2&d%3$%s}*RC2=kR%0M*SWWjH{ z2Fym7h$wZ>UwR#3@)HW)X$VWzQL)=3N@p0=&Cz z`6);JDmF9+DQQIi&O%LX9@~`m=L$3GR$DMpq|ceNhVtZk5@ACy!KEic7YS4@ECm=t4)i;c)>Y^ zFHRiZEp{Y@s%<+sAm)>Dv0rf-=PW15+H5PrmX2&>Vgse-h+tHg4X2vj26%9eWA~Gf z7zzz8jl@o~%TWheZOZs1XtKE3Av9y$3(^g^f?;5eejnY_li&MyF3{GYROHhM= zyIwW|Ugi*vQ%%u1S|Gi_@MXw(3htvPu-x+hGxsHcQB~LbNzA~AKw=e*3w5dy zf@|DZ6l6ez0a2r(M#Y*|i>ac_-ed!5;r)z+&(IG7YB7goCfx!c6sMme>YoyW8`~c2UiKM+F<4TeMxmX?FJAcz%O(B zIHYv7+WWsy$j7grNi1ORC6IuXCnIFYY z_djlw?^BduD@#Edx?!rtSGJJHY(Hl`I~djJvByq61dU6A)yA9EG)Dfl!r8=znVrFq6tB61ONaUnWN6O z=ZJ70ybJice?Yjw;eh?Rd<<+?U(Qv5PX2L+`lvQ8HR1-m4omEirV~Kv%ZD0;D}B~gIJ1zucv!SEs%(mE`!8R>Fqy@}$I$ zm{s*n*P%J`9K$m!4I=uo$Jlw$yq+jAF%-xfrWcb;d>H&+#62du3?1-;2B~}f(9SKLSPtlqIa2PW&2`s+EK-$bJ%&PIQNSS9+ zv=)ZOw0O<}9NZ~iyMom?wcJ>p$L6?J2eVNe}0eG!mBVvg&Am2=L9B5(0qkIwWhc z3OgmhM=Uvm*JPKOfs!vuNhkd?7{8(R_1B>PD4HmH?K8*g)Oxaz|IC0;zycAI@rXp| zVK5L`A-d700Gzyp0W6wum{<_i8zB(0uu}`vte~cus0pLWqN&Rv8opepQ<89m^$jyL zDH-YTv0+H}zp55MEDQeARA;Fxi@B5G0s1GnNm|U z;SZ&r4_EDZq{|HNSu(2H})kdH+0McaT1 z)=y|l>X4@C7NJBV%ylwy;NG5mZF7p1uQz{h_(8@?!#{ABXT>pmaUFCKzJ1qgd&e3J3$?YhuY$uC+BJNN??ih8wY41 zI6WY%jDHjYr$()&NFX4>$L(m~a<#Gd!|E7Hf^r8SM>3G-i&Q8N_~mELrku^40nO(I znhg2-kW>Y}&qeNq;Ze=)4h89PY!^Bs)1F3MoVf=pW|_}Fou<7gW`1;KlsZ>*U?hFr zD1d?5;!MTQHhNJBz^ddck!2v(N?tijma$}cuq5P*Q1c(**3!-w+W~_-XkbSF<+Q`B z_cNzyc`Fj4Ik4z;tW!39Tt>AuPsIIcKxe1p0@?}s5Vd^1LZcSQkkObJd!UJHCwVV{ z=vN(YW>dCF_%V^5WVfzoTWwy(42_*JzxkNY1B&idBFVy3Wg20Kh~`8QIQ?` zt2+UpUp!m|S3o?xxO>(?49Fy#x^3ViyWwE`cF5?|1@6WF|q-wI^#`yjQq8Ty}P zZ>yBeADOPe4A3SfyIub)8!g<=B+%=8{fH0$7!fFummq;al}|K`zW6??qpTm>Q&q&s z1&a42fX2Q8IU_Albpxq96Wasi>2?5aoElZ5ZU-!@Lk*s-p_l;H*Y@yWomF9Bz4{sh z>mi@Ju+Dqe!g~El0_)r;V0}Vh&A@XuTMC~qb^R;)RBR!s2tWch1XKkg14K{j;e(`v zh-N9ibRXJJ6Kb7LG4Fr|M@WDK@CxQ)ziC<^!f}XjVu9myM0XC+88WXw$%fJdLmk;) z@lFK&8oyo#9gpa!G-mSqpn4VnFct#n>}T#W`gL_3FG^=14fMWIbPc-5jBF;`0^&?4IaDvUaP`>A;; z#`M4iGBeY z;205>w$9p6yqtH;9_^=lx+~xQWYaQMFQ0urHd5+)(FTIsl?m-SBy9 z>TncJ$t#a8&Ct^1EZ5s8<*BnV^1%kE?_?&y+6LtO5Z|q*LPp657!|Yk0*qK~I;TJ& z>pYVcWC%eS%dNgC^eQ6-m4cy5Jw9K$MxBe8>sYaAL0htiu-aEk;EN9Lshf5sUWxB! zvM-aXZGEK1gcZ)_R()l+isZp%WSk9?jMRQ?U6);>pw;`?6?SlgV$esUWX>}q#ixCU z&$p(&+nl+9A>a?9WT5zieWDPA@#|G<9#NTrKM>i0%uE9w{6{`glh~S*|FY!(z@N-i zTvU4UVDu3?K>rb z%Pm6E_=ThtD^!V%=HM00e0i?Sx^qG^o}442H3^nXuhW1XR-ib~>D}A2VLio$?EzAk z?a?-=>Wyrb&fi_>Mb~C3W<2k|x3Qyc#x(&>g*{^Ot&yf*R#@A!Y7$5tAF1O@^bo!7C(r;ek zVr)iv*hyhbi?tM|?cO%lE-*Ipp}8_!Qf%g;9GOA>tME;@ETM}^CjM(I(kU5Tcnw>) z)nOrGMD)(szP=f`(P!Jx#NFEN0$Lcu7Wh6c3C~n>-7{3O(=Y7WHXg{xT_u|F=o}eo&r|ziMF2NnroTZsZgM>YL}dV2zR1U+G6S?l&ozG! z;j?b!qX&xkb)dHreaMMkl|ipM3q7~?ky*7@m_m$6q;^Hm@&>@S)@V(SC%XTyY%V*WFc>P*~<1;y2~ z^9VzyF~KhvG9>^Ld-b8WSSWzWRzJRQ&lA^txar)FxH!3s$$?)!Qrb!Z^|G0mbhI-9E-`; zdcK&g=cStW+satIYywjH_^RA!7;;GL$+YMCUY&VkPBJIF&LD5OW}+haYm9rD_{JPg zw`om3<}CXXTsy`;dz3YQe5CTPiu1>noIkGQKx;Bl!9T-4VH0s+D>{#E;06U{dSwC;+k2 z=!=IeB&Xb#8{#M+=3%`d5a)Um+E%~w{GS4GMLK&T)JQyc@wE)3I4~Q z1N=76FDRP0lgf8B8{L{95QaSe~y{W7C-s?K(C1gzOe+ji-q%FZ&k_yg}h>d{A z$xlS6-t5VNH)>IoYJas26~_~e{_?b$lnIuuHPdKdkyEx*tBoi2ZiU=Y&M{5J5Dyv4 z&9qwZXbCzEak-c^L>PioP@E?=0y+%of;-+beVq$FGy~ zz43ee1}*wi;&;T4g5Tc%4aYA{nCmmo4{9U6s1qK+&!39-TgcO>(F*E^=n!ToZ6=?Z zF2UwFX2+z8%(%;735tkEeMN?;h(Y6EH{3YuH)+`z8z`ghNvPk3buc=DG4D*F)yR`4 zN8L97hZdhwX2{d`!(-URTZPBG<=-EVx4-yN@#yktZag*;#;ul*J~dl~hjUwNt2m+( z`7ldgH5ZMArSh=vXNjWyn%k3;g`fYZxO{;KU0x>6kPjJpZ8aV}@haF>=*!9(x$!6} z?(*@YN92tuI$+7Tg7jsA4jB;Z zRk95HK1ar_m#4KCY!!Z$f7I+@_69B$Wbe}~l9mguLw;O=`coR1eCjhivfDmuys%qn zJkXv!UOaZI@ag+<+xTD-;+lf=6&9v6VsdQQH}Mh^ApQc_&AKA0^cXD zY))N5(K>S-V8q;&8&qY;m)WngW$|bog%M`PnRNcv;dgU8`q>U*EB~v_{YXA-cnX-b zv0tZ)$`hipvGCD|&t++qK^Fg+_)=pn~A-Y*tlBOU>J>e`b>#|^Y@}}&L&_SP{nAo znzdIl6+bi94-rw$Lr1;+D9&yU(8A^#BS9JRQ>1ty+~@oP@T%r`W+uVHKZBQz$0hb9 zUc<2G(Y5ah-qqR(623xg^ZCH~D_kD)iHVB4FM8rhT8xk8(lpc4KwP%pzR@f4|tVmVj*#s@XD*|SX2GeB*# z`V{(5bDXOn1g)07(Jc7@78@l}1@xfHPOE`6gFm&h(Sl^boGF`Kr4KbNG7=MJnHNG- zeC&&IGVKJuIoBChfD7J6Fxe9&^1!W6U}zOntJyY@A}sj^JmTj9XXyvv z#%0!^di;?2>+db^pP%hxLVQc*-HgLB@T?*`(4j4t_Z9#7{_?(R{f{m0)$jkL^4^G@ z=H$Bw<(A6(kQcPjR>}LP?<=es{Q1e`{nd|^$RAbSSG|`*-jCJz0m8<4z;@qNb1 zD2+J}OioXe)WGC4`a%7NAot~63Ew!z-oX{jiQnakMwqYLvHhLDgq_eF^PD$v7LD?* zuNt5ur)pkF&^nn=W+pyyTf!-B6aO`$_R&>7VTrjLc*T~Qg&mMVb7fnp;9X1?3y>g2 z5UJeE4b!4VI(uzP4ncRfePSl4jljbU!4?gH zE%LW7))js;q}`YNs6%#o5#*35Ve5(P zDTemIAHyW`u`%cF4%lNg6yrRL55oz8CE4w$Lv<^AL3+Ogh&K=jpzgjhOHPS%GCs$W z`VLZ)XarZ1k;q2fz|1$1-rUP>W`4Yao0*;H+qAD(hYh?R4f!(XoqVqGgfjV&(wXcW z!+Op66Xc5yOEbf43t!!pAac;RA zV%88Bm`gJ$jgCSd<;j-y(fRaE2*x@UjIjBd%TLE#7SP=fBDP;?(VQ-iJvl0`;U&EG zGLW!Jmx~jPUGB!?rY`r~jMw*Gx@;$^XJk4asfMC({lX~r-VLb3Gv|(N@bc%{^jhb4 zXgoa)4WNdx;31p|cgw{fT&%hg*wi<#$BOng*zSVUa+n6oz^wHPi}B)x$!s5J2Lkcg z<@=#}R5ccHKB~u`$moT3Z)D`ZkJ)YgbN7-hkgHdMq8AJhp?L872mbm%X$&R|fE1*G z203JYbt0wMYOt_`=VGi`;I`W2wmL{#J&&!n_5FjdDK5e9O(aKvBO`%A(+D(qI&|ek zJmANta5N2w6DgE*ZjWy|4H>sh$ahFo`8wk}BeX9jOFYrEOQLBw4n$iDS6e6IDM|R4 z;_&E5^a+&|zCOI)5*#gG)zszLn@-6ak?g++oIWOO{`S!hU2AXDYUxraw&=IrY4m1Cc3Af0NF04*i+1Rmh``_NqD|cfqA0N3Zo+E@%k31)a$t#5DB^hr%Raoh z-^J1?7A$}DZ(#YH4@-)8rf>~Lk0pj04B;B#7cOg!DCQtl23Yu5bQ50}2Awq!f+eE0 zHXYJ{@^aK3(vLIcP%R#ze-NwAOB4MTA?*M#Y-5{3)D^WZ^+YC3&#yvKBpnMV?2p!; zu}y`Ofds_CbT`0Acs5`LSd_!jLdw_^`a-= zZ+-XIyNPjYSO(*ER)%rQXZjCNdKK^8TsKNZfDA*QGh7Jymw6gXu8C)41Y5bO;4 zpxu?cLMjkoXVzeuS>92SBWJ*0wm_Sl-r%fz6_oMS7f}jNeh`1p(D}T#b$lmbXyYUL zK1x!r5GFK`Frjw~WdITR3|#roJf4YLasxR>$|DS7@SDfcRRFd>JT@v%C{IS-6$B|U zXx+fP^y#mJRVD1P^bF#ly9?Q+GM=Hs*t8CIMWA^QH3K;zTF$6NRTd)f}u_x+0kTV zYWzZq*aD}d1roU%hoJ}?v1>E3_&*#mLbg#aD)(YZL?KS68#t*YVUrlM(eT{K8bsnK zoB9hhE_D_DBpMM2Nx+nhl>Cinc~LK}jmrRZ?LX0Afs8Xe`N#Ze*7wAW?JPD@T%Ld! zLn1KN`%{f?j)Et_?I2tj2|YtgutsA6TRl#pbFM^VZN}4rOW;hfqB)TlCY+MjKOb8S z#0{w8;_?0R7|P$#8QO_PW>MrOJj!?aE^29Yp1kj?R_C}h{_OIvZ(E%m&)p0Q5NVkL zyOiv*>1nbXh~WEbSDlcT$X}vza$!n0MvAVXV@Bc1@GA9DrTQv0&LwK`_h5qGB? zM)GgwP-;yjo!OjERuWZO88`41=>G30D zWOEt@Hg8?lJ<+%$dLeW|Hk>nM+S(i0;A2OLen(vPW}ACM$qECgN1fS5xwumF?-uNd;9|(ypn>Q zyc+d_uvfu9eqU;>u7SazPT62QvfASA6hFQ z0+A@EvWjsMex7sltc}K~t9CGJeKTOp%8r-r@|-cj>?i})xEi(OC6Eoq(}Tf5mPpf4 z@CjC-xM^GKBab8@(W1F=iF}KT<_<3$BWdY8c?)WHNtfuK<%UO1A{RCQM-xI$VXTx*3@?iL&5VI8fo)UNlm&^hfJ7`&1hi zp(8OGG>DjaQ@$@n400A+O#~(hSQ#8)v+z#g=%Y&j4PUIH#8pD#iY8#~7uImE6ef}Z zSfD?bUmUIv=dd4f_JcGVg%CLVQX$%+KmL2A-ztXTni*N|sT6KU3NJSlicZ`}ok*%W z{G{~d<)rWTcL;*#FaDp=7n_<3zYlH~`u+i9|3AX7E+>71mA-wqhQ8|{e-P@ikTJ}a zz-y{K{++SM6%@aOs*jAP&S7P^7Da<%A6i2g62PHeILb3PfMW)GS!L4le*{PLSUXGv%-c$Pq}d*fks zp?CgVVsT?2(%I{tfW^%)p%WIO-!b&kvj@o`r7ar&pP=!-gn5Yn>rh=Hsntr@@IWKD?!rI3=3OmrBM33tWLULU$c7zyN`kP>dI zh*K(duS^T9J|U7i*R+dL+AcDgb}M;T>^zL+bu)AlKM_eCU|Kfa zDnrXL<^}X4DYGt3ZVHkmK4mn>mgi$w@jgK@jfz}KXT_`+I}?XO8ZlYr&;h8%9y zb|8U|Z#50qI=N28GZnn{-AtfqI4moNipJIbDkN7Nx#BjL$%kR3?Twz#r+pp{&CuE= z+szq9EXFUSlq|pm`t#|V)6X_8N%e_UVJ{r+APE2hPtyz)=Oz zIb8K*---f7&3kIafU2(oSdc!AMUh>lPvpoi2>Y*grB7lMh?KMhS%*;ng zu?Pz4acE9@L;4lx@n-ab2U8elii;QobV5ju!h2KPQxhkBXYv?Ji|X;*CJ$@0$!(P1 zX^PDdUVnS(Lz{A!|Dow)+NrXupI#rM=l-Slw&ZE`b& zr;mBeRuG=Prk(Uta8Q*Z5=#GCb$SJN|Dow~+Npmc2KR~)?N5lkT8BNu zS!x--p-p@BjLDyEuhKJYQ_^54-aS2=7Mi}+OAp6;(;sak+4kx@oD%BELwNmO7S^9j zzhB1Y;4ENv4%*XP_9_`xzNc$$Mc!g!IKY??dv&ZSA8N0T_w26iaeMvw7JG4x{mZsj zt$1zQR%EUQzo5NZ?AhB;eDC+{XgL3dK4=>XPoL9HdT-aThL@k^riao$>|xt{h`rkN z9XAmeWZSb&@8(WlmzkbnuWo_c+g{g{Jqp&8;K6 zKSOV~8M5uwGj19Q2(SMRTim7x^|6m<2SUs5?CEtleRJFl;psix04+RyRy*lCxdy|~ z7o>l#n;fEVQ{Hqt4}7xq@yb=X(@%dZBRxYOJH72s_vSM=-+#iEk0%9~Lt)9C)D5{t zipM;O<&E1!*7zsb-pObWV@tc9i_TU^Fcs&pOU7~u8Gtc*#3TR)fpA~N(&{0vnUNo+ zpL^o}7+%^%Tjz}@(B{q3W;p-mTwyT?m7j4~5i=Brmmhky&G7xwFTW;t`5&5oOFQ-Z z;$`d&SMRk!*W20-Liv z0>bO}vatSK@zJB$i<@PLzx3=S%jb%ZE(j~%(KCrGpDRAv-;@uHj}G+grtNWi{dwoD z9P!b6clx1|Dh+-?dv?DYo`&;xQZW83miW&&PdO&$5-NIPp^E?K5otY-oZHWjCK+;dcL`H zSXZ4olPNr%-^;_Ap>xQTTvq$$N5kj$J^}06oZqwUR+55p(&Dy`89YuKley*e8JA%x zTPAR2uKE_%itH6wd_*}+++p#tJh1q9sZBrFrXL(gKT*=LMk@Uj*MW0|^jC~&>OOE2 z^GFdO)?v}v%q7E(RMCyNQ-ps?|K6GM2%z}FuDXZI*O*Hz4@2!sPrQC+SR7t{lbhlD zrS}+T8wfA|L(_-0Q~yqGfZj&@dgU7-W^)-zwc$@jnEcuP-kf*AA`PQhePQ6ZPJtv9iQCb`CZeUcKyi!uRdy5(4P$S{H(3d;1?X9 zboBgbD86gG^l<)7bRBAV`lfc$FLxbjc= zOBv}I{$y1k{rmfq8_mn^?fVmMdUkHQCYL|?V&+flPyYS4{|o*^fEZy(k#`fa$0zIV zZr`6Q8e@4JD*uzJZE_p_9g9Y|MK6t?T7o5RoK~^W%kN3 zs%yiaJY@1i-D-k1=`D9^P)t%N-aEU?4dM3w4KF<$?=|jvLbg9SJ>bwn+keB$!uoUh zljpH_I18ALmH5BDbnO!-iMGSKt8*8aEGpO3MfRsw;B z(mH9@?Q?WFf`9cg&^TiorW;; z{eQuq2oPV*%RN51{kHb~$>mj+hoSbR&#!HA8~&uj*)~JC{I-|g`<&e6e`xwC?bP36 ztlNILKbeC4!dYf>HA=PNPfj=av;9fa<+drmJqqqWTzsXQCzKzP+FQ@M#dTWQ{-l$; zmP7)=>-Vy>XMZoicgVAVnd?p;ioE3VC;Nw$U+gabOL>ZUTjP_Dv8&eD|Lpm$Pd&dY zVB=4F{khAluTGlv`;)spKWpm?wa4eW+pWU!9TxPr+5TdUn;~4EPH`P>c>0QV(ucZ^ zHkAIgZgPmfc;*>bH~~VoKY8fc-04%E%Sg}gCx<`pPyhb@QC~p-{09-lgpo+ zJpHHjCx>BG{eM5-B|toc#r9nDT_bL4-=Fk2-SRNhzN|gNCb!{F=8U!(!sWZY^fhPZ zF8@Q*JNzsYV8Y=3gR=Vxtwq4s!Z&!2|k`=ys2t}nN^4mCWzgX<{6 z(KlXZdg@9$6UUA3kDBo6s< z?mI7+KZ#ub)B2N-u*m(t_a_3x>6Vl>=DWU{+P*(oagyb6sQll0vQ2KoevLWBW(b$> z_R?=THFx{wjb_K*3AtudvT2F+VCgOnEcuPB<)TOib)E^yQjBa6`H=* zOAp6;le?ak?N81NIJEHky)3Lhm;HTtP6#kNVz_6POVNwfa(No&9r`}r4~?^^6G$A$ar`-A>Adwep~b*Q8_ zJAF<&>AhV?8eV>un{N0Yq<@$@ybbXeyFTVJ7YJnglTMH4PG6Uqp5ae!pY1OnPJfT% zZJu!Xt+2^$*sD1w*bL$Ix0k-=#N6e7XnKd-_PC=veIG7gi@o&l{;fFQ(w}V~M!0h| z6!1`d7kgP)e=hs*C`LP3^A}$R?N=`Qa6wr4jzRkr6GaV=H}^N?L+!(X7h4!am-(l? z{=D;-9QNTociF_PFI2zo_v~9JzLPw=70$mNt|1Cfzonh@o!kLKc=?HLdMN!pJ^Ple z|6e`m2Q@o=-9x$4mwGSX0L5(iyz&u$`EdF>9Aoo@;=6dHO>V5Gob zUH*rruW6_LIbJ*#9?$Ihc!*loAWCW@o>}*p5&Nw5yWM_eyDBmtiubARa6R0f?2LiA z(U@?&dz@=CWXr?tZW^lyZGY$BdTlOy^({8?X4$J@L3^6ZUOgXH{#4i8ioE5rSJ#;G zq4w%J&+Zzy+O=2vd-c_cne@jq2YPnc))%VpU%KIBIKFQL?QwRza=B}0!}+_Wo%AuT zVGS?8!c7mQf1DSOX4|6??z>IIAUpl=SyuMK(|5f;BRwOYSsF+WjE}$9c~?7vjn1FX z2#kKgRGxQLl4#7{yna~cJm>OYcI+*W`wpjAc`ZhW=De#6`tCtvTeg4Qo-$$HIT9-W zc9$6?^PM9(Z^GSn4pPmYcWyhEU$O}u8{f4H<_r@Ff7yjgY+c#ITxVx?V6dD^5iTE_ zhFBhj+K0JAZE_p_VB#>FA-w+f(&r>{m;a&ZE83}lmKzY$zK6Wu-RZ#)vsZ;Exeb4? z>VdZW!FJxjkEKs6V*K^PB7||FOPY{ps%2S0~N-{lOldpVZo1 z{sqT}YrQ#)Q2w?%{utvr#BhD`#wX$Fr?`$VJbjUy9_kOyy}+ttn7zN-O#}$p{$QV( zxzjt{laZd`51t96htoeaZtDoex8q=&+=hOva5IG0-(GqL*ItH~|DowU+Npn&8^5<< zuTK9{h+57@Sl@=d+Q;MvJ8Odb&(3f|WfA#Myl-`v+rsVDsh-UX$7_tc-j;2zR=H^; zAhi8c-Q~7+^?Sg5A;3)X>@DfbWv{-yH>CWnL3^CbUOjKhhuW*Z1x&NxO?q{$2~Xe2HN1wtApLXQ$to(@(!MBR#`jb-K%+9*7UO<~%j&I7bFfsv<0Q#WrVu?CR{W;WId1 z_w~$-kah1%!`F9SLIZ8at9pWKrFR<3-7gQ~7YVvF()!XHk{Ba9QkZ-1M2<29O!iHZDo8$A9CUftR3{ zy9Ul%3*cWg@ekTx)M?KIAkGzdDrd#2rsGL$H#|v8R}p6O^w)k%t}aLqV&8}h-?4Wf}j#0?Mss*MuenI4;3N~5nY?$UP`W2*iR4mF9ibZ+q7<4%O82cli?a>;Y zt1bo>o9yeb8Rt1{#rw*lKiKG>=RA09nEn6(KiN+GCqBN3%*A~}zK?3c^+!N%<2=Hm zIY0^;QZ#4VzM?+(Ryon3ZWN3D0HvUAxR19^H%|Sm9o=yDCjD^$P6FKbcFwx&D?5*5 z9YP@ez1lX@7ssP2e{p_6B5#2$ACTY6N5HleQ+D<9O^GH9rW)i69kHe^f7n+JG2a7n z(b!Riql8Rx@cDPp$wKw`kdxDh4WsGzonK#s%S^BSWJ4)Ft<|bWq*iPLVIRLf3Wg_e zM5-KXpEOq-`!65PnDElI1!*8`9*h7fId4vs-b9=WMBfsJ*G)qTiijhc3+*EkEFVhl764zZd=~OZsJ9Gy?Jq(&r^Wi^BvkVS`+!>xUcA2HDlHO`_=ts8i$d zFlMI~H+30UCK|OfYEX>|in=rK79g8S?~(4FYUVkx7?!uDZo(hu$Cn1}anZyv1U7KS4jCD5$Sax?kILB#1DQjg!RD3V@MwH7VE}=YeC9ZR z{({=@U}#_q#}xej^2BmhV*MpEC)~`HiAKm0@B|3>GKDjxWV2W~*b@3`B22X&UXth~ zu*Xcxps;Tgk7?6~cvcg0i1S}lEyVe&YT%4HZpAr( zuY9ip{2q%_i-BzkcQloY3?0Zu%B1mRWUp9XfJpjbM2h7D3fK^2q@x5*Ehd4J&A#v# z{_GJby3>Q%mpd1clq=!ntatUFZ z-+HZYE^A;^3%jy}_5|PIS%&Knb5Db=_fSoeP0OT3p)A{qI!D=%`xqJ>!xtC}VfGyq z$VdPLaZFajiI91&zI-z=e>0rh`~<@i^O>JsFVeY5NYwaLsfI{YSTV7e z!me5JFtgx1XXq1>X0tW7pVsqJJ1r^rv|l9E6C^AujG~{WD-UFpQ>qQa#J=N`Y!Dg5 zMvDr!k6E4xKk8eGFNvfkNi;4I!m^QM`8*)B>MdWIUhmJ$%VVR#MF6}#?=PL;UTXpNQ+@ay9}>f4uo}G`q+qSA!+5N zUWQVphrsqh!xw)3r2VS;XjS{Vg{r(l86TkaILXhDf|Ky1K4t3)&FSquSrqRIkWAPJ zutbEV3UE)5>$eK>%oE-z&&v{xixOY1Ow4bAJTH?kB$;5f*XxYi93lsK-oUGAHUSOe zy`-Uu)si;d1W(qFsUJV&OL_*6+>xcdCnvgcbRb4^{6gB&1?hh2J`jY_I3^!RewqFz zb(i@0)C^uWJKg^%0n@Cz(FCBjs| zKrkQWZfa>?R*|2mpI_FHk0;i6z(vq<3?Y)ZkJ@{;1OoG@)czaP9;ga7LMnyoA^6&6 z1U$w3Z5U3#7fdzw$ON_!1Goc@mv$wM$;iKt%i#_l_=UQI7$b!;x&wH76BH84xi&wNj@+Uw~nF2NT(R!x&p3Gtbpq; z33j2rQCoz<=?wU{byN#;kZQ%I|6=K-er+L0>3>?&3bd8p)7EY>V>rbY~409u4Um*R-F zIfVs@ey^bQYmsGgp$SbZXci->-$*gbV>@ml#~=k2v>FI13ex>uihR~ydamu*c3DQg zYa9iu7Zny`P?`P%`{U!X#tduWMfg~`z!0XsB?{>AOYb61`UX&GgDdKFqe6OXwvAri4_&Ovi*;g*5?9V1xS1%+7#RF}xWg zzo}UYbC@yHWvtOCj7L7yayyC0tq6F&(8qrx`FX5DLYQ|UR|sMDg{^-Nv3H=pE>d4V z7i;T9r9PC!hBL|n6IPt)w+vsljZf~3i2x&1b%FZYl!b33^eQM%Jp|8|`U1aF8~EoA{+z)- zEg1KwTKH@u{?O)tc-Ed_XreGQ=eo@=2{fPE&~)?+%^%T3hM{R@P4gW%4A;^$rfyQ_ z+n^M60!4Sa6d9*izqu3Q$2yjVcc`EvTg@M>FVT34YQ%~0yqC?OD)Hs}iTUf$4(A=D zh-;3XQeV>aoUy8l%M-~RZ%i!zAkpg$o!Fs5$0zsS&Wu^DLrq-(&z<@R9v#4u>wf|X z8Ne~j74BQstrRksFy<4{3Wx&KL&&cGph&-GECC|&S<|Vs7Rfh_H$Wt2>jP90_#cH;XIQ4_!S<_U^PHTJPSBcO)vQRY@6yC_e0!F?{Bl01Zbb}NE=BH?P_kj0qB&=DX?Tn6%gmDRac6n_ z8Xu#As>J*c3dBfj-9UC~X`OV5UNP9IBBCC0K&nb-Kl)}{LS>z$vX>dI16)T)o~}*_&S6|6buZc}nlqvp z1GQnyqH3(`5$<|I@^=i2i*6WbV*MeE1cxmu+@XBPF}7H*@h(gy^i4VY0b6^Y8&kD^km6yBrSOf<>9&!ZikOTw^3jSrk93H z9=R(dB9j3sS*kv;xFb1BglR+YIJFibA3x7s4VQM>K;zOh6d%o%kC7Z=^K0L`@4&J5 zC|y^8q338mS%V=y%BC)bf~V$zo2e%aOPhscenlLzGLJuGxOE4Tf#eQEGW8_wBHCix z?;L5{9&Ofhd~MJC8QUJ6-8RamI--`;zETyPLo#xsTa~w#G}?CKWU0#QhWpWSluZo) z7;rbMdD%<`%m(4KeEqm~ZFN9BFxe+M;4Z>F)0vBKMH8l?5U|#TI2|~<%PKp{j?x`l9%ExQQ_m)f!zBVj~BJi>2#dcIAMg`HKu<2!UsSCCll7Eze#`P z47w7o<6^MLf?YEp2iS*fp9Adc5QnGk!ynte1R^DgaJmwpD>awVa4!|TJw_lJ4^)xIqIOXR z1;q@@O3=FfHg$}-tC^{W=?E*JTh8th@Qy`rR*$brI%lHsbd&M@ymqkXeW z4&q`KUqB2M4(&j%B^oihAhA`gkAOQ6Ni+U11iXDL2$Fin*DJJ- zsM;g`5cLNimk8tp#hVOXCeQ2)t+V2DHtK~+cGJLA-E;uCVI>V#ZX&4z*(8BRXQIyH zZFKFX7*iX^%i7H()(;Am8_CGB);`E@m*`;jp*Gpn02{`T$;dq>dl{L=DLR~|FkB}g z<7xxhE^`;N9@|6bmmjbnrt9MuHlv`K+|x`@8?z=yOJQR5TI7<+);e5=@E$ft`paDq z+lhCc#mDR~=!xQ99DK26_GalYH%dba$(%JnuVQA^yx&mnn^VXfh4I`*lU??p9<5V zD*GXSiSzB}+>UGpK49?>4ln4V!EElB>GvWwmYhU5pb2!#C{;zm6;>*xJa9uqjRAzm zQvW+D&~>EAd~7(iC(v|um>`z(x#7TbE|3kwbA#H4iHfH-`G|52cq;c))<6~}@QmD9 zJcpwk0O{}HN$4~2j1#m35(Kmg0Sz)CSv>_(W`-#c0O&7R&NqS>bJe9xbrhJuLfX-X zVS1xtXY40bq>dDzBERsx@V0eH(*F2`#9%?Vinw%K@vSO^&;hLgCs{9e$59c8sdgpL z5P@imN!G;sDd-OhQdd#@pQHG9Nq}9I9=m-0B#Cu2Bq+-^btb>p&miY8q@2bpSSDAp z3BP?)6elsa`&g$au-c7G3{Px!zv*khCQy{Y3R4}f_@CTQ#!W!zH33$ZPd_Uv#ykNY zeO9zRWE1ty!w;Bz0Hv)FCIE(*015n2?mRbL!4$QK8ylz*I9a+unATvXa~sU+q6z5h zTk@gRmu|<{bx?l){V}h%2YzUuT38ZtCN+Tl4u98g&c`g@!MLaB_um&(U1xH+Y~hr6BsCO|#k6Er zpdH&2$M1&%%_wlr5SJXB#i&$os?&k^!|FreSQs_H9)~5wNDA+_209Se6{b6p3*{-p z^)0^!yBhF-wyYWe+7!s}sQQ*+fOR-hl|jt{AiYI>ODj_LvE?w&BK$@jXRr=zn>T+j}uS zMg?Rcu@)p@PO%dt=%oG!0EIneUgAWoG_wyf_h%w^onWj=-`M|X^kp4d)?PZ&pw%z# zzqC`|{gz@T@j1=Ny#engzI-b&|7&a;cs-H7lAR>|iC)X8;MKgvltc}$AXxejiCZnz zPdA%d8_fRP>AFURa5F zwGGrDRf#96KgZ#&|8GP=x*$cxqMDtU$Le%ZxjOYSLN(5OohTOV$wHNIicqz#5Z`4Q z56X*Kzf7KniK^GH>qoJ}av%JtQES-T4J?RWDAlYFi4XYNMxk42f@-j<=dc6F;zP{@ zG#?cNNQWw{n$-f4Q7+pRI`82jC#l?_(xKN zqQzvbNZo_m;4T@tcYiB&4Q{zS;s10~pA1pNj>27%45WmE^0u+7cLZceu>OED5bMRhj6qW&Y$5F!o{CXG1W zg*isYTd}SE^~9H}67#Zw4)jpu1PLK{q@A1IdV1Dy0Cs z;!3@vnUtvm4WSCuAmHYss{ptEzL*k7Di z4de@A^DH{hHa6uxZ2B5(;=CGcY*!>7V39m%K=NdCW!bXquB85kb#+#zs&D<7F#%$q z7F@Tt+NVwj&>l%wT>GR2Q`>Ux&Df#`ds$oLO>|PhF`XN8#(ujA&3O}@91A8ZF*&?M z&CzYCw=uy}-*T>4-bdyBa=E_;_o?~#gZZ+VAUeG{wFm;5nlDo7*)X9`LeR&MvM4{6 zy7LQ^yqSNd;g2ifKuhx0BaALcA0VOTzS7ilGToD1WkGuEqWpbRpCdV4lfE$3j8BF+ z4_z(;&HMDSpI-LX%k_Ghq?bCqY^#^w>E-Lor1uD{$na!&phpSi_G>LOi;)~!D6Z{!-&i$G~AY&odA!(yBBZ;!KlC~|} zOAwJ{YsiMtq@f5u;>?Hk=mtG2E|v?a=pD1*uGl$vEUox+5})WhUs4RU39a^>m8LIF z#&r2*{&!aD*sz&gaGK8MJ1eO(Imht$rNX<)e&7g>sNoz#*nG|ZZ+?{Z@c2KyQT{?!)~^Q^Vj7_xR`?X%aW(#dNI^u+eE*O*A1rCleN1lEMjfXmjx^NcGFn^aa?gzw_lO6*Dk|b zsENiR3M^}@Us!?plO@hMBx^kdKMoDKrPOdlRYGE(ORY&ft%c~z&QVUYH(hE>BIGij zx|(wKWp8xoVBBTM*F2pJSEI{d}B=o#-B*1BYM zml02B|BrF|KTP}ooJ7`s2!8pQKp@H@5SZ4-FC;Mn#2HlpVvSmtWF)y)4j?MNY!ir@ z)Foy-E93%fsCET7rEdYQXvBJhTsYtO8sJKB7YTq^8=E!glNp>Ee4kJO7~xOMm0txKDeL4V{gIBqM(=JqVQ1Ep0bzBj0q~@euTO z4^i=4{avN~1@&XmJo*b7;6k}Yp3*M2iN%AWO0E4_!kVe0nA1CFc$ctv+@F4 zjPzkDs7&Ypt1yL^z*q)L;leA}gh~<@;$|6%p&?!nm(wMDeIS=hxE*RxMfxK# zQHq7_BdTH)8>s4-_NqEQ{SnITpGoD2EGo-0vm6)9k{avhp5I?_Js3~~_NPHtE6Gl? z9$dxF^X*H5hg&EQwr|pS!eNgD52-OUvL#NTMDol+R`XA#SIJoLyq>$$UN{i)bcLTH zFFqqZ=YSr+E?L`Qs;VFnCw-i4WOoB_K}%?k02!ADnrc0o{4Pz*H0<{b)MY3f zNwDCIoV~`lumk2HrPUk~0Bwc>-2cJRK+`S=hoab=2GC`S5Z;3=p{F~Rwk~5a)MmC^ zLPQzN<0p7RPm5GwWkPlQ5N=lRiMT1a5%Ez-k^VT_OAiS_J&y8l3b3~}^|D6Qo=NoZ zOS7v=IA7?AUR2vD>qL3#655*<$W&Xv5rD!nEIddPKnvAi+GS&r= z5uFzo18@4Z&?GX(=YXUR1sQ})<`t%0gKp=webMzUeqE>3Wc2^fEECW-(|=VJgEJW6 zN`g!m+UU>=E~Q5$>`}~_VVGUUP5?Jo1Bf7c6Lof4qG1-m6YX)kiS9_t=#B^)x?{wD z8+PZ&%1(-Y93}gK|X~}sCLrQ4;QAldjY1kp1^1Dn_Cw{H-zgbeCfE(;74fzOdr#v#`m)35o2UA&NVk@ubNd8jAfta4T z?XV~H3u_lRZ}k8G9b6g7kdIvQk151NlM2L^$p4KOZI2UM#YVmJogOELaC)Fb>xb!( zE~8L}zrdJ(rqs=z*DtJ=gFFmfA+22hq9qQLqjQ{<2=*(TOgB1{N`d>0VpK7rDb8bm zqKQa+a1qX@sB8E+0wz2zx)sN4Wysq&gqjzvC25{OJH*M z8Z5wP07I28klWmi$~ zA6A9sOg^+PoOQki3>-=F+>M=uFRor-Akj4i6&b!vnUsg2d zCFB{zj#dyK4CC2L*a8ZW*?N#Ff_5{3XmS*t?vnlt6DFTHe>+nqOy=oj`JUh!4$cis zm}Ky$RQUtx8;kydKNV~bX2%QX0%Cc=+n!h+h~7t1oCq;g>c9weM+Z97*QqwQUDe=x z%@Jc`&<^AD5*%*3$v4B@Cs{_OENZgnW9-S}N z1n5FG(mTMpKv4EkRRXGFLJ`^RGsA_YFdQY96PnteXLQC?*UR~NpgKhx^pgkXH9a4# zO^Gth8AEvDeG`q0?`5(UjXIOw^rT#0X8#!NX5iOW;q$%=*i`fahHGSLMNS|=fsAro zBn*(S6h<$MXg~5%IFO}5aS8Oz^=Y65_-Y&EJP?f$QQF!vT=Sgg55NlQy%6(2XGu&l z^85?>b zz6Y6APE|>PivZW70@pcPLJc;L2B^6qlGXPW^UwnKQP#Iyv?WzWGpg*LU1dG193`5W zdRS_{7&RZK{j4y@grVbYcYAy6T)|!m-GU-kNpwc}ap-0wen_>7q>`Y<#Se4S6%yvu z3J2uYv>GZ=A|9C#jV;WA=*hW4&F`_GBP3Hgc%$kBEh^4;j;A8OoxZ8QrFKhDr26^A zWYacTtqwq|sjg^K-T`nP+XXszo8M|>*oPS!AHh72MeG5aRSps>A;J4$mn+2PJ2Y9} zax|zjDiim#4Ew)@TR#hqTl7ka63Sc1N=Z9`GtK;=NY^`V*) zOx=nN*ZSUsc&BG`7j8isYu0SK-C6=vK`C0Do2Vo_V9e@ooE$RwqD~=q-y}qR#$Zij zch%&A^dIV*@4yBcEDYkET#?pvv)#S(JIPMNy`^NabLZO5p>(VB&8uja=S`;XcQ)({ z?%~S3Wk6Z=MPr&5f{df$(KBp zk_Vy17S>soQ72yw^-&DVT)))swI#Hye#gzkS9157oWRmP<?r0i2e%KjV5 zqfSRmm8D-vChj0^%(?_w)g@!6GmE|CoU{{|gYQxKnFG(3!JlVx=-0)r7o$rO5(ARV zepWC(lK2Yo5#z;Vs^!se|wj!_i|+JLC@ z9p)_3_t&>vg6a;;QZ-hWAb}=CK!{iDobdt#m~Xi%USr)-uA!B)Iy0!ss-~1w<)z9{ z5u3@#o(YTd(euc@TR1qulTbJQ2f?=ZmpTSHqBVNoj-ZQTNO$pXiRq zsqXGZ+3l$DyBR1lDEa7HrQa8VT>$!7sUczfLQ({adk)+l4;b<{Xc!Vn$ss5n9S{K0 zpc_u7W^6chwp&GxG{{?+*zt|Am%N@AC{9Cim2>f1zMPmx3~tr5+t$tIYE0~`HiobY zSHWc^ufVNR8CpeA!%+Y{IAywIk%5>V7r+x!V9pMquvD>7oSyO!JUU3^hnv&!(u)sn zb~72d@b6jXqt}~?p)w|ce5~pqRvJ~meJeLafn9G^IKKsA5an|r zM!{q>-z8wZWX$onXWwiMsh z)%R*aEI5uA&`_6C{UTbgWo&2k&8oAupa(2*MK4dxg?&AsL0=od{?g_HA@>wd`vw3Q z?%X>`Kci4gH7JpE7~H6{s(|uB-yqL16$rW-%(ms=CVdN)6h@C7iUv5mL9S*8JH?zG zE0z^8rW%qu&yg$N(frEP?zPSoXWVwk&= z5TKi-d&oVb=+m=_(Z<7>5S%-}TO2J}qPI&k8hh|7{5gO=;q&xjAIN(1 zZ*}}y!+5Nk@tC|qTu#&oK%HDOmsCI>IZ3>+KMJu1*$EDdH>PqW6QA%^Muc#STpPXx zRaN}UR~7chfPfhw0QDleKZiSY)D87k15m4MvRX+~=PRE z(Wqg3FK6THe4IK~yiOLFWNyCm>c?aYTQIHdZ(EZce?UJOxqpGbMe$J4dsub)K9d=7 z#K;_MJCBXLrlDCRbrS;k)Zrv5nMgyZHNM`LVSRneuIO+i^>h62Nu*znE|lqCD}c_c zouGRSl>@I>8rdCmxtBFq~g#bSTI^J`kUop|~oe-WqVFcHdfE};SC>FzN7QJQ( zG=z&21!?$W?TrdM*wqpc5MkG880m6spbMzhCs7rsa`9`eT^CUa4xuwb-P8_&19t0bAFKlh1xKpoIX47q z(Jia8*uc&RSU@~8(B~LirqzFeIy@TO4X^%Y8Cms``77OlSCuADDs8`0|f!-OP zrQ_RoLN^yFgkxM|5%%vi%^7(dCD;@izmRn-Fxy~MZ1sgD$VZb|5lMEdT*b|}?iOi| z+P*+=LD4E>Z)5Cj3HMj4^H#}+&|$XNtj9tdG>r?)h&JlbF3a~pu0wcph#2D~cx<{L ze9|tsqyQ!~BMmB<1djW)85rTV4BMt+r~)!IvU@+!OjvIp@9Px0!o(TZu#u_5W6{PfoW_d1v$MmmwyGTgB@E_M2qycmP=8Km3pI}!Uo6S*7m z@i8V~-dFf6*2V190#|0TNU~dWMHY+y+~8v|1X6->i3YH@7o0mxnDz zAtV(Osg`8^2v?AOceQN0Vvw-yT4fvO_6*x9JhnxtE{O2WhD&t6nSC+9s42CZG3^i% z%134OHDBU%fpeecEFK=lyT61yH7LTzWuZ9ujVu(;st-l6lHRrICqeO}5{u#?aX*Tc z9*R|AC_X^+fa2^B6eSJPB5B}XHj0Z89#3<|C&ExXKjbNWIAXgmIK=!yhqyQiUBaex zO2=f8)K2(q=PWzPJ%>k_(r2la&Q1AnOBdQ$H2hDfM>Sk2nQADpPI+o~8+xe% zm@@#N2=qBQf_(GxEHZ8|JeE%T)*Nk$&FLDr#Dffe3|iwC5=4xdYCtVN=b4Mz?>-BO zF&lJh4$@XhEa0ZAcm))s$m(u|JTrN~5Xs|8pN#Dh8O3Tqfz#)|*#s(Cf;Jc>V50AI z=#=wiyb2fQbOmgA*z%0JM-6!W$QNg0m|7pr%Ny|AuAM7zKQMy(udloJ0NnS2MIG?> z4y`+&?Fv$s@60>?H)hI7PzW zY5Kzc$Po2pqO)`6Y8^`i!N*XT#F8j9F`iAF+KiP3jbm7;&;fdcu4K0kuaKT)$b2j^ zV%$g8#LLWWFr#nBg!$P%aeKNu5Laxx2DwEvNc04hNJ0iq5r z%;pv8mfv1wQRfb&{Thi8KmEzV7p<>n-eI&Eva-D9DBJi3e z36cjuNgjwNwzHxr41f-@$gg6T9@+N7PY3%vX2?_@Hv<2)U^l#$;&Z&~*{r7nRTHo`~kK<7G}&c#R_ z{+Z5|NsC#X`{P}xSM*}BWPlsz8}0F8w{ug?2{qI8Q4+8uq)>x7*CuD-9Uk`z50=6mx4iHi6y}gB#xMmDkPU$C=Q5|O z$H5_`BTAaOESW>Eab=9BzA}me}ZcfI%-0;-h5Uu?C0!z^($yppP+*ni`od@#3E|k>q zq+5k+PEQO{i9!vfYy&s8$muV^w!+zNEIOS=9Hx(2R}x1qkLxk#MYw|0X9##CcDfba zIjFg)cuD&A=?w=pAM}!ZcOhPkmhJf-U^_a$B0ck4T(;A##eT6YUwQi?60;1k<}bk{>nOolWOv!x zKS&5NBGqM}?ly~|A&;ICXV5#K=OCdc)gP*IP;>gh^cTXr9l$m@R8)RlMGx{cJ;(rO z1V3}I113rb6byRwS=^t2z7M!y)UHpWD?D!;T@fcv!yz{_aTC(51rm}l1n7iPaO;Dj z__M8%V3gDmq+5mCRh$s+$6NveZ4463#!v)Whrb+=QF80>(Cc{2iN1^e^u>l0qkrrP z=wLQvufRoG$Z&)|dqahyAU(BPEw;m3z1Gg zp8iynDD@2?Ka0w9;~OKM2XS`*BzC5%4eFlyz=~`&bGj6gfT}i0gkDs+B>FJg(Ru0( z5U`_=D9Y2bxx+s}249tgl{_*Gpo>>n65arj0V{c=OM!g;%BL|!FQ7J;gn+&rL=yhM zts@#wB~1I*ASOX~iHRG0Aqse2YnTdCcIKml-O*Uvr$6`c(gLzRjQF7_7i$i=sSK+#;w zMN%=;r6PliMRSqp5)sh8-X!7{gjGiLzqCjF{u7EZ4p4< ziK#~;{s9#Jiq)=EHz6Q(iWUDSjQIB;i_Wp)&-Z*%%lYS4nDa5~ z9GHN<`vL!Q1je*^PToXzI5TwAIhTU;(_TgNwO&I}=YE_ZmtKsMAP(5o9u858yVUMj z;dFN8-Fu(lZo{Wvwx-UyApRA6fn=VubUVtz)hkZ*p* zL%$<(3NwP1Dn3C%ex z$!tu5a&Z8PT*qM&h5?g##W1rHWH%uEA6(KDdFde&{$mmAS7-#dH;#xY`pjq0uf;88 z$GKvS7ye)4h5v%p_=SYf?1sbS37g5ssUam4;-+rDl&17Vk#)OEQ;P@1n8xPZ{4T!J z4Ze38d{67!)O}a219My#mrr=BXhKr!X&h9RXgonqv1p4sILF4ouv)G-n@-?pD?b7} zkDE_oyS8EqIBQ@X2@s=lQ&Zsjo9dTeryq|RkVEJR0AvrQ+#3+9x? zX*nWXFcOfVCF{)29gX02Mj2<-lWIJvCw`0plCY$qv;o;vYh*7#gTijB?D6L;#hav6 zKHN5skNyW5eHZ=7he}szJ^>F*67V2H0v5HG}r(+jqk;E(U}aaAKJ zk7$x0&-^A+FvmM7&hJURY)Y$d-VCH7Th;KTIH|%Frz%Q`4=vuyGutqoh1>A9Z1@w7 zZ5OfI^(|c?X!)$7zNHJ;b=em8{=i$l)2+%S|Bt+Pfsd;w|Nq;{LO@EFOCcba1p|bO z803~p3tOzZg^DQ`4G0)PF=*9%1xmPmO-#Tn=|Yt%;HQF!i%1>=gd6w+~=8R=FC{w-CBc&h1z=P zB5ZX=*&Mo-AX6W0&@%9kfsF9@w;KQPSF0Lt8Le?WOf{abY5a3){Es+sLW_GG4pT6- zYbiEv9-MHcMyBEn9 z5Z@lQ{?v9C55mWf0m@AfcJszf5Psb4Ku)32ZMVu>wA~+UAaqj$B8YBk30IpjDvUN+ zw9%Iu_NBTOgGss|p1E0N{1LbEK_mdQepi1!E*|#2e;kPZ?ACxNkeeLjUEs*8KpWdn zRngio-+`!EARwGXuptBR35>Lz>WUR&fn&yqZ!D8}Z%|%I{aIr-)&ySyNH*=n6>?RvMg>Nn~ zxhe}egril%ljfqY^X-A4nGl*ZtK4kCk+`Jb$gXVEU|d7NJ@?%6Dsi5AK?+hXUhgrw zILimiw7}%e5s#LBJw>4-@IDqXmRLQn!%)k&RCMR%%DiH^xV%Fo*>7Cm=!f zmh;=G-k`nlqdHs9{FEjyf=uY9W9o3838zpu-EG(+j|! zqrUEWl>iQ>?~4_q-V`HjiNiWvGi|m+*VWEPzI6u%vRk}0Mc?K@wJd_lbsFD%7#S%J z5yCPdTTbbgME=XbjZ1tbzhQzAXo>eVW=K@#`i9e^gTCO95fhLIa(7QzN?@hJNIUw4 zO^uEVwHIzmaV#q^J;QQhyN#c^r*BA1xzi&5=7e2_X(@B*4I{$MdOv@gj$W%-t-4w} zc4>6kcQF+-v=71P&k1B4hI4+JygK6{77YZp!{md9sh+F$#ExQrUGHLHd+fiyD2+Xw znGl`6M2ex3Z;pjZSqoTbeU!a=RBdnZ+TQB5z0GTT+HqSMG~db)Yg-vJd#xY|(}HQo zZKDb)HSR6inF(o!v%|*C&fCI&hhX{JsC#*T6u+7U62j%tCL_6g6ILOg3?X|!bxx$C2@48%gLt=LRjXax&NkM z45A6WJE0E_Y!sc&841Dions5;%;>D! zk;um>5f-g{#WJ?#_uKM)ePzbsIXnuhh0oXPXUM{^{@p&h^vU$Js*SGI>S0Dxwde%J z+#RN0MBN2aK!DbsH5CLmZY4P4vY-SO`q2?EdS^04zKEW9v0d4##``9F4%glDs*d2b z>k^-IiTR|{gG!rCqe@k^k(ogqzsw%c0_+Lp%QmKsCI0y9LCJ4i&LQgX;YUurpLGsd zqqDc6p6eTS4ikLAI?s^A8r8OY%J(o72}*SIPOuGwHD34U9wAihCY zTC3)Zd%B>(m5TY&_YKFFbyn#O6B>WLHqow2$LR5j*QWanhp17wFIPSG+WzYWY1sg3LUh%Dv^|kV@DkRr=(GkGHCV&r_Y&VM*BYC8 zsdq=;<71EUiC3k@LIQ7LnOyv2^f-x=0v#v=m^ln!@SS-vc9}7psND--&@*0a3N%_7 zXtXjg-O7xg#(N{NPIyW^=vJ%`xBDPr*ON)u<$INp;dx?{uHU{M0hICo?6g}ITX@$o zsj}C|T9-%XnAplM`;CpNfu0%7((7lcE8@QDuSv@vP9XnVXt|$!OnEwM1r!96=6Jy9 zvF}K}%dI0aBx?Cw*6Y?dJjUB@3C;|eL^SA@`JFg^2)kYwAXN2@bzZ(%FW-7EUwe*B z-SeuxakC$8nV8lK7wL(vIB%%F+1+kW+;Dkf5SX+N$M=i=3bO)JgA!FWh!Pnh<5!|f zm_8VhN>FE_;H5Lp2A5A^l3dcU=WXhndWLtkA1ABO6WH(*9I6vaeBAZYpK`V8>6*R> zb&jfWi0yDbT9;Af;=Z{hYY@@HO*)ULH;f;ee8Fa2t87xg>@6x}Z(~VDZ8rvUueP>J zqsMN7FnW@OuvmZNW^*YW{1?n7{C8nCN-KHv1lI-s^Q#b!xprLDV-pLzv|X7tc1lc$ zZoWYz)G*#1sr*cA=i^}gPk&s?`kXL8JsP=+^|MK}iQRQh+nI#ND?LGQ1WLodu~aa<#U#0$#YP+}bL`3y6T14QgZWq)u(UF8 z&C0}j_ok!U=4XRmI&6B~>RH$I=u!EznjO*1QfN8O=E%v^sqfjk>a8$yz0+&3s{D}Z z4~^P?T^>EI5}(zY<7Zq}-+gv@8$+S;Wemik#jo)Rc5zdoxF#xbTmIA^wCW-1*8R@h z>%5l>^y3C2r2MchuT(Zgdu?l9yfv@o-O10`ymj(Dfqfs{FRkm|&?WmogF2-_o#|mX zpY|-{rNw#5=;=>P7|>OU3RLvKjg(f25@dL-^cZn^sOrEo#ZL8o}*YqUM(XPji9q>~nZdxzk-Ov_8WrqG98N z8L(9~i72}Hd&%yahghY3N2A`Eyjat{s*AcS^@U-GJ-x$0?~FRz_H$q1ZB)&fB&wJi z_dRKJw@>NWpo1B8`xI%G)=|yTq8!`zUO(xq`B~NfexVq8a+JGOshO74ET!KO%GU%g zYcr~wjLs-PUt5*}s?V0$Om*i`Vc(_|wv}6K zmCn0lGT-H&=+doCM=x-f(*K~Utr$vJVv*=;X;#B}x47a2r?dkILW?Ub9n9hiyV8kB z$oi8Y2kp*2#T&9`NKN`I-nG${zU4Abs!+k&O2|*2wfRaOc=xIS9mv_=~BE2(Jv&SfiHEjvxE?%>VN8R)@(enL$S$mC@Se@dw?z>f+CRJOKLyHiv zkG8Z7sC*?Nlg3d>_0~8w)lfhFE)_ zchV1Ae3)m5IYrq{wKPaeW3fu;0bSRp>+BX9;Hk4&HUrRPSvcbD*ss94$Y+63I5Rx z$IElt5SuL=QcXVMPWcsdBSxL^9SE zu+l2~7R)LDzyb27HBGyZ!2Kuy6b@LEI*)tr`wAt_95YGry)KfHE8)Z4=u_&X5MEX< z(RlPxcP-MS9QtL>*_;z&Nw2X@dihRXa>^n9n7*wL`V`P!HJ7{fEbb>5njw%Im{ge= z+YrY>HK`%=QAxO8mwuKwuqu6;e@XRzq@twJ4UZUGo^#oVaPyFbj@P~r#hc(jT{QnI zRnMt>W>wNi`yocpU!y|v5Kj*~m`3jsW}hKS39i+y{|0_5FCBs3)z(BzM2z2KU#`V( z?$zna%<4~w=2qkPm7zDruhiR6kdYrfGdtzVZa!QjZgB&QrEb7M7vKgSy*@$bT?C#$ zrl3DUvJ*`D8t4SukQ2wBcdCGtMQ#lp?Bb`}-0HrpQ<+dnI)p))`@?UITBm4rJg63V z5iC~2Dz`28-Mq$PCr#fMi{+FXgM|vp4xNMSq_4a^2CZ0N+7Oc$2Ya~q&pE<#k)xH9 zv^{XFc}ta`*or|d*z zrNV$Tx~1eIt1VdLM8 zVF6fJ^%-6BA*ogTSh%w5TK@>m+O)uxYd0_pTtl#`)qdaP%WVegfAz}@5nEQmee70X5n0;k$(l%`h`?7F~Z%z2*GZxl{0R)4~_ z&X-;2f4e#^=jC`7JiC>!l;~P7mBn0rN>nEejvT;QReS=SD_yD83WbQnO?vn`d#*y3 z@C>0zO5~-?KQ2nM5tJuH%lgB($NgG`P*8qa*~4|d zU+q+@eZs&yf>gC09sI|zKw$i#W9nWFBmgAu>*5PV%roSC4IQ^}h zHLoM$4ochb>ih@%v3}k=wWpA(^iJ1-aXVC3m@~2RYvH9H^Z1^@uTS3<=$o|U3r@9p zJ5cB=2b-9?7Vub=>DmrBEDrIUrKH_);@s>xeFf4Yf$6LBa}4k(1yATJd@x<`1TR@@ z6Nt_eFb^)AY#h2HJg6Rrs;AX>jDebKQLHyKc~c*qJ?Ip`Kq9ivz?~3#d#-ha=lo_? z>?V@LK9UXUW=H^`%@~ukrFI>3VZsk{@nCQL2}q!zn)owm^E0P12817t(V={OqIX11 zWE%~(51d-~Awu$Kz{#p)Z>4tLMX7*dE!%_nWJ;Y7t5lbYn2*|xUOaw0vWxpUudRza z5Si{%7s}E~LC{mmJ*t~7?i3aRi_R1$>Z4{Rz146|gylUg8vXF$f+x3GO;9PN8b(r~ zHF>JNXiw@Z5KsE$eJKXGdZY&n7ONh)Rdx5qC%&!tQp{}^-XtKU)>f79V0Nqe++w=L z)%oKs5O>g5=TAf{EhLc@NnKzH5E2&uOgj;Qo)dh!!?(D9E?l*^U!TqQT3N4jxfF{f zX&u0rDWBoN`S!ak7fK?lvI?QKc~DiG_S_GlSR2d}`#3dJg{$Wm}F(A~- zw>ecC@|jQn{Qi6!;8HED&d>H<&XquWXPem1w&2Vwnsd%hA8tbELG=>7BZ0%db1~jh zf>P$is$95@FTUJ^C)=78Ax`)J80iFVMLu!@D1&w|K1G4HJe2z)uZtUk$E;^r|B+@As;>5Lia=E6Xz8?<5R) z(C&5k9nOHslc(*K$r0}kfj=#(C!uk>@ULuNRX|8)I|C+$5vLK-(Rk<$uZx+Rr zzfXyHd)~mfb;dZyVpS1ST@(LC=V(B{yfNB|&$yt*b&hKcws%b8b8t)_P%HM8pGd59^9g?HQUm%qtJw$pXu@!P9k)rJV=OH@$j9@`-!q0K7uKfdSriG76= z%O9j@`Evbpn?5~msqjb^bte&1`7G|D%U*a%X{wC7eAZnyJ#P;;x=Yzzo^_We+~rYs znc*s|cE6s!la$TrSW=QwO7cmiIA3pzA-XpVm>T+=uFu!wMfWpp9n?!ansdS7P+Pxm zAmhkBtL&3>bRtdswuEV6Zoqe~AFo!>$mvCZLyMXQIK7Vt_oQ6QADf*o>ZXudfD z{DST}Txta{Eqbd!Z^~EiBYgUcK}U<_0HcQ=c4OVFiqpl=mFPvg;E()*M9!sWxPHo_ zLEANHe>K$ThT~TQR;so?9mb>zlU7b2mW0+Q*`hXD)rNWBY&>fH{ZHKd)&97l{ZtPE z-N;op{A%(+PE(nEbZsM|{j8ZumFvYYH3GuLFkAV7%Tb%|@+BB^aZOnZBWkno(O>RB z=u-hUGJiPb${FJFi1|bs8W1(ecd=cQiEYO-QP!c@z>C#p1H3pW0rMPfCeTJF(C-^0 zUWwtzQ~421Tu{2zQO;dXcM13MDq?)eiT9H#=ZOhYp)?Z;mjzeklnaRiB`+BiMv=j3 zKX%1U#7Y|Iri%6Y9KG_xkxgwA{r*yMIF(Y4`hNm@wVK-5RANsyA5jp0dp4j7^B{}K z+7@M-x*$M*{!1jo8U)bmInrj^xz@f-ku`vxaiC3niw&VsoPoWf)A3C|E#)`_WJix) zI6>r8s9sN-3q{8tAXraq@fICdH1oM|1Sfq}mjNNPQW9u;Mn`o3=L^U43;mbza4QS& zK3LbkNB?K}dN`G=Tyw<}7wY(yB7IS8;`X)cfrb9eJGwb5wSV#`hf!KG16IYP5bTmnA|f4 zcCQj&S85Hzvfm+(EhL~TmvQ$Wl1!ri$YYKFxZcTQnSopC0!-wwM8A>8danBOe2ci% zW3{F~p+0C=-`fN}YLf^Cp;37!$Bla7Y&f#eCRZp)dYGMGWpn$}(r&lP#tH@Xqg+8t zbJB$`@r6A~rb(dDCp3yOA0JgBr!|J!BEQ3IaQL={CA#L54zrwOfQZaP%1&w9V50g1 zR^QCna~$BV!Ju(2a#VJ9qZLje0`hf2zL28y7f(4#qh&j*dC%zXRm-T%`M*CvRNCU9 z)?bxoH4Hg?C92=SQSUBr1&748~u96qwKhk+&=>Y74R|ybTJug`YwTIr2rZTq%wF%`nBp;% z+Gw>5zj)2JH;wbp331_&nW(O$rzjq`INDgqPFHMsWkXv0h8?dpMpfx_BvgU4UB< zMu|VL{&1;OtExW)XuD7n^bXya46QQ+SzEW&WD(H*^0Ao>mskh#S6yfvKjrgpao-{A ztgrN)SH6+nOF<=L_eqs|JotQEtWG@~!H71#h7X(9Qojz+2dhL@jUZ}IFeO5l%%g*i zdTwB``OS3Dk-|)9G8r?ea<%~BaVPI5^jR=9sltfWsBlW!B}M=XY%<$;60_0rLtb$E z)*Bye_7MVC=bL=GKkhYOsB9ECqaLyWM1J^9_is7q8;6sfF+a*RX|ikZ+}NxC_6}vQF#jveGFqz+X^0pNy5VcgKYFJOhGCg zOK(l(g=ofiV0VQGWA~G&2Du;60pL9UTe|Z+t%M{Ijb4n+K8;$puLqXBtONrOf)5 zwL>-%rKFB zMem>GJZe_Y>(#Q;!Zf~#et?=>Ybnz-65l<>!1p(9fdBfpVcBWk^%~kW_*x$~qEBd* z5_x3W{Ix?|>JYA3P7$aRou$lnzi=mJ)lbNK;!2EV_ffT9GTZWd zTdsB5A8gAhKf^4~C6PN4m-ziQyk{t8xYBn8Tti!KmZZLNMGY+@^Q$z566 zr^v@CTd&^`*hNLwjnr$HpDA}JOdvW^v}7SbuFq9W9+EZ5Nyijy$$@Feu#Bs|@zMSA za36zV>20o;E|Z#jtJXqaaxqtO=2mMU+*3;sH0%>pE!?qISb?)nzX?0m+tml>ls9;k z7d(|8@b3rh>PK|cU!&iYUvJONTlkj@-`T!L?}oxVC)746Q>$LM#_?g?5Bfr8M3{+; z=(67^WDK06V>WlwB07wj-ru5tUNGIOh5@s(vN%=CvsTPiZ~`~GC?mP)zK^T8>>WjW zs$$6N#3Nk`cS3{~&O-rD8I4(YF1q1?SHRf%D2z>ai7RYZxeh(U!&-EO7m$0vF?sDl z5N-}suldNCFsnXjSuK$XrbIxAN>y_ry6aZlMuT4xnE209Z|c0tyEE`&^z$m=kn+{~ z6Sp+8tv};duixjp*PmJ0pKq`Q*i3t+9zmLAyyIt*p0eB=rZKx=)7oM|yWy!w5j)-O z1lPILi6v@HR2xhD>6K|Y2}(h=W-*@;totA_*j$py1*Tgx8!%F?{h&VW18$FPnfn4q z2rU+@MNgRZ02Hi7AR!L6XQy}J+umROEKuzE1xT|Hqj>_vi&mq11n4*f(v9lLU;^gK ztjev-Y0$oK+8d1B&@pv!N?I%{PJ03K9dJil=XPMzlc;sZu#3O(ga_)VryGIck5w=Q zckLNpH!!mp_&R%%Qh$>*3v=A>YBl8{A;659Dc%LMe&6F2XFQu(-#?Two43x<~ zh@o}5BFHS)F&O$K7%G*caf{q@LZg)@2M0yq9)}k6Ib4yWI#IXRK*Gf;FK0T#M=5i2 z>~GjJERkz-_d==VpM_1oD-<8mzbjs4W#yVeY1TxV_8z>*elZdbS9!z~_);OOxORcJ zE=kK)Yko{{ksD2%WKEn#6HgS1PwC$kuhGOqG*ORH`ANwG9@Gj>=fdxB{vVk{*4hG} z+zF>h`u+!o4jNW`&h4>s{fEzF(9f*5_ceJ4+F9ny588XVM@U$rAC@M*!N0aA@INm> zs}%RmqJFv6b9ysi_og>`OOb4}{jXhD-_^+{m*^M))T`&$!hDRcfW6u;6F{O)$w z|Kf9OL}>n9p1w5ogV!C2vgjC*cY7lr2ylEj(#LNJ+`MRM>Mb{pID_b|yQa<{%GE^m zI8@F=Ggv;xhf56GeY*s@{!a&w|ii;Im3dQaFr*8QnZDD$G-4zc{ zx#C+CKsAap>%z>ORbk4`g=T$)cT2mIhu2e~uP`ln=tird2xFH5CGyF8p5#Y7X{mm) zI^PVEDHx5shgIpRqmGpbR--j^>9)@t?!wbZ8 zqRiKsMDu1-bC_47K_6n#ut`L``O7JRHy3^=@I|7g{QWZ_W{cU)(GTup5b#oTyDr~jp5v)`q9P1?TaJH`y&=_rJ<_&wrOXpWQUT^a zX1*28cx!b0Vz{uc54URV@db#*9x?KH8WQu5y3D+tU&Ep&ID`e2IvLGfAkQ@~Wc%;B zKV*+puV+;gX(-R4**O<{cE6(TiGX_>NyQa{I#-1a@yoby|?c}?imFXeBC;#hOEXtw_W5LzmknM%m`9}226>#zw(UI4|ljk*Z zt+99Q$6n2kFv>=N81wg8=0;O>KyPsQpA>c49yC+_C0KeK@$IEd*X;BH4-pq_A_|e^ z>7dNFTcU6anz>F*0UW?e80HO#jn3X}WhPagOv8P$YT*d`uT6;VwM9IET!9kK=dsQq zgiQOytu2gUMVWzWur82_v3 zW^*yF!z7L@2(2#yS`<5px@RX=V)pLt*y~T_YJ7y2h{UK5CZn-OiRMQ9v_CTtZ7{j(Z&2T)yf)LBBM{CRJy4wthLb)~2L5%FTn zufmIo+|}yK7EWKDkY2Y7O%PTt2L9yr($S5Sl}59u>sDU{Lz9YA z+1~O^;uaHma`22U3XtM>pL^x<5c!lvG*Lw<*+yV?TKanz6@{JYwPl39{8=Pc_5b8V+Kf?9 zjaJNIn-`Es8JN;ADiQkYQP8GBgCTtu2Sn|&rmely0?$P+s zn&QWFwzx>~14L{=t!w>WnB~Mz++zynyM~w{AHeTdF{Ds}8B=afV|#D3zc4*p>Rqef z*2`6;^c?$(i0alq$EbN@J&aM$_u4E4zEl?z0(yl4%01iYb+SS-txe%cWjC!FGgAiM z^V-b=?z_yOo;QiAT%i~`ybnHUL1yQdL04;WYV*bO=Z?^=6fXra@W~=E)Etr5PmDec zm!u{3xh6i@9Eyt~qqovn<$BBQ>7PV?Fmj{I$Js$V-5Xp)u+)uwOYWL{YMZP{SR$Fj zmCo2KaS0tfG?x%8RXG^@_Dg|@Q11}S+T9&&VKtt4g|^@o^6r)M3LU1pZPYl!haBb( zl(`uK9$N14>|Q0b#a84c@2R#g^TQ8epzG&PY#HRaKP*Pu=N1~X0MYw`cC^wj87i~M^*{=I<4 zw3|FyMR9bG_QQb}?$xu56b(xJ@@i4l@D`FE$ zIK%qPB88oayA}>+Ukm`(0XWb9vwDW#_n(<^8{JUPu+~IwZ{A243gMnrEu7?dX!6|L zTX_CHqLm$~nSu{mt7fKUB3z^Ed@@V%iY7M6eTalWHkH0LveMb9O0NI^W=*B8k(J(& zs^rcq{9L-3gGbhQjRC1_SGXNxUVcZ#6kbe$3274hGoL)&d{nzGCLw7|H1RpS>HU?* zDvws~9R-9tzw=3GNCPWn?#z$i*C$grO*ekkl3pBH>0PNxM;jqkq#ru6#)MQ27b3=_ zr{tW*wm);hX-4`dbb)H~!`Wy{w8}_d(KCE5+QQmSG_hy+0=wT1S6kkIh14)L`g=d7 z^B^LN-DAo>n*AJ%dSO3=KJ(}?v7fvwpbaL5_|QBW_GRIizKM{%9CiC%#Kiw3YPiVBu2HH&5G~q7&mEpj6{J5APCk&fo zk*{QBcCZ^|047y526@OTsf)IADRJHIlxOrrAO69~`ry8!L;IZT%?Wg)-n9#UM|B@= z7(~nznq#zIqvCT|3ZJ74A1$^&60R6Z1<_H;oYCPp=(5L>U-aNJFz&JFoFa_-pM-H< zC2RcoUXFil>3E%94>-my2*9Tg`)_#Mue+a$J?`|vIfJ6pI-3p=OFUsrw(rRwSzjm} zKd8l;J+I^oyFQ?g%hL}YE^Kh95nwd`yIxn~O}mns)C7V4h=7K<^bDVaCqmo87j+1QdpDgRC3_qPF4Zve?o?1} zQw&6i>#5ETPin|EDA=gq2sK)5iG~DV^edR-^Pg)}DAkxpLs}R;WnaMfrf?LBA<@x# z&1+aa8eeDieY}g?3Qt0bWYy*pO2WtK38kkJ(R>3Tr`yMC3?G$N0vn1h6i zzAPD}*c(bNR0&Ehwvzt0t?RN>88tRq38z$6njqau$CO65KjGYsn7nTD{SPQ z<_h}hy<|dD^cj!2Av?NZRGumCqrSUV>0Z7#t#qu(oe=E>wDOZgR+UF;H1vui(uK`U zNxxw4Fco$96o-~`=apfQ+cbpeRIfsiARiBN@%Cm|VHty40ui)*hKjVSuvwUc7nV?j zL7dZARhfaFawKYbAL0H=w5c0sbvDswIzB1I{^_*;v;Jusk%6NKbjRnP_Vc^g2HlMI z<%6$r_@`t176Il8|1bHcZ;f;@t%s$hpZKSHNkImQIsbI-$jWaSqw*J1m7Rb3=NSG; zel*NXIClc0vx$G|^jyhFr5fcwx>N(N@W11qj{DsIUH=qzW(hhVdl|z&ZS~uK+dmc8 zD$aW(D)iik=lUJf)OfCkHR%oS@=8OG?xLPrpBDAojq|lmJ$6xlzhoRP>cPhx@^9>- z_8QGaoqS;$8FNvW0j>PFxu|hFpLJe8{x3V9_d4fu$>lhoE6n*+<>PF8^gnMwF{{R# zX7%RgU{JDXlH2s6NxC9>uu|p^O=*spAHIP(3E6@Y3~n(0aW&%lFRS#Gk(EA?s-(eu zrhH&crHe;aYD!gd<9S=XE>!yq48>aT=^Bnzoi7!-zvvrjWuep@7ZJ2+IOayOVNe)| z&AxL4vEMhxX{uzT-9NI(RTK&QaLJ(K%_$|7ZW&qW)Kn#x3<{eZ1Y}MgSt*yQ`<#`N%Y^Q_rNf>)s zvlr1-7h~^JLy{>Oj}mVTyYbM&(!cHvF1}mZ&?V9t59#Xre8r>w)^&Cvur($BSdwtZH&|=&P1BB3F0uR@C?|~z@^aX!XZOFZ{ za12Jf9aWsGe2m{|_5o+^NH|BO;5a2a-+Wbw>|r-<%rBgQT%X@}qVx-h>2`f!e;23n zNJ2^aqeE3Ja&+{CHOF38x>xmqrj2kdKoGtCnUiK&ru1Z80PdQNp8Oy5@*FzT@)`V7 zMOuGmFIOd3UFAEfQbx0DN#`I@|I?S7Y*7g8nmo}c#AOVgo!PtrI~DW z?is_$L8+FH@|l4~MVkf)L(@=*lQ(&9$AL12^zQ(!cOyr(emraA)yL!|NRP-D=ubRY zX4ge-99-Jt3umw*XWHY8wFW4>95O{G)Ts{LKWnLixi4tw;+Yo99Mw0c;RxLv!K#@| z`D1E^VtTC=L%ojCtQ<1N7w6XZPyJbwEp5qaIo1A@S0gj|mOz_GCC3gX`?eh7~K#6jh0r!xJ5AZOq>p72J{=1T4K+A zPiV9Kb5uMh!Agy|x1v(n)f?W|EtG&S1 z4$BA7OoEo$ZL8^|qZ7&Zn)2jKdCVb<9~?f-y6sp?Hj@cTfy25uvpElFCSt4s>1a?{ z4su>2%*kU9=-RzX3b1kviB}hjrhX31T83FA`eftF>k%X4%eG|x$fV@Etaiy2K6H3> z`EFxcT{6O=lND3V_ve$u9-)Ql!JN$($) zF5CxD6%JvYkA1pmO2xudk2~Y=fOJjG!i-gOwVSD&RQXz}26^;4J_g8K*sG=5>dK$+ zn0g%~5kens{!dw7Te6o5>+%vY9l5RK3vyPe`sm?LyD%=NA_jv9&h@M1qwt3b;{!p_ zM?Ztqjwf~+!yowdIyuENqp#QTHaB2=NUb1w?sv{s6$lg%a&#NpB<<;;o(J6ktPlYd|kANy86*Gd0noZ&`OcIXs&PGb~AFYg!A@>bKs`GnoICBj3f83->0f&6+(tv-jQ1SZXsnX zL#bIJS}ezZh=$8?LYCH`Fn*2|gzT#{o9ED4cB*S9Dh8zNY?koTJ*O-t3em22*&hZu zrA5_j8r*k8=#!j+e1v(#uo~*o@^8?hp5Zq5^L+|PYBh3OxgwTZGcc#y`l_>%LN+wU z2;Mkp^Vjy&SS2U@9uPipUs{btYIR2Yrdr2 zQz-GcXK;;PHLA3&P{}g+SDbVggq7_@Z&2zY0KGF{P+lTdnef{ z`t$Impd)Ysv^QTkGyL&tZ<+YC051CKxv+B(vJ?F*^)_^1jxMBqHw!)J!m=9n7ne5F z>00tvjK7}WNeasS3MnXW^vwjt{J@;(aff5f=8NueUfc_`dzIw8va*78iGLA@DnUV_ZHEnsEh6y>Wg)g>@|%y|W@^vh zSu_6r^n)KI8E_*XiOiV$r`Px5elrI>%;!V!tqgLt`1}EW9;jpld7o&j2DvgEjeIE_a@1v-uN?3wcI=TvuG zn8oVoxNUgR+t4ZNp;DJ!`RdG@s6AJJWX~CK`*O>Cx#hl`J*S*|js{!KO_L+d zl=-n;&+yKu%+t^*K2$ZK58e!P6^N~7IuJRz0gP^eKcf^GQ&{F&92PXV>8vq~M6hRr z*6U7F4FiEv<^$)X9WA?Y87f($CRDPfh%lmcXFC7cq~;qvX}G7f6r-QqrT(c_fmEc5 zHxOt%la(htdinL#xgAhxgBZrhhCE|ryRrj?;pd;jZTGwi(v!QTxV_w%La##%vn__V zrRuY%0^QEpV=7^E-dflDDTFvy1Q;5jIS4Q`stAx@)!AnC(b5B7S6uib^&F+b>;5DC zM?l0i_~x*pU5~Am_ON%U6Tsh`GeQWW#wYuv0GN(uQ#^L540R}bSPle4Rm+9qTS&nu>2O2VfBGSiLM!k^=zi z03#hcwh`)cOvvKl{%B0#IO|OLOx)7A8F2KwYZ*}Q8ITJMC?wu3QK}(dYK<>dbkY`QseX^=Q57M&AMs1i4KZ`=jfNOgi2iEX7TDo_hrBepr1#+DWZ;7&@y#k= zHGmBHZkbT&eJNfM^K0)AJl#5Vtb`@&?YhXF2u;N|*EoT<+8|-I>0cv*LUZQXl$~sh z9^IRU$uJaaW)Jv=NFnYqY^dfi5l`mt#Ub75x&lPF_ zA3IX_Q!Gg@Kg2&XhA(*Mp16gr)U4(gaU=Q@PYPb&T68T<-SgfsV9jq0U6kx#XDg)z*T>vU^n5wfSqRGQ`o7F$1YRO z@T0oZgwEJUmoi7}=A1#*9M-NoyN9`C4r_;Bxv*1nSTij{_F=AJERaAoHB@x4&0&%u&t^HWK;5>M|qmi5xLoId#C zliXgnPZCpaQ&^ z3#_QyzK;L%b>%;?or6~$5dhNG^MLdaCH1FTHH!VKW~VxnD(%Zv3hXdQRrt5G`m_I? z(rPK8e6^rBtvJE< zBZX4fsZNaDxnrt9^bMq6?H`-HY2?i`?r9JtP6DtU@q4$^j`$aDE5WfFetEsVz+sR0 z1(&f*;CYX|@;qSwRq+#j7#th>pC09~pH%ro3UyV8QGf54sLLR;bu<#4Wx=<6JdDjz zTZ|Qy-idt^%hSOTRR2bNFD0nlRC&>qLB?1<0cEgXM6jF7Uywa+|EU$1Xb=GTGxpo1 z_0!xB0c*y$u3mEjLXD1JEGpSfY%YDvG$ zI(|v|8<(UcE%v~Y>%F8GL!SOdvHTN`2$p|d%JNkqw){7dbPmAL1uW2rO(;ukNm@{p zsw=Isl#qk<&!DYR3S#~O|;nj)ro1; zY!HQN2#Tr30#;v3i_1p^k9C9ZzFrb@XN$R0SD!lo%HQ$bSKHVqf924?(DNyr!di7= ztlxy8Sy&Sd6N$yPS5Ivzw4n4(JQw5p4S}|2=#Jn2(A{A7FO`9zOStN96mh?_SHMpD zZKbeN9gkh6Jdqz`D|IPTo-#@-`RH3m#FDG;PGZTt#ggChXoc`EI{yw4nOJl5c}w7? z9&FFbSg|3AB@5oAw&`_%LtgsI-{9@nggCtIqM-gp;ce@WgR-8RVyr6sTVlU;C?)od))a|<;b&rhitG_M zelY0jjlOr)VFKmj(N%K`{k$%(*FWb%Oti-pwtnu&j6)KU)DDBh`uuY?L_Q=}fuEoqNPWv6a?5Bu7{b)J2 zQZ)wGo$4*S_=)dk#jUME3kRRg(QG$ce1(O#@w(1Qm4fw1RKv~CQnN72+x~imOuUoa z?rOsATqwP+S@Ur0`E;?*d8EnbDW7GSm!_`TElh@nL|*i<2U3%v*3aiOlx`P-9pKJl zRLctbbt{ahS$d*QNpsaUY3;rY=>caIg@DPQ*~QI4PO8jvkBVE^^3fKJ;_H}RJVgbR z2Z<*AS9CN2 zqLheB&YS7@O=r4QW_8gK=&`oPUx3<3kYVz`ub&~iu~=1*1mf@lV54p3g?Vh;?hqGE zNhpD)2#TLJZg$(T6@AIPE#-mv#`spjYf}{`P_=D&J~#yYy7|6Vi!{fIko&;tMDJqH z1r-*#dg4x^bH82VEG2NqrR5zeZY!ro``jQjWBUQR&#tZpP?!%07)0CNl&l+Z`v{`) z`fp*hVu8$cX+xI~@ZUVR)hm-KzX$s$Kj6HymRY!M3AePmH-*LvltK)DKG-?<)FvG7 zy#;4QBSAtTdH&OPMM zw&Rt}qDv+=&RIec?q?xG^v7$S^nr)Xa3~sv8M1TnQHL02%BQM>LOWWhs>MY6Kujq8 zV5+pvBIIyz-<<_g2dE_TPDmBDsxJv=%7gaa?A?23r#ae+LoLNjfo-NJrkN9m#74)g za2<_lwi;w~rVXiKn6}2Q@(`@ah+g5GJCGC8Op%RgeH7uLRw5eH^xKSxF6;$djZh8q z=;Bl>?+tbDf&3PUzfv`LK5W(D_3qcl`hK|a^zb52=ii)2U|-|uRaBsT)=zH3l0jBt zrC_XEoQ6@k+re=qPj;2G1K_N5CCuPGKT4ayel!prbEEoXXU#Z@-i9uo`Xp*=nUzO+ zyPhqVZ;^gzGtNv|=hUPjN3#=j*u7iJ6|Z;zDJ!oh+HSzYgLX9-1etUTUS%Ck4eFH9zgU9=m@5L^SYR6Y^PNDMQC1}+CANNv@0SKdPw?c zQni(TRDM&r%7Im3cE?X-0iuWhB#r3)P!jza2<1KDUU?V&Ge>;4`0N49s7VJy7NJlz<7bL~Dl|;YA}PzzafK@AtY_ZKRHUlV&(juHE%0iQPKOj!ogvL?TV7P4l!BKxE6y zguBtz6bUXBCR%q83Aa(2YpZRp%!Kmh@}Kyp@}*ilqr)$?u;3l;vY)&B`dHllHe-FC zK?Xo596d8T<;tJSGk0&W!3|x2kxUn0SGs@}M5{j^BD6}k1X7?WG9q5p^=UL$fpgyhcS<*f9yn7Tgliavo3aAT9{;xI6bR*vD6Q$>Aj8iqIqAFkvab5 zt)w?BiA4SGq{=ZOD+T4Ys!xq=5$S#gWnpwouM0u4s_egXszj9mM*=jO!MNT_>r_vK zVDfA#jSP(U#ckm56C;+Nc_9Hkb%+NP;Zdb-58=nz(57d{^? zSZMx1%5rpg(y6xz!inZ)?_*dLYsqLD@r=ezqickWIX?M7nqWQUuQ^E) z9H1!oI`p0xlGzQb>XpJ2VX>a16@lU{Z1aSScNGdLaYVa+OY#ek9Kn*621&CCPYe0c z-*Jf8TV}S1)3}`lCSI$Ocd@aZGnhOt&djG(B!n4^z9qV8D=ueYp&>0zJxH`52@3&$ z;l!IZtuL$A=!{%%+;Cql#<|#1=Gsfsn!Bg9mCU=Di-Q#St7WUD%tL?GHsK2QF@Lo` zA$svBm$fB2;hQ3-Vw6U^66KE0x)u-kygD&ssTl+mGz(vxgQHfHujXP_JiA4qp9$Fh zIoo69{&OVFgL?FW%}9J8gGz@_mcr+f(r%EbkN)w96x%sMf$9HNTevq$22EOG z?N7w&rj5$i#~g3IaeKYn`Sy;kZSTP&#%OQ*H*Igqm2Z*ctIks_l%(TDf~hZGRhu5c z0V({o^vL&Nz2^reI7gH!X;IqahA$~SqK}ZfCFFiKm_Mm*xpWkzLmBcK)fVtmdpS+D z8GqAjp4;~Qdy!_^QyG#yZ6$6&<=O;3Cnp16$qF3)(kXPII?>_6odq|^iOkdTM9zqg z4m}%wS4avxTqv%s^j7|;+MsDU7`ZT|1Mc~vDaCU~A^-L0Se5*zT)C~|4{gqq;qlLu zJ2Pi)JY~Z4i5K~k0dlm~xRS^3v&XE3+$!4Hv}$$cT|Al?^=|o6e=b#h4^`jvh^vnAV|bEe;>v0Xgx@aDKO7TlX<#~!Gi2EXw zn`UWJ>MM=sc5qe%vNpg{(VjtmjVOK!prSjgi&H0`kPy`i$8(4*z_A8D^Ws(e>(EQL z8E!2~kif6jLjTru5>plpqQb7L!oPt{U5p!h#=Bo=lhNX^H1lvoZ7nR z1D;gjV`2x%sBF|PL9$;sPg8BD1zDqVVW_Whctz>NHc^>(UuD(M|R-V4lAC?#*aBhe9E2kDLs3~ z70=YW$2^&xUGb;7t)E}$RqTUTydsMRa&YY1FUw@C(ws+C&fk*dePa zL#Hhr(iZ0oD;q06DGu3ow9zZ?g3-5m6RzQJm)J3GeUWWvN%l;L_MI}CCSWlm6sKOr zU*4{&c#S5s3c=Cs_eO_bUjCTQhJTQMtI6MFW(L_J=^1CRNN-Sv<*{?UL5f9*N%9Gp zGiT#%Z0ZSbjZQ=SUo8oQ{mdkB7eb|HReoh8KLx+4$WkAug z$ntv$B7ATC_bf-5u8XFiwIIBv3vCr#ktx3shcWRw4UI>O{mxrN#-DIbU06bnNvohznw;>_gwU6 zU48;XfB7S!?MHCY!e?ICT>czfjK2L&`1vE5R1H7ZNpMx?g@~Vx;-}%GfEPXEJc-iO zXAaipAX+b^WfAer8^wu-2$syyXDI@4UrG`p@kOMmu^r;9Jb%w%qe(%fbA_U_KC_Iv z=wp-B=sfkT?AV($FHV9$KL;PVSj_fk3yX7sx;o#Os%X=4pAgl{4uR^orj)(bU(Y`t z+Cf7hu;ORY-V|tWG}`0FO_|--HcpX52j;A5JvvbKI9jU=)bMwy7+H1xliJ9KHgx)v zj@z;Ctob~hPEAkTd3_vx+CLk11xl@1u=T-2BhBhqDBrkDfm{l<_&uo(T|U|PE=X|1Nc zDOVon`fFf|1L%N_SPQOAaRytzdNV(rRp$$vA1J)tJtvShwZ?ft_-!`y^W4vg%T{*p zA)$m%3Ji8{Y=m+vU<=FD6n|Ze0yaHgxC_qf?+b+k)=D(U(cI&<4bgGdg1IqbZif%F z>l4vwYdHptq;L@VE@@=6?-ASK8lxQMgnE1P1<2+Lwklj-*z`&zQ`odlgAhBCE+87c z>ytL}ILIz||NC}+C%y%XEoHv+&uQGsrSCD{3cc?jwC2`P{L8K*#wS7jMVFZSIK-1> z=GW#2;4IHzEO~kJb};r*XyHd4&F$_=?LEZ3>1+-YXk6(ak(~Jwpu|sjx#{`RRW#kT z>G8lsL<|$(A!zWBr#o4zJBfkDzul5Hw@TWiRAn9Q@8nxyZbO{QTp#ldwxy7XUi*Y` z*~?9+=L<8W zIGn<8sD7GS+H(`s$7zM9N`>v7?6Mz(U0uP6_F)nhdY;u!b317@=CFmGV#2O_H4rx0 z5q9JO5Oyf&RQEUYFRiw3dQ6sOfvcmyS@`K>In=K6V=7XZavK_)e(sb*?z?cyOLdUM9pQ~2r<}p9jUY8oNTvP~ev?=5^QEsU$v5_VX+4Ui zKkM&%U1k=o?$k5o@`kyp+n7tAwKWNc@9Y~k)mjYTIMcvF48lATr?!0zbLh$_e2}j6 zMBSWddueHXkZ)$4L3eWv){!ETkOxdX#e1qBhJPJ}qPo{!KLxpw_&^o zB~eGMTZ#}fKub>=8|6A^(9j^qw%*XuYpS%U8Hb>ML&?P|LCFDMvPIR!I~BH<@XB8D z+@-(H<2`uGjUOOwx12*Cp@0C@j`28SuqKlPSpLku?M z3cvQs$6+ZJ8e_ZEgs*4p4vekYZ;z~GRy2v%uoIqYqf{!YY4HXR?$e3JTMGyRZ(GG> zRMhiU6bk!g*0yDFZGae(>LHch>twkf7DX4p3oR@zy7!TA;# zz?{$uCQZ5ph_G?HUhNfefx0)C#94!delZw>XFRnXCzl8={z#l-EZb4&zW}yRTglPf z?fJgLchzfiT=m2t2!&q;7L=xJ9ui^>1V$orQKlD*DQm*4a+@j}1#=p<>%)jW1!gS# z3=wM7^igy59BIymao&qp@vAmoO2yWh^DF-R+E?T4#)PHAhc_Zyn?gCe0Ed)US-by$>k#j?m}%<7xly{YP&fzK`AhzSZsTH%9ws*3h4# z;5}nBo0Cn@cGVy#@ahK#R+0U~y&=2gIqxpj{QujCNZK#WYKYwA^p$cd-5ab=C@ytNXiEOd&Lv;|XxQ^y@eU-BW4*=<31 zgigXbTzN~L73B0o56~`Oh&QY4p<`x%MRbjslILvqDlvRzp|~cxeKsC!I=(Nud@t@= zQxR#kf)M63Qc3ftxxzU^cYk@uYwjsb`Qcg)q<^QP$`!-M9&n#jbMyj3g%z(Hd%%O| zJv_wh%mHg4d<(FyJ8$rsdnQac?}7Kzdmk_)b})g?7=^oSGhp=vJ+hT38cky7auu@c z%7&CaS^xB$>z@#}GK=_>7V)JGr{Ru0j(^RpJ5fb>*i4Q`|o`vE= z!nL3i@1gG5y>xfLBbrujFI@2iJypA^^RrMW^$16avE6kllu&Mdrb@uE_V<7M)Qo>a zp`G+B$5$LS$tgz8_$YB9Aa&vkjN3_~(tcFj*I5PQrfn7cJ1|xKdPzb1f$hXN9&f;t zQ1kejn)pc#4$fi3Q&{oLPK85L!>oBUzMAi(nWDV87xBdk1M@h|&qEXOf+`rSchZ ziYiW9Tz1G~=1U0T%(}Qb-pydzJW6QCxjYJ00o4p-T+hAfpIw&-^W*ARntPdRJA=zx zC_0oa^uIMJFcW|eW^Hi{9?b&}b<&XbgO?QSm*4Xvb(dXY5%l)uPBg!~2meGHPc?y- z?c#f>q<=7b{-SKCD&NaQ=5>#x=Qmv{l*e86*ycBnY!&3ynRz^#7}fuD)8^I}dM(UyFPB3^)`#q1#m?7IiNt=uc`@F7#n{}FP?rY3}e(YLRw%^^2CQcIcF-sY3! z@A^e5bKGcsF!tq=PNRmV8yPown;<%Xhx z_n_xbMc3S=C?7k>?WF&wb&TzqwnO{!cH zT5612G8SZ`&nGRV=c~bB=0`gqa!b;IOY2REYcyig@in8OUmAiA3tfAq+gtCR%J zq^17cR50p5>NWCSDRz&!UH}32Pw3w|EEZVgWz!;dwD#w>=%2ksnqL<>xjMmtpXob2 zg&tGK1ZR&C9G*&05S&d^PpTXq=oulnyB5bPQoBf?I8@odf89|=^yNm<=hwHOtn(CU z>7R7u4q|PwZgo10!HN$|v^IC=>awcb!ycPp zU%95zJ)Hn zT2pv?+_SmqiuwXG`NCl3f0Frg7^-ho;;)xOr$rw3o_ct2c11(YHwbarcHU zHHb($B@!DdeB-(+=j^pTk@CirYMIG8)C6JWc`M!$XdAJ#zuAl*(usGxfG zSzYEEU-DDJr~Ne5vFFvM6V)O|ZjmwKk^f`8e4WOKqD$R&i^X5KSansdbI+6=eUB4!Rwc$l^rcDILbqcD3WlAZFbDOD?@1J_NtJ6dsougcw z+2nLEFQt;0)R}a$I=GAbmC^T(rb~P}x=okcG#I>ryYk8E^*grb?zQR=JJAP5&3?b{ zzd5BaVHf=;eI6 zv4m+~e3D&=i#rAVQRno*YexNouv2@gc2Nrhb2K1TDu0Kf$oT(P}=)mJ)FG4MC=S3<(514q%wk2YC#0fqncgJ?R4*>e`_( z+o*WR-lGEROtgy{*6UgWCYUS=AbNnb&_mJ(cR#n`;-ZFv(c0@4NCUam$|iF%YYeh) z0d*95b>?H$p4A4|7TBNNNVj=N^>*#`b4q^Qdy1_tg=BALA zN`>h@Iypmvk8nNirW>YPUONsTulJNr{9WX7UMoI z>cHkM-;M<5ba-#>(C5+Hv1+azt4TXf&5Ar?-2Sg%9zE~+^j*PZNy z_%2|9FXY~}AOphXb*e}<`qgx;X!Z`QdsRC~uB_Y@{pWklTVCWY9qw|TyPRzooa=f2 zi2dv#j|D%w>J+Q_{ZMFDQs{x-ghF3;g@(4q8DC4zm?2@}Z!LfFx`^o6(4kb!Z3NyqSzgV+PcFZiPxtQpeTlECz|hASs8+b`@Iyi z@U=$+ce+nD7Jj!5?mTCMxhnpY{(ly~9QVkG_~n`_{~wQE{*!I|BzbhsG-8&EUtX7p ztNY~Dy!>!big|NQDZaYp|4RHafEKwat3TGE@ZB5Mn^Rh9d&nt%S?8To z*81hdE+U?%LzpgAAGrccAwqcXir-u0fHGH@!Hm*bcA)H(Z1CDoMz0XttB2g zM|X1kkLk?j6|d6w+*g?RJ9RjNqD9}F5$YOQci1jW=1}=9C!}xXTAFY%1QTqZDW4KY zM`6VYj$gIGbB$d+V9Hnbpdp|R(N)rS4hk-gKT}?2>s&$z?n*e{ztFecrz`%=;o{uC zYscJw;z_g7NwwpJT&GwXXvU!W{M(1CXnBz>NS+~eN zZ~RK@)JWO7s3@XJ8>i>#qJS%ie zeYJt-7%ZA#ugo;+bPJ2Jx>ou0jrJt%nY#4EV1HhBqq9FU%{JIBe!jzP9D>J;sAWE# zV9tVh3mefl%Y69^kl}_}8e*uWAvQwCtrbdH6Oimf>od^Gk?KJRWz=GBvY_$VH}*kVbzq)r%>)+B@CgxmpE|6(QN zRMRKqe6Zkq=cs|jsg<(wZ@cO4>x2M%u#d?E_KwoO_4e-$m4BAcWDyq!e(fIZGtDBI zx4Fws?lRe3wzLa@@#JzG1MTo&h=JM*R&#DB6h(2N-#-uvy~h=r_pg^Xmp8FQ%}>z% zKQO*{g%3Gu#uuyq9CPT2p}?WN-*0R@{-1DY^znsX-*l2JXzcY(3MlkflPg`qBdK{_ z`L`fOtTwNQHuki;Y_#h=Z<@WP8UrxvtCY+JK&Jw+E^C6mMOUn6z^>uUzC|vnN#Qni z6Ya9y4i)QCF&<+ldTfK}&&i=sgr_bFB8F4{!c&@3sp$6+v+en6A7>*8$I7S%IM6Gfr&>KQqd)t!(2|7oCxXPQF6?zc;&5) z$Z?#u(95SZ=rEiE^ggzxUn!2vF{eZv5*WeNdM0$Q5>NPsDC9r9Ul#2Fhp?bKz=wF> zx#lf1ufu!8&7jz>WEX@_id&+<`>%f~`M8c=D3y+qei=9i!Ib3{kn zn3^MM6}C>FLJF2Sq8;u?=7@evb?aLE98s$Vi=m(LLmL!e&{~^Y&qPnIf9l$w*yNC% za=yR=&?)EA8xLTyD$r#P*!3nq$3`btJgvEZ>Ou#gk&dZg9aEz-UCnXapU+drIMFJJ zw=r+fwoa}uY^~GlyX|USiaw&1o_9s3a4COY`F^^z_v=RkKg#y`Rw*<8+1Q`nxH980LB(jr)*~uIw)#osglyxzr)eQW>U=Ij_bUq}~wfq^l+)Ni?`>?R1Mn zES83e4YN_A(55&KSc9)%&!|BOJcW(rifII_m<7cnJ;H!%B3MXL>k7ryeA=c}sfE4Q z*}^s7#~t7X*2ddA{M=naqT%W04YVAN<#hTEv;XvLq5t#s>=u&K7?yu7kXO-(D76+w zQ14t#^(;b6Gs+f*Q|gl^4vD2unxLR5bDy$s8)?Zv@k#}93vBlDGhv=8uB90*pvFp= z*giwboTQI2O_isuVSU1->{vCCp6OWew;<$Q9Pakh+B`_uPpOmpwqR$J1S7v}2WbFC zTkw>?LFb>?2fkaY3n(|!83#N;zfV|t^vlO!yOnb)AFKQ}4OMbO$W)rPg5zm995imR zD1(WA#s0_}dG{*W{>t*fj60)U4l&O$@D96N?=F+v!`Ixem)zy%7jQ01*s#Zk3#oj0 zX;#B}7ccZli@P@r2z{K3IZ>R8uA(lnlTMfEIn1=)&B#`Ho#fHjs^2bqSpsOw526GL zvhXC+)*@#c*U_Nf%VeUzlI3?eSQW6zqfFi&0~A&Q^q&UvP}*thu!kSPDJqS~%khP& zj{)V>ZgTR%b1hVBv^r?l#1}c8PS3Eb)Q~T=#;(CbjYvUs`C@&(m^A|Cn0lOo_;r&S zmZI{aMR)vDGs7LaL7VMTo1$#g*{)@3$@%2vx`nbqT?1H$xKA_!*166#sNscU!n8UL zrrH)vtL9~tbS156v1*aV#5IikQ1tT8(bzJFV&PT2ZgsC30M^Q=s=w$zBeF0il* z&tlmmlZ=fbX5spHW`3Fu!Thw|@~lO|YuB?5)pZ80XRUhHrf2B9U;Q8)rG*2&CD^7i zI1iz$HzvjY^oo_o{{~02W4t($@S}t(imSHY;Xz77cW+pZ=F5ba>52*K>RGZbxmB*h zKh3M4RNt-(T(Y?|b-$mFi2h&X>>CB}#)q8D7MJa(twFm00OwAUPW6DJj$3SNwri+I&};8O+P`<@7R2=;|9+#r_j2l9 zwVaKD(7$RTjOMl}2JZ{CA@tgKRvJf6!Ucdb3y*uz+!ZYgUbM zza-p)K)P&~FWVR1Q+8pvr)=O&vNFV=xS|r@ z1;O4yHJ)OlV|u$v!n_Wybt=JqC-)|RB2G`kzWtb!DR*R@jhJ4ix}x!Y_M)+2)Ozz^Creiw8s|i zi6~mAUe*D1ibUC{rLf>aD9{LaXa~|S$@G__O-o^%W|ziDY65Si5$JLvBSzqI$^zsj z9H8ya2-X5qE$=hpMQ7X-=&i0Fl#H=p#wNCE8lZuWR{ufpLaI;IvwA@G@rRX%Fcyr+ zDbxf2*2`8%v#T!oCW(=gPrUK5V|EnKW=3O*8T?g(UV^Xj@rAGky@(~|%HVtPCh~B+ z2KD9P=%h>ofWu+;+om+6O!m~7;R7t*G8W837?s`{@8WABT$ZcGv9SQQ6njC6-DEOd z#wJW;FGG)&o142ZH!pXQ1xLR05>9Hu-67qn*GE?3bw5HQH7;MlgIK}Pm`wM1?$~^q zlOL%G?^{B(HG93>wwrJlP!cKb<@k(WWOw%x4d!Za?H|#nuHYTH?EF!=GE;0X8Vc{s zwqQS<8JTmW{lZ`*H*{-%d`5^^ZlQXxKc>pCKb8Z(>{cj9!^sgmhByAqd#Kk`~5Rxi?j^pxGD$qiw#i$y(XBN_Fro8U(KA zP$8Q`ksub#Ce$(Lzt{)l?*hBMnJb_zaFAc%Aiuyt{uPpM*qqsX zv!B{Mtv%2wEVgZk)(xF$vs4GOwEJ1u!UCO)G0o<5z#t>uE@Tw!bfX-SgV2BOZtdTf zj8iAT_OMZwL*rB-q;xVKvvE_Q%{yq)OKdvwhHc#7lP^YS9kWUWU1t^SI|<%&vB3?4 z0v*{1o!JOk@E*PbZutN^_BifyCQX(xwS|mXL8Q@6t0c4&M4o7YF;y(mCAGp%NrmGyROIp|=NwYmd8_4}!7` zVU%PbPP-*>Q=!eBzg(#*0dY*lwu;MwwO6C=+}U+bz(MjnJ8mkVmxL$_LnP zPMR3CNfUi|KnyL)Ed&BI7a+9cwc0pPCM!HM*CRD5Kcyh}$%5>FSSa94Sd*`dZy1~# zITLvsZsv6V9>(A%TQx&u3!1sHd$T61%Jiy$cO$ChpCPe{Sm1Rc|Fy%{q((wx34wG! zpV_&?n8FRBG{EOsz?!Sv@9)k+w8(JF&``z&VvW>0sR|uJv%nnY0ucjIPYJE3qzF?E zr8rQK;!uM@5W)N*7QR~{mHr$2{2c>%^z zwnO&EOJFT5C51oJU*;tHD`4gkzA(ld&IG|3-eQ^T-_2RS9SI>n0U~3^UwIcM3HA^T z3CT~W5It5X5j*D+=g3m!bN+j*XdQ`5B+$sfh$Fr^#^V-}6AWpP1_P+X+}>HkBdO!$Uj2g=L7ph* z-wWo35joB{7hY}>x31>?Vi7fAU_Q9sejo1-(x_Xcm+V*`Zv`+8J{cNsvOF0 z1|pGPR-6V%HHL{Orj7}zf&?UAh#<8bjTnaQpj``+}{N+=S(Jji;<5;j2I{Rl+Q%p(idvUmF&)2fTXIof9t9axf9 zK6eCHz}&B(naM06L*!Ww)F2y8w&fjnJx=MB%V2zmFb`^Sd-#%2_D`q)7$wt#PDi(0 zyH56pW%;O{Ge;Su$Rdjz`X#TWKgGz??Kksrf=V@!(z89H>9GJV)q)Ew0J4CmD$xsw zaoGKpY@PAvTr85pisbg_CHPPqFh z*-hfc1@{Y4X|wY*DE}>*?hNGEkv_NUWYS{V@r7Ho8(*%YKIroR8wYJ^yTV#bS(fYk zC)EqI;s$C{o&hy>=;cTSFU8IbBJkWX!xTVk|g%kGhRmCfrx*G2O z7XTEL@wzJi4B!SCPS7d9UJA4{Y{q=GHPH1%@m5v?0;IXYfi$1dSN2F~7fEG~z*k1N z>L%L?lWi44V5r3?uz)RzvL_{Dk~KS$fhO9;Awmh3OA8!jw89ofGZk5)?q@<+MDY1! z1|eWiKMD$a5O-}H07q=OKGp=}SdfIXkkmnif(CJd>DSmOKn#s+EnG8*Ox^OK>Ri_S z@dOdzn>9G;DG2cCdA5h53}X}HB8Y#%coE!Y$?fmYM={sovv=F{}TOO7T85P9a>m?BQC~1-)Ujcpl39g&{tb42eiOi!vT};kF|0D$a(|G2e$h8p#ye7l>XI}Rs z$`-e+ERwQ{FH3ufD73^*K8kG6MVZ=zJrQ?GLCN4xCw1W^D3;OgJcvJ)H_eO?L;_3AC)u+lu#j1{UQg$~G@Y4^+)CeIV`yGv7XjsC2QY z>}&q^G4Pr9m?~Q2y1N#JCqNLJ2o7b7poGW*i<{Vd z$gu6xwCkfsFNjdx0anJQ$W;SMh<+_Yv?Q#Y9c8kzX39ki{VX)S2&lI)=ab@Dv=tw$ z(J2UJk476ngp#WViuwhDq45h8OM3uj1pE|gA5h%^RH4j373#2yiPT}6&C{mW)z=hk z@$9Y@9t1?CpACa1cM&RobyKBfaZprxOy1r=UfKbhcbKSf+o0L<3mIS)oJ|^FI9yZ& zIaua` z{ve%gV$*wV9I%8E(9ISn-CC#ZS*!`Re6f8HJslKU0YGYgKTo{m5%})1Gt_{SCq7|o z6A`&L(l7!Ci%?B>Zn@`PqAHOV1Hg;z0KEnVo}(KkSHSXigi*$cCyZVG)(loFm{+-V z>_$+Pg@;iSj4%5ulxkLRFq#q>220*r67c=UF}R3=%O&m=JrKj|ye=$H{(4pZ=BoT@ zyDeAC5BXaLqz$v1iPtJiM2fc6GMm^^2rRQLL!$w|bDSJ|9|=OAf#6DL%nQH+f^0&A zO?MxDU3o3F2v0z(_Va8mOdoj7CAjtz7V=5Y-@=%~d<}to=oyM(tH+>~ z7LdWQGTTmYsB*6*3jt3vo1;F^BLR{ewr+|h}#&-;<<)(u0;k}`CaTA z+_4B7xr~@BT(bf}w|ji4Sjay<44J%GWD?^EwDVk$m*Nj3y#_f^(o7dsp_}`9D0=|x zQe19Z-E=(VT^t&{D4ASuh zp`JYWnr)MgGI zjOBzi5&edxQ%b$@8A!opifVMUfKZPDX+hcEhhg?tH`3NiM^}YpcBP#nIk0`Q=5raJ zTgW$19ukga(o$y^KDyTlHHrU=Jxy?i?Py-s`R#Lc8fb7awA4Sm;#A$V3-=JlZ z3=sJ2i>vxe4-!xeZy}miMX=wJEe&2bkk^fRIO-gyvpl2niFTEGRqKZ7P%?IJ31gm6)a~-)oauqoor6SLgxUkCIK1j(iJS~t9_MKoc*f1CE zf-c?+3Yv&gv*IZ-AwnveVDubPW7j8!NrP=0%WdJlG>R_`2Xj6LEy#M4xFy%U_#w3Z zXYyNrBzZ;?&jnk6Zwwc)r!NiO&yFrmzd!x&@>=d^|Nfg~!P?M`cvb4I+CDhsCRbuG zlM3B>NMHy5A>fAlC_ZkbO_ibxj|5OpIbcsDi6B(j`F2gC%7s)!$MiV9vBeU{dkOjofcXaxOx^AzI~ zJs2=wk2_P+L+Qv*&@1hWMbFZ9xB___ znDgrMz7Glh%mousXTpr|bUu>0mkPOG`Y3pcX}c3X!x_sf*?(LaujveZ2@!C2~8y@y;Gs*&sR>6{;(VU3ih1yv!w2!_ao1b(VYJM z(-e;|acUK`i3%G+6b2MxG=?`(MDm&^(4V5~d2cqYN{@07A(e-5Zk>`i>Rw>dTLbCsHV%qpYZNFE%HUAw z#;!KA180=`kDEPwi7KU`jD1uj z7O*KnLyLsiE65P0Q7k2@L03hn0ss#&_uzU3Wm~n2puz1vP{Tjde*Gj4uhaRjd-xiN zRGVsJrdr*ihVGe|vwm1>GuRa00%*9~&DX(VwENZc32S7$LXcP;lp3)*=t>ph0Laj8 z7JGR`L>BfXJBF186XHzVKw zWNFp_NNHYyffRVS1^^Lq*PA=dEazGUbiu+6){BHv*~StqECp4CkA-a!zh49AQ z-Dt3}7GyEgAh1gjS_{%;JkwhU$6pOOZ@Kv)TSuIL4+pdXxbEKTgg2HCocQO@OqVBit6iQ=(4wK|_QQvcmcJwa04=6leKcI&2A-#-Q!e*fu&LB=lipT<5e6^8lr4+#Cm zy3$9`McX4LRwaZDfg>htME)7z(w3c}72lA}%0FfR11VLa#k-{Hf)u;BXv%DErQ zR<@_cl&PE+DPB)P>#37^ph1L>`gUHAn1*C}fO^r(Iw7BGsEmPvmJ3d@E#;TuEQl)S zU9&50pol&VfVqYe=dcnY>AuP8VGX9Xw5hELxI&|3|4akm6BE{G7+D1nCMq^JAh4?h znk=+_**GN3ZOzF5D~CB5L}<-P2>?qRl`J;tO9Saab5lzuf*lD7eTQTL%W*G^g!Ul2 znk^#VY6z2bu^?-WPogC>2aSly3;lr;V-V_4ZPrSR9a*4uWaIPVnH+|Ccfm6et`RD< zrb9 zSziIp7jO2P(I!mU25 z&?{Lg((ijEi_LQth|Bj%R4|DUB-4VFUPWL?uR^UL0Fkbb9fO$3Yn6N%QGtZ5KxmbG zm5q}VoP^Z`GpMJ0*02mJ66}Q0omloh9!Y&L( zVdEFH=!BJj{-wn@3XAej1IhW9Mj+sye`zsOw=H`9r4=mWUw)Tz&Lz^Ne3AjgXDNkd zho;^!#5NdWS*O@3Q!?mwn5qP5fd`V^hyKUM|55*=N@}OEn0>7BPwXowSpibnI6ILP z3qT}A%1Fa`{>R=&!TJ?8dj7_jFSg#uldnnM!Q0_)d~chq zI|TfVdV8KDjB|EyHrk15hgqOWX$S-+v$YUbn=o#|mth3sGkzp=c0-=8X`bCiLT7j6aWv2Ff{qOO3b<2&Oa~}B6~)n+fE?Sx zLe+$k(AfidexrHz7zv#S^88HmLU0RER`_pspXQl8hPW$TVEtEW$Fo_(0OWD^2U*u-^WfA$xGR~S@Kp$-Wc1`8u$fR zE5kvw^gA?>jkMKGaFt-tu_}m=ejz|N=q$4=!pjCI3jy>lW_HX&H0jNNhqI>g@4ye3 zoXJ*2R<6VSxoy8YqolLqTUbJ?&g7zzl^dPZ(JdSCZsHFy=N->%4JRTihi0Zi=l%YS zlDf`mtLk|WEH*Q>_o*+PQSxyVozgRZE#YENBJ>P&qEi~3y{D|FW1 z#IK82TNL&$6%;zPx~Nt+Vasz;-Tn2zELNAvg--@ZiEimWw=nbISe03RY#S;&-` zpsDE-sjrNgG4){}a~1sh6Ty`VU=vepW~TPf{gw=<=&Z-832OZl(fQNN)btI{3cdFb zn`$4M{eQKY@2C9=$jpwzpPhc^3q)q(kBE$0FU$cl=orkkGPuRHLXAcd-9w{1ZZm;V zgcV$!j1aVVH}J`q(a4E0zY{)NJC>Qvc3+bxvT{~@591G9#~cl%gfU?ljO2Ej?$0yJ ziDk@EQ6vj3_B6>d1{hT<%DZcnDDS3GqCB2agqZEJ{+sTeAx68){;^P&-{_PrWW%%U zhAi|N)=8F7F(~6@Cs`=VPwdHNvf-p-vl+IOVS^U4G>ijIaYfohiS$@~OQb`LA}lY) z#&Li}*J6smfC}r~>mt3);^_dk*I^df34UNdIK}nGlKL{KFyY?Ry~o zsP=|EhL^`SpyXf#$$Pb*38^$rui2H9`>I?a)||U2_m$k2a~GJWIp*n0*`MOp z2Y;6H=WhP|JAZ!4A71sD{V{*I6*2n*{(P4|OZamGf4;?^Yw_bA`;7SMH5weQ!9f~) zK!ZvRCTK8LgQ4H5f3Lx78oa8(OB!s_;I|t5MuSH*NNaGv2LGwSV>e^40Ptp$(tG0t zx?*PV^4@p>o#?6WjTayi+Ufk?886KGl^rj{yzxTf*G0w)AL=xJGh6L=;lckZK3@3gYSwDT3vrAWzPDEV=YPU@VTRx#;{`b4IXhnXC@?8H zUf5SqvEv0Sj87j2T>e?(g zg70xJm6rwMg`~XnJ?=~7xtPZt7%!aegZDk|sXlmrybuq7r^j76BKW{~Ve1JV_Wo$+ zIe97A`{RX&<)uH`xlf*pVILSTEcU_sqn#^!@cwvVP5?YdJD(g8{Cnet_r?pe;_rBqvH3MXs~^qJiV?#PJ=&auvvp=Gh># zfBO7g47n!GFq6d<(_BZhIXJtzF-+4u z4^TKjvmcN0aq|u#V>5#0fQm>V-W%zZL(2LTVt7Rs4skc|nx1ICPh)|vVyvg}{iQL)%k3i1~?L%6*I zWM_xCa2CN#RdzT2g!og!pSLhS#1iJPHZr$pJyRbAkA7r$v`Q#9$F?w)g(cWahIE4I z7dpZ8HcDa&RyN#`#rUdLD7zSGJieNIYiRyB=O$;{Te%Rfb(-=Nl5sTs_kh|_5qDqF zNzO24BPVv0$K5&pGx+Ycnt(h8AaOTTM-RWUoP5W?eaFI0IYV&vd1Lxm)}5NLTlRD` z;jHjb=EbTh8*nJLlGOSa{Az#2w)_x}woH9yL{4{3{Kb(d?s0meaGFhmwOY*B;=9jy z$o>a8eFf&OvX|jUx~G?9 zr(#zQwgV01-sWsc51Z%OG&nAoz2S{C7>ZO=0TM_y>lg|0vzn*mLRne22Iy+%LtHmW zrr+i~wZjrMehD1w7%WF_UCZ}R@+srEt#S-^4a!H6u7bE==>t$O0nTlg*RI2-pyMJ$ zd`xCA1;sO3qJU4Jl8%g+oxR5#EoKMWw14B>7mwigPw~Io z>pEV`{F#d;f5Vt(Ez;{EE06jpCiM4P$qYyR0`vImu#oX{Bz+uZE3lF=pOmS)xtYKo#s_fx_uk@PkGH8-~CN z_dxC}1EFHmVgzjIp$=LavA~lfSBj?|4X(1{|>F>!Y!`wV0pZsA=;0j zX|ym}*hFP#2DmZETtEfKs?rk~!EwUS55F`;5Or^?4&JSVl=Cn44}~ZRBvxWk_m?LZ zJrvR^Ral0b@@rvf`UIWuRv=zPAKeQzx8pfe2{O1mJ zv-A&$U4n?6=9hd9#J(YhjMXHzMmkG2OoGBYAQ%*03j&cs)-ba|kj#?3_4GjYGO5Md z3udc!ANZ?onQ9{JMs$~7zLC{zVlNImYFrEL&l! z+)W?BnXWO=2KTHaMD`PKRD#FrcH#V%oQD>&^Up(rOl?h(-N9&N(Op1Gcm8sZrie24 z{9a+-HQS?YrWJU6!oUB@Q+)8N6_5x33Q5s)qAI2#Qn{pUsA4yH#wVRtZ1c!K>6QkVFtH+iXBAD7;!>KbtF4JbP}=j*%hgNNwR zzo6|{Q;I*s`N5?dOM8GHSK4>NkD#>uOBnLqR|**N=HD=@;x_x>IEh+!JZ6VSS>@CK!!$?>7AJ!^U)D(Gas)p+k9p1eU4ym_i773YCZ4&z&h?pk}8(ov|%Up0G~yb zWM1etQqC(QJ=zwVB+OccLJzMt2m2-{y1d*a2vNG&Xdf3RzS(5^XeVgsA z6P=;sjw4qt{Uj*xPx@}W%i{!UL~mz|PHMtwi`6>I=mM{sfnz|9>7IzRFI+?6r{VeZ z8pS}ZGj4H>x~F{b^`YF)lxJ!@O&6J(@bepX34Zn~s3l7-XFrc0G!DHXjuO~1*mzlz z{UW__b&TwLd?u?Tdm7$nPhnyzbYFK6$CQ;ka`)!L(SvM3zhS7Pu{F^ivKY~at6Rhnu;JYNWeYJHK>@iN8 z&z3Vck)ZqvQ$B6VuVM)J!KNen%S^iDN4XY3A3OMkto-(Lb1S7!D8CXWaA?@@V^{lA z-us091DZ7#nuY$Ofe1--c;Cc6mFL9inR9=je#aN= zhW#}Ct!iCa?gF-p!xVT}bl9P6Ww|r>Ho@v!0hi4wXh4h0a#OSumiFsVEp+%wv=EBP z7QRL%4@g0h_X3p5XLBC9&vYk8&G9;$j#F%BbHl?XbsszFqoPF_53ZrpJ=Uz$@=HEPCU7kAZ#lmVu|s$Qb(j zTR-)Ig#Uj-&5+IZlaHtx%_Ciye)HU?b~v9fBUxFJ;=TdyW{NJuuETu#U72iuff&| zgsA&B6MZ!1ZnSUleLDL#;XaILmeYN2M84Sov<0!4O)qo5WTWLSzY!rB!tNP18g>67 zt&3tYcdC7xa5+6Md0X9s@izBW!Kc*yzIoqM=JL7_d0Xzb+GyCl)JCK3g*F;LYs|8Cm=2>5)B810LNm5A2TM6#=GV=9PZ@@xuGC2=C6w+80UB(+Ek= z)A+yM$Y7wT5M=M4;pJ$!f@b}z&ZPChi)i%v7+f-C?G4ANT+10+_eNyiSp44&&@%{6 zMU}8JjK#cIjTcLJu?8>J|3qUqzdR;Mh6Azx4NW-w^v+zjF*`njrWko!~Ffc z$KGICzdmdRdRLDN@?aQ!#)YeXqdqdPj6Wad&-6b`n_9xi(Wlj+`^ogn<#BVI$XC<& zIqslL>72UA)--cm&$<}-!2lyCN9Og+sgE32pDvN0XHNtzeW&AhYu}uck+7iz!PZ{> ztY`M;0P2$G!u)+J%(sv7r<+O7BX(SUUnzo?^yxc#&9n@DYD*qr^kE=$HO+7#y_r|h zl#deK>7|y$<^*VEae?TBzTH8rKAkT+LL_c0!{L+D7%EspzefmKB zUh+1S_Tm9)M3&gP26A$}0Ex8poDK=^!HXNDK_l~e!JKEEN75LUNkczJxG(Z2Cr#X^ zE#1$SKCV71&6{H@YO-y;2DbJv0h=a85MiG$bio6DP8;Ii5 zz~~2Qpa7MBjwn8d7e68&=o{l=r^vORgYys+c4&NI`*Tb}1VnVFzcbZH`InA|l;eZf zZR0r6k$iK){D`yg%~k-9T(bwJFLE^`_l|zNVB{Wh1}LP_os5NbKj@Tj8G_g;6&22u zr?MrS@UX?7M33bxe6^KD)qtt@3u*!xpO!ZXzx<1V@~`^kUzGBiyFtopMt#%dmwzcxKIfNz zNy=}M+FGQ%W|Z=G2yZ3po?5mK9pAk%3lNuC0KCLyb7g156T|{P`3I|{wPr17APW+q)78V z&6fLDnAmI_GY3+mplEf0pGApWa~rUBlCM&{$BIl+dLff&nl=3SEq@*dv0i_W-%{#3rBvRrm|nVU2))ClTe8O^8>qaxw7{GM=8IEp z@dX4X^P^Qb#fte+oqt=d^L>~fErCb&*Hw zBINegK9Zu}z^F^EE8(FG$! z^qcpH{4}1{%*$oo3UBU>_v@PnWqub}%xg5>0)>6kWAe+ss&>;x`F%-#bMpI!{Ju4e zndHBKib)3PzuzS&(=PKGjjtjA-yK$_4d*o`{$Z?4d(Ue$p3*;nm645kjZObBRz{BI zH5xzdAHd4U+`Of&Xv%*WvA2ypET!u0Dl`hx(k>L7k^Fl_?7iPOLJF^R_bc7sHz zMq4*ZG{NXg5~Ub#%}KP0(KjSYG1~eTJkl~m)NP}8cr`|e;=mz#7D3mR{0`A`3A(oA z_lSOhpleJ1i0Fj`U0bph(TfSXwqzTkmlJet$q=IDar|H-2YxXPgWuV4IFMJLA5Y*H z6OH(tA8*3%m6!=uC(=oMw-x;HEc{Y9@z%os6Aj_SIQpO#cxmW~giU!qsJfa+JFdQ) zJ=SsckL^jWjch)dYTZ&$zp02NWfmMQ7I4;Uv^X4BufC&Via)3cgUv1 zDA{z6*g?w7NNx9^<&>z;NSwN(i`jPGeA+5IXVyJpBX@+?&U-82S9)}KHI0^EVn=s` z*Ctj-?GwW?BER}ahnLFCDEKu1csrD@e||rT>fZez2poEMeK2IK$h;MC$&l^u_0O;i z@Ac35{d4v_T<=Kfm>B18LGNihR#BgB)uP8Z4`63-&=0bh?J=3)YozTApFjZvNheZ* z{enz8U~Nsnm~L*AV1gFYfRWj<3rycMN-#k~V!$MbO`t;=9VDII@$(vB4Fasovub{Z zHNr_d+mz3wJ3KS53^l--1Xy}kfqAw$4_J!;>)%yioyahtdJ)~v^&Ot=3xqx#R$t(-$xVxzH zCCeE6S)-RH(w9mL(ihPpY2*n` zr7x96@zeW}&KfpLb~8vQ@aw^?hv`d*Ybom<|C5tiPU@^^_6BSSke1>u7mwFuT!ugY z%h=j?YHI!-L!an)Y)0m#a-2(e`G=U#`gmmC`TGrUVy<9LZU$B{>2+_V7rc>c6?vnq z|2?e%nYbDgerDot;Tp~dcDu_yg^dl}xq|(sDepeLEUvf1B z%x8R5i5s;dq(Q4fP)m#>J}j(?P+U^FQaZ;YvZmEXMCL#AF}d;{9c5eDVw#&!)S^&g6l?q8r}FGzrd2TOf?e3@ zK=@p?ii-AV1Z!ub;n{I&?+zwz1+(<1Fl*X1%%pp#=8e>vG#~$z!SK11nqA=80LVp& zkujtF3c5VQRZ`v*(Zk^u4;8(8?~rJ)8yd+njD!Zo?7gwDa7U(`m-ZVb?&@6iet@BK z)v)-8%3L)JEuu14EfdN*SAA}RZ)Fk|N{pz?RiE3$sLWMEOcCW=HMTQd&CLi`b2Gx# z+>CHFHzQol%?MX>Gs4y0W&|^jET18GcjJKb{c(WoGwKHx-b8s(7w&-vZi@*>X8 z|3*ie%}8f>ELXN=5b#|)2v`Va``-2S-}Ag{kVoGcPBe5nuLPOtg*45yYREu zJ!yAA=e@qcd##%@Wq(tk*gd_rn3tZnKm4+ba5e#l>gM810rrMh;~RH4nX~cICOQ9s z^Chf}-(0@5EcY>q^Q3|7|8_4~tp`4^FH%lK%Bc@-9+XoCz#0b-2r{{*rrTY606t{6 zyL->6AoX%?l1N<%xKlrN>Gz$EgLB{Uu*3eW!1tf$V2^pVa-s?+B1&;k0YJ@h<*1%& z_%Oe!4Ghfo%;cNQ^?rP`8h3x=Uhg?T1Y}LtFDlECh25@|10G`}$g59bYek>%D~kM* z#}efXMU8%ST4=74_j59@@}^DJijOw~6;qXaTbopKs|Ghp!1f8yr{wtr@{ZAkrs=V> znnX#h7Z@64w>7rUN^K2#zq#C99w5IAh#U#>ajm&reJ+Qqcv>~NeGHQJL8&pgJjC80 zZW%MyoagvcQm}qS0yaw!U&|lj$==^*5q5za4$TjKmz%GJKhkz*<$aP{(|{K~$X%BE zNc)-cHE!jsrlHLRXYdst;s zkr1RolPndXESP=ePr$Z7Bg4K{1=j0R6? z&?AAeIVc}H(N|ThBO)v7f*O16Q!19YjlQ_Po~xCft(6Ar8-@Om<7K%ys1y7S=mKT# zbm)S;{Xd{VROKmZK=L(6PDxRw(?dv)7N+xC3*Xc9a->%krn9Bz)4m}wR+z{JKZgyD z#A=h6*Jm8VCP!jTexisc?#v&Lq*^BBcPR2L>0CHBA-8*OJPuCX^-XPm4SpoS$o!PP zOgUD}9#L;05uxl}BiJM=eJRqpQko|j)+WJbKsG|zHIhLrY`#sR$)Qc+?t=C+i`XO@ zE!w277qv;Sd18~!Dr%D`nY2kq6tPLg>`}{A!n`kQ@C6Od(_oecpU~hG4NlOYRszo+ z!3CKMvk8Z$ir$n1(r{W3TBTk-OevfRg=P9AsU^$%jDag$Uc`B*Ej*D1@L z-#$@TmSCetaq4m$BMB*jNLa4gDUajm=ADEJKcfP$c=r&&;7TFD*tdORSPBfKS=gad z1fH&mb-N3%6ml<@zzRv8e-^p!F5+HzelPsy*(K9x4&*E5XhQv-_iNkvTF&pS6~S8@ z+KgAFu6q@}=Y8A8zYVzu%>O$N@xAs?;1J*8sKWj0W}b)kT&s==YbNjz-#c%g%|m?p zQSbZliXZiE2hjXedp|;o`}&3QQSZkR@bQj;kEay*^k9D5+@BV~+7afr#f8A-0d#{o zzbzp)z4q}L^Vq!-E-|;mxEY$F;g26j*8n?^*c z5%O~&ylt}@A+N=ZquJx@`!m@C^#dk&6~n8T{|bjC+hp2Y4xG!eVJlE7NDd@CjH{>~ z7F6w7XZyhsUPZP3MI5_&&Dr*x-bclIyde(wG@RUlGGd9>O^LGH7j5<^QSK-w1tbmk zR>{G2Q0yKHhT@4IahQgXA9bijI1M4Q*CLErgmM14l}H$Q%pQ%V%3cNoll>Zga)cv{ z$@Cw%KAX=N{}uTZ$0;B&vw#i_K@*hVh(58BCTQVF<1}mXmL|+?Z5_d;WPUlbTjjoh z)7D%o5jn88N`c=E00P9Av%&ED0f9T5dkwt23@n$szt~sc<~%T}d|&dri5TgkiMg8( zy4t|(sdI5*-eb_#&!duFLBANcn+PTBt^=Qd3%Pw1LUOwX;ZX?5?HYuJ+dzlc87Qk8 zvd4kdxpBD4Xeox}?llWU{jbnq$#kgAlek&U8Uhpg`XlFgzeSn~&O-}jatqZgvJ&TN2{zdN0@9WM>HJ((y$NythpZzn zU{j7%Gg6M{YVaotJt$AUZ~|^wJ976~@zF(aD$a z?&#ge;T=A*Gav8%T$OwU@1}1n$Gf9`Ic5EnXQ#X-pY5nd1(N|B1`Pd4rXRN%myhq6 z(u+E6-TZ8fsr#3#2OskZ)_oi6DX9B~(D1si7&EMHQj41;g<4X{8fiSkevK#ZHoV3u z;o&vzKX!PHWq6mzX{j3( zBn*-Deh*C*EKoLlRIil+fj@F-0TG6!o6RdkcnKx1CZgiVorP64o4l$~6DH$1+)mhw zZsSG+M&8xpWPBNJH-Xb^IyQW0V`h9@`%HdpgG#=^ZQY)5_I=8k)axYsOIc5pDNuUw z&%4

    z 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%0D%fJ~Nd5!)5^Kdsc?hKQ{C{tW@F0(p?tQ(G|NKz; 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≠4dWf$_r?K7W?*A1VBM(SN~zyTV_OsK(bP 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%0DHx}dPNFMyZuu5b1!1oD$hd%ZF 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 N!rVIsn)j6`-k~u-5?T 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

  • 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

    SFJw2-aB#560LcXFKiNoZ)f3dUVX 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

    1HS+7^4CMnk7Ghy06aP?Z`_c;0yEL&1^2 z`RQ_K34O-*v2?yyNnAHvC$CqG1Dn9<;Bb%x;;bFMcV0|tP~$9#=9tbBXXTn`&-EqJ zbCpDSDN&xQv*S@BJeO8Zu5-~KqWjya==OHjSU>GXPZ!_+5SmurP~hySg_h7~d>cDb z70^Dd`RRYqnw8d$R`hi7y#x9|@Mx&}KI7ZyA6793;_w5#uf+pD7Y`T8>Ec;Y+Jm8- zWF+WlkBo$#3l;+BuS=mNwEc0RJo5IuWA7~LT3NsGw29TVn;Pp5VJ#BTPQP}W?bj|c zz1u77hrecSqr`tveU{@5oT#TpC+Q*%z%o~VauCfrKFEk9{8&(}r}+~j6FHzQgVvL; zmg`$1D#m6D)zOQo*P@jH`NfaLD0SO4@1*I=GC3!mPZD;X9L7KTy7tv4(3w7d1kRr6 z&=RJ-WbJU}mb0hs)XlZ)mzcSfd3L)bzhMsP_HIeg`-2<~q`OmlqY5Z>rTte%I?nco znJfLVfaEiH(k+J`m)EiN6=@goK34i#oSW%`vNKaM=#r*Qb zppedu4GXE^awKOWKdukd<%4({ix&jSxc~b~57W0PHB8?mmv3qp3yg2oTRYcchqJR8 zdIxwII6JpQt)26K*K<6Sk6XoV%#7xZoybuvx6S5yZN%IL znd|HJ2M=-+i!aOd&Qmj~X!3MklyRgeqe~H;FULNW`TI+qLziiU*13ZVC-ZE+o}hz> zjt|p|^`v-^k?_ar0;y`Ug8_OX@fl6#A4-`eBT|_RuoWgsbW$A~&D4#QRF#oIoLQq2 zvy7yKP7W%JC1PXwJqeKx!-R@pQdaJML2`PKyFVHY$VgnM=qgBv#4=-}xn_XeSOHh* z#NUzQuMqd1ZvDCwzq$1N0(54K^bMR}e+4a}YdgcGpG~YeGs89F(w&i}MCX8Fg63fG(*JS$(Q|Wf^+19_M@l?7!2>M8{3^@P30xh8*>DIh!bBG-iV`TKa zh#C5PFD_%BFR5#@ybJw#B+HCw3D*LxZ&u^=N?oLn@`nccI#r@MVm^bOC9R!HRS9k6 z0&~jzP=39i&Ln{j$qf?I62rsKC3+B_XJ$+<&QFx;5_0IE=p6oHj4p|e#q0U>7J|eC zJ%F;5ls7ae3lgNVIk@6yfqpcqO<9`!n)O3@Mk<}nfnEV>fb+wZ&=S7ZWgfz%v)ZQm z)ib8mZQ*c5X%JK$#C|^~fXft@FNYs8xmV(gd!;ovgn?g5C7Q8?(HuWFIv|?VRb-oD zKM^U8FUk$_3-rR#dR$^sT$M~D5~U-0qpt@TJ*qFXdhbTBQuD;~{tjJ`pbY?=-bX-7 zaPLpJd7*T@r%vh6yW${v{U?A+RY-i9dnORQ+c>v?Jdmb0g8`!V9P}D|25>U}kOxqN*a^b24YaC#SKTD{vpS}2daPv5uq&U)kO5$(wzsppca zJ^Am5x&2(5+ZFcVSIvjq=aP~JpGS@uWzg6iRKbbXBAFh`$QIM&>=qCf6 zGeysdE=YZjU9LtRtH;FynFW@~l#~4PBMc#5sQhoM$lc0+S4A4hR_&KsyBg5j+0_hv z2e=zJyZ#C-p)b44`)b(r18c%3)~?4p*>!>aE;Q^X%r3;luyLIYn@3!AHmu{b7d%cCIn(9%I-Usq&)qa%*38R^U|_3p{TX^k#4-aQ0mUEunOmjjx^IxQ>fA(|+nG zkX!UCYMWLq`UY;9#Lz7f?~eFFa{g*Phu(%b{7nC*wEDLF3aiI1xhtaDBE#;&@?Gk05pUuw%@fr4 zf}XCwrS;(fG@<=Ut49rTTzqeaJ{MdFoF3nVmT+5GZn$|&r$^%%8=GpkI1P%b9+vW= zggpg!sedSM#yI`BnHZU_AG8xB?N^2N!`I1u7y4uHFW}?`Iep9BRJ(Ca$2Qzu#U9j6 ztk-_Em0Jy87ym1v8^IRfw<-0w+I`yAS#6n&cR$zEn7(Cl&Ty7upa1 zN@Jntt%TkV?gCE!qNJ67N7&we% z1)No&2Nv+NJpU}eg#J;Ee^w+f9-En;Nb0OuAlFO|)zx1a$F}e~mnT|}%M7v$^j4J! zW)?>4Y1Mp%3CgNW%?~GJjbUQ{;Jlzv>#PBRE*`A;;V8Cqr|C!IZYWvho63JHNoLx6 zv-MvK{&D{MF7&hD1>pQQGtc^O{oif6X+5+D|1GiZYw_FFHea>)kNM{IrZ%_5=K7%h z>LQ+rkA9TxJ)oDwi}d9xK7vNr7(EvsU8Z!6K2jg8hcHf*r>4*=&xwwtkvCNTKryt< zs3UcBxtuN>-zq zKlZtNdjs^(z!SjPpOtUzf9P#%|HqY`?VsCJzfO`)tN%PlSgKb4r}p-JWjw_6CyIL~}PJ+m!<#Dz42W8~vjHG9Wkwd4AXQH`QkM-w7 za#Ut+tOTQ&aq}+L{!e2137S)0``y-#<>=|k-$v+ffEM8F_!wHkr~kBee0qLoJJR|) z$GDO25$##O)X!z9_N@1!=Jr9>b6E-RW%cSnZ{i%9)FpZ}Fs`g;+Y)mN#KT$PAU^qV6*AE4VKBZE=NfQ0P7rzuV*1QUG~%%m=#Zz4^4A@uP; zgnwn&`k~VQ*19#KuUGo9NaP#7zBt0kczTguC_V9theP`dQthr&pf`gvfwTYX&=R_i zAGvaH)w(t7n!Z%GiDT0^a6dZ}wJOa-?|;jaEKu6NXV#WO&|xg>su8 zvGy)5OpVX1gl+^|fRp=uXbDSu8D~g~Z_W@4*N*H|=SNIuJx4n0FRLF#yqi@S-PR1! zrnKlKdb2Wu{Coxpblh7WB`WJN6evI!vX6v#4gIOuHZW!1AZQ7NVf(A=cu&Koy4CBpENNU? z*Vwqso~PqiFC+DxCrNMu$icv?wRax%#RzgxuFpwV8AWkFo-4!7rZ8ZPr{d>UpBm&j ze>Xy(54Hm5?>|CIaOuL$6S?%bzHW8O-8&;&|{ddNRmb&nkDu4cvit+2K~)=MGkX%;q(3DS!oWQ!t)~7;N}c{a8MB&#E?Tl4kflJ z+Vn+Ho$463K56Z$EK1pRH1wCjO5p6e2s+)au6|BS?=CeJRgcHLzn1*~Usm7K-p78K zU!<})T|Jj%!k|LDI9KPVK9!UtM8igkgBfZHbvYlr_NT0VyO8h7-@iZyOzS6r)34l4 z^LHEfb$)MLTfcezs-u~#SoMVlDG-w7tgkp%aajN+gCf*?M0>449yu;Y4T;Y83#msI zXXxa_Tm~ZoGu`_G?Msg|`Ha=80l6+cTnv2;xB)o5+MxUCH=`V?70HRz)v}xVVB@;S zl=pa0CZzy6?Z-6WU|B-6mO+C3Q}ylcP#Lb%q37Lr8z%k0)8h&a0vK2YbFE>Nq4;}31>o=h3fj6^*nyduRm9_GX)zu*bBy<=kaT`?iSJ8Xbpn1+-8zI7+Kh4We`} zR)q{%7WxBOR}hn!eMS3+c0_D*yVZ9W`ji@tJntjuSV`bz0jKX$XbFW~)?d5y&w`6B zO{O0@c4GR#RZ+Y8O( z!+Nyqcul(Awj!NZzoB7s6LS(|Wm%5q*Zf(t2;vplMrj2GY!AFQQ9GCRQ!ay;)3|P6 zPNdL3T#wTWUXm(XL7D{h-c!<=i=Ts{h3sed43TMxqLk!T23`tOnZ1rbe2Dtb#zOK{6fEg z5!kY15qWN?zdvKA;}c93@H-tXj_JH%V`ZW`j|O3Jwk``QDdnY=JQgz_is(Q4dWb34 zUbFVrV2`VZ&W64edwX{E* z^-&WE=XI19$=z1Z`0!M^7z({Vr~ppSL!c$x@qvw( z<>7inr)Q|!;k6qjSrj#^H`G^Ev Zc>Xf&y%~&S=z57>NUbEj3G|ripUTIf(rci- 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�$_QMMV8@+yvE=25on$0-!yMIdTo3k zMt&B&2rTb!kXyv--%6TsBzDS+;g3EU=kJR=0*nEce;jg4`R!?GB=%4_8^%JoReula+EUp@psK1c`DA| z6}d0S2bO;*vJ95rma``6bKNn!til&vRh4UC2F@5Zd#P7Dd-M!%8G3EJw;?|O9tD>7 zaby{6eLi5$xi_lMb*!Ds#eF#2#9c<$Eo^+KaKH5&4>((0@m9cgB#OS!@phh$^LIw> z0r~>VKM+}l7Q|a+fIZosQMgt`y_~26cChJItk&?BqSwazM&x_JgTV4WiY$YTx9t}< zig!I$Rvl&Y!ode`3o)&5Ux6Mtzrb6F8W2?dQ^&g&{kEQ^KEwJyXa{7F?Pv4%aH$<0 zb5*y=w%q(l2go`&p1DPd{53rD(P`tk0l5^M=i{;dVQf1cZ?}9rb!ECeEbSf6YqG$g z>2Fay%#H$o9AZX)_RhHeA;?F8Q9y~5`o-Os33TC0qH=efB3G32hGCumhZ``NoB^>Xc(wxzS&X zE?Ztxo@X5#v;{J>xL%tsyT3qH8vTXnvii?LUJpuJtH0izJ+hYr>4c}rK_KuAE12IaYet<=~ju(nBn<7^6Q}5$7Aoi zIBdG93rPIAPQDoZ(OvO!)d#sh7zAW!asAeJ&D0|(H2O=>W$VWk$XA1FefnGU-qvG_ zdM#~<(O>P;{}u8#;D^@g_ZtzTE|I$i8c_l2iE=;l_RaZUOv|v{qxaf^>0Ex50v@z z*P40e!XULy}FIvkJ_cWxo()pS44NtG%#N#s^c@~%hYe+7khmA4

    s9BQTh!*u_h ze8W@lay*?*Mm`NJ0Cc6Jlq0wLA)Bim3F7Vq{>Tja^@01w*&MR^IJ0s_T9-uY$ zAEx{7lpCJq=qyrNIZKOt8MxBN(|rFwULTt1{ySAh|EuUKG5Wti{ulV#r@#6Be?$FE zcK;pc8(psQe;2RUGms0xTp+{Y`v-BJCc6Jl%;+!o>3z2@$KU;TV&CfWTI1t!U&9v+hyWXpR`4{{{dYb^wtifWd=)77>2FE>Yohz_#EkxGpZ@*GUxV*kslTc2e}U1T|9ag1NKM;rlYky11PZQmKr^4tj zM3>cHg1io#?bF|UKiOA4oA35JRfcD$kLLsAkHM#{ES?u{YxJnSeYAOanH( zS`webbo;sfO4p0c=(P3Xe&mP14j)fT%GF`I{Z7pA)cSa$Z-$%qUi6|BJ{kftOpYzwrnlX7oF6$L;Te+zs>st;^@;M*szeXE{2H zlvc;N6!~&+wU4Ly{=dIIG#&wz82zuJtHkL468S6etxtdR{r|@Ln;HRB8lL=j;`MqK z@@y~<$Z+`nfuEs|JNf?QzZ(X#eq zLK7na9gpb0b@?qqr{%c_`4Vt>t9hCq5#$@5SJ7$P+r7wt2mkc(w5+{tJR&GG`g{E; z{vI5UJP}Ly| z#{lF(U>Im!IuVZsJ<#X@)Bi_TOh?JN68Rc%olk$u%2DGUXui>3?bH7a^7r6JpZ@0i zYxT-$vpvv4!!u$}JRYYaF9eH$O{bReG~WX)F+3GMo|lnd1+TZ7r}-Xex#5ZYIiBx* zko$u{z{aO#^`rS7Xrz~aw3{P%qX1B7S#%O znd2>UobhpYBTno`UG8epYk3ntVBZU92P|)UWEt$ee%8N9qkT7i){;Uzom9AII^LOb ze`XHu_sb36eDvA&U?cJ-aK7P?@oYXlEkW-AP4%)XjsBhJvhjHr`F-%APk;06WnBLp z>&?iwf>UkuXMY&Ce=zbeFcQenQu`bCuGx2M^q2bdUx$1n*w#w@jeFPZhxke7_a2}A zZ;^ihKebYSN2Ch z(x<-~`5o|nEA=AN(O-(LQl-stu1CHJ+ybor z=I7Vr<*BLpb?2aI|IlUU*MCC(FK|DN>u-MEyMg{@=GO}hPXRhD&m!a{VENDEX>xwO z-0<9w&N7o;e?+bZ@A`O}pI>hjpC;$mYYb2Hukn6eFXX;pAh7w;eE&4g(|DA_U;kI< zO9{Gc{k|OeDp2mz-;(;*c$7o?Vf0s{%htbtAb$yJefnEc{~C{S=ocCN`Jcu0&qO{R zoB(Y4v_yYXqnsk6zuc$)A>>EFD)Uyb|@c;BbL`EiG@d^S6};eBU#vi}y3$0+16 zU>vaN)DoWNM>lBspRNyOKAwA!?*k9ElBfC64fVqC>_exm7m?372MbbxjZaI;ZS$iW z>WAT(k4{^^&qux(Tn_9w<7#9XS~0$vw4$_l$)Ld_)HtW<(*>MsGyHqdZ~6a&ocMR* z4J>~qvJ7^dWBnmFJI?X3bIRZ|eaaxDPZ?Y(91l42I4CJ%>VRa;A)T-DC9h)Q5CZar z;1a{#vhjl@Zh9Pq_gWbxrwW}mzI&1X4*u!mIdXd%=V@v@6f-=%_Qm5f4S5DQ9>~zz z_%t;xDlk0dKAy*sp90VROrEC3M@5F`fRCr+KbZRjdEn>7r>SvLnc*oyr!5DYk*@?> zekRZ1#!D53uiD4=4f6Nk$Dhg9)VQh2@QnB(9iQJ@XM7wr6nQu}8rXOpc^nn5Pfd-d@(oWZI!lyR$GIE%UhsgA=g8x! zhCEG=t4a*tK6Kl5BKb@54rBrwuhz5^O^vV04NoCDEzery4PevHG(2w@tstk)Hz3`uJLt zPfd-#@Gh?28wb!?s$$_d9rx4zfjnU2b>#6^JpGy)hZP#0B6QmE(G|#7gKK>}`OThl zu>G|LJk5;9$_-z&kMBq1gOcm3c)WfFUz6jq8pBtB?lO~(tB^~;dLQ4B$7PM;*W~yt zKcMri65TPwSB?A*c;Cl&uc>ibq2bA{jhDlb$fH34kU_rhTT>338n2ZYo-%aW zdVCl1c5uIsr#1Dfsc~Dm;o0ZoN%@*NAJ7)q__T(nsqtH-;VDF?jn6vdjo_T0&(mle zS8aH9`glG<{sesX^LZML=V}d4?3;Lb8;5)>m;!9NwWho^HLi<#x?FGe@l+x|0iN;k z9C^IuE7yk^-{l*=13tdIZ}EKxdIKA;*6hF zv7jzL)#$hU-yn^Z z(Nc+P(b76~X|Y;Kaf?e!T&lQ|x<<76ea@D933uX5KEFSHhu4#NW=P)8`>gl8&pG$b z*eGFNnbO$xR5f&UwL*P#>Z_zWGlu#be4PVgH$Ka;_y0W$%f;>?d**hd9jd?(!a$u0O$pDBR_6oA8A%P<*=#S!6o3A0h_z0(^c3<+LYct zhu%lvp8{>&({l^^NWd%GcX7L&uLamD}d_m>9~b^g!p8;+Xwae5qw7zzf_RG_qNVB@bSPzfTuXeyRO1LQmXXAu&vAQF7SJRoesS?>d7tKBNa;L z5NvJ~xgf;<1NJ?EG(hJo)_4!)=N9gfMx|2*n>yY*AN)cf?9hod{?a;8!adTe^db(u zL*SnPhyPD{uHhajPEh0D|Ll10Oz@?^azK}3tnr?mKi6=Ngq2<+YzKvPLY@MD8u+V2 zFV^`t^xVQd(x`NNKicguAABfK1n7Ll(GK0hJrYqmA=uRYxB>ho;8urD9R1iW+#{_@ zr^TW3KW_gg-1`LR{KTQ-7Ve=F$@WkRn>s(sz^j1O-PSoK+#^Ayv(usT0{Bb7fo|&@ z6Yh~xr4u0Dj`mgzJ_;BI=yHpry}5;Zq(bRzbm;5={|#`jLnqewi?{18!aWjJdWRf( zX?S*H46PMHsrtIL0{k2x1n`R}FVA{#p5l%7Mu~?CM|p@C?1d6#zl*@W z)_)iL3*cKo>wgc(6z3n!`mk28d;~M0&5FM;9q2o6leXo#(P1fGZQv-JE#S(12%L|r^|S+RO#(;=)D2{HqhEVJ=b`z zLg@rOcD|;9&j4lv-6+51;%TQScKfbzoJ&zUTO2wMf5v3lXE1mHPzdP!#G%t=yw{-gLa?pt=?3s^z;=gT9OdU4?=>l%7TDY6*8m}hPK@zhhfcJ3uQ*k<^CpL03;0{W!T*zI{>}AVZtlj*a(1N@u%6=a1lj2A=M=&av@cgVG@>c6$qg4*&)O zIzMr=H`jQtN$FHObhd)u2;Ab(i81~X?YgUYuUYA}IP@sK`^5x&fX-JOdR@kQZAxz@ zYzKvPLh8WR1Lt>7ugiEZkS6=p9@y6X>LB>Lzy}V!INIUV=ub<-{XR;sIAD(#3&0lx zO935kEeGc*-gu9Hr%D&wdnBUtn_yp$SN{Zm2lxQc`X7Vy6koh2zR@LyQ=K?pnl8(| zIL$8ih2WUrL!G2b$*`&{}b>Rhfa*+Gjv?TJrc-}`620ceuCfw zfWbig`Ed>RNU_qXcIa#YzXsUaEgko8uT1GQJ9PdF{uR*PEgjczkA##?Nrqi+XMtA& zRY3gZ<{s`fD4j-!P6YfJ;BVd1aSiiGlhX0^u=7&@J{%YU#GfD6Fpo4VosdK4X7KI6 z9o^D#4f9Bw(rJOs3gJEGzu^A^XiqyoF~)i5KdxaO3HFfvrxZ4IoL3Eg4p8gRi80RW z(1{Y}kqV{P1lxLCcp3aP;7x~K?BjxKm`B1&Cp**DDFL4VOagR!h+W4u%p;9TCk&hV zI(9esy}$zwofxlUC_mRQk3^KtA%{*%mY1XfJprAc*mc~)yjG=C2AjHmLg4Fw^Bg*{ zmz!&NM@Ua~{fEts!h1sA0Dl{3b?C$x-=W-G!#h%{bb{G-d^Z#PBw#L}%Pq$EPU}Pq z??_nbH8}MC0RANK=l_eIdw55hl^*G3$9F@)3xSb<&R>l2ot;1T@QwsCWxa)9J1DFZ zay|GBz|9W580Xv2J3728RrZ@AZ1me$Em*E_#PyD#SZKt7=3sA1qd#T&;|;{Bj7y6 z7sml#kDqvIR_j2&fz|{_&7{_C- z;~L0SD4l(ZJl}G3xRT=8|CI2$TcdR z?GBwM!T$vOrF%NAfm}rCkbZW427?y>g+Mp*;~vNfON6v4y^uri2Jmgb_U`Gq2Xr~I zeYZGtz6bviz!!>kCtt1sT~O(i!lrI_E5TO-YrCi88qk$0ot>~*p~~_F@RxuC4xJd| zIo`fq1Gc+S>|63{g%y)bO+@!=lu`+(m$^x_yFTm!mh zrE|!klQ7Url7Il9^A(4VYe3hgbjrA0VHIaUz|R9NaOlJ_4!H(&fn3?X_c(M8g1-xV z&^;aZfKKJ1Sn1^tvg>IU_{l&S(2eqQ4eZL4P6KRiRN4=NKL$ME(1|gwXtm>Yk2kfY+vU4mouEL%bvz zNCUc&AJ+gc&_}krGT7AP-#YLOz@~2N92?*jE1f;C85G{*E7`%{0uDNK;%INK0bZHX z2^QEoCxXugP62ee#Teg-cI_JAsXT;~UV}sL3Glr@qtk2@cFjuf5Nzx5B5|0Pqyt%ij<<5bd5SmQE5R_( z)xKRtU)dk3VPETC1^z4GPC)Db2Arq(;ytb&Q@BS$dD4$V(9z|dG~7#4fee7BIL5P* zDB&JyP&#F>sqV>{wHZs8tjRyx5# zTc;F!DsUnYf4RAadx%kG{cLgQ+z-ABXzG@ZYq&=OL8;T`(8(zc5>h((#ddz?fR_Oaf%wbKHOwOo zN~ZxfD}+@-9tM95c*3C*W1NR}?HcBhh|+0?&5+Uwj=(w?Fc{z|jySJFCrX${NIx|W z!nPh4t^vOuxY3~(`?%m5=8>S%X?Ezefqw~n+btc}FprcfosyAudpHC9EMOU+%P;ov z$2H6&6-uYkq4QVp=YfB8OUFIT3o9MpD7$|0!G{7xfX+|s_2U}ekw&Exg3XP>D((XX z-v(@V=)@S`q20NLccfM6w7{m0x5#KOF#s>1^Alryr*)!*cO=+fw(ps+t@Ucb>wpda z7d`jzj)aun9@q}6a(oZ`1K?waUX1aboj>>RjzpAR{uq0nI0JkZFbB}(8RL8#dPj$M zt;+ru*wW*}ec%rO4?66}-u_&}Izk4h>mO|D>r(1i%m;x?K<6X&e(M_6k)YBkhfS?> zA^0W0<=xV84ePKbC-W0==)42|K5(eJI>#QzBo#_0f1I74+2C`4c|iQ-hWs2G){(H% zX@Je3uu8~o@P~oN9XheMGuN<=G%B5Thfd!TFX;yi0(5?2jO%!Nb`9$yN~Z!gb$+&h zUjuCImQI)99BEa0%?`cqz<=OczvxcBx(w$C87SLdDQxR@z7l*ju-2g$dw+7@w+kwr zoerHBz+VCm#H6#jroO6fW##g!=wDikN-tG9f${b@Gy;4yPy*<75q%u$q~jjGkP4-< z5jJ(X-3opiaHm5jdbxGhaSdNcSn0GnbbbP76THL&=={X2;~u_{Mx`?oHg$fg!OsC| zyQAYCzL1F0X>#bi3f=;|-5nkG@P)K0o$TZ7{EP!14@?B&E;sk^g^)qA|AZYncY)sn z?Cg$?d-y_vO6L%4>g%ij1g!r7X@Jg8%CSj!$oM`Jz2cHR?4Cr!;S;u|)O&XQX7TDC~b|3fyz=IB* znCr)V`b{EArwukY3h(i(k4abq0hznGD!qLUz0bk_3w-^5(Ca+?ZcsYKrS`mgG58Xo642!rectV!uPD=Q(yH_t zVLK?S6Y?kU2=J^!FZz6_litzOZbAmjdLonUcGnlYA20~e`H8vRb((eumHi6X(*5*e z@JoR!9rk1HKb@xArOJN9VgEhw4}g!mW8Zz6O)8X5{uDbOGr>;+<^sB$V$KJ2T&CG1 ztaKV2IuC(A3he2oj>|NgG%B5T*bEBq3CWy_bwHpGpz{-RyXrK}jwt)(u%+!^1Re&i zaM+JNzwX>_U8mQiRp~?=Iv;|641C@lovx?XgyhTqQasJhS2_3@z*0b$Tg>_Tndx;< z={3T(?my3g?*m?R=*8Ub+^5&1RO$Gp+d6~5^MPT2&R2AuwUwbRX4VzTel=|A>)Ykv zn}Mqx_M?w89rj&k)L~_RA8hGzdI$V{;E=<94F0=r1T-r9`7><$lfkC}Gl4kD$8`oB zQTDeu?EeP*x4`}J*>{~ew<`OG9QM5@dWj!M0pjpK%8XftQwc8Xy#( zj_Zs$sO&d6?7sm15^x|s`>r$PQe{6d)Aqj*d;~BCh@+e^!gs8_cN`+DQ1(NxRiTRP z8u06Z8y)teukUyCgAU`x`0lx4Vit3A4a$BqY=xBl|AK!7v^(raKfl$_>?hgo~t1=|o^tkE?HhzYVlHbYiFn*N7pc><3S> z*8Ywg>`(fD9al&2T_W(N`_M^uMN867UA+#x-Lk=C^$v6uI zqyjo0vFmh>41@_%I#i8+uo;#gk$Uj+fD0Tt(c^>8`Eid78kEi+*bFM2{on_H*Bm<0 z=WiW4og)Hatx4I>o@2MGV(?MGIDn@Z`*){^K>R6bR`xf-mhK-7;5PxcI_$^L|2jnk z(tew=-{P?UHF!JlLwxpKBZ9y%S*#6H4Uj&>E@YMBrijMMkjRcC7{p}9>kAOc8 zJQ=tBVq#G&&J`1`=2_;k9Q`8O$@{4zT~v%%*8^8lWBdBu>QE@%ABN~Zxf zb-&mR{xI;kLnnrQ5oM+?TqSKvhs?A4_crj`fkuF;{M-Z1Qy1r=*45XoUtS-)AXrzm za!u9p`oh)t5~*N;epko8QfflSe|GhM)s^e2gXzbAQ3Wxno;1>ax z#%JF(u4_~FBM$oq!QTZwh|hkPab2KDwxj$-b~#N3p9ahX;wUHAxUN{)-{P=;H~784 z1M%5+jqA#k{X-7>o>TD*L?9W6!++PfE~M8oqhHE#0nsXCMv+QURTh7}}LjJ_1)yK{}1qH;Fb97yT)}vWj}DH?SBFIa9{+W%O?i^ zUE{h^Wk2Mwe+~Hcz>RU+KQ^wbQ1+W)D=54rvm*7_e*E@7#Xjfgvb!3$6AI%P(!{A>4-^8S|Zq4eSIU~i(B&c*smfGXUBJgtH zOhA`g^l`+Y<1+IvRra^TmM*VHz#j*mbl8txUQYYR&ipHs{dR}_j0&6q1#$rGe@ymW zX8vJizZ|x-|MlSK0T;w;-(}|CsO;}?*nb23ZJ;$?`(4cZBT6S&Y3E}C_(Wg|5LY?5 z%=}xG{jkISufZFEd*Ze4HuE1X`$Mb4K3Rry;D8s1%YWCIzc4|9N@pf)R>+S?6?iqU z#-S5^{_kk7E)hVPvcD6yLdyON;4c9O9QLEn|Btcn8UZvYoxpOtUl)Rp0LB13bv^%g z=(t1xP0D`AVgDNN>wz2NweJ!EG%Nefu%-Lm=ivVZzIND;sb9N90By>C@e14iJn)4; zIiSlYCi`7P0D&>G-EN0XJx_ZC{Bht(hfYl6t4jn>tn9bLmY)CjsKVMWkPGO1M4$gV z>e(d%2r2vJu%+k!7l2<3T;{MJeg5CszIz1Fq;w(`EiQ?%9Kt6YzBo@Lhc9O1vEKyqR-zPIxZ1FNZD_LE#0pCtFQ(F zqyah~F|{j~2%tgPFM}=J|IP+q3!Lk)A5;Hui2$0E{U(R~{on_H*W$JB8Ue^cZ&o_l z)pkBcgO39y0J@xF%7;rN(5CEfblATcd^>PQH|%$g1Onq^du@TOpv)5a0{m;>JBR(4 z+L22nP^|2ithVi+4t^$30qF9H9tSwvY4k{-OzAW_be;kKEAaPtb-IWILQ2PXww<40 z;6=bFAg=s$5eYOXoe*s5{&55NHekC$C#H7QMI_LqbXs9k_wys*^cmox*_l|a3!F1uL9>u@3U-sqtiZ1 zXI0$hzE|#c_~dTK2iWZZ$R27ARGS^JSNsdr?qOf+9|r#x_yN%RWR2ACJkH5|9=;J( zc*e+aOR(Fsx@HwJofW#4*7Cij2O$gKOP)qkKOwD3Zzk+%y(QplfjU6zZ2;$~>441V zu9rLI_h_{Uy@ftSX@t&uigMMf88HF!0%c>kENL4r^BI9%t@|UmwH9Z(0Iiz>&Qlll zd(4j3vf#4X+BNpB+s0tWS zSb%!Hrq}XX9xL5z;NJjr+wUm*h_bI3>uK>$j1(@F{%?VQLGcNmtp>gm_&uQg{~I_@ z`G=(c!DGuURJj5blNDN1OGEci{3xsC4qtAN$7w&7&qgr6IfYOwGM!|hb*R}*w~J?{g58E65tU+;tSbnQDIegfDr-<)8KqMv(b7SaxKo=c`H}WviLA&R+6!AMfESAK77ckS&XSPz% zzyNaq%d~oWEGr}7EUy<0GC}?0jnnWBMSj1cte&-c=?rs*ZlA5QWWMv);W@w}XUH3P zIj{uK`CeQv^F8b{S?<%`k*|*a#q-TCB&(|Gc)nZBca4K4Z8e)b;^pRqgChU0W{}Os zNH&;xSx?VMPcL&2%QNSsB%*(1n7xpd6gH4&D1r4)^`!OoCMDxtPn1|6iw$Apd$O5q z3@;zUOv+-(_&1Ed^Rm7H{NA8UyF_w(@DBo3vUv65HwRh1WV0umfIk?}(@OWJS=35I zH_6iyeJ!Yr_Krx#Z=m2&{Hb2cumbY^4A$4OOn*;nv~`A+lFu?=GCjqcT4;EBT3LOQ zVXc*Vllh?FO%xSihft%?w}4ha z*TWHTp7yDJ8Tr>S^?>6#HOnjO#j{Pr>`wL*rD0YhekS|`2fku|G{_fb5ifAI31yVT zW?H2wMQP0MO@x2{V&)v?Rj!2>Nxx>Ux5tac;FZ8iK>Jk(&QtK;(jS-ci?(BgLZM->_rRow1oGNuAuv;oD6Y>i9CqNsZb*nZ=-Q(3c9(|st zQ@dQZY$KHOn%QMZ`x$L!*E8`_x}Wj#_&$Z)W)-0}d-zAAQ3lWiv&<|O@bt}|=Nk#W z-n3XAJID~7vYeeE?!%rt03BhUR6gGkSjMTxC4a-}IMrHYXn1OVw zC-e8fp9U;8Ai+wnM%ysZJ=44=A<)v?p-)qGnjDE5mdJeXLB4c5cmezspaszR zeixjlnX3L>uCt=NdA2he=;E!^hm5W#cY6A;6ZvJ9kfmm-zR2Qi;8{|)_&j?YmM^Qx@pD7vD!p?ikZ-9UCicc#>>aOyTF-JP(j=aWx@9{^qlwC2E{1r{LcaBSO#7PoCjz>w}SKZGuMaZ+|LGf6WhvY154T} z{bS@c_?LvC$8Qcrah=KniI(4+4B!4t%?j2}_YTAv%cMW8(9_q;FTsuTG5-X#KY8Fh z>FZ_NkH?G`yq%mY9BO1&upNvxvQ0aLLpu%fxx=9>wuPGOlSNrQN!bE~Dsxz>Y_}CF zq(33(>2|vr{C7YTp#53DN&0hPp{&2Xm$}yC$~Co>JQnTW^_1W>kdVn1Q_EYBlg|=x`A=fW zW+F>WV42BmsA-u6xElGGWiZ;ym&hJ5Sic0zmr4^on8+ntJp!IIHkoA^UN+Iw!aTh^ zr=kmuV>eP3@Uo=wERgK6@^h}k+kRH!wY12xvZ-Yx^zwWAQ-AVcPo8BaSoiQN1Mm5k zHw$xIuXl|2=@mcute4mFLCWq*U^h|L#MmR0!Q>&zo~P_~!+U`GLaBZdK3A4=3(7Gl zYL<}C!2buZ3+!@E1?TD0pJaVc`_5VK%hs=4SyeZr@H9RpmQAr)HpL9y6u)8D8RQOH z#2#Xp=VtJW)}yF-)VP;Vn|KPWlYUe{NB7$cz^?%s0A1g|2Ir~wS3m1V$7B*6;}~!5 z>Czj-C-u^wHt6a8kZ>V<1Ns2kpCRDF9~GbL_)lIhjw+Wa=Zmt*YNTiGptO;e?La|% z!(O6f7iPAzSTdc%OXfF}p_+wJ{0Oa=er$w}_TvWdoxtw_?Z<22Jh_h(NBJ>-eT}Rm z<2t(4pbf?jQ@r%vimvw!`_e+?6tNy`G0UKHd<6(v`m+T zwhLX@m>2Ll;cHCM5J_9%j(Ecs~=c$Jt_f>qy%dMvByfQ4K;PD%1N?Bog zH@$?0Y41z8ckfVgHG1SYTvAi;+QZwMm(>`ymKDM;KdCrh>hFYo9XIa*e-?Ni(E9%Z z=cz$m=d~ZQ-a?@vg)8f-crj&_Jx=G+vb?!m{aZ@zVEtGQ8;)6GF)lwDlm|iNDQXs~ zach&*4_<7y;}PH`!0`Z2JZ|p1j%4eewt7W}G%33q9d@q+-v(@t z$!=L))pD%J)$$<5w*4S%i*$kXyTxJu5V&;-)`tL|y7qepB7I?c3c~OLAWyv(;k7?t zAu~5K@-Uz0`c2c%dRcx}m}q9Frr{O5R|=3}39aCT(w`8tOT;IHTnfGgxDL?ucq=$h zA+;WO^!$O>qaKqoDpq5f_zn9dC9knU{OiYS>@@Q@QE^R5uNC%m-105>j{pnXdP(3s zC8>53MXzJ*$tYVo*9X;2ag zOkUq!r1o`gMu_*8l_>nI2)%*v6~J%UBMd)E&`C~YSDy&z?T9m0IgRK&eQSlNxiU&1GwG-JHL(epLB=F@0XNpGln6f6OcoM zd_23u*feBz2p^gn!%{Z_yShES2>u%I7NB+C2j{6-tp_;sIlZo~woVmuBbHlvKA)y! zCuFY``CM);QrRS-OQl}%Wp=q94?Y7p3DA0Hg7dWIdzsH;>s40kw@U9@O)?#GXT zKLtDsX#IbH^AwEMo~3*nZJ~!nMIWK0!7O2WL`7e0)~SkaxKiq6UtyQ?ap1+k7(nYy z2j?kzIZMH#O8O2nYDtGSOWg+8)$RFC@CSiM0ImBBI8SfCE8EvzM?YFsRj+sAvzqA^ zwx7~wI&D9C>^JOl4AjVO8LRS)GNw?*vs-0OV85nxFz2nml={9a?RiNicrTz2z!Se- zG`h@->T7FHuB=-nCLxf@BY(x5IY;~nHXfwiYS_^E+5mnvuockx`aL*LyIj`oLX~yv zs%qA+n`^L2+}|9{ya~AYB>Q}rNAsbvm9jf9 zXdCEItsFv)y8m7`lP$rJu#WwEdh4ehRPv(0;B4 z=Sjzt$6ilSf>W^i3P0u2>i{gheuKe}?80J?5AjzYBZ(!LjAeQmzu3$$NAr49`c1H( zEfffO2K+_fpMchX2b`zq^D*cbZ*5m{A6GrpmleH^VE5t&2BGXvpQBkF$*r|li<%RF$@0CLk>VcvA?&U(bwA} zf%P4g)Hi`m&tqdfEOQ)72hXtjGk51R4Wrdv#hb+)C71P9AXt_4^3iy zJtrnuo;=F<|K{TN$DtILnm>xTJaVII|L`{`JjUGTD&!651L*wB1LtY4p3fh(-@xZ# z$j=NFg=dA%!FIz=hW&&s65YPp_43vdj#h-!u};RG*oc zWZ+W+4K4#7)|pR;QAs)#-X{HQgdh5P_c-{o!1I9i^DsD1kG?MZgKK-^`{Zk?Hu7#7 zroUsn;HQgnztJFjJ^eh1EEDC|lg&cZKMM;yscA`ALWi$C8Ou#)z2IFXyPPq{K6CIE z>0jy9b~!EruLM>C+P~Ytd7AcC7yfn3F0(>wQIPv&LB4K~R$h=fUKG;_SxGqwEI*g^ zg(Btn9;61Lv*bZnvH-Pi> z$}i+RblM8}dQ|)65ieh%?H@63q)(YNVnz({a*g*XtlfXZu1O+Sdq=XAQttAC6Zq0` z7G^f-zHC0bNn!f;=9hWNM-7WG4ut!XCanbWP&32faM>}8CF zsb5&rtm(+xozz^$-leR}IF0S3X1#T~Z;(y(<7$U4q66HpihgIS@8&e;RaY%@h0OJak4S=eOA^ChvNxhy!$pJZAS zP`j)b^YgWyGIkrqMgSdZ?xS=d8%M9Ad>p(>=4%i94hqi+c?tYKz{h~jSJrhZUx~6F z_xd~6C$<2VSC>^{BZ}v%jb6nLQ(VJdk}v%Ziwno?7P;5gj}`fLP+U9w221MW?`>w8 z{5q143=apg&HUjOt|d9VpA2WmW5zy?jx*0Rc2Q3VD_NpWO7D?=hv1hUzpny60K5)p zzl*Pzejh(b`n&L)&VE-{)~r}lC6CDR#+cV?Ogm`MR^urqUV4h3UpU|7iI1){9RI)D z`TtW7qGZ2eHzt!0eB;n!GdOSu3((~h*(%FvO^Pg^EsHvrlL)FN*RA6Hwbgo#9kghx z)kww5Tk_>DpLq9V5AibVASNXU=?9Q~2_q3|jxy7;`C2Gn$HdE(cu8bE?&A3#WYl89 zFgnpXYnVB-(p$Zqu41o~~jq8f>(&j@@IJe`CfIJ=DZ3yjRvku)&Ty#)6*>)B?I5GH#Uh zu(3>*f8_73^>AwCn)Q5|*uOFD8MY&hHm1ENU&6`a-Cmz~`LBF;yI;J!4lle$et!b_ z!avfyma1YM&1RZ6@M29xD@*sMAdC41egs4YvFLJoFY95n&5}o$)jNf)>|+J-vmZXQ z9%6|D{j6q?m5-l8@QL?IY-?Rhhg-$`WrX~l%*SamI(7#3v*w^XOl1qRZ$a&6oxnb& zJ*V?QQrOhp45A4)L2*7C8CdiX#ZtJiS#Te$`hOjuu{8N>X2yjErpmb2Qb$r&*G5arptg(Z6yvYRRMK<1{yzZqdFL6#8c0POWTLFs!Omy9DAq17r`YYA2+U?v>3CootE49Y7t$e~XDEVzdhY}i z0j^lK5FBetMr08yTOObOr{K*PBXnG-znm4?=EIGu#Q!G z#Od!!KU?94jw`v+ZXpI8V{zHN=&&Ofh_Al&+t| z*a>2*uk<~sTMoNgw+4JYunExRvjx0s-L66=^5E6Lw8}FIJCwNs0doP%#nchq{A7zF2=HSPF%=)&M9p4F+31QX7#zLn zGw=~+C+1FyQCs|PHs9YgdwIM)(tSNJgj$}_aQi|t$CJ#m4fZ{?E@L@ZsOW`jbU>-4 z;8HoC<@U4sVqj#wyjFsh_IuiEcmk$*d>=D2#Y%+LJal9uA=gS6j^2)s^Dr&45T?UM5A~vM}O%d*Z7I4etb;dnxkfdPe{_^?;Uioxv_) zhZ*~fqBoB9UYX2(Md=-W-yFUoK^nf6?Q0L}FR1GL1@KpaHv!$gz6Iwgpw7!(*gs1B z@)=}={ROi}-mpJ0$V+KO*doJxcahoGGn^$R2T@Wv)N6<{dmm8~6QMFXfDc+o;culs zGq>CRECF8ytO2w?mxJ@PuT72vJKH;t2dce^WkZYyk6|R>9=*xPr)dLO1Hazqm_@j( zGJiHp<|EU~6o+(vt6loh3>`i0e++&E_zBQ{WdBO~@#05Pzv-xRTI+Fw1jP=VzDG>`YndNI*WOEnLJ5N#4Y-G5Ggw% z{i=p;nJ57SsNh!sR{`3uo4|R>|DW{hkXmQt@#lhd%PVWdenb;%VY?Y^V#&KPdbhK! z26-QG5&MGD9)!%p#gyG3E+?e*d#T$ByQRW1A)kPM4IBZquKzYw9_rk~wT^x88C;jQ zk5(2o4x)Xuvj+?ulAFQDVC23K`}@do9nbJ3tfvTc8vZAB%VAgNcLjJ2uny3=mxJ^4 zcCl=i$LNauwz1oc!$SC3Y`8NajEiQ6@S`2V6+fx^hh1I&t>7O5p8{I(+JDdPb-Q=iS>eDI|v=xR76Drm#}}!c&{lE4|&mUM~bc8>j`e-c8^oSK0z_yEcY(A(U&ostfqx3LDWCXyw);9EF9*GEI}?R46MIo97*A8pOl}kj zXTXI0(mU+y+yd~`Kn#slS$fxnK8r{@1QwSIJcfbz;p8{I# zaqbwZ1Ae!QL4lUAb-MtuC;DP|teD^C%nS9+(dcN%yluoBREHQ?g+ z)xKxjQRgu`^z0SD2D+JU6~pX(=y^szb|KH+Xmd8hfkEtxTQZ+}V7F9QCggeWSAjPH zt=k69)7xs_;^_01Tz6sZIaOjyF7zBfEZ#@-_A41_GsdU;Q~Rf=e?2i>{k6|+A(j#u^&mWP*SrIX)iU*D&IpAMV_Xq`>qJnd5B+?u2AFVHP{ zNFitH;80$hvC}wg&^F_JDqaR2Hh3F<8wV@QDVQntWWU9lvxuwzOi>ou<{*AXXRBd8 zOz90`m`HB17Gi|%f$_LE=9|kfSOrYJ*qLNzf?+8ak#Rbk zhmOnqmtb0nNOzP6|CNwT@w+~pltX}x31J#eA`L<=@1o{dx{H~^jK`??s)eN+e2Dp9 zK(&A5NB8qrzz+iN13JH7fb*pHV~)P=*!ewbl*tM$Lr)kidcrPB-nWKesyrE9rt@>p zbL`Uq7;n;~AEm#s`{8`>M#L`2m0akH02o`Ar-r7w4tsv8C*L0~7F$^LN1>(!W;d>vquw zZrqJ?RDkxcKR8c1o<92A6dxz_xv7fDxOrnBa1oHOR7}5cW%BgHV&?$F|F}5gUYLAw zj4FY*)6cM?qGrjsF7=fDgt)#?B;-o)UjcUl+Mj*kJn3^>NAKrwe-@mxI;6X8R>f#I zb3MPUqy(^pS9de=ckG)m^dK*MI-ZF&2u$J;rJw^&eO@R_c3ul>-G3r_DjB9eJZx9+flFNM-MhgSO809 zUYwpBme|`D#5rQDiuM$Ht+QAorurS_R*@zB*$KU%P$c9J;C};N1hhYIgY%^K>+&7f zwbeB%sy6C5Mg%jArznlkx%|LOJG+aK2fV}4IsG`nI^Lhj%j6IO3*|vWw$#u6t=*0$ zfS&>^0JQ$O;5=>rP>wIhUT>Dy)~s8uUx*oDkSdf4V_%euYs$`7GHlhk>U@hnY|79_Z7J^zs2|2 z@x>JI1wc8V_09q3=}finbY_zCI>Ys9&r!z|@*3G6=nj6I{5!nxw)mDoZo~%61^ilP zoZ$a0mP`0f*!Mint-?xEAF%`=?3eaY^$)#{>j3zVfU(o|XEHcX`Z{pzc*27`bsz!f zqMoEX_*vd8@$*ypW{P+NU-|!>zC(1I$30}H?>N4^!RGt&dU(_L4m^;Q#G0um&B7T9 z>gj0)Q+p<1@mhUg`jQfo5-dv`*DGQ#7;H90&@v8H8V<_*G{9dyUf&J=2(Smx<$DO6 zCp}&tn;*mzQ!3Yqe%65OY^Ah;u9Y*&=Nb75_p6k`(Vi?ZC7Hjbu}r@=A=w1SJBwi_ z8LwCj!hKczlDpPCz$5DBeyaZOx5vd9;0uA%0qx&faGrX*p5Ns4&&#`G;S+8Cw_@&h zj%f4`Gjdx3F1ktM%sI&^Y=qBii5v0C5%~j3S~HQ+pLQRlXf9fw3aM8)A;@5BxT>X-*i&#&`xX%j}E0 z-SSz`Ov)I}Jz0e9mvQVYF*G#~lK!+nFDMkT?g7qzhrMq=`!fxkr($*PG--6_e#-s9 zffYEC*KDlbZ_s9AyGOiyLH9!z!(;;aB4GkbsT7m*G`1egW@&6w`h13S<>_p=nJkKK zxrrO|5^$Rn8;V`jS<)wAjG(fjT#8&W(*W)NdEh(^Q*qCyN8R_z`#m1c#Sh_#9Eg4U2KGl& z+}^Ymnc(f|D~s$&oQ|=6DB5<3Zx&ulJSTe2H41UNOkrXnzZR^-TzCyeFl>A+VWSM3 z(wDxrj*)&g!w)@v9s>UfFdwx2oCMC3?|nH>SyR%v-D94zp{lOqY!mL!ea zmjJ&_x1HVMC+{atWaB+pgG)D8vGL|`6Weo~js=~BZJ9)D%KB-FVfDv)VJbRAo`qGy zR53?i%AWD?LdQX4d5`e~>3;+K)BfKF{s&+$pv(DXaGr*#c~<#R=Mwe!Y9DyQEsd9& z;$Fsq`^7c3*(CQSO=IQQNlHW0VRP|sbn+lxidfj*!tnNNj3i|zNPmL6?f&-*@Y%pz zK>M>EoF_f+Ja&Gg%F|xqh|p)`473?9{IdVJL7q+;!sd$`D}6XAHpt5Y{$#uwI5&p9 zh)WVJZ#wsI1-$!CEbs;mf{*1LCpAnV;;e>-=5ZGF{> z4)-uCx!Dx6l3V5ECu&A$uJs7knIWJfO>QF*r}r*9+l=eMi)IF<06xr%c1d8%(KqW&e|rmgJ#g zqVG2gS&DBO%5ac{xGWL#T)wR_8mA1HIFt;%hH28jozU0i@+a_r00#i=-{;^wMIS%m zUq>b5K_UC)%;=P@!m9`)KPL0T**MjL)#N-cGZ{|q;wE}?E(+T8I(5=E30DmFv*pPfc8mGMtoZElaLk zfg?GS@|K*+*rL;X<=)d4;b70i3=6+`9bL>k_tB-k3hz>WuxDbfwJf!A1qy$Ju>>c9 z&hql#T8Dl!Y20F*51Kew*vrKGtcuxM_TqVG7T}Yi{C5X!quz)3!~xro2piVm*4RUo zJwVy%-a7x(gnOuYf)6J#*a?YKQ_iH*6DNzGqYeDW$dpyA%9x6ePNl07r}>BYR-?cd;vm%}MqiZos5C5X1irzxf-=7EaI$ zF~!Sdd#QfZjuSV5UjsA%y1m>F&Qr@_IX+!G)NU_gMS7+<_Qn^cF+w3Q;c?UNa5pY* zAb&B*Wq~4m*~MCMFbAhjQVl$8ASs7mF(wq&;qZw}jVq;}jqoF=K6?awKky2m z{apOG^i#*T&V57aXXT0wl{I3u87Bp|`o$T*8u7D4p9kb+_)Q{d2~5Cp>qUXSVyxtM z9ra{hUyxmb^%?BA^vJ{5Ka}NShd-0$C-(N^nJ*amd$CkcZ(O?aJq6tT}pI8}!C= zFan^X|qWU@I57sh^BI2(|dHN>(q7m7QY`(dA-*Y0ZbuMGQ`)y5x945@UL`3t$O z8?KZ2Y(PHrzSUjeJAqw*&Sw)iPkKH7QOA7{tJc&mD=fr!#4I0yTxOKcz>@wqtdd*? zkYb#m!k@M&op#vKIthEgfgXU?$p-&4oz_ozZ zxf7fxy*_ko`xO)Bj$C1j^Z-`yaG%Mr-6B+NWaJB@AC4}qV$=B9HeU`e<^uK~Y{H`n zh3lmshm;Q2`U0Fi;U(#S_G1vZNa~!wbAF*7$dpwU#5(5R^xd)5RdFp%}cRZJk zPu&0%eHY*NQ?^0swZfj(`vROji8vV0dWqmX>F1E?`K#2!_x(838t7l-qyd*%x7 z?C0(UHcH)Q*wwlpf`1GA0BBwE$D{Lmhq~|esQfxro9J$N_#=_Gw?_Ilo+RoruwE^kc{dZk?Q%I8a7N7#NwE~5o(Hv6ZDujb** z$6m}Hb%YYRQ0f=|$sRXnf|mnJ0Ih#6I8QoG(B*CG=NHUJ_OXvsRVANSb_3sj<~soi zSbRUizQ&E2*p4|Bvsk}pATE|EcyJO5<2GuJph3=fid>}XA9{Kme*?S~cpuRI90KP_ z`=i%OkM##@U1LX~WHL&p@DVNQ{ee_4z z3bKzLhnqHYcp(?zsSDB!i74Gh*wyX*N$|e|`vI-{2{=!k$I&SDD-JwVRHM9i@=e2G z*f2c84&u2wDD(ghZjLmI(fKlP-j8{Hfd{0CZ;w08T!x*YVWJ}jFO}s{60!Z7555do z1!%u62anmWQ6q$3WoO{}dM&@c4x7vUdYqAVil7ve%V9W`fX#A#X5KSW`&DM1LYFDO zDlU_LHA7dI*CFt4fgb?vSJGeN@Jp7~StzJtpsy&b{gnJ259&zrq_Pp_2wgxmYIr2Y zmrFm&p`+X9I`B=vC4ly0D>zU3epWr-IJVxzO@^YQWRz_XqvSS9TG?@kcSoYGuo^QI z9c2VNT?`G)O1}m6ON0XY47m4coQVLmes6G|^nKKC_m=bKWA*uo2sBs(50}duh~AR7 z4rTD0hK{g1Jmd;<25vvQl$jqhOAJ*vF33z0cq~z=3o?`;!UIlb&B6TR#{##AvBUjW!db#t7UrEB-L7 zbShv+w}TM)dB6pL*0}_nCq18c)#2?hqinhuFe>m+xC$QCN}*Pzvk!K3e%=Cq7x)0s zIv<1c6g@wVc2+u3jD)A-P|N8&PyJ+`_}`aaCCjhmSvy~+gI5460IgRC&Qn*{9sZva@>rZiI5g!>ZBwtv^q00{f{9afaft8((C$dG99}(#2@_iTlBj7VY`|&+^ ze13FXmohpW345YCQhK#4kD1TeepG|k0_yo89#tK~Zu8O6(lD;JSFlq-H- zHwmzqkE3#;Zc49_gY(o?KdGx( zr8|k9G&a$FhKPc*c~tTPyUfH1-F|!^#KUC$Sd+l|5;hY0;6NJRmQTTJF2HX_9*}{J z(`2m448%z@e(87}t9H0`Mqa@hw@SaW_t}1r1wR3p3~0Y+fyd!@N9Qh`grVgJwwSzR z9LI+9ais{4FUL!R)NO!WU0%Dvp8)<0Xx)E<$D!NNnazql4A=19(0&6e@J1Gn>Gfd! zJbkgoHNZ0)M_V!sJgzvw>VZSTc9)2{^C2!Kp*&8(NO*-%md|)owV_wewV5aRc2mS&3ZCFXT zg0hXc)eT&vo1|Y6=<0F*ZSePi4*~7hC*VBkabLgMe(88bRMGI2{3#Y@fa6-u|{@3!t~;Aa8L0Ij9M2L(66K`W-XQT;wBHe+7v7) z3Pa6Gw+VLj`1S($%RmdDb>9Z(sq=i;v3_E^zymR4H>+&BTv>P$0WW}+g++R0p<$b< z{}*iC$>8&VQvt2J7@Q~le0%+Tl8!k0Sk-2%EbQlxs7c;0n!vxYvH*}v*sE&M2=>}; zmijwkza!t^2Y}ZBt^XD{Pch}&IlznRt`iF@4ah!#Lbt!rAbg9;|BJT%Eb!BTvjDBX z44fyu&Y+(&<&ytS>e!2VTrMlAFE(g}8vp`9#}^w^+$#NOf=-E0!u>zs9|4~O+7Ig= z(vP+`W&E%E((!;UsF|xFQ`~oUs+SXaP`_M`6Uu!v89ooB)01K!=Z50 z$-4vf@*}&Sk(}Y!eagfWJ^JB*Ko4em3N10O{Fa*ea@=g#F8!Mc{h;#iZ1AhvU$W0TjRl_poCN6dJ_DSm3;!$2yZuY~s`9mbb*Q?kj-T|MI%O&} zaAVhV@{DipPbl25aivLy6=Qlei`~b(Ilf%Jcsm<`%?a#uJStwUjSGR>RsBOx*Z+R- z{{SBY+Mn;hdCFJkuOez3KH49wJ;9&pHR4lwt863t2X>R>vt9ACFW*@T8x1BY$KA`G zOW3*Q1v1#HWUukvFct6xel7hf-EY^&YVb8c2;hm=d*?XsXn*nxmM>f0;m(l4DZGy? z(BIk@Hgd=s^*pI!rMCyRbve8T{w2^3=yE7*mfA$EZzlDU^Q^9Qr}ADR#QA)$f3ww+ zu-~H1R`q^_PGRFSKM9RwQ#`|b#bz(_YKEOPTso`S**Kz#hYIw-zF+`h7OtS!Y6X(} zdhy(GUQ(YMtleT4sX{|}H2y}GTNr)@@t&vOf1BS-nEbWlE~fCuk3%? z!%5)FfoedP!{gvQZTVLA`)gN4ZD$VMPVFq>y_Y`ar4jG1Q^m`6yyNZds&w)$9m%G9 zhGEAs;7`RAJJWMNzw`TUJfzjYBRBnQP@-k#()4tEvYUDE?12DHvyy01uY}%cfvJGk z+pD7;?ljo}A8zPpUt-r)j4r!nx%ytV+u?BV6M!jz&gTMfo?>W+j(m324j)9&5WO7+ zo1|Zj&@C3qgggTN46qN-e!ULPlYZ`B57+T`#rhC>145^LGIYXEKe^2Kijgbm44f&# zF}ZQ_hPpcTBz2yDYkWxhk^hR_4km&x0u}?>j|;$g`XNEqf5{}bcEHEoh4Z;9jm9>% z!=R1E3#NFPyaQvy6$WN8)5h}$1l5~U@mMMx<-qeUX0v}&ZtlZ~rOcH~w5c;tMAzz=uZeaoAw@SZaf#`3dQF1N_qC`Xk`a0Q&&#_lMvjsc~KJuN*TTa=**x z&c|2O;nYu6C7;&gKJQP=rx=Z}p8VktR~Qdi_-3FY?BL_k$mR!l#y(rfh9+CSo+dnm zr|@wDPJ^+YcKL?)NN88oF{z_I_h=!#Hn-O8s-Hb(w}e?X|r)H zBlln^#6zDTzs9^pUTGWtBz2o$SC`Mr;Qs}_0km%6>r!`@I)^zr6r~+P_q5gZ)u+_r zY=pYf_HXn2!8q)pZJs-+c)2M-y!_%Yo}#|lXimX*ZO!Co1}|rx5v&GBk)NjKLo{$I zTV&+>X5--jI3d$Sjcn7TrfO4$pou>UEGMywN`!n|a&@s*$4f*Irx&s^U<42#jzu|Lex@G#6rm|1Eh zX7#nibsklKW3%X?15o-AJVBn}kEZe?cgXMGWw`|2fPef0q@mztz#>5VdjmL64V$E& z+qZP#@7$2M!?b_c`vm>TL&M%X4~hD$M5B(!ux|Pzv8#- z@|z957+4DE_OTV5C;k0i`hLQr^;LUbyPh{^oF9AD5a-9d{2cgZW3!3*auM@kK*4nb z4;8^PP_VR_3ykvzaong6%gD`6?PXfUxh#if)#b)Cn19vOq5h~cU#`(i+ zw#b|6!>z37o1}t0(XqD3^+K;p|29Hj`*$<=Z-EB@?cdYjJndA^pVjBoUCUAW$BVMf z_!4Kka7%H|!zhi-#={obhXeI^;46yFho^Ys(KIy0D~jrA%3frwh7IF>7QZR|3jE8S zH{^ql1jYf{uQ}j6>3Kt^^#!~A&Z=2HiXV?MOT)Z*4d>2K@-7aH;So5vuO`XDL2AnQ zl@{L?L)CI4X;Xe|hfbMLBII%KzX2}-+K>0Zc{)B@jz9YQrj9Nj@g1WxYU?J4FcR_p zgehR7oC1D^)hAv;e=x}p<`SG>o8VuHyWLO1gFQ^lQFvQA$QTayCyA#j75_`M|9{)} z`z`=q4pal$uj|2i8fHkp^2@szAD7pz=iiDjl}DZ2xv=@2_a}pf&A?Bh_8#$(ZB`M^ z`sOg)nv{mcDYUTiL@PZ@yvLE#L=+z%z{m5)<^0Y>Klu&L>|){)dPn-(3V(DvGY@)6 zPap@-{*D3X=_~bIir(tJjibv^^;bLLW{ zvM>xNtmeikCco{n%ps(nAJLz&)hB zu^W_xJ05ayA@Sp(Y5ZR%k8wpe&IcMTm%sijn}qpezxBf^~^IZV(j}SE6;HmTGFPMMX`mwbWXS zOIxb8L~SkAel@L2asR*1%$+<>9umaw|NsBJe)I6T_vA^KbLQNcxo2k1oKbpOh=oay zU7;J?ECy_%pKgJMiX7)TynmgF4~-n9?omlv3wP`8h)>H%Sj48UCAt{DsFh=-+`if#v_c{e6o6YRCFx*Pyf~YaNa@ zSvcCT`1GDT?(c5ydv4a>dHDY6&!}-vtK4T)*3;A{mY&YlRYF)hErC2E|CX@7PJ%ui z%m-GUMbMJ=u^!P;Gz<-%OzOG1qi_b))@@~*(L)pYTD$Kh=(oVz!1Db&v?RL@Vf~5Q z*C9INic|4!<5V0rPM!@c#Q>Z<&k8&rYyWNdm;F6qAIyQC2NnR!|14-pcAYK7zFjQu zyJb~Nh8aVl=DeXtPdb62=n1Q8YnQLk4khefigMP-M5lK@v-lO%0PoV0e;z{n7td{(o!0uk^jdc>h@F z(?BJ#qk|Wi@-T_kiMk_{i)7#&gJl~Ja^VkYsJD%AI{U+EI$Rd_|7xV5$9vNn=Oc^it zf`2bM1ok^fc`5@w@qZ-vjDsEzCId^jDF^BBCO;(@98Y(1$UYn5*`>W#yEKkJ1J{C@l}rXvD|wo zBH^5^c3@I-5?!coD0-}#+aq#FFuH%h^BMDgsn`UxL#bQcw3AgVHbHg(>GZWJM;mfB z1Yf29lk@Gt2w=-`5wxTcbw>Urm+qq+c6{F$-9`Z@$C>*2e!9L**Vn%VMf;x|j1!f7g9(zD%e8aXA9{w18Rr)$K?h^jYp2awlIVJ`mnz-DC{!zwo)gj#WD^R zL%24SEk$v5QV#px{21DQKjNeTTh1GxC3W$>l6q8amdEt4Z_0A2Ip)UYh1$^gO7B>1 z@E$65W({NeJEK0P#q>XR0S%E4_ZYUx`bo-05G1us!m2z4=d1Ld^+%3}Zvl=A$ru69m&Z^N(RUkQFy&r=gk>ML5r%)CmQnKybra-Fh4#+DndmIfwW;{k?$^uxrwdT;2V;80-s zPlJ|}6U6V>61?Y=_{-vse!Ih#d4_w;JVV_h?1{Y5YxbOSf>siKHxnD@FKACya_Goz9631OULfjPcO6bOsQVRz+Io< z+Ty+A>lhvbC4|R~-p@kLsgqb%d_~D=6QjL>(t#{u@5iy~9roec=n9S#A7tbz{U}kd zkA>4oyvFrYkEt@C7EXp0+~9BpwWyqKigGEtiBF|)+wk@ zcHdG``%bFAnqN|tYQl?6yQ5B%@zVzHDdo(UCs-Wj(1w_s=>@gw&#phmyrNqUG3Bp^ zua)aQ=*Pelz{>S|=Q9oc*zz`=Og9=O*~4&l)!JsI(NeCrE3 zqwMce?riOr?cL-fQn2nY!sxC16Ro#;`ED+BC8##vY29t!Ti#^*s-wK;{{JU$?O{gV zwj_DeK8-k;AP-2Al5O8x-gf)J2>W{v<#Kt02;hNs(W4BbiQb~ZoPs1jh56n0Maci| z|AQ~${^cANIrt!tJZ&SN8SYCt%a1Vn*kj6G&sR>`XV}Xi2iP>vlz!gX)obP*GMtvH z`cnM9L}<3TnwP!2tQ#2G!Y}^XM6h2z>f5OSe!PNo}QS%aV-ilAH`NQlKF;OKe|Ym`Sof5@?)5A!yl=M$Y=r6Z*Ur`VP=&zSH{Lxp#kLL*N)E`0=r%STFXOKtwXy|ntb z`v127Pu(-hV{*zy2j%}Fsr=A)fJXD3>5sd5P7|x@s(4Djj8c9sTZm1kKj>PX5PdOn zGNVr!uH-Y>d^$dDcH0z5PQooJ`u9nc z-~5%gDhs8|-7nMX6IFEqB-M)S>h~y6{%_JpnrqZl zfp+PPlsqKz(tmFnb;Os$Y%MNx`Jv;*M{+Hp;USN&NR0y0HHc*YM@mD5N!E_3W>Yvi zeF{hN=+9mjiwqK~E&21E zoa7nFJ5ZjaG#B(7G?MQl0SzkW<6z4{^K8?ua=uNps{znu;4om@)!MGw6{8T^6;q~f z7fDp8jo!7z&O6z|MkKWTPO`mY+4WE^OVsRN|5*F3im4 z$@FZ}h3cEPSJn7`SACNoq!xtA>331dqz5()j$T_HrY?qkpV%JKRF@EPcgUM2Yu{X5 zy~U(D>S{)R8rDXWt}s%4G+$}{UBA8m*L-;g$m5VMR8jJrAGc5cIW3jJd(Vxw&jUOF z{Uh)bAW7x{_PLIQMU}L!mOKy8gVo(04u_Gq1$=gsryXx+sHnry15Q4$e4?HE<;l1* zY5cF(?-JwxT)5;qzBriXRGIQrkf-HS2Ynv+!T*j=VmzP3r!3&pOrFJBddGPO`XlfO zkawQwZ4b00yAIvyyhifODN|+k0F=rqc8o^m#VWHY-_7hw1I|>ASYU-FXVW)Ve=O+t6H&U=#s^CY)qT9Y~kXnWkbbB=8(fF zfS)r5*ONTwc5gZJgG@V3b?JJla26|{Z}i+u{&CF#n;!b#;8S4vhyDKr{|e*&5{PgD zB6LH9rOt{BL@37RCGdFR_!_^PVcrzTQvp9K&noDP!R5fpvkqF)_tuATrpvj(MVdmS z;e3jV3h<7+#1)lrE^@G6cY)E%PWV_koKVz>fox#q7zF*j{R5&B;6Ah2@10{y?0O9u(@b8ZoLrE$o`(P{T- zxrj%nKgMCH{qdQ#Gjr9xY2(%YPz>#Xu&x79r%l~!g@6W%JO7vIUq4ugptYa@SdWc67a!i7r31$N;$1>>e zCr8(nXt#b?J#-c7-dQDrQRSINuC4HmYt9bmZ$~+=A?o}SSh>9D_mwN*n3r>#)Sv^Y zK{&kaaaro)cnsX|)QODIbKR)YYp#y-u(GY6`M(+?R|R~nT&tij2A2aX*Tc|~zN`Hw z>P?`pPAd21_@>G!tjU$T6K_1}A8@>+a+7k-GIH)gj#B-N;}oPto!+27uyP&=Eh+V! zfz*Cmq&v521s%3@*X8$%uWuGU@x)D=U4(&`%f{h+MNo)XFHTuuLC|s7x0L0y1ai~| ze1z96(D#F%11rb#_V+3C%&Bs8m~39tKG!_|D|g(NZthoZ)|WEVJpUzk-0$4nm)xx1 z@uM?I{XlM#8qYR*$%#eV{Z9r$j|5|Ym8TY3(gg>b^^`ds*H;%}C+H;uJH11&)=egy z^loCd#+}A}WjI zBjkzxEgnHeHoM*wKPxcOk)w5)k$XFGP1TY)&fCx*fHq*|{v29T7yb?+H!5x4{>sC| zDeMXs4_F8G9(0{!`l=P2zK0;|TtC~aVMu-r%MJgj=?VT-&}V~MVEM0smb4H4$@AcQ z@t@rV|MFVHznT2wnuFuK4*eE*JK!mHP#62orQD0E7q6_VmYoQG`K|sqmjd7EJ7@G} za3ayZ3*^Ij9waZ!R)o}V_UCVUIF&1moHZGVc6SN%wV(k=5;?a8_NQIv4%VMU&f4k~ zOIHQk5JcD}_e)vaLEL(I(e)teaSt`o%fpk1esZPZ*Baz4`F{-UWk#JSu+OCoTBo2M zcfwbi*3dFIQkQQtbvesa?nOQPqOjN9We-@9 zj)lw$^Jj^$4o>qbBj0NH+x5SV(D#4`0+~b~cAY=Pk1$CeGV!;#YKd)de!cs&cd=;Y zIXN7(hz$psYB-_Yvee-{wGj4h`<@SL89WX-B)tHAapGc*ZqX_Jc$J96Sl^^LhhX(mv|**(+x)4~`V04gc0e z?<|pp$-BL)Jg3ncuFC0|dlEQor0Pe|WxP48gOO}`oT(mGwp(=C&Np(EW+&u29=ZxF z0#>fepe4POY5K*9<2$T3%kwH7%+;>PpD8{GY^ph7)qIvx#3{K?gSX9J@3{?L)_VGv zyS-0*7C(mJp?_BRFrHvfe+mb!MvD9bcKSr*+>H}`PHAs-@lnkZxpk_&(8$|@JhooF z3;h9T3uOF`=ecSbrxVJNP=5SLw~y4MXItpWd5^0)f% za-&Wd#DJvl&_{>omOQx5r!M6?Gqm4^bFnFB1$o+W?>W#v0QJC@^KxjNI^Vy$S3Q|z zUP=hbuB$uTmw6vGdQZE~EFjy4?5n6b;NL?2mjAz@zZ8CX3I0Cx_u-!ye0Su3QVRe2 z`k?&eZ}~5Wz7kvuZ29kpmUKaIE>`W>z1j(WM6*{c=B$*7lTJu>D7u3kOB{Xtl&5dq zWcyO1cT31wG>KW*s&EPIV2uRk9&JW6;%RZ6>yLKp{4eCB=5D%;#4j^)wjqbD58d;l zP6>zuN#9u?I3+q+yi{)SaCjCU76Hdf5dnX+sc4p%c5Rbnsq$ z6SafAKEGy{4|{#O$zGpE@A4?|Y?JM*o&@O^D~rt_*j9$PQxj}=%=dFRR3RrDZ?%x# z2y&wTcvwwRgRP}iah1_qSwW&4CqthJmH=Ch2cf@zITE#ua{Q)4Ij-bvqLgyn-%)%D zbn8CKv9&`vDz7!=*b~SpvZi&5It8E@*mCrQ)+xpAPU?>WlRG~L7t5Tn^sSBVd5(|k z;#f6Y#vD4e2K;Iy|KPi8pl=0t0?V%vT2dGDRHk1@?g966o~r&jQ{LS{{=(y9=x=~3 zOz;mu>y%Pn7KLl9CyOcRFkR9b$FGr+_76(h7VxPcA6w5CL$3iB0b9-+p(Xw6uV(-6 z+`b*!f6daW1-vNbMug;5I%+|qx+lr%y4U-&@0>arqh<*cQ4?@5eux<$Y1_BB{v?+z z(kIF6YQ=g}?pF9&dA@`W718elD^DJ@q@6*3Y~xl1&$)v1Vo_*X_VJ@agIfzwS;QlaHj@ zApfmN`Tq&}4e;0RnSb&-tp`kcIIDwbLyT_%KBdLj&6>00On^QXQ~;~T)1W1Fu`jkm zd1h6wtkzpy>fN(17A;=wIv4c9gdSrycpMI4PXLYIVDz||{L2FVPeA_`>;RU3L3hJ{ zTX0@S?U{SmD_$&g?)_TBzs}qhc3Z(jaG}?Jbjj`xld3>WQW|$^h`Gv0{!STWqapToyqTfb+2;yUmWq!ZkSbWH07ub zIiX`{h^4d{6`dZ*-l? zEc}Xl5W1m+YR>!NS~glcjRF6)5{e9>4 zR^;2CYU@wi7f%RTzy!iUGG{eg zGA93haFMwcffUPWy~mV)W3NQJeH{8}@JnFz{XDcJYcE*;@1!`FL6;$_X*Z+uE2hsB zL*-1zKa)U@es3=@R4VQ@d~<>AgzoQ7C|w`dhu&hY*Qo>Br!Snc`%L+ElfTvP=g_e@>tVq1 z9{?@M#sR7Cu>aifH}6ke8t!KMm)oFzqj!Nlx`KQhb=7$@g$b)~Dl z+EssXRiAdV$Z5Xc$g>)L)-GBPy%F3AtUUKZOWKz{jy|_)@sg?_ic8K+tnf5ca=Nq4 z%~jJK=OngoJMjmC@{^zC_ce61Z`8>ImR~PuNpHPo-aocInMO2pR`r=ONxDKFHIKQd z>_i^H5c>#TWV=EplQeSJrQWSv=j#I{$*(2gUlZgnJXS$p0d5AC|9$rNo%Wx$?<}f~ z6Z?Lh%Oz{M?A)GzjhcP6%DqNqUCpS^pMSeM`!+ZCb~o!bsREN!gPn40deG>h4L(*6 zY5k&3A?OLL9DSfArN*NU^iVojG%zT+%IBA#An&+wk#bokzno=q;7mgUh2&Gd+3>9) zU(5GG=xe}wVENtzy&rt-_J)1(lzdtOzO6yN^4%xUUxIIew>2Jt15 z%V*kke#I%g8n$?K&VSqkC8`By@KCTaCT$1Xw*>2F51De79gyHV9eO4>0Z8h)zZ{lQ zPWw1vo9}$%GG|g2dYoe9h!iWhQ1S0zS@x3A?Ko^ub^_u=-mD zE$PnSJh_^V`^-|xV@HVn8bi;fZ3?-Kp%I%Hjc)N82@XTBF%B}pf8qv(9nqcXssjHM zCNB!rIqDQV1V4BE9I-$`p>82LzOa~O)(FSONuR#S^EZU?-Yc>5F}07F=g^FN)^2R18SWlh;CD0? z9o-am8^b?#H!*J8;(eAzh>mGYT@Au~Do__^P+(Bm-ZabO~_avu*ZY5(+?9ACO?onGoqV?-c2l^Kh@ zbt?RFo-p!lhJReXAZ>@<3H}1Cd?%N7)T@nqk=)J`{R?LjudE9MYY1JNwLauFgic$p ztLjbJY{Z{N^Dm;Rj&zHn;&&)6c(OWM5ianv{4=^07G}xe&c$a@Z!ct*+mU=mM2fSz zv01-A5rFeE#>LKJv;J&OsXkTBj^srdgUKhOjQz0sBXf-szDYj0k<4J3?9!0hlBP~; zHyE0lgYr|pxGufpJPZ9>umjlg?}3(N>s811x9N9kJ4E#f++?CSkDF**P8!?~2drnAxyk!@0EcyD(b>pH+(@2P5*ekM4~oPO zYp2m)&X9!u211VnV}K-4TydBBJ86!Dzw6gf_+Z-lLbsuCXW9C~7+TzNr1MzeaJGQR zN3#4 z3@!d^S4U_z2YllPC-{zmJ`T(RmhVZ>lI*z;c3nDkJe+Y!6Zk}cRtSg?NEZ>>X z`^9(o@DXS(zheGO(f@_cZp~UE79J>0VP$yziJ4vTg(+_X`C7gYL;n=~97q!Vcd>3j zHS4JVz``C1&!HR!Ocda-_F}3J`0PpI)3XdeIM5GRKAn%hrGM_or=z9)DCYd-fbo04 zr-nSOoq84Yt>8{z^|%vSQrC8NM}A#c+K-B*y%zK3|0_$o`CIcmN)JiMKM8s+r~+30 zRnU@31{!bFjw90`44%XwzIEx z{eNk@`!;2)?<^bNsMX66QJfa!C>4VAA82nl?HE`&kB63I{Tfr^p6~TslP&Ou@DHQw z!)`Zb4$#5(VL0|K7_8kfSn~7h1iToxkcecnBhaQAcqq(VFM94^~-P=2I8Sb zp(YrvN0ulD!f+5bsruPupF zu_TnSBsQp$n^d(r`!ef&mO zeXoB%bUB_;J<##rk6hL1KMqxR8^Yay5|K4me(z%>Q z)c%F4M(_DM1G-98Bc{k2JSAx1joczL5<~f3cy93j+W$}Dsdn~16#vndigKIsF}{kX zlpSWo82LaB{~}e4H|?S6u!KGG3iM9!7O?GM7qq1PvV)|Gwp&7-FAX#Yd`k~c@SOrZ z1Iz-J?}^ZozH40|=wK3DyI2}1n-H{r@{Q}99p@L&zXUG;%lAcSNp{?4=db5;s*$+d zjbF8BQ8h;)*zlu%#icIZ(FE7^*0~N-sg84%tiv@2{Bn*+l(Q6iESLZ+zvH1LS^aj! zk7X!!_eh`9$FTX<=+TD zYX>|6{Wy3skfAd>Ahq1pOKa=aAch|wgDc-wZ#-+=l;$>hH$DgVro_`!f;AZdT{ zpROa^`|+_l_X#**Owj+gHpst{ysZ4^LthQn0jtjkpe3cwH>Z|k_6inQ@Rt;gRvgR| zya*gPQ&jn}37<-wYF6me)rj!nOvFdL-tuZZoHMgeS9UTUKDCogx!d4tI6F>c6zd@% z3rLc3r_R%+%46-?!w}#whJ`(_VbhtJZ3^+Ez(a6&#<75hEJod1bb=pfZjG3DJ2 zKRbT<2D;?PsM8l%c@{%UTKl0{|A-%F?3Yw|&O{hA)UP@8Cs!ZA@T#Y8_l5NBcsY<^ ztM~hK=Rh@hCTi2D||3ylFTVT&Xi{>^4fZ}1NzV4ufUe44O-H7)hki1 zu2Yrm_31&^X=YDJMi}21hAV>L83A^xQ=rh3*VCA?NT9WlIYWv3M zH&w6Jp2h#Ik@%U!^G<+iBum$g*?^_&merTW@UNOgHf zsT^mPk*fy2R<28-H-fu>)zgd6k{UlS`nfKM-)qSki`{y6@Ws*+-g7zZ zdl0?s7#3Umv8SrPX$q4Sfk)e$!6`!(WJ zvP`SJC*-{DOVjAj&Yl7_(61oMHA_<2Ov3cUH6}wOtz-g!ou@8l7N4KmPB(IvmM8Q% z7J3Fa0a!U#LQDECea@&}Ev|nwip}DN-00?Q(n@@bpnsv^JltZWiTLLr1e=ZhQgPTJ z%BJq~CaWt5;9}ZJ#XKWdGkoKkGy5Q+{|P<>RxbZ&BiDD;JJFx5b`>?e3zmY2wlBVQ zoyO2m)r;LK1O34`m8GkmEM1@+=~nJBF=s0(jXV|bD-Gm13wkZM9$0yrpe0#7-5L0E zb@n`iYR9&tr`S8kp_KQS+a7b%n~*SLL(X%d<2fWFmsP|=8Jiry13rRtvsh%zQ>C)V zBC?*&M#T3Ola8hiw$3;5I^z>|K?(Fwa44|yPJxzW?Oi*+mMZUw%T}O4+feG=1=4O8 z$wleLOW>ro&>&_rjwX!i5SmFIi%N(!BRJrzWr2~W0e;p_*#i9x_!Y47{0Vyh<*`pR zkY`3hoOik#<9Wjas--1gwO<2?GN z({dxxBPBk_Y*mmO%}UP&4X-V;FG`Lj}YaL829`NO}Z#>hK$VnW`z&?~`e zVCB6DT2kt{yhdJq5KJOWD+^F7Ka%yQtKIgSh|W>(iwOj9Qp@+*kJf+EXdvfMXNhHfm7e4B7(3x53u2^d1YlHtB zEdiIw%=d!+z{*zzEopSz*#CD1@l(xnV%ORUwS=k=@!Gt(`lO}1Tzz}OoV(PfKBE0R z>Fr3v`*JdU`9M~P8DSTwCE??7%$52!7e`%{ahh6;e*<$%i&a5pD3+C`4# zTd%9obIN%f%lHz#*>SD%%Y<*`D#N#UYJ%?&=<#3*uzXL1mNfDoM!z-ho4cte?B7~C zy?Rky;1$Un$mM1Z`acu(zgW) z;K}Wie7&K&mT!sef9*qRbDuGu5OMt?$}%k$hu5~WgOP9) zR{vr;xPw$tW}2^Z3Pn6=Mz6Z+{$%l-)(ee%weYv~`EuwRz%9V)Zws`fEy1|55!nA1|EKFD8SFFZLJp*K!4y-ZOAM>v-Mqsu-iha%5D2u6}w`_DA-q#lyIojY; ztU1v~PRAD*|Gmy*0hEFAV zT0ZAO-vl-STi%DECC!bR_szfjxgt+p5Hrqh2H{s=f@QCaQEtJim zPkKKLInA-7*c3(xWfjA)s*PTdpCRvQ)&|zOJf^c$ZRp%+;Ik%tn=UbOMvsd+aBlF7ikt~3T2*(rfFww9ZE;W4X z$=BA`8=&t1jllBV3@yo?@7(ddBJKJFc5Ca=X%kyxBwodn-b0L((+^W;3)?gN@lqkn zFAJVK`PusC&fxtI`UA`F2hfu2d#w3C$>p4M&Z?>I34$* zNT_HgD$CRtHGfPM!PG;XpuqeCS84lCht#DZHByS@w5&Dd+K$||Tz`fBQpzziQLfR@ z$>p;CPo`e$erZ+}vAB+{T2aeGR5ZZuJ+0$S5UbL8()U zFNdEgf9nMGFzwFEVB)1Jj@v0xP4jsD`A}4o1csQ zVs)P1pO?|epszY4d?7ET62HVJsDCf)+Pvr>c2@IUKfmPQNI@(&G`!?=HNP&G`RjD7 zSxzVC6cBmrzjXbZ!s=_!eN^eXEBa~M5Ild%Z}oFC^p8Oku=;rpTK|1;UTeqqf|RPtyH_|zuxxf1$%aKrcD z6Zp0G@iG>ko?!{*n8PG{r!~lbCwWd zPw4ev1F-Tu04=HW_T5pQ@n(9|FJH!d!hF39^o;ix-ZhN=vQf2}rRph8`+u}cL2ZE? zZSW}$F#2;BsJ4y+unLrba%#uZJ$zR=YACh{ca$(}c3V;Gx4)W%5OYemb0|+U2&I@Gk#)1U!$R?fa$=> zITu>e{^`rkkJT<@2hZWlMO(ztXhB<|t3uJ4$T8DjXxnAZ-A0bh@UeEnFQIpWzW^(T zbCQw6t_Q3R_S2^7tHXN0Ri;W`VwMG_m@3T?w(D5hVd{{Iv``N2>J>hS*T&#*o)>34 z&^x5fr`MHFg*VEg{0)sp&I;s+i$X|M&`ZGzVC6gyTGCgqn09B+Ni=dYUuG(p^kruA zY>fG`XXNPQCpkq$=F3)!RpV6LWB4@(`AMFCf_@Kt04%>x?e7EspvwckhF|+S&Co?G zFCQXY8{BjB>$Ast_-yrl;yTZJeVIx zADz7?_$Tb!b|L(-W9UBR1%8tAeCz;)BkfGt%topV_--ZN9Q_UPzMyx3cY)>m0kkB` zucMwj+SQt`IP2zDo2yUUI-Qg%YO~D zBs*U`I(Tn&S?)tc`7Q2dGcuhjfo`7kZc@%4V4kCS+`e%FHMs?Axs&J#~b1U7wKYz|R zHSUzcQ*+&{laXYSYBA2b@QmLd)PMNc{&gwzh2TH`nAhB*?lqd4p4`3 z?UfzM!1&0IsNNC1De)VoZ(a4atB#lXjLk+~=TzncML5y`=;7c9VC9_&Eon)2^M17T zC{2J0u*9!iy~bg-37pMe!jir0IGYHfaI){md^ z^iK`SD7P`)`HYY=#04d6*`cbC(-?8UKZaSN3G~s$`5`~MP$IqM&@blTz;Lvh?8h=P znMWV3#^y50NzY^qTBMGOFl7;9S~HIA&zbW;rZ>HaJ;o3h2ddFiF+Z{2rQ(sG{FKl3 z_s>J`0IvaC{$0?LrU&P+Z42Iy-(CLM%iEXrX>a!_X=%;g3$!#|h39Zm`Am5MPM38F z4z#l~QH@PTuClp_=Q0cWB5)b7a(w_T$q(eZ?r>9Y_LfV3BPOGMB~e%UHH2@)u@wK( zYdn2>)!cp-(m%bc^lhxTo;G`XatQN0jc0T^wJA-Nvm;^vAf^f2=DL_0qf`Yf;yib{xGAJxo}#d}Xj?vtXBafNb!0 z>Bi2o?N0AVzc_YCTCr@W=D55bjE4zSPIW@QkCkF)Tb4E%TAniU?Sy}+mVkY)BFh=r zz`)9v1ug0IV4kit*cX~AA8+JI(hpV3;IgRVdFdNV=^L9pj%oYM8>HUUUEm1y0y8d1 z(7Mg=uONTh53Yv309+FA>}-B1mG9o|cA*(sTp`{QTrOp_R>1rM?=4BSPaD21Nqj$t z_U7T|1#G!4PpWZjE=#S>7JNTVE%R35jVK@E^iXal>-43HUFIrG41K~L#P~v}(DEU;e-$$m z$y7t%9?S@I!@o5%)?3};Mq`Y%S)a}f&tlPPc(|X>lFQM26YhDS8fw1l<4+?xY=}Qf z>ywrlIx6&#OrK=ZBKzpwf`j;}4{C2x{_pZ|gc=tZ%oV>4>OcCe2=xCI^nj|Ua}col zUk5Ge&OrYqQ@ZM>boJ+LHfShO%FO$tUu$IHu87+j`At~g?l-q*JpEIlz8<`bsj6o0 z(mdzx$TVIC1Hd$iEr+%C&@?Zv&mVAnN1+EB_hLlD@zEdY2!I za2X8jUrf2TlfUKvKJ*vhTVVNnXLc<2?jX))`##Ooawle_OC#yK?!8x}ohZqpj|@ zdTsbQ?;a&vuSYR=JA_~hF_~LDf**$v{V-eBLdxC_%1^#=oiodQ(C>i{faUuYw4{QR z_#>Jx9xl}@>J~3wb^=m}o!97os!g2dy<3$tqA#zhxoVi(ouQ_V%ZDS-MbZXI74I1S zQ)?3T=E=}Y!3tpc-wZ7&-WmUuix<^RTz=j%Vcp*unxT8@L6xoCFHifX;YSGiqA(`k&RpZ7jiY_{m@k5)s% zqt##zZWJCe;9sq$j^>n7eSu~E&#UNZP1deAG+-ab-5QV zuULHUa;b@&OSdkz-gg`P>%;5W3iZ6VJ;!;@J%)v>p8h~Ji;2oge^OqiI?}K8rFyLJ zS27i^@`_dZ(5#H}_?CsnJmP0(9*PB8#MqqyUV7-@Q4AlZ#-?N)ol%^of0Nry^+=cF z=z64wlK(amIxr;4{5NjTQC01}71H&q=_6Cl^0O0qt$NsKua1Ci~~D74=ZB5`vYe9pZD%^ z*`wMQ6LqQy*m;}2%Hu05PQYWOImxu)c2~@6RT_MYIyK| z#j=?)^|})Cq==?gs0!S?aFNpzE0?tp7(}1jsCD8ubfX!dG?T(ZJ!y-qE0u^9oX{pf|g|c4m#9_BtBY!eh#PQ z2Bi9cUk&-$=XC+}mEc-n`87aGvVPH>^E-i#NGeDCG6K`bb76R! z>)gjGj^o^DR=VP!new%eUtH(tIPXFK5BPV$qf7mniLuUA__|SHMUel<Opxhe1mjQ`h^tBHKA9)AP<8rTUe z-@iahvU=>2Z=lMevNv7U8u|^=9P4LsV};n$skc0+C|Q8|04Pde_(rHvF3nJ1Nm6{>2Bx;z(c_Dc^JA&K1Q!8 ztUl|&s{Hey{*#aGpF-zEoeYozET10Gk~;4X>w>6*`4uP5lmgW{FNS*2Ee8?dSp2jF zYYO<)ke@BrD(H*B<-qcL6k3vvBhsN=ueAJ#A>uUx3c@^cSa->2cL7v{}Fk#XC%&vqJHlxqaKdHA`yNmFdpr@Gyex$`nX<-rl&#Fw>D89iY8u zax!{GGx<$E@83z`Y)%Tz%ZQubgvDirr2>!<%Vhq&n>vQSi0~JAEXz&AIq+yO+YK}6 zl-7&CJ%_TgN$LHlni0GNk-yT-l_EK9l&4e(($~)x|L!3_HVI$Sqd4*jNti}|+_i5<{FOLBOY&b0pSTdD8=&t1 zjljzBQ)o%{ebS*mbgSgp^pOSfnW%*a?FI5)VW<4*zN5i)VmX8#^)`)Yb#7o_JX%vIi<;#`%EnN!*O@E zmOC5Z#d2plaI@IW@sN>gBYfkUGro|}kAtUxmFsnANuBD)+U@OfwYX1eFCFanc3~?1 z>tX|>VFSG2-K(6l@Xca6a0oWu5H*a=uxMkn`ju;J_@;=FV>5j0`}!&9m%uB)$}#C& zBgek%X)6In^}}h}sJ<&CM)eEco-E#<+Nee;fl-Z;j>NbYqk6u-K#b}PjOqij{4@PZ zF{-l;RKwHzqsF3KZB%=q{&G(9$k-9lLt@1d{hM?#rw8yiJ!qRre;WzqTBCYPgk$Bt z@@>s5%MPAD6Rw!crAC)4l8 z{fLZRAMj}+AN$_=HS`YfDzJS104*tX-?QdZIykU=t)EtY`HXQ<9k+G0NrI|5o#7kaf8al2wGtCP--#Xi+G>S+YU4fr+(eCx?Ku5-rk6Z%201z5gK z(2}|+Z!%v~;CkbV6}dQ8@8(fve1U!7oK2ZaSSRad%Dabrtv!-`KJfrRUtswj2ra3L z=bGSaA8e2qek-9R z**KJ)^0NgjpB!`+wT@padozR1g8$zZ@Y_m$wm!WK{Ra4Jz(dA)ss5@fbzByS3}ZbR zQ$1F<jbnsZ+j>qa$@mOsN@?T3{BXw@fjX?hb zYy(zrEzpvzzp6bqXYcYzxsZviPItPSWY_THX2(;StgLMJuJoPh)?@V_#`{rwtP*9+ zc&r*BntKN2z9{iLM?+5oGk}$A9<-#r+Ra{i7P-dn?YX*LJXbI3(s8x1#K^H3KDHje z0R0-+39KBup(WY&(?0IqOO7r*SGSAj>Wy7^uGaQ4a+EQEE!CXpqoB_M%Yl_+9ke9t zw`%u^bpD(Ie^9nUJ;jVaTcNg?Tkw*uo%(jq)#KE)xXEbG z)qx#7SGOpi*eQYMYFj@eXY`VUzIs9r00#jpXBo64yD!T6!C5&wdahoGQ?@v+ZkNMx z9ww@qIIf;0Hg02o!*4bD#dVI3b3OFWz*b=Sb-&c`n|pxqOZen$bML^fb_rX5#4(3> z$>6Meyc0ND4^=bRfV_G4}=dU1FZ>l|Y^eD|VIahQ3b=*8JRMujHgeUuN6K#-0ympM$(dEPq`?PtY9>GBD10JS*jU{i;* z{{J56C%`kn%5lQwMvk3FntE`+`5o(nJ{+)m2L367hT?rGb)wb3#@*$+t^VzvzTKL? zi^1ND-am_oML(Pwi*7vbVn2rs*D9-+^^kIPJcr)&Q`?xYh{^`cZdtt)8=Dq$wrv^R z59jV>@F{SM+*sPt>M_^L^bhVaiNE)9q6gC*JxBpVL&xBd>c);K_RG|;@N=$L$==p6 zY7ViTVjdgQCEm9!Rs(#_6jm-F)N-uIZ zx;gc3=7sGOI;|s(-kQ-%xqd>9^Dgu!;B#R0Ht7nZw>w)+|5Eceb5A@!eG=>91&PPF zWcl*5S7B}_X4`(jGOXL`Zu2G7%ZuL4VZxf0htpVtB$BF{l$EX20kJ;ah`oh-lYby> zq@aIfz!?l2k5hREg$A%blEy>~ZZEwVPvgGih6Yn^(LjGnjN1+oiu6HLqfL1lkT)Kb z=O@rlgXe%PkAI~p&jmreAL~DC%OjrMK_CTNBB={a89z;XB*SgWD0?JB3bHQdyyJ~! z|I%Q5RtKsPZjsk3Yl#}_c8i7xG#OTha7gL^l^d1$XVofk1$@6ho7rgW;=js!2l1z= z_e1JoFF77W&e5hEbCA>4=L?{(12+I$j=P~Ht^U+JkBOhBK9{Q6+UjKs^<=zmSV^9u z*f!UA+P29Tqvl2LH=eVZz&4L5Rp#bPBirHntJF#p!bbCH9dG1ngRgxb^|&hP3^i+*p|>Q zfmeW)V;8ifijPgb+3$=Tu>{;Ee(aU>?w3^AE3Xjf9oGgx@ z{tQuvNmxd~Nh=4LuOq6>?ic zga?q@H%i|Q+@)XPzsqp`<4J|Q+xHpl$^uw9-Niq*RpIF0cvr@0S>Sm9}A|3^jnr8&% zzb5fqWLZMAV#hgVx#2%;}>!n37rH^`1Jz&GyRDLu#w1K2mC2W+;Ob zBC~kCiHRh&=rz~>RtIlhsNN;wu&e&Af4bIq>~>JCu93r@95LhytBv%C{Q%?en`0`VsILu;u$B zv?Ocy*?sS}9+eK3ojbPnBtJLa+E=nh##?)kzGj(Tr`2AEQ}o{) zs*gS!a+^Z~^tG?JL%!&J8gZD;eu;X+rDsB+hjDu3o2F5hT2f;W*I;h2AGV{uJGR+m zt@o+-{~h_(bL;(K`r7|nl=!0eAyM8VM`HTWS)un5e8Z1U>+Y+Jtnjg{0?M=Kqh2H8 zRHS=2#KD-ShR^6(R!EZ(`>?yNNxxC*Q-xnMfvG4|OSLJ_R^%<$5@YvCIo3121-3ks zpe0TG%)A%A8rs=&Ni9#x(`oaY{EuXZ`9`yW{1tO6`bf8qU1`oAaqS+7DJW&@!)BqN z=Pe6oOLP)(;V$b_lEF3;PsL04JKN*-3c7^(KAzt9gz$;C4W#KTQ@)MJZ^!SCLO%z7 z18n)S8%+6L3Yl`%jP6)I-OuWw$Ycp_pa+Rf{tdB5e7DJ;_Xq`e$-67vnLjqXS$R3J zVr=vgZa19$$GSyXF#wqmsBebLuDe+Ehy<4&zx3iUX6P7Ps zihH7sW#m`>SY8!_D8!$MYRm?n5$Y7iF0r&8ibIBEujH%7AEfM@p#H-rt~ohQ_y%Gc zfPTQrF%4RhwQJhvCEMqZj6_D8gN7~(;uyBNH<)0MKQlIt?rmQ3KJ_p`3COE@)sf3azP=mdN>wZ(um;wZTAt| z=aCdyu1Q@J*0V5^Wcp=?_j%YEAhT4QDC^I_VRbywR>t#|oSN1>R!kF!v0y*PA4APi zMcsQ)cc8Me(ZD>3GxV6RhY_vk2K65~Z25l#{Wy3ESUGn>OS1Dlqrqfg>3$?J3Jy*yMPY zZEinxtZY4=<{w}kYJOn&Z6&|B&XK_$^dG>Vf#vr$w4|=)r7gc;UNgV)xOu{}hRyi> z)HvZeM)Rx<_?6zADBn@g=Yb1=<@Y+YB&+w-d7_Sy{k&6jIGLsTdbO)>z4Y}ceZ9g2 zo!PDQPv!bLLSoPC@Sccq9wdSPuntP;YZtO&eVh(G!(Oc@0ZY2662|pBu~Mvs0*Oo0 zi_KYax*&;5^N{{A(lZ*3mUN3{(TR(7>P33$_y{%5WlDcX)q~IIpS+ z7;7c$EWO;t9+;wfdA(yLVT`s**cr)B6Wr-pC7Gejh;(^Ox^8#XE|2NzawWQNzS79w zfP8T+A%6t@7TFzuHdVmfRvctQbDSO;$dlUO2-z$jaOK>n| zc(_(xW%%c8OvIV%2VD*(0n7gqXh~n?8U5WE>oO&y#4R#D|Qe#)ss*gxg&A4cFh{ zCB=uVzt)svr^v1)b)4PM{{jC6wj5tUOPZJxr_Pom5h2pVB#=t^qKkJc7v~3w0Ff2f z8Gci5OU&P#3|$2l0n6`fXh|)Bos&AAu}YII*@Qq4b}xtzC>PGFpVZzSzB`)&)n-1Tkb%eqQ`LEj#l z##Cn-hm?qYTR=f*yWccM2+j$lKDmK%zeFf~ z*hfQIda9&pqmh3O@{J6h&m!msa5J#-{~cP=k|6HgofmhM|Cr^AWzD@`Yg*N=G`BVF z7=7KGu5W*G_3Z_vZxeQ5M(*(bmdgNlj4EM;CJp;NrjCyIB_nunGuL8nrugowz;xogKtD?|Q{W36Cy;$~Qn?CMg+^RND{vTt28$$A>PL21N za+cqjsD~#&F90>bmh&8FN%p;%x_;9kGHRoH2iuO^MmK$vwnMfP7?TheY($3btuF4u zmc3JZui@WJ{-v4&6D-j0g5ALK|2On^@NXYgFfI58BKI*Zm?_hOJ3J0)xiT_{QJe5* zN_j|vfBg@G^52!&FPxNP!_j6Yb$M30ssCOtFVih73nKa~9_mHyeqq^PWrco6#k6FP3mslYLD$~n( zA-z0tgYxIPw<`a?o~rld+}uxGe^KZP12E>fMR=)+x}d!1=)H;W21Q z_Pu4}p4hH-J|1EBi)|tUuGiRYBo;GqeiZHV?wUs(4)c8z{)iZTGC@dys6IQ3VLC76<(!x z74DE#@o!MbxzesCGx2_~ovw1~e`fe@B;UBs*>Qdh{U~@GSia9dOUmhD-ay-N0ptAI zS$aUR)VT&{)N(QIr}~^{A^*QE;1|6oQO=&w2Z1tR`ISRUdMQ}%C=K>W*?J(8EH<(& z@9>vQ7^9PeH@R}|OFvkxp_UeT<70)=b{=#6wf3b)zU4nR~nt!`W^5OVCDD}`n%*vHhg|!44(tF`4chb&sVPVMaB@Oe@^oU z7&%T-EGcSICRounJf?eg`ed_E*g*>%|=+3b!(Uyh|b-|`8yq~>YkuHsjw zT*VJ2%2ft^9GC@cxz<4^mn(I?N52m`L=|@3udXtq4P@SgO=%@k)~-`ToY_Tedl&mvPWHgWG}Ci~5n#%j>~<*z>`9 zlFeVgm&u;VmE-h$%2Iv3+DxbP(mx!fuh*HcTFrdRE9R&Fm|IW%7l-TXY5IDIOvJQ! zyE2j^`R+A2rla|u?n^Y^nLwiXF2I+k#P9C2PfI4sOg!H@zBJ){vx9KHr|uojmpAyY zL+V-2y(Uan( z-X|^*eFrmcosP^?Y((Gl{aQOhsoY`YXoXLX=0tc?=*UA+CmmQha-k*J{mS-kpO?J1 z6YsITB2?}mLgh6XNf9cW1HN;}*YZ6V`Vw#juzatFPUf5HPuU4yB7LbugvuRk4d0Nl zSA@#)mrc2MlE3Bu8T2KgxZm@UM60=~u-0&YcW8_Z~a?FEX4(foFV>PrSyRX8&ANJBi7gC^= zyNyZC5{$@ZR_l~| zRXmNO=iEpTjl|gKi*lV@(63_Hp@+hjHw<4ppljt6-Gc8A&9TBWcX`5&FGId{>|L?ky|oAT}$qL@t1PlmfT08`u3iu zZyO`}_Mo{vp!BDw%i8A%KE{mE+ls`Q7 zrR!(rC2|y>ykMw`EmQ;Isd=31%;5(u*Qnk>FH|@EN>UzCSqTztUyOxuJmJs0RTPz& z9-y>LLA#R|9ZW1dZInO*xJ~(gcinGXagyKw46Cd6g>8TwIfz68B@}}w9F|THX`P{=1p^odvn^8kPX&I zm7ys%hV&YEo~3vX_!i)SkcO;ZJLhNaK&Nk+#?=s+h~ztE*D2XZ-hGUv$u3!mT8;rVUg{{X)H zU!Omzrk40b)#vEAPnyVenh127Lpo&-CdaLX;5ERRfR)?5;8Jc1`@`~M%(%7R`shgr z8RE{eEq;r*vy2wUmDjw+gmVMYels!1El^i0;y!f8xFpv z*Ed_hn}MeR%TMqd!;f9x*m-Kd@?5;UiuY%jY6{+pYzf>Z@^)|0GJTIhLyafM>M-W1 zT&(L-iES;O0FkAB_gD&29e~$IsTvh6NG}|^!5tKy55@b$k*Y~#gR$Y?10|6v*^3K{ z&h(H!!A}N14Okj}C+*s{XS?3-z_%VBBnH1pKl(B5D^st6hmv}xA>bvz!GIK@xu_10DFMulb*S2C*g`2<-o7p!`)qZ>&H% z{`A`SlTcP(kN$Y49Qdb*ztTUNZab%po@FUUE@K}~j$^aI=K%`-)&WW0mfSo~xWm*UHQ5ASABTZhhrsKtX@-wGLOMe0x8N@TZv&Q(zu4b* zYVZ5VA)N2?b(({-2||)SOEz4mJ*pYH6s#evC-GN^?o#15eddHGxP5yI+ zdH#kD&%YJ?PT=1E`T07gZ<0dUu}*pT{2d*h@BWrG29OF!`ELH_t*Wf9*{1>%bp@t6 zHTj&r4%d%x8bdneJk!qaOTd=_XM8U@VX!zFz3PE{dTM;-!!BOq`D5%!|WWKV)hrg;wqTa)w9DDWA;ae!@ai@>GW{^oyS*1O^RURE-3 z@#3|sDi@z!(!QDG1ms5Jultbk-ql(A-uHgwI|bu7vd$qrg_{?7#FYcmi4QL2W}UgTp4EJn-h>Sv^P{Bpn}J2e)_2POfQ&TMcgb{@9+yLLLP(yA6$uc)lSA5+$#eqkjc>#~73u6Gx?&QUoW z2M$AhN04tZSUy+B%*)I%_1w(!i!}wuxgY#F;17VM-~DkzKQ+~?M|Msy_x;fiyM0lU zU$sTdzh8>$+o56w{-O7i6sK+!ww_`ln3Kn^ebt*k}GP72C1lLAP zdOq{8ZO>+1+s9L}gE@iEk@Z$a5Co$zAehLTd%{)cs+$AZcwOUq6C=lIn~|mhQ?EMs zw(swU;6Da#0BpVdZKhtG%-)BTyAN{o)H1g%^4sUNt$9*Y}?7(U8=mu$}` zgP#u60+x>p!KECqJ$D!8PbE$fah^4YCI|w7wL~IGnCIY`ZN*vMC2+$-vzrRy9-0)iuKbGHH!0!Vd z04%@Hf_LQiyT(~9KO0B7v>#zDPnI-VBSeO`yUuPaLrltG*SIi~+NYZcu`T2$^U0*% zp)dGgpaih|Ob3_J&?!$syZlg{%7MCHx<%q@W<&ZJ*SUn08WO-an-R1>%CerEqN)f@ z%E5U>uQ!`Zj662*{6bBET`Tyl!0jPTS)X){``S(yZPIa-$CX&6Qg3Iw*W1B*FxBd1C@Ed_fz|wyXTuNsNkvDT%spI zxU|FbJI5>PTJNyZ1yCt)u4A;%5DI1C^ILe9mG5qF_Zj@+04v`C;8G4aF1E`T)!CGF zbrV;bF;a%5vbjijCUE$K6sYfYox6M@Un1WWm55~cgY`XymX4)je`I>3`lSthSvJbZ zcRBQJ`@0Z)J+L9px@ljFn4arzb4*bgm=vdpG`HMfm)d4$uDtJndQ9IAH7l zb8snkJWdVm*SpHuj>bhT!Q__$wEdj?#dk!5ZPz+f4%m$ZY#~JHq)>S^Vk4fz7O!|~& z_lMeYv99*OWcF zCu;hwhZ}wy;m5Y;$H1Qgo&zkuE#OjYd(M5m(>|oVJu_Y$U%hgT<~OHe`XcP*y~WN3 zqFfvz%l{*dMPT_6hHk<0NxFxC&jl6$mhKhc9qB&z&Uet&BbFx29_TM-^Rqy^&b?(e zM5l=d-FEM`h|@&e*gV?KAd)o?Mo8(Zkm$Bt`8+|~cd{A2@G=PkFFG)Y&6ZVJow_2h z<81u|!~dJ`SExC}{{egt@C{)3&w0V{Z|$PG%&SXR)~?c)VXYVtejx7DagG3C@(Shb zBHD|JOyY%B(B!+PC^W6`aT-Y}BxjG5hBCv)0_fQHw+ehMaCS&r`uq19=S_z{4C045 zACjpig`W%pT2NX-I?r{W(+d7~;9r2PZ~E^|ee0~heCYSnwOy}Wv9^ZcrEjZux%YwR zwlbT1K&7^O?*-0%xg(Uy9l(nFC6}`*k}>(W>RDum>)$JrHpB3n z`C_u&90XnlOaUyvKLD4~9NPO@Kd-KGJXVX5xaO@o8gPTYj+F4g>n;$!AM>533Wi|7 zovjXw4Dtt}A7@fdO;K~Qa~LFYqdD1J*=Uijp-A5N?2&N3NY%UQ*NT0eX=nAv7`~r_ zuR_fkYjp5Ez&C*9d&D2UFWdRM8roK~+T zc+gnX0-RzG%rUKtemUQ~r{b5A{kRPL1YjXx<#++Ol#OXdehVfYNRD;2KS0^0`ZnMg zc$IP+6p1b67QKo&;A8JP-}y=%j*;Vho$N2<2qb26#0+!F2;8JcXHvEk~^FVx-SCS$_7_CRu@~uR6 zxYN_OP3HE5t3Tb%C*k|;G}1xN@d@P9pM=^CZtMkDm4RLD5>D4yw^rgz*<70|WlsMwf{LUp{p6VrgT;#vV)awrTE|o7R&EPKpF9Eh* z?}AIQaRhsX<9yd~X|8FA{WJyEFHz1@SU2~Q?aBZdSEj0ooH;f!5>J`J!Q=uFRryuA&AHQfm5Am{Wb_ADz2U0GGW(lSvBdDV0Q$w@cXi

    S! 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

    kx$U^QU*SOfmw@sXq|Jq#z6J|DHv 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�%Y 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�)5LB(j`xW3*xA>Ifg*FzgMw??^xBDrpUS>Q$o+ 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�{+aP3?I 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 z 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%0A3bwrCj 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

    |OZddvfp~xtvQ62eo0rZ>yx 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

    DoN!&^6n2bU{NwjUS9 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 z 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

    ~< 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�LtkGHrXlHK~#Kvp5YV>9IDD%MA$*OSDL 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 ^UV_iBm|09<%k3iwM~`!BuPf9cWw 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

    uRgWT$Nv$dr;SzrMB*rOr?aCEL-q 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

    2T!MD!!)G- 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 literal 0 HcmV?d00001 diff --git a/example/prometheus-mock/main.go b/example/prometheus-mock/main.go new file mode 100644 index 0000000..de85cc7 --- /dev/null +++ b/example/prometheus-mock/main.go @@ -0,0 +1,316 @@ +package main + +import ( + "fmt" + "math/rand" + "net/http" + "os" + "os/signal" + "syscall" + "time" + + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promhttp" +) + +var ( + numberOfMeshConnections = 25 + updateRate time.Duration = 2 //number of seconds between updates + maxRequestsPerSecond = 2000 // maximum number of requests per second for an application + ingressRequestsPerSecond = 2000 //number of requests per second per ingress per cluster + + connections = []meshConnection{} + gateways = []ingressGatewayConnection{} + + clusters = []string{ + "us-east-1", + "us-west-2", + "ap-southeast-1", + "eu-west-1", + } + + httpCounter = prometheus.NewCounterVec(prometheus.CounterOpts{ + Name: "istio_request_count", + Help: "Total number of requests", + }, + []string{ + "source_service", + "source_version", + "destination_service", + "destination_version", + "cluster", + "response_code", + }, + ) + + httpServiceNames = []service{ + service{"istio-ingressgateway", []string{"v5"}}, + service{"parrot", []string{"v5"}}, + service{"penguin", []string{"v1", "v2"}}, + service{"toucan", []string{"v1"}}, + service{"cuckoos", []string{"v3"}}, + service{"woodpecker", []string{"v1"}}, + service{"passerine", []string{"v1", "v2"}}, + service{"albatross", []string{"v1"}}, + service{"anatidae", []string{"v6"}}, + service{"gregatidae", []string{"v4", "v5"}}, + service{"flowl", []string{"v1"}}, + service{"grouse", []string{"v1"}}, + service{"kiwis", []string{"v9"}}, + service{"swift", []string{"v1", "v2"}}, + service{"ightjar", []string{"v3"}}, + service{"guineafowl", []string{"v1", "v2"}}, + service{"turaco", []string{"v1"}}, + service{"neognathae", []string{"v3", "v4"}}, + service{"spoonbill", []string{"v11"}}, + service{"beeeater", []string{"v2"}}, + service{"shorebirds", []string{"v7", "v8"}}, + } +) + +type ingressGatewayConnection struct { + source string + destination string + requestsPerSeconds int // number of requests per second + surge int // max percent of rate that can change +x% + errorRate int //percent of errors + cluster string + total500 float64 + total200 float64 + total401 float64 + total305 float64 +} + +type meshConnection struct { + sourceIndex int + destinationIndex int + splitPercent int // 0-100 rps split percent from vx to vy + requestsPerSeconds int // number of requests per second + surge int // max percent of rate that can change +x% + errorRate int //percent of errors + total500 []float64 + total200 []float64 + total401 []float64 + total305 []float64 +} + +type service struct { + name string + versions []string +} + +func main() { + sigCh := make(chan os.Signal, 1) + signal.Notify(sigCh, os.Interrupt, syscall.SIGTERM) + errCh := make(chan error) + + rg := prometheus.NewRegistry() + rg.MustRegister( + httpCounter, + ) + + mux := http.NewServeMux() + mux.Handle("/metrics", promhttp.HandlerFor(rg, promhttp.HandlerOpts{})) + + go func() { + addr := ":30001" + fmt.Printf("Http server is running on %s\n", addr) + if err := http.ListenAndServe(addr, mux); err != nil { + errCh <- err + } + }() + + doneCh := make(chan struct{}) + defer close(doneCh) + + initilizeServices() + + go func() { + ticker := time.NewTicker(updateRate * time.Second) + defer ticker.Stop() + + for { + select { + case <-doneCh: + return + + case <-ticker.C: + updateData() + } + } + }() + + select { + case <-sigCh: + fmt.Println("Stopped after receiving SIGTERM signal") + case err := <-errCh: + fmt.Printf("Stopped due to error %s\n", err.Error()) + } +} + +func initilizeServices() { + + // generate mesh connections + for i := 0; i < numberOfMeshConnections; i++ { + sourceIndex, destinationIndex := generateIndices() + errRate := 2 // max 10% error rate + rps := rand.Intn(maxRequestsPerSecond) + splitPercent := rand.Intn(100) + surge := 20 // 20% surge in requests + + connection := meshConnection{ + sourceIndex: sourceIndex, + destinationIndex: destinationIndex, + errorRate: errRate, + requestsPerSeconds: rps, + splitPercent: splitPercent, + surge: surge, + total200: []float64{0.0, 0.0}, + total500: []float64{0.0, 0.0}, + total401: []float64{0.0, 0.0}, + total305: []float64{0.0, 0.0}, + } + connections = append(connections, connection) + } + + //ingress gateway per cluster + for _, c := range clusters { + gateway := ingressGatewayConnection{ + source: "INTERNET", + cluster: c, + destination: "istio-ingressgateway", + requestsPerSeconds: ingressRequestsPerSecond, + surge: 20, + errorRate: 1, + total500: 0.0, + total200: 0.0, + total401: 0.0, + total305: 0.0, + } + gateways = append(gateways, gateway) + } +} + +func generateIndices() (sourceIndex int, destinationIndex int) { + sourceIndex = rand.Intn(len(httpServiceNames)) + destinationIndex = rand.Intn(len(httpServiceNames)) + if (sourceIndex == destinationIndex) || connectionAlreadyMade(sourceIndex, destinationIndex) { + // keep looking for a new index if they are equal or already exist, recursive + return generateIndices() + } + + return sourceIndex, destinationIndex +} + +func connectionAlreadyMade(sourceIndex int, destinationIndex int) bool { + for _, c := range connections { + if c.sourceIndex == sourceIndex && c.destinationIndex == destinationIndex { + return true + } + } + return false +} + +func updateData() { + fmt.Println("update metrics") + + for i := 0; i < len(connections); i++ { + generateHttpMetric(&connections[i]) + + } + //TODO generate istio-ingressgateway metrics everytime + generateIngressHttpMetric() +} + +func generateHttpMetric(connection *meshConnection) { + + for i := 0; i < len(clusters); i++ { + cluster := clusters[i] + //we need to generate requests for each cluster. we will randomize for each + total := float64(connection.requestsPerSeconds * int(updateRate)) + // fmt.Println(connection.surge) + surgePercent := float64(rand.Intn(connection.surge)) / float64(100) + surge := float64(connection.requestsPerSeconds) * surgePercent + + total += surge + + rps500 := total * float64(rand.Intn(connection.errorRate)) / float64(100) + rps200 := (total - rps500) * 0.9 + rps401 := (total - rps500) * 0.01 + rps305 := (total - rps500) * 0.09 + + sourceService := httpServiceNames[connection.sourceIndex] + destinationService := httpServiceNames[connection.destinationIndex] + + var splitRate []float64 + if len(destinationService.versions) == 1 { + splitRate = []float64{float64(100)} + } else if len(destinationService.versions) == 2 { + + splitRate = []float64{ + float64(1) - float64(connection.splitPercent/100), + float64(connection.splitPercent), + } + } else { + panic("Either 1 or 2 detination versions are required") + } + + //there will only ever be 2 destination versions for now, we will split the requests based on that + for i, s := range splitRate { + + connection.total200[i] += s * rps200 + connection.total305[i] += s * rps305 + connection.total401[i] += s * rps401 + connection.total500[i] += s * rps500 + + httpCounter.WithLabelValues(sourceService.name, sourceService.versions[0], destinationService.name, destinationService.versions[i], cluster, "200").Set(connection.total200[i]) + httpCounter.WithLabelValues(sourceService.name, sourceService.versions[0], destinationService.name, destinationService.versions[i], cluster, "500").Set(connection.total500[i]) + httpCounter.WithLabelValues(sourceService.name, sourceService.versions[0], destinationService.name, destinationService.versions[i], cluster, "401").Set(connection.total401[i]) + httpCounter.WithLabelValues(sourceService.name, sourceService.versions[0], destinationService.name, destinationService.versions[i], cluster, "305").Set(connection.total305[i]) + } + } +} + +func generateIngressHttpMetric() { + + for i := 0; i < len(gateways); i++ { + g := &gateways[i] + + //we need to generate requests for each cluster. we will randomize for each + total := float64(g.requestsPerSeconds * int(updateRate)) + surgePercent := float64(rand.Intn(g.surge)) / float64(100) + surge := float64(g.requestsPerSeconds) * surgePercent + + total += surge + + rps500 := total * float64(rand.Intn(g.errorRate)) / float64(100) + rps200 := (total - rps500) * 0.9 + rps401 := (total - rps500) * 0.01 + rps305 := (total - rps500) * 0.09 + + g.total200 = g.total200 + rps200 + g.total305 += rps305 + g.total401 += rps401 + g.total500 += rps500 + + httpCounter.WithLabelValues(g.source, "v1", g.destination, "v1", g.cluster, "200").Set(g.total200) + httpCounter.WithLabelValues(g.source, "v1", g.destination, "v1", g.cluster, "500").Set(g.total500) + httpCounter.WithLabelValues(g.source, "v1", g.destination, "v1", g.cluster, "401").Set(g.total401) + httpCounter.WithLabelValues(g.source, "v1", g.destination, "v1", g.cluster, "305").Set(g.total305) + } + +} + +// func generateClusterMetric() { +// clusterGauge.WithLabelValues("INTERNET", "demo-cluster-1", "200").Set(1000) +// clusterGauge.WithLabelValues("INTERNET", "demo-cluster-1", "500").Set(10) + +// clusterGauge.WithLabelValues("demo-cluster-1", "demo-cluster-2", "200").Set(100) +// clusterGauge.WithLabelValues("demo-cluster-1", "demo-cluster-2", "500").Set(1) + +// clusterGauge.WithLabelValues("INTERNET", "demo-cluster-2", "200").Set(500) +// clusterGauge.WithLabelValues("INTERNET", "demo-cluster-2", "500").Set(5) + +// clusterGauge.WithLabelValues("INTERNET", "demo-cluster-3", "200").Set(100) +// clusterGauge.WithLabelValues("INTERNET", "demo-cluster-3", "500").Set(5) +// } diff --git a/example/prometheus-mock/prometheus-mock b/example/prometheus-mock/prometheus-mock new file mode 100755 index 0000000000000000000000000000000000000000..e4e4a2c145d4f291423ce70a1ecc7e7833590518 GIT binary patch literal 8225100 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

    l0 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�%1uJ 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

    i%SQKj|^f

  • fE~ioko6u8g8R2`t1lMG2}mV?K_u+y~e_%_SF*c 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
    3d!(`q;x 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%0DILpITnOFn^wX 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

    EmNupJ!`vb2{1_G^ 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

    3+Qj{WR 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

    ;h1Zwu=V`(0ZMj+b0@P>Oq?OWOdZcu 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

    4FNFWZM1bi*VW7D7iN5-acL_g385YrDV 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 z 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 z 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

    LWJpeG2Lo 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

    xcSQGG5r(QedtsJIUuDeh# zb}_|2oO<%f39LQ&Y7Qnz+Ws|-x>_rCbKA!n!0N@m0%i}x|9tAVlN{Fyn0IQw|CVlE zt7q#n*Z*?r<%zb%zP>`fnAM578;!l;r9M@v<-TG~rqRPGIo1L>hSI1xIX;;}S}W8= zPQOQALV5tH4F3ojCSZXKpGc#PW%zgln3dt5(sZp1|DI|-Pyp_-sLZ2)n!&AL5$1vM zi*F~Db&AN_y;4(YKF@WHUQ=mrvAfjgMlgZ9x1U=iN=t%gXNah?0VDaMED9X~BQi6L ze8C2Ep#gJ6C1v~$>faI4>5%>rg(Dkqa74G5{g8trx<#Ku0Ugm-VGQ0kVPa4VE>18Z zE;;UxPx4*c4JqFxG#G|xjJYy!I)5B!%E%R-&HHVOL{vs74{6^ zVyRXVtw<`2~e%-(0V_F#-OUa*yR(&YI}_}=Rz4=v(Qj!f1}w@ zS9dBL+WJb-=0s;!a9_fzLdr~>>hhwRUeA?Te7wJ!>y16UDYG8ss)ekm?35qkTul~0 zPdir=m&&%R$!C9!GUaNAGtX0AnmMnLwy>V9%9QfXSdJEoe$h7X@T0UWbMnQp1>rIg zud&~`T7OMyzRcIG_tL~DW&33G{n+OKajv*GZdf#APcvAo43;t32Fb@?xcIG0xL+Ug zs>wC0IfuflG6U*;gSlSyEIr>2RPD+wTypqgM(JHlhOS&BlK09)#kmHXCMnPN%HsHt zA1Ve6_RIh&loodMiR{A86iSP=+$$2H>dNQEDfinrD%QOZ_rVXWfeh-l=;4qvZ3pOJ zHJdNWrp0V%Lkv=9FgqY>ab?Idc3Ax@2W!1zARY|~^_Ep{{uq{*`n7&oTMjj-eF~6wd|BB)W>R841w2Os$O&I z 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∾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

    qz8`LLIOz2| z{NVfT!auk_Hv7T#8}@_y)0CjMXIpFkjdf7}Zl(+BsO^WJzoS(RdcI!Jhix79OW+26 zI}!9i#t4BQ-_8B)1m0FYp*HGO9&z0GoZ6`KQ@CF*$DK-@Uts^Oq2u3TbUbt2@oxl9 z!tEG6f%C8}4oc;ETP>knZh{-Vr8c^fa%m~K4fsf@^T#=U3Gd+p)OjyHuP49~_$T(k zNmx6vtk4McdcEoQLyshqD2^4eEe^zCsMp)dItTHcQs=L5{64mUf@O9xUPER3; zIjHlI=zC#ZrOv-eE1eL0ybew;^%T^34}MNGdQ%$MgBE; zV?%OHE%L*C#j#BTZfve;P}ow?#e+$8%so zEQ^h?4eIlyX)2wpm={~2&d28)KX1%{1<;+Jo5Q1?|AT%ptc~`U6AbiU;+E1jrlB_K zq3Zk~V{AZe)cJ93q+^^;ZPfX)?WI!*YbkYpFvrK^Y+Q>A`90V&)bq)^O2?Ri+Nkr* zx=E)$-u_eSj@@-q>O0j!SoP|v6DFP+R-04t)`Ksj#I^Bp;E>`mPl@8e_C^X&&o z$Jm>CAch+*$0MMgkMx&xjB%)qI`277I>xBf(NX7hy=J_0j9aODy0 zaJ($m#1=SWrA&-PJ->_GMVvuykwsq5>w3^S=}f>o>!p5$I=`O2aVND==XE`PgLI6u zsOMnFjdI)*_54Ws#%a`ZFw9n&2#b0?;TGu_Q&Agr-j{WZZK&JfdAy8zzTP(J7+X@e z!}7c2ctzCnO?FDh*p}L;^Xpj0xRZJ}Cfh9&sZh_ap>Nzty&o6tmx(2)=U4BOj&Uos zQRi*%r4t&XVO-RCw-3@OjVnG&eHC@S^GE6Yg%|NQ-pBW-=bL|#jkE`1*l(f%iboss=`8y}#aUm8;Kd+|6vK%L*l@2wBu z8FUXL>x99CmRdIv;{{LSb~wX0iU@1hW269EY1xuOBv{qKcGw5?e2B&}Z_G<=EKA)K^?W$`x$&PSvfg{t`JUt!;8JqyE%MV_$$GPJ zF|J3w{(ky5a8FyAKZvLCD&E1b=+RE{(J(IN!!pS?;zV4GIzP6fj>jJ?mcojt^DpK|&iIkq zsPmV%O8zw#-!63>jJZQx$F2Gy?04JIqLc3j>j?E|K-9_d!?R)I-ieR z9jv)u@(obuACUWsm08yZb1;|3VqULz=75~U>iA zf8bZkKBq^Q_cHJ-?dc$1v16 z$s2XP+66g22%BG$+7G+o2-NeTuSwn*mpV1-ysjgWi-zeiv&DSB>vBHhMQXPj(%0*+ z;rK}mPA;rP-tQ&XA3G}b`UO5pzBo2i>iqG~k}vc{EbJD{8Sz7%uR!iNx|7Rik-ti= z)K^*mpz|+b*q^_Mdi@&YcA@?0JI=@+i~I?4*}uv9e&i-t+mo>#+RtqPmx&G z%YprqNWBra;~qSWH_(<;@*z>LA2*pCPl9PNI~G&w`7Nnr{w#h?BXyLtVr)!>4Y3*O z_1sd+oHwpuy`6XfFW`M;E!M4Xv3?%bt%v!UuZT6U8Fs-QSebQeSghZib$j7Syp8wq z9hPC8iWci-%_O%+5zLZB>YS)=zlY?$Vp?*UEb>Qk%6cLG5aVD%)a$3oEjb_TioHz(K%^TzYk7g6W$&^JD&erl25*Im{>j+d2B zd&uz@sLywe{2jbR&ZzSb$)zV(9Y^70T!ssK%K6u!Uaw9sIo=o}_K`X&>ilr}6R=7@ z$=5)g|52TIoXn@g))S>3fFp4N>hKg z<7(-mAZ zrEeTgZPfXddnLaOk7AvD(r<|$P|r`En{q z^Y`gL$8R|Dgyd&ns*{1wx49zy9yk%FqCVe+dy+R^r#9+*??;j!gd>$YpZJ;Njp?Zi zVqK-4@AE?D2jULp3F=3v=ZDkZh7VuKdhb!^7rl|=>v11eeJg!me2IE~)jP=TvPU-_%7ZyZi-oKC#~^?WV*!|-TuIp2BI`6_O5+~`By2d63Z{Jc;yzXV@k zsL;}nqs&BY)axw?Cv!XTD4s^0|54pHf~+?Q=iw6k(Y!u>in)gvHlnO=EJSV8^F=sb z7VF?M{E9;&$+~*JR#fS?#U9uXb^b?n`2@0FH=L!^^Q96>z5%wv_Nenes>d_810N~% zeAh&B{!zF_d5ZcB>iL36WWF5M#9o*#nH$Bn^K%DhqMvvS;+ zm)fZFEmO&Q#*WlRo$sDT^2PzwMxEcpapP`kqt16pE9(!yNy^#OMm;~1epV?tz6ssRNbQM{F)n&zHPq`> zEHCq|up^E_oexz(^4^#Nb7OuihkAZheVI3Iq&Dh&m<*v(}=9!6;; zwHNAq$aZqv7@j&J>ih-z#_QBKE%No-%lgJ9)Xh+@?=f2PMo;PpsPpSbN&X{-B4^b3 zs#7K36g%Kdyn&^sNlwq#rQZg-W6J4)=ReGpez{pjjJ)d;3Kc3^p$<)(P=ZDZAjT4nR|CHm#7u0W1 z=Wo(~h|iQdUud`7KE`6yrBLUy)6a)RlsZ3)g9Cdy&{n@xssqDe>ikWPKg4HBo!@szZcpP`YNO6?6R7jL4u4egMsMnrsPk_0!(c?E&PV3BF&%X#)cNqoWIyTg59Pz-a{LMEd0pRR z-guYVsPktyeid&kb^brClkk2qrl2U>9zcg0>xo!9l5 zQ}X_KiUUqdJszjw8r+K~QLlIXtjyoRk4l}Nb6)aGaHUe`bzSPR%p1#58+E=A$BSVZ zrOrotAnT{YGU$twa3<>cbM%eZsDnS0b#=ZM{r)&asq>Sb$~yBg!aq_cM4b=!OpaH> zThFDA{z8n8sW8TC>3gGIuPV9ecnQP5l)0#w07J7*G>i4hk(-KPUdcLnu{c)5PZ-i- zy;-cY93P6>xWDy$IIaXe2rf)bb84p#*C=f8$vksNKu{gC+=ckX5{8qfZQ0m91^B+gc zaj!Arg?VDU`C?MciF*F-c**6MAb!Qj6Q#~KMI45n)1{7vr?KY@>Ff0$u9JSS_2SD7 z;%C(PgXB))S!ELD%391{B>x#Bkc(xJKe<`<^VYakYTGtc8_af6`sJ~KvI(_OjsMr> zc-A*grCy8w?Fn+7lIv$IKwT66+x0K9j`2G6d-Oal=Z}W}?fDK}k@YU%4ZMYkugh_x zKHpt(ukaJbzAAIEnU9Zpei6BKxD7vIMCPL5(1)__NYv|nVJ^%y$wkKI7=m>?u^;OU zwpefY3t8tlp2bUe9Y3MoPsg`1zYu4>lX?~E{6FN9aC{g}vB+noUk|(C5R1I;2RXm7 zAN3SmuG~#+)cgJ5;o)or3n9K$>U>y^SHxL(6i?$-{D$E|%KCb}%h9C&0b@p&Iz5Jo zDRm^&^F3n7@%gw9PoW!gAuQ&jv0!T4ga`GBsNY~%d3uB`nmqi-#>4ynHT5o{w0iJ5 za3gUi>VbXq^Yi-1J#f9n>m^T%A}b`0DrUv5sMpUPT{_$GBnFG2lTwGI-v_tjdyD+_ zm@?-ZOYDqWP@m;UTMh~)cF?iq%#}a#Fx4o>U_Hd(s_U}5=vbdrE=qh#FSDOM4hig|1^eAC5a-a^S$Z6#WZ}N)ifV)YG7SXXrWx{(WIkw4%m`Ae9DuO}HSzTON9EBT2ykFQtDQI5La#)=@9 z3*#ExjIN|ys>IhJUkuOJn;59`Ns~**n2I_Z9>LS7=hvl>&K~sU^HfTU&u61}Kc7Nh z-p~BFua~zSO(3mLn2WCu#ZV8pC6-P)?298%=SR`sj!}|GB0lPTll0PQg)?yvp1?DB z4ldcAmjACMT!V+Z^bd*Nstk9xh#d8CsQeQ^km$H}-9 zSE6386R(ro9T(tXJcZ}*0X{*!UXOgz>4yvP2%g6C_z<6>P5o<^Um9I-8t%jccm%KE zEmX_dRuquVTD*^*1*IPY<6s)hfO@?Yg`|@XD`F??fqif+PDH()Phsga$8oq3ci}b~uYC#WbjA622+!dqe1gwWueZ0PbPnSij8#hd2{18c#hj?u3s+h?Q7|XgK_6_2 z-LNO>^|Fdc7WHrPB}B;U&C>kMJ|v%ITG)9!!4(uEz6t4R7IV ze2;q7gftSP`Lx!6dI=sxO$r+3)AeNP`8r7L<|Y^1F&-Acp|}Y3GNI}7a%r}%)B`N? zH|gI&US7kND449=9IgId%R}aPSrJy@RMt6(vIoxT@ePg7$ai?6Q*>G#G_IL9Ktkp4Y< zi=oUNQ(d22eBCr(cL!1rv-o=Ikxv!~h54`u%2C(blJv{tTHJy*^{;aiX$-`B_yoJQ zljC#oHr~bBo#c1}RLk3ju+AM^%G@>7`O{6MWBfoJyqWaRw+yJBpGp1%9w%?q`I@Y| zx49hY-a_1gWw~CJEUw={<}PAN=8T=Gjr#nTnR|nt$4}x*e1|&UiStgy$N0r!KeOp?#hZA~A|L%PIb#A`j4M#@=k74+MB(^6rOsy^ zE}eY%8Qn(cq|_c9&xG%kdg}2=>BJi)CdIN?6>FlN?=w+4OE4_opv5!asHuU!$(_J& zlO*77kzY1NjvGHy8`bi*wH)7vMW#xk0_yy`Y0{}PT}(BDJnH=XnbKK_kMIe~QPBG8cD~?EBU( zF+TIFncHqLpNzT2IFiNr@Cl2#*$d^Q&e|muP9u!+(JJk6$homzXU*Sj8`Cx~o6BcKjliH~B z`N);P;pB}v-;`WC>_OhB^OMQV#a85vI$!UIbedtWvr-#%emuFE*y@ZVj5@!a+(Gmq zZ`ApRU>9Xy)YViqt2%~C7mqjPTr{VNlr_rGS05-0$n6FY0`+OVU|}ckvPGd=F3QEX6~34t3ryqIBA#`Md7@ zOdUy%_rwu67WI06FxLY6ksD@_Zya4#@WU}U3HAC7Vo9eNuEve1^Ow^}=Q$oqFZB`B z`8VWBaC{N&x5#(SE-NI>AvVB|7$v9ljrx2={*cZqOqWaQlXwFkp`MRZPCALO4sO7+ z_!#wki}KQ$i5DwMeFfhscU6|-d$D{~sT-nHuD7#UcPEx2XLKdy(%cH-MRcnobu`rZ z>*PM+XZB^(`JG&!lXwT;;78>$*4u=KlzRQo%*U=IM;4Md>ikY_kC#}fnk1T`&c7!Y zk>eGVIzN%)2QgK3Nn}HvKThsGrXXk3d0qFaC7lBpvyRkWsPjk3ox#g^7j-^=Bk2ss z-FOjo{zvt(Xp%UE?tI=c{%HPwJW0647b7cUQX7A?-hX<080#BHQ!l~)bUmFeF@Q^Y<*wltmI*uz*s}$4W1qJh(8k)T?ki z?ngbJJ%e;QVi$6wafY%D`{{^!y=AO(6;m?b2-_%|v5ud`dg-#t8S-GX>{1)!PZHcWf-Tm z)W(F=-l*pX{Ux16xO$w_+wibb&rcjBo!uChd}VB)yi5HE^?Fe!NT(a_BXLHb;&hWA3!YdyJ;MxCFtNjgh# zBW^~WKgjP_jHjv3q0Z|%)h_863sM_(elo|63#pAduj`BaTz(aU9g~Cy>im!D?aw4} z1Jga1x+v=T=j7g@2f2_I`4O*V1>+iOqh4Rvhd)clc#--F>ip6#(lKtL-ikWk?W=T* zgQ8nK+xd1s3zW$xY+Fde$CnOr)XP<(?8yrn*kI-fU@bOzuEJdF3SHuEo&Nd6t_^~NTb&RpD& z=6MA=zb~b9a;Fj-<4)9h^E{`PspZH7e1SS2C%trvVH@m>IVd>{A;r}KTEdk&qH zx==Q8E#@FU30E_>!D4;`b0_gSW@cWWH8ks#!+N+JH{njy^U-rkrv^sICv`*Yj{Q)M zy54qSZW1oZE62iGbgR8_KlfpN<9#p z)RNi{_551q+-k^?^O&Cb`po%S%;zOv6FcG=)aP5nx}VUKb!*{Z9BFaBJN0EnW18ug`FWf-ZChFCO$V`MNAVcH zXE=@eeEFDbghSd(;x6iZ$#&BDhC5hyuf_TyS;rew;~{O8*=CbhkKP26Cmb zD&9qXz7XA{lL%AcK-Brc^ylGn49o4I^C#$6?=DAz_Y^x|RIW!Xi|aFqxr2BPGxyME zk~$atzBma#VK~kc+2VW~*;ngcvff#4?@JccfIZ3S1!*&w|-K0MpsfUU8ipzCmer>^rxWCf9o%uf&;{HgTycRf_=WV*zXhO z+76Vtci5i!N6bC5nD0P-I8MN4D66{O1{*Aw<6$x!h_0kuno55I?nLuAW1YXq?bLCo z92ttXVN$>6dVI0CJ_E@0{7dqQxF4plxIc~{mw&kA#4`mra88qx zC9x)+L4Cf$)1@;8ThEpH0`6KY^?uazN0^H}Lyo+f6VOl8Em?0F>#VX^Z#3&%z{|5` zy@sq~9>+P?V*U8ot6W z7>ad<;Ya*tvHp!EvcB=eQmN0PRIazV=~u@Fc+?_4V42L$#?_c|xob`TmvYdrj16&{ zMSkmQnSP9s*GQcJ{jcq~yl1m?%+KZ!)3Npv(OFb6#)YLoDS%wSmO1%zu;4#$mN13~V1<94i zYUpb*pZ}h$SR6axSJdbGQT;xgBtD@>c&Rg^p6^Zn3ckUQ7Wo1!P#i1cax~9-HP2(E z{he>@%a`?MMUX@D@q3U9y`ss5>39;qq0Y~te-uMTmqcFF`SJClsbQ%FO67X%OD-nItKo2qyk}~eU4W0%NbQ~0wWj||`^ou|Ta6FV zf7WriPB7{4XMk;~-K93K>r~l8>iQ^^>urOOa`_NW4=r`NFk%5uu?$M(dYhDs*>SL& zTo{S2q+EJM!#q#DJ-IFx`E#LU-~sxvua2nKe;ZCZq4;<^$j8|Ui;uU_^k?ESTxF3D z5mDBUiI*cueGBz|=F(q<+i{OY-jDa^RP%o2{kb3Y`jdIT?#GrPB+(vqelh*?*q!%# zKm1po_xoW?5>^taQRlnRpN-Rbf6POj55?_}6)Rx_i`&QCZZA0=F|w=}5B2)zGfKxJ zljx1h)%&md-+4qufbt{y+33pXYO= z(<@26F1@%F-=KM%o}T(EmvlzsIlP5BAGw@#V&j_%Qh!AEic*Kg=$IJOV|FZnB~YKQ z6rY#dVBfHk7>GJ=?)MWoJ{4EtZG4FT;2YHIwdC_cR~#8t5;IZfYw>-Pu?O{EI1#6! zo{!G=M`Pep*}RQ;=_kI=__ML;Ru~&)hVNd0S3d zF)@xHH`XHm?GMQ(<>RelZmFxF-rvWD(uvSWtcJr-=M&Sfhy{EkQ3@w2^?VfO5@LDs zV^HUp(Z7g~@x4XhfcD+%-ecL%ADp`I_tTy<up-{nXxqXKvz;OUEsVo z@m5#q|AVQSGv@9k#|xlTuD9ozyNYiynZ@~ClX58*`Q(@#3!%>E9wVLRI0C1j&c7Hd zo$%wt*jNY)jF)~X)bsl$NaqxKOq4nt7Q^zW=ie}A<9K8&XpuihKjb7?skpKiwNamM z7xTxkB>B#$^P}j`#3WNBQ3I<@mAWqK`SbKWrpb}~%Ffi?QP1yZ{x}vS*V-cApZ+Ke zF+*1T1NHisW=iKCCZ8pBZtRBL@z`uReio&2y^TrE8w+4NbS34|WcrJ+6YDO;{dmOU ze7ok#Iw!H(0;zl944jMl{PEXHr#)WYBDJyQR;fo}>FrWiLaAJD-Pg(GDA<0p)PG}2 z=F(ZrA0l@f2eF@Hn3uUi7W3E0C1AgWusIfCuB65M)?KpS!6xX8eO(6N~(C z`jfHF0ah+HtlupP)VmIYl>P@KUH!!~kdy!jakuPvqRw$2aa3AJ6BFFP%?xRu{ zKz;sM%q_*on3;K~zT7R=8^bzFF&FDK!WYcHMb|Y6 z{8Hjm($9!7&Ptsg^;8?qvl`FiSA5TTzgV2VA=h&m<|o$*qjJ4tSzP~(%zeW6%;mvw z%tf}CuSeh5gu0DI{xf~g%W_M2T@mZyD%^#@`=Q7YHloaEZ#@<(#a7?U}pYf>(yWiA`8W5L z_LBJxsN%NbQ#2w|j-jym7dQ#yTcTUe?8 z2q#v?8mQ-&Fn18&;uq9;_XyGni>a^#R=}F5=TAqG&QpvORcbHP`8kQCa~k(1mO4ig zos_z8Qn3m4!3U_Pb|#a~1FV}|YGd0JQcuNBDW&d%Qn}tfXB{ur*^SMZcO~W0T>3}w zG`6)^e+~Wf_yQ}Z(kn}SFtzv?6Q_|nDL%tbs8`8MzakD%KA?VzdOkHD=hd)39>$e? z92@og33BG|k98-%#Ny*W8w-@gC(OS>y?zrKEpVmTmqorcx!IV5edM#)PsI=ttcp{@ zNNr@9@6;ss7rr3>9=`{y#=dAyI# zN8s~OZtQ@)QRf%)d0;tij3Ei5&aWbO2e*;mi#ne_rgUmxpIB0x*WJ^3zUV0Gr|xT#N5eua}kkRY`2Z{bm#H!Sl$UdA23s>zH28mwq>#r~JhI$b6lu%KfDo zw!zh?*RRHWV;rQ^`I_ABP4O6>v3P&@@qXxzxA0HiFM9pdaimiNd*LwD`PYf0lgL}_ zh67ROza*AUge2lzT#Py&DxGv<eS6qlvx!&fgBA3fz6LNkQ`L$Ig?_EutjUlQ_9UdFt2G-eXv7Su1-d^^R z%eV1*6R8U}b!GftdQQ$f{@_|;Ia+`@|5?Z7AIXnoeT@MlDY&+<$BwwVbb`p@ViD=fnZeWjjL9Y5JIr3_P*uo-To7@dFuaowe zIlcZJaxF*8k;vrQS>*Tg|C(jSO1}Fz@d4`fYmnQEA<1>N$m{t|%cOG>gD;o52I{=7 z&GUFNu8|`jHi~^W>7>+yIKB?e>w3MT)>9?|3@F@J&i zn`nMcZ*Gw{-(L^md^a!>`>lx$@H#$0z5nUVUqBynZSg#s-z(_((acT3uH=uS&L`&m zk^w)(mP9a%`&%h;O>sMZ#oOU!{wcPNAhl7SzdLj5@i}u}uo?4ysOQ@-*A+d;HL%Es z2rDaiqj|o<2I``mw>%!h%c#$vjkz{hiClf$hlefZQ!$qro08jRk>5e?DrO2NJ8Fc> zaV=(KoxB$7yb=5v!Pfh%y0#r$dJuV4jo3oP>Hb)*wUmz{LNK7oNGo*pgf) z+>3`S=7TZkiGPyYVUeF0U-r8gGm*<_kuQ-z@>MZ9IWLQRUveYyWFncrfKs{Mz9;9A zPQ({&Ew8%vi>}!p8t!vDcF$wOpE-{2Re z`ESk)7T5o4WEn7i;`;(4%Y7#+m(2UA6m>;hiEHs7x08|fcg*|Qyx+{voBNpi9<;bn z&{GZ=JMn$iV2kg!ESCA+e$4mD#@E!w_z@*){65HqXXIaE81ivZ=d;t#hsBlcsk@_| zFG#;A*2Oj!`Q?0{_&28G{a+jVMVB*7Kz%-4ALRaW1S?0CL@jKOxAD2M3Fm2ValW;z zYurU`49WL}M!mm{he!i@nQO>vsKV#%fdM8p>q`v?^V#LgW=hyOi#XMi${C`M8evhK3f^)yhgmtiq z#r^Fo*E2KMFLNSUu>sylEcJcV=d0mG9>?Gv)cG#SrSm5a#^LxPg&a3}rj$A&>h%gU z*Ad?`AIc(spWGvShhK3H^Tw6bMt%OR%-z9-n&$4V`oxR?Ud;;=Mw+&GomsMouj zN;=V*A4Pr=>U_K`(iw;D*`=O_I)AgMbnf5_e2dk~%WD%aaSf6C>RcmtoHD=C-e^b}8`doQUYqExQ8+35S= zM4XE@^>0#dY3#?37^05~Qm*JP7gpgm+>PdS0F7Y>N#3Ye?ZVtrd_7PSp_$Wp_W{z$ zhD*t>N1eY$?lmSSR~&tC5H3*a_59e^G`xs+E%s|(m$l+(S*aeH|9@yp-4pxaDEv4^ z=7NnCt71FU`wP2TIx(@R^5PmfZY;1?>VBx#OUQg0OvSu$H1!$O^I4fIfc=zrsFPaE zr`RYf7RG^i248KJ2trS5=k+oTSKdVUN2t7x7d(|WrkSK?aK^DEv- zXBBS8JsAC~95<$*HtO{{Gq)7ukWY#_Kj?#WM&Kz-{ZabGu|DegaG#`8AD81r)cHR? zOQ$^c!+E$9?_lsRk~ix05`U9UPHc(8aWNjnC-?&Odh>bQ@kcDm3oF$|o%adm=4|=l zYy5^f--do?oPhox*Kws<^y zZ2AeYGA_phcmwtM8i$taGZ>48k-8M>{3vqwF%`K&7WonMJv?RI*FZ#XMbQ z-Abs}e@s7nH_3Iz;i&T?>0d>!KV>cx>U(BN(=a z%q2pdUp`chR~aV886MEi)MHW4_Zchs#rSl*)NfJeSCET1PI3>(8Fk)kuH=$pJ?w-% za462gZ1ZI9(*iNtLQ${3n%rshoiDk8xE=3eWY&v;dc77aWxfxtz!UfcBm6D7w3r?B zdh<6*ZUa8rEcG+g`J`Lqcy{#KCUqjz`6~3A;OFgii#IUBDapmcsW=D! zJT1rd`Wv50KleXks%HVcPiiKu{3k8#W8yt)}zlHv8yo1?;%Y0dEjC%eO{X5vyUFO=O&fg>V6vLBifL(Bu#e7~5 zS$`NF#@ndRmpp{zJK!2TggQSlwB#4#ZcnKXpw5R1E5~Ewj&M@%MV)_7KTLSZZHypp z!++)Jhlwb;O_9XysPi2o%ke>2JgU@XQ0E8GpNI{kOTG!}{CxTwuy#zzH$a_VNB;nh zj4k3cB0$xO&@5_Hw{)N%f%3K1}`4QyC<0cGG zJ_-I|F`t`$1$>FGE%H_AFT^wW%pzYSo$S96KE&6kua7VNmN*=5;RlSAUe?v~3o}Z8 z6MAHkIt=Q3N&2-hMGncQMV+rwP>y%T+=ZmBi;b}r>iGu6B|iZF#&xLk6H7>bF_tSO zb!F7~LG&l%-7=DYggT$9tQ^mcp({!q9(BG5{c7l4S@OwI=Y8pSMz5-pPlP((k^Ueo zS6%XzQRg!?kmC(;7A{1c@6$r^^YJjAK%KAIQt~}?nP2EP_5t zz24m+GWQMh@c{1n*d1r$cBNh~%3rdc7Z$|^sPn$`lMa`;Ov=O5_fgOHohNfUvDAF2 zjXK}VLpp77zVbP>(fqyL#i3+w4Q@fb{s893;zwnckTPK`MQyB1T^&Pkp12n0Tg>|A zdEh&lJB638dAxma@?p_D{$8KIX&C94*F!!)Y+SnAO>w0@Ekz7u~<1@SBaEr%lmgR8+GjSCjws<^&dlFecBeuhy=-P=~>XcOM zi$45+_(;_GCn=>9o8x7%wnaX4M#iF*AQ{J*+4zQ&|kbyDhm*#dfm`T-8% z|K&$m{QvwGa(nQAG757AEar2vt)dv&T`t5z+TW?crN($QxLmk{--BFOf*WuLx&0RT zn)2hTtuAgRXVmNSYg`+@4zs0W-&rm8AC7e+qxm*072`LQLNd>ON?$9-sHf1xa{ zkNGu#`Elt4b6?PtxhNL%d|PBQPG-)i_gk3beEVhdqn?1~?{v(f*7Iw)-40_c4@s28 zs#ptsupR34ih4_@KYH?US{BnKljB)Y&re`(4lYr)O(GNKdD41*1^GK@KCd)mE;;8- zV{!fxe4LlV9k|cp(U+`N56P58*K?-pMc5$oP)hsITvS*87AH$-hRO z&raVLN8(hA{D`u$Ld|kw@$zC7+)z#Gttgf2?VQSTxk(jqP*rgxE@p0p#eA;nlCO%l zYD#?{rEn!fc!&zZZSWDxutl9+(nCgU2@Yf9l4%(8E;t3PwFUp--Bm+ zN^LCPOX_MUmFsP}&T_dn?(HJ=5p*TxQX_JsaSK{K-})HGFXKYiU170)GWwOVCl0m9 z-=ZI}tL!f)7D2uL=G~;z8O`Il?*FNiQuidc49}x^-D^GdkmGN0H|rj`kuT6+R%ng$ za5d`ns|}Ej5B3}+^#IiQ7UU-5alDE;|A77*Y{0rrE!KA*C@Vz5!sJR>QRg4hk3Ck7RKj|w^WUaOC(Tr` zA+|xCFEUFyC9yM}z?@s;cz)FLA!bV_Gd9DHsPp~iNM{v3z}KkrA?Haa3pU42sPom9 zNM`_U!2_uCyH`l(1twc5btcsLB7aM#Jub#|sPj#EeBuN=iWgDmFKm!bh>c<{EQUHi zev@>};}btphuEx>Qm@-B#@Hj~J|I>_sa$XU$W6nGcpqI!xwLej=(%6qjOS42$6c1r zE_{LSQRidblTK+oh38S{*F2Wa18n(3>b9u!sa{K`F5bb1sPoxFNM|HYP?iZP#~;XoXNosJ4AdazEFNK@r^I#dQje5TYXmrE4XoSTHu`CCFix|`XP{pVd*T3#d`5n5^u=5F4E286(I1B=@Ph&tIW$d`=y?nk1888r1WJ=^Lw4cf;X05%v6L`o`nb zFVMZZOoT-}UzWbHA$5P8h_g}8zol;sQ$rG|F)x-!J%5$H@db70nvzV9Sy0c9qiFZx-q0XDP9KcgR| zj;xdy3!z^BANu+0%8`dkouA6_b$Au;pw3UPC!KpZyuQ>^P%78k{Pb&L9~^9vAJIT& z&tuPqQujmG%5o_q{ZiNtyISP`rtjWJ=9l6+)a%!!-vwvl0*m}R`f+?@rJ`v59;06W zFvmY*ZC^>WK%MubpBgJ-4U7Ct`X@1CV_C5v>h*7sGk=FMIk|Ke`G)kz;u~~tqF0uB z4#)T4V||^ zZgdf1^%|bJz0T{izvudX?&Etr|2=>Fava%n&g=cU-q$tv)EzrBO@}FO_zpe*E{Ch2 zy`O@^HDVZv*M}qEXlTz*&A#%(mawhMehZFbJ@`6o1V_X1&|a_nXpPi^!{BIW=NFCD z$gl7wd;;zKqzM{%3eD>+h6%jR@&MZNBR|zhD_DkHP1pjqahYF`*FoCDbko%@CoEvm zUO(zHjf{j#;J47u$1;8fCY`NBMrh|F7_SaH!M-l}B6HN?Z8!gR;b*<=5+Ue>j}nD3^TW z4a)mr;Ai=~UE(Tu7`CO)2QK~0=YuY!-9j1XMNg z=f8|cZq`^Q*c~P&b?O|)HPf&1DzG86^X2wyq$8XJ=RrH)>##-)KfpJ_s3WR>2<`cM z$Qd5MGmTnt+J0;Hq?f!WgZvsDnAG_qIF}?*}fVW)ov(9M69q>9#d)D5G zyby7ap_m|rslVSv*99WuiqkFk{3gt!u`CDH4T3#lP9O@1)x2@x?gqkzRN;= z$pE0?gK1`2x_+5BNa!DKOVSd46c;?+j8s<458*)5Ra4ov%1V^@cEx_aPpfrt!aE zM2x)r3^5AY{RYry92`4E`PuaS8g7L-=~LFF-%0x99I8H<$z^xRj~b@jcknp81nvEP zJzV)MaPI{9iBH8FFzZD5J&t20m-Q!(RPJlI7aoT8`U^i+{vb>~N?r)s`Thabm%*d( zG_>=}>9YnN7^C?|p`G7E?mB!3laJOsJD-;E9PkJFZgA<}o$&>58H{zwzxs*RZ3^Fk zJ)pgx9^;fB3fIC-a5uaQ?fLf^FF2lcVQ*;XGkm6;VK)3d_!msc`*7{~?^8GIkH^A4 z;ALpfUpP zI`C~c8~%^^jGOlj|BXL#$*0_@{^em?*cICSU)iU8LpTA>f_8rQZ_3|=#ebJqgm%6% z4!?29-;7tkR}YFUUwR-V`QtFzNqJ^y=kJ*DQ_3|vEw+JnJ{7qNumkJ`?R3b#3@^jGF8ODSmpr5M*$Q@o_Wp-)oWF*Lp*N)YcE0dAjkkm& z;Y4WXuQHzfyyp2}V`%5wUsY~0JPt2GJO9sh<%`@9|AI;Wk!QB}J-!9n{Vrun`eG<0 z?=M~mm%=sh9<=8_V7w52VBZ3EG=Fe!O*qAPTHc@B8g_xzkxr(t;JP83NOOHpxw{*Q^_=P zAEr+(F97X)rqmkg3~Qy4*MoL`ALB=1^>j+~f_6S@T8-3#e%Kq@`2geJ!r$OAm;4FF zQ?q_ySjA;O=6g_MsqcrUT=ESvX@?)d_3&r-KlYzhBgf#UIpkBJoj;ySBV}@nC0-RH zp`HJc@on%Ii`nvNMlER1pOr@=LAb(V3$N+{C` z-@zl$&L_*Dk+jeY+rjQ|Ftq2V;(C}3R)CFROE?oQf?vX4`Mak>(C&YP+x z!pYEM{r4gMg&F65)C)^N^Zw@v+;1*&xqp2pi5d-nW8qwAzQ3uz%lvQ2@pQ`bPcrpO z$Nhg!xDvLePiL2Y7wKmne)H3>348~d@6k1nA8)(#Gau_=K90eBjKC*JwNLZ5buWEO z(Z}b~?>y%tB8BERPbrRo6QTJ&?ws@~;nMGQ`gDdL!6ooJ*o3}MxqLIZ^y`pH`MT0_J=|k4F{xAAc-+|uk6N_zZ{^jzj7M+5Kgpc=T}p&QC^k)^!>!8|C_CpYYhFcJN%}N>aoyXZxXrX@G!g& zpTbIHGCi1{SGl+@;z0S zwG(@^x0CW|jHl}$?+yFIfJM7Yvo0F>70&1?p9AguLB{KKQ)M+=1MU2{;TpLGtBsV` zf_A?Ac#Rm=!CS-QF{+=LF8*WjG5#Fd{qNJKzywt?%@DIgJKu=h=P)(73@-WDiR!Qe zzBNg1X!q|uRU^aTT(|&wrm5Zwj)se&-R}$LJ%UNtXG)j-o~2JYj_Vzc+e4S*w{WIb zOf^e9&fgJ*T>jpuGP#=YUDzIOg9Vsh9yWF9XWrMfo_UAJ{ppg=J6rqo!6vW=+&@qC zKcFn}=gB!bU3#t_*pp6?54WYQPn53ubL`9wGuYBcfZPfK;$ejnS)Wg0&Odw(ha9DW58JLy!x z6=H4J8omeZ{2In@!RIjf*LG6AjPXP8yu~Z{b!c~~vr;3Y;50Z3+IgOqcp@oOv-k(@ z^5+|#>O9Zw4CleK@Mv;1Fr?joU_RGl0lB5{ApB3z<%D^@ZfKsjcS!T!CrspZl36eg zo`e6w=g{sloZn-|LG!($NAY{`0kr2o%&3v1nZz=%IqVNVfcE^TEE;(a{swQrOfRXP z725M(dztxgD4YQ8{F+xZV!n?wWiEMEXy^YoPspppW7xQWycM+PZzFdDn$P<%wDbKL zSPhTEYjzNSE2&O&grm6LZHDH0d(P$h*eJE;H-nwH-gR-g{v}PTd~#?$&&uuloA+_K zrseXi02{bmzLT@6zu_#rdp3;^fIDHu>>A$K*P zdWq{%a$Y}7XE8Tk7*2(sL3{nIuWF$wD&2iZSXK`H2x2jo(4|CSl%fOh{a^hwJ5rAxxD zupb-&?fK?=reERyEL#pG3P3w=-gn%Je2Du!!;H*($z}dk=G}s6m|qpz>-l-y>H-JD zsqjyDAKLTtc{Nf9R)I}ne>e?#tp6S`o-dyY=Jl}yxE1%zEU1w$;J0uMwDa4FXykWz z9G-=C{%~=P+=q|L$j$3Qm8!{WLwkPDk{U6bil2jhxnJG@cUxRmRr6z^-9OuF8fgLt z!@DqLY1LE1Kj?GLrC$|thOO})us{3?K7}cGJjn#>z-AWXSob%V^~aFk0C&Sf&_4gq z7_Z3X(h;75|5z->eRH_;w-q- zVk~ZG&p%K7F3eI_i9xV8>kf8VeVfaW3m;VY~*c z2j6zdXKSqWYr%%F6}0zzjq$tinMFIlr;SEZv=y`Qda`+cyq$lei$>mp{Vm%05wucz6LHF5)%>$P@%Ip^~POwaku>~elz<#C}2 z{1}ddcK;`gzm{1QKkNtxzjbIeC^T!xZ?N#Myo$> zu7~#gPPdf%0M55)=a=45{tkTQt~?*K^V=V)9uKoVk{gc4CqsLFfuy?O^@2;`YG~)L zCsE!@eJ$MLl3$!!`D-v!8u`o6?%$o<0+^57YcBcSY1J=FIU0xU3`I+Rdz|~chPvesRhg^1Y zKDZLv{fkyrzbf#P>T*Ln|1P=j;Gfl$ufaS!KcR-|li)d@JWWl}&VNsCEu2AqIkfX% z(dQ?axt{tO+WEi9)u^Rh>$>7jXy==g8w^8lD&Nv2KbqVO_$T>O(C$B<++LWU+-#S8 z%KBPAKfG(v?*CT<<&!lOJ6p8#Z5t`~0sP*gop0Gp`O$DI+z0La;pWO4zSKf)7~4i} zXwPrnQgy@5csFS0TfC$Ea+s#0JObMJk)2eZ0$X>M_lI`AU^mr^!1AyPJZJG1ejnQX z61u8iKI)g@KQ8&!(aLv(;|Iut(C)wP1J!TBr!dKf8n^S$hG;zJP_ePaS@;5I&yO6T zdEH?@izD#ya2i|;?S92Zs$Wm|2mBk_`PS2w9|HT$mVW~6{FFJWuY|+r%KyWq^3iZ2 zoDc1O6`B7b{MceY=6wjqTD1F(XZ}~PJoyH&8EgaX`3)Cp|LtL>FXUOFo$o?!Fnk_V zKDkT27~@^x_i&v{{>!!Mw;7gLCpWbB^UVR(*TDT2YaUenUHE}TyWc_P{|O_==Yr+n z>(HJ*@^7tYI0l~ykHAyVo}cBq=4XYuVKF!kPJ;IQbhkCX4D4dD-(A%wz*+D|xD)Pz zcK>zvG=CR-0G~oTKlOp~vGB=5xuKo!`AGHAu>TYJAZX`LCD#j)m!T)Myf(D+QM^#w z3T}iCTwcJ<6rp}aVNKW)4$PwZ2si=8Kzsd8%)xCl24`jkHf?S6B}8-9UrfM3+q{1woiKbhPt*nxExxU6@(zWP0e zk-VY(P4mWfYk{l{m9GT{zyP%3p2JbfCut^@fR&(~@7!FuUT`mb0`2_TcFJ#udo4a_ zuX@Q2qCNk2^2x~k1aHEQ%8N;fWsd96iOt&=2kTGnw}T z9Kie`(9VA!t-fbr*8XxYwDWa7RJ}9&0FH$dN2opn&bMgyo5H-s@FViWp`EWbQ2qPE zVZ-H>$v1)nT;?BOUa~=&mwA}@4(v(4zR+I31354CQm~6l{#VvH3XcrcdZ(e?e=Hvq z5d)VEQGPYF^Zf^_J{lGwSIQ;-&S>TPz%g(GwEN$guKa!Y@(g)iIAV!>BDCi}WL^&P zbIGl7$(JP85_Tjv*dT#T27Kf`@4`6`SzgB#%vmwd9{wcp0@ zvjg(e@D{ue?ei0iSAGrr`=mSp+WBN5)yu%{a459%EiWnmF5GVM##Pk~Q~o74%!nJ> z{Wnv;2EErbza+Ht!JDe@hp#2bUx#*n6XOSA+->Cz?fl>5p1|egzk_z(%XoG8rA0g6 zm-;vu17|=xKkKgcyA;;HCvOPtyyt=H`Qg?_@}1DmPbIemzE7@?OTHlEZ$Lln zMCEJ2LMl z_$zGAJUc&?@vq=Ei*~+2l=jmcMz@fUg^MiO^E)wb3p@zhHB%ouKa254Fhg_Y=0H0i zWc)g;%YM4R&*5rl&tKeC{a3>Q-Q*LYo!?FFC~Qftk4xU)L;VK832+*;`=1`7e5Rpd zF1QDtg~^7gZqMI6Qsal<%K>>!Xy<=n{4nf0TKNUg&JP=_`sZ*R+yw3X=?ThTf!|J* zhoGHrG*R_cuH>H}eMa%Eley?#*s3%C+)g}dP%Xs`FnPnv%mR$DKx z3+;TLO{%BgELMe`p`Gu__zbuT-iE(!Q6EEl{sVF|$t{4pp`92EuW$aGd5DZ1p`B07`i7ZtLp%TJMfINtxBn$KT=TcwaQbz*;buG@+WkLc+;Ann)+K-C zvid)U-PzA@X!mcz@%6*CS2cexwDV)gO@|A~#k%D0v2N;X>Kn!J=mPEjZ*ciW!QpTe zwDSdSsc$*>7VHG=eEWyW_ke?80Db}|Lwmj_mHtpY4Xl${J_y?RovBqfyb>Y54()u( zG^)Q0-_9WK3+?<5X;uFT#=%|i`*f zTKQUVI-CuyxFHqdpzB+HP$=yd@2HNYzkXr|nl1u55|C;e@aMA$v{}S5$OAb`M4;(g3{x!7o8_3;) zlZPlj58CJGAp%hpPS!?9D!gxa?=nNafGKyPwE2juq|x56D&fSoHf7Ezocx0121nqq4 z4XRg!z2RVJ=ZkDs{%tr3&VhD*3FGlFGShy69qt7I``iSy-q22!;{gX0(H1iDYd~R|@;0TL$z8Lkvur~ciKs#Ugxb|yU z4<8M$z!WExv**vGejY9*ch)8U)hYG40PCNY_k?!;yX0z9-*i^_o6yd0yrB9+nB<~7 z1GMwoZ>xR|-h(CXXnfWKaSgQRH+!slN0{)E-e7tc+WFj1l+O?S@GN`^%RE)ip8qc6 zz2MahTJJiv^B4YApBc}@`^l7VkeoNd+7m3F^IY>%dz8-!--Nr8X#4?8o>ZO&TJ8Ra zzDJ)YFcp2W!5BCf2H_THH!Ph}>vx8eQ_KH=$I{48Lwo)Sae{2@zHo`;PE-tv-K6a4X2UCy>z(w$Pm-(f0YQ6X2f|unXI3|~T0<`!0 zIr9#|?98hR2QqJ{%lznq>i+>84oATa7I))@_I`ZS`@l_bC$#e&>S_IGxV^bNc?;3b ze@SjLtldnxcF@jWCHDv}<^xwxLp%SFJ}KBoD>x0>`DuQwzYIQy={x@S{cq=u{?Xl3 zpAF-o-G5kj<&yUhGr(N14r~lt!XD7>*R!ws41_uR%in-@zSm&Y=fT25<*lKeKQ>a@|2&7c0Mvj3v5+4MA z=W{HMxO|?)O>%}$aWDDZ(Czb2#_+iyE1>yY%iMfUlD*&Y3@nA;Slo*n-oS4|8|M37 z%=fj#u>V(G&Tm>i2gJ~P&Dl)GZ^NndvDaJ2=d--d`RxN!yPV&T8BfONLsf(aT|O_W z7oQVlK96?}ZaAIKo0tvl{T(N@oW+T(GtFhazVy8d8#DhA zwD&h(AIISN3GTKyhIJ;mte1rRcz700)Y}&9NoiQ! z;&Apg%4L7U_?(mHur>3OyL_I>QpV%p0gD4!XQ<11>B+}H^ZB4NT|N)A8lNlr4(w^M zFYA2ZvffwpEzZ2ru(ZqPubgK52D}e5@%bzD_*@mk?yTF}W&KLbH>`{AgCFsE&b3_T zKV#jDteXo~gdbaMOP}^G{i@N=unYb-jHTZ|_GMq+=JRauIeZ zEnfuf{Lx5_@`r__K6VovscCx0J7diAkMm86~cUG0o+FK|7zdg+|K3 zTJ-JZ(tj1XoiIN+pG*EK<7wX3I(6ELgP^^iDeq|{7S3rWUk>ej8piX&g0Q?xzEXR2 zcn|jJARi6w{-qd?g73m!F8O(kZ-!0%>ev~|5`V^#OGZ5xYz#fte}}qjphOR`QZMl= zwBnwZdTOK^yat~`JAYuLMoz(-FxAI)Qr>f{I1%n0FTVxtSu4r?2IrIe*(INToH~?( z@4?>C?jM|@k=5`FybtaC{An5q!rgE`JPc1ldwz=;jdXy8r^{c16=8K~&!5V?+3*+) z!AtN4wCBIOP$NTO+~@M0Ci#*WyPWUH$1npVt zlWOEDteQ+d4!)XE&c_RQR^o;&GpYVAlqLTBhrX}VZ!z<~giV;&+-1J`KGjyq)$=R3 z8rEQ59hdoQ$o&hmq)?yP(7a9lG5bl}xlSD=mjJ7z)OZg#4yH||@thW~(AVYT0X(=BTn(rCu&%7Yq0nPUSwdHk%jxMh+lpt@um!k=}mhd?HIODRP zW#kOM!5_l1X>^=+!7cRJ;nFX4Hs#C0O8kCV9jco6(|q6Qqv9GnT|zt$6O%f1xx84i zf>@%8SQ*L^f4)>%rwv=+)8Qhx1SZbZsV4Lt4QIi{F6({8_z8FmK61&g;P;ZXa9UNZ zYiRE$BfqEQfnCWP+W8&i%;);ABX2&p+0K`*p^>*>SJ(sghXdh5ILD`XU%;OH-t$>K z#-S|n=Wud!;A$8PH^43M2pm{TJwAqwYs<&8&P~F1KjD7hnzJzreTasDB4o z{7v}~)*0)vUU_nrU;~TI@m8=Wya%7deRZ{7FV^|UWxZi7l{4Ic8*ayUL!}dcPT=>h z`7l6k9o%Md4{n&^ZS_hI6FcivkiLemGyg;Q048&p|1!VF)qn})??HRLK^-+R3{HYy zLOb8`1C6wYfr)a%DR>;*W$`L*_||02Zwc-7YLGV^iW`o>CqR3C7xrmbhulYSlEwP$ zqlwFY-Z$qPW?_C+_&W3Iy3D^2&<+h>9VIs`gcpbQ`MESqBmcmw0r@NB3s@|Lmxh}s zDZd@c5`W&Mui?6YY9aV7^ESH7zxs*thWW?J4U6NYp{j{L2e8j!@CNYhMVYr3HD>&FqipL#%r&Jzu<=P_#ZIwoat16eVX5|XOJ_$FaM4k9>Y(- ztnBM$m;J@i-_Xyzi7+MevbfCO{i*h8=;3;8m>SPu#;r5>$^;FV?_2(re*eOh%rlI@ z4Xd-S+AjMmMt{S3^xX*~nOD_i{!X61Ux7C*mP@Ano9Fk|+57*j-n^Pp4Q|RW-v{l6 zZ&%dFWZ0^bd^oi8(;2@EtMELnjmz^jd;b6CulH4=6-+Wfo&nnPOZU@AEx5S9d?mE= zB?f6^I2<`tJ`dXY_lIkwKRgB>LOcJ)2#wT*Z*cqX0`2@hULX4#ru$fl_o1C17|_UU zXznkwx%8jU_?NKwXw7c~Wr;r*F#Z*+GDfvdFfpl9&lpd`{n@o~8qdt_-_D!+(-z!s zybtHY?99vMGCvRfeXung5AF4`MQEfLtPcCbxo{1%=da4Fk@K)n7I|@K=VxToi23)% zoB8DT;dA(QetV|8TXr!9PRJoQ-_zPLr+grkCH^dwN2lAvj;t4i%i$%MI8&$g78M&7 z6Fb8Mn6kLWb3s|+&nhK!dJ{YXJC@Y=M{qJsoT*c7%85ha7cg^qJ1O7F_bh{29#8<8U!(&p*nzVZ>x53c#^b<&&X3Kj}1$7&gS)z@=~{ zwC6`m*GNhD3?`dlC*{90eiA;1DQEuo{AtD$VDs6^wT1Sq9CI{M2u8z?pq)=OS0jcY z{3+Z&PxZslp5J=DMhq9>-@pU#D75DfTA&fb)p#7tzgYER(4N19alx!0 zY>69o!3|g7hU;;|l6=9S;hC3{yx5E372I(2E2{5?_Qu=L-w&&h8{v{)MQ#mDV7>A# z`R44mJ?vxgGv*(M_Wpivtod#@B?(%BT&QI&D`WAQ-rs|_{JD<9r#YZV>G`Td=4vqqH#NK`=y!6C7&f$fYad9xf;(o@4xqJuu$Wp;mIZPSC)$TU_JD~aZ@XIOeq!Kd&GxEtE} zZS^%0f_LFlc$CZGy36I!IZE??f+?EG(?ff`Kx>VB3(vso(9RF*rjc22i^b$URX4me zP@VwoeocpHq%DlLXy?lf)yV5`D4YzJ!l%%lzi+fgLeMjY1T1CoUEJ_f-0&ydaP?UA zGh91PZdhQv-0;H*a>L`e;XT~2^hD(iYvP7cxM3UIusd$p4>uf%8;-*bKf?_d;X$a~ zCH{=yc;tiiEG8y(>J;bqHY`iuN-q5$Gj9G}vEMZHF8?TQU zn%B(?-=C$t;c(ng)x@78c^z;LOv8Q+6O%eMpWKfyA9=%{*#9oR|Ac+m-vDUm zH!jl1VR#+hfp*@zK_gXQYuFLmdGq&&=6=6LG9}FWAMJekv>Is)&HLnf;L#TA@wnXB z)$!|e>{r~I#_Xzy|=m;bY?jmfSKue`SUdq=kEaZuE9d;h;kofWcv(Ci zua6(Y+v6epL;NZ}5l_H__(Oah?zyM){~MkfKaWS?&eL9Jzd3Q|wDZ3gFNhb#U&kZy zD7-S>4fo;0@%s1-JPKcdx52mKe*6gD1HXnxI1m&7OFweT3c4L%p| ziwE&f@D=!cJQk0|*WzkMT%6B8B!}883|c@Tzz)Yo+it&Esj}c=%NOOP&}0 z9v+=pKA5~eM){F=Tz~llZB9_}3VvicpvWAG#?SsyQmhww&tbcE*jH+g)H z$>UpaFZ(}_2lHzFzmA6=;se9=dY$vOea9!@MH~RsRn6my++ngVays zfugG4!Q+d|GlZ`@&hZJBkQZ}2oyQYh@vRrf*M|r2mUs;AJneMyL3|7zi!a9G@SpH_ zd_Nw-&pIAnIZ##mxk){NdW!H`&U&6o+Fx$R!+BqI<%>9;-s1@s)a%ui91mZg{ak+< z;L*7Au@X)_fcJ4c+%IZP`WNSa3?8{bJ{ON(D_@0scF4Dz{7(4^JhVxE2altkKD^f# z>#b8gKOW2aRqzt>{_+{1G;jvfbgK$6jNq7SJuZ&++e!H3fm;5*$zgK=0kGd$oi+kVK z{fQ@|_8&T~dW7TQ%OHa5Pk!og2UIVM`{L!b@Zec_QSoN)V+%frn;|JyEaX;tJ`S#Wq*C)<@(oFK0J<4ZuJbeDWoc|Kk z1G`nPg2(Hwoeg+TWcZ~n7ddBcC0M7aMUY9$6miXd$;C1le7S&tg(ae9}@$i1)3hDmiW5>hy z4>8<7Ovi)xQal!4i^t)=I3C_lWE~xkc*n#22NzX;=Tp|5dPJ#Q;h$k5ti9{g5*0FRq4zl-~)%3pa&>-+h4*4nslq3ZABabx8(@aPHh4S3)S`AIyu zO8yLwSR~JvRqKWD`gl}O^?s(lSUv*}ej?w9`zOn<;&C1wuMFXr(VgQN^-T3LcuYRk zTbX)J`A9sFRlXeey(-_2N2ZZKHuc={{Nb1DUtFJ_YQ08ybQ0AE;gLV8zQE)+$#>xX zE%M8FJf0zk`bTb6y#gMHmAAp;evywi^}X^ncto81H17Xd9ufZMDrf(mWAYlfce}g? z9>PDvV-Kjl)6|d1AL5?#^5QSkf2X_+9<@(C7LWc_z6p<{|4rP#U-g2oa6C@RTj25c zGGY4$9<>#Dm-$E zd>0tzf7Go7=as5_cp7Wd;(cpUD0{8Gm7b4*{F#?Gba8Si-bIh=1o z(-*#!e8fie+v<4u@yOFo&*#oj_i_73{i@cFD5~>U!SQfDR7Ux>_*HzkuhNIoxwb^BXuGUhh1QU!5EepI<-c zcevx>;}JJO$72rl0QGfv5dY0_XT7{y?=l|Z@_R-;j(pC%^q;K$JS-q;qQ;)>`9?frz zd+saW!}0L`!cXX5^c#am;EQoDzQJ+l_`Id#^Cuo`Ais-8zAn#_PxKpOkMfo{A>XJNtLCyEz74Z07syD|I@Lndr zTlF!x7hjA=;Op_YKa~Fi_nnjfgZuH6g|wdp^7-%p^*36lVQ&#uSo+8?B43}R)JPvP+ z$KnG_p8b4m^1o_7QymXq-!B$y_TqR1seAXSz8?4Qk;mf+9G`#i5c#A;4>hV`pkHP&{O2u{!*%ED5m`+;IHD*_-lAXY2|AvhUKRJAP`xAWIVt}HkEFgF53t^EcpQEc58_!$XuZgF>Q^53{3LIIhc?Ok;9lyJ z%zXSyJnEqGJI#Fj7#?v>^_z}|kLP;szq6Lqe*C9ZFYS1^zJk|h+fa}HMfCxA@RWQC z`Ss-2QIFlOdc5Q5!j~WSHy5aT-{`Foh3uax!^`d#(P#xKg7Iv(EN9`-+gdi1}l zkEcH2Up+ppq#pT~>f5N#rGB1z0>|eu^<(t+zQ%seYkoz?!|NYozwb~_;PvNz)UPss z2K9KZKT8}>@9|vb`u!92xTEU-oAE>PtB!}S-*I~zy}159#QixMzwk7rRrlwVzv6g! ze*tbEW$+lhJ|4vVcr5-A9*0lGc|<(-W$lMgVyLO#m)DtV0K;mhL+m&X#v!$&rHqK^MQJb>TD zBc`dIvyAcyW92^FGfw_K9-JVbiu-5DWAT_7^50B-f&6b%|6HD;Ec>Hg01x2R@YvPL zx5g8`mJh+>R>>FQkzdN!;?XPQ2hDuycX02gs%I{z{RBUem&Ri_K6UWu*{Zk26Yyb< zhwmSvxqp~WJw8_XRe0PF@?Y>E=jV*$X~WOgd3tBbUb{04jpRr;`VuldVu;vJO+2(?&_=`#GQ{} zay%BVi^t)9JRTp4hwxdBhgXi^czuIMay)k639qJqvA+v=FuOcOMa_@OAuoi-QhyWo zWmUb8$-gZB43Eww--P?ApTi^Q_Z&}Py;mz~{g`x`Uk(ptkT=33@y;fnQT0KNhcEBA z^37hHzsb}CoZp3bRD|;1lK+eA$4*m!N%cP+4_}_~-2eWAdk*XJ%}`nUO~|BtAv`*Z zycQmlS>Dm{a6kVg%^!{j&&ucEfqIQ!?Eh=W!?%wBw~sxJhbz7xv%RRFzym+YuQ?t* z|JOJ_aG(euGqt7v}2RC#qghJx29|cnH64^3zpM`?}Wi&XAYD zgLnfxVy5c-OdX$&M~+qfOUJ{;c>&|KbZOm z`7d}7KZW}~RQ*2g-6GHE(|&?0<)!h21bH3Y^O5{LJYuALAnyB4KGit+j z509HGpN9Kq%U9tsU&`b0_%ZT-jE|FNs-^YgxID_?v3N^7^r`YAaNh*^660UUcj5kT zNQQ&+)(%`9?g7 z{)h0$6{_FF{j23^>V(%1Up{^=pQ4V3_Y?eE_y6@A4_`hxxqo`k@$kygw={pa<4MD> zm+-M$BMHO_qJWAmK#Jk&qJ<9=2?h{x}e@4|f# zi+20jYPp;#ep}zVbV}4D? z!^hK`UiFUD_dL__nMOVOCDnhRUYY(E9CvQ7TpyA(P`}8B+D{(G!{?_y`FhkN9;x1q zdK>C9seA9J{tfjW)DJoyUau(YUB)BvCys~je|m6#^Gd_8hp*28uFs_$5AVm5O~3y& zz`b}^+=q|CgWZ&089=}2Px_E4yyp7}OJ)VC!|9$YA_*loo=Qn}hPZlyis&=Lq=XWEX&`^HH@pR$) zL!RH=!YgzAOWRcYi>{}93EW>_UKJ13l)r@sYsot~9^P*P`y1?dcs(Eer{MMRRm}G> ze;4j8qRT&o2k@kCX@8-Tsu#ec3dw7lI^GJ8EUJ1p$HV)(#r}p-kD)%(@$m7S!1ZT? zncqR@?<5}ENPge(@cE17cxH-{$KfUMc)XtD;Y%jaO!GV9KKc(LAI0&RfVaUHkPo)e z{B?L#TloPzrmOrs^FyqkyqWfwfEUI+mEU@CeW``}S??Xk!i53m;p2CkQ&dyYwgEZUiI9Lrw!kqo974A z0~J)SiN{rxzvFoL_*LfkjiMeJsQNtW^{H>8?q&WV+{5v>;&}M@KH&I0XTF!?`%0T| zJ^Xwl(7y4D`FZ^rcr&a$IPrz^D{^P1= zYODTHr{tw^5BUao@SN)JKbv}8`8nKsRsEjfo*JrWe@FWX zP%n>%@D{lLFU=oh>iB#-rm^~M#^Wl<|G>Sia~n#(fVESI4NkG?KX-k!_* zxjYh&Os@6Y<8ilC{}hk7D_@7lr&azO?#m$0*g^f{x+`B3_e_uvz~h(5mzjDy`9VC` zO`hDZevw_}6>;BGd2dtyOui8J%$Fa;gA3(JI;vlAio6OQwOZaDkKQUDi$~m-$KtUM zZy&8Xtm(=IeO=h{q0>-@s!g$_sbadcJA$4tT^y zc>s@nsQoU%y^rO)asM{$_XZxhU7o3n`bSf*fXCyl@i=@e9^m@?1s=q=;r?ste+Bp6 zkf-d*`FSiag!@xzzjg80zg6#o2UDv42_8@WD?A~yj>m7fpWF9cQ_rY+o^Dz{K0@9Q z4{^Nu82?x6&A{WHD8JA6BYD#9>gRnduY!BXN8_ZRoAd#GQaxV$DF z(@;JD_qCI+!lQG@&*Bk${#4GM>@Q07`glwm`C#1NO1>J8>PA02`kszQ>i5+z0WXIK z<5h2idr!+h#{DZx0lw7{8#=u9(*cqg@>NWKf+_4%NOE4 zd>iif=&O2re*=%B-U0XSRQ+Q-0{_PGG~wru{Cm@OyfXeL zJ{P}%ufUV_(fY9$b$(vLLucis@QAVJy)o{3G9c*6fZr|vzZdX9eDUjQ%VczFMTsJC9^>);XmKH3HM;zRIAd=Boz zf5M~i{f>t_M_$+ZS8@Ml?LT?6>JdBTh4J8Cd22lW7x@f4dY60+9=k>UJ03MiehUwM zqvMyhzt#(JeRu`;U)27pIiB9*dBpSM=F}6es6Nc`@a5&@_|7%+ztei_jjxd(#G^NB z{zW`?tNalj-&Fg{Izao2TBZ3_91pMOW4%_?BR^EV4<6$3oQMawzAVF|4`{uec<_?u zU&SNV$&-Dc^FNr^KVNb@eEIpmP`w}?c&L8WjSo@1Gaj)_{vqyJE+32gxj$ZL=2Ksd zhgK^8yP41NxNMyB`v8yZr+mo|wO?N^c}Luje}>2QRei7H;p6M)_+F(R@qy}3jqlU> z%{oy1)B*WeTR{Dj}|NPeHY zi2LxT_$2aK2dUp=yd*vauY*T1|2^D~e~5p`=NC-IH#2`3o|@NpHsL|)hw-WS-*|oA zf1d0k?Jt`3a^V5I93F!=!hO9fy|{nsjK|@_@F4k__%zmEiN{jk?znUNy{-Gl<9O(d z{1)yzD^D|6`5>MT_k>ih;&}M-i=%%ObwBkUcpM(Uz2`K4E*`*R@esZT_nlWhga`45 zxaWfE5ks_JKVB4%!+nm2_Z!cCTT}O5)ck&U03VNs@XvAICFOs@gZKg5b6NE(xF3Ix z$Kg4KhWF##et3K@jj!k5N9s8q-fxKgwx`~P{2=O4T)(E^G3NS8K8}7{91maq0dDV? z91mZ!q7Li!oNSmp$n%MOcsyPkkHb6TzIe?ah9_`;JInF#dO_A(OFfdulRq5~KmJDZ z_ri}H4?q6w;r){l!^0jv|2et6mBQni>Gsgr@$ml5=QZ@eBX;WVWhR*VFY+Jpggx>j zxMzp_9v<2%&o_epk=b9|{u<%2ugQnt!BX=1rk+&38IQ~@zl_JHlV=#I{xR3IUNte-RH&r2oh2A2nWH+4ux`XFT##`BdD){0(?;o9dVG*zNMH z0rijADX)YF@y@2cRrSeu%oh1t-21cqq?wPW8>RmK-Ktl_L;G}o{dj=mKgsd%^~ulk zukWZw|E~N2>e1A1Q;#dD{<%hLy~ttm%D6wDyuER+{1ZHMNd1@NQ8iRQf+xhQ{uK9q zth#rM){Dn$Sv8}{dnSd`20NK{A3=d{UnS~z8LO_lGnzgM$0?k z5o_h6@W49xQd9p)z6%fHS8(5Y)zggE`XRgo9=$>JCb(y#ydNIKr{nRLb$R@V`_9Ub z;ITP0|0eDwpJ9U551v!LBmyc(X9>1KAQFPpkFTj2HFSsB7$MNv>DT>=u zhEG{RM&9=<+J;P-fUfS_A;m2$K ze%1N@YsMcj|Sg~#DNaPKYU zN8tf{J|4n5GjmPl#_0aL~?K`wrx6iE8@mF;FDueqL z=-)5fUesO z=P8eO0msAFS1K_ ztK-i74VULtJPuDWOZ5<*ANL&5QC_)JkM;c7vW<)JXk~C75CPZPc(J% zt8iZ})eqotGxAZmcc6TknO|1@Hk$e6{4!oKpTQ?!liq9$qhw^>Qtc$Kz!k4_^}^ z{?z|AJsekH)THl{n?!|rg zm9K?I-IBLAep@~gkG&}m;+}i*jd;Ro`6=9wKXE*Kd_o+LJd3oSxPO$dj(hNT@tC`+ z55WV&i-W{cOG{`{r`V_>}xreib7*wLdTjd4H3$6 zRD_BVvK1#=LQIPym4lR0nHF0rCzXVlq$0{mlu(VWd=R5lNc?85=VNZS@9pQ0ZryLs z*L$7i%yq7FU039AzXJB_E^M^uo_9Zakb0BrcV6W1_1U>g@9(U@Mge(C?6UHq$l>e9 zV%|@_7&$!uE^z)`=_+^0n??@%@BMePyzx_bF3$rauu1<<-~{8lagNtui~60|#wW0Y zi@v7uU0fA=xHa~1ugLkr>yhj8A)Li8Vz;oahmRwN`<-BabL7cO^m*QYv5{Y{{JQ$j z6_-2UWT4Nx4aNQ+@?4xLqWaZ1TU7oD+yAP*$Q$b4I4jr2_G!5@_Rh%X0XJRg^QQ}r&c9XVh4{kRgE@AZ+x^W`Gv%N>#PhdIZ047TtroWjeo zjlYZ>_HP&0d=KCp{wH!cp27Q@r5A+`*JEP8ORr@qqs+F&2|r9Mgh1LV1_s(&nU z*nd9ye~H|vUp?$KJdbc{m;4J(zai&etnvM83$9j>Ah4;4tUGnZHH&LJ3s`@^WONJlk z=Kk{ldC*?@Q`qV*FT-97c`Hs{EB}hK9N+v|%`Z1h`Bm6#DYuLq?q`bq>P2o1Rz4O7 z++XHl`!410;p7ncYn-@8J{GsXO)mbP=96qH*NPmDZ!^9{ZhWr%4xIf=9u+yRKFf)R>|LCW4ZiC?6>6dD>XlNk=zXD-jwgeiPiFG?BS=d^Re=Uar-s$ zhuFm5#O+roKZ1?7<$~{PJ|_2vN;vh2@?cIfx{CRQ^)d=+;2efCvx+N+s&zil4Ze=N7dxew)@IJHV1gp=#!G1yrn zPshf3`3;=gAg{pIC-Nte!~H18etbioq5q#Fhv#pG^Yv8Z@O;Yh`eb~p_AbA_xOC*` ze#z@!rO07>o1Y)89XVS0jN*Cgw{T{J9Q}Euy#1Xl55w6h@A zROMUZe4M-oTjS;5<9w2Q5hw1GFJGhiB?rkhus=j@iF0G+ZrHm=zBl&M@;L0`8Q8%u zV*44@FTtB}7Vr#8@=~}JFzobOo@i1}Xyz<7_E2X?+>^GG6 z!6`ff=iXL61^Y|ox!7JJFOJ*4DX+!Z59J&-m&=E+H&gx-+Z*H(>$INqIoZUCO>$%G zd@Xmv_KR{qoT{w#K8UTV@|-xYBrlKKUoNk~0sb00HI(ninXBYeI6G7>@`>gjRFErT zyS!WvC+f=AW3Rv5J+5yp4~gq*%MZoALC(a!QC^DE{p63aHAvoyQ&-A+aSortMhoSI z*K0j)b@{T`4dhxl!}?lav!n7`aITZwAE()$@p1b)%AbsL_Gdme$d|-SnnGc9U`!Y&Mho$L(v%qhgnqr{nY-ou6}YYOee$ z_GZa%VRN4RQQW?)`ui07<>YNRmr?x>ar@`xgE;k^d;&YO<#RYoeGyOl^K z2N|9>Ozh%@)Foe)h+M-TQPF@ zdg=0dTQ734@b#1L54R@Il6Q!l&oGQZwW9wTiz0{XEzEk0Z&YsQYUJhPaIjy`Uq@p5 z@|~ZlK6g;wjuXGhH*Hex{v@x)7WMT$SDrnf+{Njn#xMJY^31jJ6WDJgpTp@U@&jM0 z-e@2n#3uE3Y*wCXsC+B7ualc^QEsvRH*o5t=2zw`XYT<sg1rYHHtTr}Ch>{1(pb)Bc;g zl-n(pKa0(0{;@aKa$Ur zXX3M#Eu<;m8{AHqKJ`o4+tNlrw ztfJ$2_iw7tol?FHd%w%AkC0RU7EWJOZvIcXRbQTu{o`_pqsjw36{qR{Pn>*A^BHnX z^~ve-Zfp;fyB=4ba^%f8F+pzsyYg&1c>@kQ%h#PCXFt~BV5R13omB3;qWX0>z&8ZS z)2}LDi*q=6N_ldj^2OM6zwKXybf>1RsYp^?hK7L3p>2t{TaDL`1Lx^TZ7Nb9^Q#_xY>Wo zef&z~@W~6= z&v_o&hb??#KIJxEh8pki_7M26{_ib#n)b|U@6j7eQ4mR;o zoWwnfs@}ruvD;DoRVk)CMV`Sn&KEwWM*EZH`kaW(*L1w1FQcQ}#bd(9tSr; z-r=`Nqul0x68+h-$O+s%eA_JAkIn2y^tN4;XI5+fYK6$NCqEZ^gM0xezm=n3BNWwJ z)ivK;*lsE}55J8b<*8@o=+`7h$Fm5>Gx{}g(R|YE$Kdc|b5Xthpz62dG;Uc&xrZ0U zZmasjWywF#{6^#4)yjXwsUynUmQ%fBDt`-SE+{V>eoQf%kNc`T6=!~xkHz_Ka_{hC zjCu9spX1bF<+ZP1emoz|#))S%e)MDeQTr?&82%V%v_B5}vkm7seoez4D~!%}pY#1W zY-GBHy%~effj&h%TGtMyICY6*QA%7`yG&7D@!OF@5^7|u)xz$knwG-QX{nF}c?_aNc8BXy0d1+PUMmyzWv3rZW2WOv?+f<{!m*mCR zdhYNZyQc`lv{?UP2PU-ycxX=M@|h?o(R7z zjhq-FPsZMO`3TNN1BL(k)>eIbg#0y5Op>iSj5kL90H>$OHR>|{Bl4WsPs@d_q5X7u zA`V8%zhNgOcdMs*d%64}PV|wh)~CN-@@$;DNj?)fJfCgO=e`X>hp#_x^ZK(9zl-Z$ zt2~S6;Fb6s{s7;T4D0iU{qy;!ukcXZsG;&SehE*&`5P&B@NhgG@4z1KH?(N1`W$w# zkBc->9^jGKD0p4o@!f?JxOLO8K005HYQI)sA6E`P))nQ!|CG;&9A57(*LU<|y-{vj zx_|Wvhly<5BY%SZVRH56_4M;s*Np>35rW#mKHFD(ymr`*0$K8LLe@{AklznpBg zm$PN%#n`(_uHS+F8p>~B?=!8p=1sJ(u6!vrYRGjvD$n4zaf0>@Iw^NPRDW;dpqknz zJ1b9bP@csp#%p%7a<8!J-^V%J@D}CCb85c=Tev|N+TW{uF?KlqRl6!T@JraOtMSTq zQ*M(-x0UF8_sNTPr+@5Vlln8*!lP5Pe_r$XBlbLbOb_J&$0NW-W6fvet;(%N^6}W5 zzrWt5JiSc)jkulhmdK~DNB(e6ppAU*zz7abMMV6K&aAD4)Su^6>+do6I-B z2Iu>I_b9gw&G&yevr_%_AE?|ZsQd?)cE3 z$O~}p5xMLTlLC()4$=`a6r$_`wI5 z5B>`Wc+6TDi0kW=Hc~V zG!Acc;lKUZi(juFRG!1XVIPl}p#Ck+r+wJLJswhS)YSfLz)n`X=5xg)wKt2a{Vbf|ep_s^>J!vYjU2AT`$heq#kMbxeOP&p{3K51Q~v{|D9;>F z{Q+zjQQmi|^2Ax?-{LIp>?k+!r;)?wO`p&6H+w|3=UkV!-^;Pd^Ierkl_&8FIK%U0 z$;Xsi52*bkv8n$%a@e!eO!FP{xSVPs{~bBp-yEMuNl#O5U#I+3?56VYCzL1X?-2Ie zDZlf{Fb|JkagN^)k;C<-m`~5?vW>rs9L_JjqGsOuZ=NB$@5*a%g8Z7Nl$*SE>D-SX>^!}VXn`fDu-9qwoIc)zfP&qWUFbJP!7s`^gk+aibg zZu0Awg$~ziZeu*0#0B3{{iW28h#b~uOKbnX#@>zcwab;KO3BY+zodK&=b|@u!hbiv zt@>Oud0Ff-a`|_Z8|CFGICG7B0H@2!-QHEbeYv~>drjoZE0iai%F`o<`llBa{AKK?8KI%9rZj!kw{ktLn$bIqlupS2pN>ua z)ti|=d1q`fze(7^*|;7b#>Q=$PuVT>NB`ZiQD6B?Y_p!V*rNUa;`&aiuksb^zgxZw zJ3VCwdw5Zt)BiWv=%xD8*uoXJs(%N!$KD{---|8gzbLN9$KraN+@}7F25LVJTlfR) z;Ir6c{Hk9wANIq>9`!HBCf|XLYc*b(Z`d!~3p;o&_VD-ENUHs1+i8#cV&it@&tivs z3-<6?>|U<=8aegn;cnQ+4mPe({rlL&KDKcFZ`qkf4kC*%)yWGF$?3Rs2n*Zb`=c58~xPZ7uXyuAB^j1 ze*wF=;%^$?qraBeroX%5occ-Fq5l`L#eQtSMiY(yQ{0~ZE@Gedm5#7}>RV&8zuNbY z^Lynf*kQay*uz_~&wK-HR8afN{-^PbE^=#Zk`KfV^LZ3|_|3R|Q?>sRTliRP`YU@> z<2mGwv4?NNMlZtdahLa6gFDP)3Jp=$1e4!u!pOhqCe^f zVUPV<7@K@M_G$k&Htx{)ZU0bz7JdpFt(C8h-Bmt|o!jMRf6|_OU~JmIiXFTcd$`hR zwKuL;fBj-#B|F%}?_!JkpJJ02`b+)UxH)$4-LaW(2D{{2v4=0j^^Di-Z}sn!--eBf zn(s(#;u+Y&i?EG9#SZpkb3e@Y59@hG{nx+_$Ez#$@OW(WR{cWk(*MS|p7sA0o4m*w zjpwo62G}RR6B}*R|5Mn)8?b{fO7bLZ;^o-Fd$Em+pHqJhu7f?! z&quLK{&Ae+lK-l`kMF@oWzA<5HgWOus<-fc*v4OB2Uq`3^)8-;J$wNBxb+3q8&_-m zIoQOXVhbO~HZFfr?H$|(yLb@x@Kf0Dukkiw%a+f@IrX)T{CQuW8m97Y*u)QE3(t@1 zd#e7sIKM$IoKOAP)YrofdH>ktv$2aeVGke2KCYCX`Bu?*ov?`?#uk1D+xSQ9;Cuzt zpU3>#V8c@XGdu!Z|!8&8Y#c543)cF6Z( z7ncp+?1|p*@o*dL*pNhyUmFE|lk2aGJkw zy(Dt@espQxk6uNdXn0j#{Wp=r_p^uce)d6fKl&hb`0p?Bbo~8}D>a@=`&!s)r24jz z!~P~ve^=yi{4$I`mU{0x)z63=-d}28XqGqL+vGt5{wr`QIsHFMX&E+I^TgjcV-&r1tGi~H)ao$8;gzcvC zmN>^Ju-ip>qO!*KTFUjYMScsm+bSQ7{r2)B*r_MKj1#PPbzFaq^6#)wUk{`*=fKUt9IRV563N5od5MQ{$)VDDQ~9y7Dj_Tr1Cr>yz>_ zY>;opF8NWMY^eG~6^-ZO>u{ox@?JQ=4`I8p@>e2F5 zwCbLBeio^!Jb|l4jy@mH=M!5;4lCWR8m|Y=G5&CDcUS&!|hP>9KMW=f=w^oFpF?*H2KsAg-S*e}YpF%KIXR^IgjQ z?=Nz@nbuRbdYFgTx6l2jJ`Qk4Y!uS{Y5-2)N!Y~ma1yV;7Tyv$oR81%%RCr4+zGpV znY{fdRzuEomaoIPj`H2HZD<1wGyN*2lMFN@8F@)y`>B=3tHo#ZY<;f0cjR!qB;)nR7Ea?7egxZiE>7b&v4dAf z4riX(uJOLa#%J>P*xe)_z`0N5Q`rAfzKGMTw{$JdKf`#Hv5T*X9FFhi)V^`#@c3N8 z@v$O@=Ua;Np*!{VXQlJ@`~JB7MtM3m$d|?WCgoqmIX)0MyuQ<1->1ogPgGyDw&s_@ zS4Ix&9e!S>5qWmK>bv4J9*i^iF`V*L{~|V-|I*0e`pdKab>u$de~$y^e-bCwslR-6 zG~dLha)rpz^+SKx;-XyNjU$Kq8~?qlTWIekuFTtC8@uJ?aoD;{o*CB{k{4tDa``=+ zC?J1~Ggru;$L;BFJGN-Q2ixUUe=u^mo(inz6nT#R&qWTem-#&ZyCHh`yz+O ze?FggeHhzZZ_i?v+{NAy-QQPYbEv!tJNSF-<0IG_ruuW(#U<-$KE`n6m9dSJk)!jO z*MoNC)>zfw_W$LBBZvEM^7jTG#BM>o-p{}e*Z%@+y{hB&4$hEoh}+|DaTXuMHtqky z9(j@aT3?#|Egw0YUyi&kc4*%k`{dnlfNg9%q4|!+F6|%33G(N$N4^xB~TD=!x{STgk9Vxt{(b zBZt?A-(Bbb%aOzL-{*XPn|l9Y_4hvYR!(2vtS4X1*DpVir^pYGZzlhj+#xS`t=7An z{Hn;|d~EWXFj)Gx9>5JSeZj=05p*oI4=@fiujnL_^Kb{a1NaY@CzZ;h?PM-zToWLQdo4pQ?W{ z&VP~@;`HzGsyN>-@4!Cu{WJDq<;5E@zu)94*s7uNo8q9Ud`n#4NbZl5*UDqC-%NfI zTer!tV!MUBGS0inU*O;#`2bGa@&%ko%4HgJ{JYBav0GPei_`Vx-q@-q--i?3We4Z_ z$@6fM^}maqYRbRF>BjPYY*m;4#m232nI@WVP)n|flRe~CI7NTAVtat{bnJHWQ`qk- zFT}|v@_HO_{rrs6MRa|g!)|f;%BGrMqNv;wyZBCQ6jMF{CrijLVUK)WoYVi0IQ5;* zx6^U`*YYLJG=6TkTnpQKqFqMT+r~D4`BjjVr)A^M@M&60sB{$fQ z599h#8vjci%#?qO9M1m;^F2+T<@j9ET=P%gt@^q+RZ`=3#5p_|CofSxHEz%K@hT3; zKf(5;s{bK!_S>Hh7MPr8K?Zp$YFklycst5{mz}JPw!TJZ)_LTevXJ7?pM)^dVl$8@?enaUy19# zm$R`4%Aeu%eezD6I3}OK?mYP-&Mc5GYo+xBbL3h$yIgLGoiF4&u(d`W9k)LvPs6Fh z@(b8c%PZpc?5~HD_bdM%d#vvWHhxro4hQT~UZVQu*j^@g#=*04Uu?48 zk=Pifd@A-9%dgo-SV!74Uxn1GvMd-a&bM!|EI{|`Qnu8l2?C%JjwC6 zfZams|FY|~zTm8U4R-I6ug94JI-j~k4$r6FTz|vJ{haQf<8eU!H0p;^|2od`JiHqF z_!}JHL)a*+=izfWffH>s9~0NaN!$usxCc(*A=t(b<20TdIo!{pTyM)FN5_M&A2vh| zcRI)Y`WxDp=XyIvZm=Kc$S1HLSKJV`507V-`%TTrVSgU4UroqYleZze zLC1SIxjVK*-tm7NI}gY&;Ur#(gVD;jVk<2l#Qqfd0?yI?3QO}1qF-zk{%e2}v8-}k$a49vK&Y{A%9B!X6Cz_JX=-yKRDA& zzVt@*=QWbe*p1~zI7rGJB1ikdeEMLQ-*-POa=0Hy*pEqZ`%Y><4I3Tg**H!92JKDS zuZ(l%_XV~psQvfYU_TCGm;5xg8Lx1A%`c$;@{z;!_{_f+HaqM2r4`PxpSMH~_up-) z@dx7IdikNq(fwsnx4h&16t=kkzZlm)p!zkD!|`+M=RUlf@&2LS9;5ma9m4u>f2%P6 z>XD=QQ*T8M&o7Vfx8E5#I$s!X9PO*p{yFkAKOeOe`{m2!&3^;VRgm{!5C4gsE0q_! zN#prf$<=TUw~9SS-!JKgGjrvk*v(fpZ~ST4KA`><#qGzdejWCkT$Wd#i|d=p$FNmj z&eu`%%hr?2#D21DUi-SS-;^z!!##2EuJYk=zDRxyXI98BVLK~lXCj*vO~c$8LVPz|ESE z_qXaRW9z)!7zf|z{OW=efjk5or{t&O`oo&`mA{AGp7Pe%pdzJR9R2R)J(_48RoFi|C zQ@9s4d#QdT4#=nDL`C)g26p~1TqW+)3$=ULvIG-!8i`zdh z@5CNHhJ*K&=TB*V#tU+#*dNHva29vNiK}&f4ZNTVSibd@D}g zD38FI+jakQuzQF6d~EW!ac;2kjW~I){BxZ9TEB6-=I0le%V4jhTpK3~%Pp{RiJZa~ z9*R??ls}H`((-FKTU35O&O2+pTX5nQ`5;bpm;b{K`BgnN{{T0^nJ%io4I5qMF>#Jx zz-Bk)>u?r-kAq*ee*tz%>h-H|FO6?mauuAZFE_!7R&rwgowmui0Nuyd8X184BB zar=tOFJc>C-dpp@mR6p`9`1y5rIZiEKAw!7GRo)T3|@-evdTB$EZ&LJ<&+=C4$j|) z<9nI%D{%@Zu~$KPC!E9maH72O@z}&q$MxJVmtf1(@%RE~v5!+#lpB3DKMz;IsjA9v z!alwar>iM{5@)yQ_%6e?sq1qscJU85Q&stKoaX#3ekbP_&!L#DWR!Yuym*!*KCYQr*Pq{Wuw9$In;DG1lzS!@s`q9|9 zQGOC<&Z_*x-J55N8f6FWQg!9FS{c>pt~w;p}*g-!*dhen5`zFAN|L zrfGfmM~=RJ=j;Dzs=wBgo2I-f zb|=dXus20+jh#tyM{LiO`^ELo$|G@Vmh8m&Sa}Ba$H~t}4)-I`Uhlsw#Yy}TPT|jS z8t;f4?zheREeElK|G_RUXtVyU8vinEuF~-}acYS6zX47xmaoVDLbbmI8~6^K{!IC> zxSsbTU^ii*Bd9+slS2P zt*`zbz$vcRDL8qz>gQs!pS%oPkbB}Z&)Z|;_65~`E>1AsqR8R#$Z|YBz&ZRG4&w8l_JOVS9>UH&@|not`-iLf zd}g6Rp~Led;P{uuXKsQK5!_O)^|?AMe#(%$3x>PenlrSrqasaG|h2e5Nc z?Wf}$&$|n;eY^H&6}D3Hw>XP`i|czRFECj1&tVg%Z<FCvKAm;w+wsQ_&x~2>;E% z!8`JNoaX(Xcd+$<*7I@fdGhDjSuO9tx#HTN-(s`gi*fs&n%`CTYCT!p2&Z}}?~Xlu zf1KZ;d=~ccN}TSk{3~po*ZTHhW03OGaXn59(R_Sd3p;~V-yR3}o;bf(`Qtb-L|%ej zydiRUz9#s6^f_{SwD#|3?9`Qi!>LW0|G$yL>nGs#wZu@_Xsy?mYB+%{Y~s6c5|73f zejKOp0&L^8IE{Bk4$q|2ULEgaIJrT-5IMXaeXgI9!&Gln)cVZWthYhru-N7Z1N$Yz9J2mBZ zaZpA61gC#f`yJSvr`*Th3-XD$zK@)5q}G?7sQoB|oyO|V#Hk6&o8W-`>l(Yd`nww^ zPpSQw$kF|smcX{Nnz0ri%8}ejV0$*JrC@_fY%KaJGi(w?z)W|DEOY6Z^2k&%+;&93GDh_lpbU z-Y9)Osni2%zm%UxF>w|*#H(>T>@nW0vH5+?1F_RV{g1^~TAmiy)8F%WGhTvocs1UQ zw_qRdiR+oqQGA5_UmW0)qqW{MxDq!0(dP{t;G*~joWLnu9uL4K9*vE1TJNK{Hu+q< ziT!#LC&@p=&G8r5!arb}-#_ph-b{aIa3|`EjnR5j_)6RxUxRJj8V|)?aT@o-6YwbP zv;Piu$YoAC3jXBU0}|BC11eXN+>bpb^Utf|uPuz_yJTh`PUa&>uO^qCm>?L(QK8H>GPVA3$KU$A7 zcn41PPD>#%uT?Z1m0&7aqgL*zd1AD+bto|p2E*ZNFee-e?y z`T525`I!3HDIs^q$%$9z9sg0-nk3J{#>4V5oL(e5x z&|g>VFRYT+{(fxTXy$oF+`fan4BIW`FL2OSK8y`Z&Obrp2aV)P*ls4@gmc%)!*QmV z_UEnGos@ru-EQ(>oVr;q@sP$#rR3^3+flv+JGaPVu-99ji`|>#mDnf$3a9Q={x?o8 z(*D(+$a?!K?~BuT3ii4ye>cwWkhkJYPx&~`u^)9Nsef;W@~+t0E{~1#PvqyY`JKEP zr*_G|#`UMnAw3LhX0P^^4`B*jp(VnacWbO>8ew-VO(E$^GN}efg0%AFBO&4QK9^J)9mc@5hO1 zn*V<|J52pma5Nu}+`@?!x_|V;?n-$wPU4rabwc@i?7XJ&kHqbxKQtQtyNHcaa@9u| z{}QWe?F@lpvL{{}c1r~bR(1g}qHu(4D9&BP9V6Q^sazfZ9}NcH=$w?q9Gn5OZKZ{<2T zRZHzVU>6UJ^E%3>W2>(GK2F}R_2=SzgnS&E!!%y8Cp3O`xLgY-$vfcOHR`{A?85R3 z*vnMTJAXgN=0f=xwpYqmKgoV)G@m{=n63N~Y=0&%$Np^9?~U8fmrG1ne*tcVli#TQ zz1aL-o{inPvKQBv*ZTM4?03qG%wT_*UqfunQ$7$|yXEOP!}{Ni+dr%M?!oD2Rc}0{ z{?p8_7S1xC&N%n2>L0+~2l7iebA{&rC3frS_?*E0e;U91O!oigN_oetJI>;%*twwk zW!ShV|A4)#)czmr|Eavf)9T+jEw{qPU-AH)yF&AO1iP2Zi*Sm33w8=?yi?f66`s*} ziObZ!6;507V4SnGKhMYcrRr~WoU{G|*sZL*;Ir!Ax>~M>b4fWByR|$nuCFh@5IZG% z*z73(hV9z&C9^c1d5zo*JI!PpTbIex(Geudvr&4&wUBIvy1>8ZZ5b+zFfQ zw0|RT;##$zgWZ2rzY1GtnuKkK-)$%W(1!wcmkV{4Y-7 zhI2HYgKeDdqyA@MqnG?i?B4S4*y4P?e6IS-^;O;hd*q|B{kP`#95&+p!4BRR*Z-^f z{LiU>8_g3dpL)E>``BAp8B^89nWUirT@F*ocqJ$*uyJgFVcA5 zVyBY&JB3pf<+9H+UMNnxQ(f#xHxPF9OX1@AMjg(vB^gVJvY)z1-V{fv&9NQ1eyRcD7_n!hUs{hQ( zI^Ne|_Z4{r&Q?(UOq_m1{e6J_hva=YN&SCu&h=OIC5`8tRsS8aaZXNS6TgH#ya`*J zuYch5zKVITA7vM)|MW)9rv-MO*759*t(o#PYhAFS= zs=u@+_rTU*`B5C;cd&P_@_jgSiN-JTn)v-*n z+XwQ$I7?pXb&Z$!Tlvk{`9U6r1NvWp(_J*)mbks4^YKuecU4~g4fXF+-vN8%_hGl9 z*8eOvu98<^Go}6x;7oV<(l^z=L*5b_J(Lf@*0Y-5bezWTU>oPKf2-P`#Tndm5y$5? z<-@Rr=i|if$~WWWe2xD*_Fj<7ELMNk%W{33ULbeG**Wq6?97!X<6xdVKlV%VdYpJs zK8RiBQ)-FEH#=*;n_;7)+z+S7pTX&#$~R)ahx|9rbd&2WRsTU>xhJ+>)%EyfocC7# z0e0_{18m&Z`H_q@Ck zCqI^dz&8EoU!nf8$CTH=-beCHIH;ukxG&DD$S-57uDk=At>u5Q-%`FdtML*W)qhW% z`A&WqC-E{I;9b}#r2hWH_Gz`R`5yhBko(|l3DrM_&C>F_as64F2R8AE^J}2>s*KPWe8Z<9NM@o$J-#W}Ns;^+)6SRdU%6)qnE1+!CjK`CjZFmFLHv zrupTt&G}b+mHJEd)%Zzl&rtncILq}gCHAN4|7~n>{(cji^DqBL^uJs6jj{E!+!y;B z{paOhMiaC^*A8^1Dic{KQTXMe|yQ@ahiMz z4rZyp1=!*B_#>Pm---R%sy~A>)L*tn<5|5mUTbU?l&4}3e}Mf}p!*)Zp4{#b+TCe_cjg_acf1^AWC)>%-~@pTkCd z<@GnH{{-%Xy=#@v#O7Vh7iaLVasA!Ouk_Sk5_iOAKjo9LgWtm5?YdsSzybah`?%nz z>OX6%zdATESnp4Fi1XJq|9i3R%1>Z(pxQ6Q$wBgJ?2+fNLw*eVxb#NN#~ZBnNu1&R z_CYv>7vgjSt#=*v4S6rl@%=L6Gxn43&(*+QW7Xe+jfV1lI5SXw3TKa2V!_HL2i zjNA8=zligd@`*U#rt_o17aGs(ro1iAX5~@XC!dWIw<%wR-FtPs_h37z{*5oyzdclW zEo|`pr#?9KtIo%9alTfbi!(*k-@9>sMEQ1{EUG++bLvZP*7zyD-*!E=KT`Vv*nMAq z99t#S-x8esSoyZNeO2ZE#PucRs#`Rk$9%5GCfDZxYz@!X@$DIDtpwa`;KS8NZBk_`SG2zhCVOyq@{)!8`Fu?BRkr&3^*tO9ea~H^Ai? z??yb7_4kh3^C{cCt5UWF~%Z^Z`ff5E%S|BM{Ivz{KK*N;-)$wpV*|LQ~z zKX2EZ&-=9_HwP-eJ96~-Zaxn@9%u1v?BOiV;jgfd590uz!^ZXc{CAn18ZUwCViVth zlekypaQ+taA4P7FPsb_zCiR`D-$-tg|BTc4T;y>7ay7Ld#dgUSpI57d)8wsja**~r zg`L6jAe_JxuuJ{ZI7j|E&W=+1_1L;s-icEq%i-=R1(sy@f@u8e)$0;g8#e7ZCC z0(m6Pydgh|ttC1iUdBOw=&9O1J zTX@tAqf6xQ`Z2kFhLfA*k4FwG-3QhGLL6MH@!zL?ZQ5@kH}6&M*&O=>BvQHtX~C4fgPJIDMt^_i^GXc}L{%=LKr=^KC)g{vY*!$uC;3%lTU`a=1Tf zu8*6^v*h<-56_Go?ngGC*7G*@@z>ZWp!^T)^8L%wzS{dOwVy3;x{YjO=SRK&=ipR% zt?xA);EmX*to#smapC=pceV0**u?#@i)UiTRQ-F{;Pb+Jv0qZ_`!jAoNyoGF0gY!i zQTrtJaCdAqQ$8B|cpgsQsC+F>w3qkeRCBq|L5&ySIyn7==64gepOgp3c?-3ljuS2A zq zziND=pWHe2t@3@?=KF_FM-Kb5>2E2ydAsU2;=}|UpI>nByz+v-X?@LEUv+HZ_K~C4 zAKDMX)~`B#({S=3ou6-G|6k=_MGoiZFuz0O_Grzg;1T+tC|8Lb)_W&)|7?R@+7F=K z{ZIX8aPk`M@0-}WPWEW;(SA?l@Ob99-<-!juJS+S0q%f}8}z&|3@7k3Y~sZ@iNC^~ z*v~`QBF}eJtRHv5HXe@C`0>cm`NZqVE94IOhREUh>R+kje-x(<>3k{qJL7RY zszna#y=tnz9ou*c&fKNzK8vl3 z@@kxUO7q(lIUGOD_-F70Ts8>v@cvty`){4d;renp^>-t7R;#~(anAkmsmS4ajpw?B ztqkM!$YFnV=x;r)i}%vrd0hSdh5cvbOHXNho7acBILYVFyToSyM??+;u*hNmS-#$L$j#20@1och<&ANBK5x7qTP>95 z`%~j3>&caI?ne0r9PoMAe%QQ8xr5Wy<=3z`MP83nP2``k(Nr#QTI1)=YkhTa@}zt- z4)}cfP@Fxk{OP#;MD5oq>^`Xezs2Sl`H#rq`C)Q?l>bZP2cwj?jvVf{{y*g^2CO3cA`8=IG;PZ!XW0U*U z*4R8>9mlyLT3@k$G`_><)9XbJ*E^s2r?89f$4l`{oW;u{hgVvP{m#W6&wgW<{lDal z>Rs|AHgF0DIE^#;wI46x#DCiV&#*IH;~m8Yuiv%KYP@t)wZA)ZxZgJW{SbMks`3|b zg8knV=R98?#X0Wp<XNEiu`~CFw;0uw%`{gy z98QoQi5%{Cn*BW=x99t}#s1TLQ+z+Y9!}n)@otLE_sj3WKJVX6iQCW7`12!&<4s_^ zx5$HPI(}Othu7n3uCIOMxov8H8k;$}3vE{1&-Z=A==06e})#T|o z{fyeb966ki$9&e3=lFi|FW9ZF_Wx49nfl8wYJLfRzO*S$^Zt7;Y`m`aBO-_U<8eMr z#Xg=-y~p>1S4Ix!mt(xoBZt4=!ziNPC$R@_-D3Dig;>tLQn_>%hiR;I! z|AE-Y6S2qd^O%iOv|oyI%x68e$#>y2J|5@%{n7&YG~b=HzY@QQ8%7SF5B+`meoCjv z;eHzP^!m{sJG`EZr~Pi)KOH%|{^P%I`v&zHo|o5P7k?W$+<%wnogpj?W9&byfc^_VMSjsoxhlobM6l`v_55O*-fDOKXGAquR-(u|JPq6uh`r8>foNvHJ@P)W|5p1nwm6@kjQoGr^J?U9K1Lti&p*T#-i96S$NTXa=KoKek5l_g zi>W{7S-A#wUzJpA#|eBRHgO-E#G~T&r}g`xrs0Bk0WON)!_)bDd0*g?}|AEWlq9ru{^0+dt zh?`&&-;Aqc8`s9;vBi3x#wq+dp3i(g!u4qXHBRD#xCuUsZTc%!Qu9ya8rZ?Da0d6l zE*^rj_+i|f@#bKUd@0W1_1MQdae$9vqnOSI;}XrcHT_?XEnE+`$L(+@+#7enBXJ7< zKd$aP{)+MO|Np2cOPtVN4DE|LY1KOIDeAP)DwCwLo>Ey#4Ox=yl%kSM6d^Uq5{0oA zqOoV6H&K=t3EA?Uc|9N3?f1F;{&T-QuYJ~Yozu%)JPa?zBk+1W2EU43{3*^c-e0hd zD;}-!=W$)^;MTZ+Psiue{#fjiPs2q#AA8t0=6>=NE|G7?KK=>^_y7*^(Z^`~%ea5k z$CDV}X*i<%AROZfIKeZqb%c)Z0-VDSVH-b(^Y}gN;O}q&|A&|G_sgp0(($M7i#vH= zZ<0BE({uSe)e{#d>GQ_~Y@e#n2eUG#?{hBq^JUn>n<-x!qw+C!`S;r8tEfL8H^Mpo ze{zE}r|o-uKAVCg-dAtH^T;2>CHxv*f`7t3&K;Y!pUyvK{-g=(+vacbZFSUx>-I-Wg@=Ukl7-weu^>g)64JRC33 z@wpf0_}%gpI|p2B+mOw$5v7Q|H<{(86rp69w+~SU01GAQ~j0BlKbL_`j=pPwDLPl zK1qHa=f=oi7+)xtuch|AfwGO`!EzUD<54(QP<{n2Tq-ZcMf^ApFH-(d=Ja?cTu=MR zoy(LTT3h2OTq4)XoF0!B9FJ2or=NG-a{B-Mo|!p)KedJ{Ou6zQ=<6*fTE?iov?0(q>=SR!E zaB+-03`Yg|Vr-o+&o$-o3LN8Sad@4|zhUyR@~0*rC-1{iQ7(6)#$OsN*TT^Sax3gj zl+VEVN%ACIm?B?=tvlu0P5p)PDpQ{Icovt=RvzKvaCr|-@FBLw>yJ=g2S=>;DL8+t z@*cQ|M`9OWf^+yO5kJn^Q?;p87`hGkhFO64!&ya^aPhP_jeiz3$#tHrfTiw;Z zbrSvIDw)$WE10AHYU1P;xfzabmb>B{>)Q{P$cLNyqf~yJ$uE~L#MV4{M&|T=DCT`@ zF1bBY`2rksek{ku^OUc`2@Y_?`SUEcJe7YbbGqIKxLx=WaUgmVYON^(Z$vOW0$V1ML;n-!p#^Z?mB5X0f>Db|T&dHq4 z*P;LUxPX^rPVbL-?vJZYeU9HoT)0v5d(n8ZydC?@|8s2LS-$LkwHGIEl`C`kdYXS> zzw)E8f4$nPojHB}h5SA2rr786#A$d9?w2`zeiqpO9iBPusmS?rVdnJw3V7eXn%rf* zN}1F3aaoU5c51afm<2oUUIh)^B&_?0V+>DOW#r+EQ+Y-iMFF?ku?} zwsH5&X?<(B&c|Wo&NV7O-qfEdPs^P4e=7aYBTueYem5>$DL;&@V=9!*??oI|mOnD4 z{XLn}^Ii?(KR^4HyTrZLFRNkg&BH(TAn#w-y+9*J$c|Me+FCl73^QD{O!!?dbeS|pJz_n z^Jwo+T*AjRRR7jy&G+QYY5lg;??`U{Sgq`M49uL)zsPzI!yX=mw=uu5)VJy!QC9y- z?BP3bSXcRj*gZksVsiYB@rlZRzz#mFk>=yr%1^-l!-tpk-x0@+l@G%~b9p)r$#2K` zrph0|3FTkM5&i)eDPN(n##6#4V5^DR>w+Wlu{hUE`E2as`*Df>Uc>?UPF$e9KX62T zOcRaArvJt`A$PDxJ{kvj7S7TBVq?bhIL_nk*ropWxIlhrQ;nyH>*9p+r(vJtF$8<~ z66{cZ9(KuBJ^0C;*H(`tR*BCRNx3G zgd@s7iv#>ME>OOFUi}queH_z%e;klc#R*=Do%ZVg6QBW!`2w8K{{|eAN4U^Q{q4gZuGLQc$GD?0^~Yk1@y)?` z%CEvU`D@t0-{6q)mD;PnBI9k03%EbdQT}3_Cof^&(R>12>?MDMJ@Vgi(p`Ct4(dOk zd>3586L7wV%3qHQcohz5|8-NJJi!sJcAEOLd#XJL7fgS+NPZp8QU4)aB7YUf^uG%S z4)qUW;wYM>xm$f5CZtOefZt@~yDTcnjFUQ?Nz(h1e#4 z5|{dD{XWEQfB7ITlAq97{l|TkcgH^ECt?qmu-#AP1MJ{;a6tQinEK==c2R#J?t^ou ztGy}Mp})JaOa3IbsQ)SU$p69-{nzTM{(SP&aGv> @5OmsxjXAi`={a}`A8h#IoKMc_8!K0(;qI7|9}(5o9m(eisUVDNdITz68S~g zrv9zCfH&d*ziUkW-*AMh_T>0d{xqDBkHR_Tb0scOei?Qc?=#rOpWqn(jV*jaFZG`v zto7@Hi^JscI7fahPVoIWp!{pNg!kh75Vdz?Z}nHeO^s=9ATE(l!x3JJ?V)P#B~zdN zzQslIa(&caj`|I8iM%H+(*HOdkk7`>>H7S-0w?|DS8zoAuZ*c*p|AQ+a6KGTzYoqa z{tIv(&&2`lufhrE!%H~AU*Qtv%k@+L0eO8~Je%WwKz%ld*DFY>|(^#WBjK#W*2<443HdEu5qLx7ekBYq0vylh?!{d0U*|;kZEiQ;ey92QK1AuuuKh zaf$pJ9N>dEPy4lpXnZmEleRd-gRw{Zmtdd#7F?>Y^?e9CjpR3Qk^CDRH&9-FsQULP zUmv@;AGRB+{CHD-kj}?BIG}wWmj)|;85hUO-{7#i+N(TF{g;L+Z;fsGABG+JzXV(O zcI@IcIAT06V~_lEoM--jnfkcySsG7>J7Ays!%dDa$2rR1iDU8rTjqFRpYnTff$^3< zTm9#;jT77j=kOR)zMt0ba$MLWd#3(z@okgNp`UHsyxJ$XFM0;{OihRWA_bt0WRVPaBjQu zXHEXL9O1&d@^0+CBmaj3@~We_KHgW}2s{DJ*xM!Nar}*ZI=1%9uJIaqhN-_no^Sl2yb}9~ zyuswZ$j{?wjlQpcAG`M}--DeVhn9W+_nWEzl=4brG#`JGRhHMl&H?33ap_21FWqre zNgihMW8@34MScbLDk#4N7Y>zuY#%GH$8kCNdF&h}zl(#z<=wbcSw3idlw9>3&98K{ z+#DBkawi;=mj~cnMcKvv5%LU^AENcS&D5VFugRQ#-(2ALB2ST*9##GZ4j+^EV0W!t zVXVd*Tp(A$`Mc%%xKK;u>5@6^FYd43Bb-HU->&i#us2nnWAbV81K6o>NZIj!0tbBF z*lJ9F?`KZGA8*I^{PIQO6WKNS}a%Dr&$ zUwIhztH~GR_z<->8z;24z?9#h^LZr>o{%?U`$_p#QyzbW6a0h8pHlgQ*u}@XnqPoV z!uBZrUZZQ~?D()AL&%dyG@l9Bd0d`_gW8(kqRi><4I+L|@T{qCtNadAAICU8QTcwH zJ6WzUPUH2t|5VGIj?d=&X+R!7r29!{oa6J!aO`ovxfJK|4VlyNmiRryQtab(IKZ#q z5PyOr{4wug;v_?`rV-zo*Gd_0`@RIBFn&h25>H z|0m9suU~e3*PW#C1}DpXar|$+viy8pte||RDZf|wo!I|RUXP_{OOMj|-gnj1w8;xUwY#Fezkvg=Ja_J^8Pge z$M~wu>HC`b`w_QN-~K}N@5jzh@&@ewAaBKCJ&or*T;P2BU*@#^_Ph`7BagmO{X;L& z{PKsZ{s}mKPkC$XS5iJOb2=YuiJqThu#GRwoV~Ab{m#aXaVc|l|A^K812|8APvJtO z{7oFJk-sqhP5uGf%*VQv`QU2U!_70N>rrStxa|6OGN(7Y=*KhZNPH*GoPL7rV<{ae?w*dinDW~@5Vr!9nA9n7Pw_un2V^e>&+WQ%o9F;$6hWZZ~Uo&iz z_r+e!crvH=Lx=m{6zt+#@h1NL!~@i~TdTk4aDqR_ZeIDnrhE&z<`s;ujocC29puqC z*HWI2leY35*y$(x*y|#1!qKyu-wsp1x$-@k)A@SL?;q^rDpx8GaYG#APS{$i=SKnC zcmj6t)!4;%U=OdtKHh{wydB3l#?~_RzaQJU(p4N!TnD>2k3HNgb9(=E2WWjp!N{$t8V z;H0DapNgZd^3Axw^|8j3=ikq~mN|XC=Xsugfji(oC?9uLd%2k!UjaA87Ux?pUl2iR(&&ns`@ko;S0lOHlm?T7q*i8|OJZ;xF(By;+_wR!$u zf?b~f^C<68{{GC_@#F99JV*JM=k-p!lmFk$uXqye9es`Z%k%$JYJ$V}_4mno;R5-& zro4GS!A06zj2-eIbGBc_`n*A2ApZtmNquX!#^d4Icph$tOL#Dj8Sll|rTv@m63X9? zE&hKy&*38T+nG5XuQf`?cVFgoedB$)ek;#W?vOXa9`24qJQ~N$e>zU^9htK?L$2qQ z*dMO*c{2{DR499YjBsJ1{2k6svC8tw9_`@{*!xlC2jg(JJQ=%*d>zi=dvI}&@+Yx9 ztXx@tZ{T34{3Xs`sPX)1>R&9^xK`tHFOu6EFV*)E!*C8?i3?Zh^Y=m=Ung(ErJMMC zj_sS}0!`BHxMQpH%*L92}VGu0S}DH*7n{qA zaN!jBN#n-y+t_I%e~+Wqa)p~To{0YH{f6=u z>@<)+#!+YaR~*-qtIX5*+~d`LGvj`8UtBmSpN|v9GZ#mAHO~L1@>@*(vAQ39gnd`u zXS`0wKnvb(7ZjPHf*Nug9f({Cane`wnVLC$9}4+=c_ZG2ms8$)SL54&gYjzbC2XHBzmL6s zD*qkM_mcm?g&TFgRK7#=aa+hXj&NI?YpDEm9MqFt9JZ9FV?WUR?!?Y$t>*(ca^)v+ zZk)UodzAkayZEQf>E|u4srLWMm9&2GZ+f3RE^~UPiCU`vdYRMDI}V?3P9;x1(R%dA zoVHhqzrQ;K=kR#y7x}%x6x@&YW@k?O%azyq--ex0I{#KuzC`_XnbZDi(Eba!$mhrH z)OQ!Dy^pCMQ2%>eFrU{bACA!a9kC#7KYib>^soLNWwXrb_>ykQJK^+pP~kZ@~U=9q)xW8X>R5PAjedQ>H%a{TeQQto8p02lzWvpYqnibo}Y{k?{9X zYGqDG?vb}6w{99(HlMS|6WY5Nmk!nVX5)CIycj!NpX)QH=gSDzHzbb^X#No{jnVkO z&YT`ko8$QpdF~wLRqoVyLr?496c?_Qd*d8FCv)0=+)BSUnVdOozcKC4BzGC#t(nvH z$ua+xnbVc9duY6yaiOdH5e}Q__Kk`e-Bj!Jcd<6Ll@`U+6PCkkJee#g`?;^jFyxbCv&l{-zt7cBeH;=p>xqr6u zGsu^a7s+GhKZkq``Ev3c=g&IwP2_Kr=ZC5NugSNOAGTEE^G{b^J##v~o#gGv!@pK#3asjyu0?Z|vUW_2N955`z5jfJ3%noxo;jUw4c>36uF!m(Nh;q67r)T?*(r1SdBWPO&o3iz z*j9gUa;ouR@;vI7{?PN%$H97eBX-7Uey?I{me%tFoMZp!JDeY{{7;kPBk$Ar3;lGx zpM*o)9_LS2ekKm^cp7&I={A}$@S>vOj8r7C}iDSwIV zWB+TF-;g=&KW07O$ehl9TYY{0`-nW^efb;e7f#Xn@>}Ngela`I`%;AmYAa_@4jcZ`epkkx7V!~VbZt&%xizYiuiE?e&t zGyk9VT9CVssJ(93`&1r|3$c6|_P>$mWloPr*hI%;DS1#^^L-e5GqoO1;RwHu-L5MC zInK9M`9E+GS9wtL32-y)_Edcb`;I&UCzPLoy&lRJ;i$X(w5i`l{l~a)zOL5;*nLFh zD?g<9U&-}-5}t+I;}P6%`eaUzgw5x@;n=CK^_++ch6H8Q8?kM)keUu;h9 zkoUp`KJTA}?Ydg83vn*5_GV^I`(Hx;^D?LN^H{%oaA&+8cfldkcuCK@b!EW+N ztk)md;dyYx!|LCs|LU2u_ZLU&*D`b3Ud(=K-^}U#G0**Z6uEneuGguiJfGKZ#QsLD z=Mo$oRQZQ9r}Iy^A3Q@|cw707%;|X6us{1v=5+n<<9=H1k<{t&oSkjsQh&7@I1R2TiC}5`)wO>sjBL4$KDxgKgPvxghX6#Y_-ptwktGVu9Ycr?E!y2OJ z(bJi;=V3B1U1iI9oBFxebv$<&pP>0$Yc-$Zo64)>+$y;Zj`09os-^mqO!?aK4VlyN zxcqyTWtr3Q&SU*H;%@jYY%`y)GN&VVzEJ=BaPXB}{xRj=&vFgyyd&pv^03?u+jq%B zaIS{Ndl3$*%Qxcad6i#*^UukfO!+19ySPAm`)~;#yH4XRuwJKP?>E&SfTJC~D*q*R=mzex` zcrW7k9{#xI8$7E1YvPda6C30FJIcG@BK-}f`f5JsV7HHa1rAS>7htc0{4h>v??r46QvPM;^!+5@{p45jc$das z?n#Zu-X>Sa5uaaA#ibUSPY;t%)O<(a{MlN+3o@tAV~6*zt4#R`I)CrL)?|5g=5&3F zy#H+=4>~D-9*2|F|6ABUO5^nD{weS>lI{9`|D2oA-VUJ@=wTnkpGxDJ)ZZ! zsL!K+k@qA&>S@i-`C0wd$(*)-CF^@i=JfdNWPi0A4o}kk@2t$}=YOxcKF?l|IXz$P z-_+ifII5uax*dl+&sJcU?_byB_&Sbf=5+l1_{=5%}szc*`&y(4ryI%iJr@6JfguP^mI*5fS7Mkx^RPWt zE_4e-M{w?>QVy)B3!XIlX@tc%S%R=Jb9LcGmmYKFSyW(Ry29 zny1GnUZ?y0F`3ij6aAt5L>w=WPr>;k^t|nD%2$%d8qd*qF2e4G%CE;EUXeNNKji$_ zNFMNe`mMOsUG060^F8E!xXAZchrX!sdwk!00xmHAme`-e^A1~#zktJv8t*u4S5f)P zap5nm$8|Wy3vrJ1eZbV`_dAbgPLIbto~Lh``oF5b&vCL}-iIAr{w3x|`RdrZM(fcy zbK3rL?*DDc9o}CD;OJ1zXCw~hX+D#2>3aFv%xQZ*?cGhDyFvLz@>S$-nEK?qvFEA$ zKRB8rSASXaDP1SG#x~{qJYJ`%#5gG+v+g<*K;A^S?RHH`ej!iS3G7@3XLTqFG|E~4=35S2k6}D_)c+D3wAA_W5O(nv;}y!^!^vzN@7K zTCWJZyX3vtV?GD5|AP9FUbvX^p5Ix#>K752jN^OpNE52gV2Ayu=9$y=47eUnCohcD@fl;v z^LhJH%CBL)XOi38-%8{G`AYKA5S=fZae?+e%$(le4sd__k38i2v>Mwrez%&&-vo#F zH0(`M`vqL&^Wj)i{}3I&>83pSO*lVT`Eu+JkvA9@WU*3sr+WQ7a{QHRiur*2J zulkne2pJ~|Nto#<7)R9-<{1fteY+s=3dkYRm z%R6wfgWCVrG7`gx4!R~WAav7 zkGpZ{1C4hr_9tjO&tYqT@(-}vNB#i^O;rAn9jrIwsevQ@J!wlE|DyU14yUO8Ae>`= z{oKsy_+x%gaVdGyM)SW0M_qJ3z7+>UHNO?uDW~?IH03W+{%Yp*dVGTGF(!|>U+**Z zZ&3Ymk>;1+r=E z`?$&v#KjG=Ysz!|UyiNq%5TDX-nW)vw}HmL(d4{;y@~_!&vCL?>z81Q_R7Df`NVIl zziK$YLvETmJ09QYcyuC9Mru9!VVnESXdM2b`d8w3l*W65$+^GYZOru_;An*Ezkux} z8vom-JpKwh>{tF`>VK#6@jo2%eQlNZHD9NPuI~o8P?9?t-ysjmoL)~JpGQWM7b_^A zg7bXdpNkzn@7`_9=j%15{_mRKv)HBn>o_@7?SFzx{QJng*djmd1C6f__m>)()BAUD zr0O@vxr6Gj3-%AlXJU)~$KewH{%#7+b3EqZ+)-+ON#^wP#2M_*Kbkpx|Mw5k`Lc!b zCE9-rTYswmnEGxteIEG}#}(wk1^$WUzn0P9iMxK#y6KdPx)o0eofU6GN?xT*H@*T z8h?@ZgZemOKdcA#YpVWm?65y{0S@{8_bTi?srGNroQ`iNww;8(to#HHl8B+^|%uGQtXkh z!zKJO_VG>};JrA+Gc-#K3ws$)agt-PuJJ+xHL@Xb3+{dDtE#O*V70bSJU-! zG4_s;uf`VpN4J>r>~G(LO9RyZlel<>yd!gZJ@w`O|26K1|G=l?qdr&p{`e$30JpRZB+TG*yZ0l zTyOFR)c+zJ-=_6ljf30eEynZZw=-wg%k4UTpJS_jq3rtqf%4uGl|L-j_}xWvO&lzh zn`8fe*}=|(@>m?NmaoCZ2joTA!fUZjdoP-t`k&y!D%JlLN7S$UKaJO?|9aSYSmoPc z?-98_&f#&UKILZ^Kcw=v;KF0_1E&63`B_}V@0k2i<-4)t%m3m0I=R|c8h?PBV*gI% z4i2e596KwOUt-EHl&{5kj@NQi{%++PjK}GGdj&`J^gi@C&b_blKjQ?K`mb|^mq z7h}1-F~9dYJ9GN}P~iRZ(#+}gvx)o5^_2J4tNwDF`$B%gM!B?td==F^X=-&o8Vk8-EVs1Jm2q*G`wvj7jntMFO)nat^W7Wq824Tl$MydRsK=j(3l^Y>c* z!Z|(ioDEM<>ejaM6}mVY`+bVvGDUlfTq3ZPl`V$I&*q+IQ+NSgG^36}Dej-YavuUT1TD zjUo5hubqJteviE%b9(;9yl*~{Ib9E{ndbXx=5)P$*6XLtY5Qh95BXlXSl;q_1jl2TaS_0=^$T*LwtkDPg8y`F5#!J+fn%r z?6s4>HaYzrzzKQfA2c7=R{0Zg5ub`f+#7o*tNb7wj#ZFVX z2acIv0b5m-kH>{mOa6k%ZRMY1znOf<&+0#{E1!r<_2o|3 zKUE%t3&Z7cI6qCEj^pX_ZMZl?UW*;_t=Jo>{1coUCGW=874kos)8|XT_q~-9Im9Ps zPLG`5O66PQ=q$On@i2J=F5M(g!pYh4bR7Jp<1x?Fuc&;fDgU4HM{#($@@GtW*5_?( z&sP2gwyu=-VLvY)@r&k@Zz?y!?nJpePA14>aX3!C!qiVRz8i7zCwZCiZ}P)9_)&h& z_#b%(jytLSFLB|Z^8L7Uqw>S{Y5Y0Xw+42}n_!#kt&_=PwKp_#`ur;K_hu(%PM>!U z?`yNj1M(8NOTIdDdOj3~XgrT&udn<9E)0~nT2&*a+`c- z=5#$*@%x$Yu=lO@H~*!)L;0ijt38+Y8sN}X`|WZ5TOF^{v0qjB7##GJr)JLHN1Ca> zYmJYQmr*|9_&<_4`~1Lu*z?%o{p8)u>3W7o>iu|k=Cpn9TDA8NjvLBVej|TZZixM( zSb+Y%3r|NmGV2-y;1%GCyY12@l551{l$9Dmyg9!ce$bQ9Jvk7(V=@k04-oV!zg%$W6jA#-+p)zS6wE_so^7qiQhzg+eIG%m`A|E>8t zv*cPhKUHpuOSlV882=y~FIV{saFKs6HVb>Jl;3RXuaK8yPM;Sed0sq19xPTK;^9|D(m$F{@PP6LIKe%z&3MkmZb9W|VrR6x9G5PVpUj+&H^=Ao?U~d2rO*8? z#sS_>{T$b8)qgd)cA3+aFPy9WvhI}M$^O$I^85?xe^%vmqb?x6gjDt7i*RYGfF!kpt|JCIDJ?n~xX#6gJ52-GWK3Dk; z*#AmC3&&r|GjI~icN~|c+%@PNn=^zilMXk-tvffqXA{p1-GeOnLPepQQb{eCBjM z{V0Dfc|?9K`3Uk2Cg<-VzJc@f{}ttH@O#2a71WU>{l@?G*1IKm%d z_Z#JZ;P4c+cg$go2RFgNcPifjdk5v-*!o&N*VO-?JQF9!sr{R=Q&qm(l>b8IAH})< zHQ&QKe~42bmi@8>c5F`b-A1I=W2f-&fTf@ z&ci$w584^w`saYeZY_C8hrLrlJ3KHvB^`6}#_-<~=9zMbdqvdroDEPkK( z2;ReZpQU_}=lj;o>F4=`?=wEe*1Umb=l2gdhyTT16@C6c>PXE$K34Oog?+}`0+)_t zz9v6PJ{#u`mnR!HlxJj4=QD=$XCAp7Ydsc|=b7I|a;v`ThuCQ#@4&@NZyN@e>0SAHnF3#C%|2tgRt^8kHBCna#_@j-= z>tp)~xiz*vmb+m06?up$|DAkk=Ir?L_eHKU^`BRM3odPvmznw-9E^~Uk z_HexFkQa93VtH)!rG{ z!ow-=|El9No;*HP<)`BU|K5K#F0o$oOg=;9@5IHm@=6>$CO?h6N8~qf!uj(d&f^$c zM{E6l!Y;p$`w!dPA1hbYdic!W#vyK-Ib9EXn)>gCof~w28k9MG9|$kk=Y1DjP30-r z;eBB)F5tzP)8i3xzCVPWpS8ZvV0XX#Cbs$i0ey~re$V}L=5#zR?OWAkoAFe^Me>ue zhg;(k?v**c{`~*x`WuuvJ3pBJ*v#4W$oY6t=5#*sUXAw(%IA5WU2AgIcVXsqyyoBc zEv0<1h1Po=b}u_Q?bWhg!np-{ANjn{o}|zqO89q z*zJ=m^Rw8S)VR!VW9OJ-%Dfx<(`%LaUz1PK`kh#l_2A!Awl#iG{SU**Gx9{7d$o31 zdyg7#R=y3FTIzUxhVxsL|AM2U#&c*b`giJ-wO1Vn-&HAd9>>)0iLI#`|8Q(yF3-Tu zH2Dtf73B@4{_`5oE7+Z`e5WbjSL^!=wqH>B3bi%f;zFHo^{_Wz`2_54(E8ku^N%Y3 z2S==5&pK+)36-CX6V8{(*uPW#-Gqzm|F6QihC08V#zD_x%hvB(Y+t7HwPIcM=f0@^ zYT>Yj#@iJaZmnKce=N3ck!PCn-|F}*#=>ph%%p;}pa>qPZedP%N_gIDE&*xM>k z!}d0L3AVcF{CL6Sz2vWrd&`w<^_M$Z-w!p#?lJNJTzbEL+4!d5{D<-)?0h7@h^*HH*Kgqw_WFNFB}cf`F^3v-#@Hu zJ+8-v3)J7E*iQcdOZNPD8JDh=zs5-uT`zy(Vlz3{Nd1Sc<@z}4AfJYlj`Cn^ca|sO zpo@GhE;#aPZ1t6&#>IZ}+t}_e@4-$>`9D)WFV|?S@s>u)r(kcC+#451%VV+MO1=^Y zW8~X$bdJ0V$7AKq*m31|aqc|%JM4~^ttJ|uKS@3b2kqoG*y}A1H0~i^jKj(Dd{h4- z`9WMbS@-v?IH@e}!d?}*LQ{>$IYw@TllpQ`Txuv^Xv#N}Z^F51@*_CxCckIucb9+1 zL2J2sGxZ;|l{@34wmc5!ddiD&++N;{!xnOk3w7oHu-!#Ixw-nwb&>~Qx37GuaX)zx z4qM94;(UL37mo3vr>OmWALR{je7xKphk1Fj@j&?&Yz>juV*gZm2Tp3r`*1K^uGvEU zm(G>jV(UElZ0sE+Pr-g;`F0#llmp}Av2~aHH1_V6BU68Y{6Cy5k$*S&NqV0=I`Pa8c(uFJ^>f*lRIF`mj_|@0eKP*ua{?I=T3QvsZaZX$yY0X1IIVW z-{Nqsd=Pu<9ll$!}qMqr3+P3*-uI zHJv+#zqpc1ivU7gy{3?=S2> zDBJBcp6F)vKNjad)A{`*w$9V_k>J8v^0n<%zxa~shuD5u?%F}Q^QwGj7df|0Zrhdo zA^BQty)KXJrrdv8z8`y!$Onv<>3-ADQF$-a{7=JnGkrcBfvx893|u%xE*aNRdk^DM zO?eCUYsv3p=P})XD|c7_`So%??9bQz_$usemsjK5+wyz3_=@Tu-$U(L>_;@i$)&pg zcgH@*dxWv8_t$CIW${H)H$tFX;}#2q+fzv4mcvLCU<^IQ)wFEotN4$=M zOZ9&9BTm@=IOKHo@30@y2uJKcoQ}Qu+K-ro^Xx}lk4sPJ^V~}8upjX<4r*yX;(P3# zuJiNA{_5XmKcX=XFVp@*A6#NT;sTTZuKkDGad1H1h%NRbJ~Z{8*M7pG1JqxR{fMU6 zVn1TIG5Zm7aDZ21udDVO-o{~1dB4fopQwF?`U@)SdD9IS*`GKM+w4coH|0Oj^JhH{ z*`N3Vd!Hyj{7kiAe>`A;(Sy7Zq?t33+zV>9H{n->_@zS z9rh#I3{vj0AMqg0vma5tpuE()aoPCp$3^xdnhjPSkJ9~mF)pwl@sIIX__y*K~r5n=iua2`EqQrA2Hw5 zXFp<^7(F}X1EANX-Eo2ub>`%__~KUG^i6J4@p$vLDeLd*^CAy-hw&9*Yz9C$7K_`w`1b-d5$; zlHM22zz+Kn7nwY#{5BjMEkBNn>_>tz|srD20C%R*Y{fNmpI$iY_W0(DiO*rVS{1cP2A8`N| z*pE1Ql=`#TkLZKF!Ky#mj*IL^Y{Yr?BR<19_9Onn&N#JKceMJ;u^-V9CykVk z#0B;vt}$jm!Z&6=;#KUQr|19A*n3FtH?_v7zXJOat#NU^&hP#>c}%_lyLamOKHHRE zEZ>E5>_=?CaY^|r*kM27Qykg){PG*N*pE2w9F5O!q`W20u^%xMTkJ>7z)1&{Uy9?d z@@5?MlE1)Vf7u$V{w($*Y+PVJ;xwFRKVmSB@nyKke#8yfV?Sb*$=N@64oAGNeQe6# zs^`gn*kV7T=D8YQ>2~F_@zU6Z{=6vL8{=RsVVR zBkJQK`vqNaLOv3E>`zR^0pFM2h8;d%uf`#t|6erq*`N5-_^POFk2oC% z>{m=QW`AP7DbIW#!rol9zt#9wyDcpG?{T_*2H|L!{1wizA5m`t{o@CW*`N69Lgl5cn%|0x_;rc@e5k7bvWer{yVV8{>0BXVt?YuOVz%|?*kj+9QzTSu)}`D zS=e8z`)>({>*Tj^p8W{xGPR#$KcWS8-qQVgEKXil{gs*1-&Z93zUvu$0B^SU;NP(|NAs&VRr9ZekHvv5ouV#&`_Q;|p;I zJQF*33GRp2-~xUIkHBwaPLGGxZcy3hxi4`gypQrO<;!2L`Ax#ra1l4aSK_wV!#(jl zJPeoc1iS=K!9Moz8eGBwz7KE0>u`ueybZsDBOK$M_#YhOn$tA@J@^!y;69ntm2{Wu zeQhxL0rK(K@^rpjiz{KD`jM~tkK)2T@@AaS{&pOae};?qs{D_c)B9VF_W#8-@UhdC z|3CKL1wM|ex*u2DPy&S?hSL7h0%ds=;*iLC+lJCgmZez4vK6hI1ZdE%c4wu*<9bMCqC=VXBI1$-{>An*Y29^hTTS>SQt67W9YCh#2a)xehlKNmO${8Hc* z;Ol|w!0!ZJ1-=pZ81R>XuL1rx@NwW@0ACAy+ar?xHt=16uLHg(@Co4afNuaE1zra} z1bicK4)`SSVc?s9uLSM@KNv-vC?(ekbrM z@W+6U0pARK4e+;sj|2Z4_*&q;RpdYLU4gFyz8CNb;0u6n0Nw?>4m=5bBX9xuB=8l$ zHvvBuxC49~_!i(-1D^tZC-AMnp9AiDyyX9PfX@d074SCTyRJ!k&jG$aa0Yl3_*~#g z-~r$)@GjsA@Hp`Ef%gHw4R{Xt)4-Pje+M`R{2SmE;5%O__SS*71Fr%P10Mt42Ye0i z!+?(iUjckA@Y8_Xz%K*74*2!JCxG7pd;{3~4gGT#^i$w}1n{lEM}YgTmh$m5;In~W47?5a2HtfwuwQ z0(=he&w(?*w|R`D_gvsV2Oa>vA7dVAzEbjM5V!+80bB>Z81Z)@{u1yw@KwP3fUg0b z1AYbYWx($M&H;Y{cm?>2z;)mb@G9^xfsX;7^;k*oHNbZQJ`VhsjQPIJJ@%{d_4%NW zqdxyF@U`H-7`P2w0KN`*4fq7`lYnmkeje~T@T-7t1b!>gsdJp?%O8o`T< zNuT?Dz!u_n@P5`)!Jh;F%MAW^fd7^cU!?r~N$|J9|1Hpu-A3&BC2-$v!FPHb>;wN_ zGbZ~pUle%{0&W+Ce-8Ya>%{&NW6l1nz<(0&$vq4FIq+Wx`mM0{eW15N|2*io;Cd)0H1@Q~Y}$;9Zcnn=z%Q z4gQ0SHTx~_?*sp%z~2G?GY$UNfPdR3#b56Qf9CaK@8=Bu?}2{+{QnEwzC!H1>l4Mk z9O9qHn99o>_~~Aj*bn+8pr1f~RY326{&>*WXGQ+C!0jsq|1yUKz|!! zE&o0N{>zYm{|0>OGh)v#5WkK1cX*Q6TZez|&6w>4eHUX*{sHi3z9;gE;Lp5K?7h<9 zKMwvC*z;=e=fM9Sga5POUj_dy;BSNfH=yUXp}brJdqF>sG5Nm@e~p8lIU)940{S(O zUjfb`J&y-}4*b_L*3$paptoNs@;-$4*FxUSE*`%vB-N1=xxw%1U>g_$_ApQ>-Yx@51AI092(02}F_V-&QJ^hR|{=MKo1^$PD zKL`H0OGo?m51_X}e-Us8_)Uy8`5#668{ogMfj{#$vFATQKZf+(?rCCg4)l96ruv!t znxuae_(sUP2>fmE=Rv;-^rOJH0RJQSJK%pgW6jInlagX4&pxu z^vt`&zB%9=aEY;&-m4J*IP85E_}k#W&ftF^_;bjg&x5}M{_h+7ea{m6#{XN=_vehc zeR;RocRuLbkUtZ^11MjYfKSly&VKT3H{TIIeqVu^!+_!&0Yum9q7LX{5kNy#NdA`_)kIp$HCtQ ze+Tr;P2%5Q0PljmcX*E2(*ggzfiv$F`*t$c?3-oG?I+|Fz@G#En!*1J@OMx@UIqR( z_}>ls9P;xspm#w3E@Msq|A2qnrzJgq`dqQ+9F&i98MA-iC-(m>=mX$i06ho#BN=P* zkAc69^gR#!ZScPy^bGWU5cCe{H!;@a{TTdn(0|tRVBh=2zP|v@0q%<^X;E6_U8~k!&uWd z#+dBihw`-_{B7_r8T_l@zYP3O2Y(0ruQd4I1^(l(?>3uW!GanNB zZUjB|XX4+l8S(!U^lK6Sb}tnBa)^IV#$^94l;2U%+n`^>So2pN{HKuKqu}p=|7iyQ zE5M(*S(?jKHK1bBKULg?~A~n1OFRAU%yGp$G?Ey2K~#RAH)3Z6!5LE_m5u; zd%=Hq#+toDjH&$0!QOq~&wNzueT2c^1b-X$J_Y(&@-4n zJRZ1>`PTEnpZU1h_XftA{11V@gZ#P~{5kOd2k5z9NdDZW4SPYq8)LF>AM$4q^bY73 zx^$%Xa?mrM5PKTHIpAx+-+}!v0lf|STR}gL{Q5ZP9nd?Bwe3s{C9)@6y$#f{2lOr7xc^E zum1r(^GUJyPhTFCx1BNBy8`~dV@%~g2mV8#uRl=ieI)P+`0p6_+u(m5=-aS<_bF=$Wrec{%G9V&5w4`%A`bANU7AZ`VZLH0W*69}fEX-wOQ- z&^w?%3H01;h5lmT4%)l7fIstTvF~G`XTB`yc%|&wNJgeJtpGkCFJ#1ztZa_C)^Gj-xO0QZzko6Kui)PU`Z2VBmw}%7tk_!veE{Y8 z383ddep9g*YuO+?T z2ktvpaNlcT&szom8Dnl=5dQ(7cTk@uTzos>zZCp!@K-_a8x;E0z`31*UjY6N_}>V6 z2kXxt25zJM_zL(lUzGIx1oX^%McyC3PVB!4>AyShEx<#JIX#HK5A+V?KLWV#(5%{T zZUSfeMgCI|zm529&{xoYydCro=>H0O-=z}&o1kaDB=-Lo=$Ri#{k`M$un+Y6FsAa6 z`L@t^gWd-HAn3;)D)KGh9OOL;{2lN=6ZBi*kJo^nxk>DKFX(4~O!R#Yxc#Rh{}%A) z!2cW2>q!4yUoZBzK|hZ%*}n?ichikL{57fBFX45B_r*ll{k0{~ru`2lRQ++gR^i20im- zvG*#_Gk+}dp9y*n^j875f!_uG6VUf*&^w_2JLqk+XTJnJ^A*wefBsqQ?aPb4`v9*` z3f{$-%Rl&ML2sWe^d->SpdST2Ga~e-0+0V(%10ag9q_*m^ghV@IPh__kKX`)=Br}w z&p^-JTjbyFjbeWr^8bo4+YA0-m%bqU`+&zwf-eW|n-hEm;P1NsTj zkDUd&et4p z@fYR3&m)0zHwk_^@QKd~el_sP&kOzt@cPYyzYd)Fir}9E=e{cVu5S|k?XL;GKXBhS z1dlT&`_ILBmWKi7?kWDQy7BMQr`pRk;A5YY`}`jQ&U``e*>4to$3edsxDEU~;QCjE z|0}@j-xhrTw@CcHn*~>ZPjm#|z?k1ly-MDf{UPu;-gmw4TZNtjz8v@%@QWBzN(O!` z^1cds8}Ge7;B7)bIVSHdR2Y-KTkw6Dcf0g!g#IJYS3tku?Gk_dOCtX;V>&;X!F$Xv z1%2)ZLO%(-4g7!f4&tZswTSauyBU-IHtcTzuLHjdxC8t}#+1JCn?(K{Z;<#W-1lsO z*MYABJ_-C*;12K)flmS7_nl&24)$FNoCkg?V=nLT&-)mY{j2cL|AM~lQ)1sk-X;7U zyf^tY;NvIZAI9X5CCESL-NHY9gWS)(7rNQ>#k-@^4o6}`ELaOK73#3d!V0qo6!IK{UYx&&@X08 z@jK5E`eT6CUkG{NUjhG*K|cZe@4hbab8i;@X~vx2;C~G0C!Qtr*8+E*A^6L{$KNja zwjYrA*C75L#$?~XGlgyguYX3$$MbC!=CIJmJ}mJwmf$+@sj}efT{`YxejB)s_i^s~5s5#rD*S&B+__Tl z^IQynd;$36ON9OxA4U9E34S>6iB|}Ip^IN6__Ho<2)_M|6rbwfIO^Xx@EmZHG38ID zCH&XB_{D<11)OUNzURk;|JV`12Y|N~1wR^i?gfHR0Oug@hrsJs2>sq4hdlUu0r+@T z=uZJ2s0e-!@X4CsQ*L})@V!1k@_4-S;scbbzP?$;l>Qvj`)J@g@LL#j`d=sUzr~p9 ze=Z~a^Pm5#;Pn%NFJw&oC!ZtyYrw}4|K-3Zt`+(x8B=>!M0@t%pr3la(06=N^p|?cQyFeE5iRK;PIadzL_!EJNE?9 zce~FC?p!Q*2>AFlf)^N5d9qNR9>tjSwW047;Ll77|7SqYTqFMaFVH)n-}mzrpUO++ zXJcdq)fdK;z7FPpM?tTH-Uc2=dHNV*N`LzylK!7ECi~p;>UaBs$ZKCD^=B_*&c9cR zJyqaS$iHVWCQI7$V*k5cyd?NX;2%JG?(#+9@1VTQ0Uv*+@ITR|KSS{Qfcrqd6?px) z(9i#p$QyW?;IfOKE%;fCDSajQe;xE3#)*9*Sw%_8skCj_6znCw}GJ@bsozw0Ouj|M*W6Y=+J-1xti_sYHk zocX!nJAPT@4*>ri@HnsoJa-3qAN%#d+xi866Sxof?q3mkb?`3&AODf)I}Y3i{vh!B zJw)EEz$ecaeBM_@-uk@+=Ufc>^MJ?yPUxQj&WsDb!`CGK$-fo67x)DDuL3>}{m7 z_&D&jz-{1<0iOW=74SOn{l6{pP69uiF||jhc8fia0bYNA;8!rF`nQ7m_X*%#_#V#B z!Jqq$l=sYcM1BYIFJesc$IlXZP2gj{5dJps@mmFd*5&`H;IqCf@!O{a4*=J9h`bzQ zYTtACKHF13U*9G4H!>#w?ZSBCX2z7BaoGQB@E=>3@yG*j5q*6h5PS^yPJ`R0v1%Da-{Vro_FEd!*zWet@U*Dwk zKl_2V0Y3^j1N=JR0pRZdj|2bZ55%71Zx(y^FeZOI68de>$KNLOe{%WXD)^HwzCm!` z55?YN|0?bK0Py%brT@^bj8Lhrm==zq_c z;_pNJCxN~V?~lG4I0yVQ;Pv}Te=_i6$m@u_!@%R;68vi5xqlb@P2k+O1)uXD5`PZy zFLv<*ME;Y3kM|4yC~#&-@L8uM{yOl3f&0dUeiiWX-Gbi*T>qTt|21&#^Me2OCnE3I zO@glmKKW(A9|UfHN$~A{D*OW<6}%6){V~B$20ry!!5;_i`?TP@{HMe}{t3Z{fKPo~ z@C$)Yd`9rsfpeb}eD9x0{P8ac&bj!3lHL~s=RP9zFS_)*3jMY}NBp}Bo&e4~Nbuu; z>-Q1-cHjZX|E?SV9HIZkFOZ(EiN1rtC*YsQ0dKpP@V^DP{dM90rc3{#;B)><eL;ZdrWAfjz4@mn_20e%Q$O{;gfBIe`{{1xg zGkwzj+~(Ja|6swRj7k1wkY5D7@1r9BIiR;8|HF()eg^V?4gSvUMc(lLi2U`Z2re=v z`8mjc4rA({<}jc52xGRlE%yErI0JnCZ-hP$ya=2FeiraC;14qV`i;68ls{f>Vi@=t;P9)#~in(9B4@xgZBOhxu5 z9tgY+`ZQr>7*7W2f0r8AHt^#O{Coqy*1+#F@XZGPrh$KE;Qux7U;bgx-YElLVc=^F ze4T+mZr~po_!kB~`;UV9?`Gip8TbMNj~V#E2A(wV#Rh(;ftL;3H1LxR{7eJ?lY!rC z;7=O3W8hm2{3mA_{xR?a4E%Qn&Kh{xz>hZYvkd$S17C08w;A|D20s4ReSI&Y-?j96 zA^o04zsJ+>vGhAezkj6P)%1G;{T@fZYv}jS^m``#o=m@|)9)YX_YC?yk$z92-&5)L z6#Bi4er@`_lzy+K-|Oi20{T6Ney^e5bLsay`dv@IH_-3-^m`@!UP8ZD(eFC?y@GzP zrQgfx_j>xhk$x|xUzFYdMBy9R{w(78ZR~$G#ow$nWcuz~8XoE&9^ExIymP52Xk=+{ z*Y2@h1A@keMt2o=4($}QYe4=ds1V>R$^R^(jg9mV3=D$Ti$S5og+L(dP@zkKV1yQ} z{P1q8G(5U<_i$n77(%T`UJ5OYm3HO_mPW1OE=~!{EsYM04UH6wL#4s|?oz=G-8Hf^ zZw=xxAwoh8@jY}AU|Am|Ko*fth+tl0_hnXDwc+=(V>wMm$xvyJ3p|yIIwe9 zVQhEF3*9*~Ha4<*tgtjNT!hbtONGMD!NTZZahJ7oSKi|-MtP@H92(h8{~s9|+C4nF z+m%}!*8k^)y7ulY>>707#!x1jyc=cU;G|2*E3pKW>1-cqE!r9n5z^skpgCEYn*DoQ&C zM@M#!jSemCqO`c$N&!bm=tw}<0Lm|gx)npwUEaX}yBj(b89JQTMZ3JCyQ4yPm2?p< zZqhs{n z#mi=A7boWX7H2227cD-N!2W}Mi*qbEl%&BnN#$>#l^z1y*N0!b6{jB zzk6V*w0m)~)T$L0C#U!3oB0c^=AN~tHP>`{;M{N3mYXZx80W2um2XfwTF2z)GENf$~<$QUu(R3`wvAslwWrY<|$YQ~+ zHLca=BCBhvOi&h=Yvm@)s@ctQX>HM=j4D^HMW!qk?V9U?##&>sx#EzSWJBI@V?_ly zYm0S+7brs06>&6ABID$*m90vVOtDt$`C4)Du(h^0IJCQ$QJUo8as~FHp0PEjuQ^#NM5MYPXeYZt;R|ylzlVp*wqjr z-~m^L`ZvU?LIZ9I@MoJ;ahDN`?42kc$=3?x5_>xD8c)HL>XPM5w>+;<*mSv;uPoSy zEjKw7Hd8y2uat|S%rHq>W)SIswVZF3k62LdTjLTYxpDP_$-4cvXEi&Ni5% zqgtr$DAhbjndCpYIp~KXY6P0)LbF<590-LBhC+t=mbeg5Z4zI3g~ABE(6Nt(SgExR zg^BG(Yz~ynj37u+i6Dr#LxhG!J~cw!@?ZonIMk|gJ7@CiIc>zztDQkY4n&1UrcUuk zrb1C-j8-(R+=iZIJqy^QT!r;4aKi#wpa%ww)CmC_U4qnB7~uv+I4($v6ctR;Bz1W- zNFK44eqx}O(Q5^3rCqRFR!>|)x$=lY(39? zg-UUO+Y8M`g)g+ItuDK&wf2C`MMUbGD>hBnM9i{PQ`Q5n}>LUTmt~>Yu(4=M0S*9qPuq zbE#TKLMAIV4VXhhT(WfHvE+G+8{Am3k`g8_txY@D71BP1;`+o!BR*=D#(VM91{KaI z>V6vRIQdGfW{n=L++&E-?=eK1;HH+duMq8douz20><=eJXR>OAY~8Yo-MM)5x3?E@ z%$RN3PDG*5wKChK)ILzp?*@Bi)eYcOmWXFIPm|2)~1WjDRqG)u#mkNp+|EaP! zNm&=or&?#KHtOFni|hMx(`78K)$-MHL5=-Fn#1fg*0PE{GppHR4^n9WLv47|nxr(+ z-@VwahB0bZ7g0FEb}P5_B3Cg+7r7XzG3Bls_g-;&@Ahz8voErRi&Mh`n4aac-+N|; z@%z+-q~}=ETyRb^jx?R88EJzu;Z>yQ-U;rUQk9?TQNGbAFV_^L!Qw=%d)fD*EtQ*U zmJ^=^Ix96Gya*asQ9M?+nwXrSab)x`GBAjYX7MLQhA~8t7Q@uN)T$h&Y1qn0h@b|9 zYQAd7lF=Yh!s9WJqDEp%YZ!+`i}Z<6QeA44U~X6sI@GwDDPRJ*Jd$Qr%S{M1qp2p6 zD=YOeC~ZBk%<%fJ;iw2n%!a8<6f;b6%WI^-gQXIU4!X0@(wZ69EqtmXZ=ff@+g;yE znTBu6PChhj;F>5=O-rI`E{D+!)$j?2%2Js@sHhsZhxZjCDcm52>aIkZT5US{s1BlH z9kD8*NIX}?I)kApZtP&I{E4znD3P`aDb_ZBmKySrPZ~6Rp^>^p>lSaQi_GCJv`}-R z*)rNC-dGpf&UjiEQ@U898M1t3xvuR{7$bRu8XUrhh=H-YK~>{dqvwra!Ahf7;=tk# z`l8Kqsm3J9h^x4KPa4!<-86_t)y70{WD>;^X+14{Os-gk!;O~KRH)cQF~jeiyiFKMAtyx>JZGzI$)K`J@|9MMJTXZVNvC9#VNZ2tFy8nx%Z!t zOyY8Kakzr|q@WbFR#+^osFetj5?MLCk$N|taQ%svwO~{pG;1Q7ff_{l&>cNVNImaZ zwWeebrPWJ)-LdO=+8ecuoHN3W>~O5AeZ-nvDbtRR>qoQgq;(xy0(3Vxd88qh_+fq? z`eAj|=Tr2W;e~RwSS&bpgN`FqDmc?naMtQgKCQsBqV4_s zU$x<3gv%O=@G?(`Q3X<$)Q5-)>#^poW$H^ThY2oIvAk?Gn#|R3gI0*_Bgt=3tMy+J z;5(2yE;ERHZw8U;RnU&S+EBj8T4T-R6>TR&XCSu8a(zXeMBo(-Ej19KanRI>;|5h| zbeh0)p-(ibw6nc|62;VAk7DVr>cYv{ja4b8?y3|^52~n45Npsc%Y~}4^ngtRg|J&) z^1(VUuIX9gQI1&73iaU8)T~9Dv|2npr`_hsmr4doHtSI+=O}GhEAx4^;C|ZZZSaw% z!r>}!1o=!wDGDkwC9?~uHyIaF-S?$iQjnsg8>D#YI-?=oaZInv!7B2hkrq9?iz;<2 zi(&`$a7J1USH>+LuF)OTuDdBR7cgJ}vJ#ZA-js9>6bM+NVS4&JQ?H;aK} zG>d`MHj9DOG>d^$G_7DVxB7JGm6z%y7k#^!gAeBL_LV`S zYQ4Qb)Gv8a6|T}ouXN!DQ9PDg<-F9K^O(kTg8?-`@E1}s+i8wn_EN)wYUi9_I1ys zk#fH!^C~^qeTrBA!;~(Oy2LUQsj2cB&XBJ7NL~vRiW4u*Yl%Z~yv8_0@!I1M#cO*( zS+$+0?5E&B*3+svHIDl5&^yv3#YPzDzmstjfe?o=Y7Ws+FWh1fqPv?B+1AowYt1XA z!biu7>lJJ7RCWVJF`VpMd{$6ZjzoZ)vTxnL=P=$!(%<%(gwDA zc*){Q&LjyguM(WvFH{+u_E%P2&cyVryY^-yx6zb<3%?c#L7! zc#^E{LulfKY=u&caCNdfjyOZZv~s=@M=nmT*mP*$tJ7>G#De5iPbM|UHQp?GN3oIT ztivhtxz-Y$|EGNQJVWG5s1qp#LIU0-j*#!H0?R%3JWt;C{)wVDBa5K!wMnz*<_LzF z#=+WT%Q@1GXD&~hZ(gQE2%&T9mAu3IQM0Xz*JZ{shMBzdgp=cwqSE41V-n&sM5V%~ zc1wcE6}CT^m6CAkC?94ywo>b6yHI$&Wx=Ms_F%A{`@$HL|7xX4YM522l1MwI*G9Ir9Nx?SVx=5&oM*5w+{h7J$$#<;sqSF<)qqsK65SLyJ$Roqxq z7jJmds13Co-i8n5t7cPomwB?fxXk0}!DR+-mvqkAt8)xhicUrZ6&I;d&r1iXcwQj;A%a^n=VFK3AC-QD>+adr;K2ZOczIp zOq(J^rB4x}(#V9s+{Q~iQv!=e0Sd3)hEiAM+mL3GtNFDhI#)vTC~MX(&V}e)@goEE z5ryk2W~T7iHjwF5zUkac!SB`d$QxAvC4k2vfe}DJf}+MW7=HBlhQQ~EX$5?S4VnOx zF|sx>lUUo;Yg}TZiZn-8Enl=hXBs@Xh|E8-CNey_2uKNuj36YrU1gRoHm^%lqR4b{ zi|-Q{wM&s&OOfHR%@{{ou;cv1uHZ609BxZEqDvn0Ce2=z;+7+RuPwB!zvPFjHx1{ zV_g1cspW{w1((=^i!ZdAVp61_ZcdS0jw@ZGV;a2&J7(=8+|fr`0a`CoBJ1$z7`d^B z*mT)A)&|gekV25Ir7*Cq9!LuANl(pVKt?nPEiX7`ZO zQNyQt)X<4;Nb;#g^2x!d!4RKfGm_!2wR%faUOxM@aOdIEyp^7ac;Q~fj~5^n{rpeF>4E@tUT)EeTLKjQBtVeBhbSW=;Bco#p#{kRCl6pl z0f7-MO^MW9Rcvjo9POW&%F@0=wpFJieqQ7-8?BrW=Ybhld^|^VS*;dF$zyT^CcXplI}Hw;=3(K2>2~XD)6DzY%rqcRAye1tAyfpFCadVdLA%4V}D)N3-OA)8xqJS z4y>pl5KXDHl@$*6i?LTV9D0|9y=xtj)9l;(fYx`KD{7)tGZ^ z-n9ylTeb4)j2W*m!s~U|-Ut*kCqRnYQ56n-i@?}FVFsNX+(BR}l`T>3SxSKcPXPyA zK!LQG!=eLQyev@L!8T1-RMRFW$s8Dpz zaE{|Rvvf}=zsyg)sK->?5+X#kHe04AKa6;?W*emnlx$X4vs7L_$S0>!nn^Z==yNbO zk}u5i<|)4fG3OtZVv<#DYwU@6RY3!rfGo9sxX|F-+(%kx z_-QT8hki5S^~@Z_5BBS2AlPqo0>NHa92Da9!olD``SMkIeJ^t#QJXZBajw<03O3lS z4>9O84kyXACZDR+ns|dN&;}SZy{|DzexG4b0=n%U`v#k!t34ClK+{y2ji>IRw_z~O!t z=o!zHa3+in4sDPLK@Kw$f>a|D3}PS?f;2M|g4BpiV1{5OAViz)ked)l|11V`M<@78 zRfs{gl;~PsGWX&|Mu3^Q%%sB1+8QLpX1&iAtS5o+uCa}R!x2OE)(tcZ4u|^%$3M9U zmuMuf>j23tRIMdi+@obTzk#MDxVpAv*{twU6=Eorm(`Owe*Ygqa<4AP03pawP-DGp zi{1_KI^rM)?O;q=4!!EgBNcC$5#(uDv_4Kp3jFC+kWTx+hpi?J&|-A(O$WDZ1Y;iM zYj+fJzwPaAP$D-ql?#-Vlp+si68?dMZcjJ*k-afn0q?a=ylNRfLiw}K9+7eJ%ZfU`aesxU+`V89vAP?ASE!r4t1k%|@CQ>t0Zq&_gB*0Z3RU!BXZ zRqVWa3W3%wVpHpov%9918RluZho17ps6toNuxiDL3RRn~L@Gvy{pGV@e6CPk4UjtL zvBXqzDvw9yQJ}EX6d^th8ac{Pi71y>X{HmpHY3T&vlEPYV1VLY!_&=EeLz%20)c(c z3-E{Nky&qQAyPdK<({DTeHuS*8pySR-@?r{s7W=pc}2F#)G~L2Lu~Wb6)n2c)RRb^ zcVo%iZnYXc3D#IQmMaZJPjWTZIJv_pl(d~USbDf$nS*TDwXD>A zEN_L!NfXQT2zZq`>h1mR+2Kj$H7$)n&v%I_MelTCqRgJY%0OX{)kx>#RKey28}FSk zz2|Tl;&VK}5tGsC?HYB>U}9=wZ^R7{$r6)IzX=kGI3F)8}w}M#k4NtpJ*+v(`i_%P992w+>0t64+wX}kRw`|5hZFS5+5;o z7!l1MKkSI-4^+)w9MGWk4u4T3G6pvcdujV4zNW*T0AoxA)mVFyrvMo=Qdux&0&UvBU(rqBr z+r$cldQ0{kx|gmk={{wwp1Prb{R^osr%wqt8o`)~9YHz}s(Av3SWMLYN8;FIT7)js@z9bse&-I!t%-!l7hQIBp;(L^YGJ`}1RzEVrr0cLtCt=oi!E-$GU-~y9d3Y^M2 zl{G~P&5nqgRg-9~wKG&^S6Xzm{b*nyOJfUlUMw3bGL*Z=Gi`d^NH6n zLe+wZY7|5tWTN9;S-Nt{FSq-BL&dfax9YSy!x^d*=m1-G-$bB^lpxv)4D!+UA^hQE zkilX(`-1 z4wXpS7Yh}~2F7pZ$j%Elvs)3UaShZiH!zT+94NKRwP-fKOdpxiYA~}%isD)LsaQNeNI;|0G^xabAOTHG3LZ%%1DegBQe&D#8@*D zW6elRro^bFuY*P=YBZ*7j>crlXp9#|W85$rXHSe9Mq}JC8si4~=5A!VV#JTdxM3{D z4P!BG@b6m%%bV-(al=@Q8)C%ljB!JZ^q_DWPjRO<;W+uVfb-)A zS`D3#8c{jR!DE`hkxKTNKFJQxp#s#%X?l<&JVz%TYKCrhGhVpa%`jom8%ktpN<`40z7v8&oDcV_A0$0|RnNv|{6J61;rcAvYrxG;6u z!VdcWD<9_B9!G4@<14l0I5K~7b-Qa2i{-OFG)JAYZTfT+9VlTCPp1v5nqpC7VEVRh zEGxY-^GNc9=bn%*N`-t3PfKIKm=b;3gi0437P5+TQIGbaqJ-fr5gp%A_Y2&CeS}>x zoLuy}am$za!bW=Hl#O2T*V1Wlm?veTIG0-V2rR88@J9l>s8oy62k6v|8h$&(-rYB} zg`J%^FtysW)TE}H=#_lqGz1fOuY$`BdV03(O|_#^50>D7dqc*4ufg7!)oa5yW*zS4 zrGTaVUWXT!N>?&D)v6sZj;^@OT$@!EUQ)K{gLpLQ?85C9qAn~mwT4yDC-Gf)y+>cX z8UObF;Ib5~^jf_Q8P{m~Syi9h?xOcljn7C_tl}gsGtgncidQzHoph*nxJFAV6ZD!L zFHEe(iq@7rbk_&F50xgr>ID5B!AjZ=)f#S}=6N7cKmr*PA%mWPqpuuNi#SK0(m6^; zy;KqcBBC=cLKd}#4NFUDKuS1EqjEHypOIWfW=7Z&pOcZy5!o2Q7xx`?y-75AXzN;i zJjm}c`#l!-+vySUgI`ULV7Sl@3`|tniTeb5=)>;;c^iE#J}L#VaUzox!yTVS)sc8* zAyAHr)>3PEYSk+2RUaf*H9E*(SE=J!pv~_i{Bn(&*#~u_t19yX)PbryXEIS`q8 zbEnm4?s52g)Y-Xu)Gimjj+0L#OceMm;7p^@qIw%hKs4vULZfc7dHr>S$gdssd+j>M$cY29UKHwLRf|PWKO$mqH@xp`s?ozRP6>!1Xa7a?^3;XgZ8e>GOlQ~+HNi63DoqA^ME@+P3R zD`!NLqxd~1g+9KPWC0M6MDR-Z*4F{9$ub2i~cP&P+QP&7@3G^3bO{;<}w6)ABihhBf$pKcj8D~%17c-J`$I5f8pEkuD|ka65>+suYH>_ z;!^G}a~m=Ib#9XomvVol+l&#Ha(}Jcj1iaT{%W@wBQDSV^=>1Ezp`x-;*|S~z($On zaiwHuoUaUPV@971Kb#uHU|Zsocu_JyYtqvPN9oOadZuS0J2?{=V(+LQF0ax8BDdVz z`={v%ejZTF?>#_=ep`ILM3)p~4iBnbx)wcZVMN$iW5n!PBhn zjiN1bS_0$`>G?gTr-rVD(Lz}>TF^mfIbSPZ8MuqbCDn_qGvq6Wv=bu%wmF;HIU1bv zSDqtmpfe6f=#+Rgk+y{C+}VLvb;&<_77$LQ$g-MzCzD3kVflUw8)%Xx2|h7U;Y?zn z(wW3S^K23W4V6g@bWkQS&}Nv#Kyz&pclA-Vv-!Z&j(nrW?@1g~djc~>n*Gz_INyCi z)iW6>nBJIaIr)kjGr5a`A+|NzLs;#~LSLX39aHY7tmTi8ZDB^f3}I^IgN_?Y(s|;9 z@K>Oy9Fhy-?BTCWcuY}ZXw`pg#N&t&6J&}KQ>Bx7<&DGynWDr{Td{Lv3Ac zB*oy064cBuFVmMdH}J5*6&6Hq?Mm6{pD!=3&?~w$2QW&+EKQX7#b7H?(hQs?AZ z`5^rOU0Re?#bCHuKl)|!X#*y)(J+Am^%{gl)}W-UUwtC!hrCOv!FXPHYyzb-3*jtHjJSnB(EIXYj7Agkd|Fbn*# zj~VW_t6do?0{3-N3s-PIzp$K+yEh2cjY|+<2gElgI_e#PX{-SX> zHjQRzR8xp-KsYYF_(mNpeOn`zBf6I8y+yS50vuuQ*~UO2A~XHYBwB+;kC5MLHt3B$ zvYwvvS~e@IS}lrgyo4H+e~J>7Q$Asiy90|3=$dVwV(FfniX|>Pg;;CSccy~*>=Nia zQUsw}2~aW3E-6Y#_hO>NxRbDhr6>Vi+G-U$x|D%5y(_YGI(a^vOeY?ijfm1iR5cfg zAkn2Q9MO^4O3-WmNPWOaiBB1fr*w(bC6<||nyTS=U1o-Bu}0%#jm47Ut%x@w-iCM+ z;w{)2YnwUO@YA|G6o=18O-X+k-E=hcacD%_&h&bhGRp_gf(46*4P)v(OgaS6syAn9 z^s;aCyv1WxCh}1(`W`b+75sF>vhZ-HE1M*{2bKlftW*(7>B2VIrMEb-OnU1R%XD#z z-Vmey4@V_LX+|j`Mh67wsKp?6n4Nm>hgswna>~1 zHf82PVxq{0=J&_O?iRIMyx_nFX^9xxfZ|sUtvL$OwDu@O)0%=1O=}G3`#5=Lt$(i7 zJVXZ{X)K{RL`a6^exO|6@m((z`cAr2s@O+;IV;v`s1o~O;bN?4j$;nYI5=pF8)6vp z$c9~`l?=@AEGN1WgG*M6!mAu0YxA$r3I|xUb4T2wbk(Nus-CMWbDq!as)ESX>Riv! zO0PoJ_6tf{U4%iwc*5xC2AG!CW@<%il^!?K+oLd%*2#j3&ppqJnmtM%zc#4_`se_! zuuZvB``!%?MUAmtg0r-vMa#&>BpoRTutX&>z%WmDL_-M)aj>S1xp+x?W3G8RhrAIN zjdHrPnC*X5+7H$EzW&Ch3*W|O8I5<8O2x9VM#a`k5)|Wt-Q5=!ze(1e#l6U`GM1YD z9Z|-E37gMdS?O9VfAqi@f<_7D(TLvF#PdX#X8Oqd)ah3zJ(d*akblA~F$u3X&!j@@ zv0^NM6S*^&vcO+wZrBz25Txn+Mj=n{I8sw++1eBZzVwNa1))I?==iI`y*Ek0crj_9 z?4^agsngFPBVx38>P+*eFC4v};Y8`}LQDF}hjj7T@%v0kj1iq#`0o2gY>h&>tky-R zZGA~Zsac{OL%7P2j(#PgNAfA5?#LxY^hE`}5wDh})P&#c$oShG{FN}}b+0*~m;GrR zQ)?P)1j=;DAFiTVE>1>Fq0-JLX*Ego1*!`BLM>98M0!G<4(Xe5O1zx3M|x=^h9X7j z;jfxU8Lo=Z@KChd717(JFjZ-VuU}GVa!|7PgSbX8jm^xEX0?*dmn?eQ)Sv`Mb;{Kd zBV&ZSRUssUR%}XnuabwzNBEGx47wuAcDXUdPZUJ8<~Y77mB$n;cP416X%Ntn(C{-- zoktGNLRBK^!nL}u6&+LVZ0lnzLo+eVdL2fXHs>|vVVWw}v1+M-_S?B|WHtJYOl(bU z$ws79tq+BLcSVby&ZRpxW{2L0EIy5LmA*o~-=Z_jPF$sJIjynU<+2Gp3?h`Al>qdyQ`Fo5Omg zb;>;)pxObi#S~gZud4{tQ97pc(V^NVou3!ec{;%tp^{#qh#FQYtuAe$LuCe`|fpTkU`4Z{8O&E{ZWaD>2Y5d#DcrXMv^!N?MJ zuoM|3-}%T03C zYMoZnh?_@6{=$-k?xkt0{KZsnATB}bL^3@|1CBzqSW%u3s)X`Gg8Z}=cmjcL=@5SL zng2I^4g--i-wC-&9|fY;fXba<22!29IFuwh_U~~3&Qj|kQ7E9%w^*XDz%SDCHi!F4 z)h4-Msa2wL5=II5;Tub_n;<#*fZffV)nl!VvobV`!8 z(IJl^y(&~Ft0$#>mP^Y;I$)t;mSp095iBY1EMq|H$6TTZ)Kst*o5JY&^pX}rmKW&I z3?*F)EZS;|F&t6~2UXnsW;;mxz$)!M_*T$gd-zysFob4ZZXO{TenV8}`QVyz}jZp6-7bj7u(8&fUQgNe0e@}0(9=hgIxAQ=(*Mz`eR zEH}`I%`0|XS>#Q8t=jkmZMjY)`6O?>PY4bA#MwNrZw8?zl{vD9%k`{k?0mKbzWAp_ zQy6WG&lR$S#py+oah~oo)!l4S0mUPEKE~fp2{-#)BWPd1@$S#I;oP|c-+Z4d|ZdKp_PpI_7DDS}`9 zT;5=1b3>_W8BqgmipzG8`g1?EtiebX2OXm7qH#6#(x(Rc><#WrywW_yeXr!>w5n|? zy8NjJqrI7CEyBWo3CA4QQteOhW_@|`r?AN1E{`uoEo!ML5GNBwS(&Hwsq*CZ+{{6R zLe^;%sMt&WTD@BK@Q{j4k8D`0p2JkP&e8l{Tu_sD9^Ce(-0*8Ntp})7qO~KKrR3AV z2fYLpDW6%*$fXnDQ`9V41<@2D391VJF1P!G=bWkL3C^6W#xLm066P$f? zpm3$N#D3aQtJdh*+;U^bk#d6`R@h;!=D8i%L2sSWA)FPf)wrNaugC2;LMQKSXNMMZ z$+Df=&K>kV|KY|CT43X^gIKadsBtABU-la}MaeR~CqX+Al-j0EgC+Tc22Oi0aFYFi zR8+|*eY(7A73sV{+A3)TkfKUD1CY9BrG-yj?Ip6SpQ3XgR$jg`znpFv5}j!kBAG3x zT2(Za>83K>sv^luy{d@XG^>heOt-4&I@2mdScyxgai?!B(B@JqO`W$qn2tJHE>mkI z>1m^3aav6{CyvymRU}y*4T5Q%s-B)Z)d+7mB4K3!{&9Zb`;M^_KYB*PUkF6_;;avEG_SgS66dinOb+ zXkA=(>{g21A97fwc#$4H;OF5|OnKU!f}}HTA8(C!>3)e!oU(lCKa~#2s--y^W^HsJ zppjnMQf&G;aVd7Ntgd3!7Sn9|f;zF#o?1EO)HYZ6_;+e5Q=8bZXGs~2lITWsYROA= z?#4-k!n8|H>QhEet3P>5YxW=1n%1yW)0+0UQ&*khz(iBaC&tpuUU-;yl~Zdawjx(W z=ax7(ar=cZhG?68Nt+?Nqg>7wF1?Q zy;dPvpU%@e!DYuP(w9f*7O6U4>E6RgG_{m}v{J8on4gqLT_s(9PFbhARh_8Lz;*KN z{iz%mF?2Fa*0F{{b=6~{mhh5Ulv1ymPd~k$>Vyk%RI;h&Htpdp@whY{$-4Wp%Pw1- zp-V1KjUHomJ96q%sa(s~1RLtee4_PuV;j^nF3CE=OYlT7UnhT1=is`4Zp3eyZuNkr ze1SF5JP0RW6?}Z?H0|W4a2PL~;50^BVXa(}uQwwfce*Q$B4okE^ z2bCo~{L!@~Kk%V_GrCZlwH?(?B|e@s)g|rBpuXhYNtc-D`xJ+{&F6oUZR|8S#_2jA-E>SXnQFGd zk3A-(t>*-j=4navhMK2kB$c#`rlMsm6)iiH)WVmL>B+VQYNnE}w^MZG zRee(_!QxCySnkAaPri65t!*W})Jq!aTZjBw!IV2SN;1bt-GOqVyZ)qM!M6A3on#M` zUP$YWX*i7Z`0I>G=1dAJZBUU;b)Bat+vvOY^xPiZR8O$VrgHJiQ!;BMT&|bso;ReCh0X#&EAVsQF9;_E%T{pSx8cg`n$uDGtRC)o4Z&!Jm+!E~tB)?bXsY<-Vb=L*b znYerD;=xgtzP*}wlglkbBWX?QqXzh@Uy>=Jr}zAPQd>reo^m90{Q0dUQmS^at=mh&9dR!psrAP0$QsPIWd`-!pi>lj=gtMmZ-A_um5NnEBNtQLz)3m4Q zne0T{XQf43wM{%l+?XYrB1i5WH7@4wk|nI^$Q)-<;z?@I!a)iT7<+1xebyZV!#NY8|Rmnd{%v#cTgxJ@Ud_hS3(MC>8;xB?JC2C@yWc%rANg-Egkehf)Qg|9l zc}#V2$-m~S>q@66AYr5|g%SZ}>AWhU`?8VveQaG@@~*boBM3>7o zJ&E1~)AS^I7fjQW=xs1fPonq1G(Cx)L)G-`PP8%gK9)E%kdmI1+Jls;X-c&;rAnGo z9ZjiNYZCY2jx)05B)1OhvbXlGs#})*HuZ;OVWQ=(%GoZ8U$DK&1RDp z7hA<0@_k)-)t(R-_tcBNu%*0-QeUp+ti>Xer@sk=OV{hN5};`EhYN*^QN zpI@>n>UQ2H?e6zxhCH^rnY~7DdR21g@?~e!pPxEo{hM_J@(c~wykn8Q88BnUi`$r0M?M@IZ;4r}|yW5xPI~J7&&7XOcz`P3w2btQC5| zV~hGQtpwBHudroi(9;X$ts2V7VA5IJ-hW}fxw2VzFM8`qOx>G#EdIB!V3XGWe+vsX zY02?)EtqXJn(pLcb0*BEYr*e^_N^?3hiVR9gW8%L@b#zfg#z8xMVGm~pGS9Tx*(uj zt*oT3J=>~Q^V}3~N!mT_Tab9QoUpxrqPR(`SiQA71zE<}k~IuZ_ojV$h1X-#)-tf@_VuNA6O9=Ahl%A7SlRf1;x4PQRDXl&8E~Nssd#TzVuOQz;+Wtdm;3Nn|b z+L@}~q&sV8s(zF1vYn~=O}d17hU&Mr+Hcm)*fUN1*0#ArTkQO;ZF9F)`_?x2Tif1m zZF9f1t^L+E_UX3ubH+Y=s)Kt|`4)`uO%vv3_D*lo1JgZrIFS}?fhS~1##u|R1gK9@ z^4yu%!1!CPwL;q3)#78i8yPCqv+CT@mZZCAsjoVwpWSrtc~7fw*lLQ??dC*VW}v5eYugMUaQKlKyh*#{9ap{n)#}5 z>VDQv!lt|Zs2@b##4l&{QlbN@)7^NiSw}D7(_iV8tD5apsk6Hh7g?wC)iS-Bkz$pq z+x1q(yGWZ}!o5?D>6U9f~m@s*~x1ha#CsTF#>s()X;R;*agwC$wUFh(g)dEvn~fgbCc+q9?bd+7Up%|)wV z)5iuab(V80yiZSF>}hS%H^)vZ<;!%iZ)-HCIydvPI{itLuiI~4((4|hv?tb2R_&ry zp$GWr%{5u)+1@|LpSHr6!IEm$BGe{&PBubcvJZM`3UL-Vb;o*o)AFpRFg4ezBUPz8 z7FyGCE7Yat)P1z7Z!bIfYU+;FG^gcUO=W5hR!hjdGM2i7HO*-`SW}srgJq*8b?>@r z({in=FJ-@~H7I(zCFOB~q}ElQu8&=UMDA z3X@z!@g|+DB)NUETzx_u8$cigj_zPP|qp)1?HGmEanDK#w}Dqz(HEWqhJo!Swsy7$a_iht<-AodGX67VuHs;LjN#@K<@Ak~)orX1` zaxAG4Trb(AmziXaP4(^)!OF&an#RM%hl_x{;oyVv7#9kd`D4ZR>ihYQ4Fpaw=P1uH~C8C$Vl%GK()2(Bv?w zR#KECS;Kq{$*g?PS)f9x(LbH-CpXbj@#eo#63~#PkbL*#w0r z>3p(1Nzb$C{nKnL`_t3P&Z&_B#wIuE|K}8~6h$cJH z&O?1Bx8Z&+ck|bJk&ZggdM4)%C0QYrj+xE+hB6sm#oOL`8nSk&IWvE8lIdtrJuDZR z)%xPl<}YC&Et-zae~TfkWAjh>hjncJq5hDL;mtqU8`iP;i+*7po4?!_*0K3p9bp}t zznB=-kwP6D-u%~C!s$q%o)4!`&xcc}=OZc9^N|$l`A7=&d?bZ>K9WK`A4#E}kEBq~ zM^dQgBPrDLkre9rXbSawG=+LTnnFDvO|+i3X!9z;Iogg@S|>|zp61ENT#fHYHJVPV z(9Aq4(^#t&`e$2BYxO}H`l9j*ZRRcaH}kaPpLzJ$$mL#8v3#W5u$|1KX%EjX9PU#$ zt$rIRhiaAXa%xtye`$@E!^yDv!%0`UwtV@+FPA?alo2|;B;&->>D*P>u`*4X!}s$< zUSjcDMMf7>Wd@V0L5~$=Xdhy1q=!WRZW+6wZ|z2ZvFyMHJtQy0--Cu74PJ?_^jB5( z6jt)Jzqueog46ADxxK)R zOQ#xwW96p(DEX>WCT6xmr}J3TBZ*P z+v=2M|9SjZnR=oA^Qc&rZCd!v)2Z3>3wE{c(1#m$l=vkVgvRiCu}r$$v_D@nwpOiK zl}fp>gSt4{tfbSr>f8($XRNYaP^G@A=VYq0H?&$AOat_iUGkSkrT~165=z-Uq0RN?b6z`V_k7Rb@|PHTDG*Dl6r>9l@{XO zPsfd%e5Kb2{Op0`rR^novSK%Mi(L-nc9E7H<9+BcFJD=%!^7-L(^vEWAB}aI{p6m4 zRhewAQlXL%dJmB)x<}$zC34VK;Z^(4JxS#uhjV6}@#@vl|L#JaHQGhnk*5MjzsYia zh3l0B78L5=;||QE27(xfG0~`=exwU0XM2vcT&RY1OiWGe)v_mGbYZDLANJ#*==99e zvHLD@>5%ss#%-GJ%QhV=Pak#ls!G64N|@n<$W#?6e`vr^M!u?&-r||fu4kE(2lo}h-z_^29C>CquGVYq2XMA(K^zl ztr3?rR`P=zizBX~(XpQRMhAyB=4)0O^bxmO?R*}y^BLyqkV`D5Tv|ILA@o>Vt+|hikbUOS zX}~tM$`gU*GxKS46{~nA z=`593t>OWjx)!e0u3EIKkriE)D0b^_QA}!d2!qNZ9kW^}^AopcVtGvl)%0M>8I*SF zwvSkjDjj?2*za#C;>@G}mIZ9pc6!S@b+d#fp*!-8+90i#EH7I{ToXD!NK;53D0t+h ze8Uk-X~)m;9EI#BYhnK-^bSFfMX|0pSbvN?#l z+~RzzreyQKq2VtxH5w9~#!nF()Vj4y_ukP@;9vo`g60` zF?@nH@W?xUaK9;v{n=dn_t5>%oo>$jus59*UiZ-}a%$;y-(gQLwf=`y-B#=OII-@B zCiM;=wdB&gmPVcGVdeC)SM>R9bGoU;iw*xzBv*atGQE_dW!#dSO*yGsR)&}T&rPP8 zv0K;uQ1@7%iOZx76aL>wwOXW0FRA!kYwF!?%E?Tr)~ahW{LZMnGP*h07`GAg}Ro?T8zgMZ+%;ER%NFyOhl7|F;uky-$O7Hh7QJXp= z`W-2OcswrEe4=wmmcwsd)M>1$j*{7}=!H7kb5_>}tz!IABJosPm1a4fL!G-*8)>{5 zYZbG0%PCmr`@s_6Pse?&o z2!@!=H;#R<9;;P7O%Y37nCxbhPK~yTIFwltCkEIqm&|_$w+unuuf8BjJ5!8Z5cJHU zz1>XIsnI49M;Ff>s+Cu}WJ`b?BcCK}pukO7msBpT%}-B`?Hn43T}5UO6>E)sa-;`H z)}Vt9BPQAk+J~Y>D28b+&zoMJ>BJb$A_}~icVTIdOc@_9ZGL`n!eyDC4_U-y`d@dB z$paI!Q{7pD$&XeP%H|#FV>Yyt(XMnB0F0Q%fx6FM!PYW|m9h{a^uxG}tFDLtQ>3mmwf8wzfR$8^g@jER(A03S7K^z^G zD>NxBz84#{a;Zci5pJZ@*tF3>xz;S#T86Q){^IjoK|^9$S5%Xd<(*8YTk|8C%4KB; z#;7++rs=SZPY8Sk{x zN^^+(nc6T%)$p_ppL5DKJ&1Pto|t%`XV3x- z85_Kn?-%2FyHzVL&`~lvHxpO(4%H6V?4z~Qw)4_5o%=m{s9vO9{nL)zW235S8l3{B zv$0mOhlWe>7u0bj?jQKGUcNJ=+6IVmKA|+_aU|Dk6jk(kxz69MB75SZo=%g+jS!3N z-m{2e6k_FsEPctl*rJmlM&g3RI171ZVON8^XC_Dvx9#br=TnKG}d<=UJ|SM22V$O?D4DlRX&W~=&=K*CaOUbDV4v`13~G!sU@J}GKD5aYQ*Rrx|=1KX)f>9t&Vm)K@`<-L$^s3MX`BDjOx ztE7EEX zzq>$JMl7pH2kaw`yi3cb?kb`2QrF8Z=U|=RZ^W4ww10eqjcy2J>0W=ltQ~ywYGW?% zE>(SKXhhw$avM*NqC!m@JZhcpG@V8~wH35Nj~`Af=gaX6b4aOE80jGmeD!3WKR;cR zsX`a0Fe^90&GW6ml>_KwveU?u+j_rpqeX2rD#HV_6O*nBSsdL%n{L$#ykKwokjdN& z#_Ygpf{AnRGz71X4(#rq^e=wR)aVRTxl6&@Au;%%twY(;yrfLsE}PuNl`6_UyV2y& zLT$u1Lo?+9y=6R6S?2YtmB>*c608JMgV?mH^S0e=Y$W?ojc#Jmy9>ohl1vR^Woor) z)%X@sbS5kLSSgxlHCNPvT9gv+8j89dLqj*ZT|m!3M^<)&H}=X(kdHn%AS1#l`JB=Q zmu`&6G;lrBc#SiONCjhToNoXj7p*1J6(?rcw53#>73QjXD5}?IGzq)IFx9 zwV7JcqG2vA$wXW)r&-*QywlGO!1?(5lDt0x+>~>0(T5pm`AF)(L@}?f5+|*z$WQI4 z9V@SyOHd^h#o-|}AB=N-g39R?AMRMYuEHg#zGgRNHb|2zdh^Jb8E%SVn$%SBEUTJ^-rRXBsQwfYm%| zJCTdD%$29LfikVGQa!8L#$b=>OKY>V%1`g?FE>}>yuf^Fqr*8^tEf{C#!4|U1ddgx z&fE<2^4ufPt{`s0N3{Yz8*MnL7QE;>PRjz1i}uJ0hj}+a$r1x2vcu!Icybe)vmRTC z9)IZ4mH2$>C4mXQSZA$ViMtqo7hO0!z&z8|Bp%8`c}?VZHT zQi8m)i`6wJ)b<;V#_0gh>G1_Msj_73s|7i_pIk9`-8>JMZtd_#u~ny~aoW3{YgnzK z9X|^W3a3)Si_zM?y1xOXhlUHc@>Pj9id0HbAcN93cEqwA`l#4PH+Hy8@tnDQjaJ>W z>I|0VfQ@yns3SGgWvf!;ml%6c=tqcs8X%b9nmtL&&@>J0DbH#)F9%Nsw(x!TD+dRO zF}Wae_6_M7=F8DTV+7PstIRa04|flt9H6I&vgIXO+gfgPXAe=Nd9uk8yR=NhDcY_vc49p9wS9Y5Nh8KCCDiecjBtJydn5v%)&Wltg>8|g6vXibr`QM~}Q5WfoPi{`pWhlM!XHXd4NH8)?JrsR+Wm7~j>i6fw0&z=TS?At|D4XOb?5}h?IR&1%{zf`FzKE( zUs%T87*A|(x3?X_{QC1qb(2)u+w{BE`2yaON_AJMR4NtmV`l*zg!)ln5=FF&k`dGE zy?B8R=ST8N^fTOVo0>qGnB~#L1mP`~(hr@I{xVi&1{=$a_ zo~y8k=};K0QYqF6hhc_;4{~w{zw+|J^Z)Du zD1K}Yy6%MzQVgr9&obbgMCG9*Sur#hlsS4o=}3Zi>_dB+yQs!-cV-*LWW781*Sj~r zC;)&6qFaMZM=1hs(h73$QnM)ytw?{)n(f^WO&VZ*S@QL{U;pvxho(gSw}i&xViEy)i93zGxVA@V zAYB}?hGDR58{h=Krf_#aB7<-`%~=AtGokd6=6X3^S!oe5x1$Em930@#pW zuUS3QGqtD_V#VfuDVSF_tE_??_F|5DF~_}_*S#2_rY=X~I8y+38@7vfcJR4@okeIu z39d(Ff{v6Dlc3-;!;S`~lVAU#LI}KIfA4_EM^6$cf(aDxX}iWc)#AST`YGO5ieHxm z#vN4tx7qN_nqJ{rQv_VLuoED5a@R$`2+ls+!UOVxAyEv1*Jkq#0fgyxC;apRV?N0x zSsJQDzfQJaFv&6U!yVsGI2@zj%x1(pZu*?4^5**HHfT1RulM&nn{g5co9F|MDY@vO z>)`a4w*_EV<^g6%KAZdXAMtc9v{%scJZ!3CI@A*hb-4>cKGS<~5QUatERbQL$+(Ym z7+y9Qycu$t4hIE{+mYKXWq1dV{qMiG@FKxgH$fRI$n9q8mr%BH3Z8o;Wklyw2XXsW z3K<(c5y`esuw3V=JqpG&#)gKAs%C^#`OE&j{r>8g#qFnNJ9)S|yI?Q41Ke|iYhL#Y z%~H%Oo?|Z#zV5d0R5d^t=vUi&54czv=zY7v(QL4eGwKsvBnWBofH;Hr&?Tm1)&W{F z;ijW=BP?_TtQw}kT(_NZ3TH(LEc+PRh+}B5{FeK4(n7^ zB@U}f;C*P*f`?Tl4y#HWR+TucDp6&Qr;klmM^z<`s!ANye5y(uRh7VVxHhk<5_oFX z(o~hGvckKrCJ|m?wUDY3c;VF2RGh0iR8^>IP*ot7KiH}0)>Ozgd|yL${BlcILpy-C z4+nTV=;vDeH0B_t`2q*fNW(u}nsyerKyLToUs1CmOHjOe*+WCE7Dx^~iu+R9D3Cxb z1rk0NrL>UIDO3E6ymtr?aB&jy!SB)NjC(IWsQBwYuswti^yKLUqSurA08{c~i@*K@ z>eJ=;GMON#s1fmL(T=yUl<_q_nIa;f_JZ0$#CHO2aPZ?{cMAu~cgh_2|J}6?bc7)K z9=O?Z+1}6~wDo||>&$o(KU`O@jd5-Bq=5 z8?T3L?`&c2i{@e3Y`lK81D(k+l=;jWlK_gQEEkV$h&_6S%M*dcy)kZJ#h9@;YHZ2d z;;(TG*@qu}pRY$aDeWb=X}`mc)RX(S741TX@(&b4CHQkb-Kr@8Tkw22UU;pNQF&R4 zvo#|sIixWk>0CfmMq|H;nVr_BYIzEaQ#6lfR@mdP6fVpG!5Aptvd1f?w<)_@M38BI zmQ=SgnMJ~H^+e==PZ$~g_~Xx#JcFENo|_H?fBd27|M+8wR`dSj&t6(yqW|4&S|Mq1 zHD*3R5lemy8T}=uMuOZtV4L*NE`)?D<2u+ra^o9>9*+j8hoV3_GeKa@G!PhX4pivg zT+Qg8kmuhA7=EKd#eIaQrvH?k8ov8lK0Zt>njI_oS!r^7eG*?Qs7&P(M#D>~K;dnr z`-0W8PAi05()nupRmz(0cyDjp?e0i9j%#oRoye6rL*ZoY&|-u*;~^&+NtvIaP72u6 z5sK}}Zg8lKQ80Q((*W#-&yO0+q1fU@x`hY+aWG_ZKgQU{IfN%ow zCoZ9y)aX~80{~y(aUd!~3}|p@I_xSggc$dc>-?IPpAJ_2je1U*Y*nB7DU174GW1*=jYj_-u z7V#$bQw{$=_pv55s)v^cW~(|68pURWfC`}v6j(}=h@gYa6n**yxmTJJYkb95qxbSB z?OK&fr|(egtE6DX0_JGfUg-p~Dw@F60wU_Zw2vu0-_FXUIR0A06M_RiFejW6 zz;O~mPg2ey*9eXZDwQ%q__|4;!8Ql`%)`T@SGZdkKsYFjRUus?!qR1LtYyR~U;gec zb^#JPfpGK-UU5uEzb^o!NKFM291#OShnF0=ggCs8tu^m%MmQkF<&~JE6IB3`_ML?q zvS&(JkcUX1r%-zQWGJhQR3yrZ+cXlSPtn9}cOJ_cXyB+n;dgw0;=C3MC60W#z-)tx zH{VNNmhpg5LOE{HgH)o>UcW)ZfjAw*?;0L`(5q?dzHEOWT1BX%Aizk9acOSaHmY&p zC@A>lbRJ<9_uLDDoM5HJ1p-zv#CPDjg_ak%QlZe3zcKN2O-FL%jLW^uRdq2TzgxJ$ z|9X3SbM~*B-)?WW7&I?_0SIjXO?rchwwq+it-!^BtVW?Z;13;HrTF`rQ-NAW0;BnG z>@2uZ(6|eE($5A(r2jboq6+k5Nb>b2i)XPKKZOiux5xngv>4C2Y}*L1-*L?S2uBTS zFM~S2dXXNvWh+)lK+tF~D*$b|O7Ot*GF*U-MGtQhR4fAN{dhTFJQ>P)_vd^u<>PqG zIET*H;BEV*MFf@11?{>@r~ipEz?hD5HnhA_Yf=L7!Mz19F~S`dFgGSoA;TOPV%Cpk zM}Qu5a1zjEU>Mv(HI&vPr@*Xw31YfjTy@4}1M4*nM?S1id>M*AbelP6#y~Y3;AA+^n~oCu~*8VlkA=KAz&I1*E`!y`%TOgoGPIH-8Dj)V zhHFUza4kwSP)^T`u~H@@gqTqM9h2%3zkC5=So%Xg(gLnV+bHpe%EXR%~U! znimJOK@Jkr!r{>DAx4k5zL*g4`6|su00oZ>6$~cr>K>P7#;b2#b2>{Ja)3Ux9YTdJ+^0B+Lc} zuk`jvV^|B1J)$wT${H)GZV{#lG`enz3hy*YMdLM%CQ?nr@08uoXD<#Y6evyVROR$K z+KYof$BVS_!INcp4hx52{fjj1QPE~0z=?W z0z=d@2_%)71QO*;0*YRdZj6S39w2bD_=20#qzkg^u*9J)r-Y32$gGjZP6X#I3O8^% zUXSl^7`>f0ur0D#2Jubq8ex-hDVZo{G++OC^KTp-bMPsw_H<7+l*?e^?O_)eyq8=Q z$#kD#@R^P{q@~O7QU#14F+d_jc18p#1u(&&Wbu7de8Xa6ph~ldIMxUq?zFDsdW0@& z1iE|zJ)@H4DrQ0JpytC?eO1H-KcY$_WQKz#O&xGy{AmmgAhFAc`E|kCq)EGURbFNL zsML8lX*ZjLL#>=fBN9F2#|t(OIjVpdah68Z&!XaOSGpJ*3uq}|l{yJ`W`~KsaomW= zge$^N(grVW z_!548b#R8LrJ=9!ao%Bae`i^U{Rzb&VSWMAw(Gm3h%kf?=rs{8b<(lf{XCWgbke(> z3df*WLHx!bAqV@2xoMBnPn>j49>@^*so4C_uc&Phiw9m(Aw~F>Jbok&KaO)lo?rbq z#wAjCrqFq4NXZby`N^MmqAEX*{|m>Ngn9#urL6mpH@m8yKi=dN|I^M_6mBV7IKvi@ zxrLv}QWd^vE67MTYSRcPU+1BxM~Hp6RXm;jTXg%R>UmhbNpmU0KJE7OkS=W9Vl_y+ zIWE=hDT6<^qT?bAH#0E1!=6#n;t>P{p4l|~7y*^;b~0;kUrn0hF^+u?U%h_cn^{fB zxz{=M5LQ`_zqG3vUAjMs+r9B!_mM9hW}`AyfjS0nTy5e6$e=aOPs6D<)q}v{O$MUp zDyRBmYOeUIZ5zg$hU=~{IME3hv!6Z%zN?Oo;yG9LUi}@8xcv14@#Arz$RBbGop;s- z7`Mat%-c4qtH`if`6fEfE97Vq@vWVv|vMnq)}4MmUJ@G7;%?M#M?h zYBBD*lPn!3^!Y)5p6bu}{nH3norBcD^C)m5#O0WK7>uI%0_*HOhee`3p$|AXgvJSy zIWO^aVLCM?u8@RLGofE6tEUg-EKeM!;a#NIt+X7+H1w0U>Wf7a_)CCj69Qx1;LW?x zR}{Ex+!a`>!U~nO90OGWORCd&N2A|48a-32yTE!TGDq8&Sb6Z93mTnDsUnKWFC}nZy0~2R$FdUJODR!)_7m zi7>BzcwTBo#SJCP?*|H%AL<0hCr%Ws)a2b4uyigG;%8-%DMJ}hjm7s%uCM^SvVbE4 zI5giDAGF89@wK6UW4_;-?|0_=efUNQpu64d5>6jcrq3iq$fO9z=uB#HS%QN%7dJs% zmh%$%(EJoh%)VSI*@Oy>pSL{p1Kx7PmwwWWPpg;s7G)%8aIXq!;wXzgV~Kl&-f-Z= zOo$&Na#IaMb-t$Y)1BqX0l;>P`~IOc>$By0`y?t>3yoEs9(Iz4OWEn;+6~Dt(A+7^?&eIR*3<0~~eQ+ME;WG)0@Rb$(@QLuU z*hk?ua$v+~3`OE#uaV9i^2`q~>g7-Dd1AWH~DBgf1o@kJU( zXiB&&e&MR<;w|T^%XUS38`7FNqb1^7w>#2#erE(;dn-`UD2A()GdT73HwyVQ0@ec%3lOhd@1TC zGMyX!o?{C$G$>80=8_yC#o~^cBPae<4sQ;&dbhjX{^f8HE9Pp5kkZ1w~aG zQI_VDC!Qx*RiTSQ+YIF)S4UaC@+}J(2SKQLw1|kk;08@bJsaOBD)*{NX7cVa6f}$Rl2x8*L`B0bBC?y=gHB10~rGPU5X+>dh`06Ud?( zNH!Ce!{LMCT`^t0Boh{g;*c9wS@HccEUN-iksKSIufobHl7ywR04z^j%F)F_@Dl?# zvVgFB3!Y)(3V+LFJuxxBM&{?6v| z&bIkG%k-UP`ra1(y={;8w$b0)a=f?YcyDX_-q!ZLE$RDIQc@c`HtK$&`^ljz82J0R z8}064vnYt&dJVx+G@niYC`vS^e!`+$@!i|CQ@wvvJel{yeM(NJ^tSD6;CSX4pLVXbjPRWX6X;WxcG+;vAjxvSYLk} zpRfLS6U;rF=OZg6^pcV=-2Y5l!~dpZDxwX~g8cdqS`0@JrzM<%K*onANZ8{94NGP7 z`_0XjOrA6zw%CZnj>J9&&%!|h76Rmzt_jrmbkI;?_*99WJ&^fkzPOW%wY($N^VNxMZ(hsxGYwd&|fTUwS5`BFTJwGY3M)h~?Q zUMXk*uZXqx3&U##VoqJhjgS6W8Pfi zstAvpsBCoz?TVq5&cIY2NMCgvQv(r{G$`>5@Ul*?BYs`w=+<4nHpEWdV2zw#={G2UWSZJ?Jo&#a2*jYP8(bap_A6(L1>4c zNF3IXC~|r-NJA|N#6B_#&U6#~eNs<~tl;qnJKb|C8{iG_T&;ua=?mAe_5D{Rhd0BtljuD=a8Di^-2_{ zN-&Cg_061~&Ooq&uOWtR;@m^H;meVKi>Q`KqMV4Fj?k~LU;GtyCAC@zLQL%aMDRGc z+HJkknI{DYRaa^G{lZ=>D^$hT(al}Z z)B*+#183*D2nEblgZ98t)I}qOl=pZ}Xz_{OSX5=?Y3lIh`r8X~1hDWl0LqdG0|HDosM3rhq!58!4XFkxA^q=TI=;hl zd(|KSFrKy?pd){sl3O1)?mpask7ma_3PfQ933+c(_;Iq@_Vq%lL(q%qi-&t(0Txi^ z`fyIG^^wNcF-!+Ry$)+Qcast$)Z7C7y-}MVgI&|3dMCTEYn5#zIM8!*@zlVjz>DhA zM^ezxj;#laQ1xG-u1M{Q4q)uq$z-2{-7hiEa7rYbt|{;5)^e)(IiAoXdoK>E?Mv7T zp2n?U>gv;U_bunkTSiM}M{9YVw|I3X4iZ=VIx`ma=^oU3y>&I{9M8Ve+q1`>{dd0Z zt&Bw4Dm-9#BTzPGBnkZJ5Ryu1k>SwR$0jeFj16xEJ6%B0yAR9Dsd8wvE7A($vm$nk zROz6L+~Dmk#5r-~X+^Ev=u0V0S;q9}3O%JTTC`hVajrP`q^X5*m69dX`8`!y4(^IB zypA5$I<+qxrhG;T6lbPa`t>vTD=oT*K59Y3MZf2lHK5(W<^BBQV0+wCbePcuA@C*- z@v#UYIIBX~ZE;0_lf97dV6JL(4pKr<=ND(6Uqn*3+;!RmC}Cm){n^vaLD?JU%>!3+i6@R(u3&~O|}Ps(-lqRCZjnQGcv zc?iRScTj!8H;^z>+~FlxGj}v9vL4~2XnF*Kq8XUzagfGx^XKGEZ8SX0CHj+c1x3}UlD z_+Kk5YWkkWt_gYmhN3@*??C^Myc-^Df}*EMH|&lZ1XYjFs*Z-bN7fjs=jH5Adc$g{v3Nf-xF(?>*oHT&U-j%Z75O9i0B|E!jUtXpifxq+(Qdws;!(G2_HfgYO^mvl;$81c1tUo@xeOJn z-%KLPkcqyA05nQe3%W@x-B5;ngt(Yv)8r0Y!7aAaK4zsUhbVER_yNZttTJsX<2cV4 zk#$YoqZ;i`Q>#cKjk|*uco-_4*Nq@VJD^2zdOp+){+>PFuN)R)ny6>yYNCNTDV62n zd>zW3%pJ;s5@2sbBaj|!eQ~ha)e>~?*&~mdJGiMe@Qn#0i-LP&0javcQu(U8It}X~ z$y0~L06h;oFhVAV8uy#OlRI}+K1&!I=luQ>k+GdEU=MwLG|FvcsWH7ybIJCW1=N_Z zo9#!)&Al01N5dK&^flwvuC}n1!W3HUwt`3>D2zkR>&3H@q{F2UUgv+2q(}aEmBHZ; zp4#l(P1OK>*e5-!XfcPlyZAdv+)e&Kq1ejzH@YU4Ea?V+r)Vk7-*0IMY&!I>_X7hJ zld|errSv3J;2)Yto~zKk-Bc)7Q_u$&sFWEWf*@Y~BV_1ygXe+m9?N7w z=PWUc;8U_ELGXGS?D{J=Bk+2a0C=o8*1t4r|n) z>NQ-JC371FzYU3mGq}q`=ka9d2|? zV5<(B=paJ|E7)wv5T12VM4HFhspmAuYt22zqt-9`JjH{~F#dFAhFzn(=qq!E)8Bat9(Fdi#i6ff~|-cMoUlS3qJYq;Usx zK>4C4;P~L2iqfP1395Y+Vpf?5&R%pXRo5e$xi0z03fgeKd#VN^-gjWjS|IE23N0QV zaE=2t-6KLTQbRnQulz%RM9xhz!umGdLBF6kSpT!@pbVpTIf#{87MqB>`ERCSkBGmQ z&6RVQ-B%CL_N;cjDZEWpA2DrS$irv)bwjQe)H%H!Y+Eb1()vl*VEv2*i=Mn`mzMKj z=lMy7y3S8A&~bhOuiJVky)M`wxCE|Mk=E!quJT%@NZk348@qUFt!uc&FwFfew519i zQFW{(W2Voe`a2vkp}g}-n|oYzT`6j5A4z}QQ&P5ENmU;Y65*VqiQ2xa?CX3Y2c7PD zxngrgu}{9igMl-}t%aVAkDDdek5$L#WykbAeZuaq6f_SWy~VOxJa#s2OZ25mTR&1J z{$|P;_wVnf)ce%Eg=IlNwXIrCR>_|?ih>-e>Q!5kMESO&cdmvhu|;bs@ZRDXeKa9? zjQv7bhq|vTHoaLlOqLh2Fr2Js?NW5`d3SB8ifFef;<4VWOVXgo4>tDR>|m08M#(|N z5{e>E#J%HSwhsMeOX7Dp6{al_x#Cw=d?g6UdHQ!OW#&FZ)k&0wHzI>Y5OZ@6otlmN zXyyDHq>VG~BX-Nrq4PI*vZ*3NCZwjKw%s#hVv-(9o5MWJtl_a5nYxxWhvijNS)bDg z*W_dOj6ocW5IgQUoFnNujri@OkRBbHc$_3y}{PB&K& zDt<5Fvpb2nO5&sXa7{KV|K5{3w>s-Y!-SAC^yK~d@Cpoj(k8e9Kck6=_A`aRx!*0k z%gB|WW$re`bNbH9iQ}o^Lep@yDJ8j1Jdf&mWpR{T)oa^!otlHys=>Vd15L?~)yP*b zUt)T3Jb>rOR8B)n#dFs{POyK?C}eyWWUyw1_HPy9dDX*`JyhB>IO1lZXxQ!$98g~k zqfHZTK@NyIlfuogr`=4_-D)^Hx|SyFH>3F-u8Gl;lAigBf*SQvn|m^3?dm75FU~}A zGVtJ5m9yCQ+}26?P{J=U!lGWdVnVv^gH@a=SGQcEi7(Y?2K;(E?0kRH))d+B|C$F| zisVL29zfl+aWRVOtv^~S7VU~Ni}u~YL_@jt7PkM$w~J-bCFo@om7lm5?wx+jG|s2c z85PGZ3@;p<0D2c2M25^NJ;bht&!VIjfh+-@b96AAp0U0(VHC;HUMDj_fvLX7?Me{u z%QWcN&#qh|-^Z4;Y&e2Hn{TGy%NUF7Rq$<>6N!_BF~#nX?mS>3;o$iE(#cH!Rtasn zsUQ~q7_~0 zS14_Ap52!v!M?&I%D*#?RhoSnNEQ9r<=2V&vlu$ei@4r{!-OwU>(g>azLl3(muZRe zBU>%;oJ*+dSOFYcxFxWHdbvLKIj`8f<8Vv}%PGPCq(wWtA8qH0 z1s&H|5vP*cx+)~jec%MyThxHA_b3hzCQ_SAMWm|Qn_r;P&U2cLwSU%F(>DEi5v%%e zR56^jIS31s6>Y#!g!Ashru`m*(z+cu$1vaFe66=Qh{u-?ta+3TP;PJ*I>>ATn~S|G ztIC@Q_H?Zx>+f7ecGO#NMRvTG?5b(Lf5K_Wo<1V3SS(ok>*wh?zvvc86nmN^g=#~H z9>@5sSds%5t^i;_R#Eka==KzV<@{jhJ|bdp@~Y}-5f*gb?j(h*iyM%5UBU(|+>|rS zYczkKRNTaFkup!8qFKpRQiSDR7Qf&qPuk)8SgzXuYKSwZt@j!w>pL6?kQ3LVp2~%Q z&tKBH1novRHj-Z)-4;F#htP>TCAAkVS%L(iGMv#^NMeWGwC$JiW~L0Wg@|m0XB^fe z+});=N+qxaX$)8hDMa!XrdV7H_bb5TRic8WX?TEPLm3y{yoauPWjk5tSb!;VoqR?- z3F02Q7*l?jijNUx>3wEU_GHZO%oAZ>d=-U4$>5-{2zRJvL|vPI!cv#du`U8J&5eqdamYVu=4Hvw)A>bNHiuIf---^>Ai_HEgB>32{~wL@|l35n1{-yoa!cMBis8Ymy(48_h7~NZ zm!K%rz5pin6aP$&=u$dQ#p6BHmvSGGWouxx=GW!VDXJB9a(8RD0l)FFns z1-i+-S{{0}JoIXL=+*Mjt7V9QZj0pA(koGjhHg?Hd3`C5nsR3xxjemE9(lDq@@jeH z)$+*e%MiKU6yD4H*c-7S%)3qP^<{|vZYkZ2yjmW6wG0vCEl;nO$6jB0`Gg4ahUIIo zFGFZ~OX>CHYp<3e5WP+A)$+C1m#@8AhS2qfr^oV**Owu#y-n@)>r?HxghQ7i6iET(^`p8KogY@CQ|;Z) zlH_Bv4X5|CT2iE#g2F0yLg5eN0;UkO5F?ObrGFz0p=fPAxyPxCQQCl}J(#mF0~7O! zI+)7t_bNgq=<$LoEJS#pNoqZS$EUmK4JX9}F7XJUKes?^YE8@;@Ic*0Aw<8_yMYMW z0#{3@W`y{T7nK$v5cou1DFW`>DunWDlGC9o*EbkHa4+S$+BqX7>jd1A#y<|Y@Ze<_ zXQAzM%=Orw1oTXTLC1qzwx~yh;nkK>!U)4%%?buxyMl3veduU+2j!{4VV@@NJ;nU! z5VDzKc=NrCuB7Si&Z)f^y4*lZ>ATH_B(zm(C07%oo@g(P?5Za&e0GD(jN zRvNQ;z#ZOs8}3e zyBD7461Bx;JX~JWjW*dVL|FT2cwUqTgOa<`c6W!6+}B@3Fy#i)kxZdvNTx;u_TH104mWZf(FX+ppLWEyA-Tp}`rtrCUkZWBz_fWhw0d zB#kVxgq{6FBT0E2aqyX?n$gUm^}(d&ofQ_g{G?;fG@4QpuF7`=%cSfQWG5vwHIB;5 zYo*#011_` zmkvd#5LY+gH0(Nr=oiE2Aw=M{F_78LfjWd|HNwo6tl)iQuyzzC4$&}rMrxB?M-vU5 z4U|}!2fuR**4Y^{YYk;?!Tk=)hR>y-{nQj!?sL0ocgQQe8W|)a^F|$L&8*g{gk*1) zTBs$oycudL2hQY)!H+&cJdxLIO@VjVchH!AG}^V2*>l#R-TaD60=Mdt;E~RNImVtT zMW`V*D}Ea=nl+5Ld>mkqbUUe8mC`CYw@AUgrhnuFJZI`xS`xT9gcj=tSSSjYhmH2; z7o~@)Ct4Y|Qcn^as?4W-UQxY3H_Q*xh#N&o3QYP8cc(k~Ee*6~LA#|(j*>$hqUU8G z@wpW5q#;I@%H^d)tN9&kXk0$nu90%)Pnw84|2T*q8l#azB=JkYj)eVF35il9v!UgLEb^R{nAPoRW76S3mO;(HJMwGG2TSr z8{2x*#W`_E6QwPimcU*z>ZcX~eVm10h%9!1tsV66Jw$vc@f;d=g3>NkW|{71(AI$A zmhc|oQU(5Gm1!)l+oOS92OzA&;TuG6!3ay%FQf-Tv`1*;5nQ^b;%~;VCQfL zP~UboBx{$;@uz<{Mt4?!hY^>y^++BmaoU7z%E_ zww;rbmI>URpJ3zIKm7?CidWZtr zk3v@p*R(h4i>pcEnSy`*ValhTF0eT0a}Q&VjObu;e2%bz9-{c%Rsr(4{tYt7Y`(2_ zYzpXO1WN&R1FRyI^2dB=7q7SQB@e<~A%=%HhjZd&JnLZs%{INpE_7a`{@AR8$glbr z$Y|?4ZI|l>EZTMDA^~6ZR8JkH(w~Po^kMjM=v}`UH60r$>l`Ct6uNfUq0ATapE8UP z8Q&c$gfTbaJ5q^(vB%pP6>j-e){czlXb@~yj=_fO@`tkZ7oY4GXUp|g7;_SPwGMg1 zNQq%G=<4f}g->uM3!TzWH^Qweut1FR=aox^n{%28zXa=8Rh#2x_l#RV8?&y_lzA4V!sFq3CL=S1N+D z9bSf?<0J@PMtkHC8q9=U2n0G>l`Dv6Oyl>f|&vi1x^vZ3cF`4NZh7d zg9#}oc!^%!kW?2+Ir+n@VAU8h)doVo%wA?fb@C;sHYv2$-hRfqLs#T8eQ!5EurVad z#j{>JiXddcI6#ROA{EQkb*VN53AqmS#dOddC8y5a)U7&S-5{`wm8NhF9#2o_>j!DT zDzp@mHr-Fl~wb2{PJa7?o2rp&ehLAk@YBTOb*OVw1x;Y(aPM(ScNJ(*dM7Zvae%~ z^+k^DPf*7w6SO))S+DqAkEj1`Hm&U>Xy)vDsqKQM>6s{-{XC?w5_#w_^TX!a!)L38 ziC+wFDvf+_E6B+_E7W$?w-_t(#?!0Q(YGB&5cmWWCD>p*#lM!YEJc?XmifW zEPs%R@y|J4j@N3I;m6vUs8}q2uq+PT{Ny|a6Eo5qQ;Z;~=?ECcoxycJY>K?X#w)~o z^-yM&h=&W4R+{JW%+$|gifg5Rk1r({W-ZsQ=kZo4`k1qq5W9%Z*fFU-{rcgcRWoLQy4oBL?)dr15|2K>M!XP_UhTBZK6AtDGC5=t56VE>R_Yg8#`uBeYopxEm~?Yg+oL%yJt+ zxOf#KBo!=KX|@6)Ty!waCyn5C=wZmd;-R=edF6dJaM)9ZF4{f^L6 zBuT@SS#x7HE4Pl%Cgb8xh@3G?m4i}u{Y5~^z1z?}c6p>L85h#!2-=$4LkVu18SviT zA;qrRvI(GFD+!glv(zCecVAb(&$r6UCj?&oHyTn>|HVZ-`#D+crj_A8>VIUjqOs&| zlNHTU>kAvWi}tYYn&#Vjf~N*ovyYCOSy88q z=XD7dK0OjFym};9oS_J?U&mK|C13SW`;~m>%5N$rmvc{4^*`>ic+#|Ub_Ao7NcB=*P7 zv0rz2PewB7$-NC$42mw zw`?TXulrlS-{1Omf9u!%t=~Csd&=$i`&+;6KJhz$t$646`#Znx@BF&I^XvZ3ulqZ{ z?(h7%zw4=vU-urUU-$QZ-QW9lfA81*yI{k>oJ_iioSQu}M_;Y+tc z4qv(ra`@6`?GyX7ZrjPrv1Q)L>#YLn*4bt2uj>AyF7LRO%={(&$n9x=L6`Sj1z)$D zsHt;g1?l@+pdMJzmWUu__3dxJF@*nT;6#VWpIbJzk<7&`Rlj5_*ydaSMS&E z$nn>1dHGfFb!W1?=_+X5zH}M*%d@=gTG;xFv%faW3$KEM+r0k5{Kg%;{<17@y_Vcu z2L77tFUj)et6=N)rN8j{>#o1-zIBJGzv#N8{*vpjxc-9cuebhk>#w%{V(Txe@7!VP z1KkD0Ur_z^)L%~h)zn{1{k7CzO8u48E~LATY(df#(0A^F6B$@Gq)p2DBM`-!E_>-K zHy!Q=!{`B*w`hhxQbq=gy);MXUi6xSlgXr!uN3=4>dK`{Vr(}q4J@g3pqzAoa|URu+;G=q4ugV80z4-GjLU7`aCQfHpab={zAq<>k; zDV%Nb-#R&+4&mrV2kxRbFv^-cL|w* z%&OFibe}o2ifd`yt>%BxktQ{IX)!>5o~_%-104bjaM!RoxKe#&q(o!`>HlT-7`i8QuGdxOFRfqGbxP_r`PmM&GV!_P%Q1p zXHCC1Kgq$!;kdzIe6W^&i_%dyjzI0Fn~-Tbn86$UZ3CSbgOC zsX7EaDL$_rpItnJ3dKk7qw(S?ktCnCyh5pfcLmRPTIiv!(hw=;O(80{9M8l>robjH zGDSFXkpW;EOD#|d!eTTh=PwE^!}kp}ILE!y8}L5;uxu12f|5nu45;7m5dC5KD<$ z|ChES4GwWBQtWX7VBbCQP4ZYKpzrA%THq4WO3=w2lLk|YyqVG{UUFR=)L_Xytj!`Z z1LCj~U=rps9esPH#nAM!1-P%YK=qdPku>*`?FIZWU%-R=<9uU*vcy{Z5-=WG}fT#{{aX3Q-uF{vmQ|MR+Gigye z%KBu3OTqYm`mn^_2tQB{)BIa~F4uFV)Ad+3Svj2dFOO&L(YBtMx$NCEKMdTey z_z5+o-YK1vA*E-q)HQG&137-J$Frt`OKJL?bJ2i!4Oigg|R;7htg!%Lg~5{EW_5GC^v=K*pLTjgeCX+)Cy84b`W8 zIx?K!KcS!+P?$zK3@3~Yn0V;fxI!H-Kv6R%2C2j`A$^823qUSlge_pU5-eacn$V+G zg=wI>4W+2zn`T1OF%^NRcS{M#eM$rIH}t_KjnDEC3U#|aeEsIUqnj$f@b8P=g6Az& zoB^Z1AZdb`BLa4J8Zbe;lkS1;#R^GfOtfo^bdf1!0?9lt+ zvTDup)BI;MeRcS*f657p;i*>$d!}F^=%0#$W@t)Evf-&&D0`-8A?TZ`hN5rE8nXVW zTM_n*RhRCQKa~sZ;FK0*-qaT8p($R-{HZSRdU;8swGjAIzu(VpM)WT=Li_k4ayhb z_lXxG*)Ls~>N&y%goCmL_+inK2!pa*3~!Vij$M6^e86tbbQt*M6O1}OK74I=858id>{G(a>UGYC5%GJqbC z7{Crszf3SJFF>}ZN%u($;xHsE0)B5{heZXL3`h!K_XrA549N*X4~hv83`+?R>=P1i zKr=WQnBW;=g6M|i1mX7x3MSbrDFW3qL`3X4pzw}F_=9&wSm4Uc_8HY6~J zbic%4s$P-7*u64?s0M@vqX(o0;RnP9p@*kpq1fMeLz08|>=PZ4reDfNg8d~PmL9}r zKztB-kNhB#ApyepK?y<>!y<$z_Q{Za7FEJOLxO;8NPqynM}82+Uh%<1&yXIV8xkHs z56X^&9~2#lXpiJ5WJ6-(&Zmej{>7Q9^XcsD6;%H8l>}=3 zN`yOs1%a8t5@V*YK$$r#F!h9~ko7DUBm+(A&10F;PGpT6ELc62MPf6T1;&}o0&8cp zL{-ySAnW-okky2a6U`c?=n6_+;XgLb`s}YA?p35gNMr45Q31lI8K~z7k%Idk#e_W?349WM6OZ(P^zH_1PGnB-&=r6vKL08C2JpV^Q-D!G$M@lW}0+2?tskOuI+o~Ji zH_jj*vt}Z;DuL_TZD8CvuSmJZ8rmiD_>GP1ERY;0c4LSm}+kT&kxT_$?+-X z8evy8YryJKa&Yy((#1;97DEViihT~(BTCf_MmJsuf)=?jb6;;Edp=88}8 zYE4-+@9{?A0li=Lp$t|5bJ7d!S=@zZ-uJ5?ugV9O-!J2*R$LFd&mgl@F@o2)a2Yra zOM;`undig!M{_>KwJi!lqGp)Fe9Jdy70sNEpUyuz90WGf0;Cdi~9ST@Va0(X)TMFjyTFqH8MMWN+* zWu_GwrWVsBgRYxNGlx(yskx0#rFaVD8Gb-_xNmVKd-7d2%nJQ^ur{~S7`Ppm`ymM+ z7gXFESH(jEe?Ox^mP-b6(}m~*#3*bRKls5aDQ6@2I!Iu}GNNvbeJX*CbxK}0Pu(D3 zFLSvh(1(_ZENFe84=pOEWN_pa0goj(rN!$99<(Tog0Gty!ZbS!4&CA&`W)QiBEquA zw`jw~*MetJuLaO;EU&G+in=Z3Hk8{=hh8n+Ryy=*dFa*h(5t1F4+2Qn zy@B}A4$#X7k3l$;UTfkZh?>&N+{@d`8c~UBh6qaR0KHB_NMeW5D-fOva45YZd5wXH zy>)5??5%+wA;R@KgkB{PtkY>isWOpUtc2|=SHgP*OE{-wp|AIpEEBmUOW3}WCA?R%gwrKkB9sy0 zD!w?t&bhQ?hTcIxq*%G%9oz&FTQ&|nYTmKCGOJ~r*A|YbFr?HwjCxAC-8_A$iv>1U zU~`VpGr}J*X10M{f$bp4Ez^U`GKd8H_G=usv>~D}Rq>O=l>v=cPqfcT6!8;bhAzKk z7|E#17IG<9nwoO8TYn98NQ4ueTl_RcvbE_qf(^ye(N_qH69KfpGN}bfi#2{Ok!k{C zQ!b_gYWh{n!JlJJt5!C`s@+x{2AC;I8!8`7vD*L@dUAnc|%33 zyaCY~Z$P9k84xK!21I%Qfqv_r@YL{68?nfW$(#!EELrOS$FwHz+FUCK?p_luJ%t92$tS|eXR!Qs;Jku{-6ggN<$BU#uly)oF2_F^cvJ0$| zV_y38Vplg!VZaZXSCuPxnzRFGOv|)RmCQLtX{Z>5Y|p~Np}@)2YWjK8@_Cl7Wa5Ii z+!y0D;zimXC#wPvhx`=`GZ26!I1o6sC{=GZJ+%7LcH?$lJ7MW zJ&(3Wf~5LxhMS|qaqm#s@fZc7h)U(G46lOAt8|SNi*-Vtx>DzCx!yi~U1P401D&Zm z2fL$X%wI-mjrzLwap>l1_G?`*mCI2H1u8_<*4;-(=PP%h2h68-G4&^c#9vbzn+gZK zFBSssvYA0P4rCq)`pey)ub1ZT(G-y*wtl<$l$4azR;)6gRI3t$y_rNaENNSr2f>nB zrhqPG(##a)ku5LrOxl^EO!}DuCJjvila3~VUglojUe;dDUdCR&RlB2pRy)KA9Zu*G zh**zX0+a4!z%f|2rWM{S zJ+z{EqYAHN)9iDSt$5;iY3RtwNq{({lZP(|=X?-mo+)}k^Dm3Vs^w`Y>$aQ!^bkR+ ziv3V(-HfQDZNxaDHb{TEQi;|#B`bR(JJAZJnu7vmXQDvaDIrjHW(bs>AOdCQi9p%u zB2aeL2$Y>X0%hk=LG@RQ4?X0Zr&M^!b1HmAoK;AfF;KN}#qV4UL(jbE@Wq(JDPrUQf% zJhlhzxn1dy#)C8v)5L*O2zIx0Sn=Xug$0HW#WRnH=%Ra-h37jP6$1QRPN+(Z2b+`J z?IzzF*f{UjqC^R}l)%Y)hvk=oVMp_B=3y{rKVjn)+zk4%U453V*-&uzupvN{0gm)u znpz=y+7HJBIN)f}f&5S8Je!bazQJy~K@NQKK&tN()Vh6C3oM;~wwv$dWsxiD@Vkd` z9OdG`)SpkElVa2Sn3Hlp#1#??)}yMNqer+qec0WjyHH~@Fg!T8IbK_!l;ow8*%6R;1vFt_9Q>LvIGlL#f9?^syN{AjFZz(w<09$e9-TEo z`>x5}krNfL?u{j$sala^>bhMHP@OlDg)-kz_R#H@= zC|{Wht=Ojktp)Bn6wog2c>iL-<*Qe2fugY@^Mnq;^wgp zL~4+(Ea4 zmxNj5HKLkZ1-)CDlpQ=_uiF-j&a}bt$4)kA!S!SCl4LE+OTvJ*;vDaFOtwFfCloaL ztrwAuU1PrwtM=6xc5Bg#ysDN#X+|FD(VOl=R9>-OGoTVD$r*$2%^Q9Tbny;qFNDV+&?Oc4v{9 z#;$Oztq2Zg?Hzg79AGyTE15yqnne(~4hwac_C%lB&DCip`26+a0UUr$E@bp7?~ zP5Er;p}#U2sYAYwZXTe16yQa(yb2qMYYeKK7I$hsw>TEV%b*2F4ltlcGpe+Z?oj?RiNEnQtLk?PF~ILOlkGnj;`VcC$lEV1UXXOD z@VwQQUX+Pdy`9Y3TL|X)EPOgRiTz~lQ?eI* zy;!Viau)1nR-`Y#^_Gi;O9SCjXDZibRtDU-TVjaf5V2^T1!ONABnBM}-LhTSmckcP zG6ijo01;iqM0|xw5dk8Iw(Y!B2_Lerx9xI1>2NSEG@rZiRE<)6V<#ahlK>?Tf`CUy z%fswt&P{_ax-!ueh99viZROxhQs{E@0+=mS%?D~GBnKBu7AoihkT+Tg-vt{_nM!vv ztrN0^p@G6%rZ9s@r-2P025 z<(0rgX~~o>b31%DM1Az?<=Zk(xX26|Omlqr>g`*b&ryU9rF?TlZt${n1Q|^67CF5# z4frMi2httBJl4%XfI<5AZ(qIE4RQFAVMD22>w@9o#3AZ8hp&!x^$!^|nC9K_(d%QI z&zlGxNGYT!_3F{#Ann^Xy19-H0U1hh^!oMjvCSg_2httCe6O2~07LYz-X9;m)Qxr= zU<0XMztTO4?;+~LUU(+#>m@f<& z;{Nv4%XjZ=9uYW@?%k{Ry2%JIM1O=_Ug}1B7hnUaPG{}tX?fRbRiBzcDwy%xDDE&F zuud(S11d9o%UMkp(C&WIE^j}>@&kW_@s`{Qa|3p>UQm@?qBUEL$ygzdB=@pBfocn- z*D1rSJy|@CpSn-ug)rYkA3LQR6epXagCv-;lu4j1a^!)%SGcm1svY4u(1C%oTYPZ3 zHW;$OPd`9QEjnk)zo2?bVF<+NipBZ1`o3x(SAC`W*5RcyVp1A7CgjCFY6XKxr)0tD z>*`btidp;nxMM5Oh2(bLeQuqydEC0BvDYBS0mB6JkdrMeGNwFsWg7D`DV$6-@=s~VQ;tXE&8mT zKs3R7u|`hkKbGT}u#v%r9g=nQV0sozbdQGT{}Ov)$p`Q?LdQrDPW>oeg-8s@y=Xal zwI0?a+z=}?%eC4aPnK(QLOo&E;Q$mpC7?%zn}CX?SwM?{O7a!8z&wN*S^<8@eIk|cBegU#-ai!g|();6>U)?Ck6#+PsTx5RdRi5Wnp66bk=U$%Y zRi0~X3Y93K69>9@Qp&O3(Uwkr!zow}oQ<@hOz4Z>jZF36%^mC-MIuc3C3d_2nvS={ zD`0vzgVnY48O;&3HcXqlo#04c22b{6G-jy@yjBrJiqFAMH_cQS7})BhZ);-+HEKrsrw2vJ!g#@}Lm zOqSrE7y~X)e4r@`jU%#)Q(9~c>`%-gDL)%>7Atb>{^(HK(g0Alw0mo813(ktB$kAB z&X?K+cMs{vRlyeR?2wQ56jYO?!;hjOVxcQ*20o@=@BYI9y5cw|kW#J_Ku!&UE!*i1 z=29$*Wv55*)lMk#1i-{*30aB>U^jaxhHg-mrIJ3d{7Hi=fiPuPmQ2YrBBE1lna#X= zV56{Dc0i`qVSGa&T8_IS;{hrw#Ql8JZA)DXcM4qh=9u=^2n$e#6MVkLTP;}bah>l0 zVmY|@NK(K9u&`ZjFGnZc#i&5q%^B>kR}wI3#9_yMyP@xgX2BsPQ$GeMK=W3N8yfrZ zXzCUYA9vE=%}y=tviTF|w4#*cI+UPhPH_s-&$OQkfmt0XWlj)>0aM9yGe4!$^>I8lx}3ToO+;Y!hG zlMlE|zWI)9HqoI}<`R(Ppeas4Qknp+@{ws6S=Jn+#AIS$B$dkoW2{-7nE?yxfWUD) z^s+@c@sy6PrPU@MH`r*|?@I}Ql4%6uZ1Rcb?*|e}QYW8H)LCu#{D{4#U`G@Ls+vF} z4rFr^idFZelPu%?4+Ze1zPOaf=~RR-Hj*vG^m)f4+L+Q6@VK_y4|! z0Vt@iDQF6@q#-LS0RM)Y&3ra%HgKqz7nOg8*n#pCEq+(kV5+L{ypa;w|B1x`1r5cL zg>`LcGg74GLXVvShUURP1V^d9W9J|+N@C35P)U+j;Ek|O(z`R&Rj16e$r5cx?!$V; z4)Di2vB<$!Nop>$36=r!>J%kdL+OwuqP?VS6qszq_H2g4m01tY)iBYjy9EG!bT`jH zT)`|9!Y#)o3b3GdeUv+EKyiFubP9ZHXP^YI!=TyTOVtBpw0kR6Zni6U^2=|WL6^^a zB+y?rgZuSPdalm!EmAC6IH((O3mCMYzZBWl^D+; zTl7uyWalDWscF?KC5ZsLEhGnFB4oJO7Am;h77{{leP`M!llIY2LuOJ>uzTzHT_zXp zJU)YSE-wK%E@&KVr@&Vl>E@oNM_ez>XL*go1Zu?1G3_SJB!ke-N#!W%1hCC8U z^b!8~6k0)<--IQvo#n1<)<_BqMf#!nNk%4g%d|*B2{irB;b?_12|Fv=z0&qVxRGG9 zL-D#|d-9jw9x!P1fcJ2q#A!ludQ`UR`KlO7)Z#!N6zeEwgU=!Z7+bU~{yfse$NIAv zt%*2yYH1e&W2mW(6TxDLB~cD3W#=o}Y|iL%lE@DmYQ1S@S3$Ka2E>>ILuQd?2B~E7?H3Yf1H;SrvEIlBY^8+Cit#ho4)^5Fxm}zf%PW15N8UUyNE4q zkp_!o`6LxI{d^8ifD8bH!rG(-iAC{~?Q)Sy=wk5fXGfrwL$p+z|rKV@#w)v=> zTNp!7*hLXFlt>wt3BU$bQHQCz7Pyo60~kIYIz~Bk_EDOL9hJ zj(FYdOCKX%M)5=O+|>DCj;SpO&?&dw5+h8p(`zlzWhtSLsx~x0#acrA2;kDG`H$>F zSnndP3&^Ss1|t*)gORF3M#-j*nI87$5HMa20psTIPtk@sHhFIA2=TJyFy>YnqJm3= zJh{|3Qnae2I~jm&7ZOZe@u0mLDNfK{u#yzHP4Er2@uHyupc*Lw z`~kzLsFNx6C&lw)GvP>C5&{mB`P&-%QADkQ`X{peN$;gd!k-;8l!x(4>t(B* zi{S?V_Zrw`#d-$ER)mTF9YIWUjQG?IZUFg$Z2nTZ4j5^zAOXZ;6G`CFS}K-c#aS#R z6vr|NB>OxjtXbXSs8>3+Be7CW;_w5&@hNDK{sSsNFni zJrgi=urO6G)jpDMBi@!~G|I8|c;_#ue^|vXr0HD1d2|+bn6Kp{A01%d$AS9NATS6a z5*gEtlp}vI%WHKiyS9tmqOq$WJ5~06&qC zVTesCkE4_kWd%b&u7JS6BwY~*T6S5hW=pprOIgDANAj4EX7fmQ4q+lz{0JpmKwk=b zBo~vgS+6e*pFP_mF_1)>5NDAY`*)zU6k5_Ii-rvgR>LK-X%V{2(rGJ6B;2iR2_MpXs%Qh8`Q?HHOOW$2ZR4+hyL zaiKScjDVjZoRo420<7JV|HhdMEk12b%O|*+P}^{r3J(dD7GlVvsA>F-^;UC9mC;bW z(cqMia!X0ZS7FGc&tQDLEz1^wxVcY0X38mT%_o-}_P^w59BS4RgU6W%-D!f?joNeL z1VO^hbTim8?bZ)ZU1j)ZCl9%P(!$vAQ)O7+$`mbE@Qp8zKwO8(VFn1+8@PE)=tkvu z5so3xq|uxfBxR>1fWB@>uBIG5k>cFO85oV+Xc-AY>*FA|X^5dZItTfhZf0|*ifSpa zZAnV-0a6I=9U_wgJXiKa<`1Wqo9c9iF<)0rKN6ugbq;s@Fk`MO^2A~o9$HjDtXNp0 z?@Vg;t`rQwVUW8s?NX&31v`jqX?u08z9BJLLcxbFcS_y(-iIOCb{7&t$V$LkrBa; zG1~1_fEv}~>CIe6)dwVA?1aHWDr1aOC8E(*?vWRjt{e?XTJ z(nE`>bsFhvDfmcm)dqZ37opdRu!`4r3HC)=A_Uy%p5BFD0qYrmfhpyySQ|ebk`}fci^MWP-?} zY5v}bBXa`CWjcO$GOQWFpe_h&HXyWNq}oSiAH2iS#~5@;OmBP$!toUzwT}_O zOXJg***OphT_n``3^BtVaE^<_vAtBNu!K?PRSCGooGv3!hf?4#rP(rseJFA-GYCGE z1;G0e?7+r5isT#zVA!RI(UAbQ8k~C8GPn$_K)t#n8DV&??$kA-K&bo-uDR4$ zMixWb1Rw3wt8Z7)UL(3f2oX@uY4Q|%F(6Sr2&Pz>t{YvcPvOo&0uJ^kJ^q{RR@|O~ zPpa4^br0>Mj$_h2U_JY8Sj_Kn!uz_y!sZ;J5umaf*xlx6_VXAmty=|Lg}s8;xI zLwEG})}6FWlct&x#nMdR_Wt(t_5$4|^g(*tMHZJn`G^r$JWo+d>=TWLJ*#bcgT^4z z^S03qr__yfJcvFALtUVQ2l7zSYBPgak3~)4vQijRaz;SakRcXJifZz661oDZxscDW zhG+yXgY+GT1of;d$oaGftfm&K(UQg+sK0S}{ueQwq{%N07HVFIpR<^_STdLkNGGxkF4DBou0b5Xw zVLl6G6mG#u0EjdN=tzZjT?+;2T#Q}3KIjEN*~-H(T4I}|X&a{F@47y!lc5Cv$ zxkc==LY-hgiVdnOFwyl9c((5PUbdUKA?k3^??hRG0r;dhC;+Gx@u|CzJEN!W8XNA7I0^-e zZ>yaQHVcUIi^lh4D^^B*KNZ+2RG5I>c8_y@H8;uuGGICDAC5}4Cmd8woVXM4_NN8> z*8upGj5MUu>FTy9eIPUeS>)u2E#ip@Ut9iCngcC(IKIdOmcIW3m(&VCrWkQZN^~1i zI2EC|o~}2Z{B;s;QX*KVbSq@knTndmAnn4(pwFl3wo8Q3d0Dt(F^nD2s$Ysr=4+VW zZvOOA0qm2zJZRXvTnM2&iDQxZqKKD4YwjTi`u0rh_9EyCwKkP$uP`Uz5pTgGc+Qp0 zN=)zOK6>gtsI7J)e(Ffkt{6Wda*H^*j?~`}kE1SJ<@L|hzr&)TCp&}5ol->qWY`r( zo0|0*>ePjZM_4&@k*{GP6?-yfa1A2{+!ei13BHr>=N~l>ttm4L1{uYb5h|Qah7{qN zK{zrwO)sJ)5t7bVeh*IKx)j7YBKk7E)u&52FWkZu^F8Gf2kwO3#| zf_SA9)@`OUL+%MCLS^r#gH&=u_^``S2TMVLBl|c!z$%zB>k^YGujlIe1%Z{nbOPvO zVuA|EOJ8Ry#vv2vlbz^Mft_(KnXyoX&ng@)oNknmj^86b$tb1RtsZeqTy{D;cDhSv z1tm|qppBSZ)24JgR>G4%{smIiL!SjEe>1tg&31O z6FifTsB%wEHZ0Un>nus}OYjI-t|)!qNoQ;V;DY=ww{gev8?Gh%dVBlvM{ zk~&p`p9AEQ2}nwrK`LFWAJ-sMbwt-dmU1TJj3enBBC! zn*YGCVAk>DmX5args#4oVx%uYz+;#b)2}de<7a#%tRxSQ{$O82Ai)C)}t6-+hWR9yJFAiu6G(&zlO~zc) z$!{+rl(Hw)w{>s2W{LrcSK&4u#fWCFiwG)`Q%d&SVP{hZ3ArG+L9&0MpeL!)r|=nq z&&UU=CkAM)i>1SrD{3p3;?w+R1ApIsf(r=4Ij&i`sV`dubfLJaE|#xaVwXR}-m88o zKQ!r|YrN8#>UP2}5_2OM7&^s3{_hUnlpgGwtXG;N(-QoqJsF*zpL=K@^=&RQrl9hP z^XV8qLX+=*sbXL>#}OZU3xLrRTmXOObT}o$ld!su0VeAhAS(Cs?h3N5G{gC}9cQlC zH+PL@${@*;0g9z=L;kYO@NK1Q7{74^rp%CF?)rkukRRtWY@AaQ890x{g5spfP!Il}lYt^&tFIL`;s=JPHAMYGStv{7W7P|z&! zIGvX51c7~t&TCVaa2lU4r7T2?LN&tLjH?KV2r#UG<&%y`f1Y=wh1}4su|&s{N{wGq zYV`z0B$o$MEcSLvayK)JN@e2BcQCJeDhifI z9%Y%4g7URP>9O=UdJH{&Www@#-#Yoeb71c?3`_qqe~`zkm}}5YJLoyVKo_-nRuv?a zu*AR+6Ziw2(fFve%$Zaqo17Hi5NElUT|o9Q{F65AH!OE@RyYKJZ@~*}1o@ZBFX1@d zDCroy6aFt)^pRA&=m0C0z%7f$`{f~;z<3`gOXc&6LT`v!Me@Z{M5puB0)Y;taBE~%p-h$;_X>%l;G2!==tj;EJ>V#0cuV$q-LRt z^*`{4&t)JjN9U3uiZLDBrE=glPZ|&zHd-%&ro;u~ugi?QX}^&8F5gkaFzpRKREY_| z&#R{V5}=~uhxsZfj&krCa7sMxCiA%laS$w3JBEA?3w%xqU4DU{&)*p6x|VbnJ%TwU zWfi}#VZlwHIbF(7C1l9;_-?-XC&HF%!W`_SBo~cJ`UOI{NL<{K$I(LJJL&;aC7M-KQ@O zK5SaNvV}(1;BWw-VRRKWK`@oDbRua5_=?B8>8fzdg$ZlObiUa>#e-f+xtw?GijPyo z1g49?louS;G$^{}N8ndPcX@H}5sPA|-W9yZUL1U;F(Cn02y3PQH~|`w&$j}?eZB%n zs_Q>5>SAT!wJdCb>hfl|22&#=Xw?qQOF?>KsRZ;RnKf&$>>N6E;-eH=FQ74(mZL~_ zPcL9UMGxuLj~JlOey(?zZGC9!bkoNrt?K9q#une>xWX~y8fB4fMIL|nCL2=^ST|Ot z$CjGS$vx=`TBgTYDh(1WUNk_`*TpV;2j6{0#q!7A2>T^Ul7w0Q4W&E%j#7<2sg$QU z`CXBwK!8m+cfBPC!}zLA51dC?l_AgDYQ`Ou>IAY5ererjZ(MnYInt~XT8Ag=PBY1X>#E*_UhZ%xmfFrk~S9C@=4I|+D z*gEyisjHW|WF<0{t(`;+NL(4<30nqf7_~K=#uqN|EEX7xFqo~{Y{R!; za++>ADqNM~2BHD6Cy0HvMzHoGQ(&FIl0?E3eHJBHcz?xw5Qg?jPFt8*9gB=e7 zQf7cVFDW}(lt}-LIek$D{z^ed5{j+qbU#V(x*k7{Ldr~5K-EMI1rOGrm>+#up15vC z!SM^nC0Z?ijhcpZ)xc|n`z~A3O4H{Smtw-L9|3b3Vf3)$>qsRj&p$g2!z9F_L$<0y zi$-PDH|ENpAH%~p=T|>qWlQCey+7K*#31T{u}~TpNGTUafk9yu8Iq@K3Gb1!30RSD z1oZR(afgenOuk)Yksm6BsY|cdBpTl70S%S?KNjK zV}BtZxrJJ$MyWNo#5*I=uHtsJcESXqYEwCZR5E0e5evjNdo@iv5}k~&(O#9rPJ1;F zTkVy=kmZiMEku$gm761P)GAj=51Q;4LK5z6cI`|Zr_ir*BoZwOG2uA;tMpUEc@ za1^dlD&G?V>(vaKhs$TGFyQOM)#EC^<7@r1+y$tpVenJ~^Zn$CunvDG&$UR3b&8mL zinw!Z?@r65QwtV{ghAr?l1J1iV@bb68}4vV{9MznF&Ae^zuay2gH#{QM`{7 zr^8;gk0#hP&|>OOwN4`gcLPIwc98>pxW!c#7C{)|S=+ z>Ze>bR+(O47fSu1T1o$jokJ`JDs-SOgR4KUrElW?mrF z$W8ztDmIKZl7-SMC9Ao}Hd?bH9QjIzQK{siw)s`4+j=@+d*dXPx3UxRpK|NfW^MA4WwqDCY)fz${hshG7ih>P*nf=QdSMUh~ zrMzR@6vtXxb|jwyc+OKLfk)8b62&w%dUjqB`O9q~Ab>Ym>68xsKErf{^|L661mzQx zmhn2jJLD&ejX06Yr4|Z)t5h|Y;6m=%s^6HWmT)Vt|6bW4qE>npDt|e>-mdy878_q) z5y7S^#*R)^LazT*{0Oa4{Fbrxc9veIzt8en$;zs6_b1voH?JS#C}23EbS5kOQur#* zX?goLevoN1x3?TLsA21csY5=c0h$oJewj}cncNb!=D_nM@S~X9YP%T~eeK&6kYCy3Pb}Gk)fTVR zplNZR1Mlppe|pKkdjH&idGIC6p@qcdfh27IOU^HHwfDcwWba#^{(Syl|Lwp`xXa%09Ia{Q3EuVA>?Qk2Iiq)w!>evRS0S=5QN&i*adaO`}WF^y(HC_0c2!6o= zxpKQ*SZBzvsvVK$iw>=6v*m0u!FG&O+Ndu1$g0(}h#Gr-BlSs@`gJ+-#DvgnTlONU^6lcU6^%3B9=htc$#RZqy=m7&~o}9>muakeZ2aRx21n+R!-b8MZ z_rQR`lPz=QDXi!kD6r6ElXP#6z1ZFfeCx{=YhAqBO!6XOiJo%Bdc46ZYNqc|`mo-t z_C~Wc-rMNmskcg0G8$)b?@GCV{Fpcu$yJm2dJtcp<4#E0*G50qf6NGvYsAJoOd7Zs*qae$~h`-wmAuOY`<(+l^WRDv(d5Ky_5GR!Of*o>0}ff2K(pnY<{zHx`4mE;-0zeWTP~I|=CVD!hl6E%4@`Y=qPvHKdThx~lWq1N3v3_k znPtFgYCs@@n-v@h>pyxY@<4Tl_5W>x7n%Nw950vf{DnLFI2GK;8P{KtC#FBi(VM}3 zpi%KPo5_2Wc(3xWva0M^$7yLv|AAE$M5(E5-?;&8N8ZE3$5`dyx>S&?)5Cj5a~U=d zpORZSnZ(PvrLp>5>fNFss!R&i%Uc6*PItL>=il#L43uaz$$IefIFLib?>lgu>gM@e zA-lgM6TddfctbrD zhP6h})_bhf-{J?Xn{wFieg9yKX}YH{3$CqUtIuR_!vTKbAV=>g*m(JV#-4C_A(G&? z7lTq4RiU$3+(s4|NZ93?2x3JxH?TZm**ujT{Ujt*5TG!T{g~mgsN-;0_7sNL_s4+> zZclk>0%|&+m{KHMww)_X;0sEywmsg0^pe0P!g+T4poA~CAY0Z2f-ar=f5?17SfMWyc=M7Pnpe&6XmG z+dpThd`+bK=vS^pNsn=MYLtjt=sw{hqW2wAWTeu1zdFKvQfDqD0=n6)N{`e@3!s$+ z?Y9!D4oRojxXha{NXrm{%Y5Q!gA= zEr817MQ^xMsIpd zi$xD-6W(Sb2=@{?Tf!qod1T~qf2?qvZ~BQ2gU287y-@B%W)rtG*_z<?d|9q*VV;sN+sW^dN{Zm z3}-sZu|PFOFd#`sKdVrUkO#l3q2K_icVkJ6_8?fv*Bmzz4fSZIa;00<5`&Vyl73sr zwXJGmrE^7NL36lA6v_uvg$l4C7FMF6BhVL=_ZDJI6nbtgbNKP{# ziZPaV9Z=yG0#Jp?Q;t(h0s2#OoH{;W%IG8h>42%anNlP}tB9|?k(@Xgze3fRaqbGI zD5z1v9*_3EP>CVOS5N}Jm0fp#jW*%z#=@KkEjLbm*>9N zVyk3&>av%6a8)F0CiR==@`@RbniKVwQSbh_+LOo+{~J{S>(|eJHj21>xlU|4O>r{9 zij%Fhl$N|Z>U_MbJ*Cs8VaUbfV z!H;T`v(s>yW=Vvx*ITJqKB)6S6fDnCWe9CnxZWiMoN^-y1rUoMwl>yhv#(}E*%amB z`)mWIk4%qd?lfg->g!Wf&z4hafopg+T^v%|VR@TJOHVgxD@XBi%@n7L-yvr=X*Hi! z`+l}jFZ!zP<&FvCqgqVohHn&}yN1jCvQgD*y)=+YpDf2^;dP9rycp16;DPF3gt^x* zRX22psD$p*(13=%Ux6+rjd2h)PU%ezzr=&eMJp~U4KI@hR{zpS66e5$l0O!vcoj|V z&sop;s)S+CSVDtFi$qO;?O}D~w@Npc@)YU#g_D<+u%xPG%36$5=2?oW}bpfHWFetC|) z0&Kg;_?LP*3`He`Z!Txk*xV^GSCrIkRR=fbw_r@P=93%5ZIokk!>RzXinhqkRS2K4 z2vTf0o3}Y*cbRr(+o_Ri)kbk0&r;z)mq-M4s;ae<{M|z(rgx2(`lF{fCfx^R%B%>op0H{z<2UdUCH$sg~aBL<4hpBew&^SEtfQ z@--sW8to+dDpl;&)l+?$ghTc%qOn6zru*u+8p5v|$tk~{L_O)(6{ECYPoPZvbt9|P z-%@Oa{OiUy(SOTwlmJ{7A{1a(qy-7MBF<>Q6`>{~a7DO=3S5z+WMCy#Y>cYAFq{rd z1PLLSOI0Yrz8EJ3QyEp#;z-07sV4>#xj}^*OoW=q!9+aY=B?0!wJ0SBt01LK*&k z8R7#qXTLv^H2jwqrHMBDLka@(REfhsGAE25LmmFn*YJoWANJ$w3B+2C zQ;1bu8xnCYNNB{R7(ygg5jczA{Be#C0cP2 z*GMcbqyTLVwYUf?lZ(9wP1`Ey#Wt=)Fm@wK*O%QWhh$t1wlw2Xj7u~wMd5S>-n!gR z39&b}Y>-buHZJKDbmLOEB^;L`EakWyQIL*H5tepbMAQ?H3lS8(pdQ=6D*3pGtDzq| z@sxmE#Dg|hr68MF&19v#OB&Tk5|oJ?qbO4` z_Yyu6sL+&&P#sa3h*qh}M5sllucs@M^lAyqOtwT>CL$%$GLdj-%Pf`?mx*MX(NZQa zlVqy&WhzuAFcTq8VXg|g2QYptr7@R8d?K?SslEeUDswrSk(tXfYQpg8%w-WuX!eBE zWK>6K_9YDH_E zkrhI;7wb`?y_gay+K;Q!qP_S!VsuHUM2#-R`s8RY(xpfH5um;}1Zh9cp-B4?9!c7Z za%j?CxG=ry@>#f4X=Mbp87g#YrEB7RLbVrFqEvfvWm2_?#DP_bR_(XbPR zyHN#)vpx~Kg|tV-u9a^?#@;SxBV0D>sRulVACmi_ey+XsMPo0oWd}n{b86i@zzo+r+F5BKYA@F-UL^qfF+*WM0UM*JefmGy^#?ytPgxhPl z{cWSSx1~~Ur+8t>Xdm0Z;w9X!!!}1ZaKr*7TuCmZ;?%W-ylM|mQ*d(WNNkc@=y^d~ zP`y=(^PAW+<*_yM@x-Pvjd7XT{b{WU&$H?3F0u7GwiY;6ZV9X&UYBv&@z^OO7)dkn zR&Qk=);K2GIKNX^&(VG>+aJaZZxi@E6_1(LesGru7c4e`x5-!7@fP;7TC;crA31KK zFt4Ms#e=&KPRBaAg_BdU8|$Sfuw~{7Z>F==+DZIG{3FUSuPL=WzI=>Aqj?^@zyXSd zhj@(K`vk6+-DZA2kHM_+N)B%zQzx(YU`%eNw#nYZov!WS@3()zz3RqV;{7&VZ11Kv z08UJb?D6;Q)^<7k+%8wPkw3)PJ#nOyn>6`ml`GT0hgphdSlY6Ez+i`abyM5Zw}T=@|O$#97-j152AcTSg? zY5{nmfa+B|oyT9TZOXAJEbkcL)OPFB%%1^Ivom<>c6z{R2JcGnzFX8U!{t-F9ASR{ zEk>txXEJ#!yE5~9#Em(p?LNj!Oc>U_A94Nl&NcYQ_#vJS&uoo8PUCcyO}#{>@<@Ow z$H(dF4`=@SINgrpZ}>wl)$|W1PZ~n<)WK zVkF>=6OcLLwtJr0IpoYK$?6s!b?3v&6a#R0axYJai5s*cdD{kOPO=a1|KJEc$TVE& zoZG+RY5WH!QYT;z8@tQhdAuCE{SUuqum)a|b(B(EV0M3J;skm49(c-0+Ro7DwxgUU z@UlA_p2rW)Fh7^+X83V-7vF821TbIA)G>sgL&2Hy2r(MsTLayAh;l&NL zjN3HvaGSC5IeaU6M#9vJO^_n~!u}QCpwGItxv+y15A6)EkQU5619o%v`A0AI<&S1ElkB1-d%Cf%_OX#V* zm}#3!f-dk3_*5pN8@DG(%oVN)mxK`{t8`H;5re15ngp)5>7AQEI(x7-xfCa|Hlb{R zXY-s`c>Bd*o3E$1_2;gKmn!0IGKtZ4!&AALDxS!h&9o@i9Zcqn1Vc;~JDa0Q==80c zyTsLAH3s`WsU3wnxwF-`BvseaOefOe=Ws7oO5wA-4eE(r6%v@i<8Ra92e?tWbpq#$ z2Rtuni-J>Kbcp3p)3_Z$9sJuAi^R~Mps(WX@EB9_huHR)E8FB()&f^fJ{DPBO=CQ< zcx9X7YPtfr^`@OGJ9e*ZAHGTxJeLVy7-CX^K7i1e(J%$1cA;0RO9>EyPzg&ZkCDcx zS9Zy|%HRe7ouRzw{e24u0o4pXVG+Q*TG&eb=&D8Y6mu3z<*ePG5=@cS{GTNALT_OI z!a9xB*y;9z81J@WbxN(329Bm$sci-DMkj1BN`}`mpj@mxkRk7^i}?N39bSXkcsySt|<{#L#Xkc4zu$pX!Z&&D4P9hjs7~4QAZf2{8 z)#Aoc++q#!;K1Nvj+eTJ7xAqFYX=WNJk~(hKwERT95PkFZ-9PhzEqQ`?Va-T+O>lO z{5o@>^mTmaWOp4e@Yt439bnN8QGj78oMY3Ww0IpdWMO~ z=@ZxRkPkF(CxPo(iZ@nmD_mQ%U9Z$MV)I$4xuW>}S*C7x*87adKV}$Mrv^|KqQ5#t z!kafUJt79lTzeQZM)(aK4G*RqBh^Bc%^v@0qkk_1e}@rn;y(d)2LIaP-ESLVt^E7i zhT5(lXQSE7>zgtkUZyznFT^M4x~0!D3G%-WB;>S$iY4^SOX$p&NJaYDI6z8bEnHH+ z?6Rg_A2X)2FOC%<+5SP1>nsD|#Kr)~&A0L-nU6HF4^p1u;c1D`h z5+P5QRu~V)lH!K6!Xd42NGlxD3ezG)w89asFkY=C#l^F=ER^R)D;&`ZN3_Bbt#Cvu zOf&1#3ioM+`?SJ+TH!veaG#ffR=7_q+@}@p(+bmM4`_uCXoU}Gg%4vl-%c1Y`X zNb7b;>vl-%hIb-J!ynSR9n!iT(z@|LTH)8U!mnwCU(*V|rWJloEBu;P_%*HYYg*yg ztZuBdbioZ?G9v^pnGu4QJXvOh;3YFc@RAuJc*%?qyktfQUNR#DFR2k|B`DAeD9{Qh z&tC1zG_GS^))G0R>vY0iCoc&tC1zG_GS^))G0R>tC1zN!? zx-3zk#pgGQz5(S4h!UNI_0Wkw8e7 z%aE=qA)R( zS4h!UNYPhF(N{>(S4h!UNYPhF(HFNaMPDIBUm-QnU9r|7Fs(N~|MuRcXzbfM`} z^wp>6t54BapQ5imMPGf2zWNk>^(p%5Q}orR=!>qQeTu&N6n*t6`s!2k)u-sIPtjMO zqOU$hUww+c`V@Upc+jWlt54BapQ5imMPGf2zWNjp^(kuT)1|df*PlL}q$%?0^QnxF zcRnb1&*A2+DFZus>{ImBr|7Fs(H8}EeTu&N6n*t6`s!2k)u-sIPtg~z89Q*J^q40pkkE2{xij!yK(Rm9=sp+akSg} z>1X`*f?o74a6c^>%>I0OO1KZcd~$Iv@g^poJsm$ep+SO+Z%;K2E~-4eN|MNX++<8~ zqwc8%%DzXfB$3Ay2$!VK@nCAFO2l99gVW{ck$N*c#oIAM)5CG^689pOo2*lDjrLVO zWIFe0mOw8~ag7wE8NpA-`bp*K+^fswkp!Mnp7j>9SeIT5ueG!B6LK8m>ilSPyxzV` z;>{M133SRmNz=|vsBXMDGdK1Aarp@^asUY>aOKdUlai!Hc%A!+Npv0mq!jIjw?b(*51RzQ zOvAtzy-&bCM}v#z&RMIte0a3(rE<9v&mWb5yjSpOMLfBOyZpFr-_-K9$~Uvy)8$4v zm2a(p_vKoqzO(UdLAo}wGxhXamd2{QYSh@KUlWkf_h0u0@b?g>aH5uoLzhlU9TbN9 zxS(=yFqDffO^sm7H4LtrCu&c0Uv5&gOITi#)c#@G$&a#cJ203niIVLw(^<_4JbLZ; zq$&$PDxcXB-%D+qd5(8!;Iw9wG-FU(FstyW!Y#CZ%Z6OQi&?uSgyf^j1Ls}MA1}7% z`q9J=BO=q@Alg+x3qPt3+vToW6kq!TcvWmDPa*d!zDy?%twfDZC*k(>G|BhOAGJ6a zub8QqY0RtGKmDwCiP9InWHH;kgX5E~s_JR0u1a{yuwx0uNvjmG ztKK?Jv*hi=5`JJt>VX8=>-oGM*WvUABdMg`%@T1xGEVMmR_s;@oXHa&H5)X$63~yP zsd9XRXUVPx5v-DLx^-v*>?*3~o?i6yt55Az^%f#JCHmKSd|z&cmPId8QC&?{ysIX* zeBi!LKakO`=#G_9e7&vOPV;p6RrWenA9;k$#!g>-(ZiC}vaY^f@)iDM9;J!zSTt4b zj%c-a%64Uvs%B9Je$i8zV}llsZ(A0jn#OE=y;3H8bPBr7Td5zxJ==2pVLO??^<0O> zR+Fw78XZOkx<%eg@;qCW5?Z=!XYj)X7jtd8qtlJM^y0i&dgOJ;uG05A7zJ(;^F^#x z%^;pn46Vd5kn+^kLpW`07pq?J1|O)`tK1;9M-Js-p>;n9Sn1H8v{skZ#nZTm7wuMl ztpy8q)F>9vb|zQ$gC{b4ueMUS*-oxja9Z7_agsE>NRsh+-F`>8K_D+a(Uu!IVNp*v zw#nsozPjo4#}s;3a?CKxrXD&nZ{z1^BTbZ>5zMeRp@IcX8B*~w+1=s0pzA3~pZQ z=YU*G{(-M;)MCC`-O0wgI{25I6ixSfE zINzz;wvraltKldBt?epKiu3v|#n04t&Kr5VB{Sx2&f`oqL9+~eYCZ^`pjoO_AA_6J z^^RIAXOqoYjTNn;Std~wh&D3Xm3m`OlE!OBw5oaKKXBuVuh!;#t=#2gva=glY1QX< zj7pJiCAXZcdKyfe;~$}(G@C%=XW1LPP_av};Y(ji*K6K=E(XgVa7jOqL%AI_wu8LQ z7{@WTRCY(2#lUNmWa|ms5v*Stl!>e)KNKsBWCg?KX0d`%TS30nPqOC6vqX>|1r&m^ z#x@tuEHro<8ojoi?7MWeXg7u3uhO^h4_}+?Jh@j}clfubzs~eXlNVd!*)qGvdnNVA z(bYEP`LN11S8(0lDobQG8#`Zxjb8w6Ze>MP>JC|=kUHB|I#ac&pz`Q$m`1$o)@k=7 z;z?)C0LYhB?bwVHU4@M_`w4c@>!FV)p3WARzYSX1@~dic*k3+nYc&AZ@I2E`KkFx# zUi9ALVUpIuqt$W=n#vCO#&*&9?`{z-r%S0|P5msKix$*{`uQ?lZPhV!{+Phgcnt9N zPJD;+g8`XsjLs>3M4dGb9;*Qd^ch^b*P7ZE3kYj2fP;ah^=3})m z1&;t7kyq_8wQs<@q;lQ_zx>&zbCK}?%UvgfT7|au{3KnZum~P9Xw?e7RvYX48XZg5 z(egLyv7$G#+Y>y95HDZ!uC|-c*dwXoO1X_zr;1BEbr8_>uZrqpvlP9@=7+lo?aGOx zn$0|UtbwR@>oWV=oy=5KeL}7+jP-4n;^m2S5pQ1fermR?`nXZsLFMV`KPLRh*6nzY z&d7}2ADaoA!hS@K-ZarQgW49@IVN1|`>EvSeM$<%cHNV64YNc0U9uTXKb^kWA$BDn zj_a~st9gVeJu0W2bBE5!ov%7tgsHYHs;An)E)~7U z=C{*2NpVyt_-02>wZiR2Bjj_z^BG>)*U*H-xRtGBGPcGVTGE{Gql_t4l$DX(HxY`9VN@5n>5=l%q_2D zea$h(j#Sm8+a}F?c1{$SZjRQ7<={9+^l}%SS$tM7AY_bjH-pG!$ z?Y`8mPrU3Q8*O%dJlREVSHt~@R|#p^=##`h{jA<~mZxOpaNrZ(&g7rWZM5StUf;yk zwfch(n#xZMOn26d}SnU~g%}DLt*KeHATGh@1wbC^cLaluL+(1?2)!7U$ zY~dDGy}6W-^aj}=#uvur1RMW+T2YyJ@@iUrTf?xa5g(+S-d7UGJd8UjDEbU!*`?Yx z(icA2^j+0eB{RppZED}#dbZXgx1$~Mw=wo^aKzASIG0kTCc<)ywZ6ziVOQ_=RHRh( zM?lpwiM-kaZRkW^252;S_FHpSa8;`2__dl-u6VubqSV}OUctIH9S;BHl<2x{Grw8` z%!4gj4sV1mu*oT3syioOQ-NIPs(7~zTU&J(hP`s-iZa4aaq{(|_pj{?e4xfLUdnW~ zTyOD3tWz*>n0 zkjcHLr=&2#1EhF)JAVScZC5K51BtBb81t;-l+=Yrpb~gmDaNaJbG+-^x(}5~F%jkC z)taAHw5SFS9&wT8`2F7=TLPVckkXVjIBU6eL7rp`T@>}0dJRXvbvXw30GYR+a!akE z3xZGDc=G5pghX)E@Rd-SM_ZG3mnt+Q7TL62 zHI)*`*By%037$y$>M*`T21;H=OIw}EsFo*H9f$zjEkB%92Zne9hmt0*U+CPVQ_h7^itQs&K+*lS+4kb+=b{b9J{C_dwKC^ViRY_ruZcYN*gb z{`YdV!43BzJ|#A@MWUjHvX5$HaSSn(4M5ELL%HiD+tyB8viw^7ddP;Gsa&%ej__a5 z3G*!SK=gC)Q1h@YzA3SP3}sa!YWTCXM$#>oy6T4myIU>-ah9=|(E)A-?i zve6sPPJo&Ojy8G~K)5U(8qn!ak38sD73+MviEr@XmIop|5xUx>PDp;OQABW87FCW@ z$ynucI=RAC3_+rZ)~rnYaj{+8B&m^+s87i}fddZtQ{#P|{cp3)^f>Coo4APJ^(!H(TQF$l~N)PEA!3 z*XcHc-1^~YIl>XGlX+(22gycG*D{gYEuoS$DrmzYjtEvT=1{wJ8;+)T!$~}w`ysd6 zI34RC>>Q=*XT$hL6>_qcn|PCF!wGgb(I>=Ri2iSk(^A>3#IJ8DF3CR|-o`UzlI9uS zCL1eqhwd`RJ(YL^&UG@0{JQkv&6;= bin.Mean() + }) + if i < 0 || i == r.bins.Len() { + // TODO(blake): Maybe use an .insert(i, bin) instead of + // performing the extra work of a heap.Push. + heap.Push(&r.bins, bin) + return + } + r.bins[i].Update(bin) +} + +func (r *reservoir) compress() { + for r.bins.Len() > r.maxBins { + minGapIndex := -1 + minGap := math.MaxFloat64 + for i := 0; i < r.bins.Len()-1; i++ { + gap := gapWeight(r.bins[i], r.bins[i+1]) + if minGap > gap { + minGap = gap + minGapIndex = i + } + } + prev := r.bins[minGapIndex] + next := r.bins.remove(minGapIndex + 1) + prev.Update(next) + } +} + +func gapWeight(prev, next *Bin) float64 { + return next.Mean() - prev.Mean() +} diff --git a/example/prometheus-mock/vendor/github.com/beorn7/perks/histogram/histogram_test.go b/example/prometheus-mock/vendor/github.com/beorn7/perks/histogram/histogram_test.go new file mode 100644 index 0000000..0575ebe --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/beorn7/perks/histogram/histogram_test.go @@ -0,0 +1,38 @@ +package histogram + +import ( + "math/rand" + "testing" +) + +func TestHistogram(t *testing.T) { + const numPoints = 1e6 + const maxBins = 3 + + h := New(maxBins) + for i := 0; i < numPoints; i++ { + f := rand.ExpFloat64() + h.Insert(f) + } + + bins := h.Bins() + if g := len(bins); g > maxBins { + t.Fatalf("got %d bins, wanted <= %d", g, maxBins) + } + + for _, b := range bins { + t.Logf("%+v", b) + } + + if g := count(h.Bins()); g != numPoints { + t.Fatalf("binned %d points, wanted %d", g, numPoints) + } +} + +func count(bins Bins) int { + binCounts := 0 + for _, b := range bins { + binCounts += b.Count + } + return binCounts +} diff --git a/example/prometheus-mock/vendor/github.com/beorn7/perks/quantile/bench_test.go b/example/prometheus-mock/vendor/github.com/beorn7/perks/quantile/bench_test.go new file mode 100644 index 0000000..0bd0e4e --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/beorn7/perks/quantile/bench_test.go @@ -0,0 +1,63 @@ +package quantile + +import ( + "testing" +) + +func BenchmarkInsertTargeted(b *testing.B) { + b.ReportAllocs() + + s := NewTargeted(Targets) + b.ResetTimer() + for i := float64(0); i < float64(b.N); i++ { + s.Insert(i) + } +} + +func BenchmarkInsertTargetedSmallEpsilon(b *testing.B) { + s := NewTargeted(TargetsSmallEpsilon) + b.ResetTimer() + for i := float64(0); i < float64(b.N); i++ { + s.Insert(i) + } +} + +func BenchmarkInsertBiased(b *testing.B) { + s := NewLowBiased(0.01) + b.ResetTimer() + for i := float64(0); i < float64(b.N); i++ { + s.Insert(i) + } +} + +func BenchmarkInsertBiasedSmallEpsilon(b *testing.B) { + s := NewLowBiased(0.0001) + b.ResetTimer() + for i := float64(0); i < float64(b.N); i++ { + s.Insert(i) + } +} + +func BenchmarkQuery(b *testing.B) { + s := NewTargeted(Targets) + for i := float64(0); i < 1e6; i++ { + s.Insert(i) + } + b.ResetTimer() + n := float64(b.N) + for i := float64(0); i < n; i++ { + s.Query(i / n) + } +} + +func BenchmarkQuerySmallEpsilon(b *testing.B) { + s := NewTargeted(TargetsSmallEpsilon) + for i := float64(0); i < 1e6; i++ { + s.Insert(i) + } + b.ResetTimer() + n := float64(b.N) + for i := float64(0); i < n; i++ { + s.Query(i / n) + } +} diff --git a/example/prometheus-mock/vendor/github.com/beorn7/perks/quantile/example_test.go b/example/prometheus-mock/vendor/github.com/beorn7/perks/quantile/example_test.go new file mode 100644 index 0000000..ab3293a --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/beorn7/perks/quantile/example_test.go @@ -0,0 +1,121 @@ +// +build go1.1 + +package quantile_test + +import ( + "bufio" + "fmt" + "log" + "os" + "strconv" + "time" + + "github.com/beorn7/perks/quantile" +) + +func Example_simple() { + ch := make(chan float64) + go sendFloats(ch) + + // Compute the 50th, 90th, and 99th percentile. + q := quantile.NewTargeted(map[float64]float64{ + 0.50: 0.005, + 0.90: 0.001, + 0.99: 0.0001, + }) + for v := range ch { + q.Insert(v) + } + + fmt.Println("perc50:", q.Query(0.50)) + fmt.Println("perc90:", q.Query(0.90)) + fmt.Println("perc99:", q.Query(0.99)) + fmt.Println("count:", q.Count()) + // Output: + // perc50: 5 + // perc90: 16 + // perc99: 223 + // count: 2388 +} + +func Example_mergeMultipleStreams() { + // Scenario: + // We have multiple database shards. On each shard, there is a process + // collecting query response times from the database logs and inserting + // them into a Stream (created via NewTargeted(0.90)), much like the + // Simple example. These processes expose a network interface for us to + // ask them to serialize and send us the results of their + // Stream.Samples so we may Merge and Query them. + // + // NOTES: + // * These sample sets are small, allowing us to get them + // across the network much faster than sending the entire list of data + // points. + // + // * For this to work correctly, we must supply the same quantiles + // a priori the process collecting the samples supplied to NewTargeted, + // even if we do not plan to query them all here. + ch := make(chan quantile.Samples) + getDBQuerySamples(ch) + q := quantile.NewTargeted(map[float64]float64{0.90: 0.001}) + for samples := range ch { + q.Merge(samples) + } + fmt.Println("perc90:", q.Query(0.90)) +} + +func Example_window() { + // Scenario: We want the 90th, 95th, and 99th percentiles for each + // minute. + + ch := make(chan float64) + go sendStreamValues(ch) + + tick := time.NewTicker(1 * time.Minute) + q := quantile.NewTargeted(map[float64]float64{ + 0.90: 0.001, + 0.95: 0.0005, + 0.99: 0.0001, + }) + for { + select { + case t := <-tick.C: + flushToDB(t, q.Samples()) + q.Reset() + case v := <-ch: + q.Insert(v) + } + } +} + +func sendStreamValues(ch chan float64) { + // Use your imagination +} + +func flushToDB(t time.Time, samples quantile.Samples) { + // Use your imagination +} + +// This is a stub for the above example. In reality this would hit the remote +// servers via http or something like it. +func getDBQuerySamples(ch chan quantile.Samples) {} + +func sendFloats(ch chan<- float64) { + f, err := os.Open("exampledata.txt") + if err != nil { + log.Fatal(err) + } + sc := bufio.NewScanner(f) + for sc.Scan() { + b := sc.Bytes() + v, err := strconv.ParseFloat(string(b), 64) + if err != nil { + log.Fatal(err) + } + ch <- v + } + if sc.Err() != nil { + log.Fatal(sc.Err()) + } + close(ch) +} diff --git a/example/prometheus-mock/vendor/github.com/beorn7/perks/quantile/exampledata.txt b/example/prometheus-mock/vendor/github.com/beorn7/perks/quantile/exampledata.txt new file mode 100644 index 0000000..1602287 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/beorn7/perks/quantile/exampledata.txt @@ -0,0 +1,2388 @@ +8 +5 +26 +12 +5 +235 +13 +6 +28 +30 +3 +3 +3 +3 +5 +2 +33 +7 +2 +4 +7 +12 +14 +5 +8 +3 +10 +4 +5 +3 +6 +6 +209 +20 +3 +10 +14 +3 +4 +6 +8 +5 +11 +7 +3 +2 +3 +3 +212 +5 +222 +4 +10 +10 +5 +6 +3 +8 +3 +10 +254 +220 +2 +3 +5 +24 +5 +4 +222 +7 +3 +3 +223 +8 +15 +12 +14 +14 +3 +2 +2 +3 +13 +3 +11 +4 +4 +6 +5 +7 +13 +5 +3 +5 +2 +5 +3 +5 +2 +7 +15 +17 +14 +3 +6 +6 +3 +17 +5 +4 +7 +6 +4 +4 +8 +6 +8 +3 +9 +3 +6 +3 +4 +5 +3 +3 +660 +4 +6 +10 +3 +6 +3 +2 +5 +13 +2 +4 +4 +10 +4 +8 +4 +3 +7 +9 +9 +3 +10 +37 +3 +13 +4 +12 +3 +6 +10 +8 +5 +21 +2 +3 +8 +3 +2 +3 +3 +4 +12 +2 +4 +8 +8 +4 +3 +2 +20 +1 +6 +32 +2 +11 +6 +18 +3 +8 +11 +3 +212 +3 +4 +2 +6 +7 +12 +11 +3 +2 +16 +10 +6 +4 +6 +3 +2 +7 +3 +2 +2 +2 +2 +5 +6 +4 +3 +10 +3 +4 +6 +5 +3 +4 +4 +5 +6 +4 +3 +4 +4 +5 +7 +5 +5 +3 +2 +7 +2 +4 +12 +4 +5 +6 +2 +4 +4 +8 +4 +15 +13 +7 +16 +5 +3 +23 +5 +5 +7 +3 +2 +9 +8 +7 +5 +8 +11 +4 +10 +76 +4 +47 +4 +3 +2 +7 +4 +2 +3 +37 +10 +4 +2 +20 +5 +4 +4 +10 +10 +4 +3 +7 +23 +240 +7 +13 +5 +5 +3 +3 +2 +5 +4 +2 +8 +7 +19 +2 +23 +8 +7 +2 +5 +3 +8 +3 +8 +13 +5 +5 +5 +2 +3 +23 +4 +9 +8 +4 +3 +3 +5 +220 +2 +3 +4 +6 +14 +3 +53 +6 +2 +5 +18 +6 +3 +219 +6 +5 +2 +5 +3 +6 +5 +15 +4 +3 +17 +3 +2 +4 +7 +2 +3 +3 +4 +4 +3 +2 +664 +6 +3 +23 +5 +5 +16 +5 +8 +2 +4 +2 +24 +12 +3 +2 +3 +5 +8 +3 +5 +4 +3 +14 +3 +5 +8 +2 +3 +7 +9 +4 +2 +3 +6 +8 +4 +3 +4 +6 +5 +3 +3 +6 +3 +19 +4 +4 +6 +3 +6 +3 +5 +22 +5 +4 +4 +3 +8 +11 +4 +9 +7 +6 +13 +4 +4 +4 +6 +17 +9 +3 +3 +3 +4 +3 +221 +5 +11 +3 +4 +2 +12 +6 +3 +5 +7 +5 +7 +4 +9 +7 +14 +37 +19 +217 +16 +3 +5 +2 +2 +7 +19 +7 +6 +7 +4 +24 +5 +11 +4 +7 +7 +9 +13 +3 +4 +3 +6 +28 +4 +4 +5 +5 +2 +5 +6 +4 +4 +6 +10 +5 +4 +3 +2 +3 +3 +6 +5 +5 +4 +3 +2 +3 +7 +4 +6 +18 +16 +8 +16 +4 +5 +8 +6 +9 +13 +1545 +6 +215 +6 +5 +6 +3 +45 +31 +5 +2 +2 +4 +3 +3 +2 +5 +4 +3 +5 +7 +7 +4 +5 +8 +5 +4 +749 +2 +31 +9 +11 +2 +11 +5 +4 +4 +7 +9 +11 +4 +5 +4 +7 +3 +4 +6 +2 +15 +3 +4 +3 +4 +3 +5 +2 +13 +5 +5 +3 +3 +23 +4 +4 +5 +7 +4 +13 +2 +4 +3 +4 +2 +6 +2 +7 +3 +5 +5 +3 +29 +5 +4 +4 +3 +10 +2 +3 +79 +16 +6 +6 +7 +7 +3 +5 +5 +7 +4 +3 +7 +9 +5 +6 +5 +9 +6 +3 +6 +4 +17 +2 +10 +9 +3 +6 +2 +3 +21 +22 +5 +11 +4 +2 +17 +2 +224 +2 +14 +3 +4 +4 +2 +4 +4 +4 +4 +5 +3 +4 +4 +10 +2 +6 +3 +3 +5 +7 +2 +7 +5 +6 +3 +218 +2 +2 +5 +2 +6 +3 +5 +222 +14 +6 +33 +3 +2 +5 +3 +3 +3 +9 +5 +3 +3 +2 +7 +4 +3 +4 +3 +5 +6 +5 +26 +4 +13 +9 +7 +3 +221 +3 +3 +4 +4 +4 +4 +2 +18 +5 +3 +7 +9 +6 +8 +3 +10 +3 +11 +9 +5 +4 +17 +5 +5 +6 +6 +3 +2 +4 +12 +17 +6 +7 +218 +4 +2 +4 +10 +3 +5 +15 +3 +9 +4 +3 +3 +6 +29 +3 +3 +4 +5 +5 +3 +8 +5 +6 +6 +7 +5 +3 +5 +3 +29 +2 +31 +5 +15 +24 +16 +5 +207 +4 +3 +3 +2 +15 +4 +4 +13 +5 +5 +4 +6 +10 +2 +7 +8 +4 +6 +20 +5 +3 +4 +3 +12 +12 +5 +17 +7 +3 +3 +3 +6 +10 +3 +5 +25 +80 +4 +9 +3 +2 +11 +3 +3 +2 +3 +8 +7 +5 +5 +19 +5 +3 +3 +12 +11 +2 +6 +5 +5 +5 +3 +3 +3 +4 +209 +14 +3 +2 +5 +19 +4 +4 +3 +4 +14 +5 +6 +4 +13 +9 +7 +4 +7 +10 +2 +9 +5 +7 +2 +8 +4 +6 +5 +5 +222 +8 +7 +12 +5 +216 +3 +4 +4 +6 +3 +14 +8 +7 +13 +4 +3 +3 +3 +3 +17 +5 +4 +3 +33 +6 +6 +33 +7 +5 +3 +8 +7 +5 +2 +9 +4 +2 +233 +24 +7 +4 +8 +10 +3 +4 +15 +2 +16 +3 +3 +13 +12 +7 +5 +4 +207 +4 +2 +4 +27 +15 +2 +5 +2 +25 +6 +5 +5 +6 +13 +6 +18 +6 +4 +12 +225 +10 +7 +5 +2 +2 +11 +4 +14 +21 +8 +10 +3 +5 +4 +232 +2 +5 +5 +3 +7 +17 +11 +6 +6 +23 +4 +6 +3 +5 +4 +2 +17 +3 +6 +5 +8 +3 +2 +2 +14 +9 +4 +4 +2 +5 +5 +3 +7 +6 +12 +6 +10 +3 +6 +2 +2 +19 +5 +4 +4 +9 +2 +4 +13 +3 +5 +6 +3 +6 +5 +4 +9 +6 +3 +5 +7 +3 +6 +6 +4 +3 +10 +6 +3 +221 +3 +5 +3 +6 +4 +8 +5 +3 +6 +4 +4 +2 +54 +5 +6 +11 +3 +3 +4 +4 +4 +3 +7 +3 +11 +11 +7 +10 +6 +13 +223 +213 +15 +231 +7 +3 +7 +228 +2 +3 +4 +4 +5 +6 +7 +4 +13 +3 +4 +5 +3 +6 +4 +6 +7 +2 +4 +3 +4 +3 +3 +6 +3 +7 +3 +5 +18 +5 +6 +8 +10 +3 +3 +3 +2 +4 +2 +4 +4 +5 +6 +6 +4 +10 +13 +3 +12 +5 +12 +16 +8 +4 +19 +11 +2 +4 +5 +6 +8 +5 +6 +4 +18 +10 +4 +2 +216 +6 +6 +6 +2 +4 +12 +8 +3 +11 +5 +6 +14 +5 +3 +13 +4 +5 +4 +5 +3 +28 +6 +3 +7 +219 +3 +9 +7 +3 +10 +6 +3 +4 +19 +5 +7 +11 +6 +15 +19 +4 +13 +11 +3 +7 +5 +10 +2 +8 +11 +2 +6 +4 +6 +24 +6 +3 +3 +3 +3 +6 +18 +4 +11 +4 +2 +5 +10 +8 +3 +9 +5 +3 +4 +5 +6 +2 +5 +7 +4 +4 +14 +6 +4 +4 +5 +5 +7 +2 +4 +3 +7 +3 +3 +6 +4 +5 +4 +4 +4 +3 +3 +3 +3 +8 +14 +2 +3 +5 +3 +2 +4 +5 +3 +7 +3 +3 +18 +3 +4 +4 +5 +7 +3 +3 +3 +13 +5 +4 +8 +211 +5 +5 +3 +5 +2 +5 +4 +2 +655 +6 +3 +5 +11 +2 +5 +3 +12 +9 +15 +11 +5 +12 +217 +2 +6 +17 +3 +3 +207 +5 +5 +4 +5 +9 +3 +2 +8 +5 +4 +3 +2 +5 +12 +4 +14 +5 +4 +2 +13 +5 +8 +4 +225 +4 +3 +4 +5 +4 +3 +3 +6 +23 +9 +2 +6 +7 +233 +4 +4 +6 +18 +3 +4 +6 +3 +4 +4 +2 +3 +7 +4 +13 +227 +4 +3 +5 +4 +2 +12 +9 +17 +3 +7 +14 +6 +4 +5 +21 +4 +8 +9 +2 +9 +25 +16 +3 +6 +4 +7 +8 +5 +2 +3 +5 +4 +3 +3 +5 +3 +3 +3 +2 +3 +19 +2 +4 +3 +4 +2 +3 +4 +4 +2 +4 +3 +3 +3 +2 +6 +3 +17 +5 +6 +4 +3 +13 +5 +3 +3 +3 +4 +9 +4 +2 +14 +12 +4 +5 +24 +4 +3 +37 +12 +11 +21 +3 +4 +3 +13 +4 +2 +3 +15 +4 +11 +4 +4 +3 +8 +3 +4 +4 +12 +8 +5 +3 +3 +4 +2 +220 +3 +5 +223 +3 +3 +3 +10 +3 +15 +4 +241 +9 +7 +3 +6 +6 +23 +4 +13 +7 +3 +4 +7 +4 +9 +3 +3 +4 +10 +5 +5 +1 +5 +24 +2 +4 +5 +5 +6 +14 +3 +8 +2 +3 +5 +13 +13 +3 +5 +2 +3 +15 +3 +4 +2 +10 +4 +4 +4 +5 +5 +3 +5 +3 +4 +7 +4 +27 +3 +6 +4 +15 +3 +5 +6 +6 +5 +4 +8 +3 +9 +2 +6 +3 +4 +3 +7 +4 +18 +3 +11 +3 +3 +8 +9 +7 +24 +3 +219 +7 +10 +4 +5 +9 +12 +2 +5 +4 +4 +4 +3 +3 +19 +5 +8 +16 +8 +6 +22 +3 +23 +3 +242 +9 +4 +3 +3 +5 +7 +3 +3 +5 +8 +3 +7 +5 +14 +8 +10 +3 +4 +3 +7 +4 +6 +7 +4 +10 +4 +3 +11 +3 +7 +10 +3 +13 +6 +8 +12 +10 +5 +7 +9 +3 +4 +7 +7 +10 +8 +30 +9 +19 +4 +3 +19 +15 +4 +13 +3 +215 +223 +4 +7 +4 +8 +17 +16 +3 +7 +6 +5 +5 +4 +12 +3 +7 +4 +4 +13 +4 +5 +2 +5 +6 +5 +6 +6 +7 +10 +18 +23 +9 +3 +3 +6 +5 +2 +4 +2 +7 +3 +3 +2 +5 +5 +14 +10 +224 +6 +3 +4 +3 +7 +5 +9 +3 +6 +4 +2 +5 +11 +4 +3 +3 +2 +8 +4 +7 +4 +10 +7 +3 +3 +18 +18 +17 +3 +3 +3 +4 +5 +3 +3 +4 +12 +7 +3 +11 +13 +5 +4 +7 +13 +5 +4 +11 +3 +12 +3 +6 +4 +4 +21 +4 +6 +9 +5 +3 +10 +8 +4 +6 +4 +4 +6 +5 +4 +8 +6 +4 +6 +4 +4 +5 +9 +6 +3 +4 +2 +9 +3 +18 +2 +4 +3 +13 +3 +6 +6 +8 +7 +9 +3 +2 +16 +3 +4 +6 +3 +2 +33 +22 +14 +4 +9 +12 +4 +5 +6 +3 +23 +9 +4 +3 +5 +5 +3 +4 +5 +3 +5 +3 +10 +4 +5 +5 +8 +4 +4 +6 +8 +5 +4 +3 +4 +6 +3 +3 +3 +5 +9 +12 +6 +5 +9 +3 +5 +3 +2 +2 +2 +18 +3 +2 +21 +2 +5 +4 +6 +4 +5 +10 +3 +9 +3 +2 +10 +7 +3 +6 +6 +4 +4 +8 +12 +7 +3 +7 +3 +3 +9 +3 +4 +5 +4 +4 +5 +5 +10 +15 +4 +4 +14 +6 +227 +3 +14 +5 +216 +22 +5 +4 +2 +2 +6 +3 +4 +2 +9 +9 +4 +3 +28 +13 +11 +4 +5 +3 +3 +2 +3 +3 +5 +3 +4 +3 +5 +23 +26 +3 +4 +5 +6 +4 +6 +3 +5 +5 +3 +4 +3 +2 +2 +2 +7 +14 +3 +6 +7 +17 +2 +2 +15 +14 +16 +4 +6 +7 +13 +6 +4 +5 +6 +16 +3 +3 +28 +3 +6 +15 +3 +9 +2 +4 +6 +3 +3 +22 +4 +12 +6 +7 +2 +5 +4 +10 +3 +16 +6 +9 +2 +5 +12 +7 +5 +5 +5 +5 +2 +11 +9 +17 +4 +3 +11 +7 +3 +5 +15 +4 +3 +4 +211 +8 +7 +5 +4 +7 +6 +7 +6 +3 +6 +5 +6 +5 +3 +4 +4 +26 +4 +6 +10 +4 +4 +3 +2 +3 +3 +4 +5 +9 +3 +9 +4 +4 +5 +5 +8 +2 +4 +2 +3 +8 +4 +11 +19 +5 +8 +6 +3 +5 +6 +12 +3 +2 +4 +16 +12 +3 +4 +4 +8 +6 +5 +6 +6 +219 +8 +222 +6 +16 +3 +13 +19 +5 +4 +3 +11 +6 +10 +4 +7 +7 +12 +5 +3 +3 +5 +6 +10 +3 +8 +2 +5 +4 +7 +2 +4 +4 +2 +12 +9 +6 +4 +2 +40 +2 +4 +10 +4 +223 +4 +2 +20 +6 +7 +24 +5 +4 +5 +2 +20 +16 +6 +5 +13 +2 +3 +3 +19 +3 +2 +4 +5 +6 +7 +11 +12 +5 +6 +7 +7 +3 +5 +3 +5 +3 +14 +3 +4 +4 +2 +11 +1 +7 +3 +9 +6 +11 +12 +5 +8 +6 +221 +4 +2 +12 +4 +3 +15 +4 +5 +226 +7 +218 +7 +5 +4 +5 +18 +4 +5 +9 +4 +4 +2 +9 +18 +18 +9 +5 +6 +6 +3 +3 +7 +3 +5 +4 +4 +4 +12 +3 +6 +31 +5 +4 +7 +3 +6 +5 +6 +5 +11 +2 +2 +11 +11 +6 +7 +5 +8 +7 +10 +5 +23 +7 +4 +3 +5 +34 +2 +5 +23 +7 +3 +6 +8 +4 +4 +4 +2 +5 +3 +8 +5 +4 +8 +25 +2 +3 +17 +8 +3 +4 +8 +7 +3 +15 +6 +5 +7 +21 +9 +5 +6 +6 +5 +3 +2 +3 +10 +3 +6 +3 +14 +7 +4 +4 +8 +7 +8 +2 +6 +12 +4 +213 +6 +5 +21 +8 +2 +5 +23 +3 +11 +2 +3 +6 +25 +2 +3 +6 +7 +6 +6 +4 +4 +6 +3 +17 +9 +7 +6 +4 +3 +10 +7 +2 +3 +3 +3 +11 +8 +3 +7 +6 +4 +14 +36 +3 +4 +3 +3 +22 +13 +21 +4 +2 +7 +4 +4 +17 +15 +3 +7 +11 +2 +4 +7 +6 +209 +6 +3 +2 +2 +24 +4 +9 +4 +3 +3 +3 +29 +2 +2 +4 +3 +3 +5 +4 +6 +3 +3 +2 +4 diff --git a/example/prometheus-mock/vendor/github.com/beorn7/perks/quantile/stream.go b/example/prometheus-mock/vendor/github.com/beorn7/perks/quantile/stream.go new file mode 100644 index 0000000..f4cabd6 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/beorn7/perks/quantile/stream.go @@ -0,0 +1,292 @@ +// Package quantile computes approximate quantiles over an unbounded data +// stream within low memory and CPU bounds. +// +// A small amount of accuracy is traded to achieve the above properties. +// +// Multiple streams can be merged before calling Query to generate a single set +// of results. This is meaningful when the streams represent the same type of +// data. See Merge and Samples. +// +// For more detailed information about the algorithm used, see: +// +// Effective Computation of Biased Quantiles over Data Streams +// +// http://www.cs.rutgers.edu/~muthu/bquant.pdf +package quantile + +import ( + "math" + "sort" +) + +// Sample holds an observed value and meta information for compression. JSON +// tags have been added for convenience. +type Sample struct { + Value float64 `json:",string"` + Width float64 `json:",string"` + Delta float64 `json:",string"` +} + +// Samples represents a slice of samples. It implements sort.Interface. +type Samples []Sample + +func (a Samples) Len() int { return len(a) } +func (a Samples) Less(i, j int) bool { return a[i].Value < a[j].Value } +func (a Samples) Swap(i, j int) { a[i], a[j] = a[j], a[i] } + +type invariant func(s *stream, r float64) float64 + +// NewLowBiased returns an initialized Stream for low-biased quantiles +// (e.g. 0.01, 0.1, 0.5) where the needed quantiles are not known a priori, but +// error guarantees can still be given even for the lower ranks of the data +// distribution. +// +// The provided epsilon is a relative error, i.e. the true quantile of a value +// returned by a query is guaranteed to be within (1±Epsilon)*Quantile. +// +// See http://www.cs.rutgers.edu/~muthu/bquant.pdf for time, space, and error +// properties. +func NewLowBiased(epsilon float64) *Stream { + ƒ := func(s *stream, r float64) float64 { + return 2 * epsilon * r + } + return newStream(ƒ) +} + +// NewHighBiased returns an initialized Stream for high-biased quantiles +// (e.g. 0.01, 0.1, 0.5) where the needed quantiles are not known a priori, but +// error guarantees can still be given even for the higher ranks of the data +// distribution. +// +// The provided epsilon is a relative error, i.e. the true quantile of a value +// returned by a query is guaranteed to be within 1-(1±Epsilon)*(1-Quantile). +// +// See http://www.cs.rutgers.edu/~muthu/bquant.pdf for time, space, and error +// properties. +func NewHighBiased(epsilon float64) *Stream { + ƒ := func(s *stream, r float64) float64 { + return 2 * epsilon * (s.n - r) + } + return newStream(ƒ) +} + +// NewTargeted returns an initialized Stream concerned with a particular set of +// quantile values that are supplied a priori. Knowing these a priori reduces +// space and computation time. The targets map maps the desired quantiles to +// their absolute errors, i.e. the true quantile of a value returned by a query +// is guaranteed to be within (Quantile±Epsilon). +// +// See http://www.cs.rutgers.edu/~muthu/bquant.pdf for time, space, and error properties. +func NewTargeted(targets map[float64]float64) *Stream { + ƒ := func(s *stream, r float64) float64 { + var m = math.MaxFloat64 + var f float64 + for quantile, epsilon := range targets { + if quantile*s.n <= r { + f = (2 * epsilon * r) / quantile + } else { + f = (2 * epsilon * (s.n - r)) / (1 - quantile) + } + if f < m { + m = f + } + } + return m + } + return newStream(ƒ) +} + +// Stream computes quantiles for a stream of float64s. It is not thread-safe by +// design. Take care when using across multiple goroutines. +type Stream struct { + *stream + b Samples + sorted bool +} + +func newStream(ƒ invariant) *Stream { + x := &stream{ƒ: ƒ} + return &Stream{x, make(Samples, 0, 500), true} +} + +// Insert inserts v into the stream. +func (s *Stream) Insert(v float64) { + s.insert(Sample{Value: v, Width: 1}) +} + +func (s *Stream) insert(sample Sample) { + s.b = append(s.b, sample) + s.sorted = false + if len(s.b) == cap(s.b) { + s.flush() + } +} + +// Query returns the computed qth percentiles value. If s was created with +// NewTargeted, and q is not in the set of quantiles provided a priori, Query +// will return an unspecified result. +func (s *Stream) Query(q float64) float64 { + if !s.flushed() { + // Fast path when there hasn't been enough data for a flush; + // this also yields better accuracy for small sets of data. + l := len(s.b) + if l == 0 { + return 0 + } + i := int(math.Ceil(float64(l) * q)) + if i > 0 { + i -= 1 + } + s.maybeSort() + return s.b[i].Value + } + s.flush() + return s.stream.query(q) +} + +// Merge merges samples into the underlying streams samples. This is handy when +// merging multiple streams from separate threads, database shards, etc. +// +// ATTENTION: This method is broken and does not yield correct results. The +// underlying algorithm is not capable of merging streams correctly. +func (s *Stream) Merge(samples Samples) { + sort.Sort(samples) + s.stream.merge(samples) +} + +// Reset reinitializes and clears the list reusing the samples buffer memory. +func (s *Stream) Reset() { + s.stream.reset() + s.b = s.b[:0] +} + +// Samples returns stream samples held by s. +func (s *Stream) Samples() Samples { + if !s.flushed() { + return s.b + } + s.flush() + return s.stream.samples() +} + +// Count returns the total number of samples observed in the stream +// since initialization. +func (s *Stream) Count() int { + return len(s.b) + s.stream.count() +} + +func (s *Stream) flush() { + s.maybeSort() + s.stream.merge(s.b) + s.b = s.b[:0] +} + +func (s *Stream) maybeSort() { + if !s.sorted { + s.sorted = true + sort.Sort(s.b) + } +} + +func (s *Stream) flushed() bool { + return len(s.stream.l) > 0 +} + +type stream struct { + n float64 + l []Sample + ƒ invariant +} + +func (s *stream) reset() { + s.l = s.l[:0] + s.n = 0 +} + +func (s *stream) insert(v float64) { + s.merge(Samples{{v, 1, 0}}) +} + +func (s *stream) merge(samples Samples) { + // TODO(beorn7): This tries to merge not only individual samples, but + // whole summaries. The paper doesn't mention merging summaries at + // all. Unittests show that the merging is inaccurate. Find out how to + // do merges properly. + var r float64 + i := 0 + for _, sample := range samples { + for ; i < len(s.l); i++ { + c := s.l[i] + if c.Value > sample.Value { + // Insert at position i. + s.l = append(s.l, Sample{}) + copy(s.l[i+1:], s.l[i:]) + s.l[i] = Sample{ + sample.Value, + sample.Width, + math.Max(sample.Delta, math.Floor(s.ƒ(s, r))-1), + // TODO(beorn7): How to calculate delta correctly? + } + i++ + goto inserted + } + r += c.Width + } + s.l = append(s.l, Sample{sample.Value, sample.Width, 0}) + i++ + inserted: + s.n += sample.Width + r += sample.Width + } + s.compress() +} + +func (s *stream) count() int { + return int(s.n) +} + +func (s *stream) query(q float64) float64 { + t := math.Ceil(q * s.n) + t += math.Ceil(s.ƒ(s, t) / 2) + p := s.l[0] + var r float64 + for _, c := range s.l[1:] { + r += p.Width + if r+c.Width+c.Delta > t { + return p.Value + } + p = c + } + return p.Value +} + +func (s *stream) compress() { + if len(s.l) < 2 { + return + } + x := s.l[len(s.l)-1] + xi := len(s.l) - 1 + r := s.n - 1 - x.Width + + for i := len(s.l) - 2; i >= 0; i-- { + c := s.l[i] + if c.Width+x.Width+x.Delta <= s.ƒ(s, r) { + x.Width += c.Width + s.l[xi] = x + // Remove element at i. + copy(s.l[i:], s.l[i+1:]) + s.l = s.l[:len(s.l)-1] + xi -= 1 + } else { + x = c + xi = i + } + r -= c.Width + } +} + +func (s *stream) samples() Samples { + samples := make(Samples, len(s.l)) + copy(samples, s.l) + return samples +} diff --git a/example/prometheus-mock/vendor/github.com/beorn7/perks/quantile/stream_test.go b/example/prometheus-mock/vendor/github.com/beorn7/perks/quantile/stream_test.go new file mode 100644 index 0000000..8551950 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/beorn7/perks/quantile/stream_test.go @@ -0,0 +1,215 @@ +package quantile + +import ( + "math" + "math/rand" + "sort" + "testing" +) + +var ( + Targets = map[float64]float64{ + 0.01: 0.001, + 0.10: 0.01, + 0.50: 0.05, + 0.90: 0.01, + 0.99: 0.001, + } + TargetsSmallEpsilon = map[float64]float64{ + 0.01: 0.0001, + 0.10: 0.001, + 0.50: 0.005, + 0.90: 0.001, + 0.99: 0.0001, + } + LowQuantiles = []float64{0.01, 0.1, 0.5} + HighQuantiles = []float64{0.99, 0.9, 0.5} +) + +const RelativeEpsilon = 0.01 + +func verifyPercsWithAbsoluteEpsilon(t *testing.T, a []float64, s *Stream) { + sort.Float64s(a) + for quantile, epsilon := range Targets { + n := float64(len(a)) + k := int(quantile * n) + if k < 1 { + k = 1 + } + lower := int((quantile - epsilon) * n) + if lower < 1 { + lower = 1 + } + upper := int(math.Ceil((quantile + epsilon) * n)) + if upper > len(a) { + upper = len(a) + } + w, min, max := a[k-1], a[lower-1], a[upper-1] + if g := s.Query(quantile); g < min || g > max { + t.Errorf("q=%f: want %v [%f,%f], got %v", quantile, w, min, max, g) + } + } +} + +func verifyLowPercsWithRelativeEpsilon(t *testing.T, a []float64, s *Stream) { + sort.Float64s(a) + for _, qu := range LowQuantiles { + n := float64(len(a)) + k := int(qu * n) + + lowerRank := int((1 - RelativeEpsilon) * qu * n) + upperRank := int(math.Ceil((1 + RelativeEpsilon) * qu * n)) + w, min, max := a[k-1], a[lowerRank-1], a[upperRank-1] + if g := s.Query(qu); g < min || g > max { + t.Errorf("q=%f: want %v [%f,%f], got %v", qu, w, min, max, g) + } + } +} + +func verifyHighPercsWithRelativeEpsilon(t *testing.T, a []float64, s *Stream) { + sort.Float64s(a) + for _, qu := range HighQuantiles { + n := float64(len(a)) + k := int(qu * n) + + lowerRank := int((1 - (1+RelativeEpsilon)*(1-qu)) * n) + upperRank := int(math.Ceil((1 - (1-RelativeEpsilon)*(1-qu)) * n)) + w, min, max := a[k-1], a[lowerRank-1], a[upperRank-1] + if g := s.Query(qu); g < min || g > max { + t.Errorf("q=%f: want %v [%f,%f], got %v", qu, w, min, max, g) + } + } +} + +func populateStream(s *Stream) []float64 { + a := make([]float64, 0, 1e5+100) + for i := 0; i < cap(a); i++ { + v := rand.NormFloat64() + // Add 5% asymmetric outliers. + if i%20 == 0 { + v = v*v + 1 + } + s.Insert(v) + a = append(a, v) + } + return a +} + +func TestTargetedQuery(t *testing.T) { + rand.Seed(42) + s := NewTargeted(Targets) + a := populateStream(s) + verifyPercsWithAbsoluteEpsilon(t, a, s) +} + +func TestTargetedQuerySmallSampleSize(t *testing.T) { + rand.Seed(42) + s := NewTargeted(TargetsSmallEpsilon) + a := []float64{1, 2, 3, 4, 5} + for _, v := range a { + s.Insert(v) + } + verifyPercsWithAbsoluteEpsilon(t, a, s) + // If not yet flushed, results should be precise: + if !s.flushed() { + for φ, want := range map[float64]float64{ + 0.01: 1, + 0.10: 1, + 0.50: 3, + 0.90: 5, + 0.99: 5, + } { + if got := s.Query(φ); got != want { + t.Errorf("want %f for φ=%f, got %f", want, φ, got) + } + } + } +} + +func TestLowBiasedQuery(t *testing.T) { + rand.Seed(42) + s := NewLowBiased(RelativeEpsilon) + a := populateStream(s) + verifyLowPercsWithRelativeEpsilon(t, a, s) +} + +func TestHighBiasedQuery(t *testing.T) { + rand.Seed(42) + s := NewHighBiased(RelativeEpsilon) + a := populateStream(s) + verifyHighPercsWithRelativeEpsilon(t, a, s) +} + +// BrokenTestTargetedMerge is broken, see Merge doc comment. +func BrokenTestTargetedMerge(t *testing.T) { + rand.Seed(42) + s1 := NewTargeted(Targets) + s2 := NewTargeted(Targets) + a := populateStream(s1) + a = append(a, populateStream(s2)...) + s1.Merge(s2.Samples()) + verifyPercsWithAbsoluteEpsilon(t, a, s1) +} + +// BrokenTestLowBiasedMerge is broken, see Merge doc comment. +func BrokenTestLowBiasedMerge(t *testing.T) { + rand.Seed(42) + s1 := NewLowBiased(RelativeEpsilon) + s2 := NewLowBiased(RelativeEpsilon) + a := populateStream(s1) + a = append(a, populateStream(s2)...) + s1.Merge(s2.Samples()) + verifyLowPercsWithRelativeEpsilon(t, a, s2) +} + +// BrokenTestHighBiasedMerge is broken, see Merge doc comment. +func BrokenTestHighBiasedMerge(t *testing.T) { + rand.Seed(42) + s1 := NewHighBiased(RelativeEpsilon) + s2 := NewHighBiased(RelativeEpsilon) + a := populateStream(s1) + a = append(a, populateStream(s2)...) + s1.Merge(s2.Samples()) + verifyHighPercsWithRelativeEpsilon(t, a, s2) +} + +func TestUncompressed(t *testing.T) { + q := NewTargeted(Targets) + for i := 100; i > 0; i-- { + q.Insert(float64(i)) + } + if g := q.Count(); g != 100 { + t.Errorf("want count 100, got %d", g) + } + // Before compression, Query should have 100% accuracy. + for quantile := range Targets { + w := quantile * 100 + if g := q.Query(quantile); g != w { + t.Errorf("want %f, got %f", w, g) + } + } +} + +func TestUncompressedSamples(t *testing.T) { + q := NewTargeted(map[float64]float64{0.99: 0.001}) + for i := 1; i <= 100; i++ { + q.Insert(float64(i)) + } + if g := q.Samples().Len(); g != 100 { + t.Errorf("want count 100, got %d", g) + } +} + +func TestUncompressedOne(t *testing.T) { + q := NewTargeted(map[float64]float64{0.99: 0.01}) + q.Insert(3.14) + if g := q.Query(0.90); g != 3.14 { + t.Error("want PI, got", g) + } +} + +func TestDefaults(t *testing.T) { + if g := NewTargeted(map[float64]float64{0.99: 0.001}).Query(0.99); g != 0 { + t.Errorf("want 0, got %f", g) + } +} diff --git a/example/prometheus-mock/vendor/github.com/beorn7/perks/topk/topk.go b/example/prometheus-mock/vendor/github.com/beorn7/perks/topk/topk.go new file mode 100644 index 0000000..5ac3d99 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/beorn7/perks/topk/topk.go @@ -0,0 +1,90 @@ +package topk + +import ( + "sort" +) + +// http://www.cs.ucsb.edu/research/tech_reports/reports/2005-23.pdf + +type Element struct { + Value string + Count int +} + +type Samples []*Element + +func (sm Samples) Len() int { + return len(sm) +} + +func (sm Samples) Less(i, j int) bool { + return sm[i].Count < sm[j].Count +} + +func (sm Samples) Swap(i, j int) { + sm[i], sm[j] = sm[j], sm[i] +} + +type Stream struct { + k int + mon map[string]*Element + + // the minimum Element + min *Element +} + +func New(k int) *Stream { + s := new(Stream) + s.k = k + s.mon = make(map[string]*Element) + s.min = &Element{} + + // Track k+1 so that less frequenet items contended for that spot, + // resulting in k being more accurate. + return s +} + +func (s *Stream) Insert(x string) { + s.insert(&Element{x, 1}) +} + +func (s *Stream) Merge(sm Samples) { + for _, e := range sm { + s.insert(e) + } +} + +func (s *Stream) insert(in *Element) { + e := s.mon[in.Value] + if e != nil { + e.Count++ + } else { + if len(s.mon) < s.k+1 { + e = &Element{in.Value, in.Count} + s.mon[in.Value] = e + } else { + e = s.min + delete(s.mon, e.Value) + e.Value = in.Value + e.Count += in.Count + s.min = e + } + } + if e.Count < s.min.Count { + s.min = e + } +} + +func (s *Stream) Query() Samples { + var sm Samples + for _, e := range s.mon { + sm = append(sm, e) + } + sort.Sort(sort.Reverse(sm)) + + if len(sm) < s.k { + return sm + } + + return sm[:s.k] +} diff --git a/example/prometheus-mock/vendor/github.com/beorn7/perks/topk/topk_test.go b/example/prometheus-mock/vendor/github.com/beorn7/perks/topk/topk_test.go new file mode 100644 index 0000000..c24f0f7 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/beorn7/perks/topk/topk_test.go @@ -0,0 +1,57 @@ +package topk + +import ( + "fmt" + "math/rand" + "sort" + "testing" +) + +func TestTopK(t *testing.T) { + stream := New(10) + ss := []*Stream{New(10), New(10), New(10)} + m := make(map[string]int) + for _, s := range ss { + for i := 0; i < 1e6; i++ { + v := fmt.Sprintf("%x", int8(rand.ExpFloat64())) + s.Insert(v) + m[v]++ + } + stream.Merge(s.Query()) + } + + var sm Samples + for x, s := range m { + sm = append(sm, &Element{x, s}) + } + sort.Sort(sort.Reverse(sm)) + + g := stream.Query() + if len(g) != 10 { + t.Fatalf("got %d, want 10", len(g)) + } + for i, e := range g { + if sm[i].Value != e.Value { + t.Errorf("at %d: want %q, got %q", i, sm[i].Value, e.Value) + } + } +} + +func TestQuery(t *testing.T) { + queryTests := []struct { + value string + expected int + }{ + {"a", 1}, + {"b", 2}, + {"c", 2}, + } + + stream := New(2) + for _, tt := range queryTests { + stream.Insert(tt.value) + if n := len(stream.Query()); n != tt.expected { + t.Errorf("want %d, got %d", tt.expected, n) + } + } +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/.gitignore b/example/prometheus-mock/vendor/github.com/golang/protobuf/.gitignore new file mode 100644 index 0000000..8f5b596 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/.gitignore @@ -0,0 +1,16 @@ +.DS_Store +*.[568ao] +*.ao +*.so +*.pyc +._* +.nfs.* +[568a].out +*~ +*.orig +core +_obj +_test +_testmain.go +protoc-gen-go/testdata/multi/*.pb.go +_conformance/_conformance diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/.travis.yml b/example/prometheus-mock/vendor/github.com/golang/protobuf/.travis.yml new file mode 100644 index 0000000..93c6780 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/.travis.yml @@ -0,0 +1,18 @@ +sudo: false +language: go +go: +- 1.6.x +- 1.7.x +- 1.8.x +- 1.9.x + +install: + - go get -v -d -t github.com/golang/protobuf/... + - curl -L https://github.com/google/protobuf/releases/download/v3.3.0/protoc-3.3.0-linux-x86_64.zip -o /tmp/protoc.zip + - unzip /tmp/protoc.zip -d $HOME/protoc + +env: + - PATH=$HOME/protoc/bin:$PATH + +script: + - make all test diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/AUTHORS b/example/prometheus-mock/vendor/github.com/golang/protobuf/AUTHORS new file mode 100644 index 0000000..15167cd --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/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 http://tip.golang.org/AUTHORS. diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/CONTRIBUTORS b/example/prometheus-mock/vendor/github.com/golang/protobuf/CONTRIBUTORS new file mode 100644 index 0000000..1c4577e --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/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 http://tip.golang.org/CONTRIBUTORS. diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/LICENSE b/example/prometheus-mock/vendor/github.com/golang/protobuf/LICENSE new file mode 100644 index 0000000..1b1b192 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/LICENSE @@ -0,0 +1,31 @@ +Go support for Protocol Buffers - Google's data interchange format + +Copyright 2010 The Go Authors. All rights reserved. +https://github.com/golang/protobuf + +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/example/prometheus-mock/vendor/github.com/golang/protobuf/Make.protobuf b/example/prometheus-mock/vendor/github.com/golang/protobuf/Make.protobuf new file mode 100644 index 0000000..15071de --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/Make.protobuf @@ -0,0 +1,40 @@ +# Go support for Protocol Buffers - Google's data interchange format +# +# Copyright 2010 The Go Authors. All rights reserved. +# https://github.com/golang/protobuf +# +# 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. + +# Includable Makefile to add a rule for generating .pb.go files from .proto files +# (Google protocol buffer descriptions). +# Typical use if myproto.proto is a file in package mypackage in this directory: +# +# include $(GOROOT)/src/pkg/github.com/golang/protobuf/Make.protobuf + +%.pb.go: %.proto + protoc --go_out=. $< + diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/Makefile b/example/prometheus-mock/vendor/github.com/golang/protobuf/Makefile new file mode 100644 index 0000000..a1421d8 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/Makefile @@ -0,0 +1,55 @@ +# Go support for Protocol Buffers - Google's data interchange format +# +# Copyright 2010 The Go Authors. All rights reserved. +# https://github.com/golang/protobuf +# +# 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. + + +all: install + +install: + go install ./proto ./jsonpb ./ptypes + go install ./protoc-gen-go + +test: + go test ./proto ./jsonpb ./ptypes + make -C protoc-gen-go/testdata test + +clean: + go clean ./... + +nuke: + go clean -i ./... + +regenerate: + make -C protoc-gen-go/descriptor regenerate + make -C protoc-gen-go/plugin regenerate + make -C protoc-gen-go/testdata regenerate + make -C proto/testdata regenerate + make -C jsonpb/jsonpb_test_proto regenerate + make -C _conformance regenerate diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/README.md b/example/prometheus-mock/vendor/github.com/golang/protobuf/README.md new file mode 100644 index 0000000..207eb6b --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/README.md @@ -0,0 +1,243 @@ +# Go support for Protocol Buffers + +[![Build Status](https://travis-ci.org/golang/protobuf.svg?branch=master)](https://travis-ci.org/golang/protobuf) + +Google's data interchange format. +Copyright 2010 The Go Authors. +https://github.com/golang/protobuf + +This package and the code it generates requires at least Go 1.4. + +This software implements Go bindings for protocol buffers. For +information about protocol buffers themselves, see + https://developers.google.com/protocol-buffers/ + +## Installation ## + +To use this software, you must: +- Install the standard C++ implementation of protocol buffers from + https://developers.google.com/protocol-buffers/ +- Of course, install the Go compiler and tools from + https://golang.org/ + See + https://golang.org/doc/install + for details or, if you are using gccgo, follow the instructions at + https://golang.org/doc/install/gccgo +- Grab the code from the repository and install the proto package. + The simplest way is to run `go get -u github.com/golang/protobuf/protoc-gen-go`. + The compiler plugin, protoc-gen-go, will be installed in $GOBIN, + defaulting to $GOPATH/bin. It must be in your $PATH for the protocol + compiler, protoc, to find it. + +This software has two parts: a 'protocol compiler plugin' that +generates Go source files that, once compiled, can access and manage +protocol buffers; and a library that implements run-time support for +encoding (marshaling), decoding (unmarshaling), and accessing protocol +buffers. + +There is support for gRPC in Go using protocol buffers. +See the note at the bottom of this file for details. + +There are no insertion points in the plugin. + + +## Using protocol buffers with Go ## + +Once the software is installed, there are two steps to using it. +First you must compile the protocol buffer definitions and then import +them, with the support library, into your program. + +To compile the protocol buffer definition, run protoc with the --go_out +parameter set to the directory you want to output the Go code to. + + protoc --go_out=. *.proto + +The generated files will be suffixed .pb.go. See the Test code below +for an example using such a file. + + +The package comment for the proto library contains text describing +the interface provided in Go for protocol buffers. Here is an edited +version. + +========== + +The proto package converts data structures to and from the +wire format of protocol buffers. It works in concert with the +Go source code generated for .proto files by the protocol compiler. + +A summary of the properties of the protocol buffer interface +for a protocol buffer variable v: + + - Names are turned from camel_case to CamelCase for export. + - There are no methods on v to set fields; just treat + them as structure fields. + - There are getters that return a field's value if set, + and return the field's default value if unset. + The getters work even if the receiver is a nil message. + - The zero value for a struct is its correct initialization state. + All desired fields must be set before marshaling. + - A Reset() method will restore a protobuf struct to its zero state. + - Non-repeated fields are pointers to the values; nil means unset. + That is, optional or required field int32 f becomes F *int32. + - Repeated fields are slices. + - Helper functions are available to aid the setting of fields. + Helpers for getting values are superseded by the + GetFoo methods and their use is deprecated. + msg.Foo = proto.String("hello") // set field + - Constants are defined to hold the default values of all fields that + have them. They have the form Default_StructName_FieldName. + Because the getter methods handle defaulted values, + direct use of these constants should be rare. + - Enums are given type names and maps from names to values. + Enum values are prefixed with the enum's type name. Enum types have + a String method, and a Enum method to assist in message construction. + - Nested groups and enums have type names prefixed with the name of + the surrounding message type. + - Extensions are given descriptor names that start with E_, + followed by an underscore-delimited list of the nested messages + that contain it (if any) followed by the CamelCased name of the + extension field itself. HasExtension, ClearExtension, GetExtension + and SetExtension are functions for manipulating extensions. + - Oneof field sets are given a single field in their message, + with distinguished wrapper types for each possible field value. + - Marshal and Unmarshal are functions to encode and decode the wire format. + +When the .proto file specifies `syntax="proto3"`, there are some differences: + + - Non-repeated fields of non-message type are values instead of pointers. + - Enum types do not get an Enum method. + +Consider file test.proto, containing + +```proto + syntax = "proto2"; + package example; + + enum FOO { X = 17; }; + + message Test { + required string label = 1; + optional int32 type = 2 [default=77]; + repeated int64 reps = 3; + optional group OptionalGroup = 4 { + required string RequiredField = 5; + } + } +``` + +To create and play with a Test object from the example package, + +```go + package main + + import ( + "log" + + "github.com/golang/protobuf/proto" + "path/to/example" + ) + + func main() { + test := &example.Test { + Label: proto.String("hello"), + Type: proto.Int32(17), + Reps: []int64{1, 2, 3}, + Optionalgroup: &example.Test_OptionalGroup { + RequiredField: proto.String("good bye"), + }, + } + data, err := proto.Marshal(test) + if err != nil { + log.Fatal("marshaling error: ", err) + } + newTest := &example.Test{} + err = proto.Unmarshal(data, newTest) + if err != nil { + log.Fatal("unmarshaling error: ", err) + } + // Now test and newTest contain the same data. + if test.GetLabel() != newTest.GetLabel() { + log.Fatalf("data mismatch %q != %q", test.GetLabel(), newTest.GetLabel()) + } + // etc. + } +``` + +## Parameters ## + +To pass extra parameters to the plugin, use a comma-separated +parameter list separated from the output directory by a colon: + + + protoc --go_out=plugins=grpc,import_path=mypackage:. *.proto + + +- `import_prefix=xxx` - a prefix that is added onto the beginning of + all imports. Useful for things like generating protos in a + subdirectory, or regenerating vendored protobufs in-place. +- `import_path=foo/bar` - used as the package if no input files + declare `go_package`. If it contains slashes, everything up to the + rightmost slash is ignored. +- `plugins=plugin1+plugin2` - specifies the list of sub-plugins to + load. The only plugin in this repo is `grpc`. +- `Mfoo/bar.proto=quux/shme` - declares that foo/bar.proto is + associated with Go package quux/shme. This is subject to the + import_prefix parameter. + +## gRPC Support ## + +If a proto file specifies RPC services, protoc-gen-go can be instructed to +generate code compatible with gRPC (http://www.grpc.io/). To do this, pass +the `plugins` parameter to protoc-gen-go; the usual way is to insert it into +the --go_out argument to protoc: + + protoc --go_out=plugins=grpc:. *.proto + +## Compatibility ## + +The library and the generated code are expected to be stable over time. +However, we reserve the right to make breaking changes without notice for the +following reasons: + +- Security. A security issue in the specification or implementation may come to + light whose resolution requires breaking compatibility. We reserve the right + to address such security issues. +- Unspecified behavior. There are some aspects of the Protocol Buffers + specification that are undefined. Programs that depend on such unspecified + behavior may break in future releases. +- Specification errors or changes. If it becomes necessary to address an + inconsistency, incompleteness, or change in the Protocol Buffers + specification, resolving the issue could affect the meaning or legality of + existing programs. We reserve the right to address such issues, including + updating the implementations. +- Bugs. If the library has a bug that violates the specification, a program + that depends on the buggy behavior may break if the bug is fixed. We reserve + the right to fix such bugs. +- Adding methods or fields to generated structs. These may conflict with field + names that already exist in a schema, causing applications to break. When the + code generator encounters a field in the schema that would collide with a + generated field or method name, the code generator will append an underscore + to the generated field or method name. +- Adding, removing, or changing methods or fields in generated structs that + start with `XXX`. These parts of the generated code are exported out of + necessity, but should not be considered part of the public API. +- Adding, removing, or changing unexported symbols in generated code. + +Any breaking changes outside of these will be announced 6 months in advance to +protobuf@googlegroups.com. + +You should, whenever possible, use generated code created by the `protoc-gen-go` +tool built at the same commit as the `proto` package. The `proto` package +declares package-level constants in the form `ProtoPackageIsVersionX`. +Application code and generated code may depend on one of these constants to +ensure that compilation will fail if the available version of the proto library +is too old. Whenever we make a change to the generated code that requires newer +library support, in the same commit we will increment the version number of the +generated code and declare a new package-level constant whose name incorporates +the latest version number. Removing a compatibility constant is considered a +breaking change and would be subject to the announcement policy stated above. + +The `protoc-gen-go/generator` package exposes a plugin interface, +which is used by the gRPC code generation. This interface is not +supported and is subject to incompatible changes without notice. diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/_conformance/Makefile b/example/prometheus-mock/vendor/github.com/golang/protobuf/_conformance/Makefile new file mode 100644 index 0000000..89800e2 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/_conformance/Makefile @@ -0,0 +1,33 @@ +# Go support for Protocol Buffers - Google's data interchange format +# +# Copyright 2016 The Go Authors. All rights reserved. +# https://github.com/golang/protobuf +# +# 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. + +regenerate: + protoc --go_out=Mgoogle/protobuf/any.proto=github.com/golang/protobuf/ptypes/any,Mgoogle/protobuf/duration.proto=github.com/golang/protobuf/ptypes/duration,Mgoogle/protobuf/struct.proto=github.com/golang/protobuf/ptypes/struct,Mgoogle/protobuf/timestamp.proto=github.com/golang/protobuf/ptypes/timestamp,Mgoogle/protobuf/wrappers.proto=github.com/golang/protobuf/ptypes/wrappers,Mgoogle/protobuf/field_mask.proto=google.golang.org/genproto/protobuf:. conformance_proto/conformance.proto diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/_conformance/conformance.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/_conformance/conformance.go new file mode 100644 index 0000000..c54212c --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/_conformance/conformance.go @@ -0,0 +1,161 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +// conformance implements the conformance test subprocess protocol as +// documented in conformance.proto. +package main + +import ( + "encoding/binary" + "fmt" + "io" + "os" + + pb "github.com/golang/protobuf/_conformance/conformance_proto" + "github.com/golang/protobuf/jsonpb" + "github.com/golang/protobuf/proto" +) + +func main() { + var sizeBuf [4]byte + inbuf := make([]byte, 0, 4096) + outbuf := proto.NewBuffer(nil) + for { + if _, err := io.ReadFull(os.Stdin, sizeBuf[:]); err == io.EOF { + break + } else if err != nil { + fmt.Fprintln(os.Stderr, "go conformance: read request:", err) + os.Exit(1) + } + size := binary.LittleEndian.Uint32(sizeBuf[:]) + if int(size) > cap(inbuf) { + inbuf = make([]byte, size) + } + inbuf = inbuf[:size] + if _, err := io.ReadFull(os.Stdin, inbuf); err != nil { + fmt.Fprintln(os.Stderr, "go conformance: read request:", err) + os.Exit(1) + } + + req := new(pb.ConformanceRequest) + if err := proto.Unmarshal(inbuf, req); err != nil { + fmt.Fprintln(os.Stderr, "go conformance: parse request:", err) + os.Exit(1) + } + res := handle(req) + + if err := outbuf.Marshal(res); err != nil { + fmt.Fprintln(os.Stderr, "go conformance: marshal response:", err) + os.Exit(1) + } + binary.LittleEndian.PutUint32(sizeBuf[:], uint32(len(outbuf.Bytes()))) + if _, err := os.Stdout.Write(sizeBuf[:]); err != nil { + fmt.Fprintln(os.Stderr, "go conformance: write response:", err) + os.Exit(1) + } + if _, err := os.Stdout.Write(outbuf.Bytes()); err != nil { + fmt.Fprintln(os.Stderr, "go conformance: write response:", err) + os.Exit(1) + } + outbuf.Reset() + } +} + +var jsonMarshaler = jsonpb.Marshaler{ + OrigName: true, +} + +func handle(req *pb.ConformanceRequest) *pb.ConformanceResponse { + var err error + var msg pb.TestAllTypes + switch p := req.Payload.(type) { + case *pb.ConformanceRequest_ProtobufPayload: + err = proto.Unmarshal(p.ProtobufPayload, &msg) + case *pb.ConformanceRequest_JsonPayload: + err = jsonpb.UnmarshalString(p.JsonPayload, &msg) + if err != nil && err.Error() == "unmarshaling Any not supported yet" { + return &pb.ConformanceResponse{ + Result: &pb.ConformanceResponse_Skipped{ + Skipped: err.Error(), + }, + } + } + default: + return &pb.ConformanceResponse{ + Result: &pb.ConformanceResponse_RuntimeError{ + RuntimeError: "unknown request payload type", + }, + } + } + if err != nil { + return &pb.ConformanceResponse{ + Result: &pb.ConformanceResponse_ParseError{ + ParseError: err.Error(), + }, + } + } + switch req.RequestedOutputFormat { + case pb.WireFormat_PROTOBUF: + p, err := proto.Marshal(&msg) + if err != nil { + return &pb.ConformanceResponse{ + Result: &pb.ConformanceResponse_SerializeError{ + SerializeError: err.Error(), + }, + } + } + return &pb.ConformanceResponse{ + Result: &pb.ConformanceResponse_ProtobufPayload{ + ProtobufPayload: p, + }, + } + case pb.WireFormat_JSON: + p, err := jsonMarshaler.MarshalToString(&msg) + if err != nil { + return &pb.ConformanceResponse{ + Result: &pb.ConformanceResponse_SerializeError{ + SerializeError: err.Error(), + }, + } + } + return &pb.ConformanceResponse{ + Result: &pb.ConformanceResponse_JsonPayload{ + JsonPayload: p, + }, + } + default: + return &pb.ConformanceResponse{ + Result: &pb.ConformanceResponse_RuntimeError{ + RuntimeError: "unknown output format", + }, + } + } +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/_conformance/conformance_proto/conformance.pb.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/_conformance/conformance_proto/conformance.pb.go new file mode 100644 index 0000000..ec354ea --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/_conformance/conformance_proto/conformance.pb.go @@ -0,0 +1,1885 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: conformance_proto/conformance.proto + +/* +Package conformance is a generated protocol buffer package. + +It is generated from these files: + conformance_proto/conformance.proto + +It has these top-level messages: + ConformanceRequest + ConformanceResponse + TestAllTypes + ForeignMessage +*/ +package conformance + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" +import google_protobuf "github.com/golang/protobuf/ptypes/any" +import google_protobuf1 "github.com/golang/protobuf/ptypes/duration" +import google_protobuf2 "google.golang.org/genproto/protobuf" +import google_protobuf3 "github.com/golang/protobuf/ptypes/struct" +import google_protobuf4 "github.com/golang/protobuf/ptypes/timestamp" +import google_protobuf5 "github.com/golang/protobuf/ptypes/wrappers" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type WireFormat int32 + +const ( + WireFormat_UNSPECIFIED WireFormat = 0 + WireFormat_PROTOBUF WireFormat = 1 + WireFormat_JSON WireFormat = 2 +) + +var WireFormat_name = map[int32]string{ + 0: "UNSPECIFIED", + 1: "PROTOBUF", + 2: "JSON", +} +var WireFormat_value = map[string]int32{ + "UNSPECIFIED": 0, + "PROTOBUF": 1, + "JSON": 2, +} + +func (x WireFormat) String() string { + return proto.EnumName(WireFormat_name, int32(x)) +} +func (WireFormat) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } + +type ForeignEnum int32 + +const ( + ForeignEnum_FOREIGN_FOO ForeignEnum = 0 + ForeignEnum_FOREIGN_BAR ForeignEnum = 1 + ForeignEnum_FOREIGN_BAZ ForeignEnum = 2 +) + +var ForeignEnum_name = map[int32]string{ + 0: "FOREIGN_FOO", + 1: "FOREIGN_BAR", + 2: "FOREIGN_BAZ", +} +var ForeignEnum_value = map[string]int32{ + "FOREIGN_FOO": 0, + "FOREIGN_BAR": 1, + "FOREIGN_BAZ": 2, +} + +func (x ForeignEnum) String() string { + return proto.EnumName(ForeignEnum_name, int32(x)) +} +func (ForeignEnum) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } + +type TestAllTypes_NestedEnum int32 + +const ( + TestAllTypes_FOO TestAllTypes_NestedEnum = 0 + TestAllTypes_BAR TestAllTypes_NestedEnum = 1 + TestAllTypes_BAZ TestAllTypes_NestedEnum = 2 + TestAllTypes_NEG TestAllTypes_NestedEnum = -1 +) + +var TestAllTypes_NestedEnum_name = map[int32]string{ + 0: "FOO", + 1: "BAR", + 2: "BAZ", + -1: "NEG", +} +var TestAllTypes_NestedEnum_value = map[string]int32{ + "FOO": 0, + "BAR": 1, + "BAZ": 2, + "NEG": -1, +} + +func (x TestAllTypes_NestedEnum) String() string { + return proto.EnumName(TestAllTypes_NestedEnum_name, int32(x)) +} +func (TestAllTypes_NestedEnum) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{2, 0} } + +// Represents a single test case's input. The testee should: +// +// 1. parse this proto (which should always succeed) +// 2. parse the protobuf or JSON payload in "payload" (which may fail) +// 3. if the parse succeeded, serialize the message in the requested format. +type ConformanceRequest struct { + // The payload (whether protobuf of JSON) is always for a TestAllTypes proto + // (see below). + // + // Types that are valid to be assigned to Payload: + // *ConformanceRequest_ProtobufPayload + // *ConformanceRequest_JsonPayload + Payload isConformanceRequest_Payload `protobuf_oneof:"payload"` + // Which format should the testee serialize its message to? + RequestedOutputFormat WireFormat `protobuf:"varint,3,opt,name=requested_output_format,json=requestedOutputFormat,enum=conformance.WireFormat" json:"requested_output_format,omitempty"` +} + +func (m *ConformanceRequest) Reset() { *m = ConformanceRequest{} } +func (m *ConformanceRequest) String() string { return proto.CompactTextString(m) } +func (*ConformanceRequest) ProtoMessage() {} +func (*ConformanceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } + +type isConformanceRequest_Payload interface { + isConformanceRequest_Payload() +} + +type ConformanceRequest_ProtobufPayload struct { + ProtobufPayload []byte `protobuf:"bytes,1,opt,name=protobuf_payload,json=protobufPayload,proto3,oneof"` +} +type ConformanceRequest_JsonPayload struct { + JsonPayload string `protobuf:"bytes,2,opt,name=json_payload,json=jsonPayload,oneof"` +} + +func (*ConformanceRequest_ProtobufPayload) isConformanceRequest_Payload() {} +func (*ConformanceRequest_JsonPayload) isConformanceRequest_Payload() {} + +func (m *ConformanceRequest) GetPayload() isConformanceRequest_Payload { + if m != nil { + return m.Payload + } + return nil +} + +func (m *ConformanceRequest) GetProtobufPayload() []byte { + if x, ok := m.GetPayload().(*ConformanceRequest_ProtobufPayload); ok { + return x.ProtobufPayload + } + return nil +} + +func (m *ConformanceRequest) GetJsonPayload() string { + if x, ok := m.GetPayload().(*ConformanceRequest_JsonPayload); ok { + return x.JsonPayload + } + return "" +} + +func (m *ConformanceRequest) GetRequestedOutputFormat() WireFormat { + if m != nil { + return m.RequestedOutputFormat + } + return WireFormat_UNSPECIFIED +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*ConformanceRequest) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _ConformanceRequest_OneofMarshaler, _ConformanceRequest_OneofUnmarshaler, _ConformanceRequest_OneofSizer, []interface{}{ + (*ConformanceRequest_ProtobufPayload)(nil), + (*ConformanceRequest_JsonPayload)(nil), + } +} + +func _ConformanceRequest_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*ConformanceRequest) + // payload + switch x := m.Payload.(type) { + case *ConformanceRequest_ProtobufPayload: + b.EncodeVarint(1<<3 | proto.WireBytes) + b.EncodeRawBytes(x.ProtobufPayload) + case *ConformanceRequest_JsonPayload: + b.EncodeVarint(2<<3 | proto.WireBytes) + b.EncodeStringBytes(x.JsonPayload) + case nil: + default: + return fmt.Errorf("ConformanceRequest.Payload has unexpected type %T", x) + } + return nil +} + +func _ConformanceRequest_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*ConformanceRequest) + switch tag { + case 1: // payload.protobuf_payload + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeRawBytes(true) + m.Payload = &ConformanceRequest_ProtobufPayload{x} + return true, err + case 2: // payload.json_payload + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeStringBytes() + m.Payload = &ConformanceRequest_JsonPayload{x} + return true, err + default: + return false, nil + } +} + +func _ConformanceRequest_OneofSizer(msg proto.Message) (n int) { + m := msg.(*ConformanceRequest) + // payload + switch x := m.Payload.(type) { + case *ConformanceRequest_ProtobufPayload: + n += proto.SizeVarint(1<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(len(x.ProtobufPayload))) + n += len(x.ProtobufPayload) + case *ConformanceRequest_JsonPayload: + n += proto.SizeVarint(2<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(len(x.JsonPayload))) + n += len(x.JsonPayload) + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +// Represents a single test case's output. +type ConformanceResponse struct { + // Types that are valid to be assigned to Result: + // *ConformanceResponse_ParseError + // *ConformanceResponse_SerializeError + // *ConformanceResponse_RuntimeError + // *ConformanceResponse_ProtobufPayload + // *ConformanceResponse_JsonPayload + // *ConformanceResponse_Skipped + Result isConformanceResponse_Result `protobuf_oneof:"result"` +} + +func (m *ConformanceResponse) Reset() { *m = ConformanceResponse{} } +func (m *ConformanceResponse) String() string { return proto.CompactTextString(m) } +func (*ConformanceResponse) ProtoMessage() {} +func (*ConformanceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } + +type isConformanceResponse_Result interface { + isConformanceResponse_Result() +} + +type ConformanceResponse_ParseError struct { + ParseError string `protobuf:"bytes,1,opt,name=parse_error,json=parseError,oneof"` +} +type ConformanceResponse_SerializeError struct { + SerializeError string `protobuf:"bytes,6,opt,name=serialize_error,json=serializeError,oneof"` +} +type ConformanceResponse_RuntimeError struct { + RuntimeError string `protobuf:"bytes,2,opt,name=runtime_error,json=runtimeError,oneof"` +} +type ConformanceResponse_ProtobufPayload struct { + ProtobufPayload []byte `protobuf:"bytes,3,opt,name=protobuf_payload,json=protobufPayload,proto3,oneof"` +} +type ConformanceResponse_JsonPayload struct { + JsonPayload string `protobuf:"bytes,4,opt,name=json_payload,json=jsonPayload,oneof"` +} +type ConformanceResponse_Skipped struct { + Skipped string `protobuf:"bytes,5,opt,name=skipped,oneof"` +} + +func (*ConformanceResponse_ParseError) isConformanceResponse_Result() {} +func (*ConformanceResponse_SerializeError) isConformanceResponse_Result() {} +func (*ConformanceResponse_RuntimeError) isConformanceResponse_Result() {} +func (*ConformanceResponse_ProtobufPayload) isConformanceResponse_Result() {} +func (*ConformanceResponse_JsonPayload) isConformanceResponse_Result() {} +func (*ConformanceResponse_Skipped) isConformanceResponse_Result() {} + +func (m *ConformanceResponse) GetResult() isConformanceResponse_Result { + if m != nil { + return m.Result + } + return nil +} + +func (m *ConformanceResponse) GetParseError() string { + if x, ok := m.GetResult().(*ConformanceResponse_ParseError); ok { + return x.ParseError + } + return "" +} + +func (m *ConformanceResponse) GetSerializeError() string { + if x, ok := m.GetResult().(*ConformanceResponse_SerializeError); ok { + return x.SerializeError + } + return "" +} + +func (m *ConformanceResponse) GetRuntimeError() string { + if x, ok := m.GetResult().(*ConformanceResponse_RuntimeError); ok { + return x.RuntimeError + } + return "" +} + +func (m *ConformanceResponse) GetProtobufPayload() []byte { + if x, ok := m.GetResult().(*ConformanceResponse_ProtobufPayload); ok { + return x.ProtobufPayload + } + return nil +} + +func (m *ConformanceResponse) GetJsonPayload() string { + if x, ok := m.GetResult().(*ConformanceResponse_JsonPayload); ok { + return x.JsonPayload + } + return "" +} + +func (m *ConformanceResponse) GetSkipped() string { + if x, ok := m.GetResult().(*ConformanceResponse_Skipped); ok { + return x.Skipped + } + return "" +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*ConformanceResponse) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _ConformanceResponse_OneofMarshaler, _ConformanceResponse_OneofUnmarshaler, _ConformanceResponse_OneofSizer, []interface{}{ + (*ConformanceResponse_ParseError)(nil), + (*ConformanceResponse_SerializeError)(nil), + (*ConformanceResponse_RuntimeError)(nil), + (*ConformanceResponse_ProtobufPayload)(nil), + (*ConformanceResponse_JsonPayload)(nil), + (*ConformanceResponse_Skipped)(nil), + } +} + +func _ConformanceResponse_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*ConformanceResponse) + // result + switch x := m.Result.(type) { + case *ConformanceResponse_ParseError: + b.EncodeVarint(1<<3 | proto.WireBytes) + b.EncodeStringBytes(x.ParseError) + case *ConformanceResponse_SerializeError: + b.EncodeVarint(6<<3 | proto.WireBytes) + b.EncodeStringBytes(x.SerializeError) + case *ConformanceResponse_RuntimeError: + b.EncodeVarint(2<<3 | proto.WireBytes) + b.EncodeStringBytes(x.RuntimeError) + case *ConformanceResponse_ProtobufPayload: + b.EncodeVarint(3<<3 | proto.WireBytes) + b.EncodeRawBytes(x.ProtobufPayload) + case *ConformanceResponse_JsonPayload: + b.EncodeVarint(4<<3 | proto.WireBytes) + b.EncodeStringBytes(x.JsonPayload) + case *ConformanceResponse_Skipped: + b.EncodeVarint(5<<3 | proto.WireBytes) + b.EncodeStringBytes(x.Skipped) + case nil: + default: + return fmt.Errorf("ConformanceResponse.Result has unexpected type %T", x) + } + return nil +} + +func _ConformanceResponse_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*ConformanceResponse) + switch tag { + case 1: // result.parse_error + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeStringBytes() + m.Result = &ConformanceResponse_ParseError{x} + return true, err + case 6: // result.serialize_error + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeStringBytes() + m.Result = &ConformanceResponse_SerializeError{x} + return true, err + case 2: // result.runtime_error + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeStringBytes() + m.Result = &ConformanceResponse_RuntimeError{x} + return true, err + case 3: // result.protobuf_payload + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeRawBytes(true) + m.Result = &ConformanceResponse_ProtobufPayload{x} + return true, err + case 4: // result.json_payload + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeStringBytes() + m.Result = &ConformanceResponse_JsonPayload{x} + return true, err + case 5: // result.skipped + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeStringBytes() + m.Result = &ConformanceResponse_Skipped{x} + return true, err + default: + return false, nil + } +} + +func _ConformanceResponse_OneofSizer(msg proto.Message) (n int) { + m := msg.(*ConformanceResponse) + // result + switch x := m.Result.(type) { + case *ConformanceResponse_ParseError: + n += proto.SizeVarint(1<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(len(x.ParseError))) + n += len(x.ParseError) + case *ConformanceResponse_SerializeError: + n += proto.SizeVarint(6<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(len(x.SerializeError))) + n += len(x.SerializeError) + case *ConformanceResponse_RuntimeError: + n += proto.SizeVarint(2<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(len(x.RuntimeError))) + n += len(x.RuntimeError) + case *ConformanceResponse_ProtobufPayload: + n += proto.SizeVarint(3<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(len(x.ProtobufPayload))) + n += len(x.ProtobufPayload) + case *ConformanceResponse_JsonPayload: + n += proto.SizeVarint(4<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(len(x.JsonPayload))) + n += len(x.JsonPayload) + case *ConformanceResponse_Skipped: + n += proto.SizeVarint(5<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(len(x.Skipped))) + n += len(x.Skipped) + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +// This proto includes every type of field in both singular and repeated +// forms. +type TestAllTypes struct { + // Singular + OptionalInt32 int32 `protobuf:"varint,1,opt,name=optional_int32,json=optionalInt32" json:"optional_int32,omitempty"` + OptionalInt64 int64 `protobuf:"varint,2,opt,name=optional_int64,json=optionalInt64" json:"optional_int64,omitempty"` + OptionalUint32 uint32 `protobuf:"varint,3,opt,name=optional_uint32,json=optionalUint32" json:"optional_uint32,omitempty"` + OptionalUint64 uint64 `protobuf:"varint,4,opt,name=optional_uint64,json=optionalUint64" json:"optional_uint64,omitempty"` + OptionalSint32 int32 `protobuf:"zigzag32,5,opt,name=optional_sint32,json=optionalSint32" json:"optional_sint32,omitempty"` + OptionalSint64 int64 `protobuf:"zigzag64,6,opt,name=optional_sint64,json=optionalSint64" json:"optional_sint64,omitempty"` + OptionalFixed32 uint32 `protobuf:"fixed32,7,opt,name=optional_fixed32,json=optionalFixed32" json:"optional_fixed32,omitempty"` + OptionalFixed64 uint64 `protobuf:"fixed64,8,opt,name=optional_fixed64,json=optionalFixed64" json:"optional_fixed64,omitempty"` + OptionalSfixed32 int32 `protobuf:"fixed32,9,opt,name=optional_sfixed32,json=optionalSfixed32" json:"optional_sfixed32,omitempty"` + OptionalSfixed64 int64 `protobuf:"fixed64,10,opt,name=optional_sfixed64,json=optionalSfixed64" json:"optional_sfixed64,omitempty"` + OptionalFloat float32 `protobuf:"fixed32,11,opt,name=optional_float,json=optionalFloat" json:"optional_float,omitempty"` + OptionalDouble float64 `protobuf:"fixed64,12,opt,name=optional_double,json=optionalDouble" json:"optional_double,omitempty"` + OptionalBool bool `protobuf:"varint,13,opt,name=optional_bool,json=optionalBool" json:"optional_bool,omitempty"` + OptionalString string `protobuf:"bytes,14,opt,name=optional_string,json=optionalString" json:"optional_string,omitempty"` + OptionalBytes []byte `protobuf:"bytes,15,opt,name=optional_bytes,json=optionalBytes,proto3" json:"optional_bytes,omitempty"` + OptionalNestedMessage *TestAllTypes_NestedMessage `protobuf:"bytes,18,opt,name=optional_nested_message,json=optionalNestedMessage" json:"optional_nested_message,omitempty"` + OptionalForeignMessage *ForeignMessage `protobuf:"bytes,19,opt,name=optional_foreign_message,json=optionalForeignMessage" json:"optional_foreign_message,omitempty"` + OptionalNestedEnum TestAllTypes_NestedEnum `protobuf:"varint,21,opt,name=optional_nested_enum,json=optionalNestedEnum,enum=conformance.TestAllTypes_NestedEnum" json:"optional_nested_enum,omitempty"` + OptionalForeignEnum ForeignEnum `protobuf:"varint,22,opt,name=optional_foreign_enum,json=optionalForeignEnum,enum=conformance.ForeignEnum" json:"optional_foreign_enum,omitempty"` + OptionalStringPiece string `protobuf:"bytes,24,opt,name=optional_string_piece,json=optionalStringPiece" json:"optional_string_piece,omitempty"` + OptionalCord string `protobuf:"bytes,25,opt,name=optional_cord,json=optionalCord" json:"optional_cord,omitempty"` + RecursiveMessage *TestAllTypes `protobuf:"bytes,27,opt,name=recursive_message,json=recursiveMessage" json:"recursive_message,omitempty"` + // Repeated + RepeatedInt32 []int32 `protobuf:"varint,31,rep,packed,name=repeated_int32,json=repeatedInt32" json:"repeated_int32,omitempty"` + RepeatedInt64 []int64 `protobuf:"varint,32,rep,packed,name=repeated_int64,json=repeatedInt64" json:"repeated_int64,omitempty"` + RepeatedUint32 []uint32 `protobuf:"varint,33,rep,packed,name=repeated_uint32,json=repeatedUint32" json:"repeated_uint32,omitempty"` + RepeatedUint64 []uint64 `protobuf:"varint,34,rep,packed,name=repeated_uint64,json=repeatedUint64" json:"repeated_uint64,omitempty"` + RepeatedSint32 []int32 `protobuf:"zigzag32,35,rep,packed,name=repeated_sint32,json=repeatedSint32" json:"repeated_sint32,omitempty"` + RepeatedSint64 []int64 `protobuf:"zigzag64,36,rep,packed,name=repeated_sint64,json=repeatedSint64" json:"repeated_sint64,omitempty"` + RepeatedFixed32 []uint32 `protobuf:"fixed32,37,rep,packed,name=repeated_fixed32,json=repeatedFixed32" json:"repeated_fixed32,omitempty"` + RepeatedFixed64 []uint64 `protobuf:"fixed64,38,rep,packed,name=repeated_fixed64,json=repeatedFixed64" json:"repeated_fixed64,omitempty"` + RepeatedSfixed32 []int32 `protobuf:"fixed32,39,rep,packed,name=repeated_sfixed32,json=repeatedSfixed32" json:"repeated_sfixed32,omitempty"` + RepeatedSfixed64 []int64 `protobuf:"fixed64,40,rep,packed,name=repeated_sfixed64,json=repeatedSfixed64" json:"repeated_sfixed64,omitempty"` + RepeatedFloat []float32 `protobuf:"fixed32,41,rep,packed,name=repeated_float,json=repeatedFloat" json:"repeated_float,omitempty"` + RepeatedDouble []float64 `protobuf:"fixed64,42,rep,packed,name=repeated_double,json=repeatedDouble" json:"repeated_double,omitempty"` + RepeatedBool []bool `protobuf:"varint,43,rep,packed,name=repeated_bool,json=repeatedBool" json:"repeated_bool,omitempty"` + RepeatedString []string `protobuf:"bytes,44,rep,name=repeated_string,json=repeatedString" json:"repeated_string,omitempty"` + RepeatedBytes [][]byte `protobuf:"bytes,45,rep,name=repeated_bytes,json=repeatedBytes,proto3" json:"repeated_bytes,omitempty"` + RepeatedNestedMessage []*TestAllTypes_NestedMessage `protobuf:"bytes,48,rep,name=repeated_nested_message,json=repeatedNestedMessage" json:"repeated_nested_message,omitempty"` + RepeatedForeignMessage []*ForeignMessage `protobuf:"bytes,49,rep,name=repeated_foreign_message,json=repeatedForeignMessage" json:"repeated_foreign_message,omitempty"` + RepeatedNestedEnum []TestAllTypes_NestedEnum `protobuf:"varint,51,rep,packed,name=repeated_nested_enum,json=repeatedNestedEnum,enum=conformance.TestAllTypes_NestedEnum" json:"repeated_nested_enum,omitempty"` + RepeatedForeignEnum []ForeignEnum `protobuf:"varint,52,rep,packed,name=repeated_foreign_enum,json=repeatedForeignEnum,enum=conformance.ForeignEnum" json:"repeated_foreign_enum,omitempty"` + RepeatedStringPiece []string `protobuf:"bytes,54,rep,name=repeated_string_piece,json=repeatedStringPiece" json:"repeated_string_piece,omitempty"` + RepeatedCord []string `protobuf:"bytes,55,rep,name=repeated_cord,json=repeatedCord" json:"repeated_cord,omitempty"` + // Map + MapInt32Int32 map[int32]int32 `protobuf:"bytes,56,rep,name=map_int32_int32,json=mapInt32Int32" json:"map_int32_int32,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"` + MapInt64Int64 map[int64]int64 `protobuf:"bytes,57,rep,name=map_int64_int64,json=mapInt64Int64" json:"map_int64_int64,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"` + MapUint32Uint32 map[uint32]uint32 `protobuf:"bytes,58,rep,name=map_uint32_uint32,json=mapUint32Uint32" json:"map_uint32_uint32,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"` + MapUint64Uint64 map[uint64]uint64 `protobuf:"bytes,59,rep,name=map_uint64_uint64,json=mapUint64Uint64" json:"map_uint64_uint64,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"` + MapSint32Sint32 map[int32]int32 `protobuf:"bytes,60,rep,name=map_sint32_sint32,json=mapSint32Sint32" json:"map_sint32_sint32,omitempty" protobuf_key:"zigzag32,1,opt,name=key" protobuf_val:"zigzag32,2,opt,name=value"` + MapSint64Sint64 map[int64]int64 `protobuf:"bytes,61,rep,name=map_sint64_sint64,json=mapSint64Sint64" json:"map_sint64_sint64,omitempty" protobuf_key:"zigzag64,1,opt,name=key" protobuf_val:"zigzag64,2,opt,name=value"` + MapFixed32Fixed32 map[uint32]uint32 `protobuf:"bytes,62,rep,name=map_fixed32_fixed32,json=mapFixed32Fixed32" json:"map_fixed32_fixed32,omitempty" protobuf_key:"fixed32,1,opt,name=key" protobuf_val:"fixed32,2,opt,name=value"` + MapFixed64Fixed64 map[uint64]uint64 `protobuf:"bytes,63,rep,name=map_fixed64_fixed64,json=mapFixed64Fixed64" json:"map_fixed64_fixed64,omitempty" protobuf_key:"fixed64,1,opt,name=key" protobuf_val:"fixed64,2,opt,name=value"` + MapSfixed32Sfixed32 map[int32]int32 `protobuf:"bytes,64,rep,name=map_sfixed32_sfixed32,json=mapSfixed32Sfixed32" json:"map_sfixed32_sfixed32,omitempty" protobuf_key:"fixed32,1,opt,name=key" protobuf_val:"fixed32,2,opt,name=value"` + MapSfixed64Sfixed64 map[int64]int64 `protobuf:"bytes,65,rep,name=map_sfixed64_sfixed64,json=mapSfixed64Sfixed64" json:"map_sfixed64_sfixed64,omitempty" protobuf_key:"fixed64,1,opt,name=key" protobuf_val:"fixed64,2,opt,name=value"` + MapInt32Float map[int32]float32 `protobuf:"bytes,66,rep,name=map_int32_float,json=mapInt32Float" json:"map_int32_float,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"fixed32,2,opt,name=value"` + MapInt32Double map[int32]float64 `protobuf:"bytes,67,rep,name=map_int32_double,json=mapInt32Double" json:"map_int32_double,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"fixed64,2,opt,name=value"` + MapBoolBool map[bool]bool `protobuf:"bytes,68,rep,name=map_bool_bool,json=mapBoolBool" json:"map_bool_bool,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"` + MapStringString map[string]string `protobuf:"bytes,69,rep,name=map_string_string,json=mapStringString" json:"map_string_string,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + MapStringBytes map[string][]byte `protobuf:"bytes,70,rep,name=map_string_bytes,json=mapStringBytes" json:"map_string_bytes,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value,proto3"` + MapStringNestedMessage map[string]*TestAllTypes_NestedMessage `protobuf:"bytes,71,rep,name=map_string_nested_message,json=mapStringNestedMessage" json:"map_string_nested_message,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + MapStringForeignMessage map[string]*ForeignMessage `protobuf:"bytes,72,rep,name=map_string_foreign_message,json=mapStringForeignMessage" json:"map_string_foreign_message,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + MapStringNestedEnum map[string]TestAllTypes_NestedEnum `protobuf:"bytes,73,rep,name=map_string_nested_enum,json=mapStringNestedEnum" json:"map_string_nested_enum,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"varint,2,opt,name=value,enum=conformance.TestAllTypes_NestedEnum"` + MapStringForeignEnum map[string]ForeignEnum `protobuf:"bytes,74,rep,name=map_string_foreign_enum,json=mapStringForeignEnum" json:"map_string_foreign_enum,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"varint,2,opt,name=value,enum=conformance.ForeignEnum"` + // Types that are valid to be assigned to OneofField: + // *TestAllTypes_OneofUint32 + // *TestAllTypes_OneofNestedMessage + // *TestAllTypes_OneofString + // *TestAllTypes_OneofBytes + // *TestAllTypes_OneofBool + // *TestAllTypes_OneofUint64 + // *TestAllTypes_OneofFloat + // *TestAllTypes_OneofDouble + // *TestAllTypes_OneofEnum + OneofField isTestAllTypes_OneofField `protobuf_oneof:"oneof_field"` + // Well-known types + OptionalBoolWrapper *google_protobuf5.BoolValue `protobuf:"bytes,201,opt,name=optional_bool_wrapper,json=optionalBoolWrapper" json:"optional_bool_wrapper,omitempty"` + OptionalInt32Wrapper *google_protobuf5.Int32Value `protobuf:"bytes,202,opt,name=optional_int32_wrapper,json=optionalInt32Wrapper" json:"optional_int32_wrapper,omitempty"` + OptionalInt64Wrapper *google_protobuf5.Int64Value `protobuf:"bytes,203,opt,name=optional_int64_wrapper,json=optionalInt64Wrapper" json:"optional_int64_wrapper,omitempty"` + OptionalUint32Wrapper *google_protobuf5.UInt32Value `protobuf:"bytes,204,opt,name=optional_uint32_wrapper,json=optionalUint32Wrapper" json:"optional_uint32_wrapper,omitempty"` + OptionalUint64Wrapper *google_protobuf5.UInt64Value `protobuf:"bytes,205,opt,name=optional_uint64_wrapper,json=optionalUint64Wrapper" json:"optional_uint64_wrapper,omitempty"` + OptionalFloatWrapper *google_protobuf5.FloatValue `protobuf:"bytes,206,opt,name=optional_float_wrapper,json=optionalFloatWrapper" json:"optional_float_wrapper,omitempty"` + OptionalDoubleWrapper *google_protobuf5.DoubleValue `protobuf:"bytes,207,opt,name=optional_double_wrapper,json=optionalDoubleWrapper" json:"optional_double_wrapper,omitempty"` + OptionalStringWrapper *google_protobuf5.StringValue `protobuf:"bytes,208,opt,name=optional_string_wrapper,json=optionalStringWrapper" json:"optional_string_wrapper,omitempty"` + OptionalBytesWrapper *google_protobuf5.BytesValue `protobuf:"bytes,209,opt,name=optional_bytes_wrapper,json=optionalBytesWrapper" json:"optional_bytes_wrapper,omitempty"` + RepeatedBoolWrapper []*google_protobuf5.BoolValue `protobuf:"bytes,211,rep,name=repeated_bool_wrapper,json=repeatedBoolWrapper" json:"repeated_bool_wrapper,omitempty"` + RepeatedInt32Wrapper []*google_protobuf5.Int32Value `protobuf:"bytes,212,rep,name=repeated_int32_wrapper,json=repeatedInt32Wrapper" json:"repeated_int32_wrapper,omitempty"` + RepeatedInt64Wrapper []*google_protobuf5.Int64Value `protobuf:"bytes,213,rep,name=repeated_int64_wrapper,json=repeatedInt64Wrapper" json:"repeated_int64_wrapper,omitempty"` + RepeatedUint32Wrapper []*google_protobuf5.UInt32Value `protobuf:"bytes,214,rep,name=repeated_uint32_wrapper,json=repeatedUint32Wrapper" json:"repeated_uint32_wrapper,omitempty"` + RepeatedUint64Wrapper []*google_protobuf5.UInt64Value `protobuf:"bytes,215,rep,name=repeated_uint64_wrapper,json=repeatedUint64Wrapper" json:"repeated_uint64_wrapper,omitempty"` + RepeatedFloatWrapper []*google_protobuf5.FloatValue `protobuf:"bytes,216,rep,name=repeated_float_wrapper,json=repeatedFloatWrapper" json:"repeated_float_wrapper,omitempty"` + RepeatedDoubleWrapper []*google_protobuf5.DoubleValue `protobuf:"bytes,217,rep,name=repeated_double_wrapper,json=repeatedDoubleWrapper" json:"repeated_double_wrapper,omitempty"` + RepeatedStringWrapper []*google_protobuf5.StringValue `protobuf:"bytes,218,rep,name=repeated_string_wrapper,json=repeatedStringWrapper" json:"repeated_string_wrapper,omitempty"` + RepeatedBytesWrapper []*google_protobuf5.BytesValue `protobuf:"bytes,219,rep,name=repeated_bytes_wrapper,json=repeatedBytesWrapper" json:"repeated_bytes_wrapper,omitempty"` + OptionalDuration *google_protobuf1.Duration `protobuf:"bytes,301,opt,name=optional_duration,json=optionalDuration" json:"optional_duration,omitempty"` + OptionalTimestamp *google_protobuf4.Timestamp `protobuf:"bytes,302,opt,name=optional_timestamp,json=optionalTimestamp" json:"optional_timestamp,omitempty"` + OptionalFieldMask *google_protobuf2.FieldMask `protobuf:"bytes,303,opt,name=optional_field_mask,json=optionalFieldMask" json:"optional_field_mask,omitempty"` + OptionalStruct *google_protobuf3.Struct `protobuf:"bytes,304,opt,name=optional_struct,json=optionalStruct" json:"optional_struct,omitempty"` + OptionalAny *google_protobuf.Any `protobuf:"bytes,305,opt,name=optional_any,json=optionalAny" json:"optional_any,omitempty"` + OptionalValue *google_protobuf3.Value `protobuf:"bytes,306,opt,name=optional_value,json=optionalValue" json:"optional_value,omitempty"` + RepeatedDuration []*google_protobuf1.Duration `protobuf:"bytes,311,rep,name=repeated_duration,json=repeatedDuration" json:"repeated_duration,omitempty"` + RepeatedTimestamp []*google_protobuf4.Timestamp `protobuf:"bytes,312,rep,name=repeated_timestamp,json=repeatedTimestamp" json:"repeated_timestamp,omitempty"` + RepeatedFieldmask []*google_protobuf2.FieldMask `protobuf:"bytes,313,rep,name=repeated_fieldmask,json=repeatedFieldmask" json:"repeated_fieldmask,omitempty"` + RepeatedStruct []*google_protobuf3.Struct `protobuf:"bytes,324,rep,name=repeated_struct,json=repeatedStruct" json:"repeated_struct,omitempty"` + RepeatedAny []*google_protobuf.Any `protobuf:"bytes,315,rep,name=repeated_any,json=repeatedAny" json:"repeated_any,omitempty"` + RepeatedValue []*google_protobuf3.Value `protobuf:"bytes,316,rep,name=repeated_value,json=repeatedValue" json:"repeated_value,omitempty"` + // Test field-name-to-JSON-name convention. + // (protobuf says names can be any valid C/C++ identifier.) + Fieldname1 int32 `protobuf:"varint,401,opt,name=fieldname1" json:"fieldname1,omitempty"` + FieldName2 int32 `protobuf:"varint,402,opt,name=field_name2,json=fieldName2" json:"field_name2,omitempty"` + XFieldName3 int32 `protobuf:"varint,403,opt,name=_field_name3,json=FieldName3" json:"_field_name3,omitempty"` + Field_Name4_ int32 `protobuf:"varint,404,opt,name=field__name4_,json=fieldName4" json:"field__name4_,omitempty"` + Field0Name5 int32 `protobuf:"varint,405,opt,name=field0name5" json:"field0name5,omitempty"` + Field_0Name6 int32 `protobuf:"varint,406,opt,name=field_0_name6,json=field0Name6" json:"field_0_name6,omitempty"` + FieldName7 int32 `protobuf:"varint,407,opt,name=fieldName7" json:"fieldName7,omitempty"` + FieldName8 int32 `protobuf:"varint,408,opt,name=FieldName8" json:"FieldName8,omitempty"` + Field_Name9 int32 `protobuf:"varint,409,opt,name=field_Name9,json=fieldName9" json:"field_Name9,omitempty"` + Field_Name10 int32 `protobuf:"varint,410,opt,name=Field_Name10,json=FieldName10" json:"Field_Name10,omitempty"` + FIELD_NAME11 int32 `protobuf:"varint,411,opt,name=FIELD_NAME11,json=FIELDNAME11" json:"FIELD_NAME11,omitempty"` + FIELDName12 int32 `protobuf:"varint,412,opt,name=FIELD_name12,json=FIELDName12" json:"FIELD_name12,omitempty"` + XFieldName13 int32 `protobuf:"varint,413,opt,name=__field_name13,json=FieldName13" json:"__field_name13,omitempty"` + X_FieldName14 int32 `protobuf:"varint,414,opt,name=__Field_name14,json=FieldName14" json:"__Field_name14,omitempty"` + Field_Name15 int32 `protobuf:"varint,415,opt,name=field__name15,json=fieldName15" json:"field__name15,omitempty"` + Field__Name16 int32 `protobuf:"varint,416,opt,name=field__Name16,json=fieldName16" json:"field__Name16,omitempty"` + FieldName17__ int32 `protobuf:"varint,417,opt,name=field_name17__,json=fieldName17" json:"field_name17__,omitempty"` + FieldName18__ int32 `protobuf:"varint,418,opt,name=Field_name18__,json=FieldName18" json:"Field_name18__,omitempty"` +} + +func (m *TestAllTypes) Reset() { *m = TestAllTypes{} } +func (m *TestAllTypes) String() string { return proto.CompactTextString(m) } +func (*TestAllTypes) ProtoMessage() {} +func (*TestAllTypes) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } + +type isTestAllTypes_OneofField interface { + isTestAllTypes_OneofField() +} + +type TestAllTypes_OneofUint32 struct { + OneofUint32 uint32 `protobuf:"varint,111,opt,name=oneof_uint32,json=oneofUint32,oneof"` +} +type TestAllTypes_OneofNestedMessage struct { + OneofNestedMessage *TestAllTypes_NestedMessage `protobuf:"bytes,112,opt,name=oneof_nested_message,json=oneofNestedMessage,oneof"` +} +type TestAllTypes_OneofString struct { + OneofString string `protobuf:"bytes,113,opt,name=oneof_string,json=oneofString,oneof"` +} +type TestAllTypes_OneofBytes struct { + OneofBytes []byte `protobuf:"bytes,114,opt,name=oneof_bytes,json=oneofBytes,proto3,oneof"` +} +type TestAllTypes_OneofBool struct { + OneofBool bool `protobuf:"varint,115,opt,name=oneof_bool,json=oneofBool,oneof"` +} +type TestAllTypes_OneofUint64 struct { + OneofUint64 uint64 `protobuf:"varint,116,opt,name=oneof_uint64,json=oneofUint64,oneof"` +} +type TestAllTypes_OneofFloat struct { + OneofFloat float32 `protobuf:"fixed32,117,opt,name=oneof_float,json=oneofFloat,oneof"` +} +type TestAllTypes_OneofDouble struct { + OneofDouble float64 `protobuf:"fixed64,118,opt,name=oneof_double,json=oneofDouble,oneof"` +} +type TestAllTypes_OneofEnum struct { + OneofEnum TestAllTypes_NestedEnum `protobuf:"varint,119,opt,name=oneof_enum,json=oneofEnum,enum=conformance.TestAllTypes_NestedEnum,oneof"` +} + +func (*TestAllTypes_OneofUint32) isTestAllTypes_OneofField() {} +func (*TestAllTypes_OneofNestedMessage) isTestAllTypes_OneofField() {} +func (*TestAllTypes_OneofString) isTestAllTypes_OneofField() {} +func (*TestAllTypes_OneofBytes) isTestAllTypes_OneofField() {} +func (*TestAllTypes_OneofBool) isTestAllTypes_OneofField() {} +func (*TestAllTypes_OneofUint64) isTestAllTypes_OneofField() {} +func (*TestAllTypes_OneofFloat) isTestAllTypes_OneofField() {} +func (*TestAllTypes_OneofDouble) isTestAllTypes_OneofField() {} +func (*TestAllTypes_OneofEnum) isTestAllTypes_OneofField() {} + +func (m *TestAllTypes) GetOneofField() isTestAllTypes_OneofField { + if m != nil { + return m.OneofField + } + return nil +} + +func (m *TestAllTypes) GetOptionalInt32() int32 { + if m != nil { + return m.OptionalInt32 + } + return 0 +} + +func (m *TestAllTypes) GetOptionalInt64() int64 { + if m != nil { + return m.OptionalInt64 + } + return 0 +} + +func (m *TestAllTypes) GetOptionalUint32() uint32 { + if m != nil { + return m.OptionalUint32 + } + return 0 +} + +func (m *TestAllTypes) GetOptionalUint64() uint64 { + if m != nil { + return m.OptionalUint64 + } + return 0 +} + +func (m *TestAllTypes) GetOptionalSint32() int32 { + if m != nil { + return m.OptionalSint32 + } + return 0 +} + +func (m *TestAllTypes) GetOptionalSint64() int64 { + if m != nil { + return m.OptionalSint64 + } + return 0 +} + +func (m *TestAllTypes) GetOptionalFixed32() uint32 { + if m != nil { + return m.OptionalFixed32 + } + return 0 +} + +func (m *TestAllTypes) GetOptionalFixed64() uint64 { + if m != nil { + return m.OptionalFixed64 + } + return 0 +} + +func (m *TestAllTypes) GetOptionalSfixed32() int32 { + if m != nil { + return m.OptionalSfixed32 + } + return 0 +} + +func (m *TestAllTypes) GetOptionalSfixed64() int64 { + if m != nil { + return m.OptionalSfixed64 + } + return 0 +} + +func (m *TestAllTypes) GetOptionalFloat() float32 { + if m != nil { + return m.OptionalFloat + } + return 0 +} + +func (m *TestAllTypes) GetOptionalDouble() float64 { + if m != nil { + return m.OptionalDouble + } + return 0 +} + +func (m *TestAllTypes) GetOptionalBool() bool { + if m != nil { + return m.OptionalBool + } + return false +} + +func (m *TestAllTypes) GetOptionalString() string { + if m != nil { + return m.OptionalString + } + return "" +} + +func (m *TestAllTypes) GetOptionalBytes() []byte { + if m != nil { + return m.OptionalBytes + } + return nil +} + +func (m *TestAllTypes) GetOptionalNestedMessage() *TestAllTypes_NestedMessage { + if m != nil { + return m.OptionalNestedMessage + } + return nil +} + +func (m *TestAllTypes) GetOptionalForeignMessage() *ForeignMessage { + if m != nil { + return m.OptionalForeignMessage + } + return nil +} + +func (m *TestAllTypes) GetOptionalNestedEnum() TestAllTypes_NestedEnum { + if m != nil { + return m.OptionalNestedEnum + } + return TestAllTypes_FOO +} + +func (m *TestAllTypes) GetOptionalForeignEnum() ForeignEnum { + if m != nil { + return m.OptionalForeignEnum + } + return ForeignEnum_FOREIGN_FOO +} + +func (m *TestAllTypes) GetOptionalStringPiece() string { + if m != nil { + return m.OptionalStringPiece + } + return "" +} + +func (m *TestAllTypes) GetOptionalCord() string { + if m != nil { + return m.OptionalCord + } + return "" +} + +func (m *TestAllTypes) GetRecursiveMessage() *TestAllTypes { + if m != nil { + return m.RecursiveMessage + } + return nil +} + +func (m *TestAllTypes) GetRepeatedInt32() []int32 { + if m != nil { + return m.RepeatedInt32 + } + return nil +} + +func (m *TestAllTypes) GetRepeatedInt64() []int64 { + if m != nil { + return m.RepeatedInt64 + } + return nil +} + +func (m *TestAllTypes) GetRepeatedUint32() []uint32 { + if m != nil { + return m.RepeatedUint32 + } + return nil +} + +func (m *TestAllTypes) GetRepeatedUint64() []uint64 { + if m != nil { + return m.RepeatedUint64 + } + return nil +} + +func (m *TestAllTypes) GetRepeatedSint32() []int32 { + if m != nil { + return m.RepeatedSint32 + } + return nil +} + +func (m *TestAllTypes) GetRepeatedSint64() []int64 { + if m != nil { + return m.RepeatedSint64 + } + return nil +} + +func (m *TestAllTypes) GetRepeatedFixed32() []uint32 { + if m != nil { + return m.RepeatedFixed32 + } + return nil +} + +func (m *TestAllTypes) GetRepeatedFixed64() []uint64 { + if m != nil { + return m.RepeatedFixed64 + } + return nil +} + +func (m *TestAllTypes) GetRepeatedSfixed32() []int32 { + if m != nil { + return m.RepeatedSfixed32 + } + return nil +} + +func (m *TestAllTypes) GetRepeatedSfixed64() []int64 { + if m != nil { + return m.RepeatedSfixed64 + } + return nil +} + +func (m *TestAllTypes) GetRepeatedFloat() []float32 { + if m != nil { + return m.RepeatedFloat + } + return nil +} + +func (m *TestAllTypes) GetRepeatedDouble() []float64 { + if m != nil { + return m.RepeatedDouble + } + return nil +} + +func (m *TestAllTypes) GetRepeatedBool() []bool { + if m != nil { + return m.RepeatedBool + } + return nil +} + +func (m *TestAllTypes) GetRepeatedString() []string { + if m != nil { + return m.RepeatedString + } + return nil +} + +func (m *TestAllTypes) GetRepeatedBytes() [][]byte { + if m != nil { + return m.RepeatedBytes + } + return nil +} + +func (m *TestAllTypes) GetRepeatedNestedMessage() []*TestAllTypes_NestedMessage { + if m != nil { + return m.RepeatedNestedMessage + } + return nil +} + +func (m *TestAllTypes) GetRepeatedForeignMessage() []*ForeignMessage { + if m != nil { + return m.RepeatedForeignMessage + } + return nil +} + +func (m *TestAllTypes) GetRepeatedNestedEnum() []TestAllTypes_NestedEnum { + if m != nil { + return m.RepeatedNestedEnum + } + return nil +} + +func (m *TestAllTypes) GetRepeatedForeignEnum() []ForeignEnum { + if m != nil { + return m.RepeatedForeignEnum + } + return nil +} + +func (m *TestAllTypes) GetRepeatedStringPiece() []string { + if m != nil { + return m.RepeatedStringPiece + } + return nil +} + +func (m *TestAllTypes) GetRepeatedCord() []string { + if m != nil { + return m.RepeatedCord + } + return nil +} + +func (m *TestAllTypes) GetMapInt32Int32() map[int32]int32 { + if m != nil { + return m.MapInt32Int32 + } + return nil +} + +func (m *TestAllTypes) GetMapInt64Int64() map[int64]int64 { + if m != nil { + return m.MapInt64Int64 + } + return nil +} + +func (m *TestAllTypes) GetMapUint32Uint32() map[uint32]uint32 { + if m != nil { + return m.MapUint32Uint32 + } + return nil +} + +func (m *TestAllTypes) GetMapUint64Uint64() map[uint64]uint64 { + if m != nil { + return m.MapUint64Uint64 + } + return nil +} + +func (m *TestAllTypes) GetMapSint32Sint32() map[int32]int32 { + if m != nil { + return m.MapSint32Sint32 + } + return nil +} + +func (m *TestAllTypes) GetMapSint64Sint64() map[int64]int64 { + if m != nil { + return m.MapSint64Sint64 + } + return nil +} + +func (m *TestAllTypes) GetMapFixed32Fixed32() map[uint32]uint32 { + if m != nil { + return m.MapFixed32Fixed32 + } + return nil +} + +func (m *TestAllTypes) GetMapFixed64Fixed64() map[uint64]uint64 { + if m != nil { + return m.MapFixed64Fixed64 + } + return nil +} + +func (m *TestAllTypes) GetMapSfixed32Sfixed32() map[int32]int32 { + if m != nil { + return m.MapSfixed32Sfixed32 + } + return nil +} + +func (m *TestAllTypes) GetMapSfixed64Sfixed64() map[int64]int64 { + if m != nil { + return m.MapSfixed64Sfixed64 + } + return nil +} + +func (m *TestAllTypes) GetMapInt32Float() map[int32]float32 { + if m != nil { + return m.MapInt32Float + } + return nil +} + +func (m *TestAllTypes) GetMapInt32Double() map[int32]float64 { + if m != nil { + return m.MapInt32Double + } + return nil +} + +func (m *TestAllTypes) GetMapBoolBool() map[bool]bool { + if m != nil { + return m.MapBoolBool + } + return nil +} + +func (m *TestAllTypes) GetMapStringString() map[string]string { + if m != nil { + return m.MapStringString + } + return nil +} + +func (m *TestAllTypes) GetMapStringBytes() map[string][]byte { + if m != nil { + return m.MapStringBytes + } + return nil +} + +func (m *TestAllTypes) GetMapStringNestedMessage() map[string]*TestAllTypes_NestedMessage { + if m != nil { + return m.MapStringNestedMessage + } + return nil +} + +func (m *TestAllTypes) GetMapStringForeignMessage() map[string]*ForeignMessage { + if m != nil { + return m.MapStringForeignMessage + } + return nil +} + +func (m *TestAllTypes) GetMapStringNestedEnum() map[string]TestAllTypes_NestedEnum { + if m != nil { + return m.MapStringNestedEnum + } + return nil +} + +func (m *TestAllTypes) GetMapStringForeignEnum() map[string]ForeignEnum { + if m != nil { + return m.MapStringForeignEnum + } + return nil +} + +func (m *TestAllTypes) GetOneofUint32() uint32 { + if x, ok := m.GetOneofField().(*TestAllTypes_OneofUint32); ok { + return x.OneofUint32 + } + return 0 +} + +func (m *TestAllTypes) GetOneofNestedMessage() *TestAllTypes_NestedMessage { + if x, ok := m.GetOneofField().(*TestAllTypes_OneofNestedMessage); ok { + return x.OneofNestedMessage + } + return nil +} + +func (m *TestAllTypes) GetOneofString() string { + if x, ok := m.GetOneofField().(*TestAllTypes_OneofString); ok { + return x.OneofString + } + return "" +} + +func (m *TestAllTypes) GetOneofBytes() []byte { + if x, ok := m.GetOneofField().(*TestAllTypes_OneofBytes); ok { + return x.OneofBytes + } + return nil +} + +func (m *TestAllTypes) GetOneofBool() bool { + if x, ok := m.GetOneofField().(*TestAllTypes_OneofBool); ok { + return x.OneofBool + } + return false +} + +func (m *TestAllTypes) GetOneofUint64() uint64 { + if x, ok := m.GetOneofField().(*TestAllTypes_OneofUint64); ok { + return x.OneofUint64 + } + return 0 +} + +func (m *TestAllTypes) GetOneofFloat() float32 { + if x, ok := m.GetOneofField().(*TestAllTypes_OneofFloat); ok { + return x.OneofFloat + } + return 0 +} + +func (m *TestAllTypes) GetOneofDouble() float64 { + if x, ok := m.GetOneofField().(*TestAllTypes_OneofDouble); ok { + return x.OneofDouble + } + return 0 +} + +func (m *TestAllTypes) GetOneofEnum() TestAllTypes_NestedEnum { + if x, ok := m.GetOneofField().(*TestAllTypes_OneofEnum); ok { + return x.OneofEnum + } + return TestAllTypes_FOO +} + +func (m *TestAllTypes) GetOptionalBoolWrapper() *google_protobuf5.BoolValue { + if m != nil { + return m.OptionalBoolWrapper + } + return nil +} + +func (m *TestAllTypes) GetOptionalInt32Wrapper() *google_protobuf5.Int32Value { + if m != nil { + return m.OptionalInt32Wrapper + } + return nil +} + +func (m *TestAllTypes) GetOptionalInt64Wrapper() *google_protobuf5.Int64Value { + if m != nil { + return m.OptionalInt64Wrapper + } + return nil +} + +func (m *TestAllTypes) GetOptionalUint32Wrapper() *google_protobuf5.UInt32Value { + if m != nil { + return m.OptionalUint32Wrapper + } + return nil +} + +func (m *TestAllTypes) GetOptionalUint64Wrapper() *google_protobuf5.UInt64Value { + if m != nil { + return m.OptionalUint64Wrapper + } + return nil +} + +func (m *TestAllTypes) GetOptionalFloatWrapper() *google_protobuf5.FloatValue { + if m != nil { + return m.OptionalFloatWrapper + } + return nil +} + +func (m *TestAllTypes) GetOptionalDoubleWrapper() *google_protobuf5.DoubleValue { + if m != nil { + return m.OptionalDoubleWrapper + } + return nil +} + +func (m *TestAllTypes) GetOptionalStringWrapper() *google_protobuf5.StringValue { + if m != nil { + return m.OptionalStringWrapper + } + return nil +} + +func (m *TestAllTypes) GetOptionalBytesWrapper() *google_protobuf5.BytesValue { + if m != nil { + return m.OptionalBytesWrapper + } + return nil +} + +func (m *TestAllTypes) GetRepeatedBoolWrapper() []*google_protobuf5.BoolValue { + if m != nil { + return m.RepeatedBoolWrapper + } + return nil +} + +func (m *TestAllTypes) GetRepeatedInt32Wrapper() []*google_protobuf5.Int32Value { + if m != nil { + return m.RepeatedInt32Wrapper + } + return nil +} + +func (m *TestAllTypes) GetRepeatedInt64Wrapper() []*google_protobuf5.Int64Value { + if m != nil { + return m.RepeatedInt64Wrapper + } + return nil +} + +func (m *TestAllTypes) GetRepeatedUint32Wrapper() []*google_protobuf5.UInt32Value { + if m != nil { + return m.RepeatedUint32Wrapper + } + return nil +} + +func (m *TestAllTypes) GetRepeatedUint64Wrapper() []*google_protobuf5.UInt64Value { + if m != nil { + return m.RepeatedUint64Wrapper + } + return nil +} + +func (m *TestAllTypes) GetRepeatedFloatWrapper() []*google_protobuf5.FloatValue { + if m != nil { + return m.RepeatedFloatWrapper + } + return nil +} + +func (m *TestAllTypes) GetRepeatedDoubleWrapper() []*google_protobuf5.DoubleValue { + if m != nil { + return m.RepeatedDoubleWrapper + } + return nil +} + +func (m *TestAllTypes) GetRepeatedStringWrapper() []*google_protobuf5.StringValue { + if m != nil { + return m.RepeatedStringWrapper + } + return nil +} + +func (m *TestAllTypes) GetRepeatedBytesWrapper() []*google_protobuf5.BytesValue { + if m != nil { + return m.RepeatedBytesWrapper + } + return nil +} + +func (m *TestAllTypes) GetOptionalDuration() *google_protobuf1.Duration { + if m != nil { + return m.OptionalDuration + } + return nil +} + +func (m *TestAllTypes) GetOptionalTimestamp() *google_protobuf4.Timestamp { + if m != nil { + return m.OptionalTimestamp + } + return nil +} + +func (m *TestAllTypes) GetOptionalFieldMask() *google_protobuf2.FieldMask { + if m != nil { + return m.OptionalFieldMask + } + return nil +} + +func (m *TestAllTypes) GetOptionalStruct() *google_protobuf3.Struct { + if m != nil { + return m.OptionalStruct + } + return nil +} + +func (m *TestAllTypes) GetOptionalAny() *google_protobuf.Any { + if m != nil { + return m.OptionalAny + } + return nil +} + +func (m *TestAllTypes) GetOptionalValue() *google_protobuf3.Value { + if m != nil { + return m.OptionalValue + } + return nil +} + +func (m *TestAllTypes) GetRepeatedDuration() []*google_protobuf1.Duration { + if m != nil { + return m.RepeatedDuration + } + return nil +} + +func (m *TestAllTypes) GetRepeatedTimestamp() []*google_protobuf4.Timestamp { + if m != nil { + return m.RepeatedTimestamp + } + return nil +} + +func (m *TestAllTypes) GetRepeatedFieldmask() []*google_protobuf2.FieldMask { + if m != nil { + return m.RepeatedFieldmask + } + return nil +} + +func (m *TestAllTypes) GetRepeatedStruct() []*google_protobuf3.Struct { + if m != nil { + return m.RepeatedStruct + } + return nil +} + +func (m *TestAllTypes) GetRepeatedAny() []*google_protobuf.Any { + if m != nil { + return m.RepeatedAny + } + return nil +} + +func (m *TestAllTypes) GetRepeatedValue() []*google_protobuf3.Value { + if m != nil { + return m.RepeatedValue + } + return nil +} + +func (m *TestAllTypes) GetFieldname1() int32 { + if m != nil { + return m.Fieldname1 + } + return 0 +} + +func (m *TestAllTypes) GetFieldName2() int32 { + if m != nil { + return m.FieldName2 + } + return 0 +} + +func (m *TestAllTypes) GetXFieldName3() int32 { + if m != nil { + return m.XFieldName3 + } + return 0 +} + +func (m *TestAllTypes) GetField_Name4_() int32 { + if m != nil { + return m.Field_Name4_ + } + return 0 +} + +func (m *TestAllTypes) GetField0Name5() int32 { + if m != nil { + return m.Field0Name5 + } + return 0 +} + +func (m *TestAllTypes) GetField_0Name6() int32 { + if m != nil { + return m.Field_0Name6 + } + return 0 +} + +func (m *TestAllTypes) GetFieldName7() int32 { + if m != nil { + return m.FieldName7 + } + return 0 +} + +func (m *TestAllTypes) GetFieldName8() int32 { + if m != nil { + return m.FieldName8 + } + return 0 +} + +func (m *TestAllTypes) GetField_Name9() int32 { + if m != nil { + return m.Field_Name9 + } + return 0 +} + +func (m *TestAllTypes) GetField_Name10() int32 { + if m != nil { + return m.Field_Name10 + } + return 0 +} + +func (m *TestAllTypes) GetFIELD_NAME11() int32 { + if m != nil { + return m.FIELD_NAME11 + } + return 0 +} + +func (m *TestAllTypes) GetFIELDName12() int32 { + if m != nil { + return m.FIELDName12 + } + return 0 +} + +func (m *TestAllTypes) GetXFieldName13() int32 { + if m != nil { + return m.XFieldName13 + } + return 0 +} + +func (m *TestAllTypes) GetX_FieldName14() int32 { + if m != nil { + return m.X_FieldName14 + } + return 0 +} + +func (m *TestAllTypes) GetField_Name15() int32 { + if m != nil { + return m.Field_Name15 + } + return 0 +} + +func (m *TestAllTypes) GetField__Name16() int32 { + if m != nil { + return m.Field__Name16 + } + return 0 +} + +func (m *TestAllTypes) GetFieldName17__() int32 { + if m != nil { + return m.FieldName17__ + } + return 0 +} + +func (m *TestAllTypes) GetFieldName18__() int32 { + if m != nil { + return m.FieldName18__ + } + return 0 +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*TestAllTypes) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _TestAllTypes_OneofMarshaler, _TestAllTypes_OneofUnmarshaler, _TestAllTypes_OneofSizer, []interface{}{ + (*TestAllTypes_OneofUint32)(nil), + (*TestAllTypes_OneofNestedMessage)(nil), + (*TestAllTypes_OneofString)(nil), + (*TestAllTypes_OneofBytes)(nil), + (*TestAllTypes_OneofBool)(nil), + (*TestAllTypes_OneofUint64)(nil), + (*TestAllTypes_OneofFloat)(nil), + (*TestAllTypes_OneofDouble)(nil), + (*TestAllTypes_OneofEnum)(nil), + } +} + +func _TestAllTypes_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*TestAllTypes) + // oneof_field + switch x := m.OneofField.(type) { + case *TestAllTypes_OneofUint32: + b.EncodeVarint(111<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.OneofUint32)) + case *TestAllTypes_OneofNestedMessage: + b.EncodeVarint(112<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.OneofNestedMessage); err != nil { + return err + } + case *TestAllTypes_OneofString: + b.EncodeVarint(113<<3 | proto.WireBytes) + b.EncodeStringBytes(x.OneofString) + case *TestAllTypes_OneofBytes: + b.EncodeVarint(114<<3 | proto.WireBytes) + b.EncodeRawBytes(x.OneofBytes) + case *TestAllTypes_OneofBool: + t := uint64(0) + if x.OneofBool { + t = 1 + } + b.EncodeVarint(115<<3 | proto.WireVarint) + b.EncodeVarint(t) + case *TestAllTypes_OneofUint64: + b.EncodeVarint(116<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.OneofUint64)) + case *TestAllTypes_OneofFloat: + b.EncodeVarint(117<<3 | proto.WireFixed32) + b.EncodeFixed32(uint64(math.Float32bits(x.OneofFloat))) + case *TestAllTypes_OneofDouble: + b.EncodeVarint(118<<3 | proto.WireFixed64) + b.EncodeFixed64(math.Float64bits(x.OneofDouble)) + case *TestAllTypes_OneofEnum: + b.EncodeVarint(119<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.OneofEnum)) + case nil: + default: + return fmt.Errorf("TestAllTypes.OneofField has unexpected type %T", x) + } + return nil +} + +func _TestAllTypes_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*TestAllTypes) + switch tag { + case 111: // oneof_field.oneof_uint32 + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.OneofField = &TestAllTypes_OneofUint32{uint32(x)} + return true, err + case 112: // oneof_field.oneof_nested_message + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(TestAllTypes_NestedMessage) + err := b.DecodeMessage(msg) + m.OneofField = &TestAllTypes_OneofNestedMessage{msg} + return true, err + case 113: // oneof_field.oneof_string + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeStringBytes() + m.OneofField = &TestAllTypes_OneofString{x} + return true, err + case 114: // oneof_field.oneof_bytes + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeRawBytes(true) + m.OneofField = &TestAllTypes_OneofBytes{x} + return true, err + case 115: // oneof_field.oneof_bool + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.OneofField = &TestAllTypes_OneofBool{x != 0} + return true, err + case 116: // oneof_field.oneof_uint64 + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.OneofField = &TestAllTypes_OneofUint64{x} + return true, err + case 117: // oneof_field.oneof_float + if wire != proto.WireFixed32 { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeFixed32() + m.OneofField = &TestAllTypes_OneofFloat{math.Float32frombits(uint32(x))} + return true, err + case 118: // oneof_field.oneof_double + if wire != proto.WireFixed64 { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeFixed64() + m.OneofField = &TestAllTypes_OneofDouble{math.Float64frombits(x)} + return true, err + case 119: // oneof_field.oneof_enum + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.OneofField = &TestAllTypes_OneofEnum{TestAllTypes_NestedEnum(x)} + return true, err + default: + return false, nil + } +} + +func _TestAllTypes_OneofSizer(msg proto.Message) (n int) { + m := msg.(*TestAllTypes) + // oneof_field + switch x := m.OneofField.(type) { + case *TestAllTypes_OneofUint32: + n += proto.SizeVarint(111<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.OneofUint32)) + case *TestAllTypes_OneofNestedMessage: + s := proto.Size(x.OneofNestedMessage) + n += proto.SizeVarint(112<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case *TestAllTypes_OneofString: + n += proto.SizeVarint(113<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(len(x.OneofString))) + n += len(x.OneofString) + case *TestAllTypes_OneofBytes: + n += proto.SizeVarint(114<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(len(x.OneofBytes))) + n += len(x.OneofBytes) + case *TestAllTypes_OneofBool: + n += proto.SizeVarint(115<<3 | proto.WireVarint) + n += 1 + case *TestAllTypes_OneofUint64: + n += proto.SizeVarint(116<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.OneofUint64)) + case *TestAllTypes_OneofFloat: + n += proto.SizeVarint(117<<3 | proto.WireFixed32) + n += 4 + case *TestAllTypes_OneofDouble: + n += proto.SizeVarint(118<<3 | proto.WireFixed64) + n += 8 + case *TestAllTypes_OneofEnum: + n += proto.SizeVarint(119<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.OneofEnum)) + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +type TestAllTypes_NestedMessage struct { + A int32 `protobuf:"varint,1,opt,name=a" json:"a,omitempty"` + Corecursive *TestAllTypes `protobuf:"bytes,2,opt,name=corecursive" json:"corecursive,omitempty"` +} + +func (m *TestAllTypes_NestedMessage) Reset() { *m = TestAllTypes_NestedMessage{} } +func (m *TestAllTypes_NestedMessage) String() string { return proto.CompactTextString(m) } +func (*TestAllTypes_NestedMessage) ProtoMessage() {} +func (*TestAllTypes_NestedMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2, 0} } + +func (m *TestAllTypes_NestedMessage) GetA() int32 { + if m != nil { + return m.A + } + return 0 +} + +func (m *TestAllTypes_NestedMessage) GetCorecursive() *TestAllTypes { + if m != nil { + return m.Corecursive + } + return nil +} + +type ForeignMessage struct { + C int32 `protobuf:"varint,1,opt,name=c" json:"c,omitempty"` +} + +func (m *ForeignMessage) Reset() { *m = ForeignMessage{} } +func (m *ForeignMessage) String() string { return proto.CompactTextString(m) } +func (*ForeignMessage) ProtoMessage() {} +func (*ForeignMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } + +func (m *ForeignMessage) GetC() int32 { + if m != nil { + return m.C + } + return 0 +} + +func init() { + proto.RegisterType((*ConformanceRequest)(nil), "conformance.ConformanceRequest") + proto.RegisterType((*ConformanceResponse)(nil), "conformance.ConformanceResponse") + proto.RegisterType((*TestAllTypes)(nil), "conformance.TestAllTypes") + proto.RegisterType((*TestAllTypes_NestedMessage)(nil), "conformance.TestAllTypes.NestedMessage") + proto.RegisterType((*ForeignMessage)(nil), "conformance.ForeignMessage") + proto.RegisterEnum("conformance.WireFormat", WireFormat_name, WireFormat_value) + proto.RegisterEnum("conformance.ForeignEnum", ForeignEnum_name, ForeignEnum_value) + proto.RegisterEnum("conformance.TestAllTypes_NestedEnum", TestAllTypes_NestedEnum_name, TestAllTypes_NestedEnum_value) +} + +func init() { proto.RegisterFile("conformance_proto/conformance.proto", fileDescriptor0) } + +var fileDescriptor0 = []byte{ + // 2737 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x5a, 0xd9, 0x72, 0xdb, 0xc8, + 0xd5, 0x16, 0x08, 0x59, 0x4b, 0x93, 0x92, 0xa8, 0xd6, 0xd6, 0x96, 0x5d, 0x63, 0x58, 0xb2, 0x7f, + 0xd3, 0xf6, 0x8c, 0xac, 0x05, 0x86, 0x65, 0xcf, 0x3f, 0x8e, 0x45, 0x9b, 0xb4, 0xe4, 0x8c, 0x25, + 0x17, 0x64, 0x8d, 0xab, 0x9c, 0x0b, 0x06, 0xa6, 0x20, 0x15, 0xc7, 0x24, 0xc1, 0x01, 0x48, 0x4f, + 0x94, 0xcb, 0xbc, 0x41, 0xf6, 0x7d, 0xbd, 0xcf, 0x7a, 0x93, 0xa4, 0x92, 0xab, 0x54, 0x6e, 0xb2, + 0x27, 0x95, 0x3d, 0x79, 0x85, 0xbc, 0x43, 0x52, 0xbd, 0xa2, 0xbb, 0x01, 0x50, 0xf4, 0x54, 0x0d, + 0x25, 0x1e, 0x7c, 0xfd, 0x9d, 0xd3, 0xe7, 0x1c, 0x7c, 0x2d, 0x1c, 0x18, 0x2c, 0xd7, 0x83, 0xf6, + 0x51, 0x10, 0xb6, 0xbc, 0x76, 0xdd, 0xaf, 0x75, 0xc2, 0xa0, 0x1b, 0xdc, 0x90, 0x2c, 0x2b, 0xc4, + 0x02, 0xf3, 0x92, 0x69, 0xf1, 0xec, 0x71, 0x10, 0x1c, 0x37, 0xfd, 0x1b, 0xe4, 0xd2, 0x8b, 0xde, + 0xd1, 0x0d, 0xaf, 0x7d, 0x42, 0x71, 0x8b, 0x6f, 0xe8, 0x97, 0x0e, 0x7b, 0xa1, 0xd7, 0x6d, 0x04, + 0x6d, 0x76, 0xdd, 0xd2, 0xaf, 0x1f, 0x35, 0xfc, 0xe6, 0x61, 0xad, 0xe5, 0x45, 0x2f, 0x19, 0xe2, + 0xbc, 0x8e, 0x88, 0xba, 0x61, 0xaf, 0xde, 0x65, 0x57, 0x2f, 0xe8, 0x57, 0xbb, 0x8d, 0x96, 0x1f, + 0x75, 0xbd, 0x56, 0x27, 0x2b, 0x80, 0x0f, 0x43, 0xaf, 0xd3, 0xf1, 0xc3, 0x88, 0x5e, 0x5f, 0xfa, + 0x85, 0x01, 0xe0, 0xfd, 0x78, 0x2f, 0xae, 0xff, 0x41, 0xcf, 0x8f, 0xba, 0xf0, 0x3a, 0x28, 0xf2, + 0x15, 0xb5, 0x8e, 0x77, 0xd2, 0x0c, 0xbc, 0x43, 0x64, 0x58, 0x46, 0xa9, 0xb0, 0x3d, 0xe4, 0x4e, + 0xf1, 0x2b, 0x4f, 0xe8, 0x05, 0xb8, 0x0c, 0x0a, 0xef, 0x47, 0x41, 0x5b, 0x00, 0x73, 0x96, 0x51, + 0x1a, 0xdf, 0x1e, 0x72, 0xf3, 0xd8, 0xca, 0x41, 0x7b, 0x60, 0x21, 0xa4, 0xe4, 0xfe, 0x61, 0x2d, + 0xe8, 0x75, 0x3b, 0xbd, 0x6e, 0x8d, 0x78, 0xed, 0x22, 0xd3, 0x32, 0x4a, 0x93, 0xeb, 0x0b, 0x2b, + 0x72, 0x9a, 0x9f, 0x35, 0x42, 0xbf, 0x4a, 0x2e, 0xbb, 0x73, 0x62, 0xdd, 0x1e, 0x59, 0x46, 0xcd, + 0xe5, 0x71, 0x30, 0xca, 0x1c, 0x2e, 0x7d, 0x2a, 0x07, 0x66, 0x94, 0x4d, 0x44, 0x9d, 0xa0, 0x1d, + 0xf9, 0xf0, 0x22, 0xc8, 0x77, 0xbc, 0x30, 0xf2, 0x6b, 0x7e, 0x18, 0x06, 0x21, 0xd9, 0x00, 0x8e, + 0x0b, 0x10, 0x63, 0x05, 0xdb, 0xe0, 0x55, 0x30, 0x15, 0xf9, 0x61, 0xc3, 0x6b, 0x36, 0x3e, 0xc9, + 0x61, 0x23, 0x0c, 0x36, 0x29, 0x2e, 0x50, 0xe8, 0x65, 0x30, 0x11, 0xf6, 0xda, 0x38, 0xc1, 0x0c, + 0xc8, 0xf7, 0x59, 0x60, 0x66, 0x0a, 0x4b, 0x4b, 0x9d, 0x39, 0x68, 0xea, 0x86, 0xd3, 0x52, 0xb7, + 0x08, 0x46, 0xa3, 0x97, 0x8d, 0x4e, 0xc7, 0x3f, 0x44, 0x67, 0xd8, 0x75, 0x6e, 0x28, 0x8f, 0x81, + 0x91, 0xd0, 0x8f, 0x7a, 0xcd, 0xee, 0xd2, 0x7f, 0xaa, 0xa0, 0xf0, 0xd4, 0x8f, 0xba, 0x5b, 0xcd, + 0xe6, 0xd3, 0x93, 0x8e, 0x1f, 0xc1, 0xcb, 0x60, 0x32, 0xe8, 0xe0, 0x5e, 0xf3, 0x9a, 0xb5, 0x46, + 0xbb, 0xbb, 0xb1, 0x4e, 0x12, 0x70, 0xc6, 0x9d, 0xe0, 0xd6, 0x1d, 0x6c, 0xd4, 0x61, 0x8e, 0x4d, + 0xf6, 0x65, 0x2a, 0x30, 0xc7, 0x86, 0x57, 0xc0, 0x94, 0x80, 0xf5, 0x28, 0x1d, 0xde, 0xd5, 0x84, + 0x2b, 0x56, 0x1f, 0x10, 0x6b, 0x02, 0xe8, 0xd8, 0x64, 0x57, 0xc3, 0x2a, 0x50, 0x63, 0x8c, 0x28, + 0x23, 0xde, 0xde, 0x74, 0x0c, 0xdc, 0x4f, 0x32, 0x46, 0x94, 0x11, 0xd7, 0x08, 0xaa, 0x40, 0xc7, + 0x86, 0x57, 0x41, 0x51, 0x00, 0x8f, 0x1a, 0x9f, 0xf0, 0x0f, 0x37, 0xd6, 0xd1, 0xa8, 0x65, 0x94, + 0x46, 0x5d, 0x41, 0x50, 0xa5, 0xe6, 0x24, 0xd4, 0xb1, 0xd1, 0x98, 0x65, 0x94, 0x46, 0x34, 0xa8, + 0x63, 0xc3, 0xeb, 0x60, 0x3a, 0x76, 0xcf, 0x69, 0xc7, 0x2d, 0xa3, 0x34, 0xe5, 0x0a, 0x8e, 0x7d, + 0x66, 0x4f, 0x01, 0x3b, 0x36, 0x02, 0x96, 0x51, 0x2a, 0xea, 0x60, 0xc7, 0x56, 0x52, 0x7f, 0xd4, + 0x0c, 0xbc, 0x2e, 0xca, 0x5b, 0x46, 0x29, 0x17, 0xa7, 0xbe, 0x8a, 0x8d, 0xca, 0xfe, 0x0f, 0x83, + 0xde, 0x8b, 0xa6, 0x8f, 0x0a, 0x96, 0x51, 0x32, 0xe2, 0xfd, 0x3f, 0x20, 0x56, 0xb8, 0x0c, 0xc4, + 0xca, 0xda, 0x8b, 0x20, 0x68, 0xa2, 0x09, 0xcb, 0x28, 0x8d, 0xb9, 0x05, 0x6e, 0x2c, 0x07, 0x41, + 0x53, 0xcd, 0x66, 0x37, 0x6c, 0xb4, 0x8f, 0xd1, 0x24, 0xee, 0x2a, 0x29, 0x9b, 0xc4, 0xaa, 0x44, + 0xf7, 0xe2, 0xa4, 0xeb, 0x47, 0x68, 0x0a, 0xb7, 0x71, 0x1c, 0x5d, 0x19, 0x1b, 0x61, 0x0d, 0x2c, + 0x08, 0x58, 0x9b, 0xde, 0xde, 0x2d, 0x3f, 0x8a, 0xbc, 0x63, 0x1f, 0x41, 0xcb, 0x28, 0xe5, 0xd7, + 0xaf, 0x28, 0x37, 0xb6, 0xdc, 0xa2, 0x2b, 0xbb, 0x04, 0xff, 0x98, 0xc2, 0xdd, 0x39, 0xce, 0xa3, + 0x98, 0xe1, 0x01, 0x40, 0x71, 0x96, 0x82, 0xd0, 0x6f, 0x1c, 0xb7, 0x85, 0x87, 0x19, 0xe2, 0xe1, + 0x9c, 0xe2, 0xa1, 0x4a, 0x31, 0x9c, 0x75, 0x5e, 0x24, 0x53, 0xb1, 0xc3, 0xf7, 0xc0, 0xac, 0x1e, + 0xb7, 0xdf, 0xee, 0xb5, 0xd0, 0x1c, 0x51, 0xa3, 0x4b, 0xa7, 0x05, 0x5d, 0x69, 0xf7, 0x5a, 0x2e, + 0x54, 0x23, 0xc6, 0x36, 0xf8, 0x2e, 0x98, 0x4b, 0x84, 0x4b, 0x88, 0xe7, 0x09, 0x31, 0x4a, 0x8b, + 0x95, 0x90, 0xcd, 0x68, 0x81, 0x12, 0x36, 0x47, 0x62, 0xa3, 0xd5, 0xaa, 0x75, 0x1a, 0x7e, 0xdd, + 0x47, 0x08, 0xd7, 0xac, 0x9c, 0x1b, 0xcb, 0xc5, 0xeb, 0x68, 0xdd, 0x9e, 0xe0, 0xcb, 0xf0, 0x8a, + 0xd4, 0x0a, 0xf5, 0x20, 0x3c, 0x44, 0x67, 0x19, 0xde, 0x88, 0xdb, 0xe1, 0x7e, 0x10, 0x1e, 0xc2, + 0x2a, 0x98, 0x0e, 0xfd, 0x7a, 0x2f, 0x8c, 0x1a, 0xaf, 0x7c, 0x91, 0xd6, 0x73, 0x24, 0xad, 0x67, + 0x33, 0x73, 0xe0, 0x16, 0xc5, 0x1a, 0x9e, 0xce, 0xcb, 0x60, 0x32, 0xf4, 0x3b, 0xbe, 0x87, 0xf3, + 0x48, 0x6f, 0xe6, 0x0b, 0x96, 0x89, 0xd5, 0x86, 0x5b, 0x85, 0xda, 0xc8, 0x30, 0xc7, 0x46, 0x96, + 0x65, 0x62, 0xb5, 0x91, 0x60, 0x54, 0x1b, 0x04, 0x8c, 0xa9, 0xcd, 0x45, 0xcb, 0xc4, 0x6a, 0xc3, + 0xcd, 0xb1, 0xda, 0x28, 0x40, 0xc7, 0x46, 0x4b, 0x96, 0x89, 0xd5, 0x46, 0x06, 0x6a, 0x8c, 0x4c, + 0x6d, 0x96, 0x2d, 0x13, 0xab, 0x0d, 0x37, 0xef, 0x27, 0x19, 0x99, 0xda, 0x5c, 0xb2, 0x4c, 0xac, + 0x36, 0x32, 0x90, 0xaa, 0x8d, 0x00, 0x72, 0x59, 0xb8, 0x6c, 0x99, 0x58, 0x6d, 0xb8, 0x5d, 0x52, + 0x1b, 0x15, 0xea, 0xd8, 0xe8, 0xff, 0x2c, 0x13, 0xab, 0x8d, 0x02, 0xa5, 0x6a, 0x13, 0xbb, 0xe7, + 0xb4, 0x57, 0x2c, 0x13, 0xab, 0x8d, 0x08, 0x40, 0x52, 0x1b, 0x0d, 0xec, 0xd8, 0xa8, 0x64, 0x99, + 0x58, 0x6d, 0x54, 0x30, 0x55, 0x9b, 0x38, 0x08, 0xa2, 0x36, 0x57, 0x2d, 0x13, 0xab, 0x8d, 0x08, + 0x81, 0xab, 0x8d, 0x80, 0x31, 0xb5, 0xb9, 0x66, 0x99, 0x58, 0x6d, 0xb8, 0x39, 0x56, 0x1b, 0x01, + 0x24, 0x6a, 0x73, 0xdd, 0x32, 0xb1, 0xda, 0x70, 0x23, 0x57, 0x9b, 0x38, 0x42, 0xaa, 0x36, 0x6f, + 0x5a, 0x26, 0x56, 0x1b, 0x11, 0x9f, 0x50, 0x9b, 0x98, 0x8d, 0xa8, 0xcd, 0x5b, 0x96, 0x89, 0xd5, + 0x46, 0xd0, 0x71, 0xb5, 0x11, 0x30, 0x4d, 0x6d, 0x56, 0x2d, 0xf3, 0xb5, 0xd4, 0x86, 0xf3, 0x24, + 0xd4, 0x26, 0xce, 0x92, 0xa6, 0x36, 0x6b, 0xc4, 0x43, 0x7f, 0xb5, 0x11, 0xc9, 0x4c, 0xa8, 0x8d, + 0x1e, 0x37, 0x11, 0x85, 0x0d, 0xcb, 0x1c, 0x5c, 0x6d, 0xd4, 0x88, 0xb9, 0xda, 0x24, 0xc2, 0x25, + 0xc4, 0x36, 0x21, 0xee, 0xa3, 0x36, 0x5a, 0xa0, 0x5c, 0x6d, 0xb4, 0x6a, 0x31, 0xb5, 0x71, 0x70, + 0xcd, 0xa8, 0xda, 0xa8, 0x75, 0x13, 0x6a, 0x23, 0xd6, 0x11, 0xb5, 0xb9, 0xc5, 0xf0, 0x46, 0xdc, + 0x0e, 0x44, 0x6d, 0x9e, 0x82, 0xa9, 0x96, 0xd7, 0xa1, 0x02, 0xc1, 0x64, 0x62, 0x93, 0x24, 0xf5, + 0xcd, 0xec, 0x0c, 0x3c, 0xf6, 0x3a, 0x44, 0x3b, 0xc8, 0x47, 0xa5, 0xdd, 0x0d, 0x4f, 0xdc, 0x89, + 0x96, 0x6c, 0x93, 0x58, 0x1d, 0x9b, 0xa9, 0xca, 0xed, 0xc1, 0x58, 0x1d, 0x9b, 0x7c, 0x28, 0xac, + 0xcc, 0x06, 0x9f, 0x83, 0x69, 0xcc, 0x4a, 0xe5, 0x87, 0xab, 0xd0, 0x1d, 0xc2, 0xbb, 0xd2, 0x97, + 0x97, 0x4a, 0x13, 0xfd, 0xa4, 0xcc, 0x38, 0x3c, 0xd9, 0x2a, 0x73, 0x3b, 0x36, 0x17, 0xae, 0xb7, + 0x07, 0xe4, 0x76, 0x6c, 0xfa, 0xa9, 0x72, 0x73, 0x2b, 0xe7, 0xa6, 0x22, 0xc7, 0xb5, 0xee, 0xff, + 0x07, 0xe0, 0xa6, 0x02, 0xb8, 0xaf, 0xc5, 0x2d, 0x5b, 0x65, 0x6e, 0xc7, 0xe6, 0xf2, 0xf8, 0xce, + 0x80, 0xdc, 0x8e, 0xbd, 0xaf, 0xc5, 0x2d, 0x5b, 0xe1, 0xc7, 0xc1, 0x0c, 0xe6, 0x66, 0xda, 0x26, + 0x24, 0xf5, 0x2e, 0x61, 0x5f, 0xed, 0xcb, 0xce, 0x74, 0x96, 0xfd, 0xa0, 0xfc, 0x38, 0x50, 0xd5, + 0xae, 0x78, 0x70, 0x6c, 0xa1, 0xc4, 0x1f, 0x19, 0xd4, 0x83, 0x63, 0xb3, 0x1f, 0x9a, 0x07, 0x61, + 0x87, 0x47, 0x60, 0x8e, 0xe4, 0x87, 0x6f, 0x42, 0x28, 0xf8, 0x3d, 0xe2, 0x63, 0xbd, 0x7f, 0x8e, + 0x18, 0x98, 0xff, 0xa4, 0x5e, 0x70, 0xc8, 0xfa, 0x15, 0xd5, 0x0f, 0xae, 0x04, 0xdf, 0xcb, 0xd6, + 0xc0, 0x7e, 0x1c, 0x9b, 0xff, 0xd4, 0xfd, 0xc4, 0x57, 0xd4, 0xfb, 0x95, 0x1e, 0x1a, 0xe5, 0x41, + 0xef, 0x57, 0x72, 0x9c, 0x68, 0xf7, 0x2b, 0x3d, 0x62, 0x9e, 0x81, 0x62, 0xcc, 0xca, 0xce, 0x98, + 0xfb, 0x84, 0xf6, 0xad, 0xd3, 0x69, 0xe9, 0xe9, 0x43, 0x79, 0x27, 0x5b, 0x8a, 0x11, 0xee, 0x02, + 0xec, 0x89, 0x9c, 0x46, 0xf4, 0x48, 0x7a, 0x40, 0x58, 0xaf, 0xf5, 0x65, 0xc5, 0xe7, 0x14, 0xfe, + 0x9f, 0x52, 0xe6, 0x5b, 0xb1, 0x45, 0xb4, 0x3b, 0x95, 0x42, 0x76, 0x7e, 0x55, 0x06, 0x69, 0x77, + 0x02, 0xa5, 0x9f, 0x52, 0xbb, 0x4b, 0x56, 0x9e, 0x04, 0xc6, 0x4d, 0x8f, 0xbc, 0xea, 0x00, 0x49, + 0xa0, 0xcb, 0xc9, 0x69, 0x18, 0x27, 0x41, 0x32, 0xc2, 0x0e, 0x38, 0x2b, 0x11, 0x6b, 0x87, 0xe4, + 0x43, 0xe2, 0xe1, 0xe6, 0x00, 0x1e, 0x94, 0x63, 0x91, 0x7a, 0x9a, 0x6f, 0xa5, 0x5e, 0x84, 0x11, + 0x58, 0x94, 0x3c, 0xea, 0xa7, 0xe6, 0x36, 0x71, 0xe9, 0x0c, 0xe0, 0x52, 0x3d, 0x33, 0xa9, 0xcf, + 0x85, 0x56, 0xfa, 0x55, 0x78, 0x0c, 0xe6, 0x93, 0xdb, 0x24, 0x47, 0xdf, 0xce, 0x20, 0xf7, 0x80, + 0xb4, 0x0d, 0x7c, 0xf4, 0x49, 0xf7, 0x80, 0x76, 0x05, 0xbe, 0x0f, 0x16, 0x52, 0x76, 0x47, 0x3c, + 0x3d, 0x22, 0x9e, 0x36, 0x06, 0xdf, 0x5a, 0xec, 0x6a, 0xb6, 0x95, 0x72, 0x09, 0x2e, 0x83, 0x42, + 0xd0, 0xf6, 0x83, 0x23, 0x7e, 0xdc, 0x04, 0xf8, 0x11, 0x7b, 0x7b, 0xc8, 0xcd, 0x13, 0x2b, 0x3b, + 0x3c, 0x3e, 0x06, 0x66, 0x29, 0x48, 0xab, 0x6d, 0xe7, 0xb5, 0x1e, 0xb7, 0xb6, 0x87, 0x5c, 0x48, + 0x68, 0xd4, 0x5a, 0x8a, 0x08, 0x58, 0xb7, 0x7f, 0xc0, 0x27, 0x12, 0xc4, 0xca, 0x7a, 0xf7, 0x22, + 0xa0, 0x5f, 0x59, 0xdb, 0x86, 0x6c, 0xbc, 0x01, 0x88, 0x91, 0x76, 0xe1, 0x05, 0x00, 0x18, 0x04, + 0xdf, 0x87, 0x11, 0x7e, 0x10, 0xdd, 0x1e, 0x72, 0xc7, 0x29, 0x02, 0xdf, 0x5b, 0xca, 0x56, 0x1d, + 0x1b, 0x75, 0x2d, 0xa3, 0x34, 0xac, 0x6c, 0xd5, 0xb1, 0x63, 0x47, 0x54, 0x7b, 0x7a, 0xf8, 0xf1, + 0x58, 0x38, 0xa2, 0x62, 0x22, 0x78, 0x98, 0x90, 0xbc, 0xc2, 0x8f, 0xc6, 0x82, 0x87, 0x09, 0x43, + 0x85, 0x47, 0x43, 0xca, 0xf6, 0xe1, 0xe0, 0x8f, 0x78, 0x22, 0x66, 0x52, 0x9e, 0x3d, 0xe9, 0x69, + 0x8c, 0x88, 0x0c, 0x9b, 0xa6, 0xa1, 0x5f, 0x19, 0x24, 0xf7, 0x8b, 0x2b, 0x74, 0xdc, 0xb6, 0xc2, + 0xe7, 0x3c, 0x2b, 0x78, 0xab, 0xef, 0x79, 0xcd, 0x9e, 0x1f, 0x3f, 0xa6, 0x61, 0xd3, 0x33, 0xba, + 0x0e, 0xba, 0x60, 0x5e, 0x9d, 0xd1, 0x08, 0xc6, 0x5f, 0x1b, 0xec, 0xd1, 0x56, 0x67, 0x24, 0x7a, + 0x47, 0x29, 0x67, 0x95, 0x49, 0x4e, 0x06, 0xa7, 0x63, 0x0b, 0xce, 0xdf, 0xf4, 0xe1, 0x74, 0xec, + 0x24, 0xa7, 0x63, 0x73, 0xce, 0x03, 0xe9, 0x21, 0xbf, 0xa7, 0x06, 0xfa, 0x5b, 0x4a, 0x7a, 0x3e, + 0x41, 0x7a, 0x20, 0x45, 0x3a, 0xa7, 0x0e, 0x89, 0xb2, 0x68, 0xa5, 0x58, 0x7f, 0xd7, 0x8f, 0x96, + 0x07, 0x3b, 0xa7, 0x8e, 0x94, 0xd2, 0x32, 0x40, 0x1a, 0x47, 0xb0, 0xfe, 0x3e, 0x2b, 0x03, 0xa4, + 0x97, 0xb4, 0x0c, 0x10, 0x5b, 0x5a, 0xa8, 0xb4, 0xd3, 0x04, 0xe9, 0x1f, 0xb2, 0x42, 0xa5, 0xcd, + 0xa7, 0x85, 0x4a, 0x8d, 0x69, 0xb4, 0x4c, 0x61, 0x38, 0xed, 0x1f, 0xb3, 0x68, 0xe9, 0x4d, 0xa8, + 0xd1, 0x52, 0x63, 0x5a, 0x06, 0xc8, 0x3d, 0x2a, 0x58, 0xff, 0x94, 0x95, 0x01, 0x72, 0xdb, 0x6a, + 0x19, 0x20, 0x36, 0xce, 0xb9, 0x27, 0x3d, 0x1c, 0x28, 0xcd, 0xff, 0x67, 0x83, 0xc8, 0x60, 0xdf, + 0xe6, 0x97, 0x1f, 0x0a, 0xa5, 0x20, 0xd5, 0x91, 0x81, 0x60, 0xfc, 0x8b, 0xc1, 0x9e, 0xb4, 0xfa, + 0x35, 0xbf, 0x32, 0x58, 0xc8, 0xe0, 0x94, 0x1a, 0xea, 0xaf, 0x7d, 0x38, 0x45, 0xf3, 0x2b, 0x53, + 0x08, 0xa9, 0x46, 0xda, 0x30, 0x42, 0x90, 0xfe, 0x8d, 0x92, 0x9e, 0xd2, 0xfc, 0xea, 0xcc, 0x22, + 0x8b, 0x56, 0x8a, 0xf5, 0xef, 0xfd, 0x68, 0x45, 0xf3, 0xab, 0x13, 0x8e, 0xb4, 0x0c, 0xa8, 0xcd, + 0xff, 0x8f, 0xac, 0x0c, 0xc8, 0xcd, 0xaf, 0x0c, 0x03, 0xd2, 0x42, 0xd5, 0x9a, 0xff, 0x9f, 0x59, + 0xa1, 0x2a, 0xcd, 0xaf, 0x8e, 0x0e, 0xd2, 0x68, 0xb5, 0xe6, 0xff, 0x57, 0x16, 0xad, 0xd2, 0xfc, + 0xea, 0xb3, 0x68, 0x5a, 0x06, 0xd4, 0xe6, 0xff, 0x77, 0x56, 0x06, 0xe4, 0xe6, 0x57, 0x06, 0x0e, + 0x9c, 0xf3, 0xa1, 0x34, 0xd7, 0xe5, 0xef, 0x70, 0xd0, 0x77, 0x73, 0x6c, 0x4e, 0x96, 0xd8, 0x3b, + 0x43, 0xc4, 0x33, 0x5f, 0x6e, 0x81, 0x8f, 0x80, 0x18, 0x1a, 0xd6, 0xc4, 0xcb, 0x1a, 0xf4, 0xbd, + 0x5c, 0xc6, 0xf9, 0xf1, 0x94, 0x43, 0x5c, 0xe1, 0x5f, 0x98, 0xe0, 0x47, 0xc1, 0x8c, 0x34, 0xc4, + 0xe6, 0x2f, 0x8e, 0xd0, 0xf7, 0xb3, 0xc8, 0xaa, 0x18, 0xf3, 0xd8, 0x8b, 0x5e, 0xc6, 0x64, 0xc2, + 0x04, 0xb7, 0xd4, 0xb9, 0x70, 0xaf, 0xde, 0x45, 0x3f, 0xa0, 0x44, 0x0b, 0x69, 0x45, 0xe8, 0xd5, + 0xbb, 0xca, 0xc4, 0xb8, 0x57, 0xef, 0xc2, 0x4d, 0x20, 0x66, 0x8b, 0x35, 0xaf, 0x7d, 0x82, 0x7e, + 0x48, 0xd7, 0xcf, 0x26, 0xd6, 0x6f, 0xb5, 0x4f, 0xdc, 0x3c, 0x87, 0x6e, 0xb5, 0x4f, 0xe0, 0x5d, + 0x69, 0xd6, 0xfc, 0x0a, 0x97, 0x01, 0xfd, 0x88, 0xae, 0x9d, 0x4f, 0xac, 0xa5, 0x55, 0x12, 0xd3, + 0x4d, 0xf2, 0x15, 0x97, 0x27, 0x6e, 0x50, 0x5e, 0x9e, 0x1f, 0xe7, 0x48, 0xb5, 0xfb, 0x95, 0x47, + 0xf4, 0xa5, 0x54, 0x1e, 0x41, 0x14, 0x97, 0xe7, 0x27, 0xb9, 0x0c, 0x85, 0x93, 0xca, 0xc3, 0x97, + 0xc5, 0xe5, 0x91, 0xb9, 0x48, 0x79, 0x48, 0x75, 0x7e, 0x9a, 0xc5, 0x25, 0x55, 0x27, 0x1e, 0x0a, + 0xb2, 0x55, 0xb8, 0x3a, 0xf2, 0xad, 0x82, 0xab, 0xf3, 0x4b, 0x4a, 0x94, 0x5d, 0x1d, 0xe9, 0xee, + 0x60, 0xd5, 0x11, 0x14, 0xb8, 0x3a, 0x3f, 0xa3, 0xeb, 0x33, 0xaa, 0xc3, 0xa1, 0xac, 0x3a, 0x62, + 0x25, 0xad, 0xce, 0xcf, 0xe9, 0xda, 0xcc, 0xea, 0x70, 0x38, 0xad, 0xce, 0x05, 0x00, 0xc8, 0xfe, + 0xdb, 0x5e, 0xcb, 0x5f, 0x43, 0x9f, 0x36, 0xc9, 0x6b, 0x28, 0xc9, 0x04, 0x2d, 0x90, 0xa7, 0xfd, + 0x8b, 0xbf, 0xae, 0xa3, 0xcf, 0xc8, 0x88, 0x5d, 0x6c, 0x82, 0x17, 0x41, 0xa1, 0x16, 0x43, 0x36, + 0xd0, 0x67, 0x19, 0xa4, 0xca, 0x21, 0x1b, 0x70, 0x09, 0x4c, 0x50, 0x04, 0x81, 0xd8, 0x35, 0xf4, + 0x39, 0x9d, 0x86, 0xfc, 0x3d, 0x49, 0xbe, 0xad, 0x62, 0xc8, 0x4d, 0xf4, 0x79, 0x8a, 0x90, 0x6d, + 0x70, 0x99, 0xd3, 0xac, 0x12, 0x1e, 0x07, 0x7d, 0x41, 0x01, 0x61, 0x1e, 0x47, 0xec, 0x08, 0x7f, + 0xbb, 0x85, 0xbe, 0xa8, 0x3b, 0xba, 0x85, 0x01, 0x22, 0xb4, 0x4d, 0xf4, 0x25, 0x3d, 0xda, 0xcd, + 0x78, 0xcb, 0xf8, 0xeb, 0x6d, 0xf4, 0x65, 0x9d, 0xe2, 0x36, 0x5c, 0x02, 0x85, 0xaa, 0x40, 0xac, + 0xad, 0xa2, 0xaf, 0xb0, 0x38, 0x04, 0xc9, 0xda, 0x2a, 0xc1, 0xec, 0x54, 0xde, 0x7d, 0x50, 0xdb, + 0xdd, 0x7a, 0x5c, 0x59, 0x5b, 0x43, 0x5f, 0xe5, 0x18, 0x6c, 0xa4, 0xb6, 0x18, 0x43, 0x72, 0xbd, + 0x8e, 0xbe, 0xa6, 0x60, 0x88, 0x0d, 0x5e, 0x02, 0x93, 0x35, 0x29, 0xbf, 0x6b, 0x1b, 0xe8, 0xeb, + 0x09, 0x6f, 0x1b, 0x14, 0x55, 0x8d, 0x51, 0x36, 0xfa, 0x46, 0x02, 0x65, 0xc7, 0x09, 0xa4, 0xa0, + 0x9b, 0xe8, 0x9b, 0x72, 0x02, 0x09, 0x48, 0xca, 0x32, 0xdd, 0x9d, 0x83, 0xbe, 0x95, 0x00, 0x39, + 0xd8, 0x9f, 0x14, 0xd3, 0xad, 0x5a, 0x0d, 0x7d, 0x3b, 0x81, 0xba, 0x85, 0x51, 0x52, 0x4c, 0x9b, + 0xb5, 0x1a, 0xfa, 0x4e, 0x22, 0xaa, 0xcd, 0xc5, 0xe7, 0x60, 0x42, 0x7d, 0xd0, 0x29, 0x00, 0xc3, + 0x63, 0x6f, 0x44, 0x0d, 0x0f, 0xbe, 0x0d, 0xf2, 0xf5, 0x40, 0xbc, 0xd4, 0x40, 0xb9, 0xd3, 0x5e, + 0x80, 0xc8, 0xe8, 0xc5, 0x7b, 0x00, 0x26, 0x87, 0x94, 0xb0, 0x08, 0xcc, 0x97, 0xfe, 0x09, 0x73, + 0x81, 0x7f, 0x85, 0xb3, 0xe0, 0x0c, 0xbd, 0x7d, 0x72, 0xc4, 0x46, 0xbf, 0xdc, 0xc9, 0x6d, 0x1a, + 0x31, 0x83, 0x3c, 0x90, 0x94, 0x19, 0xcc, 0x14, 0x06, 0x53, 0x66, 0x28, 0x83, 0xd9, 0xb4, 0xd1, + 0xa3, 0xcc, 0x31, 0x91, 0xc2, 0x31, 0x91, 0xce, 0xa1, 0x8c, 0x18, 0x65, 0x8e, 0xe1, 0x14, 0x8e, + 0xe1, 0x24, 0x47, 0x62, 0x94, 0x28, 0x73, 0x4c, 0xa7, 0x70, 0x4c, 0xa7, 0x73, 0x28, 0x23, 0x43, + 0x99, 0x03, 0xa6, 0x70, 0x40, 0x99, 0xe3, 0x01, 0x98, 0x4f, 0x1f, 0x0c, 0xca, 0x2c, 0xa3, 0x29, + 0x2c, 0xa3, 0x19, 0x2c, 0xea, 0xf0, 0x4f, 0x66, 0x19, 0x49, 0x61, 0x19, 0x91, 0x59, 0xaa, 0x00, + 0x65, 0x8d, 0xf7, 0x64, 0x9e, 0xa9, 0x14, 0x9e, 0xa9, 0x2c, 0x1e, 0x6d, 0x7c, 0x27, 0xf3, 0x14, + 0x53, 0x78, 0x8a, 0xa9, 0xdd, 0x26, 0x0f, 0xe9, 0x4e, 0xeb, 0xd7, 0x9c, 0xcc, 0xb0, 0x05, 0x66, + 0x52, 0xe6, 0x71, 0xa7, 0x51, 0x18, 0x32, 0xc5, 0x5d, 0x50, 0xd4, 0x87, 0x6f, 0xf2, 0xfa, 0xb1, + 0x94, 0xf5, 0x63, 0x29, 0x4d, 0xa2, 0x0f, 0xda, 0x64, 0x8e, 0xf1, 0x14, 0x8e, 0xf1, 0xe4, 0x36, + 0xf4, 0x89, 0xda, 0x69, 0x14, 0x05, 0x99, 0x22, 0x04, 0xe7, 0xfa, 0x8c, 0xcc, 0x52, 0xa8, 0xde, + 0x91, 0xa9, 0x5e, 0xe3, 0x7d, 0x95, 0xe4, 0xf3, 0x18, 0x9c, 0xef, 0x37, 0x33, 0x4b, 0x71, 0xba, + 0xa6, 0x3a, 0xed, 0xfb, 0x0a, 0x4b, 0x72, 0xd4, 0xa4, 0x0d, 0x97, 0x36, 0x2b, 0x4b, 0x71, 0x72, + 0x47, 0x76, 0x32, 0xe8, 0x4b, 0x2d, 0xc9, 0x9b, 0x07, 0xce, 0x66, 0xce, 0xcb, 0x52, 0xdc, 0xad, + 0xa8, 0xee, 0xb2, 0x5f, 0x75, 0xc5, 0x2e, 0x96, 0x6e, 0x03, 0x20, 0x4d, 0xf6, 0x46, 0x81, 0x59, + 0xdd, 0xdb, 0x2b, 0x0e, 0xe1, 0x5f, 0xca, 0x5b, 0x6e, 0xd1, 0xa0, 0xbf, 0x3c, 0x2f, 0xe6, 0xb0, + 0xbb, 0xdd, 0xca, 0xc3, 0xe2, 0x7f, 0xf9, 0x7f, 0x46, 0x79, 0x42, 0x8c, 0xa2, 0xf0, 0xa9, 0xb2, + 0xf4, 0x06, 0x98, 0xd4, 0x06, 0x92, 0x05, 0x60, 0xd4, 0xf9, 0x81, 0x52, 0xbf, 0x76, 0x13, 0x80, + 0xf8, 0xdf, 0x30, 0xc1, 0x29, 0x90, 0x3f, 0xd8, 0xdd, 0x7f, 0x52, 0xb9, 0xbf, 0x53, 0xdd, 0xa9, + 0x3c, 0x28, 0x0e, 0xc1, 0x02, 0x18, 0x7b, 0xe2, 0xee, 0x3d, 0xdd, 0x2b, 0x1f, 0x54, 0x8b, 0x06, + 0x1c, 0x03, 0xc3, 0x8f, 0xf6, 0xf7, 0x76, 0x8b, 0xb9, 0x6b, 0xf7, 0x40, 0x5e, 0x9e, 0x07, 0x4e, + 0x81, 0x7c, 0x75, 0xcf, 0xad, 0xec, 0x3c, 0xdc, 0xad, 0xd1, 0x48, 0x25, 0x03, 0x8d, 0x58, 0x31, + 0x3c, 0x2f, 0xe6, 0xca, 0x17, 0xc1, 0x85, 0x7a, 0xd0, 0x4a, 0xfc, 0x61, 0x26, 0x25, 0xe7, 0xc5, + 0x08, 0xb1, 0x6e, 0xfc, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x33, 0xc2, 0x0c, 0xb6, 0xeb, 0x26, 0x00, + 0x00, +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/_conformance/conformance_proto/conformance.proto b/example/prometheus-mock/vendor/github.com/golang/protobuf/_conformance/conformance_proto/conformance.proto new file mode 100644 index 0000000..95a8fd1 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/_conformance/conformance_proto/conformance.proto @@ -0,0 +1,285 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// 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. + +syntax = "proto3"; +package conformance; +option java_package = "com.google.protobuf.conformance"; + +import "google/protobuf/any.proto"; +import "google/protobuf/duration.proto"; +import "google/protobuf/field_mask.proto"; +import "google/protobuf/struct.proto"; +import "google/protobuf/timestamp.proto"; +import "google/protobuf/wrappers.proto"; + +// This defines the conformance testing protocol. This protocol exists between +// the conformance test suite itself and the code being tested. For each test, +// the suite will send a ConformanceRequest message and expect a +// ConformanceResponse message. +// +// You can either run the tests in two different ways: +// +// 1. in-process (using the interface in conformance_test.h). +// +// 2. as a sub-process communicating over a pipe. Information about how to +// do this is in conformance_test_runner.cc. +// +// Pros/cons of the two approaches: +// +// - running as a sub-process is much simpler for languages other than C/C++. +// +// - running as a sub-process may be more tricky in unusual environments like +// iOS apps, where fork/stdin/stdout are not available. + +enum WireFormat { + UNSPECIFIED = 0; + PROTOBUF = 1; + JSON = 2; +} + +// Represents a single test case's input. The testee should: +// +// 1. parse this proto (which should always succeed) +// 2. parse the protobuf or JSON payload in "payload" (which may fail) +// 3. if the parse succeeded, serialize the message in the requested format. +message ConformanceRequest { + // The payload (whether protobuf of JSON) is always for a TestAllTypes proto + // (see below). + oneof payload { + bytes protobuf_payload = 1; + string json_payload = 2; + } + + // Which format should the testee serialize its message to? + WireFormat requested_output_format = 3; +} + +// Represents a single test case's output. +message ConformanceResponse { + oneof result { + // This string should be set to indicate parsing failed. The string can + // provide more information about the parse error if it is available. + // + // Setting this string does not necessarily mean the testee failed the + // test. Some of the test cases are intentionally invalid input. + string parse_error = 1; + + // If the input was successfully parsed but errors occurred when + // serializing it to the requested output format, set the error message in + // this field. + string serialize_error = 6; + + // This should be set if some other error occurred. This will always + // indicate that the test failed. The string can provide more information + // about the failure. + string runtime_error = 2; + + // If the input was successfully parsed and the requested output was + // protobuf, serialize it to protobuf and set it in this field. + bytes protobuf_payload = 3; + + // If the input was successfully parsed and the requested output was JSON, + // serialize to JSON and set it in this field. + string json_payload = 4; + + // For when the testee skipped the test, likely because a certain feature + // wasn't supported, like JSON input/output. + string skipped = 5; + } +} + +// This proto includes every type of field in both singular and repeated +// forms. +message TestAllTypes { + message NestedMessage { + int32 a = 1; + TestAllTypes corecursive = 2; + } + + enum NestedEnum { + FOO = 0; + BAR = 1; + BAZ = 2; + NEG = -1; // Intentionally negative. + } + + // Singular + int32 optional_int32 = 1; + int64 optional_int64 = 2; + uint32 optional_uint32 = 3; + uint64 optional_uint64 = 4; + sint32 optional_sint32 = 5; + sint64 optional_sint64 = 6; + fixed32 optional_fixed32 = 7; + fixed64 optional_fixed64 = 8; + sfixed32 optional_sfixed32 = 9; + sfixed64 optional_sfixed64 = 10; + float optional_float = 11; + double optional_double = 12; + bool optional_bool = 13; + string optional_string = 14; + bytes optional_bytes = 15; + + NestedMessage optional_nested_message = 18; + ForeignMessage optional_foreign_message = 19; + + NestedEnum optional_nested_enum = 21; + ForeignEnum optional_foreign_enum = 22; + + string optional_string_piece = 24 [ctype=STRING_PIECE]; + string optional_cord = 25 [ctype=CORD]; + + TestAllTypes recursive_message = 27; + + // Repeated + repeated int32 repeated_int32 = 31; + repeated int64 repeated_int64 = 32; + repeated uint32 repeated_uint32 = 33; + repeated uint64 repeated_uint64 = 34; + repeated sint32 repeated_sint32 = 35; + repeated sint64 repeated_sint64 = 36; + repeated fixed32 repeated_fixed32 = 37; + repeated fixed64 repeated_fixed64 = 38; + repeated sfixed32 repeated_sfixed32 = 39; + repeated sfixed64 repeated_sfixed64 = 40; + repeated float repeated_float = 41; + repeated double repeated_double = 42; + repeated bool repeated_bool = 43; + repeated string repeated_string = 44; + repeated bytes repeated_bytes = 45; + + repeated NestedMessage repeated_nested_message = 48; + repeated ForeignMessage repeated_foreign_message = 49; + + repeated NestedEnum repeated_nested_enum = 51; + repeated ForeignEnum repeated_foreign_enum = 52; + + repeated string repeated_string_piece = 54 [ctype=STRING_PIECE]; + repeated string repeated_cord = 55 [ctype=CORD]; + + // Map + map < int32, int32> map_int32_int32 = 56; + map < int64, int64> map_int64_int64 = 57; + map < uint32, uint32> map_uint32_uint32 = 58; + map < uint64, uint64> map_uint64_uint64 = 59; + map < sint32, sint32> map_sint32_sint32 = 60; + map < sint64, sint64> map_sint64_sint64 = 61; + map < fixed32, fixed32> map_fixed32_fixed32 = 62; + map < fixed64, fixed64> map_fixed64_fixed64 = 63; + map map_sfixed32_sfixed32 = 64; + map map_sfixed64_sfixed64 = 65; + map < int32, float> map_int32_float = 66; + map < int32, double> map_int32_double = 67; + map < bool, bool> map_bool_bool = 68; + map < string, string> map_string_string = 69; + map < string, bytes> map_string_bytes = 70; + map < string, NestedMessage> map_string_nested_message = 71; + map < string, ForeignMessage> map_string_foreign_message = 72; + map < string, NestedEnum> map_string_nested_enum = 73; + map < string, ForeignEnum> map_string_foreign_enum = 74; + + oneof oneof_field { + uint32 oneof_uint32 = 111; + NestedMessage oneof_nested_message = 112; + string oneof_string = 113; + bytes oneof_bytes = 114; + bool oneof_bool = 115; + uint64 oneof_uint64 = 116; + float oneof_float = 117; + double oneof_double = 118; + NestedEnum oneof_enum = 119; + } + + // Well-known types + google.protobuf.BoolValue optional_bool_wrapper = 201; + google.protobuf.Int32Value optional_int32_wrapper = 202; + google.protobuf.Int64Value optional_int64_wrapper = 203; + google.protobuf.UInt32Value optional_uint32_wrapper = 204; + google.protobuf.UInt64Value optional_uint64_wrapper = 205; + google.protobuf.FloatValue optional_float_wrapper = 206; + google.protobuf.DoubleValue optional_double_wrapper = 207; + google.protobuf.StringValue optional_string_wrapper = 208; + google.protobuf.BytesValue optional_bytes_wrapper = 209; + + repeated google.protobuf.BoolValue repeated_bool_wrapper = 211; + repeated google.protobuf.Int32Value repeated_int32_wrapper = 212; + repeated google.protobuf.Int64Value repeated_int64_wrapper = 213; + repeated google.protobuf.UInt32Value repeated_uint32_wrapper = 214; + repeated google.protobuf.UInt64Value repeated_uint64_wrapper = 215; + repeated google.protobuf.FloatValue repeated_float_wrapper = 216; + repeated google.protobuf.DoubleValue repeated_double_wrapper = 217; + repeated google.protobuf.StringValue repeated_string_wrapper = 218; + repeated google.protobuf.BytesValue repeated_bytes_wrapper = 219; + + google.protobuf.Duration optional_duration = 301; + google.protobuf.Timestamp optional_timestamp = 302; + google.protobuf.FieldMask optional_field_mask = 303; + google.protobuf.Struct optional_struct = 304; + google.protobuf.Any optional_any = 305; + google.protobuf.Value optional_value = 306; + + repeated google.protobuf.Duration repeated_duration = 311; + repeated google.protobuf.Timestamp repeated_timestamp = 312; + repeated google.protobuf.FieldMask repeated_fieldmask = 313; + repeated google.protobuf.Struct repeated_struct = 324; + repeated google.protobuf.Any repeated_any = 315; + repeated google.protobuf.Value repeated_value = 316; + + // Test field-name-to-JSON-name convention. + // (protobuf says names can be any valid C/C++ identifier.) + int32 fieldname1 = 401; + int32 field_name2 = 402; + int32 _field_name3 = 403; + int32 field__name4_ = 404; + int32 field0name5 = 405; + int32 field_0_name6 = 406; + int32 fieldName7 = 407; + int32 FieldName8 = 408; + int32 field_Name9 = 409; + int32 Field_Name10 = 410; + int32 FIELD_NAME11 = 411; + int32 FIELD_name12 = 412; + int32 __field_name13 = 413; + int32 __Field_name14 = 414; + int32 field__name15 = 415; + int32 field__Name16 = 416; + int32 field_name17__ = 417; + int32 Field_name18__ = 418; +} + +message ForeignMessage { + int32 c = 1; +} + +enum ForeignEnum { + FOREIGN_FOO = 0; + FOREIGN_BAR = 1; + FOREIGN_BAZ = 2; +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/descriptor/descriptor.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/descriptor/descriptor.go new file mode 100644 index 0000000..ac7e51b --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/descriptor/descriptor.go @@ -0,0 +1,93 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +// Package descriptor provides functions for obtaining protocol buffer +// descriptors for generated Go types. +// +// These functions cannot go in package proto because they depend on the +// generated protobuf descriptor messages, which themselves depend on proto. +package descriptor + +import ( + "bytes" + "compress/gzip" + "fmt" + "io/ioutil" + + "github.com/golang/protobuf/proto" + protobuf "github.com/golang/protobuf/protoc-gen-go/descriptor" +) + +// extractFile extracts a FileDescriptorProto from a gzip'd buffer. +func extractFile(gz []byte) (*protobuf.FileDescriptorProto, error) { + r, err := gzip.NewReader(bytes.NewReader(gz)) + if err != nil { + return nil, fmt.Errorf("failed to open gzip reader: %v", err) + } + defer r.Close() + + b, err := ioutil.ReadAll(r) + if err != nil { + return nil, fmt.Errorf("failed to uncompress descriptor: %v", err) + } + + fd := new(protobuf.FileDescriptorProto) + if err := proto.Unmarshal(b, fd); err != nil { + return nil, fmt.Errorf("malformed FileDescriptorProto: %v", err) + } + + return fd, nil +} + +// Message is a proto.Message with a method to return its descriptor. +// +// Message types generated by the protocol compiler always satisfy +// the Message interface. +type Message interface { + proto.Message + Descriptor() ([]byte, []int) +} + +// ForMessage returns a FileDescriptorProto and a DescriptorProto from within it +// describing the given message. +func ForMessage(msg Message) (fd *protobuf.FileDescriptorProto, md *protobuf.DescriptorProto) { + gz, path := msg.Descriptor() + fd, err := extractFile(gz) + if err != nil { + panic(fmt.Sprintf("invalid FileDescriptorProto for %T: %v", msg, err)) + } + + md = fd.MessageType[path[0]] + for _, i := range path[1:] { + md = md.NestedType[i] + } + return fd, md +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/descriptor/descriptor_test.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/descriptor/descriptor_test.go new file mode 100644 index 0000000..27b0729 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/descriptor/descriptor_test.go @@ -0,0 +1,32 @@ +package descriptor_test + +import ( + "fmt" + "testing" + + "github.com/golang/protobuf/descriptor" + tpb "github.com/golang/protobuf/proto/testdata" + protobuf "github.com/golang/protobuf/protoc-gen-go/descriptor" +) + +func TestMessage(t *testing.T) { + var msg *protobuf.DescriptorProto + fd, md := descriptor.ForMessage(msg) + if pkg, want := fd.GetPackage(), "google.protobuf"; pkg != want { + t.Errorf("descriptor.ForMessage(%T).GetPackage() = %q; want %q", msg, pkg, want) + } + if name, want := md.GetName(), "DescriptorProto"; name != want { + t.Fatalf("descriptor.ForMessage(%T).GetName() = %q; want %q", msg, name, want) + } +} + +func Example_Options() { + var msg *tpb.MyMessageSet + _, md := descriptor.ForMessage(msg) + if md.GetOptions().GetMessageSetWireFormat() { + fmt.Printf("%v uses option message_set_wire_format.\n", md.GetName()) + } + + // Output: + // MyMessageSet uses option message_set_wire_format. +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/jsonpb/jsonpb.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/jsonpb/jsonpb.go new file mode 100644 index 0000000..110ae13 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/jsonpb/jsonpb.go @@ -0,0 +1,1083 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2015 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +/* +Package jsonpb provides marshaling and unmarshaling between protocol buffers and JSON. +It follows the specification at https://developers.google.com/protocol-buffers/docs/proto3#json. + +This package produces a different output than the standard "encoding/json" package, +which does not operate correctly on protocol buffers. +*/ +package jsonpb + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "io" + "math" + "reflect" + "sort" + "strconv" + "strings" + "time" + + "github.com/golang/protobuf/proto" + + stpb "github.com/golang/protobuf/ptypes/struct" +) + +// Marshaler is a configurable object for converting between +// protocol buffer objects and a JSON representation for them. +type Marshaler struct { + // Whether to render enum values as integers, as opposed to string values. + EnumsAsInts bool + + // Whether to render fields with zero values. + EmitDefaults bool + + // A string to indent each level by. The presence of this field will + // also cause a space to appear between the field separator and + // value, and for newlines to be appear between fields and array + // elements. + Indent string + + // Whether to use the original (.proto) name for fields. + OrigName bool + + // A custom URL resolver to use when marshaling Any messages to JSON. + // If unset, the default resolution strategy is to extract the + // fully-qualified type name from the type URL and pass that to + // proto.MessageType(string). + AnyResolver AnyResolver +} + +// AnyResolver takes a type URL, present in an Any message, and resolves it into +// an instance of the associated message. +type AnyResolver interface { + Resolve(typeUrl string) (proto.Message, error) +} + +func defaultResolveAny(typeUrl string) (proto.Message, error) { + // Only the part of typeUrl after the last slash is relevant. + mname := typeUrl + if slash := strings.LastIndex(mname, "/"); slash >= 0 { + mname = mname[slash+1:] + } + mt := proto.MessageType(mname) + if mt == nil { + return nil, fmt.Errorf("unknown message type %q", mname) + } + return reflect.New(mt.Elem()).Interface().(proto.Message), nil +} + +// JSONPBMarshaler is implemented by protobuf messages that customize the +// way they are marshaled to JSON. Messages that implement this should +// also implement JSONPBUnmarshaler so that the custom format can be +// parsed. +type JSONPBMarshaler interface { + MarshalJSONPB(*Marshaler) ([]byte, error) +} + +// JSONPBUnmarshaler is implemented by protobuf messages that customize +// the way they are unmarshaled from JSON. Messages that implement this +// should also implement JSONPBMarshaler so that the custom format can be +// produced. +type JSONPBUnmarshaler interface { + UnmarshalJSONPB(*Unmarshaler, []byte) error +} + +// Marshal marshals a protocol buffer into JSON. +func (m *Marshaler) Marshal(out io.Writer, pb proto.Message) error { + writer := &errWriter{writer: out} + return m.marshalObject(writer, pb, "", "") +} + +// MarshalToString converts a protocol buffer object to JSON string. +func (m *Marshaler) MarshalToString(pb proto.Message) (string, error) { + var buf bytes.Buffer + if err := m.Marshal(&buf, pb); err != nil { + return "", err + } + return buf.String(), nil +} + +type int32Slice []int32 + +var nonFinite = map[string]float64{ + `"NaN"`: math.NaN(), + `"Infinity"`: math.Inf(1), + `"-Infinity"`: math.Inf(-1), +} + +// For sorting extensions ids to ensure stable output. +func (s int32Slice) Len() int { return len(s) } +func (s int32Slice) Less(i, j int) bool { return s[i] < s[j] } +func (s int32Slice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } + +type wkt interface { + XXX_WellKnownType() string +} + +// marshalObject writes a struct to the Writer. +func (m *Marshaler) marshalObject(out *errWriter, v proto.Message, indent, typeURL string) error { + if jsm, ok := v.(JSONPBMarshaler); ok { + b, err := jsm.MarshalJSONPB(m) + if err != nil { + return err + } + if typeURL != "" { + // we are marshaling this object to an Any type + var js map[string]*json.RawMessage + if err = json.Unmarshal(b, &js); err != nil { + return fmt.Errorf("type %T produced invalid JSON: %v", v, err) + } + turl, err := json.Marshal(typeURL) + if err != nil { + return fmt.Errorf("failed to marshal type URL %q to JSON: %v", typeURL, err) + } + js["@type"] = (*json.RawMessage)(&turl) + if b, err = json.Marshal(js); err != nil { + return err + } + } + + out.write(string(b)) + return out.err + } + + s := reflect.ValueOf(v).Elem() + + // Handle well-known types. + if wkt, ok := v.(wkt); ok { + switch wkt.XXX_WellKnownType() { + case "DoubleValue", "FloatValue", "Int64Value", "UInt64Value", + "Int32Value", "UInt32Value", "BoolValue", "StringValue", "BytesValue": + // "Wrappers use the same representation in JSON + // as the wrapped primitive type, ..." + sprop := proto.GetProperties(s.Type()) + return m.marshalValue(out, sprop.Prop[0], s.Field(0), indent) + case "Any": + // Any is a bit more involved. + return m.marshalAny(out, v, indent) + case "Duration": + // "Generated output always contains 3, 6, or 9 fractional digits, + // depending on required precision." + s, ns := s.Field(0).Int(), s.Field(1).Int() + d := time.Duration(s)*time.Second + time.Duration(ns)*time.Nanosecond + x := fmt.Sprintf("%.9f", d.Seconds()) + x = strings.TrimSuffix(x, "000") + x = strings.TrimSuffix(x, "000") + out.write(`"`) + out.write(x) + out.write(`s"`) + return out.err + case "Struct", "ListValue": + // Let marshalValue handle the `Struct.fields` map or the `ListValue.values` slice. + // TODO: pass the correct Properties if needed. + return m.marshalValue(out, &proto.Properties{}, s.Field(0), indent) + case "Timestamp": + // "RFC 3339, where generated output will always be Z-normalized + // and uses 3, 6 or 9 fractional digits." + s, ns := s.Field(0).Int(), s.Field(1).Int() + t := time.Unix(s, ns).UTC() + // time.RFC3339Nano isn't exactly right (we need to get 3/6/9 fractional digits). + x := t.Format("2006-01-02T15:04:05.000000000") + x = strings.TrimSuffix(x, "000") + x = strings.TrimSuffix(x, "000") + out.write(`"`) + out.write(x) + out.write(`Z"`) + return out.err + case "Value": + // Value has a single oneof. + kind := s.Field(0) + if kind.IsNil() { + // "absence of any variant indicates an error" + return errors.New("nil Value") + } + // oneof -> *T -> T -> T.F + x := kind.Elem().Elem().Field(0) + // TODO: pass the correct Properties if needed. + return m.marshalValue(out, &proto.Properties{}, x, indent) + } + } + + out.write("{") + if m.Indent != "" { + out.write("\n") + } + + firstField := true + + if typeURL != "" { + if err := m.marshalTypeURL(out, indent, typeURL); err != nil { + return err + } + firstField = false + } + + for i := 0; i < s.NumField(); i++ { + value := s.Field(i) + valueField := s.Type().Field(i) + if strings.HasPrefix(valueField.Name, "XXX_") { + continue + } + + // IsNil will panic on most value kinds. + switch value.Kind() { + case reflect.Chan, reflect.Func, reflect.Interface: + if value.IsNil() { + continue + } + } + + if !m.EmitDefaults { + switch value.Kind() { + case reflect.Bool: + if !value.Bool() { + continue + } + case reflect.Int32, reflect.Int64: + if value.Int() == 0 { + continue + } + case reflect.Uint32, reflect.Uint64: + if value.Uint() == 0 { + continue + } + case reflect.Float32, reflect.Float64: + if value.Float() == 0 { + continue + } + case reflect.String: + if value.Len() == 0 { + continue + } + case reflect.Map, reflect.Ptr, reflect.Slice: + if value.IsNil() { + continue + } + } + } + + // Oneof fields need special handling. + if valueField.Tag.Get("protobuf_oneof") != "" { + // value is an interface containing &T{real_value}. + sv := value.Elem().Elem() // interface -> *T -> T + value = sv.Field(0) + valueField = sv.Type().Field(0) + } + prop := jsonProperties(valueField, m.OrigName) + if !firstField { + m.writeSep(out) + } + if err := m.marshalField(out, prop, value, indent); err != nil { + return err + } + firstField = false + } + + // Handle proto2 extensions. + if ep, ok := v.(proto.Message); ok { + extensions := proto.RegisteredExtensions(v) + // Sort extensions for stable output. + ids := make([]int32, 0, len(extensions)) + for id, desc := range extensions { + if !proto.HasExtension(ep, desc) { + continue + } + ids = append(ids, id) + } + sort.Sort(int32Slice(ids)) + for _, id := range ids { + desc := extensions[id] + if desc == nil { + // unknown extension + continue + } + ext, extErr := proto.GetExtension(ep, desc) + if extErr != nil { + return extErr + } + value := reflect.ValueOf(ext) + var prop proto.Properties + prop.Parse(desc.Tag) + prop.JSONName = fmt.Sprintf("[%s]", desc.Name) + if !firstField { + m.writeSep(out) + } + if err := m.marshalField(out, &prop, value, indent); err != nil { + return err + } + firstField = false + } + + } + + if m.Indent != "" { + out.write("\n") + out.write(indent) + } + out.write("}") + return out.err +} + +func (m *Marshaler) writeSep(out *errWriter) { + if m.Indent != "" { + out.write(",\n") + } else { + out.write(",") + } +} + +func (m *Marshaler) marshalAny(out *errWriter, any proto.Message, indent string) error { + // "If the Any contains a value that has a special JSON mapping, + // it will be converted as follows: {"@type": xxx, "value": yyy}. + // Otherwise, the value will be converted into a JSON object, + // and the "@type" field will be inserted to indicate the actual data type." + v := reflect.ValueOf(any).Elem() + turl := v.Field(0).String() + val := v.Field(1).Bytes() + + var msg proto.Message + var err error + if m.AnyResolver != nil { + msg, err = m.AnyResolver.Resolve(turl) + } else { + msg, err = defaultResolveAny(turl) + } + if err != nil { + return err + } + + if err := proto.Unmarshal(val, msg); err != nil { + return err + } + + if _, ok := msg.(wkt); ok { + out.write("{") + if m.Indent != "" { + out.write("\n") + } + if err := m.marshalTypeURL(out, indent, turl); err != nil { + return err + } + m.writeSep(out) + if m.Indent != "" { + out.write(indent) + out.write(m.Indent) + out.write(`"value": `) + } else { + out.write(`"value":`) + } + if err := m.marshalObject(out, msg, indent+m.Indent, ""); err != nil { + return err + } + if m.Indent != "" { + out.write("\n") + out.write(indent) + } + out.write("}") + return out.err + } + + return m.marshalObject(out, msg, indent, turl) +} + +func (m *Marshaler) marshalTypeURL(out *errWriter, indent, typeURL string) error { + if m.Indent != "" { + out.write(indent) + out.write(m.Indent) + } + out.write(`"@type":`) + if m.Indent != "" { + out.write(" ") + } + b, err := json.Marshal(typeURL) + if err != nil { + return err + } + out.write(string(b)) + return out.err +} + +// marshalField writes field description and value to the Writer. +func (m *Marshaler) marshalField(out *errWriter, prop *proto.Properties, v reflect.Value, indent string) error { + if m.Indent != "" { + out.write(indent) + out.write(m.Indent) + } + out.write(`"`) + out.write(prop.JSONName) + out.write(`":`) + if m.Indent != "" { + out.write(" ") + } + if err := m.marshalValue(out, prop, v, indent); err != nil { + return err + } + return nil +} + +// marshalValue writes the value to the Writer. +func (m *Marshaler) marshalValue(out *errWriter, prop *proto.Properties, v reflect.Value, indent string) error { + var err error + v = reflect.Indirect(v) + + // Handle nil pointer + if v.Kind() == reflect.Invalid { + out.write("null") + return out.err + } + + // Handle repeated elements. + if v.Kind() == reflect.Slice && v.Type().Elem().Kind() != reflect.Uint8 { + out.write("[") + comma := "" + for i := 0; i < v.Len(); i++ { + sliceVal := v.Index(i) + out.write(comma) + if m.Indent != "" { + out.write("\n") + out.write(indent) + out.write(m.Indent) + out.write(m.Indent) + } + if err := m.marshalValue(out, prop, sliceVal, indent+m.Indent); err != nil { + return err + } + comma = "," + } + if m.Indent != "" { + out.write("\n") + out.write(indent) + out.write(m.Indent) + } + out.write("]") + return out.err + } + + // Handle well-known types. + // Most are handled up in marshalObject (because 99% are messages). + if wkt, ok := v.Interface().(wkt); ok { + switch wkt.XXX_WellKnownType() { + case "NullValue": + out.write("null") + return out.err + } + } + + // Handle enumerations. + if !m.EnumsAsInts && prop.Enum != "" { + // Unknown enum values will are stringified by the proto library as their + // value. Such values should _not_ be quoted or they will be interpreted + // as an enum string instead of their value. + enumStr := v.Interface().(fmt.Stringer).String() + var valStr string + if v.Kind() == reflect.Ptr { + valStr = strconv.Itoa(int(v.Elem().Int())) + } else { + valStr = strconv.Itoa(int(v.Int())) + } + isKnownEnum := enumStr != valStr + if isKnownEnum { + out.write(`"`) + } + out.write(enumStr) + if isKnownEnum { + out.write(`"`) + } + return out.err + } + + // Handle nested messages. + if v.Kind() == reflect.Struct { + return m.marshalObject(out, v.Addr().Interface().(proto.Message), indent+m.Indent, "") + } + + // Handle maps. + // Since Go randomizes map iteration, we sort keys for stable output. + if v.Kind() == reflect.Map { + out.write(`{`) + keys := v.MapKeys() + sort.Sort(mapKeys(keys)) + for i, k := range keys { + if i > 0 { + out.write(`,`) + } + if m.Indent != "" { + out.write("\n") + out.write(indent) + out.write(m.Indent) + out.write(m.Indent) + } + + b, err := json.Marshal(k.Interface()) + if err != nil { + return err + } + s := string(b) + + // If the JSON is not a string value, encode it again to make it one. + if !strings.HasPrefix(s, `"`) { + b, err := json.Marshal(s) + if err != nil { + return err + } + s = string(b) + } + + out.write(s) + out.write(`:`) + if m.Indent != "" { + out.write(` `) + } + + if err := m.marshalValue(out, prop, v.MapIndex(k), indent+m.Indent); err != nil { + return err + } + } + if m.Indent != "" { + out.write("\n") + out.write(indent) + out.write(m.Indent) + } + out.write(`}`) + return out.err + } + + // Handle non-finite floats, e.g. NaN, Infinity and -Infinity. + if v.Kind() == reflect.Float32 || v.Kind() == reflect.Float64 { + f := v.Float() + var sval string + switch { + case math.IsInf(f, 1): + sval = `"Infinity"` + case math.IsInf(f, -1): + sval = `"-Infinity"` + case math.IsNaN(f): + sval = `"NaN"` + } + if sval != "" { + out.write(sval) + return out.err + } + } + + // Default handling defers to the encoding/json library. + b, err := json.Marshal(v.Interface()) + if err != nil { + return err + } + needToQuote := string(b[0]) != `"` && (v.Kind() == reflect.Int64 || v.Kind() == reflect.Uint64) + if needToQuote { + out.write(`"`) + } + out.write(string(b)) + if needToQuote { + out.write(`"`) + } + return out.err +} + +// Unmarshaler is a configurable object for converting from a JSON +// representation to a protocol buffer object. +type Unmarshaler struct { + // Whether to allow messages to contain unknown fields, as opposed to + // failing to unmarshal. + AllowUnknownFields bool + + // A custom URL resolver to use when unmarshaling Any messages from JSON. + // If unset, the default resolution strategy is to extract the + // fully-qualified type name from the type URL and pass that to + // proto.MessageType(string). + AnyResolver AnyResolver +} + +// UnmarshalNext unmarshals the next protocol buffer from a JSON object stream. +// This function is lenient and will decode any options permutations of the +// related Marshaler. +func (u *Unmarshaler) UnmarshalNext(dec *json.Decoder, pb proto.Message) error { + inputValue := json.RawMessage{} + if err := dec.Decode(&inputValue); err != nil { + return err + } + return u.unmarshalValue(reflect.ValueOf(pb).Elem(), inputValue, nil) +} + +// Unmarshal unmarshals a JSON object stream into a protocol +// buffer. This function is lenient and will decode any options +// permutations of the related Marshaler. +func (u *Unmarshaler) Unmarshal(r io.Reader, pb proto.Message) error { + dec := json.NewDecoder(r) + return u.UnmarshalNext(dec, pb) +} + +// UnmarshalNext unmarshals the next protocol buffer from a JSON object stream. +// This function is lenient and will decode any options permutations of the +// related Marshaler. +func UnmarshalNext(dec *json.Decoder, pb proto.Message) error { + return new(Unmarshaler).UnmarshalNext(dec, pb) +} + +// Unmarshal unmarshals a JSON object stream into a protocol +// buffer. This function is lenient and will decode any options +// permutations of the related Marshaler. +func Unmarshal(r io.Reader, pb proto.Message) error { + return new(Unmarshaler).Unmarshal(r, pb) +} + +// UnmarshalString will populate the fields of a protocol buffer based +// on a JSON string. This function is lenient and will decode any options +// permutations of the related Marshaler. +func UnmarshalString(str string, pb proto.Message) error { + return new(Unmarshaler).Unmarshal(strings.NewReader(str), pb) +} + +// unmarshalValue converts/copies a value into the target. +// prop may be nil. +func (u *Unmarshaler) unmarshalValue(target reflect.Value, inputValue json.RawMessage, prop *proto.Properties) error { + targetType := target.Type() + + // Allocate memory for pointer fields. + if targetType.Kind() == reflect.Ptr { + // If input value is "null" and target is a pointer type, then the field should be treated as not set + // UNLESS the target is structpb.Value, in which case it should be set to structpb.NullValue. + _, isJSONPBUnmarshaler := target.Interface().(JSONPBUnmarshaler) + if string(inputValue) == "null" && targetType != reflect.TypeOf(&stpb.Value{}) && !isJSONPBUnmarshaler { + return nil + } + target.Set(reflect.New(targetType.Elem())) + + return u.unmarshalValue(target.Elem(), inputValue, prop) + } + + if jsu, ok := target.Addr().Interface().(JSONPBUnmarshaler); ok { + return jsu.UnmarshalJSONPB(u, []byte(inputValue)) + } + + // Handle well-known types that are not pointers. + if w, ok := target.Addr().Interface().(wkt); ok { + switch w.XXX_WellKnownType() { + case "DoubleValue", "FloatValue", "Int64Value", "UInt64Value", + "Int32Value", "UInt32Value", "BoolValue", "StringValue", "BytesValue": + return u.unmarshalValue(target.Field(0), inputValue, prop) + case "Any": + // Use json.RawMessage pointer type instead of value to support pre-1.8 version. + // 1.8 changed RawMessage.MarshalJSON from pointer type to value type, see + // https://github.com/golang/go/issues/14493 + var jsonFields map[string]*json.RawMessage + if err := json.Unmarshal(inputValue, &jsonFields); err != nil { + return err + } + + val, ok := jsonFields["@type"] + if !ok || val == nil { + return errors.New("Any JSON doesn't have '@type'") + } + + var turl string + if err := json.Unmarshal([]byte(*val), &turl); err != nil { + return fmt.Errorf("can't unmarshal Any's '@type': %q", *val) + } + target.Field(0).SetString(turl) + + var m proto.Message + var err error + if u.AnyResolver != nil { + m, err = u.AnyResolver.Resolve(turl) + } else { + m, err = defaultResolveAny(turl) + } + if err != nil { + return err + } + + if _, ok := m.(wkt); ok { + val, ok := jsonFields["value"] + if !ok { + return errors.New("Any JSON doesn't have 'value'") + } + + if err := u.unmarshalValue(reflect.ValueOf(m).Elem(), *val, nil); err != nil { + return fmt.Errorf("can't unmarshal Any nested proto %T: %v", m, err) + } + } else { + delete(jsonFields, "@type") + nestedProto, err := json.Marshal(jsonFields) + if err != nil { + return fmt.Errorf("can't generate JSON for Any's nested proto to be unmarshaled: %v", err) + } + + if err = u.unmarshalValue(reflect.ValueOf(m).Elem(), nestedProto, nil); err != nil { + return fmt.Errorf("can't unmarshal Any nested proto %T: %v", m, err) + } + } + + b, err := proto.Marshal(m) + if err != nil { + return fmt.Errorf("can't marshal proto %T into Any.Value: %v", m, err) + } + target.Field(1).SetBytes(b) + + return nil + case "Duration": + unq, err := strconv.Unquote(string(inputValue)) + if err != nil { + return err + } + + d, err := time.ParseDuration(unq) + if err != nil { + return fmt.Errorf("bad Duration: %v", err) + } + + ns := d.Nanoseconds() + s := ns / 1e9 + ns %= 1e9 + target.Field(0).SetInt(s) + target.Field(1).SetInt(ns) + return nil + case "Timestamp": + unq, err := strconv.Unquote(string(inputValue)) + if err != nil { + return err + } + + t, err := time.Parse(time.RFC3339Nano, unq) + if err != nil { + return fmt.Errorf("bad Timestamp: %v", err) + } + + target.Field(0).SetInt(t.Unix()) + target.Field(1).SetInt(int64(t.Nanosecond())) + return nil + case "Struct": + var m map[string]json.RawMessage + if err := json.Unmarshal(inputValue, &m); err != nil { + return fmt.Errorf("bad StructValue: %v", err) + } + + target.Field(0).Set(reflect.ValueOf(map[string]*stpb.Value{})) + for k, jv := range m { + pv := &stpb.Value{} + if err := u.unmarshalValue(reflect.ValueOf(pv).Elem(), jv, prop); err != nil { + return fmt.Errorf("bad value in StructValue for key %q: %v", k, err) + } + target.Field(0).SetMapIndex(reflect.ValueOf(k), reflect.ValueOf(pv)) + } + return nil + case "ListValue": + var s []json.RawMessage + if err := json.Unmarshal(inputValue, &s); err != nil { + return fmt.Errorf("bad ListValue: %v", err) + } + + target.Field(0).Set(reflect.ValueOf(make([]*stpb.Value, len(s), len(s)))) + for i, sv := range s { + if err := u.unmarshalValue(target.Field(0).Index(i), sv, prop); err != nil { + return err + } + } + return nil + case "Value": + ivStr := string(inputValue) + if ivStr == "null" { + target.Field(0).Set(reflect.ValueOf(&stpb.Value_NullValue{})) + } else if v, err := strconv.ParseFloat(ivStr, 0); err == nil { + target.Field(0).Set(reflect.ValueOf(&stpb.Value_NumberValue{v})) + } else if v, err := strconv.Unquote(ivStr); err == nil { + target.Field(0).Set(reflect.ValueOf(&stpb.Value_StringValue{v})) + } else if v, err := strconv.ParseBool(ivStr); err == nil { + target.Field(0).Set(reflect.ValueOf(&stpb.Value_BoolValue{v})) + } else if err := json.Unmarshal(inputValue, &[]json.RawMessage{}); err == nil { + lv := &stpb.ListValue{} + target.Field(0).Set(reflect.ValueOf(&stpb.Value_ListValue{lv})) + return u.unmarshalValue(reflect.ValueOf(lv).Elem(), inputValue, prop) + } else if err := json.Unmarshal(inputValue, &map[string]json.RawMessage{}); err == nil { + sv := &stpb.Struct{} + target.Field(0).Set(reflect.ValueOf(&stpb.Value_StructValue{sv})) + return u.unmarshalValue(reflect.ValueOf(sv).Elem(), inputValue, prop) + } else { + return fmt.Errorf("unrecognized type for Value %q", ivStr) + } + return nil + } + } + + // Handle enums, which have an underlying type of int32, + // and may appear as strings. + // The case of an enum appearing as a number is handled + // at the bottom of this function. + if inputValue[0] == '"' && prop != nil && prop.Enum != "" { + vmap := proto.EnumValueMap(prop.Enum) + // Don't need to do unquoting; valid enum names + // are from a limited character set. + s := inputValue[1 : len(inputValue)-1] + n, ok := vmap[string(s)] + if !ok { + return fmt.Errorf("unknown value %q for enum %s", s, prop.Enum) + } + if target.Kind() == reflect.Ptr { // proto2 + target.Set(reflect.New(targetType.Elem())) + target = target.Elem() + } + target.SetInt(int64(n)) + return nil + } + + // Handle nested messages. + if targetType.Kind() == reflect.Struct { + var jsonFields map[string]json.RawMessage + if err := json.Unmarshal(inputValue, &jsonFields); err != nil { + return err + } + + consumeField := func(prop *proto.Properties) (json.RawMessage, bool) { + // Be liberal in what names we accept; both orig_name and camelName are okay. + fieldNames := acceptedJSONFieldNames(prop) + + vOrig, okOrig := jsonFields[fieldNames.orig] + vCamel, okCamel := jsonFields[fieldNames.camel] + if !okOrig && !okCamel { + return nil, false + } + // If, for some reason, both are present in the data, favour the camelName. + var raw json.RawMessage + if okOrig { + raw = vOrig + delete(jsonFields, fieldNames.orig) + } + if okCamel { + raw = vCamel + delete(jsonFields, fieldNames.camel) + } + return raw, true + } + + sprops := proto.GetProperties(targetType) + for i := 0; i < target.NumField(); i++ { + ft := target.Type().Field(i) + if strings.HasPrefix(ft.Name, "XXX_") { + continue + } + + valueForField, ok := consumeField(sprops.Prop[i]) + if !ok { + continue + } + + if err := u.unmarshalValue(target.Field(i), valueForField, sprops.Prop[i]); err != nil { + return err + } + } + // Check for any oneof fields. + if len(jsonFields) > 0 { + for _, oop := range sprops.OneofTypes { + raw, ok := consumeField(oop.Prop) + if !ok { + continue + } + nv := reflect.New(oop.Type.Elem()) + target.Field(oop.Field).Set(nv) + if err := u.unmarshalValue(nv.Elem().Field(0), raw, oop.Prop); err != nil { + return err + } + } + } + // Handle proto2 extensions. + if len(jsonFields) > 0 { + if ep, ok := target.Addr().Interface().(proto.Message); ok { + for _, ext := range proto.RegisteredExtensions(ep) { + name := fmt.Sprintf("[%s]", ext.Name) + raw, ok := jsonFields[name] + if !ok { + continue + } + delete(jsonFields, name) + nv := reflect.New(reflect.TypeOf(ext.ExtensionType).Elem()) + if err := u.unmarshalValue(nv.Elem(), raw, nil); err != nil { + return err + } + if err := proto.SetExtension(ep, ext, nv.Interface()); err != nil { + return err + } + } + } + } + if !u.AllowUnknownFields && len(jsonFields) > 0 { + // Pick any field to be the scapegoat. + var f string + for fname := range jsonFields { + f = fname + break + } + return fmt.Errorf("unknown field %q in %v", f, targetType) + } + return nil + } + + // Handle arrays (which aren't encoded bytes) + if targetType.Kind() == reflect.Slice && targetType.Elem().Kind() != reflect.Uint8 { + var slc []json.RawMessage + if err := json.Unmarshal(inputValue, &slc); err != nil { + return err + } + if slc != nil { + l := len(slc) + target.Set(reflect.MakeSlice(targetType, l, l)) + for i := 0; i < l; i++ { + if err := u.unmarshalValue(target.Index(i), slc[i], prop); err != nil { + return err + } + } + } + return nil + } + + // Handle maps (whose keys are always strings) + if targetType.Kind() == reflect.Map { + var mp map[string]json.RawMessage + if err := json.Unmarshal(inputValue, &mp); err != nil { + return err + } + if mp != nil { + target.Set(reflect.MakeMap(targetType)) + var keyprop, valprop *proto.Properties + if prop != nil { + // These could still be nil if the protobuf metadata is broken somehow. + // TODO: This won't work because the fields are unexported. + // We should probably just reparse them. + //keyprop, valprop = prop.mkeyprop, prop.mvalprop + } + for ks, raw := range mp { + // Unmarshal map key. The core json library already decoded the key into a + // string, so we handle that specially. Other types were quoted post-serialization. + var k reflect.Value + if targetType.Key().Kind() == reflect.String { + k = reflect.ValueOf(ks) + } else { + k = reflect.New(targetType.Key()).Elem() + if err := u.unmarshalValue(k, json.RawMessage(ks), keyprop); err != nil { + return err + } + } + + // Unmarshal map value. + v := reflect.New(targetType.Elem()).Elem() + if err := u.unmarshalValue(v, raw, valprop); err != nil { + return err + } + target.SetMapIndex(k, v) + } + } + return nil + } + + // 64-bit integers can be encoded as strings. In this case we drop + // the quotes and proceed as normal. + isNum := targetType.Kind() == reflect.Int64 || targetType.Kind() == reflect.Uint64 + if isNum && strings.HasPrefix(string(inputValue), `"`) { + inputValue = inputValue[1 : len(inputValue)-1] + } + + // Non-finite numbers can be encoded as strings. + isFloat := targetType.Kind() == reflect.Float32 || targetType.Kind() == reflect.Float64 + if isFloat { + if num, ok := nonFinite[string(inputValue)]; ok { + target.SetFloat(num) + return nil + } + } + + // Use the encoding/json for parsing other value types. + return json.Unmarshal(inputValue, target.Addr().Interface()) +} + +// jsonProperties returns parsed proto.Properties for the field and corrects JSONName attribute. +func jsonProperties(f reflect.StructField, origName bool) *proto.Properties { + var prop proto.Properties + prop.Init(f.Type, f.Name, f.Tag.Get("protobuf"), &f) + if origName || prop.JSONName == "" { + prop.JSONName = prop.OrigName + } + return &prop +} + +type fieldNames struct { + orig, camel string +} + +func acceptedJSONFieldNames(prop *proto.Properties) fieldNames { + opts := fieldNames{orig: prop.OrigName, camel: prop.OrigName} + if prop.JSONName != "" { + opts.camel = prop.JSONName + } + return opts +} + +// Writer wrapper inspired by https://blog.golang.org/errors-are-values +type errWriter struct { + writer io.Writer + err error +} + +func (w *errWriter) write(str string) { + if w.err != nil { + return + } + _, w.err = w.writer.Write([]byte(str)) +} + +// Map fields may have key types of non-float scalars, strings and enums. +// The easiest way to sort them in some deterministic order is to use fmt. +// If this turns out to be inefficient we can always consider other options, +// such as doing a Schwartzian transform. +// +// Numeric keys are sorted in numeric order per +// https://developers.google.com/protocol-buffers/docs/proto#maps. +type mapKeys []reflect.Value + +func (s mapKeys) Len() int { return len(s) } +func (s mapKeys) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s mapKeys) Less(i, j int) bool { + if k := s[i].Kind(); k == s[j].Kind() { + switch k { + case reflect.Int32, reflect.Int64: + return s[i].Int() < s[j].Int() + case reflect.Uint32, reflect.Uint64: + return s[i].Uint() < s[j].Uint() + } + } + return fmt.Sprint(s[i].Interface()) < fmt.Sprint(s[j].Interface()) +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test.go new file mode 100644 index 0000000..2428d05 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test.go @@ -0,0 +1,896 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2015 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package jsonpb + +import ( + "bytes" + "encoding/json" + "io" + "math" + "reflect" + "strings" + "testing" + + "github.com/golang/protobuf/proto" + + pb "github.com/golang/protobuf/jsonpb/jsonpb_test_proto" + proto3pb "github.com/golang/protobuf/proto/proto3_proto" + "github.com/golang/protobuf/ptypes" + anypb "github.com/golang/protobuf/ptypes/any" + durpb "github.com/golang/protobuf/ptypes/duration" + stpb "github.com/golang/protobuf/ptypes/struct" + tspb "github.com/golang/protobuf/ptypes/timestamp" + wpb "github.com/golang/protobuf/ptypes/wrappers" +) + +var ( + marshaler = Marshaler{} + + marshalerAllOptions = Marshaler{ + Indent: " ", + } + + simpleObject = &pb.Simple{ + OInt32: proto.Int32(-32), + OInt64: proto.Int64(-6400000000), + OUint32: proto.Uint32(32), + OUint64: proto.Uint64(6400000000), + OSint32: proto.Int32(-13), + OSint64: proto.Int64(-2600000000), + OFloat: proto.Float32(3.14), + ODouble: proto.Float64(6.02214179e23), + OBool: proto.Bool(true), + OString: proto.String("hello \"there\""), + OBytes: []byte("beep boop"), + } + + simpleObjectJSON = `{` + + `"oBool":true,` + + `"oInt32":-32,` + + `"oInt64":"-6400000000",` + + `"oUint32":32,` + + `"oUint64":"6400000000",` + + `"oSint32":-13,` + + `"oSint64":"-2600000000",` + + `"oFloat":3.14,` + + `"oDouble":6.02214179e+23,` + + `"oString":"hello \"there\"",` + + `"oBytes":"YmVlcCBib29w"` + + `}` + + simpleObjectPrettyJSON = `{ + "oBool": true, + "oInt32": -32, + "oInt64": "-6400000000", + "oUint32": 32, + "oUint64": "6400000000", + "oSint32": -13, + "oSint64": "-2600000000", + "oFloat": 3.14, + "oDouble": 6.02214179e+23, + "oString": "hello \"there\"", + "oBytes": "YmVlcCBib29w" +}` + + repeatsObject = &pb.Repeats{ + RBool: []bool{true, false, true}, + RInt32: []int32{-3, -4, -5}, + RInt64: []int64{-123456789, -987654321}, + RUint32: []uint32{1, 2, 3}, + RUint64: []uint64{6789012345, 3456789012}, + RSint32: []int32{-1, -2, -3}, + RSint64: []int64{-6789012345, -3456789012}, + RFloat: []float32{3.14, 6.28}, + RDouble: []float64{299792458 * 1e20, 6.62606957e-34}, + RString: []string{"happy", "days"}, + RBytes: [][]byte{[]byte("skittles"), []byte("m&m's")}, + } + + repeatsObjectJSON = `{` + + `"rBool":[true,false,true],` + + `"rInt32":[-3,-4,-5],` + + `"rInt64":["-123456789","-987654321"],` + + `"rUint32":[1,2,3],` + + `"rUint64":["6789012345","3456789012"],` + + `"rSint32":[-1,-2,-3],` + + `"rSint64":["-6789012345","-3456789012"],` + + `"rFloat":[3.14,6.28],` + + `"rDouble":[2.99792458e+28,6.62606957e-34],` + + `"rString":["happy","days"],` + + `"rBytes":["c2tpdHRsZXM=","bSZtJ3M="]` + + `}` + + repeatsObjectPrettyJSON = `{ + "rBool": [ + true, + false, + true + ], + "rInt32": [ + -3, + -4, + -5 + ], + "rInt64": [ + "-123456789", + "-987654321" + ], + "rUint32": [ + 1, + 2, + 3 + ], + "rUint64": [ + "6789012345", + "3456789012" + ], + "rSint32": [ + -1, + -2, + -3 + ], + "rSint64": [ + "-6789012345", + "-3456789012" + ], + "rFloat": [ + 3.14, + 6.28 + ], + "rDouble": [ + 2.99792458e+28, + 6.62606957e-34 + ], + "rString": [ + "happy", + "days" + ], + "rBytes": [ + "c2tpdHRsZXM=", + "bSZtJ3M=" + ] +}` + + innerSimple = &pb.Simple{OInt32: proto.Int32(-32)} + innerSimple2 = &pb.Simple{OInt64: proto.Int64(25)} + innerRepeats = &pb.Repeats{RString: []string{"roses", "red"}} + innerRepeats2 = &pb.Repeats{RString: []string{"violets", "blue"}} + complexObject = &pb.Widget{ + Color: pb.Widget_GREEN.Enum(), + RColor: []pb.Widget_Color{pb.Widget_RED, pb.Widget_GREEN, pb.Widget_BLUE}, + Simple: innerSimple, + RSimple: []*pb.Simple{innerSimple, innerSimple2}, + Repeats: innerRepeats, + RRepeats: []*pb.Repeats{innerRepeats, innerRepeats2}, + } + + complexObjectJSON = `{"color":"GREEN",` + + `"rColor":["RED","GREEN","BLUE"],` + + `"simple":{"oInt32":-32},` + + `"rSimple":[{"oInt32":-32},{"oInt64":"25"}],` + + `"repeats":{"rString":["roses","red"]},` + + `"rRepeats":[{"rString":["roses","red"]},{"rString":["violets","blue"]}]` + + `}` + + complexObjectPrettyJSON = `{ + "color": "GREEN", + "rColor": [ + "RED", + "GREEN", + "BLUE" + ], + "simple": { + "oInt32": -32 + }, + "rSimple": [ + { + "oInt32": -32 + }, + { + "oInt64": "25" + } + ], + "repeats": { + "rString": [ + "roses", + "red" + ] + }, + "rRepeats": [ + { + "rString": [ + "roses", + "red" + ] + }, + { + "rString": [ + "violets", + "blue" + ] + } + ] +}` + + colorPrettyJSON = `{ + "color": 2 +}` + + colorListPrettyJSON = `{ + "color": 1000, + "rColor": [ + "RED" + ] +}` + + nummyPrettyJSON = `{ + "nummy": { + "1": 2, + "3": 4 + } +}` + + objjyPrettyJSON = `{ + "objjy": { + "1": { + "dub": 1 + } + } +}` + realNumber = &pb.Real{Value: proto.Float64(3.14159265359)} + realNumberName = "Pi" + complexNumber = &pb.Complex{Imaginary: proto.Float64(0.5772156649)} + realNumberJSON = `{` + + `"value":3.14159265359,` + + `"[jsonpb.Complex.real_extension]":{"imaginary":0.5772156649},` + + `"[jsonpb.name]":"Pi"` + + `}` + + anySimple = &pb.KnownTypes{ + An: &anypb.Any{ + TypeUrl: "something.example.com/jsonpb.Simple", + Value: []byte{ + // &pb.Simple{OBool:true} + 1 << 3, 1, + }, + }, + } + anySimpleJSON = `{"an":{"@type":"something.example.com/jsonpb.Simple","oBool":true}}` + anySimplePrettyJSON = `{ + "an": { + "@type": "something.example.com/jsonpb.Simple", + "oBool": true + } +}` + + anyWellKnown = &pb.KnownTypes{ + An: &anypb.Any{ + TypeUrl: "type.googleapis.com/google.protobuf.Duration", + Value: []byte{ + // &durpb.Duration{Seconds: 1, Nanos: 212000000 } + 1 << 3, 1, // seconds + 2 << 3, 0x80, 0xba, 0x8b, 0x65, // nanos + }, + }, + } + anyWellKnownJSON = `{"an":{"@type":"type.googleapis.com/google.protobuf.Duration","value":"1.212s"}}` + anyWellKnownPrettyJSON = `{ + "an": { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } +}` + + nonFinites = &pb.NonFinites{ + FNan: proto.Float32(float32(math.NaN())), + FPinf: proto.Float32(float32(math.Inf(1))), + FNinf: proto.Float32(float32(math.Inf(-1))), + DNan: proto.Float64(float64(math.NaN())), + DPinf: proto.Float64(float64(math.Inf(1))), + DNinf: proto.Float64(float64(math.Inf(-1))), + } + nonFinitesJSON = `{` + + `"fNan":"NaN",` + + `"fPinf":"Infinity",` + + `"fNinf":"-Infinity",` + + `"dNan":"NaN",` + + `"dPinf":"Infinity",` + + `"dNinf":"-Infinity"` + + `}` +) + +func init() { + if err := proto.SetExtension(realNumber, pb.E_Name, &realNumberName); err != nil { + panic(err) + } + if err := proto.SetExtension(realNumber, pb.E_Complex_RealExtension, complexNumber); err != nil { + panic(err) + } +} + +var marshalingTests = []struct { + desc string + marshaler Marshaler + pb proto.Message + json string +}{ + {"simple flat object", marshaler, simpleObject, simpleObjectJSON}, + {"simple pretty object", marshalerAllOptions, simpleObject, simpleObjectPrettyJSON}, + {"non-finite floats fields object", marshaler, nonFinites, nonFinitesJSON}, + {"repeated fields flat object", marshaler, repeatsObject, repeatsObjectJSON}, + {"repeated fields pretty object", marshalerAllOptions, repeatsObject, repeatsObjectPrettyJSON}, + {"nested message/enum flat object", marshaler, complexObject, complexObjectJSON}, + {"nested message/enum pretty object", marshalerAllOptions, complexObject, complexObjectPrettyJSON}, + {"enum-string flat object", Marshaler{}, + &pb.Widget{Color: pb.Widget_BLUE.Enum()}, `{"color":"BLUE"}`}, + {"enum-value pretty object", Marshaler{EnumsAsInts: true, Indent: " "}, + &pb.Widget{Color: pb.Widget_BLUE.Enum()}, colorPrettyJSON}, + {"unknown enum value object", marshalerAllOptions, + &pb.Widget{Color: pb.Widget_Color(1000).Enum(), RColor: []pb.Widget_Color{pb.Widget_RED}}, colorListPrettyJSON}, + {"repeated proto3 enum", Marshaler{}, + &proto3pb.Message{RFunny: []proto3pb.Message_Humour{ + proto3pb.Message_PUNS, + proto3pb.Message_SLAPSTICK, + }}, + `{"rFunny":["PUNS","SLAPSTICK"]}`}, + {"repeated proto3 enum as int", Marshaler{EnumsAsInts: true}, + &proto3pb.Message{RFunny: []proto3pb.Message_Humour{ + proto3pb.Message_PUNS, + proto3pb.Message_SLAPSTICK, + }}, + `{"rFunny":[1,2]}`}, + {"empty value", marshaler, &pb.Simple3{}, `{}`}, + {"empty value emitted", Marshaler{EmitDefaults: true}, &pb.Simple3{}, `{"dub":0}`}, + {"empty repeated emitted", Marshaler{EmitDefaults: true}, &pb.SimpleSlice3{}, `{"slices":[]}`}, + {"empty map emitted", Marshaler{EmitDefaults: true}, &pb.SimpleMap3{}, `{"stringy":{}}`}, + {"nested struct null", Marshaler{EmitDefaults: true}, &pb.SimpleNull3{}, `{"simple":null}`}, + {"map", marshaler, &pb.Mappy{Nummy: map[int64]int32{1: 2, 3: 4}}, `{"nummy":{"1":2,"3":4}}`}, + {"map", marshalerAllOptions, &pb.Mappy{Nummy: map[int64]int32{1: 2, 3: 4}}, nummyPrettyJSON}, + {"map", marshaler, + &pb.Mappy{Strry: map[string]string{`"one"`: "two", "three": "four"}}, + `{"strry":{"\"one\"":"two","three":"four"}}`}, + {"map", marshaler, + &pb.Mappy{Objjy: map[int32]*pb.Simple3{1: {Dub: 1}}}, `{"objjy":{"1":{"dub":1}}}`}, + {"map", marshalerAllOptions, + &pb.Mappy{Objjy: map[int32]*pb.Simple3{1: {Dub: 1}}}, objjyPrettyJSON}, + {"map", marshaler, &pb.Mappy{Buggy: map[int64]string{1234: "yup"}}, + `{"buggy":{"1234":"yup"}}`}, + {"map", marshaler, &pb.Mappy{Booly: map[bool]bool{false: true}}, `{"booly":{"false":true}}`}, + // TODO: This is broken. + //{"map", marshaler, &pb.Mappy{Enumy: map[string]pb.Numeral{"XIV": pb.Numeral_ROMAN}}, `{"enumy":{"XIV":"ROMAN"}`}, + {"map", Marshaler{EnumsAsInts: true}, &pb.Mappy{Enumy: map[string]pb.Numeral{"XIV": pb.Numeral_ROMAN}}, `{"enumy":{"XIV":2}}`}, + {"map", marshaler, &pb.Mappy{S32Booly: map[int32]bool{1: true, 3: false, 10: true, 12: false}}, `{"s32booly":{"1":true,"3":false,"10":true,"12":false}}`}, + {"map", marshaler, &pb.Mappy{S64Booly: map[int64]bool{1: true, 3: false, 10: true, 12: false}}, `{"s64booly":{"1":true,"3":false,"10":true,"12":false}}`}, + {"map", marshaler, &pb.Mappy{U32Booly: map[uint32]bool{1: true, 3: false, 10: true, 12: false}}, `{"u32booly":{"1":true,"3":false,"10":true,"12":false}}`}, + {"map", marshaler, &pb.Mappy{U64Booly: map[uint64]bool{1: true, 3: false, 10: true, 12: false}}, `{"u64booly":{"1":true,"3":false,"10":true,"12":false}}`}, + {"proto2 map", marshaler, &pb.Maps{MInt64Str: map[int64]string{213: "cat"}}, + `{"mInt64Str":{"213":"cat"}}`}, + {"proto2 map", marshaler, + &pb.Maps{MBoolSimple: map[bool]*pb.Simple{true: {OInt32: proto.Int32(1)}}}, + `{"mBoolSimple":{"true":{"oInt32":1}}}`}, + {"oneof, not set", marshaler, &pb.MsgWithOneof{}, `{}`}, + {"oneof, set", marshaler, &pb.MsgWithOneof{Union: &pb.MsgWithOneof_Title{"Grand Poobah"}}, `{"title":"Grand Poobah"}`}, + {"force orig_name", Marshaler{OrigName: true}, &pb.Simple{OInt32: proto.Int32(4)}, + `{"o_int32":4}`}, + {"proto2 extension", marshaler, realNumber, realNumberJSON}, + {"Any with message", marshaler, anySimple, anySimpleJSON}, + {"Any with message and indent", marshalerAllOptions, anySimple, anySimplePrettyJSON}, + {"Any with WKT", marshaler, anyWellKnown, anyWellKnownJSON}, + {"Any with WKT and indent", marshalerAllOptions, anyWellKnown, anyWellKnownPrettyJSON}, + {"Duration", marshaler, &pb.KnownTypes{Dur: &durpb.Duration{Seconds: 3}}, `{"dur":"3.000s"}`}, + {"Struct", marshaler, &pb.KnownTypes{St: &stpb.Struct{ + Fields: map[string]*stpb.Value{ + "one": {Kind: &stpb.Value_StringValue{"loneliest number"}}, + "two": {Kind: &stpb.Value_NullValue{stpb.NullValue_NULL_VALUE}}, + }, + }}, `{"st":{"one":"loneliest number","two":null}}`}, + {"empty ListValue", marshaler, &pb.KnownTypes{Lv: &stpb.ListValue{}}, `{"lv":[]}`}, + {"basic ListValue", marshaler, &pb.KnownTypes{Lv: &stpb.ListValue{Values: []*stpb.Value{ + {Kind: &stpb.Value_StringValue{"x"}}, + {Kind: &stpb.Value_NullValue{}}, + {Kind: &stpb.Value_NumberValue{3}}, + {Kind: &stpb.Value_BoolValue{true}}, + }}}, `{"lv":["x",null,3,true]}`}, + {"Timestamp", marshaler, &pb.KnownTypes{Ts: &tspb.Timestamp{Seconds: 14e8, Nanos: 21e6}}, `{"ts":"2014-05-13T16:53:20.021Z"}`}, + {"number Value", marshaler, &pb.KnownTypes{Val: &stpb.Value{Kind: &stpb.Value_NumberValue{1}}}, `{"val":1}`}, + {"null Value", marshaler, &pb.KnownTypes{Val: &stpb.Value{Kind: &stpb.Value_NullValue{stpb.NullValue_NULL_VALUE}}}, `{"val":null}`}, + {"string number value", marshaler, &pb.KnownTypes{Val: &stpb.Value{Kind: &stpb.Value_StringValue{"9223372036854775807"}}}, `{"val":"9223372036854775807"}`}, + {"list of lists Value", marshaler, &pb.KnownTypes{Val: &stpb.Value{ + Kind: &stpb.Value_ListValue{&stpb.ListValue{ + Values: []*stpb.Value{ + {Kind: &stpb.Value_StringValue{"x"}}, + {Kind: &stpb.Value_ListValue{&stpb.ListValue{ + Values: []*stpb.Value{ + {Kind: &stpb.Value_ListValue{&stpb.ListValue{ + Values: []*stpb.Value{{Kind: &stpb.Value_StringValue{"y"}}}, + }}}, + {Kind: &stpb.Value_StringValue{"z"}}, + }, + }}}, + }, + }}, + }}, `{"val":["x",[["y"],"z"]]}`}, + + {"DoubleValue", marshaler, &pb.KnownTypes{Dbl: &wpb.DoubleValue{Value: 1.2}}, `{"dbl":1.2}`}, + {"FloatValue", marshaler, &pb.KnownTypes{Flt: &wpb.FloatValue{Value: 1.2}}, `{"flt":1.2}`}, + {"Int64Value", marshaler, &pb.KnownTypes{I64: &wpb.Int64Value{Value: -3}}, `{"i64":"-3"}`}, + {"UInt64Value", marshaler, &pb.KnownTypes{U64: &wpb.UInt64Value{Value: 3}}, `{"u64":"3"}`}, + {"Int32Value", marshaler, &pb.KnownTypes{I32: &wpb.Int32Value{Value: -4}}, `{"i32":-4}`}, + {"UInt32Value", marshaler, &pb.KnownTypes{U32: &wpb.UInt32Value{Value: 4}}, `{"u32":4}`}, + {"BoolValue", marshaler, &pb.KnownTypes{Bool: &wpb.BoolValue{Value: true}}, `{"bool":true}`}, + {"StringValue", marshaler, &pb.KnownTypes{Str: &wpb.StringValue{Value: "plush"}}, `{"str":"plush"}`}, + {"BytesValue", marshaler, &pb.KnownTypes{Bytes: &wpb.BytesValue{Value: []byte("wow")}}, `{"bytes":"d293"}`}, +} + +func TestMarshaling(t *testing.T) { + for _, tt := range marshalingTests { + json, err := tt.marshaler.MarshalToString(tt.pb) + if err != nil { + t.Errorf("%s: marshaling error: %v", tt.desc, err) + } else if tt.json != json { + t.Errorf("%s: got [%v] want [%v]", tt.desc, json, tt.json) + } + } +} + +func TestMarshalJSONPBMarshaler(t *testing.T) { + rawJson := `{ "foo": "bar", "baz": [0, 1, 2, 3] }` + msg := dynamicMessage{rawJson: rawJson} + str, err := new(Marshaler).MarshalToString(&msg) + if err != nil { + t.Errorf("an unexpected error occurred when marshalling JSONPBMarshaler: %v", err) + } + if str != rawJson { + t.Errorf("marshalling JSON produced incorrect output: got %s, wanted %s", str, rawJson) + } +} + +func TestMarshalAnyJSONPBMarshaler(t *testing.T) { + msg := dynamicMessage{rawJson: `{ "foo": "bar", "baz": [0, 1, 2, 3] }`} + a, err := ptypes.MarshalAny(&msg) + if err != nil { + t.Errorf("an unexpected error occurred when marshalling to Any: %v", err) + } + str, err := new(Marshaler).MarshalToString(a) + if err != nil { + t.Errorf("an unexpected error occurred when marshalling Any to JSON: %v", err) + } + // after custom marshaling, it's round-tripped through JSON decoding/encoding already, + // so the keys are sorted, whitespace is compacted, and "@type" key has been added + expected := `{"@type":"type.googleapis.com/` + dynamicMessageName + `","baz":[0,1,2,3],"foo":"bar"}` + if str != expected { + t.Errorf("marshalling JSON produced incorrect output: got %s, wanted %s", str, expected) + } +} + +var unmarshalingTests = []struct { + desc string + unmarshaler Unmarshaler + json string + pb proto.Message +}{ + {"simple flat object", Unmarshaler{}, simpleObjectJSON, simpleObject}, + {"simple pretty object", Unmarshaler{}, simpleObjectPrettyJSON, simpleObject}, + {"repeated fields flat object", Unmarshaler{}, repeatsObjectJSON, repeatsObject}, + {"repeated fields pretty object", Unmarshaler{}, repeatsObjectPrettyJSON, repeatsObject}, + {"nested message/enum flat object", Unmarshaler{}, complexObjectJSON, complexObject}, + {"nested message/enum pretty object", Unmarshaler{}, complexObjectPrettyJSON, complexObject}, + {"enum-string object", Unmarshaler{}, `{"color":"BLUE"}`, &pb.Widget{Color: pb.Widget_BLUE.Enum()}}, + {"enum-value object", Unmarshaler{}, "{\n \"color\": 2\n}", &pb.Widget{Color: pb.Widget_BLUE.Enum()}}, + {"unknown field with allowed option", Unmarshaler{AllowUnknownFields: true}, `{"unknown": "foo"}`, new(pb.Simple)}, + {"proto3 enum string", Unmarshaler{}, `{"hilarity":"PUNS"}`, &proto3pb.Message{Hilarity: proto3pb.Message_PUNS}}, + {"proto3 enum value", Unmarshaler{}, `{"hilarity":1}`, &proto3pb.Message{Hilarity: proto3pb.Message_PUNS}}, + {"unknown enum value object", + Unmarshaler{}, + "{\n \"color\": 1000,\n \"r_color\": [\n \"RED\"\n ]\n}", + &pb.Widget{Color: pb.Widget_Color(1000).Enum(), RColor: []pb.Widget_Color{pb.Widget_RED}}}, + {"repeated proto3 enum", Unmarshaler{}, `{"rFunny":["PUNS","SLAPSTICK"]}`, + &proto3pb.Message{RFunny: []proto3pb.Message_Humour{ + proto3pb.Message_PUNS, + proto3pb.Message_SLAPSTICK, + }}}, + {"repeated proto3 enum as int", Unmarshaler{}, `{"rFunny":[1,2]}`, + &proto3pb.Message{RFunny: []proto3pb.Message_Humour{ + proto3pb.Message_PUNS, + proto3pb.Message_SLAPSTICK, + }}}, + {"repeated proto3 enum as mix of strings and ints", Unmarshaler{}, `{"rFunny":["PUNS",2]}`, + &proto3pb.Message{RFunny: []proto3pb.Message_Humour{ + proto3pb.Message_PUNS, + proto3pb.Message_SLAPSTICK, + }}}, + {"unquoted int64 object", Unmarshaler{}, `{"oInt64":-314}`, &pb.Simple{OInt64: proto.Int64(-314)}}, + {"unquoted uint64 object", Unmarshaler{}, `{"oUint64":123}`, &pb.Simple{OUint64: proto.Uint64(123)}}, + {"NaN", Unmarshaler{}, `{"oDouble":"NaN"}`, &pb.Simple{ODouble: proto.Float64(math.NaN())}}, + {"Inf", Unmarshaler{}, `{"oFloat":"Infinity"}`, &pb.Simple{OFloat: proto.Float32(float32(math.Inf(1)))}}, + {"-Inf", Unmarshaler{}, `{"oDouble":"-Infinity"}`, &pb.Simple{ODouble: proto.Float64(math.Inf(-1))}}, + {"map", Unmarshaler{}, `{"nummy":{"1":2,"3":4}}`, &pb.Mappy{Nummy: map[int64]int32{1: 2, 3: 4}}}, + {"map", Unmarshaler{}, `{"strry":{"\"one\"":"two","three":"four"}}`, &pb.Mappy{Strry: map[string]string{`"one"`: "two", "three": "four"}}}, + {"map", Unmarshaler{}, `{"objjy":{"1":{"dub":1}}}`, &pb.Mappy{Objjy: map[int32]*pb.Simple3{1: {Dub: 1}}}}, + {"proto2 extension", Unmarshaler{}, realNumberJSON, realNumber}, + {"Any with message", Unmarshaler{}, anySimpleJSON, anySimple}, + {"Any with message and indent", Unmarshaler{}, anySimplePrettyJSON, anySimple}, + {"Any with WKT", Unmarshaler{}, anyWellKnownJSON, anyWellKnown}, + {"Any with WKT and indent", Unmarshaler{}, anyWellKnownPrettyJSON, anyWellKnown}, + // TODO: This is broken. + //{"map", Unmarshaler{}, `{"enumy":{"XIV":"ROMAN"}`, &pb.Mappy{Enumy: map[string]pb.Numeral{"XIV": pb.Numeral_ROMAN}}}, + {"map", Unmarshaler{}, `{"enumy":{"XIV":2}}`, &pb.Mappy{Enumy: map[string]pb.Numeral{"XIV": pb.Numeral_ROMAN}}}, + {"oneof", Unmarshaler{}, `{"salary":31000}`, &pb.MsgWithOneof{Union: &pb.MsgWithOneof_Salary{31000}}}, + {"oneof spec name", Unmarshaler{}, `{"Country":"Australia"}`, &pb.MsgWithOneof{Union: &pb.MsgWithOneof_Country{"Australia"}}}, + {"oneof orig_name", Unmarshaler{}, `{"Country":"Australia"}`, &pb.MsgWithOneof{Union: &pb.MsgWithOneof_Country{"Australia"}}}, + {"oneof spec name2", Unmarshaler{}, `{"homeAddress":"Australia"}`, &pb.MsgWithOneof{Union: &pb.MsgWithOneof_HomeAddress{"Australia"}}}, + {"oneof orig_name2", Unmarshaler{}, `{"home_address":"Australia"}`, &pb.MsgWithOneof{Union: &pb.MsgWithOneof_HomeAddress{"Australia"}}}, + {"orig_name input", Unmarshaler{}, `{"o_bool":true}`, &pb.Simple{OBool: proto.Bool(true)}}, + {"camelName input", Unmarshaler{}, `{"oBool":true}`, &pb.Simple{OBool: proto.Bool(true)}}, + + {"Duration", Unmarshaler{}, `{"dur":"3.000s"}`, &pb.KnownTypes{Dur: &durpb.Duration{Seconds: 3}}}, + {"null Duration", Unmarshaler{}, `{"dur":null}`, &pb.KnownTypes{Dur: nil}}, + {"Timestamp", Unmarshaler{}, `{"ts":"2014-05-13T16:53:20.021Z"}`, &pb.KnownTypes{Ts: &tspb.Timestamp{Seconds: 14e8, Nanos: 21e6}}}, + {"PreEpochTimestamp", Unmarshaler{}, `{"ts":"1969-12-31T23:59:58.999999995Z"}`, &pb.KnownTypes{Ts: &tspb.Timestamp{Seconds: -2, Nanos: 999999995}}}, + {"ZeroTimeTimestamp", Unmarshaler{}, `{"ts":"0001-01-01T00:00:00Z"}`, &pb.KnownTypes{Ts: &tspb.Timestamp{Seconds: -62135596800, Nanos: 0}}}, + {"null Timestamp", Unmarshaler{}, `{"ts":null}`, &pb.KnownTypes{Ts: nil}}, + {"null Struct", Unmarshaler{}, `{"st": null}`, &pb.KnownTypes{St: nil}}, + {"empty Struct", Unmarshaler{}, `{"st": {}}`, &pb.KnownTypes{St: &stpb.Struct{}}}, + {"basic Struct", Unmarshaler{}, `{"st": {"a": "x", "b": null, "c": 3, "d": true}}`, &pb.KnownTypes{St: &stpb.Struct{Fields: map[string]*stpb.Value{ + "a": {Kind: &stpb.Value_StringValue{"x"}}, + "b": {Kind: &stpb.Value_NullValue{}}, + "c": {Kind: &stpb.Value_NumberValue{3}}, + "d": {Kind: &stpb.Value_BoolValue{true}}, + }}}}, + {"nested Struct", Unmarshaler{}, `{"st": {"a": {"b": 1, "c": [{"d": true}, "f"]}}}`, &pb.KnownTypes{St: &stpb.Struct{Fields: map[string]*stpb.Value{ + "a": {Kind: &stpb.Value_StructValue{&stpb.Struct{Fields: map[string]*stpb.Value{ + "b": {Kind: &stpb.Value_NumberValue{1}}, + "c": {Kind: &stpb.Value_ListValue{&stpb.ListValue{Values: []*stpb.Value{ + {Kind: &stpb.Value_StructValue{&stpb.Struct{Fields: map[string]*stpb.Value{"d": {Kind: &stpb.Value_BoolValue{true}}}}}}, + {Kind: &stpb.Value_StringValue{"f"}}, + }}}}, + }}}}, + }}}}, + {"null ListValue", Unmarshaler{}, `{"lv": null}`, &pb.KnownTypes{Lv: nil}}, + {"empty ListValue", Unmarshaler{}, `{"lv": []}`, &pb.KnownTypes{Lv: &stpb.ListValue{}}}, + {"basic ListValue", Unmarshaler{}, `{"lv": ["x", null, 3, true]}`, &pb.KnownTypes{Lv: &stpb.ListValue{Values: []*stpb.Value{ + {Kind: &stpb.Value_StringValue{"x"}}, + {Kind: &stpb.Value_NullValue{}}, + {Kind: &stpb.Value_NumberValue{3}}, + {Kind: &stpb.Value_BoolValue{true}}, + }}}}, + {"number Value", Unmarshaler{}, `{"val":1}`, &pb.KnownTypes{Val: &stpb.Value{Kind: &stpb.Value_NumberValue{1}}}}, + {"null Value", Unmarshaler{}, `{"val":null}`, &pb.KnownTypes{Val: &stpb.Value{Kind: &stpb.Value_NullValue{stpb.NullValue_NULL_VALUE}}}}, + {"bool Value", Unmarshaler{}, `{"val":true}`, &pb.KnownTypes{Val: &stpb.Value{Kind: &stpb.Value_BoolValue{true}}}}, + {"string Value", Unmarshaler{}, `{"val":"x"}`, &pb.KnownTypes{Val: &stpb.Value{Kind: &stpb.Value_StringValue{"x"}}}}, + {"string number value", Unmarshaler{}, `{"val":"9223372036854775807"}`, &pb.KnownTypes{Val: &stpb.Value{Kind: &stpb.Value_StringValue{"9223372036854775807"}}}}, + {"list of lists Value", Unmarshaler{}, `{"val":["x", [["y"], "z"]]}`, &pb.KnownTypes{Val: &stpb.Value{ + Kind: &stpb.Value_ListValue{&stpb.ListValue{ + Values: []*stpb.Value{ + {Kind: &stpb.Value_StringValue{"x"}}, + {Kind: &stpb.Value_ListValue{&stpb.ListValue{ + Values: []*stpb.Value{ + {Kind: &stpb.Value_ListValue{&stpb.ListValue{ + Values: []*stpb.Value{{Kind: &stpb.Value_StringValue{"y"}}}, + }}}, + {Kind: &stpb.Value_StringValue{"z"}}, + }, + }}}, + }, + }}}}}, + + {"DoubleValue", Unmarshaler{}, `{"dbl":1.2}`, &pb.KnownTypes{Dbl: &wpb.DoubleValue{Value: 1.2}}}, + {"FloatValue", Unmarshaler{}, `{"flt":1.2}`, &pb.KnownTypes{Flt: &wpb.FloatValue{Value: 1.2}}}, + {"Int64Value", Unmarshaler{}, `{"i64":"-3"}`, &pb.KnownTypes{I64: &wpb.Int64Value{Value: -3}}}, + {"UInt64Value", Unmarshaler{}, `{"u64":"3"}`, &pb.KnownTypes{U64: &wpb.UInt64Value{Value: 3}}}, + {"Int32Value", Unmarshaler{}, `{"i32":-4}`, &pb.KnownTypes{I32: &wpb.Int32Value{Value: -4}}}, + {"UInt32Value", Unmarshaler{}, `{"u32":4}`, &pb.KnownTypes{U32: &wpb.UInt32Value{Value: 4}}}, + {"BoolValue", Unmarshaler{}, `{"bool":true}`, &pb.KnownTypes{Bool: &wpb.BoolValue{Value: true}}}, + {"StringValue", Unmarshaler{}, `{"str":"plush"}`, &pb.KnownTypes{Str: &wpb.StringValue{Value: "plush"}}}, + {"BytesValue", Unmarshaler{}, `{"bytes":"d293"}`, &pb.KnownTypes{Bytes: &wpb.BytesValue{Value: []byte("wow")}}}, + + // Ensure that `null` as a value ends up with a nil pointer instead of a [type]Value struct. + {"null DoubleValue", Unmarshaler{}, `{"dbl":null}`, &pb.KnownTypes{Dbl: nil}}, + {"null FloatValue", Unmarshaler{}, `{"flt":null}`, &pb.KnownTypes{Flt: nil}}, + {"null Int64Value", Unmarshaler{}, `{"i64":null}`, &pb.KnownTypes{I64: nil}}, + {"null UInt64Value", Unmarshaler{}, `{"u64":null}`, &pb.KnownTypes{U64: nil}}, + {"null Int32Value", Unmarshaler{}, `{"i32":null}`, &pb.KnownTypes{I32: nil}}, + {"null UInt32Value", Unmarshaler{}, `{"u32":null}`, &pb.KnownTypes{U32: nil}}, + {"null BoolValue", Unmarshaler{}, `{"bool":null}`, &pb.KnownTypes{Bool: nil}}, + {"null StringValue", Unmarshaler{}, `{"str":null}`, &pb.KnownTypes{Str: nil}}, + {"null BytesValue", Unmarshaler{}, `{"bytes":null}`, &pb.KnownTypes{Bytes: nil}}, +} + +func TestUnmarshaling(t *testing.T) { + for _, tt := range unmarshalingTests { + // Make a new instance of the type of our expected object. + p := reflect.New(reflect.TypeOf(tt.pb).Elem()).Interface().(proto.Message) + + err := tt.unmarshaler.Unmarshal(strings.NewReader(tt.json), p) + if err != nil { + t.Errorf("%s: %v", tt.desc, err) + continue + } + + // For easier diffs, compare text strings of the protos. + exp := proto.MarshalTextString(tt.pb) + act := proto.MarshalTextString(p) + if string(exp) != string(act) { + t.Errorf("%s: got [%s] want [%s]", tt.desc, act, exp) + } + } +} + +func TestUnmarshalNullArray(t *testing.T) { + var repeats pb.Repeats + if err := UnmarshalString(`{"rBool":null}`, &repeats); err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(repeats, pb.Repeats{}) { + t.Errorf("got non-nil fields in [%#v]", repeats) + } +} + +func TestUnmarshalNullObject(t *testing.T) { + var maps pb.Maps + if err := UnmarshalString(`{"mInt64Str":null}`, &maps); err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(maps, pb.Maps{}) { + t.Errorf("got non-nil fields in [%#v]", maps) + } +} + +func TestUnmarshalNext(t *testing.T) { + // We only need to check against a few, not all of them. + tests := unmarshalingTests[:5] + + // Create a buffer with many concatenated JSON objects. + var b bytes.Buffer + for _, tt := range tests { + b.WriteString(tt.json) + } + + dec := json.NewDecoder(&b) + for _, tt := range tests { + // Make a new instance of the type of our expected object. + p := reflect.New(reflect.TypeOf(tt.pb).Elem()).Interface().(proto.Message) + + err := tt.unmarshaler.UnmarshalNext(dec, p) + if err != nil { + t.Errorf("%s: %v", tt.desc, err) + continue + } + + // For easier diffs, compare text strings of the protos. + exp := proto.MarshalTextString(tt.pb) + act := proto.MarshalTextString(p) + if string(exp) != string(act) { + t.Errorf("%s: got [%s] want [%s]", tt.desc, act, exp) + } + } + + p := &pb.Simple{} + err := new(Unmarshaler).UnmarshalNext(dec, p) + if err != io.EOF { + t.Errorf("eof: got %v, expected io.EOF", err) + } +} + +var unmarshalingShouldError = []struct { + desc string + in string + pb proto.Message +}{ + {"a value", "666", new(pb.Simple)}, + {"gibberish", "{adskja123;l23=-=", new(pb.Simple)}, + {"unknown field", `{"unknown": "foo"}`, new(pb.Simple)}, + {"unknown enum name", `{"hilarity":"DAVE"}`, new(proto3pb.Message)}, +} + +func TestUnmarshalingBadInput(t *testing.T) { + for _, tt := range unmarshalingShouldError { + err := UnmarshalString(tt.in, tt.pb) + if err == nil { + t.Errorf("an error was expected when parsing %q instead of an object", tt.desc) + } + } +} + +type funcResolver func(turl string) (proto.Message, error) + +func (fn funcResolver) Resolve(turl string) (proto.Message, error) { + return fn(turl) +} + +func TestAnyWithCustomResolver(t *testing.T) { + var resolvedTypeUrls []string + resolver := funcResolver(func(turl string) (proto.Message, error) { + resolvedTypeUrls = append(resolvedTypeUrls, turl) + return new(pb.Simple), nil + }) + msg := &pb.Simple{ + OBytes: []byte{1, 2, 3, 4}, + OBool: proto.Bool(true), + OString: proto.String("foobar"), + OInt64: proto.Int64(1020304), + } + msgBytes, err := proto.Marshal(msg) + if err != nil { + t.Errorf("an unexpected error occurred when marshaling message: %v", err) + } + // make an Any with a type URL that won't resolve w/out custom resolver + any := &anypb.Any{ + TypeUrl: "https://foobar.com/some.random.MessageKind", + Value: msgBytes, + } + + m := Marshaler{AnyResolver: resolver} + js, err := m.MarshalToString(any) + if err != nil { + t.Errorf("an unexpected error occurred when marshaling any to JSON: %v", err) + } + if len(resolvedTypeUrls) != 1 { + t.Errorf("custom resolver was not invoked during marshaling") + } else if resolvedTypeUrls[0] != "https://foobar.com/some.random.MessageKind" { + t.Errorf("custom resolver was invoked with wrong URL: got %q, wanted %q", resolvedTypeUrls[0], "https://foobar.com/some.random.MessageKind") + } + wanted := `{"@type":"https://foobar.com/some.random.MessageKind","oBool":true,"oInt64":"1020304","oString":"foobar","oBytes":"AQIDBA=="}` + if js != wanted { + t.Errorf("marshalling JSON produced incorrect output: got %s, wanted %s", js, wanted) + } + + u := Unmarshaler{AnyResolver: resolver} + roundTrip := &anypb.Any{} + err = u.Unmarshal(bytes.NewReader([]byte(js)), roundTrip) + if err != nil { + t.Errorf("an unexpected error occurred when unmarshaling any from JSON: %v", err) + } + if len(resolvedTypeUrls) != 2 { + t.Errorf("custom resolver was not invoked during marshaling") + } else if resolvedTypeUrls[1] != "https://foobar.com/some.random.MessageKind" { + t.Errorf("custom resolver was invoked with wrong URL: got %q, wanted %q", resolvedTypeUrls[1], "https://foobar.com/some.random.MessageKind") + } + if !proto.Equal(any, roundTrip) { + t.Errorf("message contents not set correctly after unmarshalling JSON: got %s, wanted %s", roundTrip, any) + } +} + +func TestUnmarshalJSONPBUnmarshaler(t *testing.T) { + rawJson := `{ "foo": "bar", "baz": [0, 1, 2, 3] }` + var msg dynamicMessage + if err := Unmarshal(strings.NewReader(rawJson), &msg); err != nil { + t.Errorf("an unexpected error occurred when parsing into JSONPBUnmarshaler: %v", err) + } + if msg.rawJson != rawJson { + t.Errorf("message contents not set correctly after unmarshalling JSON: got %s, wanted %s", msg.rawJson, rawJson) + } +} + +func TestUnmarshalNullWithJSONPBUnmarshaler(t *testing.T) { + rawJson := `{"stringField":null}` + var ptrFieldMsg ptrFieldMessage + if err := Unmarshal(strings.NewReader(rawJson), &ptrFieldMsg); err != nil { + t.Errorf("unmarshal error: %v", err) + } + + want := ptrFieldMessage{StringField: &stringField{IsSet: true, StringValue: "null"}} + if !proto.Equal(&ptrFieldMsg, &want) { + t.Errorf("unmarshal result StringField: got %v, want %v", ptrFieldMsg, want) + } +} + +func TestUnmarshalAnyJSONPBUnmarshaler(t *testing.T) { + rawJson := `{ "@type": "blah.com/` + dynamicMessageName + `", "foo": "bar", "baz": [0, 1, 2, 3] }` + var got anypb.Any + if err := Unmarshal(strings.NewReader(rawJson), &got); err != nil { + t.Errorf("an unexpected error occurred when parsing into JSONPBUnmarshaler: %v", err) + } + + dm := &dynamicMessage{rawJson: `{"baz":[0,1,2,3],"foo":"bar"}`} + var want anypb.Any + if b, err := proto.Marshal(dm); err != nil { + t.Errorf("an unexpected error occurred when marshaling message: %v", err) + } else { + want.TypeUrl = "blah.com/" + dynamicMessageName + want.Value = b + } + + if !proto.Equal(&got, &want) { + t.Errorf("message contents not set correctly after unmarshalling JSON: got %s, wanted %s", got, want) + } +} + +const ( + dynamicMessageName = "google.protobuf.jsonpb.testing.dynamicMessage" +) + +func init() { + // we register the custom type below so that we can use it in Any types + proto.RegisterType((*dynamicMessage)(nil), dynamicMessageName) +} + +type ptrFieldMessage struct { + StringField *stringField `protobuf:"bytes,1,opt,name=stringField"` +} + +func (m *ptrFieldMessage) Reset() { +} + +func (m *ptrFieldMessage) String() string { + return m.StringField.StringValue +} + +func (m *ptrFieldMessage) ProtoMessage() { +} + +type stringField struct { + IsSet bool `protobuf:"varint,1,opt,name=isSet"` + StringValue string `protobuf:"bytes,2,opt,name=stringValue"` +} + +func (s *stringField) Reset() { +} + +func (s *stringField) String() string { + return s.StringValue +} + +func (s *stringField) ProtoMessage() { +} + +func (s *stringField) UnmarshalJSONPB(jum *Unmarshaler, js []byte) error { + s.IsSet = true + s.StringValue = string(js) + return nil +} + +// dynamicMessage implements protobuf.Message but is not a normal generated message type. +// It provides implementations of JSONPBMarshaler and JSONPBUnmarshaler for JSON support. +type dynamicMessage struct { + rawJson string `protobuf:"bytes,1,opt,name=rawJson"` +} + +func (m *dynamicMessage) Reset() { + m.rawJson = "{}" +} + +func (m *dynamicMessage) String() string { + return m.rawJson +} + +func (m *dynamicMessage) ProtoMessage() { +} + +func (m *dynamicMessage) MarshalJSONPB(jm *Marshaler) ([]byte, error) { + return []byte(m.rawJson), nil +} + +func (m *dynamicMessage) UnmarshalJSONPB(jum *Unmarshaler, js []byte) error { + m.rawJson = string(js) + return nil +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/Makefile b/example/prometheus-mock/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/Makefile new file mode 100644 index 0000000..eeda8ae --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/Makefile @@ -0,0 +1,33 @@ +# Go support for Protocol Buffers - Google's data interchange format +# +# Copyright 2015 The Go Authors. All rights reserved. +# https://github.com/golang/protobuf +# +# 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. + +regenerate: + protoc --go_out=Mgoogle/protobuf/any.proto=github.com/golang/protobuf/ptypes/any,Mgoogle/protobuf/duration.proto=github.com/golang/protobuf/ptypes/duration,Mgoogle/protobuf/struct.proto=github.com/golang/protobuf/ptypes/struct,Mgoogle/protobuf/timestamp.proto=github.com/golang/protobuf/ptypes/timestamp,Mgoogle/protobuf/wrappers.proto=github.com/golang/protobuf/ptypes/wrappers:. *.proto diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/more_test_objects.pb.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/more_test_objects.pb.go new file mode 100644 index 0000000..ebb180e --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/more_test_objects.pb.go @@ -0,0 +1,266 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: more_test_objects.proto + +/* +Package jsonpb is a generated protocol buffer package. + +It is generated from these files: + more_test_objects.proto + test_objects.proto + +It has these top-level messages: + Simple3 + SimpleSlice3 + SimpleMap3 + SimpleNull3 + Mappy + Simple + NonFinites + Repeats + Widget + Maps + MsgWithOneof + Real + Complex + KnownTypes +*/ +package jsonpb + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type Numeral int32 + +const ( + Numeral_UNKNOWN Numeral = 0 + Numeral_ARABIC Numeral = 1 + Numeral_ROMAN Numeral = 2 +) + +var Numeral_name = map[int32]string{ + 0: "UNKNOWN", + 1: "ARABIC", + 2: "ROMAN", +} +var Numeral_value = map[string]int32{ + "UNKNOWN": 0, + "ARABIC": 1, + "ROMAN": 2, +} + +func (x Numeral) String() string { + return proto.EnumName(Numeral_name, int32(x)) +} +func (Numeral) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } + +type Simple3 struct { + Dub float64 `protobuf:"fixed64,1,opt,name=dub" json:"dub,omitempty"` +} + +func (m *Simple3) Reset() { *m = Simple3{} } +func (m *Simple3) String() string { return proto.CompactTextString(m) } +func (*Simple3) ProtoMessage() {} +func (*Simple3) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } + +func (m *Simple3) GetDub() float64 { + if m != nil { + return m.Dub + } + return 0 +} + +type SimpleSlice3 struct { + Slices []string `protobuf:"bytes,1,rep,name=slices" json:"slices,omitempty"` +} + +func (m *SimpleSlice3) Reset() { *m = SimpleSlice3{} } +func (m *SimpleSlice3) String() string { return proto.CompactTextString(m) } +func (*SimpleSlice3) ProtoMessage() {} +func (*SimpleSlice3) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } + +func (m *SimpleSlice3) GetSlices() []string { + if m != nil { + return m.Slices + } + return nil +} + +type SimpleMap3 struct { + Stringy map[string]string `protobuf:"bytes,1,rep,name=stringy" json:"stringy,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` +} + +func (m *SimpleMap3) Reset() { *m = SimpleMap3{} } +func (m *SimpleMap3) String() string { return proto.CompactTextString(m) } +func (*SimpleMap3) ProtoMessage() {} +func (*SimpleMap3) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } + +func (m *SimpleMap3) GetStringy() map[string]string { + if m != nil { + return m.Stringy + } + return nil +} + +type SimpleNull3 struct { + Simple *Simple3 `protobuf:"bytes,1,opt,name=simple" json:"simple,omitempty"` +} + +func (m *SimpleNull3) Reset() { *m = SimpleNull3{} } +func (m *SimpleNull3) String() string { return proto.CompactTextString(m) } +func (*SimpleNull3) ProtoMessage() {} +func (*SimpleNull3) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } + +func (m *SimpleNull3) GetSimple() *Simple3 { + if m != nil { + return m.Simple + } + return nil +} + +type Mappy struct { + Nummy map[int64]int32 `protobuf:"bytes,1,rep,name=nummy" json:"nummy,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"` + Strry map[string]string `protobuf:"bytes,2,rep,name=strry" json:"strry,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + Objjy map[int32]*Simple3 `protobuf:"bytes,3,rep,name=objjy" json:"objjy,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + Buggy map[int64]string `protobuf:"bytes,4,rep,name=buggy" json:"buggy,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + Booly map[bool]bool `protobuf:"bytes,5,rep,name=booly" json:"booly,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"` + Enumy map[string]Numeral `protobuf:"bytes,6,rep,name=enumy" json:"enumy,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"varint,2,opt,name=value,enum=jsonpb.Numeral"` + S32Booly map[int32]bool `protobuf:"bytes,7,rep,name=s32booly" json:"s32booly,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"` + S64Booly map[int64]bool `protobuf:"bytes,8,rep,name=s64booly" json:"s64booly,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"` + U32Booly map[uint32]bool `protobuf:"bytes,9,rep,name=u32booly" json:"u32booly,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"` + U64Booly map[uint64]bool `protobuf:"bytes,10,rep,name=u64booly" json:"u64booly,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"` +} + +func (m *Mappy) Reset() { *m = Mappy{} } +func (m *Mappy) String() string { return proto.CompactTextString(m) } +func (*Mappy) ProtoMessage() {} +func (*Mappy) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } + +func (m *Mappy) GetNummy() map[int64]int32 { + if m != nil { + return m.Nummy + } + return nil +} + +func (m *Mappy) GetStrry() map[string]string { + if m != nil { + return m.Strry + } + return nil +} + +func (m *Mappy) GetObjjy() map[int32]*Simple3 { + if m != nil { + return m.Objjy + } + return nil +} + +func (m *Mappy) GetBuggy() map[int64]string { + if m != nil { + return m.Buggy + } + return nil +} + +func (m *Mappy) GetBooly() map[bool]bool { + if m != nil { + return m.Booly + } + return nil +} + +func (m *Mappy) GetEnumy() map[string]Numeral { + if m != nil { + return m.Enumy + } + return nil +} + +func (m *Mappy) GetS32Booly() map[int32]bool { + if m != nil { + return m.S32Booly + } + return nil +} + +func (m *Mappy) GetS64Booly() map[int64]bool { + if m != nil { + return m.S64Booly + } + return nil +} + +func (m *Mappy) GetU32Booly() map[uint32]bool { + if m != nil { + return m.U32Booly + } + return nil +} + +func (m *Mappy) GetU64Booly() map[uint64]bool { + if m != nil { + return m.U64Booly + } + return nil +} + +func init() { + proto.RegisterType((*Simple3)(nil), "jsonpb.Simple3") + proto.RegisterType((*SimpleSlice3)(nil), "jsonpb.SimpleSlice3") + proto.RegisterType((*SimpleMap3)(nil), "jsonpb.SimpleMap3") + proto.RegisterType((*SimpleNull3)(nil), "jsonpb.SimpleNull3") + proto.RegisterType((*Mappy)(nil), "jsonpb.Mappy") + proto.RegisterEnum("jsonpb.Numeral", Numeral_name, Numeral_value) +} + +func init() { proto.RegisterFile("more_test_objects.proto", fileDescriptor0) } + +var fileDescriptor0 = []byte{ + // 526 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x94, 0xdd, 0x6b, 0xdb, 0x3c, + 0x14, 0x87, 0x5f, 0x27, 0xf5, 0xd7, 0x49, 0xfb, 0x2e, 0x88, 0xb1, 0x99, 0xf4, 0x62, 0xc5, 0xb0, + 0xad, 0x0c, 0xe6, 0x8b, 0x78, 0x74, 0x5d, 0x77, 0x95, 0x8e, 0x5e, 0x94, 0x11, 0x07, 0x1c, 0xc2, + 0x2e, 0x4b, 0xdc, 0x99, 0x90, 0xcc, 0x5f, 0xd8, 0xd6, 0xc0, 0xd7, 0xfb, 0xbb, 0x07, 0xe3, 0x48, + 0x72, 0x2d, 0x07, 0x85, 0x6c, 0x77, 0x52, 0x7e, 0xcf, 0xe3, 0x73, 0x24, 0x1d, 0x02, 0x2f, 0xd3, + 0xbc, 0x8c, 0x1f, 0xea, 0xb8, 0xaa, 0x1f, 0xf2, 0x68, 0x17, 0x3f, 0xd6, 0x95, 0x57, 0x94, 0x79, + 0x9d, 0x13, 0x63, 0x57, 0xe5, 0x59, 0x11, 0xb9, 0xe7, 0x60, 0x2e, 0xb7, 0x69, 0x91, 0xc4, 0x3e, + 0x19, 0xc3, 0xf0, 0x3b, 0x8d, 0x1c, 0xed, 0x42, 0xbb, 0xd4, 0x42, 0x5c, 0xba, 0x6f, 0xe0, 0x94, + 0x87, 0xcb, 0x64, 0xfb, 0x18, 0xfb, 0xe4, 0x05, 0x18, 0x15, 0xae, 0x2a, 0x47, 0xbb, 0x18, 0x5e, + 0xda, 0xa1, 0xd8, 0xb9, 0xbf, 0x34, 0x00, 0x0e, 0xce, 0xd7, 0x85, 0x4f, 0x3e, 0x81, 0x59, 0xd5, + 0xe5, 0x36, 0xdb, 0x34, 0x8c, 0x1b, 0x4d, 0x5f, 0x79, 0xbc, 0x9a, 0xd7, 0x41, 0xde, 0x92, 0x13, + 0x77, 0x59, 0x5d, 0x36, 0x61, 0xcb, 0x4f, 0x6e, 0xe0, 0x54, 0x0e, 0xb0, 0xa7, 0x1f, 0x71, 0xc3, + 0x7a, 0xb2, 0x43, 0x5c, 0x92, 0xe7, 0xa0, 0xff, 0x5c, 0x27, 0x34, 0x76, 0x06, 0xec, 0x37, 0xbe, + 0xb9, 0x19, 0x5c, 0x6b, 0xee, 0x15, 0x8c, 0xf8, 0xf7, 0x03, 0x9a, 0x24, 0x3e, 0x79, 0x0b, 0x46, + 0xc5, 0xb6, 0xcc, 0x1e, 0x4d, 0x9f, 0xf5, 0x9b, 0xf0, 0x43, 0x11, 0xbb, 0xbf, 0x2d, 0xd0, 0xe7, + 0xeb, 0xa2, 0x68, 0x88, 0x07, 0x7a, 0x46, 0xd3, 0xb4, 0x6d, 0xdb, 0x69, 0x0d, 0x96, 0x7a, 0x01, + 0x46, 0xbc, 0x5f, 0x8e, 0x21, 0x5f, 0xd5, 0x65, 0xd9, 0x38, 0x03, 0x15, 0xbf, 0xc4, 0x48, 0xf0, + 0x0c, 0x43, 0x3e, 0x8f, 0x76, 0xbb, 0xc6, 0x19, 0xaa, 0xf8, 0x05, 0x46, 0x82, 0x67, 0x18, 0xf2, + 0x11, 0xdd, 0x6c, 0x1a, 0xe7, 0x44, 0xc5, 0xdf, 0x62, 0x24, 0x78, 0x86, 0x31, 0x3e, 0xcf, 0x93, + 0xc6, 0xd1, 0x95, 0x3c, 0x46, 0x2d, 0x8f, 0x6b, 0xe4, 0xe3, 0x8c, 0xa6, 0x8d, 0x63, 0xa8, 0xf8, + 0x3b, 0x8c, 0x04, 0xcf, 0x30, 0xf2, 0x11, 0xac, 0xca, 0x9f, 0xf2, 0x12, 0x26, 0x53, 0xce, 0xf7, + 0x8e, 0x2c, 0x52, 0x6e, 0x3d, 0xc1, 0x4c, 0xbc, 0xfa, 0xc0, 0x45, 0x4b, 0x29, 0x8a, 0xb4, 0x15, + 0xc5, 0x16, 0x45, 0xda, 0x56, 0xb4, 0x55, 0xe2, 0xaa, 0x5f, 0x91, 0x4a, 0x15, 0x69, 0x5b, 0x11, + 0x94, 0x62, 0xbf, 0x62, 0x0b, 0x4f, 0xae, 0x01, 0xba, 0x87, 0x96, 0xe7, 0x6f, 0xa8, 0x98, 0x3f, + 0x5d, 0x9a, 0x3f, 0x34, 0xbb, 0x27, 0xff, 0x97, 0xc9, 0x9d, 0xdc, 0x03, 0x74, 0x8f, 0x2f, 0x9b, + 0x3a, 0x37, 0x5f, 0xcb, 0xa6, 0x62, 0x92, 0xfb, 0x4d, 0x74, 0x73, 0x71, 0xac, 0x7d, 0x7b, 0xdf, + 0x7c, 0xba, 0x10, 0xd9, 0xb4, 0x14, 0xa6, 0xb5, 0xd7, 0x7e, 0x37, 0x2b, 0x8a, 0x83, 0xf7, 0xda, + 0xff, 0xbf, 0x6b, 0x3f, 0xa0, 0x69, 0x5c, 0xae, 0x13, 0xf9, 0x53, 0x9f, 0xe1, 0xac, 0x37, 0x43, + 0x8a, 0xcb, 0x38, 0xdc, 0x07, 0xca, 0xf2, 0xab, 0x1e, 0x3b, 0xfe, 0xbe, 0xbc, 0x3a, 0x54, 0xf9, + 0xec, 0x6f, 0xe4, 0x43, 0x95, 0x4f, 0x8e, 0xc8, 0xef, 0xde, 0x83, 0x29, 0x6e, 0x82, 0x8c, 0xc0, + 0x5c, 0x05, 0x5f, 0x83, 0xc5, 0xb7, 0x60, 0xfc, 0x1f, 0x01, 0x30, 0x66, 0xe1, 0xec, 0xf6, 0xfe, + 0xcb, 0x58, 0x23, 0x36, 0xe8, 0xe1, 0x62, 0x3e, 0x0b, 0xc6, 0x83, 0xc8, 0x60, 0x7f, 0xe0, 0xfe, + 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdc, 0x84, 0x34, 0xaf, 0xdb, 0x05, 0x00, 0x00, +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/more_test_objects.proto b/example/prometheus-mock/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/more_test_objects.proto new file mode 100644 index 0000000..d254fa5 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/more_test_objects.proto @@ -0,0 +1,69 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2015 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto3"; + +package jsonpb; + +message Simple3 { + double dub = 1; +} + +message SimpleSlice3 { + repeated string slices = 1; +} + +message SimpleMap3 { + map stringy = 1; +} + +message SimpleNull3 { + Simple3 simple = 1; +} + +enum Numeral { + UNKNOWN = 0; + ARABIC = 1; + ROMAN = 2; +} + +message Mappy { + map nummy = 1; + map strry = 2; + map objjy = 3; + map buggy = 4; + map booly = 5; + map enumy = 6; + map s32booly = 7; + map s64booly = 8; + map u32booly = 9; + map u64booly = 10; +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/test_objects.pb.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/test_objects.pb.go new file mode 100644 index 0000000..d413d74 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/test_objects.pb.go @@ -0,0 +1,852 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: test_objects.proto + +package jsonpb + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" +import google_protobuf "github.com/golang/protobuf/ptypes/any" +import google_protobuf1 "github.com/golang/protobuf/ptypes/duration" +import google_protobuf2 "github.com/golang/protobuf/ptypes/struct" +import google_protobuf3 "github.com/golang/protobuf/ptypes/timestamp" +import google_protobuf4 "github.com/golang/protobuf/ptypes/wrappers" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +type Widget_Color int32 + +const ( + Widget_RED Widget_Color = 0 + Widget_GREEN Widget_Color = 1 + Widget_BLUE Widget_Color = 2 +) + +var Widget_Color_name = map[int32]string{ + 0: "RED", + 1: "GREEN", + 2: "BLUE", +} +var Widget_Color_value = map[string]int32{ + "RED": 0, + "GREEN": 1, + "BLUE": 2, +} + +func (x Widget_Color) Enum() *Widget_Color { + p := new(Widget_Color) + *p = x + return p +} +func (x Widget_Color) String() string { + return proto.EnumName(Widget_Color_name, int32(x)) +} +func (x *Widget_Color) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Widget_Color_value, data, "Widget_Color") + if err != nil { + return err + } + *x = Widget_Color(value) + return nil +} +func (Widget_Color) EnumDescriptor() ([]byte, []int) { return fileDescriptor1, []int{3, 0} } + +// Test message for holding primitive types. +type Simple struct { + OBool *bool `protobuf:"varint,1,opt,name=o_bool,json=oBool" json:"o_bool,omitempty"` + OInt32 *int32 `protobuf:"varint,2,opt,name=o_int32,json=oInt32" json:"o_int32,omitempty"` + OInt64 *int64 `protobuf:"varint,3,opt,name=o_int64,json=oInt64" json:"o_int64,omitempty"` + OUint32 *uint32 `protobuf:"varint,4,opt,name=o_uint32,json=oUint32" json:"o_uint32,omitempty"` + OUint64 *uint64 `protobuf:"varint,5,opt,name=o_uint64,json=oUint64" json:"o_uint64,omitempty"` + OSint32 *int32 `protobuf:"zigzag32,6,opt,name=o_sint32,json=oSint32" json:"o_sint32,omitempty"` + OSint64 *int64 `protobuf:"zigzag64,7,opt,name=o_sint64,json=oSint64" json:"o_sint64,omitempty"` + OFloat *float32 `protobuf:"fixed32,8,opt,name=o_float,json=oFloat" json:"o_float,omitempty"` + ODouble *float64 `protobuf:"fixed64,9,opt,name=o_double,json=oDouble" json:"o_double,omitempty"` + OString *string `protobuf:"bytes,10,opt,name=o_string,json=oString" json:"o_string,omitempty"` + OBytes []byte `protobuf:"bytes,11,opt,name=o_bytes,json=oBytes" json:"o_bytes,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Simple) Reset() { *m = Simple{} } +func (m *Simple) String() string { return proto.CompactTextString(m) } +func (*Simple) ProtoMessage() {} +func (*Simple) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{0} } + +func (m *Simple) GetOBool() bool { + if m != nil && m.OBool != nil { + return *m.OBool + } + return false +} + +func (m *Simple) GetOInt32() int32 { + if m != nil && m.OInt32 != nil { + return *m.OInt32 + } + return 0 +} + +func (m *Simple) GetOInt64() int64 { + if m != nil && m.OInt64 != nil { + return *m.OInt64 + } + return 0 +} + +func (m *Simple) GetOUint32() uint32 { + if m != nil && m.OUint32 != nil { + return *m.OUint32 + } + return 0 +} + +func (m *Simple) GetOUint64() uint64 { + if m != nil && m.OUint64 != nil { + return *m.OUint64 + } + return 0 +} + +func (m *Simple) GetOSint32() int32 { + if m != nil && m.OSint32 != nil { + return *m.OSint32 + } + return 0 +} + +func (m *Simple) GetOSint64() int64 { + if m != nil && m.OSint64 != nil { + return *m.OSint64 + } + return 0 +} + +func (m *Simple) GetOFloat() float32 { + if m != nil && m.OFloat != nil { + return *m.OFloat + } + return 0 +} + +func (m *Simple) GetODouble() float64 { + if m != nil && m.ODouble != nil { + return *m.ODouble + } + return 0 +} + +func (m *Simple) GetOString() string { + if m != nil && m.OString != nil { + return *m.OString + } + return "" +} + +func (m *Simple) GetOBytes() []byte { + if m != nil { + return m.OBytes + } + return nil +} + +// Test message for holding special non-finites primitives. +type NonFinites struct { + FNan *float32 `protobuf:"fixed32,1,opt,name=f_nan,json=fNan" json:"f_nan,omitempty"` + FPinf *float32 `protobuf:"fixed32,2,opt,name=f_pinf,json=fPinf" json:"f_pinf,omitempty"` + FNinf *float32 `protobuf:"fixed32,3,opt,name=f_ninf,json=fNinf" json:"f_ninf,omitempty"` + DNan *float64 `protobuf:"fixed64,4,opt,name=d_nan,json=dNan" json:"d_nan,omitempty"` + DPinf *float64 `protobuf:"fixed64,5,opt,name=d_pinf,json=dPinf" json:"d_pinf,omitempty"` + DNinf *float64 `protobuf:"fixed64,6,opt,name=d_ninf,json=dNinf" json:"d_ninf,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *NonFinites) Reset() { *m = NonFinites{} } +func (m *NonFinites) String() string { return proto.CompactTextString(m) } +func (*NonFinites) ProtoMessage() {} +func (*NonFinites) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{1} } + +func (m *NonFinites) GetFNan() float32 { + if m != nil && m.FNan != nil { + return *m.FNan + } + return 0 +} + +func (m *NonFinites) GetFPinf() float32 { + if m != nil && m.FPinf != nil { + return *m.FPinf + } + return 0 +} + +func (m *NonFinites) GetFNinf() float32 { + if m != nil && m.FNinf != nil { + return *m.FNinf + } + return 0 +} + +func (m *NonFinites) GetDNan() float64 { + if m != nil && m.DNan != nil { + return *m.DNan + } + return 0 +} + +func (m *NonFinites) GetDPinf() float64 { + if m != nil && m.DPinf != nil { + return *m.DPinf + } + return 0 +} + +func (m *NonFinites) GetDNinf() float64 { + if m != nil && m.DNinf != nil { + return *m.DNinf + } + return 0 +} + +// Test message for holding repeated primitives. +type Repeats struct { + RBool []bool `protobuf:"varint,1,rep,name=r_bool,json=rBool" json:"r_bool,omitempty"` + RInt32 []int32 `protobuf:"varint,2,rep,name=r_int32,json=rInt32" json:"r_int32,omitempty"` + RInt64 []int64 `protobuf:"varint,3,rep,name=r_int64,json=rInt64" json:"r_int64,omitempty"` + RUint32 []uint32 `protobuf:"varint,4,rep,name=r_uint32,json=rUint32" json:"r_uint32,omitempty"` + RUint64 []uint64 `protobuf:"varint,5,rep,name=r_uint64,json=rUint64" json:"r_uint64,omitempty"` + RSint32 []int32 `protobuf:"zigzag32,6,rep,name=r_sint32,json=rSint32" json:"r_sint32,omitempty"` + RSint64 []int64 `protobuf:"zigzag64,7,rep,name=r_sint64,json=rSint64" json:"r_sint64,omitempty"` + RFloat []float32 `protobuf:"fixed32,8,rep,name=r_float,json=rFloat" json:"r_float,omitempty"` + RDouble []float64 `protobuf:"fixed64,9,rep,name=r_double,json=rDouble" json:"r_double,omitempty"` + RString []string `protobuf:"bytes,10,rep,name=r_string,json=rString" json:"r_string,omitempty"` + RBytes [][]byte `protobuf:"bytes,11,rep,name=r_bytes,json=rBytes" json:"r_bytes,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Repeats) Reset() { *m = Repeats{} } +func (m *Repeats) String() string { return proto.CompactTextString(m) } +func (*Repeats) ProtoMessage() {} +func (*Repeats) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{2} } + +func (m *Repeats) GetRBool() []bool { + if m != nil { + return m.RBool + } + return nil +} + +func (m *Repeats) GetRInt32() []int32 { + if m != nil { + return m.RInt32 + } + return nil +} + +func (m *Repeats) GetRInt64() []int64 { + if m != nil { + return m.RInt64 + } + return nil +} + +func (m *Repeats) GetRUint32() []uint32 { + if m != nil { + return m.RUint32 + } + return nil +} + +func (m *Repeats) GetRUint64() []uint64 { + if m != nil { + return m.RUint64 + } + return nil +} + +func (m *Repeats) GetRSint32() []int32 { + if m != nil { + return m.RSint32 + } + return nil +} + +func (m *Repeats) GetRSint64() []int64 { + if m != nil { + return m.RSint64 + } + return nil +} + +func (m *Repeats) GetRFloat() []float32 { + if m != nil { + return m.RFloat + } + return nil +} + +func (m *Repeats) GetRDouble() []float64 { + if m != nil { + return m.RDouble + } + return nil +} + +func (m *Repeats) GetRString() []string { + if m != nil { + return m.RString + } + return nil +} + +func (m *Repeats) GetRBytes() [][]byte { + if m != nil { + return m.RBytes + } + return nil +} + +// Test message for holding enums and nested messages. +type Widget struct { + Color *Widget_Color `protobuf:"varint,1,opt,name=color,enum=jsonpb.Widget_Color" json:"color,omitempty"` + RColor []Widget_Color `protobuf:"varint,2,rep,name=r_color,json=rColor,enum=jsonpb.Widget_Color" json:"r_color,omitempty"` + Simple *Simple `protobuf:"bytes,10,opt,name=simple" json:"simple,omitempty"` + RSimple []*Simple `protobuf:"bytes,11,rep,name=r_simple,json=rSimple" json:"r_simple,omitempty"` + Repeats *Repeats `protobuf:"bytes,20,opt,name=repeats" json:"repeats,omitempty"` + RRepeats []*Repeats `protobuf:"bytes,21,rep,name=r_repeats,json=rRepeats" json:"r_repeats,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Widget) Reset() { *m = Widget{} } +func (m *Widget) String() string { return proto.CompactTextString(m) } +func (*Widget) ProtoMessage() {} +func (*Widget) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{3} } + +func (m *Widget) GetColor() Widget_Color { + if m != nil && m.Color != nil { + return *m.Color + } + return Widget_RED +} + +func (m *Widget) GetRColor() []Widget_Color { + if m != nil { + return m.RColor + } + return nil +} + +func (m *Widget) GetSimple() *Simple { + if m != nil { + return m.Simple + } + return nil +} + +func (m *Widget) GetRSimple() []*Simple { + if m != nil { + return m.RSimple + } + return nil +} + +func (m *Widget) GetRepeats() *Repeats { + if m != nil { + return m.Repeats + } + return nil +} + +func (m *Widget) GetRRepeats() []*Repeats { + if m != nil { + return m.RRepeats + } + return nil +} + +type Maps struct { + MInt64Str map[int64]string `protobuf:"bytes,1,rep,name=m_int64_str,json=mInt64Str" json:"m_int64_str,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + MBoolSimple map[bool]*Simple `protobuf:"bytes,2,rep,name=m_bool_simple,json=mBoolSimple" json:"m_bool_simple,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Maps) Reset() { *m = Maps{} } +func (m *Maps) String() string { return proto.CompactTextString(m) } +func (*Maps) ProtoMessage() {} +func (*Maps) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{4} } + +func (m *Maps) GetMInt64Str() map[int64]string { + if m != nil { + return m.MInt64Str + } + return nil +} + +func (m *Maps) GetMBoolSimple() map[bool]*Simple { + if m != nil { + return m.MBoolSimple + } + return nil +} + +type MsgWithOneof struct { + // Types that are valid to be assigned to Union: + // *MsgWithOneof_Title + // *MsgWithOneof_Salary + // *MsgWithOneof_Country + // *MsgWithOneof_HomeAddress + Union isMsgWithOneof_Union `protobuf_oneof:"union"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *MsgWithOneof) Reset() { *m = MsgWithOneof{} } +func (m *MsgWithOneof) String() string { return proto.CompactTextString(m) } +func (*MsgWithOneof) ProtoMessage() {} +func (*MsgWithOneof) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{5} } + +type isMsgWithOneof_Union interface { + isMsgWithOneof_Union() +} + +type MsgWithOneof_Title struct { + Title string `protobuf:"bytes,1,opt,name=title,oneof"` +} +type MsgWithOneof_Salary struct { + Salary int64 `protobuf:"varint,2,opt,name=salary,oneof"` +} +type MsgWithOneof_Country struct { + Country string `protobuf:"bytes,3,opt,name=Country,oneof"` +} +type MsgWithOneof_HomeAddress struct { + HomeAddress string `protobuf:"bytes,4,opt,name=home_address,json=homeAddress,oneof"` +} + +func (*MsgWithOneof_Title) isMsgWithOneof_Union() {} +func (*MsgWithOneof_Salary) isMsgWithOneof_Union() {} +func (*MsgWithOneof_Country) isMsgWithOneof_Union() {} +func (*MsgWithOneof_HomeAddress) isMsgWithOneof_Union() {} + +func (m *MsgWithOneof) GetUnion() isMsgWithOneof_Union { + if m != nil { + return m.Union + } + return nil +} + +func (m *MsgWithOneof) GetTitle() string { + if x, ok := m.GetUnion().(*MsgWithOneof_Title); ok { + return x.Title + } + return "" +} + +func (m *MsgWithOneof) GetSalary() int64 { + if x, ok := m.GetUnion().(*MsgWithOneof_Salary); ok { + return x.Salary + } + return 0 +} + +func (m *MsgWithOneof) GetCountry() string { + if x, ok := m.GetUnion().(*MsgWithOneof_Country); ok { + return x.Country + } + return "" +} + +func (m *MsgWithOneof) GetHomeAddress() string { + if x, ok := m.GetUnion().(*MsgWithOneof_HomeAddress); ok { + return x.HomeAddress + } + return "" +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*MsgWithOneof) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _MsgWithOneof_OneofMarshaler, _MsgWithOneof_OneofUnmarshaler, _MsgWithOneof_OneofSizer, []interface{}{ + (*MsgWithOneof_Title)(nil), + (*MsgWithOneof_Salary)(nil), + (*MsgWithOneof_Country)(nil), + (*MsgWithOneof_HomeAddress)(nil), + } +} + +func _MsgWithOneof_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*MsgWithOneof) + // union + switch x := m.Union.(type) { + case *MsgWithOneof_Title: + b.EncodeVarint(1<<3 | proto.WireBytes) + b.EncodeStringBytes(x.Title) + case *MsgWithOneof_Salary: + b.EncodeVarint(2<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.Salary)) + case *MsgWithOneof_Country: + b.EncodeVarint(3<<3 | proto.WireBytes) + b.EncodeStringBytes(x.Country) + case *MsgWithOneof_HomeAddress: + b.EncodeVarint(4<<3 | proto.WireBytes) + b.EncodeStringBytes(x.HomeAddress) + case nil: + default: + return fmt.Errorf("MsgWithOneof.Union has unexpected type %T", x) + } + return nil +} + +func _MsgWithOneof_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*MsgWithOneof) + switch tag { + case 1: // union.title + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeStringBytes() + m.Union = &MsgWithOneof_Title{x} + return true, err + case 2: // union.salary + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &MsgWithOneof_Salary{int64(x)} + return true, err + case 3: // union.Country + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeStringBytes() + m.Union = &MsgWithOneof_Country{x} + return true, err + case 4: // union.home_address + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeStringBytes() + m.Union = &MsgWithOneof_HomeAddress{x} + return true, err + default: + return false, nil + } +} + +func _MsgWithOneof_OneofSizer(msg proto.Message) (n int) { + m := msg.(*MsgWithOneof) + // union + switch x := m.Union.(type) { + case *MsgWithOneof_Title: + n += proto.SizeVarint(1<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(len(x.Title))) + n += len(x.Title) + case *MsgWithOneof_Salary: + n += proto.SizeVarint(2<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.Salary)) + case *MsgWithOneof_Country: + n += proto.SizeVarint(3<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(len(x.Country))) + n += len(x.Country) + case *MsgWithOneof_HomeAddress: + n += proto.SizeVarint(4<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(len(x.HomeAddress))) + n += len(x.HomeAddress) + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +type Real struct { + Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Real) Reset() { *m = Real{} } +func (m *Real) String() string { return proto.CompactTextString(m) } +func (*Real) ProtoMessage() {} +func (*Real) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{6} } + +var extRange_Real = []proto.ExtensionRange{ + {100, 536870911}, +} + +func (*Real) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_Real +} + +func (m *Real) GetValue() float64 { + if m != nil && m.Value != nil { + return *m.Value + } + return 0 +} + +type Complex struct { + Imaginary *float64 `protobuf:"fixed64,1,opt,name=imaginary" json:"imaginary,omitempty"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Complex) Reset() { *m = Complex{} } +func (m *Complex) String() string { return proto.CompactTextString(m) } +func (*Complex) ProtoMessage() {} +func (*Complex) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{7} } + +var extRange_Complex = []proto.ExtensionRange{ + {100, 536870911}, +} + +func (*Complex) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_Complex +} + +func (m *Complex) GetImaginary() float64 { + if m != nil && m.Imaginary != nil { + return *m.Imaginary + } + return 0 +} + +var E_Complex_RealExtension = &proto.ExtensionDesc{ + ExtendedType: (*Real)(nil), + ExtensionType: (*Complex)(nil), + Field: 123, + Name: "jsonpb.Complex.real_extension", + Tag: "bytes,123,opt,name=real_extension,json=realExtension", + Filename: "test_objects.proto", +} + +type KnownTypes struct { + An *google_protobuf.Any `protobuf:"bytes,14,opt,name=an" json:"an,omitempty"` + Dur *google_protobuf1.Duration `protobuf:"bytes,1,opt,name=dur" json:"dur,omitempty"` + St *google_protobuf2.Struct `protobuf:"bytes,12,opt,name=st" json:"st,omitempty"` + Ts *google_protobuf3.Timestamp `protobuf:"bytes,2,opt,name=ts" json:"ts,omitempty"` + Lv *google_protobuf2.ListValue `protobuf:"bytes,15,opt,name=lv" json:"lv,omitempty"` + Val *google_protobuf2.Value `protobuf:"bytes,16,opt,name=val" json:"val,omitempty"` + Dbl *google_protobuf4.DoubleValue `protobuf:"bytes,3,opt,name=dbl" json:"dbl,omitempty"` + Flt *google_protobuf4.FloatValue `protobuf:"bytes,4,opt,name=flt" json:"flt,omitempty"` + I64 *google_protobuf4.Int64Value `protobuf:"bytes,5,opt,name=i64" json:"i64,omitempty"` + U64 *google_protobuf4.UInt64Value `protobuf:"bytes,6,opt,name=u64" json:"u64,omitempty"` + I32 *google_protobuf4.Int32Value `protobuf:"bytes,7,opt,name=i32" json:"i32,omitempty"` + U32 *google_protobuf4.UInt32Value `protobuf:"bytes,8,opt,name=u32" json:"u32,omitempty"` + Bool *google_protobuf4.BoolValue `protobuf:"bytes,9,opt,name=bool" json:"bool,omitempty"` + Str *google_protobuf4.StringValue `protobuf:"bytes,10,opt,name=str" json:"str,omitempty"` + Bytes *google_protobuf4.BytesValue `protobuf:"bytes,11,opt,name=bytes" json:"bytes,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *KnownTypes) Reset() { *m = KnownTypes{} } +func (m *KnownTypes) String() string { return proto.CompactTextString(m) } +func (*KnownTypes) ProtoMessage() {} +func (*KnownTypes) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{8} } + +func (m *KnownTypes) GetAn() *google_protobuf.Any { + if m != nil { + return m.An + } + return nil +} + +func (m *KnownTypes) GetDur() *google_protobuf1.Duration { + if m != nil { + return m.Dur + } + return nil +} + +func (m *KnownTypes) GetSt() *google_protobuf2.Struct { + if m != nil { + return m.St + } + return nil +} + +func (m *KnownTypes) GetTs() *google_protobuf3.Timestamp { + if m != nil { + return m.Ts + } + return nil +} + +func (m *KnownTypes) GetLv() *google_protobuf2.ListValue { + if m != nil { + return m.Lv + } + return nil +} + +func (m *KnownTypes) GetVal() *google_protobuf2.Value { + if m != nil { + return m.Val + } + return nil +} + +func (m *KnownTypes) GetDbl() *google_protobuf4.DoubleValue { + if m != nil { + return m.Dbl + } + return nil +} + +func (m *KnownTypes) GetFlt() *google_protobuf4.FloatValue { + if m != nil { + return m.Flt + } + return nil +} + +func (m *KnownTypes) GetI64() *google_protobuf4.Int64Value { + if m != nil { + return m.I64 + } + return nil +} + +func (m *KnownTypes) GetU64() *google_protobuf4.UInt64Value { + if m != nil { + return m.U64 + } + return nil +} + +func (m *KnownTypes) GetI32() *google_protobuf4.Int32Value { + if m != nil { + return m.I32 + } + return nil +} + +func (m *KnownTypes) GetU32() *google_protobuf4.UInt32Value { + if m != nil { + return m.U32 + } + return nil +} + +func (m *KnownTypes) GetBool() *google_protobuf4.BoolValue { + if m != nil { + return m.Bool + } + return nil +} + +func (m *KnownTypes) GetStr() *google_protobuf4.StringValue { + if m != nil { + return m.Str + } + return nil +} + +func (m *KnownTypes) GetBytes() *google_protobuf4.BytesValue { + if m != nil { + return m.Bytes + } + return nil +} + +var E_Name = &proto.ExtensionDesc{ + ExtendedType: (*Real)(nil), + ExtensionType: (*string)(nil), + Field: 124, + Name: "jsonpb.name", + Tag: "bytes,124,opt,name=name", + Filename: "test_objects.proto", +} + +func init() { + proto.RegisterType((*Simple)(nil), "jsonpb.Simple") + proto.RegisterType((*NonFinites)(nil), "jsonpb.NonFinites") + proto.RegisterType((*Repeats)(nil), "jsonpb.Repeats") + proto.RegisterType((*Widget)(nil), "jsonpb.Widget") + proto.RegisterType((*Maps)(nil), "jsonpb.Maps") + proto.RegisterType((*MsgWithOneof)(nil), "jsonpb.MsgWithOneof") + proto.RegisterType((*Real)(nil), "jsonpb.Real") + proto.RegisterType((*Complex)(nil), "jsonpb.Complex") + proto.RegisterType((*KnownTypes)(nil), "jsonpb.KnownTypes") + proto.RegisterEnum("jsonpb.Widget_Color", Widget_Color_name, Widget_Color_value) + proto.RegisterExtension(E_Complex_RealExtension) + proto.RegisterExtension(E_Name) +} + +func init() { proto.RegisterFile("test_objects.proto", fileDescriptor1) } + +var fileDescriptor1 = []byte{ + // 1160 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x95, 0x41, 0x73, 0xdb, 0x44, + 0x14, 0xc7, 0x23, 0xc9, 0x92, 0xed, 0x75, 0x92, 0x9a, 0x6d, 0xda, 0x2a, 0x26, 0x80, 0xc6, 0x94, + 0x22, 0x0a, 0x75, 0x07, 0xc7, 0xe3, 0x61, 0x0a, 0x97, 0xa4, 0x71, 0x29, 0x43, 0x13, 0x98, 0x4d, + 0x43, 0x8f, 0x1e, 0x39, 0x5a, 0xbb, 0x2a, 0xf2, 0xae, 0x67, 0x77, 0x95, 0xd4, 0x03, 0x87, 0x9c, + 0x39, 0x32, 0x7c, 0x05, 0xf8, 0x08, 0x1c, 0xf8, 0x74, 0xcc, 0xdb, 0x95, 0xac, 0xc4, 0x8e, 0x4f, + 0xf1, 0x7b, 0xef, 0xff, 0xfe, 0x59, 0xed, 0x6f, 0x77, 0x1f, 0xc2, 0x8a, 0x4a, 0x35, 0xe4, 0xa3, + 0x77, 0xf4, 0x5c, 0xc9, 0xce, 0x4c, 0x70, 0xc5, 0xb1, 0xf7, 0x4e, 0x72, 0x36, 0x1b, 0xb5, 0x76, + 0x27, 0x9c, 0x4f, 0x52, 0xfa, 0x54, 0x67, 0x47, 0xd9, 0xf8, 0x69, 0xc4, 0xe6, 0x46, 0xd2, 0xfa, + 0x78, 0xb9, 0x14, 0x67, 0x22, 0x52, 0x09, 0x67, 0x79, 0x7d, 0x6f, 0xb9, 0x2e, 0x95, 0xc8, 0xce, + 0x55, 0x5e, 0xfd, 0x64, 0xb9, 0xaa, 0x92, 0x29, 0x95, 0x2a, 0x9a, 0xce, 0xd6, 0xd9, 0x5f, 0x8a, + 0x68, 0x36, 0xa3, 0x22, 0x5f, 0x61, 0xfb, 0x6f, 0x1b, 0x79, 0xa7, 0xc9, 0x74, 0x96, 0x52, 0x7c, + 0x0f, 0x79, 0x7c, 0x38, 0xe2, 0x3c, 0xf5, 0xad, 0xc0, 0x0a, 0x6b, 0xc4, 0xe5, 0x87, 0x9c, 0xa7, + 0xf8, 0x01, 0xaa, 0xf2, 0x61, 0xc2, 0xd4, 0x7e, 0xd7, 0xb7, 0x03, 0x2b, 0x74, 0x89, 0xc7, 0x7f, + 0x80, 0x68, 0x51, 0xe8, 0xf7, 0x7c, 0x27, 0xb0, 0x42, 0xc7, 0x14, 0xfa, 0x3d, 0xbc, 0x8b, 0x6a, + 0x7c, 0x98, 0x99, 0x96, 0x4a, 0x60, 0x85, 0x5b, 0xa4, 0xca, 0xcf, 0x74, 0x58, 0x96, 0xfa, 0x3d, + 0xdf, 0x0d, 0xac, 0xb0, 0x92, 0x97, 0x8a, 0x2e, 0x69, 0xba, 0xbc, 0xc0, 0x0a, 0x3f, 0x20, 0x55, + 0x7e, 0x7a, 0xad, 0x4b, 0x9a, 0xae, 0x6a, 0x60, 0x85, 0x38, 0x2f, 0xf5, 0x7b, 0x66, 0x11, 0xe3, + 0x94, 0x47, 0xca, 0xaf, 0x05, 0x56, 0x68, 0x13, 0x8f, 0xbf, 0x80, 0xc8, 0xf4, 0xc4, 0x3c, 0x1b, + 0xa5, 0xd4, 0xaf, 0x07, 0x56, 0x68, 0x91, 0x2a, 0x3f, 0xd2, 0x61, 0x6e, 0xa7, 0x44, 0xc2, 0x26, + 0x3e, 0x0a, 0xac, 0xb0, 0x0e, 0x76, 0x3a, 0x34, 0x76, 0xa3, 0xb9, 0xa2, 0xd2, 0x6f, 0x04, 0x56, + 0xb8, 0x49, 0x3c, 0x7e, 0x08, 0x51, 0xfb, 0x4f, 0x0b, 0xa1, 0x13, 0xce, 0x5e, 0x24, 0x2c, 0x51, + 0x54, 0xe2, 0xbb, 0xc8, 0x1d, 0x0f, 0x59, 0xc4, 0xf4, 0x56, 0xd9, 0xa4, 0x32, 0x3e, 0x89, 0x18, + 0x6c, 0xe0, 0x78, 0x38, 0x4b, 0xd8, 0x58, 0x6f, 0x94, 0x4d, 0xdc, 0xf1, 0xcf, 0x09, 0x1b, 0x9b, + 0x34, 0x83, 0xb4, 0x93, 0xa7, 0x4f, 0x20, 0x7d, 0x17, 0xb9, 0xb1, 0xb6, 0xa8, 0xe8, 0xd5, 0x55, + 0xe2, 0xdc, 0x22, 0x36, 0x16, 0xae, 0xce, 0xba, 0x71, 0x61, 0x11, 0x1b, 0x0b, 0x2f, 0x4f, 0x83, + 0x45, 0xfb, 0x1f, 0x1b, 0x55, 0x09, 0x9d, 0xd1, 0x48, 0x49, 0x90, 0x88, 0x82, 0x9e, 0x03, 0xf4, + 0x44, 0x41, 0x4f, 0x2c, 0xe8, 0x39, 0x40, 0x4f, 0x2c, 0xe8, 0x89, 0x05, 0x3d, 0x07, 0xe8, 0x89, + 0x05, 0x3d, 0x51, 0xd2, 0x73, 0x80, 0x9e, 0x28, 0xe9, 0x89, 0x92, 0x9e, 0x03, 0xf4, 0x44, 0x49, + 0x4f, 0x94, 0xf4, 0x1c, 0xa0, 0x27, 0x4e, 0xaf, 0x75, 0x2d, 0xe8, 0x39, 0x40, 0x4f, 0x94, 0xf4, + 0xc4, 0x82, 0x9e, 0x03, 0xf4, 0xc4, 0x82, 0x9e, 0x28, 0xe9, 0x39, 0x40, 0x4f, 0x94, 0xf4, 0x44, + 0x49, 0xcf, 0x01, 0x7a, 0xa2, 0xa4, 0x27, 0x16, 0xf4, 0x1c, 0xa0, 0x27, 0x0c, 0xbd, 0x7f, 0x6d, + 0xe4, 0xbd, 0x49, 0xe2, 0x09, 0x55, 0xf8, 0x31, 0x72, 0xcf, 0x79, 0xca, 0x85, 0x26, 0xb7, 0xdd, + 0xdd, 0xe9, 0x98, 0x2b, 0xda, 0x31, 0xe5, 0xce, 0x73, 0xa8, 0x11, 0x23, 0xc1, 0x4f, 0xc0, 0xcf, + 0xa8, 0x61, 0xf3, 0xd6, 0xa9, 0x3d, 0xa1, 0xff, 0xe2, 0x47, 0xc8, 0x93, 0xfa, 0x2a, 0xe9, 0x53, + 0xd5, 0xe8, 0x6e, 0x17, 0x6a, 0x73, 0xc1, 0x48, 0x5e, 0xc5, 0x5f, 0x98, 0x0d, 0xd1, 0x4a, 0x58, + 0xe7, 0xaa, 0x12, 0x36, 0x28, 0x97, 0x56, 0x85, 0x01, 0xec, 0xef, 0x68, 0xcf, 0x3b, 0x85, 0x32, + 0xe7, 0x4e, 0x8a, 0x3a, 0xfe, 0x0a, 0xd5, 0xc5, 0xb0, 0x10, 0xdf, 0xd3, 0xb6, 0x2b, 0xe2, 0x9a, + 0xc8, 0x7f, 0xb5, 0x3f, 0x43, 0xae, 0x59, 0x74, 0x15, 0x39, 0x64, 0x70, 0xd4, 0xdc, 0xc0, 0x75, + 0xe4, 0x7e, 0x4f, 0x06, 0x83, 0x93, 0xa6, 0x85, 0x6b, 0xa8, 0x72, 0xf8, 0xea, 0x6c, 0xd0, 0xb4, + 0xdb, 0x7f, 0xd9, 0xa8, 0x72, 0x1c, 0xcd, 0x24, 0xfe, 0x16, 0x35, 0xa6, 0xe6, 0xb8, 0xc0, 0xde, + 0xeb, 0x33, 0xd6, 0xe8, 0x7e, 0x58, 0xf8, 0x83, 0xa4, 0x73, 0xac, 0xcf, 0xcf, 0xa9, 0x12, 0x03, + 0xa6, 0xc4, 0x9c, 0xd4, 0xa7, 0x45, 0x8c, 0x0f, 0xd0, 0xd6, 0x54, 0x9f, 0xcd, 0xe2, 0xab, 0x6d, + 0xdd, 0xfe, 0xd1, 0xcd, 0x76, 0x38, 0xaf, 0xe6, 0xb3, 0x8d, 0x41, 0x63, 0x5a, 0x66, 0x5a, 0xdf, + 0xa1, 0xed, 0x9b, 0xfe, 0xb8, 0x89, 0x9c, 0x5f, 0xe9, 0x5c, 0x63, 0x74, 0x08, 0xfc, 0xc4, 0x3b, + 0xc8, 0xbd, 0x88, 0xd2, 0x8c, 0xea, 0xeb, 0x57, 0x27, 0x26, 0x78, 0x66, 0x7f, 0x63, 0xb5, 0x4e, + 0x50, 0x73, 0xd9, 0xfe, 0x7a, 0x7f, 0xcd, 0xf4, 0x3f, 0xbc, 0xde, 0xbf, 0x0a, 0xa5, 0xf4, 0x6b, + 0xff, 0x61, 0xa1, 0xcd, 0x63, 0x39, 0x79, 0x93, 0xa8, 0xb7, 0x3f, 0x31, 0xca, 0xc7, 0xf8, 0x3e, + 0x72, 0x55, 0xa2, 0x52, 0xaa, 0xed, 0xea, 0x2f, 0x37, 0x88, 0x09, 0xb1, 0x8f, 0x3c, 0x19, 0xa5, + 0x91, 0x98, 0x6b, 0x4f, 0xe7, 0xe5, 0x06, 0xc9, 0x63, 0xdc, 0x42, 0xd5, 0xe7, 0x3c, 0x83, 0x95, + 0xe8, 0x67, 0x01, 0x7a, 0x8a, 0x04, 0xfe, 0x14, 0x6d, 0xbe, 0xe5, 0x53, 0x3a, 0x8c, 0xe2, 0x58, + 0x50, 0x29, 0xf5, 0x0b, 0x01, 0x82, 0x06, 0x64, 0x0f, 0x4c, 0xf2, 0xb0, 0x8a, 0xdc, 0x8c, 0x25, + 0x9c, 0xb5, 0x1f, 0xa1, 0x0a, 0xa1, 0x51, 0x5a, 0x7e, 0xbe, 0x65, 0xde, 0x08, 0x1d, 0x3c, 0xae, + 0xd5, 0xe2, 0xe6, 0xd5, 0xd5, 0xd5, 0x95, 0xdd, 0xbe, 0x84, 0xff, 0x08, 0x5f, 0xf2, 0x1e, 0xef, + 0xa1, 0x7a, 0x32, 0x8d, 0x26, 0x09, 0x83, 0x95, 0x19, 0x79, 0x99, 0x28, 0x5b, 0xba, 0x47, 0x68, + 0x5b, 0xd0, 0x28, 0x1d, 0xd2, 0xf7, 0x8a, 0x32, 0x99, 0x70, 0x86, 0x37, 0xcb, 0x23, 0x15, 0xa5, + 0xfe, 0x6f, 0x37, 0xcf, 0x64, 0x6e, 0x4f, 0xb6, 0xa0, 0x69, 0x50, 0xf4, 0xb4, 0xff, 0x73, 0x11, + 0xfa, 0x91, 0xf1, 0x4b, 0xf6, 0x7a, 0x3e, 0xa3, 0x12, 0x3f, 0x44, 0x76, 0xc4, 0xfc, 0x6d, 0xdd, + 0xba, 0xd3, 0x31, 0xf3, 0xa9, 0x53, 0xcc, 0xa7, 0xce, 0x01, 0x9b, 0x13, 0x3b, 0x62, 0xf8, 0x4b, + 0xe4, 0xc4, 0x99, 0xb9, 0xa5, 0x8d, 0xee, 0xee, 0x8a, 0xec, 0x28, 0x9f, 0x92, 0x04, 0x54, 0xf8, + 0x73, 0x64, 0x4b, 0xe5, 0x6f, 0x6a, 0xed, 0x83, 0x15, 0xed, 0xa9, 0x9e, 0x98, 0xc4, 0x96, 0x70, + 0xfb, 0x6d, 0x25, 0x73, 0xbe, 0xad, 0x15, 0xe1, 0xeb, 0x62, 0x78, 0x12, 0x5b, 0x49, 0xd0, 0xa6, + 0x17, 0xfe, 0x9d, 0x35, 0xda, 0x57, 0x89, 0x54, 0xbf, 0xc0, 0x0e, 0x13, 0x3b, 0xbd, 0xc0, 0x21, + 0x72, 0x2e, 0xa2, 0xd4, 0x6f, 0x6a, 0xf1, 0xfd, 0x15, 0xb1, 0x11, 0x82, 0x04, 0x77, 0x90, 0x13, + 0x8f, 0x52, 0xcd, 0xbc, 0xd1, 0xdd, 0x5b, 0xfd, 0x2e, 0xfd, 0xc8, 0xe5, 0xfa, 0x78, 0x94, 0xe2, + 0x27, 0xc8, 0x19, 0xa7, 0x4a, 0x1f, 0x01, 0xb8, 0x70, 0xcb, 0x7a, 0xfd, 0x5c, 0xe6, 0xf2, 0x71, + 0xaa, 0x40, 0x9e, 0xe4, 0xb3, 0xf5, 0x36, 0xb9, 0xbe, 0x42, 0xb9, 0x3c, 0xe9, 0xf7, 0x60, 0x35, + 0x59, 0xbf, 0xa7, 0xa7, 0xca, 0x6d, 0xab, 0x39, 0xbb, 0xae, 0xcf, 0xfa, 0x3d, 0x6d, 0xbf, 0xdf, + 0xd5, 0x43, 0x78, 0x8d, 0xfd, 0x7e, 0xb7, 0xb0, 0xdf, 0xef, 0x6a, 0xfb, 0xfd, 0xae, 0x9e, 0xcc, + 0xeb, 0xec, 0x17, 0xfa, 0x4c, 0xeb, 0x2b, 0x7a, 0x84, 0xd5, 0xd7, 0x6c, 0x3a, 0xdc, 0x61, 0x23, + 0xd7, 0x3a, 0xf0, 0x87, 0xd7, 0x08, 0xad, 0xf1, 0x37, 0x63, 0x21, 0xf7, 0x97, 0x4a, 0xe0, 0xaf, + 0x91, 0x5b, 0x0e, 0xf7, 0xdb, 0x3e, 0x40, 0x8f, 0x0b, 0xd3, 0x60, 0x94, 0xcf, 0x02, 0x54, 0x61, + 0xd1, 0x94, 0x2e, 0x1d, 0xfc, 0xdf, 0xf5, 0x0b, 0xa3, 0x2b, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, + 0xd5, 0x39, 0x32, 0x09, 0xf9, 0x09, 0x00, 0x00, +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/test_objects.proto b/example/prometheus-mock/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/test_objects.proto new file mode 100644 index 0000000..0d2fc1f --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/test_objects.proto @@ -0,0 +1,147 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2015 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto2"; + +import "google/protobuf/any.proto"; +import "google/protobuf/duration.proto"; +import "google/protobuf/struct.proto"; +import "google/protobuf/timestamp.proto"; +import "google/protobuf/wrappers.proto"; + +package jsonpb; + +// Test message for holding primitive types. +message Simple { + optional bool o_bool = 1; + optional int32 o_int32 = 2; + optional int64 o_int64 = 3; + optional uint32 o_uint32 = 4; + optional uint64 o_uint64 = 5; + optional sint32 o_sint32 = 6; + optional sint64 o_sint64 = 7; + optional float o_float = 8; + optional double o_double = 9; + optional string o_string = 10; + optional bytes o_bytes = 11; +} + +// Test message for holding special non-finites primitives. +message NonFinites { + optional float f_nan = 1; + optional float f_pinf = 2; + optional float f_ninf = 3; + optional double d_nan = 4; + optional double d_pinf = 5; + optional double d_ninf = 6; +} + +// Test message for holding repeated primitives. +message Repeats { + repeated bool r_bool = 1; + repeated int32 r_int32 = 2; + repeated int64 r_int64 = 3; + repeated uint32 r_uint32 = 4; + repeated uint64 r_uint64 = 5; + repeated sint32 r_sint32 = 6; + repeated sint64 r_sint64 = 7; + repeated float r_float = 8; + repeated double r_double = 9; + repeated string r_string = 10; + repeated bytes r_bytes = 11; +} + +// Test message for holding enums and nested messages. +message Widget { + enum Color { + RED = 0; + GREEN = 1; + BLUE = 2; + }; + optional Color color = 1; + repeated Color r_color = 2; + + optional Simple simple = 10; + repeated Simple r_simple = 11; + + optional Repeats repeats = 20; + repeated Repeats r_repeats = 21; +} + +message Maps { + map m_int64_str = 1; + map m_bool_simple = 2; +} + +message MsgWithOneof { + oneof union { + string title = 1; + int64 salary = 2; + string Country = 3; + string home_address = 4; + } +} + +message Real { + optional double value = 1; + extensions 100 to max; +} + +extend Real { + optional string name = 124; +} + +message Complex { + extend Real { + optional Complex real_extension = 123; + } + optional double imaginary = 1; + extensions 100 to max; +} + +message KnownTypes { + optional google.protobuf.Any an = 14; + optional google.protobuf.Duration dur = 1; + optional google.protobuf.Struct st = 12; + optional google.protobuf.Timestamp ts = 2; + optional google.protobuf.ListValue lv = 15; + optional google.protobuf.Value val = 16; + + optional google.protobuf.DoubleValue dbl = 3; + optional google.protobuf.FloatValue flt = 4; + optional google.protobuf.Int64Value i64 = 5; + optional google.protobuf.UInt64Value u64 = 6; + optional google.protobuf.Int32Value i32 = 7; + optional google.protobuf.UInt32Value u32 = 8; + optional google.protobuf.BoolValue bool = 9; + optional google.protobuf.StringValue str = 10; + optional google.protobuf.BytesValue bytes = 11; +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/Makefile b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/Makefile new file mode 100644 index 0000000..e2e0651 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/Makefile @@ -0,0 +1,43 @@ +# Go support for Protocol Buffers - Google's data interchange format +# +# Copyright 2010 The Go Authors. All rights reserved. +# https://github.com/golang/protobuf +# +# 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. + +install: + go install + +test: install generate-test-pbs + go test + + +generate-test-pbs: + make install + make -C testdata + protoc --go_out=Mtestdata/test.proto=github.com/golang/protobuf/proto/testdata,Mgoogle/protobuf/any.proto=github.com/golang/protobuf/ptypes/any:. proto3_proto/proto3.proto + make diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/all_test.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/all_test.go new file mode 100644 index 0000000..41451a4 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/all_test.go @@ -0,0 +1,2278 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package proto_test + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "math" + "math/rand" + "reflect" + "runtime/debug" + "strings" + "testing" + "time" + + . "github.com/golang/protobuf/proto" + . "github.com/golang/protobuf/proto/testdata" +) + +var globalO *Buffer + +func old() *Buffer { + if globalO == nil { + globalO = NewBuffer(nil) + } + globalO.Reset() + return globalO +} + +func equalbytes(b1, b2 []byte, t *testing.T) { + if len(b1) != len(b2) { + t.Errorf("wrong lengths: 2*%d != %d", len(b1), len(b2)) + return + } + for i := 0; i < len(b1); i++ { + if b1[i] != b2[i] { + t.Errorf("bad byte[%d]:%x %x: %s %s", i, b1[i], b2[i], b1, b2) + } + } +} + +func initGoTestField() *GoTestField { + f := new(GoTestField) + f.Label = String("label") + f.Type = String("type") + return f +} + +// These are all structurally equivalent but the tag numbers differ. +// (It's remarkable that required, optional, and repeated all have +// 8 letters.) +func initGoTest_RequiredGroup() *GoTest_RequiredGroup { + return &GoTest_RequiredGroup{ + RequiredField: String("required"), + } +} + +func initGoTest_OptionalGroup() *GoTest_OptionalGroup { + return &GoTest_OptionalGroup{ + RequiredField: String("optional"), + } +} + +func initGoTest_RepeatedGroup() *GoTest_RepeatedGroup { + return &GoTest_RepeatedGroup{ + RequiredField: String("repeated"), + } +} + +func initGoTest(setdefaults bool) *GoTest { + pb := new(GoTest) + if setdefaults { + pb.F_BoolDefaulted = Bool(Default_GoTest_F_BoolDefaulted) + pb.F_Int32Defaulted = Int32(Default_GoTest_F_Int32Defaulted) + pb.F_Int64Defaulted = Int64(Default_GoTest_F_Int64Defaulted) + pb.F_Fixed32Defaulted = Uint32(Default_GoTest_F_Fixed32Defaulted) + pb.F_Fixed64Defaulted = Uint64(Default_GoTest_F_Fixed64Defaulted) + pb.F_Uint32Defaulted = Uint32(Default_GoTest_F_Uint32Defaulted) + pb.F_Uint64Defaulted = Uint64(Default_GoTest_F_Uint64Defaulted) + pb.F_FloatDefaulted = Float32(Default_GoTest_F_FloatDefaulted) + pb.F_DoubleDefaulted = Float64(Default_GoTest_F_DoubleDefaulted) + pb.F_StringDefaulted = String(Default_GoTest_F_StringDefaulted) + pb.F_BytesDefaulted = Default_GoTest_F_BytesDefaulted + pb.F_Sint32Defaulted = Int32(Default_GoTest_F_Sint32Defaulted) + pb.F_Sint64Defaulted = Int64(Default_GoTest_F_Sint64Defaulted) + } + + pb.Kind = GoTest_TIME.Enum() + pb.RequiredField = initGoTestField() + pb.F_BoolRequired = Bool(true) + pb.F_Int32Required = Int32(3) + pb.F_Int64Required = Int64(6) + pb.F_Fixed32Required = Uint32(32) + pb.F_Fixed64Required = Uint64(64) + pb.F_Uint32Required = Uint32(3232) + pb.F_Uint64Required = Uint64(6464) + pb.F_FloatRequired = Float32(3232) + pb.F_DoubleRequired = Float64(6464) + pb.F_StringRequired = String("string") + pb.F_BytesRequired = []byte("bytes") + pb.F_Sint32Required = Int32(-32) + pb.F_Sint64Required = Int64(-64) + pb.Requiredgroup = initGoTest_RequiredGroup() + + return pb +} + +func fail(msg string, b *bytes.Buffer, s string, t *testing.T) { + data := b.Bytes() + ld := len(data) + ls := len(s) / 2 + + fmt.Printf("fail %s ld=%d ls=%d\n", msg, ld, ls) + + // find the interesting spot - n + n := ls + if ld < ls { + n = ld + } + j := 0 + for i := 0; i < n; i++ { + bs := hex(s[j])*16 + hex(s[j+1]) + j += 2 + if data[i] == bs { + continue + } + n = i + break + } + l := n - 10 + if l < 0 { + l = 0 + } + h := n + 10 + + // find the interesting spot - n + fmt.Printf("is[%d]:", l) + for i := l; i < h; i++ { + if i >= ld { + fmt.Printf(" --") + continue + } + fmt.Printf(" %.2x", data[i]) + } + fmt.Printf("\n") + + fmt.Printf("sb[%d]:", l) + for i := l; i < h; i++ { + if i >= ls { + fmt.Printf(" --") + continue + } + bs := hex(s[j])*16 + hex(s[j+1]) + j += 2 + fmt.Printf(" %.2x", bs) + } + fmt.Printf("\n") + + t.Fail() + + // t.Errorf("%s: \ngood: %s\nbad: %x", msg, s, b.Bytes()) + // Print the output in a partially-decoded format; can + // be helpful when updating the test. It produces the output + // that is pasted, with minor edits, into the argument to verify(). + // data := b.Bytes() + // nesting := 0 + // for b.Len() > 0 { + // start := len(data) - b.Len() + // var u uint64 + // u, err := DecodeVarint(b) + // if err != nil { + // fmt.Printf("decode error on varint:", err) + // return + // } + // wire := u & 0x7 + // tag := u >> 3 + // switch wire { + // case WireVarint: + // v, err := DecodeVarint(b) + // if err != nil { + // fmt.Printf("decode error on varint:", err) + // return + // } + // fmt.Printf("\t\t\"%x\" // field %d, encoding %d, value %d\n", + // data[start:len(data)-b.Len()], tag, wire, v) + // case WireFixed32: + // v, err := DecodeFixed32(b) + // if err != nil { + // fmt.Printf("decode error on fixed32:", err) + // return + // } + // fmt.Printf("\t\t\"%x\" // field %d, encoding %d, value %d\n", + // data[start:len(data)-b.Len()], tag, wire, v) + // case WireFixed64: + // v, err := DecodeFixed64(b) + // if err != nil { + // fmt.Printf("decode error on fixed64:", err) + // return + // } + // fmt.Printf("\t\t\"%x\" // field %d, encoding %d, value %d\n", + // data[start:len(data)-b.Len()], tag, wire, v) + // case WireBytes: + // nb, err := DecodeVarint(b) + // if err != nil { + // fmt.Printf("decode error on bytes:", err) + // return + // } + // after_tag := len(data) - b.Len() + // str := make([]byte, nb) + // _, err = b.Read(str) + // if err != nil { + // fmt.Printf("decode error on bytes:", err) + // return + // } + // fmt.Printf("\t\t\"%x\" \"%x\" // field %d, encoding %d (FIELD)\n", + // data[start:after_tag], str, tag, wire) + // case WireStartGroup: + // nesting++ + // fmt.Printf("\t\t\"%x\"\t\t// start group field %d level %d\n", + // data[start:len(data)-b.Len()], tag, nesting) + // case WireEndGroup: + // fmt.Printf("\t\t\"%x\"\t\t// end group field %d level %d\n", + // data[start:len(data)-b.Len()], tag, nesting) + // nesting-- + // default: + // fmt.Printf("unrecognized wire type %d\n", wire) + // return + // } + // } +} + +func hex(c uint8) uint8 { + if '0' <= c && c <= '9' { + return c - '0' + } + if 'a' <= c && c <= 'f' { + return 10 + c - 'a' + } + if 'A' <= c && c <= 'F' { + return 10 + c - 'A' + } + return 0 +} + +func equal(b []byte, s string, t *testing.T) bool { + if 2*len(b) != len(s) { + // fail(fmt.Sprintf("wrong lengths: 2*%d != %d", len(b), len(s)), b, s, t) + fmt.Printf("wrong lengths: 2*%d != %d\n", len(b), len(s)) + return false + } + for i, j := 0, 0; i < len(b); i, j = i+1, j+2 { + x := hex(s[j])*16 + hex(s[j+1]) + if b[i] != x { + // fail(fmt.Sprintf("bad byte[%d]:%x %x", i, b[i], x), b, s, t) + fmt.Printf("bad byte[%d]:%x %x", i, b[i], x) + return false + } + } + return true +} + +func overify(t *testing.T, pb *GoTest, expected string) { + o := old() + err := o.Marshal(pb) + if err != nil { + fmt.Printf("overify marshal-1 err = %v", err) + o.DebugPrint("", o.Bytes()) + t.Fatalf("expected = %s", expected) + } + if !equal(o.Bytes(), expected, t) { + o.DebugPrint("overify neq 1", o.Bytes()) + t.Fatalf("expected = %s", expected) + } + + // Now test Unmarshal by recreating the original buffer. + pbd := new(GoTest) + err = o.Unmarshal(pbd) + if err != nil { + t.Fatalf("overify unmarshal err = %v", err) + o.DebugPrint("", o.Bytes()) + t.Fatalf("string = %s", expected) + } + o.Reset() + err = o.Marshal(pbd) + if err != nil { + t.Errorf("overify marshal-2 err = %v", err) + o.DebugPrint("", o.Bytes()) + t.Fatalf("string = %s", expected) + } + if !equal(o.Bytes(), expected, t) { + o.DebugPrint("overify neq 2", o.Bytes()) + t.Fatalf("string = %s", expected) + } +} + +// Simple tests for numeric encode/decode primitives (varint, etc.) +func TestNumericPrimitives(t *testing.T) { + for i := uint64(0); i < 1e6; i += 111 { + o := old() + if o.EncodeVarint(i) != nil { + t.Error("EncodeVarint") + break + } + x, e := o.DecodeVarint() + if e != nil { + t.Fatal("DecodeVarint") + } + if x != i { + t.Fatal("varint decode fail:", i, x) + } + + o = old() + if o.EncodeFixed32(i) != nil { + t.Fatal("encFixed32") + } + x, e = o.DecodeFixed32() + if e != nil { + t.Fatal("decFixed32") + } + if x != i { + t.Fatal("fixed32 decode fail:", i, x) + } + + o = old() + if o.EncodeFixed64(i*1234567) != nil { + t.Error("encFixed64") + break + } + x, e = o.DecodeFixed64() + if e != nil { + t.Error("decFixed64") + break + } + if x != i*1234567 { + t.Error("fixed64 decode fail:", i*1234567, x) + break + } + + o = old() + i32 := int32(i - 12345) + if o.EncodeZigzag32(uint64(i32)) != nil { + t.Fatal("EncodeZigzag32") + } + x, e = o.DecodeZigzag32() + if e != nil { + t.Fatal("DecodeZigzag32") + } + if x != uint64(uint32(i32)) { + t.Fatal("zigzag32 decode fail:", i32, x) + } + + o = old() + i64 := int64(i - 12345) + if o.EncodeZigzag64(uint64(i64)) != nil { + t.Fatal("EncodeZigzag64") + } + x, e = o.DecodeZigzag64() + if e != nil { + t.Fatal("DecodeZigzag64") + } + if x != uint64(i64) { + t.Fatal("zigzag64 decode fail:", i64, x) + } + } +} + +// fakeMarshaler is a simple struct implementing Marshaler and Message interfaces. +type fakeMarshaler struct { + b []byte + err error +} + +func (f *fakeMarshaler) Marshal() ([]byte, error) { return f.b, f.err } +func (f *fakeMarshaler) String() string { return fmt.Sprintf("Bytes: %v Error: %v", f.b, f.err) } +func (f *fakeMarshaler) ProtoMessage() {} +func (f *fakeMarshaler) Reset() {} + +type msgWithFakeMarshaler struct { + M *fakeMarshaler `protobuf:"bytes,1,opt,name=fake"` +} + +func (m *msgWithFakeMarshaler) String() string { return CompactTextString(m) } +func (m *msgWithFakeMarshaler) ProtoMessage() {} +func (m *msgWithFakeMarshaler) Reset() {} + +// Simple tests for proto messages that implement the Marshaler interface. +func TestMarshalerEncoding(t *testing.T) { + tests := []struct { + name string + m Message + want []byte + errType reflect.Type + }{ + { + name: "Marshaler that fails", + m: &fakeMarshaler{ + err: errors.New("some marshal err"), + b: []byte{5, 6, 7}, + }, + // Since the Marshal method returned bytes, they should be written to the + // buffer. (For efficiency, we assume that Marshal implementations are + // always correct w.r.t. RequiredNotSetError and output.) + want: []byte{5, 6, 7}, + errType: reflect.TypeOf(errors.New("some marshal err")), + }, + { + name: "Marshaler that fails with RequiredNotSetError", + m: &msgWithFakeMarshaler{ + M: &fakeMarshaler{ + err: &RequiredNotSetError{}, + b: []byte{5, 6, 7}, + }, + }, + // Since there's an error that can be continued after, + // the buffer should be written. + want: []byte{ + 10, 3, // for &msgWithFakeMarshaler + 5, 6, 7, // for &fakeMarshaler + }, + errType: reflect.TypeOf(&RequiredNotSetError{}), + }, + { + name: "Marshaler that succeeds", + m: &fakeMarshaler{ + b: []byte{0, 1, 2, 3, 4, 127, 255}, + }, + want: []byte{0, 1, 2, 3, 4, 127, 255}, + }, + } + for _, test := range tests { + b := NewBuffer(nil) + err := b.Marshal(test.m) + if reflect.TypeOf(err) != test.errType { + t.Errorf("%s: got err %T(%v) wanted %T", test.name, err, err, test.errType) + } + if !reflect.DeepEqual(test.want, b.Bytes()) { + t.Errorf("%s: got bytes %v wanted %v", test.name, b.Bytes(), test.want) + } + if size := Size(test.m); size != len(b.Bytes()) { + t.Errorf("%s: Size(_) = %v, but marshaled to %v bytes", test.name, size, len(b.Bytes())) + } + + m, mErr := Marshal(test.m) + if !bytes.Equal(b.Bytes(), m) { + t.Errorf("%s: Marshal returned %v, but (*Buffer).Marshal wrote %v", test.name, m, b.Bytes()) + } + if !reflect.DeepEqual(err, mErr) { + t.Errorf("%s: Marshal err = %q, but (*Buffer).Marshal returned %q", + test.name, fmt.Sprint(mErr), fmt.Sprint(err)) + } + } +} + +// Simple tests for bytes +func TestBytesPrimitives(t *testing.T) { + o := old() + bytes := []byte{'n', 'o', 'w', ' ', 'i', 's', ' ', 't', 'h', 'e', ' ', 't', 'i', 'm', 'e'} + if o.EncodeRawBytes(bytes) != nil { + t.Error("EncodeRawBytes") + } + decb, e := o.DecodeRawBytes(false) + if e != nil { + t.Error("DecodeRawBytes") + } + equalbytes(bytes, decb, t) +} + +// Simple tests for strings +func TestStringPrimitives(t *testing.T) { + o := old() + s := "now is the time" + if o.EncodeStringBytes(s) != nil { + t.Error("enc_string") + } + decs, e := o.DecodeStringBytes() + if e != nil { + t.Error("dec_string") + } + if s != decs { + t.Error("string encode/decode fail:", s, decs) + } +} + +// Do we catch the "required bit not set" case? +func TestRequiredBit(t *testing.T) { + o := old() + pb := new(GoTest) + err := o.Marshal(pb) + if err == nil { + t.Error("did not catch missing required fields") + } else if strings.Index(err.Error(), "Kind") < 0 { + t.Error("wrong error type:", err) + } +} + +// Check that all fields are nil. +// Clearly silly, and a residue from a more interesting test with an earlier, +// different initialization property, but it once caught a compiler bug so +// it lives. +func checkInitialized(pb *GoTest, t *testing.T) { + if pb.F_BoolDefaulted != nil { + t.Error("New or Reset did not set boolean:", *pb.F_BoolDefaulted) + } + if pb.F_Int32Defaulted != nil { + t.Error("New or Reset did not set int32:", *pb.F_Int32Defaulted) + } + if pb.F_Int64Defaulted != nil { + t.Error("New or Reset did not set int64:", *pb.F_Int64Defaulted) + } + if pb.F_Fixed32Defaulted != nil { + t.Error("New or Reset did not set fixed32:", *pb.F_Fixed32Defaulted) + } + if pb.F_Fixed64Defaulted != nil { + t.Error("New or Reset did not set fixed64:", *pb.F_Fixed64Defaulted) + } + if pb.F_Uint32Defaulted != nil { + t.Error("New or Reset did not set uint32:", *pb.F_Uint32Defaulted) + } + if pb.F_Uint64Defaulted != nil { + t.Error("New or Reset did not set uint64:", *pb.F_Uint64Defaulted) + } + if pb.F_FloatDefaulted != nil { + t.Error("New or Reset did not set float:", *pb.F_FloatDefaulted) + } + if pb.F_DoubleDefaulted != nil { + t.Error("New or Reset did not set double:", *pb.F_DoubleDefaulted) + } + if pb.F_StringDefaulted != nil { + t.Error("New or Reset did not set string:", *pb.F_StringDefaulted) + } + if pb.F_BytesDefaulted != nil { + t.Error("New or Reset did not set bytes:", string(pb.F_BytesDefaulted)) + } + if pb.F_Sint32Defaulted != nil { + t.Error("New or Reset did not set int32:", *pb.F_Sint32Defaulted) + } + if pb.F_Sint64Defaulted != nil { + t.Error("New or Reset did not set int64:", *pb.F_Sint64Defaulted) + } +} + +// Does Reset() reset? +func TestReset(t *testing.T) { + pb := initGoTest(true) + // muck with some values + pb.F_BoolDefaulted = Bool(false) + pb.F_Int32Defaulted = Int32(237) + pb.F_Int64Defaulted = Int64(12346) + pb.F_Fixed32Defaulted = Uint32(32000) + pb.F_Fixed64Defaulted = Uint64(666) + pb.F_Uint32Defaulted = Uint32(323232) + pb.F_Uint64Defaulted = nil + pb.F_FloatDefaulted = nil + pb.F_DoubleDefaulted = Float64(0) + pb.F_StringDefaulted = String("gotcha") + pb.F_BytesDefaulted = []byte("asdfasdf") + pb.F_Sint32Defaulted = Int32(123) + pb.F_Sint64Defaulted = Int64(789) + pb.Reset() + checkInitialized(pb, t) +} + +// All required fields set, no defaults provided. +func TestEncodeDecode1(t *testing.T) { + pb := initGoTest(false) + overify(t, pb, + "0807"+ // field 1, encoding 0, value 7 + "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) + "5001"+ // field 10, encoding 0, value 1 + "5803"+ // field 11, encoding 0, value 3 + "6006"+ // field 12, encoding 0, value 6 + "6d20000000"+ // field 13, encoding 5, value 0x20 + "714000000000000000"+ // field 14, encoding 1, value 0x40 + "78a019"+ // field 15, encoding 0, value 0xca0 = 3232 + "8001c032"+ // field 16, encoding 0, value 0x1940 = 6464 + "8d0100004a45"+ // field 17, encoding 5, value 3232.0 + "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 + "9a0106"+"737472696e67"+ // field 19, encoding 2, string "string" + "b304"+ // field 70, encoding 3, start group + "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" + "b404"+ // field 70, encoding 4, end group + "aa0605"+"6279746573"+ // field 101, encoding 2, string "bytes" + "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 + "b8067f") // field 103, encoding 0, 0x7f zigzag64 +} + +// All required fields set, defaults provided. +func TestEncodeDecode2(t *testing.T) { + pb := initGoTest(true) + overify(t, pb, + "0807"+ // field 1, encoding 0, value 7 + "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) + "5001"+ // field 10, encoding 0, value 1 + "5803"+ // field 11, encoding 0, value 3 + "6006"+ // field 12, encoding 0, value 6 + "6d20000000"+ // field 13, encoding 5, value 32 + "714000000000000000"+ // field 14, encoding 1, value 64 + "78a019"+ // field 15, encoding 0, value 3232 + "8001c032"+ // field 16, encoding 0, value 6464 + "8d0100004a45"+ // field 17, encoding 5, value 3232.0 + "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 + "9a0106"+"737472696e67"+ // field 19, encoding 2 string "string" + "c00201"+ // field 40, encoding 0, value 1 + "c80220"+ // field 41, encoding 0, value 32 + "d00240"+ // field 42, encoding 0, value 64 + "dd0240010000"+ // field 43, encoding 5, value 320 + "e1028002000000000000"+ // field 44, encoding 1, value 640 + "e8028019"+ // field 45, encoding 0, value 3200 + "f0028032"+ // field 46, encoding 0, value 6400 + "fd02e0659948"+ // field 47, encoding 5, value 314159.0 + "81030000000050971041"+ // field 48, encoding 1, value 271828.0 + "8a0310"+"68656c6c6f2c2022776f726c6421220a"+ // field 49, encoding 2 string "hello, \"world!\"\n" + "b304"+ // start group field 70 level 1 + "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" + "b404"+ // end group field 70 level 1 + "aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes" + "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 + "b8067f"+ // field 103, encoding 0, 0x7f zigzag64 + "8a1907"+"4269676e6f7365"+ // field 401, encoding 2, string "Bignose" + "90193f"+ // field 402, encoding 0, value 63 + "98197f") // field 403, encoding 0, value 127 + +} + +// All default fields set to their default value by hand +func TestEncodeDecode3(t *testing.T) { + pb := initGoTest(false) + pb.F_BoolDefaulted = Bool(true) + pb.F_Int32Defaulted = Int32(32) + pb.F_Int64Defaulted = Int64(64) + pb.F_Fixed32Defaulted = Uint32(320) + pb.F_Fixed64Defaulted = Uint64(640) + pb.F_Uint32Defaulted = Uint32(3200) + pb.F_Uint64Defaulted = Uint64(6400) + pb.F_FloatDefaulted = Float32(314159) + pb.F_DoubleDefaulted = Float64(271828) + pb.F_StringDefaulted = String("hello, \"world!\"\n") + pb.F_BytesDefaulted = []byte("Bignose") + pb.F_Sint32Defaulted = Int32(-32) + pb.F_Sint64Defaulted = Int64(-64) + + overify(t, pb, + "0807"+ // field 1, encoding 0, value 7 + "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) + "5001"+ // field 10, encoding 0, value 1 + "5803"+ // field 11, encoding 0, value 3 + "6006"+ // field 12, encoding 0, value 6 + "6d20000000"+ // field 13, encoding 5, value 32 + "714000000000000000"+ // field 14, encoding 1, value 64 + "78a019"+ // field 15, encoding 0, value 3232 + "8001c032"+ // field 16, encoding 0, value 6464 + "8d0100004a45"+ // field 17, encoding 5, value 3232.0 + "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 + "9a0106"+"737472696e67"+ // field 19, encoding 2 string "string" + "c00201"+ // field 40, encoding 0, value 1 + "c80220"+ // field 41, encoding 0, value 32 + "d00240"+ // field 42, encoding 0, value 64 + "dd0240010000"+ // field 43, encoding 5, value 320 + "e1028002000000000000"+ // field 44, encoding 1, value 640 + "e8028019"+ // field 45, encoding 0, value 3200 + "f0028032"+ // field 46, encoding 0, value 6400 + "fd02e0659948"+ // field 47, encoding 5, value 314159.0 + "81030000000050971041"+ // field 48, encoding 1, value 271828.0 + "8a0310"+"68656c6c6f2c2022776f726c6421220a"+ // field 49, encoding 2 string "hello, \"world!\"\n" + "b304"+ // start group field 70 level 1 + "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" + "b404"+ // end group field 70 level 1 + "aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes" + "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 + "b8067f"+ // field 103, encoding 0, 0x7f zigzag64 + "8a1907"+"4269676e6f7365"+ // field 401, encoding 2, string "Bignose" + "90193f"+ // field 402, encoding 0, value 63 + "98197f") // field 403, encoding 0, value 127 + +} + +// All required fields set, defaults provided, all non-defaulted optional fields have values. +func TestEncodeDecode4(t *testing.T) { + pb := initGoTest(true) + pb.Table = String("hello") + pb.Param = Int32(7) + pb.OptionalField = initGoTestField() + pb.F_BoolOptional = Bool(true) + pb.F_Int32Optional = Int32(32) + pb.F_Int64Optional = Int64(64) + pb.F_Fixed32Optional = Uint32(3232) + pb.F_Fixed64Optional = Uint64(6464) + pb.F_Uint32Optional = Uint32(323232) + pb.F_Uint64Optional = Uint64(646464) + pb.F_FloatOptional = Float32(32.) + pb.F_DoubleOptional = Float64(64.) + pb.F_StringOptional = String("hello") + pb.F_BytesOptional = []byte("Bignose") + pb.F_Sint32Optional = Int32(-32) + pb.F_Sint64Optional = Int64(-64) + pb.Optionalgroup = initGoTest_OptionalGroup() + + overify(t, pb, + "0807"+ // field 1, encoding 0, value 7 + "1205"+"68656c6c6f"+ // field 2, encoding 2, string "hello" + "1807"+ // field 3, encoding 0, value 7 + "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) + "320d"+"0a056c6162656c120474797065"+ // field 6, encoding 2 (GoTestField) + "5001"+ // field 10, encoding 0, value 1 + "5803"+ // field 11, encoding 0, value 3 + "6006"+ // field 12, encoding 0, value 6 + "6d20000000"+ // field 13, encoding 5, value 32 + "714000000000000000"+ // field 14, encoding 1, value 64 + "78a019"+ // field 15, encoding 0, value 3232 + "8001c032"+ // field 16, encoding 0, value 6464 + "8d0100004a45"+ // field 17, encoding 5, value 3232.0 + "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 + "9a0106"+"737472696e67"+ // field 19, encoding 2 string "string" + "f00101"+ // field 30, encoding 0, value 1 + "f80120"+ // field 31, encoding 0, value 32 + "800240"+ // field 32, encoding 0, value 64 + "8d02a00c0000"+ // field 33, encoding 5, value 3232 + "91024019000000000000"+ // field 34, encoding 1, value 6464 + "9802a0dd13"+ // field 35, encoding 0, value 323232 + "a002c0ba27"+ // field 36, encoding 0, value 646464 + "ad0200000042"+ // field 37, encoding 5, value 32.0 + "b1020000000000005040"+ // field 38, encoding 1, value 64.0 + "ba0205"+"68656c6c6f"+ // field 39, encoding 2, string "hello" + "c00201"+ // field 40, encoding 0, value 1 + "c80220"+ // field 41, encoding 0, value 32 + "d00240"+ // field 42, encoding 0, value 64 + "dd0240010000"+ // field 43, encoding 5, value 320 + "e1028002000000000000"+ // field 44, encoding 1, value 640 + "e8028019"+ // field 45, encoding 0, value 3200 + "f0028032"+ // field 46, encoding 0, value 6400 + "fd02e0659948"+ // field 47, encoding 5, value 314159.0 + "81030000000050971041"+ // field 48, encoding 1, value 271828.0 + "8a0310"+"68656c6c6f2c2022776f726c6421220a"+ // field 49, encoding 2 string "hello, \"world!\"\n" + "b304"+ // start group field 70 level 1 + "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" + "b404"+ // end group field 70 level 1 + "d305"+ // start group field 90 level 1 + "da0508"+"6f7074696f6e616c"+ // field 91, encoding 2, string "optional" + "d405"+ // end group field 90 level 1 + "aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes" + "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 + "b8067f"+ // field 103, encoding 0, 0x7f zigzag64 + "ea1207"+"4269676e6f7365"+ // field 301, encoding 2, string "Bignose" + "f0123f"+ // field 302, encoding 0, value 63 + "f8127f"+ // field 303, encoding 0, value 127 + "8a1907"+"4269676e6f7365"+ // field 401, encoding 2, string "Bignose" + "90193f"+ // field 402, encoding 0, value 63 + "98197f") // field 403, encoding 0, value 127 + +} + +// All required fields set, defaults provided, all repeated fields given two values. +func TestEncodeDecode5(t *testing.T) { + pb := initGoTest(true) + pb.RepeatedField = []*GoTestField{initGoTestField(), initGoTestField()} + pb.F_BoolRepeated = []bool{false, true} + pb.F_Int32Repeated = []int32{32, 33} + pb.F_Int64Repeated = []int64{64, 65} + pb.F_Fixed32Repeated = []uint32{3232, 3333} + pb.F_Fixed64Repeated = []uint64{6464, 6565} + pb.F_Uint32Repeated = []uint32{323232, 333333} + pb.F_Uint64Repeated = []uint64{646464, 656565} + pb.F_FloatRepeated = []float32{32., 33.} + pb.F_DoubleRepeated = []float64{64., 65.} + pb.F_StringRepeated = []string{"hello", "sailor"} + pb.F_BytesRepeated = [][]byte{[]byte("big"), []byte("nose")} + pb.F_Sint32Repeated = []int32{32, -32} + pb.F_Sint64Repeated = []int64{64, -64} + pb.Repeatedgroup = []*GoTest_RepeatedGroup{initGoTest_RepeatedGroup(), initGoTest_RepeatedGroup()} + + overify(t, pb, + "0807"+ // field 1, encoding 0, value 7 + "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) + "2a0d"+"0a056c6162656c120474797065"+ // field 5, encoding 2 (GoTestField) + "2a0d"+"0a056c6162656c120474797065"+ // field 5, encoding 2 (GoTestField) + "5001"+ // field 10, encoding 0, value 1 + "5803"+ // field 11, encoding 0, value 3 + "6006"+ // field 12, encoding 0, value 6 + "6d20000000"+ // field 13, encoding 5, value 32 + "714000000000000000"+ // field 14, encoding 1, value 64 + "78a019"+ // field 15, encoding 0, value 3232 + "8001c032"+ // field 16, encoding 0, value 6464 + "8d0100004a45"+ // field 17, encoding 5, value 3232.0 + "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 + "9a0106"+"737472696e67"+ // field 19, encoding 2 string "string" + "a00100"+ // field 20, encoding 0, value 0 + "a00101"+ // field 20, encoding 0, value 1 + "a80120"+ // field 21, encoding 0, value 32 + "a80121"+ // field 21, encoding 0, value 33 + "b00140"+ // field 22, encoding 0, value 64 + "b00141"+ // field 22, encoding 0, value 65 + "bd01a00c0000"+ // field 23, encoding 5, value 3232 + "bd01050d0000"+ // field 23, encoding 5, value 3333 + "c1014019000000000000"+ // field 24, encoding 1, value 6464 + "c101a519000000000000"+ // field 24, encoding 1, value 6565 + "c801a0dd13"+ // field 25, encoding 0, value 323232 + "c80195ac14"+ // field 25, encoding 0, value 333333 + "d001c0ba27"+ // field 26, encoding 0, value 646464 + "d001b58928"+ // field 26, encoding 0, value 656565 + "dd0100000042"+ // field 27, encoding 5, value 32.0 + "dd0100000442"+ // field 27, encoding 5, value 33.0 + "e1010000000000005040"+ // field 28, encoding 1, value 64.0 + "e1010000000000405040"+ // field 28, encoding 1, value 65.0 + "ea0105"+"68656c6c6f"+ // field 29, encoding 2, string "hello" + "ea0106"+"7361696c6f72"+ // field 29, encoding 2, string "sailor" + "c00201"+ // field 40, encoding 0, value 1 + "c80220"+ // field 41, encoding 0, value 32 + "d00240"+ // field 42, encoding 0, value 64 + "dd0240010000"+ // field 43, encoding 5, value 320 + "e1028002000000000000"+ // field 44, encoding 1, value 640 + "e8028019"+ // field 45, encoding 0, value 3200 + "f0028032"+ // field 46, encoding 0, value 6400 + "fd02e0659948"+ // field 47, encoding 5, value 314159.0 + "81030000000050971041"+ // field 48, encoding 1, value 271828.0 + "8a0310"+"68656c6c6f2c2022776f726c6421220a"+ // field 49, encoding 2 string "hello, \"world!\"\n" + "b304"+ // start group field 70 level 1 + "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" + "b404"+ // end group field 70 level 1 + "8305"+ // start group field 80 level 1 + "8a0508"+"7265706561746564"+ // field 81, encoding 2, string "repeated" + "8405"+ // end group field 80 level 1 + "8305"+ // start group field 80 level 1 + "8a0508"+"7265706561746564"+ // field 81, encoding 2, string "repeated" + "8405"+ // end group field 80 level 1 + "aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes" + "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 + "b8067f"+ // field 103, encoding 0, 0x7f zigzag64 + "ca0c03"+"626967"+ // field 201, encoding 2, string "big" + "ca0c04"+"6e6f7365"+ // field 201, encoding 2, string "nose" + "d00c40"+ // field 202, encoding 0, value 32 + "d00c3f"+ // field 202, encoding 0, value -32 + "d80c8001"+ // field 203, encoding 0, value 64 + "d80c7f"+ // field 203, encoding 0, value -64 + "8a1907"+"4269676e6f7365"+ // field 401, encoding 2, string "Bignose" + "90193f"+ // field 402, encoding 0, value 63 + "98197f") // field 403, encoding 0, value 127 + +} + +// All required fields set, all packed repeated fields given two values. +func TestEncodeDecode6(t *testing.T) { + pb := initGoTest(false) + pb.F_BoolRepeatedPacked = []bool{false, true} + pb.F_Int32RepeatedPacked = []int32{32, 33} + pb.F_Int64RepeatedPacked = []int64{64, 65} + pb.F_Fixed32RepeatedPacked = []uint32{3232, 3333} + pb.F_Fixed64RepeatedPacked = []uint64{6464, 6565} + pb.F_Uint32RepeatedPacked = []uint32{323232, 333333} + pb.F_Uint64RepeatedPacked = []uint64{646464, 656565} + pb.F_FloatRepeatedPacked = []float32{32., 33.} + pb.F_DoubleRepeatedPacked = []float64{64., 65.} + pb.F_Sint32RepeatedPacked = []int32{32, -32} + pb.F_Sint64RepeatedPacked = []int64{64, -64} + + overify(t, pb, + "0807"+ // field 1, encoding 0, value 7 + "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) + "5001"+ // field 10, encoding 0, value 1 + "5803"+ // field 11, encoding 0, value 3 + "6006"+ // field 12, encoding 0, value 6 + "6d20000000"+ // field 13, encoding 5, value 32 + "714000000000000000"+ // field 14, encoding 1, value 64 + "78a019"+ // field 15, encoding 0, value 3232 + "8001c032"+ // field 16, encoding 0, value 6464 + "8d0100004a45"+ // field 17, encoding 5, value 3232.0 + "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 + "9a0106"+"737472696e67"+ // field 19, encoding 2 string "string" + "9203020001"+ // field 50, encoding 2, 2 bytes, value 0, value 1 + "9a03022021"+ // field 51, encoding 2, 2 bytes, value 32, value 33 + "a203024041"+ // field 52, encoding 2, 2 bytes, value 64, value 65 + "aa0308"+ // field 53, encoding 2, 8 bytes + "a00c0000050d0000"+ // value 3232, value 3333 + "b20310"+ // field 54, encoding 2, 16 bytes + "4019000000000000a519000000000000"+ // value 6464, value 6565 + "ba0306"+ // field 55, encoding 2, 6 bytes + "a0dd1395ac14"+ // value 323232, value 333333 + "c20306"+ // field 56, encoding 2, 6 bytes + "c0ba27b58928"+ // value 646464, value 656565 + "ca0308"+ // field 57, encoding 2, 8 bytes + "0000004200000442"+ // value 32.0, value 33.0 + "d20310"+ // field 58, encoding 2, 16 bytes + "00000000000050400000000000405040"+ // value 64.0, value 65.0 + "b304"+ // start group field 70 level 1 + "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" + "b404"+ // end group field 70 level 1 + "aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes" + "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 + "b8067f"+ // field 103, encoding 0, 0x7f zigzag64 + "b21f02"+ // field 502, encoding 2, 2 bytes + "403f"+ // value 32, value -32 + "ba1f03"+ // field 503, encoding 2, 3 bytes + "80017f") // value 64, value -64 +} + +// Test that we can encode empty bytes fields. +func TestEncodeDecodeBytes1(t *testing.T) { + pb := initGoTest(false) + + // Create our bytes + pb.F_BytesRequired = []byte{} + pb.F_BytesRepeated = [][]byte{{}} + pb.F_BytesOptional = []byte{} + + d, err := Marshal(pb) + if err != nil { + t.Error(err) + } + + pbd := new(GoTest) + if err := Unmarshal(d, pbd); err != nil { + t.Error(err) + } + + if pbd.F_BytesRequired == nil || len(pbd.F_BytesRequired) != 0 { + t.Error("required empty bytes field is incorrect") + } + if pbd.F_BytesRepeated == nil || len(pbd.F_BytesRepeated) == 1 && pbd.F_BytesRepeated[0] == nil { + t.Error("repeated empty bytes field is incorrect") + } + if pbd.F_BytesOptional == nil || len(pbd.F_BytesOptional) != 0 { + t.Error("optional empty bytes field is incorrect") + } +} + +// Test that we encode nil-valued fields of a repeated bytes field correctly. +// Since entries in a repeated field cannot be nil, nil must mean empty value. +func TestEncodeDecodeBytes2(t *testing.T) { + pb := initGoTest(false) + + // Create our bytes + pb.F_BytesRepeated = [][]byte{nil} + + d, err := Marshal(pb) + if err != nil { + t.Error(err) + } + + pbd := new(GoTest) + if err := Unmarshal(d, pbd); err != nil { + t.Error(err) + } + + if len(pbd.F_BytesRepeated) != 1 || pbd.F_BytesRepeated[0] == nil { + t.Error("Unexpected value for repeated bytes field") + } +} + +// All required fields set, defaults provided, all repeated fields given two values. +func TestSkippingUnrecognizedFields(t *testing.T) { + o := old() + pb := initGoTestField() + + // Marshal it normally. + o.Marshal(pb) + + // Now new a GoSkipTest record. + skip := &GoSkipTest{ + SkipInt32: Int32(32), + SkipFixed32: Uint32(3232), + SkipFixed64: Uint64(6464), + SkipString: String("skipper"), + Skipgroup: &GoSkipTest_SkipGroup{ + GroupInt32: Int32(75), + GroupString: String("wxyz"), + }, + } + + // Marshal it into same buffer. + o.Marshal(skip) + + pbd := new(GoTestField) + o.Unmarshal(pbd) + + // The __unrecognized field should be a marshaling of GoSkipTest + skipd := new(GoSkipTest) + + o.SetBuf(pbd.XXX_unrecognized) + o.Unmarshal(skipd) + + if *skipd.SkipInt32 != *skip.SkipInt32 { + t.Error("skip int32", skipd.SkipInt32) + } + if *skipd.SkipFixed32 != *skip.SkipFixed32 { + t.Error("skip fixed32", skipd.SkipFixed32) + } + if *skipd.SkipFixed64 != *skip.SkipFixed64 { + t.Error("skip fixed64", skipd.SkipFixed64) + } + if *skipd.SkipString != *skip.SkipString { + t.Error("skip string", *skipd.SkipString) + } + if *skipd.Skipgroup.GroupInt32 != *skip.Skipgroup.GroupInt32 { + t.Error("skip group int32", skipd.Skipgroup.GroupInt32) + } + if *skipd.Skipgroup.GroupString != *skip.Skipgroup.GroupString { + t.Error("skip group string", *skipd.Skipgroup.GroupString) + } +} + +// Check that unrecognized fields of a submessage are preserved. +func TestSubmessageUnrecognizedFields(t *testing.T) { + nm := &NewMessage{ + Nested: &NewMessage_Nested{ + Name: String("Nigel"), + FoodGroup: String("carbs"), + }, + } + b, err := Marshal(nm) + if err != nil { + t.Fatalf("Marshal of NewMessage: %v", err) + } + + // Unmarshal into an OldMessage. + om := new(OldMessage) + if err := Unmarshal(b, om); err != nil { + t.Fatalf("Unmarshal to OldMessage: %v", err) + } + exp := &OldMessage{ + Nested: &OldMessage_Nested{ + Name: String("Nigel"), + // normal protocol buffer users should not do this + XXX_unrecognized: []byte("\x12\x05carbs"), + }, + } + if !Equal(om, exp) { + t.Errorf("om = %v, want %v", om, exp) + } + + // Clone the OldMessage. + om = Clone(om).(*OldMessage) + if !Equal(om, exp) { + t.Errorf("Clone(om) = %v, want %v", om, exp) + } + + // Marshal the OldMessage, then unmarshal it into an empty NewMessage. + if b, err = Marshal(om); err != nil { + t.Fatalf("Marshal of OldMessage: %v", err) + } + t.Logf("Marshal(%v) -> %q", om, b) + nm2 := new(NewMessage) + if err := Unmarshal(b, nm2); err != nil { + t.Fatalf("Unmarshal to NewMessage: %v", err) + } + if !Equal(nm, nm2) { + t.Errorf("NewMessage round-trip: %v => %v", nm, nm2) + } +} + +// Check that an int32 field can be upgraded to an int64 field. +func TestNegativeInt32(t *testing.T) { + om := &OldMessage{ + Num: Int32(-1), + } + b, err := Marshal(om) + if err != nil { + t.Fatalf("Marshal of OldMessage: %v", err) + } + + // Check the size. It should be 11 bytes; + // 1 for the field/wire type, and 10 for the negative number. + if len(b) != 11 { + t.Errorf("%v marshaled as %q, wanted 11 bytes", om, b) + } + + // Unmarshal into a NewMessage. + nm := new(NewMessage) + if err := Unmarshal(b, nm); err != nil { + t.Fatalf("Unmarshal to NewMessage: %v", err) + } + want := &NewMessage{ + Num: Int64(-1), + } + if !Equal(nm, want) { + t.Errorf("nm = %v, want %v", nm, want) + } +} + +// Check that we can grow an array (repeated field) to have many elements. +// This test doesn't depend only on our encoding; for variety, it makes sure +// we create, encode, and decode the correct contents explicitly. It's therefore +// a bit messier. +// This test also uses (and hence tests) the Marshal/Unmarshal functions +// instead of the methods. +func TestBigRepeated(t *testing.T) { + pb := initGoTest(true) + + // Create the arrays + const N = 50 // Internally the library starts much smaller. + pb.Repeatedgroup = make([]*GoTest_RepeatedGroup, N) + pb.F_Sint64Repeated = make([]int64, N) + pb.F_Sint32Repeated = make([]int32, N) + pb.F_BytesRepeated = make([][]byte, N) + pb.F_StringRepeated = make([]string, N) + pb.F_DoubleRepeated = make([]float64, N) + pb.F_FloatRepeated = make([]float32, N) + pb.F_Uint64Repeated = make([]uint64, N) + pb.F_Uint32Repeated = make([]uint32, N) + pb.F_Fixed64Repeated = make([]uint64, N) + pb.F_Fixed32Repeated = make([]uint32, N) + pb.F_Int64Repeated = make([]int64, N) + pb.F_Int32Repeated = make([]int32, N) + pb.F_BoolRepeated = make([]bool, N) + pb.RepeatedField = make([]*GoTestField, N) + + // Fill in the arrays with checkable values. + igtf := initGoTestField() + igtrg := initGoTest_RepeatedGroup() + for i := 0; i < N; i++ { + pb.Repeatedgroup[i] = igtrg + pb.F_Sint64Repeated[i] = int64(i) + pb.F_Sint32Repeated[i] = int32(i) + s := fmt.Sprint(i) + pb.F_BytesRepeated[i] = []byte(s) + pb.F_StringRepeated[i] = s + pb.F_DoubleRepeated[i] = float64(i) + pb.F_FloatRepeated[i] = float32(i) + pb.F_Uint64Repeated[i] = uint64(i) + pb.F_Uint32Repeated[i] = uint32(i) + pb.F_Fixed64Repeated[i] = uint64(i) + pb.F_Fixed32Repeated[i] = uint32(i) + pb.F_Int64Repeated[i] = int64(i) + pb.F_Int32Repeated[i] = int32(i) + pb.F_BoolRepeated[i] = i%2 == 0 + pb.RepeatedField[i] = igtf + } + + // Marshal. + buf, _ := Marshal(pb) + + // Now test Unmarshal by recreating the original buffer. + pbd := new(GoTest) + Unmarshal(buf, pbd) + + // Check the checkable values + for i := uint64(0); i < N; i++ { + if pbd.Repeatedgroup[i] == nil { // TODO: more checking? + t.Error("pbd.Repeatedgroup bad") + } + var x uint64 + x = uint64(pbd.F_Sint64Repeated[i]) + if x != i { + t.Error("pbd.F_Sint64Repeated bad", x, i) + } + x = uint64(pbd.F_Sint32Repeated[i]) + if x != i { + t.Error("pbd.F_Sint32Repeated bad", x, i) + } + s := fmt.Sprint(i) + equalbytes(pbd.F_BytesRepeated[i], []byte(s), t) + if pbd.F_StringRepeated[i] != s { + t.Error("pbd.F_Sint32Repeated bad", pbd.F_StringRepeated[i], i) + } + x = uint64(pbd.F_DoubleRepeated[i]) + if x != i { + t.Error("pbd.F_DoubleRepeated bad", x, i) + } + x = uint64(pbd.F_FloatRepeated[i]) + if x != i { + t.Error("pbd.F_FloatRepeated bad", x, i) + } + x = pbd.F_Uint64Repeated[i] + if x != i { + t.Error("pbd.F_Uint64Repeated bad", x, i) + } + x = uint64(pbd.F_Uint32Repeated[i]) + if x != i { + t.Error("pbd.F_Uint32Repeated bad", x, i) + } + x = pbd.F_Fixed64Repeated[i] + if x != i { + t.Error("pbd.F_Fixed64Repeated bad", x, i) + } + x = uint64(pbd.F_Fixed32Repeated[i]) + if x != i { + t.Error("pbd.F_Fixed32Repeated bad", x, i) + } + x = uint64(pbd.F_Int64Repeated[i]) + if x != i { + t.Error("pbd.F_Int64Repeated bad", x, i) + } + x = uint64(pbd.F_Int32Repeated[i]) + if x != i { + t.Error("pbd.F_Int32Repeated bad", x, i) + } + if pbd.F_BoolRepeated[i] != (i%2 == 0) { + t.Error("pbd.F_BoolRepeated bad", x, i) + } + if pbd.RepeatedField[i] == nil { // TODO: more checking? + t.Error("pbd.RepeatedField bad") + } + } +} + +// Verify we give a useful message when decoding to the wrong structure type. +func TestTypeMismatch(t *testing.T) { + pb1 := initGoTest(true) + + // Marshal + o := old() + o.Marshal(pb1) + + // Now Unmarshal it to the wrong type. + pb2 := initGoTestField() + err := o.Unmarshal(pb2) + if err == nil { + t.Error("expected error, got no error") + } else if !strings.Contains(err.Error(), "bad wiretype") { + t.Error("expected bad wiretype error, got", err) + } +} + +func encodeDecode(t *testing.T, in, out Message, msg string) { + buf, err := Marshal(in) + if err != nil { + t.Fatalf("failed marshaling %v: %v", msg, err) + } + if err := Unmarshal(buf, out); err != nil { + t.Fatalf("failed unmarshaling %v: %v", msg, err) + } +} + +func TestPackedNonPackedDecoderSwitching(t *testing.T) { + np, p := new(NonPackedTest), new(PackedTest) + + // non-packed -> packed + np.A = []int32{0, 1, 1, 2, 3, 5} + encodeDecode(t, np, p, "non-packed -> packed") + if !reflect.DeepEqual(np.A, p.B) { + t.Errorf("failed non-packed -> packed; np.A=%+v, p.B=%+v", np.A, p.B) + } + + // packed -> non-packed + np.Reset() + p.B = []int32{3, 1, 4, 1, 5, 9} + encodeDecode(t, p, np, "packed -> non-packed") + if !reflect.DeepEqual(p.B, np.A) { + t.Errorf("failed packed -> non-packed; p.B=%+v, np.A=%+v", p.B, np.A) + } +} + +func TestProto1RepeatedGroup(t *testing.T) { + pb := &MessageList{ + Message: []*MessageList_Message{ + { + Name: String("blah"), + Count: Int32(7), + }, + // NOTE: pb.Message[1] is a nil + nil, + }, + } + + o := old() + err := o.Marshal(pb) + if err == nil || !strings.Contains(err.Error(), "repeated field Message has nil") { + t.Fatalf("unexpected or no error when marshaling: %v", err) + } +} + +// Test that enums work. Checks for a bug introduced by making enums +// named types instead of int32: newInt32FromUint64 would crash with +// a type mismatch in reflect.PointTo. +func TestEnum(t *testing.T) { + pb := new(GoEnum) + pb.Foo = FOO_FOO1.Enum() + o := old() + if err := o.Marshal(pb); err != nil { + t.Fatal("error encoding enum:", err) + } + pb1 := new(GoEnum) + if err := o.Unmarshal(pb1); err != nil { + t.Fatal("error decoding enum:", err) + } + if *pb1.Foo != FOO_FOO1 { + t.Error("expected 7 but got ", *pb1.Foo) + } +} + +// Enum types have String methods. Check that enum fields can be printed. +// We don't care what the value actually is, just as long as it doesn't crash. +func TestPrintingNilEnumFields(t *testing.T) { + pb := new(GoEnum) + _ = fmt.Sprintf("%+v", pb) +} + +// Verify that absent required fields cause Marshal/Unmarshal to return errors. +func TestRequiredFieldEnforcement(t *testing.T) { + pb := new(GoTestField) + _, err := Marshal(pb) + if err == nil { + t.Error("marshal: expected error, got nil") + } else if _, ok := err.(*RequiredNotSetError); !ok || !strings.Contains(err.Error(), "Label") { + t.Errorf("marshal: bad error type: %v", err) + } + + // A slightly sneaky, yet valid, proto. It encodes the same required field twice, + // so simply counting the required fields is insufficient. + // field 1, encoding 2, value "hi" + buf := []byte("\x0A\x02hi\x0A\x02hi") + err = Unmarshal(buf, pb) + if err == nil { + t.Error("unmarshal: expected error, got nil") + } else if _, ok := err.(*RequiredNotSetError); !ok || !strings.Contains(err.Error(), "{Unknown}") { + t.Errorf("unmarshal: bad error type: %v", err) + } +} + +// Verify that absent required fields in groups cause Marshal/Unmarshal to return errors. +func TestRequiredFieldEnforcementGroups(t *testing.T) { + pb := &GoTestRequiredGroupField{Group: &GoTestRequiredGroupField_Group{}} + if _, err := Marshal(pb); err == nil { + t.Error("marshal: expected error, got nil") + } else if _, ok := err.(*RequiredNotSetError); !ok || !strings.Contains(err.Error(), "Group.Field") { + t.Errorf("marshal: bad error type: %v", err) + } + + buf := []byte{11, 12} + if err := Unmarshal(buf, pb); err == nil { + t.Error("unmarshal: expected error, got nil") + } else if _, ok := err.(*RequiredNotSetError); !ok || !strings.Contains(err.Error(), "Group.{Unknown}") { + t.Errorf("unmarshal: bad error type: %v", err) + } +} + +func TestTypedNilMarshal(t *testing.T) { + // A typed nil should return ErrNil and not crash. + { + var m *GoEnum + if _, err := Marshal(m); err != ErrNil { + t.Errorf("Marshal(%#v): got %v, want ErrNil", m, err) + } + } + + { + m := &Communique{Union: &Communique_Msg{nil}} + if _, err := Marshal(m); err == nil || err == ErrNil { + t.Errorf("Marshal(%#v): got %v, want errOneofHasNil", m, err) + } + } +} + +// A type that implements the Marshaler interface, but is not nillable. +type nonNillableInt uint64 + +func (nni nonNillableInt) Marshal() ([]byte, error) { + return EncodeVarint(uint64(nni)), nil +} + +type NNIMessage struct { + nni nonNillableInt +} + +func (*NNIMessage) Reset() {} +func (*NNIMessage) String() string { return "" } +func (*NNIMessage) ProtoMessage() {} + +// A type that implements the Marshaler interface and is nillable. +type nillableMessage struct { + x uint64 +} + +func (nm *nillableMessage) Marshal() ([]byte, error) { + return EncodeVarint(nm.x), nil +} + +type NMMessage struct { + nm *nillableMessage +} + +func (*NMMessage) Reset() {} +func (*NMMessage) String() string { return "" } +func (*NMMessage) ProtoMessage() {} + +// Verify a type that uses the Marshaler interface, but has a nil pointer. +func TestNilMarshaler(t *testing.T) { + // Try a struct with a Marshaler field that is nil. + // It should be directly marshable. + nmm := new(NMMessage) + if _, err := Marshal(nmm); err != nil { + t.Error("unexpected error marshaling nmm: ", err) + } + + // Try a struct with a Marshaler field that is not nillable. + nnim := new(NNIMessage) + nnim.nni = 7 + var _ Marshaler = nnim.nni // verify it is truly a Marshaler + if _, err := Marshal(nnim); err != nil { + t.Error("unexpected error marshaling nnim: ", err) + } +} + +func TestAllSetDefaults(t *testing.T) { + // Exercise SetDefaults with all scalar field types. + m := &Defaults{ + // NaN != NaN, so override that here. + F_Nan: Float32(1.7), + } + expected := &Defaults{ + F_Bool: Bool(true), + F_Int32: Int32(32), + F_Int64: Int64(64), + F_Fixed32: Uint32(320), + F_Fixed64: Uint64(640), + F_Uint32: Uint32(3200), + F_Uint64: Uint64(6400), + F_Float: Float32(314159), + F_Double: Float64(271828), + F_String: String(`hello, "world!"` + "\n"), + F_Bytes: []byte("Bignose"), + F_Sint32: Int32(-32), + F_Sint64: Int64(-64), + F_Enum: Defaults_GREEN.Enum(), + F_Pinf: Float32(float32(math.Inf(1))), + F_Ninf: Float32(float32(math.Inf(-1))), + F_Nan: Float32(1.7), + StrZero: String(""), + } + SetDefaults(m) + if !Equal(m, expected) { + t.Errorf("SetDefaults failed\n got %v\nwant %v", m, expected) + } +} + +func TestSetDefaultsWithSetField(t *testing.T) { + // Check that a set value is not overridden. + m := &Defaults{ + F_Int32: Int32(12), + } + SetDefaults(m) + if v := m.GetF_Int32(); v != 12 { + t.Errorf("m.FInt32 = %v, want 12", v) + } +} + +func TestSetDefaultsWithSubMessage(t *testing.T) { + m := &OtherMessage{ + Key: Int64(123), + Inner: &InnerMessage{ + Host: String("gopher"), + }, + } + expected := &OtherMessage{ + Key: Int64(123), + Inner: &InnerMessage{ + Host: String("gopher"), + Port: Int32(4000), + }, + } + SetDefaults(m) + if !Equal(m, expected) { + t.Errorf("\n got %v\nwant %v", m, expected) + } +} + +func TestSetDefaultsWithRepeatedSubMessage(t *testing.T) { + m := &MyMessage{ + RepInner: []*InnerMessage{{}}, + } + expected := &MyMessage{ + RepInner: []*InnerMessage{{ + Port: Int32(4000), + }}, + } + SetDefaults(m) + if !Equal(m, expected) { + t.Errorf("\n got %v\nwant %v", m, expected) + } +} + +func TestSetDefaultWithRepeatedNonMessage(t *testing.T) { + m := &MyMessage{ + Pet: []string{"turtle", "wombat"}, + } + expected := Clone(m) + SetDefaults(m) + if !Equal(m, expected) { + t.Errorf("\n got %v\nwant %v", m, expected) + } +} + +func TestMaximumTagNumber(t *testing.T) { + m := &MaxTag{ + LastField: String("natural goat essence"), + } + buf, err := Marshal(m) + if err != nil { + t.Fatalf("proto.Marshal failed: %v", err) + } + m2 := new(MaxTag) + if err := Unmarshal(buf, m2); err != nil { + t.Fatalf("proto.Unmarshal failed: %v", err) + } + if got, want := m2.GetLastField(), *m.LastField; got != want { + t.Errorf("got %q, want %q", got, want) + } +} + +func TestJSON(t *testing.T) { + m := &MyMessage{ + Count: Int32(4), + Pet: []string{"bunny", "kitty"}, + Inner: &InnerMessage{ + Host: String("cauchy"), + }, + Bikeshed: MyMessage_GREEN.Enum(), + } + const expected = `{"count":4,"pet":["bunny","kitty"],"inner":{"host":"cauchy"},"bikeshed":1}` + + b, err := json.Marshal(m) + if err != nil { + t.Fatalf("json.Marshal failed: %v", err) + } + s := string(b) + if s != expected { + t.Errorf("got %s\nwant %s", s, expected) + } + + received := new(MyMessage) + if err := json.Unmarshal(b, received); err != nil { + t.Fatalf("json.Unmarshal failed: %v", err) + } + if !Equal(received, m) { + t.Fatalf("got %s, want %s", received, m) + } + + // Test unmarshalling of JSON with symbolic enum name. + const old = `{"count":4,"pet":["bunny","kitty"],"inner":{"host":"cauchy"},"bikeshed":"GREEN"}` + received.Reset() + if err := json.Unmarshal([]byte(old), received); err != nil { + t.Fatalf("json.Unmarshal failed: %v", err) + } + if !Equal(received, m) { + t.Fatalf("got %s, want %s", received, m) + } +} + +func TestBadWireType(t *testing.T) { + b := []byte{7<<3 | 6} // field 7, wire type 6 + pb := new(OtherMessage) + if err := Unmarshal(b, pb); err == nil { + t.Errorf("Unmarshal did not fail") + } else if !strings.Contains(err.Error(), "unknown wire type") { + t.Errorf("wrong error: %v", err) + } +} + +func TestBytesWithInvalidLength(t *testing.T) { + // If a byte sequence has an invalid (negative) length, Unmarshal should not panic. + b := []byte{2<<3 | WireBytes, 0xff, 0xff, 0xff, 0xff, 0xff, 0} + Unmarshal(b, new(MyMessage)) +} + +func TestLengthOverflow(t *testing.T) { + // Overflowing a length should not panic. + b := []byte{2<<3 | WireBytes, 1, 1, 3<<3 | WireBytes, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x01} + Unmarshal(b, new(MyMessage)) +} + +func TestVarintOverflow(t *testing.T) { + // Overflowing a 64-bit length should not be allowed. + b := []byte{1<<3 | WireVarint, 0x01, 3<<3 | WireBytes, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x01} + if err := Unmarshal(b, new(MyMessage)); err == nil { + t.Fatalf("Overflowed uint64 length without error") + } +} + +func TestUnmarshalFuzz(t *testing.T) { + const N = 1000 + seed := time.Now().UnixNano() + t.Logf("RNG seed is %d", seed) + rng := rand.New(rand.NewSource(seed)) + buf := make([]byte, 20) + for i := 0; i < N; i++ { + for j := range buf { + buf[j] = byte(rng.Intn(256)) + } + fuzzUnmarshal(t, buf) + } +} + +func TestMergeMessages(t *testing.T) { + pb := &MessageList{Message: []*MessageList_Message{{Name: String("x"), Count: Int32(1)}}} + data, err := Marshal(pb) + if err != nil { + t.Fatalf("Marshal: %v", err) + } + + pb1 := new(MessageList) + if err := Unmarshal(data, pb1); err != nil { + t.Fatalf("first Unmarshal: %v", err) + } + if err := Unmarshal(data, pb1); err != nil { + t.Fatalf("second Unmarshal: %v", err) + } + if len(pb1.Message) != 1 { + t.Errorf("two Unmarshals produced %d Messages, want 1", len(pb1.Message)) + } + + pb2 := new(MessageList) + if err := UnmarshalMerge(data, pb2); err != nil { + t.Fatalf("first UnmarshalMerge: %v", err) + } + if err := UnmarshalMerge(data, pb2); err != nil { + t.Fatalf("second UnmarshalMerge: %v", err) + } + if len(pb2.Message) != 2 { + t.Errorf("two UnmarshalMerges produced %d Messages, want 2", len(pb2.Message)) + } +} + +func TestExtensionMarshalOrder(t *testing.T) { + m := &MyMessage{Count: Int(123)} + if err := SetExtension(m, E_Ext_More, &Ext{Data: String("alpha")}); err != nil { + t.Fatalf("SetExtension: %v", err) + } + if err := SetExtension(m, E_Ext_Text, String("aleph")); err != nil { + t.Fatalf("SetExtension: %v", err) + } + if err := SetExtension(m, E_Ext_Number, Int32(1)); err != nil { + t.Fatalf("SetExtension: %v", err) + } + + // Serialize m several times, and check we get the same bytes each time. + var orig []byte + for i := 0; i < 100; i++ { + b, err := Marshal(m) + if err != nil { + t.Fatalf("Marshal: %v", err) + } + if i == 0 { + orig = b + continue + } + if !bytes.Equal(b, orig) { + t.Errorf("Bytes differ on attempt #%d", i) + } + } +} + +// Many extensions, because small maps might not iterate differently on each iteration. +var exts = []*ExtensionDesc{ + E_X201, + E_X202, + E_X203, + E_X204, + E_X205, + E_X206, + E_X207, + E_X208, + E_X209, + E_X210, + E_X211, + E_X212, + E_X213, + E_X214, + E_X215, + E_X216, + E_X217, + E_X218, + E_X219, + E_X220, + E_X221, + E_X222, + E_X223, + E_X224, + E_X225, + E_X226, + E_X227, + E_X228, + E_X229, + E_X230, + E_X231, + E_X232, + E_X233, + E_X234, + E_X235, + E_X236, + E_X237, + E_X238, + E_X239, + E_X240, + E_X241, + E_X242, + E_X243, + E_X244, + E_X245, + E_X246, + E_X247, + E_X248, + E_X249, + E_X250, +} + +func TestMessageSetMarshalOrder(t *testing.T) { + m := &MyMessageSet{} + for _, x := range exts { + if err := SetExtension(m, x, &Empty{}); err != nil { + t.Fatalf("SetExtension: %v", err) + } + } + + buf, err := Marshal(m) + if err != nil { + t.Fatalf("Marshal: %v", err) + } + + // Serialize m several times, and check we get the same bytes each time. + for i := 0; i < 10; i++ { + b1, err := Marshal(m) + if err != nil { + t.Fatalf("Marshal: %v", err) + } + if !bytes.Equal(b1, buf) { + t.Errorf("Bytes differ on re-Marshal #%d", i) + } + + m2 := &MyMessageSet{} + if err := Unmarshal(buf, m2); err != nil { + t.Errorf("Unmarshal: %v", err) + } + b2, err := Marshal(m2) + if err != nil { + t.Errorf("re-Marshal: %v", err) + } + if !bytes.Equal(b2, buf) { + t.Errorf("Bytes differ on round-trip #%d", i) + } + } +} + +func TestUnmarshalMergesMessages(t *testing.T) { + // If a nested message occurs twice in the input, + // the fields should be merged when decoding. + a := &OtherMessage{ + Key: Int64(123), + Inner: &InnerMessage{ + Host: String("polhode"), + Port: Int32(1234), + }, + } + aData, err := Marshal(a) + if err != nil { + t.Fatalf("Marshal(a): %v", err) + } + b := &OtherMessage{ + Weight: Float32(1.2), + Inner: &InnerMessage{ + Host: String("herpolhode"), + Connected: Bool(true), + }, + } + bData, err := Marshal(b) + if err != nil { + t.Fatalf("Marshal(b): %v", err) + } + want := &OtherMessage{ + Key: Int64(123), + Weight: Float32(1.2), + Inner: &InnerMessage{ + Host: String("herpolhode"), + Port: Int32(1234), + Connected: Bool(true), + }, + } + got := new(OtherMessage) + if err := Unmarshal(append(aData, bData...), got); err != nil { + t.Fatalf("Unmarshal: %v", err) + } + if !Equal(got, want) { + t.Errorf("\n got %v\nwant %v", got, want) + } +} + +func TestEncodingSizes(t *testing.T) { + tests := []struct { + m Message + n int + }{ + {&Defaults{F_Int32: Int32(math.MaxInt32)}, 6}, + {&Defaults{F_Int32: Int32(math.MinInt32)}, 11}, + {&Defaults{F_Uint32: Uint32(uint32(math.MaxInt32) + 1)}, 6}, + {&Defaults{F_Uint32: Uint32(math.MaxUint32)}, 6}, + } + for _, test := range tests { + b, err := Marshal(test.m) + if err != nil { + t.Errorf("Marshal(%v): %v", test.m, err) + continue + } + if len(b) != test.n { + t.Errorf("Marshal(%v) yielded %d bytes, want %d bytes", test.m, len(b), test.n) + } + } +} + +func TestRequiredNotSetError(t *testing.T) { + pb := initGoTest(false) + pb.RequiredField.Label = nil + pb.F_Int32Required = nil + pb.F_Int64Required = nil + + expected := "0807" + // field 1, encoding 0, value 7 + "2206" + "120474797065" + // field 4, encoding 2 (GoTestField) + "5001" + // field 10, encoding 0, value 1 + "6d20000000" + // field 13, encoding 5, value 0x20 + "714000000000000000" + // field 14, encoding 1, value 0x40 + "78a019" + // field 15, encoding 0, value 0xca0 = 3232 + "8001c032" + // field 16, encoding 0, value 0x1940 = 6464 + "8d0100004a45" + // field 17, encoding 5, value 3232.0 + "9101000000000040b940" + // field 18, encoding 1, value 6464.0 + "9a0106" + "737472696e67" + // field 19, encoding 2, string "string" + "b304" + // field 70, encoding 3, start group + "ba0408" + "7265717569726564" + // field 71, encoding 2, string "required" + "b404" + // field 70, encoding 4, end group + "aa0605" + "6279746573" + // field 101, encoding 2, string "bytes" + "b0063f" + // field 102, encoding 0, 0x3f zigzag32 + "b8067f" // field 103, encoding 0, 0x7f zigzag64 + + o := old() + bytes, err := Marshal(pb) + if _, ok := err.(*RequiredNotSetError); !ok { + fmt.Printf("marshal-1 err = %v, want *RequiredNotSetError", err) + o.DebugPrint("", bytes) + t.Fatalf("expected = %s", expected) + } + if strings.Index(err.Error(), "RequiredField.Label") < 0 { + t.Errorf("marshal-1 wrong err msg: %v", err) + } + if !equal(bytes, expected, t) { + o.DebugPrint("neq 1", bytes) + t.Fatalf("expected = %s", expected) + } + + // Now test Unmarshal by recreating the original buffer. + pbd := new(GoTest) + err = Unmarshal(bytes, pbd) + if _, ok := err.(*RequiredNotSetError); !ok { + t.Fatalf("unmarshal err = %v, want *RequiredNotSetError", err) + o.DebugPrint("", bytes) + t.Fatalf("string = %s", expected) + } + if strings.Index(err.Error(), "RequiredField.{Unknown}") < 0 { + t.Errorf("unmarshal wrong err msg: %v", err) + } + bytes, err = Marshal(pbd) + if _, ok := err.(*RequiredNotSetError); !ok { + t.Errorf("marshal-2 err = %v, want *RequiredNotSetError", err) + o.DebugPrint("", bytes) + t.Fatalf("string = %s", expected) + } + if strings.Index(err.Error(), "RequiredField.Label") < 0 { + t.Errorf("marshal-2 wrong err msg: %v", err) + } + if !equal(bytes, expected, t) { + o.DebugPrint("neq 2", bytes) + t.Fatalf("string = %s", expected) + } +} + +func fuzzUnmarshal(t *testing.T, data []byte) { + defer func() { + if e := recover(); e != nil { + t.Errorf("These bytes caused a panic: %+v", data) + t.Logf("Stack:\n%s", debug.Stack()) + t.FailNow() + } + }() + + pb := new(MyMessage) + Unmarshal(data, pb) +} + +func TestMapFieldMarshal(t *testing.T) { + m := &MessageWithMap{ + NameMapping: map[int32]string{ + 1: "Rob", + 4: "Ian", + 8: "Dave", + }, + } + b, err := Marshal(m) + if err != nil { + t.Fatalf("Marshal: %v", err) + } + + // b should be the concatenation of these three byte sequences in some order. + parts := []string{ + "\n\a\b\x01\x12\x03Rob", + "\n\a\b\x04\x12\x03Ian", + "\n\b\b\x08\x12\x04Dave", + } + ok := false + for i := range parts { + for j := range parts { + if j == i { + continue + } + for k := range parts { + if k == i || k == j { + continue + } + try := parts[i] + parts[j] + parts[k] + if bytes.Equal(b, []byte(try)) { + ok = true + break + } + } + } + } + if !ok { + t.Fatalf("Incorrect Marshal output.\n got %q\nwant %q (or a permutation of that)", b, parts[0]+parts[1]+parts[2]) + } + t.Logf("FYI b: %q", b) + + (new(Buffer)).DebugPrint("Dump of b", b) +} + +func TestMapFieldRoundTrips(t *testing.T) { + m := &MessageWithMap{ + NameMapping: map[int32]string{ + 1: "Rob", + 4: "Ian", + 8: "Dave", + }, + MsgMapping: map[int64]*FloatingPoint{ + 0x7001: &FloatingPoint{F: Float64(2.0)}, + }, + ByteMapping: map[bool][]byte{ + false: []byte("that's not right!"), + true: []byte("aye, 'tis true!"), + }, + } + b, err := Marshal(m) + if err != nil { + t.Fatalf("Marshal: %v", err) + } + t.Logf("FYI b: %q", b) + m2 := new(MessageWithMap) + if err := Unmarshal(b, m2); err != nil { + t.Fatalf("Unmarshal: %v", err) + } + for _, pair := range [][2]interface{}{ + {m.NameMapping, m2.NameMapping}, + {m.MsgMapping, m2.MsgMapping}, + {m.ByteMapping, m2.ByteMapping}, + } { + if !reflect.DeepEqual(pair[0], pair[1]) { + t.Errorf("Map did not survive a round trip.\ninitial: %v\n final: %v", pair[0], pair[1]) + } + } +} + +func TestMapFieldWithNil(t *testing.T) { + m1 := &MessageWithMap{ + MsgMapping: map[int64]*FloatingPoint{ + 1: nil, + }, + } + b, err := Marshal(m1) + if err != nil { + t.Fatalf("Marshal: %v", err) + } + m2 := new(MessageWithMap) + if err := Unmarshal(b, m2); err != nil { + t.Fatalf("Unmarshal: %v, got these bytes: %v", err, b) + } + if v, ok := m2.MsgMapping[1]; !ok { + t.Error("msg_mapping[1] not present") + } else if v != nil { + t.Errorf("msg_mapping[1] not nil: %v", v) + } +} + +func TestMapFieldWithNilBytes(t *testing.T) { + m1 := &MessageWithMap{ + ByteMapping: map[bool][]byte{ + false: []byte{}, + true: nil, + }, + } + n := Size(m1) + b, err := Marshal(m1) + if err != nil { + t.Fatalf("Marshal: %v", err) + } + if n != len(b) { + t.Errorf("Size(m1) = %d; want len(Marshal(m1)) = %d", n, len(b)) + } + m2 := new(MessageWithMap) + if err := Unmarshal(b, m2); err != nil { + t.Fatalf("Unmarshal: %v, got these bytes: %v", err, b) + } + if v, ok := m2.ByteMapping[false]; !ok { + t.Error("byte_mapping[false] not present") + } else if len(v) != 0 { + t.Errorf("byte_mapping[false] not empty: %#v", v) + } + if v, ok := m2.ByteMapping[true]; !ok { + t.Error("byte_mapping[true] not present") + } else if len(v) != 0 { + t.Errorf("byte_mapping[true] not empty: %#v", v) + } +} + +func TestDecodeMapFieldMissingKey(t *testing.T) { + b := []byte{ + 0x0A, 0x03, // message, tag 1 (name_mapping), of length 3 bytes + // no key + 0x12, 0x01, 0x6D, // string value of length 1 byte, value "m" + } + got := &MessageWithMap{} + err := Unmarshal(b, got) + if err != nil { + t.Fatalf("failed to marshal map with missing key: %v", err) + } + want := &MessageWithMap{NameMapping: map[int32]string{0: "m"}} + if !Equal(got, want) { + t.Errorf("Unmarshaled map with no key was not as expected. got: %v, want %v", got, want) + } +} + +func TestDecodeMapFieldMissingValue(t *testing.T) { + b := []byte{ + 0x0A, 0x02, // message, tag 1 (name_mapping), of length 2 bytes + 0x08, 0x01, // varint key, value 1 + // no value + } + got := &MessageWithMap{} + err := Unmarshal(b, got) + if err != nil { + t.Fatalf("failed to marshal map with missing value: %v", err) + } + want := &MessageWithMap{NameMapping: map[int32]string{1: ""}} + if !Equal(got, want) { + t.Errorf("Unmarshaled map with no value was not as expected. got: %v, want %v", got, want) + } +} + +func TestOneof(t *testing.T) { + m := &Communique{} + b, err := Marshal(m) + if err != nil { + t.Fatalf("Marshal of empty message with oneof: %v", err) + } + if len(b) != 0 { + t.Errorf("Marshal of empty message yielded too many bytes: %v", b) + } + + m = &Communique{ + Union: &Communique_Name{"Barry"}, + } + + // Round-trip. + b, err = Marshal(m) + if err != nil { + t.Fatalf("Marshal of message with oneof: %v", err) + } + if len(b) != 7 { // name tag/wire (1) + name len (1) + name (5) + t.Errorf("Incorrect marshal of message with oneof: %v", b) + } + m.Reset() + if err := Unmarshal(b, m); err != nil { + t.Fatalf("Unmarshal of message with oneof: %v", err) + } + if x, ok := m.Union.(*Communique_Name); !ok || x.Name != "Barry" { + t.Errorf("After round trip, Union = %+v", m.Union) + } + if name := m.GetName(); name != "Barry" { + t.Errorf("After round trip, GetName = %q, want %q", name, "Barry") + } + + // Let's try with a message in the oneof. + m.Union = &Communique_Msg{&Strings{StringField: String("deep deep string")}} + b, err = Marshal(m) + if err != nil { + t.Fatalf("Marshal of message with oneof set to message: %v", err) + } + if len(b) != 20 { // msg tag/wire (1) + msg len (1) + msg (1 + 1 + 16) + t.Errorf("Incorrect marshal of message with oneof set to message: %v", b) + } + m.Reset() + if err := Unmarshal(b, m); err != nil { + t.Fatalf("Unmarshal of message with oneof set to message: %v", err) + } + ss, ok := m.Union.(*Communique_Msg) + if !ok || ss.Msg.GetStringField() != "deep deep string" { + t.Errorf("After round trip with oneof set to message, Union = %+v", m.Union) + } +} + +func TestInefficientPackedBool(t *testing.T) { + // https://github.com/golang/protobuf/issues/76 + inp := []byte{ + 0x12, 0x02, // 0x12 = 2<<3|2; 2 bytes + // Usually a bool should take a single byte, + // but it is permitted to be any varint. + 0xb9, 0x30, + } + if err := Unmarshal(inp, new(MoreRepeated)); err != nil { + t.Error(err) + } +} + +// Benchmarks + +func testMsg() *GoTest { + pb := initGoTest(true) + const N = 1000 // Internally the library starts much smaller. + pb.F_Int32Repeated = make([]int32, N) + pb.F_DoubleRepeated = make([]float64, N) + for i := 0; i < N; i++ { + pb.F_Int32Repeated[i] = int32(i) + pb.F_DoubleRepeated[i] = float64(i) + } + return pb +} + +func bytesMsg() *GoTest { + pb := initGoTest(true) + buf := make([]byte, 4000) + for i := range buf { + buf[i] = byte(i) + } + pb.F_BytesDefaulted = buf + return pb +} + +func benchmarkMarshal(b *testing.B, pb Message, marshal func(Message) ([]byte, error)) { + d, _ := marshal(pb) + b.SetBytes(int64(len(d))) + b.ResetTimer() + for i := 0; i < b.N; i++ { + marshal(pb) + } +} + +func benchmarkBufferMarshal(b *testing.B, pb Message) { + p := NewBuffer(nil) + benchmarkMarshal(b, pb, func(pb0 Message) ([]byte, error) { + p.Reset() + err := p.Marshal(pb0) + return p.Bytes(), err + }) +} + +func benchmarkSize(b *testing.B, pb Message) { + benchmarkMarshal(b, pb, func(pb0 Message) ([]byte, error) { + Size(pb) + return nil, nil + }) +} + +func newOf(pb Message) Message { + in := reflect.ValueOf(pb) + if in.IsNil() { + return pb + } + return reflect.New(in.Type().Elem()).Interface().(Message) +} + +func benchmarkUnmarshal(b *testing.B, pb Message, unmarshal func([]byte, Message) error) { + d, _ := Marshal(pb) + b.SetBytes(int64(len(d))) + pbd := newOf(pb) + + b.ResetTimer() + for i := 0; i < b.N; i++ { + unmarshal(d, pbd) + } +} + +func benchmarkBufferUnmarshal(b *testing.B, pb Message) { + p := NewBuffer(nil) + benchmarkUnmarshal(b, pb, func(d []byte, pb0 Message) error { + p.SetBuf(d) + return p.Unmarshal(pb0) + }) +} + +// Benchmark{Marshal,BufferMarshal,Size,Unmarshal,BufferUnmarshal}{,Bytes} + +func BenchmarkMarshal(b *testing.B) { + benchmarkMarshal(b, testMsg(), Marshal) +} + +func BenchmarkBufferMarshal(b *testing.B) { + benchmarkBufferMarshal(b, testMsg()) +} + +func BenchmarkSize(b *testing.B) { + benchmarkSize(b, testMsg()) +} + +func BenchmarkUnmarshal(b *testing.B) { + benchmarkUnmarshal(b, testMsg(), Unmarshal) +} + +func BenchmarkBufferUnmarshal(b *testing.B) { + benchmarkBufferUnmarshal(b, testMsg()) +} + +func BenchmarkMarshalBytes(b *testing.B) { + benchmarkMarshal(b, bytesMsg(), Marshal) +} + +func BenchmarkBufferMarshalBytes(b *testing.B) { + benchmarkBufferMarshal(b, bytesMsg()) +} + +func BenchmarkSizeBytes(b *testing.B) { + benchmarkSize(b, bytesMsg()) +} + +func BenchmarkUnmarshalBytes(b *testing.B) { + benchmarkUnmarshal(b, bytesMsg(), Unmarshal) +} + +func BenchmarkBufferUnmarshalBytes(b *testing.B) { + benchmarkBufferUnmarshal(b, bytesMsg()) +} + +func BenchmarkUnmarshalUnrecognizedFields(b *testing.B) { + b.StopTimer() + pb := initGoTestField() + skip := &GoSkipTest{ + SkipInt32: Int32(32), + SkipFixed32: Uint32(3232), + SkipFixed64: Uint64(6464), + SkipString: String("skipper"), + Skipgroup: &GoSkipTest_SkipGroup{ + GroupInt32: Int32(75), + GroupString: String("wxyz"), + }, + } + + pbd := new(GoTestField) + p := NewBuffer(nil) + p.Marshal(pb) + p.Marshal(skip) + p2 := NewBuffer(nil) + + b.StartTimer() + for i := 0; i < b.N; i++ { + p2.SetBuf(p.Bytes()) + p2.Unmarshal(pbd) + } +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/any_test.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/any_test.go new file mode 100644 index 0000000..1a3c22e --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/any_test.go @@ -0,0 +1,300 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package proto_test + +import ( + "strings" + "testing" + + "github.com/golang/protobuf/proto" + + pb "github.com/golang/protobuf/proto/proto3_proto" + testpb "github.com/golang/protobuf/proto/testdata" + anypb "github.com/golang/protobuf/ptypes/any" +) + +var ( + expandedMarshaler = proto.TextMarshaler{ExpandAny: true} + expandedCompactMarshaler = proto.TextMarshaler{Compact: true, ExpandAny: true} +) + +// anyEqual reports whether two messages which may be google.protobuf.Any or may +// contain google.protobuf.Any fields are equal. We can't use proto.Equal for +// comparison, because semantically equivalent messages may be marshaled to +// binary in different tag order. Instead, trust that TextMarshaler with +// ExpandAny option works and compare the text marshaling results. +func anyEqual(got, want proto.Message) bool { + // if messages are proto.Equal, no need to marshal. + if proto.Equal(got, want) { + return true + } + g := expandedMarshaler.Text(got) + w := expandedMarshaler.Text(want) + return g == w +} + +type golden struct { + m proto.Message + t, c string +} + +var goldenMessages = makeGolden() + +func makeGolden() []golden { + nested := &pb.Nested{Bunny: "Monty"} + nb, err := proto.Marshal(nested) + if err != nil { + panic(err) + } + m1 := &pb.Message{ + Name: "David", + ResultCount: 47, + Anything: &anypb.Any{TypeUrl: "type.googleapis.com/" + proto.MessageName(nested), Value: nb}, + } + m2 := &pb.Message{ + Name: "David", + ResultCount: 47, + Anything: &anypb.Any{TypeUrl: "http://[::1]/type.googleapis.com/" + proto.MessageName(nested), Value: nb}, + } + m3 := &pb.Message{ + Name: "David", + ResultCount: 47, + Anything: &anypb.Any{TypeUrl: `type.googleapis.com/"/` + proto.MessageName(nested), Value: nb}, + } + m4 := &pb.Message{ + Name: "David", + ResultCount: 47, + Anything: &anypb.Any{TypeUrl: "type.googleapis.com/a/path/" + proto.MessageName(nested), Value: nb}, + } + m5 := &anypb.Any{TypeUrl: "type.googleapis.com/" + proto.MessageName(nested), Value: nb} + + any1 := &testpb.MyMessage{Count: proto.Int32(47), Name: proto.String("David")} + proto.SetExtension(any1, testpb.E_Ext_More, &testpb.Ext{Data: proto.String("foo")}) + proto.SetExtension(any1, testpb.E_Ext_Text, proto.String("bar")) + any1b, err := proto.Marshal(any1) + if err != nil { + panic(err) + } + any2 := &testpb.MyMessage{Count: proto.Int32(42), Bikeshed: testpb.MyMessage_GREEN.Enum(), RepBytes: [][]byte{[]byte("roboto")}} + proto.SetExtension(any2, testpb.E_Ext_More, &testpb.Ext{Data: proto.String("baz")}) + any2b, err := proto.Marshal(any2) + if err != nil { + panic(err) + } + m6 := &pb.Message{ + Name: "David", + ResultCount: 47, + Anything: &anypb.Any{TypeUrl: "type.googleapis.com/" + proto.MessageName(any1), Value: any1b}, + ManyThings: []*anypb.Any{ + &anypb.Any{TypeUrl: "type.googleapis.com/" + proto.MessageName(any2), Value: any2b}, + &anypb.Any{TypeUrl: "type.googleapis.com/" + proto.MessageName(any1), Value: any1b}, + }, + } + + const ( + m1Golden = ` +name: "David" +result_count: 47 +anything: < + [type.googleapis.com/proto3_proto.Nested]: < + bunny: "Monty" + > +> +` + m2Golden = ` +name: "David" +result_count: 47 +anything: < + ["http://[::1]/type.googleapis.com/proto3_proto.Nested"]: < + bunny: "Monty" + > +> +` + m3Golden = ` +name: "David" +result_count: 47 +anything: < + ["type.googleapis.com/\"/proto3_proto.Nested"]: < + bunny: "Monty" + > +> +` + m4Golden = ` +name: "David" +result_count: 47 +anything: < + [type.googleapis.com/a/path/proto3_proto.Nested]: < + bunny: "Monty" + > +> +` + m5Golden = ` +[type.googleapis.com/proto3_proto.Nested]: < + bunny: "Monty" +> +` + m6Golden = ` +name: "David" +result_count: 47 +anything: < + [type.googleapis.com/testdata.MyMessage]: < + count: 47 + name: "David" + [testdata.Ext.more]: < + data: "foo" + > + [testdata.Ext.text]: "bar" + > +> +many_things: < + [type.googleapis.com/testdata.MyMessage]: < + count: 42 + bikeshed: GREEN + rep_bytes: "roboto" + [testdata.Ext.more]: < + data: "baz" + > + > +> +many_things: < + [type.googleapis.com/testdata.MyMessage]: < + count: 47 + name: "David" + [testdata.Ext.more]: < + data: "foo" + > + [testdata.Ext.text]: "bar" + > +> +` + ) + return []golden{ + {m1, strings.TrimSpace(m1Golden) + "\n", strings.TrimSpace(compact(m1Golden)) + " "}, + {m2, strings.TrimSpace(m2Golden) + "\n", strings.TrimSpace(compact(m2Golden)) + " "}, + {m3, strings.TrimSpace(m3Golden) + "\n", strings.TrimSpace(compact(m3Golden)) + " "}, + {m4, strings.TrimSpace(m4Golden) + "\n", strings.TrimSpace(compact(m4Golden)) + " "}, + {m5, strings.TrimSpace(m5Golden) + "\n", strings.TrimSpace(compact(m5Golden)) + " "}, + {m6, strings.TrimSpace(m6Golden) + "\n", strings.TrimSpace(compact(m6Golden)) + " "}, + } +} + +func TestMarshalGolden(t *testing.T) { + for _, tt := range goldenMessages { + if got, want := expandedMarshaler.Text(tt.m), tt.t; got != want { + t.Errorf("message %v: got:\n%s\nwant:\n%s", tt.m, got, want) + } + if got, want := expandedCompactMarshaler.Text(tt.m), tt.c; got != want { + t.Errorf("message %v: got:\n`%s`\nwant:\n`%s`", tt.m, got, want) + } + } +} + +func TestUnmarshalGolden(t *testing.T) { + for _, tt := range goldenMessages { + want := tt.m + got := proto.Clone(tt.m) + got.Reset() + if err := proto.UnmarshalText(tt.t, got); err != nil { + t.Errorf("failed to unmarshal\n%s\nerror: %v", tt.t, err) + } + if !anyEqual(got, want) { + t.Errorf("message:\n%s\ngot:\n%s\nwant:\n%s", tt.t, got, want) + } + got.Reset() + if err := proto.UnmarshalText(tt.c, got); err != nil { + t.Errorf("failed to unmarshal\n%s\nerror: %v", tt.c, err) + } + if !anyEqual(got, want) { + t.Errorf("message:\n%s\ngot:\n%s\nwant:\n%s", tt.c, got, want) + } + } +} + +func TestMarshalUnknownAny(t *testing.T) { + m := &pb.Message{ + Anything: &anypb.Any{ + TypeUrl: "foo", + Value: []byte("bar"), + }, + } + want := `anything: < + type_url: "foo" + value: "bar" +> +` + got := expandedMarshaler.Text(m) + if got != want { + t.Errorf("got\n`%s`\nwant\n`%s`", got, want) + } +} + +func TestAmbiguousAny(t *testing.T) { + pb := &anypb.Any{} + err := proto.UnmarshalText(` + type_url: "ttt/proto3_proto.Nested" + value: "\n\x05Monty" + `, pb) + t.Logf("result: %v (error: %v)", expandedMarshaler.Text(pb), err) + if err != nil { + t.Errorf("failed to parse ambiguous Any message: %v", err) + } +} + +func TestUnmarshalOverwriteAny(t *testing.T) { + pb := &anypb.Any{} + err := proto.UnmarshalText(` + [type.googleapis.com/a/path/proto3_proto.Nested]: < + bunny: "Monty" + > + [type.googleapis.com/a/path/proto3_proto.Nested]: < + bunny: "Rabbit of Caerbannog" + > + `, pb) + want := `line 7: Any message unpacked multiple times, or "type_url" already set` + if err.Error() != want { + t.Errorf("incorrect error.\nHave: %v\nWant: %v", err.Error(), want) + } +} + +func TestUnmarshalAnyMixAndMatch(t *testing.T) { + pb := &anypb.Any{} + err := proto.UnmarshalText(` + value: "\n\x05Monty" + [type.googleapis.com/a/path/proto3_proto.Nested]: < + bunny: "Rabbit of Caerbannog" + > + `, pb) + want := `line 5: Any message unpacked multiple times, or "value" already set` + if err.Error() != want { + t.Errorf("incorrect error.\nHave: %v\nWant: %v", err.Error(), want) + } +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/clone.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/clone.go new file mode 100644 index 0000000..e392575 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/clone.go @@ -0,0 +1,229 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2011 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +// Protocol buffer deep copy and merge. +// TODO: RawMessage. + +package proto + +import ( + "log" + "reflect" + "strings" +) + +// Clone returns a deep copy of a protocol buffer. +func Clone(pb Message) Message { + in := reflect.ValueOf(pb) + if in.IsNil() { + return pb + } + + out := reflect.New(in.Type().Elem()) + // out is empty so a merge is a deep copy. + mergeStruct(out.Elem(), in.Elem()) + return out.Interface().(Message) +} + +// Merge merges src into dst. +// Required and optional fields that are set in src will be set to that value in dst. +// Elements of repeated fields will be appended. +// Merge panics if src and dst are not the same type, or if dst is nil. +func Merge(dst, src Message) { + in := reflect.ValueOf(src) + out := reflect.ValueOf(dst) + if out.IsNil() { + panic("proto: nil destination") + } + if in.Type() != out.Type() { + // Explicit test prior to mergeStruct so that mistyped nils will fail + panic("proto: type mismatch") + } + if in.IsNil() { + // Merging nil into non-nil is a quiet no-op + return + } + mergeStruct(out.Elem(), in.Elem()) +} + +func mergeStruct(out, in reflect.Value) { + sprop := GetProperties(in.Type()) + for i := 0; i < in.NumField(); i++ { + f := in.Type().Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + mergeAny(out.Field(i), in.Field(i), false, sprop.Prop[i]) + } + + if emIn, ok := extendable(in.Addr().Interface()); ok { + emOut, _ := extendable(out.Addr().Interface()) + mIn, muIn := emIn.extensionsRead() + if mIn != nil { + mOut := emOut.extensionsWrite() + muIn.Lock() + mergeExtension(mOut, mIn) + muIn.Unlock() + } + } + + uf := in.FieldByName("XXX_unrecognized") + if !uf.IsValid() { + return + } + uin := uf.Bytes() + if len(uin) > 0 { + out.FieldByName("XXX_unrecognized").SetBytes(append([]byte(nil), uin...)) + } +} + +// mergeAny performs a merge between two values of the same type. +// viaPtr indicates whether the values were indirected through a pointer (implying proto2). +// prop is set if this is a struct field (it may be nil). +func mergeAny(out, in reflect.Value, viaPtr bool, prop *Properties) { + if in.Type() == protoMessageType { + if !in.IsNil() { + if out.IsNil() { + out.Set(reflect.ValueOf(Clone(in.Interface().(Message)))) + } else { + Merge(out.Interface().(Message), in.Interface().(Message)) + } + } + return + } + switch in.Kind() { + case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, + reflect.String, reflect.Uint32, reflect.Uint64: + if !viaPtr && isProto3Zero(in) { + return + } + out.Set(in) + case reflect.Interface: + // Probably a oneof field; copy non-nil values. + if in.IsNil() { + return + } + // Allocate destination if it is not set, or set to a different type. + // Otherwise we will merge as normal. + if out.IsNil() || out.Elem().Type() != in.Elem().Type() { + out.Set(reflect.New(in.Elem().Elem().Type())) // interface -> *T -> T -> new(T) + } + mergeAny(out.Elem(), in.Elem(), false, nil) + case reflect.Map: + if in.Len() == 0 { + return + } + if out.IsNil() { + out.Set(reflect.MakeMap(in.Type())) + } + // For maps with value types of *T or []byte we need to deep copy each value. + elemKind := in.Type().Elem().Kind() + for _, key := range in.MapKeys() { + var val reflect.Value + switch elemKind { + case reflect.Ptr: + val = reflect.New(in.Type().Elem().Elem()) + mergeAny(val, in.MapIndex(key), false, nil) + case reflect.Slice: + val = in.MapIndex(key) + val = reflect.ValueOf(append([]byte{}, val.Bytes()...)) + default: + val = in.MapIndex(key) + } + out.SetMapIndex(key, val) + } + case reflect.Ptr: + if in.IsNil() { + return + } + if out.IsNil() { + out.Set(reflect.New(in.Elem().Type())) + } + mergeAny(out.Elem(), in.Elem(), true, nil) + case reflect.Slice: + if in.IsNil() { + return + } + if in.Type().Elem().Kind() == reflect.Uint8 { + // []byte is a scalar bytes field, not a repeated field. + + // Edge case: if this is in a proto3 message, a zero length + // bytes field is considered the zero value, and should not + // be merged. + if prop != nil && prop.proto3 && in.Len() == 0 { + return + } + + // Make a deep copy. + // Append to []byte{} instead of []byte(nil) so that we never end up + // with a nil result. + out.SetBytes(append([]byte{}, in.Bytes()...)) + return + } + n := in.Len() + if out.IsNil() { + out.Set(reflect.MakeSlice(in.Type(), 0, n)) + } + switch in.Type().Elem().Kind() { + case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, + reflect.String, reflect.Uint32, reflect.Uint64: + out.Set(reflect.AppendSlice(out, in)) + default: + for i := 0; i < n; i++ { + x := reflect.Indirect(reflect.New(in.Type().Elem())) + mergeAny(x, in.Index(i), false, nil) + out.Set(reflect.Append(out, x)) + } + } + case reflect.Struct: + mergeStruct(out, in) + default: + // unknown type, so not a protocol buffer + log.Printf("proto: don't know how to copy %v", in) + } +} + +func mergeExtension(out, in map[int32]Extension) { + for extNum, eIn := range in { + eOut := Extension{desc: eIn.desc} + if eIn.value != nil { + v := reflect.New(reflect.TypeOf(eIn.value)).Elem() + mergeAny(v, reflect.ValueOf(eIn.value), false, nil) + eOut.value = v.Interface() + } + if eIn.enc != nil { + eOut.enc = make([]byte, len(eIn.enc)) + copy(eOut.enc, eIn.enc) + } + + out[extNum] = eOut + } +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/clone_test.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/clone_test.go new file mode 100644 index 0000000..f607ff4 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/clone_test.go @@ -0,0 +1,300 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2011 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package proto_test + +import ( + "testing" + + "github.com/golang/protobuf/proto" + + proto3pb "github.com/golang/protobuf/proto/proto3_proto" + pb "github.com/golang/protobuf/proto/testdata" +) + +var cloneTestMessage = &pb.MyMessage{ + Count: proto.Int32(42), + Name: proto.String("Dave"), + Pet: []string{"bunny", "kitty", "horsey"}, + Inner: &pb.InnerMessage{ + Host: proto.String("niles"), + Port: proto.Int32(9099), + Connected: proto.Bool(true), + }, + Others: []*pb.OtherMessage{ + { + Value: []byte("some bytes"), + }, + }, + Somegroup: &pb.MyMessage_SomeGroup{ + GroupField: proto.Int32(6), + }, + RepBytes: [][]byte{[]byte("sham"), []byte("wow")}, +} + +func init() { + ext := &pb.Ext{ + Data: proto.String("extension"), + } + if err := proto.SetExtension(cloneTestMessage, pb.E_Ext_More, ext); err != nil { + panic("SetExtension: " + err.Error()) + } +} + +func TestClone(t *testing.T) { + m := proto.Clone(cloneTestMessage).(*pb.MyMessage) + if !proto.Equal(m, cloneTestMessage) { + t.Errorf("Clone(%v) = %v", cloneTestMessage, m) + } + + // Verify it was a deep copy. + *m.Inner.Port++ + if proto.Equal(m, cloneTestMessage) { + t.Error("Mutating clone changed the original") + } + // Byte fields and repeated fields should be copied. + if &m.Pet[0] == &cloneTestMessage.Pet[0] { + t.Error("Pet: repeated field not copied") + } + if &m.Others[0] == &cloneTestMessage.Others[0] { + t.Error("Others: repeated field not copied") + } + if &m.Others[0].Value[0] == &cloneTestMessage.Others[0].Value[0] { + t.Error("Others[0].Value: bytes field not copied") + } + if &m.RepBytes[0] == &cloneTestMessage.RepBytes[0] { + t.Error("RepBytes: repeated field not copied") + } + if &m.RepBytes[0][0] == &cloneTestMessage.RepBytes[0][0] { + t.Error("RepBytes[0]: bytes field not copied") + } +} + +func TestCloneNil(t *testing.T) { + var m *pb.MyMessage + if c := proto.Clone(m); !proto.Equal(m, c) { + t.Errorf("Clone(%v) = %v", m, c) + } +} + +var mergeTests = []struct { + src, dst, want proto.Message +}{ + { + src: &pb.MyMessage{ + Count: proto.Int32(42), + }, + dst: &pb.MyMessage{ + Name: proto.String("Dave"), + }, + want: &pb.MyMessage{ + Count: proto.Int32(42), + Name: proto.String("Dave"), + }, + }, + { + src: &pb.MyMessage{ + Inner: &pb.InnerMessage{ + Host: proto.String("hey"), + Connected: proto.Bool(true), + }, + Pet: []string{"horsey"}, + Others: []*pb.OtherMessage{ + { + Value: []byte("some bytes"), + }, + }, + }, + dst: &pb.MyMessage{ + Inner: &pb.InnerMessage{ + Host: proto.String("niles"), + Port: proto.Int32(9099), + }, + Pet: []string{"bunny", "kitty"}, + Others: []*pb.OtherMessage{ + { + Key: proto.Int64(31415926535), + }, + { + // Explicitly test a src=nil field + Inner: nil, + }, + }, + }, + want: &pb.MyMessage{ + Inner: &pb.InnerMessage{ + Host: proto.String("hey"), + Connected: proto.Bool(true), + Port: proto.Int32(9099), + }, + Pet: []string{"bunny", "kitty", "horsey"}, + Others: []*pb.OtherMessage{ + { + Key: proto.Int64(31415926535), + }, + {}, + { + Value: []byte("some bytes"), + }, + }, + }, + }, + { + src: &pb.MyMessage{ + RepBytes: [][]byte{[]byte("wow")}, + }, + dst: &pb.MyMessage{ + Somegroup: &pb.MyMessage_SomeGroup{ + GroupField: proto.Int32(6), + }, + RepBytes: [][]byte{[]byte("sham")}, + }, + want: &pb.MyMessage{ + Somegroup: &pb.MyMessage_SomeGroup{ + GroupField: proto.Int32(6), + }, + RepBytes: [][]byte{[]byte("sham"), []byte("wow")}, + }, + }, + // Check that a scalar bytes field replaces rather than appends. + { + src: &pb.OtherMessage{Value: []byte("foo")}, + dst: &pb.OtherMessage{Value: []byte("bar")}, + want: &pb.OtherMessage{Value: []byte("foo")}, + }, + { + src: &pb.MessageWithMap{ + NameMapping: map[int32]string{6: "Nigel"}, + MsgMapping: map[int64]*pb.FloatingPoint{ + 0x4001: &pb.FloatingPoint{F: proto.Float64(2.0)}, + 0x4002: &pb.FloatingPoint{ + F: proto.Float64(2.0), + }, + }, + ByteMapping: map[bool][]byte{true: []byte("wowsa")}, + }, + dst: &pb.MessageWithMap{ + NameMapping: map[int32]string{ + 6: "Bruce", // should be overwritten + 7: "Andrew", + }, + MsgMapping: map[int64]*pb.FloatingPoint{ + 0x4002: &pb.FloatingPoint{ + F: proto.Float64(3.0), + Exact: proto.Bool(true), + }, // the entire message should be overwritten + }, + }, + want: &pb.MessageWithMap{ + NameMapping: map[int32]string{ + 6: "Nigel", + 7: "Andrew", + }, + MsgMapping: map[int64]*pb.FloatingPoint{ + 0x4001: &pb.FloatingPoint{F: proto.Float64(2.0)}, + 0x4002: &pb.FloatingPoint{ + F: proto.Float64(2.0), + }, + }, + ByteMapping: map[bool][]byte{true: []byte("wowsa")}, + }, + }, + // proto3 shouldn't merge zero values, + // in the same way that proto2 shouldn't merge nils. + { + src: &proto3pb.Message{ + Name: "Aaron", + Data: []byte(""), // zero value, but not nil + }, + dst: &proto3pb.Message{ + HeightInCm: 176, + Data: []byte("texas!"), + }, + want: &proto3pb.Message{ + Name: "Aaron", + HeightInCm: 176, + Data: []byte("texas!"), + }, + }, + // Oneof fields should merge by assignment. + { + src: &pb.Communique{ + Union: &pb.Communique_Number{41}, + }, + dst: &pb.Communique{ + Union: &pb.Communique_Name{"Bobby Tables"}, + }, + want: &pb.Communique{ + Union: &pb.Communique_Number{41}, + }, + }, + // Oneof nil is the same as not set. + { + src: &pb.Communique{}, + dst: &pb.Communique{ + Union: &pb.Communique_Name{"Bobby Tables"}, + }, + want: &pb.Communique{ + Union: &pb.Communique_Name{"Bobby Tables"}, + }, + }, + { + src: &proto3pb.Message{ + Terrain: map[string]*proto3pb.Nested{ + "kay_a": &proto3pb.Nested{Cute: true}, // replace + "kay_b": &proto3pb.Nested{Bunny: "rabbit"}, // insert + }, + }, + dst: &proto3pb.Message{ + Terrain: map[string]*proto3pb.Nested{ + "kay_a": &proto3pb.Nested{Bunny: "lost"}, // replaced + "kay_c": &proto3pb.Nested{Bunny: "bunny"}, // keep + }, + }, + want: &proto3pb.Message{ + Terrain: map[string]*proto3pb.Nested{ + "kay_a": &proto3pb.Nested{Cute: true}, + "kay_b": &proto3pb.Nested{Bunny: "rabbit"}, + "kay_c": &proto3pb.Nested{Bunny: "bunny"}, + }, + }, + }, +} + +func TestMerge(t *testing.T) { + for _, m := range mergeTests { + got := proto.Clone(m.dst) + proto.Merge(got, m.src) + if !proto.Equal(got, m.want) { + t.Errorf("Merge(%v, %v)\n got %v\nwant %v\n", m.dst, m.src, got, m.want) + } + } +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/decode.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/decode.go new file mode 100644 index 0000000..aa20729 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/decode.go @@ -0,0 +1,970 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package proto + +/* + * Routines for decoding protocol buffer data to construct in-memory representations. + */ + +import ( + "errors" + "fmt" + "io" + "os" + "reflect" +) + +// errOverflow is returned when an integer is too large to be represented. +var errOverflow = errors.New("proto: integer overflow") + +// ErrInternalBadWireType is returned by generated code when an incorrect +// wire type is encountered. It does not get returned to user code. +var ErrInternalBadWireType = errors.New("proto: internal error: bad wiretype for oneof") + +// The fundamental decoders that interpret bytes on the wire. +// Those that take integer types all return uint64 and are +// therefore of type valueDecoder. + +// DecodeVarint reads a varint-encoded integer from the slice. +// It returns the integer and the number of bytes consumed, or +// zero if there is not enough. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +func DecodeVarint(buf []byte) (x uint64, n int) { + for shift := uint(0); shift < 64; shift += 7 { + if n >= len(buf) { + return 0, 0 + } + b := uint64(buf[n]) + n++ + x |= (b & 0x7F) << shift + if (b & 0x80) == 0 { + return x, n + } + } + + // The number is too large to represent in a 64-bit value. + return 0, 0 +} + +func (p *Buffer) decodeVarintSlow() (x uint64, err error) { + i := p.index + l := len(p.buf) + + for shift := uint(0); shift < 64; shift += 7 { + if i >= l { + err = io.ErrUnexpectedEOF + return + } + b := p.buf[i] + i++ + x |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + p.index = i + return + } + } + + // The number is too large to represent in a 64-bit value. + err = errOverflow + return +} + +// DecodeVarint reads a varint-encoded integer from the Buffer. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +func (p *Buffer) DecodeVarint() (x uint64, err error) { + i := p.index + buf := p.buf + + if i >= len(buf) { + return 0, io.ErrUnexpectedEOF + } else if buf[i] < 0x80 { + p.index++ + return uint64(buf[i]), nil + } else if len(buf)-i < 10 { + return p.decodeVarintSlow() + } + + var b uint64 + // we already checked the first byte + x = uint64(buf[i]) - 0x80 + i++ + + b = uint64(buf[i]) + i++ + x += b << 7 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 7 + + b = uint64(buf[i]) + i++ + x += b << 14 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 14 + + b = uint64(buf[i]) + i++ + x += b << 21 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 21 + + b = uint64(buf[i]) + i++ + x += b << 28 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 28 + + b = uint64(buf[i]) + i++ + x += b << 35 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 35 + + b = uint64(buf[i]) + i++ + x += b << 42 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 42 + + b = uint64(buf[i]) + i++ + x += b << 49 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 49 + + b = uint64(buf[i]) + i++ + x += b << 56 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 56 + + b = uint64(buf[i]) + i++ + x += b << 63 + if b&0x80 == 0 { + goto done + } + // x -= 0x80 << 63 // Always zero. + + return 0, errOverflow + +done: + p.index = i + return x, nil +} + +// DecodeFixed64 reads a 64-bit integer from the Buffer. +// This is the format for the +// fixed64, sfixed64, and double protocol buffer types. +func (p *Buffer) DecodeFixed64() (x uint64, err error) { + // x, err already 0 + i := p.index + 8 + if i < 0 || i > len(p.buf) { + err = io.ErrUnexpectedEOF + return + } + p.index = i + + x = uint64(p.buf[i-8]) + x |= uint64(p.buf[i-7]) << 8 + x |= uint64(p.buf[i-6]) << 16 + x |= uint64(p.buf[i-5]) << 24 + x |= uint64(p.buf[i-4]) << 32 + x |= uint64(p.buf[i-3]) << 40 + x |= uint64(p.buf[i-2]) << 48 + x |= uint64(p.buf[i-1]) << 56 + return +} + +// DecodeFixed32 reads a 32-bit integer from the Buffer. +// This is the format for the +// fixed32, sfixed32, and float protocol buffer types. +func (p *Buffer) DecodeFixed32() (x uint64, err error) { + // x, err already 0 + i := p.index + 4 + if i < 0 || i > len(p.buf) { + err = io.ErrUnexpectedEOF + return + } + p.index = i + + x = uint64(p.buf[i-4]) + x |= uint64(p.buf[i-3]) << 8 + x |= uint64(p.buf[i-2]) << 16 + x |= uint64(p.buf[i-1]) << 24 + return +} + +// DecodeZigzag64 reads a zigzag-encoded 64-bit integer +// from the Buffer. +// This is the format used for the sint64 protocol buffer type. +func (p *Buffer) DecodeZigzag64() (x uint64, err error) { + x, err = p.DecodeVarint() + if err != nil { + return + } + x = (x >> 1) ^ uint64((int64(x&1)<<63)>>63) + return +} + +// DecodeZigzag32 reads a zigzag-encoded 32-bit integer +// from the Buffer. +// This is the format used for the sint32 protocol buffer type. +func (p *Buffer) DecodeZigzag32() (x uint64, err error) { + x, err = p.DecodeVarint() + if err != nil { + return + } + x = uint64((uint32(x) >> 1) ^ uint32((int32(x&1)<<31)>>31)) + return +} + +// These are not ValueDecoders: they produce an array of bytes or a string. +// bytes, embedded messages + +// DecodeRawBytes reads a count-delimited byte buffer from the Buffer. +// This is the format used for the bytes protocol buffer +// type and for embedded messages. +func (p *Buffer) DecodeRawBytes(alloc bool) (buf []byte, err error) { + n, err := p.DecodeVarint() + if err != nil { + return nil, err + } + + nb := int(n) + if nb < 0 { + return nil, fmt.Errorf("proto: bad byte length %d", nb) + } + end := p.index + nb + if end < p.index || end > len(p.buf) { + return nil, io.ErrUnexpectedEOF + } + + if !alloc { + // todo: check if can get more uses of alloc=false + buf = p.buf[p.index:end] + p.index += nb + return + } + + buf = make([]byte, nb) + copy(buf, p.buf[p.index:]) + p.index += nb + return +} + +// DecodeStringBytes reads an encoded string from the Buffer. +// This is the format used for the proto2 string type. +func (p *Buffer) DecodeStringBytes() (s string, err error) { + buf, err := p.DecodeRawBytes(false) + if err != nil { + return + } + return string(buf), nil +} + +// Skip the next item in the buffer. Its wire type is decoded and presented as an argument. +// If the protocol buffer has extensions, and the field matches, add it as an extension. +// Otherwise, if the XXX_unrecognized field exists, append the skipped data there. +func (o *Buffer) skipAndSave(t reflect.Type, tag, wire int, base structPointer, unrecField field) error { + oi := o.index + + err := o.skip(t, tag, wire) + if err != nil { + return err + } + + if !unrecField.IsValid() { + return nil + } + + ptr := structPointer_Bytes(base, unrecField) + + // Add the skipped field to struct field + obuf := o.buf + + o.buf = *ptr + o.EncodeVarint(uint64(tag<<3 | wire)) + *ptr = append(o.buf, obuf[oi:o.index]...) + + o.buf = obuf + + return nil +} + +// Skip the next item in the buffer. Its wire type is decoded and presented as an argument. +func (o *Buffer) skip(t reflect.Type, tag, wire int) error { + + var u uint64 + var err error + + switch wire { + case WireVarint: + _, err = o.DecodeVarint() + case WireFixed64: + _, err = o.DecodeFixed64() + case WireBytes: + _, err = o.DecodeRawBytes(false) + case WireFixed32: + _, err = o.DecodeFixed32() + case WireStartGroup: + for { + u, err = o.DecodeVarint() + if err != nil { + break + } + fwire := int(u & 0x7) + if fwire == WireEndGroup { + break + } + ftag := int(u >> 3) + err = o.skip(t, ftag, fwire) + if err != nil { + break + } + } + default: + err = fmt.Errorf("proto: can't skip unknown wire type %d for %s", wire, t) + } + return err +} + +// Unmarshaler is the interface representing objects that can +// unmarshal themselves. The method should reset the receiver before +// decoding starts. The argument points to data that may be +// overwritten, so implementations should not keep references to the +// buffer. +type Unmarshaler interface { + Unmarshal([]byte) error +} + +// Unmarshal parses the protocol buffer representation in buf and places the +// decoded result in pb. If the struct underlying pb does not match +// the data in buf, the results can be unpredictable. +// +// Unmarshal resets pb before starting to unmarshal, so any +// existing data in pb is always removed. Use UnmarshalMerge +// to preserve and append to existing data. +func Unmarshal(buf []byte, pb Message) error { + pb.Reset() + return UnmarshalMerge(buf, pb) +} + +// UnmarshalMerge parses the protocol buffer representation in buf and +// writes the decoded result to pb. If the struct underlying pb does not match +// the data in buf, the results can be unpredictable. +// +// UnmarshalMerge merges into existing data in pb. +// Most code should use Unmarshal instead. +func UnmarshalMerge(buf []byte, pb Message) error { + // If the object can unmarshal itself, let it. + if u, ok := pb.(Unmarshaler); ok { + return u.Unmarshal(buf) + } + return NewBuffer(buf).Unmarshal(pb) +} + +// DecodeMessage reads a count-delimited message from the Buffer. +func (p *Buffer) DecodeMessage(pb Message) error { + enc, err := p.DecodeRawBytes(false) + if err != nil { + return err + } + return NewBuffer(enc).Unmarshal(pb) +} + +// DecodeGroup reads a tag-delimited group from the Buffer. +func (p *Buffer) DecodeGroup(pb Message) error { + typ, base, err := getbase(pb) + if err != nil { + return err + } + return p.unmarshalType(typ.Elem(), GetProperties(typ.Elem()), true, base) +} + +// Unmarshal parses the protocol buffer representation in the +// Buffer and places the decoded result in pb. If the struct +// underlying pb does not match the data in the buffer, the results can be +// unpredictable. +// +// Unlike proto.Unmarshal, this does not reset pb before starting to unmarshal. +func (p *Buffer) Unmarshal(pb Message) error { + // If the object can unmarshal itself, let it. + if u, ok := pb.(Unmarshaler); ok { + err := u.Unmarshal(p.buf[p.index:]) + p.index = len(p.buf) + return err + } + + typ, base, err := getbase(pb) + if err != nil { + return err + } + + err = p.unmarshalType(typ.Elem(), GetProperties(typ.Elem()), false, base) + + if collectStats { + stats.Decode++ + } + + return err +} + +// unmarshalType does the work of unmarshaling a structure. +func (o *Buffer) unmarshalType(st reflect.Type, prop *StructProperties, is_group bool, base structPointer) error { + var state errorState + required, reqFields := prop.reqCount, uint64(0) + + var err error + for err == nil && o.index < len(o.buf) { + oi := o.index + var u uint64 + u, err = o.DecodeVarint() + if err != nil { + break + } + wire := int(u & 0x7) + if wire == WireEndGroup { + if is_group { + if required > 0 { + // Not enough information to determine the exact field. + // (See below.) + return &RequiredNotSetError{"{Unknown}"} + } + return nil // input is satisfied + } + return fmt.Errorf("proto: %s: wiretype end group for non-group", st) + } + tag := int(u >> 3) + if tag <= 0 { + return fmt.Errorf("proto: %s: illegal tag %d (wire type %d)", st, tag, wire) + } + fieldnum, ok := prop.decoderTags.get(tag) + if !ok { + // Maybe it's an extension? + if prop.extendable { + if e, _ := extendable(structPointer_Interface(base, st)); isExtensionField(e, int32(tag)) { + if err = o.skip(st, tag, wire); err == nil { + extmap := e.extensionsWrite() + ext := extmap[int32(tag)] // may be missing + ext.enc = append(ext.enc, o.buf[oi:o.index]...) + extmap[int32(tag)] = ext + } + continue + } + } + // Maybe it's a oneof? + if prop.oneofUnmarshaler != nil { + m := structPointer_Interface(base, st).(Message) + // First return value indicates whether tag is a oneof field. + ok, err = prop.oneofUnmarshaler(m, tag, wire, o) + if err == ErrInternalBadWireType { + // Map the error to something more descriptive. + // Do the formatting here to save generated code space. + err = fmt.Errorf("bad wiretype for oneof field in %T", m) + } + if ok { + continue + } + } + err = o.skipAndSave(st, tag, wire, base, prop.unrecField) + continue + } + p := prop.Prop[fieldnum] + + if p.dec == nil { + fmt.Fprintf(os.Stderr, "proto: no protobuf decoder for %s.%s\n", st, st.Field(fieldnum).Name) + continue + } + dec := p.dec + if wire != WireStartGroup && wire != p.WireType { + if wire == WireBytes && p.packedDec != nil { + // a packable field + dec = p.packedDec + } else { + err = fmt.Errorf("proto: bad wiretype for field %s.%s: got wiretype %d, want %d", st, st.Field(fieldnum).Name, wire, p.WireType) + continue + } + } + decErr := dec(o, p, base) + if decErr != nil && !state.shouldContinue(decErr, p) { + err = decErr + } + if err == nil && p.Required { + // Successfully decoded a required field. + if tag <= 64 { + // use bitmap for fields 1-64 to catch field reuse. + var mask uint64 = 1 << uint64(tag-1) + if reqFields&mask == 0 { + // new required field + reqFields |= mask + required-- + } + } else { + // This is imprecise. It can be fooled by a required field + // with a tag > 64 that is encoded twice; that's very rare. + // A fully correct implementation would require allocating + // a data structure, which we would like to avoid. + required-- + } + } + } + if err == nil { + if is_group { + return io.ErrUnexpectedEOF + } + if state.err != nil { + return state.err + } + if required > 0 { + // Not enough information to determine the exact field. If we use extra + // CPU, we could determine the field only if the missing required field + // has a tag <= 64 and we check reqFields. + return &RequiredNotSetError{"{Unknown}"} + } + } + return err +} + +// Individual type decoders +// For each, +// u is the decoded value, +// v is a pointer to the field (pointer) in the struct + +// Sizes of the pools to allocate inside the Buffer. +// The goal is modest amortization and allocation +// on at least 16-byte boundaries. +const ( + boolPoolSize = 16 + uint32PoolSize = 8 + uint64PoolSize = 4 +) + +// Decode a bool. +func (o *Buffer) dec_bool(p *Properties, base structPointer) error { + u, err := p.valDec(o) + if err != nil { + return err + } + if len(o.bools) == 0 { + o.bools = make([]bool, boolPoolSize) + } + o.bools[0] = u != 0 + *structPointer_Bool(base, p.field) = &o.bools[0] + o.bools = o.bools[1:] + return nil +} + +func (o *Buffer) dec_proto3_bool(p *Properties, base structPointer) error { + u, err := p.valDec(o) + if err != nil { + return err + } + *structPointer_BoolVal(base, p.field) = u != 0 + return nil +} + +// Decode an int32. +func (o *Buffer) dec_int32(p *Properties, base structPointer) error { + u, err := p.valDec(o) + if err != nil { + return err + } + word32_Set(structPointer_Word32(base, p.field), o, uint32(u)) + return nil +} + +func (o *Buffer) dec_proto3_int32(p *Properties, base structPointer) error { + u, err := p.valDec(o) + if err != nil { + return err + } + word32Val_Set(structPointer_Word32Val(base, p.field), uint32(u)) + return nil +} + +// Decode an int64. +func (o *Buffer) dec_int64(p *Properties, base structPointer) error { + u, err := p.valDec(o) + if err != nil { + return err + } + word64_Set(structPointer_Word64(base, p.field), o, u) + return nil +} + +func (o *Buffer) dec_proto3_int64(p *Properties, base structPointer) error { + u, err := p.valDec(o) + if err != nil { + return err + } + word64Val_Set(structPointer_Word64Val(base, p.field), o, u) + return nil +} + +// Decode a string. +func (o *Buffer) dec_string(p *Properties, base structPointer) error { + s, err := o.DecodeStringBytes() + if err != nil { + return err + } + *structPointer_String(base, p.field) = &s + return nil +} + +func (o *Buffer) dec_proto3_string(p *Properties, base structPointer) error { + s, err := o.DecodeStringBytes() + if err != nil { + return err + } + *structPointer_StringVal(base, p.field) = s + return nil +} + +// Decode a slice of bytes ([]byte). +func (o *Buffer) dec_slice_byte(p *Properties, base structPointer) error { + b, err := o.DecodeRawBytes(true) + if err != nil { + return err + } + *structPointer_Bytes(base, p.field) = b + return nil +} + +// Decode a slice of bools ([]bool). +func (o *Buffer) dec_slice_bool(p *Properties, base structPointer) error { + u, err := p.valDec(o) + if err != nil { + return err + } + v := structPointer_BoolSlice(base, p.field) + *v = append(*v, u != 0) + return nil +} + +// Decode a slice of bools ([]bool) in packed format. +func (o *Buffer) dec_slice_packed_bool(p *Properties, base structPointer) error { + v := structPointer_BoolSlice(base, p.field) + + nn, err := o.DecodeVarint() + if err != nil { + return err + } + nb := int(nn) // number of bytes of encoded bools + fin := o.index + nb + if fin < o.index { + return errOverflow + } + + y := *v + for o.index < fin { + u, err := p.valDec(o) + if err != nil { + return err + } + y = append(y, u != 0) + } + + *v = y + return nil +} + +// Decode a slice of int32s ([]int32). +func (o *Buffer) dec_slice_int32(p *Properties, base structPointer) error { + u, err := p.valDec(o) + if err != nil { + return err + } + structPointer_Word32Slice(base, p.field).Append(uint32(u)) + return nil +} + +// Decode a slice of int32s ([]int32) in packed format. +func (o *Buffer) dec_slice_packed_int32(p *Properties, base structPointer) error { + v := structPointer_Word32Slice(base, p.field) + + nn, err := o.DecodeVarint() + if err != nil { + return err + } + nb := int(nn) // number of bytes of encoded int32s + + fin := o.index + nb + if fin < o.index { + return errOverflow + } + for o.index < fin { + u, err := p.valDec(o) + if err != nil { + return err + } + v.Append(uint32(u)) + } + return nil +} + +// Decode a slice of int64s ([]int64). +func (o *Buffer) dec_slice_int64(p *Properties, base structPointer) error { + u, err := p.valDec(o) + if err != nil { + return err + } + + structPointer_Word64Slice(base, p.field).Append(u) + return nil +} + +// Decode a slice of int64s ([]int64) in packed format. +func (o *Buffer) dec_slice_packed_int64(p *Properties, base structPointer) error { + v := structPointer_Word64Slice(base, p.field) + + nn, err := o.DecodeVarint() + if err != nil { + return err + } + nb := int(nn) // number of bytes of encoded int64s + + fin := o.index + nb + if fin < o.index { + return errOverflow + } + for o.index < fin { + u, err := p.valDec(o) + if err != nil { + return err + } + v.Append(u) + } + return nil +} + +// Decode a slice of strings ([]string). +func (o *Buffer) dec_slice_string(p *Properties, base structPointer) error { + s, err := o.DecodeStringBytes() + if err != nil { + return err + } + v := structPointer_StringSlice(base, p.field) + *v = append(*v, s) + return nil +} + +// Decode a slice of slice of bytes ([][]byte). +func (o *Buffer) dec_slice_slice_byte(p *Properties, base structPointer) error { + b, err := o.DecodeRawBytes(true) + if err != nil { + return err + } + v := structPointer_BytesSlice(base, p.field) + *v = append(*v, b) + return nil +} + +// Decode a map field. +func (o *Buffer) dec_new_map(p *Properties, base structPointer) error { + raw, err := o.DecodeRawBytes(false) + if err != nil { + return err + } + oi := o.index // index at the end of this map entry + o.index -= len(raw) // move buffer back to start of map entry + + mptr := structPointer_NewAt(base, p.field, p.mtype) // *map[K]V + if mptr.Elem().IsNil() { + mptr.Elem().Set(reflect.MakeMap(mptr.Type().Elem())) + } + v := mptr.Elem() // map[K]V + + // Prepare addressable doubly-indirect placeholders for the key and value types. + // See enc_new_map for why. + keyptr := reflect.New(reflect.PtrTo(p.mtype.Key())).Elem() // addressable *K + keybase := toStructPointer(keyptr.Addr()) // **K + + var valbase structPointer + var valptr reflect.Value + switch p.mtype.Elem().Kind() { + case reflect.Slice: + // []byte + var dummy []byte + valptr = reflect.ValueOf(&dummy) // *[]byte + valbase = toStructPointer(valptr) // *[]byte + case reflect.Ptr: + // message; valptr is **Msg; need to allocate the intermediate pointer + valptr = reflect.New(reflect.PtrTo(p.mtype.Elem())).Elem() // addressable *V + valptr.Set(reflect.New(valptr.Type().Elem())) + valbase = toStructPointer(valptr) + default: + // everything else + valptr = reflect.New(reflect.PtrTo(p.mtype.Elem())).Elem() // addressable *V + valbase = toStructPointer(valptr.Addr()) // **V + } + + // Decode. + // This parses a restricted wire format, namely the encoding of a message + // with two fields. See enc_new_map for the format. + for o.index < oi { + // tagcode for key and value properties are always a single byte + // because they have tags 1 and 2. + tagcode := o.buf[o.index] + o.index++ + switch tagcode { + case p.mkeyprop.tagcode[0]: + if err := p.mkeyprop.dec(o, p.mkeyprop, keybase); err != nil { + return err + } + case p.mvalprop.tagcode[0]: + if err := p.mvalprop.dec(o, p.mvalprop, valbase); err != nil { + return err + } + default: + // TODO: Should we silently skip this instead? + return fmt.Errorf("proto: bad map data tag %d", raw[0]) + } + } + keyelem, valelem := keyptr.Elem(), valptr.Elem() + if !keyelem.IsValid() { + keyelem = reflect.Zero(p.mtype.Key()) + } + if !valelem.IsValid() { + valelem = reflect.Zero(p.mtype.Elem()) + } + + v.SetMapIndex(keyelem, valelem) + return nil +} + +// Decode a group. +func (o *Buffer) dec_struct_group(p *Properties, base structPointer) error { + bas := structPointer_GetStructPointer(base, p.field) + if structPointer_IsNil(bas) { + // allocate new nested message + bas = toStructPointer(reflect.New(p.stype)) + structPointer_SetStructPointer(base, p.field, bas) + } + return o.unmarshalType(p.stype, p.sprop, true, bas) +} + +// Decode an embedded message. +func (o *Buffer) dec_struct_message(p *Properties, base structPointer) (err error) { + raw, e := o.DecodeRawBytes(false) + if e != nil { + return e + } + + bas := structPointer_GetStructPointer(base, p.field) + if structPointer_IsNil(bas) { + // allocate new nested message + bas = toStructPointer(reflect.New(p.stype)) + structPointer_SetStructPointer(base, p.field, bas) + } + + // If the object can unmarshal itself, let it. + if p.isUnmarshaler { + iv := structPointer_Interface(bas, p.stype) + return iv.(Unmarshaler).Unmarshal(raw) + } + + obuf := o.buf + oi := o.index + o.buf = raw + o.index = 0 + + err = o.unmarshalType(p.stype, p.sprop, false, bas) + o.buf = obuf + o.index = oi + + return err +} + +// Decode a slice of embedded messages. +func (o *Buffer) dec_slice_struct_message(p *Properties, base structPointer) error { + return o.dec_slice_struct(p, false, base) +} + +// Decode a slice of embedded groups. +func (o *Buffer) dec_slice_struct_group(p *Properties, base structPointer) error { + return o.dec_slice_struct(p, true, base) +} + +// Decode a slice of structs ([]*struct). +func (o *Buffer) dec_slice_struct(p *Properties, is_group bool, base structPointer) error { + v := reflect.New(p.stype) + bas := toStructPointer(v) + structPointer_StructPointerSlice(base, p.field).Append(bas) + + if is_group { + err := o.unmarshalType(p.stype, p.sprop, is_group, bas) + return err + } + + raw, err := o.DecodeRawBytes(false) + if err != nil { + return err + } + + // If the object can unmarshal itself, let it. + if p.isUnmarshaler { + iv := v.Interface() + return iv.(Unmarshaler).Unmarshal(raw) + } + + obuf := o.buf + oi := o.index + o.buf = raw + o.index = 0 + + err = o.unmarshalType(p.stype, p.sprop, is_group, bas) + + o.buf = obuf + o.index = oi + + return err +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/decode_test.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/decode_test.go new file mode 100644 index 0000000..2c4c31d --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/decode_test.go @@ -0,0 +1,258 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +// +build go1.7 + +package proto_test + +import ( + "fmt" + "testing" + + "github.com/golang/protobuf/proto" + tpb "github.com/golang/protobuf/proto/proto3_proto" +) + +var ( + bytesBlackhole []byte + msgBlackhole = new(tpb.Message) +) + +// BenchmarkVarint32ArraySmall shows the performance on an array of small int32 fields (1 and +// 2 bytes long). +func BenchmarkVarint32ArraySmall(b *testing.B) { + for i := uint(1); i <= 10; i++ { + dist := genInt32Dist([7]int{0, 3, 1}, 1<2GB. + ErrTooLarge = errors.New("proto: message encodes to over 2 GB") +) + +// The fundamental encoders that put bytes on the wire. +// Those that take integer types all accept uint64 and are +// therefore of type valueEncoder. + +const maxVarintBytes = 10 // maximum length of a varint + +// maxMarshalSize is the largest allowed size of an encoded protobuf, +// since C++ and Java use signed int32s for the size. +const maxMarshalSize = 1<<31 - 1 + +// EncodeVarint returns the varint encoding of x. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +// Not used by the package itself, but helpful to clients +// wishing to use the same encoding. +func EncodeVarint(x uint64) []byte { + var buf [maxVarintBytes]byte + var n int + for n = 0; x > 127; n++ { + buf[n] = 0x80 | uint8(x&0x7F) + x >>= 7 + } + buf[n] = uint8(x) + n++ + return buf[0:n] +} + +// EncodeVarint writes a varint-encoded integer to the Buffer. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +func (p *Buffer) EncodeVarint(x uint64) error { + for x >= 1<<7 { + p.buf = append(p.buf, uint8(x&0x7f|0x80)) + x >>= 7 + } + p.buf = append(p.buf, uint8(x)) + return nil +} + +// SizeVarint returns the varint encoding size of an integer. +func SizeVarint(x uint64) int { + return sizeVarint(x) +} + +func sizeVarint(x uint64) (n int) { + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} + +// EncodeFixed64 writes a 64-bit integer to the Buffer. +// This is the format for the +// fixed64, sfixed64, and double protocol buffer types. +func (p *Buffer) EncodeFixed64(x uint64) error { + p.buf = append(p.buf, + uint8(x), + uint8(x>>8), + uint8(x>>16), + uint8(x>>24), + uint8(x>>32), + uint8(x>>40), + uint8(x>>48), + uint8(x>>56)) + return nil +} + +func sizeFixed64(x uint64) int { + return 8 +} + +// EncodeFixed32 writes a 32-bit integer to the Buffer. +// This is the format for the +// fixed32, sfixed32, and float protocol buffer types. +func (p *Buffer) EncodeFixed32(x uint64) error { + p.buf = append(p.buf, + uint8(x), + uint8(x>>8), + uint8(x>>16), + uint8(x>>24)) + return nil +} + +func sizeFixed32(x uint64) int { + return 4 +} + +// EncodeZigzag64 writes a zigzag-encoded 64-bit integer +// to the Buffer. +// This is the format used for the sint64 protocol buffer type. +func (p *Buffer) EncodeZigzag64(x uint64) error { + // use signed number to get arithmetic right shift. + return p.EncodeVarint((x << 1) ^ uint64((int64(x) >> 63))) +} + +func sizeZigzag64(x uint64) int { + return sizeVarint((x << 1) ^ uint64((int64(x) >> 63))) +} + +// EncodeZigzag32 writes a zigzag-encoded 32-bit integer +// to the Buffer. +// This is the format used for the sint32 protocol buffer type. +func (p *Buffer) EncodeZigzag32(x uint64) error { + // use signed number to get arithmetic right shift. + return p.EncodeVarint(uint64((uint32(x) << 1) ^ uint32((int32(x) >> 31)))) +} + +func sizeZigzag32(x uint64) int { + return sizeVarint(uint64((uint32(x) << 1) ^ uint32((int32(x) >> 31)))) +} + +// EncodeRawBytes writes a count-delimited byte buffer to the Buffer. +// This is the format used for the bytes protocol buffer +// type and for embedded messages. +func (p *Buffer) EncodeRawBytes(b []byte) error { + p.EncodeVarint(uint64(len(b))) + p.buf = append(p.buf, b...) + return nil +} + +func sizeRawBytes(b []byte) int { + return sizeVarint(uint64(len(b))) + + len(b) +} + +// EncodeStringBytes writes an encoded string to the Buffer. +// This is the format used for the proto2 string type. +func (p *Buffer) EncodeStringBytes(s string) error { + p.EncodeVarint(uint64(len(s))) + p.buf = append(p.buf, s...) + return nil +} + +func sizeStringBytes(s string) int { + return sizeVarint(uint64(len(s))) + + len(s) +} + +// Marshaler is the interface representing objects that can marshal themselves. +type Marshaler interface { + Marshal() ([]byte, error) +} + +// Marshal takes the protocol buffer +// and encodes it into the wire format, returning the data. +func Marshal(pb Message) ([]byte, error) { + // Can the object marshal itself? + if m, ok := pb.(Marshaler); ok { + return m.Marshal() + } + p := NewBuffer(nil) + err := p.Marshal(pb) + if p.buf == nil && err == nil { + // Return a non-nil slice on success. + return []byte{}, nil + } + return p.buf, err +} + +// EncodeMessage writes the protocol buffer to the Buffer, +// prefixed by a varint-encoded length. +func (p *Buffer) EncodeMessage(pb Message) error { + t, base, err := getbase(pb) + if structPointer_IsNil(base) { + return ErrNil + } + if err == nil { + var state errorState + err = p.enc_len_struct(GetProperties(t.Elem()), base, &state) + } + return err +} + +// Marshal takes the protocol buffer +// and encodes it into the wire format, writing the result to the +// Buffer. +func (p *Buffer) Marshal(pb Message) error { + // Can the object marshal itself? + if m, ok := pb.(Marshaler); ok { + data, err := m.Marshal() + p.buf = append(p.buf, data...) + return err + } + + t, base, err := getbase(pb) + if structPointer_IsNil(base) { + return ErrNil + } + if err == nil { + err = p.enc_struct(GetProperties(t.Elem()), base) + } + + if collectStats { + (stats).Encode++ // Parens are to work around a goimports bug. + } + + if len(p.buf) > maxMarshalSize { + return ErrTooLarge + } + return err +} + +// Size returns the encoded size of a protocol buffer. +func Size(pb Message) (n int) { + // Can the object marshal itself? If so, Size is slow. + // TODO: add Size to Marshaler, or add a Sizer interface. + if m, ok := pb.(Marshaler); ok { + b, _ := m.Marshal() + return len(b) + } + + t, base, err := getbase(pb) + if structPointer_IsNil(base) { + return 0 + } + if err == nil { + n = size_struct(GetProperties(t.Elem()), base) + } + + if collectStats { + (stats).Size++ // Parens are to work around a goimports bug. + } + + return +} + +// Individual type encoders. + +// Encode a bool. +func (o *Buffer) enc_bool(p *Properties, base structPointer) error { + v := *structPointer_Bool(base, p.field) + if v == nil { + return ErrNil + } + x := 0 + if *v { + x = 1 + } + o.buf = append(o.buf, p.tagcode...) + p.valEnc(o, uint64(x)) + return nil +} + +func (o *Buffer) enc_proto3_bool(p *Properties, base structPointer) error { + v := *structPointer_BoolVal(base, p.field) + if !v { + return ErrNil + } + o.buf = append(o.buf, p.tagcode...) + p.valEnc(o, 1) + return nil +} + +func size_bool(p *Properties, base structPointer) int { + v := *structPointer_Bool(base, p.field) + if v == nil { + return 0 + } + return len(p.tagcode) + 1 // each bool takes exactly one byte +} + +func size_proto3_bool(p *Properties, base structPointer) int { + v := *structPointer_BoolVal(base, p.field) + if !v && !p.oneof { + return 0 + } + return len(p.tagcode) + 1 // each bool takes exactly one byte +} + +// Encode an int32. +func (o *Buffer) enc_int32(p *Properties, base structPointer) error { + v := structPointer_Word32(base, p.field) + if word32_IsNil(v) { + return ErrNil + } + x := int32(word32_Get(v)) // permit sign extension to use full 64-bit range + o.buf = append(o.buf, p.tagcode...) + p.valEnc(o, uint64(x)) + return nil +} + +func (o *Buffer) enc_proto3_int32(p *Properties, base structPointer) error { + v := structPointer_Word32Val(base, p.field) + x := int32(word32Val_Get(v)) // permit sign extension to use full 64-bit range + if x == 0 { + return ErrNil + } + o.buf = append(o.buf, p.tagcode...) + p.valEnc(o, uint64(x)) + return nil +} + +func size_int32(p *Properties, base structPointer) (n int) { + v := structPointer_Word32(base, p.field) + if word32_IsNil(v) { + return 0 + } + x := int32(word32_Get(v)) // permit sign extension to use full 64-bit range + n += len(p.tagcode) + n += p.valSize(uint64(x)) + return +} + +func size_proto3_int32(p *Properties, base structPointer) (n int) { + v := structPointer_Word32Val(base, p.field) + x := int32(word32Val_Get(v)) // permit sign extension to use full 64-bit range + if x == 0 && !p.oneof { + return 0 + } + n += len(p.tagcode) + n += p.valSize(uint64(x)) + return +} + +// Encode a uint32. +// Exactly the same as int32, except for no sign extension. +func (o *Buffer) enc_uint32(p *Properties, base structPointer) error { + v := structPointer_Word32(base, p.field) + if word32_IsNil(v) { + return ErrNil + } + x := word32_Get(v) + o.buf = append(o.buf, p.tagcode...) + p.valEnc(o, uint64(x)) + return nil +} + +func (o *Buffer) enc_proto3_uint32(p *Properties, base structPointer) error { + v := structPointer_Word32Val(base, p.field) + x := word32Val_Get(v) + if x == 0 { + return ErrNil + } + o.buf = append(o.buf, p.tagcode...) + p.valEnc(o, uint64(x)) + return nil +} + +func size_uint32(p *Properties, base structPointer) (n int) { + v := structPointer_Word32(base, p.field) + if word32_IsNil(v) { + return 0 + } + x := word32_Get(v) + n += len(p.tagcode) + n += p.valSize(uint64(x)) + return +} + +func size_proto3_uint32(p *Properties, base structPointer) (n int) { + v := structPointer_Word32Val(base, p.field) + x := word32Val_Get(v) + if x == 0 && !p.oneof { + return 0 + } + n += len(p.tagcode) + n += p.valSize(uint64(x)) + return +} + +// Encode an int64. +func (o *Buffer) enc_int64(p *Properties, base structPointer) error { + v := structPointer_Word64(base, p.field) + if word64_IsNil(v) { + return ErrNil + } + x := word64_Get(v) + o.buf = append(o.buf, p.tagcode...) + p.valEnc(o, x) + return nil +} + +func (o *Buffer) enc_proto3_int64(p *Properties, base structPointer) error { + v := structPointer_Word64Val(base, p.field) + x := word64Val_Get(v) + if x == 0 { + return ErrNil + } + o.buf = append(o.buf, p.tagcode...) + p.valEnc(o, x) + return nil +} + +func size_int64(p *Properties, base structPointer) (n int) { + v := structPointer_Word64(base, p.field) + if word64_IsNil(v) { + return 0 + } + x := word64_Get(v) + n += len(p.tagcode) + n += p.valSize(x) + return +} + +func size_proto3_int64(p *Properties, base structPointer) (n int) { + v := structPointer_Word64Val(base, p.field) + x := word64Val_Get(v) + if x == 0 && !p.oneof { + return 0 + } + n += len(p.tagcode) + n += p.valSize(x) + return +} + +// Encode a string. +func (o *Buffer) enc_string(p *Properties, base structPointer) error { + v := *structPointer_String(base, p.field) + if v == nil { + return ErrNil + } + x := *v + o.buf = append(o.buf, p.tagcode...) + o.EncodeStringBytes(x) + return nil +} + +func (o *Buffer) enc_proto3_string(p *Properties, base structPointer) error { + v := *structPointer_StringVal(base, p.field) + if v == "" { + return ErrNil + } + o.buf = append(o.buf, p.tagcode...) + o.EncodeStringBytes(v) + return nil +} + +func size_string(p *Properties, base structPointer) (n int) { + v := *structPointer_String(base, p.field) + if v == nil { + return 0 + } + x := *v + n += len(p.tagcode) + n += sizeStringBytes(x) + return +} + +func size_proto3_string(p *Properties, base structPointer) (n int) { + v := *structPointer_StringVal(base, p.field) + if v == "" && !p.oneof { + return 0 + } + n += len(p.tagcode) + n += sizeStringBytes(v) + return +} + +// All protocol buffer fields are nillable, but be careful. +func isNil(v reflect.Value) bool { + switch v.Kind() { + case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: + return v.IsNil() + } + return false +} + +// Encode a message struct. +func (o *Buffer) enc_struct_message(p *Properties, base structPointer) error { + var state errorState + structp := structPointer_GetStructPointer(base, p.field) + if structPointer_IsNil(structp) { + return ErrNil + } + + // Can the object marshal itself? + if p.isMarshaler { + m := structPointer_Interface(structp, p.stype).(Marshaler) + data, err := m.Marshal() + if err != nil && !state.shouldContinue(err, nil) { + return err + } + o.buf = append(o.buf, p.tagcode...) + o.EncodeRawBytes(data) + return state.err + } + + o.buf = append(o.buf, p.tagcode...) + return o.enc_len_struct(p.sprop, structp, &state) +} + +func size_struct_message(p *Properties, base structPointer) int { + structp := structPointer_GetStructPointer(base, p.field) + if structPointer_IsNil(structp) { + return 0 + } + + // Can the object marshal itself? + if p.isMarshaler { + m := structPointer_Interface(structp, p.stype).(Marshaler) + data, _ := m.Marshal() + n0 := len(p.tagcode) + n1 := sizeRawBytes(data) + return n0 + n1 + } + + n0 := len(p.tagcode) + n1 := size_struct(p.sprop, structp) + n2 := sizeVarint(uint64(n1)) // size of encoded length + return n0 + n1 + n2 +} + +// Encode a group struct. +func (o *Buffer) enc_struct_group(p *Properties, base structPointer) error { + var state errorState + b := structPointer_GetStructPointer(base, p.field) + if structPointer_IsNil(b) { + return ErrNil + } + + o.EncodeVarint(uint64((p.Tag << 3) | WireStartGroup)) + err := o.enc_struct(p.sprop, b) + if err != nil && !state.shouldContinue(err, nil) { + return err + } + o.EncodeVarint(uint64((p.Tag << 3) | WireEndGroup)) + return state.err +} + +func size_struct_group(p *Properties, base structPointer) (n int) { + b := structPointer_GetStructPointer(base, p.field) + if structPointer_IsNil(b) { + return 0 + } + + n += sizeVarint(uint64((p.Tag << 3) | WireStartGroup)) + n += size_struct(p.sprop, b) + n += sizeVarint(uint64((p.Tag << 3) | WireEndGroup)) + return +} + +// Encode a slice of bools ([]bool). +func (o *Buffer) enc_slice_bool(p *Properties, base structPointer) error { + s := *structPointer_BoolSlice(base, p.field) + l := len(s) + if l == 0 { + return ErrNil + } + for _, x := range s { + o.buf = append(o.buf, p.tagcode...) + v := uint64(0) + if x { + v = 1 + } + p.valEnc(o, v) + } + return nil +} + +func size_slice_bool(p *Properties, base structPointer) int { + s := *structPointer_BoolSlice(base, p.field) + l := len(s) + if l == 0 { + return 0 + } + return l * (len(p.tagcode) + 1) // each bool takes exactly one byte +} + +// Encode a slice of bools ([]bool) in packed format. +func (o *Buffer) enc_slice_packed_bool(p *Properties, base structPointer) error { + s := *structPointer_BoolSlice(base, p.field) + l := len(s) + if l == 0 { + return ErrNil + } + o.buf = append(o.buf, p.tagcode...) + o.EncodeVarint(uint64(l)) // each bool takes exactly one byte + for _, x := range s { + v := uint64(0) + if x { + v = 1 + } + p.valEnc(o, v) + } + return nil +} + +func size_slice_packed_bool(p *Properties, base structPointer) (n int) { + s := *structPointer_BoolSlice(base, p.field) + l := len(s) + if l == 0 { + return 0 + } + n += len(p.tagcode) + n += sizeVarint(uint64(l)) + n += l // each bool takes exactly one byte + return +} + +// Encode a slice of bytes ([]byte). +func (o *Buffer) enc_slice_byte(p *Properties, base structPointer) error { + s := *structPointer_Bytes(base, p.field) + if s == nil { + return ErrNil + } + o.buf = append(o.buf, p.tagcode...) + o.EncodeRawBytes(s) + return nil +} + +func (o *Buffer) enc_proto3_slice_byte(p *Properties, base structPointer) error { + s := *structPointer_Bytes(base, p.field) + if len(s) == 0 { + return ErrNil + } + o.buf = append(o.buf, p.tagcode...) + o.EncodeRawBytes(s) + return nil +} + +func size_slice_byte(p *Properties, base structPointer) (n int) { + s := *structPointer_Bytes(base, p.field) + if s == nil && !p.oneof { + return 0 + } + n += len(p.tagcode) + n += sizeRawBytes(s) + return +} + +func size_proto3_slice_byte(p *Properties, base structPointer) (n int) { + s := *structPointer_Bytes(base, p.field) + if len(s) == 0 && !p.oneof { + return 0 + } + n += len(p.tagcode) + n += sizeRawBytes(s) + return +} + +// Encode a slice of int32s ([]int32). +func (o *Buffer) enc_slice_int32(p *Properties, base structPointer) error { + s := structPointer_Word32Slice(base, p.field) + l := s.Len() + if l == 0 { + return ErrNil + } + for i := 0; i < l; i++ { + o.buf = append(o.buf, p.tagcode...) + x := int32(s.Index(i)) // permit sign extension to use full 64-bit range + p.valEnc(o, uint64(x)) + } + return nil +} + +func size_slice_int32(p *Properties, base structPointer) (n int) { + s := structPointer_Word32Slice(base, p.field) + l := s.Len() + if l == 0 { + return 0 + } + for i := 0; i < l; i++ { + n += len(p.tagcode) + x := int32(s.Index(i)) // permit sign extension to use full 64-bit range + n += p.valSize(uint64(x)) + } + return +} + +// Encode a slice of int32s ([]int32) in packed format. +func (o *Buffer) enc_slice_packed_int32(p *Properties, base structPointer) error { + s := structPointer_Word32Slice(base, p.field) + l := s.Len() + if l == 0 { + return ErrNil + } + // TODO: Reuse a Buffer. + buf := NewBuffer(nil) + for i := 0; i < l; i++ { + x := int32(s.Index(i)) // permit sign extension to use full 64-bit range + p.valEnc(buf, uint64(x)) + } + + o.buf = append(o.buf, p.tagcode...) + o.EncodeVarint(uint64(len(buf.buf))) + o.buf = append(o.buf, buf.buf...) + return nil +} + +func size_slice_packed_int32(p *Properties, base structPointer) (n int) { + s := structPointer_Word32Slice(base, p.field) + l := s.Len() + if l == 0 { + return 0 + } + var bufSize int + for i := 0; i < l; i++ { + x := int32(s.Index(i)) // permit sign extension to use full 64-bit range + bufSize += p.valSize(uint64(x)) + } + + n += len(p.tagcode) + n += sizeVarint(uint64(bufSize)) + n += bufSize + return +} + +// Encode a slice of uint32s ([]uint32). +// Exactly the same as int32, except for no sign extension. +func (o *Buffer) enc_slice_uint32(p *Properties, base structPointer) error { + s := structPointer_Word32Slice(base, p.field) + l := s.Len() + if l == 0 { + return ErrNil + } + for i := 0; i < l; i++ { + o.buf = append(o.buf, p.tagcode...) + x := s.Index(i) + p.valEnc(o, uint64(x)) + } + return nil +} + +func size_slice_uint32(p *Properties, base structPointer) (n int) { + s := structPointer_Word32Slice(base, p.field) + l := s.Len() + if l == 0 { + return 0 + } + for i := 0; i < l; i++ { + n += len(p.tagcode) + x := s.Index(i) + n += p.valSize(uint64(x)) + } + return +} + +// Encode a slice of uint32s ([]uint32) in packed format. +// Exactly the same as int32, except for no sign extension. +func (o *Buffer) enc_slice_packed_uint32(p *Properties, base structPointer) error { + s := structPointer_Word32Slice(base, p.field) + l := s.Len() + if l == 0 { + return ErrNil + } + // TODO: Reuse a Buffer. + buf := NewBuffer(nil) + for i := 0; i < l; i++ { + p.valEnc(buf, uint64(s.Index(i))) + } + + o.buf = append(o.buf, p.tagcode...) + o.EncodeVarint(uint64(len(buf.buf))) + o.buf = append(o.buf, buf.buf...) + return nil +} + +func size_slice_packed_uint32(p *Properties, base structPointer) (n int) { + s := structPointer_Word32Slice(base, p.field) + l := s.Len() + if l == 0 { + return 0 + } + var bufSize int + for i := 0; i < l; i++ { + bufSize += p.valSize(uint64(s.Index(i))) + } + + n += len(p.tagcode) + n += sizeVarint(uint64(bufSize)) + n += bufSize + return +} + +// Encode a slice of int64s ([]int64). +func (o *Buffer) enc_slice_int64(p *Properties, base structPointer) error { + s := structPointer_Word64Slice(base, p.field) + l := s.Len() + if l == 0 { + return ErrNil + } + for i := 0; i < l; i++ { + o.buf = append(o.buf, p.tagcode...) + p.valEnc(o, s.Index(i)) + } + return nil +} + +func size_slice_int64(p *Properties, base structPointer) (n int) { + s := structPointer_Word64Slice(base, p.field) + l := s.Len() + if l == 0 { + return 0 + } + for i := 0; i < l; i++ { + n += len(p.tagcode) + n += p.valSize(s.Index(i)) + } + return +} + +// Encode a slice of int64s ([]int64) in packed format. +func (o *Buffer) enc_slice_packed_int64(p *Properties, base structPointer) error { + s := structPointer_Word64Slice(base, p.field) + l := s.Len() + if l == 0 { + return ErrNil + } + // TODO: Reuse a Buffer. + buf := NewBuffer(nil) + for i := 0; i < l; i++ { + p.valEnc(buf, s.Index(i)) + } + + o.buf = append(o.buf, p.tagcode...) + o.EncodeVarint(uint64(len(buf.buf))) + o.buf = append(o.buf, buf.buf...) + return nil +} + +func size_slice_packed_int64(p *Properties, base structPointer) (n int) { + s := structPointer_Word64Slice(base, p.field) + l := s.Len() + if l == 0 { + return 0 + } + var bufSize int + for i := 0; i < l; i++ { + bufSize += p.valSize(s.Index(i)) + } + + n += len(p.tagcode) + n += sizeVarint(uint64(bufSize)) + n += bufSize + return +} + +// Encode a slice of slice of bytes ([][]byte). +func (o *Buffer) enc_slice_slice_byte(p *Properties, base structPointer) error { + ss := *structPointer_BytesSlice(base, p.field) + l := len(ss) + if l == 0 { + return ErrNil + } + for i := 0; i < l; i++ { + o.buf = append(o.buf, p.tagcode...) + o.EncodeRawBytes(ss[i]) + } + return nil +} + +func size_slice_slice_byte(p *Properties, base structPointer) (n int) { + ss := *structPointer_BytesSlice(base, p.field) + l := len(ss) + if l == 0 { + return 0 + } + n += l * len(p.tagcode) + for i := 0; i < l; i++ { + n += sizeRawBytes(ss[i]) + } + return +} + +// Encode a slice of strings ([]string). +func (o *Buffer) enc_slice_string(p *Properties, base structPointer) error { + ss := *structPointer_StringSlice(base, p.field) + l := len(ss) + for i := 0; i < l; i++ { + o.buf = append(o.buf, p.tagcode...) + o.EncodeStringBytes(ss[i]) + } + return nil +} + +func size_slice_string(p *Properties, base structPointer) (n int) { + ss := *structPointer_StringSlice(base, p.field) + l := len(ss) + n += l * len(p.tagcode) + for i := 0; i < l; i++ { + n += sizeStringBytes(ss[i]) + } + return +} + +// Encode a slice of message structs ([]*struct). +func (o *Buffer) enc_slice_struct_message(p *Properties, base structPointer) error { + var state errorState + s := structPointer_StructPointerSlice(base, p.field) + l := s.Len() + + for i := 0; i < l; i++ { + structp := s.Index(i) + if structPointer_IsNil(structp) { + return errRepeatedHasNil + } + + // Can the object marshal itself? + if p.isMarshaler { + m := structPointer_Interface(structp, p.stype).(Marshaler) + data, err := m.Marshal() + if err != nil && !state.shouldContinue(err, nil) { + return err + } + o.buf = append(o.buf, p.tagcode...) + o.EncodeRawBytes(data) + continue + } + + o.buf = append(o.buf, p.tagcode...) + err := o.enc_len_struct(p.sprop, structp, &state) + if err != nil && !state.shouldContinue(err, nil) { + if err == ErrNil { + return errRepeatedHasNil + } + return err + } + } + return state.err +} + +func size_slice_struct_message(p *Properties, base structPointer) (n int) { + s := structPointer_StructPointerSlice(base, p.field) + l := s.Len() + n += l * len(p.tagcode) + for i := 0; i < l; i++ { + structp := s.Index(i) + if structPointer_IsNil(structp) { + return // return the size up to this point + } + + // Can the object marshal itself? + if p.isMarshaler { + m := structPointer_Interface(structp, p.stype).(Marshaler) + data, _ := m.Marshal() + n += sizeRawBytes(data) + continue + } + + n0 := size_struct(p.sprop, structp) + n1 := sizeVarint(uint64(n0)) // size of encoded length + n += n0 + n1 + } + return +} + +// Encode a slice of group structs ([]*struct). +func (o *Buffer) enc_slice_struct_group(p *Properties, base structPointer) error { + var state errorState + s := structPointer_StructPointerSlice(base, p.field) + l := s.Len() + + for i := 0; i < l; i++ { + b := s.Index(i) + if structPointer_IsNil(b) { + return errRepeatedHasNil + } + + o.EncodeVarint(uint64((p.Tag << 3) | WireStartGroup)) + + err := o.enc_struct(p.sprop, b) + + if err != nil && !state.shouldContinue(err, nil) { + if err == ErrNil { + return errRepeatedHasNil + } + return err + } + + o.EncodeVarint(uint64((p.Tag << 3) | WireEndGroup)) + } + return state.err +} + +func size_slice_struct_group(p *Properties, base structPointer) (n int) { + s := structPointer_StructPointerSlice(base, p.field) + l := s.Len() + + n += l * sizeVarint(uint64((p.Tag<<3)|WireStartGroup)) + n += l * sizeVarint(uint64((p.Tag<<3)|WireEndGroup)) + for i := 0; i < l; i++ { + b := s.Index(i) + if structPointer_IsNil(b) { + return // return size up to this point + } + + n += size_struct(p.sprop, b) + } + return +} + +// Encode an extension map. +func (o *Buffer) enc_map(p *Properties, base structPointer) error { + exts := structPointer_ExtMap(base, p.field) + if err := encodeExtensionsMap(*exts); err != nil { + return err + } + + return o.enc_map_body(*exts) +} + +func (o *Buffer) enc_exts(p *Properties, base structPointer) error { + exts := structPointer_Extensions(base, p.field) + + v, mu := exts.extensionsRead() + if v == nil { + return nil + } + + mu.Lock() + defer mu.Unlock() + if err := encodeExtensionsMap(v); err != nil { + return err + } + + return o.enc_map_body(v) +} + +func (o *Buffer) enc_map_body(v map[int32]Extension) error { + // Fast-path for common cases: zero or one extensions. + if len(v) <= 1 { + for _, e := range v { + o.buf = append(o.buf, e.enc...) + } + return nil + } + + // Sort keys to provide a deterministic encoding. + keys := make([]int, 0, len(v)) + for k := range v { + keys = append(keys, int(k)) + } + sort.Ints(keys) + + for _, k := range keys { + o.buf = append(o.buf, v[int32(k)].enc...) + } + return nil +} + +func size_map(p *Properties, base structPointer) int { + v := structPointer_ExtMap(base, p.field) + return extensionsMapSize(*v) +} + +func size_exts(p *Properties, base structPointer) int { + v := structPointer_Extensions(base, p.field) + return extensionsSize(v) +} + +// Encode a map field. +func (o *Buffer) enc_new_map(p *Properties, base structPointer) error { + var state errorState // XXX: or do we need to plumb this through? + + /* + A map defined as + map map_field = N; + is encoded in the same way as + message MapFieldEntry { + key_type key = 1; + value_type value = 2; + } + repeated MapFieldEntry map_field = N; + */ + + v := structPointer_NewAt(base, p.field, p.mtype).Elem() // map[K]V + if v.Len() == 0 { + return nil + } + + keycopy, valcopy, keybase, valbase := mapEncodeScratch(p.mtype) + + enc := func() error { + if err := p.mkeyprop.enc(o, p.mkeyprop, keybase); err != nil { + return err + } + if err := p.mvalprop.enc(o, p.mvalprop, valbase); err != nil && err != ErrNil { + return err + } + return nil + } + + // Don't sort map keys. It is not required by the spec, and C++ doesn't do it. + for _, key := range v.MapKeys() { + val := v.MapIndex(key) + + keycopy.Set(key) + valcopy.Set(val) + + o.buf = append(o.buf, p.tagcode...) + if err := o.enc_len_thing(enc, &state); err != nil { + return err + } + } + return nil +} + +func size_new_map(p *Properties, base structPointer) int { + v := structPointer_NewAt(base, p.field, p.mtype).Elem() // map[K]V + + keycopy, valcopy, keybase, valbase := mapEncodeScratch(p.mtype) + + n := 0 + for _, key := range v.MapKeys() { + val := v.MapIndex(key) + keycopy.Set(key) + valcopy.Set(val) + + // Tag codes for key and val are the responsibility of the sub-sizer. + keysize := p.mkeyprop.size(p.mkeyprop, keybase) + valsize := p.mvalprop.size(p.mvalprop, valbase) + entry := keysize + valsize + // Add on tag code and length of map entry itself. + n += len(p.tagcode) + sizeVarint(uint64(entry)) + entry + } + return n +} + +// mapEncodeScratch returns a new reflect.Value matching the map's value type, +// and a structPointer suitable for passing to an encoder or sizer. +func mapEncodeScratch(mapType reflect.Type) (keycopy, valcopy reflect.Value, keybase, valbase structPointer) { + // Prepare addressable doubly-indirect placeholders for the key and value types. + // This is needed because the element-type encoders expect **T, but the map iteration produces T. + + keycopy = reflect.New(mapType.Key()).Elem() // addressable K + keyptr := reflect.New(reflect.PtrTo(keycopy.Type())).Elem() // addressable *K + keyptr.Set(keycopy.Addr()) // + keybase = toStructPointer(keyptr.Addr()) // **K + + // Value types are more varied and require special handling. + switch mapType.Elem().Kind() { + case reflect.Slice: + // []byte + var dummy []byte + valcopy = reflect.ValueOf(&dummy).Elem() // addressable []byte + valbase = toStructPointer(valcopy.Addr()) + case reflect.Ptr: + // message; the generated field type is map[K]*Msg (so V is *Msg), + // so we only need one level of indirection. + valcopy = reflect.New(mapType.Elem()).Elem() // addressable V + valbase = toStructPointer(valcopy.Addr()) + default: + // everything else + valcopy = reflect.New(mapType.Elem()).Elem() // addressable V + valptr := reflect.New(reflect.PtrTo(valcopy.Type())).Elem() // addressable *V + valptr.Set(valcopy.Addr()) // + valbase = toStructPointer(valptr.Addr()) // **V + } + return +} + +// Encode a struct. +func (o *Buffer) enc_struct(prop *StructProperties, base structPointer) error { + var state errorState + // Encode fields in tag order so that decoders may use optimizations + // that depend on the ordering. + // https://developers.google.com/protocol-buffers/docs/encoding#order + for _, i := range prop.order { + p := prop.Prop[i] + if p.enc != nil { + err := p.enc(o, p, base) + if err != nil { + if err == ErrNil { + if p.Required && state.err == nil { + state.err = &RequiredNotSetError{p.Name} + } + } else if err == errRepeatedHasNil { + // Give more context to nil values in repeated fields. + return errors.New("repeated field " + p.OrigName + " has nil element") + } else if !state.shouldContinue(err, p) { + return err + } + } + if len(o.buf) > maxMarshalSize { + return ErrTooLarge + } + } + } + + // Do oneof fields. + if prop.oneofMarshaler != nil { + m := structPointer_Interface(base, prop.stype).(Message) + if err := prop.oneofMarshaler(m, o); err == ErrNil { + return errOneofHasNil + } else if err != nil { + return err + } + } + + // Add unrecognized fields at the end. + if prop.unrecField.IsValid() { + v := *structPointer_Bytes(base, prop.unrecField) + if len(o.buf)+len(v) > maxMarshalSize { + return ErrTooLarge + } + if len(v) > 0 { + o.buf = append(o.buf, v...) + } + } + + return state.err +} + +func size_struct(prop *StructProperties, base structPointer) (n int) { + for _, i := range prop.order { + p := prop.Prop[i] + if p.size != nil { + n += p.size(p, base) + } + } + + // Add unrecognized fields at the end. + if prop.unrecField.IsValid() { + v := *structPointer_Bytes(base, prop.unrecField) + n += len(v) + } + + // Factor in any oneof fields. + if prop.oneofSizer != nil { + m := structPointer_Interface(base, prop.stype).(Message) + n += prop.oneofSizer(m) + } + + return +} + +var zeroes [20]byte // longer than any conceivable sizeVarint + +// Encode a struct, preceded by its encoded length (as a varint). +func (o *Buffer) enc_len_struct(prop *StructProperties, base structPointer, state *errorState) error { + return o.enc_len_thing(func() error { return o.enc_struct(prop, base) }, state) +} + +// Encode something, preceded by its encoded length (as a varint). +func (o *Buffer) enc_len_thing(enc func() error, state *errorState) error { + iLen := len(o.buf) + o.buf = append(o.buf, 0, 0, 0, 0) // reserve four bytes for length + iMsg := len(o.buf) + err := enc() + if err != nil && !state.shouldContinue(err, nil) { + return err + } + lMsg := len(o.buf) - iMsg + lLen := sizeVarint(uint64(lMsg)) + switch x := lLen - (iMsg - iLen); { + case x > 0: // actual length is x bytes larger than the space we reserved + // Move msg x bytes right. + o.buf = append(o.buf, zeroes[:x]...) + copy(o.buf[iMsg+x:], o.buf[iMsg:iMsg+lMsg]) + case x < 0: // actual length is x bytes smaller than the space we reserved + // Move msg x bytes left. + copy(o.buf[iMsg+x:], o.buf[iMsg:iMsg+lMsg]) + o.buf = o.buf[:len(o.buf)+x] // x is negative + } + // Encode the length in the reserved space. + o.buf = o.buf[:iLen] + o.EncodeVarint(uint64(lMsg)) + o.buf = o.buf[:len(o.buf)+lMsg] + return state.err +} + +// errorState maintains the first error that occurs and updates that error +// with additional context. +type errorState struct { + err error +} + +// shouldContinue reports whether encoding should continue upon encountering the +// given error. If the error is RequiredNotSetError, shouldContinue returns true +// and, if this is the first appearance of that error, remembers it for future +// reporting. +// +// If prop is not nil, it may update any error with additional context about the +// field with the error. +func (s *errorState) shouldContinue(err error, prop *Properties) bool { + // Ignore unset required fields. + reqNotSet, ok := err.(*RequiredNotSetError) + if !ok { + return false + } + if s.err == nil { + if prop != nil { + err = &RequiredNotSetError{prop.Name + "." + reqNotSet.field} + } + s.err = err + } + return true +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/encode_test.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/encode_test.go new file mode 100644 index 0000000..a720947 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/encode_test.go @@ -0,0 +1,85 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +// +build go1.7 + +package proto_test + +import ( + "strconv" + "testing" + + "github.com/golang/protobuf/proto" + tpb "github.com/golang/protobuf/proto/proto3_proto" + "github.com/golang/protobuf/ptypes" +) + +var ( + blackhole []byte +) + +// BenchmarkAny creates increasingly large arbitrary Any messages. The type is always the +// same. +func BenchmarkAny(b *testing.B) { + data := make([]byte, 1<<20) + quantum := 1 << 10 + for i := uint(0); i <= 10; i++ { + b.Run(strconv.Itoa(quantum<= len(o.buf) { + break + } + } + return value.Interface(), nil +} + +// GetExtensions returns a slice of the extensions present in pb that are also listed in es. +// The returned slice has the same length as es; missing extensions will appear as nil elements. +func GetExtensions(pb Message, es []*ExtensionDesc) (extensions []interface{}, err error) { + epb, ok := extendable(pb) + if !ok { + return nil, errors.New("proto: not an extendable proto") + } + extensions = make([]interface{}, len(es)) + for i, e := range es { + extensions[i], err = GetExtension(epb, e) + if err == ErrMissingExtension { + err = nil + } + if err != nil { + return + } + } + return +} + +// ExtensionDescs returns a new slice containing pb's extension descriptors, in undefined order. +// For non-registered extensions, ExtensionDescs returns an incomplete descriptor containing +// just the Field field, which defines the extension's field number. +func ExtensionDescs(pb Message) ([]*ExtensionDesc, error) { + epb, ok := extendable(pb) + if !ok { + return nil, fmt.Errorf("proto: %T is not an extendable proto.Message", pb) + } + registeredExtensions := RegisteredExtensions(pb) + + emap, mu := epb.extensionsRead() + if emap == nil { + return nil, nil + } + mu.Lock() + defer mu.Unlock() + extensions := make([]*ExtensionDesc, 0, len(emap)) + for extid, e := range emap { + desc := e.desc + if desc == nil { + desc = registeredExtensions[extid] + if desc == nil { + desc = &ExtensionDesc{Field: extid} + } + } + + extensions = append(extensions, desc) + } + return extensions, nil +} + +// SetExtension sets the specified extension of pb to the specified value. +func SetExtension(pb Message, extension *ExtensionDesc, value interface{}) error { + epb, ok := extendable(pb) + if !ok { + return errors.New("proto: not an extendable proto") + } + if err := checkExtensionTypes(epb, extension); err != nil { + return err + } + typ := reflect.TypeOf(extension.ExtensionType) + if typ != reflect.TypeOf(value) { + return errors.New("proto: bad extension value type") + } + // nil extension values need to be caught early, because the + // encoder can't distinguish an ErrNil due to a nil extension + // from an ErrNil due to a missing field. Extensions are + // always optional, so the encoder would just swallow the error + // and drop all the extensions from the encoded message. + if reflect.ValueOf(value).IsNil() { + return fmt.Errorf("proto: SetExtension called with nil value of type %T", value) + } + + extmap := epb.extensionsWrite() + extmap[extension.Field] = Extension{desc: extension, value: value} + return nil +} + +// ClearAllExtensions clears all extensions from pb. +func ClearAllExtensions(pb Message) { + epb, ok := extendable(pb) + if !ok { + return + } + m := epb.extensionsWrite() + for k := range m { + delete(m, k) + } +} + +// A global registry of extensions. +// The generated code will register the generated descriptors by calling RegisterExtension. + +var extensionMaps = make(map[reflect.Type]map[int32]*ExtensionDesc) + +// RegisterExtension is called from the generated code. +func RegisterExtension(desc *ExtensionDesc) { + st := reflect.TypeOf(desc.ExtendedType).Elem() + m := extensionMaps[st] + if m == nil { + m = make(map[int32]*ExtensionDesc) + extensionMaps[st] = m + } + if _, ok := m[desc.Field]; ok { + panic("proto: duplicate extension registered: " + st.String() + " " + strconv.Itoa(int(desc.Field))) + } + m[desc.Field] = desc +} + +// RegisteredExtensions returns a map of the registered extensions of a +// protocol buffer struct, indexed by the extension number. +// The argument pb should be a nil pointer to the struct type. +func RegisteredExtensions(pb Message) map[int32]*ExtensionDesc { + return extensionMaps[reflect.TypeOf(pb).Elem()] +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/extensions_test.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/extensions_test.go new file mode 100644 index 0000000..b6d9114 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/extensions_test.go @@ -0,0 +1,536 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2014 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package proto_test + +import ( + "bytes" + "fmt" + "reflect" + "sort" + "testing" + + "github.com/golang/protobuf/proto" + pb "github.com/golang/protobuf/proto/testdata" + "golang.org/x/sync/errgroup" +) + +func TestGetExtensionsWithMissingExtensions(t *testing.T) { + msg := &pb.MyMessage{} + ext1 := &pb.Ext{} + if err := proto.SetExtension(msg, pb.E_Ext_More, ext1); err != nil { + t.Fatalf("Could not set ext1: %s", err) + } + exts, err := proto.GetExtensions(msg, []*proto.ExtensionDesc{ + pb.E_Ext_More, + pb.E_Ext_Text, + }) + if err != nil { + t.Fatalf("GetExtensions() failed: %s", err) + } + if exts[0] != ext1 { + t.Errorf("ext1 not in returned extensions: %T %v", exts[0], exts[0]) + } + if exts[1] != nil { + t.Errorf("ext2 in returned extensions: %T %v", exts[1], exts[1]) + } +} + +func TestExtensionDescsWithMissingExtensions(t *testing.T) { + msg := &pb.MyMessage{Count: proto.Int32(0)} + extdesc1 := pb.E_Ext_More + if descs, err := proto.ExtensionDescs(msg); len(descs) != 0 || err != nil { + t.Errorf("proto.ExtensionDescs: got %d descs, error %v; want 0, nil", len(descs), err) + } + + ext1 := &pb.Ext{} + if err := proto.SetExtension(msg, extdesc1, ext1); err != nil { + t.Fatalf("Could not set ext1: %s", err) + } + extdesc2 := &proto.ExtensionDesc{ + ExtendedType: (*pb.MyMessage)(nil), + ExtensionType: (*bool)(nil), + Field: 123456789, + Name: "a.b", + Tag: "varint,123456789,opt", + } + ext2 := proto.Bool(false) + if err := proto.SetExtension(msg, extdesc2, ext2); err != nil { + t.Fatalf("Could not set ext2: %s", err) + } + + b, err := proto.Marshal(msg) + if err != nil { + t.Fatalf("Could not marshal msg: %v", err) + } + if err := proto.Unmarshal(b, msg); err != nil { + t.Fatalf("Could not unmarshal into msg: %v", err) + } + + descs, err := proto.ExtensionDescs(msg) + if err != nil { + t.Fatalf("proto.ExtensionDescs: got error %v", err) + } + sortExtDescs(descs) + wantDescs := []*proto.ExtensionDesc{extdesc1, &proto.ExtensionDesc{Field: extdesc2.Field}} + if !reflect.DeepEqual(descs, wantDescs) { + t.Errorf("proto.ExtensionDescs(msg) sorted extension ids: got %+v, want %+v", descs, wantDescs) + } +} + +type ExtensionDescSlice []*proto.ExtensionDesc + +func (s ExtensionDescSlice) Len() int { return len(s) } +func (s ExtensionDescSlice) Less(i, j int) bool { return s[i].Field < s[j].Field } +func (s ExtensionDescSlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } + +func sortExtDescs(s []*proto.ExtensionDesc) { + sort.Sort(ExtensionDescSlice(s)) +} + +func TestGetExtensionStability(t *testing.T) { + check := func(m *pb.MyMessage) bool { + ext1, err := proto.GetExtension(m, pb.E_Ext_More) + if err != nil { + t.Fatalf("GetExtension() failed: %s", err) + } + ext2, err := proto.GetExtension(m, pb.E_Ext_More) + if err != nil { + t.Fatalf("GetExtension() failed: %s", err) + } + return ext1 == ext2 + } + msg := &pb.MyMessage{Count: proto.Int32(4)} + ext0 := &pb.Ext{} + if err := proto.SetExtension(msg, pb.E_Ext_More, ext0); err != nil { + t.Fatalf("Could not set ext1: %s", ext0) + } + if !check(msg) { + t.Errorf("GetExtension() not stable before marshaling") + } + bb, err := proto.Marshal(msg) + if err != nil { + t.Fatalf("Marshal() failed: %s", err) + } + msg1 := &pb.MyMessage{} + err = proto.Unmarshal(bb, msg1) + if err != nil { + t.Fatalf("Unmarshal() failed: %s", err) + } + if !check(msg1) { + t.Errorf("GetExtension() not stable after unmarshaling") + } +} + +func TestGetExtensionDefaults(t *testing.T) { + var setFloat64 float64 = 1 + var setFloat32 float32 = 2 + var setInt32 int32 = 3 + var setInt64 int64 = 4 + var setUint32 uint32 = 5 + var setUint64 uint64 = 6 + var setBool = true + var setBool2 = false + var setString = "Goodnight string" + var setBytes = []byte("Goodnight bytes") + var setEnum = pb.DefaultsMessage_TWO + + type testcase struct { + ext *proto.ExtensionDesc // Extension we are testing. + want interface{} // Expected value of extension, or nil (meaning that GetExtension will fail). + def interface{} // Expected value of extension after ClearExtension(). + } + tests := []testcase{ + {pb.E_NoDefaultDouble, setFloat64, nil}, + {pb.E_NoDefaultFloat, setFloat32, nil}, + {pb.E_NoDefaultInt32, setInt32, nil}, + {pb.E_NoDefaultInt64, setInt64, nil}, + {pb.E_NoDefaultUint32, setUint32, nil}, + {pb.E_NoDefaultUint64, setUint64, nil}, + {pb.E_NoDefaultSint32, setInt32, nil}, + {pb.E_NoDefaultSint64, setInt64, nil}, + {pb.E_NoDefaultFixed32, setUint32, nil}, + {pb.E_NoDefaultFixed64, setUint64, nil}, + {pb.E_NoDefaultSfixed32, setInt32, nil}, + {pb.E_NoDefaultSfixed64, setInt64, nil}, + {pb.E_NoDefaultBool, setBool, nil}, + {pb.E_NoDefaultBool, setBool2, nil}, + {pb.E_NoDefaultString, setString, nil}, + {pb.E_NoDefaultBytes, setBytes, nil}, + {pb.E_NoDefaultEnum, setEnum, nil}, + {pb.E_DefaultDouble, setFloat64, float64(3.1415)}, + {pb.E_DefaultFloat, setFloat32, float32(3.14)}, + {pb.E_DefaultInt32, setInt32, int32(42)}, + {pb.E_DefaultInt64, setInt64, int64(43)}, + {pb.E_DefaultUint32, setUint32, uint32(44)}, + {pb.E_DefaultUint64, setUint64, uint64(45)}, + {pb.E_DefaultSint32, setInt32, int32(46)}, + {pb.E_DefaultSint64, setInt64, int64(47)}, + {pb.E_DefaultFixed32, setUint32, uint32(48)}, + {pb.E_DefaultFixed64, setUint64, uint64(49)}, + {pb.E_DefaultSfixed32, setInt32, int32(50)}, + {pb.E_DefaultSfixed64, setInt64, int64(51)}, + {pb.E_DefaultBool, setBool, true}, + {pb.E_DefaultBool, setBool2, true}, + {pb.E_DefaultString, setString, "Hello, string"}, + {pb.E_DefaultBytes, setBytes, []byte("Hello, bytes")}, + {pb.E_DefaultEnum, setEnum, pb.DefaultsMessage_ONE}, + } + + checkVal := func(test testcase, msg *pb.DefaultsMessage, valWant interface{}) error { + val, err := proto.GetExtension(msg, test.ext) + if err != nil { + if valWant != nil { + return fmt.Errorf("GetExtension(): %s", err) + } + if want := proto.ErrMissingExtension; err != want { + return fmt.Errorf("Unexpected error: got %v, want %v", err, want) + } + return nil + } + + // All proto2 extension values are either a pointer to a value or a slice of values. + ty := reflect.TypeOf(val) + tyWant := reflect.TypeOf(test.ext.ExtensionType) + if got, want := ty, tyWant; got != want { + return fmt.Errorf("unexpected reflect.TypeOf(): got %v want %v", got, want) + } + tye := ty.Elem() + tyeWant := tyWant.Elem() + if got, want := tye, tyeWant; got != want { + return fmt.Errorf("unexpected reflect.TypeOf().Elem(): got %v want %v", got, want) + } + + // Check the name of the type of the value. + // If it is an enum it will be type int32 with the name of the enum. + if got, want := tye.Name(), tye.Name(); got != want { + return fmt.Errorf("unexpected reflect.TypeOf().Elem().Name(): got %v want %v", got, want) + } + + // Check that value is what we expect. + // If we have a pointer in val, get the value it points to. + valExp := val + if ty.Kind() == reflect.Ptr { + valExp = reflect.ValueOf(val).Elem().Interface() + } + if got, want := valExp, valWant; !reflect.DeepEqual(got, want) { + return fmt.Errorf("unexpected reflect.DeepEqual(): got %v want %v", got, want) + } + + return nil + } + + setTo := func(test testcase) interface{} { + setTo := reflect.ValueOf(test.want) + if typ := reflect.TypeOf(test.ext.ExtensionType); typ.Kind() == reflect.Ptr { + setTo = reflect.New(typ).Elem() + setTo.Set(reflect.New(setTo.Type().Elem())) + setTo.Elem().Set(reflect.ValueOf(test.want)) + } + return setTo.Interface() + } + + for _, test := range tests { + msg := &pb.DefaultsMessage{} + name := test.ext.Name + + // Check the initial value. + if err := checkVal(test, msg, test.def); err != nil { + t.Errorf("%s: %v", name, err) + } + + // Set the per-type value and check value. + name = fmt.Sprintf("%s (set to %T %v)", name, test.want, test.want) + if err := proto.SetExtension(msg, test.ext, setTo(test)); err != nil { + t.Errorf("%s: SetExtension(): %v", name, err) + continue + } + if err := checkVal(test, msg, test.want); err != nil { + t.Errorf("%s: %v", name, err) + continue + } + + // Set and check the value. + name += " (cleared)" + proto.ClearExtension(msg, test.ext) + if err := checkVal(test, msg, test.def); err != nil { + t.Errorf("%s: %v", name, err) + } + } +} + +func TestExtensionsRoundTrip(t *testing.T) { + msg := &pb.MyMessage{} + ext1 := &pb.Ext{ + Data: proto.String("hi"), + } + ext2 := &pb.Ext{ + Data: proto.String("there"), + } + exists := proto.HasExtension(msg, pb.E_Ext_More) + if exists { + t.Error("Extension More present unexpectedly") + } + if err := proto.SetExtension(msg, pb.E_Ext_More, ext1); err != nil { + t.Error(err) + } + if err := proto.SetExtension(msg, pb.E_Ext_More, ext2); err != nil { + t.Error(err) + } + e, err := proto.GetExtension(msg, pb.E_Ext_More) + if err != nil { + t.Error(err) + } + x, ok := e.(*pb.Ext) + if !ok { + t.Errorf("e has type %T, expected testdata.Ext", e) + } else if *x.Data != "there" { + t.Errorf("SetExtension failed to overwrite, got %+v, not 'there'", x) + } + proto.ClearExtension(msg, pb.E_Ext_More) + if _, err = proto.GetExtension(msg, pb.E_Ext_More); err != proto.ErrMissingExtension { + t.Errorf("got %v, expected ErrMissingExtension", e) + } + if _, err := proto.GetExtension(msg, pb.E_X215); err == nil { + t.Error("expected bad extension error, got nil") + } + if err := proto.SetExtension(msg, pb.E_X215, 12); err == nil { + t.Error("expected extension err") + } + if err := proto.SetExtension(msg, pb.E_Ext_More, 12); err == nil { + t.Error("expected some sort of type mismatch error, got nil") + } +} + +func TestNilExtension(t *testing.T) { + msg := &pb.MyMessage{ + Count: proto.Int32(1), + } + if err := proto.SetExtension(msg, pb.E_Ext_Text, proto.String("hello")); err != nil { + t.Fatal(err) + } + if err := proto.SetExtension(msg, pb.E_Ext_More, (*pb.Ext)(nil)); err == nil { + t.Error("expected SetExtension to fail due to a nil extension") + } else if want := "proto: SetExtension called with nil value of type *testdata.Ext"; err.Error() != want { + t.Errorf("expected error %v, got %v", want, err) + } + // Note: if the behavior of Marshal is ever changed to ignore nil extensions, update + // this test to verify that E_Ext_Text is properly propagated through marshal->unmarshal. +} + +func TestMarshalUnmarshalRepeatedExtension(t *testing.T) { + // Add a repeated extension to the result. + tests := []struct { + name string + ext []*pb.ComplexExtension + }{ + { + "two fields", + []*pb.ComplexExtension{ + {First: proto.Int32(7)}, + {Second: proto.Int32(11)}, + }, + }, + { + "repeated field", + []*pb.ComplexExtension{ + {Third: []int32{1000}}, + {Third: []int32{2000}}, + }, + }, + { + "two fields and repeated field", + []*pb.ComplexExtension{ + {Third: []int32{1000}}, + {First: proto.Int32(9)}, + {Second: proto.Int32(21)}, + {Third: []int32{2000}}, + }, + }, + } + for _, test := range tests { + // Marshal message with a repeated extension. + msg1 := new(pb.OtherMessage) + err := proto.SetExtension(msg1, pb.E_RComplex, test.ext) + if err != nil { + t.Fatalf("[%s] Error setting extension: %v", test.name, err) + } + b, err := proto.Marshal(msg1) + if err != nil { + t.Fatalf("[%s] Error marshaling message: %v", test.name, err) + } + + // Unmarshal and read the merged proto. + msg2 := new(pb.OtherMessage) + err = proto.Unmarshal(b, msg2) + if err != nil { + t.Fatalf("[%s] Error unmarshaling message: %v", test.name, err) + } + e, err := proto.GetExtension(msg2, pb.E_RComplex) + if err != nil { + t.Fatalf("[%s] Error getting extension: %v", test.name, err) + } + ext := e.([]*pb.ComplexExtension) + if ext == nil { + t.Fatalf("[%s] Invalid extension", test.name) + } + if !reflect.DeepEqual(ext, test.ext) { + t.Errorf("[%s] Wrong value for ComplexExtension: got: %v want: %v\n", test.name, ext, test.ext) + } + } +} + +func TestUnmarshalRepeatingNonRepeatedExtension(t *testing.T) { + // We may see multiple instances of the same extension in the wire + // format. For example, the proto compiler may encode custom options in + // this way. Here, we verify that we merge the extensions together. + tests := []struct { + name string + ext []*pb.ComplexExtension + }{ + { + "two fields", + []*pb.ComplexExtension{ + {First: proto.Int32(7)}, + {Second: proto.Int32(11)}, + }, + }, + { + "repeated field", + []*pb.ComplexExtension{ + {Third: []int32{1000}}, + {Third: []int32{2000}}, + }, + }, + { + "two fields and repeated field", + []*pb.ComplexExtension{ + {Third: []int32{1000}}, + {First: proto.Int32(9)}, + {Second: proto.Int32(21)}, + {Third: []int32{2000}}, + }, + }, + } + for _, test := range tests { + var buf bytes.Buffer + var want pb.ComplexExtension + + // Generate a serialized representation of a repeated extension + // by catenating bytes together. + for i, e := range test.ext { + // Merge to create the wanted proto. + proto.Merge(&want, e) + + // serialize the message + msg := new(pb.OtherMessage) + err := proto.SetExtension(msg, pb.E_Complex, e) + if err != nil { + t.Fatalf("[%s] Error setting extension %d: %v", test.name, i, err) + } + b, err := proto.Marshal(msg) + if err != nil { + t.Fatalf("[%s] Error marshaling message %d: %v", test.name, i, err) + } + buf.Write(b) + } + + // Unmarshal and read the merged proto. + msg2 := new(pb.OtherMessage) + err := proto.Unmarshal(buf.Bytes(), msg2) + if err != nil { + t.Fatalf("[%s] Error unmarshaling message: %v", test.name, err) + } + e, err := proto.GetExtension(msg2, pb.E_Complex) + if err != nil { + t.Fatalf("[%s] Error getting extension: %v", test.name, err) + } + ext := e.(*pb.ComplexExtension) + if ext == nil { + t.Fatalf("[%s] Invalid extension", test.name) + } + if !reflect.DeepEqual(*ext, want) { + t.Errorf("[%s] Wrong value for ComplexExtension: got: %s want: %s\n", test.name, ext, want) + } + } +} + +func TestClearAllExtensions(t *testing.T) { + // unregistered extension + desc := &proto.ExtensionDesc{ + ExtendedType: (*pb.MyMessage)(nil), + ExtensionType: (*bool)(nil), + Field: 101010100, + Name: "emptyextension", + Tag: "varint,0,opt", + } + m := &pb.MyMessage{} + if proto.HasExtension(m, desc) { + t.Errorf("proto.HasExtension(%s): got true, want false", proto.MarshalTextString(m)) + } + if err := proto.SetExtension(m, desc, proto.Bool(true)); err != nil { + t.Errorf("proto.SetExtension(m, desc, true): got error %q, want nil", err) + } + if !proto.HasExtension(m, desc) { + t.Errorf("proto.HasExtension(%s): got false, want true", proto.MarshalTextString(m)) + } + proto.ClearAllExtensions(m) + if proto.HasExtension(m, desc) { + t.Errorf("proto.HasExtension(%s): got true, want false", proto.MarshalTextString(m)) + } +} + +func TestMarshalRace(t *testing.T) { + // unregistered extension + desc := &proto.ExtensionDesc{ + ExtendedType: (*pb.MyMessage)(nil), + ExtensionType: (*bool)(nil), + Field: 101010100, + Name: "emptyextension", + Tag: "varint,0,opt", + } + + m := &pb.MyMessage{Count: proto.Int32(4)} + if err := proto.SetExtension(m, desc, proto.Bool(true)); err != nil { + t.Errorf("proto.SetExtension(m, desc, true): got error %q, want nil", err) + } + + var g errgroup.Group + for n := 3; n > 0; n-- { + g.Go(func() error { + _, err := proto.Marshal(m) + return err + }) + } + if err := g.Wait(); err != nil { + t.Fatal(err) + } +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/lib.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/lib.go new file mode 100644 index 0000000..1c22550 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/lib.go @@ -0,0 +1,897 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +/* +Package proto converts data structures to and from the wire format of +protocol buffers. It works in concert with the Go source code generated +for .proto files by the protocol compiler. + +A summary of the properties of the protocol buffer interface +for a protocol buffer variable v: + + - Names are turned from camel_case to CamelCase for export. + - There are no methods on v to set fields; just treat + them as structure fields. + - There are getters that return a field's value if set, + and return the field's default value if unset. + The getters work even if the receiver is a nil message. + - The zero value for a struct is its correct initialization state. + All desired fields must be set before marshaling. + - A Reset() method will restore a protobuf struct to its zero state. + - Non-repeated fields are pointers to the values; nil means unset. + That is, optional or required field int32 f becomes F *int32. + - Repeated fields are slices. + - Helper functions are available to aid the setting of fields. + msg.Foo = proto.String("hello") // set field + - Constants are defined to hold the default values of all fields that + have them. They have the form Default_StructName_FieldName. + Because the getter methods handle defaulted values, + direct use of these constants should be rare. + - Enums are given type names and maps from names to values. + Enum values are prefixed by the enclosing message's name, or by the + enum's type name if it is a top-level enum. Enum types have a String + method, and a Enum method to assist in message construction. + - Nested messages, groups and enums have type names prefixed with the name of + the surrounding message type. + - Extensions are given descriptor names that start with E_, + followed by an underscore-delimited list of the nested messages + that contain it (if any) followed by the CamelCased name of the + extension field itself. HasExtension, ClearExtension, GetExtension + and SetExtension are functions for manipulating extensions. + - Oneof field sets are given a single field in their message, + with distinguished wrapper types for each possible field value. + - Marshal and Unmarshal are functions to encode and decode the wire format. + +When the .proto file specifies `syntax="proto3"`, there are some differences: + + - Non-repeated fields of non-message type are values instead of pointers. + - Enum types do not get an Enum method. + +The simplest way to describe this is to see an example. +Given file test.proto, containing + + package example; + + enum FOO { X = 17; } + + message Test { + required string label = 1; + optional int32 type = 2 [default=77]; + repeated int64 reps = 3; + optional group OptionalGroup = 4 { + required string RequiredField = 5; + } + oneof union { + int32 number = 6; + string name = 7; + } + } + +The resulting file, test.pb.go, is: + + package example + + import proto "github.com/golang/protobuf/proto" + import math "math" + + type FOO int32 + const ( + FOO_X FOO = 17 + ) + var FOO_name = map[int32]string{ + 17: "X", + } + var FOO_value = map[string]int32{ + "X": 17, + } + + func (x FOO) Enum() *FOO { + p := new(FOO) + *p = x + return p + } + func (x FOO) String() string { + return proto.EnumName(FOO_name, int32(x)) + } + func (x *FOO) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FOO_value, data) + if err != nil { + return err + } + *x = FOO(value) + return nil + } + + type Test struct { + Label *string `protobuf:"bytes,1,req,name=label" json:"label,omitempty"` + Type *int32 `protobuf:"varint,2,opt,name=type,def=77" json:"type,omitempty"` + Reps []int64 `protobuf:"varint,3,rep,name=reps" json:"reps,omitempty"` + Optionalgroup *Test_OptionalGroup `protobuf:"group,4,opt,name=OptionalGroup" json:"optionalgroup,omitempty"` + // Types that are valid to be assigned to Union: + // *Test_Number + // *Test_Name + Union isTest_Union `protobuf_oneof:"union"` + XXX_unrecognized []byte `json:"-"` + } + func (m *Test) Reset() { *m = Test{} } + func (m *Test) String() string { return proto.CompactTextString(m) } + func (*Test) ProtoMessage() {} + + type isTest_Union interface { + isTest_Union() + } + + type Test_Number struct { + Number int32 `protobuf:"varint,6,opt,name=number"` + } + type Test_Name struct { + Name string `protobuf:"bytes,7,opt,name=name"` + } + + func (*Test_Number) isTest_Union() {} + func (*Test_Name) isTest_Union() {} + + func (m *Test) GetUnion() isTest_Union { + if m != nil { + return m.Union + } + return nil + } + const Default_Test_Type int32 = 77 + + func (m *Test) GetLabel() string { + if m != nil && m.Label != nil { + return *m.Label + } + return "" + } + + func (m *Test) GetType() int32 { + if m != nil && m.Type != nil { + return *m.Type + } + return Default_Test_Type + } + + func (m *Test) GetOptionalgroup() *Test_OptionalGroup { + if m != nil { + return m.Optionalgroup + } + return nil + } + + type Test_OptionalGroup struct { + RequiredField *string `protobuf:"bytes,5,req" json:"RequiredField,omitempty"` + } + func (m *Test_OptionalGroup) Reset() { *m = Test_OptionalGroup{} } + func (m *Test_OptionalGroup) String() string { return proto.CompactTextString(m) } + + func (m *Test_OptionalGroup) GetRequiredField() string { + if m != nil && m.RequiredField != nil { + return *m.RequiredField + } + return "" + } + + func (m *Test) GetNumber() int32 { + if x, ok := m.GetUnion().(*Test_Number); ok { + return x.Number + } + return 0 + } + + func (m *Test) GetName() string { + if x, ok := m.GetUnion().(*Test_Name); ok { + return x.Name + } + return "" + } + + func init() { + proto.RegisterEnum("example.FOO", FOO_name, FOO_value) + } + +To create and play with a Test object: + + package main + + import ( + "log" + + "github.com/golang/protobuf/proto" + pb "./example.pb" + ) + + func main() { + test := &pb.Test{ + Label: proto.String("hello"), + Type: proto.Int32(17), + Reps: []int64{1, 2, 3}, + Optionalgroup: &pb.Test_OptionalGroup{ + RequiredField: proto.String("good bye"), + }, + Union: &pb.Test_Name{"fred"}, + } + data, err := proto.Marshal(test) + if err != nil { + log.Fatal("marshaling error: ", err) + } + newTest := &pb.Test{} + err = proto.Unmarshal(data, newTest) + if err != nil { + log.Fatal("unmarshaling error: ", err) + } + // Now test and newTest contain the same data. + if test.GetLabel() != newTest.GetLabel() { + log.Fatalf("data mismatch %q != %q", test.GetLabel(), newTest.GetLabel()) + } + // Use a type switch to determine which oneof was set. + switch u := test.Union.(type) { + case *pb.Test_Number: // u.Number contains the number. + case *pb.Test_Name: // u.Name contains the string. + } + // etc. + } +*/ +package proto + +import ( + "encoding/json" + "fmt" + "log" + "reflect" + "sort" + "strconv" + "sync" +) + +// Message is implemented by generated protocol buffer messages. +type Message interface { + Reset() + String() string + ProtoMessage() +} + +// Stats records allocation details about the protocol buffer encoders +// and decoders. Useful for tuning the library itself. +type Stats struct { + Emalloc uint64 // mallocs in encode + Dmalloc uint64 // mallocs in decode + Encode uint64 // number of encodes + Decode uint64 // number of decodes + Chit uint64 // number of cache hits + Cmiss uint64 // number of cache misses + Size uint64 // number of sizes +} + +// Set to true to enable stats collection. +const collectStats = false + +var stats Stats + +// GetStats returns a copy of the global Stats structure. +func GetStats() Stats { return stats } + +// A Buffer is a buffer manager for marshaling and unmarshaling +// protocol buffers. It may be reused between invocations to +// reduce memory usage. It is not necessary to use a Buffer; +// the global functions Marshal and Unmarshal create a +// temporary Buffer and are fine for most applications. +type Buffer struct { + buf []byte // encode/decode byte stream + index int // read point + + // pools of basic types to amortize allocation. + bools []bool + uint32s []uint32 + uint64s []uint64 + + // extra pools, only used with pointer_reflect.go + int32s []int32 + int64s []int64 + float32s []float32 + float64s []float64 +} + +// NewBuffer allocates a new Buffer and initializes its internal data to +// the contents of the argument slice. +func NewBuffer(e []byte) *Buffer { + return &Buffer{buf: e} +} + +// Reset resets the Buffer, ready for marshaling a new protocol buffer. +func (p *Buffer) Reset() { + p.buf = p.buf[0:0] // for reading/writing + p.index = 0 // for reading +} + +// SetBuf replaces the internal buffer with the slice, +// ready for unmarshaling the contents of the slice. +func (p *Buffer) SetBuf(s []byte) { + p.buf = s + p.index = 0 +} + +// Bytes returns the contents of the Buffer. +func (p *Buffer) Bytes() []byte { return p.buf } + +/* + * Helper routines for simplifying the creation of optional fields of basic type. + */ + +// Bool is a helper routine that allocates a new bool value +// to store v and returns a pointer to it. +func Bool(v bool) *bool { + return &v +} + +// Int32 is a helper routine that allocates a new int32 value +// to store v and returns a pointer to it. +func Int32(v int32) *int32 { + return &v +} + +// Int is a helper routine that allocates a new int32 value +// to store v and returns a pointer to it, but unlike Int32 +// its argument value is an int. +func Int(v int) *int32 { + p := new(int32) + *p = int32(v) + return p +} + +// Int64 is a helper routine that allocates a new int64 value +// to store v and returns a pointer to it. +func Int64(v int64) *int64 { + return &v +} + +// Float32 is a helper routine that allocates a new float32 value +// to store v and returns a pointer to it. +func Float32(v float32) *float32 { + return &v +} + +// Float64 is a helper routine that allocates a new float64 value +// to store v and returns a pointer to it. +func Float64(v float64) *float64 { + return &v +} + +// Uint32 is a helper routine that allocates a new uint32 value +// to store v and returns a pointer to it. +func Uint32(v uint32) *uint32 { + return &v +} + +// Uint64 is a helper routine that allocates a new uint64 value +// to store v and returns a pointer to it. +func Uint64(v uint64) *uint64 { + return &v +} + +// String is a helper routine that allocates a new string value +// to store v and returns a pointer to it. +func String(v string) *string { + return &v +} + +// EnumName is a helper function to simplify printing protocol buffer enums +// by name. Given an enum map and a value, it returns a useful string. +func EnumName(m map[int32]string, v int32) string { + s, ok := m[v] + if ok { + return s + } + return strconv.Itoa(int(v)) +} + +// UnmarshalJSONEnum is a helper function to simplify recovering enum int values +// from their JSON-encoded representation. Given a map from the enum's symbolic +// names to its int values, and a byte buffer containing the JSON-encoded +// value, it returns an int32 that can be cast to the enum type by the caller. +// +// The function can deal with both JSON representations, numeric and symbolic. +func UnmarshalJSONEnum(m map[string]int32, data []byte, enumName string) (int32, error) { + if data[0] == '"' { + // New style: enums are strings. + var repr string + if err := json.Unmarshal(data, &repr); err != nil { + return -1, err + } + val, ok := m[repr] + if !ok { + return 0, fmt.Errorf("unrecognized enum %s value %q", enumName, repr) + } + return val, nil + } + // Old style: enums are ints. + var val int32 + if err := json.Unmarshal(data, &val); err != nil { + return 0, fmt.Errorf("cannot unmarshal %#q into enum %s", data, enumName) + } + return val, nil +} + +// DebugPrint dumps the encoded data in b in a debugging format with a header +// including the string s. Used in testing but made available for general debugging. +func (p *Buffer) DebugPrint(s string, b []byte) { + var u uint64 + + obuf := p.buf + index := p.index + p.buf = b + p.index = 0 + depth := 0 + + fmt.Printf("\n--- %s ---\n", s) + +out: + for { + for i := 0; i < depth; i++ { + fmt.Print(" ") + } + + index := p.index + if index == len(p.buf) { + break + } + + op, err := p.DecodeVarint() + if err != nil { + fmt.Printf("%3d: fetching op err %v\n", index, err) + break out + } + tag := op >> 3 + wire := op & 7 + + switch wire { + default: + fmt.Printf("%3d: t=%3d unknown wire=%d\n", + index, tag, wire) + break out + + case WireBytes: + var r []byte + + r, err = p.DecodeRawBytes(false) + if err != nil { + break out + } + fmt.Printf("%3d: t=%3d bytes [%d]", index, tag, len(r)) + if len(r) <= 6 { + for i := 0; i < len(r); i++ { + fmt.Printf(" %.2x", r[i]) + } + } else { + for i := 0; i < 3; i++ { + fmt.Printf(" %.2x", r[i]) + } + fmt.Printf(" ..") + for i := len(r) - 3; i < len(r); i++ { + fmt.Printf(" %.2x", r[i]) + } + } + fmt.Printf("\n") + + case WireFixed32: + u, err = p.DecodeFixed32() + if err != nil { + fmt.Printf("%3d: t=%3d fix32 err %v\n", index, tag, err) + break out + } + fmt.Printf("%3d: t=%3d fix32 %d\n", index, tag, u) + + case WireFixed64: + u, err = p.DecodeFixed64() + if err != nil { + fmt.Printf("%3d: t=%3d fix64 err %v\n", index, tag, err) + break out + } + fmt.Printf("%3d: t=%3d fix64 %d\n", index, tag, u) + + case WireVarint: + u, err = p.DecodeVarint() + if err != nil { + fmt.Printf("%3d: t=%3d varint err %v\n", index, tag, err) + break out + } + fmt.Printf("%3d: t=%3d varint %d\n", index, tag, u) + + case WireStartGroup: + fmt.Printf("%3d: t=%3d start\n", index, tag) + depth++ + + case WireEndGroup: + depth-- + fmt.Printf("%3d: t=%3d end\n", index, tag) + } + } + + if depth != 0 { + fmt.Printf("%3d: start-end not balanced %d\n", p.index, depth) + } + fmt.Printf("\n") + + p.buf = obuf + p.index = index +} + +// SetDefaults sets unset protocol buffer fields to their default values. +// It only modifies fields that are both unset and have defined defaults. +// It recursively sets default values in any non-nil sub-messages. +func SetDefaults(pb Message) { + setDefaults(reflect.ValueOf(pb), true, false) +} + +// v is a pointer to a struct. +func setDefaults(v reflect.Value, recur, zeros bool) { + v = v.Elem() + + defaultMu.RLock() + dm, ok := defaults[v.Type()] + defaultMu.RUnlock() + if !ok { + dm = buildDefaultMessage(v.Type()) + defaultMu.Lock() + defaults[v.Type()] = dm + defaultMu.Unlock() + } + + for _, sf := range dm.scalars { + f := v.Field(sf.index) + if !f.IsNil() { + // field already set + continue + } + dv := sf.value + if dv == nil && !zeros { + // no explicit default, and don't want to set zeros + continue + } + fptr := f.Addr().Interface() // **T + // TODO: Consider batching the allocations we do here. + switch sf.kind { + case reflect.Bool: + b := new(bool) + if dv != nil { + *b = dv.(bool) + } + *(fptr.(**bool)) = b + case reflect.Float32: + f := new(float32) + if dv != nil { + *f = dv.(float32) + } + *(fptr.(**float32)) = f + case reflect.Float64: + f := new(float64) + if dv != nil { + *f = dv.(float64) + } + *(fptr.(**float64)) = f + case reflect.Int32: + // might be an enum + if ft := f.Type(); ft != int32PtrType { + // enum + f.Set(reflect.New(ft.Elem())) + if dv != nil { + f.Elem().SetInt(int64(dv.(int32))) + } + } else { + // int32 field + i := new(int32) + if dv != nil { + *i = dv.(int32) + } + *(fptr.(**int32)) = i + } + case reflect.Int64: + i := new(int64) + if dv != nil { + *i = dv.(int64) + } + *(fptr.(**int64)) = i + case reflect.String: + s := new(string) + if dv != nil { + *s = dv.(string) + } + *(fptr.(**string)) = s + case reflect.Uint8: + // exceptional case: []byte + var b []byte + if dv != nil { + db := dv.([]byte) + b = make([]byte, len(db)) + copy(b, db) + } else { + b = []byte{} + } + *(fptr.(*[]byte)) = b + case reflect.Uint32: + u := new(uint32) + if dv != nil { + *u = dv.(uint32) + } + *(fptr.(**uint32)) = u + case reflect.Uint64: + u := new(uint64) + if dv != nil { + *u = dv.(uint64) + } + *(fptr.(**uint64)) = u + default: + log.Printf("proto: can't set default for field %v (sf.kind=%v)", f, sf.kind) + } + } + + for _, ni := range dm.nested { + f := v.Field(ni) + // f is *T or []*T or map[T]*T + switch f.Kind() { + case reflect.Ptr: + if f.IsNil() { + continue + } + setDefaults(f, recur, zeros) + + case reflect.Slice: + for i := 0; i < f.Len(); i++ { + e := f.Index(i) + if e.IsNil() { + continue + } + setDefaults(e, recur, zeros) + } + + case reflect.Map: + for _, k := range f.MapKeys() { + e := f.MapIndex(k) + if e.IsNil() { + continue + } + setDefaults(e, recur, zeros) + } + } + } +} + +var ( + // defaults maps a protocol buffer struct type to a slice of the fields, + // with its scalar fields set to their proto-declared non-zero default values. + defaultMu sync.RWMutex + defaults = make(map[reflect.Type]defaultMessage) + + int32PtrType = reflect.TypeOf((*int32)(nil)) +) + +// defaultMessage represents information about the default values of a message. +type defaultMessage struct { + scalars []scalarField + nested []int // struct field index of nested messages +} + +type scalarField struct { + index int // struct field index + kind reflect.Kind // element type (the T in *T or []T) + value interface{} // the proto-declared default value, or nil +} + +// t is a struct type. +func buildDefaultMessage(t reflect.Type) (dm defaultMessage) { + sprop := GetProperties(t) + for _, prop := range sprop.Prop { + fi, ok := sprop.decoderTags.get(prop.Tag) + if !ok { + // XXX_unrecognized + continue + } + ft := t.Field(fi).Type + + sf, nested, err := fieldDefault(ft, prop) + switch { + case err != nil: + log.Print(err) + case nested: + dm.nested = append(dm.nested, fi) + case sf != nil: + sf.index = fi + dm.scalars = append(dm.scalars, *sf) + } + } + + return dm +} + +// fieldDefault returns the scalarField for field type ft. +// sf will be nil if the field can not have a default. +// nestedMessage will be true if this is a nested message. +// Note that sf.index is not set on return. +func fieldDefault(ft reflect.Type, prop *Properties) (sf *scalarField, nestedMessage bool, err error) { + var canHaveDefault bool + switch ft.Kind() { + case reflect.Ptr: + if ft.Elem().Kind() == reflect.Struct { + nestedMessage = true + } else { + canHaveDefault = true // proto2 scalar field + } + + case reflect.Slice: + switch ft.Elem().Kind() { + case reflect.Ptr: + nestedMessage = true // repeated message + case reflect.Uint8: + canHaveDefault = true // bytes field + } + + case reflect.Map: + if ft.Elem().Kind() == reflect.Ptr { + nestedMessage = true // map with message values + } + } + + if !canHaveDefault { + if nestedMessage { + return nil, true, nil + } + return nil, false, nil + } + + // We now know that ft is a pointer or slice. + sf = &scalarField{kind: ft.Elem().Kind()} + + // scalar fields without defaults + if !prop.HasDefault { + return sf, false, nil + } + + // a scalar field: either *T or []byte + switch ft.Elem().Kind() { + case reflect.Bool: + x, err := strconv.ParseBool(prop.Default) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default bool %q: %v", prop.Default, err) + } + sf.value = x + case reflect.Float32: + x, err := strconv.ParseFloat(prop.Default, 32) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default float32 %q: %v", prop.Default, err) + } + sf.value = float32(x) + case reflect.Float64: + x, err := strconv.ParseFloat(prop.Default, 64) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default float64 %q: %v", prop.Default, err) + } + sf.value = x + case reflect.Int32: + x, err := strconv.ParseInt(prop.Default, 10, 32) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default int32 %q: %v", prop.Default, err) + } + sf.value = int32(x) + case reflect.Int64: + x, err := strconv.ParseInt(prop.Default, 10, 64) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default int64 %q: %v", prop.Default, err) + } + sf.value = x + case reflect.String: + sf.value = prop.Default + case reflect.Uint8: + // []byte (not *uint8) + sf.value = []byte(prop.Default) + case reflect.Uint32: + x, err := strconv.ParseUint(prop.Default, 10, 32) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default uint32 %q: %v", prop.Default, err) + } + sf.value = uint32(x) + case reflect.Uint64: + x, err := strconv.ParseUint(prop.Default, 10, 64) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default uint64 %q: %v", prop.Default, err) + } + sf.value = x + default: + return nil, false, fmt.Errorf("proto: unhandled def kind %v", ft.Elem().Kind()) + } + + return sf, false, nil +} + +// Map fields may have key types of non-float scalars, strings and enums. +// The easiest way to sort them in some deterministic order is to use fmt. +// If this turns out to be inefficient we can always consider other options, +// such as doing a Schwartzian transform. + +func mapKeys(vs []reflect.Value) sort.Interface { + s := mapKeySorter{ + vs: vs, + // default Less function: textual comparison + less: func(a, b reflect.Value) bool { + return fmt.Sprint(a.Interface()) < fmt.Sprint(b.Interface()) + }, + } + + // Type specialization per https://developers.google.com/protocol-buffers/docs/proto#maps; + // numeric keys are sorted numerically. + if len(vs) == 0 { + return s + } + switch vs[0].Kind() { + case reflect.Int32, reflect.Int64: + s.less = func(a, b reflect.Value) bool { return a.Int() < b.Int() } + case reflect.Uint32, reflect.Uint64: + s.less = func(a, b reflect.Value) bool { return a.Uint() < b.Uint() } + } + + return s +} + +type mapKeySorter struct { + vs []reflect.Value + less func(a, b reflect.Value) bool +} + +func (s mapKeySorter) Len() int { return len(s.vs) } +func (s mapKeySorter) Swap(i, j int) { s.vs[i], s.vs[j] = s.vs[j], s.vs[i] } +func (s mapKeySorter) Less(i, j int) bool { + return s.less(s.vs[i], s.vs[j]) +} + +// isProto3Zero reports whether v is a zero proto3 value. +func isProto3Zero(v reflect.Value) bool { + switch v.Kind() { + case reflect.Bool: + return !v.Bool() + case reflect.Int32, reflect.Int64: + return v.Int() == 0 + case reflect.Uint32, reflect.Uint64: + return v.Uint() == 0 + case reflect.Float32, reflect.Float64: + return v.Float() == 0 + case reflect.String: + return v.String() == "" + } + return false +} + +// ProtoPackageIsVersion2 is referenced from generated protocol buffer files +// to assert that that code is compatible with this version of the proto package. +const ProtoPackageIsVersion2 = true + +// ProtoPackageIsVersion1 is referenced from generated protocol buffer files +// to assert that that code is compatible with this version of the proto package. +const ProtoPackageIsVersion1 = true diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/map_test.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/map_test.go new file mode 100644 index 0000000..313e879 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/map_test.go @@ -0,0 +1,46 @@ +package proto_test + +import ( + "fmt" + "testing" + + "github.com/golang/protobuf/proto" + ppb "github.com/golang/protobuf/proto/proto3_proto" +) + +func marshalled() []byte { + m := &ppb.IntMaps{} + for i := 0; i < 1000; i++ { + m.Maps = append(m.Maps, &ppb.IntMap{ + Rtt: map[int32]int32{1: 2}, + }) + } + b, err := proto.Marshal(m) + if err != nil { + panic(fmt.Sprintf("Can't marshal %+v: %v", m, err)) + } + return b +} + +func BenchmarkConcurrentMapUnmarshal(b *testing.B) { + in := marshalled() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + var out ppb.IntMaps + if err := proto.Unmarshal(in, &out); err != nil { + b.Errorf("Can't unmarshal ppb.IntMaps: %v", err) + } + } + }) +} + +func BenchmarkSequentialMapUnmarshal(b *testing.B) { + in := marshalled() + b.ResetTimer() + for i := 0; i < b.N; i++ { + var out ppb.IntMaps + if err := proto.Unmarshal(in, &out); err != nil { + b.Errorf("Can't unmarshal ppb.IntMaps: %v", err) + } + } +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/message_set.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/message_set.go new file mode 100644 index 0000000..fd982de --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/message_set.go @@ -0,0 +1,311 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package proto + +/* + * Support for message sets. + */ + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "reflect" + "sort" +) + +// errNoMessageTypeID occurs when a protocol buffer does not have a message type ID. +// A message type ID is required for storing a protocol buffer in a message set. +var errNoMessageTypeID = errors.New("proto does not have a message type ID") + +// The first two types (_MessageSet_Item and messageSet) +// model what the protocol compiler produces for the following protocol message: +// message MessageSet { +// repeated group Item = 1 { +// required int32 type_id = 2; +// required string message = 3; +// }; +// } +// That is the MessageSet wire format. We can't use a proto to generate these +// because that would introduce a circular dependency between it and this package. + +type _MessageSet_Item struct { + TypeId *int32 `protobuf:"varint,2,req,name=type_id"` + Message []byte `protobuf:"bytes,3,req,name=message"` +} + +type messageSet struct { + Item []*_MessageSet_Item `protobuf:"group,1,rep"` + XXX_unrecognized []byte + // TODO: caching? +} + +// Make sure messageSet is a Message. +var _ Message = (*messageSet)(nil) + +// messageTypeIder is an interface satisfied by a protocol buffer type +// that may be stored in a MessageSet. +type messageTypeIder interface { + MessageTypeId() int32 +} + +func (ms *messageSet) find(pb Message) *_MessageSet_Item { + mti, ok := pb.(messageTypeIder) + if !ok { + return nil + } + id := mti.MessageTypeId() + for _, item := range ms.Item { + if *item.TypeId == id { + return item + } + } + return nil +} + +func (ms *messageSet) Has(pb Message) bool { + if ms.find(pb) != nil { + return true + } + return false +} + +func (ms *messageSet) Unmarshal(pb Message) error { + if item := ms.find(pb); item != nil { + return Unmarshal(item.Message, pb) + } + if _, ok := pb.(messageTypeIder); !ok { + return errNoMessageTypeID + } + return nil // TODO: return error instead? +} + +func (ms *messageSet) Marshal(pb Message) error { + msg, err := Marshal(pb) + if err != nil { + return err + } + if item := ms.find(pb); item != nil { + // reuse existing item + item.Message = msg + return nil + } + + mti, ok := pb.(messageTypeIder) + if !ok { + return errNoMessageTypeID + } + + mtid := mti.MessageTypeId() + ms.Item = append(ms.Item, &_MessageSet_Item{ + TypeId: &mtid, + Message: msg, + }) + return nil +} + +func (ms *messageSet) Reset() { *ms = messageSet{} } +func (ms *messageSet) String() string { return CompactTextString(ms) } +func (*messageSet) ProtoMessage() {} + +// Support for the message_set_wire_format message option. + +func skipVarint(buf []byte) []byte { + i := 0 + for ; buf[i]&0x80 != 0; i++ { + } + return buf[i+1:] +} + +// MarshalMessageSet encodes the extension map represented by m in the message set wire format. +// It is called by generated Marshal methods on protocol buffer messages with the message_set_wire_format option. +func MarshalMessageSet(exts interface{}) ([]byte, error) { + var m map[int32]Extension + switch exts := exts.(type) { + case *XXX_InternalExtensions: + if err := encodeExtensions(exts); err != nil { + return nil, err + } + m, _ = exts.extensionsRead() + case map[int32]Extension: + if err := encodeExtensionsMap(exts); err != nil { + return nil, err + } + m = exts + default: + return nil, errors.New("proto: not an extension map") + } + + // Sort extension IDs to provide a deterministic encoding. + // See also enc_map in encode.go. + ids := make([]int, 0, len(m)) + for id := range m { + ids = append(ids, int(id)) + } + sort.Ints(ids) + + ms := &messageSet{Item: make([]*_MessageSet_Item, 0, len(m))} + for _, id := range ids { + e := m[int32(id)] + // Remove the wire type and field number varint, as well as the length varint. + msg := skipVarint(skipVarint(e.enc)) + + ms.Item = append(ms.Item, &_MessageSet_Item{ + TypeId: Int32(int32(id)), + Message: msg, + }) + } + return Marshal(ms) +} + +// UnmarshalMessageSet decodes the extension map encoded in buf in the message set wire format. +// It is called by generated Unmarshal methods on protocol buffer messages with the message_set_wire_format option. +func UnmarshalMessageSet(buf []byte, exts interface{}) error { + var m map[int32]Extension + switch exts := exts.(type) { + case *XXX_InternalExtensions: + m = exts.extensionsWrite() + case map[int32]Extension: + m = exts + default: + return errors.New("proto: not an extension map") + } + + ms := new(messageSet) + if err := Unmarshal(buf, ms); err != nil { + return err + } + for _, item := range ms.Item { + id := *item.TypeId + msg := item.Message + + // Restore wire type and field number varint, plus length varint. + // Be careful to preserve duplicate items. + b := EncodeVarint(uint64(id)<<3 | WireBytes) + if ext, ok := m[id]; ok { + // Existing data; rip off the tag and length varint + // so we join the new data correctly. + // We can assume that ext.enc is set because we are unmarshaling. + o := ext.enc[len(b):] // skip wire type and field number + _, n := DecodeVarint(o) // calculate length of length varint + o = o[n:] // skip length varint + msg = append(o, msg...) // join old data and new data + } + b = append(b, EncodeVarint(uint64(len(msg)))...) + b = append(b, msg...) + + m[id] = Extension{enc: b} + } + return nil +} + +// MarshalMessageSetJSON encodes the extension map represented by m in JSON format. +// It is called by generated MarshalJSON methods on protocol buffer messages with the message_set_wire_format option. +func MarshalMessageSetJSON(exts interface{}) ([]byte, error) { + var m map[int32]Extension + switch exts := exts.(type) { + case *XXX_InternalExtensions: + m, _ = exts.extensionsRead() + case map[int32]Extension: + m = exts + default: + return nil, errors.New("proto: not an extension map") + } + var b bytes.Buffer + b.WriteByte('{') + + // Process the map in key order for deterministic output. + ids := make([]int32, 0, len(m)) + for id := range m { + ids = append(ids, id) + } + sort.Sort(int32Slice(ids)) // int32Slice defined in text.go + + for i, id := range ids { + ext := m[id] + if i > 0 { + b.WriteByte(',') + } + + msd, ok := messageSetMap[id] + if !ok { + // Unknown type; we can't render it, so skip it. + continue + } + fmt.Fprintf(&b, `"[%s]":`, msd.name) + + x := ext.value + if x == nil { + x = reflect.New(msd.t.Elem()).Interface() + if err := Unmarshal(ext.enc, x.(Message)); err != nil { + return nil, err + } + } + d, err := json.Marshal(x) + if err != nil { + return nil, err + } + b.Write(d) + } + b.WriteByte('}') + return b.Bytes(), nil +} + +// UnmarshalMessageSetJSON decodes the extension map encoded in buf in JSON format. +// It is called by generated UnmarshalJSON methods on protocol buffer messages with the message_set_wire_format option. +func UnmarshalMessageSetJSON(buf []byte, exts interface{}) error { + // Common-case fast path. + if len(buf) == 0 || bytes.Equal(buf, []byte("{}")) { + return nil + } + + // This is fairly tricky, and it's not clear that it is needed. + return errors.New("TODO: UnmarshalMessageSetJSON not yet implemented") +} + +// A global registry of types that can be used in a MessageSet. + +var messageSetMap = make(map[int32]messageSetDesc) + +type messageSetDesc struct { + t reflect.Type // pointer to struct + name string +} + +// RegisterMessageSetType is called from the generated code. +func RegisterMessageSetType(m Message, fieldNum int32, name string) { + messageSetMap[fieldNum] = messageSetDesc{ + t: reflect.TypeOf(m), + name: name, + } +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/message_set_test.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/message_set_test.go new file mode 100644 index 0000000..353a3ea --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/message_set_test.go @@ -0,0 +1,66 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2014 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package proto + +import ( + "bytes" + "testing" +) + +func TestUnmarshalMessageSetWithDuplicate(t *testing.T) { + // Check that a repeated message set entry will be concatenated. + in := &messageSet{ + Item: []*_MessageSet_Item{ + {TypeId: Int32(12345), Message: []byte("hoo")}, + {TypeId: Int32(12345), Message: []byte("hah")}, + }, + } + b, err := Marshal(in) + if err != nil { + t.Fatalf("Marshal: %v", err) + } + t.Logf("Marshaled bytes: %q", b) + + var extensions XXX_InternalExtensions + if err := UnmarshalMessageSet(b, &extensions); err != nil { + t.Fatalf("UnmarshalMessageSet: %v", err) + } + ext, ok := extensions.p.extensionMap[12345] + if !ok { + t.Fatalf("Didn't retrieve extension 12345; map is %v", extensions.p.extensionMap) + } + // Skip wire type/field number and length varints. + got := skipVarint(skipVarint(ext.enc)) + if want := []byte("hoohah"); !bytes.Equal(got, want) { + t.Errorf("Combined extension is %q, want %q", got, want) + } +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/pointer_reflect.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/pointer_reflect.go new file mode 100644 index 0000000..fb512e2 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/pointer_reflect.go @@ -0,0 +1,484 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2012 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +// +build appengine js + +// This file contains an implementation of proto field accesses using package reflect. +// It is slower than the code in pointer_unsafe.go but it avoids package unsafe and can +// be used on App Engine. + +package proto + +import ( + "math" + "reflect" +) + +// A structPointer is a pointer to a struct. +type structPointer struct { + v reflect.Value +} + +// toStructPointer returns a structPointer equivalent to the given reflect value. +// The reflect value must itself be a pointer to a struct. +func toStructPointer(v reflect.Value) structPointer { + return structPointer{v} +} + +// IsNil reports whether p is nil. +func structPointer_IsNil(p structPointer) bool { + return p.v.IsNil() +} + +// Interface returns the struct pointer as an interface value. +func structPointer_Interface(p structPointer, _ reflect.Type) interface{} { + return p.v.Interface() +} + +// A field identifies a field in a struct, accessible from a structPointer. +// In this implementation, a field is identified by the sequence of field indices +// passed to reflect's FieldByIndex. +type field []int + +// toField returns a field equivalent to the given reflect field. +func toField(f *reflect.StructField) field { + return f.Index +} + +// invalidField is an invalid field identifier. +var invalidField = field(nil) + +// IsValid reports whether the field identifier is valid. +func (f field) IsValid() bool { return f != nil } + +// field returns the given field in the struct as a reflect value. +func structPointer_field(p structPointer, f field) reflect.Value { + // Special case: an extension map entry with a value of type T + // passes a *T to the struct-handling code with a zero field, + // expecting that it will be treated as equivalent to *struct{ X T }, + // which has the same memory layout. We have to handle that case + // specially, because reflect will panic if we call FieldByIndex on a + // non-struct. + if f == nil { + return p.v.Elem() + } + + return p.v.Elem().FieldByIndex(f) +} + +// ifield returns the given field in the struct as an interface value. +func structPointer_ifield(p structPointer, f field) interface{} { + return structPointer_field(p, f).Addr().Interface() +} + +// Bytes returns the address of a []byte field in the struct. +func structPointer_Bytes(p structPointer, f field) *[]byte { + return structPointer_ifield(p, f).(*[]byte) +} + +// BytesSlice returns the address of a [][]byte field in the struct. +func structPointer_BytesSlice(p structPointer, f field) *[][]byte { + return structPointer_ifield(p, f).(*[][]byte) +} + +// Bool returns the address of a *bool field in the struct. +func structPointer_Bool(p structPointer, f field) **bool { + return structPointer_ifield(p, f).(**bool) +} + +// BoolVal returns the address of a bool field in the struct. +func structPointer_BoolVal(p structPointer, f field) *bool { + return structPointer_ifield(p, f).(*bool) +} + +// BoolSlice returns the address of a []bool field in the struct. +func structPointer_BoolSlice(p structPointer, f field) *[]bool { + return structPointer_ifield(p, f).(*[]bool) +} + +// String returns the address of a *string field in the struct. +func structPointer_String(p structPointer, f field) **string { + return structPointer_ifield(p, f).(**string) +} + +// StringVal returns the address of a string field in the struct. +func structPointer_StringVal(p structPointer, f field) *string { + return structPointer_ifield(p, f).(*string) +} + +// StringSlice returns the address of a []string field in the struct. +func structPointer_StringSlice(p structPointer, f field) *[]string { + return structPointer_ifield(p, f).(*[]string) +} + +// Extensions returns the address of an extension map field in the struct. +func structPointer_Extensions(p structPointer, f field) *XXX_InternalExtensions { + return structPointer_ifield(p, f).(*XXX_InternalExtensions) +} + +// ExtMap returns the address of an extension map field in the struct. +func structPointer_ExtMap(p structPointer, f field) *map[int32]Extension { + return structPointer_ifield(p, f).(*map[int32]Extension) +} + +// NewAt returns the reflect.Value for a pointer to a field in the struct. +func structPointer_NewAt(p structPointer, f field, typ reflect.Type) reflect.Value { + return structPointer_field(p, f).Addr() +} + +// SetStructPointer writes a *struct field in the struct. +func structPointer_SetStructPointer(p structPointer, f field, q structPointer) { + structPointer_field(p, f).Set(q.v) +} + +// GetStructPointer reads a *struct field in the struct. +func structPointer_GetStructPointer(p structPointer, f field) structPointer { + return structPointer{structPointer_field(p, f)} +} + +// StructPointerSlice the address of a []*struct field in the struct. +func structPointer_StructPointerSlice(p structPointer, f field) structPointerSlice { + return structPointerSlice{structPointer_field(p, f)} +} + +// A structPointerSlice represents the address of a slice of pointers to structs +// (themselves messages or groups). That is, v.Type() is *[]*struct{...}. +type structPointerSlice struct { + v reflect.Value +} + +func (p structPointerSlice) Len() int { return p.v.Len() } +func (p structPointerSlice) Index(i int) structPointer { return structPointer{p.v.Index(i)} } +func (p structPointerSlice) Append(q structPointer) { + p.v.Set(reflect.Append(p.v, q.v)) +} + +var ( + int32Type = reflect.TypeOf(int32(0)) + uint32Type = reflect.TypeOf(uint32(0)) + float32Type = reflect.TypeOf(float32(0)) + int64Type = reflect.TypeOf(int64(0)) + uint64Type = reflect.TypeOf(uint64(0)) + float64Type = reflect.TypeOf(float64(0)) +) + +// A word32 represents a field of type *int32, *uint32, *float32, or *enum. +// That is, v.Type() is *int32, *uint32, *float32, or *enum and v is assignable. +type word32 struct { + v reflect.Value +} + +// IsNil reports whether p is nil. +func word32_IsNil(p word32) bool { + return p.v.IsNil() +} + +// Set sets p to point at a newly allocated word with bits set to x. +func word32_Set(p word32, o *Buffer, x uint32) { + t := p.v.Type().Elem() + switch t { + case int32Type: + if len(o.int32s) == 0 { + o.int32s = make([]int32, uint32PoolSize) + } + o.int32s[0] = int32(x) + p.v.Set(reflect.ValueOf(&o.int32s[0])) + o.int32s = o.int32s[1:] + return + case uint32Type: + if len(o.uint32s) == 0 { + o.uint32s = make([]uint32, uint32PoolSize) + } + o.uint32s[0] = x + p.v.Set(reflect.ValueOf(&o.uint32s[0])) + o.uint32s = o.uint32s[1:] + return + case float32Type: + if len(o.float32s) == 0 { + o.float32s = make([]float32, uint32PoolSize) + } + o.float32s[0] = math.Float32frombits(x) + p.v.Set(reflect.ValueOf(&o.float32s[0])) + o.float32s = o.float32s[1:] + return + } + + // must be enum + p.v.Set(reflect.New(t)) + p.v.Elem().SetInt(int64(int32(x))) +} + +// Get gets the bits pointed at by p, as a uint32. +func word32_Get(p word32) uint32 { + elem := p.v.Elem() + switch elem.Kind() { + case reflect.Int32: + return uint32(elem.Int()) + case reflect.Uint32: + return uint32(elem.Uint()) + case reflect.Float32: + return math.Float32bits(float32(elem.Float())) + } + panic("unreachable") +} + +// Word32 returns a reference to a *int32, *uint32, *float32, or *enum field in the struct. +func structPointer_Word32(p structPointer, f field) word32 { + return word32{structPointer_field(p, f)} +} + +// A word32Val represents a field of type int32, uint32, float32, or enum. +// That is, v.Type() is int32, uint32, float32, or enum and v is assignable. +type word32Val struct { + v reflect.Value +} + +// Set sets *p to x. +func word32Val_Set(p word32Val, x uint32) { + switch p.v.Type() { + case int32Type: + p.v.SetInt(int64(x)) + return + case uint32Type: + p.v.SetUint(uint64(x)) + return + case float32Type: + p.v.SetFloat(float64(math.Float32frombits(x))) + return + } + + // must be enum + p.v.SetInt(int64(int32(x))) +} + +// Get gets the bits pointed at by p, as a uint32. +func word32Val_Get(p word32Val) uint32 { + elem := p.v + switch elem.Kind() { + case reflect.Int32: + return uint32(elem.Int()) + case reflect.Uint32: + return uint32(elem.Uint()) + case reflect.Float32: + return math.Float32bits(float32(elem.Float())) + } + panic("unreachable") +} + +// Word32Val returns a reference to a int32, uint32, float32, or enum field in the struct. +func structPointer_Word32Val(p structPointer, f field) word32Val { + return word32Val{structPointer_field(p, f)} +} + +// A word32Slice is a slice of 32-bit values. +// That is, v.Type() is []int32, []uint32, []float32, or []enum. +type word32Slice struct { + v reflect.Value +} + +func (p word32Slice) Append(x uint32) { + n, m := p.v.Len(), p.v.Cap() + if n < m { + p.v.SetLen(n + 1) + } else { + t := p.v.Type().Elem() + p.v.Set(reflect.Append(p.v, reflect.Zero(t))) + } + elem := p.v.Index(n) + switch elem.Kind() { + case reflect.Int32: + elem.SetInt(int64(int32(x))) + case reflect.Uint32: + elem.SetUint(uint64(x)) + case reflect.Float32: + elem.SetFloat(float64(math.Float32frombits(x))) + } +} + +func (p word32Slice) Len() int { + return p.v.Len() +} + +func (p word32Slice) Index(i int) uint32 { + elem := p.v.Index(i) + switch elem.Kind() { + case reflect.Int32: + return uint32(elem.Int()) + case reflect.Uint32: + return uint32(elem.Uint()) + case reflect.Float32: + return math.Float32bits(float32(elem.Float())) + } + panic("unreachable") +} + +// Word32Slice returns a reference to a []int32, []uint32, []float32, or []enum field in the struct. +func structPointer_Word32Slice(p structPointer, f field) word32Slice { + return word32Slice{structPointer_field(p, f)} +} + +// word64 is like word32 but for 64-bit values. +type word64 struct { + v reflect.Value +} + +func word64_Set(p word64, o *Buffer, x uint64) { + t := p.v.Type().Elem() + switch t { + case int64Type: + if len(o.int64s) == 0 { + o.int64s = make([]int64, uint64PoolSize) + } + o.int64s[0] = int64(x) + p.v.Set(reflect.ValueOf(&o.int64s[0])) + o.int64s = o.int64s[1:] + return + case uint64Type: + if len(o.uint64s) == 0 { + o.uint64s = make([]uint64, uint64PoolSize) + } + o.uint64s[0] = x + p.v.Set(reflect.ValueOf(&o.uint64s[0])) + o.uint64s = o.uint64s[1:] + return + case float64Type: + if len(o.float64s) == 0 { + o.float64s = make([]float64, uint64PoolSize) + } + o.float64s[0] = math.Float64frombits(x) + p.v.Set(reflect.ValueOf(&o.float64s[0])) + o.float64s = o.float64s[1:] + return + } + panic("unreachable") +} + +func word64_IsNil(p word64) bool { + return p.v.IsNil() +} + +func word64_Get(p word64) uint64 { + elem := p.v.Elem() + switch elem.Kind() { + case reflect.Int64: + return uint64(elem.Int()) + case reflect.Uint64: + return elem.Uint() + case reflect.Float64: + return math.Float64bits(elem.Float()) + } + panic("unreachable") +} + +func structPointer_Word64(p structPointer, f field) word64 { + return word64{structPointer_field(p, f)} +} + +// word64Val is like word32Val but for 64-bit values. +type word64Val struct { + v reflect.Value +} + +func word64Val_Set(p word64Val, o *Buffer, x uint64) { + switch p.v.Type() { + case int64Type: + p.v.SetInt(int64(x)) + return + case uint64Type: + p.v.SetUint(x) + return + case float64Type: + p.v.SetFloat(math.Float64frombits(x)) + return + } + panic("unreachable") +} + +func word64Val_Get(p word64Val) uint64 { + elem := p.v + switch elem.Kind() { + case reflect.Int64: + return uint64(elem.Int()) + case reflect.Uint64: + return elem.Uint() + case reflect.Float64: + return math.Float64bits(elem.Float()) + } + panic("unreachable") +} + +func structPointer_Word64Val(p structPointer, f field) word64Val { + return word64Val{structPointer_field(p, f)} +} + +type word64Slice struct { + v reflect.Value +} + +func (p word64Slice) Append(x uint64) { + n, m := p.v.Len(), p.v.Cap() + if n < m { + p.v.SetLen(n + 1) + } else { + t := p.v.Type().Elem() + p.v.Set(reflect.Append(p.v, reflect.Zero(t))) + } + elem := p.v.Index(n) + switch elem.Kind() { + case reflect.Int64: + elem.SetInt(int64(int64(x))) + case reflect.Uint64: + elem.SetUint(uint64(x)) + case reflect.Float64: + elem.SetFloat(float64(math.Float64frombits(x))) + } +} + +func (p word64Slice) Len() int { + return p.v.Len() +} + +func (p word64Slice) Index(i int) uint64 { + elem := p.v.Index(i) + switch elem.Kind() { + case reflect.Int64: + return uint64(elem.Int()) + case reflect.Uint64: + return uint64(elem.Uint()) + case reflect.Float64: + return math.Float64bits(float64(elem.Float())) + } + panic("unreachable") +} + +func structPointer_Word64Slice(p structPointer, f field) word64Slice { + return word64Slice{structPointer_field(p, f)} +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go new file mode 100644 index 0000000..6b5567d --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go @@ -0,0 +1,270 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2012 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +// +build !appengine,!js + +// This file contains the implementation of the proto field accesses using package unsafe. + +package proto + +import ( + "reflect" + "unsafe" +) + +// NOTE: These type_Foo functions would more idiomatically be methods, +// but Go does not allow methods on pointer types, and we must preserve +// some pointer type for the garbage collector. We use these +// funcs with clunky names as our poor approximation to methods. +// +// An alternative would be +// type structPointer struct { p unsafe.Pointer } +// but that does not registerize as well. + +// A structPointer is a pointer to a struct. +type structPointer unsafe.Pointer + +// toStructPointer returns a structPointer equivalent to the given reflect value. +func toStructPointer(v reflect.Value) structPointer { + return structPointer(unsafe.Pointer(v.Pointer())) +} + +// IsNil reports whether p is nil. +func structPointer_IsNil(p structPointer) bool { + return p == nil +} + +// Interface returns the struct pointer, assumed to have element type t, +// as an interface value. +func structPointer_Interface(p structPointer, t reflect.Type) interface{} { + return reflect.NewAt(t, unsafe.Pointer(p)).Interface() +} + +// A field identifies a field in a struct, accessible from a structPointer. +// In this implementation, a field is identified by its byte offset from the start of the struct. +type field uintptr + +// toField returns a field equivalent to the given reflect field. +func toField(f *reflect.StructField) field { + return field(f.Offset) +} + +// invalidField is an invalid field identifier. +const invalidField = ^field(0) + +// IsValid reports whether the field identifier is valid. +func (f field) IsValid() bool { + return f != ^field(0) +} + +// Bytes returns the address of a []byte field in the struct. +func structPointer_Bytes(p structPointer, f field) *[]byte { + return (*[]byte)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} + +// BytesSlice returns the address of a [][]byte field in the struct. +func structPointer_BytesSlice(p structPointer, f field) *[][]byte { + return (*[][]byte)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} + +// Bool returns the address of a *bool field in the struct. +func structPointer_Bool(p structPointer, f field) **bool { + return (**bool)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} + +// BoolVal returns the address of a bool field in the struct. +func structPointer_BoolVal(p structPointer, f field) *bool { + return (*bool)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} + +// BoolSlice returns the address of a []bool field in the struct. +func structPointer_BoolSlice(p structPointer, f field) *[]bool { + return (*[]bool)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} + +// String returns the address of a *string field in the struct. +func structPointer_String(p structPointer, f field) **string { + return (**string)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} + +// StringVal returns the address of a string field in the struct. +func structPointer_StringVal(p structPointer, f field) *string { + return (*string)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} + +// StringSlice returns the address of a []string field in the struct. +func structPointer_StringSlice(p structPointer, f field) *[]string { + return (*[]string)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} + +// ExtMap returns the address of an extension map field in the struct. +func structPointer_Extensions(p structPointer, f field) *XXX_InternalExtensions { + return (*XXX_InternalExtensions)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} + +func structPointer_ExtMap(p structPointer, f field) *map[int32]Extension { + return (*map[int32]Extension)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} + +// NewAt returns the reflect.Value for a pointer to a field in the struct. +func structPointer_NewAt(p structPointer, f field, typ reflect.Type) reflect.Value { + return reflect.NewAt(typ, unsafe.Pointer(uintptr(p)+uintptr(f))) +} + +// SetStructPointer writes a *struct field in the struct. +func structPointer_SetStructPointer(p structPointer, f field, q structPointer) { + *(*structPointer)(unsafe.Pointer(uintptr(p) + uintptr(f))) = q +} + +// GetStructPointer reads a *struct field in the struct. +func structPointer_GetStructPointer(p structPointer, f field) structPointer { + return *(*structPointer)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} + +// StructPointerSlice the address of a []*struct field in the struct. +func structPointer_StructPointerSlice(p structPointer, f field) *structPointerSlice { + return (*structPointerSlice)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} + +// A structPointerSlice represents a slice of pointers to structs (themselves submessages or groups). +type structPointerSlice []structPointer + +func (v *structPointerSlice) Len() int { return len(*v) } +func (v *structPointerSlice) Index(i int) structPointer { return (*v)[i] } +func (v *structPointerSlice) Append(p structPointer) { *v = append(*v, p) } + +// A word32 is the address of a "pointer to 32-bit value" field. +type word32 **uint32 + +// IsNil reports whether *v is nil. +func word32_IsNil(p word32) bool { + return *p == nil +} + +// Set sets *v to point at a newly allocated word set to x. +func word32_Set(p word32, o *Buffer, x uint32) { + if len(o.uint32s) == 0 { + o.uint32s = make([]uint32, uint32PoolSize) + } + o.uint32s[0] = x + *p = &o.uint32s[0] + o.uint32s = o.uint32s[1:] +} + +// Get gets the value pointed at by *v. +func word32_Get(p word32) uint32 { + return **p +} + +// Word32 returns the address of a *int32, *uint32, *float32, or *enum field in the struct. +func structPointer_Word32(p structPointer, f field) word32 { + return word32((**uint32)(unsafe.Pointer(uintptr(p) + uintptr(f)))) +} + +// A word32Val is the address of a 32-bit value field. +type word32Val *uint32 + +// Set sets *p to x. +func word32Val_Set(p word32Val, x uint32) { + *p = x +} + +// Get gets the value pointed at by p. +func word32Val_Get(p word32Val) uint32 { + return *p +} + +// Word32Val returns the address of a *int32, *uint32, *float32, or *enum field in the struct. +func structPointer_Word32Val(p structPointer, f field) word32Val { + return word32Val((*uint32)(unsafe.Pointer(uintptr(p) + uintptr(f)))) +} + +// A word32Slice is a slice of 32-bit values. +type word32Slice []uint32 + +func (v *word32Slice) Append(x uint32) { *v = append(*v, x) } +func (v *word32Slice) Len() int { return len(*v) } +func (v *word32Slice) Index(i int) uint32 { return (*v)[i] } + +// Word32Slice returns the address of a []int32, []uint32, []float32, or []enum field in the struct. +func structPointer_Word32Slice(p structPointer, f field) *word32Slice { + return (*word32Slice)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} + +// word64 is like word32 but for 64-bit values. +type word64 **uint64 + +func word64_Set(p word64, o *Buffer, x uint64) { + if len(o.uint64s) == 0 { + o.uint64s = make([]uint64, uint64PoolSize) + } + o.uint64s[0] = x + *p = &o.uint64s[0] + o.uint64s = o.uint64s[1:] +} + +func word64_IsNil(p word64) bool { + return *p == nil +} + +func word64_Get(p word64) uint64 { + return **p +} + +func structPointer_Word64(p structPointer, f field) word64 { + return word64((**uint64)(unsafe.Pointer(uintptr(p) + uintptr(f)))) +} + +// word64Val is like word32Val but for 64-bit values. +type word64Val *uint64 + +func word64Val_Set(p word64Val, o *Buffer, x uint64) { + *p = x +} + +func word64Val_Get(p word64Val) uint64 { + return *p +} + +func structPointer_Word64Val(p structPointer, f field) word64Val { + return word64Val((*uint64)(unsafe.Pointer(uintptr(p) + uintptr(f)))) +} + +// word64Slice is like word32Slice but for 64-bit values. +type word64Slice []uint64 + +func (v *word64Slice) Append(x uint64) { *v = append(*v, x) } +func (v *word64Slice) Len() int { return len(*v) } +func (v *word64Slice) Index(i int) uint64 { return (*v)[i] } + +func structPointer_Word64Slice(p structPointer, f field) *word64Slice { + return (*word64Slice)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/properties.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/properties.go new file mode 100644 index 0000000..ec2289c --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/properties.go @@ -0,0 +1,872 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package proto + +/* + * Routines for encoding data into the wire format for protocol buffers. + */ + +import ( + "fmt" + "log" + "os" + "reflect" + "sort" + "strconv" + "strings" + "sync" +) + +const debug bool = false + +// Constants that identify the encoding of a value on the wire. +const ( + WireVarint = 0 + WireFixed64 = 1 + WireBytes = 2 + WireStartGroup = 3 + WireEndGroup = 4 + WireFixed32 = 5 +) + +const startSize = 10 // initial slice/string sizes + +// Encoders are defined in encode.go +// An encoder outputs the full representation of a field, including its +// tag and encoder type. +type encoder func(p *Buffer, prop *Properties, base structPointer) error + +// A valueEncoder encodes a single integer in a particular encoding. +type valueEncoder func(o *Buffer, x uint64) error + +// Sizers are defined in encode.go +// A sizer returns the encoded size of a field, including its tag and encoder +// type. +type sizer func(prop *Properties, base structPointer) int + +// A valueSizer returns the encoded size of a single integer in a particular +// encoding. +type valueSizer func(x uint64) int + +// Decoders are defined in decode.go +// A decoder creates a value from its wire representation. +// Unrecognized subelements are saved in unrec. +type decoder func(p *Buffer, prop *Properties, base structPointer) error + +// A valueDecoder decodes a single integer in a particular encoding. +type valueDecoder func(o *Buffer) (x uint64, err error) + +// A oneofMarshaler does the marshaling for all oneof fields in a message. +type oneofMarshaler func(Message, *Buffer) error + +// A oneofUnmarshaler does the unmarshaling for a oneof field in a message. +type oneofUnmarshaler func(Message, int, int, *Buffer) (bool, error) + +// A oneofSizer does the sizing for all oneof fields in a message. +type oneofSizer func(Message) int + +// tagMap is an optimization over map[int]int for typical protocol buffer +// use-cases. Encoded protocol buffers are often in tag order with small tag +// numbers. +type tagMap struct { + fastTags []int + slowTags map[int]int +} + +// tagMapFastLimit is the upper bound on the tag number that will be stored in +// the tagMap slice rather than its map. +const tagMapFastLimit = 1024 + +func (p *tagMap) get(t int) (int, bool) { + if t > 0 && t < tagMapFastLimit { + if t >= len(p.fastTags) { + return 0, false + } + fi := p.fastTags[t] + return fi, fi >= 0 + } + fi, ok := p.slowTags[t] + return fi, ok +} + +func (p *tagMap) put(t int, fi int) { + if t > 0 && t < tagMapFastLimit { + for len(p.fastTags) < t+1 { + p.fastTags = append(p.fastTags, -1) + } + p.fastTags[t] = fi + return + } + if p.slowTags == nil { + p.slowTags = make(map[int]int) + } + p.slowTags[t] = fi +} + +// StructProperties represents properties for all the fields of a struct. +// decoderTags and decoderOrigNames should only be used by the decoder. +type StructProperties struct { + Prop []*Properties // properties for each field + reqCount int // required count + decoderTags tagMap // map from proto tag to struct field number + decoderOrigNames map[string]int // map from original name to struct field number + order []int // list of struct field numbers in tag order + unrecField field // field id of the XXX_unrecognized []byte field + extendable bool // is this an extendable proto + + oneofMarshaler oneofMarshaler + oneofUnmarshaler oneofUnmarshaler + oneofSizer oneofSizer + stype reflect.Type + + // OneofTypes contains information about the oneof fields in this message. + // It is keyed by the original name of a field. + OneofTypes map[string]*OneofProperties +} + +// OneofProperties represents information about a specific field in a oneof. +type OneofProperties struct { + Type reflect.Type // pointer to generated struct type for this oneof field + Field int // struct field number of the containing oneof in the message + Prop *Properties +} + +// Implement the sorting interface so we can sort the fields in tag order, as recommended by the spec. +// See encode.go, (*Buffer).enc_struct. + +func (sp *StructProperties) Len() int { return len(sp.order) } +func (sp *StructProperties) Less(i, j int) bool { + return sp.Prop[sp.order[i]].Tag < sp.Prop[sp.order[j]].Tag +} +func (sp *StructProperties) Swap(i, j int) { sp.order[i], sp.order[j] = sp.order[j], sp.order[i] } + +// Properties represents the protocol-specific behavior of a single struct field. +type Properties struct { + Name string // name of the field, for error messages + OrigName string // original name before protocol compiler (always set) + JSONName string // name to use for JSON; determined by protoc + Wire string + WireType int + Tag int + Required bool + Optional bool + Repeated bool + Packed bool // relevant for repeated primitives only + Enum string // set for enum types only + proto3 bool // whether this is known to be a proto3 field; set for []byte only + oneof bool // whether this is a oneof field + + Default string // default value + HasDefault bool // whether an explicit default was provided + def_uint64 uint64 + + enc encoder + valEnc valueEncoder // set for bool and numeric types only + field field + tagcode []byte // encoding of EncodeVarint((Tag<<3)|WireType) + tagbuf [8]byte + stype reflect.Type // set for struct types only + sprop *StructProperties // set for struct types only + isMarshaler bool + isUnmarshaler bool + + mtype reflect.Type // set for map types only + mkeyprop *Properties // set for map types only + mvalprop *Properties // set for map types only + + size sizer + valSize valueSizer // set for bool and numeric types only + + dec decoder + valDec valueDecoder // set for bool and numeric types only + + // If this is a packable field, this will be the decoder for the packed version of the field. + packedDec decoder +} + +// String formats the properties in the protobuf struct field tag style. +func (p *Properties) String() string { + s := p.Wire + s = "," + s += strconv.Itoa(p.Tag) + if p.Required { + s += ",req" + } + if p.Optional { + s += ",opt" + } + if p.Repeated { + s += ",rep" + } + if p.Packed { + s += ",packed" + } + s += ",name=" + p.OrigName + if p.JSONName != p.OrigName { + s += ",json=" + p.JSONName + } + if p.proto3 { + s += ",proto3" + } + if p.oneof { + s += ",oneof" + } + if len(p.Enum) > 0 { + s += ",enum=" + p.Enum + } + if p.HasDefault { + s += ",def=" + p.Default + } + return s +} + +// Parse populates p by parsing a string in the protobuf struct field tag style. +func (p *Properties) Parse(s string) { + // "bytes,49,opt,name=foo,def=hello!" + fields := strings.Split(s, ",") // breaks def=, but handled below. + if len(fields) < 2 { + fmt.Fprintf(os.Stderr, "proto: tag has too few fields: %q\n", s) + return + } + + p.Wire = fields[0] + switch p.Wire { + case "varint": + p.WireType = WireVarint + p.valEnc = (*Buffer).EncodeVarint + p.valDec = (*Buffer).DecodeVarint + p.valSize = sizeVarint + case "fixed32": + p.WireType = WireFixed32 + p.valEnc = (*Buffer).EncodeFixed32 + p.valDec = (*Buffer).DecodeFixed32 + p.valSize = sizeFixed32 + case "fixed64": + p.WireType = WireFixed64 + p.valEnc = (*Buffer).EncodeFixed64 + p.valDec = (*Buffer).DecodeFixed64 + p.valSize = sizeFixed64 + case "zigzag32": + p.WireType = WireVarint + p.valEnc = (*Buffer).EncodeZigzag32 + p.valDec = (*Buffer).DecodeZigzag32 + p.valSize = sizeZigzag32 + case "zigzag64": + p.WireType = WireVarint + p.valEnc = (*Buffer).EncodeZigzag64 + p.valDec = (*Buffer).DecodeZigzag64 + p.valSize = sizeZigzag64 + case "bytes", "group": + p.WireType = WireBytes + // no numeric converter for non-numeric types + default: + fmt.Fprintf(os.Stderr, "proto: tag has unknown wire type: %q\n", s) + return + } + + var err error + p.Tag, err = strconv.Atoi(fields[1]) + if err != nil { + return + } + + for i := 2; i < len(fields); i++ { + f := fields[i] + switch { + case f == "req": + p.Required = true + case f == "opt": + p.Optional = true + case f == "rep": + p.Repeated = true + case f == "packed": + p.Packed = true + case strings.HasPrefix(f, "name="): + p.OrigName = f[5:] + case strings.HasPrefix(f, "json="): + p.JSONName = f[5:] + case strings.HasPrefix(f, "enum="): + p.Enum = f[5:] + case f == "proto3": + p.proto3 = true + case f == "oneof": + p.oneof = true + case strings.HasPrefix(f, "def="): + p.HasDefault = true + p.Default = f[4:] // rest of string + if i+1 < len(fields) { + // Commas aren't escaped, and def is always last. + p.Default += "," + strings.Join(fields[i+1:], ",") + break + } + } + } +} + +func logNoSliceEnc(t1, t2 reflect.Type) { + fmt.Fprintf(os.Stderr, "proto: no slice oenc for %T = []%T\n", t1, t2) +} + +var protoMessageType = reflect.TypeOf((*Message)(nil)).Elem() + +// Initialize the fields for encoding and decoding. +func (p *Properties) setEncAndDec(typ reflect.Type, f *reflect.StructField, lockGetProp bool) { + p.enc = nil + p.dec = nil + p.size = nil + + switch t1 := typ; t1.Kind() { + default: + fmt.Fprintf(os.Stderr, "proto: no coders for %v\n", t1) + + // proto3 scalar types + + case reflect.Bool: + p.enc = (*Buffer).enc_proto3_bool + p.dec = (*Buffer).dec_proto3_bool + p.size = size_proto3_bool + case reflect.Int32: + p.enc = (*Buffer).enc_proto3_int32 + p.dec = (*Buffer).dec_proto3_int32 + p.size = size_proto3_int32 + case reflect.Uint32: + p.enc = (*Buffer).enc_proto3_uint32 + p.dec = (*Buffer).dec_proto3_int32 // can reuse + p.size = size_proto3_uint32 + case reflect.Int64, reflect.Uint64: + p.enc = (*Buffer).enc_proto3_int64 + p.dec = (*Buffer).dec_proto3_int64 + p.size = size_proto3_int64 + case reflect.Float32: + p.enc = (*Buffer).enc_proto3_uint32 // can just treat them as bits + p.dec = (*Buffer).dec_proto3_int32 + p.size = size_proto3_uint32 + case reflect.Float64: + p.enc = (*Buffer).enc_proto3_int64 // can just treat them as bits + p.dec = (*Buffer).dec_proto3_int64 + p.size = size_proto3_int64 + case reflect.String: + p.enc = (*Buffer).enc_proto3_string + p.dec = (*Buffer).dec_proto3_string + p.size = size_proto3_string + + case reflect.Ptr: + switch t2 := t1.Elem(); t2.Kind() { + default: + fmt.Fprintf(os.Stderr, "proto: no encoder function for %v -> %v\n", t1, t2) + break + case reflect.Bool: + p.enc = (*Buffer).enc_bool + p.dec = (*Buffer).dec_bool + p.size = size_bool + case reflect.Int32: + p.enc = (*Buffer).enc_int32 + p.dec = (*Buffer).dec_int32 + p.size = size_int32 + case reflect.Uint32: + p.enc = (*Buffer).enc_uint32 + p.dec = (*Buffer).dec_int32 // can reuse + p.size = size_uint32 + case reflect.Int64, reflect.Uint64: + p.enc = (*Buffer).enc_int64 + p.dec = (*Buffer).dec_int64 + p.size = size_int64 + case reflect.Float32: + p.enc = (*Buffer).enc_uint32 // can just treat them as bits + p.dec = (*Buffer).dec_int32 + p.size = size_uint32 + case reflect.Float64: + p.enc = (*Buffer).enc_int64 // can just treat them as bits + p.dec = (*Buffer).dec_int64 + p.size = size_int64 + case reflect.String: + p.enc = (*Buffer).enc_string + p.dec = (*Buffer).dec_string + p.size = size_string + case reflect.Struct: + p.stype = t1.Elem() + p.isMarshaler = isMarshaler(t1) + p.isUnmarshaler = isUnmarshaler(t1) + if p.Wire == "bytes" { + p.enc = (*Buffer).enc_struct_message + p.dec = (*Buffer).dec_struct_message + p.size = size_struct_message + } else { + p.enc = (*Buffer).enc_struct_group + p.dec = (*Buffer).dec_struct_group + p.size = size_struct_group + } + } + + case reflect.Slice: + switch t2 := t1.Elem(); t2.Kind() { + default: + logNoSliceEnc(t1, t2) + break + case reflect.Bool: + if p.Packed { + p.enc = (*Buffer).enc_slice_packed_bool + p.size = size_slice_packed_bool + } else { + p.enc = (*Buffer).enc_slice_bool + p.size = size_slice_bool + } + p.dec = (*Buffer).dec_slice_bool + p.packedDec = (*Buffer).dec_slice_packed_bool + case reflect.Int32: + if p.Packed { + p.enc = (*Buffer).enc_slice_packed_int32 + p.size = size_slice_packed_int32 + } else { + p.enc = (*Buffer).enc_slice_int32 + p.size = size_slice_int32 + } + p.dec = (*Buffer).dec_slice_int32 + p.packedDec = (*Buffer).dec_slice_packed_int32 + case reflect.Uint32: + if p.Packed { + p.enc = (*Buffer).enc_slice_packed_uint32 + p.size = size_slice_packed_uint32 + } else { + p.enc = (*Buffer).enc_slice_uint32 + p.size = size_slice_uint32 + } + p.dec = (*Buffer).dec_slice_int32 + p.packedDec = (*Buffer).dec_slice_packed_int32 + case reflect.Int64, reflect.Uint64: + if p.Packed { + p.enc = (*Buffer).enc_slice_packed_int64 + p.size = size_slice_packed_int64 + } else { + p.enc = (*Buffer).enc_slice_int64 + p.size = size_slice_int64 + } + p.dec = (*Buffer).dec_slice_int64 + p.packedDec = (*Buffer).dec_slice_packed_int64 + case reflect.Uint8: + p.dec = (*Buffer).dec_slice_byte + if p.proto3 { + p.enc = (*Buffer).enc_proto3_slice_byte + p.size = size_proto3_slice_byte + } else { + p.enc = (*Buffer).enc_slice_byte + p.size = size_slice_byte + } + case reflect.Float32, reflect.Float64: + switch t2.Bits() { + case 32: + // can just treat them as bits + if p.Packed { + p.enc = (*Buffer).enc_slice_packed_uint32 + p.size = size_slice_packed_uint32 + } else { + p.enc = (*Buffer).enc_slice_uint32 + p.size = size_slice_uint32 + } + p.dec = (*Buffer).dec_slice_int32 + p.packedDec = (*Buffer).dec_slice_packed_int32 + case 64: + // can just treat them as bits + if p.Packed { + p.enc = (*Buffer).enc_slice_packed_int64 + p.size = size_slice_packed_int64 + } else { + p.enc = (*Buffer).enc_slice_int64 + p.size = size_slice_int64 + } + p.dec = (*Buffer).dec_slice_int64 + p.packedDec = (*Buffer).dec_slice_packed_int64 + default: + logNoSliceEnc(t1, t2) + break + } + case reflect.String: + p.enc = (*Buffer).enc_slice_string + p.dec = (*Buffer).dec_slice_string + p.size = size_slice_string + case reflect.Ptr: + switch t3 := t2.Elem(); t3.Kind() { + default: + fmt.Fprintf(os.Stderr, "proto: no ptr oenc for %T -> %T -> %T\n", t1, t2, t3) + break + case reflect.Struct: + p.stype = t2.Elem() + p.isMarshaler = isMarshaler(t2) + p.isUnmarshaler = isUnmarshaler(t2) + if p.Wire == "bytes" { + p.enc = (*Buffer).enc_slice_struct_message + p.dec = (*Buffer).dec_slice_struct_message + p.size = size_slice_struct_message + } else { + p.enc = (*Buffer).enc_slice_struct_group + p.dec = (*Buffer).dec_slice_struct_group + p.size = size_slice_struct_group + } + } + case reflect.Slice: + switch t2.Elem().Kind() { + default: + fmt.Fprintf(os.Stderr, "proto: no slice elem oenc for %T -> %T -> %T\n", t1, t2, t2.Elem()) + break + case reflect.Uint8: + p.enc = (*Buffer).enc_slice_slice_byte + p.dec = (*Buffer).dec_slice_slice_byte + p.size = size_slice_slice_byte + } + } + + case reflect.Map: + p.enc = (*Buffer).enc_new_map + p.dec = (*Buffer).dec_new_map + p.size = size_new_map + + p.mtype = t1 + p.mkeyprop = &Properties{} + p.mkeyprop.init(reflect.PtrTo(p.mtype.Key()), "Key", f.Tag.Get("protobuf_key"), nil, lockGetProp) + p.mvalprop = &Properties{} + vtype := p.mtype.Elem() + if vtype.Kind() != reflect.Ptr && vtype.Kind() != reflect.Slice { + // The value type is not a message (*T) or bytes ([]byte), + // so we need encoders for the pointer to this type. + vtype = reflect.PtrTo(vtype) + } + p.mvalprop.init(vtype, "Value", f.Tag.Get("protobuf_val"), nil, lockGetProp) + } + + // precalculate tag code + wire := p.WireType + if p.Packed { + wire = WireBytes + } + x := uint32(p.Tag)<<3 | uint32(wire) + i := 0 + for i = 0; x > 127; i++ { + p.tagbuf[i] = 0x80 | uint8(x&0x7F) + x >>= 7 + } + p.tagbuf[i] = uint8(x) + p.tagcode = p.tagbuf[0 : i+1] + + if p.stype != nil { + if lockGetProp { + p.sprop = GetProperties(p.stype) + } else { + p.sprop = getPropertiesLocked(p.stype) + } + } +} + +var ( + marshalerType = reflect.TypeOf((*Marshaler)(nil)).Elem() + unmarshalerType = reflect.TypeOf((*Unmarshaler)(nil)).Elem() +) + +// isMarshaler reports whether type t implements Marshaler. +func isMarshaler(t reflect.Type) bool { + // We're checking for (likely) pointer-receiver methods + // so if t is not a pointer, something is very wrong. + // The calls above only invoke isMarshaler on pointer types. + if t.Kind() != reflect.Ptr { + panic("proto: misuse of isMarshaler") + } + return t.Implements(marshalerType) +} + +// isUnmarshaler reports whether type t implements Unmarshaler. +func isUnmarshaler(t reflect.Type) bool { + // We're checking for (likely) pointer-receiver methods + // so if t is not a pointer, something is very wrong. + // The calls above only invoke isUnmarshaler on pointer types. + if t.Kind() != reflect.Ptr { + panic("proto: misuse of isUnmarshaler") + } + return t.Implements(unmarshalerType) +} + +// Init populates the properties from a protocol buffer struct tag. +func (p *Properties) Init(typ reflect.Type, name, tag string, f *reflect.StructField) { + p.init(typ, name, tag, f, true) +} + +func (p *Properties) init(typ reflect.Type, name, tag string, f *reflect.StructField, lockGetProp bool) { + // "bytes,49,opt,def=hello!" + p.Name = name + p.OrigName = name + if f != nil { + p.field = toField(f) + } + if tag == "" { + return + } + p.Parse(tag) + p.setEncAndDec(typ, f, lockGetProp) +} + +var ( + propertiesMu sync.RWMutex + propertiesMap = make(map[reflect.Type]*StructProperties) +) + +// GetProperties returns the list of properties for the type represented by t. +// t must represent a generated struct type of a protocol message. +func GetProperties(t reflect.Type) *StructProperties { + if t.Kind() != reflect.Struct { + panic("proto: type must have kind struct") + } + + // Most calls to GetProperties in a long-running program will be + // retrieving details for types we have seen before. + propertiesMu.RLock() + sprop, ok := propertiesMap[t] + propertiesMu.RUnlock() + if ok { + if collectStats { + stats.Chit++ + } + return sprop + } + + propertiesMu.Lock() + sprop = getPropertiesLocked(t) + propertiesMu.Unlock() + return sprop +} + +// getPropertiesLocked requires that propertiesMu is held. +func getPropertiesLocked(t reflect.Type) *StructProperties { + if prop, ok := propertiesMap[t]; ok { + if collectStats { + stats.Chit++ + } + return prop + } + if collectStats { + stats.Cmiss++ + } + + prop := new(StructProperties) + // in case of recursive protos, fill this in now. + propertiesMap[t] = prop + + // build properties + prop.extendable = reflect.PtrTo(t).Implements(extendableProtoType) || + reflect.PtrTo(t).Implements(extendableProtoV1Type) + prop.unrecField = invalidField + prop.Prop = make([]*Properties, t.NumField()) + prop.order = make([]int, t.NumField()) + + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + p := new(Properties) + name := f.Name + p.init(f.Type, name, f.Tag.Get("protobuf"), &f, false) + + if f.Name == "XXX_InternalExtensions" { // special case + p.enc = (*Buffer).enc_exts + p.dec = nil // not needed + p.size = size_exts + } else if f.Name == "XXX_extensions" { // special case + p.enc = (*Buffer).enc_map + p.dec = nil // not needed + p.size = size_map + } else if f.Name == "XXX_unrecognized" { // special case + prop.unrecField = toField(&f) + } + oneof := f.Tag.Get("protobuf_oneof") // special case + if oneof != "" { + // Oneof fields don't use the traditional protobuf tag. + p.OrigName = oneof + } + prop.Prop[i] = p + prop.order[i] = i + if debug { + print(i, " ", f.Name, " ", t.String(), " ") + if p.Tag > 0 { + print(p.String()) + } + print("\n") + } + if p.enc == nil && !strings.HasPrefix(f.Name, "XXX_") && oneof == "" { + fmt.Fprintln(os.Stderr, "proto: no encoder for", f.Name, f.Type.String(), "[GetProperties]") + } + } + + // Re-order prop.order. + sort.Sort(prop) + + type oneofMessage interface { + XXX_OneofFuncs() (func(Message, *Buffer) error, func(Message, int, int, *Buffer) (bool, error), func(Message) int, []interface{}) + } + if om, ok := reflect.Zero(reflect.PtrTo(t)).Interface().(oneofMessage); ok { + var oots []interface{} + prop.oneofMarshaler, prop.oneofUnmarshaler, prop.oneofSizer, oots = om.XXX_OneofFuncs() + prop.stype = t + + // Interpret oneof metadata. + prop.OneofTypes = make(map[string]*OneofProperties) + for _, oot := range oots { + oop := &OneofProperties{ + Type: reflect.ValueOf(oot).Type(), // *T + Prop: new(Properties), + } + sft := oop.Type.Elem().Field(0) + oop.Prop.Name = sft.Name + oop.Prop.Parse(sft.Tag.Get("protobuf")) + // There will be exactly one interface field that + // this new value is assignable to. + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + if f.Type.Kind() != reflect.Interface { + continue + } + if !oop.Type.AssignableTo(f.Type) { + continue + } + oop.Field = i + break + } + prop.OneofTypes[oop.Prop.OrigName] = oop + } + } + + // build required counts + // build tags + reqCount := 0 + prop.decoderOrigNames = make(map[string]int) + for i, p := range prop.Prop { + if strings.HasPrefix(p.Name, "XXX_") { + // Internal fields should not appear in tags/origNames maps. + // They are handled specially when encoding and decoding. + continue + } + if p.Required { + reqCount++ + } + prop.decoderTags.put(p.Tag, i) + prop.decoderOrigNames[p.OrigName] = i + } + prop.reqCount = reqCount + + return prop +} + +// Return the Properties object for the x[0]'th field of the structure. +func propByIndex(t reflect.Type, x []int) *Properties { + if len(x) != 1 { + fmt.Fprintf(os.Stderr, "proto: field index dimension %d (not 1) for type %s\n", len(x), t) + return nil + } + prop := GetProperties(t) + return prop.Prop[x[0]] +} + +// Get the address and type of a pointer to a struct from an interface. +func getbase(pb Message) (t reflect.Type, b structPointer, err error) { + if pb == nil { + err = ErrNil + return + } + // get the reflect type of the pointer to the struct. + t = reflect.TypeOf(pb) + // get the address of the struct. + value := reflect.ValueOf(pb) + b = toStructPointer(value) + return +} + +// A global registry of enum types. +// The generated code will register the generated maps by calling RegisterEnum. + +var enumValueMaps = make(map[string]map[string]int32) + +// RegisterEnum is called from the generated code to install the enum descriptor +// maps into the global table to aid parsing text format protocol buffers. +func RegisterEnum(typeName string, unusedNameMap map[int32]string, valueMap map[string]int32) { + if _, ok := enumValueMaps[typeName]; ok { + panic("proto: duplicate enum registered: " + typeName) + } + enumValueMaps[typeName] = valueMap +} + +// EnumValueMap returns the mapping from names to integers of the +// enum type enumType, or a nil if not found. +func EnumValueMap(enumType string) map[string]int32 { + return enumValueMaps[enumType] +} + +// A registry of all linked message types. +// The string is a fully-qualified proto name ("pkg.Message"). +var ( + protoTypes = make(map[string]reflect.Type) + revProtoTypes = make(map[reflect.Type]string) +) + +// RegisterType is called from generated code and maps from the fully qualified +// proto name to the type (pointer to struct) of the protocol buffer. +func RegisterType(x Message, name string) { + if _, ok := protoTypes[name]; ok { + // TODO: Some day, make this a panic. + log.Printf("proto: duplicate proto type registered: %s", name) + return + } + t := reflect.TypeOf(x) + protoTypes[name] = t + revProtoTypes[t] = name +} + +// MessageName returns the fully-qualified proto name for the given message type. +func MessageName(x Message) string { + type xname interface { + XXX_MessageName() string + } + if m, ok := x.(xname); ok { + return m.XXX_MessageName() + } + return revProtoTypes[reflect.TypeOf(x)] +} + +// MessageType returns the message type (pointer to struct) for a named message. +func MessageType(name string) reflect.Type { return protoTypes[name] } + +// A registry of all linked proto files. +var ( + protoFiles = make(map[string][]byte) // file name => fileDescriptor +) + +// RegisterFile is called from generated code and maps from the +// full file name of a .proto file to its compressed FileDescriptorProto. +func RegisterFile(filename string, fileDescriptor []byte) { + protoFiles[filename] = fileDescriptor +} + +// FileDescriptor returns the compressed FileDescriptorProto for a .proto file. +func FileDescriptor(filename string) []byte { return protoFiles[filename] } diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/proto3_proto/proto3.pb.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/proto3_proto/proto3.pb.go new file mode 100644 index 0000000..cc4d048 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/proto3_proto/proto3.pb.go @@ -0,0 +1,347 @@ +// Code generated by protoc-gen-go. +// source: proto3_proto/proto3.proto +// DO NOT EDIT! + +/* +Package proto3_proto is a generated protocol buffer package. + +It is generated from these files: + proto3_proto/proto3.proto + +It has these top-level messages: + Message + Nested + MessageWithMap + IntMap + IntMaps +*/ +package proto3_proto + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" +import google_protobuf "github.com/golang/protobuf/ptypes/any" +import testdata "github.com/golang/protobuf/proto/testdata" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type Message_Humour int32 + +const ( + Message_UNKNOWN Message_Humour = 0 + Message_PUNS Message_Humour = 1 + Message_SLAPSTICK Message_Humour = 2 + Message_BILL_BAILEY Message_Humour = 3 +) + +var Message_Humour_name = map[int32]string{ + 0: "UNKNOWN", + 1: "PUNS", + 2: "SLAPSTICK", + 3: "BILL_BAILEY", +} +var Message_Humour_value = map[string]int32{ + "UNKNOWN": 0, + "PUNS": 1, + "SLAPSTICK": 2, + "BILL_BAILEY": 3, +} + +func (x Message_Humour) String() string { + return proto.EnumName(Message_Humour_name, int32(x)) +} +func (Message_Humour) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0, 0} } + +type Message struct { + Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Hilarity Message_Humour `protobuf:"varint,2,opt,name=hilarity,enum=proto3_proto.Message_Humour" json:"hilarity,omitempty"` + HeightInCm uint32 `protobuf:"varint,3,opt,name=height_in_cm,json=heightInCm" json:"height_in_cm,omitempty"` + Data []byte `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` + ResultCount int64 `protobuf:"varint,7,opt,name=result_count,json=resultCount" json:"result_count,omitempty"` + TrueScotsman bool `protobuf:"varint,8,opt,name=true_scotsman,json=trueScotsman" json:"true_scotsman,omitempty"` + Score float32 `protobuf:"fixed32,9,opt,name=score" json:"score,omitempty"` + Key []uint64 `protobuf:"varint,5,rep,packed,name=key" json:"key,omitempty"` + ShortKey []int32 `protobuf:"varint,19,rep,packed,name=short_key,json=shortKey" json:"short_key,omitempty"` + Nested *Nested `protobuf:"bytes,6,opt,name=nested" json:"nested,omitempty"` + RFunny []Message_Humour `protobuf:"varint,16,rep,packed,name=r_funny,json=rFunny,enum=proto3_proto.Message_Humour" json:"r_funny,omitempty"` + Terrain map[string]*Nested `protobuf:"bytes,10,rep,name=terrain" json:"terrain,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + Proto2Field *testdata.SubDefaults `protobuf:"bytes,11,opt,name=proto2_field,json=proto2Field" json:"proto2_field,omitempty"` + Proto2Value map[string]*testdata.SubDefaults `protobuf:"bytes,13,rep,name=proto2_value,json=proto2Value" json:"proto2_value,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + Anything *google_protobuf.Any `protobuf:"bytes,14,opt,name=anything" json:"anything,omitempty"` + ManyThings []*google_protobuf.Any `protobuf:"bytes,15,rep,name=many_things,json=manyThings" json:"many_things,omitempty"` + Submessage *Message `protobuf:"bytes,17,opt,name=submessage" json:"submessage,omitempty"` + Children []*Message `protobuf:"bytes,18,rep,name=children" json:"children,omitempty"` +} + +func (m *Message) Reset() { *m = Message{} } +func (m *Message) String() string { return proto.CompactTextString(m) } +func (*Message) ProtoMessage() {} +func (*Message) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } + +func (m *Message) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Message) GetHilarity() Message_Humour { + if m != nil { + return m.Hilarity + } + return Message_UNKNOWN +} + +func (m *Message) GetHeightInCm() uint32 { + if m != nil { + return m.HeightInCm + } + return 0 +} + +func (m *Message) GetData() []byte { + if m != nil { + return m.Data + } + return nil +} + +func (m *Message) GetResultCount() int64 { + if m != nil { + return m.ResultCount + } + return 0 +} + +func (m *Message) GetTrueScotsman() bool { + if m != nil { + return m.TrueScotsman + } + return false +} + +func (m *Message) GetScore() float32 { + if m != nil { + return m.Score + } + return 0 +} + +func (m *Message) GetKey() []uint64 { + if m != nil { + return m.Key + } + return nil +} + +func (m *Message) GetShortKey() []int32 { + if m != nil { + return m.ShortKey + } + return nil +} + +func (m *Message) GetNested() *Nested { + if m != nil { + return m.Nested + } + return nil +} + +func (m *Message) GetRFunny() []Message_Humour { + if m != nil { + return m.RFunny + } + return nil +} + +func (m *Message) GetTerrain() map[string]*Nested { + if m != nil { + return m.Terrain + } + return nil +} + +func (m *Message) GetProto2Field() *testdata.SubDefaults { + if m != nil { + return m.Proto2Field + } + return nil +} + +func (m *Message) GetProto2Value() map[string]*testdata.SubDefaults { + if m != nil { + return m.Proto2Value + } + return nil +} + +func (m *Message) GetAnything() *google_protobuf.Any { + if m != nil { + return m.Anything + } + return nil +} + +func (m *Message) GetManyThings() []*google_protobuf.Any { + if m != nil { + return m.ManyThings + } + return nil +} + +func (m *Message) GetSubmessage() *Message { + if m != nil { + return m.Submessage + } + return nil +} + +func (m *Message) GetChildren() []*Message { + if m != nil { + return m.Children + } + return nil +} + +type Nested struct { + Bunny string `protobuf:"bytes,1,opt,name=bunny" json:"bunny,omitempty"` + Cute bool `protobuf:"varint,2,opt,name=cute" json:"cute,omitempty"` +} + +func (m *Nested) Reset() { *m = Nested{} } +func (m *Nested) String() string { return proto.CompactTextString(m) } +func (*Nested) ProtoMessage() {} +func (*Nested) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } + +func (m *Nested) GetBunny() string { + if m != nil { + return m.Bunny + } + return "" +} + +func (m *Nested) GetCute() bool { + if m != nil { + return m.Cute + } + return false +} + +type MessageWithMap struct { + ByteMapping map[bool][]byte `protobuf:"bytes,1,rep,name=byte_mapping,json=byteMapping" json:"byte_mapping,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (m *MessageWithMap) Reset() { *m = MessageWithMap{} } +func (m *MessageWithMap) String() string { return proto.CompactTextString(m) } +func (*MessageWithMap) ProtoMessage() {} +func (*MessageWithMap) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } + +func (m *MessageWithMap) GetByteMapping() map[bool][]byte { + if m != nil { + return m.ByteMapping + } + return nil +} + +type IntMap struct { + Rtt map[int32]int32 `protobuf:"bytes,1,rep,name=rtt" json:"rtt,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"` +} + +func (m *IntMap) Reset() { *m = IntMap{} } +func (m *IntMap) String() string { return proto.CompactTextString(m) } +func (*IntMap) ProtoMessage() {} +func (*IntMap) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } + +func (m *IntMap) GetRtt() map[int32]int32 { + if m != nil { + return m.Rtt + } + return nil +} + +type IntMaps struct { + Maps []*IntMap `protobuf:"bytes,1,rep,name=maps" json:"maps,omitempty"` +} + +func (m *IntMaps) Reset() { *m = IntMaps{} } +func (m *IntMaps) String() string { return proto.CompactTextString(m) } +func (*IntMaps) ProtoMessage() {} +func (*IntMaps) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } + +func (m *IntMaps) GetMaps() []*IntMap { + if m != nil { + return m.Maps + } + return nil +} + +func init() { + proto.RegisterType((*Message)(nil), "proto3_proto.Message") + proto.RegisterType((*Nested)(nil), "proto3_proto.Nested") + proto.RegisterType((*MessageWithMap)(nil), "proto3_proto.MessageWithMap") + proto.RegisterType((*IntMap)(nil), "proto3_proto.IntMap") + proto.RegisterType((*IntMaps)(nil), "proto3_proto.IntMaps") + proto.RegisterEnum("proto3_proto.Message_Humour", Message_Humour_name, Message_Humour_value) +} + +func init() { proto.RegisterFile("proto3_proto/proto3.proto", fileDescriptor0) } + +var fileDescriptor0 = []byte{ + // 733 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x84, 0x53, 0x6d, 0x6f, 0xf3, 0x34, + 0x14, 0x25, 0x4d, 0x5f, 0xd2, 0x9b, 0x74, 0x0b, 0x5e, 0x91, 0xbc, 0x02, 0x52, 0x28, 0x12, 0x8a, + 0x78, 0x49, 0xa1, 0xd3, 0xd0, 0x84, 0x10, 0x68, 0x1b, 0x9b, 0xa8, 0xd6, 0x95, 0xca, 0xdd, 0x98, + 0xf8, 0x14, 0xa5, 0xad, 0xdb, 0x46, 0x34, 0x4e, 0x49, 0x1c, 0xa4, 0xfc, 0x1d, 0xfe, 0x28, 0x8f, + 0x6c, 0xa7, 0x5d, 0x36, 0x65, 0xcf, 0xf3, 0x29, 0xf6, 0xf1, 0xb9, 0xf7, 0x9c, 0x1c, 0x5f, 0xc3, + 0xe9, 0x2e, 0x89, 0x79, 0x7c, 0xe6, 0xcb, 0xcf, 0x40, 0x6d, 0x3c, 0xf9, 0x41, 0x56, 0xf9, 0xa8, + 0x77, 0xba, 0x8e, 0xe3, 0xf5, 0x96, 0x2a, 0xca, 0x3c, 0x5b, 0x0d, 0x02, 0x96, 0x2b, 0x62, 0xef, + 0x84, 0xd3, 0x94, 0x2f, 0x03, 0x1e, 0x0c, 0xc4, 0x42, 0x81, 0xfd, 0xff, 0x5b, 0xd0, 0xba, 0xa7, + 0x69, 0x1a, 0xac, 0x29, 0x42, 0x50, 0x67, 0x41, 0x44, 0xb1, 0xe6, 0x68, 0x6e, 0x9b, 0xc8, 0x35, + 0xba, 0x00, 0x63, 0x13, 0x6e, 0x83, 0x24, 0xe4, 0x39, 0xae, 0x39, 0x9a, 0x7b, 0x34, 0xfc, 0xcc, + 0x2b, 0x0b, 0x7a, 0x45, 0xb1, 0xf7, 0x7b, 0x16, 0xc5, 0x59, 0x42, 0x0e, 0x6c, 0xe4, 0x80, 0xb5, + 0xa1, 0xe1, 0x7a, 0xc3, 0xfd, 0x90, 0xf9, 0x8b, 0x08, 0xeb, 0x8e, 0xe6, 0x76, 0x08, 0x28, 0x6c, + 0xc4, 0xae, 0x23, 0xa1, 0x27, 0xec, 0xe0, 0xba, 0xa3, 0xb9, 0x16, 0x91, 0x6b, 0xf4, 0x05, 0x58, + 0x09, 0x4d, 0xb3, 0x2d, 0xf7, 0x17, 0x71, 0xc6, 0x38, 0x6e, 0x39, 0x9a, 0xab, 0x13, 0x53, 0x61, + 0xd7, 0x02, 0x42, 0x5f, 0x42, 0x87, 0x27, 0x19, 0xf5, 0xd3, 0x45, 0xcc, 0xd3, 0x28, 0x60, 0xd8, + 0x70, 0x34, 0xd7, 0x20, 0x96, 0x00, 0x67, 0x05, 0x86, 0xba, 0xd0, 0x48, 0x17, 0x71, 0x42, 0x71, + 0xdb, 0xd1, 0xdc, 0x1a, 0x51, 0x1b, 0x64, 0x83, 0xfe, 0x37, 0xcd, 0x71, 0xc3, 0xd1, 0xdd, 0x3a, + 0x11, 0x4b, 0xf4, 0x29, 0xb4, 0xd3, 0x4d, 0x9c, 0x70, 0x5f, 0xe0, 0x27, 0x8e, 0xee, 0x36, 0x88, + 0x21, 0x81, 0x3b, 0x9a, 0xa3, 0x6f, 0xa1, 0xc9, 0x68, 0xca, 0xe9, 0x12, 0x37, 0x1d, 0xcd, 0x35, + 0x87, 0xdd, 0x97, 0xbf, 0x3e, 0x91, 0x67, 0xa4, 0xe0, 0xa0, 0x73, 0x68, 0x25, 0xfe, 0x2a, 0x63, + 0x2c, 0xc7, 0xb6, 0xa3, 0x7f, 0x30, 0xa9, 0x66, 0x72, 0x2b, 0xb8, 0xe8, 0x67, 0x68, 0x71, 0x9a, + 0x24, 0x41, 0xc8, 0x30, 0x38, 0xba, 0x6b, 0x0e, 0xfb, 0xd5, 0x65, 0x0f, 0x8a, 0x74, 0xc3, 0x78, + 0x92, 0x93, 0x7d, 0x09, 0xba, 0x00, 0x75, 0xff, 0x43, 0x7f, 0x15, 0xd2, 0xed, 0x12, 0x9b, 0xd2, + 0xe8, 0x27, 0xde, 0xfe, 0xae, 0xbd, 0x59, 0x36, 0xff, 0x8d, 0xae, 0x82, 0x6c, 0xcb, 0x53, 0x62, + 0x2a, 0xea, 0xad, 0x60, 0xa2, 0xd1, 0xa1, 0xf2, 0xdf, 0x60, 0x9b, 0x51, 0xdc, 0x91, 0xe2, 0x5f, + 0x55, 0x8b, 0x4f, 0x25, 0xf3, 0x4f, 0x41, 0x54, 0x06, 0x8a, 0x56, 0x12, 0x41, 0xdf, 0x83, 0x11, + 0xb0, 0x9c, 0x6f, 0x42, 0xb6, 0xc6, 0x47, 0x45, 0x52, 0x6a, 0x0e, 0xbd, 0xfd, 0x1c, 0x7a, 0x97, + 0x2c, 0x27, 0x07, 0x16, 0x3a, 0x07, 0x33, 0x0a, 0x58, 0xee, 0xcb, 0x5d, 0x8a, 0x8f, 0xa5, 0x76, + 0x75, 0x11, 0x08, 0xe2, 0x83, 0xe4, 0xa1, 0x73, 0x80, 0x34, 0x9b, 0x47, 0xca, 0x14, 0xfe, 0xb8, + 0xf8, 0xd7, 0x2a, 0xc7, 0xa4, 0x44, 0x44, 0x3f, 0x80, 0xb1, 0xd8, 0x84, 0xdb, 0x65, 0x42, 0x19, + 0x46, 0x52, 0xea, 0x8d, 0xa2, 0x03, 0xad, 0x37, 0x05, 0xab, 0x1c, 0xf8, 0x7e, 0x72, 0xd4, 0xd3, + 0x90, 0x93, 0xf3, 0x35, 0x34, 0x54, 0x70, 0xb5, 0xf7, 0xcc, 0x86, 0xa2, 0xfc, 0x54, 0xbb, 0xd0, + 0x7a, 0x8f, 0x60, 0xbf, 0x4e, 0xb1, 0xa2, 0xeb, 0x37, 0x2f, 0xbb, 0xbe, 0x71, 0x91, 0xcf, 0x6d, + 0xfb, 0xbf, 0x42, 0x53, 0x0d, 0x14, 0x32, 0xa1, 0xf5, 0x38, 0xb9, 0x9b, 0xfc, 0xf1, 0x34, 0xb1, + 0x3f, 0x42, 0x06, 0xd4, 0xa7, 0x8f, 0x93, 0x99, 0xad, 0xa1, 0x0e, 0xb4, 0x67, 0xe3, 0xcb, 0xe9, + 0xec, 0x61, 0x74, 0x7d, 0x67, 0xd7, 0xd0, 0x31, 0x98, 0x57, 0xa3, 0xf1, 0xd8, 0xbf, 0xba, 0x1c, + 0x8d, 0x6f, 0xfe, 0xb2, 0xf5, 0xfe, 0x10, 0x9a, 0xca, 0xac, 0x78, 0x33, 0x73, 0x39, 0xbe, 0xca, + 0x8f, 0xda, 0x88, 0x57, 0xba, 0xc8, 0xb8, 0x32, 0x64, 0x10, 0xb9, 0xee, 0xff, 0xa7, 0xc1, 0x51, + 0x91, 0xd9, 0x53, 0xc8, 0x37, 0xf7, 0xc1, 0x0e, 0x4d, 0xc1, 0x9a, 0xe7, 0x9c, 0xfa, 0x51, 0xb0, + 0xdb, 0x89, 0x39, 0xd0, 0x64, 0xce, 0xdf, 0x55, 0xe6, 0x5c, 0xd4, 0x78, 0x57, 0x39, 0xa7, 0xf7, + 0x8a, 0x5f, 0x4c, 0xd5, 0xfc, 0x19, 0xe9, 0xfd, 0x02, 0xf6, 0x6b, 0x42, 0x39, 0x30, 0x43, 0x05, + 0xd6, 0x2d, 0x07, 0x66, 0x95, 0x93, 0xf9, 0x07, 0x9a, 0x23, 0xc6, 0x85, 0xb7, 0x01, 0xe8, 0x09, + 0xe7, 0x85, 0xa5, 0xcf, 0x5f, 0x5a, 0x52, 0x14, 0x8f, 0x70, 0xae, 0x2c, 0x08, 0x66, 0xef, 0x47, + 0x30, 0xf6, 0x40, 0x59, 0xb2, 0x51, 0x21, 0xd9, 0x28, 0x4b, 0x9e, 0x41, 0x4b, 0xf5, 0x4b, 0x91, + 0x0b, 0xf5, 0x28, 0xd8, 0xa5, 0x85, 0x68, 0xb7, 0x4a, 0x94, 0x48, 0xc6, 0xbc, 0xa9, 0x8e, 0xde, + 0x05, 0x00, 0x00, 0xff, 0xff, 0x75, 0x38, 0xad, 0x84, 0xe4, 0x05, 0x00, 0x00, +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/proto3_proto/proto3.proto b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/proto3_proto/proto3.proto new file mode 100644 index 0000000..2048655 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/proto3_proto/proto3.proto @@ -0,0 +1,87 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2014 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto3"; + +import "google/protobuf/any.proto"; +import "testdata/test.proto"; + +package proto3_proto; + +message Message { + enum Humour { + UNKNOWN = 0; + PUNS = 1; + SLAPSTICK = 2; + BILL_BAILEY = 3; + } + + string name = 1; + Humour hilarity = 2; + uint32 height_in_cm = 3; + bytes data = 4; + int64 result_count = 7; + bool true_scotsman = 8; + float score = 9; + + repeated uint64 key = 5; + repeated int32 short_key = 19; + Nested nested = 6; + repeated Humour r_funny = 16; + + map terrain = 10; + testdata.SubDefaults proto2_field = 11; + map proto2_value = 13; + + google.protobuf.Any anything = 14; + repeated google.protobuf.Any many_things = 15; + + Message submessage = 17; + repeated Message children = 18; +} + +message Nested { + string bunny = 1; + bool cute = 2; +} + +message MessageWithMap { + map byte_mapping = 1; +} + + +message IntMap { + map rtt = 1; +} + +message IntMaps { + repeated IntMap maps = 1; +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/proto3_test.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/proto3_test.go new file mode 100644 index 0000000..735837f --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/proto3_test.go @@ -0,0 +1,135 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2014 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package proto_test + +import ( + "testing" + + "github.com/golang/protobuf/proto" + pb "github.com/golang/protobuf/proto/proto3_proto" + tpb "github.com/golang/protobuf/proto/testdata" +) + +func TestProto3ZeroValues(t *testing.T) { + tests := []struct { + desc string + m proto.Message + }{ + {"zero message", &pb.Message{}}, + {"empty bytes field", &pb.Message{Data: []byte{}}}, + } + for _, test := range tests { + b, err := proto.Marshal(test.m) + if err != nil { + t.Errorf("%s: proto.Marshal: %v", test.desc, err) + continue + } + if len(b) > 0 { + t.Errorf("%s: Encoding is non-empty: %q", test.desc, b) + } + } +} + +func TestRoundTripProto3(t *testing.T) { + m := &pb.Message{ + Name: "David", // (2 | 1<<3): 0x0a 0x05 "David" + Hilarity: pb.Message_PUNS, // (0 | 2<<3): 0x10 0x01 + HeightInCm: 178, // (0 | 3<<3): 0x18 0xb2 0x01 + Data: []byte("roboto"), // (2 | 4<<3): 0x20 0x06 "roboto" + ResultCount: 47, // (0 | 7<<3): 0x38 0x2f + TrueScotsman: true, // (0 | 8<<3): 0x40 0x01 + Score: 8.1, // (5 | 9<<3): 0x4d <8.1> + + Key: []uint64{1, 0xdeadbeef}, + Nested: &pb.Nested{ + Bunny: "Monty", + }, + } + t.Logf(" m: %v", m) + + b, err := proto.Marshal(m) + if err != nil { + t.Fatalf("proto.Marshal: %v", err) + } + t.Logf(" b: %q", b) + + m2 := new(pb.Message) + if err := proto.Unmarshal(b, m2); err != nil { + t.Fatalf("proto.Unmarshal: %v", err) + } + t.Logf("m2: %v", m2) + + if !proto.Equal(m, m2) { + t.Errorf("proto.Equal returned false:\n m: %v\nm2: %v", m, m2) + } +} + +func TestGettersForBasicTypesExist(t *testing.T) { + var m pb.Message + if got := m.GetNested().GetBunny(); got != "" { + t.Errorf("m.GetNested().GetBunny() = %q, want empty string", got) + } + if got := m.GetNested().GetCute(); got { + t.Errorf("m.GetNested().GetCute() = %t, want false", got) + } +} + +func TestProto3SetDefaults(t *testing.T) { + in := &pb.Message{ + Terrain: map[string]*pb.Nested{ + "meadow": new(pb.Nested), + }, + Proto2Field: new(tpb.SubDefaults), + Proto2Value: map[string]*tpb.SubDefaults{ + "badlands": new(tpb.SubDefaults), + }, + } + + got := proto.Clone(in).(*pb.Message) + proto.SetDefaults(got) + + // There are no defaults in proto3. Everything should be the zero value, but + // we need to remember to set defaults for nested proto2 messages. + want := &pb.Message{ + Terrain: map[string]*pb.Nested{ + "meadow": new(pb.Nested), + }, + Proto2Field: &tpb.SubDefaults{N: proto.Int64(7)}, + Proto2Value: map[string]*tpb.SubDefaults{ + "badlands": &tpb.SubDefaults{N: proto.Int64(7)}, + }, + } + + if !proto.Equal(got, want) { + t.Errorf("with in = %v\nproto.SetDefaults(in) =>\ngot %v\nwant %v", in, got, want) + } +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/size2_test.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/size2_test.go new file mode 100644 index 0000000..a2729c3 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/size2_test.go @@ -0,0 +1,63 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2012 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package proto + +import ( + "testing" +) + +// This is a separate file and package from size_test.go because that one uses +// generated messages and thus may not be in package proto without having a circular +// dependency, whereas this file tests unexported details of size.go. + +func TestVarintSize(t *testing.T) { + // Check the edge cases carefully. + testCases := []struct { + n uint64 + size int + }{ + {0, 1}, + {1, 1}, + {127, 1}, + {128, 2}, + {16383, 2}, + {16384, 3}, + {1<<63 - 1, 9}, + {1 << 63, 10}, + } + for _, tc := range testCases { + size := sizeVarint(tc.n) + if size != tc.size { + t.Errorf("sizeVarint(%d) = %d, want %d", tc.n, size, tc.size) + } + } +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/size_test.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/size_test.go new file mode 100644 index 0000000..af1034d --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/size_test.go @@ -0,0 +1,164 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2012 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package proto_test + +import ( + "log" + "strings" + "testing" + + . "github.com/golang/protobuf/proto" + proto3pb "github.com/golang/protobuf/proto/proto3_proto" + pb "github.com/golang/protobuf/proto/testdata" +) + +var messageWithExtension1 = &pb.MyMessage{Count: Int32(7)} + +// messageWithExtension2 is in equal_test.go. +var messageWithExtension3 = &pb.MyMessage{Count: Int32(8)} + +func init() { + if err := SetExtension(messageWithExtension1, pb.E_Ext_More, &pb.Ext{Data: String("Abbott")}); err != nil { + log.Panicf("SetExtension: %v", err) + } + if err := SetExtension(messageWithExtension3, pb.E_Ext_More, &pb.Ext{Data: String("Costello")}); err != nil { + log.Panicf("SetExtension: %v", err) + } + + // Force messageWithExtension3 to have the extension encoded. + Marshal(messageWithExtension3) + +} + +var SizeTests = []struct { + desc string + pb Message +}{ + {"empty", &pb.OtherMessage{}}, + // Basic types. + {"bool", &pb.Defaults{F_Bool: Bool(true)}}, + {"int32", &pb.Defaults{F_Int32: Int32(12)}}, + {"negative int32", &pb.Defaults{F_Int32: Int32(-1)}}, + {"small int64", &pb.Defaults{F_Int64: Int64(1)}}, + {"big int64", &pb.Defaults{F_Int64: Int64(1 << 20)}}, + {"negative int64", &pb.Defaults{F_Int64: Int64(-1)}}, + {"fixed32", &pb.Defaults{F_Fixed32: Uint32(71)}}, + {"fixed64", &pb.Defaults{F_Fixed64: Uint64(72)}}, + {"uint32", &pb.Defaults{F_Uint32: Uint32(123)}}, + {"uint64", &pb.Defaults{F_Uint64: Uint64(124)}}, + {"float", &pb.Defaults{F_Float: Float32(12.6)}}, + {"double", &pb.Defaults{F_Double: Float64(13.9)}}, + {"string", &pb.Defaults{F_String: String("niles")}}, + {"bytes", &pb.Defaults{F_Bytes: []byte("wowsa")}}, + {"bytes, empty", &pb.Defaults{F_Bytes: []byte{}}}, + {"sint32", &pb.Defaults{F_Sint32: Int32(65)}}, + {"sint64", &pb.Defaults{F_Sint64: Int64(67)}}, + {"enum", &pb.Defaults{F_Enum: pb.Defaults_BLUE.Enum()}}, + // Repeated. + {"empty repeated bool", &pb.MoreRepeated{Bools: []bool{}}}, + {"repeated bool", &pb.MoreRepeated{Bools: []bool{false, true, true, false}}}, + {"packed repeated bool", &pb.MoreRepeated{BoolsPacked: []bool{false, true, true, false, true, true, true}}}, + {"repeated int32", &pb.MoreRepeated{Ints: []int32{1, 12203, 1729, -1}}}, + {"repeated int32 packed", &pb.MoreRepeated{IntsPacked: []int32{1, 12203, 1729}}}, + {"repeated int64 packed", &pb.MoreRepeated{Int64SPacked: []int64{ + // Need enough large numbers to verify that the header is counting the number of bytes + // for the field, not the number of elements. + 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, + 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, + }}}, + {"repeated string", &pb.MoreRepeated{Strings: []string{"r", "ken", "gri"}}}, + {"repeated fixed", &pb.MoreRepeated{Fixeds: []uint32{1, 2, 3, 4}}}, + // Nested. + {"nested", &pb.OldMessage{Nested: &pb.OldMessage_Nested{Name: String("whatever")}}}, + {"group", &pb.GroupOld{G: &pb.GroupOld_G{X: Int32(12345)}}}, + // Other things. + {"unrecognized", &pb.MoreRepeated{XXX_unrecognized: []byte{13<<3 | 0, 4}}}, + {"extension (unencoded)", messageWithExtension1}, + {"extension (encoded)", messageWithExtension3}, + // proto3 message + {"proto3 empty", &proto3pb.Message{}}, + {"proto3 bool", &proto3pb.Message{TrueScotsman: true}}, + {"proto3 int64", &proto3pb.Message{ResultCount: 1}}, + {"proto3 uint32", &proto3pb.Message{HeightInCm: 123}}, + {"proto3 float", &proto3pb.Message{Score: 12.6}}, + {"proto3 string", &proto3pb.Message{Name: "Snezana"}}, + {"proto3 bytes", &proto3pb.Message{Data: []byte("wowsa")}}, + {"proto3 bytes, empty", &proto3pb.Message{Data: []byte{}}}, + {"proto3 enum", &proto3pb.Message{Hilarity: proto3pb.Message_PUNS}}, + {"proto3 map field with empty bytes", &proto3pb.MessageWithMap{ByteMapping: map[bool][]byte{false: []byte{}}}}, + + {"map field", &pb.MessageWithMap{NameMapping: map[int32]string{1: "Rob", 7: "Andrew"}}}, + {"map field with message", &pb.MessageWithMap{MsgMapping: map[int64]*pb.FloatingPoint{0x7001: &pb.FloatingPoint{F: Float64(2.0)}}}}, + {"map field with bytes", &pb.MessageWithMap{ByteMapping: map[bool][]byte{true: []byte("this time for sure")}}}, + {"map field with empty bytes", &pb.MessageWithMap{ByteMapping: map[bool][]byte{true: []byte{}}}}, + + {"map field with big entry", &pb.MessageWithMap{NameMapping: map[int32]string{8: strings.Repeat("x", 125)}}}, + {"map field with big key and val", &pb.MessageWithMap{StrToStr: map[string]string{strings.Repeat("x", 70): strings.Repeat("y", 70)}}}, + {"map field with big numeric key", &pb.MessageWithMap{NameMapping: map[int32]string{0xf00d: "om nom nom"}}}, + + {"oneof not set", &pb.Oneof{}}, + {"oneof bool", &pb.Oneof{Union: &pb.Oneof_F_Bool{true}}}, + {"oneof zero int32", &pb.Oneof{Union: &pb.Oneof_F_Int32{0}}}, + {"oneof big int32", &pb.Oneof{Union: &pb.Oneof_F_Int32{1 << 20}}}, + {"oneof int64", &pb.Oneof{Union: &pb.Oneof_F_Int64{42}}}, + {"oneof fixed32", &pb.Oneof{Union: &pb.Oneof_F_Fixed32{43}}}, + {"oneof fixed64", &pb.Oneof{Union: &pb.Oneof_F_Fixed64{44}}}, + {"oneof uint32", &pb.Oneof{Union: &pb.Oneof_F_Uint32{45}}}, + {"oneof uint64", &pb.Oneof{Union: &pb.Oneof_F_Uint64{46}}}, + {"oneof float", &pb.Oneof{Union: &pb.Oneof_F_Float{47.1}}}, + {"oneof double", &pb.Oneof{Union: &pb.Oneof_F_Double{48.9}}}, + {"oneof string", &pb.Oneof{Union: &pb.Oneof_F_String{"Rhythmic Fman"}}}, + {"oneof bytes", &pb.Oneof{Union: &pb.Oneof_F_Bytes{[]byte("let go")}}}, + {"oneof sint32", &pb.Oneof{Union: &pb.Oneof_F_Sint32{50}}}, + {"oneof sint64", &pb.Oneof{Union: &pb.Oneof_F_Sint64{51}}}, + {"oneof enum", &pb.Oneof{Union: &pb.Oneof_F_Enum{pb.MyMessage_BLUE}}}, + {"message for oneof", &pb.GoTestField{Label: String("k"), Type: String("v")}}, + {"oneof message", &pb.Oneof{Union: &pb.Oneof_F_Message{&pb.GoTestField{Label: String("k"), Type: String("v")}}}}, + {"oneof group", &pb.Oneof{Union: &pb.Oneof_FGroup{&pb.Oneof_F_Group{X: Int32(52)}}}}, + {"oneof largest tag", &pb.Oneof{Union: &pb.Oneof_F_Largest_Tag{1}}}, + {"multiple oneofs", &pb.Oneof{Union: &pb.Oneof_F_Int32{1}, Tormato: &pb.Oneof_Value{2}}}, +} + +func TestSize(t *testing.T) { + for _, tc := range SizeTests { + size := Size(tc.pb) + b, err := Marshal(tc.pb) + if err != nil { + t.Errorf("%v: Marshal failed: %v", tc.desc, err) + continue + } + if size != len(b) { + t.Errorf("%v: Size(%v) = %d, want %d", tc.desc, tc.pb, size, len(b)) + t.Logf("%v: bytes: %#v", tc.desc, b) + } + } +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/testdata/Makefile b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/testdata/Makefile new file mode 100644 index 0000000..fc28862 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/testdata/Makefile @@ -0,0 +1,50 @@ +# Go support for Protocol Buffers - Google's data interchange format +# +# Copyright 2010 The Go Authors. All rights reserved. +# https://github.com/golang/protobuf +# +# 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. + + +include ../../Make.protobuf + +all: regenerate + +regenerate: + rm -f test.pb.go + make test.pb.go + +# The following rules are just aids to development. Not needed for typical testing. + +diff: regenerate + git diff test.pb.go + +restore: + cp test.pb.go.golden test.pb.go + +preserve: + cp test.pb.go test.pb.go.golden diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/testdata/golden_test.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/testdata/golden_test.go new file mode 100644 index 0000000..7172d0e --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/testdata/golden_test.go @@ -0,0 +1,86 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2012 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +// Verify that the compiler output for test.proto is unchanged. + +package testdata + +import ( + "crypto/sha1" + "fmt" + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "testing" +) + +// sum returns in string form (for easy comparison) the SHA-1 hash of the named file. +func sum(t *testing.T, name string) string { + data, err := ioutil.ReadFile(name) + if err != nil { + t.Fatal(err) + } + t.Logf("sum(%q): length is %d", name, len(data)) + hash := sha1.New() + _, err = hash.Write(data) + if err != nil { + t.Fatal(err) + } + return fmt.Sprintf("% x", hash.Sum(nil)) +} + +func run(t *testing.T, name string, args ...string) { + cmd := exec.Command(name, args...) + cmd.Stdin = os.Stdin + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + err := cmd.Run() + if err != nil { + t.Fatal(err) + } +} + +func TestGolden(t *testing.T) { + // Compute the original checksum. + goldenSum := sum(t, "test.pb.go") + // Run the proto compiler. + run(t, "protoc", "--go_out="+os.TempDir(), "test.proto") + newFile := filepath.Join(os.TempDir(), "test.pb.go") + defer os.Remove(newFile) + // Compute the new checksum. + newSum := sum(t, newFile) + // Verify + if newSum != goldenSum { + run(t, "diff", "-u", "test.pb.go", newFile) + t.Fatal("Code generated by protoc-gen-go has changed; update test.pb.go") + } +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/testdata/test.pb.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/testdata/test.pb.go new file mode 100644 index 0000000..e980d1a --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/testdata/test.pb.go @@ -0,0 +1,4147 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: test.proto + +/* +Package testdata is a generated protocol buffer package. + +It is generated from these files: + test.proto + +It has these top-level messages: + GoEnum + GoTestField + GoTest + GoTestRequiredGroupField + GoSkipTest + NonPackedTest + PackedTest + MaxTag + OldMessage + NewMessage + InnerMessage + OtherMessage + RequiredInnerMessage + MyMessage + Ext + ComplexExtension + DefaultsMessage + MyMessageSet + Empty + MessageList + Strings + Defaults + SubDefaults + RepeatedEnum + MoreRepeated + GroupOld + GroupNew + FloatingPoint + MessageWithMap + Oneof + Communique +*/ +package testdata + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type FOO int32 + +const ( + FOO_FOO1 FOO = 1 +) + +var FOO_name = map[int32]string{ + 1: "FOO1", +} +var FOO_value = map[string]int32{ + "FOO1": 1, +} + +func (x FOO) Enum() *FOO { + p := new(FOO) + *p = x + return p +} +func (x FOO) String() string { + return proto.EnumName(FOO_name, int32(x)) +} +func (x *FOO) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FOO_value, data, "FOO") + if err != nil { + return err + } + *x = FOO(value) + return nil +} +func (FOO) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } + +// An enum, for completeness. +type GoTest_KIND int32 + +const ( + GoTest_VOID GoTest_KIND = 0 + // Basic types + GoTest_BOOL GoTest_KIND = 1 + GoTest_BYTES GoTest_KIND = 2 + GoTest_FINGERPRINT GoTest_KIND = 3 + GoTest_FLOAT GoTest_KIND = 4 + GoTest_INT GoTest_KIND = 5 + GoTest_STRING GoTest_KIND = 6 + GoTest_TIME GoTest_KIND = 7 + // Groupings + GoTest_TUPLE GoTest_KIND = 8 + GoTest_ARRAY GoTest_KIND = 9 + GoTest_MAP GoTest_KIND = 10 + // Table types + GoTest_TABLE GoTest_KIND = 11 + // Functions + GoTest_FUNCTION GoTest_KIND = 12 +) + +var GoTest_KIND_name = map[int32]string{ + 0: "VOID", + 1: "BOOL", + 2: "BYTES", + 3: "FINGERPRINT", + 4: "FLOAT", + 5: "INT", + 6: "STRING", + 7: "TIME", + 8: "TUPLE", + 9: "ARRAY", + 10: "MAP", + 11: "TABLE", + 12: "FUNCTION", +} +var GoTest_KIND_value = map[string]int32{ + "VOID": 0, + "BOOL": 1, + "BYTES": 2, + "FINGERPRINT": 3, + "FLOAT": 4, + "INT": 5, + "STRING": 6, + "TIME": 7, + "TUPLE": 8, + "ARRAY": 9, + "MAP": 10, + "TABLE": 11, + "FUNCTION": 12, +} + +func (x GoTest_KIND) Enum() *GoTest_KIND { + p := new(GoTest_KIND) + *p = x + return p +} +func (x GoTest_KIND) String() string { + return proto.EnumName(GoTest_KIND_name, int32(x)) +} +func (x *GoTest_KIND) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(GoTest_KIND_value, data, "GoTest_KIND") + if err != nil { + return err + } + *x = GoTest_KIND(value) + return nil +} +func (GoTest_KIND) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{2, 0} } + +type MyMessage_Color int32 + +const ( + MyMessage_RED MyMessage_Color = 0 + MyMessage_GREEN MyMessage_Color = 1 + MyMessage_BLUE MyMessage_Color = 2 +) + +var MyMessage_Color_name = map[int32]string{ + 0: "RED", + 1: "GREEN", + 2: "BLUE", +} +var MyMessage_Color_value = map[string]int32{ + "RED": 0, + "GREEN": 1, + "BLUE": 2, +} + +func (x MyMessage_Color) Enum() *MyMessage_Color { + p := new(MyMessage_Color) + *p = x + return p +} +func (x MyMessage_Color) String() string { + return proto.EnumName(MyMessage_Color_name, int32(x)) +} +func (x *MyMessage_Color) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(MyMessage_Color_value, data, "MyMessage_Color") + if err != nil { + return err + } + *x = MyMessage_Color(value) + return nil +} +func (MyMessage_Color) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{13, 0} } + +type DefaultsMessage_DefaultsEnum int32 + +const ( + DefaultsMessage_ZERO DefaultsMessage_DefaultsEnum = 0 + DefaultsMessage_ONE DefaultsMessage_DefaultsEnum = 1 + DefaultsMessage_TWO DefaultsMessage_DefaultsEnum = 2 +) + +var DefaultsMessage_DefaultsEnum_name = map[int32]string{ + 0: "ZERO", + 1: "ONE", + 2: "TWO", +} +var DefaultsMessage_DefaultsEnum_value = map[string]int32{ + "ZERO": 0, + "ONE": 1, + "TWO": 2, +} + +func (x DefaultsMessage_DefaultsEnum) Enum() *DefaultsMessage_DefaultsEnum { + p := new(DefaultsMessage_DefaultsEnum) + *p = x + return p +} +func (x DefaultsMessage_DefaultsEnum) String() string { + return proto.EnumName(DefaultsMessage_DefaultsEnum_name, int32(x)) +} +func (x *DefaultsMessage_DefaultsEnum) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(DefaultsMessage_DefaultsEnum_value, data, "DefaultsMessage_DefaultsEnum") + if err != nil { + return err + } + *x = DefaultsMessage_DefaultsEnum(value) + return nil +} +func (DefaultsMessage_DefaultsEnum) EnumDescriptor() ([]byte, []int) { + return fileDescriptor0, []int{16, 0} +} + +type Defaults_Color int32 + +const ( + Defaults_RED Defaults_Color = 0 + Defaults_GREEN Defaults_Color = 1 + Defaults_BLUE Defaults_Color = 2 +) + +var Defaults_Color_name = map[int32]string{ + 0: "RED", + 1: "GREEN", + 2: "BLUE", +} +var Defaults_Color_value = map[string]int32{ + "RED": 0, + "GREEN": 1, + "BLUE": 2, +} + +func (x Defaults_Color) Enum() *Defaults_Color { + p := new(Defaults_Color) + *p = x + return p +} +func (x Defaults_Color) String() string { + return proto.EnumName(Defaults_Color_name, int32(x)) +} +func (x *Defaults_Color) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Defaults_Color_value, data, "Defaults_Color") + if err != nil { + return err + } + *x = Defaults_Color(value) + return nil +} +func (Defaults_Color) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{21, 0} } + +type RepeatedEnum_Color int32 + +const ( + RepeatedEnum_RED RepeatedEnum_Color = 1 +) + +var RepeatedEnum_Color_name = map[int32]string{ + 1: "RED", +} +var RepeatedEnum_Color_value = map[string]int32{ + "RED": 1, +} + +func (x RepeatedEnum_Color) Enum() *RepeatedEnum_Color { + p := new(RepeatedEnum_Color) + *p = x + return p +} +func (x RepeatedEnum_Color) String() string { + return proto.EnumName(RepeatedEnum_Color_name, int32(x)) +} +func (x *RepeatedEnum_Color) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(RepeatedEnum_Color_value, data, "RepeatedEnum_Color") + if err != nil { + return err + } + *x = RepeatedEnum_Color(value) + return nil +} +func (RepeatedEnum_Color) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{23, 0} } + +type GoEnum struct { + Foo *FOO `protobuf:"varint,1,req,name=foo,enum=testdata.FOO" json:"foo,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GoEnum) Reset() { *m = GoEnum{} } +func (m *GoEnum) String() string { return proto.CompactTextString(m) } +func (*GoEnum) ProtoMessage() {} +func (*GoEnum) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } + +func (m *GoEnum) GetFoo() FOO { + if m != nil && m.Foo != nil { + return *m.Foo + } + return FOO_FOO1 +} + +type GoTestField struct { + Label *string `protobuf:"bytes,1,req,name=Label" json:"Label,omitempty"` + Type *string `protobuf:"bytes,2,req,name=Type" json:"Type,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GoTestField) Reset() { *m = GoTestField{} } +func (m *GoTestField) String() string { return proto.CompactTextString(m) } +func (*GoTestField) ProtoMessage() {} +func (*GoTestField) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } + +func (m *GoTestField) GetLabel() string { + if m != nil && m.Label != nil { + return *m.Label + } + return "" +} + +func (m *GoTestField) GetType() string { + if m != nil && m.Type != nil { + return *m.Type + } + return "" +} + +type GoTest struct { + // Some typical parameters + Kind *GoTest_KIND `protobuf:"varint,1,req,name=Kind,enum=testdata.GoTest_KIND" json:"Kind,omitempty"` + Table *string `protobuf:"bytes,2,opt,name=Table" json:"Table,omitempty"` + Param *int32 `protobuf:"varint,3,opt,name=Param" json:"Param,omitempty"` + // Required, repeated and optional foreign fields. + RequiredField *GoTestField `protobuf:"bytes,4,req,name=RequiredField" json:"RequiredField,omitempty"` + RepeatedField []*GoTestField `protobuf:"bytes,5,rep,name=RepeatedField" json:"RepeatedField,omitempty"` + OptionalField *GoTestField `protobuf:"bytes,6,opt,name=OptionalField" json:"OptionalField,omitempty"` + // Required fields of all basic types + F_BoolRequired *bool `protobuf:"varint,10,req,name=F_Bool_required,json=FBoolRequired" json:"F_Bool_required,omitempty"` + F_Int32Required *int32 `protobuf:"varint,11,req,name=F_Int32_required,json=FInt32Required" json:"F_Int32_required,omitempty"` + F_Int64Required *int64 `protobuf:"varint,12,req,name=F_Int64_required,json=FInt64Required" json:"F_Int64_required,omitempty"` + F_Fixed32Required *uint32 `protobuf:"fixed32,13,req,name=F_Fixed32_required,json=FFixed32Required" json:"F_Fixed32_required,omitempty"` + F_Fixed64Required *uint64 `protobuf:"fixed64,14,req,name=F_Fixed64_required,json=FFixed64Required" json:"F_Fixed64_required,omitempty"` + F_Uint32Required *uint32 `protobuf:"varint,15,req,name=F_Uint32_required,json=FUint32Required" json:"F_Uint32_required,omitempty"` + F_Uint64Required *uint64 `protobuf:"varint,16,req,name=F_Uint64_required,json=FUint64Required" json:"F_Uint64_required,omitempty"` + F_FloatRequired *float32 `protobuf:"fixed32,17,req,name=F_Float_required,json=FFloatRequired" json:"F_Float_required,omitempty"` + F_DoubleRequired *float64 `protobuf:"fixed64,18,req,name=F_Double_required,json=FDoubleRequired" json:"F_Double_required,omitempty"` + F_StringRequired *string `protobuf:"bytes,19,req,name=F_String_required,json=FStringRequired" json:"F_String_required,omitempty"` + F_BytesRequired []byte `protobuf:"bytes,101,req,name=F_Bytes_required,json=FBytesRequired" json:"F_Bytes_required,omitempty"` + F_Sint32Required *int32 `protobuf:"zigzag32,102,req,name=F_Sint32_required,json=FSint32Required" json:"F_Sint32_required,omitempty"` + F_Sint64Required *int64 `protobuf:"zigzag64,103,req,name=F_Sint64_required,json=FSint64Required" json:"F_Sint64_required,omitempty"` + // Repeated fields of all basic types + F_BoolRepeated []bool `protobuf:"varint,20,rep,name=F_Bool_repeated,json=FBoolRepeated" json:"F_Bool_repeated,omitempty"` + F_Int32Repeated []int32 `protobuf:"varint,21,rep,name=F_Int32_repeated,json=FInt32Repeated" json:"F_Int32_repeated,omitempty"` + F_Int64Repeated []int64 `protobuf:"varint,22,rep,name=F_Int64_repeated,json=FInt64Repeated" json:"F_Int64_repeated,omitempty"` + F_Fixed32Repeated []uint32 `protobuf:"fixed32,23,rep,name=F_Fixed32_repeated,json=FFixed32Repeated" json:"F_Fixed32_repeated,omitempty"` + F_Fixed64Repeated []uint64 `protobuf:"fixed64,24,rep,name=F_Fixed64_repeated,json=FFixed64Repeated" json:"F_Fixed64_repeated,omitempty"` + F_Uint32Repeated []uint32 `protobuf:"varint,25,rep,name=F_Uint32_repeated,json=FUint32Repeated" json:"F_Uint32_repeated,omitempty"` + F_Uint64Repeated []uint64 `protobuf:"varint,26,rep,name=F_Uint64_repeated,json=FUint64Repeated" json:"F_Uint64_repeated,omitempty"` + F_FloatRepeated []float32 `protobuf:"fixed32,27,rep,name=F_Float_repeated,json=FFloatRepeated" json:"F_Float_repeated,omitempty"` + F_DoubleRepeated []float64 `protobuf:"fixed64,28,rep,name=F_Double_repeated,json=FDoubleRepeated" json:"F_Double_repeated,omitempty"` + F_StringRepeated []string `protobuf:"bytes,29,rep,name=F_String_repeated,json=FStringRepeated" json:"F_String_repeated,omitempty"` + F_BytesRepeated [][]byte `protobuf:"bytes,201,rep,name=F_Bytes_repeated,json=FBytesRepeated" json:"F_Bytes_repeated,omitempty"` + F_Sint32Repeated []int32 `protobuf:"zigzag32,202,rep,name=F_Sint32_repeated,json=FSint32Repeated" json:"F_Sint32_repeated,omitempty"` + F_Sint64Repeated []int64 `protobuf:"zigzag64,203,rep,name=F_Sint64_repeated,json=FSint64Repeated" json:"F_Sint64_repeated,omitempty"` + // Optional fields of all basic types + F_BoolOptional *bool `protobuf:"varint,30,opt,name=F_Bool_optional,json=FBoolOptional" json:"F_Bool_optional,omitempty"` + F_Int32Optional *int32 `protobuf:"varint,31,opt,name=F_Int32_optional,json=FInt32Optional" json:"F_Int32_optional,omitempty"` + F_Int64Optional *int64 `protobuf:"varint,32,opt,name=F_Int64_optional,json=FInt64Optional" json:"F_Int64_optional,omitempty"` + F_Fixed32Optional *uint32 `protobuf:"fixed32,33,opt,name=F_Fixed32_optional,json=FFixed32Optional" json:"F_Fixed32_optional,omitempty"` + F_Fixed64Optional *uint64 `protobuf:"fixed64,34,opt,name=F_Fixed64_optional,json=FFixed64Optional" json:"F_Fixed64_optional,omitempty"` + F_Uint32Optional *uint32 `protobuf:"varint,35,opt,name=F_Uint32_optional,json=FUint32Optional" json:"F_Uint32_optional,omitempty"` + F_Uint64Optional *uint64 `protobuf:"varint,36,opt,name=F_Uint64_optional,json=FUint64Optional" json:"F_Uint64_optional,omitempty"` + F_FloatOptional *float32 `protobuf:"fixed32,37,opt,name=F_Float_optional,json=FFloatOptional" json:"F_Float_optional,omitempty"` + F_DoubleOptional *float64 `protobuf:"fixed64,38,opt,name=F_Double_optional,json=FDoubleOptional" json:"F_Double_optional,omitempty"` + F_StringOptional *string `protobuf:"bytes,39,opt,name=F_String_optional,json=FStringOptional" json:"F_String_optional,omitempty"` + F_BytesOptional []byte `protobuf:"bytes,301,opt,name=F_Bytes_optional,json=FBytesOptional" json:"F_Bytes_optional,omitempty"` + F_Sint32Optional *int32 `protobuf:"zigzag32,302,opt,name=F_Sint32_optional,json=FSint32Optional" json:"F_Sint32_optional,omitempty"` + F_Sint64Optional *int64 `protobuf:"zigzag64,303,opt,name=F_Sint64_optional,json=FSint64Optional" json:"F_Sint64_optional,omitempty"` + // Default-valued fields of all basic types + F_BoolDefaulted *bool `protobuf:"varint,40,opt,name=F_Bool_defaulted,json=FBoolDefaulted,def=1" json:"F_Bool_defaulted,omitempty"` + F_Int32Defaulted *int32 `protobuf:"varint,41,opt,name=F_Int32_defaulted,json=FInt32Defaulted,def=32" json:"F_Int32_defaulted,omitempty"` + F_Int64Defaulted *int64 `protobuf:"varint,42,opt,name=F_Int64_defaulted,json=FInt64Defaulted,def=64" json:"F_Int64_defaulted,omitempty"` + F_Fixed32Defaulted *uint32 `protobuf:"fixed32,43,opt,name=F_Fixed32_defaulted,json=FFixed32Defaulted,def=320" json:"F_Fixed32_defaulted,omitempty"` + F_Fixed64Defaulted *uint64 `protobuf:"fixed64,44,opt,name=F_Fixed64_defaulted,json=FFixed64Defaulted,def=640" json:"F_Fixed64_defaulted,omitempty"` + F_Uint32Defaulted *uint32 `protobuf:"varint,45,opt,name=F_Uint32_defaulted,json=FUint32Defaulted,def=3200" json:"F_Uint32_defaulted,omitempty"` + F_Uint64Defaulted *uint64 `protobuf:"varint,46,opt,name=F_Uint64_defaulted,json=FUint64Defaulted,def=6400" json:"F_Uint64_defaulted,omitempty"` + F_FloatDefaulted *float32 `protobuf:"fixed32,47,opt,name=F_Float_defaulted,json=FFloatDefaulted,def=314159" json:"F_Float_defaulted,omitempty"` + F_DoubleDefaulted *float64 `protobuf:"fixed64,48,opt,name=F_Double_defaulted,json=FDoubleDefaulted,def=271828" json:"F_Double_defaulted,omitempty"` + F_StringDefaulted *string `protobuf:"bytes,49,opt,name=F_String_defaulted,json=FStringDefaulted,def=hello, \"world!\"\n" json:"F_String_defaulted,omitempty"` + F_BytesDefaulted []byte `protobuf:"bytes,401,opt,name=F_Bytes_defaulted,json=FBytesDefaulted,def=Bignose" json:"F_Bytes_defaulted,omitempty"` + F_Sint32Defaulted *int32 `protobuf:"zigzag32,402,opt,name=F_Sint32_defaulted,json=FSint32Defaulted,def=-32" json:"F_Sint32_defaulted,omitempty"` + F_Sint64Defaulted *int64 `protobuf:"zigzag64,403,opt,name=F_Sint64_defaulted,json=FSint64Defaulted,def=-64" json:"F_Sint64_defaulted,omitempty"` + // Packed repeated fields (no string or bytes). + F_BoolRepeatedPacked []bool `protobuf:"varint,50,rep,packed,name=F_Bool_repeated_packed,json=FBoolRepeatedPacked" json:"F_Bool_repeated_packed,omitempty"` + F_Int32RepeatedPacked []int32 `protobuf:"varint,51,rep,packed,name=F_Int32_repeated_packed,json=FInt32RepeatedPacked" json:"F_Int32_repeated_packed,omitempty"` + F_Int64RepeatedPacked []int64 `protobuf:"varint,52,rep,packed,name=F_Int64_repeated_packed,json=FInt64RepeatedPacked" json:"F_Int64_repeated_packed,omitempty"` + F_Fixed32RepeatedPacked []uint32 `protobuf:"fixed32,53,rep,packed,name=F_Fixed32_repeated_packed,json=FFixed32RepeatedPacked" json:"F_Fixed32_repeated_packed,omitempty"` + F_Fixed64RepeatedPacked []uint64 `protobuf:"fixed64,54,rep,packed,name=F_Fixed64_repeated_packed,json=FFixed64RepeatedPacked" json:"F_Fixed64_repeated_packed,omitempty"` + F_Uint32RepeatedPacked []uint32 `protobuf:"varint,55,rep,packed,name=F_Uint32_repeated_packed,json=FUint32RepeatedPacked" json:"F_Uint32_repeated_packed,omitempty"` + F_Uint64RepeatedPacked []uint64 `protobuf:"varint,56,rep,packed,name=F_Uint64_repeated_packed,json=FUint64RepeatedPacked" json:"F_Uint64_repeated_packed,omitempty"` + F_FloatRepeatedPacked []float32 `protobuf:"fixed32,57,rep,packed,name=F_Float_repeated_packed,json=FFloatRepeatedPacked" json:"F_Float_repeated_packed,omitempty"` + F_DoubleRepeatedPacked []float64 `protobuf:"fixed64,58,rep,packed,name=F_Double_repeated_packed,json=FDoubleRepeatedPacked" json:"F_Double_repeated_packed,omitempty"` + F_Sint32RepeatedPacked []int32 `protobuf:"zigzag32,502,rep,packed,name=F_Sint32_repeated_packed,json=FSint32RepeatedPacked" json:"F_Sint32_repeated_packed,omitempty"` + F_Sint64RepeatedPacked []int64 `protobuf:"zigzag64,503,rep,packed,name=F_Sint64_repeated_packed,json=FSint64RepeatedPacked" json:"F_Sint64_repeated_packed,omitempty"` + Requiredgroup *GoTest_RequiredGroup `protobuf:"group,70,req,name=RequiredGroup,json=requiredgroup" json:"requiredgroup,omitempty"` + Repeatedgroup []*GoTest_RepeatedGroup `protobuf:"group,80,rep,name=RepeatedGroup,json=repeatedgroup" json:"repeatedgroup,omitempty"` + Optionalgroup *GoTest_OptionalGroup `protobuf:"group,90,opt,name=OptionalGroup,json=optionalgroup" json:"optionalgroup,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GoTest) Reset() { *m = GoTest{} } +func (m *GoTest) String() string { return proto.CompactTextString(m) } +func (*GoTest) ProtoMessage() {} +func (*GoTest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } + +const Default_GoTest_F_BoolDefaulted bool = true +const Default_GoTest_F_Int32Defaulted int32 = 32 +const Default_GoTest_F_Int64Defaulted int64 = 64 +const Default_GoTest_F_Fixed32Defaulted uint32 = 320 +const Default_GoTest_F_Fixed64Defaulted uint64 = 640 +const Default_GoTest_F_Uint32Defaulted uint32 = 3200 +const Default_GoTest_F_Uint64Defaulted uint64 = 6400 +const Default_GoTest_F_FloatDefaulted float32 = 314159 +const Default_GoTest_F_DoubleDefaulted float64 = 271828 +const Default_GoTest_F_StringDefaulted string = "hello, \"world!\"\n" + +var Default_GoTest_F_BytesDefaulted []byte = []byte("Bignose") + +const Default_GoTest_F_Sint32Defaulted int32 = -32 +const Default_GoTest_F_Sint64Defaulted int64 = -64 + +func (m *GoTest) GetKind() GoTest_KIND { + if m != nil && m.Kind != nil { + return *m.Kind + } + return GoTest_VOID +} + +func (m *GoTest) GetTable() string { + if m != nil && m.Table != nil { + return *m.Table + } + return "" +} + +func (m *GoTest) GetParam() int32 { + if m != nil && m.Param != nil { + return *m.Param + } + return 0 +} + +func (m *GoTest) GetRequiredField() *GoTestField { + if m != nil { + return m.RequiredField + } + return nil +} + +func (m *GoTest) GetRepeatedField() []*GoTestField { + if m != nil { + return m.RepeatedField + } + return nil +} + +func (m *GoTest) GetOptionalField() *GoTestField { + if m != nil { + return m.OptionalField + } + return nil +} + +func (m *GoTest) GetF_BoolRequired() bool { + if m != nil && m.F_BoolRequired != nil { + return *m.F_BoolRequired + } + return false +} + +func (m *GoTest) GetF_Int32Required() int32 { + if m != nil && m.F_Int32Required != nil { + return *m.F_Int32Required + } + return 0 +} + +func (m *GoTest) GetF_Int64Required() int64 { + if m != nil && m.F_Int64Required != nil { + return *m.F_Int64Required + } + return 0 +} + +func (m *GoTest) GetF_Fixed32Required() uint32 { + if m != nil && m.F_Fixed32Required != nil { + return *m.F_Fixed32Required + } + return 0 +} + +func (m *GoTest) GetF_Fixed64Required() uint64 { + if m != nil && m.F_Fixed64Required != nil { + return *m.F_Fixed64Required + } + return 0 +} + +func (m *GoTest) GetF_Uint32Required() uint32 { + if m != nil && m.F_Uint32Required != nil { + return *m.F_Uint32Required + } + return 0 +} + +func (m *GoTest) GetF_Uint64Required() uint64 { + if m != nil && m.F_Uint64Required != nil { + return *m.F_Uint64Required + } + return 0 +} + +func (m *GoTest) GetF_FloatRequired() float32 { + if m != nil && m.F_FloatRequired != nil { + return *m.F_FloatRequired + } + return 0 +} + +func (m *GoTest) GetF_DoubleRequired() float64 { + if m != nil && m.F_DoubleRequired != nil { + return *m.F_DoubleRequired + } + return 0 +} + +func (m *GoTest) GetF_StringRequired() string { + if m != nil && m.F_StringRequired != nil { + return *m.F_StringRequired + } + return "" +} + +func (m *GoTest) GetF_BytesRequired() []byte { + if m != nil { + return m.F_BytesRequired + } + return nil +} + +func (m *GoTest) GetF_Sint32Required() int32 { + if m != nil && m.F_Sint32Required != nil { + return *m.F_Sint32Required + } + return 0 +} + +func (m *GoTest) GetF_Sint64Required() int64 { + if m != nil && m.F_Sint64Required != nil { + return *m.F_Sint64Required + } + return 0 +} + +func (m *GoTest) GetF_BoolRepeated() []bool { + if m != nil { + return m.F_BoolRepeated + } + return nil +} + +func (m *GoTest) GetF_Int32Repeated() []int32 { + if m != nil { + return m.F_Int32Repeated + } + return nil +} + +func (m *GoTest) GetF_Int64Repeated() []int64 { + if m != nil { + return m.F_Int64Repeated + } + return nil +} + +func (m *GoTest) GetF_Fixed32Repeated() []uint32 { + if m != nil { + return m.F_Fixed32Repeated + } + return nil +} + +func (m *GoTest) GetF_Fixed64Repeated() []uint64 { + if m != nil { + return m.F_Fixed64Repeated + } + return nil +} + +func (m *GoTest) GetF_Uint32Repeated() []uint32 { + if m != nil { + return m.F_Uint32Repeated + } + return nil +} + +func (m *GoTest) GetF_Uint64Repeated() []uint64 { + if m != nil { + return m.F_Uint64Repeated + } + return nil +} + +func (m *GoTest) GetF_FloatRepeated() []float32 { + if m != nil { + return m.F_FloatRepeated + } + return nil +} + +func (m *GoTest) GetF_DoubleRepeated() []float64 { + if m != nil { + return m.F_DoubleRepeated + } + return nil +} + +func (m *GoTest) GetF_StringRepeated() []string { + if m != nil { + return m.F_StringRepeated + } + return nil +} + +func (m *GoTest) GetF_BytesRepeated() [][]byte { + if m != nil { + return m.F_BytesRepeated + } + return nil +} + +func (m *GoTest) GetF_Sint32Repeated() []int32 { + if m != nil { + return m.F_Sint32Repeated + } + return nil +} + +func (m *GoTest) GetF_Sint64Repeated() []int64 { + if m != nil { + return m.F_Sint64Repeated + } + return nil +} + +func (m *GoTest) GetF_BoolOptional() bool { + if m != nil && m.F_BoolOptional != nil { + return *m.F_BoolOptional + } + return false +} + +func (m *GoTest) GetF_Int32Optional() int32 { + if m != nil && m.F_Int32Optional != nil { + return *m.F_Int32Optional + } + return 0 +} + +func (m *GoTest) GetF_Int64Optional() int64 { + if m != nil && m.F_Int64Optional != nil { + return *m.F_Int64Optional + } + return 0 +} + +func (m *GoTest) GetF_Fixed32Optional() uint32 { + if m != nil && m.F_Fixed32Optional != nil { + return *m.F_Fixed32Optional + } + return 0 +} + +func (m *GoTest) GetF_Fixed64Optional() uint64 { + if m != nil && m.F_Fixed64Optional != nil { + return *m.F_Fixed64Optional + } + return 0 +} + +func (m *GoTest) GetF_Uint32Optional() uint32 { + if m != nil && m.F_Uint32Optional != nil { + return *m.F_Uint32Optional + } + return 0 +} + +func (m *GoTest) GetF_Uint64Optional() uint64 { + if m != nil && m.F_Uint64Optional != nil { + return *m.F_Uint64Optional + } + return 0 +} + +func (m *GoTest) GetF_FloatOptional() float32 { + if m != nil && m.F_FloatOptional != nil { + return *m.F_FloatOptional + } + return 0 +} + +func (m *GoTest) GetF_DoubleOptional() float64 { + if m != nil && m.F_DoubleOptional != nil { + return *m.F_DoubleOptional + } + return 0 +} + +func (m *GoTest) GetF_StringOptional() string { + if m != nil && m.F_StringOptional != nil { + return *m.F_StringOptional + } + return "" +} + +func (m *GoTest) GetF_BytesOptional() []byte { + if m != nil { + return m.F_BytesOptional + } + return nil +} + +func (m *GoTest) GetF_Sint32Optional() int32 { + if m != nil && m.F_Sint32Optional != nil { + return *m.F_Sint32Optional + } + return 0 +} + +func (m *GoTest) GetF_Sint64Optional() int64 { + if m != nil && m.F_Sint64Optional != nil { + return *m.F_Sint64Optional + } + return 0 +} + +func (m *GoTest) GetF_BoolDefaulted() bool { + if m != nil && m.F_BoolDefaulted != nil { + return *m.F_BoolDefaulted + } + return Default_GoTest_F_BoolDefaulted +} + +func (m *GoTest) GetF_Int32Defaulted() int32 { + if m != nil && m.F_Int32Defaulted != nil { + return *m.F_Int32Defaulted + } + return Default_GoTest_F_Int32Defaulted +} + +func (m *GoTest) GetF_Int64Defaulted() int64 { + if m != nil && m.F_Int64Defaulted != nil { + return *m.F_Int64Defaulted + } + return Default_GoTest_F_Int64Defaulted +} + +func (m *GoTest) GetF_Fixed32Defaulted() uint32 { + if m != nil && m.F_Fixed32Defaulted != nil { + return *m.F_Fixed32Defaulted + } + return Default_GoTest_F_Fixed32Defaulted +} + +func (m *GoTest) GetF_Fixed64Defaulted() uint64 { + if m != nil && m.F_Fixed64Defaulted != nil { + return *m.F_Fixed64Defaulted + } + return Default_GoTest_F_Fixed64Defaulted +} + +func (m *GoTest) GetF_Uint32Defaulted() uint32 { + if m != nil && m.F_Uint32Defaulted != nil { + return *m.F_Uint32Defaulted + } + return Default_GoTest_F_Uint32Defaulted +} + +func (m *GoTest) GetF_Uint64Defaulted() uint64 { + if m != nil && m.F_Uint64Defaulted != nil { + return *m.F_Uint64Defaulted + } + return Default_GoTest_F_Uint64Defaulted +} + +func (m *GoTest) GetF_FloatDefaulted() float32 { + if m != nil && m.F_FloatDefaulted != nil { + return *m.F_FloatDefaulted + } + return Default_GoTest_F_FloatDefaulted +} + +func (m *GoTest) GetF_DoubleDefaulted() float64 { + if m != nil && m.F_DoubleDefaulted != nil { + return *m.F_DoubleDefaulted + } + return Default_GoTest_F_DoubleDefaulted +} + +func (m *GoTest) GetF_StringDefaulted() string { + if m != nil && m.F_StringDefaulted != nil { + return *m.F_StringDefaulted + } + return Default_GoTest_F_StringDefaulted +} + +func (m *GoTest) GetF_BytesDefaulted() []byte { + if m != nil && m.F_BytesDefaulted != nil { + return m.F_BytesDefaulted + } + return append([]byte(nil), Default_GoTest_F_BytesDefaulted...) +} + +func (m *GoTest) GetF_Sint32Defaulted() int32 { + if m != nil && m.F_Sint32Defaulted != nil { + return *m.F_Sint32Defaulted + } + return Default_GoTest_F_Sint32Defaulted +} + +func (m *GoTest) GetF_Sint64Defaulted() int64 { + if m != nil && m.F_Sint64Defaulted != nil { + return *m.F_Sint64Defaulted + } + return Default_GoTest_F_Sint64Defaulted +} + +func (m *GoTest) GetF_BoolRepeatedPacked() []bool { + if m != nil { + return m.F_BoolRepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_Int32RepeatedPacked() []int32 { + if m != nil { + return m.F_Int32RepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_Int64RepeatedPacked() []int64 { + if m != nil { + return m.F_Int64RepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_Fixed32RepeatedPacked() []uint32 { + if m != nil { + return m.F_Fixed32RepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_Fixed64RepeatedPacked() []uint64 { + if m != nil { + return m.F_Fixed64RepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_Uint32RepeatedPacked() []uint32 { + if m != nil { + return m.F_Uint32RepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_Uint64RepeatedPacked() []uint64 { + if m != nil { + return m.F_Uint64RepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_FloatRepeatedPacked() []float32 { + if m != nil { + return m.F_FloatRepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_DoubleRepeatedPacked() []float64 { + if m != nil { + return m.F_DoubleRepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_Sint32RepeatedPacked() []int32 { + if m != nil { + return m.F_Sint32RepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_Sint64RepeatedPacked() []int64 { + if m != nil { + return m.F_Sint64RepeatedPacked + } + return nil +} + +func (m *GoTest) GetRequiredgroup() *GoTest_RequiredGroup { + if m != nil { + return m.Requiredgroup + } + return nil +} + +func (m *GoTest) GetRepeatedgroup() []*GoTest_RepeatedGroup { + if m != nil { + return m.Repeatedgroup + } + return nil +} + +func (m *GoTest) GetOptionalgroup() *GoTest_OptionalGroup { + if m != nil { + return m.Optionalgroup + } + return nil +} + +// Required, repeated, and optional groups. +type GoTest_RequiredGroup struct { + RequiredField *string `protobuf:"bytes,71,req,name=RequiredField" json:"RequiredField,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GoTest_RequiredGroup) Reset() { *m = GoTest_RequiredGroup{} } +func (m *GoTest_RequiredGroup) String() string { return proto.CompactTextString(m) } +func (*GoTest_RequiredGroup) ProtoMessage() {} +func (*GoTest_RequiredGroup) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2, 0} } + +func (m *GoTest_RequiredGroup) GetRequiredField() string { + if m != nil && m.RequiredField != nil { + return *m.RequiredField + } + return "" +} + +type GoTest_RepeatedGroup struct { + RequiredField *string `protobuf:"bytes,81,req,name=RequiredField" json:"RequiredField,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GoTest_RepeatedGroup) Reset() { *m = GoTest_RepeatedGroup{} } +func (m *GoTest_RepeatedGroup) String() string { return proto.CompactTextString(m) } +func (*GoTest_RepeatedGroup) ProtoMessage() {} +func (*GoTest_RepeatedGroup) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2, 1} } + +func (m *GoTest_RepeatedGroup) GetRequiredField() string { + if m != nil && m.RequiredField != nil { + return *m.RequiredField + } + return "" +} + +type GoTest_OptionalGroup struct { + RequiredField *string `protobuf:"bytes,91,req,name=RequiredField" json:"RequiredField,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GoTest_OptionalGroup) Reset() { *m = GoTest_OptionalGroup{} } +func (m *GoTest_OptionalGroup) String() string { return proto.CompactTextString(m) } +func (*GoTest_OptionalGroup) ProtoMessage() {} +func (*GoTest_OptionalGroup) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2, 2} } + +func (m *GoTest_OptionalGroup) GetRequiredField() string { + if m != nil && m.RequiredField != nil { + return *m.RequiredField + } + return "" +} + +// For testing a group containing a required field. +type GoTestRequiredGroupField struct { + Group *GoTestRequiredGroupField_Group `protobuf:"group,1,req,name=Group,json=group" json:"group,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GoTestRequiredGroupField) Reset() { *m = GoTestRequiredGroupField{} } +func (m *GoTestRequiredGroupField) String() string { return proto.CompactTextString(m) } +func (*GoTestRequiredGroupField) ProtoMessage() {} +func (*GoTestRequiredGroupField) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } + +func (m *GoTestRequiredGroupField) GetGroup() *GoTestRequiredGroupField_Group { + if m != nil { + return m.Group + } + return nil +} + +type GoTestRequiredGroupField_Group struct { + Field *int32 `protobuf:"varint,2,req,name=Field" json:"Field,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GoTestRequiredGroupField_Group) Reset() { *m = GoTestRequiredGroupField_Group{} } +func (m *GoTestRequiredGroupField_Group) String() string { return proto.CompactTextString(m) } +func (*GoTestRequiredGroupField_Group) ProtoMessage() {} +func (*GoTestRequiredGroupField_Group) Descriptor() ([]byte, []int) { + return fileDescriptor0, []int{3, 0} +} + +func (m *GoTestRequiredGroupField_Group) GetField() int32 { + if m != nil && m.Field != nil { + return *m.Field + } + return 0 +} + +// For testing skipping of unrecognized fields. +// Numbers are all big, larger than tag numbers in GoTestField, +// the message used in the corresponding test. +type GoSkipTest struct { + SkipInt32 *int32 `protobuf:"varint,11,req,name=skip_int32,json=skipInt32" json:"skip_int32,omitempty"` + SkipFixed32 *uint32 `protobuf:"fixed32,12,req,name=skip_fixed32,json=skipFixed32" json:"skip_fixed32,omitempty"` + SkipFixed64 *uint64 `protobuf:"fixed64,13,req,name=skip_fixed64,json=skipFixed64" json:"skip_fixed64,omitempty"` + SkipString *string `protobuf:"bytes,14,req,name=skip_string,json=skipString" json:"skip_string,omitempty"` + Skipgroup *GoSkipTest_SkipGroup `protobuf:"group,15,req,name=SkipGroup,json=skipgroup" json:"skipgroup,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GoSkipTest) Reset() { *m = GoSkipTest{} } +func (m *GoSkipTest) String() string { return proto.CompactTextString(m) } +func (*GoSkipTest) ProtoMessage() {} +func (*GoSkipTest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } + +func (m *GoSkipTest) GetSkipInt32() int32 { + if m != nil && m.SkipInt32 != nil { + return *m.SkipInt32 + } + return 0 +} + +func (m *GoSkipTest) GetSkipFixed32() uint32 { + if m != nil && m.SkipFixed32 != nil { + return *m.SkipFixed32 + } + return 0 +} + +func (m *GoSkipTest) GetSkipFixed64() uint64 { + if m != nil && m.SkipFixed64 != nil { + return *m.SkipFixed64 + } + return 0 +} + +func (m *GoSkipTest) GetSkipString() string { + if m != nil && m.SkipString != nil { + return *m.SkipString + } + return "" +} + +func (m *GoSkipTest) GetSkipgroup() *GoSkipTest_SkipGroup { + if m != nil { + return m.Skipgroup + } + return nil +} + +type GoSkipTest_SkipGroup struct { + GroupInt32 *int32 `protobuf:"varint,16,req,name=group_int32,json=groupInt32" json:"group_int32,omitempty"` + GroupString *string `protobuf:"bytes,17,req,name=group_string,json=groupString" json:"group_string,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GoSkipTest_SkipGroup) Reset() { *m = GoSkipTest_SkipGroup{} } +func (m *GoSkipTest_SkipGroup) String() string { return proto.CompactTextString(m) } +func (*GoSkipTest_SkipGroup) ProtoMessage() {} +func (*GoSkipTest_SkipGroup) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4, 0} } + +func (m *GoSkipTest_SkipGroup) GetGroupInt32() int32 { + if m != nil && m.GroupInt32 != nil { + return *m.GroupInt32 + } + return 0 +} + +func (m *GoSkipTest_SkipGroup) GetGroupString() string { + if m != nil && m.GroupString != nil { + return *m.GroupString + } + return "" +} + +// For testing packed/non-packed decoder switching. +// A serialized instance of one should be deserializable as the other. +type NonPackedTest struct { + A []int32 `protobuf:"varint,1,rep,name=a" json:"a,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *NonPackedTest) Reset() { *m = NonPackedTest{} } +func (m *NonPackedTest) String() string { return proto.CompactTextString(m) } +func (*NonPackedTest) ProtoMessage() {} +func (*NonPackedTest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } + +func (m *NonPackedTest) GetA() []int32 { + if m != nil { + return m.A + } + return nil +} + +type PackedTest struct { + B []int32 `protobuf:"varint,1,rep,packed,name=b" json:"b,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *PackedTest) Reset() { *m = PackedTest{} } +func (m *PackedTest) String() string { return proto.CompactTextString(m) } +func (*PackedTest) ProtoMessage() {} +func (*PackedTest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } + +func (m *PackedTest) GetB() []int32 { + if m != nil { + return m.B + } + return nil +} + +type MaxTag struct { + // Maximum possible tag number. + LastField *string `protobuf:"bytes,536870911,opt,name=last_field,json=lastField" json:"last_field,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *MaxTag) Reset() { *m = MaxTag{} } +func (m *MaxTag) String() string { return proto.CompactTextString(m) } +func (*MaxTag) ProtoMessage() {} +func (*MaxTag) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } + +func (m *MaxTag) GetLastField() string { + if m != nil && m.LastField != nil { + return *m.LastField + } + return "" +} + +type OldMessage struct { + Nested *OldMessage_Nested `protobuf:"bytes,1,opt,name=nested" json:"nested,omitempty"` + Num *int32 `protobuf:"varint,2,opt,name=num" json:"num,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *OldMessage) Reset() { *m = OldMessage{} } +func (m *OldMessage) String() string { return proto.CompactTextString(m) } +func (*OldMessage) ProtoMessage() {} +func (*OldMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } + +func (m *OldMessage) GetNested() *OldMessage_Nested { + if m != nil { + return m.Nested + } + return nil +} + +func (m *OldMessage) GetNum() int32 { + if m != nil && m.Num != nil { + return *m.Num + } + return 0 +} + +type OldMessage_Nested struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *OldMessage_Nested) Reset() { *m = OldMessage_Nested{} } +func (m *OldMessage_Nested) String() string { return proto.CompactTextString(m) } +func (*OldMessage_Nested) ProtoMessage() {} +func (*OldMessage_Nested) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8, 0} } + +func (m *OldMessage_Nested) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +// NewMessage is wire compatible with OldMessage; +// imagine it as a future version. +type NewMessage struct { + Nested *NewMessage_Nested `protobuf:"bytes,1,opt,name=nested" json:"nested,omitempty"` + // This is an int32 in OldMessage. + Num *int64 `protobuf:"varint,2,opt,name=num" json:"num,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *NewMessage) Reset() { *m = NewMessage{} } +func (m *NewMessage) String() string { return proto.CompactTextString(m) } +func (*NewMessage) ProtoMessage() {} +func (*NewMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} } + +func (m *NewMessage) GetNested() *NewMessage_Nested { + if m != nil { + return m.Nested + } + return nil +} + +func (m *NewMessage) GetNum() int64 { + if m != nil && m.Num != nil { + return *m.Num + } + return 0 +} + +type NewMessage_Nested struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + FoodGroup *string `protobuf:"bytes,2,opt,name=food_group,json=foodGroup" json:"food_group,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *NewMessage_Nested) Reset() { *m = NewMessage_Nested{} } +func (m *NewMessage_Nested) String() string { return proto.CompactTextString(m) } +func (*NewMessage_Nested) ProtoMessage() {} +func (*NewMessage_Nested) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9, 0} } + +func (m *NewMessage_Nested) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *NewMessage_Nested) GetFoodGroup() string { + if m != nil && m.FoodGroup != nil { + return *m.FoodGroup + } + return "" +} + +type InnerMessage struct { + Host *string `protobuf:"bytes,1,req,name=host" json:"host,omitempty"` + Port *int32 `protobuf:"varint,2,opt,name=port,def=4000" json:"port,omitempty"` + Connected *bool `protobuf:"varint,3,opt,name=connected" json:"connected,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *InnerMessage) Reset() { *m = InnerMessage{} } +func (m *InnerMessage) String() string { return proto.CompactTextString(m) } +func (*InnerMessage) ProtoMessage() {} +func (*InnerMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} } + +const Default_InnerMessage_Port int32 = 4000 + +func (m *InnerMessage) GetHost() string { + if m != nil && m.Host != nil { + return *m.Host + } + return "" +} + +func (m *InnerMessage) GetPort() int32 { + if m != nil && m.Port != nil { + return *m.Port + } + return Default_InnerMessage_Port +} + +func (m *InnerMessage) GetConnected() bool { + if m != nil && m.Connected != nil { + return *m.Connected + } + return false +} + +type OtherMessage struct { + Key *int64 `protobuf:"varint,1,opt,name=key" json:"key,omitempty"` + Value []byte `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` + Weight *float32 `protobuf:"fixed32,3,opt,name=weight" json:"weight,omitempty"` + Inner *InnerMessage `protobuf:"bytes,4,opt,name=inner" json:"inner,omitempty"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *OtherMessage) Reset() { *m = OtherMessage{} } +func (m *OtherMessage) String() string { return proto.CompactTextString(m) } +func (*OtherMessage) ProtoMessage() {} +func (*OtherMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} } + +var extRange_OtherMessage = []proto.ExtensionRange{ + {100, 536870911}, +} + +func (*OtherMessage) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_OtherMessage +} + +func (m *OtherMessage) GetKey() int64 { + if m != nil && m.Key != nil { + return *m.Key + } + return 0 +} + +func (m *OtherMessage) GetValue() []byte { + if m != nil { + return m.Value + } + return nil +} + +func (m *OtherMessage) GetWeight() float32 { + if m != nil && m.Weight != nil { + return *m.Weight + } + return 0 +} + +func (m *OtherMessage) GetInner() *InnerMessage { + if m != nil { + return m.Inner + } + return nil +} + +type RequiredInnerMessage struct { + LeoFinallyWonAnOscar *InnerMessage `protobuf:"bytes,1,req,name=leo_finally_won_an_oscar,json=leoFinallyWonAnOscar" json:"leo_finally_won_an_oscar,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *RequiredInnerMessage) Reset() { *m = RequiredInnerMessage{} } +func (m *RequiredInnerMessage) String() string { return proto.CompactTextString(m) } +func (*RequiredInnerMessage) ProtoMessage() {} +func (*RequiredInnerMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} } + +func (m *RequiredInnerMessage) GetLeoFinallyWonAnOscar() *InnerMessage { + if m != nil { + return m.LeoFinallyWonAnOscar + } + return nil +} + +type MyMessage struct { + Count *int32 `protobuf:"varint,1,req,name=count" json:"count,omitempty"` + Name *string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"` + Quote *string `protobuf:"bytes,3,opt,name=quote" json:"quote,omitempty"` + Pet []string `protobuf:"bytes,4,rep,name=pet" json:"pet,omitempty"` + Inner *InnerMessage `protobuf:"bytes,5,opt,name=inner" json:"inner,omitempty"` + Others []*OtherMessage `protobuf:"bytes,6,rep,name=others" json:"others,omitempty"` + WeMustGoDeeper *RequiredInnerMessage `protobuf:"bytes,13,opt,name=we_must_go_deeper,json=weMustGoDeeper" json:"we_must_go_deeper,omitempty"` + RepInner []*InnerMessage `protobuf:"bytes,12,rep,name=rep_inner,json=repInner" json:"rep_inner,omitempty"` + Bikeshed *MyMessage_Color `protobuf:"varint,7,opt,name=bikeshed,enum=testdata.MyMessage_Color" json:"bikeshed,omitempty"` + Somegroup *MyMessage_SomeGroup `protobuf:"group,8,opt,name=SomeGroup,json=somegroup" json:"somegroup,omitempty"` + // This field becomes [][]byte in the generated code. + RepBytes [][]byte `protobuf:"bytes,10,rep,name=rep_bytes,json=repBytes" json:"rep_bytes,omitempty"` + Bigfloat *float64 `protobuf:"fixed64,11,opt,name=bigfloat" json:"bigfloat,omitempty"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *MyMessage) Reset() { *m = MyMessage{} } +func (m *MyMessage) String() string { return proto.CompactTextString(m) } +func (*MyMessage) ProtoMessage() {} +func (*MyMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} } + +var extRange_MyMessage = []proto.ExtensionRange{ + {100, 536870911}, +} + +func (*MyMessage) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_MyMessage +} + +func (m *MyMessage) GetCount() int32 { + if m != nil && m.Count != nil { + return *m.Count + } + return 0 +} + +func (m *MyMessage) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *MyMessage) GetQuote() string { + if m != nil && m.Quote != nil { + return *m.Quote + } + return "" +} + +func (m *MyMessage) GetPet() []string { + if m != nil { + return m.Pet + } + return nil +} + +func (m *MyMessage) GetInner() *InnerMessage { + if m != nil { + return m.Inner + } + return nil +} + +func (m *MyMessage) GetOthers() []*OtherMessage { + if m != nil { + return m.Others + } + return nil +} + +func (m *MyMessage) GetWeMustGoDeeper() *RequiredInnerMessage { + if m != nil { + return m.WeMustGoDeeper + } + return nil +} + +func (m *MyMessage) GetRepInner() []*InnerMessage { + if m != nil { + return m.RepInner + } + return nil +} + +func (m *MyMessage) GetBikeshed() MyMessage_Color { + if m != nil && m.Bikeshed != nil { + return *m.Bikeshed + } + return MyMessage_RED +} + +func (m *MyMessage) GetSomegroup() *MyMessage_SomeGroup { + if m != nil { + return m.Somegroup + } + return nil +} + +func (m *MyMessage) GetRepBytes() [][]byte { + if m != nil { + return m.RepBytes + } + return nil +} + +func (m *MyMessage) GetBigfloat() float64 { + if m != nil && m.Bigfloat != nil { + return *m.Bigfloat + } + return 0 +} + +type MyMessage_SomeGroup struct { + GroupField *int32 `protobuf:"varint,9,opt,name=group_field,json=groupField" json:"group_field,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *MyMessage_SomeGroup) Reset() { *m = MyMessage_SomeGroup{} } +func (m *MyMessage_SomeGroup) String() string { return proto.CompactTextString(m) } +func (*MyMessage_SomeGroup) ProtoMessage() {} +func (*MyMessage_SomeGroup) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13, 0} } + +func (m *MyMessage_SomeGroup) GetGroupField() int32 { + if m != nil && m.GroupField != nil { + return *m.GroupField + } + return 0 +} + +type Ext struct { + Data *string `protobuf:"bytes,1,opt,name=data" json:"data,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Ext) Reset() { *m = Ext{} } +func (m *Ext) String() string { return proto.CompactTextString(m) } +func (*Ext) ProtoMessage() {} +func (*Ext) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} } + +func (m *Ext) GetData() string { + if m != nil && m.Data != nil { + return *m.Data + } + return "" +} + +var E_Ext_More = &proto.ExtensionDesc{ + ExtendedType: (*MyMessage)(nil), + ExtensionType: (*Ext)(nil), + Field: 103, + Name: "testdata.Ext.more", + Tag: "bytes,103,opt,name=more", + Filename: "test.proto", +} + +var E_Ext_Text = &proto.ExtensionDesc{ + ExtendedType: (*MyMessage)(nil), + ExtensionType: (*string)(nil), + Field: 104, + Name: "testdata.Ext.text", + Tag: "bytes,104,opt,name=text", + Filename: "test.proto", +} + +var E_Ext_Number = &proto.ExtensionDesc{ + ExtendedType: (*MyMessage)(nil), + ExtensionType: (*int32)(nil), + Field: 105, + Name: "testdata.Ext.number", + Tag: "varint,105,opt,name=number", + Filename: "test.proto", +} + +type ComplexExtension struct { + First *int32 `protobuf:"varint,1,opt,name=first" json:"first,omitempty"` + Second *int32 `protobuf:"varint,2,opt,name=second" json:"second,omitempty"` + Third []int32 `protobuf:"varint,3,rep,name=third" json:"third,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *ComplexExtension) Reset() { *m = ComplexExtension{} } +func (m *ComplexExtension) String() string { return proto.CompactTextString(m) } +func (*ComplexExtension) ProtoMessage() {} +func (*ComplexExtension) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} } + +func (m *ComplexExtension) GetFirst() int32 { + if m != nil && m.First != nil { + return *m.First + } + return 0 +} + +func (m *ComplexExtension) GetSecond() int32 { + if m != nil && m.Second != nil { + return *m.Second + } + return 0 +} + +func (m *ComplexExtension) GetThird() []int32 { + if m != nil { + return m.Third + } + return nil +} + +type DefaultsMessage struct { + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *DefaultsMessage) Reset() { *m = DefaultsMessage{} } +func (m *DefaultsMessage) String() string { return proto.CompactTextString(m) } +func (*DefaultsMessage) ProtoMessage() {} +func (*DefaultsMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} } + +var extRange_DefaultsMessage = []proto.ExtensionRange{ + {100, 536870911}, +} + +func (*DefaultsMessage) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_DefaultsMessage +} + +type MyMessageSet struct { + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *MyMessageSet) Reset() { *m = MyMessageSet{} } +func (m *MyMessageSet) String() string { return proto.CompactTextString(m) } +func (*MyMessageSet) ProtoMessage() {} +func (*MyMessageSet) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} } + +func (m *MyMessageSet) Marshal() ([]byte, error) { + return proto.MarshalMessageSet(&m.XXX_InternalExtensions) +} +func (m *MyMessageSet) Unmarshal(buf []byte) error { + return proto.UnmarshalMessageSet(buf, &m.XXX_InternalExtensions) +} +func (m *MyMessageSet) MarshalJSON() ([]byte, error) { + return proto.MarshalMessageSetJSON(&m.XXX_InternalExtensions) +} +func (m *MyMessageSet) UnmarshalJSON(buf []byte) error { + return proto.UnmarshalMessageSetJSON(buf, &m.XXX_InternalExtensions) +} + +// ensure MyMessageSet satisfies proto.Marshaler and proto.Unmarshaler +var _ proto.Marshaler = (*MyMessageSet)(nil) +var _ proto.Unmarshaler = (*MyMessageSet)(nil) + +var extRange_MyMessageSet = []proto.ExtensionRange{ + {100, 2147483646}, +} + +func (*MyMessageSet) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_MyMessageSet +} + +type Empty struct { + XXX_unrecognized []byte `json:"-"` +} + +func (m *Empty) Reset() { *m = Empty{} } +func (m *Empty) String() string { return proto.CompactTextString(m) } +func (*Empty) ProtoMessage() {} +func (*Empty) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} } + +type MessageList struct { + Message []*MessageList_Message `protobuf:"group,1,rep,name=Message,json=message" json:"message,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *MessageList) Reset() { *m = MessageList{} } +func (m *MessageList) String() string { return proto.CompactTextString(m) } +func (*MessageList) ProtoMessage() {} +func (*MessageList) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} } + +func (m *MessageList) GetMessage() []*MessageList_Message { + if m != nil { + return m.Message + } + return nil +} + +type MessageList_Message struct { + Name *string `protobuf:"bytes,2,req,name=name" json:"name,omitempty"` + Count *int32 `protobuf:"varint,3,req,name=count" json:"count,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *MessageList_Message) Reset() { *m = MessageList_Message{} } +func (m *MessageList_Message) String() string { return proto.CompactTextString(m) } +func (*MessageList_Message) ProtoMessage() {} +func (*MessageList_Message) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19, 0} } + +func (m *MessageList_Message) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *MessageList_Message) GetCount() int32 { + if m != nil && m.Count != nil { + return *m.Count + } + return 0 +} + +type Strings struct { + StringField *string `protobuf:"bytes,1,opt,name=string_field,json=stringField" json:"string_field,omitempty"` + BytesField []byte `protobuf:"bytes,2,opt,name=bytes_field,json=bytesField" json:"bytes_field,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Strings) Reset() { *m = Strings{} } +func (m *Strings) String() string { return proto.CompactTextString(m) } +func (*Strings) ProtoMessage() {} +func (*Strings) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} } + +func (m *Strings) GetStringField() string { + if m != nil && m.StringField != nil { + return *m.StringField + } + return "" +} + +func (m *Strings) GetBytesField() []byte { + if m != nil { + return m.BytesField + } + return nil +} + +type Defaults struct { + // Default-valued fields of all basic types. + // Same as GoTest, but copied here to make testing easier. + F_Bool *bool `protobuf:"varint,1,opt,name=F_Bool,json=FBool,def=1" json:"F_Bool,omitempty"` + F_Int32 *int32 `protobuf:"varint,2,opt,name=F_Int32,json=FInt32,def=32" json:"F_Int32,omitempty"` + F_Int64 *int64 `protobuf:"varint,3,opt,name=F_Int64,json=FInt64,def=64" json:"F_Int64,omitempty"` + F_Fixed32 *uint32 `protobuf:"fixed32,4,opt,name=F_Fixed32,json=FFixed32,def=320" json:"F_Fixed32,omitempty"` + F_Fixed64 *uint64 `protobuf:"fixed64,5,opt,name=F_Fixed64,json=FFixed64,def=640" json:"F_Fixed64,omitempty"` + F_Uint32 *uint32 `protobuf:"varint,6,opt,name=F_Uint32,json=FUint32,def=3200" json:"F_Uint32,omitempty"` + F_Uint64 *uint64 `protobuf:"varint,7,opt,name=F_Uint64,json=FUint64,def=6400" json:"F_Uint64,omitempty"` + F_Float *float32 `protobuf:"fixed32,8,opt,name=F_Float,json=FFloat,def=314159" json:"F_Float,omitempty"` + F_Double *float64 `protobuf:"fixed64,9,opt,name=F_Double,json=FDouble,def=271828" json:"F_Double,omitempty"` + F_String *string `protobuf:"bytes,10,opt,name=F_String,json=FString,def=hello, \"world!\"\n" json:"F_String,omitempty"` + F_Bytes []byte `protobuf:"bytes,11,opt,name=F_Bytes,json=FBytes,def=Bignose" json:"F_Bytes,omitempty"` + F_Sint32 *int32 `protobuf:"zigzag32,12,opt,name=F_Sint32,json=FSint32,def=-32" json:"F_Sint32,omitempty"` + F_Sint64 *int64 `protobuf:"zigzag64,13,opt,name=F_Sint64,json=FSint64,def=-64" json:"F_Sint64,omitempty"` + F_Enum *Defaults_Color `protobuf:"varint,14,opt,name=F_Enum,json=FEnum,enum=testdata.Defaults_Color,def=1" json:"F_Enum,omitempty"` + // More fields with crazy defaults. + F_Pinf *float32 `protobuf:"fixed32,15,opt,name=F_Pinf,json=FPinf,def=inf" json:"F_Pinf,omitempty"` + F_Ninf *float32 `protobuf:"fixed32,16,opt,name=F_Ninf,json=FNinf,def=-inf" json:"F_Ninf,omitempty"` + F_Nan *float32 `protobuf:"fixed32,17,opt,name=F_Nan,json=FNan,def=nan" json:"F_Nan,omitempty"` + // Sub-message. + Sub *SubDefaults `protobuf:"bytes,18,opt,name=sub" json:"sub,omitempty"` + // Redundant but explicit defaults. + StrZero *string `protobuf:"bytes,19,opt,name=str_zero,json=strZero,def=" json:"str_zero,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Defaults) Reset() { *m = Defaults{} } +func (m *Defaults) String() string { return proto.CompactTextString(m) } +func (*Defaults) ProtoMessage() {} +func (*Defaults) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} } + +const Default_Defaults_F_Bool bool = true +const Default_Defaults_F_Int32 int32 = 32 +const Default_Defaults_F_Int64 int64 = 64 +const Default_Defaults_F_Fixed32 uint32 = 320 +const Default_Defaults_F_Fixed64 uint64 = 640 +const Default_Defaults_F_Uint32 uint32 = 3200 +const Default_Defaults_F_Uint64 uint64 = 6400 +const Default_Defaults_F_Float float32 = 314159 +const Default_Defaults_F_Double float64 = 271828 +const Default_Defaults_F_String string = "hello, \"world!\"\n" + +var Default_Defaults_F_Bytes []byte = []byte("Bignose") + +const Default_Defaults_F_Sint32 int32 = -32 +const Default_Defaults_F_Sint64 int64 = -64 +const Default_Defaults_F_Enum Defaults_Color = Defaults_GREEN + +var Default_Defaults_F_Pinf float32 = float32(math.Inf(1)) +var Default_Defaults_F_Ninf float32 = float32(math.Inf(-1)) +var Default_Defaults_F_Nan float32 = float32(math.NaN()) + +func (m *Defaults) GetF_Bool() bool { + if m != nil && m.F_Bool != nil { + return *m.F_Bool + } + return Default_Defaults_F_Bool +} + +func (m *Defaults) GetF_Int32() int32 { + if m != nil && m.F_Int32 != nil { + return *m.F_Int32 + } + return Default_Defaults_F_Int32 +} + +func (m *Defaults) GetF_Int64() int64 { + if m != nil && m.F_Int64 != nil { + return *m.F_Int64 + } + return Default_Defaults_F_Int64 +} + +func (m *Defaults) GetF_Fixed32() uint32 { + if m != nil && m.F_Fixed32 != nil { + return *m.F_Fixed32 + } + return Default_Defaults_F_Fixed32 +} + +func (m *Defaults) GetF_Fixed64() uint64 { + if m != nil && m.F_Fixed64 != nil { + return *m.F_Fixed64 + } + return Default_Defaults_F_Fixed64 +} + +func (m *Defaults) GetF_Uint32() uint32 { + if m != nil && m.F_Uint32 != nil { + return *m.F_Uint32 + } + return Default_Defaults_F_Uint32 +} + +func (m *Defaults) GetF_Uint64() uint64 { + if m != nil && m.F_Uint64 != nil { + return *m.F_Uint64 + } + return Default_Defaults_F_Uint64 +} + +func (m *Defaults) GetF_Float() float32 { + if m != nil && m.F_Float != nil { + return *m.F_Float + } + return Default_Defaults_F_Float +} + +func (m *Defaults) GetF_Double() float64 { + if m != nil && m.F_Double != nil { + return *m.F_Double + } + return Default_Defaults_F_Double +} + +func (m *Defaults) GetF_String() string { + if m != nil && m.F_String != nil { + return *m.F_String + } + return Default_Defaults_F_String +} + +func (m *Defaults) GetF_Bytes() []byte { + if m != nil && m.F_Bytes != nil { + return m.F_Bytes + } + return append([]byte(nil), Default_Defaults_F_Bytes...) +} + +func (m *Defaults) GetF_Sint32() int32 { + if m != nil && m.F_Sint32 != nil { + return *m.F_Sint32 + } + return Default_Defaults_F_Sint32 +} + +func (m *Defaults) GetF_Sint64() int64 { + if m != nil && m.F_Sint64 != nil { + return *m.F_Sint64 + } + return Default_Defaults_F_Sint64 +} + +func (m *Defaults) GetF_Enum() Defaults_Color { + if m != nil && m.F_Enum != nil { + return *m.F_Enum + } + return Default_Defaults_F_Enum +} + +func (m *Defaults) GetF_Pinf() float32 { + if m != nil && m.F_Pinf != nil { + return *m.F_Pinf + } + return Default_Defaults_F_Pinf +} + +func (m *Defaults) GetF_Ninf() float32 { + if m != nil && m.F_Ninf != nil { + return *m.F_Ninf + } + return Default_Defaults_F_Ninf +} + +func (m *Defaults) GetF_Nan() float32 { + if m != nil && m.F_Nan != nil { + return *m.F_Nan + } + return Default_Defaults_F_Nan +} + +func (m *Defaults) GetSub() *SubDefaults { + if m != nil { + return m.Sub + } + return nil +} + +func (m *Defaults) GetStrZero() string { + if m != nil && m.StrZero != nil { + return *m.StrZero + } + return "" +} + +type SubDefaults struct { + N *int64 `protobuf:"varint,1,opt,name=n,def=7" json:"n,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *SubDefaults) Reset() { *m = SubDefaults{} } +func (m *SubDefaults) String() string { return proto.CompactTextString(m) } +func (*SubDefaults) ProtoMessage() {} +func (*SubDefaults) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22} } + +const Default_SubDefaults_N int64 = 7 + +func (m *SubDefaults) GetN() int64 { + if m != nil && m.N != nil { + return *m.N + } + return Default_SubDefaults_N +} + +type RepeatedEnum struct { + Color []RepeatedEnum_Color `protobuf:"varint,1,rep,name=color,enum=testdata.RepeatedEnum_Color" json:"color,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *RepeatedEnum) Reset() { *m = RepeatedEnum{} } +func (m *RepeatedEnum) String() string { return proto.CompactTextString(m) } +func (*RepeatedEnum) ProtoMessage() {} +func (*RepeatedEnum) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} } + +func (m *RepeatedEnum) GetColor() []RepeatedEnum_Color { + if m != nil { + return m.Color + } + return nil +} + +type MoreRepeated struct { + Bools []bool `protobuf:"varint,1,rep,name=bools" json:"bools,omitempty"` + BoolsPacked []bool `protobuf:"varint,2,rep,packed,name=bools_packed,json=boolsPacked" json:"bools_packed,omitempty"` + Ints []int32 `protobuf:"varint,3,rep,name=ints" json:"ints,omitempty"` + IntsPacked []int32 `protobuf:"varint,4,rep,packed,name=ints_packed,json=intsPacked" json:"ints_packed,omitempty"` + Int64SPacked []int64 `protobuf:"varint,7,rep,packed,name=int64s_packed,json=int64sPacked" json:"int64s_packed,omitempty"` + Strings []string `protobuf:"bytes,5,rep,name=strings" json:"strings,omitempty"` + Fixeds []uint32 `protobuf:"fixed32,6,rep,name=fixeds" json:"fixeds,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *MoreRepeated) Reset() { *m = MoreRepeated{} } +func (m *MoreRepeated) String() string { return proto.CompactTextString(m) } +func (*MoreRepeated) ProtoMessage() {} +func (*MoreRepeated) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24} } + +func (m *MoreRepeated) GetBools() []bool { + if m != nil { + return m.Bools + } + return nil +} + +func (m *MoreRepeated) GetBoolsPacked() []bool { + if m != nil { + return m.BoolsPacked + } + return nil +} + +func (m *MoreRepeated) GetInts() []int32 { + if m != nil { + return m.Ints + } + return nil +} + +func (m *MoreRepeated) GetIntsPacked() []int32 { + if m != nil { + return m.IntsPacked + } + return nil +} + +func (m *MoreRepeated) GetInt64SPacked() []int64 { + if m != nil { + return m.Int64SPacked + } + return nil +} + +func (m *MoreRepeated) GetStrings() []string { + if m != nil { + return m.Strings + } + return nil +} + +func (m *MoreRepeated) GetFixeds() []uint32 { + if m != nil { + return m.Fixeds + } + return nil +} + +type GroupOld struct { + G *GroupOld_G `protobuf:"group,101,opt,name=G,json=g" json:"g,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GroupOld) Reset() { *m = GroupOld{} } +func (m *GroupOld) String() string { return proto.CompactTextString(m) } +func (*GroupOld) ProtoMessage() {} +func (*GroupOld) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{25} } + +func (m *GroupOld) GetG() *GroupOld_G { + if m != nil { + return m.G + } + return nil +} + +type GroupOld_G struct { + X *int32 `protobuf:"varint,2,opt,name=x" json:"x,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GroupOld_G) Reset() { *m = GroupOld_G{} } +func (m *GroupOld_G) String() string { return proto.CompactTextString(m) } +func (*GroupOld_G) ProtoMessage() {} +func (*GroupOld_G) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{25, 0} } + +func (m *GroupOld_G) GetX() int32 { + if m != nil && m.X != nil { + return *m.X + } + return 0 +} + +type GroupNew struct { + G *GroupNew_G `protobuf:"group,101,opt,name=G,json=g" json:"g,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GroupNew) Reset() { *m = GroupNew{} } +func (m *GroupNew) String() string { return proto.CompactTextString(m) } +func (*GroupNew) ProtoMessage() {} +func (*GroupNew) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{26} } + +func (m *GroupNew) GetG() *GroupNew_G { + if m != nil { + return m.G + } + return nil +} + +type GroupNew_G struct { + X *int32 `protobuf:"varint,2,opt,name=x" json:"x,omitempty"` + Y *int32 `protobuf:"varint,3,opt,name=y" json:"y,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GroupNew_G) Reset() { *m = GroupNew_G{} } +func (m *GroupNew_G) String() string { return proto.CompactTextString(m) } +func (*GroupNew_G) ProtoMessage() {} +func (*GroupNew_G) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{26, 0} } + +func (m *GroupNew_G) GetX() int32 { + if m != nil && m.X != nil { + return *m.X + } + return 0 +} + +func (m *GroupNew_G) GetY() int32 { + if m != nil && m.Y != nil { + return *m.Y + } + return 0 +} + +type FloatingPoint struct { + F *float64 `protobuf:"fixed64,1,req,name=f" json:"f,omitempty"` + Exact *bool `protobuf:"varint,2,opt,name=exact" json:"exact,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *FloatingPoint) Reset() { *m = FloatingPoint{} } +func (m *FloatingPoint) String() string { return proto.CompactTextString(m) } +func (*FloatingPoint) ProtoMessage() {} +func (*FloatingPoint) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{27} } + +func (m *FloatingPoint) GetF() float64 { + if m != nil && m.F != nil { + return *m.F + } + return 0 +} + +func (m *FloatingPoint) GetExact() bool { + if m != nil && m.Exact != nil { + return *m.Exact + } + return false +} + +type MessageWithMap struct { + NameMapping map[int32]string `protobuf:"bytes,1,rep,name=name_mapping,json=nameMapping" json:"name_mapping,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + MsgMapping map[int64]*FloatingPoint `protobuf:"bytes,2,rep,name=msg_mapping,json=msgMapping" json:"msg_mapping,omitempty" protobuf_key:"zigzag64,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + ByteMapping map[bool][]byte `protobuf:"bytes,3,rep,name=byte_mapping,json=byteMapping" json:"byte_mapping,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + StrToStr map[string]string `protobuf:"bytes,4,rep,name=str_to_str,json=strToStr" json:"str_to_str,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *MessageWithMap) Reset() { *m = MessageWithMap{} } +func (m *MessageWithMap) String() string { return proto.CompactTextString(m) } +func (*MessageWithMap) ProtoMessage() {} +func (*MessageWithMap) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{28} } + +func (m *MessageWithMap) GetNameMapping() map[int32]string { + if m != nil { + return m.NameMapping + } + return nil +} + +func (m *MessageWithMap) GetMsgMapping() map[int64]*FloatingPoint { + if m != nil { + return m.MsgMapping + } + return nil +} + +func (m *MessageWithMap) GetByteMapping() map[bool][]byte { + if m != nil { + return m.ByteMapping + } + return nil +} + +func (m *MessageWithMap) GetStrToStr() map[string]string { + if m != nil { + return m.StrToStr + } + return nil +} + +type Oneof struct { + // Types that are valid to be assigned to Union: + // *Oneof_F_Bool + // *Oneof_F_Int32 + // *Oneof_F_Int64 + // *Oneof_F_Fixed32 + // *Oneof_F_Fixed64 + // *Oneof_F_Uint32 + // *Oneof_F_Uint64 + // *Oneof_F_Float + // *Oneof_F_Double + // *Oneof_F_String + // *Oneof_F_Bytes + // *Oneof_F_Sint32 + // *Oneof_F_Sint64 + // *Oneof_F_Enum + // *Oneof_F_Message + // *Oneof_FGroup + // *Oneof_F_Largest_Tag + Union isOneof_Union `protobuf_oneof:"union"` + // Types that are valid to be assigned to Tormato: + // *Oneof_Value + Tormato isOneof_Tormato `protobuf_oneof:"tormato"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Oneof) Reset() { *m = Oneof{} } +func (m *Oneof) String() string { return proto.CompactTextString(m) } +func (*Oneof) ProtoMessage() {} +func (*Oneof) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{29} } + +type isOneof_Union interface { + isOneof_Union() +} +type isOneof_Tormato interface { + isOneof_Tormato() +} + +type Oneof_F_Bool struct { + F_Bool bool `protobuf:"varint,1,opt,name=F_Bool,json=FBool,oneof"` +} +type Oneof_F_Int32 struct { + F_Int32 int32 `protobuf:"varint,2,opt,name=F_Int32,json=FInt32,oneof"` +} +type Oneof_F_Int64 struct { + F_Int64 int64 `protobuf:"varint,3,opt,name=F_Int64,json=FInt64,oneof"` +} +type Oneof_F_Fixed32 struct { + F_Fixed32 uint32 `protobuf:"fixed32,4,opt,name=F_Fixed32,json=FFixed32,oneof"` +} +type Oneof_F_Fixed64 struct { + F_Fixed64 uint64 `protobuf:"fixed64,5,opt,name=F_Fixed64,json=FFixed64,oneof"` +} +type Oneof_F_Uint32 struct { + F_Uint32 uint32 `protobuf:"varint,6,opt,name=F_Uint32,json=FUint32,oneof"` +} +type Oneof_F_Uint64 struct { + F_Uint64 uint64 `protobuf:"varint,7,opt,name=F_Uint64,json=FUint64,oneof"` +} +type Oneof_F_Float struct { + F_Float float32 `protobuf:"fixed32,8,opt,name=F_Float,json=FFloat,oneof"` +} +type Oneof_F_Double struct { + F_Double float64 `protobuf:"fixed64,9,opt,name=F_Double,json=FDouble,oneof"` +} +type Oneof_F_String struct { + F_String string `protobuf:"bytes,10,opt,name=F_String,json=FString,oneof"` +} +type Oneof_F_Bytes struct { + F_Bytes []byte `protobuf:"bytes,11,opt,name=F_Bytes,json=FBytes,oneof"` +} +type Oneof_F_Sint32 struct { + F_Sint32 int32 `protobuf:"zigzag32,12,opt,name=F_Sint32,json=FSint32,oneof"` +} +type Oneof_F_Sint64 struct { + F_Sint64 int64 `protobuf:"zigzag64,13,opt,name=F_Sint64,json=FSint64,oneof"` +} +type Oneof_F_Enum struct { + F_Enum MyMessage_Color `protobuf:"varint,14,opt,name=F_Enum,json=FEnum,enum=testdata.MyMessage_Color,oneof"` +} +type Oneof_F_Message struct { + F_Message *GoTestField `protobuf:"bytes,15,opt,name=F_Message,json=FMessage,oneof"` +} +type Oneof_FGroup struct { + FGroup *Oneof_F_Group `protobuf:"group,16,opt,name=F_Group,json=fGroup,oneof"` +} +type Oneof_F_Largest_Tag struct { + F_Largest_Tag int32 `protobuf:"varint,536870911,opt,name=F_Largest_Tag,json=FLargestTag,oneof"` +} +type Oneof_Value struct { + Value int32 `protobuf:"varint,100,opt,name=value,oneof"` +} + +func (*Oneof_F_Bool) isOneof_Union() {} +func (*Oneof_F_Int32) isOneof_Union() {} +func (*Oneof_F_Int64) isOneof_Union() {} +func (*Oneof_F_Fixed32) isOneof_Union() {} +func (*Oneof_F_Fixed64) isOneof_Union() {} +func (*Oneof_F_Uint32) isOneof_Union() {} +func (*Oneof_F_Uint64) isOneof_Union() {} +func (*Oneof_F_Float) isOneof_Union() {} +func (*Oneof_F_Double) isOneof_Union() {} +func (*Oneof_F_String) isOneof_Union() {} +func (*Oneof_F_Bytes) isOneof_Union() {} +func (*Oneof_F_Sint32) isOneof_Union() {} +func (*Oneof_F_Sint64) isOneof_Union() {} +func (*Oneof_F_Enum) isOneof_Union() {} +func (*Oneof_F_Message) isOneof_Union() {} +func (*Oneof_FGroup) isOneof_Union() {} +func (*Oneof_F_Largest_Tag) isOneof_Union() {} +func (*Oneof_Value) isOneof_Tormato() {} + +func (m *Oneof) GetUnion() isOneof_Union { + if m != nil { + return m.Union + } + return nil +} +func (m *Oneof) GetTormato() isOneof_Tormato { + if m != nil { + return m.Tormato + } + return nil +} + +func (m *Oneof) GetF_Bool() bool { + if x, ok := m.GetUnion().(*Oneof_F_Bool); ok { + return x.F_Bool + } + return false +} + +func (m *Oneof) GetF_Int32() int32 { + if x, ok := m.GetUnion().(*Oneof_F_Int32); ok { + return x.F_Int32 + } + return 0 +} + +func (m *Oneof) GetF_Int64() int64 { + if x, ok := m.GetUnion().(*Oneof_F_Int64); ok { + return x.F_Int64 + } + return 0 +} + +func (m *Oneof) GetF_Fixed32() uint32 { + if x, ok := m.GetUnion().(*Oneof_F_Fixed32); ok { + return x.F_Fixed32 + } + return 0 +} + +func (m *Oneof) GetF_Fixed64() uint64 { + if x, ok := m.GetUnion().(*Oneof_F_Fixed64); ok { + return x.F_Fixed64 + } + return 0 +} + +func (m *Oneof) GetF_Uint32() uint32 { + if x, ok := m.GetUnion().(*Oneof_F_Uint32); ok { + return x.F_Uint32 + } + return 0 +} + +func (m *Oneof) GetF_Uint64() uint64 { + if x, ok := m.GetUnion().(*Oneof_F_Uint64); ok { + return x.F_Uint64 + } + return 0 +} + +func (m *Oneof) GetF_Float() float32 { + if x, ok := m.GetUnion().(*Oneof_F_Float); ok { + return x.F_Float + } + return 0 +} + +func (m *Oneof) GetF_Double() float64 { + if x, ok := m.GetUnion().(*Oneof_F_Double); ok { + return x.F_Double + } + return 0 +} + +func (m *Oneof) GetF_String() string { + if x, ok := m.GetUnion().(*Oneof_F_String); ok { + return x.F_String + } + return "" +} + +func (m *Oneof) GetF_Bytes() []byte { + if x, ok := m.GetUnion().(*Oneof_F_Bytes); ok { + return x.F_Bytes + } + return nil +} + +func (m *Oneof) GetF_Sint32() int32 { + if x, ok := m.GetUnion().(*Oneof_F_Sint32); ok { + return x.F_Sint32 + } + return 0 +} + +func (m *Oneof) GetF_Sint64() int64 { + if x, ok := m.GetUnion().(*Oneof_F_Sint64); ok { + return x.F_Sint64 + } + return 0 +} + +func (m *Oneof) GetF_Enum() MyMessage_Color { + if x, ok := m.GetUnion().(*Oneof_F_Enum); ok { + return x.F_Enum + } + return MyMessage_RED +} + +func (m *Oneof) GetF_Message() *GoTestField { + if x, ok := m.GetUnion().(*Oneof_F_Message); ok { + return x.F_Message + } + return nil +} + +func (m *Oneof) GetFGroup() *Oneof_F_Group { + if x, ok := m.GetUnion().(*Oneof_FGroup); ok { + return x.FGroup + } + return nil +} + +func (m *Oneof) GetF_Largest_Tag() int32 { + if x, ok := m.GetUnion().(*Oneof_F_Largest_Tag); ok { + return x.F_Largest_Tag + } + return 0 +} + +func (m *Oneof) GetValue() int32 { + if x, ok := m.GetTormato().(*Oneof_Value); ok { + return x.Value + } + return 0 +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*Oneof) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _Oneof_OneofMarshaler, _Oneof_OneofUnmarshaler, _Oneof_OneofSizer, []interface{}{ + (*Oneof_F_Bool)(nil), + (*Oneof_F_Int32)(nil), + (*Oneof_F_Int64)(nil), + (*Oneof_F_Fixed32)(nil), + (*Oneof_F_Fixed64)(nil), + (*Oneof_F_Uint32)(nil), + (*Oneof_F_Uint64)(nil), + (*Oneof_F_Float)(nil), + (*Oneof_F_Double)(nil), + (*Oneof_F_String)(nil), + (*Oneof_F_Bytes)(nil), + (*Oneof_F_Sint32)(nil), + (*Oneof_F_Sint64)(nil), + (*Oneof_F_Enum)(nil), + (*Oneof_F_Message)(nil), + (*Oneof_FGroup)(nil), + (*Oneof_F_Largest_Tag)(nil), + (*Oneof_Value)(nil), + } +} + +func _Oneof_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*Oneof) + // union + switch x := m.Union.(type) { + case *Oneof_F_Bool: + t := uint64(0) + if x.F_Bool { + t = 1 + } + b.EncodeVarint(1<<3 | proto.WireVarint) + b.EncodeVarint(t) + case *Oneof_F_Int32: + b.EncodeVarint(2<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.F_Int32)) + case *Oneof_F_Int64: + b.EncodeVarint(3<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.F_Int64)) + case *Oneof_F_Fixed32: + b.EncodeVarint(4<<3 | proto.WireFixed32) + b.EncodeFixed32(uint64(x.F_Fixed32)) + case *Oneof_F_Fixed64: + b.EncodeVarint(5<<3 | proto.WireFixed64) + b.EncodeFixed64(uint64(x.F_Fixed64)) + case *Oneof_F_Uint32: + b.EncodeVarint(6<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.F_Uint32)) + case *Oneof_F_Uint64: + b.EncodeVarint(7<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.F_Uint64)) + case *Oneof_F_Float: + b.EncodeVarint(8<<3 | proto.WireFixed32) + b.EncodeFixed32(uint64(math.Float32bits(x.F_Float))) + case *Oneof_F_Double: + b.EncodeVarint(9<<3 | proto.WireFixed64) + b.EncodeFixed64(math.Float64bits(x.F_Double)) + case *Oneof_F_String: + b.EncodeVarint(10<<3 | proto.WireBytes) + b.EncodeStringBytes(x.F_String) + case *Oneof_F_Bytes: + b.EncodeVarint(11<<3 | proto.WireBytes) + b.EncodeRawBytes(x.F_Bytes) + case *Oneof_F_Sint32: + b.EncodeVarint(12<<3 | proto.WireVarint) + b.EncodeZigzag32(uint64(x.F_Sint32)) + case *Oneof_F_Sint64: + b.EncodeVarint(13<<3 | proto.WireVarint) + b.EncodeZigzag64(uint64(x.F_Sint64)) + case *Oneof_F_Enum: + b.EncodeVarint(14<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.F_Enum)) + case *Oneof_F_Message: + b.EncodeVarint(15<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.F_Message); err != nil { + return err + } + case *Oneof_FGroup: + b.EncodeVarint(16<<3 | proto.WireStartGroup) + if err := b.Marshal(x.FGroup); err != nil { + return err + } + b.EncodeVarint(16<<3 | proto.WireEndGroup) + case *Oneof_F_Largest_Tag: + b.EncodeVarint(536870911<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.F_Largest_Tag)) + case nil: + default: + return fmt.Errorf("Oneof.Union has unexpected type %T", x) + } + // tormato + switch x := m.Tormato.(type) { + case *Oneof_Value: + b.EncodeVarint(100<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.Value)) + case nil: + default: + return fmt.Errorf("Oneof.Tormato has unexpected type %T", x) + } + return nil +} + +func _Oneof_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*Oneof) + switch tag { + case 1: // union.F_Bool + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Oneof_F_Bool{x != 0} + return true, err + case 2: // union.F_Int32 + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Oneof_F_Int32{int32(x)} + return true, err + case 3: // union.F_Int64 + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Oneof_F_Int64{int64(x)} + return true, err + case 4: // union.F_Fixed32 + if wire != proto.WireFixed32 { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeFixed32() + m.Union = &Oneof_F_Fixed32{uint32(x)} + return true, err + case 5: // union.F_Fixed64 + if wire != proto.WireFixed64 { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeFixed64() + m.Union = &Oneof_F_Fixed64{x} + return true, err + case 6: // union.F_Uint32 + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Oneof_F_Uint32{uint32(x)} + return true, err + case 7: // union.F_Uint64 + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Oneof_F_Uint64{x} + return true, err + case 8: // union.F_Float + if wire != proto.WireFixed32 { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeFixed32() + m.Union = &Oneof_F_Float{math.Float32frombits(uint32(x))} + return true, err + case 9: // union.F_Double + if wire != proto.WireFixed64 { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeFixed64() + m.Union = &Oneof_F_Double{math.Float64frombits(x)} + return true, err + case 10: // union.F_String + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeStringBytes() + m.Union = &Oneof_F_String{x} + return true, err + case 11: // union.F_Bytes + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeRawBytes(true) + m.Union = &Oneof_F_Bytes{x} + return true, err + case 12: // union.F_Sint32 + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeZigzag32() + m.Union = &Oneof_F_Sint32{int32(x)} + return true, err + case 13: // union.F_Sint64 + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeZigzag64() + m.Union = &Oneof_F_Sint64{int64(x)} + return true, err + case 14: // union.F_Enum + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Oneof_F_Enum{MyMessage_Color(x)} + return true, err + case 15: // union.F_Message + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(GoTestField) + err := b.DecodeMessage(msg) + m.Union = &Oneof_F_Message{msg} + return true, err + case 16: // union.f_group + if wire != proto.WireStartGroup { + return true, proto.ErrInternalBadWireType + } + msg := new(Oneof_F_Group) + err := b.DecodeGroup(msg) + m.Union = &Oneof_FGroup{msg} + return true, err + case 536870911: // union.F_Largest_Tag + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Oneof_F_Largest_Tag{int32(x)} + return true, err + case 100: // tormato.value + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Tormato = &Oneof_Value{int32(x)} + return true, err + default: + return false, nil + } +} + +func _Oneof_OneofSizer(msg proto.Message) (n int) { + m := msg.(*Oneof) + // union + switch x := m.Union.(type) { + case *Oneof_F_Bool: + n += proto.SizeVarint(1<<3 | proto.WireVarint) + n += 1 + case *Oneof_F_Int32: + n += proto.SizeVarint(2<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.F_Int32)) + case *Oneof_F_Int64: + n += proto.SizeVarint(3<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.F_Int64)) + case *Oneof_F_Fixed32: + n += proto.SizeVarint(4<<3 | proto.WireFixed32) + n += 4 + case *Oneof_F_Fixed64: + n += proto.SizeVarint(5<<3 | proto.WireFixed64) + n += 8 + case *Oneof_F_Uint32: + n += proto.SizeVarint(6<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.F_Uint32)) + case *Oneof_F_Uint64: + n += proto.SizeVarint(7<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.F_Uint64)) + case *Oneof_F_Float: + n += proto.SizeVarint(8<<3 | proto.WireFixed32) + n += 4 + case *Oneof_F_Double: + n += proto.SizeVarint(9<<3 | proto.WireFixed64) + n += 8 + case *Oneof_F_String: + n += proto.SizeVarint(10<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(len(x.F_String))) + n += len(x.F_String) + case *Oneof_F_Bytes: + n += proto.SizeVarint(11<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(len(x.F_Bytes))) + n += len(x.F_Bytes) + case *Oneof_F_Sint32: + n += proto.SizeVarint(12<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64((uint32(x.F_Sint32) << 1) ^ uint32((int32(x.F_Sint32) >> 31)))) + case *Oneof_F_Sint64: + n += proto.SizeVarint(13<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(uint64(x.F_Sint64<<1) ^ uint64((int64(x.F_Sint64) >> 63)))) + case *Oneof_F_Enum: + n += proto.SizeVarint(14<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.F_Enum)) + case *Oneof_F_Message: + s := proto.Size(x.F_Message) + n += proto.SizeVarint(15<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case *Oneof_FGroup: + n += proto.SizeVarint(16<<3 | proto.WireStartGroup) + n += proto.Size(x.FGroup) + n += proto.SizeVarint(16<<3 | proto.WireEndGroup) + case *Oneof_F_Largest_Tag: + n += proto.SizeVarint(536870911<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.F_Largest_Tag)) + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + // tormato + switch x := m.Tormato.(type) { + case *Oneof_Value: + n += proto.SizeVarint(100<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.Value)) + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +type Oneof_F_Group struct { + X *int32 `protobuf:"varint,17,opt,name=x" json:"x,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Oneof_F_Group) Reset() { *m = Oneof_F_Group{} } +func (m *Oneof_F_Group) String() string { return proto.CompactTextString(m) } +func (*Oneof_F_Group) ProtoMessage() {} +func (*Oneof_F_Group) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{29, 0} } + +func (m *Oneof_F_Group) GetX() int32 { + if m != nil && m.X != nil { + return *m.X + } + return 0 +} + +type Communique struct { + MakeMeCry *bool `protobuf:"varint,1,opt,name=make_me_cry,json=makeMeCry" json:"make_me_cry,omitempty"` + // This is a oneof, called "union". + // + // Types that are valid to be assigned to Union: + // *Communique_Number + // *Communique_Name + // *Communique_Data + // *Communique_TempC + // *Communique_Col + // *Communique_Msg + Union isCommunique_Union `protobuf_oneof:"union"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Communique) Reset() { *m = Communique{} } +func (m *Communique) String() string { return proto.CompactTextString(m) } +func (*Communique) ProtoMessage() {} +func (*Communique) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{30} } + +type isCommunique_Union interface { + isCommunique_Union() +} + +type Communique_Number struct { + Number int32 `protobuf:"varint,5,opt,name=number,oneof"` +} +type Communique_Name struct { + Name string `protobuf:"bytes,6,opt,name=name,oneof"` +} +type Communique_Data struct { + Data []byte `protobuf:"bytes,7,opt,name=data,oneof"` +} +type Communique_TempC struct { + TempC float64 `protobuf:"fixed64,8,opt,name=temp_c,json=tempC,oneof"` +} +type Communique_Col struct { + Col MyMessage_Color `protobuf:"varint,9,opt,name=col,enum=testdata.MyMessage_Color,oneof"` +} +type Communique_Msg struct { + Msg *Strings `protobuf:"bytes,10,opt,name=msg,oneof"` +} + +func (*Communique_Number) isCommunique_Union() {} +func (*Communique_Name) isCommunique_Union() {} +func (*Communique_Data) isCommunique_Union() {} +func (*Communique_TempC) isCommunique_Union() {} +func (*Communique_Col) isCommunique_Union() {} +func (*Communique_Msg) isCommunique_Union() {} + +func (m *Communique) GetUnion() isCommunique_Union { + if m != nil { + return m.Union + } + return nil +} + +func (m *Communique) GetMakeMeCry() bool { + if m != nil && m.MakeMeCry != nil { + return *m.MakeMeCry + } + return false +} + +func (m *Communique) GetNumber() int32 { + if x, ok := m.GetUnion().(*Communique_Number); ok { + return x.Number + } + return 0 +} + +func (m *Communique) GetName() string { + if x, ok := m.GetUnion().(*Communique_Name); ok { + return x.Name + } + return "" +} + +func (m *Communique) GetData() []byte { + if x, ok := m.GetUnion().(*Communique_Data); ok { + return x.Data + } + return nil +} + +func (m *Communique) GetTempC() float64 { + if x, ok := m.GetUnion().(*Communique_TempC); ok { + return x.TempC + } + return 0 +} + +func (m *Communique) GetCol() MyMessage_Color { + if x, ok := m.GetUnion().(*Communique_Col); ok { + return x.Col + } + return MyMessage_RED +} + +func (m *Communique) GetMsg() *Strings { + if x, ok := m.GetUnion().(*Communique_Msg); ok { + return x.Msg + } + return nil +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*Communique) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _Communique_OneofMarshaler, _Communique_OneofUnmarshaler, _Communique_OneofSizer, []interface{}{ + (*Communique_Number)(nil), + (*Communique_Name)(nil), + (*Communique_Data)(nil), + (*Communique_TempC)(nil), + (*Communique_Col)(nil), + (*Communique_Msg)(nil), + } +} + +func _Communique_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*Communique) + // union + switch x := m.Union.(type) { + case *Communique_Number: + b.EncodeVarint(5<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.Number)) + case *Communique_Name: + b.EncodeVarint(6<<3 | proto.WireBytes) + b.EncodeStringBytes(x.Name) + case *Communique_Data: + b.EncodeVarint(7<<3 | proto.WireBytes) + b.EncodeRawBytes(x.Data) + case *Communique_TempC: + b.EncodeVarint(8<<3 | proto.WireFixed64) + b.EncodeFixed64(math.Float64bits(x.TempC)) + case *Communique_Col: + b.EncodeVarint(9<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.Col)) + case *Communique_Msg: + b.EncodeVarint(10<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.Msg); err != nil { + return err + } + case nil: + default: + return fmt.Errorf("Communique.Union has unexpected type %T", x) + } + return nil +} + +func _Communique_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*Communique) + switch tag { + case 5: // union.number + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Communique_Number{int32(x)} + return true, err + case 6: // union.name + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeStringBytes() + m.Union = &Communique_Name{x} + return true, err + case 7: // union.data + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeRawBytes(true) + m.Union = &Communique_Data{x} + return true, err + case 8: // union.temp_c + if wire != proto.WireFixed64 { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeFixed64() + m.Union = &Communique_TempC{math.Float64frombits(x)} + return true, err + case 9: // union.col + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Communique_Col{MyMessage_Color(x)} + return true, err + case 10: // union.msg + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(Strings) + err := b.DecodeMessage(msg) + m.Union = &Communique_Msg{msg} + return true, err + default: + return false, nil + } +} + +func _Communique_OneofSizer(msg proto.Message) (n int) { + m := msg.(*Communique) + // union + switch x := m.Union.(type) { + case *Communique_Number: + n += proto.SizeVarint(5<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.Number)) + case *Communique_Name: + n += proto.SizeVarint(6<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(len(x.Name))) + n += len(x.Name) + case *Communique_Data: + n += proto.SizeVarint(7<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(len(x.Data))) + n += len(x.Data) + case *Communique_TempC: + n += proto.SizeVarint(8<<3 | proto.WireFixed64) + n += 8 + case *Communique_Col: + n += proto.SizeVarint(9<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.Col)) + case *Communique_Msg: + s := proto.Size(x.Msg) + n += proto.SizeVarint(10<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +var E_Greeting = &proto.ExtensionDesc{ + ExtendedType: (*MyMessage)(nil), + ExtensionType: ([]string)(nil), + Field: 106, + Name: "testdata.greeting", + Tag: "bytes,106,rep,name=greeting", + Filename: "test.proto", +} + +var E_Complex = &proto.ExtensionDesc{ + ExtendedType: (*OtherMessage)(nil), + ExtensionType: (*ComplexExtension)(nil), + Field: 200, + Name: "testdata.complex", + Tag: "bytes,200,opt,name=complex", + Filename: "test.proto", +} + +var E_RComplex = &proto.ExtensionDesc{ + ExtendedType: (*OtherMessage)(nil), + ExtensionType: ([]*ComplexExtension)(nil), + Field: 201, + Name: "testdata.r_complex", + Tag: "bytes,201,rep,name=r_complex,json=rComplex", + Filename: "test.proto", +} + +var E_NoDefaultDouble = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*float64)(nil), + Field: 101, + Name: "testdata.no_default_double", + Tag: "fixed64,101,opt,name=no_default_double,json=noDefaultDouble", + Filename: "test.proto", +} + +var E_NoDefaultFloat = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*float32)(nil), + Field: 102, + Name: "testdata.no_default_float", + Tag: "fixed32,102,opt,name=no_default_float,json=noDefaultFloat", + Filename: "test.proto", +} + +var E_NoDefaultInt32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int32)(nil), + Field: 103, + Name: "testdata.no_default_int32", + Tag: "varint,103,opt,name=no_default_int32,json=noDefaultInt32", + Filename: "test.proto", +} + +var E_NoDefaultInt64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int64)(nil), + Field: 104, + Name: "testdata.no_default_int64", + Tag: "varint,104,opt,name=no_default_int64,json=noDefaultInt64", + Filename: "test.proto", +} + +var E_NoDefaultUint32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*uint32)(nil), + Field: 105, + Name: "testdata.no_default_uint32", + Tag: "varint,105,opt,name=no_default_uint32,json=noDefaultUint32", + Filename: "test.proto", +} + +var E_NoDefaultUint64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*uint64)(nil), + Field: 106, + Name: "testdata.no_default_uint64", + Tag: "varint,106,opt,name=no_default_uint64,json=noDefaultUint64", + Filename: "test.proto", +} + +var E_NoDefaultSint32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int32)(nil), + Field: 107, + Name: "testdata.no_default_sint32", + Tag: "zigzag32,107,opt,name=no_default_sint32,json=noDefaultSint32", + Filename: "test.proto", +} + +var E_NoDefaultSint64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int64)(nil), + Field: 108, + Name: "testdata.no_default_sint64", + Tag: "zigzag64,108,opt,name=no_default_sint64,json=noDefaultSint64", + Filename: "test.proto", +} + +var E_NoDefaultFixed32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*uint32)(nil), + Field: 109, + Name: "testdata.no_default_fixed32", + Tag: "fixed32,109,opt,name=no_default_fixed32,json=noDefaultFixed32", + Filename: "test.proto", +} + +var E_NoDefaultFixed64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*uint64)(nil), + Field: 110, + Name: "testdata.no_default_fixed64", + Tag: "fixed64,110,opt,name=no_default_fixed64,json=noDefaultFixed64", + Filename: "test.proto", +} + +var E_NoDefaultSfixed32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int32)(nil), + Field: 111, + Name: "testdata.no_default_sfixed32", + Tag: "fixed32,111,opt,name=no_default_sfixed32,json=noDefaultSfixed32", + Filename: "test.proto", +} + +var E_NoDefaultSfixed64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int64)(nil), + Field: 112, + Name: "testdata.no_default_sfixed64", + Tag: "fixed64,112,opt,name=no_default_sfixed64,json=noDefaultSfixed64", + Filename: "test.proto", +} + +var E_NoDefaultBool = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*bool)(nil), + Field: 113, + Name: "testdata.no_default_bool", + Tag: "varint,113,opt,name=no_default_bool,json=noDefaultBool", + Filename: "test.proto", +} + +var E_NoDefaultString = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*string)(nil), + Field: 114, + Name: "testdata.no_default_string", + Tag: "bytes,114,opt,name=no_default_string,json=noDefaultString", + Filename: "test.proto", +} + +var E_NoDefaultBytes = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: ([]byte)(nil), + Field: 115, + Name: "testdata.no_default_bytes", + Tag: "bytes,115,opt,name=no_default_bytes,json=noDefaultBytes", + Filename: "test.proto", +} + +var E_NoDefaultEnum = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*DefaultsMessage_DefaultsEnum)(nil), + Field: 116, + Name: "testdata.no_default_enum", + Tag: "varint,116,opt,name=no_default_enum,json=noDefaultEnum,enum=testdata.DefaultsMessage_DefaultsEnum", + Filename: "test.proto", +} + +var E_DefaultDouble = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*float64)(nil), + Field: 201, + Name: "testdata.default_double", + Tag: "fixed64,201,opt,name=default_double,json=defaultDouble,def=3.1415", + Filename: "test.proto", +} + +var E_DefaultFloat = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*float32)(nil), + Field: 202, + Name: "testdata.default_float", + Tag: "fixed32,202,opt,name=default_float,json=defaultFloat,def=3.14", + Filename: "test.proto", +} + +var E_DefaultInt32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int32)(nil), + Field: 203, + Name: "testdata.default_int32", + Tag: "varint,203,opt,name=default_int32,json=defaultInt32,def=42", + Filename: "test.proto", +} + +var E_DefaultInt64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int64)(nil), + Field: 204, + Name: "testdata.default_int64", + Tag: "varint,204,opt,name=default_int64,json=defaultInt64,def=43", + Filename: "test.proto", +} + +var E_DefaultUint32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*uint32)(nil), + Field: 205, + Name: "testdata.default_uint32", + Tag: "varint,205,opt,name=default_uint32,json=defaultUint32,def=44", + Filename: "test.proto", +} + +var E_DefaultUint64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*uint64)(nil), + Field: 206, + Name: "testdata.default_uint64", + Tag: "varint,206,opt,name=default_uint64,json=defaultUint64,def=45", + Filename: "test.proto", +} + +var E_DefaultSint32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int32)(nil), + Field: 207, + Name: "testdata.default_sint32", + Tag: "zigzag32,207,opt,name=default_sint32,json=defaultSint32,def=46", + Filename: "test.proto", +} + +var E_DefaultSint64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int64)(nil), + Field: 208, + Name: "testdata.default_sint64", + Tag: "zigzag64,208,opt,name=default_sint64,json=defaultSint64,def=47", + Filename: "test.proto", +} + +var E_DefaultFixed32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*uint32)(nil), + Field: 209, + Name: "testdata.default_fixed32", + Tag: "fixed32,209,opt,name=default_fixed32,json=defaultFixed32,def=48", + Filename: "test.proto", +} + +var E_DefaultFixed64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*uint64)(nil), + Field: 210, + Name: "testdata.default_fixed64", + Tag: "fixed64,210,opt,name=default_fixed64,json=defaultFixed64,def=49", + Filename: "test.proto", +} + +var E_DefaultSfixed32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int32)(nil), + Field: 211, + Name: "testdata.default_sfixed32", + Tag: "fixed32,211,opt,name=default_sfixed32,json=defaultSfixed32,def=50", + Filename: "test.proto", +} + +var E_DefaultSfixed64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int64)(nil), + Field: 212, + Name: "testdata.default_sfixed64", + Tag: "fixed64,212,opt,name=default_sfixed64,json=defaultSfixed64,def=51", + Filename: "test.proto", +} + +var E_DefaultBool = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*bool)(nil), + Field: 213, + Name: "testdata.default_bool", + Tag: "varint,213,opt,name=default_bool,json=defaultBool,def=1", + Filename: "test.proto", +} + +var E_DefaultString = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*string)(nil), + Field: 214, + Name: "testdata.default_string", + Tag: "bytes,214,opt,name=default_string,json=defaultString,def=Hello, string", + Filename: "test.proto", +} + +var E_DefaultBytes = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: ([]byte)(nil), + Field: 215, + Name: "testdata.default_bytes", + Tag: "bytes,215,opt,name=default_bytes,json=defaultBytes,def=Hello, bytes", + Filename: "test.proto", +} + +var E_DefaultEnum = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*DefaultsMessage_DefaultsEnum)(nil), + Field: 216, + Name: "testdata.default_enum", + Tag: "varint,216,opt,name=default_enum,json=defaultEnum,enum=testdata.DefaultsMessage_DefaultsEnum,def=1", + Filename: "test.proto", +} + +var E_X201 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 201, + Name: "testdata.x201", + Tag: "bytes,201,opt,name=x201", + Filename: "test.proto", +} + +var E_X202 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 202, + Name: "testdata.x202", + Tag: "bytes,202,opt,name=x202", + Filename: "test.proto", +} + +var E_X203 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 203, + Name: "testdata.x203", + Tag: "bytes,203,opt,name=x203", + Filename: "test.proto", +} + +var E_X204 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 204, + Name: "testdata.x204", + Tag: "bytes,204,opt,name=x204", + Filename: "test.proto", +} + +var E_X205 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 205, + Name: "testdata.x205", + Tag: "bytes,205,opt,name=x205", + Filename: "test.proto", +} + +var E_X206 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 206, + Name: "testdata.x206", + Tag: "bytes,206,opt,name=x206", + Filename: "test.proto", +} + +var E_X207 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 207, + Name: "testdata.x207", + Tag: "bytes,207,opt,name=x207", + Filename: "test.proto", +} + +var E_X208 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 208, + Name: "testdata.x208", + Tag: "bytes,208,opt,name=x208", + Filename: "test.proto", +} + +var E_X209 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 209, + Name: "testdata.x209", + Tag: "bytes,209,opt,name=x209", + Filename: "test.proto", +} + +var E_X210 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 210, + Name: "testdata.x210", + Tag: "bytes,210,opt,name=x210", + Filename: "test.proto", +} + +var E_X211 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 211, + Name: "testdata.x211", + Tag: "bytes,211,opt,name=x211", + Filename: "test.proto", +} + +var E_X212 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 212, + Name: "testdata.x212", + Tag: "bytes,212,opt,name=x212", + Filename: "test.proto", +} + +var E_X213 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 213, + Name: "testdata.x213", + Tag: "bytes,213,opt,name=x213", + Filename: "test.proto", +} + +var E_X214 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 214, + Name: "testdata.x214", + Tag: "bytes,214,opt,name=x214", + Filename: "test.proto", +} + +var E_X215 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 215, + Name: "testdata.x215", + Tag: "bytes,215,opt,name=x215", + Filename: "test.proto", +} + +var E_X216 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 216, + Name: "testdata.x216", + Tag: "bytes,216,opt,name=x216", + Filename: "test.proto", +} + +var E_X217 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 217, + Name: "testdata.x217", + Tag: "bytes,217,opt,name=x217", + Filename: "test.proto", +} + +var E_X218 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 218, + Name: "testdata.x218", + Tag: "bytes,218,opt,name=x218", + Filename: "test.proto", +} + +var E_X219 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 219, + Name: "testdata.x219", + Tag: "bytes,219,opt,name=x219", + Filename: "test.proto", +} + +var E_X220 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 220, + Name: "testdata.x220", + Tag: "bytes,220,opt,name=x220", + Filename: "test.proto", +} + +var E_X221 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 221, + Name: "testdata.x221", + Tag: "bytes,221,opt,name=x221", + Filename: "test.proto", +} + +var E_X222 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 222, + Name: "testdata.x222", + Tag: "bytes,222,opt,name=x222", + Filename: "test.proto", +} + +var E_X223 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 223, + Name: "testdata.x223", + Tag: "bytes,223,opt,name=x223", + Filename: "test.proto", +} + +var E_X224 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 224, + Name: "testdata.x224", + Tag: "bytes,224,opt,name=x224", + Filename: "test.proto", +} + +var E_X225 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 225, + Name: "testdata.x225", + Tag: "bytes,225,opt,name=x225", + Filename: "test.proto", +} + +var E_X226 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 226, + Name: "testdata.x226", + Tag: "bytes,226,opt,name=x226", + Filename: "test.proto", +} + +var E_X227 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 227, + Name: "testdata.x227", + Tag: "bytes,227,opt,name=x227", + Filename: "test.proto", +} + +var E_X228 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 228, + Name: "testdata.x228", + Tag: "bytes,228,opt,name=x228", + Filename: "test.proto", +} + +var E_X229 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 229, + Name: "testdata.x229", + Tag: "bytes,229,opt,name=x229", + Filename: "test.proto", +} + +var E_X230 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 230, + Name: "testdata.x230", + Tag: "bytes,230,opt,name=x230", + Filename: "test.proto", +} + +var E_X231 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 231, + Name: "testdata.x231", + Tag: "bytes,231,opt,name=x231", + Filename: "test.proto", +} + +var E_X232 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 232, + Name: "testdata.x232", + Tag: "bytes,232,opt,name=x232", + Filename: "test.proto", +} + +var E_X233 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 233, + Name: "testdata.x233", + Tag: "bytes,233,opt,name=x233", + Filename: "test.proto", +} + +var E_X234 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 234, + Name: "testdata.x234", + Tag: "bytes,234,opt,name=x234", + Filename: "test.proto", +} + +var E_X235 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 235, + Name: "testdata.x235", + Tag: "bytes,235,opt,name=x235", + Filename: "test.proto", +} + +var E_X236 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 236, + Name: "testdata.x236", + Tag: "bytes,236,opt,name=x236", + Filename: "test.proto", +} + +var E_X237 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 237, + Name: "testdata.x237", + Tag: "bytes,237,opt,name=x237", + Filename: "test.proto", +} + +var E_X238 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 238, + Name: "testdata.x238", + Tag: "bytes,238,opt,name=x238", + Filename: "test.proto", +} + +var E_X239 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 239, + Name: "testdata.x239", + Tag: "bytes,239,opt,name=x239", + Filename: "test.proto", +} + +var E_X240 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 240, + Name: "testdata.x240", + Tag: "bytes,240,opt,name=x240", + Filename: "test.proto", +} + +var E_X241 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 241, + Name: "testdata.x241", + Tag: "bytes,241,opt,name=x241", + Filename: "test.proto", +} + +var E_X242 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 242, + Name: "testdata.x242", + Tag: "bytes,242,opt,name=x242", + Filename: "test.proto", +} + +var E_X243 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 243, + Name: "testdata.x243", + Tag: "bytes,243,opt,name=x243", + Filename: "test.proto", +} + +var E_X244 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 244, + Name: "testdata.x244", + Tag: "bytes,244,opt,name=x244", + Filename: "test.proto", +} + +var E_X245 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 245, + Name: "testdata.x245", + Tag: "bytes,245,opt,name=x245", + Filename: "test.proto", +} + +var E_X246 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 246, + Name: "testdata.x246", + Tag: "bytes,246,opt,name=x246", + Filename: "test.proto", +} + +var E_X247 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 247, + Name: "testdata.x247", + Tag: "bytes,247,opt,name=x247", + Filename: "test.proto", +} + +var E_X248 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 248, + Name: "testdata.x248", + Tag: "bytes,248,opt,name=x248", + Filename: "test.proto", +} + +var E_X249 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 249, + Name: "testdata.x249", + Tag: "bytes,249,opt,name=x249", + Filename: "test.proto", +} + +var E_X250 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 250, + Name: "testdata.x250", + Tag: "bytes,250,opt,name=x250", + Filename: "test.proto", +} + +func init() { + proto.RegisterType((*GoEnum)(nil), "testdata.GoEnum") + proto.RegisterType((*GoTestField)(nil), "testdata.GoTestField") + proto.RegisterType((*GoTest)(nil), "testdata.GoTest") + proto.RegisterType((*GoTest_RequiredGroup)(nil), "testdata.GoTest.RequiredGroup") + proto.RegisterType((*GoTest_RepeatedGroup)(nil), "testdata.GoTest.RepeatedGroup") + proto.RegisterType((*GoTest_OptionalGroup)(nil), "testdata.GoTest.OptionalGroup") + proto.RegisterType((*GoTestRequiredGroupField)(nil), "testdata.GoTestRequiredGroupField") + proto.RegisterType((*GoTestRequiredGroupField_Group)(nil), "testdata.GoTestRequiredGroupField.Group") + proto.RegisterType((*GoSkipTest)(nil), "testdata.GoSkipTest") + proto.RegisterType((*GoSkipTest_SkipGroup)(nil), "testdata.GoSkipTest.SkipGroup") + proto.RegisterType((*NonPackedTest)(nil), "testdata.NonPackedTest") + proto.RegisterType((*PackedTest)(nil), "testdata.PackedTest") + proto.RegisterType((*MaxTag)(nil), "testdata.MaxTag") + proto.RegisterType((*OldMessage)(nil), "testdata.OldMessage") + proto.RegisterType((*OldMessage_Nested)(nil), "testdata.OldMessage.Nested") + proto.RegisterType((*NewMessage)(nil), "testdata.NewMessage") + proto.RegisterType((*NewMessage_Nested)(nil), "testdata.NewMessage.Nested") + proto.RegisterType((*InnerMessage)(nil), "testdata.InnerMessage") + proto.RegisterType((*OtherMessage)(nil), "testdata.OtherMessage") + proto.RegisterType((*RequiredInnerMessage)(nil), "testdata.RequiredInnerMessage") + proto.RegisterType((*MyMessage)(nil), "testdata.MyMessage") + proto.RegisterType((*MyMessage_SomeGroup)(nil), "testdata.MyMessage.SomeGroup") + proto.RegisterType((*Ext)(nil), "testdata.Ext") + proto.RegisterType((*ComplexExtension)(nil), "testdata.ComplexExtension") + proto.RegisterType((*DefaultsMessage)(nil), "testdata.DefaultsMessage") + proto.RegisterType((*MyMessageSet)(nil), "testdata.MyMessageSet") + proto.RegisterType((*Empty)(nil), "testdata.Empty") + proto.RegisterType((*MessageList)(nil), "testdata.MessageList") + proto.RegisterType((*MessageList_Message)(nil), "testdata.MessageList.Message") + proto.RegisterType((*Strings)(nil), "testdata.Strings") + proto.RegisterType((*Defaults)(nil), "testdata.Defaults") + proto.RegisterType((*SubDefaults)(nil), "testdata.SubDefaults") + proto.RegisterType((*RepeatedEnum)(nil), "testdata.RepeatedEnum") + proto.RegisterType((*MoreRepeated)(nil), "testdata.MoreRepeated") + proto.RegisterType((*GroupOld)(nil), "testdata.GroupOld") + proto.RegisterType((*GroupOld_G)(nil), "testdata.GroupOld.G") + proto.RegisterType((*GroupNew)(nil), "testdata.GroupNew") + proto.RegisterType((*GroupNew_G)(nil), "testdata.GroupNew.G") + proto.RegisterType((*FloatingPoint)(nil), "testdata.FloatingPoint") + proto.RegisterType((*MessageWithMap)(nil), "testdata.MessageWithMap") + proto.RegisterType((*Oneof)(nil), "testdata.Oneof") + proto.RegisterType((*Oneof_F_Group)(nil), "testdata.Oneof.F_Group") + proto.RegisterType((*Communique)(nil), "testdata.Communique") + proto.RegisterEnum("testdata.FOO", FOO_name, FOO_value) + proto.RegisterEnum("testdata.GoTest_KIND", GoTest_KIND_name, GoTest_KIND_value) + proto.RegisterEnum("testdata.MyMessage_Color", MyMessage_Color_name, MyMessage_Color_value) + proto.RegisterEnum("testdata.DefaultsMessage_DefaultsEnum", DefaultsMessage_DefaultsEnum_name, DefaultsMessage_DefaultsEnum_value) + proto.RegisterEnum("testdata.Defaults_Color", Defaults_Color_name, Defaults_Color_value) + proto.RegisterEnum("testdata.RepeatedEnum_Color", RepeatedEnum_Color_name, RepeatedEnum_Color_value) + proto.RegisterExtension(E_Ext_More) + proto.RegisterExtension(E_Ext_Text) + proto.RegisterExtension(E_Ext_Number) + proto.RegisterExtension(E_Greeting) + proto.RegisterExtension(E_Complex) + proto.RegisterExtension(E_RComplex) + proto.RegisterExtension(E_NoDefaultDouble) + proto.RegisterExtension(E_NoDefaultFloat) + proto.RegisterExtension(E_NoDefaultInt32) + proto.RegisterExtension(E_NoDefaultInt64) + proto.RegisterExtension(E_NoDefaultUint32) + proto.RegisterExtension(E_NoDefaultUint64) + proto.RegisterExtension(E_NoDefaultSint32) + proto.RegisterExtension(E_NoDefaultSint64) + proto.RegisterExtension(E_NoDefaultFixed32) + proto.RegisterExtension(E_NoDefaultFixed64) + proto.RegisterExtension(E_NoDefaultSfixed32) + proto.RegisterExtension(E_NoDefaultSfixed64) + proto.RegisterExtension(E_NoDefaultBool) + proto.RegisterExtension(E_NoDefaultString) + proto.RegisterExtension(E_NoDefaultBytes) + proto.RegisterExtension(E_NoDefaultEnum) + proto.RegisterExtension(E_DefaultDouble) + proto.RegisterExtension(E_DefaultFloat) + proto.RegisterExtension(E_DefaultInt32) + proto.RegisterExtension(E_DefaultInt64) + proto.RegisterExtension(E_DefaultUint32) + proto.RegisterExtension(E_DefaultUint64) + proto.RegisterExtension(E_DefaultSint32) + proto.RegisterExtension(E_DefaultSint64) + proto.RegisterExtension(E_DefaultFixed32) + proto.RegisterExtension(E_DefaultFixed64) + proto.RegisterExtension(E_DefaultSfixed32) + proto.RegisterExtension(E_DefaultSfixed64) + proto.RegisterExtension(E_DefaultBool) + proto.RegisterExtension(E_DefaultString) + proto.RegisterExtension(E_DefaultBytes) + proto.RegisterExtension(E_DefaultEnum) + proto.RegisterExtension(E_X201) + proto.RegisterExtension(E_X202) + proto.RegisterExtension(E_X203) + proto.RegisterExtension(E_X204) + proto.RegisterExtension(E_X205) + proto.RegisterExtension(E_X206) + proto.RegisterExtension(E_X207) + proto.RegisterExtension(E_X208) + proto.RegisterExtension(E_X209) + proto.RegisterExtension(E_X210) + proto.RegisterExtension(E_X211) + proto.RegisterExtension(E_X212) + proto.RegisterExtension(E_X213) + proto.RegisterExtension(E_X214) + proto.RegisterExtension(E_X215) + proto.RegisterExtension(E_X216) + proto.RegisterExtension(E_X217) + proto.RegisterExtension(E_X218) + proto.RegisterExtension(E_X219) + proto.RegisterExtension(E_X220) + proto.RegisterExtension(E_X221) + proto.RegisterExtension(E_X222) + proto.RegisterExtension(E_X223) + proto.RegisterExtension(E_X224) + proto.RegisterExtension(E_X225) + proto.RegisterExtension(E_X226) + proto.RegisterExtension(E_X227) + proto.RegisterExtension(E_X228) + proto.RegisterExtension(E_X229) + proto.RegisterExtension(E_X230) + proto.RegisterExtension(E_X231) + proto.RegisterExtension(E_X232) + proto.RegisterExtension(E_X233) + proto.RegisterExtension(E_X234) + proto.RegisterExtension(E_X235) + proto.RegisterExtension(E_X236) + proto.RegisterExtension(E_X237) + proto.RegisterExtension(E_X238) + proto.RegisterExtension(E_X239) + proto.RegisterExtension(E_X240) + proto.RegisterExtension(E_X241) + proto.RegisterExtension(E_X242) + proto.RegisterExtension(E_X243) + proto.RegisterExtension(E_X244) + proto.RegisterExtension(E_X245) + proto.RegisterExtension(E_X246) + proto.RegisterExtension(E_X247) + proto.RegisterExtension(E_X248) + proto.RegisterExtension(E_X249) + proto.RegisterExtension(E_X250) +} + +func init() { proto.RegisterFile("test.proto", fileDescriptor0) } + +var fileDescriptor0 = []byte{ + // 4453 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x5a, 0xc9, 0x77, 0xdb, 0x48, + 0x7a, 0x37, 0xc0, 0xfd, 0x23, 0x25, 0x42, 0x65, 0xb5, 0x9b, 0x96, 0xbc, 0xc0, 0x9c, 0xe9, 0x6e, + 0x7a, 0xd3, 0x48, 0x20, 0x44, 0xdb, 0x74, 0xa7, 0xdf, 0xf3, 0x42, 0xca, 0x7a, 0x63, 0x89, 0x0a, + 0xa4, 0xee, 0x7e, 0xd3, 0x39, 0xf0, 0x51, 0x22, 0x44, 0xb3, 0x4d, 0x02, 0x34, 0x09, 0xc5, 0x52, + 0x72, 0xe9, 0x4b, 0x72, 0xcd, 0x76, 0xc9, 0x35, 0xa7, 0x9c, 0x92, 0xbc, 0x97, 0x7f, 0x22, 0xe9, + 0xee, 0x59, 0x7b, 0xd6, 0xac, 0x93, 0x7d, 0x99, 0xec, 0xdb, 0x4c, 0x92, 0x4b, 0xcf, 0xab, 0xaf, + 0x0a, 0x40, 0x01, 0x24, 0x20, 0xf9, 0x24, 0x56, 0xd5, 0xef, 0xf7, 0xd5, 0xf6, 0xab, 0xef, 0xab, + 0xaf, 0x20, 0x00, 0xc7, 0x9c, 0x38, 0x2b, 0xa3, 0xb1, 0xed, 0xd8, 0x24, 0x4b, 0x7f, 0x77, 0x3b, + 0x4e, 0xa7, 0x7c, 0x1d, 0xd2, 0x1b, 0x76, 0xc3, 0x3a, 0x1a, 0x92, 0xab, 0x90, 0x38, 0xb4, 0xed, + 0x92, 0xa4, 0xca, 0x95, 0x79, 0x6d, 0x6e, 0xc5, 0x45, 0xac, 0x34, 0x5b, 0x2d, 0x83, 0xb6, 0x94, + 0xef, 0x40, 0x7e, 0xc3, 0xde, 0x33, 0x27, 0x4e, 0xb3, 0x6f, 0x0e, 0xba, 0x64, 0x11, 0x52, 0x4f, + 0x3b, 0xfb, 0xe6, 0x00, 0x19, 0x39, 0x83, 0x15, 0x08, 0x81, 0xe4, 0xde, 0xc9, 0xc8, 0x2c, 0xc9, + 0x58, 0x89, 0xbf, 0xcb, 0xbf, 0x72, 0x85, 0x76, 0x42, 0x99, 0xe4, 0x3a, 0x24, 0xbf, 0xdc, 0xb7, + 0xba, 0xbc, 0x97, 0xd7, 0xfc, 0x5e, 0x58, 0xfb, 0xca, 0x97, 0x37, 0xb7, 0x1f, 0x1b, 0x08, 0xa1, + 0xf6, 0xf7, 0x3a, 0xfb, 0x03, 0x6a, 0x4a, 0xa2, 0xf6, 0xb1, 0x40, 0x6b, 0x77, 0x3a, 0xe3, 0xce, + 0xb0, 0x94, 0x50, 0xa5, 0x4a, 0xca, 0x60, 0x05, 0x72, 0x1f, 0xe6, 0x0c, 0xf3, 0xc5, 0x51, 0x7f, + 0x6c, 0x76, 0x71, 0x70, 0xa5, 0xa4, 0x2a, 0x57, 0xf2, 0xd3, 0xf6, 0xb1, 0xd1, 0x08, 0x62, 0x19, + 0x79, 0x64, 0x76, 0x1c, 0x97, 0x9c, 0x52, 0x13, 0xb1, 0x64, 0x01, 0x4b, 0xc9, 0xad, 0x91, 0xd3, + 0xb7, 0xad, 0xce, 0x80, 0x91, 0xd3, 0xaa, 0x14, 0x43, 0x0e, 0x60, 0xc9, 0x9b, 0x50, 0x6c, 0xb6, + 0x1f, 0xda, 0xf6, 0xa0, 0x3d, 0xe6, 0x23, 0x2a, 0x81, 0x2a, 0x57, 0xb2, 0xc6, 0x5c, 0x93, 0xd6, + 0xba, 0xc3, 0x24, 0x15, 0x50, 0x9a, 0xed, 0x4d, 0xcb, 0xa9, 0x6a, 0x3e, 0x30, 0xaf, 0xca, 0x95, + 0x94, 0x31, 0xdf, 0xc4, 0xea, 0x29, 0x64, 0x4d, 0xf7, 0x91, 0x05, 0x55, 0xae, 0x24, 0x18, 0xb2, + 0xa6, 0x7b, 0xc8, 0x5b, 0x40, 0x9a, 0xed, 0x66, 0xff, 0xd8, 0xec, 0x8a, 0x56, 0xe7, 0x54, 0xb9, + 0x92, 0x31, 0x94, 0x26, 0x6f, 0x98, 0x81, 0x16, 0x2d, 0xcf, 0xab, 0x72, 0x25, 0xed, 0xa2, 0x05, + 0xdb, 0x37, 0x60, 0xa1, 0xd9, 0x7e, 0xb7, 0x1f, 0x1c, 0x70, 0x51, 0x95, 0x2b, 0x73, 0x46, 0xb1, + 0xc9, 0xea, 0xa7, 0xb1, 0xa2, 0x61, 0x45, 0x95, 0x2b, 0x49, 0x8e, 0x15, 0xec, 0xe2, 0xec, 0x9a, + 0x03, 0xbb, 0xe3, 0xf8, 0xd0, 0x05, 0x55, 0xae, 0xc8, 0xc6, 0x7c, 0x13, 0xab, 0x83, 0x56, 0x1f, + 0xdb, 0x47, 0xfb, 0x03, 0xd3, 0x87, 0x12, 0x55, 0xae, 0x48, 0x46, 0xb1, 0xc9, 0xea, 0x83, 0xd8, + 0x5d, 0x67, 0xdc, 0xb7, 0x7a, 0x3e, 0xf6, 0x3c, 0xea, 0xb7, 0xd8, 0x64, 0xf5, 0xc1, 0x11, 0x3c, + 0x3c, 0x71, 0xcc, 0x89, 0x0f, 0x35, 0x55, 0xb9, 0x52, 0x30, 0xe6, 0x9b, 0x58, 0x1d, 0xb2, 0x1a, + 0x5a, 0x83, 0x43, 0x55, 0xae, 0x2c, 0x50, 0xab, 0x33, 0xd6, 0x60, 0x37, 0xb4, 0x06, 0x3d, 0x55, + 0xae, 0x10, 0x8e, 0x15, 0xd6, 0x40, 0xd4, 0x0c, 0x13, 0x62, 0x69, 0x51, 0x4d, 0x08, 0x9a, 0x61, + 0x95, 0x41, 0xcd, 0x70, 0xe0, 0x6b, 0x6a, 0x42, 0xd4, 0x4c, 0x08, 0x89, 0x9d, 0x73, 0xe4, 0x05, + 0x35, 0x21, 0x6a, 0x86, 0x23, 0x43, 0x9a, 0xe1, 0xd8, 0xd7, 0xd5, 0x44, 0x50, 0x33, 0x53, 0x68, + 0xd1, 0x72, 0x49, 0x4d, 0x04, 0x35, 0xc3, 0xd1, 0x41, 0xcd, 0x70, 0xf0, 0x45, 0x35, 0x11, 0xd0, + 0x4c, 0x18, 0x2b, 0x1a, 0x5e, 0x52, 0x13, 0x01, 0xcd, 0x88, 0xb3, 0x73, 0x35, 0xc3, 0xa1, 0xcb, + 0x6a, 0x42, 0xd4, 0x8c, 0x68, 0xd5, 0xd3, 0x0c, 0x87, 0x5e, 0x52, 0x13, 0x01, 0xcd, 0x88, 0x58, + 0x4f, 0x33, 0x1c, 0x7b, 0x59, 0x4d, 0x04, 0x34, 0xc3, 0xb1, 0xd7, 0x45, 0xcd, 0x70, 0xe8, 0xc7, + 0x92, 0x9a, 0x10, 0x45, 0xc3, 0xa1, 0x37, 0x03, 0xa2, 0xe1, 0xd8, 0x4f, 0x28, 0x56, 0x54, 0x4d, + 0x18, 0x2c, 0xae, 0xc2, 0xa7, 0x14, 0x2c, 0xca, 0x86, 0x83, 0x7d, 0xd9, 0xd8, 0xdc, 0x05, 0x95, + 0xae, 0xa8, 0x92, 0x27, 0x1b, 0xd7, 0x2f, 0x89, 0xb2, 0xf1, 0x80, 0x57, 0xd1, 0xd5, 0x72, 0xd9, + 0x4c, 0x21, 0x6b, 0xba, 0x8f, 0x54, 0x55, 0xc9, 0x97, 0x8d, 0x87, 0x0c, 0xc8, 0xc6, 0xc3, 0x5e, + 0x53, 0x25, 0x51, 0x36, 0x33, 0xd0, 0xa2, 0xe5, 0xb2, 0x2a, 0x89, 0xb2, 0xf1, 0xd0, 0xa2, 0x6c, + 0x3c, 0xf0, 0x17, 0x54, 0x49, 0x90, 0xcd, 0x34, 0x56, 0x34, 0xfc, 0x45, 0x55, 0x12, 0x64, 0x13, + 0x9c, 0x1d, 0x93, 0x8d, 0x07, 0x7d, 0x43, 0x95, 0x7c, 0xd9, 0x04, 0xad, 0x72, 0xd9, 0x78, 0xd0, + 0x37, 0x55, 0x49, 0x90, 0x4d, 0x10, 0xcb, 0x65, 0xe3, 0x61, 0xdf, 0xc2, 0xf8, 0xe6, 0xca, 0xc6, + 0xc3, 0x0a, 0xb2, 0xf1, 0xa0, 0xbf, 0x43, 0x63, 0xa1, 0x27, 0x1b, 0x0f, 0x2a, 0xca, 0xc6, 0xc3, + 0xfe, 0x2e, 0xc5, 0xfa, 0xb2, 0x99, 0x06, 0x8b, 0xab, 0xf0, 0x7b, 0x14, 0xec, 0xcb, 0xc6, 0x03, + 0xaf, 0xe0, 0x20, 0xa8, 0x6c, 0xba, 0xe6, 0x61, 0xe7, 0x68, 0x40, 0x25, 0x56, 0xa1, 0xba, 0xa9, + 0x27, 0x9d, 0xf1, 0x91, 0x49, 0x47, 0x62, 0xdb, 0x83, 0xc7, 0x6e, 0x1b, 0x59, 0xa1, 0xc6, 0x99, + 0x7c, 0x7c, 0xc2, 0x75, 0xaa, 0x9f, 0xba, 0x5c, 0xd5, 0x8c, 0x22, 0xd3, 0xd0, 0x34, 0xbe, 0xa6, + 0x0b, 0xf8, 0x1b, 0x54, 0x45, 0x75, 0xb9, 0xa6, 0x33, 0x7c, 0x4d, 0xf7, 0xf1, 0x55, 0x38, 0xef, + 0x4b, 0xc9, 0x67, 0xdc, 0xa4, 0x5a, 0xaa, 0x27, 0xaa, 0xda, 0xaa, 0xb1, 0xe0, 0x0a, 0x6a, 0x16, + 0x29, 0xd0, 0xcd, 0x2d, 0x2a, 0xa9, 0x7a, 0xa2, 0xa6, 0x7b, 0x24, 0xb1, 0x27, 0x8d, 0xca, 0x90, + 0x0b, 0xcb, 0xe7, 0xdc, 0xa6, 0xca, 0xaa, 0x27, 0xab, 0xda, 0xea, 0xaa, 0xa1, 0x70, 0x7d, 0xcd, + 0xe0, 0x04, 0xfa, 0x59, 0xa1, 0x0a, 0xab, 0x27, 0x6b, 0xba, 0xc7, 0x09, 0xf6, 0xb3, 0xe0, 0x0a, + 0xcd, 0xa7, 0x7c, 0x89, 0x2a, 0xad, 0x9e, 0xae, 0xae, 0xe9, 0x6b, 0xeb, 0xf7, 0x8c, 0x22, 0x53, + 0x9c, 0xcf, 0xd1, 0x69, 0x3f, 0x5c, 0x72, 0x3e, 0x69, 0x95, 0x6a, 0xae, 0x9e, 0xd6, 0xee, 0xac, + 0xdd, 0xd5, 0xee, 0x1a, 0x0a, 0xd7, 0x9e, 0xcf, 0x7a, 0x87, 0xb2, 0xb8, 0xf8, 0x7c, 0xd6, 0x1a, + 0x55, 0x5f, 0x5d, 0x79, 0x66, 0x0e, 0x06, 0xf6, 0x2d, 0xb5, 0xfc, 0xd2, 0x1e, 0x0f, 0xba, 0xd7, + 0xca, 0x60, 0x28, 0x5c, 0x8f, 0x62, 0xaf, 0x0b, 0xae, 0x20, 0x7d, 0xfa, 0xaf, 0xd1, 0x7b, 0x58, + 0xa1, 0x9e, 0x79, 0xd8, 0xef, 0x59, 0xf6, 0xc4, 0x34, 0x8a, 0x4c, 0x9a, 0xa1, 0x35, 0xd9, 0x0d, + 0xaf, 0xe3, 0xaf, 0x53, 0xda, 0x42, 0x3d, 0x71, 0xbb, 0xaa, 0xd1, 0x9e, 0x66, 0xad, 0xe3, 0x6e, + 0x78, 0x1d, 0x7f, 0x83, 0x72, 0x48, 0x3d, 0x71, 0xbb, 0xa6, 0x73, 0x8e, 0xb8, 0x8e, 0x77, 0xe0, + 0x42, 0x28, 0x2e, 0xb6, 0x47, 0x9d, 0x83, 0xe7, 0x66, 0xb7, 0xa4, 0xd1, 0xf0, 0xf8, 0x50, 0x56, + 0x24, 0xe3, 0x7c, 0x20, 0x44, 0xee, 0x60, 0x33, 0xb9, 0x07, 0xaf, 0x87, 0x03, 0xa5, 0xcb, 0xac, + 0xd2, 0x78, 0x89, 0xcc, 0xc5, 0x60, 0xcc, 0x0c, 0x51, 0x05, 0x07, 0xec, 0x52, 0x75, 0x1a, 0x40, + 0x7d, 0xaa, 0xef, 0x89, 0x39, 0xf5, 0x67, 0xe0, 0xe2, 0x74, 0x28, 0x75, 0xc9, 0xeb, 0x34, 0xa2, + 0x22, 0xf9, 0x42, 0x38, 0xaa, 0x4e, 0xd1, 0x67, 0xf4, 0x5d, 0xa3, 0x21, 0x56, 0xa4, 0x4f, 0xf5, + 0x7e, 0x1f, 0x4a, 0x53, 0xc1, 0xd6, 0x65, 0xdf, 0xa1, 0x31, 0x17, 0xd9, 0xaf, 0x85, 0xe2, 0x6e, + 0x98, 0x3c, 0xa3, 0xeb, 0xbb, 0x34, 0x08, 0x0b, 0xe4, 0xa9, 0x9e, 0x71, 0xc9, 0x82, 0xe1, 0xd8, + 0xe5, 0xde, 0xa3, 0x51, 0x99, 0x2f, 0x59, 0x20, 0x32, 0x8b, 0xfd, 0x86, 0xe2, 0xb3, 0xcb, 0xad, + 0xd3, 0x30, 0xcd, 0xfb, 0x0d, 0x86, 0x6a, 0x4e, 0x7e, 0x9b, 0x92, 0x77, 0x67, 0xcf, 0xf8, 0xc7, + 0x09, 0x1a, 0x60, 0x39, 0x7b, 0x77, 0xd6, 0x94, 0x3d, 0xf6, 0x8c, 0x29, 0xff, 0x84, 0xb2, 0x89, + 0xc0, 0x9e, 0x9a, 0xf3, 0x63, 0x98, 0x73, 0x6f, 0x75, 0xbd, 0xb1, 0x7d, 0x34, 0x2a, 0x35, 0x55, + 0xb9, 0x02, 0xda, 0x95, 0xa9, 0xec, 0xc7, 0xbd, 0xe4, 0x6d, 0x50, 0x94, 0x11, 0x24, 0x31, 0x2b, + 0xcc, 0x2e, 0xb3, 0xb2, 0xa3, 0x26, 0x22, 0xac, 0x30, 0x94, 0x67, 0x45, 0x20, 0x51, 0x2b, 0xae, + 0xd3, 0x67, 0x56, 0x3e, 0x50, 0xa5, 0x99, 0x56, 0xdc, 0x10, 0xc0, 0xad, 0x04, 0x48, 0x4b, 0xeb, + 0x7e, 0xbe, 0x85, 0xed, 0xe4, 0x8b, 0xe1, 0x04, 0x6c, 0x03, 0xef, 0xcf, 0xc1, 0x4a, 0x46, 0x13, + 0x06, 0x37, 0x4d, 0xfb, 0xd9, 0x08, 0x5a, 0x60, 0x34, 0xd3, 0xb4, 0x9f, 0x9b, 0x41, 0x2b, 0xff, + 0xa6, 0x04, 0x49, 0x9a, 0x4f, 0x92, 0x2c, 0x24, 0xdf, 0x6b, 0x6d, 0x3e, 0x56, 0xce, 0xd1, 0x5f, + 0x0f, 0x5b, 0xad, 0xa7, 0x8a, 0x44, 0x72, 0x90, 0x7a, 0xf8, 0x95, 0xbd, 0xc6, 0xae, 0x22, 0x93, + 0x22, 0xe4, 0x9b, 0x9b, 0xdb, 0x1b, 0x0d, 0x63, 0xc7, 0xd8, 0xdc, 0xde, 0x53, 0x12, 0xb4, 0xad, + 0xf9, 0xb4, 0xf5, 0x60, 0x4f, 0x49, 0x92, 0x0c, 0x24, 0x68, 0x5d, 0x8a, 0x00, 0xa4, 0x77, 0xf7, + 0x8c, 0xcd, 0xed, 0x0d, 0x25, 0x4d, 0xad, 0xec, 0x6d, 0x6e, 0x35, 0x94, 0x0c, 0x45, 0xee, 0xbd, + 0xbb, 0xf3, 0xb4, 0xa1, 0x64, 0xe9, 0xcf, 0x07, 0x86, 0xf1, 0xe0, 0x2b, 0x4a, 0x8e, 0x92, 0xb6, + 0x1e, 0xec, 0x28, 0x80, 0xcd, 0x0f, 0x1e, 0x3e, 0x6d, 0x28, 0x79, 0x52, 0x80, 0x6c, 0xf3, 0xdd, + 0xed, 0x47, 0x7b, 0x9b, 0xad, 0x6d, 0xa5, 0x50, 0x3e, 0x81, 0x12, 0x5b, 0xe6, 0xc0, 0x2a, 0xb2, + 0xa4, 0xf0, 0x1d, 0x48, 0xb1, 0x9d, 0x91, 0x50, 0x25, 0x95, 0xf0, 0xce, 0x4c, 0x53, 0x56, 0xd8, + 0x1e, 0x31, 0xda, 0xd2, 0x65, 0x48, 0xb1, 0x55, 0x5a, 0x84, 0x14, 0x5b, 0x1d, 0x19, 0x53, 0x45, + 0x56, 0x28, 0xff, 0x96, 0x0c, 0xb0, 0x61, 0xef, 0x3e, 0xef, 0x8f, 0x30, 0x21, 0xbf, 0x0c, 0x30, + 0x79, 0xde, 0x1f, 0xb5, 0x51, 0xf5, 0x3c, 0xa9, 0xcc, 0xd1, 0x1a, 0xf4, 0x77, 0xe4, 0x1a, 0x14, + 0xb0, 0xf9, 0x90, 0x79, 0x21, 0xcc, 0x25, 0x33, 0x46, 0x9e, 0xd6, 0x71, 0xc7, 0x14, 0x84, 0xd4, + 0x74, 0x4c, 0x21, 0xd3, 0x02, 0xa4, 0xa6, 0x93, 0xab, 0x80, 0xc5, 0xf6, 0x04, 0x23, 0x0a, 0xa6, + 0x8d, 0x39, 0x03, 0xfb, 0x65, 0x31, 0x86, 0xbc, 0x0d, 0xd8, 0x27, 0x9b, 0x77, 0x71, 0xfa, 0x74, + 0xb8, 0xc3, 0x5d, 0xa1, 0x3f, 0xd8, 0x6c, 0x7d, 0xc2, 0x52, 0x0b, 0x72, 0x5e, 0x3d, 0xed, 0x0b, + 0x6b, 0xf9, 0x8c, 0x14, 0x9c, 0x11, 0x60, 0x95, 0x37, 0x25, 0x06, 0xe0, 0xa3, 0x59, 0xc0, 0xd1, + 0x30, 0x12, 0x1b, 0x4e, 0xf9, 0x32, 0xcc, 0x6d, 0xdb, 0x16, 0x3b, 0xbd, 0xb8, 0x4a, 0x05, 0x90, + 0x3a, 0x25, 0x09, 0xb3, 0x27, 0xa9, 0x53, 0xbe, 0x02, 0x20, 0xb4, 0x29, 0x20, 0xed, 0xb3, 0x36, + 0xf4, 0x01, 0xd2, 0x7e, 0xf9, 0x26, 0xa4, 0xb7, 0x3a, 0xc7, 0x7b, 0x9d, 0x1e, 0xb9, 0x06, 0x30, + 0xe8, 0x4c, 0x9c, 0xf6, 0x21, 0xee, 0xc3, 0xe7, 0x9f, 0x7f, 0xfe, 0xb9, 0x84, 0x97, 0xbd, 0x1c, + 0xad, 0x65, 0xfb, 0xf1, 0x02, 0xa0, 0x35, 0xe8, 0x6e, 0x99, 0x93, 0x49, 0xa7, 0x67, 0x92, 0x2a, + 0xa4, 0x2d, 0x73, 0x42, 0xa3, 0x9d, 0x84, 0xef, 0x08, 0xcb, 0xfe, 0x2a, 0xf8, 0xa8, 0x95, 0x6d, + 0x84, 0x18, 0x1c, 0x4a, 0x14, 0x48, 0x58, 0x47, 0x43, 0x7c, 0x27, 0x49, 0x19, 0xf4, 0xe7, 0xd2, + 0x25, 0x48, 0x33, 0x0c, 0x21, 0x90, 0xb4, 0x3a, 0x43, 0xb3, 0xc4, 0xfa, 0xc5, 0xdf, 0xe5, 0x5f, + 0x95, 0x00, 0xb6, 0xcd, 0x97, 0x67, 0xe8, 0xd3, 0x47, 0xc5, 0xf4, 0x99, 0x60, 0x7d, 0xde, 0x8f, + 0xeb, 0x93, 0xea, 0xec, 0xd0, 0xb6, 0xbb, 0x6d, 0xb6, 0xc5, 0xec, 0x49, 0x27, 0x47, 0x6b, 0x70, + 0xd7, 0xca, 0x1f, 0x40, 0x61, 0xd3, 0xb2, 0xcc, 0xb1, 0x3b, 0x26, 0x02, 0xc9, 0x67, 0xf6, 0xc4, + 0xe1, 0x6f, 0x4b, 0xf8, 0x9b, 0x94, 0x20, 0x39, 0xb2, 0xc7, 0x0e, 0x9b, 0x67, 0x3d, 0xa9, 0xaf, + 0xae, 0xae, 0x1a, 0x58, 0x43, 0x2e, 0x41, 0xee, 0xc0, 0xb6, 0x2c, 0xf3, 0x80, 0x4e, 0x22, 0x81, + 0x69, 0x8d, 0x5f, 0x51, 0xfe, 0x65, 0x09, 0x0a, 0x2d, 0xe7, 0x99, 0x6f, 0x5c, 0x81, 0xc4, 0x73, + 0xf3, 0x04, 0x87, 0x97, 0x30, 0xe8, 0x4f, 0x7a, 0x54, 0x7e, 0xbe, 0x33, 0x38, 0x62, 0x6f, 0x4d, + 0x05, 0x83, 0x15, 0xc8, 0x05, 0x48, 0xbf, 0x34, 0xfb, 0xbd, 0x67, 0x0e, 0xda, 0x94, 0x0d, 0x5e, + 0x22, 0xb7, 0x20, 0xd5, 0xa7, 0x83, 0x2d, 0x25, 0x71, 0xbd, 0x2e, 0xf8, 0xeb, 0x25, 0xce, 0xc1, + 0x60, 0xa0, 0x1b, 0xd9, 0x6c, 0x57, 0xf9, 0xe8, 0xa3, 0x8f, 0x3e, 0x92, 0xcb, 0x87, 0xb0, 0xe8, + 0x1e, 0xde, 0xc0, 0x64, 0xb7, 0xa1, 0x34, 0x30, 0xed, 0xf6, 0x61, 0xdf, 0xea, 0x0c, 0x06, 0x27, + 0xed, 0x97, 0xb6, 0xd5, 0xee, 0x58, 0x6d, 0x7b, 0x72, 0xd0, 0x19, 0xe3, 0x02, 0x44, 0x77, 0xb1, + 0x38, 0x30, 0xed, 0x26, 0xa3, 0xbd, 0x6f, 0x5b, 0x0f, 0xac, 0x16, 0xe5, 0x94, 0xff, 0x20, 0x09, + 0xb9, 0xad, 0x13, 0xd7, 0xfa, 0x22, 0xa4, 0x0e, 0xec, 0x23, 0x8b, 0xad, 0x65, 0xca, 0x60, 0x05, + 0x6f, 0x8f, 0x64, 0x61, 0x8f, 0x16, 0x21, 0xf5, 0xe2, 0xc8, 0x76, 0x4c, 0x9c, 0x6e, 0xce, 0x60, + 0x05, 0xba, 0x5a, 0x23, 0xd3, 0x29, 0x25, 0x31, 0xb9, 0xa5, 0x3f, 0xfd, 0xf9, 0xa7, 0xce, 0x30, + 0x7f, 0xb2, 0x02, 0x69, 0x9b, 0xae, 0xfe, 0xa4, 0x94, 0xc6, 0x77, 0x35, 0x01, 0x2e, 0xee, 0x8a, + 0xc1, 0x51, 0x64, 0x13, 0x16, 0x5e, 0x9a, 0xed, 0xe1, 0xd1, 0xc4, 0x69, 0xf7, 0xec, 0x76, 0xd7, + 0x34, 0x47, 0xe6, 0xb8, 0x34, 0x87, 0x3d, 0x09, 0x3e, 0x61, 0xd6, 0x42, 0x1a, 0xf3, 0x2f, 0xcd, + 0xad, 0xa3, 0x89, 0xb3, 0x61, 0x3f, 0x46, 0x16, 0xa9, 0x42, 0x6e, 0x6c, 0x52, 0x4f, 0x40, 0x07, + 0x5b, 0x08, 0xf7, 0x1e, 0xa0, 0x66, 0xc7, 0xe6, 0x08, 0x2b, 0xc8, 0x3a, 0x64, 0xf7, 0xfb, 0xcf, + 0xcd, 0xc9, 0x33, 0xb3, 0x5b, 0xca, 0xa8, 0x52, 0x65, 0x5e, 0xbb, 0xe8, 0x73, 0xbc, 0x65, 0x5d, + 0x79, 0x64, 0x0f, 0xec, 0xb1, 0xe1, 0x41, 0xc9, 0x7d, 0xc8, 0x4d, 0xec, 0xa1, 0xc9, 0xf4, 0x9d, + 0xc5, 0xa0, 0x7a, 0x79, 0x16, 0x6f, 0xd7, 0x1e, 0x9a, 0xae, 0x07, 0x73, 0xf1, 0x64, 0x99, 0x0d, + 0x74, 0x9f, 0x5e, 0x9d, 0x4b, 0x80, 0x4f, 0x03, 0x74, 0x40, 0x78, 0x95, 0x26, 0x4b, 0x74, 0x40, + 0xbd, 0x43, 0x7a, 0x23, 0x2a, 0xe5, 0x31, 0xaf, 0xf4, 0xca, 0x4b, 0xb7, 0x20, 0xe7, 0x19, 0xf4, + 0x5d, 0x1f, 0x73, 0x37, 0x39, 0xf4, 0x07, 0xcc, 0xf5, 0x31, 0x5f, 0xf3, 0x06, 0xa4, 0x70, 0xd8, + 0x34, 0x42, 0x19, 0x0d, 0x1a, 0x10, 0x73, 0x90, 0xda, 0x30, 0x1a, 0x8d, 0x6d, 0x45, 0xc2, 0xd8, + 0xf8, 0xf4, 0xdd, 0x86, 0x22, 0x0b, 0x8a, 0xfd, 0x6d, 0x09, 0x12, 0x8d, 0x63, 0x54, 0x0b, 0x9d, + 0x86, 0x7b, 0xa2, 0xe9, 0x6f, 0xad, 0x06, 0xc9, 0xa1, 0x3d, 0x36, 0xc9, 0xf9, 0x19, 0xb3, 0x2c, + 0xf5, 0x70, 0xbf, 0x84, 0x57, 0xe4, 0xc6, 0xb1, 0x63, 0x20, 0x5e, 0x7b, 0x0b, 0x92, 0x8e, 0x79, + 0xec, 0xcc, 0xe6, 0x3d, 0x63, 0x1d, 0x50, 0x80, 0x76, 0x13, 0xd2, 0xd6, 0xd1, 0x70, 0xdf, 0x1c, + 0xcf, 0x86, 0xf6, 0x71, 0x7a, 0x1c, 0x52, 0x7e, 0x0f, 0x94, 0x47, 0xf6, 0x70, 0x34, 0x30, 0x8f, + 0x1b, 0xc7, 0x8e, 0x69, 0x4d, 0xfa, 0xb6, 0x45, 0xf5, 0x7c, 0xd8, 0x1f, 0xa3, 0x17, 0xc1, 0xb7, + 0x62, 0x2c, 0xd0, 0x53, 0x3d, 0x31, 0x0f, 0x6c, 0xab, 0xcb, 0x1d, 0x26, 0x2f, 0x51, 0xb4, 0xf3, + 0xac, 0x3f, 0xa6, 0x0e, 0x84, 0xfa, 0x79, 0x56, 0x28, 0x6f, 0x40, 0x91, 0xe7, 0x18, 0x13, 0xde, + 0x71, 0xf9, 0x06, 0x14, 0xdc, 0x2a, 0x7c, 0x38, 0xcf, 0x42, 0xf2, 0x83, 0x86, 0xd1, 0x52, 0xce, + 0xd1, 0x65, 0x6d, 0x6d, 0x37, 0x14, 0x89, 0xfe, 0xd8, 0x7b, 0xbf, 0x15, 0x58, 0xca, 0x4b, 0x50, + 0xf0, 0xc6, 0xbe, 0x6b, 0x3a, 0xd8, 0x42, 0x03, 0x42, 0xa6, 0x2e, 0x67, 0xa5, 0x72, 0x06, 0x52, + 0x8d, 0xe1, 0xc8, 0x39, 0x29, 0xff, 0x22, 0xe4, 0x39, 0xe8, 0x69, 0x7f, 0xe2, 0x90, 0x3b, 0x90, + 0x19, 0xf2, 0xf9, 0x4a, 0x78, 0xdd, 0x13, 0x35, 0xe5, 0xe3, 0xdc, 0xdf, 0x86, 0x8b, 0x5e, 0xaa, + 0x42, 0x46, 0xf0, 0xa5, 0xfc, 0xa8, 0xcb, 0xe2, 0x51, 0x67, 0x4e, 0x21, 0x21, 0x38, 0x85, 0xf2, + 0x16, 0x64, 0x58, 0x04, 0x9c, 0x60, 0x54, 0x67, 0xa9, 0x22, 0x13, 0x13, 0xdb, 0xf9, 0x3c, 0xab, + 0x63, 0x17, 0x95, 0xab, 0x90, 0x47, 0xc1, 0x72, 0x04, 0x73, 0x9d, 0x80, 0x55, 0x4c, 0x6e, 0xbf, + 0x9f, 0x82, 0xac, 0xbb, 0x52, 0x64, 0x19, 0xd2, 0x2c, 0x3f, 0x43, 0x53, 0xee, 0xfb, 0x41, 0x0a, + 0x33, 0x32, 0xb2, 0x0c, 0x19, 0x9e, 0x83, 0x71, 0xef, 0x2e, 0x57, 0x35, 0x23, 0xcd, 0x72, 0x2e, + 0xaf, 0xb1, 0xa6, 0xa3, 0x63, 0x62, 0x2f, 0x03, 0x69, 0x96, 0x55, 0x11, 0x15, 0x72, 0x5e, 0x1e, + 0x85, 0xfe, 0x98, 0x3f, 0x03, 0x64, 0xdd, 0xc4, 0x49, 0x40, 0xd4, 0x74, 0xf4, 0x58, 0x3c, 0xe7, + 0xcf, 0x36, 0xfd, 0xeb, 0x49, 0xd6, 0xcd, 0x86, 0xf0, 0xf9, 0xde, 0x4d, 0xf0, 0x33, 0x3c, 0xff, + 0xf1, 0x01, 0x35, 0x1d, 0x5d, 0x82, 0x9b, 0xcd, 0x67, 0x78, 0x8e, 0x43, 0xae, 0xd2, 0x21, 0x62, + 0xce, 0x82, 0x47, 0xdf, 0x4f, 0xdd, 0xd3, 0x2c, 0x93, 0x21, 0xd7, 0xa8, 0x05, 0x96, 0x98, 0xe0, + 0xb9, 0xf4, 0xf3, 0xf4, 0x0c, 0xcf, 0x57, 0xc8, 0x4d, 0x0a, 0x61, 0xcb, 0x5f, 0x82, 0x88, 0xa4, + 0x3c, 0xc3, 0x93, 0x72, 0xa2, 0xd2, 0x0e, 0xd1, 0x3d, 0xa0, 0x4b, 0x10, 0x12, 0xf0, 0x34, 0x4b, + 0xc0, 0xc9, 0x15, 0x34, 0xc7, 0x26, 0x55, 0xf0, 0x93, 0xed, 0x0c, 0x4f, 0x70, 0xfc, 0x76, 0xbc, + 0xb2, 0x79, 0x89, 0x75, 0x86, 0xa7, 0x30, 0xa4, 0x46, 0xf7, 0x8b, 0xea, 0xbb, 0x34, 0x8f, 0x4e, + 0xb0, 0xe4, 0x0b, 0xcf, 0xdd, 0x53, 0xe6, 0x03, 0xeb, 0xcc, 0x83, 0x18, 0xa9, 0x26, 0x9e, 0x86, + 0x25, 0xca, 0xdb, 0xe9, 0x5b, 0x87, 0xa5, 0x22, 0xae, 0x44, 0xa2, 0x6f, 0x1d, 0x1a, 0xa9, 0x26, + 0xad, 0x61, 0x1a, 0xd8, 0xa6, 0x6d, 0x0a, 0xb6, 0x25, 0x6f, 0xb3, 0x46, 0x5a, 0x45, 0x4a, 0x90, + 0x6a, 0xb6, 0xb7, 0x3b, 0x56, 0x69, 0x81, 0xf1, 0xac, 0x8e, 0x65, 0x24, 0x9b, 0xdb, 0x1d, 0x8b, + 0xbc, 0x05, 0x89, 0xc9, 0xd1, 0x7e, 0x89, 0x84, 0xbf, 0xac, 0xec, 0x1e, 0xed, 0xbb, 0x43, 0x31, + 0x28, 0x82, 0x2c, 0x43, 0x76, 0xe2, 0x8c, 0xdb, 0xbf, 0x60, 0x8e, 0xed, 0xd2, 0x79, 0x5c, 0xc2, + 0x73, 0x46, 0x66, 0xe2, 0x8c, 0x3f, 0x30, 0xc7, 0xf6, 0x19, 0x9d, 0x5f, 0xf9, 0x0a, 0xe4, 0x05, + 0xbb, 0xa4, 0x08, 0x92, 0xc5, 0x6e, 0x0a, 0x75, 0xe9, 0x8e, 0x21, 0x59, 0xe5, 0x3d, 0x28, 0xb8, + 0x39, 0x0c, 0xce, 0x57, 0xa3, 0x27, 0x69, 0x60, 0x8f, 0xf1, 0x7c, 0xce, 0x6b, 0x97, 0xc4, 0x10, + 0xe5, 0xc3, 0x78, 0xb8, 0x60, 0xd0, 0xb2, 0x12, 0x1a, 0x8a, 0x54, 0xfe, 0xa1, 0x04, 0x85, 0x2d, + 0x7b, 0xec, 0x3f, 0x30, 0x2f, 0x42, 0x6a, 0xdf, 0xb6, 0x07, 0x13, 0x34, 0x9b, 0x35, 0x58, 0x81, + 0xbc, 0x01, 0x05, 0xfc, 0xe1, 0xe6, 0x9e, 0xb2, 0xf7, 0xb4, 0x91, 0xc7, 0x7a, 0x9e, 0x70, 0x12, + 0x48, 0xf6, 0x2d, 0x67, 0xc2, 0x3d, 0x19, 0xfe, 0x26, 0x5f, 0x80, 0x3c, 0xfd, 0xeb, 0x32, 0x93, + 0xde, 0x85, 0x15, 0x68, 0x35, 0x27, 0xbe, 0x05, 0x73, 0xb8, 0xfb, 0x1e, 0x2c, 0xe3, 0x3d, 0x63, + 0x14, 0x58, 0x03, 0x07, 0x96, 0x20, 0xc3, 0x5c, 0xc1, 0x04, 0xbf, 0x96, 0xe5, 0x0c, 0xb7, 0x48, + 0xdd, 0x2b, 0x66, 0x02, 0x2c, 0xdc, 0x67, 0x0c, 0x5e, 0x2a, 0x3f, 0x80, 0x2c, 0x46, 0xa9, 0xd6, + 0xa0, 0x4b, 0xca, 0x20, 0xf5, 0x4a, 0x26, 0xc6, 0xc8, 0x45, 0xe1, 0x9a, 0xcf, 0x9b, 0x57, 0x36, + 0x0c, 0xa9, 0xb7, 0xb4, 0x00, 0xd2, 0x06, 0xbd, 0x77, 0x1f, 0x73, 0x37, 0x2d, 0x1d, 0x97, 0x5b, + 0xdc, 0xc4, 0xb6, 0xf9, 0x32, 0xce, 0xc4, 0xb6, 0xf9, 0x92, 0x99, 0xb8, 0x3a, 0x65, 0x82, 0x96, + 0x4e, 0xf8, 0xa7, 0x43, 0xe9, 0xa4, 0x5c, 0x85, 0x39, 0x3c, 0x9e, 0x7d, 0xab, 0xb7, 0x63, 0xf7, + 0x2d, 0xbc, 0xe7, 0x1f, 0xe2, 0x3d, 0x49, 0x32, 0xa4, 0x43, 0xba, 0x07, 0xe6, 0x71, 0xe7, 0x80, + 0xdd, 0x38, 0xb3, 0x06, 0x2b, 0x94, 0x3f, 0x4b, 0xc2, 0x3c, 0x77, 0xad, 0xef, 0xf7, 0x9d, 0x67, + 0x5b, 0x9d, 0x11, 0x79, 0x0a, 0x05, 0xea, 0x55, 0xdb, 0xc3, 0xce, 0x68, 0x44, 0x8f, 0xaf, 0x84, + 0x57, 0x8d, 0xeb, 0x53, 0xae, 0x9a, 0xe3, 0x57, 0xb6, 0x3b, 0x43, 0x73, 0x8b, 0x61, 0x1b, 0x96, + 0x33, 0x3e, 0x31, 0xf2, 0x96, 0x5f, 0x43, 0x36, 0x21, 0x3f, 0x9c, 0xf4, 0x3c, 0x63, 0x32, 0x1a, + 0xab, 0x44, 0x1a, 0xdb, 0x9a, 0xf4, 0x02, 0xb6, 0x60, 0xe8, 0x55, 0xd0, 0x81, 0x51, 0x7f, 0xec, + 0xd9, 0x4a, 0x9c, 0x32, 0x30, 0xea, 0x3a, 0x82, 0x03, 0xdb, 0xf7, 0x6b, 0xc8, 0x63, 0x00, 0x7a, + 0xbc, 0x1c, 0x9b, 0xa6, 0x4e, 0xa8, 0xa0, 0xbc, 0xf6, 0x66, 0xa4, 0xad, 0x5d, 0x67, 0xbc, 0x67, + 0xef, 0x3a, 0x63, 0x66, 0x88, 0x1e, 0x4c, 0x2c, 0x2e, 0xbd, 0x03, 0x4a, 0x78, 0xfe, 0xe2, 0x8d, + 0x3c, 0x35, 0xe3, 0x46, 0x9e, 0xe3, 0x37, 0xf2, 0xba, 0x7c, 0x57, 0x5a, 0x7a, 0x0f, 0x8a, 0xa1, + 0x29, 0x8b, 0x74, 0xc2, 0xe8, 0xb7, 0x45, 0x7a, 0x5e, 0x7b, 0x5d, 0xf8, 0x9c, 0x2d, 0x6e, 0xb8, + 0x68, 0xf7, 0x1d, 0x50, 0xc2, 0xd3, 0x17, 0x0d, 0x67, 0x63, 0x32, 0x05, 0xe4, 0xdf, 0x87, 0xb9, + 0xc0, 0x94, 0x45, 0x72, 0xee, 0x94, 0x49, 0x95, 0x7f, 0x29, 0x05, 0xa9, 0x96, 0x65, 0xda, 0x87, + 0xe4, 0xf5, 0x60, 0x9c, 0x7c, 0x72, 0xce, 0x8d, 0x91, 0x17, 0x43, 0x31, 0xf2, 0xc9, 0x39, 0x2f, + 0x42, 0x5e, 0x0c, 0x45, 0x48, 0xb7, 0xa9, 0xa6, 0x93, 0xcb, 0x53, 0xf1, 0xf1, 0xc9, 0x39, 0x21, + 0x38, 0x5e, 0x9e, 0x0a, 0x8e, 0x7e, 0x73, 0x4d, 0xa7, 0x0e, 0x35, 0x18, 0x19, 0x9f, 0x9c, 0xf3, + 0xa3, 0xe2, 0x72, 0x38, 0x2a, 0x7a, 0x8d, 0x35, 0x9d, 0x0d, 0x49, 0x88, 0x88, 0x38, 0x24, 0x16, + 0x0b, 0x97, 0xc3, 0xb1, 0x10, 0x79, 0x3c, 0x0a, 0x2e, 0x87, 0xa3, 0x20, 0x36, 0xf2, 0xa8, 0x77, + 0x31, 0x14, 0xf5, 0xd0, 0x28, 0x0b, 0x77, 0xcb, 0xe1, 0x70, 0xc7, 0x78, 0xc2, 0x48, 0xc5, 0x58, + 0xe7, 0x35, 0xd6, 0x74, 0xa2, 0x85, 0x02, 0x5d, 0xf4, 0x6d, 0x1f, 0xf7, 0x02, 0x9d, 0xbe, 0x4e, + 0x97, 0xcd, 0xbd, 0x88, 0x16, 0x63, 0xbe, 0xf8, 0xe3, 0x6a, 0xba, 0x17, 0x31, 0x0d, 0x32, 0x87, + 0x3c, 0x01, 0x56, 0xd0, 0x73, 0x09, 0xb2, 0xc4, 0xcd, 0x5f, 0x69, 0xb6, 0xd1, 0x83, 0xd1, 0x79, + 0x1d, 0xb2, 0x3b, 0x7d, 0x05, 0xe6, 0x9a, 0xed, 0xa7, 0x9d, 0x71, 0xcf, 0x9c, 0x38, 0xed, 0xbd, + 0x4e, 0xcf, 0x7b, 0x44, 0xa0, 0xfb, 0x9f, 0x6f, 0xf2, 0x96, 0xbd, 0x4e, 0x8f, 0x5c, 0x70, 0xc5, + 0xd5, 0xc5, 0x56, 0x89, 0xcb, 0x6b, 0xe9, 0x75, 0xba, 0x68, 0xcc, 0x18, 0xfa, 0xc2, 0x05, 0xee, + 0x0b, 0x1f, 0x66, 0x20, 0x75, 0x64, 0xf5, 0x6d, 0xeb, 0x61, 0x0e, 0x32, 0x8e, 0x3d, 0x1e, 0x76, + 0x1c, 0xbb, 0xfc, 0x23, 0x09, 0xe0, 0x91, 0x3d, 0x1c, 0x1e, 0x59, 0xfd, 0x17, 0x47, 0x26, 0xb9, + 0x02, 0xf9, 0x61, 0xe7, 0xb9, 0xd9, 0x1e, 0x9a, 0xed, 0x83, 0xb1, 0x7b, 0x0e, 0x72, 0xb4, 0x6a, + 0xcb, 0x7c, 0x34, 0x3e, 0x21, 0x25, 0xf7, 0x8a, 0x8e, 0xda, 0x41, 0x49, 0xf2, 0x2b, 0xfb, 0x22, + 0xbf, 0x74, 0xa6, 0xf9, 0x1e, 0xba, 0xd7, 0x4e, 0x96, 0x47, 0x64, 0xf8, 0xee, 0x61, 0x89, 0x4a, + 0xde, 0x31, 0x87, 0xa3, 0xf6, 0x01, 0x4a, 0x85, 0xca, 0x21, 0x45, 0xcb, 0x8f, 0xc8, 0x6d, 0x48, + 0x1c, 0xd8, 0x03, 0x14, 0xc9, 0x29, 0xfb, 0x42, 0x71, 0xe4, 0x0d, 0x48, 0x0c, 0x27, 0x4c, 0x36, + 0x79, 0x6d, 0x41, 0xb8, 0x27, 0xb0, 0xd0, 0x44, 0x61, 0xc3, 0x49, 0xcf, 0x9b, 0xf7, 0x8d, 0x22, + 0x24, 0x9a, 0xad, 0x16, 0x8d, 0xfd, 0xcd, 0x56, 0x6b, 0x4d, 0x91, 0xea, 0x5f, 0x82, 0x6c, 0x6f, + 0x6c, 0x9a, 0xd4, 0x3d, 0xcc, 0xce, 0x39, 0x3e, 0xc4, 0x58, 0xe7, 0x81, 0xea, 0x5b, 0x90, 0x39, + 0x60, 0x59, 0x07, 0x89, 0x48, 0x6b, 0x4b, 0x7f, 0xc8, 0x1e, 0x55, 0x96, 0xfc, 0xe6, 0x70, 0x9e, + 0x62, 0xb8, 0x36, 0xea, 0x3b, 0x90, 0x1b, 0xb7, 0x4f, 0x33, 0xf8, 0x31, 0x8b, 0x2e, 0x71, 0x06, + 0xb3, 0x63, 0x5e, 0x55, 0x6f, 0xc0, 0x82, 0x65, 0xbb, 0xdf, 0x50, 0xda, 0x5d, 0x76, 0xc6, 0x2e, + 0x4e, 0x5f, 0xe5, 0x5c, 0xe3, 0x26, 0xfb, 0x6e, 0x69, 0xd9, 0xbc, 0x81, 0x9d, 0xca, 0xfa, 0x23, + 0x50, 0x04, 0x33, 0x98, 0x7a, 0xc6, 0x59, 0x39, 0x64, 0x1f, 0x4a, 0x3d, 0x2b, 0x78, 0xee, 0x43, + 0x46, 0xd8, 0xc9, 0x8c, 0x31, 0xd2, 0x63, 0x5f, 0x9d, 0x3d, 0x23, 0xe8, 0xea, 0xa6, 0x8d, 0x50, + 0x5f, 0x13, 0x6d, 0xe4, 0x19, 0xfb, 0x20, 0x2d, 0x1a, 0xa9, 0xe9, 0xa1, 0x55, 0x39, 0x3a, 0x75, + 0x28, 0x7d, 0xf6, 0x3d, 0xd9, 0xb3, 0xc2, 0x1c, 0xe0, 0x0c, 0x33, 0xf1, 0x83, 0xf9, 0x90, 0x7d, + 0x6a, 0x0e, 0x98, 0x99, 0x1a, 0xcd, 0xe4, 0xd4, 0xd1, 0x3c, 0x67, 0xdf, 0x75, 0x3d, 0x33, 0xbb, + 0xb3, 0x46, 0x33, 0x39, 0x75, 0x34, 0x03, 0xf6, 0xc5, 0x37, 0x60, 0xa6, 0xa6, 0xd7, 0x37, 0x80, + 0x88, 0x5b, 0xcd, 0xe3, 0x44, 0x8c, 0x9d, 0x21, 0xfb, 0x8e, 0xef, 0x6f, 0x36, 0xa3, 0xcc, 0x32, + 0x14, 0x3f, 0x20, 0x8b, 0x7d, 0xe2, 0x0f, 0x1a, 0xaa, 0xe9, 0xf5, 0x4d, 0x38, 0x2f, 0x4e, 0xec, + 0x0c, 0x43, 0xb2, 0x55, 0xa9, 0x52, 0x34, 0x16, 0xfc, 0xa9, 0x71, 0xce, 0x4c, 0x53, 0xf1, 0x83, + 0x1a, 0xa9, 0x52, 0x45, 0x99, 0x32, 0x55, 0xd3, 0xeb, 0x0f, 0xa0, 0x28, 0x98, 0xda, 0xc7, 0x08, + 0x1d, 0x6d, 0xe6, 0x05, 0xfb, 0x5f, 0x0b, 0xcf, 0x0c, 0x8d, 0xe8, 0xe1, 0x1d, 0xe3, 0x31, 0x2e, + 0xda, 0xc8, 0x98, 0xfd, 0xa3, 0x80, 0x3f, 0x16, 0x64, 0x84, 0x8e, 0x04, 0xe6, 0xdf, 0x71, 0x56, + 0x26, 0xec, 0x5f, 0x08, 0xfc, 0xa1, 0x50, 0x42, 0xbd, 0x1f, 0x98, 0x8e, 0x49, 0x83, 0x5c, 0x8c, + 0x0d, 0x07, 0x3d, 0xf2, 0x9b, 0x91, 0x80, 0x15, 0xf1, 0x81, 0x44, 0x98, 0x36, 0x2d, 0xd6, 0x37, + 0x61, 0xfe, 0xec, 0x0e, 0xe9, 0x63, 0x89, 0x65, 0xcb, 0xd5, 0x15, 0x9a, 0x50, 0x1b, 0x73, 0xdd, + 0x80, 0x5f, 0x6a, 0xc0, 0xdc, 0x99, 0x9d, 0xd2, 0x27, 0x12, 0xcb, 0x39, 0xa9, 0x25, 0xa3, 0xd0, + 0x0d, 0x7a, 0xa6, 0xb9, 0x33, 0xbb, 0xa5, 0x4f, 0x25, 0xf6, 0x40, 0xa1, 0x6b, 0x9e, 0x11, 0xd7, + 0x33, 0xcd, 0x9d, 0xd9, 0x2d, 0x7d, 0x95, 0x65, 0x94, 0xb2, 0x5e, 0x15, 0x8d, 0xa0, 0x2f, 0x98, + 0x3f, 0xbb, 0x5b, 0xfa, 0x9a, 0x84, 0x8f, 0x15, 0xb2, 0xae, 0x7b, 0xeb, 0xe2, 0x79, 0xa6, 0xf9, + 0xb3, 0xbb, 0xa5, 0xaf, 0x4b, 0xf8, 0xa4, 0x21, 0xeb, 0xeb, 0x01, 0x33, 0xc1, 0xd1, 0x9c, 0xee, + 0x96, 0xbe, 0x21, 0xe1, 0x2b, 0x83, 0xac, 0xd7, 0x3c, 0x33, 0xbb, 0x53, 0xa3, 0x39, 0xdd, 0x2d, + 0x7d, 0x13, 0x6f, 0xf1, 0x75, 0x59, 0xbf, 0x13, 0x30, 0x83, 0x9e, 0xa9, 0xf8, 0x0a, 0x6e, 0xe9, + 0x5b, 0x12, 0x3e, 0x06, 0xc9, 0xfa, 0x5d, 0xc3, 0xed, 0xdd, 0xf7, 0x4c, 0xc5, 0x57, 0x70, 0x4b, + 0x9f, 0x49, 0xf8, 0x66, 0x24, 0xeb, 0xf7, 0x82, 0x86, 0xd0, 0x33, 0x29, 0xaf, 0xe2, 0x96, 0xbe, + 0x4d, 0x2d, 0x15, 0xeb, 0xf2, 0xfa, 0xaa, 0xe1, 0x0e, 0x40, 0xf0, 0x4c, 0xca, 0xab, 0xb8, 0xa5, + 0xef, 0x50, 0x53, 0x4a, 0x5d, 0x5e, 0x5f, 0x0b, 0x99, 0xaa, 0xe9, 0xf5, 0x47, 0x50, 0x38, 0xab, + 0x5b, 0xfa, 0xae, 0xf8, 0x16, 0x97, 0xef, 0x0a, 0xbe, 0x69, 0x47, 0xd8, 0xb3, 0x53, 0x1d, 0xd3, + 0xf7, 0x30, 0xc7, 0xa9, 0xcf, 0x3d, 0x61, 0xef, 0x55, 0x8c, 0xe0, 0x6f, 0x1f, 0x73, 0x53, 0x5b, + 0xfe, 0xf9, 0x38, 0xd5, 0x47, 0x7d, 0x5f, 0xc2, 0x47, 0xad, 0x02, 0x37, 0x88, 0x78, 0xef, 0xa4, + 0x30, 0x87, 0xf5, 0xa1, 0x3f, 0xcb, 0xd3, 0xbc, 0xd5, 0x0f, 0xa4, 0x57, 0x71, 0x57, 0xf5, 0x44, + 0x6b, 0xbb, 0xe1, 0x2d, 0x06, 0xd6, 0xbc, 0x0d, 0xc9, 0x63, 0x6d, 0x75, 0x4d, 0xbc, 0x92, 0x89, + 0x6f, 0xb9, 0xcc, 0x49, 0xe5, 0xb5, 0xa2, 0xf0, 0xdc, 0x3d, 0x1c, 0x39, 0x27, 0x06, 0xb2, 0x38, + 0x5b, 0x8b, 0x64, 0x7f, 0x12, 0xc3, 0xd6, 0x38, 0xbb, 0x1a, 0xc9, 0xfe, 0x34, 0x86, 0x5d, 0xe5, + 0x6c, 0x3d, 0x92, 0xfd, 0xd5, 0x18, 0xb6, 0xce, 0xd9, 0xeb, 0x91, 0xec, 0xaf, 0xc5, 0xb0, 0xd7, + 0x39, 0xbb, 0x16, 0xc9, 0xfe, 0x7a, 0x0c, 0xbb, 0xc6, 0xd9, 0x77, 0x22, 0xd9, 0xdf, 0x88, 0x61, + 0xdf, 0xe1, 0xec, 0xbb, 0x91, 0xec, 0x6f, 0xc6, 0xb0, 0xef, 0x72, 0xf6, 0xbd, 0x48, 0xf6, 0xb7, + 0x62, 0xd8, 0xf7, 0x18, 0x7b, 0x6d, 0x35, 0x92, 0xfd, 0x59, 0x34, 0x7b, 0x6d, 0x95, 0xb3, 0xa3, + 0xb5, 0xf6, 0xed, 0x18, 0x36, 0xd7, 0xda, 0x5a, 0xb4, 0xd6, 0xbe, 0x13, 0xc3, 0xe6, 0x5a, 0x5b, + 0x8b, 0xd6, 0xda, 0x77, 0x63, 0xd8, 0x5c, 0x6b, 0x6b, 0xd1, 0x5a, 0xfb, 0x5e, 0x0c, 0x9b, 0x6b, + 0x6d, 0x2d, 0x5a, 0x6b, 0xdf, 0x8f, 0x61, 0x73, 0xad, 0xad, 0x45, 0x6b, 0xed, 0x07, 0x31, 0x6c, + 0xae, 0xb5, 0xb5, 0x68, 0xad, 0xfd, 0x51, 0x0c, 0x9b, 0x6b, 0x6d, 0x2d, 0x5a, 0x6b, 0x7f, 0x1c, + 0xc3, 0xe6, 0x5a, 0x5b, 0x8b, 0xd6, 0xda, 0x9f, 0xc4, 0xb0, 0xb9, 0xd6, 0xb4, 0x68, 0xad, 0xfd, + 0x69, 0x34, 0x5b, 0xe3, 0x5a, 0xd3, 0xa2, 0xb5, 0xf6, 0x67, 0x31, 0x6c, 0xae, 0x35, 0x2d, 0x5a, + 0x6b, 0x7f, 0x1e, 0xc3, 0xe6, 0x5a, 0xd3, 0xa2, 0xb5, 0xf6, 0xc3, 0x18, 0x36, 0xd7, 0x9a, 0x16, + 0xad, 0xb5, 0xbf, 0x88, 0x61, 0x73, 0xad, 0x69, 0xd1, 0x5a, 0xfb, 0xcb, 0x18, 0x36, 0xd7, 0x9a, + 0x16, 0xad, 0xb5, 0xbf, 0x8a, 0x61, 0x73, 0xad, 0x69, 0xd1, 0x5a, 0xfb, 0xeb, 0x18, 0x36, 0xd7, + 0x9a, 0x16, 0xad, 0xb5, 0xbf, 0x89, 0x61, 0x73, 0xad, 0x69, 0xd1, 0x5a, 0xfb, 0xdb, 0x18, 0x36, + 0xd7, 0x5a, 0x35, 0x5a, 0x6b, 0x7f, 0x17, 0xcd, 0xae, 0x72, 0xad, 0x55, 0xa3, 0xb5, 0xf6, 0xf7, + 0x31, 0x6c, 0xae, 0xb5, 0x6a, 0xb4, 0xd6, 0xfe, 0x21, 0x86, 0xcd, 0xb5, 0x56, 0x8d, 0xd6, 0xda, + 0x3f, 0xc6, 0xb0, 0xb9, 0xd6, 0xaa, 0xd1, 0x5a, 0xfb, 0x51, 0x0c, 0x9b, 0x6b, 0xad, 0x1a, 0xad, + 0xb5, 0x7f, 0x8a, 0x61, 0x73, 0xad, 0x55, 0xa3, 0xb5, 0xf6, 0xcf, 0x31, 0x6c, 0xae, 0xb5, 0x6a, + 0xb4, 0xd6, 0xfe, 0x25, 0x86, 0xcd, 0xb5, 0x56, 0x8d, 0xd6, 0xda, 0xbf, 0xc6, 0xb0, 0xb9, 0xd6, + 0xaa, 0xd1, 0x5a, 0xfb, 0xb7, 0x18, 0x36, 0xd7, 0x9a, 0x1e, 0xad, 0xb5, 0x7f, 0x8f, 0x66, 0xeb, + 0x5c, 0x6b, 0x7a, 0xb4, 0xd6, 0xfe, 0x23, 0x86, 0xcd, 0xb5, 0xa6, 0x47, 0x6b, 0xed, 0x3f, 0x63, + 0xd8, 0x5c, 0x6b, 0x7a, 0xb4, 0xd6, 0xfe, 0x2b, 0x86, 0xcd, 0xb5, 0xa6, 0x47, 0x6b, 0xed, 0xbf, + 0x63, 0xd8, 0x5c, 0x6b, 0x7a, 0xb4, 0xd6, 0xfe, 0x27, 0x86, 0xcd, 0xb5, 0xa6, 0x47, 0x6b, 0xed, + 0xc7, 0x31, 0x6c, 0xae, 0x35, 0x3d, 0x5a, 0x6b, 0x3f, 0x89, 0x61, 0x73, 0xad, 0xe9, 0xd1, 0x5a, + 0xfb, 0xdf, 0x18, 0x36, 0xd7, 0x9a, 0x1e, 0xad, 0xb5, 0xff, 0x8b, 0x61, 0x73, 0xad, 0xad, 0x47, + 0x6b, 0xed, 0xff, 0xa3, 0xd9, 0xeb, 0xab, 0x3f, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xaa, 0x00, 0xcd, + 0x32, 0x57, 0x39, 0x00, 0x00, +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/testdata/test.proto b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/testdata/test.proto new file mode 100644 index 0000000..70e3cfc --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/testdata/test.proto @@ -0,0 +1,548 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +// A feature-rich test file for the protocol compiler and libraries. + +syntax = "proto2"; + +package testdata; + +enum FOO { FOO1 = 1; }; + +message GoEnum { + required FOO foo = 1; +} + +message GoTestField { + required string Label = 1; + required string Type = 2; +} + +message GoTest { + // An enum, for completeness. + enum KIND { + VOID = 0; + + // Basic types + BOOL = 1; + BYTES = 2; + FINGERPRINT = 3; + FLOAT = 4; + INT = 5; + STRING = 6; + TIME = 7; + + // Groupings + TUPLE = 8; + ARRAY = 9; + MAP = 10; + + // Table types + TABLE = 11; + + // Functions + FUNCTION = 12; // last tag + }; + + // Some typical parameters + required KIND Kind = 1; + optional string Table = 2; + optional int32 Param = 3; + + // Required, repeated and optional foreign fields. + required GoTestField RequiredField = 4; + repeated GoTestField RepeatedField = 5; + optional GoTestField OptionalField = 6; + + // Required fields of all basic types + required bool F_Bool_required = 10; + required int32 F_Int32_required = 11; + required int64 F_Int64_required = 12; + required fixed32 F_Fixed32_required = 13; + required fixed64 F_Fixed64_required = 14; + required uint32 F_Uint32_required = 15; + required uint64 F_Uint64_required = 16; + required float F_Float_required = 17; + required double F_Double_required = 18; + required string F_String_required = 19; + required bytes F_Bytes_required = 101; + required sint32 F_Sint32_required = 102; + required sint64 F_Sint64_required = 103; + + // Repeated fields of all basic types + repeated bool F_Bool_repeated = 20; + repeated int32 F_Int32_repeated = 21; + repeated int64 F_Int64_repeated = 22; + repeated fixed32 F_Fixed32_repeated = 23; + repeated fixed64 F_Fixed64_repeated = 24; + repeated uint32 F_Uint32_repeated = 25; + repeated uint64 F_Uint64_repeated = 26; + repeated float F_Float_repeated = 27; + repeated double F_Double_repeated = 28; + repeated string F_String_repeated = 29; + repeated bytes F_Bytes_repeated = 201; + repeated sint32 F_Sint32_repeated = 202; + repeated sint64 F_Sint64_repeated = 203; + + // Optional fields of all basic types + optional bool F_Bool_optional = 30; + optional int32 F_Int32_optional = 31; + optional int64 F_Int64_optional = 32; + optional fixed32 F_Fixed32_optional = 33; + optional fixed64 F_Fixed64_optional = 34; + optional uint32 F_Uint32_optional = 35; + optional uint64 F_Uint64_optional = 36; + optional float F_Float_optional = 37; + optional double F_Double_optional = 38; + optional string F_String_optional = 39; + optional bytes F_Bytes_optional = 301; + optional sint32 F_Sint32_optional = 302; + optional sint64 F_Sint64_optional = 303; + + // Default-valued fields of all basic types + optional bool F_Bool_defaulted = 40 [default=true]; + optional int32 F_Int32_defaulted = 41 [default=32]; + optional int64 F_Int64_defaulted = 42 [default=64]; + optional fixed32 F_Fixed32_defaulted = 43 [default=320]; + optional fixed64 F_Fixed64_defaulted = 44 [default=640]; + optional uint32 F_Uint32_defaulted = 45 [default=3200]; + optional uint64 F_Uint64_defaulted = 46 [default=6400]; + optional float F_Float_defaulted = 47 [default=314159.]; + optional double F_Double_defaulted = 48 [default=271828.]; + optional string F_String_defaulted = 49 [default="hello, \"world!\"\n"]; + optional bytes F_Bytes_defaulted = 401 [default="Bignose"]; + optional sint32 F_Sint32_defaulted = 402 [default = -32]; + optional sint64 F_Sint64_defaulted = 403 [default = -64]; + + // Packed repeated fields (no string or bytes). + repeated bool F_Bool_repeated_packed = 50 [packed=true]; + repeated int32 F_Int32_repeated_packed = 51 [packed=true]; + repeated int64 F_Int64_repeated_packed = 52 [packed=true]; + repeated fixed32 F_Fixed32_repeated_packed = 53 [packed=true]; + repeated fixed64 F_Fixed64_repeated_packed = 54 [packed=true]; + repeated uint32 F_Uint32_repeated_packed = 55 [packed=true]; + repeated uint64 F_Uint64_repeated_packed = 56 [packed=true]; + repeated float F_Float_repeated_packed = 57 [packed=true]; + repeated double F_Double_repeated_packed = 58 [packed=true]; + repeated sint32 F_Sint32_repeated_packed = 502 [packed=true]; + repeated sint64 F_Sint64_repeated_packed = 503 [packed=true]; + + // Required, repeated, and optional groups. + required group RequiredGroup = 70 { + required string RequiredField = 71; + }; + + repeated group RepeatedGroup = 80 { + required string RequiredField = 81; + }; + + optional group OptionalGroup = 90 { + required string RequiredField = 91; + }; +} + +// For testing a group containing a required field. +message GoTestRequiredGroupField { + required group Group = 1 { + required int32 Field = 2; + }; +} + +// For testing skipping of unrecognized fields. +// Numbers are all big, larger than tag numbers in GoTestField, +// the message used in the corresponding test. +message GoSkipTest { + required int32 skip_int32 = 11; + required fixed32 skip_fixed32 = 12; + required fixed64 skip_fixed64 = 13; + required string skip_string = 14; + required group SkipGroup = 15 { + required int32 group_int32 = 16; + required string group_string = 17; + } +} + +// For testing packed/non-packed decoder switching. +// A serialized instance of one should be deserializable as the other. +message NonPackedTest { + repeated int32 a = 1; +} + +message PackedTest { + repeated int32 b = 1 [packed=true]; +} + +message MaxTag { + // Maximum possible tag number. + optional string last_field = 536870911; +} + +message OldMessage { + message Nested { + optional string name = 1; + } + optional Nested nested = 1; + + optional int32 num = 2; +} + +// NewMessage is wire compatible with OldMessage; +// imagine it as a future version. +message NewMessage { + message Nested { + optional string name = 1; + optional string food_group = 2; + } + optional Nested nested = 1; + + // This is an int32 in OldMessage. + optional int64 num = 2; +} + +// Smaller tests for ASCII formatting. + +message InnerMessage { + required string host = 1; + optional int32 port = 2 [default=4000]; + optional bool connected = 3; +} + +message OtherMessage { + optional int64 key = 1; + optional bytes value = 2; + optional float weight = 3; + optional InnerMessage inner = 4; + + extensions 100 to max; +} + +message RequiredInnerMessage { + required InnerMessage leo_finally_won_an_oscar = 1; +} + +message MyMessage { + required int32 count = 1; + optional string name = 2; + optional string quote = 3; + repeated string pet = 4; + optional InnerMessage inner = 5; + repeated OtherMessage others = 6; + optional RequiredInnerMessage we_must_go_deeper = 13; + repeated InnerMessage rep_inner = 12; + + enum Color { + RED = 0; + GREEN = 1; + BLUE = 2; + }; + optional Color bikeshed = 7; + + optional group SomeGroup = 8 { + optional int32 group_field = 9; + } + + // This field becomes [][]byte in the generated code. + repeated bytes rep_bytes = 10; + + optional double bigfloat = 11; + + extensions 100 to max; +} + +message Ext { + extend MyMessage { + optional Ext more = 103; + optional string text = 104; + optional int32 number = 105; + } + + optional string data = 1; +} + +extend MyMessage { + repeated string greeting = 106; +} + +message ComplexExtension { + optional int32 first = 1; + optional int32 second = 2; + repeated int32 third = 3; +} + +extend OtherMessage { + optional ComplexExtension complex = 200; + repeated ComplexExtension r_complex = 201; +} + +message DefaultsMessage { + enum DefaultsEnum { + ZERO = 0; + ONE = 1; + TWO = 2; + }; + extensions 100 to max; +} + +extend DefaultsMessage { + optional double no_default_double = 101; + optional float no_default_float = 102; + optional int32 no_default_int32 = 103; + optional int64 no_default_int64 = 104; + optional uint32 no_default_uint32 = 105; + optional uint64 no_default_uint64 = 106; + optional sint32 no_default_sint32 = 107; + optional sint64 no_default_sint64 = 108; + optional fixed32 no_default_fixed32 = 109; + optional fixed64 no_default_fixed64 = 110; + optional sfixed32 no_default_sfixed32 = 111; + optional sfixed64 no_default_sfixed64 = 112; + optional bool no_default_bool = 113; + optional string no_default_string = 114; + optional bytes no_default_bytes = 115; + optional DefaultsMessage.DefaultsEnum no_default_enum = 116; + + optional double default_double = 201 [default = 3.1415]; + optional float default_float = 202 [default = 3.14]; + optional int32 default_int32 = 203 [default = 42]; + optional int64 default_int64 = 204 [default = 43]; + optional uint32 default_uint32 = 205 [default = 44]; + optional uint64 default_uint64 = 206 [default = 45]; + optional sint32 default_sint32 = 207 [default = 46]; + optional sint64 default_sint64 = 208 [default = 47]; + optional fixed32 default_fixed32 = 209 [default = 48]; + optional fixed64 default_fixed64 = 210 [default = 49]; + optional sfixed32 default_sfixed32 = 211 [default = 50]; + optional sfixed64 default_sfixed64 = 212 [default = 51]; + optional bool default_bool = 213 [default = true]; + optional string default_string = 214 [default = "Hello, string"]; + optional bytes default_bytes = 215 [default = "Hello, bytes"]; + optional DefaultsMessage.DefaultsEnum default_enum = 216 [default = ONE]; +} + +message MyMessageSet { + option message_set_wire_format = true; + extensions 100 to max; +} + +message Empty { +} + +extend MyMessageSet { + optional Empty x201 = 201; + optional Empty x202 = 202; + optional Empty x203 = 203; + optional Empty x204 = 204; + optional Empty x205 = 205; + optional Empty x206 = 206; + optional Empty x207 = 207; + optional Empty x208 = 208; + optional Empty x209 = 209; + optional Empty x210 = 210; + optional Empty x211 = 211; + optional Empty x212 = 212; + optional Empty x213 = 213; + optional Empty x214 = 214; + optional Empty x215 = 215; + optional Empty x216 = 216; + optional Empty x217 = 217; + optional Empty x218 = 218; + optional Empty x219 = 219; + optional Empty x220 = 220; + optional Empty x221 = 221; + optional Empty x222 = 222; + optional Empty x223 = 223; + optional Empty x224 = 224; + optional Empty x225 = 225; + optional Empty x226 = 226; + optional Empty x227 = 227; + optional Empty x228 = 228; + optional Empty x229 = 229; + optional Empty x230 = 230; + optional Empty x231 = 231; + optional Empty x232 = 232; + optional Empty x233 = 233; + optional Empty x234 = 234; + optional Empty x235 = 235; + optional Empty x236 = 236; + optional Empty x237 = 237; + optional Empty x238 = 238; + optional Empty x239 = 239; + optional Empty x240 = 240; + optional Empty x241 = 241; + optional Empty x242 = 242; + optional Empty x243 = 243; + optional Empty x244 = 244; + optional Empty x245 = 245; + optional Empty x246 = 246; + optional Empty x247 = 247; + optional Empty x248 = 248; + optional Empty x249 = 249; + optional Empty x250 = 250; +} + +message MessageList { + repeated group Message = 1 { + required string name = 2; + required int32 count = 3; + } +} + +message Strings { + optional string string_field = 1; + optional bytes bytes_field = 2; +} + +message Defaults { + enum Color { + RED = 0; + GREEN = 1; + BLUE = 2; + } + + // Default-valued fields of all basic types. + // Same as GoTest, but copied here to make testing easier. + optional bool F_Bool = 1 [default=true]; + optional int32 F_Int32 = 2 [default=32]; + optional int64 F_Int64 = 3 [default=64]; + optional fixed32 F_Fixed32 = 4 [default=320]; + optional fixed64 F_Fixed64 = 5 [default=640]; + optional uint32 F_Uint32 = 6 [default=3200]; + optional uint64 F_Uint64 = 7 [default=6400]; + optional float F_Float = 8 [default=314159.]; + optional double F_Double = 9 [default=271828.]; + optional string F_String = 10 [default="hello, \"world!\"\n"]; + optional bytes F_Bytes = 11 [default="Bignose"]; + optional sint32 F_Sint32 = 12 [default=-32]; + optional sint64 F_Sint64 = 13 [default=-64]; + optional Color F_Enum = 14 [default=GREEN]; + + // More fields with crazy defaults. + optional float F_Pinf = 15 [default=inf]; + optional float F_Ninf = 16 [default=-inf]; + optional float F_Nan = 17 [default=nan]; + + // Sub-message. + optional SubDefaults sub = 18; + + // Redundant but explicit defaults. + optional string str_zero = 19 [default=""]; +} + +message SubDefaults { + optional int64 n = 1 [default=7]; +} + +message RepeatedEnum { + enum Color { + RED = 1; + } + repeated Color color = 1; +} + +message MoreRepeated { + repeated bool bools = 1; + repeated bool bools_packed = 2 [packed=true]; + repeated int32 ints = 3; + repeated int32 ints_packed = 4 [packed=true]; + repeated int64 int64s_packed = 7 [packed=true]; + repeated string strings = 5; + repeated fixed32 fixeds = 6; +} + +// GroupOld and GroupNew have the same wire format. +// GroupNew has a new field inside a group. + +message GroupOld { + optional group G = 101 { + optional int32 x = 2; + } +} + +message GroupNew { + optional group G = 101 { + optional int32 x = 2; + optional int32 y = 3; + } +} + +message FloatingPoint { + required double f = 1; + optional bool exact = 2; +} + +message MessageWithMap { + map name_mapping = 1; + map msg_mapping = 2; + map byte_mapping = 3; + map str_to_str = 4; +} + +message Oneof { + oneof union { + bool F_Bool = 1; + int32 F_Int32 = 2; + int64 F_Int64 = 3; + fixed32 F_Fixed32 = 4; + fixed64 F_Fixed64 = 5; + uint32 F_Uint32 = 6; + uint64 F_Uint64 = 7; + float F_Float = 8; + double F_Double = 9; + string F_String = 10; + bytes F_Bytes = 11; + sint32 F_Sint32 = 12; + sint64 F_Sint64 = 13; + MyMessage.Color F_Enum = 14; + GoTestField F_Message = 15; + group F_Group = 16 { + optional int32 x = 17; + } + int32 F_Largest_Tag = 536870911; + } + + oneof tormato { + int32 value = 100; + } +} + +message Communique { + optional bool make_me_cry = 1; + + // This is a oneof, called "union". + oneof union { + int32 number = 5; + string name = 6; + bytes data = 7; + double temp_c = 8; + MyMessage.Color col = 9; + Strings msg = 10; + } +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/text.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/text.go new file mode 100644 index 0000000..965876b --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/text.go @@ -0,0 +1,854 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package proto + +// Functions for writing the text protocol buffer format. + +import ( + "bufio" + "bytes" + "encoding" + "errors" + "fmt" + "io" + "log" + "math" + "reflect" + "sort" + "strings" +) + +var ( + newline = []byte("\n") + spaces = []byte(" ") + gtNewline = []byte(">\n") + endBraceNewline = []byte("}\n") + backslashN = []byte{'\\', 'n'} + backslashR = []byte{'\\', 'r'} + backslashT = []byte{'\\', 't'} + backslashDQ = []byte{'\\', '"'} + backslashBS = []byte{'\\', '\\'} + posInf = []byte("inf") + negInf = []byte("-inf") + nan = []byte("nan") +) + +type writer interface { + io.Writer + WriteByte(byte) error +} + +// textWriter is an io.Writer that tracks its indentation level. +type textWriter struct { + ind int + complete bool // if the current position is a complete line + compact bool // whether to write out as a one-liner + w writer +} + +func (w *textWriter) WriteString(s string) (n int, err error) { + if !strings.Contains(s, "\n") { + if !w.compact && w.complete { + w.writeIndent() + } + w.complete = false + return io.WriteString(w.w, s) + } + // WriteString is typically called without newlines, so this + // codepath and its copy are rare. We copy to avoid + // duplicating all of Write's logic here. + return w.Write([]byte(s)) +} + +func (w *textWriter) Write(p []byte) (n int, err error) { + newlines := bytes.Count(p, newline) + if newlines == 0 { + if !w.compact && w.complete { + w.writeIndent() + } + n, err = w.w.Write(p) + w.complete = false + return n, err + } + + frags := bytes.SplitN(p, newline, newlines+1) + if w.compact { + for i, frag := range frags { + if i > 0 { + if err := w.w.WriteByte(' '); err != nil { + return n, err + } + n++ + } + nn, err := w.w.Write(frag) + n += nn + if err != nil { + return n, err + } + } + return n, nil + } + + for i, frag := range frags { + if w.complete { + w.writeIndent() + } + nn, err := w.w.Write(frag) + n += nn + if err != nil { + return n, err + } + if i+1 < len(frags) { + if err := w.w.WriteByte('\n'); err != nil { + return n, err + } + n++ + } + } + w.complete = len(frags[len(frags)-1]) == 0 + return n, nil +} + +func (w *textWriter) WriteByte(c byte) error { + if w.compact && c == '\n' { + c = ' ' + } + if !w.compact && w.complete { + w.writeIndent() + } + err := w.w.WriteByte(c) + w.complete = c == '\n' + return err +} + +func (w *textWriter) indent() { w.ind++ } + +func (w *textWriter) unindent() { + if w.ind == 0 { + log.Print("proto: textWriter unindented too far") + return + } + w.ind-- +} + +func writeName(w *textWriter, props *Properties) error { + if _, err := w.WriteString(props.OrigName); err != nil { + return err + } + if props.Wire != "group" { + return w.WriteByte(':') + } + return nil +} + +// raw is the interface satisfied by RawMessage. +type raw interface { + Bytes() []byte +} + +func requiresQuotes(u string) bool { + // When type URL contains any characters except [0-9A-Za-z./\-]*, it must be quoted. + for _, ch := range u { + switch { + case ch == '.' || ch == '/' || ch == '_': + continue + case '0' <= ch && ch <= '9': + continue + case 'A' <= ch && ch <= 'Z': + continue + case 'a' <= ch && ch <= 'z': + continue + default: + return true + } + } + return false +} + +// isAny reports whether sv is a google.protobuf.Any message +func isAny(sv reflect.Value) bool { + type wkt interface { + XXX_WellKnownType() string + } + t, ok := sv.Addr().Interface().(wkt) + return ok && t.XXX_WellKnownType() == "Any" +} + +// writeProto3Any writes an expanded google.protobuf.Any message. +// +// It returns (false, nil) if sv value can't be unmarshaled (e.g. because +// required messages are not linked in). +// +// It returns (true, error) when sv was written in expanded format or an error +// was encountered. +func (tm *TextMarshaler) writeProto3Any(w *textWriter, sv reflect.Value) (bool, error) { + turl := sv.FieldByName("TypeUrl") + val := sv.FieldByName("Value") + if !turl.IsValid() || !val.IsValid() { + return true, errors.New("proto: invalid google.protobuf.Any message") + } + + b, ok := val.Interface().([]byte) + if !ok { + return true, errors.New("proto: invalid google.protobuf.Any message") + } + + parts := strings.Split(turl.String(), "/") + mt := MessageType(parts[len(parts)-1]) + if mt == nil { + return false, nil + } + m := reflect.New(mt.Elem()) + if err := Unmarshal(b, m.Interface().(Message)); err != nil { + return false, nil + } + w.Write([]byte("[")) + u := turl.String() + if requiresQuotes(u) { + writeString(w, u) + } else { + w.Write([]byte(u)) + } + if w.compact { + w.Write([]byte("]:<")) + } else { + w.Write([]byte("]: <\n")) + w.ind++ + } + if err := tm.writeStruct(w, m.Elem()); err != nil { + return true, err + } + if w.compact { + w.Write([]byte("> ")) + } else { + w.ind-- + w.Write([]byte(">\n")) + } + return true, nil +} + +func (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error { + if tm.ExpandAny && isAny(sv) { + if canExpand, err := tm.writeProto3Any(w, sv); canExpand { + return err + } + } + st := sv.Type() + sprops := GetProperties(st) + for i := 0; i < sv.NumField(); i++ { + fv := sv.Field(i) + props := sprops.Prop[i] + name := st.Field(i).Name + + if strings.HasPrefix(name, "XXX_") { + // There are two XXX_ fields: + // XXX_unrecognized []byte + // XXX_extensions map[int32]proto.Extension + // The first is handled here; + // the second is handled at the bottom of this function. + if name == "XXX_unrecognized" && !fv.IsNil() { + if err := writeUnknownStruct(w, fv.Interface().([]byte)); err != nil { + return err + } + } + continue + } + if fv.Kind() == reflect.Ptr && fv.IsNil() { + // Field not filled in. This could be an optional field or + // a required field that wasn't filled in. Either way, there + // isn't anything we can show for it. + continue + } + if fv.Kind() == reflect.Slice && fv.IsNil() { + // Repeated field that is empty, or a bytes field that is unused. + continue + } + + if props.Repeated && fv.Kind() == reflect.Slice { + // Repeated field. + for j := 0; j < fv.Len(); j++ { + if err := writeName(w, props); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + v := fv.Index(j) + if v.Kind() == reflect.Ptr && v.IsNil() { + // A nil message in a repeated field is not valid, + // but we can handle that more gracefully than panicking. + if _, err := w.Write([]byte("\n")); err != nil { + return err + } + continue + } + if err := tm.writeAny(w, v, props); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + } + continue + } + if fv.Kind() == reflect.Map { + // Map fields are rendered as a repeated struct with key/value fields. + keys := fv.MapKeys() + sort.Sort(mapKeys(keys)) + for _, key := range keys { + val := fv.MapIndex(key) + if err := writeName(w, props); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + // open struct + if err := w.WriteByte('<'); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte('\n'); err != nil { + return err + } + } + w.indent() + // key + if _, err := w.WriteString("key:"); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + if err := tm.writeAny(w, key, props.mkeyprop); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + // nil values aren't legal, but we can avoid panicking because of them. + if val.Kind() != reflect.Ptr || !val.IsNil() { + // value + if _, err := w.WriteString("value:"); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + if err := tm.writeAny(w, val, props.mvalprop); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + } + // close struct + w.unindent() + if err := w.WriteByte('>'); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + } + continue + } + if props.proto3 && fv.Kind() == reflect.Slice && fv.Len() == 0 { + // empty bytes field + continue + } + if fv.Kind() != reflect.Ptr && fv.Kind() != reflect.Slice { + // proto3 non-repeated scalar field; skip if zero value + if isProto3Zero(fv) { + continue + } + } + + if fv.Kind() == reflect.Interface { + // Check if it is a oneof. + if st.Field(i).Tag.Get("protobuf_oneof") != "" { + // fv is nil, or holds a pointer to generated struct. + // That generated struct has exactly one field, + // which has a protobuf struct tag. + if fv.IsNil() { + continue + } + inner := fv.Elem().Elem() // interface -> *T -> T + tag := inner.Type().Field(0).Tag.Get("protobuf") + props = new(Properties) // Overwrite the outer props var, but not its pointee. + props.Parse(tag) + // Write the value in the oneof, not the oneof itself. + fv = inner.Field(0) + + // Special case to cope with malformed messages gracefully: + // If the value in the oneof is a nil pointer, don't panic + // in writeAny. + if fv.Kind() == reflect.Ptr && fv.IsNil() { + // Use errors.New so writeAny won't render quotes. + msg := errors.New("/* nil */") + fv = reflect.ValueOf(&msg).Elem() + } + } + } + + if err := writeName(w, props); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + if b, ok := fv.Interface().(raw); ok { + if err := writeRaw(w, b.Bytes()); err != nil { + return err + } + continue + } + + // Enums have a String method, so writeAny will work fine. + if err := tm.writeAny(w, fv, props); err != nil { + return err + } + + if err := w.WriteByte('\n'); err != nil { + return err + } + } + + // Extensions (the XXX_extensions field). + pv := sv.Addr() + if _, ok := extendable(pv.Interface()); ok { + if err := tm.writeExtensions(w, pv); err != nil { + return err + } + } + + return nil +} + +// writeRaw writes an uninterpreted raw message. +func writeRaw(w *textWriter, b []byte) error { + if err := w.WriteByte('<'); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte('\n'); err != nil { + return err + } + } + w.indent() + if err := writeUnknownStruct(w, b); err != nil { + return err + } + w.unindent() + if err := w.WriteByte('>'); err != nil { + return err + } + return nil +} + +// writeAny writes an arbitrary field. +func (tm *TextMarshaler) writeAny(w *textWriter, v reflect.Value, props *Properties) error { + v = reflect.Indirect(v) + + // Floats have special cases. + if v.Kind() == reflect.Float32 || v.Kind() == reflect.Float64 { + x := v.Float() + var b []byte + switch { + case math.IsInf(x, 1): + b = posInf + case math.IsInf(x, -1): + b = negInf + case math.IsNaN(x): + b = nan + } + if b != nil { + _, err := w.Write(b) + return err + } + // Other values are handled below. + } + + // We don't attempt to serialise every possible value type; only those + // that can occur in protocol buffers. + switch v.Kind() { + case reflect.Slice: + // Should only be a []byte; repeated fields are handled in writeStruct. + if err := writeString(w, string(v.Bytes())); err != nil { + return err + } + case reflect.String: + if err := writeString(w, v.String()); err != nil { + return err + } + case reflect.Struct: + // Required/optional group/message. + var bra, ket byte = '<', '>' + if props != nil && props.Wire == "group" { + bra, ket = '{', '}' + } + if err := w.WriteByte(bra); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte('\n'); err != nil { + return err + } + } + w.indent() + if etm, ok := v.Interface().(encoding.TextMarshaler); ok { + text, err := etm.MarshalText() + if err != nil { + return err + } + if _, err = w.Write(text); err != nil { + return err + } + } else if err := tm.writeStruct(w, v); err != nil { + return err + } + w.unindent() + if err := w.WriteByte(ket); err != nil { + return err + } + default: + _, err := fmt.Fprint(w, v.Interface()) + return err + } + return nil +} + +// equivalent to C's isprint. +func isprint(c byte) bool { + return c >= 0x20 && c < 0x7f +} + +// writeString writes a string in the protocol buffer text format. +// It is similar to strconv.Quote except we don't use Go escape sequences, +// we treat the string as a byte sequence, and we use octal escapes. +// These differences are to maintain interoperability with the other +// languages' implementations of the text format. +func writeString(w *textWriter, s string) error { + // use WriteByte here to get any needed indent + if err := w.WriteByte('"'); err != nil { + return err + } + // Loop over the bytes, not the runes. + for i := 0; i < len(s); i++ { + var err error + // Divergence from C++: we don't escape apostrophes. + // There's no need to escape them, and the C++ parser + // copes with a naked apostrophe. + switch c := s[i]; c { + case '\n': + _, err = w.w.Write(backslashN) + case '\r': + _, err = w.w.Write(backslashR) + case '\t': + _, err = w.w.Write(backslashT) + case '"': + _, err = w.w.Write(backslashDQ) + case '\\': + _, err = w.w.Write(backslashBS) + default: + if isprint(c) { + err = w.w.WriteByte(c) + } else { + _, err = fmt.Fprintf(w.w, "\\%03o", c) + } + } + if err != nil { + return err + } + } + return w.WriteByte('"') +} + +func writeUnknownStruct(w *textWriter, data []byte) (err error) { + if !w.compact { + if _, err := fmt.Fprintf(w, "/* %d unknown bytes */\n", len(data)); err != nil { + return err + } + } + b := NewBuffer(data) + for b.index < len(b.buf) { + x, err := b.DecodeVarint() + if err != nil { + _, err := fmt.Fprintf(w, "/* %v */\n", err) + return err + } + wire, tag := x&7, x>>3 + if wire == WireEndGroup { + w.unindent() + if _, err := w.Write(endBraceNewline); err != nil { + return err + } + continue + } + if _, err := fmt.Fprint(w, tag); err != nil { + return err + } + if wire != WireStartGroup { + if err := w.WriteByte(':'); err != nil { + return err + } + } + if !w.compact || wire == WireStartGroup { + if err := w.WriteByte(' '); err != nil { + return err + } + } + switch wire { + case WireBytes: + buf, e := b.DecodeRawBytes(false) + if e == nil { + _, err = fmt.Fprintf(w, "%q", buf) + } else { + _, err = fmt.Fprintf(w, "/* %v */", e) + } + case WireFixed32: + x, err = b.DecodeFixed32() + err = writeUnknownInt(w, x, err) + case WireFixed64: + x, err = b.DecodeFixed64() + err = writeUnknownInt(w, x, err) + case WireStartGroup: + err = w.WriteByte('{') + w.indent() + case WireVarint: + x, err = b.DecodeVarint() + err = writeUnknownInt(w, x, err) + default: + _, err = fmt.Fprintf(w, "/* unknown wire type %d */", wire) + } + if err != nil { + return err + } + if err = w.WriteByte('\n'); err != nil { + return err + } + } + return nil +} + +func writeUnknownInt(w *textWriter, x uint64, err error) error { + if err == nil { + _, err = fmt.Fprint(w, x) + } else { + _, err = fmt.Fprintf(w, "/* %v */", err) + } + return err +} + +type int32Slice []int32 + +func (s int32Slice) Len() int { return len(s) } +func (s int32Slice) Less(i, j int) bool { return s[i] < s[j] } +func (s int32Slice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } + +// writeExtensions writes all the extensions in pv. +// pv is assumed to be a pointer to a protocol message struct that is extendable. +func (tm *TextMarshaler) writeExtensions(w *textWriter, pv reflect.Value) error { + emap := extensionMaps[pv.Type().Elem()] + ep, _ := extendable(pv.Interface()) + + // Order the extensions by ID. + // This isn't strictly necessary, but it will give us + // canonical output, which will also make testing easier. + m, mu := ep.extensionsRead() + if m == nil { + return nil + } + mu.Lock() + ids := make([]int32, 0, len(m)) + for id := range m { + ids = append(ids, id) + } + sort.Sort(int32Slice(ids)) + mu.Unlock() + + for _, extNum := range ids { + ext := m[extNum] + var desc *ExtensionDesc + if emap != nil { + desc = emap[extNum] + } + if desc == nil { + // Unknown extension. + if err := writeUnknownStruct(w, ext.enc); err != nil { + return err + } + continue + } + + pb, err := GetExtension(ep, desc) + if err != nil { + return fmt.Errorf("failed getting extension: %v", err) + } + + // Repeated extensions will appear as a slice. + if !desc.repeated() { + if err := tm.writeExtension(w, desc.Name, pb); err != nil { + return err + } + } else { + v := reflect.ValueOf(pb) + for i := 0; i < v.Len(); i++ { + if err := tm.writeExtension(w, desc.Name, v.Index(i).Interface()); err != nil { + return err + } + } + } + } + return nil +} + +func (tm *TextMarshaler) writeExtension(w *textWriter, name string, pb interface{}) error { + if _, err := fmt.Fprintf(w, "[%s]:", name); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + if err := tm.writeAny(w, reflect.ValueOf(pb), nil); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + return nil +} + +func (w *textWriter) writeIndent() { + if !w.complete { + return + } + remain := w.ind * 2 + for remain > 0 { + n := remain + if n > len(spaces) { + n = len(spaces) + } + w.w.Write(spaces[:n]) + remain -= n + } + w.complete = false +} + +// TextMarshaler is a configurable text format marshaler. +type TextMarshaler struct { + Compact bool // use compact text format (one line). + ExpandAny bool // expand google.protobuf.Any messages of known types +} + +// Marshal writes a given protocol buffer in text format. +// The only errors returned are from w. +func (tm *TextMarshaler) Marshal(w io.Writer, pb Message) error { + val := reflect.ValueOf(pb) + if pb == nil || val.IsNil() { + w.Write([]byte("")) + return nil + } + var bw *bufio.Writer + ww, ok := w.(writer) + if !ok { + bw = bufio.NewWriter(w) + ww = bw + } + aw := &textWriter{ + w: ww, + complete: true, + compact: tm.Compact, + } + + if etm, ok := pb.(encoding.TextMarshaler); ok { + text, err := etm.MarshalText() + if err != nil { + return err + } + if _, err = aw.Write(text); err != nil { + return err + } + if bw != nil { + return bw.Flush() + } + return nil + } + // Dereference the received pointer so we don't have outer < and >. + v := reflect.Indirect(val) + if err := tm.writeStruct(aw, v); err != nil { + return err + } + if bw != nil { + return bw.Flush() + } + return nil +} + +// Text is the same as Marshal, but returns the string directly. +func (tm *TextMarshaler) Text(pb Message) string { + var buf bytes.Buffer + tm.Marshal(&buf, pb) + return buf.String() +} + +var ( + defaultTextMarshaler = TextMarshaler{} + compactTextMarshaler = TextMarshaler{Compact: true} +) + +// TODO: consider removing some of the Marshal functions below. + +// MarshalText writes a given protocol buffer in text format. +// The only errors returned are from w. +func MarshalText(w io.Writer, pb Message) error { return defaultTextMarshaler.Marshal(w, pb) } + +// MarshalTextString is the same as MarshalText, but returns the string directly. +func MarshalTextString(pb Message) string { return defaultTextMarshaler.Text(pb) } + +// CompactText writes a given protocol buffer in compact text format (one line). +func CompactText(w io.Writer, pb Message) error { return compactTextMarshaler.Marshal(w, pb) } + +// CompactTextString is the same as CompactText, but returns the string directly. +func CompactTextString(pb Message) string { return compactTextMarshaler.Text(pb) } diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/text_parser.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/text_parser.go new file mode 100644 index 0000000..5e14513 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/text_parser.go @@ -0,0 +1,895 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package proto + +// Functions for parsing the Text protocol buffer format. +// TODO: message sets. + +import ( + "encoding" + "errors" + "fmt" + "reflect" + "strconv" + "strings" + "unicode/utf8" +) + +// Error string emitted when deserializing Any and fields are already set +const anyRepeatedlyUnpacked = "Any message unpacked multiple times, or %q already set" + +type ParseError struct { + Message string + Line int // 1-based line number + Offset int // 0-based byte offset from start of input +} + +func (p *ParseError) Error() string { + if p.Line == 1 { + // show offset only for first line + return fmt.Sprintf("line 1.%d: %v", p.Offset, p.Message) + } + return fmt.Sprintf("line %d: %v", p.Line, p.Message) +} + +type token struct { + value string + err *ParseError + line int // line number + offset int // byte number from start of input, not start of line + unquoted string // the unquoted version of value, if it was a quoted string +} + +func (t *token) String() string { + if t.err == nil { + return fmt.Sprintf("%q (line=%d, offset=%d)", t.value, t.line, t.offset) + } + return fmt.Sprintf("parse error: %v", t.err) +} + +type textParser struct { + s string // remaining input + done bool // whether the parsing is finished (success or error) + backed bool // whether back() was called + offset, line int + cur token +} + +func newTextParser(s string) *textParser { + p := new(textParser) + p.s = s + p.line = 1 + p.cur.line = 1 + return p +} + +func (p *textParser) errorf(format string, a ...interface{}) *ParseError { + pe := &ParseError{fmt.Sprintf(format, a...), p.cur.line, p.cur.offset} + p.cur.err = pe + p.done = true + return pe +} + +// Numbers and identifiers are matched by [-+._A-Za-z0-9] +func isIdentOrNumberChar(c byte) bool { + switch { + case 'A' <= c && c <= 'Z', 'a' <= c && c <= 'z': + return true + case '0' <= c && c <= '9': + return true + } + switch c { + case '-', '+', '.', '_': + return true + } + return false +} + +func isWhitespace(c byte) bool { + switch c { + case ' ', '\t', '\n', '\r': + return true + } + return false +} + +func isQuote(c byte) bool { + switch c { + case '"', '\'': + return true + } + return false +} + +func (p *textParser) skipWhitespace() { + i := 0 + for i < len(p.s) && (isWhitespace(p.s[i]) || p.s[i] == '#') { + if p.s[i] == '#' { + // comment; skip to end of line or input + for i < len(p.s) && p.s[i] != '\n' { + i++ + } + if i == len(p.s) { + break + } + } + if p.s[i] == '\n' { + p.line++ + } + i++ + } + p.offset += i + p.s = p.s[i:len(p.s)] + if len(p.s) == 0 { + p.done = true + } +} + +func (p *textParser) advance() { + // Skip whitespace + p.skipWhitespace() + if p.done { + return + } + + // Start of non-whitespace + p.cur.err = nil + p.cur.offset, p.cur.line = p.offset, p.line + p.cur.unquoted = "" + switch p.s[0] { + case '<', '>', '{', '}', ':', '[', ']', ';', ',', '/': + // Single symbol + p.cur.value, p.s = p.s[0:1], p.s[1:len(p.s)] + case '"', '\'': + // Quoted string + i := 1 + for i < len(p.s) && p.s[i] != p.s[0] && p.s[i] != '\n' { + if p.s[i] == '\\' && i+1 < len(p.s) { + // skip escaped char + i++ + } + i++ + } + if i >= len(p.s) || p.s[i] != p.s[0] { + p.errorf("unmatched quote") + return + } + unq, err := unquoteC(p.s[1:i], rune(p.s[0])) + if err != nil { + p.errorf("invalid quoted string %s: %v", p.s[0:i+1], err) + return + } + p.cur.value, p.s = p.s[0:i+1], p.s[i+1:len(p.s)] + p.cur.unquoted = unq + default: + i := 0 + for i < len(p.s) && isIdentOrNumberChar(p.s[i]) { + i++ + } + if i == 0 { + p.errorf("unexpected byte %#x", p.s[0]) + return + } + p.cur.value, p.s = p.s[0:i], p.s[i:len(p.s)] + } + p.offset += len(p.cur.value) +} + +var ( + errBadUTF8 = errors.New("proto: bad UTF-8") + errBadHex = errors.New("proto: bad hexadecimal") +) + +func unquoteC(s string, quote rune) (string, error) { + // This is based on C++'s tokenizer.cc. + // Despite its name, this is *not* parsing C syntax. + // For instance, "\0" is an invalid quoted string. + + // Avoid allocation in trivial cases. + simple := true + for _, r := range s { + if r == '\\' || r == quote { + simple = false + break + } + } + if simple { + return s, nil + } + + buf := make([]byte, 0, 3*len(s)/2) + for len(s) > 0 { + r, n := utf8.DecodeRuneInString(s) + if r == utf8.RuneError && n == 1 { + return "", errBadUTF8 + } + s = s[n:] + if r != '\\' { + if r < utf8.RuneSelf { + buf = append(buf, byte(r)) + } else { + buf = append(buf, string(r)...) + } + continue + } + + ch, tail, err := unescape(s) + if err != nil { + return "", err + } + buf = append(buf, ch...) + s = tail + } + return string(buf), nil +} + +func unescape(s string) (ch string, tail string, err error) { + r, n := utf8.DecodeRuneInString(s) + if r == utf8.RuneError && n == 1 { + return "", "", errBadUTF8 + } + s = s[n:] + switch r { + case 'a': + return "\a", s, nil + case 'b': + return "\b", s, nil + case 'f': + return "\f", s, nil + case 'n': + return "\n", s, nil + case 'r': + return "\r", s, nil + case 't': + return "\t", s, nil + case 'v': + return "\v", s, nil + case '?': + return "?", s, nil // trigraph workaround + case '\'', '"', '\\': + return string(r), s, nil + case '0', '1', '2', '3', '4', '5', '6', '7', 'x', 'X': + if len(s) < 2 { + return "", "", fmt.Errorf(`\%c requires 2 following digits`, r) + } + base := 8 + ss := s[:2] + s = s[2:] + if r == 'x' || r == 'X' { + base = 16 + } else { + ss = string(r) + ss + } + i, err := strconv.ParseUint(ss, base, 8) + if err != nil { + return "", "", err + } + return string([]byte{byte(i)}), s, nil + case 'u', 'U': + n := 4 + if r == 'U' { + n = 8 + } + if len(s) < n { + return "", "", fmt.Errorf(`\%c requires %d digits`, r, n) + } + + bs := make([]byte, n/2) + for i := 0; i < n; i += 2 { + a, ok1 := unhex(s[i]) + b, ok2 := unhex(s[i+1]) + if !ok1 || !ok2 { + return "", "", errBadHex + } + bs[i/2] = a<<4 | b + } + s = s[n:] + return string(bs), s, nil + } + return "", "", fmt.Errorf(`unknown escape \%c`, r) +} + +// Adapted from src/pkg/strconv/quote.go. +func unhex(b byte) (v byte, ok bool) { + switch { + case '0' <= b && b <= '9': + return b - '0', true + case 'a' <= b && b <= 'f': + return b - 'a' + 10, true + case 'A' <= b && b <= 'F': + return b - 'A' + 10, true + } + return 0, false +} + +// Back off the parser by one token. Can only be done between calls to next(). +// It makes the next advance() a no-op. +func (p *textParser) back() { p.backed = true } + +// Advances the parser and returns the new current token. +func (p *textParser) next() *token { + if p.backed || p.done { + p.backed = false + return &p.cur + } + p.advance() + if p.done { + p.cur.value = "" + } else if len(p.cur.value) > 0 && isQuote(p.cur.value[0]) { + // Look for multiple quoted strings separated by whitespace, + // and concatenate them. + cat := p.cur + for { + p.skipWhitespace() + if p.done || !isQuote(p.s[0]) { + break + } + p.advance() + if p.cur.err != nil { + return &p.cur + } + cat.value += " " + p.cur.value + cat.unquoted += p.cur.unquoted + } + p.done = false // parser may have seen EOF, but we want to return cat + p.cur = cat + } + return &p.cur +} + +func (p *textParser) consumeToken(s string) error { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value != s { + p.back() + return p.errorf("expected %q, found %q", s, tok.value) + } + return nil +} + +// Return a RequiredNotSetError indicating which required field was not set. +func (p *textParser) missingRequiredFieldError(sv reflect.Value) *RequiredNotSetError { + st := sv.Type() + sprops := GetProperties(st) + for i := 0; i < st.NumField(); i++ { + if !isNil(sv.Field(i)) { + continue + } + + props := sprops.Prop[i] + if props.Required { + return &RequiredNotSetError{fmt.Sprintf("%v.%v", st, props.OrigName)} + } + } + return &RequiredNotSetError{fmt.Sprintf("%v.", st)} // should not happen +} + +// Returns the index in the struct for the named field, as well as the parsed tag properties. +func structFieldByName(sprops *StructProperties, name string) (int, *Properties, bool) { + i, ok := sprops.decoderOrigNames[name] + if ok { + return i, sprops.Prop[i], true + } + return -1, nil, false +} + +// Consume a ':' from the input stream (if the next token is a colon), +// returning an error if a colon is needed but not present. +func (p *textParser) checkForColon(props *Properties, typ reflect.Type) *ParseError { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value != ":" { + // Colon is optional when the field is a group or message. + needColon := true + switch props.Wire { + case "group": + needColon = false + case "bytes": + // A "bytes" field is either a message, a string, or a repeated field; + // those three become *T, *string and []T respectively, so we can check for + // this field being a pointer to a non-string. + if typ.Kind() == reflect.Ptr { + // *T or *string + if typ.Elem().Kind() == reflect.String { + break + } + } else if typ.Kind() == reflect.Slice { + // []T or []*T + if typ.Elem().Kind() != reflect.Ptr { + break + } + } else if typ.Kind() == reflect.String { + // The proto3 exception is for a string field, + // which requires a colon. + break + } + needColon = false + } + if needColon { + return p.errorf("expected ':', found %q", tok.value) + } + p.back() + } + return nil +} + +func (p *textParser) readStruct(sv reflect.Value, terminator string) error { + st := sv.Type() + sprops := GetProperties(st) + reqCount := sprops.reqCount + var reqFieldErr error + fieldSet := make(map[string]bool) + // A struct is a sequence of "name: value", terminated by one of + // '>' or '}', or the end of the input. A name may also be + // "[extension]" or "[type/url]". + // + // The whole struct can also be an expanded Any message, like: + // [type/url] < ... struct contents ... > + for { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value == terminator { + break + } + if tok.value == "[" { + // Looks like an extension or an Any. + // + // TODO: Check whether we need to handle + // namespace rooted names (e.g. ".something.Foo"). + extName, err := p.consumeExtName() + if err != nil { + return err + } + + if s := strings.LastIndex(extName, "/"); s >= 0 { + // If it contains a slash, it's an Any type URL. + messageName := extName[s+1:] + mt := MessageType(messageName) + if mt == nil { + return p.errorf("unrecognized message %q in google.protobuf.Any", messageName) + } + tok = p.next() + if tok.err != nil { + return tok.err + } + // consume an optional colon + if tok.value == ":" { + tok = p.next() + if tok.err != nil { + return tok.err + } + } + var terminator string + switch tok.value { + case "<": + terminator = ">" + case "{": + terminator = "}" + default: + return p.errorf("expected '{' or '<', found %q", tok.value) + } + v := reflect.New(mt.Elem()) + if pe := p.readStruct(v.Elem(), terminator); pe != nil { + return pe + } + b, err := Marshal(v.Interface().(Message)) + if err != nil { + return p.errorf("failed to marshal message of type %q: %v", messageName, err) + } + if fieldSet["type_url"] { + return p.errorf(anyRepeatedlyUnpacked, "type_url") + } + if fieldSet["value"] { + return p.errorf(anyRepeatedlyUnpacked, "value") + } + sv.FieldByName("TypeUrl").SetString(extName) + sv.FieldByName("Value").SetBytes(b) + fieldSet["type_url"] = true + fieldSet["value"] = true + continue + } + + var desc *ExtensionDesc + // This could be faster, but it's functional. + // TODO: Do something smarter than a linear scan. + for _, d := range RegisteredExtensions(reflect.New(st).Interface().(Message)) { + if d.Name == extName { + desc = d + break + } + } + if desc == nil { + return p.errorf("unrecognized extension %q", extName) + } + + props := &Properties{} + props.Parse(desc.Tag) + + typ := reflect.TypeOf(desc.ExtensionType) + if err := p.checkForColon(props, typ); err != nil { + return err + } + + rep := desc.repeated() + + // Read the extension structure, and set it in + // the value we're constructing. + var ext reflect.Value + if !rep { + ext = reflect.New(typ).Elem() + } else { + ext = reflect.New(typ.Elem()).Elem() + } + if err := p.readAny(ext, props); err != nil { + if _, ok := err.(*RequiredNotSetError); !ok { + return err + } + reqFieldErr = err + } + ep := sv.Addr().Interface().(Message) + if !rep { + SetExtension(ep, desc, ext.Interface()) + } else { + old, err := GetExtension(ep, desc) + var sl reflect.Value + if err == nil { + sl = reflect.ValueOf(old) // existing slice + } else { + sl = reflect.MakeSlice(typ, 0, 1) + } + sl = reflect.Append(sl, ext) + SetExtension(ep, desc, sl.Interface()) + } + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + continue + } + + // This is a normal, non-extension field. + name := tok.value + var dst reflect.Value + fi, props, ok := structFieldByName(sprops, name) + if ok { + dst = sv.Field(fi) + } else if oop, ok := sprops.OneofTypes[name]; ok { + // It is a oneof. + props = oop.Prop + nv := reflect.New(oop.Type.Elem()) + dst = nv.Elem().Field(0) + field := sv.Field(oop.Field) + if !field.IsNil() { + return p.errorf("field '%s' would overwrite already parsed oneof '%s'", name, sv.Type().Field(oop.Field).Name) + } + field.Set(nv) + } + if !dst.IsValid() { + return p.errorf("unknown field name %q in %v", name, st) + } + + if dst.Kind() == reflect.Map { + // Consume any colon. + if err := p.checkForColon(props, dst.Type()); err != nil { + return err + } + + // Construct the map if it doesn't already exist. + if dst.IsNil() { + dst.Set(reflect.MakeMap(dst.Type())) + } + key := reflect.New(dst.Type().Key()).Elem() + val := reflect.New(dst.Type().Elem()).Elem() + + // The map entry should be this sequence of tokens: + // < key : KEY value : VALUE > + // However, implementations may omit key or value, and technically + // we should support them in any order. See b/28924776 for a time + // this went wrong. + + tok := p.next() + var terminator string + switch tok.value { + case "<": + terminator = ">" + case "{": + terminator = "}" + default: + return p.errorf("expected '{' or '<', found %q", tok.value) + } + for { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value == terminator { + break + } + switch tok.value { + case "key": + if err := p.consumeToken(":"); err != nil { + return err + } + if err := p.readAny(key, props.mkeyprop); err != nil { + return err + } + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + case "value": + if err := p.checkForColon(props.mvalprop, dst.Type().Elem()); err != nil { + return err + } + if err := p.readAny(val, props.mvalprop); err != nil { + return err + } + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + default: + p.back() + return p.errorf(`expected "key", "value", or %q, found %q`, terminator, tok.value) + } + } + + dst.SetMapIndex(key, val) + continue + } + + // Check that it's not already set if it's not a repeated field. + if !props.Repeated && fieldSet[name] { + return p.errorf("non-repeated field %q was repeated", name) + } + + if err := p.checkForColon(props, dst.Type()); err != nil { + return err + } + + // Parse into the field. + fieldSet[name] = true + if err := p.readAny(dst, props); err != nil { + if _, ok := err.(*RequiredNotSetError); !ok { + return err + } + reqFieldErr = err + } + if props.Required { + reqCount-- + } + + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + + } + + if reqCount > 0 { + return p.missingRequiredFieldError(sv) + } + return reqFieldErr +} + +// consumeExtName consumes extension name or expanded Any type URL and the +// following ']'. It returns the name or URL consumed. +func (p *textParser) consumeExtName() (string, error) { + tok := p.next() + if tok.err != nil { + return "", tok.err + } + + // If extension name or type url is quoted, it's a single token. + if len(tok.value) > 2 && isQuote(tok.value[0]) && tok.value[len(tok.value)-1] == tok.value[0] { + name, err := unquoteC(tok.value[1:len(tok.value)-1], rune(tok.value[0])) + if err != nil { + return "", err + } + return name, p.consumeToken("]") + } + + // Consume everything up to "]" + var parts []string + for tok.value != "]" { + parts = append(parts, tok.value) + tok = p.next() + if tok.err != nil { + return "", p.errorf("unrecognized type_url or extension name: %s", tok.err) + } + } + return strings.Join(parts, ""), nil +} + +// consumeOptionalSeparator consumes an optional semicolon or comma. +// It is used in readStruct to provide backward compatibility. +func (p *textParser) consumeOptionalSeparator() error { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value != ";" && tok.value != "," { + p.back() + } + return nil +} + +func (p *textParser) readAny(v reflect.Value, props *Properties) error { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value == "" { + return p.errorf("unexpected EOF") + } + + switch fv := v; fv.Kind() { + case reflect.Slice: + at := v.Type() + if at.Elem().Kind() == reflect.Uint8 { + // Special case for []byte + if tok.value[0] != '"' && tok.value[0] != '\'' { + // Deliberately written out here, as the error after + // this switch statement would write "invalid []byte: ...", + // which is not as user-friendly. + return p.errorf("invalid string: %v", tok.value) + } + bytes := []byte(tok.unquoted) + fv.Set(reflect.ValueOf(bytes)) + return nil + } + // Repeated field. + if tok.value == "[" { + // Repeated field with list notation, like [1,2,3]. + for { + fv.Set(reflect.Append(fv, reflect.New(at.Elem()).Elem())) + err := p.readAny(fv.Index(fv.Len()-1), props) + if err != nil { + return err + } + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value == "]" { + break + } + if tok.value != "," { + return p.errorf("Expected ']' or ',' found %q", tok.value) + } + } + return nil + } + // One value of the repeated field. + p.back() + fv.Set(reflect.Append(fv, reflect.New(at.Elem()).Elem())) + return p.readAny(fv.Index(fv.Len()-1), props) + case reflect.Bool: + // true/1/t/True or false/f/0/False. + switch tok.value { + case "true", "1", "t", "True": + fv.SetBool(true) + return nil + case "false", "0", "f", "False": + fv.SetBool(false) + return nil + } + case reflect.Float32, reflect.Float64: + v := tok.value + // Ignore 'f' for compatibility with output generated by C++, but don't + // remove 'f' when the value is "-inf" or "inf". + if strings.HasSuffix(v, "f") && tok.value != "-inf" && tok.value != "inf" { + v = v[:len(v)-1] + } + if f, err := strconv.ParseFloat(v, fv.Type().Bits()); err == nil { + fv.SetFloat(f) + return nil + } + case reflect.Int32: + if x, err := strconv.ParseInt(tok.value, 0, 32); err == nil { + fv.SetInt(x) + return nil + } + + if len(props.Enum) == 0 { + break + } + m, ok := enumValueMaps[props.Enum] + if !ok { + break + } + x, ok := m[tok.value] + if !ok { + break + } + fv.SetInt(int64(x)) + return nil + case reflect.Int64: + if x, err := strconv.ParseInt(tok.value, 0, 64); err == nil { + fv.SetInt(x) + return nil + } + + case reflect.Ptr: + // A basic field (indirected through pointer), or a repeated message/group + p.back() + fv.Set(reflect.New(fv.Type().Elem())) + return p.readAny(fv.Elem(), props) + case reflect.String: + if tok.value[0] == '"' || tok.value[0] == '\'' { + fv.SetString(tok.unquoted) + return nil + } + case reflect.Struct: + var terminator string + switch tok.value { + case "{": + terminator = "}" + case "<": + terminator = ">" + default: + return p.errorf("expected '{' or '<', found %q", tok.value) + } + // TODO: Handle nested messages which implement encoding.TextUnmarshaler. + return p.readStruct(fv, terminator) + case reflect.Uint32: + if x, err := strconv.ParseUint(tok.value, 0, 32); err == nil { + fv.SetUint(x) + return nil + } + case reflect.Uint64: + if x, err := strconv.ParseUint(tok.value, 0, 64); err == nil { + fv.SetUint(x) + return nil + } + } + return p.errorf("invalid %v: %v", v.Type(), tok.value) +} + +// UnmarshalText reads a protocol buffer in Text format. UnmarshalText resets pb +// before starting to unmarshal, so any existing data in pb is always removed. +// If a required field is not set and no other error occurs, +// UnmarshalText returns *RequiredNotSetError. +func UnmarshalText(s string, pb Message) error { + if um, ok := pb.(encoding.TextUnmarshaler); ok { + err := um.UnmarshalText([]byte(s)) + return err + } + pb.Reset() + v := reflect.ValueOf(pb) + if pe := newTextParser(s).readStruct(v.Elem(), ""); pe != nil { + return pe + } + return nil +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/text_parser_test.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/text_parser_test.go new file mode 100644 index 0000000..8f7cb4d --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/text_parser_test.go @@ -0,0 +1,673 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package proto_test + +import ( + "math" + "reflect" + "testing" + + . "github.com/golang/protobuf/proto" + proto3pb "github.com/golang/protobuf/proto/proto3_proto" + . "github.com/golang/protobuf/proto/testdata" +) + +type UnmarshalTextTest struct { + in string + err string // if "", no error expected + out *MyMessage +} + +func buildExtStructTest(text string) UnmarshalTextTest { + msg := &MyMessage{ + Count: Int32(42), + } + SetExtension(msg, E_Ext_More, &Ext{ + Data: String("Hello, world!"), + }) + return UnmarshalTextTest{in: text, out: msg} +} + +func buildExtDataTest(text string) UnmarshalTextTest { + msg := &MyMessage{ + Count: Int32(42), + } + SetExtension(msg, E_Ext_Text, String("Hello, world!")) + SetExtension(msg, E_Ext_Number, Int32(1729)) + return UnmarshalTextTest{in: text, out: msg} +} + +func buildExtRepStringTest(text string) UnmarshalTextTest { + msg := &MyMessage{ + Count: Int32(42), + } + if err := SetExtension(msg, E_Greeting, []string{"bula", "hola"}); err != nil { + panic(err) + } + return UnmarshalTextTest{in: text, out: msg} +} + +var unMarshalTextTests = []UnmarshalTextTest{ + // Basic + { + in: " count:42\n name:\"Dave\" ", + out: &MyMessage{ + Count: Int32(42), + Name: String("Dave"), + }, + }, + + // Empty quoted string + { + in: `count:42 name:""`, + out: &MyMessage{ + Count: Int32(42), + Name: String(""), + }, + }, + + // Quoted string concatenation with double quotes + { + in: `count:42 name: "My name is "` + "\n" + `"elsewhere"`, + out: &MyMessage{ + Count: Int32(42), + Name: String("My name is elsewhere"), + }, + }, + + // Quoted string concatenation with single quotes + { + in: "count:42 name: 'My name is '\n'elsewhere'", + out: &MyMessage{ + Count: Int32(42), + Name: String("My name is elsewhere"), + }, + }, + + // Quoted string concatenations with mixed quotes + { + in: "count:42 name: 'My name is '\n\"elsewhere\"", + out: &MyMessage{ + Count: Int32(42), + Name: String("My name is elsewhere"), + }, + }, + { + in: "count:42 name: \"My name is \"\n'elsewhere'", + out: &MyMessage{ + Count: Int32(42), + Name: String("My name is elsewhere"), + }, + }, + + // Quoted string with escaped apostrophe + { + in: `count:42 name: "HOLIDAY - New Year\'s Day"`, + out: &MyMessage{ + Count: Int32(42), + Name: String("HOLIDAY - New Year's Day"), + }, + }, + + // Quoted string with single quote + { + in: `count:42 name: 'Roger "The Ramster" Ramjet'`, + out: &MyMessage{ + Count: Int32(42), + Name: String(`Roger "The Ramster" Ramjet`), + }, + }, + + // Quoted string with all the accepted special characters from the C++ test + { + in: `count:42 name: ` + "\"\\\"A string with \\' characters \\n and \\r newlines and \\t tabs and \\001 slashes \\\\ and multiple spaces\"", + out: &MyMessage{ + Count: Int32(42), + Name: String("\"A string with ' characters \n and \r newlines and \t tabs and \001 slashes \\ and multiple spaces"), + }, + }, + + // Quoted string with quoted backslash + { + in: `count:42 name: "\\'xyz"`, + out: &MyMessage{ + Count: Int32(42), + Name: String(`\'xyz`), + }, + }, + + // Quoted string with UTF-8 bytes. + { + in: "count:42 name: '\303\277\302\201\xAB'", + out: &MyMessage{ + Count: Int32(42), + Name: String("\303\277\302\201\xAB"), + }, + }, + + // Bad quoted string + { + in: `inner: < host: "\0" >` + "\n", + err: `line 1.15: invalid quoted string "\0": \0 requires 2 following digits`, + }, + + // Number too large for int64 + { + in: "count: 1 others { key: 123456789012345678901 }", + err: "line 1.23: invalid int64: 123456789012345678901", + }, + + // Number too large for int32 + { + in: "count: 1234567890123", + err: "line 1.7: invalid int32: 1234567890123", + }, + + // Number in hexadecimal + { + in: "count: 0x2beef", + out: &MyMessage{ + Count: Int32(0x2beef), + }, + }, + + // Number in octal + { + in: "count: 024601", + out: &MyMessage{ + Count: Int32(024601), + }, + }, + + // Floating point number with "f" suffix + { + in: "count: 4 others:< weight: 17.0f >", + out: &MyMessage{ + Count: Int32(4), + Others: []*OtherMessage{ + { + Weight: Float32(17), + }, + }, + }, + }, + + // Floating point positive infinity + { + in: "count: 4 bigfloat: inf", + out: &MyMessage{ + Count: Int32(4), + Bigfloat: Float64(math.Inf(1)), + }, + }, + + // Floating point negative infinity + { + in: "count: 4 bigfloat: -inf", + out: &MyMessage{ + Count: Int32(4), + Bigfloat: Float64(math.Inf(-1)), + }, + }, + + // Number too large for float32 + { + in: "others:< weight: 12345678901234567890123456789012345678901234567890 >", + err: "line 1.17: invalid float32: 12345678901234567890123456789012345678901234567890", + }, + + // Number posing as a quoted string + { + in: `inner: < host: 12 >` + "\n", + err: `line 1.15: invalid string: 12`, + }, + + // Quoted string posing as int32 + { + in: `count: "12"`, + err: `line 1.7: invalid int32: "12"`, + }, + + // Quoted string posing a float32 + { + in: `others:< weight: "17.4" >`, + err: `line 1.17: invalid float32: "17.4"`, + }, + + // Enum + { + in: `count:42 bikeshed: BLUE`, + out: &MyMessage{ + Count: Int32(42), + Bikeshed: MyMessage_BLUE.Enum(), + }, + }, + + // Repeated field + { + in: `count:42 pet: "horsey" pet:"bunny"`, + out: &MyMessage{ + Count: Int32(42), + Pet: []string{"horsey", "bunny"}, + }, + }, + + // Repeated field with list notation + { + in: `count:42 pet: ["horsey", "bunny"]`, + out: &MyMessage{ + Count: Int32(42), + Pet: []string{"horsey", "bunny"}, + }, + }, + + // Repeated message with/without colon and <>/{} + { + in: `count:42 others:{} others{} others:<> others:{}`, + out: &MyMessage{ + Count: Int32(42), + Others: []*OtherMessage{ + {}, + {}, + {}, + {}, + }, + }, + }, + + // Missing colon for inner message + { + in: `count:42 inner < host: "cauchy.syd" >`, + out: &MyMessage{ + Count: Int32(42), + Inner: &InnerMessage{ + Host: String("cauchy.syd"), + }, + }, + }, + + // Missing colon for string field + { + in: `name "Dave"`, + err: `line 1.5: expected ':', found "\"Dave\""`, + }, + + // Missing colon for int32 field + { + in: `count 42`, + err: `line 1.6: expected ':', found "42"`, + }, + + // Missing required field + { + in: `name: "Pawel"`, + err: `proto: required field "testdata.MyMessage.count" not set`, + out: &MyMessage{ + Name: String("Pawel"), + }, + }, + + // Missing required field in a required submessage + { + in: `count: 42 we_must_go_deeper < leo_finally_won_an_oscar <> >`, + err: `proto: required field "testdata.InnerMessage.host" not set`, + out: &MyMessage{ + Count: Int32(42), + WeMustGoDeeper: &RequiredInnerMessage{LeoFinallyWonAnOscar: &InnerMessage{}}, + }, + }, + + // Repeated non-repeated field + { + in: `name: "Rob" name: "Russ"`, + err: `line 1.12: non-repeated field "name" was repeated`, + }, + + // Group + { + in: `count: 17 SomeGroup { group_field: 12 }`, + out: &MyMessage{ + Count: Int32(17), + Somegroup: &MyMessage_SomeGroup{ + GroupField: Int32(12), + }, + }, + }, + + // Semicolon between fields + { + in: `count:3;name:"Calvin"`, + out: &MyMessage{ + Count: Int32(3), + Name: String("Calvin"), + }, + }, + // Comma between fields + { + in: `count:4,name:"Ezekiel"`, + out: &MyMessage{ + Count: Int32(4), + Name: String("Ezekiel"), + }, + }, + + // Boolean false + { + in: `count:42 inner { host: "example.com" connected: false }`, + out: &MyMessage{ + Count: Int32(42), + Inner: &InnerMessage{ + Host: String("example.com"), + Connected: Bool(false), + }, + }, + }, + // Boolean true + { + in: `count:42 inner { host: "example.com" connected: true }`, + out: &MyMessage{ + Count: Int32(42), + Inner: &InnerMessage{ + Host: String("example.com"), + Connected: Bool(true), + }, + }, + }, + // Boolean 0 + { + in: `count:42 inner { host: "example.com" connected: 0 }`, + out: &MyMessage{ + Count: Int32(42), + Inner: &InnerMessage{ + Host: String("example.com"), + Connected: Bool(false), + }, + }, + }, + // Boolean 1 + { + in: `count:42 inner { host: "example.com" connected: 1 }`, + out: &MyMessage{ + Count: Int32(42), + Inner: &InnerMessage{ + Host: String("example.com"), + Connected: Bool(true), + }, + }, + }, + // Boolean f + { + in: `count:42 inner { host: "example.com" connected: f }`, + out: &MyMessage{ + Count: Int32(42), + Inner: &InnerMessage{ + Host: String("example.com"), + Connected: Bool(false), + }, + }, + }, + // Boolean t + { + in: `count:42 inner { host: "example.com" connected: t }`, + out: &MyMessage{ + Count: Int32(42), + Inner: &InnerMessage{ + Host: String("example.com"), + Connected: Bool(true), + }, + }, + }, + // Boolean False + { + in: `count:42 inner { host: "example.com" connected: False }`, + out: &MyMessage{ + Count: Int32(42), + Inner: &InnerMessage{ + Host: String("example.com"), + Connected: Bool(false), + }, + }, + }, + // Boolean True + { + in: `count:42 inner { host: "example.com" connected: True }`, + out: &MyMessage{ + Count: Int32(42), + Inner: &InnerMessage{ + Host: String("example.com"), + Connected: Bool(true), + }, + }, + }, + + // Extension + buildExtStructTest(`count: 42 [testdata.Ext.more]:`), + buildExtStructTest(`count: 42 [testdata.Ext.more] {data:"Hello, world!"}`), + buildExtDataTest(`count: 42 [testdata.Ext.text]:"Hello, world!" [testdata.Ext.number]:1729`), + buildExtRepStringTest(`count: 42 [testdata.greeting]:"bula" [testdata.greeting]:"hola"`), + + // Big all-in-one + { + in: "count:42 # Meaning\n" + + `name:"Dave" ` + + `quote:"\"I didn't want to go.\"" ` + + `pet:"bunny" ` + + `pet:"kitty" ` + + `pet:"horsey" ` + + `inner:<` + + ` host:"footrest.syd" ` + + ` port:7001 ` + + ` connected:true ` + + `> ` + + `others:<` + + ` key:3735928559 ` + + ` value:"\x01A\a\f" ` + + `> ` + + `others:<` + + " weight:58.9 # Atomic weight of Co\n" + + ` inner:<` + + ` host:"lesha.mtv" ` + + ` port:8002 ` + + ` >` + + `>`, + out: &MyMessage{ + Count: Int32(42), + Name: String("Dave"), + Quote: String(`"I didn't want to go."`), + Pet: []string{"bunny", "kitty", "horsey"}, + Inner: &InnerMessage{ + Host: String("footrest.syd"), + Port: Int32(7001), + Connected: Bool(true), + }, + Others: []*OtherMessage{ + { + Key: Int64(3735928559), + Value: []byte{0x1, 'A', '\a', '\f'}, + }, + { + Weight: Float32(58.9), + Inner: &InnerMessage{ + Host: String("lesha.mtv"), + Port: Int32(8002), + }, + }, + }, + }, + }, +} + +func TestUnmarshalText(t *testing.T) { + for i, test := range unMarshalTextTests { + pb := new(MyMessage) + err := UnmarshalText(test.in, pb) + if test.err == "" { + // We don't expect failure. + if err != nil { + t.Errorf("Test %d: Unexpected error: %v", i, err) + } else if !reflect.DeepEqual(pb, test.out) { + t.Errorf("Test %d: Incorrect populated \nHave: %v\nWant: %v", + i, pb, test.out) + } + } else { + // We do expect failure. + if err == nil { + t.Errorf("Test %d: Didn't get expected error: %v", i, test.err) + } else if err.Error() != test.err { + t.Errorf("Test %d: Incorrect error.\nHave: %v\nWant: %v", + i, err.Error(), test.err) + } else if _, ok := err.(*RequiredNotSetError); ok && test.out != nil && !reflect.DeepEqual(pb, test.out) { + t.Errorf("Test %d: Incorrect populated \nHave: %v\nWant: %v", + i, pb, test.out) + } + } + } +} + +func TestUnmarshalTextCustomMessage(t *testing.T) { + msg := &textMessage{} + if err := UnmarshalText("custom", msg); err != nil { + t.Errorf("Unexpected error from custom unmarshal: %v", err) + } + if UnmarshalText("not custom", msg) == nil { + t.Errorf("Didn't get expected error from custom unmarshal") + } +} + +// Regression test; this caused a panic. +func TestRepeatedEnum(t *testing.T) { + pb := new(RepeatedEnum) + if err := UnmarshalText("color: RED", pb); err != nil { + t.Fatal(err) + } + exp := &RepeatedEnum{ + Color: []RepeatedEnum_Color{RepeatedEnum_RED}, + } + if !Equal(pb, exp) { + t.Errorf("Incorrect populated \nHave: %v\nWant: %v", pb, exp) + } +} + +func TestProto3TextParsing(t *testing.T) { + m := new(proto3pb.Message) + const in = `name: "Wallace" true_scotsman: true` + want := &proto3pb.Message{ + Name: "Wallace", + TrueScotsman: true, + } + if err := UnmarshalText(in, m); err != nil { + t.Fatal(err) + } + if !Equal(m, want) { + t.Errorf("\n got %v\nwant %v", m, want) + } +} + +func TestMapParsing(t *testing.T) { + m := new(MessageWithMap) + const in = `name_mapping: name_mapping:` + + `msg_mapping:,>` + // separating commas are okay + `msg_mapping>` + // no colon after "value" + `msg_mapping:>` + // omitted key + `msg_mapping:` + // omitted value + `byte_mapping:` + + `byte_mapping:<>` // omitted key and value + want := &MessageWithMap{ + NameMapping: map[int32]string{ + 1: "Beatles", + 1234: "Feist", + }, + MsgMapping: map[int64]*FloatingPoint{ + -4: {F: Float64(2.0)}, + -2: {F: Float64(4.0)}, + 0: {F: Float64(5.0)}, + 1: nil, + }, + ByteMapping: map[bool][]byte{ + false: nil, + true: []byte("so be it"), + }, + } + if err := UnmarshalText(in, m); err != nil { + t.Fatal(err) + } + if !Equal(m, want) { + t.Errorf("\n got %v\nwant %v", m, want) + } +} + +func TestOneofParsing(t *testing.T) { + const in = `name:"Shrek"` + m := new(Communique) + want := &Communique{Union: &Communique_Name{"Shrek"}} + if err := UnmarshalText(in, m); err != nil { + t.Fatal(err) + } + if !Equal(m, want) { + t.Errorf("\n got %v\nwant %v", m, want) + } + + const inOverwrite = `name:"Shrek" number:42` + m = new(Communique) + testErr := "line 1.13: field 'number' would overwrite already parsed oneof 'Union'" + if err := UnmarshalText(inOverwrite, m); err == nil { + t.Errorf("TestOneofParsing: Didn't get expected error: %v", testErr) + } else if err.Error() != testErr { + t.Errorf("TestOneofParsing: Incorrect error.\nHave: %v\nWant: %v", + err.Error(), testErr) + } + +} + +var benchInput string + +func init() { + benchInput = "count: 4\n" + for i := 0; i < 1000; i++ { + benchInput += "pet: \"fido\"\n" + } + + // Check it is valid input. + pb := new(MyMessage) + err := UnmarshalText(benchInput, pb) + if err != nil { + panic("Bad benchmark input: " + err.Error()) + } +} + +func BenchmarkUnmarshalText(b *testing.B) { + pb := new(MyMessage) + for i := 0; i < b.N; i++ { + UnmarshalText(benchInput, pb) + } + b.SetBytes(int64(len(benchInput))) +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/text_test.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/text_test.go new file mode 100644 index 0000000..3eabaca --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/proto/text_test.go @@ -0,0 +1,474 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package proto_test + +import ( + "bytes" + "errors" + "io/ioutil" + "math" + "strings" + "testing" + + "github.com/golang/protobuf/proto" + + proto3pb "github.com/golang/protobuf/proto/proto3_proto" + pb "github.com/golang/protobuf/proto/testdata" +) + +// textMessage implements the methods that allow it to marshal and unmarshal +// itself as text. +type textMessage struct { +} + +func (*textMessage) MarshalText() ([]byte, error) { + return []byte("custom"), nil +} + +func (*textMessage) UnmarshalText(bytes []byte) error { + if string(bytes) != "custom" { + return errors.New("expected 'custom'") + } + return nil +} + +func (*textMessage) Reset() {} +func (*textMessage) String() string { return "" } +func (*textMessage) ProtoMessage() {} + +func newTestMessage() *pb.MyMessage { + msg := &pb.MyMessage{ + Count: proto.Int32(42), + Name: proto.String("Dave"), + Quote: proto.String(`"I didn't want to go."`), + Pet: []string{"bunny", "kitty", "horsey"}, + Inner: &pb.InnerMessage{ + Host: proto.String("footrest.syd"), + Port: proto.Int32(7001), + Connected: proto.Bool(true), + }, + Others: []*pb.OtherMessage{ + { + Key: proto.Int64(0xdeadbeef), + Value: []byte{1, 65, 7, 12}, + }, + { + Weight: proto.Float32(6.022), + Inner: &pb.InnerMessage{ + Host: proto.String("lesha.mtv"), + Port: proto.Int32(8002), + }, + }, + }, + Bikeshed: pb.MyMessage_BLUE.Enum(), + Somegroup: &pb.MyMessage_SomeGroup{ + GroupField: proto.Int32(8), + }, + // One normally wouldn't do this. + // This is an undeclared tag 13, as a varint (wire type 0) with value 4. + XXX_unrecognized: []byte{13<<3 | 0, 4}, + } + ext := &pb.Ext{ + Data: proto.String("Big gobs for big rats"), + } + if err := proto.SetExtension(msg, pb.E_Ext_More, ext); err != nil { + panic(err) + } + greetings := []string{"adg", "easy", "cow"} + if err := proto.SetExtension(msg, pb.E_Greeting, greetings); err != nil { + panic(err) + } + + // Add an unknown extension. We marshal a pb.Ext, and fake the ID. + b, err := proto.Marshal(&pb.Ext{Data: proto.String("3G skiing")}) + if err != nil { + panic(err) + } + b = append(proto.EncodeVarint(201<<3|proto.WireBytes), b...) + proto.SetRawExtension(msg, 201, b) + + // Extensions can be plain fields, too, so let's test that. + b = append(proto.EncodeVarint(202<<3|proto.WireVarint), 19) + proto.SetRawExtension(msg, 202, b) + + return msg +} + +const text = `count: 42 +name: "Dave" +quote: "\"I didn't want to go.\"" +pet: "bunny" +pet: "kitty" +pet: "horsey" +inner: < + host: "footrest.syd" + port: 7001 + connected: true +> +others: < + key: 3735928559 + value: "\001A\007\014" +> +others: < + weight: 6.022 + inner: < + host: "lesha.mtv" + port: 8002 + > +> +bikeshed: BLUE +SomeGroup { + group_field: 8 +} +/* 2 unknown bytes */ +13: 4 +[testdata.Ext.more]: < + data: "Big gobs for big rats" +> +[testdata.greeting]: "adg" +[testdata.greeting]: "easy" +[testdata.greeting]: "cow" +/* 13 unknown bytes */ +201: "\t3G skiing" +/* 3 unknown bytes */ +202: 19 +` + +func TestMarshalText(t *testing.T) { + buf := new(bytes.Buffer) + if err := proto.MarshalText(buf, newTestMessage()); err != nil { + t.Fatalf("proto.MarshalText: %v", err) + } + s := buf.String() + if s != text { + t.Errorf("Got:\n===\n%v===\nExpected:\n===\n%v===\n", s, text) + } +} + +func TestMarshalTextCustomMessage(t *testing.T) { + buf := new(bytes.Buffer) + if err := proto.MarshalText(buf, &textMessage{}); err != nil { + t.Fatalf("proto.MarshalText: %v", err) + } + s := buf.String() + if s != "custom" { + t.Errorf("Got %q, expected %q", s, "custom") + } +} +func TestMarshalTextNil(t *testing.T) { + want := "" + tests := []proto.Message{nil, (*pb.MyMessage)(nil)} + for i, test := range tests { + buf := new(bytes.Buffer) + if err := proto.MarshalText(buf, test); err != nil { + t.Fatal(err) + } + if got := buf.String(); got != want { + t.Errorf("%d: got %q want %q", i, got, want) + } + } +} + +func TestMarshalTextUnknownEnum(t *testing.T) { + // The Color enum only specifies values 0-2. + m := &pb.MyMessage{Bikeshed: pb.MyMessage_Color(3).Enum()} + got := m.String() + const want = `bikeshed:3 ` + if got != want { + t.Errorf("\n got %q\nwant %q", got, want) + } +} + +func TestTextOneof(t *testing.T) { + tests := []struct { + m proto.Message + want string + }{ + // zero message + {&pb.Communique{}, ``}, + // scalar field + {&pb.Communique{Union: &pb.Communique_Number{4}}, `number:4`}, + // message field + {&pb.Communique{Union: &pb.Communique_Msg{ + &pb.Strings{StringField: proto.String("why hello!")}, + }}, `msg:`}, + // bad oneof (should not panic) + {&pb.Communique{Union: &pb.Communique_Msg{nil}}, `msg:/* nil */`}, + } + for _, test := range tests { + got := strings.TrimSpace(test.m.String()) + if got != test.want { + t.Errorf("\n got %s\nwant %s", got, test.want) + } + } +} + +func BenchmarkMarshalTextBuffered(b *testing.B) { + buf := new(bytes.Buffer) + m := newTestMessage() + for i := 0; i < b.N; i++ { + buf.Reset() + proto.MarshalText(buf, m) + } +} + +func BenchmarkMarshalTextUnbuffered(b *testing.B) { + w := ioutil.Discard + m := newTestMessage() + for i := 0; i < b.N; i++ { + proto.MarshalText(w, m) + } +} + +func compact(src string) string { + // s/[ \n]+/ /g; s/ $//; + dst := make([]byte, len(src)) + space, comment := false, false + j := 0 + for i := 0; i < len(src); i++ { + if strings.HasPrefix(src[i:], "/*") { + comment = true + i++ + continue + } + if comment && strings.HasPrefix(src[i:], "*/") { + comment = false + i++ + continue + } + if comment { + continue + } + c := src[i] + if c == ' ' || c == '\n' { + space = true + continue + } + if j > 0 && (dst[j-1] == ':' || dst[j-1] == '<' || dst[j-1] == '{') { + space = false + } + if c == '{' { + space = false + } + if space { + dst[j] = ' ' + j++ + space = false + } + dst[j] = c + j++ + } + if space { + dst[j] = ' ' + j++ + } + return string(dst[0:j]) +} + +var compactText = compact(text) + +func TestCompactText(t *testing.T) { + s := proto.CompactTextString(newTestMessage()) + if s != compactText { + t.Errorf("Got:\n===\n%v===\nExpected:\n===\n%v\n===\n", s, compactText) + } +} + +func TestStringEscaping(t *testing.T) { + testCases := []struct { + in *pb.Strings + out string + }{ + { + // Test data from C++ test (TextFormatTest.StringEscape). + // Single divergence: we don't escape apostrophes. + &pb.Strings{StringField: proto.String("\"A string with ' characters \n and \r newlines and \t tabs and \001 slashes \\ and multiple spaces")}, + "string_field: \"\\\"A string with ' characters \\n and \\r newlines and \\t tabs and \\001 slashes \\\\ and multiple spaces\"\n", + }, + { + // Test data from the same C++ test. + &pb.Strings{StringField: proto.String("\350\260\267\346\255\214")}, + "string_field: \"\\350\\260\\267\\346\\255\\214\"\n", + }, + { + // Some UTF-8. + &pb.Strings{StringField: proto.String("\x00\x01\xff\x81")}, + `string_field: "\000\001\377\201"` + "\n", + }, + } + + for i, tc := range testCases { + var buf bytes.Buffer + if err := proto.MarshalText(&buf, tc.in); err != nil { + t.Errorf("proto.MarsalText: %v", err) + continue + } + s := buf.String() + if s != tc.out { + t.Errorf("#%d: Got:\n%s\nExpected:\n%s\n", i, s, tc.out) + continue + } + + // Check round-trip. + pb := new(pb.Strings) + if err := proto.UnmarshalText(s, pb); err != nil { + t.Errorf("#%d: UnmarshalText: %v", i, err) + continue + } + if !proto.Equal(pb, tc.in) { + t.Errorf("#%d: Round-trip failed:\nstart: %v\n end: %v", i, tc.in, pb) + } + } +} + +// A limitedWriter accepts some output before it fails. +// This is a proxy for something like a nearly-full or imminently-failing disk, +// or a network connection that is about to die. +type limitedWriter struct { + b bytes.Buffer + limit int +} + +var outOfSpace = errors.New("proto: insufficient space") + +func (w *limitedWriter) Write(p []byte) (n int, err error) { + var avail = w.limit - w.b.Len() + if avail <= 0 { + return 0, outOfSpace + } + if len(p) <= avail { + return w.b.Write(p) + } + n, _ = w.b.Write(p[:avail]) + return n, outOfSpace +} + +func TestMarshalTextFailing(t *testing.T) { + // Try lots of different sizes to exercise more error code-paths. + for lim := 0; lim < len(text); lim++ { + buf := new(limitedWriter) + buf.limit = lim + err := proto.MarshalText(buf, newTestMessage()) + // We expect a certain error, but also some partial results in the buffer. + if err != outOfSpace { + t.Errorf("Got:\n===\n%v===\nExpected:\n===\n%v===\n", err, outOfSpace) + } + s := buf.b.String() + x := text[:buf.limit] + if s != x { + t.Errorf("Got:\n===\n%v===\nExpected:\n===\n%v===\n", s, x) + } + } +} + +func TestFloats(t *testing.T) { + tests := []struct { + f float64 + want string + }{ + {0, "0"}, + {4.7, "4.7"}, + {math.Inf(1), "inf"}, + {math.Inf(-1), "-inf"}, + {math.NaN(), "nan"}, + } + for _, test := range tests { + msg := &pb.FloatingPoint{F: &test.f} + got := strings.TrimSpace(msg.String()) + want := `f:` + test.want + if got != want { + t.Errorf("f=%f: got %q, want %q", test.f, got, want) + } + } +} + +func TestRepeatedNilText(t *testing.T) { + m := &pb.MessageList{ + Message: []*pb.MessageList_Message{ + nil, + &pb.MessageList_Message{ + Name: proto.String("Horse"), + }, + nil, + }, + } + want := `Message +Message { + name: "Horse" +} +Message +` + if s := proto.MarshalTextString(m); s != want { + t.Errorf(" got: %s\nwant: %s", s, want) + } +} + +func TestProto3Text(t *testing.T) { + tests := []struct { + m proto.Message + want string + }{ + // zero message + {&proto3pb.Message{}, ``}, + // zero message except for an empty byte slice + {&proto3pb.Message{Data: []byte{}}, ``}, + // trivial case + {&proto3pb.Message{Name: "Rob", HeightInCm: 175}, `name:"Rob" height_in_cm:175`}, + // empty map + {&pb.MessageWithMap{}, ``}, + // non-empty map; map format is the same as a repeated struct, + // and they are sorted by key (numerically for numeric keys). + { + &pb.MessageWithMap{NameMapping: map[int32]string{ + -1: "Negatory", + 7: "Lucky", + 1234: "Feist", + 6345789: "Otis", + }}, + `name_mapping: ` + + `name_mapping: ` + + `name_mapping: ` + + `name_mapping:`, + }, + // map with nil value; not well-defined, but we shouldn't crash + { + &pb.MessageWithMap{MsgMapping: map[int64]*pb.FloatingPoint{7: nil}}, + `msg_mapping:`, + }, + } + for _, test := range tests { + got := strings.TrimSpace(test.m.String()) + if got != test.want { + t.Errorf("\n got %s\nwant %s", got, test.want) + } + } +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/Makefile b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/Makefile new file mode 100644 index 0000000..a42cc37 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/Makefile @@ -0,0 +1,33 @@ +# Go support for Protocol Buffers - Google's data interchange format +# +# Copyright 2010 The Go Authors. All rights reserved. +# https://github.com/golang/protobuf +# +# 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. + +test: + cd testdata && make test diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/Makefile b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/Makefile new file mode 100644 index 0000000..f706871 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/Makefile @@ -0,0 +1,37 @@ +# Go support for Protocol Buffers - Google's data interchange format +# +# Copyright 2010 The Go Authors. All rights reserved. +# https://github.com/golang/protobuf +# +# 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. + +# Not stored here, but descriptor.proto is in https://github.com/google/protobuf/ +# at src/google/protobuf/descriptor.proto +regenerate: + @echo WARNING! THIS RULE IS PROBABLY NOT RIGHT FOR YOUR INSTALLATION + cp $(HOME)/src/protobuf/include/google/protobuf/descriptor.proto . + protoc --go_out=../../../../.. -I$(HOME)/src/protobuf/include $(HOME)/src/protobuf/include/google/protobuf/descriptor.proto diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.pb.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.pb.go new file mode 100644 index 0000000..c6a91bc --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.pb.go @@ -0,0 +1,2215 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/descriptor.proto + +/* +Package descriptor is a generated protocol buffer package. + +It is generated from these files: + google/protobuf/descriptor.proto + +It has these top-level messages: + FileDescriptorSet + FileDescriptorProto + DescriptorProto + ExtensionRangeOptions + FieldDescriptorProto + OneofDescriptorProto + EnumDescriptorProto + EnumValueDescriptorProto + ServiceDescriptorProto + MethodDescriptorProto + FileOptions + MessageOptions + FieldOptions + OneofOptions + EnumOptions + EnumValueOptions + ServiceOptions + MethodOptions + UninterpretedOption + SourceCodeInfo + GeneratedCodeInfo +*/ +package descriptor + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type FieldDescriptorProto_Type int32 + +const ( + // 0 is reserved for errors. + // Order is weird for historical reasons. + FieldDescriptorProto_TYPE_DOUBLE FieldDescriptorProto_Type = 1 + FieldDescriptorProto_TYPE_FLOAT FieldDescriptorProto_Type = 2 + // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT64 if + // negative values are likely. + FieldDescriptorProto_TYPE_INT64 FieldDescriptorProto_Type = 3 + FieldDescriptorProto_TYPE_UINT64 FieldDescriptorProto_Type = 4 + // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT32 if + // negative values are likely. + FieldDescriptorProto_TYPE_INT32 FieldDescriptorProto_Type = 5 + FieldDescriptorProto_TYPE_FIXED64 FieldDescriptorProto_Type = 6 + FieldDescriptorProto_TYPE_FIXED32 FieldDescriptorProto_Type = 7 + FieldDescriptorProto_TYPE_BOOL FieldDescriptorProto_Type = 8 + FieldDescriptorProto_TYPE_STRING FieldDescriptorProto_Type = 9 + // Tag-delimited aggregate. + // Group type is deprecated and not supported in proto3. However, Proto3 + // implementations should still be able to parse the group wire format and + // treat group fields as unknown fields. + FieldDescriptorProto_TYPE_GROUP FieldDescriptorProto_Type = 10 + FieldDescriptorProto_TYPE_MESSAGE FieldDescriptorProto_Type = 11 + // New in version 2. + FieldDescriptorProto_TYPE_BYTES FieldDescriptorProto_Type = 12 + FieldDescriptorProto_TYPE_UINT32 FieldDescriptorProto_Type = 13 + FieldDescriptorProto_TYPE_ENUM FieldDescriptorProto_Type = 14 + FieldDescriptorProto_TYPE_SFIXED32 FieldDescriptorProto_Type = 15 + FieldDescriptorProto_TYPE_SFIXED64 FieldDescriptorProto_Type = 16 + FieldDescriptorProto_TYPE_SINT32 FieldDescriptorProto_Type = 17 + FieldDescriptorProto_TYPE_SINT64 FieldDescriptorProto_Type = 18 +) + +var FieldDescriptorProto_Type_name = map[int32]string{ + 1: "TYPE_DOUBLE", + 2: "TYPE_FLOAT", + 3: "TYPE_INT64", + 4: "TYPE_UINT64", + 5: "TYPE_INT32", + 6: "TYPE_FIXED64", + 7: "TYPE_FIXED32", + 8: "TYPE_BOOL", + 9: "TYPE_STRING", + 10: "TYPE_GROUP", + 11: "TYPE_MESSAGE", + 12: "TYPE_BYTES", + 13: "TYPE_UINT32", + 14: "TYPE_ENUM", + 15: "TYPE_SFIXED32", + 16: "TYPE_SFIXED64", + 17: "TYPE_SINT32", + 18: "TYPE_SINT64", +} +var FieldDescriptorProto_Type_value = map[string]int32{ + "TYPE_DOUBLE": 1, + "TYPE_FLOAT": 2, + "TYPE_INT64": 3, + "TYPE_UINT64": 4, + "TYPE_INT32": 5, + "TYPE_FIXED64": 6, + "TYPE_FIXED32": 7, + "TYPE_BOOL": 8, + "TYPE_STRING": 9, + "TYPE_GROUP": 10, + "TYPE_MESSAGE": 11, + "TYPE_BYTES": 12, + "TYPE_UINT32": 13, + "TYPE_ENUM": 14, + "TYPE_SFIXED32": 15, + "TYPE_SFIXED64": 16, + "TYPE_SINT32": 17, + "TYPE_SINT64": 18, +} + +func (x FieldDescriptorProto_Type) Enum() *FieldDescriptorProto_Type { + p := new(FieldDescriptorProto_Type) + *p = x + return p +} +func (x FieldDescriptorProto_Type) String() string { + return proto.EnumName(FieldDescriptorProto_Type_name, int32(x)) +} +func (x *FieldDescriptorProto_Type) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FieldDescriptorProto_Type_value, data, "FieldDescriptorProto_Type") + if err != nil { + return err + } + *x = FieldDescriptorProto_Type(value) + return nil +} +func (FieldDescriptorProto_Type) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{4, 0} } + +type FieldDescriptorProto_Label int32 + +const ( + // 0 is reserved for errors + FieldDescriptorProto_LABEL_OPTIONAL FieldDescriptorProto_Label = 1 + FieldDescriptorProto_LABEL_REQUIRED FieldDescriptorProto_Label = 2 + FieldDescriptorProto_LABEL_REPEATED FieldDescriptorProto_Label = 3 +) + +var FieldDescriptorProto_Label_name = map[int32]string{ + 1: "LABEL_OPTIONAL", + 2: "LABEL_REQUIRED", + 3: "LABEL_REPEATED", +} +var FieldDescriptorProto_Label_value = map[string]int32{ + "LABEL_OPTIONAL": 1, + "LABEL_REQUIRED": 2, + "LABEL_REPEATED": 3, +} + +func (x FieldDescriptorProto_Label) Enum() *FieldDescriptorProto_Label { + p := new(FieldDescriptorProto_Label) + *p = x + return p +} +func (x FieldDescriptorProto_Label) String() string { + return proto.EnumName(FieldDescriptorProto_Label_name, int32(x)) +} +func (x *FieldDescriptorProto_Label) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FieldDescriptorProto_Label_value, data, "FieldDescriptorProto_Label") + if err != nil { + return err + } + *x = FieldDescriptorProto_Label(value) + return nil +} +func (FieldDescriptorProto_Label) EnumDescriptor() ([]byte, []int) { + return fileDescriptor0, []int{4, 1} +} + +// Generated classes can be optimized for speed or code size. +type FileOptions_OptimizeMode int32 + +const ( + FileOptions_SPEED FileOptions_OptimizeMode = 1 + // etc. + FileOptions_CODE_SIZE FileOptions_OptimizeMode = 2 + FileOptions_LITE_RUNTIME FileOptions_OptimizeMode = 3 +) + +var FileOptions_OptimizeMode_name = map[int32]string{ + 1: "SPEED", + 2: "CODE_SIZE", + 3: "LITE_RUNTIME", +} +var FileOptions_OptimizeMode_value = map[string]int32{ + "SPEED": 1, + "CODE_SIZE": 2, + "LITE_RUNTIME": 3, +} + +func (x FileOptions_OptimizeMode) Enum() *FileOptions_OptimizeMode { + p := new(FileOptions_OptimizeMode) + *p = x + return p +} +func (x FileOptions_OptimizeMode) String() string { + return proto.EnumName(FileOptions_OptimizeMode_name, int32(x)) +} +func (x *FileOptions_OptimizeMode) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FileOptions_OptimizeMode_value, data, "FileOptions_OptimizeMode") + if err != nil { + return err + } + *x = FileOptions_OptimizeMode(value) + return nil +} +func (FileOptions_OptimizeMode) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{10, 0} } + +type FieldOptions_CType int32 + +const ( + // Default mode. + FieldOptions_STRING FieldOptions_CType = 0 + FieldOptions_CORD FieldOptions_CType = 1 + FieldOptions_STRING_PIECE FieldOptions_CType = 2 +) + +var FieldOptions_CType_name = map[int32]string{ + 0: "STRING", + 1: "CORD", + 2: "STRING_PIECE", +} +var FieldOptions_CType_value = map[string]int32{ + "STRING": 0, + "CORD": 1, + "STRING_PIECE": 2, +} + +func (x FieldOptions_CType) Enum() *FieldOptions_CType { + p := new(FieldOptions_CType) + *p = x + return p +} +func (x FieldOptions_CType) String() string { + return proto.EnumName(FieldOptions_CType_name, int32(x)) +} +func (x *FieldOptions_CType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FieldOptions_CType_value, data, "FieldOptions_CType") + if err != nil { + return err + } + *x = FieldOptions_CType(value) + return nil +} +func (FieldOptions_CType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{12, 0} } + +type FieldOptions_JSType int32 + +const ( + // Use the default type. + FieldOptions_JS_NORMAL FieldOptions_JSType = 0 + // Use JavaScript strings. + FieldOptions_JS_STRING FieldOptions_JSType = 1 + // Use JavaScript numbers. + FieldOptions_JS_NUMBER FieldOptions_JSType = 2 +) + +var FieldOptions_JSType_name = map[int32]string{ + 0: "JS_NORMAL", + 1: "JS_STRING", + 2: "JS_NUMBER", +} +var FieldOptions_JSType_value = map[string]int32{ + "JS_NORMAL": 0, + "JS_STRING": 1, + "JS_NUMBER": 2, +} + +func (x FieldOptions_JSType) Enum() *FieldOptions_JSType { + p := new(FieldOptions_JSType) + *p = x + return p +} +func (x FieldOptions_JSType) String() string { + return proto.EnumName(FieldOptions_JSType_name, int32(x)) +} +func (x *FieldOptions_JSType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FieldOptions_JSType_value, data, "FieldOptions_JSType") + if err != nil { + return err + } + *x = FieldOptions_JSType(value) + return nil +} +func (FieldOptions_JSType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{12, 1} } + +// Is this method side-effect-free (or safe in HTTP parlance), or idempotent, +// or neither? HTTP based RPC implementation may choose GET verb for safe +// methods, and PUT verb for idempotent methods instead of the default POST. +type MethodOptions_IdempotencyLevel int32 + +const ( + MethodOptions_IDEMPOTENCY_UNKNOWN MethodOptions_IdempotencyLevel = 0 + MethodOptions_NO_SIDE_EFFECTS MethodOptions_IdempotencyLevel = 1 + MethodOptions_IDEMPOTENT MethodOptions_IdempotencyLevel = 2 +) + +var MethodOptions_IdempotencyLevel_name = map[int32]string{ + 0: "IDEMPOTENCY_UNKNOWN", + 1: "NO_SIDE_EFFECTS", + 2: "IDEMPOTENT", +} +var MethodOptions_IdempotencyLevel_value = map[string]int32{ + "IDEMPOTENCY_UNKNOWN": 0, + "NO_SIDE_EFFECTS": 1, + "IDEMPOTENT": 2, +} + +func (x MethodOptions_IdempotencyLevel) Enum() *MethodOptions_IdempotencyLevel { + p := new(MethodOptions_IdempotencyLevel) + *p = x + return p +} +func (x MethodOptions_IdempotencyLevel) String() string { + return proto.EnumName(MethodOptions_IdempotencyLevel_name, int32(x)) +} +func (x *MethodOptions_IdempotencyLevel) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(MethodOptions_IdempotencyLevel_value, data, "MethodOptions_IdempotencyLevel") + if err != nil { + return err + } + *x = MethodOptions_IdempotencyLevel(value) + return nil +} +func (MethodOptions_IdempotencyLevel) EnumDescriptor() ([]byte, []int) { + return fileDescriptor0, []int{17, 0} +} + +// The protocol compiler can output a FileDescriptorSet containing the .proto +// files it parses. +type FileDescriptorSet struct { + File []*FileDescriptorProto `protobuf:"bytes,1,rep,name=file" json:"file,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *FileDescriptorSet) Reset() { *m = FileDescriptorSet{} } +func (m *FileDescriptorSet) String() string { return proto.CompactTextString(m) } +func (*FileDescriptorSet) ProtoMessage() {} +func (*FileDescriptorSet) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } + +func (m *FileDescriptorSet) GetFile() []*FileDescriptorProto { + if m != nil { + return m.File + } + return nil +} + +// Describes a complete .proto file. +type FileDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Package *string `protobuf:"bytes,2,opt,name=package" json:"package,omitempty"` + // Names of files imported by this file. + Dependency []string `protobuf:"bytes,3,rep,name=dependency" json:"dependency,omitempty"` + // Indexes of the public imported files in the dependency list above. + PublicDependency []int32 `protobuf:"varint,10,rep,name=public_dependency,json=publicDependency" json:"public_dependency,omitempty"` + // Indexes of the weak imported files in the dependency list. + // For Google-internal migration only. Do not use. + WeakDependency []int32 `protobuf:"varint,11,rep,name=weak_dependency,json=weakDependency" json:"weak_dependency,omitempty"` + // All top-level definitions in this file. + MessageType []*DescriptorProto `protobuf:"bytes,4,rep,name=message_type,json=messageType" json:"message_type,omitempty"` + EnumType []*EnumDescriptorProto `protobuf:"bytes,5,rep,name=enum_type,json=enumType" json:"enum_type,omitempty"` + Service []*ServiceDescriptorProto `protobuf:"bytes,6,rep,name=service" json:"service,omitempty"` + Extension []*FieldDescriptorProto `protobuf:"bytes,7,rep,name=extension" json:"extension,omitempty"` + Options *FileOptions `protobuf:"bytes,8,opt,name=options" json:"options,omitempty"` + // This field contains optional information about the original source code. + // You may safely remove this entire field without harming runtime + // functionality of the descriptors -- the information is needed only by + // development tools. + SourceCodeInfo *SourceCodeInfo `protobuf:"bytes,9,opt,name=source_code_info,json=sourceCodeInfo" json:"source_code_info,omitempty"` + // The syntax of the proto file. + // The supported values are "proto2" and "proto3". + Syntax *string `protobuf:"bytes,12,opt,name=syntax" json:"syntax,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *FileDescriptorProto) Reset() { *m = FileDescriptorProto{} } +func (m *FileDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*FileDescriptorProto) ProtoMessage() {} +func (*FileDescriptorProto) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } + +func (m *FileDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *FileDescriptorProto) GetPackage() string { + if m != nil && m.Package != nil { + return *m.Package + } + return "" +} + +func (m *FileDescriptorProto) GetDependency() []string { + if m != nil { + return m.Dependency + } + return nil +} + +func (m *FileDescriptorProto) GetPublicDependency() []int32 { + if m != nil { + return m.PublicDependency + } + return nil +} + +func (m *FileDescriptorProto) GetWeakDependency() []int32 { + if m != nil { + return m.WeakDependency + } + return nil +} + +func (m *FileDescriptorProto) GetMessageType() []*DescriptorProto { + if m != nil { + return m.MessageType + } + return nil +} + +func (m *FileDescriptorProto) GetEnumType() []*EnumDescriptorProto { + if m != nil { + return m.EnumType + } + return nil +} + +func (m *FileDescriptorProto) GetService() []*ServiceDescriptorProto { + if m != nil { + return m.Service + } + return nil +} + +func (m *FileDescriptorProto) GetExtension() []*FieldDescriptorProto { + if m != nil { + return m.Extension + } + return nil +} + +func (m *FileDescriptorProto) GetOptions() *FileOptions { + if m != nil { + return m.Options + } + return nil +} + +func (m *FileDescriptorProto) GetSourceCodeInfo() *SourceCodeInfo { + if m != nil { + return m.SourceCodeInfo + } + return nil +} + +func (m *FileDescriptorProto) GetSyntax() string { + if m != nil && m.Syntax != nil { + return *m.Syntax + } + return "" +} + +// Describes a message type. +type DescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Field []*FieldDescriptorProto `protobuf:"bytes,2,rep,name=field" json:"field,omitempty"` + Extension []*FieldDescriptorProto `protobuf:"bytes,6,rep,name=extension" json:"extension,omitempty"` + NestedType []*DescriptorProto `protobuf:"bytes,3,rep,name=nested_type,json=nestedType" json:"nested_type,omitempty"` + EnumType []*EnumDescriptorProto `protobuf:"bytes,4,rep,name=enum_type,json=enumType" json:"enum_type,omitempty"` + ExtensionRange []*DescriptorProto_ExtensionRange `protobuf:"bytes,5,rep,name=extension_range,json=extensionRange" json:"extension_range,omitempty"` + OneofDecl []*OneofDescriptorProto `protobuf:"bytes,8,rep,name=oneof_decl,json=oneofDecl" json:"oneof_decl,omitempty"` + Options *MessageOptions `protobuf:"bytes,7,opt,name=options" json:"options,omitempty"` + ReservedRange []*DescriptorProto_ReservedRange `protobuf:"bytes,9,rep,name=reserved_range,json=reservedRange" json:"reserved_range,omitempty"` + // Reserved field names, which may not be used by fields in the same message. + // A given name may only be reserved once. + ReservedName []string `protobuf:"bytes,10,rep,name=reserved_name,json=reservedName" json:"reserved_name,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *DescriptorProto) Reset() { *m = DescriptorProto{} } +func (m *DescriptorProto) String() string { return proto.CompactTextString(m) } +func (*DescriptorProto) ProtoMessage() {} +func (*DescriptorProto) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } + +func (m *DescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *DescriptorProto) GetField() []*FieldDescriptorProto { + if m != nil { + return m.Field + } + return nil +} + +func (m *DescriptorProto) GetExtension() []*FieldDescriptorProto { + if m != nil { + return m.Extension + } + return nil +} + +func (m *DescriptorProto) GetNestedType() []*DescriptorProto { + if m != nil { + return m.NestedType + } + return nil +} + +func (m *DescriptorProto) GetEnumType() []*EnumDescriptorProto { + if m != nil { + return m.EnumType + } + return nil +} + +func (m *DescriptorProto) GetExtensionRange() []*DescriptorProto_ExtensionRange { + if m != nil { + return m.ExtensionRange + } + return nil +} + +func (m *DescriptorProto) GetOneofDecl() []*OneofDescriptorProto { + if m != nil { + return m.OneofDecl + } + return nil +} + +func (m *DescriptorProto) GetOptions() *MessageOptions { + if m != nil { + return m.Options + } + return nil +} + +func (m *DescriptorProto) GetReservedRange() []*DescriptorProto_ReservedRange { + if m != nil { + return m.ReservedRange + } + return nil +} + +func (m *DescriptorProto) GetReservedName() []string { + if m != nil { + return m.ReservedName + } + return nil +} + +type DescriptorProto_ExtensionRange struct { + Start *int32 `protobuf:"varint,1,opt,name=start" json:"start,omitempty"` + End *int32 `protobuf:"varint,2,opt,name=end" json:"end,omitempty"` + Options *ExtensionRangeOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *DescriptorProto_ExtensionRange) Reset() { *m = DescriptorProto_ExtensionRange{} } +func (m *DescriptorProto_ExtensionRange) String() string { return proto.CompactTextString(m) } +func (*DescriptorProto_ExtensionRange) ProtoMessage() {} +func (*DescriptorProto_ExtensionRange) Descriptor() ([]byte, []int) { + return fileDescriptor0, []int{2, 0} +} + +func (m *DescriptorProto_ExtensionRange) GetStart() int32 { + if m != nil && m.Start != nil { + return *m.Start + } + return 0 +} + +func (m *DescriptorProto_ExtensionRange) GetEnd() int32 { + if m != nil && m.End != nil { + return *m.End + } + return 0 +} + +func (m *DescriptorProto_ExtensionRange) GetOptions() *ExtensionRangeOptions { + if m != nil { + return m.Options + } + return nil +} + +// Range of reserved tag numbers. Reserved tag numbers may not be used by +// fields or extension ranges in the same message. Reserved ranges may +// not overlap. +type DescriptorProto_ReservedRange struct { + Start *int32 `protobuf:"varint,1,opt,name=start" json:"start,omitempty"` + End *int32 `protobuf:"varint,2,opt,name=end" json:"end,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *DescriptorProto_ReservedRange) Reset() { *m = DescriptorProto_ReservedRange{} } +func (m *DescriptorProto_ReservedRange) String() string { return proto.CompactTextString(m) } +func (*DescriptorProto_ReservedRange) ProtoMessage() {} +func (*DescriptorProto_ReservedRange) Descriptor() ([]byte, []int) { + return fileDescriptor0, []int{2, 1} +} + +func (m *DescriptorProto_ReservedRange) GetStart() int32 { + if m != nil && m.Start != nil { + return *m.Start + } + return 0 +} + +func (m *DescriptorProto_ReservedRange) GetEnd() int32 { + if m != nil && m.End != nil { + return *m.End + } + return 0 +} + +type ExtensionRangeOptions struct { + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *ExtensionRangeOptions) Reset() { *m = ExtensionRangeOptions{} } +func (m *ExtensionRangeOptions) String() string { return proto.CompactTextString(m) } +func (*ExtensionRangeOptions) ProtoMessage() {} +func (*ExtensionRangeOptions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } + +var extRange_ExtensionRangeOptions = []proto.ExtensionRange{ + {1000, 536870911}, +} + +func (*ExtensionRangeOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_ExtensionRangeOptions +} + +func (m *ExtensionRangeOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +// Describes a field within a message. +type FieldDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Number *int32 `protobuf:"varint,3,opt,name=number" json:"number,omitempty"` + Label *FieldDescriptorProto_Label `protobuf:"varint,4,opt,name=label,enum=google.protobuf.FieldDescriptorProto_Label" json:"label,omitempty"` + // If type_name is set, this need not be set. If both this and type_name + // are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP. + Type *FieldDescriptorProto_Type `protobuf:"varint,5,opt,name=type,enum=google.protobuf.FieldDescriptorProto_Type" json:"type,omitempty"` + // For message and enum types, this is the name of the type. If the name + // starts with a '.', it is fully-qualified. Otherwise, C++-like scoping + // rules are used to find the type (i.e. first the nested types within this + // message are searched, then within the parent, on up to the root + // namespace). + TypeName *string `protobuf:"bytes,6,opt,name=type_name,json=typeName" json:"type_name,omitempty"` + // For extensions, this is the name of the type being extended. It is + // resolved in the same manner as type_name. + Extendee *string `protobuf:"bytes,2,opt,name=extendee" json:"extendee,omitempty"` + // For numeric types, contains the original text representation of the value. + // For booleans, "true" or "false". + // For strings, contains the default text contents (not escaped in any way). + // For bytes, contains the C escaped value. All bytes >= 128 are escaped. + // TODO(kenton): Base-64 encode? + DefaultValue *string `protobuf:"bytes,7,opt,name=default_value,json=defaultValue" json:"default_value,omitempty"` + // If set, gives the index of a oneof in the containing type's oneof_decl + // list. This field is a member of that oneof. + OneofIndex *int32 `protobuf:"varint,9,opt,name=oneof_index,json=oneofIndex" json:"oneof_index,omitempty"` + // JSON name of this field. The value is set by protocol compiler. If the + // user has set a "json_name" option on this field, that option's value + // will be used. Otherwise, it's deduced from the field's name by converting + // it to camelCase. + JsonName *string `protobuf:"bytes,10,opt,name=json_name,json=jsonName" json:"json_name,omitempty"` + Options *FieldOptions `protobuf:"bytes,8,opt,name=options" json:"options,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *FieldDescriptorProto) Reset() { *m = FieldDescriptorProto{} } +func (m *FieldDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*FieldDescriptorProto) ProtoMessage() {} +func (*FieldDescriptorProto) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } + +func (m *FieldDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *FieldDescriptorProto) GetNumber() int32 { + if m != nil && m.Number != nil { + return *m.Number + } + return 0 +} + +func (m *FieldDescriptorProto) GetLabel() FieldDescriptorProto_Label { + if m != nil && m.Label != nil { + return *m.Label + } + return FieldDescriptorProto_LABEL_OPTIONAL +} + +func (m *FieldDescriptorProto) GetType() FieldDescriptorProto_Type { + if m != nil && m.Type != nil { + return *m.Type + } + return FieldDescriptorProto_TYPE_DOUBLE +} + +func (m *FieldDescriptorProto) GetTypeName() string { + if m != nil && m.TypeName != nil { + return *m.TypeName + } + return "" +} + +func (m *FieldDescriptorProto) GetExtendee() string { + if m != nil && m.Extendee != nil { + return *m.Extendee + } + return "" +} + +func (m *FieldDescriptorProto) GetDefaultValue() string { + if m != nil && m.DefaultValue != nil { + return *m.DefaultValue + } + return "" +} + +func (m *FieldDescriptorProto) GetOneofIndex() int32 { + if m != nil && m.OneofIndex != nil { + return *m.OneofIndex + } + return 0 +} + +func (m *FieldDescriptorProto) GetJsonName() string { + if m != nil && m.JsonName != nil { + return *m.JsonName + } + return "" +} + +func (m *FieldDescriptorProto) GetOptions() *FieldOptions { + if m != nil { + return m.Options + } + return nil +} + +// Describes a oneof. +type OneofDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Options *OneofOptions `protobuf:"bytes,2,opt,name=options" json:"options,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *OneofDescriptorProto) Reset() { *m = OneofDescriptorProto{} } +func (m *OneofDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*OneofDescriptorProto) ProtoMessage() {} +func (*OneofDescriptorProto) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } + +func (m *OneofDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *OneofDescriptorProto) GetOptions() *OneofOptions { + if m != nil { + return m.Options + } + return nil +} + +// Describes an enum type. +type EnumDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Value []*EnumValueDescriptorProto `protobuf:"bytes,2,rep,name=value" json:"value,omitempty"` + Options *EnumOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *EnumDescriptorProto) Reset() { *m = EnumDescriptorProto{} } +func (m *EnumDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*EnumDescriptorProto) ProtoMessage() {} +func (*EnumDescriptorProto) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } + +func (m *EnumDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *EnumDescriptorProto) GetValue() []*EnumValueDescriptorProto { + if m != nil { + return m.Value + } + return nil +} + +func (m *EnumDescriptorProto) GetOptions() *EnumOptions { + if m != nil { + return m.Options + } + return nil +} + +// Describes a value within an enum. +type EnumValueDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Number *int32 `protobuf:"varint,2,opt,name=number" json:"number,omitempty"` + Options *EnumValueOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *EnumValueDescriptorProto) Reset() { *m = EnumValueDescriptorProto{} } +func (m *EnumValueDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*EnumValueDescriptorProto) ProtoMessage() {} +func (*EnumValueDescriptorProto) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } + +func (m *EnumValueDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *EnumValueDescriptorProto) GetNumber() int32 { + if m != nil && m.Number != nil { + return *m.Number + } + return 0 +} + +func (m *EnumValueDescriptorProto) GetOptions() *EnumValueOptions { + if m != nil { + return m.Options + } + return nil +} + +// Describes a service. +type ServiceDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Method []*MethodDescriptorProto `protobuf:"bytes,2,rep,name=method" json:"method,omitempty"` + Options *ServiceOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *ServiceDescriptorProto) Reset() { *m = ServiceDescriptorProto{} } +func (m *ServiceDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*ServiceDescriptorProto) ProtoMessage() {} +func (*ServiceDescriptorProto) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } + +func (m *ServiceDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *ServiceDescriptorProto) GetMethod() []*MethodDescriptorProto { + if m != nil { + return m.Method + } + return nil +} + +func (m *ServiceDescriptorProto) GetOptions() *ServiceOptions { + if m != nil { + return m.Options + } + return nil +} + +// Describes a method of a service. +type MethodDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + // Input and output type names. These are resolved in the same way as + // FieldDescriptorProto.type_name, but must refer to a message type. + InputType *string `protobuf:"bytes,2,opt,name=input_type,json=inputType" json:"input_type,omitempty"` + OutputType *string `protobuf:"bytes,3,opt,name=output_type,json=outputType" json:"output_type,omitempty"` + Options *MethodOptions `protobuf:"bytes,4,opt,name=options" json:"options,omitempty"` + // Identifies if client streams multiple client messages + ClientStreaming *bool `protobuf:"varint,5,opt,name=client_streaming,json=clientStreaming,def=0" json:"client_streaming,omitempty"` + // Identifies if server streams multiple server messages + ServerStreaming *bool `protobuf:"varint,6,opt,name=server_streaming,json=serverStreaming,def=0" json:"server_streaming,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *MethodDescriptorProto) Reset() { *m = MethodDescriptorProto{} } +func (m *MethodDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*MethodDescriptorProto) ProtoMessage() {} +func (*MethodDescriptorProto) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} } + +const Default_MethodDescriptorProto_ClientStreaming bool = false +const Default_MethodDescriptorProto_ServerStreaming bool = false + +func (m *MethodDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *MethodDescriptorProto) GetInputType() string { + if m != nil && m.InputType != nil { + return *m.InputType + } + return "" +} + +func (m *MethodDescriptorProto) GetOutputType() string { + if m != nil && m.OutputType != nil { + return *m.OutputType + } + return "" +} + +func (m *MethodDescriptorProto) GetOptions() *MethodOptions { + if m != nil { + return m.Options + } + return nil +} + +func (m *MethodDescriptorProto) GetClientStreaming() bool { + if m != nil && m.ClientStreaming != nil { + return *m.ClientStreaming + } + return Default_MethodDescriptorProto_ClientStreaming +} + +func (m *MethodDescriptorProto) GetServerStreaming() bool { + if m != nil && m.ServerStreaming != nil { + return *m.ServerStreaming + } + return Default_MethodDescriptorProto_ServerStreaming +} + +type FileOptions struct { + // Sets the Java package where classes generated from this .proto will be + // placed. By default, the proto package is used, but this is often + // inappropriate because proto packages do not normally start with backwards + // domain names. + JavaPackage *string `protobuf:"bytes,1,opt,name=java_package,json=javaPackage" json:"java_package,omitempty"` + // If set, all the classes from the .proto file are wrapped in a single + // outer class with the given name. This applies to both Proto1 + // (equivalent to the old "--one_java_file" option) and Proto2 (where + // a .proto always translates to a single class, but you may want to + // explicitly choose the class name). + JavaOuterClassname *string `protobuf:"bytes,8,opt,name=java_outer_classname,json=javaOuterClassname" json:"java_outer_classname,omitempty"` + // If set true, then the Java code generator will generate a separate .java + // file for each top-level message, enum, and service defined in the .proto + // file. Thus, these types will *not* be nested inside the outer class + // named by java_outer_classname. However, the outer class will still be + // generated to contain the file's getDescriptor() method as well as any + // top-level extensions defined in the file. + JavaMultipleFiles *bool `protobuf:"varint,10,opt,name=java_multiple_files,json=javaMultipleFiles,def=0" json:"java_multiple_files,omitempty"` + // This option does nothing. + JavaGenerateEqualsAndHash *bool `protobuf:"varint,20,opt,name=java_generate_equals_and_hash,json=javaGenerateEqualsAndHash" json:"java_generate_equals_and_hash,omitempty"` + // If set true, then the Java2 code generator will generate code that + // throws an exception whenever an attempt is made to assign a non-UTF-8 + // byte sequence to a string field. + // Message reflection will do the same. + // However, an extension field still accepts non-UTF-8 byte sequences. + // This option has no effect on when used with the lite runtime. + JavaStringCheckUtf8 *bool `protobuf:"varint,27,opt,name=java_string_check_utf8,json=javaStringCheckUtf8,def=0" json:"java_string_check_utf8,omitempty"` + OptimizeFor *FileOptions_OptimizeMode `protobuf:"varint,9,opt,name=optimize_for,json=optimizeFor,enum=google.protobuf.FileOptions_OptimizeMode,def=1" json:"optimize_for,omitempty"` + // Sets the Go package where structs generated from this .proto will be + // placed. If omitted, the Go package will be derived from the following: + // - The basename of the package import path, if provided. + // - Otherwise, the package statement in the .proto file, if present. + // - Otherwise, the basename of the .proto file, without extension. + GoPackage *string `protobuf:"bytes,11,opt,name=go_package,json=goPackage" json:"go_package,omitempty"` + // Should generic services be generated in each language? "Generic" services + // are not specific to any particular RPC system. They are generated by the + // main code generators in each language (without additional plugins). + // Generic services were the only kind of service generation supported by + // early versions of google.protobuf. + // + // Generic services are now considered deprecated in favor of using plugins + // that generate code specific to your particular RPC system. Therefore, + // these default to false. Old code which depends on generic services should + // explicitly set them to true. + CcGenericServices *bool `protobuf:"varint,16,opt,name=cc_generic_services,json=ccGenericServices,def=0" json:"cc_generic_services,omitempty"` + JavaGenericServices *bool `protobuf:"varint,17,opt,name=java_generic_services,json=javaGenericServices,def=0" json:"java_generic_services,omitempty"` + PyGenericServices *bool `protobuf:"varint,18,opt,name=py_generic_services,json=pyGenericServices,def=0" json:"py_generic_services,omitempty"` + PhpGenericServices *bool `protobuf:"varint,42,opt,name=php_generic_services,json=phpGenericServices,def=0" json:"php_generic_services,omitempty"` + // Is this file deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for everything in the file, or it will be completely ignored; in the very + // least, this is a formalization for deprecating files. + Deprecated *bool `protobuf:"varint,23,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // Enables the use of arenas for the proto messages in this file. This applies + // only to generated classes for C++. + CcEnableArenas *bool `protobuf:"varint,31,opt,name=cc_enable_arenas,json=ccEnableArenas,def=0" json:"cc_enable_arenas,omitempty"` + // Sets the objective c class prefix which is prepended to all objective c + // generated classes from this .proto. There is no default. + ObjcClassPrefix *string `protobuf:"bytes,36,opt,name=objc_class_prefix,json=objcClassPrefix" json:"objc_class_prefix,omitempty"` + // Namespace for generated classes; defaults to the package. + CsharpNamespace *string `protobuf:"bytes,37,opt,name=csharp_namespace,json=csharpNamespace" json:"csharp_namespace,omitempty"` + // By default Swift generators will take the proto package and CamelCase it + // replacing '.' with underscore and use that to prefix the types/symbols + // defined. When this options is provided, they will use this value instead + // to prefix the types/symbols defined. + SwiftPrefix *string `protobuf:"bytes,39,opt,name=swift_prefix,json=swiftPrefix" json:"swift_prefix,omitempty"` + // Sets the php class prefix which is prepended to all php generated classes + // from this .proto. Default is empty. + PhpClassPrefix *string `protobuf:"bytes,40,opt,name=php_class_prefix,json=phpClassPrefix" json:"php_class_prefix,omitempty"` + // Use this option to change the namespace of php generated classes. Default + // is empty. When this option is empty, the package name will be used for + // determining the namespace. + PhpNamespace *string `protobuf:"bytes,41,opt,name=php_namespace,json=phpNamespace" json:"php_namespace,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *FileOptions) Reset() { *m = FileOptions{} } +func (m *FileOptions) String() string { return proto.CompactTextString(m) } +func (*FileOptions) ProtoMessage() {} +func (*FileOptions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} } + +var extRange_FileOptions = []proto.ExtensionRange{ + {1000, 536870911}, +} + +func (*FileOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_FileOptions +} + +const Default_FileOptions_JavaMultipleFiles bool = false +const Default_FileOptions_JavaStringCheckUtf8 bool = false +const Default_FileOptions_OptimizeFor FileOptions_OptimizeMode = FileOptions_SPEED +const Default_FileOptions_CcGenericServices bool = false +const Default_FileOptions_JavaGenericServices bool = false +const Default_FileOptions_PyGenericServices bool = false +const Default_FileOptions_PhpGenericServices bool = false +const Default_FileOptions_Deprecated bool = false +const Default_FileOptions_CcEnableArenas bool = false + +func (m *FileOptions) GetJavaPackage() string { + if m != nil && m.JavaPackage != nil { + return *m.JavaPackage + } + return "" +} + +func (m *FileOptions) GetJavaOuterClassname() string { + if m != nil && m.JavaOuterClassname != nil { + return *m.JavaOuterClassname + } + return "" +} + +func (m *FileOptions) GetJavaMultipleFiles() bool { + if m != nil && m.JavaMultipleFiles != nil { + return *m.JavaMultipleFiles + } + return Default_FileOptions_JavaMultipleFiles +} + +func (m *FileOptions) GetJavaGenerateEqualsAndHash() bool { + if m != nil && m.JavaGenerateEqualsAndHash != nil { + return *m.JavaGenerateEqualsAndHash + } + return false +} + +func (m *FileOptions) GetJavaStringCheckUtf8() bool { + if m != nil && m.JavaStringCheckUtf8 != nil { + return *m.JavaStringCheckUtf8 + } + return Default_FileOptions_JavaStringCheckUtf8 +} + +func (m *FileOptions) GetOptimizeFor() FileOptions_OptimizeMode { + if m != nil && m.OptimizeFor != nil { + return *m.OptimizeFor + } + return Default_FileOptions_OptimizeFor +} + +func (m *FileOptions) GetGoPackage() string { + if m != nil && m.GoPackage != nil { + return *m.GoPackage + } + return "" +} + +func (m *FileOptions) GetCcGenericServices() bool { + if m != nil && m.CcGenericServices != nil { + return *m.CcGenericServices + } + return Default_FileOptions_CcGenericServices +} + +func (m *FileOptions) GetJavaGenericServices() bool { + if m != nil && m.JavaGenericServices != nil { + return *m.JavaGenericServices + } + return Default_FileOptions_JavaGenericServices +} + +func (m *FileOptions) GetPyGenericServices() bool { + if m != nil && m.PyGenericServices != nil { + return *m.PyGenericServices + } + return Default_FileOptions_PyGenericServices +} + +func (m *FileOptions) GetPhpGenericServices() bool { + if m != nil && m.PhpGenericServices != nil { + return *m.PhpGenericServices + } + return Default_FileOptions_PhpGenericServices +} + +func (m *FileOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_FileOptions_Deprecated +} + +func (m *FileOptions) GetCcEnableArenas() bool { + if m != nil && m.CcEnableArenas != nil { + return *m.CcEnableArenas + } + return Default_FileOptions_CcEnableArenas +} + +func (m *FileOptions) GetObjcClassPrefix() string { + if m != nil && m.ObjcClassPrefix != nil { + return *m.ObjcClassPrefix + } + return "" +} + +func (m *FileOptions) GetCsharpNamespace() string { + if m != nil && m.CsharpNamespace != nil { + return *m.CsharpNamespace + } + return "" +} + +func (m *FileOptions) GetSwiftPrefix() string { + if m != nil && m.SwiftPrefix != nil { + return *m.SwiftPrefix + } + return "" +} + +func (m *FileOptions) GetPhpClassPrefix() string { + if m != nil && m.PhpClassPrefix != nil { + return *m.PhpClassPrefix + } + return "" +} + +func (m *FileOptions) GetPhpNamespace() string { + if m != nil && m.PhpNamespace != nil { + return *m.PhpNamespace + } + return "" +} + +func (m *FileOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type MessageOptions struct { + // Set true to use the old proto1 MessageSet wire format for extensions. + // This is provided for backwards-compatibility with the MessageSet wire + // format. You should not use this for any other reason: It's less + // efficient, has fewer features, and is more complicated. + // + // The message must be defined exactly as follows: + // message Foo { + // option message_set_wire_format = true; + // extensions 4 to max; + // } + // Note that the message cannot have any defined fields; MessageSets only + // have extensions. + // + // All extensions of your type must be singular messages; e.g. they cannot + // be int32s, enums, or repeated messages. + // + // Because this is an option, the above two restrictions are not enforced by + // the protocol compiler. + MessageSetWireFormat *bool `protobuf:"varint,1,opt,name=message_set_wire_format,json=messageSetWireFormat,def=0" json:"message_set_wire_format,omitempty"` + // Disables the generation of the standard "descriptor()" accessor, which can + // conflict with a field of the same name. This is meant to make migration + // from proto1 easier; new code should avoid fields named "descriptor". + NoStandardDescriptorAccessor *bool `protobuf:"varint,2,opt,name=no_standard_descriptor_accessor,json=noStandardDescriptorAccessor,def=0" json:"no_standard_descriptor_accessor,omitempty"` + // Is this message deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the message, or it will be completely ignored; in the very least, + // this is a formalization for deprecating messages. + Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // Whether the message is an automatically generated map entry type for the + // maps field. + // + // For maps fields: + // map map_field = 1; + // The parsed descriptor looks like: + // message MapFieldEntry { + // option map_entry = true; + // optional KeyType key = 1; + // optional ValueType value = 2; + // } + // repeated MapFieldEntry map_field = 1; + // + // Implementations may choose not to generate the map_entry=true message, but + // use a native map in the target language to hold the keys and values. + // The reflection APIs in such implementions still need to work as + // if the field is a repeated message field. + // + // NOTE: Do not set the option in .proto files. Always use the maps syntax + // instead. The option should only be implicitly set by the proto compiler + // parser. + MapEntry *bool `protobuf:"varint,7,opt,name=map_entry,json=mapEntry" json:"map_entry,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *MessageOptions) Reset() { *m = MessageOptions{} } +func (m *MessageOptions) String() string { return proto.CompactTextString(m) } +func (*MessageOptions) ProtoMessage() {} +func (*MessageOptions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} } + +var extRange_MessageOptions = []proto.ExtensionRange{ + {1000, 536870911}, +} + +func (*MessageOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_MessageOptions +} + +const Default_MessageOptions_MessageSetWireFormat bool = false +const Default_MessageOptions_NoStandardDescriptorAccessor bool = false +const Default_MessageOptions_Deprecated bool = false + +func (m *MessageOptions) GetMessageSetWireFormat() bool { + if m != nil && m.MessageSetWireFormat != nil { + return *m.MessageSetWireFormat + } + return Default_MessageOptions_MessageSetWireFormat +} + +func (m *MessageOptions) GetNoStandardDescriptorAccessor() bool { + if m != nil && m.NoStandardDescriptorAccessor != nil { + return *m.NoStandardDescriptorAccessor + } + return Default_MessageOptions_NoStandardDescriptorAccessor +} + +func (m *MessageOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_MessageOptions_Deprecated +} + +func (m *MessageOptions) GetMapEntry() bool { + if m != nil && m.MapEntry != nil { + return *m.MapEntry + } + return false +} + +func (m *MessageOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type FieldOptions struct { + // The ctype option instructs the C++ code generator to use a different + // representation of the field than it normally would. See the specific + // options below. This option is not yet implemented in the open source + // release -- sorry, we'll try to include it in a future version! + Ctype *FieldOptions_CType `protobuf:"varint,1,opt,name=ctype,enum=google.protobuf.FieldOptions_CType,def=0" json:"ctype,omitempty"` + // The packed option can be enabled for repeated primitive fields to enable + // a more efficient representation on the wire. Rather than repeatedly + // writing the tag and type for each element, the entire array is encoded as + // a single length-delimited blob. In proto3, only explicit setting it to + // false will avoid using packed encoding. + Packed *bool `protobuf:"varint,2,opt,name=packed" json:"packed,omitempty"` + // The jstype option determines the JavaScript type used for values of the + // field. The option is permitted only for 64 bit integral and fixed types + // (int64, uint64, sint64, fixed64, sfixed64). A field with jstype JS_STRING + // is represented as JavaScript string, which avoids loss of precision that + // can happen when a large value is converted to a floating point JavaScript. + // Specifying JS_NUMBER for the jstype causes the generated JavaScript code to + // use the JavaScript "number" type. The behavior of the default option + // JS_NORMAL is implementation dependent. + // + // This option is an enum to permit additional types to be added, e.g. + // goog.math.Integer. + Jstype *FieldOptions_JSType `protobuf:"varint,6,opt,name=jstype,enum=google.protobuf.FieldOptions_JSType,def=0" json:"jstype,omitempty"` + // Should this field be parsed lazily? Lazy applies only to message-type + // fields. It means that when the outer message is initially parsed, the + // inner message's contents will not be parsed but instead stored in encoded + // form. The inner message will actually be parsed when it is first accessed. + // + // This is only a hint. Implementations are free to choose whether to use + // eager or lazy parsing regardless of the value of this option. However, + // setting this option true suggests that the protocol author believes that + // using lazy parsing on this field is worth the additional bookkeeping + // overhead typically needed to implement it. + // + // This option does not affect the public interface of any generated code; + // all method signatures remain the same. Furthermore, thread-safety of the + // interface is not affected by this option; const methods remain safe to + // call from multiple threads concurrently, while non-const methods continue + // to require exclusive access. + // + // + // Note that implementations may choose not to check required fields within + // a lazy sub-message. That is, calling IsInitialized() on the outer message + // may return true even if the inner message has missing required fields. + // This is necessary because otherwise the inner message would have to be + // parsed in order to perform the check, defeating the purpose of lazy + // parsing. An implementation which chooses not to check required fields + // must be consistent about it. That is, for any particular sub-message, the + // implementation must either *always* check its required fields, or *never* + // check its required fields, regardless of whether or not the message has + // been parsed. + Lazy *bool `protobuf:"varint,5,opt,name=lazy,def=0" json:"lazy,omitempty"` + // Is this field deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for accessors, or it will be completely ignored; in the very least, this + // is a formalization for deprecating fields. + Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // For Google-internal migration only. Do not use. + Weak *bool `protobuf:"varint,10,opt,name=weak,def=0" json:"weak,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *FieldOptions) Reset() { *m = FieldOptions{} } +func (m *FieldOptions) String() string { return proto.CompactTextString(m) } +func (*FieldOptions) ProtoMessage() {} +func (*FieldOptions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} } + +var extRange_FieldOptions = []proto.ExtensionRange{ + {1000, 536870911}, +} + +func (*FieldOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_FieldOptions +} + +const Default_FieldOptions_Ctype FieldOptions_CType = FieldOptions_STRING +const Default_FieldOptions_Jstype FieldOptions_JSType = FieldOptions_JS_NORMAL +const Default_FieldOptions_Lazy bool = false +const Default_FieldOptions_Deprecated bool = false +const Default_FieldOptions_Weak bool = false + +func (m *FieldOptions) GetCtype() FieldOptions_CType { + if m != nil && m.Ctype != nil { + return *m.Ctype + } + return Default_FieldOptions_Ctype +} + +func (m *FieldOptions) GetPacked() bool { + if m != nil && m.Packed != nil { + return *m.Packed + } + return false +} + +func (m *FieldOptions) GetJstype() FieldOptions_JSType { + if m != nil && m.Jstype != nil { + return *m.Jstype + } + return Default_FieldOptions_Jstype +} + +func (m *FieldOptions) GetLazy() bool { + if m != nil && m.Lazy != nil { + return *m.Lazy + } + return Default_FieldOptions_Lazy +} + +func (m *FieldOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_FieldOptions_Deprecated +} + +func (m *FieldOptions) GetWeak() bool { + if m != nil && m.Weak != nil { + return *m.Weak + } + return Default_FieldOptions_Weak +} + +func (m *FieldOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type OneofOptions struct { + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *OneofOptions) Reset() { *m = OneofOptions{} } +func (m *OneofOptions) String() string { return proto.CompactTextString(m) } +func (*OneofOptions) ProtoMessage() {} +func (*OneofOptions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} } + +var extRange_OneofOptions = []proto.ExtensionRange{ + {1000, 536870911}, +} + +func (*OneofOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_OneofOptions +} + +func (m *OneofOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type EnumOptions struct { + // Set this option to true to allow mapping different tag names to the same + // value. + AllowAlias *bool `protobuf:"varint,2,opt,name=allow_alias,json=allowAlias" json:"allow_alias,omitempty"` + // Is this enum deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the enum, or it will be completely ignored; in the very least, this + // is a formalization for deprecating enums. + Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *EnumOptions) Reset() { *m = EnumOptions{} } +func (m *EnumOptions) String() string { return proto.CompactTextString(m) } +func (*EnumOptions) ProtoMessage() {} +func (*EnumOptions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} } + +var extRange_EnumOptions = []proto.ExtensionRange{ + {1000, 536870911}, +} + +func (*EnumOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_EnumOptions +} + +const Default_EnumOptions_Deprecated bool = false + +func (m *EnumOptions) GetAllowAlias() bool { + if m != nil && m.AllowAlias != nil { + return *m.AllowAlias + } + return false +} + +func (m *EnumOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_EnumOptions_Deprecated +} + +func (m *EnumOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type EnumValueOptions struct { + // Is this enum value deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the enum value, or it will be completely ignored; in the very least, + // this is a formalization for deprecating enum values. + Deprecated *bool `protobuf:"varint,1,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *EnumValueOptions) Reset() { *m = EnumValueOptions{} } +func (m *EnumValueOptions) String() string { return proto.CompactTextString(m) } +func (*EnumValueOptions) ProtoMessage() {} +func (*EnumValueOptions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} } + +var extRange_EnumValueOptions = []proto.ExtensionRange{ + {1000, 536870911}, +} + +func (*EnumValueOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_EnumValueOptions +} + +const Default_EnumValueOptions_Deprecated bool = false + +func (m *EnumValueOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_EnumValueOptions_Deprecated +} + +func (m *EnumValueOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type ServiceOptions struct { + // Is this service deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the service, or it will be completely ignored; in the very least, + // this is a formalization for deprecating services. + Deprecated *bool `protobuf:"varint,33,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *ServiceOptions) Reset() { *m = ServiceOptions{} } +func (m *ServiceOptions) String() string { return proto.CompactTextString(m) } +func (*ServiceOptions) ProtoMessage() {} +func (*ServiceOptions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} } + +var extRange_ServiceOptions = []proto.ExtensionRange{ + {1000, 536870911}, +} + +func (*ServiceOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_ServiceOptions +} + +const Default_ServiceOptions_Deprecated bool = false + +func (m *ServiceOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_ServiceOptions_Deprecated +} + +func (m *ServiceOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type MethodOptions struct { + // Is this method deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the method, or it will be completely ignored; in the very least, + // this is a formalization for deprecating methods. + Deprecated *bool `protobuf:"varint,33,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + IdempotencyLevel *MethodOptions_IdempotencyLevel `protobuf:"varint,34,opt,name=idempotency_level,json=idempotencyLevel,enum=google.protobuf.MethodOptions_IdempotencyLevel,def=0" json:"idempotency_level,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *MethodOptions) Reset() { *m = MethodOptions{} } +func (m *MethodOptions) String() string { return proto.CompactTextString(m) } +func (*MethodOptions) ProtoMessage() {} +func (*MethodOptions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} } + +var extRange_MethodOptions = []proto.ExtensionRange{ + {1000, 536870911}, +} + +func (*MethodOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_MethodOptions +} + +const Default_MethodOptions_Deprecated bool = false +const Default_MethodOptions_IdempotencyLevel MethodOptions_IdempotencyLevel = MethodOptions_IDEMPOTENCY_UNKNOWN + +func (m *MethodOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_MethodOptions_Deprecated +} + +func (m *MethodOptions) GetIdempotencyLevel() MethodOptions_IdempotencyLevel { + if m != nil && m.IdempotencyLevel != nil { + return *m.IdempotencyLevel + } + return Default_MethodOptions_IdempotencyLevel +} + +func (m *MethodOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +// A message representing a option the parser does not recognize. This only +// appears in options protos created by the compiler::Parser class. +// DescriptorPool resolves these when building Descriptor objects. Therefore, +// options protos in descriptor objects (e.g. returned by Descriptor::options(), +// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions +// in them. +type UninterpretedOption struct { + Name []*UninterpretedOption_NamePart `protobuf:"bytes,2,rep,name=name" json:"name,omitempty"` + // The value of the uninterpreted option, in whatever type the tokenizer + // identified it as during parsing. Exactly one of these should be set. + IdentifierValue *string `protobuf:"bytes,3,opt,name=identifier_value,json=identifierValue" json:"identifier_value,omitempty"` + PositiveIntValue *uint64 `protobuf:"varint,4,opt,name=positive_int_value,json=positiveIntValue" json:"positive_int_value,omitempty"` + NegativeIntValue *int64 `protobuf:"varint,5,opt,name=negative_int_value,json=negativeIntValue" json:"negative_int_value,omitempty"` + DoubleValue *float64 `protobuf:"fixed64,6,opt,name=double_value,json=doubleValue" json:"double_value,omitempty"` + StringValue []byte `protobuf:"bytes,7,opt,name=string_value,json=stringValue" json:"string_value,omitempty"` + AggregateValue *string `protobuf:"bytes,8,opt,name=aggregate_value,json=aggregateValue" json:"aggregate_value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *UninterpretedOption) Reset() { *m = UninterpretedOption{} } +func (m *UninterpretedOption) String() string { return proto.CompactTextString(m) } +func (*UninterpretedOption) ProtoMessage() {} +func (*UninterpretedOption) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} } + +func (m *UninterpretedOption) GetName() []*UninterpretedOption_NamePart { + if m != nil { + return m.Name + } + return nil +} + +func (m *UninterpretedOption) GetIdentifierValue() string { + if m != nil && m.IdentifierValue != nil { + return *m.IdentifierValue + } + return "" +} + +func (m *UninterpretedOption) GetPositiveIntValue() uint64 { + if m != nil && m.PositiveIntValue != nil { + return *m.PositiveIntValue + } + return 0 +} + +func (m *UninterpretedOption) GetNegativeIntValue() int64 { + if m != nil && m.NegativeIntValue != nil { + return *m.NegativeIntValue + } + return 0 +} + +func (m *UninterpretedOption) GetDoubleValue() float64 { + if m != nil && m.DoubleValue != nil { + return *m.DoubleValue + } + return 0 +} + +func (m *UninterpretedOption) GetStringValue() []byte { + if m != nil { + return m.StringValue + } + return nil +} + +func (m *UninterpretedOption) GetAggregateValue() string { + if m != nil && m.AggregateValue != nil { + return *m.AggregateValue + } + return "" +} + +// The name of the uninterpreted option. Each string represents a segment in +// a dot-separated name. is_extension is true iff a segment represents an +// extension (denoted with parentheses in options specs in .proto files). +// E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents +// "foo.(bar.baz).qux". +type UninterpretedOption_NamePart struct { + NamePart *string `protobuf:"bytes,1,req,name=name_part,json=namePart" json:"name_part,omitempty"` + IsExtension *bool `protobuf:"varint,2,req,name=is_extension,json=isExtension" json:"is_extension,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *UninterpretedOption_NamePart) Reset() { *m = UninterpretedOption_NamePart{} } +func (m *UninterpretedOption_NamePart) String() string { return proto.CompactTextString(m) } +func (*UninterpretedOption_NamePart) ProtoMessage() {} +func (*UninterpretedOption_NamePart) Descriptor() ([]byte, []int) { + return fileDescriptor0, []int{18, 0} +} + +func (m *UninterpretedOption_NamePart) GetNamePart() string { + if m != nil && m.NamePart != nil { + return *m.NamePart + } + return "" +} + +func (m *UninterpretedOption_NamePart) GetIsExtension() bool { + if m != nil && m.IsExtension != nil { + return *m.IsExtension + } + return false +} + +// Encapsulates information about the original source file from which a +// FileDescriptorProto was generated. +type SourceCodeInfo struct { + // A Location identifies a piece of source code in a .proto file which + // corresponds to a particular definition. This information is intended + // to be useful to IDEs, code indexers, documentation generators, and similar + // tools. + // + // For example, say we have a file like: + // message Foo { + // optional string foo = 1; + // } + // Let's look at just the field definition: + // optional string foo = 1; + // ^ ^^ ^^ ^ ^^^ + // a bc de f ghi + // We have the following locations: + // span path represents + // [a,i) [ 4, 0, 2, 0 ] The whole field definition. + // [a,b) [ 4, 0, 2, 0, 4 ] The label (optional). + // [c,d) [ 4, 0, 2, 0, 5 ] The type (string). + // [e,f) [ 4, 0, 2, 0, 1 ] The name (foo). + // [g,h) [ 4, 0, 2, 0, 3 ] The number (1). + // + // Notes: + // - A location may refer to a repeated field itself (i.e. not to any + // particular index within it). This is used whenever a set of elements are + // logically enclosed in a single code segment. For example, an entire + // extend block (possibly containing multiple extension definitions) will + // have an outer location whose path refers to the "extensions" repeated + // field without an index. + // - Multiple locations may have the same path. This happens when a single + // logical declaration is spread out across multiple places. The most + // obvious example is the "extend" block again -- there may be multiple + // extend blocks in the same scope, each of which will have the same path. + // - A location's span is not always a subset of its parent's span. For + // example, the "extendee" of an extension declaration appears at the + // beginning of the "extend" block and is shared by all extensions within + // the block. + // - Just because a location's span is a subset of some other location's span + // does not mean that it is a descendent. For example, a "group" defines + // both a type and a field in a single declaration. Thus, the locations + // corresponding to the type and field and their components will overlap. + // - Code which tries to interpret locations should probably be designed to + // ignore those that it doesn't understand, as more types of locations could + // be recorded in the future. + Location []*SourceCodeInfo_Location `protobuf:"bytes,1,rep,name=location" json:"location,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *SourceCodeInfo) Reset() { *m = SourceCodeInfo{} } +func (m *SourceCodeInfo) String() string { return proto.CompactTextString(m) } +func (*SourceCodeInfo) ProtoMessage() {} +func (*SourceCodeInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} } + +func (m *SourceCodeInfo) GetLocation() []*SourceCodeInfo_Location { + if m != nil { + return m.Location + } + return nil +} + +type SourceCodeInfo_Location struct { + // Identifies which part of the FileDescriptorProto was defined at this + // location. + // + // Each element is a field number or an index. They form a path from + // the root FileDescriptorProto to the place where the definition. For + // example, this path: + // [ 4, 3, 2, 7, 1 ] + // refers to: + // file.message_type(3) // 4, 3 + // .field(7) // 2, 7 + // .name() // 1 + // This is because FileDescriptorProto.message_type has field number 4: + // repeated DescriptorProto message_type = 4; + // and DescriptorProto.field has field number 2: + // repeated FieldDescriptorProto field = 2; + // and FieldDescriptorProto.name has field number 1: + // optional string name = 1; + // + // Thus, the above path gives the location of a field name. If we removed + // the last element: + // [ 4, 3, 2, 7 ] + // this path refers to the whole field declaration (from the beginning + // of the label to the terminating semicolon). + Path []int32 `protobuf:"varint,1,rep,packed,name=path" json:"path,omitempty"` + // Always has exactly three or four elements: start line, start column, + // end line (optional, otherwise assumed same as start line), end column. + // These are packed into a single field for efficiency. Note that line + // and column numbers are zero-based -- typically you will want to add + // 1 to each before displaying to a user. + Span []int32 `protobuf:"varint,2,rep,packed,name=span" json:"span,omitempty"` + // If this SourceCodeInfo represents a complete declaration, these are any + // comments appearing before and after the declaration which appear to be + // attached to the declaration. + // + // A series of line comments appearing on consecutive lines, with no other + // tokens appearing on those lines, will be treated as a single comment. + // + // leading_detached_comments will keep paragraphs of comments that appear + // before (but not connected to) the current element. Each paragraph, + // separated by empty lines, will be one comment element in the repeated + // field. + // + // Only the comment content is provided; comment markers (e.g. //) are + // stripped out. For block comments, leading whitespace and an asterisk + // will be stripped from the beginning of each line other than the first. + // Newlines are included in the output. + // + // Examples: + // + // optional int32 foo = 1; // Comment attached to foo. + // // Comment attached to bar. + // optional int32 bar = 2; + // + // optional string baz = 3; + // // Comment attached to baz. + // // Another line attached to baz. + // + // // Comment attached to qux. + // // + // // Another line attached to qux. + // optional double qux = 4; + // + // // Detached comment for corge. This is not leading or trailing comments + // // to qux or corge because there are blank lines separating it from + // // both. + // + // // Detached comment for corge paragraph 2. + // + // optional string corge = 5; + // /* Block comment attached + // * to corge. Leading asterisks + // * will be removed. */ + // /* Block comment attached to + // * grault. */ + // optional int32 grault = 6; + // + // // ignored detached comments. + LeadingComments *string `protobuf:"bytes,3,opt,name=leading_comments,json=leadingComments" json:"leading_comments,omitempty"` + TrailingComments *string `protobuf:"bytes,4,opt,name=trailing_comments,json=trailingComments" json:"trailing_comments,omitempty"` + LeadingDetachedComments []string `protobuf:"bytes,6,rep,name=leading_detached_comments,json=leadingDetachedComments" json:"leading_detached_comments,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *SourceCodeInfo_Location) Reset() { *m = SourceCodeInfo_Location{} } +func (m *SourceCodeInfo_Location) String() string { return proto.CompactTextString(m) } +func (*SourceCodeInfo_Location) ProtoMessage() {} +func (*SourceCodeInfo_Location) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19, 0} } + +func (m *SourceCodeInfo_Location) GetPath() []int32 { + if m != nil { + return m.Path + } + return nil +} + +func (m *SourceCodeInfo_Location) GetSpan() []int32 { + if m != nil { + return m.Span + } + return nil +} + +func (m *SourceCodeInfo_Location) GetLeadingComments() string { + if m != nil && m.LeadingComments != nil { + return *m.LeadingComments + } + return "" +} + +func (m *SourceCodeInfo_Location) GetTrailingComments() string { + if m != nil && m.TrailingComments != nil { + return *m.TrailingComments + } + return "" +} + +func (m *SourceCodeInfo_Location) GetLeadingDetachedComments() []string { + if m != nil { + return m.LeadingDetachedComments + } + return nil +} + +// Describes the relationship between generated code and its original source +// file. A GeneratedCodeInfo message is associated with only one generated +// source file, but may contain references to different source .proto files. +type GeneratedCodeInfo struct { + // An Annotation connects some span of text in generated code to an element + // of its generating .proto file. + Annotation []*GeneratedCodeInfo_Annotation `protobuf:"bytes,1,rep,name=annotation" json:"annotation,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GeneratedCodeInfo) Reset() { *m = GeneratedCodeInfo{} } +func (m *GeneratedCodeInfo) String() string { return proto.CompactTextString(m) } +func (*GeneratedCodeInfo) ProtoMessage() {} +func (*GeneratedCodeInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} } + +func (m *GeneratedCodeInfo) GetAnnotation() []*GeneratedCodeInfo_Annotation { + if m != nil { + return m.Annotation + } + return nil +} + +type GeneratedCodeInfo_Annotation struct { + // Identifies the element in the original source .proto file. This field + // is formatted the same as SourceCodeInfo.Location.path. + Path []int32 `protobuf:"varint,1,rep,packed,name=path" json:"path,omitempty"` + // Identifies the filesystem path to the original source .proto. + SourceFile *string `protobuf:"bytes,2,opt,name=source_file,json=sourceFile" json:"source_file,omitempty"` + // Identifies the starting offset in bytes in the generated code + // that relates to the identified object. + Begin *int32 `protobuf:"varint,3,opt,name=begin" json:"begin,omitempty"` + // Identifies the ending offset in bytes in the generated code that + // relates to the identified offset. The end offset should be one past + // the last relevant byte (so the length of the text = end - begin). + End *int32 `protobuf:"varint,4,opt,name=end" json:"end,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GeneratedCodeInfo_Annotation) Reset() { *m = GeneratedCodeInfo_Annotation{} } +func (m *GeneratedCodeInfo_Annotation) String() string { return proto.CompactTextString(m) } +func (*GeneratedCodeInfo_Annotation) ProtoMessage() {} +func (*GeneratedCodeInfo_Annotation) Descriptor() ([]byte, []int) { + return fileDescriptor0, []int{20, 0} +} + +func (m *GeneratedCodeInfo_Annotation) GetPath() []int32 { + if m != nil { + return m.Path + } + return nil +} + +func (m *GeneratedCodeInfo_Annotation) GetSourceFile() string { + if m != nil && m.SourceFile != nil { + return *m.SourceFile + } + return "" +} + +func (m *GeneratedCodeInfo_Annotation) GetBegin() int32 { + if m != nil && m.Begin != nil { + return *m.Begin + } + return 0 +} + +func (m *GeneratedCodeInfo_Annotation) GetEnd() int32 { + if m != nil && m.End != nil { + return *m.End + } + return 0 +} + +func init() { + proto.RegisterType((*FileDescriptorSet)(nil), "google.protobuf.FileDescriptorSet") + proto.RegisterType((*FileDescriptorProto)(nil), "google.protobuf.FileDescriptorProto") + proto.RegisterType((*DescriptorProto)(nil), "google.protobuf.DescriptorProto") + proto.RegisterType((*DescriptorProto_ExtensionRange)(nil), "google.protobuf.DescriptorProto.ExtensionRange") + proto.RegisterType((*DescriptorProto_ReservedRange)(nil), "google.protobuf.DescriptorProto.ReservedRange") + proto.RegisterType((*ExtensionRangeOptions)(nil), "google.protobuf.ExtensionRangeOptions") + proto.RegisterType((*FieldDescriptorProto)(nil), "google.protobuf.FieldDescriptorProto") + proto.RegisterType((*OneofDescriptorProto)(nil), "google.protobuf.OneofDescriptorProto") + proto.RegisterType((*EnumDescriptorProto)(nil), "google.protobuf.EnumDescriptorProto") + proto.RegisterType((*EnumValueDescriptorProto)(nil), "google.protobuf.EnumValueDescriptorProto") + proto.RegisterType((*ServiceDescriptorProto)(nil), "google.protobuf.ServiceDescriptorProto") + proto.RegisterType((*MethodDescriptorProto)(nil), "google.protobuf.MethodDescriptorProto") + proto.RegisterType((*FileOptions)(nil), "google.protobuf.FileOptions") + proto.RegisterType((*MessageOptions)(nil), "google.protobuf.MessageOptions") + proto.RegisterType((*FieldOptions)(nil), "google.protobuf.FieldOptions") + proto.RegisterType((*OneofOptions)(nil), "google.protobuf.OneofOptions") + proto.RegisterType((*EnumOptions)(nil), "google.protobuf.EnumOptions") + proto.RegisterType((*EnumValueOptions)(nil), "google.protobuf.EnumValueOptions") + proto.RegisterType((*ServiceOptions)(nil), "google.protobuf.ServiceOptions") + proto.RegisterType((*MethodOptions)(nil), "google.protobuf.MethodOptions") + proto.RegisterType((*UninterpretedOption)(nil), "google.protobuf.UninterpretedOption") + proto.RegisterType((*UninterpretedOption_NamePart)(nil), "google.protobuf.UninterpretedOption.NamePart") + proto.RegisterType((*SourceCodeInfo)(nil), "google.protobuf.SourceCodeInfo") + proto.RegisterType((*SourceCodeInfo_Location)(nil), "google.protobuf.SourceCodeInfo.Location") + proto.RegisterType((*GeneratedCodeInfo)(nil), "google.protobuf.GeneratedCodeInfo") + proto.RegisterType((*GeneratedCodeInfo_Annotation)(nil), "google.protobuf.GeneratedCodeInfo.Annotation") + proto.RegisterEnum("google.protobuf.FieldDescriptorProto_Type", FieldDescriptorProto_Type_name, FieldDescriptorProto_Type_value) + proto.RegisterEnum("google.protobuf.FieldDescriptorProto_Label", FieldDescriptorProto_Label_name, FieldDescriptorProto_Label_value) + proto.RegisterEnum("google.protobuf.FileOptions_OptimizeMode", FileOptions_OptimizeMode_name, FileOptions_OptimizeMode_value) + proto.RegisterEnum("google.protobuf.FieldOptions_CType", FieldOptions_CType_name, FieldOptions_CType_value) + proto.RegisterEnum("google.protobuf.FieldOptions_JSType", FieldOptions_JSType_name, FieldOptions_JSType_value) + proto.RegisterEnum("google.protobuf.MethodOptions_IdempotencyLevel", MethodOptions_IdempotencyLevel_name, MethodOptions_IdempotencyLevel_value) +} + +func init() { proto.RegisterFile("google/protobuf/descriptor.proto", fileDescriptor0) } + +var fileDescriptor0 = []byte{ + // 2519 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x59, 0xdd, 0x6e, 0x1b, 0xc7, + 0x15, 0x0e, 0x7f, 0x45, 0x1e, 0x52, 0xd4, 0x68, 0xa4, 0xd8, 0x6b, 0xe5, 0xc7, 0x32, 0xf3, 0x63, + 0xd9, 0x69, 0xa8, 0x40, 0xb1, 0x1d, 0x47, 0x29, 0xd2, 0x52, 0xe4, 0x5a, 0xa1, 0x4a, 0x91, 0xec, + 0x92, 0x6a, 0x7e, 0x6e, 0x16, 0xa3, 0xdd, 0x21, 0xb9, 0xf6, 0x72, 0x77, 0xb3, 0xbb, 0xb4, 0xad, + 0xa0, 0x17, 0x06, 0x7a, 0x55, 0xa0, 0x0f, 0x50, 0x14, 0x45, 0x2f, 0x72, 0x13, 0xa0, 0x0f, 0x50, + 0x20, 0x77, 0x7d, 0x82, 0x02, 0x79, 0x83, 0xa2, 0x28, 0xd0, 0x3e, 0x46, 0x31, 0x33, 0xbb, 0xcb, + 0x5d, 0xfe, 0xc4, 0x6a, 0x80, 0x38, 0x57, 0xe4, 0x7c, 0xe7, 0x3b, 0x67, 0xce, 0x9c, 0x39, 0x33, + 0x73, 0x66, 0x16, 0x76, 0x47, 0xb6, 0x3d, 0x32, 0xe9, 0xbe, 0xe3, 0xda, 0xbe, 0x7d, 0x3e, 0x1d, + 0xee, 0xeb, 0xd4, 0xd3, 0x5c, 0xc3, 0xf1, 0x6d, 0xb7, 0xc6, 0x31, 0xbc, 0x21, 0x18, 0xb5, 0x90, + 0x51, 0x3d, 0x85, 0xcd, 0x07, 0x86, 0x49, 0x9b, 0x11, 0xb1, 0x4f, 0x7d, 0x7c, 0x1f, 0xb2, 0x43, + 0xc3, 0xa4, 0x52, 0x6a, 0x37, 0xb3, 0x57, 0x3a, 0x78, 0xb3, 0x36, 0xa7, 0x54, 0x4b, 0x6a, 0xf4, + 0x18, 0xac, 0x70, 0x8d, 0xea, 0xbf, 0xb3, 0xb0, 0xb5, 0x44, 0x8a, 0x31, 0x64, 0x2d, 0x32, 0x61, + 0x16, 0x53, 0x7b, 0x45, 0x85, 0xff, 0xc7, 0x12, 0xac, 0x39, 0x44, 0x7b, 0x44, 0x46, 0x54, 0x4a, + 0x73, 0x38, 0x6c, 0xe2, 0xd7, 0x01, 0x74, 0xea, 0x50, 0x4b, 0xa7, 0x96, 0x76, 0x21, 0x65, 0x76, + 0x33, 0x7b, 0x45, 0x25, 0x86, 0xe0, 0x77, 0x60, 0xd3, 0x99, 0x9e, 0x9b, 0x86, 0xa6, 0xc6, 0x68, + 0xb0, 0x9b, 0xd9, 0xcb, 0x29, 0x48, 0x08, 0x9a, 0x33, 0xf2, 0x4d, 0xd8, 0x78, 0x42, 0xc9, 0xa3, + 0x38, 0xb5, 0xc4, 0xa9, 0x15, 0x06, 0xc7, 0x88, 0x0d, 0x28, 0x4f, 0xa8, 0xe7, 0x91, 0x11, 0x55, + 0xfd, 0x0b, 0x87, 0x4a, 0x59, 0x3e, 0xfa, 0xdd, 0x85, 0xd1, 0xcf, 0x8f, 0xbc, 0x14, 0x68, 0x0d, + 0x2e, 0x1c, 0x8a, 0xeb, 0x50, 0xa4, 0xd6, 0x74, 0x22, 0x2c, 0xe4, 0x56, 0xc4, 0x4f, 0xb6, 0xa6, + 0x93, 0x79, 0x2b, 0x05, 0xa6, 0x16, 0x98, 0x58, 0xf3, 0xa8, 0xfb, 0xd8, 0xd0, 0xa8, 0x94, 0xe7, + 0x06, 0x6e, 0x2e, 0x18, 0xe8, 0x0b, 0xf9, 0xbc, 0x8d, 0x50, 0x0f, 0x37, 0xa0, 0x48, 0x9f, 0xfa, + 0xd4, 0xf2, 0x0c, 0xdb, 0x92, 0xd6, 0xb8, 0x91, 0xb7, 0x96, 0xcc, 0x22, 0x35, 0xf5, 0x79, 0x13, + 0x33, 0x3d, 0x7c, 0x0f, 0xd6, 0x6c, 0xc7, 0x37, 0x6c, 0xcb, 0x93, 0x0a, 0xbb, 0xa9, 0xbd, 0xd2, + 0xc1, 0xab, 0x4b, 0x13, 0xa1, 0x2b, 0x38, 0x4a, 0x48, 0xc6, 0x2d, 0x40, 0x9e, 0x3d, 0x75, 0x35, + 0xaa, 0x6a, 0xb6, 0x4e, 0x55, 0xc3, 0x1a, 0xda, 0x52, 0x91, 0x1b, 0xb8, 0xbe, 0x38, 0x10, 0x4e, + 0x6c, 0xd8, 0x3a, 0x6d, 0x59, 0x43, 0x5b, 0xa9, 0x78, 0x89, 0x36, 0xbe, 0x02, 0x79, 0xef, 0xc2, + 0xf2, 0xc9, 0x53, 0xa9, 0xcc, 0x33, 0x24, 0x68, 0x55, 0xbf, 0xcd, 0xc3, 0xc6, 0x65, 0x52, 0xec, + 0x23, 0xc8, 0x0d, 0xd9, 0x28, 0xa5, 0xf4, 0xff, 0x13, 0x03, 0xa1, 0x93, 0x0c, 0x62, 0xfe, 0x07, + 0x06, 0xb1, 0x0e, 0x25, 0x8b, 0x7a, 0x3e, 0xd5, 0x45, 0x46, 0x64, 0x2e, 0x99, 0x53, 0x20, 0x94, + 0x16, 0x53, 0x2a, 0xfb, 0x83, 0x52, 0xea, 0x33, 0xd8, 0x88, 0x5c, 0x52, 0x5d, 0x62, 0x8d, 0xc2, + 0xdc, 0xdc, 0x7f, 0x9e, 0x27, 0x35, 0x39, 0xd4, 0x53, 0x98, 0x9a, 0x52, 0xa1, 0x89, 0x36, 0x6e, + 0x02, 0xd8, 0x16, 0xb5, 0x87, 0xaa, 0x4e, 0x35, 0x53, 0x2a, 0xac, 0x88, 0x52, 0x97, 0x51, 0x16, + 0xa2, 0x64, 0x0b, 0x54, 0x33, 0xf1, 0x87, 0xb3, 0x54, 0x5b, 0x5b, 0x91, 0x29, 0xa7, 0x62, 0x91, + 0x2d, 0x64, 0xdb, 0x19, 0x54, 0x5c, 0xca, 0xf2, 0x9e, 0xea, 0xc1, 0xc8, 0x8a, 0xdc, 0x89, 0xda, + 0x73, 0x47, 0xa6, 0x04, 0x6a, 0x62, 0x60, 0xeb, 0x6e, 0xbc, 0x89, 0xdf, 0x80, 0x08, 0x50, 0x79, + 0x5a, 0x01, 0xdf, 0x85, 0xca, 0x21, 0xd8, 0x21, 0x13, 0xba, 0xf3, 0x15, 0x54, 0x92, 0xe1, 0xc1, + 0xdb, 0x90, 0xf3, 0x7c, 0xe2, 0xfa, 0x3c, 0x0b, 0x73, 0x8a, 0x68, 0x60, 0x04, 0x19, 0x6a, 0xe9, + 0x7c, 0x97, 0xcb, 0x29, 0xec, 0x2f, 0xfe, 0xe5, 0x6c, 0xc0, 0x19, 0x3e, 0xe0, 0xb7, 0x17, 0x67, + 0x34, 0x61, 0x79, 0x7e, 0xdc, 0x3b, 0x1f, 0xc0, 0x7a, 0x62, 0x00, 0x97, 0xed, 0xba, 0xfa, 0x5b, + 0x78, 0x79, 0xa9, 0x69, 0xfc, 0x19, 0x6c, 0x4f, 0x2d, 0xc3, 0xf2, 0xa9, 0xeb, 0xb8, 0x94, 0x65, + 0xac, 0xe8, 0x4a, 0xfa, 0xcf, 0xda, 0x8a, 0x9c, 0x3b, 0x8b, 0xb3, 0x85, 0x15, 0x65, 0x6b, 0xba, + 0x08, 0xde, 0x2e, 0x16, 0xfe, 0xbb, 0x86, 0x9e, 0x3d, 0x7b, 0xf6, 0x2c, 0x5d, 0xfd, 0x63, 0x1e, + 0xb6, 0x97, 0xad, 0x99, 0xa5, 0xcb, 0xf7, 0x0a, 0xe4, 0xad, 0xe9, 0xe4, 0x9c, 0xba, 0x3c, 0x48, + 0x39, 0x25, 0x68, 0xe1, 0x3a, 0xe4, 0x4c, 0x72, 0x4e, 0x4d, 0x29, 0xbb, 0x9b, 0xda, 0xab, 0x1c, + 0xbc, 0x73, 0xa9, 0x55, 0x59, 0x6b, 0x33, 0x15, 0x45, 0x68, 0xe2, 0x8f, 0x21, 0x1b, 0x6c, 0xd1, + 0xcc, 0xc2, 0xed, 0xcb, 0x59, 0x60, 0x6b, 0x49, 0xe1, 0x7a, 0xf8, 0x15, 0x28, 0xb2, 0x5f, 0x91, + 0x1b, 0x79, 0xee, 0x73, 0x81, 0x01, 0x2c, 0x2f, 0xf0, 0x0e, 0x14, 0xf8, 0x32, 0xd1, 0x69, 0x78, + 0xb4, 0x45, 0x6d, 0x96, 0x58, 0x3a, 0x1d, 0x92, 0xa9, 0xe9, 0xab, 0x8f, 0x89, 0x39, 0xa5, 0x3c, + 0xe1, 0x8b, 0x4a, 0x39, 0x00, 0x7f, 0xc3, 0x30, 0x7c, 0x1d, 0x4a, 0x62, 0x55, 0x19, 0x96, 0x4e, + 0x9f, 0xf2, 0xdd, 0x33, 0xa7, 0x88, 0x85, 0xd6, 0x62, 0x08, 0xeb, 0xfe, 0xa1, 0x67, 0x5b, 0x61, + 0x6a, 0xf2, 0x2e, 0x18, 0xc0, 0xbb, 0xff, 0x60, 0x7e, 0xe3, 0x7e, 0x6d, 0xf9, 0xf0, 0xe6, 0x73, + 0xaa, 0xfa, 0xb7, 0x34, 0x64, 0xf9, 0x7e, 0xb1, 0x01, 0xa5, 0xc1, 0xe7, 0x3d, 0x59, 0x6d, 0x76, + 0xcf, 0x8e, 0xda, 0x32, 0x4a, 0xe1, 0x0a, 0x00, 0x07, 0x1e, 0xb4, 0xbb, 0xf5, 0x01, 0x4a, 0x47, + 0xed, 0x56, 0x67, 0x70, 0xef, 0x0e, 0xca, 0x44, 0x0a, 0x67, 0x02, 0xc8, 0xc6, 0x09, 0xef, 0x1f, + 0xa0, 0x1c, 0x46, 0x50, 0x16, 0x06, 0x5a, 0x9f, 0xc9, 0xcd, 0x7b, 0x77, 0x50, 0x3e, 0x89, 0xbc, + 0x7f, 0x80, 0xd6, 0xf0, 0x3a, 0x14, 0x39, 0x72, 0xd4, 0xed, 0xb6, 0x51, 0x21, 0xb2, 0xd9, 0x1f, + 0x28, 0xad, 0xce, 0x31, 0x2a, 0x46, 0x36, 0x8f, 0x95, 0xee, 0x59, 0x0f, 0x41, 0x64, 0xe1, 0x54, + 0xee, 0xf7, 0xeb, 0xc7, 0x32, 0x2a, 0x45, 0x8c, 0xa3, 0xcf, 0x07, 0x72, 0x1f, 0x95, 0x13, 0x6e, + 0xbd, 0x7f, 0x80, 0xd6, 0xa3, 0x2e, 0xe4, 0xce, 0xd9, 0x29, 0xaa, 0xe0, 0x4d, 0x58, 0x17, 0x5d, + 0x84, 0x4e, 0x6c, 0xcc, 0x41, 0xf7, 0xee, 0x20, 0x34, 0x73, 0x44, 0x58, 0xd9, 0x4c, 0x00, 0xf7, + 0xee, 0x20, 0x5c, 0x6d, 0x40, 0x8e, 0x67, 0x17, 0xc6, 0x50, 0x69, 0xd7, 0x8f, 0xe4, 0xb6, 0xda, + 0xed, 0x0d, 0x5a, 0xdd, 0x4e, 0xbd, 0x8d, 0x52, 0x33, 0x4c, 0x91, 0x7f, 0x7d, 0xd6, 0x52, 0xe4, + 0x26, 0x4a, 0xc7, 0xb1, 0x9e, 0x5c, 0x1f, 0xc8, 0x4d, 0x94, 0xa9, 0x6a, 0xb0, 0xbd, 0x6c, 0x9f, + 0x5c, 0xba, 0x32, 0x62, 0x53, 0x9c, 0x5e, 0x31, 0xc5, 0xdc, 0xd6, 0xc2, 0x14, 0x7f, 0x9d, 0x82, + 0xad, 0x25, 0x67, 0xc5, 0xd2, 0x4e, 0x7e, 0x01, 0x39, 0x91, 0xa2, 0xe2, 0xf4, 0xbc, 0xb5, 0xf4, + 0xd0, 0xe1, 0x09, 0xbb, 0x70, 0x82, 0x72, 0xbd, 0x78, 0x05, 0x91, 0x59, 0x51, 0x41, 0x30, 0x13, + 0x0b, 0x4e, 0xfe, 0x2e, 0x05, 0xd2, 0x2a, 0xdb, 0xcf, 0xd9, 0x28, 0xd2, 0x89, 0x8d, 0xe2, 0xa3, + 0x79, 0x07, 0x6e, 0xac, 0x1e, 0xc3, 0x82, 0x17, 0xdf, 0xa4, 0xe0, 0xca, 0xf2, 0x42, 0x6b, 0xa9, + 0x0f, 0x1f, 0x43, 0x7e, 0x42, 0xfd, 0xb1, 0x1d, 0x16, 0x1b, 0x6f, 0x2f, 0x39, 0xc2, 0x98, 0x78, + 0x3e, 0x56, 0x81, 0x56, 0xfc, 0x0c, 0xcc, 0xac, 0xaa, 0x96, 0x84, 0x37, 0x0b, 0x9e, 0xfe, 0x3e, + 0x0d, 0x2f, 0x2f, 0x35, 0xbe, 0xd4, 0xd1, 0xd7, 0x00, 0x0c, 0xcb, 0x99, 0xfa, 0xa2, 0xa0, 0x10, + 0xfb, 0x53, 0x91, 0x23, 0x7c, 0xed, 0xb3, 0xbd, 0x67, 0xea, 0x47, 0xf2, 0x0c, 0x97, 0x83, 0x80, + 0x38, 0xe1, 0xfe, 0xcc, 0xd1, 0x2c, 0x77, 0xf4, 0xf5, 0x15, 0x23, 0x5d, 0x38, 0xab, 0xdf, 0x03, + 0xa4, 0x99, 0x06, 0xb5, 0x7c, 0xd5, 0xf3, 0x5d, 0x4a, 0x26, 0x86, 0x35, 0xe2, 0x1b, 0x70, 0xe1, + 0x30, 0x37, 0x24, 0xa6, 0x47, 0x95, 0x0d, 0x21, 0xee, 0x87, 0x52, 0xa6, 0xc1, 0xcf, 0x38, 0x37, + 0xa6, 0x91, 0x4f, 0x68, 0x08, 0x71, 0xa4, 0x51, 0xfd, 0xb6, 0x00, 0xa5, 0x58, 0x59, 0x8a, 0x6f, + 0x40, 0xf9, 0x21, 0x79, 0x4c, 0xd4, 0xf0, 0xaa, 0x21, 0x22, 0x51, 0x62, 0x58, 0x2f, 0xb8, 0x6e, + 0xbc, 0x07, 0xdb, 0x9c, 0x62, 0x4f, 0x7d, 0xea, 0xaa, 0x9a, 0x49, 0x3c, 0x8f, 0x07, 0xad, 0xc0, + 0xa9, 0x98, 0xc9, 0xba, 0x4c, 0xd4, 0x08, 0x25, 0xf8, 0x2e, 0x6c, 0x71, 0x8d, 0xc9, 0xd4, 0xf4, + 0x0d, 0xc7, 0xa4, 0x2a, 0xbb, 0xfc, 0x78, 0x7c, 0x23, 0x8e, 0x3c, 0xdb, 0x64, 0x8c, 0xd3, 0x80, + 0xc0, 0x3c, 0xf2, 0x70, 0x13, 0x5e, 0xe3, 0x6a, 0x23, 0x6a, 0x51, 0x97, 0xf8, 0x54, 0xa5, 0x5f, + 0x4e, 0x89, 0xe9, 0xa9, 0xc4, 0xd2, 0xd5, 0x31, 0xf1, 0xc6, 0xd2, 0x36, 0x33, 0x70, 0x94, 0x96, + 0x52, 0xca, 0x35, 0x46, 0x3c, 0x0e, 0x78, 0x32, 0xa7, 0xd5, 0x2d, 0xfd, 0x13, 0xe2, 0x8d, 0xf1, + 0x21, 0x5c, 0xe1, 0x56, 0x3c, 0xdf, 0x35, 0xac, 0x91, 0xaa, 0x8d, 0xa9, 0xf6, 0x48, 0x9d, 0xfa, + 0xc3, 0xfb, 0xd2, 0x2b, 0xf1, 0xfe, 0xb9, 0x87, 0x7d, 0xce, 0x69, 0x30, 0xca, 0x99, 0x3f, 0xbc, + 0x8f, 0xfb, 0x50, 0x66, 0x93, 0x31, 0x31, 0xbe, 0xa2, 0xea, 0xd0, 0x76, 0xf9, 0xc9, 0x52, 0x59, + 0xb2, 0xb2, 0x63, 0x11, 0xac, 0x75, 0x03, 0x85, 0x53, 0x5b, 0xa7, 0x87, 0xb9, 0x7e, 0x4f, 0x96, + 0x9b, 0x4a, 0x29, 0xb4, 0xf2, 0xc0, 0x76, 0x59, 0x42, 0x8d, 0xec, 0x28, 0xc0, 0x25, 0x91, 0x50, + 0x23, 0x3b, 0x0c, 0xef, 0x5d, 0xd8, 0xd2, 0x34, 0x31, 0x66, 0x43, 0x53, 0x83, 0x2b, 0x8a, 0x27, + 0xa1, 0x44, 0xb0, 0x34, 0xed, 0x58, 0x10, 0x82, 0x1c, 0xf7, 0xf0, 0x87, 0xf0, 0xf2, 0x2c, 0x58, + 0x71, 0xc5, 0xcd, 0x85, 0x51, 0xce, 0xab, 0xde, 0x85, 0x2d, 0xe7, 0x62, 0x51, 0x11, 0x27, 0x7a, + 0x74, 0x2e, 0xe6, 0xd5, 0x3e, 0x80, 0x6d, 0x67, 0xec, 0x2c, 0xea, 0xdd, 0x8e, 0xeb, 0x61, 0x67, + 0xec, 0xcc, 0x2b, 0xbe, 0xc5, 0xef, 0xab, 0x2e, 0xd5, 0x88, 0x4f, 0x75, 0xe9, 0x6a, 0x9c, 0x1e, + 0x13, 0xe0, 0x7d, 0x40, 0x9a, 0xa6, 0x52, 0x8b, 0x9c, 0x9b, 0x54, 0x25, 0x2e, 0xb5, 0x88, 0x27, + 0x5d, 0x8f, 0x93, 0x2b, 0x9a, 0x26, 0x73, 0x69, 0x9d, 0x0b, 0xf1, 0x6d, 0xd8, 0xb4, 0xcf, 0x1f, + 0x6a, 0x22, 0x25, 0x55, 0xc7, 0xa5, 0x43, 0xe3, 0xa9, 0xf4, 0x26, 0x8f, 0xef, 0x06, 0x13, 0xf0, + 0x84, 0xec, 0x71, 0x18, 0xdf, 0x02, 0xa4, 0x79, 0x63, 0xe2, 0x3a, 0xbc, 0x26, 0xf0, 0x1c, 0xa2, + 0x51, 0xe9, 0x2d, 0x41, 0x15, 0x78, 0x27, 0x84, 0xd9, 0x92, 0xf0, 0x9e, 0x18, 0x43, 0x3f, 0xb4, + 0x78, 0x53, 0x2c, 0x09, 0x8e, 0x05, 0xd6, 0xf6, 0x00, 0xb1, 0x50, 0x24, 0x3a, 0xde, 0xe3, 0xb4, + 0x8a, 0x33, 0x76, 0xe2, 0xfd, 0xbe, 0x01, 0xeb, 0x8c, 0x39, 0xeb, 0xf4, 0x96, 0xa8, 0x67, 0x9c, + 0x71, 0xac, 0xc7, 0x1f, 0xad, 0xb4, 0xac, 0x1e, 0x42, 0x39, 0x9e, 0x9f, 0xb8, 0x08, 0x22, 0x43, + 0x51, 0x8a, 0x9d, 0xf5, 0x8d, 0x6e, 0x93, 0x9d, 0xd2, 0x5f, 0xc8, 0x28, 0xcd, 0xaa, 0x85, 0x76, + 0x6b, 0x20, 0xab, 0xca, 0x59, 0x67, 0xd0, 0x3a, 0x95, 0x51, 0x26, 0x56, 0x96, 0x9e, 0x64, 0x0b, + 0x6f, 0xa3, 0x9b, 0xd5, 0xef, 0xd2, 0x50, 0x49, 0xde, 0x33, 0xf0, 0xcf, 0xe1, 0x6a, 0xf8, 0x28, + 0xe0, 0x51, 0x5f, 0x7d, 0x62, 0xb8, 0x7c, 0xe1, 0x4c, 0x88, 0xa8, 0xb3, 0xa3, 0xa9, 0xdb, 0x0e, + 0x58, 0x7d, 0xea, 0x7f, 0x6a, 0xb8, 0x6c, 0x59, 0x4c, 0x88, 0x8f, 0xdb, 0x70, 0xdd, 0xb2, 0x55, + 0xcf, 0x27, 0x96, 0x4e, 0x5c, 0x5d, 0x9d, 0x3d, 0xc7, 0xa8, 0x44, 0xd3, 0xa8, 0xe7, 0xd9, 0xe2, + 0xc0, 0x8a, 0xac, 0xbc, 0x6a, 0xd9, 0xfd, 0x80, 0x3c, 0xdb, 0xc9, 0xeb, 0x01, 0x75, 0x2e, 0xcd, + 0x32, 0xab, 0xd2, 0xec, 0x15, 0x28, 0x4e, 0x88, 0xa3, 0x52, 0xcb, 0x77, 0x2f, 0x78, 0x75, 0x59, + 0x50, 0x0a, 0x13, 0xe2, 0xc8, 0xac, 0xfd, 0x42, 0x8a, 0xfc, 0x93, 0x6c, 0xa1, 0x80, 0x8a, 0x27, + 0xd9, 0x42, 0x11, 0x41, 0xf5, 0x5f, 0x19, 0x28, 0xc7, 0xab, 0x4d, 0x56, 0xbc, 0x6b, 0xfc, 0x64, + 0x49, 0xf1, 0xbd, 0xe7, 0x8d, 0xef, 0xad, 0x4d, 0x6b, 0x0d, 0x76, 0xe4, 0x1c, 0xe6, 0x45, 0x0d, + 0xa8, 0x08, 0x4d, 0x76, 0xdc, 0xb3, 0xdd, 0x86, 0x8a, 0x7b, 0x4d, 0x41, 0x09, 0x5a, 0xf8, 0x18, + 0xf2, 0x0f, 0x3d, 0x6e, 0x3b, 0xcf, 0x6d, 0xbf, 0xf9, 0xfd, 0xb6, 0x4f, 0xfa, 0xdc, 0x78, 0xf1, + 0xa4, 0xaf, 0x76, 0xba, 0xca, 0x69, 0xbd, 0xad, 0x04, 0xea, 0xf8, 0x1a, 0x64, 0x4d, 0xf2, 0xd5, + 0x45, 0xf2, 0x70, 0xe2, 0xd0, 0x65, 0x27, 0xe1, 0x1a, 0x64, 0x9f, 0x50, 0xf2, 0x28, 0x79, 0x24, + 0x70, 0xe8, 0x47, 0x5c, 0x0c, 0xfb, 0x90, 0xe3, 0xf1, 0xc2, 0x00, 0x41, 0xc4, 0xd0, 0x4b, 0xb8, + 0x00, 0xd9, 0x46, 0x57, 0x61, 0x0b, 0x02, 0x41, 0x59, 0xa0, 0x6a, 0xaf, 0x25, 0x37, 0x64, 0x94, + 0xae, 0xde, 0x85, 0xbc, 0x08, 0x02, 0x5b, 0x2c, 0x51, 0x18, 0xd0, 0x4b, 0x41, 0x33, 0xb0, 0x91, + 0x0a, 0xa5, 0x67, 0xa7, 0x47, 0xb2, 0x82, 0xd2, 0xc9, 0xa9, 0xce, 0xa2, 0x5c, 0xd5, 0x83, 0x72, + 0xbc, 0xdc, 0x7c, 0x31, 0x57, 0xc9, 0xbf, 0xa7, 0xa0, 0x14, 0x2b, 0x1f, 0x59, 0xe1, 0x42, 0x4c, + 0xd3, 0x7e, 0xa2, 0x12, 0xd3, 0x20, 0x5e, 0x90, 0x1a, 0xc0, 0xa1, 0x3a, 0x43, 0x2e, 0x3b, 0x75, + 0x2f, 0x68, 0x89, 0xe4, 0x50, 0xbe, 0xfa, 0x97, 0x14, 0xa0, 0xf9, 0x02, 0x74, 0xce, 0xcd, 0xd4, + 0x4f, 0xe9, 0x66, 0xf5, 0xcf, 0x29, 0xa8, 0x24, 0xab, 0xce, 0x39, 0xf7, 0x6e, 0xfc, 0xa4, 0xee, + 0xfd, 0x33, 0x0d, 0xeb, 0x89, 0x5a, 0xf3, 0xb2, 0xde, 0x7d, 0x09, 0x9b, 0x86, 0x4e, 0x27, 0x8e, + 0xed, 0x53, 0x4b, 0xbb, 0x50, 0x4d, 0xfa, 0x98, 0x9a, 0x52, 0x95, 0x6f, 0x1a, 0xfb, 0xdf, 0x5f, + 0xcd, 0xd6, 0x5a, 0x33, 0xbd, 0x36, 0x53, 0x3b, 0xdc, 0x6a, 0x35, 0xe5, 0xd3, 0x5e, 0x77, 0x20, + 0x77, 0x1a, 0x9f, 0xab, 0x67, 0x9d, 0x5f, 0x75, 0xba, 0x9f, 0x76, 0x14, 0x64, 0xcc, 0xd1, 0x7e, + 0xc4, 0x65, 0xdf, 0x03, 0x34, 0xef, 0x14, 0xbe, 0x0a, 0xcb, 0xdc, 0x42, 0x2f, 0xe1, 0x2d, 0xd8, + 0xe8, 0x74, 0xd5, 0x7e, 0xab, 0x29, 0xab, 0xf2, 0x83, 0x07, 0x72, 0x63, 0xd0, 0x17, 0xd7, 0xfb, + 0x88, 0x3d, 0x48, 0x2c, 0xf0, 0xea, 0x9f, 0x32, 0xb0, 0xb5, 0xc4, 0x13, 0x5c, 0x0f, 0x6e, 0x16, + 0xe2, 0xb2, 0xf3, 0xee, 0x65, 0xbc, 0xaf, 0xb1, 0x82, 0xa0, 0x47, 0x5c, 0x3f, 0xb8, 0x88, 0xdc, + 0x02, 0x16, 0x25, 0xcb, 0x37, 0x86, 0x06, 0x75, 0x83, 0xd7, 0x10, 0x71, 0xdd, 0xd8, 0x98, 0xe1, + 0xe2, 0x41, 0xe4, 0x67, 0x80, 0x1d, 0xdb, 0x33, 0x7c, 0xe3, 0x31, 0x55, 0x0d, 0x2b, 0x7c, 0x3a, + 0x61, 0xd7, 0x8f, 0xac, 0x82, 0x42, 0x49, 0xcb, 0xf2, 0x23, 0xb6, 0x45, 0x47, 0x64, 0x8e, 0xcd, + 0x36, 0xf3, 0x8c, 0x82, 0x42, 0x49, 0xc4, 0xbe, 0x01, 0x65, 0xdd, 0x9e, 0xb2, 0x9a, 0x4c, 0xf0, + 0xd8, 0xd9, 0x91, 0x52, 0x4a, 0x02, 0x8b, 0x28, 0x41, 0xb5, 0x3d, 0x7b, 0xb3, 0x29, 0x2b, 0x25, + 0x81, 0x09, 0xca, 0x4d, 0xd8, 0x20, 0xa3, 0x91, 0xcb, 0x8c, 0x87, 0x86, 0xc4, 0xfd, 0xa1, 0x12, + 0xc1, 0x9c, 0xb8, 0x73, 0x02, 0x85, 0x30, 0x0e, 0xec, 0xa8, 0x66, 0x91, 0x50, 0x1d, 0xf1, 0x6e, + 0x97, 0xde, 0x2b, 0x2a, 0x05, 0x2b, 0x14, 0xde, 0x80, 0xb2, 0xe1, 0xa9, 0xb3, 0x27, 0xe8, 0xf4, + 0x6e, 0x7a, 0xaf, 0xa0, 0x94, 0x0c, 0x2f, 0x7a, 0xbe, 0xab, 0x7e, 0x93, 0x86, 0x4a, 0xf2, 0x09, + 0x1d, 0x37, 0xa1, 0x60, 0xda, 0x1a, 0xe1, 0xa9, 0x25, 0xbe, 0xdf, 0xec, 0x3d, 0xe7, 0xd5, 0xbd, + 0xd6, 0x0e, 0xf8, 0x4a, 0xa4, 0xb9, 0xf3, 0x8f, 0x14, 0x14, 0x42, 0x18, 0x5f, 0x81, 0xac, 0x43, + 0xfc, 0x31, 0x37, 0x97, 0x3b, 0x4a, 0xa3, 0x94, 0xc2, 0xdb, 0x0c, 0xf7, 0x1c, 0x62, 0xf1, 0x14, + 0x08, 0x70, 0xd6, 0x66, 0xf3, 0x6a, 0x52, 0xa2, 0xf3, 0xcb, 0x89, 0x3d, 0x99, 0x50, 0xcb, 0xf7, + 0xc2, 0x79, 0x0d, 0xf0, 0x46, 0x00, 0xe3, 0x77, 0x60, 0xd3, 0x77, 0x89, 0x61, 0x26, 0xb8, 0x59, + 0xce, 0x45, 0xa1, 0x20, 0x22, 0x1f, 0xc2, 0xb5, 0xd0, 0xae, 0x4e, 0x7d, 0xa2, 0x8d, 0xa9, 0x3e, + 0x53, 0xca, 0xf3, 0xf7, 0xd9, 0xab, 0x01, 0xa1, 0x19, 0xc8, 0x43, 0xdd, 0xea, 0x77, 0x29, 0xd8, + 0x0c, 0xaf, 0x53, 0x7a, 0x14, 0xac, 0x53, 0x00, 0x62, 0x59, 0xb6, 0x1f, 0x0f, 0xd7, 0x62, 0x2a, + 0x2f, 0xe8, 0xd5, 0xea, 0x91, 0x92, 0x12, 0x33, 0xb0, 0x33, 0x01, 0x98, 0x49, 0x56, 0x86, 0xed, + 0x3a, 0x94, 0x82, 0xef, 0x23, 0xfc, 0x23, 0x9b, 0xb8, 0x80, 0x83, 0x80, 0xd8, 0xbd, 0x0b, 0x6f, + 0x43, 0xee, 0x9c, 0x8e, 0x0c, 0x2b, 0x78, 0xf5, 0x14, 0x8d, 0xf0, 0x25, 0x37, 0x1b, 0xbd, 0xe4, + 0x1e, 0xfd, 0x21, 0x05, 0x5b, 0x9a, 0x3d, 0x99, 0xf7, 0xf7, 0x08, 0xcd, 0xbd, 0x02, 0x78, 0x9f, + 0xa4, 0xbe, 0xf8, 0x78, 0x64, 0xf8, 0xe3, 0xe9, 0x79, 0x4d, 0xb3, 0x27, 0xfb, 0x23, 0xdb, 0x24, + 0xd6, 0x68, 0xf6, 0x95, 0x90, 0xff, 0xd1, 0xde, 0x1d, 0x51, 0xeb, 0xdd, 0x91, 0x1d, 0xfb, 0x66, + 0xf8, 0xd1, 0xec, 0xef, 0xd7, 0xe9, 0xcc, 0x71, 0xef, 0xe8, 0xaf, 0xe9, 0x9d, 0x63, 0xd1, 0x57, + 0x2f, 0x8c, 0x8d, 0x42, 0x87, 0x26, 0xd5, 0xd8, 0x78, 0xff, 0x17, 0x00, 0x00, 0xff, 0xff, 0x0c, + 0xab, 0xb6, 0x37, 0x7e, 0x1c, 0x00, 0x00, +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.proto b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.proto new file mode 100644 index 0000000..4d4fb37 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.proto @@ -0,0 +1,849 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// 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. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// The messages in this file describe the definitions found in .proto files. +// A valid .proto file can be translated directly to a FileDescriptorProto +// without any other information (e.g. without reading its imports). + + +syntax = "proto2"; + +package google.protobuf; +option go_package = "github.com/golang/protobuf/protoc-gen-go/descriptor;descriptor"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "DescriptorProtos"; +option csharp_namespace = "Google.Protobuf.Reflection"; +option objc_class_prefix = "GPB"; + +// descriptor.proto must be optimized for speed because reflection-based +// algorithms don't work during bootstrapping. +option optimize_for = SPEED; + +// The protocol compiler can output a FileDescriptorSet containing the .proto +// files it parses. +message FileDescriptorSet { + repeated FileDescriptorProto file = 1; +} + +// Describes a complete .proto file. +message FileDescriptorProto { + optional string name = 1; // file name, relative to root of source tree + optional string package = 2; // e.g. "foo", "foo.bar", etc. + + // Names of files imported by this file. + repeated string dependency = 3; + // Indexes of the public imported files in the dependency list above. + repeated int32 public_dependency = 10; + // Indexes of the weak imported files in the dependency list. + // For Google-internal migration only. Do not use. + repeated int32 weak_dependency = 11; + + // All top-level definitions in this file. + repeated DescriptorProto message_type = 4; + repeated EnumDescriptorProto enum_type = 5; + repeated ServiceDescriptorProto service = 6; + repeated FieldDescriptorProto extension = 7; + + optional FileOptions options = 8; + + // This field contains optional information about the original source code. + // You may safely remove this entire field without harming runtime + // functionality of the descriptors -- the information is needed only by + // development tools. + optional SourceCodeInfo source_code_info = 9; + + // The syntax of the proto file. + // The supported values are "proto2" and "proto3". + optional string syntax = 12; +} + +// Describes a message type. +message DescriptorProto { + optional string name = 1; + + repeated FieldDescriptorProto field = 2; + repeated FieldDescriptorProto extension = 6; + + repeated DescriptorProto nested_type = 3; + repeated EnumDescriptorProto enum_type = 4; + + message ExtensionRange { + optional int32 start = 1; + optional int32 end = 2; + + optional ExtensionRangeOptions options = 3; + } + repeated ExtensionRange extension_range = 5; + + repeated OneofDescriptorProto oneof_decl = 8; + + optional MessageOptions options = 7; + + // Range of reserved tag numbers. Reserved tag numbers may not be used by + // fields or extension ranges in the same message. Reserved ranges may + // not overlap. + message ReservedRange { + optional int32 start = 1; // Inclusive. + optional int32 end = 2; // Exclusive. + } + repeated ReservedRange reserved_range = 9; + // Reserved field names, which may not be used by fields in the same message. + // A given name may only be reserved once. + repeated string reserved_name = 10; +} + +message ExtensionRangeOptions { + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +// Describes a field within a message. +message FieldDescriptorProto { + enum Type { + // 0 is reserved for errors. + // Order is weird for historical reasons. + TYPE_DOUBLE = 1; + TYPE_FLOAT = 2; + // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT64 if + // negative values are likely. + TYPE_INT64 = 3; + TYPE_UINT64 = 4; + // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT32 if + // negative values are likely. + TYPE_INT32 = 5; + TYPE_FIXED64 = 6; + TYPE_FIXED32 = 7; + TYPE_BOOL = 8; + TYPE_STRING = 9; + // Tag-delimited aggregate. + // Group type is deprecated and not supported in proto3. However, Proto3 + // implementations should still be able to parse the group wire format and + // treat group fields as unknown fields. + TYPE_GROUP = 10; + TYPE_MESSAGE = 11; // Length-delimited aggregate. + + // New in version 2. + TYPE_BYTES = 12; + TYPE_UINT32 = 13; + TYPE_ENUM = 14; + TYPE_SFIXED32 = 15; + TYPE_SFIXED64 = 16; + TYPE_SINT32 = 17; // Uses ZigZag encoding. + TYPE_SINT64 = 18; // Uses ZigZag encoding. + }; + + enum Label { + // 0 is reserved for errors + LABEL_OPTIONAL = 1; + LABEL_REQUIRED = 2; + LABEL_REPEATED = 3; + }; + + optional string name = 1; + optional int32 number = 3; + optional Label label = 4; + + // If type_name is set, this need not be set. If both this and type_name + // are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP. + optional Type type = 5; + + // For message and enum types, this is the name of the type. If the name + // starts with a '.', it is fully-qualified. Otherwise, C++-like scoping + // rules are used to find the type (i.e. first the nested types within this + // message are searched, then within the parent, on up to the root + // namespace). + optional string type_name = 6; + + // For extensions, this is the name of the type being extended. It is + // resolved in the same manner as type_name. + optional string extendee = 2; + + // For numeric types, contains the original text representation of the value. + // For booleans, "true" or "false". + // For strings, contains the default text contents (not escaped in any way). + // For bytes, contains the C escaped value. All bytes >= 128 are escaped. + // TODO(kenton): Base-64 encode? + optional string default_value = 7; + + // If set, gives the index of a oneof in the containing type's oneof_decl + // list. This field is a member of that oneof. + optional int32 oneof_index = 9; + + // JSON name of this field. The value is set by protocol compiler. If the + // user has set a "json_name" option on this field, that option's value + // will be used. Otherwise, it's deduced from the field's name by converting + // it to camelCase. + optional string json_name = 10; + + optional FieldOptions options = 8; +} + +// Describes a oneof. +message OneofDescriptorProto { + optional string name = 1; + optional OneofOptions options = 2; +} + +// Describes an enum type. +message EnumDescriptorProto { + optional string name = 1; + + repeated EnumValueDescriptorProto value = 2; + + optional EnumOptions options = 3; +} + +// Describes a value within an enum. +message EnumValueDescriptorProto { + optional string name = 1; + optional int32 number = 2; + + optional EnumValueOptions options = 3; +} + +// Describes a service. +message ServiceDescriptorProto { + optional string name = 1; + repeated MethodDescriptorProto method = 2; + + optional ServiceOptions options = 3; +} + +// Describes a method of a service. +message MethodDescriptorProto { + optional string name = 1; + + // Input and output type names. These are resolved in the same way as + // FieldDescriptorProto.type_name, but must refer to a message type. + optional string input_type = 2; + optional string output_type = 3; + + optional MethodOptions options = 4; + + // Identifies if client streams multiple client messages + optional bool client_streaming = 5 [default=false]; + // Identifies if server streams multiple server messages + optional bool server_streaming = 6 [default=false]; +} + + +// =================================================================== +// Options + +// Each of the definitions above may have "options" attached. These are +// just annotations which may cause code to be generated slightly differently +// or may contain hints for code that manipulates protocol messages. +// +// Clients may define custom options as extensions of the *Options messages. +// These extensions may not yet be known at parsing time, so the parser cannot +// store the values in them. Instead it stores them in a field in the *Options +// message called uninterpreted_option. This field must have the same name +// across all *Options messages. We then use this field to populate the +// extensions when we build a descriptor, at which point all protos have been +// parsed and so all extensions are known. +// +// Extension numbers for custom options may be chosen as follows: +// * For options which will only be used within a single application or +// organization, or for experimental options, use field numbers 50000 +// through 99999. It is up to you to ensure that you do not use the +// same number for multiple options. +// * For options which will be published and used publicly by multiple +// independent entities, e-mail protobuf-global-extension-registry@google.com +// to reserve extension numbers. Simply provide your project name (e.g. +// Objective-C plugin) and your project website (if available) -- there's no +// need to explain how you intend to use them. Usually you only need one +// extension number. You can declare multiple options with only one extension +// number by putting them in a sub-message. See the Custom Options section of +// the docs for examples: +// https://developers.google.com/protocol-buffers/docs/proto#options +// If this turns out to be popular, a web service will be set up +// to automatically assign option numbers. + + +message FileOptions { + + // Sets the Java package where classes generated from this .proto will be + // placed. By default, the proto package is used, but this is often + // inappropriate because proto packages do not normally start with backwards + // domain names. + optional string java_package = 1; + + + // If set, all the classes from the .proto file are wrapped in a single + // outer class with the given name. This applies to both Proto1 + // (equivalent to the old "--one_java_file" option) and Proto2 (where + // a .proto always translates to a single class, but you may want to + // explicitly choose the class name). + optional string java_outer_classname = 8; + + // If set true, then the Java code generator will generate a separate .java + // file for each top-level message, enum, and service defined in the .proto + // file. Thus, these types will *not* be nested inside the outer class + // named by java_outer_classname. However, the outer class will still be + // generated to contain the file's getDescriptor() method as well as any + // top-level extensions defined in the file. + optional bool java_multiple_files = 10 [default=false]; + + // This option does nothing. + optional bool java_generate_equals_and_hash = 20 [deprecated=true]; + + // If set true, then the Java2 code generator will generate code that + // throws an exception whenever an attempt is made to assign a non-UTF-8 + // byte sequence to a string field. + // Message reflection will do the same. + // However, an extension field still accepts non-UTF-8 byte sequences. + // This option has no effect on when used with the lite runtime. + optional bool java_string_check_utf8 = 27 [default=false]; + + + // Generated classes can be optimized for speed or code size. + enum OptimizeMode { + SPEED = 1; // Generate complete code for parsing, serialization, + // etc. + CODE_SIZE = 2; // Use ReflectionOps to implement these methods. + LITE_RUNTIME = 3; // Generate code using MessageLite and the lite runtime. + } + optional OptimizeMode optimize_for = 9 [default=SPEED]; + + // Sets the Go package where structs generated from this .proto will be + // placed. If omitted, the Go package will be derived from the following: + // - The basename of the package import path, if provided. + // - Otherwise, the package statement in the .proto file, if present. + // - Otherwise, the basename of the .proto file, without extension. + optional string go_package = 11; + + + + // Should generic services be generated in each language? "Generic" services + // are not specific to any particular RPC system. They are generated by the + // main code generators in each language (without additional plugins). + // Generic services were the only kind of service generation supported by + // early versions of google.protobuf. + // + // Generic services are now considered deprecated in favor of using plugins + // that generate code specific to your particular RPC system. Therefore, + // these default to false. Old code which depends on generic services should + // explicitly set them to true. + optional bool cc_generic_services = 16 [default=false]; + optional bool java_generic_services = 17 [default=false]; + optional bool py_generic_services = 18 [default=false]; + optional bool php_generic_services = 42 [default=false]; + + // Is this file deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for everything in the file, or it will be completely ignored; in the very + // least, this is a formalization for deprecating files. + optional bool deprecated = 23 [default=false]; + + // Enables the use of arenas for the proto messages in this file. This applies + // only to generated classes for C++. + optional bool cc_enable_arenas = 31 [default=false]; + + + // Sets the objective c class prefix which is prepended to all objective c + // generated classes from this .proto. There is no default. + optional string objc_class_prefix = 36; + + // Namespace for generated classes; defaults to the package. + optional string csharp_namespace = 37; + + // By default Swift generators will take the proto package and CamelCase it + // replacing '.' with underscore and use that to prefix the types/symbols + // defined. When this options is provided, they will use this value instead + // to prefix the types/symbols defined. + optional string swift_prefix = 39; + + // Sets the php class prefix which is prepended to all php generated classes + // from this .proto. Default is empty. + optional string php_class_prefix = 40; + + // Use this option to change the namespace of php generated classes. Default + // is empty. When this option is empty, the package name will be used for + // determining the namespace. + optional string php_namespace = 41; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; + + reserved 38; +} + +message MessageOptions { + // Set true to use the old proto1 MessageSet wire format for extensions. + // This is provided for backwards-compatibility with the MessageSet wire + // format. You should not use this for any other reason: It's less + // efficient, has fewer features, and is more complicated. + // + // The message must be defined exactly as follows: + // message Foo { + // option message_set_wire_format = true; + // extensions 4 to max; + // } + // Note that the message cannot have any defined fields; MessageSets only + // have extensions. + // + // All extensions of your type must be singular messages; e.g. they cannot + // be int32s, enums, or repeated messages. + // + // Because this is an option, the above two restrictions are not enforced by + // the protocol compiler. + optional bool message_set_wire_format = 1 [default=false]; + + // Disables the generation of the standard "descriptor()" accessor, which can + // conflict with a field of the same name. This is meant to make migration + // from proto1 easier; new code should avoid fields named "descriptor". + optional bool no_standard_descriptor_accessor = 2 [default=false]; + + // Is this message deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the message, or it will be completely ignored; in the very least, + // this is a formalization for deprecating messages. + optional bool deprecated = 3 [default=false]; + + // Whether the message is an automatically generated map entry type for the + // maps field. + // + // For maps fields: + // map map_field = 1; + // The parsed descriptor looks like: + // message MapFieldEntry { + // option map_entry = true; + // optional KeyType key = 1; + // optional ValueType value = 2; + // } + // repeated MapFieldEntry map_field = 1; + // + // Implementations may choose not to generate the map_entry=true message, but + // use a native map in the target language to hold the keys and values. + // The reflection APIs in such implementions still need to work as + // if the field is a repeated message field. + // + // NOTE: Do not set the option in .proto files. Always use the maps syntax + // instead. The option should only be implicitly set by the proto compiler + // parser. + optional bool map_entry = 7; + + reserved 8; // javalite_serializable + reserved 9; // javanano_as_lite + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message FieldOptions { + // The ctype option instructs the C++ code generator to use a different + // representation of the field than it normally would. See the specific + // options below. This option is not yet implemented in the open source + // release -- sorry, we'll try to include it in a future version! + optional CType ctype = 1 [default = STRING]; + enum CType { + // Default mode. + STRING = 0; + + CORD = 1; + + STRING_PIECE = 2; + } + // The packed option can be enabled for repeated primitive fields to enable + // a more efficient representation on the wire. Rather than repeatedly + // writing the tag and type for each element, the entire array is encoded as + // a single length-delimited blob. In proto3, only explicit setting it to + // false will avoid using packed encoding. + optional bool packed = 2; + + // The jstype option determines the JavaScript type used for values of the + // field. The option is permitted only for 64 bit integral and fixed types + // (int64, uint64, sint64, fixed64, sfixed64). A field with jstype JS_STRING + // is represented as JavaScript string, which avoids loss of precision that + // can happen when a large value is converted to a floating point JavaScript. + // Specifying JS_NUMBER for the jstype causes the generated JavaScript code to + // use the JavaScript "number" type. The behavior of the default option + // JS_NORMAL is implementation dependent. + // + // This option is an enum to permit additional types to be added, e.g. + // goog.math.Integer. + optional JSType jstype = 6 [default = JS_NORMAL]; + enum JSType { + // Use the default type. + JS_NORMAL = 0; + + // Use JavaScript strings. + JS_STRING = 1; + + // Use JavaScript numbers. + JS_NUMBER = 2; + } + + // Should this field be parsed lazily? Lazy applies only to message-type + // fields. It means that when the outer message is initially parsed, the + // inner message's contents will not be parsed but instead stored in encoded + // form. The inner message will actually be parsed when it is first accessed. + // + // This is only a hint. Implementations are free to choose whether to use + // eager or lazy parsing regardless of the value of this option. However, + // setting this option true suggests that the protocol author believes that + // using lazy parsing on this field is worth the additional bookkeeping + // overhead typically needed to implement it. + // + // This option does not affect the public interface of any generated code; + // all method signatures remain the same. Furthermore, thread-safety of the + // interface is not affected by this option; const methods remain safe to + // call from multiple threads concurrently, while non-const methods continue + // to require exclusive access. + // + // + // Note that implementations may choose not to check required fields within + // a lazy sub-message. That is, calling IsInitialized() on the outer message + // may return true even if the inner message has missing required fields. + // This is necessary because otherwise the inner message would have to be + // parsed in order to perform the check, defeating the purpose of lazy + // parsing. An implementation which chooses not to check required fields + // must be consistent about it. That is, for any particular sub-message, the + // implementation must either *always* check its required fields, or *never* + // check its required fields, regardless of whether or not the message has + // been parsed. + optional bool lazy = 5 [default=false]; + + // Is this field deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for accessors, or it will be completely ignored; in the very least, this + // is a formalization for deprecating fields. + optional bool deprecated = 3 [default=false]; + + // For Google-internal migration only. Do not use. + optional bool weak = 10 [default=false]; + + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; + + reserved 4; // removed jtype +} + +message OneofOptions { + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message EnumOptions { + + // Set this option to true to allow mapping different tag names to the same + // value. + optional bool allow_alias = 2; + + // Is this enum deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the enum, or it will be completely ignored; in the very least, this + // is a formalization for deprecating enums. + optional bool deprecated = 3 [default=false]; + + reserved 5; // javanano_as_lite + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message EnumValueOptions { + // Is this enum value deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the enum value, or it will be completely ignored; in the very least, + // this is a formalization for deprecating enum values. + optional bool deprecated = 1 [default=false]; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message ServiceOptions { + + // Note: Field numbers 1 through 32 are reserved for Google's internal RPC + // framework. We apologize for hoarding these numbers to ourselves, but + // we were already using them long before we decided to release Protocol + // Buffers. + + // Is this service deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the service, or it will be completely ignored; in the very least, + // this is a formalization for deprecating services. + optional bool deprecated = 33 [default=false]; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message MethodOptions { + + // Note: Field numbers 1 through 32 are reserved for Google's internal RPC + // framework. We apologize for hoarding these numbers to ourselves, but + // we were already using them long before we decided to release Protocol + // Buffers. + + // Is this method deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the method, or it will be completely ignored; in the very least, + // this is a formalization for deprecating methods. + optional bool deprecated = 33 [default=false]; + + // Is this method side-effect-free (or safe in HTTP parlance), or idempotent, + // or neither? HTTP based RPC implementation may choose GET verb for safe + // methods, and PUT verb for idempotent methods instead of the default POST. + enum IdempotencyLevel { + IDEMPOTENCY_UNKNOWN = 0; + NO_SIDE_EFFECTS = 1; // implies idempotent + IDEMPOTENT = 2; // idempotent, but may have side effects + } + optional IdempotencyLevel idempotency_level = + 34 [default=IDEMPOTENCY_UNKNOWN]; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + + +// A message representing a option the parser does not recognize. This only +// appears in options protos created by the compiler::Parser class. +// DescriptorPool resolves these when building Descriptor objects. Therefore, +// options protos in descriptor objects (e.g. returned by Descriptor::options(), +// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions +// in them. +message UninterpretedOption { + // The name of the uninterpreted option. Each string represents a segment in + // a dot-separated name. is_extension is true iff a segment represents an + // extension (denoted with parentheses in options specs in .proto files). + // E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents + // "foo.(bar.baz).qux". + message NamePart { + required string name_part = 1; + required bool is_extension = 2; + } + repeated NamePart name = 2; + + // The value of the uninterpreted option, in whatever type the tokenizer + // identified it as during parsing. Exactly one of these should be set. + optional string identifier_value = 3; + optional uint64 positive_int_value = 4; + optional int64 negative_int_value = 5; + optional double double_value = 6; + optional bytes string_value = 7; + optional string aggregate_value = 8; +} + +// =================================================================== +// Optional source code info + +// Encapsulates information about the original source file from which a +// FileDescriptorProto was generated. +message SourceCodeInfo { + // A Location identifies a piece of source code in a .proto file which + // corresponds to a particular definition. This information is intended + // to be useful to IDEs, code indexers, documentation generators, and similar + // tools. + // + // For example, say we have a file like: + // message Foo { + // optional string foo = 1; + // } + // Let's look at just the field definition: + // optional string foo = 1; + // ^ ^^ ^^ ^ ^^^ + // a bc de f ghi + // We have the following locations: + // span path represents + // [a,i) [ 4, 0, 2, 0 ] The whole field definition. + // [a,b) [ 4, 0, 2, 0, 4 ] The label (optional). + // [c,d) [ 4, 0, 2, 0, 5 ] The type (string). + // [e,f) [ 4, 0, 2, 0, 1 ] The name (foo). + // [g,h) [ 4, 0, 2, 0, 3 ] The number (1). + // + // Notes: + // - A location may refer to a repeated field itself (i.e. not to any + // particular index within it). This is used whenever a set of elements are + // logically enclosed in a single code segment. For example, an entire + // extend block (possibly containing multiple extension definitions) will + // have an outer location whose path refers to the "extensions" repeated + // field without an index. + // - Multiple locations may have the same path. This happens when a single + // logical declaration is spread out across multiple places. The most + // obvious example is the "extend" block again -- there may be multiple + // extend blocks in the same scope, each of which will have the same path. + // - A location's span is not always a subset of its parent's span. For + // example, the "extendee" of an extension declaration appears at the + // beginning of the "extend" block and is shared by all extensions within + // the block. + // - Just because a location's span is a subset of some other location's span + // does not mean that it is a descendent. For example, a "group" defines + // both a type and a field in a single declaration. Thus, the locations + // corresponding to the type and field and their components will overlap. + // - Code which tries to interpret locations should probably be designed to + // ignore those that it doesn't understand, as more types of locations could + // be recorded in the future. + repeated Location location = 1; + message Location { + // Identifies which part of the FileDescriptorProto was defined at this + // location. + // + // Each element is a field number or an index. They form a path from + // the root FileDescriptorProto to the place where the definition. For + // example, this path: + // [ 4, 3, 2, 7, 1 ] + // refers to: + // file.message_type(3) // 4, 3 + // .field(7) // 2, 7 + // .name() // 1 + // This is because FileDescriptorProto.message_type has field number 4: + // repeated DescriptorProto message_type = 4; + // and DescriptorProto.field has field number 2: + // repeated FieldDescriptorProto field = 2; + // and FieldDescriptorProto.name has field number 1: + // optional string name = 1; + // + // Thus, the above path gives the location of a field name. If we removed + // the last element: + // [ 4, 3, 2, 7 ] + // this path refers to the whole field declaration (from the beginning + // of the label to the terminating semicolon). + repeated int32 path = 1 [packed=true]; + + // Always has exactly three or four elements: start line, start column, + // end line (optional, otherwise assumed same as start line), end column. + // These are packed into a single field for efficiency. Note that line + // and column numbers are zero-based -- typically you will want to add + // 1 to each before displaying to a user. + repeated int32 span = 2 [packed=true]; + + // If this SourceCodeInfo represents a complete declaration, these are any + // comments appearing before and after the declaration which appear to be + // attached to the declaration. + // + // A series of line comments appearing on consecutive lines, with no other + // tokens appearing on those lines, will be treated as a single comment. + // + // leading_detached_comments will keep paragraphs of comments that appear + // before (but not connected to) the current element. Each paragraph, + // separated by empty lines, will be one comment element in the repeated + // field. + // + // Only the comment content is provided; comment markers (e.g. //) are + // stripped out. For block comments, leading whitespace and an asterisk + // will be stripped from the beginning of each line other than the first. + // Newlines are included in the output. + // + // Examples: + // + // optional int32 foo = 1; // Comment attached to foo. + // // Comment attached to bar. + // optional int32 bar = 2; + // + // optional string baz = 3; + // // Comment attached to baz. + // // Another line attached to baz. + // + // // Comment attached to qux. + // // + // // Another line attached to qux. + // optional double qux = 4; + // + // // Detached comment for corge. This is not leading or trailing comments + // // to qux or corge because there are blank lines separating it from + // // both. + // + // // Detached comment for corge paragraph 2. + // + // optional string corge = 5; + // /* Block comment attached + // * to corge. Leading asterisks + // * will be removed. */ + // /* Block comment attached to + // * grault. */ + // optional int32 grault = 6; + // + // // ignored detached comments. + optional string leading_comments = 3; + optional string trailing_comments = 4; + repeated string leading_detached_comments = 6; + } +} + +// Describes the relationship between generated code and its original source +// file. A GeneratedCodeInfo message is associated with only one generated +// source file, but may contain references to different source .proto files. +message GeneratedCodeInfo { + // An Annotation connects some span of text in generated code to an element + // of its generating .proto file. + repeated Annotation annotation = 1; + message Annotation { + // Identifies the element in the original source .proto file. This field + // is formatted the same as SourceCodeInfo.Location.path. + repeated int32 path = 1 [packed=true]; + + // Identifies the filesystem path to the original source .proto. + optional string source_file = 2; + + // Identifies the starting offset in bytes in the generated code + // that relates to the identified object. + optional int32 begin = 3; + + // Identifies the ending offset in bytes in the generated code that + // relates to the identified offset. The end offset should be one past + // the last relevant byte (so the length of the text = end - begin). + optional int32 end = 4; + } +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/doc.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/doc.go new file mode 100644 index 0000000..0d6055d --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/doc.go @@ -0,0 +1,51 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +/* + A plugin for the Google protocol buffer compiler to generate Go code. + Run it by building this program and putting it in your path with the name + protoc-gen-go + That word 'go' at the end becomes part of the option string set for the + protocol compiler, so once the protocol compiler (protoc) is installed + you can run + protoc --go_out=output_directory input_directory/file.proto + to generate Go bindings for the protocol defined by file.proto. + With that input, the output will be written to + output_directory/file.pb.go + + The generated code is documented in the package comment for + the library. + + See the README and documentation for protocol buffers to learn more: + https://developers.google.com/protocol-buffers/ + +*/ +package documentation diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/generator/Makefile b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/generator/Makefile new file mode 100644 index 0000000..b5715c3 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/generator/Makefile @@ -0,0 +1,40 @@ +# Go support for Protocol Buffers - Google's data interchange format +# +# Copyright 2010 The Go Authors. All rights reserved. +# https://github.com/golang/protobuf +# +# 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. + +include $(GOROOT)/src/Make.inc + +TARG=github.com/golang/protobuf/compiler/generator +GOFILES=\ + generator.go\ + +DEPS=../descriptor ../plugin ../../proto + +include $(GOROOT)/src/Make.pkg diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/generator/generator.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/generator/generator.go new file mode 100644 index 0000000..60d5246 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/generator/generator.go @@ -0,0 +1,2866 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +/* + The code generator for the plugin for the Google protocol buffer compiler. + It generates Go code from the protocol buffer description files read by the + main routine. +*/ +package generator + +import ( + "bufio" + "bytes" + "compress/gzip" + "fmt" + "go/parser" + "go/printer" + "go/token" + "log" + "os" + "path" + "strconv" + "strings" + "unicode" + "unicode/utf8" + + "github.com/golang/protobuf/proto" + + "github.com/golang/protobuf/protoc-gen-go/descriptor" + plugin "github.com/golang/protobuf/protoc-gen-go/plugin" +) + +// generatedCodeVersion indicates a version of the generated code. +// It is incremented whenever an incompatibility between the generated code and +// proto package is introduced; the generated code references +// a constant, proto.ProtoPackageIsVersionN (where N is generatedCodeVersion). +const generatedCodeVersion = 2 + +// A Plugin provides functionality to add to the output during Go code generation, +// such as to produce RPC stubs. +type Plugin interface { + // Name identifies the plugin. + Name() string + // Init is called once after data structures are built but before + // code generation begins. + Init(g *Generator) + // Generate produces the code generated by the plugin for this file, + // except for the imports, by calling the generator's methods P, In, and Out. + Generate(file *FileDescriptor) + // GenerateImports produces the import declarations for this file. + // It is called after Generate. + GenerateImports(file *FileDescriptor) +} + +var plugins []Plugin + +// RegisterPlugin installs a (second-order) plugin to be run when the Go output is generated. +// It is typically called during initialization. +func RegisterPlugin(p Plugin) { + plugins = append(plugins, p) +} + +// Each type we import as a protocol buffer (other than FileDescriptorProto) needs +// a pointer to the FileDescriptorProto that represents it. These types achieve that +// wrapping by placing each Proto inside a struct with the pointer to its File. The +// structs have the same names as their contents, with "Proto" removed. +// FileDescriptor is used to store the things that it points to. + +// The file and package name method are common to messages and enums. +type common struct { + file *descriptor.FileDescriptorProto // File this object comes from. +} + +// PackageName is name in the package clause in the generated file. +func (c *common) PackageName() string { return uniquePackageOf(c.file) } + +func (c *common) File() *descriptor.FileDescriptorProto { return c.file } + +func fileIsProto3(file *descriptor.FileDescriptorProto) bool { + return file.GetSyntax() == "proto3" +} + +func (c *common) proto3() bool { return fileIsProto3(c.file) } + +// Descriptor represents a protocol buffer message. +type Descriptor struct { + common + *descriptor.DescriptorProto + parent *Descriptor // The containing message, if any. + nested []*Descriptor // Inner messages, if any. + enums []*EnumDescriptor // Inner enums, if any. + ext []*ExtensionDescriptor // Extensions, if any. + typename []string // Cached typename vector. + index int // The index into the container, whether the file or another message. + path string // The SourceCodeInfo path as comma-separated integers. + group bool +} + +// TypeName returns the elements of the dotted type name. +// The package name is not part of this name. +func (d *Descriptor) TypeName() []string { + if d.typename != nil { + return d.typename + } + n := 0 + for parent := d; parent != nil; parent = parent.parent { + n++ + } + s := make([]string, n, n) + for parent := d; parent != nil; parent = parent.parent { + n-- + s[n] = parent.GetName() + } + d.typename = s + return s +} + +// EnumDescriptor describes an enum. If it's at top level, its parent will be nil. +// Otherwise it will be the descriptor of the message in which it is defined. +type EnumDescriptor struct { + common + *descriptor.EnumDescriptorProto + parent *Descriptor // The containing message, if any. + typename []string // Cached typename vector. + index int // The index into the container, whether the file or a message. + path string // The SourceCodeInfo path as comma-separated integers. +} + +// TypeName returns the elements of the dotted type name. +// The package name is not part of this name. +func (e *EnumDescriptor) TypeName() (s []string) { + if e.typename != nil { + return e.typename + } + name := e.GetName() + if e.parent == nil { + s = make([]string, 1) + } else { + pname := e.parent.TypeName() + s = make([]string, len(pname)+1) + copy(s, pname) + } + s[len(s)-1] = name + e.typename = s + return s +} + +// Everything but the last element of the full type name, CamelCased. +// The values of type Foo.Bar are call Foo_value1... not Foo_Bar_value1... . +func (e *EnumDescriptor) prefix() string { + if e.parent == nil { + // If the enum is not part of a message, the prefix is just the type name. + return CamelCase(*e.Name) + "_" + } + typeName := e.TypeName() + return CamelCaseSlice(typeName[0:len(typeName)-1]) + "_" +} + +// The integer value of the named constant in this enumerated type. +func (e *EnumDescriptor) integerValueAsString(name string) string { + for _, c := range e.Value { + if c.GetName() == name { + return fmt.Sprint(c.GetNumber()) + } + } + log.Fatal("cannot find value for enum constant") + return "" +} + +// ExtensionDescriptor describes an extension. If it's at top level, its parent will be nil. +// Otherwise it will be the descriptor of the message in which it is defined. +type ExtensionDescriptor struct { + common + *descriptor.FieldDescriptorProto + parent *Descriptor // The containing message, if any. +} + +// TypeName returns the elements of the dotted type name. +// The package name is not part of this name. +func (e *ExtensionDescriptor) TypeName() (s []string) { + name := e.GetName() + if e.parent == nil { + // top-level extension + s = make([]string, 1) + } else { + pname := e.parent.TypeName() + s = make([]string, len(pname)+1) + copy(s, pname) + } + s[len(s)-1] = name + return s +} + +// DescName returns the variable name used for the generated descriptor. +func (e *ExtensionDescriptor) DescName() string { + // The full type name. + typeName := e.TypeName() + // Each scope of the extension is individually CamelCased, and all are joined with "_" with an "E_" prefix. + for i, s := range typeName { + typeName[i] = CamelCase(s) + } + return "E_" + strings.Join(typeName, "_") +} + +// ImportedDescriptor describes a type that has been publicly imported from another file. +type ImportedDescriptor struct { + common + o Object +} + +func (id *ImportedDescriptor) TypeName() []string { return id.o.TypeName() } + +// FileDescriptor describes an protocol buffer descriptor file (.proto). +// It includes slices of all the messages and enums defined within it. +// Those slices are constructed by WrapTypes. +type FileDescriptor struct { + *descriptor.FileDescriptorProto + desc []*Descriptor // All the messages defined in this file. + enum []*EnumDescriptor // All the enums defined in this file. + ext []*ExtensionDescriptor // All the top-level extensions defined in this file. + imp []*ImportedDescriptor // All types defined in files publicly imported by this file. + + // Comments, stored as a map of path (comma-separated integers) to the comment. + comments map[string]*descriptor.SourceCodeInfo_Location + + // The full list of symbols that are exported, + // as a map from the exported object to its symbols. + // This is used for supporting public imports. + exported map[Object][]symbol + + index int // The index of this file in the list of files to generate code for + + proto3 bool // whether to generate proto3 code for this file +} + +// PackageName is the package name we'll use in the generated code to refer to this file. +func (d *FileDescriptor) PackageName() string { return uniquePackageOf(d.FileDescriptorProto) } + +// VarName is the variable name we'll use in the generated code to refer +// to the compressed bytes of this descriptor. It is not exported, so +// it is only valid inside the generated package. +func (d *FileDescriptor) VarName() string { return fmt.Sprintf("fileDescriptor%d", d.index) } + +// goPackageOption interprets the file's go_package option. +// If there is no go_package, it returns ("", "", false). +// If there's a simple name, it returns ("", pkg, true). +// If the option implies an import path, it returns (impPath, pkg, true). +func (d *FileDescriptor) goPackageOption() (impPath, pkg string, ok bool) { + pkg = d.GetOptions().GetGoPackage() + if pkg == "" { + return + } + ok = true + // The presence of a slash implies there's an import path. + slash := strings.LastIndex(pkg, "/") + if slash < 0 { + return + } + impPath, pkg = pkg, pkg[slash+1:] + // A semicolon-delimited suffix overrides the package name. + sc := strings.IndexByte(impPath, ';') + if sc < 0 { + return + } + impPath, pkg = impPath[:sc], impPath[sc+1:] + return +} + +// goPackageName returns the Go package name to use in the +// generated Go file. The result explicit reports whether the name +// came from an option go_package statement. If explicit is false, +// the name was derived from the protocol buffer's package statement +// or the input file name. +func (d *FileDescriptor) goPackageName() (name string, explicit bool) { + // Does the file have a "go_package" option? + if _, pkg, ok := d.goPackageOption(); ok { + return pkg, true + } + + // Does the file have a package clause? + if pkg := d.GetPackage(); pkg != "" { + return pkg, false + } + // Use the file base name. + return baseName(d.GetName()), false +} + +// goFileName returns the output name for the generated Go file. +func (d *FileDescriptor) goFileName() string { + name := *d.Name + if ext := path.Ext(name); ext == ".proto" || ext == ".protodevel" { + name = name[:len(name)-len(ext)] + } + name += ".pb.go" + + // Does the file have a "go_package" option? + // If it does, it may override the filename. + if impPath, _, ok := d.goPackageOption(); ok && impPath != "" { + // Replace the existing dirname with the declared import path. + _, name = path.Split(name) + name = path.Join(impPath, name) + return name + } + + return name +} + +func (d *FileDescriptor) addExport(obj Object, sym symbol) { + d.exported[obj] = append(d.exported[obj], sym) +} + +// symbol is an interface representing an exported Go symbol. +type symbol interface { + // GenerateAlias should generate an appropriate alias + // for the symbol from the named package. + GenerateAlias(g *Generator, pkg string) +} + +type messageSymbol struct { + sym string + hasExtensions, isMessageSet bool + hasOneof bool + getters []getterSymbol +} + +type getterSymbol struct { + name string + typ string + typeName string // canonical name in proto world; empty for proto.Message and similar + genType bool // whether typ contains a generated type (message/group/enum) +} + +func (ms *messageSymbol) GenerateAlias(g *Generator, pkg string) { + remoteSym := pkg + "." + ms.sym + + g.P("type ", ms.sym, " ", remoteSym) + g.P("func (m *", ms.sym, ") Reset() { (*", remoteSym, ")(m).Reset() }") + g.P("func (m *", ms.sym, ") String() string { return (*", remoteSym, ")(m).String() }") + g.P("func (*", ms.sym, ") ProtoMessage() {}") + if ms.hasExtensions { + g.P("func (*", ms.sym, ") ExtensionRangeArray() []", g.Pkg["proto"], ".ExtensionRange ", + "{ return (*", remoteSym, ")(nil).ExtensionRangeArray() }") + if ms.isMessageSet { + g.P("func (m *", ms.sym, ") Marshal() ([]byte, error) ", + "{ return (*", remoteSym, ")(m).Marshal() }") + g.P("func (m *", ms.sym, ") Unmarshal(buf []byte) error ", + "{ return (*", remoteSym, ")(m).Unmarshal(buf) }") + } + } + if ms.hasOneof { + // Oneofs and public imports do not mix well. + // We can make them work okay for the binary format, + // but they're going to break weirdly for text/JSON. + enc := "_" + ms.sym + "_OneofMarshaler" + dec := "_" + ms.sym + "_OneofUnmarshaler" + size := "_" + ms.sym + "_OneofSizer" + encSig := "(msg " + g.Pkg["proto"] + ".Message, b *" + g.Pkg["proto"] + ".Buffer) error" + decSig := "(msg " + g.Pkg["proto"] + ".Message, tag, wire int, b *" + g.Pkg["proto"] + ".Buffer) (bool, error)" + sizeSig := "(msg " + g.Pkg["proto"] + ".Message) int" + g.P("func (m *", ms.sym, ") XXX_OneofFuncs() (func", encSig, ", func", decSig, ", func", sizeSig, ", []interface{}) {") + g.P("return ", enc, ", ", dec, ", ", size, ", nil") + g.P("}") + + g.P("func ", enc, encSig, " {") + g.P("m := msg.(*", ms.sym, ")") + g.P("m0 := (*", remoteSym, ")(m)") + g.P("enc, _, _, _ := m0.XXX_OneofFuncs()") + g.P("return enc(m0, b)") + g.P("}") + + g.P("func ", dec, decSig, " {") + g.P("m := msg.(*", ms.sym, ")") + g.P("m0 := (*", remoteSym, ")(m)") + g.P("_, dec, _, _ := m0.XXX_OneofFuncs()") + g.P("return dec(m0, tag, wire, b)") + g.P("}") + + g.P("func ", size, sizeSig, " {") + g.P("m := msg.(*", ms.sym, ")") + g.P("m0 := (*", remoteSym, ")(m)") + g.P("_, _, size, _ := m0.XXX_OneofFuncs()") + g.P("return size(m0)") + g.P("}") + } + for _, get := range ms.getters { + + if get.typeName != "" { + g.RecordTypeUse(get.typeName) + } + typ := get.typ + val := "(*" + remoteSym + ")(m)." + get.name + "()" + if get.genType { + // typ will be "*pkg.T" (message/group) or "pkg.T" (enum) + // or "map[t]*pkg.T" (map to message/enum). + // The first two of those might have a "[]" prefix if it is repeated. + // Drop any package qualifier since we have hoisted the type into this package. + rep := strings.HasPrefix(typ, "[]") + if rep { + typ = typ[2:] + } + isMap := strings.HasPrefix(typ, "map[") + star := typ[0] == '*' + if !isMap { // map types handled lower down + typ = typ[strings.Index(typ, ".")+1:] + } + if star { + typ = "*" + typ + } + if rep { + // Go does not permit conversion between slice types where both + // element types are named. That means we need to generate a bit + // of code in this situation. + // typ is the element type. + // val is the expression to get the slice from the imported type. + + ctyp := typ // conversion type expression; "Foo" or "(*Foo)" + if star { + ctyp = "(" + typ + ")" + } + + g.P("func (m *", ms.sym, ") ", get.name, "() []", typ, " {") + g.In() + g.P("o := ", val) + g.P("if o == nil {") + g.In() + g.P("return nil") + g.Out() + g.P("}") + g.P("s := make([]", typ, ", len(o))") + g.P("for i, x := range o {") + g.In() + g.P("s[i] = ", ctyp, "(x)") + g.Out() + g.P("}") + g.P("return s") + g.Out() + g.P("}") + continue + } + if isMap { + // Split map[keyTyp]valTyp. + bra, ket := strings.Index(typ, "["), strings.Index(typ, "]") + keyTyp, valTyp := typ[bra+1:ket], typ[ket+1:] + // Drop any package qualifier. + // Only the value type may be foreign. + star := valTyp[0] == '*' + valTyp = valTyp[strings.Index(valTyp, ".")+1:] + if star { + valTyp = "*" + valTyp + } + + typ := "map[" + keyTyp + "]" + valTyp + g.P("func (m *", ms.sym, ") ", get.name, "() ", typ, " {") + g.P("o := ", val) + g.P("if o == nil { return nil }") + g.P("s := make(", typ, ", len(o))") + g.P("for k, v := range o {") + g.P("s[k] = (", valTyp, ")(v)") + g.P("}") + g.P("return s") + g.P("}") + continue + } + // Convert imported type into the forwarding type. + val = "(" + typ + ")(" + val + ")" + } + + g.P("func (m *", ms.sym, ") ", get.name, "() ", typ, " { return ", val, " }") + } + +} + +type enumSymbol struct { + name string + proto3 bool // Whether this came from a proto3 file. +} + +func (es enumSymbol) GenerateAlias(g *Generator, pkg string) { + s := es.name + g.P("type ", s, " ", pkg, ".", s) + g.P("var ", s, "_name = ", pkg, ".", s, "_name") + g.P("var ", s, "_value = ", pkg, ".", s, "_value") + g.P("func (x ", s, ") String() string { return (", pkg, ".", s, ")(x).String() }") + if !es.proto3 { + g.P("func (x ", s, ") Enum() *", s, "{ return (*", s, ")((", pkg, ".", s, ")(x).Enum()) }") + g.P("func (x *", s, ") UnmarshalJSON(data []byte) error { return (*", pkg, ".", s, ")(x).UnmarshalJSON(data) }") + } +} + +type constOrVarSymbol struct { + sym string + typ string // either "const" or "var" + cast string // if non-empty, a type cast is required (used for enums) +} + +func (cs constOrVarSymbol) GenerateAlias(g *Generator, pkg string) { + v := pkg + "." + cs.sym + if cs.cast != "" { + v = cs.cast + "(" + v + ")" + } + g.P(cs.typ, " ", cs.sym, " = ", v) +} + +// Object is an interface abstracting the abilities shared by enums, messages, extensions and imported objects. +type Object interface { + PackageName() string // The name we use in our output (a_b_c), possibly renamed for uniqueness. + TypeName() []string + File() *descriptor.FileDescriptorProto +} + +// Each package name we generate must be unique. The package we're generating +// gets its own name but every other package must have a unique name that does +// not conflict in the code we generate. These names are chosen globally (although +// they don't have to be, it simplifies things to do them globally). +func uniquePackageOf(fd *descriptor.FileDescriptorProto) string { + s, ok := uniquePackageName[fd] + if !ok { + log.Fatal("internal error: no package name defined for " + fd.GetName()) + } + return s +} + +// Generator is the type whose methods generate the output, stored in the associated response structure. +type Generator struct { + *bytes.Buffer + + Request *plugin.CodeGeneratorRequest // The input. + Response *plugin.CodeGeneratorResponse // The output. + + Param map[string]string // Command-line parameters. + PackageImportPath string // Go import path of the package we're generating code for + ImportPrefix string // String to prefix to imported package file names. + ImportMap map[string]string // Mapping from .proto file name to import path + + Pkg map[string]string // The names under which we import support packages + + packageName string // What we're calling ourselves. + allFiles []*FileDescriptor // All files in the tree + allFilesByName map[string]*FileDescriptor // All files by filename. + genFiles []*FileDescriptor // Those files we will generate output for. + file *FileDescriptor // The file we are compiling now. + usedPackages map[string]bool // Names of packages used in current file. + typeNameToObject map[string]Object // Key is a fully-qualified name in input syntax. + init []string // Lines to emit in the init function. + indent string + writeOutput bool +} + +// New creates a new generator and allocates the request and response protobufs. +func New() *Generator { + g := new(Generator) + g.Buffer = new(bytes.Buffer) + g.Request = new(plugin.CodeGeneratorRequest) + g.Response = new(plugin.CodeGeneratorResponse) + return g +} + +// Error reports a problem, including an error, and exits the program. +func (g *Generator) Error(err error, msgs ...string) { + s := strings.Join(msgs, " ") + ":" + err.Error() + log.Print("protoc-gen-go: error:", s) + os.Exit(1) +} + +// Fail reports a problem and exits the program. +func (g *Generator) Fail(msgs ...string) { + s := strings.Join(msgs, " ") + log.Print("protoc-gen-go: error:", s) + os.Exit(1) +} + +// CommandLineParameters breaks the comma-separated list of key=value pairs +// in the parameter (a member of the request protobuf) into a key/value map. +// It then sets file name mappings defined by those entries. +func (g *Generator) CommandLineParameters(parameter string) { + g.Param = make(map[string]string) + for _, p := range strings.Split(parameter, ",") { + if i := strings.Index(p, "="); i < 0 { + g.Param[p] = "" + } else { + g.Param[p[0:i]] = p[i+1:] + } + } + + g.ImportMap = make(map[string]string) + pluginList := "none" // Default list of plugin names to enable (empty means all). + for k, v := range g.Param { + switch k { + case "import_prefix": + g.ImportPrefix = v + case "import_path": + g.PackageImportPath = v + case "plugins": + pluginList = v + default: + if len(k) > 0 && k[0] == 'M' { + g.ImportMap[k[1:]] = v + } + } + } + if pluginList != "" { + // Amend the set of plugins. + enabled := make(map[string]bool) + for _, name := range strings.Split(pluginList, "+") { + enabled[name] = true + } + var nplugins []Plugin + for _, p := range plugins { + if enabled[p.Name()] { + nplugins = append(nplugins, p) + } + } + plugins = nplugins + } +} + +// DefaultPackageName returns the package name printed for the object. +// If its file is in a different package, it returns the package name we're using for this file, plus ".". +// Otherwise it returns the empty string. +func (g *Generator) DefaultPackageName(obj Object) string { + pkg := obj.PackageName() + if pkg == g.packageName { + return "" + } + return pkg + "." +} + +// For each input file, the unique package name to use, underscored. +var uniquePackageName = make(map[*descriptor.FileDescriptorProto]string) + +// Package names already registered. Key is the name from the .proto file; +// value is the name that appears in the generated code. +var pkgNamesInUse = make(map[string]bool) + +// Create and remember a guaranteed unique package name for this file descriptor. +// Pkg is the candidate name. If f is nil, it's a builtin package like "proto" and +// has no file descriptor. +func RegisterUniquePackageName(pkg string, f *FileDescriptor) string { + // Convert dots to underscores before finding a unique alias. + pkg = strings.Map(badToUnderscore, pkg) + + for i, orig := 1, pkg; pkgNamesInUse[pkg]; i++ { + // It's a duplicate; must rename. + pkg = orig + strconv.Itoa(i) + } + // Install it. + pkgNamesInUse[pkg] = true + if f != nil { + uniquePackageName[f.FileDescriptorProto] = pkg + } + return pkg +} + +var isGoKeyword = map[string]bool{ + "break": true, + "case": true, + "chan": true, + "const": true, + "continue": true, + "default": true, + "else": true, + "defer": true, + "fallthrough": true, + "for": true, + "func": true, + "go": true, + "goto": true, + "if": true, + "import": true, + "interface": true, + "map": true, + "package": true, + "range": true, + "return": true, + "select": true, + "struct": true, + "switch": true, + "type": true, + "var": true, +} + +// defaultGoPackage returns the package name to use, +// derived from the import path of the package we're building code for. +func (g *Generator) defaultGoPackage() string { + p := g.PackageImportPath + if i := strings.LastIndex(p, "/"); i >= 0 { + p = p[i+1:] + } + if p == "" { + return "" + } + + p = strings.Map(badToUnderscore, p) + // Identifier must not be keyword: insert _. + if isGoKeyword[p] { + p = "_" + p + } + // Identifier must not begin with digit: insert _. + if r, _ := utf8.DecodeRuneInString(p); unicode.IsDigit(r) { + p = "_" + p + } + return p +} + +// SetPackageNames sets the package name for this run. +// The package name must agree across all files being generated. +// It also defines unique package names for all imported files. +func (g *Generator) SetPackageNames() { + // Register the name for this package. It will be the first name + // registered so is guaranteed to be unmodified. + pkg, explicit := g.genFiles[0].goPackageName() + + // Check all files for an explicit go_package option. + for _, f := range g.genFiles { + thisPkg, thisExplicit := f.goPackageName() + if thisExplicit { + if !explicit { + // Let this file's go_package option serve for all input files. + pkg, explicit = thisPkg, true + } else if thisPkg != pkg { + g.Fail("inconsistent package names:", thisPkg, pkg) + } + } + } + + // If we don't have an explicit go_package option but we have an + // import path, use that. + if !explicit { + p := g.defaultGoPackage() + if p != "" { + pkg, explicit = p, true + } + } + + // If there was no go_package and no import path to use, + // double-check that all the inputs have the same implicit + // Go package name. + if !explicit { + for _, f := range g.genFiles { + thisPkg, _ := f.goPackageName() + if thisPkg != pkg { + g.Fail("inconsistent package names:", thisPkg, pkg) + } + } + } + + g.packageName = RegisterUniquePackageName(pkg, g.genFiles[0]) + + // Register the support package names. They might collide with the + // name of a package we import. + g.Pkg = map[string]string{ + "fmt": RegisterUniquePackageName("fmt", nil), + "math": RegisterUniquePackageName("math", nil), + "proto": RegisterUniquePackageName("proto", nil), + } + +AllFiles: + for _, f := range g.allFiles { + for _, genf := range g.genFiles { + if f == genf { + // In this package already. + uniquePackageName[f.FileDescriptorProto] = g.packageName + continue AllFiles + } + } + // The file is a dependency, so we want to ignore its go_package option + // because that is only relevant for its specific generated output. + pkg := f.GetPackage() + if pkg == "" { + pkg = baseName(*f.Name) + } + RegisterUniquePackageName(pkg, f) + } +} + +// WrapTypes walks the incoming data, wrapping DescriptorProtos, EnumDescriptorProtos +// and FileDescriptorProtos into file-referenced objects within the Generator. +// It also creates the list of files to generate and so should be called before GenerateAllFiles. +func (g *Generator) WrapTypes() { + g.allFiles = make([]*FileDescriptor, 0, len(g.Request.ProtoFile)) + g.allFilesByName = make(map[string]*FileDescriptor, len(g.allFiles)) + for _, f := range g.Request.ProtoFile { + // We must wrap the descriptors before we wrap the enums + descs := wrapDescriptors(f) + g.buildNestedDescriptors(descs) + enums := wrapEnumDescriptors(f, descs) + g.buildNestedEnums(descs, enums) + exts := wrapExtensions(f) + fd := &FileDescriptor{ + FileDescriptorProto: f, + desc: descs, + enum: enums, + ext: exts, + exported: make(map[Object][]symbol), + proto3: fileIsProto3(f), + } + extractComments(fd) + g.allFiles = append(g.allFiles, fd) + g.allFilesByName[f.GetName()] = fd + } + for _, fd := range g.allFiles { + fd.imp = wrapImported(fd.FileDescriptorProto, g) + } + + g.genFiles = make([]*FileDescriptor, 0, len(g.Request.FileToGenerate)) + for _, fileName := range g.Request.FileToGenerate { + fd := g.allFilesByName[fileName] + if fd == nil { + g.Fail("could not find file named", fileName) + } + fd.index = len(g.genFiles) + g.genFiles = append(g.genFiles, fd) + } +} + +// Scan the descriptors in this file. For each one, build the slice of nested descriptors +func (g *Generator) buildNestedDescriptors(descs []*Descriptor) { + for _, desc := range descs { + if len(desc.NestedType) != 0 { + for _, nest := range descs { + if nest.parent == desc { + desc.nested = append(desc.nested, nest) + } + } + if len(desc.nested) != len(desc.NestedType) { + g.Fail("internal error: nesting failure for", desc.GetName()) + } + } + } +} + +func (g *Generator) buildNestedEnums(descs []*Descriptor, enums []*EnumDescriptor) { + for _, desc := range descs { + if len(desc.EnumType) != 0 { + for _, enum := range enums { + if enum.parent == desc { + desc.enums = append(desc.enums, enum) + } + } + if len(desc.enums) != len(desc.EnumType) { + g.Fail("internal error: enum nesting failure for", desc.GetName()) + } + } + } +} + +// Construct the Descriptor +func newDescriptor(desc *descriptor.DescriptorProto, parent *Descriptor, file *descriptor.FileDescriptorProto, index int) *Descriptor { + d := &Descriptor{ + common: common{file}, + DescriptorProto: desc, + parent: parent, + index: index, + } + if parent == nil { + d.path = fmt.Sprintf("%d,%d", messagePath, index) + } else { + d.path = fmt.Sprintf("%s,%d,%d", parent.path, messageMessagePath, index) + } + + // The only way to distinguish a group from a message is whether + // the containing message has a TYPE_GROUP field that matches. + if parent != nil { + parts := d.TypeName() + if file.Package != nil { + parts = append([]string{*file.Package}, parts...) + } + exp := "." + strings.Join(parts, ".") + for _, field := range parent.Field { + if field.GetType() == descriptor.FieldDescriptorProto_TYPE_GROUP && field.GetTypeName() == exp { + d.group = true + break + } + } + } + + for _, field := range desc.Extension { + d.ext = append(d.ext, &ExtensionDescriptor{common{file}, field, d}) + } + + return d +} + +// Return a slice of all the Descriptors defined within this file +func wrapDescriptors(file *descriptor.FileDescriptorProto) []*Descriptor { + sl := make([]*Descriptor, 0, len(file.MessageType)+10) + for i, desc := range file.MessageType { + sl = wrapThisDescriptor(sl, desc, nil, file, i) + } + return sl +} + +// Wrap this Descriptor, recursively +func wrapThisDescriptor(sl []*Descriptor, desc *descriptor.DescriptorProto, parent *Descriptor, file *descriptor.FileDescriptorProto, index int) []*Descriptor { + sl = append(sl, newDescriptor(desc, parent, file, index)) + me := sl[len(sl)-1] + for i, nested := range desc.NestedType { + sl = wrapThisDescriptor(sl, nested, me, file, i) + } + return sl +} + +// Construct the EnumDescriptor +func newEnumDescriptor(desc *descriptor.EnumDescriptorProto, parent *Descriptor, file *descriptor.FileDescriptorProto, index int) *EnumDescriptor { + ed := &EnumDescriptor{ + common: common{file}, + EnumDescriptorProto: desc, + parent: parent, + index: index, + } + if parent == nil { + ed.path = fmt.Sprintf("%d,%d", enumPath, index) + } else { + ed.path = fmt.Sprintf("%s,%d,%d", parent.path, messageEnumPath, index) + } + return ed +} + +// Return a slice of all the EnumDescriptors defined within this file +func wrapEnumDescriptors(file *descriptor.FileDescriptorProto, descs []*Descriptor) []*EnumDescriptor { + sl := make([]*EnumDescriptor, 0, len(file.EnumType)+10) + // Top-level enums. + for i, enum := range file.EnumType { + sl = append(sl, newEnumDescriptor(enum, nil, file, i)) + } + // Enums within messages. Enums within embedded messages appear in the outer-most message. + for _, nested := range descs { + for i, enum := range nested.EnumType { + sl = append(sl, newEnumDescriptor(enum, nested, file, i)) + } + } + return sl +} + +// Return a slice of all the top-level ExtensionDescriptors defined within this file. +func wrapExtensions(file *descriptor.FileDescriptorProto) []*ExtensionDescriptor { + var sl []*ExtensionDescriptor + for _, field := range file.Extension { + sl = append(sl, &ExtensionDescriptor{common{file}, field, nil}) + } + return sl +} + +// Return a slice of all the types that are publicly imported into this file. +func wrapImported(file *descriptor.FileDescriptorProto, g *Generator) (sl []*ImportedDescriptor) { + for _, index := range file.PublicDependency { + df := g.fileByName(file.Dependency[index]) + for _, d := range df.desc { + if d.GetOptions().GetMapEntry() { + continue + } + sl = append(sl, &ImportedDescriptor{common{file}, d}) + } + for _, e := range df.enum { + sl = append(sl, &ImportedDescriptor{common{file}, e}) + } + for _, ext := range df.ext { + sl = append(sl, &ImportedDescriptor{common{file}, ext}) + } + } + return +} + +func extractComments(file *FileDescriptor) { + file.comments = make(map[string]*descriptor.SourceCodeInfo_Location) + for _, loc := range file.GetSourceCodeInfo().GetLocation() { + if loc.LeadingComments == nil { + continue + } + var p []string + for _, n := range loc.Path { + p = append(p, strconv.Itoa(int(n))) + } + file.comments[strings.Join(p, ",")] = loc + } +} + +// BuildTypeNameMap builds the map from fully qualified type names to objects. +// The key names for the map come from the input data, which puts a period at the beginning. +// It should be called after SetPackageNames and before GenerateAllFiles. +func (g *Generator) BuildTypeNameMap() { + g.typeNameToObject = make(map[string]Object) + for _, f := range g.allFiles { + // The names in this loop are defined by the proto world, not us, so the + // package name may be empty. If so, the dotted package name of X will + // be ".X"; otherwise it will be ".pkg.X". + dottedPkg := "." + f.GetPackage() + if dottedPkg != "." { + dottedPkg += "." + } + for _, enum := range f.enum { + name := dottedPkg + dottedSlice(enum.TypeName()) + g.typeNameToObject[name] = enum + } + for _, desc := range f.desc { + name := dottedPkg + dottedSlice(desc.TypeName()) + g.typeNameToObject[name] = desc + } + } +} + +// ObjectNamed, given a fully-qualified input type name as it appears in the input data, +// returns the descriptor for the message or enum with that name. +func (g *Generator) ObjectNamed(typeName string) Object { + o, ok := g.typeNameToObject[typeName] + if !ok { + g.Fail("can't find object with type", typeName) + } + + // If the file of this object isn't a direct dependency of the current file, + // or in the current file, then this object has been publicly imported into + // a dependency of the current file. + // We should return the ImportedDescriptor object for it instead. + direct := *o.File().Name == *g.file.Name + if !direct { + for _, dep := range g.file.Dependency { + if *g.fileByName(dep).Name == *o.File().Name { + direct = true + break + } + } + } + if !direct { + found := false + Loop: + for _, dep := range g.file.Dependency { + df := g.fileByName(*g.fileByName(dep).Name) + for _, td := range df.imp { + if td.o == o { + // Found it! + o = td + found = true + break Loop + } + } + } + if !found { + log.Printf("protoc-gen-go: WARNING: failed finding publicly imported dependency for %v, used in %v", typeName, *g.file.Name) + } + } + + return o +} + +// P prints the arguments to the generated output. It handles strings and int32s, plus +// handling indirections because they may be *string, etc. +func (g *Generator) P(str ...interface{}) { + if !g.writeOutput { + return + } + g.WriteString(g.indent) + for _, v := range str { + switch s := v.(type) { + case string: + g.WriteString(s) + case *string: + g.WriteString(*s) + case bool: + fmt.Fprintf(g, "%t", s) + case *bool: + fmt.Fprintf(g, "%t", *s) + case int: + fmt.Fprintf(g, "%d", s) + case *int32: + fmt.Fprintf(g, "%d", *s) + case *int64: + fmt.Fprintf(g, "%d", *s) + case float64: + fmt.Fprintf(g, "%g", s) + case *float64: + fmt.Fprintf(g, "%g", *s) + default: + g.Fail(fmt.Sprintf("unknown type in printer: %T", v)) + } + } + g.WriteByte('\n') +} + +// addInitf stores the given statement to be printed inside the file's init function. +// The statement is given as a format specifier and arguments. +func (g *Generator) addInitf(stmt string, a ...interface{}) { + g.init = append(g.init, fmt.Sprintf(stmt, a...)) +} + +// In Indents the output one tab stop. +func (g *Generator) In() { g.indent += "\t" } + +// Out unindents the output one tab stop. +func (g *Generator) Out() { + if len(g.indent) > 0 { + g.indent = g.indent[1:] + } +} + +// GenerateAllFiles generates the output for all the files we're outputting. +func (g *Generator) GenerateAllFiles() { + // Initialize the plugins + for _, p := range plugins { + p.Init(g) + } + // Generate the output. The generator runs for every file, even the files + // that we don't generate output for, so that we can collate the full list + // of exported symbols to support public imports. + genFileMap := make(map[*FileDescriptor]bool, len(g.genFiles)) + for _, file := range g.genFiles { + genFileMap[file] = true + } + for _, file := range g.allFiles { + g.Reset() + g.writeOutput = genFileMap[file] + g.generate(file) + if !g.writeOutput { + continue + } + g.Response.File = append(g.Response.File, &plugin.CodeGeneratorResponse_File{ + Name: proto.String(file.goFileName()), + Content: proto.String(g.String()), + }) + } +} + +// Run all the plugins associated with the file. +func (g *Generator) runPlugins(file *FileDescriptor) { + for _, p := range plugins { + p.Generate(file) + } +} + +// FileOf return the FileDescriptor for this FileDescriptorProto. +func (g *Generator) FileOf(fd *descriptor.FileDescriptorProto) *FileDescriptor { + for _, file := range g.allFiles { + if file.FileDescriptorProto == fd { + return file + } + } + g.Fail("could not find file in table:", fd.GetName()) + return nil +} + +// Fill the response protocol buffer with the generated output for all the files we're +// supposed to generate. +func (g *Generator) generate(file *FileDescriptor) { + g.file = g.FileOf(file.FileDescriptorProto) + g.usedPackages = make(map[string]bool) + + if g.file.index == 0 { + // For one file in the package, assert version compatibility. + g.P("// This is a compile-time assertion to ensure that this generated file") + g.P("// is compatible with the proto package it is being compiled against.") + g.P("// A compilation error at this line likely means your copy of the") + g.P("// proto package needs to be updated.") + g.P("const _ = ", g.Pkg["proto"], ".ProtoPackageIsVersion", generatedCodeVersion, " // please upgrade the proto package") + g.P() + } + for _, td := range g.file.imp { + g.generateImported(td) + } + for _, enum := range g.file.enum { + g.generateEnum(enum) + } + for _, desc := range g.file.desc { + // Don't generate virtual messages for maps. + if desc.GetOptions().GetMapEntry() { + continue + } + g.generateMessage(desc) + } + for _, ext := range g.file.ext { + g.generateExtension(ext) + } + g.generateInitFunction() + + // Run the plugins before the imports so we know which imports are necessary. + g.runPlugins(file) + + g.generateFileDescriptor(file) + + // Generate header and imports last, though they appear first in the output. + rem := g.Buffer + g.Buffer = new(bytes.Buffer) + g.generateHeader() + g.generateImports() + if !g.writeOutput { + return + } + g.Write(rem.Bytes()) + + // Reformat generated code. + fset := token.NewFileSet() + raw := g.Bytes() + ast, err := parser.ParseFile(fset, "", g, parser.ParseComments) + if err != nil { + // Print out the bad code with line numbers. + // This should never happen in practice, but it can while changing generated code, + // so consider this a debugging aid. + var src bytes.Buffer + s := bufio.NewScanner(bytes.NewReader(raw)) + for line := 1; s.Scan(); line++ { + fmt.Fprintf(&src, "%5d\t%s\n", line, s.Bytes()) + } + g.Fail("bad Go source code was generated:", err.Error(), "\n"+src.String()) + } + g.Reset() + err = (&printer.Config{Mode: printer.TabIndent | printer.UseSpaces, Tabwidth: 8}).Fprint(g, fset, ast) + if err != nil { + g.Fail("generated Go source code could not be reformatted:", err.Error()) + } +} + +// Generate the header, including package definition +func (g *Generator) generateHeader() { + g.P("// Code generated by protoc-gen-go. DO NOT EDIT.") + g.P("// source: ", g.file.Name) + g.P() + + name := g.file.PackageName() + + if g.file.index == 0 { + // Generate package docs for the first file in the package. + g.P("/*") + g.P("Package ", name, " is a generated protocol buffer package.") + g.P() + if loc, ok := g.file.comments[strconv.Itoa(packagePath)]; ok { + // not using g.PrintComments because this is a /* */ comment block. + text := strings.TrimSuffix(loc.GetLeadingComments(), "\n") + for _, line := range strings.Split(text, "\n") { + line = strings.TrimPrefix(line, " ") + // ensure we don't escape from the block comment + line = strings.Replace(line, "*/", "* /", -1) + g.P(line) + } + g.P() + } + var topMsgs []string + g.P("It is generated from these files:") + for _, f := range g.genFiles { + g.P("\t", f.Name) + for _, msg := range f.desc { + if msg.parent != nil { + continue + } + topMsgs = append(topMsgs, CamelCaseSlice(msg.TypeName())) + } + } + g.P() + g.P("It has these top-level messages:") + for _, msg := range topMsgs { + g.P("\t", msg) + } + g.P("*/") + } + + g.P("package ", name) + g.P() +} + +// PrintComments prints any comments from the source .proto file. +// The path is a comma-separated list of integers. +// It returns an indication of whether any comments were printed. +// See descriptor.proto for its format. +func (g *Generator) PrintComments(path string) bool { + if !g.writeOutput { + return false + } + if loc, ok := g.file.comments[path]; ok { + text := strings.TrimSuffix(loc.GetLeadingComments(), "\n") + for _, line := range strings.Split(text, "\n") { + g.P("// ", strings.TrimPrefix(line, " ")) + } + return true + } + return false +} + +func (g *Generator) fileByName(filename string) *FileDescriptor { + return g.allFilesByName[filename] +} + +// weak returns whether the ith import of the current file is a weak import. +func (g *Generator) weak(i int32) bool { + for _, j := range g.file.WeakDependency { + if j == i { + return true + } + } + return false +} + +// Generate the imports +func (g *Generator) generateImports() { + // We almost always need a proto import. Rather than computing when we + // do, which is tricky when there's a plugin, just import it and + // reference it later. The same argument applies to the fmt and math packages. + g.P("import " + g.Pkg["proto"] + " " + strconv.Quote(g.ImportPrefix+"github.com/golang/protobuf/proto")) + g.P("import " + g.Pkg["fmt"] + ` "fmt"`) + g.P("import " + g.Pkg["math"] + ` "math"`) + for i, s := range g.file.Dependency { + fd := g.fileByName(s) + // Do not import our own package. + if fd.PackageName() == g.packageName { + continue + } + filename := fd.goFileName() + // By default, import path is the dirname of the Go filename. + importPath := path.Dir(filename) + if substitution, ok := g.ImportMap[s]; ok { + importPath = substitution + } + importPath = g.ImportPrefix + importPath + // Skip weak imports. + if g.weak(int32(i)) { + g.P("// skipping weak import ", fd.PackageName(), " ", strconv.Quote(importPath)) + continue + } + // We need to import all the dependencies, even if we don't reference them, + // because other code and tools depend on having the full transitive closure + // of protocol buffer types in the binary. + pname := fd.PackageName() + if _, ok := g.usedPackages[pname]; !ok { + pname = "_" + } + g.P("import ", pname, " ", strconv.Quote(importPath)) + } + g.P() + // TODO: may need to worry about uniqueness across plugins + for _, p := range plugins { + p.GenerateImports(g.file) + g.P() + } + g.P("// Reference imports to suppress errors if they are not otherwise used.") + g.P("var _ = ", g.Pkg["proto"], ".Marshal") + g.P("var _ = ", g.Pkg["fmt"], ".Errorf") + g.P("var _ = ", g.Pkg["math"], ".Inf") + g.P() +} + +func (g *Generator) generateImported(id *ImportedDescriptor) { + // Don't generate public import symbols for files that we are generating + // code for, since those symbols will already be in this package. + // We can't simply avoid creating the ImportedDescriptor objects, + // because g.genFiles isn't populated at that stage. + tn := id.TypeName() + sn := tn[len(tn)-1] + df := g.FileOf(id.o.File()) + filename := *df.Name + for _, fd := range g.genFiles { + if *fd.Name == filename { + g.P("// Ignoring public import of ", sn, " from ", filename) + g.P() + return + } + } + g.P("// ", sn, " from public import ", filename) + g.usedPackages[df.PackageName()] = true + + for _, sym := range df.exported[id.o] { + sym.GenerateAlias(g, df.PackageName()) + } + + g.P() +} + +// Generate the enum definitions for this EnumDescriptor. +func (g *Generator) generateEnum(enum *EnumDescriptor) { + // The full type name + typeName := enum.TypeName() + // The full type name, CamelCased. + ccTypeName := CamelCaseSlice(typeName) + ccPrefix := enum.prefix() + + g.PrintComments(enum.path) + g.P("type ", ccTypeName, " int32") + g.file.addExport(enum, enumSymbol{ccTypeName, enum.proto3()}) + g.P("const (") + g.In() + for i, e := range enum.Value { + g.PrintComments(fmt.Sprintf("%s,%d,%d", enum.path, enumValuePath, i)) + + name := ccPrefix + *e.Name + g.P(name, " ", ccTypeName, " = ", e.Number) + g.file.addExport(enum, constOrVarSymbol{name, "const", ccTypeName}) + } + g.Out() + g.P(")") + g.P("var ", ccTypeName, "_name = map[int32]string{") + g.In() + generated := make(map[int32]bool) // avoid duplicate values + for _, e := range enum.Value { + duplicate := "" + if _, present := generated[*e.Number]; present { + duplicate = "// Duplicate value: " + } + g.P(duplicate, e.Number, ": ", strconv.Quote(*e.Name), ",") + generated[*e.Number] = true + } + g.Out() + g.P("}") + g.P("var ", ccTypeName, "_value = map[string]int32{") + g.In() + for _, e := range enum.Value { + g.P(strconv.Quote(*e.Name), ": ", e.Number, ",") + } + g.Out() + g.P("}") + + if !enum.proto3() { + g.P("func (x ", ccTypeName, ") Enum() *", ccTypeName, " {") + g.In() + g.P("p := new(", ccTypeName, ")") + g.P("*p = x") + g.P("return p") + g.Out() + g.P("}") + } + + g.P("func (x ", ccTypeName, ") String() string {") + g.In() + g.P("return ", g.Pkg["proto"], ".EnumName(", ccTypeName, "_name, int32(x))") + g.Out() + g.P("}") + + if !enum.proto3() { + g.P("func (x *", ccTypeName, ") UnmarshalJSON(data []byte) error {") + g.In() + g.P("value, err := ", g.Pkg["proto"], ".UnmarshalJSONEnum(", ccTypeName, `_value, data, "`, ccTypeName, `")`) + g.P("if err != nil {") + g.In() + g.P("return err") + g.Out() + g.P("}") + g.P("*x = ", ccTypeName, "(value)") + g.P("return nil") + g.Out() + g.P("}") + } + + var indexes []string + for m := enum.parent; m != nil; m = m.parent { + // XXX: skip groups? + indexes = append([]string{strconv.Itoa(m.index)}, indexes...) + } + indexes = append(indexes, strconv.Itoa(enum.index)) + g.P("func (", ccTypeName, ") EnumDescriptor() ([]byte, []int) { return ", g.file.VarName(), ", []int{", strings.Join(indexes, ", "), "} }") + if enum.file.GetPackage() == "google.protobuf" && enum.GetName() == "NullValue" { + g.P("func (", ccTypeName, `) XXX_WellKnownType() string { return "`, enum.GetName(), `" }`) + } + + g.P() +} + +// The tag is a string like "varint,2,opt,name=fieldname,def=7" that +// identifies details of the field for the protocol buffer marshaling and unmarshaling +// code. The fields are: +// wire encoding +// protocol tag number +// opt,req,rep for optional, required, or repeated +// packed whether the encoding is "packed" (optional; repeated primitives only) +// name= the original declared name +// enum= the name of the enum type if it is an enum-typed field. +// proto3 if this field is in a proto3 message +// def= string representation of the default value, if any. +// The default value must be in a representation that can be used at run-time +// to generate the default value. Thus bools become 0 and 1, for instance. +func (g *Generator) goTag(message *Descriptor, field *descriptor.FieldDescriptorProto, wiretype string) string { + optrepreq := "" + switch { + case isOptional(field): + optrepreq = "opt" + case isRequired(field): + optrepreq = "req" + case isRepeated(field): + optrepreq = "rep" + } + var defaultValue string + if dv := field.DefaultValue; dv != nil { // set means an explicit default + defaultValue = *dv + // Some types need tweaking. + switch *field.Type { + case descriptor.FieldDescriptorProto_TYPE_BOOL: + if defaultValue == "true" { + defaultValue = "1" + } else { + defaultValue = "0" + } + case descriptor.FieldDescriptorProto_TYPE_STRING, + descriptor.FieldDescriptorProto_TYPE_BYTES: + // Nothing to do. Quoting is done for the whole tag. + case descriptor.FieldDescriptorProto_TYPE_ENUM: + // For enums we need to provide the integer constant. + obj := g.ObjectNamed(field.GetTypeName()) + if id, ok := obj.(*ImportedDescriptor); ok { + // It is an enum that was publicly imported. + // We need the underlying type. + obj = id.o + } + enum, ok := obj.(*EnumDescriptor) + if !ok { + log.Printf("obj is a %T", obj) + if id, ok := obj.(*ImportedDescriptor); ok { + log.Printf("id.o is a %T", id.o) + } + g.Fail("unknown enum type", CamelCaseSlice(obj.TypeName())) + } + defaultValue = enum.integerValueAsString(defaultValue) + } + defaultValue = ",def=" + defaultValue + } + enum := "" + if *field.Type == descriptor.FieldDescriptorProto_TYPE_ENUM { + // We avoid using obj.PackageName(), because we want to use the + // original (proto-world) package name. + obj := g.ObjectNamed(field.GetTypeName()) + if id, ok := obj.(*ImportedDescriptor); ok { + obj = id.o + } + enum = ",enum=" + if pkg := obj.File().GetPackage(); pkg != "" { + enum += pkg + "." + } + enum += CamelCaseSlice(obj.TypeName()) + } + packed := "" + if (field.Options != nil && field.Options.GetPacked()) || + // Per https://developers.google.com/protocol-buffers/docs/proto3#simple: + // "In proto3, repeated fields of scalar numeric types use packed encoding by default." + (message.proto3() && (field.Options == nil || field.Options.Packed == nil) && + isRepeated(field) && isScalar(field)) { + packed = ",packed" + } + fieldName := field.GetName() + name := fieldName + if *field.Type == descriptor.FieldDescriptorProto_TYPE_GROUP { + // We must use the type name for groups instead of + // the field name to preserve capitalization. + // type_name in FieldDescriptorProto is fully-qualified, + // but we only want the local part. + name = *field.TypeName + if i := strings.LastIndex(name, "."); i >= 0 { + name = name[i+1:] + } + } + if json := field.GetJsonName(); json != "" && json != name { + // TODO: escaping might be needed, in which case + // perhaps this should be in its own "json" tag. + name += ",json=" + json + } + name = ",name=" + name + if message.proto3() { + // We only need the extra tag for []byte fields; + // no need to add noise for the others. + if *field.Type == descriptor.FieldDescriptorProto_TYPE_BYTES { + name += ",proto3" + } + + } + oneof := "" + if field.OneofIndex != nil { + oneof = ",oneof" + } + return strconv.Quote(fmt.Sprintf("%s,%d,%s%s%s%s%s%s", + wiretype, + field.GetNumber(), + optrepreq, + packed, + name, + enum, + oneof, + defaultValue)) +} + +func needsStar(typ descriptor.FieldDescriptorProto_Type) bool { + switch typ { + case descriptor.FieldDescriptorProto_TYPE_GROUP: + return false + case descriptor.FieldDescriptorProto_TYPE_MESSAGE: + return false + case descriptor.FieldDescriptorProto_TYPE_BYTES: + return false + } + return true +} + +// TypeName is the printed name appropriate for an item. If the object is in the current file, +// TypeName drops the package name and underscores the rest. +// Otherwise the object is from another package; and the result is the underscored +// package name followed by the item name. +// The result always has an initial capital. +func (g *Generator) TypeName(obj Object) string { + return g.DefaultPackageName(obj) + CamelCaseSlice(obj.TypeName()) +} + +// TypeNameWithPackage is like TypeName, but always includes the package +// name even if the object is in our own package. +func (g *Generator) TypeNameWithPackage(obj Object) string { + return obj.PackageName() + CamelCaseSlice(obj.TypeName()) +} + +// GoType returns a string representing the type name, and the wire type +func (g *Generator) GoType(message *Descriptor, field *descriptor.FieldDescriptorProto) (typ string, wire string) { + // TODO: Options. + switch *field.Type { + case descriptor.FieldDescriptorProto_TYPE_DOUBLE: + typ, wire = "float64", "fixed64" + case descriptor.FieldDescriptorProto_TYPE_FLOAT: + typ, wire = "float32", "fixed32" + case descriptor.FieldDescriptorProto_TYPE_INT64: + typ, wire = "int64", "varint" + case descriptor.FieldDescriptorProto_TYPE_UINT64: + typ, wire = "uint64", "varint" + case descriptor.FieldDescriptorProto_TYPE_INT32: + typ, wire = "int32", "varint" + case descriptor.FieldDescriptorProto_TYPE_UINT32: + typ, wire = "uint32", "varint" + case descriptor.FieldDescriptorProto_TYPE_FIXED64: + typ, wire = "uint64", "fixed64" + case descriptor.FieldDescriptorProto_TYPE_FIXED32: + typ, wire = "uint32", "fixed32" + case descriptor.FieldDescriptorProto_TYPE_BOOL: + typ, wire = "bool", "varint" + case descriptor.FieldDescriptorProto_TYPE_STRING: + typ, wire = "string", "bytes" + case descriptor.FieldDescriptorProto_TYPE_GROUP: + desc := g.ObjectNamed(field.GetTypeName()) + typ, wire = "*"+g.TypeName(desc), "group" + case descriptor.FieldDescriptorProto_TYPE_MESSAGE: + desc := g.ObjectNamed(field.GetTypeName()) + typ, wire = "*"+g.TypeName(desc), "bytes" + case descriptor.FieldDescriptorProto_TYPE_BYTES: + typ, wire = "[]byte", "bytes" + case descriptor.FieldDescriptorProto_TYPE_ENUM: + desc := g.ObjectNamed(field.GetTypeName()) + typ, wire = g.TypeName(desc), "varint" + case descriptor.FieldDescriptorProto_TYPE_SFIXED32: + typ, wire = "int32", "fixed32" + case descriptor.FieldDescriptorProto_TYPE_SFIXED64: + typ, wire = "int64", "fixed64" + case descriptor.FieldDescriptorProto_TYPE_SINT32: + typ, wire = "int32", "zigzag32" + case descriptor.FieldDescriptorProto_TYPE_SINT64: + typ, wire = "int64", "zigzag64" + default: + g.Fail("unknown type for", field.GetName()) + } + if isRepeated(field) { + typ = "[]" + typ + } else if message != nil && message.proto3() { + return + } else if field.OneofIndex != nil && message != nil { + return + } else if needsStar(*field.Type) { + typ = "*" + typ + } + return +} + +func (g *Generator) RecordTypeUse(t string) { + if obj, ok := g.typeNameToObject[t]; ok { + // Call ObjectNamed to get the true object to record the use. + obj = g.ObjectNamed(t) + g.usedPackages[obj.PackageName()] = true + } +} + +// Method names that may be generated. Fields with these names get an +// underscore appended. Any change to this set is a potential incompatible +// API change because it changes generated field names. +var methodNames = [...]string{ + "Reset", + "String", + "ProtoMessage", + "Marshal", + "Unmarshal", + "ExtensionRangeArray", + "ExtensionMap", + "Descriptor", +} + +// Names of messages in the `google.protobuf` package for which +// we will generate XXX_WellKnownType methods. +var wellKnownTypes = map[string]bool{ + "Any": true, + "Duration": true, + "Empty": true, + "Struct": true, + "Timestamp": true, + + "Value": true, + "ListValue": true, + "DoubleValue": true, + "FloatValue": true, + "Int64Value": true, + "UInt64Value": true, + "Int32Value": true, + "UInt32Value": true, + "BoolValue": true, + "StringValue": true, + "BytesValue": true, +} + +// Generate the type and default constant definitions for this Descriptor. +func (g *Generator) generateMessage(message *Descriptor) { + // The full type name + typeName := message.TypeName() + // The full type name, CamelCased. + ccTypeName := CamelCaseSlice(typeName) + + usedNames := make(map[string]bool) + for _, n := range methodNames { + usedNames[n] = true + } + fieldNames := make(map[*descriptor.FieldDescriptorProto]string) + fieldGetterNames := make(map[*descriptor.FieldDescriptorProto]string) + fieldTypes := make(map[*descriptor.FieldDescriptorProto]string) + mapFieldTypes := make(map[*descriptor.FieldDescriptorProto]string) + + oneofFieldName := make(map[int32]string) // indexed by oneof_index field of FieldDescriptorProto + oneofDisc := make(map[int32]string) // name of discriminator method + oneofTypeName := make(map[*descriptor.FieldDescriptorProto]string) // without star + oneofInsertPoints := make(map[int32]int) // oneof_index => offset of g.Buffer + + g.PrintComments(message.path) + g.P("type ", ccTypeName, " struct {") + g.In() + + // allocNames finds a conflict-free variation of the given strings, + // consistently mutating their suffixes. + // It returns the same number of strings. + allocNames := func(ns ...string) []string { + Loop: + for { + for _, n := range ns { + if usedNames[n] { + for i := range ns { + ns[i] += "_" + } + continue Loop + } + } + for _, n := range ns { + usedNames[n] = true + } + return ns + } + } + + for i, field := range message.Field { + // Allocate the getter and the field at the same time so name + // collisions create field/method consistent names. + // TODO: This allocation occurs based on the order of the fields + // in the proto file, meaning that a change in the field + // ordering can change generated Method/Field names. + base := CamelCase(*field.Name) + ns := allocNames(base, "Get"+base) + fieldName, fieldGetterName := ns[0], ns[1] + typename, wiretype := g.GoType(message, field) + jsonName := *field.Name + tag := fmt.Sprintf("protobuf:%s json:%q", g.goTag(message, field, wiretype), jsonName+",omitempty") + + fieldNames[field] = fieldName + fieldGetterNames[field] = fieldGetterName + + oneof := field.OneofIndex != nil + if oneof && oneofFieldName[*field.OneofIndex] == "" { + odp := message.OneofDecl[int(*field.OneofIndex)] + fname := allocNames(CamelCase(odp.GetName()))[0] + + // This is the first field of a oneof we haven't seen before. + // Generate the union field. + com := g.PrintComments(fmt.Sprintf("%s,%d,%d", message.path, messageOneofPath, *field.OneofIndex)) + if com { + g.P("//") + } + g.P("// Types that are valid to be assigned to ", fname, ":") + // Generate the rest of this comment later, + // when we've computed any disambiguation. + oneofInsertPoints[*field.OneofIndex] = g.Buffer.Len() + + dname := "is" + ccTypeName + "_" + fname + oneofFieldName[*field.OneofIndex] = fname + oneofDisc[*field.OneofIndex] = dname + tag := `protobuf_oneof:"` + odp.GetName() + `"` + g.P(fname, " ", dname, " `", tag, "`") + } + + if *field.Type == descriptor.FieldDescriptorProto_TYPE_MESSAGE { + desc := g.ObjectNamed(field.GetTypeName()) + if d, ok := desc.(*Descriptor); ok && d.GetOptions().GetMapEntry() { + // Figure out the Go types and tags for the key and value types. + keyField, valField := d.Field[0], d.Field[1] + keyType, keyWire := g.GoType(d, keyField) + valType, valWire := g.GoType(d, valField) + keyTag, valTag := g.goTag(d, keyField, keyWire), g.goTag(d, valField, valWire) + + // We don't use stars, except for message-typed values. + // Message and enum types are the only two possibly foreign types used in maps, + // so record their use. They are not permitted as map keys. + keyType = strings.TrimPrefix(keyType, "*") + switch *valField.Type { + case descriptor.FieldDescriptorProto_TYPE_ENUM: + valType = strings.TrimPrefix(valType, "*") + g.RecordTypeUse(valField.GetTypeName()) + case descriptor.FieldDescriptorProto_TYPE_MESSAGE: + g.RecordTypeUse(valField.GetTypeName()) + default: + valType = strings.TrimPrefix(valType, "*") + } + + typename = fmt.Sprintf("map[%s]%s", keyType, valType) + mapFieldTypes[field] = typename // record for the getter generation + + tag += fmt.Sprintf(" protobuf_key:%s protobuf_val:%s", keyTag, valTag) + } + } + + fieldTypes[field] = typename + + if oneof { + tname := ccTypeName + "_" + fieldName + // It is possible for this to collide with a message or enum + // nested in this message. Check for collisions. + for { + ok := true + for _, desc := range message.nested { + if CamelCaseSlice(desc.TypeName()) == tname { + ok = false + break + } + } + for _, enum := range message.enums { + if CamelCaseSlice(enum.TypeName()) == tname { + ok = false + break + } + } + if !ok { + tname += "_" + continue + } + break + } + + oneofTypeName[field] = tname + continue + } + + g.PrintComments(fmt.Sprintf("%s,%d,%d", message.path, messageFieldPath, i)) + g.P(fieldName, "\t", typename, "\t`", tag, "`") + g.RecordTypeUse(field.GetTypeName()) + } + if len(message.ExtensionRange) > 0 { + g.P(g.Pkg["proto"], ".XXX_InternalExtensions `json:\"-\"`") + } + if !message.proto3() { + g.P("XXX_unrecognized\t[]byte `json:\"-\"`") + } + g.Out() + g.P("}") + + // Update g.Buffer to list valid oneof types. + // We do this down here, after we've disambiguated the oneof type names. + // We go in reverse order of insertion point to avoid invalidating offsets. + for oi := int32(len(message.OneofDecl)); oi >= 0; oi-- { + ip := oneofInsertPoints[oi] + all := g.Buffer.Bytes() + rem := all[ip:] + g.Buffer = bytes.NewBuffer(all[:ip:ip]) // set cap so we don't scribble on rem + for _, field := range message.Field { + if field.OneofIndex == nil || *field.OneofIndex != oi { + continue + } + g.P("//\t*", oneofTypeName[field]) + } + g.Buffer.Write(rem) + } + + // Reset, String and ProtoMessage methods. + g.P("func (m *", ccTypeName, ") Reset() { *m = ", ccTypeName, "{} }") + g.P("func (m *", ccTypeName, ") String() string { return ", g.Pkg["proto"], ".CompactTextString(m) }") + g.P("func (*", ccTypeName, ") ProtoMessage() {}") + var indexes []string + for m := message; m != nil; m = m.parent { + indexes = append([]string{strconv.Itoa(m.index)}, indexes...) + } + g.P("func (*", ccTypeName, ") Descriptor() ([]byte, []int) { return ", g.file.VarName(), ", []int{", strings.Join(indexes, ", "), "} }") + // TODO: Revisit the decision to use a XXX_WellKnownType method + // if we change proto.MessageName to work with multiple equivalents. + if message.file.GetPackage() == "google.protobuf" && wellKnownTypes[message.GetName()] { + g.P("func (*", ccTypeName, `) XXX_WellKnownType() string { return "`, message.GetName(), `" }`) + } + + // Extension support methods + var hasExtensions, isMessageSet bool + if len(message.ExtensionRange) > 0 { + hasExtensions = true + // message_set_wire_format only makes sense when extensions are defined. + if opts := message.Options; opts != nil && opts.GetMessageSetWireFormat() { + isMessageSet = true + g.P() + g.P("func (m *", ccTypeName, ") Marshal() ([]byte, error) {") + g.In() + g.P("return ", g.Pkg["proto"], ".MarshalMessageSet(&m.XXX_InternalExtensions)") + g.Out() + g.P("}") + g.P("func (m *", ccTypeName, ") Unmarshal(buf []byte) error {") + g.In() + g.P("return ", g.Pkg["proto"], ".UnmarshalMessageSet(buf, &m.XXX_InternalExtensions)") + g.Out() + g.P("}") + g.P("func (m *", ccTypeName, ") MarshalJSON() ([]byte, error) {") + g.In() + g.P("return ", g.Pkg["proto"], ".MarshalMessageSetJSON(&m.XXX_InternalExtensions)") + g.Out() + g.P("}") + g.P("func (m *", ccTypeName, ") UnmarshalJSON(buf []byte) error {") + g.In() + g.P("return ", g.Pkg["proto"], ".UnmarshalMessageSetJSON(buf, &m.XXX_InternalExtensions)") + g.Out() + g.P("}") + g.P("// ensure ", ccTypeName, " satisfies proto.Marshaler and proto.Unmarshaler") + g.P("var _ ", g.Pkg["proto"], ".Marshaler = (*", ccTypeName, ")(nil)") + g.P("var _ ", g.Pkg["proto"], ".Unmarshaler = (*", ccTypeName, ")(nil)") + } + + g.P() + g.P("var extRange_", ccTypeName, " = []", g.Pkg["proto"], ".ExtensionRange{") + g.In() + for _, r := range message.ExtensionRange { + end := fmt.Sprint(*r.End - 1) // make range inclusive on both ends + g.P("{", r.Start, ", ", end, "},") + } + g.Out() + g.P("}") + g.P("func (*", ccTypeName, ") ExtensionRangeArray() []", g.Pkg["proto"], ".ExtensionRange {") + g.In() + g.P("return extRange_", ccTypeName) + g.Out() + g.P("}") + } + + // Default constants + defNames := make(map[*descriptor.FieldDescriptorProto]string) + for _, field := range message.Field { + def := field.GetDefaultValue() + if def == "" { + continue + } + fieldname := "Default_" + ccTypeName + "_" + CamelCase(*field.Name) + defNames[field] = fieldname + typename, _ := g.GoType(message, field) + if typename[0] == '*' { + typename = typename[1:] + } + kind := "const " + switch { + case typename == "bool": + case typename == "string": + def = strconv.Quote(def) + case typename == "[]byte": + def = "[]byte(" + strconv.Quote(unescape(def)) + ")" + kind = "var " + case def == "inf", def == "-inf", def == "nan": + // These names are known to, and defined by, the protocol language. + switch def { + case "inf": + def = "math.Inf(1)" + case "-inf": + def = "math.Inf(-1)" + case "nan": + def = "math.NaN()" + } + if *field.Type == descriptor.FieldDescriptorProto_TYPE_FLOAT { + def = "float32(" + def + ")" + } + kind = "var " + case *field.Type == descriptor.FieldDescriptorProto_TYPE_ENUM: + // Must be an enum. Need to construct the prefixed name. + obj := g.ObjectNamed(field.GetTypeName()) + var enum *EnumDescriptor + if id, ok := obj.(*ImportedDescriptor); ok { + // The enum type has been publicly imported. + enum, _ = id.o.(*EnumDescriptor) + } else { + enum, _ = obj.(*EnumDescriptor) + } + if enum == nil { + log.Printf("don't know how to generate constant for %s", fieldname) + continue + } + def = g.DefaultPackageName(obj) + enum.prefix() + def + } + g.P(kind, fieldname, " ", typename, " = ", def) + g.file.addExport(message, constOrVarSymbol{fieldname, kind, ""}) + } + g.P() + + // Oneof per-field types, discriminants and getters. + // + // Generate unexported named types for the discriminant interfaces. + // We shouldn't have to do this, but there was (~19 Aug 2015) a compiler/linker bug + // that was triggered by using anonymous interfaces here. + // TODO: Revisit this and consider reverting back to anonymous interfaces. + for oi := range message.OneofDecl { + dname := oneofDisc[int32(oi)] + g.P("type ", dname, " interface { ", dname, "() }") + } + g.P() + for _, field := range message.Field { + if field.OneofIndex == nil { + continue + } + _, wiretype := g.GoType(message, field) + tag := "protobuf:" + g.goTag(message, field, wiretype) + g.P("type ", oneofTypeName[field], " struct{ ", fieldNames[field], " ", fieldTypes[field], " `", tag, "` }") + g.RecordTypeUse(field.GetTypeName()) + } + g.P() + for _, field := range message.Field { + if field.OneofIndex == nil { + continue + } + g.P("func (*", oneofTypeName[field], ") ", oneofDisc[*field.OneofIndex], "() {}") + } + g.P() + for oi := range message.OneofDecl { + fname := oneofFieldName[int32(oi)] + g.P("func (m *", ccTypeName, ") Get", fname, "() ", oneofDisc[int32(oi)], " {") + g.P("if m != nil { return m.", fname, " }") + g.P("return nil") + g.P("}") + } + g.P() + + // Field getters + var getters []getterSymbol + for _, field := range message.Field { + oneof := field.OneofIndex != nil + + fname := fieldNames[field] + typename, _ := g.GoType(message, field) + if t, ok := mapFieldTypes[field]; ok { + typename = t + } + mname := fieldGetterNames[field] + star := "" + if needsStar(*field.Type) && typename[0] == '*' { + typename = typename[1:] + star = "*" + } + + // Only export getter symbols for basic types, + // and for messages and enums in the same package. + // Groups are not exported. + // Foreign types can't be hoisted through a public import because + // the importer may not already be importing the defining .proto. + // As an example, imagine we have an import tree like this: + // A.proto -> B.proto -> C.proto + // If A publicly imports B, we need to generate the getters from B in A's output, + // but if one such getter returns something from C then we cannot do that + // because A is not importing C already. + var getter, genType bool + switch *field.Type { + case descriptor.FieldDescriptorProto_TYPE_GROUP: + getter = false + case descriptor.FieldDescriptorProto_TYPE_MESSAGE, descriptor.FieldDescriptorProto_TYPE_ENUM: + // Only export getter if its return type is in this package. + getter = g.ObjectNamed(field.GetTypeName()).PackageName() == message.PackageName() + genType = true + default: + getter = true + } + if getter { + getters = append(getters, getterSymbol{ + name: mname, + typ: typename, + typeName: field.GetTypeName(), + genType: genType, + }) + } + + g.P("func (m *", ccTypeName, ") "+mname+"() "+typename+" {") + g.In() + def, hasDef := defNames[field] + typeDefaultIsNil := false // whether this field type's default value is a literal nil unless specified + switch *field.Type { + case descriptor.FieldDescriptorProto_TYPE_BYTES: + typeDefaultIsNil = !hasDef + case descriptor.FieldDescriptorProto_TYPE_GROUP, descriptor.FieldDescriptorProto_TYPE_MESSAGE: + typeDefaultIsNil = true + } + if isRepeated(field) { + typeDefaultIsNil = true + } + if typeDefaultIsNil && !oneof { + // A bytes field with no explicit default needs less generated code, + // as does a message or group field, or a repeated field. + g.P("if m != nil {") + g.In() + g.P("return m." + fname) + g.Out() + g.P("}") + g.P("return nil") + g.Out() + g.P("}") + g.P() + continue + } + if !oneof { + if message.proto3() { + g.P("if m != nil {") + } else { + g.P("if m != nil && m." + fname + " != nil {") + } + g.In() + g.P("return " + star + "m." + fname) + g.Out() + g.P("}") + } else { + uname := oneofFieldName[*field.OneofIndex] + tname := oneofTypeName[field] + g.P("if x, ok := m.Get", uname, "().(*", tname, "); ok {") + g.P("return x.", fname) + g.P("}") + } + if hasDef { + if *field.Type != descriptor.FieldDescriptorProto_TYPE_BYTES { + g.P("return " + def) + } else { + // The default is a []byte var. + // Make a copy when returning it to be safe. + g.P("return append([]byte(nil), ", def, "...)") + } + } else { + switch *field.Type { + case descriptor.FieldDescriptorProto_TYPE_BOOL: + g.P("return false") + case descriptor.FieldDescriptorProto_TYPE_STRING: + g.P(`return ""`) + case descriptor.FieldDescriptorProto_TYPE_GROUP, + descriptor.FieldDescriptorProto_TYPE_MESSAGE, + descriptor.FieldDescriptorProto_TYPE_BYTES: + // This is only possible for oneof fields. + g.P("return nil") + case descriptor.FieldDescriptorProto_TYPE_ENUM: + // The default default for an enum is the first value in the enum, + // not zero. + obj := g.ObjectNamed(field.GetTypeName()) + var enum *EnumDescriptor + if id, ok := obj.(*ImportedDescriptor); ok { + // The enum type has been publicly imported. + enum, _ = id.o.(*EnumDescriptor) + } else { + enum, _ = obj.(*EnumDescriptor) + } + if enum == nil { + log.Printf("don't know how to generate getter for %s", field.GetName()) + continue + } + if len(enum.Value) == 0 { + g.P("return 0 // empty enum") + } else { + first := enum.Value[0].GetName() + g.P("return ", g.DefaultPackageName(obj)+enum.prefix()+first) + } + default: + g.P("return 0") + } + } + g.Out() + g.P("}") + g.P() + } + + if !message.group { + ms := &messageSymbol{ + sym: ccTypeName, + hasExtensions: hasExtensions, + isMessageSet: isMessageSet, + hasOneof: len(message.OneofDecl) > 0, + getters: getters, + } + g.file.addExport(message, ms) + } + + // Oneof functions + if len(message.OneofDecl) > 0 { + fieldWire := make(map[*descriptor.FieldDescriptorProto]string) + + // method + enc := "_" + ccTypeName + "_OneofMarshaler" + dec := "_" + ccTypeName + "_OneofUnmarshaler" + size := "_" + ccTypeName + "_OneofSizer" + encSig := "(msg " + g.Pkg["proto"] + ".Message, b *" + g.Pkg["proto"] + ".Buffer) error" + decSig := "(msg " + g.Pkg["proto"] + ".Message, tag, wire int, b *" + g.Pkg["proto"] + ".Buffer) (bool, error)" + sizeSig := "(msg " + g.Pkg["proto"] + ".Message) (n int)" + + g.P("// XXX_OneofFuncs is for the internal use of the proto package.") + g.P("func (*", ccTypeName, ") XXX_OneofFuncs() (func", encSig, ", func", decSig, ", func", sizeSig, ", []interface{}) {") + g.P("return ", enc, ", ", dec, ", ", size, ", []interface{}{") + for _, field := range message.Field { + if field.OneofIndex == nil { + continue + } + g.P("(*", oneofTypeName[field], ")(nil),") + } + g.P("}") + g.P("}") + g.P() + + // marshaler + g.P("func ", enc, encSig, " {") + g.P("m := msg.(*", ccTypeName, ")") + for oi, odp := range message.OneofDecl { + g.P("// ", odp.GetName()) + fname := oneofFieldName[int32(oi)] + g.P("switch x := m.", fname, ".(type) {") + for _, field := range message.Field { + if field.OneofIndex == nil || int(*field.OneofIndex) != oi { + continue + } + g.P("case *", oneofTypeName[field], ":") + var wire, pre, post string + val := "x." + fieldNames[field] // overridden for TYPE_BOOL + canFail := false // only TYPE_MESSAGE and TYPE_GROUP can fail + switch *field.Type { + case descriptor.FieldDescriptorProto_TYPE_DOUBLE: + wire = "WireFixed64" + pre = "b.EncodeFixed64(" + g.Pkg["math"] + ".Float64bits(" + post = "))" + case descriptor.FieldDescriptorProto_TYPE_FLOAT: + wire = "WireFixed32" + pre = "b.EncodeFixed32(uint64(" + g.Pkg["math"] + ".Float32bits(" + post = ")))" + case descriptor.FieldDescriptorProto_TYPE_INT64, + descriptor.FieldDescriptorProto_TYPE_UINT64: + wire = "WireVarint" + pre, post = "b.EncodeVarint(uint64(", "))" + case descriptor.FieldDescriptorProto_TYPE_INT32, + descriptor.FieldDescriptorProto_TYPE_UINT32, + descriptor.FieldDescriptorProto_TYPE_ENUM: + wire = "WireVarint" + pre, post = "b.EncodeVarint(uint64(", "))" + case descriptor.FieldDescriptorProto_TYPE_FIXED64, + descriptor.FieldDescriptorProto_TYPE_SFIXED64: + wire = "WireFixed64" + pre, post = "b.EncodeFixed64(uint64(", "))" + case descriptor.FieldDescriptorProto_TYPE_FIXED32, + descriptor.FieldDescriptorProto_TYPE_SFIXED32: + wire = "WireFixed32" + pre, post = "b.EncodeFixed32(uint64(", "))" + case descriptor.FieldDescriptorProto_TYPE_BOOL: + // bool needs special handling. + g.P("t := uint64(0)") + g.P("if ", val, " { t = 1 }") + val = "t" + wire = "WireVarint" + pre, post = "b.EncodeVarint(", ")" + case descriptor.FieldDescriptorProto_TYPE_STRING: + wire = "WireBytes" + pre, post = "b.EncodeStringBytes(", ")" + case descriptor.FieldDescriptorProto_TYPE_GROUP: + wire = "WireStartGroup" + pre, post = "b.Marshal(", ")" + canFail = true + case descriptor.FieldDescriptorProto_TYPE_MESSAGE: + wire = "WireBytes" + pre, post = "b.EncodeMessage(", ")" + canFail = true + case descriptor.FieldDescriptorProto_TYPE_BYTES: + wire = "WireBytes" + pre, post = "b.EncodeRawBytes(", ")" + case descriptor.FieldDescriptorProto_TYPE_SINT32: + wire = "WireVarint" + pre, post = "b.EncodeZigzag32(uint64(", "))" + case descriptor.FieldDescriptorProto_TYPE_SINT64: + wire = "WireVarint" + pre, post = "b.EncodeZigzag64(uint64(", "))" + default: + g.Fail("unhandled oneof field type ", field.Type.String()) + } + fieldWire[field] = wire + g.P("b.EncodeVarint(", field.Number, "<<3|", g.Pkg["proto"], ".", wire, ")") + if !canFail { + g.P(pre, val, post) + } else { + g.P("if err := ", pre, val, post, "; err != nil {") + g.P("return err") + g.P("}") + } + if *field.Type == descriptor.FieldDescriptorProto_TYPE_GROUP { + g.P("b.EncodeVarint(", field.Number, "<<3|", g.Pkg["proto"], ".WireEndGroup)") + } + } + g.P("case nil:") + g.P("default: return ", g.Pkg["fmt"], `.Errorf("`, ccTypeName, ".", fname, ` has unexpected type %T", x)`) + g.P("}") + } + g.P("return nil") + g.P("}") + g.P() + + // unmarshaler + g.P("func ", dec, decSig, " {") + g.P("m := msg.(*", ccTypeName, ")") + g.P("switch tag {") + for _, field := range message.Field { + if field.OneofIndex == nil { + continue + } + odp := message.OneofDecl[int(*field.OneofIndex)] + g.P("case ", field.Number, ": // ", odp.GetName(), ".", *field.Name) + g.P("if wire != ", g.Pkg["proto"], ".", fieldWire[field], " {") + g.P("return true, ", g.Pkg["proto"], ".ErrInternalBadWireType") + g.P("}") + lhs := "x, err" // overridden for TYPE_MESSAGE and TYPE_GROUP + var dec, cast, cast2 string + switch *field.Type { + case descriptor.FieldDescriptorProto_TYPE_DOUBLE: + dec, cast = "b.DecodeFixed64()", g.Pkg["math"]+".Float64frombits" + case descriptor.FieldDescriptorProto_TYPE_FLOAT: + dec, cast, cast2 = "b.DecodeFixed32()", "uint32", g.Pkg["math"]+".Float32frombits" + case descriptor.FieldDescriptorProto_TYPE_INT64: + dec, cast = "b.DecodeVarint()", "int64" + case descriptor.FieldDescriptorProto_TYPE_UINT64: + dec = "b.DecodeVarint()" + case descriptor.FieldDescriptorProto_TYPE_INT32: + dec, cast = "b.DecodeVarint()", "int32" + case descriptor.FieldDescriptorProto_TYPE_FIXED64: + dec = "b.DecodeFixed64()" + case descriptor.FieldDescriptorProto_TYPE_FIXED32: + dec, cast = "b.DecodeFixed32()", "uint32" + case descriptor.FieldDescriptorProto_TYPE_BOOL: + dec = "b.DecodeVarint()" + // handled specially below + case descriptor.FieldDescriptorProto_TYPE_STRING: + dec = "b.DecodeStringBytes()" + case descriptor.FieldDescriptorProto_TYPE_GROUP: + g.P("msg := new(", fieldTypes[field][1:], ")") // drop star + lhs = "err" + dec = "b.DecodeGroup(msg)" + // handled specially below + case descriptor.FieldDescriptorProto_TYPE_MESSAGE: + g.P("msg := new(", fieldTypes[field][1:], ")") // drop star + lhs = "err" + dec = "b.DecodeMessage(msg)" + // handled specially below + case descriptor.FieldDescriptorProto_TYPE_BYTES: + dec = "b.DecodeRawBytes(true)" + case descriptor.FieldDescriptorProto_TYPE_UINT32: + dec, cast = "b.DecodeVarint()", "uint32" + case descriptor.FieldDescriptorProto_TYPE_ENUM: + dec, cast = "b.DecodeVarint()", fieldTypes[field] + case descriptor.FieldDescriptorProto_TYPE_SFIXED32: + dec, cast = "b.DecodeFixed32()", "int32" + case descriptor.FieldDescriptorProto_TYPE_SFIXED64: + dec, cast = "b.DecodeFixed64()", "int64" + case descriptor.FieldDescriptorProto_TYPE_SINT32: + dec, cast = "b.DecodeZigzag32()", "int32" + case descriptor.FieldDescriptorProto_TYPE_SINT64: + dec, cast = "b.DecodeZigzag64()", "int64" + default: + g.Fail("unhandled oneof field type ", field.Type.String()) + } + g.P(lhs, " := ", dec) + val := "x" + if cast != "" { + val = cast + "(" + val + ")" + } + if cast2 != "" { + val = cast2 + "(" + val + ")" + } + switch *field.Type { + case descriptor.FieldDescriptorProto_TYPE_BOOL: + val += " != 0" + case descriptor.FieldDescriptorProto_TYPE_GROUP, + descriptor.FieldDescriptorProto_TYPE_MESSAGE: + val = "msg" + } + g.P("m.", oneofFieldName[*field.OneofIndex], " = &", oneofTypeName[field], "{", val, "}") + g.P("return true, err") + } + g.P("default: return false, nil") + g.P("}") + g.P("}") + g.P() + + // sizer + g.P("func ", size, sizeSig, " {") + g.P("m := msg.(*", ccTypeName, ")") + for oi, odp := range message.OneofDecl { + g.P("// ", odp.GetName()) + fname := oneofFieldName[int32(oi)] + g.P("switch x := m.", fname, ".(type) {") + for _, field := range message.Field { + if field.OneofIndex == nil || int(*field.OneofIndex) != oi { + continue + } + g.P("case *", oneofTypeName[field], ":") + val := "x." + fieldNames[field] + var wire, varint, fixed string + switch *field.Type { + case descriptor.FieldDescriptorProto_TYPE_DOUBLE: + wire = "WireFixed64" + fixed = "8" + case descriptor.FieldDescriptorProto_TYPE_FLOAT: + wire = "WireFixed32" + fixed = "4" + case descriptor.FieldDescriptorProto_TYPE_INT64, + descriptor.FieldDescriptorProto_TYPE_UINT64, + descriptor.FieldDescriptorProto_TYPE_INT32, + descriptor.FieldDescriptorProto_TYPE_UINT32, + descriptor.FieldDescriptorProto_TYPE_ENUM: + wire = "WireVarint" + varint = val + case descriptor.FieldDescriptorProto_TYPE_FIXED64, + descriptor.FieldDescriptorProto_TYPE_SFIXED64: + wire = "WireFixed64" + fixed = "8" + case descriptor.FieldDescriptorProto_TYPE_FIXED32, + descriptor.FieldDescriptorProto_TYPE_SFIXED32: + wire = "WireFixed32" + fixed = "4" + case descriptor.FieldDescriptorProto_TYPE_BOOL: + wire = "WireVarint" + fixed = "1" + case descriptor.FieldDescriptorProto_TYPE_STRING: + wire = "WireBytes" + fixed = "len(" + val + ")" + varint = fixed + case descriptor.FieldDescriptorProto_TYPE_GROUP: + wire = "WireStartGroup" + fixed = g.Pkg["proto"] + ".Size(" + val + ")" + case descriptor.FieldDescriptorProto_TYPE_MESSAGE: + wire = "WireBytes" + g.P("s := ", g.Pkg["proto"], ".Size(", val, ")") + fixed = "s" + varint = fixed + case descriptor.FieldDescriptorProto_TYPE_BYTES: + wire = "WireBytes" + fixed = "len(" + val + ")" + varint = fixed + case descriptor.FieldDescriptorProto_TYPE_SINT32: + wire = "WireVarint" + varint = "(uint32(" + val + ") << 1) ^ uint32((int32(" + val + ") >> 31))" + case descriptor.FieldDescriptorProto_TYPE_SINT64: + wire = "WireVarint" + varint = "uint64(" + val + " << 1) ^ uint64((int64(" + val + ") >> 63))" + default: + g.Fail("unhandled oneof field type ", field.Type.String()) + } + g.P("n += ", g.Pkg["proto"], ".SizeVarint(", field.Number, "<<3|", g.Pkg["proto"], ".", wire, ")") + if varint != "" { + g.P("n += ", g.Pkg["proto"], ".SizeVarint(uint64(", varint, "))") + } + if fixed != "" { + g.P("n += ", fixed) + } + if *field.Type == descriptor.FieldDescriptorProto_TYPE_GROUP { + g.P("n += ", g.Pkg["proto"], ".SizeVarint(", field.Number, "<<3|", g.Pkg["proto"], ".WireEndGroup)") + } + } + g.P("case nil:") + g.P("default:") + g.P("panic(", g.Pkg["fmt"], ".Sprintf(\"proto: unexpected type %T in oneof\", x))") + g.P("}") + } + g.P("return n") + g.P("}") + g.P() + } + + for _, ext := range message.ext { + g.generateExtension(ext) + } + + fullName := strings.Join(message.TypeName(), ".") + if g.file.Package != nil { + fullName = *g.file.Package + "." + fullName + } + + g.addInitf("%s.RegisterType((*%s)(nil), %q)", g.Pkg["proto"], ccTypeName, fullName) +} + +var escapeChars = [256]byte{ + 'a': '\a', 'b': '\b', 'f': '\f', 'n': '\n', 'r': '\r', 't': '\t', 'v': '\v', '\\': '\\', '"': '"', '\'': '\'', '?': '?', +} + +// unescape reverses the "C" escaping that protoc does for default values of bytes fields. +// It is best effort in that it effectively ignores malformed input. Seemingly invalid escape +// sequences are conveyed, unmodified, into the decoded result. +func unescape(s string) string { + // NB: Sadly, we can't use strconv.Unquote because protoc will escape both + // single and double quotes, but strconv.Unquote only allows one or the + // other (based on actual surrounding quotes of its input argument). + + var out []byte + for len(s) > 0 { + // regular character, or too short to be valid escape + if s[0] != '\\' || len(s) < 2 { + out = append(out, s[0]) + s = s[1:] + } else if c := escapeChars[s[1]]; c != 0 { + // escape sequence + out = append(out, c) + s = s[2:] + } else if s[1] == 'x' || s[1] == 'X' { + // hex escape, e.g. "\x80 + if len(s) < 4 { + // too short to be valid + out = append(out, s[:2]...) + s = s[2:] + continue + } + v, err := strconv.ParseUint(s[2:4], 16, 8) + if err != nil { + out = append(out, s[:4]...) + } else { + out = append(out, byte(v)) + } + s = s[4:] + } else if '0' <= s[1] && s[1] <= '7' { + // octal escape, can vary from 1 to 3 octal digits; e.g., "\0" "\40" or "\164" + // so consume up to 2 more bytes or up to end-of-string + n := len(s[1:]) - len(strings.TrimLeft(s[1:], "01234567")) + if n > 3 { + n = 3 + } + v, err := strconv.ParseUint(s[1:1+n], 8, 8) + if err != nil { + out = append(out, s[:1+n]...) + } else { + out = append(out, byte(v)) + } + s = s[1+n:] + } else { + // bad escape, just propagate the slash as-is + out = append(out, s[0]) + s = s[1:] + } + } + + return string(out) +} + +func (g *Generator) generateExtension(ext *ExtensionDescriptor) { + ccTypeName := ext.DescName() + + extObj := g.ObjectNamed(*ext.Extendee) + var extDesc *Descriptor + if id, ok := extObj.(*ImportedDescriptor); ok { + // This is extending a publicly imported message. + // We need the underlying type for goTag. + extDesc = id.o.(*Descriptor) + } else { + extDesc = extObj.(*Descriptor) + } + extendedType := "*" + g.TypeName(extObj) // always use the original + field := ext.FieldDescriptorProto + fieldType, wireType := g.GoType(ext.parent, field) + tag := g.goTag(extDesc, field, wireType) + g.RecordTypeUse(*ext.Extendee) + if n := ext.FieldDescriptorProto.TypeName; n != nil { + // foreign extension type + g.RecordTypeUse(*n) + } + + typeName := ext.TypeName() + + // Special case for proto2 message sets: If this extension is extending + // proto2_bridge.MessageSet, and its final name component is "message_set_extension", + // then drop that last component. + mset := false + if extendedType == "*proto2_bridge.MessageSet" && typeName[len(typeName)-1] == "message_set_extension" { + typeName = typeName[:len(typeName)-1] + mset = true + } + + // For text formatting, the package must be exactly what the .proto file declares, + // ignoring overrides such as the go_package option, and with no dot/underscore mapping. + extName := strings.Join(typeName, ".") + if g.file.Package != nil { + extName = *g.file.Package + "." + extName + } + + g.P("var ", ccTypeName, " = &", g.Pkg["proto"], ".ExtensionDesc{") + g.In() + g.P("ExtendedType: (", extendedType, ")(nil),") + g.P("ExtensionType: (", fieldType, ")(nil),") + g.P("Field: ", field.Number, ",") + g.P(`Name: "`, extName, `",`) + g.P("Tag: ", tag, ",") + g.P(`Filename: "`, g.file.GetName(), `",`) + + g.Out() + g.P("}") + g.P() + + if mset { + // Generate a bit more code to register with message_set.go. + g.addInitf("%s.RegisterMessageSetType((%s)(nil), %d, %q)", g.Pkg["proto"], fieldType, *field.Number, extName) + } + + g.file.addExport(ext, constOrVarSymbol{ccTypeName, "var", ""}) +} + +func (g *Generator) generateInitFunction() { + for _, enum := range g.file.enum { + g.generateEnumRegistration(enum) + } + for _, d := range g.file.desc { + for _, ext := range d.ext { + g.generateExtensionRegistration(ext) + } + } + for _, ext := range g.file.ext { + g.generateExtensionRegistration(ext) + } + if len(g.init) == 0 { + return + } + g.P("func init() {") + g.In() + for _, l := range g.init { + g.P(l) + } + g.Out() + g.P("}") + g.init = nil +} + +func (g *Generator) generateFileDescriptor(file *FileDescriptor) { + // Make a copy and trim source_code_info data. + // TODO: Trim this more when we know exactly what we need. + pb := proto.Clone(file.FileDescriptorProto).(*descriptor.FileDescriptorProto) + pb.SourceCodeInfo = nil + + b, err := proto.Marshal(pb) + if err != nil { + g.Fail(err.Error()) + } + + var buf bytes.Buffer + w, _ := gzip.NewWriterLevel(&buf, gzip.BestCompression) + w.Write(b) + w.Close() + b = buf.Bytes() + + v := file.VarName() + g.P() + g.P("func init() { ", g.Pkg["proto"], ".RegisterFile(", strconv.Quote(*file.Name), ", ", v, ") }") + g.P("var ", v, " = []byte{") + g.In() + g.P("// ", len(b), " bytes of a gzipped FileDescriptorProto") + for len(b) > 0 { + n := 16 + if n > len(b) { + n = len(b) + } + + s := "" + for _, c := range b[:n] { + s += fmt.Sprintf("0x%02x,", c) + } + g.P(s) + + b = b[n:] + } + g.Out() + g.P("}") +} + +func (g *Generator) generateEnumRegistration(enum *EnumDescriptor) { + // // We always print the full (proto-world) package name here. + pkg := enum.File().GetPackage() + if pkg != "" { + pkg += "." + } + // The full type name + typeName := enum.TypeName() + // The full type name, CamelCased. + ccTypeName := CamelCaseSlice(typeName) + g.addInitf("%s.RegisterEnum(%q, %[3]s_name, %[3]s_value)", g.Pkg["proto"], pkg+ccTypeName, ccTypeName) +} + +func (g *Generator) generateExtensionRegistration(ext *ExtensionDescriptor) { + g.addInitf("%s.RegisterExtension(%s)", g.Pkg["proto"], ext.DescName()) +} + +// And now lots of helper functions. + +// Is c an ASCII lower-case letter? +func isASCIILower(c byte) bool { + return 'a' <= c && c <= 'z' +} + +// Is c an ASCII digit? +func isASCIIDigit(c byte) bool { + return '0' <= c && c <= '9' +} + +// CamelCase returns the CamelCased name. +// If there is an interior underscore followed by a lower case letter, +// drop the underscore and convert the letter to upper case. +// There is a remote possibility of this rewrite causing a name collision, +// but it's so remote we're prepared to pretend it's nonexistent - since the +// C++ generator lowercases names, it's extremely unlikely to have two fields +// with different capitalizations. +// In short, _my_field_name_2 becomes XMyFieldName_2. +func CamelCase(s string) string { + if s == "" { + return "" + } + t := make([]byte, 0, 32) + i := 0 + if s[0] == '_' { + // Need a capital letter; drop the '_'. + t = append(t, 'X') + i++ + } + // Invariant: if the next letter is lower case, it must be converted + // to upper case. + // That is, we process a word at a time, where words are marked by _ or + // upper case letter. Digits are treated as words. + for ; i < len(s); i++ { + c := s[i] + if c == '_' && i+1 < len(s) && isASCIILower(s[i+1]) { + continue // Skip the underscore in s. + } + if isASCIIDigit(c) { + t = append(t, c) + continue + } + // Assume we have a letter now - if not, it's a bogus identifier. + // The next word is a sequence of characters that must start upper case. + if isASCIILower(c) { + c ^= ' ' // Make it a capital letter. + } + t = append(t, c) // Guaranteed not lower case. + // Accept lower case sequence that follows. + for i+1 < len(s) && isASCIILower(s[i+1]) { + i++ + t = append(t, s[i]) + } + } + return string(t) +} + +// CamelCaseSlice is like CamelCase, but the argument is a slice of strings to +// be joined with "_". +func CamelCaseSlice(elem []string) string { return CamelCase(strings.Join(elem, "_")) } + +// dottedSlice turns a sliced name into a dotted name. +func dottedSlice(elem []string) string { return strings.Join(elem, ".") } + +// Is this field optional? +func isOptional(field *descriptor.FieldDescriptorProto) bool { + return field.Label != nil && *field.Label == descriptor.FieldDescriptorProto_LABEL_OPTIONAL +} + +// Is this field required? +func isRequired(field *descriptor.FieldDescriptorProto) bool { + return field.Label != nil && *field.Label == descriptor.FieldDescriptorProto_LABEL_REQUIRED +} + +// Is this field repeated? +func isRepeated(field *descriptor.FieldDescriptorProto) bool { + return field.Label != nil && *field.Label == descriptor.FieldDescriptorProto_LABEL_REPEATED +} + +// Is this field a scalar numeric type? +func isScalar(field *descriptor.FieldDescriptorProto) bool { + if field.Type == nil { + return false + } + switch *field.Type { + case descriptor.FieldDescriptorProto_TYPE_DOUBLE, + descriptor.FieldDescriptorProto_TYPE_FLOAT, + descriptor.FieldDescriptorProto_TYPE_INT64, + descriptor.FieldDescriptorProto_TYPE_UINT64, + descriptor.FieldDescriptorProto_TYPE_INT32, + descriptor.FieldDescriptorProto_TYPE_FIXED64, + descriptor.FieldDescriptorProto_TYPE_FIXED32, + descriptor.FieldDescriptorProto_TYPE_BOOL, + descriptor.FieldDescriptorProto_TYPE_UINT32, + descriptor.FieldDescriptorProto_TYPE_ENUM, + descriptor.FieldDescriptorProto_TYPE_SFIXED32, + descriptor.FieldDescriptorProto_TYPE_SFIXED64, + descriptor.FieldDescriptorProto_TYPE_SINT32, + descriptor.FieldDescriptorProto_TYPE_SINT64: + return true + default: + return false + } +} + +// badToUnderscore is the mapping function used to generate Go names from package names, +// which can be dotted in the input .proto file. It replaces non-identifier characters such as +// dot or dash with underscore. +func badToUnderscore(r rune) rune { + if unicode.IsLetter(r) || unicode.IsDigit(r) || r == '_' { + return r + } + return '_' +} + +// baseName returns the last path element of the name, with the last dotted suffix removed. +func baseName(name string) string { + // First, find the last element + if i := strings.LastIndex(name, "/"); i >= 0 { + name = name[i+1:] + } + // Now drop the suffix + if i := strings.LastIndex(name, "."); i >= 0 { + name = name[0:i] + } + return name +} + +// The SourceCodeInfo message describes the location of elements of a parsed +// .proto file by way of a "path", which is a sequence of integers that +// describe the route from a FileDescriptorProto to the relevant submessage. +// The path alternates between a field number of a repeated field, and an index +// into that repeated field. The constants below define the field numbers that +// are used. +// +// See descriptor.proto for more information about this. +const ( + // tag numbers in FileDescriptorProto + packagePath = 2 // package + messagePath = 4 // message_type + enumPath = 5 // enum_type + // tag numbers in DescriptorProto + messageFieldPath = 2 // field + messageMessagePath = 3 // nested_type + messageEnumPath = 4 // enum_type + messageOneofPath = 8 // oneof_decl + // tag numbers in EnumDescriptorProto + enumValuePath = 2 // value +) diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/generator/name_test.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/generator/name_test.go new file mode 100644 index 0000000..76808f3 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/generator/name_test.go @@ -0,0 +1,114 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2013 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package generator + +import ( + "testing" + + "github.com/golang/protobuf/protoc-gen-go/descriptor" +) + +func TestCamelCase(t *testing.T) { + tests := []struct { + in, want string + }{ + {"one", "One"}, + {"one_two", "OneTwo"}, + {"_my_field_name_2", "XMyFieldName_2"}, + {"Something_Capped", "Something_Capped"}, + {"my_Name", "My_Name"}, + {"OneTwo", "OneTwo"}, + {"_", "X"}, + {"_a_", "XA_"}, + } + for _, tc := range tests { + if got := CamelCase(tc.in); got != tc.want { + t.Errorf("CamelCase(%q) = %q, want %q", tc.in, got, tc.want) + } + } +} + +func TestGoPackageOption(t *testing.T) { + tests := []struct { + in string + impPath, pkg string + ok bool + }{ + {"", "", "", false}, + {"foo", "", "foo", true}, + {"github.com/golang/bar", "github.com/golang/bar", "bar", true}, + {"github.com/golang/bar;baz", "github.com/golang/bar", "baz", true}, + } + for _, tc := range tests { + d := &FileDescriptor{ + FileDescriptorProto: &descriptor.FileDescriptorProto{ + Options: &descriptor.FileOptions{ + GoPackage: &tc.in, + }, + }, + } + impPath, pkg, ok := d.goPackageOption() + if impPath != tc.impPath || pkg != tc.pkg || ok != tc.ok { + t.Errorf("go_package = %q => (%q, %q, %t), want (%q, %q, %t)", tc.in, + impPath, pkg, ok, tc.impPath, tc.pkg, tc.ok) + } + } +} + +func TestUnescape(t *testing.T) { + tests := []struct { + in string + out string + }{ + // successful cases, including all kinds of escapes + {"", ""}, + {"foo bar baz frob nitz", "foo bar baz frob nitz"}, + {`\000\001\002\003\004\005\006\007`, string([]byte{0, 1, 2, 3, 4, 5, 6, 7})}, + {`\a\b\f\n\r\t\v\\\?\'\"`, string([]byte{'\a', '\b', '\f', '\n', '\r', '\t', '\v', '\\', '?', '\'', '"'})}, + {`\x10\x20\x30\x40\x50\x60\x70\x80`, string([]byte{16, 32, 48, 64, 80, 96, 112, 128})}, + // variable length octal escapes + {`\0\018\222\377\3\04\005\6\07`, string([]byte{0, 1, '8', 0222, 255, 3, 4, 5, 6, 7})}, + // malformed escape sequences left as is + {"foo \\g bar", "foo \\g bar"}, + {"foo \\xg0 bar", "foo \\xg0 bar"}, + {"\\", "\\"}, + {"\\x", "\\x"}, + {"\\xf", "\\xf"}, + {"\\777", "\\777"}, // overflows byte + } + for _, tc := range tests { + s := unescape(tc.in) + if s != tc.out { + t.Errorf("doUnescape(%q) = %q; should have been %q", tc.in, s, tc.out) + } + } +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/grpc/grpc.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/grpc/grpc.go new file mode 100644 index 0000000..2660e47 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/grpc/grpc.go @@ -0,0 +1,463 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2015 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +// Package grpc outputs gRPC service descriptions in Go code. +// It runs as a plugin for the Go protocol buffer compiler plugin. +// It is linked in to protoc-gen-go. +package grpc + +import ( + "fmt" + "path" + "strconv" + "strings" + + pb "github.com/golang/protobuf/protoc-gen-go/descriptor" + "github.com/golang/protobuf/protoc-gen-go/generator" +) + +// generatedCodeVersion indicates a version of the generated code. +// It is incremented whenever an incompatibility between the generated code and +// the grpc package is introduced; the generated code references +// a constant, grpc.SupportPackageIsVersionN (where N is generatedCodeVersion). +const generatedCodeVersion = 4 + +// Paths for packages used by code generated in this file, +// relative to the import_prefix of the generator.Generator. +const ( + contextPkgPath = "golang.org/x/net/context" + grpcPkgPath = "google.golang.org/grpc" +) + +func init() { + generator.RegisterPlugin(new(grpc)) +} + +// grpc is an implementation of the Go protocol buffer compiler's +// plugin architecture. It generates bindings for gRPC support. +type grpc struct { + gen *generator.Generator +} + +// Name returns the name of this plugin, "grpc". +func (g *grpc) Name() string { + return "grpc" +} + +// The names for packages imported in the generated code. +// They may vary from the final path component of the import path +// if the name is used by other packages. +var ( + contextPkg string + grpcPkg string +) + +// Init initializes the plugin. +func (g *grpc) Init(gen *generator.Generator) { + g.gen = gen + contextPkg = generator.RegisterUniquePackageName("context", nil) + grpcPkg = generator.RegisterUniquePackageName("grpc", nil) +} + +// Given a type name defined in a .proto, return its object. +// Also record that we're using it, to guarantee the associated import. +func (g *grpc) objectNamed(name string) generator.Object { + g.gen.RecordTypeUse(name) + return g.gen.ObjectNamed(name) +} + +// Given a type name defined in a .proto, return its name as we will print it. +func (g *grpc) typeName(str string) string { + return g.gen.TypeName(g.objectNamed(str)) +} + +// P forwards to g.gen.P. +func (g *grpc) P(args ...interface{}) { g.gen.P(args...) } + +// Generate generates code for the services in the given file. +func (g *grpc) Generate(file *generator.FileDescriptor) { + if len(file.FileDescriptorProto.Service) == 0 { + return + } + + g.P("// Reference imports to suppress errors if they are not otherwise used.") + g.P("var _ ", contextPkg, ".Context") + g.P("var _ ", grpcPkg, ".ClientConn") + g.P() + + // Assert version compatibility. + g.P("// This is a compile-time assertion to ensure that this generated file") + g.P("// is compatible with the grpc package it is being compiled against.") + g.P("const _ = ", grpcPkg, ".SupportPackageIsVersion", generatedCodeVersion) + g.P() + + for i, service := range file.FileDescriptorProto.Service { + g.generateService(file, service, i) + } +} + +// GenerateImports generates the import declaration for this file. +func (g *grpc) GenerateImports(file *generator.FileDescriptor) { + if len(file.FileDescriptorProto.Service) == 0 { + return + } + g.P("import (") + g.P(contextPkg, " ", strconv.Quote(path.Join(g.gen.ImportPrefix, contextPkgPath))) + g.P(grpcPkg, " ", strconv.Quote(path.Join(g.gen.ImportPrefix, grpcPkgPath))) + g.P(")") + g.P() +} + +// reservedClientName records whether a client name is reserved on the client side. +var reservedClientName = map[string]bool{ +// TODO: do we need any in gRPC? +} + +func unexport(s string) string { return strings.ToLower(s[:1]) + s[1:] } + +// generateService generates all the code for the named service. +func (g *grpc) generateService(file *generator.FileDescriptor, service *pb.ServiceDescriptorProto, index int) { + path := fmt.Sprintf("6,%d", index) // 6 means service. + + origServName := service.GetName() + fullServName := origServName + if pkg := file.GetPackage(); pkg != "" { + fullServName = pkg + "." + fullServName + } + servName := generator.CamelCase(origServName) + + g.P() + g.P("// Client API for ", servName, " service") + g.P() + + // Client interface. + g.P("type ", servName, "Client interface {") + for i, method := range service.Method { + g.gen.PrintComments(fmt.Sprintf("%s,2,%d", path, i)) // 2 means method in a service. + g.P(g.generateClientSignature(servName, method)) + } + g.P("}") + g.P() + + // Client structure. + g.P("type ", unexport(servName), "Client struct {") + g.P("cc *", grpcPkg, ".ClientConn") + g.P("}") + g.P() + + // NewClient factory. + g.P("func New", servName, "Client (cc *", grpcPkg, ".ClientConn) ", servName, "Client {") + g.P("return &", unexport(servName), "Client{cc}") + g.P("}") + g.P() + + var methodIndex, streamIndex int + serviceDescVar := "_" + servName + "_serviceDesc" + // Client method implementations. + for _, method := range service.Method { + var descExpr string + if !method.GetServerStreaming() && !method.GetClientStreaming() { + // Unary RPC method + descExpr = fmt.Sprintf("&%s.Methods[%d]", serviceDescVar, methodIndex) + methodIndex++ + } else { + // Streaming RPC method + descExpr = fmt.Sprintf("&%s.Streams[%d]", serviceDescVar, streamIndex) + streamIndex++ + } + g.generateClientMethod(servName, fullServName, serviceDescVar, method, descExpr) + } + + g.P("// Server API for ", servName, " service") + g.P() + + // Server interface. + serverType := servName + "Server" + g.P("type ", serverType, " interface {") + for i, method := range service.Method { + g.gen.PrintComments(fmt.Sprintf("%s,2,%d", path, i)) // 2 means method in a service. + g.P(g.generateServerSignature(servName, method)) + } + g.P("}") + g.P() + + // Server registration. + g.P("func Register", servName, "Server(s *", grpcPkg, ".Server, srv ", serverType, ") {") + g.P("s.RegisterService(&", serviceDescVar, `, srv)`) + g.P("}") + g.P() + + // Server handler implementations. + var handlerNames []string + for _, method := range service.Method { + hname := g.generateServerMethod(servName, fullServName, method) + handlerNames = append(handlerNames, hname) + } + + // Service descriptor. + g.P("var ", serviceDescVar, " = ", grpcPkg, ".ServiceDesc {") + g.P("ServiceName: ", strconv.Quote(fullServName), ",") + g.P("HandlerType: (*", serverType, ")(nil),") + g.P("Methods: []", grpcPkg, ".MethodDesc{") + for i, method := range service.Method { + if method.GetServerStreaming() || method.GetClientStreaming() { + continue + } + g.P("{") + g.P("MethodName: ", strconv.Quote(method.GetName()), ",") + g.P("Handler: ", handlerNames[i], ",") + g.P("},") + } + g.P("},") + g.P("Streams: []", grpcPkg, ".StreamDesc{") + for i, method := range service.Method { + if !method.GetServerStreaming() && !method.GetClientStreaming() { + continue + } + g.P("{") + g.P("StreamName: ", strconv.Quote(method.GetName()), ",") + g.P("Handler: ", handlerNames[i], ",") + if method.GetServerStreaming() { + g.P("ServerStreams: true,") + } + if method.GetClientStreaming() { + g.P("ClientStreams: true,") + } + g.P("},") + } + g.P("},") + g.P("Metadata: \"", file.GetName(), "\",") + g.P("}") + g.P() +} + +// generateClientSignature returns the client-side signature for a method. +func (g *grpc) generateClientSignature(servName string, method *pb.MethodDescriptorProto) string { + origMethName := method.GetName() + methName := generator.CamelCase(origMethName) + if reservedClientName[methName] { + methName += "_" + } + reqArg := ", in *" + g.typeName(method.GetInputType()) + if method.GetClientStreaming() { + reqArg = "" + } + respName := "*" + g.typeName(method.GetOutputType()) + if method.GetServerStreaming() || method.GetClientStreaming() { + respName = servName + "_" + generator.CamelCase(origMethName) + "Client" + } + return fmt.Sprintf("%s(ctx %s.Context%s, opts ...%s.CallOption) (%s, error)", methName, contextPkg, reqArg, grpcPkg, respName) +} + +func (g *grpc) generateClientMethod(servName, fullServName, serviceDescVar string, method *pb.MethodDescriptorProto, descExpr string) { + sname := fmt.Sprintf("/%s/%s", fullServName, method.GetName()) + methName := generator.CamelCase(method.GetName()) + inType := g.typeName(method.GetInputType()) + outType := g.typeName(method.GetOutputType()) + + g.P("func (c *", unexport(servName), "Client) ", g.generateClientSignature(servName, method), "{") + if !method.GetServerStreaming() && !method.GetClientStreaming() { + g.P("out := new(", outType, ")") + // TODO: Pass descExpr to Invoke. + g.P("err := ", grpcPkg, `.Invoke(ctx, "`, sname, `", in, out, c.cc, opts...)`) + g.P("if err != nil { return nil, err }") + g.P("return out, nil") + g.P("}") + g.P() + return + } + streamType := unexport(servName) + methName + "Client" + g.P("stream, err := ", grpcPkg, ".NewClientStream(ctx, ", descExpr, `, c.cc, "`, sname, `", opts...)`) + g.P("if err != nil { return nil, err }") + g.P("x := &", streamType, "{stream}") + if !method.GetClientStreaming() { + g.P("if err := x.ClientStream.SendMsg(in); err != nil { return nil, err }") + g.P("if err := x.ClientStream.CloseSend(); err != nil { return nil, err }") + } + g.P("return x, nil") + g.P("}") + g.P() + + genSend := method.GetClientStreaming() + genRecv := method.GetServerStreaming() + genCloseAndRecv := !method.GetServerStreaming() + + // Stream auxiliary types and methods. + g.P("type ", servName, "_", methName, "Client interface {") + if genSend { + g.P("Send(*", inType, ") error") + } + if genRecv { + g.P("Recv() (*", outType, ", error)") + } + if genCloseAndRecv { + g.P("CloseAndRecv() (*", outType, ", error)") + } + g.P(grpcPkg, ".ClientStream") + g.P("}") + g.P() + + g.P("type ", streamType, " struct {") + g.P(grpcPkg, ".ClientStream") + g.P("}") + g.P() + + if genSend { + g.P("func (x *", streamType, ") Send(m *", inType, ") error {") + g.P("return x.ClientStream.SendMsg(m)") + g.P("}") + g.P() + } + if genRecv { + g.P("func (x *", streamType, ") Recv() (*", outType, ", error) {") + g.P("m := new(", outType, ")") + g.P("if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err }") + g.P("return m, nil") + g.P("}") + g.P() + } + if genCloseAndRecv { + g.P("func (x *", streamType, ") CloseAndRecv() (*", outType, ", error) {") + g.P("if err := x.ClientStream.CloseSend(); err != nil { return nil, err }") + g.P("m := new(", outType, ")") + g.P("if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err }") + g.P("return m, nil") + g.P("}") + g.P() + } +} + +// generateServerSignature returns the server-side signature for a method. +func (g *grpc) generateServerSignature(servName string, method *pb.MethodDescriptorProto) string { + origMethName := method.GetName() + methName := generator.CamelCase(origMethName) + if reservedClientName[methName] { + methName += "_" + } + + var reqArgs []string + ret := "error" + if !method.GetServerStreaming() && !method.GetClientStreaming() { + reqArgs = append(reqArgs, contextPkg+".Context") + ret = "(*" + g.typeName(method.GetOutputType()) + ", error)" + } + if !method.GetClientStreaming() { + reqArgs = append(reqArgs, "*"+g.typeName(method.GetInputType())) + } + if method.GetServerStreaming() || method.GetClientStreaming() { + reqArgs = append(reqArgs, servName+"_"+generator.CamelCase(origMethName)+"Server") + } + + return methName + "(" + strings.Join(reqArgs, ", ") + ") " + ret +} + +func (g *grpc) generateServerMethod(servName, fullServName string, method *pb.MethodDescriptorProto) string { + methName := generator.CamelCase(method.GetName()) + hname := fmt.Sprintf("_%s_%s_Handler", servName, methName) + inType := g.typeName(method.GetInputType()) + outType := g.typeName(method.GetOutputType()) + + if !method.GetServerStreaming() && !method.GetClientStreaming() { + g.P("func ", hname, "(srv interface{}, ctx ", contextPkg, ".Context, dec func(interface{}) error, interceptor ", grpcPkg, ".UnaryServerInterceptor) (interface{}, error) {") + g.P("in := new(", inType, ")") + g.P("if err := dec(in); err != nil { return nil, err }") + g.P("if interceptor == nil { return srv.(", servName, "Server).", methName, "(ctx, in) }") + g.P("info := &", grpcPkg, ".UnaryServerInfo{") + g.P("Server: srv,") + g.P("FullMethod: ", strconv.Quote(fmt.Sprintf("/%s/%s", fullServName, methName)), ",") + g.P("}") + g.P("handler := func(ctx ", contextPkg, ".Context, req interface{}) (interface{}, error) {") + g.P("return srv.(", servName, "Server).", methName, "(ctx, req.(*", inType, "))") + g.P("}") + g.P("return interceptor(ctx, in, info, handler)") + g.P("}") + g.P() + return hname + } + streamType := unexport(servName) + methName + "Server" + g.P("func ", hname, "(srv interface{}, stream ", grpcPkg, ".ServerStream) error {") + if !method.GetClientStreaming() { + g.P("m := new(", inType, ")") + g.P("if err := stream.RecvMsg(m); err != nil { return err }") + g.P("return srv.(", servName, "Server).", methName, "(m, &", streamType, "{stream})") + } else { + g.P("return srv.(", servName, "Server).", methName, "(&", streamType, "{stream})") + } + g.P("}") + g.P() + + genSend := method.GetServerStreaming() + genSendAndClose := !method.GetServerStreaming() + genRecv := method.GetClientStreaming() + + // Stream auxiliary types and methods. + g.P("type ", servName, "_", methName, "Server interface {") + if genSend { + g.P("Send(*", outType, ") error") + } + if genSendAndClose { + g.P("SendAndClose(*", outType, ") error") + } + if genRecv { + g.P("Recv() (*", inType, ", error)") + } + g.P(grpcPkg, ".ServerStream") + g.P("}") + g.P() + + g.P("type ", streamType, " struct {") + g.P(grpcPkg, ".ServerStream") + g.P("}") + g.P() + + if genSend { + g.P("func (x *", streamType, ") Send(m *", outType, ") error {") + g.P("return x.ServerStream.SendMsg(m)") + g.P("}") + g.P() + } + if genSendAndClose { + g.P("func (x *", streamType, ") SendAndClose(m *", outType, ") error {") + g.P("return x.ServerStream.SendMsg(m)") + g.P("}") + g.P() + } + if genRecv { + g.P("func (x *", streamType, ") Recv() (*", inType, ", error) {") + g.P("m := new(", inType, ")") + g.P("if err := x.ServerStream.RecvMsg(m); err != nil { return nil, err }") + g.P("return m, nil") + g.P("}") + g.P() + } + + return hname +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/link_grpc.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/link_grpc.go new file mode 100644 index 0000000..532a550 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/link_grpc.go @@ -0,0 +1,34 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2015 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package main + +import _ "github.com/golang/protobuf/protoc-gen-go/grpc" diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/main.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/main.go new file mode 100644 index 0000000..8e2486d --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/main.go @@ -0,0 +1,98 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +// protoc-gen-go is a plugin for the Google protocol buffer compiler to generate +// Go code. Run it by building this program and putting it in your path with +// the name +// protoc-gen-go +// That word 'go' at the end becomes part of the option string set for the +// protocol compiler, so once the protocol compiler (protoc) is installed +// you can run +// protoc --go_out=output_directory input_directory/file.proto +// to generate Go bindings for the protocol defined by file.proto. +// With that input, the output will be written to +// output_directory/file.pb.go +// +// The generated code is documented in the package comment for +// the library. +// +// See the README and documentation for protocol buffers to learn more: +// https://developers.google.com/protocol-buffers/ +package main + +import ( + "io/ioutil" + "os" + + "github.com/golang/protobuf/proto" + "github.com/golang/protobuf/protoc-gen-go/generator" +) + +func main() { + // Begin by allocating a generator. The request and response structures are stored there + // so we can do error handling easily - the response structure contains the field to + // report failure. + g := generator.New() + + data, err := ioutil.ReadAll(os.Stdin) + if err != nil { + g.Error(err, "reading input") + } + + if err := proto.Unmarshal(data, g.Request); err != nil { + g.Error(err, "parsing input proto") + } + + if len(g.Request.FileToGenerate) == 0 { + g.Fail("no files to generate") + } + + g.CommandLineParameters(g.Request.GetParameter()) + + // Create a wrapped version of the Descriptors and EnumDescriptors that + // point to the file that defines them. + g.WrapTypes() + + g.SetPackageNames() + g.BuildTypeNameMap() + + g.GenerateAllFiles() + + // Send back the results. + data, err = proto.Marshal(g.Response) + if err != nil { + g.Error(err, "failed to marshal output proto") + } + _, err = os.Stdout.Write(data) + if err != nil { + g.Error(err, "failed to write output proto") + } +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/plugin/Makefile b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/plugin/Makefile new file mode 100644 index 0000000..bc0463d --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/plugin/Makefile @@ -0,0 +1,45 @@ +# Go support for Protocol Buffers - Google's data interchange format +# +# Copyright 2010 The Go Authors. All rights reserved. +# https://github.com/golang/protobuf +# +# 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. + +# Not stored here, but plugin.proto is in https://github.com/google/protobuf/ +# at src/google/protobuf/compiler/plugin.proto +# Also we need to fix an import. +regenerate: + @echo WARNING! THIS RULE IS PROBABLY NOT RIGHT FOR YOUR INSTALLATION + cp $(HOME)/src/protobuf/include/google/protobuf/compiler/plugin.proto . + protoc --go_out=Mgoogle/protobuf/descriptor.proto=github.com/golang/protobuf/protoc-gen-go/descriptor:../../../../.. \ + -I$(HOME)/src/protobuf/include $(HOME)/src/protobuf/include/google/protobuf/compiler/plugin.proto + +restore: + cp plugin.pb.golden plugin.pb.go + +preserve: + cp plugin.pb.go plugin.pb.golden diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.pb.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.pb.go new file mode 100644 index 0000000..c608a24 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.pb.go @@ -0,0 +1,293 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/compiler/plugin.proto + +/* +Package plugin_go is a generated protocol buffer package. + +It is generated from these files: + google/protobuf/compiler/plugin.proto + +It has these top-level messages: + Version + CodeGeneratorRequest + CodeGeneratorResponse +*/ +package plugin_go + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" +import google_protobuf "github.com/golang/protobuf/protoc-gen-go/descriptor" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +// The version number of protocol compiler. +type Version struct { + Major *int32 `protobuf:"varint,1,opt,name=major" json:"major,omitempty"` + Minor *int32 `protobuf:"varint,2,opt,name=minor" json:"minor,omitempty"` + Patch *int32 `protobuf:"varint,3,opt,name=patch" json:"patch,omitempty"` + // A suffix for alpha, beta or rc release, e.g., "alpha-1", "rc2". It should + // be empty for mainline stable releases. + Suffix *string `protobuf:"bytes,4,opt,name=suffix" json:"suffix,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Version) Reset() { *m = Version{} } +func (m *Version) String() string { return proto.CompactTextString(m) } +func (*Version) ProtoMessage() {} +func (*Version) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } + +func (m *Version) GetMajor() int32 { + if m != nil && m.Major != nil { + return *m.Major + } + return 0 +} + +func (m *Version) GetMinor() int32 { + if m != nil && m.Minor != nil { + return *m.Minor + } + return 0 +} + +func (m *Version) GetPatch() int32 { + if m != nil && m.Patch != nil { + return *m.Patch + } + return 0 +} + +func (m *Version) GetSuffix() string { + if m != nil && m.Suffix != nil { + return *m.Suffix + } + return "" +} + +// An encoded CodeGeneratorRequest is written to the plugin's stdin. +type CodeGeneratorRequest struct { + // The .proto files that were explicitly listed on the command-line. The + // code generator should generate code only for these files. Each file's + // descriptor will be included in proto_file, below. + FileToGenerate []string `protobuf:"bytes,1,rep,name=file_to_generate,json=fileToGenerate" json:"file_to_generate,omitempty"` + // The generator parameter passed on the command-line. + Parameter *string `protobuf:"bytes,2,opt,name=parameter" json:"parameter,omitempty"` + // FileDescriptorProtos for all files in files_to_generate and everything + // they import. The files will appear in topological order, so each file + // appears before any file that imports it. + // + // protoc guarantees that all proto_files will be written after + // the fields above, even though this is not technically guaranteed by the + // protobuf wire format. This theoretically could allow a plugin to stream + // in the FileDescriptorProtos and handle them one by one rather than read + // the entire set into memory at once. However, as of this writing, this + // is not similarly optimized on protoc's end -- it will store all fields in + // memory at once before sending them to the plugin. + // + // Type names of fields and extensions in the FileDescriptorProto are always + // fully qualified. + ProtoFile []*google_protobuf.FileDescriptorProto `protobuf:"bytes,15,rep,name=proto_file,json=protoFile" json:"proto_file,omitempty"` + // The version number of protocol compiler. + CompilerVersion *Version `protobuf:"bytes,3,opt,name=compiler_version,json=compilerVersion" json:"compiler_version,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *CodeGeneratorRequest) Reset() { *m = CodeGeneratorRequest{} } +func (m *CodeGeneratorRequest) String() string { return proto.CompactTextString(m) } +func (*CodeGeneratorRequest) ProtoMessage() {} +func (*CodeGeneratorRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } + +func (m *CodeGeneratorRequest) GetFileToGenerate() []string { + if m != nil { + return m.FileToGenerate + } + return nil +} + +func (m *CodeGeneratorRequest) GetParameter() string { + if m != nil && m.Parameter != nil { + return *m.Parameter + } + return "" +} + +func (m *CodeGeneratorRequest) GetProtoFile() []*google_protobuf.FileDescriptorProto { + if m != nil { + return m.ProtoFile + } + return nil +} + +func (m *CodeGeneratorRequest) GetCompilerVersion() *Version { + if m != nil { + return m.CompilerVersion + } + return nil +} + +// The plugin writes an encoded CodeGeneratorResponse to stdout. +type CodeGeneratorResponse struct { + // Error message. If non-empty, code generation failed. The plugin process + // should exit with status code zero even if it reports an error in this way. + // + // This should be used to indicate errors in .proto files which prevent the + // code generator from generating correct code. Errors which indicate a + // problem in protoc itself -- such as the input CodeGeneratorRequest being + // unparseable -- should be reported by writing a message to stderr and + // exiting with a non-zero status code. + Error *string `protobuf:"bytes,1,opt,name=error" json:"error,omitempty"` + File []*CodeGeneratorResponse_File `protobuf:"bytes,15,rep,name=file" json:"file,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *CodeGeneratorResponse) Reset() { *m = CodeGeneratorResponse{} } +func (m *CodeGeneratorResponse) String() string { return proto.CompactTextString(m) } +func (*CodeGeneratorResponse) ProtoMessage() {} +func (*CodeGeneratorResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } + +func (m *CodeGeneratorResponse) GetError() string { + if m != nil && m.Error != nil { + return *m.Error + } + return "" +} + +func (m *CodeGeneratorResponse) GetFile() []*CodeGeneratorResponse_File { + if m != nil { + return m.File + } + return nil +} + +// Represents a single generated file. +type CodeGeneratorResponse_File struct { + // The file name, relative to the output directory. The name must not + // contain "." or ".." components and must be relative, not be absolute (so, + // the file cannot lie outside the output directory). "/" must be used as + // the path separator, not "\". + // + // If the name is omitted, the content will be appended to the previous + // file. This allows the generator to break large files into small chunks, + // and allows the generated text to be streamed back to protoc so that large + // files need not reside completely in memory at one time. Note that as of + // this writing protoc does not optimize for this -- it will read the entire + // CodeGeneratorResponse before writing files to disk. + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + // If non-empty, indicates that the named file should already exist, and the + // content here is to be inserted into that file at a defined insertion + // point. This feature allows a code generator to extend the output + // produced by another code generator. The original generator may provide + // insertion points by placing special annotations in the file that look + // like: + // @@protoc_insertion_point(NAME) + // The annotation can have arbitrary text before and after it on the line, + // which allows it to be placed in a comment. NAME should be replaced with + // an identifier naming the point -- this is what other generators will use + // as the insertion_point. Code inserted at this point will be placed + // immediately above the line containing the insertion point (thus multiple + // insertions to the same point will come out in the order they were added). + // The double-@ is intended to make it unlikely that the generated code + // could contain things that look like insertion points by accident. + // + // For example, the C++ code generator places the following line in the + // .pb.h files that it generates: + // // @@protoc_insertion_point(namespace_scope) + // This line appears within the scope of the file's package namespace, but + // outside of any particular class. Another plugin can then specify the + // insertion_point "namespace_scope" to generate additional classes or + // other declarations that should be placed in this scope. + // + // Note that if the line containing the insertion point begins with + // whitespace, the same whitespace will be added to every line of the + // inserted text. This is useful for languages like Python, where + // indentation matters. In these languages, the insertion point comment + // should be indented the same amount as any inserted code will need to be + // in order to work correctly in that context. + // + // The code generator that generates the initial file and the one which + // inserts into it must both run as part of a single invocation of protoc. + // Code generators are executed in the order in which they appear on the + // command line. + // + // If |insertion_point| is present, |name| must also be present. + InsertionPoint *string `protobuf:"bytes,2,opt,name=insertion_point,json=insertionPoint" json:"insertion_point,omitempty"` + // The file contents. + Content *string `protobuf:"bytes,15,opt,name=content" json:"content,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *CodeGeneratorResponse_File) Reset() { *m = CodeGeneratorResponse_File{} } +func (m *CodeGeneratorResponse_File) String() string { return proto.CompactTextString(m) } +func (*CodeGeneratorResponse_File) ProtoMessage() {} +func (*CodeGeneratorResponse_File) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2, 0} } + +func (m *CodeGeneratorResponse_File) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *CodeGeneratorResponse_File) GetInsertionPoint() string { + if m != nil && m.InsertionPoint != nil { + return *m.InsertionPoint + } + return "" +} + +func (m *CodeGeneratorResponse_File) GetContent() string { + if m != nil && m.Content != nil { + return *m.Content + } + return "" +} + +func init() { + proto.RegisterType((*Version)(nil), "google.protobuf.compiler.Version") + proto.RegisterType((*CodeGeneratorRequest)(nil), "google.protobuf.compiler.CodeGeneratorRequest") + proto.RegisterType((*CodeGeneratorResponse)(nil), "google.protobuf.compiler.CodeGeneratorResponse") + proto.RegisterType((*CodeGeneratorResponse_File)(nil), "google.protobuf.compiler.CodeGeneratorResponse.File") +} + +func init() { proto.RegisterFile("google/protobuf/compiler/plugin.proto", fileDescriptor0) } + +var fileDescriptor0 = []byte{ + // 417 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x92, 0xcf, 0x6a, 0x14, 0x41, + 0x10, 0xc6, 0x19, 0x77, 0x63, 0x98, 0x8a, 0x64, 0x43, 0x13, 0xa5, 0x09, 0x39, 0x8c, 0x8b, 0xe2, + 0x5c, 0x32, 0x0b, 0xc1, 0x8b, 0x78, 0x4b, 0x44, 0x3d, 0x78, 0x58, 0x1a, 0xf1, 0x20, 0xc8, 0x30, + 0x99, 0xd4, 0x74, 0x5a, 0x66, 0xba, 0xc6, 0xee, 0x1e, 0xf1, 0x49, 0x7d, 0x0f, 0xdf, 0x40, 0xfa, + 0xcf, 0x24, 0xb2, 0xb8, 0xa7, 0xee, 0xef, 0x57, 0xd5, 0xd5, 0x55, 0x1f, 0x05, 0x2f, 0x25, 0x91, + 0xec, 0x71, 0x33, 0x1a, 0x72, 0x74, 0x33, 0x75, 0x9b, 0x96, 0x86, 0x51, 0xf5, 0x68, 0x36, 0x63, + 0x3f, 0x49, 0xa5, 0xab, 0x10, 0x60, 0x3c, 0xa6, 0x55, 0x73, 0x5a, 0x35, 0xa7, 0x9d, 0x15, 0xbb, + 0x05, 0x6e, 0xd1, 0xb6, 0x46, 0x8d, 0x8e, 0x4c, 0xcc, 0x5e, 0xb7, 0x70, 0xf8, 0x05, 0x8d, 0x55, + 0xa4, 0xd9, 0x29, 0x1c, 0x0c, 0xcd, 0x77, 0x32, 0x3c, 0x2b, 0xb2, 0xf2, 0x40, 0x44, 0x11, 0xa8, + 0xd2, 0x64, 0xf8, 0xa3, 0x44, 0xbd, 0xf0, 0x74, 0x6c, 0x5c, 0x7b, 0xc7, 0x17, 0x91, 0x06, 0xc1, + 0x9e, 0xc1, 0x63, 0x3b, 0x75, 0x9d, 0xfa, 0xc5, 0x97, 0x45, 0x56, 0xe6, 0x22, 0xa9, 0xf5, 0x9f, + 0x0c, 0x4e, 0xaf, 0xe9, 0x16, 0x3f, 0xa0, 0x46, 0xd3, 0x38, 0x32, 0x02, 0x7f, 0x4c, 0x68, 0x1d, + 0x2b, 0xe1, 0xa4, 0x53, 0x3d, 0xd6, 0x8e, 0x6a, 0x19, 0x63, 0xc8, 0xb3, 0x62, 0x51, 0xe6, 0xe2, + 0xd8, 0xf3, 0xcf, 0x94, 0x5e, 0x20, 0x3b, 0x87, 0x7c, 0x6c, 0x4c, 0x33, 0xa0, 0xc3, 0xd8, 0x4a, + 0x2e, 0x1e, 0x00, 0xbb, 0x06, 0x08, 0xe3, 0xd4, 0xfe, 0x15, 0x5f, 0x15, 0x8b, 0xf2, 0xe8, 0xf2, + 0x45, 0xb5, 0x6b, 0xcb, 0x7b, 0xd5, 0xe3, 0xbb, 0x7b, 0x03, 0xb6, 0x1e, 0x8b, 0x3c, 0x44, 0x7d, + 0x84, 0x7d, 0x82, 0x93, 0xd9, 0xb8, 0xfa, 0x67, 0xf4, 0x24, 0x8c, 0x77, 0x74, 0xf9, 0xbc, 0xda, + 0xe7, 0x70, 0x95, 0xcc, 0x13, 0xab, 0x99, 0x24, 0xb0, 0xfe, 0x9d, 0xc1, 0xd3, 0x9d, 0x99, 0xed, + 0x48, 0xda, 0xa2, 0xf7, 0x0e, 0x8d, 0x49, 0x3e, 0xe7, 0x22, 0x0a, 0xf6, 0x11, 0x96, 0xff, 0x34, + 0xff, 0x7a, 0xff, 0x8f, 0xff, 0x2d, 0x1a, 0x66, 0x13, 0xa1, 0xc2, 0xd9, 0x37, 0x58, 0x86, 0x79, + 0x18, 0x2c, 0x75, 0x33, 0x60, 0xfa, 0x26, 0xdc, 0xd9, 0x2b, 0x58, 0x29, 0x6d, 0xd1, 0x38, 0x45, + 0xba, 0x1e, 0x49, 0x69, 0x97, 0xcc, 0x3c, 0xbe, 0xc7, 0x5b, 0x4f, 0x19, 0x87, 0xc3, 0x96, 0xb4, + 0x43, 0xed, 0xf8, 0x2a, 0x24, 0xcc, 0xf2, 0x4a, 0xc2, 0x79, 0x4b, 0xc3, 0xde, 0xfe, 0xae, 0x9e, + 0x6c, 0xc3, 0x6e, 0x06, 0x7b, 0xed, 0xd7, 0x37, 0x52, 0xb9, 0xbb, 0xe9, 0xc6, 0x87, 0x37, 0x92, + 0xfa, 0x46, 0xcb, 0x87, 0x65, 0x0c, 0x97, 0xf6, 0x42, 0xa2, 0xbe, 0x90, 0x94, 0x56, 0xfa, 0x6d, + 0x3c, 0x6a, 0x49, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xf7, 0x15, 0x40, 0xc5, 0xfe, 0x02, 0x00, + 0x00, +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.pb.golden b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.pb.golden new file mode 100644 index 0000000..8953d0f --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.pb.golden @@ -0,0 +1,83 @@ +// Code generated by protoc-gen-go. +// source: google/protobuf/compiler/plugin.proto +// DO NOT EDIT! + +package google_protobuf_compiler + +import proto "github.com/golang/protobuf/proto" +import "math" +import google_protobuf "github.com/golang/protobuf/protoc-gen-go/descriptor" + +// Reference proto and math imports to suppress error if they are not otherwise used. +var _ = proto.GetString +var _ = math.Inf + +type CodeGeneratorRequest struct { + FileToGenerate []string `protobuf:"bytes,1,rep,name=file_to_generate" json:"file_to_generate,omitempty"` + Parameter *string `protobuf:"bytes,2,opt,name=parameter" json:"parameter,omitempty"` + ProtoFile []*google_protobuf.FileDescriptorProto `protobuf:"bytes,15,rep,name=proto_file" json:"proto_file,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (this *CodeGeneratorRequest) Reset() { *this = CodeGeneratorRequest{} } +func (this *CodeGeneratorRequest) String() string { return proto.CompactTextString(this) } +func (*CodeGeneratorRequest) ProtoMessage() {} + +func (this *CodeGeneratorRequest) GetParameter() string { + if this != nil && this.Parameter != nil { + return *this.Parameter + } + return "" +} + +type CodeGeneratorResponse struct { + Error *string `protobuf:"bytes,1,opt,name=error" json:"error,omitempty"` + File []*CodeGeneratorResponse_File `protobuf:"bytes,15,rep,name=file" json:"file,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (this *CodeGeneratorResponse) Reset() { *this = CodeGeneratorResponse{} } +func (this *CodeGeneratorResponse) String() string { return proto.CompactTextString(this) } +func (*CodeGeneratorResponse) ProtoMessage() {} + +func (this *CodeGeneratorResponse) GetError() string { + if this != nil && this.Error != nil { + return *this.Error + } + return "" +} + +type CodeGeneratorResponse_File struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + InsertionPoint *string `protobuf:"bytes,2,opt,name=insertion_point" json:"insertion_point,omitempty"` + Content *string `protobuf:"bytes,15,opt,name=content" json:"content,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (this *CodeGeneratorResponse_File) Reset() { *this = CodeGeneratorResponse_File{} } +func (this *CodeGeneratorResponse_File) String() string { return proto.CompactTextString(this) } +func (*CodeGeneratorResponse_File) ProtoMessage() {} + +func (this *CodeGeneratorResponse_File) GetName() string { + if this != nil && this.Name != nil { + return *this.Name + } + return "" +} + +func (this *CodeGeneratorResponse_File) GetInsertionPoint() string { + if this != nil && this.InsertionPoint != nil { + return *this.InsertionPoint + } + return "" +} + +func (this *CodeGeneratorResponse_File) GetContent() string { + if this != nil && this.Content != nil { + return *this.Content + } + return "" +} + +func init() { +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.proto b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.proto new file mode 100644 index 0000000..5b55745 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.proto @@ -0,0 +1,167 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// 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. + +// Author: kenton@google.com (Kenton Varda) +// +// WARNING: The plugin interface is currently EXPERIMENTAL and is subject to +// change. +// +// protoc (aka the Protocol Compiler) can be extended via plugins. A plugin is +// just a program that reads a CodeGeneratorRequest from stdin and writes a +// CodeGeneratorResponse to stdout. +// +// Plugins written using C++ can use google/protobuf/compiler/plugin.h instead +// of dealing with the raw protocol defined here. +// +// A plugin executable needs only to be placed somewhere in the path. The +// plugin should be named "protoc-gen-$NAME", and will then be used when the +// flag "--${NAME}_out" is passed to protoc. + +syntax = "proto2"; +package google.protobuf.compiler; +option java_package = "com.google.protobuf.compiler"; +option java_outer_classname = "PluginProtos"; + +option go_package = "github.com/golang/protobuf/protoc-gen-go/plugin;plugin_go"; + +import "google/protobuf/descriptor.proto"; + +// The version number of protocol compiler. +message Version { + optional int32 major = 1; + optional int32 minor = 2; + optional int32 patch = 3; + // A suffix for alpha, beta or rc release, e.g., "alpha-1", "rc2". It should + // be empty for mainline stable releases. + optional string suffix = 4; +} + +// An encoded CodeGeneratorRequest is written to the plugin's stdin. +message CodeGeneratorRequest { + // The .proto files that were explicitly listed on the command-line. The + // code generator should generate code only for these files. Each file's + // descriptor will be included in proto_file, below. + repeated string file_to_generate = 1; + + // The generator parameter passed on the command-line. + optional string parameter = 2; + + // FileDescriptorProtos for all files in files_to_generate and everything + // they import. The files will appear in topological order, so each file + // appears before any file that imports it. + // + // protoc guarantees that all proto_files will be written after + // the fields above, even though this is not technically guaranteed by the + // protobuf wire format. This theoretically could allow a plugin to stream + // in the FileDescriptorProtos and handle them one by one rather than read + // the entire set into memory at once. However, as of this writing, this + // is not similarly optimized on protoc's end -- it will store all fields in + // memory at once before sending them to the plugin. + // + // Type names of fields and extensions in the FileDescriptorProto are always + // fully qualified. + repeated FileDescriptorProto proto_file = 15; + + // The version number of protocol compiler. + optional Version compiler_version = 3; + +} + +// The plugin writes an encoded CodeGeneratorResponse to stdout. +message CodeGeneratorResponse { + // Error message. If non-empty, code generation failed. The plugin process + // should exit with status code zero even if it reports an error in this way. + // + // This should be used to indicate errors in .proto files which prevent the + // code generator from generating correct code. Errors which indicate a + // problem in protoc itself -- such as the input CodeGeneratorRequest being + // unparseable -- should be reported by writing a message to stderr and + // exiting with a non-zero status code. + optional string error = 1; + + // Represents a single generated file. + message File { + // The file name, relative to the output directory. The name must not + // contain "." or ".." components and must be relative, not be absolute (so, + // the file cannot lie outside the output directory). "/" must be used as + // the path separator, not "\". + // + // If the name is omitted, the content will be appended to the previous + // file. This allows the generator to break large files into small chunks, + // and allows the generated text to be streamed back to protoc so that large + // files need not reside completely in memory at one time. Note that as of + // this writing protoc does not optimize for this -- it will read the entire + // CodeGeneratorResponse before writing files to disk. + optional string name = 1; + + // If non-empty, indicates that the named file should already exist, and the + // content here is to be inserted into that file at a defined insertion + // point. This feature allows a code generator to extend the output + // produced by another code generator. The original generator may provide + // insertion points by placing special annotations in the file that look + // like: + // @@protoc_insertion_point(NAME) + // The annotation can have arbitrary text before and after it on the line, + // which allows it to be placed in a comment. NAME should be replaced with + // an identifier naming the point -- this is what other generators will use + // as the insertion_point. Code inserted at this point will be placed + // immediately above the line containing the insertion point (thus multiple + // insertions to the same point will come out in the order they were added). + // The double-@ is intended to make it unlikely that the generated code + // could contain things that look like insertion points by accident. + // + // For example, the C++ code generator places the following line in the + // .pb.h files that it generates: + // // @@protoc_insertion_point(namespace_scope) + // This line appears within the scope of the file's package namespace, but + // outside of any particular class. Another plugin can then specify the + // insertion_point "namespace_scope" to generate additional classes or + // other declarations that should be placed in this scope. + // + // Note that if the line containing the insertion point begins with + // whitespace, the same whitespace will be added to every line of the + // inserted text. This is useful for languages like Python, where + // indentation matters. In these languages, the insertion point comment + // should be indented the same amount as any inserted code will need to be + // in order to work correctly in that context. + // + // The code generator that generates the initial file and the one which + // inserts into it must both run as part of a single invocation of protoc. + // Code generators are executed in the order in which they appear on the + // command line. + // + // If |insertion_point| is present, |name| must also be present. + optional string insertion_point = 2; + + // The file contents. + optional string content = 15; + } + repeated File file = 15; +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/Makefile b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/Makefile new file mode 100644 index 0000000..a0bf9fe --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/Makefile @@ -0,0 +1,73 @@ +# Go support for Protocol Buffers - Google's data interchange format +# +# Copyright 2010 The Go Authors. All rights reserved. +# https://github.com/golang/protobuf +# +# 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. + +all: + @echo run make test + +include ../../Make.protobuf + +test: golden testbuild + +#test: golden testbuild extension_test +# ./extension_test +# @echo PASS + +my_test/test.pb.go: my_test/test.proto + protoc --go_out=Mmulti/multi1.proto=github.com/golang/protobuf/protoc-gen-go/testdata/multi:. $< + +golden: + make -B my_test/test.pb.go + sed -i -e '/return.*fileDescriptor/d' my_test/test.pb.go + sed -i -e '/^var fileDescriptor/,/^}/d' my_test/test.pb.go + sed -i -e '/proto.RegisterFile.*fileDescriptor/d' my_test/test.pb.go + gofmt -w my_test/test.pb.go + diff -w my_test/test.pb.go my_test/test.pb.go.golden + +nuke: clean + +testbuild: regenerate + go test + +regenerate: + # Invoke protoc once to generate three independent .pb.go files in the same package. + protoc --go_out=. multi/multi1.proto multi/multi2.proto multi/multi3.proto + +#extension_test: extension_test.$O +# $(LD) -L. -o $@ $< + +#multi.a: multi3.pb.$O multi2.pb.$O multi1.pb.$O +# rm -f multi.a +# $(QUOTED_GOBIN)/gopack grc $@ $< + +#test.pb.go: imp.pb.go +#multi1.pb.go: multi2.pb.go multi3.pb.go +#main.$O: imp.pb.$O test.pb.$O multi.a +#extension_test.$O: extension_base.pb.$O extension_extra.pb.$O extension_user.pb.$O diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_base.proto b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_base.proto new file mode 100644 index 0000000..94acfc1 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_base.proto @@ -0,0 +1,46 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto2"; + +package extension_base; + +message BaseMessage { + optional int32 height = 1; + extensions 4 to 9; + extensions 16 to max; +} + +// Another message that may be extended, using message_set_wire_format. +message OldStyleMessage { + option message_set_wire_format = true; + extensions 100 to max; +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_extra.proto b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_extra.proto new file mode 100644 index 0000000..fca7f60 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_extra.proto @@ -0,0 +1,38 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2011 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto2"; + +package extension_extra; + +message ExtraMessage { + optional int32 width = 1; +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_test.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_test.go new file mode 100644 index 0000000..86e9c11 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_test.go @@ -0,0 +1,210 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +// Test that we can use protocol buffers that use extensions. + +package testdata + +/* + +import ( + "bytes" + "regexp" + "testing" + + "github.com/golang/protobuf/proto" + base "extension_base.pb" + user "extension_user.pb" +) + +func TestSingleFieldExtension(t *testing.T) { + bm := &base.BaseMessage{ + Height: proto.Int32(178), + } + + // Use extension within scope of another type. + vol := proto.Uint32(11) + err := proto.SetExtension(bm, user.E_LoudMessage_Volume, vol) + if err != nil { + t.Fatal("Failed setting extension:", err) + } + buf, err := proto.Marshal(bm) + if err != nil { + t.Fatal("Failed encoding message with extension:", err) + } + bm_new := new(base.BaseMessage) + if err := proto.Unmarshal(buf, bm_new); err != nil { + t.Fatal("Failed decoding message with extension:", err) + } + if !proto.HasExtension(bm_new, user.E_LoudMessage_Volume) { + t.Fatal("Decoded message didn't contain extension.") + } + vol_out, err := proto.GetExtension(bm_new, user.E_LoudMessage_Volume) + if err != nil { + t.Fatal("Failed getting extension:", err) + } + if v := vol_out.(*uint32); *v != *vol { + t.Errorf("vol_out = %v, expected %v", *v, *vol) + } + proto.ClearExtension(bm_new, user.E_LoudMessage_Volume) + if proto.HasExtension(bm_new, user.E_LoudMessage_Volume) { + t.Fatal("Failed clearing extension.") + } +} + +func TestMessageExtension(t *testing.T) { + bm := &base.BaseMessage{ + Height: proto.Int32(179), + } + + // Use extension that is itself a message. + um := &user.UserMessage{ + Name: proto.String("Dave"), + Rank: proto.String("Major"), + } + err := proto.SetExtension(bm, user.E_LoginMessage_UserMessage, um) + if err != nil { + t.Fatal("Failed setting extension:", err) + } + buf, err := proto.Marshal(bm) + if err != nil { + t.Fatal("Failed encoding message with extension:", err) + } + bm_new := new(base.BaseMessage) + if err := proto.Unmarshal(buf, bm_new); err != nil { + t.Fatal("Failed decoding message with extension:", err) + } + if !proto.HasExtension(bm_new, user.E_LoginMessage_UserMessage) { + t.Fatal("Decoded message didn't contain extension.") + } + um_out, err := proto.GetExtension(bm_new, user.E_LoginMessage_UserMessage) + if err != nil { + t.Fatal("Failed getting extension:", err) + } + if n := um_out.(*user.UserMessage).Name; *n != *um.Name { + t.Errorf("um_out.Name = %q, expected %q", *n, *um.Name) + } + if r := um_out.(*user.UserMessage).Rank; *r != *um.Rank { + t.Errorf("um_out.Rank = %q, expected %q", *r, *um.Rank) + } + proto.ClearExtension(bm_new, user.E_LoginMessage_UserMessage) + if proto.HasExtension(bm_new, user.E_LoginMessage_UserMessage) { + t.Fatal("Failed clearing extension.") + } +} + +func TestTopLevelExtension(t *testing.T) { + bm := &base.BaseMessage{ + Height: proto.Int32(179), + } + + width := proto.Int32(17) + err := proto.SetExtension(bm, user.E_Width, width) + if err != nil { + t.Fatal("Failed setting extension:", err) + } + buf, err := proto.Marshal(bm) + if err != nil { + t.Fatal("Failed encoding message with extension:", err) + } + bm_new := new(base.BaseMessage) + if err := proto.Unmarshal(buf, bm_new); err != nil { + t.Fatal("Failed decoding message with extension:", err) + } + if !proto.HasExtension(bm_new, user.E_Width) { + t.Fatal("Decoded message didn't contain extension.") + } + width_out, err := proto.GetExtension(bm_new, user.E_Width) + if err != nil { + t.Fatal("Failed getting extension:", err) + } + if w := width_out.(*int32); *w != *width { + t.Errorf("width_out = %v, expected %v", *w, *width) + } + proto.ClearExtension(bm_new, user.E_Width) + if proto.HasExtension(bm_new, user.E_Width) { + t.Fatal("Failed clearing extension.") + } +} + +func TestMessageSetWireFormat(t *testing.T) { + osm := new(base.OldStyleMessage) + osp := &user.OldStyleParcel{ + Name: proto.String("Dave"), + Height: proto.Int32(178), + } + + err := proto.SetExtension(osm, user.E_OldStyleParcel_MessageSetExtension, osp) + if err != nil { + t.Fatal("Failed setting extension:", err) + } + + buf, err := proto.Marshal(osm) + if err != nil { + t.Fatal("Failed encoding message:", err) + } + + // Data generated from Python implementation. + expected := []byte{ + 11, 16, 209, 15, 26, 9, 10, 4, 68, 97, 118, 101, 16, 178, 1, 12, + } + + if !bytes.Equal(expected, buf) { + t.Errorf("Encoding mismatch.\nwant %+v\n got %+v", expected, buf) + } + + // Check that it is restored correctly. + osm = new(base.OldStyleMessage) + if err := proto.Unmarshal(buf, osm); err != nil { + t.Fatal("Failed decoding message:", err) + } + osp_out, err := proto.GetExtension(osm, user.E_OldStyleParcel_MessageSetExtension) + if err != nil { + t.Fatal("Failed getting extension:", err) + } + osp = osp_out.(*user.OldStyleParcel) + if *osp.Name != "Dave" || *osp.Height != 178 { + t.Errorf("Retrieved extension from decoded message is not correct: %+v", osp) + } +} + +func main() { + // simpler than rigging up gotest + testing.Main(regexp.MatchString, []testing.InternalTest{ + {"TestSingleFieldExtension", TestSingleFieldExtension}, + {"TestMessageExtension", TestMessageExtension}, + {"TestTopLevelExtension", TestTopLevelExtension}, + }, + []testing.InternalBenchmark{}, + []testing.InternalExample{}) +} + +*/ diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_user.proto b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_user.proto new file mode 100644 index 0000000..ff65873 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_user.proto @@ -0,0 +1,100 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto2"; + +import "extension_base.proto"; +import "extension_extra.proto"; + +package extension_user; + +message UserMessage { + optional string name = 1; + optional string rank = 2; +} + +// Extend with a message +extend extension_base.BaseMessage { + optional UserMessage user_message = 5; +} + +// Extend with a foreign message +extend extension_base.BaseMessage { + optional extension_extra.ExtraMessage extra_message = 9; +} + +// Extend with some primitive types +extend extension_base.BaseMessage { + optional int32 width = 6; + optional int64 area = 7; +} + +// Extend inside the scope of another type +message LoudMessage { + extend extension_base.BaseMessage { + optional uint32 volume = 8; + } + extensions 100 to max; +} + +// Extend inside the scope of another type, using a message. +message LoginMessage { + extend extension_base.BaseMessage { + optional UserMessage user_message = 16; + } +} + +// Extend with a repeated field +extend extension_base.BaseMessage { + repeated Detail detail = 17; +} + +message Detail { + optional string color = 1; +} + +// An extension of an extension +message Announcement { + optional string words = 1; + extend LoudMessage { + optional Announcement loud_ext = 100; + } +} + +// Something that can be put in a message set. +message OldStyleParcel { + extend extension_base.OldStyleMessage { + optional OldStyleParcel message_set_extension = 2001; + } + + required string name = 1; + optional int32 height = 2; +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/grpc.proto b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/grpc.proto new file mode 100644 index 0000000..b8bc41a --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/grpc.proto @@ -0,0 +1,59 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2015 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto3"; + +package grpc.testing; + +message SimpleRequest { +} + +message SimpleResponse { +} + +message StreamMsg { +} + +message StreamMsg2 { +} + +service Test { + rpc UnaryCall(SimpleRequest) returns (SimpleResponse); + + // This RPC streams from the server only. + rpc Downstream(SimpleRequest) returns (stream StreamMsg); + + // This RPC streams from the client. + rpc Upstream(stream StreamMsg) returns (SimpleResponse); + + // This one streams in both directions. + rpc Bidi(stream StreamMsg) returns (stream StreamMsg2); +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imp.pb.go.golden b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imp.pb.go.golden new file mode 100644 index 0000000..784a4f8 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imp.pb.go.golden @@ -0,0 +1,113 @@ +// Code generated by protoc-gen-go. +// source: imp.proto +// DO NOT EDIT! + +package imp + +import proto "github.com/golang/protobuf/proto" +import "math" +import "os" +import imp1 "imp2.pb" + +// Reference proto & math imports to suppress error if they are not otherwise used. +var _ = proto.GetString +var _ = math.Inf + +// Types from public import imp2.proto +type PubliclyImportedMessage imp1.PubliclyImportedMessage + +func (this *PubliclyImportedMessage) Reset() { (*imp1.PubliclyImportedMessage)(this).Reset() } +func (this *PubliclyImportedMessage) String() string { + return (*imp1.PubliclyImportedMessage)(this).String() +} + +// PubliclyImportedMessage from public import imp.proto + +type ImportedMessage_Owner int32 + +const ( + ImportedMessage_DAVE ImportedMessage_Owner = 1 + ImportedMessage_MIKE ImportedMessage_Owner = 2 +) + +var ImportedMessage_Owner_name = map[int32]string{ + 1: "DAVE", + 2: "MIKE", +} +var ImportedMessage_Owner_value = map[string]int32{ + "DAVE": 1, + "MIKE": 2, +} + +// NewImportedMessage_Owner is deprecated. Use x.Enum() instead. +func NewImportedMessage_Owner(x ImportedMessage_Owner) *ImportedMessage_Owner { + e := ImportedMessage_Owner(x) + return &e +} +func (x ImportedMessage_Owner) Enum() *ImportedMessage_Owner { + p := new(ImportedMessage_Owner) + *p = x + return p +} +func (x ImportedMessage_Owner) String() string { + return proto.EnumName(ImportedMessage_Owner_name, int32(x)) +} + +type ImportedMessage struct { + Field *int64 `protobuf:"varint,1,req,name=field" json:"field,omitempty"` + XXX_extensions map[int32][]byte `json:",omitempty"` + XXX_unrecognized []byte `json:",omitempty"` +} + +func (this *ImportedMessage) Reset() { *this = ImportedMessage{} } +func (this *ImportedMessage) String() string { return proto.CompactTextString(this) } + +var extRange_ImportedMessage = []proto.ExtensionRange{ + proto.ExtensionRange{90, 100}, +} + +func (*ImportedMessage) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_ImportedMessage +} +func (this *ImportedMessage) ExtensionMap() map[int32][]byte { + if this.XXX_extensions == nil { + this.XXX_extensions = make(map[int32][]byte) + } + return this.XXX_extensions +} + +type ImportedExtendable struct { + XXX_extensions map[int32][]byte `json:",omitempty"` + XXX_unrecognized []byte `json:",omitempty"` +} + +func (this *ImportedExtendable) Reset() { *this = ImportedExtendable{} } +func (this *ImportedExtendable) String() string { return proto.CompactTextString(this) } + +func (this *ImportedExtendable) Marshal() ([]byte, error) { + return proto.MarshalMessageSet(this.ExtensionMap()) +} +func (this *ImportedExtendable) Unmarshal(buf []byte) error { + return proto.UnmarshalMessageSet(buf, this.ExtensionMap()) +} +// ensure ImportedExtendable satisfies proto.Marshaler and proto.Unmarshaler +var _ proto.Marshaler = (*ImportedExtendable)(nil) +var _ proto.Unmarshaler = (*ImportedExtendable)(nil) + +var extRange_ImportedExtendable = []proto.ExtensionRange{ + proto.ExtensionRange{100, 536870911}, +} + +func (*ImportedExtendable) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_ImportedExtendable +} +func (this *ImportedExtendable) ExtensionMap() map[int32][]byte { + if this.XXX_extensions == nil { + this.XXX_extensions = make(map[int32][]byte) + } + return this.XXX_extensions +} + +func init() { + proto.RegisterEnum("imp.ImportedMessage_Owner", ImportedMessage_Owner_name, ImportedMessage_Owner_value) +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imp.proto b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imp.proto new file mode 100644 index 0000000..156e078 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imp.proto @@ -0,0 +1,70 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto2"; + +package imp; + +import "imp2.proto"; +import "imp3.proto"; + +message ImportedMessage { + required int64 field = 1; + + // The forwarded getters for these fields are fiddly to get right. + optional ImportedMessage2 local_msg = 2; + optional ForeignImportedMessage foreign_msg = 3; // in imp3.proto + optional Owner enum_field = 4; + oneof union { + int32 state = 9; + } + + repeated string name = 5; + repeated Owner boss = 6; + repeated ImportedMessage2 memo = 7; + + map msg_map = 8; + + enum Owner { + DAVE = 1; + MIKE = 2; + } + + extensions 90 to 100; +} + +message ImportedMessage2 { +} + +message ImportedExtendable { + option message_set_wire_format = true; + extensions 100 to max; +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imp2.proto b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imp2.proto new file mode 100644 index 0000000..3bb0632 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imp2.proto @@ -0,0 +1,43 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2011 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto2"; + +package imp; + +message PubliclyImportedMessage { + optional int64 field = 1; +} + +enum PubliclyImportedEnum { + GLASSES = 1; + HAIR = 2; +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imp3.proto b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imp3.proto new file mode 100644 index 0000000..58fc759 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imp3.proto @@ -0,0 +1,38 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2012 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto2"; + +package imp; + +message ForeignImportedMessage { + optional string tuber = 1; +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/main_test.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/main_test.go new file mode 100644 index 0000000..f9b5ccf --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/main_test.go @@ -0,0 +1,46 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +// A simple binary to link together the protocol buffers in this test. + +package testdata + +import ( + "testing" + + mytestpb "./my_test" + multipb "github.com/golang/protobuf/protoc-gen-go/testdata/multi" +) + +func TestLink(t *testing.T) { + _ = &multipb.Multi1{} + _ = &mytestpb.Request{} +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi1.proto b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi1.proto new file mode 100644 index 0000000..0da6e0a --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi1.proto @@ -0,0 +1,44 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto2"; + +import "multi/multi2.proto"; +import "multi/multi3.proto"; + +package multitest; + +message Multi1 { + required Multi2 multi2 = 1; + optional Multi2.Color color = 2; + optional Multi3.HatType hat_type = 3; +} + diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi2.proto b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi2.proto new file mode 100644 index 0000000..e6bfc71 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi2.proto @@ -0,0 +1,46 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto2"; + +package multitest; + +message Multi2 { + required int32 required_value = 1; + + enum Color { + BLUE = 1; + GREEN = 2; + RED = 3; + }; + optional Color color = 2; +} + diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi3.proto b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi3.proto new file mode 100644 index 0000000..146c255 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi3.proto @@ -0,0 +1,43 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto2"; + +package multitest; + +message Multi3 { + enum HatType { + FEDORA = 1; + FEZ = 2; + }; + optional HatType hat_type = 1; +} + diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/my_test/test.pb.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/my_test/test.pb.go new file mode 100644 index 0000000..1954e3f --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/my_test/test.pb.go @@ -0,0 +1,870 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: my_test/test.proto + +/* +Package my_test is a generated protocol buffer package. + +This package holds interesting messages. + +It is generated from these files: + my_test/test.proto + +It has these top-level messages: + Request + Reply + OtherBase + ReplyExtensions + OtherReplyExtensions + OldReply + Communique +*/ +package my_test + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" +import _ "github.com/golang/protobuf/protoc-gen-go/testdata/multi" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type HatType int32 + +const ( + // deliberately skipping 0 + HatType_FEDORA HatType = 1 + HatType_FEZ HatType = 2 +) + +var HatType_name = map[int32]string{ + 1: "FEDORA", + 2: "FEZ", +} +var HatType_value = map[string]int32{ + "FEDORA": 1, + "FEZ": 2, +} + +func (x HatType) Enum() *HatType { + p := new(HatType) + *p = x + return p +} +func (x HatType) String() string { + return proto.EnumName(HatType_name, int32(x)) +} +func (x *HatType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(HatType_value, data, "HatType") + if err != nil { + return err + } + *x = HatType(value) + return nil +} + +// This enum represents days of the week. +type Days int32 + +const ( + Days_MONDAY Days = 1 + Days_TUESDAY Days = 2 + Days_LUNDI Days = 1 +) + +var Days_name = map[int32]string{ + 1: "MONDAY", + 2: "TUESDAY", + // Duplicate value: 1: "LUNDI", +} +var Days_value = map[string]int32{ + "MONDAY": 1, + "TUESDAY": 2, + "LUNDI": 1, +} + +func (x Days) Enum() *Days { + p := new(Days) + *p = x + return p +} +func (x Days) String() string { + return proto.EnumName(Days_name, int32(x)) +} +func (x *Days) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Days_value, data, "Days") + if err != nil { + return err + } + *x = Days(value) + return nil +} + +type Request_Color int32 + +const ( + Request_RED Request_Color = 0 + Request_GREEN Request_Color = 1 + Request_BLUE Request_Color = 2 +) + +var Request_Color_name = map[int32]string{ + 0: "RED", + 1: "GREEN", + 2: "BLUE", +} +var Request_Color_value = map[string]int32{ + "RED": 0, + "GREEN": 1, + "BLUE": 2, +} + +func (x Request_Color) Enum() *Request_Color { + p := new(Request_Color) + *p = x + return p +} +func (x Request_Color) String() string { + return proto.EnumName(Request_Color_name, int32(x)) +} +func (x *Request_Color) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Request_Color_value, data, "Request_Color") + if err != nil { + return err + } + *x = Request_Color(value) + return nil +} + +type Reply_Entry_Game int32 + +const ( + Reply_Entry_FOOTBALL Reply_Entry_Game = 1 + Reply_Entry_TENNIS Reply_Entry_Game = 2 +) + +var Reply_Entry_Game_name = map[int32]string{ + 1: "FOOTBALL", + 2: "TENNIS", +} +var Reply_Entry_Game_value = map[string]int32{ + "FOOTBALL": 1, + "TENNIS": 2, +} + +func (x Reply_Entry_Game) Enum() *Reply_Entry_Game { + p := new(Reply_Entry_Game) + *p = x + return p +} +func (x Reply_Entry_Game) String() string { + return proto.EnumName(Reply_Entry_Game_name, int32(x)) +} +func (x *Reply_Entry_Game) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Reply_Entry_Game_value, data, "Reply_Entry_Game") + if err != nil { + return err + } + *x = Reply_Entry_Game(value) + return nil +} + +// This is a message that might be sent somewhere. +type Request struct { + Key []int64 `protobuf:"varint,1,rep,name=key" json:"key,omitempty"` + // optional imp.ImportedMessage imported_message = 2; + Hue *Request_Color `protobuf:"varint,3,opt,name=hue,enum=my.test.Request_Color" json:"hue,omitempty"` + Hat *HatType `protobuf:"varint,4,opt,name=hat,enum=my.test.HatType,def=1" json:"hat,omitempty"` + // optional imp.ImportedMessage.Owner owner = 6; + Deadline *float32 `protobuf:"fixed32,7,opt,name=deadline,def=inf" json:"deadline,omitempty"` + Somegroup *Request_SomeGroup `protobuf:"group,8,opt,name=SomeGroup,json=somegroup" json:"somegroup,omitempty"` + // This is a map field. It will generate map[int32]string. + NameMapping map[int32]string `protobuf:"bytes,14,rep,name=name_mapping,json=nameMapping" json:"name_mapping,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // This is a map field whose value type is a message. + MsgMapping map[int64]*Reply `protobuf:"bytes,15,rep,name=msg_mapping,json=msgMapping" json:"msg_mapping,omitempty" protobuf_key:"zigzag64,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + Reset_ *int32 `protobuf:"varint,12,opt,name=reset" json:"reset,omitempty"` + // This field should not conflict with any getters. + GetKey_ *string `protobuf:"bytes,16,opt,name=get_key,json=getKey" json:"get_key,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Request) Reset() { *m = Request{} } +func (m *Request) String() string { return proto.CompactTextString(m) } +func (*Request) ProtoMessage() {} + +const Default_Request_Hat HatType = HatType_FEDORA + +var Default_Request_Deadline float32 = float32(math.Inf(1)) + +func (m *Request) GetKey() []int64 { + if m != nil { + return m.Key + } + return nil +} + +func (m *Request) GetHue() Request_Color { + if m != nil && m.Hue != nil { + return *m.Hue + } + return Request_RED +} + +func (m *Request) GetHat() HatType { + if m != nil && m.Hat != nil { + return *m.Hat + } + return Default_Request_Hat +} + +func (m *Request) GetDeadline() float32 { + if m != nil && m.Deadline != nil { + return *m.Deadline + } + return Default_Request_Deadline +} + +func (m *Request) GetSomegroup() *Request_SomeGroup { + if m != nil { + return m.Somegroup + } + return nil +} + +func (m *Request) GetNameMapping() map[int32]string { + if m != nil { + return m.NameMapping + } + return nil +} + +func (m *Request) GetMsgMapping() map[int64]*Reply { + if m != nil { + return m.MsgMapping + } + return nil +} + +func (m *Request) GetReset_() int32 { + if m != nil && m.Reset_ != nil { + return *m.Reset_ + } + return 0 +} + +func (m *Request) GetGetKey_() string { + if m != nil && m.GetKey_ != nil { + return *m.GetKey_ + } + return "" +} + +type Request_SomeGroup struct { + GroupField *int32 `protobuf:"varint,9,opt,name=group_field,json=groupField" json:"group_field,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Request_SomeGroup) Reset() { *m = Request_SomeGroup{} } +func (m *Request_SomeGroup) String() string { return proto.CompactTextString(m) } +func (*Request_SomeGroup) ProtoMessage() {} + +func (m *Request_SomeGroup) GetGroupField() int32 { + if m != nil && m.GroupField != nil { + return *m.GroupField + } + return 0 +} + +type Reply struct { + Found []*Reply_Entry `protobuf:"bytes,1,rep,name=found" json:"found,omitempty"` + CompactKeys []int32 `protobuf:"varint,2,rep,packed,name=compact_keys,json=compactKeys" json:"compact_keys,omitempty"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Reply) Reset() { *m = Reply{} } +func (m *Reply) String() string { return proto.CompactTextString(m) } +func (*Reply) ProtoMessage() {} + +var extRange_Reply = []proto.ExtensionRange{ + {100, 536870911}, +} + +func (*Reply) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_Reply +} + +func (m *Reply) GetFound() []*Reply_Entry { + if m != nil { + return m.Found + } + return nil +} + +func (m *Reply) GetCompactKeys() []int32 { + if m != nil { + return m.CompactKeys + } + return nil +} + +type Reply_Entry struct { + KeyThatNeeds_1234Camel_CasIng *int64 `protobuf:"varint,1,req,name=key_that_needs_1234camel_CasIng,json=keyThatNeeds1234camelCasIng" json:"key_that_needs_1234camel_CasIng,omitempty"` + Value *int64 `protobuf:"varint,2,opt,name=value,def=7" json:"value,omitempty"` + XMyFieldName_2 *int64 `protobuf:"varint,3,opt,name=_my_field_name_2,json=MyFieldName2" json:"_my_field_name_2,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Reply_Entry) Reset() { *m = Reply_Entry{} } +func (m *Reply_Entry) String() string { return proto.CompactTextString(m) } +func (*Reply_Entry) ProtoMessage() {} + +const Default_Reply_Entry_Value int64 = 7 + +func (m *Reply_Entry) GetKeyThatNeeds_1234Camel_CasIng() int64 { + if m != nil && m.KeyThatNeeds_1234Camel_CasIng != nil { + return *m.KeyThatNeeds_1234Camel_CasIng + } + return 0 +} + +func (m *Reply_Entry) GetValue() int64 { + if m != nil && m.Value != nil { + return *m.Value + } + return Default_Reply_Entry_Value +} + +func (m *Reply_Entry) GetXMyFieldName_2() int64 { + if m != nil && m.XMyFieldName_2 != nil { + return *m.XMyFieldName_2 + } + return 0 +} + +type OtherBase struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *OtherBase) Reset() { *m = OtherBase{} } +func (m *OtherBase) String() string { return proto.CompactTextString(m) } +func (*OtherBase) ProtoMessage() {} + +var extRange_OtherBase = []proto.ExtensionRange{ + {100, 536870911}, +} + +func (*OtherBase) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_OtherBase +} + +func (m *OtherBase) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +type ReplyExtensions struct { + XXX_unrecognized []byte `json:"-"` +} + +func (m *ReplyExtensions) Reset() { *m = ReplyExtensions{} } +func (m *ReplyExtensions) String() string { return proto.CompactTextString(m) } +func (*ReplyExtensions) ProtoMessage() {} + +var E_ReplyExtensions_Time = &proto.ExtensionDesc{ + ExtendedType: (*Reply)(nil), + ExtensionType: (*float64)(nil), + Field: 101, + Name: "my.test.ReplyExtensions.time", + Tag: "fixed64,101,opt,name=time", + Filename: "my_test/test.proto", +} + +var E_ReplyExtensions_Carrot = &proto.ExtensionDesc{ + ExtendedType: (*Reply)(nil), + ExtensionType: (*ReplyExtensions)(nil), + Field: 105, + Name: "my.test.ReplyExtensions.carrot", + Tag: "bytes,105,opt,name=carrot", + Filename: "my_test/test.proto", +} + +var E_ReplyExtensions_Donut = &proto.ExtensionDesc{ + ExtendedType: (*OtherBase)(nil), + ExtensionType: (*ReplyExtensions)(nil), + Field: 101, + Name: "my.test.ReplyExtensions.donut", + Tag: "bytes,101,opt,name=donut", + Filename: "my_test/test.proto", +} + +type OtherReplyExtensions struct { + Key *int32 `protobuf:"varint,1,opt,name=key" json:"key,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *OtherReplyExtensions) Reset() { *m = OtherReplyExtensions{} } +func (m *OtherReplyExtensions) String() string { return proto.CompactTextString(m) } +func (*OtherReplyExtensions) ProtoMessage() {} + +func (m *OtherReplyExtensions) GetKey() int32 { + if m != nil && m.Key != nil { + return *m.Key + } + return 0 +} + +type OldReply struct { + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *OldReply) Reset() { *m = OldReply{} } +func (m *OldReply) String() string { return proto.CompactTextString(m) } +func (*OldReply) ProtoMessage() {} + +func (m *OldReply) Marshal() ([]byte, error) { + return proto.MarshalMessageSet(&m.XXX_InternalExtensions) +} +func (m *OldReply) Unmarshal(buf []byte) error { + return proto.UnmarshalMessageSet(buf, &m.XXX_InternalExtensions) +} +func (m *OldReply) MarshalJSON() ([]byte, error) { + return proto.MarshalMessageSetJSON(&m.XXX_InternalExtensions) +} +func (m *OldReply) UnmarshalJSON(buf []byte) error { + return proto.UnmarshalMessageSetJSON(buf, &m.XXX_InternalExtensions) +} + +// ensure OldReply satisfies proto.Marshaler and proto.Unmarshaler +var _ proto.Marshaler = (*OldReply)(nil) +var _ proto.Unmarshaler = (*OldReply)(nil) + +var extRange_OldReply = []proto.ExtensionRange{ + {100, 2147483646}, +} + +func (*OldReply) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_OldReply +} + +type Communique struct { + MakeMeCry *bool `protobuf:"varint,1,opt,name=make_me_cry,json=makeMeCry" json:"make_me_cry,omitempty"` + // This is a oneof, called "union". + // + // Types that are valid to be assigned to Union: + // *Communique_Number + // *Communique_Name + // *Communique_Data + // *Communique_TempC + // *Communique_Height + // *Communique_Today + // *Communique_Maybe + // *Communique_Delta_ + // *Communique_Msg + // *Communique_Somegroup + Union isCommunique_Union `protobuf_oneof:"union"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Communique) Reset() { *m = Communique{} } +func (m *Communique) String() string { return proto.CompactTextString(m) } +func (*Communique) ProtoMessage() {} + +type isCommunique_Union interface { + isCommunique_Union() +} + +type Communique_Number struct { + Number int32 `protobuf:"varint,5,opt,name=number,oneof"` +} +type Communique_Name struct { + Name string `protobuf:"bytes,6,opt,name=name,oneof"` +} +type Communique_Data struct { + Data []byte `protobuf:"bytes,7,opt,name=data,oneof"` +} +type Communique_TempC struct { + TempC float64 `protobuf:"fixed64,8,opt,name=temp_c,json=tempC,oneof"` +} +type Communique_Height struct { + Height float32 `protobuf:"fixed32,9,opt,name=height,oneof"` +} +type Communique_Today struct { + Today Days `protobuf:"varint,10,opt,name=today,enum=my.test.Days,oneof"` +} +type Communique_Maybe struct { + Maybe bool `protobuf:"varint,11,opt,name=maybe,oneof"` +} +type Communique_Delta_ struct { + Delta int32 `protobuf:"zigzag32,12,opt,name=delta,oneof"` +} +type Communique_Msg struct { + Msg *Reply `protobuf:"bytes,13,opt,name=msg,oneof"` +} +type Communique_Somegroup struct { + Somegroup *Communique_SomeGroup `protobuf:"group,14,opt,name=SomeGroup,json=somegroup,oneof"` +} + +func (*Communique_Number) isCommunique_Union() {} +func (*Communique_Name) isCommunique_Union() {} +func (*Communique_Data) isCommunique_Union() {} +func (*Communique_TempC) isCommunique_Union() {} +func (*Communique_Height) isCommunique_Union() {} +func (*Communique_Today) isCommunique_Union() {} +func (*Communique_Maybe) isCommunique_Union() {} +func (*Communique_Delta_) isCommunique_Union() {} +func (*Communique_Msg) isCommunique_Union() {} +func (*Communique_Somegroup) isCommunique_Union() {} + +func (m *Communique) GetUnion() isCommunique_Union { + if m != nil { + return m.Union + } + return nil +} + +func (m *Communique) GetMakeMeCry() bool { + if m != nil && m.MakeMeCry != nil { + return *m.MakeMeCry + } + return false +} + +func (m *Communique) GetNumber() int32 { + if x, ok := m.GetUnion().(*Communique_Number); ok { + return x.Number + } + return 0 +} + +func (m *Communique) GetName() string { + if x, ok := m.GetUnion().(*Communique_Name); ok { + return x.Name + } + return "" +} + +func (m *Communique) GetData() []byte { + if x, ok := m.GetUnion().(*Communique_Data); ok { + return x.Data + } + return nil +} + +func (m *Communique) GetTempC() float64 { + if x, ok := m.GetUnion().(*Communique_TempC); ok { + return x.TempC + } + return 0 +} + +func (m *Communique) GetHeight() float32 { + if x, ok := m.GetUnion().(*Communique_Height); ok { + return x.Height + } + return 0 +} + +func (m *Communique) GetToday() Days { + if x, ok := m.GetUnion().(*Communique_Today); ok { + return x.Today + } + return Days_MONDAY +} + +func (m *Communique) GetMaybe() bool { + if x, ok := m.GetUnion().(*Communique_Maybe); ok { + return x.Maybe + } + return false +} + +func (m *Communique) GetDelta() int32 { + if x, ok := m.GetUnion().(*Communique_Delta_); ok { + return x.Delta + } + return 0 +} + +func (m *Communique) GetMsg() *Reply { + if x, ok := m.GetUnion().(*Communique_Msg); ok { + return x.Msg + } + return nil +} + +func (m *Communique) GetSomegroup() *Communique_SomeGroup { + if x, ok := m.GetUnion().(*Communique_Somegroup); ok { + return x.Somegroup + } + return nil +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*Communique) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _Communique_OneofMarshaler, _Communique_OneofUnmarshaler, _Communique_OneofSizer, []interface{}{ + (*Communique_Number)(nil), + (*Communique_Name)(nil), + (*Communique_Data)(nil), + (*Communique_TempC)(nil), + (*Communique_Height)(nil), + (*Communique_Today)(nil), + (*Communique_Maybe)(nil), + (*Communique_Delta_)(nil), + (*Communique_Msg)(nil), + (*Communique_Somegroup)(nil), + } +} + +func _Communique_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*Communique) + // union + switch x := m.Union.(type) { + case *Communique_Number: + b.EncodeVarint(5<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.Number)) + case *Communique_Name: + b.EncodeVarint(6<<3 | proto.WireBytes) + b.EncodeStringBytes(x.Name) + case *Communique_Data: + b.EncodeVarint(7<<3 | proto.WireBytes) + b.EncodeRawBytes(x.Data) + case *Communique_TempC: + b.EncodeVarint(8<<3 | proto.WireFixed64) + b.EncodeFixed64(math.Float64bits(x.TempC)) + case *Communique_Height: + b.EncodeVarint(9<<3 | proto.WireFixed32) + b.EncodeFixed32(uint64(math.Float32bits(x.Height))) + case *Communique_Today: + b.EncodeVarint(10<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.Today)) + case *Communique_Maybe: + t := uint64(0) + if x.Maybe { + t = 1 + } + b.EncodeVarint(11<<3 | proto.WireVarint) + b.EncodeVarint(t) + case *Communique_Delta_: + b.EncodeVarint(12<<3 | proto.WireVarint) + b.EncodeZigzag32(uint64(x.Delta)) + case *Communique_Msg: + b.EncodeVarint(13<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.Msg); err != nil { + return err + } + case *Communique_Somegroup: + b.EncodeVarint(14<<3 | proto.WireStartGroup) + if err := b.Marshal(x.Somegroup); err != nil { + return err + } + b.EncodeVarint(14<<3 | proto.WireEndGroup) + case nil: + default: + return fmt.Errorf("Communique.Union has unexpected type %T", x) + } + return nil +} + +func _Communique_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*Communique) + switch tag { + case 5: // union.number + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Communique_Number{int32(x)} + return true, err + case 6: // union.name + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeStringBytes() + m.Union = &Communique_Name{x} + return true, err + case 7: // union.data + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeRawBytes(true) + m.Union = &Communique_Data{x} + return true, err + case 8: // union.temp_c + if wire != proto.WireFixed64 { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeFixed64() + m.Union = &Communique_TempC{math.Float64frombits(x)} + return true, err + case 9: // union.height + if wire != proto.WireFixed32 { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeFixed32() + m.Union = &Communique_Height{math.Float32frombits(uint32(x))} + return true, err + case 10: // union.today + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Communique_Today{Days(x)} + return true, err + case 11: // union.maybe + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Communique_Maybe{x != 0} + return true, err + case 12: // union.delta + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeZigzag32() + m.Union = &Communique_Delta_{int32(x)} + return true, err + case 13: // union.msg + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(Reply) + err := b.DecodeMessage(msg) + m.Union = &Communique_Msg{msg} + return true, err + case 14: // union.somegroup + if wire != proto.WireStartGroup { + return true, proto.ErrInternalBadWireType + } + msg := new(Communique_SomeGroup) + err := b.DecodeGroup(msg) + m.Union = &Communique_Somegroup{msg} + return true, err + default: + return false, nil + } +} + +func _Communique_OneofSizer(msg proto.Message) (n int) { + m := msg.(*Communique) + // union + switch x := m.Union.(type) { + case *Communique_Number: + n += proto.SizeVarint(5<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.Number)) + case *Communique_Name: + n += proto.SizeVarint(6<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(len(x.Name))) + n += len(x.Name) + case *Communique_Data: + n += proto.SizeVarint(7<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(len(x.Data))) + n += len(x.Data) + case *Communique_TempC: + n += proto.SizeVarint(8<<3 | proto.WireFixed64) + n += 8 + case *Communique_Height: + n += proto.SizeVarint(9<<3 | proto.WireFixed32) + n += 4 + case *Communique_Today: + n += proto.SizeVarint(10<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.Today)) + case *Communique_Maybe: + n += proto.SizeVarint(11<<3 | proto.WireVarint) + n += 1 + case *Communique_Delta_: + n += proto.SizeVarint(12<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64((uint32(x.Delta) << 1) ^ uint32((int32(x.Delta) >> 31)))) + case *Communique_Msg: + s := proto.Size(x.Msg) + n += proto.SizeVarint(13<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case *Communique_Somegroup: + n += proto.SizeVarint(14<<3 | proto.WireStartGroup) + n += proto.Size(x.Somegroup) + n += proto.SizeVarint(14<<3 | proto.WireEndGroup) + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +type Communique_SomeGroup struct { + Member *string `protobuf:"bytes,15,opt,name=member" json:"member,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Communique_SomeGroup) Reset() { *m = Communique_SomeGroup{} } +func (m *Communique_SomeGroup) String() string { return proto.CompactTextString(m) } +func (*Communique_SomeGroup) ProtoMessage() {} + +func (m *Communique_SomeGroup) GetMember() string { + if m != nil && m.Member != nil { + return *m.Member + } + return "" +} + +type Communique_Delta struct { + XXX_unrecognized []byte `json:"-"` +} + +func (m *Communique_Delta) Reset() { *m = Communique_Delta{} } +func (m *Communique_Delta) String() string { return proto.CompactTextString(m) } +func (*Communique_Delta) ProtoMessage() {} + +var E_Tag = &proto.ExtensionDesc{ + ExtendedType: (*Reply)(nil), + ExtensionType: (*string)(nil), + Field: 103, + Name: "my.test.tag", + Tag: "bytes,103,opt,name=tag", + Filename: "my_test/test.proto", +} + +var E_Donut = &proto.ExtensionDesc{ + ExtendedType: (*Reply)(nil), + ExtensionType: (*OtherReplyExtensions)(nil), + Field: 106, + Name: "my.test.donut", + Tag: "bytes,106,opt,name=donut", + Filename: "my_test/test.proto", +} + +func init() { + proto.RegisterType((*Request)(nil), "my.test.Request") + proto.RegisterType((*Request_SomeGroup)(nil), "my.test.Request.SomeGroup") + proto.RegisterType((*Reply)(nil), "my.test.Reply") + proto.RegisterType((*Reply_Entry)(nil), "my.test.Reply.Entry") + proto.RegisterType((*OtherBase)(nil), "my.test.OtherBase") + proto.RegisterType((*ReplyExtensions)(nil), "my.test.ReplyExtensions") + proto.RegisterType((*OtherReplyExtensions)(nil), "my.test.OtherReplyExtensions") + proto.RegisterType((*OldReply)(nil), "my.test.OldReply") + proto.RegisterType((*Communique)(nil), "my.test.Communique") + proto.RegisterType((*Communique_SomeGroup)(nil), "my.test.Communique.SomeGroup") + proto.RegisterType((*Communique_Delta)(nil), "my.test.Communique.Delta") + proto.RegisterEnum("my.test.HatType", HatType_name, HatType_value) + proto.RegisterEnum("my.test.Days", Days_name, Days_value) + proto.RegisterEnum("my.test.Request_Color", Request_Color_name, Request_Color_value) + proto.RegisterEnum("my.test.Reply_Entry_Game", Reply_Entry_Game_name, Reply_Entry_Game_value) + proto.RegisterExtension(E_ReplyExtensions_Time) + proto.RegisterExtension(E_ReplyExtensions_Carrot) + proto.RegisterExtension(E_ReplyExtensions_Donut) + proto.RegisterExtension(E_Tag) + proto.RegisterExtension(E_Donut) +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/my_test/test.pb.go.golden b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/my_test/test.pb.go.golden new file mode 100644 index 0000000..1954e3f --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/my_test/test.pb.go.golden @@ -0,0 +1,870 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: my_test/test.proto + +/* +Package my_test is a generated protocol buffer package. + +This package holds interesting messages. + +It is generated from these files: + my_test/test.proto + +It has these top-level messages: + Request + Reply + OtherBase + ReplyExtensions + OtherReplyExtensions + OldReply + Communique +*/ +package my_test + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" +import _ "github.com/golang/protobuf/protoc-gen-go/testdata/multi" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type HatType int32 + +const ( + // deliberately skipping 0 + HatType_FEDORA HatType = 1 + HatType_FEZ HatType = 2 +) + +var HatType_name = map[int32]string{ + 1: "FEDORA", + 2: "FEZ", +} +var HatType_value = map[string]int32{ + "FEDORA": 1, + "FEZ": 2, +} + +func (x HatType) Enum() *HatType { + p := new(HatType) + *p = x + return p +} +func (x HatType) String() string { + return proto.EnumName(HatType_name, int32(x)) +} +func (x *HatType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(HatType_value, data, "HatType") + if err != nil { + return err + } + *x = HatType(value) + return nil +} + +// This enum represents days of the week. +type Days int32 + +const ( + Days_MONDAY Days = 1 + Days_TUESDAY Days = 2 + Days_LUNDI Days = 1 +) + +var Days_name = map[int32]string{ + 1: "MONDAY", + 2: "TUESDAY", + // Duplicate value: 1: "LUNDI", +} +var Days_value = map[string]int32{ + "MONDAY": 1, + "TUESDAY": 2, + "LUNDI": 1, +} + +func (x Days) Enum() *Days { + p := new(Days) + *p = x + return p +} +func (x Days) String() string { + return proto.EnumName(Days_name, int32(x)) +} +func (x *Days) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Days_value, data, "Days") + if err != nil { + return err + } + *x = Days(value) + return nil +} + +type Request_Color int32 + +const ( + Request_RED Request_Color = 0 + Request_GREEN Request_Color = 1 + Request_BLUE Request_Color = 2 +) + +var Request_Color_name = map[int32]string{ + 0: "RED", + 1: "GREEN", + 2: "BLUE", +} +var Request_Color_value = map[string]int32{ + "RED": 0, + "GREEN": 1, + "BLUE": 2, +} + +func (x Request_Color) Enum() *Request_Color { + p := new(Request_Color) + *p = x + return p +} +func (x Request_Color) String() string { + return proto.EnumName(Request_Color_name, int32(x)) +} +func (x *Request_Color) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Request_Color_value, data, "Request_Color") + if err != nil { + return err + } + *x = Request_Color(value) + return nil +} + +type Reply_Entry_Game int32 + +const ( + Reply_Entry_FOOTBALL Reply_Entry_Game = 1 + Reply_Entry_TENNIS Reply_Entry_Game = 2 +) + +var Reply_Entry_Game_name = map[int32]string{ + 1: "FOOTBALL", + 2: "TENNIS", +} +var Reply_Entry_Game_value = map[string]int32{ + "FOOTBALL": 1, + "TENNIS": 2, +} + +func (x Reply_Entry_Game) Enum() *Reply_Entry_Game { + p := new(Reply_Entry_Game) + *p = x + return p +} +func (x Reply_Entry_Game) String() string { + return proto.EnumName(Reply_Entry_Game_name, int32(x)) +} +func (x *Reply_Entry_Game) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Reply_Entry_Game_value, data, "Reply_Entry_Game") + if err != nil { + return err + } + *x = Reply_Entry_Game(value) + return nil +} + +// This is a message that might be sent somewhere. +type Request struct { + Key []int64 `protobuf:"varint,1,rep,name=key" json:"key,omitempty"` + // optional imp.ImportedMessage imported_message = 2; + Hue *Request_Color `protobuf:"varint,3,opt,name=hue,enum=my.test.Request_Color" json:"hue,omitempty"` + Hat *HatType `protobuf:"varint,4,opt,name=hat,enum=my.test.HatType,def=1" json:"hat,omitempty"` + // optional imp.ImportedMessage.Owner owner = 6; + Deadline *float32 `protobuf:"fixed32,7,opt,name=deadline,def=inf" json:"deadline,omitempty"` + Somegroup *Request_SomeGroup `protobuf:"group,8,opt,name=SomeGroup,json=somegroup" json:"somegroup,omitempty"` + // This is a map field. It will generate map[int32]string. + NameMapping map[int32]string `protobuf:"bytes,14,rep,name=name_mapping,json=nameMapping" json:"name_mapping,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // This is a map field whose value type is a message. + MsgMapping map[int64]*Reply `protobuf:"bytes,15,rep,name=msg_mapping,json=msgMapping" json:"msg_mapping,omitempty" protobuf_key:"zigzag64,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + Reset_ *int32 `protobuf:"varint,12,opt,name=reset" json:"reset,omitempty"` + // This field should not conflict with any getters. + GetKey_ *string `protobuf:"bytes,16,opt,name=get_key,json=getKey" json:"get_key,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Request) Reset() { *m = Request{} } +func (m *Request) String() string { return proto.CompactTextString(m) } +func (*Request) ProtoMessage() {} + +const Default_Request_Hat HatType = HatType_FEDORA + +var Default_Request_Deadline float32 = float32(math.Inf(1)) + +func (m *Request) GetKey() []int64 { + if m != nil { + return m.Key + } + return nil +} + +func (m *Request) GetHue() Request_Color { + if m != nil && m.Hue != nil { + return *m.Hue + } + return Request_RED +} + +func (m *Request) GetHat() HatType { + if m != nil && m.Hat != nil { + return *m.Hat + } + return Default_Request_Hat +} + +func (m *Request) GetDeadline() float32 { + if m != nil && m.Deadline != nil { + return *m.Deadline + } + return Default_Request_Deadline +} + +func (m *Request) GetSomegroup() *Request_SomeGroup { + if m != nil { + return m.Somegroup + } + return nil +} + +func (m *Request) GetNameMapping() map[int32]string { + if m != nil { + return m.NameMapping + } + return nil +} + +func (m *Request) GetMsgMapping() map[int64]*Reply { + if m != nil { + return m.MsgMapping + } + return nil +} + +func (m *Request) GetReset_() int32 { + if m != nil && m.Reset_ != nil { + return *m.Reset_ + } + return 0 +} + +func (m *Request) GetGetKey_() string { + if m != nil && m.GetKey_ != nil { + return *m.GetKey_ + } + return "" +} + +type Request_SomeGroup struct { + GroupField *int32 `protobuf:"varint,9,opt,name=group_field,json=groupField" json:"group_field,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Request_SomeGroup) Reset() { *m = Request_SomeGroup{} } +func (m *Request_SomeGroup) String() string { return proto.CompactTextString(m) } +func (*Request_SomeGroup) ProtoMessage() {} + +func (m *Request_SomeGroup) GetGroupField() int32 { + if m != nil && m.GroupField != nil { + return *m.GroupField + } + return 0 +} + +type Reply struct { + Found []*Reply_Entry `protobuf:"bytes,1,rep,name=found" json:"found,omitempty"` + CompactKeys []int32 `protobuf:"varint,2,rep,packed,name=compact_keys,json=compactKeys" json:"compact_keys,omitempty"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Reply) Reset() { *m = Reply{} } +func (m *Reply) String() string { return proto.CompactTextString(m) } +func (*Reply) ProtoMessage() {} + +var extRange_Reply = []proto.ExtensionRange{ + {100, 536870911}, +} + +func (*Reply) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_Reply +} + +func (m *Reply) GetFound() []*Reply_Entry { + if m != nil { + return m.Found + } + return nil +} + +func (m *Reply) GetCompactKeys() []int32 { + if m != nil { + return m.CompactKeys + } + return nil +} + +type Reply_Entry struct { + KeyThatNeeds_1234Camel_CasIng *int64 `protobuf:"varint,1,req,name=key_that_needs_1234camel_CasIng,json=keyThatNeeds1234camelCasIng" json:"key_that_needs_1234camel_CasIng,omitempty"` + Value *int64 `protobuf:"varint,2,opt,name=value,def=7" json:"value,omitempty"` + XMyFieldName_2 *int64 `protobuf:"varint,3,opt,name=_my_field_name_2,json=MyFieldName2" json:"_my_field_name_2,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Reply_Entry) Reset() { *m = Reply_Entry{} } +func (m *Reply_Entry) String() string { return proto.CompactTextString(m) } +func (*Reply_Entry) ProtoMessage() {} + +const Default_Reply_Entry_Value int64 = 7 + +func (m *Reply_Entry) GetKeyThatNeeds_1234Camel_CasIng() int64 { + if m != nil && m.KeyThatNeeds_1234Camel_CasIng != nil { + return *m.KeyThatNeeds_1234Camel_CasIng + } + return 0 +} + +func (m *Reply_Entry) GetValue() int64 { + if m != nil && m.Value != nil { + return *m.Value + } + return Default_Reply_Entry_Value +} + +func (m *Reply_Entry) GetXMyFieldName_2() int64 { + if m != nil && m.XMyFieldName_2 != nil { + return *m.XMyFieldName_2 + } + return 0 +} + +type OtherBase struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *OtherBase) Reset() { *m = OtherBase{} } +func (m *OtherBase) String() string { return proto.CompactTextString(m) } +func (*OtherBase) ProtoMessage() {} + +var extRange_OtherBase = []proto.ExtensionRange{ + {100, 536870911}, +} + +func (*OtherBase) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_OtherBase +} + +func (m *OtherBase) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +type ReplyExtensions struct { + XXX_unrecognized []byte `json:"-"` +} + +func (m *ReplyExtensions) Reset() { *m = ReplyExtensions{} } +func (m *ReplyExtensions) String() string { return proto.CompactTextString(m) } +func (*ReplyExtensions) ProtoMessage() {} + +var E_ReplyExtensions_Time = &proto.ExtensionDesc{ + ExtendedType: (*Reply)(nil), + ExtensionType: (*float64)(nil), + Field: 101, + Name: "my.test.ReplyExtensions.time", + Tag: "fixed64,101,opt,name=time", + Filename: "my_test/test.proto", +} + +var E_ReplyExtensions_Carrot = &proto.ExtensionDesc{ + ExtendedType: (*Reply)(nil), + ExtensionType: (*ReplyExtensions)(nil), + Field: 105, + Name: "my.test.ReplyExtensions.carrot", + Tag: "bytes,105,opt,name=carrot", + Filename: "my_test/test.proto", +} + +var E_ReplyExtensions_Donut = &proto.ExtensionDesc{ + ExtendedType: (*OtherBase)(nil), + ExtensionType: (*ReplyExtensions)(nil), + Field: 101, + Name: "my.test.ReplyExtensions.donut", + Tag: "bytes,101,opt,name=donut", + Filename: "my_test/test.proto", +} + +type OtherReplyExtensions struct { + Key *int32 `protobuf:"varint,1,opt,name=key" json:"key,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *OtherReplyExtensions) Reset() { *m = OtherReplyExtensions{} } +func (m *OtherReplyExtensions) String() string { return proto.CompactTextString(m) } +func (*OtherReplyExtensions) ProtoMessage() {} + +func (m *OtherReplyExtensions) GetKey() int32 { + if m != nil && m.Key != nil { + return *m.Key + } + return 0 +} + +type OldReply struct { + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *OldReply) Reset() { *m = OldReply{} } +func (m *OldReply) String() string { return proto.CompactTextString(m) } +func (*OldReply) ProtoMessage() {} + +func (m *OldReply) Marshal() ([]byte, error) { + return proto.MarshalMessageSet(&m.XXX_InternalExtensions) +} +func (m *OldReply) Unmarshal(buf []byte) error { + return proto.UnmarshalMessageSet(buf, &m.XXX_InternalExtensions) +} +func (m *OldReply) MarshalJSON() ([]byte, error) { + return proto.MarshalMessageSetJSON(&m.XXX_InternalExtensions) +} +func (m *OldReply) UnmarshalJSON(buf []byte) error { + return proto.UnmarshalMessageSetJSON(buf, &m.XXX_InternalExtensions) +} + +// ensure OldReply satisfies proto.Marshaler and proto.Unmarshaler +var _ proto.Marshaler = (*OldReply)(nil) +var _ proto.Unmarshaler = (*OldReply)(nil) + +var extRange_OldReply = []proto.ExtensionRange{ + {100, 2147483646}, +} + +func (*OldReply) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_OldReply +} + +type Communique struct { + MakeMeCry *bool `protobuf:"varint,1,opt,name=make_me_cry,json=makeMeCry" json:"make_me_cry,omitempty"` + // This is a oneof, called "union". + // + // Types that are valid to be assigned to Union: + // *Communique_Number + // *Communique_Name + // *Communique_Data + // *Communique_TempC + // *Communique_Height + // *Communique_Today + // *Communique_Maybe + // *Communique_Delta_ + // *Communique_Msg + // *Communique_Somegroup + Union isCommunique_Union `protobuf_oneof:"union"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Communique) Reset() { *m = Communique{} } +func (m *Communique) String() string { return proto.CompactTextString(m) } +func (*Communique) ProtoMessage() {} + +type isCommunique_Union interface { + isCommunique_Union() +} + +type Communique_Number struct { + Number int32 `protobuf:"varint,5,opt,name=number,oneof"` +} +type Communique_Name struct { + Name string `protobuf:"bytes,6,opt,name=name,oneof"` +} +type Communique_Data struct { + Data []byte `protobuf:"bytes,7,opt,name=data,oneof"` +} +type Communique_TempC struct { + TempC float64 `protobuf:"fixed64,8,opt,name=temp_c,json=tempC,oneof"` +} +type Communique_Height struct { + Height float32 `protobuf:"fixed32,9,opt,name=height,oneof"` +} +type Communique_Today struct { + Today Days `protobuf:"varint,10,opt,name=today,enum=my.test.Days,oneof"` +} +type Communique_Maybe struct { + Maybe bool `protobuf:"varint,11,opt,name=maybe,oneof"` +} +type Communique_Delta_ struct { + Delta int32 `protobuf:"zigzag32,12,opt,name=delta,oneof"` +} +type Communique_Msg struct { + Msg *Reply `protobuf:"bytes,13,opt,name=msg,oneof"` +} +type Communique_Somegroup struct { + Somegroup *Communique_SomeGroup `protobuf:"group,14,opt,name=SomeGroup,json=somegroup,oneof"` +} + +func (*Communique_Number) isCommunique_Union() {} +func (*Communique_Name) isCommunique_Union() {} +func (*Communique_Data) isCommunique_Union() {} +func (*Communique_TempC) isCommunique_Union() {} +func (*Communique_Height) isCommunique_Union() {} +func (*Communique_Today) isCommunique_Union() {} +func (*Communique_Maybe) isCommunique_Union() {} +func (*Communique_Delta_) isCommunique_Union() {} +func (*Communique_Msg) isCommunique_Union() {} +func (*Communique_Somegroup) isCommunique_Union() {} + +func (m *Communique) GetUnion() isCommunique_Union { + if m != nil { + return m.Union + } + return nil +} + +func (m *Communique) GetMakeMeCry() bool { + if m != nil && m.MakeMeCry != nil { + return *m.MakeMeCry + } + return false +} + +func (m *Communique) GetNumber() int32 { + if x, ok := m.GetUnion().(*Communique_Number); ok { + return x.Number + } + return 0 +} + +func (m *Communique) GetName() string { + if x, ok := m.GetUnion().(*Communique_Name); ok { + return x.Name + } + return "" +} + +func (m *Communique) GetData() []byte { + if x, ok := m.GetUnion().(*Communique_Data); ok { + return x.Data + } + return nil +} + +func (m *Communique) GetTempC() float64 { + if x, ok := m.GetUnion().(*Communique_TempC); ok { + return x.TempC + } + return 0 +} + +func (m *Communique) GetHeight() float32 { + if x, ok := m.GetUnion().(*Communique_Height); ok { + return x.Height + } + return 0 +} + +func (m *Communique) GetToday() Days { + if x, ok := m.GetUnion().(*Communique_Today); ok { + return x.Today + } + return Days_MONDAY +} + +func (m *Communique) GetMaybe() bool { + if x, ok := m.GetUnion().(*Communique_Maybe); ok { + return x.Maybe + } + return false +} + +func (m *Communique) GetDelta() int32 { + if x, ok := m.GetUnion().(*Communique_Delta_); ok { + return x.Delta + } + return 0 +} + +func (m *Communique) GetMsg() *Reply { + if x, ok := m.GetUnion().(*Communique_Msg); ok { + return x.Msg + } + return nil +} + +func (m *Communique) GetSomegroup() *Communique_SomeGroup { + if x, ok := m.GetUnion().(*Communique_Somegroup); ok { + return x.Somegroup + } + return nil +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*Communique) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _Communique_OneofMarshaler, _Communique_OneofUnmarshaler, _Communique_OneofSizer, []interface{}{ + (*Communique_Number)(nil), + (*Communique_Name)(nil), + (*Communique_Data)(nil), + (*Communique_TempC)(nil), + (*Communique_Height)(nil), + (*Communique_Today)(nil), + (*Communique_Maybe)(nil), + (*Communique_Delta_)(nil), + (*Communique_Msg)(nil), + (*Communique_Somegroup)(nil), + } +} + +func _Communique_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*Communique) + // union + switch x := m.Union.(type) { + case *Communique_Number: + b.EncodeVarint(5<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.Number)) + case *Communique_Name: + b.EncodeVarint(6<<3 | proto.WireBytes) + b.EncodeStringBytes(x.Name) + case *Communique_Data: + b.EncodeVarint(7<<3 | proto.WireBytes) + b.EncodeRawBytes(x.Data) + case *Communique_TempC: + b.EncodeVarint(8<<3 | proto.WireFixed64) + b.EncodeFixed64(math.Float64bits(x.TempC)) + case *Communique_Height: + b.EncodeVarint(9<<3 | proto.WireFixed32) + b.EncodeFixed32(uint64(math.Float32bits(x.Height))) + case *Communique_Today: + b.EncodeVarint(10<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.Today)) + case *Communique_Maybe: + t := uint64(0) + if x.Maybe { + t = 1 + } + b.EncodeVarint(11<<3 | proto.WireVarint) + b.EncodeVarint(t) + case *Communique_Delta_: + b.EncodeVarint(12<<3 | proto.WireVarint) + b.EncodeZigzag32(uint64(x.Delta)) + case *Communique_Msg: + b.EncodeVarint(13<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.Msg); err != nil { + return err + } + case *Communique_Somegroup: + b.EncodeVarint(14<<3 | proto.WireStartGroup) + if err := b.Marshal(x.Somegroup); err != nil { + return err + } + b.EncodeVarint(14<<3 | proto.WireEndGroup) + case nil: + default: + return fmt.Errorf("Communique.Union has unexpected type %T", x) + } + return nil +} + +func _Communique_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*Communique) + switch tag { + case 5: // union.number + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Communique_Number{int32(x)} + return true, err + case 6: // union.name + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeStringBytes() + m.Union = &Communique_Name{x} + return true, err + case 7: // union.data + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeRawBytes(true) + m.Union = &Communique_Data{x} + return true, err + case 8: // union.temp_c + if wire != proto.WireFixed64 { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeFixed64() + m.Union = &Communique_TempC{math.Float64frombits(x)} + return true, err + case 9: // union.height + if wire != proto.WireFixed32 { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeFixed32() + m.Union = &Communique_Height{math.Float32frombits(uint32(x))} + return true, err + case 10: // union.today + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Communique_Today{Days(x)} + return true, err + case 11: // union.maybe + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Communique_Maybe{x != 0} + return true, err + case 12: // union.delta + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeZigzag32() + m.Union = &Communique_Delta_{int32(x)} + return true, err + case 13: // union.msg + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(Reply) + err := b.DecodeMessage(msg) + m.Union = &Communique_Msg{msg} + return true, err + case 14: // union.somegroup + if wire != proto.WireStartGroup { + return true, proto.ErrInternalBadWireType + } + msg := new(Communique_SomeGroup) + err := b.DecodeGroup(msg) + m.Union = &Communique_Somegroup{msg} + return true, err + default: + return false, nil + } +} + +func _Communique_OneofSizer(msg proto.Message) (n int) { + m := msg.(*Communique) + // union + switch x := m.Union.(type) { + case *Communique_Number: + n += proto.SizeVarint(5<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.Number)) + case *Communique_Name: + n += proto.SizeVarint(6<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(len(x.Name))) + n += len(x.Name) + case *Communique_Data: + n += proto.SizeVarint(7<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(len(x.Data))) + n += len(x.Data) + case *Communique_TempC: + n += proto.SizeVarint(8<<3 | proto.WireFixed64) + n += 8 + case *Communique_Height: + n += proto.SizeVarint(9<<3 | proto.WireFixed32) + n += 4 + case *Communique_Today: + n += proto.SizeVarint(10<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.Today)) + case *Communique_Maybe: + n += proto.SizeVarint(11<<3 | proto.WireVarint) + n += 1 + case *Communique_Delta_: + n += proto.SizeVarint(12<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64((uint32(x.Delta) << 1) ^ uint32((int32(x.Delta) >> 31)))) + case *Communique_Msg: + s := proto.Size(x.Msg) + n += proto.SizeVarint(13<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case *Communique_Somegroup: + n += proto.SizeVarint(14<<3 | proto.WireStartGroup) + n += proto.Size(x.Somegroup) + n += proto.SizeVarint(14<<3 | proto.WireEndGroup) + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +type Communique_SomeGroup struct { + Member *string `protobuf:"bytes,15,opt,name=member" json:"member,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Communique_SomeGroup) Reset() { *m = Communique_SomeGroup{} } +func (m *Communique_SomeGroup) String() string { return proto.CompactTextString(m) } +func (*Communique_SomeGroup) ProtoMessage() {} + +func (m *Communique_SomeGroup) GetMember() string { + if m != nil && m.Member != nil { + return *m.Member + } + return "" +} + +type Communique_Delta struct { + XXX_unrecognized []byte `json:"-"` +} + +func (m *Communique_Delta) Reset() { *m = Communique_Delta{} } +func (m *Communique_Delta) String() string { return proto.CompactTextString(m) } +func (*Communique_Delta) ProtoMessage() {} + +var E_Tag = &proto.ExtensionDesc{ + ExtendedType: (*Reply)(nil), + ExtensionType: (*string)(nil), + Field: 103, + Name: "my.test.tag", + Tag: "bytes,103,opt,name=tag", + Filename: "my_test/test.proto", +} + +var E_Donut = &proto.ExtensionDesc{ + ExtendedType: (*Reply)(nil), + ExtensionType: (*OtherReplyExtensions)(nil), + Field: 106, + Name: "my.test.donut", + Tag: "bytes,106,opt,name=donut", + Filename: "my_test/test.proto", +} + +func init() { + proto.RegisterType((*Request)(nil), "my.test.Request") + proto.RegisterType((*Request_SomeGroup)(nil), "my.test.Request.SomeGroup") + proto.RegisterType((*Reply)(nil), "my.test.Reply") + proto.RegisterType((*Reply_Entry)(nil), "my.test.Reply.Entry") + proto.RegisterType((*OtherBase)(nil), "my.test.OtherBase") + proto.RegisterType((*ReplyExtensions)(nil), "my.test.ReplyExtensions") + proto.RegisterType((*OtherReplyExtensions)(nil), "my.test.OtherReplyExtensions") + proto.RegisterType((*OldReply)(nil), "my.test.OldReply") + proto.RegisterType((*Communique)(nil), "my.test.Communique") + proto.RegisterType((*Communique_SomeGroup)(nil), "my.test.Communique.SomeGroup") + proto.RegisterType((*Communique_Delta)(nil), "my.test.Communique.Delta") + proto.RegisterEnum("my.test.HatType", HatType_name, HatType_value) + proto.RegisterEnum("my.test.Days", Days_name, Days_value) + proto.RegisterEnum("my.test.Request_Color", Request_Color_name, Request_Color_value) + proto.RegisterEnum("my.test.Reply_Entry_Game", Reply_Entry_Game_name, Reply_Entry_Game_value) + proto.RegisterExtension(E_ReplyExtensions_Time) + proto.RegisterExtension(E_ReplyExtensions_Carrot) + proto.RegisterExtension(E_ReplyExtensions_Donut) + proto.RegisterExtension(E_Tag) + proto.RegisterExtension(E_Donut) +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/my_test/test.proto b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/my_test/test.proto new file mode 100644 index 0000000..8e70946 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/my_test/test.proto @@ -0,0 +1,156 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto2"; + +// This package holds interesting messages. +package my.test; // dotted package name + +//import "imp.proto"; +import "multi/multi1.proto"; // unused import + +enum HatType { + // deliberately skipping 0 + FEDORA = 1; + FEZ = 2; +} + +// This enum represents days of the week. +enum Days { + option allow_alias = true; + + MONDAY = 1; + TUESDAY = 2; + LUNDI = 1; // same value as MONDAY +} + +// This is a message that might be sent somewhere. +message Request { + enum Color { + RED = 0; + GREEN = 1; + BLUE = 2; + } + repeated int64 key = 1; +// optional imp.ImportedMessage imported_message = 2; + optional Color hue = 3; // no default + optional HatType hat = 4 [default=FEDORA]; +// optional imp.ImportedMessage.Owner owner = 6; + optional float deadline = 7 [default=inf]; + optional group SomeGroup = 8 { + optional int32 group_field = 9; + } + + // These foreign types are in imp2.proto, + // which is publicly imported by imp.proto. +// optional imp.PubliclyImportedMessage pub = 10; +// optional imp.PubliclyImportedEnum pub_enum = 13 [default=HAIR]; + + + // This is a map field. It will generate map[int32]string. + map name_mapping = 14; + // This is a map field whose value type is a message. + map msg_mapping = 15; + + optional int32 reset = 12; + // This field should not conflict with any getters. + optional string get_key = 16; +} + +message Reply { + message Entry { + required int64 key_that_needs_1234camel_CasIng = 1; + optional int64 value = 2 [default=7]; + optional int64 _my_field_name_2 = 3; + enum Game { + FOOTBALL = 1; + TENNIS = 2; + } + } + repeated Entry found = 1; + repeated int32 compact_keys = 2 [packed=true]; + extensions 100 to max; +} + +message OtherBase { + optional string name = 1; + extensions 100 to max; +} + +message ReplyExtensions { + extend Reply { + optional double time = 101; + optional ReplyExtensions carrot = 105; + } + extend OtherBase { + optional ReplyExtensions donut = 101; + } +} + +message OtherReplyExtensions { + optional int32 key = 1; +} + +// top-level extension +extend Reply { + optional string tag = 103; + optional OtherReplyExtensions donut = 106; +// optional imp.ImportedMessage elephant = 107; // extend with message from another file. +} + +message OldReply { + // Extensions will be encoded in MessageSet wire format. + option message_set_wire_format = true; + extensions 100 to max; +} + +message Communique { + optional bool make_me_cry = 1; + + // This is a oneof, called "union". + oneof union { + int32 number = 5; + string name = 6; + bytes data = 7; + double temp_c = 8; + float height = 9; + Days today = 10; + bool maybe = 11; + sint32 delta = 12; // name will conflict with Delta below + Reply msg = 13; + group SomeGroup = 14 { + optional string member = 15; + } + } + + message Delta {} +} + diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/proto3.proto b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/proto3.proto new file mode 100644 index 0000000..869b9af --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/proto3.proto @@ -0,0 +1,53 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2014 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +syntax = "proto3"; + +package proto3; + +message Request { + enum Flavour { + SWEET = 0; + SOUR = 1; + UMAMI = 2; + GOPHERLICIOUS = 3; + } + string name = 1; + repeated int64 key = 2; + Flavour taste = 3; + Book book = 4; + repeated int64 unpacked = 5 [packed=false]; +} + +message Book { + string title = 1; + bytes raw_data = 2; +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/any.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/any.go new file mode 100644 index 0000000..b2af97f --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/any.go @@ -0,0 +1,139 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package ptypes + +// This file implements functions to marshal proto.Message to/from +// google.protobuf.Any message. + +import ( + "fmt" + "reflect" + "strings" + + "github.com/golang/protobuf/proto" + "github.com/golang/protobuf/ptypes/any" +) + +const googleApis = "type.googleapis.com/" + +// AnyMessageName returns the name of the message contained in a google.protobuf.Any message. +// +// Note that regular type assertions should be done using the Is +// function. AnyMessageName is provided for less common use cases like filtering a +// sequence of Any messages based on a set of allowed message type names. +func AnyMessageName(any *any.Any) (string, error) { + if any == nil { + return "", fmt.Errorf("message is nil") + } + slash := strings.LastIndex(any.TypeUrl, "/") + if slash < 0 { + return "", fmt.Errorf("message type url %q is invalid", any.TypeUrl) + } + return any.TypeUrl[slash+1:], nil +} + +// MarshalAny takes the protocol buffer and encodes it into google.protobuf.Any. +func MarshalAny(pb proto.Message) (*any.Any, error) { + value, err := proto.Marshal(pb) + if err != nil { + return nil, err + } + return &any.Any{TypeUrl: googleApis + proto.MessageName(pb), Value: value}, nil +} + +// DynamicAny is a value that can be passed to UnmarshalAny to automatically +// allocate a proto.Message for the type specified in a google.protobuf.Any +// message. The allocated message is stored in the embedded proto.Message. +// +// Example: +// +// var x ptypes.DynamicAny +// if err := ptypes.UnmarshalAny(a, &x); err != nil { ... } +// fmt.Printf("unmarshaled message: %v", x.Message) +type DynamicAny struct { + proto.Message +} + +// Empty returns a new proto.Message of the type specified in a +// google.protobuf.Any message. It returns an error if corresponding message +// type isn't linked in. +func Empty(any *any.Any) (proto.Message, error) { + aname, err := AnyMessageName(any) + if err != nil { + return nil, err + } + + t := proto.MessageType(aname) + if t == nil { + return nil, fmt.Errorf("any: message type %q isn't linked in", aname) + } + return reflect.New(t.Elem()).Interface().(proto.Message), nil +} + +// UnmarshalAny parses the protocol buffer representation in a google.protobuf.Any +// message and places the decoded result in pb. It returns an error if type of +// contents of Any message does not match type of pb message. +// +// pb can be a proto.Message, or a *DynamicAny. +func UnmarshalAny(any *any.Any, pb proto.Message) error { + if d, ok := pb.(*DynamicAny); ok { + if d.Message == nil { + var err error + d.Message, err = Empty(any) + if err != nil { + return err + } + } + return UnmarshalAny(any, d.Message) + } + + aname, err := AnyMessageName(any) + if err != nil { + return err + } + + mname := proto.MessageName(pb) + if aname != mname { + return fmt.Errorf("mismatched message type: got %q want %q", aname, mname) + } + return proto.Unmarshal(any.Value, pb) +} + +// Is returns true if any value contains a given message type. +func Is(any *any.Any, pb proto.Message) bool { + aname, err := AnyMessageName(any) + if err != nil { + return false + } + + return aname == proto.MessageName(pb) +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/any/any.pb.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/any/any.pb.go new file mode 100644 index 0000000..f346017 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/any/any.pb.go @@ -0,0 +1,178 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/any.proto + +/* +Package any is a generated protocol buffer package. + +It is generated from these files: + google/protobuf/any.proto + +It has these top-level messages: + Any +*/ +package any + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +// `Any` contains an arbitrary serialized protocol buffer message along with a +// URL that describes the type of the serialized message. +// +// Protobuf library provides support to pack/unpack Any values in the form +// of utility functions or additional generated methods of the Any type. +// +// Example 1: Pack and unpack a message in C++. +// +// Foo foo = ...; +// Any any; +// any.PackFrom(foo); +// ... +// if (any.UnpackTo(&foo)) { +// ... +// } +// +// Example 2: Pack and unpack a message in Java. +// +// Foo foo = ...; +// Any any = Any.pack(foo); +// ... +// if (any.is(Foo.class)) { +// foo = any.unpack(Foo.class); +// } +// +// Example 3: Pack and unpack a message in Python. +// +// foo = Foo(...) +// any = Any() +// any.Pack(foo) +// ... +// if any.Is(Foo.DESCRIPTOR): +// any.Unpack(foo) +// ... +// +// Example 4: Pack and unpack a message in Go +// +// foo := &pb.Foo{...} +// any, err := ptypes.MarshalAny(foo) +// ... +// foo := &pb.Foo{} +// if err := ptypes.UnmarshalAny(any, foo); err != nil { +// ... +// } +// +// The pack methods provided by protobuf library will by default use +// 'type.googleapis.com/full.type.name' as the type URL and the unpack +// methods only use the fully qualified type name after the last '/' +// in the type URL, for example "foo.bar.com/x/y.z" will yield type +// name "y.z". +// +// +// JSON +// ==== +// The JSON representation of an `Any` value uses the regular +// representation of the deserialized, embedded message, with an +// additional field `@type` which contains the type URL. Example: +// +// package google.profile; +// message Person { +// string first_name = 1; +// string last_name = 2; +// } +// +// { +// "@type": "type.googleapis.com/google.profile.Person", +// "firstName": , +// "lastName": +// } +// +// If the embedded message type is well-known and has a custom JSON +// representation, that representation will be embedded adding a field +// `value` which holds the custom JSON in addition to the `@type` +// field. Example (for message [google.protobuf.Duration][]): +// +// { +// "@type": "type.googleapis.com/google.protobuf.Duration", +// "value": "1.212s" +// } +// +type Any struct { + // A URL/resource name whose content describes the type of the + // serialized protocol buffer message. + // + // For URLs which use the scheme `http`, `https`, or no scheme, the + // following restrictions and interpretations apply: + // + // * If no scheme is provided, `https` is assumed. + // * The last segment of the URL's path must represent the fully + // qualified name of the type (as in `path/google.protobuf.Duration`). + // The name should be in a canonical form (e.g., leading "." is + // not accepted). + // * An HTTP GET on the URL must yield a [google.protobuf.Type][] + // value in binary format, or produce an error. + // * Applications are allowed to cache lookup results based on the + // URL, or have them precompiled into a binary to avoid any + // lookup. Therefore, binary compatibility needs to be preserved + // on changes to types. (Use versioned type names to manage + // breaking changes.) + // + // Schemes other than `http`, `https` (or the empty scheme) might be + // used with implementation specific semantics. + // + TypeUrl string `protobuf:"bytes,1,opt,name=type_url,json=typeUrl" json:"type_url,omitempty"` + // Must be a valid serialized protocol buffer of the above specified type. + Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *Any) Reset() { *m = Any{} } +func (m *Any) String() string { return proto.CompactTextString(m) } +func (*Any) ProtoMessage() {} +func (*Any) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } +func (*Any) XXX_WellKnownType() string { return "Any" } + +func (m *Any) GetTypeUrl() string { + if m != nil { + return m.TypeUrl + } + return "" +} + +func (m *Any) GetValue() []byte { + if m != nil { + return m.Value + } + return nil +} + +func init() { + proto.RegisterType((*Any)(nil), "google.protobuf.Any") +} + +func init() { proto.RegisterFile("google/protobuf/any.proto", fileDescriptor0) } + +var fileDescriptor0 = []byte{ + // 185 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4c, 0xcf, 0xcf, 0x4f, + 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x4f, 0xcc, 0xab, 0xd4, + 0x03, 0x73, 0x84, 0xf8, 0x21, 0x52, 0x7a, 0x30, 0x29, 0x25, 0x33, 0x2e, 0x66, 0xc7, 0xbc, 0x4a, + 0x21, 0x49, 0x2e, 0x8e, 0x92, 0xca, 0x82, 0xd4, 0xf8, 0xd2, 0xa2, 0x1c, 0x09, 0x46, 0x05, 0x46, + 0x0d, 0xce, 0x20, 0x76, 0x10, 0x3f, 0xb4, 0x28, 0x47, 0x48, 0x84, 0x8b, 0xb5, 0x2c, 0x31, 0xa7, + 0x34, 0x55, 0x82, 0x49, 0x81, 0x51, 0x83, 0x27, 0x08, 0xc2, 0x71, 0xca, 0xe7, 0x12, 0x4e, 0xce, + 0xcf, 0xd5, 0x43, 0x33, 0xce, 0x89, 0xc3, 0x31, 0xaf, 0x32, 0x00, 0xc4, 0x09, 0x60, 0x8c, 0x52, + 0x4d, 0xcf, 0x2c, 0xc9, 0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xcf, 0xcf, 0x49, 0xcc, + 0x4b, 0x47, 0xb8, 0xa8, 0x00, 0x64, 0x7a, 0x31, 0xc8, 0x61, 0x8b, 0x98, 0x98, 0xdd, 0x03, 0x9c, + 0x56, 0x31, 0xc9, 0xb9, 0x43, 0x8c, 0x0a, 0x80, 0x2a, 0xd1, 0x0b, 0x4f, 0xcd, 0xc9, 0xf1, 0xce, + 0xcb, 0x2f, 0xcf, 0x0b, 0x01, 0x29, 0x4d, 0x62, 0x03, 0xeb, 0x35, 0x06, 0x04, 0x00, 0x00, 0xff, + 0xff, 0x13, 0xf8, 0xe8, 0x42, 0xdd, 0x00, 0x00, 0x00, +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/any/any.proto b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/any/any.proto new file mode 100644 index 0000000..c748667 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/any/any.proto @@ -0,0 +1,149 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// 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. + +syntax = "proto3"; + +package google.protobuf; + +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option go_package = "github.com/golang/protobuf/ptypes/any"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "AnyProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; + +// `Any` contains an arbitrary serialized protocol buffer message along with a +// URL that describes the type of the serialized message. +// +// Protobuf library provides support to pack/unpack Any values in the form +// of utility functions or additional generated methods of the Any type. +// +// Example 1: Pack and unpack a message in C++. +// +// Foo foo = ...; +// Any any; +// any.PackFrom(foo); +// ... +// if (any.UnpackTo(&foo)) { +// ... +// } +// +// Example 2: Pack and unpack a message in Java. +// +// Foo foo = ...; +// Any any = Any.pack(foo); +// ... +// if (any.is(Foo.class)) { +// foo = any.unpack(Foo.class); +// } +// +// Example 3: Pack and unpack a message in Python. +// +// foo = Foo(...) +// any = Any() +// any.Pack(foo) +// ... +// if any.Is(Foo.DESCRIPTOR): +// any.Unpack(foo) +// ... +// +// Example 4: Pack and unpack a message in Go +// +// foo := &pb.Foo{...} +// any, err := ptypes.MarshalAny(foo) +// ... +// foo := &pb.Foo{} +// if err := ptypes.UnmarshalAny(any, foo); err != nil { +// ... +// } +// +// The pack methods provided by protobuf library will by default use +// 'type.googleapis.com/full.type.name' as the type URL and the unpack +// methods only use the fully qualified type name after the last '/' +// in the type URL, for example "foo.bar.com/x/y.z" will yield type +// name "y.z". +// +// +// JSON +// ==== +// The JSON representation of an `Any` value uses the regular +// representation of the deserialized, embedded message, with an +// additional field `@type` which contains the type URL. Example: +// +// package google.profile; +// message Person { +// string first_name = 1; +// string last_name = 2; +// } +// +// { +// "@type": "type.googleapis.com/google.profile.Person", +// "firstName": , +// "lastName": +// } +// +// If the embedded message type is well-known and has a custom JSON +// representation, that representation will be embedded adding a field +// `value` which holds the custom JSON in addition to the `@type` +// field. Example (for message [google.protobuf.Duration][]): +// +// { +// "@type": "type.googleapis.com/google.protobuf.Duration", +// "value": "1.212s" +// } +// +message Any { + // A URL/resource name whose content describes the type of the + // serialized protocol buffer message. + // + // For URLs which use the scheme `http`, `https`, or no scheme, the + // following restrictions and interpretations apply: + // + // * If no scheme is provided, `https` is assumed. + // * The last segment of the URL's path must represent the fully + // qualified name of the type (as in `path/google.protobuf.Duration`). + // The name should be in a canonical form (e.g., leading "." is + // not accepted). + // * An HTTP GET on the URL must yield a [google.protobuf.Type][] + // value in binary format, or produce an error. + // * Applications are allowed to cache lookup results based on the + // URL, or have them precompiled into a binary to avoid any + // lookup. Therefore, binary compatibility needs to be preserved + // on changes to types. (Use versioned type names to manage + // breaking changes.) + // + // Schemes other than `http`, `https` (or the empty scheme) might be + // used with implementation specific semantics. + // + string type_url = 1; + + // Must be a valid serialized protocol buffer of the above specified type. + bytes value = 2; +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/any_test.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/any_test.go new file mode 100644 index 0000000..ed675b4 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/any_test.go @@ -0,0 +1,113 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package ptypes + +import ( + "testing" + + "github.com/golang/protobuf/proto" + pb "github.com/golang/protobuf/protoc-gen-go/descriptor" + "github.com/golang/protobuf/ptypes/any" +) + +func TestMarshalUnmarshal(t *testing.T) { + orig := &any.Any{Value: []byte("test")} + + packed, err := MarshalAny(orig) + if err != nil { + t.Errorf("MarshalAny(%+v): got: _, %v exp: _, nil", orig, err) + } + + unpacked := &any.Any{} + err = UnmarshalAny(packed, unpacked) + if err != nil || !proto.Equal(unpacked, orig) { + t.Errorf("got: %v, %+v; want nil, %+v", err, unpacked, orig) + } +} + +func TestIs(t *testing.T) { + a, err := MarshalAny(&pb.FileDescriptorProto{}) + if err != nil { + t.Fatal(err) + } + if Is(a, &pb.DescriptorProto{}) { + t.Error("FileDescriptorProto is not a DescriptorProto, but Is says it is") + } + if !Is(a, &pb.FileDescriptorProto{}) { + t.Error("FileDescriptorProto is indeed a FileDescriptorProto, but Is says it is not") + } +} + +func TestIsDifferentUrlPrefixes(t *testing.T) { + m := &pb.FileDescriptorProto{} + a := &any.Any{TypeUrl: "foo/bar/" + proto.MessageName(m)} + if !Is(a, m) { + t.Errorf("message with type url %q didn't satisfy Is for type %q", a.TypeUrl, proto.MessageName(m)) + } +} + +func TestUnmarshalDynamic(t *testing.T) { + want := &pb.FileDescriptorProto{Name: proto.String("foo")} + a, err := MarshalAny(want) + if err != nil { + t.Fatal(err) + } + var got DynamicAny + if err := UnmarshalAny(a, &got); err != nil { + t.Fatal(err) + } + if !proto.Equal(got.Message, want) { + t.Errorf("invalid result from UnmarshalAny, got %q want %q", got.Message, want) + } +} + +func TestEmpty(t *testing.T) { + want := &pb.FileDescriptorProto{} + a, err := MarshalAny(want) + if err != nil { + t.Fatal(err) + } + got, err := Empty(a) + if err != nil { + t.Fatal(err) + } + if !proto.Equal(got, want) { + t.Errorf("unequal empty message, got %q, want %q", got, want) + } + + // that's a valid type_url for a message which shouldn't be linked into this + // test binary. We want an error. + a.TypeUrl = "type.googleapis.com/google.protobuf.FieldMask" + if _, err := Empty(a); err == nil { + t.Errorf("got no error for an attempt to create a message of type %q, which shouldn't be linked in", a.TypeUrl) + } +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/doc.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/doc.go new file mode 100644 index 0000000..c0d595d --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/doc.go @@ -0,0 +1,35 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +/* +Package ptypes contains code for interacting with well-known types. +*/ +package ptypes diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/duration.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/duration.go new file mode 100644 index 0000000..65cb0f8 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/duration.go @@ -0,0 +1,102 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package ptypes + +// This file implements conversions between google.protobuf.Duration +// and time.Duration. + +import ( + "errors" + "fmt" + "time" + + durpb "github.com/golang/protobuf/ptypes/duration" +) + +const ( + // Range of a durpb.Duration in seconds, as specified in + // google/protobuf/duration.proto. This is about 10,000 years in seconds. + maxSeconds = int64(10000 * 365.25 * 24 * 60 * 60) + minSeconds = -maxSeconds +) + +// validateDuration determines whether the durpb.Duration is valid according to the +// definition in google/protobuf/duration.proto. A valid durpb.Duration +// may still be too large to fit into a time.Duration (the range of durpb.Duration +// is about 10,000 years, and the range of time.Duration is about 290). +func validateDuration(d *durpb.Duration) error { + if d == nil { + return errors.New("duration: nil Duration") + } + if d.Seconds < minSeconds || d.Seconds > maxSeconds { + return fmt.Errorf("duration: %v: seconds out of range", d) + } + if d.Nanos <= -1e9 || d.Nanos >= 1e9 { + return fmt.Errorf("duration: %v: nanos out of range", d) + } + // Seconds and Nanos must have the same sign, unless d.Nanos is zero. + if (d.Seconds < 0 && d.Nanos > 0) || (d.Seconds > 0 && d.Nanos < 0) { + return fmt.Errorf("duration: %v: seconds and nanos have different signs", d) + } + return nil +} + +// Duration converts a durpb.Duration to a time.Duration. Duration +// returns an error if the durpb.Duration is invalid or is too large to be +// represented in a time.Duration. +func Duration(p *durpb.Duration) (time.Duration, error) { + if err := validateDuration(p); err != nil { + return 0, err + } + d := time.Duration(p.Seconds) * time.Second + if int64(d/time.Second) != p.Seconds { + return 0, fmt.Errorf("duration: %v is out of range for time.Duration", p) + } + if p.Nanos != 0 { + d += time.Duration(p.Nanos) + if (d < 0) != (p.Nanos < 0) { + return 0, fmt.Errorf("duration: %v is out of range for time.Duration", p) + } + } + return d, nil +} + +// DurationProto converts a time.Duration to a durpb.Duration. +func DurationProto(d time.Duration) *durpb.Duration { + nanos := d.Nanoseconds() + secs := nanos / 1e9 + nanos -= secs * 1e9 + return &durpb.Duration{ + Seconds: secs, + Nanos: int32(nanos), + } +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/duration/duration.pb.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/duration/duration.pb.go new file mode 100644 index 0000000..b2410a0 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/duration/duration.pb.go @@ -0,0 +1,144 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/duration.proto + +/* +Package duration is a generated protocol buffer package. + +It is generated from these files: + google/protobuf/duration.proto + +It has these top-level messages: + Duration +*/ +package duration + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +// A Duration represents a signed, fixed-length span of time represented +// as a count of seconds and fractions of seconds at nanosecond +// resolution. It is independent of any calendar and concepts like "day" +// or "month". It is related to Timestamp in that the difference between +// two Timestamp values is a Duration and it can be added or subtracted +// from a Timestamp. Range is approximately +-10,000 years. +// +// # Examples +// +// Example 1: Compute Duration from two Timestamps in pseudo code. +// +// Timestamp start = ...; +// Timestamp end = ...; +// Duration duration = ...; +// +// duration.seconds = end.seconds - start.seconds; +// duration.nanos = end.nanos - start.nanos; +// +// if (duration.seconds < 0 && duration.nanos > 0) { +// duration.seconds += 1; +// duration.nanos -= 1000000000; +// } else if (durations.seconds > 0 && duration.nanos < 0) { +// duration.seconds -= 1; +// duration.nanos += 1000000000; +// } +// +// Example 2: Compute Timestamp from Timestamp + Duration in pseudo code. +// +// Timestamp start = ...; +// Duration duration = ...; +// Timestamp end = ...; +// +// end.seconds = start.seconds + duration.seconds; +// end.nanos = start.nanos + duration.nanos; +// +// if (end.nanos < 0) { +// end.seconds -= 1; +// end.nanos += 1000000000; +// } else if (end.nanos >= 1000000000) { +// end.seconds += 1; +// end.nanos -= 1000000000; +// } +// +// Example 3: Compute Duration from datetime.timedelta in Python. +// +// td = datetime.timedelta(days=3, minutes=10) +// duration = Duration() +// duration.FromTimedelta(td) +// +// # JSON Mapping +// +// In JSON format, the Duration type is encoded as a string rather than an +// object, where the string ends in the suffix "s" (indicating seconds) and +// is preceded by the number of seconds, with nanoseconds expressed as +// fractional seconds. For example, 3 seconds with 0 nanoseconds should be +// encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should +// be expressed in JSON format as "3.000000001s", and 3 seconds and 1 +// microsecond should be expressed in JSON format as "3.000001s". +// +// +type Duration struct { + // Signed seconds of the span of time. Must be from -315,576,000,000 + // to +315,576,000,000 inclusive. Note: these bounds are computed from: + // 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years + Seconds int64 `protobuf:"varint,1,opt,name=seconds" json:"seconds,omitempty"` + // Signed fractions of a second at nanosecond resolution of the span + // of time. Durations less than one second are represented with a 0 + // `seconds` field and a positive or negative `nanos` field. For durations + // of one second or more, a non-zero value for the `nanos` field must be + // of the same sign as the `seconds` field. Must be from -999,999,999 + // to +999,999,999 inclusive. + Nanos int32 `protobuf:"varint,2,opt,name=nanos" json:"nanos,omitempty"` +} + +func (m *Duration) Reset() { *m = Duration{} } +func (m *Duration) String() string { return proto.CompactTextString(m) } +func (*Duration) ProtoMessage() {} +func (*Duration) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } +func (*Duration) XXX_WellKnownType() string { return "Duration" } + +func (m *Duration) GetSeconds() int64 { + if m != nil { + return m.Seconds + } + return 0 +} + +func (m *Duration) GetNanos() int32 { + if m != nil { + return m.Nanos + } + return 0 +} + +func init() { + proto.RegisterType((*Duration)(nil), "google.protobuf.Duration") +} + +func init() { proto.RegisterFile("google/protobuf/duration.proto", fileDescriptor0) } + +var fileDescriptor0 = []byte{ + // 190 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4b, 0xcf, 0xcf, 0x4f, + 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x4f, 0x29, 0x2d, 0x4a, + 0x2c, 0xc9, 0xcc, 0xcf, 0xd3, 0x03, 0x8b, 0x08, 0xf1, 0x43, 0xe4, 0xf5, 0x60, 0xf2, 0x4a, 0x56, + 0x5c, 0x1c, 0x2e, 0x50, 0x25, 0x42, 0x12, 0x5c, 0xec, 0xc5, 0xa9, 0xc9, 0xf9, 0x79, 0x29, 0xc5, + 0x12, 0x8c, 0x0a, 0x8c, 0x1a, 0xcc, 0x41, 0x30, 0xae, 0x90, 0x08, 0x17, 0x6b, 0x5e, 0x62, 0x5e, + 0x7e, 0xb1, 0x04, 0x93, 0x02, 0xa3, 0x06, 0x6b, 0x10, 0x84, 0xe3, 0x54, 0xc3, 0x25, 0x9c, 0x9c, + 0x9f, 0xab, 0x87, 0x66, 0xa4, 0x13, 0x2f, 0xcc, 0xc0, 0x00, 0x90, 0x48, 0x00, 0x63, 0x94, 0x56, + 0x7a, 0x66, 0x49, 0x46, 0x69, 0x92, 0x5e, 0x72, 0x7e, 0xae, 0x7e, 0x7a, 0x7e, 0x4e, 0x62, 0x5e, + 0x3a, 0xc2, 0x7d, 0x05, 0x25, 0x95, 0x05, 0xa9, 0xc5, 0x70, 0x67, 0xfe, 0x60, 0x64, 0x5c, 0xc4, + 0xc4, 0xec, 0x1e, 0xe0, 0xb4, 0x8a, 0x49, 0xce, 0x1d, 0x62, 0x6e, 0x00, 0x54, 0xa9, 0x5e, 0x78, + 0x6a, 0x4e, 0x8e, 0x77, 0x5e, 0x7e, 0x79, 0x5e, 0x08, 0x48, 0x4b, 0x12, 0x1b, 0xd8, 0x0c, 0x63, + 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdc, 0x84, 0x30, 0xff, 0xf3, 0x00, 0x00, 0x00, +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/duration/duration.proto b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/duration/duration.proto new file mode 100644 index 0000000..975fce4 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/duration/duration.proto @@ -0,0 +1,117 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// 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. + +syntax = "proto3"; + +package google.protobuf; + +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option cc_enable_arenas = true; +option go_package = "github.com/golang/protobuf/ptypes/duration"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "DurationProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; + +// A Duration represents a signed, fixed-length span of time represented +// as a count of seconds and fractions of seconds at nanosecond +// resolution. It is independent of any calendar and concepts like "day" +// or "month". It is related to Timestamp in that the difference between +// two Timestamp values is a Duration and it can be added or subtracted +// from a Timestamp. Range is approximately +-10,000 years. +// +// # Examples +// +// Example 1: Compute Duration from two Timestamps in pseudo code. +// +// Timestamp start = ...; +// Timestamp end = ...; +// Duration duration = ...; +// +// duration.seconds = end.seconds - start.seconds; +// duration.nanos = end.nanos - start.nanos; +// +// if (duration.seconds < 0 && duration.nanos > 0) { +// duration.seconds += 1; +// duration.nanos -= 1000000000; +// } else if (durations.seconds > 0 && duration.nanos < 0) { +// duration.seconds -= 1; +// duration.nanos += 1000000000; +// } +// +// Example 2: Compute Timestamp from Timestamp + Duration in pseudo code. +// +// Timestamp start = ...; +// Duration duration = ...; +// Timestamp end = ...; +// +// end.seconds = start.seconds + duration.seconds; +// end.nanos = start.nanos + duration.nanos; +// +// if (end.nanos < 0) { +// end.seconds -= 1; +// end.nanos += 1000000000; +// } else if (end.nanos >= 1000000000) { +// end.seconds += 1; +// end.nanos -= 1000000000; +// } +// +// Example 3: Compute Duration from datetime.timedelta in Python. +// +// td = datetime.timedelta(days=3, minutes=10) +// duration = Duration() +// duration.FromTimedelta(td) +// +// # JSON Mapping +// +// In JSON format, the Duration type is encoded as a string rather than an +// object, where the string ends in the suffix "s" (indicating seconds) and +// is preceded by the number of seconds, with nanoseconds expressed as +// fractional seconds. For example, 3 seconds with 0 nanoseconds should be +// encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should +// be expressed in JSON format as "3.000000001s", and 3 seconds and 1 +// microsecond should be expressed in JSON format as "3.000001s". +// +// +message Duration { + + // Signed seconds of the span of time. Must be from -315,576,000,000 + // to +315,576,000,000 inclusive. Note: these bounds are computed from: + // 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years + int64 seconds = 1; + + // Signed fractions of a second at nanosecond resolution of the span + // of time. Durations less than one second are represented with a 0 + // `seconds` field and a positive or negative `nanos` field. For durations + // of one second or more, a non-zero value for the `nanos` field must be + // of the same sign as the `seconds` field. Must be from -999,999,999 + // to +999,999,999 inclusive. + int32 nanos = 2; +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/duration_test.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/duration_test.go new file mode 100644 index 0000000..e00491a --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/duration_test.go @@ -0,0 +1,121 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package ptypes + +import ( + "math" + "testing" + "time" + + "github.com/golang/protobuf/proto" + durpb "github.com/golang/protobuf/ptypes/duration" +) + +const ( + minGoSeconds = math.MinInt64 / int64(1e9) + maxGoSeconds = math.MaxInt64 / int64(1e9) +) + +var durationTests = []struct { + proto *durpb.Duration + isValid bool + inRange bool + dur time.Duration +}{ + // The zero duration. + {&durpb.Duration{Seconds: 0, Nanos: 0}, true, true, 0}, + // Some ordinary non-zero durations. + {&durpb.Duration{Seconds: 100, Nanos: 0}, true, true, 100 * time.Second}, + {&durpb.Duration{Seconds: -100, Nanos: 0}, true, true, -100 * time.Second}, + {&durpb.Duration{Seconds: 100, Nanos: 987}, true, true, 100*time.Second + 987}, + {&durpb.Duration{Seconds: -100, Nanos: -987}, true, true, -(100*time.Second + 987)}, + // The largest duration representable in Go. + {&durpb.Duration{Seconds: maxGoSeconds, Nanos: int32(math.MaxInt64 - 1e9*maxGoSeconds)}, true, true, math.MaxInt64}, + // The smallest duration representable in Go. + {&durpb.Duration{Seconds: minGoSeconds, Nanos: int32(math.MinInt64 - 1e9*minGoSeconds)}, true, true, math.MinInt64}, + {nil, false, false, 0}, + {&durpb.Duration{Seconds: -100, Nanos: 987}, false, false, 0}, + {&durpb.Duration{Seconds: 100, Nanos: -987}, false, false, 0}, + {&durpb.Duration{Seconds: math.MinInt64, Nanos: 0}, false, false, 0}, + {&durpb.Duration{Seconds: math.MaxInt64, Nanos: 0}, false, false, 0}, + // The largest valid duration. + {&durpb.Duration{Seconds: maxSeconds, Nanos: 1e9 - 1}, true, false, 0}, + // The smallest valid duration. + {&durpb.Duration{Seconds: minSeconds, Nanos: -(1e9 - 1)}, true, false, 0}, + // The smallest invalid duration above the valid range. + {&durpb.Duration{Seconds: maxSeconds + 1, Nanos: 0}, false, false, 0}, + // The largest invalid duration below the valid range. + {&durpb.Duration{Seconds: minSeconds - 1, Nanos: -(1e9 - 1)}, false, false, 0}, + // One nanosecond past the largest duration representable in Go. + {&durpb.Duration{Seconds: maxGoSeconds, Nanos: int32(math.MaxInt64-1e9*maxGoSeconds) + 1}, true, false, 0}, + // One nanosecond past the smallest duration representable in Go. + {&durpb.Duration{Seconds: minGoSeconds, Nanos: int32(math.MinInt64-1e9*minGoSeconds) - 1}, true, false, 0}, + // One second past the largest duration representable in Go. + {&durpb.Duration{Seconds: maxGoSeconds + 1, Nanos: int32(math.MaxInt64 - 1e9*maxGoSeconds)}, true, false, 0}, + // One second past the smallest duration representable in Go. + {&durpb.Duration{Seconds: minGoSeconds - 1, Nanos: int32(math.MinInt64 - 1e9*minGoSeconds)}, true, false, 0}, +} + +func TestValidateDuration(t *testing.T) { + for _, test := range durationTests { + err := validateDuration(test.proto) + gotValid := (err == nil) + if gotValid != test.isValid { + t.Errorf("validateDuration(%v) = %t, want %t", test.proto, gotValid, test.isValid) + } + } +} + +func TestDuration(t *testing.T) { + for _, test := range durationTests { + got, err := Duration(test.proto) + gotOK := (err == nil) + wantOK := test.isValid && test.inRange + if gotOK != wantOK { + t.Errorf("Duration(%v) ok = %t, want %t", test.proto, gotOK, wantOK) + } + if err == nil && got != test.dur { + t.Errorf("Duration(%v) = %v, want %v", test.proto, got, test.dur) + } + } +} + +func TestDurationProto(t *testing.T) { + for _, test := range durationTests { + if test.isValid && test.inRange { + got := DurationProto(test.dur) + if !proto.Equal(got, test.proto) { + t.Errorf("DurationProto(%v) = %v, want %v", test.dur, got, test.proto) + } + } + } +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/empty/empty.pb.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/empty/empty.pb.go new file mode 100644 index 0000000..e877b72 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/empty/empty.pb.go @@ -0,0 +1,66 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/empty.proto + +/* +Package empty is a generated protocol buffer package. + +It is generated from these files: + google/protobuf/empty.proto + +It has these top-level messages: + Empty +*/ +package empty + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +// A generic empty message that you can re-use to avoid defining duplicated +// empty messages in your APIs. A typical example is to use it as the request +// or the response type of an API method. For instance: +// +// service Foo { +// rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); +// } +// +// The JSON representation for `Empty` is empty JSON object `{}`. +type Empty struct { +} + +func (m *Empty) Reset() { *m = Empty{} } +func (m *Empty) String() string { return proto.CompactTextString(m) } +func (*Empty) ProtoMessage() {} +func (*Empty) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } +func (*Empty) XXX_WellKnownType() string { return "Empty" } + +func init() { + proto.RegisterType((*Empty)(nil), "google.protobuf.Empty") +} + +func init() { proto.RegisterFile("google/protobuf/empty.proto", fileDescriptor0) } + +var fileDescriptor0 = []byte{ + // 148 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4e, 0xcf, 0xcf, 0x4f, + 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x4f, 0xcd, 0x2d, 0x28, + 0xa9, 0xd4, 0x03, 0x73, 0x85, 0xf8, 0x21, 0x92, 0x7a, 0x30, 0x49, 0x25, 0x76, 0x2e, 0x56, 0x57, + 0x90, 0xbc, 0x53, 0x19, 0x97, 0x70, 0x72, 0x7e, 0xae, 0x1e, 0x9a, 0xbc, 0x13, 0x17, 0x58, 0x36, + 0x00, 0xc4, 0x0d, 0x60, 0x8c, 0x52, 0x4f, 0xcf, 0x2c, 0xc9, 0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, + 0xd5, 0x4f, 0xcf, 0xcf, 0x49, 0xcc, 0x4b, 0x47, 0x58, 0x53, 0x50, 0x52, 0x59, 0x90, 0x5a, 0x0c, + 0xb1, 0xed, 0x07, 0x23, 0xe3, 0x22, 0x26, 0x66, 0xf7, 0x00, 0xa7, 0x55, 0x4c, 0x72, 0xee, 0x10, + 0x13, 0x03, 0xa0, 0xea, 0xf4, 0xc2, 0x53, 0x73, 0x72, 0xbc, 0xf3, 0xf2, 0xcb, 0xf3, 0x42, 0x40, + 0xea, 0x93, 0xd8, 0xc0, 0x06, 0x18, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0x64, 0xd4, 0xb3, 0xa6, + 0xb7, 0x00, 0x00, 0x00, +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/empty/empty.proto b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/empty/empty.proto new file mode 100644 index 0000000..03cacd2 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/empty/empty.proto @@ -0,0 +1,52 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// 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. + +syntax = "proto3"; + +package google.protobuf; + +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option go_package = "github.com/golang/protobuf/ptypes/empty"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "EmptyProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; +option cc_enable_arenas = true; + +// A generic empty message that you can re-use to avoid defining duplicated +// empty messages in your APIs. A typical example is to use it as the request +// or the response type of an API method. For instance: +// +// service Foo { +// rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); +// } +// +// The JSON representation for `Empty` is empty JSON object `{}`. +message Empty {} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/regen.sh b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/regen.sh new file mode 100755 index 0000000..b50a941 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/regen.sh @@ -0,0 +1,43 @@ +#!/bin/bash -e +# +# This script fetches and rebuilds the "well-known types" protocol buffers. +# To run this you will need protoc and goprotobuf installed; +# see https://github.com/golang/protobuf for instructions. +# You also need Go and Git installed. + +PKG=github.com/golang/protobuf/ptypes +UPSTREAM=https://github.com/google/protobuf +UPSTREAM_SUBDIR=src/google/protobuf +PROTO_FILES=(any duration empty struct timestamp wrappers) + +function die() { + echo 1>&2 $* + exit 1 +} + +# Sanity check that the right tools are accessible. +for tool in go git protoc protoc-gen-go; do + q=$(which $tool) || die "didn't find $tool" + echo 1>&2 "$tool: $q" +done + +tmpdir=$(mktemp -d -t regen-wkt.XXXXXX) +trap 'rm -rf $tmpdir' EXIT + +echo -n 1>&2 "finding package dir... " +pkgdir=$(go list -f '{{.Dir}}' $PKG) +echo 1>&2 $pkgdir +base=$(echo $pkgdir | sed "s,/$PKG\$,,") +echo 1>&2 "base: $base" +cd "$base" + +echo 1>&2 "fetching latest protos... " +git clone -q $UPSTREAM $tmpdir + +for file in ${PROTO_FILES[@]}; do + echo 1>&2 "* $file" + protoc --go_out=. -I$tmpdir/src $tmpdir/src/google/protobuf/$file.proto || die + cp $tmpdir/src/google/protobuf/$file.proto $PKG/$file +done + +echo 1>&2 "All OK" diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/struct/struct.pb.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/struct/struct.pb.go new file mode 100644 index 0000000..4cfe608 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/struct/struct.pb.go @@ -0,0 +1,380 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/struct.proto + +/* +Package structpb is a generated protocol buffer package. + +It is generated from these files: + google/protobuf/struct.proto + +It has these top-level messages: + Struct + Value + ListValue +*/ +package structpb + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +// `NullValue` is a singleton enumeration to represent the null value for the +// `Value` type union. +// +// The JSON representation for `NullValue` is JSON `null`. +type NullValue int32 + +const ( + // Null value. + NullValue_NULL_VALUE NullValue = 0 +) + +var NullValue_name = map[int32]string{ + 0: "NULL_VALUE", +} +var NullValue_value = map[string]int32{ + "NULL_VALUE": 0, +} + +func (x NullValue) String() string { + return proto.EnumName(NullValue_name, int32(x)) +} +func (NullValue) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } +func (NullValue) XXX_WellKnownType() string { return "NullValue" } + +// `Struct` represents a structured data value, consisting of fields +// which map to dynamically typed values. In some languages, `Struct` +// might be supported by a native representation. For example, in +// scripting languages like JS a struct is represented as an +// object. The details of that representation are described together +// with the proto support for the language. +// +// The JSON representation for `Struct` is JSON object. +type Struct struct { + // Unordered map of dynamically typed values. + Fields map[string]*Value `protobuf:"bytes,1,rep,name=fields" json:"fields,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` +} + +func (m *Struct) Reset() { *m = Struct{} } +func (m *Struct) String() string { return proto.CompactTextString(m) } +func (*Struct) ProtoMessage() {} +func (*Struct) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } +func (*Struct) XXX_WellKnownType() string { return "Struct" } + +func (m *Struct) GetFields() map[string]*Value { + if m != nil { + return m.Fields + } + return nil +} + +// `Value` represents a dynamically typed value which can be either +// null, a number, a string, a boolean, a recursive struct value, or a +// list of values. A producer of value is expected to set one of that +// variants, absence of any variant indicates an error. +// +// The JSON representation for `Value` is JSON value. +type Value struct { + // The kind of value. + // + // Types that are valid to be assigned to Kind: + // *Value_NullValue + // *Value_NumberValue + // *Value_StringValue + // *Value_BoolValue + // *Value_StructValue + // *Value_ListValue + Kind isValue_Kind `protobuf_oneof:"kind"` +} + +func (m *Value) Reset() { *m = Value{} } +func (m *Value) String() string { return proto.CompactTextString(m) } +func (*Value) ProtoMessage() {} +func (*Value) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } +func (*Value) XXX_WellKnownType() string { return "Value" } + +type isValue_Kind interface { + isValue_Kind() +} + +type Value_NullValue struct { + NullValue NullValue `protobuf:"varint,1,opt,name=null_value,json=nullValue,enum=google.protobuf.NullValue,oneof"` +} +type Value_NumberValue struct { + NumberValue float64 `protobuf:"fixed64,2,opt,name=number_value,json=numberValue,oneof"` +} +type Value_StringValue struct { + StringValue string `protobuf:"bytes,3,opt,name=string_value,json=stringValue,oneof"` +} +type Value_BoolValue struct { + BoolValue bool `protobuf:"varint,4,opt,name=bool_value,json=boolValue,oneof"` +} +type Value_StructValue struct { + StructValue *Struct `protobuf:"bytes,5,opt,name=struct_value,json=structValue,oneof"` +} +type Value_ListValue struct { + ListValue *ListValue `protobuf:"bytes,6,opt,name=list_value,json=listValue,oneof"` +} + +func (*Value_NullValue) isValue_Kind() {} +func (*Value_NumberValue) isValue_Kind() {} +func (*Value_StringValue) isValue_Kind() {} +func (*Value_BoolValue) isValue_Kind() {} +func (*Value_StructValue) isValue_Kind() {} +func (*Value_ListValue) isValue_Kind() {} + +func (m *Value) GetKind() isValue_Kind { + if m != nil { + return m.Kind + } + return nil +} + +func (m *Value) GetNullValue() NullValue { + if x, ok := m.GetKind().(*Value_NullValue); ok { + return x.NullValue + } + return NullValue_NULL_VALUE +} + +func (m *Value) GetNumberValue() float64 { + if x, ok := m.GetKind().(*Value_NumberValue); ok { + return x.NumberValue + } + return 0 +} + +func (m *Value) GetStringValue() string { + if x, ok := m.GetKind().(*Value_StringValue); ok { + return x.StringValue + } + return "" +} + +func (m *Value) GetBoolValue() bool { + if x, ok := m.GetKind().(*Value_BoolValue); ok { + return x.BoolValue + } + return false +} + +func (m *Value) GetStructValue() *Struct { + if x, ok := m.GetKind().(*Value_StructValue); ok { + return x.StructValue + } + return nil +} + +func (m *Value) GetListValue() *ListValue { + if x, ok := m.GetKind().(*Value_ListValue); ok { + return x.ListValue + } + return nil +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*Value) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _Value_OneofMarshaler, _Value_OneofUnmarshaler, _Value_OneofSizer, []interface{}{ + (*Value_NullValue)(nil), + (*Value_NumberValue)(nil), + (*Value_StringValue)(nil), + (*Value_BoolValue)(nil), + (*Value_StructValue)(nil), + (*Value_ListValue)(nil), + } +} + +func _Value_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*Value) + // kind + switch x := m.Kind.(type) { + case *Value_NullValue: + b.EncodeVarint(1<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.NullValue)) + case *Value_NumberValue: + b.EncodeVarint(2<<3 | proto.WireFixed64) + b.EncodeFixed64(math.Float64bits(x.NumberValue)) + case *Value_StringValue: + b.EncodeVarint(3<<3 | proto.WireBytes) + b.EncodeStringBytes(x.StringValue) + case *Value_BoolValue: + t := uint64(0) + if x.BoolValue { + t = 1 + } + b.EncodeVarint(4<<3 | proto.WireVarint) + b.EncodeVarint(t) + case *Value_StructValue: + b.EncodeVarint(5<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.StructValue); err != nil { + return err + } + case *Value_ListValue: + b.EncodeVarint(6<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.ListValue); err != nil { + return err + } + case nil: + default: + return fmt.Errorf("Value.Kind has unexpected type %T", x) + } + return nil +} + +func _Value_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*Value) + switch tag { + case 1: // kind.null_value + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Kind = &Value_NullValue{NullValue(x)} + return true, err + case 2: // kind.number_value + if wire != proto.WireFixed64 { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeFixed64() + m.Kind = &Value_NumberValue{math.Float64frombits(x)} + return true, err + case 3: // kind.string_value + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeStringBytes() + m.Kind = &Value_StringValue{x} + return true, err + case 4: // kind.bool_value + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Kind = &Value_BoolValue{x != 0} + return true, err + case 5: // kind.struct_value + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(Struct) + err := b.DecodeMessage(msg) + m.Kind = &Value_StructValue{msg} + return true, err + case 6: // kind.list_value + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(ListValue) + err := b.DecodeMessage(msg) + m.Kind = &Value_ListValue{msg} + return true, err + default: + return false, nil + } +} + +func _Value_OneofSizer(msg proto.Message) (n int) { + m := msg.(*Value) + // kind + switch x := m.Kind.(type) { + case *Value_NullValue: + n += proto.SizeVarint(1<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.NullValue)) + case *Value_NumberValue: + n += proto.SizeVarint(2<<3 | proto.WireFixed64) + n += 8 + case *Value_StringValue: + n += proto.SizeVarint(3<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(len(x.StringValue))) + n += len(x.StringValue) + case *Value_BoolValue: + n += proto.SizeVarint(4<<3 | proto.WireVarint) + n += 1 + case *Value_StructValue: + s := proto.Size(x.StructValue) + n += proto.SizeVarint(5<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case *Value_ListValue: + s := proto.Size(x.ListValue) + n += proto.SizeVarint(6<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +// `ListValue` is a wrapper around a repeated field of values. +// +// The JSON representation for `ListValue` is JSON array. +type ListValue struct { + // Repeated field of dynamically typed values. + Values []*Value `protobuf:"bytes,1,rep,name=values" json:"values,omitempty"` +} + +func (m *ListValue) Reset() { *m = ListValue{} } +func (m *ListValue) String() string { return proto.CompactTextString(m) } +func (*ListValue) ProtoMessage() {} +func (*ListValue) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } +func (*ListValue) XXX_WellKnownType() string { return "ListValue" } + +func (m *ListValue) GetValues() []*Value { + if m != nil { + return m.Values + } + return nil +} + +func init() { + proto.RegisterType((*Struct)(nil), "google.protobuf.Struct") + proto.RegisterType((*Value)(nil), "google.protobuf.Value") + proto.RegisterType((*ListValue)(nil), "google.protobuf.ListValue") + proto.RegisterEnum("google.protobuf.NullValue", NullValue_name, NullValue_value) +} + +func init() { proto.RegisterFile("google/protobuf/struct.proto", fileDescriptor0) } + +var fileDescriptor0 = []byte{ + // 417 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x92, 0x41, 0x8b, 0xd3, 0x40, + 0x14, 0xc7, 0x3b, 0xc9, 0x36, 0x98, 0x17, 0x59, 0x97, 0x11, 0xb4, 0xac, 0xa2, 0xa1, 0x7b, 0x09, + 0x22, 0x29, 0xd6, 0x8b, 0x18, 0x2f, 0x06, 0xd6, 0x5d, 0x30, 0x2c, 0x31, 0xba, 0x15, 0xbc, 0x94, + 0x26, 0x4d, 0x63, 0xe8, 0x74, 0x26, 0x24, 0x33, 0x4a, 0x8f, 0x7e, 0x0b, 0xcf, 0x1e, 0x3d, 0xfa, + 0xe9, 0x3c, 0xca, 0xcc, 0x24, 0xa9, 0xb4, 0xf4, 0x94, 0xbc, 0xf7, 0x7e, 0xef, 0x3f, 0xef, 0xff, + 0x66, 0xe0, 0x71, 0xc1, 0x58, 0x41, 0xf2, 0x49, 0x55, 0x33, 0xce, 0x52, 0xb1, 0x9a, 0x34, 0xbc, + 0x16, 0x19, 0xf7, 0x55, 0x8c, 0xef, 0xe9, 0xaa, 0xdf, 0x55, 0xc7, 0x3f, 0x11, 0x58, 0x1f, 0x15, + 0x81, 0x03, 0xb0, 0x56, 0x65, 0x4e, 0x96, 0xcd, 0x08, 0xb9, 0xa6, 0xe7, 0x4c, 0x2f, 0xfc, 0x3d, + 0xd8, 0xd7, 0xa0, 0xff, 0x4e, 0x51, 0x97, 0x94, 0xd7, 0xdb, 0xa4, 0x6d, 0x39, 0xff, 0x00, 0xce, + 0x7f, 0x69, 0x7c, 0x06, 0xe6, 0x3a, 0xdf, 0x8e, 0x90, 0x8b, 0x3c, 0x3b, 0x91, 0xbf, 0xf8, 0x39, + 0x0c, 0xbf, 0x2d, 0x88, 0xc8, 0x47, 0x86, 0x8b, 0x3c, 0x67, 0xfa, 0xe0, 0x40, 0x7c, 0x26, 0xab, + 0x89, 0x86, 0x5e, 0x1b, 0xaf, 0xd0, 0xf8, 0x8f, 0x01, 0x43, 0x95, 0xc4, 0x01, 0x00, 0x15, 0x84, + 0xcc, 0xb5, 0x80, 0x14, 0x3d, 0x9d, 0x9e, 0x1f, 0x08, 0xdc, 0x08, 0x42, 0x14, 0x7f, 0x3d, 0x48, + 0x6c, 0xda, 0x05, 0xf8, 0x02, 0xee, 0x52, 0xb1, 0x49, 0xf3, 0x7a, 0xbe, 0x3b, 0x1f, 0x5d, 0x0f, + 0x12, 0x47, 0x67, 0x7b, 0xa8, 0xe1, 0x75, 0x49, 0x8b, 0x16, 0x32, 0xe5, 0xe0, 0x12, 0xd2, 0x59, + 0x0d, 0x3d, 0x05, 0x48, 0x19, 0xeb, 0xc6, 0x38, 0x71, 0x91, 0x77, 0x47, 0x1e, 0x25, 0x73, 0x1a, + 0x78, 0xa3, 0x54, 0x44, 0xc6, 0x5b, 0x64, 0xa8, 0xac, 0x3e, 0x3c, 0xb2, 0xc7, 0x56, 0x5e, 0x64, + 0xbc, 0x77, 0x49, 0xca, 0xa6, 0xeb, 0xb5, 0x54, 0xef, 0xa1, 0xcb, 0xa8, 0x6c, 0x78, 0xef, 0x92, + 0x74, 0x41, 0x68, 0xc1, 0xc9, 0xba, 0xa4, 0xcb, 0x71, 0x00, 0x76, 0x4f, 0x60, 0x1f, 0x2c, 0x25, + 0xd6, 0xdd, 0xe8, 0xb1, 0xa5, 0xb7, 0xd4, 0xb3, 0x47, 0x60, 0xf7, 0x4b, 0xc4, 0xa7, 0x00, 0x37, + 0xb7, 0x51, 0x34, 0x9f, 0xbd, 0x8d, 0x6e, 0x2f, 0xcf, 0x06, 0xe1, 0x0f, 0x04, 0xf7, 0x33, 0xb6, + 0xd9, 0x97, 0x08, 0x1d, 0xed, 0x26, 0x96, 0x71, 0x8c, 0xbe, 0xbc, 0x28, 0x4a, 0xfe, 0x55, 0xa4, + 0x7e, 0xc6, 0x36, 0x93, 0x82, 0x91, 0x05, 0x2d, 0x76, 0x4f, 0xb1, 0xe2, 0xdb, 0x2a, 0x6f, 0xda, + 0x17, 0x19, 0xe8, 0x4f, 0x95, 0xfe, 0x45, 0xe8, 0x97, 0x61, 0x5e, 0xc5, 0xe1, 0x6f, 0xe3, 0xc9, + 0x95, 0x16, 0x8f, 0xbb, 0xf9, 0x3e, 0xe7, 0x84, 0xbc, 0xa7, 0xec, 0x3b, 0xfd, 0x24, 0x3b, 0x53, + 0x4b, 0x49, 0xbd, 0xfc, 0x17, 0x00, 0x00, 0xff, 0xff, 0xe8, 0x1b, 0x59, 0xf8, 0xe5, 0x02, 0x00, + 0x00, +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/struct/struct.proto b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/struct/struct.proto new file mode 100644 index 0000000..7d7808e --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/struct/struct.proto @@ -0,0 +1,96 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// 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. + +syntax = "proto3"; + +package google.protobuf; + +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option cc_enable_arenas = true; +option go_package = "github.com/golang/protobuf/ptypes/struct;structpb"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "StructProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; + + +// `Struct` represents a structured data value, consisting of fields +// which map to dynamically typed values. In some languages, `Struct` +// might be supported by a native representation. For example, in +// scripting languages like JS a struct is represented as an +// object. The details of that representation are described together +// with the proto support for the language. +// +// The JSON representation for `Struct` is JSON object. +message Struct { + // Unordered map of dynamically typed values. + map fields = 1; +} + +// `Value` represents a dynamically typed value which can be either +// null, a number, a string, a boolean, a recursive struct value, or a +// list of values. A producer of value is expected to set one of that +// variants, absence of any variant indicates an error. +// +// The JSON representation for `Value` is JSON value. +message Value { + // The kind of value. + oneof kind { + // Represents a null value. + NullValue null_value = 1; + // Represents a double value. + double number_value = 2; + // Represents a string value. + string string_value = 3; + // Represents a boolean value. + bool bool_value = 4; + // Represents a structured value. + Struct struct_value = 5; + // Represents a repeated `Value`. + ListValue list_value = 6; + } +} + +// `NullValue` is a singleton enumeration to represent the null value for the +// `Value` type union. +// +// The JSON representation for `NullValue` is JSON `null`. +enum NullValue { + // Null value. + NULL_VALUE = 0; +} + +// `ListValue` is a wrapper around a repeated field of values. +// +// The JSON representation for `ListValue` is JSON array. +message ListValue { + // Repeated field of dynamically typed values. + repeated Value values = 1; +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/timestamp.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/timestamp.go new file mode 100644 index 0000000..47f10db --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/timestamp.go @@ -0,0 +1,134 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package ptypes + +// This file implements operations on google.protobuf.Timestamp. + +import ( + "errors" + "fmt" + "time" + + tspb "github.com/golang/protobuf/ptypes/timestamp" +) + +const ( + // Seconds field of the earliest valid Timestamp. + // This is time.Date(1, 1, 1, 0, 0, 0, 0, time.UTC).Unix(). + minValidSeconds = -62135596800 + // Seconds field just after the latest valid Timestamp. + // This is time.Date(10000, 1, 1, 0, 0, 0, 0, time.UTC).Unix(). + maxValidSeconds = 253402300800 +) + +// validateTimestamp determines whether a Timestamp is valid. +// A valid timestamp represents a time in the range +// [0001-01-01, 10000-01-01) and has a Nanos field +// in the range [0, 1e9). +// +// If the Timestamp is valid, validateTimestamp returns nil. +// Otherwise, it returns an error that describes +// the problem. +// +// Every valid Timestamp can be represented by a time.Time, but the converse is not true. +func validateTimestamp(ts *tspb.Timestamp) error { + if ts == nil { + return errors.New("timestamp: nil Timestamp") + } + if ts.Seconds < minValidSeconds { + return fmt.Errorf("timestamp: %v before 0001-01-01", ts) + } + if ts.Seconds >= maxValidSeconds { + return fmt.Errorf("timestamp: %v after 10000-01-01", ts) + } + if ts.Nanos < 0 || ts.Nanos >= 1e9 { + return fmt.Errorf("timestamp: %v: nanos not in range [0, 1e9)", ts) + } + return nil +} + +// Timestamp converts a google.protobuf.Timestamp proto to a time.Time. +// It returns an error if the argument is invalid. +// +// Unlike most Go functions, if Timestamp returns an error, the first return value +// is not the zero time.Time. Instead, it is the value obtained from the +// time.Unix function when passed the contents of the Timestamp, in the UTC +// locale. This may or may not be a meaningful time; many invalid Timestamps +// do map to valid time.Times. +// +// A nil Timestamp returns an error. The first return value in that case is +// undefined. +func Timestamp(ts *tspb.Timestamp) (time.Time, error) { + // Don't return the zero value on error, because corresponds to a valid + // timestamp. Instead return whatever time.Unix gives us. + var t time.Time + if ts == nil { + t = time.Unix(0, 0).UTC() // treat nil like the empty Timestamp + } else { + t = time.Unix(ts.Seconds, int64(ts.Nanos)).UTC() + } + return t, validateTimestamp(ts) +} + +// TimestampNow returns a google.protobuf.Timestamp for the current time. +func TimestampNow() *tspb.Timestamp { + ts, err := TimestampProto(time.Now()) + if err != nil { + panic("ptypes: time.Now() out of Timestamp range") + } + return ts +} + +// TimestampProto converts the time.Time to a google.protobuf.Timestamp proto. +// It returns an error if the resulting Timestamp is invalid. +func TimestampProto(t time.Time) (*tspb.Timestamp, error) { + seconds := t.Unix() + nanos := int32(t.Sub(time.Unix(seconds, 0))) + ts := &tspb.Timestamp{ + Seconds: seconds, + Nanos: nanos, + } + if err := validateTimestamp(ts); err != nil { + return nil, err + } + return ts, nil +} + +// TimestampString returns the RFC 3339 string for valid Timestamps. For invalid +// Timestamps, it returns an error message in parentheses. +func TimestampString(ts *tspb.Timestamp) string { + t, err := Timestamp(ts) + if err != nil { + return fmt.Sprintf("(%v)", err) + } + return t.Format(time.RFC3339Nano) +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go new file mode 100644 index 0000000..e23e4a2 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go @@ -0,0 +1,160 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/timestamp.proto + +/* +Package timestamp is a generated protocol buffer package. + +It is generated from these files: + google/protobuf/timestamp.proto + +It has these top-level messages: + Timestamp +*/ +package timestamp + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +// A Timestamp represents a point in time independent of any time zone +// or calendar, represented as seconds and fractions of seconds at +// nanosecond resolution in UTC Epoch time. It is encoded using the +// Proleptic Gregorian Calendar which extends the Gregorian calendar +// backwards to year one. It is encoded assuming all minutes are 60 +// seconds long, i.e. leap seconds are "smeared" so that no leap second +// table is needed for interpretation. Range is from +// 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. +// By restricting to that range, we ensure that we can convert to +// and from RFC 3339 date strings. +// See [https://www.ietf.org/rfc/rfc3339.txt](https://www.ietf.org/rfc/rfc3339.txt). +// +// # Examples +// +// Example 1: Compute Timestamp from POSIX `time()`. +// +// Timestamp timestamp; +// timestamp.set_seconds(time(NULL)); +// timestamp.set_nanos(0); +// +// Example 2: Compute Timestamp from POSIX `gettimeofday()`. +// +// struct timeval tv; +// gettimeofday(&tv, NULL); +// +// Timestamp timestamp; +// timestamp.set_seconds(tv.tv_sec); +// timestamp.set_nanos(tv.tv_usec * 1000); +// +// Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`. +// +// FILETIME ft; +// GetSystemTimeAsFileTime(&ft); +// UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime; +// +// // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z +// // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z. +// Timestamp timestamp; +// timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL)); +// timestamp.set_nanos((INT32) ((ticks % 10000000) * 100)); +// +// Example 4: Compute Timestamp from Java `System.currentTimeMillis()`. +// +// long millis = System.currentTimeMillis(); +// +// Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000) +// .setNanos((int) ((millis % 1000) * 1000000)).build(); +// +// +// Example 5: Compute Timestamp from current time in Python. +// +// timestamp = Timestamp() +// timestamp.GetCurrentTime() +// +// # JSON Mapping +// +// In JSON format, the Timestamp type is encoded as a string in the +// [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the +// format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z" +// where {year} is always expressed using four digits while {month}, {day}, +// {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional +// seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution), +// are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone +// is required, though only UTC (as indicated by "Z") is presently supported. +// +// For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past +// 01:30 UTC on January 15, 2017. +// +// In JavaScript, one can convert a Date object to this format using the +// standard [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString] +// method. In Python, a standard `datetime.datetime` object can be converted +// to this format using [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) +// with the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one +// can use the Joda Time's [`ISODateTimeFormat.dateTime()`]( +// http://joda-time.sourceforge.net/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime()) +// to obtain a formatter capable of generating timestamps in this format. +// +// +type Timestamp struct { + // Represents seconds of UTC time since Unix epoch + // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to + // 9999-12-31T23:59:59Z inclusive. + Seconds int64 `protobuf:"varint,1,opt,name=seconds" json:"seconds,omitempty"` + // Non-negative fractions of a second at nanosecond resolution. Negative + // second values with fractions must still have non-negative nanos values + // that count forward in time. Must be from 0 to 999,999,999 + // inclusive. + Nanos int32 `protobuf:"varint,2,opt,name=nanos" json:"nanos,omitempty"` +} + +func (m *Timestamp) Reset() { *m = Timestamp{} } +func (m *Timestamp) String() string { return proto.CompactTextString(m) } +func (*Timestamp) ProtoMessage() {} +func (*Timestamp) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } +func (*Timestamp) XXX_WellKnownType() string { return "Timestamp" } + +func (m *Timestamp) GetSeconds() int64 { + if m != nil { + return m.Seconds + } + return 0 +} + +func (m *Timestamp) GetNanos() int32 { + if m != nil { + return m.Nanos + } + return 0 +} + +func init() { + proto.RegisterType((*Timestamp)(nil), "google.protobuf.Timestamp") +} + +func init() { proto.RegisterFile("google/protobuf/timestamp.proto", fileDescriptor0) } + +var fileDescriptor0 = []byte{ + // 191 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4f, 0xcf, 0xcf, 0x4f, + 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x2f, 0xc9, 0xcc, 0x4d, + 0x2d, 0x2e, 0x49, 0xcc, 0x2d, 0xd0, 0x03, 0x0b, 0x09, 0xf1, 0x43, 0x14, 0xe8, 0xc1, 0x14, 0x28, + 0x59, 0x73, 0x71, 0x86, 0xc0, 0xd4, 0x08, 0x49, 0x70, 0xb1, 0x17, 0xa7, 0x26, 0xe7, 0xe7, 0xa5, + 0x14, 0x4b, 0x30, 0x2a, 0x30, 0x6a, 0x30, 0x07, 0xc1, 0xb8, 0x42, 0x22, 0x5c, 0xac, 0x79, 0x89, + 0x79, 0xf9, 0xc5, 0x12, 0x4c, 0x0a, 0x8c, 0x1a, 0xac, 0x41, 0x10, 0x8e, 0x53, 0x1d, 0x97, 0x70, + 0x72, 0x7e, 0xae, 0x1e, 0x9a, 0x99, 0x4e, 0x7c, 0x70, 0x13, 0x03, 0x40, 0x42, 0x01, 0x8c, 0x51, + 0xda, 0xe9, 0x99, 0x25, 0x19, 0xa5, 0x49, 0x7a, 0xc9, 0xf9, 0xb9, 0xfa, 0xe9, 0xf9, 0x39, 0x89, + 0x79, 0xe9, 0x08, 0x27, 0x16, 0x94, 0x54, 0x16, 0xa4, 0x16, 0x23, 0x5c, 0xfa, 0x83, 0x91, 0x71, + 0x11, 0x13, 0xb3, 0x7b, 0x80, 0xd3, 0x2a, 0x26, 0x39, 0x77, 0x88, 0xc9, 0x01, 0x50, 0xb5, 0x7a, + 0xe1, 0xa9, 0x39, 0x39, 0xde, 0x79, 0xf9, 0xe5, 0x79, 0x21, 0x20, 0x3d, 0x49, 0x6c, 0x60, 0x43, + 0x8c, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xbc, 0x77, 0x4a, 0x07, 0xf7, 0x00, 0x00, 0x00, +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.proto b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.proto new file mode 100644 index 0000000..b7cbd17 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.proto @@ -0,0 +1,133 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// 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. + +syntax = "proto3"; + +package google.protobuf; + +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option cc_enable_arenas = true; +option go_package = "github.com/golang/protobuf/ptypes/timestamp"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "TimestampProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; + +// A Timestamp represents a point in time independent of any time zone +// or calendar, represented as seconds and fractions of seconds at +// nanosecond resolution in UTC Epoch time. It is encoded using the +// Proleptic Gregorian Calendar which extends the Gregorian calendar +// backwards to year one. It is encoded assuming all minutes are 60 +// seconds long, i.e. leap seconds are "smeared" so that no leap second +// table is needed for interpretation. Range is from +// 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. +// By restricting to that range, we ensure that we can convert to +// and from RFC 3339 date strings. +// See [https://www.ietf.org/rfc/rfc3339.txt](https://www.ietf.org/rfc/rfc3339.txt). +// +// # Examples +// +// Example 1: Compute Timestamp from POSIX `time()`. +// +// Timestamp timestamp; +// timestamp.set_seconds(time(NULL)); +// timestamp.set_nanos(0); +// +// Example 2: Compute Timestamp from POSIX `gettimeofday()`. +// +// struct timeval tv; +// gettimeofday(&tv, NULL); +// +// Timestamp timestamp; +// timestamp.set_seconds(tv.tv_sec); +// timestamp.set_nanos(tv.tv_usec * 1000); +// +// Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`. +// +// FILETIME ft; +// GetSystemTimeAsFileTime(&ft); +// UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime; +// +// // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z +// // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z. +// Timestamp timestamp; +// timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL)); +// timestamp.set_nanos((INT32) ((ticks % 10000000) * 100)); +// +// Example 4: Compute Timestamp from Java `System.currentTimeMillis()`. +// +// long millis = System.currentTimeMillis(); +// +// Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000) +// .setNanos((int) ((millis % 1000) * 1000000)).build(); +// +// +// Example 5: Compute Timestamp from current time in Python. +// +// timestamp = Timestamp() +// timestamp.GetCurrentTime() +// +// # JSON Mapping +// +// In JSON format, the Timestamp type is encoded as a string in the +// [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the +// format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z" +// where {year} is always expressed using four digits while {month}, {day}, +// {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional +// seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution), +// are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone +// is required, though only UTC (as indicated by "Z") is presently supported. +// +// For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past +// 01:30 UTC on January 15, 2017. +// +// In JavaScript, one can convert a Date object to this format using the +// standard [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString] +// method. In Python, a standard `datetime.datetime` object can be converted +// to this format using [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) +// with the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one +// can use the Joda Time's [`ISODateTimeFormat.dateTime()`]( +// http://joda-time.sourceforge.net/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime()) +// to obtain a formatter capable of generating timestamps in this format. +// +// +message Timestamp { + + // Represents seconds of UTC time since Unix epoch + // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to + // 9999-12-31T23:59:59Z inclusive. + int64 seconds = 1; + + // Non-negative fractions of a second at nanosecond resolution. Negative + // second values with fractions must still have non-negative nanos values + // that count forward in time. Must be from 0 to 999,999,999 + // inclusive. + int32 nanos = 2; +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/timestamp_test.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/timestamp_test.go new file mode 100644 index 0000000..6e3c969 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/timestamp_test.go @@ -0,0 +1,153 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// 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. + +package ptypes + +import ( + "math" + "testing" + "time" + + "github.com/golang/protobuf/proto" + tspb "github.com/golang/protobuf/ptypes/timestamp" +) + +var tests = []struct { + ts *tspb.Timestamp + valid bool + t time.Time +}{ + // The timestamp representing the Unix epoch date. + {&tspb.Timestamp{Seconds: 0, Nanos: 0}, true, utcDate(1970, 1, 1)}, + // The smallest representable timestamp. + {&tspb.Timestamp{Seconds: math.MinInt64, Nanos: math.MinInt32}, false, + time.Unix(math.MinInt64, math.MinInt32).UTC()}, + // The smallest representable timestamp with non-negative nanos. + {&tspb.Timestamp{Seconds: math.MinInt64, Nanos: 0}, false, time.Unix(math.MinInt64, 0).UTC()}, + // The earliest valid timestamp. + {&tspb.Timestamp{Seconds: minValidSeconds, Nanos: 0}, true, utcDate(1, 1, 1)}, + //"0001-01-01T00:00:00Z"}, + // The largest representable timestamp. + {&tspb.Timestamp{Seconds: math.MaxInt64, Nanos: math.MaxInt32}, false, + time.Unix(math.MaxInt64, math.MaxInt32).UTC()}, + // The largest representable timestamp with nanos in range. + {&tspb.Timestamp{Seconds: math.MaxInt64, Nanos: 1e9 - 1}, false, + time.Unix(math.MaxInt64, 1e9-1).UTC()}, + // The largest valid timestamp. + {&tspb.Timestamp{Seconds: maxValidSeconds - 1, Nanos: 1e9 - 1}, true, + time.Date(9999, 12, 31, 23, 59, 59, 1e9-1, time.UTC)}, + // The smallest invalid timestamp that is larger than the valid range. + {&tspb.Timestamp{Seconds: maxValidSeconds, Nanos: 0}, false, time.Unix(maxValidSeconds, 0).UTC()}, + // A date before the epoch. + {&tspb.Timestamp{Seconds: -281836800, Nanos: 0}, true, utcDate(1961, 1, 26)}, + // A date after the epoch. + {&tspb.Timestamp{Seconds: 1296000000, Nanos: 0}, true, utcDate(2011, 1, 26)}, + // A date after the epoch, in the middle of the day. + {&tspb.Timestamp{Seconds: 1296012345, Nanos: 940483}, true, + time.Date(2011, 1, 26, 3, 25, 45, 940483, time.UTC)}, +} + +func TestValidateTimestamp(t *testing.T) { + for _, s := range tests { + got := validateTimestamp(s.ts) + if (got == nil) != s.valid { + t.Errorf("validateTimestamp(%v) = %v, want %v", s.ts, got, s.valid) + } + } +} + +func TestTimestamp(t *testing.T) { + for _, s := range tests { + got, err := Timestamp(s.ts) + if (err == nil) != s.valid { + t.Errorf("Timestamp(%v) error = %v, but valid = %t", s.ts, err, s.valid) + } else if s.valid && got != s.t { + t.Errorf("Timestamp(%v) = %v, want %v", s.ts, got, s.t) + } + } + // Special case: a nil Timestamp is an error, but returns the 0 Unix time. + got, err := Timestamp(nil) + want := time.Unix(0, 0).UTC() + if got != want { + t.Errorf("Timestamp(nil) = %v, want %v", got, want) + } + if err == nil { + t.Errorf("Timestamp(nil) error = nil, expected error") + } +} + +func TestTimestampProto(t *testing.T) { + for _, s := range tests { + got, err := TimestampProto(s.t) + if (err == nil) != s.valid { + t.Errorf("TimestampProto(%v) error = %v, but valid = %t", s.t, err, s.valid) + } else if s.valid && !proto.Equal(got, s.ts) { + t.Errorf("TimestampProto(%v) = %v, want %v", s.t, got, s.ts) + } + } + // No corresponding special case here: no time.Time results in a nil Timestamp. +} + +func TestTimestampString(t *testing.T) { + for _, test := range []struct { + ts *tspb.Timestamp + want string + }{ + // Not much testing needed because presumably time.Format is + // well-tested. + {&tspb.Timestamp{Seconds: 0, Nanos: 0}, "1970-01-01T00:00:00Z"}, + {&tspb.Timestamp{Seconds: minValidSeconds - 1, Nanos: 0}, "(timestamp: seconds:-62135596801 before 0001-01-01)"}, + } { + got := TimestampString(test.ts) + if got != test.want { + t.Errorf("TimestampString(%v) = %q, want %q", test.ts, got, test.want) + } + } +} + +func utcDate(year, month, day int) time.Time { + return time.Date(year, time.Month(month), day, 0, 0, 0, 0, time.UTC) +} + +func TestTimestampNow(t *testing.T) { + // Bracket the expected time. + before := time.Now() + ts := TimestampNow() + after := time.Now() + + tm, err := Timestamp(ts) + if err != nil { + t.Errorf("between %v and %v\nTimestampNow() = %v\nwhich is invalid (%v)", before, after, ts, err) + } + if tm.Before(before) || tm.After(after) { + t.Errorf("between %v and %v\nTimestamp(TimestampNow()) = %v", before, after, tm) + } +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/wrappers/wrappers.pb.go b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/wrappers/wrappers.pb.go new file mode 100644 index 0000000..0ed59bf --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/wrappers/wrappers.pb.go @@ -0,0 +1,260 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/wrappers.proto + +/* +Package wrappers is a generated protocol buffer package. + +It is generated from these files: + google/protobuf/wrappers.proto + +It has these top-level messages: + DoubleValue + FloatValue + Int64Value + UInt64Value + Int32Value + UInt32Value + BoolValue + StringValue + BytesValue +*/ +package wrappers + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +// Wrapper message for `double`. +// +// The JSON representation for `DoubleValue` is JSON number. +type DoubleValue struct { + // The double value. + Value float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` +} + +func (m *DoubleValue) Reset() { *m = DoubleValue{} } +func (m *DoubleValue) String() string { return proto.CompactTextString(m) } +func (*DoubleValue) ProtoMessage() {} +func (*DoubleValue) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } +func (*DoubleValue) XXX_WellKnownType() string { return "DoubleValue" } + +func (m *DoubleValue) GetValue() float64 { + if m != nil { + return m.Value + } + return 0 +} + +// Wrapper message for `float`. +// +// The JSON representation for `FloatValue` is JSON number. +type FloatValue struct { + // The float value. + Value float32 `protobuf:"fixed32,1,opt,name=value" json:"value,omitempty"` +} + +func (m *FloatValue) Reset() { *m = FloatValue{} } +func (m *FloatValue) String() string { return proto.CompactTextString(m) } +func (*FloatValue) ProtoMessage() {} +func (*FloatValue) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } +func (*FloatValue) XXX_WellKnownType() string { return "FloatValue" } + +func (m *FloatValue) GetValue() float32 { + if m != nil { + return m.Value + } + return 0 +} + +// Wrapper message for `int64`. +// +// The JSON representation for `Int64Value` is JSON string. +type Int64Value struct { + // The int64 value. + Value int64 `protobuf:"varint,1,opt,name=value" json:"value,omitempty"` +} + +func (m *Int64Value) Reset() { *m = Int64Value{} } +func (m *Int64Value) String() string { return proto.CompactTextString(m) } +func (*Int64Value) ProtoMessage() {} +func (*Int64Value) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } +func (*Int64Value) XXX_WellKnownType() string { return "Int64Value" } + +func (m *Int64Value) GetValue() int64 { + if m != nil { + return m.Value + } + return 0 +} + +// Wrapper message for `uint64`. +// +// The JSON representation for `UInt64Value` is JSON string. +type UInt64Value struct { + // The uint64 value. + Value uint64 `protobuf:"varint,1,opt,name=value" json:"value,omitempty"` +} + +func (m *UInt64Value) Reset() { *m = UInt64Value{} } +func (m *UInt64Value) String() string { return proto.CompactTextString(m) } +func (*UInt64Value) ProtoMessage() {} +func (*UInt64Value) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } +func (*UInt64Value) XXX_WellKnownType() string { return "UInt64Value" } + +func (m *UInt64Value) GetValue() uint64 { + if m != nil { + return m.Value + } + return 0 +} + +// Wrapper message for `int32`. +// +// The JSON representation for `Int32Value` is JSON number. +type Int32Value struct { + // The int32 value. + Value int32 `protobuf:"varint,1,opt,name=value" json:"value,omitempty"` +} + +func (m *Int32Value) Reset() { *m = Int32Value{} } +func (m *Int32Value) String() string { return proto.CompactTextString(m) } +func (*Int32Value) ProtoMessage() {} +func (*Int32Value) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } +func (*Int32Value) XXX_WellKnownType() string { return "Int32Value" } + +func (m *Int32Value) GetValue() int32 { + if m != nil { + return m.Value + } + return 0 +} + +// Wrapper message for `uint32`. +// +// The JSON representation for `UInt32Value` is JSON number. +type UInt32Value struct { + // The uint32 value. + Value uint32 `protobuf:"varint,1,opt,name=value" json:"value,omitempty"` +} + +func (m *UInt32Value) Reset() { *m = UInt32Value{} } +func (m *UInt32Value) String() string { return proto.CompactTextString(m) } +func (*UInt32Value) ProtoMessage() {} +func (*UInt32Value) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } +func (*UInt32Value) XXX_WellKnownType() string { return "UInt32Value" } + +func (m *UInt32Value) GetValue() uint32 { + if m != nil { + return m.Value + } + return 0 +} + +// Wrapper message for `bool`. +// +// The JSON representation for `BoolValue` is JSON `true` and `false`. +type BoolValue struct { + // The bool value. + Value bool `protobuf:"varint,1,opt,name=value" json:"value,omitempty"` +} + +func (m *BoolValue) Reset() { *m = BoolValue{} } +func (m *BoolValue) String() string { return proto.CompactTextString(m) } +func (*BoolValue) ProtoMessage() {} +func (*BoolValue) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } +func (*BoolValue) XXX_WellKnownType() string { return "BoolValue" } + +func (m *BoolValue) GetValue() bool { + if m != nil { + return m.Value + } + return false +} + +// Wrapper message for `string`. +// +// The JSON representation for `StringValue` is JSON string. +type StringValue struct { + // The string value. + Value string `protobuf:"bytes,1,opt,name=value" json:"value,omitempty"` +} + +func (m *StringValue) Reset() { *m = StringValue{} } +func (m *StringValue) String() string { return proto.CompactTextString(m) } +func (*StringValue) ProtoMessage() {} +func (*StringValue) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } +func (*StringValue) XXX_WellKnownType() string { return "StringValue" } + +func (m *StringValue) GetValue() string { + if m != nil { + return m.Value + } + return "" +} + +// Wrapper message for `bytes`. +// +// The JSON representation for `BytesValue` is JSON string. +type BytesValue struct { + // The bytes value. + Value []byte `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *BytesValue) Reset() { *m = BytesValue{} } +func (m *BytesValue) String() string { return proto.CompactTextString(m) } +func (*BytesValue) ProtoMessage() {} +func (*BytesValue) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } +func (*BytesValue) XXX_WellKnownType() string { return "BytesValue" } + +func (m *BytesValue) GetValue() []byte { + if m != nil { + return m.Value + } + return nil +} + +func init() { + proto.RegisterType((*DoubleValue)(nil), "google.protobuf.DoubleValue") + proto.RegisterType((*FloatValue)(nil), "google.protobuf.FloatValue") + proto.RegisterType((*Int64Value)(nil), "google.protobuf.Int64Value") + proto.RegisterType((*UInt64Value)(nil), "google.protobuf.UInt64Value") + proto.RegisterType((*Int32Value)(nil), "google.protobuf.Int32Value") + proto.RegisterType((*UInt32Value)(nil), "google.protobuf.UInt32Value") + proto.RegisterType((*BoolValue)(nil), "google.protobuf.BoolValue") + proto.RegisterType((*StringValue)(nil), "google.protobuf.StringValue") + proto.RegisterType((*BytesValue)(nil), "google.protobuf.BytesValue") +} + +func init() { proto.RegisterFile("google/protobuf/wrappers.proto", fileDescriptor0) } + +var fileDescriptor0 = []byte{ + // 259 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4b, 0xcf, 0xcf, 0x4f, + 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x2f, 0x2f, 0x4a, 0x2c, + 0x28, 0x48, 0x2d, 0x2a, 0xd6, 0x03, 0x8b, 0x08, 0xf1, 0x43, 0xe4, 0xf5, 0x60, 0xf2, 0x4a, 0xca, + 0x5c, 0xdc, 0x2e, 0xf9, 0xa5, 0x49, 0x39, 0xa9, 0x61, 0x89, 0x39, 0xa5, 0xa9, 0x42, 0x22, 0x5c, + 0xac, 0x65, 0x20, 0x86, 0x04, 0xa3, 0x02, 0xa3, 0x06, 0x63, 0x10, 0x84, 0xa3, 0xa4, 0xc4, 0xc5, + 0xe5, 0x96, 0x93, 0x9f, 0x58, 0x82, 0x45, 0x0d, 0x13, 0x92, 0x1a, 0xcf, 0xbc, 0x12, 0x33, 0x13, + 0x2c, 0x6a, 0x98, 0x61, 0x6a, 0x94, 0xb9, 0xb8, 0x43, 0x71, 0x29, 0x62, 0x41, 0x35, 0xc8, 0xd8, + 0x08, 0x8b, 0x1a, 0x56, 0x34, 0x83, 0xb0, 0x2a, 0xe2, 0x85, 0x29, 0x52, 0xe4, 0xe2, 0x74, 0xca, + 0xcf, 0xcf, 0xc1, 0xa2, 0x84, 0x03, 0xc9, 0x9c, 0xe0, 0x92, 0xa2, 0xcc, 0xbc, 0x74, 0x2c, 0x8a, + 0x38, 0x91, 0x1c, 0xe4, 0x54, 0x59, 0x92, 0x5a, 0x8c, 0x45, 0x0d, 0x0f, 0x54, 0x8d, 0x53, 0x0d, + 0x97, 0x70, 0x72, 0x7e, 0xae, 0x1e, 0x5a, 0xe8, 0x3a, 0xf1, 0x86, 0x43, 0x83, 0x3f, 0x00, 0x24, + 0x12, 0xc0, 0x18, 0xa5, 0x95, 0x9e, 0x59, 0x92, 0x51, 0x9a, 0xa4, 0x97, 0x9c, 0x9f, 0xab, 0x9f, + 0x9e, 0x9f, 0x93, 0x98, 0x97, 0x8e, 0x88, 0xaa, 0x82, 0x92, 0xca, 0x82, 0xd4, 0x62, 0x78, 0x8c, + 0xfd, 0x60, 0x64, 0x5c, 0xc4, 0xc4, 0xec, 0x1e, 0xe0, 0xb4, 0x8a, 0x49, 0xce, 0x1d, 0x62, 0x6e, + 0x00, 0x54, 0xa9, 0x5e, 0x78, 0x6a, 0x4e, 0x8e, 0x77, 0x5e, 0x7e, 0x79, 0x5e, 0x08, 0x48, 0x4b, + 0x12, 0x1b, 0xd8, 0x0c, 0x63, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0x19, 0x6c, 0xb9, 0xb8, 0xfe, + 0x01, 0x00, 0x00, +} diff --git a/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/wrappers/wrappers.proto b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/wrappers/wrappers.proto new file mode 100644 index 0000000..0194763 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/golang/protobuf/ptypes/wrappers/wrappers.proto @@ -0,0 +1,118 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// 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. + +// Wrappers for primitive (non-message) types. These types are useful +// for embedding primitives in the `google.protobuf.Any` type and for places +// where we need to distinguish between the absence of a primitive +// typed field and its default value. + +syntax = "proto3"; + +package google.protobuf; + +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option cc_enable_arenas = true; +option go_package = "github.com/golang/protobuf/ptypes/wrappers"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "WrappersProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; + +// Wrapper message for `double`. +// +// The JSON representation for `DoubleValue` is JSON number. +message DoubleValue { + // The double value. + double value = 1; +} + +// Wrapper message for `float`. +// +// The JSON representation for `FloatValue` is JSON number. +message FloatValue { + // The float value. + float value = 1; +} + +// Wrapper message for `int64`. +// +// The JSON representation for `Int64Value` is JSON string. +message Int64Value { + // The int64 value. + int64 value = 1; +} + +// Wrapper message for `uint64`. +// +// The JSON representation for `UInt64Value` is JSON string. +message UInt64Value { + // The uint64 value. + uint64 value = 1; +} + +// Wrapper message for `int32`. +// +// The JSON representation for `Int32Value` is JSON number. +message Int32Value { + // The int32 value. + int32 value = 1; +} + +// Wrapper message for `uint32`. +// +// The JSON representation for `UInt32Value` is JSON number. +message UInt32Value { + // The uint32 value. + uint32 value = 1; +} + +// Wrapper message for `bool`. +// +// The JSON representation for `BoolValue` is JSON `true` and `false`. +message BoolValue { + // The bool value. + bool value = 1; +} + +// Wrapper message for `string`. +// +// The JSON representation for `StringValue` is JSON string. +message StringValue { + // The string value. + string value = 1; +} + +// Wrapper message for `bytes`. +// +// The JSON representation for `BytesValue` is JSON string. +message BytesValue { + // The bytes value. + bytes value = 1; +} diff --git a/example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/.travis.yml b/example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/.travis.yml new file mode 100644 index 0000000..f1309c9 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/.travis.yml @@ -0,0 +1,2 @@ +language: go + diff --git a/example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/LICENSE b/example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/LICENSE new file mode 100644 index 0000000..8dada3e --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/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 {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/example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/NOTICE b/example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/NOTICE new file mode 100644 index 0000000..5d8cb5b --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/NOTICE @@ -0,0 +1 @@ +Copyright 2012 Matt T. Proud (matt.proud@gmail.com) diff --git a/example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/README.md b/example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/README.md new file mode 100644 index 0000000..751ee69 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/README.md @@ -0,0 +1,20 @@ +# Overview +This repository provides various Protocol Buffer extensions for the Go +language (golang), namely support for record length-delimited message +streaming. + +| Java | Go | +| ------------------------------ | --------------------- | +| MessageLite#parseDelimitedFrom | pbutil.ReadDelimited | +| MessageLite#writeDelimitedTo | pbutil.WriteDelimited | + +Because [Code Review 9102043](https://codereview.appspot.com/9102043/) is +destined to never be merged into mainline (i.e., never be promoted to formal +[goprotobuf features](https://github.com/golang/protobuf)), this repository +will live here in the wild. + +# Documentation +We have [generated Go Doc documentation](http://godoc.org/github.com/matttproud/golang_protobuf_extensions/pbutil) here. + +# Testing +[![Build Status](https://travis-ci.org/matttproud/golang_protobuf_extensions.png?branch=master)](https://travis-ci.org/matttproud/golang_protobuf_extensions) diff --git a/example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/ext/moved.go b/example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/ext/moved.go new file mode 100644 index 0000000..f31a0f0 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/ext/moved.go @@ -0,0 +1,2 @@ +// Package ext moved to a new location: github.com/matttproud/golang_protobuf_extensions/pbutil. +package ext diff --git a/example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/pbtest/deleted.go b/example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/pbtest/deleted.go new file mode 100644 index 0000000..73efcb1 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/pbtest/deleted.go @@ -0,0 +1,2 @@ +// Package pbtest is deleted for the time being, because upstream Protocol Buffer 3 may have rendered quick.Value-based blackbox generation impossible. +package pbtest diff --git a/example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/all_test.go b/example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/all_test.go new file mode 100644 index 0000000..5c46372 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/all_test.go @@ -0,0 +1,177 @@ +// Copyright 2013 Matt T. Proud +// +// 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 pbutil + +import ( + "bytes" + "testing" + + . "github.com/golang/protobuf/proto" + . "github.com/golang/protobuf/proto/testdata" +) + +func TestWriteDelimited(t *testing.T) { + t.Parallel() + for _, test := range []struct { + msg Message + buf []byte + n int + err error + }{ + { + msg: &Empty{}, + n: 1, + buf: []byte{0}, + }, + { + msg: &GoEnum{Foo: FOO_FOO1.Enum()}, + n: 3, + buf: []byte{2, 8, 1}, + }, + { + msg: &Strings{ + StringField: String(`This is my gigantic, unhappy string. It exceeds +the encoding size of a single byte varint. We are using it to fuzz test the +correctness of the header decoding mechanisms, which may prove problematic. +I expect it may. Let's hope you enjoy testing as much as we do.`), + }, + n: 271, + buf: []byte{141, 2, 10, 138, 2, 84, 104, 105, 115, 32, 105, 115, 32, 109, + 121, 32, 103, 105, 103, 97, 110, 116, 105, 99, 44, 32, 117, 110, 104, + 97, 112, 112, 121, 32, 115, 116, 114, 105, 110, 103, 46, 32, 32, 73, + 116, 32, 101, 120, 99, 101, 101, 100, 115, 10, 116, 104, 101, 32, 101, + 110, 99, 111, 100, 105, 110, 103, 32, 115, 105, 122, 101, 32, 111, 102, + 32, 97, 32, 115, 105, 110, 103, 108, 101, 32, 98, 121, 116, 101, 32, + 118, 97, 114, 105, 110, 116, 46, 32, 32, 87, 101, 32, 97, 114, 101, 32, + 117, 115, 105, 110, 103, 32, 105, 116, 32, 116, 111, 32, 102, 117, 122, + 122, 32, 116, 101, 115, 116, 32, 116, 104, 101, 10, 99, 111, 114, 114, + 101, 99, 116, 110, 101, 115, 115, 32, 111, 102, 32, 116, 104, 101, 32, + 104, 101, 97, 100, 101, 114, 32, 100, 101, 99, 111, 100, 105, 110, 103, + 32, 109, 101, 99, 104, 97, 110, 105, 115, 109, 115, 44, 32, 119, 104, + 105, 99, 104, 32, 109, 97, 121, 32, 112, 114, 111, 118, 101, 32, 112, + 114, 111, 98, 108, 101, 109, 97, 116, 105, 99, 46, 10, 73, 32, 101, 120, + 112, 101, 99, 116, 32, 105, 116, 32, 109, 97, 121, 46, 32, 32, 76, 101, + 116, 39, 115, 32, 104, 111, 112, 101, 32, 121, 111, 117, 32, 101, 110, + 106, 111, 121, 32, 116, 101, 115, 116, 105, 110, 103, 32, 97, 115, 32, + 109, 117, 99, 104, 32, 97, 115, 32, 119, 101, 32, 100, 111, 46}, + }, + } { + var buf bytes.Buffer + if n, err := WriteDelimited(&buf, test.msg); n != test.n || err != test.err { + t.Fatalf("WriteDelimited(buf, %#v) = %v, %v; want %v, %v", test.msg, n, err, test.n, test.err) + } + if out := buf.Bytes(); !bytes.Equal(out, test.buf) { + t.Fatalf("WriteDelimited(buf, %#v); buf = %v; want %v", test.msg, out, test.buf) + } + } +} + +func TestReadDelimited(t *testing.T) { + t.Parallel() + for _, test := range []struct { + buf []byte + msg Message + n int + err error + }{ + { + buf: []byte{0}, + msg: &Empty{}, + n: 1, + }, + { + n: 3, + buf: []byte{2, 8, 1}, + msg: &GoEnum{Foo: FOO_FOO1.Enum()}, + }, + { + buf: []byte{141, 2, 10, 138, 2, 84, 104, 105, 115, 32, 105, 115, 32, 109, + 121, 32, 103, 105, 103, 97, 110, 116, 105, 99, 44, 32, 117, 110, 104, + 97, 112, 112, 121, 32, 115, 116, 114, 105, 110, 103, 46, 32, 32, 73, + 116, 32, 101, 120, 99, 101, 101, 100, 115, 10, 116, 104, 101, 32, 101, + 110, 99, 111, 100, 105, 110, 103, 32, 115, 105, 122, 101, 32, 111, 102, + 32, 97, 32, 115, 105, 110, 103, 108, 101, 32, 98, 121, 116, 101, 32, + 118, 97, 114, 105, 110, 116, 46, 32, 32, 87, 101, 32, 97, 114, 101, 32, + 117, 115, 105, 110, 103, 32, 105, 116, 32, 116, 111, 32, 102, 117, 122, + 122, 32, 116, 101, 115, 116, 32, 116, 104, 101, 10, 99, 111, 114, 114, + 101, 99, 116, 110, 101, 115, 115, 32, 111, 102, 32, 116, 104, 101, 32, + 104, 101, 97, 100, 101, 114, 32, 100, 101, 99, 111, 100, 105, 110, 103, + 32, 109, 101, 99, 104, 97, 110, 105, 115, 109, 115, 44, 32, 119, 104, + 105, 99, 104, 32, 109, 97, 121, 32, 112, 114, 111, 118, 101, 32, 112, + 114, 111, 98, 108, 101, 109, 97, 116, 105, 99, 46, 10, 73, 32, 101, 120, + 112, 101, 99, 116, 32, 105, 116, 32, 109, 97, 121, 46, 32, 32, 76, 101, + 116, 39, 115, 32, 104, 111, 112, 101, 32, 121, 111, 117, 32, 101, 110, + 106, 111, 121, 32, 116, 101, 115, 116, 105, 110, 103, 32, 97, 115, 32, + 109, 117, 99, 104, 32, 97, 115, 32, 119, 101, 32, 100, 111, 46}, + msg: &Strings{ + StringField: String(`This is my gigantic, unhappy string. It exceeds +the encoding size of a single byte varint. We are using it to fuzz test the +correctness of the header decoding mechanisms, which may prove problematic. +I expect it may. Let's hope you enjoy testing as much as we do.`), + }, + n: 271, + }, + } { + msg := Clone(test.msg) + msg.Reset() + if n, err := ReadDelimited(bytes.NewBuffer(test.buf), msg); n != test.n || err != test.err { + t.Fatalf("ReadDelimited(%v, msg) = %v, %v; want %v, %v", test.buf, n, err, test.n, test.err) + } + if !Equal(msg, test.msg) { + t.Fatalf("ReadDelimited(%v, msg); msg = %v; want %v", test.buf, msg, test.msg) + } + } +} + +func TestEndToEndValid(t *testing.T) { + t.Parallel() + for _, test := range [][]Message{ + {&Empty{}}, + {&GoEnum{Foo: FOO_FOO1.Enum()}, &Empty{}, &GoEnum{Foo: FOO_FOO1.Enum()}}, + {&GoEnum{Foo: FOO_FOO1.Enum()}}, + {&Strings{ + StringField: String(`This is my gigantic, unhappy string. It exceeds +the encoding size of a single byte varint. We are using it to fuzz test the +correctness of the header decoding mechanisms, which may prove problematic. +I expect it may. Let's hope you enjoy testing as much as we do.`), + }}, + } { + var buf bytes.Buffer + var written int + for i, msg := range test { + n, err := WriteDelimited(&buf, msg) + if err != nil { + // Assumption: TestReadDelimited and TestWriteDelimited are sufficient + // and inputs for this test are explicitly exercised there. + t.Fatalf("WriteDelimited(buf, %v[%d]) = ?, %v; wanted ?, nil", test, i, err) + } + written += n + } + var read int + for i, msg := range test { + out := Clone(msg) + out.Reset() + n, _ := ReadDelimited(&buf, out) + // Decide to do EOF checking? + read += n + if !Equal(out, msg) { + t.Fatalf("out = %v; want %v[%d] = %#v", out, test, i, msg) + } + } + if read != written { + t.Fatalf("%v read = %d; want %d", test, read, written) + } + } +} diff --git a/example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode.go b/example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode.go new file mode 100644 index 0000000..258c063 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode.go @@ -0,0 +1,75 @@ +// Copyright 2013 Matt T. Proud +// +// 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 pbutil + +import ( + "encoding/binary" + "errors" + "io" + + "github.com/golang/protobuf/proto" +) + +var errInvalidVarint = errors.New("invalid varint32 encountered") + +// ReadDelimited decodes a message from the provided length-delimited stream, +// where the length is encoded as 32-bit varint prefix to the message body. +// It returns the total number of bytes read and any applicable error. This is +// roughly equivalent to the companion Java API's +// MessageLite#parseDelimitedFrom. As per the reader contract, this function +// calls r.Read repeatedly as required until exactly one message including its +// prefix is read and decoded (or an error has occurred). The function never +// reads more bytes from the stream than required. The function never returns +// an error if a message has been read and decoded correctly, even if the end +// of the stream has been reached in doing so. In that case, any subsequent +// calls return (0, io.EOF). +func ReadDelimited(r io.Reader, m proto.Message) (n int, err error) { + // Per AbstractParser#parsePartialDelimitedFrom with + // CodedInputStream#readRawVarint32. + var headerBuf [binary.MaxVarintLen32]byte + var bytesRead, varIntBytes int + var messageLength uint64 + for varIntBytes == 0 { // i.e. no varint has been decoded yet. + if bytesRead >= len(headerBuf) { + return bytesRead, errInvalidVarint + } + // We have to read byte by byte here to avoid reading more bytes + // than required. Each read byte is appended to what we have + // read before. + newBytesRead, err := r.Read(headerBuf[bytesRead : bytesRead+1]) + if newBytesRead == 0 { + if err != nil { + return bytesRead, err + } + // A Reader should not return (0, nil), but if it does, + // it should be treated as no-op (according to the + // Reader contract). So let's go on... + continue + } + bytesRead += newBytesRead + // Now present everything read so far to the varint decoder and + // see if a varint can be decoded already. + messageLength, varIntBytes = proto.DecodeVarint(headerBuf[:bytesRead]) + } + + messageBuf := make([]byte, messageLength) + newBytesRead, err := io.ReadFull(r, messageBuf) + bytesRead += newBytesRead + if err != nil { + return bytesRead, err + } + + return bytesRead, proto.Unmarshal(messageBuf, m) +} diff --git a/example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode_test.go b/example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode_test.go new file mode 100644 index 0000000..364a7b7 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode_test.go @@ -0,0 +1,99 @@ +// Copyright 2016 Matt T. Proud +// +// 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 pbutil + +import ( + "bytes" + "io" + "testing" + "testing/iotest" +) + +func TestReadDelimitedIllegalVarint(t *testing.T) { + t.Parallel() + var tests = []struct { + in []byte + n int + err error + }{ + { + in: []byte{255, 255, 255, 255, 255}, + n: 5, + err: errInvalidVarint, + }, + { + in: []byte{255, 255, 255, 255, 255, 255}, + n: 5, + err: errInvalidVarint, + }, + } + for _, test := range tests { + n, err := ReadDelimited(bytes.NewReader(test.in), nil) + if got, want := n, test.n; got != want { + t.Errorf("ReadDelimited(%#v, nil) = %#v, ?; want = %v#, ?", test.in, got, want) + } + if got, want := err, test.err; got != want { + t.Errorf("ReadDelimited(%#v, nil) = ?, %#v; want = ?, %#v", test.in, got, want) + } + } +} + +func TestReadDelimitedPrematureHeader(t *testing.T) { + t.Parallel() + var data = []byte{128, 5} // 256 + 256 + 128 + n, err := ReadDelimited(bytes.NewReader(data[0:1]), nil) + if got, want := n, 1; got != want { + t.Errorf("ReadDelimited(%#v, nil) = %#v, ?; want = %v#, ?", data[0:1], got, want) + } + if got, want := err, io.EOF; got != want { + t.Errorf("ReadDelimited(%#v, nil) = ?, %#v; want = ?, %#v", data[0:1], got, want) + } +} + +func TestReadDelimitedPrematureBody(t *testing.T) { + t.Parallel() + var data = []byte{128, 5, 0, 0, 0} // 256 + 256 + 128 + n, err := ReadDelimited(bytes.NewReader(data[:]), nil) + if got, want := n, 5; got != want { + t.Errorf("ReadDelimited(%#v, nil) = %#v, ?; want = %v#, ?", data, got, want) + } + if got, want := err, io.ErrUnexpectedEOF; got != want { + t.Errorf("ReadDelimited(%#v, nil) = ?, %#v; want = ?, %#v", data, got, want) + } +} + +func TestReadDelimitedPrematureHeaderIncremental(t *testing.T) { + t.Parallel() + var data = []byte{128, 5} // 256 + 256 + 128 + n, err := ReadDelimited(iotest.OneByteReader(bytes.NewReader(data[0:1])), nil) + if got, want := n, 1; got != want { + t.Errorf("ReadDelimited(%#v, nil) = %#v, ?; want = %v#, ?", data[0:1], got, want) + } + if got, want := err, io.EOF; got != want { + t.Errorf("ReadDelimited(%#v, nil) = ?, %#v; want = ?, %#v", data[0:1], got, want) + } +} + +func TestReadDelimitedPrematureBodyIncremental(t *testing.T) { + t.Parallel() + var data = []byte{128, 5, 0, 0, 0} // 256 + 256 + 128 + n, err := ReadDelimited(iotest.OneByteReader(bytes.NewReader(data[:])), nil) + if got, want := n, 5; got != want { + t.Errorf("ReadDelimited(%#v, nil) = %#v, ?; want = %v#, ?", data, got, want) + } + if got, want := err, io.ErrUnexpectedEOF; got != want { + t.Errorf("ReadDelimited(%#v, nil) = ?, %#v; want = ?, %#v", data, got, want) + } +} diff --git a/example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/doc.go b/example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/doc.go new file mode 100644 index 0000000..c318385 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/doc.go @@ -0,0 +1,16 @@ +// Copyright 2013 Matt T. Proud +// +// 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 pbutil provides record length-delimited Protocol Buffer streaming. +package pbutil diff --git a/example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode.go b/example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode.go new file mode 100644 index 0000000..8fb59ad --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode.go @@ -0,0 +1,46 @@ +// Copyright 2013 Matt T. Proud +// +// 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 pbutil + +import ( + "encoding/binary" + "io" + + "github.com/golang/protobuf/proto" +) + +// WriteDelimited encodes and dumps a message to the provided writer prefixed +// with a 32-bit varint indicating the length of the encoded message, producing +// a length-delimited record stream, which can be used to chain together +// encoded messages of the same type together in a file. It returns the total +// number of bytes written and any applicable error. This is roughly +// equivalent to the companion Java API's MessageLite#writeDelimitedTo. +func WriteDelimited(w io.Writer, m proto.Message) (n int, err error) { + buffer, err := proto.Marshal(m) + if err != nil { + return 0, err + } + + var buf [binary.MaxVarintLen32]byte + encodedLength := binary.PutUvarint(buf[:], uint64(len(buffer))) + + sync, err := w.Write(buf[:encodedLength]) + if err != nil { + return sync, err + } + + n, err = w.Write(buffer) + return n + sync, err +} diff --git a/example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode_test.go b/example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode_test.go new file mode 100644 index 0000000..f92632b --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode_test.go @@ -0,0 +1,67 @@ +// Copyright 2016 Matt T. Proud +// +// 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 pbutil + +import ( + "bytes" + "errors" + "testing" + + "github.com/golang/protobuf/proto" +) + +var errMarshal = errors.New("pbutil: can't marshal") + +type cantMarshal struct{ proto.Message } + +func (cantMarshal) Marshal() ([]byte, error) { return nil, errMarshal } + +var _ proto.Message = cantMarshal{} + +func TestWriteDelimitedMarshalErr(t *testing.T) { + t.Parallel() + var data cantMarshal + var buf bytes.Buffer + n, err := WriteDelimited(&buf, data) + if got, want := n, 0; got != want { + t.Errorf("WriteDelimited(buf, %#v) = %#v, ?; want = %v#, ?", data, got, want) + } + if got, want := err, errMarshal; got != want { + t.Errorf("WriteDelimited(buf, %#v) = ?, %#v; want = ?, %#v", data, got, want) + } +} + +type canMarshal struct{ proto.Message } + +func (canMarshal) Marshal() ([]byte, error) { return []byte{0, 1, 2, 3, 4, 5}, nil } + +var errWrite = errors.New("pbutil: can't write") + +type cantWrite struct{} + +func (cantWrite) Write([]byte) (int, error) { return 0, errWrite } + +func TestWriteDelimitedWriteErr(t *testing.T) { + t.Parallel() + var data canMarshal + var buf cantWrite + n, err := WriteDelimited(buf, data) + if got, want := n, 0; got != want { + t.Errorf("WriteDelimited(buf, %#v) = %#v, ?; want = %v#, ?", data, got, want) + } + if got, want := err, errWrite; got != want { + t.Errorf("WriteDelimited(buf, %#v) = ?, %#v; want = ?, %#v", data, got, want) + } +} diff --git a/example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/fixtures_test.go b/example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/fixtures_test.go new file mode 100644 index 0000000..d6d9b25 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/fixtures_test.go @@ -0,0 +1,103 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// http://github.com/golang/protobuf/ +// +// 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. + +package pbutil + +import ( + . "github.com/golang/protobuf/proto" + . "github.com/golang/protobuf/proto/testdata" +) + +// FROM https://github.com/golang/protobuf/blob/master/proto/all_test.go. + +func initGoTestField() *GoTestField { + f := new(GoTestField) + f.Label = String("label") + f.Type = String("type") + return f +} + +// These are all structurally equivalent but the tag numbers differ. +// (It's remarkable that required, optional, and repeated all have +// 8 letters.) +func initGoTest_RequiredGroup() *GoTest_RequiredGroup { + return &GoTest_RequiredGroup{ + RequiredField: String("required"), + } +} + +func initGoTest_OptionalGroup() *GoTest_OptionalGroup { + return &GoTest_OptionalGroup{ + RequiredField: String("optional"), + } +} + +func initGoTest_RepeatedGroup() *GoTest_RepeatedGroup { + return &GoTest_RepeatedGroup{ + RequiredField: String("repeated"), + } +} + +func initGoTest(setdefaults bool) *GoTest { + pb := new(GoTest) + if setdefaults { + pb.F_BoolDefaulted = Bool(Default_GoTest_F_BoolDefaulted) + pb.F_Int32Defaulted = Int32(Default_GoTest_F_Int32Defaulted) + pb.F_Int64Defaulted = Int64(Default_GoTest_F_Int64Defaulted) + pb.F_Fixed32Defaulted = Uint32(Default_GoTest_F_Fixed32Defaulted) + pb.F_Fixed64Defaulted = Uint64(Default_GoTest_F_Fixed64Defaulted) + pb.F_Uint32Defaulted = Uint32(Default_GoTest_F_Uint32Defaulted) + pb.F_Uint64Defaulted = Uint64(Default_GoTest_F_Uint64Defaulted) + pb.F_FloatDefaulted = Float32(Default_GoTest_F_FloatDefaulted) + pb.F_DoubleDefaulted = Float64(Default_GoTest_F_DoubleDefaulted) + pb.F_StringDefaulted = String(Default_GoTest_F_StringDefaulted) + pb.F_BytesDefaulted = Default_GoTest_F_BytesDefaulted + pb.F_Sint32Defaulted = Int32(Default_GoTest_F_Sint32Defaulted) + pb.F_Sint64Defaulted = Int64(Default_GoTest_F_Sint64Defaulted) + } + + pb.Kind = GoTest_TIME.Enum() + pb.RequiredField = initGoTestField() + pb.F_BoolRequired = Bool(true) + pb.F_Int32Required = Int32(3) + pb.F_Int64Required = Int64(6) + pb.F_Fixed32Required = Uint32(32) + pb.F_Fixed64Required = Uint64(64) + pb.F_Uint32Required = Uint32(3232) + pb.F_Uint64Required = Uint64(6464) + pb.F_FloatRequired = Float32(3232) + pb.F_DoubleRequired = Float64(6464) + pb.F_StringRequired = String("string") + pb.F_BytesRequired = []byte("bytes") + pb.F_Sint32Required = Int32(-32) + pb.F_Sint64Required = Int64(-64) + pb.Requiredgroup = initGoTest_RequiredGroup() + + return pb +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/.gitignore b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/.gitignore new file mode 100644 index 0000000..f6fc2e8 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/.gitignore @@ -0,0 +1,26 @@ +# 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 + +*~ +*# +.build diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/.travis.yml b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/.travis.yml new file mode 100644 index 0000000..d83f31a --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/.travis.yml @@ -0,0 +1,9 @@ +sudo: false +language: go + +go: + - 1.5.4 + - 1.6.2 + +script: + - go test -short ./... diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/AUTHORS.md b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/AUTHORS.md new file mode 100644 index 0000000..c5275d5 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/AUTHORS.md @@ -0,0 +1,18 @@ +The Prometheus project was started by Matt T. Proud (emeritus) and +Julius Volz in 2012. + +Maintainers of this repository: + +* Björn Rabenstein + +The following individuals have contributed code to this repository +(listed in alphabetical order): + +* Bernerd Schaefer +* Björn Rabenstein +* Daniel Bornkessel +* Jeff Younker +* Julius Volz +* Matt T. Proud +* Tobias Schmidt + diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/CHANGELOG.md b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/CHANGELOG.md new file mode 100644 index 0000000..330788a --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/CHANGELOG.md @@ -0,0 +1,109 @@ +## 0.8.0 / 2016-08-17 +* [CHANGE] Registry is doing more consistency checks. This might break + existing setups that used to export inconsistent metrics. +* [CHANGE] Pushing to Pushgateway moved to package `push` and changed to allow + arbitrary grouping. +* [CHANGE] Removed `SelfCollector`. +* [CHANGE] Removed `PanicOnCollectError` and `EnableCollectChecks` methods. +* [CHANGE] Moved packages to the prometheus/common repo: `text`, `model`, + `extraction`. +* [CHANGE] Deprecated a number of functions. +* [FEATURE] Allow custom registries. Added `Registerer` and `Gatherer` + interfaces. +* [FEATURE] Separated HTTP exposition, allowing custom HTTP handlers (package + `promhttp`) and enabling the creation of other exposition mechanisms. +* [FEATURE] `MustRegister` is variadic now, allowing registration of many + collectors in one call. +* [FEATURE] Added HTTP API v1 package. +* [ENHANCEMENT] Numerous documentation improvements. +* [ENHANCEMENT] Improved metric sorting. +* [ENHANCEMENT] Inlined fnv64a hashing for improved performance. +* [ENHANCEMENT] Several test improvements. +* [BUGFIX] Handle collisions in MetricVec. + +## 0.7.0 / 2015-07-27 +* [CHANGE] Rename ExporterLabelPrefix to ExportedLabelPrefix. +* [BUGFIX] Closed gaps in metric consistency check. +* [BUGFIX] Validate LabelName/LabelSet on JSON unmarshaling. +* [ENHANCEMENT] Document the possibility to create "empty" metrics in + a metric vector. +* [ENHANCEMENT] Fix and clarify various doc comments and the README.md. +* [ENHANCEMENT] (Kind of) solve "The Proxy Problem" of http.InstrumentHandler. +* [ENHANCEMENT] Change responseWriterDelegator.written to int64. + +## 0.6.0 / 2015-06-01 +* [CHANGE] Rename process_goroutines to go_goroutines. +* [ENHANCEMENT] Validate label names during YAML decoding. +* [ENHANCEMENT] Add LabelName regular expression. +* [BUGFIX] Ensure alignment of struct members for 32-bit systems. + +## 0.5.0 / 2015-05-06 +* [BUGFIX] Removed a weakness in the fingerprinting aka signature code. + This makes fingerprinting slower and more allocation-heavy, but the + weakness was too severe to be tolerated. +* [CHANGE] As a result of the above, Metric.Fingerprint is now returning + a different fingerprint. To keep the same fingerprint, the new method + Metric.FastFingerprint was introduced, which will be used by the + Prometheus server for storage purposes (implying that a collision + detection has to be added, too). +* [ENHANCEMENT] The Metric.Equal and Metric.Before do not depend on + fingerprinting anymore, removing the possibility of an undetected + fingerprint collision. +* [FEATURE] The Go collector in the exposition library includes garbage + collection stats. +* [FEATURE] The exposition library allows to create constant "throw-away" + summaries and histograms. +* [CHANGE] A number of new reserved labels and prefixes. + +## 0.4.0 / 2015-04-08 +* [CHANGE] Return NaN when Summaries have no observations yet. +* [BUGFIX] Properly handle Summary decay upon Write(). +* [BUGFIX] Fix the documentation link to the consumption library. +* [FEATURE] Allow the metric family injection hook to merge with existing + metric families. +* [ENHANCEMENT] Removed cgo dependency and conditional compilation of procfs. +* [MAINTENANCE] Adjusted to changes in matttproud/golang_protobuf_extensions. + +## 0.3.2 / 2015-03-11 +* [BUGFIX] Fixed the receiver type of COWMetric.Set(). This method is + only used by the Prometheus server internally. +* [CLEANUP] Added licenses of vendored code left out by godep. + +## 0.3.1 / 2015-03-04 +* [ENHANCEMENT] Switched fingerprinting functions from own free list to + sync.Pool. +* [CHANGE] Makefile uses Go 1.4.2 now (only relevant for examples and tests). + +## 0.3.0 / 2015-03-03 +* [CHANGE] Changed the fingerprinting for metrics. THIS WILL INVALIDATE ALL + PERSISTED FINGERPRINTS. IF YOU COMPILE THE PROMETHEUS SERVER WITH THIS + VERSION, YOU HAVE TO WIPE THE PREVIOUSLY CREATED STORAGE. +* [CHANGE] LabelValuesToSignature removed. (Nobody had used it, and it was + arguably broken.) +* [CHANGE] Vendored dependencies. Those are only used by the Makefile. If + client_golang is used as a library, the vendoring will stay out of your way. +* [BUGFIX] Remove a weakness in the fingerprinting for metrics. (This made + the fingerprinting change above necessary.) +* [FEATURE] Added new fingerprinting functions SignatureForLabels and + SignatureWithoutLabels to be used by the Prometheus server. These functions + require fewer allocations than the ones currently used by the server. + +## 0.2.0 / 2015-02-23 +* [FEATURE] Introduce new Histagram metric type. +* [CHANGE] Ignore process collector errors for now (better error handling + pending). +* [CHANGE] Use clear error interface for process pidFn. +* [BUGFIX] Fix Go download links for several archs and OSes. +* [ENHANCEMENT] Massively improve Gauge and Counter performance. +* [ENHANCEMENT] Catch illegal label names for summaries in histograms. +* [ENHANCEMENT] Reduce allocations during fingerprinting. +* [ENHANCEMENT] Remove cgo dependency. procfs package will only be included if + both cgo is available and the build is for an OS with procfs. +* [CLEANUP] Clean up code style issues. +* [CLEANUP] Mark slow test as such and exclude them from travis. +* [CLEANUP] Update protobuf library package name. +* [CLEANUP] Updated vendoring of beorn7/perks. + +## 0.1.0 / 2015-02-02 +* [CLEANUP] Introduced semantic versioning and changelog. From now on, + changes will be reported in this file. diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/CONTRIBUTING.md b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/CONTRIBUTING.md new file mode 100644 index 0000000..5705f0f --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/CONTRIBUTING.md @@ -0,0 +1,18 @@ +# Contributing + +Prometheus uses GitHub to manage reviews of pull requests. + +* If you have a trivial fix or improvement, go ahead and create a pull + request, addressing (with `@...`) one or more of the maintainers + (see [AUTHORS.md](AUTHORS.md)) in the description of the pull request. + +* If you plan to do something more involved, first discuss your ideas + on our [mailing list](https://groups.google.com/forum/?fromgroups#!forum/prometheus-developers). + This will avoid unnecessary work and surely give you and us a good deal + of inspiration. + +* Relevant coding style guidelines are the [Go Code Review + Comments](https://code.google.com/p/go-wiki/wiki/CodeReviewComments) + and the _Formatting and style_ section of Peter Bourgon's [Go: Best + Practices for Production + Environments](http://peter.bourgon.org/go-in-production/#formatting-and-style). diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/LICENSE b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/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 [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/example/prometheus-mock/vendor/github.com/prometheus/client_golang/NOTICE b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/NOTICE new file mode 100644 index 0000000..dd878a3 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/NOTICE @@ -0,0 +1,23 @@ +Prometheus instrumentation library for Go applications +Copyright 2012-2015 The Prometheus Authors + +This product includes software developed at +SoundCloud Ltd. (http://soundcloud.com/). + + +The following components are included in this product: + +perks - a fork of https://github.com/bmizerany/perks +https://github.com/beorn7/perks +Copyright 2013-2015 Blake Mizerany, Björn Rabenstein +See https://github.com/beorn7/perks/blob/master/README.md for license details. + +Go support for Protocol Buffers - Google's data interchange format +http://github.com/golang/protobuf/ +Copyright 2010 The Go Authors +See source code for license details. + +Support for streaming Protocol Buffer messages for the Go language (golang). +https://github.com/matttproud/golang_protobuf_extensions +Copyright 2013 Matt T. Proud +Licensed under the Apache License, Version 2.0 diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/README.md b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/README.md new file mode 100644 index 0000000..557eacf --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/README.md @@ -0,0 +1,45 @@ +# Prometheus Go client library + +[![Build Status](https://travis-ci.org/prometheus/client_golang.svg?branch=master)](https://travis-ci.org/prometheus/client_golang) + +This is the [Go](http://golang.org) client library for +[Prometheus](http://prometheus.io). It has two separate parts, one for +instrumenting application code, and one for creating clients that talk to the +Prometheus HTTP API. + +## Instrumenting applications + +[![code-coverage](http://gocover.io/_badge/github.com/prometheus/client_golang/prometheus)](http://gocover.io/github.com/prometheus/client_golang/prometheus) [![go-doc](https://godoc.org/github.com/prometheus/client_golang/prometheus?status.svg)](https://godoc.org/github.com/prometheus/client_golang/prometheus) + +The +[`prometheus` directory](https://github.com/prometheus/client_golang/tree/master/prometheus) +contains the instrumentation library. See the +[best practices section](http://prometheus.io/docs/practices/naming/) of the +Prometheus documentation to learn more about instrumenting applications. + +The +[`examples` directory](https://github.com/prometheus/client_golang/tree/master/examples) +contains simple examples of instrumented code. + +## Client for the Prometheus HTTP API + +[![code-coverage](http://gocover.io/_badge/github.com/prometheus/client_golang/api/prometheus)](http://gocover.io/github.com/prometheus/client_golang/api/prometheus) [![go-doc](https://godoc.org/github.com/prometheus/client_golang/api/prometheus?status.svg)](https://godoc.org/github.com/prometheus/client_golang/api/prometheus) + +The +[`api/prometheus` directory](https://github.com/prometheus/client_golang/tree/master/api/prometheus) +contains the client for the +[Prometheus HTTP API](http://prometheus.io/docs/querying/api/). It allows you +to write Go applications that query time series data from a Prometheus server. + +## Where is `model`, `extraction`, and `text`? + +The `model` packages has been moved to +[`prometheus/common/model`](https://github.com/prometheus/common/tree/master/model). + +The `extraction` and `text` packages are now contained in +[`prometheus/common/expfmt`](https://github.com/prometheus/common/tree/master/expfmt). + +## Contributing and community + +See the [contributing guidelines](CONTRIBUTING.md) and the +[Community section](http://prometheus.io/community/) of the homepage. diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/VERSION b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/VERSION new file mode 100644 index 0000000..a3df0a6 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/VERSION @@ -0,0 +1 @@ +0.8.0 diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/api/prometheus/api.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/api/prometheus/api.go new file mode 100644 index 0000000..3028d74 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/api/prometheus/api.go @@ -0,0 +1,345 @@ +// Copyright 2015 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 prometheus provides bindings to the Prometheus HTTP API: +// http://prometheus.io/docs/querying/api/ +package prometheus + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "net" + "net/http" + "net/url" + "path" + "strconv" + "strings" + "time" + + "github.com/prometheus/common/model" + "golang.org/x/net/context" + "golang.org/x/net/context/ctxhttp" +) + +const ( + statusAPIError = 422 + apiPrefix = "/api/v1" + + epQuery = "/query" + epQueryRange = "/query_range" + epLabelValues = "/label/:name/values" + epSeries = "/series" +) + +type ErrorType string + +const ( + // The different API error types. + ErrBadData ErrorType = "bad_data" + ErrTimeout = "timeout" + ErrCanceled = "canceled" + ErrExec = "execution" + ErrBadResponse = "bad_response" +) + +// Error is an error returned by the API. +type Error struct { + Type ErrorType + Msg string +} + +func (e *Error) Error() string { + return fmt.Sprintf("%s: %s", e.Type, e.Msg) +} + +// CancelableTransport is like net.Transport but provides +// per-request cancelation functionality. +type CancelableTransport interface { + http.RoundTripper + CancelRequest(req *http.Request) +} + +var DefaultTransport CancelableTransport = &http.Transport{ + Proxy: http.ProxyFromEnvironment, + Dial: (&net.Dialer{ + Timeout: 30 * time.Second, + KeepAlive: 30 * time.Second, + }).Dial, + TLSHandshakeTimeout: 10 * time.Second, +} + +// Config defines configuration parameters for a new client. +type Config struct { + // The address of the Prometheus to connect to. + Address string + + // Transport is used by the Client to drive HTTP requests. If not + // provided, DefaultTransport will be used. + Transport CancelableTransport +} + +func (cfg *Config) transport() CancelableTransport { + if cfg.Transport == nil { + return DefaultTransport + } + return cfg.Transport +} + +type Client interface { + url(ep string, args map[string]string) *url.URL + do(context.Context, *http.Request) (*http.Response, []byte, error) +} + +// New returns a new Client. +// +// It is safe to use the returned Client from multiple goroutines. +func New(cfg Config) (Client, error) { + u, err := url.Parse(cfg.Address) + if err != nil { + return nil, err + } + u.Path = strings.TrimRight(u.Path, "/") + apiPrefix + + return &httpClient{ + endpoint: u, + transport: cfg.transport(), + }, nil +} + +type httpClient struct { + endpoint *url.URL + transport CancelableTransport +} + +func (c *httpClient) url(ep string, args map[string]string) *url.URL { + p := path.Join(c.endpoint.Path, ep) + + for arg, val := range args { + arg = ":" + arg + p = strings.Replace(p, arg, val, -1) + } + + u := *c.endpoint + u.Path = p + + return &u +} + +func (c *httpClient) do(ctx context.Context, req *http.Request) (*http.Response, []byte, error) { + resp, err := ctxhttp.Do(ctx, &http.Client{Transport: c.transport}, req) + + defer func() { + if resp != nil { + resp.Body.Close() + } + }() + + if err != nil { + return nil, nil, err + } + + var body []byte + done := make(chan struct{}) + go func() { + body, err = ioutil.ReadAll(resp.Body) + close(done) + }() + + select { + case <-ctx.Done(): + err = resp.Body.Close() + <-done + if err == nil { + err = ctx.Err() + } + case <-done: + } + + return resp, body, err +} + +// apiClient wraps a regular client and processes successful API responses. +// Successful also includes responses that errored at the API level. +type apiClient struct { + Client +} + +type apiResponse struct { + Status string `json:"status"` + Data json.RawMessage `json:"data"` + ErrorType ErrorType `json:"errorType"` + Error string `json:"error"` +} + +func (c apiClient) do(ctx context.Context, req *http.Request) (*http.Response, []byte, error) { + resp, body, err := c.Client.do(ctx, req) + if err != nil { + return resp, body, err + } + + code := resp.StatusCode + + if code/100 != 2 && code != statusAPIError { + return resp, body, &Error{ + Type: ErrBadResponse, + Msg: fmt.Sprintf("bad response code %d", resp.StatusCode), + } + } + + var result apiResponse + + if err = json.Unmarshal(body, &result); err != nil { + return resp, body, &Error{ + Type: ErrBadResponse, + Msg: err.Error(), + } + } + + if (code == statusAPIError) != (result.Status == "error") { + err = &Error{ + Type: ErrBadResponse, + Msg: "inconsistent body for response code", + } + } + + if code == statusAPIError && result.Status == "error" { + err = &Error{ + Type: result.ErrorType, + Msg: result.Error, + } + } + + return resp, []byte(result.Data), err +} + +// Range represents a sliced time range. +type Range struct { + // The boundaries of the time range. + Start, End time.Time + // The maximum time between two slices within the boundaries. + Step time.Duration +} + +// queryResult contains result data for a query. +type queryResult struct { + Type model.ValueType `json:"resultType"` + Result interface{} `json:"result"` + + // The decoded value. + v model.Value +} + +func (qr *queryResult) UnmarshalJSON(b []byte) error { + v := struct { + Type model.ValueType `json:"resultType"` + Result json.RawMessage `json:"result"` + }{} + + err := json.Unmarshal(b, &v) + if err != nil { + return err + } + + switch v.Type { + case model.ValScalar: + var sv model.Scalar + err = json.Unmarshal(v.Result, &sv) + qr.v = &sv + + case model.ValVector: + var vv model.Vector + err = json.Unmarshal(v.Result, &vv) + qr.v = vv + + case model.ValMatrix: + var mv model.Matrix + err = json.Unmarshal(v.Result, &mv) + qr.v = mv + + default: + err = fmt.Errorf("unexpected value type %q", v.Type) + } + return err +} + +// QueryAPI provides bindings the Prometheus's query API. +type QueryAPI interface { + // Query performs a query for the given time. + Query(ctx context.Context, query string, ts time.Time) (model.Value, error) + // Query performs a query for the given range. + QueryRange(ctx context.Context, query string, r Range) (model.Value, error) +} + +// NewQueryAPI returns a new QueryAPI for the client. +// +// It is safe to use the returned QueryAPI from multiple goroutines. +func NewQueryAPI(c Client) QueryAPI { + return &httpQueryAPI{client: apiClient{c}} +} + +type httpQueryAPI struct { + client Client +} + +func (h *httpQueryAPI) Query(ctx context.Context, query string, ts time.Time) (model.Value, error) { + u := h.client.url(epQuery, nil) + q := u.Query() + + q.Set("query", query) + q.Set("time", ts.Format(time.RFC3339Nano)) + + u.RawQuery = q.Encode() + + req, _ := http.NewRequest("GET", u.String(), nil) + + _, body, err := h.client.do(ctx, req) + if err != nil { + return nil, err + } + + var qres queryResult + err = json.Unmarshal(body, &qres) + + return model.Value(qres.v), err +} + +func (h *httpQueryAPI) QueryRange(ctx context.Context, query string, r Range) (model.Value, error) { + u := h.client.url(epQueryRange, nil) + q := u.Query() + + var ( + start = r.Start.Format(time.RFC3339Nano) + end = r.End.Format(time.RFC3339Nano) + step = strconv.FormatFloat(r.Step.Seconds(), 'f', 3, 64) + ) + + q.Set("query", query) + q.Set("start", start) + q.Set("end", end) + q.Set("step", step) + + u.RawQuery = q.Encode() + + req, _ := http.NewRequest("GET", u.String(), nil) + + _, body, err := h.client.do(ctx, req) + if err != nil { + return nil, err + } + + var qres queryResult + err = json.Unmarshal(body, &qres) + + return model.Value(qres.v), err +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/api/prometheus/api_test.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/api/prometheus/api_test.go new file mode 100644 index 0000000..87d3e40 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/api/prometheus/api_test.go @@ -0,0 +1,453 @@ +// Copyright 2015 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 prometheus + +import ( + "encoding/json" + "fmt" + "net/http" + "net/url" + "reflect" + "testing" + "time" + + "github.com/prometheus/common/model" + "golang.org/x/net/context" +) + +func TestConfig(t *testing.T) { + c := Config{} + if c.transport() != DefaultTransport { + t.Fatalf("expected default transport for nil Transport field") + } +} + +func TestClientURL(t *testing.T) { + tests := []struct { + address string + endpoint string + args map[string]string + expected string + }{ + { + address: "http://localhost:9090", + endpoint: "/test", + expected: "http://localhost:9090/test", + }, + { + address: "http://localhost", + endpoint: "/test", + expected: "http://localhost/test", + }, + { + address: "http://localhost:9090", + endpoint: "test", + expected: "http://localhost:9090/test", + }, + { + address: "http://localhost:9090/prefix", + endpoint: "/test", + expected: "http://localhost:9090/prefix/test", + }, + { + address: "https://localhost:9090/", + endpoint: "/test/", + expected: "https://localhost:9090/test", + }, + { + address: "http://localhost:9090", + endpoint: "/test/:param", + args: map[string]string{ + "param": "content", + }, + expected: "http://localhost:9090/test/content", + }, + { + address: "http://localhost:9090", + endpoint: "/test/:param/more/:param", + args: map[string]string{ + "param": "content", + }, + expected: "http://localhost:9090/test/content/more/content", + }, + { + address: "http://localhost:9090", + endpoint: "/test/:param/more/:foo", + args: map[string]string{ + "param": "content", + "foo": "bar", + }, + expected: "http://localhost:9090/test/content/more/bar", + }, + { + address: "http://localhost:9090", + endpoint: "/test/:param", + args: map[string]string{ + "nonexistant": "content", + }, + expected: "http://localhost:9090/test/:param", + }, + } + + for _, test := range tests { + ep, err := url.Parse(test.address) + if err != nil { + t.Fatal(err) + } + + hclient := &httpClient{ + endpoint: ep, + transport: DefaultTransport, + } + + u := hclient.url(test.endpoint, test.args) + if u.String() != test.expected { + t.Errorf("unexpected result: got %s, want %s", u, test.expected) + continue + } + + // The apiClient must return exactly the same result as the httpClient. + aclient := &apiClient{hclient} + + u = aclient.url(test.endpoint, test.args) + if u.String() != test.expected { + t.Errorf("unexpected result: got %s, want %s", u, test.expected) + } + } +} + +type testClient struct { + *testing.T + + ch chan apiClientTest + req *http.Request +} + +type apiClientTest struct { + code int + response interface{} + expected string + err *Error +} + +func (c *testClient) url(ep string, args map[string]string) *url.URL { + return nil +} + +func (c *testClient) do(ctx context.Context, req *http.Request) (*http.Response, []byte, error) { + if ctx == nil { + c.Fatalf("context was not passed down") + } + if req != c.req { + c.Fatalf("request was not passed down") + } + + test := <-c.ch + + var b []byte + var err error + + switch v := test.response.(type) { + case string: + b = []byte(v) + default: + b, err = json.Marshal(v) + if err != nil { + c.Fatal(err) + } + } + + resp := &http.Response{ + StatusCode: test.code, + } + + return resp, b, nil +} + +func TestAPIClientDo(t *testing.T) { + tests := []apiClientTest{ + { + response: &apiResponse{ + Status: "error", + Data: json.RawMessage(`null`), + ErrorType: ErrBadData, + Error: "failed", + }, + err: &Error{ + Type: ErrBadData, + Msg: "failed", + }, + code: statusAPIError, + expected: `null`, + }, + { + response: &apiResponse{ + Status: "error", + Data: json.RawMessage(`"test"`), + ErrorType: ErrTimeout, + Error: "timed out", + }, + err: &Error{ + Type: ErrTimeout, + Msg: "timed out", + }, + code: statusAPIError, + expected: `test`, + }, + { + response: "bad json", + err: &Error{ + Type: ErrBadResponse, + Msg: "bad response code 400", + }, + code: http.StatusBadRequest, + }, + { + response: "bad json", + err: &Error{ + Type: ErrBadResponse, + Msg: "invalid character 'b' looking for beginning of value", + }, + code: statusAPIError, + }, + { + response: &apiResponse{ + Status: "success", + Data: json.RawMessage(`"test"`), + }, + err: &Error{ + Type: ErrBadResponse, + Msg: "inconsistent body for response code", + }, + code: statusAPIError, + }, + { + response: &apiResponse{ + Status: "success", + Data: json.RawMessage(`"test"`), + ErrorType: ErrTimeout, + Error: "timed out", + }, + err: &Error{ + Type: ErrBadResponse, + Msg: "inconsistent body for response code", + }, + code: statusAPIError, + }, + { + response: &apiResponse{ + Status: "error", + Data: json.RawMessage(`"test"`), + ErrorType: ErrTimeout, + Error: "timed out", + }, + err: &Error{ + Type: ErrBadResponse, + Msg: "inconsistent body for response code", + }, + code: http.StatusOK, + }, + } + + tc := &testClient{ + T: t, + ch: make(chan apiClientTest, 1), + req: &http.Request{}, + } + client := &apiClient{tc} + + for _, test := range tests { + + tc.ch <- test + + _, body, err := client.do(context.Background(), tc.req) + + if test.err != nil { + if err == nil { + t.Errorf("expected error %q but got none", test.err) + continue + } + if test.err.Error() != err.Error() { + t.Errorf("unexpected error: want %q, got %q", test.err, err) + } + continue + } + if err != nil { + t.Errorf("unexpeceted error %s", err) + continue + } + + want, got := test.expected, string(body) + if want != got { + t.Errorf("unexpected body: want %q, got %q", want, got) + } + } +} + +type apiTestClient struct { + *testing.T + curTest apiTest +} + +type apiTest struct { + do func() (interface{}, error) + inErr error + inRes interface{} + + reqPath string + reqParam url.Values + reqMethod string + res interface{} + err error +} + +func (c *apiTestClient) url(ep string, args map[string]string) *url.URL { + u := &url.URL{ + Host: "test:9090", + Path: apiPrefix + ep, + } + return u +} + +func (c *apiTestClient) do(ctx context.Context, req *http.Request) (*http.Response, []byte, error) { + + test := c.curTest + + if req.URL.Path != test.reqPath { + c.Errorf("unexpected request path: want %s, got %s", test.reqPath, req.URL.Path) + } + if req.Method != test.reqMethod { + c.Errorf("unexpected request method: want %s, got %s", test.reqMethod, req.Method) + } + + b, err := json.Marshal(test.inRes) + if err != nil { + c.Fatal(err) + } + + resp := &http.Response{} + if test.inErr != nil { + resp.StatusCode = statusAPIError + } else { + resp.StatusCode = http.StatusOK + } + + return resp, b, test.inErr +} + +func TestAPIs(t *testing.T) { + + testTime := time.Now() + + client := &apiTestClient{T: t} + + queryApi := &httpQueryAPI{ + client: client, + } + + doQuery := func(q string, ts time.Time) func() (interface{}, error) { + return func() (interface{}, error) { + return queryApi.Query(context.Background(), q, ts) + } + } + + doQueryRange := func(q string, rng Range) func() (interface{}, error) { + return func() (interface{}, error) { + return queryApi.QueryRange(context.Background(), q, rng) + } + } + + queryTests := []apiTest{ + { + do: doQuery("2", testTime), + inRes: &queryResult{ + Type: model.ValScalar, + Result: &model.Scalar{ + Value: 2, + Timestamp: model.TimeFromUnix(testTime.Unix()), + }, + }, + + reqMethod: "GET", + reqPath: "/api/v1/query", + reqParam: url.Values{ + "query": []string{"2"}, + "time": []string{testTime.Format(time.RFC3339Nano)}, + }, + res: &model.Scalar{ + Value: 2, + Timestamp: model.TimeFromUnix(testTime.Unix()), + }, + }, + { + do: doQuery("2", testTime), + inErr: fmt.Errorf("some error"), + + reqMethod: "GET", + reqPath: "/api/v1/query", + reqParam: url.Values{ + "query": []string{"2"}, + "time": []string{testTime.Format(time.RFC3339Nano)}, + }, + err: fmt.Errorf("some error"), + }, + + { + do: doQueryRange("2", Range{ + Start: testTime.Add(-time.Minute), + End: testTime, + Step: time.Minute, + }), + inErr: fmt.Errorf("some error"), + + reqMethod: "GET", + reqPath: "/api/v1/query_range", + reqParam: url.Values{ + "query": []string{"2"}, + "start": []string{testTime.Add(-time.Minute).Format(time.RFC3339Nano)}, + "end": []string{testTime.Format(time.RFC3339Nano)}, + "step": []string{time.Minute.String()}, + }, + err: fmt.Errorf("some error"), + }, + } + + var tests []apiTest + tests = append(tests, queryTests...) + + for _, test := range tests { + client.curTest = test + + res, err := test.do() + + if test.err != nil { + if err == nil { + t.Errorf("expected error %q but got none", test.err) + continue + } + if err.Error() != test.err.Error() { + t.Errorf("unexpected error: want %s, got %s", test.err, err) + } + continue + } + if err != nil { + t.Errorf("unexpected error: %s", err) + continue + } + + if !reflect.DeepEqual(res, test.res) { + t.Errorf("unexpected result: want %v, got %v", test.res, res) + } + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/examples/random/main.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/examples/random/main.go new file mode 100644 index 0000000..5639571 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/examples/random/main.go @@ -0,0 +1,103 @@ +// Copyright 2015 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. + +// A simple example exposing fictional RPC latencies with different types of +// random distributions (uniform, normal, and exponential) as Prometheus +// metrics. +package main + +import ( + "flag" + "math" + "math/rand" + "net/http" + "time" + + "github.com/prometheus/client_golang/prometheus" +) + +var ( + addr = flag.String("listen-address", ":8080", "The address to listen on for HTTP requests.") + uniformDomain = flag.Float64("uniform.domain", 200, "The domain for the uniform distribution.") + normDomain = flag.Float64("normal.domain", 200, "The domain for the normal distribution.") + normMean = flag.Float64("normal.mean", 10, "The mean for the normal distribution.") + oscillationPeriod = flag.Duration("oscillation-period", 10*time.Minute, "The duration of the rate oscillation period.") +) + +var ( + // Create a summary to track fictional interservice RPC latencies for three + // distinct services with different latency distributions. These services are + // differentiated via a "service" label. + rpcDurations = prometheus.NewSummaryVec( + prometheus.SummaryOpts{ + Name: "rpc_durations_microseconds", + Help: "RPC latency distributions.", + }, + []string{"service"}, + ) + // The same as above, but now as a histogram, and only for the normal + // distribution. The buckets are targeted to the parameters of the + // normal distribution, with 20 buckets centered on the mean, each + // half-sigma wide. + rpcDurationsHistogram = prometheus.NewHistogram(prometheus.HistogramOpts{ + Name: "rpc_durations_histogram_microseconds", + Help: "RPC latency distributions.", + Buckets: prometheus.LinearBuckets(*normMean-5**normDomain, .5**normDomain, 20), + }) +) + +func init() { + // Register the summary and the histogram with Prometheus's default registry. + prometheus.MustRegister(rpcDurations) + prometheus.MustRegister(rpcDurationsHistogram) +} + +func main() { + flag.Parse() + + start := time.Now() + + oscillationFactor := func() float64 { + return 2 + math.Sin(math.Sin(2*math.Pi*float64(time.Since(start))/float64(*oscillationPeriod))) + } + + // Periodically record some sample latencies for the three services. + go func() { + for { + v := rand.Float64() * *uniformDomain + rpcDurations.WithLabelValues("uniform").Observe(v) + time.Sleep(time.Duration(100*oscillationFactor()) * time.Millisecond) + } + }() + + go func() { + for { + v := (rand.NormFloat64() * *normDomain) + *normMean + rpcDurations.WithLabelValues("normal").Observe(v) + rpcDurationsHistogram.Observe(v) + time.Sleep(time.Duration(75*oscillationFactor()) * time.Millisecond) + } + }() + + go func() { + for { + v := rand.ExpFloat64() + rpcDurations.WithLabelValues("exponential").Observe(v) + time.Sleep(time.Duration(50*oscillationFactor()) * time.Millisecond) + } + }() + + // Expose the registered metrics via HTTP. + http.Handle("/metrics", prometheus.Handler()) + http.ListenAndServe(*addr, nil) +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/examples/simple/main.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/examples/simple/main.go new file mode 100644 index 0000000..19620d2 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/examples/simple/main.go @@ -0,0 +1,30 @@ +// Copyright 2015 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. + +// A minimal example of how to include Prometheus instrumentation. +package main + +import ( + "flag" + "net/http" + + "github.com/prometheus/client_golang/prometheus" +) + +var addr = flag.String("listen-address", ":8080", "The address to listen on for HTTP requests.") + +func main() { + flag.Parse() + http.Handle("/metrics", prometheus.Handler()) + http.ListenAndServe(*addr, nil) +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/.gitignore b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/.gitignore new file mode 100644 index 0000000..3460f03 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/.gitignore @@ -0,0 +1 @@ +command-line-arguments.test diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/README.md b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/README.md new file mode 100644 index 0000000..44986bf --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/README.md @@ -0,0 +1 @@ +See [![go-doc](https://godoc.org/github.com/prometheus/client_golang/prometheus?status.svg)](https://godoc.org/github.com/prometheus/client_golang/prometheus). diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/benchmark_test.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/benchmark_test.go new file mode 100644 index 0000000..a3d8669 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/benchmark_test.go @@ -0,0 +1,183 @@ +// Copyright 2014 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 prometheus + +import ( + "sync" + "testing" +) + +func BenchmarkCounterWithLabelValues(b *testing.B) { + m := NewCounterVec( + CounterOpts{ + Name: "benchmark_counter", + Help: "A counter to benchmark it.", + }, + []string{"one", "two", "three"}, + ) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + m.WithLabelValues("eins", "zwei", "drei").Inc() + } +} + +func BenchmarkCounterWithLabelValuesConcurrent(b *testing.B) { + m := NewCounterVec( + CounterOpts{ + Name: "benchmark_counter", + Help: "A counter to benchmark it.", + }, + []string{"one", "two", "three"}, + ) + b.ReportAllocs() + b.ResetTimer() + wg := sync.WaitGroup{} + for i := 0; i < 10; i++ { + wg.Add(1) + go func() { + for j := 0; j < b.N/10; j++ { + m.WithLabelValues("eins", "zwei", "drei").Inc() + } + wg.Done() + }() + } + wg.Wait() +} + +func BenchmarkCounterWithMappedLabels(b *testing.B) { + m := NewCounterVec( + CounterOpts{ + Name: "benchmark_counter", + Help: "A counter to benchmark it.", + }, + []string{"one", "two", "three"}, + ) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + m.With(Labels{"two": "zwei", "one": "eins", "three": "drei"}).Inc() + } +} + +func BenchmarkCounterWithPreparedMappedLabels(b *testing.B) { + m := NewCounterVec( + CounterOpts{ + Name: "benchmark_counter", + Help: "A counter to benchmark it.", + }, + []string{"one", "two", "three"}, + ) + b.ReportAllocs() + b.ResetTimer() + labels := Labels{"two": "zwei", "one": "eins", "three": "drei"} + for i := 0; i < b.N; i++ { + m.With(labels).Inc() + } +} + +func BenchmarkCounterNoLabels(b *testing.B) { + m := NewCounter(CounterOpts{ + Name: "benchmark_counter", + Help: "A counter to benchmark it.", + }) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + m.Inc() + } +} + +func BenchmarkGaugeWithLabelValues(b *testing.B) { + m := NewGaugeVec( + GaugeOpts{ + Name: "benchmark_gauge", + Help: "A gauge to benchmark it.", + }, + []string{"one", "two", "three"}, + ) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + m.WithLabelValues("eins", "zwei", "drei").Set(3.1415) + } +} + +func BenchmarkGaugeNoLabels(b *testing.B) { + m := NewGauge(GaugeOpts{ + Name: "benchmark_gauge", + Help: "A gauge to benchmark it.", + }) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + m.Set(3.1415) + } +} + +func BenchmarkSummaryWithLabelValues(b *testing.B) { + m := NewSummaryVec( + SummaryOpts{ + Name: "benchmark_summary", + Help: "A summary to benchmark it.", + }, + []string{"one", "two", "three"}, + ) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + m.WithLabelValues("eins", "zwei", "drei").Observe(3.1415) + } +} + +func BenchmarkSummaryNoLabels(b *testing.B) { + m := NewSummary(SummaryOpts{ + Name: "benchmark_summary", + Help: "A summary to benchmark it.", + }, + ) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + m.Observe(3.1415) + } +} + +func BenchmarkHistogramWithLabelValues(b *testing.B) { + m := NewHistogramVec( + HistogramOpts{ + Name: "benchmark_histogram", + Help: "A histogram to benchmark it.", + }, + []string{"one", "two", "three"}, + ) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + m.WithLabelValues("eins", "zwei", "drei").Observe(3.1415) + } +} + +func BenchmarkHistogramNoLabels(b *testing.B) { + m := NewHistogram(HistogramOpts{ + Name: "benchmark_histogram", + Help: "A histogram to benchmark it.", + }, + ) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + m.Observe(3.1415) + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/collector.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/collector.go new file mode 100644 index 0000000..623d3d8 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/collector.go @@ -0,0 +1,75 @@ +// Copyright 2014 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 prometheus + +// Collector is the interface implemented by anything that can be used by +// Prometheus to collect metrics. A Collector has to be registered for +// collection. See Registerer.Register. +// +// The stock metrics provided by this package (Gauge, Counter, Summary, +// Histogram, Untyped) are also Collectors (which only ever collect one metric, +// namely itself). An implementer of Collector may, however, collect multiple +// metrics in a coordinated fashion and/or create metrics on the fly. Examples +// for collectors already implemented in this library are the metric vectors +// (i.e. collection of multiple instances of the same Metric but with different +// label values) like GaugeVec or SummaryVec, and the ExpvarCollector. +type Collector interface { + // Describe sends the super-set of all possible descriptors of metrics + // collected by this Collector to the provided channel and returns once + // the last descriptor has been sent. The sent descriptors fulfill the + // consistency and uniqueness requirements described in the Desc + // documentation. (It is valid if one and the same Collector sends + // duplicate descriptors. Those duplicates are simply ignored. However, + // two different Collectors must not send duplicate descriptors.) This + // method idempotently sends the same descriptors throughout the + // lifetime of the Collector. If a Collector encounters an error while + // executing this method, it must send an invalid descriptor (created + // with NewInvalidDesc) to signal the error to the registry. + Describe(chan<- *Desc) + // Collect is called by the Prometheus registry when collecting + // metrics. The implementation sends each collected metric via the + // provided channel and returns once the last metric has been sent. The + // descriptor of each sent metric is one of those returned by + // Describe. Returned metrics that share the same descriptor must differ + // in their variable label values. This method may be called + // concurrently and must therefore be implemented in a concurrency safe + // way. Blocking occurs at the expense of total performance of rendering + // all registered metrics. Ideally, Collector implementations support + // concurrent readers. + Collect(chan<- Metric) +} + +// selfCollector implements Collector for a single Metric so that the Metric +// collects itself. Add it as an anonymous field to a struct that implements +// Metric, and call init with the Metric itself as an argument. +type selfCollector struct { + self Metric +} + +// init provides the selfCollector with a reference to the metric it is supposed +// to collect. It is usually called within the factory function to create a +// metric. See example. +func (c *selfCollector) init(self Metric) { + c.self = self +} + +// Describe implements Collector. +func (c *selfCollector) Describe(ch chan<- *Desc) { + ch <- c.self.Desc() +} + +// Collect implements Collector. +func (c *selfCollector) Collect(ch chan<- Metric) { + ch <- c.self +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/counter.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/counter.go new file mode 100644 index 0000000..ee37949 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/counter.go @@ -0,0 +1,172 @@ +// Copyright 2014 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 prometheus + +import ( + "errors" +) + +// Counter is a Metric that represents a single numerical value that only ever +// goes up. That implies that it cannot be used to count items whose number can +// also go down, e.g. the number of currently running goroutines. Those +// "counters" are represented by Gauges. +// +// A Counter is typically used to count requests served, tasks completed, errors +// occurred, etc. +// +// To create Counter instances, use NewCounter. +type Counter interface { + Metric + Collector + + // Set is used to set the Counter to an arbitrary value. It is only used + // if you have to transfer a value from an external counter into this + // Prometheus metric. Do not use it for regular handling of a + // Prometheus counter (as it can be used to break the contract of + // monotonically increasing values). + // + // Deprecated: Use NewConstMetric to create a counter for an external + // value. A Counter should never be set. + Set(float64) + // Inc increments the counter by 1. + Inc() + // Add adds the given value to the counter. It panics if the value is < + // 0. + Add(float64) +} + +// CounterOpts is an alias for Opts. See there for doc comments. +type CounterOpts Opts + +// NewCounter creates a new Counter based on the provided CounterOpts. +func NewCounter(opts CounterOpts) Counter { + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ) + result := &counter{value: value{desc: desc, valType: CounterValue, labelPairs: desc.constLabelPairs}} + result.init(result) // Init self-collection. + return result +} + +type counter struct { + value +} + +func (c *counter) Add(v float64) { + if v < 0 { + panic(errors.New("counter cannot decrease in value")) + } + c.value.Add(v) +} + +// CounterVec is a Collector that bundles a set of Counters that all share the +// same Desc, but have different values for their variable labels. This is used +// if you want to count the same thing partitioned by various dimensions +// (e.g. number of HTTP requests, partitioned by response code and +// method). Create instances with NewCounterVec. +// +// CounterVec embeds MetricVec. See there for a full list of methods with +// detailed documentation. +type CounterVec struct { + *MetricVec +} + +// NewCounterVec creates a new CounterVec based on the provided CounterOpts and +// partitioned by the given label names. At least one label name must be +// provided. +func NewCounterVec(opts CounterOpts, labelNames []string) *CounterVec { + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + labelNames, + opts.ConstLabels, + ) + return &CounterVec{ + MetricVec: newMetricVec(desc, func(lvs ...string) Metric { + result := &counter{value: value{ + desc: desc, + valType: CounterValue, + labelPairs: makeLabelPairs(desc, lvs), + }} + result.init(result) // Init self-collection. + return result + }), + } +} + +// GetMetricWithLabelValues replaces the method of the same name in +// MetricVec. The difference is that this method returns a Counter and not a +// Metric so that no type conversion is required. +func (m *CounterVec) GetMetricWithLabelValues(lvs ...string) (Counter, error) { + metric, err := m.MetricVec.GetMetricWithLabelValues(lvs...) + if metric != nil { + return metric.(Counter), err + } + return nil, err +} + +// GetMetricWith replaces the method of the same name in MetricVec. The +// difference is that this method returns a Counter and not a Metric so that no +// type conversion is required. +func (m *CounterVec) GetMetricWith(labels Labels) (Counter, error) { + metric, err := m.MetricVec.GetMetricWith(labels) + if metric != nil { + return metric.(Counter), err + } + return nil, err +} + +// WithLabelValues works as GetMetricWithLabelValues, but panics where +// GetMetricWithLabelValues would have returned an error. By not returning an +// error, WithLabelValues allows shortcuts like +// myVec.WithLabelValues("404", "GET").Add(42) +func (m *CounterVec) WithLabelValues(lvs ...string) Counter { + return m.MetricVec.WithLabelValues(lvs...).(Counter) +} + +// With works as GetMetricWith, but panics where GetMetricWithLabels would have +// returned an error. By not returning an error, With allows shortcuts like +// myVec.With(Labels{"code": "404", "method": "GET"}).Add(42) +func (m *CounterVec) With(labels Labels) Counter { + return m.MetricVec.With(labels).(Counter) +} + +// CounterFunc is a Counter whose value is determined at collect time by calling a +// provided function. +// +// To create CounterFunc instances, use NewCounterFunc. +type CounterFunc interface { + Metric + Collector +} + +// NewCounterFunc creates a new CounterFunc based on the provided +// CounterOpts. The value reported is determined by calling the given function +// from within the Write method. Take into account that metric collection may +// happen concurrently. If that results in concurrent calls to Write, like in +// the case where a CounterFunc is directly registered with Prometheus, the +// provided function must be concurrency-safe. The function should also honor +// the contract for a Counter (values only go up, not down), but compliance will +// not be checked. +func NewCounterFunc(opts CounterOpts, function func() float64) CounterFunc { + return newValueFunc(NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), CounterValue, function) +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/counter_test.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/counter_test.go new file mode 100644 index 0000000..67391a2 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/counter_test.go @@ -0,0 +1,58 @@ +// Copyright 2014 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 prometheus + +import ( + "math" + "testing" + + dto "github.com/prometheus/client_model/go" +) + +func TestCounterAdd(t *testing.T) { + counter := NewCounter(CounterOpts{ + Name: "test", + Help: "test help", + ConstLabels: Labels{"a": "1", "b": "2"}, + }).(*counter) + counter.Inc() + if expected, got := 1., math.Float64frombits(counter.valBits); expected != got { + t.Errorf("Expected %f, got %f.", expected, got) + } + counter.Add(42) + if expected, got := 43., math.Float64frombits(counter.valBits); expected != got { + t.Errorf("Expected %f, got %f.", expected, got) + } + + if expected, got := "counter cannot decrease in value", decreaseCounter(counter).Error(); expected != got { + t.Errorf("Expected error %q, got %q.", expected, got) + } + + m := &dto.Metric{} + counter.Write(m) + + if expected, got := `label: label: counter: `, m.String(); expected != got { + t.Errorf("expected %q, got %q", expected, got) + } +} + +func decreaseCounter(c *counter) (err error) { + defer func() { + if e := recover(); e != nil { + err = e.(error) + } + }() + c.Add(-1) + return nil +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/desc.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/desc.go new file mode 100644 index 0000000..77f4b30 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/desc.go @@ -0,0 +1,205 @@ +// Copyright 2016 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 prometheus + +import ( + "errors" + "fmt" + "regexp" + "sort" + "strings" + + "github.com/golang/protobuf/proto" + + dto "github.com/prometheus/client_model/go" +) + +var ( + metricNameRE = regexp.MustCompile(`^[a-zA-Z_][a-zA-Z0-9_:]*$`) + labelNameRE = regexp.MustCompile("^[a-zA-Z_][a-zA-Z0-9_]*$") +) + +// reservedLabelPrefix is a prefix which is not legal in user-supplied +// label names. +const reservedLabelPrefix = "__" + +// Labels represents a collection of label name -> value mappings. This type is +// commonly used with the With(Labels) and GetMetricWith(Labels) methods of +// metric vector Collectors, e.g.: +// myVec.With(Labels{"code": "404", "method": "GET"}).Add(42) +// +// The other use-case is the specification of constant label pairs in Opts or to +// create a Desc. +type Labels map[string]string + +// Desc is the descriptor used by every Prometheus Metric. It is essentially +// the immutable meta-data of a Metric. The normal Metric implementations +// included in this package manage their Desc under the hood. Users only have to +// deal with Desc if they use advanced features like the ExpvarCollector or +// custom Collectors and Metrics. +// +// Descriptors registered with the same registry have to fulfill certain +// consistency and uniqueness criteria if they share the same fully-qualified +// name: They must have the same help string and the same label names (aka label +// dimensions) in each, constLabels and variableLabels, but they must differ in +// the values of the constLabels. +// +// Descriptors that share the same fully-qualified names and the same label +// values of their constLabels are considered equal. +// +// Use NewDesc to create new Desc instances. +type Desc struct { + // fqName has been built from Namespace, Subsystem, and Name. + fqName string + // help provides some helpful information about this metric. + help string + // constLabelPairs contains precalculated DTO label pairs based on + // the constant labels. + constLabelPairs []*dto.LabelPair + // VariableLabels contains names of labels for which the metric + // maintains variable values. + variableLabels []string + // id is a hash of the values of the ConstLabels and fqName. This + // must be unique among all registered descriptors and can therefore be + // used as an identifier of the descriptor. + id uint64 + // dimHash is a hash of the label names (preset and variable) and the + // Help string. Each Desc with the same fqName must have the same + // dimHash. + dimHash uint64 + // err is an error that occured during construction. It is reported on + // registration time. + err error +} + +// NewDesc allocates and initializes a new Desc. Errors are recorded in the Desc +// and will be reported on registration time. variableLabels and constLabels can +// be nil if no such labels should be set. fqName and help must not be empty. +// +// variableLabels only contain the label names. Their label values are variable +// and therefore not part of the Desc. (They are managed within the Metric.) +// +// For constLabels, the label values are constant. Therefore, they are fully +// specified in the Desc. See the Opts documentation for the implications of +// constant labels. +func NewDesc(fqName, help string, variableLabels []string, constLabels Labels) *Desc { + d := &Desc{ + fqName: fqName, + help: help, + variableLabels: variableLabels, + } + if help == "" { + d.err = errors.New("empty help string") + return d + } + if !metricNameRE.MatchString(fqName) { + d.err = fmt.Errorf("%q is not a valid metric name", fqName) + return d + } + // labelValues contains the label values of const labels (in order of + // their sorted label names) plus the fqName (at position 0). + labelValues := make([]string, 1, len(constLabels)+1) + labelValues[0] = fqName + labelNames := make([]string, 0, len(constLabels)+len(variableLabels)) + labelNameSet := map[string]struct{}{} + // First add only the const label names and sort them... + for labelName := range constLabels { + if !checkLabelName(labelName) { + d.err = fmt.Errorf("%q is not a valid label name", labelName) + return d + } + labelNames = append(labelNames, labelName) + labelNameSet[labelName] = struct{}{} + } + sort.Strings(labelNames) + // ... so that we can now add const label values in the order of their names. + for _, labelName := range labelNames { + labelValues = append(labelValues, constLabels[labelName]) + } + // Now add the variable label names, but prefix them with something that + // cannot be in a regular label name. That prevents matching the label + // dimension with a different mix between preset and variable labels. + for _, labelName := range variableLabels { + if !checkLabelName(labelName) { + d.err = fmt.Errorf("%q is not a valid label name", labelName) + return d + } + labelNames = append(labelNames, "$"+labelName) + labelNameSet[labelName] = struct{}{} + } + if len(labelNames) != len(labelNameSet) { + d.err = errors.New("duplicate label names") + return d + } + vh := hashNew() + for _, val := range labelValues { + vh = hashAdd(vh, val) + vh = hashAddByte(vh, separatorByte) + } + d.id = vh + // Sort labelNames so that order doesn't matter for the hash. + sort.Strings(labelNames) + // Now hash together (in this order) the help string and the sorted + // label names. + lh := hashNew() + lh = hashAdd(lh, help) + lh = hashAddByte(lh, separatorByte) + for _, labelName := range labelNames { + lh = hashAdd(lh, labelName) + lh = hashAddByte(lh, separatorByte) + } + d.dimHash = lh + + d.constLabelPairs = make([]*dto.LabelPair, 0, len(constLabels)) + for n, v := range constLabels { + d.constLabelPairs = append(d.constLabelPairs, &dto.LabelPair{ + Name: proto.String(n), + Value: proto.String(v), + }) + } + sort.Sort(LabelPairSorter(d.constLabelPairs)) + return d +} + +// NewInvalidDesc returns an invalid descriptor, i.e. a descriptor with the +// provided error set. If a collector returning such a descriptor is registered, +// registration will fail with the provided error. NewInvalidDesc can be used by +// a Collector to signal inability to describe itself. +func NewInvalidDesc(err error) *Desc { + return &Desc{ + err: err, + } +} + +func (d *Desc) String() string { + lpStrings := make([]string, 0, len(d.constLabelPairs)) + for _, lp := range d.constLabelPairs { + lpStrings = append( + lpStrings, + fmt.Sprintf("%s=%q", lp.GetName(), lp.GetValue()), + ) + } + return fmt.Sprintf( + "Desc{fqName: %q, help: %q, constLabels: {%s}, variableLabels: %v}", + d.fqName, + d.help, + strings.Join(lpStrings, ","), + d.variableLabels, + ) +} + +func checkLabelName(l string) bool { + return labelNameRE.MatchString(l) && + !strings.HasPrefix(l, reservedLabelPrefix) +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/doc.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/doc.go new file mode 100644 index 0000000..b15a2d3 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/doc.go @@ -0,0 +1,181 @@ +// Copyright 2014 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 prometheus provides metrics primitives to instrument code for +// monitoring. It also offers a registry for metrics. Sub-packages allow to +// expose the registered metrics via HTTP (package promhttp) or push them to a +// Pushgateway (package push). +// +// All exported functions and methods are safe to be used concurrently unless +//specified otherwise. +// +// A Basic Example +// +// As a starting point, a very basic usage example: +// +// package main +// +// import ( +// "net/http" +// +// "github.com/prometheus/client_golang/prometheus" +// "github.com/prometheus/client_golang/prometheus/promhttp" +// ) +// +// var ( +// cpuTemp = prometheus.NewGauge(prometheus.GaugeOpts{ +// Name: "cpu_temperature_celsius", +// Help: "Current temperature of the CPU.", +// }) +// hdFailures = prometheus.NewCounterVec( +// prometheus.CounterOpts{ +// Name: "hd_errors_total", +// Help: "Number of hard-disk errors.", +// }, +// []string{"device"}, +// ) +// ) +// +// func init() { +// // Metrics have to be registered to be exposed: +// prometheus.MustRegister(cpuTemp) +// prometheus.MustRegister(hdFailures) +// } +// +// func main() { +// cpuTemp.Set(65.3) +// hdFailures.With(prometheus.Labels{"device":"/dev/sda"}).Inc() +// +// // The Handler function provides a default handler to expose metrics +// // via an HTTP server. "/metrics" is the usual endpoint for that. +// http.Handle("/metrics", promhttp.Handler()) +// http.ListenAndServe(":8080", nil) +// } +// +// +// This is a complete program that exports two metrics, a Gauge and a Counter, +// the latter with a label attached to turn it into a (one-dimensional) vector. +// +// Metrics +// +// The number of exported identifiers in this package might appear a bit +// overwhelming. Hovever, in addition to the basic plumbing shown in the example +// above, you only need to understand the different metric types and their +// vector versions for basic usage. +// +// Above, you have already touched the Counter and the Gauge. There are two more +// advanced metric types: the Summary and Histogram. A more thorough description +// of those four metric types can be found in the Prometheus docs: +// https://prometheus.io/docs/concepts/metric_types/ +// +// A fifth "type" of metric is Untyped. It behaves like a Gauge, but signals the +// Prometheus server not to assume anything about its type. +// +// In addition to the fundamental metric types Gauge, Counter, Summary, +// Histogram, and Untyped, a very important part of the Prometheus data model is +// the partitioning of samples along dimensions called labels, which results in +// metric vectors. The fundamental types are GaugeVec, CounterVec, SummaryVec, +// HistogramVec, and UntypedVec. +// +// While only the fundamental metric types implement the Metric interface, both +// the metrics and their vector versions implement the Collector interface. A +// Collector manages the collection of a number of Metrics, but for convenience, +// a Metric can also “collect itself”. Note that Gauge, Counter, Summary, +// Histogram, and Untyped are interfaces themselves while GaugeVec, CounterVec, +// SummaryVec, HistogramVec, and UntypedVec are not. +// +// To create instances of Metrics and their vector versions, you need a suitable +// …Opts struct, i.e. GaugeOpts, CounterOpts, SummaryOpts, +// HistogramOpts, or UntypedOpts. +// +// Custom Collectors and constant Metrics +// +// While you could create your own implementations of Metric, most likely you +// will only ever implement the Collector interface on your own. At a first +// glance, a custom Collector seems handy to bundle Metrics for common +// registration (with the prime example of the different metric vectors above, +// which bundle all the metrics of the same name but with different labels). +// +// There is a more involved use case, too: If you already have metrics +// available, created outside of the Prometheus context, you don't need the +// interface of the various Metric types. You essentially want to mirror the +// existing numbers into Prometheus Metrics during collection. An own +// implementation of the Collector interface is perfect for that. You can create +// Metric instances “on the fly” using NewConstMetric, NewConstHistogram, and +// NewConstSummary (and their respective Must… versions). That will happen in +// the Collect method. The Describe method has to return separate Desc +// instances, representative of the “throw-away” metrics to be created +// later. NewDesc comes in handy to create those Desc instances. +// +// The Collector example illustrates the use case. You can also look at the +// source code of the processCollector (mirroring process metrics), the +// goCollector (mirroring Go metrics), or the expvarCollector (mirroring expvar +// metrics) as examples that are used in this package itself. +// +// If you just need to call a function to get a single float value to collect as +// a metric, GaugeFunc, CounterFunc, or UntypedFunc might be interesting +// shortcuts. +// +// Advanced Uses of the Registry +// +// While MustRegister is the by far most common way of registering a Collector, +// sometimes you might want to handle the errors the registration might +// cause. As suggested by the name, MustRegister panics if an error occurs. With +// the Register function, the error is returned and can be handled. +// +// An error is returned if the registered Collector is incompatible or +// inconsistent with already registered metrics. The registry aims for +// consistency of the collected metrics according to the Prometheus data +// model. Inconsistencies are ideally detected at registration time, not at +// collect time. The former will usually be detected at start-up time of a +// program, while the latter will only happen at scrape time, possibly not even +// on the first scrape if the inconsistency only becomes relevant later. That is +// the main reason why a Collector and a Metric have to describe themselves to +// the registry. +// +// So far, everything we did operated on the so-called default registry, as it +// can be found in the global DefaultRegistry variable. With NewRegistry, you +// can create a custom registry, or you can even implement the Registerer or +// Gatherer interfaces yourself. The methods Register and Unregister work in +// the same way on a custom registry as the global functions Register and +// Unregister on the default registry. +// +// There are a number of uses for custom registries: You can use registries +// with special properties, see NewPedanticRegistry. You can avoid global state, +// as it is imposed by the DefaultRegistry. You can use multiple registries at +// the same time to expose different metrics in different ways. You can use +// separate registries for testing purposes. +// +// Also note that the DefaultRegistry comes registered with a Collector for Go +// runtime metrics (via NewGoCollector) and a Collector for process metrics (via +// NewProcessCollector). With a custom registry, you are in control and decide +// yourself about the Collectors to register. +// +// HTTP Exposition +// +// The Registry implements the Gatherer interface. The caller of the Gather +// method can then expose the gathered metrics in some way. Usually, the metrics +// are served via HTTP on the /metrics endpoint. That's happening in the example +// above. The tools to expose metrics via HTTP are in the promhttp +// sub-package. (The top-level functions in the prometheus package are +// deprecated.) +// +// Pushing to the Pushgateway +// +// Function for pushing to the Pushgateway can be found in the push sub-package. +// +// Other Means of Exposition +// +// More ways of exposing metrics can easily be added. Sending metrics to +// Graphite would be an example that will soon be implemented. +package prometheus diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/example_clustermanager_test.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/example_clustermanager_test.go new file mode 100644 index 0000000..260c1b5 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/example_clustermanager_test.go @@ -0,0 +1,118 @@ +// Copyright 2014 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 prometheus_test + +import "github.com/prometheus/client_golang/prometheus" + +// ClusterManager is an example for a system that might have been built without +// Prometheus in mind. It models a central manager of jobs running in a +// cluster. To turn it into something that collects Prometheus metrics, we +// simply add the two methods required for the Collector interface. +// +// An additional challenge is that multiple instances of the ClusterManager are +// run within the same binary, each in charge of a different zone. We need to +// make use of ConstLabels to be able to register each ClusterManager instance +// with Prometheus. +type ClusterManager struct { + Zone string + OOMCountDesc *prometheus.Desc + RAMUsageDesc *prometheus.Desc + // ... many more fields +} + +// ReallyExpensiveAssessmentOfTheSystemState is a mock for the data gathering a +// real cluster manager would have to do. Since it may actually be really +// expensive, it must only be called once per collection. This implementation, +// obviously, only returns some made-up data. +func (c *ClusterManager) ReallyExpensiveAssessmentOfTheSystemState() ( + oomCountByHost map[string]int, ramUsageByHost map[string]float64, +) { + // Just example fake data. + oomCountByHost = map[string]int{ + "foo.example.org": 42, + "bar.example.org": 2001, + } + ramUsageByHost = map[string]float64{ + "foo.example.org": 6.023e23, + "bar.example.org": 3.14, + } + return +} + +// Describe simply sends the two Descs in the struct to the channel. +func (c *ClusterManager) Describe(ch chan<- *prometheus.Desc) { + ch <- c.OOMCountDesc + ch <- c.RAMUsageDesc +} + +// Collect first triggers the ReallyExpensiveAssessmentOfTheSystemState. Then it +// creates constant metrics for each host on the fly based on the returned data. +// +// Note that Collect could be called concurrently, so we depend on +// ReallyExpensiveAssessmentOfTheSystemState to be concurrency-safe. +func (c *ClusterManager) Collect(ch chan<- prometheus.Metric) { + oomCountByHost, ramUsageByHost := c.ReallyExpensiveAssessmentOfTheSystemState() + for host, oomCount := range oomCountByHost { + ch <- prometheus.MustNewConstMetric( + c.OOMCountDesc, + prometheus.CounterValue, + float64(oomCount), + host, + ) + } + for host, ramUsage := range ramUsageByHost { + ch <- prometheus.MustNewConstMetric( + c.RAMUsageDesc, + prometheus.GaugeValue, + ramUsage, + host, + ) + } +} + +// NewClusterManager creates the two Descs OOMCountDesc and RAMUsageDesc. Note +// that the zone is set as a ConstLabel. (It's different in each instance of the +// ClusterManager, but constant over the lifetime of an instance.) Then there is +// a variable label "host", since we want to partition the collected metrics by +// host. Since all Descs created in this way are consistent across instances, +// with a guaranteed distinction by the "zone" label, we can register different +// ClusterManager instances with the same registry. +func NewClusterManager(zone string) *ClusterManager { + return &ClusterManager{ + Zone: zone, + OOMCountDesc: prometheus.NewDesc( + "clustermanager_oom_crashes_total", + "Number of OOM crashes.", + []string{"host"}, + prometheus.Labels{"zone": zone}, + ), + RAMUsageDesc: prometheus.NewDesc( + "clustermanager_ram_usage_bytes", + "RAM usage as reported to the cluster manager.", + []string{"host"}, + prometheus.Labels{"zone": zone}, + ), + } +} + +func ExampleCollector() { + workerDB := NewClusterManager("db") + workerCA := NewClusterManager("ca") + + // Since we are dealing with custom Collector implementations, it might + // be a good idea to try it out with a pedantic registry. + reg := prometheus.NewPedanticRegistry() + reg.MustRegister(workerDB) + reg.MustRegister(workerCA) +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/examples_test.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/examples_test.go new file mode 100644 index 0000000..f87f21a --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/examples_test.go @@ -0,0 +1,751 @@ +// Copyright 2014 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 prometheus_test + +import ( + "bytes" + "fmt" + "math" + "net/http" + "runtime" + "sort" + "strings" + + dto "github.com/prometheus/client_model/go" + "github.com/prometheus/common/expfmt" + + "github.com/golang/protobuf/proto" + + "github.com/prometheus/client_golang/prometheus" +) + +func ExampleGauge() { + opsQueued := prometheus.NewGauge(prometheus.GaugeOpts{ + Namespace: "our_company", + Subsystem: "blob_storage", + Name: "ops_queued", + Help: "Number of blob storage operations waiting to be processed.", + }) + prometheus.MustRegister(opsQueued) + + // 10 operations queued by the goroutine managing incoming requests. + opsQueued.Add(10) + // A worker goroutine has picked up a waiting operation. + opsQueued.Dec() + // And once more... + opsQueued.Dec() +} + +func ExampleGaugeVec() { + opsQueued := prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Namespace: "our_company", + Subsystem: "blob_storage", + Name: "ops_queued", + Help: "Number of blob storage operations waiting to be processed, partitioned by user and type.", + }, + []string{ + // Which user has requested the operation? + "user", + // Of what type is the operation? + "type", + }, + ) + prometheus.MustRegister(opsQueued) + + // Increase a value using compact (but order-sensitive!) WithLabelValues(). + opsQueued.WithLabelValues("bob", "put").Add(4) + // Increase a value with a map using WithLabels. More verbose, but order + // doesn't matter anymore. + opsQueued.With(prometheus.Labels{"type": "delete", "user": "alice"}).Inc() +} + +func ExampleGaugeFunc() { + if err := prometheus.Register(prometheus.NewGaugeFunc( + prometheus.GaugeOpts{ + Subsystem: "runtime", + Name: "goroutines_count", + Help: "Number of goroutines that currently exist.", + }, + func() float64 { return float64(runtime.NumGoroutine()) }, + )); err == nil { + fmt.Println("GaugeFunc 'goroutines_count' registered.") + } + // Note that the count of goroutines is a gauge (and not a counter) as + // it can go up and down. + + // Output: + // GaugeFunc 'goroutines_count' registered. +} + +func ExampleCounter() { + pushCounter := prometheus.NewCounter(prometheus.CounterOpts{ + Name: "repository_pushes", // Note: No help string... + }) + err := prometheus.Register(pushCounter) // ... so this will return an error. + if err != nil { + fmt.Println("Push counter couldn't be registered, no counting will happen:", err) + return + } + + // Try it once more, this time with a help string. + pushCounter = prometheus.NewCounter(prometheus.CounterOpts{ + Name: "repository_pushes", + Help: "Number of pushes to external repository.", + }) + err = prometheus.Register(pushCounter) + if err != nil { + fmt.Println("Push counter couldn't be registered AGAIN, no counting will happen:", err) + return + } + + pushComplete := make(chan struct{}) + // TODO: Start a goroutine that performs repository pushes and reports + // each completion via the channel. + for _ = range pushComplete { + pushCounter.Inc() + } + // Output: + // Push counter couldn't be registered, no counting will happen: descriptor Desc{fqName: "repository_pushes", help: "", constLabels: {}, variableLabels: []} is invalid: empty help string +} + +func ExampleCounterVec() { + httpReqs := prometheus.NewCounterVec( + prometheus.CounterOpts{ + Name: "http_requests_total", + Help: "How many HTTP requests processed, partitioned by status code and HTTP method.", + }, + []string{"code", "method"}, + ) + prometheus.MustRegister(httpReqs) + + httpReqs.WithLabelValues("404", "POST").Add(42) + + // If you have to access the same set of labels very frequently, it + // might be good to retrieve the metric only once and keep a handle to + // it. But beware of deletion of that metric, see below! + m := httpReqs.WithLabelValues("200", "GET") + for i := 0; i < 1000000; i++ { + m.Inc() + } + // Delete a metric from the vector. If you have previously kept a handle + // to that metric (as above), future updates via that handle will go + // unseen (even if you re-create a metric with the same label set + // later). + httpReqs.DeleteLabelValues("200", "GET") + // Same thing with the more verbose Labels syntax. + httpReqs.Delete(prometheus.Labels{"method": "GET", "code": "200"}) +} + +func ExampleInstrumentHandler() { + // Handle the "/doc" endpoint with the standard http.FileServer handler. + // By wrapping the handler with InstrumentHandler, request count, + // request and response sizes, and request latency are automatically + // exported to Prometheus, partitioned by HTTP status code and method + // and by the handler name (here "fileserver"). + http.Handle("/doc", prometheus.InstrumentHandler( + "fileserver", http.FileServer(http.Dir("/usr/share/doc")), + )) + // The Prometheus handler still has to be registered to handle the + // "/metrics" endpoint. The handler returned by prometheus.Handler() is + // already instrumented - with "prometheus" as the handler name. In this + // example, we want the handler name to be "metrics", so we instrument + // the uninstrumented Prometheus handler ourselves. + http.Handle("/metrics", prometheus.InstrumentHandler( + "metrics", prometheus.UninstrumentedHandler(), + )) +} + +func ExampleLabelPairSorter() { + labelPairs := []*dto.LabelPair{ + &dto.LabelPair{Name: proto.String("status"), Value: proto.String("404")}, + &dto.LabelPair{Name: proto.String("method"), Value: proto.String("get")}, + } + + sort.Sort(prometheus.LabelPairSorter(labelPairs)) + + fmt.Println(labelPairs) + // Output: + // [name:"method" value:"get" name:"status" value:"404" ] +} + +func ExampleRegister() { + // Imagine you have a worker pool and want to count the tasks completed. + taskCounter := prometheus.NewCounter(prometheus.CounterOpts{ + Subsystem: "worker_pool", + Name: "completed_tasks_total", + Help: "Total number of tasks completed.", + }) + // This will register fine. + if err := prometheus.Register(taskCounter); err != nil { + fmt.Println(err) + } else { + fmt.Println("taskCounter registered.") + } + // Don't forget to tell the HTTP server about the Prometheus handler. + // (In a real program, you still need to start the HTTP server...) + http.Handle("/metrics", prometheus.Handler()) + + // Now you can start workers and give every one of them a pointer to + // taskCounter and let it increment it whenever it completes a task. + taskCounter.Inc() // This has to happen somewhere in the worker code. + + // But wait, you want to see how individual workers perform. So you need + // a vector of counters, with one element for each worker. + taskCounterVec := prometheus.NewCounterVec( + prometheus.CounterOpts{ + Subsystem: "worker_pool", + Name: "completed_tasks_total", + Help: "Total number of tasks completed.", + }, + []string{"worker_id"}, + ) + + // Registering will fail because we already have a metric of that name. + if err := prometheus.Register(taskCounterVec); err != nil { + fmt.Println("taskCounterVec not registered:", err) + } else { + fmt.Println("taskCounterVec registered.") + } + + // To fix, first unregister the old taskCounter. + if prometheus.Unregister(taskCounter) { + fmt.Println("taskCounter unregistered.") + } + + // Try registering taskCounterVec again. + if err := prometheus.Register(taskCounterVec); err != nil { + fmt.Println("taskCounterVec not registered:", err) + } else { + fmt.Println("taskCounterVec registered.") + } + // Bummer! Still doesn't work. + + // Prometheus will not allow you to ever export metrics with + // inconsistent help strings or label names. After unregistering, the + // unregistered metrics will cease to show up in the /metrics HTTP + // response, but the registry still remembers that those metrics had + // been exported before. For this example, we will now choose a + // different name. (In a real program, you would obviously not export + // the obsolete metric in the first place.) + taskCounterVec = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Subsystem: "worker_pool", + Name: "completed_tasks_by_id", + Help: "Total number of tasks completed.", + }, + []string{"worker_id"}, + ) + if err := prometheus.Register(taskCounterVec); err != nil { + fmt.Println("taskCounterVec not registered:", err) + } else { + fmt.Println("taskCounterVec registered.") + } + // Finally it worked! + + // The workers have to tell taskCounterVec their id to increment the + // right element in the metric vector. + taskCounterVec.WithLabelValues("42").Inc() // Code from worker 42. + + // Each worker could also keep a reference to their own counter element + // around. Pick the counter at initialization time of the worker. + myCounter := taskCounterVec.WithLabelValues("42") // From worker 42 initialization code. + myCounter.Inc() // Somewhere in the code of that worker. + + // Note that something like WithLabelValues("42", "spurious arg") would + // panic (because you have provided too many label values). If you want + // to get an error instead, use GetMetricWithLabelValues(...) instead. + notMyCounter, err := taskCounterVec.GetMetricWithLabelValues("42", "spurious arg") + if err != nil { + fmt.Println("Worker initialization failed:", err) + } + if notMyCounter == nil { + fmt.Println("notMyCounter is nil.") + } + + // A different (and somewhat tricky) approach is to use + // ConstLabels. ConstLabels are pairs of label names and label values + // that never change. You might ask what those labels are good for (and + // rightfully so - if they never change, they could as well be part of + // the metric name). There are essentially two use-cases: The first is + // if labels are constant throughout the lifetime of a binary execution, + // but they vary over time or between different instances of a running + // binary. The second is what we have here: Each worker creates and + // registers an own Counter instance where the only difference is in the + // value of the ConstLabels. Those Counters can all be registered + // because the different ConstLabel values guarantee that each worker + // will increment a different Counter metric. + counterOpts := prometheus.CounterOpts{ + Subsystem: "worker_pool", + Name: "completed_tasks", + Help: "Total number of tasks completed.", + ConstLabels: prometheus.Labels{"worker_id": "42"}, + } + taskCounterForWorker42 := prometheus.NewCounter(counterOpts) + if err := prometheus.Register(taskCounterForWorker42); err != nil { + fmt.Println("taskCounterVForWorker42 not registered:", err) + } else { + fmt.Println("taskCounterForWorker42 registered.") + } + // Obviously, in real code, taskCounterForWorker42 would be a member + // variable of a worker struct, and the "42" would be retrieved with a + // GetId() method or something. The Counter would be created and + // registered in the initialization code of the worker. + + // For the creation of the next Counter, we can recycle + // counterOpts. Just change the ConstLabels. + counterOpts.ConstLabels = prometheus.Labels{"worker_id": "2001"} + taskCounterForWorker2001 := prometheus.NewCounter(counterOpts) + if err := prometheus.Register(taskCounterForWorker2001); err != nil { + fmt.Println("taskCounterVForWorker2001 not registered:", err) + } else { + fmt.Println("taskCounterForWorker2001 registered.") + } + + taskCounterForWorker2001.Inc() + taskCounterForWorker42.Inc() + taskCounterForWorker2001.Inc() + + // Yet another approach would be to turn the workers themselves into + // Collectors and register them. See the Collector example for details. + + // Output: + // taskCounter registered. + // taskCounterVec not registered: a previously registered descriptor with the same fully-qualified name as Desc{fqName: "worker_pool_completed_tasks_total", help: "Total number of tasks completed.", constLabels: {}, variableLabels: [worker_id]} has different label names or a different help string + // taskCounter unregistered. + // taskCounterVec not registered: a previously registered descriptor with the same fully-qualified name as Desc{fqName: "worker_pool_completed_tasks_total", help: "Total number of tasks completed.", constLabels: {}, variableLabels: [worker_id]} has different label names or a different help string + // taskCounterVec registered. + // Worker initialization failed: inconsistent label cardinality + // notMyCounter is nil. + // taskCounterForWorker42 registered. + // taskCounterForWorker2001 registered. +} + +func ExampleSummary() { + temps := prometheus.NewSummary(prometheus.SummaryOpts{ + Name: "pond_temperature_celsius", + Help: "The temperature of the frog pond.", // Sorry, we can't measure how badly it smells. + }) + + // Simulate some observations. + for i := 0; i < 1000; i++ { + temps.Observe(30 + math.Floor(120*math.Sin(float64(i)*0.1))/10) + } + + // Just for demonstration, let's check the state of the summary by + // (ab)using its Write method (which is usually only used by Prometheus + // internally). + metric := &dto.Metric{} + temps.Write(metric) + fmt.Println(proto.MarshalTextString(metric)) + + // Output: + // summary: < + // sample_count: 1000 + // sample_sum: 29969.50000000001 + // quantile: < + // quantile: 0.5 + // value: 31.1 + // > + // quantile: < + // quantile: 0.9 + // value: 41.3 + // > + // quantile: < + // quantile: 0.99 + // value: 41.9 + // > + // > +} + +func ExampleSummaryVec() { + temps := prometheus.NewSummaryVec( + prometheus.SummaryOpts{ + Name: "pond_temperature_celsius", + Help: "The temperature of the frog pond.", // Sorry, we can't measure how badly it smells. + }, + []string{"species"}, + ) + + // Simulate some observations. + for i := 0; i < 1000; i++ { + temps.WithLabelValues("litoria-caerulea").Observe(30 + math.Floor(120*math.Sin(float64(i)*0.1))/10) + temps.WithLabelValues("lithobates-catesbeianus").Observe(32 + math.Floor(100*math.Cos(float64(i)*0.11))/10) + } + + // Create a Summary without any observations. + temps.WithLabelValues("leiopelma-hochstetteri") + + // Just for demonstration, let's check the state of the summary vector + // by registering it with a custom registry and then let it collect the + // metrics. + reg := prometheus.NewRegistry() + reg.MustRegister(temps) + + metricFamilies, err := reg.Gather() + if err != nil || len(metricFamilies) != 1 { + panic("unexpected behavior of custom test registry") + } + fmt.Println(proto.MarshalTextString(metricFamilies[0])) + + // Output: + // name: "pond_temperature_celsius" + // help: "The temperature of the frog pond." + // type: SUMMARY + // metric: < + // label: < + // name: "species" + // value: "leiopelma-hochstetteri" + // > + // summary: < + // sample_count: 0 + // sample_sum: 0 + // quantile: < + // quantile: 0.5 + // value: nan + // > + // quantile: < + // quantile: 0.9 + // value: nan + // > + // quantile: < + // quantile: 0.99 + // value: nan + // > + // > + // > + // metric: < + // label: < + // name: "species" + // value: "lithobates-catesbeianus" + // > + // summary: < + // sample_count: 1000 + // sample_sum: 31956.100000000017 + // quantile: < + // quantile: 0.5 + // value: 32.4 + // > + // quantile: < + // quantile: 0.9 + // value: 41.4 + // > + // quantile: < + // quantile: 0.99 + // value: 41.9 + // > + // > + // > + // metric: < + // label: < + // name: "species" + // value: "litoria-caerulea" + // > + // summary: < + // sample_count: 1000 + // sample_sum: 29969.50000000001 + // quantile: < + // quantile: 0.5 + // value: 31.1 + // > + // quantile: < + // quantile: 0.9 + // value: 41.3 + // > + // quantile: < + // quantile: 0.99 + // value: 41.9 + // > + // > + // > +} + +func ExampleNewConstSummary() { + desc := prometheus.NewDesc( + "http_request_duration_seconds", + "A summary of the HTTP request durations.", + []string{"code", "method"}, + prometheus.Labels{"owner": "example"}, + ) + + // Create a constant summary from values we got from a 3rd party telemetry system. + s := prometheus.MustNewConstSummary( + desc, + 4711, 403.34, + map[float64]float64{0.5: 42.3, 0.9: 323.3}, + "200", "get", + ) + + // Just for demonstration, let's check the state of the summary by + // (ab)using its Write method (which is usually only used by Prometheus + // internally). + metric := &dto.Metric{} + s.Write(metric) + fmt.Println(proto.MarshalTextString(metric)) + + // Output: + // label: < + // name: "code" + // value: "200" + // > + // label: < + // name: "method" + // value: "get" + // > + // label: < + // name: "owner" + // value: "example" + // > + // summary: < + // sample_count: 4711 + // sample_sum: 403.34 + // quantile: < + // quantile: 0.5 + // value: 42.3 + // > + // quantile: < + // quantile: 0.9 + // value: 323.3 + // > + // > +} + +func ExampleHistogram() { + temps := prometheus.NewHistogram(prometheus.HistogramOpts{ + Name: "pond_temperature_celsius", + Help: "The temperature of the frog pond.", // Sorry, we can't measure how badly it smells. + Buckets: prometheus.LinearBuckets(20, 5, 5), // 5 buckets, each 5 centigrade wide. + }) + + // Simulate some observations. + for i := 0; i < 1000; i++ { + temps.Observe(30 + math.Floor(120*math.Sin(float64(i)*0.1))/10) + } + + // Just for demonstration, let's check the state of the histogram by + // (ab)using its Write method (which is usually only used by Prometheus + // internally). + metric := &dto.Metric{} + temps.Write(metric) + fmt.Println(proto.MarshalTextString(metric)) + + // Output: + // histogram: < + // sample_count: 1000 + // sample_sum: 29969.50000000001 + // bucket: < + // cumulative_count: 192 + // upper_bound: 20 + // > + // bucket: < + // cumulative_count: 366 + // upper_bound: 25 + // > + // bucket: < + // cumulative_count: 501 + // upper_bound: 30 + // > + // bucket: < + // cumulative_count: 638 + // upper_bound: 35 + // > + // bucket: < + // cumulative_count: 816 + // upper_bound: 40 + // > + // > +} + +func ExampleNewConstHistogram() { + desc := prometheus.NewDesc( + "http_request_duration_seconds", + "A histogram of the HTTP request durations.", + []string{"code", "method"}, + prometheus.Labels{"owner": "example"}, + ) + + // Create a constant histogram from values we got from a 3rd party telemetry system. + h := prometheus.MustNewConstHistogram( + desc, + 4711, 403.34, + map[float64]uint64{25: 121, 50: 2403, 100: 3221, 200: 4233}, + "200", "get", + ) + + // Just for demonstration, let's check the state of the histogram by + // (ab)using its Write method (which is usually only used by Prometheus + // internally). + metric := &dto.Metric{} + h.Write(metric) + fmt.Println(proto.MarshalTextString(metric)) + + // Output: + // label: < + // name: "code" + // value: "200" + // > + // label: < + // name: "method" + // value: "get" + // > + // label: < + // name: "owner" + // value: "example" + // > + // histogram: < + // sample_count: 4711 + // sample_sum: 403.34 + // bucket: < + // cumulative_count: 121 + // upper_bound: 25 + // > + // bucket: < + // cumulative_count: 2403 + // upper_bound: 50 + // > + // bucket: < + // cumulative_count: 3221 + // upper_bound: 100 + // > + // bucket: < + // cumulative_count: 4233 + // upper_bound: 200 + // > + // > +} + +func ExampleAlreadyRegisteredError() { + reqCounter := prometheus.NewCounter(prometheus.CounterOpts{ + Name: "requests_total", + Help: "The total number of requests served.", + }) + if err := prometheus.Register(reqCounter); err != nil { + if are, ok := err.(prometheus.AlreadyRegisteredError); ok { + // A counter for that metric has been registered before. + // Use the old counter from now on. + reqCounter = are.ExistingCollector.(prometheus.Counter) + } else { + // Something else went wrong! + panic(err) + } + } +} + +func ExampleGatherers() { + reg := prometheus.NewRegistry() + temp := prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Name: "temperature_kelvin", + Help: "Temperature in Kelvin.", + }, + []string{"location"}, + ) + reg.MustRegister(temp) + temp.WithLabelValues("outside").Set(273.14) + temp.WithLabelValues("inside").Set(298.44) + + var parser expfmt.TextParser + + text := ` +# TYPE humidity_percent gauge +# HELP humidity_percent Humidity in %. +humidity_percent{location="outside"} 45.4 +humidity_percent{location="inside"} 33.2 +# TYPE temperature_kelvin gauge +# HELP temperature_kelvin Temperature in Kelvin. +temperature_kelvin{location="somewhere else"} 4.5 +` + + parseText := func() ([]*dto.MetricFamily, error) { + parsed, err := parser.TextToMetricFamilies(strings.NewReader(text)) + if err != nil { + return nil, err + } + var result []*dto.MetricFamily + for _, mf := range parsed { + result = append(result, mf) + } + return result, nil + } + + gatherers := prometheus.Gatherers{ + reg, + prometheus.GathererFunc(parseText), + } + + gathering, err := gatherers.Gather() + if err != nil { + fmt.Println(err) + } + + out := &bytes.Buffer{} + for _, mf := range gathering { + if _, err := expfmt.MetricFamilyToText(out, mf); err != nil { + panic(err) + } + } + fmt.Print(out.String()) + fmt.Println("----------") + + // Note how the temperature_kelvin metric family has been merged from + // different sources. Now try + text = ` +# TYPE humidity_percent gauge +# HELP humidity_percent Humidity in %. +humidity_percent{location="outside"} 45.4 +humidity_percent{location="inside"} 33.2 +# TYPE temperature_kelvin gauge +# HELP temperature_kelvin Temperature in Kelvin. +# Duplicate metric: +temperature_kelvin{location="outside"} 265.3 + # Wrong labels: +temperature_kelvin 4.5 +` + + gathering, err = gatherers.Gather() + if err != nil { + fmt.Println(err) + } + // Note that still as many metrics as possible are returned: + out.Reset() + for _, mf := range gathering { + if _, err := expfmt.MetricFamilyToText(out, mf); err != nil { + panic(err) + } + } + fmt.Print(out.String()) + + // Output: + // # HELP humidity_percent Humidity in %. + // # TYPE humidity_percent gauge + // humidity_percent{location="inside"} 33.2 + // humidity_percent{location="outside"} 45.4 + // # HELP temperature_kelvin Temperature in Kelvin. + // # TYPE temperature_kelvin gauge + // temperature_kelvin{location="inside"} 298.44 + // temperature_kelvin{location="outside"} 273.14 + // temperature_kelvin{location="somewhere else"} 4.5 + // ---------- + // 2 error(s) occurred: + // * collected metric temperature_kelvin label: gauge: was collected before with the same name and label values + // * collected metric temperature_kelvin gauge: has label dimensions inconsistent with previously collected metrics in the same metric family + // # HELP humidity_percent Humidity in %. + // # TYPE humidity_percent gauge + // humidity_percent{location="inside"} 33.2 + // humidity_percent{location="outside"} 45.4 + // # HELP temperature_kelvin Temperature in Kelvin. + // # TYPE temperature_kelvin gauge + // temperature_kelvin{location="inside"} 298.44 + // temperature_kelvin{location="outside"} 273.14 +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/expvar_collector.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/expvar_collector.go new file mode 100644 index 0000000..18a99d5 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/expvar_collector.go @@ -0,0 +1,119 @@ +// Copyright 2014 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 prometheus + +import ( + "encoding/json" + "expvar" +) + +type expvarCollector struct { + exports map[string]*Desc +} + +// NewExpvarCollector returns a newly allocated expvar Collector that still has +// to be registered with a Prometheus registry. +// +// An expvar Collector collects metrics from the expvar interface. It provides a +// quick way to expose numeric values that are already exported via expvar as +// Prometheus metrics. Note that the data models of expvar and Prometheus are +// fundamentally different, and that the expvar Collector is inherently slower +// than native Prometheus metrics. Thus, the expvar Collector is probably great +// for experiments and prototying, but you should seriously consider a more +// direct implementation of Prometheus metrics for monitoring production +// systems. +// +// The exports map has the following meaning: +// +// The keys in the map correspond to expvar keys, i.e. for every expvar key you +// want to export as Prometheus metric, you need an entry in the exports +// map. The descriptor mapped to each key describes how to export the expvar +// value. It defines the name and the help string of the Prometheus metric +// proxying the expvar value. The type will always be Untyped. +// +// For descriptors without variable labels, the expvar value must be a number or +// a bool. The number is then directly exported as the Prometheus sample +// value. (For a bool, 'false' translates to 0 and 'true' to 1). Expvar values +// that are not numbers or bools are silently ignored. +// +// If the descriptor has one variable label, the expvar value must be an expvar +// map. The keys in the expvar map become the various values of the one +// Prometheus label. The values in the expvar map must be numbers or bools again +// as above. +// +// For descriptors with more than one variable label, the expvar must be a +// nested expvar map, i.e. where the values of the topmost map are maps again +// etc. until a depth is reached that corresponds to the number of labels. The +// leaves of that structure must be numbers or bools as above to serve as the +// sample values. +// +// Anything that does not fit into the scheme above is silently ignored. +func NewExpvarCollector(exports map[string]*Desc) Collector { + return &expvarCollector{ + exports: exports, + } +} + +// Describe implements Collector. +func (e *expvarCollector) Describe(ch chan<- *Desc) { + for _, desc := range e.exports { + ch <- desc + } +} + +// Collect implements Collector. +func (e *expvarCollector) Collect(ch chan<- Metric) { + for name, desc := range e.exports { + var m Metric + expVar := expvar.Get(name) + if expVar == nil { + continue + } + var v interface{} + labels := make([]string, len(desc.variableLabels)) + if err := json.Unmarshal([]byte(expVar.String()), &v); err != nil { + ch <- NewInvalidMetric(desc, err) + continue + } + var processValue func(v interface{}, i int) + processValue = func(v interface{}, i int) { + if i >= len(labels) { + copiedLabels := append(make([]string, 0, len(labels)), labels...) + switch v := v.(type) { + case float64: + m = MustNewConstMetric(desc, UntypedValue, v, copiedLabels...) + case bool: + if v { + m = MustNewConstMetric(desc, UntypedValue, 1, copiedLabels...) + } else { + m = MustNewConstMetric(desc, UntypedValue, 0, copiedLabels...) + } + default: + return + } + ch <- m + return + } + vm, ok := v.(map[string]interface{}) + if !ok { + return + } + for lv, val := range vm { + labels[i] = lv + processValue(val, i+1) + } + } + processValue(v, 0) + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/expvar_collector_test.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/expvar_collector_test.go new file mode 100644 index 0000000..5d3128f --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/expvar_collector_test.go @@ -0,0 +1,97 @@ +// Copyright 2014 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 prometheus_test + +import ( + "expvar" + "fmt" + "sort" + "strings" + + dto "github.com/prometheus/client_model/go" + + "github.com/prometheus/client_golang/prometheus" +) + +func ExampleExpvarCollector() { + expvarCollector := prometheus.NewExpvarCollector(map[string]*prometheus.Desc{ + "memstats": prometheus.NewDesc( + "expvar_memstats", + "All numeric memstats as one metric family. Not a good role-model, actually... ;-)", + []string{"type"}, nil, + ), + "lone-int": prometheus.NewDesc( + "expvar_lone_int", + "Just an expvar int as an example.", + nil, nil, + ), + "http-request-map": prometheus.NewDesc( + "expvar_http_request_total", + "How many http requests processed, partitioned by status code and http method.", + []string{"code", "method"}, nil, + ), + }) + prometheus.MustRegister(expvarCollector) + + // The Prometheus part is done here. But to show that this example is + // doing anything, we have to manually export something via expvar. In + // real-life use-cases, some library would already have exported via + // expvar what we want to re-export as Prometheus metrics. + expvar.NewInt("lone-int").Set(42) + expvarMap := expvar.NewMap("http-request-map") + var ( + expvarMap1, expvarMap2 expvar.Map + expvarInt11, expvarInt12, expvarInt21, expvarInt22 expvar.Int + ) + expvarMap1.Init() + expvarMap2.Init() + expvarInt11.Set(3) + expvarInt12.Set(13) + expvarInt21.Set(11) + expvarInt22.Set(212) + expvarMap1.Set("POST", &expvarInt11) + expvarMap1.Set("GET", &expvarInt12) + expvarMap2.Set("POST", &expvarInt21) + expvarMap2.Set("GET", &expvarInt22) + expvarMap.Set("404", &expvarMap1) + expvarMap.Set("200", &expvarMap2) + // Results in the following expvar map: + // "http-request-count": {"200": {"POST": 11, "GET": 212}, "404": {"POST": 3, "GET": 13}} + + // Let's see what the scrape would yield, but exclude the memstats metrics. + metricStrings := []string{} + metric := dto.Metric{} + metricChan := make(chan prometheus.Metric) + go func() { + expvarCollector.Collect(metricChan) + close(metricChan) + }() + for m := range metricChan { + if strings.Index(m.Desc().String(), "expvar_memstats") == -1 { + metric.Reset() + m.Write(&metric) + metricStrings = append(metricStrings, metric.String()) + } + } + sort.Strings(metricStrings) + for _, s := range metricStrings { + fmt.Println(strings.TrimRight(s, " ")) + } + // Output: + // label: label: untyped: + // label: label: untyped: + // label: label: untyped: + // label: label: untyped: + // untyped: +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/fnv.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/fnv.go new file mode 100644 index 0000000..e3b67df --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/fnv.go @@ -0,0 +1,29 @@ +package prometheus + +// Inline and byte-free variant of hash/fnv's fnv64a. + +const ( + offset64 = 14695981039346656037 + prime64 = 1099511628211 +) + +// hashNew initializies a new fnv64a hash value. +func hashNew() uint64 { + return offset64 +} + +// hashAdd adds a string to a fnv64a hash value, returning the updated hash. +func hashAdd(h uint64, s string) uint64 { + for i := 0; i < len(s); i++ { + h ^= uint64(s[i]) + h *= prime64 + } + return h +} + +// hashAddByte adds a byte to a fnv64a hash value, returning the updated hash. +func hashAddByte(h uint64, b byte) uint64 { + h ^= uint64(b) + h *= prime64 + return h +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/gauge.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/gauge.go new file mode 100644 index 0000000..8b70e51 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/gauge.go @@ -0,0 +1,140 @@ +// Copyright 2014 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 prometheus + +// Gauge is a Metric that represents a single numerical value that can +// arbitrarily go up and down. +// +// A Gauge is typically used for measured values like temperatures or current +// memory usage, but also "counts" that can go up and down, like the number of +// running goroutines. +// +// To create Gauge instances, use NewGauge. +type Gauge interface { + Metric + Collector + + // Set sets the Gauge to an arbitrary value. + Set(float64) + // Inc increments the Gauge by 1. + Inc() + // Dec decrements the Gauge by 1. + Dec() + // Add adds the given value to the Gauge. (The value can be + // negative, resulting in a decrease of the Gauge.) + Add(float64) + // Sub subtracts the given value from the Gauge. (The value can be + // negative, resulting in an increase of the Gauge.) + Sub(float64) +} + +// GaugeOpts is an alias for Opts. See there for doc comments. +type GaugeOpts Opts + +// NewGauge creates a new Gauge based on the provided GaugeOpts. +func NewGauge(opts GaugeOpts) Gauge { + return newValue(NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), GaugeValue, 0) +} + +// GaugeVec is a Collector that bundles a set of Gauges that all share the same +// Desc, but have different values for their variable labels. This is used if +// you want to count the same thing partitioned by various dimensions +// (e.g. number of operations queued, partitioned by user and operation +// type). Create instances with NewGaugeVec. +type GaugeVec struct { + *MetricVec +} + +// NewGaugeVec creates a new GaugeVec based on the provided GaugeOpts and +// partitioned by the given label names. At least one label name must be +// provided. +func NewGaugeVec(opts GaugeOpts, labelNames []string) *GaugeVec { + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + labelNames, + opts.ConstLabels, + ) + return &GaugeVec{ + MetricVec: newMetricVec(desc, func(lvs ...string) Metric { + return newValue(desc, GaugeValue, 0, lvs...) + }), + } +} + +// GetMetricWithLabelValues replaces the method of the same name in +// MetricVec. The difference is that this method returns a Gauge and not a +// Metric so that no type conversion is required. +func (m *GaugeVec) GetMetricWithLabelValues(lvs ...string) (Gauge, error) { + metric, err := m.MetricVec.GetMetricWithLabelValues(lvs...) + if metric != nil { + return metric.(Gauge), err + } + return nil, err +} + +// GetMetricWith replaces the method of the same name in MetricVec. The +// difference is that this method returns a Gauge and not a Metric so that no +// type conversion is required. +func (m *GaugeVec) GetMetricWith(labels Labels) (Gauge, error) { + metric, err := m.MetricVec.GetMetricWith(labels) + if metric != nil { + return metric.(Gauge), err + } + return nil, err +} + +// WithLabelValues works as GetMetricWithLabelValues, but panics where +// GetMetricWithLabelValues would have returned an error. By not returning an +// error, WithLabelValues allows shortcuts like +// myVec.WithLabelValues("404", "GET").Add(42) +func (m *GaugeVec) WithLabelValues(lvs ...string) Gauge { + return m.MetricVec.WithLabelValues(lvs...).(Gauge) +} + +// With works as GetMetricWith, but panics where GetMetricWithLabels would have +// returned an error. By not returning an error, With allows shortcuts like +// myVec.With(Labels{"code": "404", "method": "GET"}).Add(42) +func (m *GaugeVec) With(labels Labels) Gauge { + return m.MetricVec.With(labels).(Gauge) +} + +// GaugeFunc is a Gauge whose value is determined at collect time by calling a +// provided function. +// +// To create GaugeFunc instances, use NewGaugeFunc. +type GaugeFunc interface { + Metric + Collector +} + +// NewGaugeFunc creates a new GaugeFunc based on the provided GaugeOpts. The +// value reported is determined by calling the given function from within the +// Write method. Take into account that metric collection may happen +// concurrently. If that results in concurrent calls to Write, like in the case +// where a GaugeFunc is directly registered with Prometheus, the provided +// function must be concurrency-safe. +func NewGaugeFunc(opts GaugeOpts, function func() float64) GaugeFunc { + return newValueFunc(NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), GaugeValue, function) +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/gauge_test.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/gauge_test.go new file mode 100644 index 0000000..48cab46 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/gauge_test.go @@ -0,0 +1,182 @@ +// Copyright 2014 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 prometheus + +import ( + "math" + "math/rand" + "sync" + "testing" + "testing/quick" + + dto "github.com/prometheus/client_model/go" +) + +func listenGaugeStream(vals, result chan float64, done chan struct{}) { + var sum float64 +outer: + for { + select { + case <-done: + close(vals) + for v := range vals { + sum += v + } + break outer + case v := <-vals: + sum += v + } + } + result <- sum + close(result) +} + +func TestGaugeConcurrency(t *testing.T) { + it := func(n uint32) bool { + mutations := int(n % 10000) + concLevel := int(n%15 + 1) + + var start, end sync.WaitGroup + start.Add(1) + end.Add(concLevel) + + sStream := make(chan float64, mutations*concLevel) + result := make(chan float64) + done := make(chan struct{}) + + go listenGaugeStream(sStream, result, done) + go func() { + end.Wait() + close(done) + }() + + gge := NewGauge(GaugeOpts{ + Name: "test_gauge", + Help: "no help can be found here", + }) + for i := 0; i < concLevel; i++ { + vals := make([]float64, mutations) + for j := 0; j < mutations; j++ { + vals[j] = rand.Float64() - 0.5 + } + + go func(vals []float64) { + start.Wait() + for _, v := range vals { + sStream <- v + gge.Add(v) + } + end.Done() + }(vals) + } + start.Done() + + if expected, got := <-result, math.Float64frombits(gge.(*value).valBits); math.Abs(expected-got) > 0.000001 { + t.Fatalf("expected approx. %f, got %f", expected, got) + return false + } + return true + } + + if err := quick.Check(it, nil); err != nil { + t.Fatal(err) + } +} + +func TestGaugeVecConcurrency(t *testing.T) { + it := func(n uint32) bool { + mutations := int(n % 10000) + concLevel := int(n%15 + 1) + vecLength := int(n%5 + 1) + + var start, end sync.WaitGroup + start.Add(1) + end.Add(concLevel) + + sStreams := make([]chan float64, vecLength) + results := make([]chan float64, vecLength) + done := make(chan struct{}) + + for i := 0; i < vecLength; i++ { + sStreams[i] = make(chan float64, mutations*concLevel) + results[i] = make(chan float64) + go listenGaugeStream(sStreams[i], results[i], done) + } + + go func() { + end.Wait() + close(done) + }() + + gge := NewGaugeVec( + GaugeOpts{ + Name: "test_gauge", + Help: "no help can be found here", + }, + []string{"label"}, + ) + for i := 0; i < concLevel; i++ { + vals := make([]float64, mutations) + pick := make([]int, mutations) + for j := 0; j < mutations; j++ { + vals[j] = rand.Float64() - 0.5 + pick[j] = rand.Intn(vecLength) + } + + go func(vals []float64) { + start.Wait() + for i, v := range vals { + sStreams[pick[i]] <- v + gge.WithLabelValues(string('A' + pick[i])).Add(v) + } + end.Done() + }(vals) + } + start.Done() + + for i := range sStreams { + if expected, got := <-results[i], math.Float64frombits(gge.WithLabelValues(string('A'+i)).(*value).valBits); math.Abs(expected-got) > 0.000001 { + t.Fatalf("expected approx. %f, got %f", expected, got) + return false + } + } + return true + } + + if err := quick.Check(it, nil); err != nil { + t.Fatal(err) + } +} + +func TestGaugeFunc(t *testing.T) { + gf := NewGaugeFunc( + GaugeOpts{ + Name: "test_name", + Help: "test help", + ConstLabels: Labels{"a": "1", "b": "2"}, + }, + func() float64 { return 3.1415 }, + ) + + if expected, got := `Desc{fqName: "test_name", help: "test help", constLabels: {a="1",b="2"}, variableLabels: []}`, gf.Desc().String(); expected != got { + t.Errorf("expected %q, got %q", expected, got) + } + + m := &dto.Metric{} + gf.Write(m) + + if expected, got := `label: label: gauge: `, m.String(); expected != got { + t.Errorf("expected %q, got %q", expected, got) + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/go_collector.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/go_collector.go new file mode 100644 index 0000000..abc9d4e --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/go_collector.go @@ -0,0 +1,263 @@ +package prometheus + +import ( + "fmt" + "runtime" + "runtime/debug" + "time" +) + +type goCollector struct { + goroutines Gauge + gcDesc *Desc + + // metrics to describe and collect + metrics memStatsMetrics +} + +// NewGoCollector returns a collector which exports metrics about the current +// go process. +func NewGoCollector() Collector { + return &goCollector{ + goroutines: NewGauge(GaugeOpts{ + Namespace: "go", + Name: "goroutines", + Help: "Number of goroutines that currently exist.", + }), + gcDesc: NewDesc( + "go_gc_duration_seconds", + "A summary of the GC invocation durations.", + nil, nil), + metrics: memStatsMetrics{ + { + desc: NewDesc( + memstatNamespace("alloc_bytes"), + "Number of bytes allocated and still in use.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.Alloc) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("alloc_bytes_total"), + "Total number of bytes allocated, even if freed.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.TotalAlloc) }, + valType: CounterValue, + }, { + desc: NewDesc( + memstatNamespace("sys_bytes"), + "Number of bytes obtained by system. Sum of all system allocations.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.Sys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("lookups_total"), + "Total number of pointer lookups.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.Lookups) }, + valType: CounterValue, + }, { + desc: NewDesc( + memstatNamespace("mallocs_total"), + "Total number of mallocs.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.Mallocs) }, + valType: CounterValue, + }, { + desc: NewDesc( + memstatNamespace("frees_total"), + "Total number of frees.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.Frees) }, + valType: CounterValue, + }, { + desc: NewDesc( + memstatNamespace("heap_alloc_bytes"), + "Number of heap bytes allocated and still in use.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapAlloc) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("heap_sys_bytes"), + "Number of heap bytes obtained from system.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("heap_idle_bytes"), + "Number of heap bytes waiting to be used.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapIdle) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("heap_inuse_bytes"), + "Number of heap bytes that are in use.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapInuse) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("heap_released_bytes_total"), + "Total number of heap bytes released to OS.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapReleased) }, + valType: CounterValue, + }, { + desc: NewDesc( + memstatNamespace("heap_objects"), + "Number of allocated objects.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapObjects) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("stack_inuse_bytes"), + "Number of bytes in use by the stack allocator.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.StackInuse) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("stack_sys_bytes"), + "Number of bytes obtained from system for stack allocator.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.StackSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("mspan_inuse_bytes"), + "Number of bytes in use by mspan structures.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.MSpanInuse) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("mspan_sys_bytes"), + "Number of bytes used for mspan structures obtained from system.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.MSpanSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("mcache_inuse_bytes"), + "Number of bytes in use by mcache structures.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.MCacheInuse) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("mcache_sys_bytes"), + "Number of bytes used for mcache structures obtained from system.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.MCacheSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("buck_hash_sys_bytes"), + "Number of bytes used by the profiling bucket hash table.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.BuckHashSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("gc_sys_bytes"), + "Number of bytes used for garbage collection system metadata.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.GCSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("other_sys_bytes"), + "Number of bytes used for other system allocations.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.OtherSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("next_gc_bytes"), + "Number of heap bytes when next garbage collection will take place.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.NextGC) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("last_gc_time_seconds"), + "Number of seconds since 1970 of last garbage collection.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.LastGC) / 1e9 }, + valType: GaugeValue, + }, + }, + } +} + +func memstatNamespace(s string) string { + return fmt.Sprintf("go_memstats_%s", s) +} + +// Describe returns all descriptions of the collector. +func (c *goCollector) Describe(ch chan<- *Desc) { + ch <- c.goroutines.Desc() + ch <- c.gcDesc + + for _, i := range c.metrics { + ch <- i.desc + } +} + +// Collect returns the current state of all metrics of the collector. +func (c *goCollector) Collect(ch chan<- Metric) { + c.goroutines.Set(float64(runtime.NumGoroutine())) + ch <- c.goroutines + + var stats debug.GCStats + stats.PauseQuantiles = make([]time.Duration, 5) + debug.ReadGCStats(&stats) + + quantiles := make(map[float64]float64) + for idx, pq := range stats.PauseQuantiles[1:] { + quantiles[float64(idx+1)/float64(len(stats.PauseQuantiles)-1)] = pq.Seconds() + } + quantiles[0.0] = stats.PauseQuantiles[0].Seconds() + ch <- MustNewConstSummary(c.gcDesc, uint64(stats.NumGC), float64(stats.PauseTotal.Seconds()), quantiles) + + ms := &runtime.MemStats{} + runtime.ReadMemStats(ms) + for _, i := range c.metrics { + ch <- MustNewConstMetric(i.desc, i.valType, i.eval(ms)) + } +} + +// memStatsMetrics provide description, value, and value type for memstat metrics. +type memStatsMetrics []struct { + desc *Desc + eval func(*runtime.MemStats) float64 + valType ValueType +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/go_collector_test.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/go_collector_test.go new file mode 100644 index 0000000..9a8858c --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/go_collector_test.go @@ -0,0 +1,123 @@ +package prometheus + +import ( + "runtime" + "testing" + "time" + + dto "github.com/prometheus/client_model/go" +) + +func TestGoCollector(t *testing.T) { + var ( + c = NewGoCollector() + ch = make(chan Metric) + waitc = make(chan struct{}) + closec = make(chan struct{}) + old = -1 + ) + defer close(closec) + + go func() { + c.Collect(ch) + go func(c <-chan struct{}) { + <-c + }(closec) + <-waitc + c.Collect(ch) + }() + + for { + select { + case metric := <-ch: + switch m := metric.(type) { + // Attention, this also catches Counter... + case Gauge: + pb := &dto.Metric{} + m.Write(pb) + if pb.GetGauge() == nil { + continue + } + + if old == -1 { + old = int(pb.GetGauge().GetValue()) + close(waitc) + continue + } + + if diff := int(pb.GetGauge().GetValue()) - old; diff != 1 { + // TODO: This is flaky in highly concurrent situations. + t.Errorf("want 1 new goroutine, got %d", diff) + } + + // GoCollector performs two sends per call. + // On line 27 we need to receive the second send + // to shut down cleanly. + <-ch + return + } + case <-time.After(1 * time.Second): + t.Fatalf("expected collect timed out") + } + } +} + +func TestGCCollector(t *testing.T) { + var ( + c = NewGoCollector() + ch = make(chan Metric) + waitc = make(chan struct{}) + closec = make(chan struct{}) + oldGC uint64 + oldPause float64 + ) + defer close(closec) + + go func() { + c.Collect(ch) + // force GC + runtime.GC() + <-waitc + c.Collect(ch) + }() + + first := true + for { + select { + case metric := <-ch: + switch m := metric.(type) { + case *constSummary, *value: + pb := &dto.Metric{} + m.Write(pb) + if pb.GetSummary() == nil { + continue + } + + if len(pb.GetSummary().Quantile) != 5 { + t.Errorf("expected 4 buckets, got %d", len(pb.GetSummary().Quantile)) + } + for idx, want := range []float64{0.0, 0.25, 0.5, 0.75, 1.0} { + if *pb.GetSummary().Quantile[idx].Quantile != want { + t.Errorf("bucket #%d is off, got %f, want %f", idx, *pb.GetSummary().Quantile[idx].Quantile, want) + } + } + if first { + first = false + oldGC = *pb.GetSummary().SampleCount + oldPause = *pb.GetSummary().SampleSum + close(waitc) + continue + } + if diff := *pb.GetSummary().SampleCount - oldGC; diff != 1 { + t.Errorf("want 1 new garbage collection run, got %d", diff) + } + if diff := *pb.GetSummary().SampleSum - oldPause; diff <= 0 { + t.Errorf("want moar pause, got %f", diff) + } + return + } + case <-time.After(1 * time.Second): + t.Fatalf("expected collect timed out") + } + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/histogram.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/histogram.go new file mode 100644 index 0000000..9719e8f --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/histogram.go @@ -0,0 +1,444 @@ +// Copyright 2015 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 prometheus + +import ( + "fmt" + "math" + "sort" + "sync/atomic" + + "github.com/golang/protobuf/proto" + + dto "github.com/prometheus/client_model/go" +) + +// A Histogram counts individual observations from an event or sample stream in +// configurable buckets. Similar to a summary, it also provides a sum of +// observations and an observation count. +// +// On the Prometheus server, quantiles can be calculated from a Histogram using +// the histogram_quantile function in the query language. +// +// Note that Histograms, in contrast to Summaries, can be aggregated with the +// Prometheus query language (see the documentation for detailed +// procedures). However, Histograms require the user to pre-define suitable +// buckets, and they are in general less accurate. The Observe method of a +// Histogram has a very low performance overhead in comparison with the Observe +// method of a Summary. +// +// To create Histogram instances, use NewHistogram. +type Histogram interface { + Metric + Collector + + // Observe adds a single observation to the histogram. + Observe(float64) +} + +// bucketLabel is used for the label that defines the upper bound of a +// bucket of a histogram ("le" -> "less or equal"). +const bucketLabel = "le" + +// DefBuckets are the default Histogram buckets. The default buckets are +// tailored to broadly measure the response time (in seconds) of a network +// service. Most likely, however, you will be required to define buckets +// customized to your use case. +var ( + DefBuckets = []float64{.005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5, 10} + + errBucketLabelNotAllowed = fmt.Errorf( + "%q is not allowed as label name in histograms", bucketLabel, + ) +) + +// LinearBuckets creates 'count' buckets, each 'width' wide, where the lowest +// bucket has an upper bound of 'start'. The final +Inf bucket is not counted +// and not included in the returned slice. The returned slice is meant to be +// used for the Buckets field of HistogramOpts. +// +// The function panics if 'count' is zero or negative. +func LinearBuckets(start, width float64, count int) []float64 { + if count < 1 { + panic("LinearBuckets needs a positive count") + } + buckets := make([]float64, count) + for i := range buckets { + buckets[i] = start + start += width + } + return buckets +} + +// ExponentialBuckets creates 'count' buckets, where the lowest bucket has an +// upper bound of 'start' and each following bucket's upper bound is 'factor' +// times the previous bucket's upper bound. The final +Inf bucket is not counted +// and not included in the returned slice. The returned slice is meant to be +// used for the Buckets field of HistogramOpts. +// +// The function panics if 'count' is 0 or negative, if 'start' is 0 or negative, +// or if 'factor' is less than or equal 1. +func ExponentialBuckets(start, factor float64, count int) []float64 { + if count < 1 { + panic("ExponentialBuckets needs a positive count") + } + if start <= 0 { + panic("ExponentialBuckets needs a positive start value") + } + if factor <= 1 { + panic("ExponentialBuckets needs a factor greater than 1") + } + buckets := make([]float64, count) + for i := range buckets { + buckets[i] = start + start *= factor + } + return buckets +} + +// HistogramOpts bundles the options for creating a Histogram metric. It is +// mandatory to set Name and Help to a non-empty string. All other fields are +// optional and can safely be left at their zero value. +type HistogramOpts struct { + // Namespace, Subsystem, and Name are components of the fully-qualified + // name of the Histogram (created by joining these components with + // "_"). Only Name is mandatory, the others merely help structuring the + // name. Note that the fully-qualified name of the Histogram must be a + // valid Prometheus metric name. + Namespace string + Subsystem string + Name string + + // Help provides information about this Histogram. Mandatory! + // + // Metrics with the same fully-qualified name must have the same Help + // string. + Help string + + // ConstLabels are used to attach fixed labels to this + // Histogram. Histograms with the same fully-qualified name must have the + // same label names in their ConstLabels. + // + // Note that in most cases, labels have a value that varies during the + // lifetime of a process. Those labels are usually managed with a + // HistogramVec. ConstLabels serve only special purposes. One is for the + // special case where the value of a label does not change during the + // lifetime of a process, e.g. if the revision of the running binary is + // put into a label. Another, more advanced purpose is if more than one + // Collector needs to collect Histograms with the same fully-qualified + // name. In that case, those Summaries must differ in the values of + // their ConstLabels. See the Collector examples. + // + // If the value of a label never changes (not even between binaries), + // that label most likely should not be a label at all (but part of the + // metric name). + ConstLabels Labels + + // Buckets defines the buckets into which observations are counted. Each + // element in the slice is the upper inclusive bound of a bucket. The + // values must be sorted in strictly increasing order. There is no need + // to add a highest bucket with +Inf bound, it will be added + // implicitly. The default value is DefBuckets. + Buckets []float64 +} + +// NewHistogram creates a new Histogram based on the provided HistogramOpts. It +// panics if the buckets in HistogramOpts are not in strictly increasing order. +func NewHistogram(opts HistogramOpts) Histogram { + return newHistogram( + NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), + opts, + ) +} + +func newHistogram(desc *Desc, opts HistogramOpts, labelValues ...string) Histogram { + if len(desc.variableLabels) != len(labelValues) { + panic(errInconsistentCardinality) + } + + for _, n := range desc.variableLabels { + if n == bucketLabel { + panic(errBucketLabelNotAllowed) + } + } + for _, lp := range desc.constLabelPairs { + if lp.GetName() == bucketLabel { + panic(errBucketLabelNotAllowed) + } + } + + if len(opts.Buckets) == 0 { + opts.Buckets = DefBuckets + } + + h := &histogram{ + desc: desc, + upperBounds: opts.Buckets, + labelPairs: makeLabelPairs(desc, labelValues), + } + for i, upperBound := range h.upperBounds { + if i < len(h.upperBounds)-1 { + if upperBound >= h.upperBounds[i+1] { + panic(fmt.Errorf( + "histogram buckets must be in increasing order: %f >= %f", + upperBound, h.upperBounds[i+1], + )) + } + } else { + if math.IsInf(upperBound, +1) { + // The +Inf bucket is implicit. Remove it here. + h.upperBounds = h.upperBounds[:i] + } + } + } + // Finally we know the final length of h.upperBounds and can make counts. + h.counts = make([]uint64, len(h.upperBounds)) + + h.init(h) // Init self-collection. + return h +} + +type histogram struct { + // sumBits contains the bits of the float64 representing the sum of all + // observations. sumBits and count have to go first in the struct to + // guarantee alignment for atomic operations. + // http://golang.org/pkg/sync/atomic/#pkg-note-BUG + sumBits uint64 + count uint64 + + selfCollector + // Note that there is no mutex required. + + desc *Desc + + upperBounds []float64 + counts []uint64 + + labelPairs []*dto.LabelPair +} + +func (h *histogram) Desc() *Desc { + return h.desc +} + +func (h *histogram) Observe(v float64) { + // TODO(beorn7): For small numbers of buckets (<30), a linear search is + // slightly faster than the binary search. If we really care, we could + // switch from one search strategy to the other depending on the number + // of buckets. + // + // Microbenchmarks (BenchmarkHistogramNoLabels): + // 11 buckets: 38.3 ns/op linear - binary 48.7 ns/op + // 100 buckets: 78.1 ns/op linear - binary 54.9 ns/op + // 300 buckets: 154 ns/op linear - binary 61.6 ns/op + i := sort.SearchFloat64s(h.upperBounds, v) + if i < len(h.counts) { + atomic.AddUint64(&h.counts[i], 1) + } + atomic.AddUint64(&h.count, 1) + for { + oldBits := atomic.LoadUint64(&h.sumBits) + newBits := math.Float64bits(math.Float64frombits(oldBits) + v) + if atomic.CompareAndSwapUint64(&h.sumBits, oldBits, newBits) { + break + } + } +} + +func (h *histogram) Write(out *dto.Metric) error { + his := &dto.Histogram{} + buckets := make([]*dto.Bucket, len(h.upperBounds)) + + his.SampleSum = proto.Float64(math.Float64frombits(atomic.LoadUint64(&h.sumBits))) + his.SampleCount = proto.Uint64(atomic.LoadUint64(&h.count)) + var count uint64 + for i, upperBound := range h.upperBounds { + count += atomic.LoadUint64(&h.counts[i]) + buckets[i] = &dto.Bucket{ + CumulativeCount: proto.Uint64(count), + UpperBound: proto.Float64(upperBound), + } + } + his.Bucket = buckets + out.Histogram = his + out.Label = h.labelPairs + return nil +} + +// HistogramVec is a Collector that bundles a set of Histograms that all share the +// same Desc, but have different values for their variable labels. This is used +// if you want to count the same thing partitioned by various dimensions +// (e.g. HTTP request latencies, partitioned by status code and method). Create +// instances with NewHistogramVec. +type HistogramVec struct { + *MetricVec +} + +// NewHistogramVec creates a new HistogramVec based on the provided HistogramOpts and +// partitioned by the given label names. At least one label name must be +// provided. +func NewHistogramVec(opts HistogramOpts, labelNames []string) *HistogramVec { + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + labelNames, + opts.ConstLabels, + ) + return &HistogramVec{ + MetricVec: newMetricVec(desc, func(lvs ...string) Metric { + return newHistogram(desc, opts, lvs...) + }), + } +} + +// GetMetricWithLabelValues replaces the method of the same name in +// MetricVec. The difference is that this method returns a Histogram and not a +// Metric so that no type conversion is required. +func (m *HistogramVec) GetMetricWithLabelValues(lvs ...string) (Histogram, error) { + metric, err := m.MetricVec.GetMetricWithLabelValues(lvs...) + if metric != nil { + return metric.(Histogram), err + } + return nil, err +} + +// GetMetricWith replaces the method of the same name in MetricVec. The +// difference is that this method returns a Histogram and not a Metric so that no +// type conversion is required. +func (m *HistogramVec) GetMetricWith(labels Labels) (Histogram, error) { + metric, err := m.MetricVec.GetMetricWith(labels) + if metric != nil { + return metric.(Histogram), err + } + return nil, err +} + +// WithLabelValues works as GetMetricWithLabelValues, but panics where +// GetMetricWithLabelValues would have returned an error. By not returning an +// error, WithLabelValues allows shortcuts like +// myVec.WithLabelValues("404", "GET").Observe(42.21) +func (m *HistogramVec) WithLabelValues(lvs ...string) Histogram { + return m.MetricVec.WithLabelValues(lvs...).(Histogram) +} + +// With works as GetMetricWith, but panics where GetMetricWithLabels would have +// returned an error. By not returning an error, With allows shortcuts like +// myVec.With(Labels{"code": "404", "method": "GET"}).Observe(42.21) +func (m *HistogramVec) With(labels Labels) Histogram { + return m.MetricVec.With(labels).(Histogram) +} + +type constHistogram struct { + desc *Desc + count uint64 + sum float64 + buckets map[float64]uint64 + labelPairs []*dto.LabelPair +} + +func (h *constHistogram) Desc() *Desc { + return h.desc +} + +func (h *constHistogram) Write(out *dto.Metric) error { + his := &dto.Histogram{} + buckets := make([]*dto.Bucket, 0, len(h.buckets)) + + his.SampleCount = proto.Uint64(h.count) + his.SampleSum = proto.Float64(h.sum) + + for upperBound, count := range h.buckets { + buckets = append(buckets, &dto.Bucket{ + CumulativeCount: proto.Uint64(count), + UpperBound: proto.Float64(upperBound), + }) + } + + if len(buckets) > 0 { + sort.Sort(buckSort(buckets)) + } + his.Bucket = buckets + + out.Histogram = his + out.Label = h.labelPairs + + return nil +} + +// NewConstHistogram returns a metric representing a Prometheus histogram with +// fixed values for the count, sum, and bucket counts. As those parameters +// cannot be changed, the returned value does not implement the Histogram +// interface (but only the Metric interface). Users of this package will not +// have much use for it in regular operations. However, when implementing custom +// Collectors, it is useful as a throw-away metric that is generated on the fly +// to send it to Prometheus in the Collect method. +// +// buckets is a map of upper bounds to cumulative counts, excluding the +Inf +// bucket. +// +// NewConstHistogram returns an error if the length of labelValues is not +// consistent with the variable labels in Desc. +func NewConstHistogram( + desc *Desc, + count uint64, + sum float64, + buckets map[float64]uint64, + labelValues ...string, +) (Metric, error) { + if len(desc.variableLabels) != len(labelValues) { + return nil, errInconsistentCardinality + } + return &constHistogram{ + desc: desc, + count: count, + sum: sum, + buckets: buckets, + labelPairs: makeLabelPairs(desc, labelValues), + }, nil +} + +// MustNewConstHistogram is a version of NewConstHistogram that panics where +// NewConstMetric would have returned an error. +func MustNewConstHistogram( + desc *Desc, + count uint64, + sum float64, + buckets map[float64]uint64, + labelValues ...string, +) Metric { + m, err := NewConstHistogram(desc, count, sum, buckets, labelValues...) + if err != nil { + panic(err) + } + return m +} + +type buckSort []*dto.Bucket + +func (s buckSort) Len() int { + return len(s) +} + +func (s buckSort) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s buckSort) Less(i, j int) bool { + return s[i].GetUpperBound() < s[j].GetUpperBound() +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/histogram_test.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/histogram_test.go new file mode 100644 index 0000000..d1242e0 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/histogram_test.go @@ -0,0 +1,326 @@ +// Copyright 2015 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 prometheus + +import ( + "math" + "math/rand" + "reflect" + "sort" + "sync" + "testing" + "testing/quick" + + dto "github.com/prometheus/client_model/go" +) + +func benchmarkHistogramObserve(w int, b *testing.B) { + b.StopTimer() + + wg := new(sync.WaitGroup) + wg.Add(w) + + g := new(sync.WaitGroup) + g.Add(1) + + s := NewHistogram(HistogramOpts{}) + + for i := 0; i < w; i++ { + go func() { + g.Wait() + + for i := 0; i < b.N; i++ { + s.Observe(float64(i)) + } + + wg.Done() + }() + } + + b.StartTimer() + g.Done() + wg.Wait() +} + +func BenchmarkHistogramObserve1(b *testing.B) { + benchmarkHistogramObserve(1, b) +} + +func BenchmarkHistogramObserve2(b *testing.B) { + benchmarkHistogramObserve(2, b) +} + +func BenchmarkHistogramObserve4(b *testing.B) { + benchmarkHistogramObserve(4, b) +} + +func BenchmarkHistogramObserve8(b *testing.B) { + benchmarkHistogramObserve(8, b) +} + +func benchmarkHistogramWrite(w int, b *testing.B) { + b.StopTimer() + + wg := new(sync.WaitGroup) + wg.Add(w) + + g := new(sync.WaitGroup) + g.Add(1) + + s := NewHistogram(HistogramOpts{}) + + for i := 0; i < 1000000; i++ { + s.Observe(float64(i)) + } + + for j := 0; j < w; j++ { + outs := make([]dto.Metric, b.N) + + go func(o []dto.Metric) { + g.Wait() + + for i := 0; i < b.N; i++ { + s.Write(&o[i]) + } + + wg.Done() + }(outs) + } + + b.StartTimer() + g.Done() + wg.Wait() +} + +func BenchmarkHistogramWrite1(b *testing.B) { + benchmarkHistogramWrite(1, b) +} + +func BenchmarkHistogramWrite2(b *testing.B) { + benchmarkHistogramWrite(2, b) +} + +func BenchmarkHistogramWrite4(b *testing.B) { + benchmarkHistogramWrite(4, b) +} + +func BenchmarkHistogramWrite8(b *testing.B) { + benchmarkHistogramWrite(8, b) +} + +// Intentionally adding +Inf here to test if that case is handled correctly. +// Also, getCumulativeCounts depends on it. +var testBuckets = []float64{-2, -1, -0.5, 0, 0.5, 1, 2, math.Inf(+1)} + +func TestHistogramConcurrency(t *testing.T) { + if testing.Short() { + t.Skip("Skipping test in short mode.") + } + + rand.Seed(42) + + it := func(n uint32) bool { + mutations := int(n%1e4 + 1e4) + concLevel := int(n%5 + 1) + total := mutations * concLevel + + var start, end sync.WaitGroup + start.Add(1) + end.Add(concLevel) + + sum := NewHistogram(HistogramOpts{ + Name: "test_histogram", + Help: "helpless", + Buckets: testBuckets, + }) + + allVars := make([]float64, total) + var sampleSum float64 + for i := 0; i < concLevel; i++ { + vals := make([]float64, mutations) + for j := 0; j < mutations; j++ { + v := rand.NormFloat64() + vals[j] = v + allVars[i*mutations+j] = v + sampleSum += v + } + + go func(vals []float64) { + start.Wait() + for _, v := range vals { + sum.Observe(v) + } + end.Done() + }(vals) + } + sort.Float64s(allVars) + start.Done() + end.Wait() + + m := &dto.Metric{} + sum.Write(m) + if got, want := int(*m.Histogram.SampleCount), total; got != want { + t.Errorf("got sample count %d, want %d", got, want) + } + if got, want := *m.Histogram.SampleSum, sampleSum; math.Abs((got-want)/want) > 0.001 { + t.Errorf("got sample sum %f, want %f", got, want) + } + + wantCounts := getCumulativeCounts(allVars) + + if got, want := len(m.Histogram.Bucket), len(testBuckets)-1; got != want { + t.Errorf("got %d buckets in protobuf, want %d", got, want) + } + for i, wantBound := range testBuckets { + if i == len(testBuckets)-1 { + break // No +Inf bucket in protobuf. + } + if gotBound := *m.Histogram.Bucket[i].UpperBound; gotBound != wantBound { + t.Errorf("got bound %f, want %f", gotBound, wantBound) + } + if gotCount, wantCount := *m.Histogram.Bucket[i].CumulativeCount, wantCounts[i]; gotCount != wantCount { + t.Errorf("got count %d, want %d", gotCount, wantCount) + } + } + return true + } + + if err := quick.Check(it, nil); err != nil { + t.Error(err) + } +} + +func TestHistogramVecConcurrency(t *testing.T) { + if testing.Short() { + t.Skip("Skipping test in short mode.") + } + + rand.Seed(42) + + objectives := make([]float64, 0, len(DefObjectives)) + for qu := range DefObjectives { + + objectives = append(objectives, qu) + } + sort.Float64s(objectives) + + it := func(n uint32) bool { + mutations := int(n%1e4 + 1e4) + concLevel := int(n%7 + 1) + vecLength := int(n%3 + 1) + + var start, end sync.WaitGroup + start.Add(1) + end.Add(concLevel) + + his := NewHistogramVec( + HistogramOpts{ + Name: "test_histogram", + Help: "helpless", + Buckets: []float64{-2, -1, -0.5, 0, 0.5, 1, 2, math.Inf(+1)}, + }, + []string{"label"}, + ) + + allVars := make([][]float64, vecLength) + sampleSums := make([]float64, vecLength) + for i := 0; i < concLevel; i++ { + vals := make([]float64, mutations) + picks := make([]int, mutations) + for j := 0; j < mutations; j++ { + v := rand.NormFloat64() + vals[j] = v + pick := rand.Intn(vecLength) + picks[j] = pick + allVars[pick] = append(allVars[pick], v) + sampleSums[pick] += v + } + + go func(vals []float64) { + start.Wait() + for i, v := range vals { + his.WithLabelValues(string('A' + picks[i])).Observe(v) + } + end.Done() + }(vals) + } + for _, vars := range allVars { + sort.Float64s(vars) + } + start.Done() + end.Wait() + + for i := 0; i < vecLength; i++ { + m := &dto.Metric{} + s := his.WithLabelValues(string('A' + i)) + s.Write(m) + + if got, want := len(m.Histogram.Bucket), len(testBuckets)-1; got != want { + t.Errorf("got %d buckets in protobuf, want %d", got, want) + } + if got, want := int(*m.Histogram.SampleCount), len(allVars[i]); got != want { + t.Errorf("got sample count %d, want %d", got, want) + } + if got, want := *m.Histogram.SampleSum, sampleSums[i]; math.Abs((got-want)/want) > 0.001 { + t.Errorf("got sample sum %f, want %f", got, want) + } + + wantCounts := getCumulativeCounts(allVars[i]) + + for j, wantBound := range testBuckets { + if j == len(testBuckets)-1 { + break // No +Inf bucket in protobuf. + } + if gotBound := *m.Histogram.Bucket[j].UpperBound; gotBound != wantBound { + t.Errorf("got bound %f, want %f", gotBound, wantBound) + } + if gotCount, wantCount := *m.Histogram.Bucket[j].CumulativeCount, wantCounts[j]; gotCount != wantCount { + t.Errorf("got count %d, want %d", gotCount, wantCount) + } + } + } + return true + } + + if err := quick.Check(it, nil); err != nil { + t.Error(err) + } +} + +func getCumulativeCounts(vars []float64) []uint64 { + counts := make([]uint64, len(testBuckets)) + for _, v := range vars { + for i := len(testBuckets) - 1; i >= 0; i-- { + if v > testBuckets[i] { + break + } + counts[i]++ + } + } + return counts +} + +func TestBuckets(t *testing.T) { + got := LinearBuckets(-15, 5, 6) + want := []float64{-15, -10, -5, 0, 5, 10} + if !reflect.DeepEqual(got, want) { + t.Errorf("linear buckets: got %v, want %v", got, want) + } + + got = ExponentialBuckets(100, 1.2, 3) + want = []float64{100, 120, 144} + if !reflect.DeepEqual(got, want) { + t.Errorf("linear buckets: got %v, want %v", got, want) + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/http.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/http.go new file mode 100644 index 0000000..67ee5ac --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/http.go @@ -0,0 +1,490 @@ +// Copyright 2014 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 prometheus + +import ( + "bufio" + "bytes" + "compress/gzip" + "fmt" + "io" + "net" + "net/http" + "strconv" + "strings" + "sync" + "time" + + "github.com/prometheus/common/expfmt" +) + +// TODO(beorn7): Remove this whole file. It is a partial mirror of +// promhttp/http.go (to avoid circular import chains) where everything HTTP +// related should live. The functions here are just for avoiding +// breakage. Everything is deprecated. + +const ( + contentTypeHeader = "Content-Type" + contentLengthHeader = "Content-Length" + contentEncodingHeader = "Content-Encoding" + acceptEncodingHeader = "Accept-Encoding" +) + +var bufPool sync.Pool + +func getBuf() *bytes.Buffer { + buf := bufPool.Get() + if buf == nil { + return &bytes.Buffer{} + } + return buf.(*bytes.Buffer) +} + +func giveBuf(buf *bytes.Buffer) { + buf.Reset() + bufPool.Put(buf) +} + +// Handler returns an HTTP handler for the DefaultGatherer. It is +// already instrumented with InstrumentHandler (using "prometheus" as handler +// name). +// +// Deprecated: Please note the issues described in the doc comment of +// InstrumentHandler. You might want to consider using promhttp.Handler instead +// (which is non instrumented). +func Handler() http.Handler { + return InstrumentHandler("prometheus", UninstrumentedHandler()) +} + +// UninstrumentedHandler returns an HTTP handler for the DefaultGatherer. +// +// Deprecated: Use promhttp.Handler instead. See there for further documentation. +func UninstrumentedHandler() http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + mfs, err := DefaultGatherer.Gather() + if err != nil { + http.Error(w, "An error has occurred during metrics collection:\n\n"+err.Error(), http.StatusInternalServerError) + return + } + + contentType := expfmt.Negotiate(req.Header) + buf := getBuf() + defer giveBuf(buf) + writer, encoding := decorateWriter(req, buf) + enc := expfmt.NewEncoder(writer, contentType) + var lastErr error + for _, mf := range mfs { + if err := enc.Encode(mf); err != nil { + lastErr = err + http.Error(w, "An error has occurred during metrics encoding:\n\n"+err.Error(), http.StatusInternalServerError) + return + } + } + if closer, ok := writer.(io.Closer); ok { + closer.Close() + } + if lastErr != nil && buf.Len() == 0 { + http.Error(w, "No metrics encoded, last error:\n\n"+err.Error(), http.StatusInternalServerError) + return + } + header := w.Header() + header.Set(contentTypeHeader, string(contentType)) + header.Set(contentLengthHeader, fmt.Sprint(buf.Len())) + if encoding != "" { + header.Set(contentEncodingHeader, encoding) + } + w.Write(buf.Bytes()) + }) +} + +// decorateWriter wraps a writer to handle gzip compression if requested. It +// returns the decorated writer and the appropriate "Content-Encoding" header +// (which is empty if no compression is enabled). +func decorateWriter(request *http.Request, writer io.Writer) (io.Writer, string) { + header := request.Header.Get(acceptEncodingHeader) + parts := strings.Split(header, ",") + for _, part := range parts { + part := strings.TrimSpace(part) + if part == "gzip" || strings.HasPrefix(part, "gzip;") { + return gzip.NewWriter(writer), "gzip" + } + } + return writer, "" +} + +var instLabels = []string{"method", "code"} + +type nower interface { + Now() time.Time +} + +type nowFunc func() time.Time + +func (n nowFunc) Now() time.Time { + return n() +} + +var now nower = nowFunc(func() time.Time { + return time.Now() +}) + +func nowSeries(t ...time.Time) nower { + return nowFunc(func() time.Time { + defer func() { + t = t[1:] + }() + + return t[0] + }) +} + +// InstrumentHandler wraps the given HTTP handler for instrumentation. It +// registers four metric collectors (if not already done) and reports HTTP +// metrics to the (newly or already) registered collectors: http_requests_total +// (CounterVec), http_request_duration_microseconds (Summary), +// http_request_size_bytes (Summary), http_response_size_bytes (Summary). Each +// has a constant label named "handler" with the provided handlerName as +// value. http_requests_total is a metric vector partitioned by HTTP method +// (label name "method") and HTTP status code (label name "code"). +// +// Deprecated: InstrumentHandler has several issues: +// +// - It uses Summaries rather than Histograms. Summaries are not useful if +// aggregation across multiple instances is required. +// +// - It uses microseconds as unit, which is deprecated and should be replaced by +// seconds. +// +// - The size of the request is calculated in a separate goroutine. Since this +// calculator requires access to the request header, it creates a race with +// any writes to the header performed during request handling. +// httputil.ReverseProxy is a prominent example for a handler +// performing such writes. +// +// Upcoming versions of this package will provide ways of instrumenting HTTP +// handlers that are more flexible and have fewer issues. Please prefer direct +// instrumentation in the meantime. +func InstrumentHandler(handlerName string, handler http.Handler) http.HandlerFunc { + return InstrumentHandlerFunc(handlerName, handler.ServeHTTP) +} + +// InstrumentHandlerFunc wraps the given function for instrumentation. It +// otherwise works in the same way as InstrumentHandler (and shares the same +// issues). +// +// Deprecated: InstrumentHandlerFunc is deprecated for the same reasons as +// InstrumentHandler is. +func InstrumentHandlerFunc(handlerName string, handlerFunc func(http.ResponseWriter, *http.Request)) http.HandlerFunc { + return InstrumentHandlerFuncWithOpts( + SummaryOpts{ + Subsystem: "http", + ConstLabels: Labels{"handler": handlerName}, + }, + handlerFunc, + ) +} + +// InstrumentHandlerWithOpts works like InstrumentHandler (and shares the same +// issues) but provides more flexibility (at the cost of a more complex call +// syntax). As InstrumentHandler, this function registers four metric +// collectors, but it uses the provided SummaryOpts to create them. However, the +// fields "Name" and "Help" in the SummaryOpts are ignored. "Name" is replaced +// by "requests_total", "request_duration_microseconds", "request_size_bytes", +// and "response_size_bytes", respectively. "Help" is replaced by an appropriate +// help string. The names of the variable labels of the http_requests_total +// CounterVec are "method" (get, post, etc.), and "code" (HTTP status code). +// +// If InstrumentHandlerWithOpts is called as follows, it mimics exactly the +// behavior of InstrumentHandler: +// +// prometheus.InstrumentHandlerWithOpts( +// prometheus.SummaryOpts{ +// Subsystem: "http", +// ConstLabels: prometheus.Labels{"handler": handlerName}, +// }, +// handler, +// ) +// +// Technical detail: "requests_total" is a CounterVec, not a SummaryVec, so it +// cannot use SummaryOpts. Instead, a CounterOpts struct is created internally, +// and all its fields are set to the equally named fields in the provided +// SummaryOpts. +// +// Deprecated: InstrumentHandlerWithOpts is deprecated for the same reasons as +// InstrumentHandler is. +func InstrumentHandlerWithOpts(opts SummaryOpts, handler http.Handler) http.HandlerFunc { + return InstrumentHandlerFuncWithOpts(opts, handler.ServeHTTP) +} + +// InstrumentHandlerFuncWithOpts works like InstrumentHandlerFunc (and shares +// the same issues) but provides more flexibility (at the cost of a more complex +// call syntax). See InstrumentHandlerWithOpts for details how the provided +// SummaryOpts are used. +// +// Deprecated: InstrumentHandlerFuncWithOpts is deprecated for the same reasons +// as InstrumentHandler is. +func InstrumentHandlerFuncWithOpts(opts SummaryOpts, handlerFunc func(http.ResponseWriter, *http.Request)) http.HandlerFunc { + reqCnt := NewCounterVec( + CounterOpts{ + Namespace: opts.Namespace, + Subsystem: opts.Subsystem, + Name: "requests_total", + Help: "Total number of HTTP requests made.", + ConstLabels: opts.ConstLabels, + }, + instLabels, + ) + + opts.Name = "request_duration_microseconds" + opts.Help = "The HTTP request latencies in microseconds." + reqDur := NewSummary(opts) + + opts.Name = "request_size_bytes" + opts.Help = "The HTTP request sizes in bytes." + reqSz := NewSummary(opts) + + opts.Name = "response_size_bytes" + opts.Help = "The HTTP response sizes in bytes." + resSz := NewSummary(opts) + + regReqCnt := MustRegisterOrGet(reqCnt).(*CounterVec) + regReqDur := MustRegisterOrGet(reqDur).(Summary) + regReqSz := MustRegisterOrGet(reqSz).(Summary) + regResSz := MustRegisterOrGet(resSz).(Summary) + + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + now := time.Now() + + delegate := &responseWriterDelegator{ResponseWriter: w} + out := make(chan int) + urlLen := 0 + if r.URL != nil { + urlLen = len(r.URL.String()) + } + go computeApproximateRequestSize(r, out, urlLen) + + _, cn := w.(http.CloseNotifier) + _, fl := w.(http.Flusher) + _, hj := w.(http.Hijacker) + _, rf := w.(io.ReaderFrom) + var rw http.ResponseWriter + if cn && fl && hj && rf { + rw = &fancyResponseWriterDelegator{delegate} + } else { + rw = delegate + } + handlerFunc(rw, r) + + elapsed := float64(time.Since(now)) / float64(time.Microsecond) + + method := sanitizeMethod(r.Method) + code := sanitizeCode(delegate.status) + regReqCnt.WithLabelValues(method, code).Inc() + regReqDur.Observe(elapsed) + regResSz.Observe(float64(delegate.written)) + regReqSz.Observe(float64(<-out)) + }) +} + +func computeApproximateRequestSize(r *http.Request, out chan int, s int) { + s += len(r.Method) + s += len(r.Proto) + for name, values := range r.Header { + s += len(name) + for _, value := range values { + s += len(value) + } + } + s += len(r.Host) + + // N.B. r.Form and r.MultipartForm are assumed to be included in r.URL. + + if r.ContentLength != -1 { + s += int(r.ContentLength) + } + out <- s +} + +type responseWriterDelegator struct { + http.ResponseWriter + + handler, method string + status int + written int64 + wroteHeader bool +} + +func (r *responseWriterDelegator) WriteHeader(code int) { + r.status = code + r.wroteHeader = true + r.ResponseWriter.WriteHeader(code) +} + +func (r *responseWriterDelegator) Write(b []byte) (int, error) { + if !r.wroteHeader { + r.WriteHeader(http.StatusOK) + } + n, err := r.ResponseWriter.Write(b) + r.written += int64(n) + return n, err +} + +type fancyResponseWriterDelegator struct { + *responseWriterDelegator +} + +func (f *fancyResponseWriterDelegator) CloseNotify() <-chan bool { + return f.ResponseWriter.(http.CloseNotifier).CloseNotify() +} + +func (f *fancyResponseWriterDelegator) Flush() { + f.ResponseWriter.(http.Flusher).Flush() +} + +func (f *fancyResponseWriterDelegator) Hijack() (net.Conn, *bufio.ReadWriter, error) { + return f.ResponseWriter.(http.Hijacker).Hijack() +} + +func (f *fancyResponseWriterDelegator) ReadFrom(r io.Reader) (int64, error) { + if !f.wroteHeader { + f.WriteHeader(http.StatusOK) + } + n, err := f.ResponseWriter.(io.ReaderFrom).ReadFrom(r) + f.written += n + return n, err +} + +func sanitizeMethod(m string) string { + switch m { + case "GET", "get": + return "get" + case "PUT", "put": + return "put" + case "HEAD", "head": + return "head" + case "POST", "post": + return "post" + case "DELETE", "delete": + return "delete" + case "CONNECT", "connect": + return "connect" + case "OPTIONS", "options": + return "options" + case "NOTIFY", "notify": + return "notify" + default: + return strings.ToLower(m) + } +} + +func sanitizeCode(s int) string { + switch s { + case 100: + return "100" + case 101: + return "101" + + case 200: + return "200" + case 201: + return "201" + case 202: + return "202" + case 203: + return "203" + case 204: + return "204" + case 205: + return "205" + case 206: + return "206" + + case 300: + return "300" + case 301: + return "301" + case 302: + return "302" + case 304: + return "304" + case 305: + return "305" + case 307: + return "307" + + case 400: + return "400" + case 401: + return "401" + case 402: + return "402" + case 403: + return "403" + case 404: + return "404" + case 405: + return "405" + case 406: + return "406" + case 407: + return "407" + case 408: + return "408" + case 409: + return "409" + case 410: + return "410" + case 411: + return "411" + case 412: + return "412" + case 413: + return "413" + case 414: + return "414" + case 415: + return "415" + case 416: + return "416" + case 417: + return "417" + case 418: + return "418" + + case 500: + return "500" + case 501: + return "501" + case 502: + return "502" + case 503: + return "503" + case 504: + return "504" + case 505: + return "505" + + case 428: + return "428" + case 429: + return "429" + case 431: + return "431" + case 511: + return "511" + + default: + return strconv.Itoa(s) + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/http_test.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/http_test.go new file mode 100644 index 0000000..ffe0418 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/http_test.go @@ -0,0 +1,121 @@ +// Copyright 2014 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 prometheus + +import ( + "net/http" + "net/http/httptest" + "testing" + "time" + + dto "github.com/prometheus/client_model/go" +) + +type respBody string + +func (b respBody) ServeHTTP(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusTeapot) + w.Write([]byte(b)) +} + +func TestInstrumentHandler(t *testing.T) { + defer func(n nower) { + now = n.(nower) + }(now) + + instant := time.Now() + end := instant.Add(30 * time.Second) + now = nowSeries(instant, end) + respBody := respBody("Howdy there!") + + hndlr := InstrumentHandler("test-handler", respBody) + + opts := SummaryOpts{ + Subsystem: "http", + ConstLabels: Labels{"handler": "test-handler"}, + } + + reqCnt := MustRegisterOrGet(NewCounterVec( + CounterOpts{ + Namespace: opts.Namespace, + Subsystem: opts.Subsystem, + Name: "requests_total", + Help: "Total number of HTTP requests made.", + ConstLabels: opts.ConstLabels, + }, + instLabels, + )).(*CounterVec) + + opts.Name = "request_duration_microseconds" + opts.Help = "The HTTP request latencies in microseconds." + reqDur := MustRegisterOrGet(NewSummary(opts)).(Summary) + + opts.Name = "request_size_bytes" + opts.Help = "The HTTP request sizes in bytes." + MustRegisterOrGet(NewSummary(opts)) + + opts.Name = "response_size_bytes" + opts.Help = "The HTTP response sizes in bytes." + MustRegisterOrGet(NewSummary(opts)) + + reqCnt.Reset() + + resp := httptest.NewRecorder() + req := &http.Request{ + Method: "GET", + } + + hndlr.ServeHTTP(resp, req) + + if resp.Code != http.StatusTeapot { + t.Fatalf("expected status %d, got %d", http.StatusTeapot, resp.Code) + } + if string(resp.Body.Bytes()) != "Howdy there!" { + t.Fatalf("expected body %s, got %s", "Howdy there!", string(resp.Body.Bytes())) + } + + out := &dto.Metric{} + reqDur.Write(out) + if want, got := "test-handler", out.Label[0].GetValue(); want != got { + t.Errorf("want label value %q in reqDur, got %q", want, got) + } + if want, got := uint64(1), out.Summary.GetSampleCount(); want != got { + t.Errorf("want sample count %d in reqDur, got %d", want, got) + } + + out.Reset() + if want, got := 1, len(reqCnt.children); want != got { + t.Errorf("want %d children in reqCnt, got %d", want, got) + } + cnt, err := reqCnt.GetMetricWithLabelValues("get", "418") + if err != nil { + t.Fatal(err) + } + cnt.Write(out) + if want, got := "418", out.Label[0].GetValue(); want != got { + t.Errorf("want label value %q in reqCnt, got %q", want, got) + } + if want, got := "test-handler", out.Label[1].GetValue(); want != got { + t.Errorf("want label value %q in reqCnt, got %q", want, got) + } + if want, got := "get", out.Label[2].GetValue(); want != got { + t.Errorf("want label value %q in reqCnt, got %q", want, got) + } + if out.Counter == nil { + t.Fatal("expected non-nil counter in reqCnt") + } + if want, got := 1., out.Counter.GetValue(); want != got { + t.Errorf("want reqCnt of %f, got %f", want, got) + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/metric.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/metric.go new file mode 100644 index 0000000..d4063d9 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/metric.go @@ -0,0 +1,166 @@ +// Copyright 2014 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 prometheus + +import ( + "strings" + + dto "github.com/prometheus/client_model/go" +) + +const separatorByte byte = 255 + +// A Metric models a single sample value with its meta data being exported to +// Prometheus. Implementations of Metric in this package are Gauge, Counter, +// Histogram, Summary, and Untyped. +type Metric interface { + // Desc returns the descriptor for the Metric. This method idempotently + // returns the same descriptor throughout the lifetime of the + // Metric. The returned descriptor is immutable by contract. A Metric + // unable to describe itself must return an invalid descriptor (created + // with NewInvalidDesc). + Desc() *Desc + // Write encodes the Metric into a "Metric" Protocol Buffer data + // transmission object. + // + // Metric implementations must observe concurrency safety as reads of + // this metric may occur at any time, and any blocking occurs at the + // expense of total performance of rendering all registered + // metrics. Ideally, Metric implementations should support concurrent + // readers. + // + // While populating dto.Metric, it is the responsibility of the + // implementation to ensure validity of the Metric protobuf (like valid + // UTF-8 strings or syntactically valid metric and label names). It is + // recommended to sort labels lexicographically. (Implementers may find + // LabelPairSorter useful for that.) Callers of Write should still make + // sure of sorting if they depend on it. + Write(*dto.Metric) error + // TODO(beorn7): The original rationale of passing in a pre-allocated + // dto.Metric protobuf to save allocations has disappeared. The + // signature of this method should be changed to "Write() (*dto.Metric, + // error)". +} + +// Opts bundles the options for creating most Metric types. Each metric +// implementation XXX has its own XXXOpts type, but in most cases, it is just be +// an alias of this type (which might change when the requirement arises.) +// +// It is mandatory to set Name and Help to a non-empty string. All other fields +// are optional and can safely be left at their zero value. +type Opts struct { + // Namespace, Subsystem, and Name are components of the fully-qualified + // name of the Metric (created by joining these components with + // "_"). Only Name is mandatory, the others merely help structuring the + // name. Note that the fully-qualified name of the metric must be a + // valid Prometheus metric name. + Namespace string + Subsystem string + Name string + + // Help provides information about this metric. Mandatory! + // + // Metrics with the same fully-qualified name must have the same Help + // string. + Help string + + // ConstLabels are used to attach fixed labels to this metric. Metrics + // with the same fully-qualified name must have the same label names in + // their ConstLabels. + // + // Note that in most cases, labels have a value that varies during the + // lifetime of a process. Those labels are usually managed with a metric + // vector collector (like CounterVec, GaugeVec, UntypedVec). ConstLabels + // serve only special purposes. One is for the special case where the + // value of a label does not change during the lifetime of a process, + // e.g. if the revision of the running binary is put into a + // label. Another, more advanced purpose is if more than one Collector + // needs to collect Metrics with the same fully-qualified name. In that + // case, those Metrics must differ in the values of their + // ConstLabels. See the Collector examples. + // + // If the value of a label never changes (not even between binaries), + // that label most likely should not be a label at all (but part of the + // metric name). + ConstLabels Labels +} + +// BuildFQName joins the given three name components by "_". Empty name +// components are ignored. If the name parameter itself is empty, an empty +// string is returned, no matter what. Metric implementations included in this +// library use this function internally to generate the fully-qualified metric +// name from the name component in their Opts. Users of the library will only +// need this function if they implement their own Metric or instantiate a Desc +// (with NewDesc) directly. +func BuildFQName(namespace, subsystem, name string) string { + if name == "" { + return "" + } + switch { + case namespace != "" && subsystem != "": + return strings.Join([]string{namespace, subsystem, name}, "_") + case namespace != "": + return strings.Join([]string{namespace, name}, "_") + case subsystem != "": + return strings.Join([]string{subsystem, name}, "_") + } + return name +} + +// LabelPairSorter implements sort.Interface. It is used to sort a slice of +// dto.LabelPair pointers. This is useful for implementing the Write method of +// custom metrics. +type LabelPairSorter []*dto.LabelPair + +func (s LabelPairSorter) Len() int { + return len(s) +} + +func (s LabelPairSorter) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s LabelPairSorter) Less(i, j int) bool { + return s[i].GetName() < s[j].GetName() +} + +type hashSorter []uint64 + +func (s hashSorter) Len() int { + return len(s) +} + +func (s hashSorter) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s hashSorter) Less(i, j int) bool { + return s[i] < s[j] +} + +type invalidMetric struct { + desc *Desc + err error +} + +// NewInvalidMetric returns a metric whose Write method always returns the +// provided error. It is useful if a Collector finds itself unable to collect +// a metric and wishes to report an error to the registry. +func NewInvalidMetric(desc *Desc, err error) Metric { + return &invalidMetric{desc, err} +} + +func (m *invalidMetric) Desc() *Desc { return m.desc } + +func (m *invalidMetric) Write(*dto.Metric) error { return m.err } diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/metric_test.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/metric_test.go new file mode 100644 index 0000000..7145f5e --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/metric_test.go @@ -0,0 +1,35 @@ +// Copyright 2014 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 prometheus + +import "testing" + +func TestBuildFQName(t *testing.T) { + scenarios := []struct{ namespace, subsystem, name, result string }{ + {"a", "b", "c", "a_b_c"}, + {"", "b", "c", "b_c"}, + {"a", "", "c", "a_c"}, + {"", "", "c", "c"}, + {"a", "b", "", ""}, + {"a", "", "", ""}, + {"", "b", "", ""}, + {" ", "", "", ""}, + } + + for i, s := range scenarios { + if want, got := s.result, BuildFQName(s.namespace, s.subsystem, s.name); want != got { + t.Errorf("%d. want %s, got %s", i, want, got) + } + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/process_collector.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/process_collector.go new file mode 100644 index 0000000..e31e62e --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/process_collector.go @@ -0,0 +1,142 @@ +// Copyright 2015 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 prometheus + +import "github.com/prometheus/procfs" + +type processCollector struct { + pid int + collectFn func(chan<- Metric) + pidFn func() (int, error) + cpuTotal Counter + openFDs, maxFDs Gauge + vsize, rss Gauge + startTime Gauge +} + +// NewProcessCollector returns a collector which exports the current state of +// process metrics including cpu, memory and file descriptor usage as well as +// the process start time for the given process id under the given namespace. +func NewProcessCollector(pid int, namespace string) Collector { + return NewProcessCollectorPIDFn( + func() (int, error) { return pid, nil }, + namespace, + ) +} + +// NewProcessCollectorPIDFn returns a collector which exports the current state +// of process metrics including cpu, memory and file descriptor usage as well +// as the process start time under the given namespace. The given pidFn is +// called on each collect and is used to determine the process to export +// metrics for. +func NewProcessCollectorPIDFn( + pidFn func() (int, error), + namespace string, +) Collector { + c := processCollector{ + pidFn: pidFn, + collectFn: func(chan<- Metric) {}, + + cpuTotal: NewCounter(CounterOpts{ + Namespace: namespace, + Name: "process_cpu_seconds_total", + Help: "Total user and system CPU time spent in seconds.", + }), + openFDs: NewGauge(GaugeOpts{ + Namespace: namespace, + Name: "process_open_fds", + Help: "Number of open file descriptors.", + }), + maxFDs: NewGauge(GaugeOpts{ + Namespace: namespace, + Name: "process_max_fds", + Help: "Maximum number of open file descriptors.", + }), + vsize: NewGauge(GaugeOpts{ + Namespace: namespace, + Name: "process_virtual_memory_bytes", + Help: "Virtual memory size in bytes.", + }), + rss: NewGauge(GaugeOpts{ + Namespace: namespace, + Name: "process_resident_memory_bytes", + Help: "Resident memory size in bytes.", + }), + startTime: NewGauge(GaugeOpts{ + Namespace: namespace, + Name: "process_start_time_seconds", + Help: "Start time of the process since unix epoch in seconds.", + }), + } + + // Set up process metric collection if supported by the runtime. + if _, err := procfs.NewStat(); err == nil { + c.collectFn = c.processCollect + } + + return &c +} + +// Describe returns all descriptions of the collector. +func (c *processCollector) Describe(ch chan<- *Desc) { + ch <- c.cpuTotal.Desc() + ch <- c.openFDs.Desc() + ch <- c.maxFDs.Desc() + ch <- c.vsize.Desc() + ch <- c.rss.Desc() + ch <- c.startTime.Desc() +} + +// Collect returns the current state of all metrics of the collector. +func (c *processCollector) Collect(ch chan<- Metric) { + c.collectFn(ch) +} + +// TODO(ts): Bring back error reporting by reverting 7faf9e7 as soon as the +// client allows users to configure the error behavior. +func (c *processCollector) processCollect(ch chan<- Metric) { + pid, err := c.pidFn() + if err != nil { + return + } + + p, err := procfs.NewProc(pid) + if err != nil { + return + } + + if stat, err := p.NewStat(); err == nil { + c.cpuTotal.Set(stat.CPUTime()) + ch <- c.cpuTotal + c.vsize.Set(float64(stat.VirtualMemory())) + ch <- c.vsize + c.rss.Set(float64(stat.ResidentMemory())) + ch <- c.rss + + if startTime, err := stat.StartTime(); err == nil { + c.startTime.Set(startTime) + ch <- c.startTime + } + } + + if fds, err := p.FileDescriptorsLen(); err == nil { + c.openFDs.Set(float64(fds)) + ch <- c.openFDs + } + + if limits, err := p.NewLimits(); err == nil { + c.maxFDs.Set(float64(limits.OpenFiles)) + ch <- c.maxFDs + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/process_collector_test.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/process_collector_test.go new file mode 100644 index 0000000..d3362da --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/process_collector_test.go @@ -0,0 +1,58 @@ +package prometheus + +import ( + "bytes" + "os" + "regexp" + "testing" + + "github.com/prometheus/common/expfmt" + "github.com/prometheus/procfs" +) + +func TestProcessCollector(t *testing.T) { + if _, err := procfs.Self(); err != nil { + t.Skipf("skipping TestProcessCollector, procfs not available: %s", err) + } + + registry := NewRegistry() + if err := registry.Register(NewProcessCollector(os.Getpid(), "")); err != nil { + t.Fatal(err) + } + if err := registry.Register(NewProcessCollectorPIDFn( + func() (int, error) { return os.Getpid(), nil }, "foobar"), + ); err != nil { + t.Fatal(err) + } + + mfs, err := registry.Gather() + if err != nil { + t.Fatal(err) + } + + var buf bytes.Buffer + for _, mf := range mfs { + if _, err := expfmt.MetricFamilyToText(&buf, mf); err != nil { + t.Fatal(err) + } + } + + for _, re := range []*regexp.Regexp{ + regexp.MustCompile("process_cpu_seconds_total [0-9]"), + regexp.MustCompile("process_max_fds [1-9]"), + regexp.MustCompile("process_open_fds [1-9]"), + regexp.MustCompile("process_virtual_memory_bytes [1-9]"), + regexp.MustCompile("process_resident_memory_bytes [1-9]"), + regexp.MustCompile("process_start_time_seconds [0-9.]{10,}"), + regexp.MustCompile("foobar_process_cpu_seconds_total [0-9]"), + regexp.MustCompile("foobar_process_max_fds [1-9]"), + regexp.MustCompile("foobar_process_open_fds [1-9]"), + regexp.MustCompile("foobar_process_virtual_memory_bytes [1-9]"), + regexp.MustCompile("foobar_process_resident_memory_bytes [1-9]"), + regexp.MustCompile("foobar_process_start_time_seconds [0-9.]{10,}"), + } { + if !re.Match(buf.Bytes()) { + t.Errorf("want body to match %s\n%s", re, buf.String()) + } + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go new file mode 100644 index 0000000..b6dd5a2 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go @@ -0,0 +1,201 @@ +// Copyright 2016 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. + +// Copyright (c) 2013, The Prometheus 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 promhttp contains functions to create http.Handler instances to +// expose Prometheus metrics via HTTP. In later versions of this package, it +// will also contain tooling to instrument instances of http.Handler and +// http.RoundTripper. +// +// promhttp.Handler acts on the prometheus.DefaultGatherer. With HandlerFor, +// you can create a handler for a custom registry or anything that implements +// the Gatherer interface. It also allows to create handlers that act +// differently on errors or allow to log errors. +package promhttp + +import ( + "bytes" + "compress/gzip" + "fmt" + "io" + "net/http" + "strings" + "sync" + + "github.com/prometheus/common/expfmt" + + "github.com/prometheus/client_golang/prometheus" +) + +const ( + contentTypeHeader = "Content-Type" + contentLengthHeader = "Content-Length" + contentEncodingHeader = "Content-Encoding" + acceptEncodingHeader = "Accept-Encoding" +) + +var bufPool sync.Pool + +func getBuf() *bytes.Buffer { + buf := bufPool.Get() + if buf == nil { + return &bytes.Buffer{} + } + return buf.(*bytes.Buffer) +} + +func giveBuf(buf *bytes.Buffer) { + buf.Reset() + bufPool.Put(buf) +} + +// Handler returns an HTTP handler for the prometheus.DefaultGatherer. The +// Handler uses the default HandlerOpts, i.e. report the first error as an HTTP +// error, no error logging, and compression if requested by the client. +// +// If you want to create a Handler for the DefaultGatherer with different +// HandlerOpts, create it with HandlerFor with prometheus.DefaultGatherer and +// your desired HandlerOpts. +func Handler() http.Handler { + return HandlerFor(prometheus.DefaultGatherer, HandlerOpts{}) +} + +// HandlerFor returns an http.Handler for the provided Gatherer. The behavior +// of the Handler is defined by the provided HandlerOpts. +func HandlerFor(reg prometheus.Gatherer, opts HandlerOpts) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + mfs, err := reg.Gather() + if err != nil { + if opts.ErrorLog != nil { + opts.ErrorLog.Println("error gathering metrics:", err) + } + switch opts.ErrorHandling { + case PanicOnError: + panic(err) + case ContinueOnError: + if len(mfs) == 0 { + http.Error(w, "No metrics gathered, last error:\n\n"+err.Error(), http.StatusInternalServerError) + return + } + case HTTPErrorOnError: + http.Error(w, "An error has occurred during metrics gathering:\n\n"+err.Error(), http.StatusInternalServerError) + return + } + } + + contentType := expfmt.Negotiate(req.Header) + buf := getBuf() + defer giveBuf(buf) + writer, encoding := decorateWriter(req, buf, opts.DisableCompression) + enc := expfmt.NewEncoder(writer, contentType) + var lastErr error + for _, mf := range mfs { + if err := enc.Encode(mf); err != nil { + lastErr = err + if opts.ErrorLog != nil { + opts.ErrorLog.Println("error encoding metric family:", err) + } + switch opts.ErrorHandling { + case PanicOnError: + panic(err) + case ContinueOnError: + // Handled later. + case HTTPErrorOnError: + http.Error(w, "An error has occurred during metrics encoding:\n\n"+err.Error(), http.StatusInternalServerError) + return + } + } + } + if closer, ok := writer.(io.Closer); ok { + closer.Close() + } + if lastErr != nil && buf.Len() == 0 { + http.Error(w, "No metrics encoded, last error:\n\n"+err.Error(), http.StatusInternalServerError) + return + } + header := w.Header() + header.Set(contentTypeHeader, string(contentType)) + header.Set(contentLengthHeader, fmt.Sprint(buf.Len())) + if encoding != "" { + header.Set(contentEncodingHeader, encoding) + } + w.Write(buf.Bytes()) + // TODO(beorn7): Consider streaming serving of metrics. + }) +} + +// HandlerErrorHandling defines how a Handler serving metrics will handle +// errors. +type HandlerErrorHandling int + +// These constants cause handlers serving metrics to behave as described if +// errors are encountered. +const ( + // Serve an HTTP status code 500 upon the first error + // encountered. Report the error message in the body. + HTTPErrorOnError HandlerErrorHandling = iota + // Ignore errors and try to serve as many metrics as possible. However, + // if no metrics can be served, serve an HTTP status code 500 and the + // last error message in the body. Only use this in deliberate "best + // effort" metrics collection scenarios. It is recommended to at least + // log errors (by providing an ErrorLog in HandlerOpts) to not mask + // errors completely. + ContinueOnError + // Panic upon the first error encountered (useful for "crash only" apps). + PanicOnError +) + +// Logger is the minimal interface HandlerOpts needs for logging. Note that +// log.Logger from the standard library implements this interface, and it is +// easy to implement by custom loggers, if they don't do so already anyway. +type Logger interface { + Println(v ...interface{}) +} + +// HandlerOpts specifies options how to serve metrics via an http.Handler. The +// zero value of HandlerOpts is a reasonable default. +type HandlerOpts struct { + // ErrorLog specifies an optional logger for errors collecting and + // serving metrics. If nil, errors are not logged at all. + ErrorLog Logger + // ErrorHandling defines how errors are handled. Note that errors are + // logged regardless of the configured ErrorHandling provided ErrorLog + // is not nil. + ErrorHandling HandlerErrorHandling + // If DisableCompression is true, the handler will never compress the + // response, even if requested by the client. + DisableCompression bool +} + +// decorateWriter wraps a writer to handle gzip compression if requested. It +// returns the decorated writer and the appropriate "Content-Encoding" header +// (which is empty if no compression is enabled). +func decorateWriter(request *http.Request, writer io.Writer, compressionDisabled bool) (io.Writer, string) { + if compressionDisabled { + return writer, "" + } + header := request.Header.Get(acceptEncodingHeader) + parts := strings.Split(header, ",") + for _, part := range parts { + part := strings.TrimSpace(part) + if part == "gzip" || strings.HasPrefix(part, "gzip;") { + return gzip.NewWriter(writer), "gzip" + } + } + return writer, "" +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http_test.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http_test.go new file mode 100644 index 0000000..d4a7d4a --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http_test.go @@ -0,0 +1,137 @@ +// Copyright 2016 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. + +// Copyright (c) 2013, The Prometheus 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 promhttp + +import ( + "bytes" + "errors" + "log" + "net/http" + "net/http/httptest" + "testing" + + "github.com/prometheus/client_golang/prometheus" +) + +type errorCollector struct{} + +func (e errorCollector) Describe(ch chan<- *prometheus.Desc) { + ch <- prometheus.NewDesc("invalid_metric", "not helpful", nil, nil) +} + +func (e errorCollector) Collect(ch chan<- prometheus.Metric) { + ch <- prometheus.NewInvalidMetric( + prometheus.NewDesc("invalid_metric", "not helpful", nil, nil), + errors.New("collect error"), + ) +} + +func TestHandlerErrorHandling(t *testing.T) { + + // Create a registry that collects a MetricFamily with two elements, + // another with one, and reports an error. + reg := prometheus.NewRegistry() + + cnt := prometheus.NewCounter(prometheus.CounterOpts{ + Name: "the_count", + Help: "Ah-ah-ah! Thunder and lightning!", + }) + reg.MustRegister(cnt) + + cntVec := prometheus.NewCounterVec( + prometheus.CounterOpts{ + Name: "name", + Help: "docstring", + ConstLabels: prometheus.Labels{"constname": "constvalue"}, + }, + []string{"labelname"}, + ) + cntVec.WithLabelValues("val1").Inc() + cntVec.WithLabelValues("val2").Inc() + reg.MustRegister(cntVec) + + reg.MustRegister(errorCollector{}) + + logBuf := &bytes.Buffer{} + logger := log.New(logBuf, "", 0) + + writer := httptest.NewRecorder() + request, _ := http.NewRequest("GET", "/", nil) + request.Header.Add("Accept", "test/plain") + + errorHandler := HandlerFor(reg, HandlerOpts{ + ErrorLog: logger, + ErrorHandling: HTTPErrorOnError, + }) + continueHandler := HandlerFor(reg, HandlerOpts{ + ErrorLog: logger, + ErrorHandling: ContinueOnError, + }) + panicHandler := HandlerFor(reg, HandlerOpts{ + ErrorLog: logger, + ErrorHandling: PanicOnError, + }) + wantMsg := `error gathering metrics: error collecting metric Desc{fqName: "invalid_metric", help: "not helpful", constLabels: {}, variableLabels: []}: collect error +` + wantErrorBody := `An error has occurred during metrics gathering: + +error collecting metric Desc{fqName: "invalid_metric", help: "not helpful", constLabels: {}, variableLabels: []}: collect error +` + wantOKBody := `# HELP name docstring +# TYPE name counter +name{constname="constvalue",labelname="val1"} 1 +name{constname="constvalue",labelname="val2"} 1 +# HELP the_count Ah-ah-ah! Thunder and lightning! +# TYPE the_count counter +the_count 0 +` + + errorHandler.ServeHTTP(writer, request) + if got, want := writer.Code, http.StatusInternalServerError; got != want { + t.Errorf("got HTTP status code %d, want %d", got, want) + } + if got := logBuf.String(); got != wantMsg { + t.Errorf("got log message:\n%s\nwant log mesage:\n%s\n", got, wantMsg) + } + if got := writer.Body.String(); got != wantErrorBody { + t.Errorf("got body:\n%s\nwant body:\n%s\n", got, wantErrorBody) + } + logBuf.Reset() + writer.Body.Reset() + writer.Code = http.StatusOK + + continueHandler.ServeHTTP(writer, request) + if got, want := writer.Code, http.StatusOK; got != want { + t.Errorf("got HTTP status code %d, want %d", got, want) + } + if got := logBuf.String(); got != wantMsg { + t.Errorf("got log message %q, want %q", got, wantMsg) + } + if got := writer.Body.String(); got != wantOKBody { + t.Errorf("got body %q, want %q", got, wantOKBody) + } + + defer func() { + if err := recover(); err == nil { + t.Error("expected panic from panicHandler") + } + }() + panicHandler.ServeHTTP(writer, request) +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/push/examples_test.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/push/examples_test.go new file mode 100644 index 0000000..7f17ca2 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/push/examples_test.go @@ -0,0 +1,56 @@ +// Copyright 2016 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 push_test + +import ( + "fmt" + "time" + + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/push" +) + +func ExampleCollectors() { + completionTime := prometheus.NewGauge(prometheus.GaugeOpts{ + Name: "db_backup_last_completion_timestamp_seconds", + Help: "The timestamp of the last succesful completion of a DB backup.", + }) + completionTime.Set(float64(time.Now().Unix())) + if err := push.Collectors( + "db_backup", push.HostnameGroupingKey(), + "http://pushgateway:9091", + completionTime, + ); err != nil { + fmt.Println("Could not push completion time to Pushgateway:", err) + } +} + +func ExampleRegistry() { + registry := prometheus.NewRegistry() + + completionTime := prometheus.NewGauge(prometheus.GaugeOpts{ + Name: "db_backup_last_completion_timestamp_seconds", + Help: "The timestamp of the last succesful completion of a DB backup.", + }) + registry.MustRegister(completionTime) + + completionTime.Set(float64(time.Now().Unix())) + if err := push.FromGatherer( + "db_backup", push.HostnameGroupingKey(), + "http://pushgateway:9091", + registry, + ); err != nil { + fmt.Println("Could not push completion time to Pushgateway:", err) + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/push/push.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/push/push.go new file mode 100644 index 0000000..ae40402 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/push/push.go @@ -0,0 +1,172 @@ +// Copyright 2015 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. + +// Copyright (c) 2013, The Prometheus 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 push provides functions to push metrics to a Pushgateway. The metrics +// to push are either collected from a provided registry, or from explicitly +// listed collectors. +// +// See the documentation of the Pushgateway to understand the meaning of the +// grouping parameters and the differences between push.Registry and +// push.Collectors on the one hand and push.AddRegistry and push.AddCollectors +// on the other hand: https://github.com/prometheus/pushgateway +package push + +import ( + "bytes" + "fmt" + "io/ioutil" + "net/http" + "net/url" + "os" + "strings" + + "github.com/prometheus/common/expfmt" + "github.com/prometheus/common/model" + + "github.com/prometheus/client_golang/prometheus" +) + +const contentTypeHeader = "Content-Type" + +// FromGatherer triggers a metric collection by the provided Gatherer (which is +// usually implemented by a prometheus.Registry) and pushes all gathered metrics +// to the Pushgateway specified by url, using the provided job name and the +// (optional) further grouping labels (the grouping map may be nil). See the +// Pushgateway documentation for detailed implications of the job and other +// grouping labels. Neither the job name nor any grouping label value may +// contain a "/". The metrics pushed must not contain a job label of their own +// nor any of the grouping labels. +// +// You can use just host:port or ip:port as url, in which case 'http://' is +// added automatically. You can also include the schema in the URL. However, do +// not include the '/metrics/jobs/...' part. +// +// Note that all previously pushed metrics with the same job and other grouping +// labels will be replaced with the metrics pushed by this call. (It uses HTTP +// method 'PUT' to push to the Pushgateway.) +func FromGatherer(job string, grouping map[string]string, url string, g prometheus.Gatherer) error { + return push(job, grouping, url, g, "PUT") +} + +// AddFromGatherer works like FromGatherer, but only previously pushed metrics +// with the same name (and the same job and other grouping labels) will be +// replaced. (It uses HTTP method 'POST' to push to the Pushgateway.) +func AddFromGatherer(job string, grouping map[string]string, url string, g prometheus.Gatherer) error { + return push(job, grouping, url, g, "POST") +} + +func push(job string, grouping map[string]string, pushURL string, g prometheus.Gatherer, method string) error { + if !strings.Contains(pushURL, "://") { + pushURL = "http://" + pushURL + } + if strings.HasSuffix(pushURL, "/") { + pushURL = pushURL[:len(pushURL)-1] + } + + if strings.Contains(job, "/") { + return fmt.Errorf("job contains '/': %s", job) + } + urlComponents := []string{url.QueryEscape(job)} + for ln, lv := range grouping { + if !model.LabelNameRE.MatchString(ln) { + return fmt.Errorf("grouping label has invalid name: %s", ln) + } + if strings.Contains(lv, "/") { + return fmt.Errorf("value of grouping label %s contains '/': %s", ln, lv) + } + urlComponents = append(urlComponents, ln, lv) + } + pushURL = fmt.Sprintf("%s/metrics/job/%s", pushURL, strings.Join(urlComponents, "/")) + + mfs, err := g.Gather() + if err != nil { + return err + } + buf := &bytes.Buffer{} + enc := expfmt.NewEncoder(buf, expfmt.FmtProtoDelim) + // Check for pre-existing grouping labels: + for _, mf := range mfs { + for _, m := range mf.GetMetric() { + for _, l := range m.GetLabel() { + if l.GetName() == "job" { + return fmt.Errorf("pushed metric %s (%s) already contains a job label", mf.GetName(), m) + } + if _, ok := grouping[l.GetName()]; ok { + return fmt.Errorf( + "pushed metric %s (%s) already contains grouping label %s", + mf.GetName(), m, l.GetName(), + ) + } + } + } + enc.Encode(mf) + } + req, err := http.NewRequest(method, pushURL, buf) + if err != nil { + return err + } + req.Header.Set(contentTypeHeader, string(expfmt.FmtProtoDelim)) + resp, err := http.DefaultClient.Do(req) + if err != nil { + return err + } + defer resp.Body.Close() + if resp.StatusCode != 202 { + body, _ := ioutil.ReadAll(resp.Body) // Ignore any further error as this is for an error message only. + return fmt.Errorf("unexpected status code %d while pushing to %s: %s", resp.StatusCode, pushURL, body) + } + return nil +} + +// Collectors works like FromGatherer, but it does not use a Gatherer. Instead, +// it collects from the provided collectors directly. It is a convenient way to +// push only a few metrics. +func Collectors(job string, grouping map[string]string, url string, collectors ...prometheus.Collector) error { + return pushCollectors(job, grouping, url, "PUT", collectors...) +} + +// AddCollectors works like AddFromGatherer, but it does not use a Gatherer. +// Instead, it collects from the provided collectors directly. It is a +// convenient way to push only a few metrics. +func AddCollectors(job string, grouping map[string]string, url string, collectors ...prometheus.Collector) error { + return pushCollectors(job, grouping, url, "POST", collectors...) +} + +func pushCollectors(job string, grouping map[string]string, url, method string, collectors ...prometheus.Collector) error { + r := prometheus.NewRegistry() + for _, collector := range collectors { + if err := r.Register(collector); err != nil { + return err + } + } + return push(job, grouping, url, r, method) +} + +// HostnameGroupingKey returns a label map with the only entry +// {instance=""}. This can be conveniently used as the grouping +// parameter if metrics should be pushed with the hostname as label. The +// returned map is created upon each call so that the caller is free to add more +// labels to the map. +func HostnameGroupingKey() map[string]string { + hostname, err := os.Hostname() + if err != nil { + return map[string]string{"instance": "unknown"} + } + return map[string]string{"instance": hostname} +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/push/push_test.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/push/push_test.go new file mode 100644 index 0000000..28ed9b7 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/push/push_test.go @@ -0,0 +1,176 @@ +// Copyright 2016 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. + +// Copyright (c) 2013, The Prometheus 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 push + +import ( + "bytes" + "io/ioutil" + "net/http" + "net/http/httptest" + "os" + "testing" + + "github.com/prometheus/common/expfmt" + + "github.com/prometheus/client_golang/prometheus" +) + +func TestPush(t *testing.T) { + + var ( + lastMethod string + lastBody []byte + lastPath string + ) + + host, err := os.Hostname() + if err != nil { + t.Error(err) + } + + // Fake a Pushgateway that always responds with 202. + pgwOK := httptest.NewServer( + http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + lastMethod = r.Method + var err error + lastBody, err = ioutil.ReadAll(r.Body) + if err != nil { + t.Fatal(err) + } + lastPath = r.URL.EscapedPath() + w.Header().Set("Content-Type", `text/plain; charset=utf-8`) + w.WriteHeader(http.StatusAccepted) + }), + ) + defer pgwOK.Close() + + // Fake a Pushgateway that always responds with 500. + pgwErr := httptest.NewServer( + http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + http.Error(w, "fake error", http.StatusInternalServerError) + }), + ) + defer pgwErr.Close() + + metric1 := prometheus.NewCounter(prometheus.CounterOpts{ + Name: "testname1", + Help: "testhelp1", + }) + metric2 := prometheus.NewGauge(prometheus.GaugeOpts{ + Name: "testname2", + Help: "testhelp2", + ConstLabels: prometheus.Labels{"foo": "bar", "dings": "bums"}, + }) + + reg := prometheus.NewRegistry() + reg.MustRegister(metric1) + reg.MustRegister(metric2) + + mfs, err := reg.Gather() + if err != nil { + t.Fatal(err) + } + + buf := &bytes.Buffer{} + enc := expfmt.NewEncoder(buf, expfmt.FmtProtoDelim) + + for _, mf := range mfs { + if err := enc.Encode(mf); err != nil { + t.Fatal(err) + } + } + wantBody := buf.Bytes() + + // PushCollectors, all good. + if err := Collectors("testjob", HostnameGroupingKey(), pgwOK.URL, metric1, metric2); err != nil { + t.Fatal(err) + } + if lastMethod != "PUT" { + t.Error("want method PUT for PushCollectors, got", lastMethod) + } + if bytes.Compare(lastBody, wantBody) != 0 { + t.Errorf("got body %v, want %v", lastBody, wantBody) + } + if lastPath != "/metrics/job/testjob/instance/"+host { + t.Error("unexpected path:", lastPath) + } + + // PushAddCollectors, with nil grouping, all good. + if err := AddCollectors("testjob", nil, pgwOK.URL, metric1, metric2); err != nil { + t.Fatal(err) + } + if lastMethod != "POST" { + t.Error("want method POST for PushAddCollectors, got", lastMethod) + } + if bytes.Compare(lastBody, wantBody) != 0 { + t.Errorf("got body %v, want %v", lastBody, wantBody) + } + if lastPath != "/metrics/job/testjob" { + t.Error("unexpected path:", lastPath) + } + + // PushCollectors with a broken PGW. + if err := Collectors("testjob", nil, pgwErr.URL, metric1, metric2); err == nil { + t.Error("push to broken Pushgateway succeeded") + } else { + if got, want := err.Error(), "unexpected status code 500 while pushing to "+pgwErr.URL+"/metrics/job/testjob: fake error\n"; got != want { + t.Errorf("got error %q, want %q", got, want) + } + } + + // PushCollectors with invalid grouping or job. + if err := Collectors("testjob", map[string]string{"foo": "bums"}, pgwErr.URL, metric1, metric2); err == nil { + t.Error("push with grouping contained in metrics succeeded") + } + if err := Collectors("test/job", nil, pgwErr.URL, metric1, metric2); err == nil { + t.Error("push with invalid job value succeeded") + } + if err := Collectors("testjob", map[string]string{"foo/bar": "bums"}, pgwErr.URL, metric1, metric2); err == nil { + t.Error("push with invalid grouping succeeded") + } + if err := Collectors("testjob", map[string]string{"foo-bar": "bums"}, pgwErr.URL, metric1, metric2); err == nil { + t.Error("push with invalid grouping succeeded") + } + + // Push registry, all good. + if err := FromGatherer("testjob", HostnameGroupingKey(), pgwOK.URL, reg); err != nil { + t.Fatal(err) + } + if lastMethod != "PUT" { + t.Error("want method PUT for Push, got", lastMethod) + } + if bytes.Compare(lastBody, wantBody) != 0 { + t.Errorf("got body %v, want %v", lastBody, wantBody) + } + + // PushAdd registry, all good. + if err := AddFromGatherer("testjob", map[string]string{"a": "x", "b": "y"}, pgwOK.URL, reg); err != nil { + t.Fatal(err) + } + if lastMethod != "POST" { + t.Error("want method POSTT for PushAdd, got", lastMethod) + } + if bytes.Compare(lastBody, wantBody) != 0 { + t.Errorf("got body %v, want %v", lastBody, wantBody) + } + if lastPath != "/metrics/job/testjob/a/x/b/y" && lastPath != "/metrics/job/testjob/b/y/a/x" { + t.Error("unexpected path:", lastPath) + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/registry.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/registry.go new file mode 100644 index 0000000..32a3986 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/registry.go @@ -0,0 +1,806 @@ +// Copyright 2014 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 prometheus + +import ( + "bytes" + "errors" + "fmt" + "os" + "sort" + "sync" + + "github.com/golang/protobuf/proto" + + dto "github.com/prometheus/client_model/go" +) + +const ( + // Capacity for the channel to collect metrics and descriptors. + capMetricChan = 1000 + capDescChan = 10 +) + +// DefaultRegisterer and DefaultGatherer are the implementations of the +// Registerer and Gatherer interface a number of convenience functions in this +// package act on. Initially, both variables point to the same Registry, which +// has a process collector (see NewProcessCollector) and a Go collector (see +// NewGoCollector) already registered. This approach to keep default instances +// as global state mirrors the approach of other packages in the Go standard +// library. Note that there are caveats. Change the variables with caution and +// only if you understand the consequences. Users who want to avoid global state +// altogether should not use the convenience function and act on custom +// instances instead. +var ( + defaultRegistry = NewRegistry() + DefaultRegisterer Registerer = defaultRegistry + DefaultGatherer Gatherer = defaultRegistry +) + +func init() { + MustRegister(NewProcessCollector(os.Getpid(), "")) + MustRegister(NewGoCollector()) +} + +// NewRegistry creates a new vanilla Registry without any Collectors +// pre-registered. +func NewRegistry() *Registry { + return &Registry{ + collectorsByID: map[uint64]Collector{}, + descIDs: map[uint64]struct{}{}, + dimHashesByName: map[string]uint64{}, + } +} + +// NewPedanticRegistry returns a registry that checks during collection if each +// collected Metric is consistent with its reported Desc, and if the Desc has +// actually been registered with the registry. +// +// Usually, a Registry will be happy as long as the union of all collected +// Metrics is consistent and valid even if some metrics are not consistent with +// their own Desc or a Desc provided by their registered Collector. Well-behaved +// Collectors and Metrics will only provide consistent Descs. This Registry is +// useful to test the implementation of Collectors and Metrics. +func NewPedanticRegistry() *Registry { + r := NewRegistry() + r.pedanticChecksEnabled = true + return r +} + +// Registerer is the interface for the part of a registry in charge of +// registering and unregistering. Users of custom registries should use +// Registerer as type for registration purposes (rather then the Registry type +// directly). In that way, they are free to use custom Registerer implementation +// (e.g. for testing purposes). +type Registerer interface { + // Register registers a new Collector to be included in metrics + // collection. It returns an error if the descriptors provided by the + // Collector are invalid or if they — in combination with descriptors of + // already registered Collectors — do not fulfill the consistency and + // uniqueness criteria described in the documentation of metric.Desc. + // + // If the provided Collector is equal to a Collector already registered + // (which includes the case of re-registering the same Collector), the + // returned error is an instance of AlreadyRegisteredError, which + // contains the previously registered Collector. + // + // It is in general not safe to register the same Collector multiple + // times concurrently. + Register(Collector) error + // MustRegister works like Register but registers any number of + // Collectors and panics upon the first registration that causes an + // error. + MustRegister(...Collector) + // Unregister unregisters the Collector that equals the Collector passed + // in as an argument. (Two Collectors are considered equal if their + // Describe method yields the same set of descriptors.) The function + // returns whether a Collector was unregistered. + // + // Note that even after unregistering, it will not be possible to + // register a new Collector that is inconsistent with the unregistered + // Collector, e.g. a Collector collecting metrics with the same name but + // a different help string. The rationale here is that the same registry + // instance must only collect consistent metrics throughout its + // lifetime. + Unregister(Collector) bool +} + +// Gatherer is the interface for the part of a registry in charge of gathering +// the collected metrics into a number of MetricFamilies. The Gatherer interface +// comes with the same general implication as described for the Registerer +// interface. +type Gatherer interface { + // Gather calls the Collect method of the registered Collectors and then + // gathers the collected metrics into a lexicographically sorted slice + // of MetricFamily protobufs. Even if an error occurs, Gather attempts + // to gather as many metrics as possible. Hence, if a non-nil error is + // returned, the returned MetricFamily slice could be nil (in case of a + // fatal error that prevented any meaningful metric collection) or + // contain a number of MetricFamily protobufs, some of which might be + // incomplete, and some might be missing altogether. The returned error + // (which might be a MultiError) explains the details. In scenarios + // where complete collection is critical, the returned MetricFamily + // protobufs should be disregarded if the returned error is non-nil. + Gather() ([]*dto.MetricFamily, error) +} + +// Register registers the provided Collector with the DefaultRegisterer. +// +// Register is a shortcut for DefaultRegisterer.Register(c). See there for more +// details. +func Register(c Collector) error { + return DefaultRegisterer.Register(c) +} + +// MustRegister registers the provided Collectors with the DefaultRegisterer and +// panics if any error occurs. +// +// MustRegister is a shortcut for DefaultRegisterer.MustRegister(cs...). See +// there for more details. +func MustRegister(cs ...Collector) { + DefaultRegisterer.MustRegister(cs...) +} + +// RegisterOrGet registers the provided Collector with the DefaultRegisterer and +// returns the Collector, unless an equal Collector was registered before, in +// which case that Collector is returned. +// +// Deprecated: RegisterOrGet is merely a convenience function for the +// implementation as described in the documentation for +// AlreadyRegisteredError. As the use case is relatively rare, this function +// will be removed in a future version of this package to clean up the +// namespace. +func RegisterOrGet(c Collector) (Collector, error) { + if err := Register(c); err != nil { + if are, ok := err.(AlreadyRegisteredError); ok { + return are.ExistingCollector, nil + } + return nil, err + } + return c, nil +} + +// MustRegisterOrGet behaves like RegisterOrGet but panics instead of returning +// an error. +// +// Deprecated: This is deprecated for the same reason RegisterOrGet is. See +// there for details. +func MustRegisterOrGet(c Collector) Collector { + c, err := RegisterOrGet(c) + if err != nil { + panic(err) + } + return c +} + +// Unregister removes the registration of the provided Collector from the +// DefaultRegisterer. +// +// Unregister is a shortcut for DefaultRegisterer.Unregister(c). See there for +// more details. +func Unregister(c Collector) bool { + return DefaultRegisterer.Unregister(c) +} + +// GathererFunc turns a function into a Gatherer. +type GathererFunc func() ([]*dto.MetricFamily, error) + +// Gather implements Gatherer. +func (gf GathererFunc) Gather() ([]*dto.MetricFamily, error) { + return gf() +} + +// SetMetricFamilyInjectionHook replaces the DefaultGatherer with one that +// gathers from the previous DefaultGatherers but then merges the MetricFamily +// protobufs returned from the provided hook function with the MetricFamily +// protobufs returned from the original DefaultGatherer. +// +// Deprecated: This function manipulates the DefaultGatherer variable. Consider +// the implications, i.e. don't do this concurrently with any uses of the +// DefaultGatherer. In the rare cases where you need to inject MetricFamily +// protobufs directly, it is recommended to use a custom Registry and combine it +// with a custom Gatherer using the Gatherers type (see +// there). SetMetricFamilyInjectionHook only exists for compatibility reasons +// with previous versions of this package. +func SetMetricFamilyInjectionHook(hook func() []*dto.MetricFamily) { + DefaultGatherer = Gatherers{ + DefaultGatherer, + GathererFunc(func() ([]*dto.MetricFamily, error) { return hook(), nil }), + } +} + +// AlreadyRegisteredError is returned by the Register method if the Collector to +// be registered has already been registered before, or a different Collector +// that collects the same metrics has been registered before. Registration fails +// in that case, but you can detect from the kind of error what has +// happened. The error contains fields for the existing Collector and the +// (rejected) new Collector that equals the existing one. This can be used to +// find out if an equal Collector has been registered before and switch over to +// using the old one, as demonstrated in the example. +type AlreadyRegisteredError struct { + ExistingCollector, NewCollector Collector +} + +func (err AlreadyRegisteredError) Error() string { + return "duplicate metrics collector registration attempted" +} + +// MultiError is a slice of errors implementing the error interface. It is used +// by a Gatherer to report multiple errors during MetricFamily gathering. +type MultiError []error + +func (errs MultiError) Error() string { + if len(errs) == 0 { + return "" + } + buf := &bytes.Buffer{} + fmt.Fprintf(buf, "%d error(s) occurred:", len(errs)) + for _, err := range errs { + fmt.Fprintf(buf, "\n* %s", err) + } + return buf.String() +} + +// MaybeUnwrap returns nil if len(errs) is 0. It returns the first and only +// contained error as error if len(errs is 1). In all other cases, it returns +// the MultiError directly. This is helpful for returning a MultiError in a way +// that only uses the MultiError if needed. +func (errs MultiError) MaybeUnwrap() error { + switch len(errs) { + case 0: + return nil + case 1: + return errs[0] + default: + return errs + } +} + +// Registry registers Prometheus collectors, collects their metrics, and gathers +// them into MetricFamilies for exposition. It implements both Registerer and +// Gatherer. The zero value is not usable. Create instances with NewRegistry or +// NewPedanticRegistry. +type Registry struct { + mtx sync.RWMutex + collectorsByID map[uint64]Collector // ID is a hash of the descIDs. + descIDs map[uint64]struct{} + dimHashesByName map[string]uint64 + pedanticChecksEnabled bool +} + +// Register implements Registerer. +func (r *Registry) Register(c Collector) error { + var ( + descChan = make(chan *Desc, capDescChan) + newDescIDs = map[uint64]struct{}{} + newDimHashesByName = map[string]uint64{} + collectorID uint64 // Just a sum of all desc IDs. + duplicateDescErr error + ) + go func() { + c.Describe(descChan) + close(descChan) + }() + r.mtx.Lock() + defer r.mtx.Unlock() + // Coduct various tests... + for desc := range descChan { + + // Is the descriptor valid at all? + if desc.err != nil { + return fmt.Errorf("descriptor %s is invalid: %s", desc, desc.err) + } + + // Is the descID unique? + // (In other words: Is the fqName + constLabel combination unique?) + if _, exists := r.descIDs[desc.id]; exists { + duplicateDescErr = fmt.Errorf("descriptor %s already exists with the same fully-qualified name and const label values", desc) + } + // If it is not a duplicate desc in this collector, add it to + // the collectorID. (We allow duplicate descs within the same + // collector, but their existence must be a no-op.) + if _, exists := newDescIDs[desc.id]; !exists { + newDescIDs[desc.id] = struct{}{} + collectorID += desc.id + } + + // Are all the label names and the help string consistent with + // previous descriptors of the same name? + // First check existing descriptors... + if dimHash, exists := r.dimHashesByName[desc.fqName]; exists { + if dimHash != desc.dimHash { + return fmt.Errorf("a previously registered descriptor with the same fully-qualified name as %s has different label names or a different help string", desc) + } + } else { + // ...then check the new descriptors already seen. + if dimHash, exists := newDimHashesByName[desc.fqName]; exists { + if dimHash != desc.dimHash { + return fmt.Errorf("descriptors reported by collector have inconsistent label names or help strings for the same fully-qualified name, offender is %s", desc) + } + } else { + newDimHashesByName[desc.fqName] = desc.dimHash + } + } + } + // Did anything happen at all? + if len(newDescIDs) == 0 { + return errors.New("collector has no descriptors") + } + if existing, exists := r.collectorsByID[collectorID]; exists { + return AlreadyRegisteredError{ + ExistingCollector: existing, + NewCollector: c, + } + } + // If the collectorID is new, but at least one of the descs existed + // before, we are in trouble. + if duplicateDescErr != nil { + return duplicateDescErr + } + + // Only after all tests have passed, actually register. + r.collectorsByID[collectorID] = c + for hash := range newDescIDs { + r.descIDs[hash] = struct{}{} + } + for name, dimHash := range newDimHashesByName { + r.dimHashesByName[name] = dimHash + } + return nil +} + +// Unregister implements Registerer. +func (r *Registry) Unregister(c Collector) bool { + var ( + descChan = make(chan *Desc, capDescChan) + descIDs = map[uint64]struct{}{} + collectorID uint64 // Just a sum of the desc IDs. + ) + go func() { + c.Describe(descChan) + close(descChan) + }() + for desc := range descChan { + if _, exists := descIDs[desc.id]; !exists { + collectorID += desc.id + descIDs[desc.id] = struct{}{} + } + } + + r.mtx.RLock() + if _, exists := r.collectorsByID[collectorID]; !exists { + r.mtx.RUnlock() + return false + } + r.mtx.RUnlock() + + r.mtx.Lock() + defer r.mtx.Unlock() + + delete(r.collectorsByID, collectorID) + for id := range descIDs { + delete(r.descIDs, id) + } + // dimHashesByName is left untouched as those must be consistent + // throughout the lifetime of a program. + return true +} + +// MustRegister implements Registerer. +func (r *Registry) MustRegister(cs ...Collector) { + for _, c := range cs { + if err := r.Register(c); err != nil { + panic(err) + } + } +} + +// Gather implements Gatherer. +func (r *Registry) Gather() ([]*dto.MetricFamily, error) { + var ( + metricChan = make(chan Metric, capMetricChan) + metricHashes = map[uint64]struct{}{} + dimHashes = map[string]uint64{} + wg sync.WaitGroup + errs MultiError // The collected errors to return in the end. + registeredDescIDs map[uint64]struct{} // Only used for pedantic checks + ) + + r.mtx.RLock() + metricFamiliesByName := make(map[string]*dto.MetricFamily, len(r.dimHashesByName)) + + // Scatter. + // (Collectors could be complex and slow, so we call them all at once.) + wg.Add(len(r.collectorsByID)) + go func() { + wg.Wait() + close(metricChan) + }() + for _, collector := range r.collectorsByID { + go func(collector Collector) { + defer wg.Done() + collector.Collect(metricChan) + }(collector) + } + + // In case pedantic checks are enabled, we have to copy the map before + // giving up the RLock. + if r.pedanticChecksEnabled { + registeredDescIDs = make(map[uint64]struct{}, len(r.descIDs)) + for id := range r.descIDs { + registeredDescIDs[id] = struct{}{} + } + } + + r.mtx.RUnlock() + + // Drain metricChan in case of premature return. + defer func() { + for _ = range metricChan { + } + }() + + // Gather. + for metric := range metricChan { + // This could be done concurrently, too, but it required locking + // of metricFamiliesByName (and of metricHashes if checks are + // enabled). Most likely not worth it. + desc := metric.Desc() + dtoMetric := &dto.Metric{} + if err := metric.Write(dtoMetric); err != nil { + errs = append(errs, fmt.Errorf( + "error collecting metric %v: %s", desc, err, + )) + continue + } + metricFamily, ok := metricFamiliesByName[desc.fqName] + if ok { + if metricFamily.GetHelp() != desc.help { + errs = append(errs, fmt.Errorf( + "collected metric %s %s has help %q but should have %q", + desc.fqName, dtoMetric, desc.help, metricFamily.GetHelp(), + )) + continue + } + // TODO(beorn7): Simplify switch once Desc has type. + switch metricFamily.GetType() { + case dto.MetricType_COUNTER: + if dtoMetric.Counter == nil { + errs = append(errs, fmt.Errorf( + "collected metric %s %s should be a Counter", + desc.fqName, dtoMetric, + )) + continue + } + case dto.MetricType_GAUGE: + if dtoMetric.Gauge == nil { + errs = append(errs, fmt.Errorf( + "collected metric %s %s should be a Gauge", + desc.fqName, dtoMetric, + )) + continue + } + case dto.MetricType_SUMMARY: + if dtoMetric.Summary == nil { + errs = append(errs, fmt.Errorf( + "collected metric %s %s should be a Summary", + desc.fqName, dtoMetric, + )) + continue + } + case dto.MetricType_UNTYPED: + if dtoMetric.Untyped == nil { + errs = append(errs, fmt.Errorf( + "collected metric %s %s should be Untyped", + desc.fqName, dtoMetric, + )) + continue + } + case dto.MetricType_HISTOGRAM: + if dtoMetric.Histogram == nil { + errs = append(errs, fmt.Errorf( + "collected metric %s %s should be a Histogram", + desc.fqName, dtoMetric, + )) + continue + } + default: + panic("encountered MetricFamily with invalid type") + } + } else { + metricFamily = &dto.MetricFamily{} + metricFamily.Name = proto.String(desc.fqName) + metricFamily.Help = proto.String(desc.help) + // TODO(beorn7): Simplify switch once Desc has type. + switch { + case dtoMetric.Gauge != nil: + metricFamily.Type = dto.MetricType_GAUGE.Enum() + case dtoMetric.Counter != nil: + metricFamily.Type = dto.MetricType_COUNTER.Enum() + case dtoMetric.Summary != nil: + metricFamily.Type = dto.MetricType_SUMMARY.Enum() + case dtoMetric.Untyped != nil: + metricFamily.Type = dto.MetricType_UNTYPED.Enum() + case dtoMetric.Histogram != nil: + metricFamily.Type = dto.MetricType_HISTOGRAM.Enum() + default: + errs = append(errs, fmt.Errorf( + "empty metric collected: %s", dtoMetric, + )) + continue + } + metricFamiliesByName[desc.fqName] = metricFamily + } + if err := checkMetricConsistency(metricFamily, dtoMetric, metricHashes, dimHashes); err != nil { + errs = append(errs, err) + continue + } + if r.pedanticChecksEnabled { + // Is the desc registered at all? + if _, exist := registeredDescIDs[desc.id]; !exist { + errs = append(errs, fmt.Errorf( + "collected metric %s %s with unregistered descriptor %s", + metricFamily.GetName(), dtoMetric, desc, + )) + continue + } + if err := checkDescConsistency(metricFamily, dtoMetric, desc); err != nil { + errs = append(errs, err) + continue + } + } + metricFamily.Metric = append(metricFamily.Metric, dtoMetric) + } + return normalizeMetricFamilies(metricFamiliesByName), errs.MaybeUnwrap() +} + +// Gatherers is a slice of Gatherer instances that implements the Gatherer +// interface itself. Its Gather method calls Gather on all Gatherers in the +// slice in order and returns the merged results. Errors returned from the +// Gather calles are all returned in a flattened MultiError. Duplicate and +// inconsistent Metrics are skipped (first occurrence in slice order wins) and +// reported in the returned error. +// +// Gatherers can be used to merge the Gather results from multiple +// Registries. It also provides a way to directly inject existing MetricFamily +// protobufs into the gathering by creating a custom Gatherer with a Gather +// method that simply returns the existing MetricFamily protobufs. Note that no +// registration is involved (in contrast to Collector registration), so +// obviously registration-time checks cannot happen. Any inconsistencies between +// the gathered MetricFamilies are reported as errors by the Gather method, and +// inconsistent Metrics are dropped. Invalid parts of the MetricFamilies +// (e.g. syntactically invalid metric or label names) will go undetected. +type Gatherers []Gatherer + +// Gather implements Gatherer. +func (gs Gatherers) Gather() ([]*dto.MetricFamily, error) { + var ( + metricFamiliesByName = map[string]*dto.MetricFamily{} + metricHashes = map[uint64]struct{}{} + dimHashes = map[string]uint64{} + errs MultiError // The collected errors to return in the end. + ) + + for i, g := range gs { + mfs, err := g.Gather() + if err != nil { + if multiErr, ok := err.(MultiError); ok { + for _, err := range multiErr { + errs = append(errs, fmt.Errorf("[from Gatherer #%d] %s", i+1, err)) + } + } else { + errs = append(errs, fmt.Errorf("[from Gatherer #%d] %s", i+1, err)) + } + } + for _, mf := range mfs { + existingMF, exists := metricFamiliesByName[mf.GetName()] + if exists { + if existingMF.GetHelp() != mf.GetHelp() { + errs = append(errs, fmt.Errorf( + "gathered metric family %s has help %q but should have %q", + mf.GetName(), mf.GetHelp(), existingMF.GetHelp(), + )) + continue + } + if existingMF.GetType() != mf.GetType() { + errs = append(errs, fmt.Errorf( + "gathered metric family %s has type %s but should have %s", + mf.GetName(), mf.GetType(), existingMF.GetType(), + )) + continue + } + } else { + existingMF = &dto.MetricFamily{} + existingMF.Name = mf.Name + existingMF.Help = mf.Help + existingMF.Type = mf.Type + metricFamiliesByName[mf.GetName()] = existingMF + } + for _, m := range mf.Metric { + if err := checkMetricConsistency(existingMF, m, metricHashes, dimHashes); err != nil { + errs = append(errs, err) + continue + } + existingMF.Metric = append(existingMF.Metric, m) + } + } + } + return normalizeMetricFamilies(metricFamiliesByName), errs.MaybeUnwrap() +} + +// metricSorter is a sortable slice of *dto.Metric. +type metricSorter []*dto.Metric + +func (s metricSorter) Len() int { + return len(s) +} + +func (s metricSorter) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s metricSorter) Less(i, j int) bool { + if len(s[i].Label) != len(s[j].Label) { + // This should not happen. The metrics are + // inconsistent. However, we have to deal with the fact, as + // people might use custom collectors or metric family injection + // to create inconsistent metrics. So let's simply compare the + // number of labels in this case. That will still yield + // reproducible sorting. + return len(s[i].Label) < len(s[j].Label) + } + for n, lp := range s[i].Label { + vi := lp.GetValue() + vj := s[j].Label[n].GetValue() + if vi != vj { + return vi < vj + } + } + + // We should never arrive here. Multiple metrics with the same + // label set in the same scrape will lead to undefined ingestion + // behavior. However, as above, we have to provide stable sorting + // here, even for inconsistent metrics. So sort equal metrics + // by their timestamp, with missing timestamps (implying "now") + // coming last. + if s[i].TimestampMs == nil { + return false + } + if s[j].TimestampMs == nil { + return true + } + return s[i].GetTimestampMs() < s[j].GetTimestampMs() +} + +// normalizeMetricFamilies returns a MetricFamily slice whith empty +// MetricFamilies pruned and the remaining MetricFamilies sorted by name within +// the slice, with the contained Metrics sorted within each MetricFamily. +func normalizeMetricFamilies(metricFamiliesByName map[string]*dto.MetricFamily) []*dto.MetricFamily { + for _, mf := range metricFamiliesByName { + sort.Sort(metricSorter(mf.Metric)) + } + names := make([]string, 0, len(metricFamiliesByName)) + for name, mf := range metricFamiliesByName { + if len(mf.Metric) > 0 { + names = append(names, name) + } + } + sort.Strings(names) + result := make([]*dto.MetricFamily, 0, len(names)) + for _, name := range names { + result = append(result, metricFamiliesByName[name]) + } + return result +} + +// checkMetricConsistency checks if the provided Metric is consistent with the +// provided MetricFamily. It also hashed the Metric labels and the MetricFamily +// name. If the resulting hash is alread in the provided metricHashes, an error +// is returned. If not, it is added to metricHashes. The provided dimHashes maps +// MetricFamily names to their dimHash (hashed sorted label names). If dimHashes +// doesn't yet contain a hash for the provided MetricFamily, it is +// added. Otherwise, an error is returned if the existing dimHashes in not equal +// the calculated dimHash. +func checkMetricConsistency( + metricFamily *dto.MetricFamily, + dtoMetric *dto.Metric, + metricHashes map[uint64]struct{}, + dimHashes map[string]uint64, +) error { + // Type consistency with metric family. + if metricFamily.GetType() == dto.MetricType_GAUGE && dtoMetric.Gauge == nil || + metricFamily.GetType() == dto.MetricType_COUNTER && dtoMetric.Counter == nil || + metricFamily.GetType() == dto.MetricType_SUMMARY && dtoMetric.Summary == nil || + metricFamily.GetType() == dto.MetricType_HISTOGRAM && dtoMetric.Histogram == nil || + metricFamily.GetType() == dto.MetricType_UNTYPED && dtoMetric.Untyped == nil { + return fmt.Errorf( + "collected metric %s %s is not a %s", + metricFamily.GetName(), dtoMetric, metricFamily.GetType(), + ) + } + + // Is the metric unique (i.e. no other metric with the same name and the same label values)? + h := hashNew() + h = hashAdd(h, metricFamily.GetName()) + h = hashAddByte(h, separatorByte) + dh := hashNew() + // Make sure label pairs are sorted. We depend on it for the consistency + // check. + sort.Sort(LabelPairSorter(dtoMetric.Label)) + for _, lp := range dtoMetric.Label { + h = hashAdd(h, lp.GetValue()) + h = hashAddByte(h, separatorByte) + dh = hashAdd(dh, lp.GetName()) + dh = hashAddByte(dh, separatorByte) + } + if _, exists := metricHashes[h]; exists { + return fmt.Errorf( + "collected metric %s %s was collected before with the same name and label values", + metricFamily.GetName(), dtoMetric, + ) + } + if dimHash, ok := dimHashes[metricFamily.GetName()]; ok { + if dimHash != dh { + return fmt.Errorf( + "collected metric %s %s has label dimensions inconsistent with previously collected metrics in the same metric family", + metricFamily.GetName(), dtoMetric, + ) + } + } else { + dimHashes[metricFamily.GetName()] = dh + } + metricHashes[h] = struct{}{} + return nil +} + +func checkDescConsistency( + metricFamily *dto.MetricFamily, + dtoMetric *dto.Metric, + desc *Desc, +) error { + // Desc help consistency with metric family help. + if metricFamily.GetHelp() != desc.help { + return fmt.Errorf( + "collected metric %s %s has help %q but should have %q", + metricFamily.GetName(), dtoMetric, metricFamily.GetHelp(), desc.help, + ) + } + + // Is the desc consistent with the content of the metric? + lpsFromDesc := make([]*dto.LabelPair, 0, len(dtoMetric.Label)) + lpsFromDesc = append(lpsFromDesc, desc.constLabelPairs...) + for _, l := range desc.variableLabels { + lpsFromDesc = append(lpsFromDesc, &dto.LabelPair{ + Name: proto.String(l), + }) + } + if len(lpsFromDesc) != len(dtoMetric.Label) { + return fmt.Errorf( + "labels in collected metric %s %s are inconsistent with descriptor %s", + metricFamily.GetName(), dtoMetric, desc, + ) + } + sort.Sort(LabelPairSorter(lpsFromDesc)) + for i, lpFromDesc := range lpsFromDesc { + lpFromMetric := dtoMetric.Label[i] + if lpFromDesc.GetName() != lpFromMetric.GetName() || + lpFromDesc.Value != nil && lpFromDesc.GetValue() != lpFromMetric.GetValue() { + return fmt.Errorf( + "labels in collected metric %s %s are inconsistent with descriptor %s", + metricFamily.GetName(), dtoMetric, desc, + ) + } + } + return nil +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/registry_test.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/registry_test.go new file mode 100644 index 0000000..9dacb62 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/registry_test.go @@ -0,0 +1,545 @@ +// Copyright 2014 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. + +// Copyright (c) 2013, The Prometheus 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 prometheus_test + +import ( + "bytes" + "net/http" + "net/http/httptest" + "testing" + + dto "github.com/prometheus/client_model/go" + + "github.com/golang/protobuf/proto" + "github.com/prometheus/common/expfmt" + + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promhttp" +) + +func testHandler(t testing.TB) { + + metricVec := prometheus.NewCounterVec( + prometheus.CounterOpts{ + Name: "name", + Help: "docstring", + ConstLabels: prometheus.Labels{"constname": "constvalue"}, + }, + []string{"labelname"}, + ) + + metricVec.WithLabelValues("val1").Inc() + metricVec.WithLabelValues("val2").Inc() + + externalMetricFamily := &dto.MetricFamily{ + Name: proto.String("externalname"), + Help: proto.String("externaldocstring"), + Type: dto.MetricType_COUNTER.Enum(), + Metric: []*dto.Metric{ + { + Label: []*dto.LabelPair{ + { + Name: proto.String("externalconstname"), + Value: proto.String("externalconstvalue"), + }, + { + Name: proto.String("externallabelname"), + Value: proto.String("externalval1"), + }, + }, + Counter: &dto.Counter{ + Value: proto.Float64(1), + }, + }, + }, + } + externalBuf := &bytes.Buffer{} + enc := expfmt.NewEncoder(externalBuf, expfmt.FmtProtoDelim) + if err := enc.Encode(externalMetricFamily); err != nil { + t.Fatal(err) + } + externalMetricFamilyAsBytes := externalBuf.Bytes() + externalMetricFamilyAsText := []byte(`# HELP externalname externaldocstring +# TYPE externalname counter +externalname{externalconstname="externalconstvalue",externallabelname="externalval1"} 1 +`) + externalMetricFamilyAsProtoText := []byte(`name: "externalname" +help: "externaldocstring" +type: COUNTER +metric: < + label: < + name: "externalconstname" + value: "externalconstvalue" + > + label: < + name: "externallabelname" + value: "externalval1" + > + counter: < + value: 1 + > +> + +`) + externalMetricFamilyAsProtoCompactText := []byte(`name:"externalname" help:"externaldocstring" type:COUNTER metric: label: counter: > +`) + + expectedMetricFamily := &dto.MetricFamily{ + Name: proto.String("name"), + Help: proto.String("docstring"), + Type: dto.MetricType_COUNTER.Enum(), + Metric: []*dto.Metric{ + { + Label: []*dto.LabelPair{ + { + Name: proto.String("constname"), + Value: proto.String("constvalue"), + }, + { + Name: proto.String("labelname"), + Value: proto.String("val1"), + }, + }, + Counter: &dto.Counter{ + Value: proto.Float64(1), + }, + }, + { + Label: []*dto.LabelPair{ + { + Name: proto.String("constname"), + Value: proto.String("constvalue"), + }, + { + Name: proto.String("labelname"), + Value: proto.String("val2"), + }, + }, + Counter: &dto.Counter{ + Value: proto.Float64(1), + }, + }, + }, + } + buf := &bytes.Buffer{} + enc = expfmt.NewEncoder(buf, expfmt.FmtProtoDelim) + if err := enc.Encode(expectedMetricFamily); err != nil { + t.Fatal(err) + } + expectedMetricFamilyAsBytes := buf.Bytes() + expectedMetricFamilyAsText := []byte(`# HELP name docstring +# TYPE name counter +name{constname="constvalue",labelname="val1"} 1 +name{constname="constvalue",labelname="val2"} 1 +`) + expectedMetricFamilyAsProtoText := []byte(`name: "name" +help: "docstring" +type: COUNTER +metric: < + label: < + name: "constname" + value: "constvalue" + > + label: < + name: "labelname" + value: "val1" + > + counter: < + value: 1 + > +> +metric: < + label: < + name: "constname" + value: "constvalue" + > + label: < + name: "labelname" + value: "val2" + > + counter: < + value: 1 + > +> + +`) + expectedMetricFamilyAsProtoCompactText := []byte(`name:"name" help:"docstring" type:COUNTER metric: label: counter: > metric: label: counter: > +`) + + externalMetricFamilyWithSameName := &dto.MetricFamily{ + Name: proto.String("name"), + Help: proto.String("docstring"), + Type: dto.MetricType_COUNTER.Enum(), + Metric: []*dto.Metric{ + { + Label: []*dto.LabelPair{ + { + Name: proto.String("constname"), + Value: proto.String("constvalue"), + }, + { + Name: proto.String("labelname"), + Value: proto.String("different_val"), + }, + }, + Counter: &dto.Counter{ + Value: proto.Float64(42), + }, + }, + }, + } + + expectedMetricFamilyMergedWithExternalAsProtoCompactText := []byte(`name:"name" help:"docstring" type:COUNTER metric: label: counter: > metric: label: counter: > metric: label: counter: > +`) + + type output struct { + headers map[string]string + body []byte + } + + var scenarios = []struct { + headers map[string]string + out output + collector prometheus.Collector + externalMF []*dto.MetricFamily + }{ + { // 0 + headers: map[string]string{ + "Accept": "foo/bar;q=0.2, dings/bums;q=0.8", + }, + out: output{ + headers: map[string]string{ + "Content-Type": `text/plain; version=0.0.4`, + }, + body: []byte{}, + }, + }, + { // 1 + headers: map[string]string{ + "Accept": "foo/bar;q=0.2, application/quark;q=0.8", + }, + out: output{ + headers: map[string]string{ + "Content-Type": `text/plain; version=0.0.4`, + }, + body: []byte{}, + }, + }, + { // 2 + headers: map[string]string{ + "Accept": "foo/bar;q=0.2, application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=bla;q=0.8", + }, + out: output{ + headers: map[string]string{ + "Content-Type": `text/plain; version=0.0.4`, + }, + body: []byte{}, + }, + }, + { // 3 + headers: map[string]string{ + "Accept": "text/plain;q=0.2, application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=delimited;q=0.8", + }, + out: output{ + headers: map[string]string{ + "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=delimited`, + }, + body: []byte{}, + }, + }, + { // 4 + headers: map[string]string{ + "Accept": "application/json", + }, + out: output{ + headers: map[string]string{ + "Content-Type": `text/plain; version=0.0.4`, + }, + body: expectedMetricFamilyAsText, + }, + collector: metricVec, + }, + { // 5 + headers: map[string]string{ + "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=delimited", + }, + out: output{ + headers: map[string]string{ + "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=delimited`, + }, + body: expectedMetricFamilyAsBytes, + }, + collector: metricVec, + }, + { // 6 + headers: map[string]string{ + "Accept": "application/json", + }, + out: output{ + headers: map[string]string{ + "Content-Type": `text/plain; version=0.0.4`, + }, + body: externalMetricFamilyAsText, + }, + externalMF: []*dto.MetricFamily{externalMetricFamily}, + }, + { // 7 + headers: map[string]string{ + "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=delimited", + }, + out: output{ + headers: map[string]string{ + "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=delimited`, + }, + body: externalMetricFamilyAsBytes, + }, + externalMF: []*dto.MetricFamily{externalMetricFamily}, + }, + { // 8 + headers: map[string]string{ + "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=delimited", + }, + out: output{ + headers: map[string]string{ + "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=delimited`, + }, + body: bytes.Join( + [][]byte{ + externalMetricFamilyAsBytes, + expectedMetricFamilyAsBytes, + }, + []byte{}, + ), + }, + collector: metricVec, + externalMF: []*dto.MetricFamily{externalMetricFamily}, + }, + { // 9 + headers: map[string]string{ + "Accept": "text/plain", + }, + out: output{ + headers: map[string]string{ + "Content-Type": `text/plain; version=0.0.4`, + }, + body: []byte{}, + }, + }, + { // 10 + headers: map[string]string{ + "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=bla;q=0.2, text/plain;q=0.5", + }, + out: output{ + headers: map[string]string{ + "Content-Type": `text/plain; version=0.0.4`, + }, + body: expectedMetricFamilyAsText, + }, + collector: metricVec, + }, + { // 11 + headers: map[string]string{ + "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=bla;q=0.2, text/plain;q=0.5;version=0.0.4", + }, + out: output{ + headers: map[string]string{ + "Content-Type": `text/plain; version=0.0.4`, + }, + body: bytes.Join( + [][]byte{ + externalMetricFamilyAsText, + expectedMetricFamilyAsText, + }, + []byte{}, + ), + }, + collector: metricVec, + externalMF: []*dto.MetricFamily{externalMetricFamily}, + }, + { // 12 + headers: map[string]string{ + "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=delimited;q=0.2, text/plain;q=0.5;version=0.0.2", + }, + out: output{ + headers: map[string]string{ + "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=delimited`, + }, + body: bytes.Join( + [][]byte{ + externalMetricFamilyAsBytes, + expectedMetricFamilyAsBytes, + }, + []byte{}, + ), + }, + collector: metricVec, + externalMF: []*dto.MetricFamily{externalMetricFamily}, + }, + { // 13 + headers: map[string]string{ + "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=text;q=0.5, application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=delimited;q=0.4", + }, + out: output{ + headers: map[string]string{ + "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=text`, + }, + body: bytes.Join( + [][]byte{ + externalMetricFamilyAsProtoText, + expectedMetricFamilyAsProtoText, + }, + []byte{}, + ), + }, + collector: metricVec, + externalMF: []*dto.MetricFamily{externalMetricFamily}, + }, + { // 14 + headers: map[string]string{ + "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=compact-text", + }, + out: output{ + headers: map[string]string{ + "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=compact-text`, + }, + body: bytes.Join( + [][]byte{ + externalMetricFamilyAsProtoCompactText, + expectedMetricFamilyAsProtoCompactText, + }, + []byte{}, + ), + }, + collector: metricVec, + externalMF: []*dto.MetricFamily{externalMetricFamily}, + }, + { // 15 + headers: map[string]string{ + "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=compact-text", + }, + out: output{ + headers: map[string]string{ + "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=compact-text`, + }, + body: bytes.Join( + [][]byte{ + externalMetricFamilyAsProtoCompactText, + expectedMetricFamilyMergedWithExternalAsProtoCompactText, + }, + []byte{}, + ), + }, + collector: metricVec, + externalMF: []*dto.MetricFamily{ + externalMetricFamily, + externalMetricFamilyWithSameName, + }, + }, + } + for i, scenario := range scenarios { + registry := prometheus.NewPedanticRegistry() + gatherer := prometheus.Gatherer(registry) + if scenario.externalMF != nil { + gatherer = prometheus.Gatherers{ + registry, + prometheus.GathererFunc(func() ([]*dto.MetricFamily, error) { + return scenario.externalMF, nil + }), + } + } + + if scenario.collector != nil { + registry.Register(scenario.collector) + } + writer := httptest.NewRecorder() + handler := prometheus.InstrumentHandler("prometheus", promhttp.HandlerFor(gatherer, promhttp.HandlerOpts{})) + request, _ := http.NewRequest("GET", "/", nil) + for key, value := range scenario.headers { + request.Header.Add(key, value) + } + handler(writer, request) + + for key, value := range scenario.out.headers { + if writer.HeaderMap.Get(key) != value { + t.Errorf( + "%d. expected %q for header %q, got %q", + i, value, key, writer.Header().Get(key), + ) + } + } + + if !bytes.Equal(scenario.out.body, writer.Body.Bytes()) { + t.Errorf( + "%d. expected body:\n%s\ngot body:\n%s\n", + i, scenario.out.body, writer.Body.Bytes(), + ) + } + } +} + +func TestHandler(t *testing.T) { + testHandler(t) +} + +func BenchmarkHandler(b *testing.B) { + for i := 0; i < b.N; i++ { + testHandler(b) + } +} + +func TestRegisterWithOrGet(t *testing.T) { + // Replace the default registerer just to be sure. This is bad, but this + // whole test will go away once RegisterOrGet is removed. + oldRegisterer := prometheus.DefaultRegisterer + defer func() { + prometheus.DefaultRegisterer = oldRegisterer + }() + prometheus.DefaultRegisterer = prometheus.NewRegistry() + original := prometheus.NewCounterVec( + prometheus.CounterOpts{ + Name: "test", + Help: "help", + }, + []string{"foo", "bar"}, + ) + equalButNotSame := prometheus.NewCounterVec( + prometheus.CounterOpts{ + Name: "test", + Help: "help", + }, + []string{"foo", "bar"}, + ) + if err := prometheus.Register(original); err != nil { + t.Fatal(err) + } + if err := prometheus.Register(equalButNotSame); err == nil { + t.Fatal("expected error when registringe equal collector") + } + existing, err := prometheus.RegisterOrGet(equalButNotSame) + if err != nil { + t.Fatal(err) + } + if existing != original { + t.Error("expected original collector but got something else") + } + if existing == equalButNotSame { + t.Error("expected original callector but got new one") + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/summary.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/summary.go new file mode 100644 index 0000000..bce05bf --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/summary.go @@ -0,0 +1,534 @@ +// Copyright 2014 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 prometheus + +import ( + "fmt" + "math" + "sort" + "sync" + "time" + + "github.com/beorn7/perks/quantile" + "github.com/golang/protobuf/proto" + + dto "github.com/prometheus/client_model/go" +) + +// quantileLabel is used for the label that defines the quantile in a +// summary. +const quantileLabel = "quantile" + +// A Summary captures individual observations from an event or sample stream and +// summarizes them in a manner similar to traditional summary statistics: 1. sum +// of observations, 2. observation count, 3. rank estimations. +// +// A typical use-case is the observation of request latencies. By default, a +// Summary provides the median, the 90th and the 99th percentile of the latency +// as rank estimations. +// +// Note that the rank estimations cannot be aggregated in a meaningful way with +// the Prometheus query language (i.e. you cannot average or add them). If you +// need aggregatable quantiles (e.g. you want the 99th percentile latency of all +// queries served across all instances of a service), consider the Histogram +// metric type. See the Prometheus documentation for more details. +// +// To create Summary instances, use NewSummary. +type Summary interface { + Metric + Collector + + // Observe adds a single observation to the summary. + Observe(float64) +} + +// DefObjectives are the default Summary quantile values. +var ( + DefObjectives = map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001} + + errQuantileLabelNotAllowed = fmt.Errorf( + "%q is not allowed as label name in summaries", quantileLabel, + ) +) + +// Default values for SummaryOpts. +const ( + // DefMaxAge is the default duration for which observations stay + // relevant. + DefMaxAge time.Duration = 10 * time.Minute + // DefAgeBuckets is the default number of buckets used to calculate the + // age of observations. + DefAgeBuckets = 5 + // DefBufCap is the standard buffer size for collecting Summary observations. + DefBufCap = 500 +) + +// SummaryOpts bundles the options for creating a Summary metric. It is +// mandatory to set Name and Help to a non-empty string. All other fields are +// optional and can safely be left at their zero value. +type SummaryOpts struct { + // Namespace, Subsystem, and Name are components of the fully-qualified + // name of the Summary (created by joining these components with + // "_"). Only Name is mandatory, the others merely help structuring the + // name. Note that the fully-qualified name of the Summary must be a + // valid Prometheus metric name. + Namespace string + Subsystem string + Name string + + // Help provides information about this Summary. Mandatory! + // + // Metrics with the same fully-qualified name must have the same Help + // string. + Help string + + // ConstLabels are used to attach fixed labels to this + // Summary. Summaries with the same fully-qualified name must have the + // same label names in their ConstLabels. + // + // Note that in most cases, labels have a value that varies during the + // lifetime of a process. Those labels are usually managed with a + // SummaryVec. ConstLabels serve only special purposes. One is for the + // special case where the value of a label does not change during the + // lifetime of a process, e.g. if the revision of the running binary is + // put into a label. Another, more advanced purpose is if more than one + // Collector needs to collect Summaries with the same fully-qualified + // name. In that case, those Summaries must differ in the values of + // their ConstLabels. See the Collector examples. + // + // If the value of a label never changes (not even between binaries), + // that label most likely should not be a label at all (but part of the + // metric name). + ConstLabels Labels + + // Objectives defines the quantile rank estimates with their respective + // absolute error. If Objectives[q] = e, then the value reported + // for q will be the φ-quantile value for some φ between q-e and q+e. + // The default value is DefObjectives. + Objectives map[float64]float64 + + // MaxAge defines the duration for which an observation stays relevant + // for the summary. Must be positive. The default value is DefMaxAge. + MaxAge time.Duration + + // AgeBuckets is the number of buckets used to exclude observations that + // are older than MaxAge from the summary. A higher number has a + // resource penalty, so only increase it if the higher resolution is + // really required. For very high observation rates, you might want to + // reduce the number of age buckets. With only one age bucket, you will + // effectively see a complete reset of the summary each time MaxAge has + // passed. The default value is DefAgeBuckets. + AgeBuckets uint32 + + // BufCap defines the default sample stream buffer size. The default + // value of DefBufCap should suffice for most uses. If there is a need + // to increase the value, a multiple of 500 is recommended (because that + // is the internal buffer size of the underlying package + // "github.com/bmizerany/perks/quantile"). + BufCap uint32 +} + +// Great fuck-up with the sliding-window decay algorithm... The Merge method of +// perk/quantile is actually not working as advertised - and it might be +// unfixable, as the underlying algorithm is apparently not capable of merging +// summaries in the first place. To avoid using Merge, we are currently adding +// observations to _each_ age bucket, i.e. the effort to add a sample is +// essentially multiplied by the number of age buckets. When rotating age +// buckets, we empty the previous head stream. On scrape time, we simply take +// the quantiles from the head stream (no merging required). Result: More effort +// on observation time, less effort on scrape time, which is exactly the +// opposite of what we try to accomplish, but at least the results are correct. +// +// The quite elegant previous contraption to merge the age buckets efficiently +// on scrape time (see code up commit 6b9530d72ea715f0ba612c0120e6e09fbf1d49d0) +// can't be used anymore. + +// NewSummary creates a new Summary based on the provided SummaryOpts. +func NewSummary(opts SummaryOpts) Summary { + return newSummary( + NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), + opts, + ) +} + +func newSummary(desc *Desc, opts SummaryOpts, labelValues ...string) Summary { + if len(desc.variableLabels) != len(labelValues) { + panic(errInconsistentCardinality) + } + + for _, n := range desc.variableLabels { + if n == quantileLabel { + panic(errQuantileLabelNotAllowed) + } + } + for _, lp := range desc.constLabelPairs { + if lp.GetName() == quantileLabel { + panic(errQuantileLabelNotAllowed) + } + } + + if len(opts.Objectives) == 0 { + opts.Objectives = DefObjectives + } + + if opts.MaxAge < 0 { + panic(fmt.Errorf("illegal max age MaxAge=%v", opts.MaxAge)) + } + if opts.MaxAge == 0 { + opts.MaxAge = DefMaxAge + } + + if opts.AgeBuckets == 0 { + opts.AgeBuckets = DefAgeBuckets + } + + if opts.BufCap == 0 { + opts.BufCap = DefBufCap + } + + s := &summary{ + desc: desc, + + objectives: opts.Objectives, + sortedObjectives: make([]float64, 0, len(opts.Objectives)), + + labelPairs: makeLabelPairs(desc, labelValues), + + hotBuf: make([]float64, 0, opts.BufCap), + coldBuf: make([]float64, 0, opts.BufCap), + streamDuration: opts.MaxAge / time.Duration(opts.AgeBuckets), + } + s.headStreamExpTime = time.Now().Add(s.streamDuration) + s.hotBufExpTime = s.headStreamExpTime + + for i := uint32(0); i < opts.AgeBuckets; i++ { + s.streams = append(s.streams, s.newStream()) + } + s.headStream = s.streams[0] + + for qu := range s.objectives { + s.sortedObjectives = append(s.sortedObjectives, qu) + } + sort.Float64s(s.sortedObjectives) + + s.init(s) // Init self-collection. + return s +} + +type summary struct { + selfCollector + + bufMtx sync.Mutex // Protects hotBuf and hotBufExpTime. + mtx sync.Mutex // Protects every other moving part. + // Lock bufMtx before mtx if both are needed. + + desc *Desc + + objectives map[float64]float64 + sortedObjectives []float64 + + labelPairs []*dto.LabelPair + + sum float64 + cnt uint64 + + hotBuf, coldBuf []float64 + + streams []*quantile.Stream + streamDuration time.Duration + headStream *quantile.Stream + headStreamIdx int + headStreamExpTime, hotBufExpTime time.Time +} + +func (s *summary) Desc() *Desc { + return s.desc +} + +func (s *summary) Observe(v float64) { + s.bufMtx.Lock() + defer s.bufMtx.Unlock() + + now := time.Now() + if now.After(s.hotBufExpTime) { + s.asyncFlush(now) + } + s.hotBuf = append(s.hotBuf, v) + if len(s.hotBuf) == cap(s.hotBuf) { + s.asyncFlush(now) + } +} + +func (s *summary) Write(out *dto.Metric) error { + sum := &dto.Summary{} + qs := make([]*dto.Quantile, 0, len(s.objectives)) + + s.bufMtx.Lock() + s.mtx.Lock() + // Swap bufs even if hotBuf is empty to set new hotBufExpTime. + s.swapBufs(time.Now()) + s.bufMtx.Unlock() + + s.flushColdBuf() + sum.SampleCount = proto.Uint64(s.cnt) + sum.SampleSum = proto.Float64(s.sum) + + for _, rank := range s.sortedObjectives { + var q float64 + if s.headStream.Count() == 0 { + q = math.NaN() + } else { + q = s.headStream.Query(rank) + } + qs = append(qs, &dto.Quantile{ + Quantile: proto.Float64(rank), + Value: proto.Float64(q), + }) + } + + s.mtx.Unlock() + + if len(qs) > 0 { + sort.Sort(quantSort(qs)) + } + sum.Quantile = qs + + out.Summary = sum + out.Label = s.labelPairs + return nil +} + +func (s *summary) newStream() *quantile.Stream { + return quantile.NewTargeted(s.objectives) +} + +// asyncFlush needs bufMtx locked. +func (s *summary) asyncFlush(now time.Time) { + s.mtx.Lock() + s.swapBufs(now) + + // Unblock the original goroutine that was responsible for the mutation + // that triggered the compaction. But hold onto the global non-buffer + // state mutex until the operation finishes. + go func() { + s.flushColdBuf() + s.mtx.Unlock() + }() +} + +// rotateStreams needs mtx AND bufMtx locked. +func (s *summary) maybeRotateStreams() { + for !s.hotBufExpTime.Equal(s.headStreamExpTime) { + s.headStream.Reset() + s.headStreamIdx++ + if s.headStreamIdx >= len(s.streams) { + s.headStreamIdx = 0 + } + s.headStream = s.streams[s.headStreamIdx] + s.headStreamExpTime = s.headStreamExpTime.Add(s.streamDuration) + } +} + +// flushColdBuf needs mtx locked. +func (s *summary) flushColdBuf() { + for _, v := range s.coldBuf { + for _, stream := range s.streams { + stream.Insert(v) + } + s.cnt++ + s.sum += v + } + s.coldBuf = s.coldBuf[0:0] + s.maybeRotateStreams() +} + +// swapBufs needs mtx AND bufMtx locked, coldBuf must be empty. +func (s *summary) swapBufs(now time.Time) { + if len(s.coldBuf) != 0 { + panic("coldBuf is not empty") + } + s.hotBuf, s.coldBuf = s.coldBuf, s.hotBuf + // hotBuf is now empty and gets new expiration set. + for now.After(s.hotBufExpTime) { + s.hotBufExpTime = s.hotBufExpTime.Add(s.streamDuration) + } +} + +type quantSort []*dto.Quantile + +func (s quantSort) Len() int { + return len(s) +} + +func (s quantSort) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s quantSort) Less(i, j int) bool { + return s[i].GetQuantile() < s[j].GetQuantile() +} + +// SummaryVec is a Collector that bundles a set of Summaries that all share the +// same Desc, but have different values for their variable labels. This is used +// if you want to count the same thing partitioned by various dimensions +// (e.g. HTTP request latencies, partitioned by status code and method). Create +// instances with NewSummaryVec. +type SummaryVec struct { + *MetricVec +} + +// NewSummaryVec creates a new SummaryVec based on the provided SummaryOpts and +// partitioned by the given label names. At least one label name must be +// provided. +func NewSummaryVec(opts SummaryOpts, labelNames []string) *SummaryVec { + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + labelNames, + opts.ConstLabels, + ) + return &SummaryVec{ + MetricVec: newMetricVec(desc, func(lvs ...string) Metric { + return newSummary(desc, opts, lvs...) + }), + } +} + +// GetMetricWithLabelValues replaces the method of the same name in +// MetricVec. The difference is that this method returns a Summary and not a +// Metric so that no type conversion is required. +func (m *SummaryVec) GetMetricWithLabelValues(lvs ...string) (Summary, error) { + metric, err := m.MetricVec.GetMetricWithLabelValues(lvs...) + if metric != nil { + return metric.(Summary), err + } + return nil, err +} + +// GetMetricWith replaces the method of the same name in MetricVec. The +// difference is that this method returns a Summary and not a Metric so that no +// type conversion is required. +func (m *SummaryVec) GetMetricWith(labels Labels) (Summary, error) { + metric, err := m.MetricVec.GetMetricWith(labels) + if metric != nil { + return metric.(Summary), err + } + return nil, err +} + +// WithLabelValues works as GetMetricWithLabelValues, but panics where +// GetMetricWithLabelValues would have returned an error. By not returning an +// error, WithLabelValues allows shortcuts like +// myVec.WithLabelValues("404", "GET").Observe(42.21) +func (m *SummaryVec) WithLabelValues(lvs ...string) Summary { + return m.MetricVec.WithLabelValues(lvs...).(Summary) +} + +// With works as GetMetricWith, but panics where GetMetricWithLabels would have +// returned an error. By not returning an error, With allows shortcuts like +// myVec.With(Labels{"code": "404", "method": "GET"}).Observe(42.21) +func (m *SummaryVec) With(labels Labels) Summary { + return m.MetricVec.With(labels).(Summary) +} + +type constSummary struct { + desc *Desc + count uint64 + sum float64 + quantiles map[float64]float64 + labelPairs []*dto.LabelPair +} + +func (s *constSummary) Desc() *Desc { + return s.desc +} + +func (s *constSummary) Write(out *dto.Metric) error { + sum := &dto.Summary{} + qs := make([]*dto.Quantile, 0, len(s.quantiles)) + + sum.SampleCount = proto.Uint64(s.count) + sum.SampleSum = proto.Float64(s.sum) + + for rank, q := range s.quantiles { + qs = append(qs, &dto.Quantile{ + Quantile: proto.Float64(rank), + Value: proto.Float64(q), + }) + } + + if len(qs) > 0 { + sort.Sort(quantSort(qs)) + } + sum.Quantile = qs + + out.Summary = sum + out.Label = s.labelPairs + + return nil +} + +// NewConstSummary returns a metric representing a Prometheus summary with fixed +// values for the count, sum, and quantiles. As those parameters cannot be +// changed, the returned value does not implement the Summary interface (but +// only the Metric interface). Users of this package will not have much use for +// it in regular operations. However, when implementing custom Collectors, it is +// useful as a throw-away metric that is generated on the fly to send it to +// Prometheus in the Collect method. +// +// quantiles maps ranks to quantile values. For example, a median latency of +// 0.23s and a 99th percentile latency of 0.56s would be expressed as: +// map[float64]float64{0.5: 0.23, 0.99: 0.56} +// +// NewConstSummary returns an error if the length of labelValues is not +// consistent with the variable labels in Desc. +func NewConstSummary( + desc *Desc, + count uint64, + sum float64, + quantiles map[float64]float64, + labelValues ...string, +) (Metric, error) { + if len(desc.variableLabels) != len(labelValues) { + return nil, errInconsistentCardinality + } + return &constSummary{ + desc: desc, + count: count, + sum: sum, + quantiles: quantiles, + labelPairs: makeLabelPairs(desc, labelValues), + }, nil +} + +// MustNewConstSummary is a version of NewConstSummary that panics where +// NewConstMetric would have returned an error. +func MustNewConstSummary( + desc *Desc, + count uint64, + sum float64, + quantiles map[float64]float64, + labelValues ...string, +) Metric { + m, err := NewConstSummary(desc, count, sum, quantiles, labelValues...) + if err != nil { + panic(err) + } + return m +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/summary_test.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/summary_test.go new file mode 100644 index 0000000..c4575ff --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/summary_test.go @@ -0,0 +1,347 @@ +// Copyright 2014 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 prometheus + +import ( + "math" + "math/rand" + "sort" + "sync" + "testing" + "testing/quick" + "time" + + dto "github.com/prometheus/client_model/go" +) + +func benchmarkSummaryObserve(w int, b *testing.B) { + b.StopTimer() + + wg := new(sync.WaitGroup) + wg.Add(w) + + g := new(sync.WaitGroup) + g.Add(1) + + s := NewSummary(SummaryOpts{}) + + for i := 0; i < w; i++ { + go func() { + g.Wait() + + for i := 0; i < b.N; i++ { + s.Observe(float64(i)) + } + + wg.Done() + }() + } + + b.StartTimer() + g.Done() + wg.Wait() +} + +func BenchmarkSummaryObserve1(b *testing.B) { + benchmarkSummaryObserve(1, b) +} + +func BenchmarkSummaryObserve2(b *testing.B) { + benchmarkSummaryObserve(2, b) +} + +func BenchmarkSummaryObserve4(b *testing.B) { + benchmarkSummaryObserve(4, b) +} + +func BenchmarkSummaryObserve8(b *testing.B) { + benchmarkSummaryObserve(8, b) +} + +func benchmarkSummaryWrite(w int, b *testing.B) { + b.StopTimer() + + wg := new(sync.WaitGroup) + wg.Add(w) + + g := new(sync.WaitGroup) + g.Add(1) + + s := NewSummary(SummaryOpts{}) + + for i := 0; i < 1000000; i++ { + s.Observe(float64(i)) + } + + for j := 0; j < w; j++ { + outs := make([]dto.Metric, b.N) + + go func(o []dto.Metric) { + g.Wait() + + for i := 0; i < b.N; i++ { + s.Write(&o[i]) + } + + wg.Done() + }(outs) + } + + b.StartTimer() + g.Done() + wg.Wait() +} + +func BenchmarkSummaryWrite1(b *testing.B) { + benchmarkSummaryWrite(1, b) +} + +func BenchmarkSummaryWrite2(b *testing.B) { + benchmarkSummaryWrite(2, b) +} + +func BenchmarkSummaryWrite4(b *testing.B) { + benchmarkSummaryWrite(4, b) +} + +func BenchmarkSummaryWrite8(b *testing.B) { + benchmarkSummaryWrite(8, b) +} + +func TestSummaryConcurrency(t *testing.T) { + if testing.Short() { + t.Skip("Skipping test in short mode.") + } + + rand.Seed(42) + + it := func(n uint32) bool { + mutations := int(n%1e4 + 1e4) + concLevel := int(n%5 + 1) + total := mutations * concLevel + + var start, end sync.WaitGroup + start.Add(1) + end.Add(concLevel) + + sum := NewSummary(SummaryOpts{ + Name: "test_summary", + Help: "helpless", + }) + + allVars := make([]float64, total) + var sampleSum float64 + for i := 0; i < concLevel; i++ { + vals := make([]float64, mutations) + for j := 0; j < mutations; j++ { + v := rand.NormFloat64() + vals[j] = v + allVars[i*mutations+j] = v + sampleSum += v + } + + go func(vals []float64) { + start.Wait() + for _, v := range vals { + sum.Observe(v) + } + end.Done() + }(vals) + } + sort.Float64s(allVars) + start.Done() + end.Wait() + + m := &dto.Metric{} + sum.Write(m) + if got, want := int(*m.Summary.SampleCount), total; got != want { + t.Errorf("got sample count %d, want %d", got, want) + } + if got, want := *m.Summary.SampleSum, sampleSum; math.Abs((got-want)/want) > 0.001 { + t.Errorf("got sample sum %f, want %f", got, want) + } + + objectives := make([]float64, 0, len(DefObjectives)) + for qu := range DefObjectives { + objectives = append(objectives, qu) + } + sort.Float64s(objectives) + + for i, wantQ := range objectives { + ε := DefObjectives[wantQ] + gotQ := *m.Summary.Quantile[i].Quantile + gotV := *m.Summary.Quantile[i].Value + min, max := getBounds(allVars, wantQ, ε) + if gotQ != wantQ { + t.Errorf("got quantile %f, want %f", gotQ, wantQ) + } + if gotV < min || gotV > max { + t.Errorf("got %f for quantile %f, want [%f,%f]", gotV, gotQ, min, max) + } + } + return true + } + + if err := quick.Check(it, nil); err != nil { + t.Error(err) + } +} + +func TestSummaryVecConcurrency(t *testing.T) { + if testing.Short() { + t.Skip("Skipping test in short mode.") + } + + rand.Seed(42) + + objectives := make([]float64, 0, len(DefObjectives)) + for qu := range DefObjectives { + + objectives = append(objectives, qu) + } + sort.Float64s(objectives) + + it := func(n uint32) bool { + mutations := int(n%1e4 + 1e4) + concLevel := int(n%7 + 1) + vecLength := int(n%3 + 1) + + var start, end sync.WaitGroup + start.Add(1) + end.Add(concLevel) + + sum := NewSummaryVec( + SummaryOpts{ + Name: "test_summary", + Help: "helpless", + }, + []string{"label"}, + ) + + allVars := make([][]float64, vecLength) + sampleSums := make([]float64, vecLength) + for i := 0; i < concLevel; i++ { + vals := make([]float64, mutations) + picks := make([]int, mutations) + for j := 0; j < mutations; j++ { + v := rand.NormFloat64() + vals[j] = v + pick := rand.Intn(vecLength) + picks[j] = pick + allVars[pick] = append(allVars[pick], v) + sampleSums[pick] += v + } + + go func(vals []float64) { + start.Wait() + for i, v := range vals { + sum.WithLabelValues(string('A' + picks[i])).Observe(v) + } + end.Done() + }(vals) + } + for _, vars := range allVars { + sort.Float64s(vars) + } + start.Done() + end.Wait() + + for i := 0; i < vecLength; i++ { + m := &dto.Metric{} + s := sum.WithLabelValues(string('A' + i)) + s.Write(m) + if got, want := int(*m.Summary.SampleCount), len(allVars[i]); got != want { + t.Errorf("got sample count %d for label %c, want %d", got, 'A'+i, want) + } + if got, want := *m.Summary.SampleSum, sampleSums[i]; math.Abs((got-want)/want) > 0.001 { + t.Errorf("got sample sum %f for label %c, want %f", got, 'A'+i, want) + } + for j, wantQ := range objectives { + ε := DefObjectives[wantQ] + gotQ := *m.Summary.Quantile[j].Quantile + gotV := *m.Summary.Quantile[j].Value + min, max := getBounds(allVars[i], wantQ, ε) + if gotQ != wantQ { + t.Errorf("got quantile %f for label %c, want %f", gotQ, 'A'+i, wantQ) + } + if gotV < min || gotV > max { + t.Errorf("got %f for quantile %f for label %c, want [%f,%f]", gotV, gotQ, 'A'+i, min, max) + } + } + } + return true + } + + if err := quick.Check(it, nil); err != nil { + t.Error(err) + } +} + +func TestSummaryDecay(t *testing.T) { + if testing.Short() { + t.Skip("Skipping test in short mode.") + // More because it depends on timing than because it is particularly long... + } + + sum := NewSummary(SummaryOpts{ + Name: "test_summary", + Help: "helpless", + MaxAge: 100 * time.Millisecond, + Objectives: map[float64]float64{0.1: 0.001}, + AgeBuckets: 10, + }) + + m := &dto.Metric{} + i := 0 + tick := time.NewTicker(time.Millisecond) + for _ = range tick.C { + i++ + sum.Observe(float64(i)) + if i%10 == 0 { + sum.Write(m) + if got, want := *m.Summary.Quantile[0].Value, math.Max(float64(i)/10, float64(i-90)); math.Abs(got-want) > 20 { + t.Errorf("%d. got %f, want %f", i, got, want) + } + m.Reset() + } + if i >= 1000 { + break + } + } + tick.Stop() + // Wait for MaxAge without observations and make sure quantiles are NaN. + time.Sleep(100 * time.Millisecond) + sum.Write(m) + if got := *m.Summary.Quantile[0].Value; !math.IsNaN(got) { + t.Errorf("got %f, want NaN after expiration", got) + } +} + +func getBounds(vars []float64, q, ε float64) (min, max float64) { + // TODO(beorn7): This currently tolerates an error of up to 2*ε. The + // error must be at most ε, but for some reason, it's sometimes slightly + // higher. That's a bug. + n := float64(len(vars)) + lower := int((q - 2*ε) * n) + upper := int(math.Ceil((q + 2*ε) * n)) + min = vars[0] + if lower > 1 { + min = vars[lower-1] + } + max = vars[len(vars)-1] + if upper < len(vars) { + max = vars[upper-1] + } + return +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/untyped.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/untyped.go new file mode 100644 index 0000000..5faf7e6 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/untyped.go @@ -0,0 +1,138 @@ +// Copyright 2014 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 prometheus + +// Untyped is a Metric that represents a single numerical value that can +// arbitrarily go up and down. +// +// An Untyped metric works the same as a Gauge. The only difference is that to +// no type information is implied. +// +// To create Untyped instances, use NewUntyped. +type Untyped interface { + Metric + Collector + + // Set sets the Untyped metric to an arbitrary value. + Set(float64) + // Inc increments the Untyped metric by 1. + Inc() + // Dec decrements the Untyped metric by 1. + Dec() + // Add adds the given value to the Untyped metric. (The value can be + // negative, resulting in a decrease.) + Add(float64) + // Sub subtracts the given value from the Untyped metric. (The value can + // be negative, resulting in an increase.) + Sub(float64) +} + +// UntypedOpts is an alias for Opts. See there for doc comments. +type UntypedOpts Opts + +// NewUntyped creates a new Untyped metric from the provided UntypedOpts. +func NewUntyped(opts UntypedOpts) Untyped { + return newValue(NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), UntypedValue, 0) +} + +// UntypedVec is a Collector that bundles a set of Untyped metrics that all +// share the same Desc, but have different values for their variable +// labels. This is used if you want to count the same thing partitioned by +// various dimensions. Create instances with NewUntypedVec. +type UntypedVec struct { + *MetricVec +} + +// NewUntypedVec creates a new UntypedVec based on the provided UntypedOpts and +// partitioned by the given label names. At least one label name must be +// provided. +func NewUntypedVec(opts UntypedOpts, labelNames []string) *UntypedVec { + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + labelNames, + opts.ConstLabels, + ) + return &UntypedVec{ + MetricVec: newMetricVec(desc, func(lvs ...string) Metric { + return newValue(desc, UntypedValue, 0, lvs...) + }), + } +} + +// GetMetricWithLabelValues replaces the method of the same name in +// MetricVec. The difference is that this method returns an Untyped and not a +// Metric so that no type conversion is required. +func (m *UntypedVec) GetMetricWithLabelValues(lvs ...string) (Untyped, error) { + metric, err := m.MetricVec.GetMetricWithLabelValues(lvs...) + if metric != nil { + return metric.(Untyped), err + } + return nil, err +} + +// GetMetricWith replaces the method of the same name in MetricVec. The +// difference is that this method returns an Untyped and not a Metric so that no +// type conversion is required. +func (m *UntypedVec) GetMetricWith(labels Labels) (Untyped, error) { + metric, err := m.MetricVec.GetMetricWith(labels) + if metric != nil { + return metric.(Untyped), err + } + return nil, err +} + +// WithLabelValues works as GetMetricWithLabelValues, but panics where +// GetMetricWithLabelValues would have returned an error. By not returning an +// error, WithLabelValues allows shortcuts like +// myVec.WithLabelValues("404", "GET").Add(42) +func (m *UntypedVec) WithLabelValues(lvs ...string) Untyped { + return m.MetricVec.WithLabelValues(lvs...).(Untyped) +} + +// With works as GetMetricWith, but panics where GetMetricWithLabels would have +// returned an error. By not returning an error, With allows shortcuts like +// myVec.With(Labels{"code": "404", "method": "GET"}).Add(42) +func (m *UntypedVec) With(labels Labels) Untyped { + return m.MetricVec.With(labels).(Untyped) +} + +// UntypedFunc is an Untyped whose value is determined at collect time by +// calling a provided function. +// +// To create UntypedFunc instances, use NewUntypedFunc. +type UntypedFunc interface { + Metric + Collector +} + +// NewUntypedFunc creates a new UntypedFunc based on the provided +// UntypedOpts. The value reported is determined by calling the given function +// from within the Write method. Take into account that metric collection may +// happen concurrently. If that results in concurrent calls to Write, like in +// the case where an UntypedFunc is directly registered with Prometheus, the +// provided function must be concurrency-safe. +func NewUntypedFunc(opts UntypedOpts, function func() float64) UntypedFunc { + return newValueFunc(NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), UntypedValue, function) +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/value.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/value.go new file mode 100644 index 0000000..a944c37 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/value.go @@ -0,0 +1,234 @@ +// Copyright 2014 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 prometheus + +import ( + "errors" + "fmt" + "math" + "sort" + "sync/atomic" + + dto "github.com/prometheus/client_model/go" + + "github.com/golang/protobuf/proto" +) + +// ValueType is an enumeration of metric types that represent a simple value. +type ValueType int + +// Possible values for the ValueType enum. +const ( + _ ValueType = iota + CounterValue + GaugeValue + UntypedValue +) + +var errInconsistentCardinality = errors.New("inconsistent label cardinality") + +// value is a generic metric for simple values. It implements Metric, Collector, +// Counter, Gauge, and Untyped. Its effective type is determined by +// ValueType. This is a low-level building block used by the library to back the +// implementations of Counter, Gauge, and Untyped. +type value struct { + // valBits containst the bits of the represented float64 value. It has + // to go first in the struct to guarantee alignment for atomic + // operations. http://golang.org/pkg/sync/atomic/#pkg-note-BUG + valBits uint64 + + selfCollector + + desc *Desc + valType ValueType + labelPairs []*dto.LabelPair +} + +// newValue returns a newly allocated value with the given Desc, ValueType, +// sample value and label values. It panics if the number of label +// values is different from the number of variable labels in Desc. +func newValue(desc *Desc, valueType ValueType, val float64, labelValues ...string) *value { + if len(labelValues) != len(desc.variableLabels) { + panic(errInconsistentCardinality) + } + result := &value{ + desc: desc, + valType: valueType, + valBits: math.Float64bits(val), + labelPairs: makeLabelPairs(desc, labelValues), + } + result.init(result) + return result +} + +func (v *value) Desc() *Desc { + return v.desc +} + +func (v *value) Set(val float64) { + atomic.StoreUint64(&v.valBits, math.Float64bits(val)) +} + +func (v *value) Inc() { + v.Add(1) +} + +func (v *value) Dec() { + v.Add(-1) +} + +func (v *value) Add(val float64) { + for { + oldBits := atomic.LoadUint64(&v.valBits) + newBits := math.Float64bits(math.Float64frombits(oldBits) + val) + if atomic.CompareAndSwapUint64(&v.valBits, oldBits, newBits) { + return + } + } +} + +func (v *value) Sub(val float64) { + v.Add(val * -1) +} + +func (v *value) Write(out *dto.Metric) error { + val := math.Float64frombits(atomic.LoadUint64(&v.valBits)) + return populateMetric(v.valType, val, v.labelPairs, out) +} + +// valueFunc is a generic metric for simple values retrieved on collect time +// from a function. It implements Metric and Collector. Its effective type is +// determined by ValueType. This is a low-level building block used by the +// library to back the implementations of CounterFunc, GaugeFunc, and +// UntypedFunc. +type valueFunc struct { + selfCollector + + desc *Desc + valType ValueType + function func() float64 + labelPairs []*dto.LabelPair +} + +// newValueFunc returns a newly allocated valueFunc with the given Desc and +// ValueType. The value reported is determined by calling the given function +// from within the Write method. Take into account that metric collection may +// happen concurrently. If that results in concurrent calls to Write, like in +// the case where a valueFunc is directly registered with Prometheus, the +// provided function must be concurrency-safe. +func newValueFunc(desc *Desc, valueType ValueType, function func() float64) *valueFunc { + result := &valueFunc{ + desc: desc, + valType: valueType, + function: function, + labelPairs: makeLabelPairs(desc, nil), + } + result.init(result) + return result +} + +func (v *valueFunc) Desc() *Desc { + return v.desc +} + +func (v *valueFunc) Write(out *dto.Metric) error { + return populateMetric(v.valType, v.function(), v.labelPairs, out) +} + +// NewConstMetric returns a metric with one fixed value that cannot be +// changed. Users of this package will not have much use for it in regular +// operations. However, when implementing custom Collectors, it is useful as a +// throw-away metric that is generated on the fly to send it to Prometheus in +// the Collect method. NewConstMetric returns an error if the length of +// labelValues is not consistent with the variable labels in Desc. +func NewConstMetric(desc *Desc, valueType ValueType, value float64, labelValues ...string) (Metric, error) { + if len(desc.variableLabels) != len(labelValues) { + return nil, errInconsistentCardinality + } + return &constMetric{ + desc: desc, + valType: valueType, + val: value, + labelPairs: makeLabelPairs(desc, labelValues), + }, nil +} + +// MustNewConstMetric is a version of NewConstMetric that panics where +// NewConstMetric would have returned an error. +func MustNewConstMetric(desc *Desc, valueType ValueType, value float64, labelValues ...string) Metric { + m, err := NewConstMetric(desc, valueType, value, labelValues...) + if err != nil { + panic(err) + } + return m +} + +type constMetric struct { + desc *Desc + valType ValueType + val float64 + labelPairs []*dto.LabelPair +} + +func (m *constMetric) Desc() *Desc { + return m.desc +} + +func (m *constMetric) Write(out *dto.Metric) error { + return populateMetric(m.valType, m.val, m.labelPairs, out) +} + +func populateMetric( + t ValueType, + v float64, + labelPairs []*dto.LabelPair, + m *dto.Metric, +) error { + m.Label = labelPairs + switch t { + case CounterValue: + m.Counter = &dto.Counter{Value: proto.Float64(v)} + case GaugeValue: + m.Gauge = &dto.Gauge{Value: proto.Float64(v)} + case UntypedValue: + m.Untyped = &dto.Untyped{Value: proto.Float64(v)} + default: + return fmt.Errorf("encountered unknown type %v", t) + } + return nil +} + +func makeLabelPairs(desc *Desc, labelValues []string) []*dto.LabelPair { + totalLen := len(desc.variableLabels) + len(desc.constLabelPairs) + if totalLen == 0 { + // Super fast path. + return nil + } + if len(desc.variableLabels) == 0 { + // Moderately fast path. + return desc.constLabelPairs + } + labelPairs := make([]*dto.LabelPair, 0, totalLen) + for i, n := range desc.variableLabels { + labelPairs = append(labelPairs, &dto.LabelPair{ + Name: proto.String(n), + Value: proto.String(labelValues[i]), + }) + } + for _, lp := range desc.constLabelPairs { + labelPairs = append(labelPairs, lp) + } + sort.Sort(LabelPairSorter(labelPairs)) + return labelPairs +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/vec.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/vec.go new file mode 100644 index 0000000..7f3eef9 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/vec.go @@ -0,0 +1,404 @@ +// Copyright 2014 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 prometheus + +import ( + "fmt" + "sync" + + "github.com/prometheus/common/model" +) + +// MetricVec is a Collector to bundle metrics of the same name that +// differ in their label values. MetricVec is usually not used directly but as a +// building block for implementations of vectors of a given metric +// type. GaugeVec, CounterVec, SummaryVec, and UntypedVec are examples already +// provided in this package. +type MetricVec struct { + mtx sync.RWMutex // Protects the children. + children map[uint64][]metricWithLabelValues + desc *Desc + + newMetric func(labelValues ...string) Metric + hashAdd func(h uint64, s string) uint64 // replace hash function for testing collision handling + hashAddByte func(h uint64, b byte) uint64 +} + +// newMetricVec returns an initialized MetricVec. The concrete value is +// returned for embedding into another struct. +func newMetricVec(desc *Desc, newMetric func(lvs ...string) Metric) *MetricVec { + return &MetricVec{ + children: map[uint64][]metricWithLabelValues{}, + desc: desc, + newMetric: newMetric, + hashAdd: hashAdd, + hashAddByte: hashAddByte, + } +} + +// metricWithLabelValues provides the metric and its label values for +// disambiguation on hash collision. +type metricWithLabelValues struct { + values []string + metric Metric +} + +// Describe implements Collector. The length of the returned slice +// is always one. +func (m *MetricVec) Describe(ch chan<- *Desc) { + ch <- m.desc +} + +// Collect implements Collector. +func (m *MetricVec) Collect(ch chan<- Metric) { + m.mtx.RLock() + defer m.mtx.RUnlock() + + for _, metrics := range m.children { + for _, metric := range metrics { + ch <- metric.metric + } + } +} + +// GetMetricWithLabelValues returns the Metric for the given slice of label +// values (same order as the VariableLabels in Desc). If that combination of +// label values is accessed for the first time, a new Metric is created. +// +// It is possible to call this method without using the returned Metric to only +// create the new Metric but leave it at its start value (e.g. a Summary or +// Histogram without any observations). See also the SummaryVec example. +// +// Keeping the Metric for later use is possible (and should be considered if +// performance is critical), but keep in mind that Reset, DeleteLabelValues and +// Delete can be used to delete the Metric from the MetricVec. In that case, the +// Metric will still exist, but it will not be exported anymore, even if a +// Metric with the same label values is created later. See also the CounterVec +// example. +// +// An error is returned if the number of label values is not the same as the +// number of VariableLabels in Desc. +// +// Note that for more than one label value, this method is prone to mistakes +// caused by an incorrect order of arguments. Consider GetMetricWith(Labels) as +// an alternative to avoid that type of mistake. For higher label numbers, the +// latter has a much more readable (albeit more verbose) syntax, but it comes +// with a performance overhead (for creating and processing the Labels map). +// See also the GaugeVec example. +func (m *MetricVec) GetMetricWithLabelValues(lvs ...string) (Metric, error) { + h, err := m.hashLabelValues(lvs) + if err != nil { + return nil, err + } + + return m.getOrCreateMetricWithLabelValues(h, lvs), nil +} + +// GetMetricWith returns the Metric for the given Labels map (the label names +// must match those of the VariableLabels in Desc). If that label map is +// accessed for the first time, a new Metric is created. Implications of +// creating a Metric without using it and keeping the Metric for later use are +// the same as for GetMetricWithLabelValues. +// +// An error is returned if the number and names of the Labels are inconsistent +// with those of the VariableLabels in Desc. +// +// This method is used for the same purpose as +// GetMetricWithLabelValues(...string). See there for pros and cons of the two +// methods. +func (m *MetricVec) GetMetricWith(labels Labels) (Metric, error) { + h, err := m.hashLabels(labels) + if err != nil { + return nil, err + } + + return m.getOrCreateMetricWithLabels(h, labels), nil +} + +// WithLabelValues works as GetMetricWithLabelValues, but panics if an error +// occurs. The method allows neat syntax like: +// httpReqs.WithLabelValues("404", "POST").Inc() +func (m *MetricVec) WithLabelValues(lvs ...string) Metric { + metric, err := m.GetMetricWithLabelValues(lvs...) + if err != nil { + panic(err) + } + return metric +} + +// With works as GetMetricWith, but panics if an error occurs. The method allows +// neat syntax like: +// httpReqs.With(Labels{"status":"404", "method":"POST"}).Inc() +func (m *MetricVec) With(labels Labels) Metric { + metric, err := m.GetMetricWith(labels) + if err != nil { + panic(err) + } + return metric +} + +// DeleteLabelValues removes the metric where the variable labels are the same +// as those passed in as labels (same order as the VariableLabels in Desc). It +// returns true if a metric was deleted. +// +// It is not an error if the number of label values is not the same as the +// number of VariableLabels in Desc. However, such inconsistent label count can +// never match an actual Metric, so the method will always return false in that +// case. +// +// Note that for more than one label value, this method is prone to mistakes +// caused by an incorrect order of arguments. Consider Delete(Labels) as an +// alternative to avoid that type of mistake. For higher label numbers, the +// latter has a much more readable (albeit more verbose) syntax, but it comes +// with a performance overhead (for creating and processing the Labels map). +// See also the CounterVec example. +func (m *MetricVec) DeleteLabelValues(lvs ...string) bool { + m.mtx.Lock() + defer m.mtx.Unlock() + + h, err := m.hashLabelValues(lvs) + if err != nil { + return false + } + return m.deleteByHashWithLabelValues(h, lvs) +} + +// Delete deletes the metric where the variable labels are the same as those +// passed in as labels. It returns true if a metric was deleted. +// +// It is not an error if the number and names of the Labels are inconsistent +// with those of the VariableLabels in the Desc of the MetricVec. However, such +// inconsistent Labels can never match an actual Metric, so the method will +// always return false in that case. +// +// This method is used for the same purpose as DeleteLabelValues(...string). See +// there for pros and cons of the two methods. +func (m *MetricVec) Delete(labels Labels) bool { + m.mtx.Lock() + defer m.mtx.Unlock() + + h, err := m.hashLabels(labels) + if err != nil { + return false + } + + return m.deleteByHashWithLabels(h, labels) +} + +// deleteByHashWithLabelValues removes the metric from the hash bucket h. If +// there are multiple matches in the bucket, use lvs to select a metric and +// remove only that metric. +func (m *MetricVec) deleteByHashWithLabelValues(h uint64, lvs []string) bool { + metrics, ok := m.children[h] + if !ok { + return false + } + + i := m.findMetricWithLabelValues(metrics, lvs) + if i >= len(metrics) { + return false + } + + if len(metrics) > 1 { + m.children[h] = append(metrics[:i], metrics[i+1:]...) + } else { + delete(m.children, h) + } + return true +} + +// deleteByHashWithLabels removes the metric from the hash bucket h. If there +// are multiple matches in the bucket, use lvs to select a metric and remove +// only that metric. +func (m *MetricVec) deleteByHashWithLabels(h uint64, labels Labels) bool { + metrics, ok := m.children[h] + if !ok { + return false + } + i := m.findMetricWithLabels(metrics, labels) + if i >= len(metrics) { + return false + } + + if len(metrics) > 1 { + m.children[h] = append(metrics[:i], metrics[i+1:]...) + } else { + delete(m.children, h) + } + return true +} + +// Reset deletes all metrics in this vector. +func (m *MetricVec) Reset() { + m.mtx.Lock() + defer m.mtx.Unlock() + + for h := range m.children { + delete(m.children, h) + } +} + +func (m *MetricVec) hashLabelValues(vals []string) (uint64, error) { + if len(vals) != len(m.desc.variableLabels) { + return 0, errInconsistentCardinality + } + h := hashNew() + for _, val := range vals { + h = m.hashAdd(h, val) + h = m.hashAddByte(h, model.SeparatorByte) + } + return h, nil +} + +func (m *MetricVec) hashLabels(labels Labels) (uint64, error) { + if len(labels) != len(m.desc.variableLabels) { + return 0, errInconsistentCardinality + } + h := hashNew() + for _, label := range m.desc.variableLabels { + val, ok := labels[label] + if !ok { + return 0, fmt.Errorf("label name %q missing in label map", label) + } + h = m.hashAdd(h, val) + h = m.hashAddByte(h, model.SeparatorByte) + } + return h, nil +} + +// getOrCreateMetricWithLabelValues retrieves the metric by hash and label value +// or creates it and returns the new one. +// +// This function holds the mutex. +func (m *MetricVec) getOrCreateMetricWithLabelValues(hash uint64, lvs []string) Metric { + m.mtx.RLock() + metric, ok := m.getMetricWithLabelValues(hash, lvs) + m.mtx.RUnlock() + if ok { + return metric + } + + m.mtx.Lock() + defer m.mtx.Unlock() + metric, ok = m.getMetricWithLabelValues(hash, lvs) + if !ok { + // Copy to avoid allocation in case wo don't go down this code path. + copiedLVs := make([]string, len(lvs)) + copy(copiedLVs, lvs) + metric = m.newMetric(copiedLVs...) + m.children[hash] = append(m.children[hash], metricWithLabelValues{values: copiedLVs, metric: metric}) + } + return metric +} + +// getOrCreateMetricWithLabelValues retrieves the metric by hash and label value +// or creates it and returns the new one. +// +// This function holds the mutex. +func (m *MetricVec) getOrCreateMetricWithLabels(hash uint64, labels Labels) Metric { + m.mtx.RLock() + metric, ok := m.getMetricWithLabels(hash, labels) + m.mtx.RUnlock() + if ok { + return metric + } + + m.mtx.Lock() + defer m.mtx.Unlock() + metric, ok = m.getMetricWithLabels(hash, labels) + if !ok { + lvs := m.extractLabelValues(labels) + metric = m.newMetric(lvs...) + m.children[hash] = append(m.children[hash], metricWithLabelValues{values: lvs, metric: metric}) + } + return metric +} + +// getMetricWithLabelValues gets a metric while handling possible collisions in +// the hash space. Must be called while holding read mutex. +func (m *MetricVec) getMetricWithLabelValues(h uint64, lvs []string) (Metric, bool) { + metrics, ok := m.children[h] + if ok { + if i := m.findMetricWithLabelValues(metrics, lvs); i < len(metrics) { + return metrics[i].metric, true + } + } + return nil, false +} + +// getMetricWithLabels gets a metric while handling possible collisions in +// the hash space. Must be called while holding read mutex. +func (m *MetricVec) getMetricWithLabels(h uint64, labels Labels) (Metric, bool) { + metrics, ok := m.children[h] + if ok { + if i := m.findMetricWithLabels(metrics, labels); i < len(metrics) { + return metrics[i].metric, true + } + } + return nil, false +} + +// findMetricWithLabelValues returns the index of the matching metric or +// len(metrics) if not found. +func (m *MetricVec) findMetricWithLabelValues(metrics []metricWithLabelValues, lvs []string) int { + for i, metric := range metrics { + if m.matchLabelValues(metric.values, lvs) { + return i + } + } + return len(metrics) +} + +// findMetricWithLabels returns the index of the matching metric or len(metrics) +// if not found. +func (m *MetricVec) findMetricWithLabels(metrics []metricWithLabelValues, labels Labels) int { + for i, metric := range metrics { + if m.matchLabels(metric.values, labels) { + return i + } + } + return len(metrics) +} + +func (m *MetricVec) matchLabelValues(values []string, lvs []string) bool { + if len(values) != len(lvs) { + return false + } + for i, v := range values { + if v != lvs[i] { + return false + } + } + return true +} + +func (m *MetricVec) matchLabels(values []string, labels Labels) bool { + if len(labels) != len(values) { + return false + } + for i, k := range m.desc.variableLabels { + if values[i] != labels[k] { + return false + } + } + return true +} + +func (m *MetricVec) extractLabelValues(labels Labels) []string { + labelValues := make([]string, len(labels)) + for i, k := range m.desc.variableLabels { + labelValues[i] = labels[k] + } + return labelValues +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/vec_test.go b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/vec_test.go new file mode 100644 index 0000000..445a6b3 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_golang/prometheus/vec_test.go @@ -0,0 +1,312 @@ +// Copyright 2014 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 prometheus + +import ( + "fmt" + "testing" + + dto "github.com/prometheus/client_model/go" +) + +func TestDelete(t *testing.T) { + vec := NewUntypedVec( + UntypedOpts{ + Name: "test", + Help: "helpless", + }, + []string{"l1", "l2"}, + ) + testDelete(t, vec) +} + +func TestDeleteWithCollisions(t *testing.T) { + vec := NewUntypedVec( + UntypedOpts{ + Name: "test", + Help: "helpless", + }, + []string{"l1", "l2"}, + ) + vec.hashAdd = func(h uint64, s string) uint64 { return 1 } + vec.hashAddByte = func(h uint64, b byte) uint64 { return 1 } + testDelete(t, vec) +} + +func testDelete(t *testing.T, vec *UntypedVec) { + if got, want := vec.Delete(Labels{"l1": "v1", "l2": "v2"}), false; got != want { + t.Errorf("got %v, want %v", got, want) + } + + vec.With(Labels{"l1": "v1", "l2": "v2"}).(Untyped).Set(42) + if got, want := vec.Delete(Labels{"l1": "v1", "l2": "v2"}), true; got != want { + t.Errorf("got %v, want %v", got, want) + } + if got, want := vec.Delete(Labels{"l1": "v1", "l2": "v2"}), false; got != want { + t.Errorf("got %v, want %v", got, want) + } + + vec.With(Labels{"l1": "v1", "l2": "v2"}).(Untyped).Set(42) + if got, want := vec.Delete(Labels{"l2": "v2", "l1": "v1"}), true; got != want { + t.Errorf("got %v, want %v", got, want) + } + if got, want := vec.Delete(Labels{"l2": "v2", "l1": "v1"}), false; got != want { + t.Errorf("got %v, want %v", got, want) + } + + vec.With(Labels{"l1": "v1", "l2": "v2"}).(Untyped).Set(42) + if got, want := vec.Delete(Labels{"l2": "v1", "l1": "v2"}), false; got != want { + t.Errorf("got %v, want %v", got, want) + } + if got, want := vec.Delete(Labels{"l1": "v1"}), false; got != want { + t.Errorf("got %v, want %v", got, want) + } +} + +func TestDeleteLabelValues(t *testing.T) { + vec := NewUntypedVec( + UntypedOpts{ + Name: "test", + Help: "helpless", + }, + []string{"l1", "l2"}, + ) + testDeleteLabelValues(t, vec) +} + +func TestDeleteLabelValuesWithCollisions(t *testing.T) { + vec := NewUntypedVec( + UntypedOpts{ + Name: "test", + Help: "helpless", + }, + []string{"l1", "l2"}, + ) + vec.hashAdd = func(h uint64, s string) uint64 { return 1 } + vec.hashAddByte = func(h uint64, b byte) uint64 { return 1 } + testDeleteLabelValues(t, vec) +} + +func testDeleteLabelValues(t *testing.T, vec *UntypedVec) { + if got, want := vec.DeleteLabelValues("v1", "v2"), false; got != want { + t.Errorf("got %v, want %v", got, want) + } + + vec.With(Labels{"l1": "v1", "l2": "v2"}).(Untyped).Set(42) + vec.With(Labels{"l1": "v1", "l2": "v3"}).(Untyped).Set(42) // Add junk data for collision. + if got, want := vec.DeleteLabelValues("v1", "v2"), true; got != want { + t.Errorf("got %v, want %v", got, want) + } + if got, want := vec.DeleteLabelValues("v1", "v2"), false; got != want { + t.Errorf("got %v, want %v", got, want) + } + if got, want := vec.DeleteLabelValues("v1", "v3"), true; got != want { + t.Errorf("got %v, want %v", got, want) + } + + vec.With(Labels{"l1": "v1", "l2": "v2"}).(Untyped).Set(42) + // Delete out of order. + if got, want := vec.DeleteLabelValues("v2", "v1"), false; got != want { + t.Errorf("got %v, want %v", got, want) + } + if got, want := vec.DeleteLabelValues("v1"), false; got != want { + t.Errorf("got %v, want %v", got, want) + } +} + +func TestMetricVec(t *testing.T) { + vec := NewUntypedVec( + UntypedOpts{ + Name: "test", + Help: "helpless", + }, + []string{"l1", "l2"}, + ) + testMetricVec(t, vec) +} + +func TestMetricVecWithCollisions(t *testing.T) { + vec := NewUntypedVec( + UntypedOpts{ + Name: "test", + Help: "helpless", + }, + []string{"l1", "l2"}, + ) + vec.hashAdd = func(h uint64, s string) uint64 { return 1 } + vec.hashAddByte = func(h uint64, b byte) uint64 { return 1 } + testMetricVec(t, vec) +} + +func testMetricVec(t *testing.T, vec *UntypedVec) { + vec.Reset() // Actually test Reset now! + + var pair [2]string + // Keep track of metrics. + expected := map[[2]string]int{} + + for i := 0; i < 1000; i++ { + pair[0], pair[1] = fmt.Sprint(i%4), fmt.Sprint(i%5) // Varying combinations multiples. + expected[pair]++ + vec.WithLabelValues(pair[0], pair[1]).Inc() + + expected[[2]string{"v1", "v2"}]++ + vec.WithLabelValues("v1", "v2").(Untyped).Inc() + } + + var total int + for _, metrics := range vec.children { + for _, metric := range metrics { + total++ + copy(pair[:], metric.values) + + var metricOut dto.Metric + if err := metric.metric.Write(&metricOut); err != nil { + t.Fatal(err) + } + actual := *metricOut.Untyped.Value + + var actualPair [2]string + for i, label := range metricOut.Label { + actualPair[i] = *label.Value + } + + // Test output pair against metric.values to ensure we've selected + // the right one. We check this to ensure the below check means + // anything at all. + if actualPair != pair { + t.Fatalf("unexpected pair association in metric map: %v != %v", actualPair, pair) + } + + if actual != float64(expected[pair]) { + t.Fatalf("incorrect counter value for %v: %v != %v", pair, actual, expected[pair]) + } + } + } + + if total != len(expected) { + t.Fatalf("unexpected number of metrics: %v != %v", total, len(expected)) + } + + vec.Reset() + + if len(vec.children) > 0 { + t.Fatalf("reset failed") + } +} + +func TestCounterVecEndToEndWithCollision(t *testing.T) { + vec := NewCounterVec( + CounterOpts{ + Name: "test", + Help: "helpless", + }, + []string{"labelname"}, + ) + vec.WithLabelValues("77kepQFQ8Kl").Inc() + vec.WithLabelValues("!0IC=VloaY").Add(2) + + m := &dto.Metric{} + if err := vec.WithLabelValues("77kepQFQ8Kl").Write(m); err != nil { + t.Fatal(err) + } + if got, want := m.GetLabel()[0].GetValue(), "77kepQFQ8Kl"; got != want { + t.Errorf("got label value %q, want %q", got, want) + } + if got, want := m.GetCounter().GetValue(), 1.; got != want { + t.Errorf("got value %f, want %f", got, want) + } + m.Reset() + if err := vec.WithLabelValues("!0IC=VloaY").Write(m); err != nil { + t.Fatal(err) + } + if got, want := m.GetLabel()[0].GetValue(), "!0IC=VloaY"; got != want { + t.Errorf("got label value %q, want %q", got, want) + } + if got, want := m.GetCounter().GetValue(), 2.; got != want { + t.Errorf("got value %f, want %f", got, want) + } +} + +func BenchmarkMetricVecWithLabelValuesBasic(b *testing.B) { + benchmarkMetricVecWithLabelValues(b, map[string][]string{ + "l1": []string{"onevalue"}, + "l2": []string{"twovalue"}, + }) +} + +func BenchmarkMetricVecWithLabelValues2Keys10ValueCardinality(b *testing.B) { + benchmarkMetricVecWithLabelValuesCardinality(b, 2, 10) +} + +func BenchmarkMetricVecWithLabelValues4Keys10ValueCardinality(b *testing.B) { + benchmarkMetricVecWithLabelValuesCardinality(b, 4, 10) +} + +func BenchmarkMetricVecWithLabelValues2Keys100ValueCardinality(b *testing.B) { + benchmarkMetricVecWithLabelValuesCardinality(b, 2, 100) +} + +func BenchmarkMetricVecWithLabelValues10Keys100ValueCardinality(b *testing.B) { + benchmarkMetricVecWithLabelValuesCardinality(b, 10, 100) +} + +func BenchmarkMetricVecWithLabelValues10Keys1000ValueCardinality(b *testing.B) { + benchmarkMetricVecWithLabelValuesCardinality(b, 10, 1000) +} + +func benchmarkMetricVecWithLabelValuesCardinality(b *testing.B, nkeys, nvalues int) { + labels := map[string][]string{} + + for i := 0; i < nkeys; i++ { + var ( + k = fmt.Sprintf("key-%v", i) + vs = make([]string, 0, nvalues) + ) + for j := 0; j < nvalues; j++ { + vs = append(vs, fmt.Sprintf("value-%v", j)) + } + labels[k] = vs + } + + benchmarkMetricVecWithLabelValues(b, labels) +} + +func benchmarkMetricVecWithLabelValues(b *testing.B, labels map[string][]string) { + var keys []string + for k := range labels { // Map order dependent, who cares though. + keys = append(keys, k) + } + + values := make([]string, len(labels)) // Value cache for permutations. + vec := NewUntypedVec( + UntypedOpts{ + Name: "test", + Help: "helpless", + }, + keys, + ) + + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + // Varies input across provide map entries based on key size. + for j, k := range keys { + candidates := labels[k] + values[j] = candidates[i%len(candidates)] + } + + vec.WithLabelValues(values...) + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_model/.gitignore b/example/prometheus-mock/vendor/github.com/prometheus/client_model/.gitignore new file mode 100644 index 0000000..2f7896d --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_model/.gitignore @@ -0,0 +1 @@ +target/ diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_model/CONTRIBUTING.md b/example/prometheus-mock/vendor/github.com/prometheus/client_model/CONTRIBUTING.md new file mode 100644 index 0000000..40503ed --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_model/CONTRIBUTING.md @@ -0,0 +1,18 @@ +# Contributing + +Prometheus uses GitHub to manage reviews of pull requests. + +* If you have a trivial fix or improvement, go ahead and create a pull request, + addressing (with `@...`) the maintainer of this repository (see + [MAINTAINERS.md](MAINTAINERS.md)) in the description of the pull request. + +* If you plan to do something more involved, first discuss your ideas + on our [mailing list](https://groups.google.com/forum/?fromgroups#!forum/prometheus-developers). + This will avoid unnecessary work and surely give you and us a good deal + of inspiration. + +* Relevant coding style guidelines are the [Go Code Review + Comments](https://code.google.com/p/go-wiki/wiki/CodeReviewComments) + and the _Formatting and style_ section of Peter Bourgon's [Go: Best + Practices for Production + Environments](http://peter.bourgon.org/go-in-production/#formatting-and-style). diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_model/LICENSE b/example/prometheus-mock/vendor/github.com/prometheus/client_model/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_model/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 [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/example/prometheus-mock/vendor/github.com/prometheus/client_model/MAINTAINERS.md b/example/prometheus-mock/vendor/github.com/prometheus/client_model/MAINTAINERS.md new file mode 100644 index 0000000..3ede55f --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_model/MAINTAINERS.md @@ -0,0 +1 @@ +* Björn Rabenstein diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_model/Makefile b/example/prometheus-mock/vendor/github.com/prometheus/client_model/Makefile new file mode 100644 index 0000000..9cc23b3 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_model/Makefile @@ -0,0 +1,61 @@ +# Copyright 2013 Prometheus Team +# 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. + +KEY_ID ?= _DEFINE_ME_ + +all: cpp go java python ruby + +SUFFIXES: + +cpp: cpp/metrics.pb.cc cpp/metrics.pb.h + +cpp/metrics.pb.cc: metrics.proto + protoc $< --cpp_out=cpp/ + +cpp/metrics.pb.h: metrics.proto + protoc $< --cpp_out=cpp/ + +go: go/metrics.pb.go + +go/metrics.pb.go: metrics.proto + protoc $< --go_out=go/ + +java: src/main/java/io/prometheus/client/Metrics.java pom.xml + mvn clean compile package + +src/main/java/io/prometheus/client/Metrics.java: metrics.proto + protoc $< --java_out=src/main/java + +python: python/prometheus/client/model/metrics_pb2.py + +python/prometheus/client/model/metrics_pb2.py: metrics.proto + protoc $< --python_out=python/prometheus/client/model + +ruby: + $(MAKE) -C ruby build + +clean: + -rm -rf cpp/* + -rm -rf go/* + -rm -rf java/* + -rm -rf python/* + -$(MAKE) -C ruby clean + -mvn clean + +maven-deploy-snapshot: java + mvn clean deploy -Dgpg.keyname=$(KEY_ID) -DperformRelease=true + +maven-deploy-release: java + mvn clean release:clean release:prepare release:perform -Dgpg.keyname=$(KEY_ID) -DperformRelease=true + +.PHONY: all clean cpp go java maven-deploy-snapshot maven-deploy-release python ruby diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_model/NOTICE b/example/prometheus-mock/vendor/github.com/prometheus/client_model/NOTICE new file mode 100644 index 0000000..20110e4 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_model/NOTICE @@ -0,0 +1,5 @@ +Data model artifacts for Prometheus. +Copyright 2012-2015 The Prometheus Authors + +This product includes software developed at +SoundCloud Ltd. (http://soundcloud.com/). diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_model/README.md b/example/prometheus-mock/vendor/github.com/prometheus/client_model/README.md new file mode 100644 index 0000000..a710042 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_model/README.md @@ -0,0 +1,26 @@ +# Background +Under most circumstances, manually downloading this repository should never +be required. + +# Prerequisites +# Base +* [Google Protocol Buffers](https://developers.google.com/protocol-buffers) + +## Java +* [Apache Maven](http://maven.apache.org) +* [Prometheus Maven Repository](https://github.com/prometheus/io.prometheus-maven-repository) checked out into ../io.prometheus-maven-repository + +## Go +* [Go](http://golang.org) +* [goprotobuf](https://code.google.com/p/goprotobuf) + +## Ruby +* [Ruby](https://www.ruby-lang.org) +* [bundler](https://rubygems.org/gems/bundler) + +# Building + $ make + +# Getting Started + * The Go source code is periodically indexed: [Go Protocol Buffer Model](http://godoc.org/github.com/prometheus/client_model/go). + * All of the core developers are accessible via the [Prometheus Developers Mailinglist](https://groups.google.com/forum/?fromgroups#!forum/prometheus-developers). diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_model/cpp/metrics.pb.cc b/example/prometheus-mock/vendor/github.com/prometheus/client_model/cpp/metrics.pb.cc new file mode 100644 index 0000000..1ff893b --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_model/cpp/metrics.pb.cc @@ -0,0 +1,3380 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: metrics.proto + +#define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION +#include "metrics.pb.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +// @@protoc_insertion_point(includes) + +namespace io { +namespace prometheus { +namespace client { + +namespace { + +const ::google::protobuf::Descriptor* LabelPair_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + LabelPair_reflection_ = NULL; +const ::google::protobuf::Descriptor* Gauge_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + Gauge_reflection_ = NULL; +const ::google::protobuf::Descriptor* Counter_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + Counter_reflection_ = NULL; +const ::google::protobuf::Descriptor* Quantile_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + Quantile_reflection_ = NULL; +const ::google::protobuf::Descriptor* Summary_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + Summary_reflection_ = NULL; +const ::google::protobuf::Descriptor* Untyped_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + Untyped_reflection_ = NULL; +const ::google::protobuf::Descriptor* Histogram_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + Histogram_reflection_ = NULL; +const ::google::protobuf::Descriptor* Bucket_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + Bucket_reflection_ = NULL; +const ::google::protobuf::Descriptor* Metric_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + Metric_reflection_ = NULL; +const ::google::protobuf::Descriptor* MetricFamily_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + MetricFamily_reflection_ = NULL; +const ::google::protobuf::EnumDescriptor* MetricType_descriptor_ = NULL; + +} // namespace + + +void protobuf_AssignDesc_metrics_2eproto() { + protobuf_AddDesc_metrics_2eproto(); + const ::google::protobuf::FileDescriptor* file = + ::google::protobuf::DescriptorPool::generated_pool()->FindFileByName( + "metrics.proto"); + GOOGLE_CHECK(file != NULL); + LabelPair_descriptor_ = file->message_type(0); + static const int LabelPair_offsets_[2] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(LabelPair, name_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(LabelPair, value_), + }; + LabelPair_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + LabelPair_descriptor_, + LabelPair::default_instance_, + LabelPair_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(LabelPair, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(LabelPair, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(LabelPair)); + Gauge_descriptor_ = file->message_type(1); + static const int Gauge_offsets_[1] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Gauge, value_), + }; + Gauge_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + Gauge_descriptor_, + Gauge::default_instance_, + Gauge_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Gauge, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Gauge, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(Gauge)); + Counter_descriptor_ = file->message_type(2); + static const int Counter_offsets_[1] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Counter, value_), + }; + Counter_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + Counter_descriptor_, + Counter::default_instance_, + Counter_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Counter, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Counter, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(Counter)); + Quantile_descriptor_ = file->message_type(3); + static const int Quantile_offsets_[2] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Quantile, quantile_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Quantile, value_), + }; + Quantile_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + Quantile_descriptor_, + Quantile::default_instance_, + Quantile_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Quantile, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Quantile, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(Quantile)); + Summary_descriptor_ = file->message_type(4); + static const int Summary_offsets_[3] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Summary, sample_count_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Summary, sample_sum_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Summary, quantile_), + }; + Summary_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + Summary_descriptor_, + Summary::default_instance_, + Summary_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Summary, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Summary, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(Summary)); + Untyped_descriptor_ = file->message_type(5); + static const int Untyped_offsets_[1] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Untyped, value_), + }; + Untyped_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + Untyped_descriptor_, + Untyped::default_instance_, + Untyped_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Untyped, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Untyped, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(Untyped)); + Histogram_descriptor_ = file->message_type(6); + static const int Histogram_offsets_[3] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Histogram, sample_count_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Histogram, sample_sum_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Histogram, bucket_), + }; + Histogram_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + Histogram_descriptor_, + Histogram::default_instance_, + Histogram_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Histogram, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Histogram, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(Histogram)); + Bucket_descriptor_ = file->message_type(7); + static const int Bucket_offsets_[2] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Bucket, cumulative_count_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Bucket, upper_bound_), + }; + Bucket_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + Bucket_descriptor_, + Bucket::default_instance_, + Bucket_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Bucket, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Bucket, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(Bucket)); + Metric_descriptor_ = file->message_type(8); + static const int Metric_offsets_[7] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Metric, label_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Metric, gauge_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Metric, counter_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Metric, summary_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Metric, untyped_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Metric, histogram_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Metric, timestamp_ms_), + }; + Metric_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + Metric_descriptor_, + Metric::default_instance_, + Metric_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Metric, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Metric, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(Metric)); + MetricFamily_descriptor_ = file->message_type(9); + static const int MetricFamily_offsets_[4] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MetricFamily, name_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MetricFamily, help_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MetricFamily, type_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MetricFamily, metric_), + }; + MetricFamily_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + MetricFamily_descriptor_, + MetricFamily::default_instance_, + MetricFamily_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MetricFamily, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MetricFamily, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(MetricFamily)); + MetricType_descriptor_ = file->enum_type(0); +} + +namespace { + +GOOGLE_PROTOBUF_DECLARE_ONCE(protobuf_AssignDescriptors_once_); +inline void protobuf_AssignDescriptorsOnce() { + ::google::protobuf::GoogleOnceInit(&protobuf_AssignDescriptors_once_, + &protobuf_AssignDesc_metrics_2eproto); +} + +void protobuf_RegisterTypes(const ::std::string&) { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + LabelPair_descriptor_, &LabelPair::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + Gauge_descriptor_, &Gauge::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + Counter_descriptor_, &Counter::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + Quantile_descriptor_, &Quantile::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + Summary_descriptor_, &Summary::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + Untyped_descriptor_, &Untyped::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + Histogram_descriptor_, &Histogram::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + Bucket_descriptor_, &Bucket::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + Metric_descriptor_, &Metric::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + MetricFamily_descriptor_, &MetricFamily::default_instance()); +} + +} // namespace + +void protobuf_ShutdownFile_metrics_2eproto() { + delete LabelPair::default_instance_; + delete LabelPair_reflection_; + delete Gauge::default_instance_; + delete Gauge_reflection_; + delete Counter::default_instance_; + delete Counter_reflection_; + delete Quantile::default_instance_; + delete Quantile_reflection_; + delete Summary::default_instance_; + delete Summary_reflection_; + delete Untyped::default_instance_; + delete Untyped_reflection_; + delete Histogram::default_instance_; + delete Histogram_reflection_; + delete Bucket::default_instance_; + delete Bucket_reflection_; + delete Metric::default_instance_; + delete Metric_reflection_; + delete MetricFamily::default_instance_; + delete MetricFamily_reflection_; +} + +void protobuf_AddDesc_metrics_2eproto() { + static bool already_here = false; + if (already_here) return; + already_here = true; + GOOGLE_PROTOBUF_VERIFY_VERSION; + + ::google::protobuf::DescriptorPool::InternalAddGeneratedFile( + "\n\rmetrics.proto\022\024io.prometheus.client\"(\n" + "\tLabelPair\022\014\n\004name\030\001 \001(\t\022\r\n\005value\030\002 \001(\t\"" + "\026\n\005Gauge\022\r\n\005value\030\001 \001(\001\"\030\n\007Counter\022\r\n\005va" + "lue\030\001 \001(\001\"+\n\010Quantile\022\020\n\010quantile\030\001 \001(\001\022" + "\r\n\005value\030\002 \001(\001\"e\n\007Summary\022\024\n\014sample_coun" + "t\030\001 \001(\004\022\022\n\nsample_sum\030\002 \001(\001\0220\n\010quantile\030" + "\003 \003(\0132\036.io.prometheus.client.Quantile\"\030\n" + "\007Untyped\022\r\n\005value\030\001 \001(\001\"c\n\tHistogram\022\024\n\014" + "sample_count\030\001 \001(\004\022\022\n\nsample_sum\030\002 \001(\001\022," + "\n\006bucket\030\003 \003(\0132\034.io.prometheus.client.Bu" + "cket\"7\n\006Bucket\022\030\n\020cumulative_count\030\001 \001(\004" + "\022\023\n\013upper_bound\030\002 \001(\001\"\276\002\n\006Metric\022.\n\005labe" + "l\030\001 \003(\0132\037.io.prometheus.client.LabelPair" + "\022*\n\005gauge\030\002 \001(\0132\033.io.prometheus.client.G" + "auge\022.\n\007counter\030\003 \001(\0132\035.io.prometheus.cl" + "ient.Counter\022.\n\007summary\030\004 \001(\0132\035.io.prome" + "theus.client.Summary\022.\n\007untyped\030\005 \001(\0132\035." + "io.prometheus.client.Untyped\0222\n\thistogra" + "m\030\007 \001(\0132\037.io.prometheus.client.Histogram" + "\022\024\n\014timestamp_ms\030\006 \001(\003\"\210\001\n\014MetricFamily\022" + "\014\n\004name\030\001 \001(\t\022\014\n\004help\030\002 \001(\t\022.\n\004type\030\003 \001(" + "\0162 .io.prometheus.client.MetricType\022,\n\006m" + "etric\030\004 \003(\0132\034.io.prometheus.client.Metri" + "c*M\n\nMetricType\022\013\n\007COUNTER\020\000\022\t\n\005GAUGE\020\001\022" + "\013\n\007SUMMARY\020\002\022\013\n\007UNTYPED\020\003\022\r\n\tHISTOGRAM\020\004" + "B\026\n\024io.prometheus.client", 1024); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile( + "metrics.proto", &protobuf_RegisterTypes); + LabelPair::default_instance_ = new LabelPair(); + Gauge::default_instance_ = new Gauge(); + Counter::default_instance_ = new Counter(); + Quantile::default_instance_ = new Quantile(); + Summary::default_instance_ = new Summary(); + Untyped::default_instance_ = new Untyped(); + Histogram::default_instance_ = new Histogram(); + Bucket::default_instance_ = new Bucket(); + Metric::default_instance_ = new Metric(); + MetricFamily::default_instance_ = new MetricFamily(); + LabelPair::default_instance_->InitAsDefaultInstance(); + Gauge::default_instance_->InitAsDefaultInstance(); + Counter::default_instance_->InitAsDefaultInstance(); + Quantile::default_instance_->InitAsDefaultInstance(); + Summary::default_instance_->InitAsDefaultInstance(); + Untyped::default_instance_->InitAsDefaultInstance(); + Histogram::default_instance_->InitAsDefaultInstance(); + Bucket::default_instance_->InitAsDefaultInstance(); + Metric::default_instance_->InitAsDefaultInstance(); + MetricFamily::default_instance_->InitAsDefaultInstance(); + ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_metrics_2eproto); +} + +// Force AddDescriptors() to be called at static initialization time. +struct StaticDescriptorInitializer_metrics_2eproto { + StaticDescriptorInitializer_metrics_2eproto() { + protobuf_AddDesc_metrics_2eproto(); + } +} static_descriptor_initializer_metrics_2eproto_; +const ::google::protobuf::EnumDescriptor* MetricType_descriptor() { + protobuf_AssignDescriptorsOnce(); + return MetricType_descriptor_; +} +bool MetricType_IsValid(int value) { + switch(value) { + case 0: + case 1: + case 2: + case 3: + case 4: + return true; + default: + return false; + } +} + + +// =================================================================== + +#ifndef _MSC_VER +const int LabelPair::kNameFieldNumber; +const int LabelPair::kValueFieldNumber; +#endif // !_MSC_VER + +LabelPair::LabelPair() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:io.prometheus.client.LabelPair) +} + +void LabelPair::InitAsDefaultInstance() { +} + +LabelPair::LabelPair(const LabelPair& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:io.prometheus.client.LabelPair) +} + +void LabelPair::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + value_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +LabelPair::~LabelPair() { + // @@protoc_insertion_point(destructor:io.prometheus.client.LabelPair) + SharedDtor(); +} + +void LabelPair::SharedDtor() { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete name_; + } + if (value_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete value_; + } + if (this != default_instance_) { + } +} + +void LabelPair::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* LabelPair::descriptor() { + protobuf_AssignDescriptorsOnce(); + return LabelPair_descriptor_; +} + +const LabelPair& LabelPair::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_metrics_2eproto(); + return *default_instance_; +} + +LabelPair* LabelPair::default_instance_ = NULL; + +LabelPair* LabelPair::New() const { + return new LabelPair; +} + +void LabelPair::Clear() { + if (_has_bits_[0 / 32] & 3) { + if (has_name()) { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_->clear(); + } + } + if (has_value()) { + if (value_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + value_->clear(); + } + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool LabelPair::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:io.prometheus.client.LabelPair) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string name = 1; + case 1: { + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_name())); + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::PARSE, + "name"); + } else { + goto handle_unusual; + } + if (input->ExpectTag(18)) goto parse_value; + break; + } + + // optional string value = 2; + case 2: { + if (tag == 18) { + parse_value: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_value())); + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->value().data(), this->value().length(), + ::google::protobuf::internal::WireFormat::PARSE, + "value"); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:io.prometheus.client.LabelPair) + return true; +failure: + // @@protoc_insertion_point(parse_failure:io.prometheus.client.LabelPair) + return false; +#undef DO_ +} + +void LabelPair::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:io.prometheus.client.LabelPair) + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "name"); + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 1, this->name(), output); + } + + // optional string value = 2; + if (has_value()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->value().data(), this->value().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "value"); + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 2, this->value(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:io.prometheus.client.LabelPair) +} + +::google::protobuf::uint8* LabelPair::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:io.prometheus.client.LabelPair) + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "name"); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->name(), target); + } + + // optional string value = 2; + if (has_value()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->value().data(), this->value().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "value"); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 2, this->value(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:io.prometheus.client.LabelPair) + return target; +} + +int LabelPair::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string name = 1; + if (has_name()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->name()); + } + + // optional string value = 2; + if (has_value()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->value()); + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void LabelPair::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const LabelPair* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void LabelPair::MergeFrom(const LabelPair& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_name()) { + set_name(from.name()); + } + if (from.has_value()) { + set_value(from.value()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void LabelPair::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void LabelPair::CopyFrom(const LabelPair& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool LabelPair::IsInitialized() const { + + return true; +} + +void LabelPair::Swap(LabelPair* other) { + if (other != this) { + std::swap(name_, other->name_); + std::swap(value_, other->value_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata LabelPair::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = LabelPair_descriptor_; + metadata.reflection = LabelPair_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int Gauge::kValueFieldNumber; +#endif // !_MSC_VER + +Gauge::Gauge() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:io.prometheus.client.Gauge) +} + +void Gauge::InitAsDefaultInstance() { +} + +Gauge::Gauge(const Gauge& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:io.prometheus.client.Gauge) +} + +void Gauge::SharedCtor() { + _cached_size_ = 0; + value_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +Gauge::~Gauge() { + // @@protoc_insertion_point(destructor:io.prometheus.client.Gauge) + SharedDtor(); +} + +void Gauge::SharedDtor() { + if (this != default_instance_) { + } +} + +void Gauge::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* Gauge::descriptor() { + protobuf_AssignDescriptorsOnce(); + return Gauge_descriptor_; +} + +const Gauge& Gauge::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_metrics_2eproto(); + return *default_instance_; +} + +Gauge* Gauge::default_instance_ = NULL; + +Gauge* Gauge::New() const { + return new Gauge; +} + +void Gauge::Clear() { + value_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool Gauge::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:io.prometheus.client.Gauge) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional double value = 1; + case 1: { + if (tag == 9) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + double, ::google::protobuf::internal::WireFormatLite::TYPE_DOUBLE>( + input, &value_))); + set_has_value(); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:io.prometheus.client.Gauge) + return true; +failure: + // @@protoc_insertion_point(parse_failure:io.prometheus.client.Gauge) + return false; +#undef DO_ +} + +void Gauge::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:io.prometheus.client.Gauge) + // optional double value = 1; + if (has_value()) { + ::google::protobuf::internal::WireFormatLite::WriteDouble(1, this->value(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:io.prometheus.client.Gauge) +} + +::google::protobuf::uint8* Gauge::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:io.prometheus.client.Gauge) + // optional double value = 1; + if (has_value()) { + target = ::google::protobuf::internal::WireFormatLite::WriteDoubleToArray(1, this->value(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:io.prometheus.client.Gauge) + return target; +} + +int Gauge::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional double value = 1; + if (has_value()) { + total_size += 1 + 8; + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void Gauge::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const Gauge* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void Gauge::MergeFrom(const Gauge& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_value()) { + set_value(from.value()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void Gauge::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void Gauge::CopyFrom(const Gauge& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool Gauge::IsInitialized() const { + + return true; +} + +void Gauge::Swap(Gauge* other) { + if (other != this) { + std::swap(value_, other->value_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata Gauge::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = Gauge_descriptor_; + metadata.reflection = Gauge_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int Counter::kValueFieldNumber; +#endif // !_MSC_VER + +Counter::Counter() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:io.prometheus.client.Counter) +} + +void Counter::InitAsDefaultInstance() { +} + +Counter::Counter(const Counter& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:io.prometheus.client.Counter) +} + +void Counter::SharedCtor() { + _cached_size_ = 0; + value_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +Counter::~Counter() { + // @@protoc_insertion_point(destructor:io.prometheus.client.Counter) + SharedDtor(); +} + +void Counter::SharedDtor() { + if (this != default_instance_) { + } +} + +void Counter::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* Counter::descriptor() { + protobuf_AssignDescriptorsOnce(); + return Counter_descriptor_; +} + +const Counter& Counter::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_metrics_2eproto(); + return *default_instance_; +} + +Counter* Counter::default_instance_ = NULL; + +Counter* Counter::New() const { + return new Counter; +} + +void Counter::Clear() { + value_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool Counter::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:io.prometheus.client.Counter) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional double value = 1; + case 1: { + if (tag == 9) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + double, ::google::protobuf::internal::WireFormatLite::TYPE_DOUBLE>( + input, &value_))); + set_has_value(); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:io.prometheus.client.Counter) + return true; +failure: + // @@protoc_insertion_point(parse_failure:io.prometheus.client.Counter) + return false; +#undef DO_ +} + +void Counter::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:io.prometheus.client.Counter) + // optional double value = 1; + if (has_value()) { + ::google::protobuf::internal::WireFormatLite::WriteDouble(1, this->value(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:io.prometheus.client.Counter) +} + +::google::protobuf::uint8* Counter::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:io.prometheus.client.Counter) + // optional double value = 1; + if (has_value()) { + target = ::google::protobuf::internal::WireFormatLite::WriteDoubleToArray(1, this->value(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:io.prometheus.client.Counter) + return target; +} + +int Counter::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional double value = 1; + if (has_value()) { + total_size += 1 + 8; + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void Counter::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const Counter* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void Counter::MergeFrom(const Counter& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_value()) { + set_value(from.value()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void Counter::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void Counter::CopyFrom(const Counter& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool Counter::IsInitialized() const { + + return true; +} + +void Counter::Swap(Counter* other) { + if (other != this) { + std::swap(value_, other->value_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata Counter::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = Counter_descriptor_; + metadata.reflection = Counter_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int Quantile::kQuantileFieldNumber; +const int Quantile::kValueFieldNumber; +#endif // !_MSC_VER + +Quantile::Quantile() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:io.prometheus.client.Quantile) +} + +void Quantile::InitAsDefaultInstance() { +} + +Quantile::Quantile(const Quantile& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:io.prometheus.client.Quantile) +} + +void Quantile::SharedCtor() { + _cached_size_ = 0; + quantile_ = 0; + value_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +Quantile::~Quantile() { + // @@protoc_insertion_point(destructor:io.prometheus.client.Quantile) + SharedDtor(); +} + +void Quantile::SharedDtor() { + if (this != default_instance_) { + } +} + +void Quantile::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* Quantile::descriptor() { + protobuf_AssignDescriptorsOnce(); + return Quantile_descriptor_; +} + +const Quantile& Quantile::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_metrics_2eproto(); + return *default_instance_; +} + +Quantile* Quantile::default_instance_ = NULL; + +Quantile* Quantile::New() const { + return new Quantile; +} + +void Quantile::Clear() { +#define OFFSET_OF_FIELD_(f) (reinterpret_cast( \ + &reinterpret_cast(16)->f) - \ + reinterpret_cast(16)) + +#define ZR_(first, last) do { \ + size_t f = OFFSET_OF_FIELD_(first); \ + size_t n = OFFSET_OF_FIELD_(last) - f + sizeof(last); \ + ::memset(&first, 0, n); \ + } while (0) + + ZR_(quantile_, value_); + +#undef OFFSET_OF_FIELD_ +#undef ZR_ + + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool Quantile::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:io.prometheus.client.Quantile) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional double quantile = 1; + case 1: { + if (tag == 9) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + double, ::google::protobuf::internal::WireFormatLite::TYPE_DOUBLE>( + input, &quantile_))); + set_has_quantile(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(17)) goto parse_value; + break; + } + + // optional double value = 2; + case 2: { + if (tag == 17) { + parse_value: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + double, ::google::protobuf::internal::WireFormatLite::TYPE_DOUBLE>( + input, &value_))); + set_has_value(); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:io.prometheus.client.Quantile) + return true; +failure: + // @@protoc_insertion_point(parse_failure:io.prometheus.client.Quantile) + return false; +#undef DO_ +} + +void Quantile::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:io.prometheus.client.Quantile) + // optional double quantile = 1; + if (has_quantile()) { + ::google::protobuf::internal::WireFormatLite::WriteDouble(1, this->quantile(), output); + } + + // optional double value = 2; + if (has_value()) { + ::google::protobuf::internal::WireFormatLite::WriteDouble(2, this->value(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:io.prometheus.client.Quantile) +} + +::google::protobuf::uint8* Quantile::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:io.prometheus.client.Quantile) + // optional double quantile = 1; + if (has_quantile()) { + target = ::google::protobuf::internal::WireFormatLite::WriteDoubleToArray(1, this->quantile(), target); + } + + // optional double value = 2; + if (has_value()) { + target = ::google::protobuf::internal::WireFormatLite::WriteDoubleToArray(2, this->value(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:io.prometheus.client.Quantile) + return target; +} + +int Quantile::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional double quantile = 1; + if (has_quantile()) { + total_size += 1 + 8; + } + + // optional double value = 2; + if (has_value()) { + total_size += 1 + 8; + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void Quantile::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const Quantile* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void Quantile::MergeFrom(const Quantile& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_quantile()) { + set_quantile(from.quantile()); + } + if (from.has_value()) { + set_value(from.value()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void Quantile::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void Quantile::CopyFrom(const Quantile& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool Quantile::IsInitialized() const { + + return true; +} + +void Quantile::Swap(Quantile* other) { + if (other != this) { + std::swap(quantile_, other->quantile_); + std::swap(value_, other->value_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata Quantile::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = Quantile_descriptor_; + metadata.reflection = Quantile_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int Summary::kSampleCountFieldNumber; +const int Summary::kSampleSumFieldNumber; +const int Summary::kQuantileFieldNumber; +#endif // !_MSC_VER + +Summary::Summary() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:io.prometheus.client.Summary) +} + +void Summary::InitAsDefaultInstance() { +} + +Summary::Summary(const Summary& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:io.prometheus.client.Summary) +} + +void Summary::SharedCtor() { + _cached_size_ = 0; + sample_count_ = GOOGLE_ULONGLONG(0); + sample_sum_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +Summary::~Summary() { + // @@protoc_insertion_point(destructor:io.prometheus.client.Summary) + SharedDtor(); +} + +void Summary::SharedDtor() { + if (this != default_instance_) { + } +} + +void Summary::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* Summary::descriptor() { + protobuf_AssignDescriptorsOnce(); + return Summary_descriptor_; +} + +const Summary& Summary::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_metrics_2eproto(); + return *default_instance_; +} + +Summary* Summary::default_instance_ = NULL; + +Summary* Summary::New() const { + return new Summary; +} + +void Summary::Clear() { +#define OFFSET_OF_FIELD_(f) (reinterpret_cast( \ + &reinterpret_cast(16)->f) - \ + reinterpret_cast(16)) + +#define ZR_(first, last) do { \ + size_t f = OFFSET_OF_FIELD_(first); \ + size_t n = OFFSET_OF_FIELD_(last) - f + sizeof(last); \ + ::memset(&first, 0, n); \ + } while (0) + + ZR_(sample_count_, sample_sum_); + +#undef OFFSET_OF_FIELD_ +#undef ZR_ + + quantile_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool Summary::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:io.prometheus.client.Summary) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional uint64 sample_count = 1; + case 1: { + if (tag == 8) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::uint64, ::google::protobuf::internal::WireFormatLite::TYPE_UINT64>( + input, &sample_count_))); + set_has_sample_count(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(17)) goto parse_sample_sum; + break; + } + + // optional double sample_sum = 2; + case 2: { + if (tag == 17) { + parse_sample_sum: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + double, ::google::protobuf::internal::WireFormatLite::TYPE_DOUBLE>( + input, &sample_sum_))); + set_has_sample_sum(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(26)) goto parse_quantile; + break; + } + + // repeated .io.prometheus.client.Quantile quantile = 3; + case 3: { + if (tag == 26) { + parse_quantile: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_quantile())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(26)) goto parse_quantile; + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:io.prometheus.client.Summary) + return true; +failure: + // @@protoc_insertion_point(parse_failure:io.prometheus.client.Summary) + return false; +#undef DO_ +} + +void Summary::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:io.prometheus.client.Summary) + // optional uint64 sample_count = 1; + if (has_sample_count()) { + ::google::protobuf::internal::WireFormatLite::WriteUInt64(1, this->sample_count(), output); + } + + // optional double sample_sum = 2; + if (has_sample_sum()) { + ::google::protobuf::internal::WireFormatLite::WriteDouble(2, this->sample_sum(), output); + } + + // repeated .io.prometheus.client.Quantile quantile = 3; + for (int i = 0; i < this->quantile_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 3, this->quantile(i), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:io.prometheus.client.Summary) +} + +::google::protobuf::uint8* Summary::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:io.prometheus.client.Summary) + // optional uint64 sample_count = 1; + if (has_sample_count()) { + target = ::google::protobuf::internal::WireFormatLite::WriteUInt64ToArray(1, this->sample_count(), target); + } + + // optional double sample_sum = 2; + if (has_sample_sum()) { + target = ::google::protobuf::internal::WireFormatLite::WriteDoubleToArray(2, this->sample_sum(), target); + } + + // repeated .io.prometheus.client.Quantile quantile = 3; + for (int i = 0; i < this->quantile_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 3, this->quantile(i), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:io.prometheus.client.Summary) + return target; +} + +int Summary::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional uint64 sample_count = 1; + if (has_sample_count()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::UInt64Size( + this->sample_count()); + } + + // optional double sample_sum = 2; + if (has_sample_sum()) { + total_size += 1 + 8; + } + + } + // repeated .io.prometheus.client.Quantile quantile = 3; + total_size += 1 * this->quantile_size(); + for (int i = 0; i < this->quantile_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->quantile(i)); + } + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void Summary::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const Summary* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void Summary::MergeFrom(const Summary& from) { + GOOGLE_CHECK_NE(&from, this); + quantile_.MergeFrom(from.quantile_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_sample_count()) { + set_sample_count(from.sample_count()); + } + if (from.has_sample_sum()) { + set_sample_sum(from.sample_sum()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void Summary::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void Summary::CopyFrom(const Summary& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool Summary::IsInitialized() const { + + return true; +} + +void Summary::Swap(Summary* other) { + if (other != this) { + std::swap(sample_count_, other->sample_count_); + std::swap(sample_sum_, other->sample_sum_); + quantile_.Swap(&other->quantile_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata Summary::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = Summary_descriptor_; + metadata.reflection = Summary_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int Untyped::kValueFieldNumber; +#endif // !_MSC_VER + +Untyped::Untyped() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:io.prometheus.client.Untyped) +} + +void Untyped::InitAsDefaultInstance() { +} + +Untyped::Untyped(const Untyped& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:io.prometheus.client.Untyped) +} + +void Untyped::SharedCtor() { + _cached_size_ = 0; + value_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +Untyped::~Untyped() { + // @@protoc_insertion_point(destructor:io.prometheus.client.Untyped) + SharedDtor(); +} + +void Untyped::SharedDtor() { + if (this != default_instance_) { + } +} + +void Untyped::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* Untyped::descriptor() { + protobuf_AssignDescriptorsOnce(); + return Untyped_descriptor_; +} + +const Untyped& Untyped::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_metrics_2eproto(); + return *default_instance_; +} + +Untyped* Untyped::default_instance_ = NULL; + +Untyped* Untyped::New() const { + return new Untyped; +} + +void Untyped::Clear() { + value_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool Untyped::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:io.prometheus.client.Untyped) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional double value = 1; + case 1: { + if (tag == 9) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + double, ::google::protobuf::internal::WireFormatLite::TYPE_DOUBLE>( + input, &value_))); + set_has_value(); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:io.prometheus.client.Untyped) + return true; +failure: + // @@protoc_insertion_point(parse_failure:io.prometheus.client.Untyped) + return false; +#undef DO_ +} + +void Untyped::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:io.prometheus.client.Untyped) + // optional double value = 1; + if (has_value()) { + ::google::protobuf::internal::WireFormatLite::WriteDouble(1, this->value(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:io.prometheus.client.Untyped) +} + +::google::protobuf::uint8* Untyped::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:io.prometheus.client.Untyped) + // optional double value = 1; + if (has_value()) { + target = ::google::protobuf::internal::WireFormatLite::WriteDoubleToArray(1, this->value(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:io.prometheus.client.Untyped) + return target; +} + +int Untyped::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional double value = 1; + if (has_value()) { + total_size += 1 + 8; + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void Untyped::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const Untyped* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void Untyped::MergeFrom(const Untyped& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_value()) { + set_value(from.value()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void Untyped::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void Untyped::CopyFrom(const Untyped& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool Untyped::IsInitialized() const { + + return true; +} + +void Untyped::Swap(Untyped* other) { + if (other != this) { + std::swap(value_, other->value_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata Untyped::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = Untyped_descriptor_; + metadata.reflection = Untyped_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int Histogram::kSampleCountFieldNumber; +const int Histogram::kSampleSumFieldNumber; +const int Histogram::kBucketFieldNumber; +#endif // !_MSC_VER + +Histogram::Histogram() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:io.prometheus.client.Histogram) +} + +void Histogram::InitAsDefaultInstance() { +} + +Histogram::Histogram(const Histogram& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:io.prometheus.client.Histogram) +} + +void Histogram::SharedCtor() { + _cached_size_ = 0; + sample_count_ = GOOGLE_ULONGLONG(0); + sample_sum_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +Histogram::~Histogram() { + // @@protoc_insertion_point(destructor:io.prometheus.client.Histogram) + SharedDtor(); +} + +void Histogram::SharedDtor() { + if (this != default_instance_) { + } +} + +void Histogram::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* Histogram::descriptor() { + protobuf_AssignDescriptorsOnce(); + return Histogram_descriptor_; +} + +const Histogram& Histogram::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_metrics_2eproto(); + return *default_instance_; +} + +Histogram* Histogram::default_instance_ = NULL; + +Histogram* Histogram::New() const { + return new Histogram; +} + +void Histogram::Clear() { +#define OFFSET_OF_FIELD_(f) (reinterpret_cast( \ + &reinterpret_cast(16)->f) - \ + reinterpret_cast(16)) + +#define ZR_(first, last) do { \ + size_t f = OFFSET_OF_FIELD_(first); \ + size_t n = OFFSET_OF_FIELD_(last) - f + sizeof(last); \ + ::memset(&first, 0, n); \ + } while (0) + + ZR_(sample_count_, sample_sum_); + +#undef OFFSET_OF_FIELD_ +#undef ZR_ + + bucket_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool Histogram::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:io.prometheus.client.Histogram) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional uint64 sample_count = 1; + case 1: { + if (tag == 8) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::uint64, ::google::protobuf::internal::WireFormatLite::TYPE_UINT64>( + input, &sample_count_))); + set_has_sample_count(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(17)) goto parse_sample_sum; + break; + } + + // optional double sample_sum = 2; + case 2: { + if (tag == 17) { + parse_sample_sum: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + double, ::google::protobuf::internal::WireFormatLite::TYPE_DOUBLE>( + input, &sample_sum_))); + set_has_sample_sum(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(26)) goto parse_bucket; + break; + } + + // repeated .io.prometheus.client.Bucket bucket = 3; + case 3: { + if (tag == 26) { + parse_bucket: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_bucket())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(26)) goto parse_bucket; + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:io.prometheus.client.Histogram) + return true; +failure: + // @@protoc_insertion_point(parse_failure:io.prometheus.client.Histogram) + return false; +#undef DO_ +} + +void Histogram::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:io.prometheus.client.Histogram) + // optional uint64 sample_count = 1; + if (has_sample_count()) { + ::google::protobuf::internal::WireFormatLite::WriteUInt64(1, this->sample_count(), output); + } + + // optional double sample_sum = 2; + if (has_sample_sum()) { + ::google::protobuf::internal::WireFormatLite::WriteDouble(2, this->sample_sum(), output); + } + + // repeated .io.prometheus.client.Bucket bucket = 3; + for (int i = 0; i < this->bucket_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 3, this->bucket(i), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:io.prometheus.client.Histogram) +} + +::google::protobuf::uint8* Histogram::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:io.prometheus.client.Histogram) + // optional uint64 sample_count = 1; + if (has_sample_count()) { + target = ::google::protobuf::internal::WireFormatLite::WriteUInt64ToArray(1, this->sample_count(), target); + } + + // optional double sample_sum = 2; + if (has_sample_sum()) { + target = ::google::protobuf::internal::WireFormatLite::WriteDoubleToArray(2, this->sample_sum(), target); + } + + // repeated .io.prometheus.client.Bucket bucket = 3; + for (int i = 0; i < this->bucket_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 3, this->bucket(i), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:io.prometheus.client.Histogram) + return target; +} + +int Histogram::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional uint64 sample_count = 1; + if (has_sample_count()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::UInt64Size( + this->sample_count()); + } + + // optional double sample_sum = 2; + if (has_sample_sum()) { + total_size += 1 + 8; + } + + } + // repeated .io.prometheus.client.Bucket bucket = 3; + total_size += 1 * this->bucket_size(); + for (int i = 0; i < this->bucket_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->bucket(i)); + } + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void Histogram::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const Histogram* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void Histogram::MergeFrom(const Histogram& from) { + GOOGLE_CHECK_NE(&from, this); + bucket_.MergeFrom(from.bucket_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_sample_count()) { + set_sample_count(from.sample_count()); + } + if (from.has_sample_sum()) { + set_sample_sum(from.sample_sum()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void Histogram::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void Histogram::CopyFrom(const Histogram& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool Histogram::IsInitialized() const { + + return true; +} + +void Histogram::Swap(Histogram* other) { + if (other != this) { + std::swap(sample_count_, other->sample_count_); + std::swap(sample_sum_, other->sample_sum_); + bucket_.Swap(&other->bucket_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata Histogram::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = Histogram_descriptor_; + metadata.reflection = Histogram_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int Bucket::kCumulativeCountFieldNumber; +const int Bucket::kUpperBoundFieldNumber; +#endif // !_MSC_VER + +Bucket::Bucket() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:io.prometheus.client.Bucket) +} + +void Bucket::InitAsDefaultInstance() { +} + +Bucket::Bucket(const Bucket& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:io.prometheus.client.Bucket) +} + +void Bucket::SharedCtor() { + _cached_size_ = 0; + cumulative_count_ = GOOGLE_ULONGLONG(0); + upper_bound_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +Bucket::~Bucket() { + // @@protoc_insertion_point(destructor:io.prometheus.client.Bucket) + SharedDtor(); +} + +void Bucket::SharedDtor() { + if (this != default_instance_) { + } +} + +void Bucket::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* Bucket::descriptor() { + protobuf_AssignDescriptorsOnce(); + return Bucket_descriptor_; +} + +const Bucket& Bucket::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_metrics_2eproto(); + return *default_instance_; +} + +Bucket* Bucket::default_instance_ = NULL; + +Bucket* Bucket::New() const { + return new Bucket; +} + +void Bucket::Clear() { +#define OFFSET_OF_FIELD_(f) (reinterpret_cast( \ + &reinterpret_cast(16)->f) - \ + reinterpret_cast(16)) + +#define ZR_(first, last) do { \ + size_t f = OFFSET_OF_FIELD_(first); \ + size_t n = OFFSET_OF_FIELD_(last) - f + sizeof(last); \ + ::memset(&first, 0, n); \ + } while (0) + + ZR_(cumulative_count_, upper_bound_); + +#undef OFFSET_OF_FIELD_ +#undef ZR_ + + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool Bucket::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:io.prometheus.client.Bucket) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional uint64 cumulative_count = 1; + case 1: { + if (tag == 8) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::uint64, ::google::protobuf::internal::WireFormatLite::TYPE_UINT64>( + input, &cumulative_count_))); + set_has_cumulative_count(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(17)) goto parse_upper_bound; + break; + } + + // optional double upper_bound = 2; + case 2: { + if (tag == 17) { + parse_upper_bound: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + double, ::google::protobuf::internal::WireFormatLite::TYPE_DOUBLE>( + input, &upper_bound_))); + set_has_upper_bound(); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:io.prometheus.client.Bucket) + return true; +failure: + // @@protoc_insertion_point(parse_failure:io.prometheus.client.Bucket) + return false; +#undef DO_ +} + +void Bucket::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:io.prometheus.client.Bucket) + // optional uint64 cumulative_count = 1; + if (has_cumulative_count()) { + ::google::protobuf::internal::WireFormatLite::WriteUInt64(1, this->cumulative_count(), output); + } + + // optional double upper_bound = 2; + if (has_upper_bound()) { + ::google::protobuf::internal::WireFormatLite::WriteDouble(2, this->upper_bound(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:io.prometheus.client.Bucket) +} + +::google::protobuf::uint8* Bucket::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:io.prometheus.client.Bucket) + // optional uint64 cumulative_count = 1; + if (has_cumulative_count()) { + target = ::google::protobuf::internal::WireFormatLite::WriteUInt64ToArray(1, this->cumulative_count(), target); + } + + // optional double upper_bound = 2; + if (has_upper_bound()) { + target = ::google::protobuf::internal::WireFormatLite::WriteDoubleToArray(2, this->upper_bound(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:io.prometheus.client.Bucket) + return target; +} + +int Bucket::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional uint64 cumulative_count = 1; + if (has_cumulative_count()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::UInt64Size( + this->cumulative_count()); + } + + // optional double upper_bound = 2; + if (has_upper_bound()) { + total_size += 1 + 8; + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void Bucket::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const Bucket* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void Bucket::MergeFrom(const Bucket& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_cumulative_count()) { + set_cumulative_count(from.cumulative_count()); + } + if (from.has_upper_bound()) { + set_upper_bound(from.upper_bound()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void Bucket::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void Bucket::CopyFrom(const Bucket& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool Bucket::IsInitialized() const { + + return true; +} + +void Bucket::Swap(Bucket* other) { + if (other != this) { + std::swap(cumulative_count_, other->cumulative_count_); + std::swap(upper_bound_, other->upper_bound_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata Bucket::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = Bucket_descriptor_; + metadata.reflection = Bucket_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int Metric::kLabelFieldNumber; +const int Metric::kGaugeFieldNumber; +const int Metric::kCounterFieldNumber; +const int Metric::kSummaryFieldNumber; +const int Metric::kUntypedFieldNumber; +const int Metric::kHistogramFieldNumber; +const int Metric::kTimestampMsFieldNumber; +#endif // !_MSC_VER + +Metric::Metric() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:io.prometheus.client.Metric) +} + +void Metric::InitAsDefaultInstance() { + gauge_ = const_cast< ::io::prometheus::client::Gauge*>(&::io::prometheus::client::Gauge::default_instance()); + counter_ = const_cast< ::io::prometheus::client::Counter*>(&::io::prometheus::client::Counter::default_instance()); + summary_ = const_cast< ::io::prometheus::client::Summary*>(&::io::prometheus::client::Summary::default_instance()); + untyped_ = const_cast< ::io::prometheus::client::Untyped*>(&::io::prometheus::client::Untyped::default_instance()); + histogram_ = const_cast< ::io::prometheus::client::Histogram*>(&::io::prometheus::client::Histogram::default_instance()); +} + +Metric::Metric(const Metric& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:io.prometheus.client.Metric) +} + +void Metric::SharedCtor() { + _cached_size_ = 0; + gauge_ = NULL; + counter_ = NULL; + summary_ = NULL; + untyped_ = NULL; + histogram_ = NULL; + timestamp_ms_ = GOOGLE_LONGLONG(0); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +Metric::~Metric() { + // @@protoc_insertion_point(destructor:io.prometheus.client.Metric) + SharedDtor(); +} + +void Metric::SharedDtor() { + if (this != default_instance_) { + delete gauge_; + delete counter_; + delete summary_; + delete untyped_; + delete histogram_; + } +} + +void Metric::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* Metric::descriptor() { + protobuf_AssignDescriptorsOnce(); + return Metric_descriptor_; +} + +const Metric& Metric::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_metrics_2eproto(); + return *default_instance_; +} + +Metric* Metric::default_instance_ = NULL; + +Metric* Metric::New() const { + return new Metric; +} + +void Metric::Clear() { + if (_has_bits_[0 / 32] & 126) { + if (has_gauge()) { + if (gauge_ != NULL) gauge_->::io::prometheus::client::Gauge::Clear(); + } + if (has_counter()) { + if (counter_ != NULL) counter_->::io::prometheus::client::Counter::Clear(); + } + if (has_summary()) { + if (summary_ != NULL) summary_->::io::prometheus::client::Summary::Clear(); + } + if (has_untyped()) { + if (untyped_ != NULL) untyped_->::io::prometheus::client::Untyped::Clear(); + } + if (has_histogram()) { + if (histogram_ != NULL) histogram_->::io::prometheus::client::Histogram::Clear(); + } + timestamp_ms_ = GOOGLE_LONGLONG(0); + } + label_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool Metric::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:io.prometheus.client.Metric) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // repeated .io.prometheus.client.LabelPair label = 1; + case 1: { + if (tag == 10) { + parse_label: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_label())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(10)) goto parse_label; + if (input->ExpectTag(18)) goto parse_gauge; + break; + } + + // optional .io.prometheus.client.Gauge gauge = 2; + case 2: { + if (tag == 18) { + parse_gauge: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_gauge())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(26)) goto parse_counter; + break; + } + + // optional .io.prometheus.client.Counter counter = 3; + case 3: { + if (tag == 26) { + parse_counter: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_counter())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(34)) goto parse_summary; + break; + } + + // optional .io.prometheus.client.Summary summary = 4; + case 4: { + if (tag == 34) { + parse_summary: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_summary())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(42)) goto parse_untyped; + break; + } + + // optional .io.prometheus.client.Untyped untyped = 5; + case 5: { + if (tag == 42) { + parse_untyped: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_untyped())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(48)) goto parse_timestamp_ms; + break; + } + + // optional int64 timestamp_ms = 6; + case 6: { + if (tag == 48) { + parse_timestamp_ms: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_INT64>( + input, ×tamp_ms_))); + set_has_timestamp_ms(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(58)) goto parse_histogram; + break; + } + + // optional .io.prometheus.client.Histogram histogram = 7; + case 7: { + if (tag == 58) { + parse_histogram: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_histogram())); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:io.prometheus.client.Metric) + return true; +failure: + // @@protoc_insertion_point(parse_failure:io.prometheus.client.Metric) + return false; +#undef DO_ +} + +void Metric::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:io.prometheus.client.Metric) + // repeated .io.prometheus.client.LabelPair label = 1; + for (int i = 0; i < this->label_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 1, this->label(i), output); + } + + // optional .io.prometheus.client.Gauge gauge = 2; + if (has_gauge()) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 2, this->gauge(), output); + } + + // optional .io.prometheus.client.Counter counter = 3; + if (has_counter()) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 3, this->counter(), output); + } + + // optional .io.prometheus.client.Summary summary = 4; + if (has_summary()) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 4, this->summary(), output); + } + + // optional .io.prometheus.client.Untyped untyped = 5; + if (has_untyped()) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 5, this->untyped(), output); + } + + // optional int64 timestamp_ms = 6; + if (has_timestamp_ms()) { + ::google::protobuf::internal::WireFormatLite::WriteInt64(6, this->timestamp_ms(), output); + } + + // optional .io.prometheus.client.Histogram histogram = 7; + if (has_histogram()) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 7, this->histogram(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:io.prometheus.client.Metric) +} + +::google::protobuf::uint8* Metric::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:io.prometheus.client.Metric) + // repeated .io.prometheus.client.LabelPair label = 1; + for (int i = 0; i < this->label_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 1, this->label(i), target); + } + + // optional .io.prometheus.client.Gauge gauge = 2; + if (has_gauge()) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 2, this->gauge(), target); + } + + // optional .io.prometheus.client.Counter counter = 3; + if (has_counter()) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 3, this->counter(), target); + } + + // optional .io.prometheus.client.Summary summary = 4; + if (has_summary()) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 4, this->summary(), target); + } + + // optional .io.prometheus.client.Untyped untyped = 5; + if (has_untyped()) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 5, this->untyped(), target); + } + + // optional int64 timestamp_ms = 6; + if (has_timestamp_ms()) { + target = ::google::protobuf::internal::WireFormatLite::WriteInt64ToArray(6, this->timestamp_ms(), target); + } + + // optional .io.prometheus.client.Histogram histogram = 7; + if (has_histogram()) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 7, this->histogram(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:io.prometheus.client.Metric) + return target; +} + +int Metric::ByteSize() const { + int total_size = 0; + + if (_has_bits_[1 / 32] & (0xffu << (1 % 32))) { + // optional .io.prometheus.client.Gauge gauge = 2; + if (has_gauge()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->gauge()); + } + + // optional .io.prometheus.client.Counter counter = 3; + if (has_counter()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->counter()); + } + + // optional .io.prometheus.client.Summary summary = 4; + if (has_summary()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->summary()); + } + + // optional .io.prometheus.client.Untyped untyped = 5; + if (has_untyped()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->untyped()); + } + + // optional .io.prometheus.client.Histogram histogram = 7; + if (has_histogram()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->histogram()); + } + + // optional int64 timestamp_ms = 6; + if (has_timestamp_ms()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int64Size( + this->timestamp_ms()); + } + + } + // repeated .io.prometheus.client.LabelPair label = 1; + total_size += 1 * this->label_size(); + for (int i = 0; i < this->label_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->label(i)); + } + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void Metric::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const Metric* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void Metric::MergeFrom(const Metric& from) { + GOOGLE_CHECK_NE(&from, this); + label_.MergeFrom(from.label_); + if (from._has_bits_[1 / 32] & (0xffu << (1 % 32))) { + if (from.has_gauge()) { + mutable_gauge()->::io::prometheus::client::Gauge::MergeFrom(from.gauge()); + } + if (from.has_counter()) { + mutable_counter()->::io::prometheus::client::Counter::MergeFrom(from.counter()); + } + if (from.has_summary()) { + mutable_summary()->::io::prometheus::client::Summary::MergeFrom(from.summary()); + } + if (from.has_untyped()) { + mutable_untyped()->::io::prometheus::client::Untyped::MergeFrom(from.untyped()); + } + if (from.has_histogram()) { + mutable_histogram()->::io::prometheus::client::Histogram::MergeFrom(from.histogram()); + } + if (from.has_timestamp_ms()) { + set_timestamp_ms(from.timestamp_ms()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void Metric::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void Metric::CopyFrom(const Metric& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool Metric::IsInitialized() const { + + return true; +} + +void Metric::Swap(Metric* other) { + if (other != this) { + label_.Swap(&other->label_); + std::swap(gauge_, other->gauge_); + std::swap(counter_, other->counter_); + std::swap(summary_, other->summary_); + std::swap(untyped_, other->untyped_); + std::swap(histogram_, other->histogram_); + std::swap(timestamp_ms_, other->timestamp_ms_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata Metric::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = Metric_descriptor_; + metadata.reflection = Metric_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int MetricFamily::kNameFieldNumber; +const int MetricFamily::kHelpFieldNumber; +const int MetricFamily::kTypeFieldNumber; +const int MetricFamily::kMetricFieldNumber; +#endif // !_MSC_VER + +MetricFamily::MetricFamily() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:io.prometheus.client.MetricFamily) +} + +void MetricFamily::InitAsDefaultInstance() { +} + +MetricFamily::MetricFamily(const MetricFamily& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:io.prometheus.client.MetricFamily) +} + +void MetricFamily::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + help_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + type_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +MetricFamily::~MetricFamily() { + // @@protoc_insertion_point(destructor:io.prometheus.client.MetricFamily) + SharedDtor(); +} + +void MetricFamily::SharedDtor() { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete name_; + } + if (help_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete help_; + } + if (this != default_instance_) { + } +} + +void MetricFamily::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* MetricFamily::descriptor() { + protobuf_AssignDescriptorsOnce(); + return MetricFamily_descriptor_; +} + +const MetricFamily& MetricFamily::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_metrics_2eproto(); + return *default_instance_; +} + +MetricFamily* MetricFamily::default_instance_ = NULL; + +MetricFamily* MetricFamily::New() const { + return new MetricFamily; +} + +void MetricFamily::Clear() { + if (_has_bits_[0 / 32] & 7) { + if (has_name()) { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_->clear(); + } + } + if (has_help()) { + if (help_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + help_->clear(); + } + } + type_ = 0; + } + metric_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool MetricFamily::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:io.prometheus.client.MetricFamily) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string name = 1; + case 1: { + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_name())); + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::PARSE, + "name"); + } else { + goto handle_unusual; + } + if (input->ExpectTag(18)) goto parse_help; + break; + } + + // optional string help = 2; + case 2: { + if (tag == 18) { + parse_help: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_help())); + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->help().data(), this->help().length(), + ::google::protobuf::internal::WireFormat::PARSE, + "help"); + } else { + goto handle_unusual; + } + if (input->ExpectTag(24)) goto parse_type; + break; + } + + // optional .io.prometheus.client.MetricType type = 3; + case 3: { + if (tag == 24) { + parse_type: + int value; + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>( + input, &value))); + if (::io::prometheus::client::MetricType_IsValid(value)) { + set_type(static_cast< ::io::prometheus::client::MetricType >(value)); + } else { + mutable_unknown_fields()->AddVarint(3, value); + } + } else { + goto handle_unusual; + } + if (input->ExpectTag(34)) goto parse_metric; + break; + } + + // repeated .io.prometheus.client.Metric metric = 4; + case 4: { + if (tag == 34) { + parse_metric: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_metric())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(34)) goto parse_metric; + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:io.prometheus.client.MetricFamily) + return true; +failure: + // @@protoc_insertion_point(parse_failure:io.prometheus.client.MetricFamily) + return false; +#undef DO_ +} + +void MetricFamily::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:io.prometheus.client.MetricFamily) + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "name"); + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 1, this->name(), output); + } + + // optional string help = 2; + if (has_help()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->help().data(), this->help().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "help"); + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 2, this->help(), output); + } + + // optional .io.prometheus.client.MetricType type = 3; + if (has_type()) { + ::google::protobuf::internal::WireFormatLite::WriteEnum( + 3, this->type(), output); + } + + // repeated .io.prometheus.client.Metric metric = 4; + for (int i = 0; i < this->metric_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 4, this->metric(i), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:io.prometheus.client.MetricFamily) +} + +::google::protobuf::uint8* MetricFamily::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:io.prometheus.client.MetricFamily) + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "name"); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->name(), target); + } + + // optional string help = 2; + if (has_help()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->help().data(), this->help().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "help"); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 2, this->help(), target); + } + + // optional .io.prometheus.client.MetricType type = 3; + if (has_type()) { + target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray( + 3, this->type(), target); + } + + // repeated .io.prometheus.client.Metric metric = 4; + for (int i = 0; i < this->metric_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 4, this->metric(i), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:io.prometheus.client.MetricFamily) + return target; +} + +int MetricFamily::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string name = 1; + if (has_name()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->name()); + } + + // optional string help = 2; + if (has_help()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->help()); + } + + // optional .io.prometheus.client.MetricType type = 3; + if (has_type()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::EnumSize(this->type()); + } + + } + // repeated .io.prometheus.client.Metric metric = 4; + total_size += 1 * this->metric_size(); + for (int i = 0; i < this->metric_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->metric(i)); + } + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void MetricFamily::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const MetricFamily* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void MetricFamily::MergeFrom(const MetricFamily& from) { + GOOGLE_CHECK_NE(&from, this); + metric_.MergeFrom(from.metric_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_name()) { + set_name(from.name()); + } + if (from.has_help()) { + set_help(from.help()); + } + if (from.has_type()) { + set_type(from.type()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void MetricFamily::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void MetricFamily::CopyFrom(const MetricFamily& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool MetricFamily::IsInitialized() const { + + return true; +} + +void MetricFamily::Swap(MetricFamily* other) { + if (other != this) { + std::swap(name_, other->name_); + std::swap(help_, other->help_); + std::swap(type_, other->type_); + metric_.Swap(&other->metric_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata MetricFamily::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = MetricFamily_descriptor_; + metadata.reflection = MetricFamily_reflection_; + return metadata; +} + + +// @@protoc_insertion_point(namespace_scope) + +} // namespace client +} // namespace prometheus +} // namespace io + +// @@protoc_insertion_point(global_scope) diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_model/cpp/metrics.pb.h b/example/prometheus-mock/vendor/github.com/prometheus/client_model/cpp/metrics.pb.h new file mode 100644 index 0000000..206ba37 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_model/cpp/metrics.pb.h @@ -0,0 +1,2072 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: metrics.proto + +#ifndef PROTOBUF_metrics_2eproto__INCLUDED +#define PROTOBUF_metrics_2eproto__INCLUDED + +#include + +#include + +#if GOOGLE_PROTOBUF_VERSION < 2006000 +#error This file was generated by a newer version of protoc which is +#error incompatible with your Protocol Buffer headers. Please update +#error your headers. +#endif +#if 2006001 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION +#error This file was generated by an older version of protoc which is +#error incompatible with your Protocol Buffer headers. Please +#error regenerate this file with a newer version of protoc. +#endif + +#include +#include +#include +#include +#include +#include +// @@protoc_insertion_point(includes) + +namespace io { +namespace prometheus { +namespace client { + +// Internal implementation detail -- do not call these. +void protobuf_AddDesc_metrics_2eproto(); +void protobuf_AssignDesc_metrics_2eproto(); +void protobuf_ShutdownFile_metrics_2eproto(); + +class LabelPair; +class Gauge; +class Counter; +class Quantile; +class Summary; +class Untyped; +class Histogram; +class Bucket; +class Metric; +class MetricFamily; + +enum MetricType { + COUNTER = 0, + GAUGE = 1, + SUMMARY = 2, + UNTYPED = 3, + HISTOGRAM = 4 +}; +bool MetricType_IsValid(int value); +const MetricType MetricType_MIN = COUNTER; +const MetricType MetricType_MAX = HISTOGRAM; +const int MetricType_ARRAYSIZE = MetricType_MAX + 1; + +const ::google::protobuf::EnumDescriptor* MetricType_descriptor(); +inline const ::std::string& MetricType_Name(MetricType value) { + return ::google::protobuf::internal::NameOfEnum( + MetricType_descriptor(), value); +} +inline bool MetricType_Parse( + const ::std::string& name, MetricType* value) { + return ::google::protobuf::internal::ParseNamedEnum( + MetricType_descriptor(), name, value); +} +// =================================================================== + +class LabelPair : public ::google::protobuf::Message { + public: + LabelPair(); + virtual ~LabelPair(); + + LabelPair(const LabelPair& from); + + inline LabelPair& operator=(const LabelPair& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const LabelPair& default_instance(); + + void Swap(LabelPair* other); + + // implements Message ---------------------------------------------- + + LabelPair* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const LabelPair& from); + void MergeFrom(const LabelPair& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string name = 1; + inline bool has_name() const; + inline void clear_name(); + static const int kNameFieldNumber = 1; + inline const ::std::string& name() const; + inline void set_name(const ::std::string& value); + inline void set_name(const char* value); + inline void set_name(const char* value, size_t size); + inline ::std::string* mutable_name(); + inline ::std::string* release_name(); + inline void set_allocated_name(::std::string* name); + + // optional string value = 2; + inline bool has_value() const; + inline void clear_value(); + static const int kValueFieldNumber = 2; + inline const ::std::string& value() const; + inline void set_value(const ::std::string& value); + inline void set_value(const char* value); + inline void set_value(const char* value, size_t size); + inline ::std::string* mutable_value(); + inline ::std::string* release_value(); + inline void set_allocated_value(::std::string* value); + + // @@protoc_insertion_point(class_scope:io.prometheus.client.LabelPair) + private: + inline void set_has_name(); + inline void clear_has_name(); + inline void set_has_value(); + inline void clear_has_value(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::std::string* name_; + ::std::string* value_; + friend void protobuf_AddDesc_metrics_2eproto(); + friend void protobuf_AssignDesc_metrics_2eproto(); + friend void protobuf_ShutdownFile_metrics_2eproto(); + + void InitAsDefaultInstance(); + static LabelPair* default_instance_; +}; +// ------------------------------------------------------------------- + +class Gauge : public ::google::protobuf::Message { + public: + Gauge(); + virtual ~Gauge(); + + Gauge(const Gauge& from); + + inline Gauge& operator=(const Gauge& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const Gauge& default_instance(); + + void Swap(Gauge* other); + + // implements Message ---------------------------------------------- + + Gauge* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const Gauge& from); + void MergeFrom(const Gauge& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional double value = 1; + inline bool has_value() const; + inline void clear_value(); + static const int kValueFieldNumber = 1; + inline double value() const; + inline void set_value(double value); + + // @@protoc_insertion_point(class_scope:io.prometheus.client.Gauge) + private: + inline void set_has_value(); + inline void clear_has_value(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + double value_; + friend void protobuf_AddDesc_metrics_2eproto(); + friend void protobuf_AssignDesc_metrics_2eproto(); + friend void protobuf_ShutdownFile_metrics_2eproto(); + + void InitAsDefaultInstance(); + static Gauge* default_instance_; +}; +// ------------------------------------------------------------------- + +class Counter : public ::google::protobuf::Message { + public: + Counter(); + virtual ~Counter(); + + Counter(const Counter& from); + + inline Counter& operator=(const Counter& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const Counter& default_instance(); + + void Swap(Counter* other); + + // implements Message ---------------------------------------------- + + Counter* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const Counter& from); + void MergeFrom(const Counter& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional double value = 1; + inline bool has_value() const; + inline void clear_value(); + static const int kValueFieldNumber = 1; + inline double value() const; + inline void set_value(double value); + + // @@protoc_insertion_point(class_scope:io.prometheus.client.Counter) + private: + inline void set_has_value(); + inline void clear_has_value(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + double value_; + friend void protobuf_AddDesc_metrics_2eproto(); + friend void protobuf_AssignDesc_metrics_2eproto(); + friend void protobuf_ShutdownFile_metrics_2eproto(); + + void InitAsDefaultInstance(); + static Counter* default_instance_; +}; +// ------------------------------------------------------------------- + +class Quantile : public ::google::protobuf::Message { + public: + Quantile(); + virtual ~Quantile(); + + Quantile(const Quantile& from); + + inline Quantile& operator=(const Quantile& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const Quantile& default_instance(); + + void Swap(Quantile* other); + + // implements Message ---------------------------------------------- + + Quantile* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const Quantile& from); + void MergeFrom(const Quantile& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional double quantile = 1; + inline bool has_quantile() const; + inline void clear_quantile(); + static const int kQuantileFieldNumber = 1; + inline double quantile() const; + inline void set_quantile(double value); + + // optional double value = 2; + inline bool has_value() const; + inline void clear_value(); + static const int kValueFieldNumber = 2; + inline double value() const; + inline void set_value(double value); + + // @@protoc_insertion_point(class_scope:io.prometheus.client.Quantile) + private: + inline void set_has_quantile(); + inline void clear_has_quantile(); + inline void set_has_value(); + inline void clear_has_value(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + double quantile_; + double value_; + friend void protobuf_AddDesc_metrics_2eproto(); + friend void protobuf_AssignDesc_metrics_2eproto(); + friend void protobuf_ShutdownFile_metrics_2eproto(); + + void InitAsDefaultInstance(); + static Quantile* default_instance_; +}; +// ------------------------------------------------------------------- + +class Summary : public ::google::protobuf::Message { + public: + Summary(); + virtual ~Summary(); + + Summary(const Summary& from); + + inline Summary& operator=(const Summary& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const Summary& default_instance(); + + void Swap(Summary* other); + + // implements Message ---------------------------------------------- + + Summary* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const Summary& from); + void MergeFrom(const Summary& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional uint64 sample_count = 1; + inline bool has_sample_count() const; + inline void clear_sample_count(); + static const int kSampleCountFieldNumber = 1; + inline ::google::protobuf::uint64 sample_count() const; + inline void set_sample_count(::google::protobuf::uint64 value); + + // optional double sample_sum = 2; + inline bool has_sample_sum() const; + inline void clear_sample_sum(); + static const int kSampleSumFieldNumber = 2; + inline double sample_sum() const; + inline void set_sample_sum(double value); + + // repeated .io.prometheus.client.Quantile quantile = 3; + inline int quantile_size() const; + inline void clear_quantile(); + static const int kQuantileFieldNumber = 3; + inline const ::io::prometheus::client::Quantile& quantile(int index) const; + inline ::io::prometheus::client::Quantile* mutable_quantile(int index); + inline ::io::prometheus::client::Quantile* add_quantile(); + inline const ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::Quantile >& + quantile() const; + inline ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::Quantile >* + mutable_quantile(); + + // @@protoc_insertion_point(class_scope:io.prometheus.client.Summary) + private: + inline void set_has_sample_count(); + inline void clear_has_sample_count(); + inline void set_has_sample_sum(); + inline void clear_has_sample_sum(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::google::protobuf::uint64 sample_count_; + double sample_sum_; + ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::Quantile > quantile_; + friend void protobuf_AddDesc_metrics_2eproto(); + friend void protobuf_AssignDesc_metrics_2eproto(); + friend void protobuf_ShutdownFile_metrics_2eproto(); + + void InitAsDefaultInstance(); + static Summary* default_instance_; +}; +// ------------------------------------------------------------------- + +class Untyped : public ::google::protobuf::Message { + public: + Untyped(); + virtual ~Untyped(); + + Untyped(const Untyped& from); + + inline Untyped& operator=(const Untyped& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const Untyped& default_instance(); + + void Swap(Untyped* other); + + // implements Message ---------------------------------------------- + + Untyped* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const Untyped& from); + void MergeFrom(const Untyped& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional double value = 1; + inline bool has_value() const; + inline void clear_value(); + static const int kValueFieldNumber = 1; + inline double value() const; + inline void set_value(double value); + + // @@protoc_insertion_point(class_scope:io.prometheus.client.Untyped) + private: + inline void set_has_value(); + inline void clear_has_value(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + double value_; + friend void protobuf_AddDesc_metrics_2eproto(); + friend void protobuf_AssignDesc_metrics_2eproto(); + friend void protobuf_ShutdownFile_metrics_2eproto(); + + void InitAsDefaultInstance(); + static Untyped* default_instance_; +}; +// ------------------------------------------------------------------- + +class Histogram : public ::google::protobuf::Message { + public: + Histogram(); + virtual ~Histogram(); + + Histogram(const Histogram& from); + + inline Histogram& operator=(const Histogram& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const Histogram& default_instance(); + + void Swap(Histogram* other); + + // implements Message ---------------------------------------------- + + Histogram* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const Histogram& from); + void MergeFrom(const Histogram& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional uint64 sample_count = 1; + inline bool has_sample_count() const; + inline void clear_sample_count(); + static const int kSampleCountFieldNumber = 1; + inline ::google::protobuf::uint64 sample_count() const; + inline void set_sample_count(::google::protobuf::uint64 value); + + // optional double sample_sum = 2; + inline bool has_sample_sum() const; + inline void clear_sample_sum(); + static const int kSampleSumFieldNumber = 2; + inline double sample_sum() const; + inline void set_sample_sum(double value); + + // repeated .io.prometheus.client.Bucket bucket = 3; + inline int bucket_size() const; + inline void clear_bucket(); + static const int kBucketFieldNumber = 3; + inline const ::io::prometheus::client::Bucket& bucket(int index) const; + inline ::io::prometheus::client::Bucket* mutable_bucket(int index); + inline ::io::prometheus::client::Bucket* add_bucket(); + inline const ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::Bucket >& + bucket() const; + inline ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::Bucket >* + mutable_bucket(); + + // @@protoc_insertion_point(class_scope:io.prometheus.client.Histogram) + private: + inline void set_has_sample_count(); + inline void clear_has_sample_count(); + inline void set_has_sample_sum(); + inline void clear_has_sample_sum(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::google::protobuf::uint64 sample_count_; + double sample_sum_; + ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::Bucket > bucket_; + friend void protobuf_AddDesc_metrics_2eproto(); + friend void protobuf_AssignDesc_metrics_2eproto(); + friend void protobuf_ShutdownFile_metrics_2eproto(); + + void InitAsDefaultInstance(); + static Histogram* default_instance_; +}; +// ------------------------------------------------------------------- + +class Bucket : public ::google::protobuf::Message { + public: + Bucket(); + virtual ~Bucket(); + + Bucket(const Bucket& from); + + inline Bucket& operator=(const Bucket& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const Bucket& default_instance(); + + void Swap(Bucket* other); + + // implements Message ---------------------------------------------- + + Bucket* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const Bucket& from); + void MergeFrom(const Bucket& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional uint64 cumulative_count = 1; + inline bool has_cumulative_count() const; + inline void clear_cumulative_count(); + static const int kCumulativeCountFieldNumber = 1; + inline ::google::protobuf::uint64 cumulative_count() const; + inline void set_cumulative_count(::google::protobuf::uint64 value); + + // optional double upper_bound = 2; + inline bool has_upper_bound() const; + inline void clear_upper_bound(); + static const int kUpperBoundFieldNumber = 2; + inline double upper_bound() const; + inline void set_upper_bound(double value); + + // @@protoc_insertion_point(class_scope:io.prometheus.client.Bucket) + private: + inline void set_has_cumulative_count(); + inline void clear_has_cumulative_count(); + inline void set_has_upper_bound(); + inline void clear_has_upper_bound(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::google::protobuf::uint64 cumulative_count_; + double upper_bound_; + friend void protobuf_AddDesc_metrics_2eproto(); + friend void protobuf_AssignDesc_metrics_2eproto(); + friend void protobuf_ShutdownFile_metrics_2eproto(); + + void InitAsDefaultInstance(); + static Bucket* default_instance_; +}; +// ------------------------------------------------------------------- + +class Metric : public ::google::protobuf::Message { + public: + Metric(); + virtual ~Metric(); + + Metric(const Metric& from); + + inline Metric& operator=(const Metric& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const Metric& default_instance(); + + void Swap(Metric* other); + + // implements Message ---------------------------------------------- + + Metric* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const Metric& from); + void MergeFrom(const Metric& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // repeated .io.prometheus.client.LabelPair label = 1; + inline int label_size() const; + inline void clear_label(); + static const int kLabelFieldNumber = 1; + inline const ::io::prometheus::client::LabelPair& label(int index) const; + inline ::io::prometheus::client::LabelPair* mutable_label(int index); + inline ::io::prometheus::client::LabelPair* add_label(); + inline const ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::LabelPair >& + label() const; + inline ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::LabelPair >* + mutable_label(); + + // optional .io.prometheus.client.Gauge gauge = 2; + inline bool has_gauge() const; + inline void clear_gauge(); + static const int kGaugeFieldNumber = 2; + inline const ::io::prometheus::client::Gauge& gauge() const; + inline ::io::prometheus::client::Gauge* mutable_gauge(); + inline ::io::prometheus::client::Gauge* release_gauge(); + inline void set_allocated_gauge(::io::prometheus::client::Gauge* gauge); + + // optional .io.prometheus.client.Counter counter = 3; + inline bool has_counter() const; + inline void clear_counter(); + static const int kCounterFieldNumber = 3; + inline const ::io::prometheus::client::Counter& counter() const; + inline ::io::prometheus::client::Counter* mutable_counter(); + inline ::io::prometheus::client::Counter* release_counter(); + inline void set_allocated_counter(::io::prometheus::client::Counter* counter); + + // optional .io.prometheus.client.Summary summary = 4; + inline bool has_summary() const; + inline void clear_summary(); + static const int kSummaryFieldNumber = 4; + inline const ::io::prometheus::client::Summary& summary() const; + inline ::io::prometheus::client::Summary* mutable_summary(); + inline ::io::prometheus::client::Summary* release_summary(); + inline void set_allocated_summary(::io::prometheus::client::Summary* summary); + + // optional .io.prometheus.client.Untyped untyped = 5; + inline bool has_untyped() const; + inline void clear_untyped(); + static const int kUntypedFieldNumber = 5; + inline const ::io::prometheus::client::Untyped& untyped() const; + inline ::io::prometheus::client::Untyped* mutable_untyped(); + inline ::io::prometheus::client::Untyped* release_untyped(); + inline void set_allocated_untyped(::io::prometheus::client::Untyped* untyped); + + // optional .io.prometheus.client.Histogram histogram = 7; + inline bool has_histogram() const; + inline void clear_histogram(); + static const int kHistogramFieldNumber = 7; + inline const ::io::prometheus::client::Histogram& histogram() const; + inline ::io::prometheus::client::Histogram* mutable_histogram(); + inline ::io::prometheus::client::Histogram* release_histogram(); + inline void set_allocated_histogram(::io::prometheus::client::Histogram* histogram); + + // optional int64 timestamp_ms = 6; + inline bool has_timestamp_ms() const; + inline void clear_timestamp_ms(); + static const int kTimestampMsFieldNumber = 6; + inline ::google::protobuf::int64 timestamp_ms() const; + inline void set_timestamp_ms(::google::protobuf::int64 value); + + // @@protoc_insertion_point(class_scope:io.prometheus.client.Metric) + private: + inline void set_has_gauge(); + inline void clear_has_gauge(); + inline void set_has_counter(); + inline void clear_has_counter(); + inline void set_has_summary(); + inline void clear_has_summary(); + inline void set_has_untyped(); + inline void clear_has_untyped(); + inline void set_has_histogram(); + inline void clear_has_histogram(); + inline void set_has_timestamp_ms(); + inline void clear_has_timestamp_ms(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::LabelPair > label_; + ::io::prometheus::client::Gauge* gauge_; + ::io::prometheus::client::Counter* counter_; + ::io::prometheus::client::Summary* summary_; + ::io::prometheus::client::Untyped* untyped_; + ::io::prometheus::client::Histogram* histogram_; + ::google::protobuf::int64 timestamp_ms_; + friend void protobuf_AddDesc_metrics_2eproto(); + friend void protobuf_AssignDesc_metrics_2eproto(); + friend void protobuf_ShutdownFile_metrics_2eproto(); + + void InitAsDefaultInstance(); + static Metric* default_instance_; +}; +// ------------------------------------------------------------------- + +class MetricFamily : public ::google::protobuf::Message { + public: + MetricFamily(); + virtual ~MetricFamily(); + + MetricFamily(const MetricFamily& from); + + inline MetricFamily& operator=(const MetricFamily& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const MetricFamily& default_instance(); + + void Swap(MetricFamily* other); + + // implements Message ---------------------------------------------- + + MetricFamily* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const MetricFamily& from); + void MergeFrom(const MetricFamily& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string name = 1; + inline bool has_name() const; + inline void clear_name(); + static const int kNameFieldNumber = 1; + inline const ::std::string& name() const; + inline void set_name(const ::std::string& value); + inline void set_name(const char* value); + inline void set_name(const char* value, size_t size); + inline ::std::string* mutable_name(); + inline ::std::string* release_name(); + inline void set_allocated_name(::std::string* name); + + // optional string help = 2; + inline bool has_help() const; + inline void clear_help(); + static const int kHelpFieldNumber = 2; + inline const ::std::string& help() const; + inline void set_help(const ::std::string& value); + inline void set_help(const char* value); + inline void set_help(const char* value, size_t size); + inline ::std::string* mutable_help(); + inline ::std::string* release_help(); + inline void set_allocated_help(::std::string* help); + + // optional .io.prometheus.client.MetricType type = 3; + inline bool has_type() const; + inline void clear_type(); + static const int kTypeFieldNumber = 3; + inline ::io::prometheus::client::MetricType type() const; + inline void set_type(::io::prometheus::client::MetricType value); + + // repeated .io.prometheus.client.Metric metric = 4; + inline int metric_size() const; + inline void clear_metric(); + static const int kMetricFieldNumber = 4; + inline const ::io::prometheus::client::Metric& metric(int index) const; + inline ::io::prometheus::client::Metric* mutable_metric(int index); + inline ::io::prometheus::client::Metric* add_metric(); + inline const ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::Metric >& + metric() const; + inline ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::Metric >* + mutable_metric(); + + // @@protoc_insertion_point(class_scope:io.prometheus.client.MetricFamily) + private: + inline void set_has_name(); + inline void clear_has_name(); + inline void set_has_help(); + inline void clear_has_help(); + inline void set_has_type(); + inline void clear_has_type(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::std::string* name_; + ::std::string* help_; + ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::Metric > metric_; + int type_; + friend void protobuf_AddDesc_metrics_2eproto(); + friend void protobuf_AssignDesc_metrics_2eproto(); + friend void protobuf_ShutdownFile_metrics_2eproto(); + + void InitAsDefaultInstance(); + static MetricFamily* default_instance_; +}; +// =================================================================== + + +// =================================================================== + +// LabelPair + +// optional string name = 1; +inline bool LabelPair::has_name() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void LabelPair::set_has_name() { + _has_bits_[0] |= 0x00000001u; +} +inline void LabelPair::clear_has_name() { + _has_bits_[0] &= ~0x00000001u; +} +inline void LabelPair::clear_name() { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_->clear(); + } + clear_has_name(); +} +inline const ::std::string& LabelPair::name() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.LabelPair.name) + return *name_; +} +inline void LabelPair::set_name(const ::std::string& value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(value); + // @@protoc_insertion_point(field_set:io.prometheus.client.LabelPair.name) +} +inline void LabelPair::set_name(const char* value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(value); + // @@protoc_insertion_point(field_set_char:io.prometheus.client.LabelPair.name) +} +inline void LabelPair::set_name(const char* value, size_t size) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:io.prometheus.client.LabelPair.name) +} +inline ::std::string* LabelPair::mutable_name() { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:io.prometheus.client.LabelPair.name) + return name_; +} +inline ::std::string* LabelPair::release_name() { + clear_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = name_; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void LabelPair::set_allocated_name(::std::string* name) { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete name_; + } + if (name) { + set_has_name(); + name_ = name; + } else { + clear_has_name(); + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:io.prometheus.client.LabelPair.name) +} + +// optional string value = 2; +inline bool LabelPair::has_value() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void LabelPair::set_has_value() { + _has_bits_[0] |= 0x00000002u; +} +inline void LabelPair::clear_has_value() { + _has_bits_[0] &= ~0x00000002u; +} +inline void LabelPair::clear_value() { + if (value_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + value_->clear(); + } + clear_has_value(); +} +inline const ::std::string& LabelPair::value() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.LabelPair.value) + return *value_; +} +inline void LabelPair::set_value(const ::std::string& value) { + set_has_value(); + if (value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + value_ = new ::std::string; + } + value_->assign(value); + // @@protoc_insertion_point(field_set:io.prometheus.client.LabelPair.value) +} +inline void LabelPair::set_value(const char* value) { + set_has_value(); + if (value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + value_ = new ::std::string; + } + value_->assign(value); + // @@protoc_insertion_point(field_set_char:io.prometheus.client.LabelPair.value) +} +inline void LabelPair::set_value(const char* value, size_t size) { + set_has_value(); + if (value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + value_ = new ::std::string; + } + value_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:io.prometheus.client.LabelPair.value) +} +inline ::std::string* LabelPair::mutable_value() { + set_has_value(); + if (value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + value_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:io.prometheus.client.LabelPair.value) + return value_; +} +inline ::std::string* LabelPair::release_value() { + clear_has_value(); + if (value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = value_; + value_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void LabelPair::set_allocated_value(::std::string* value) { + if (value_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete value_; + } + if (value) { + set_has_value(); + value_ = value; + } else { + clear_has_value(); + value_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:io.prometheus.client.LabelPair.value) +} + +// ------------------------------------------------------------------- + +// Gauge + +// optional double value = 1; +inline bool Gauge::has_value() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void Gauge::set_has_value() { + _has_bits_[0] |= 0x00000001u; +} +inline void Gauge::clear_has_value() { + _has_bits_[0] &= ~0x00000001u; +} +inline void Gauge::clear_value() { + value_ = 0; + clear_has_value(); +} +inline double Gauge::value() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Gauge.value) + return value_; +} +inline void Gauge::set_value(double value) { + set_has_value(); + value_ = value; + // @@protoc_insertion_point(field_set:io.prometheus.client.Gauge.value) +} + +// ------------------------------------------------------------------- + +// Counter + +// optional double value = 1; +inline bool Counter::has_value() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void Counter::set_has_value() { + _has_bits_[0] |= 0x00000001u; +} +inline void Counter::clear_has_value() { + _has_bits_[0] &= ~0x00000001u; +} +inline void Counter::clear_value() { + value_ = 0; + clear_has_value(); +} +inline double Counter::value() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Counter.value) + return value_; +} +inline void Counter::set_value(double value) { + set_has_value(); + value_ = value; + // @@protoc_insertion_point(field_set:io.prometheus.client.Counter.value) +} + +// ------------------------------------------------------------------- + +// Quantile + +// optional double quantile = 1; +inline bool Quantile::has_quantile() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void Quantile::set_has_quantile() { + _has_bits_[0] |= 0x00000001u; +} +inline void Quantile::clear_has_quantile() { + _has_bits_[0] &= ~0x00000001u; +} +inline void Quantile::clear_quantile() { + quantile_ = 0; + clear_has_quantile(); +} +inline double Quantile::quantile() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Quantile.quantile) + return quantile_; +} +inline void Quantile::set_quantile(double value) { + set_has_quantile(); + quantile_ = value; + // @@protoc_insertion_point(field_set:io.prometheus.client.Quantile.quantile) +} + +// optional double value = 2; +inline bool Quantile::has_value() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void Quantile::set_has_value() { + _has_bits_[0] |= 0x00000002u; +} +inline void Quantile::clear_has_value() { + _has_bits_[0] &= ~0x00000002u; +} +inline void Quantile::clear_value() { + value_ = 0; + clear_has_value(); +} +inline double Quantile::value() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Quantile.value) + return value_; +} +inline void Quantile::set_value(double value) { + set_has_value(); + value_ = value; + // @@protoc_insertion_point(field_set:io.prometheus.client.Quantile.value) +} + +// ------------------------------------------------------------------- + +// Summary + +// optional uint64 sample_count = 1; +inline bool Summary::has_sample_count() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void Summary::set_has_sample_count() { + _has_bits_[0] |= 0x00000001u; +} +inline void Summary::clear_has_sample_count() { + _has_bits_[0] &= ~0x00000001u; +} +inline void Summary::clear_sample_count() { + sample_count_ = GOOGLE_ULONGLONG(0); + clear_has_sample_count(); +} +inline ::google::protobuf::uint64 Summary::sample_count() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Summary.sample_count) + return sample_count_; +} +inline void Summary::set_sample_count(::google::protobuf::uint64 value) { + set_has_sample_count(); + sample_count_ = value; + // @@protoc_insertion_point(field_set:io.prometheus.client.Summary.sample_count) +} + +// optional double sample_sum = 2; +inline bool Summary::has_sample_sum() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void Summary::set_has_sample_sum() { + _has_bits_[0] |= 0x00000002u; +} +inline void Summary::clear_has_sample_sum() { + _has_bits_[0] &= ~0x00000002u; +} +inline void Summary::clear_sample_sum() { + sample_sum_ = 0; + clear_has_sample_sum(); +} +inline double Summary::sample_sum() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Summary.sample_sum) + return sample_sum_; +} +inline void Summary::set_sample_sum(double value) { + set_has_sample_sum(); + sample_sum_ = value; + // @@protoc_insertion_point(field_set:io.prometheus.client.Summary.sample_sum) +} + +// repeated .io.prometheus.client.Quantile quantile = 3; +inline int Summary::quantile_size() const { + return quantile_.size(); +} +inline void Summary::clear_quantile() { + quantile_.Clear(); +} +inline const ::io::prometheus::client::Quantile& Summary::quantile(int index) const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Summary.quantile) + return quantile_.Get(index); +} +inline ::io::prometheus::client::Quantile* Summary::mutable_quantile(int index) { + // @@protoc_insertion_point(field_mutable:io.prometheus.client.Summary.quantile) + return quantile_.Mutable(index); +} +inline ::io::prometheus::client::Quantile* Summary::add_quantile() { + // @@protoc_insertion_point(field_add:io.prometheus.client.Summary.quantile) + return quantile_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::Quantile >& +Summary::quantile() const { + // @@protoc_insertion_point(field_list:io.prometheus.client.Summary.quantile) + return quantile_; +} +inline ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::Quantile >* +Summary::mutable_quantile() { + // @@protoc_insertion_point(field_mutable_list:io.prometheus.client.Summary.quantile) + return &quantile_; +} + +// ------------------------------------------------------------------- + +// Untyped + +// optional double value = 1; +inline bool Untyped::has_value() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void Untyped::set_has_value() { + _has_bits_[0] |= 0x00000001u; +} +inline void Untyped::clear_has_value() { + _has_bits_[0] &= ~0x00000001u; +} +inline void Untyped::clear_value() { + value_ = 0; + clear_has_value(); +} +inline double Untyped::value() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Untyped.value) + return value_; +} +inline void Untyped::set_value(double value) { + set_has_value(); + value_ = value; + // @@protoc_insertion_point(field_set:io.prometheus.client.Untyped.value) +} + +// ------------------------------------------------------------------- + +// Histogram + +// optional uint64 sample_count = 1; +inline bool Histogram::has_sample_count() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void Histogram::set_has_sample_count() { + _has_bits_[0] |= 0x00000001u; +} +inline void Histogram::clear_has_sample_count() { + _has_bits_[0] &= ~0x00000001u; +} +inline void Histogram::clear_sample_count() { + sample_count_ = GOOGLE_ULONGLONG(0); + clear_has_sample_count(); +} +inline ::google::protobuf::uint64 Histogram::sample_count() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Histogram.sample_count) + return sample_count_; +} +inline void Histogram::set_sample_count(::google::protobuf::uint64 value) { + set_has_sample_count(); + sample_count_ = value; + // @@protoc_insertion_point(field_set:io.prometheus.client.Histogram.sample_count) +} + +// optional double sample_sum = 2; +inline bool Histogram::has_sample_sum() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void Histogram::set_has_sample_sum() { + _has_bits_[0] |= 0x00000002u; +} +inline void Histogram::clear_has_sample_sum() { + _has_bits_[0] &= ~0x00000002u; +} +inline void Histogram::clear_sample_sum() { + sample_sum_ = 0; + clear_has_sample_sum(); +} +inline double Histogram::sample_sum() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Histogram.sample_sum) + return sample_sum_; +} +inline void Histogram::set_sample_sum(double value) { + set_has_sample_sum(); + sample_sum_ = value; + // @@protoc_insertion_point(field_set:io.prometheus.client.Histogram.sample_sum) +} + +// repeated .io.prometheus.client.Bucket bucket = 3; +inline int Histogram::bucket_size() const { + return bucket_.size(); +} +inline void Histogram::clear_bucket() { + bucket_.Clear(); +} +inline const ::io::prometheus::client::Bucket& Histogram::bucket(int index) const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Histogram.bucket) + return bucket_.Get(index); +} +inline ::io::prometheus::client::Bucket* Histogram::mutable_bucket(int index) { + // @@protoc_insertion_point(field_mutable:io.prometheus.client.Histogram.bucket) + return bucket_.Mutable(index); +} +inline ::io::prometheus::client::Bucket* Histogram::add_bucket() { + // @@protoc_insertion_point(field_add:io.prometheus.client.Histogram.bucket) + return bucket_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::Bucket >& +Histogram::bucket() const { + // @@protoc_insertion_point(field_list:io.prometheus.client.Histogram.bucket) + return bucket_; +} +inline ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::Bucket >* +Histogram::mutable_bucket() { + // @@protoc_insertion_point(field_mutable_list:io.prometheus.client.Histogram.bucket) + return &bucket_; +} + +// ------------------------------------------------------------------- + +// Bucket + +// optional uint64 cumulative_count = 1; +inline bool Bucket::has_cumulative_count() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void Bucket::set_has_cumulative_count() { + _has_bits_[0] |= 0x00000001u; +} +inline void Bucket::clear_has_cumulative_count() { + _has_bits_[0] &= ~0x00000001u; +} +inline void Bucket::clear_cumulative_count() { + cumulative_count_ = GOOGLE_ULONGLONG(0); + clear_has_cumulative_count(); +} +inline ::google::protobuf::uint64 Bucket::cumulative_count() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Bucket.cumulative_count) + return cumulative_count_; +} +inline void Bucket::set_cumulative_count(::google::protobuf::uint64 value) { + set_has_cumulative_count(); + cumulative_count_ = value; + // @@protoc_insertion_point(field_set:io.prometheus.client.Bucket.cumulative_count) +} + +// optional double upper_bound = 2; +inline bool Bucket::has_upper_bound() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void Bucket::set_has_upper_bound() { + _has_bits_[0] |= 0x00000002u; +} +inline void Bucket::clear_has_upper_bound() { + _has_bits_[0] &= ~0x00000002u; +} +inline void Bucket::clear_upper_bound() { + upper_bound_ = 0; + clear_has_upper_bound(); +} +inline double Bucket::upper_bound() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Bucket.upper_bound) + return upper_bound_; +} +inline void Bucket::set_upper_bound(double value) { + set_has_upper_bound(); + upper_bound_ = value; + // @@protoc_insertion_point(field_set:io.prometheus.client.Bucket.upper_bound) +} + +// ------------------------------------------------------------------- + +// Metric + +// repeated .io.prometheus.client.LabelPair label = 1; +inline int Metric::label_size() const { + return label_.size(); +} +inline void Metric::clear_label() { + label_.Clear(); +} +inline const ::io::prometheus::client::LabelPair& Metric::label(int index) const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Metric.label) + return label_.Get(index); +} +inline ::io::prometheus::client::LabelPair* Metric::mutable_label(int index) { + // @@protoc_insertion_point(field_mutable:io.prometheus.client.Metric.label) + return label_.Mutable(index); +} +inline ::io::prometheus::client::LabelPair* Metric::add_label() { + // @@protoc_insertion_point(field_add:io.prometheus.client.Metric.label) + return label_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::LabelPair >& +Metric::label() const { + // @@protoc_insertion_point(field_list:io.prometheus.client.Metric.label) + return label_; +} +inline ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::LabelPair >* +Metric::mutable_label() { + // @@protoc_insertion_point(field_mutable_list:io.prometheus.client.Metric.label) + return &label_; +} + +// optional .io.prometheus.client.Gauge gauge = 2; +inline bool Metric::has_gauge() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void Metric::set_has_gauge() { + _has_bits_[0] |= 0x00000002u; +} +inline void Metric::clear_has_gauge() { + _has_bits_[0] &= ~0x00000002u; +} +inline void Metric::clear_gauge() { + if (gauge_ != NULL) gauge_->::io::prometheus::client::Gauge::Clear(); + clear_has_gauge(); +} +inline const ::io::prometheus::client::Gauge& Metric::gauge() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Metric.gauge) + return gauge_ != NULL ? *gauge_ : *default_instance_->gauge_; +} +inline ::io::prometheus::client::Gauge* Metric::mutable_gauge() { + set_has_gauge(); + if (gauge_ == NULL) gauge_ = new ::io::prometheus::client::Gauge; + // @@protoc_insertion_point(field_mutable:io.prometheus.client.Metric.gauge) + return gauge_; +} +inline ::io::prometheus::client::Gauge* Metric::release_gauge() { + clear_has_gauge(); + ::io::prometheus::client::Gauge* temp = gauge_; + gauge_ = NULL; + return temp; +} +inline void Metric::set_allocated_gauge(::io::prometheus::client::Gauge* gauge) { + delete gauge_; + gauge_ = gauge; + if (gauge) { + set_has_gauge(); + } else { + clear_has_gauge(); + } + // @@protoc_insertion_point(field_set_allocated:io.prometheus.client.Metric.gauge) +} + +// optional .io.prometheus.client.Counter counter = 3; +inline bool Metric::has_counter() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void Metric::set_has_counter() { + _has_bits_[0] |= 0x00000004u; +} +inline void Metric::clear_has_counter() { + _has_bits_[0] &= ~0x00000004u; +} +inline void Metric::clear_counter() { + if (counter_ != NULL) counter_->::io::prometheus::client::Counter::Clear(); + clear_has_counter(); +} +inline const ::io::prometheus::client::Counter& Metric::counter() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Metric.counter) + return counter_ != NULL ? *counter_ : *default_instance_->counter_; +} +inline ::io::prometheus::client::Counter* Metric::mutable_counter() { + set_has_counter(); + if (counter_ == NULL) counter_ = new ::io::prometheus::client::Counter; + // @@protoc_insertion_point(field_mutable:io.prometheus.client.Metric.counter) + return counter_; +} +inline ::io::prometheus::client::Counter* Metric::release_counter() { + clear_has_counter(); + ::io::prometheus::client::Counter* temp = counter_; + counter_ = NULL; + return temp; +} +inline void Metric::set_allocated_counter(::io::prometheus::client::Counter* counter) { + delete counter_; + counter_ = counter; + if (counter) { + set_has_counter(); + } else { + clear_has_counter(); + } + // @@protoc_insertion_point(field_set_allocated:io.prometheus.client.Metric.counter) +} + +// optional .io.prometheus.client.Summary summary = 4; +inline bool Metric::has_summary() const { + return (_has_bits_[0] & 0x00000008u) != 0; +} +inline void Metric::set_has_summary() { + _has_bits_[0] |= 0x00000008u; +} +inline void Metric::clear_has_summary() { + _has_bits_[0] &= ~0x00000008u; +} +inline void Metric::clear_summary() { + if (summary_ != NULL) summary_->::io::prometheus::client::Summary::Clear(); + clear_has_summary(); +} +inline const ::io::prometheus::client::Summary& Metric::summary() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Metric.summary) + return summary_ != NULL ? *summary_ : *default_instance_->summary_; +} +inline ::io::prometheus::client::Summary* Metric::mutable_summary() { + set_has_summary(); + if (summary_ == NULL) summary_ = new ::io::prometheus::client::Summary; + // @@protoc_insertion_point(field_mutable:io.prometheus.client.Metric.summary) + return summary_; +} +inline ::io::prometheus::client::Summary* Metric::release_summary() { + clear_has_summary(); + ::io::prometheus::client::Summary* temp = summary_; + summary_ = NULL; + return temp; +} +inline void Metric::set_allocated_summary(::io::prometheus::client::Summary* summary) { + delete summary_; + summary_ = summary; + if (summary) { + set_has_summary(); + } else { + clear_has_summary(); + } + // @@protoc_insertion_point(field_set_allocated:io.prometheus.client.Metric.summary) +} + +// optional .io.prometheus.client.Untyped untyped = 5; +inline bool Metric::has_untyped() const { + return (_has_bits_[0] & 0x00000010u) != 0; +} +inline void Metric::set_has_untyped() { + _has_bits_[0] |= 0x00000010u; +} +inline void Metric::clear_has_untyped() { + _has_bits_[0] &= ~0x00000010u; +} +inline void Metric::clear_untyped() { + if (untyped_ != NULL) untyped_->::io::prometheus::client::Untyped::Clear(); + clear_has_untyped(); +} +inline const ::io::prometheus::client::Untyped& Metric::untyped() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Metric.untyped) + return untyped_ != NULL ? *untyped_ : *default_instance_->untyped_; +} +inline ::io::prometheus::client::Untyped* Metric::mutable_untyped() { + set_has_untyped(); + if (untyped_ == NULL) untyped_ = new ::io::prometheus::client::Untyped; + // @@protoc_insertion_point(field_mutable:io.prometheus.client.Metric.untyped) + return untyped_; +} +inline ::io::prometheus::client::Untyped* Metric::release_untyped() { + clear_has_untyped(); + ::io::prometheus::client::Untyped* temp = untyped_; + untyped_ = NULL; + return temp; +} +inline void Metric::set_allocated_untyped(::io::prometheus::client::Untyped* untyped) { + delete untyped_; + untyped_ = untyped; + if (untyped) { + set_has_untyped(); + } else { + clear_has_untyped(); + } + // @@protoc_insertion_point(field_set_allocated:io.prometheus.client.Metric.untyped) +} + +// optional .io.prometheus.client.Histogram histogram = 7; +inline bool Metric::has_histogram() const { + return (_has_bits_[0] & 0x00000020u) != 0; +} +inline void Metric::set_has_histogram() { + _has_bits_[0] |= 0x00000020u; +} +inline void Metric::clear_has_histogram() { + _has_bits_[0] &= ~0x00000020u; +} +inline void Metric::clear_histogram() { + if (histogram_ != NULL) histogram_->::io::prometheus::client::Histogram::Clear(); + clear_has_histogram(); +} +inline const ::io::prometheus::client::Histogram& Metric::histogram() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Metric.histogram) + return histogram_ != NULL ? *histogram_ : *default_instance_->histogram_; +} +inline ::io::prometheus::client::Histogram* Metric::mutable_histogram() { + set_has_histogram(); + if (histogram_ == NULL) histogram_ = new ::io::prometheus::client::Histogram; + // @@protoc_insertion_point(field_mutable:io.prometheus.client.Metric.histogram) + return histogram_; +} +inline ::io::prometheus::client::Histogram* Metric::release_histogram() { + clear_has_histogram(); + ::io::prometheus::client::Histogram* temp = histogram_; + histogram_ = NULL; + return temp; +} +inline void Metric::set_allocated_histogram(::io::prometheus::client::Histogram* histogram) { + delete histogram_; + histogram_ = histogram; + if (histogram) { + set_has_histogram(); + } else { + clear_has_histogram(); + } + // @@protoc_insertion_point(field_set_allocated:io.prometheus.client.Metric.histogram) +} + +// optional int64 timestamp_ms = 6; +inline bool Metric::has_timestamp_ms() const { + return (_has_bits_[0] & 0x00000040u) != 0; +} +inline void Metric::set_has_timestamp_ms() { + _has_bits_[0] |= 0x00000040u; +} +inline void Metric::clear_has_timestamp_ms() { + _has_bits_[0] &= ~0x00000040u; +} +inline void Metric::clear_timestamp_ms() { + timestamp_ms_ = GOOGLE_LONGLONG(0); + clear_has_timestamp_ms(); +} +inline ::google::protobuf::int64 Metric::timestamp_ms() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.Metric.timestamp_ms) + return timestamp_ms_; +} +inline void Metric::set_timestamp_ms(::google::protobuf::int64 value) { + set_has_timestamp_ms(); + timestamp_ms_ = value; + // @@protoc_insertion_point(field_set:io.prometheus.client.Metric.timestamp_ms) +} + +// ------------------------------------------------------------------- + +// MetricFamily + +// optional string name = 1; +inline bool MetricFamily::has_name() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void MetricFamily::set_has_name() { + _has_bits_[0] |= 0x00000001u; +} +inline void MetricFamily::clear_has_name() { + _has_bits_[0] &= ~0x00000001u; +} +inline void MetricFamily::clear_name() { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_->clear(); + } + clear_has_name(); +} +inline const ::std::string& MetricFamily::name() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.MetricFamily.name) + return *name_; +} +inline void MetricFamily::set_name(const ::std::string& value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(value); + // @@protoc_insertion_point(field_set:io.prometheus.client.MetricFamily.name) +} +inline void MetricFamily::set_name(const char* value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(value); + // @@protoc_insertion_point(field_set_char:io.prometheus.client.MetricFamily.name) +} +inline void MetricFamily::set_name(const char* value, size_t size) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:io.prometheus.client.MetricFamily.name) +} +inline ::std::string* MetricFamily::mutable_name() { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:io.prometheus.client.MetricFamily.name) + return name_; +} +inline ::std::string* MetricFamily::release_name() { + clear_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = name_; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void MetricFamily::set_allocated_name(::std::string* name) { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete name_; + } + if (name) { + set_has_name(); + name_ = name; + } else { + clear_has_name(); + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:io.prometheus.client.MetricFamily.name) +} + +// optional string help = 2; +inline bool MetricFamily::has_help() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void MetricFamily::set_has_help() { + _has_bits_[0] |= 0x00000002u; +} +inline void MetricFamily::clear_has_help() { + _has_bits_[0] &= ~0x00000002u; +} +inline void MetricFamily::clear_help() { + if (help_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + help_->clear(); + } + clear_has_help(); +} +inline const ::std::string& MetricFamily::help() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.MetricFamily.help) + return *help_; +} +inline void MetricFamily::set_help(const ::std::string& value) { + set_has_help(); + if (help_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + help_ = new ::std::string; + } + help_->assign(value); + // @@protoc_insertion_point(field_set:io.prometheus.client.MetricFamily.help) +} +inline void MetricFamily::set_help(const char* value) { + set_has_help(); + if (help_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + help_ = new ::std::string; + } + help_->assign(value); + // @@protoc_insertion_point(field_set_char:io.prometheus.client.MetricFamily.help) +} +inline void MetricFamily::set_help(const char* value, size_t size) { + set_has_help(); + if (help_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + help_ = new ::std::string; + } + help_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:io.prometheus.client.MetricFamily.help) +} +inline ::std::string* MetricFamily::mutable_help() { + set_has_help(); + if (help_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + help_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:io.prometheus.client.MetricFamily.help) + return help_; +} +inline ::std::string* MetricFamily::release_help() { + clear_has_help(); + if (help_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = help_; + help_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void MetricFamily::set_allocated_help(::std::string* help) { + if (help_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete help_; + } + if (help) { + set_has_help(); + help_ = help; + } else { + clear_has_help(); + help_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:io.prometheus.client.MetricFamily.help) +} + +// optional .io.prometheus.client.MetricType type = 3; +inline bool MetricFamily::has_type() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void MetricFamily::set_has_type() { + _has_bits_[0] |= 0x00000004u; +} +inline void MetricFamily::clear_has_type() { + _has_bits_[0] &= ~0x00000004u; +} +inline void MetricFamily::clear_type() { + type_ = 0; + clear_has_type(); +} +inline ::io::prometheus::client::MetricType MetricFamily::type() const { + // @@protoc_insertion_point(field_get:io.prometheus.client.MetricFamily.type) + return static_cast< ::io::prometheus::client::MetricType >(type_); +} +inline void MetricFamily::set_type(::io::prometheus::client::MetricType value) { + assert(::io::prometheus::client::MetricType_IsValid(value)); + set_has_type(); + type_ = value; + // @@protoc_insertion_point(field_set:io.prometheus.client.MetricFamily.type) +} + +// repeated .io.prometheus.client.Metric metric = 4; +inline int MetricFamily::metric_size() const { + return metric_.size(); +} +inline void MetricFamily::clear_metric() { + metric_.Clear(); +} +inline const ::io::prometheus::client::Metric& MetricFamily::metric(int index) const { + // @@protoc_insertion_point(field_get:io.prometheus.client.MetricFamily.metric) + return metric_.Get(index); +} +inline ::io::prometheus::client::Metric* MetricFamily::mutable_metric(int index) { + // @@protoc_insertion_point(field_mutable:io.prometheus.client.MetricFamily.metric) + return metric_.Mutable(index); +} +inline ::io::prometheus::client::Metric* MetricFamily::add_metric() { + // @@protoc_insertion_point(field_add:io.prometheus.client.MetricFamily.metric) + return metric_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::Metric >& +MetricFamily::metric() const { + // @@protoc_insertion_point(field_list:io.prometheus.client.MetricFamily.metric) + return metric_; +} +inline ::google::protobuf::RepeatedPtrField< ::io::prometheus::client::Metric >* +MetricFamily::mutable_metric() { + // @@protoc_insertion_point(field_mutable_list:io.prometheus.client.MetricFamily.metric) + return &metric_; +} + + +// @@protoc_insertion_point(namespace_scope) + +} // namespace client +} // namespace prometheus +} // namespace io + +#ifndef SWIG +namespace google { +namespace protobuf { + +template <> struct is_proto_enum< ::io::prometheus::client::MetricType> : ::google::protobuf::internal::true_type {}; +template <> +inline const EnumDescriptor* GetEnumDescriptor< ::io::prometheus::client::MetricType>() { + return ::io::prometheus::client::MetricType_descriptor(); +} + +} // namespace google +} // namespace protobuf +#endif // SWIG + +// @@protoc_insertion_point(global_scope) + +#endif // PROTOBUF_metrics_2eproto__INCLUDED diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_model/go/metrics.pb.go b/example/prometheus-mock/vendor/github.com/prometheus/client_model/go/metrics.pb.go new file mode 100644 index 0000000..b065f86 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_model/go/metrics.pb.go @@ -0,0 +1,364 @@ +// Code generated by protoc-gen-go. +// source: metrics.proto +// DO NOT EDIT! + +/* +Package io_prometheus_client is a generated protocol buffer package. + +It is generated from these files: + metrics.proto + +It has these top-level messages: + LabelPair + Gauge + Counter + Quantile + Summary + Untyped + Histogram + Bucket + Metric + MetricFamily +*/ +package io_prometheus_client + +import proto "github.com/golang/protobuf/proto" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = math.Inf + +type MetricType int32 + +const ( + MetricType_COUNTER MetricType = 0 + MetricType_GAUGE MetricType = 1 + MetricType_SUMMARY MetricType = 2 + MetricType_UNTYPED MetricType = 3 + MetricType_HISTOGRAM MetricType = 4 +) + +var MetricType_name = map[int32]string{ + 0: "COUNTER", + 1: "GAUGE", + 2: "SUMMARY", + 3: "UNTYPED", + 4: "HISTOGRAM", +} +var MetricType_value = map[string]int32{ + "COUNTER": 0, + "GAUGE": 1, + "SUMMARY": 2, + "UNTYPED": 3, + "HISTOGRAM": 4, +} + +func (x MetricType) Enum() *MetricType { + p := new(MetricType) + *p = x + return p +} +func (x MetricType) String() string { + return proto.EnumName(MetricType_name, int32(x)) +} +func (x *MetricType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(MetricType_value, data, "MetricType") + if err != nil { + return err + } + *x = MetricType(value) + return nil +} + +type LabelPair struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Value *string `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *LabelPair) Reset() { *m = LabelPair{} } +func (m *LabelPair) String() string { return proto.CompactTextString(m) } +func (*LabelPair) ProtoMessage() {} + +func (m *LabelPair) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *LabelPair) GetValue() string { + if m != nil && m.Value != nil { + return *m.Value + } + return "" +} + +type Gauge struct { + Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Gauge) Reset() { *m = Gauge{} } +func (m *Gauge) String() string { return proto.CompactTextString(m) } +func (*Gauge) ProtoMessage() {} + +func (m *Gauge) GetValue() float64 { + if m != nil && m.Value != nil { + return *m.Value + } + return 0 +} + +type Counter struct { + Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Counter) Reset() { *m = Counter{} } +func (m *Counter) String() string { return proto.CompactTextString(m) } +func (*Counter) ProtoMessage() {} + +func (m *Counter) GetValue() float64 { + if m != nil && m.Value != nil { + return *m.Value + } + return 0 +} + +type Quantile struct { + Quantile *float64 `protobuf:"fixed64,1,opt,name=quantile" json:"quantile,omitempty"` + Value *float64 `protobuf:"fixed64,2,opt,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Quantile) Reset() { *m = Quantile{} } +func (m *Quantile) String() string { return proto.CompactTextString(m) } +func (*Quantile) ProtoMessage() {} + +func (m *Quantile) GetQuantile() float64 { + if m != nil && m.Quantile != nil { + return *m.Quantile + } + return 0 +} + +func (m *Quantile) GetValue() float64 { + if m != nil && m.Value != nil { + return *m.Value + } + return 0 +} + +type Summary struct { + SampleCount *uint64 `protobuf:"varint,1,opt,name=sample_count" json:"sample_count,omitempty"` + SampleSum *float64 `protobuf:"fixed64,2,opt,name=sample_sum" json:"sample_sum,omitempty"` + Quantile []*Quantile `protobuf:"bytes,3,rep,name=quantile" json:"quantile,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Summary) Reset() { *m = Summary{} } +func (m *Summary) String() string { return proto.CompactTextString(m) } +func (*Summary) ProtoMessage() {} + +func (m *Summary) GetSampleCount() uint64 { + if m != nil && m.SampleCount != nil { + return *m.SampleCount + } + return 0 +} + +func (m *Summary) GetSampleSum() float64 { + if m != nil && m.SampleSum != nil { + return *m.SampleSum + } + return 0 +} + +func (m *Summary) GetQuantile() []*Quantile { + if m != nil { + return m.Quantile + } + return nil +} + +type Untyped struct { + Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Untyped) Reset() { *m = Untyped{} } +func (m *Untyped) String() string { return proto.CompactTextString(m) } +func (*Untyped) ProtoMessage() {} + +func (m *Untyped) GetValue() float64 { + if m != nil && m.Value != nil { + return *m.Value + } + return 0 +} + +type Histogram struct { + SampleCount *uint64 `protobuf:"varint,1,opt,name=sample_count" json:"sample_count,omitempty"` + SampleSum *float64 `protobuf:"fixed64,2,opt,name=sample_sum" json:"sample_sum,omitempty"` + Bucket []*Bucket `protobuf:"bytes,3,rep,name=bucket" json:"bucket,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Histogram) Reset() { *m = Histogram{} } +func (m *Histogram) String() string { return proto.CompactTextString(m) } +func (*Histogram) ProtoMessage() {} + +func (m *Histogram) GetSampleCount() uint64 { + if m != nil && m.SampleCount != nil { + return *m.SampleCount + } + return 0 +} + +func (m *Histogram) GetSampleSum() float64 { + if m != nil && m.SampleSum != nil { + return *m.SampleSum + } + return 0 +} + +func (m *Histogram) GetBucket() []*Bucket { + if m != nil { + return m.Bucket + } + return nil +} + +type Bucket struct { + CumulativeCount *uint64 `protobuf:"varint,1,opt,name=cumulative_count" json:"cumulative_count,omitempty"` + UpperBound *float64 `protobuf:"fixed64,2,opt,name=upper_bound" json:"upper_bound,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Bucket) Reset() { *m = Bucket{} } +func (m *Bucket) String() string { return proto.CompactTextString(m) } +func (*Bucket) ProtoMessage() {} + +func (m *Bucket) GetCumulativeCount() uint64 { + if m != nil && m.CumulativeCount != nil { + return *m.CumulativeCount + } + return 0 +} + +func (m *Bucket) GetUpperBound() float64 { + if m != nil && m.UpperBound != nil { + return *m.UpperBound + } + return 0 +} + +type Metric struct { + Label []*LabelPair `protobuf:"bytes,1,rep,name=label" json:"label,omitempty"` + Gauge *Gauge `protobuf:"bytes,2,opt,name=gauge" json:"gauge,omitempty"` + Counter *Counter `protobuf:"bytes,3,opt,name=counter" json:"counter,omitempty"` + Summary *Summary `protobuf:"bytes,4,opt,name=summary" json:"summary,omitempty"` + Untyped *Untyped `protobuf:"bytes,5,opt,name=untyped" json:"untyped,omitempty"` + Histogram *Histogram `protobuf:"bytes,7,opt,name=histogram" json:"histogram,omitempty"` + TimestampMs *int64 `protobuf:"varint,6,opt,name=timestamp_ms" json:"timestamp_ms,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Metric) Reset() { *m = Metric{} } +func (m *Metric) String() string { return proto.CompactTextString(m) } +func (*Metric) ProtoMessage() {} + +func (m *Metric) GetLabel() []*LabelPair { + if m != nil { + return m.Label + } + return nil +} + +func (m *Metric) GetGauge() *Gauge { + if m != nil { + return m.Gauge + } + return nil +} + +func (m *Metric) GetCounter() *Counter { + if m != nil { + return m.Counter + } + return nil +} + +func (m *Metric) GetSummary() *Summary { + if m != nil { + return m.Summary + } + return nil +} + +func (m *Metric) GetUntyped() *Untyped { + if m != nil { + return m.Untyped + } + return nil +} + +func (m *Metric) GetHistogram() *Histogram { + if m != nil { + return m.Histogram + } + return nil +} + +func (m *Metric) GetTimestampMs() int64 { + if m != nil && m.TimestampMs != nil { + return *m.TimestampMs + } + return 0 +} + +type MetricFamily struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Help *string `protobuf:"bytes,2,opt,name=help" json:"help,omitempty"` + Type *MetricType `protobuf:"varint,3,opt,name=type,enum=io.prometheus.client.MetricType" json:"type,omitempty"` + Metric []*Metric `protobuf:"bytes,4,rep,name=metric" json:"metric,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *MetricFamily) Reset() { *m = MetricFamily{} } +func (m *MetricFamily) String() string { return proto.CompactTextString(m) } +func (*MetricFamily) ProtoMessage() {} + +func (m *MetricFamily) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *MetricFamily) GetHelp() string { + if m != nil && m.Help != nil { + return *m.Help + } + return "" +} + +func (m *MetricFamily) GetType() MetricType { + if m != nil && m.Type != nil { + return *m.Type + } + return MetricType_COUNTER +} + +func (m *MetricFamily) GetMetric() []*Metric { + if m != nil { + return m.Metric + } + return nil +} + +func init() { + proto.RegisterEnum("io.prometheus.client.MetricType", MetricType_name, MetricType_value) +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_model/metrics.proto b/example/prometheus-mock/vendor/github.com/prometheus/client_model/metrics.proto new file mode 100644 index 0000000..0b84af9 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_model/metrics.proto @@ -0,0 +1,81 @@ +// Copyright 2013 Prometheus Team +// 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. + +syntax = "proto2"; + +package io.prometheus.client; +option java_package = "io.prometheus.client"; + +message LabelPair { + optional string name = 1; + optional string value = 2; +} + +enum MetricType { + COUNTER = 0; + GAUGE = 1; + SUMMARY = 2; + UNTYPED = 3; + HISTOGRAM = 4; +} + +message Gauge { + optional double value = 1; +} + +message Counter { + optional double value = 1; +} + +message Quantile { + optional double quantile = 1; + optional double value = 2; +} + +message Summary { + optional uint64 sample_count = 1; + optional double sample_sum = 2; + repeated Quantile quantile = 3; +} + +message Untyped { + optional double value = 1; +} + +message Histogram { + optional uint64 sample_count = 1; + optional double sample_sum = 2; + repeated Bucket bucket = 3; // Ordered in increasing order of upper_bound, +Inf bucket is optional. +} + +message Bucket { + optional uint64 cumulative_count = 1; // Cumulative in increasing order. + optional double upper_bound = 2; // Inclusive. +} + +message Metric { + repeated LabelPair label = 1; + optional Gauge gauge = 2; + optional Counter counter = 3; + optional Summary summary = 4; + optional Untyped untyped = 5; + optional Histogram histogram = 7; + optional int64 timestamp_ms = 6; +} + +message MetricFamily { + optional string name = 1; + optional string help = 2; + optional MetricType type = 3; + repeated Metric metric = 4; +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_model/pom.xml b/example/prometheus-mock/vendor/github.com/prometheus/client_model/pom.xml new file mode 100644 index 0000000..4d34c90 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_model/pom.xml @@ -0,0 +1,130 @@ + + + 4.0.0 + + io.prometheus.client + model + 0.0.3-SNAPSHOT + + + org.sonatype.oss + oss-parent + 7 + + + Prometheus Client Data Model + http://github.com/prometheus/client_model + + Prometheus Client Data Model: Generated Protocol Buffer Assets + + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + scm:git:git@github.com:prometheus/client_model.git + scm:git:git@github.com:prometheus/client_model.git + git@github.com:prometheus/client_model.git + + + + + mtp + Matt T. Proud + matt.proud@gmail.com + + + + + + com.google.protobuf + protobuf-java + 2.5.0 + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.8 + + UTF-8 + UTF-8 + true + + + + generate-javadoc-site-report + site + + javadoc + + + + attach-javadocs + + jar + + + + + + maven-compiler-plugin + + 1.6 + 1.6 + + 3.1 + + + org.apache.maven.plugins + maven-source-plugin + 2.2.1 + + + attach-sources + + jar + + + + + + + + + release-sign-artifacts + + + performRelease + true + + + + + + org.apache.maven.plugins + maven-gpg-plugin + 1.4 + + + sign-artifacts + verify + + sign + + + + + + + + + diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_model/python/prometheus/__init__.py b/example/prometheus-mock/vendor/github.com/prometheus/client_model/python/prometheus/__init__.py new file mode 100644 index 0000000..617c0ce --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_model/python/prometheus/__init__.py @@ -0,0 +1,12 @@ + # Copyright 2013 Prometheus Team + # 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/example/prometheus-mock/vendor/github.com/prometheus/client_model/python/prometheus/client/__init__.py b/example/prometheus-mock/vendor/github.com/prometheus/client_model/python/prometheus/client/__init__.py new file mode 100644 index 0000000..617c0ce --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_model/python/prometheus/client/__init__.py @@ -0,0 +1,12 @@ + # Copyright 2013 Prometheus Team + # 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/example/prometheus-mock/vendor/github.com/prometheus/client_model/python/prometheus/client/model/__init__.py b/example/prometheus-mock/vendor/github.com/prometheus/client_model/python/prometheus/client/model/__init__.py new file mode 100644 index 0000000..d40327c --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_model/python/prometheus/client/model/__init__.py @@ -0,0 +1,14 @@ + # Copyright 2013 Prometheus Team + # 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. + +__all__ = ['metrics_pb2'] diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_model/python/prometheus/client/model/metrics_pb2.py b/example/prometheus-mock/vendor/github.com/prometheus/client_model/python/prometheus/client/model/metrics_pb2.py new file mode 100644 index 0000000..8c239ac --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_model/python/prometheus/client/model/metrics_pb2.py @@ -0,0 +1,575 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: metrics.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf.internal import enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +from google.protobuf import descriptor_pb2 +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='metrics.proto', + package='io.prometheus.client', + serialized_pb=_b('\n\rmetrics.proto\x12\x14io.prometheus.client\"(\n\tLabelPair\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"\x16\n\x05Gauge\x12\r\n\x05value\x18\x01 \x01(\x01\"\x18\n\x07\x43ounter\x12\r\n\x05value\x18\x01 \x01(\x01\"+\n\x08Quantile\x12\x10\n\x08quantile\x18\x01 \x01(\x01\x12\r\n\x05value\x18\x02 \x01(\x01\"e\n\x07Summary\x12\x14\n\x0csample_count\x18\x01 \x01(\x04\x12\x12\n\nsample_sum\x18\x02 \x01(\x01\x12\x30\n\x08quantile\x18\x03 \x03(\x0b\x32\x1e.io.prometheus.client.Quantile\"\x18\n\x07Untyped\x12\r\n\x05value\x18\x01 \x01(\x01\"c\n\tHistogram\x12\x14\n\x0csample_count\x18\x01 \x01(\x04\x12\x12\n\nsample_sum\x18\x02 \x01(\x01\x12,\n\x06\x62ucket\x18\x03 \x03(\x0b\x32\x1c.io.prometheus.client.Bucket\"7\n\x06\x42ucket\x12\x18\n\x10\x63umulative_count\x18\x01 \x01(\x04\x12\x13\n\x0bupper_bound\x18\x02 \x01(\x01\"\xbe\x02\n\x06Metric\x12.\n\x05label\x18\x01 \x03(\x0b\x32\x1f.io.prometheus.client.LabelPair\x12*\n\x05gauge\x18\x02 \x01(\x0b\x32\x1b.io.prometheus.client.Gauge\x12.\n\x07\x63ounter\x18\x03 \x01(\x0b\x32\x1d.io.prometheus.client.Counter\x12.\n\x07summary\x18\x04 \x01(\x0b\x32\x1d.io.prometheus.client.Summary\x12.\n\x07untyped\x18\x05 \x01(\x0b\x32\x1d.io.prometheus.client.Untyped\x12\x32\n\thistogram\x18\x07 \x01(\x0b\x32\x1f.io.prometheus.client.Histogram\x12\x14\n\x0ctimestamp_ms\x18\x06 \x01(\x03\"\x88\x01\n\x0cMetricFamily\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04help\x18\x02 \x01(\t\x12.\n\x04type\x18\x03 \x01(\x0e\x32 .io.prometheus.client.MetricType\x12,\n\x06metric\x18\x04 \x03(\x0b\x32\x1c.io.prometheus.client.Metric*M\n\nMetricType\x12\x0b\n\x07\x43OUNTER\x10\x00\x12\t\n\x05GAUGE\x10\x01\x12\x0b\n\x07SUMMARY\x10\x02\x12\x0b\n\x07UNTYPED\x10\x03\x12\r\n\tHISTOGRAM\x10\x04\x42\x16\n\x14io.prometheus.client') +) +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +_METRICTYPE = _descriptor.EnumDescriptor( + name='MetricType', + full_name='io.prometheus.client.MetricType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='COUNTER', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='GAUGE', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SUMMARY', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='UNTYPED', index=3, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HISTOGRAM', index=4, number=4, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=923, + serialized_end=1000, +) +_sym_db.RegisterEnumDescriptor(_METRICTYPE) + +MetricType = enum_type_wrapper.EnumTypeWrapper(_METRICTYPE) +COUNTER = 0 +GAUGE = 1 +SUMMARY = 2 +UNTYPED = 3 +HISTOGRAM = 4 + + + +_LABELPAIR = _descriptor.Descriptor( + name='LabelPair', + full_name='io.prometheus.client.LabelPair', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='io.prometheus.client.LabelPair.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='value', full_name='io.prometheus.client.LabelPair.value', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=39, + serialized_end=79, +) + + +_GAUGE = _descriptor.Descriptor( + name='Gauge', + full_name='io.prometheus.client.Gauge', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='value', full_name='io.prometheus.client.Gauge.value', index=0, + number=1, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=81, + serialized_end=103, +) + + +_COUNTER = _descriptor.Descriptor( + name='Counter', + full_name='io.prometheus.client.Counter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='value', full_name='io.prometheus.client.Counter.value', index=0, + number=1, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=105, + serialized_end=129, +) + + +_QUANTILE = _descriptor.Descriptor( + name='Quantile', + full_name='io.prometheus.client.Quantile', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='quantile', full_name='io.prometheus.client.Quantile.quantile', index=0, + number=1, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='value', full_name='io.prometheus.client.Quantile.value', index=1, + number=2, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=131, + serialized_end=174, +) + + +_SUMMARY = _descriptor.Descriptor( + name='Summary', + full_name='io.prometheus.client.Summary', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='sample_count', full_name='io.prometheus.client.Summary.sample_count', index=0, + number=1, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='sample_sum', full_name='io.prometheus.client.Summary.sample_sum', index=1, + number=2, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='quantile', full_name='io.prometheus.client.Summary.quantile', index=2, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=176, + serialized_end=277, +) + + +_UNTYPED = _descriptor.Descriptor( + name='Untyped', + full_name='io.prometheus.client.Untyped', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='value', full_name='io.prometheus.client.Untyped.value', index=0, + number=1, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=279, + serialized_end=303, +) + + +_HISTOGRAM = _descriptor.Descriptor( + name='Histogram', + full_name='io.prometheus.client.Histogram', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='sample_count', full_name='io.prometheus.client.Histogram.sample_count', index=0, + number=1, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='sample_sum', full_name='io.prometheus.client.Histogram.sample_sum', index=1, + number=2, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='bucket', full_name='io.prometheus.client.Histogram.bucket', index=2, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=305, + serialized_end=404, +) + + +_BUCKET = _descriptor.Descriptor( + name='Bucket', + full_name='io.prometheus.client.Bucket', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='cumulative_count', full_name='io.prometheus.client.Bucket.cumulative_count', index=0, + number=1, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='upper_bound', full_name='io.prometheus.client.Bucket.upper_bound', index=1, + number=2, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=406, + serialized_end=461, +) + + +_METRIC = _descriptor.Descriptor( + name='Metric', + full_name='io.prometheus.client.Metric', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='label', full_name='io.prometheus.client.Metric.label', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='gauge', full_name='io.prometheus.client.Metric.gauge', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='counter', full_name='io.prometheus.client.Metric.counter', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='summary', full_name='io.prometheus.client.Metric.summary', index=3, + number=4, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='untyped', full_name='io.prometheus.client.Metric.untyped', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='histogram', full_name='io.prometheus.client.Metric.histogram', index=5, + number=7, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='timestamp_ms', full_name='io.prometheus.client.Metric.timestamp_ms', index=6, + number=6, type=3, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=464, + serialized_end=782, +) + + +_METRICFAMILY = _descriptor.Descriptor( + name='MetricFamily', + full_name='io.prometheus.client.MetricFamily', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='io.prometheus.client.MetricFamily.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='help', full_name='io.prometheus.client.MetricFamily.help', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='type', full_name='io.prometheus.client.MetricFamily.type', index=2, + number=3, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='metric', full_name='io.prometheus.client.MetricFamily.metric', index=3, + number=4, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + oneofs=[ + ], + serialized_start=785, + serialized_end=921, +) + +_SUMMARY.fields_by_name['quantile'].message_type = _QUANTILE +_HISTOGRAM.fields_by_name['bucket'].message_type = _BUCKET +_METRIC.fields_by_name['label'].message_type = _LABELPAIR +_METRIC.fields_by_name['gauge'].message_type = _GAUGE +_METRIC.fields_by_name['counter'].message_type = _COUNTER +_METRIC.fields_by_name['summary'].message_type = _SUMMARY +_METRIC.fields_by_name['untyped'].message_type = _UNTYPED +_METRIC.fields_by_name['histogram'].message_type = _HISTOGRAM +_METRICFAMILY.fields_by_name['type'].enum_type = _METRICTYPE +_METRICFAMILY.fields_by_name['metric'].message_type = _METRIC +DESCRIPTOR.message_types_by_name['LabelPair'] = _LABELPAIR +DESCRIPTOR.message_types_by_name['Gauge'] = _GAUGE +DESCRIPTOR.message_types_by_name['Counter'] = _COUNTER +DESCRIPTOR.message_types_by_name['Quantile'] = _QUANTILE +DESCRIPTOR.message_types_by_name['Summary'] = _SUMMARY +DESCRIPTOR.message_types_by_name['Untyped'] = _UNTYPED +DESCRIPTOR.message_types_by_name['Histogram'] = _HISTOGRAM +DESCRIPTOR.message_types_by_name['Bucket'] = _BUCKET +DESCRIPTOR.message_types_by_name['Metric'] = _METRIC +DESCRIPTOR.message_types_by_name['MetricFamily'] = _METRICFAMILY +DESCRIPTOR.enum_types_by_name['MetricType'] = _METRICTYPE + +LabelPair = _reflection.GeneratedProtocolMessageType('LabelPair', (_message.Message,), dict( + DESCRIPTOR = _LABELPAIR, + __module__ = 'metrics_pb2' + # @@protoc_insertion_point(class_scope:io.prometheus.client.LabelPair) + )) +_sym_db.RegisterMessage(LabelPair) + +Gauge = _reflection.GeneratedProtocolMessageType('Gauge', (_message.Message,), dict( + DESCRIPTOR = _GAUGE, + __module__ = 'metrics_pb2' + # @@protoc_insertion_point(class_scope:io.prometheus.client.Gauge) + )) +_sym_db.RegisterMessage(Gauge) + +Counter = _reflection.GeneratedProtocolMessageType('Counter', (_message.Message,), dict( + DESCRIPTOR = _COUNTER, + __module__ = 'metrics_pb2' + # @@protoc_insertion_point(class_scope:io.prometheus.client.Counter) + )) +_sym_db.RegisterMessage(Counter) + +Quantile = _reflection.GeneratedProtocolMessageType('Quantile', (_message.Message,), dict( + DESCRIPTOR = _QUANTILE, + __module__ = 'metrics_pb2' + # @@protoc_insertion_point(class_scope:io.prometheus.client.Quantile) + )) +_sym_db.RegisterMessage(Quantile) + +Summary = _reflection.GeneratedProtocolMessageType('Summary', (_message.Message,), dict( + DESCRIPTOR = _SUMMARY, + __module__ = 'metrics_pb2' + # @@protoc_insertion_point(class_scope:io.prometheus.client.Summary) + )) +_sym_db.RegisterMessage(Summary) + +Untyped = _reflection.GeneratedProtocolMessageType('Untyped', (_message.Message,), dict( + DESCRIPTOR = _UNTYPED, + __module__ = 'metrics_pb2' + # @@protoc_insertion_point(class_scope:io.prometheus.client.Untyped) + )) +_sym_db.RegisterMessage(Untyped) + +Histogram = _reflection.GeneratedProtocolMessageType('Histogram', (_message.Message,), dict( + DESCRIPTOR = _HISTOGRAM, + __module__ = 'metrics_pb2' + # @@protoc_insertion_point(class_scope:io.prometheus.client.Histogram) + )) +_sym_db.RegisterMessage(Histogram) + +Bucket = _reflection.GeneratedProtocolMessageType('Bucket', (_message.Message,), dict( + DESCRIPTOR = _BUCKET, + __module__ = 'metrics_pb2' + # @@protoc_insertion_point(class_scope:io.prometheus.client.Bucket) + )) +_sym_db.RegisterMessage(Bucket) + +Metric = _reflection.GeneratedProtocolMessageType('Metric', (_message.Message,), dict( + DESCRIPTOR = _METRIC, + __module__ = 'metrics_pb2' + # @@protoc_insertion_point(class_scope:io.prometheus.client.Metric) + )) +_sym_db.RegisterMessage(Metric) + +MetricFamily = _reflection.GeneratedProtocolMessageType('MetricFamily', (_message.Message,), dict( + DESCRIPTOR = _METRICFAMILY, + __module__ = 'metrics_pb2' + # @@protoc_insertion_point(class_scope:io.prometheus.client.MetricFamily) + )) +_sym_db.RegisterMessage(MetricFamily) + + +DESCRIPTOR.has_options = True +DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\024io.prometheus.client')) +# @@protoc_insertion_point(module_scope) diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/.gitignore b/example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/.gitignore new file mode 100644 index 0000000..8442a47 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/.gitignore @@ -0,0 +1,5 @@ +*.gem +.bundle +Gemfile.lock +pkg +vendor/bundle diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/Gemfile b/example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/Gemfile new file mode 100644 index 0000000..1ff638c --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/Gemfile @@ -0,0 +1,4 @@ +source 'https://rubygems.org' + +# Specify your gem's dependencies in prometheus-client-model.gemspec +gemspec diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/LICENSE b/example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/LICENSE new file mode 100644 index 0000000..11069ed --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/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 [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/example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/Makefile b/example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/Makefile new file mode 100644 index 0000000..09d544b --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/Makefile @@ -0,0 +1,17 @@ +VENDOR_BUNDLE = vendor/bundle + +build: $(VENDOR_BUNDLE)/.bundled + BEEFCAKE_NAMESPACE=Prometheus::Client protoc --beefcake_out lib/prometheus/client/model -I .. ../metrics.proto + +$(VENDOR_BUNDLE): + mkdir -p $@ + +$(VENDOR_BUNDLE)/.bundled: $(VENDOR_BUNDLE) Gemfile + bundle install --quiet --path $< + @touch $@ + +clean: + -rm -f lib/prometheus/client/model/metrics.pb.rb + -rm -rf $(VENDOR_BUNDLE) + +.PHONY: build clean diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/README.md b/example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/README.md new file mode 100644 index 0000000..c45fcc7 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/README.md @@ -0,0 +1,31 @@ +# Prometheus Ruby client model + +Data model artifacts for the [Prometheus Ruby client][1]. + +## Installation + + gem install prometheus-client-model + +## Usage + +Build the artifacts from the protobuf specification: + + make build + +While this Gem's main purpose is to define the Prometheus data types for the +[client][1], it's possible to use it without the client to decode a stream of +delimited protobuf messages: + +```ruby +require 'open-uri' +require 'prometheus/client/model' + +CONTENT_TYPE = 'application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=delimited' + +stream = open('http://localhost:9090/metrics', 'Accept' => CONTENT_TYPE).read +while family = Prometheus::Client::MetricFamily.read_delimited(stream) + puts family +end +``` + +[1]: https://github.com/prometheus/client_ruby diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/Rakefile b/example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/Rakefile new file mode 100644 index 0000000..2995527 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/Rakefile @@ -0,0 +1 @@ +require "bundler/gem_tasks" diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/lib/prometheus/client/model.rb b/example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/lib/prometheus/client/model.rb new file mode 100644 index 0000000..b5303bf --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/lib/prometheus/client/model.rb @@ -0,0 +1,2 @@ +require 'prometheus/client/model/metrics.pb' +require 'prometheus/client/model/version' diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/lib/prometheus/client/model/metrics.pb.rb b/example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/lib/prometheus/client/model/metrics.pb.rb new file mode 100644 index 0000000..a72114b --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/lib/prometheus/client/model/metrics.pb.rb @@ -0,0 +1,111 @@ +## Generated from metrics.proto for io.prometheus.client +require "beefcake" + +module Prometheus + module Client + + module MetricType + COUNTER = 0 + GAUGE = 1 + SUMMARY = 2 + UNTYPED = 3 + HISTOGRAM = 4 + end + + class LabelPair + include Beefcake::Message + end + + class Gauge + include Beefcake::Message + end + + class Counter + include Beefcake::Message + end + + class Quantile + include Beefcake::Message + end + + class Summary + include Beefcake::Message + end + + class Untyped + include Beefcake::Message + end + + class Histogram + include Beefcake::Message + end + + class Bucket + include Beefcake::Message + end + + class Metric + include Beefcake::Message + end + + class MetricFamily + include Beefcake::Message + end + + class LabelPair + optional :name, :string, 1 + optional :value, :string, 2 + end + + class Gauge + optional :value, :double, 1 + end + + class Counter + optional :value, :double, 1 + end + + class Quantile + optional :quantile, :double, 1 + optional :value, :double, 2 + end + + class Summary + optional :sample_count, :uint64, 1 + optional :sample_sum, :double, 2 + repeated :quantile, Quantile, 3 + end + + class Untyped + optional :value, :double, 1 + end + + class Histogram + optional :sample_count, :uint64, 1 + optional :sample_sum, :double, 2 + repeated :bucket, Bucket, 3 + end + + class Bucket + optional :cumulative_count, :uint64, 1 + optional :upper_bound, :double, 2 + end + + class Metric + repeated :label, LabelPair, 1 + optional :gauge, Gauge, 2 + optional :counter, Counter, 3 + optional :summary, Summary, 4 + optional :untyped, Untyped, 5 + optional :histogram, Histogram, 7 + optional :timestamp_ms, :int64, 6 + end + + class MetricFamily + optional :name, :string, 1 + optional :help, :string, 2 + optional :type, MetricType, 3 + repeated :metric, Metric, 4 + end + end +end diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/lib/prometheus/client/model/version.rb b/example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/lib/prometheus/client/model/version.rb new file mode 100644 index 0000000..00b5e86 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/lib/prometheus/client/model/version.rb @@ -0,0 +1,7 @@ +module Prometheus + module Client + module Model + VERSION = '0.1.0' + end + end +end diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/prometheus-client-model.gemspec b/example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/prometheus-client-model.gemspec new file mode 100644 index 0000000..438ba12 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_model/ruby/prometheus-client-model.gemspec @@ -0,0 +1,22 @@ +# coding: utf-8 +lib = File.expand_path('../lib', __FILE__) +$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) +require 'prometheus/client/model/version' + +Gem::Specification.new do |spec| + spec.name = 'prometheus-client-model' + spec.version = Prometheus::Client::Model::VERSION + spec.authors = ['Tobias Schmidt'] + spec.email = ['tobidt@gmail.com'] + spec.summary = 'Data model artifacts for the Prometheus Ruby client' + spec.homepage = 'https://github.com/prometheus/client_model/tree/master/ruby' + spec.license = 'Apache 2.0' + + spec.files = %w[README.md LICENSE] + Dir.glob('{lib/**/*}') + spec.require_paths = ['lib'] + + spec.add_dependency 'beefcake', '>= 0.4.0' + + spec.add_development_dependency 'bundler', '~> 1.3' + spec.add_development_dependency 'rake' +end diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_model/setup.py b/example/prometheus-mock/vendor/github.com/prometheus/client_model/setup.py new file mode 100644 index 0000000..67b9f20 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_model/setup.py @@ -0,0 +1,23 @@ +#!/usr/bin/python + +from setuptools import setup + +setup( + name = 'prometheus_client_model', + version = '0.0.1', + author = 'Matt T. Proud', + author_email = 'matt.proud@gmail.com', + description = 'Data model artifacts for the Prometheus client.', + license = 'Apache License 2.0', + url = 'http://github.com/prometheus/client_model', + packages = ['prometheus', 'prometheus/client', 'prometheus/client/model'], + package_dir = {'': 'python'}, + requires = ['protobuf(==2.4.1)'], + platforms = 'Platform Independent', + classifiers = ['Development Status :: 3 - Alpha', + 'Intended Audience :: Developers', + 'Intended Audience :: System Administrators', + 'License :: OSI Approved :: Apache Software License', + 'Operating System :: OS Independent', + 'Topic :: Software Development :: Testing', + 'Topic :: System :: Monitoring']) diff --git a/example/prometheus-mock/vendor/github.com/prometheus/client_model/src/main/java/io/prometheus/client/Metrics.java b/example/prometheus-mock/vendor/github.com/prometheus/client_model/src/main/java/io/prometheus/client/Metrics.java new file mode 100644 index 0000000..fb6218e --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/client_model/src/main/java/io/prometheus/client/Metrics.java @@ -0,0 +1,7683 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: metrics.proto + +package io.prometheus.client; + +public final class Metrics { + private Metrics() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + } + /** + * Protobuf enum {@code io.prometheus.client.MetricType} + */ + public enum MetricType + implements com.google.protobuf.ProtocolMessageEnum { + /** + * COUNTER = 0; + */ + COUNTER(0, 0), + /** + * GAUGE = 1; + */ + GAUGE(1, 1), + /** + * SUMMARY = 2; + */ + SUMMARY(2, 2), + /** + * UNTYPED = 3; + */ + UNTYPED(3, 3), + /** + * HISTOGRAM = 4; + */ + HISTOGRAM(4, 4), + ; + + /** + * COUNTER = 0; + */ + public static final int COUNTER_VALUE = 0; + /** + * GAUGE = 1; + */ + public static final int GAUGE_VALUE = 1; + /** + * SUMMARY = 2; + */ + public static final int SUMMARY_VALUE = 2; + /** + * UNTYPED = 3; + */ + public static final int UNTYPED_VALUE = 3; + /** + * HISTOGRAM = 4; + */ + public static final int HISTOGRAM_VALUE = 4; + + + public final int getNumber() { return value; } + + public static MetricType valueOf(int value) { + switch (value) { + case 0: return COUNTER; + case 1: return GAUGE; + case 2: return SUMMARY; + case 3: return UNTYPED; + case 4: return HISTOGRAM; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static com.google.protobuf.Internal.EnumLiteMap + internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public MetricType findValueByNumber(int number) { + return MetricType.valueOf(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(index); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return io.prometheus.client.Metrics.getDescriptor().getEnumTypes().get(0); + } + + private static final MetricType[] VALUES = values(); + + public static MetricType valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int index; + private final int value; + + private MetricType(int index, int value) { + this.index = index; + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:io.prometheus.client.MetricType) + } + + public interface LabelPairOrBuilder extends + // @@protoc_insertion_point(interface_extends:io.prometheus.client.LabelPair) + com.google.protobuf.MessageOrBuilder { + + /** + * optional string name = 1; + */ + boolean hasName(); + /** + * optional string name = 1; + */ + java.lang.String getName(); + /** + * optional string name = 1; + */ + com.google.protobuf.ByteString + getNameBytes(); + + /** + * optional string value = 2; + */ + boolean hasValue(); + /** + * optional string value = 2; + */ + java.lang.String getValue(); + /** + * optional string value = 2; + */ + com.google.protobuf.ByteString + getValueBytes(); + } + /** + * Protobuf type {@code io.prometheus.client.LabelPair} + */ + public static final class LabelPair extends + com.google.protobuf.GeneratedMessage implements + // @@protoc_insertion_point(message_implements:io.prometheus.client.LabelPair) + LabelPairOrBuilder { + // Use LabelPair.newBuilder() to construct. + private LabelPair(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private LabelPair(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final LabelPair defaultInstance; + public static LabelPair getDefaultInstance() { + return defaultInstance; + } + + public LabelPair getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private LabelPair( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000001; + name_ = bs; + break; + } + case 18: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000002; + value_ = bs; + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_LabelPair_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_LabelPair_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.LabelPair.class, io.prometheus.client.Metrics.LabelPair.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public LabelPair parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new LabelPair(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + public static final int NAME_FIELD_NUMBER = 1; + private java.lang.Object name_; + /** + * optional string name = 1; + */ + public boolean hasName() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string name = 1; + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + name_ = s; + } + return s; + } + } + /** + * optional string name = 1; + */ + public com.google.protobuf.ByteString + getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int VALUE_FIELD_NUMBER = 2; + private java.lang.Object value_; + /** + * optional string value = 2; + */ + public boolean hasValue() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string value = 2; + */ + public java.lang.String getValue() { + java.lang.Object ref = value_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + value_ = s; + } + return s; + } + } + /** + * optional string value = 2; + */ + public com.google.protobuf.ByteString + getValueBytes() { + java.lang.Object ref = value_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + value_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private void initFields() { + name_ = ""; + value_ = ""; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, getNameBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, getValueBytes()); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, getNameBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, getValueBytes()); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static io.prometheus.client.Metrics.LabelPair parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.LabelPair parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.LabelPair parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.LabelPair parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.LabelPair parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.LabelPair parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.LabelPair parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static io.prometheus.client.Metrics.LabelPair parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.LabelPair parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.LabelPair parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(io.prometheus.client.Metrics.LabelPair prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code io.prometheus.client.LabelPair} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder implements + // @@protoc_insertion_point(builder_implements:io.prometheus.client.LabelPair) + io.prometheus.client.Metrics.LabelPairOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_LabelPair_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_LabelPair_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.LabelPair.class, io.prometheus.client.Metrics.LabelPair.Builder.class); + } + + // Construct using io.prometheus.client.Metrics.LabelPair.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + name_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + value_ = ""; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_LabelPair_descriptor; + } + + public io.prometheus.client.Metrics.LabelPair getDefaultInstanceForType() { + return io.prometheus.client.Metrics.LabelPair.getDefaultInstance(); + } + + public io.prometheus.client.Metrics.LabelPair build() { + io.prometheus.client.Metrics.LabelPair result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public io.prometheus.client.Metrics.LabelPair buildPartial() { + io.prometheus.client.Metrics.LabelPair result = new io.prometheus.client.Metrics.LabelPair(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.name_ = name_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.value_ = value_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof io.prometheus.client.Metrics.LabelPair) { + return mergeFrom((io.prometheus.client.Metrics.LabelPair)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(io.prometheus.client.Metrics.LabelPair other) { + if (other == io.prometheus.client.Metrics.LabelPair.getDefaultInstance()) return this; + if (other.hasName()) { + bitField0_ |= 0x00000001; + name_ = other.name_; + onChanged(); + } + if (other.hasValue()) { + bitField0_ |= 0x00000002; + value_ = other.value_; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + io.prometheus.client.Metrics.LabelPair parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (io.prometheus.client.Metrics.LabelPair) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private java.lang.Object name_ = ""; + /** + * optional string name = 1; + */ + public boolean hasName() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string name = 1; + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + name_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * optional string name = 1; + */ + public com.google.protobuf.ByteString + getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string name = 1; + */ + public Builder setName( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + name_ = value; + onChanged(); + return this; + } + /** + * optional string name = 1; + */ + public Builder clearName() { + bitField0_ = (bitField0_ & ~0x00000001); + name_ = getDefaultInstance().getName(); + onChanged(); + return this; + } + /** + * optional string name = 1; + */ + public Builder setNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + name_ = value; + onChanged(); + return this; + } + + private java.lang.Object value_ = ""; + /** + * optional string value = 2; + */ + public boolean hasValue() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string value = 2; + */ + public java.lang.String getValue() { + java.lang.Object ref = value_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + value_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * optional string value = 2; + */ + public com.google.protobuf.ByteString + getValueBytes() { + java.lang.Object ref = value_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + value_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string value = 2; + */ + public Builder setValue( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + value_ = value; + onChanged(); + return this; + } + /** + * optional string value = 2; + */ + public Builder clearValue() { + bitField0_ = (bitField0_ & ~0x00000002); + value_ = getDefaultInstance().getValue(); + onChanged(); + return this; + } + /** + * optional string value = 2; + */ + public Builder setValueBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + value_ = value; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:io.prometheus.client.LabelPair) + } + + static { + defaultInstance = new LabelPair(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:io.prometheus.client.LabelPair) + } + + public interface GaugeOrBuilder extends + // @@protoc_insertion_point(interface_extends:io.prometheus.client.Gauge) + com.google.protobuf.MessageOrBuilder { + + /** + * optional double value = 1; + */ + boolean hasValue(); + /** + * optional double value = 1; + */ + double getValue(); + } + /** + * Protobuf type {@code io.prometheus.client.Gauge} + */ + public static final class Gauge extends + com.google.protobuf.GeneratedMessage implements + // @@protoc_insertion_point(message_implements:io.prometheus.client.Gauge) + GaugeOrBuilder { + // Use Gauge.newBuilder() to construct. + private Gauge(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Gauge(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Gauge defaultInstance; + public static Gauge getDefaultInstance() { + return defaultInstance; + } + + public Gauge getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Gauge( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 9: { + bitField0_ |= 0x00000001; + value_ = input.readDouble(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Gauge_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Gauge_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.Gauge.class, io.prometheus.client.Metrics.Gauge.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Gauge parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Gauge(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + public static final int VALUE_FIELD_NUMBER = 1; + private double value_; + /** + * optional double value = 1; + */ + public boolean hasValue() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional double value = 1; + */ + public double getValue() { + return value_; + } + + private void initFields() { + value_ = 0D; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeDouble(1, value_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeDoubleSize(1, value_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static io.prometheus.client.Metrics.Gauge parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.Gauge parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.Gauge parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.Gauge parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.Gauge parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.Gauge parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.Gauge parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static io.prometheus.client.Metrics.Gauge parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.Gauge parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.Gauge parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(io.prometheus.client.Metrics.Gauge prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code io.prometheus.client.Gauge} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder implements + // @@protoc_insertion_point(builder_implements:io.prometheus.client.Gauge) + io.prometheus.client.Metrics.GaugeOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Gauge_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Gauge_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.Gauge.class, io.prometheus.client.Metrics.Gauge.Builder.class); + } + + // Construct using io.prometheus.client.Metrics.Gauge.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + value_ = 0D; + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Gauge_descriptor; + } + + public io.prometheus.client.Metrics.Gauge getDefaultInstanceForType() { + return io.prometheus.client.Metrics.Gauge.getDefaultInstance(); + } + + public io.prometheus.client.Metrics.Gauge build() { + io.prometheus.client.Metrics.Gauge result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public io.prometheus.client.Metrics.Gauge buildPartial() { + io.prometheus.client.Metrics.Gauge result = new io.prometheus.client.Metrics.Gauge(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.value_ = value_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof io.prometheus.client.Metrics.Gauge) { + return mergeFrom((io.prometheus.client.Metrics.Gauge)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(io.prometheus.client.Metrics.Gauge other) { + if (other == io.prometheus.client.Metrics.Gauge.getDefaultInstance()) return this; + if (other.hasValue()) { + setValue(other.getValue()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + io.prometheus.client.Metrics.Gauge parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (io.prometheus.client.Metrics.Gauge) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private double value_ ; + /** + * optional double value = 1; + */ + public boolean hasValue() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional double value = 1; + */ + public double getValue() { + return value_; + } + /** + * optional double value = 1; + */ + public Builder setValue(double value) { + bitField0_ |= 0x00000001; + value_ = value; + onChanged(); + return this; + } + /** + * optional double value = 1; + */ + public Builder clearValue() { + bitField0_ = (bitField0_ & ~0x00000001); + value_ = 0D; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:io.prometheus.client.Gauge) + } + + static { + defaultInstance = new Gauge(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:io.prometheus.client.Gauge) + } + + public interface CounterOrBuilder extends + // @@protoc_insertion_point(interface_extends:io.prometheus.client.Counter) + com.google.protobuf.MessageOrBuilder { + + /** + * optional double value = 1; + */ + boolean hasValue(); + /** + * optional double value = 1; + */ + double getValue(); + } + /** + * Protobuf type {@code io.prometheus.client.Counter} + */ + public static final class Counter extends + com.google.protobuf.GeneratedMessage implements + // @@protoc_insertion_point(message_implements:io.prometheus.client.Counter) + CounterOrBuilder { + // Use Counter.newBuilder() to construct. + private Counter(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Counter(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Counter defaultInstance; + public static Counter getDefaultInstance() { + return defaultInstance; + } + + public Counter getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Counter( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 9: { + bitField0_ |= 0x00000001; + value_ = input.readDouble(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Counter_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Counter_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.Counter.class, io.prometheus.client.Metrics.Counter.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Counter parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Counter(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + public static final int VALUE_FIELD_NUMBER = 1; + private double value_; + /** + * optional double value = 1; + */ + public boolean hasValue() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional double value = 1; + */ + public double getValue() { + return value_; + } + + private void initFields() { + value_ = 0D; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeDouble(1, value_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeDoubleSize(1, value_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static io.prometheus.client.Metrics.Counter parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.Counter parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.Counter parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.Counter parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.Counter parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.Counter parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.Counter parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static io.prometheus.client.Metrics.Counter parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.Counter parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.Counter parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(io.prometheus.client.Metrics.Counter prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code io.prometheus.client.Counter} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder implements + // @@protoc_insertion_point(builder_implements:io.prometheus.client.Counter) + io.prometheus.client.Metrics.CounterOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Counter_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Counter_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.Counter.class, io.prometheus.client.Metrics.Counter.Builder.class); + } + + // Construct using io.prometheus.client.Metrics.Counter.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + value_ = 0D; + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Counter_descriptor; + } + + public io.prometheus.client.Metrics.Counter getDefaultInstanceForType() { + return io.prometheus.client.Metrics.Counter.getDefaultInstance(); + } + + public io.prometheus.client.Metrics.Counter build() { + io.prometheus.client.Metrics.Counter result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public io.prometheus.client.Metrics.Counter buildPartial() { + io.prometheus.client.Metrics.Counter result = new io.prometheus.client.Metrics.Counter(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.value_ = value_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof io.prometheus.client.Metrics.Counter) { + return mergeFrom((io.prometheus.client.Metrics.Counter)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(io.prometheus.client.Metrics.Counter other) { + if (other == io.prometheus.client.Metrics.Counter.getDefaultInstance()) return this; + if (other.hasValue()) { + setValue(other.getValue()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + io.prometheus.client.Metrics.Counter parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (io.prometheus.client.Metrics.Counter) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private double value_ ; + /** + * optional double value = 1; + */ + public boolean hasValue() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional double value = 1; + */ + public double getValue() { + return value_; + } + /** + * optional double value = 1; + */ + public Builder setValue(double value) { + bitField0_ |= 0x00000001; + value_ = value; + onChanged(); + return this; + } + /** + * optional double value = 1; + */ + public Builder clearValue() { + bitField0_ = (bitField0_ & ~0x00000001); + value_ = 0D; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:io.prometheus.client.Counter) + } + + static { + defaultInstance = new Counter(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:io.prometheus.client.Counter) + } + + public interface QuantileOrBuilder extends + // @@protoc_insertion_point(interface_extends:io.prometheus.client.Quantile) + com.google.protobuf.MessageOrBuilder { + + /** + * optional double quantile = 1; + */ + boolean hasQuantile(); + /** + * optional double quantile = 1; + */ + double getQuantile(); + + /** + * optional double value = 2; + */ + boolean hasValue(); + /** + * optional double value = 2; + */ + double getValue(); + } + /** + * Protobuf type {@code io.prometheus.client.Quantile} + */ + public static final class Quantile extends + com.google.protobuf.GeneratedMessage implements + // @@protoc_insertion_point(message_implements:io.prometheus.client.Quantile) + QuantileOrBuilder { + // Use Quantile.newBuilder() to construct. + private Quantile(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Quantile(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Quantile defaultInstance; + public static Quantile getDefaultInstance() { + return defaultInstance; + } + + public Quantile getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Quantile( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 9: { + bitField0_ |= 0x00000001; + quantile_ = input.readDouble(); + break; + } + case 17: { + bitField0_ |= 0x00000002; + value_ = input.readDouble(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Quantile_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Quantile_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.Quantile.class, io.prometheus.client.Metrics.Quantile.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Quantile parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Quantile(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + public static final int QUANTILE_FIELD_NUMBER = 1; + private double quantile_; + /** + * optional double quantile = 1; + */ + public boolean hasQuantile() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional double quantile = 1; + */ + public double getQuantile() { + return quantile_; + } + + public static final int VALUE_FIELD_NUMBER = 2; + private double value_; + /** + * optional double value = 2; + */ + public boolean hasValue() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional double value = 2; + */ + public double getValue() { + return value_; + } + + private void initFields() { + quantile_ = 0D; + value_ = 0D; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeDouble(1, quantile_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeDouble(2, value_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeDoubleSize(1, quantile_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeDoubleSize(2, value_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static io.prometheus.client.Metrics.Quantile parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.Quantile parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.Quantile parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.Quantile parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.Quantile parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.Quantile parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.Quantile parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static io.prometheus.client.Metrics.Quantile parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.Quantile parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.Quantile parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(io.prometheus.client.Metrics.Quantile prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code io.prometheus.client.Quantile} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder implements + // @@protoc_insertion_point(builder_implements:io.prometheus.client.Quantile) + io.prometheus.client.Metrics.QuantileOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Quantile_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Quantile_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.Quantile.class, io.prometheus.client.Metrics.Quantile.Builder.class); + } + + // Construct using io.prometheus.client.Metrics.Quantile.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + quantile_ = 0D; + bitField0_ = (bitField0_ & ~0x00000001); + value_ = 0D; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Quantile_descriptor; + } + + public io.prometheus.client.Metrics.Quantile getDefaultInstanceForType() { + return io.prometheus.client.Metrics.Quantile.getDefaultInstance(); + } + + public io.prometheus.client.Metrics.Quantile build() { + io.prometheus.client.Metrics.Quantile result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public io.prometheus.client.Metrics.Quantile buildPartial() { + io.prometheus.client.Metrics.Quantile result = new io.prometheus.client.Metrics.Quantile(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.quantile_ = quantile_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.value_ = value_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof io.prometheus.client.Metrics.Quantile) { + return mergeFrom((io.prometheus.client.Metrics.Quantile)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(io.prometheus.client.Metrics.Quantile other) { + if (other == io.prometheus.client.Metrics.Quantile.getDefaultInstance()) return this; + if (other.hasQuantile()) { + setQuantile(other.getQuantile()); + } + if (other.hasValue()) { + setValue(other.getValue()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + io.prometheus.client.Metrics.Quantile parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (io.prometheus.client.Metrics.Quantile) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private double quantile_ ; + /** + * optional double quantile = 1; + */ + public boolean hasQuantile() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional double quantile = 1; + */ + public double getQuantile() { + return quantile_; + } + /** + * optional double quantile = 1; + */ + public Builder setQuantile(double value) { + bitField0_ |= 0x00000001; + quantile_ = value; + onChanged(); + return this; + } + /** + * optional double quantile = 1; + */ + public Builder clearQuantile() { + bitField0_ = (bitField0_ & ~0x00000001); + quantile_ = 0D; + onChanged(); + return this; + } + + private double value_ ; + /** + * optional double value = 2; + */ + public boolean hasValue() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional double value = 2; + */ + public double getValue() { + return value_; + } + /** + * optional double value = 2; + */ + public Builder setValue(double value) { + bitField0_ |= 0x00000002; + value_ = value; + onChanged(); + return this; + } + /** + * optional double value = 2; + */ + public Builder clearValue() { + bitField0_ = (bitField0_ & ~0x00000002); + value_ = 0D; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:io.prometheus.client.Quantile) + } + + static { + defaultInstance = new Quantile(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:io.prometheus.client.Quantile) + } + + public interface SummaryOrBuilder extends + // @@protoc_insertion_point(interface_extends:io.prometheus.client.Summary) + com.google.protobuf.MessageOrBuilder { + + /** + * optional uint64 sample_count = 1; + */ + boolean hasSampleCount(); + /** + * optional uint64 sample_count = 1; + */ + long getSampleCount(); + + /** + * optional double sample_sum = 2; + */ + boolean hasSampleSum(); + /** + * optional double sample_sum = 2; + */ + double getSampleSum(); + + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + java.util.List + getQuantileList(); + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + io.prometheus.client.Metrics.Quantile getQuantile(int index); + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + int getQuantileCount(); + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + java.util.List + getQuantileOrBuilderList(); + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + io.prometheus.client.Metrics.QuantileOrBuilder getQuantileOrBuilder( + int index); + } + /** + * Protobuf type {@code io.prometheus.client.Summary} + */ + public static final class Summary extends + com.google.protobuf.GeneratedMessage implements + // @@protoc_insertion_point(message_implements:io.prometheus.client.Summary) + SummaryOrBuilder { + // Use Summary.newBuilder() to construct. + private Summary(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Summary(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Summary defaultInstance; + public static Summary getDefaultInstance() { + return defaultInstance; + } + + public Summary getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Summary( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + bitField0_ |= 0x00000001; + sampleCount_ = input.readUInt64(); + break; + } + case 17: { + bitField0_ |= 0x00000002; + sampleSum_ = input.readDouble(); + break; + } + case 26: { + if (!((mutable_bitField0_ & 0x00000004) == 0x00000004)) { + quantile_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000004; + } + quantile_.add(input.readMessage(io.prometheus.client.Metrics.Quantile.PARSER, extensionRegistry)); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000004) == 0x00000004)) { + quantile_ = java.util.Collections.unmodifiableList(quantile_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Summary_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Summary_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.Summary.class, io.prometheus.client.Metrics.Summary.Builder.class); + } + + public static com.google.protobuf.Parser

    PARSER = + new com.google.protobuf.AbstractParser() { + public Summary parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Summary(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + public static final int SAMPLE_COUNT_FIELD_NUMBER = 1; + private long sampleCount_; + /** + * optional uint64 sample_count = 1; + */ + public boolean hasSampleCount() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint64 sample_count = 1; + */ + public long getSampleCount() { + return sampleCount_; + } + + public static final int SAMPLE_SUM_FIELD_NUMBER = 2; + private double sampleSum_; + /** + * optional double sample_sum = 2; + */ + public boolean hasSampleSum() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional double sample_sum = 2; + */ + public double getSampleSum() { + return sampleSum_; + } + + public static final int QUANTILE_FIELD_NUMBER = 3; + private java.util.List quantile_; + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public java.util.List getQuantileList() { + return quantile_; + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public java.util.List + getQuantileOrBuilderList() { + return quantile_; + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public int getQuantileCount() { + return quantile_.size(); + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public io.prometheus.client.Metrics.Quantile getQuantile(int index) { + return quantile_.get(index); + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public io.prometheus.client.Metrics.QuantileOrBuilder getQuantileOrBuilder( + int index) { + return quantile_.get(index); + } + + private void initFields() { + sampleCount_ = 0L; + sampleSum_ = 0D; + quantile_ = java.util.Collections.emptyList(); + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeUInt64(1, sampleCount_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeDouble(2, sampleSum_); + } + for (int i = 0; i < quantile_.size(); i++) { + output.writeMessage(3, quantile_.get(i)); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt64Size(1, sampleCount_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeDoubleSize(2, sampleSum_); + } + for (int i = 0; i < quantile_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, quantile_.get(i)); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static io.prometheus.client.Metrics.Summary parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.Summary parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.Summary parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.Summary parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.Summary parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.Summary parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.Summary parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static io.prometheus.client.Metrics.Summary parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.Summary parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.Summary parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(io.prometheus.client.Metrics.Summary prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code io.prometheus.client.Summary} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder implements + // @@protoc_insertion_point(builder_implements:io.prometheus.client.Summary) + io.prometheus.client.Metrics.SummaryOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Summary_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Summary_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.Summary.class, io.prometheus.client.Metrics.Summary.Builder.class); + } + + // Construct using io.prometheus.client.Metrics.Summary.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + getQuantileFieldBuilder(); + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + sampleCount_ = 0L; + bitField0_ = (bitField0_ & ~0x00000001); + sampleSum_ = 0D; + bitField0_ = (bitField0_ & ~0x00000002); + if (quantileBuilder_ == null) { + quantile_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000004); + } else { + quantileBuilder_.clear(); + } + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Summary_descriptor; + } + + public io.prometheus.client.Metrics.Summary getDefaultInstanceForType() { + return io.prometheus.client.Metrics.Summary.getDefaultInstance(); + } + + public io.prometheus.client.Metrics.Summary build() { + io.prometheus.client.Metrics.Summary result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public io.prometheus.client.Metrics.Summary buildPartial() { + io.prometheus.client.Metrics.Summary result = new io.prometheus.client.Metrics.Summary(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.sampleCount_ = sampleCount_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.sampleSum_ = sampleSum_; + if (quantileBuilder_ == null) { + if (((bitField0_ & 0x00000004) == 0x00000004)) { + quantile_ = java.util.Collections.unmodifiableList(quantile_); + bitField0_ = (bitField0_ & ~0x00000004); + } + result.quantile_ = quantile_; + } else { + result.quantile_ = quantileBuilder_.build(); + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof io.prometheus.client.Metrics.Summary) { + return mergeFrom((io.prometheus.client.Metrics.Summary)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(io.prometheus.client.Metrics.Summary other) { + if (other == io.prometheus.client.Metrics.Summary.getDefaultInstance()) return this; + if (other.hasSampleCount()) { + setSampleCount(other.getSampleCount()); + } + if (other.hasSampleSum()) { + setSampleSum(other.getSampleSum()); + } + if (quantileBuilder_ == null) { + if (!other.quantile_.isEmpty()) { + if (quantile_.isEmpty()) { + quantile_ = other.quantile_; + bitField0_ = (bitField0_ & ~0x00000004); + } else { + ensureQuantileIsMutable(); + quantile_.addAll(other.quantile_); + } + onChanged(); + } + } else { + if (!other.quantile_.isEmpty()) { + if (quantileBuilder_.isEmpty()) { + quantileBuilder_.dispose(); + quantileBuilder_ = null; + quantile_ = other.quantile_; + bitField0_ = (bitField0_ & ~0x00000004); + quantileBuilder_ = + com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ? + getQuantileFieldBuilder() : null; + } else { + quantileBuilder_.addAllMessages(other.quantile_); + } + } + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + io.prometheus.client.Metrics.Summary parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (io.prometheus.client.Metrics.Summary) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private long sampleCount_ ; + /** + * optional uint64 sample_count = 1; + */ + public boolean hasSampleCount() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint64 sample_count = 1; + */ + public long getSampleCount() { + return sampleCount_; + } + /** + * optional uint64 sample_count = 1; + */ + public Builder setSampleCount(long value) { + bitField0_ |= 0x00000001; + sampleCount_ = value; + onChanged(); + return this; + } + /** + * optional uint64 sample_count = 1; + */ + public Builder clearSampleCount() { + bitField0_ = (bitField0_ & ~0x00000001); + sampleCount_ = 0L; + onChanged(); + return this; + } + + private double sampleSum_ ; + /** + * optional double sample_sum = 2; + */ + public boolean hasSampleSum() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional double sample_sum = 2; + */ + public double getSampleSum() { + return sampleSum_; + } + /** + * optional double sample_sum = 2; + */ + public Builder setSampleSum(double value) { + bitField0_ |= 0x00000002; + sampleSum_ = value; + onChanged(); + return this; + } + /** + * optional double sample_sum = 2; + */ + public Builder clearSampleSum() { + bitField0_ = (bitField0_ & ~0x00000002); + sampleSum_ = 0D; + onChanged(); + return this; + } + + private java.util.List quantile_ = + java.util.Collections.emptyList(); + private void ensureQuantileIsMutable() { + if (!((bitField0_ & 0x00000004) == 0x00000004)) { + quantile_ = new java.util.ArrayList(quantile_); + bitField0_ |= 0x00000004; + } + } + + private com.google.protobuf.RepeatedFieldBuilder< + io.prometheus.client.Metrics.Quantile, io.prometheus.client.Metrics.Quantile.Builder, io.prometheus.client.Metrics.QuantileOrBuilder> quantileBuilder_; + + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public java.util.List getQuantileList() { + if (quantileBuilder_ == null) { + return java.util.Collections.unmodifiableList(quantile_); + } else { + return quantileBuilder_.getMessageList(); + } + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public int getQuantileCount() { + if (quantileBuilder_ == null) { + return quantile_.size(); + } else { + return quantileBuilder_.getCount(); + } + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public io.prometheus.client.Metrics.Quantile getQuantile(int index) { + if (quantileBuilder_ == null) { + return quantile_.get(index); + } else { + return quantileBuilder_.getMessage(index); + } + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public Builder setQuantile( + int index, io.prometheus.client.Metrics.Quantile value) { + if (quantileBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureQuantileIsMutable(); + quantile_.set(index, value); + onChanged(); + } else { + quantileBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public Builder setQuantile( + int index, io.prometheus.client.Metrics.Quantile.Builder builderForValue) { + if (quantileBuilder_ == null) { + ensureQuantileIsMutable(); + quantile_.set(index, builderForValue.build()); + onChanged(); + } else { + quantileBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public Builder addQuantile(io.prometheus.client.Metrics.Quantile value) { + if (quantileBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureQuantileIsMutable(); + quantile_.add(value); + onChanged(); + } else { + quantileBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public Builder addQuantile( + int index, io.prometheus.client.Metrics.Quantile value) { + if (quantileBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureQuantileIsMutable(); + quantile_.add(index, value); + onChanged(); + } else { + quantileBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public Builder addQuantile( + io.prometheus.client.Metrics.Quantile.Builder builderForValue) { + if (quantileBuilder_ == null) { + ensureQuantileIsMutable(); + quantile_.add(builderForValue.build()); + onChanged(); + } else { + quantileBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public Builder addQuantile( + int index, io.prometheus.client.Metrics.Quantile.Builder builderForValue) { + if (quantileBuilder_ == null) { + ensureQuantileIsMutable(); + quantile_.add(index, builderForValue.build()); + onChanged(); + } else { + quantileBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public Builder addAllQuantile( + java.lang.Iterable values) { + if (quantileBuilder_ == null) { + ensureQuantileIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, quantile_); + onChanged(); + } else { + quantileBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public Builder clearQuantile() { + if (quantileBuilder_ == null) { + quantile_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000004); + onChanged(); + } else { + quantileBuilder_.clear(); + } + return this; + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public Builder removeQuantile(int index) { + if (quantileBuilder_ == null) { + ensureQuantileIsMutable(); + quantile_.remove(index); + onChanged(); + } else { + quantileBuilder_.remove(index); + } + return this; + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public io.prometheus.client.Metrics.Quantile.Builder getQuantileBuilder( + int index) { + return getQuantileFieldBuilder().getBuilder(index); + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public io.prometheus.client.Metrics.QuantileOrBuilder getQuantileOrBuilder( + int index) { + if (quantileBuilder_ == null) { + return quantile_.get(index); } else { + return quantileBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public java.util.List + getQuantileOrBuilderList() { + if (quantileBuilder_ != null) { + return quantileBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(quantile_); + } + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public io.prometheus.client.Metrics.Quantile.Builder addQuantileBuilder() { + return getQuantileFieldBuilder().addBuilder( + io.prometheus.client.Metrics.Quantile.getDefaultInstance()); + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public io.prometheus.client.Metrics.Quantile.Builder addQuantileBuilder( + int index) { + return getQuantileFieldBuilder().addBuilder( + index, io.prometheus.client.Metrics.Quantile.getDefaultInstance()); + } + /** + * repeated .io.prometheus.client.Quantile quantile = 3; + */ + public java.util.List + getQuantileBuilderList() { + return getQuantileFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilder< + io.prometheus.client.Metrics.Quantile, io.prometheus.client.Metrics.Quantile.Builder, io.prometheus.client.Metrics.QuantileOrBuilder> + getQuantileFieldBuilder() { + if (quantileBuilder_ == null) { + quantileBuilder_ = new com.google.protobuf.RepeatedFieldBuilder< + io.prometheus.client.Metrics.Quantile, io.prometheus.client.Metrics.Quantile.Builder, io.prometheus.client.Metrics.QuantileOrBuilder>( + quantile_, + ((bitField0_ & 0x00000004) == 0x00000004), + getParentForChildren(), + isClean()); + quantile_ = null; + } + return quantileBuilder_; + } + + // @@protoc_insertion_point(builder_scope:io.prometheus.client.Summary) + } + + static { + defaultInstance = new Summary(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:io.prometheus.client.Summary) + } + + public interface UntypedOrBuilder extends + // @@protoc_insertion_point(interface_extends:io.prometheus.client.Untyped) + com.google.protobuf.MessageOrBuilder { + + /** + * optional double value = 1; + */ + boolean hasValue(); + /** + * optional double value = 1; + */ + double getValue(); + } + /** + * Protobuf type {@code io.prometheus.client.Untyped} + */ + public static final class Untyped extends + com.google.protobuf.GeneratedMessage implements + // @@protoc_insertion_point(message_implements:io.prometheus.client.Untyped) + UntypedOrBuilder { + // Use Untyped.newBuilder() to construct. + private Untyped(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Untyped(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Untyped defaultInstance; + public static Untyped getDefaultInstance() { + return defaultInstance; + } + + public Untyped getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Untyped( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 9: { + bitField0_ |= 0x00000001; + value_ = input.readDouble(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Untyped_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Untyped_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.Untyped.class, io.prometheus.client.Metrics.Untyped.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Untyped parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Untyped(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + public static final int VALUE_FIELD_NUMBER = 1; + private double value_; + /** + * optional double value = 1; + */ + public boolean hasValue() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional double value = 1; + */ + public double getValue() { + return value_; + } + + private void initFields() { + value_ = 0D; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeDouble(1, value_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeDoubleSize(1, value_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static io.prometheus.client.Metrics.Untyped parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.Untyped parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.Untyped parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.Untyped parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.Untyped parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.Untyped parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.Untyped parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static io.prometheus.client.Metrics.Untyped parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.Untyped parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.Untyped parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(io.prometheus.client.Metrics.Untyped prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code io.prometheus.client.Untyped} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder implements + // @@protoc_insertion_point(builder_implements:io.prometheus.client.Untyped) + io.prometheus.client.Metrics.UntypedOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Untyped_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Untyped_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.Untyped.class, io.prometheus.client.Metrics.Untyped.Builder.class); + } + + // Construct using io.prometheus.client.Metrics.Untyped.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + value_ = 0D; + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Untyped_descriptor; + } + + public io.prometheus.client.Metrics.Untyped getDefaultInstanceForType() { + return io.prometheus.client.Metrics.Untyped.getDefaultInstance(); + } + + public io.prometheus.client.Metrics.Untyped build() { + io.prometheus.client.Metrics.Untyped result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public io.prometheus.client.Metrics.Untyped buildPartial() { + io.prometheus.client.Metrics.Untyped result = new io.prometheus.client.Metrics.Untyped(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.value_ = value_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof io.prometheus.client.Metrics.Untyped) { + return mergeFrom((io.prometheus.client.Metrics.Untyped)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(io.prometheus.client.Metrics.Untyped other) { + if (other == io.prometheus.client.Metrics.Untyped.getDefaultInstance()) return this; + if (other.hasValue()) { + setValue(other.getValue()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + io.prometheus.client.Metrics.Untyped parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (io.prometheus.client.Metrics.Untyped) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private double value_ ; + /** + * optional double value = 1; + */ + public boolean hasValue() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional double value = 1; + */ + public double getValue() { + return value_; + } + /** + * optional double value = 1; + */ + public Builder setValue(double value) { + bitField0_ |= 0x00000001; + value_ = value; + onChanged(); + return this; + } + /** + * optional double value = 1; + */ + public Builder clearValue() { + bitField0_ = (bitField0_ & ~0x00000001); + value_ = 0D; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:io.prometheus.client.Untyped) + } + + static { + defaultInstance = new Untyped(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:io.prometheus.client.Untyped) + } + + public interface HistogramOrBuilder extends + // @@protoc_insertion_point(interface_extends:io.prometheus.client.Histogram) + com.google.protobuf.MessageOrBuilder { + + /** + * optional uint64 sample_count = 1; + */ + boolean hasSampleCount(); + /** + * optional uint64 sample_count = 1; + */ + long getSampleCount(); + + /** + * optional double sample_sum = 2; + */ + boolean hasSampleSum(); + /** + * optional double sample_sum = 2; + */ + double getSampleSum(); + + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +     * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +     * 
    + */ + java.util.List + getBucketList(); + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +     * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +     * 
    + */ + io.prometheus.client.Metrics.Bucket getBucket(int index); + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +     * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +     * 
    + */ + int getBucketCount(); + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +     * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +     * 
    + */ + java.util.List + getBucketOrBuilderList(); + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +     * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +     * 
    + */ + io.prometheus.client.Metrics.BucketOrBuilder getBucketOrBuilder( + int index); + } + /** + * Protobuf type {@code io.prometheus.client.Histogram} + */ + public static final class Histogram extends + com.google.protobuf.GeneratedMessage implements + // @@protoc_insertion_point(message_implements:io.prometheus.client.Histogram) + HistogramOrBuilder { + // Use Histogram.newBuilder() to construct. + private Histogram(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Histogram(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Histogram defaultInstance; + public static Histogram getDefaultInstance() { + return defaultInstance; + } + + public Histogram getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Histogram( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + bitField0_ |= 0x00000001; + sampleCount_ = input.readUInt64(); + break; + } + case 17: { + bitField0_ |= 0x00000002; + sampleSum_ = input.readDouble(); + break; + } + case 26: { + if (!((mutable_bitField0_ & 0x00000004) == 0x00000004)) { + bucket_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000004; + } + bucket_.add(input.readMessage(io.prometheus.client.Metrics.Bucket.PARSER, extensionRegistry)); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000004) == 0x00000004)) { + bucket_ = java.util.Collections.unmodifiableList(bucket_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Histogram_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Histogram_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.Histogram.class, io.prometheus.client.Metrics.Histogram.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Histogram parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Histogram(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + public static final int SAMPLE_COUNT_FIELD_NUMBER = 1; + private long sampleCount_; + /** + * optional uint64 sample_count = 1; + */ + public boolean hasSampleCount() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint64 sample_count = 1; + */ + public long getSampleCount() { + return sampleCount_; + } + + public static final int SAMPLE_SUM_FIELD_NUMBER = 2; + private double sampleSum_; + /** + * optional double sample_sum = 2; + */ + public boolean hasSampleSum() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional double sample_sum = 2; + */ + public double getSampleSum() { + return sampleSum_; + } + + public static final int BUCKET_FIELD_NUMBER = 3; + private java.util.List bucket_; + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +     * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +     * 
    + */ + public java.util.List getBucketList() { + return bucket_; + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +     * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +     * 
    + */ + public java.util.List + getBucketOrBuilderList() { + return bucket_; + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +     * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +     * 
    + */ + public int getBucketCount() { + return bucket_.size(); + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +     * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +     * 
    + */ + public io.prometheus.client.Metrics.Bucket getBucket(int index) { + return bucket_.get(index); + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +     * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +     * 
    + */ + public io.prometheus.client.Metrics.BucketOrBuilder getBucketOrBuilder( + int index) { + return bucket_.get(index); + } + + private void initFields() { + sampleCount_ = 0L; + sampleSum_ = 0D; + bucket_ = java.util.Collections.emptyList(); + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeUInt64(1, sampleCount_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeDouble(2, sampleSum_); + } + for (int i = 0; i < bucket_.size(); i++) { + output.writeMessage(3, bucket_.get(i)); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt64Size(1, sampleCount_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeDoubleSize(2, sampleSum_); + } + for (int i = 0; i < bucket_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, bucket_.get(i)); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static io.prometheus.client.Metrics.Histogram parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.Histogram parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.Histogram parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.Histogram parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.Histogram parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.Histogram parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.Histogram parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static io.prometheus.client.Metrics.Histogram parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.Histogram parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.Histogram parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(io.prometheus.client.Metrics.Histogram prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code io.prometheus.client.Histogram} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder implements + // @@protoc_insertion_point(builder_implements:io.prometheus.client.Histogram) + io.prometheus.client.Metrics.HistogramOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Histogram_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Histogram_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.Histogram.class, io.prometheus.client.Metrics.Histogram.Builder.class); + } + + // Construct using io.prometheus.client.Metrics.Histogram.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + getBucketFieldBuilder(); + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + sampleCount_ = 0L; + bitField0_ = (bitField0_ & ~0x00000001); + sampleSum_ = 0D; + bitField0_ = (bitField0_ & ~0x00000002); + if (bucketBuilder_ == null) { + bucket_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000004); + } else { + bucketBuilder_.clear(); + } + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Histogram_descriptor; + } + + public io.prometheus.client.Metrics.Histogram getDefaultInstanceForType() { + return io.prometheus.client.Metrics.Histogram.getDefaultInstance(); + } + + public io.prometheus.client.Metrics.Histogram build() { + io.prometheus.client.Metrics.Histogram result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public io.prometheus.client.Metrics.Histogram buildPartial() { + io.prometheus.client.Metrics.Histogram result = new io.prometheus.client.Metrics.Histogram(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.sampleCount_ = sampleCount_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.sampleSum_ = sampleSum_; + if (bucketBuilder_ == null) { + if (((bitField0_ & 0x00000004) == 0x00000004)) { + bucket_ = java.util.Collections.unmodifiableList(bucket_); + bitField0_ = (bitField0_ & ~0x00000004); + } + result.bucket_ = bucket_; + } else { + result.bucket_ = bucketBuilder_.build(); + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof io.prometheus.client.Metrics.Histogram) { + return mergeFrom((io.prometheus.client.Metrics.Histogram)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(io.prometheus.client.Metrics.Histogram other) { + if (other == io.prometheus.client.Metrics.Histogram.getDefaultInstance()) return this; + if (other.hasSampleCount()) { + setSampleCount(other.getSampleCount()); + } + if (other.hasSampleSum()) { + setSampleSum(other.getSampleSum()); + } + if (bucketBuilder_ == null) { + if (!other.bucket_.isEmpty()) { + if (bucket_.isEmpty()) { + bucket_ = other.bucket_; + bitField0_ = (bitField0_ & ~0x00000004); + } else { + ensureBucketIsMutable(); + bucket_.addAll(other.bucket_); + } + onChanged(); + } + } else { + if (!other.bucket_.isEmpty()) { + if (bucketBuilder_.isEmpty()) { + bucketBuilder_.dispose(); + bucketBuilder_ = null; + bucket_ = other.bucket_; + bitField0_ = (bitField0_ & ~0x00000004); + bucketBuilder_ = + com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ? + getBucketFieldBuilder() : null; + } else { + bucketBuilder_.addAllMessages(other.bucket_); + } + } + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + io.prometheus.client.Metrics.Histogram parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (io.prometheus.client.Metrics.Histogram) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private long sampleCount_ ; + /** + * optional uint64 sample_count = 1; + */ + public boolean hasSampleCount() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint64 sample_count = 1; + */ + public long getSampleCount() { + return sampleCount_; + } + /** + * optional uint64 sample_count = 1; + */ + public Builder setSampleCount(long value) { + bitField0_ |= 0x00000001; + sampleCount_ = value; + onChanged(); + return this; + } + /** + * optional uint64 sample_count = 1; + */ + public Builder clearSampleCount() { + bitField0_ = (bitField0_ & ~0x00000001); + sampleCount_ = 0L; + onChanged(); + return this; + } + + private double sampleSum_ ; + /** + * optional double sample_sum = 2; + */ + public boolean hasSampleSum() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional double sample_sum = 2; + */ + public double getSampleSum() { + return sampleSum_; + } + /** + * optional double sample_sum = 2; + */ + public Builder setSampleSum(double value) { + bitField0_ |= 0x00000002; + sampleSum_ = value; + onChanged(); + return this; + } + /** + * optional double sample_sum = 2; + */ + public Builder clearSampleSum() { + bitField0_ = (bitField0_ & ~0x00000002); + sampleSum_ = 0D; + onChanged(); + return this; + } + + private java.util.List bucket_ = + java.util.Collections.emptyList(); + private void ensureBucketIsMutable() { + if (!((bitField0_ & 0x00000004) == 0x00000004)) { + bucket_ = new java.util.ArrayList(bucket_); + bitField0_ |= 0x00000004; + } + } + + private com.google.protobuf.RepeatedFieldBuilder< + io.prometheus.client.Metrics.Bucket, io.prometheus.client.Metrics.Bucket.Builder, io.prometheus.client.Metrics.BucketOrBuilder> bucketBuilder_; + + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +       * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +       * 
    + */ + public java.util.List getBucketList() { + if (bucketBuilder_ == null) { + return java.util.Collections.unmodifiableList(bucket_); + } else { + return bucketBuilder_.getMessageList(); + } + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +       * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +       * 
    + */ + public int getBucketCount() { + if (bucketBuilder_ == null) { + return bucket_.size(); + } else { + return bucketBuilder_.getCount(); + } + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +       * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +       * 
    + */ + public io.prometheus.client.Metrics.Bucket getBucket(int index) { + if (bucketBuilder_ == null) { + return bucket_.get(index); + } else { + return bucketBuilder_.getMessage(index); + } + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +       * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +       * 
    + */ + public Builder setBucket( + int index, io.prometheus.client.Metrics.Bucket value) { + if (bucketBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureBucketIsMutable(); + bucket_.set(index, value); + onChanged(); + } else { + bucketBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +       * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +       * 
    + */ + public Builder setBucket( + int index, io.prometheus.client.Metrics.Bucket.Builder builderForValue) { + if (bucketBuilder_ == null) { + ensureBucketIsMutable(); + bucket_.set(index, builderForValue.build()); + onChanged(); + } else { + bucketBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +       * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +       * 
    + */ + public Builder addBucket(io.prometheus.client.Metrics.Bucket value) { + if (bucketBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureBucketIsMutable(); + bucket_.add(value); + onChanged(); + } else { + bucketBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +       * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +       * 
    + */ + public Builder addBucket( + int index, io.prometheus.client.Metrics.Bucket value) { + if (bucketBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureBucketIsMutable(); + bucket_.add(index, value); + onChanged(); + } else { + bucketBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +       * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +       * 
    + */ + public Builder addBucket( + io.prometheus.client.Metrics.Bucket.Builder builderForValue) { + if (bucketBuilder_ == null) { + ensureBucketIsMutable(); + bucket_.add(builderForValue.build()); + onChanged(); + } else { + bucketBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +       * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +       * 
    + */ + public Builder addBucket( + int index, io.prometheus.client.Metrics.Bucket.Builder builderForValue) { + if (bucketBuilder_ == null) { + ensureBucketIsMutable(); + bucket_.add(index, builderForValue.build()); + onChanged(); + } else { + bucketBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +       * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +       * 
    + */ + public Builder addAllBucket( + java.lang.Iterable values) { + if (bucketBuilder_ == null) { + ensureBucketIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, bucket_); + onChanged(); + } else { + bucketBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +       * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +       * 
    + */ + public Builder clearBucket() { + if (bucketBuilder_ == null) { + bucket_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000004); + onChanged(); + } else { + bucketBuilder_.clear(); + } + return this; + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +       * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +       * 
    + */ + public Builder removeBucket(int index) { + if (bucketBuilder_ == null) { + ensureBucketIsMutable(); + bucket_.remove(index); + onChanged(); + } else { + bucketBuilder_.remove(index); + } + return this; + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +       * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +       * 
    + */ + public io.prometheus.client.Metrics.Bucket.Builder getBucketBuilder( + int index) { + return getBucketFieldBuilder().getBuilder(index); + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +       * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +       * 
    + */ + public io.prometheus.client.Metrics.BucketOrBuilder getBucketOrBuilder( + int index) { + if (bucketBuilder_ == null) { + return bucket_.get(index); } else { + return bucketBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +       * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +       * 
    + */ + public java.util.List + getBucketOrBuilderList() { + if (bucketBuilder_ != null) { + return bucketBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(bucket_); + } + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +       * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +       * 
    + */ + public io.prometheus.client.Metrics.Bucket.Builder addBucketBuilder() { + return getBucketFieldBuilder().addBuilder( + io.prometheus.client.Metrics.Bucket.getDefaultInstance()); + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +       * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +       * 
    + */ + public io.prometheus.client.Metrics.Bucket.Builder addBucketBuilder( + int index) { + return getBucketFieldBuilder().addBuilder( + index, io.prometheus.client.Metrics.Bucket.getDefaultInstance()); + } + /** + * repeated .io.prometheus.client.Bucket bucket = 3; + * + *
    +       * Ordered in increasing order of upper_bound, +Inf bucket is optional.
    +       * 
    + */ + public java.util.List + getBucketBuilderList() { + return getBucketFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilder< + io.prometheus.client.Metrics.Bucket, io.prometheus.client.Metrics.Bucket.Builder, io.prometheus.client.Metrics.BucketOrBuilder> + getBucketFieldBuilder() { + if (bucketBuilder_ == null) { + bucketBuilder_ = new com.google.protobuf.RepeatedFieldBuilder< + io.prometheus.client.Metrics.Bucket, io.prometheus.client.Metrics.Bucket.Builder, io.prometheus.client.Metrics.BucketOrBuilder>( + bucket_, + ((bitField0_ & 0x00000004) == 0x00000004), + getParentForChildren(), + isClean()); + bucket_ = null; + } + return bucketBuilder_; + } + + // @@protoc_insertion_point(builder_scope:io.prometheus.client.Histogram) + } + + static { + defaultInstance = new Histogram(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:io.prometheus.client.Histogram) + } + + public interface BucketOrBuilder extends + // @@protoc_insertion_point(interface_extends:io.prometheus.client.Bucket) + com.google.protobuf.MessageOrBuilder { + + /** + * optional uint64 cumulative_count = 1; + * + *
    +     * Cumulative in increasing order.
    +     * 
    + */ + boolean hasCumulativeCount(); + /** + * optional uint64 cumulative_count = 1; + * + *
    +     * Cumulative in increasing order.
    +     * 
    + */ + long getCumulativeCount(); + + /** + * optional double upper_bound = 2; + * + *
    +     * Inclusive.
    +     * 
    + */ + boolean hasUpperBound(); + /** + * optional double upper_bound = 2; + * + *
    +     * Inclusive.
    +     * 
    + */ + double getUpperBound(); + } + /** + * Protobuf type {@code io.prometheus.client.Bucket} + */ + public static final class Bucket extends + com.google.protobuf.GeneratedMessage implements + // @@protoc_insertion_point(message_implements:io.prometheus.client.Bucket) + BucketOrBuilder { + // Use Bucket.newBuilder() to construct. + private Bucket(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Bucket(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Bucket defaultInstance; + public static Bucket getDefaultInstance() { + return defaultInstance; + } + + public Bucket getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Bucket( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + bitField0_ |= 0x00000001; + cumulativeCount_ = input.readUInt64(); + break; + } + case 17: { + bitField0_ |= 0x00000002; + upperBound_ = input.readDouble(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Bucket_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Bucket_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.Bucket.class, io.prometheus.client.Metrics.Bucket.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Bucket parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Bucket(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + public static final int CUMULATIVE_COUNT_FIELD_NUMBER = 1; + private long cumulativeCount_; + /** + * optional uint64 cumulative_count = 1; + * + *
    +     * Cumulative in increasing order.
    +     * 
    + */ + public boolean hasCumulativeCount() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint64 cumulative_count = 1; + * + *
    +     * Cumulative in increasing order.
    +     * 
    + */ + public long getCumulativeCount() { + return cumulativeCount_; + } + + public static final int UPPER_BOUND_FIELD_NUMBER = 2; + private double upperBound_; + /** + * optional double upper_bound = 2; + * + *
    +     * Inclusive.
    +     * 
    + */ + public boolean hasUpperBound() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional double upper_bound = 2; + * + *
    +     * Inclusive.
    +     * 
    + */ + public double getUpperBound() { + return upperBound_; + } + + private void initFields() { + cumulativeCount_ = 0L; + upperBound_ = 0D; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeUInt64(1, cumulativeCount_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeDouble(2, upperBound_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt64Size(1, cumulativeCount_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeDoubleSize(2, upperBound_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static io.prometheus.client.Metrics.Bucket parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.Bucket parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.Bucket parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.Bucket parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.Bucket parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.Bucket parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.Bucket parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static io.prometheus.client.Metrics.Bucket parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.Bucket parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.Bucket parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(io.prometheus.client.Metrics.Bucket prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code io.prometheus.client.Bucket} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder implements + // @@protoc_insertion_point(builder_implements:io.prometheus.client.Bucket) + io.prometheus.client.Metrics.BucketOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Bucket_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Bucket_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.Bucket.class, io.prometheus.client.Metrics.Bucket.Builder.class); + } + + // Construct using io.prometheus.client.Metrics.Bucket.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + cumulativeCount_ = 0L; + bitField0_ = (bitField0_ & ~0x00000001); + upperBound_ = 0D; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Bucket_descriptor; + } + + public io.prometheus.client.Metrics.Bucket getDefaultInstanceForType() { + return io.prometheus.client.Metrics.Bucket.getDefaultInstance(); + } + + public io.prometheus.client.Metrics.Bucket build() { + io.prometheus.client.Metrics.Bucket result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public io.prometheus.client.Metrics.Bucket buildPartial() { + io.prometheus.client.Metrics.Bucket result = new io.prometheus.client.Metrics.Bucket(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.cumulativeCount_ = cumulativeCount_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.upperBound_ = upperBound_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof io.prometheus.client.Metrics.Bucket) { + return mergeFrom((io.prometheus.client.Metrics.Bucket)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(io.prometheus.client.Metrics.Bucket other) { + if (other == io.prometheus.client.Metrics.Bucket.getDefaultInstance()) return this; + if (other.hasCumulativeCount()) { + setCumulativeCount(other.getCumulativeCount()); + } + if (other.hasUpperBound()) { + setUpperBound(other.getUpperBound()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + io.prometheus.client.Metrics.Bucket parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (io.prometheus.client.Metrics.Bucket) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private long cumulativeCount_ ; + /** + * optional uint64 cumulative_count = 1; + * + *
    +       * Cumulative in increasing order.
    +       * 
    + */ + public boolean hasCumulativeCount() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint64 cumulative_count = 1; + * + *
    +       * Cumulative in increasing order.
    +       * 
    + */ + public long getCumulativeCount() { + return cumulativeCount_; + } + /** + * optional uint64 cumulative_count = 1; + * + *
    +       * Cumulative in increasing order.
    +       * 
    + */ + public Builder setCumulativeCount(long value) { + bitField0_ |= 0x00000001; + cumulativeCount_ = value; + onChanged(); + return this; + } + /** + * optional uint64 cumulative_count = 1; + * + *
    +       * Cumulative in increasing order.
    +       * 
    + */ + public Builder clearCumulativeCount() { + bitField0_ = (bitField0_ & ~0x00000001); + cumulativeCount_ = 0L; + onChanged(); + return this; + } + + private double upperBound_ ; + /** + * optional double upper_bound = 2; + * + *
    +       * Inclusive.
    +       * 
    + */ + public boolean hasUpperBound() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional double upper_bound = 2; + * + *
    +       * Inclusive.
    +       * 
    + */ + public double getUpperBound() { + return upperBound_; + } + /** + * optional double upper_bound = 2; + * + *
    +       * Inclusive.
    +       * 
    + */ + public Builder setUpperBound(double value) { + bitField0_ |= 0x00000002; + upperBound_ = value; + onChanged(); + return this; + } + /** + * optional double upper_bound = 2; + * + *
    +       * Inclusive.
    +       * 
    + */ + public Builder clearUpperBound() { + bitField0_ = (bitField0_ & ~0x00000002); + upperBound_ = 0D; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:io.prometheus.client.Bucket) + } + + static { + defaultInstance = new Bucket(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:io.prometheus.client.Bucket) + } + + public interface MetricOrBuilder extends + // @@protoc_insertion_point(interface_extends:io.prometheus.client.Metric) + com.google.protobuf.MessageOrBuilder { + + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + java.util.List + getLabelList(); + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + io.prometheus.client.Metrics.LabelPair getLabel(int index); + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + int getLabelCount(); + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + java.util.List + getLabelOrBuilderList(); + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + io.prometheus.client.Metrics.LabelPairOrBuilder getLabelOrBuilder( + int index); + + /** + * optional .io.prometheus.client.Gauge gauge = 2; + */ + boolean hasGauge(); + /** + * optional .io.prometheus.client.Gauge gauge = 2; + */ + io.prometheus.client.Metrics.Gauge getGauge(); + /** + * optional .io.prometheus.client.Gauge gauge = 2; + */ + io.prometheus.client.Metrics.GaugeOrBuilder getGaugeOrBuilder(); + + /** + * optional .io.prometheus.client.Counter counter = 3; + */ + boolean hasCounter(); + /** + * optional .io.prometheus.client.Counter counter = 3; + */ + io.prometheus.client.Metrics.Counter getCounter(); + /** + * optional .io.prometheus.client.Counter counter = 3; + */ + io.prometheus.client.Metrics.CounterOrBuilder getCounterOrBuilder(); + + /** + * optional .io.prometheus.client.Summary summary = 4; + */ + boolean hasSummary(); + /** + * optional .io.prometheus.client.Summary summary = 4; + */ + io.prometheus.client.Metrics.Summary getSummary(); + /** + * optional .io.prometheus.client.Summary summary = 4; + */ + io.prometheus.client.Metrics.SummaryOrBuilder getSummaryOrBuilder(); + + /** + * optional .io.prometheus.client.Untyped untyped = 5; + */ + boolean hasUntyped(); + /** + * optional .io.prometheus.client.Untyped untyped = 5; + */ + io.prometheus.client.Metrics.Untyped getUntyped(); + /** + * optional .io.prometheus.client.Untyped untyped = 5; + */ + io.prometheus.client.Metrics.UntypedOrBuilder getUntypedOrBuilder(); + + /** + * optional .io.prometheus.client.Histogram histogram = 7; + */ + boolean hasHistogram(); + /** + * optional .io.prometheus.client.Histogram histogram = 7; + */ + io.prometheus.client.Metrics.Histogram getHistogram(); + /** + * optional .io.prometheus.client.Histogram histogram = 7; + */ + io.prometheus.client.Metrics.HistogramOrBuilder getHistogramOrBuilder(); + + /** + * optional int64 timestamp_ms = 6; + */ + boolean hasTimestampMs(); + /** + * optional int64 timestamp_ms = 6; + */ + long getTimestampMs(); + } + /** + * Protobuf type {@code io.prometheus.client.Metric} + */ + public static final class Metric extends + com.google.protobuf.GeneratedMessage implements + // @@protoc_insertion_point(message_implements:io.prometheus.client.Metric) + MetricOrBuilder { + // Use Metric.newBuilder() to construct. + private Metric(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Metric(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Metric defaultInstance; + public static Metric getDefaultInstance() { + return defaultInstance; + } + + public Metric getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Metric( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + if (!((mutable_bitField0_ & 0x00000001) == 0x00000001)) { + label_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000001; + } + label_.add(input.readMessage(io.prometheus.client.Metrics.LabelPair.PARSER, extensionRegistry)); + break; + } + case 18: { + io.prometheus.client.Metrics.Gauge.Builder subBuilder = null; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + subBuilder = gauge_.toBuilder(); + } + gauge_ = input.readMessage(io.prometheus.client.Metrics.Gauge.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(gauge_); + gauge_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000001; + break; + } + case 26: { + io.prometheus.client.Metrics.Counter.Builder subBuilder = null; + if (((bitField0_ & 0x00000002) == 0x00000002)) { + subBuilder = counter_.toBuilder(); + } + counter_ = input.readMessage(io.prometheus.client.Metrics.Counter.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(counter_); + counter_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000002; + break; + } + case 34: { + io.prometheus.client.Metrics.Summary.Builder subBuilder = null; + if (((bitField0_ & 0x00000004) == 0x00000004)) { + subBuilder = summary_.toBuilder(); + } + summary_ = input.readMessage(io.prometheus.client.Metrics.Summary.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(summary_); + summary_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000004; + break; + } + case 42: { + io.prometheus.client.Metrics.Untyped.Builder subBuilder = null; + if (((bitField0_ & 0x00000008) == 0x00000008)) { + subBuilder = untyped_.toBuilder(); + } + untyped_ = input.readMessage(io.prometheus.client.Metrics.Untyped.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(untyped_); + untyped_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000008; + break; + } + case 48: { + bitField0_ |= 0x00000020; + timestampMs_ = input.readInt64(); + break; + } + case 58: { + io.prometheus.client.Metrics.Histogram.Builder subBuilder = null; + if (((bitField0_ & 0x00000010) == 0x00000010)) { + subBuilder = histogram_.toBuilder(); + } + histogram_ = input.readMessage(io.prometheus.client.Metrics.Histogram.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(histogram_); + histogram_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000010; + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000001) == 0x00000001)) { + label_ = java.util.Collections.unmodifiableList(label_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Metric_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Metric_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.Metric.class, io.prometheus.client.Metrics.Metric.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Metric parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Metric(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + public static final int LABEL_FIELD_NUMBER = 1; + private java.util.List label_; + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public java.util.List getLabelList() { + return label_; + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public java.util.List + getLabelOrBuilderList() { + return label_; + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public int getLabelCount() { + return label_.size(); + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public io.prometheus.client.Metrics.LabelPair getLabel(int index) { + return label_.get(index); + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public io.prometheus.client.Metrics.LabelPairOrBuilder getLabelOrBuilder( + int index) { + return label_.get(index); + } + + public static final int GAUGE_FIELD_NUMBER = 2; + private io.prometheus.client.Metrics.Gauge gauge_; + /** + * optional .io.prometheus.client.Gauge gauge = 2; + */ + public boolean hasGauge() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional .io.prometheus.client.Gauge gauge = 2; + */ + public io.prometheus.client.Metrics.Gauge getGauge() { + return gauge_; + } + /** + * optional .io.prometheus.client.Gauge gauge = 2; + */ + public io.prometheus.client.Metrics.GaugeOrBuilder getGaugeOrBuilder() { + return gauge_; + } + + public static final int COUNTER_FIELD_NUMBER = 3; + private io.prometheus.client.Metrics.Counter counter_; + /** + * optional .io.prometheus.client.Counter counter = 3; + */ + public boolean hasCounter() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional .io.prometheus.client.Counter counter = 3; + */ + public io.prometheus.client.Metrics.Counter getCounter() { + return counter_; + } + /** + * optional .io.prometheus.client.Counter counter = 3; + */ + public io.prometheus.client.Metrics.CounterOrBuilder getCounterOrBuilder() { + return counter_; + } + + public static final int SUMMARY_FIELD_NUMBER = 4; + private io.prometheus.client.Metrics.Summary summary_; + /** + * optional .io.prometheus.client.Summary summary = 4; + */ + public boolean hasSummary() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .io.prometheus.client.Summary summary = 4; + */ + public io.prometheus.client.Metrics.Summary getSummary() { + return summary_; + } + /** + * optional .io.prometheus.client.Summary summary = 4; + */ + public io.prometheus.client.Metrics.SummaryOrBuilder getSummaryOrBuilder() { + return summary_; + } + + public static final int UNTYPED_FIELD_NUMBER = 5; + private io.prometheus.client.Metrics.Untyped untyped_; + /** + * optional .io.prometheus.client.Untyped untyped = 5; + */ + public boolean hasUntyped() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional .io.prometheus.client.Untyped untyped = 5; + */ + public io.prometheus.client.Metrics.Untyped getUntyped() { + return untyped_; + } + /** + * optional .io.prometheus.client.Untyped untyped = 5; + */ + public io.prometheus.client.Metrics.UntypedOrBuilder getUntypedOrBuilder() { + return untyped_; + } + + public static final int HISTOGRAM_FIELD_NUMBER = 7; + private io.prometheus.client.Metrics.Histogram histogram_; + /** + * optional .io.prometheus.client.Histogram histogram = 7; + */ + public boolean hasHistogram() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional .io.prometheus.client.Histogram histogram = 7; + */ + public io.prometheus.client.Metrics.Histogram getHistogram() { + return histogram_; + } + /** + * optional .io.prometheus.client.Histogram histogram = 7; + */ + public io.prometheus.client.Metrics.HistogramOrBuilder getHistogramOrBuilder() { + return histogram_; + } + + public static final int TIMESTAMP_MS_FIELD_NUMBER = 6; + private long timestampMs_; + /** + * optional int64 timestamp_ms = 6; + */ + public boolean hasTimestampMs() { + return ((bitField0_ & 0x00000020) == 0x00000020); + } + /** + * optional int64 timestamp_ms = 6; + */ + public long getTimestampMs() { + return timestampMs_; + } + + private void initFields() { + label_ = java.util.Collections.emptyList(); + gauge_ = io.prometheus.client.Metrics.Gauge.getDefaultInstance(); + counter_ = io.prometheus.client.Metrics.Counter.getDefaultInstance(); + summary_ = io.prometheus.client.Metrics.Summary.getDefaultInstance(); + untyped_ = io.prometheus.client.Metrics.Untyped.getDefaultInstance(); + histogram_ = io.prometheus.client.Metrics.Histogram.getDefaultInstance(); + timestampMs_ = 0L; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + for (int i = 0; i < label_.size(); i++) { + output.writeMessage(1, label_.get(i)); + } + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeMessage(2, gauge_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeMessage(3, counter_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeMessage(4, summary_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + output.writeMessage(5, untyped_); + } + if (((bitField0_ & 0x00000020) == 0x00000020)) { + output.writeInt64(6, timestampMs_); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + output.writeMessage(7, histogram_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + for (int i = 0; i < label_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, label_.get(i)); + } + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, gauge_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, counter_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(4, summary_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(5, untyped_); + } + if (((bitField0_ & 0x00000020) == 0x00000020)) { + size += com.google.protobuf.CodedOutputStream + .computeInt64Size(6, timestampMs_); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(7, histogram_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static io.prometheus.client.Metrics.Metric parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.Metric parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.Metric parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.Metric parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.Metric parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.Metric parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.Metric parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static io.prometheus.client.Metrics.Metric parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.Metric parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.Metric parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(io.prometheus.client.Metrics.Metric prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code io.prometheus.client.Metric} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder implements + // @@protoc_insertion_point(builder_implements:io.prometheus.client.Metric) + io.prometheus.client.Metrics.MetricOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Metric_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Metric_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.Metric.class, io.prometheus.client.Metrics.Metric.Builder.class); + } + + // Construct using io.prometheus.client.Metrics.Metric.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + getLabelFieldBuilder(); + getGaugeFieldBuilder(); + getCounterFieldBuilder(); + getSummaryFieldBuilder(); + getUntypedFieldBuilder(); + getHistogramFieldBuilder(); + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + if (labelBuilder_ == null) { + label_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + } else { + labelBuilder_.clear(); + } + if (gaugeBuilder_ == null) { + gauge_ = io.prometheus.client.Metrics.Gauge.getDefaultInstance(); + } else { + gaugeBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + if (counterBuilder_ == null) { + counter_ = io.prometheus.client.Metrics.Counter.getDefaultInstance(); + } else { + counterBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + if (summaryBuilder_ == null) { + summary_ = io.prometheus.client.Metrics.Summary.getDefaultInstance(); + } else { + summaryBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000008); + if (untypedBuilder_ == null) { + untyped_ = io.prometheus.client.Metrics.Untyped.getDefaultInstance(); + } else { + untypedBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000010); + if (histogramBuilder_ == null) { + histogram_ = io.prometheus.client.Metrics.Histogram.getDefaultInstance(); + } else { + histogramBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000020); + timestampMs_ = 0L; + bitField0_ = (bitField0_ & ~0x00000040); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_Metric_descriptor; + } + + public io.prometheus.client.Metrics.Metric getDefaultInstanceForType() { + return io.prometheus.client.Metrics.Metric.getDefaultInstance(); + } + + public io.prometheus.client.Metrics.Metric build() { + io.prometheus.client.Metrics.Metric result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public io.prometheus.client.Metrics.Metric buildPartial() { + io.prometheus.client.Metrics.Metric result = new io.prometheus.client.Metrics.Metric(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (labelBuilder_ == null) { + if (((bitField0_ & 0x00000001) == 0x00000001)) { + label_ = java.util.Collections.unmodifiableList(label_); + bitField0_ = (bitField0_ & ~0x00000001); + } + result.label_ = label_; + } else { + result.label_ = labelBuilder_.build(); + } + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000001; + } + if (gaugeBuilder_ == null) { + result.gauge_ = gauge_; + } else { + result.gauge_ = gaugeBuilder_.build(); + } + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000002; + } + if (counterBuilder_ == null) { + result.counter_ = counter_; + } else { + result.counter_ = counterBuilder_.build(); + } + if (((from_bitField0_ & 0x00000008) == 0x00000008)) { + to_bitField0_ |= 0x00000004; + } + if (summaryBuilder_ == null) { + result.summary_ = summary_; + } else { + result.summary_ = summaryBuilder_.build(); + } + if (((from_bitField0_ & 0x00000010) == 0x00000010)) { + to_bitField0_ |= 0x00000008; + } + if (untypedBuilder_ == null) { + result.untyped_ = untyped_; + } else { + result.untyped_ = untypedBuilder_.build(); + } + if (((from_bitField0_ & 0x00000020) == 0x00000020)) { + to_bitField0_ |= 0x00000010; + } + if (histogramBuilder_ == null) { + result.histogram_ = histogram_; + } else { + result.histogram_ = histogramBuilder_.build(); + } + if (((from_bitField0_ & 0x00000040) == 0x00000040)) { + to_bitField0_ |= 0x00000020; + } + result.timestampMs_ = timestampMs_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof io.prometheus.client.Metrics.Metric) { + return mergeFrom((io.prometheus.client.Metrics.Metric)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(io.prometheus.client.Metrics.Metric other) { + if (other == io.prometheus.client.Metrics.Metric.getDefaultInstance()) return this; + if (labelBuilder_ == null) { + if (!other.label_.isEmpty()) { + if (label_.isEmpty()) { + label_ = other.label_; + bitField0_ = (bitField0_ & ~0x00000001); + } else { + ensureLabelIsMutable(); + label_.addAll(other.label_); + } + onChanged(); + } + } else { + if (!other.label_.isEmpty()) { + if (labelBuilder_.isEmpty()) { + labelBuilder_.dispose(); + labelBuilder_ = null; + label_ = other.label_; + bitField0_ = (bitField0_ & ~0x00000001); + labelBuilder_ = + com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ? + getLabelFieldBuilder() : null; + } else { + labelBuilder_.addAllMessages(other.label_); + } + } + } + if (other.hasGauge()) { + mergeGauge(other.getGauge()); + } + if (other.hasCounter()) { + mergeCounter(other.getCounter()); + } + if (other.hasSummary()) { + mergeSummary(other.getSummary()); + } + if (other.hasUntyped()) { + mergeUntyped(other.getUntyped()); + } + if (other.hasHistogram()) { + mergeHistogram(other.getHistogram()); + } + if (other.hasTimestampMs()) { + setTimestampMs(other.getTimestampMs()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + io.prometheus.client.Metrics.Metric parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (io.prometheus.client.Metrics.Metric) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private java.util.List label_ = + java.util.Collections.emptyList(); + private void ensureLabelIsMutable() { + if (!((bitField0_ & 0x00000001) == 0x00000001)) { + label_ = new java.util.ArrayList(label_); + bitField0_ |= 0x00000001; + } + } + + private com.google.protobuf.RepeatedFieldBuilder< + io.prometheus.client.Metrics.LabelPair, io.prometheus.client.Metrics.LabelPair.Builder, io.prometheus.client.Metrics.LabelPairOrBuilder> labelBuilder_; + + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public java.util.List getLabelList() { + if (labelBuilder_ == null) { + return java.util.Collections.unmodifiableList(label_); + } else { + return labelBuilder_.getMessageList(); + } + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public int getLabelCount() { + if (labelBuilder_ == null) { + return label_.size(); + } else { + return labelBuilder_.getCount(); + } + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public io.prometheus.client.Metrics.LabelPair getLabel(int index) { + if (labelBuilder_ == null) { + return label_.get(index); + } else { + return labelBuilder_.getMessage(index); + } + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public Builder setLabel( + int index, io.prometheus.client.Metrics.LabelPair value) { + if (labelBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureLabelIsMutable(); + label_.set(index, value); + onChanged(); + } else { + labelBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public Builder setLabel( + int index, io.prometheus.client.Metrics.LabelPair.Builder builderForValue) { + if (labelBuilder_ == null) { + ensureLabelIsMutable(); + label_.set(index, builderForValue.build()); + onChanged(); + } else { + labelBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public Builder addLabel(io.prometheus.client.Metrics.LabelPair value) { + if (labelBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureLabelIsMutable(); + label_.add(value); + onChanged(); + } else { + labelBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public Builder addLabel( + int index, io.prometheus.client.Metrics.LabelPair value) { + if (labelBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureLabelIsMutable(); + label_.add(index, value); + onChanged(); + } else { + labelBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public Builder addLabel( + io.prometheus.client.Metrics.LabelPair.Builder builderForValue) { + if (labelBuilder_ == null) { + ensureLabelIsMutable(); + label_.add(builderForValue.build()); + onChanged(); + } else { + labelBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public Builder addLabel( + int index, io.prometheus.client.Metrics.LabelPair.Builder builderForValue) { + if (labelBuilder_ == null) { + ensureLabelIsMutable(); + label_.add(index, builderForValue.build()); + onChanged(); + } else { + labelBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public Builder addAllLabel( + java.lang.Iterable values) { + if (labelBuilder_ == null) { + ensureLabelIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, label_); + onChanged(); + } else { + labelBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public Builder clearLabel() { + if (labelBuilder_ == null) { + label_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + } else { + labelBuilder_.clear(); + } + return this; + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public Builder removeLabel(int index) { + if (labelBuilder_ == null) { + ensureLabelIsMutable(); + label_.remove(index); + onChanged(); + } else { + labelBuilder_.remove(index); + } + return this; + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public io.prometheus.client.Metrics.LabelPair.Builder getLabelBuilder( + int index) { + return getLabelFieldBuilder().getBuilder(index); + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public io.prometheus.client.Metrics.LabelPairOrBuilder getLabelOrBuilder( + int index) { + if (labelBuilder_ == null) { + return label_.get(index); } else { + return labelBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public java.util.List + getLabelOrBuilderList() { + if (labelBuilder_ != null) { + return labelBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(label_); + } + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public io.prometheus.client.Metrics.LabelPair.Builder addLabelBuilder() { + return getLabelFieldBuilder().addBuilder( + io.prometheus.client.Metrics.LabelPair.getDefaultInstance()); + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public io.prometheus.client.Metrics.LabelPair.Builder addLabelBuilder( + int index) { + return getLabelFieldBuilder().addBuilder( + index, io.prometheus.client.Metrics.LabelPair.getDefaultInstance()); + } + /** + * repeated .io.prometheus.client.LabelPair label = 1; + */ + public java.util.List + getLabelBuilderList() { + return getLabelFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilder< + io.prometheus.client.Metrics.LabelPair, io.prometheus.client.Metrics.LabelPair.Builder, io.prometheus.client.Metrics.LabelPairOrBuilder> + getLabelFieldBuilder() { + if (labelBuilder_ == null) { + labelBuilder_ = new com.google.protobuf.RepeatedFieldBuilder< + io.prometheus.client.Metrics.LabelPair, io.prometheus.client.Metrics.LabelPair.Builder, io.prometheus.client.Metrics.LabelPairOrBuilder>( + label_, + ((bitField0_ & 0x00000001) == 0x00000001), + getParentForChildren(), + isClean()); + label_ = null; + } + return labelBuilder_; + } + + private io.prometheus.client.Metrics.Gauge gauge_ = io.prometheus.client.Metrics.Gauge.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + io.prometheus.client.Metrics.Gauge, io.prometheus.client.Metrics.Gauge.Builder, io.prometheus.client.Metrics.GaugeOrBuilder> gaugeBuilder_; + /** + * optional .io.prometheus.client.Gauge gauge = 2; + */ + public boolean hasGauge() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional .io.prometheus.client.Gauge gauge = 2; + */ + public io.prometheus.client.Metrics.Gauge getGauge() { + if (gaugeBuilder_ == null) { + return gauge_; + } else { + return gaugeBuilder_.getMessage(); + } + } + /** + * optional .io.prometheus.client.Gauge gauge = 2; + */ + public Builder setGauge(io.prometheus.client.Metrics.Gauge value) { + if (gaugeBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + gauge_ = value; + onChanged(); + } else { + gaugeBuilder_.setMessage(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .io.prometheus.client.Gauge gauge = 2; + */ + public Builder setGauge( + io.prometheus.client.Metrics.Gauge.Builder builderForValue) { + if (gaugeBuilder_ == null) { + gauge_ = builderForValue.build(); + onChanged(); + } else { + gaugeBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .io.prometheus.client.Gauge gauge = 2; + */ + public Builder mergeGauge(io.prometheus.client.Metrics.Gauge value) { + if (gaugeBuilder_ == null) { + if (((bitField0_ & 0x00000002) == 0x00000002) && + gauge_ != io.prometheus.client.Metrics.Gauge.getDefaultInstance()) { + gauge_ = + io.prometheus.client.Metrics.Gauge.newBuilder(gauge_).mergeFrom(value).buildPartial(); + } else { + gauge_ = value; + } + onChanged(); + } else { + gaugeBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .io.prometheus.client.Gauge gauge = 2; + */ + public Builder clearGauge() { + if (gaugeBuilder_ == null) { + gauge_ = io.prometheus.client.Metrics.Gauge.getDefaultInstance(); + onChanged(); + } else { + gaugeBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + /** + * optional .io.prometheus.client.Gauge gauge = 2; + */ + public io.prometheus.client.Metrics.Gauge.Builder getGaugeBuilder() { + bitField0_ |= 0x00000002; + onChanged(); + return getGaugeFieldBuilder().getBuilder(); + } + /** + * optional .io.prometheus.client.Gauge gauge = 2; + */ + public io.prometheus.client.Metrics.GaugeOrBuilder getGaugeOrBuilder() { + if (gaugeBuilder_ != null) { + return gaugeBuilder_.getMessageOrBuilder(); + } else { + return gauge_; + } + } + /** + * optional .io.prometheus.client.Gauge gauge = 2; + */ + private com.google.protobuf.SingleFieldBuilder< + io.prometheus.client.Metrics.Gauge, io.prometheus.client.Metrics.Gauge.Builder, io.prometheus.client.Metrics.GaugeOrBuilder> + getGaugeFieldBuilder() { + if (gaugeBuilder_ == null) { + gaugeBuilder_ = new com.google.protobuf.SingleFieldBuilder< + io.prometheus.client.Metrics.Gauge, io.prometheus.client.Metrics.Gauge.Builder, io.prometheus.client.Metrics.GaugeOrBuilder>( + getGauge(), + getParentForChildren(), + isClean()); + gauge_ = null; + } + return gaugeBuilder_; + } + + private io.prometheus.client.Metrics.Counter counter_ = io.prometheus.client.Metrics.Counter.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + io.prometheus.client.Metrics.Counter, io.prometheus.client.Metrics.Counter.Builder, io.prometheus.client.Metrics.CounterOrBuilder> counterBuilder_; + /** + * optional .io.prometheus.client.Counter counter = 3; + */ + public boolean hasCounter() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .io.prometheus.client.Counter counter = 3; + */ + public io.prometheus.client.Metrics.Counter getCounter() { + if (counterBuilder_ == null) { + return counter_; + } else { + return counterBuilder_.getMessage(); + } + } + /** + * optional .io.prometheus.client.Counter counter = 3; + */ + public Builder setCounter(io.prometheus.client.Metrics.Counter value) { + if (counterBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + counter_ = value; + onChanged(); + } else { + counterBuilder_.setMessage(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .io.prometheus.client.Counter counter = 3; + */ + public Builder setCounter( + io.prometheus.client.Metrics.Counter.Builder builderForValue) { + if (counterBuilder_ == null) { + counter_ = builderForValue.build(); + onChanged(); + } else { + counterBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .io.prometheus.client.Counter counter = 3; + */ + public Builder mergeCounter(io.prometheus.client.Metrics.Counter value) { + if (counterBuilder_ == null) { + if (((bitField0_ & 0x00000004) == 0x00000004) && + counter_ != io.prometheus.client.Metrics.Counter.getDefaultInstance()) { + counter_ = + io.prometheus.client.Metrics.Counter.newBuilder(counter_).mergeFrom(value).buildPartial(); + } else { + counter_ = value; + } + onChanged(); + } else { + counterBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .io.prometheus.client.Counter counter = 3; + */ + public Builder clearCounter() { + if (counterBuilder_ == null) { + counter_ = io.prometheus.client.Metrics.Counter.getDefaultInstance(); + onChanged(); + } else { + counterBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + /** + * optional .io.prometheus.client.Counter counter = 3; + */ + public io.prometheus.client.Metrics.Counter.Builder getCounterBuilder() { + bitField0_ |= 0x00000004; + onChanged(); + return getCounterFieldBuilder().getBuilder(); + } + /** + * optional .io.prometheus.client.Counter counter = 3; + */ + public io.prometheus.client.Metrics.CounterOrBuilder getCounterOrBuilder() { + if (counterBuilder_ != null) { + return counterBuilder_.getMessageOrBuilder(); + } else { + return counter_; + } + } + /** + * optional .io.prometheus.client.Counter counter = 3; + */ + private com.google.protobuf.SingleFieldBuilder< + io.prometheus.client.Metrics.Counter, io.prometheus.client.Metrics.Counter.Builder, io.prometheus.client.Metrics.CounterOrBuilder> + getCounterFieldBuilder() { + if (counterBuilder_ == null) { + counterBuilder_ = new com.google.protobuf.SingleFieldBuilder< + io.prometheus.client.Metrics.Counter, io.prometheus.client.Metrics.Counter.Builder, io.prometheus.client.Metrics.CounterOrBuilder>( + getCounter(), + getParentForChildren(), + isClean()); + counter_ = null; + } + return counterBuilder_; + } + + private io.prometheus.client.Metrics.Summary summary_ = io.prometheus.client.Metrics.Summary.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + io.prometheus.client.Metrics.Summary, io.prometheus.client.Metrics.Summary.Builder, io.prometheus.client.Metrics.SummaryOrBuilder> summaryBuilder_; + /** + * optional .io.prometheus.client.Summary summary = 4; + */ + public boolean hasSummary() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional .io.prometheus.client.Summary summary = 4; + */ + public io.prometheus.client.Metrics.Summary getSummary() { + if (summaryBuilder_ == null) { + return summary_; + } else { + return summaryBuilder_.getMessage(); + } + } + /** + * optional .io.prometheus.client.Summary summary = 4; + */ + public Builder setSummary(io.prometheus.client.Metrics.Summary value) { + if (summaryBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + summary_ = value; + onChanged(); + } else { + summaryBuilder_.setMessage(value); + } + bitField0_ |= 0x00000008; + return this; + } + /** + * optional .io.prometheus.client.Summary summary = 4; + */ + public Builder setSummary( + io.prometheus.client.Metrics.Summary.Builder builderForValue) { + if (summaryBuilder_ == null) { + summary_ = builderForValue.build(); + onChanged(); + } else { + summaryBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000008; + return this; + } + /** + * optional .io.prometheus.client.Summary summary = 4; + */ + public Builder mergeSummary(io.prometheus.client.Metrics.Summary value) { + if (summaryBuilder_ == null) { + if (((bitField0_ & 0x00000008) == 0x00000008) && + summary_ != io.prometheus.client.Metrics.Summary.getDefaultInstance()) { + summary_ = + io.prometheus.client.Metrics.Summary.newBuilder(summary_).mergeFrom(value).buildPartial(); + } else { + summary_ = value; + } + onChanged(); + } else { + summaryBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000008; + return this; + } + /** + * optional .io.prometheus.client.Summary summary = 4; + */ + public Builder clearSummary() { + if (summaryBuilder_ == null) { + summary_ = io.prometheus.client.Metrics.Summary.getDefaultInstance(); + onChanged(); + } else { + summaryBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000008); + return this; + } + /** + * optional .io.prometheus.client.Summary summary = 4; + */ + public io.prometheus.client.Metrics.Summary.Builder getSummaryBuilder() { + bitField0_ |= 0x00000008; + onChanged(); + return getSummaryFieldBuilder().getBuilder(); + } + /** + * optional .io.prometheus.client.Summary summary = 4; + */ + public io.prometheus.client.Metrics.SummaryOrBuilder getSummaryOrBuilder() { + if (summaryBuilder_ != null) { + return summaryBuilder_.getMessageOrBuilder(); + } else { + return summary_; + } + } + /** + * optional .io.prometheus.client.Summary summary = 4; + */ + private com.google.protobuf.SingleFieldBuilder< + io.prometheus.client.Metrics.Summary, io.prometheus.client.Metrics.Summary.Builder, io.prometheus.client.Metrics.SummaryOrBuilder> + getSummaryFieldBuilder() { + if (summaryBuilder_ == null) { + summaryBuilder_ = new com.google.protobuf.SingleFieldBuilder< + io.prometheus.client.Metrics.Summary, io.prometheus.client.Metrics.Summary.Builder, io.prometheus.client.Metrics.SummaryOrBuilder>( + getSummary(), + getParentForChildren(), + isClean()); + summary_ = null; + } + return summaryBuilder_; + } + + private io.prometheus.client.Metrics.Untyped untyped_ = io.prometheus.client.Metrics.Untyped.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + io.prometheus.client.Metrics.Untyped, io.prometheus.client.Metrics.Untyped.Builder, io.prometheus.client.Metrics.UntypedOrBuilder> untypedBuilder_; + /** + * optional .io.prometheus.client.Untyped untyped = 5; + */ + public boolean hasUntyped() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional .io.prometheus.client.Untyped untyped = 5; + */ + public io.prometheus.client.Metrics.Untyped getUntyped() { + if (untypedBuilder_ == null) { + return untyped_; + } else { + return untypedBuilder_.getMessage(); + } + } + /** + * optional .io.prometheus.client.Untyped untyped = 5; + */ + public Builder setUntyped(io.prometheus.client.Metrics.Untyped value) { + if (untypedBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + untyped_ = value; + onChanged(); + } else { + untypedBuilder_.setMessage(value); + } + bitField0_ |= 0x00000010; + return this; + } + /** + * optional .io.prometheus.client.Untyped untyped = 5; + */ + public Builder setUntyped( + io.prometheus.client.Metrics.Untyped.Builder builderForValue) { + if (untypedBuilder_ == null) { + untyped_ = builderForValue.build(); + onChanged(); + } else { + untypedBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000010; + return this; + } + /** + * optional .io.prometheus.client.Untyped untyped = 5; + */ + public Builder mergeUntyped(io.prometheus.client.Metrics.Untyped value) { + if (untypedBuilder_ == null) { + if (((bitField0_ & 0x00000010) == 0x00000010) && + untyped_ != io.prometheus.client.Metrics.Untyped.getDefaultInstance()) { + untyped_ = + io.prometheus.client.Metrics.Untyped.newBuilder(untyped_).mergeFrom(value).buildPartial(); + } else { + untyped_ = value; + } + onChanged(); + } else { + untypedBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000010; + return this; + } + /** + * optional .io.prometheus.client.Untyped untyped = 5; + */ + public Builder clearUntyped() { + if (untypedBuilder_ == null) { + untyped_ = io.prometheus.client.Metrics.Untyped.getDefaultInstance(); + onChanged(); + } else { + untypedBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000010); + return this; + } + /** + * optional .io.prometheus.client.Untyped untyped = 5; + */ + public io.prometheus.client.Metrics.Untyped.Builder getUntypedBuilder() { + bitField0_ |= 0x00000010; + onChanged(); + return getUntypedFieldBuilder().getBuilder(); + } + /** + * optional .io.prometheus.client.Untyped untyped = 5; + */ + public io.prometheus.client.Metrics.UntypedOrBuilder getUntypedOrBuilder() { + if (untypedBuilder_ != null) { + return untypedBuilder_.getMessageOrBuilder(); + } else { + return untyped_; + } + } + /** + * optional .io.prometheus.client.Untyped untyped = 5; + */ + private com.google.protobuf.SingleFieldBuilder< + io.prometheus.client.Metrics.Untyped, io.prometheus.client.Metrics.Untyped.Builder, io.prometheus.client.Metrics.UntypedOrBuilder> + getUntypedFieldBuilder() { + if (untypedBuilder_ == null) { + untypedBuilder_ = new com.google.protobuf.SingleFieldBuilder< + io.prometheus.client.Metrics.Untyped, io.prometheus.client.Metrics.Untyped.Builder, io.prometheus.client.Metrics.UntypedOrBuilder>( + getUntyped(), + getParentForChildren(), + isClean()); + untyped_ = null; + } + return untypedBuilder_; + } + + private io.prometheus.client.Metrics.Histogram histogram_ = io.prometheus.client.Metrics.Histogram.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + io.prometheus.client.Metrics.Histogram, io.prometheus.client.Metrics.Histogram.Builder, io.prometheus.client.Metrics.HistogramOrBuilder> histogramBuilder_; + /** + * optional .io.prometheus.client.Histogram histogram = 7; + */ + public boolean hasHistogram() { + return ((bitField0_ & 0x00000020) == 0x00000020); + } + /** + * optional .io.prometheus.client.Histogram histogram = 7; + */ + public io.prometheus.client.Metrics.Histogram getHistogram() { + if (histogramBuilder_ == null) { + return histogram_; + } else { + return histogramBuilder_.getMessage(); + } + } + /** + * optional .io.prometheus.client.Histogram histogram = 7; + */ + public Builder setHistogram(io.prometheus.client.Metrics.Histogram value) { + if (histogramBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + histogram_ = value; + onChanged(); + } else { + histogramBuilder_.setMessage(value); + } + bitField0_ |= 0x00000020; + return this; + } + /** + * optional .io.prometheus.client.Histogram histogram = 7; + */ + public Builder setHistogram( + io.prometheus.client.Metrics.Histogram.Builder builderForValue) { + if (histogramBuilder_ == null) { + histogram_ = builderForValue.build(); + onChanged(); + } else { + histogramBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000020; + return this; + } + /** + * optional .io.prometheus.client.Histogram histogram = 7; + */ + public Builder mergeHistogram(io.prometheus.client.Metrics.Histogram value) { + if (histogramBuilder_ == null) { + if (((bitField0_ & 0x00000020) == 0x00000020) && + histogram_ != io.prometheus.client.Metrics.Histogram.getDefaultInstance()) { + histogram_ = + io.prometheus.client.Metrics.Histogram.newBuilder(histogram_).mergeFrom(value).buildPartial(); + } else { + histogram_ = value; + } + onChanged(); + } else { + histogramBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000020; + return this; + } + /** + * optional .io.prometheus.client.Histogram histogram = 7; + */ + public Builder clearHistogram() { + if (histogramBuilder_ == null) { + histogram_ = io.prometheus.client.Metrics.Histogram.getDefaultInstance(); + onChanged(); + } else { + histogramBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000020); + return this; + } + /** + * optional .io.prometheus.client.Histogram histogram = 7; + */ + public io.prometheus.client.Metrics.Histogram.Builder getHistogramBuilder() { + bitField0_ |= 0x00000020; + onChanged(); + return getHistogramFieldBuilder().getBuilder(); + } + /** + * optional .io.prometheus.client.Histogram histogram = 7; + */ + public io.prometheus.client.Metrics.HistogramOrBuilder getHistogramOrBuilder() { + if (histogramBuilder_ != null) { + return histogramBuilder_.getMessageOrBuilder(); + } else { + return histogram_; + } + } + /** + * optional .io.prometheus.client.Histogram histogram = 7; + */ + private com.google.protobuf.SingleFieldBuilder< + io.prometheus.client.Metrics.Histogram, io.prometheus.client.Metrics.Histogram.Builder, io.prometheus.client.Metrics.HistogramOrBuilder> + getHistogramFieldBuilder() { + if (histogramBuilder_ == null) { + histogramBuilder_ = new com.google.protobuf.SingleFieldBuilder< + io.prometheus.client.Metrics.Histogram, io.prometheus.client.Metrics.Histogram.Builder, io.prometheus.client.Metrics.HistogramOrBuilder>( + getHistogram(), + getParentForChildren(), + isClean()); + histogram_ = null; + } + return histogramBuilder_; + } + + private long timestampMs_ ; + /** + * optional int64 timestamp_ms = 6; + */ + public boolean hasTimestampMs() { + return ((bitField0_ & 0x00000040) == 0x00000040); + } + /** + * optional int64 timestamp_ms = 6; + */ + public long getTimestampMs() { + return timestampMs_; + } + /** + * optional int64 timestamp_ms = 6; + */ + public Builder setTimestampMs(long value) { + bitField0_ |= 0x00000040; + timestampMs_ = value; + onChanged(); + return this; + } + /** + * optional int64 timestamp_ms = 6; + */ + public Builder clearTimestampMs() { + bitField0_ = (bitField0_ & ~0x00000040); + timestampMs_ = 0L; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:io.prometheus.client.Metric) + } + + static { + defaultInstance = new Metric(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:io.prometheus.client.Metric) + } + + public interface MetricFamilyOrBuilder extends + // @@protoc_insertion_point(interface_extends:io.prometheus.client.MetricFamily) + com.google.protobuf.MessageOrBuilder { + + /** + * optional string name = 1; + */ + boolean hasName(); + /** + * optional string name = 1; + */ + java.lang.String getName(); + /** + * optional string name = 1; + */ + com.google.protobuf.ByteString + getNameBytes(); + + /** + * optional string help = 2; + */ + boolean hasHelp(); + /** + * optional string help = 2; + */ + java.lang.String getHelp(); + /** + * optional string help = 2; + */ + com.google.protobuf.ByteString + getHelpBytes(); + + /** + * optional .io.prometheus.client.MetricType type = 3; + */ + boolean hasType(); + /** + * optional .io.prometheus.client.MetricType type = 3; + */ + io.prometheus.client.Metrics.MetricType getType(); + + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + java.util.List + getMetricList(); + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + io.prometheus.client.Metrics.Metric getMetric(int index); + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + int getMetricCount(); + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + java.util.List + getMetricOrBuilderList(); + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + io.prometheus.client.Metrics.MetricOrBuilder getMetricOrBuilder( + int index); + } + /** + * Protobuf type {@code io.prometheus.client.MetricFamily} + */ + public static final class MetricFamily extends + com.google.protobuf.GeneratedMessage implements + // @@protoc_insertion_point(message_implements:io.prometheus.client.MetricFamily) + MetricFamilyOrBuilder { + // Use MetricFamily.newBuilder() to construct. + private MetricFamily(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private MetricFamily(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final MetricFamily defaultInstance; + public static MetricFamily getDefaultInstance() { + return defaultInstance; + } + + public MetricFamily getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private MetricFamily( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000001; + name_ = bs; + break; + } + case 18: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000002; + help_ = bs; + break; + } + case 24: { + int rawValue = input.readEnum(); + io.prometheus.client.Metrics.MetricType value = io.prometheus.client.Metrics.MetricType.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(3, rawValue); + } else { + bitField0_ |= 0x00000004; + type_ = value; + } + break; + } + case 34: { + if (!((mutable_bitField0_ & 0x00000008) == 0x00000008)) { + metric_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000008; + } + metric_.add(input.readMessage(io.prometheus.client.Metrics.Metric.PARSER, extensionRegistry)); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000008) == 0x00000008)) { + metric_ = java.util.Collections.unmodifiableList(metric_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_MetricFamily_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_MetricFamily_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.MetricFamily.class, io.prometheus.client.Metrics.MetricFamily.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public MetricFamily parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new MetricFamily(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + public static final int NAME_FIELD_NUMBER = 1; + private java.lang.Object name_; + /** + * optional string name = 1; + */ + public boolean hasName() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string name = 1; + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + name_ = s; + } + return s; + } + } + /** + * optional string name = 1; + */ + public com.google.protobuf.ByteString + getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int HELP_FIELD_NUMBER = 2; + private java.lang.Object help_; + /** + * optional string help = 2; + */ + public boolean hasHelp() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string help = 2; + */ + public java.lang.String getHelp() { + java.lang.Object ref = help_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + help_ = s; + } + return s; + } + } + /** + * optional string help = 2; + */ + public com.google.protobuf.ByteString + getHelpBytes() { + java.lang.Object ref = help_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + help_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int TYPE_FIELD_NUMBER = 3; + private io.prometheus.client.Metrics.MetricType type_; + /** + * optional .io.prometheus.client.MetricType type = 3; + */ + public boolean hasType() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .io.prometheus.client.MetricType type = 3; + */ + public io.prometheus.client.Metrics.MetricType getType() { + return type_; + } + + public static final int METRIC_FIELD_NUMBER = 4; + private java.util.List metric_; + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public java.util.List getMetricList() { + return metric_; + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public java.util.List + getMetricOrBuilderList() { + return metric_; + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public int getMetricCount() { + return metric_.size(); + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public io.prometheus.client.Metrics.Metric getMetric(int index) { + return metric_.get(index); + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public io.prometheus.client.Metrics.MetricOrBuilder getMetricOrBuilder( + int index) { + return metric_.get(index); + } + + private void initFields() { + name_ = ""; + help_ = ""; + type_ = io.prometheus.client.Metrics.MetricType.COUNTER; + metric_ = java.util.Collections.emptyList(); + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, getNameBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, getHelpBytes()); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeEnum(3, type_.getNumber()); + } + for (int i = 0; i < metric_.size(); i++) { + output.writeMessage(4, metric_.get(i)); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, getNameBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, getHelpBytes()); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(3, type_.getNumber()); + } + for (int i = 0; i < metric_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(4, metric_.get(i)); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static io.prometheus.client.Metrics.MetricFamily parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.MetricFamily parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.MetricFamily parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.prometheus.client.Metrics.MetricFamily parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.prometheus.client.Metrics.MetricFamily parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.MetricFamily parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.MetricFamily parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static io.prometheus.client.Metrics.MetricFamily parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static io.prometheus.client.Metrics.MetricFamily parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static io.prometheus.client.Metrics.MetricFamily parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(io.prometheus.client.Metrics.MetricFamily prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code io.prometheus.client.MetricFamily} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder implements + // @@protoc_insertion_point(builder_implements:io.prometheus.client.MetricFamily) + io.prometheus.client.Metrics.MetricFamilyOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_MetricFamily_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_MetricFamily_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.prometheus.client.Metrics.MetricFamily.class, io.prometheus.client.Metrics.MetricFamily.Builder.class); + } + + // Construct using io.prometheus.client.Metrics.MetricFamily.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + getMetricFieldBuilder(); + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + name_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + help_ = ""; + bitField0_ = (bitField0_ & ~0x00000002); + type_ = io.prometheus.client.Metrics.MetricType.COUNTER; + bitField0_ = (bitField0_ & ~0x00000004); + if (metricBuilder_ == null) { + metric_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000008); + } else { + metricBuilder_.clear(); + } + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return io.prometheus.client.Metrics.internal_static_io_prometheus_client_MetricFamily_descriptor; + } + + public io.prometheus.client.Metrics.MetricFamily getDefaultInstanceForType() { + return io.prometheus.client.Metrics.MetricFamily.getDefaultInstance(); + } + + public io.prometheus.client.Metrics.MetricFamily build() { + io.prometheus.client.Metrics.MetricFamily result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public io.prometheus.client.Metrics.MetricFamily buildPartial() { + io.prometheus.client.Metrics.MetricFamily result = new io.prometheus.client.Metrics.MetricFamily(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.name_ = name_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.help_ = help_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.type_ = type_; + if (metricBuilder_ == null) { + if (((bitField0_ & 0x00000008) == 0x00000008)) { + metric_ = java.util.Collections.unmodifiableList(metric_); + bitField0_ = (bitField0_ & ~0x00000008); + } + result.metric_ = metric_; + } else { + result.metric_ = metricBuilder_.build(); + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof io.prometheus.client.Metrics.MetricFamily) { + return mergeFrom((io.prometheus.client.Metrics.MetricFamily)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(io.prometheus.client.Metrics.MetricFamily other) { + if (other == io.prometheus.client.Metrics.MetricFamily.getDefaultInstance()) return this; + if (other.hasName()) { + bitField0_ |= 0x00000001; + name_ = other.name_; + onChanged(); + } + if (other.hasHelp()) { + bitField0_ |= 0x00000002; + help_ = other.help_; + onChanged(); + } + if (other.hasType()) { + setType(other.getType()); + } + if (metricBuilder_ == null) { + if (!other.metric_.isEmpty()) { + if (metric_.isEmpty()) { + metric_ = other.metric_; + bitField0_ = (bitField0_ & ~0x00000008); + } else { + ensureMetricIsMutable(); + metric_.addAll(other.metric_); + } + onChanged(); + } + } else { + if (!other.metric_.isEmpty()) { + if (metricBuilder_.isEmpty()) { + metricBuilder_.dispose(); + metricBuilder_ = null; + metric_ = other.metric_; + bitField0_ = (bitField0_ & ~0x00000008); + metricBuilder_ = + com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ? + getMetricFieldBuilder() : null; + } else { + metricBuilder_.addAllMessages(other.metric_); + } + } + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + io.prometheus.client.Metrics.MetricFamily parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (io.prometheus.client.Metrics.MetricFamily) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private java.lang.Object name_ = ""; + /** + * optional string name = 1; + */ + public boolean hasName() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string name = 1; + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + name_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * optional string name = 1; + */ + public com.google.protobuf.ByteString + getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string name = 1; + */ + public Builder setName( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + name_ = value; + onChanged(); + return this; + } + /** + * optional string name = 1; + */ + public Builder clearName() { + bitField0_ = (bitField0_ & ~0x00000001); + name_ = getDefaultInstance().getName(); + onChanged(); + return this; + } + /** + * optional string name = 1; + */ + public Builder setNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + name_ = value; + onChanged(); + return this; + } + + private java.lang.Object help_ = ""; + /** + * optional string help = 2; + */ + public boolean hasHelp() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string help = 2; + */ + public java.lang.String getHelp() { + java.lang.Object ref = help_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + help_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * optional string help = 2; + */ + public com.google.protobuf.ByteString + getHelpBytes() { + java.lang.Object ref = help_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + help_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string help = 2; + */ + public Builder setHelp( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + help_ = value; + onChanged(); + return this; + } + /** + * optional string help = 2; + */ + public Builder clearHelp() { + bitField0_ = (bitField0_ & ~0x00000002); + help_ = getDefaultInstance().getHelp(); + onChanged(); + return this; + } + /** + * optional string help = 2; + */ + public Builder setHelpBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + help_ = value; + onChanged(); + return this; + } + + private io.prometheus.client.Metrics.MetricType type_ = io.prometheus.client.Metrics.MetricType.COUNTER; + /** + * optional .io.prometheus.client.MetricType type = 3; + */ + public boolean hasType() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .io.prometheus.client.MetricType type = 3; + */ + public io.prometheus.client.Metrics.MetricType getType() { + return type_; + } + /** + * optional .io.prometheus.client.MetricType type = 3; + */ + public Builder setType(io.prometheus.client.Metrics.MetricType value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + type_ = value; + onChanged(); + return this; + } + /** + * optional .io.prometheus.client.MetricType type = 3; + */ + public Builder clearType() { + bitField0_ = (bitField0_ & ~0x00000004); + type_ = io.prometheus.client.Metrics.MetricType.COUNTER; + onChanged(); + return this; + } + + private java.util.List metric_ = + java.util.Collections.emptyList(); + private void ensureMetricIsMutable() { + if (!((bitField0_ & 0x00000008) == 0x00000008)) { + metric_ = new java.util.ArrayList(metric_); + bitField0_ |= 0x00000008; + } + } + + private com.google.protobuf.RepeatedFieldBuilder< + io.prometheus.client.Metrics.Metric, io.prometheus.client.Metrics.Metric.Builder, io.prometheus.client.Metrics.MetricOrBuilder> metricBuilder_; + + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public java.util.List getMetricList() { + if (metricBuilder_ == null) { + return java.util.Collections.unmodifiableList(metric_); + } else { + return metricBuilder_.getMessageList(); + } + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public int getMetricCount() { + if (metricBuilder_ == null) { + return metric_.size(); + } else { + return metricBuilder_.getCount(); + } + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public io.prometheus.client.Metrics.Metric getMetric(int index) { + if (metricBuilder_ == null) { + return metric_.get(index); + } else { + return metricBuilder_.getMessage(index); + } + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public Builder setMetric( + int index, io.prometheus.client.Metrics.Metric value) { + if (metricBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureMetricIsMutable(); + metric_.set(index, value); + onChanged(); + } else { + metricBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public Builder setMetric( + int index, io.prometheus.client.Metrics.Metric.Builder builderForValue) { + if (metricBuilder_ == null) { + ensureMetricIsMutable(); + metric_.set(index, builderForValue.build()); + onChanged(); + } else { + metricBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public Builder addMetric(io.prometheus.client.Metrics.Metric value) { + if (metricBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureMetricIsMutable(); + metric_.add(value); + onChanged(); + } else { + metricBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public Builder addMetric( + int index, io.prometheus.client.Metrics.Metric value) { + if (metricBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureMetricIsMutable(); + metric_.add(index, value); + onChanged(); + } else { + metricBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public Builder addMetric( + io.prometheus.client.Metrics.Metric.Builder builderForValue) { + if (metricBuilder_ == null) { + ensureMetricIsMutable(); + metric_.add(builderForValue.build()); + onChanged(); + } else { + metricBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public Builder addMetric( + int index, io.prometheus.client.Metrics.Metric.Builder builderForValue) { + if (metricBuilder_ == null) { + ensureMetricIsMutable(); + metric_.add(index, builderForValue.build()); + onChanged(); + } else { + metricBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public Builder addAllMetric( + java.lang.Iterable values) { + if (metricBuilder_ == null) { + ensureMetricIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, metric_); + onChanged(); + } else { + metricBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public Builder clearMetric() { + if (metricBuilder_ == null) { + metric_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000008); + onChanged(); + } else { + metricBuilder_.clear(); + } + return this; + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public Builder removeMetric(int index) { + if (metricBuilder_ == null) { + ensureMetricIsMutable(); + metric_.remove(index); + onChanged(); + } else { + metricBuilder_.remove(index); + } + return this; + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public io.prometheus.client.Metrics.Metric.Builder getMetricBuilder( + int index) { + return getMetricFieldBuilder().getBuilder(index); + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public io.prometheus.client.Metrics.MetricOrBuilder getMetricOrBuilder( + int index) { + if (metricBuilder_ == null) { + return metric_.get(index); } else { + return metricBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public java.util.List + getMetricOrBuilderList() { + if (metricBuilder_ != null) { + return metricBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(metric_); + } + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public io.prometheus.client.Metrics.Metric.Builder addMetricBuilder() { + return getMetricFieldBuilder().addBuilder( + io.prometheus.client.Metrics.Metric.getDefaultInstance()); + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public io.prometheus.client.Metrics.Metric.Builder addMetricBuilder( + int index) { + return getMetricFieldBuilder().addBuilder( + index, io.prometheus.client.Metrics.Metric.getDefaultInstance()); + } + /** + * repeated .io.prometheus.client.Metric metric = 4; + */ + public java.util.List + getMetricBuilderList() { + return getMetricFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilder< + io.prometheus.client.Metrics.Metric, io.prometheus.client.Metrics.Metric.Builder, io.prometheus.client.Metrics.MetricOrBuilder> + getMetricFieldBuilder() { + if (metricBuilder_ == null) { + metricBuilder_ = new com.google.protobuf.RepeatedFieldBuilder< + io.prometheus.client.Metrics.Metric, io.prometheus.client.Metrics.Metric.Builder, io.prometheus.client.Metrics.MetricOrBuilder>( + metric_, + ((bitField0_ & 0x00000008) == 0x00000008), + getParentForChildren(), + isClean()); + metric_ = null; + } + return metricBuilder_; + } + + // @@protoc_insertion_point(builder_scope:io.prometheus.client.MetricFamily) + } + + static { + defaultInstance = new MetricFamily(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:io.prometheus.client.MetricFamily) + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_io_prometheus_client_LabelPair_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_io_prometheus_client_LabelPair_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_io_prometheus_client_Gauge_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_io_prometheus_client_Gauge_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_io_prometheus_client_Counter_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_io_prometheus_client_Counter_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_io_prometheus_client_Quantile_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_io_prometheus_client_Quantile_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_io_prometheus_client_Summary_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_io_prometheus_client_Summary_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_io_prometheus_client_Untyped_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_io_prometheus_client_Untyped_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_io_prometheus_client_Histogram_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_io_prometheus_client_Histogram_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_io_prometheus_client_Bucket_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_io_prometheus_client_Bucket_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_io_prometheus_client_Metric_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_io_prometheus_client_Metric_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_io_prometheus_client_MetricFamily_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_io_prometheus_client_MetricFamily_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\rmetrics.proto\022\024io.prometheus.client\"(\n" + + "\tLabelPair\022\014\n\004name\030\001 \001(\t\022\r\n\005value\030\002 \001(\t\"" + + "\026\n\005Gauge\022\r\n\005value\030\001 \001(\001\"\030\n\007Counter\022\r\n\005va" + + "lue\030\001 \001(\001\"+\n\010Quantile\022\020\n\010quantile\030\001 \001(\001\022" + + "\r\n\005value\030\002 \001(\001\"e\n\007Summary\022\024\n\014sample_coun" + + "t\030\001 \001(\004\022\022\n\nsample_sum\030\002 \001(\001\0220\n\010quantile\030" + + "\003 \003(\0132\036.io.prometheus.client.Quantile\"\030\n" + + "\007Untyped\022\r\n\005value\030\001 \001(\001\"c\n\tHistogram\022\024\n\014" + + "sample_count\030\001 \001(\004\022\022\n\nsample_sum\030\002 \001(\001\022," + + "\n\006bucket\030\003 \003(\0132\034.io.prometheus.client.Bu", + "cket\"7\n\006Bucket\022\030\n\020cumulative_count\030\001 \001(\004" + + "\022\023\n\013upper_bound\030\002 \001(\001\"\276\002\n\006Metric\022.\n\005labe" + + "l\030\001 \003(\0132\037.io.prometheus.client.LabelPair" + + "\022*\n\005gauge\030\002 \001(\0132\033.io.prometheus.client.G" + + "auge\022.\n\007counter\030\003 \001(\0132\035.io.prometheus.cl" + + "ient.Counter\022.\n\007summary\030\004 \001(\0132\035.io.prome" + + "theus.client.Summary\022.\n\007untyped\030\005 \001(\0132\035." + + "io.prometheus.client.Untyped\0222\n\thistogra" + + "m\030\007 \001(\0132\037.io.prometheus.client.Histogram" + + "\022\024\n\014timestamp_ms\030\006 \001(\003\"\210\001\n\014MetricFamily\022", + "\014\n\004name\030\001 \001(\t\022\014\n\004help\030\002 \001(\t\022.\n\004type\030\003 \001(" + + "\0162 .io.prometheus.client.MetricType\022,\n\006m" + + "etric\030\004 \003(\0132\034.io.prometheus.client.Metri" + + "c*M\n\nMetricType\022\013\n\007COUNTER\020\000\022\t\n\005GAUGE\020\001\022" + + "\013\n\007SUMMARY\020\002\022\013\n\007UNTYPED\020\003\022\r\n\tHISTOGRAM\020\004" + + "B\026\n\024io.prometheus.client" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }, assigner); + internal_static_io_prometheus_client_LabelPair_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_io_prometheus_client_LabelPair_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_io_prometheus_client_LabelPair_descriptor, + new java.lang.String[] { "Name", "Value", }); + internal_static_io_prometheus_client_Gauge_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_io_prometheus_client_Gauge_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_io_prometheus_client_Gauge_descriptor, + new java.lang.String[] { "Value", }); + internal_static_io_prometheus_client_Counter_descriptor = + getDescriptor().getMessageTypes().get(2); + internal_static_io_prometheus_client_Counter_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_io_prometheus_client_Counter_descriptor, + new java.lang.String[] { "Value", }); + internal_static_io_prometheus_client_Quantile_descriptor = + getDescriptor().getMessageTypes().get(3); + internal_static_io_prometheus_client_Quantile_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_io_prometheus_client_Quantile_descriptor, + new java.lang.String[] { "Quantile", "Value", }); + internal_static_io_prometheus_client_Summary_descriptor = + getDescriptor().getMessageTypes().get(4); + internal_static_io_prometheus_client_Summary_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_io_prometheus_client_Summary_descriptor, + new java.lang.String[] { "SampleCount", "SampleSum", "Quantile", }); + internal_static_io_prometheus_client_Untyped_descriptor = + getDescriptor().getMessageTypes().get(5); + internal_static_io_prometheus_client_Untyped_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_io_prometheus_client_Untyped_descriptor, + new java.lang.String[] { "Value", }); + internal_static_io_prometheus_client_Histogram_descriptor = + getDescriptor().getMessageTypes().get(6); + internal_static_io_prometheus_client_Histogram_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_io_prometheus_client_Histogram_descriptor, + new java.lang.String[] { "SampleCount", "SampleSum", "Bucket", }); + internal_static_io_prometheus_client_Bucket_descriptor = + getDescriptor().getMessageTypes().get(7); + internal_static_io_prometheus_client_Bucket_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_io_prometheus_client_Bucket_descriptor, + new java.lang.String[] { "CumulativeCount", "UpperBound", }); + internal_static_io_prometheus_client_Metric_descriptor = + getDescriptor().getMessageTypes().get(8); + internal_static_io_prometheus_client_Metric_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_io_prometheus_client_Metric_descriptor, + new java.lang.String[] { "Label", "Gauge", "Counter", "Summary", "Untyped", "Histogram", "TimestampMs", }); + internal_static_io_prometheus_client_MetricFamily_descriptor = + getDescriptor().getMessageTypes().get(9); + internal_static_io_prometheus_client_MetricFamily_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_io_prometheus_client_MetricFamily_descriptor, + new java.lang.String[] { "Name", "Help", "Type", "Metric", }); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/.travis.yml b/example/prometheus-mock/vendor/github.com/prometheus/common/.travis.yml new file mode 100644 index 0000000..2fe8e9a --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/.travis.yml @@ -0,0 +1,6 @@ +sudo: false + +language: go +go: + - 1.7.5 + - tip diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/CONTRIBUTING.md b/example/prometheus-mock/vendor/github.com/prometheus/common/CONTRIBUTING.md new file mode 100644 index 0000000..40503ed --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/CONTRIBUTING.md @@ -0,0 +1,18 @@ +# Contributing + +Prometheus uses GitHub to manage reviews of pull requests. + +* If you have a trivial fix or improvement, go ahead and create a pull request, + addressing (with `@...`) the maintainer of this repository (see + [MAINTAINERS.md](MAINTAINERS.md)) in the description of the pull request. + +* If you plan to do something more involved, first discuss your ideas + on our [mailing list](https://groups.google.com/forum/?fromgroups#!forum/prometheus-developers). + This will avoid unnecessary work and surely give you and us a good deal + of inspiration. + +* Relevant coding style guidelines are the [Go Code Review + Comments](https://code.google.com/p/go-wiki/wiki/CodeReviewComments) + and the _Formatting and style_ section of Peter Bourgon's [Go: Best + Practices for Production + Environments](http://peter.bourgon.org/go-in-production/#formatting-and-style). diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/LICENSE b/example/prometheus-mock/vendor/github.com/prometheus/common/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/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 [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/example/prometheus-mock/vendor/github.com/prometheus/common/MAINTAINERS.md b/example/prometheus-mock/vendor/github.com/prometheus/common/MAINTAINERS.md new file mode 100644 index 0000000..1b31521 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/MAINTAINERS.md @@ -0,0 +1 @@ +* Fabian Reinartz diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/NOTICE b/example/prometheus-mock/vendor/github.com/prometheus/common/NOTICE new file mode 100644 index 0000000..636a2c1 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/NOTICE @@ -0,0 +1,5 @@ +Common libraries shared by Prometheus Go components. +Copyright 2015 The Prometheus Authors + +This product includes software developed at +SoundCloud Ltd. (http://soundcloud.com/). diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/README.md b/example/prometheus-mock/vendor/github.com/prometheus/common/README.md new file mode 100644 index 0000000..11a5849 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/README.md @@ -0,0 +1,12 @@ +# Common +[![Build Status](https://travis-ci.org/prometheus/common.svg)](https://travis-ci.org/prometheus/common) + +This repository contains Go libraries that are shared across Prometheus +components and libraries. + +* **config**: Common configuration structures +* **expfmt**: Decoding and encoding for the exposition format +* **log**: A logging wrapper around [logrus](https://github.com/sirupsen/logrus) +* **model**: Shared data structures +* **route**: A routing wrapper around [httprouter](https://github.com/julienschmidt/httprouter) using `context.Context` +* **version**: Version informations and metric diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/config/config.go b/example/prometheus-mock/vendor/github.com/prometheus/common/config/config.go new file mode 100644 index 0000000..9195c34 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/config/config.go @@ -0,0 +1,47 @@ +// Copyright 2016 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 config + +import ( + "fmt" + "strings" +) + +func checkOverflow(m map[string]interface{}, ctx string) error { + if len(m) > 0 { + var keys []string + for k := range m { + keys = append(keys, k) + } + return fmt.Errorf("unknown fields in %s: %s", ctx, strings.Join(keys, ", ")) + } + return nil +} + +// Secret special type for storing secrets. +type Secret string + +// MarshalYAML implements the yaml.Marshaler interface for Secrets. +func (s Secret) MarshalYAML() (interface{}, error) { + if s != "" { + return "", nil + } + return nil, nil +} + +//UnmarshalYAML implements the yaml.Unmarshaler interface for Secrets. +func (s *Secret) UnmarshalYAML(unmarshal func(interface{}) error) error { + type plain Secret + return unmarshal((*plain)(s)) +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/config/http_config.go b/example/prometheus-mock/vendor/github.com/prometheus/common/config/http_config.go new file mode 100644 index 0000000..ff5837f --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/config/http_config.go @@ -0,0 +1,279 @@ +// Copyright 2016 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 config + +import ( + "crypto/tls" + "crypto/x509" + "fmt" + "io/ioutil" + "net/http" + "net/url" + "strings" + + yaml "gopkg.in/yaml.v2" +) + +// BasicAuth contains basic HTTP authentication credentials. +type BasicAuth struct { + Username string `yaml:"username"` + Password Secret `yaml:"password"` + + // Catches all undefined fields and must be empty after parsing. + XXX map[string]interface{} `yaml:",inline"` +} + +// URL is a custom URL type that allows validation at configuration load time. +type URL struct { + *url.URL +} + +// UnmarshalYAML implements the yaml.Unmarshaler interface for URLs. +func (u *URL) UnmarshalYAML(unmarshal func(interface{}) error) error { + var s string + if err := unmarshal(&s); err != nil { + return err + } + + urlp, err := url.Parse(s) + if err != nil { + return err + } + u.URL = urlp + return nil +} + +// MarshalYAML implements the yaml.Marshaler interface for URLs. +func (u URL) MarshalYAML() (interface{}, error) { + if u.URL != nil { + return u.String(), nil + } + return nil, nil +} + +// HTTPClientConfig configures an HTTP client. +type HTTPClientConfig struct { + // The HTTP basic authentication credentials for the targets. + BasicAuth *BasicAuth `yaml:"basic_auth,omitempty"` + // The bearer token for the targets. + BearerToken Secret `yaml:"bearer_token,omitempty"` + // The bearer token file for the targets. + BearerTokenFile string `yaml:"bearer_token_file,omitempty"` + // HTTP proxy server to use to connect to the targets. + ProxyURL URL `yaml:"proxy_url,omitempty"` + // TLSConfig to use to connect to the targets. + TLSConfig TLSConfig `yaml:"tls_config,omitempty"` + + // Catches all undefined fields and must be empty after parsing. + XXX map[string]interface{} `yaml:",inline"` +} + +func (c *HTTPClientConfig) validate() error { + if len(c.BearerToken) > 0 && len(c.BearerTokenFile) > 0 { + return fmt.Errorf("at most one of bearer_token & bearer_token_file must be configured") + } + if c.BasicAuth != nil && (len(c.BearerToken) > 0 || len(c.BearerTokenFile) > 0) { + return fmt.Errorf("at most one of basic_auth, bearer_token & bearer_token_file must be configured") + } + return nil +} + +// UnmarshalYAML implements the yaml.Unmarshaler interface +func (c *HTTPClientConfig) UnmarshalYAML(unmarshal func(interface{}) error) error { + type plain HTTPClientConfig + err := unmarshal((*plain)(c)) + if err != nil { + return err + } + err = c.validate() + if err != nil { + return c.validate() + } + return checkOverflow(c.XXX, "http_client_config") +} + +// UnmarshalYAML implements the yaml.Unmarshaler interface. +func (a *BasicAuth) UnmarshalYAML(unmarshal func(interface{}) error) error { + type plain BasicAuth + err := unmarshal((*plain)(a)) + if err != nil { + return err + } + return checkOverflow(a.XXX, "basic_auth") +} + +// NewHTTPClientFromConfig returns a new HTTP client configured for the +// given config.HTTPClientConfig. +func NewHTTPClientFromConfig(cfg *HTTPClientConfig) (*http.Client, error) { + tlsConfig, err := NewTLSConfig(&cfg.TLSConfig) + if err != nil { + return nil, err + } + + // It's the caller's job to handle timeouts + var rt http.RoundTripper = &http.Transport{ + Proxy: http.ProxyURL(cfg.ProxyURL.URL), + DisableKeepAlives: true, + TLSClientConfig: tlsConfig, + } + + // If a bearer token is provided, create a round tripper that will set the + // Authorization header correctly on each request. + bearerToken := cfg.BearerToken + if len(bearerToken) == 0 && len(cfg.BearerTokenFile) > 0 { + b, err := ioutil.ReadFile(cfg.BearerTokenFile) + if err != nil { + return nil, fmt.Errorf("unable to read bearer token file %s: %s", cfg.BearerTokenFile, err) + } + bearerToken = Secret(strings.TrimSpace(string(b))) + } + + if len(bearerToken) > 0 { + rt = NewBearerAuthRoundTripper(bearerToken, rt) + } + + if cfg.BasicAuth != nil { + rt = NewBasicAuthRoundTripper(cfg.BasicAuth.Username, Secret(cfg.BasicAuth.Password), rt) + } + + // Return a new client with the configured round tripper. + return &http.Client{Transport: rt}, nil +} + +type bearerAuthRoundTripper struct { + bearerToken Secret + rt http.RoundTripper +} + +type basicAuthRoundTripper struct { + username string + password Secret + rt http.RoundTripper +} + +// NewBasicAuthRoundTripper will apply a BASIC auth authorization header to a request unless it has +// already been set. +func NewBasicAuthRoundTripper(username string, password Secret, rt http.RoundTripper) http.RoundTripper { + return &basicAuthRoundTripper{username, password, rt} +} + +func (rt *bearerAuthRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + if len(req.Header.Get("Authorization")) == 0 { + req = cloneRequest(req) + req.Header.Set("Authorization", "Bearer "+string(rt.bearerToken)) + } + + return rt.rt.RoundTrip(req) +} + +// NewBearerAuthRoundTripper adds the provided bearer token to a request unless the authorization +// header has already been set. +func NewBearerAuthRoundTripper(bearer Secret, rt http.RoundTripper) http.RoundTripper { + return &bearerAuthRoundTripper{bearer, rt} +} + +func (rt *basicAuthRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + if len(req.Header.Get("Authorization")) != 0 { + return rt.RoundTrip(req) + } + req = cloneRequest(req) + req.SetBasicAuth(rt.username, string(rt.password)) + return rt.rt.RoundTrip(req) +} + +// cloneRequest returns a clone of the provided *http.Request. +// The clone is a shallow copy of the struct and its Header map. +func cloneRequest(r *http.Request) *http.Request { + // Shallow copy of the struct. + r2 := new(http.Request) + *r2 = *r + // Deep copy of the Header. + r2.Header = make(http.Header) + for k, s := range r.Header { + r2.Header[k] = s + } + return r2 +} + +// NewTLSConfig creates a new tls.Config from the given config.TLSConfig. +func NewTLSConfig(cfg *TLSConfig) (*tls.Config, error) { + tlsConfig := &tls.Config{InsecureSkipVerify: cfg.InsecureSkipVerify} + + // If a CA cert is provided then let's read it in so we can validate the + // scrape target's certificate properly. + if len(cfg.CAFile) > 0 { + caCertPool := x509.NewCertPool() + // Load CA cert. + caCert, err := ioutil.ReadFile(cfg.CAFile) + if err != nil { + return nil, fmt.Errorf("unable to use specified CA cert %s: %s", cfg.CAFile, err) + } + caCertPool.AppendCertsFromPEM(caCert) + tlsConfig.RootCAs = caCertPool + } + + if len(cfg.ServerName) > 0 { + tlsConfig.ServerName = cfg.ServerName + } + + // If a client cert & key is provided then configure TLS config accordingly. + if len(cfg.CertFile) > 0 && len(cfg.KeyFile) == 0 { + return nil, fmt.Errorf("client cert file %q specified without client key file", cfg.CertFile) + } else if len(cfg.KeyFile) > 0 && len(cfg.CertFile) == 0 { + return nil, fmt.Errorf("client key file %q specified without client cert file", cfg.KeyFile) + } else if len(cfg.CertFile) > 0 && len(cfg.KeyFile) > 0 { + cert, err := tls.LoadX509KeyPair(cfg.CertFile, cfg.KeyFile) + if err != nil { + return nil, fmt.Errorf("unable to use specified client cert (%s) & key (%s): %s", cfg.CertFile, cfg.KeyFile, err) + } + tlsConfig.Certificates = []tls.Certificate{cert} + } + tlsConfig.BuildNameToCertificate() + + return tlsConfig, nil +} + +// TLSConfig configures the options for TLS connections. +type TLSConfig struct { + // The CA cert to use for the targets. + CAFile string `yaml:"ca_file,omitempty"` + // The client cert file for the targets. + CertFile string `yaml:"cert_file,omitempty"` + // The client key file for the targets. + KeyFile string `yaml:"key_file,omitempty"` + // Used to verify the hostname for the targets. + ServerName string `yaml:"server_name,omitempty"` + // Disable target certificate validation. + InsecureSkipVerify bool `yaml:"insecure_skip_verify"` + + // Catches all undefined fields and must be empty after parsing. + XXX map[string]interface{} `yaml:",inline"` +} + +// UnmarshalYAML implements the yaml.Unmarshaler interface. +func (c *TLSConfig) UnmarshalYAML(unmarshal func(interface{}) error) error { + type plain TLSConfig + if err := unmarshal((*plain)(c)); err != nil { + return err + } + return checkOverflow(c.XXX, "TLS config") +} + +func (c HTTPClientConfig) String() string { + b, err := yaml.Marshal(c) + if err != nil { + return fmt.Sprintf("", err) + } + return string(b) +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/config/http_config_test.go b/example/prometheus-mock/vendor/github.com/prometheus/common/config/http_config_test.go new file mode 100644 index 0000000..1e2490b --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/config/http_config_test.go @@ -0,0 +1,157 @@ +// Copyright 2015 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 config + +import ( + "io/ioutil" + "net/http" + "net/url" + "strings" + "testing" + + yaml "gopkg.in/yaml.v2" +) + +var invalidHTTPClientConfigs = []struct { + httpClientConfigFile string + errMsg string +}{ + { + httpClientConfigFile: "testdata/http.conf.bearer-token-and-file-set.bad.yml", + errMsg: "at most one of bearer_token & bearer_token_file must be configured", + }, + { + httpClientConfigFile: "testdata/http.conf.empty.bad.yml", + errMsg: "at most one of basic_auth, bearer_token & bearer_token_file must be configured", + }, +} + +func TestAuthRoundTrippers(t *testing.T) { + + cfg, _, err := LoadHTTPConfigFile("testdata/http.conf.good.yml") + if err != nil { + t.Errorf("Error loading HTTP client config: %v", err) + } + + tlsConfig, err := NewTLSConfig(&cfg.TLSConfig) + if err != nil { + t.Errorf("Error creating new TLS config: %v", err) + } + + rt := &http.Transport{ + Proxy: http.ProxyURL(cfg.ProxyURL.URL), + DisableKeepAlives: true, + TLSClientConfig: tlsConfig, + } + req := new(http.Request) + + bearerAuthRoundTripper := NewBearerAuthRoundTripper("mysecret", rt) + bearerAuthRoundTripper.RoundTrip(req) + + basicAuthRoundTripper := NewBasicAuthRoundTripper("username", "password", rt) + basicAuthRoundTripper.RoundTrip(req) +} + +func TestHideHTTPClientConfigSecrets(t *testing.T) { + c, _, err := LoadHTTPConfigFile("testdata/http.conf.good.yml") + if err != nil { + t.Errorf("Error parsing %s: %s", "testdata/http.conf.good.yml", err) + } + + // String method must not reveal authentication credentials. + s := c.String() + if strings.Contains(s, "mysecret") { + t.Fatal("http client config's String method reveals authentication credentials.") + } +} + +func mustParseURL(u string) *URL { + parsed, err := url.Parse(u) + if err != nil { + panic(err) + } + return &URL{URL: parsed} +} + +func TestNewClientFromConfig(t *testing.T) { + cfg, _, err := LoadHTTPConfigFile("testdata/http.conf.good.yml") + if err != nil { + t.Errorf("Error loading HTTP client config: %v", err) + } + _, err = NewHTTPClientFromConfig(cfg) + if err != nil { + t.Errorf("Error creating new client from config: %v", err) + } +} + +func TestNewClientFromInvalidConfig(t *testing.T) { + cfg, _, err := LoadHTTPConfigFile("testdata/http.conf.invalid-bearer-token-file.bad.yml") + if err != nil { + t.Errorf("Error loading HTTP client config: %v", err) + } + _, err = NewHTTPClientFromConfig(cfg) + if err == nil { + t.Error("Expected error creating new client from invalid config but got none") + } + if !strings.Contains(err.Error(), "unable to read bearer token file file: open file: no such file or directory") { + t.Errorf("Expected error with config but got: %s", err.Error()) + } +} + +func TestValidateHTTPConfig(t *testing.T) { + cfg, _, err := LoadHTTPConfigFile("testdata/http.conf.good.yml") + if err != nil { + t.Errorf("Error loading HTTP client config: %v", err) + } + err = cfg.validate() + if err != nil { + t.Fatalf("Error validating %s: %s", "testdata/http.conf.good.yml", err) + } +} + +func TestInvalidHTTPConfigs(t *testing.T) { + for _, ee := range invalidHTTPClientConfigs { + _, _, err := LoadHTTPConfigFile(ee.httpClientConfigFile) + if err == nil { + t.Error("Expected error with config but got none") + continue + } + if !strings.Contains(err.Error(), ee.errMsg) { + t.Errorf("Expected error for invalid HTTP client configuration to contain %q but got: %s", ee.errMsg, err) + } + } +} + +// LoadHTTPConfig parses the YAML input s into a HTTPClientConfig. +func LoadHTTPConfig(s string) (*HTTPClientConfig, error) { + cfg := &HTTPClientConfig{} + err := yaml.Unmarshal([]byte(s), cfg) + if err != nil { + return nil, err + } + return cfg, nil +} + +// LoadHTTPConfigFile parses the given YAML file into a HTTPClientConfig. +func LoadHTTPConfigFile(filename string) (*HTTPClientConfig, []byte, error) { + content, err := ioutil.ReadFile(filename) + if err != nil { + return nil, nil, err + } + cfg, err := LoadHTTPConfig(string(content)) + if err != nil { + return nil, nil, err + } + return cfg, content, nil +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/config/testdata/http.conf.bearer-token-and-file-set.bad.yml b/example/prometheus-mock/vendor/github.com/prometheus/common/config/testdata/http.conf.bearer-token-and-file-set.bad.yml new file mode 100644 index 0000000..c613bac --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/config/testdata/http.conf.bearer-token-and-file-set.bad.yml @@ -0,0 +1,5 @@ +basic_auth: + username: username + password: "mysecret" +bearer_token: mysecret +bearer_token_file: file diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/config/testdata/http.conf.empty.bad.yml b/example/prometheus-mock/vendor/github.com/prometheus/common/config/testdata/http.conf.empty.bad.yml new file mode 100644 index 0000000..ea2811f --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/config/testdata/http.conf.empty.bad.yml @@ -0,0 +1,4 @@ +basic_auth: + username: username + password: mysecret +bearer_token_file: file diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/config/testdata/http.conf.good.yml b/example/prometheus-mock/vendor/github.com/prometheus/common/config/testdata/http.conf.good.yml new file mode 100644 index 0000000..46ca639 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/config/testdata/http.conf.good.yml @@ -0,0 +1,4 @@ +basic_auth: + username: username + password: "mysecret" +proxy_url: "http://remote.host" diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/config/testdata/http.conf.invalid-bearer-token-file.bad.yml b/example/prometheus-mock/vendor/github.com/prometheus/common/config/testdata/http.conf.invalid-bearer-token-file.bad.yml new file mode 100644 index 0000000..4b1349b --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/config/testdata/http.conf.invalid-bearer-token-file.bad.yml @@ -0,0 +1 @@ +bearer_token_file: file diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/config/testdata/tls_config.cert_no_key.bad.yml b/example/prometheus-mock/vendor/github.com/prometheus/common/config/testdata/tls_config.cert_no_key.bad.yml new file mode 100644 index 0000000..7dfdc1e --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/config/testdata/tls_config.cert_no_key.bad.yml @@ -0,0 +1 @@ +cert_file: somefile diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/config/testdata/tls_config.empty.good.yml b/example/prometheus-mock/vendor/github.com/prometheus/common/config/testdata/tls_config.empty.good.yml new file mode 100644 index 0000000..e69de29 diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/config/testdata/tls_config.insecure.good.yml b/example/prometheus-mock/vendor/github.com/prometheus/common/config/testdata/tls_config.insecure.good.yml new file mode 100644 index 0000000..d054383 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/config/testdata/tls_config.insecure.good.yml @@ -0,0 +1 @@ +insecure_skip_verify: true diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/config/testdata/tls_config.invalid_field.bad.yml b/example/prometheus-mock/vendor/github.com/prometheus/common/config/testdata/tls_config.invalid_field.bad.yml new file mode 100644 index 0000000..12cbaac --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/config/testdata/tls_config.invalid_field.bad.yml @@ -0,0 +1 @@ +something_invalid: true diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/config/testdata/tls_config.key_no_cert.bad.yml b/example/prometheus-mock/vendor/github.com/prometheus/common/config/testdata/tls_config.key_no_cert.bad.yml new file mode 100644 index 0000000..cec045e --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/config/testdata/tls_config.key_no_cert.bad.yml @@ -0,0 +1 @@ +key_file: somefile diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/config/tls_config_test.go b/example/prometheus-mock/vendor/github.com/prometheus/common/config/tls_config_test.go new file mode 100644 index 0000000..e2bd68e --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/config/tls_config_test.go @@ -0,0 +1,92 @@ +// Copyright 2016 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 config + +import ( + "crypto/tls" + "io/ioutil" + "reflect" + "strings" + "testing" + + "gopkg.in/yaml.v2" +) + +// LoadTLSConfig parses the given YAML file into a tls.Config. +func LoadTLSConfig(filename string) (*tls.Config, error) { + content, err := ioutil.ReadFile(filename) + if err != nil { + return nil, err + } + cfg := &TLSConfig{} + if err = yaml.Unmarshal(content, cfg); err != nil { + return nil, err + } + return NewTLSConfig(cfg) +} + +var expectedTLSConfigs = []struct { + filename string + config *tls.Config +}{ + { + filename: "tls_config.empty.good.yml", + config: &tls.Config{}, + }, { + filename: "tls_config.insecure.good.yml", + config: &tls.Config{InsecureSkipVerify: true}, + }, +} + +func TestValidTLSConfig(t *testing.T) { + for _, cfg := range expectedTLSConfigs { + cfg.config.BuildNameToCertificate() + got, err := LoadTLSConfig("testdata/" + cfg.filename) + if err != nil { + t.Errorf("Error parsing %s: %s", cfg.filename, err) + } + if !reflect.DeepEqual(*got, *cfg.config) { + t.Fatalf("%v: unexpected config result: \n\n%v\n expected\n\n%v", cfg.filename, got, cfg.config) + } + } +} + +var expectedTLSConfigErrors = []struct { + filename string + errMsg string +}{ + { + filename: "tls_config.invalid_field.bad.yml", + errMsg: "unknown fields in", + }, { + filename: "tls_config.cert_no_key.bad.yml", + errMsg: "specified without client key file", + }, { + filename: "tls_config.key_no_cert.bad.yml", + errMsg: "specified without client cert file", + }, +} + +func TestBadTLSConfigs(t *testing.T) { + for _, ee := range expectedTLSConfigErrors { + _, err := LoadTLSConfig("testdata/" + ee.filename) + if err == nil { + t.Errorf("Expected error parsing %s but got none", ee.filename) + continue + } + if !strings.Contains(err.Error(), ee.errMsg) { + t.Errorf("Expected error for %s to contain %q but got: %s", ee.filename, ee.errMsg, err) + } + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/bench_test.go b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/bench_test.go new file mode 100644 index 0000000..e539bfc --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/bench_test.go @@ -0,0 +1,167 @@ +// Copyright 2015 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 expfmt + +import ( + "bytes" + "compress/gzip" + "io" + "io/ioutil" + "testing" + + "github.com/matttproud/golang_protobuf_extensions/pbutil" + + dto "github.com/prometheus/client_model/go" +) + +var parser TextParser + +// Benchmarks to show how much penalty text format parsing actually inflicts. +// +// Example results on Linux 3.13.0, Intel(R) Core(TM) i7-4700MQ CPU @ 2.40GHz, go1.4. +// +// BenchmarkParseText 1000 1188535 ns/op 205085 B/op 6135 allocs/op +// BenchmarkParseTextGzip 1000 1376567 ns/op 246224 B/op 6151 allocs/op +// BenchmarkParseProto 10000 172790 ns/op 52258 B/op 1160 allocs/op +// BenchmarkParseProtoGzip 5000 324021 ns/op 94931 B/op 1211 allocs/op +// BenchmarkParseProtoMap 10000 187946 ns/op 58714 B/op 1203 allocs/op +// +// CONCLUSION: The overhead for the map is negligible. Text format needs ~5x more allocations. +// Without compression, it needs ~7x longer, but with compression (the more relevant scenario), +// the difference becomes less relevant, only ~4x. +// +// The test data contains 248 samples. + +// BenchmarkParseText benchmarks the parsing of a text-format scrape into metric +// family DTOs. +func BenchmarkParseText(b *testing.B) { + b.StopTimer() + data, err := ioutil.ReadFile("testdata/text") + if err != nil { + b.Fatal(err) + } + b.StartTimer() + + for i := 0; i < b.N; i++ { + if _, err := parser.TextToMetricFamilies(bytes.NewReader(data)); err != nil { + b.Fatal(err) + } + } +} + +// BenchmarkParseTextGzip benchmarks the parsing of a gzipped text-format scrape +// into metric family DTOs. +func BenchmarkParseTextGzip(b *testing.B) { + b.StopTimer() + data, err := ioutil.ReadFile("testdata/text.gz") + if err != nil { + b.Fatal(err) + } + b.StartTimer() + + for i := 0; i < b.N; i++ { + in, err := gzip.NewReader(bytes.NewReader(data)) + if err != nil { + b.Fatal(err) + } + if _, err := parser.TextToMetricFamilies(in); err != nil { + b.Fatal(err) + } + } +} + +// BenchmarkParseProto benchmarks the parsing of a protobuf-format scrape into +// metric family DTOs. Note that this does not build a map of metric families +// (as the text version does), because it is not required for Prometheus +// ingestion either. (However, it is required for the text-format parsing, as +// the metric family might be sprinkled all over the text, while the +// protobuf-format guarantees bundling at one place.) +func BenchmarkParseProto(b *testing.B) { + b.StopTimer() + data, err := ioutil.ReadFile("testdata/protobuf") + if err != nil { + b.Fatal(err) + } + b.StartTimer() + + for i := 0; i < b.N; i++ { + family := &dto.MetricFamily{} + in := bytes.NewReader(data) + for { + family.Reset() + if _, err := pbutil.ReadDelimited(in, family); err != nil { + if err == io.EOF { + break + } + b.Fatal(err) + } + } + } +} + +// BenchmarkParseProtoGzip is like BenchmarkParseProto above, but parses gzipped +// protobuf format. +func BenchmarkParseProtoGzip(b *testing.B) { + b.StopTimer() + data, err := ioutil.ReadFile("testdata/protobuf.gz") + if err != nil { + b.Fatal(err) + } + b.StartTimer() + + for i := 0; i < b.N; i++ { + family := &dto.MetricFamily{} + in, err := gzip.NewReader(bytes.NewReader(data)) + if err != nil { + b.Fatal(err) + } + for { + family.Reset() + if _, err := pbutil.ReadDelimited(in, family); err != nil { + if err == io.EOF { + break + } + b.Fatal(err) + } + } + } +} + +// BenchmarkParseProtoMap is like BenchmarkParseProto but DOES put the parsed +// metric family DTOs into a map. This is not happening during Prometheus +// ingestion. It is just here to measure the overhead of that map creation and +// separate it from the overhead of the text format parsing. +func BenchmarkParseProtoMap(b *testing.B) { + b.StopTimer() + data, err := ioutil.ReadFile("testdata/protobuf") + if err != nil { + b.Fatal(err) + } + b.StartTimer() + + for i := 0; i < b.N; i++ { + families := map[string]*dto.MetricFamily{} + in := bytes.NewReader(data) + for { + family := &dto.MetricFamily{} + if _, err := pbutil.ReadDelimited(in, family); err != nil { + if err == io.EOF { + break + } + b.Fatal(err) + } + families[family.GetName()] = family + } + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/decode.go b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/decode.go new file mode 100644 index 0000000..a7a42d5 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/decode.go @@ -0,0 +1,429 @@ +// Copyright 2015 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 expfmt + +import ( + "fmt" + "io" + "math" + "mime" + "net/http" + + dto "github.com/prometheus/client_model/go" + + "github.com/matttproud/golang_protobuf_extensions/pbutil" + "github.com/prometheus/common/model" +) + +// Decoder types decode an input stream into metric families. +type Decoder interface { + Decode(*dto.MetricFamily) error +} + +// DecodeOptions contains options used by the Decoder and in sample extraction. +type DecodeOptions struct { + // Timestamp is added to each value from the stream that has no explicit timestamp set. + Timestamp model.Time +} + +// ResponseFormat extracts the correct format from a HTTP response header. +// If no matching format can be found FormatUnknown is returned. +func ResponseFormat(h http.Header) Format { + ct := h.Get(hdrContentType) + + mediatype, params, err := mime.ParseMediaType(ct) + if err != nil { + return FmtUnknown + } + + const textType = "text/plain" + + switch mediatype { + case ProtoType: + if p, ok := params["proto"]; ok && p != ProtoProtocol { + return FmtUnknown + } + if e, ok := params["encoding"]; ok && e != "delimited" { + return FmtUnknown + } + return FmtProtoDelim + + case textType: + if v, ok := params["version"]; ok && v != TextVersion { + return FmtUnknown + } + return FmtText + } + + return FmtUnknown +} + +// NewDecoder returns a new decoder based on the given input format. +// If the input format does not imply otherwise, a text format decoder is returned. +func NewDecoder(r io.Reader, format Format) Decoder { + switch format { + case FmtProtoDelim: + return &protoDecoder{r: r} + } + return &textDecoder{r: r} +} + +// protoDecoder implements the Decoder interface for protocol buffers. +type protoDecoder struct { + r io.Reader +} + +// Decode implements the Decoder interface. +func (d *protoDecoder) Decode(v *dto.MetricFamily) error { + _, err := pbutil.ReadDelimited(d.r, v) + if err != nil { + return err + } + if !model.IsValidMetricName(model.LabelValue(v.GetName())) { + return fmt.Errorf("invalid metric name %q", v.GetName()) + } + for _, m := range v.GetMetric() { + if m == nil { + continue + } + for _, l := range m.GetLabel() { + if l == nil { + continue + } + if !model.LabelValue(l.GetValue()).IsValid() { + return fmt.Errorf("invalid label value %q", l.GetValue()) + } + if !model.LabelName(l.GetName()).IsValid() { + return fmt.Errorf("invalid label name %q", l.GetName()) + } + } + } + return nil +} + +// textDecoder implements the Decoder interface for the text protocol. +type textDecoder struct { + r io.Reader + p TextParser + fams []*dto.MetricFamily +} + +// Decode implements the Decoder interface. +func (d *textDecoder) Decode(v *dto.MetricFamily) error { + // TODO(fabxc): Wrap this as a line reader to make streaming safer. + if len(d.fams) == 0 { + // No cached metric families, read everything and parse metrics. + fams, err := d.p.TextToMetricFamilies(d.r) + if err != nil { + return err + } + if len(fams) == 0 { + return io.EOF + } + d.fams = make([]*dto.MetricFamily, 0, len(fams)) + for _, f := range fams { + d.fams = append(d.fams, f) + } + } + + *v = *d.fams[0] + d.fams = d.fams[1:] + + return nil +} + +// SampleDecoder wraps a Decoder to extract samples from the metric families +// decoded by the wrapped Decoder. +type SampleDecoder struct { + Dec Decoder + Opts *DecodeOptions + + f dto.MetricFamily +} + +// Decode calls the Decode method of the wrapped Decoder and then extracts the +// samples from the decoded MetricFamily into the provided model.Vector. +func (sd *SampleDecoder) Decode(s *model.Vector) error { + err := sd.Dec.Decode(&sd.f) + if err != nil { + return err + } + *s, err = extractSamples(&sd.f, sd.Opts) + return err +} + +// ExtractSamples builds a slice of samples from the provided metric +// families. If an error occurs during sample extraction, it continues to +// extract from the remaining metric families. The returned error is the last +// error that has occured. +func ExtractSamples(o *DecodeOptions, fams ...*dto.MetricFamily) (model.Vector, error) { + var ( + all model.Vector + lastErr error + ) + for _, f := range fams { + some, err := extractSamples(f, o) + if err != nil { + lastErr = err + continue + } + all = append(all, some...) + } + return all, lastErr +} + +func extractSamples(f *dto.MetricFamily, o *DecodeOptions) (model.Vector, error) { + switch f.GetType() { + case dto.MetricType_COUNTER: + return extractCounter(o, f), nil + case dto.MetricType_GAUGE: + return extractGauge(o, f), nil + case dto.MetricType_SUMMARY: + return extractSummary(o, f), nil + case dto.MetricType_UNTYPED: + return extractUntyped(o, f), nil + case dto.MetricType_HISTOGRAM: + return extractHistogram(o, f), nil + } + return nil, fmt.Errorf("expfmt.extractSamples: unknown metric family type %v", f.GetType()) +} + +func extractCounter(o *DecodeOptions, f *dto.MetricFamily) model.Vector { + samples := make(model.Vector, 0, len(f.Metric)) + + for _, m := range f.Metric { + if m.Counter == nil { + continue + } + + lset := make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName()) + + smpl := &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Counter.GetValue()), + } + + if m.TimestampMs != nil { + smpl.Timestamp = model.TimeFromUnixNano(*m.TimestampMs * 1000000) + } else { + smpl.Timestamp = o.Timestamp + } + + samples = append(samples, smpl) + } + + return samples +} + +func extractGauge(o *DecodeOptions, f *dto.MetricFamily) model.Vector { + samples := make(model.Vector, 0, len(f.Metric)) + + for _, m := range f.Metric { + if m.Gauge == nil { + continue + } + + lset := make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName()) + + smpl := &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Gauge.GetValue()), + } + + if m.TimestampMs != nil { + smpl.Timestamp = model.TimeFromUnixNano(*m.TimestampMs * 1000000) + } else { + smpl.Timestamp = o.Timestamp + } + + samples = append(samples, smpl) + } + + return samples +} + +func extractUntyped(o *DecodeOptions, f *dto.MetricFamily) model.Vector { + samples := make(model.Vector, 0, len(f.Metric)) + + for _, m := range f.Metric { + if m.Untyped == nil { + continue + } + + lset := make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName()) + + smpl := &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Untyped.GetValue()), + } + + if m.TimestampMs != nil { + smpl.Timestamp = model.TimeFromUnixNano(*m.TimestampMs * 1000000) + } else { + smpl.Timestamp = o.Timestamp + } + + samples = append(samples, smpl) + } + + return samples +} + +func extractSummary(o *DecodeOptions, f *dto.MetricFamily) model.Vector { + samples := make(model.Vector, 0, len(f.Metric)) + + for _, m := range f.Metric { + if m.Summary == nil { + continue + } + + timestamp := o.Timestamp + if m.TimestampMs != nil { + timestamp = model.TimeFromUnixNano(*m.TimestampMs * 1000000) + } + + for _, q := range m.Summary.Quantile { + lset := make(model.LabelSet, len(m.Label)+2) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + // BUG(matt): Update other names to "quantile". + lset[model.LabelName(model.QuantileLabel)] = model.LabelValue(fmt.Sprint(q.GetQuantile())) + lset[model.MetricNameLabel] = model.LabelValue(f.GetName()) + + samples = append(samples, &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(q.GetValue()), + Timestamp: timestamp, + }) + } + + lset := make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName() + "_sum") + + samples = append(samples, &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Summary.GetSampleSum()), + Timestamp: timestamp, + }) + + lset = make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName() + "_count") + + samples = append(samples, &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Summary.GetSampleCount()), + Timestamp: timestamp, + }) + } + + return samples +} + +func extractHistogram(o *DecodeOptions, f *dto.MetricFamily) model.Vector { + samples := make(model.Vector, 0, len(f.Metric)) + + for _, m := range f.Metric { + if m.Histogram == nil { + continue + } + + timestamp := o.Timestamp + if m.TimestampMs != nil { + timestamp = model.TimeFromUnixNano(*m.TimestampMs * 1000000) + } + + infSeen := false + + for _, q := range m.Histogram.Bucket { + lset := make(model.LabelSet, len(m.Label)+2) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.LabelName(model.BucketLabel)] = model.LabelValue(fmt.Sprint(q.GetUpperBound())) + lset[model.MetricNameLabel] = model.LabelValue(f.GetName() + "_bucket") + + if math.IsInf(q.GetUpperBound(), +1) { + infSeen = true + } + + samples = append(samples, &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(q.GetCumulativeCount()), + Timestamp: timestamp, + }) + } + + lset := make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName() + "_sum") + + samples = append(samples, &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Histogram.GetSampleSum()), + Timestamp: timestamp, + }) + + lset = make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName() + "_count") + + count := &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Histogram.GetSampleCount()), + Timestamp: timestamp, + } + samples = append(samples, count) + + if !infSeen { + // Append an infinity bucket sample. + lset := make(model.LabelSet, len(m.Label)+2) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.LabelName(model.BucketLabel)] = model.LabelValue("+Inf") + lset[model.MetricNameLabel] = model.LabelValue(f.GetName() + "_bucket") + + samples = append(samples, &model.Sample{ + Metric: model.Metric(lset), + Value: count.Value, + Timestamp: timestamp, + }) + } + } + + return samples +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/decode_test.go b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/decode_test.go new file mode 100644 index 0000000..82c1130 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/decode_test.go @@ -0,0 +1,435 @@ +// Copyright 2015 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 expfmt + +import ( + "io" + "net/http" + "reflect" + "sort" + "strings" + "testing" + + "github.com/golang/protobuf/proto" + dto "github.com/prometheus/client_model/go" + + "github.com/prometheus/common/model" +) + +func TestTextDecoder(t *testing.T) { + var ( + ts = model.Now() + in = ` +# Only a quite simple scenario with two metric families. +# More complicated tests of the parser itself can be found in the text package. +# TYPE mf2 counter +mf2 3 +mf1{label="value1"} -3.14 123456 +mf1{label="value2"} 42 +mf2 4 +` + out = model.Vector{ + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "mf1", + "label": "value1", + }, + Value: -3.14, + Timestamp: 123456, + }, + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "mf1", + "label": "value2", + }, + Value: 42, + Timestamp: ts, + }, + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "mf2", + }, + Value: 3, + Timestamp: ts, + }, + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "mf2", + }, + Value: 4, + Timestamp: ts, + }, + } + ) + + dec := &SampleDecoder{ + Dec: &textDecoder{r: strings.NewReader(in)}, + Opts: &DecodeOptions{ + Timestamp: ts, + }, + } + var all model.Vector + for { + var smpls model.Vector + err := dec.Decode(&smpls) + if err == io.EOF { + break + } + if err != nil { + t.Fatal(err) + } + all = append(all, smpls...) + } + sort.Sort(all) + sort.Sort(out) + if !reflect.DeepEqual(all, out) { + t.Fatalf("output does not match") + } +} + +func TestProtoDecoder(t *testing.T) { + + var testTime = model.Now() + + scenarios := []struct { + in string + expected model.Vector + fail bool + }{ + { + in: "", + }, + { + in: "\x8f\x01\n\rrequest_count\x12\x12Number of requests\x18\x00\"0\n#\n\x0fsome_!abel_name\x12\x10some_label_value\x1a\t\t\x00\x00\x00\x00\x00\x00E\xc0\"6\n)\n\x12another_label_name\x12\x13another_label_value\x1a\t\t\x00\x00\x00\x00\x00\x00U@", + fail: true, + }, + { + in: "\x8f\x01\n\rrequest_count\x12\x12Number of requests\x18\x00\"0\n#\n\x0fsome_label_name\x12\x10some_label_value\x1a\t\t\x00\x00\x00\x00\x00\x00E\xc0\"6\n)\n\x12another_label_name\x12\x13another_label_value\x1a\t\t\x00\x00\x00\x00\x00\x00U@", + expected: model.Vector{ + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "request_count", + "some_label_name": "some_label_value", + }, + Value: -42, + Timestamp: testTime, + }, + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "request_count", + "another_label_name": "another_label_value", + }, + Value: 84, + Timestamp: testTime, + }, + }, + }, + { + in: "\xb9\x01\n\rrequest_count\x12\x12Number of requests\x18\x02\"O\n#\n\x0fsome_label_name\x12\x10some_label_value\"(\x1a\x12\t\xaeG\xe1z\x14\xae\xef?\x11\x00\x00\x00\x00\x00\x00E\xc0\x1a\x12\t+\x87\x16\xd9\xce\xf7\xef?\x11\x00\x00\x00\x00\x00\x00U\xc0\"A\n)\n\x12another_label_name\x12\x13another_label_value\"\x14\x1a\x12\t\x00\x00\x00\x00\x00\x00\xe0?\x11\x00\x00\x00\x00\x00\x00$@", + expected: model.Vector{ + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "request_count_count", + "some_label_name": "some_label_value", + }, + Value: 0, + Timestamp: testTime, + }, + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "request_count_sum", + "some_label_name": "some_label_value", + }, + Value: 0, + Timestamp: testTime, + }, + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "request_count", + "some_label_name": "some_label_value", + "quantile": "0.99", + }, + Value: -42, + Timestamp: testTime, + }, + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "request_count", + "some_label_name": "some_label_value", + "quantile": "0.999", + }, + Value: -84, + Timestamp: testTime, + }, + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "request_count_count", + "another_label_name": "another_label_value", + }, + Value: 0, + Timestamp: testTime, + }, + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "request_count_sum", + "another_label_name": "another_label_value", + }, + Value: 0, + Timestamp: testTime, + }, + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "request_count", + "another_label_name": "another_label_value", + "quantile": "0.5", + }, + Value: 10, + Timestamp: testTime, + }, + }, + }, + { + in: "\x8d\x01\n\x1drequest_duration_microseconds\x12\x15The response latency.\x18\x04\"S:Q\b\x85\x15\x11\xcd\xcc\xccL\x8f\xcb:A\x1a\v\b{\x11\x00\x00\x00\x00\x00\x00Y@\x1a\f\b\x9c\x03\x11\x00\x00\x00\x00\x00\x00^@\x1a\f\b\xd0\x04\x11\x00\x00\x00\x00\x00\x00b@\x1a\f\b\xf4\v\x11\x9a\x99\x99\x99\x99\x99e@\x1a\f\b\x85\x15\x11\x00\x00\x00\x00\x00\x00\xf0\u007f", + expected: model.Vector{ + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "request_duration_microseconds_bucket", + "le": "100", + }, + Value: 123, + Timestamp: testTime, + }, + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "request_duration_microseconds_bucket", + "le": "120", + }, + Value: 412, + Timestamp: testTime, + }, + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "request_duration_microseconds_bucket", + "le": "144", + }, + Value: 592, + Timestamp: testTime, + }, + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "request_duration_microseconds_bucket", + "le": "172.8", + }, + Value: 1524, + Timestamp: testTime, + }, + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "request_duration_microseconds_bucket", + "le": "+Inf", + }, + Value: 2693, + Timestamp: testTime, + }, + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "request_duration_microseconds_sum", + }, + Value: 1756047.3, + Timestamp: testTime, + }, + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "request_duration_microseconds_count", + }, + Value: 2693, + Timestamp: testTime, + }, + }, + }, + { + // The metric type is unset in this protobuf, which needs to be handled + // correctly by the decoder. + in: "\x1c\n\rrequest_count\"\v\x1a\t\t\x00\x00\x00\x00\x00\x00\xf0?", + expected: model.Vector{ + &model.Sample{ + Metric: model.Metric{ + model.MetricNameLabel: "request_count", + }, + Value: 1, + Timestamp: testTime, + }, + }, + }, + } + + for i, scenario := range scenarios { + dec := &SampleDecoder{ + Dec: &protoDecoder{r: strings.NewReader(scenario.in)}, + Opts: &DecodeOptions{ + Timestamp: testTime, + }, + } + + var all model.Vector + for { + var smpls model.Vector + err := dec.Decode(&smpls) + if err == io.EOF { + break + } + if scenario.fail { + if err == nil { + t.Fatal("Expected error but got none") + } + break + } + if err != nil { + t.Fatal(err) + } + all = append(all, smpls...) + } + sort.Sort(all) + sort.Sort(scenario.expected) + if !reflect.DeepEqual(all, scenario.expected) { + t.Fatalf("%d. output does not match, want: %#v, got %#v", i, scenario.expected, all) + } + } +} + +func testDiscriminatorHTTPHeader(t testing.TB) { + var scenarios = []struct { + input map[string]string + output Format + err error + }{ + { + input: map[string]string{"Content-Type": `application/vnd.google.protobuf; proto="io.prometheus.client.MetricFamily"; encoding="delimited"`}, + output: FmtProtoDelim, + }, + { + input: map[string]string{"Content-Type": `application/vnd.google.protobuf; proto="illegal"; encoding="delimited"`}, + output: FmtUnknown, + }, + { + input: map[string]string{"Content-Type": `application/vnd.google.protobuf; proto="io.prometheus.client.MetricFamily"; encoding="illegal"`}, + output: FmtUnknown, + }, + { + input: map[string]string{"Content-Type": `text/plain; version=0.0.4`}, + output: FmtText, + }, + { + input: map[string]string{"Content-Type": `text/plain`}, + output: FmtText, + }, + { + input: map[string]string{"Content-Type": `text/plain; version=0.0.3`}, + output: FmtUnknown, + }, + } + + for i, scenario := range scenarios { + var header http.Header + + if len(scenario.input) > 0 { + header = http.Header{} + } + + for key, value := range scenario.input { + header.Add(key, value) + } + + actual := ResponseFormat(header) + + if scenario.output != actual { + t.Errorf("%d. expected %s, got %s", i, scenario.output, actual) + } + } +} + +func TestDiscriminatorHTTPHeader(t *testing.T) { + testDiscriminatorHTTPHeader(t) +} + +func BenchmarkDiscriminatorHTTPHeader(b *testing.B) { + for i := 0; i < b.N; i++ { + testDiscriminatorHTTPHeader(b) + } +} + +func TestExtractSamples(t *testing.T) { + var ( + goodMetricFamily1 = &dto.MetricFamily{ + Name: proto.String("foo"), + Help: proto.String("Help for foo."), + Type: dto.MetricType_COUNTER.Enum(), + Metric: []*dto.Metric{ + &dto.Metric{ + Counter: &dto.Counter{ + Value: proto.Float64(4711), + }, + }, + }, + } + goodMetricFamily2 = &dto.MetricFamily{ + Name: proto.String("bar"), + Help: proto.String("Help for bar."), + Type: dto.MetricType_GAUGE.Enum(), + Metric: []*dto.Metric{ + &dto.Metric{ + Gauge: &dto.Gauge{ + Value: proto.Float64(3.14), + }, + }, + }, + } + badMetricFamily = &dto.MetricFamily{ + Name: proto.String("bad"), + Help: proto.String("Help for bad."), + Type: dto.MetricType(42).Enum(), + Metric: []*dto.Metric{ + &dto.Metric{ + Gauge: &dto.Gauge{ + Value: proto.Float64(2.7), + }, + }, + }, + } + + opts = &DecodeOptions{ + Timestamp: 42, + } + ) + + got, err := ExtractSamples(opts, goodMetricFamily1, goodMetricFamily2) + if err != nil { + t.Error("Unexpected error from ExtractSamples:", err) + } + want := model.Vector{ + &model.Sample{Metric: model.Metric{model.MetricNameLabel: "foo"}, Value: 4711, Timestamp: 42}, + &model.Sample{Metric: model.Metric{model.MetricNameLabel: "bar"}, Value: 3.14, Timestamp: 42}, + } + if !reflect.DeepEqual(got, want) { + t.Errorf("unexpected samples extracted, got: %v, want: %v", got, want) + } + + got, err = ExtractSamples(opts, goodMetricFamily1, badMetricFamily, goodMetricFamily2) + if err == nil { + t.Error("Expected error from ExtractSamples") + } + if !reflect.DeepEqual(got, want) { + t.Errorf("unexpected samples extracted, got: %v, want: %v", got, want) + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/encode.go b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/encode.go new file mode 100644 index 0000000..11839ed --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/encode.go @@ -0,0 +1,88 @@ +// Copyright 2015 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 expfmt + +import ( + "fmt" + "io" + "net/http" + + "github.com/golang/protobuf/proto" + "github.com/matttproud/golang_protobuf_extensions/pbutil" + "github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg" + + dto "github.com/prometheus/client_model/go" +) + +// Encoder types encode metric families into an underlying wire protocol. +type Encoder interface { + Encode(*dto.MetricFamily) error +} + +type encoder func(*dto.MetricFamily) error + +func (e encoder) Encode(v *dto.MetricFamily) error { + return e(v) +} + +// Negotiate returns the Content-Type based on the given Accept header. +// If no appropriate accepted type is found, FmtText is returned. +func Negotiate(h http.Header) Format { + for _, ac := range goautoneg.ParseAccept(h.Get(hdrAccept)) { + // Check for protocol buffer + if ac.Type+"/"+ac.SubType == ProtoType && ac.Params["proto"] == ProtoProtocol { + switch ac.Params["encoding"] { + case "delimited": + return FmtProtoDelim + case "text": + return FmtProtoText + case "compact-text": + return FmtProtoCompact + } + } + // Check for text format. + ver := ac.Params["version"] + if ac.Type == "text" && ac.SubType == "plain" && (ver == TextVersion || ver == "") { + return FmtText + } + } + return FmtText +} + +// NewEncoder returns a new encoder based on content type negotiation. +func NewEncoder(w io.Writer, format Format) Encoder { + switch format { + case FmtProtoDelim: + return encoder(func(v *dto.MetricFamily) error { + _, err := pbutil.WriteDelimited(w, v) + return err + }) + case FmtProtoCompact: + return encoder(func(v *dto.MetricFamily) error { + _, err := fmt.Fprintln(w, v.String()) + return err + }) + case FmtProtoText: + return encoder(func(v *dto.MetricFamily) error { + _, err := fmt.Fprintln(w, proto.MarshalTextString(v)) + return err + }) + case FmtText: + return encoder(func(v *dto.MetricFamily) error { + _, err := MetricFamilyToText(w, v) + return err + }) + } + panic("expfmt.NewEncoder: unknown format") +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/expfmt.go b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/expfmt.go new file mode 100644 index 0000000..371ac75 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/expfmt.go @@ -0,0 +1,38 @@ +// Copyright 2015 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 expfmt contains tools for reading and writing Prometheus metrics. +package expfmt + +// Format specifies the HTTP content type of the different wire protocols. +type Format string + +// Constants to assemble the Content-Type values for the different wire protocols. +const ( + TextVersion = "0.0.4" + ProtoType = `application/vnd.google.protobuf` + ProtoProtocol = `io.prometheus.client.MetricFamily` + ProtoFmt = ProtoType + "; proto=" + ProtoProtocol + ";" + + // The Content-Type values for the different wire protocols. + FmtUnknown Format = `` + FmtText Format = `text/plain; version=` + TextVersion + FmtProtoDelim Format = ProtoFmt + ` encoding=delimited` + FmtProtoText Format = ProtoFmt + ` encoding=text` + FmtProtoCompact Format = ProtoFmt + ` encoding=compact-text` +) + +const ( + hdrContentType = "Content-Type" + hdrAccept = "Accept" +) diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz.go b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz.go new file mode 100644 index 0000000..dc2eede --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz.go @@ -0,0 +1,36 @@ +// Copyright 2014 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. + +// Build only when actually fuzzing +// +build gofuzz + +package expfmt + +import "bytes" + +// Fuzz text metric parser with with github.com/dvyukov/go-fuzz: +// +// go-fuzz-build github.com/prometheus/common/expfmt +// go-fuzz -bin expfmt-fuzz.zip -workdir fuzz +// +// Further input samples should go in the folder fuzz/corpus. +func Fuzz(in []byte) int { + parser := TextParser{} + _, err := parser.TextToMetricFamilies(bytes.NewReader(in)) + + if err != nil { + return 0 + } + + return 1 +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_0 b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_0 new file mode 100644 index 0000000..139597f --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_0 @@ -0,0 +1,2 @@ + + diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_1 b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_1 new file mode 100644 index 0000000..2ae8706 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_1 @@ -0,0 +1,6 @@ + +minimal_metric 1.234 +another_metric -3e3 103948 +# Even that: +no_labels{} 3 +# HELP line for non-existing metric will be ignored. diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_2 b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_2 new file mode 100644 index 0000000..5c351db --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_2 @@ -0,0 +1,12 @@ + +# A normal comment. +# +# TYPE name counter +name{labelname="val1",basename="basevalue"} NaN +name {labelname="val2",basename="base\"v\\al\nue"} 0.23 1234567890 +# HELP name two-line\n doc str\\ing + + # HELP name2 doc str"ing 2 + # TYPE name2 gauge +name2{labelname="val2" ,basename = "basevalue2" } +Inf 54321 +name2{ labelname = "val1" , }-Inf diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_3 b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_3 new file mode 100644 index 0000000..0b3c345 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_3 @@ -0,0 +1,22 @@ + +# TYPE my_summary summary +my_summary{n1="val1",quantile="0.5"} 110 +decoy -1 -2 +my_summary{n1="val1",quantile="0.9"} 140 1 +my_summary_count{n1="val1"} 42 +# Latest timestamp wins in case of a summary. +my_summary_sum{n1="val1"} 4711 2 +fake_sum{n1="val1"} 2001 +# TYPE another_summary summary +another_summary_count{n2="val2",n1="val1"} 20 +my_summary_count{n2="val2",n1="val1"} 5 5 +another_summary{n1="val1",n2="val2",quantile=".3"} -1.2 +my_summary_sum{n1="val2"} 08 15 +my_summary{n1="val3", quantile="0.2"} 4711 + my_summary{n1="val1",n2="val2",quantile="-12.34",} NaN +# some +# funny comments +# HELP +# HELP +# HELP my_summary +# HELP my_summary diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_4 b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_4 new file mode 100644 index 0000000..bde0a38 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_4 @@ -0,0 +1,10 @@ + +# HELP request_duration_microseconds The response latency. +# TYPE request_duration_microseconds histogram +request_duration_microseconds_bucket{le="100"} 123 +request_duration_microseconds_bucket{le="120"} 412 +request_duration_microseconds_bucket{le="144"} 592 +request_duration_microseconds_bucket{le="172.8"} 1524 +request_duration_microseconds_bucket{le="+Inf"} 2693 +request_duration_microseconds_sum 1.7560473e+06 +request_duration_microseconds_count 2693 diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_0 b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_0 new file mode 100644 index 0000000..4c67f9a --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_0 @@ -0,0 +1 @@ +bla 3.14 \ No newline at end of file diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_1 b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_1 new file mode 100644 index 0000000..b853478 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_1 @@ -0,0 +1 @@ +metric{label="\t"} 3.14 \ No newline at end of file diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_10 b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_10 new file mode 100644 index 0000000..b5fe5f5 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_10 @@ -0,0 +1 @@ +metric{label="bla"} 3.14 2 3 diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_11 b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_11 new file mode 100644 index 0000000..57c7fbc --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_11 @@ -0,0 +1 @@ +metric{label="bla"} blubb diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_12 b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_12 new file mode 100644 index 0000000..0a9df79 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_12 @@ -0,0 +1,3 @@ + +# HELP metric one +# HELP metric two diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_13 b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_13 new file mode 100644 index 0000000..5bc7427 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_13 @@ -0,0 +1,3 @@ + +# TYPE metric counter +# TYPE metric untyped diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_14 b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_14 new file mode 100644 index 0000000..a9a2426 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_14 @@ -0,0 +1,3 @@ + +metric 4.12 +# TYPE metric counter diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_15 b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_15 new file mode 100644 index 0000000..7e95ca8 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_15 @@ -0,0 +1,2 @@ + +# TYPE metric bla diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_16 b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_16 new file mode 100644 index 0000000..7825f88 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_16 @@ -0,0 +1,2 @@ + +# TYPE met-ric diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_17 b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_17 new file mode 100644 index 0000000..8f35cae --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_17 @@ -0,0 +1 @@ +@invalidmetric{label="bla"} 3.14 2 \ No newline at end of file diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_18 b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_18 new file mode 100644 index 0000000..7ca2cc2 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_18 @@ -0,0 +1 @@ +{label="bla"} 3.14 2 \ No newline at end of file diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_19 b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_19 new file mode 100644 index 0000000..7a6ccc0 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_19 @@ -0,0 +1,3 @@ + +# TYPE metric histogram +metric_bucket{le="bla"} 3.14 diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_2 b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_2 new file mode 100644 index 0000000..726d001 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_2 @@ -0,0 +1,3 @@ + +metric{label="new +line"} 3.14 diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_3 b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_3 new file mode 100644 index 0000000..6aa9e30 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_3 @@ -0,0 +1 @@ +metric{@="bla"} 3.14 \ No newline at end of file diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_4 b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_4 new file mode 100644 index 0000000..d112cb9 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_4 @@ -0,0 +1 @@ +metric{__name__="bla"} 3.14 \ No newline at end of file diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_5 b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_5 new file mode 100644 index 0000000..b34554a --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_5 @@ -0,0 +1 @@ +metric{label+="bla"} 3.14 \ No newline at end of file diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_6 b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_6 new file mode 100644 index 0000000..c4d7df3 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_6 @@ -0,0 +1 @@ +metric{label=bla} 3.14 \ No newline at end of file diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_7 b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_7 new file mode 100644 index 0000000..97eafc4 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_7 @@ -0,0 +1,3 @@ + +# TYPE metric summary +metric{quantile="bla"} 3.14 diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_8 b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_8 new file mode 100644 index 0000000..fc70649 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_8 @@ -0,0 +1 @@ +metric{label="bla"+} 3.14 \ No newline at end of file diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_9 b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_9 new file mode 100644 index 0000000..57b4879 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_9 @@ -0,0 +1 @@ +metric{label="bla"} 3.14 2.72 diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/minimal b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/minimal new file mode 100644 index 0000000..be1e6a3 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/fuzz/corpus/minimal @@ -0,0 +1 @@ +m{} 0 diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/testdata/json2 b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/testdata/json2 new file mode 100644 index 0000000..b914c93 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/testdata/json2 @@ -0,0 +1,46 @@ +[ + { + "baseLabels": { + "__name__": "rpc_calls_total", + "job": "batch_job" + }, + "docstring": "RPC calls.", + "metric": { + "type": "counter", + "value": [ + { + "labels": { + "service": "zed" + }, + "value": 25 + }, + { + "labels": { + "service": "bar" + }, + "value": 24 + } + ] + } + }, + { + "baseLabels": { + "__name__": "rpc_latency_microseconds" + }, + "docstring": "RPC latency.", + "metric": { + "type": "histogram", + "value": [ + { + "labels": { + "service": "foo" + }, + "value": { + "0.010000": 15, + "0.990000": 17 + } + } + ] + } + } +] diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/testdata/json2_bad b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/testdata/json2_bad new file mode 100644 index 0000000..cc6ac97 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/testdata/json2_bad @@ -0,0 +1,46 @@ +[ + { + "baseLabels": { + "__name__": "rpc_calls_total", + "job": "batch_job" + }, + "docstring": "RPC calls.", + "metric": { + "type": "counter", + "value": [ + { + "labels": { + "servic|e": "zed" + }, + "value": 25 + }, + { + "labels": { + "service": "bar" + }, + "value": 24 + } + ] + } + }, + { + "baseLabels": { + "__name__": "rpc_latency_microseconds" + }, + "docstring": "RPC latency.", + "metric": { + "type": "histogram", + "value": [ + { + "labels": { + "service": "foo" + }, + "value": { + "0.010000": 15, + "0.990000": 17 + } + } + ] + } + } +] diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/testdata/protobuf b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/testdata/protobuf new file mode 100644 index 0000000000000000000000000000000000000000..b2d018a7c1e3687e4fa1e149808beb95a048b907 GIT binary patch literal 8239 zcmeHMO^h5z74F&f&urOoyd4LxH?}Fa6=&^uXV!rbfk?Jj4oWb=BzQ?cIJA4aYi1hH zbhoRjvpXgS6Cxp`pacmC@vBIH00~(>a>IfgIDkMxfIvcWgoJV+!ioeZ4!ruC?wXzT zuA&iKb`O@Ps=D5*_g;PPy|11^hjW@mgt6d-gz_Tn20hZtXg^r#bHdys&#Fq%7MSR<2RSSUqc^+-Fk#~NWp?`7QuFmXEbb+AnK6la-JnA58{G` zJjv3amvp-cBT<&d%zbXTL$H~`b0DNTeG(@e^DMgz|KM^j&}Ck$24ZOvF&w5b?vOBs zRYiK4Rh1Nq{;Y-`-cZS$P?j(rbVE+ks1FK8G&2gGS;DO7^+MXmSqrNr31PUEQLH~q z(l#bx)KRhAvETe!{QYBb zy7RTSUtGMBh_UNWym|G&^?xo-AKLNkzPDfgf&Y2b+*I)^1u4MRVID>a@4Iutraa?e z7n?DmJNUoZPz`0Uf4!aV5_%yNxm!T3A5$ zqTL;cWH6hHN>8A>&@OSkve=z$6Ar@V$!R4uF`}9TwwjJ zbpq#x|Cbti?}ie(ByIDK`=i>~bw)}c_@rUPZM~B`{1JgTVmXeoUQPi~0R_8VqYx%* zIe=IUppCN>@F1iRJ2+(Wmx4{)3IT2V0J{y+09Pm|)ldNkBRGYB;5L?sFCyYUb>vlJ zz6$LX{U7P_xI#r{%4KtsTU@yQusEftw#^vIC4pwM6$0N@xy>LQvh zt+lJ!reWS0pN&3?_LsZwY(iO+k8ktOp?k{B>rKWXzei&B!a_1X=|!(r`42G20-pu7?_>nTPrbqg$Y= zaa}8)w(VmSTn!U0I!&MlRs=->M<=lj^N!O-_gAD@?WirJX$u+EzCz*3O=UhT=R7)M zG7}{%iJ|?md6lD|)We$+E6$CtEOpQWo2YHNd$%DJH@{4`GD>}EQ(N!P_&=?olNCvJ zIH^u5$Oe)6ej!V-3uVCQehad$B6*l-JHSv0#k`-(R`))%5A6^?++7hRz#Eu87UID> zg^uXSdwU_UMI;T=hy)3+MUt2rtUckMMf;7FMUs~V06sqm-7O^kNBwtdXl}z3%RaSo z;P;I>uxe)C)p>8c
    wF-TJ({HHl+%sV4Iz9n8Gqdq<)0R5Mc?Dsv{N z12ccS?|ZYr6{z{0MQVThMh$&!1{{ za|CjTv0>zJT4-VOLn!1h_rX0r>UIniA8{pq=l^-ax)Q2IfpFx6z5w*50wu#FxyP0w zL81cwsCkHf!dHo42O?+<2+)xe-b*#`dEG2=C(k_0ysW-g;pr_RaPkWW#Cc!V3C1}s z#uU%=6Kl*)L{3Aj8^T>VHe|hq?|rcbx3E-V;*8LtP&!=u*a#h@XNGi;V?#QO^5E^o z^&Y&vcn;mw&VqJEvjU(SD4bK};+*R^N-2+bNOfIf!uKrnU# zuYBNw7*i~sp+8mQ00|G!1s7?uhDn|Y9;L$XDYD~Hba4KyGk;k6ZO!7o2)MrpfxW7d z9%Zn*GEWWoY(WwWPDXzP>^Bps3X)V*a6rWg?+V!epw6jt{}cNsR%FwnOM+6ppcN+F z0OB)v9o4})T}N;z!lpKmUS&1d1#Be@Csm_M>XTG*RLke`VWd(F_~r@&5vR CKJmZ+ literal 0 HcmV?d00001 diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/testdata/protobuf.gz b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/testdata/protobuf.gz new file mode 100644 index 0000000000000000000000000000000000000000..7622adb1c8a1166549e339920a5823cf5493d0a6 GIT binary patch literal 2097 zcmV-12+sE(iwFoAHid)vHwry&KEBu?IG@6G5K^8#imAXN ziq63wT<`*2W;4}5ETb;RPUztdaXg?(!gHFE^7l&v-91vtm@rPcuzg36(CvbPE{k#n zk1t@J1c3vxq83g`DB-vjF`O-=VH*?2?WD3BQ)9K0wFj%0jLCo1&%7}G;qR^#=pZmSlyIpe^dEli?-fluqw! z52vHR&j|(fGrMpSdeSJ4Pnf_OA6$n|I6v1<6p6>8I3}J>bX3~#q1pr0%4B|kWfPXh zdL}H5^-P$Lok4qZcX#8&&Xl*6h0M7{WvGM`rksd(xgY^P@yJ)PpaH==Cd%P(wyZH# zscoB{nE1($#l=T(PJ{!;Ba+j7XdBw( zMjkQ8@0y!Kx1p^aPy)U`ar3p}u=GbE5C|sCnh#Nx00Y0N>9| zr{AT^)}IaZ$&nI#61GLheAPHHpg0BRQ+lr@4}U=-jwHu!6vPbfB%q-0_s){6!~kL* zfHsaoIC6)9?_h_kuM{?M%Yp0M1=wwnMh{A}%>o~SL-=#FA58yUMYXcem!Z9coOjBj zDZ70MJr&LuwDP_`ji1My#Vtok5d@ge}cBbK=hWasLL| zRdC!q}ZUNHNzvQgYAPGu18bR2`Eyzg90Y?Y2E7sqt zXpaVDGSSU)U_5|ca*~(Q;0?&Sem~fNtPRMzVdno+$WkPKylM?dm}Ay}gmg@o0ApX) zazPKODegg58=XtyJT2cZ;iiDE`%j&oJ$*mUXv*n$rLxcZm0qaz=lvd8fkfV3a)jGa zkjBl0N3{Yir@@LQL$-P$K2HUqTue!N6`7HnZO|a;Sii{!4FY2UYOJllmMhQb_Q@4o zcBm@9MTD0~x-D6~==o|J9UfWMYC@X2kYVL(IWzBdXU-ceU$@W$%fZ# ztW++4f1!i!SVQezrP5GUP+zq&O#LBxf8Bb+Ku1R&M_NhQQO{F9J+y#K>n(`7ERzIf z2e6|Ii*Bq+-P_Slv`K!LTUWIvGQFyvShXqH z6;QL|F%5e&&snttfa2-Qgn%%|W$PfHzt**C(`ZLFzc~r@wQm~e^VbU+Lz_MK=opeh zM-NH*YP(|H0CL%_xf1VMe;U)SL>ljH>6q+EkeK2{-bpeK zF1V^)n$Lqb5V1^TweCWkO_RlE3^?;@PGXK9znj;h>h^SJSBb>QZ||1-eKz0ij2uh* zOs{KWeb#FX!QI9X+-+F3?-<~fg%V@Or4C6t|MVA!=%7xaPlxM0!E5t_I$WDSiFULj zyB)D80q6!)JXT!ZVieBE5qV?B?_xMBF7z(Wqn3-Nb0~nMfC*c6?0Tp2nbUGC?c(L_ z&y*T)7tjSKAzi^Fj+7f0{k>Giy=c$u`^SI3@Q$JNz6h8talqk5^s{HQezv?PvL}lV%q!#=sDv?ZLc(bJSl z<^3v}%E~Jq!`4Z;zB*W{uhQ9#0_!8m*eI}W!de>z*8f$3_12M{3j-3yE)K@E-4_Sr z8op@##z6P1k`@3|QO}MU@gv9Uf2rvXgSd>gc(7rlMHtIU4F|I7a8`vRnarojZv!uO zD8QF|i5NYy4w)5GpIcSOyl~6vsa4)3E0tHqw4|>; zWDO6*hXw<28o2cMD_wI!aa37zRYd|&3|y0!!}5(fzg2V4C(05g7%0d*T}0z1L{u$X bD-^Z%LVr9zyh@v4WE}qw(Kt;cFCYK_^s^0< literal 0 HcmV?d00001 diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/testdata/text b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/testdata/text new file mode 100644 index 0000000..f3d8c37 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/testdata/text @@ -0,0 +1,322 @@ +# HELP http_request_duration_microseconds The HTTP request latencies in microseconds. +# TYPE http_request_duration_microseconds summary +http_request_duration_microseconds{handler="/",quantile="0.5"} 0 +http_request_duration_microseconds{handler="/",quantile="0.9"} 0 +http_request_duration_microseconds{handler="/",quantile="0.99"} 0 +http_request_duration_microseconds_sum{handler="/"} 0 +http_request_duration_microseconds_count{handler="/"} 0 +http_request_duration_microseconds{handler="/alerts",quantile="0.5"} 0 +http_request_duration_microseconds{handler="/alerts",quantile="0.9"} 0 +http_request_duration_microseconds{handler="/alerts",quantile="0.99"} 0 +http_request_duration_microseconds_sum{handler="/alerts"} 0 +http_request_duration_microseconds_count{handler="/alerts"} 0 +http_request_duration_microseconds{handler="/api/metrics",quantile="0.5"} 0 +http_request_duration_microseconds{handler="/api/metrics",quantile="0.9"} 0 +http_request_duration_microseconds{handler="/api/metrics",quantile="0.99"} 0 +http_request_duration_microseconds_sum{handler="/api/metrics"} 0 +http_request_duration_microseconds_count{handler="/api/metrics"} 0 +http_request_duration_microseconds{handler="/api/query",quantile="0.5"} 0 +http_request_duration_microseconds{handler="/api/query",quantile="0.9"} 0 +http_request_duration_microseconds{handler="/api/query",quantile="0.99"} 0 +http_request_duration_microseconds_sum{handler="/api/query"} 0 +http_request_duration_microseconds_count{handler="/api/query"} 0 +http_request_duration_microseconds{handler="/api/query_range",quantile="0.5"} 0 +http_request_duration_microseconds{handler="/api/query_range",quantile="0.9"} 0 +http_request_duration_microseconds{handler="/api/query_range",quantile="0.99"} 0 +http_request_duration_microseconds_sum{handler="/api/query_range"} 0 +http_request_duration_microseconds_count{handler="/api/query_range"} 0 +http_request_duration_microseconds{handler="/api/targets",quantile="0.5"} 0 +http_request_duration_microseconds{handler="/api/targets",quantile="0.9"} 0 +http_request_duration_microseconds{handler="/api/targets",quantile="0.99"} 0 +http_request_duration_microseconds_sum{handler="/api/targets"} 0 +http_request_duration_microseconds_count{handler="/api/targets"} 0 +http_request_duration_microseconds{handler="/consoles/",quantile="0.5"} 0 +http_request_duration_microseconds{handler="/consoles/",quantile="0.9"} 0 +http_request_duration_microseconds{handler="/consoles/",quantile="0.99"} 0 +http_request_duration_microseconds_sum{handler="/consoles/"} 0 +http_request_duration_microseconds_count{handler="/consoles/"} 0 +http_request_duration_microseconds{handler="/graph",quantile="0.5"} 0 +http_request_duration_microseconds{handler="/graph",quantile="0.9"} 0 +http_request_duration_microseconds{handler="/graph",quantile="0.99"} 0 +http_request_duration_microseconds_sum{handler="/graph"} 0 +http_request_duration_microseconds_count{handler="/graph"} 0 +http_request_duration_microseconds{handler="/heap",quantile="0.5"} 0 +http_request_duration_microseconds{handler="/heap",quantile="0.9"} 0 +http_request_duration_microseconds{handler="/heap",quantile="0.99"} 0 +http_request_duration_microseconds_sum{handler="/heap"} 0 +http_request_duration_microseconds_count{handler="/heap"} 0 +http_request_duration_microseconds{handler="/static/",quantile="0.5"} 0 +http_request_duration_microseconds{handler="/static/",quantile="0.9"} 0 +http_request_duration_microseconds{handler="/static/",quantile="0.99"} 0 +http_request_duration_microseconds_sum{handler="/static/"} 0 +http_request_duration_microseconds_count{handler="/static/"} 0 +http_request_duration_microseconds{handler="prometheus",quantile="0.5"} 1307.275 +http_request_duration_microseconds{handler="prometheus",quantile="0.9"} 1858.632 +http_request_duration_microseconds{handler="prometheus",quantile="0.99"} 3087.384 +http_request_duration_microseconds_sum{handler="prometheus"} 179886.5000000001 +http_request_duration_microseconds_count{handler="prometheus"} 119 +# HELP http_request_size_bytes The HTTP request sizes in bytes. +# TYPE http_request_size_bytes summary +http_request_size_bytes{handler="/",quantile="0.5"} 0 +http_request_size_bytes{handler="/",quantile="0.9"} 0 +http_request_size_bytes{handler="/",quantile="0.99"} 0 +http_request_size_bytes_sum{handler="/"} 0 +http_request_size_bytes_count{handler="/"} 0 +http_request_size_bytes{handler="/alerts",quantile="0.5"} 0 +http_request_size_bytes{handler="/alerts",quantile="0.9"} 0 +http_request_size_bytes{handler="/alerts",quantile="0.99"} 0 +http_request_size_bytes_sum{handler="/alerts"} 0 +http_request_size_bytes_count{handler="/alerts"} 0 +http_request_size_bytes{handler="/api/metrics",quantile="0.5"} 0 +http_request_size_bytes{handler="/api/metrics",quantile="0.9"} 0 +http_request_size_bytes{handler="/api/metrics",quantile="0.99"} 0 +http_request_size_bytes_sum{handler="/api/metrics"} 0 +http_request_size_bytes_count{handler="/api/metrics"} 0 +http_request_size_bytes{handler="/api/query",quantile="0.5"} 0 +http_request_size_bytes{handler="/api/query",quantile="0.9"} 0 +http_request_size_bytes{handler="/api/query",quantile="0.99"} 0 +http_request_size_bytes_sum{handler="/api/query"} 0 +http_request_size_bytes_count{handler="/api/query"} 0 +http_request_size_bytes{handler="/api/query_range",quantile="0.5"} 0 +http_request_size_bytes{handler="/api/query_range",quantile="0.9"} 0 +http_request_size_bytes{handler="/api/query_range",quantile="0.99"} 0 +http_request_size_bytes_sum{handler="/api/query_range"} 0 +http_request_size_bytes_count{handler="/api/query_range"} 0 +http_request_size_bytes{handler="/api/targets",quantile="0.5"} 0 +http_request_size_bytes{handler="/api/targets",quantile="0.9"} 0 +http_request_size_bytes{handler="/api/targets",quantile="0.99"} 0 +http_request_size_bytes_sum{handler="/api/targets"} 0 +http_request_size_bytes_count{handler="/api/targets"} 0 +http_request_size_bytes{handler="/consoles/",quantile="0.5"} 0 +http_request_size_bytes{handler="/consoles/",quantile="0.9"} 0 +http_request_size_bytes{handler="/consoles/",quantile="0.99"} 0 +http_request_size_bytes_sum{handler="/consoles/"} 0 +http_request_size_bytes_count{handler="/consoles/"} 0 +http_request_size_bytes{handler="/graph",quantile="0.5"} 0 +http_request_size_bytes{handler="/graph",quantile="0.9"} 0 +http_request_size_bytes{handler="/graph",quantile="0.99"} 0 +http_request_size_bytes_sum{handler="/graph"} 0 +http_request_size_bytes_count{handler="/graph"} 0 +http_request_size_bytes{handler="/heap",quantile="0.5"} 0 +http_request_size_bytes{handler="/heap",quantile="0.9"} 0 +http_request_size_bytes{handler="/heap",quantile="0.99"} 0 +http_request_size_bytes_sum{handler="/heap"} 0 +http_request_size_bytes_count{handler="/heap"} 0 +http_request_size_bytes{handler="/static/",quantile="0.5"} 0 +http_request_size_bytes{handler="/static/",quantile="0.9"} 0 +http_request_size_bytes{handler="/static/",quantile="0.99"} 0 +http_request_size_bytes_sum{handler="/static/"} 0 +http_request_size_bytes_count{handler="/static/"} 0 +http_request_size_bytes{handler="prometheus",quantile="0.5"} 291 +http_request_size_bytes{handler="prometheus",quantile="0.9"} 291 +http_request_size_bytes{handler="prometheus",quantile="0.99"} 291 +http_request_size_bytes_sum{handler="prometheus"} 34488 +http_request_size_bytes_count{handler="prometheus"} 119 +# HELP http_requests_total Total number of HTTP requests made. +# TYPE http_requests_total counter +http_requests_total{code="200",handler="prometheus",method="get"} 119 +# HELP http_response_size_bytes The HTTP response sizes in bytes. +# TYPE http_response_size_bytes summary +http_response_size_bytes{handler="/",quantile="0.5"} 0 +http_response_size_bytes{handler="/",quantile="0.9"} 0 +http_response_size_bytes{handler="/",quantile="0.99"} 0 +http_response_size_bytes_sum{handler="/"} 0 +http_response_size_bytes_count{handler="/"} 0 +http_response_size_bytes{handler="/alerts",quantile="0.5"} 0 +http_response_size_bytes{handler="/alerts",quantile="0.9"} 0 +http_response_size_bytes{handler="/alerts",quantile="0.99"} 0 +http_response_size_bytes_sum{handler="/alerts"} 0 +http_response_size_bytes_count{handler="/alerts"} 0 +http_response_size_bytes{handler="/api/metrics",quantile="0.5"} 0 +http_response_size_bytes{handler="/api/metrics",quantile="0.9"} 0 +http_response_size_bytes{handler="/api/metrics",quantile="0.99"} 0 +http_response_size_bytes_sum{handler="/api/metrics"} 0 +http_response_size_bytes_count{handler="/api/metrics"} 0 +http_response_size_bytes{handler="/api/query",quantile="0.5"} 0 +http_response_size_bytes{handler="/api/query",quantile="0.9"} 0 +http_response_size_bytes{handler="/api/query",quantile="0.99"} 0 +http_response_size_bytes_sum{handler="/api/query"} 0 +http_response_size_bytes_count{handler="/api/query"} 0 +http_response_size_bytes{handler="/api/query_range",quantile="0.5"} 0 +http_response_size_bytes{handler="/api/query_range",quantile="0.9"} 0 +http_response_size_bytes{handler="/api/query_range",quantile="0.99"} 0 +http_response_size_bytes_sum{handler="/api/query_range"} 0 +http_response_size_bytes_count{handler="/api/query_range"} 0 +http_response_size_bytes{handler="/api/targets",quantile="0.5"} 0 +http_response_size_bytes{handler="/api/targets",quantile="0.9"} 0 +http_response_size_bytes{handler="/api/targets",quantile="0.99"} 0 +http_response_size_bytes_sum{handler="/api/targets"} 0 +http_response_size_bytes_count{handler="/api/targets"} 0 +http_response_size_bytes{handler="/consoles/",quantile="0.5"} 0 +http_response_size_bytes{handler="/consoles/",quantile="0.9"} 0 +http_response_size_bytes{handler="/consoles/",quantile="0.99"} 0 +http_response_size_bytes_sum{handler="/consoles/"} 0 +http_response_size_bytes_count{handler="/consoles/"} 0 +http_response_size_bytes{handler="/graph",quantile="0.5"} 0 +http_response_size_bytes{handler="/graph",quantile="0.9"} 0 +http_response_size_bytes{handler="/graph",quantile="0.99"} 0 +http_response_size_bytes_sum{handler="/graph"} 0 +http_response_size_bytes_count{handler="/graph"} 0 +http_response_size_bytes{handler="/heap",quantile="0.5"} 0 +http_response_size_bytes{handler="/heap",quantile="0.9"} 0 +http_response_size_bytes{handler="/heap",quantile="0.99"} 0 +http_response_size_bytes_sum{handler="/heap"} 0 +http_response_size_bytes_count{handler="/heap"} 0 +http_response_size_bytes{handler="/static/",quantile="0.5"} 0 +http_response_size_bytes{handler="/static/",quantile="0.9"} 0 +http_response_size_bytes{handler="/static/",quantile="0.99"} 0 +http_response_size_bytes_sum{handler="/static/"} 0 +http_response_size_bytes_count{handler="/static/"} 0 +http_response_size_bytes{handler="prometheus",quantile="0.5"} 2049 +http_response_size_bytes{handler="prometheus",quantile="0.9"} 2058 +http_response_size_bytes{handler="prometheus",quantile="0.99"} 2064 +http_response_size_bytes_sum{handler="prometheus"} 247001 +http_response_size_bytes_count{handler="prometheus"} 119 +# HELP process_cpu_seconds_total Total user and system CPU time spent in seconds. +# TYPE process_cpu_seconds_total counter +process_cpu_seconds_total 0.55 +# HELP go_goroutines Number of goroutines that currently exist. +# TYPE go_goroutines gauge +go_goroutines 70 +# HELP process_max_fds Maximum number of open file descriptors. +# TYPE process_max_fds gauge +process_max_fds 8192 +# HELP process_open_fds Number of open file descriptors. +# TYPE process_open_fds gauge +process_open_fds 29 +# HELP process_resident_memory_bytes Resident memory size in bytes. +# TYPE process_resident_memory_bytes gauge +process_resident_memory_bytes 5.3870592e+07 +# HELP process_start_time_seconds Start time of the process since unix epoch in seconds. +# TYPE process_start_time_seconds gauge +process_start_time_seconds 1.42236894836e+09 +# HELP process_virtual_memory_bytes Virtual memory size in bytes. +# TYPE process_virtual_memory_bytes gauge +process_virtual_memory_bytes 5.41478912e+08 +# HELP prometheus_dns_sd_lookup_failures_total The number of DNS-SD lookup failures. +# TYPE prometheus_dns_sd_lookup_failures_total counter +prometheus_dns_sd_lookup_failures_total 0 +# HELP prometheus_dns_sd_lookups_total The number of DNS-SD lookups. +# TYPE prometheus_dns_sd_lookups_total counter +prometheus_dns_sd_lookups_total 7 +# HELP prometheus_evaluator_duration_milliseconds The duration for all evaluations to execute. +# TYPE prometheus_evaluator_duration_milliseconds summary +prometheus_evaluator_duration_milliseconds{quantile="0.01"} 0 +prometheus_evaluator_duration_milliseconds{quantile="0.05"} 0 +prometheus_evaluator_duration_milliseconds{quantile="0.5"} 0 +prometheus_evaluator_duration_milliseconds{quantile="0.9"} 1 +prometheus_evaluator_duration_milliseconds{quantile="0.99"} 1 +prometheus_evaluator_duration_milliseconds_sum 12 +prometheus_evaluator_duration_milliseconds_count 23 +# HELP prometheus_local_storage_checkpoint_duration_milliseconds The duration (in milliseconds) it took to checkpoint in-memory metrics and head chunks. +# TYPE prometheus_local_storage_checkpoint_duration_milliseconds gauge +prometheus_local_storage_checkpoint_duration_milliseconds 0 +# HELP prometheus_local_storage_chunk_ops_total The total number of chunk operations by their type. +# TYPE prometheus_local_storage_chunk_ops_total counter +prometheus_local_storage_chunk_ops_total{type="create"} 598 +prometheus_local_storage_chunk_ops_total{type="persist"} 174 +prometheus_local_storage_chunk_ops_total{type="pin"} 920 +prometheus_local_storage_chunk_ops_total{type="transcode"} 415 +prometheus_local_storage_chunk_ops_total{type="unpin"} 920 +# HELP prometheus_local_storage_indexing_batch_latency_milliseconds Quantiles for batch indexing latencies in milliseconds. +# TYPE prometheus_local_storage_indexing_batch_latency_milliseconds summary +prometheus_local_storage_indexing_batch_latency_milliseconds{quantile="0.5"} 0 +prometheus_local_storage_indexing_batch_latency_milliseconds{quantile="0.9"} 0 +prometheus_local_storage_indexing_batch_latency_milliseconds{quantile="0.99"} 0 +prometheus_local_storage_indexing_batch_latency_milliseconds_sum 0 +prometheus_local_storage_indexing_batch_latency_milliseconds_count 1 +# HELP prometheus_local_storage_indexing_batch_sizes Quantiles for indexing batch sizes (number of metrics per batch). +# TYPE prometheus_local_storage_indexing_batch_sizes summary +prometheus_local_storage_indexing_batch_sizes{quantile="0.5"} 2 +prometheus_local_storage_indexing_batch_sizes{quantile="0.9"} 2 +prometheus_local_storage_indexing_batch_sizes{quantile="0.99"} 2 +prometheus_local_storage_indexing_batch_sizes_sum 2 +prometheus_local_storage_indexing_batch_sizes_count 1 +# HELP prometheus_local_storage_indexing_queue_capacity The capacity of the indexing queue. +# TYPE prometheus_local_storage_indexing_queue_capacity gauge +prometheus_local_storage_indexing_queue_capacity 16384 +# HELP prometheus_local_storage_indexing_queue_length The number of metrics waiting to be indexed. +# TYPE prometheus_local_storage_indexing_queue_length gauge +prometheus_local_storage_indexing_queue_length 0 +# HELP prometheus_local_storage_ingested_samples_total The total number of samples ingested. +# TYPE prometheus_local_storage_ingested_samples_total counter +prometheus_local_storage_ingested_samples_total 30473 +# HELP prometheus_local_storage_invalid_preload_requests_total The total number of preload requests referring to a non-existent series. This is an indication of outdated label indexes. +# TYPE prometheus_local_storage_invalid_preload_requests_total counter +prometheus_local_storage_invalid_preload_requests_total 0 +# HELP prometheus_local_storage_memory_chunkdescs The current number of chunk descriptors in memory. +# TYPE prometheus_local_storage_memory_chunkdescs gauge +prometheus_local_storage_memory_chunkdescs 1059 +# HELP prometheus_local_storage_memory_chunks The current number of chunks in memory, excluding cloned chunks (i.e. chunks without a descriptor). +# TYPE prometheus_local_storage_memory_chunks gauge +prometheus_local_storage_memory_chunks 1020 +# HELP prometheus_local_storage_memory_series The current number of series in memory. +# TYPE prometheus_local_storage_memory_series gauge +prometheus_local_storage_memory_series 424 +# HELP prometheus_local_storage_persist_latency_microseconds A summary of latencies for persisting each chunk. +# TYPE prometheus_local_storage_persist_latency_microseconds summary +prometheus_local_storage_persist_latency_microseconds{quantile="0.5"} 30.377 +prometheus_local_storage_persist_latency_microseconds{quantile="0.9"} 203.539 +prometheus_local_storage_persist_latency_microseconds{quantile="0.99"} 2626.463 +prometheus_local_storage_persist_latency_microseconds_sum 20424.415 +prometheus_local_storage_persist_latency_microseconds_count 174 +# HELP prometheus_local_storage_persist_queue_capacity The total capacity of the persist queue. +# TYPE prometheus_local_storage_persist_queue_capacity gauge +prometheus_local_storage_persist_queue_capacity 1024 +# HELP prometheus_local_storage_persist_queue_length The current number of chunks waiting in the persist queue. +# TYPE prometheus_local_storage_persist_queue_length gauge +prometheus_local_storage_persist_queue_length 0 +# HELP prometheus_local_storage_series_ops_total The total number of series operations by their type. +# TYPE prometheus_local_storage_series_ops_total counter +prometheus_local_storage_series_ops_total{type="create"} 2 +prometheus_local_storage_series_ops_total{type="maintenance_in_memory"} 11 +# HELP prometheus_notifications_latency_milliseconds Latency quantiles for sending alert notifications (not including dropped notifications). +# TYPE prometheus_notifications_latency_milliseconds summary +prometheus_notifications_latency_milliseconds{quantile="0.5"} 0 +prometheus_notifications_latency_milliseconds{quantile="0.9"} 0 +prometheus_notifications_latency_milliseconds{quantile="0.99"} 0 +prometheus_notifications_latency_milliseconds_sum 0 +prometheus_notifications_latency_milliseconds_count 0 +# HELP prometheus_notifications_queue_capacity The capacity of the alert notifications queue. +# TYPE prometheus_notifications_queue_capacity gauge +prometheus_notifications_queue_capacity 100 +# HELP prometheus_notifications_queue_length The number of alert notifications in the queue. +# TYPE prometheus_notifications_queue_length gauge +prometheus_notifications_queue_length 0 +# HELP prometheus_rule_evaluation_duration_milliseconds The duration for a rule to execute. +# TYPE prometheus_rule_evaluation_duration_milliseconds summary +prometheus_rule_evaluation_duration_milliseconds{rule_type="alerting",quantile="0.5"} 0 +prometheus_rule_evaluation_duration_milliseconds{rule_type="alerting",quantile="0.9"} 0 +prometheus_rule_evaluation_duration_milliseconds{rule_type="alerting",quantile="0.99"} 2 +prometheus_rule_evaluation_duration_milliseconds_sum{rule_type="alerting"} 12 +prometheus_rule_evaluation_duration_milliseconds_count{rule_type="alerting"} 115 +prometheus_rule_evaluation_duration_milliseconds{rule_type="recording",quantile="0.5"} 0 +prometheus_rule_evaluation_duration_milliseconds{rule_type="recording",quantile="0.9"} 0 +prometheus_rule_evaluation_duration_milliseconds{rule_type="recording",quantile="0.99"} 3 +prometheus_rule_evaluation_duration_milliseconds_sum{rule_type="recording"} 15 +prometheus_rule_evaluation_duration_milliseconds_count{rule_type="recording"} 115 +# HELP prometheus_rule_evaluation_failures_total The total number of rule evaluation failures. +# TYPE prometheus_rule_evaluation_failures_total counter +prometheus_rule_evaluation_failures_total 0 +# HELP prometheus_samples_queue_capacity Capacity of the queue for unwritten samples. +# TYPE prometheus_samples_queue_capacity gauge +prometheus_samples_queue_capacity 4096 +# HELP prometheus_samples_queue_length Current number of items in the queue for unwritten samples. Each item comprises all samples exposed by one target as one metric family (i.e. metrics of the same name). +# TYPE prometheus_samples_queue_length gauge +prometheus_samples_queue_length 0 +# HELP prometheus_target_interval_length_seconds Actual intervals between scrapes. +# TYPE prometheus_target_interval_length_seconds summary +prometheus_target_interval_length_seconds{interval="15s",quantile="0.01"} 14 +prometheus_target_interval_length_seconds{interval="15s",quantile="0.05"} 14 +prometheus_target_interval_length_seconds{interval="15s",quantile="0.5"} 15 +prometheus_target_interval_length_seconds{interval="15s",quantile="0.9"} 15 +prometheus_target_interval_length_seconds{interval="15s",quantile="0.99"} 15 +prometheus_target_interval_length_seconds_sum{interval="15s"} 175 +prometheus_target_interval_length_seconds_count{interval="15s"} 12 +prometheus_target_interval_length_seconds{interval="1s",quantile="0.01"} 0 +prometheus_target_interval_length_seconds{interval="1s",quantile="0.05"} 0 +prometheus_target_interval_length_seconds{interval="1s",quantile="0.5"} 0 +prometheus_target_interval_length_seconds{interval="1s",quantile="0.9"} 1 +prometheus_target_interval_length_seconds{interval="1s",quantile="0.99"} 1 +prometheus_target_interval_length_seconds_sum{interval="1s"} 55 +prometheus_target_interval_length_seconds_count{interval="1s"} 117 diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/testdata/text.gz b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/testdata/text.gz new file mode 100644 index 0000000000000000000000000000000000000000..b7658c84d7d63018b286611cec48a8362bd7c71d GIT binary patch literal 2598 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 0 { + p.summaries = map[uint64]*dto.Metric{} + } + if p.histograms == nil || len(p.histograms) > 0 { + p.histograms = map[uint64]*dto.Metric{} + } + p.currentQuantile = math.NaN() + p.currentBucket = math.NaN() +} + +// startOfLine represents the state where the next byte read from p.buf is the +// start of a line (or whitespace leading up to it). +func (p *TextParser) startOfLine() stateFn { + p.lineCount++ + if p.skipBlankTab(); p.err != nil { + // End of input reached. This is the only case where + // that is not an error but a signal that we are done. + p.err = nil + return nil + } + switch p.currentByte { + case '#': + return p.startComment + case '\n': + return p.startOfLine // Empty line, start the next one. + } + return p.readingMetricName +} + +// startComment represents the state where the next byte read from p.buf is the +// start of a comment (or whitespace leading up to it). +func (p *TextParser) startComment() stateFn { + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentByte == '\n' { + return p.startOfLine + } + if p.readTokenUntilWhitespace(); p.err != nil { + return nil // Unexpected end of input. + } + // If we have hit the end of line already, there is nothing left + // to do. This is not considered a syntax error. + if p.currentByte == '\n' { + return p.startOfLine + } + keyword := p.currentToken.String() + if keyword != "HELP" && keyword != "TYPE" { + // Generic comment, ignore by fast forwarding to end of line. + for p.currentByte != '\n' { + if p.currentByte, p.err = p.buf.ReadByte(); p.err != nil { + return nil // Unexpected end of input. + } + } + return p.startOfLine + } + // There is something. Next has to be a metric name. + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.readTokenAsMetricName(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentByte == '\n' { + // At the end of the line already. + // Again, this is not considered a syntax error. + return p.startOfLine + } + if !isBlankOrTab(p.currentByte) { + p.parseError("invalid metric name in comment") + return nil + } + p.setOrCreateCurrentMF() + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentByte == '\n' { + // At the end of the line already. + // Again, this is not considered a syntax error. + return p.startOfLine + } + switch keyword { + case "HELP": + return p.readingHelp + case "TYPE": + return p.readingType + } + panic(fmt.Sprintf("code error: unexpected keyword %q", keyword)) +} + +// readingMetricName represents the state where the last byte read (now in +// p.currentByte) is the first byte of a metric name. +func (p *TextParser) readingMetricName() stateFn { + if p.readTokenAsMetricName(); p.err != nil { + return nil + } + if p.currentToken.Len() == 0 { + p.parseError("invalid metric name") + return nil + } + p.setOrCreateCurrentMF() + // Now is the time to fix the type if it hasn't happened yet. + if p.currentMF.Type == nil { + p.currentMF.Type = dto.MetricType_UNTYPED.Enum() + } + p.currentMetric = &dto.Metric{} + // Do not append the newly created currentMetric to + // currentMF.Metric right now. First wait if this is a summary, + // and the metric exists already, which we can only know after + // having read all the labels. + if p.skipBlankTabIfCurrentBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + return p.readingLabels +} + +// readingLabels represents the state where the last byte read (now in +// p.currentByte) is either the first byte of the label set (i.e. a '{'), or the +// first byte of the value (otherwise). +func (p *TextParser) readingLabels() stateFn { + // Summaries/histograms are special. We have to reset the + // currentLabels map, currentQuantile and currentBucket before starting to + // read labels. + if p.currentMF.GetType() == dto.MetricType_SUMMARY || p.currentMF.GetType() == dto.MetricType_HISTOGRAM { + p.currentLabels = map[string]string{} + p.currentLabels[string(model.MetricNameLabel)] = p.currentMF.GetName() + p.currentQuantile = math.NaN() + p.currentBucket = math.NaN() + } + if p.currentByte != '{' { + return p.readingValue + } + return p.startLabelName +} + +// startLabelName represents the state where the next byte read from p.buf is +// the start of a label name (or whitespace leading up to it). +func (p *TextParser) startLabelName() stateFn { + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentByte == '}' { + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + return p.readingValue + } + if p.readTokenAsLabelName(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentToken.Len() == 0 { + p.parseError(fmt.Sprintf("invalid label name for metric %q", p.currentMF.GetName())) + return nil + } + p.currentLabelPair = &dto.LabelPair{Name: proto.String(p.currentToken.String())} + if p.currentLabelPair.GetName() == string(model.MetricNameLabel) { + p.parseError(fmt.Sprintf("label name %q is reserved", model.MetricNameLabel)) + return nil + } + // Special summary/histogram treatment. Don't add 'quantile' and 'le' + // labels to 'real' labels. + if !(p.currentMF.GetType() == dto.MetricType_SUMMARY && p.currentLabelPair.GetName() == model.QuantileLabel) && + !(p.currentMF.GetType() == dto.MetricType_HISTOGRAM && p.currentLabelPair.GetName() == model.BucketLabel) { + p.currentMetric.Label = append(p.currentMetric.Label, p.currentLabelPair) + } + if p.skipBlankTabIfCurrentBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentByte != '=' { + p.parseError(fmt.Sprintf("expected '=' after label name, found %q", p.currentByte)) + return nil + } + return p.startLabelValue +} + +// startLabelValue represents the state where the next byte read from p.buf is +// the start of a (quoted) label value (or whitespace leading up to it). +func (p *TextParser) startLabelValue() stateFn { + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentByte != '"' { + p.parseError(fmt.Sprintf("expected '\"' at start of label value, found %q", p.currentByte)) + return nil + } + if p.readTokenAsLabelValue(); p.err != nil { + return nil + } + if !model.LabelValue(p.currentToken.String()).IsValid() { + p.parseError(fmt.Sprintf("invalid label value %q", p.currentToken.String())) + return nil + } + p.currentLabelPair.Value = proto.String(p.currentToken.String()) + // Special treatment of summaries: + // - Quantile labels are special, will result in dto.Quantile later. + // - Other labels have to be added to currentLabels for signature calculation. + if p.currentMF.GetType() == dto.MetricType_SUMMARY { + if p.currentLabelPair.GetName() == model.QuantileLabel { + if p.currentQuantile, p.err = strconv.ParseFloat(p.currentLabelPair.GetValue(), 64); p.err != nil { + // Create a more helpful error message. + p.parseError(fmt.Sprintf("expected float as value for 'quantile' label, got %q", p.currentLabelPair.GetValue())) + return nil + } + } else { + p.currentLabels[p.currentLabelPair.GetName()] = p.currentLabelPair.GetValue() + } + } + // Similar special treatment of histograms. + if p.currentMF.GetType() == dto.MetricType_HISTOGRAM { + if p.currentLabelPair.GetName() == model.BucketLabel { + if p.currentBucket, p.err = strconv.ParseFloat(p.currentLabelPair.GetValue(), 64); p.err != nil { + // Create a more helpful error message. + p.parseError(fmt.Sprintf("expected float as value for 'le' label, got %q", p.currentLabelPair.GetValue())) + return nil + } + } else { + p.currentLabels[p.currentLabelPair.GetName()] = p.currentLabelPair.GetValue() + } + } + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + switch p.currentByte { + case ',': + return p.startLabelName + + case '}': + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + return p.readingValue + default: + p.parseError(fmt.Sprintf("unexpected end of label value %q", p.currentLabelPair.Value)) + return nil + } +} + +// readingValue represents the state where the last byte read (now in +// p.currentByte) is the first byte of the sample value (i.e. a float). +func (p *TextParser) readingValue() stateFn { + // When we are here, we have read all the labels, so for the + // special case of a summary/histogram, we can finally find out + // if the metric already exists. + if p.currentMF.GetType() == dto.MetricType_SUMMARY { + signature := model.LabelsToSignature(p.currentLabels) + if summary := p.summaries[signature]; summary != nil { + p.currentMetric = summary + } else { + p.summaries[signature] = p.currentMetric + p.currentMF.Metric = append(p.currentMF.Metric, p.currentMetric) + } + } else if p.currentMF.GetType() == dto.MetricType_HISTOGRAM { + signature := model.LabelsToSignature(p.currentLabels) + if histogram := p.histograms[signature]; histogram != nil { + p.currentMetric = histogram + } else { + p.histograms[signature] = p.currentMetric + p.currentMF.Metric = append(p.currentMF.Metric, p.currentMetric) + } + } else { + p.currentMF.Metric = append(p.currentMF.Metric, p.currentMetric) + } + if p.readTokenUntilWhitespace(); p.err != nil { + return nil // Unexpected end of input. + } + value, err := strconv.ParseFloat(p.currentToken.String(), 64) + if err != nil { + // Create a more helpful error message. + p.parseError(fmt.Sprintf("expected float as value, got %q", p.currentToken.String())) + return nil + } + switch p.currentMF.GetType() { + case dto.MetricType_COUNTER: + p.currentMetric.Counter = &dto.Counter{Value: proto.Float64(value)} + case dto.MetricType_GAUGE: + p.currentMetric.Gauge = &dto.Gauge{Value: proto.Float64(value)} + case dto.MetricType_UNTYPED: + p.currentMetric.Untyped = &dto.Untyped{Value: proto.Float64(value)} + case dto.MetricType_SUMMARY: + // *sigh* + if p.currentMetric.Summary == nil { + p.currentMetric.Summary = &dto.Summary{} + } + switch { + case p.currentIsSummaryCount: + p.currentMetric.Summary.SampleCount = proto.Uint64(uint64(value)) + case p.currentIsSummarySum: + p.currentMetric.Summary.SampleSum = proto.Float64(value) + case !math.IsNaN(p.currentQuantile): + p.currentMetric.Summary.Quantile = append( + p.currentMetric.Summary.Quantile, + &dto.Quantile{ + Quantile: proto.Float64(p.currentQuantile), + Value: proto.Float64(value), + }, + ) + } + case dto.MetricType_HISTOGRAM: + // *sigh* + if p.currentMetric.Histogram == nil { + p.currentMetric.Histogram = &dto.Histogram{} + } + switch { + case p.currentIsHistogramCount: + p.currentMetric.Histogram.SampleCount = proto.Uint64(uint64(value)) + case p.currentIsHistogramSum: + p.currentMetric.Histogram.SampleSum = proto.Float64(value) + case !math.IsNaN(p.currentBucket): + p.currentMetric.Histogram.Bucket = append( + p.currentMetric.Histogram.Bucket, + &dto.Bucket{ + UpperBound: proto.Float64(p.currentBucket), + CumulativeCount: proto.Uint64(uint64(value)), + }, + ) + } + default: + p.err = fmt.Errorf("unexpected type for metric name %q", p.currentMF.GetName()) + } + if p.currentByte == '\n' { + return p.startOfLine + } + return p.startTimestamp +} + +// startTimestamp represents the state where the next byte read from p.buf is +// the start of the timestamp (or whitespace leading up to it). +func (p *TextParser) startTimestamp() stateFn { + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.readTokenUntilWhitespace(); p.err != nil { + return nil // Unexpected end of input. + } + timestamp, err := strconv.ParseInt(p.currentToken.String(), 10, 64) + if err != nil { + // Create a more helpful error message. + p.parseError(fmt.Sprintf("expected integer as timestamp, got %q", p.currentToken.String())) + return nil + } + p.currentMetric.TimestampMs = proto.Int64(timestamp) + if p.readTokenUntilNewline(false); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentToken.Len() > 0 { + p.parseError(fmt.Sprintf("spurious string after timestamp: %q", p.currentToken.String())) + return nil + } + return p.startOfLine +} + +// readingHelp represents the state where the last byte read (now in +// p.currentByte) is the first byte of the docstring after 'HELP'. +func (p *TextParser) readingHelp() stateFn { + if p.currentMF.Help != nil { + p.parseError(fmt.Sprintf("second HELP line for metric name %q", p.currentMF.GetName())) + return nil + } + // Rest of line is the docstring. + if p.readTokenUntilNewline(true); p.err != nil { + return nil // Unexpected end of input. + } + p.currentMF.Help = proto.String(p.currentToken.String()) + return p.startOfLine +} + +// readingType represents the state where the last byte read (now in +// p.currentByte) is the first byte of the type hint after 'HELP'. +func (p *TextParser) readingType() stateFn { + if p.currentMF.Type != nil { + p.parseError(fmt.Sprintf("second TYPE line for metric name %q, or TYPE reported after samples", p.currentMF.GetName())) + return nil + } + // Rest of line is the type. + if p.readTokenUntilNewline(false); p.err != nil { + return nil // Unexpected end of input. + } + metricType, ok := dto.MetricType_value[strings.ToUpper(p.currentToken.String())] + if !ok { + p.parseError(fmt.Sprintf("unknown metric type %q", p.currentToken.String())) + return nil + } + p.currentMF.Type = dto.MetricType(metricType).Enum() + return p.startOfLine +} + +// parseError sets p.err to a ParseError at the current line with the given +// message. +func (p *TextParser) parseError(msg string) { + p.err = ParseError{ + Line: p.lineCount, + Msg: msg, + } +} + +// skipBlankTab reads (and discards) bytes from p.buf until it encounters a byte +// that is neither ' ' nor '\t'. That byte is left in p.currentByte. +func (p *TextParser) skipBlankTab() { + for { + if p.currentByte, p.err = p.buf.ReadByte(); p.err != nil || !isBlankOrTab(p.currentByte) { + return + } + } +} + +// skipBlankTabIfCurrentBlankTab works exactly as skipBlankTab but doesn't do +// anything if p.currentByte is neither ' ' nor '\t'. +func (p *TextParser) skipBlankTabIfCurrentBlankTab() { + if isBlankOrTab(p.currentByte) { + p.skipBlankTab() + } +} + +// readTokenUntilWhitespace copies bytes from p.buf into p.currentToken. The +// first byte considered is the byte already read (now in p.currentByte). The +// first whitespace byte encountered is still copied into p.currentByte, but not +// into p.currentToken. +func (p *TextParser) readTokenUntilWhitespace() { + p.currentToken.Reset() + for p.err == nil && !isBlankOrTab(p.currentByte) && p.currentByte != '\n' { + p.currentToken.WriteByte(p.currentByte) + p.currentByte, p.err = p.buf.ReadByte() + } +} + +// readTokenUntilNewline copies bytes from p.buf into p.currentToken. The first +// byte considered is the byte already read (now in p.currentByte). The first +// newline byte encountered is still copied into p.currentByte, but not into +// p.currentToken. If recognizeEscapeSequence is true, two escape sequences are +// recognized: '\\' tranlates into '\', and '\n' into a line-feed character. All +// other escape sequences are invalid and cause an error. +func (p *TextParser) readTokenUntilNewline(recognizeEscapeSequence bool) { + p.currentToken.Reset() + escaped := false + for p.err == nil { + if recognizeEscapeSequence && escaped { + switch p.currentByte { + case '\\': + p.currentToken.WriteByte(p.currentByte) + case 'n': + p.currentToken.WriteByte('\n') + default: + p.parseError(fmt.Sprintf("invalid escape sequence '\\%c'", p.currentByte)) + return + } + escaped = false + } else { + switch p.currentByte { + case '\n': + return + case '\\': + escaped = true + default: + p.currentToken.WriteByte(p.currentByte) + } + } + p.currentByte, p.err = p.buf.ReadByte() + } +} + +// readTokenAsMetricName copies a metric name from p.buf into p.currentToken. +// The first byte considered is the byte already read (now in p.currentByte). +// The first byte not part of a metric name is still copied into p.currentByte, +// but not into p.currentToken. +func (p *TextParser) readTokenAsMetricName() { + p.currentToken.Reset() + if !isValidMetricNameStart(p.currentByte) { + return + } + for { + p.currentToken.WriteByte(p.currentByte) + p.currentByte, p.err = p.buf.ReadByte() + if p.err != nil || !isValidMetricNameContinuation(p.currentByte) { + return + } + } +} + +// readTokenAsLabelName copies a label name from p.buf into p.currentToken. +// The first byte considered is the byte already read (now in p.currentByte). +// The first byte not part of a label name is still copied into p.currentByte, +// but not into p.currentToken. +func (p *TextParser) readTokenAsLabelName() { + p.currentToken.Reset() + if !isValidLabelNameStart(p.currentByte) { + return + } + for { + p.currentToken.WriteByte(p.currentByte) + p.currentByte, p.err = p.buf.ReadByte() + if p.err != nil || !isValidLabelNameContinuation(p.currentByte) { + return + } + } +} + +// readTokenAsLabelValue copies a label value from p.buf into p.currentToken. +// In contrast to the other 'readTokenAs...' functions, which start with the +// last read byte in p.currentByte, this method ignores p.currentByte and starts +// with reading a new byte from p.buf. The first byte not part of a label value +// is still copied into p.currentByte, but not into p.currentToken. +func (p *TextParser) readTokenAsLabelValue() { + p.currentToken.Reset() + escaped := false + for { + if p.currentByte, p.err = p.buf.ReadByte(); p.err != nil { + return + } + if escaped { + switch p.currentByte { + case '"', '\\': + p.currentToken.WriteByte(p.currentByte) + case 'n': + p.currentToken.WriteByte('\n') + default: + p.parseError(fmt.Sprintf("invalid escape sequence '\\%c'", p.currentByte)) + return + } + escaped = false + continue + } + switch p.currentByte { + case '"': + return + case '\n': + p.parseError(fmt.Sprintf("label value %q contains unescaped new-line", p.currentToken.String())) + return + case '\\': + escaped = true + default: + p.currentToken.WriteByte(p.currentByte) + } + } +} + +func (p *TextParser) setOrCreateCurrentMF() { + p.currentIsSummaryCount = false + p.currentIsSummarySum = false + p.currentIsHistogramCount = false + p.currentIsHistogramSum = false + name := p.currentToken.String() + if p.currentMF = p.metricFamiliesByName[name]; p.currentMF != nil { + return + } + // Try out if this is a _sum or _count for a summary/histogram. + summaryName := summaryMetricName(name) + if p.currentMF = p.metricFamiliesByName[summaryName]; p.currentMF != nil { + if p.currentMF.GetType() == dto.MetricType_SUMMARY { + if isCount(name) { + p.currentIsSummaryCount = true + } + if isSum(name) { + p.currentIsSummarySum = true + } + return + } + } + histogramName := histogramMetricName(name) + if p.currentMF = p.metricFamiliesByName[histogramName]; p.currentMF != nil { + if p.currentMF.GetType() == dto.MetricType_HISTOGRAM { + if isCount(name) { + p.currentIsHistogramCount = true + } + if isSum(name) { + p.currentIsHistogramSum = true + } + return + } + } + p.currentMF = &dto.MetricFamily{Name: proto.String(name)} + p.metricFamiliesByName[name] = p.currentMF +} + +func isValidLabelNameStart(b byte) bool { + return (b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_' +} + +func isValidLabelNameContinuation(b byte) bool { + return isValidLabelNameStart(b) || (b >= '0' && b <= '9') +} + +func isValidMetricNameStart(b byte) bool { + return isValidLabelNameStart(b) || b == ':' +} + +func isValidMetricNameContinuation(b byte) bool { + return isValidLabelNameContinuation(b) || b == ':' +} + +func isBlankOrTab(b byte) bool { + return b == ' ' || b == '\t' +} + +func isCount(name string) bool { + return len(name) > 6 && name[len(name)-6:] == "_count" +} + +func isSum(name string) bool { + return len(name) > 4 && name[len(name)-4:] == "_sum" +} + +func isBucket(name string) bool { + return len(name) > 7 && name[len(name)-7:] == "_bucket" +} + +func summaryMetricName(name string) string { + switch { + case isCount(name): + return name[:len(name)-6] + case isSum(name): + return name[:len(name)-4] + default: + return name + } +} + +func histogramMetricName(name string) string { + switch { + case isCount(name): + return name[:len(name)-6] + case isSum(name): + return name[:len(name)-4] + case isBucket(name): + return name[:len(name)-7] + default: + return name + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/text_parse_test.go b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/text_parse_test.go new file mode 100644 index 0000000..76c9511 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/expfmt/text_parse_test.go @@ -0,0 +1,593 @@ +// Copyright 2014 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 expfmt + +import ( + "math" + "strings" + "testing" + + "github.com/golang/protobuf/proto" + dto "github.com/prometheus/client_model/go" +) + +func testTextParse(t testing.TB) { + var scenarios = []struct { + in string + out []*dto.MetricFamily + }{ + // 0: Empty lines as input. + { + in: ` + +`, + out: []*dto.MetricFamily{}, + }, + // 1: Minimal case. + { + in: ` +minimal_metric 1.234 +another_metric -3e3 103948 +# Even that: +no_labels{} 3 +# HELP line for non-existing metric will be ignored. +`, + out: []*dto.MetricFamily{ + &dto.MetricFamily{ + Name: proto.String("minimal_metric"), + Type: dto.MetricType_UNTYPED.Enum(), + Metric: []*dto.Metric{ + &dto.Metric{ + Untyped: &dto.Untyped{ + Value: proto.Float64(1.234), + }, + }, + }, + }, + &dto.MetricFamily{ + Name: proto.String("another_metric"), + Type: dto.MetricType_UNTYPED.Enum(), + Metric: []*dto.Metric{ + &dto.Metric{ + Untyped: &dto.Untyped{ + Value: proto.Float64(-3e3), + }, + TimestampMs: proto.Int64(103948), + }, + }, + }, + &dto.MetricFamily{ + Name: proto.String("no_labels"), + Type: dto.MetricType_UNTYPED.Enum(), + Metric: []*dto.Metric{ + &dto.Metric{ + Untyped: &dto.Untyped{ + Value: proto.Float64(3), + }, + }, + }, + }, + }, + }, + // 2: Counters & gauges, docstrings, various whitespace, escape sequences. + { + in: ` +# A normal comment. +# +# TYPE name counter +name{labelname="val1",basename="basevalue"} NaN +name {labelname="val2",basename="base\"v\\al\nue"} 0.23 1234567890 +# HELP name two-line\n doc str\\ing + + # HELP name2 doc str"ing 2 + # TYPE name2 gauge +name2{labelname="val2" ,basename = "basevalue2" } +Inf 54321 +name2{ labelname = "val1" , }-Inf +`, + out: []*dto.MetricFamily{ + &dto.MetricFamily{ + Name: proto.String("name"), + Help: proto.String("two-line\n doc str\\ing"), + Type: dto.MetricType_COUNTER.Enum(), + Metric: []*dto.Metric{ + &dto.Metric{ + Label: []*dto.LabelPair{ + &dto.LabelPair{ + Name: proto.String("labelname"), + Value: proto.String("val1"), + }, + &dto.LabelPair{ + Name: proto.String("basename"), + Value: proto.String("basevalue"), + }, + }, + Counter: &dto.Counter{ + Value: proto.Float64(math.NaN()), + }, + }, + &dto.Metric{ + Label: []*dto.LabelPair{ + &dto.LabelPair{ + Name: proto.String("labelname"), + Value: proto.String("val2"), + }, + &dto.LabelPair{ + Name: proto.String("basename"), + Value: proto.String("base\"v\\al\nue"), + }, + }, + Counter: &dto.Counter{ + Value: proto.Float64(.23), + }, + TimestampMs: proto.Int64(1234567890), + }, + }, + }, + &dto.MetricFamily{ + Name: proto.String("name2"), + Help: proto.String("doc str\"ing 2"), + Type: dto.MetricType_GAUGE.Enum(), + Metric: []*dto.Metric{ + &dto.Metric{ + Label: []*dto.LabelPair{ + &dto.LabelPair{ + Name: proto.String("labelname"), + Value: proto.String("val2"), + }, + &dto.LabelPair{ + Name: proto.String("basename"), + Value: proto.String("basevalue2"), + }, + }, + Gauge: &dto.Gauge{ + Value: proto.Float64(math.Inf(+1)), + }, + TimestampMs: proto.Int64(54321), + }, + &dto.Metric{ + Label: []*dto.LabelPair{ + &dto.LabelPair{ + Name: proto.String("labelname"), + Value: proto.String("val1"), + }, + }, + Gauge: &dto.Gauge{ + Value: proto.Float64(math.Inf(-1)), + }, + }, + }, + }, + }, + }, + // 3: The evil summary, mixed with other types and funny comments. + { + in: ` +# TYPE my_summary summary +my_summary{n1="val1",quantile="0.5"} 110 +decoy -1 -2 +my_summary{n1="val1",quantile="0.9"} 140 1 +my_summary_count{n1="val1"} 42 +# Latest timestamp wins in case of a summary. +my_summary_sum{n1="val1"} 4711 2 +fake_sum{n1="val1"} 2001 +# TYPE another_summary summary +another_summary_count{n2="val2",n1="val1"} 20 +my_summary_count{n2="val2",n1="val1"} 5 5 +another_summary{n1="val1",n2="val2",quantile=".3"} -1.2 +my_summary_sum{n1="val2"} 08 15 +my_summary{n1="val3", quantile="0.2"} 4711 + my_summary{n1="val1",n2="val2",quantile="-12.34",} NaN +# some +# funny comments +# HELP +# HELP +# HELP my_summary +# HELP my_summary +`, + out: []*dto.MetricFamily{ + &dto.MetricFamily{ + Name: proto.String("fake_sum"), + Type: dto.MetricType_UNTYPED.Enum(), + Metric: []*dto.Metric{ + &dto.Metric{ + Label: []*dto.LabelPair{ + &dto.LabelPair{ + Name: proto.String("n1"), + Value: proto.String("val1"), + }, + }, + Untyped: &dto.Untyped{ + Value: proto.Float64(2001), + }, + }, + }, + }, + &dto.MetricFamily{ + Name: proto.String("decoy"), + Type: dto.MetricType_UNTYPED.Enum(), + Metric: []*dto.Metric{ + &dto.Metric{ + Untyped: &dto.Untyped{ + Value: proto.Float64(-1), + }, + TimestampMs: proto.Int64(-2), + }, + }, + }, + &dto.MetricFamily{ + Name: proto.String("my_summary"), + Type: dto.MetricType_SUMMARY.Enum(), + Metric: []*dto.Metric{ + &dto.Metric{ + Label: []*dto.LabelPair{ + &dto.LabelPair{ + Name: proto.String("n1"), + Value: proto.String("val1"), + }, + }, + Summary: &dto.Summary{ + SampleCount: proto.Uint64(42), + SampleSum: proto.Float64(4711), + Quantile: []*dto.Quantile{ + &dto.Quantile{ + Quantile: proto.Float64(0.5), + Value: proto.Float64(110), + }, + &dto.Quantile{ + Quantile: proto.Float64(0.9), + Value: proto.Float64(140), + }, + }, + }, + TimestampMs: proto.Int64(2), + }, + &dto.Metric{ + Label: []*dto.LabelPair{ + &dto.LabelPair{ + Name: proto.String("n2"), + Value: proto.String("val2"), + }, + &dto.LabelPair{ + Name: proto.String("n1"), + Value: proto.String("val1"), + }, + }, + Summary: &dto.Summary{ + SampleCount: proto.Uint64(5), + Quantile: []*dto.Quantile{ + &dto.Quantile{ + Quantile: proto.Float64(-12.34), + Value: proto.Float64(math.NaN()), + }, + }, + }, + TimestampMs: proto.Int64(5), + }, + &dto.Metric{ + Label: []*dto.LabelPair{ + &dto.LabelPair{ + Name: proto.String("n1"), + Value: proto.String("val2"), + }, + }, + Summary: &dto.Summary{ + SampleSum: proto.Float64(8), + }, + TimestampMs: proto.Int64(15), + }, + &dto.Metric{ + Label: []*dto.LabelPair{ + &dto.LabelPair{ + Name: proto.String("n1"), + Value: proto.String("val3"), + }, + }, + Summary: &dto.Summary{ + Quantile: []*dto.Quantile{ + &dto.Quantile{ + Quantile: proto.Float64(0.2), + Value: proto.Float64(4711), + }, + }, + }, + }, + }, + }, + &dto.MetricFamily{ + Name: proto.String("another_summary"), + Type: dto.MetricType_SUMMARY.Enum(), + Metric: []*dto.Metric{ + &dto.Metric{ + Label: []*dto.LabelPair{ + &dto.LabelPair{ + Name: proto.String("n2"), + Value: proto.String("val2"), + }, + &dto.LabelPair{ + Name: proto.String("n1"), + Value: proto.String("val1"), + }, + }, + Summary: &dto.Summary{ + SampleCount: proto.Uint64(20), + Quantile: []*dto.Quantile{ + &dto.Quantile{ + Quantile: proto.Float64(0.3), + Value: proto.Float64(-1.2), + }, + }, + }, + }, + }, + }, + }, + }, + // 4: The histogram. + { + in: ` +# HELP request_duration_microseconds The response latency. +# TYPE request_duration_microseconds histogram +request_duration_microseconds_bucket{le="100"} 123 +request_duration_microseconds_bucket{le="120"} 412 +request_duration_microseconds_bucket{le="144"} 592 +request_duration_microseconds_bucket{le="172.8"} 1524 +request_duration_microseconds_bucket{le="+Inf"} 2693 +request_duration_microseconds_sum 1.7560473e+06 +request_duration_microseconds_count 2693 +`, + out: []*dto.MetricFamily{ + { + Name: proto.String("request_duration_microseconds"), + Help: proto.String("The response latency."), + Type: dto.MetricType_HISTOGRAM.Enum(), + Metric: []*dto.Metric{ + &dto.Metric{ + Histogram: &dto.Histogram{ + SampleCount: proto.Uint64(2693), + SampleSum: proto.Float64(1756047.3), + Bucket: []*dto.Bucket{ + &dto.Bucket{ + UpperBound: proto.Float64(100), + CumulativeCount: proto.Uint64(123), + }, + &dto.Bucket{ + UpperBound: proto.Float64(120), + CumulativeCount: proto.Uint64(412), + }, + &dto.Bucket{ + UpperBound: proto.Float64(144), + CumulativeCount: proto.Uint64(592), + }, + &dto.Bucket{ + UpperBound: proto.Float64(172.8), + CumulativeCount: proto.Uint64(1524), + }, + &dto.Bucket{ + UpperBound: proto.Float64(math.Inf(+1)), + CumulativeCount: proto.Uint64(2693), + }, + }, + }, + }, + }, + }, + }, + }, + } + + for i, scenario := range scenarios { + out, err := parser.TextToMetricFamilies(strings.NewReader(scenario.in)) + if err != nil { + t.Errorf("%d. error: %s", i, err) + continue + } + if expected, got := len(scenario.out), len(out); expected != got { + t.Errorf( + "%d. expected %d MetricFamilies, got %d", + i, expected, got, + ) + } + for _, expected := range scenario.out { + got, ok := out[expected.GetName()] + if !ok { + t.Errorf( + "%d. expected MetricFamily %q, found none", + i, expected.GetName(), + ) + continue + } + if expected.String() != got.String() { + t.Errorf( + "%d. expected MetricFamily %s, got %s", + i, expected, got, + ) + } + } + } +} + +func TestTextParse(t *testing.T) { + testTextParse(t) +} + +func BenchmarkTextParse(b *testing.B) { + for i := 0; i < b.N; i++ { + testTextParse(b) + } +} + +func testTextParseError(t testing.TB) { + var scenarios = []struct { + in string + err string + }{ + // 0: No new-line at end of input. + { + in: ` +bla 3.14 +blubber 42`, + err: "text format parsing error in line 3: unexpected end of input stream", + }, + // 1: Invalid escape sequence in label value. + { + in: `metric{label="\t"} 3.14`, + err: "text format parsing error in line 1: invalid escape sequence", + }, + // 2: Newline in label value. + { + in: ` +metric{label="new +line"} 3.14 +`, + err: `text format parsing error in line 2: label value "new" contains unescaped new-line`, + }, + // 3: + { + in: `metric{@="bla"} 3.14`, + err: "text format parsing error in line 1: invalid label name for metric", + }, + // 4: + { + in: `metric{__name__="bla"} 3.14`, + err: `text format parsing error in line 1: label name "__name__" is reserved`, + }, + // 5: + { + in: `metric{label+="bla"} 3.14`, + err: "text format parsing error in line 1: expected '=' after label name", + }, + // 6: + { + in: `metric{label=bla} 3.14`, + err: "text format parsing error in line 1: expected '\"' at start of label value", + }, + // 7: + { + in: ` +# TYPE metric summary +metric{quantile="bla"} 3.14 +`, + err: "text format parsing error in line 3: expected float as value for 'quantile' label", + }, + // 8: + { + in: `metric{label="bla"+} 3.14`, + err: "text format parsing error in line 1: unexpected end of label value", + }, + // 9: + { + in: `metric{label="bla"} 3.14 2.72 +`, + err: "text format parsing error in line 1: expected integer as timestamp", + }, + // 10: + { + in: `metric{label="bla"} 3.14 2 3 +`, + err: "text format parsing error in line 1: spurious string after timestamp", + }, + // 11: + { + in: `metric{label="bla"} blubb +`, + err: "text format parsing error in line 1: expected float as value", + }, + // 12: + { + in: ` +# HELP metric one +# HELP metric two +`, + err: "text format parsing error in line 3: second HELP line for metric name", + }, + // 13: + { + in: ` +# TYPE metric counter +# TYPE metric untyped +`, + err: `text format parsing error in line 3: second TYPE line for metric name "metric", or TYPE reported after samples`, + }, + // 14: + { + in: ` +metric 4.12 +# TYPE metric counter +`, + err: `text format parsing error in line 3: second TYPE line for metric name "metric", or TYPE reported after samples`, + }, + // 14: + { + in: ` +# TYPE metric bla +`, + err: "text format parsing error in line 2: unknown metric type", + }, + // 15: + { + in: ` +# TYPE met-ric +`, + err: "text format parsing error in line 2: invalid metric name in comment", + }, + // 16: + { + in: `@invalidmetric{label="bla"} 3.14 2`, + err: "text format parsing error in line 1: invalid metric name", + }, + // 17: + { + in: `{label="bla"} 3.14 2`, + err: "text format parsing error in line 1: invalid metric name", + }, + // 18: + { + in: ` +# TYPE metric histogram +metric_bucket{le="bla"} 3.14 +`, + err: "text format parsing error in line 3: expected float as value for 'le' label", + }, + // 19: Invalid UTF-8 in label value. + { + in: "metric{l=\"\xbd\"} 3.14\n", + err: "text format parsing error in line 1: invalid label value \"\\xbd\"", + }, + } + + for i, scenario := range scenarios { + _, err := parser.TextToMetricFamilies(strings.NewReader(scenario.in)) + if err == nil { + t.Errorf("%d. expected error, got nil", i) + continue + } + if expected, got := scenario.err, err.Error(); strings.Index(got, expected) != 0 { + t.Errorf( + "%d. expected error starting with %q, got %q", + i, expected, got, + ) + } + } + +} + +func TestTextParseError(t *testing.T) { + testTextParseError(t) +} + +func BenchmarkParseError(b *testing.B) { + for i := 0; i < b.N; i++ { + testTextParseError(b) + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/README.txt b/example/prometheus-mock/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/README.txt new file mode 100644 index 0000000..7723656 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/README.txt @@ -0,0 +1,67 @@ +PACKAGE + +package goautoneg +import "bitbucket.org/ww/goautoneg" + +HTTP Content-Type Autonegotiation. + +The functions in this package implement the behaviour specified in +http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html + +Copyright (c) 2011, Open Knowledge Foundation Ltd. +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 the Open Knowledge Foundation Ltd. 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 +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. + + +FUNCTIONS + +func Negotiate(header string, alternatives []string) (content_type string) +Negotiate the most appropriate content_type given the accept header +and a list of alternatives. + +func ParseAccept(header string) (accept []Accept) +Parse an Accept Header string returning a sorted list +of clauses + + +TYPES + +type Accept struct { + Type, SubType string + Q float32 + Params map[string]string +} +Structure to represent a clause in an HTTP Accept Header + + +SUBDIRECTORIES + + .hg diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg.go b/example/prometheus-mock/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg.go new file mode 100644 index 0000000..648b38c --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg.go @@ -0,0 +1,162 @@ +/* +HTTP Content-Type Autonegotiation. + +The functions in this package implement the behaviour specified in +http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html + +Copyright (c) 2011, Open Knowledge Foundation Ltd. +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 the Open Knowledge Foundation Ltd. 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 +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. + + +*/ +package goautoneg + +import ( + "sort" + "strconv" + "strings" +) + +// Structure to represent a clause in an HTTP Accept Header +type Accept struct { + Type, SubType string + Q float64 + Params map[string]string +} + +// For internal use, so that we can use the sort interface +type accept_slice []Accept + +func (accept accept_slice) Len() int { + slice := []Accept(accept) + return len(slice) +} + +func (accept accept_slice) Less(i, j int) bool { + slice := []Accept(accept) + ai, aj := slice[i], slice[j] + if ai.Q > aj.Q { + return true + } + if ai.Type != "*" && aj.Type == "*" { + return true + } + if ai.SubType != "*" && aj.SubType == "*" { + return true + } + return false +} + +func (accept accept_slice) Swap(i, j int) { + slice := []Accept(accept) + slice[i], slice[j] = slice[j], slice[i] +} + +// Parse an Accept Header string returning a sorted list +// of clauses +func ParseAccept(header string) (accept []Accept) { + parts := strings.Split(header, ",") + accept = make([]Accept, 0, len(parts)) + for _, part := range parts { + part := strings.Trim(part, " ") + + a := Accept{} + a.Params = make(map[string]string) + a.Q = 1.0 + + mrp := strings.Split(part, ";") + + media_range := mrp[0] + sp := strings.Split(media_range, "/") + a.Type = strings.Trim(sp[0], " ") + + switch { + case len(sp) == 1 && a.Type == "*": + a.SubType = "*" + case len(sp) == 2: + a.SubType = strings.Trim(sp[1], " ") + default: + continue + } + + if len(mrp) == 1 { + accept = append(accept, a) + continue + } + + for _, param := range mrp[1:] { + sp := strings.SplitN(param, "=", 2) + if len(sp) != 2 { + continue + } + token := strings.Trim(sp[0], " ") + if token == "q" { + a.Q, _ = strconv.ParseFloat(sp[1], 32) + } else { + a.Params[token] = strings.Trim(sp[1], " ") + } + } + + accept = append(accept, a) + } + + slice := accept_slice(accept) + sort.Sort(slice) + + return +} + +// Negotiate the most appropriate content_type given the accept header +// and a list of alternatives. +func Negotiate(header string, alternatives []string) (content_type string) { + asp := make([][]string, 0, len(alternatives)) + for _, ctype := range alternatives { + asp = append(asp, strings.SplitN(ctype, "/", 2)) + } + for _, clause := range ParseAccept(header) { + for i, ctsp := range asp { + if clause.Type == ctsp[0] && clause.SubType == ctsp[1] { + content_type = alternatives[i] + return + } + if clause.Type == ctsp[0] && clause.SubType == "*" { + content_type = alternatives[i] + return + } + if clause.Type == "*" && clause.SubType == "*" { + content_type = alternatives[i] + return + } + } + } + return +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg_test.go b/example/prometheus-mock/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg_test.go new file mode 100644 index 0000000..41d328f --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg_test.go @@ -0,0 +1,33 @@ +package goautoneg + +import ( + "testing" +) + +var chrome = "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5" + +func TestParseAccept(t *testing.T) { + alternatives := []string{"text/html", "image/png"} + content_type := Negotiate(chrome, alternatives) + if content_type != "image/png" { + t.Errorf("got %s expected image/png", content_type) + } + + alternatives = []string{"text/html", "text/plain", "text/n3"} + content_type = Negotiate(chrome, alternatives) + if content_type != "text/html" { + t.Errorf("got %s expected text/html", content_type) + } + + alternatives = []string{"text/n3", "text/plain"} + content_type = Negotiate(chrome, alternatives) + if content_type != "text/plain" { + t.Errorf("got %s expected text/plain", content_type) + } + + alternatives = []string{"text/n3", "application/rdf+xml"} + content_type = Negotiate(chrome, alternatives) + if content_type != "text/n3" { + t.Errorf("got %s expected text/n3", content_type) + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/log/eventlog_formatter.go b/example/prometheus-mock/vendor/github.com/prometheus/common/log/eventlog_formatter.go new file mode 100644 index 0000000..bcf68e6 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/log/eventlog_formatter.go @@ -0,0 +1,89 @@ +// Copyright 2015 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. + +// +build windows + +package log + +import ( + "fmt" + "os" + + "golang.org/x/sys/windows/svc/eventlog" + + "github.com/sirupsen/logrus" +) + +func init() { + setEventlogFormatter = func(l logger, name string, debugAsInfo bool) error { + if name == "" { + return fmt.Errorf("missing name parameter") + } + + fmter, err := newEventlogger(name, debugAsInfo, l.entry.Logger.Formatter) + if err != nil { + fmt.Fprintf(os.Stderr, "error creating eventlog formatter: %v\n", err) + l.Errorf("can't connect logger to eventlog: %v", err) + return err + } + l.entry.Logger.Formatter = fmter + return nil + } +} + +type eventlogger struct { + log *eventlog.Log + debugAsInfo bool + wrap logrus.Formatter +} + +func newEventlogger(name string, debugAsInfo bool, fmter logrus.Formatter) (*eventlogger, error) { + logHandle, err := eventlog.Open(name) + if err != nil { + return nil, err + } + return &eventlogger{log: logHandle, debugAsInfo: debugAsInfo, wrap: fmter}, nil +} + +func (s *eventlogger) Format(e *logrus.Entry) ([]byte, error) { + data, err := s.wrap.Format(e) + if err != nil { + fmt.Fprintf(os.Stderr, "eventlogger: can't format entry: %v\n", err) + return data, err + } + + switch e.Level { + case logrus.PanicLevel: + fallthrough + case logrus.FatalLevel: + fallthrough + case logrus.ErrorLevel: + err = s.log.Error(102, e.Message) + case logrus.WarnLevel: + err = s.log.Warning(101, e.Message) + case logrus.InfoLevel: + err = s.log.Info(100, e.Message) + case logrus.DebugLevel: + if s.debugAsInfo { + err = s.log.Info(100, e.Message) + } + default: + err = s.log.Info(100, e.Message) + } + + if err != nil { + fmt.Fprintf(os.Stderr, "eventlogger: can't send log to eventlog: %v\n", err) + } + + return data, err +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/log/log.go b/example/prometheus-mock/vendor/github.com/prometheus/common/log/log.go new file mode 100644 index 0000000..c167fff --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/log/log.go @@ -0,0 +1,364 @@ +// Copyright 2015 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 log + +import ( + "fmt" + "io" + "io/ioutil" + "log" + "net/url" + "os" + "runtime" + "strconv" + "strings" + + "github.com/sirupsen/logrus" + "gopkg.in/alecthomas/kingpin.v2" +) + +// setSyslogFormatter is nil if the target architecture does not support syslog. +var setSyslogFormatter func(logger, string, string) error + +// setEventlogFormatter is nil if the target OS does not support Eventlog (i.e., is not Windows). +var setEventlogFormatter func(logger, string, bool) error + +func setJSONFormatter() { + origLogger.Formatter = &logrus.JSONFormatter{} +} + +type loggerSettings struct { + level string + format string +} + +func (s *loggerSettings) apply(ctx *kingpin.ParseContext) error { + err := baseLogger.SetLevel(s.level) + if err != nil { + return err + } + err = baseLogger.SetFormat(s.format) + return err +} + +// AddFlags adds the flags used by this package to the Kingpin application. +// To use the default Kingpin application, call AddFlags(kingpin.CommandLine) +func AddFlags(a *kingpin.Application) { + s := loggerSettings{} + kingpin.Flag("log.level", "Only log messages with the given severity or above. Valid levels: [debug, info, warn, error, fatal]"). + Default(origLogger.Level.String()). + StringVar(&s.level) + defaultFormat := url.URL{Scheme: "logger", Opaque: "stderr"} + kingpin.Flag("log.format", `Set the log target and format. Example: "logger:syslog?appname=bob&local=7" or "logger:stdout?json=true"`). + Default(defaultFormat.String()). + StringVar(&s.format) + a.Action(s.apply) +} + +// Logger is the interface for loggers used in the Prometheus components. +type Logger interface { + Debug(...interface{}) + Debugln(...interface{}) + Debugf(string, ...interface{}) + + Info(...interface{}) + Infoln(...interface{}) + Infof(string, ...interface{}) + + Warn(...interface{}) + Warnln(...interface{}) + Warnf(string, ...interface{}) + + Error(...interface{}) + Errorln(...interface{}) + Errorf(string, ...interface{}) + + Fatal(...interface{}) + Fatalln(...interface{}) + Fatalf(string, ...interface{}) + + With(key string, value interface{}) Logger + + SetFormat(string) error + SetLevel(string) error +} + +type logger struct { + entry *logrus.Entry +} + +func (l logger) With(key string, value interface{}) Logger { + return logger{l.entry.WithField(key, value)} +} + +// Debug logs a message at level Debug on the standard logger. +func (l logger) Debug(args ...interface{}) { + l.sourced().Debug(args...) +} + +// Debug logs a message at level Debug on the standard logger. +func (l logger) Debugln(args ...interface{}) { + l.sourced().Debugln(args...) +} + +// Debugf logs a message at level Debug on the standard logger. +func (l logger) Debugf(format string, args ...interface{}) { + l.sourced().Debugf(format, args...) +} + +// Info logs a message at level Info on the standard logger. +func (l logger) Info(args ...interface{}) { + l.sourced().Info(args...) +} + +// Info logs a message at level Info on the standard logger. +func (l logger) Infoln(args ...interface{}) { + l.sourced().Infoln(args...) +} + +// Infof logs a message at level Info on the standard logger. +func (l logger) Infof(format string, args ...interface{}) { + l.sourced().Infof(format, args...) +} + +// Warn logs a message at level Warn on the standard logger. +func (l logger) Warn(args ...interface{}) { + l.sourced().Warn(args...) +} + +// Warn logs a message at level Warn on the standard logger. +func (l logger) Warnln(args ...interface{}) { + l.sourced().Warnln(args...) +} + +// Warnf logs a message at level Warn on the standard logger. +func (l logger) Warnf(format string, args ...interface{}) { + l.sourced().Warnf(format, args...) +} + +// Error logs a message at level Error on the standard logger. +func (l logger) Error(args ...interface{}) { + l.sourced().Error(args...) +} + +// Error logs a message at level Error on the standard logger. +func (l logger) Errorln(args ...interface{}) { + l.sourced().Errorln(args...) +} + +// Errorf logs a message at level Error on the standard logger. +func (l logger) Errorf(format string, args ...interface{}) { + l.sourced().Errorf(format, args...) +} + +// Fatal logs a message at level Fatal on the standard logger. +func (l logger) Fatal(args ...interface{}) { + l.sourced().Fatal(args...) +} + +// Fatal logs a message at level Fatal on the standard logger. +func (l logger) Fatalln(args ...interface{}) { + l.sourced().Fatalln(args...) +} + +// Fatalf logs a message at level Fatal on the standard logger. +func (l logger) Fatalf(format string, args ...interface{}) { + l.sourced().Fatalf(format, args...) +} + +func (l logger) SetLevel(level string) error { + lvl, err := logrus.ParseLevel(level) + if err != nil { + return err + } + + l.entry.Logger.Level = lvl + return nil +} + +func (l logger) SetFormat(format string) error { + u, err := url.Parse(format) + if err != nil { + return err + } + if u.Scheme != "logger" { + return fmt.Errorf("invalid scheme %s", u.Scheme) + } + jsonq := u.Query().Get("json") + if jsonq == "true" { + setJSONFormatter() + } + + switch u.Opaque { + case "syslog": + if setSyslogFormatter == nil { + return fmt.Errorf("system does not support syslog") + } + appname := u.Query().Get("appname") + facility := u.Query().Get("local") + return setSyslogFormatter(l, appname, facility) + case "eventlog": + if setEventlogFormatter == nil { + return fmt.Errorf("system does not support eventlog") + } + name := u.Query().Get("name") + debugAsInfo := false + debugAsInfoRaw := u.Query().Get("debugAsInfo") + if parsedDebugAsInfo, err := strconv.ParseBool(debugAsInfoRaw); err == nil { + debugAsInfo = parsedDebugAsInfo + } + return setEventlogFormatter(l, name, debugAsInfo) + case "stdout": + l.entry.Logger.Out = os.Stdout + case "stderr": + l.entry.Logger.Out = os.Stderr + default: + return fmt.Errorf("unsupported logger %q", u.Opaque) + } + return nil +} + +// sourced adds a source field to the logger that contains +// the file name and line where the logging happened. +func (l logger) sourced() *logrus.Entry { + _, file, line, ok := runtime.Caller(2) + if !ok { + file = "" + line = 1 + } else { + slash := strings.LastIndex(file, "/") + file = file[slash+1:] + } + return l.entry.WithField("source", fmt.Sprintf("%s:%d", file, line)) +} + +var origLogger = logrus.New() +var baseLogger = logger{entry: logrus.NewEntry(origLogger)} + +// Base returns the default Logger logging to +func Base() Logger { + return baseLogger +} + +// NewLogger returns a new Logger logging to out. +func NewLogger(w io.Writer) Logger { + l := logrus.New() + l.Out = w + return logger{entry: logrus.NewEntry(l)} +} + +// NewNopLogger returns a logger that discards all log messages. +func NewNopLogger() Logger { + l := logrus.New() + l.Out = ioutil.Discard + return logger{entry: logrus.NewEntry(l)} +} + +// With adds a field to the logger. +func With(key string, value interface{}) Logger { + return baseLogger.With(key, value) +} + +// Debug logs a message at level Debug on the standard logger. +func Debug(args ...interface{}) { + baseLogger.sourced().Debug(args...) +} + +// Debugln logs a message at level Debug on the standard logger. +func Debugln(args ...interface{}) { + baseLogger.sourced().Debugln(args...) +} + +// Debugf logs a message at level Debug on the standard logger. +func Debugf(format string, args ...interface{}) { + baseLogger.sourced().Debugf(format, args...) +} + +// Info logs a message at level Info on the standard logger. +func Info(args ...interface{}) { + baseLogger.sourced().Info(args...) +} + +// Infoln logs a message at level Info on the standard logger. +func Infoln(args ...interface{}) { + baseLogger.sourced().Infoln(args...) +} + +// Infof logs a message at level Info on the standard logger. +func Infof(format string, args ...interface{}) { + baseLogger.sourced().Infof(format, args...) +} + +// Warn logs a message at level Warn on the standard logger. +func Warn(args ...interface{}) { + baseLogger.sourced().Warn(args...) +} + +// Warnln logs a message at level Warn on the standard logger. +func Warnln(args ...interface{}) { + baseLogger.sourced().Warnln(args...) +} + +// Warnf logs a message at level Warn on the standard logger. +func Warnf(format string, args ...interface{}) { + baseLogger.sourced().Warnf(format, args...) +} + +// Error logs a message at level Error on the standard logger. +func Error(args ...interface{}) { + baseLogger.sourced().Error(args...) +} + +// Errorln logs a message at level Error on the standard logger. +func Errorln(args ...interface{}) { + baseLogger.sourced().Errorln(args...) +} + +// Errorf logs a message at level Error on the standard logger. +func Errorf(format string, args ...interface{}) { + baseLogger.sourced().Errorf(format, args...) +} + +// Fatal logs a message at level Fatal on the standard logger. +func Fatal(args ...interface{}) { + baseLogger.sourced().Fatal(args...) +} + +// Fatalln logs a message at level Fatal on the standard logger. +func Fatalln(args ...interface{}) { + baseLogger.sourced().Fatalln(args...) +} + +// Fatalf logs a message at level Fatal on the standard logger. +func Fatalf(format string, args ...interface{}) { + baseLogger.sourced().Fatalf(format, args...) +} + +// AddHook adds hook to Prometheus' original logger. +func AddHook(hook logrus.Hook) { + origLogger.Hooks.Add(hook) +} + +type errorLogWriter struct{} + +func (errorLogWriter) Write(b []byte) (int, error) { + baseLogger.sourced().Error(string(b)) + return len(b), nil +} + +// NewErrorLogger returns a log.Logger that is meant to be used +// in the ErrorLog field of an http.Server to log HTTP server errors. +func NewErrorLogger() *log.Logger { + return log.New(&errorLogWriter{}, "", 0) +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/log/log_test.go b/example/prometheus-mock/vendor/github.com/prometheus/common/log/log_test.go new file mode 100644 index 0000000..f63b441 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/log/log_test.go @@ -0,0 +1,39 @@ +// Copyright 2015 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 log + +import ( + "bytes" + "regexp" + "testing" + + "github.com/sirupsen/logrus" +) + +func TestFileLineLogging(t *testing.T) { + var buf bytes.Buffer + origLogger.Out = &buf + origLogger.Formatter = &logrus.TextFormatter{ + DisableColors: true, + } + + // The default logging level should be "info". + Debug("This debug-level line should not show up in the output.") + Infof("This %s-level line should show up in the output.", "info") + + re := `^time=".*" level=info msg="This info-level line should show up in the output." source="log_test.go:33"\n$` + if !regexp.MustCompile(re).Match(buf.Bytes()) { + t.Fatalf("%q did not match expected regex %q", buf.String(), re) + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/log/syslog_formatter.go b/example/prometheus-mock/vendor/github.com/prometheus/common/log/syslog_formatter.go new file mode 100644 index 0000000..f882f2f --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/log/syslog_formatter.go @@ -0,0 +1,126 @@ +// Copyright 2015 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. + +// +build !windows,!nacl,!plan9 + +package log + +import ( + "fmt" + "log/syslog" + "os" + + "github.com/sirupsen/logrus" +) + +var _ logrus.Formatter = (*syslogger)(nil) + +func init() { + setSyslogFormatter = func(l logger, appname, local string) error { + if appname == "" { + return fmt.Errorf("missing appname parameter") + } + if local == "" { + return fmt.Errorf("missing local parameter") + } + + fmter, err := newSyslogger(appname, local, l.entry.Logger.Formatter) + if err != nil { + fmt.Fprintf(os.Stderr, "error creating syslog formatter: %v\n", err) + l.entry.Errorf("can't connect logger to syslog: %v", err) + return err + } + l.entry.Logger.Formatter = fmter + return nil + } +} + +var prefixTag []byte + +type syslogger struct { + wrap logrus.Formatter + out *syslog.Writer +} + +func newSyslogger(appname string, facility string, fmter logrus.Formatter) (*syslogger, error) { + priority, err := getFacility(facility) + if err != nil { + return nil, err + } + out, err := syslog.New(priority, appname) + _, isJSON := fmter.(*logrus.JSONFormatter) + if isJSON { + // add cee tag to json formatted syslogs + prefixTag = []byte("@cee:") + } + return &syslogger{ + out: out, + wrap: fmter, + }, err +} + +func getFacility(facility string) (syslog.Priority, error) { + switch facility { + case "0": + return syslog.LOG_LOCAL0, nil + case "1": + return syslog.LOG_LOCAL1, nil + case "2": + return syslog.LOG_LOCAL2, nil + case "3": + return syslog.LOG_LOCAL3, nil + case "4": + return syslog.LOG_LOCAL4, nil + case "5": + return syslog.LOG_LOCAL5, nil + case "6": + return syslog.LOG_LOCAL6, nil + case "7": + return syslog.LOG_LOCAL7, nil + } + return syslog.LOG_LOCAL0, fmt.Errorf("invalid local(%s) for syslog", facility) +} + +func (s *syslogger) Format(e *logrus.Entry) ([]byte, error) { + data, err := s.wrap.Format(e) + if err != nil { + fmt.Fprintf(os.Stderr, "syslogger: can't format entry: %v\n", err) + return data, err + } + // only append tag to data sent to syslog (line), not to what + // is returned + line := string(append(prefixTag, data...)) + + switch e.Level { + case logrus.PanicLevel: + err = s.out.Crit(line) + case logrus.FatalLevel: + err = s.out.Crit(line) + case logrus.ErrorLevel: + err = s.out.Err(line) + case logrus.WarnLevel: + err = s.out.Warning(line) + case logrus.InfoLevel: + err = s.out.Info(line) + case logrus.DebugLevel: + err = s.out.Debug(line) + default: + err = s.out.Notice(line) + } + + if err != nil { + fmt.Fprintf(os.Stderr, "syslogger: can't send log to syslog: %v\n", err) + } + + return data, err +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/log/syslog_formatter_test.go b/example/prometheus-mock/vendor/github.com/prometheus/common/log/syslog_formatter_test.go new file mode 100644 index 0000000..b7e6884 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/log/syslog_formatter_test.go @@ -0,0 +1,52 @@ +// Copyright 2015 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. + +// +build !windows,!nacl,!plan9 + +package log + +import ( + "errors" + "log/syslog" + "testing" +) + +func TestGetFacility(t *testing.T) { + testCases := []struct { + facility string + expectedPriority syslog.Priority + expectedErr error + }{ + {"0", syslog.LOG_LOCAL0, nil}, + {"1", syslog.LOG_LOCAL1, nil}, + {"2", syslog.LOG_LOCAL2, nil}, + {"3", syslog.LOG_LOCAL3, nil}, + {"4", syslog.LOG_LOCAL4, nil}, + {"5", syslog.LOG_LOCAL5, nil}, + {"6", syslog.LOG_LOCAL6, nil}, + {"7", syslog.LOG_LOCAL7, nil}, + {"8", syslog.LOG_LOCAL0, errors.New("invalid local(8) for syslog")}, + } + for _, tc := range testCases { + priority, err := getFacility(tc.facility) + if err != tc.expectedErr { + if err.Error() != tc.expectedErr.Error() { + t.Errorf("want %s, got %s", tc.expectedErr.Error(), err.Error()) + } + } + + if priority != tc.expectedPriority { + t.Errorf("want %q, got %q", tc.expectedPriority, priority) + } + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/model/alert.go b/example/prometheus-mock/vendor/github.com/prometheus/common/model/alert.go new file mode 100644 index 0000000..35e739c --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/model/alert.go @@ -0,0 +1,136 @@ +// Copyright 2013 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 model + +import ( + "fmt" + "time" +) + +type AlertStatus string + +const ( + AlertFiring AlertStatus = "firing" + AlertResolved AlertStatus = "resolved" +) + +// Alert is a generic representation of an alert in the Prometheus eco-system. +type Alert struct { + // Label value pairs for purpose of aggregation, matching, and disposition + // dispatching. This must minimally include an "alertname" label. + Labels LabelSet `json:"labels"` + + // Extra key/value information which does not define alert identity. + Annotations LabelSet `json:"annotations"` + + // The known time range for this alert. Both ends are optional. + StartsAt time.Time `json:"startsAt,omitempty"` + EndsAt time.Time `json:"endsAt,omitempty"` + GeneratorURL string `json:"generatorURL"` +} + +// Name returns the name of the alert. It is equivalent to the "alertname" label. +func (a *Alert) Name() string { + return string(a.Labels[AlertNameLabel]) +} + +// Fingerprint returns a unique hash for the alert. It is equivalent to +// the fingerprint of the alert's label set. +func (a *Alert) Fingerprint() Fingerprint { + return a.Labels.Fingerprint() +} + +func (a *Alert) String() string { + s := fmt.Sprintf("%s[%s]", a.Name(), a.Fingerprint().String()[:7]) + if a.Resolved() { + return s + "[resolved]" + } + return s + "[active]" +} + +// Resolved returns true iff the activity interval ended in the past. +func (a *Alert) Resolved() bool { + return a.ResolvedAt(time.Now()) +} + +// ResolvedAt returns true off the activity interval ended before +// the given timestamp. +func (a *Alert) ResolvedAt(ts time.Time) bool { + if a.EndsAt.IsZero() { + return false + } + return !a.EndsAt.After(ts) +} + +// Status returns the status of the alert. +func (a *Alert) Status() AlertStatus { + if a.Resolved() { + return AlertResolved + } + return AlertFiring +} + +// Validate checks whether the alert data is inconsistent. +func (a *Alert) Validate() error { + if a.StartsAt.IsZero() { + return fmt.Errorf("start time missing") + } + if !a.EndsAt.IsZero() && a.EndsAt.Before(a.StartsAt) { + return fmt.Errorf("start time must be before end time") + } + if err := a.Labels.Validate(); err != nil { + return fmt.Errorf("invalid label set: %s", err) + } + if len(a.Labels) == 0 { + return fmt.Errorf("at least one label pair required") + } + if err := a.Annotations.Validate(); err != nil { + return fmt.Errorf("invalid annotations: %s", err) + } + return nil +} + +// Alert is a list of alerts that can be sorted in chronological order. +type Alerts []*Alert + +func (as Alerts) Len() int { return len(as) } +func (as Alerts) Swap(i, j int) { as[i], as[j] = as[j], as[i] } + +func (as Alerts) Less(i, j int) bool { + if as[i].StartsAt.Before(as[j].StartsAt) { + return true + } + if as[i].EndsAt.Before(as[j].EndsAt) { + return true + } + return as[i].Fingerprint() < as[j].Fingerprint() +} + +// HasFiring returns true iff one of the alerts is not resolved. +func (as Alerts) HasFiring() bool { + for _, a := range as { + if !a.Resolved() { + return true + } + } + return false +} + +// Status returns StatusFiring iff at least one of the alerts is firing. +func (as Alerts) Status() AlertStatus { + if as.HasFiring() { + return AlertFiring + } + return AlertResolved +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/model/alert_test.go b/example/prometheus-mock/vendor/github.com/prometheus/common/model/alert_test.go new file mode 100644 index 0000000..9692bca --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/model/alert_test.go @@ -0,0 +1,118 @@ +// Copyright 2013 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 model + +import ( + "strings" + "testing" + "time" +) + +func TestAlertValidate(t *testing.T) { + ts := time.Now() + + var cases = []struct { + alert *Alert + err string + }{ + { + alert: &Alert{ + Labels: LabelSet{"a": "b"}, + StartsAt: ts, + }, + }, + { + alert: &Alert{ + Labels: LabelSet{"a": "b"}, + }, + err: "start time missing", + }, + { + alert: &Alert{ + Labels: LabelSet{"a": "b"}, + StartsAt: ts, + EndsAt: ts, + }, + }, + { + alert: &Alert{ + Labels: LabelSet{"a": "b"}, + StartsAt: ts, + EndsAt: ts.Add(1 * time.Minute), + }, + }, + { + alert: &Alert{ + Labels: LabelSet{"a": "b"}, + StartsAt: ts, + EndsAt: ts.Add(-1 * time.Minute), + }, + err: "start time must be before end time", + }, + { + alert: &Alert{ + StartsAt: ts, + }, + err: "at least one label pair required", + }, + { + alert: &Alert{ + Labels: LabelSet{"a": "b", "!bad": "label"}, + StartsAt: ts, + }, + err: "invalid label set: invalid name", + }, + { + alert: &Alert{ + Labels: LabelSet{"a": "b", "bad": "\xfflabel"}, + StartsAt: ts, + }, + err: "invalid label set: invalid value", + }, + { + alert: &Alert{ + Labels: LabelSet{"a": "b"}, + Annotations: LabelSet{"!bad": "label"}, + StartsAt: ts, + }, + err: "invalid annotations: invalid name", + }, + { + alert: &Alert{ + Labels: LabelSet{"a": "b"}, + Annotations: LabelSet{"bad": "\xfflabel"}, + StartsAt: ts, + }, + err: "invalid annotations: invalid value", + }, + } + + for i, c := range cases { + err := c.alert.Validate() + if err == nil { + if c.err == "" { + continue + } + t.Errorf("%d. Expected error %q but got none", i, c.err) + continue + } + if c.err == "" && err != nil { + t.Errorf("%d. Expected no error but got %q", i, err) + continue + } + if !strings.Contains(err.Error(), c.err) { + t.Errorf("%d. Expected error to contain %q but got %q", i, c.err, err) + } + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/model/fingerprinting.go b/example/prometheus-mock/vendor/github.com/prometheus/common/model/fingerprinting.go new file mode 100644 index 0000000..fc4de41 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/model/fingerprinting.go @@ -0,0 +1,105 @@ +// Copyright 2013 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 model + +import ( + "fmt" + "strconv" +) + +// Fingerprint provides a hash-capable representation of a Metric. +// For our purposes, FNV-1A 64-bit is used. +type Fingerprint uint64 + +// FingerprintFromString transforms a string representation into a Fingerprint. +func FingerprintFromString(s string) (Fingerprint, error) { + num, err := strconv.ParseUint(s, 16, 64) + return Fingerprint(num), err +} + +// ParseFingerprint parses the input string into a fingerprint. +func ParseFingerprint(s string) (Fingerprint, error) { + num, err := strconv.ParseUint(s, 16, 64) + if err != nil { + return 0, err + } + return Fingerprint(num), nil +} + +func (f Fingerprint) String() string { + return fmt.Sprintf("%016x", uint64(f)) +} + +// Fingerprints represents a collection of Fingerprint subject to a given +// natural sorting scheme. It implements sort.Interface. +type Fingerprints []Fingerprint + +// Len implements sort.Interface. +func (f Fingerprints) Len() int { + return len(f) +} + +// Less implements sort.Interface. +func (f Fingerprints) Less(i, j int) bool { + return f[i] < f[j] +} + +// Swap implements sort.Interface. +func (f Fingerprints) Swap(i, j int) { + f[i], f[j] = f[j], f[i] +} + +// FingerprintSet is a set of Fingerprints. +type FingerprintSet map[Fingerprint]struct{} + +// Equal returns true if both sets contain the same elements (and not more). +func (s FingerprintSet) Equal(o FingerprintSet) bool { + if len(s) != len(o) { + return false + } + + for k := range s { + if _, ok := o[k]; !ok { + return false + } + } + + return true +} + +// Intersection returns the elements contained in both sets. +func (s FingerprintSet) Intersection(o FingerprintSet) FingerprintSet { + myLength, otherLength := len(s), len(o) + if myLength == 0 || otherLength == 0 { + return FingerprintSet{} + } + + subSet := s + superSet := o + + if otherLength < myLength { + subSet = o + superSet = s + } + + out := FingerprintSet{} + + for k := range subSet { + if _, ok := superSet[k]; ok { + out[k] = struct{}{} + } + } + + return out +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/model/fnv.go b/example/prometheus-mock/vendor/github.com/prometheus/common/model/fnv.go new file mode 100644 index 0000000..038fc1c --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/model/fnv.go @@ -0,0 +1,42 @@ +// Copyright 2015 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 model + +// Inline and byte-free variant of hash/fnv's fnv64a. + +const ( + offset64 = 14695981039346656037 + prime64 = 1099511628211 +) + +// hashNew initializies a new fnv64a hash value. +func hashNew() uint64 { + return offset64 +} + +// hashAdd adds a string to a fnv64a hash value, returning the updated hash. +func hashAdd(h uint64, s string) uint64 { + for i := 0; i < len(s); i++ { + h ^= uint64(s[i]) + h *= prime64 + } + return h +} + +// hashAddByte adds a byte to a fnv64a hash value, returning the updated hash. +func hashAddByte(h uint64, b byte) uint64 { + h ^= uint64(b) + h *= prime64 + return h +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/model/labels.go b/example/prometheus-mock/vendor/github.com/prometheus/common/model/labels.go new file mode 100644 index 0000000..41051a0 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/model/labels.go @@ -0,0 +1,210 @@ +// Copyright 2013 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 model + +import ( + "encoding/json" + "fmt" + "regexp" + "strings" + "unicode/utf8" +) + +const ( + // AlertNameLabel is the name of the label containing the an alert's name. + AlertNameLabel = "alertname" + + // ExportedLabelPrefix is the prefix to prepend to the label names present in + // exported metrics if a label of the same name is added by the server. + ExportedLabelPrefix = "exported_" + + // MetricNameLabel is the label name indicating the metric name of a + // timeseries. + MetricNameLabel = "__name__" + + // SchemeLabel is the name of the label that holds the scheme on which to + // scrape a target. + SchemeLabel = "__scheme__" + + // AddressLabel is the name of the label that holds the address of + // a scrape target. + AddressLabel = "__address__" + + // MetricsPathLabel is the name of the label that holds the path on which to + // scrape a target. + MetricsPathLabel = "__metrics_path__" + + // ReservedLabelPrefix is a prefix which is not legal in user-supplied + // label names. + ReservedLabelPrefix = "__" + + // MetaLabelPrefix is a prefix for labels that provide meta information. + // Labels with this prefix are used for intermediate label processing and + // will not be attached to time series. + MetaLabelPrefix = "__meta_" + + // TmpLabelPrefix is a prefix for temporary labels as part of relabelling. + // Labels with this prefix are used for intermediate label processing and + // will not be attached to time series. This is reserved for use in + // Prometheus configuration files by users. + TmpLabelPrefix = "__tmp_" + + // ParamLabelPrefix is a prefix for labels that provide URL parameters + // used to scrape a target. + ParamLabelPrefix = "__param_" + + // JobLabel is the label name indicating the job from which a timeseries + // was scraped. + JobLabel = "job" + + // InstanceLabel is the label name used for the instance label. + InstanceLabel = "instance" + + // BucketLabel is used for the label that defines the upper bound of a + // bucket of a histogram ("le" -> "less or equal"). + BucketLabel = "le" + + // QuantileLabel is used for the label that defines the quantile in a + // summary. + QuantileLabel = "quantile" +) + +// LabelNameRE is a regular expression matching valid label names. Note that the +// IsValid method of LabelName performs the same check but faster than a match +// with this regular expression. +var LabelNameRE = regexp.MustCompile("^[a-zA-Z_][a-zA-Z0-9_]*$") + +// A LabelName is a key for a LabelSet or Metric. It has a value associated +// therewith. +type LabelName string + +// IsValid is true iff the label name matches the pattern of LabelNameRE. This +// method, however, does not use LabelNameRE for the check but a much faster +// hardcoded implementation. +func (ln LabelName) IsValid() bool { + if len(ln) == 0 { + return false + } + for i, b := range ln { + if !((b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_' || (b >= '0' && b <= '9' && i > 0)) { + return false + } + } + return true +} + +// UnmarshalYAML implements the yaml.Unmarshaler interface. +func (ln *LabelName) UnmarshalYAML(unmarshal func(interface{}) error) error { + var s string + if err := unmarshal(&s); err != nil { + return err + } + if !LabelName(s).IsValid() { + return fmt.Errorf("%q is not a valid label name", s) + } + *ln = LabelName(s) + return nil +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (ln *LabelName) UnmarshalJSON(b []byte) error { + var s string + if err := json.Unmarshal(b, &s); err != nil { + return err + } + if !LabelName(s).IsValid() { + return fmt.Errorf("%q is not a valid label name", s) + } + *ln = LabelName(s) + return nil +} + +// LabelNames is a sortable LabelName slice. In implements sort.Interface. +type LabelNames []LabelName + +func (l LabelNames) Len() int { + return len(l) +} + +func (l LabelNames) Less(i, j int) bool { + return l[i] < l[j] +} + +func (l LabelNames) Swap(i, j int) { + l[i], l[j] = l[j], l[i] +} + +func (l LabelNames) String() string { + labelStrings := make([]string, 0, len(l)) + for _, label := range l { + labelStrings = append(labelStrings, string(label)) + } + return strings.Join(labelStrings, ", ") +} + +// A LabelValue is an associated value for a LabelName. +type LabelValue string + +// IsValid returns true iff the string is a valid UTF8. +func (lv LabelValue) IsValid() bool { + return utf8.ValidString(string(lv)) +} + +// LabelValues is a sortable LabelValue slice. It implements sort.Interface. +type LabelValues []LabelValue + +func (l LabelValues) Len() int { + return len(l) +} + +func (l LabelValues) Less(i, j int) bool { + return string(l[i]) < string(l[j]) +} + +func (l LabelValues) Swap(i, j int) { + l[i], l[j] = l[j], l[i] +} + +// LabelPair pairs a name with a value. +type LabelPair struct { + Name LabelName + Value LabelValue +} + +// LabelPairs is a sortable slice of LabelPair pointers. It implements +// sort.Interface. +type LabelPairs []*LabelPair + +func (l LabelPairs) Len() int { + return len(l) +} + +func (l LabelPairs) Less(i, j int) bool { + switch { + case l[i].Name > l[j].Name: + return false + case l[i].Name < l[j].Name: + return true + case l[i].Value > l[j].Value: + return false + case l[i].Value < l[j].Value: + return true + default: + return false + } +} + +func (l LabelPairs) Swap(i, j int) { + l[i], l[j] = l[j], l[i] +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/model/labels_test.go b/example/prometheus-mock/vendor/github.com/prometheus/common/model/labels_test.go new file mode 100644 index 0000000..e8df28f --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/model/labels_test.go @@ -0,0 +1,140 @@ +// Copyright 2013 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 model + +import ( + "sort" + "testing" +) + +func testLabelNames(t testing.TB) { + var scenarios = []struct { + in LabelNames + out LabelNames + }{ + { + in: LabelNames{"ZZZ", "zzz"}, + out: LabelNames{"ZZZ", "zzz"}, + }, + { + in: LabelNames{"aaa", "AAA"}, + out: LabelNames{"AAA", "aaa"}, + }, + } + + for i, scenario := range scenarios { + sort.Sort(scenario.in) + + for j, expected := range scenario.out { + if expected != scenario.in[j] { + t.Errorf("%d.%d expected %s, got %s", i, j, expected, scenario.in[j]) + } + } + } +} + +func TestLabelNames(t *testing.T) { + testLabelNames(t) +} + +func BenchmarkLabelNames(b *testing.B) { + for i := 0; i < b.N; i++ { + testLabelNames(b) + } +} + +func testLabelValues(t testing.TB) { + var scenarios = []struct { + in LabelValues + out LabelValues + }{ + { + in: LabelValues{"ZZZ", "zzz"}, + out: LabelValues{"ZZZ", "zzz"}, + }, + { + in: LabelValues{"aaa", "AAA"}, + out: LabelValues{"AAA", "aaa"}, + }, + } + + for i, scenario := range scenarios { + sort.Sort(scenario.in) + + for j, expected := range scenario.out { + if expected != scenario.in[j] { + t.Errorf("%d.%d expected %s, got %s", i, j, expected, scenario.in[j]) + } + } + } +} + +func TestLabelValues(t *testing.T) { + testLabelValues(t) +} + +func BenchmarkLabelValues(b *testing.B) { + for i := 0; i < b.N; i++ { + testLabelValues(b) + } +} + +func TestLabelNameIsValid(t *testing.T) { + var scenarios = []struct { + ln LabelName + valid bool + }{ + { + ln: "Avalid_23name", + valid: true, + }, + { + ln: "_Avalid_23name", + valid: true, + }, + { + ln: "1valid_23name", + valid: false, + }, + { + ln: "avalid_23name", + valid: true, + }, + { + ln: "Ava:lid_23name", + valid: false, + }, + { + ln: "a lid_23name", + valid: false, + }, + { + ln: ":leading_colon", + valid: false, + }, + { + ln: "colon:in:the:middle", + valid: false, + }, + } + + for _, s := range scenarios { + if s.ln.IsValid() != s.valid { + t.Errorf("Expected %v for %q using IsValid method", s.valid, s.ln) + } + if LabelNameRE.MatchString(string(s.ln)) != s.valid { + t.Errorf("Expected %v for %q using regexp match", s.valid, s.ln) + } + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/model/labelset.go b/example/prometheus-mock/vendor/github.com/prometheus/common/model/labelset.go new file mode 100644 index 0000000..6eda08a --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/model/labelset.go @@ -0,0 +1,169 @@ +// Copyright 2013 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 model + +import ( + "encoding/json" + "fmt" + "sort" + "strings" +) + +// A LabelSet is a collection of LabelName and LabelValue pairs. The LabelSet +// may be fully-qualified down to the point where it may resolve to a single +// Metric in the data store or not. All operations that occur within the realm +// of a LabelSet can emit a vector of Metric entities to which the LabelSet may +// match. +type LabelSet map[LabelName]LabelValue + +// Validate checks whether all names and values in the label set +// are valid. +func (ls LabelSet) Validate() error { + for ln, lv := range ls { + if !ln.IsValid() { + return fmt.Errorf("invalid name %q", ln) + } + if !lv.IsValid() { + return fmt.Errorf("invalid value %q", lv) + } + } + return nil +} + +// Equal returns true iff both label sets have exactly the same key/value pairs. +func (ls LabelSet) Equal(o LabelSet) bool { + if len(ls) != len(o) { + return false + } + for ln, lv := range ls { + olv, ok := o[ln] + if !ok { + return false + } + if olv != lv { + return false + } + } + return true +} + +// Before compares the metrics, using the following criteria: +// +// If m has fewer labels than o, it is before o. If it has more, it is not. +// +// If the number of labels is the same, the superset of all label names is +// sorted alphanumerically. The first differing label pair found in that order +// determines the outcome: If the label does not exist at all in m, then m is +// before o, and vice versa. Otherwise the label value is compared +// alphanumerically. +// +// If m and o are equal, the method returns false. +func (ls LabelSet) Before(o LabelSet) bool { + if len(ls) < len(o) { + return true + } + if len(ls) > len(o) { + return false + } + + lns := make(LabelNames, 0, len(ls)+len(o)) + for ln := range ls { + lns = append(lns, ln) + } + for ln := range o { + lns = append(lns, ln) + } + // It's probably not worth it to de-dup lns. + sort.Sort(lns) + for _, ln := range lns { + mlv, ok := ls[ln] + if !ok { + return true + } + olv, ok := o[ln] + if !ok { + return false + } + if mlv < olv { + return true + } + if mlv > olv { + return false + } + } + return false +} + +// Clone returns a copy of the label set. +func (ls LabelSet) Clone() LabelSet { + lsn := make(LabelSet, len(ls)) + for ln, lv := range ls { + lsn[ln] = lv + } + return lsn +} + +// Merge is a helper function to non-destructively merge two label sets. +func (l LabelSet) Merge(other LabelSet) LabelSet { + result := make(LabelSet, len(l)) + + for k, v := range l { + result[k] = v + } + + for k, v := range other { + result[k] = v + } + + return result +} + +func (l LabelSet) String() string { + lstrs := make([]string, 0, len(l)) + for l, v := range l { + lstrs = append(lstrs, fmt.Sprintf("%s=%q", l, v)) + } + + sort.Strings(lstrs) + return fmt.Sprintf("{%s}", strings.Join(lstrs, ", ")) +} + +// Fingerprint returns the LabelSet's fingerprint. +func (ls LabelSet) Fingerprint() Fingerprint { + return labelSetToFingerprint(ls) +} + +// FastFingerprint returns the LabelSet's Fingerprint calculated by a faster hashing +// algorithm, which is, however, more susceptible to hash collisions. +func (ls LabelSet) FastFingerprint() Fingerprint { + return labelSetToFastFingerprint(ls) +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (l *LabelSet) UnmarshalJSON(b []byte) error { + var m map[LabelName]LabelValue + if err := json.Unmarshal(b, &m); err != nil { + return err + } + // encoding/json only unmarshals maps of the form map[string]T. It treats + // LabelName as a string and does not call its UnmarshalJSON method. + // Thus, we have to replicate the behavior here. + for ln := range m { + if !ln.IsValid() { + return fmt.Errorf("%q is not a valid label name", ln) + } + } + *l = LabelSet(m) + return nil +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/model/metric.go b/example/prometheus-mock/vendor/github.com/prometheus/common/model/metric.go new file mode 100644 index 0000000..f725090 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/model/metric.go @@ -0,0 +1,103 @@ +// Copyright 2013 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 model + +import ( + "fmt" + "regexp" + "sort" + "strings" +) + +var ( + separator = []byte{0} + // MetricNameRE is a regular expression matching valid metric + // names. Note that the IsValidMetricName function performs the same + // check but faster than a match with this regular expression. + MetricNameRE = regexp.MustCompile(`^[a-zA-Z_:][a-zA-Z0-9_:]*$`) +) + +// A Metric is similar to a LabelSet, but the key difference is that a Metric is +// a singleton and refers to one and only one stream of samples. +type Metric LabelSet + +// Equal compares the metrics. +func (m Metric) Equal(o Metric) bool { + return LabelSet(m).Equal(LabelSet(o)) +} + +// Before compares the metrics' underlying label sets. +func (m Metric) Before(o Metric) bool { + return LabelSet(m).Before(LabelSet(o)) +} + +// Clone returns a copy of the Metric. +func (m Metric) Clone() Metric { + clone := make(Metric, len(m)) + for k, v := range m { + clone[k] = v + } + return clone +} + +func (m Metric) String() string { + metricName, hasName := m[MetricNameLabel] + numLabels := len(m) - 1 + if !hasName { + numLabels = len(m) + } + labelStrings := make([]string, 0, numLabels) + for label, value := range m { + if label != MetricNameLabel { + labelStrings = append(labelStrings, fmt.Sprintf("%s=%q", label, value)) + } + } + + switch numLabels { + case 0: + if hasName { + return string(metricName) + } + return "{}" + default: + sort.Strings(labelStrings) + return fmt.Sprintf("%s{%s}", metricName, strings.Join(labelStrings, ", ")) + } +} + +// Fingerprint returns a Metric's Fingerprint. +func (m Metric) Fingerprint() Fingerprint { + return LabelSet(m).Fingerprint() +} + +// FastFingerprint returns a Metric's Fingerprint calculated by a faster hashing +// algorithm, which is, however, more susceptible to hash collisions. +func (m Metric) FastFingerprint() Fingerprint { + return LabelSet(m).FastFingerprint() +} + +// IsValidMetricName returns true iff name matches the pattern of MetricNameRE. +// This function, however, does not use MetricNameRE for the check but a much +// faster hardcoded implementation. +func IsValidMetricName(n LabelValue) bool { + if len(n) == 0 { + return false + } + for i, b := range n { + if !((b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_' || b == ':' || (b >= '0' && b <= '9' && i > 0)) { + return false + } + } + return true +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/model/metric_test.go b/example/prometheus-mock/vendor/github.com/prometheus/common/model/metric_test.go new file mode 100644 index 0000000..06f9de5 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/model/metric_test.go @@ -0,0 +1,132 @@ +// Copyright 2013 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 model + +import "testing" + +func testMetric(t testing.TB) { + var scenarios = []struct { + input LabelSet + fingerprint Fingerprint + fastFingerprint Fingerprint + }{ + { + input: LabelSet{}, + fingerprint: 14695981039346656037, + fastFingerprint: 14695981039346656037, + }, + { + input: LabelSet{ + "first_name": "electro", + "occupation": "robot", + "manufacturer": "westinghouse", + }, + fingerprint: 5911716720268894962, + fastFingerprint: 11310079640881077873, + }, + { + input: LabelSet{ + "x": "y", + }, + fingerprint: 8241431561484471700, + fastFingerprint: 13948396922932177635, + }, + { + input: LabelSet{ + "a": "bb", + "b": "c", + }, + fingerprint: 3016285359649981711, + fastFingerprint: 3198632812309449502, + }, + { + input: LabelSet{ + "a": "b", + "bb": "c", + }, + fingerprint: 7122421792099404749, + fastFingerprint: 5774953389407657638, + }, + } + + for i, scenario := range scenarios { + input := Metric(scenario.input) + + if scenario.fingerprint != input.Fingerprint() { + t.Errorf("%d. expected %d, got %d", i, scenario.fingerprint, input.Fingerprint()) + } + if scenario.fastFingerprint != input.FastFingerprint() { + t.Errorf("%d. expected %d, got %d", i, scenario.fastFingerprint, input.FastFingerprint()) + } + } +} + +func TestMetric(t *testing.T) { + testMetric(t) +} + +func BenchmarkMetric(b *testing.B) { + for i := 0; i < b.N; i++ { + testMetric(b) + } +} + +func TestMetricNameIsValid(t *testing.T) { + var scenarios = []struct { + mn LabelValue + valid bool + }{ + { + mn: "Avalid_23name", + valid: true, + }, + { + mn: "_Avalid_23name", + valid: true, + }, + { + mn: "1valid_23name", + valid: false, + }, + { + mn: "avalid_23name", + valid: true, + }, + { + mn: "Ava:lid_23name", + valid: true, + }, + { + mn: "a lid_23name", + valid: false, + }, + { + mn: ":leading_colon", + valid: true, + }, + { + mn: "colon:in:the:middle", + valid: true, + }, + } + + for _, s := range scenarios { + if IsValidMetricName(s.mn) != s.valid { + t.Errorf("Expected %v for %q using IsValidMetricName function", s.valid, s.mn) + } + if MetricNameRE.MatchString(string(s.mn)) != s.valid { + t.Errorf("Expected %v for %q using regexp matching", s.valid, s.mn) + } + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/model/model.go b/example/prometheus-mock/vendor/github.com/prometheus/common/model/model.go new file mode 100644 index 0000000..a7b9691 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/model/model.go @@ -0,0 +1,16 @@ +// Copyright 2013 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 model contains common data structures that are shared across +// Prometheus components and libraries. +package model diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/model/signature.go b/example/prometheus-mock/vendor/github.com/prometheus/common/model/signature.go new file mode 100644 index 0000000..8762b13 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/model/signature.go @@ -0,0 +1,144 @@ +// Copyright 2014 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 model + +import ( + "sort" +) + +// SeparatorByte is a byte that cannot occur in valid UTF-8 sequences and is +// used to separate label names, label values, and other strings from each other +// when calculating their combined hash value (aka signature aka fingerprint). +const SeparatorByte byte = 255 + +var ( + // cache the signature of an empty label set. + emptyLabelSignature = hashNew() +) + +// LabelsToSignature returns a quasi-unique signature (i.e., fingerprint) for a +// given label set. (Collisions are possible but unlikely if the number of label +// sets the function is applied to is small.) +func LabelsToSignature(labels map[string]string) uint64 { + if len(labels) == 0 { + return emptyLabelSignature + } + + labelNames := make([]string, 0, len(labels)) + for labelName := range labels { + labelNames = append(labelNames, labelName) + } + sort.Strings(labelNames) + + sum := hashNew() + for _, labelName := range labelNames { + sum = hashAdd(sum, labelName) + sum = hashAddByte(sum, SeparatorByte) + sum = hashAdd(sum, labels[labelName]) + sum = hashAddByte(sum, SeparatorByte) + } + return sum +} + +// labelSetToFingerprint works exactly as LabelsToSignature but takes a LabelSet as +// parameter (rather than a label map) and returns a Fingerprint. +func labelSetToFingerprint(ls LabelSet) Fingerprint { + if len(ls) == 0 { + return Fingerprint(emptyLabelSignature) + } + + labelNames := make(LabelNames, 0, len(ls)) + for labelName := range ls { + labelNames = append(labelNames, labelName) + } + sort.Sort(labelNames) + + sum := hashNew() + for _, labelName := range labelNames { + sum = hashAdd(sum, string(labelName)) + sum = hashAddByte(sum, SeparatorByte) + sum = hashAdd(sum, string(ls[labelName])) + sum = hashAddByte(sum, SeparatorByte) + } + return Fingerprint(sum) +} + +// labelSetToFastFingerprint works similar to labelSetToFingerprint but uses a +// faster and less allocation-heavy hash function, which is more susceptible to +// create hash collisions. Therefore, collision detection should be applied. +func labelSetToFastFingerprint(ls LabelSet) Fingerprint { + if len(ls) == 0 { + return Fingerprint(emptyLabelSignature) + } + + var result uint64 + for labelName, labelValue := range ls { + sum := hashNew() + sum = hashAdd(sum, string(labelName)) + sum = hashAddByte(sum, SeparatorByte) + sum = hashAdd(sum, string(labelValue)) + result ^= sum + } + return Fingerprint(result) +} + +// SignatureForLabels works like LabelsToSignature but takes a Metric as +// parameter (rather than a label map) and only includes the labels with the +// specified LabelNames into the signature calculation. The labels passed in +// will be sorted by this function. +func SignatureForLabels(m Metric, labels ...LabelName) uint64 { + if len(labels) == 0 { + return emptyLabelSignature + } + + sort.Sort(LabelNames(labels)) + + sum := hashNew() + for _, label := range labels { + sum = hashAdd(sum, string(label)) + sum = hashAddByte(sum, SeparatorByte) + sum = hashAdd(sum, string(m[label])) + sum = hashAddByte(sum, SeparatorByte) + } + return sum +} + +// SignatureWithoutLabels works like LabelsToSignature but takes a Metric as +// parameter (rather than a label map) and excludes the labels with any of the +// specified LabelNames from the signature calculation. +func SignatureWithoutLabels(m Metric, labels map[LabelName]struct{}) uint64 { + if len(m) == 0 { + return emptyLabelSignature + } + + labelNames := make(LabelNames, 0, len(m)) + for labelName := range m { + if _, exclude := labels[labelName]; !exclude { + labelNames = append(labelNames, labelName) + } + } + if len(labelNames) == 0 { + return emptyLabelSignature + } + sort.Sort(labelNames) + + sum := hashNew() + for _, labelName := range labelNames { + sum = hashAdd(sum, string(labelName)) + sum = hashAddByte(sum, SeparatorByte) + sum = hashAdd(sum, string(m[labelName])) + sum = hashAddByte(sum, SeparatorByte) + } + return sum +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/model/signature_test.go b/example/prometheus-mock/vendor/github.com/prometheus/common/model/signature_test.go new file mode 100644 index 0000000..d59c8a8 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/model/signature_test.go @@ -0,0 +1,314 @@ +// Copyright 2014 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 model + +import ( + "runtime" + "sync" + "testing" +) + +func TestLabelsToSignature(t *testing.T) { + var scenarios = []struct { + in map[string]string + out uint64 + }{ + { + in: map[string]string{}, + out: 14695981039346656037, + }, + { + in: map[string]string{"name": "garland, briggs", "fear": "love is not enough"}, + out: 5799056148416392346, + }, + } + + for i, scenario := range scenarios { + actual := LabelsToSignature(scenario.in) + + if actual != scenario.out { + t.Errorf("%d. expected %d, got %d", i, scenario.out, actual) + } + } +} + +func TestMetricToFingerprint(t *testing.T) { + var scenarios = []struct { + in LabelSet + out Fingerprint + }{ + { + in: LabelSet{}, + out: 14695981039346656037, + }, + { + in: LabelSet{"name": "garland, briggs", "fear": "love is not enough"}, + out: 5799056148416392346, + }, + } + + for i, scenario := range scenarios { + actual := labelSetToFingerprint(scenario.in) + + if actual != scenario.out { + t.Errorf("%d. expected %d, got %d", i, scenario.out, actual) + } + } +} + +func TestMetricToFastFingerprint(t *testing.T) { + var scenarios = []struct { + in LabelSet + out Fingerprint + }{ + { + in: LabelSet{}, + out: 14695981039346656037, + }, + { + in: LabelSet{"name": "garland, briggs", "fear": "love is not enough"}, + out: 12952432476264840823, + }, + } + + for i, scenario := range scenarios { + actual := labelSetToFastFingerprint(scenario.in) + + if actual != scenario.out { + t.Errorf("%d. expected %d, got %d", i, scenario.out, actual) + } + } +} + +func TestSignatureForLabels(t *testing.T) { + var scenarios = []struct { + in Metric + labels LabelNames + out uint64 + }{ + { + in: Metric{}, + labels: nil, + out: 14695981039346656037, + }, + { + in: Metric{}, + labels: LabelNames{"empty"}, + out: 7187873163539638612, + }, + { + in: Metric{"name": "garland, briggs", "fear": "love is not enough"}, + labels: LabelNames{"empty"}, + out: 7187873163539638612, + }, + { + in: Metric{"name": "garland, briggs", "fear": "love is not enough"}, + labels: LabelNames{"fear", "name"}, + out: 5799056148416392346, + }, + { + in: Metric{"name": "garland, briggs", "fear": "love is not enough", "foo": "bar"}, + labels: LabelNames{"fear", "name"}, + out: 5799056148416392346, + }, + { + in: Metric{"name": "garland, briggs", "fear": "love is not enough"}, + labels: LabelNames{}, + out: 14695981039346656037, + }, + { + in: Metric{"name": "garland, briggs", "fear": "love is not enough"}, + labels: nil, + out: 14695981039346656037, + }, + } + + for i, scenario := range scenarios { + actual := SignatureForLabels(scenario.in, scenario.labels...) + + if actual != scenario.out { + t.Errorf("%d. expected %d, got %d", i, scenario.out, actual) + } + } +} + +func TestSignatureWithoutLabels(t *testing.T) { + var scenarios = []struct { + in Metric + labels map[LabelName]struct{} + out uint64 + }{ + { + in: Metric{}, + labels: nil, + out: 14695981039346656037, + }, + { + in: Metric{"name": "garland, briggs", "fear": "love is not enough"}, + labels: map[LabelName]struct{}{"fear": struct{}{}, "name": struct{}{}}, + out: 14695981039346656037, + }, + { + in: Metric{"name": "garland, briggs", "fear": "love is not enough", "foo": "bar"}, + labels: map[LabelName]struct{}{"foo": struct{}{}}, + out: 5799056148416392346, + }, + { + in: Metric{"name": "garland, briggs", "fear": "love is not enough"}, + labels: map[LabelName]struct{}{}, + out: 5799056148416392346, + }, + { + in: Metric{"name": "garland, briggs", "fear": "love is not enough"}, + labels: nil, + out: 5799056148416392346, + }, + } + + for i, scenario := range scenarios { + actual := SignatureWithoutLabels(scenario.in, scenario.labels) + + if actual != scenario.out { + t.Errorf("%d. expected %d, got %d", i, scenario.out, actual) + } + } +} + +func benchmarkLabelToSignature(b *testing.B, l map[string]string, e uint64) { + for i := 0; i < b.N; i++ { + if a := LabelsToSignature(l); a != e { + b.Fatalf("expected signature of %d for %s, got %d", e, l, a) + } + } +} + +func BenchmarkLabelToSignatureScalar(b *testing.B) { + benchmarkLabelToSignature(b, nil, 14695981039346656037) +} + +func BenchmarkLabelToSignatureSingle(b *testing.B) { + benchmarkLabelToSignature(b, map[string]string{"first-label": "first-label-value"}, 5146282821936882169) +} + +func BenchmarkLabelToSignatureDouble(b *testing.B) { + benchmarkLabelToSignature(b, map[string]string{"first-label": "first-label-value", "second-label": "second-label-value"}, 3195800080984914717) +} + +func BenchmarkLabelToSignatureTriple(b *testing.B) { + benchmarkLabelToSignature(b, map[string]string{"first-label": "first-label-value", "second-label": "second-label-value", "third-label": "third-label-value"}, 13843036195897128121) +} + +func benchmarkMetricToFingerprint(b *testing.B, ls LabelSet, e Fingerprint) { + for i := 0; i < b.N; i++ { + if a := labelSetToFingerprint(ls); a != e { + b.Fatalf("expected signature of %d for %s, got %d", e, ls, a) + } + } +} + +func BenchmarkMetricToFingerprintScalar(b *testing.B) { + benchmarkMetricToFingerprint(b, nil, 14695981039346656037) +} + +func BenchmarkMetricToFingerprintSingle(b *testing.B) { + benchmarkMetricToFingerprint(b, LabelSet{"first-label": "first-label-value"}, 5146282821936882169) +} + +func BenchmarkMetricToFingerprintDouble(b *testing.B) { + benchmarkMetricToFingerprint(b, LabelSet{"first-label": "first-label-value", "second-label": "second-label-value"}, 3195800080984914717) +} + +func BenchmarkMetricToFingerprintTriple(b *testing.B) { + benchmarkMetricToFingerprint(b, LabelSet{"first-label": "first-label-value", "second-label": "second-label-value", "third-label": "third-label-value"}, 13843036195897128121) +} + +func benchmarkMetricToFastFingerprint(b *testing.B, ls LabelSet, e Fingerprint) { + for i := 0; i < b.N; i++ { + if a := labelSetToFastFingerprint(ls); a != e { + b.Fatalf("expected signature of %d for %s, got %d", e, ls, a) + } + } +} + +func BenchmarkMetricToFastFingerprintScalar(b *testing.B) { + benchmarkMetricToFastFingerprint(b, nil, 14695981039346656037) +} + +func BenchmarkMetricToFastFingerprintSingle(b *testing.B) { + benchmarkMetricToFastFingerprint(b, LabelSet{"first-label": "first-label-value"}, 5147259542624943964) +} + +func BenchmarkMetricToFastFingerprintDouble(b *testing.B) { + benchmarkMetricToFastFingerprint(b, LabelSet{"first-label": "first-label-value", "second-label": "second-label-value"}, 18269973311206963528) +} + +func BenchmarkMetricToFastFingerprintTriple(b *testing.B) { + benchmarkMetricToFastFingerprint(b, LabelSet{"first-label": "first-label-value", "second-label": "second-label-value", "third-label": "third-label-value"}, 15738406913934009676) +} + +func BenchmarkEmptyLabelSignature(b *testing.B) { + input := []map[string]string{nil, {}} + + var ms runtime.MemStats + runtime.ReadMemStats(&ms) + + alloc := ms.Alloc + + for _, labels := range input { + LabelsToSignature(labels) + } + + runtime.ReadMemStats(&ms) + + if got := ms.Alloc; alloc != got { + b.Fatal("expected LabelsToSignature with empty labels not to perform allocations") + } +} + +func benchmarkMetricToFastFingerprintConc(b *testing.B, ls LabelSet, e Fingerprint, concLevel int) { + var start, end sync.WaitGroup + start.Add(1) + end.Add(concLevel) + + for i := 0; i < concLevel; i++ { + go func() { + start.Wait() + for j := b.N / concLevel; j >= 0; j-- { + if a := labelSetToFastFingerprint(ls); a != e { + b.Fatalf("expected signature of %d for %s, got %d", e, ls, a) + } + } + end.Done() + }() + } + b.ResetTimer() + start.Done() + end.Wait() +} + +func BenchmarkMetricToFastFingerprintTripleConc1(b *testing.B) { + benchmarkMetricToFastFingerprintConc(b, LabelSet{"first-label": "first-label-value", "second-label": "second-label-value", "third-label": "third-label-value"}, 15738406913934009676, 1) +} + +func BenchmarkMetricToFastFingerprintTripleConc2(b *testing.B) { + benchmarkMetricToFastFingerprintConc(b, LabelSet{"first-label": "first-label-value", "second-label": "second-label-value", "third-label": "third-label-value"}, 15738406913934009676, 2) +} + +func BenchmarkMetricToFastFingerprintTripleConc4(b *testing.B) { + benchmarkMetricToFastFingerprintConc(b, LabelSet{"first-label": "first-label-value", "second-label": "second-label-value", "third-label": "third-label-value"}, 15738406913934009676, 4) +} + +func BenchmarkMetricToFastFingerprintTripleConc8(b *testing.B) { + benchmarkMetricToFastFingerprintConc(b, LabelSet{"first-label": "first-label-value", "second-label": "second-label-value", "third-label": "third-label-value"}, 15738406913934009676, 8) +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/model/silence.go b/example/prometheus-mock/vendor/github.com/prometheus/common/model/silence.go new file mode 100644 index 0000000..7538e29 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/model/silence.go @@ -0,0 +1,106 @@ +// Copyright 2015 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 model + +import ( + "encoding/json" + "fmt" + "regexp" + "time" +) + +// Matcher describes a matches the value of a given label. +type Matcher struct { + Name LabelName `json:"name"` + Value string `json:"value"` + IsRegex bool `json:"isRegex"` +} + +func (m *Matcher) UnmarshalJSON(b []byte) error { + type plain Matcher + if err := json.Unmarshal(b, (*plain)(m)); err != nil { + return err + } + + if len(m.Name) == 0 { + return fmt.Errorf("label name in matcher must not be empty") + } + if m.IsRegex { + if _, err := regexp.Compile(m.Value); err != nil { + return err + } + } + return nil +} + +// Validate returns true iff all fields of the matcher have valid values. +func (m *Matcher) Validate() error { + if !m.Name.IsValid() { + return fmt.Errorf("invalid name %q", m.Name) + } + if m.IsRegex { + if _, err := regexp.Compile(m.Value); err != nil { + return fmt.Errorf("invalid regular expression %q", m.Value) + } + } else if !LabelValue(m.Value).IsValid() || len(m.Value) == 0 { + return fmt.Errorf("invalid value %q", m.Value) + } + return nil +} + +// Silence defines the representation of a silence definiton +// in the Prometheus eco-system. +type Silence struct { + ID uint64 `json:"id,omitempty"` + + Matchers []*Matcher `json:"matchers"` + + StartsAt time.Time `json:"startsAt"` + EndsAt time.Time `json:"endsAt"` + + CreatedAt time.Time `json:"createdAt,omitempty"` + CreatedBy string `json:"createdBy"` + Comment string `json:"comment,omitempty"` +} + +// Validate returns true iff all fields of the silence have valid values. +func (s *Silence) Validate() error { + if len(s.Matchers) == 0 { + return fmt.Errorf("at least one matcher required") + } + for _, m := range s.Matchers { + if err := m.Validate(); err != nil { + return fmt.Errorf("invalid matcher: %s", err) + } + } + if s.StartsAt.IsZero() { + return fmt.Errorf("start time missing") + } + if s.EndsAt.IsZero() { + return fmt.Errorf("end time missing") + } + if s.EndsAt.Before(s.StartsAt) { + return fmt.Errorf("start time must be before end time") + } + if s.CreatedBy == "" { + return fmt.Errorf("creator information missing") + } + if s.Comment == "" { + return fmt.Errorf("comment missing") + } + if s.CreatedAt.IsZero() { + return fmt.Errorf("creation timestamp missing") + } + return nil +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/model/silence_test.go b/example/prometheus-mock/vendor/github.com/prometheus/common/model/silence_test.go new file mode 100644 index 0000000..8eaaf07 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/model/silence_test.go @@ -0,0 +1,228 @@ +// Copyright 2015 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 model + +import ( + "strings" + "testing" + "time" +) + +func TestMatcherValidate(t *testing.T) { + var cases = []struct { + matcher *Matcher + err string + }{ + { + matcher: &Matcher{ + Name: "name", + Value: "value", + }, + }, + { + matcher: &Matcher{ + Name: "name", + Value: "value", + IsRegex: true, + }, + }, + { + matcher: &Matcher{ + Name: "name!", + Value: "value", + }, + err: "invalid name", + }, + { + matcher: &Matcher{ + Name: "", + Value: "value", + }, + err: "invalid name", + }, + { + matcher: &Matcher{ + Name: "name", + Value: "value\xff", + }, + err: "invalid value", + }, + { + matcher: &Matcher{ + Name: "name", + Value: "", + }, + err: "invalid value", + }, + } + + for i, c := range cases { + err := c.matcher.Validate() + if err == nil { + if c.err == "" { + continue + } + t.Errorf("%d. Expected error %q but got none", i, c.err) + continue + } + if c.err == "" && err != nil { + t.Errorf("%d. Expected no error but got %q", i, err) + continue + } + if !strings.Contains(err.Error(), c.err) { + t.Errorf("%d. Expected error to contain %q but got %q", i, c.err, err) + } + } +} + +func TestSilenceValidate(t *testing.T) { + ts := time.Now() + + var cases = []struct { + sil *Silence + err string + }{ + { + sil: &Silence{ + Matchers: []*Matcher{ + {Name: "name", Value: "value"}, + }, + StartsAt: ts, + EndsAt: ts, + CreatedAt: ts, + CreatedBy: "name", + Comment: "comment", + }, + }, + { + sil: &Silence{ + Matchers: []*Matcher{ + {Name: "name", Value: "value"}, + {Name: "name", Value: "value"}, + {Name: "name", Value: "value"}, + {Name: "name", Value: "value", IsRegex: true}, + }, + StartsAt: ts, + EndsAt: ts, + CreatedAt: ts, + CreatedBy: "name", + Comment: "comment", + }, + }, + { + sil: &Silence{ + Matchers: []*Matcher{ + {Name: "name", Value: "value"}, + }, + StartsAt: ts, + EndsAt: ts.Add(-1 * time.Minute), + CreatedAt: ts, + CreatedBy: "name", + Comment: "comment", + }, + err: "start time must be before end time", + }, + { + sil: &Silence{ + Matchers: []*Matcher{ + {Name: "name", Value: "value"}, + }, + StartsAt: ts, + CreatedAt: ts, + CreatedBy: "name", + Comment: "comment", + }, + err: "end time missing", + }, + { + sil: &Silence{ + Matchers: []*Matcher{ + {Name: "name", Value: "value"}, + }, + EndsAt: ts, + CreatedAt: ts, + CreatedBy: "name", + Comment: "comment", + }, + err: "start time missing", + }, + { + sil: &Silence{ + Matchers: []*Matcher{ + {Name: "!name", Value: "value"}, + }, + StartsAt: ts, + EndsAt: ts, + CreatedAt: ts, + CreatedBy: "name", + Comment: "comment", + }, + err: "invalid matcher", + }, + { + sil: &Silence{ + Matchers: []*Matcher{ + {Name: "name", Value: "value"}, + }, + StartsAt: ts, + EndsAt: ts, + CreatedAt: ts, + CreatedBy: "name", + }, + err: "comment missing", + }, + { + sil: &Silence{ + Matchers: []*Matcher{ + {Name: "name", Value: "value"}, + }, + StartsAt: ts, + EndsAt: ts, + CreatedBy: "name", + Comment: "comment", + }, + err: "creation timestamp missing", + }, + { + sil: &Silence{ + Matchers: []*Matcher{ + {Name: "name", Value: "value"}, + }, + StartsAt: ts, + EndsAt: ts, + CreatedAt: ts, + Comment: "comment", + }, + err: "creator information missing", + }, + } + + for i, c := range cases { + err := c.sil.Validate() + if err == nil { + if c.err == "" { + continue + } + t.Errorf("%d. Expected error %q but got none", i, c.err) + continue + } + if c.err == "" && err != nil { + t.Errorf("%d. Expected no error but got %q", i, err) + continue + } + if !strings.Contains(err.Error(), c.err) { + t.Errorf("%d. Expected error to contain %q but got %q", i, c.err, err) + } + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/model/time.go b/example/prometheus-mock/vendor/github.com/prometheus/common/model/time.go new file mode 100644 index 0000000..7e87f1a --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/model/time.go @@ -0,0 +1,261 @@ +// Copyright 2013 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 model + +import ( + "fmt" + "math" + "regexp" + "strconv" + "strings" + "time" +) + +const ( + // MinimumTick is the minimum supported time resolution. This has to be + // at least time.Second in order for the code below to work. + minimumTick = time.Millisecond + // second is the Time duration equivalent to one second. + second = int64(time.Second / minimumTick) + // The number of nanoseconds per minimum tick. + nanosPerTick = int64(minimumTick / time.Nanosecond) + + // Earliest is the earliest Time representable. Handy for + // initializing a high watermark. + Earliest = Time(math.MinInt64) + // Latest is the latest Time representable. Handy for initializing + // a low watermark. + Latest = Time(math.MaxInt64) +) + +// Time is the number of milliseconds since the epoch +// (1970-01-01 00:00 UTC) excluding leap seconds. +type Time int64 + +// Interval describes and interval between two timestamps. +type Interval struct { + Start, End Time +} + +// Now returns the current time as a Time. +func Now() Time { + return TimeFromUnixNano(time.Now().UnixNano()) +} + +// TimeFromUnix returns the Time equivalent to the Unix Time t +// provided in seconds. +func TimeFromUnix(t int64) Time { + return Time(t * second) +} + +// TimeFromUnixNano returns the Time equivalent to the Unix Time +// t provided in nanoseconds. +func TimeFromUnixNano(t int64) Time { + return Time(t / nanosPerTick) +} + +// Equal reports whether two Times represent the same instant. +func (t Time) Equal(o Time) bool { + return t == o +} + +// Before reports whether the Time t is before o. +func (t Time) Before(o Time) bool { + return t < o +} + +// After reports whether the Time t is after o. +func (t Time) After(o Time) bool { + return t > o +} + +// Add returns the Time t + d. +func (t Time) Add(d time.Duration) Time { + return t + Time(d/minimumTick) +} + +// Sub returns the Duration t - o. +func (t Time) Sub(o Time) time.Duration { + return time.Duration(t-o) * minimumTick +} + +// Time returns the time.Time representation of t. +func (t Time) Time() time.Time { + return time.Unix(int64(t)/second, (int64(t)%second)*nanosPerTick) +} + +// Unix returns t as a Unix time, the number of seconds elapsed +// since January 1, 1970 UTC. +func (t Time) Unix() int64 { + return int64(t) / second +} + +// UnixNano returns t as a Unix time, the number of nanoseconds elapsed +// since January 1, 1970 UTC. +func (t Time) UnixNano() int64 { + return int64(t) * nanosPerTick +} + +// The number of digits after the dot. +var dotPrecision = int(math.Log10(float64(second))) + +// String returns a string representation of the Time. +func (t Time) String() string { + return strconv.FormatFloat(float64(t)/float64(second), 'f', -1, 64) +} + +// MarshalJSON implements the json.Marshaler interface. +func (t Time) MarshalJSON() ([]byte, error) { + return []byte(t.String()), nil +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (t *Time) UnmarshalJSON(b []byte) error { + p := strings.Split(string(b), ".") + switch len(p) { + case 1: + v, err := strconv.ParseInt(string(p[0]), 10, 64) + if err != nil { + return err + } + *t = Time(v * second) + + case 2: + v, err := strconv.ParseInt(string(p[0]), 10, 64) + if err != nil { + return err + } + v *= second + + prec := dotPrecision - len(p[1]) + if prec < 0 { + p[1] = p[1][:dotPrecision] + } else if prec > 0 { + p[1] = p[1] + strings.Repeat("0", prec) + } + + va, err := strconv.ParseInt(p[1], 10, 32) + if err != nil { + return err + } + + *t = Time(v + va) + + default: + return fmt.Errorf("invalid time %q", string(b)) + } + return nil +} + +// Duration wraps time.Duration. It is used to parse the custom duration format +// from YAML. +// This type should not propagate beyond the scope of input/output processing. +type Duration time.Duration + +// Set implements pflag/flag.Value +func (d *Duration) Set(s string) error { + var err error + *d, err = ParseDuration(s) + return err +} + +// Type implements pflag.Value +func (d *Duration) Type() string { + return "duration" +} + +var durationRE = regexp.MustCompile("^([0-9]+)(y|w|d|h|m|s|ms)$") + +// ParseDuration parses a string into a time.Duration, assuming that a year +// always has 365d, a week always has 7d, and a day always has 24h. +func ParseDuration(durationStr string) (Duration, error) { + matches := durationRE.FindStringSubmatch(durationStr) + if len(matches) != 3 { + return 0, fmt.Errorf("not a valid duration string: %q", durationStr) + } + var ( + n, _ = strconv.Atoi(matches[1]) + dur = time.Duration(n) * time.Millisecond + ) + switch unit := matches[2]; unit { + case "y": + dur *= 1000 * 60 * 60 * 24 * 365 + case "w": + dur *= 1000 * 60 * 60 * 24 * 7 + case "d": + dur *= 1000 * 60 * 60 * 24 + case "h": + dur *= 1000 * 60 * 60 + case "m": + dur *= 1000 * 60 + case "s": + dur *= 1000 + case "ms": + // Value already correct + default: + return 0, fmt.Errorf("invalid time unit in duration string: %q", unit) + } + return Duration(dur), nil +} + +func (d Duration) String() string { + var ( + ms = int64(time.Duration(d) / time.Millisecond) + unit = "ms" + ) + factors := map[string]int64{ + "y": 1000 * 60 * 60 * 24 * 365, + "w": 1000 * 60 * 60 * 24 * 7, + "d": 1000 * 60 * 60 * 24, + "h": 1000 * 60 * 60, + "m": 1000 * 60, + "s": 1000, + "ms": 1, + } + + switch int64(0) { + case ms % factors["y"]: + unit = "y" + case ms % factors["w"]: + unit = "w" + case ms % factors["d"]: + unit = "d" + case ms % factors["h"]: + unit = "h" + case ms % factors["m"]: + unit = "m" + case ms % factors["s"]: + unit = "s" + } + return fmt.Sprintf("%v%v", ms/factors[unit], unit) +} + +// MarshalYAML implements the yaml.Marshaler interface. +func (d Duration) MarshalYAML() (interface{}, error) { + return d.String(), nil +} + +// UnmarshalYAML implements the yaml.Unmarshaler interface. +func (d *Duration) UnmarshalYAML(unmarshal func(interface{}) error) error { + var s string + if err := unmarshal(&s); err != nil { + return err + } + dur, err := ParseDuration(s) + if err != nil { + return err + } + *d = dur + return nil +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/model/time_test.go b/example/prometheus-mock/vendor/github.com/prometheus/common/model/time_test.go new file mode 100644 index 0000000..45ffd87 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/model/time_test.go @@ -0,0 +1,129 @@ +// Copyright 2013 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 model + +import ( + "testing" + "time" +) + +func TestComparators(t *testing.T) { + t1a := TimeFromUnix(0) + t1b := TimeFromUnix(0) + t2 := TimeFromUnix(2*second - 1) + + if !t1a.Equal(t1b) { + t.Fatalf("Expected %s to be equal to %s", t1a, t1b) + } + if t1a.Equal(t2) { + t.Fatalf("Expected %s to not be equal to %s", t1a, t2) + } + + if !t1a.Before(t2) { + t.Fatalf("Expected %s to be before %s", t1a, t2) + } + if t1a.Before(t1b) { + t.Fatalf("Expected %s to not be before %s", t1a, t1b) + } + + if !t2.After(t1a) { + t.Fatalf("Expected %s to be after %s", t2, t1a) + } + if t1b.After(t1a) { + t.Fatalf("Expected %s to not be after %s", t1b, t1a) + } +} + +func TestTimeConversions(t *testing.T) { + unixSecs := int64(1136239445) + unixNsecs := int64(123456789) + unixNano := unixSecs*1e9 + unixNsecs + + t1 := time.Unix(unixSecs, unixNsecs-unixNsecs%nanosPerTick) + t2 := time.Unix(unixSecs, unixNsecs) + + ts := TimeFromUnixNano(unixNano) + if !ts.Time().Equal(t1) { + t.Fatalf("Expected %s, got %s", t1, ts.Time()) + } + + // Test available precision. + ts = TimeFromUnixNano(t2.UnixNano()) + if !ts.Time().Equal(t1) { + t.Fatalf("Expected %s, got %s", t1, ts.Time()) + } + + if ts.UnixNano() != unixNano-unixNano%nanosPerTick { + t.Fatalf("Expected %d, got %d", unixNano, ts.UnixNano()) + } +} + +func TestDuration(t *testing.T) { + duration := time.Second + time.Minute + time.Hour + goTime := time.Unix(1136239445, 0) + + ts := TimeFromUnix(goTime.Unix()) + if !goTime.Add(duration).Equal(ts.Add(duration).Time()) { + t.Fatalf("Expected %s to be equal to %s", goTime.Add(duration), ts.Add(duration)) + } + + earlier := ts.Add(-duration) + delta := ts.Sub(earlier) + if delta != duration { + t.Fatalf("Expected %s to be equal to %s", delta, duration) + } +} + +func TestParseDuration(t *testing.T) { + var cases = []struct { + in string + out time.Duration + }{ + { + in: "324ms", + out: 324 * time.Millisecond, + }, { + in: "3s", + out: 3 * time.Second, + }, { + in: "5m", + out: 5 * time.Minute, + }, { + in: "1h", + out: time.Hour, + }, { + in: "4d", + out: 4 * 24 * time.Hour, + }, { + in: "3w", + out: 3 * 7 * 24 * time.Hour, + }, { + in: "10y", + out: 10 * 365 * 24 * time.Hour, + }, + } + + for _, c := range cases { + d, err := ParseDuration(c.in) + if err != nil { + t.Errorf("Unexpected error on input %q", c.in) + } + if time.Duration(d) != c.out { + t.Errorf("Expected %v but got %v", c.out, d) + } + if d.String() != c.in { + t.Errorf("Expected duration string %q but got %q", c.in, d.String()) + } + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/model/value.go b/example/prometheus-mock/vendor/github.com/prometheus/common/model/value.go new file mode 100644 index 0000000..c9ed3ff --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/model/value.go @@ -0,0 +1,416 @@ +// Copyright 2013 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 model + +import ( + "encoding/json" + "fmt" + "math" + "sort" + "strconv" + "strings" +) + +var ( + // ZeroSamplePair is the pseudo zero-value of SamplePair used to signal a + // non-existing sample pair. It is a SamplePair with timestamp Earliest and + // value 0.0. Note that the natural zero value of SamplePair has a timestamp + // of 0, which is possible to appear in a real SamplePair and thus not + // suitable to signal a non-existing SamplePair. + ZeroSamplePair = SamplePair{Timestamp: Earliest} + + // ZeroSample is the pseudo zero-value of Sample used to signal a + // non-existing sample. It is a Sample with timestamp Earliest, value 0.0, + // and metric nil. Note that the natural zero value of Sample has a timestamp + // of 0, which is possible to appear in a real Sample and thus not suitable + // to signal a non-existing Sample. + ZeroSample = Sample{Timestamp: Earliest} +) + +// A SampleValue is a representation of a value for a given sample at a given +// time. +type SampleValue float64 + +// MarshalJSON implements json.Marshaler. +func (v SampleValue) MarshalJSON() ([]byte, error) { + return json.Marshal(v.String()) +} + +// UnmarshalJSON implements json.Unmarshaler. +func (v *SampleValue) UnmarshalJSON(b []byte) error { + if len(b) < 2 || b[0] != '"' || b[len(b)-1] != '"' { + return fmt.Errorf("sample value must be a quoted string") + } + f, err := strconv.ParseFloat(string(b[1:len(b)-1]), 64) + if err != nil { + return err + } + *v = SampleValue(f) + return nil +} + +// Equal returns true if the value of v and o is equal or if both are NaN. Note +// that v==o is false if both are NaN. If you want the conventional float +// behavior, use == to compare two SampleValues. +func (v SampleValue) Equal(o SampleValue) bool { + if v == o { + return true + } + return math.IsNaN(float64(v)) && math.IsNaN(float64(o)) +} + +func (v SampleValue) String() string { + return strconv.FormatFloat(float64(v), 'f', -1, 64) +} + +// SamplePair pairs a SampleValue with a Timestamp. +type SamplePair struct { + Timestamp Time + Value SampleValue +} + +// MarshalJSON implements json.Marshaler. +func (s SamplePair) MarshalJSON() ([]byte, error) { + t, err := json.Marshal(s.Timestamp) + if err != nil { + return nil, err + } + v, err := json.Marshal(s.Value) + if err != nil { + return nil, err + } + return []byte(fmt.Sprintf("[%s,%s]", t, v)), nil +} + +// UnmarshalJSON implements json.Unmarshaler. +func (s *SamplePair) UnmarshalJSON(b []byte) error { + v := [...]json.Unmarshaler{&s.Timestamp, &s.Value} + return json.Unmarshal(b, &v) +} + +// Equal returns true if this SamplePair and o have equal Values and equal +// Timestamps. The sematics of Value equality is defined by SampleValue.Equal. +func (s *SamplePair) Equal(o *SamplePair) bool { + return s == o || (s.Value.Equal(o.Value) && s.Timestamp.Equal(o.Timestamp)) +} + +func (s SamplePair) String() string { + return fmt.Sprintf("%s @[%s]", s.Value, s.Timestamp) +} + +// Sample is a sample pair associated with a metric. +type Sample struct { + Metric Metric `json:"metric"` + Value SampleValue `json:"value"` + Timestamp Time `json:"timestamp"` +} + +// Equal compares first the metrics, then the timestamp, then the value. The +// sematics of value equality is defined by SampleValue.Equal. +func (s *Sample) Equal(o *Sample) bool { + if s == o { + return true + } + + if !s.Metric.Equal(o.Metric) { + return false + } + if !s.Timestamp.Equal(o.Timestamp) { + return false + } + + return s.Value.Equal(o.Value) +} + +func (s Sample) String() string { + return fmt.Sprintf("%s => %s", s.Metric, SamplePair{ + Timestamp: s.Timestamp, + Value: s.Value, + }) +} + +// MarshalJSON implements json.Marshaler. +func (s Sample) MarshalJSON() ([]byte, error) { + v := struct { + Metric Metric `json:"metric"` + Value SamplePair `json:"value"` + }{ + Metric: s.Metric, + Value: SamplePair{ + Timestamp: s.Timestamp, + Value: s.Value, + }, + } + + return json.Marshal(&v) +} + +// UnmarshalJSON implements json.Unmarshaler. +func (s *Sample) UnmarshalJSON(b []byte) error { + v := struct { + Metric Metric `json:"metric"` + Value SamplePair `json:"value"` + }{ + Metric: s.Metric, + Value: SamplePair{ + Timestamp: s.Timestamp, + Value: s.Value, + }, + } + + if err := json.Unmarshal(b, &v); err != nil { + return err + } + + s.Metric = v.Metric + s.Timestamp = v.Value.Timestamp + s.Value = v.Value.Value + + return nil +} + +// Samples is a sortable Sample slice. It implements sort.Interface. +type Samples []*Sample + +func (s Samples) Len() int { + return len(s) +} + +// Less compares first the metrics, then the timestamp. +func (s Samples) Less(i, j int) bool { + switch { + case s[i].Metric.Before(s[j].Metric): + return true + case s[j].Metric.Before(s[i].Metric): + return false + case s[i].Timestamp.Before(s[j].Timestamp): + return true + default: + return false + } +} + +func (s Samples) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +// Equal compares two sets of samples and returns true if they are equal. +func (s Samples) Equal(o Samples) bool { + if len(s) != len(o) { + return false + } + + for i, sample := range s { + if !sample.Equal(o[i]) { + return false + } + } + return true +} + +// SampleStream is a stream of Values belonging to an attached COWMetric. +type SampleStream struct { + Metric Metric `json:"metric"` + Values []SamplePair `json:"values"` +} + +func (ss SampleStream) String() string { + vals := make([]string, len(ss.Values)) + for i, v := range ss.Values { + vals[i] = v.String() + } + return fmt.Sprintf("%s =>\n%s", ss.Metric, strings.Join(vals, "\n")) +} + +// Value is a generic interface for values resulting from a query evaluation. +type Value interface { + Type() ValueType + String() string +} + +func (Matrix) Type() ValueType { return ValMatrix } +func (Vector) Type() ValueType { return ValVector } +func (*Scalar) Type() ValueType { return ValScalar } +func (*String) Type() ValueType { return ValString } + +type ValueType int + +const ( + ValNone ValueType = iota + ValScalar + ValVector + ValMatrix + ValString +) + +// MarshalJSON implements json.Marshaler. +func (et ValueType) MarshalJSON() ([]byte, error) { + return json.Marshal(et.String()) +} + +func (et *ValueType) UnmarshalJSON(b []byte) error { + var s string + if err := json.Unmarshal(b, &s); err != nil { + return err + } + switch s { + case "": + *et = ValNone + case "scalar": + *et = ValScalar + case "vector": + *et = ValVector + case "matrix": + *et = ValMatrix + case "string": + *et = ValString + default: + return fmt.Errorf("unknown value type %q", s) + } + return nil +} + +func (e ValueType) String() string { + switch e { + case ValNone: + return "" + case ValScalar: + return "scalar" + case ValVector: + return "vector" + case ValMatrix: + return "matrix" + case ValString: + return "string" + } + panic("ValueType.String: unhandled value type") +} + +// Scalar is a scalar value evaluated at the set timestamp. +type Scalar struct { + Value SampleValue `json:"value"` + Timestamp Time `json:"timestamp"` +} + +func (s Scalar) String() string { + return fmt.Sprintf("scalar: %v @[%v]", s.Value, s.Timestamp) +} + +// MarshalJSON implements json.Marshaler. +func (s Scalar) MarshalJSON() ([]byte, error) { + v := strconv.FormatFloat(float64(s.Value), 'f', -1, 64) + return json.Marshal([...]interface{}{s.Timestamp, string(v)}) +} + +// UnmarshalJSON implements json.Unmarshaler. +func (s *Scalar) UnmarshalJSON(b []byte) error { + var f string + v := [...]interface{}{&s.Timestamp, &f} + + if err := json.Unmarshal(b, &v); err != nil { + return err + } + + value, err := strconv.ParseFloat(f, 64) + if err != nil { + return fmt.Errorf("error parsing sample value: %s", err) + } + s.Value = SampleValue(value) + return nil +} + +// String is a string value evaluated at the set timestamp. +type String struct { + Value string `json:"value"` + Timestamp Time `json:"timestamp"` +} + +func (s *String) String() string { + return s.Value +} + +// MarshalJSON implements json.Marshaler. +func (s String) MarshalJSON() ([]byte, error) { + return json.Marshal([]interface{}{s.Timestamp, s.Value}) +} + +// UnmarshalJSON implements json.Unmarshaler. +func (s *String) UnmarshalJSON(b []byte) error { + v := [...]interface{}{&s.Timestamp, &s.Value} + return json.Unmarshal(b, &v) +} + +// Vector is basically only an alias for Samples, but the +// contract is that in a Vector, all Samples have the same timestamp. +type Vector []*Sample + +func (vec Vector) String() string { + entries := make([]string, len(vec)) + for i, s := range vec { + entries[i] = s.String() + } + return strings.Join(entries, "\n") +} + +func (vec Vector) Len() int { return len(vec) } +func (vec Vector) Swap(i, j int) { vec[i], vec[j] = vec[j], vec[i] } + +// Less compares first the metrics, then the timestamp. +func (vec Vector) Less(i, j int) bool { + switch { + case vec[i].Metric.Before(vec[j].Metric): + return true + case vec[j].Metric.Before(vec[i].Metric): + return false + case vec[i].Timestamp.Before(vec[j].Timestamp): + return true + default: + return false + } +} + +// Equal compares two sets of samples and returns true if they are equal. +func (vec Vector) Equal(o Vector) bool { + if len(vec) != len(o) { + return false + } + + for i, sample := range vec { + if !sample.Equal(o[i]) { + return false + } + } + return true +} + +// Matrix is a list of time series. +type Matrix []*SampleStream + +func (m Matrix) Len() int { return len(m) } +func (m Matrix) Less(i, j int) bool { return m[i].Metric.Before(m[j].Metric) } +func (m Matrix) Swap(i, j int) { m[i], m[j] = m[j], m[i] } + +func (mat Matrix) String() string { + matCp := make(Matrix, len(mat)) + copy(matCp, mat) + sort.Sort(matCp) + + strs := make([]string, len(matCp)) + + for i, ss := range matCp { + strs[i] = ss.String() + } + + return strings.Join(strs, "\n") +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/model/value_test.go b/example/prometheus-mock/vendor/github.com/prometheus/common/model/value_test.go new file mode 100644 index 0000000..b97dcf8 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/model/value_test.go @@ -0,0 +1,468 @@ +// Copyright 2013 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 model + +import ( + "encoding/json" + "math" + "reflect" + "sort" + "testing" +) + +func TestEqualValues(t *testing.T) { + tests := map[string]struct { + in1, in2 SampleValue + want bool + }{ + "equal floats": { + in1: 3.14, + in2: 3.14, + want: true, + }, + "unequal floats": { + in1: 3.14, + in2: 3.1415, + want: false, + }, + "positive inifinities": { + in1: SampleValue(math.Inf(+1)), + in2: SampleValue(math.Inf(+1)), + want: true, + }, + "negative inifinities": { + in1: SampleValue(math.Inf(-1)), + in2: SampleValue(math.Inf(-1)), + want: true, + }, + "different inifinities": { + in1: SampleValue(math.Inf(+1)), + in2: SampleValue(math.Inf(-1)), + want: false, + }, + "number and infinity": { + in1: 42, + in2: SampleValue(math.Inf(+1)), + want: false, + }, + "number and NaN": { + in1: 42, + in2: SampleValue(math.NaN()), + want: false, + }, + "NaNs": { + in1: SampleValue(math.NaN()), + in2: SampleValue(math.NaN()), + want: true, // !!! + }, + } + + for name, test := range tests { + got := test.in1.Equal(test.in2) + if got != test.want { + t.Errorf("Comparing %s, %f and %f: got %t, want %t", name, test.in1, test.in2, got, test.want) + } + } +} + +func TestEqualSamples(t *testing.T) { + testSample := &Sample{} + + tests := map[string]struct { + in1, in2 *Sample + want bool + }{ + "equal pointers": { + in1: testSample, + in2: testSample, + want: true, + }, + "different metrics": { + in1: &Sample{Metric: Metric{"foo": "bar"}}, + in2: &Sample{Metric: Metric{"foo": "biz"}}, + want: false, + }, + "different timestamp": { + in1: &Sample{Timestamp: 0}, + in2: &Sample{Timestamp: 1}, + want: false, + }, + "different value": { + in1: &Sample{Value: 0}, + in2: &Sample{Value: 1}, + want: false, + }, + "equal samples": { + in1: &Sample{ + Metric: Metric{"foo": "bar"}, + Timestamp: 0, + Value: 1, + }, + in2: &Sample{ + Metric: Metric{"foo": "bar"}, + Timestamp: 0, + Value: 1, + }, + want: true, + }, + } + + for name, test := range tests { + got := test.in1.Equal(test.in2) + if got != test.want { + t.Errorf("Comparing %s, %v and %v: got %t, want %t", name, test.in1, test.in2, got, test.want) + } + } + +} + +func TestSamplePairJSON(t *testing.T) { + input := []struct { + plain string + value SamplePair + }{ + { + plain: `[1234.567,"123.1"]`, + value: SamplePair{ + Value: 123.1, + Timestamp: 1234567, + }, + }, + } + + for _, test := range input { + b, err := json.Marshal(test.value) + if err != nil { + t.Error(err) + continue + } + + if string(b) != test.plain { + t.Errorf("encoding error: expected %q, got %q", test.plain, b) + continue + } + + var sp SamplePair + err = json.Unmarshal(b, &sp) + if err != nil { + t.Error(err) + continue + } + + if sp != test.value { + t.Errorf("decoding error: expected %v, got %v", test.value, sp) + } + } +} + +func TestSampleJSON(t *testing.T) { + input := []struct { + plain string + value Sample + }{ + { + plain: `{"metric":{"__name__":"test_metric"},"value":[1234.567,"123.1"]}`, + value: Sample{ + Metric: Metric{ + MetricNameLabel: "test_metric", + }, + Value: 123.1, + Timestamp: 1234567, + }, + }, + } + + for _, test := range input { + b, err := json.Marshal(test.value) + if err != nil { + t.Error(err) + continue + } + + if string(b) != test.plain { + t.Errorf("encoding error: expected %q, got %q", test.plain, b) + continue + } + + var sv Sample + err = json.Unmarshal(b, &sv) + if err != nil { + t.Error(err) + continue + } + + if !reflect.DeepEqual(sv, test.value) { + t.Errorf("decoding error: expected %v, got %v", test.value, sv) + } + } +} + +func TestVectorJSON(t *testing.T) { + input := []struct { + plain string + value Vector + }{ + { + plain: `[]`, + value: Vector{}, + }, + { + plain: `[{"metric":{"__name__":"test_metric"},"value":[1234.567,"123.1"]}]`, + value: Vector{&Sample{ + Metric: Metric{ + MetricNameLabel: "test_metric", + }, + Value: 123.1, + Timestamp: 1234567, + }}, + }, + { + plain: `[{"metric":{"__name__":"test_metric"},"value":[1234.567,"123.1"]},{"metric":{"foo":"bar"},"value":[1.234,"+Inf"]}]`, + value: Vector{ + &Sample{ + Metric: Metric{ + MetricNameLabel: "test_metric", + }, + Value: 123.1, + Timestamp: 1234567, + }, + &Sample{ + Metric: Metric{ + "foo": "bar", + }, + Value: SampleValue(math.Inf(1)), + Timestamp: 1234, + }, + }, + }, + } + + for _, test := range input { + b, err := json.Marshal(test.value) + if err != nil { + t.Error(err) + continue + } + + if string(b) != test.plain { + t.Errorf("encoding error: expected %q, got %q", test.plain, b) + continue + } + + var vec Vector + err = json.Unmarshal(b, &vec) + if err != nil { + t.Error(err) + continue + } + + if !reflect.DeepEqual(vec, test.value) { + t.Errorf("decoding error: expected %v, got %v", test.value, vec) + } + } +} + +func TestScalarJSON(t *testing.T) { + input := []struct { + plain string + value Scalar + }{ + { + plain: `[123.456,"456"]`, + value: Scalar{ + Timestamp: 123456, + Value: 456, + }, + }, + { + plain: `[123123.456,"+Inf"]`, + value: Scalar{ + Timestamp: 123123456, + Value: SampleValue(math.Inf(1)), + }, + }, + { + plain: `[123123.456,"-Inf"]`, + value: Scalar{ + Timestamp: 123123456, + Value: SampleValue(math.Inf(-1)), + }, + }, + } + + for _, test := range input { + b, err := json.Marshal(test.value) + if err != nil { + t.Error(err) + continue + } + + if string(b) != test.plain { + t.Errorf("encoding error: expected %q, got %q", test.plain, b) + continue + } + + var sv Scalar + err = json.Unmarshal(b, &sv) + if err != nil { + t.Error(err) + continue + } + + if sv != test.value { + t.Errorf("decoding error: expected %v, got %v", test.value, sv) + } + } +} + +func TestStringJSON(t *testing.T) { + input := []struct { + plain string + value String + }{ + { + plain: `[123.456,"test"]`, + value: String{ + Timestamp: 123456, + Value: "test", + }, + }, + { + plain: `[123123.456,"台北"]`, + value: String{ + Timestamp: 123123456, + Value: "台北", + }, + }, + } + + for _, test := range input { + b, err := json.Marshal(test.value) + if err != nil { + t.Error(err) + continue + } + + if string(b) != test.plain { + t.Errorf("encoding error: expected %q, got %q", test.plain, b) + continue + } + + var sv String + err = json.Unmarshal(b, &sv) + if err != nil { + t.Error(err) + continue + } + + if sv != test.value { + t.Errorf("decoding error: expected %v, got %v", test.value, sv) + } + } +} + +func TestVectorSort(t *testing.T) { + input := Vector{ + &Sample{ + Metric: Metric{ + MetricNameLabel: "A", + }, + Timestamp: 1, + }, + &Sample{ + Metric: Metric{ + MetricNameLabel: "A", + }, + Timestamp: 2, + }, + &Sample{ + Metric: Metric{ + MetricNameLabel: "C", + }, + Timestamp: 1, + }, + &Sample{ + Metric: Metric{ + MetricNameLabel: "C", + }, + Timestamp: 2, + }, + &Sample{ + Metric: Metric{ + MetricNameLabel: "B", + }, + Timestamp: 1, + }, + &Sample{ + Metric: Metric{ + MetricNameLabel: "B", + }, + Timestamp: 2, + }, + } + + expected := Vector{ + &Sample{ + Metric: Metric{ + MetricNameLabel: "A", + }, + Timestamp: 1, + }, + &Sample{ + Metric: Metric{ + MetricNameLabel: "A", + }, + Timestamp: 2, + }, + &Sample{ + Metric: Metric{ + MetricNameLabel: "B", + }, + Timestamp: 1, + }, + &Sample{ + Metric: Metric{ + MetricNameLabel: "B", + }, + Timestamp: 2, + }, + &Sample{ + Metric: Metric{ + MetricNameLabel: "C", + }, + Timestamp: 1, + }, + &Sample{ + Metric: Metric{ + MetricNameLabel: "C", + }, + Timestamp: 2, + }, + } + + sort.Sort(input) + + for i, actual := range input { + actualFp := actual.Metric.Fingerprint() + expectedFp := expected[i].Metric.Fingerprint() + + if actualFp != expectedFp { + t.Fatalf("%d. Incorrect fingerprint. Got %s; want %s", i, actualFp.String(), expectedFp.String()) + } + + if actual.Timestamp != expected[i].Timestamp { + t.Fatalf("%d. Incorrect timestamp. Got %s; want %s", i, actual.Timestamp, expected[i].Timestamp) + } + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/promlog/flag/flag.go b/example/prometheus-mock/vendor/github.com/prometheus/common/promlog/flag/flag.go new file mode 100644 index 0000000..b9d361e --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/promlog/flag/flag.go @@ -0,0 +1,33 @@ +// Copyright 2017 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 flag + +import ( + "github.com/prometheus/common/promlog" + kingpin "gopkg.in/alecthomas/kingpin.v2" +) + +// LevelFlagName is the canonical flag name to configure the allowed log level +// within Prometheus projects. +const LevelFlagName = "log.level" + +// LevelFlagHelp is the help description for the log.level flag. +const LevelFlagHelp = "Only log messages with the given severity or above. One of: [debug, info, warn, error]" + +// AddFlags adds the flags used by this package to the Kingpin application. +// To use the default Kingpin application, call AddFlags(kingpin.CommandLine) +func AddFlags(a *kingpin.Application, logLevel *promlog.AllowedLevel) { + a.Flag(LevelFlagName, LevelFlagHelp). + Default("info").SetValue(logLevel) +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/promlog/log.go b/example/prometheus-mock/vendor/github.com/prometheus/common/promlog/log.go new file mode 100644 index 0000000..cf8307a --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/promlog/log.go @@ -0,0 +1,63 @@ +// Copyright 2017 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 promlog defines standardised ways to initialize Go kit loggers +// across Prometheus components. +// It should typically only ever be imported by main packages. +package promlog + +import ( + "os" + + "github.com/go-kit/kit/log" + "github.com/go-kit/kit/log/level" + "github.com/pkg/errors" +) + +// AllowedLevel is a settable identifier for the minimum level a log entry +// must be have. +type AllowedLevel struct { + s string + o level.Option +} + +func (l *AllowedLevel) String() string { + return l.s +} + +// Set updates the value of the allowed level. +func (l *AllowedLevel) Set(s string) error { + switch s { + case "debug": + l.o = level.AllowDebug() + case "info": + l.o = level.AllowInfo() + case "warn": + l.o = level.AllowWarn() + case "error": + l.o = level.AllowError() + default: + return errors.Errorf("unrecognized log level %q", s) + } + l.s = s + return nil +} + +// New returns a new leveled oklog logger in the logfmt format. Each logged line will be annotated +// with a timestamp. The output always goes to stderr. +func New(al AllowedLevel) log.Logger { + l := log.NewLogfmtLogger(log.NewSyncWriter(os.Stderr)) + l = level.NewFilter(l, al.o) + l = log.With(l, "ts", log.DefaultTimestampUTC, "caller", log.DefaultCaller) + return l +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/route/route.go b/example/prometheus-mock/vendor/github.com/prometheus/common/route/route.go new file mode 100644 index 0000000..bb46881 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/route/route.go @@ -0,0 +1,100 @@ +package route + +import ( + "net/http" + + "github.com/julienschmidt/httprouter" + "golang.org/x/net/context" +) + +type param string + +// Param returns param p for the context. +func Param(ctx context.Context, p string) string { + return ctx.Value(param(p)).(string) +} + +// WithParam returns a new context with param p set to v. +func WithParam(ctx context.Context, p, v string) context.Context { + return context.WithValue(ctx, param(p), v) +} + +// Router wraps httprouter.Router and adds support for prefixed sub-routers +// and per-request context injections. +type Router struct { + rtr *httprouter.Router + prefix string +} + +// New returns a new Router. +func New() *Router { + return &Router{ + rtr: httprouter.New(), + } +} + +// WithPrefix returns a router that prefixes all registered routes with prefix. +func (r *Router) WithPrefix(prefix string) *Router { + return &Router{rtr: r.rtr, prefix: r.prefix + prefix} +} + +// handle turns a HandlerFunc into an httprouter.Handle. +func (r *Router) handle(h http.HandlerFunc) httprouter.Handle { + return func(w http.ResponseWriter, req *http.Request, params httprouter.Params) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + + for _, p := range params { + ctx = context.WithValue(ctx, param(p.Key), p.Value) + } + h(w, req.WithContext(ctx)) + } +} + +// Get registers a new GET route. +func (r *Router) Get(path string, h http.HandlerFunc) { + r.rtr.GET(r.prefix+path, r.handle(h)) +} + +// Options registers a new OPTIONS route. +func (r *Router) Options(path string, h http.HandlerFunc) { + r.rtr.OPTIONS(r.prefix+path, r.handle(h)) +} + +// Del registers a new DELETE route. +func (r *Router) Del(path string, h http.HandlerFunc) { + r.rtr.DELETE(r.prefix+path, r.handle(h)) +} + +// Put registers a new PUT route. +func (r *Router) Put(path string, h http.HandlerFunc) { + r.rtr.PUT(r.prefix+path, r.handle(h)) +} + +// Post registers a new POST route. +func (r *Router) Post(path string, h http.HandlerFunc) { + r.rtr.POST(r.prefix+path, r.handle(h)) +} + +// Redirect takes an absolute path and sends an internal HTTP redirect for it, +// prefixed by the router's path prefix. Note that this method does not include +// functionality for handling relative paths or full URL redirects. +func (r *Router) Redirect(w http.ResponseWriter, req *http.Request, path string, code int) { + http.Redirect(w, req, r.prefix+path, code) +} + +// ServeHTTP implements http.Handler. +func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request) { + r.rtr.ServeHTTP(w, req) +} + +// FileServe returns a new http.HandlerFunc that serves files from dir. +// Using routes must provide the *filepath parameter. +func FileServe(dir string) http.HandlerFunc { + fs := http.FileServer(http.Dir(dir)) + + return func(w http.ResponseWriter, r *http.Request) { + r.URL.Path = Param(r.Context(), "filepath") + fs.ServeHTTP(w, r) + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/route/route_test.go b/example/prometheus-mock/vendor/github.com/prometheus/common/route/route_test.go new file mode 100644 index 0000000..a9bb209 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/route/route_test.go @@ -0,0 +1,44 @@ +package route + +import ( + "net/http" + "net/http/httptest" + "testing" +) + +func TestRedirect(t *testing.T) { + router := New().WithPrefix("/test/prefix") + w := httptest.NewRecorder() + r, err := http.NewRequest("GET", "http://localhost:9090/foo", nil) + if err != nil { + t.Fatalf("Error building test request: %s", err) + } + + router.Redirect(w, r, "/some/endpoint", http.StatusFound) + if w.Code != http.StatusFound { + t.Fatalf("Unexpected redirect status code: got %d, want %d", w.Code, http.StatusFound) + } + + want := "/test/prefix/some/endpoint" + got := w.Header()["Location"][0] + if want != got { + t.Fatalf("Unexpected redirect location: got %s, want %s", got, want) + } +} + +func TestContext(t *testing.T) { + router := New() + router.Get("/test/:foo/", func(w http.ResponseWriter, r *http.Request) { + want := "bar" + got := Param(r.Context(), "foo") + if want != got { + t.Fatalf("Unexpected context value: want %q, got %q", want, got) + } + }) + + r, err := http.NewRequest("GET", "http://localhost:9090/test/bar/", nil) + if err != nil { + t.Fatalf("Error building test request: %s", err) + } + router.ServeHTTP(nil, r) +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/common/version/info.go b/example/prometheus-mock/vendor/github.com/prometheus/common/version/info.go new file mode 100644 index 0000000..84489a5 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/common/version/info.go @@ -0,0 +1,89 @@ +// Copyright 2016 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 version + +import ( + "bytes" + "fmt" + "runtime" + "strings" + "text/template" + + "github.com/prometheus/client_golang/prometheus" +) + +// Build information. Populated at build-time. +var ( + Version string + Revision string + Branch string + BuildUser string + BuildDate string + GoVersion = runtime.Version() +) + +// NewCollector returns a collector which exports metrics about current version information. +func NewCollector(program string) *prometheus.GaugeVec { + buildInfo := prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Namespace: program, + Name: "build_info", + Help: fmt.Sprintf( + "A metric with a constant '1' value labeled by version, revision, branch, and goversion from which %s was built.", + program, + ), + }, + []string{"version", "revision", "branch", "goversion"}, + ) + buildInfo.WithLabelValues(Version, Revision, Branch, GoVersion).Set(1) + return buildInfo +} + +// versionInfoTmpl contains the template used by Info. +var versionInfoTmpl = ` +{{.program}}, version {{.version}} (branch: {{.branch}}, revision: {{.revision}}) + build user: {{.buildUser}} + build date: {{.buildDate}} + go version: {{.goVersion}} +` + +// Print returns version information. +func Print(program string) string { + m := map[string]string{ + "program": program, + "version": Version, + "revision": Revision, + "branch": Branch, + "buildUser": BuildUser, + "buildDate": BuildDate, + "goVersion": GoVersion, + } + t := template.Must(template.New("version").Parse(versionInfoTmpl)) + + var buf bytes.Buffer + if err := t.ExecuteTemplate(&buf, "version", m); err != nil { + panic(err) + } + return strings.TrimSpace(buf.String()) +} + +// Info returns version, branch and revision information. +func Info() string { + return fmt.Sprintf("(version=%s, branch=%s, revision=%s)", Version, Branch, Revision) +} + +// BuildContext returns goVersion, buildUser and buildDate information. +func BuildContext() string { + return fmt.Sprintf("(go=%s, user=%s, date=%s)", GoVersion, BuildUser, BuildDate) +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/.travis.yml b/example/prometheus-mock/vendor/github.com/prometheus/procfs/.travis.yml new file mode 100644 index 0000000..ee09bb7 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/.travis.yml @@ -0,0 +1,5 @@ +sudo: false +language: go +go: + - 1.7.6 + - 1.8.3 diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/CONTRIBUTING.md b/example/prometheus-mock/vendor/github.com/prometheus/procfs/CONTRIBUTING.md new file mode 100644 index 0000000..40503ed --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/CONTRIBUTING.md @@ -0,0 +1,18 @@ +# Contributing + +Prometheus uses GitHub to manage reviews of pull requests. + +* If you have a trivial fix or improvement, go ahead and create a pull request, + addressing (with `@...`) the maintainer of this repository (see + [MAINTAINERS.md](MAINTAINERS.md)) in the description of the pull request. + +* If you plan to do something more involved, first discuss your ideas + on our [mailing list](https://groups.google.com/forum/?fromgroups#!forum/prometheus-developers). + This will avoid unnecessary work and surely give you and us a good deal + of inspiration. + +* Relevant coding style guidelines are the [Go Code Review + Comments](https://code.google.com/p/go-wiki/wiki/CodeReviewComments) + and the _Formatting and style_ section of Peter Bourgon's [Go: Best + Practices for Production + Environments](http://peter.bourgon.org/go-in-production/#formatting-and-style). diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/LICENSE b/example/prometheus-mock/vendor/github.com/prometheus/procfs/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/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 [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/example/prometheus-mock/vendor/github.com/prometheus/procfs/MAINTAINERS.md b/example/prometheus-mock/vendor/github.com/prometheus/procfs/MAINTAINERS.md new file mode 100644 index 0000000..35993c4 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/MAINTAINERS.md @@ -0,0 +1 @@ +* Tobias Schmidt diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/Makefile b/example/prometheus-mock/vendor/github.com/prometheus/procfs/Makefile new file mode 100644 index 0000000..dd48afd --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/Makefile @@ -0,0 +1,18 @@ +ci: fmt lint test + +fmt: + ! gofmt -l *.go | read nothing + go vet + +lint: + go get github.com/golang/lint/golint + golint *.go + +test: sysfs/fixtures/.unpacked + go test -v ./... + +sysfs/fixtures/.unpacked: sysfs/fixtures.ttar + ./ttar -C sysfs -x -f sysfs/fixtures.ttar + touch $@ + +.PHONY: fmt lint test ci diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/NOTICE b/example/prometheus-mock/vendor/github.com/prometheus/procfs/NOTICE new file mode 100644 index 0000000..53c5e9a --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/NOTICE @@ -0,0 +1,7 @@ +procfs provides functions to retrieve system, kernel and process +metrics from the pseudo-filesystem proc. + +Copyright 2014-2015 The Prometheus Authors + +This product includes software developed at +SoundCloud Ltd. (http://soundcloud.com/). diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/README.md b/example/prometheus-mock/vendor/github.com/prometheus/procfs/README.md new file mode 100644 index 0000000..2095494 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/README.md @@ -0,0 +1,11 @@ +# procfs + +This procfs package provides functions to retrieve system, kernel and process +metrics from the pseudo-filesystem proc. + +*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 Report Card](https://goreportcard.com/badge/github.com/prometheus/procfs)](https://goreportcard.com/report/github.com/prometheus/procfs) diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/bcache/bcache.go b/example/prometheus-mock/vendor/github.com/prometheus/procfs/bcache/bcache.go new file mode 100644 index 0000000..1db178c --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/bcache/bcache.go @@ -0,0 +1,84 @@ +// Copyright 2017 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 bcache provides access to statistics exposed by the bcache (Linux +// block cache). +package bcache + +// Stats contains bcache runtime statistics, parsed from /sys/fs/bcache/. +// +// The names and meanings of each statistic were taken from bcache.txt and +// files in drivers/md/bcache in the Linux kernel source. Counters are uint64 +// (in-kernel counters are mostly unsigned long). +type Stats struct { + // The name of the bcache used to source these statistics. + Name string + Bcache BcacheStats + Bdevs []BdevStats + Caches []CacheStats +} + +// BcacheStats contains statistics tied to a bcache ID. +type BcacheStats struct { + AverageKeySize uint64 + BtreeCacheSize uint64 + CacheAvailablePercent uint64 + Congested uint64 + RootUsagePercent uint64 + TreeDepth uint64 + Internal InternalStats + FiveMin PeriodStats + Total PeriodStats +} + +// BdevStats contains statistics for one backing device. +type BdevStats struct { + Name string + DirtyData uint64 + FiveMin PeriodStats + Total PeriodStats +} + +// CacheStats contains statistics for one cache device. +type CacheStats struct { + Name string + IOErrors uint64 + MetadataWritten uint64 + Written uint64 + Priority PriorityStats +} + +// PriorityStats contains statistics from the priority_stats file. +type PriorityStats struct { + UnusedPercent uint64 + MetadataPercent uint64 +} + +// InternalStats contains internal bcache statistics. +type InternalStats struct { + ActiveJournalEntries uint64 + BtreeNodes uint64 + BtreeReadAverageDurationNanoSeconds uint64 + CacheReadRaces uint64 +} + +// PeriodStats contains statistics for a time period (5 min or total). +type PeriodStats struct { + Bypassed uint64 + CacheBypassHits uint64 + CacheBypassMisses uint64 + CacheHits uint64 + CacheMissCollisions uint64 + CacheMisses uint64 + CacheReadaheads uint64 +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/bcache/get.go b/example/prometheus-mock/vendor/github.com/prometheus/procfs/bcache/get.go new file mode 100644 index 0000000..4d56f3d --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/bcache/get.go @@ -0,0 +1,330 @@ +// Copyright 2017 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 bcache + +import ( + "bufio" + "fmt" + "io/ioutil" + "os" + "path" + "path/filepath" + "strconv" + "strings" +) + +// ParsePseudoFloat parses the peculiar format produced by bcache's bch_hprint. +func parsePseudoFloat(str string) (float64, error) { + ss := strings.Split(str, ".") + + intPart, err := strconv.ParseFloat(ss[0], 64) + if err != nil { + return 0, err + } + + if len(ss) == 1 { + // Pure integers are fine. + return intPart, nil + } + fracPart, err := strconv.ParseFloat(ss[1], 64) + if err != nil { + return 0, err + } + // fracPart is a number between 0 and 1023 divided by 100; it is off + // by a small amount. Unexpected bumps in time lines may occur because + // for bch_hprint .1 != .10 and .10 > .9 (at least up to Linux + // v4.12-rc3). + + // Restore the proper order: + fracPart = fracPart / 10.24 + return intPart + fracPart, nil +} + +// Dehumanize converts a human-readable byte slice into a uint64. +func dehumanize(hbytes []byte) (uint64, error) { + ll := len(hbytes) + if ll == 0 { + return 0, fmt.Errorf("zero-length reply") + } + lastByte := hbytes[ll-1] + mul := float64(1) + var ( + mant float64 + err error + ) + // If lastByte is beyond the range of ASCII digits, it must be a + // multiplier. + if lastByte > 57 { + // Remove multiplier from slice. + hbytes = hbytes[:len(hbytes)-1] + + const ( + _ = 1 << (10 * iota) + KiB + MiB + GiB + TiB + PiB + EiB + ZiB + YiB + ) + + multipliers := map[rune]float64{ + // Source for conversion rules: + // linux-kernel/drivers/md/bcache/util.c:bch_hprint() + 'k': KiB, + 'M': MiB, + 'G': GiB, + 'T': TiB, + 'P': PiB, + 'E': EiB, + 'Z': ZiB, + 'Y': YiB, + } + mul = float64(multipliers[rune(lastByte)]) + mant, err = parsePseudoFloat(string(hbytes)) + if err != nil { + return 0, err + } + } else { + // Not humanized by bch_hprint + mant, err = strconv.ParseFloat(string(hbytes), 64) + if err != nil { + return 0, err + } + } + res := uint64(mant * mul) + return res, nil +} + +type parser struct { + uuidPath string + subDir string + currentDir string + err error +} + +func (p *parser) setSubDir(pathElements ...string) { + p.subDir = path.Join(pathElements...) + p.currentDir = path.Join(p.uuidPath, p.subDir) +} + +func (p *parser) readValue(fileName string) uint64 { + if p.err != nil { + return 0 + } + path := path.Join(p.currentDir, fileName) + byt, err := ioutil.ReadFile(path) + if err != nil { + p.err = fmt.Errorf("failed to read: %s", path) + return 0 + } + // Remove trailing newline. + byt = byt[:len(byt)-1] + res, err := dehumanize(byt) + p.err = err + return res +} + +// ParsePriorityStats parses lines from the priority_stats file. +func parsePriorityStats(line string, ps *PriorityStats) (error) { + var ( + value uint64 + err error + ) + switch { + case strings.HasPrefix(line, "Unused:"): + fields := strings.Fields(line) + rawValue := fields[len(fields)-1] + valueStr := strings.TrimSuffix(rawValue, "%") + value, err = strconv.ParseUint(valueStr, 10, 64) + if err != nil { + return err + } + ps.UnusedPercent = value + case strings.HasPrefix(line, "Metadata:"): + fields := strings.Fields(line) + rawValue := fields[len(fields)-1] + valueStr := strings.TrimSuffix(rawValue, "%") + value, err = strconv.ParseUint(valueStr, 10, 64) + if err != nil { + return err + } + ps.MetadataPercent = value + } + return nil +} + +func (p *parser) getPriorityStats() PriorityStats { + var res PriorityStats + + if p.err != nil { + return res + } + + path := path.Join(p.currentDir, "priority_stats") + + file, err := os.Open(path) + if err != nil { + p.err = fmt.Errorf("failed to read: %s", path) + return res + } + defer file.Close() + + scanner := bufio.NewScanner(file) + for scanner.Scan() { + err = parsePriorityStats(scanner.Text(), &res) + if err != nil { + p.err = fmt.Errorf("failed to parse: %s (%s)", path, err) + return res + } + } + if err := scanner.Err(); err != nil { + p.err = fmt.Errorf("failed to parse: %s (%s)", path, err) + return res + } + return res +} + +// GetStats collects from sysfs files data tied to one bcache ID. +func GetStats(uuidPath string) (*Stats, error) { + var bs Stats + + par := parser{uuidPath: uuidPath} + + // bcache stats + + // dir + par.setSubDir("") + bs.Bcache.AverageKeySize = par.readValue("average_key_size") + bs.Bcache.BtreeCacheSize = par.readValue("btree_cache_size") + bs.Bcache.CacheAvailablePercent = par.readValue("cache_available_percent") + bs.Bcache.Congested = par.readValue("congested") + bs.Bcache.RootUsagePercent = par.readValue("root_usage_percent") + bs.Bcache.TreeDepth = par.readValue("tree_depth") + + // bcache stats (internal) + + // dir /internal + par.setSubDir("internal") + bs.Bcache.Internal.ActiveJournalEntries = par.readValue("active_journal_entries") + bs.Bcache.Internal.BtreeNodes = par.readValue("btree_nodes") + bs.Bcache.Internal.BtreeReadAverageDurationNanoSeconds = par.readValue("btree_read_average_duration_us") + bs.Bcache.Internal.CacheReadRaces = par.readValue("cache_read_races") + + // bcache stats (period) + + // dir /stats_five_minute + par.setSubDir("stats_five_minute") + bs.Bcache.FiveMin.Bypassed = par.readValue("bypassed") + bs.Bcache.FiveMin.CacheHits = par.readValue("cache_hits") + + bs.Bcache.FiveMin.Bypassed = par.readValue("bypassed") + bs.Bcache.FiveMin.CacheBypassHits = par.readValue("cache_bypass_hits") + bs.Bcache.FiveMin.CacheBypassMisses = par.readValue("cache_bypass_misses") + bs.Bcache.FiveMin.CacheHits = par.readValue("cache_hits") + bs.Bcache.FiveMin.CacheMissCollisions = par.readValue("cache_miss_collisions") + bs.Bcache.FiveMin.CacheMisses = par.readValue("cache_misses") + bs.Bcache.FiveMin.CacheReadaheads = par.readValue("cache_readaheads") + + // dir /stats_total + par.setSubDir("stats_total") + bs.Bcache.Total.Bypassed = par.readValue("bypassed") + bs.Bcache.Total.CacheHits = par.readValue("cache_hits") + + bs.Bcache.Total.Bypassed = par.readValue("bypassed") + bs.Bcache.Total.CacheBypassHits = par.readValue("cache_bypass_hits") + bs.Bcache.Total.CacheBypassMisses = par.readValue("cache_bypass_misses") + bs.Bcache.Total.CacheHits = par.readValue("cache_hits") + bs.Bcache.Total.CacheMissCollisions = par.readValue("cache_miss_collisions") + bs.Bcache.Total.CacheMisses = par.readValue("cache_misses") + bs.Bcache.Total.CacheReadaheads = par.readValue("cache_readaheads") + + if par.err != nil { + return nil, par.err + } + + // bdev stats + + reg := path.Join(uuidPath, "bdev[0-9]*") + bdevDirs, err := filepath.Glob(reg) + if err != nil { + return nil, err + } + + bs.Bdevs = make([]BdevStats, len(bdevDirs)) + + for ii, bdevDir := range bdevDirs { + var bds = &bs.Bdevs[ii] + + bds.Name = filepath.Base(bdevDir) + + par.setSubDir(bds.Name) + bds.DirtyData = par.readValue("dirty_data") + + // dir //stats_five_minute + par.setSubDir(bds.Name, "stats_five_minute") + bds.FiveMin.Bypassed = par.readValue("bypassed") + bds.FiveMin.CacheBypassHits = par.readValue("cache_bypass_hits") + bds.FiveMin.CacheBypassMisses = par.readValue("cache_bypass_misses") + bds.FiveMin.CacheHits = par.readValue("cache_hits") + bds.FiveMin.CacheMissCollisions = par.readValue("cache_miss_collisions") + bds.FiveMin.CacheMisses = par.readValue("cache_misses") + bds.FiveMin.CacheReadaheads = par.readValue("cache_readaheads") + + // dir //stats_total + par.setSubDir("stats_total") + bds.Total.Bypassed = par.readValue("bypassed") + bds.Total.CacheBypassHits = par.readValue("cache_bypass_hits") + bds.Total.CacheBypassMisses = par.readValue("cache_bypass_misses") + bds.Total.CacheHits = par.readValue("cache_hits") + bds.Total.CacheMissCollisions = par.readValue("cache_miss_collisions") + bds.Total.CacheMisses = par.readValue("cache_misses") + bds.Total.CacheReadaheads = par.readValue("cache_readaheads") + } + + if par.err != nil { + return nil, par.err + } + + // cache stats + + reg = path.Join(uuidPath, "cache[0-9]*") + cacheDirs, err := filepath.Glob(reg) + if err != nil { + return nil, err + } + bs.Caches = make([]CacheStats, len(cacheDirs)) + + for ii, cacheDir := range cacheDirs { + var cs = &bs.Caches[ii] + cs.Name = filepath.Base(cacheDir) + + // dir is / + par.setSubDir(cs.Name) + cs.IOErrors = par.readValue("io_errors") + cs.MetadataWritten = par.readValue("metadata_written") + cs.Written = par.readValue("written") + + ps := par.getPriorityStats() + cs.Priority = ps + } + + if par.err != nil { + return nil, par.err + } + + return &bs, nil +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/bcache/get_test.go b/example/prometheus-mock/vendor/github.com/prometheus/procfs/bcache/get_test.go new file mode 100644 index 0000000..38c3df5 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/bcache/get_test.go @@ -0,0 +1,114 @@ +// Copyright 2017 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 bcache + +import ( + "testing" + "math" +) + +func TestDehumanizeTests(t *testing.T) { + dehumanizeTests := []struct { + in []byte + out uint64 + invalid bool + }{ + { + in: []byte("542k"), + out: 555008, + }, + { + in: []byte("322M"), + out: 337641472, + }, + { + in: []byte("1.1k"), + out: 1124, + }, + { + in: []byte("1.9k"), + out: 1924, + }, + { + in: []byte("1.10k"), + out: 2024, + }, + { + in: []byte(""), + out: 0, + invalid: true, + }, + } + for _, tst := range dehumanizeTests { + got, err := dehumanize(tst.in) + if tst.invalid && err == nil { + t.Error("expected an error, but none occurred") + } + if !tst.invalid && err != nil { + t.Errorf("unexpected error: %v", err) + } + if got != tst.out { + t.Errorf("dehumanize: '%s', want %f, got %f", tst.in, tst.out, got) + } + } +} + +func TestParsePseudoFloatTests(t *testing.T) { + parsePseudoFloatTests := []struct { + in string + out float64 + }{ + { + in: "1.1", + out: float64(1.097656), + }, + { + in: "1.9", + out: float64(1.878906), + }, + { + in: "1.10", + out: float64(1.976562), + }, + } + for _, tst := range parsePseudoFloatTests { + got, err := parsePseudoFloat(tst.in) + if err != nil || math.Abs(got - tst.out) > 0.0001 { + t.Errorf("parsePseudoFloat: %s, want %f, got %f", tst.in, tst.out, got) + } + } +} + +func TestPriorityStats(t *testing.T) { + var want = PriorityStats{ + UnusedPercent: 99, + MetadataPercent: 5, + } + var ( + in string + gotErr error + got PriorityStats + ) + in = "Metadata: 5%" + gotErr = parsePriorityStats(in, &got) + if gotErr != nil || got.MetadataPercent != want.MetadataPercent { + t.Errorf("parsePriorityStats: '%s', want %f, got %f", in, want.MetadataPercent, got.MetadataPercent) + } + + in = "Unused: 99%" + gotErr = parsePriorityStats(in, &got) + if gotErr != nil || got.UnusedPercent != want.UnusedPercent { + t.Errorf("parsePriorityStats: '%s', want %f, got %f", in, want.UnusedPercent, got.UnusedPercent) + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/buddyinfo.go b/example/prometheus-mock/vendor/github.com/prometheus/procfs/buddyinfo.go new file mode 100644 index 0000000..680a984 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/buddyinfo.go @@ -0,0 +1,95 @@ +// Copyright 2017 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" + "fmt" + "io" + "os" + "strconv" + "strings" +) + +// A BuddyInfo is the details parsed from /proc/buddyinfo. +// The data is comprised of an array of free fragments of each size. +// The sizes are 2^n*PAGE_SIZE, where n is the array index. +type BuddyInfo struct { + Node string + Zone string + Sizes []float64 +} + +// NewBuddyInfo reads the buddyinfo statistics. +func NewBuddyInfo() ([]BuddyInfo, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return nil, err + } + + return fs.NewBuddyInfo() +} + +// NewBuddyInfo reads the buddyinfo statistics from the specified `proc` filesystem. +func (fs FS) NewBuddyInfo() ([]BuddyInfo, error) { + file, err := os.Open(fs.Path("buddyinfo")) + if err != nil { + return nil, err + } + defer file.Close() + + return parseBuddyInfo(file) +} + +func parseBuddyInfo(r io.Reader) ([]BuddyInfo, error) { + var ( + buddyInfo = []BuddyInfo{} + scanner = bufio.NewScanner(r) + bucketCount = -1 + ) + + for scanner.Scan() { + var err error + line := scanner.Text() + parts := strings.Fields(string(line)) + + if len(parts) < 4 { + return nil, fmt.Errorf("invalid number of fields when parsing buddyinfo") + } + + node := strings.TrimRight(parts[1], ",") + zone := strings.TrimRight(parts[3], ",") + arraySize := len(parts[4:]) + + if bucketCount == -1 { + bucketCount = arraySize + } else { + if bucketCount != arraySize { + return nil, fmt.Errorf("mismatch in number of buddyinfo buckets, previous count %d, new count %d", bucketCount, arraySize) + } + } + + sizes := make([]float64, arraySize) + for i := 0; i < arraySize; i++ { + sizes[i], err = strconv.ParseFloat(parts[i+4], 64) + if err != nil { + return nil, fmt.Errorf("invalid value in buddyinfo: %s", err) + } + } + + buddyInfo = append(buddyInfo, BuddyInfo{node, zone, sizes}) + } + + return buddyInfo, scanner.Err() +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/buddyinfo_test.go b/example/prometheus-mock/vendor/github.com/prometheus/procfs/buddyinfo_test.go new file mode 100644 index 0000000..bcf9355 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/buddyinfo_test.go @@ -0,0 +1,64 @@ +// Copyright 2017 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" + "testing" +) + +func TestBuddyInfo(t *testing.T) { + buddyInfo, err := FS("fixtures/buddyinfo/valid").NewBuddyInfo() + if err != nil { + t.Fatal(err) + } + + if want, got := "DMA", buddyInfo[0].Zone; want != got { + t.Errorf("want Node 0, Zone %s, got %s", want, got) + } + + if want, got := "Normal", buddyInfo[2].Zone; want != got { + t.Errorf("want Node 0, Zone %s, got %s", want, got) + } + + if want, got := 4381.0, buddyInfo[2].Sizes[0]; want != got { + t.Errorf("want Node 0, Zone Normal %f, got %f", want, got) + } + + if want, got := 572.0, buddyInfo[1].Sizes[1]; want != got { + t.Errorf("want Node 0, Zone DMA32 %f, got %f", want, got) + } +} + +func TestBuddyInfoShort(t *testing.T) { + _, err := FS("fixtures/buddyinfo/short").NewBuddyInfo() + if err == nil { + t.Errorf("expected error, but none occurred") + } + + if want, got := "invalid number of fields when parsing buddyinfo", err.Error(); want != got { + t.Errorf("wrong error returned, wanted %q, got %q", want, got) + } +} + +func TestBuddyInfoSizeMismatch(t *testing.T) { + _, err := FS("fixtures/buddyinfo/sizemismatch").NewBuddyInfo() + if err == nil { + t.Errorf("expected error, but none occurred") + } + + if want, got := "mismatch in number of buddyinfo buckets", err.Error(); !strings.HasPrefix(got, want) { + t.Errorf("wrong error returned, wanted prefix %q, got %q", want, got) + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/doc.go b/example/prometheus-mock/vendor/github.com/prometheus/procfs/doc.go new file mode 100644 index 0000000..e2acd6d --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/doc.go @@ -0,0 +1,45 @@ +// Copyright 2014 Prometheus Team +// 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 provides functions to retrieve system, kernel and process +// metrics from the pseudo-filesystem proc. +// +// Example: +// +// package main +// +// import ( +// "fmt" +// "log" +// +// "github.com/prometheus/procfs" +// ) +// +// func main() { +// p, err := procfs.Self() +// if err != nil { +// log.Fatalf("could not get process: %s", err) +// } +// +// stat, err := p.NewStat() +// if err != nil { +// log.Fatalf("could not get process stat: %s", err) +// } +// +// fmt.Printf("command: %s\n", stat.Comm) +// fmt.Printf("cpu time: %fs\n", stat.CPUTime()) +// fmt.Printf("vsize: %dB\n", stat.VirtualMemory()) +// fmt.Printf("rss: %dB\n", stat.ResidentMemory()) +// } +// +package procfs diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/cmdline b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/cmdline new file mode 100644 index 0000000000000000000000000000000000000000..d2d8ef88764f6c9f819285f534aa70835a54950c GIT binary patch literal 16 XcmXTR%w;G^EiTbZ&u7p!G++P#E?@+m literal 0 HcmV?d00001 diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/comm b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/comm new file mode 100644 index 0000000..f027e0d --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/comm @@ -0,0 +1 @@ +vim diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/exe b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/exe new file mode 120000 index 0000000..a91bec4 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/exe @@ -0,0 +1 @@ +/usr/bin/vim \ No newline at end of file diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/fd/0 b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/fd/0 new file mode 120000 index 0000000..da9c5df --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/fd/0 @@ -0,0 +1 @@ +../../symlinktargets/abc \ No newline at end of file diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/fd/1 b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/fd/1 new file mode 120000 index 0000000..ca47b50 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/fd/1 @@ -0,0 +1 @@ +../../symlinktargets/def \ No newline at end of file diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/fd/10 b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/fd/10 new file mode 120000 index 0000000..c086831 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/fd/10 @@ -0,0 +1 @@ +../../symlinktargets/xyz \ No newline at end of file diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/fd/2 b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/fd/2 new file mode 120000 index 0000000..66731c0 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/fd/2 @@ -0,0 +1 @@ +../../symlinktargets/ghi \ No newline at end of file diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/fd/3 b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/fd/3 new file mode 120000 index 0000000..0135dce --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/fd/3 @@ -0,0 +1 @@ +../../symlinktargets/uvw \ No newline at end of file diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/io b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/io new file mode 100644 index 0000000..b6210a7 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/io @@ -0,0 +1,7 @@ +rchar: 750339 +wchar: 818609 +syscr: 7405 +syscw: 5245 +read_bytes: 1024 +write_bytes: 2048 +cancelled_write_bytes: -1024 diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/limits b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/limits new file mode 100644 index 0000000..23c6b68 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/limits @@ -0,0 +1,17 @@ +Limit Soft Limit Hard Limit Units +Max cpu time unlimited unlimited seconds +Max file size unlimited unlimited bytes +Max data size unlimited unlimited bytes +Max stack size 8388608 unlimited bytes +Max core file size 0 unlimited bytes +Max resident set unlimited unlimited bytes +Max processes 62898 62898 processes +Max open files 2048 4096 files +Max locked memory 65536 65536 bytes +Max address space unlimited unlimited bytes +Max file locks unlimited unlimited locks +Max pending signals 62898 62898 signals +Max msgqueue size 819200 819200 bytes +Max nice priority 0 0 +Max realtime priority 0 0 +Max realtime timeout unlimited unlimited us diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/mountstats b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/mountstats new file mode 100644 index 0000000..a665c33 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/mountstats @@ -0,0 +1,19 @@ +device rootfs mounted on / with fstype rootfs +device sysfs mounted on /sys with fstype sysfs +device proc mounted on /proc with fstype proc +device /dev/sda1 mounted on / with fstype ext4 +device 192.168.1.1:/srv/test mounted on /mnt/nfs/test with fstype nfs4 statvers=1.1 + opts: rw,vers=4.0,rsize=1048576,wsize=1048576,namlen=255,acregmin=3,acregmax=60,acdirmin=30,acdirmax=60,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.5,local_lock=none + age: 13968 + caps: caps=0xfff7,wtmult=512,dtsize=32768,bsize=0,namlen=255 + nfsv4: bm0=0xfdffafff,bm1=0xf9be3e,bm2=0x0,acl=0x0,pnfs=not configured + sec: flavor=1,pseudoflavor=1 + events: 52 226 0 0 1 13 398 0 0 331 0 47 0 0 77 0 0 77 0 0 0 0 0 0 0 0 0 + bytes: 1207640230 0 0 0 1210214218 0 295483 0 + RPC iostats version: 1.0 p/v: 100003/4 (nfs) + xprt: tcp 832 0 1 0 11 6428 6428 0 12154 0 24 26 5726 + per-op statistics + NULL: 0 0 0 0 0 0 0 0 + READ: 1298 1298 0 207680 1210292152 6 79386 79407 + WRITE: 0 0 0 0 0 0 0 0 + diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/stat b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/stat new file mode 100644 index 0000000..438aaa9 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26231/stat @@ -0,0 +1 @@ +26231 (vim) R 5392 7446 5392 34835 7446 4218880 32533 309516 26 82 1677 44 158 99 20 0 1 0 82375 56274944 1981 18446744073709551615 4194304 6294284 140736914091744 140736914087944 139965136429984 0 0 12288 1870679807 0 0 0 17 0 0 0 31 0 0 8391624 8481048 16420864 140736914093252 140736914093279 140736914093279 140736914096107 0 diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26232/cmdline b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26232/cmdline new file mode 100644 index 0000000..e69de29 diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26232/comm b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26232/comm new file mode 100644 index 0000000..62361ca --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26232/comm @@ -0,0 +1 @@ +ata_sff diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26232/fd/0 b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26232/fd/0 new file mode 120000 index 0000000..da9c5df --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26232/fd/0 @@ -0,0 +1 @@ +../../symlinktargets/abc \ No newline at end of file diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26232/fd/1 b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26232/fd/1 new file mode 120000 index 0000000..ca47b50 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26232/fd/1 @@ -0,0 +1 @@ +../../symlinktargets/def \ No newline at end of file diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26232/fd/2 b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26232/fd/2 new file mode 120000 index 0000000..66731c0 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26232/fd/2 @@ -0,0 +1 @@ +../../symlinktargets/ghi \ No newline at end of file diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26232/fd/3 b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26232/fd/3 new file mode 120000 index 0000000..0135dce --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26232/fd/3 @@ -0,0 +1 @@ +../../symlinktargets/uvw \ No newline at end of file diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26232/fd/4 b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26232/fd/4 new file mode 120000 index 0000000..c086831 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26232/fd/4 @@ -0,0 +1 @@ +../../symlinktargets/xyz \ No newline at end of file diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26232/limits b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26232/limits new file mode 100644 index 0000000..3f9bf16 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26232/limits @@ -0,0 +1,17 @@ +Limit Soft Limit Hard Limit Units +Max cpu time unlimited unlimited seconds +Max file size unlimited unlimited bytes +Max data size unlimited unlimited bytes +Max stack size 8388608 unlimited bytes +Max core file size 0 unlimited bytes +Max resident set unlimited unlimited bytes +Max processes 29436 29436 processes +Max open files 1024 4096 files +Max locked memory 65536 65536 bytes +Max address space unlimited unlimited bytes +Max file locks unlimited unlimited locks +Max pending signals 29436 29436 signals +Max msgqueue size 819200 819200 bytes +Max nice priority 0 0 +Max realtime priority 0 0 +Max realtime timeout unlimited unlimited us diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26232/stat b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26232/stat new file mode 100644 index 0000000..321b160 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/26232/stat @@ -0,0 +1 @@ +33 (ata_sff) S 2 0 0 0 -1 69238880 0 0 0 0 0 0 0 0 0 -20 1 0 5 0 0 18446744073709551615 0 0 0 0 0 0 0 2147483647 0 18446744073709551615 0 0 17 1 0 0 0 0 0 0 0 0 0 0 0 0 0 diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/584/stat b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/584/stat new file mode 100644 index 0000000..65b9369 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/584/stat @@ -0,0 +1,2 @@ +1020 ((a b ) ( c d) ) R 28378 1020 28378 34842 1020 4218880 286 0 0 0 0 0 0 0 20 0 1 0 10839175 10395648 155 18446744073709551615 4194304 4238788 140736466511168 140736466511168 140609271124624 0 0 0 0 0 0 0 17 5 0 0 0 0 0 6336016 6337300 25579520 140736466515030 140736466515061 140736466515061 140736466518002 0 +#!/bin/cat /proc/self/stat diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/buddyinfo/short/buddyinfo b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/buddyinfo/short/buddyinfo new file mode 100644 index 0000000..40e71ca --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/buddyinfo/short/buddyinfo @@ -0,0 +1,3 @@ +Node 0, zone +Node 0, zone +Node 0, zone diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/buddyinfo/sizemismatch/buddyinfo b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/buddyinfo/sizemismatch/buddyinfo new file mode 100644 index 0000000..9456361 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/buddyinfo/sizemismatch/buddyinfo @@ -0,0 +1,3 @@ +Node 0, zone DMA 1 0 1 0 2 1 1 0 1 1 3 +Node 0, zone DMA32 759 572 791 475 194 45 12 0 0 0 0 0 +Node 0, zone Normal 4381 1093 185 1530 567 102 4 0 0 0 diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/buddyinfo/valid/buddyinfo b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/buddyinfo/valid/buddyinfo new file mode 100644 index 0000000..f90594a --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/buddyinfo/valid/buddyinfo @@ -0,0 +1,3 @@ +Node 0, zone DMA 1 0 1 0 2 1 1 0 1 1 3 +Node 0, zone DMA32 759 572 791 475 194 45 12 0 0 0 0 +Node 0, zone Normal 4381 1093 185 1530 567 102 4 0 0 0 0 diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/fs/xfs/stat b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/fs/xfs/stat new file mode 100644 index 0000000..f7ca7f9 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/fs/xfs/stat @@ -0,0 +1,23 @@ +extent_alloc 92447 97589 92448 93751 +abt 0 0 0 0 +blk_map 1767055 188820 184891 92447 92448 2140766 0 +bmbt 0 0 0 0 +dir 185039 92447 92444 136422 +trans 706 944304 0 +ig 185045 58807 0 126238 0 33637 22 +log 2883 113448 9 17360 739 +push_ail 945014 0 134260 15483 0 3940 464 159985 0 40 +xstrat 92447 0 +rw 107739 94045 +attr 4 0 0 0 +icluster 8677 7849 135802 +vnodes 92601 0 0 0 92444 92444 92444 0 +buf 2666287 7122 2659202 3599 2 7085 0 10297 7085 +abtb2 184941 1277345 13257 13278 0 0 0 0 0 0 0 0 0 0 2746147 +abtc2 345295 2416764 172637 172658 0 0 0 0 0 0 0 0 0 0 21406023 +bmbt2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +ibt2 343004 1358467 0 0 0 0 0 0 0 0 0 0 0 0 0 +fibt2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +qm 0 0 0 0 0 0 0 0 +xpc 399724544 92823103 86219234 +debug 0 diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/mdstat b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/mdstat new file mode 100644 index 0000000..4430bde --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/mdstat @@ -0,0 +1,26 @@ +Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] +md3 : active raid6 sda1[8] sdh1[7] sdg1[6] sdf1[5] sde1[11] sdd1[3] sdc1[10] sdb1[9] + 5853468288 blocks super 1.2 level 6, 64k chunk, algorithm 2 [8/8] [UUUUUUUU] + +md127 : active raid1 sdi2[0] sdj2[1] + 312319552 blocks [2/2] [UU] + +md0 : active raid1 sdk[2](S) sdi1[0] sdj1[1] + 248896 blocks [2/2] [UU] + +md4 : inactive raid1 sda3[0] sdb3[1] + 4883648 blocks [2/2] [UU] + +md6 : active raid1 sdb2[2] sda2[0] + 195310144 blocks [2/1] [U_] + [=>...................] recovery = 8.5% (16775552/195310144) finish=17.0min speed=259783K/sec + +md8 : active raid1 sdb1[1] sda1[0] + 195310144 blocks [2/2] [UU] + [=>...................] resync = 8.5% (16775552/195310144) finish=17.0min speed=259783K/sec + +md7 : active raid6 sdb1[0] sde1[3] sdd1[2] sdc1[1] + 7813735424 blocks super 1.2 level 6, 512k chunk, algorithm 2 [4/3] [U_UU] + bitmap: 0/30 pages [0KB], 65536KB chunk + +unused devices: diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/net/ip_vs b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/net/ip_vs new file mode 100644 index 0000000..5ee4bd2 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/net/ip_vs @@ -0,0 +1,21 @@ +IP Virtual Server version 1.2.1 (size=4096) +Prot LocalAddress:Port Scheduler Flags + -> RemoteAddress:Port Forward Weight ActiveConn InActConn +TCP C0A80016:0CEA wlc + -> C0A85216:0CEA Tunnel 100 248 2 + -> C0A85318:0CEA Tunnel 100 248 2 + -> C0A85315:0CEA Tunnel 100 248 1 +TCP C0A80039:0CEA wlc + -> C0A85416:0CEA Tunnel 0 0 0 + -> C0A85215:0CEA Tunnel 100 1499 0 + -> C0A83215:0CEA Tunnel 100 1498 0 +TCP C0A80037:0CEA wlc + -> C0A8321A:0CEA Tunnel 0 0 0 + -> C0A83120:0CEA Tunnel 100 0 0 +TCP [2620:0000:0000:0000:0000:0000:0000:0001]:0050 sh + -> [2620:0000:0000:0000:0000:0000:0000:0002]:0050 Route 1 0 0 + -> [2620:0000:0000:0000:0000:0000:0000:0003]:0050 Route 1 0 0 + -> [2620:0000:0000:0000:0000:0000:0000:0004]:0050 Route 1 1 1 +FWM 10001000 wlc + -> C0A8321A:0CEA Route 0 0 1 + -> C0A83215:0CEA Route 0 0 2 diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/net/ip_vs_stats b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/net/ip_vs_stats new file mode 100644 index 0000000..c00724e --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/net/ip_vs_stats @@ -0,0 +1,6 @@ + Total Incoming Outgoing Incoming Outgoing + Conns Packets Packets Bytes Bytes + 16AA370 E33656E5 0 51D8C8883AB3 0 + + Conns/s Pkts/s Pkts/s Bytes/s Bytes/s + 4 1FB3C 0 1282A8F 0 diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/net/xfrm_stat b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/net/xfrm_stat new file mode 100644 index 0000000..d278ace --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/net/xfrm_stat @@ -0,0 +1,28 @@ +XfrmInError 1 +XfrmInBufferError 2 +XfrmInHdrError 4 +XfrmInNoStates 3 +XfrmInStateProtoError 40 +XfrmInStateModeError 100 +XfrmInStateSeqError 6000 +XfrmInStateExpired 4 +XfrmInStateMismatch 23451 +XfrmInStateInvalid 55555 +XfrmInTmplMismatch 51 +XfrmInNoPols 65432 +XfrmInPolBlock 100 +XfrmInPolError 10000 +XfrmOutError 1000000 +XfrmOutBundleGenError 43321 +XfrmOutBundleCheckError 555 +XfrmOutNoStates 869 +XfrmOutStateProtoError 4542 +XfrmOutStateModeError 4 +XfrmOutStateSeqError 543 +XfrmOutStateExpired 565 +XfrmOutPolBlock 43456 +XfrmOutPolDead 7656 +XfrmOutPolError 1454 +XfrmFwdHdrError 6654 +XfrmOutStateInvalid 28765 +XfrmAcquireError 24532 diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/self b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/self new file mode 120000 index 0000000..1eeedea --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/self @@ -0,0 +1 @@ +26231 \ No newline at end of file diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/stat b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/stat new file mode 100644 index 0000000..1582a8c --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/stat @@ -0,0 +1,16 @@ +cpu 301854 612 111922 8979004 3552 2 3944 0 0 0 +cpu0 44490 19 21045 1087069 220 1 3410 0 0 0 +cpu1 47869 23 16474 1110787 591 0 46 0 0 0 +cpu2 46504 36 15916 1112321 441 0 326 0 0 0 +cpu3 47054 102 15683 1113230 533 0 60 0 0 0 +cpu4 28413 25 10776 1140321 217 0 8 0 0 0 +cpu5 29271 101 11586 1136270 672 0 30 0 0 0 +cpu6 29152 36 10276 1139721 319 0 29 0 0 0 +cpu7 29098 268 10164 1139282 555 0 31 0 0 0 +intr 8885917 17 0 0 0 0 0 0 0 1 79281 0 0 0 0 0 0 0 231237 0 0 0 0 250586 103 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 223424 190745 13 906 1283803 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 0 0 0 0 0 0 0 0 0 0 0 0 +ctxt 38014093 +btime 1418183276 +processes 26442 +procs_running 2 +procs_blocked 1 +softirq 5057579 250191 1481983 1647 211099 186066 0 1783454 622196 12499 508444 diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/symlinktargets/README b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/symlinktargets/README new file mode 100644 index 0000000..5cf184e --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/symlinktargets/README @@ -0,0 +1,2 @@ +This directory contains some empty files that are the symlinks the files in the "fd" directory point to. +They are otherwise ignored by the tests diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/symlinktargets/abc b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/symlinktargets/abc new file mode 100644 index 0000000..e69de29 diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/symlinktargets/def b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/symlinktargets/def new file mode 100644 index 0000000..e69de29 diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/symlinktargets/ghi b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/symlinktargets/ghi new file mode 100644 index 0000000..e69de29 diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/symlinktargets/uvw b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/symlinktargets/uvw new file mode 100644 index 0000000..e69de29 diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/symlinktargets/xyz b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fixtures/symlinktargets/xyz new file mode 100644 index 0000000..e69de29 diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fs.go b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fs.go new file mode 100644 index 0000000..1754675 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fs.go @@ -0,0 +1,46 @@ +package procfs + +import ( + "fmt" + "os" + "path" + + "github.com/prometheus/procfs/xfs" +) + +// FS represents the pseudo-filesystem proc, which provides an interface to +// kernel data structures. +type FS string + +// DefaultMountPoint is the common mount point of the proc filesystem. +const DefaultMountPoint = "/proc" + +// NewFS returns a new FS mounted under the given mountPoint. It will error +// if the mount point can't be read. +func NewFS(mountPoint string) (FS, error) { + info, err := os.Stat(mountPoint) + if err != nil { + return "", fmt.Errorf("could not read %s: %s", mountPoint, err) + } + if !info.IsDir() { + return "", fmt.Errorf("mount point %s is not a directory", mountPoint) + } + + return FS(mountPoint), nil +} + +// Path returns the path of the given subsystem relative to the procfs root. +func (fs FS) Path(p ...string) string { + return path.Join(append([]string{string(fs)}, p...)...) +} + +// XFSStats retrieves XFS filesystem runtime statistics. +func (fs FS) XFSStats() (*xfs.Stats, error) { + f, err := os.Open(fs.Path("fs/xfs/stat")) + if err != nil { + return nil, err + } + defer f.Close() + + return xfs.ParseStats(f) +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/fs_test.go b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fs_test.go new file mode 100644 index 0000000..e492cde --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/fs_test.go @@ -0,0 +1,26 @@ +package procfs + +import "testing" + +func TestNewFS(t *testing.T) { + if _, err := NewFS("foobar"); err == nil { + t.Error("want NewFS to fail for non-existing mount point") + } + + if _, err := NewFS("procfs.go"); err == nil { + t.Error("want NewFS to fail if mount point is not a directory") + } +} + +func TestFSXFSStats(t *testing.T) { + stats, err := FS("fixtures").XFSStats() + if err != nil { + t.Fatalf("failed to parse XFS stats: %v", err) + } + + // Very lightweight test just to sanity check the path used + // to open XFS stats. Heavier tests in package xfs. + if want, got := uint32(92447), stats.ExtentAllocation.ExtentsAllocated; want != got { + t.Errorf("unexpected extents allocated:\nwant: %d\nhave: %d", want, got) + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/ipvs.go b/example/prometheus-mock/vendor/github.com/prometheus/procfs/ipvs.go new file mode 100644 index 0000000..696d114 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/ipvs.go @@ -0,0 +1,246 @@ +package procfs + +import ( + "bufio" + "encoding/hex" + "errors" + "fmt" + "io" + "io/ioutil" + "net" + "os" + "strconv" + "strings" +) + +// IPVSStats holds IPVS statistics, as exposed by the kernel in `/proc/net/ip_vs_stats`. +type IPVSStats struct { + // Total count of connections. + Connections uint64 + // Total incoming packages processed. + IncomingPackets uint64 + // Total outgoing packages processed. + OutgoingPackets uint64 + // Total incoming traffic. + IncomingBytes uint64 + // Total outgoing traffic. + OutgoingBytes uint64 +} + +// IPVSBackendStatus holds current metrics of one virtual / real address pair. +type IPVSBackendStatus struct { + // The local (virtual) IP address. + LocalAddress net.IP + // The local (virtual) port. + LocalPort uint16 + // The local firewall mark + LocalMark string + // The transport protocol (TCP, UDP). + Proto string + // The remote (real) IP address. + RemoteAddress net.IP + // The remote (real) port. + RemotePort uint16 + // The current number of active connections for this virtual/real address pair. + ActiveConn uint64 + // The current number of inactive connections for this virtual/real address pair. + InactConn uint64 + // The current weight of this virtual/real address pair. + Weight uint64 +} + +// NewIPVSStats reads the IPVS statistics. +func NewIPVSStats() (IPVSStats, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return IPVSStats{}, err + } + + return fs.NewIPVSStats() +} + +// NewIPVSStats reads the IPVS statistics from the specified `proc` filesystem. +func (fs FS) NewIPVSStats() (IPVSStats, error) { + file, err := os.Open(fs.Path("net/ip_vs_stats")) + if err != nil { + return IPVSStats{}, err + } + defer file.Close() + + return parseIPVSStats(file) +} + +// parseIPVSStats performs the actual parsing of `ip_vs_stats`. +func parseIPVSStats(file io.Reader) (IPVSStats, error) { + var ( + statContent []byte + statLines []string + statFields []string + stats IPVSStats + ) + + statContent, err := ioutil.ReadAll(file) + if err != nil { + return IPVSStats{}, err + } + + statLines = strings.SplitN(string(statContent), "\n", 4) + if len(statLines) != 4 { + return IPVSStats{}, errors.New("ip_vs_stats corrupt: too short") + } + + statFields = strings.Fields(statLines[2]) + if len(statFields) != 5 { + return IPVSStats{}, errors.New("ip_vs_stats corrupt: unexpected number of fields") + } + + stats.Connections, err = strconv.ParseUint(statFields[0], 16, 64) + if err != nil { + return IPVSStats{}, err + } + stats.IncomingPackets, err = strconv.ParseUint(statFields[1], 16, 64) + if err != nil { + return IPVSStats{}, err + } + stats.OutgoingPackets, err = strconv.ParseUint(statFields[2], 16, 64) + if err != nil { + return IPVSStats{}, err + } + stats.IncomingBytes, err = strconv.ParseUint(statFields[3], 16, 64) + if err != nil { + return IPVSStats{}, err + } + stats.OutgoingBytes, err = strconv.ParseUint(statFields[4], 16, 64) + if err != nil { + return IPVSStats{}, err + } + + return stats, nil +} + +// NewIPVSBackendStatus reads and returns the status of all (virtual,real) server pairs. +func NewIPVSBackendStatus() ([]IPVSBackendStatus, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return []IPVSBackendStatus{}, err + } + + return fs.NewIPVSBackendStatus() +} + +// NewIPVSBackendStatus reads and returns the status of all (virtual,real) server pairs from the specified `proc` filesystem. +func (fs FS) NewIPVSBackendStatus() ([]IPVSBackendStatus, error) { + file, err := os.Open(fs.Path("net/ip_vs")) + if err != nil { + return nil, err + } + defer file.Close() + + return parseIPVSBackendStatus(file) +} + +func parseIPVSBackendStatus(file io.Reader) ([]IPVSBackendStatus, error) { + var ( + status []IPVSBackendStatus + scanner = bufio.NewScanner(file) + proto string + localMark string + localAddress net.IP + localPort uint16 + err error + ) + + for scanner.Scan() { + fields := strings.Fields(string(scanner.Text())) + if len(fields) == 0 { + continue + } + switch { + case fields[0] == "IP" || fields[0] == "Prot" || fields[1] == "RemoteAddress:Port": + continue + case fields[0] == "TCP" || fields[0] == "UDP": + if len(fields) < 2 { + continue + } + proto = fields[0] + localMark = "" + localAddress, localPort, err = parseIPPort(fields[1]) + if err != nil { + return nil, err + } + case fields[0] == "FWM": + if len(fields) < 2 { + continue + } + proto = fields[0] + localMark = fields[1] + localAddress = nil + localPort = 0 + case fields[0] == "->": + if len(fields) < 6 { + continue + } + remoteAddress, remotePort, err := parseIPPort(fields[1]) + if err != nil { + return nil, err + } + weight, err := strconv.ParseUint(fields[3], 10, 64) + if err != nil { + return nil, err + } + activeConn, err := strconv.ParseUint(fields[4], 10, 64) + if err != nil { + return nil, err + } + inactConn, err := strconv.ParseUint(fields[5], 10, 64) + if err != nil { + return nil, err + } + status = append(status, IPVSBackendStatus{ + LocalAddress: localAddress, + LocalPort: localPort, + LocalMark: localMark, + RemoteAddress: remoteAddress, + RemotePort: remotePort, + Proto: proto, + Weight: weight, + ActiveConn: activeConn, + InactConn: inactConn, + }) + } + } + return status, nil +} + +func parseIPPort(s string) (net.IP, uint16, error) { + var ( + ip net.IP + err error + ) + + switch len(s) { + case 13: + ip, err = hex.DecodeString(s[0:8]) + if err != nil { + return nil, 0, err + } + case 46: + ip = net.ParseIP(s[1:40]) + if ip == nil { + return nil, 0, fmt.Errorf("invalid IPv6 address: %s", s[1:40]) + } + default: + return nil, 0, fmt.Errorf("unexpected IP:Port: %s", s) + } + + portString := s[len(s)-4:] + if len(portString) != 4 { + return nil, 0, fmt.Errorf("unexpected port string format: %s", portString) + } + port, err := strconv.ParseUint(portString, 16, 16) + if err != nil { + return nil, 0, err + } + + return ip, uint16(port), nil +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/ipvs_test.go b/example/prometheus-mock/vendor/github.com/prometheus/procfs/ipvs_test.go new file mode 100644 index 0000000..13ceab8 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/ipvs_test.go @@ -0,0 +1,237 @@ +package procfs + +import ( + "net" + "testing" +) + +var ( + expectedIPVSStats = IPVSStats{ + Connections: 23765872, + IncomingPackets: 3811989221, + OutgoingPackets: 0, + IncomingBytes: 89991519156915, + OutgoingBytes: 0, + } + expectedIPVSBackendStatuses = []IPVSBackendStatus{ + { + LocalAddress: net.ParseIP("192.168.0.22"), + LocalPort: 3306, + RemoteAddress: net.ParseIP("192.168.82.22"), + RemotePort: 3306, + Proto: "TCP", + Weight: 100, + ActiveConn: 248, + InactConn: 2, + }, + { + LocalAddress: net.ParseIP("192.168.0.22"), + LocalPort: 3306, + RemoteAddress: net.ParseIP("192.168.83.24"), + RemotePort: 3306, + Proto: "TCP", + Weight: 100, + ActiveConn: 248, + InactConn: 2, + }, + { + LocalAddress: net.ParseIP("192.168.0.22"), + LocalPort: 3306, + RemoteAddress: net.ParseIP("192.168.83.21"), + RemotePort: 3306, + Proto: "TCP", + Weight: 100, + ActiveConn: 248, + InactConn: 1, + }, + { + LocalAddress: net.ParseIP("192.168.0.57"), + LocalPort: 3306, + RemoteAddress: net.ParseIP("192.168.84.22"), + RemotePort: 3306, + Proto: "TCP", + Weight: 0, + ActiveConn: 0, + InactConn: 0, + }, + { + LocalAddress: net.ParseIP("192.168.0.57"), + LocalPort: 3306, + RemoteAddress: net.ParseIP("192.168.82.21"), + RemotePort: 3306, + Proto: "TCP", + Weight: 100, + ActiveConn: 1499, + InactConn: 0, + }, + { + LocalAddress: net.ParseIP("192.168.0.57"), + LocalPort: 3306, + RemoteAddress: net.ParseIP("192.168.50.21"), + RemotePort: 3306, + Proto: "TCP", + Weight: 100, + ActiveConn: 1498, + InactConn: 0, + }, + { + LocalAddress: net.ParseIP("192.168.0.55"), + LocalPort: 3306, + RemoteAddress: net.ParseIP("192.168.50.26"), + RemotePort: 3306, + Proto: "TCP", + Weight: 0, + ActiveConn: 0, + InactConn: 0, + }, + { + LocalAddress: net.ParseIP("192.168.0.55"), + LocalPort: 3306, + RemoteAddress: net.ParseIP("192.168.49.32"), + RemotePort: 3306, + Proto: "TCP", + Weight: 100, + ActiveConn: 0, + InactConn: 0, + }, + { + LocalAddress: net.ParseIP("2620::1"), + LocalPort: 80, + RemoteAddress: net.ParseIP("2620::2"), + RemotePort: 80, + Proto: "TCP", + Weight: 1, + ActiveConn: 0, + InactConn: 0, + }, + { + LocalAddress: net.ParseIP("2620::1"), + LocalPort: 80, + RemoteAddress: net.ParseIP("2620::3"), + RemotePort: 80, + Proto: "TCP", + Weight: 1, + ActiveConn: 0, + InactConn: 0, + }, + { + LocalAddress: net.ParseIP("2620::1"), + LocalPort: 80, + RemoteAddress: net.ParseIP("2620::4"), + RemotePort: 80, + Proto: "TCP", + Weight: 1, + ActiveConn: 1, + InactConn: 1, + }, + { + LocalMark: "10001000", + RemoteAddress: net.ParseIP("192.168.50.26"), + RemotePort: 3306, + Proto: "FWM", + Weight: 0, + ActiveConn: 0, + InactConn: 1, + }, + { + LocalMark: "10001000", + RemoteAddress: net.ParseIP("192.168.50.21"), + RemotePort: 3306, + Proto: "FWM", + Weight: 0, + ActiveConn: 0, + InactConn: 2, + }, + } +) + +func TestIPVSStats(t *testing.T) { + stats, err := FS("fixtures").NewIPVSStats() + if err != nil { + t.Fatal(err) + } + + if stats != expectedIPVSStats { + t.Errorf("want %+v, have %+v", expectedIPVSStats, stats) + } +} + +func TestParseIPPort(t *testing.T) { + ip := net.ParseIP("192.168.0.22") + port := uint16(3306) + + gotIP, gotPort, err := parseIPPort("C0A80016:0CEA") + if err != nil { + t.Fatal(err) + } + if !(gotIP.Equal(ip) && port == gotPort) { + t.Errorf("want %s:%d, have %s:%d", ip, port, gotIP, gotPort) + } +} + +func TestParseIPPortInvalid(t *testing.T) { + testcases := []string{ + "", + "C0A80016", + "C0A800:1234", + "FOOBARBA:1234", + "C0A80016:0CEA:1234", + } + + for _, s := range testcases { + ip, port, err := parseIPPort(s) + if ip != nil || port != uint16(0) || err == nil { + t.Errorf("Expected error for input %s, have ip = %s, port = %v, err = %v", s, ip, port, err) + } + } +} + +func TestParseIPPortIPv6(t *testing.T) { + ip := net.ParseIP("dead:beef::1") + port := uint16(8080) + + gotIP, gotPort, err := parseIPPort("[DEAD:BEEF:0000:0000:0000:0000:0000:0001]:1F90") + if err != nil { + t.Fatal(err) + } + if !(gotIP.Equal(ip) && port == gotPort) { + t.Errorf("want %s:%d, have %s:%d", ip, port, gotIP, gotPort) + } +} + +func TestIPVSBackendStatus(t *testing.T) { + backendStats, err := FS("fixtures").NewIPVSBackendStatus() + if err != nil { + t.Fatal(err) + } + if want, have := len(expectedIPVSBackendStatuses), len(backendStats); want != have { + t.Fatalf("want %d backend statuses, have %d", want, have) + } + + for idx, expect := range expectedIPVSBackendStatuses { + if !backendStats[idx].LocalAddress.Equal(expect.LocalAddress) { + t.Errorf("want LocalAddress %s, have %s", expect.LocalAddress, backendStats[idx].LocalAddress) + } + if backendStats[idx].LocalPort != expect.LocalPort { + t.Errorf("want LocalPort %d, have %d", expect.LocalPort, backendStats[idx].LocalPort) + } + if !backendStats[idx].RemoteAddress.Equal(expect.RemoteAddress) { + t.Errorf("want RemoteAddress %s, have %s", expect.RemoteAddress, backendStats[idx].RemoteAddress) + } + if backendStats[idx].RemotePort != expect.RemotePort { + t.Errorf("want RemotePort %d, have %d", expect.RemotePort, backendStats[idx].RemotePort) + } + if backendStats[idx].Proto != expect.Proto { + t.Errorf("want Proto %s, have %s", expect.Proto, backendStats[idx].Proto) + } + if backendStats[idx].Weight != expect.Weight { + t.Errorf("want Weight %d, have %d", expect.Weight, backendStats[idx].Weight) + } + if backendStats[idx].ActiveConn != expect.ActiveConn { + t.Errorf("want ActiveConn %d, have %d", expect.ActiveConn, backendStats[idx].ActiveConn) + } + if backendStats[idx].InactConn != expect.InactConn { + t.Errorf("want InactConn %d, have %d", expect.InactConn, backendStats[idx].InactConn) + } + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/mdstat.go b/example/prometheus-mock/vendor/github.com/prometheus/procfs/mdstat.go new file mode 100644 index 0000000..d7a248c --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/mdstat.go @@ -0,0 +1,138 @@ +package procfs + +import ( + "fmt" + "io/ioutil" + "regexp" + "strconv" + "strings" +) + +var ( + statuslineRE = regexp.MustCompile(`(\d+) blocks .*\[(\d+)/(\d+)\] \[[U_]+\]`) + buildlineRE = regexp.MustCompile(`\((\d+)/\d+\)`) +) + +// MDStat holds info parsed from /proc/mdstat. +type MDStat struct { + // Name of the device. + Name string + // activity-state of the device. + ActivityState string + // Number of active disks. + DisksActive int64 + // Total number of disks the device consists of. + DisksTotal int64 + // Number of blocks the device holds. + BlocksTotal int64 + // Number of blocks on the device that are in sync. + BlocksSynced int64 +} + +// ParseMDStat parses an mdstat-file and returns a struct with the relevant infos. +func (fs FS) ParseMDStat() (mdstates []MDStat, err error) { + mdStatusFilePath := fs.Path("mdstat") + content, err := ioutil.ReadFile(mdStatusFilePath) + if err != nil { + return []MDStat{}, fmt.Errorf("error parsing %s: %s", mdStatusFilePath, err) + } + + mdStates := []MDStat{} + lines := strings.Split(string(content), "\n") + for i, l := range lines { + if l == "" { + continue + } + if l[0] == ' ' { + continue + } + if strings.HasPrefix(l, "Personalities") || strings.HasPrefix(l, "unused") { + continue + } + + mainLine := strings.Split(l, " ") + if len(mainLine) < 3 { + return mdStates, fmt.Errorf("error parsing mdline: %s", l) + } + mdName := mainLine[0] + activityState := mainLine[2] + + if len(lines) <= i+3 { + return mdStates, fmt.Errorf( + "error parsing %s: too few lines for md device %s", + mdStatusFilePath, + mdName, + ) + } + + active, total, size, err := evalStatusline(lines[i+1]) + if err != nil { + return mdStates, fmt.Errorf("error parsing %s: %s", mdStatusFilePath, err) + } + + // j is the line number of the syncing-line. + j := i + 2 + if strings.Contains(lines[i+2], "bitmap") { // skip bitmap line + j = i + 3 + } + + // 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 + if strings.Contains(lines[j], "recovery") || strings.Contains(lines[j], "resync") { + syncedBlocks, err = evalBuildline(lines[j]) + if err != nil { + return mdStates, fmt.Errorf("error parsing %s: %s", mdStatusFilePath, err) + } + } + + mdStates = append(mdStates, MDStat{ + Name: mdName, + ActivityState: activityState, + DisksActive: active, + DisksTotal: total, + BlocksTotal: size, + BlocksSynced: syncedBlocks, + }) + } + + return mdStates, nil +} + +func evalStatusline(statusline string) (active, total, size int64, err error) { + matches := statuslineRE.FindStringSubmatch(statusline) + if len(matches) != 4 { + return 0, 0, 0, fmt.Errorf("unexpected statusline: %s", statusline) + } + + size, err = strconv.ParseInt(matches[1], 10, 64) + if err != nil { + return 0, 0, 0, fmt.Errorf("unexpected statusline %s: %s", statusline, err) + } + + total, err = strconv.ParseInt(matches[2], 10, 64) + if err != nil { + return 0, 0, 0, fmt.Errorf("unexpected statusline %s: %s", statusline, err) + } + + active, err = strconv.ParseInt(matches[3], 10, 64) + if err != nil { + return 0, 0, 0, fmt.Errorf("unexpected statusline %s: %s", statusline, err) + } + + return active, total, size, nil +} + +func evalBuildline(buildline string) (syncedBlocks int64, err error) { + matches := buildlineRE.FindStringSubmatch(buildline) + if len(matches) != 2 { + return 0, fmt.Errorf("unexpected buildline: %s", buildline) + } + + syncedBlocks, err = strconv.ParseInt(matches[1], 10, 64) + if err != nil { + return 0, fmt.Errorf("%s in buildline: %s", err, buildline) + } + + return syncedBlocks, nil +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/mdstat_test.go b/example/prometheus-mock/vendor/github.com/prometheus/procfs/mdstat_test.go new file mode 100644 index 0000000..fa463c2 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/mdstat_test.go @@ -0,0 +1,31 @@ +package procfs + +import ( + "testing" +) + +func TestMDStat(t *testing.T) { + mdStates, err := FS("fixtures").ParseMDStat() + if err != nil { + t.Fatalf("parsing of reference-file failed entirely: %s", err) + } + + refs := map[string]MDStat{ + "md3": {"md3", "active", 8, 8, 5853468288, 5853468288}, + "md127": {"md127", "active", 2, 2, 312319552, 312319552}, + "md0": {"md0", "active", 2, 2, 248896, 248896}, + "md4": {"md4", "inactive", 2, 2, 4883648, 4883648}, + "md6": {"md6", "active", 1, 2, 195310144, 16775552}, + "md8": {"md8", "active", 2, 2, 195310144, 16775552}, + "md7": {"md7", "active", 3, 4, 7813735424, 7813735424}, + } + + if want, have := len(refs), len(mdStates); want != have { + t.Errorf("want %d parsed md-devices, have %d", want, have) + } + for _, md := range mdStates { + if want, have := refs[md.Name], md; want != have { + t.Errorf("%s: want %v, have %v", md.Name, want, have) + } + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/mountstats.go b/example/prometheus-mock/vendor/github.com/prometheus/procfs/mountstats.go new file mode 100644 index 0000000..6b2b0ba --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/mountstats.go @@ -0,0 +1,556 @@ +package procfs + +// While implementing parsing of /proc/[pid]/mountstats, this blog was used +// heavily as a reference: +// https://utcc.utoronto.ca/~cks/space/blog/linux/NFSMountstatsIndex +// +// Special thanks to Chris Siebenmann for all of his posts explaining the +// various statistics available for NFS. + +import ( + "bufio" + "fmt" + "io" + "strconv" + "strings" + "time" +) + +// Constants shared between multiple functions. +const ( + deviceEntryLen = 8 + + fieldBytesLen = 8 + fieldEventsLen = 27 + + statVersion10 = "1.0" + statVersion11 = "1.1" + + fieldTransport10Len = 10 + fieldTransport11Len = 13 +) + +// A Mount is a device mount parsed from /proc/[pid]/mountstats. +type Mount struct { + // Name of the device. + Device string + // The mount point of the device. + Mount string + // The filesystem type used by the device. + Type string + // If available additional statistics related to this Mount. + // Use a type assertion to determine if additional statistics are available. + Stats MountStats +} + +// A MountStats is a type which contains detailed statistics for a specific +// type of Mount. +type MountStats interface { + mountStats() +} + +// A MountStatsNFS is a MountStats implementation for NFSv3 and v4 mounts. +type MountStatsNFS struct { + // The version of statistics provided. + StatVersion string + // The age of the NFS mount. + Age time.Duration + // Statistics related to byte counters for various operations. + Bytes NFSBytesStats + // Statistics related to various NFS event occurrences. + Events NFSEventsStats + // Statistics broken down by filesystem operation. + Operations []NFSOperationStats + // Statistics about the NFS RPC transport. + Transport NFSTransportStats +} + +// mountStats implements MountStats. +func (m MountStatsNFS) mountStats() {} + +// A NFSBytesStats contains statistics about the number of bytes read and written +// by an NFS client to and from an NFS server. +type NFSBytesStats struct { + // Number of bytes read using the read() syscall. + Read uint64 + // Number of bytes written using the write() syscall. + Write uint64 + // Number of bytes read using the read() syscall in O_DIRECT mode. + DirectRead uint64 + // Number of bytes written using the write() syscall in O_DIRECT mode. + DirectWrite uint64 + // Number of bytes read from the NFS server, in total. + ReadTotal uint64 + // Number of bytes written to the NFS server, in total. + WriteTotal uint64 + // Number of pages read directly via mmap()'d files. + ReadPages uint64 + // Number of pages written directly via mmap()'d files. + WritePages uint64 +} + +// A NFSEventsStats contains statistics about NFS event occurrences. +type NFSEventsStats struct { + // Number of times cached inode attributes are re-validated from the server. + InodeRevalidate uint64 + // Number of times cached dentry nodes are re-validated from the server. + DnodeRevalidate uint64 + // Number of times an inode cache is cleared. + DataInvalidate uint64 + // Number of times cached inode attributes are invalidated. + AttributeInvalidate uint64 + // Number of times files or directories have been open()'d. + VFSOpen uint64 + // Number of times a directory lookup has occurred. + VFSLookup uint64 + // Number of times permissions have been checked. + VFSAccess uint64 + // Number of updates (and potential writes) to pages. + VFSUpdatePage uint64 + // Number of pages read directly via mmap()'d files. + VFSReadPage uint64 + // Number of times a group of pages have been read. + VFSReadPages uint64 + // Number of pages written directly via mmap()'d files. + VFSWritePage uint64 + // Number of times a group of pages have been written. + VFSWritePages uint64 + // Number of times directory entries have been read with getdents(). + VFSGetdents uint64 + // Number of times attributes have been set on inodes. + VFSSetattr uint64 + // Number of pending writes that have been forcefully flushed to the server. + VFSFlush uint64 + // Number of times fsync() has been called on directories and files. + VFSFsync uint64 + // Number of times locking has been attempted on a file. + VFSLock uint64 + // Number of times files have been closed and released. + VFSFileRelease uint64 + // Unknown. Possibly unused. + CongestionWait uint64 + // Number of times files have been truncated. + Truncation uint64 + // Number of times a file has been grown due to writes beyond its existing end. + WriteExtension uint64 + // Number of times a file was removed while still open by another process. + SillyRename uint64 + // Number of times the NFS server gave less data than expected while reading. + ShortRead uint64 + // Number of times the NFS server wrote less data than expected while writing. + ShortWrite uint64 + // Number of times the NFS server indicated EJUKEBOX; retrieving data from + // offline storage. + JukeboxDelay uint64 + // Number of NFS v4.1+ pNFS reads. + PNFSRead uint64 + // Number of NFS v4.1+ pNFS writes. + PNFSWrite uint64 +} + +// A NFSOperationStats contains statistics for a single operation. +type NFSOperationStats struct { + // The name of the operation. + Operation string + // Number of requests performed for this operation. + Requests uint64 + // Number of times an actual RPC request has been transmitted for this operation. + Transmissions uint64 + // Number of times a request has had a major timeout. + MajorTimeouts uint64 + // Number of bytes sent for this operation, including RPC headers and payload. + BytesSent uint64 + // Number of bytes received for this operation, including RPC headers and payload. + BytesReceived uint64 + // Duration all requests spent queued for transmission before they were sent. + CumulativeQueueTime time.Duration + // Duration it took to get a reply back after the request was transmitted. + CumulativeTotalResponseTime time.Duration + // Duration from when a request was enqueued to when it was completely handled. + CumulativeTotalRequestTime time.Duration +} + +// A NFSTransportStats contains statistics for the NFS mount RPC requests and +// responses. +type NFSTransportStats struct { + // The local port used for the NFS mount. + Port uint64 + // Number of times the client has had to establish a connection from scratch + // to the NFS server. + Bind uint64 + // Number of times the client has made a TCP connection to the NFS server. + Connect uint64 + // Duration (in jiffies, a kernel internal unit of time) the NFS mount has + // spent waiting for connections to the server to be established. + ConnectIdleTime uint64 + // Duration since the NFS mount last saw any RPC traffic. + IdleTime time.Duration + // Number of RPC requests for this mount sent to the NFS server. + Sends uint64 + // Number of RPC responses for this mount received from the NFS server. + Receives uint64 + // Number of times the NFS server sent a response with a transaction ID + // unknown to this client. + BadTransactionIDs uint64 + // A running counter, incremented on each request as the current difference + // ebetween sends and receives. + CumulativeActiveRequests uint64 + // A running counter, incremented on each request by the current backlog + // queue size. + CumulativeBacklog uint64 + + // Stats below only available with stat version 1.1. + + // Maximum number of simultaneously active RPC requests ever used. + MaximumRPCSlotsUsed uint64 + // A running counter, incremented on each request as the current size of the + // sending queue. + CumulativeSendingQueue uint64 + // A running counter, incremented on each request as the current size of the + // pending queue. + CumulativePendingQueue uint64 +} + +// parseMountStats parses a /proc/[pid]/mountstats file and returns a slice +// of Mount structures containing detailed information about each mount. +// If available, statistics for each mount are parsed as well. +func parseMountStats(r io.Reader) ([]*Mount, error) { + const ( + device = "device" + statVersionPrefix = "statvers=" + + nfs3Type = "nfs" + nfs4Type = "nfs4" + ) + + var mounts []*Mount + + s := bufio.NewScanner(r) + for s.Scan() { + // Only look for device entries in this function + ss := strings.Fields(string(s.Bytes())) + if len(ss) == 0 || ss[0] != device { + continue + } + + m, err := parseMount(ss) + if err != nil { + return nil, err + } + + // Does this mount also possess statistics information? + if len(ss) > deviceEntryLen { + // Only NFSv3 and v4 are supported for parsing statistics + if m.Type != nfs3Type && m.Type != nfs4Type { + return nil, fmt.Errorf("cannot parse MountStats for fstype %q", m.Type) + } + + statVersion := strings.TrimPrefix(ss[8], statVersionPrefix) + + stats, err := parseMountStatsNFS(s, statVersion) + if err != nil { + return nil, err + } + + m.Stats = stats + } + + mounts = append(mounts, m) + } + + return mounts, s.Err() +} + +// parseMount parses an entry in /proc/[pid]/mountstats in the format: +// device [device] mounted on [mount] with fstype [type] +func parseMount(ss []string) (*Mount, error) { + if len(ss) < deviceEntryLen { + return nil, fmt.Errorf("invalid device entry: %v", ss) + } + + // Check for specific words appearing at specific indices to ensure + // the format is consistent with what we expect + format := []struct { + i int + s string + }{ + {i: 0, s: "device"}, + {i: 2, s: "mounted"}, + {i: 3, s: "on"}, + {i: 5, s: "with"}, + {i: 6, s: "fstype"}, + } + + for _, f := range format { + if ss[f.i] != f.s { + return nil, fmt.Errorf("invalid device entry: %v", ss) + } + } + + return &Mount{ + Device: ss[1], + Mount: ss[4], + Type: ss[7], + }, nil +} + +// parseMountStatsNFS parses a MountStatsNFS by scanning additional information +// related to NFS statistics. +func parseMountStatsNFS(s *bufio.Scanner, statVersion string) (*MountStatsNFS, error) { + // Field indicators for parsing specific types of data + const ( + fieldAge = "age:" + fieldBytes = "bytes:" + fieldEvents = "events:" + fieldPerOpStats = "per-op" + fieldTransport = "xprt:" + ) + + stats := &MountStatsNFS{ + StatVersion: statVersion, + } + + for s.Scan() { + ss := strings.Fields(string(s.Bytes())) + if len(ss) == 0 { + break + } + if len(ss) < 2 { + return nil, fmt.Errorf("not enough information for NFS stats: %v", ss) + } + + switch ss[0] { + case fieldAge: + // Age integer is in seconds + d, err := time.ParseDuration(ss[1] + "s") + if err != nil { + return nil, err + } + + stats.Age = d + case fieldBytes: + bstats, err := parseNFSBytesStats(ss[1:]) + if err != nil { + return nil, err + } + + stats.Bytes = *bstats + case fieldEvents: + estats, err := parseNFSEventsStats(ss[1:]) + if err != nil { + return nil, err + } + + stats.Events = *estats + case fieldTransport: + if len(ss) < 3 { + return nil, fmt.Errorf("not enough information for NFS transport stats: %v", ss) + } + + tstats, err := parseNFSTransportStats(ss[2:], statVersion) + if err != nil { + return nil, err + } + + stats.Transport = *tstats + } + + // When encountering "per-operation statistics", we must break this + // loop and parse them separately to ensure we can terminate parsing + // before reaching another device entry; hence why this 'if' statement + // is not just another switch case + if ss[0] == fieldPerOpStats { + break + } + } + + if err := s.Err(); err != nil { + return nil, err + } + + // NFS per-operation stats appear last before the next device entry + perOpStats, err := parseNFSOperationStats(s) + if err != nil { + return nil, err + } + + stats.Operations = perOpStats + + return stats, nil +} + +// parseNFSBytesStats parses a NFSBytesStats line using an input set of +// integer fields. +func parseNFSBytesStats(ss []string) (*NFSBytesStats, error) { + if len(ss) != fieldBytesLen { + return nil, fmt.Errorf("invalid NFS bytes stats: %v", ss) + } + + ns := make([]uint64, 0, fieldBytesLen) + for _, s := range ss { + n, err := strconv.ParseUint(s, 10, 64) + if err != nil { + return nil, err + } + + ns = append(ns, n) + } + + return &NFSBytesStats{ + Read: ns[0], + Write: ns[1], + DirectRead: ns[2], + DirectWrite: ns[3], + ReadTotal: ns[4], + WriteTotal: ns[5], + ReadPages: ns[6], + WritePages: ns[7], + }, nil +} + +// parseNFSEventsStats parses a NFSEventsStats line using an input set of +// integer fields. +func parseNFSEventsStats(ss []string) (*NFSEventsStats, error) { + if len(ss) != fieldEventsLen { + return nil, fmt.Errorf("invalid NFS events stats: %v", ss) + } + + ns := make([]uint64, 0, fieldEventsLen) + for _, s := range ss { + n, err := strconv.ParseUint(s, 10, 64) + if err != nil { + return nil, err + } + + ns = append(ns, n) + } + + return &NFSEventsStats{ + InodeRevalidate: ns[0], + DnodeRevalidate: ns[1], + DataInvalidate: ns[2], + AttributeInvalidate: ns[3], + VFSOpen: ns[4], + VFSLookup: ns[5], + VFSAccess: ns[6], + VFSUpdatePage: ns[7], + VFSReadPage: ns[8], + VFSReadPages: ns[9], + VFSWritePage: ns[10], + VFSWritePages: ns[11], + VFSGetdents: ns[12], + VFSSetattr: ns[13], + VFSFlush: ns[14], + VFSFsync: ns[15], + VFSLock: ns[16], + VFSFileRelease: ns[17], + CongestionWait: ns[18], + Truncation: ns[19], + WriteExtension: ns[20], + SillyRename: ns[21], + ShortRead: ns[22], + ShortWrite: ns[23], + JukeboxDelay: ns[24], + PNFSRead: ns[25], + PNFSWrite: ns[26], + }, nil +} + +// parseNFSOperationStats parses a slice of NFSOperationStats by scanning +// additional information about per-operation statistics until an empty +// line is reached. +func parseNFSOperationStats(s *bufio.Scanner) ([]NFSOperationStats, error) { + const ( + // Number of expected fields in each per-operation statistics set + numFields = 9 + ) + + var ops []NFSOperationStats + + for s.Scan() { + ss := strings.Fields(string(s.Bytes())) + if len(ss) == 0 { + // Must break when reading a blank line after per-operation stats to + // enable top-level function to parse the next device entry + break + } + + if len(ss) != numFields { + return nil, fmt.Errorf("invalid NFS per-operations stats: %v", ss) + } + + // Skip string operation name for integers + ns := make([]uint64, 0, numFields-1) + for _, st := range ss[1:] { + n, err := strconv.ParseUint(st, 10, 64) + if err != nil { + return nil, err + } + + ns = append(ns, n) + } + + ops = append(ops, NFSOperationStats{ + Operation: strings.TrimSuffix(ss[0], ":"), + Requests: ns[0], + Transmissions: ns[1], + MajorTimeouts: ns[2], + BytesSent: ns[3], + BytesReceived: ns[4], + CumulativeQueueTime: time.Duration(ns[5]) * time.Millisecond, + CumulativeTotalResponseTime: time.Duration(ns[6]) * time.Millisecond, + CumulativeTotalRequestTime: time.Duration(ns[7]) * time.Millisecond, + }) + } + + return ops, s.Err() +} + +// parseNFSTransportStats parses a NFSTransportStats line using an input set of +// integer fields matched to a specific stats version. +func parseNFSTransportStats(ss []string, statVersion string) (*NFSTransportStats, error) { + switch statVersion { + case statVersion10: + if len(ss) != fieldTransport10Len { + return nil, fmt.Errorf("invalid NFS transport stats 1.0 statement: %v", ss) + } + case statVersion11: + if len(ss) != fieldTransport11Len { + return nil, fmt.Errorf("invalid NFS transport stats 1.1 statement: %v", ss) + } + default: + return nil, fmt.Errorf("unrecognized NFS transport stats version: %q", statVersion) + } + + // Allocate enough for v1.1 stats since zero value for v1.1 stats will be okay + // in a v1.0 response. + // + // Note: slice length must be set to length of v1.1 stats to avoid a panic when + // only v1.0 stats are present. + // See: https://github.com/prometheus/node_exporter/issues/571. + ns := make([]uint64, fieldTransport11Len) + for i, s := range ss { + n, err := strconv.ParseUint(s, 10, 64) + if err != nil { + return nil, err + } + + ns[i] = n + } + + return &NFSTransportStats{ + Port: ns[0], + Bind: ns[1], + Connect: ns[2], + ConnectIdleTime: ns[3], + IdleTime: time.Duration(ns[4]) * time.Second, + Sends: ns[5], + Receives: ns[6], + BadTransactionIDs: ns[7], + CumulativeActiveRequests: ns[8], + CumulativeBacklog: ns[9], + MaximumRPCSlotsUsed: ns[10], + CumulativeSendingQueue: ns[11], + CumulativePendingQueue: ns[12], + }, nil +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/mountstats_test.go b/example/prometheus-mock/vendor/github.com/prometheus/procfs/mountstats_test.go new file mode 100644 index 0000000..8f04f53 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/mountstats_test.go @@ -0,0 +1,273 @@ +package procfs + +import ( + "fmt" + "reflect" + "strings" + "testing" + "time" +) + +func TestMountStats(t *testing.T) { + tests := []struct { + name string + s string + mounts []*Mount + invalid bool + }{ + { + name: "no devices", + s: `hello`, + }, + { + name: "device has too few fields", + s: `device foo`, + invalid: true, + }, + { + name: "device incorrect format", + s: `device rootfs BAD on / with fstype rootfs`, + invalid: true, + }, + { + name: "device incorrect format", + s: `device rootfs mounted BAD / with fstype rootfs`, + invalid: true, + }, + { + name: "device incorrect format", + s: `device rootfs mounted on / BAD fstype rootfs`, + invalid: true, + }, + { + name: "device incorrect format", + s: `device rootfs mounted on / with BAD rootfs`, + invalid: true, + }, + { + name: "device rootfs cannot have stats", + s: `device rootfs mounted on / with fstype rootfs stats`, + invalid: true, + }, + { + name: "NFSv4 device with too little info", + s: "device 192.168.1.1:/srv mounted on /mnt/nfs with fstype nfs4 statvers=1.1\nhello", + invalid: true, + }, + { + name: "NFSv4 device with bad bytes", + s: "device 192.168.1.1:/srv mounted on /mnt/nfs with fstype nfs4 statvers=1.1\nbytes: 0", + invalid: true, + }, + { + name: "NFSv4 device with bad events", + s: "device 192.168.1.1:/srv mounted on /mnt/nfs with fstype nfs4 statvers=1.1\nevents: 0", + invalid: true, + }, + { + name: "NFSv4 device with bad per-op stats", + s: "device 192.168.1.1:/srv mounted on /mnt/nfs with fstype nfs4 statvers=1.1\nper-op statistics\nFOO 0", + invalid: true, + }, + { + name: "NFSv4 device with bad transport stats", + s: "device 192.168.1.1:/srv mounted on /mnt/nfs with fstype nfs4 statvers=1.1\nxprt: tcp", + invalid: true, + }, + { + name: "NFSv4 device with bad transport version", + s: "device 192.168.1.1:/srv mounted on /mnt/nfs with fstype nfs4 statvers=foo\nxprt: tcp 0", + invalid: true, + }, + { + name: "NFSv4 device with bad transport stats version 1.0", + s: "device 192.168.1.1:/srv mounted on /mnt/nfs with fstype nfs4 statvers=1.0\nxprt: tcp 0 0 0 0 0 0 0 0 0 0 0 0 0", + invalid: true, + }, + { + name: "NFSv4 device with bad transport stats version 1.1", + s: "device 192.168.1.1:/srv mounted on /mnt/nfs with fstype nfs4 statvers=1.1\nxprt: tcp 0 0 0 0 0 0 0 0 0 0", + invalid: true, + }, + { + name: "NFSv3 device with transport stats version 1.0 OK", + s: "device 192.168.1.1:/srv mounted on /mnt/nfs with fstype nfs statvers=1.0\nxprt: tcp 1 2 3 4 5 6 7 8 9 10", + mounts: []*Mount{{ + Device: "192.168.1.1:/srv", + Mount: "/mnt/nfs", + Type: "nfs", + Stats: &MountStatsNFS{ + StatVersion: "1.0", + Transport: NFSTransportStats{ + Port: 1, + Bind: 2, + Connect: 3, + ConnectIdleTime: 4, + IdleTime: 5 * time.Second, + Sends: 6, + Receives: 7, + BadTransactionIDs: 8, + CumulativeActiveRequests: 9, + CumulativeBacklog: 10, + }, + }, + }}, + }, + { + name: "device rootfs OK", + s: `device rootfs mounted on / with fstype rootfs`, + mounts: []*Mount{{ + Device: "rootfs", + Mount: "/", + Type: "rootfs", + }}, + }, + { + name: "NFSv3 device with minimal stats OK", + s: `device 192.168.1.1:/srv mounted on /mnt/nfs with fstype nfs statvers=1.1`, + mounts: []*Mount{{ + Device: "192.168.1.1:/srv", + Mount: "/mnt/nfs", + Type: "nfs", + Stats: &MountStatsNFS{ + StatVersion: "1.1", + }, + }}, + }, + { + name: "fixtures OK", + mounts: []*Mount{ + { + Device: "rootfs", + Mount: "/", + Type: "rootfs", + }, + { + Device: "sysfs", + Mount: "/sys", + Type: "sysfs", + }, + { + Device: "proc", + Mount: "/proc", + Type: "proc", + }, + { + Device: "/dev/sda1", + Mount: "/", + Type: "ext4", + }, + { + Device: "192.168.1.1:/srv/test", + Mount: "/mnt/nfs/test", + Type: "nfs4", + Stats: &MountStatsNFS{ + StatVersion: "1.1", + Age: 13968 * time.Second, + Bytes: NFSBytesStats{ + Read: 1207640230, + ReadTotal: 1210214218, + ReadPages: 295483, + }, + Events: NFSEventsStats{ + InodeRevalidate: 52, + DnodeRevalidate: 226, + VFSOpen: 1, + VFSLookup: 13, + VFSAccess: 398, + VFSReadPages: 331, + VFSWritePages: 47, + VFSFlush: 77, + VFSFileRelease: 77, + }, + Operations: []NFSOperationStats{ + { + Operation: "NULL", + }, + { + Operation: "READ", + Requests: 1298, + Transmissions: 1298, + BytesSent: 207680, + BytesReceived: 1210292152, + CumulativeQueueTime: 6 * time.Millisecond, + CumulativeTotalResponseTime: 79386 * time.Millisecond, + CumulativeTotalRequestTime: 79407 * time.Millisecond, + }, + { + Operation: "WRITE", + }, + }, + Transport: NFSTransportStats{ + Port: 832, + Connect: 1, + IdleTime: 11 * time.Second, + Sends: 6428, + Receives: 6428, + CumulativeActiveRequests: 12154, + MaximumRPCSlotsUsed: 24, + CumulativeSendingQueue: 26, + CumulativePendingQueue: 5726, + }, + }, + }, + }, + }, + } + + for i, tt := range tests { + t.Logf("[%02d] test %q", i, tt.name) + + var mounts []*Mount + var err error + + if tt.s != "" { + mounts, err = parseMountStats(strings.NewReader(tt.s)) + } else { + proc, e := FS("fixtures").NewProc(26231) + if e != nil { + t.Fatalf("failed to create proc: %v", err) + } + + mounts, err = proc.MountStats() + } + + if tt.invalid && err == nil { + t.Error("expected an error, but none occurred") + } + if !tt.invalid && err != nil { + t.Errorf("unexpected error: %v", err) + } + + if want, have := tt.mounts, mounts; !reflect.DeepEqual(want, have) { + t.Errorf("mounts:\nwant:\n%v\nhave:\n%v", mountsStr(want), mountsStr(have)) + } + } +} + +func mountsStr(mounts []*Mount) string { + var out string + for i, m := range mounts { + out += fmt.Sprintf("[%d] %q on %q (%q)", i, m.Device, m.Mount, m.Type) + + stats, ok := m.Stats.(*MountStatsNFS) + if !ok { + out += "\n" + continue + } + + out += fmt.Sprintf("\n\t- v%s, age: %s", stats.StatVersion, stats.Age) + out += fmt.Sprintf("\n\t- bytes: %v", stats.Bytes) + out += fmt.Sprintf("\n\t- events: %v", stats.Events) + out += fmt.Sprintf("\n\t- transport: %v", stats.Transport) + out += fmt.Sprintf("\n\t- per-operation stats:") + + for _, o := range stats.Operations { + out += fmt.Sprintf("\n\t\t- %v", o) + } + + out += "\n" + } + + return out +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/proc.go b/example/prometheus-mock/vendor/github.com/prometheus/procfs/proc.go new file mode 100644 index 0000000..8717e1f --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/proc.go @@ -0,0 +1,224 @@ +package procfs + +import ( + "fmt" + "io/ioutil" + "os" + "strconv" + "strings" +) + +// Proc provides information about a running process. +type Proc struct { + // The process ID. + PID int + + fs FS +} + +// Procs represents a list of Proc structs. +type Procs []Proc + +func (p Procs) Len() int { return len(p) } +func (p Procs) Swap(i, j int) { p[i], p[j] = p[j], p[i] } +func (p Procs) Less(i, j int) bool { return p[i].PID < p[j].PID } + +// Self returns a process for the current process read via /proc/self. +func Self() (Proc, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return Proc{}, err + } + return fs.Self() +} + +// NewProc returns a process for the given pid under /proc. +func NewProc(pid int) (Proc, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return Proc{}, err + } + return fs.NewProc(pid) +} + +// AllProcs returns a list of all currently available processes under /proc. +func AllProcs() (Procs, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return Procs{}, err + } + return fs.AllProcs() +} + +// Self returns a process for the current process. +func (fs FS) Self() (Proc, error) { + p, err := os.Readlink(fs.Path("self")) + if err != nil { + return Proc{}, err + } + pid, err := strconv.Atoi(strings.Replace(p, string(fs), "", -1)) + if err != nil { + return Proc{}, err + } + return fs.NewProc(pid) +} + +// NewProc returns a process for the given pid. +func (fs FS) NewProc(pid int) (Proc, error) { + if _, err := os.Stat(fs.Path(strconv.Itoa(pid))); err != nil { + return Proc{}, err + } + return Proc{PID: pid, fs: fs}, nil +} + +// AllProcs returns a list of all currently available processes. +func (fs FS) AllProcs() (Procs, error) { + d, err := os.Open(fs.Path()) + if err != nil { + return Procs{}, err + } + defer d.Close() + + names, err := d.Readdirnames(-1) + if err != nil { + return Procs{}, fmt.Errorf("could not read %s: %s", d.Name(), err) + } + + p := Procs{} + for _, n := range names { + pid, err := strconv.ParseInt(n, 10, 64) + if err != nil { + continue + } + p = append(p, Proc{PID: int(pid), fs: fs}) + } + + return p, nil +} + +// CmdLine returns the command line of a process. +func (p Proc) CmdLine() ([]string, error) { + f, err := os.Open(p.path("cmdline")) + if err != nil { + return nil, err + } + defer f.Close() + + data, err := ioutil.ReadAll(f) + if err != nil { + return nil, err + } + + if len(data) < 1 { + return []string{}, nil + } + + return strings.Split(string(data[:len(data)-1]), string(byte(0))), nil +} + +// Comm returns the command name of a process. +func (p Proc) Comm() (string, error) { + f, err := os.Open(p.path("comm")) + if err != nil { + return "", err + } + defer f.Close() + + data, err := ioutil.ReadAll(f) + if err != nil { + return "", err + } + + return strings.TrimSpace(string(data)), nil +} + +// Executable returns the absolute path of the executable command of a process. +func (p Proc) Executable() (string, error) { + exe, err := os.Readlink(p.path("exe")) + if os.IsNotExist(err) { + return "", nil + } + + return exe, err +} + +// FileDescriptors returns the currently open file descriptors of a process. +func (p Proc) FileDescriptors() ([]uintptr, error) { + names, err := p.fileDescriptors() + if err != nil { + return nil, err + } + + fds := make([]uintptr, len(names)) + for i, n := range names { + fd, err := strconv.ParseInt(n, 10, 32) + if err != nil { + return nil, fmt.Errorf("could not parse fd %s: %s", n, err) + } + fds[i] = uintptr(fd) + } + + return fds, nil +} + +// FileDescriptorTargets returns the targets of all file descriptors of a process. +// If a file descriptor is not a symlink to a file (like a socket), that value will be the empty string. +func (p Proc) FileDescriptorTargets() ([]string, error) { + names, err := p.fileDescriptors() + if err != nil { + return nil, err + } + + targets := make([]string, len(names)) + + for i, name := range names { + target, err := os.Readlink(p.path("fd", name)) + if err == nil { + targets[i] = target + } + } + + return targets, nil +} + +// FileDescriptorsLen returns the number of currently open file descriptors of +// a process. +func (p Proc) FileDescriptorsLen() (int, error) { + fds, err := p.fileDescriptors() + if err != nil { + return 0, err + } + + return len(fds), nil +} + +// MountStats retrieves statistics and configuration for mount points in a +// process's namespace. +func (p Proc) MountStats() ([]*Mount, error) { + f, err := os.Open(p.path("mountstats")) + if err != nil { + return nil, err + } + defer f.Close() + + return parseMountStats(f) +} + +func (p Proc) fileDescriptors() ([]string, error) { + d, err := os.Open(p.path("fd")) + if err != nil { + return nil, err + } + defer d.Close() + + names, err := d.Readdirnames(-1) + if err != nil { + return nil, fmt.Errorf("could not read %s: %s", d.Name(), err) + } + + return names, nil +} + +func (p Proc) path(pa ...string) string { + return p.fs.Path(append([]string{strconv.Itoa(p.PID)}, pa...)...) +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/proc_io.go b/example/prometheus-mock/vendor/github.com/prometheus/procfs/proc_io.go new file mode 100644 index 0000000..b4e31d7 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/proc_io.go @@ -0,0 +1,55 @@ +package procfs + +import ( + "fmt" + "io/ioutil" + "os" +) + +// ProcIO models the content of /proc//io. +type ProcIO struct { + // Chars read. + RChar uint64 + // Chars written. + WChar uint64 + // Read syscalls. + SyscR uint64 + // Write syscalls. + SyscW uint64 + // Bytes read. + ReadBytes uint64 + // Bytes written. + WriteBytes uint64 + // Bytes written, but taking into account truncation. See + // Documentation/filesystems/proc.txt in the kernel sources for + // detailed explanation. + CancelledWriteBytes int64 +} + +// NewIO creates a new ProcIO instance from a given Proc instance. +func (p Proc) NewIO() (ProcIO, error) { + pio := ProcIO{} + + f, err := os.Open(p.path("io")) + if err != nil { + return pio, err + } + defer f.Close() + + data, err := ioutil.ReadAll(f) + if err != nil { + return pio, err + } + + ioFormat := "rchar: %d\nwchar: %d\nsyscr: %d\nsyscw: %d\n" + + "read_bytes: %d\nwrite_bytes: %d\n" + + "cancelled_write_bytes: %d\n" + + _, err = fmt.Sscanf(string(data), ioFormat, &pio.RChar, &pio.WChar, &pio.SyscR, + &pio.SyscW, &pio.ReadBytes, &pio.WriteBytes, &pio.CancelledWriteBytes) + if err != nil { + return pio, err + } + + return pio, nil +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/proc_io_test.go b/example/prometheus-mock/vendor/github.com/prometheus/procfs/proc_io_test.go new file mode 100644 index 0000000..3aa1a12 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/proc_io_test.go @@ -0,0 +1,33 @@ +package procfs + +import "testing" + +func TestProcIO(t *testing.T) { + p, err := FS("fixtures").NewProc(26231) + if err != nil { + t.Fatal(err) + } + + s, err := p.NewIO() + if err != nil { + t.Fatal(err) + } + + for _, test := range []struct { + name string + want int64 + have int64 + }{ + {name: "RChar", want: 750339, have: int64(s.RChar)}, + {name: "WChar", want: 818609, have: int64(s.WChar)}, + {name: "SyscR", want: 7405, have: int64(s.SyscR)}, + {name: "SyscW", want: 5245, have: int64(s.SyscW)}, + {name: "ReadBytes", want: 1024, have: int64(s.ReadBytes)}, + {name: "WriteBytes", want: 2048, have: int64(s.WriteBytes)}, + {name: "CancelledWriteBytes", want: -1024, have: s.CancelledWriteBytes}, + } { + if test.want != test.have { + t.Errorf("want %s %d, have %d", test.name, test.want, test.have) + } + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/proc_limits.go b/example/prometheus-mock/vendor/github.com/prometheus/procfs/proc_limits.go new file mode 100644 index 0000000..2df997c --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/proc_limits.go @@ -0,0 +1,137 @@ +package procfs + +import ( + "bufio" + "fmt" + "os" + "regexp" + "strconv" +) + +// ProcLimits represents the soft limits for each of the process's resource +// limits. For more information see getrlimit(2): +// http://man7.org/linux/man-pages/man2/getrlimit.2.html. +type ProcLimits struct { + // CPU time limit in seconds. + CPUTime int + // Maximum size of files that the process may create. + FileSize int + // Maximum size of the process's data segment (initialized data, + // uninitialized data, and heap). + DataSize int + // Maximum size of the process stack in bytes. + StackSize int + // Maximum size of a core file. + CoreFileSize int + // Limit of the process's resident set in pages. + ResidentSet int + // Maximum number of processes that can be created for the real user ID of + // the calling process. + Processes int + // Value one greater than the maximum file descriptor number that can be + // opened by this process. + OpenFiles int + // Maximum number of bytes of memory that may be locked into RAM. + LockedMemory int + // Maximum size of the process's virtual memory address space in bytes. + AddressSpace int + // Limit on the combined number of flock(2) locks and fcntl(2) leases that + // this process may establish. + FileLocks int + // Limit of signals that may be queued for the real user ID of the calling + // process. + PendingSignals int + // Limit on the number of bytes that can be allocated for POSIX message + // queues for the real user ID of the calling process. + MsqqueueSize int + // Limit of the nice priority set using setpriority(2) or nice(2). + NicePriority int + // Limit of the real-time priority set using sched_setscheduler(2) or + // sched_setparam(2). + RealtimePriority int + // Limit (in microseconds) on the amount of CPU time that a process + // scheduled under a real-time scheduling policy may consume without making + // a blocking system call. + RealtimeTimeout int +} + +const ( + limitsFields = 3 + limitsUnlimited = "unlimited" +) + +var ( + limitsDelimiter = regexp.MustCompile(" +") +) + +// NewLimits returns the current soft limits of the process. +func (p Proc) NewLimits() (ProcLimits, error) { + f, err := os.Open(p.path("limits")) + if err != nil { + return ProcLimits{}, err + } + defer f.Close() + + var ( + l = ProcLimits{} + s = bufio.NewScanner(f) + ) + for s.Scan() { + fields := limitsDelimiter.Split(s.Text(), limitsFields) + if len(fields) != limitsFields { + return ProcLimits{}, fmt.Errorf( + "couldn't parse %s line %s", f.Name(), s.Text()) + } + + switch fields[0] { + case "Max cpu time": + l.CPUTime, err = parseInt(fields[1]) + case "Max file size": + l.FileSize, err = parseInt(fields[1]) + case "Max data size": + l.DataSize, err = parseInt(fields[1]) + case "Max stack size": + l.StackSize, err = parseInt(fields[1]) + case "Max core file size": + l.CoreFileSize, err = parseInt(fields[1]) + case "Max resident set": + l.ResidentSet, err = parseInt(fields[1]) + case "Max processes": + l.Processes, err = parseInt(fields[1]) + case "Max open files": + l.OpenFiles, err = parseInt(fields[1]) + case "Max locked memory": + l.LockedMemory, err = parseInt(fields[1]) + case "Max address space": + l.AddressSpace, err = parseInt(fields[1]) + case "Max file locks": + l.FileLocks, err = parseInt(fields[1]) + case "Max pending signals": + l.PendingSignals, err = parseInt(fields[1]) + case "Max msgqueue size": + l.MsqqueueSize, err = parseInt(fields[1]) + case "Max nice priority": + l.NicePriority, err = parseInt(fields[1]) + case "Max realtime priority": + l.RealtimePriority, err = parseInt(fields[1]) + case "Max realtime timeout": + l.RealtimeTimeout, err = parseInt(fields[1]) + } + if err != nil { + return ProcLimits{}, err + } + } + + return l, s.Err() +} + +func parseInt(s string) (int, error) { + if s == limitsUnlimited { + return -1, nil + } + i, err := strconv.ParseInt(s, 10, 32) + if err != nil { + return 0, fmt.Errorf("couldn't parse value %s: %s", s, err) + } + return int(i), nil +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/proc_limits_test.go b/example/prometheus-mock/vendor/github.com/prometheus/procfs/proc_limits_test.go new file mode 100644 index 0000000..70bf04e --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/proc_limits_test.go @@ -0,0 +1,31 @@ +package procfs + +import "testing" + +func TestNewLimits(t *testing.T) { + p, err := FS("fixtures").NewProc(26231) + if err != nil { + t.Fatal(err) + } + + l, err := p.NewLimits() + if err != nil { + t.Fatal(err) + } + + for _, test := range []struct { + name string + want int + have int + }{ + {name: "cpu time", want: -1, have: l.CPUTime}, + {name: "open files", want: 2048, have: l.OpenFiles}, + {name: "msgqueue size", want: 819200, have: l.MsqqueueSize}, + {name: "nice priority", want: 0, have: l.NicePriority}, + {name: "address space", want: -1, have: l.AddressSpace}, + } { + if test.want != test.have { + t.Errorf("want %s %d, have %d", test.name, test.want, test.have) + } + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/proc_stat.go b/example/prometheus-mock/vendor/github.com/prometheus/procfs/proc_stat.go new file mode 100644 index 0000000..724e271 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/proc_stat.go @@ -0,0 +1,175 @@ +package procfs + +import ( + "bytes" + "fmt" + "io/ioutil" + "os" +) + +// Originally, this USER_HZ value was dynamically retrieved via a sysconf call +// which required cgo. However, that caused a lot of problems regarding +// cross-compilation. Alternatives such as running a binary to determine the +// value, or trying to derive it in some other way were all problematic. After +// much research it was determined that USER_HZ is actually hardcoded to 100 on +// all Go-supported platforms as of the time of this writing. This is why we +// decided to hardcode it here as well. It is not impossible that there could +// be systems with exceptions, but they should be very exotic edge cases, and +// in that case, the worst outcome will be two misreported metrics. +// +// See also the following discussions: +// +// - https://github.com/prometheus/node_exporter/issues/52 +// - https://github.com/prometheus/procfs/pull/2 +// - http://stackoverflow.com/questions/17410841/how-does-user-hz-solve-the-jiffy-scaling-issue +const userHZ = 100 + +// ProcStat provides status information about the process, +// read from /proc/[pid]/stat. +type ProcStat struct { + // The process ID. + PID int + // The filename of the executable. + Comm string + // The process state. + State string + // The PID of the parent of this process. + PPID int + // The process group ID of the process. + PGRP int + // The session ID of the process. + Session int + // The controlling terminal of the process. + TTY int + // The ID of the foreground process group of the controlling terminal of + // the process. + TPGID int + // The kernel flags word of the process. + Flags uint + // The number of minor faults the process has made which have not required + // loading a memory page from disk. + MinFlt uint + // The number of minor faults that the process's waited-for children have + // made. + CMinFlt uint + // The number of major faults the process has made which have required + // loading a memory page from disk. + MajFlt uint + // The number of major faults that the process's waited-for children have + // made. + CMajFlt uint + // Amount of time that this process has been scheduled in user mode, + // measured in clock ticks. + UTime uint + // Amount of time that this process has been scheduled in kernel mode, + // measured in clock ticks. + STime uint + // Amount of time that this process's waited-for children have been + // scheduled in user mode, measured in clock ticks. + CUTime uint + // Amount of time that this process's waited-for children have been + // scheduled in kernel mode, measured in clock ticks. + CSTime uint + // For processes running a real-time scheduling policy, this is the negated + // scheduling priority, minus one. + Priority int + // The nice value, a value in the range 19 (low priority) to -20 (high + // priority). + Nice int + // Number of threads in this process. + NumThreads int + // The time the process started after system boot, the value is expressed + // in clock ticks. + Starttime uint64 + // Virtual memory size in bytes. + VSize int + // Resident set size in pages. + RSS int + + fs FS +} + +// NewStat returns the current status information of the process. +func (p Proc) NewStat() (ProcStat, error) { + f, err := os.Open(p.path("stat")) + if err != nil { + return ProcStat{}, err + } + defer f.Close() + + data, err := ioutil.ReadAll(f) + if err != nil { + return ProcStat{}, err + } + + var ( + ignore int + + s = ProcStat{PID: p.PID, fs: p.fs} + l = bytes.Index(data, []byte("(")) + r = bytes.LastIndex(data, []byte(")")) + ) + + if l < 0 || r < 0 { + return ProcStat{}, fmt.Errorf( + "unexpected format, couldn't extract comm: %s", + data, + ) + } + + s.Comm = string(data[l+1 : r]) + _, err = fmt.Fscan( + bytes.NewBuffer(data[r+2:]), + &s.State, + &s.PPID, + &s.PGRP, + &s.Session, + &s.TTY, + &s.TPGID, + &s.Flags, + &s.MinFlt, + &s.CMinFlt, + &s.MajFlt, + &s.CMajFlt, + &s.UTime, + &s.STime, + &s.CUTime, + &s.CSTime, + &s.Priority, + &s.Nice, + &s.NumThreads, + &ignore, + &s.Starttime, + &s.VSize, + &s.RSS, + ) + if err != nil { + return ProcStat{}, err + } + + return s, nil +} + +// VirtualMemory returns the virtual memory size in bytes. +func (s ProcStat) VirtualMemory() int { + return s.VSize +} + +// ResidentMemory returns the resident memory size in bytes. +func (s ProcStat) ResidentMemory() int { + return s.RSS * os.Getpagesize() +} + +// StartTime returns the unix timestamp of the process in seconds. +func (s ProcStat) StartTime() (float64, error) { + stat, err := s.fs.NewStat() + if err != nil { + return 0, err + } + return float64(stat.BootTime) + (float64(s.Starttime) / userHZ), nil +} + +// CPUTime returns the total CPU user and system time in seconds. +func (s ProcStat) CPUTime() float64 { + return float64(s.UTime+s.STime) / userHZ +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/proc_stat_test.go b/example/prometheus-mock/vendor/github.com/prometheus/procfs/proc_stat_test.go new file mode 100644 index 0000000..a2ebcde --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/proc_stat_test.go @@ -0,0 +1,110 @@ +package procfs + +import ( + "os" + "testing" +) + +func TestProcStat(t *testing.T) { + p, err := FS("fixtures").NewProc(26231) + if err != nil { + t.Fatal(err) + } + + s, err := p.NewStat() + if err != nil { + t.Fatal(err) + } + + for _, test := range []struct { + name string + want int + have int + }{ + {name: "pid", want: 26231, have: s.PID}, + {name: "user time", want: 1677, have: int(s.UTime)}, + {name: "system time", want: 44, have: int(s.STime)}, + {name: "start time", want: 82375, have: int(s.Starttime)}, + {name: "virtual memory size", want: 56274944, have: s.VSize}, + {name: "resident set size", want: 1981, have: s.RSS}, + } { + if test.want != test.have { + t.Errorf("want %s %d, have %d", test.name, test.want, test.have) + } + } +} + +func TestProcStatComm(t *testing.T) { + s1, err := testProcStat(26231) + if err != nil { + t.Fatal(err) + } + if want, have := "vim", s1.Comm; want != have { + t.Errorf("want comm %s, have %s", want, have) + } + + s2, err := testProcStat(584) + if err != nil { + t.Fatal(err) + } + if want, have := "(a b ) ( c d) ", s2.Comm; want != have { + t.Errorf("want comm %s, have %s", want, have) + } +} + +func TestProcStatVirtualMemory(t *testing.T) { + s, err := testProcStat(26231) + if err != nil { + t.Fatal(err) + } + + if want, have := 56274944, s.VirtualMemory(); want != have { + t.Errorf("want virtual memory %d, have %d", want, have) + } +} + +func TestProcStatResidentMemory(t *testing.T) { + s, err := testProcStat(26231) + if err != nil { + t.Fatal(err) + } + + if want, have := 1981*os.Getpagesize(), s.ResidentMemory(); want != have { + t.Errorf("want resident memory %d, have %d", want, have) + } +} + +func TestProcStatStartTime(t *testing.T) { + s, err := testProcStat(26231) + if err != nil { + t.Fatal(err) + } + + time, err := s.StartTime() + if err != nil { + t.Fatal(err) + } + if want, have := 1418184099.75, time; want != have { + t.Errorf("want start time %f, have %f", want, have) + } +} + +func TestProcStatCPUTime(t *testing.T) { + s, err := testProcStat(26231) + if err != nil { + t.Fatal(err) + } + + if want, have := 17.21, s.CPUTime(); want != have { + t.Errorf("want cpu time %f, have %f", want, have) + } +} + +func testProcStat(pid int) (ProcStat, error) { + p, err := FS("fixtures").NewProc(pid) + if err != nil { + return ProcStat{}, err + } + + return p.NewStat() +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/proc_test.go b/example/prometheus-mock/vendor/github.com/prometheus/procfs/proc_test.go new file mode 100644 index 0000000..104b324 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/proc_test.go @@ -0,0 +1,160 @@ +package procfs + +import ( + "reflect" + "sort" + "testing" +) + +func TestSelf(t *testing.T) { + fs := FS("fixtures") + + p1, err := fs.NewProc(26231) + if err != nil { + t.Fatal(err) + } + p2, err := fs.Self() + if err != nil { + t.Fatal(err) + } + + if !reflect.DeepEqual(p1, p2) { + t.Errorf("want process %v, have %v", p1, p2) + } +} + +func TestAllProcs(t *testing.T) { + procs, err := FS("fixtures").AllProcs() + if err != nil { + t.Fatal(err) + } + sort.Sort(procs) + for i, p := range []*Proc{{PID: 584}, {PID: 26231}} { + if want, have := p.PID, procs[i].PID; want != have { + t.Errorf("want processes %d, have %d", want, have) + } + } +} + +func TestCmdLine(t *testing.T) { + for _, tt := range []struct { + process int + want []string + }{ + {process: 26231, want: []string{"vim", "test.go", "+10"}}, + {process: 26232, want: []string{}}, + } { + p1, err := FS("fixtures").NewProc(tt.process) + if err != nil { + t.Fatal(err) + } + c1, err := p1.CmdLine() + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(tt.want, c1) { + t.Errorf("want cmdline %v, have %v", tt.want, c1) + } + } +} + +func TestComm(t *testing.T) { + for _, tt := range []struct { + process int + want string + }{ + {process: 26231, want: "vim"}, + {process: 26232, want: "ata_sff"}, + } { + p1, err := FS("fixtures").NewProc(tt.process) + if err != nil { + t.Fatal(err) + } + c1, err := p1.Comm() + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(tt.want, c1) { + t.Errorf("want comm %v, have %v", tt.want, c1) + } + } +} + +func TestExecutable(t *testing.T) { + for _, tt := range []struct { + process int + want string + }{ + {process: 26231, want: "/usr/bin/vim"}, + {process: 26232, want: ""}, + } { + p, err := FS("fixtures").NewProc(tt.process) + if err != nil { + t.Fatal(err) + } + exe, err := p.Executable() + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(tt.want, exe) { + t.Errorf("want absolute path to cmdline %v, have %v", tt.want, exe) + } + } +} + +func TestFileDescriptors(t *testing.T) { + p1, err := FS("fixtures").NewProc(26231) + if err != nil { + t.Fatal(err) + } + fds, err := p1.FileDescriptors() + if err != nil { + t.Fatal(err) + } + sort.Sort(byUintptr(fds)) + if want := []uintptr{0, 1, 2, 3, 10}; !reflect.DeepEqual(want, fds) { + t.Errorf("want fds %v, have %v", want, fds) + } +} + +func TestFileDescriptorTargets(t *testing.T) { + p1, err := FS("fixtures").NewProc(26231) + if err != nil { + t.Fatal(err) + } + fds, err := p1.FileDescriptorTargets() + if err != nil { + t.Fatal(err) + } + sort.Strings(fds) + var want = []string{ + "../../symlinktargets/abc", + "../../symlinktargets/def", + "../../symlinktargets/ghi", + "../../symlinktargets/uvw", + "../../symlinktargets/xyz", + } + if !reflect.DeepEqual(want, fds) { + t.Errorf("want fds %v, have %v", want, fds) + } +} + +func TestFileDescriptorsLen(t *testing.T) { + p1, err := FS("fixtures").NewProc(26231) + if err != nil { + t.Fatal(err) + } + l, err := p1.FileDescriptorsLen() + if err != nil { + t.Fatal(err) + } + if want, have := 5, l; want != have { + t.Errorf("want fds %d, have %d", want, have) + } +} + +type byUintptr []uintptr + +func (a byUintptr) Len() int { return len(a) } +func (a byUintptr) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a byUintptr) Less(i, j int) bool { return a[i] < a[j] } diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/stat.go b/example/prometheus-mock/vendor/github.com/prometheus/procfs/stat.go new file mode 100644 index 0000000..701f4df --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/stat.go @@ -0,0 +1,219 @@ +package procfs + +import ( + "bufio" + "fmt" + "io" + "os" + "strconv" + "strings" +) + +// CPUStat shows how much time the cpu spend in various stages. +type CPUStat struct { + User float64 + Nice float64 + System float64 + Idle float64 + Iowait float64 + IRQ float64 + SoftIRQ float64 + Steal float64 + Guest float64 + GuestNice float64 +} + +// SoftIRQStat represent the softirq statistics as exported in the procfs stat file. +// A nice introduction can be found at https://0xax.gitbooks.io/linux-insides/content/interrupts/interrupts-9.html +// It is possible to get per-cpu stats by reading /proc/softirqs +type SoftIRQStat struct { + Hi uint64 + Timer uint64 + NetTx uint64 + NetRx uint64 + Block uint64 + BlockIoPoll uint64 + Tasklet uint64 + Sched uint64 + Hrtimer uint64 + Rcu uint64 +} + +// Stat represents kernel/system statistics. +type Stat struct { + // Boot time in seconds since the Epoch. + BootTime uint64 + // Summed up cpu statistics. + CPUTotal CPUStat + // Per-CPU statistics. + CPU []CPUStat + // Number of times interrupts were handled, which contains numbered and unnumbered IRQs. + IRQTotal uint64 + // Number of times a numbered IRQ was triggered. + IRQ []uint64 + // Number of times a context switch happened. + ContextSwitches uint64 + // Number of times a process was created. + ProcessCreated uint64 + // Number of processes currently running. + ProcessesRunning uint64 + // Number of processes currently blocked (waiting for IO). + ProcessesBlocked uint64 + // Number of times a softirq was scheduled. + SoftIRQTotal uint64 + // Detailed softirq statistics. + SoftIRQ SoftIRQStat +} + +// NewStat returns kernel/system statistics read from /proc/stat. +func NewStat() (Stat, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return Stat{}, err + } + + return fs.NewStat() +} + +// Parse a cpu statistics line and returns the CPUStat struct plus the cpu id (or -1 for the overall sum). +func parseCPUStat(line string) (CPUStat, int64, error) { + cpuStat := CPUStat{} + var cpu string + + count, err := fmt.Sscanf(line, "%s %f %f %f %f %f %f %f %f %f %f", + &cpu, + &cpuStat.User, &cpuStat.Nice, &cpuStat.System, &cpuStat.Idle, + &cpuStat.Iowait, &cpuStat.IRQ, &cpuStat.SoftIRQ, &cpuStat.Steal, + &cpuStat.Guest, &cpuStat.GuestNice) + + if err != nil && err != io.EOF { + return CPUStat{}, -1, fmt.Errorf("couldn't parse %s (cpu): %s", line, err) + } + if count == 0 { + return CPUStat{}, -1, fmt.Errorf("couldn't parse %s (cpu): 0 elements parsed", line) + } + + cpuStat.User /= userHZ + cpuStat.Nice /= userHZ + cpuStat.System /= userHZ + cpuStat.Idle /= userHZ + cpuStat.Iowait /= userHZ + cpuStat.IRQ /= userHZ + cpuStat.SoftIRQ /= userHZ + cpuStat.Steal /= userHZ + cpuStat.Guest /= userHZ + cpuStat.GuestNice /= userHZ + + if cpu == "cpu" { + return cpuStat, -1, nil + } + + cpuID, err := strconv.ParseInt(cpu[3:], 10, 64) + if err != nil { + return CPUStat{}, -1, fmt.Errorf("couldn't parse %s (cpu/cpuid): %s", line, err) + } + + return cpuStat, cpuID, nil +} + +// Parse a softirq line. +func parseSoftIRQStat(line string) (SoftIRQStat, uint64, error) { + softIRQStat := SoftIRQStat{} + var total uint64 + var prefix string + + _, err := fmt.Sscanf(line, "%s %d %d %d %d %d %d %d %d %d %d %d", + &prefix, &total, + &softIRQStat.Hi, &softIRQStat.Timer, &softIRQStat.NetTx, &softIRQStat.NetRx, + &softIRQStat.Block, &softIRQStat.BlockIoPoll, + &softIRQStat.Tasklet, &softIRQStat.Sched, + &softIRQStat.Hrtimer, &softIRQStat.Rcu) + + if err != nil { + return SoftIRQStat{}, 0, fmt.Errorf("couldn't parse %s (softirq): %s", line, err) + } + + return softIRQStat, total, nil +} + +// NewStat returns an information about current kernel/system statistics. +func (fs FS) NewStat() (Stat, error) { + // See https://www.kernel.org/doc/Documentation/filesystems/proc.txt + + f, err := os.Open(fs.Path("stat")) + if err != nil { + return Stat{}, err + } + defer f.Close() + + stat := Stat{} + + scanner := bufio.NewScanner(f) + for scanner.Scan() { + line := scanner.Text() + parts := strings.Fields(scanner.Text()) + // require at least + if len(parts) < 2 { + continue + } + switch { + case parts[0] == "btime": + if stat.BootTime, err = strconv.ParseUint(parts[1], 10, 64); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s (btime): %s", parts[1], err) + } + case parts[0] == "intr": + if stat.IRQTotal, err = strconv.ParseUint(parts[1], 10, 64); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s (intr): %s", parts[1], err) + } + numberedIRQs := parts[2:] + stat.IRQ = make([]uint64, len(numberedIRQs)) + for i, count := range numberedIRQs { + if stat.IRQ[i], err = strconv.ParseUint(count, 10, 64); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s (intr%d): %s", count, i, err) + } + } + case parts[0] == "ctxt": + if stat.ContextSwitches, err = strconv.ParseUint(parts[1], 10, 64); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s (ctxt): %s", parts[1], err) + } + case parts[0] == "processes": + if stat.ProcessCreated, err = strconv.ParseUint(parts[1], 10, 64); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s (processes): %s", parts[1], err) + } + case parts[0] == "procs_running": + if stat.ProcessesRunning, err = strconv.ParseUint(parts[1], 10, 64); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s (procs_running): %s", parts[1], err) + } + case parts[0] == "procs_blocked": + if stat.ProcessesBlocked, err = strconv.ParseUint(parts[1], 10, 64); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s (procs_blocked): %s", parts[1], err) + } + case parts[0] == "softirq": + softIRQStats, total, err := parseSoftIRQStat(line) + if err != nil { + return Stat{}, err + } + stat.SoftIRQTotal = total + stat.SoftIRQ = softIRQStats + case strings.HasPrefix(parts[0], "cpu"): + cpuStat, cpuID, err := parseCPUStat(line) + if err != nil { + return Stat{}, err + } + if cpuID == -1 { + stat.CPUTotal = cpuStat + } else { + for int64(len(stat.CPU)) <= cpuID { + stat.CPU = append(stat.CPU, CPUStat{}) + } + stat.CPU[cpuID] = cpuStat + } + } + } + + if err := scanner.Err(); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s: %s", f.Name(), err) + } + + return stat, nil +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/stat_test.go b/example/prometheus-mock/vendor/github.com/prometheus/procfs/stat_test.go new file mode 100644 index 0000000..c34ccce --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/stat_test.go @@ -0,0 +1,61 @@ +package procfs + +import "testing" + +func TestStat(t *testing.T) { + s, err := FS("fixtures").NewStat() + if err != nil { + t.Fatal(err) + } + + // cpu + if want, have := float64(301854)/userHZ, s.CPUTotal.User; want != have { + t.Errorf("want cpu/user %v, have %v", want, have) + } + if want, have := float64(31)/userHZ, s.CPU[7].SoftIRQ; want != have { + t.Errorf("want cpu7/softirq %v, have %v", want, have) + } + + // intr + if want, have := uint64(8885917), s.IRQTotal; want != have { + t.Errorf("want irq/total %d, have %d", want, have) + } + if want, have := uint64(1), s.IRQ[8]; want != have { + t.Errorf("want irq8 %d, have %d", want, have) + } + + // ctxt + if want, have := uint64(38014093), s.ContextSwitches; want != have { + t.Errorf("want context switches (ctxt) %d, have %d", want, have) + } + + // btime + if want, have := uint64(1418183276), s.BootTime; want != have { + t.Errorf("want boot time (btime) %d, have %d", want, have) + } + + // processes + if want, have := uint64(26442), s.ProcessCreated; want != have { + t.Errorf("want process created (processes) %d, have %d", want, have) + } + + // procs_running + if want, have := uint64(2), s.ProcessesRunning; want != have { + t.Errorf("want processes running (procs_running) %d, have %d", want, have) + } + + // procs_blocked + if want, have := uint64(1), s.ProcessesBlocked; want != have { + t.Errorf("want processes blocked (procs_blocked) %d, have %d", want, have) + } + + // softirq + if want, have := uint64(5057579), s.SoftIRQTotal; want != have { + t.Errorf("want softirq total %d, have %d", want, have) + } + + if want, have := uint64(508444), s.SoftIRQ.Rcu; want != have { + t.Errorf("want softirq RCU %d, have %d", want, have) + } + +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/sysfs/.gitignore b/example/prometheus-mock/vendor/github.com/prometheus/procfs/sysfs/.gitignore new file mode 100644 index 0000000..67fc140 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/sysfs/.gitignore @@ -0,0 +1 @@ +fixtures/ diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/sysfs/doc.go b/example/prometheus-mock/vendor/github.com/prometheus/procfs/sysfs/doc.go new file mode 100644 index 0000000..9a6c244 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/sysfs/doc.go @@ -0,0 +1,16 @@ +// Copyright 2017 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 sysfs provides functions to retrieve system and kernel metrics +// from the pseudo-filesystem sys. +package sysfs diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/sysfs/fixtures.ttar b/example/prometheus-mock/vendor/github.com/prometheus/procfs/sysfs/fixtures.ttar new file mode 100644 index 0000000..0045e7d --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/sysfs/fixtures.ttar @@ -0,0 +1,721 @@ +Directory: fixtures +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00/0000:00:0d.0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00/0000:00:0d.0/ata4 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/dirty_data +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_hit_ratio +Lines: 1 +100 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_hits +Lines: 1 +289 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_hit_ratio +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_hit_ratio +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_hit_ratio +Lines: 1 +100 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_hits +Lines: 1 +546 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00/0000:00:0d.0/ata5 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00/0000:00:0d.0/ata5/host4 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block/sdc +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block/sdc/bcache +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block/sdc/bcache/io_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block/sdc/bcache/metadata_written +Lines: 1 +512 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block/sdc/bcache/priority_stats +Lines: 5 +Unused: 99% +Metadata: 0% +Average: 10473 +Sectors per Q: 64 +Quantiles: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946] +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block/sdc/bcache/written +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs/bcache +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/average_key_size +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0 +Mode: 777 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/dirty_data +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_hit_ratio +Lines: 1 +100 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_hits +Lines: 1 +289 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_hit_ratio +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_hit_ratio +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_hit_ratio +Lines: 1 +100 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_hits +Lines: 1 +546 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/btree_cache_size +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/cache0 +Mode: 777 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/cache0/io_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/cache0/metadata_written +Lines: 1 +512 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/cache0/priority_stats +Lines: 5 +Unused: 99% +Metadata: 0% +Average: 10473 +Sectors per Q: 64 +Quantiles: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946] +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/cache0/written +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/cache_available_percent +Lines: 1 +100 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/congested +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/internal +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/internal/active_journal_entries +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/internal/btree_nodes +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/internal/btree_read_average_duration_us +Lines: 1 +1305 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/internal/cache_read_races +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/root_usage_percent +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_hit_ratio +Lines: 1 +100 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_hits +Lines: 1 +289 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_hit_ratio +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_hit_ratio +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_hit_ratio +Lines: 1 +100 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_hits +Lines: 1 +546 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/tree_depth +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs/xfs +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs/xfs/sda1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs/xfs/sda1/stats +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/xfs/sda1/stats/stats +Lines: 1 +extent_alloc 1 0 0 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs/xfs/sdb1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs/xfs/sdb1/stats +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/xfs/sdb1/stats/stats +Lines: 1 +extent_alloc 2 0 0 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/sysfs/fs.go b/example/prometheus-mock/vendor/github.com/prometheus/procfs/sysfs/fs.go new file mode 100644 index 0000000..fb15d43 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/sysfs/fs.go @@ -0,0 +1,108 @@ +// Copyright 2017 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 sysfs + +import ( + "fmt" + "os" + "path/filepath" + + "github.com/prometheus/procfs/bcache" + "github.com/prometheus/procfs/xfs" +) + +// FS represents the pseudo-filesystem sys, which provides an interface to +// kernel data structures. +type FS string + +// DefaultMountPoint is the common mount point of the sys filesystem. +const DefaultMountPoint = "/sys" + +// NewFS returns a new FS mounted under the given mountPoint. It will error +// if the mount point can't be read. +func NewFS(mountPoint string) (FS, error) { + info, err := os.Stat(mountPoint) + if err != nil { + return "", fmt.Errorf("could not read %s: %s", mountPoint, err) + } + if !info.IsDir() { + return "", fmt.Errorf("mount point %s is not a directory", mountPoint) + } + + return FS(mountPoint), nil +} + +// Path returns the path of the given subsystem relative to the sys root. +func (fs FS) Path(p ...string) string { + return filepath.Join(append([]string{string(fs)}, p...)...) +} + +// XFSStats retrieves XFS filesystem runtime statistics for each mounted XFS +// filesystem. Only available on kernel 4.4+. On older kernels, an empty +// slice of *xfs.Stats will be returned. +func (fs FS) XFSStats() ([]*xfs.Stats, error) { + matches, err := filepath.Glob(fs.Path("fs/xfs/*/stats/stats")) + if err != nil { + return nil, err + } + + stats := make([]*xfs.Stats, 0, len(matches)) + for _, m := range matches { + f, err := os.Open(m) + if err != nil { + return nil, err + } + + // "*" used in glob above indicates the name of the filesystem. + name := filepath.Base(filepath.Dir(filepath.Dir(m))) + + // File must be closed after parsing, regardless of success or + // failure. Defer is not used because of the loop. + s, err := xfs.ParseStats(f) + _ = f.Close() + if err != nil { + return nil, err + } + + s.Name = name + stats = append(stats, s) + } + + return stats, nil +} + +// BcacheStats retrieves bcache runtime statistics for each bcache. +func (fs FS) BcacheStats() ([]*bcache.Stats, error) { + matches, err := filepath.Glob(fs.Path("fs/bcache/*-*")) + if err != nil { + return nil, err + } + + stats := make([]*bcache.Stats, 0, len(matches)) + for _, uuidPath := range matches { + // "*-*" in glob above indicates the name of the bcache. + name := filepath.Base(uuidPath) + + // stats + s, err := bcache.GetStats(uuidPath) + if err != nil { + return nil, err + } + + s.Name = name + stats = append(stats, s) + } + + return stats, nil +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/sysfs/fs_test.go b/example/prometheus-mock/vendor/github.com/prometheus/procfs/sysfs/fs_test.go new file mode 100644 index 0000000..2b7402e --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/sysfs/fs_test.go @@ -0,0 +1,108 @@ +// Copyright 2017 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 sysfs + +import "testing" + +func TestNewFS(t *testing.T) { + if _, err := NewFS("foobar"); err == nil { + t.Error("want NewFS to fail for non-existing mount point") + } + + if _, err := NewFS("doc.go"); err == nil { + t.Error("want NewFS to fail if mount point is not a directory") + } +} + +func TestFSXFSStats(t *testing.T) { + stats, err := FS("fixtures").XFSStats() + if err != nil { + t.Fatalf("failed to parse XFS stats: %v", err) + } + + tests := []struct { + name string + allocated uint32 + }{ + { + name: "sda1", + allocated: 1, + }, + { + name: "sdb1", + allocated: 2, + }, + } + + const expect = 2 + + if l := len(stats); l != expect { + t.Fatalf("unexpected number of XFS stats: %d", l) + } + if l := len(tests); l != expect { + t.Fatalf("unexpected number of tests: %d", l) + } + + for i, tt := range tests { + if want, got := tt.name, stats[i].Name; want != got { + t.Errorf("unexpected stats name:\nwant: %q\nhave: %q", want, got) + } + + if want, got := tt.allocated, stats[i].ExtentAllocation.ExtentsAllocated; want != got { + t.Errorf("unexpected extents allocated:\nwant: %d\nhave: %d", want, got) + } + } +} + +func TestFSBcacheStats(t *testing.T) { + stats, err := FS("fixtures").BcacheStats() + if err != nil { + t.Fatalf("failed to parse bcache stats: %v", err) + } + + tests := []struct { + name string + bdevs int + caches int + }{ + { + name: "deaddd54-c735-46d5-868e-f331c5fd7c74", + bdevs: 1, + caches: 1, + }, + } + + const expect = 1 + + if l := len(stats); l != expect { + t.Fatalf("unexpected number of bcache stats: %d", l) + } + if l := len(tests); l != expect { + t.Fatalf("unexpected number of tests: %d", l) + } + + for i, tt := range tests { + if want, got := tt.name, stats[i].Name; want != got { + t.Errorf("unexpected stats name:\nwant: %q\nhave: %q", want, got) + } + + if want, got := tt.bdevs, len(stats[i].Bdevs); want != got { + t.Errorf("unexpected value allocated:\nwant: %d\nhave: %d", want, got) + } + + if want, got := tt.caches, len(stats[i].Caches); want != got { + t.Errorf("unexpected value allocated:\nwant: %d\nhave: %d", want, got) + } + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/ttar b/example/prometheus-mock/vendor/github.com/prometheus/procfs/ttar new file mode 100755 index 0000000..8227a4a --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/ttar @@ -0,0 +1,264 @@ +#!/usr/bin/env bash +# Purpose: plain text tar format +# Limitations: - only suitable for text files, directories, and symlinks +# - stores only filename, content, and mode +# - not designed for untrusted input + +# Note: must work with bash version 3.2 (macOS) + +set -o errexit -o nounset + +# Sanitize environment (for instance, standard sorting of glob matches) +export LC_ALL=C + +path="" +CMD="" + +function usage { + bname=$(basename "$0") + cat << USAGE +Usage: $bname [-C ] -c -f (create archive) + $bname -t -f (list archive contents) + $bname [-C ] -x -f (extract archive) + +Options: + -C (change directory) + +Example: Change to sysfs directory, create ttar file from fixtures directory + $bname -C sysfs -c -f sysfs/fixtures.ttar fixtures/ +USAGE +exit "$1" +} + +function vecho { + if [ "${VERBOSE:-}" == "yes" ]; then + echo >&7 "$@" + fi +} + +function set_cmd { + if [ -n "$CMD" ]; then + echo "ERROR: more than one command given" + echo + usage 2 + fi + CMD=$1 +} + +while getopts :cf:htxvC: opt; do + case $opt in + c) + set_cmd "create" + ;; + f) + ARCHIVE=$OPTARG + ;; + h) + usage 0 + ;; + t) + set_cmd "list" + ;; + x) + set_cmd "extract" + ;; + v) + VERBOSE=yes + exec 7>&1 + ;; + C) + CDIR=$OPTARG + ;; + *) + echo >&2 "ERROR: invalid option -$OPTARG" + echo + usage 1 + ;; + esac +done + +# Remove processed options from arguments +shift $(( OPTIND - 1 )); + +if [ "${CMD:-}" == "" ]; then + echo >&2 "ERROR: no command given" + echo + usage 1 +elif [ "${ARCHIVE:-}" == "" ]; then + echo >&2 "ERROR: no archive name given" + echo + usage 1 +fi + +function list { + local path="" + local size=0 + local line_no=0 + local ttar_file=$1 + if [ -n "${2:-}" ]; then + echo >&2 "ERROR: too many arguments." + echo + usage 1 + fi + if [ ! -e "$ttar_file" ]; then + echo >&2 "ERROR: file not found ($ttar_file)" + echo + usage 1 + fi + while read -r line; do + line_no=$(( line_no + 1 )) + if [ $size -gt 0 ]; then + size=$(( size - 1 )) + continue + fi + if [[ $line =~ ^Path:\ (.*)$ ]]; then + path=${BASH_REMATCH[1]} + elif [[ $line =~ ^Lines:\ (.*)$ ]]; then + size=${BASH_REMATCH[1]} + echo "$path" + elif [[ $line =~ ^Directory:\ (.*)$ ]]; then + path=${BASH_REMATCH[1]} + echo "$path/" + elif [[ $line =~ ^SymlinkTo:\ (.*)$ ]]; then + echo "$path -> ${BASH_REMATCH[1]}" + fi + done < "$ttar_file" +} + +function extract { + local path="" + local size=0 + local line_no=0 + local ttar_file=$1 + if [ -n "${2:-}" ]; then + echo >&2 "ERROR: too many arguments." + echo + usage 1 + fi + if [ ! -e "$ttar_file" ]; then + echo >&2 "ERROR: file not found ($ttar_file)" + echo + usage 1 + fi + while IFS= read -r line; do + line_no=$(( line_no + 1 )) + if [ "$size" -gt 0 ]; then + echo "$line" >> "$path" + size=$(( size - 1 )) + continue + fi + if [[ $line =~ ^Path:\ (.*)$ ]]; then + path=${BASH_REMATCH[1]} + if [ -e "$path" ] || [ -L "$path" ]; then + rm "$path" + fi + elif [[ $line =~ ^Lines:\ (.*)$ ]]; then + size=${BASH_REMATCH[1]} + # Create file even if it is zero-length. + touch "$path" + vecho " $path" + elif [[ $line =~ ^Mode:\ (.*)$ ]]; then + mode=${BASH_REMATCH[1]} + chmod "$mode" "$path" + vecho "$mode" + elif [[ $line =~ ^Directory:\ (.*)$ ]]; then + path=${BASH_REMATCH[1]} + mkdir -p "$path" + vecho " $path/" + elif [[ $line =~ ^SymlinkTo:\ (.*)$ ]]; then + ln -s "${BASH_REMATCH[1]}" "$path" + vecho " $path -> ${BASH_REMATCH[1]}" + elif [[ $line =~ ^# ]]; then + # Ignore comments between files + continue + else + echo >&2 "ERROR: Unknown keyword on line $line_no: $line" + exit 1 + fi + done < "$ttar_file" +} + +function div { + echo "# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" \ + "- - - - - -" +} + +function get_mode { + local mfile=$1 + if [ -z "${STAT_OPTION:-}" ]; then + if stat -c '%a' "$mfile" >/dev/null 2>&1; then + STAT_OPTION='-c' + STAT_FORMAT='%a' + else + STAT_OPTION='-f' + STAT_FORMAT='%A' + fi + fi + stat "${STAT_OPTION}" "${STAT_FORMAT}" "$mfile" +} + +function _create { + shopt -s nullglob + local mode + while (( "$#" )); do + file=$1 + if [ -L "$file" ]; then + echo "Path: $file" + symlinkTo=$(readlink "$file") + echo "SymlinkTo: $symlinkTo" + vecho " $file -> $symlinkTo" + div + elif [ -d "$file" ]; then + # Strip trailing slash (if there is one) + file=${file%/} + echo "Directory: $file" + mode=$(get_mode "$file") + echo "Mode: $mode" + vecho "$mode $file/" + div + # Find all files and dirs, including hidden/dot files + for x in "$file/"{*,.[^.]*}; do + _create "$x" + done + elif [ -f "$file" ]; then + echo "Path: $file" + lines=$(wc -l "$file"|awk '{print $1}') + echo "Lines: $lines" + cat "$file" + mode=$(get_mode "$file") + echo "Mode: $mode" + vecho "$mode $file" + div + else + echo >&2 "ERROR: file not found ($file in $(pwd))" + exit 2 + fi + shift + done +} + +function create { + ttar_file=$1 + shift + if [ -z "${1:-}" ]; then + echo >&2 "ERROR: missing arguments." + echo + usage 1 + fi + if [ -e "$ttar_file" ]; then + rm "$ttar_file" + fi + exec > "$ttar_file" + _create "$@" +} + +if [ -n "${CDIR:-}" ]; then + if [[ "$ARCHIVE" != /* ]]; then + # Relative path: preserve the archive's location before changing + # directory + ARCHIVE="$(pwd)/$ARCHIVE" + fi + cd "$CDIR" +fi + +"$CMD" "$ARCHIVE" "$@" diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/xfrm.go b/example/prometheus-mock/vendor/github.com/prometheus/procfs/xfrm.go new file mode 100644 index 0000000..ffe9df5 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/xfrm.go @@ -0,0 +1,187 @@ +// Copyright 2017 Prometheus Team +// 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" + "fmt" + "os" + "strconv" + "strings" +) + +// XfrmStat models the contents of /proc/net/xfrm_stat. +type XfrmStat struct { + // All errors which are not matched by other + XfrmInError int + // No buffer is left + XfrmInBufferError int + // Header Error + XfrmInHdrError int + // No state found + // i.e. either inbound SPI, address, or IPSEC protocol at SA is wrong + XfrmInNoStates int + // Transformation protocol specific error + // e.g. SA Key is wrong + XfrmInStateProtoError int + // Transformation mode specific error + XfrmInStateModeError int + // Sequence error + // e.g. sequence number is out of window + XfrmInStateSeqError int + // State is expired + XfrmInStateExpired int + // State has mismatch option + // e.g. UDP encapsulation type is mismatched + XfrmInStateMismatch int + // State is invalid + XfrmInStateInvalid int + // No matching template for states + // e.g. Inbound SAs are correct but SP rule is wrong + XfrmInTmplMismatch int + // No policy is found for states + // e.g. Inbound SAs are correct but no SP is found + XfrmInNoPols int + // Policy discards + XfrmInPolBlock int + // Policy error + XfrmInPolError int + // All errors which are not matched by others + XfrmOutError int + // Bundle generation error + XfrmOutBundleGenError int + // Bundle check error + XfrmOutBundleCheckError int + // No state was found + XfrmOutNoStates int + // Transformation protocol specific error + XfrmOutStateProtoError int + // Transportation mode specific error + XfrmOutStateModeError int + // Sequence error + // i.e sequence number overflow + XfrmOutStateSeqError int + // State is expired + XfrmOutStateExpired int + // Policy discads + XfrmOutPolBlock int + // Policy is dead + XfrmOutPolDead int + // Policy Error + XfrmOutPolError int + XfrmFwdHdrError int + XfrmOutStateInvalid int + XfrmAcquireError int +} + +// NewXfrmStat reads the xfrm_stat statistics. +func NewXfrmStat() (XfrmStat, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return XfrmStat{}, err + } + + return fs.NewXfrmStat() +} + +// NewXfrmStat reads the xfrm_stat statistics from the 'proc' filesystem. +func (fs FS) NewXfrmStat() (XfrmStat, error) { + file, err := os.Open(fs.Path("net/xfrm_stat")) + if err != nil { + return XfrmStat{}, err + } + defer file.Close() + + var ( + x = XfrmStat{} + s = bufio.NewScanner(file) + ) + + for s.Scan() { + fields := strings.Fields(s.Text()) + + if len(fields) != 2 { + return XfrmStat{}, fmt.Errorf( + "couldnt parse %s line %s", file.Name(), s.Text()) + } + + name := fields[0] + value, err := strconv.Atoi(fields[1]) + if err != nil { + return XfrmStat{}, err + } + + switch name { + case "XfrmInError": + x.XfrmInError = value + case "XfrmInBufferError": + x.XfrmInBufferError = value + case "XfrmInHdrError": + x.XfrmInHdrError = value + case "XfrmInNoStates": + x.XfrmInNoStates = value + case "XfrmInStateProtoError": + x.XfrmInStateProtoError = value + case "XfrmInStateModeError": + x.XfrmInStateModeError = value + case "XfrmInStateSeqError": + x.XfrmInStateSeqError = value + case "XfrmInStateExpired": + x.XfrmInStateExpired = value + case "XfrmInStateInvalid": + x.XfrmInStateInvalid = value + case "XfrmInTmplMismatch": + x.XfrmInTmplMismatch = value + case "XfrmInNoPols": + x.XfrmInNoPols = value + case "XfrmInPolBlock": + x.XfrmInPolBlock = value + case "XfrmInPolError": + x.XfrmInPolError = value + case "XfrmOutError": + x.XfrmOutError = value + case "XfrmInStateMismatch": + x.XfrmInStateMismatch = value + case "XfrmOutBundleGenError": + x.XfrmOutBundleGenError = value + case "XfrmOutBundleCheckError": + x.XfrmOutBundleCheckError = value + case "XfrmOutNoStates": + x.XfrmOutNoStates = value + case "XfrmOutStateProtoError": + x.XfrmOutStateProtoError = value + case "XfrmOutStateModeError": + x.XfrmOutStateModeError = value + case "XfrmOutStateSeqError": + x.XfrmOutStateSeqError = value + case "XfrmOutStateExpired": + x.XfrmOutStateExpired = value + case "XfrmOutPolBlock": + x.XfrmOutPolBlock = value + case "XfrmOutPolDead": + x.XfrmOutPolDead = value + case "XfrmOutPolError": + x.XfrmOutPolError = value + case "XfrmFwdHdrError": + x.XfrmFwdHdrError = value + case "XfrmOutStateInvalid": + x.XfrmOutStateInvalid = value + case "XfrmAcquireError": + x.XfrmAcquireError = value + } + + } + + return x, s.Err() +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/xfrm_test.go b/example/prometheus-mock/vendor/github.com/prometheus/procfs/xfrm_test.go new file mode 100644 index 0000000..5918c39 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/xfrm_test.go @@ -0,0 +1,66 @@ +// Copyright 2017 Prometheus Team +// 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 ( + "testing" +) + +func TestXfrmStats(t *testing.T) { + xfrmStats, err := FS("fixtures").NewXfrmStat() + if err != nil { + t.Fatal(err) + } + + for _, test := range []struct { + name string + want int + got int + }{ + {name: "XfrmInError", want: 1, got: xfrmStats.XfrmInError}, + {name: "XfrmInBufferError", want: 2, got: xfrmStats.XfrmInBufferError}, + {name: "XfrmInHdrError", want: 4, got: xfrmStats.XfrmInHdrError}, + {name: "XfrmInNoStates", want: 3, got: xfrmStats.XfrmInNoStates}, + {name: "XfrmInStateProtoError", want: 40, got: xfrmStats.XfrmInStateProtoError}, + {name: "XfrmInStateModeError", want: 100, got: xfrmStats.XfrmInStateModeError}, + {name: "XfrmInStateSeqError", want: 6000, got: xfrmStats.XfrmInStateSeqError}, + {name: "XfrmInStateExpired", want: 4, got: xfrmStats.XfrmInStateExpired}, + {name: "XfrmInStateMismatch", want: 23451, got: xfrmStats.XfrmInStateMismatch}, + {name: "XfrmInStateInvalid", want: 55555, got: xfrmStats.XfrmInStateInvalid}, + {name: "XfrmInTmplMismatch", want: 51, got: xfrmStats.XfrmInTmplMismatch}, + {name: "XfrmInNoPols", want: 65432, got: xfrmStats.XfrmInNoPols}, + {name: "XfrmInPolBlock", want: 100, got: xfrmStats.XfrmInPolBlock}, + {name: "XfrmInPolError", want: 10000, got: xfrmStats.XfrmInPolError}, + {name: "XfrmOutError", want: 1000000, got: xfrmStats.XfrmOutError}, + {name: "XfrmOutBundleGenError", want: 43321, got: xfrmStats.XfrmOutBundleGenError}, + {name: "XfrmOutBundleCheckError", want: 555, got: xfrmStats.XfrmOutBundleCheckError}, + {name: "XfrmOutNoStates", want: 869, got: xfrmStats.XfrmOutNoStates}, + {name: "XfrmOutStateProtoError", want: 4542, got: xfrmStats.XfrmOutStateProtoError}, + {name: "XfrmOutStateModeError", want: 4, got: xfrmStats.XfrmOutStateModeError}, + {name: "XfrmOutStateSeqError", want: 543, got: xfrmStats.XfrmOutStateSeqError}, + {name: "XfrmOutStateExpired", want: 565, got: xfrmStats.XfrmOutStateExpired}, + {name: "XfrmOutPolBlock", want: 43456, got: xfrmStats.XfrmOutPolBlock}, + {name: "XfrmOutPolDead", want: 7656, got: xfrmStats.XfrmOutPolDead}, + {name: "XfrmOutPolError", want: 1454, got: xfrmStats.XfrmOutPolError}, + {name: "XfrmFwdHdrError", want: 6654, got: xfrmStats.XfrmFwdHdrError}, + {name: "XfrmOutStateInvaliad", want: 28765, got: xfrmStats.XfrmOutStateInvalid}, + {name: "XfrmAcquireError", want: 24532, got: xfrmStats.XfrmAcquireError}, + {name: "XfrmInStateInvalid", want: 55555, got: xfrmStats.XfrmInStateInvalid}, + {name: "XfrmOutError", want: 1000000, got: xfrmStats.XfrmOutError}, + } { + if test.want != test.got { + t.Errorf("Want %s %d, have %d", test.name, test.want, test.got) + } + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/xfs/parse.go b/example/prometheus-mock/vendor/github.com/prometheus/procfs/xfs/parse.go new file mode 100644 index 0000000..c8f6279 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/xfs/parse.go @@ -0,0 +1,359 @@ +// Copyright 2017 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 xfs + +import ( + "bufio" + "fmt" + "io" + "strconv" + "strings" +) + +// ParseStats parses a Stats from an input io.Reader, using the format +// found in /proc/fs/xfs/stat. +func ParseStats(r io.Reader) (*Stats, error) { + const ( + // Fields parsed into stats structures. + fieldExtentAlloc = "extent_alloc" + fieldAbt = "abt" + fieldBlkMap = "blk_map" + fieldBmbt = "bmbt" + fieldDir = "dir" + fieldTrans = "trans" + fieldIg = "ig" + fieldLog = "log" + fieldRw = "rw" + fieldAttr = "attr" + fieldIcluster = "icluster" + fieldVnodes = "vnodes" + fieldBuf = "buf" + fieldXpc = "xpc" + + // Unimplemented at this time due to lack of documentation. + fieldPushAil = "push_ail" + fieldXstrat = "xstrat" + fieldAbtb2 = "abtb2" + fieldAbtc2 = "abtc2" + fieldBmbt2 = "bmbt2" + fieldIbt2 = "ibt2" + fieldFibt2 = "fibt2" + fieldQm = "qm" + fieldDebug = "debug" + ) + + var xfss Stats + + s := bufio.NewScanner(r) + for s.Scan() { + // Expect at least a string label and a single integer value, ex: + // - abt 0 + // - rw 1 2 + ss := strings.Fields(string(s.Bytes())) + if len(ss) < 2 { + continue + } + label := ss[0] + + // Extended precision counters are uint64 values. + if label == fieldXpc { + us, err := parseUint64s(ss[1:]) + if err != nil { + return nil, err + } + + xfss.ExtendedPrecision, err = extendedPrecisionStats(us) + if err != nil { + return nil, err + } + + continue + } + + // All other counters are uint32 values. + us, err := parseUint32s(ss[1:]) + if err != nil { + return nil, err + } + + switch label { + case fieldExtentAlloc: + xfss.ExtentAllocation, err = extentAllocationStats(us) + case fieldAbt: + xfss.AllocationBTree, err = btreeStats(us) + case fieldBlkMap: + xfss.BlockMapping, err = blockMappingStats(us) + case fieldBmbt: + xfss.BlockMapBTree, err = btreeStats(us) + case fieldDir: + xfss.DirectoryOperation, err = directoryOperationStats(us) + case fieldTrans: + xfss.Transaction, err = transactionStats(us) + case fieldIg: + xfss.InodeOperation, err = inodeOperationStats(us) + case fieldLog: + xfss.LogOperation, err = logOperationStats(us) + case fieldRw: + xfss.ReadWrite, err = readWriteStats(us) + case fieldAttr: + xfss.AttributeOperation, err = attributeOperationStats(us) + case fieldIcluster: + xfss.InodeClustering, err = inodeClusteringStats(us) + case fieldVnodes: + xfss.Vnode, err = vnodeStats(us) + case fieldBuf: + xfss.Buffer, err = bufferStats(us) + } + if err != nil { + return nil, err + } + } + + return &xfss, s.Err() +} + +// extentAllocationStats builds an ExtentAllocationStats from a slice of uint32s. +func extentAllocationStats(us []uint32) (ExtentAllocationStats, error) { + if l := len(us); l != 4 { + return ExtentAllocationStats{}, fmt.Errorf("incorrect number of values for XFS extent allocation stats: %d", l) + } + + return ExtentAllocationStats{ + ExtentsAllocated: us[0], + BlocksAllocated: us[1], + ExtentsFreed: us[2], + BlocksFreed: us[3], + }, nil +} + +// btreeStats builds a BTreeStats from a slice of uint32s. +func btreeStats(us []uint32) (BTreeStats, error) { + if l := len(us); l != 4 { + return BTreeStats{}, fmt.Errorf("incorrect number of values for XFS btree stats: %d", l) + } + + return BTreeStats{ + Lookups: us[0], + Compares: us[1], + RecordsInserted: us[2], + RecordsDeleted: us[3], + }, nil +} + +// BlockMappingStat builds a BlockMappingStats from a slice of uint32s. +func blockMappingStats(us []uint32) (BlockMappingStats, error) { + if l := len(us); l != 7 { + return BlockMappingStats{}, fmt.Errorf("incorrect number of values for XFS block mapping stats: %d", l) + } + + return BlockMappingStats{ + Reads: us[0], + Writes: us[1], + Unmaps: us[2], + ExtentListInsertions: us[3], + ExtentListDeletions: us[4], + ExtentListLookups: us[5], + ExtentListCompares: us[6], + }, nil +} + +// DirectoryOperationStats builds a DirectoryOperationStats from a slice of uint32s. +func directoryOperationStats(us []uint32) (DirectoryOperationStats, error) { + if l := len(us); l != 4 { + return DirectoryOperationStats{}, fmt.Errorf("incorrect number of values for XFS directory operation stats: %d", l) + } + + return DirectoryOperationStats{ + Lookups: us[0], + Creates: us[1], + Removes: us[2], + Getdents: us[3], + }, nil +} + +// TransactionStats builds a TransactionStats from a slice of uint32s. +func transactionStats(us []uint32) (TransactionStats, error) { + if l := len(us); l != 3 { + return TransactionStats{}, fmt.Errorf("incorrect number of values for XFS transaction stats: %d", l) + } + + return TransactionStats{ + Sync: us[0], + Async: us[1], + Empty: us[2], + }, nil +} + +// InodeOperationStats builds an InodeOperationStats from a slice of uint32s. +func inodeOperationStats(us []uint32) (InodeOperationStats, error) { + if l := len(us); l != 7 { + return InodeOperationStats{}, fmt.Errorf("incorrect number of values for XFS inode operation stats: %d", l) + } + + return InodeOperationStats{ + Attempts: us[0], + Found: us[1], + Recycle: us[2], + Missed: us[3], + Duplicate: us[4], + Reclaims: us[5], + AttributeChange: us[6], + }, nil +} + +// LogOperationStats builds a LogOperationStats from a slice of uint32s. +func logOperationStats(us []uint32) (LogOperationStats, error) { + if l := len(us); l != 5 { + return LogOperationStats{}, fmt.Errorf("incorrect number of values for XFS log operation stats: %d", l) + } + + return LogOperationStats{ + Writes: us[0], + Blocks: us[1], + NoInternalBuffers: us[2], + Force: us[3], + ForceSleep: us[4], + }, nil +} + +// ReadWriteStats builds a ReadWriteStats from a slice of uint32s. +func readWriteStats(us []uint32) (ReadWriteStats, error) { + if l := len(us); l != 2 { + return ReadWriteStats{}, fmt.Errorf("incorrect number of values for XFS read write stats: %d", l) + } + + return ReadWriteStats{ + Read: us[0], + Write: us[1], + }, nil +} + +// AttributeOperationStats builds an AttributeOperationStats from a slice of uint32s. +func attributeOperationStats(us []uint32) (AttributeOperationStats, error) { + if l := len(us); l != 4 { + return AttributeOperationStats{}, fmt.Errorf("incorrect number of values for XFS attribute operation stats: %d", l) + } + + return AttributeOperationStats{ + Get: us[0], + Set: us[1], + Remove: us[2], + List: us[3], + }, nil +} + +// InodeClusteringStats builds an InodeClusteringStats from a slice of uint32s. +func inodeClusteringStats(us []uint32) (InodeClusteringStats, error) { + if l := len(us); l != 3 { + return InodeClusteringStats{}, fmt.Errorf("incorrect number of values for XFS inode clustering stats: %d", l) + } + + return InodeClusteringStats{ + Iflush: us[0], + Flush: us[1], + FlushInode: us[2], + }, nil +} + +// VnodeStats builds a VnodeStats from a slice of uint32s. +func vnodeStats(us []uint32) (VnodeStats, error) { + // The attribute "Free" appears to not be available on older XFS + // stats versions. Therefore, 7 or 8 elements may appear in + // this slice. + l := len(us) + if l != 7 && l != 8 { + return VnodeStats{}, fmt.Errorf("incorrect number of values for XFS vnode stats: %d", l) + } + + s := VnodeStats{ + Active: us[0], + Allocate: us[1], + Get: us[2], + Hold: us[3], + Release: us[4], + Reclaim: us[5], + Remove: us[6], + } + + // Skip adding free, unless it is present. The zero value will + // be used in place of an actual count. + if l == 7 { + return s, nil + } + + s.Free = us[7] + return s, nil +} + +// BufferStats builds a BufferStats from a slice of uint32s. +func bufferStats(us []uint32) (BufferStats, error) { + if l := len(us); l != 9 { + return BufferStats{}, fmt.Errorf("incorrect number of values for XFS buffer stats: %d", l) + } + + return BufferStats{ + Get: us[0], + Create: us[1], + GetLocked: us[2], + GetLockedWaited: us[3], + BusyLocked: us[4], + MissLocked: us[5], + PageRetries: us[6], + PageFound: us[7], + GetRead: us[8], + }, nil +} + +// ExtendedPrecisionStats builds an ExtendedPrecisionStats from a slice of uint32s. +func extendedPrecisionStats(us []uint64) (ExtendedPrecisionStats, error) { + if l := len(us); l != 3 { + return ExtendedPrecisionStats{}, fmt.Errorf("incorrect number of values for XFS extended precision stats: %d", l) + } + + return ExtendedPrecisionStats{ + FlushBytes: us[0], + WriteBytes: us[1], + ReadBytes: us[2], + }, nil +} + +// parseUint32s parses a slice of strings into a slice of uint32s. +func parseUint32s(ss []string) ([]uint32, error) { + us := make([]uint32, 0, len(ss)) + for _, s := range ss { + u, err := strconv.ParseUint(s, 10, 32) + if err != nil { + return nil, err + } + + us = append(us, uint32(u)) + } + + return us, nil +} + +// parseUint64s parses a slice of strings into a slice of uint64s. +func parseUint64s(ss []string) ([]uint64, error) { + us := make([]uint64, 0, len(ss)) + for _, s := range ss { + u, err := strconv.ParseUint(s, 10, 64) + if err != nil { + return nil, err + } + + us = append(us, u) + } + + return us, nil +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/xfs/parse_test.go b/example/prometheus-mock/vendor/github.com/prometheus/procfs/xfs/parse_test.go new file mode 100644 index 0000000..2e946c2 --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/xfs/parse_test.go @@ -0,0 +1,442 @@ +// Copyright 2017 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 xfs_test + +import ( + "reflect" + "strings" + "testing" + + "github.com/prometheus/procfs" + "github.com/prometheus/procfs/xfs" +) + +func TestParseStats(t *testing.T) { + tests := []struct { + name string + s string + fs bool + stats *xfs.Stats + invalid bool + }{ + { + name: "empty file OK", + }, + { + name: "short or empty lines and unknown labels ignored", + s: "one\n\ntwo 1 2 3\n", + stats: &xfs.Stats{}, + }, + { + name: "bad uint32", + s: "extent_alloc XXX", + invalid: true, + }, + { + name: "bad uint64", + s: "xpc XXX", + invalid: true, + }, + { + name: "extent_alloc bad", + s: "extent_alloc 1", + invalid: true, + }, + { + name: "extent_alloc OK", + s: "extent_alloc 1 2 3 4", + stats: &xfs.Stats{ + ExtentAllocation: xfs.ExtentAllocationStats{ + ExtentsAllocated: 1, + BlocksAllocated: 2, + ExtentsFreed: 3, + BlocksFreed: 4, + }, + }, + }, + { + name: "abt bad", + s: "abt 1", + invalid: true, + }, + { + name: "abt OK", + s: "abt 1 2 3 4", + stats: &xfs.Stats{ + AllocationBTree: xfs.BTreeStats{ + Lookups: 1, + Compares: 2, + RecordsInserted: 3, + RecordsDeleted: 4, + }, + }, + }, + { + name: "blk_map bad", + s: "blk_map 1", + invalid: true, + }, + { + name: "blk_map OK", + s: "blk_map 1 2 3 4 5 6 7", + stats: &xfs.Stats{ + BlockMapping: xfs.BlockMappingStats{ + Reads: 1, + Writes: 2, + Unmaps: 3, + ExtentListInsertions: 4, + ExtentListDeletions: 5, + ExtentListLookups: 6, + ExtentListCompares: 7, + }, + }, + }, + { + name: "bmbt bad", + s: "bmbt 1", + invalid: true, + }, + { + name: "bmbt OK", + s: "bmbt 1 2 3 4", + stats: &xfs.Stats{ + BlockMapBTree: xfs.BTreeStats{ + Lookups: 1, + Compares: 2, + RecordsInserted: 3, + RecordsDeleted: 4, + }, + }, + }, + { + name: "dir bad", + s: "dir 1", + invalid: true, + }, + { + name: "dir OK", + s: "dir 1 2 3 4", + stats: &xfs.Stats{ + DirectoryOperation: xfs.DirectoryOperationStats{ + Lookups: 1, + Creates: 2, + Removes: 3, + Getdents: 4, + }, + }, + }, + { + name: "trans bad", + s: "trans 1", + invalid: true, + }, + { + name: "trans OK", + s: "trans 1 2 3", + stats: &xfs.Stats{ + Transaction: xfs.TransactionStats{ + Sync: 1, + Async: 2, + Empty: 3, + }, + }, + }, + { + name: "ig bad", + s: "ig 1", + invalid: true, + }, + { + name: "ig OK", + s: "ig 1 2 3 4 5 6 7", + stats: &xfs.Stats{ + InodeOperation: xfs.InodeOperationStats{ + Attempts: 1, + Found: 2, + Recycle: 3, + Missed: 4, + Duplicate: 5, + Reclaims: 6, + AttributeChange: 7, + }, + }, + }, + { + name: "log bad", + s: "log 1", + invalid: true, + }, + { + name: "log OK", + s: "log 1 2 3 4 5", + stats: &xfs.Stats{ + LogOperation: xfs.LogOperationStats{ + Writes: 1, + Blocks: 2, + NoInternalBuffers: 3, + Force: 4, + ForceSleep: 5, + }, + }, + }, + { + name: "rw bad", + s: "rw 1", + invalid: true, + }, + { + name: "rw OK", + s: "rw 1 2", + stats: &xfs.Stats{ + ReadWrite: xfs.ReadWriteStats{ + Read: 1, + Write: 2, + }, + }, + }, + { + name: "attr bad", + s: "attr 1", + invalid: true, + }, + { + name: "attr OK", + s: "attr 1 2 3 4", + stats: &xfs.Stats{ + AttributeOperation: xfs.AttributeOperationStats{ + Get: 1, + Set: 2, + Remove: 3, + List: 4, + }, + }, + }, + { + name: "icluster bad", + s: "icluster 1", + invalid: true, + }, + { + name: "icluster OK", + s: "icluster 1 2 3", + stats: &xfs.Stats{ + InodeClustering: xfs.InodeClusteringStats{ + Iflush: 1, + Flush: 2, + FlushInode: 3, + }, + }, + }, + { + name: "vnodes bad", + s: "vnodes 1", + invalid: true, + }, + { + name: "vnodes (missing free) OK", + s: "vnodes 1 2 3 4 5 6 7", + stats: &xfs.Stats{ + Vnode: xfs.VnodeStats{ + Active: 1, + Allocate: 2, + Get: 3, + Hold: 4, + Release: 5, + Reclaim: 6, + Remove: 7, + }, + }, + }, + { + name: "vnodes (with free) OK", + s: "vnodes 1 2 3 4 5 6 7 8", + stats: &xfs.Stats{ + Vnode: xfs.VnodeStats{ + Active: 1, + Allocate: 2, + Get: 3, + Hold: 4, + Release: 5, + Reclaim: 6, + Remove: 7, + Free: 8, + }, + }, + }, + { + name: "buf bad", + s: "buf 1", + invalid: true, + }, + { + name: "buf OK", + s: "buf 1 2 3 4 5 6 7 8 9", + stats: &xfs.Stats{ + Buffer: xfs.BufferStats{ + Get: 1, + Create: 2, + GetLocked: 3, + GetLockedWaited: 4, + BusyLocked: 5, + MissLocked: 6, + PageRetries: 7, + PageFound: 8, + GetRead: 9, + }, + }, + }, + { + name: "xpc bad", + s: "xpc 1", + invalid: true, + }, + { + name: "xpc OK", + s: "xpc 1 2 3", + stats: &xfs.Stats{ + ExtendedPrecision: xfs.ExtendedPrecisionStats{ + FlushBytes: 1, + WriteBytes: 2, + ReadBytes: 3, + }, + }, + }, + { + name: "fixtures OK", + fs: true, + stats: &xfs.Stats{ + ExtentAllocation: xfs.ExtentAllocationStats{ + ExtentsAllocated: 92447, + BlocksAllocated: 97589, + ExtentsFreed: 92448, + BlocksFreed: 93751, + }, + AllocationBTree: xfs.BTreeStats{ + Lookups: 0, + Compares: 0, + RecordsInserted: 0, + RecordsDeleted: 0, + }, + BlockMapping: xfs.BlockMappingStats{ + Reads: 1767055, + Writes: 188820, + Unmaps: 184891, + ExtentListInsertions: 92447, + ExtentListDeletions: 92448, + ExtentListLookups: 2140766, + ExtentListCompares: 0, + }, + BlockMapBTree: xfs.BTreeStats{ + Lookups: 0, + Compares: 0, + RecordsInserted: 0, + RecordsDeleted: 0, + }, + DirectoryOperation: xfs.DirectoryOperationStats{ + Lookups: 185039, + Creates: 92447, + Removes: 92444, + Getdents: 136422, + }, + Transaction: xfs.TransactionStats{ + Sync: 706, + Async: 944304, + Empty: 0, + }, + InodeOperation: xfs.InodeOperationStats{ + Attempts: 185045, + Found: 58807, + Recycle: 0, + Missed: 126238, + Duplicate: 0, + Reclaims: 33637, + AttributeChange: 22, + }, + LogOperation: xfs.LogOperationStats{ + Writes: 2883, + Blocks: 113448, + NoInternalBuffers: 9, + Force: 17360, + ForceSleep: 739, + }, + ReadWrite: xfs.ReadWriteStats{ + Read: 107739, + Write: 94045, + }, + AttributeOperation: xfs.AttributeOperationStats{ + Get: 4, + Set: 0, + Remove: 0, + List: 0, + }, + InodeClustering: xfs.InodeClusteringStats{ + Iflush: 8677, + Flush: 7849, + FlushInode: 135802, + }, + Vnode: xfs.VnodeStats{ + Active: 92601, + Allocate: 0, + Get: 0, + Hold: 0, + Release: 92444, + Reclaim: 92444, + Remove: 92444, + Free: 0, + }, + Buffer: xfs.BufferStats{ + Get: 2666287, + Create: 7122, + GetLocked: 2659202, + GetLockedWaited: 3599, + BusyLocked: 2, + MissLocked: 7085, + PageRetries: 0, + PageFound: 10297, + GetRead: 7085, + }, + ExtendedPrecision: xfs.ExtendedPrecisionStats{ + FlushBytes: 399724544, + WriteBytes: 92823103, + ReadBytes: 86219234, + }, + }, + }, + } + + for _, tt := range tests { + var ( + stats *xfs.Stats + err error + ) + + if tt.s != "" { + stats, err = xfs.ParseStats(strings.NewReader(tt.s)) + } + if tt.fs { + stats, err = procfs.FS("../fixtures").XFSStats() + } + + if tt.invalid && err == nil { + t.Error("expected an error, but none occurred") + } + if !tt.invalid && err != nil { + t.Errorf("unexpected error: %v", err) + } + + if want, have := tt.stats, stats; !reflect.DeepEqual(want, have) { + t.Errorf("unexpected XFS stats:\nwant:\n%v\nhave:\n%v", want, have) + } + } +} diff --git a/example/prometheus-mock/vendor/github.com/prometheus/procfs/xfs/xfs.go b/example/prometheus-mock/vendor/github.com/prometheus/procfs/xfs/xfs.go new file mode 100644 index 0000000..d86794b --- /dev/null +++ b/example/prometheus-mock/vendor/github.com/prometheus/procfs/xfs/xfs.go @@ -0,0 +1,163 @@ +// Copyright 2017 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 xfs provides access to statistics exposed by the XFS filesystem. +package xfs + +// Stats contains XFS filesystem runtime statistics, parsed from +// /proc/fs/xfs/stat. +// +// The names and meanings of each statistic were taken from +// http://xfs.org/index.php/Runtime_Stats and xfs_stats.h in the Linux +// kernel source. Most counters are uint32s (same data types used in +// xfs_stats.h), but some of the "extended precision stats" are uint64s. +type Stats struct { + // The name of the filesystem used to source these statistics. + // If empty, this indicates aggregated statistics for all XFS + // filesystems on the host. + Name string + + ExtentAllocation ExtentAllocationStats + AllocationBTree BTreeStats + BlockMapping BlockMappingStats + BlockMapBTree BTreeStats + DirectoryOperation DirectoryOperationStats + Transaction TransactionStats + InodeOperation InodeOperationStats + LogOperation LogOperationStats + ReadWrite ReadWriteStats + AttributeOperation AttributeOperationStats + InodeClustering InodeClusteringStats + Vnode VnodeStats + Buffer BufferStats + ExtendedPrecision ExtendedPrecisionStats +} + +// ExtentAllocationStats contains statistics regarding XFS extent allocations. +type ExtentAllocationStats struct { + ExtentsAllocated uint32 + BlocksAllocated uint32 + ExtentsFreed uint32 + BlocksFreed uint32 +} + +// BTreeStats contains statistics regarding an XFS internal B-tree. +type BTreeStats struct { + Lookups uint32 + Compares uint32 + RecordsInserted uint32 + RecordsDeleted uint32 +} + +// BlockMappingStats contains statistics regarding XFS block maps. +type BlockMappingStats struct { + Reads uint32 + Writes uint32 + Unmaps uint32 + ExtentListInsertions uint32 + ExtentListDeletions uint32 + ExtentListLookups uint32 + ExtentListCompares uint32 +} + +// DirectoryOperationStats contains statistics regarding XFS directory entries. +type DirectoryOperationStats struct { + Lookups uint32 + Creates uint32 + Removes uint32 + Getdents uint32 +} + +// TransactionStats contains statistics regarding XFS metadata transactions. +type TransactionStats struct { + Sync uint32 + Async uint32 + Empty uint32 +} + +// InodeOperationStats contains statistics regarding XFS inode operations. +type InodeOperationStats struct { + Attempts uint32 + Found uint32 + Recycle uint32 + Missed uint32 + Duplicate uint32 + Reclaims uint32 + AttributeChange uint32 +} + +// LogOperationStats contains statistics regarding the XFS log buffer. +type LogOperationStats struct { + Writes uint32 + Blocks uint32 + NoInternalBuffers uint32 + Force uint32 + ForceSleep uint32 +} + +// ReadWriteStats contains statistics regarding the number of read and write +// system calls for XFS filesystems. +type ReadWriteStats struct { + Read uint32 + Write uint32 +} + +// AttributeOperationStats contains statistics regarding manipulation of +// XFS extended file attributes. +type AttributeOperationStats struct { + Get uint32 + Set uint32 + Remove uint32 + List uint32 +} + +// InodeClusteringStats contains statistics regarding XFS inode clustering +// operations. +type InodeClusteringStats struct { + Iflush uint32 + Flush uint32 + FlushInode uint32 +} + +// VnodeStats contains statistics regarding XFS vnode operations. +type VnodeStats struct { + Active uint32 + Allocate uint32 + Get uint32 + Hold uint32 + Release uint32 + Reclaim uint32 + Remove uint32 + Free uint32 +} + +// BufferStats contains statistics regarding XFS read/write I/O buffers. +type BufferStats struct { + Get uint32 + Create uint32 + GetLocked uint32 + GetLockedWaited uint32 + BusyLocked uint32 + MissLocked uint32 + PageRetries uint32 + PageFound uint32 + GetRead uint32 +} + +// ExtendedPrecisionStats contains high precision counters used to track the +// total number of bytes read, written, or flushed, during XFS operations. +type ExtendedPrecisionStats struct { + FlushBytes uint64 + WriteBytes uint64 + ReadBytes uint64 +} diff --git a/example/prometheus.yml b/example/prometheus.yml new file mode 100644 index 0000000..d05431b --- /dev/null +++ b/example/prometheus.yml @@ -0,0 +1,8 @@ +global: + scrape_interval: 10s + evaluation_interval: 10s + +scrape_configs: + - job_name: 'target' + static_configs: + - targets: ['target:30001'] \ No newline at end of file diff --git a/example/vistio.yaml b/example/vistio.yaml new file mode 100644 index 0000000..39b5b54 --- /dev/null +++ b/example/vistio.yaml @@ -0,0 +1,96 @@ +# Example Vistio configuration using the mocked data in prometheus-mock/ +graphName: Istio +globalLevel: + maxVolume: 2000000 + clusterConnections: + - query: rate(istio_request_count{destination_service="istio-ingressgateway"}[1m]) + prometheusURL: http://prometheus:9090 + source: + replacement: INTERNET + target: + label: cluster + status: + label: response_code + warningRegex: ^4..$ + dangerRegex: ^5..$ +clusterLevel: + - cluster: us-east-1 + maxVolume: 3000 + serviceConnections: + - query: rate(istio_request_count{cluster="us-east-1"}[1m]) + prometheusURL: http://prometheus:9090 + source: + label: source_service + target: + label: destination_service + status: + label: response_code + warningRegex: ^4..$ + dangerRegex: ^5..$ + notices: + - name: HighErrorRate + title: "[{{ .value }}] HighErrorRate" + statusType: danger + severityThreshold: + warning: .01 + error: .02 + - cluster: us-west-2 + maxVolume: 20000 + serviceConnections: + - query: rate(istio_request_count{cluster="us-west-2"}[1m]) + prometheusURL: http://prometheus:9090 + source: + label: source_service + target: + label: destination_service + status: + label: response_code + warningRegex: ^4..$ + dangerRegex: ^5..$ + notices: + - name: HighErrorRate + title: "[{{ .value }}] HighErrorRate" + statusType: danger + severityThreshold: + warning: .01 + error: .02 + - cluster: ap-southeast-1 + maxVolume: 20000 + serviceConnections: + - query: rate(istio_request_count{cluster="ap-southeast-1"}[1m]) + prometheusURL: http://prometheus:9090 + source: + label: source_service + target: + label: destination_service + status: + label: response_code + warningRegex: ^4..$ + dangerRegex: ^5..$ + notices: + - name: HighErrorRate + title: "[{{ .value }}] HighErrorRate" + statusType: danger + severityThreshold: + warning: .01 + error: .02 + - cluster: eu-west-1 + maxVolume: 20000 + serviceConnections: + - query: rate(istio_request_count{cluster="eu-west-1"}[1m]) + prometheusURL: http://prometheus:9090 + source: + label: source_service + target: + label: destination_service + status: + label: response_code + warningRegex: ^4..$ + dangerRegex: ^5..$ + notices: + - name: HighErrorRate + title: "[{{ .value }}] HighErrorRate" + statusType: danger + severityThreshold: + warning: .01 + error: .02 \ No newline at end of file diff --git a/helm/vistio/.helmignore b/helm/vistio/.helmignore new file mode 100644 index 0000000..f0c1319 --- /dev/null +++ b/helm/vistio/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/helm/vistio/Chart.yaml b/helm/vistio/Chart.yaml new file mode 100644 index 0000000..4488891 --- /dev/null +++ b/helm/vistio/Chart.yaml @@ -0,0 +1,4 @@ +apiVersion: v1 +description: A Helm chart for Kubernetes +name: vistio +version: 0.1.0 diff --git a/helm/vistio/templates/NOTES.txt b/helm/vistio/templates/NOTES.txt new file mode 100644 index 0000000..888f9aa --- /dev/null +++ b/helm/vistio/templates/NOTES.txt @@ -0,0 +1,3 @@ +1. Get the list of pods by running the following command: + +kubectl -n {{ .Release.Namespace }} get pods -l "app={{ template "name" . }},release={{ .Release.Name }}" -o wide \ No newline at end of file diff --git a/helm/vistio/templates/_helpers.tpl b/helm/vistio/templates/_helpers.tpl new file mode 100644 index 0000000..3038630 --- /dev/null +++ b/helm/vistio/templates/_helpers.tpl @@ -0,0 +1,20 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +*/}} +{{- define "fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} \ No newline at end of file diff --git a/helm/vistio/templates/configmap.yaml b/helm/vistio/templates/configmap.yaml new file mode 100644 index 0000000..984aec0 --- /dev/null +++ b/helm/vistio/templates/configmap.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: vistio-api-config + labels: + heritage: {{ .Release.Service }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + app: {{ template "name" . }} + release: {{ .Release.Name }} +data: + vistio.yaml: |- +{{ toYaml .Values.vistioConfig | indent 4 }} \ No newline at end of file diff --git a/helm/vistio/templates/deployment.yaml b/helm/vistio/templates/deployment.yaml new file mode 100644 index 0000000..f1380dd --- /dev/null +++ b/helm/vistio/templates/deployment.yaml @@ -0,0 +1,32 @@ +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: vistio-web + labels: + heritage: {{ .Release.Service }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + app: vistio-web + release: {{ .Release.Name }} +spec: + replicas: {{ .Values.web.replicaCount }} + template: + metadata: + labels: + app: vistio-web + release: {{ .Release.Name }} + spec: + containers: + - name: {{ .Chart.Name }} + image: "{{ .Values.web.image.repository }}:{{ .Values.web.image.tag }}" + imagePullPolicy: {{ .Values.web.image.pullPolicy }} + ports: + - containerPort: {{ .Values.web.service.internalPort }} + env: + - name: UPDATE_URL + value: {{ .Values.web.env.updateURL }} + - name: INTERVAL + value: {{ .Values.web.env.interval | quote }} + - name: MAX_REPLAY_OFFSET + value: {{ .Values.web.env.maxReplayOffset | quote }} + resources: +{{ toYaml .Values.web.resources | indent 12 }} diff --git a/helm/vistio/templates/service.yaml b/helm/vistio/templates/service.yaml new file mode 100644 index 0000000..e01b723 --- /dev/null +++ b/helm/vistio/templates/service.yaml @@ -0,0 +1,39 @@ +apiVersion: v1 +kind: Service +metadata: + name: vistio-api + labels: + heritage: {{ .Release.Service }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + app: vistio-api + release: {{ .Release.Name }} +spec: + type: ClusterIP + selector: + app: vistio-api + release: {{ .Release.Name }} + ports: + - name: http + port: {{ .Values.api.service.externalPort }} + targetPort: {{ .Values.api.service.internalPort }} + protocol: TCP +--- +apiVersion: v1 +kind: Service +metadata: + name: vistio-web + labels: + heritage: {{ .Release.Service }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + app: vitsio-web + release: {{ .Release.Name }} +spec: + type: ClusterIP + selector: + app: vistio-web + release: {{ .Release.Name }} + ports: + - name: http + port: {{ .Values.web.service.externalPort }} + targetPort: {{ .Values.web.service.internalPort }} + protocol: TCP diff --git a/helm/vistio/templates/statefulset.yaml b/helm/vistio/templates/statefulset.yaml new file mode 100644 index 0000000..2ee2279 --- /dev/null +++ b/helm/vistio/templates/statefulset.yaml @@ -0,0 +1,80 @@ +apiVersion: apps/v1beta1 +kind: StatefulSet +metadata: + name: vistio-api + labels: + heritage: {{ .Release.Service }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + app: vistio-api + release: {{ .Release.Name }} +spec: + replicas: {{ .Values.api.replicaCount }} + serviceName: vistio + template: + metadata: + labels: + app: vistio-api + release: {{ .Release.Name }} + spec: + containers: + - name: vistio-api + image: {{ .Values.api.image.repository }}:{{ .Values.api.image.tag }} + imagePullPolicy: {{ .Values.api.image.pullPolicy }} + args: + - --config.file=/etc/vistio/vistio.yaml + - --log.level={{ .Values.api.log.level }} + - --storage.path=/var/vistio/data + - --storage.retention={{ .Values.api.storage.retention }} + - --cache.size={{ .Values.api.cache.size }} + - --retrieval.scrape-interval={{ .Values.api.retrieval.scrapeInterval }} + - --retrieval.scrape-timeout={{ .Values.api.retrieval.scrapeTimeout }} + - --api.port={{ .Values.api.service.internalPort }} + ports: + - containerPort: {{ .Values.api.service.internalPort }} + livenessProbe: + httpGet: + path: / + port: {{ .Values.api.service.internalPort }} + initialDelaySeconds: 30 + timeoutSeconds: 30 + readinessProbe: + httpGet: + path: / + port: {{ .Values.api.service.internalPort }} + initialDelaySeconds: 30 + timeoutSeconds: 30 + resources: +{{ toYaml .Values.api.resources | indent 12 }} + volumeMounts: + - name: config + mountPath: /etc/vistio + - name: vistio-db + mountPath: /var/vistio/data + subPath: vistio-db + - name: reloader + image: {{ .Values.reloader.image.repository }}:{{ .Values.reloader.image.tag }} + imagePullPolicy: {{ .Values.reloader.image.pullPolicy }} + args: + - --config.promviz-reload-url=http://localhost:{{ .Values.api.service.internalPort }}/reload + - --config.promviz-config-dir=/etc/vistio + - --config.log-level=info + resources: +{{ toYaml .Values.reloader.resources | indent 12 }} + volumeMounts: + - name: config + mountPath: /etc/vistio + volumes: + - name: config + configMap: + name: vistio-api-config + volumeClaimTemplates: + - metadata: + annotations: + volume.beta.kubernetes.io/storage-class: {{ .Values.api.storage.class }} + name: vistio-db + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: {{ .Values.api.storage.size }} \ No newline at end of file diff --git a/helm/vistio/values-mesh-only.yaml b/helm/vistio/values-mesh-only.yaml new file mode 100644 index 0000000..d90e401 --- /dev/null +++ b/helm/vistio/values-mesh-only.yaml @@ -0,0 +1,49 @@ +###################################### +## Vistio-api config +## Global level - displays total requests per second of the mesh +## Cluster level - displays traffic within the istio mesh +## +## * This configuration works well with istio bookinfo demo +###################################### +vistioConfig: + graphName: Vistio + globalLevel: + maxVolume: 100 + clusterConnections: + # Total requests per second of the mesh + - query: sum(rate(istio_request_count[1m])) by (response_code) + prometheusURL: {{ .Values.api.prometheusUrl }} + source: + replacement: "Total Mesh Requests" + target: + replacement: istio-mesh + status: + label: response_code + # color coding of requests + warningRegex: ^4..$ + dangerRegex: ^5..$ + clusterLevel: + # Cluster name must match 'target' name in global + - cluster: istio-mesh + maxVolume: 100 + serviceConnections: + - query: sum(rate(istio_request_count[1m])) by (source_service,destination_service,response_code) + prometheusURL: {{ .Values.api.prometheusUrl }} + source: + label: source_service + target: + label: destination_service + status: + label: response_code + # color coding of requests + warningRegex: ^4..$ + dangerRegex: ^5..$ + notices: + - name: HighErrorRate + title: "[{{ .value }}] High Error Rate" + statusType: danger + severityThreshold: + # Warning alert at 1% + warning: .01 + # Error alert at 5% + error: .05 \ No newline at end of file diff --git a/helm/vistio/values-with-ingress.yaml b/helm/vistio/values-with-ingress.yaml new file mode 100644 index 0000000..103e0f1 --- /dev/null +++ b/helm/vistio/values-with-ingress.yaml @@ -0,0 +1,47 @@ +###################################### +## Vistio-api config +## Global level - displays traffic from the internet to the istio ingress gateway +## Cluster level - displays traffic within the istio mesh +###################################### +vistioConfig: + graphName: Vistio + globalLevel: + maxVolume: 2000000 + clusterConnections: + # Total requests per second coming into the ingress controller from internet + - query: sun(rate(istio_request_count{destination_service="istio-ingressgateway.istio-system.svc.cluster.local"}[1m])) by (response_code) + prometheusURL: {{ .Values.api.prometheusUrl }} + source: + replacement: INTERNET + target: + replacement: istio-mesh + status: + label: response_code + # color coding of requests + warningRegex: ^4..$ + dangerRegex: ^5..$ + clusterLevel: + # Cluster name must match 'target' name in global + - cluster: istio-mesh + maxVolume: 3000 + serviceConnections: + - query: sum(rate(istio_request_count[1m])) by (source_service,destination_service,response_code) + prometheusURL: {{ .Values.api.prometheusUrl }} + source: + label: source_service + target: + label: destination_service + status: + label: response_code + # color coding of requests + warningRegex: ^4..$ + dangerRegex: ^5..$ + notices: + - name: HighErrorRate + title: "[{{ .value }}] High Error Rate" + statusType: danger + severityThreshold: + # Warning alert at 1% + warning: .01 + # Error alert at 5% + error: .05 \ No newline at end of file diff --git a/helm/vistio/values.yaml b/helm/vistio/values.yaml new file mode 100644 index 0000000..76a9b32 --- /dev/null +++ b/helm/vistio/values.yaml @@ -0,0 +1,77 @@ +###################################### +## Vistio-api +###################################### +api: + prometheusUrl: http://prometheus-server.monitoring + image: + repository: nmnellis/vistio-api + tag: latest + pullPolicy: IfNotPresent + log: + level: info + cache: + size: 100 + retrieval: + scrapeInterval: 10s + scrapeTimeout: 8s + resources: {} + # limits: + # cpu: 200m + # memory: 256Mi + # requests: + # cpu: 100m + # memory: 128Mi + + replicaCount: 1 + + service: + externalPort: 9091 + internalPort: 9091 + storage: + class: standard + size: 5Gi + # how long to hold onto vistio data + retention: 24h +## Configurations for reloader container in vistio-api +reloader: + image: + repository: nghialv2607/k8s-config-reloader + tag: v0.1.0 + pullPolicy: IfNotPresent + resources: + limits: + cpu: 50m + memory: 64Mi + requests: + cpu: 20m + memory: 32Mi +###################################### +## Vistio-web +###################################### +web: + service: + externalPort: 80 + internalPort: 8080 + + replicaCount: 1 + + env: + # Vistio-api url (use localhost for kubectl port-forward) + updateURL: "http://localhost:9091/graph" + interval: "1000" + maxReplayOffset: "43200" + + image: + repository: nmnellis/vistio-web + tag: latest + pullPolicy: Always + + resources: {} + # limits: + # cpu: 200m + # memory: 256Mi + # requests: + # cpu: 100m + # memory: 128Mi + + diff --git a/web/.babelrc b/web/.babelrc new file mode 100644 index 0000000..62a0412 --- /dev/null +++ b/web/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": [ "react", "es2015", "stage-0" ] +} diff --git a/web/.circleci/config.yml b/web/.circleci/config.yml new file mode 100644 index 0000000..5c4495c --- /dev/null +++ b/web/.circleci/config.yml @@ -0,0 +1,29 @@ +# # Javascript Node CircleCI 2.0 configuration file +# # +# # Check https://circleci.com/docs/2.0/language-javascript/ for more details +# # +version: 2 +jobs: + build-web: + docker: + - image: circleci/node:10.3.1 + environment: + DOCKER_IMAGE_NAME: nmnellis/vistio-web + + working_directory: ~/web + steps: + - checkout + - run: npm install + - setup_remote_docker: + docker_layer_caching: true + - run: | + if [ "${CIRCLE_BRANCH}" == "master" ]; then + docker build -t $DOCKER_IMAGE_NAME . + docker login -u $DOCKER_USER -p $DOCKER_PASS + docker push $DOCKER_IMAGE_NAME + fi + if [[ "$CIRCLE_TAG" =~ ^v[0-9]+(?:\.[0-9]+){2}$ ]]; then + docker build -t "$DOCKER_IMAGE_NAME:$CIRCLE_TAG" . + docker login -u $DOCKER_USER -p $DOCKER_PASS + docker push "$DOCKER_IMAGE_NAME:$CIRCLE_TAG" + fi diff --git a/web/.env b/web/.env new file mode 100644 index 0000000..48f5e4e --- /dev/null +++ b/web/.env @@ -0,0 +1,3 @@ +UPDATE_URL="http://localhost:9091/graph" +INTERVAL=1000 +MAX_REPLAY_OFFSET=43200 diff --git a/web/.eslintrc b/web/.eslintrc new file mode 100644 index 0000000..a138985 --- /dev/null +++ b/web/.eslintrc @@ -0,0 +1,42 @@ +{ + "env": { + "browser": true, + "mocha": true, + "node": false, + "amd": true + }, + "parser": "babel-eslint", + "extends": [ + "airbnb-base" + ], + "ecmaFeatures": { + "modules": false, + "jsx": true + }, + "rules": { + "indent": [ + 2, + 2 + ], + "new-cap": 0, + "class-methods-use-this": 0, + "comma-dangle": 0, + "func-names": 0, + "import/extensions": [1, "never"], + "import/no-unresolved": 0, + "import/no-webpack-loader-syntax": 0, + "no-plusplus": 0, + "no-var": 1, + "space-before-function-paren": [1, "always"], + "vars-on-top": 0, + "no-param-reassign": 0, + "no-underscore-dangle": 0, + "max-len": 0, + "react/jsx-uses-vars": 1, + "object-shorthand": [0, "always"], + "strict": 0 + }, + "plugins": [ + "react" + ] +} diff --git a/web/.gitignore b/web/.gitignore new file mode 100644 index 0000000..f32b335 --- /dev/null +++ b/web/.gitignore @@ -0,0 +1,19 @@ +# System +.DS_Store + +# IDE config +/.idea + +# Generated +/.jshintignore +/.jshintrc +/dist +npm-debug.log +node_modules + +# Typings +*.ts + +# Temporary Files and Backups +*.swp +*.*~ diff --git a/web/Dockerfile b/web/Dockerfile new file mode 100644 index 0000000..edf9d9b --- /dev/null +++ b/web/Dockerfile @@ -0,0 +1,15 @@ +FROM mhart/alpine-node + +# Create app directory +RUN mkdir -p /usr/src/app +WORKDIR /usr/src/app + +# Install app dependencies +COPY package.json /usr/src/app/ +RUN npm install + +# Bundle app source +COPY . /usr/src/app + +EXPOSE 8080 +CMD [ "npm", "run", "start" ] diff --git a/web/LICENSE b/web/LICENSE new file mode 100644 index 0000000..1280afa --- /dev/null +++ b/web/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 2016 Netflix, 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. diff --git a/web/README.md b/web/README.md new file mode 100644 index 0000000..7e23c07 --- /dev/null +++ b/web/README.md @@ -0,0 +1,45 @@ +# Promviz-front [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) +[nghialv/promviz](https://github.com/nghialv/promviz) web front-end application + +This fork of Netflix's [vizceral-example](https://github.com/Netflix/vizceral-example) contains these new features: +* Replaying +* Connection Chart +* Node Coloring +* Class Filtering +* Notice Filtering + +... + +# Install +This application is one of promviz's components. +To install, please refer to [nghialv/promviz#install](https://github.com/nghialv/promviz#install). + +# Install & Run Independently +``` +npm install +npm run dev +``` +or, you can use Docker to run: +``` +docker build -t /promviz-front . +docker run -p 8080:8080 -d /promviz-front +``` +then, you can view the top page at http://localhost:8080/ + +### Public Docker Repository +[mjhddevlion/promviz-front](https://hub.docker.com/r/mjhddevlion/promviz-front/) + +# Configuration +There are 2 ways to configure this application: +1. edit .env file +1. set environment variables + +You can customize this application's behavior with these variables: +``` +UPDATE_URL: endpoint of promviz server +INTERVAL: interval between fetches (ms) +MAX_REPLAY_OFFSET: limit of replaying offset (s) +``` + +# Contributing +Welcome PRs! diff --git a/web/package-lock.json b/web/package-lock.json new file mode 100644 index 0000000..8c4818b --- /dev/null +++ b/web/package-lock.json @@ -0,0 +1,7722 @@ +{ + "name": "promviz-front", + "version": "0.1.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "accepts": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", + "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", + "requires": { + "mime-types": "~2.1.16", + "negotiator": "0.6.1" + } + }, + "acorn": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.2.tgz", + "integrity": "sha512-o96FZLJBPY1lvTuJylGA9Bk3t/GKPPJG8H0ydQQl01crzwJgspa4AEIq/pVTXigmK0PHVQhiAtn8WMBLL9D2WA==", + "dev": true + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "^3.0.4" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" + }, + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "requires": { + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" + } + }, + "ajv-keywords": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + } + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" + } + }, + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "array-filter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "array-map": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", + "dev": true + }, + "array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "array.prototype.find": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.0.4.tgz", + "integrity": "sha1-VWpcU2LAhkgyPdrrnenRS8GGTJA=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" + } + }, + "arraybuffer.slice": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", + "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=" + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, + "requires": { + "util": "0.10.3" + } + }, + "ast-types": { + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", + "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "autoprefixer": { + "version": "6.7.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", + "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", + "dev": true, + "requires": { + "browserslist": "^1.7.6", + "caniuse-db": "^1.0.30000634", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^5.2.16", + "postcss-value-parser": "^3.2.3" + } + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } + }, + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "babel-eslint": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-7.2.3.tgz", + "integrity": "sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc=", + "dev": true, + "requires": { + "babel-code-frame": "^6.22.0", + "babel-traverse": "^6.23.1", + "babel-types": "^6.23.0", + "babylon": "^6.17.0" + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + } + }, + "babel-helper-bindify-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", + "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "dev": true, + "requires": { + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-builder-react-jsx": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", + "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "esutils": "^2.0.2" + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-explode-class": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", + "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", + "dev": true, + "requires": { + "babel-helper-bindify-decorators": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true, + "requires": { + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "dev": true, + "requires": { + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-loader": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-6.4.1.tgz", + "integrity": "sha1-CzQRLVsHSKjc2/Uaz2+b1C1QuMo=", + "dev": true, + "requires": { + "find-cache-dir": "^0.1.1", + "loader-utils": "^0.2.16", + "mkdirp": "^0.5.1", + "object-assign": "^4.0.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", + "dev": true + }, + "babel-plugin-syntax-async-generators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", + "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=", + "dev": true + }, + "babel-plugin-syntax-class-constructor-call": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz", + "integrity": "sha1-nLnTn+Q8hgC+yBRkVt3L1OGnZBY=", + "dev": true + }, + "babel-plugin-syntax-class-properties": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", + "dev": true + }, + "babel-plugin-syntax-decorators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", + "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=", + "dev": true + }, + "babel-plugin-syntax-do-expressions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz", + "integrity": "sha1-V0d1YTmqJtOQ0JQQsDdEugfkeW0=", + "dev": true + }, + "babel-plugin-syntax-dynamic-import": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", + "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", + "dev": true + }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", + "dev": true + }, + "babel-plugin-syntax-export-extensions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz", + "integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE=", + "dev": true + }, + "babel-plugin-syntax-flow": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", + "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=", + "dev": true + }, + "babel-plugin-syntax-function-bind": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz", + "integrity": "sha1-SMSV8Xe98xqYHnMvVa3AvdJgH0Y=", + "dev": true + }, + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", + "dev": true + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", + "dev": true + }, + "babel-plugin-transform-async-generator-functions": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", + "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-generators": "^6.5.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-class-constructor-call": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz", + "integrity": "sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk=", + "dev": true, + "requires": { + "babel-plugin-syntax-class-constructor-call": "^6.18.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-class-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", + "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-plugin-syntax-class-properties": "^6.8.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", + "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", + "dev": true, + "requires": { + "babel-helper-explode-class": "^6.24.1", + "babel-plugin-syntax-decorators": "^6.13.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-do-expressions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.22.0.tgz", + "integrity": "sha1-KMyvkoEtlJws0SgfaQyP3EaK6bs=", + "dev": true, + "requires": { + "babel-plugin-syntax-do-expressions": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "dev": true, + "requires": { + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "dev": true, + "requires": { + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "dev": true, + "requires": { + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "dev": true, + "requires": { + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "dev": true, + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "dev": true, + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" + } + }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "dev": true, + "requires": { + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-export-extensions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz", + "integrity": "sha1-U3OLR+deghhYnuqUbLvTkQm75lM=", + "dev": true, + "requires": { + "babel-plugin-syntax-export-extensions": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-flow-strip-types": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", + "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", + "dev": true, + "requires": { + "babel-plugin-syntax-flow": "^6.18.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-function-bind": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.22.0.tgz", + "integrity": "sha1-xvuOlqwpajELjPjqQBRiQH3fapc=", + "dev": true, + "requires": { + "babel-plugin-syntax-function-bind": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" + } + }, + "babel-plugin-transform-react-display-name": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", + "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-react-jsx": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", + "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", + "dev": true, + "requires": { + "babel-helper-builder-react-jsx": "^6.24.1", + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-react-jsx-self": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", + "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", + "dev": true, + "requires": { + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-react-jsx-source": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", + "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", + "dev": true, + "requires": { + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "dev": true, + "requires": { + "regenerator-transform": "^0.10.0" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-preset-es2015": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", + "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", + "dev": true, + "requires": { + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.24.1", + "babel-plugin-transform-es2015-classes": "^6.24.1", + "babel-plugin-transform-es2015-computed-properties": "^6.24.1", + "babel-plugin-transform-es2015-destructuring": "^6.22.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", + "babel-plugin-transform-es2015-for-of": "^6.22.0", + "babel-plugin-transform-es2015-function-name": "^6.24.1", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-umd": "^6.24.1", + "babel-plugin-transform-es2015-object-super": "^6.24.1", + "babel-plugin-transform-es2015-parameters": "^6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", + "babel-plugin-transform-regenerator": "^6.24.1" + } + }, + "babel-preset-flow": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", + "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", + "dev": true, + "requires": { + "babel-plugin-transform-flow-strip-types": "^6.22.0" + } + }, + "babel-preset-react": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", + "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", + "dev": true, + "requires": { + "babel-plugin-syntax-jsx": "^6.3.13", + "babel-plugin-transform-react-display-name": "^6.23.0", + "babel-plugin-transform-react-jsx": "^6.24.1", + "babel-plugin-transform-react-jsx-self": "^6.22.0", + "babel-plugin-transform-react-jsx-source": "^6.22.0", + "babel-preset-flow": "^6.23.0" + } + }, + "babel-preset-stage-0": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-0/-/babel-preset-stage-0-6.24.1.tgz", + "integrity": "sha1-VkLRUEL5E4TX5a+LyIsduVsDnmo=", + "dev": true, + "requires": { + "babel-plugin-transform-do-expressions": "^6.22.0", + "babel-plugin-transform-function-bind": "^6.22.0", + "babel-preset-stage-1": "^6.24.1" + } + }, + "babel-preset-stage-1": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz", + "integrity": "sha1-dpLNfc1oSZB+auSgqFWJz7niv7A=", + "dev": true, + "requires": { + "babel-plugin-transform-class-constructor-call": "^6.24.1", + "babel-plugin-transform-export-extensions": "^6.22.0", + "babel-preset-stage-2": "^6.24.1" + } + }, + "babel-preset-stage-2": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", + "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", + "dev": true, + "requires": { + "babel-plugin-syntax-dynamic-import": "^6.18.0", + "babel-plugin-transform-class-properties": "^6.24.1", + "babel-plugin-transform-decorators": "^6.24.1", + "babel-preset-stage-3": "^6.24.1" + } + }, + "babel-preset-stage-3": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", + "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", + "dev": true, + "requires": { + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-generator-functions": "^6.24.1", + "babel-plugin-transform-async-to-generator": "^6.24.1", + "babel-plugin-transform-exponentiation-operator": "^6.24.1", + "babel-plugin-transform-object-rest-spread": "^6.22.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + }, + "dependencies": { + "core-js": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", + "dev": true + } + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "core-js": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", + "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=" + } + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" + }, + "base64-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", + "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "requires": { + "callsite": "1.0.0" + } + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "binary-extensions": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", + "integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=", + "dev": true + }, + "blob": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=" + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "dev": true + }, + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.1", + "http-errors": "~1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "~2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "~1.6.15" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "bootstrap": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.3.7.tgz", + "integrity": "sha1-WjiTlFSfIzMIdaOxUGVldPip63E=" + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "browserify-aes": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-0.4.0.tgz", + "integrity": "sha1-BnFJtmjfMcS1hTPgLQHoBthgjiw=", + "dev": true, + "requires": { + "inherits": "^2.0.1" + } + }, + "browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", + "dev": true, + "requires": { + "pako": "~0.2.0" + } + }, + "browserslist": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "dev": true, + "requires": { + "caniuse-db": "^1.0.30000639", + "electron-to-chromium": "^1.2.7" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "^0.2.0" + } + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "caniuse-api": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", + "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", + "dev": true, + "requires": { + "browserslist": "^1.3.6", + "caniuse-db": "^1.0.30000529", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-db": { + "version": "1.0.30000746", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000746.tgz", + "integrity": "sha1-UBCYxm9fu/Y0wC8lUIsF6ICZEPQ=", + "dev": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "requires": { + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" + } + }, + "chroma-js": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-1.3.7.tgz", + "integrity": "sha512-ARq0P94NObL8hdQbgc+E33X9OHiNzdHO7epe3nC/KgxNRxkQcFpzNqnGeFjvOY2GxfVhbia686NXD2jByb1o0g==" + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, + "clap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", + "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", + "dev": true, + "requires": { + "chalk": "^1.1.3" + } + }, + "classnames": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", + "integrity": "sha1-+zgB1FNGdknvNgPH1hoCvRKb3m0=" + }, + "clean-css": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.9.tgz", + "integrity": "sha1-Nc7ornaHpJuYA09w3gDE7dOCYwE=", + "dev": true, + "requires": { + "source-map": "0.5.x" + } + }, + "cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", + "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", + "dev": true, + "requires": { + "exit": "0.1.2", + "glob": "^7.1.1" + } + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "^1.0.1" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + } + } + }, + "clone": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", + "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", + "dev": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "coa": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", + "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", + "dev": true, + "requires": { + "q": "^1.1.2" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "color": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", + "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", + "dev": true, + "requires": { + "clone": "^1.0.2", + "color-convert": "^1.3.0", + "color-string": "^0.3.0" + } + }, + "color-convert": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", + "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", + "dev": true, + "requires": { + "color-name": "^1.1.1" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "color-string": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", + "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", + "dev": true, + "requires": { + "color-name": "^1.0.0" + } + }, + "colormin": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", + "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", + "dev": true, + "requires": { + "color": "^0.11.0", + "css-color-names": "0.0.4", + "has": "^1.0.1" + } + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" + }, + "compressible": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.11.tgz", + "integrity": "sha1-FnGKdd4oPtjmBAQWJaIGRYZ5fYo=", + "dev": true, + "requires": { + "mime-db": ">= 1.29.0 < 2" + } + }, + "compression": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.1.tgz", + "integrity": "sha1-7/JgPvwuIs+G810uuTWJ+YdTc9s=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "bytes": "3.0.0", + "compressible": "~2.0.11", + "debug": "2.6.9", + "on-headers": "~1.0.1", + "safe-buffer": "5.1.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "connect-history-api-fallback": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.4.0.tgz", + "integrity": "sha1-PbJPlz9LkjsOgvYZzg3wJBHKYj0=", + "dev": true + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "convert-source-map": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", + "dev": true + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" + }, + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cpx": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/cpx/-/cpx-1.5.0.tgz", + "integrity": "sha1-GFvgGFEdhycN7czCkxceN2VauI8=", + "dev": true, + "requires": { + "babel-runtime": "^6.9.2", + "chokidar": "^1.6.0", + "duplexer": "^0.1.1", + "glob": "^7.0.5", + "glob2base": "^0.0.12", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.1", + "resolve": "^1.1.7", + "safe-buffer": "^5.0.1", + "shell-quote": "^1.6.1", + "subarg": "^1.0.0" + } + }, + "create-react-class": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.2.tgz", + "integrity": "sha1-zx7RXxKq1/FO9fLf4F5sQvke8Co=", + "requires": { + "fbjs": "^0.8.9", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + }, + "cross-spawn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "crypto-browserify": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.3.0.tgz", + "integrity": "sha1-ufx1u0oO1h3PHNXa6W6zDJw+UGw=", + "dev": true, + "requires": { + "browserify-aes": "0.4.0", + "pbkdf2-compat": "2.0.1", + "ripemd160": "0.2.0", + "sha.js": "2.2.6" + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + }, + "css-loader": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.26.4.tgz", + "integrity": "sha1-th6eMNuUMD5v/IkvEOzQmtAlof0=", + "dev": true, + "requires": { + "babel-code-frame": "^6.11.0", + "css-selector-tokenizer": "^0.7.0", + "cssnano": ">=2.6.1 <4", + "loader-utils": "^1.0.2", + "lodash.camelcase": "^4.3.0", + "object-assign": "^4.0.1", + "postcss": "^5.0.6", + "postcss-modules-extract-imports": "^1.0.0", + "postcss-modules-local-by-default": "^1.0.1", + "postcss-modules-scope": "^1.0.0", + "postcss-modules-values": "^1.1.0", + "source-list-map": "^0.1.7" + }, + "dependencies": { + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + } + } + } + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-selector-tokenizer": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", + "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", + "dev": true, + "requires": { + "cssesc": "^0.1.0", + "fastparse": "^1.1.1", + "regexpu-core": "^1.0.0" + }, + "dependencies": { + "regexpu-core": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", + "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "dev": true, + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + } + } + }, + "css-what": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", + "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", + "dev": true + }, + "cssesc": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", + "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", + "dev": true + }, + "cssnano": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", + "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", + "dev": true, + "requires": { + "autoprefixer": "^6.3.1", + "decamelize": "^1.1.2", + "defined": "^1.0.0", + "has": "^1.0.1", + "object-assign": "^4.0.1", + "postcss": "^5.0.14", + "postcss-calc": "^5.2.0", + "postcss-colormin": "^2.1.8", + "postcss-convert-values": "^2.3.4", + "postcss-discard-comments": "^2.0.4", + "postcss-discard-duplicates": "^2.0.1", + "postcss-discard-empty": "^2.0.1", + "postcss-discard-overridden": "^0.1.1", + "postcss-discard-unused": "^2.2.1", + "postcss-filter-plugins": "^2.0.0", + "postcss-merge-idents": "^2.1.5", + "postcss-merge-longhand": "^2.0.1", + "postcss-merge-rules": "^2.0.3", + "postcss-minify-font-values": "^1.0.2", + "postcss-minify-gradients": "^1.0.1", + "postcss-minify-params": "^1.0.4", + "postcss-minify-selectors": "^2.0.4", + "postcss-normalize-charset": "^1.1.0", + "postcss-normalize-url": "^3.0.7", + "postcss-ordered-values": "^2.1.0", + "postcss-reduce-idents": "^2.2.2", + "postcss-reduce-initial": "^1.0.0", + "postcss-reduce-transforms": "^1.0.3", + "postcss-svgo": "^2.1.1", + "postcss-unique-selectors": "^2.0.2", + "postcss-value-parser": "^3.2.3", + "postcss-zindex": "^2.0.1" + } + }, + "csso": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", + "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", + "dev": true, + "requires": { + "clap": "^1.0.9", + "source-map": "^0.5.3" + } + }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "^0.10.9" + } + }, + "damerau-levenshtein": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz", + "integrity": "sha1-AxkcQyy27qFou3fzpV/9zLiXhRQ=", + "dev": true + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "requires": { + "ms": "0.7.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "define-properties": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "dev": true, + "requires": { + "foreach": "^2.0.5", + "object-keys": "^1.0.8" + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "doctrine": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", + "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "dom-converter": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", + "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=", + "dev": true, + "requires": { + "utila": "~0.3" + }, + "dependencies": { + "utila": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", + "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=", + "dev": true + } + } + }, + "dom-helpers": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.2.1.tgz", + "integrity": "sha1-MgPgf+0he9H0JLAZc1WC/Deyglo=" + }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dev": true, + "requires": { + "domelementtype": "~1.1.1", + "entities": "~1.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "dev": true + } + } + }, + "domain-browser": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", + "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", + "dev": true + }, + "domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "dev": true + }, + "domhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", + "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dotenv": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz", + "integrity": "sha1-hk7xN5rO1Vzm+V3r7NzhefegzR0=", + "dev": true + }, + "dotenv-webpack": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/dotenv-webpack/-/dotenv-webpack-1.5.4.tgz", + "integrity": "sha1-nJLkbkEqHPvGAhftM9adK7/dv58=", + "dev": true, + "requires": { + "dotenv": "^4.0.0" + } + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "electron-to-chromium": { + "version": "1.3.26", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.26.tgz", + "integrity": "sha1-mWQnKUhhp02cfIK5Jg6jAejALWY=", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", + "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "engine.io-client": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.4.tgz", + "integrity": "sha1-n+hd7iWFPKa6viW9KtaHEIY+kcI=", + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "2.3.3", + "engine.io-parser": "1.3.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parsejson": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "1.1.2", + "xmlhttprequest-ssl": "1.5.3", + "yeast": "0.1.2" + } + }, + "engine.io-parser": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz", + "integrity": "sha1-k3sHnwAH0Ik+xW1GyyILjLQ1Igo=", + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "0.0.6", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.4", + "has-binary": "0.1.7", + "wtf-8": "1.0.0" + } + }, + "enhanced-resolve": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz", + "integrity": "sha1-TW5omzcl+GCQknzMhs2fFjW4ni4=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.2.0", + "tapable": "^0.1.8" + }, + "dependencies": { + "memory-fs": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz", + "integrity": "sha1-8rslNovBIeORwlIN6Slpyu4KApA=", + "dev": true + } + } + }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true + }, + "errno": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", + "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", + "dev": true, + "requires": { + "prr": "~0.0.0" + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.9.0.tgz", + "integrity": "sha512-kk3IJoKo7A3pWJc0OV8yZ/VEX2oSUytfekrJiqoxBlKJMFAJVJVpGdHClCCTdv+Fn2zHfpDHHIelMFhZVfef3Q==", + "dev": true, + "requires": { + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" + } + }, + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "dev": true, + "requires": { + "is-callable": "^1.1.1", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.1" + } + }, + "es5-ext": { + "version": "0.10.35", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.35.tgz", + "integrity": "sha1-GO6FjOajxFx9eekcFfzKnsVoSU8=", + "dev": true, + "requires": { + "es6-iterator": "~2.0.1", + "es6-symbol": "~3.1.1" + } + }, + "es6-iterator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", + "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.14", + "es6-symbol": "^3.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" + } + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "~0.3.5" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "es6-templates": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/es6-templates/-/es6-templates-0.2.3.tgz", + "integrity": "sha1-XLmsn7He1usSOTQrgdeSu7QHjuQ=", + "dev": true, + "requires": { + "recast": "~0.11.12", + "through": "~2.3.6" + } + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.14", + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true, + "requires": { + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", + "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", + "dev": true, + "requires": { + "babel-code-frame": "^6.16.0", + "chalk": "^1.1.3", + "concat-stream": "^1.5.2", + "debug": "^2.1.1", + "doctrine": "^2.0.0", + "escope": "^3.6.0", + "espree": "^3.4.0", + "esquery": "^1.0.0", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "glob": "^7.0.3", + "globals": "^9.14.0", + "ignore": "^3.2.0", + "imurmurhash": "^0.1.4", + "inquirer": "^0.12.0", + "is-my-json-valid": "^2.10.0", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.5.1", + "json-stable-stringify": "^1.0.0", + "levn": "^0.3.0", + "lodash": "^4.0.0", + "mkdirp": "^0.5.0", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.1", + "pluralize": "^1.2.1", + "progress": "^1.1.8", + "require-uncached": "^1.0.2", + "shelljs": "^0.7.5", + "strip-bom": "^3.0.0", + "strip-json-comments": "~2.0.1", + "table": "^3.7.8", + "text-table": "~0.2.0", + "user-home": "^2.0.0" + } + }, + "eslint-config-airbnb-base": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-10.0.1.tgz", + "integrity": "sha1-8X1OUpksHUXRt3E++81ezQ5+BQY=", + "dev": true + }, + "eslint-import-resolver-node": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.1.tgz", + "integrity": "sha512-yUtXS15gIcij68NmXmP9Ni77AQuCN0itXbCc/jWd8C6/yKZaSNXicpC8cgvjnxVdmfsosIXrjpzFq7GcDryb6A==", + "dev": true, + "requires": { + "debug": "^2.6.8", + "resolve": "^1.2.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-loader": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-1.9.0.tgz", + "integrity": "sha512-40aN976qSNPyb9ejTqjEthZITpls1SVKtwguahmH1dzGCwQU/vySE+xX33VZmD8csU0ahVNCtFlsPgKqRBiqgg==", + "dev": true, + "requires": { + "loader-fs-cache": "^1.0.0", + "loader-utils": "^1.0.2", + "object-assign": "^4.0.1", + "object-hash": "^1.1.4", + "rimraf": "^2.6.1" + }, + "dependencies": { + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + } + } + } + }, + "eslint-module-utils": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz", + "integrity": "sha512-jDI/X5l/6D1rRD/3T43q8Qgbls2nq5km5KSqiwlyUbGo5+04fXhMKdCPhjwbqAa6HXWaMxj8Q4hQDIh7IadJQw==", + "dev": true, + "requires": { + "debug": "^2.6.8", + "pkg-dir": "^1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-plugin-import": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.7.0.tgz", + "integrity": "sha512-HGYmpU9f/zJaQiKNQOVfHUh2oLWW3STBrCgH0sHTX1xtsxYlH1zjLh8FlQGEIdZSdTbUMaV36WaZ6ImXkenGxQ==", + "dev": true, + "requires": { + "builtin-modules": "^1.1.1", + "contains-path": "^0.1.0", + "debug": "^2.6.8", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.1", + "eslint-module-utils": "^2.1.1", + "has": "^1.0.1", + "lodash.cond": "^4.3.0", + "minimatch": "^3.0.3", + "read-pkg-up": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-plugin-jsx-a11y": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-3.0.2.tgz", + "integrity": "sha1-nw6ryv3j0qJgDZamatuQ0JnoQf4=", + "dev": true, + "requires": { + "damerau-levenshtein": "^1.0.0", + "jsx-ast-utils": "^1.0.0", + "object-assign": "^4.0.1" + } + }, + "eslint-plugin-react": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-6.10.3.tgz", + "integrity": "sha1-xUNb6wZ3ThLH2y9qut3L+QDNP3g=", + "dev": true, + "requires": { + "array.prototype.find": "^2.0.1", + "doctrine": "^1.2.2", + "has": "^1.0.1", + "jsx-ast-utils": "^1.3.4", + "object.assign": "^4.0.4" + }, + "dependencies": { + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "espree": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.1.tgz", + "integrity": "sha1-DJiLirRttTEAoZVK5LqZXd0n2H4=", + "dev": true, + "requires": { + "acorn": "^5.1.1", + "acorn-jsx": "^3.0.0" + } + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "esquery": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", + "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "dev": true, + "requires": { + "estraverse": "^4.0.0" + } + }, + "esrecurse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", + "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "dev": true, + "requires": { + "estraverse": "^4.1.0", + "object-assign": "^4.0.1" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "event-stream": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", + "dev": true, + "requires": { + "duplexer": "~0.1.1", + "from": "~0", + "map-stream": "~0.1.0", + "pause-stream": "0.0.11", + "split": "0.3", + "stream-combiner": "~0.0.4", + "through": "~2.3.1" + } + }, + "eventemitter3": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", + "dev": true + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "eventsource": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", + "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", + "dev": true, + "requires": { + "original": ">=0.0.5" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "dev": true + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "^2.1.0" + } + }, + "express": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", + "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", + "requires": { + "accepts": "~1.3.4", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.1", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.0", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.2", + "qs": "6.5.1", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.1", + "serve-static": "1.13.1", + "setprototypeof": "1.1.0", + "statuses": "~1.3.1", + "type-is": "~1.6.15", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fastparse": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", + "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=", + "dev": true + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fbemitter": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-2.1.1.tgz", + "integrity": "sha1-Uj4U/a9SSIBbsC9i78M75wP1GGU=", + "requires": { + "fbjs": "^0.8.4" + } + }, + "fbjs": { + "version": "0.8.16", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", + "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", + "requires": { + "core-js": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.9" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" + } + }, + "file-loader": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-0.9.0.tgz", + "integrity": "sha1-HS2t3UJM5tGwfP4/eXMb7TYXq0I=", + "dev": true, + "requires": { + "loader-utils": "~0.2.5" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "randomatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", + "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", + "dev": true, + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + } + } + }, + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "find-cache-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "mkdirp": "^0.5.1", + "pkg-dir": "^1.0.0" + } + }, + "find-index": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", + "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", + "dev": true + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "flat-cache": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "dev": true, + "requires": { + "circular-json": "^0.3.1", + "del": "^2.0.2", + "graceful-fs": "^4.1.2", + "write": "^0.2.1" + } + }, + "flatten": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", + "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=", + "dev": true + }, + "flux": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/flux/-/flux-3.1.3.tgz", + "integrity": "sha1-0jvtUVp5oi2TOrU6tK2hnQWy8Io=", + "requires": { + "fbemitter": "^2.0.0", + "fbjs": "^0.8.0" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" + } + }, + "formidable": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", + "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==" + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.21", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": "^2.1.0" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.5.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true, + "dev": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "requires": { + "is-property": "^1.0.0" + } + }, + "git-validate": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/git-validate/-/git-validate-2.2.2.tgz", + "integrity": "sha1-nMj/ABF3lXoRcmq1CNQVu4Cxi88=", + "dev": true + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "glob2base": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", + "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", + "dev": true, + "requires": { + "find-index": "^0.1.1" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "hammerjs": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", + "integrity": "sha1-BO93hiz/K7edMPdpIJWTAiK/YPE=" + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "dev": true, + "requires": { + "function-bind": "^1.0.2" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-binary": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", + "integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=", + "requires": { + "isarray": "0.0.1" + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "highcharts": { + "version": "5.0.14", + "resolved": "https://registry.npmjs.org/highcharts/-/highcharts-5.0.14.tgz", + "integrity": "sha512-mgJLyh1GYaLTh6hoEu8eB+Cl4tGygegRlJv7BBGWSafeZnADVsILbWo73RDH6kKyZDJqdb+G2tAo0sFvVv8k1Q==" + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + } + }, + "hosted-git-info": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", + "dev": true + }, + "html-comment-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz", + "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=", + "dev": true + }, + "html-loader": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-0.4.5.tgz", + "integrity": "sha1-X7zYfNY6XEmn/OL+VvQl4Fcpxow=", + "dev": true, + "requires": { + "es6-templates": "^0.2.2", + "fastparse": "^1.1.1", + "html-minifier": "^3.0.1", + "loader-utils": "^1.0.2", + "object-assign": "^4.1.0" + }, + "dependencies": { + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + } + } + } + }, + "html-minifier": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.5.tgz", + "integrity": "sha512-g+1+NBycQI0fGnggd52JM8TRUweG7+9W2wrtjGitMAqc4G7maweAHvVAAjz9veHseIH3tYKE2lk2USGSoewIrQ==", + "dev": true, + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.1.x", + "commander": "2.11.x", + "he": "1.1.x", + "ncname": "1.0.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.1.x" + } + }, + "html-webpack-plugin": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz", + "integrity": "sha1-f5xCG36pHsRg9WUn1430hO51N9U=", + "dev": true, + "requires": { + "bluebird": "^3.4.7", + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "toposort": "^1.0.0" + } + }, + "htmlparser2": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", + "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", + "dev": true, + "requires": { + "domelementtype": "1", + "domhandler": "2.1", + "domutils": "1.1", + "readable-stream": "1.0" + }, + "dependencies": { + "domutils": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", + "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": ">= 1.3.1 < 2" + }, + "dependencies": { + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + } + } + }, + "http-parser-js": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.9.tgz", + "integrity": "sha1-6hoE+2St/wJC6ZdPKX3Uw8rSceE=", + "dev": true + }, + "http-proxy": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", + "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=", + "dev": true, + "requires": { + "eventemitter3": "1.x.x", + "requires-port": "1.x.x" + } + }, + "http-proxy-middleware": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", + "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", + "dev": true, + "requires": { + "http-proxy": "^1.16.2", + "is-glob": "^3.1.0", + "lodash": "^4.17.2", + "micromatch": "^2.3.11" + }, + "dependencies": { + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "https-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", + "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + }, + "icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", + "dev": true + }, + "ieee754": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", + "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", + "dev": true + }, + "ignore": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.5.tgz", + "integrity": "sha512-JLH93mL8amZQhh/p6mfQgVBH3M6epNq3DfsXsTSuSrInVjwyYlFE1nv2AgfRCC8PoOhM0jwQ5v8s9LgbK7yGDw==", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "inquirer": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", + "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "dev": true, + "requires": { + "ansi-escapes": "^1.1.0", + "ansi-regex": "^2.0.0", + "chalk": "^1.0.0", + "cli-cursor": "^1.0.1", + "cli-width": "^2.0.0", + "figures": "^1.3.5", + "lodash": "^4.3.0", + "readline2": "^1.0.1", + "run-async": "^0.1.0", + "rx-lite": "^3.1.2", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.0", + "through": "^2.3.6" + } + }, + "interpret": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.4.tgz", + "integrity": "sha1-ggzdWIuGj/sZGoCVBtbJyPISsbA=", + "dev": true + }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "ipaddr.js": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz", + "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=" + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", + "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-callable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", + "dev": true + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-my-json-valid": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz", + "integrity": "sha512-ochPsqWS1WXj8ZnMIV0vnNXooaMhp7cyL4FMSIPKTtnV0Ha/T19G2b9kkhcNsabV9bxYkze7/aLZJb/bYuFduQ==", + "dev": true, + "requires": { + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "jsonpointer": "^4.0.0", + "xtend": "^4.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", + "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-resolvable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", + "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", + "dev": true, + "requires": { + "tryit": "^1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-svg": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", + "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", + "dev": true, + "requires": { + "html-comment-regex": "^1.1.0" + } + }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "requires": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + } + }, + "jquery": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.2.1.tgz", + "integrity": "sha1-XE2d5lKvbNCncBVKYxu6ErAVx4c=" + }, + "js-base64": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.3.2.tgz", + "integrity": "sha512-Y2/+DnfJJXT1/FCwUebUhLWb3QihxiSC42+ctHLGogmW2jPY6LCapMdFZXRvVP2z6qyKW7s6qncE/9gSqZiArw==", + "dev": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "js-yaml": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", + "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^2.6.0" + } + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "jshint": { + "version": "2.9.5", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.5.tgz", + "integrity": "sha1-HnJSkVzmgbQIJ+4UJIxG006apiw=", + "dev": true, + "requires": { + "cli": "~1.0.0", + "console-browserify": "1.1.x", + "exit": "0.1.x", + "htmlparser2": "3.8.x", + "lodash": "3.7.x", + "minimatch": "~3.0.2", + "shelljs": "0.3.x", + "strip-json-comments": "1.0.x" + }, + "dependencies": { + "domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", + "dev": true + }, + "htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "dev": true, + "requires": { + "domelementtype": "1", + "domhandler": "2.3", + "domutils": "1.5", + "entities": "1.0", + "readable-stream": "1.1" + } + }, + "lodash": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.7.0.tgz", + "integrity": "sha1-Nni9irmVBXwHreg27S7wh9qBHUU=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "shelljs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", + "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "dev": true + } + } + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "~0.0.0" + } + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=" + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true + }, + "jsx-ast-utils": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz", + "integrity": "sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE=", + "dev": true + }, + "keycode": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.1.9.tgz", + "integrity": "sha1-lkojxU5IiUBbSGGlyfBIDUUUHfo=" + }, + "keymirror": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/keymirror/-/keymirror-0.1.1.tgz", + "integrity": "sha1-kYiJ6hP40KQufFVyUO7nE63JXDU=" + }, + "keypress.js": { + "version": "2.1.0-1", + "resolved": "https://registry.npmjs.org/keypress.js/-/keypress.js-2.1.0-1.tgz", + "integrity": "sha1-jsd2R7wRnJ9hH1p0kGjOlegt8wc=" + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "loader-fs-cache": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz", + "integrity": "sha1-VuC/CL2XCLJqdltoUJhAyN7J/bw=", + "dev": true, + "requires": { + "find-cache-dir": "^0.1.1", + "mkdirp": "0.5.1" + } + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", + "dev": true + }, + "lodash.cond": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", + "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "requires": { + "js-tokens": "^3.0.0" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", + "dev": true + }, + "math-expression-evaluator": { + "version": "1.2.17", + "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", + "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=", + "dev": true + }, + "math-random": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", + "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "memory-fs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.3.0.tgz", + "integrity": "sha1-e8xrYp46Q+hx1+Kaymrop/FcuyA=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "requires": { + "mime-db": "~1.30.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=" + }, + "mute-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", + "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", + "dev": true + }, + "nan": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", + "dev": true, + "optional": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "ncname": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", + "integrity": "sha1-W1etGLHKCShk72Kwse2BlPODtxw=", + "dev": true, + "requires": { + "xml-char-classes": "^1.0.0" + } + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + }, + "node-libs-browser": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-0.7.0.tgz", + "integrity": "sha1-PicsCBnjCJNeJmdECNevDhSRuDs=", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.1.4", + "buffer": "^4.9.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "3.3.0", + "domain-browser": "^1.1.1", + "events": "^1.0.0", + "https-browserify": "0.0.1", + "os-browserify": "^0.2.0", + "path-browserify": "0.0.0", + "process": "^0.11.0", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.0.5", + "stream-browserify": "^2.0.1", + "stream-http": "^2.3.1", + "string_decoder": "^0.10.25", + "timers-browserify": "^2.0.2", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.10.3", + "vm-browserify": "0.0.4" + }, + "dependencies": { + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, + "npm-run-all": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-3.1.2.tgz", + "integrity": "sha1-x+P69KoKWb8Nz8EmARZhUWkhcc8=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "cross-spawn": "^4.0.0", + "minimatch": "^3.0.2", + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.1", + "ps-tree": "^1.0.1", + "read-pkg": "^1.1.0", + "read-pkg-up": "^1.0.1", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "dependencies": { + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, + "nth-check": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", + "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "numeral": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/numeral/-/numeral-1.5.6.tgz", + "integrity": "sha1-ODHbloRRuc9q/5v5WSXx7443sz8=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" + }, + "object-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.2.0.tgz", + "integrity": "sha512-smRWXzkvxw72VquyZ0wggySl7PFUtoDhvhpdwgESXxUrH7vVhhp9asfup1+rVLrhsl7L45Ee1Q/l5R2Ul4MwUg==", + "dev": true + }, + "object-keys": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", + "dev": true + }, + "object.assign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.0.4.tgz", + "integrity": "sha1-scnMBE7xuf5jYG/BQau7MuFHMMw=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.0", + "object-keys": "^1.0.10" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "open": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/open/-/open-0.0.5.tgz", + "integrity": "sha1-QsPhjslUZra/DcQvOilFw/DK2Pw=", + "dev": true + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + } + }, + "options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=" + }, + "original": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz", + "integrity": "sha1-kUf5P6FpbQS+YeAb1QuurKZWvTs=", + "dev": true, + "requires": { + "url-parse": "1.0.x" + }, + "dependencies": { + "url-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz", + "integrity": "sha1-CFSGBCKv3P7+tsllxmLUgAFpkns=", + "dev": true, + "requires": { + "querystringify": "0.0.x", + "requires-port": "1.0.x" + } + } + } + }, + "os-browserify": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz", + "integrity": "sha1-Y/xMzuXS13Y9Jrv4YBB45sLgBE8=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", + "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", + "dev": true + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", + "dev": true + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parsejson": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", + "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "dev": true, + "requires": { + "through": "~2.3" + } + }, + "pbkdf2-compat": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pbkdf2-compat/-/pbkdf2-compat-2.0.1.tgz", + "integrity": "sha1-tuDI+plJTZTgURV1gCpZpcFC8og=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "^1.0.0" + } + }, + "pluralize": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "dependencies": { + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-calc": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", + "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", + "dev": true, + "requires": { + "postcss": "^5.0.2", + "postcss-message-helpers": "^2.0.0", + "reduce-css-calc": "^1.2.6" + } + }, + "postcss-colormin": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", + "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", + "dev": true, + "requires": { + "colormin": "^1.0.5", + "postcss": "^5.0.13", + "postcss-value-parser": "^3.2.3" + } + }, + "postcss-convert-values": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", + "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", + "dev": true, + "requires": { + "postcss": "^5.0.11", + "postcss-value-parser": "^3.1.2" + } + }, + "postcss-discard-comments": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", + "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", + "dev": true, + "requires": { + "postcss": "^5.0.14" + } + }, + "postcss-discard-duplicates": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", + "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", + "dev": true, + "requires": { + "postcss": "^5.0.4" + } + }, + "postcss-discard-empty": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", + "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", + "dev": true, + "requires": { + "postcss": "^5.0.14" + } + }, + "postcss-discard-overridden": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", + "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", + "dev": true, + "requires": { + "postcss": "^5.0.16" + } + }, + "postcss-discard-unused": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", + "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", + "dev": true, + "requires": { + "postcss": "^5.0.14", + "uniqs": "^2.0.0" + } + }, + "postcss-filter-plugins": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz", + "integrity": "sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ==", + "dev": true, + "requires": { + "postcss": "^5.0.4" + } + }, + "postcss-merge-idents": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", + "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", + "dev": true, + "requires": { + "has": "^1.0.1", + "postcss": "^5.0.10", + "postcss-value-parser": "^3.1.1" + } + }, + "postcss-merge-longhand": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", + "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", + "dev": true, + "requires": { + "postcss": "^5.0.4" + } + }, + "postcss-merge-rules": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", + "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", + "dev": true, + "requires": { + "browserslist": "^1.5.2", + "caniuse-api": "^1.5.2", + "postcss": "^5.0.4", + "postcss-selector-parser": "^2.2.2", + "vendors": "^1.0.0" + } + }, + "postcss-message-helpers": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", + "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=", + "dev": true + }, + "postcss-minify-font-values": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", + "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.2" + } + }, + "postcss-minify-gradients": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", + "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", + "dev": true, + "requires": { + "postcss": "^5.0.12", + "postcss-value-parser": "^3.3.0" + } + }, + "postcss-minify-params": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", + "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.1", + "postcss": "^5.0.2", + "postcss-value-parser": "^3.0.2", + "uniqs": "^2.0.0" + } + }, + "postcss-minify-selectors": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", + "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.2", + "has": "^1.0.1", + "postcss": "^5.0.14", + "postcss-selector-parser": "^2.0.0" + } + }, + "postcss-modules-extract-imports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz", + "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=", + "dev": true, + "requires": { + "postcss": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", + "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.1.0", + "escape-string-regexp": "^1.0.5", + "supports-color": "^4.0.0" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "postcss": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.13.tgz", + "integrity": "sha512-nHsrD1PPTMSJDfU+osVsLtPkSP9YGeoOz4FDLN4r1DW4N5vqL1J+gACzTQHsfwIiWG/0/nV4yCzjTMo1zD8U1g==", + "dev": true, + "requires": { + "chalk": "^2.1.0", + "source-map": "^0.6.1", + "supports-color": "^4.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true, + "requires": { + "has-flag": "^2.0.0" + } + } + } + }, + "postcss-modules-local-by-default": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", + "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", + "dev": true, + "requires": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", + "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.1.0", + "escape-string-regexp": "^1.0.5", + "supports-color": "^4.0.0" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "postcss": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.13.tgz", + "integrity": "sha512-nHsrD1PPTMSJDfU+osVsLtPkSP9YGeoOz4FDLN4r1DW4N5vqL1J+gACzTQHsfwIiWG/0/nV4yCzjTMo1zD8U1g==", + "dev": true, + "requires": { + "chalk": "^2.1.0", + "source-map": "^0.6.1", + "supports-color": "^4.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true, + "requires": { + "has-flag": "^2.0.0" + } + } + } + }, + "postcss-modules-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", + "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", + "dev": true, + "requires": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", + "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.1.0", + "escape-string-regexp": "^1.0.5", + "supports-color": "^4.0.0" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "postcss": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.13.tgz", + "integrity": "sha512-nHsrD1PPTMSJDfU+osVsLtPkSP9YGeoOz4FDLN4r1DW4N5vqL1J+gACzTQHsfwIiWG/0/nV4yCzjTMo1zD8U1g==", + "dev": true, + "requires": { + "chalk": "^2.1.0", + "source-map": "^0.6.1", + "supports-color": "^4.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true, + "requires": { + "has-flag": "^2.0.0" + } + } + } + }, + "postcss-modules-values": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", + "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", + "dev": true, + "requires": { + "icss-replace-symbols": "^1.1.0", + "postcss": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", + "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.1.0", + "escape-string-regexp": "^1.0.5", + "supports-color": "^4.0.0" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "postcss": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.13.tgz", + "integrity": "sha512-nHsrD1PPTMSJDfU+osVsLtPkSP9YGeoOz4FDLN4r1DW4N5vqL1J+gACzTQHsfwIiWG/0/nV4yCzjTMo1zD8U1g==", + "dev": true, + "requires": { + "chalk": "^2.1.0", + "source-map": "^0.6.1", + "supports-color": "^4.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true, + "requires": { + "has-flag": "^2.0.0" + } + } + } + }, + "postcss-normalize-charset": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", + "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", + "dev": true, + "requires": { + "postcss": "^5.0.5" + } + }, + "postcss-normalize-url": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", + "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", + "dev": true, + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^1.4.0", + "postcss": "^5.0.14", + "postcss-value-parser": "^3.2.3" + } + }, + "postcss-ordered-values": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", + "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", + "dev": true, + "requires": { + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.1" + } + }, + "postcss-reduce-idents": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", + "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", + "dev": true, + "requires": { + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.2" + } + }, + "postcss-reduce-initial": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", + "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", + "dev": true, + "requires": { + "postcss": "^5.0.4" + } + }, + "postcss-reduce-transforms": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", + "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", + "dev": true, + "requires": { + "has": "^1.0.1", + "postcss": "^5.0.8", + "postcss-value-parser": "^3.0.1" + } + }, + "postcss-selector-parser": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", + "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", + "dev": true, + "requires": { + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "postcss-svgo": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", + "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", + "dev": true, + "requires": { + "is-svg": "^2.0.0", + "postcss": "^5.0.14", + "postcss-value-parser": "^3.2.3", + "svgo": "^0.7.0" + } + }, + "postcss-unique-selectors": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", + "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.1", + "postcss": "^5.0.4", + "uniqs": "^2.0.0" + } + }, + "postcss-value-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", + "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=", + "dev": true + }, + "postcss-zindex": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", + "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", + "dev": true, + "requires": { + "has": "^1.0.1", + "postcss": "^5.0.4", + "uniqs": "^2.0.0" + } + }, + "precommit-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/precommit-hook/-/precommit-hook-3.0.0.tgz", + "integrity": "sha1-YTbEUYX/lkNxZz9rY+nkhVSdsdc=", + "dev": true, + "requires": { + "git-validate": "^2.0.0", + "jshint": "*" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pretty-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "dev": true, + "requires": { + "renderkid": "^2.0.1", + "utila": "~0.4" + } + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "~2.0.3" + } + }, + "prop-types": { + "version": "15.6.0", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz", + "integrity": "sha1-zq8IMCL8RrSjX2nhPvda7Q1jmFY=", + "requires": { + "fbjs": "^0.8.16", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + }, + "proxy-addr": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.2.tgz", + "integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.5.2" + } + }, + "prr": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", + "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=", + "dev": true + }, + "ps-tree": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.1.0.tgz", + "integrity": "sha1-tCGyQUDWID8e08dplrRCewjowBQ=", + "dev": true, + "requires": { + "event-stream": "~3.3.0" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "q": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.0.tgz", + "integrity": "sha1-3QG6ydBtMObyGa7LglPunr3DCPE=", + "dev": true + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-0.0.4.tgz", + "integrity": "sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw=", + "dev": true + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + } + }, + "react": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/react/-/react-15.6.2.tgz", + "integrity": "sha1-26BDSrQ5z+gvEI8PURZjkIF5qnI=", + "requires": { + "create-react-class": "^15.6.0", + "fbjs": "^0.8.9", + "loose-envify": "^1.1.0", + "object-assign": "^4.1.0", + "prop-types": "^15.5.10" + } + }, + "react-addons-shallow-compare": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/react-addons-shallow-compare/-/react-addons-shallow-compare-15.6.2.tgz", + "integrity": "sha1-GYoAuR/DdiPbZKKP0XtZa6NicC8=", + "requires": { + "fbjs": "^0.8.4", + "object-assign": "^4.1.0" + } + }, + "react-bootstrap": { + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-0.30.10.tgz", + "integrity": "sha1-27ppCVlfKvTZGTfbD5bsjC3y0ag=", + "requires": { + "babel-runtime": "^6.11.6", + "classnames": "^2.2.5", + "dom-helpers": "^3.2.0", + "invariant": "^2.2.1", + "keycode": "^2.1.2", + "prop-types": "^15.5.6", + "react-overlays": "^0.6.12", + "react-prop-types": "^0.4.0", + "uncontrollable": "^4.0.1", + "warning": "^3.0.0" + } + }, + "react-checkbox-group": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/react-checkbox-group/-/react-checkbox-group-3.3.1.tgz", + "integrity": "sha512-PSELXQsV0vmE36i5im8+1yAC/A2kTGGGFEnefQukbrVty+hsLMIiJLf7YsRGGVqizUTPAaSFDSHEFScHSmlsOA==", + "requires": { + "prop-types": "^15.5.10" + } + }, + "react-dom": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-15.6.2.tgz", + "integrity": "sha1-Qc+t9pO3V/rycIRDodH9WgK+9zA=", + "requires": { + "fbjs": "^0.8.9", + "loose-envify": "^1.1.0", + "object-assign": "^4.1.0", + "prop-types": "^15.5.10" + } + }, + "react-highcharts": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/react-highcharts/-/react-highcharts-12.0.0.tgz", + "integrity": "sha1-p8i19bVrN6/o5/4C7IvucuN2FYo=", + "requires": { + "highcharts": "^5.0.0" + } + }, + "react-overlays": { + "version": "0.6.12", + "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-0.6.12.tgz", + "integrity": "sha1-oHnHUMxCnX20x0dKlbS1QDPiVcM=", + "requires": { + "classnames": "^2.2.5", + "dom-helpers": "^3.2.0", + "react-prop-types": "^0.4.0", + "warning": "^3.0.0" + } + }, + "react-prop-types": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/react-prop-types/-/react-prop-types-0.4.0.tgz", + "integrity": "sha1-+ZsL+0AGkpya8gUefBQUpcdbk9A=", + "requires": { + "warning": "^3.0.0" + } + }, + "react-virtualized": { + "version": "8.11.4", + "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-8.11.4.tgz", + "integrity": "sha1-C7lPHsvShtBxRc5jmD0KEXJFIsA=", + "requires": { + "babel-runtime": "^6.11.6", + "classnames": "^2.2.3", + "dom-helpers": "^2.4.0 || ^3.0.0", + "loose-envify": "^1.3.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" + } + }, + "readline2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", + "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "mute-stream": "0.0.5" + } + }, + "recast": { + "version": "0.11.23", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", + "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", + "dev": true, + "requires": { + "ast-types": "0.9.6", + "esprima": "~3.1.0", + "private": "~0.1.5", + "source-map": "~0.5.0" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + } + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "reduce-css-calc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", + "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", + "dev": true, + "requires": { + "balanced-match": "^0.4.2", + "math-expression-evaluator": "^1.2.14", + "reduce-function-call": "^1.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "dev": true + } + } + }, + "reduce-function-call": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", + "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", + "dev": true, + "requires": { + "balanced-match": "^0.4.2" + }, + "dependencies": { + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "dev": true + } + } + }, + "regenerate": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", + "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", + "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==" + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "dev": true, + "requires": { + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "^0.1.3" + } + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "dev": true, + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "renderkid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz", + "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=", + "dev": true, + "requires": { + "css-select": "^1.1.0", + "dom-converter": "~0.1", + "htmlparser2": "~3.3.0", + "strip-ansi": "^3.0.0", + "utila": "~0.3" + }, + "dependencies": { + "utila": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", + "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=", + "dev": true + } + } + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" + } + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", + "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", + "dev": true, + "requires": { + "path-parse": "^1.0.5" + } + }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + } + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "requires": { + "align-text": "^0.1.1" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "^7.0.5" + } + }, + "ripemd160": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-0.2.0.tgz", + "integrity": "sha1-K/GYveFnys+lHAqSjoS2i74XH84=", + "dev": true + }, + "run-async": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", + "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "dev": true, + "requires": { + "once": "^1.3.0" + } + }, + "rx-lite": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", + "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "dev": true + }, + "send": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", + "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.1", + "destroy": "~1.0.4", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.3.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "serve-static": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", + "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", + "requires": { + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.1" + } + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "sha.js": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.2.6.tgz", + "integrity": "sha1-F93t3F9yL7ZlAWWIlUYZd4ZzFbo=", + "dev": true + }, + "shell-quote": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "dev": true, + "requires": { + "array-filter": "~0.0.0", + "array-map": "~0.0.0", + "array-reduce": "~0.0.0", + "jsonify": "~0.0.0" + } + }, + "shelljs": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", + "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + }, + "socket.io-client": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.7.4.tgz", + "integrity": "sha1-7J+CA1btme9tNX8HVtZIcXvdQoE=", + "requires": { + "backo2": "1.0.2", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "2.3.3", + "engine.io-client": "~1.8.4", + "has-binary": "0.1.7", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseuri": "0.0.5", + "socket.io-parser": "2.3.1", + "to-array": "0.1.4" + } + }, + "socket.io-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz", + "integrity": "sha1-3VMgJRA85Clpcya+/WQAX8/ltKA=", + "requires": { + "component-emitter": "1.1.2", + "debug": "2.2.0", + "isarray": "0.0.1", + "json3": "3.3.2" + }, + "dependencies": { + "component-emitter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", + "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=" + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + } + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "dev": true, + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" + } + }, + "sockjs-client": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", + "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=", + "dev": true, + "requires": { + "debug": "^2.6.6", + "eventsource": "0.1.6", + "faye-websocket": "~0.11.0", + "inherits": "^2.0.1", + "json3": "^3.3.2", + "url-parse": "^1.1.8" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "faye-websocket": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", + "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "source-list-map": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", + "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + }, + "source-sans-pro": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/source-sans-pro/-/source-sans-pro-2.0.10.tgz", + "integrity": "sha1-wcqFnPFkoIiUTF6DdFCF6HzVM6k=" + }, + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dev": true, + "requires": { + "spdx-license-ids": "^1.0.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "dev": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "dev": true + }, + "split": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "dev": true, + "requires": { + "through": "2" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-cache": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stream-cache/-/stream-cache-0.0.2.tgz", + "integrity": "sha1-GsWtaDJCjKVWZ9ve45Xa1ObbEY8=", + "dev": true + }, + "stream-combiner": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", + "dev": true, + "requires": { + "duplexer": "~0.1.1" + } + }, + "stream-http": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", + "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.2.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string.prototype.padend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz", + "integrity": "sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.4.3", + "function-bind": "^1.0.2" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "style-loader": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.13.2.tgz", + "integrity": "sha1-dFMzhM9pjHEEx5URULSXF63C87s=", + "dev": true, + "requires": { + "loader-utils": "^1.0.2" + }, + "dependencies": { + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + } + } + } + }, + "subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", + "dev": true, + "requires": { + "minimist": "^1.1.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "superagent": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", + "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", + "requires": { + "component-emitter": "^1.2.0", + "cookiejar": "^2.1.0", + "debug": "^3.1.0", + "extend": "^3.0.0", + "form-data": "^2.3.1", + "formidable": "^1.2.0", + "methods": "^1.1.1", + "mime": "^1.4.1", + "qs": "^6.5.1", + "readable-stream": "^2.3.5" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "svgo": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", + "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", + "dev": true, + "requires": { + "coa": "~1.0.1", + "colors": "~1.1.2", + "csso": "~2.3.1", + "js-yaml": "~3.7.0", + "mkdirp": "~0.5.1", + "sax": "~1.2.1", + "whet.extend": "~0.9.9" + } + }, + "table": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", + "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "dev": true, + "requires": { + "ajv": "^4.7.0", + "ajv-keywords": "^1.0.0", + "chalk": "^1.1.1", + "lodash": "^4.0.0", + "slice-ansi": "0.0.4", + "string-width": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "tapable": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz", + "integrity": "sha1-KcNXB8K3DlDQdIK10gLo7URtr9Q=", + "dev": true + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "three": { + "version": "0.86.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.86.0.tgz", + "integrity": "sha1-HDPkdqFTfpqKGPV5LQJLEEbNIAA=" + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "time-stamp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz", + "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c=", + "dev": true + }, + "timers-browserify": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.4.tgz", + "integrity": "sha512-uZYhyU3EX8O7HQP+J9fTVYwsq90Vr68xPEFo7yrVImIxYvHgukBEgOB/SgGoorWVTzGM/3Z+wUNnboA4M8jWrg==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "toposort": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.6.tgz", + "integrity": "sha1-wxdI5V0hDv/AD9zcfW5o19e7nOw=", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "tryit": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", + "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tween.js": { + "version": "16.6.0", + "resolved": "https://registry.npmjs.org/tween.js/-/tween.js-16.6.0.tgz", + "integrity": "sha1-c5EEyTNsxPEe5T+c587eUeZyNiQ=" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-is": { + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", + "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.15" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "ua-parser-js": { + "version": "0.7.17", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz", + "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==" + }, + "uglify-js": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.1.3.tgz", + "integrity": "sha512-5ZUOgufCHjN2mBBLfz63UtWTP6va2sSzBpNCM+/iqI6RnPzEhANmB0EKiKBYdQbc3v7KeomXJ2DJx0Xq9gvUvA==", + "dev": true, + "requires": { + "commander": "~2.11.0", + "source-map": "~0.5.1" + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true + }, + "ultron": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=" + }, + "uncontrollable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-4.1.0.tgz", + "integrity": "sha1-4DWCkSUuGGUiLZCTmxny9J+Bwak=", + "requires": { + "invariant": "^2.1.0" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-loader": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.5.9.tgz", + "integrity": "sha512-B7QYFyvv+fOBqBVeefsxv6koWWtjmHaMFT6KZWti4KRw8YUD/hOU+3AECvXuzyVawIBx3z7zQRejXCDSO5kk1Q==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "mime": "1.3.x" + }, + "dependencies": { + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + } + }, + "mime": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.6.tgz", + "integrity": "sha1-WR2E02U6awtKO5343lqoEI5y5eA=", + "dev": true + } + } + }, + "url-parse": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.1.9.tgz", + "integrity": "sha1-xn8dd11R8KGJEd17P/rSe7nlvRk=", + "dev": true, + "requires": { + "querystringify": "~1.0.0", + "requires-port": "1.0.x" + }, + "dependencies": { + "querystringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-1.0.0.tgz", + "integrity": "sha1-YoYkIRLFtxL6ZU5SZlK/ahP/Bcs=", + "dev": true + } + } + }, + "user-home": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", + "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0" + } + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true, + "requires": { + "spdx-correct": "~1.0.0", + "spdx-expression-parse": "~1.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "vendors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.1.tgz", + "integrity": "sha1-N61zyO5Bf7PVgOeFMSMH0nSEfyI=", + "dev": true + }, + "vizceral": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/vizceral/-/vizceral-4.6.1.tgz", + "integrity": "sha512-4Jr/cpeZZ96N3YlUBjkeP+u7I4x+NVSY/4oxTr0hU/ogi3EEnmklMytZJy4xYeNcvmluzvU1sbPqs77S25F8cA==", + "requires": { + "chroma-js": "^1.1.1", + "hammerjs": "^2.0.8", + "lodash": "^4.12.0", + "numeral": "^1.5.3", + "three": "^0.86.0", + "tween.js": "16.6.0" + } + }, + "vizceral-react": { + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/vizceral-react/-/vizceral-react-4.5.5.tgz", + "integrity": "sha512-K9MjUyPolvBA5xmZ8jY3f2ay0Y9qFgfMrMYpUfhp0oPiGA4+e+lOP2fvmLiKObxGQ5jDE+QgedgXld25zBPQzg==", + "requires": { + "lodash": "^4.16.4", + "prop-types": "^15.6.1", + "vizceral": "~4.6.1" + }, + "dependencies": { + "prop-types": { + "version": "15.6.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz", + "integrity": "sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ==", + "requires": { + "fbjs": "^0.8.16", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + } + } + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } + }, + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "watchpack": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-0.2.9.tgz", + "integrity": "sha1-Yuqkq15bo1/fwBgnVibjwPXj+ws=", + "dev": true, + "requires": { + "async": "^0.9.0", + "chokidar": "^1.0.0", + "graceful-fs": "^4.1.2" + }, + "dependencies": { + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "dev": true + } + } + }, + "webfontloader": { + "version": "1.6.28", + "resolved": "https://registry.npmjs.org/webfontloader/-/webfontloader-1.6.28.tgz", + "integrity": "sha1-23hhKSU8tujq5UwvsF+HCvZnW64=" + }, + "webpack": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-1.15.0.tgz", + "integrity": "sha1-T/MfU9sDM55VFkqdRo7gMklo/pg=", + "dev": true, + "requires": { + "acorn": "^3.0.0", + "async": "^1.3.0", + "clone": "^1.0.2", + "enhanced-resolve": "~0.9.0", + "interpret": "^0.6.4", + "loader-utils": "^0.2.11", + "memory-fs": "~0.3.0", + "mkdirp": "~0.5.0", + "node-libs-browser": "^0.7.0", + "optimist": "~0.6.0", + "supports-color": "^3.1.0", + "tapable": "~0.1.8", + "uglify-js": "~2.7.3", + "watchpack": "^0.2.1", + "webpack-core": "~0.6.9" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + }, + "interpret": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-0.6.6.tgz", + "integrity": "sha1-/s16GOfOXKar+5U+H4YhOknxYls=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + }, + "uglify-js": { + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.7.5.tgz", + "integrity": "sha1-RhLAx7qu4rp8SH3kkErhIgefLKg=", + "dev": true, + "requires": { + "async": "~0.2.6", + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "dependencies": { + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", + "dev": true + } + } + } + } + }, + "webpack-core": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", + "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", + "dev": true, + "requires": { + "source-list-map": "~0.1.7", + "source-map": "~0.4.1" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "webpack-dev-middleware": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.0.tgz", + "integrity": "sha1-007++y7dp+HTtdvgcolRMhllFwk=", + "dev": true, + "requires": { + "memory-fs": "~0.4.1", + "mime": "^1.3.4", + "path-is-absolute": "^1.0.0", + "range-parser": "^1.0.3", + "time-stamp": "^2.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "webpack-dev-server": { + "version": "1.16.5", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-1.16.5.tgz", + "integrity": "sha1-DL1fLSrI1OWTqs1clwLnu9XlmJI=", + "dev": true, + "requires": { + "compression": "^1.5.2", + "connect-history-api-fallback": "^1.3.0", + "express": "^4.13.3", + "http-proxy-middleware": "~0.17.1", + "open": "0.0.5", + "optimist": "~0.6.1", + "serve-index": "^1.7.2", + "sockjs": "^0.3.15", + "sockjs-client": "^1.0.3", + "stream-cache": "~0.0.1", + "strip-ansi": "^3.0.0", + "supports-color": "^3.1.1", + "webpack-dev-middleware": "^1.10.2" + }, + "dependencies": { + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "websocket-driver": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", + "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "dev": true, + "requires": { + "http-parser-js": ">=0.4.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.2.tgz", + "integrity": "sha1-Dhh4HeYpoYMIzhSBZQ9n/6JpOl0=", + "dev": true + }, + "whatwg-fetch": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", + "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=" + }, + "whet.extend": { + "version": "0.9.9", + "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", + "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=", + "dev": true + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "ws": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz", + "integrity": "sha1-iiRPoFJAHgjJiGz0SoUYnh/UBn8=", + "requires": { + "options": ">=0.0.5", + "ultron": "1.0.x" + } + }, + "wtf-8": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz", + "integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=" + }, + "xml-char-classes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", + "integrity": "sha1-ZGV4SKIP/F31g6Qq2KJ3tFErvE0=", + "dev": true + }, + "xmlhttprequest-ssl": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", + "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=" + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" + } + } +} diff --git a/web/package.json b/web/package.json new file mode 100644 index 0000000..799df94 --- /dev/null +++ b/web/package.json @@ -0,0 +1,82 @@ +{ + "name": "promviz-front", + "version": "0.1.0", + "description": "promviz front", + "author": "Yusuke Otsuka ", + "scripts": { + "clean": "rimraf dist && mkdirp dist", + "lint": "eslint src --ext .js --ext .jsx --fix", + "copy:fonts": "cpx \"./node_modules/source-sans-pro/**/*\" ./dist/fonts", + "copy:json": "cpx \"./src/*.json\" ./dist", + "dev-server": "webpack-dev-server --host=0.0.0.0 --content-base dist/ --history-api-fallback", + "dev": "npm-run-all clean --parallel copy:* dev-server", + "validate": "npm ls", + "dist": "npm run clean && npm run copy:fonts && npm run copy:json && webpack", + "start": "npm run dist && node server.js" + }, + "engines": { + "node": "~4.4.0" + }, + "license": "Apache-2.0", + "dependencies": { + "bootstrap": "^3.3.7", + "express": "^4.16.2", + "flux": "^3.1.0", + "hammerjs": "^2.0.8", + "jquery": "^3.1.1", + "keymirror": "^0.1.1", + "keypress.js": "2.1.0-1", + "lodash": "^4.17.10", + "numeral": "^1.5.3", + "query-string": "^4.2.3", + "react": "^15.3.2", + "react-addons-shallow-compare": "^15.3.2", + "react-bootstrap": "^0.30.6", + "react-checkbox-group": "^3.3.1", + "react-dom": "^15.6.1", + "react-highcharts": "^12.0.0", + "react-virtualized": "^8.2.0", + "socket.io-client": "^1.5.1", + "source-sans-pro": "^2.0.10", + "superagent": "^3.8.3", + "tween.js": "^16.3.5", + "vizceral-react": "^4.5.5", + "webfontloader": "^1.6.26" + }, + "devDependencies": { + "babel-core": "^6.26.3", + "babel-eslint": "^7.1.0", + "babel-loader": "^6.2.7", + "babel-preset-es2015": "^6.18.0", + "babel-preset-react": "^6.16.0", + "babel-preset-stage-0": "^6.16.0", + "cpx": "^1.5.0", + "css-loader": "^0.26.0", + "dotenv-webpack": "^1.5.4", + "eslint": "^3.9.0", + "eslint-config-airbnb-base": "^10.0.1", + "eslint-loader": "^1.6.0", + "eslint-plugin-import": "^2.0.1", + "eslint-plugin-jsx-a11y": "^3.0.1", + "eslint-plugin-react": "^6.4.1", + "file-loader": "^0.9.0", + "html-loader": "^0.4.4", + "html-webpack-plugin": "^2.24.0", + "mkdirp": "^0.5.1", + "npm-run-all": "^3.1.1", + "precommit-hook": "^3.0.0", + "rimraf": "^2.5.4", + "style-loader": "^0.13.1", + "url-loader": "^0.5.7", + "webpack": "^1.13.3", + "webpack-dev-server": "^1.16.2" + }, + "repository": { + "type": "git", + "url": "git@github.com:mjhd-devlion/promviz-front.git" + }, + "pre-commit": [ + "lint", + "test" + ] +} diff --git a/web/server.js b/web/server.js new file mode 100644 index 0000000..85bf958 --- /dev/null +++ b/web/server.js @@ -0,0 +1,13 @@ +var path = require('path'); +var express = require('express'); + +var DIST_DIR = path.join(__dirname, 'dist'); +var PORT = 8080; +var app = express(); + +app.use(express.static(DIST_DIR)); +app.get('*', function(req, res) { + res.sendFile(path.join(DIST_DIR, 'index.html')); +}); + +app.listen(PORT); diff --git a/web/src/app.css b/web/src/app.css new file mode 100644 index 0000000..3a68b63 --- /dev/null +++ b/web/src/app.css @@ -0,0 +1,380 @@ +html { + min-height: 100%; + height:100%; +} +body { + position: relative; + background-color: var(--colorPageBackground); + color: var(--colorText); + font-family: 'Verdana'; + font-weight: 400; + font-style: normal; + height: 100%; +} + +.color-normal, .severity0 { + color: var(--colorWhite); +} + +.color-warning, .severity1 { + color: var(--colorWarning); +} + +.color-danger, .severity2 { + color: var(--colorDanger); +} + +.disabled { + color: var(--colorTextDisabled); +} + +/* Custom page CSS +-------------------------------------------------- */ +body > .container { + position: absolute; + top: 51px; + padding-left: 0; + padding-right: 0; + margin-left: 0; + margin-right: 0; + bottom: 0; + left: 0; + right: 0; + width: 100%; +} + +.container .text-muted { + margin: 20px 0; +} + +.navbar { + background-color: var(--colorNormalDonut); +} + +.navbar-brand { + color: #fff !important; + font-weight: 200; + text-shadow: 0 1px 1px #333; +} + +.navbar-text { + color: #fff !important; + font-weight: 200; +} + +/* Feedback +-------------------------------------------------- */ +.glyphicon-comment { + top: 3px; + padding-right: 5px; +} + +#feedback { + padding-right: 25px; +} + +/* Traffic +-------------------------------------------------- */ +.vizceral-container { + height: 100%; + position: relative; +} + +.service-traffic-map { + position: absolute; + top: 87px; + bottom: 0; + left: 0; + right: 0; +} + +.hidden { + display: none; +} + +.clickable { + cursor: pointer; +} + +:root, .vizceral { + --colorText: rgb(70,107,176); + --colorTextDisabled: rgb(129, 129, 129); + --colorNormal: rgb(70,107,176); + --colorWhite: rgb(255,255,255); + --colorWarning: rgb(268, 185, 73); + --colorDanger: rgb(184, 36, 36); + --colorNormalDimmed: rgb(101, 117, 128); + --colorBackgroundDark: rgb(70,107,176); + --colorNormalDonut: rgb(70,107,176); + --colorInactive: rgb(186, 213, 237); + --colorLabelBorder: rgb(16, 17, 18); + --colorLabelText: rgb(0, 0, 0); + --colorDonutInternalColor: rgb(70,107,176); + --colorDonutInternalColorHighlighted: rgb(255, 255, 255); + --colorConnectionLine: rgb(91, 91, 91); + --colorPageBackground: rgb(255, 255, 255); + --colorPageBackgroundTransparent: rgba(255, 255, 255, 0); + --colorBorderLines: rgb(137, 137, 137); + --colorDetailsPanel: rgb(70,107,176); +} + +/* Subheader +-------------------------------------------------- */ +.subheader { + padding: 5px 15px 0 15px; + color: var(--colorBorderLines); + height: 45px; + border-bottom: 1px solid var(--colorBorderLines); +} + +.subheader > div { + display: inline-block; +} + +.date-time-slider-container { + height: 45px; +} + +/* STEPPER */ +.stepper { + list-style: none; + margin: 0; + padding: 0; + display: table; + table-layout: fixed; + width: 100%; + color: var(--colorNormalDonut); +} +.stepper > li { + position: relative; + display: table-cell; + text-align: center; + font-size: 0.8em; + cursor: pointer; +} +.stepper > li:before { + content: attr(data-step); + display: block; + margin: 0 auto; + background: var(--colorInactive); + width: 1.3em; + height: 1.3em; + text-align: center; + margin-bottom: 0.25em; + line-height: 1.3em; + border-radius: 100%; + position: relative; + z-index: 1000; +} +.stepper > li:after { + content: ''; + position: absolute; + display: block; + background: var(--colorInactive); + width: 100%; + height: 0.4em; + top: 0.45em; + left: 50%; + z-index: -1; +} +.stepper > li:last-child:after { + display: none; +} +.stepper > li.is-lower { + color: var(--colorNormal); +} +.stepper > li.is-lower:before { + color: #FFF; + background: var(--colorNormal); +} +.stepper > li.is-lower:after { + color: #FFF; +} +.stepper > li.show-bar:after { + background: var(--colorNormal); +} +.stepper > li.is-current { + color: var(--colorNormal); +} +.stepper > li.is-current:before { + color: #FFF; + background: var(--colorNormal); +} +/* END STEPPER */ + +.subsection { + padding-left: 15px; + padding-right: 15px; + padding-bottom: 10px; +} + +.panel-default > .panel-heading { + background-color: rgb(87, 87, 87); + color: var(--colorWhite); + border-top-left-radius: 0; + border-top-right-radius: 0; + border-left-width: 0; +} + +.panel-default > .panel-body, +.panel-group .panel-heading + .panel-collapse > .panel-body { + border-top-color: var(--colorBorderLines); + padding-left: 17px; +} + +.panel-body { + padding: 0; +} + +.panel-group { + margin-bottom: 0; +} + +.panel-group .panel { + background-color: transparent; + border-radius: 0; + border-top: 1px solid var(--colorBorderLines); + border-bottom: 0; + border-left: 0; + border-right: 0; +} + +.panel-group:last-of-type .panel:last-of-type { + border-bottom: 1px solid var(--colorBorderLines); +} + +.ReactVirtualized__Table__headerColumn:first-of-type, .ReactVirtualized__Table__rowColumn:first-of-type { + margin-left: 0 !important; +} + +.ReactVirtualized__Table__headerColumn:focus, .ReactVirtualized__Table__Grid:focus { + outline: none; +} +.ReactVirtualized__Table__row { + border-bottom: 1px solid var(--colorBorderLines); +} + +.ReactVirtualized__Table__headerColumn:last-of-type, .ReactVirtualized__Table__rowColumn:last-of-type { + margin-right: 0 !important; +} + +.ReactVirtualized__Table__headerRow { + text-transform: none !important; + border-bottom: 2px solid; +} + +a.accordion-toggle { + text-decoration: none; +} + +/* SPINNER */ +@keyframes spinner { + to {transform: rotate(360deg);} +} + +@-webkit-keyframes spinner { + to {-webkit-transform: rotate(360deg);} +} + +.inline-spinner { + min-width: 30px; + min-height: 2px; + position: relative; + display: inline-block; +} + +.inline-spinner:after { + content: 'Loading…'; + position: absolute; + top: 50%; + left: 50%; + width: 13px; + height: 13px; + margin-top: -10px; + margin-left: -10px; +} + +.inline-spinner:not(:required):after { + content: ''; + border-radius: 50%; + border: 2px solid rgba(129, 129, 129, .3); + border-top-color: rgba(129, 129, 129, .6); + animation: spinner .6s linear infinite; + -webkit-animation: spinner .6s linear infinite; + -moz-animation: spinner .6s linear infinite; +} +/* END SPINNER */ + +.clear-link-styles, .clear-link-styles:hover, .clear-link-styles:active, .clear-link-styles:visited { + color: inherit; + text-decoration: inherit; +} + +#links-popover .popover-content { + color: rgb(172, 182, 187); + text-align: right; + width: 100px; +} + +.links-popover-title { + font-size: 10px; +} + +.links-popover-link, .links-popover-link a, .links-popover-link a:active, .links-popover-link a:hover, .links-popover-link a:visited { + color: rgb(110, 104, 99); + cursor: pointer; + font-size: 12px; + text-decoration: none; +} + +.popover { + border-radius: 3px !important; + font-family: 'Source Sans Pro', sans-serif !important; +} + +.popover-content { + padding: 6px 8px !important; +} + +.table-borderless tbody tr td, .table-borderless tbody tr th, .table-borderless thead tr th { + border: none; + padding: 0; +} + +.tooltip-inner { + max-width: 250px; + font-family: 'Source Sans Pro', sans-serif !important; + line-height: 1.5em; +} + +.tooltip-inner .table { + margin-bottom: 0; +} + +.tooltip-inner .header { + margin: 0; + font-weight: 700; +} + +.alert { + padding: 5px 10px; + position: absolute; + left: 100px; + top: -42px; + z-index: 99999; +} + +.alert-info { + color: #000000; + background-color: var(--colorNormal); +} + +.alert-dismissable .close { + top: -1px; + right: -5px; +} + +.vizceral .vizceral-notice { + background-color: var(--colorPageBackground); + border-left: 2px solid var(--colorNormal) ; +} \ No newline at end of file diff --git a/web/src/app.jsx b/web/src/app.jsx new file mode 100644 index 0000000..1d79379 --- /dev/null +++ b/web/src/app.jsx @@ -0,0 +1,36 @@ +/* global process */ + +'use strict'; + +import 'bootstrap'; +import 'bootstrap/dist/css/bootstrap.css'; +import React from 'react'; // eslint-disable-line no-unused-vars +import ReactDOM from 'react-dom'; +import WebFont from 'webfontloader'; + +import './app.css'; +import TrafficFlow from './components/trafficFlow'; + +const updateURL = process.env.UPDATE_URL; +const interval = Number(process.env.INTERVAL); +const maxReplayOffset = Number(process.env.MAX_REPLAY_OFFSET); + +function fontsActive () { + ReactDOM.render( + , + document.getElementById('traffic') + ); +} + +// Only load the app once we have the webfonts. +// This is necessary since we use the fonts for drawing on Canvas'... + +// imports are loaded and elements have been registered + +WebFont.load({ + custom: { + families: ['Source Sans Pro:n3,n4,n6,n7'], + urls: ['/fonts/source-sans-pro.css'] + }, + active: fontsActive +}); diff --git a/web/src/appConstants.js b/web/src/appConstants.js new file mode 100644 index 0000000..9cb4506 --- /dev/null +++ b/web/src/appConstants.js @@ -0,0 +1,25 @@ +'use strict'; + +import keymirror from 'keymirror'; + +const AppConstants = { + ActionTypes: keymirror({ + SERVER_ACTION: null, + VIEW_ACTION: null, + + UPDATE_FILTER: null, + UPDATE_DEFAULT_FILTERS: null, + RESET_FILTERS: null, + CLEAR_FILTERS: null, + + UPDATE_TRAFFIC: null, + CLEAR_TRAFFIC: null, + UPDATE_TRAFFIC_OFFSET: null + }), + ServerStatus: keymirror({ + DISCONNECTED: null, + CONNECTED: null + }) +}; + +export default AppConstants; diff --git a/web/src/appDispatcher.js b/web/src/appDispatcher.js new file mode 100644 index 0000000..a497b4f --- /dev/null +++ b/web/src/appDispatcher.js @@ -0,0 +1,16 @@ +'use strict'; + +import { Dispatcher } from 'flux'; + +class AppDispatcher extends Dispatcher { + handleAction (action) { + this.dispatch({ + source: 'VIEW_ACTION', + action: action + }); + } +} + +const appDispatcher = new AppDispatcher(); + +export default appDispatcher; diff --git a/web/src/components/breadcrumbs.css b/web/src/components/breadcrumbs.css new file mode 100644 index 0000000..076cd02 --- /dev/null +++ b/web/src/components/breadcrumbs.css @@ -0,0 +1,29 @@ +.breadcrumbs ol { + list-style: none; + margin: 0; + padding: 0; +} + +.breadcrumbs li { + color: var(--colorNormal); + font-weight: 200; + font-size: 20px; + display: inline; +} + +.breadcrumbs li:last-of-type { + font-weight: 600; +} + +.breadcrumbs li a { + color: var(--colorNormal); + text-decoration: none; +} + +.breadcrumbs li:after { + content: ' / '; +} + +.breadcrumbs li:last-child:after { + content: none; +} diff --git a/web/src/components/breadcrumbs.jsx b/web/src/components/breadcrumbs.jsx new file mode 100644 index 0000000..4ddfb20 --- /dev/null +++ b/web/src/components/breadcrumbs.jsx @@ -0,0 +1,60 @@ +'use strict'; + +import React from 'react'; + +import './breadcrumbs.css'; + +class Breadcrumbs extends React.Component { + constructor (props) { + super(props); + this.state = { + }; + } + + handleClick (index) { + const newState = this.props.navigationStack.slice(0, index + 1); + this.props.navigationCallback(newState); + } + + shouldComponentUpdate (nextProps) { + if (nextProps.navigationStack) { + if (nextProps.navigationStack.length !== this.props.navigationStack) { + return true; + } + + for (let i = 0; i < this.props.navigationStack.length; i++) { + if (nextProps.navigationStack[i] !== this.props.navigationStack[i]) { + return true; + } + } + } + return false; + } + + render () { + const navStack = this.props.navigationStack.slice() || []; + navStack.unshift(this.props.rootTitle); + + return ( + + ); + } +} + +Breadcrumbs.propTypes = { + rootTitle: React.PropTypes.string.isRequired, + navigationStack: React.PropTypes.array.isRequired, + navigationCallback: React.PropTypes.func.isRequired +}; + +export default Breadcrumbs; diff --git a/web/src/components/connectionChart.jsx b/web/src/components/connectionChart.jsx new file mode 100644 index 0000000..12dba1b --- /dev/null +++ b/web/src/components/connectionChart.jsx @@ -0,0 +1,190 @@ +'use strict'; + +import _ from 'lodash'; +import React from 'react'; + +import ReactHighcharts from 'react-highcharts'; + +import trafficStore from './trafficStore'; + +const defaultConfig = { + global: { + timezoneOffset: (new Date()).getTimezoneOffset() + }, + chart: { + type: 'area', + width: 300, + height: 400, + backgroundColor: '#466bb0' + }, + title: '', + xAxis: [{ + categories: [], + type: 'datetime', + crosshair: false, + labels: { + format: '{value:%m/%d %H:%M:%S}', + step: 0, + style: { + color: '#ffffff' + } + }, + tickInterval: 60 * 1000 // 1 minute + }], + yAxis: [{ + title: { + text: 'count', + labels: { + format: '{value:%.2f}', + style: { + color: '#ffffff' + } + } + }, + labels: { + style: { + color: '#ffffff' + } + } + }], + tooltip: { + shared: true, + xDateFormat: '%Y/%m/%d %H:%M:%S', + pointFormat: '\u25CF {series.name}: {point.y:%.2f}
    ' + }, + plotOptions: { + area: { + marker: { + enabled: false, + symbol: 'circle', + radius: 1, + states: { + hover: { + enabled: true + } + } + } + } + }, + series: [{ + name: 'RPS', + data: history.total, + color: '#BAD5ED' + }, + { + name: 'errors', + data: history.errors, + color: '#B82424' + }], + legend: { + itemStyle: { + color: '#D6D6D6' + } + } +}; + +class ConnectionChart extends React.Component { + constructor (props) { + super(props); + + const config = props.config ? _.merge(defaultConfig, props.config) : defaultConfig; + config.chart.width = props.width; + config.chart.height = props.height; + + if (config.global) { + ReactHighcharts.Highcharts.setOptions({ + global: config.global + }); + } + + this.state = { + connection: props.connection, + config: config, + initialized: false + }; + } + + getHistory (region, source, target, until) { + const connectionHistory = trafficStore.getConnectionHistoryRange(region, source, target, 0, until); + + const totalHistory = _.map(connectionHistory, connection => ({ + x: connection.updated, + y: (connection.metrics.normal || 0) + (connection.metrics.warning || 0) + (connection.metrics.danger || 0), + })); + + const errorsHistory = _.map(connectionHistory, connection => ({ + x: connection.updated, + y: connection.metrics.danger || 0 + })); + + return { total: totalHistory, errors: errorsHistory }; + } + + offsetChanged = () => { + this.setState({ initialized: false }); + }; + + componentDidMount () { + trafficStore.addOffsetChangeListener(this.offsetChanged); + } + + componentWillReceiveProps (nextProps) { + const connection = nextProps.connection; + + const chart = this.chart.getChart(); + const updated = trafficStore.getLastUpdatedServerTime(); + + this.setState({ + connection: nextProps.connection + }); + + if (!this.state.initialized || + this.state.connection.source.name !== nextProps.connection.source.name || + this.state.connection.target.name !== nextProps.connection.target.name) { + const history = this.getHistory( + nextProps.region || this.state.region, + nextProps.connection.source.name, + nextProps.connection.target.name, + updated + ); + + chart.series[0].setData(history.total); + chart.series[1].setData(history.errors); + + if (!this.state.initialized) { + this.setState({ initialized: true }); + } + chart.redraw(); + return; + } + + const shift = chart.series[0].data.length > trafficStore.getMaxHistoryLength(); + + chart.series[0].addPoint({ + x: updated, + y: connection.getVolumeTotal() + }, false, shift, false); + chart.series[1].addPoint({ + x: updated, + y: connection.getVolume('danger') || 0 + }, false, shift, false); + + chart.redraw(); + } + + render () { + return ( +
    + { this.chart = chart; }}> +
    + ); + } +} + +ConnectionChart.propTypes = { + region: React.PropTypes.string.isRequired, + connection: React.PropTypes.object.isRequired, + config: React.PropTypes.object +}; + +export default ConnectionChart; diff --git a/web/src/components/connectionList.jsx b/web/src/components/connectionList.jsx new file mode 100644 index 0000000..023a3db --- /dev/null +++ b/web/src/components/connectionList.jsx @@ -0,0 +1,154 @@ +'use strict'; + +import _ from 'lodash'; +import React from 'react'; +import numeral from 'numeral'; +import { Table, Column, SortDirection } from 'react-virtualized'; +import 'react-virtualized/styles.css'; + +const nameRenderer = function (data) { + let className = 'glyphicon glyphicon-warning-sign'; + const mostSevereNotice = data.rowData.notices && data.rowData.notices.length > 0 && _.maxBy(data.rowData.notices, notice => notice.severity); + if (mostSevereNotice) { + className += ` severity${mostSevereNotice.severity}`; + } + + const styles = { + paddingLeft: '5px', + opacity: data.rowData.disabled ? 0.3 : undefined + }; + + return ( + + {data.cellData} + { + mostSevereNotice ? + + : undefined + } + ); +}; + +const totalRenderer = function (data) { + return ( + {numeral(data.rowData.total || 0).format('0.[00]')} + ); +}; + +const errorRenderer = function (data) { + return ( + {numeral(data.rowData.errorRate || 0).format('0.[00]%')} + ); +}; + +const sorters = { + name: (a, b) => { + if (a.disabled && !b.disabled) { return 1; } + if (!a.disabled && b.disabled) { return -1; } + if (a.name < b.name) { return 1; } + if (a.name > b.name) { return -1; } + return 0; + }, + total: (a, b) => { + if (a.disabled && !b.disabled) { return 1; } + if (!a.disabled && b.disabled) { return -1; } + if (a.total < b.total) { return 1; } + if (a.total > b.total) { return -1; } + return 0; + }, + errorRate: (a, b) => { + if (a.disabled && !b.disabled) { return 1; } + if (!a.disabled && b.disabled) { return -1; } + if (a.errorRate < b.errorRate) { return 1; } + if (a.errorRate > b.errorRate) { return -1; } + return 0; + } +}; + +class ConnectionList extends React.Component { + constructor (props) { + super(props); + this.state = { + connections: props.connections, + sortBy: 'errorRate', + sortDirection: SortDirection.ASC + }; + } + + componentWillReceiveProps (nextProps) { + this.setState({ + connections: nextProps.connections + }); + } + + render () { + const headerHeight = 30; + let estimatedRowHeight = 25; + const maxTableHeight = 300; + const connectionRows = this.state.connections.map((connection) => { + const errors = connection.getVolume('danger'); + const total = connection.getVolumeTotal(); + const disabled = !connection.isVisible(); + + const classNames = []; + if (disabled) { + classNames.push('disabled'); + } else if (connection.class) { + classNames.push(`color-${connection.class}`); + } + + return { + name: this.props.direction === 'incoming' ? connection.source.getName() : connection.target.getName(), + errorRate: errors / total || 0, + errors: errors, + total: total, + className: classNames.join(' '), + disabled: disabled, + notices: connection.notices + }; + }); + + connectionRows.sort(sorters[this.state.sortBy]); + if (this.state.sortDirection !== SortDirection.ASC) { _.reverse(connectionRows); } + + if (this.refs.flexTable && this.refs.flexTable.props.estimatedRowSize) { + estimatedRowHeight = this.refs.flexTable.props.estimatedRowSize - 4; + } + const tableHeight = Math.min(maxTableHeight, (estimatedRowHeight * connectionRows.length) + headerHeight); + + + return ( + connectionRows.length > 0 ? +
    + connectionRows[index]} + sortBy={this.state.sortBy} + sortDirection={this.state.sortDirection} + sort={this.sort} + > + + + +
    +
    + : None. + ); + } + + sort = ({ sortBy, sortDirection }) => { + this.setState({ sortBy, sortDirection }); + } +} + +ConnectionList.propTypes = { + direction: React.PropTypes.string.isRequired, + connections: React.PropTypes.array.isRequired +}; + +export default ConnectionList; diff --git a/web/src/components/controls.css b/web/src/components/controls.css new file mode 100644 index 0000000..7a8fc37 --- /dev/null +++ b/web/src/components/controls.css @@ -0,0 +1,41 @@ +.vizceral-control { + padding: 5px 10px 5px 10px; + border-bottom: 1px solid var(--colorBorderLines); + width: 100%; +} + +.vizceral-control span { + padding-right: 5px; +} + +.vizceral-controls-panel div, .vizceral-controls-panel input[type=range] { + display: block; +} + +.vizceral-controls-panel input[type=checkbox] { + padding: 0 3px 0 3px; +} + +.vizceral-controls-panel input[type=radio] { + margin-right: 5px; +} + +.vizceral-controls-panel .radio-control:not(:first-child) { + margin-left: 5px; +} + + +.vizceral-control-group-title { + display: inline-block; + background-color: var(--colorPageBackground); + margin-left: 10px; + font-weight: 600; +} + +.vizceral-control-group { + border: 2px solid var(--colorBorderLines); + margin-top: -0.7em; + margin-bottom: 5px; + padding-top: 0.3em; + padding-left: 10px; +} diff --git a/web/src/components/customVizceral.jsx b/web/src/components/customVizceral.jsx new file mode 100644 index 0000000..bcb1fc2 --- /dev/null +++ b/web/src/components/customVizceral.jsx @@ -0,0 +1,55 @@ +'use strict'; + +import _ from 'lodash'; + +import Vizceral from 'vizceral-react'; +import React from 'react'; + +class CustomVizceral extends Vizceral { + constructor (props) { + super(props); + + this.state = { + styles: {} + }; + } + + shouldComponentUpdate (nextProps) { + if (nextProps.styles) { + if (this.shouldStylesUpdate(nextProps.styles)) { + this.setState({ styles: nextProps.styles }); + this.vizceral.updateStyles({ colorTraffic: nextProps.styles }); + this.refreshNodes(); + } + } + return true; + } + + refreshNodes () { + if (!(this.vizceral.currentGraph && this.vizceral.currentGraph.nodes)) { + return; + } + _.map(this.vizceral.currentGraph.nodes, (value) => { + if (value.view) { + value.view.refresh(true); + } + }); + } + + shouldStylesUpdate (styles) { + const currentKeys = Object.keys(this.state.styles).sort(); + const newKeys = Object.keys(styles).sort(); + + if (currentKeys.toString() === newKeys.toString()) { + return false; + } + + return !_.every(newKeys, key => styles[key] === this.state.styles[key]); + } +} + +CustomVizceral.propTypes = { + styles: React.PropTypes.object +}; + +export default CustomVizceral; diff --git a/web/src/components/detailsPanel.css b/web/src/components/detailsPanel.css new file mode 100644 index 0000000..8a77d99 --- /dev/null +++ b/web/src/components/detailsPanel.css @@ -0,0 +1,115 @@ +/* Details Panel +-------------------------------------------------- */ +.details-panel { + background-color: var(--colorDetailsPanel); + border: 1px solid var(--colorBorderLines); + color: var(--colorWhite); + border-radius: 3px; + width: 350px; + /*height: 100%;*/ + position: absolute; + right: 25px; + top: 25px; + bottom: 25px; +} + +.details-panel-collapsed { + width: 0; +} + +.details-panel-title { + padding-top: 10px; + padding-bottom: 10px; + font-size: 21px; + font-weight: 600; + color: var(--colorWhite); + border-bottom: 1px solid var(--colorBorderLines); +} + +.details-panel-subtitle { + margin-left: -10px; +} + +.details-panel-description { + padding-top: 5px; + padding-bottom: 10px; + color: var(--colorWhite); +} + +.details-panel-close { + font-family: 'Glyphicons Halflings'; /* essential for enabling glyphicon */ + content: "\e114"; + font-size: 12px; + position:absolute; + top: 6px; + right: 10px; + padding: 10px 5px 0 10px; + cursor: pointer; +} + +.details-panel-subpanel .panel-group .panel { + border-left: 0; + border-right: 0; + color: var(--colorWhite); +} + +.details-panel-subpanel .panel-title { + height: 18px; + font-size: 16px; + font-weight: 600; + color: var(--colorWhite); +} + +.details-panel-subpanel .panel-title .badge { + margin-top: -3px; + color: var(--colorWhite); +} + +.metric { + color: var(--colorWhite); +} + +.metric-title { + color: var(--colorWhite); +} + +.metric-query { + width: 100%; + word-wrap: break-word; +} + +.table-container > .table > thead > tr > th { + padding: 0; + border-bottom: none; +} + +.connection-list .table-container { + max-height: 200px; + overflow: auto; +} + +.connection-list .ReactVirtualized__Table__row:focus { + outline:0; +} + +.table-header > .table > thead > tr > th { + padding: 5px; +} + +.react-bs-container .table-header { + height: 30px; +} + +.react-bs-container .table-container > table { + margin-top: -25px !important; +} + +.table-container > table > tbody > tr > td { + line-height: 20px !important; +} + +.zoom-icon { + font-size: 16px; + color: var(--colorWhite); + padding-left: 5px; +} diff --git a/web/src/components/detailsPanelConnection.jsx b/web/src/components/detailsPanelConnection.jsx new file mode 100644 index 0000000..b8abb6c --- /dev/null +++ b/web/src/components/detailsPanelConnection.jsx @@ -0,0 +1,69 @@ +/* eslint no-restricted-syntax: 0 */ + +'use strict'; + +import React from 'react'; +import numeral from 'numeral'; + +import Notices from './notices'; +import ConnectionChart from './connectionChart'; + +import './detailsPanel.css'; + +class DetailsPanelConnection extends React.Component { + constructor (props) { + super(props); + this.state = { + region: props.region, + connection: props.connection + }; + } + + componentWillReceiveProps (nextProps) { + this.setState({ + region: nextProps.region, + connection: nextProps.connection + }); + } + + render () { + const connection = this.state.connection; + const notices = (connection && connection.notices) || []; + + const total = connection.getVolumeTotal(); + const errors = connection.getVolume('danger') || 0; + const errorRate = errors / total || 0; + + return ( +
    +
    +
    {connection.getName()} +
    +
    + +
    +
    +
    + RPS: {`${numeral(total).format('0.[00]')}`}
    + Error: {`${numeral(errorRate * 100).format('0.[00]')}`}% +
    + + +
    + ); + } +} + +DetailsPanelConnection.propTypes = { + closeCallback: React.PropTypes.func.isRequired, + connection: React.PropTypes.object.isRequired, + nodeClicked: React.PropTypes.func, + region: React.PropTypes.string +}; + +DetailsPanelConnection.defaultProps = { + nodeClicked: () => {}, + region: '' +}; + +export default DetailsPanelConnection; diff --git a/web/src/components/detailsPanelNode.jsx b/web/src/components/detailsPanelNode.jsx new file mode 100644 index 0000000..b82c0e3 --- /dev/null +++ b/web/src/components/detailsPanelNode.jsx @@ -0,0 +1,81 @@ +'use strict'; + +import React from 'react'; + +import ConnectionList from './connectionList'; +import DetailsSubpanel from './detailsSubpanel'; +import Notices from './notices'; + +import './detailsPanel.css'; + +class DetailsPanelNode extends React.Component { + constructor (props) { + super(props); + this.state = { + node: props.node, + region: props.region, + description: undefined + }; + } + + componentWillReceiveProps (nextProps) { + const newState = { + region: nextProps.region, + node: nextProps.node + }; + + if (this.state.region !== nextProps.region || this.state.node.getName() !== nextProps.node.getName()) { + newState.description = undefined; + } + + this.setState(newState); + } + + render () { + const node = this.state.node; + const notices = (node && node.notices) || []; + let zoomClassName = 'glyphicon clickable zoom-icon '; + zoomClassName += this.props.nodeSelected ? 'glyphicon-log-out' : 'glyphicon-log-in'; + const zoomTitle = `Zoom ${this.props.nodeSelected ? 'out of' : 'into'} node view`; + + return ( +
    +
    +
    {node.getName()} {node.class} + { node && node.nodes && node.nodes.length > 0 ? + + : undefined} +
    +
    + +
    +
    + + { node && !node.isEntryNode() ? + + this.props.nodeClicked(clickedNode)} /> + + : undefined } + + this.props.nodeClicked(clickedNode)} /> + +
    + ); + } +} + +DetailsPanelNode.propTypes = { + closeCallback: React.PropTypes.func.isRequired, + zoomCallback: React.PropTypes.func.isRequired, + node: React.PropTypes.object.isRequired, + nodeClicked: React.PropTypes.func, + nodeSelected: React.PropTypes.bool.isRequired, + region: React.PropTypes.string +}; + +DetailsPanelNode.defaultProps = { + nodeClicked: () => {}, + region: '' +}; + +export default DetailsPanelNode; diff --git a/web/src/components/detailsSubpanel.jsx b/web/src/components/detailsSubpanel.jsx new file mode 100644 index 0000000..6a5afd8 --- /dev/null +++ b/web/src/components/detailsSubpanel.jsx @@ -0,0 +1,60 @@ +'use strict'; + +import React from 'react'; + +class DetailsSubpanel extends React.Component { + constructor (props) { + super(props); + this.state = { + expanded: props.expanded ? props.expanded : false + }; + } + + componentWillReceiveProps (nextProps) { + if (nextProps.expanded !== undefined) { + this.setState({ expanded: nextProps.expanded }); + } + } + + render () { + const badge = this.props.badge; + const title = this.props.title.replace(/\s/g, '_'); + const headingId = `${title}Heading`; + const collapseId = `collapse${title}`; + + const expanded = this.state.expanded; + const iconClass = `glyphicon ${expanded ? 'glyphicon-chevron-down' : 'glyphicon-chevron-right'}`; + const iconStyle = { + fontSize: '12px', + paddingRight: expanded ? '5px' : undefined + }; + return ( + + ); + } +} + +DetailsSubpanel.propTypes = { + title: React.PropTypes.string.isRequired, + expanded: React.PropTypes.bool, + badge: React.PropTypes.number +}; + +export default DetailsSubpanel; diff --git a/web/src/components/displayOptions.jsx b/web/src/components/displayOptions.jsx new file mode 100644 index 0000000..b4ec720 --- /dev/null +++ b/web/src/components/displayOptions.jsx @@ -0,0 +1,50 @@ +'use strict'; + +import React from 'react'; + +class DisplayOptions extends React.Component { + constructor (props) { + super(props); + this.state = { + allowDraggingOfNodes: false, + showLabels: true + }; + } + + componentWillReceiveProps (nextProps) { + this.setState(nextProps.options); + } + + _onCheckBoxChanged (event) { + const checkBox = event.target; + const statePropName = checkBox.id; + const newState = {}; + newState[statePropName] = checkBox.checked; + this.setState(newState); + this.props.changedCallback(newState); + } + + render () { + const allowDraggingOfNodes = this.state.allowDraggingOfNodes; + const showLabels = this.state.showLabels; + return ( +
    +
    + this._onCheckBoxChanged(event)}/> + +
    +
    + this._onCheckBoxChanged(event)}/> + +
    +
    + ); + } +} + +DisplayOptions.propTypes = { + options: React.PropTypes.object.isRequired, + changedCallback: React.PropTypes.func.isRequired +}; + +export default DisplayOptions; diff --git a/web/src/components/filterActions.js b/web/src/components/filterActions.js new file mode 100644 index 0000000..d696f6c --- /dev/null +++ b/web/src/components/filterActions.js @@ -0,0 +1,29 @@ +'use strict'; + +import AppDispatcher from '../appDispatcher'; +import AppConstants from '../appConstants'; + +export default { + updateFilter: (filters) => { + AppDispatcher.handleAction({ + actionType: AppConstants.ActionTypes.UPDATE_FILTER, + data: filters + }); + }, + updateDefaultFilters: (defaults) => { + AppDispatcher.handleAction({ + actionType: AppConstants.ActionTypes.UPDATE_DEFAULT_FILTERS, + data: defaults + }); + }, + resetFilters: () => { + AppDispatcher.handleAction({ + actionType: AppConstants.ActionTypes.RESET_FILTERS + }); + }, + clearFilters: () => { + AppDispatcher.handleAction({ + actionType: AppConstants.ActionTypes.CLEAR_FILTERS + }); + } +}; diff --git a/web/src/components/filterControls.jsx b/web/src/components/filterControls.jsx new file mode 100644 index 0000000..c4c798e --- /dev/null +++ b/web/src/components/filterControls.jsx @@ -0,0 +1,126 @@ +'use strict'; + +import _ from 'lodash'; +import React from 'react'; +import { Checkbox, CheckboxGroup } from 'react-checkbox-group'; +import filterStore from './filterStore'; +import filterActions from './filterActions'; +import trafficStore from './trafficStore'; +import Stepper from './stepper'; + +import './controls.css'; + +class FilterControls extends React.Component { + constructor (props) { + super(props); + this.state = { + filters: filterStore.getFilters(), + states: filterStore.getStates(), + classes: [], + initialized: false + }; + } + + componentDidMount () { + filterStore.addChangeListener(this.onChangeFilters.bind(this)); + trafficStore.addChangeListener(this.onChangeTraffic.bind(this)); + } + + componentWillUnmount () { + filterStore.removeChangeListener(this.onChangeFilters.bind(this)); + trafficStore.removeChangeListener(this.onChangeTraffic.bind(this)); + } + + onChangeFilters () { + this.setState({ + filters: filterStore.getFilters() + }); + } + + onChangeTraffic () { + const traffic = trafficStore.getTraffic(); + if (!traffic.nodes) { + return; + } + + const listup = (nodes, self) => { + if (nodes && nodes.length) { + if (nodes.length <= 0) { + return []; + } + + return _.flatten(_.map(nodes, node => (node.class ? node.class : '')).concat(_.map(nodes, node => self(node.nodes, self)))); + } + return []; + }; + + let classes = listup(traffic.nodes, listup); + classes = _.sortBy(_.uniq(classes)); + + this.setState({ classes: classes }); + if (!this.state.initialized && classes.length > 0) { + setTimeout(() => { + filterActions.updateDefaultFilters({ clas: { value: classes } }); + filterActions.resetFilters(); + }, 0); + this.setState({ initialized: true }); + } + } + + rpsChanged (step) { + filterActions.updateFilter({ rps: this.state.states.rps[step].value }); + } + + errorChanged (step) { + filterActions.updateFilter({ error: this.state.states.error[step].value }); + } + + classChanged (value) { + filterActions.updateFilter({ clas: value }); + } + + noticeChanged (step) { + filterActions.updateFilter({ notice: this.state.states.notice[step].value }); + } + + resetFilters () { + filterActions.resetFilters(); + } + + render () { + const defaultFilters = filterStore.isDefault(); + + return ( +
    +
    + Connections +
    + RPS + { this.rpsChanged(step); }} /> + Error(%) + { this.errorChanged(step); }} /> + Notices + { this.noticeChanged(step); }} /> +
    + Nodes +
    + Classes + { this.classChanged(value); }}> + { + this.state.classes.map(clas => (
    )) + } +
    +
    +
    +
    + +
    +
    + ); + } +} + +FilterControls.propTypes = { +}; + +export default FilterControls; diff --git a/web/src/components/filterStore.js b/web/src/components/filterStore.js new file mode 100644 index 0000000..266c9f6 --- /dev/null +++ b/web/src/components/filterStore.js @@ -0,0 +1,228 @@ +'use strict'; + +import _ from 'lodash'; +import EventEmitter from 'events'; + +import AppDispatcher from '../appDispatcher'; +import AppConstants from '../appConstants'; + +const CHANGE_EVENT = 'change'; + +const defaultFilters = { + rps: { value: -1 }, + error: { value: -1 }, + clas: { value: [] }, + notice: { value: -1 }, +}; + +const noFilters = { + rps: { value: -1 }, + error: { value: -1 }, + clas: { value: [] }, + notice: { value: -1 }, +}; + +const store = { + filters: { + rps: { + name: 'rps', + type: 'connection', + passes: (object, value) => object.volumeTotal >= value, + value: -1 + }, + error: { + name: 'error', + type: 'connection', + passes: (object, value) => (value === -1 && !object.volumePercent.danger) || object.volumePercent.danger >= value, + value: -1 + }, + clas: { + name: 'clas', + type: 'node', + passes: (object, value) => value.length <= 0 || value.indexOf(object.class || '') >= 0, + value: [] + }, + notice: { + name: 'notice', + type: 'connection', + passes: (object, value) => { + if (!object.notices || object.notices.length === 0) { + return value === -1; + } + return _.some(object.notices, notice => notice.severity >= value); + }, + value: -1 + }, + + }, + states: { + rps: [ + { + name: 'high(>1000)', + value: 1000 + }, + { + name: '(>300)', + value: 300 + }, + { + name: '(>5)', + value: 5 + }, + { + name: 'all', + value: -1 + } + ], + error: [ + { + name: 'high(>10)', + value: 0.10 + }, + { + name: '(>5)', + value: 0.05 + }, + { + name: '(>1)', + value: 0.01 + }, + { + name: 'all', + value: -1 + } + ], + notice: [ + { + name: 'danger', + value: 2 + }, + { + name: 'warning', + value: 1 + }, + { + name: 'info', + value: 0 + }, + { + name: 'all', + value: -1 + } + ] + } +}; + +const resetDefaults = function () { + _.mergeWith(store.filters, defaultFilters, (obj, src) => { + if (_.isArray(obj)) { + return src; + } + return undefined; + }); +}; + +const clearFilters = function () { + _.mergeWith(store.filters, noFilters, (obj, src) => { + if (_.isArray(obj)) { + return src; + } + return undefined; + }); +}; + +resetDefaults(); + +class FilterStore extends EventEmitter { + constructor () { + super(); + this.requests = {}; + + AppDispatcher.register((payload) => { + const action = payload.action; + switch (action.actionType) { + case AppConstants.ActionTypes.UPDATE_FILTER: + this.updateFilters(action.data); + this.emit(CHANGE_EVENT); + break; + case AppConstants.ActionTypes.UPDATE_DEFAULT_FILTERS: + this.updateDefaultFilters(action.data); + this.emit(CHANGE_EVENT); + break; + case AppConstants.ActionTypes.RESET_FILTERS: + resetDefaults(); + this.emit(CHANGE_EVENT); + break; + case AppConstants.ActionTypes.CLEAR_FILTERS: + clearFilters(); + this.emit(CHANGE_EVENT); + break; + default: + return true; + } + return true; + }); + } + + addChangeListener (cb) { + this.on(CHANGE_EVENT, cb); + } + + removeChangeListener (cb) { + this.removeListener(CHANGE_EVENT, cb); + } + + getDefaultFilters () { + return defaultFilters; + } + + getFilters () { + return store.filters; + } + + getFiltersArray () { + return _.map(store.filters, filter => _.clone(filter)); + } + + getStates () { + return store.states; + } + + getChangedFilters () { + return _.filter(store.filters, filter => filter.value !== defaultFilters[filter.name].value); + } + + getStepFromValue (name) { + const index = _.findIndex(store.states[name], step => step.value === store.filters[name].value); + if (index === -1) { + return _.findIndex(store.states[name], step => step.value === defaultFilters[name].value); + } + return index; + } + + updateFilters (filters) { + Object.keys(filters).forEach((filter) => { + store.filters[filter].value = filters[filter]; + }); + } + + updateDefaultFilters (defaults) { + _.merge(defaultFilters, defaults); + } + + isLastClass (clas) { + return store.filters.clas.value.length === 1 && store.filters.clas.value.indexOf(clas) === 0; + } + + isDefault () { + return _.every(store.filters, filter => filter.value === defaultFilters[filter.name].value); + } + + isClear () { + return _.every(store.filters, filter => filter.value === noFilters[filter.name].value); + } +} + +const filterStore = new FilterStore(); + +export default filterStore; diff --git a/web/src/components/istio.png b/web/src/components/istio.png new file mode 100644 index 0000000000000000000000000000000000000000..c3d49546984b6f29ea154d9a05b3c7a22af3b60d GIT binary patch literal 7632 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 12.1 */ + -moz-animation: fadein 2s; /* Firefox < 16 */ + -ms-animation: fadein 2s; /* Internet Explorer */ + -o-animation: fadein 2s; /* Opera < 12.1 */ + animation: fadein 2s; +} + +.loading-image { + display: block; + + -webkit-animation: saturate 4s; /* Safari, Chrome and Opera > 12.1 */ + -moz-animation: saturate 4s; /* Firefox < 16 */ + -ms-animation: saturate 4s; /* Internet Explorer */ + -o-animation: saturate 4s; /* Opera < 12.1 */ + animation: saturate 4s; +} + +@keyframes saturate { + 0% { + filter: saturate(0); + -webkit-filter: saturate(0); + } + 50% { + filter: saturate(0); + -webkit-filter: saturate(0); + } + 100% { + filter: saturate(1); + -webkit-filter: saturate(1); + } +} + +@-moz-keyframes saturate { + 0% { filter: saturate(0); } + 50% { filter: saturate(0); } + 100% { filter: saturate(1); } +} + +@-webkit-keyframes saturate { + 0% { -webkit-filter: saturate(0); } + 50% { -webkit-filter: saturate(0); } + 100% { -webkit-filter: saturate(1); } +} + +@-o-keyframes saturate { + 0% { -webkit-filter: saturate(0); } + 50% { -webkit-filter: saturate(0); } + 100% { -webkit-filter: saturate(1); } +} + +/* Firefox < 16 */ +@-moz-keyframes fadein { + from { filter: saturate(0); } + to { filter: saturate(1); } +} + + +/* Safari, Chrome and Opera > 12.1 */ +@-webkit-keyframes fadein { + from { opacity: 0; } + to { opacity: 1; } +} + +/* Opera < 12.1 */ +@-o-keyframes fadein { + from { opacity: 0; } + to { opacity: 1; } +} + +@keyframes fadein { + from { opacity: 0; } + to { opacity: 1; } +} diff --git a/web/src/components/loadingCover.jsx b/web/src/components/loadingCover.jsx new file mode 100644 index 0000000..4c0300a --- /dev/null +++ b/web/src/components/loadingCover.jsx @@ -0,0 +1,86 @@ +'use strict'; + +import React from 'react'; +import TWEEN from 'tween.js'; + +import './loadingCover.css'; + +const logo = require('url!./istio.png'); // eslint-disable-line import/no-extraneous-dependencies + +const helperStyles = { + display: 'inline-block', + height: '100%', + verticalAlign: 'middle' +}; + +const loaderStyles = { + display: 'inline-block', + verticalAlign: 'middle', + fontSize: '1.5em', + color: '#555' +}; + + +class LoadingCover extends React.Component { + constructor (props) { + super(props); + this.state = { + show: props.show, + showing: props.show + }; + } + + componentWillReceiveProps (nextProps) { + if (nextProps.show !== this.props.show) { + if (!nextProps.show) { + // If transitioning to not show... + // TODO: Figure out how to do this with pure CSS instead of javascript + const data = { opacity: 1 }; + this.tween = new TWEEN.Tween(data) + .to({ opacity: 0 }, 1000) + .easing(TWEEN.Easing.Linear.None) + .onUpdate(() => { + this.setState({ opacity: data.opacity }); + }) + .onComplete(() => { + this.setState({ showing: false }); + }) + .start(); + } else { + // If transitioning to show... + this.setState({ showing: true }); + } + } + } + + render () { + const wrapperStyles = { + display: this.state.showing ? 'initial' : 'none' + }; + + const coverStyles = { + opacity: this.state.showing ? this.state.opacity : undefined + }; + + return ( +
    + { this.state.showing + ?
    + +
    + + Loading... +
    +
    + : undefined + } +
    + ); + } +} + +LoadingCover.propTypes = { + show: React.PropTypes.bool.isRequired +}; + +export default LoadingCover; diff --git a/web/src/components/locator.css b/web/src/components/locator.css new file mode 100644 index 0000000..9ced6a2 --- /dev/null +++ b/web/src/components/locator.css @@ -0,0 +1,8 @@ +.locator-input { + height: 24px; + width: 200px; + background-color: var(--colorPageBackground); + color: var(--colorText); + border-color: var(--colorConnectionLine); + border-radius: 4px; +} diff --git a/web/src/components/locator.jsx b/web/src/components/locator.jsx new file mode 100644 index 0000000..44a833a --- /dev/null +++ b/web/src/components/locator.jsx @@ -0,0 +1,68 @@ +'use strict'; + +import React from 'react'; + +import './locator.css'; + +const style = { + display: 'inline-block', + position: 'relative' +}; + +const listStyle = { + display: 'inline-block', + position: 'relative', + paddingRight: '5px' +}; + +class Locator extends React.Component { + constructor (props) { + super(props); + this.state = { + }; + } + + locatorChanged (value) { + this.props.changeCallback(value); + } + + clearFilterClicked () { + if (this.props.clearFilterCallback) { + this.props.clearFilterCallback(); + } + } + + render () { + const totalServices = this.props.matches.totalMatches > -1 ? this.props.matches.totalMatches : this.props.matches.total; + const filteredServices = totalServices - (this.props.matches.visibleMatches > -1 ? this.props.matches.visibleMatches : this.props.matches.visible); + + return ( +
    +
    {totalServices} services / {filteredServices} filtered   + { filteredServices > 0 ? + (show) + : undefined + } +
    +
    + { this.locatorChanged(event.currentTarget.value); }} value={this.props.searchTerm} /> + +
    +
    + ); + } +} + +Locator.propTypes = { + searchTerm: React.PropTypes.string.isRequired, + changeCallback: React.PropTypes.func.isRequired, + clearFilterCallback: React.PropTypes.func, + matches: React.PropTypes.shape({ + total: React.PropTypes.number, + totalMatches: React.PropTypes.number, + visible: React.PropTypes.number, + visibleMatches: React.PropTypes.number + }) +}; + +export default Locator; diff --git a/web/src/components/notices.jsx b/web/src/components/notices.jsx new file mode 100644 index 0000000..f24f19c --- /dev/null +++ b/web/src/components/notices.jsx @@ -0,0 +1,40 @@ +'use strict'; + +import React from 'react'; + +class Notices extends React.Component { + constructor (props) { + super(props); + this.state = { + notices: props.notices + }; + } + + componentWillReceiveProps (nextProps) { + this.setState({ + notices: nextProps.notices + }); + } + + render () { + return ( +
    Notices  + { + this.state.notices.length > 0 ? this.state.notices.map((notice) => { + let noticeTitle = notice.title; + if (notice.link) { + noticeTitle = {notice.title} ; + } + return
    {noticeTitle}
    ; + }) : (
    None
    ) + } +
    + ); + } +} + +Notices.propTypes = { + notices: React.PropTypes.array.isRequired +}; + +export default Notices; diff --git a/web/src/components/optionsPanel.css b/web/src/components/optionsPanel.css new file mode 100644 index 0000000..93a1403 --- /dev/null +++ b/web/src/components/optionsPanel.css @@ -0,0 +1,27 @@ +.options-panel { + display: inline-block; + padding-left: 15px; + position: relative; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.options-panel-title { + line-height: 24px; +} + +.options-panel-content { + padding: 10px; + display: block; + position: absolute; + background-color: var(--colorPageBackground); + z-index: 9999; + width: 350px; +} + +.options-link { + color: var(--colorNormalDimmed); + text-decoration: none; +} diff --git a/web/src/components/optionsPanel.jsx b/web/src/components/optionsPanel.jsx new file mode 100644 index 0000000..33c53bd --- /dev/null +++ b/web/src/components/optionsPanel.jsx @@ -0,0 +1,98 @@ +'use strict'; + +import React from 'react'; + +import './optionsPanel.css'; + +class OptionsPanel extends React.Component { + constructor (props) { + super(props); + this.state = { + showOptions: false, + alignRight: false + }; + } + + componentDidMount () { + this.setState({ alignRight: this.shouldAlignRight() }); + } + + shouldAlignRight () { + const elm = this.refs.optionsPanel; + const boundingRect = elm.getBoundingClientRect(); + const panelBoundingRect = elm.children[1].getBoundingClientRect(); + + const isEntirelyVisible = (boundingRect.left + panelBoundingRect.width <= window.innerWidth); + return !isEntirelyVisible; + } + + clearDocumentClick () { + if (this.documentClickHandler) { + document.removeEventListener('click', this.documentClickHandler, false); + this.documentClickHandler = undefined; + } + } + + setDocumentClick () { + this.clearDocumentClick(); + this.documentClickHandler = this.handleDocumentClick.bind(this); + document.addEventListener('click', this.documentClickHandler, false); + } + + optionsDropdownClicked () { + this.setState({ + showOptions: !this.state.showOptions, + alignRight: this.shouldAlignRight() + }); + } + + handleDocumentClick () { + this.setState({ showOptions: false }); + } + + componentWillUpdate (nextProps, nextState) { + if (nextState.showOptions !== this.state.showOptions) { + if (nextState.showOptions) { + this.setDocumentClick(); + } else { + this.clearDocumentClick(); + } + } + } + + handleClick (event) { + event.stopPropagation(); + event.nativeEvent.stopImmediatePropagation(); + } + + render () { + const panelStyles = { + visibility: !this.state.showOptions ? 'hidden' : undefined, + border: '1px solid grey' + }; + + if (this.state.alignRight) { + panelStyles.right = 0; + } + + return ( +
    + +
    + { this.props.children } +
    +
    + ); + } +} + +OptionsPanel.propTypes = { + title: React.PropTypes.string.isRequired +}; + +export default OptionsPanel; diff --git a/web/src/components/physicsOptions.css b/web/src/components/physicsOptions.css new file mode 100644 index 0000000..e16dd95 --- /dev/null +++ b/web/src/components/physicsOptions.css @@ -0,0 +1,14 @@ +.physics-options > div { + white-space: nowrap; + +} +.physics-options > div > label { + display: inline-block; + width: 260px; +} +.physics-options > div > input[type=checkbox] { + margin-right: 5px; +} +.physics-options > div > input[type=number] { + width: 60px; +} diff --git a/web/src/components/physicsOptions.jsx b/web/src/components/physicsOptions.jsx new file mode 100644 index 0000000..efa634c --- /dev/null +++ b/web/src/components/physicsOptions.jsx @@ -0,0 +1,76 @@ +'use strict'; + +import React from 'react'; +import './physicsOptions.css'; + +class PhysicsOptions extends React.Component { + constructor (props) { + super(props); + this.state = { + isEnabled: true, + jaspersReplusionBetweenParticles: true, + viscousDragCoefficient: 0.2, + hooksSprings: { + restLength: 50, + springConstant: 0.2, + dampingConstant: 0.1 + }, + particles: { + mass: 1 + } + }; + } + + componentWillReceiveProps (nextProps) { + this.setState(nextProps.options); + } + + changeState (newState) { + this.setState(newState); + this.props.changedCallback(newState); + } + + render () { + const isEnabled = this.state.isEnabled; + const jaspersReplusionBetweenParticles = this.state.jaspersReplusionBetweenParticles; + return ( +
    +
    + this.changeState({ isEnabled: !isEnabled })}/> + +
    +
    + + this.changeState({ hooksSprings: { restLength: event.currentTarget.valueAsNumber } })}/> +
    +
    + + this.changeState({ hooksSprings: { springConstant: event.currentTarget.valueAsNumber } })}/> +
    +
    + + this.changeState({ hooksSprings: { dampingConstant: event.currentTarget.valueAsNumber } })}/> +
    +
    + + this.changeState({ viscousDragCoefficient: event.currentTarget.valueAsNumber })}/> +
    +
    + + this.changeState({ particles: { mass: event.currentTarget.valueAsNumber } })}/> +
    +
    + this.changeState({ jaspersReplusionBetweenParticles: !jaspersReplusionBetweenParticles })}/> + +
    +
    + ); + } +} + +PhysicsOptions.propTypes = { + options: React.PropTypes.object, + changedCallback: React.PropTypes.func.isRequired +}; + +export default PhysicsOptions; diff --git a/web/src/components/replayClock.css b/web/src/components/replayClock.css new file mode 100644 index 0000000..40fe03f --- /dev/null +++ b/web/src/components/replayClock.css @@ -0,0 +1,65 @@ +.clock .options-link { + color: var(--colorNormal); +} + +.clock { + margin-left: 20px; + + height: 40px; +} + +.clock .clock-time { + font-size: 1em; + color: var(--colorNormal); + cursor: pointer; +} + +.clock .offset-time-wrap { + position: absolute; + + background-color: var(--colorPageBackground); + border: 1px solid var(--colorConnectionLine); + + margin-top: 30px; + padding: 10px; +} + +.clock .offset-time { + font-size: 0.8em; + text-align: left; + + height: 20px; +} + +.clock .offset-time .form-control { + background-color: var(--colorPageBackground); + color: var(--colorNormal); + border-color: var(--colorConnectionLine); + border-radius: 4px; + + height: 20px; +} + +.clock .offset-time .form-control.error { + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(233, 175, 102, .6); +} + +.clock .offset-time .input-group-btn { + height: 20px; +} + +.clock .offset-time .input-group-btn .btn { + display: block; + + background-color: var(--colorPageBackground); + color: var(--colorNormal); + border-color: var(--colorConnectionLine); + border-radius: 4px; + + height: 20px; + padding: 1px 6px; +} + +.clock small { + font-size: 50%; +} diff --git a/web/src/components/replayClock.jsx b/web/src/components/replayClock.jsx new file mode 100644 index 0000000..5040a61 --- /dev/null +++ b/web/src/components/replayClock.jsx @@ -0,0 +1,126 @@ +'use strict'; + +import React from 'react'; + +import OptionsPanel from './optionsPanel'; + +import './replayClock.css'; + +class ReplayClock extends React.Component { + static defaultProps = { + offsetChanged: () => {} + } + + constructor (props) { + super(props); + + this.state = { + time: props.time, + inputTime: props.time, + offset: 0, + offsetChanged: props.offsetChanged, + error: false + }; + + this.panel = undefined; + } + + componentWillReceiveProps (nextProps) { + if (nextProps.time === this.props.time) { + return; + } + this.setState({ time: nextProps.time }); + } + + offsetChanged = (value) => { + this.setState({ inputValue: value }); + }; + + offsetEntered = () => { + const inputDate = new Date(this.state.inputValue); + + // is valid date + if (!inputDate.getTime || isNaN(inputDate.getTime())) { + this.setState({ + error: true + }); + return; + } + + const offset = Date.now() - inputDate.getTime(); + if (offset < 0 || this.props.maxOffset - offset < 0) { + this.setState({ + error: true + }); + return; + } + this.setState({ + offset: offset, + error: false + }); + this.props.offsetChanged(offset); + if (this.panel) { + this.panel.optionsDropdownClicked(); + } + }; + + offsetCleared = () => { + this.setState({ + offset: 0, + inputValue: '', + error: false + }); + this.props.offsetChanged(0); + this.panel.optionsDropdownClicked(); + }; + + keyPressed = (value) => { + if (value.key === 'Enter') { + this.offsetEntered(); + } + }; + + render () { + const currentDate = new Date(this.state.time); + + const dateToString = (date) => { + const format = value => (`0${value}`).slice(-2); + return `${date.getFullYear()}/${format(date.getMonth() + 1)}/${format(date.getDate()) + } ${format(date.getHours())}:${format(date.getMinutes())}:${format(date.getSeconds())}`; + }; + + const offsetToString = (offset) => { + const abs = Math.abs(offset); + const seconds = abs / 1000; + const minutes = seconds / 60; + const hours = minutes / 60; + return `${Math.floor(hours)}h ${Math.floor(minutes % 60)}m ${Math.floor(seconds % 60)}s`; + }; + + const diffString = this.state.offset !== 0 ? `(${offsetToString(this.state.offset)} ago)` : ''; + + return ( +
    + { this.panel = panel; }}> +
    + this.offsetChanged(event.currentTarget.value)} defaultValue='' onKeyPress={event => this.keyPressed(event)} placeholder="2016/4/11 00:00:00" /> + + + + + + +
    +
    +
    + ); + } +} + +ReplayClock.propTypes = { + time: React.PropTypes.number.isRequired, + maxOffset: React.PropTypes.number.isRequired, + offsetChanged: React.PropTypes.func +}; + +export default ReplayClock; diff --git a/web/src/components/serverStatus.css b/web/src/components/serverStatus.css new file mode 100644 index 0000000..f6778df --- /dev/null +++ b/web/src/components/serverStatus.css @@ -0,0 +1,38 @@ +.server-status { + margin-left: 20px; +} + +.server-status > .indicator { + display: inline-block; + + width: 10px; + height: 10px; + border-radius: 5px; + + background: rgb(150, 150, 150); +} + +.indicator.disconnected { + background-color: var(--colorDanger); + transition: all 1s 0s ease; +} + +.indicator.connected { + background-color: var(--colorNormal); + transition: all 1s 0s ease; + animation-duration: 1s; + animation-name: beat; + animation-iteration-count: infinite; +} + +@keyframes beat { + 0% { + box-shadow: none; + } + 50% { + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(175, 233, 102, .4); + } + 100% { + box-shadow: none; + } +} diff --git a/web/src/components/serverStatus.jsx b/web/src/components/serverStatus.jsx new file mode 100644 index 0000000..c2b8084 --- /dev/null +++ b/web/src/components/serverStatus.jsx @@ -0,0 +1,72 @@ +'use strict'; + +import React from 'react'; + +import { Tooltip, OverlayTrigger } from 'react-bootstrap'; + +import AppConstants from '../appConstants'; + +import './serverStatus.css'; + +class ServerStatus extends React.Component { + constructor (props) { + super(props); + + this.state = { + endpoint: props.endpoint, + status: AppConstants.ServerStatus.DISCONNECTED, + clientUpdatedTime: undefined + }; + } + + componentWillReceiveProps (nextProps) { + this.setState(nextProps); + } + + render () { + const msToTimeAgo = (ms) => { + if (!ms) { return 'Unknown'; } + const secs = Math.round(ms / 1000); + const hours = Math.floor(secs / (60 * 60)); + + const dM = secs % (60 * 60); + const minutes = Math.floor(dM / 60); + + const dS = dM % 60; + const seconds = Math.ceil(dS); + + const timeAgo = []; + if (hours > 0) { + timeAgo.push(`${hours}h`); + } + if (hours > 0 || minutes > 0) { + timeAgo.push(`${minutes}m`); + } + timeAgo.push(`${seconds}s`); + // return { h: hours, m: minutes, s: seconds }; + return timeAgo.join(':'); + }; + + const tooltip = ( + +

    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�?x_!t)DX9zc7>)k=O87a1X>iP3>c5< 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℞J@1MReJKa)>;@G2JP=WoGTA^sYlM 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ⅇ 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

  • Fetched: {msToTimeAgo(Date.now() - this.state.clientUpdatedTime)} ago